fotocx/0000775000175000017500000000000015247006660011030 5ustar micomicofotocx/f.refine.cc0000664000175000017500000050123715247006660013043 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit - Refine menu functions m_flat_hist flatten brightness histogram m_localcon increase local contrast m_amplifycon amplify existing contrast to improve visibility of details m_gretinex rescale pixel RGB brightness range - entire image m_lretinex rescale pixel RGB brightness range - within local areas m_saturation adjust saturation based on pixel brightness m_soft_focus apply a soft focus effect to an image m_match_colors adjust image colors to match those in a chosen image m_brite_ramp adjust brightness gradually across the image m_vignette highlight selected image region ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) /**************************************************************************************/ // Flatten brightness histogram. // The new brightness for each pixel is based on the brightness histogram // 26.0 // of a zone of pixels within a given radius of the pixel. namespace flat_hist_names { PXB *Rpxb; // working image (reduced) int Rscale; // working image downscale - N int Rww, Rhh; // working image size - Eww/N, Ehh/N int zrad; // radius of pixel zone in working image int radius; // corresp. radius in full-size image int Nz; // zone count (Rww * Rhh) float *Bhist; // brightness histogram per zone, Bhist[Nz][256] float F1, F2, F3, F4, F5; // zone slider values, 0 - 1.0 float FA, PFA; // "all" zone and prior value float Fpix[256]; // pixel flatten adjustment factor editfunc EFflathist; } // menu function void m_flat_hist(GtkWidget *, ch *menu) { using namespace flat_hist_names; int flathist_dialog_event(zdialog *zd, ch *event); void flathist_calczones(); ch *title = TX("Flatten Histogram"); F1_help_topic = TX("FLATTEN HISTOGRAM"); printf("m_flat_hist \n"); if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } EFflathist.menuname = "Flatten Histogram"; EFflathist.menufunc = m_flat_hist; EFflathist.Farea = 2; // select area usable EFflathist.Fpaintedits = 1; // use with paint edits OK EFflathist.Fscript = 1; // scripting supported if (! edit_setup(EFflathist)) return; // setup edit Rpxb = PXB_load(curr_file,1); // get image PXB - RGB 8-bits if (! Rpxb) { edit_cancel(0); return; } // compute working image downscale Rscale = sqrtf(0.000001 * Eww * Ehh + 9); // 1/3/10/30/100 megapix --> 3/3/4/6/10 printf("Rscale: %d \n",Rscale); Rww = Eww / Rscale; // get working image, 1/Rscale size Rhh = Ehh / Rscale; PXB *temppxb = PXB_rescale(Rpxb,Rww+Rscale,Rhh+Rscale); if (! temppxb) { edit_cancel(0); return; } PXB_free(Rpxb); Rpxb = temppxb; // working image Nz = (Rww+Rscale) * (Rhh+Rscale); // zone count = pixel count uint cc = 256 * Nz * sizeof(float); Bhist = (float *) zmalloc(cc,"flathist"); // Bhist[Nz][256] if (! Bhist) { PXB_free(Rpxb); edit_cancel(0); return; } /*** ________________________________ | Flatten Histogram | | | | Radius =======[]======== [123] | | | | zone 1 =============[]======== | | zone 2 =========[]============ | | zone 3 ======[]=============== | | zone 4 ===[]================== | | zone 5 []===================== | | zone A []===================== | | | | [Reset] [OK] [X] | |________________________________| ***/ zdialog *zd = zdialog_new(title,Mwin,TX("Reset"),"OK","X",null); EFflathist.zd = zd; zdialog_add_widget(zd,"hbox","hbrad","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labrad","hbrad",TX("Radius"),"space=3"); zdialog_add_widget(zd,"hscale2","radius","hbrad","20|999|1|50","expand|space=3"); zdialog_add_widget(zd,"hbox","sep1","dialog",0,"space=3"); zdialog_add_widget(zd,"hbox","hbz1","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labz1","hbz1","zone 1","space=3"); zdialog_add_widget(zd,"hscale2","zone1","hbz1","0|1.0|0.001|0","expand|space=3"); zdialog_add_widget(zd,"hbox","hbz2","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labz2","hbz2","zone 2","space=3"); zdialog_add_widget(zd,"hscale2","zone2","hbz2","0|1.0|0.001|0","expand|space=3"); zdialog_add_widget(zd,"hbox","hbz3","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labz3","hbz3","zone 3","space=3"); zdialog_add_widget(zd,"hscale2","zone3","hbz3","0|1.0|0.001|0","expand|space=3"); zdialog_add_widget(zd,"hbox","hbz4","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labz4","hbz4","zone 4","space=3"); zdialog_add_widget(zd,"hscale2","zone4","hbz4","0|1.0|0.001|0","expand|space=3"); zdialog_add_widget(zd,"hbox","hbz5","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labz5","hbz5","zone 5","space=3"); zdialog_add_widget(zd,"hscale2","zone5","hbz5","0|1.0|0.001|0","expand|space=3"); zdialog_add_widget(zd,"hbox","hbzA","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labzA","hbzA","zone A","space=3"); zdialog_add_widget(zd,"hscale2","zoneA","hbzA","0|1.0|0.001|0","expand|space=3"); zdialog_rescale(zd,"radius",0,0,999); // 26.5 zdialog_rescale(zd,"zone1",0,0,1); // expand scale at low end 26.4 zdialog_rescale(zd,"zone2",0,0,1); zdialog_rescale(zd,"zone3",0,0,1); zdialog_rescale(zd,"zone4",0,0,1); zdialog_rescale(zd,"zone5",0,0,1); zdialog_rescale(zd,"zoneA",0,0,1); zrad = 50; // initial zone radius (working image) radius = zrad * Rscale; // corresp. full size image radius zdialog_stuff(zd,"radius",radius); zdialog_run(zd,flathist_dialog_event,"save"); // start dialog flathist_calczones(); // calculate zone histograms F1 = F2 = F3 = F4 = F5 = FA = PFA = 0; // initial slider values return; } // dialog event and completion function int flathist_dialog_event(zdialog *zd, ch *event) { using namespace flat_hist_names; void flathist_calczones(); void *flathist_thread(void *); int ii, Fdoflat = 0; float G1, G2, G3, G4, G5, G6; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (strmatch(event,"paint")) Fdoflat = 1; if (strmatch(event,"radius")) // new zone radius value 26.5 { zdialog_fetch(zd,"radius",radius); zrad = radius / Rscale; flathist_calczones(); // calculate new zone histograms Fdoflat = 1; } if (strmatch(event,"zoneA")) // move all sliders by zoneA slider { zdialog_fetch(zd,"zoneA",FA); F1 += FA - PFA; F2 += FA - PFA; F3 += FA - PFA; F4 += FA - PFA; F5 += FA - PFA; PFA = FA; zdialog_stuff(zd,"zone1",F1); zdialog_stuff(zd,"zone2",F2); zdialog_stuff(zd,"zone3",F3); zdialog_stuff(zd,"zone4",F4); zdialog_stuff(zd,"zone5",F5); Fdoflat = 1; } if (strstr("zone1 zone2 zone3 zone4 zone5 zoneA",event)) { zdialog_fetch(zd,"zone1",F1); // zone slider values, 0 - 1.0 zdialog_fetch(zd,"zone2",F2); zdialog_fetch(zd,"zone3",F3); zdialog_fetch(zd,"zone4",F4); zdialog_fetch(zd,"zone5",F5); for (ii = 0; ii < 256; ii++) // calculate brightness adjustment { // factors for RGB values 0-255 G1 = G2 = G3 = G4 = G5 = G6 = 0; if (ii < 51) { G1 = ( 51-ii) / 51.0; G2 = (ii - 0 ) / 51.0; } // darkest RGB in zones 1 and 2 else if (ii < 102) { G2 = (102-ii) / 51.0; G3 = (ii - 51 ) / 51.0; } else if (ii < 153) { G3 = (153-ii) / 51.0; G4 = (ii - 102) / 51.0; } else if (ii < 204) { G4 = (204-ii) / 51.0; G5 = (ii - 153) / 51.0; } else if (ii < 256) { G5 = (256-ii) / 51.0; G6 = (ii - 204) / 51.0; } // brightest in zones 5 and 6 Fpix[ii] = F1 * (G1 + G2) + F2 * (G2 + G3) + F3 * (G3 + G4) // apply zone slider values + F4 * (G4 + G5) + F5 * (G5 + G6); Fpix[ii] *= 0.5; // dampen } Fdoflat = 1; } if (zd->zstat) { if (zd->zstat == 1) // [reset] { zd->zstat = 0; edit_reset(); zdialog_stuff(zd,"zone1",0); zdialog_stuff(zd,"zone2",0); zdialog_stuff(zd,"zone3",0); zdialog_stuff(zd,"zone4",0); zdialog_stuff(zd,"zone5",0); zdialog_stuff(zd,"zoneA",0); F1 = F2 = F3 = F4 = F5 = FA = 0; edit_reset(); return 1; } if (zd->zstat == 2) // [OK] { PXB_free(Rpxb); zfree(Bhist); edit_addhist("Rad:%d zones: %.2f %.2f %.2f %.2f %.2f", radius,F1,F2,F3,F4,F5); edit_done(0); return 1; } if (zd->zstat) // [X] or [-] { PXB_free(Rpxb); zfree(Bhist); edit_cancel(0); return 1; } } if (Fdoflat && (F1 + F2 + F3 + F4 + F5 > 0)) // 26.5 { get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(flathist_thread,NSMP); // flatten histogram CEF->Fmods++; // image modified, not saved CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window } return 1; } // Calculate the brightness histogram for the zone around each pixel. // From this, calculate brightness adjustment factors to flatten the histogram. void flathist_calczones() { using namespace flat_hist_names; int zone; int px, py, qx, qy; // zone center pixel int xlo, xhi, ylo, yhi; // zone limits int ii, lev, npix; uint8 *pix; Fbusy(+1); for (zone = 0; zone < Nz; zone++) // loop all zones { for (lev = 0; lev < 256; lev++) // loop 256 brightness levels / zone { ii = 256 * zone + lev; // Bhist[zone][lev] = 0 Bhist[ii] = 0; } py = zone / Rww; // zone central pixel px = zone - py * Rww; xlo = px - zrad; // get zone limits if (xlo < 0) xlo = 0; xhi = px + zrad; if (xhi > Rww) xhi = Rww; ylo = py - zrad; if (ylo < 0) ylo = 0; yhi = py + zrad; if (yhi > Rhh) yhi = Rhh; if (px == 0) // first pixel in row { for (qy = ylo; qy < yhi; qy++) // loop all pixels in zone for (qx = xlo; qx < xhi; qx++) { pix = PXBpix(Rpxb,qx,qy); lev = pix[0] + pix[1] + pix[2]; lev = lev / 3; // pixel brightness 0-255 ii = 256 * zone + lev; Bhist[ii] += 1; // pixel count per brightness level } } if (px > 0) // 2nd or later pixel in row { for (lev = 0; lev < 256; lev++) { ii = 256 * zone + lev; // copy previous histogram Bhist[ii] = Bhist[ii-256]; } if (xlo > 0) // subtract 1st col. of previous hist. { qx = xlo - 1; for (qy = ylo; qy < yhi; qy++) { pix = PXBpix(Rpxb,qx,qy); lev = pix[0] + pix[1] + pix[2]; lev = lev / 3; ii = 256 * zone + lev; Bhist[ii] -= 1; } } if (xhi < Rww) // add last col. of this hist. { qx = xhi - 1; for (qy = ylo; qy < yhi; qy++) { pix = PXBpix(Rpxb,qx,qy); lev = pix[0] + pix[1] + pix[2]; lev = lev / 3; ii = 256 * zone + lev; Bhist[ii] += 1; } } } } for (zone = 0; zone < Nz; zone++) // loop all zones { py = zone / Rww; // zone central pixel px = zone - py * Rww; xlo = px - zrad; // get zone limits if (xlo < 0) xlo = 0; xhi = px + zrad; if (xhi > Rww) xhi = Rww; ylo = py - zrad; if (ylo < 0) ylo = 0; yhi = py + zrad; if (yhi > Rhh) yhi = Rhh; for (lev = 1; lev < 256; lev++) // loop all levels in zone { ii = 256 * zone + lev; Bhist[ii] += Bhist[ii-1]; // cumulative pixel count < level } npix = (yhi - ylo + 1) * (xhi - xlo + 1); // pixels in zone for (lev = 0; lev < 256; lev++) { ii = 256 * zone + lev; Bhist[ii] = 1.0 * Bhist[ii] / npix * 256 / (lev + 1); // brightness adjustment factor if (Bhist[ii] < 0) Bhist[ii] = 0; // kludge 26.5 } } Fbusy(-1); return; } // thread function to set output pixel brightness from input pixel // brightness and corresponding brightness adjustment factor void * flathist_thread(void *arg) { using namespace flat_hist_names; int index, zone, Fend; int px, py, ii, B; float blend; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float BF; float *pix1, *pix3; index = *((int *) arg); while (true) { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; // input RGB G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; // curr. output RGB G3 = pix3[1]; B3 = pix3[2]; B = 0.333 * (R1 + G1 + B1); // input pixel brightness 0-255 if (B < 0 || B > 255) continue; // ignore invalid pixel zone = py / Rscale * Rww + px / Rscale; // input pixel zone ii = 256 * zone + B; BF = Bhist[ii]; // flatten brightness factor 0 .. N R9 = R1 * BF; // new output RGB G9 = G1 * BF; // (if all zone sliders = 1.0) B9 = B1 * BF; ii = int(B); R9 = R9 * Fpix[ii] + R1 * (1.0 - Fpix[ii]); // apply brightness zone factors G9 = G9 * Fpix[ii] + G1 * (1.0 - Fpix[ii]); B9 = B9 * Fpix[ii] + B1 * (1.0 - Fpix[ii]); RGBfix(R9,G9,B9); // insure RGB values within 0-255 if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { // increase edit R3 = blend * R9 + (1-blend) * R3; G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { // decrease edit R3 = -blend * R1 + (1+blend) * R3; G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; } return 0; } /************************************************************************************** Local Contrast function Rescale pixel brightness based on surrounding area mean brightness. loop all pixels B = pixel brightness value M = average of pixels in neighborhood (zone) R = M / B B = 255 * POW(B/255,R) new pixel brightness ***/ namespace localcon_names { int Zrad; // zone radius float *Zbrite; // zone mean brightness float Fpower; // function power, 0-1 float Fcolor; // color increase, 0-1 int Fnewrad, Fnewpower, Fnewcolor; // flags, new inputs available editfunc EFlocalcon; // edit function struct } // menu function void m_localcon(GtkWidget *, ch *menu) // revised 26.0 { using namespace localcon_names; int localcon_dialog_event(zdialog *zd, ch *event); void * localcon_thread(void *); void localcon_curvedit(int spc); GtkWidget *drawwin_scale; // drawing window for brightness scale F1_help_topic = TX("LOCAL CONTRAST"); printf("m_localcon \n"); ch *title = TX("Local Contrast"); EFlocalcon.menuname = "Local Contrast"; EFlocalcon.menufunc = m_localcon; EFlocalcon.Farea = 2; // select area usable EFlocalcon.Fscript = 1; // scripting supported EFlocalcon.Fpaintedits = 1; // use with paint edits OK EFlocalcon.threadfunc = localcon_thread; // thread function if (! edit_setup(EFlocalcon)) return; // setup edit int cc = Eww * Ehh * sizeof(float); Zbrite = (float *) zmalloc(cc,"localcon"); // memory for zone brightness /*** ________________________________ | Local Contrast | | ____________________________ | | | | | | | | | | | -------------------------- | | // curve edit area | | | | | |____________________________| | | |____________________________| | // brightness scale: black to white | | | Power =============[]====== | | Radius ========[]=========== | | Color ==========[]========== | | | | [Reset] [OK] [X] | |________________________________| ***/ zdialog *zd = zdialog_new(title,Mwin,TX("Reset"),"OK","X",null); EFlocalcon.zd = zd; zdialog_add_widget(zd,"frame","frameH","dialog",0,"expand"); // edit-curve zdialog_add_widget(zd,"frame","frameB","dialog"); // black to white brightness scale zdialog_add_widget(zd,"hbox","hbpow","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labpow","hbpow",TX("Power"),"space=5"); zdialog_add_widget(zd,"hscale2","power","hbpow","0|1|0.01|0","expand"); // power range, 0-1 zdialog_add_widget(zd,"hbox","hbrad","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labrad","hbrad",TX("Radius"),"space=5"); zdialog_add_widget(zd,"hscale2","Zrad","hbrad","20|80|1|20","expand"); // Zrad range 20-100 pixels zdialog_add_widget(zd,"hbox","hbcolor","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labcolor","hbcolor",TX("Color"),"space=5"); zdialog_add_widget(zd,"hscale2","color","hbcolor","0|1|0.01|0","expand"); // color range, 0-1 GtkWidget *frameH = zdialog_gtkwidget(zd,"frameH"); // setup edit curves spldat *sd = splcurve_init(frameH,localcon_curvedit); EFlocalcon.sd = sd; sd->Nscale = 1; // horizontal line, neutral value sd->xscale[0][0] = 0.00; sd->yscale[0][0] = 0.50; sd->xscale[1][0] = 1.00; sd->yscale[1][0] = 0.50; sd->nap[0] = 3; // initial curve is neutral sd->vert[0] = 0; sd->apx[0][0] = 0.01; // horizontal line sd->apy[0][0] = 0.50; sd->apx[0][1] = 0.50; sd->apy[0][1] = 0.50; // curve 0 = overall brightness sd->apx[0][2] = 0.99; sd->apy[0][2] = 0.50; splcurve_generate(sd,0); sd->mod[0] = 0; // mark curve unmodified sd->Nspc = 1; // 1 curve sd->fact[0] = 1; // curve 0 active GtkWidget *frameB = zdialog_gtkwidget(zd,"frameB"); // setup brightness scale drawing area drawwin_scale = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(frameB),drawwin_scale); gtk_widget_set_size_request(drawwin_scale,100,12); G_SIGNAL(drawwin_scale,"draw",brightness_scale,0); // f.tools function Zrad = 20; // initial values Fnewrad = 1; Fpower = 0; Fnewpower = 0; Fcolor = 0; Fnewcolor = 0; zdialog_resize(zd,200,0); zdialog_run(zd,localcon_dialog_event,"save"); // run dialog - parallel thread_signal(); return; } // dialog event and completion function int localcon_dialog_event(zdialog *zd, ch *event) { using namespace localcon_names; spldat *sd = EFlocalcon.sd; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (strmatch(event,"focus")) return 1; if (strmatch(event,"apply")) { // from script event = "power"; zd->zstat = 2; } if (strmatch(event,"Zrad")) { // zone radius input zdialog_fetch(zd,"Zrad",Zrad); Fnewrad = 1; } if (strmatch(event,"power")) { // power input zdialog_fetch(zd,"power",Fpower); Fnewpower = 1; } if (strmatch(event,"color")) { // color input zdialog_fetch(zd,"color",Fcolor); Fnewcolor = 1; } if (strmatch(event,"paint")) // mouse paint Fnewpower = 1; thread_signal(); if (zd->zstat) { if (zd->zstat == 1) // reset { zd->zstat = 0; // keep dialog alive zdialog_stuff(zd,"power",0); zdialog_stuff(zd,"color",0); zdialog_stuff(zd,"Zrad",20); Zrad = 20; // initial values Fnewrad = 1; Fpower = 0; Fnewpower = 0; Fcolor = 0; Fnewcolor = 0; sd->nap[0] = 3; // curve is neutral sd->vert[0] = 0; sd->apx[0][0] = 0.01; sd->apy[0][0] = 0.50; sd->apx[0][1] = 0.50; sd->apy[0][1] = 0.50; sd->apx[0][2] = 0.99; sd->apy[0][2] = 0.50; splcurve_generate(sd,0); sd->mod[0] = 0; // mark unmodified gtk_widget_queue_draw(sd->drawarea); // redraw curve edit_reset(); return 1; } else if (zd->zstat == 2) // done - commit edit { edit_addhist("pow:%.3f rad:%d color:%.3f",Fpower,Zrad,Fcolor); // edit parms > edit hist edit_done(0); } else edit_cancel(0); // discard edit zfree(Zbrite); // free memory return 1; } return 1; } // this function is called when the curve is edited void localcon_curvedit(int spc) { using namespace localcon_names; Fnewpower = 1; // affects power calculation thread_signal(); return; } // main thread function void * localcon_thread(void *) { using namespace localcon_names; void * localcon_wthread_zrad(void *); void * localcon_wthread_power(void *); if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag if (! Fnewrad && ! Fnewpower && ! Fnewcolor) // no new inputs return 0; while (Fnewrad) // radius was changed { progress_setgoal(Eww * Ehh); // initz. progress counter Fnewrad = 0; get_edit_pixels_init(NSMP,0); // compute inner zone brightness do_wthreads(localcon_wthread_zrad,NSMP); progress_setgoal(0); Fnewpower++; } while (Fnewpower) { // power changed Fnewpower = 0; get_edit_pixels_init(NSMP,0); do_wthreads(localcon_wthread_power,NSMP); } while (Fnewcolor) { // color saturation changed Fnewcolor = 0; get_edit_pixels_init(NSMP,0); do_wthreads(localcon_wthread_power,NSMP); } if (! Fpaintedits) Fpaint2(); CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved return 0; } // worker thread function // Compute mean brightness for zones around each pixel. // Zbrite[*]: brightness for zone around pixel [*] void * localcon_wthread_zrad(void *arg) { using namespace localcon_names; int index = *((int *) arg); int px1, py1, px2, py2, px3; int pxlo, pxhi, pylo, pyhi; int ii; float *pix; double sum = 0; int count = 0; int pskip = 0; for (py1 = index; py1 < Ehh; py1 += NSMP) for (px1 = 0; px1 < Eww; px1++) { pylo = py1 - Zrad; if (pylo < 0) pylo = 0; pyhi = py1 + Zrad; if (pyhi > Ehh) pyhi = Ehh; pxlo = px1 - Zrad; if (pxlo < 0) pxlo = 0; pxhi = px1 + Zrad; if (pxhi > Eww) pxhi = Eww; if (px1 == 0) { sum = count = 0; for (py2 = pylo; py2 < pyhi; py2++) for (px2 = pxlo; px2 < pxhi; px2++) { if (sa_stat == sa_stat_fini) { ii = Eww * py2 + px2; if (sa_pixmap[ii] < 1) continue; } pix = PXMpix(E1pxm,px2,py2); sum += 0.001302 * (pix[0] + pix[1] + pix[2]); count++; } continue; } if (pxlo > 0) { px3 = pxlo - 1; for (py2 = pylo; py2 < pyhi; py2++) { if (sa_stat == sa_stat_fini) { ii = Eww * py2 + px3; if (sa_pixmap[ii] < 1) continue; } pix = PXMpix(E1pxm,px3,py2); sum -= 0.001302 * (pix[0] + pix[1] + pix[2]); count--; } } if (pxhi < Eww) { px3 = pxhi; for (py2 = pylo; py2 < pyhi; py2++) { if (sa_stat == sa_stat_fini) { ii = Eww * py2 + px3; if (sa_pixmap[ii] < 1) continue; } pix = PXMpix(E1pxm,px3,py2); sum += 0.001302 * (pix[0] + pix[1] + pix[2]); count++; } } ii = py1 * Eww + px1; if (count > 0) Zbrite[ii] = sum / count; else Zbrite[ii] = 0; if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; // exit thread } // worker thread function // calculate new pixel brightness levels based on pixel brightness // compared to brightness of surrounding zones void * localcon_wthread_power(void *arg) { using namespace localcon_names; int index = *((int *) arg); int px1, py1, Fend, ii; float Bp, Bz1, BR1, BR2, BR3, FC1, FC2; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float *pix1, *pix3; float pixbrite; float blend; spldat *sd = EFlocalcon.sd; while (true) { Fend = get_edit_pixels(index,px1,py1,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px1,py1); // input pixel pix3 = PXMpix(E3pxm,px1,py1); // output pixel R1 = pix1[0]; // input image RGB values G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; Bp = 0.001302 * (R1 + G1 + B1); // pixel brightness, 0-1 if (Bp == 0) continue; // black ii = py1 * Eww + px1; Bz1 = Zbrite[ii]; // zone mean brightness, 0-1 if (Bz1 == 0) continue; // black BR1 = Bp / Bz1; // pixel/zone brightness ratio BR2 = BR1 * Bp; // new pixel brightness ii = 500 * BR2 + 500 * Bz1; // pixel + zone brightness 0-999 if (ii < 0) ii = 0; if (ii > 999) ii = 999; FC1 = sd->yval[0][ii]; // brightness curve 0 - 0.5 - 1.0 FC2 = FC1 * 2; // 0 - 1.0 - 2.0 BR3 = BR2 * FC2; // new pixel brightness R9 = BR3/Bp * R1; // modified RGB values G9 = BR3/Bp * G1; B9 = BR3/Bp * B1; if (Fcolor) { // + saturation pixbrite = 0.333 * (R9 + G9 + B9); // pixel brightness, 0-255 R9 = R9 + Fcolor * (R9 - pixbrite); // Fcolor, 0-1 G9 = G9 + Fcolor * (G9 - pixbrite); B9 = B9 + Fcolor * (B9 - pixbrite); } if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { // increase edit blend = Fpower * blend; R3 = blend * R9 + (1-blend) * R3; G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { // decrease edit R3 = -blend * R1 + (1+blend) * R3; G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { blend = Fpower * blend; R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } RGBfix(R3,G3,B3); // 26.0 pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; } return 0; // exit thread } /************************************************************************************** Amplify Contrast function improve visibility of detail by amplifying existing contrast methodology: get brightness gradients for each pixel in 4 directions: SE SW NE NW amplify gradients using the edit curve: new gradient = F(old gradient) integrate 4 new brightness surfaces from the amplified gradients: - pixel brightness = prior pixel brightness + amplified gradient - the Amplify control varies amplification from zero to maximum new pixel brightness = average from 4 calculated brightness surfaces ***************************************************************************************/ namespace amplifycon_names { float *brmap1, *brmap2; float *brmap4[4]; int Fnewmap; int contrast99; float amplify; editfunc EFamplifycon; } // menu function void m_amplifycon(GtkWidget *, ch *menu) { using namespace amplifycon_names; void *amplifycon_thread(void *); int amplifycon_dialog_event(zdialog *zd, ch *event); void amplifycon_curvedit(int); void amplifycon_initz(zdialog *zd); ch *title = TX("Amplify Contrast"); F1_help_topic = TX("AMPLIFY CONTRAST"); printf("m_amplifycon \n"); EFamplifycon.menuname = "Amplify Contrast"; EFamplifycon.menufunc = m_amplifycon; EFamplifycon.Farea = 2; // select area usable EFamplifycon.Fpaintedits = 1; // use with paint edits OK EFamplifycon.Fscript = 1; // scripting supported EFamplifycon.threadfunc = amplifycon_thread; if (! edit_setup(EFamplifycon)) return; // setup: no preview, select area OK /*** ___________________________________ | Amplify Contrast | | _______________________________ | | | | | | | | | | | curve drawing area | | | | | | | |_______________________________| | | low contrast high | | | | Amplify ======[]========= [0.43] | | | | [OK] [X] | |___________________________________| ***/ zdialog *zd = zdialog_new(title,Mwin,"OK","X",null); EFamplifycon.zd = zd; zdialog_add_widget(zd,"frame","frame","dialog",0,"expand"); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labcL","hb1",TX("low"),"space=4"); zdialog_add_widget(zd,"label","labcM","hb1",TX("Contrast"),"expand"); zdialog_add_widget(zd,"label","labcH","hb1",TX("high"),"space=5"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labcon","hb2",TX("Amplify"),"space=5"); zdialog_add_widget(zd,"hscale","amplify","hb2","0|1|0.01|0","expand"); // step size 0.01 zdialog_add_widget(zd,"label","ampval","hb2",0,"space=5"); GtkWidget *frame = zdialog_gtkwidget(zd,"frame"); // set up curve edit spldat *sd = splcurve_init(frame,amplifycon_curvedit); EFamplifycon.sd = sd; sd->Nspc = 1; sd->fact[0] = 1; sd->vert[0] = 0; sd->nap[0] = 2; // initial curve anchor points sd->apx[0][0] = 0.01; sd->apy[0][0] = 0.20; sd->apx[0][1] = 0.99; sd->apy[0][1] = 0.20; splcurve_generate(sd,0); // generate curve data amplifycon_initz(zd); // initialize brightness maps zdialog_resize(zd,250,300); zdialog_run(zd,amplifycon_dialog_event,"save"); // run dialog - parallel amplify = 0; Fnewmap = 1; thread_signal(); return; } // initialization for new image file // set brmap1[] and contrast99 void amplifycon_initz(zdialog *zd) { using namespace amplifycon_names; int ii, cc, px, py; float b1, *pix1; int jj, sum, limit, conhist[100]; cc = Eww * Ehh * sizeof(float); // allocate brightness map memory brmap1 = (float *) zmalloc(cc,"amplifycon"); brmap2 = (float *) zmalloc(cc,"amplifycon"); for (ii = 0; ii < 4; ii++) brmap4[ii] = (float *) zmalloc(cc,"amplifycon"); for (py = 0; py < Ehh; py++) // map initial image brightness for (px = 0; px < Eww; px++) { ii = py * Eww + px; pix1 = PXMpix(E1pxm,px,py); b1 = 0.333 * (pix1[0] + pix1[1] + pix1[2]); // pixel brightness 0-255.9 if (b1 < 1) b1 = 1; brmap1[ii] = b1; } for (ii = 0; ii < 100; ii++) conhist[ii] = 0; for (py = 1; py < Ehh; py++) // map contrast histogram for (px = 1; px < Eww; px++) { ii = py * Eww + px; jj = 0.388 * fabsf(brmap1[ii] - brmap1[ii-1]); // horiz. contrast, ranged 0 - 99 if (jj > 99) jj = 99; // trap bad image data conhist[jj]++; jj = 0.388 * fabsf(brmap1[ii] - brmap1[ii-Eww]); // vertical if (jj > 99) jj = 99; conhist[jj]++; } sum = 0; limit = 0.99 * 2 * (Eww-1) * (Ehh-1); // find 99th percentile contrast for (ii = 0; ii < 100; ii++) { sum += conhist[ii]; if (sum > limit) break; } contrast99 = 255.0 * ii / 100.0; // 0 to 255 if (contrast99 < 4) contrast99 = 4; // rescale low-contrast image return; } // dialog event and completion callback function int amplifycon_dialog_event(zdialog *zd, ch *event) { using namespace amplifycon_names; ch text[8]; if (strmatch(event,"done")) zd->zstat = 1; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 2; // cancel if (zd->zstat) { // dialog complete if (zd->zstat == 1) edit_done(0); else edit_cancel(0); zfree(brmap1); // free memory zfree(brmap2); brmap1 = brmap2 = 0; for (int ii = 0; ii < 4; ii++) { zfree(brmap4[ii]); brmap4[ii] = 0; } return 1; } if (strmatch(event,"apply")) // from script amplifycon_dialog_event(zd,"amplify"); if (strmatch(event,"paint")) // mouse paint thread_signal(); if (strmatch(event,"amplify")) { // slider value zdialog_fetch(zd,"amplify",amplify); snprintf(text,8,"%.2f",amplify); // numeric feedback zdialog_stuff(zd,"ampval",text); Fnewmap = 1; thread_signal(); // trigger update thread } return 1; } // this function is called when the curve is edited void amplifycon_curvedit(int) { using namespace amplifycon_names; Fnewmap = 1; thread_signal(); return; } // thread function void * amplifycon_thread(void *) { using namespace amplifycon_names; void * amplifycon_wthread1(void *arg); void * amplifycon_wthread2(void *arg); if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag if (Fnewmap) // recalculate amplifycon do_wthreads(amplifycon_wthread1,4); Fnewmap = 0; get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(amplifycon_wthread2,NSMP); // update image CEF->Fmods++; CEF->Fsaved = 0; if (amplify == 0) CEF->Fmods = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } // calculate brmap2[] and brmap4[] from brmap1[], // contrast curve, amplify, contrast99 void * amplifycon_wthread1(void *arg) { using namespace amplifycon_names; int bii; int ii, kk, pii; int px, px1, px2, pxinc; int py, py1, py2, pyinc; float b1, b4, xval, yval, grad; float amp, con99; spldat *sd = EFamplifycon.sd; con99 = contrast99; // 99th percentile contrast con99 = 1.0 / con99; // inverted amp = pow(amplify,0.5); // amplification, 0 to 1 bii = *((int *) arg); // thread: 0/1/2/3 if (bii == 0) { // direction SE px1 = 1; px2 = Eww; pxinc = 1; py1 = 1; py2 = Ehh; pyinc = 1; pii = - 1 - Eww; } else if (bii == 1) { // direction SW px1 = Eww-2; px2 = 0; pxinc = -1; py1 = 1; py2 = Ehh; pyinc = 1; pii = + 1 - Eww; } else if (bii == 2) { // direction NE px1 = 1; px2 = Eww; pxinc = 1; py1 = Ehh-2; py2 = 0; pyinc = -1; pii = - 1 + Eww; } else { /* bii == 3 */ // direction NW px1 = Eww-2; px2 = 0; pxinc = -1; py1 = Ehh-2; py2 = 0; pyinc = -1; pii = + 1 + Eww; } for (ii = 0; ii < Eww * Ehh; ii++) // initial brightness map brmap4[bii][ii] = brmap1[ii]; for (py = py1; py != py2; py += pyinc) // loop all image pixels for (px = px1; px != px2; px += pxinc) { ii = py * Eww + px; b1 = brmap1[ii]; // this pixel brightness grad = b1 - brmap1[ii+pii]; // - prior pixel --> gradient xval = fabsf(grad) * con99; // gradient scaled 0 to 1+ kk = 1000.0 * xval; if (kk > 999) kk = 999; yval = 1.0 + 5.0 * sd->yval[0][kk]; // amplifier = 1...6 grad = grad * yval; // magnified gradient b4 = brmap4[bii][ii+pii] + grad; // pixel brightness = prior + gradient b4 = (1.0 - amp) * b1 + amp * b4; // apply amplifier: b4 range = b1 --> b4 brmap4[bii][ii] = b4; // new pixel brightness } for (py = bii; py < Ehh; py += 4) // loop all image pixels for (px = 0; px < Eww; px++) { ii = py * Eww + px; b4 = brmap4[0][ii] + brmap4[1][ii] // new brightness = average of four + brmap4[2][ii] + brmap4[3][ii]; // calculated brightness surfaces b4 = 0.25 * b4; if (b4 < 1) b4 = 1; brmap2[ii] = b4; } return 0; } // calculate new pixel brightness values from brightness maps void * amplifycon_wthread2(void *arg) { using namespace amplifycon_names; float *pix1, *pix3; int index, ii, px, py, Fend; float b1, b2, bf; float R1, G1, B1, R3, G3, B3, R9, G9, B9;; float blend; index = *((int *) arg); while (true) { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; // input RGB G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; ii = py * Eww + px; b1 = brmap1[ii]; // initial pixel brightness b2 = brmap2[ii]; // calculated new brightness bf = b2 / b1; // brightness ratio R9 = bf * R1; // output RGB G9 = bf * G1; B9 = bf * B1; RGBfix(R9,G9,B9); if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { // increase edit R3 = blend * R9 + (1-blend) * R3; G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { // decrease edit R3 = -blend * R1 + (1+blend) * R3; G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // Global Retinex function // Rescale RGB values based on entire image - eliminate color caste and reduce fog/haze. namespace gretinex_names { editfunc EFgretinex; // edit function data ch *thread_command; VOL int Fcancel; float Rdark, Gdark, Bdark; float Rbrite, Gbrite, Bbrite; float Rmpy, Gmpy, Bmpy; float pRdark, pGdark, pBdark; // prior values float pRbrite, pGbrite, pBbrite; float pRmpy, pGmpy, pBmpy; float blend, reducebright; int Fbrightpoint, Fdarkpoint; } // menu function void m_gretinex(GtkWidget *, ch *menu) { using namespace gretinex_names; int gretinex_dialog_event(zdialog *zd, ch *event); void gretinex_mousefunc(); void * gretinex_thread(void *); F1_help_topic = TX("GLOBAL RETINEX"); printf("m_gretinex \n"); EFgretinex.menuname = "Global Retinex"; EFgretinex.menufunc = m_gretinex; EFgretinex.Farea = 2; // select area usable EFgretinex.Fscript = 1; // scripting supported EFgretinex.threadfunc = gretinex_thread; // thread function EFgretinex.mousefunc = gretinex_mousefunc; // mouse function if (! edit_setup(EFgretinex)) return; // setup edit E9pxm = 0; /*** ______________________________________ | Global Retinex | | | | Red Green Blue All | | Dark Point: [__] [__] [__] [__] | 0 ... 255 neutral point is 0 | Bright Point: [__] [__] [__] [__] | 0 ... 255 neutral point is 255 | Multiplier: [__] [__] [__] [__] | 0 ... 5 neutral point is 1 | | | [auto] brightness rescale | | [x] bright point [x] dark point | mouse click spots | blend: =======[]=================== | | reduce bright: ==========[]======== | | | | [Reset] [OK] [X] | |______________________________________| ***/ zdialog *zd = zdialog_new(TX("Global Retinex"),Mwin,TX("Reset"),"OK","X",null); EFgretinex.zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","space","hb1","","space=2"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"homog"); zdialog_add_widget(zd,"label","space","hb1","","space=2"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"homog"); zdialog_add_widget(zd,"label","space","hb1","","space=2"); zdialog_add_widget(zd,"vbox","vb3","hb1",0,"homog"); zdialog_add_widget(zd,"label","space","hb1","","space=2"); zdialog_add_widget(zd,"vbox","vb4","hb1",0,"homog"); zdialog_add_widget(zd,"label","space","hb1","","space=2"); zdialog_add_widget(zd,"vbox","vb5","hb1",0,"homog"); zdialog_add_widget(zd,"label","space","vb1",""); zdialog_add_widget(zd,"label","labdark","vb1",TX("Dark Point")); zdialog_add_widget(zd,"label","labbrite","vb1",TX("Bright Point")); zdialog_add_widget(zd,"label","labmpy","vb1",TX("Multiplier")); zdialog_add_widget(zd,"label","labred","vb2",TX("Red")); zdialog_add_widget(zd,"zspin","Rdark","vb2","0|255|1|0","size=3"); zdialog_add_widget(zd,"zspin","Rbrite","vb2","0|255|1|255","size=3"); zdialog_add_widget(zd,"zspin","Rmpy","vb2","0.1|5|0.01|1","size=3"); zdialog_add_widget(zd,"label","labgreen","vb3",TX("Green")); zdialog_add_widget(zd,"zspin","Gdark","vb3","0|255|1|0","size=3"); zdialog_add_widget(zd,"zspin","Gbrite","vb3","0|255|1|255","size=3"); zdialog_add_widget(zd,"zspin","Gmpy","vb3","0.1|5|0.01|1","size=3"); zdialog_add_widget(zd,"label","labred","vb4",TX("Blue")); zdialog_add_widget(zd,"zspin","Bdark","vb4","0|255|1|0","size=3"); zdialog_add_widget(zd,"zspin","Bbrite","vb4","0|255|1|255","size=3"); zdialog_add_widget(zd,"zspin","Bmpy","vb4","0.1|5|0.01|1","size=3"); zdialog_add_widget(zd,"label","laball","vb5",TX("All")); zdialog_add_widget(zd,"zspin","dark+-","vb5","-1|+1|1|0","size=3"); zdialog_add_widget(zd,"zspin","brite+-","vb5","-1|+1|1|0","size=3"); zdialog_add_widget(zd,"zspin","mpy+-","vb5","-1|+1|1|0","size=3"); zdialog_add_widget(zd,"hbox","hbauto","dialog"); zdialog_add_widget(zd,"button","autoscale","hbauto","Auto","space=3"); zdialog_add_widget(zd,"label","labauto","hbauto",TX("brightness rescale"),"space=5"); zdialog_add_widget(zd,"hbox","hbclicks","dialog"); zdialog_add_widget(zd,"check","brightpoint","hbclicks",TX("click bright point"),"space=3"); zdialog_add_widget(zd,"check","darkpoint","hbclicks",TX("click dark point"),"space=5"); zdialog_add_widget(zd,"hbox","hbb","dialog"); zdialog_add_widget(zd,"label","labb","hbb",TX("blend"),"space=5"); zdialog_add_widget(zd,"hscale","blend","hbb","0|1.0|0.01|1.0","expand"); zdialog_add_widget(zd,"hbox","hbrd","dialog"); zdialog_add_widget(zd,"label","labrd","hbrd",TX("reduce bright"),"space=5"); zdialog_add_widget(zd,"hscale","reduce bright","hbrd","0|1.0|0.01|0.0","expand"); zdialog_run(zd,gretinex_dialog_event,"save"); // run dialog - parallel zdialog_send_event(zd,"reset"); PXM_audit(E1pxm); return; } // dialog event and completion function int gretinex_dialog_event(zdialog *zd, ch *event) { using namespace gretinex_names; void gretinex_mousefunc(); int adddark, addbrite, addmpy; int Fchange = 0; if (strmatch(event,"focus")) return 1; // stop loss of button event (?) if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (strmatch(event,"reset")) zd->zstat = 1; // initz. if (zd->zstat) { if (zd->zstat == 1) { // reset zd->zstat = 0; // keep dialog active Rdark = Gdark = Bdark = 0; // set neutral values Rbrite = Gbrite = Bbrite = 255; pRdark = pGdark = pBdark = 0; // prior values = same pRbrite = pGbrite = pBbrite = 255; // (no change) Rmpy = Gmpy = Bmpy = 1.0; Fbrightpoint = Fdarkpoint = 0; blend = 1.0; reducebright = 0.0; Fcancel = 0; zdialog_stuff(zd,"Rdark",0); // stuff neutral values into dialog zdialog_stuff(zd,"Gdark",0); zdialog_stuff(zd,"Bdark",0); zdialog_stuff(zd,"Rbrite",255); zdialog_stuff(zd,"Gbrite",255); zdialog_stuff(zd,"Bbrite",255); zdialog_stuff(zd,"Rmpy",1.0); zdialog_stuff(zd,"Gmpy",1.0); zdialog_stuff(zd,"Bmpy",1.0); zdialog_stuff(zd,"brightpoint",0); zdialog_stuff(zd,"darkpoint",0); edit_reset(); if (E9pxm) PXM_free(E9pxm); // free memory E9pxm = 0; return 1; } else if (zd->zstat == 2) { // done edit_done(0); // commit edit if (E9pxm) PXM_free(E9pxm); // free memory E9pxm = 0; return 1; } else { Fcancel = 1; // kill thread edit_cancel(0); // discard edit if (E9pxm) PXM_free(E9pxm); // free memory E9pxm = 0; return 1; } } Fbrightpoint = Fdarkpoint = 0; // disable mouse if (strmatch(event,"autoscale")) // auto set dark and bright points { edit_reset(); thread_command = "autoscale"; // get dark/bright limits from thread_signal(); // darkest/brightest pixels thread_wait(); if (Fcancel) return 1; zdialog_stuff(zd,"Rdark",Rdark); // update dialog widgets zdialog_stuff(zd,"Gdark",Gdark); zdialog_stuff(zd,"Bdark",Bdark); zdialog_stuff(zd,"Rbrite",Rbrite); zdialog_stuff(zd,"Gbrite",Gbrite); zdialog_stuff(zd,"Bbrite",Bbrite); zdialog_stuff(zd,"Rmpy",1.0); zdialog_stuff(zd,"Gmpy",1.0); zdialog_stuff(zd,"Bmpy",1.0); zdialog_stuff(zd,"brightpoint",0); zdialog_stuff(zd,"darkpoint",0); pRdark = Rdark; // prior values = same pGdark = Gdark; pBdark = Bdark; pRbrite = Rbrite; pGbrite = Gbrite; pBbrite = Bbrite; pRmpy = Rmpy; pGmpy = Gmpy; pBmpy = Bmpy; return 1; } if (strmatch(event,"brightpoint")) { zdialog_fetch(zd,"brightpoint",Fbrightpoint); if (Fbrightpoint) { zdialog_stuff(zd,"darkpoint",0); Fdarkpoint = 0; } } if (strmatch(event,"darkpoint")) { zdialog_fetch(zd,"darkpoint",Fdarkpoint); if (Fdarkpoint) { zdialog_stuff(zd,"brightpoint",0); Fbrightpoint = 0; } } if (zstrstr("brightpoint darkpoint",event)) { // brightpoint or darkpoint takeMouse(gretinex_mousefunc,dragcursor); // connect mouse function return 1; } else { zdialog_stuff(zd,"brightpoint",0); // reset zdialog checkboxes zdialog_stuff(zd,"darkpoint",0); } adddark = addbrite = addmpy = 0; if (strmatch(event,"dark+-")) zdialog_fetch(zd,"dark+-",adddark); // All button if (strmatch(event,"brite+-")) zdialog_fetch(zd,"brite+-",addbrite); if (strmatch(event,"mpy+-")) zdialog_fetch(zd,"mpy+-",addmpy); zdialog_stuff(zd,"dark+-",0); // reset to zero zdialog_stuff(zd,"brite+-",0); zdialog_stuff(zd,"mpy+-",0); if (adddark) { zdialog_fetch(zd,"Rdark",Rdark); // increment dark levels zdialog_fetch(zd,"Gdark",Gdark); zdialog_fetch(zd,"Bdark",Bdark); Rdark += adddark; Gdark += adddark; Bdark += adddark; if (Rdark < 0) Rdark = 0; if (Gdark < 0) Gdark = 0; if (Bdark < 0) Bdark = 0; if (Rdark > 255) Rdark = 255; if (Gdark > 255) Gdark = 255; if (Bdark > 255) Bdark = 255; zdialog_stuff(zd,"Rdark",Rdark); zdialog_stuff(zd,"Gdark",Gdark); zdialog_stuff(zd,"Bdark",Bdark); } if (addbrite) { // increment bright levels zdialog_fetch(zd,"Rbrite",Rbrite); zdialog_fetch(zd,"Gbrite",Gbrite); zdialog_fetch(zd,"Bbrite",Bbrite); Rbrite += addbrite; Gbrite += addbrite; Bbrite += addbrite; if (Rbrite < 0) Rbrite = 0; if (Gbrite < 0) Gbrite = 0; if (Bbrite < 0) Bbrite = 0; if (Rbrite > 255) Rbrite = 255; if (Gbrite > 255) Gbrite = 255; if (Bbrite > 255) Bbrite = 255; zdialog_stuff(zd,"Rbrite",Rbrite); zdialog_stuff(zd,"Gbrite",Gbrite); zdialog_stuff(zd,"Bbrite",Bbrite); } if (addmpy) { // increment mpy factors zdialog_fetch(zd,"Rmpy",Rmpy); zdialog_fetch(zd,"Gmpy",Gmpy); zdialog_fetch(zd,"Bmpy",Bmpy); Rmpy += 0.01 * addmpy; Gmpy += 0.01 * addmpy; Bmpy += 0.01 * addmpy; if (Rmpy < 0.1) Rmpy = 0.1; if (Gmpy < 0.1) Gmpy = 0.1; if (Bmpy < 0.1) Bmpy = 0.1; if (Rmpy > 5) Rmpy = 5; if (Gmpy > 5) Gmpy = 5; if (Bmpy > 5) Bmpy = 5; zdialog_stuff(zd,"Rmpy",Rmpy); zdialog_stuff(zd,"Gmpy",Gmpy); zdialog_stuff(zd,"Bmpy",Bmpy); } zdialog_fetch(zd,"Rdark",Rdark); // get all params zdialog_fetch(zd,"Gdark",Gdark); zdialog_fetch(zd,"Bdark",Bdark); zdialog_fetch(zd,"Rbrite",Rbrite); zdialog_fetch(zd,"Gbrite",Gbrite); zdialog_fetch(zd,"Bbrite",Bbrite); zdialog_fetch(zd,"Rmpy",Rmpy); zdialog_fetch(zd,"Gmpy",Gmpy); zdialog_fetch(zd,"Bmpy",Bmpy); Fchange = 0; if (Rdark != pRdark) Fchange = 1; // detect changed params if (Gdark != pGdark) Fchange = 1; if (Bdark != pBdark) Fchange = 1; if (Rbrite != pRbrite) Fchange = 1; if (Gbrite != pGbrite) Fchange = 1; if (Bbrite != pBbrite) Fchange = 1; if (Rmpy != pRmpy) Fchange = 1; if (Gmpy != pGmpy) Fchange = 1; if (Bmpy != pBmpy) Fchange = 1; pRdark = Rdark; // remember values for change detection pGdark = Gdark; pBdark = Bdark; pRbrite = Rbrite; pGbrite = Gbrite; pBbrite = Bbrite; pRmpy = Rmpy; pGmpy = Gmpy; pBmpy = Bmpy; if (Fchange) { // global params changed thread_command = "global"; thread_signal(); // update image Fchange = 0; } if (zstrstr("blend, reduce bright",event)) { // blend params changed zdialog_fetch(zd,"blend",blend); zdialog_fetch(zd,"reduce bright",reducebright); thread_command = "blend"; thread_signal(); // update image } return 1; } // get dark point or bright point from mouse click position void gretinex_mousefunc() { using namespace gretinex_names; int px, py, dx, dy; float red, green, blue; float *ppix; ch mousetext[60]; zdialog *zd = EFgretinex.zd; if (! zd) { freeMouse(); return; } if (! Fbrightpoint && ! Fdarkpoint) { freeMouse(); return; } if (! LMclick) return; LMclick = 0; px = Mxclick; // mouse click position py = Myclick; if (px < 2) px = 2; // pull back from edge if (px > Eww-3) px = Eww-3; if (py < 2) py = 2; if (py > Ehh-3) py = Ehh-3; red = green = blue = 0; for (dy = -1; dy <= 1; dy++) // 3x3 block around mouse position for (dx = -1; dx <= 1; dx++) { ppix = PXMpix(E1pxm,px+dx,py+dy); // input image red += ppix[0]; green += ppix[1]; blue += ppix[2]; } red = red / 9.0; // mean RGB levels green = green / 9.0; blue = blue / 9.0; snprintf(mousetext,60,"3x3 Pixels RGB: %.0f %.0f %.0f \n",red,green,blue); poptext_mouse(mousetext,10,10,0,3); if (Fbrightpoint) { // click pixel is new bright point Rbrite= red; Gbrite = green; Bbrite = blue; zdialog_stuff(zd,"Rbrite",Rbrite); // stuff values into dialog zdialog_stuff(zd,"Gbrite",Gbrite); zdialog_stuff(zd,"Bbrite",Bbrite); } if (Fdarkpoint) { // click pixel is new dark point Rdark = red; Gdark = green; Bdark = blue; zdialog_stuff(zd,"Rdark",Rdark); // stuff values into dialog zdialog_stuff(zd,"Gdark",Gdark); zdialog_stuff(zd,"Bdark",Bdark); } if (Fbrightpoint || Fdarkpoint) { thread_command = "global"; thread_signal(); // trigger image update thread_wait(); } return; } // thread function - multiple working threads to update image void * gretinex_thread(void *) { using namespace gretinex_names; void * gretinex_wthread1(void *arg); // worker threads void * gretinex_wthread2(void *arg); void * gretinex_wthread3(void *arg); if (strmatch(thread_command,"autoscale")) { do_wthreads(gretinex_wthread1,1); // worker thread for autoscale thread_command = "global"; } if (strmatch(thread_command,"global")) { do_wthreads(gretinex_wthread2,NSMP); // worker thread for image RGB rescale if (E9pxm) PXM_free(E9pxm); // E9 image = global retinex output E9pxm = PXM_copy(E3pxm); thread_command = "blend"; // auto blend after global retinex } if (strmatch(thread_command,"blend")) { if (! E9pxm) E9pxm = PXM_copy(E3pxm); // stop thread crash do_wthreads(gretinex_wthread3,NSMP); // worker thread for image blend } CEF->Fmods++; // image modified CEF->Fsaved = 0; Fpaint2(); // update window return 0; } // worker thread function - autoscale retinex // find dark and bright points void * gretinex_wthread1(void *) { using namespace gretinex_names; int ii, dist = 0; int px, py, dx, dy; int red, green, blue; float *pix1; Rdark = Gdark = Bdark = 255; Rbrite = Gbrite = Bbrite = 0; Rmpy = Gmpy = Bmpy = 1.0; Fbrightpoint = Fdarkpoint = 0; for (py = 1; py < Ehh-1; py++) // loop all pixels for (px = 1; px < Eww-1; px++) { if (Fcancel) break; // user kill if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // outside area } red = green = blue = 0; for (dy = -1; dy <= 1; dy++) // loop 3x3 block for (dx = -1; dx <= 1; dx++) { pix1 = PXMpix(E1pxm,px+dx,py+dy); // input image red += pix1[0]; green += pix1[1]; blue += pix1[2]; } red = red / 9.0; // mean RGB levels green = green / 9.0; blue = blue / 9.0; if (red < Rdark) Rdark = red; // update limits if (green < Gdark) Gdark = green; if (blue < Bdark) Bdark = blue; if (red > Rbrite) Rbrite = red; if (green > Gbrite) Gbrite = green; if (blue > Bbrite) Bbrite = blue; } printf("dark RGB: %.0f %.0f %.0f bright RGB: %.0f %.0f %.0f \n", Rdark, Gdark, Bdark, Rbrite, Gbrite, Bbrite); return 0; } // worker thread function - scale image RGB values void * gretinex_wthread2(void *arg) { using namespace gretinex_names; int ii, index, dist = 0; int px, py; float R1, G1, B1, R3, G3, B3; float *pix1, *pix3; index = *((int *) arg); for (py = index; py < Ehh; py += NSMP) // loop all image pixels for (px = 0; px < Eww; px++) { if (Fcancel) break; // user kill if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // outside area } pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; // input RGB values G1 = pix1[1]; B1 = pix1[2]; R1 = 255 * (R1 - Rdark) / (Rbrite - Rdark); // rescale for full 0-255 range G1 = 255 * (G1 - Gdark) / (Gbrite - Gdark); B1 = 255 * (B1 - Bdark) / (Bbrite - Bdark); if (R1 < 0) R1 = 0; if (G1 < 0) G1 = 0; if (B1 < 0) B1 = 0; R3 = R1 * Rmpy; G3 = G1 * Gmpy; B3 = B1 * Bmpy; RGBfix(R3,G3,B3); pix3[0] = R3; // output RGB values pix3[1] = G3; pix3[2] = B3; } return 0; } // worker thread function - blend input and output images, attenuate bright pixels void * gretinex_wthread3(void *arg) { using namespace gretinex_names; int index = *((int *) arg); int px, py; int ii, dist = 0; float *pix1, *pix2, *pix3; float R1, G1, B1, R2, G2, B2, R3, G3, B3; float F1, F2, Lmax; for (py = index; py < Ehh; py += NSMP) // loop all image pixels for (px = 0; px < Eww; px++) { if (Fcancel) break; // user kill if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // outside area } pix1 = PXMpix(E1pxm,px,py); // input image pixel pix2 = PXMpix(E9pxm,px,py); // global retinex image pixel pix3 = PXMpix(E3pxm,px,py); // output image pixel R1 = pix1[0]; // input color - original image G1 = pix1[1]; B1 = pix1[2]; R2 = pix2[0]; // input color - retinex image G2 = pix2[1]; B2 = pix2[2]; Lmax = R1; // max. RGB input if (G1 > Lmax) Lmax = G1; if (B1 > Lmax) Lmax = B1; F1 = blend; // 0 ... 1 >> E1 ... E3 F2 = reducebright; // 0 ... 1 F1 = F1 * (1.0 - F2 * Lmax / 255.0); // reduce F1 for high F2 * Lmax R3 = F1 * R2 + (1.0 - F1) * R1; // output RGB = blended inputs G3 = F1 * G2 + (1.0 - F1) * G1; B3 = F1 * B2 + (1.0 - F1) * B1; pix3[0] = R3; // output RGB values pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // Local Retinex function // Rescale RGB values within local areas: increase local contrast and color. namespace lretinex_names { editfunc EFlretinex; // edit function data ch *thread_command; float imageblend, reducedark, reducebright; int radius; // user radius input (zone radius) int maxzones = 10000; int Nzones = 100; // zone count, 1-2000 int zsize, zrows, zcols, zww, zhh; // zone data typedef struct { // zone structure int cx, cy; // zone center in image float minR, minG, minB; // RGB minimum values in zone float maxR, maxG, maxB; // RGB mazimum values in zone } zone_t; zone_t *zones = 0; // up to 2000 zones int16 *zoneindex = 0; // zoneindex[ii][z] pixel ii, 9 zones int16 *zoneweight = 0; // zoneweight[ii][z] zone weights } // menu function void m_lretinex(GtkWidget *, ch *menu) { using namespace lretinex_names; int lretinex_dialog_event(zdialog *zd, ch *event); void * lretinex_thread(void *); F1_help_topic = TX("LOCAL RETINEX"); printf("m_lretinex \n"); EFlretinex.menuname = "Local Retinex"; EFlretinex.menufunc = m_lretinex; EFlretinex.Farea = 2; // select area usable EFlretinex.Fscript = 1; // scripting supported EFlretinex.Fpaintedits = 1; // use with paint edits OK EFlretinex.threadfunc = lretinex_thread; // thread function if (! edit_setup(EFlretinex)) return; // setup edit E9pxm = PXM_copy(E1pxm); /*** ______________________________________ | Local Retinex | | | | radius: [___] [apply] | | image blend: =======[]============= | | reduce dark: ==========[]========== | | reduce bright: ==========[]======== | | | | [Reset] [OK] [X] | |______________________________________| ***/ zdialog *zd = zdialog_new(TX("Local Retinex"),Mwin,TX("Reset"),"OK","X",null); EFlretinex.zd = zd; zdialog_add_widget(zd,"hbox","hbr","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labr","hbr",TX("radius:"),"space=5"); zdialog_add_widget(zd,"zspin","radius","hbr","20|999|1|50"); // radius range 20-999 zdialog_add_widget(zd,"button","newrad","hbr",TX("apply"),"space=3"); zdialog_add_widget(zd,"hbox","hbb","dialog"); zdialog_add_widget(zd,"label","labb","hbb",TX("image blend"),"space=5"); zdialog_add_widget(zd,"hscale2","image blend","hbb","0|1.0|0.01|0.5","expand"); zdialog_add_widget(zd,"hbox","hbrd","dialog"); zdialog_add_widget(zd,"label","labrd","hbrd",TX("reduce dark"),"space=5"); zdialog_add_widget(zd,"hscale2","reduce dark","hbrd","0|1.0|0.01|0.0","expand"); zdialog_add_widget(zd,"hbox","hbrl","dialog"); zdialog_add_widget(zd,"label","labrd","hbrl",TX("reduce bright"),"space=5"); zdialog_add_widget(zd,"hscale2","reduce bright","hbrl","0|1.0|0.01|0.0","expand"); zdialog_run(zd,lretinex_dialog_event,"save"); // run dialog - parallel zdialog_send_event(zd,"reset"); zdialog_send_event(zd,"newrad"); return; } // dialog event and completion function int lretinex_dialog_event(zdialog *zd, ch *event) { using namespace lretinex_names; int lretinex_zonesetup(zdialog *zd); if (strmatch(event,"done")) zd->zstat = 2; // OK, edit_setup(), f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (strmatch(event,"reset")) zd->zstat = 1; // initz. if (strmatch(event,"focus")) return 1; if (strmatch(event,"apply")) // from script { zdialog_fetch(zd,"radius",radius); // get radius zdialog_fetch(zd,"image blend",imageblend); zdialog_fetch(zd,"reduce dark",reducedark); zdialog_fetch(zd,"reduce bright",reducebright); if (! lretinex_zonesetup(zd)) { // setup zones edit_cancel(0); // failed (insufficient memory) PXM_free(E9pxm); return 1; } thread_command = "newrad"; thread_signal(); // update image thread_wait(); zd->zstat = 2; } if (strmatch(event,"newrad")) { // new radius zdialog_fetch(zd,"radius",radius); // get radius if (! lretinex_zonesetup(zd)) { // setup zones edit_cancel(0); // failed (insufficient memory) PXM_free(E9pxm); return 1; } thread_command = "newrad"; thread_signal(); // update image thread_wait(); } if (strmatch(event,"image blend")) { // image blend param changed zdialog_fetch(zd,"image blend",imageblend); thread_command = "image blend"; thread_signal(); // update image thread_wait(); } if (zstrstr(event,"reduce")) { // reduce param changed zdialog_fetch(zd,"reduce dark",reducedark); zdialog_fetch(zd,"reduce bright",reducebright); thread_command = "image blend"; thread_signal(); // update image thread_wait(); } if (strmatch(event,"paint")) { // mouse paint thread_command = "image blend"; thread_signal(); // update image thread_wait(); } if (zd->zstat) { if (zd->zstat == 1) { // reset zd->zstat = 0; // keep dialog active imageblend = 0.5; reducedark = 0.0; reducebright = 0.0; zdialog_stuff(zd,"image blend",imageblend); zdialog_stuff(zd,"reduce dark",reducedark); zdialog_stuff(zd,"reduce bright",reducebright); edit_reset(); PXM_free(E9pxm); E9pxm = PXM_copy(E1pxm); return 1; } else if (zd->zstat == 2) { // done edit_addhist("radius:%d blend:%.3f red.D:%.3f red.B:%.3f", // edit parms > edit hist radius,imageblend,reducedark,reducebright); edit_done(0); // commit edit PXM_free(E9pxm); if (zones) zfree(zones); if (zoneindex) zfree(zoneindex); if (zoneweight) zfree(zoneweight); zones = 0; zoneindex = 0; zoneweight = 0; return 1; } else { edit_cancel(0); // discard edit PXM_free(E9pxm); if (zones) zfree(zones); if (zoneindex) zfree(zoneindex); if (zoneweight) zfree(zoneweight); zones = 0; zoneindex = 0; zoneweight = 0; return 1; } } return 1; } // setup new zone parameters and allocate memory int lretinex_zonesetup(zdialog *zd) { using namespace lretinex_names; int goal, dirc, Pzones; int row, col, xlo, ylo; int ii, cx, cy; int64 nn, z64 = 1; size_t reqcc; Nzones = (Eww * Ehh) / (PI * radius * radius); // approx. zone count if (Nzones > maxzones) Nzones = maxzones; Pzones = Nzones - 1; goal = Nzones; // new zone count goal dirc = Nzones - Pzones; // direction of change if (dirc == 0) dirc = 1; while (true) { zsize = sqrt(Eww * Ehh / goal); // approx. zone size zrows = Ehh / zsize; // get appropriate rows and cols zcols = Eww / zsize; if (zrows < 1) zrows = 1; if (zcols < 1) zcols = 1; Nzones = zrows * zcols; // matching rows x cols if (dirc > 0 && Nzones <= Pzones) { // no increase, try again if (Nzones >= maxzones) break; goal++; continue; } if (dirc < 0 && Nzones >= Pzones) { // no decrease, try again if (Nzones == 1) break; goal--; continue; } if (dirc > 0 && Nzones > Pzones) break; // done if (dirc < 0 && Nzones < Pzones) break; } if (zones) zfree(zones); // free memory if (zoneindex) zfree(zoneindex); if (zoneweight) zfree(zoneweight); zones = 0; zoneindex = 0; zoneweight = 0; zww = Eww / zcols; // zone width, height zhh = Ehh / zrows; nn = z64 * Eww * Ehh * 9; // 9 neighbor zones per pixel reqcc = Nzones * sizeof(zone_t) + 2 * nn * sizeof(int16); // check large memory is available if (! zmalloc_test(reqcc)) { reqcc = reqcc / MEGA; zmessageACK(Mwin,TX("cannot allocate %d MB memory"),reqcc); return 0; } zones = (zone_t *) zmalloc(Nzones * sizeof(zone_t),"local retx"); // allocate zone memory zoneindex = (int16 *) zmalloc(nn * sizeof(int16),"local retx"); // allocate pixel zone index zoneweight = (int16 *) zmalloc(nn * sizeof(int16),"local retx"); // allocate pixel zone weight for (row = 0; row < zrows; row++) // loop all zones for (col = 0; col < zcols; col++) { xlo = col * zww; // zone low pixel ylo = row * zhh; cx = xlo + zww/2; // zone center pixel cy = ylo + zhh/2; ii = row * zcols + col; // zone index zones[ii].cx = cx; // zone center zones[ii].cy = cy; } return 1; } // thread function - multiple working threads to update image void * lretinex_thread(void *) { using namespace lretinex_names; void * lretinex_wthread1(void *arg); void * lretinex_wthread2(void *arg); void * lretinex_wthread3(void *arg); if (strmatch(thread_command,"newrad")) // update zones and image { do_wthreads(lretinex_wthread1,NSMP); // compute zone RGB levels and weights do_wthreads(lretinex_wthread2,NSMP); // compute new pixel RGB values thread_command = "image blend"; // auto blend after } if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag if (strmatch(thread_command,"image blend")) { get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(lretinex_wthread3,NSMP); // blend input and retinex images } CEF->Fmods++; // image modified CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } // worker thread to compute zone RGB levels and weights per image pixel void * lretinex_wthread1(void *arg) { using namespace lretinex_names; int index = *((int *) arg); int px, py, row, col; int xlo, xhi, ylo, yhi, cx, cy; int ii, jj, kk; int64 zii, z64 = 1; float minR, minG, minB, maxR, maxG, maxB; float dist, maxdist, weight, sumweight; float *pix; for (row = index; row < zrows; row += NSMP) // loop all zones for (col = 0; col < zcols; col++) { xlo = col * zww; // zone low pixel ylo = row * zhh; xhi = xlo + zww; // zone high pixel yhi = ylo + zhh; minR = minG = minB = 256; maxR = maxG = maxB = 0; for (py = ylo; py < yhi; py++) // find min/max RGB in zone for (px = xlo; px < xhi; px++) { pix = PXMpix(E1pxm,px,py); if (pix[0] < minR) minR = pix[0]; if (pix[1] < minG) minG = pix[1]; if (pix[2] < minB) minB = pix[2]; if (pix[0] > maxR) maxR = pix[0]; if (pix[1] > maxG) maxG = pix[1]; if (pix[2] > maxB) maxB = pix[2]; } ii = row * zcols + col; // zone index zones[ii].minR = minR; // zone RGB range zones[ii].minG = minG; zones[ii].minB = minB; zones[ii].maxR = maxR; zones[ii].maxG = maxG; zones[ii].maxB = maxB; } for (py = index; py < Ehh; py += NSMP) // loop all image pixels for (px = 0; px < Eww; px++) { row = py / zhh; // zone containing pixel col = px / zww; zii = z64 * (py * Eww + px) * 9; // base zone index for pixel for (jj = row-1; jj <= row+1; jj++) // loop 9 neighboring zones for (kk = col-1; kk <= col+1; kk++) { if (jj >= 0 && jj < zrows && kk >= 0 && kk < zcols) // neighbor zone number zoneindex[zii] = jj * zcols + kk; // --> pixel zone index else zoneindex[zii] = -1; // pixel zone on edge, missing neighbor zii++; } } if (zww < zhh) maxdist = 1.5 * zww; // based on 3x3 zones else maxdist = 1.5 * zhh; for (py = index; py < Ehh; py += NSMP) // loop all image pixels for (px = 0; px < Eww; px++) { row = py / zhh; // zone containing pixel col = px / zww; zii = z64 * (py * Eww + px) * 9; // base zone index for pixel for (jj = 0; jj < 9; jj++) // loop neighbor zones { kk = zoneindex[zii+jj]; if (kk < 0) { // neighbor missing zoneweight[zii+jj] = 0; continue; } cx = zones[kk].cx; // zone center cy = zones[kk].cy; dist = sqrtf((px-cx)*(px-cx) + (py-cy)*(py-cy)); // distance from (px,py) weight = 1.0 - dist / maxdist; // dist 0..max --> weight 1..0 if (weight < 0) weight = 0; zoneweight[zii+jj] = 1000.0 * weight; // scale 1.0 = 1000 } sumweight = 0; for (jj = 0; jj < 9; jj++) // get sum of zone weights sumweight += zoneweight[zii+jj]; for (jj = 0; jj < 9; jj++) // make weights add up to 1.0 zoneweight[zii+jj] = 1000.0 * zoneweight[zii+jj] / sumweight; // 1000 = 1.0 } return 0; } // worker thread to compute new image RGB values void * lretinex_wthread2(void *arg) { using namespace lretinex_names; int index = *((int *) arg); int px, py, ii, jj, kk, dist = 0; int64 zii, z64 = 1; float minR, minG, minB, maxR, maxG, maxB; float R1, G1, B1, R2, G2, B2; float weight; float *pix1, *pix2; for (py = index; py < Ehh; py += NSMP) // loop all image pixels for (px = 0; px < Eww; px++) { if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // outside area } minR = minG = minB = 0; maxR = maxG = maxB = 0; zii = z64 * (py * Eww + px) * 9; // base zone index for pixel for (jj = 0; jj < 9; jj++) // loop neighbor zones { kk = zoneindex[zii+jj]; // zone number if (kk < 0) continue; weight = 0.001 * zoneweight[zii+jj]; // zone weight (1000 = 1.0) minR += weight * zones[kk].minR; // sum weighted RGB range minG += weight * zones[kk].minG; // for neighbor zones minB += weight * zones[kk].minB; maxR += weight * zones[kk].maxR; maxG += weight * zones[kk].maxG; maxB += weight * zones[kk].maxB; } pix1 = PXMpix(E1pxm,px,py); // input pixel pix2 = PXMpix(E9pxm,px,py); // output pixel R1 = pix1[0]; G1 = pix1[1]; B1 = pix1[2]; R2 = 255 * (R1 - minR) / (maxR - minR + 1); // avoid poss. divide by zero G2 = 255 * (G1 - minG) / (maxG - minG + 1); B2 = 255 * (B1 - minB) / (maxB - minB + 1); RGBfix(R2,G2,B2); pix2[0] = R2; pix2[1] = G2; pix2[2] = B2; } return 0; } // worker thread to blend input image with retinex image // and attenuate bright pixels void * lretinex_wthread3(void *arg) { using namespace lretinex_names; int index = *((int *) arg); int px, py; int Fend; float *pix1, *pix2, *pix3; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float F1, F2, Lmax, blend; while (true) { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input image pixel pix2 = PXMpix(E9pxm,px,py); // retinex image pixel pix3 = PXMpix(E3pxm,px,py); // output image pixel R1 = pix1[0]; // input RGB G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; // current output RGB G3 = pix3[1]; B3 = pix3[2]; R9 = pix2[0]; // retinex RGB G9 = pix2[1]; B9 = pix2[2]; Lmax = R1; // max. RGB input if (G1 > Lmax) Lmax = G1; if (B1 > Lmax) Lmax = B1; Lmax = Lmax / 255.0; // scale 0-1 F1 = imageblend; // 0 ... 1 >> E1 ... E3 F2 = reducedark; F1 = F1 * (1.0 - F2 * (1.0 - Lmax)); // reduce F1 for high F2 * (1 - Lmax) F2 = reducebright; // 0 ... 1 F1 = F1 * (1.0 - F2 * Lmax); // reduce F1 for high F2 * Lmax R9 = F1 * R9 + (1.0 - F1) * R1; // output RGB = blended inputs G9 = F1 * G9 + (1.0 - F1) * G1; B9 = F1 * B9 + (1.0 - F1) * B1; RGBfix(R9,G9,B9); if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { // increase edit R3 = blend * R9 + (1-blend) * R3; G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { // decrease edit R3 = -blend * R1 + (1+blend) * R3; G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // output RGB values pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // Saturation // Adjust color saturation for entire image (slider), // or set saturation based on pixel brightness (curve). namespace saturation_names { editfunc EFsaturation; float colorsat; // saturation input, -1 ... +1 } // menu function void m_saturation(GtkWidget *, ch *menu) { using namespace saturation_names; int saturation_dialog_event(zdialog* zd, ch *event); void saturation_curvedit(int spc); void * saturation_thread(void *); GtkWidget *drawwin_scale; F1_help_topic = TX("SATURATION"); printf("m_saturation \n"); EFsaturation.menuname = "Saturation"; EFsaturation.menufunc = m_saturation; EFsaturation.FprevReq = 1; // use preview EFsaturation.Farea = 2; // select area usable EFsaturation.Fpaintedits = 1; // use with paint edits OK EFsaturation.Fscript = 1; // scripting supported EFsaturation.threadfunc = saturation_thread; if (! edit_setup(EFsaturation)) return; // setup edit /*** _______________________________________________ | Saturation | | ___________________________________________ | | | | | | | curve edit area | | | | saturation by brightness level | | | | | | | | | | | | ----------------------------------------- | | // editable function-line | | | | | | | | | | | | | |___________________________________________| | | |___________________________________________| | // brightness scale: black --> white | | | Saturation =================[]============ | // saturation, B/W ... max-color | | | [Reset] [OK] [X] | |_______________________________________________| ***/ zdialog *zd = zdialog_new(TX("Saturation"),Mwin,TX("Reset"),"OK","X",null); EFsaturation.zd = zd; zdialog_add_widget(zd,"frame","frameH","dialog",0,"expand"); // edit-curve zdialog_add_widget(zd,"frame","frameB","dialog"); // brightness scale zdialog_add_widget(zd,"hbox","hbsat","dialog",0,"space=5|expand"); zdialog_add_widget(zd,"label","labsat","hbsat",TX("Saturation")); zdialog_add_widget(zd,"hscale","colorsat","hbsat","-1.0|1.0|0.01|0.0","expand"); GtkWidget *frameH = zdialog_gtkwidget(zd,"frameH"); // setup edit curves spldat *sd = splcurve_init(frameH,saturation_curvedit); EFsaturation.sd = sd; sd->Nscale = 1; // horizontal line, neutral value sd->xscale[0][0] = 0.00; sd->yscale[0][0] = 0.50; sd->xscale[1][0] = 1.00; sd->yscale[1][0] = 0.50; sd->nap[0] = 3; // initial curve is neutral sd->vert[0] = 0; sd->apx[0][0] = 0.01; // horizontal line sd->apy[0][0] = 0.50; sd->apx[0][1] = 0.50; sd->apy[0][1] = 0.50; // curve 0 = overall brightness sd->apx[0][2] = 0.99; sd->apy[0][2] = 0.50; splcurve_generate(sd,0); sd->mod[0] = 0; // mark curve unmodified sd->Nspc = 1; // 1 curve sd->fact[0] = 1; // curve 0 active GtkWidget *frameB = zdialog_gtkwidget(zd,"frameB"); // setup brightness scale drawing area drawwin_scale = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(frameB),drawwin_scale); gtk_widget_set_size_request(drawwin_scale,100,12); G_SIGNAL(drawwin_scale,"draw",brightness_scale,0); colorsat = 0; // neutral saturation zdialog_resize(zd,350,300); zdialog_run(zd,saturation_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int saturation_dialog_event(zdialog *zd, ch *event) { using namespace saturation_names; spldat *sd = EFsaturation.sd; float sat0, dsat, dy; float Fapply = 0; int ii; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (strmatch(event,"apply")) Fapply = 1; // from script if (strmatch(event,"fullsize")) { // from select area edit_fullsize(); // get full size image if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } return 1; } if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active zdialog_stuff(zd,"colorsat",0); // neutral saturation colorsat = 0; sd->nap[0] = 3; // curve is neutral sd->vert[0] = 0; sd->apx[0][0] = 0.01; sd->apy[0][0] = 0.50; sd->apx[0][1] = 0.50; sd->apy[0][1] = 0.50; sd->apx[0][2] = 0.99; sd->apy[0][2] = 0.50; splcurve_generate(sd,0); sd->mod[0] = 0; // mark curve unmodified gtk_widget_queue_draw(sd->drawarea); // redraw curves edit_reset(); return 1; } if (zd->zstat == 2) // [OK] { freeMouse(); if (CEF->Fmods) { edit_fullsize(); // get full size image if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } edit_done(0); // complete edit } else edit_cancel(0); // no change return 1; } if (zd->zstat < 0 || zd->zstat > 2) { // cancel edit_cancel(0); return 1; } if (strmatch(event,"colorsat")) // saturation slider -1 ... +1 { sat0 = colorsat; // old value zdialog_fetch(zd,"colorsat",colorsat); // new value dsat = colorsat - sat0; // change in saturation, + - for (ii = 0; ii < sd->nap[0]; ii++) // update curve 0 nodes from slider { dy = sd->apy[0][ii] + 0.5 * dsat; // increment saturation if (dy < 0) dy = 0; if (dy > 1) dy = 1; sd->apy[0][ii] = dy; } splcurve_generate(sd,0); // regenerate curve 0 gtk_widget_queue_draw(sd->drawarea); // draw curve 0 Fapply = 1; } if (strmatch(event,"paint")) Fapply = 1; // mouse paint if (Fapply) thread_signal(); // update the image return 1; } // this function is called when a curve is edited void saturation_curvedit(int spc) { using namespace saturation_names; thread_signal(); return; } // thread function void * saturation_thread(void *arg) { using namespace saturation_names; void * saturation_wthread(void *); if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(saturation_wthread,NSMP); CEF->Fmods++; // image3 modified CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } void * saturation_wthread(void *arg) // worker thread function { using namespace saturation_names; int index = *((int *) arg); int ii, Fend, px, py; float *pix1, *pix3; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float pixbrite, colorsat; float coeff = 1000.0 / 256.0; float blend; spldat *sd = EFsaturation.sd; while (true) // loop all edit pixels { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = R9 = pix1[0]; // input RGB values G1 = G9 = pix1[1]; B1 = B9 = pix1[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; // apply saturation curve if (sd->mod[0]) // curve was modified { pixbrite = 0.333 * (R3 + G3 + B3); // pixel brightness, 0 to 255.9 ii = coeff * pixbrite; // "all" curve index 0-999 if (ii < 0) ii = 0; if (ii > 999) ii = 999; colorsat = 2.0 * sd->yval[0][ii] - 1.0; // -1 ... 0 ... +1 R9 = R9 + colorsat * (R9 - pixbrite); // colorsat is -1 ... +1 G9 = G9 + colorsat * (G9 - pixbrite); B9 = B9 + colorsat * (B9 - pixbrite); } RGBfix(R9,G9,B9); if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; // increase edit G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // Soft Focus // Mix a sharp and blurred image with blurred portion 0-100%. // Blur radius for pixel is 0-value for pixel with 0-255 contrast. namespace soft_focus_names { editfunc EFsoft_focus; float Brad, Bmix; float Bweight[101]; // for max. radius 100 } // menu function void m_soft_focus(GtkWidget *, ch *menu) { using namespace soft_focus_names; int soft_focus_dialog_event(zdialog* zd, ch *event); void * soft_focus_thread(void *); F1_help_topic = TX("SOFT FOCUS"); printf("m_soft_focus \n"); EFsoft_focus.menuname = "Soft Focus"; EFsoft_focus.menufunc = m_soft_focus; EFsoft_focus.Farea = 2; // select area usable EFsoft_focus.Fpaintedits = 1; // use with paint edits OK EFsoft_focus.Fscript = 1; // scripting supported EFsoft_focus.threadfunc = soft_focus_thread; if (! edit_setup(EFsoft_focus)) return; // setup edit /*** ____________________________________________ | Soft Focus | | | | Blur Radius ========[]=============== 10 | 1-N for pixels with 0-max. contrast | Blur Mix ================[]======= 65 | % blurred image - rest from sharp image | | | [OK] [X] | |____________________________________________| ***/ zdialog *zd = zdialog_new(TX("Soft Focus"),Mwin,"OK","X",null); EFsoft_focus.zd = zd; zdialog_add_widget(zd,"hbox","hbrad","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labrad","hbrad",TX("Blur Radius"),"space=3"); zdialog_add_widget(zd,"hscale2","Brad","hbrad","1|20|1|0","expand"); zdialog_add_widget(zd,"hbox","hbmix","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labmix","hbmix",TX("Blur Mix"),"space=3"); zdialog_add_widget(zd,"hscale2","Bmix","hbmix","1|100|1|0","expand"); Brad = Bmix = 0; //zdialog_load_inputs(zd); zdialog_resize(zd,350,0); zdialog_run(zd,soft_focus_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int soft_focus_dialog_event(zdialog *zd, ch *event) { using namespace soft_focus_names; if (strmatch(event,"focus")) return 1; if (strmatch(event,"done")) zd->zstat = 1; // done if (strmatch(event,"cancel")) zd->zstat = 2; // cancel if (strmatch(event,"apply")) zd->zstat = 1; // from script if (zd->zstat == 1) { // [OK] or apply edit_addhist("radius:%.0f mix:%.0f",Brad,Bmix); // edit parms > edit hist edit_done(0); return 1; } if (zd->zstat < 0 || zd->zstat > 1) { // cancel edit_cancel(0); return 1; } if (strstr("Brad Bmix",event)) { // interactive 26.2 zdialog_fetch(zd,"Brad",Brad); zdialog_fetch(zd,"Bmix",Bmix); thread_signal(); } if (strmatch(event,"paint")) thread_signal(); // mouse paint return 1; } // thread function void * soft_focus_thread(void *arg) { using namespace soft_focus_names; void * soft_focus_wthread(void *); float ww; if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag for (int ii = 0; ii <= Brad; ii++) // set pixel weight per distance { // example, Brad = 10 ww = 1.0 - ii / Brad; // dist: 0 1 2 3 5 7 9 10 ww = ww * ww; // weight: 1 .81 .64 .49 .25 .09 .01 .00 Bweight[ii] = ww; } get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(soft_focus_wthread,NSMP); CEF->Fmods++; // image3 modified CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } void * soft_focus_wthread(void *arg) // worker thread function { using namespace soft_focus_names; int index = *((int *) arg); int px, py, qx, qy, rx, ry; int Fend, irad; float ww, wsum, blend, bmix1, bmix2; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float *pix1, *pix3, *pixN; bmix1 = 0.01 * Bmix; // 0.0 to 1.0 bmix2 = 1.0 - bmix1; // 1.0 to 0.0 while (true) // loop all edit pixels { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; // input RGB values G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; R9 = G9 = B9 = 0; // compute blurred pixel wsum = 0; for (qy = -Brad; qy <= +Brad; qy++) // loop pixels within Brad of (px,py) for (qx = -Brad; qx <= +Brad; qx++) { rx = px + qx; ry = py + qy; if (rx < 0 || rx > Eww-1) continue; // outside image edge if (ry < 0 || ry > Ehh-1) continue; irad = sqrtf(qx*qx + qy*qy); // pixel distance from (px,py) ww = Bweight[irad]; // pixel weight for blur pixN = PXMpix(E1pxm,rx,ry); // weighted sum for blur R9 += pixN[0] * ww; G9 += pixN[1] * ww; B9 += pixN[2] * ww; wsum += ww; } if (wsum == 0) continue; R9 = R9 / wsum; // blurred pixel G9 = G9 / wsum; B9 = B9 / wsum; R9 = bmix1 * R9 + bmix2 * R1; // mixed blurred and sharp pixel G9 = bmix1 * G9 + bmix2 * G1; B9 = bmix1 * B9 + bmix2 * B1; if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; // increase edit G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // match_colors edit function // Adjust colors of image 2 to match the colors of image 1 // using small selected areas in each image as the match standard. namespace match_colors_names { float match_colors_RGB1[3]; // image 1 base colors to match float match_colors_RGB2[3]; // image 2 target colors to match int match_colors_radius = 10; // mouse radius int match_colors_mode = 0; editfunc EFmatchcolors; } // menu function void m_match_colors(GtkWidget *, ch *menu) { using namespace match_colors_names; int match_colors_dialog_event(zdialog* zd, ch *event); void * match_colors_thread(void *); void match_colors_mousefunc(); ch *title = TX("Color Match Images"); F1_help_topic = TX("MATCH COLORS"); printf("m_match_colors \n"); /*** ____________________________________________ | Color Match Images | | | | 1 [ 10 ] mouse radius for color sample | | 2 [Open] image for source color | | 3 click on image to get source color | | 4 [Open] image for target color | | 5 click on image to set target color | | | | [OK] [X] | |____________________________________________| ***/ zdialog *zd = zdialog_new(title,Mwin,"OK","X",null); // match_colors dialog zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=2"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"homog|space=3"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"homog|space=3"); zdialog_add_widget(zd,"label","labn1","vb1","1"); zdialog_add_widget(zd,"label","labn2","vb1","2"); zdialog_add_widget(zd,"label","labn3","vb1","3"); zdialog_add_widget(zd,"label","labn4","vb1","4"); zdialog_add_widget(zd,"label","labn5","vb1","5"); zdialog_add_widget(zd,"hbox","hbrad","vb2"); zdialog_add_widget(zd,"zspin","radius","hbrad","1|20|1|10","space=5"); zdialog_add_widget(zd,"label","labrad","hbrad",TX("mouse radius for color sample")); zdialog_add_widget(zd,"hbox","hbop1","vb2"); zdialog_add_widget(zd,"button","open1","hbop1",TX("Open"),"space=5"); zdialog_add_widget(zd,"label","labop1","hbop1",TX("image for source color")); zdialog_add_widget(zd,"hbox","hbclik1","vb2"); zdialog_add_widget(zd,"label","labclik1","hbclik1",TX("click on image to get source color")); zdialog_add_widget(zd,"hbox","hbop2","vb2"); zdialog_add_widget(zd,"button","open2","hbop2",TX("Open"),"space=5"); zdialog_add_widget(zd,"label","labop2","hbop2",TX("image to set matching color")); zdialog_add_widget(zd,"hbox","hbclik2","vb2"); zdialog_add_widget(zd,"label","labclik2","hbclik2",TX("click on image to set matching color")); zdialog_stuff(zd,"radius",match_colors_radius); // remember last radius EFmatchcolors.menuname = "Match Colors"; EFmatchcolors.Farea = 2; // select area usable EFmatchcolors.zd = zd; EFmatchcolors.threadfunc = match_colors_thread; EFmatchcolors.mousefunc = match_colors_mousefunc; match_colors_mode = 0; if (curr_file) { match_colors_mode = 1; // image 1 ready to click takeMouse(match_colors_mousefunc,0); // connect mouse function } zdialog_run(zd,match_colors_dialog_event,"parent"); // run dialog - parallel return; } // match_colors dialog event and completion function int match_colors_dialog_event(zdialog *zd, ch *event) { using namespace match_colors_names; void match_colors_mousefunc(); int err; ch *file; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (match_colors_mode == 4) { // edit was started if (zd->zstat == 1) edit_done(0); // commit edit else edit_cancel(0); // discard edit match_colors_mode = 0; return 1; } freeMouse(); // abandoned zdialog_free(zd); match_colors_mode = 0; return 1; } if (strmatch(event,"radius")) // set new mouse radius zdialog_fetch(zd,"radius",match_colors_radius); if (strmatch(event,"open1")) // get image 1 for color source { if (match_colors_mode == 4) edit_cancel(1); // cancel edit, keep dialog match_colors_mode = 0; file = select_1file(null); // open image 1 if (file) { err = f_open(file); if (! err) match_colors_mode = 1; // image 1 ready to click } } if (strmatch(event,"open2")) // get image 2 to set matching color { if (match_colors_mode < 2) { zmessageACK(Mwin,TX("select source image color first")); // check that RGB1 has been set return 1; } match_colors_mode = 2; file = select_1file(null); // open image 2 if (! file) return 1; err = f_open(file); if (err) return 1; match_colors_mode = 3; // image 2 ready to click } takeMouse(match_colors_mousefunc,0); // reconnect mouse function return 1; } // mouse function - click on image and get colors to match void match_colors_mousefunc() { using namespace match_colors_names; void match_colors_getRGB(int px, int py, float rgb[3]); int px, py; if (match_colors_mode < 1) return; // no image available yet draw_mousecircle(Mxposn,Myposn,match_colors_radius,0,0); // draw circle around pointer if (LMclick) { LMclick = 0; px = Mxclick; py = Myclick; if (match_colors_mode == 1 || match_colors_mode == 2) // image 1 ready to click { match_colors_getRGB(px,py,match_colors_RGB1); // get RGB1 color match_colors_mode = 2; return; } if (match_colors_mode == 3 || match_colors_mode == 4) // image 2 ready to click { if (match_colors_mode == 4) edit_reset(); else { if (! edit_setup(EFmatchcolors)) return; // setup edit - thread will launch match_colors_mode = 4; // edit waiting for cancel or done } match_colors_getRGB(px,py,match_colors_RGB2); // get RGB2 color thread_signal(); // update the target image return; } } return; } // get the RGB averages for pixels within mouse radius void match_colors_getRGB(int px, int py, float rgb[3]) { using namespace match_colors_names; int radflat1 = match_colors_radius; int radflat2 = radflat1 * radflat1; int rad, npix, qx, qy; float red, green, blue; float *pix1; PXM *pxm; pxm = PXM_load(curr_file,1); // popup ACK if error if (! pxm) return; npix = 0; red = green = blue = 0; for (qy = py-radflat1; qy <= py+radflat1; qy++) for (qx = px-radflat1; qx <= px+radflat1; qx++) { if (qx < 0 || qx > pxm->ww-1) continue; if (qy < 0 || qy > pxm->hh-1) continue; rad = (qx-px) * (qx-px) + (qy-py) * (qy-py); if (rad > radflat2) continue; pix1 = PXMpix(pxm,qx,qy); red += pix1[0]; green += pix1[1]; blue += pix1[2]; npix++; } rgb[0] = red / npix; rgb[1] = green / npix; rgb[2] = blue / npix; PXM_free(pxm); return; } // thread function - start multiple working threads void * match_colors_thread(void *) { using namespace match_colors_names; void * match_colors_wthread(void *arg); do_wthreads(match_colors_wthread,NSMP); // worker threads if (sa_stat == sa_stat_fini) sa_postfix(); // if select area, restore unselected CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return 0; } void * match_colors_wthread(void *arg) // worker thread function { using namespace match_colors_names; int index = *((int *) (arg)); int px, py; float *pix3; float Rred, Rgreen, Rblue; float red, green, blue; Rred = match_colors_RGB1[0] / match_colors_RGB2[0]; // color adjustment ratios Rgreen = match_colors_RGB1[1] / match_colors_RGB2[1]; Rblue = match_colors_RGB1[2] / match_colors_RGB2[2]; for (py = index; py < Ehh; py += NSMP) // loop all image pixels for (px = 0; px < Eww; px++) { pix3 = PXMpix(E3pxm,px,py); red = pix3[0] * Rred; // adjust colors green = pix3[1] * Rgreen; blue = pix3[2] * Rblue; RGBfix(red,green,blue); pix3[0] = red; pix3[1] = green; pix3[2] = blue; } return 0; } /**************************************************************************************/ // add a brightness/color curved ramp to an image, in a chosen direction namespace brite_ramp_names { editfunc EFbrite_ramp; int Fline, linex1, liney1, linex2, liney2; float A, B, C; float ex1, ey1, ex2, ey2; } // menu function void m_brite_ramp(GtkWidget *, ch *menu) { using namespace brite_ramp_names; void brite_ramp_curvedit(int spc); int brite_ramp_dialog_event(zdialog* zd, ch *event); void * brite_ramp_thread(void *); void brite_ramp_mousefunc(); ch *mess = TX("Draw a line across the image in \n" "direction of brightness change."); F1_help_topic = TX("BRIGHTNESS RAMP"); printf("m_brite_ramp \n"); EFbrite_ramp.menuname = "Brightness Ramp"; EFbrite_ramp.menufunc = m_brite_ramp; EFbrite_ramp.FprevReq = 1; // use preview EFbrite_ramp.Fscript = 1; // scripting supported EFbrite_ramp.Farea = 2; // select area usable EFbrite_ramp.threadfunc = brite_ramp_thread; EFbrite_ramp.mousefunc = brite_ramp_mousefunc; if (! edit_setup(EFbrite_ramp)) return; // setup edit Fline = 0; // no drawn line initially /*** _______________________________________________ | Brightness Ramp | | | | Draw a line across the image in | | direction of brightness change. | | ___________________________________________ | | | | | // 5 curves are maintained: | | | | // 0: current display curve | | | | // 1: curve for all colors | | curve edit area | | // 2,3,4: red, green, blue | | | | | | | | | | | | | |___________________________________________| | | (o) all (o) red (o) green (o) blue | // select curve to display | | | [Reset] [OK] [X] | |_______________________________________________| ***/ zdialog *zd = zdialog_new(TX("Brightness Ramp"),Mwin,TX("Reset"),"OK","X",null); EFbrite_ramp.zd = zd; zdialog_add_widget(zd,"label","labmess","dialog",mess); zdialog_add_widget(zd,"frame","frameH","dialog",0,"expand"); // edit-curves zdialog_add_widget(zd,"hbox","hbrgb","dialog"); // radio buttons all/red/green/blue zdialog_add_widget(zd,"radio","all","hbrgb",TX("All"),"space=5"); zdialog_add_widget(zd,"radio","red","hbrgb",TX("Red"),"space=3"); zdialog_add_widget(zd,"radio","green","hbrgb",TX("Green"),"space=3"); zdialog_add_widget(zd,"radio","blue","hbrgb",TX("Blue"),"space=3"); GtkWidget *frameH = zdialog_gtkwidget(zd,"frameH"); // setup edit curves spldat *sd = splcurve_init(frameH,brite_ramp_curvedit); EFbrite_ramp.sd = sd; sd->Nscale = 1; // horizontal fixed line, neutral curve sd->xscale[0][0] = 0.01; sd->yscale[0][0] = 0.50; sd->xscale[1][0] = 0.99; sd->yscale[1][0] = 0.50; for (int ii = 0; ii < 4; ii++) // loop curves 0-3 { sd->nap[ii] = 3; // initial curves are neutral sd->vert[ii] = 0; sd->fact[ii] = 0; sd->apx[ii][0] = 0.01; sd->apx[ii][1] = 0.50; // curve 0 = overall brightness sd->apx[ii][2] = 0.99; // curve 1/2/3 = R/G/B adjustment sd->apy[ii][0] = 0.5; sd->apy[ii][1] = 0.5; sd->apy[ii][2] = 0.5; splcurve_generate(sd,ii); } sd->Nspc = 4; // 4 curves sd->fact[0] = 1; // curve 0 active zdialog_stuff(zd,"all",1); // stuff default selection, all zdialog_resize(zd,200,200); zdialog_run(zd,brite_ramp_dialog_event,"save"); // run dialog - parallel takeMouse(brite_ramp_mousefunc,dragcursor); // connect mouse return; } // dialog event and completion callback function int brite_ramp_dialog_event(zdialog *zd, ch *event) { using namespace brite_ramp_names; void brite_ramp_mousefunc(); int ii, Fupdate = 0; spldat *sd = EFbrite_ramp.sd; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (strmatch(event,"apply")) Fupdate++; // from script if (strmatch(event,"focus")) takeMouse(brite_ramp_mousefunc,dragcursor); // connect mouse if (strmatch(event,"fullsize")) { // from select area edit_fullsize(); if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } return 1; } if (zd->zstat) { if (zd->zstat == 1) // reset { for (int ii = 0; ii < 4; ii++) { // loop curves 0-3 sd->nap[ii] = 3; // all curves are neutral sd->vert[ii] = 0; sd->fact[ii] = 0; sd->apx[ii][0] = 0.01; sd->apx[ii][1] = 0.50; sd->apx[ii][2] = 0.99; sd->apy[ii][0] = 0.5; sd->apy[ii][1] = 0.5; sd->apy[ii][2] = 0.5; splcurve_generate(sd,ii); sd->fact[ii] = 0; } sd->fact[0] = 1; gtk_widget_queue_draw(sd->drawarea); // draw curve 0 zdialog_stuff(zd,"all",1); zdialog_stuff(zd,"red",0); zdialog_stuff(zd,"green",0); zdialog_stuff(zd,"blue",0); edit_reset(); // restore initial image zd->zstat = 0; return 1; } if (zd->zstat == 2) { // done edit_fullsize(); // get full size image if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } edit_done(0); // commit edit } else edit_cancel(0); // discard edit Ntoplines = 0; Fpaint2(); return 1; } if (zstrstr("all red green blue",event)) // new choice of curve { zdialog_fetch(zd,event,ii); if (! ii) return 0; // button OFF event, wait for ON event for (ii = 0; ii < 4; ii++) sd->fact[ii] = 0; ii = strmatchV(event,"all","red","green","blue",null); ii = ii-1; // new active curve: 0, 1, 2, 3 sd->fact[ii] = 1; splcurve_generate(sd,ii); // regenerate curve gtk_widget_queue_draw(sd->drawarea); // draw curve Fupdate = 1; } if (Fupdate) thread_signal(); // trigger image update return 1; } // brite_ramp mouse function void brite_ramp_mousefunc() { using namespace brite_ramp_names; int mx = 0, my = 0; float d1, d2; if (! (LMclick || RMclick || Mxdrag || Mydrag)) return; // ignore mouse movement if (LMclick || RMclick) { // left or right mouse click mx = Mxclick; my = Myclick; LMclick = RMclick = 0; } if (Mxdrag || Mydrag) { // mouse drag mx = Mxdrag; my = Mydrag; Mxdrag = Mydrag = 0; } if (! Fline && (mx || my)) { Fline = 1; linex1 = mx; // draw arbitrary line to start with liney1 = my; linex2 = mx + 100; liney2 = my + 100; } else // move nearest line end point to mouse { d1 = (linex1 - mx) * (linex1 - mx) + (liney1 - my) * (liney1 - my); d2 = (linex2 - mx) * (linex2 - mx) + (liney2 - my) * (liney2 - my); if (d1 < d2) { linex1 = mx; liney1 = my; } else { linex2 = mx; liney2 = my; } } Ntoplines = 1; // update line data toplines[0].x1 = linex1; toplines[0].y1 = liney1; toplines[0].x2 = linex2; toplines[0].y2 = liney2; toplines[0].type = 3; // black/white dual line thread_signal(); // update image return; } // this function is called when a curve is edited void brite_ramp_curvedit(int spc) { thread_signal(); return; } // brite_ramp thread function void * brite_ramp_thread(void *arg) { using namespace brite_ramp_names; void brite_ramp_equation(); void brite_ramp_rampline(); void * brite_ramp_wthread(void *); ex1 = linex1; // ramp line end points ey1 = liney1; ex2 = linex2; ey2 = liney2; brite_ramp_equation(); // compute line equation brite_ramp_rampline(); // compute new end points do_wthreads(brite_ramp_wthread,NSMP); // worker threads CEF->Fmods++; // image3 modified CEF->Fsaved = 0; Fpaint2(); // update window return 0; } void * brite_ramp_wthread(void *arg) // worker thread function { using namespace brite_ramp_names; void brite_ramp_posn(int px, int py, float &rx, float &ry); int index = *((int *) arg); int ii, dist = 0, px3, py3; float x3, y3; float d1, d2, rampval; float *pix1, *pix3; float R1, G1, B1; float R3, G3, B3; float Fall, Fred, Fgreen, Fblue; spldat *sd = EFbrite_ramp.sd; for (py3 = index; py3 < Ehh; py3 += NSMP) // loop output pixels for (px3 = 0; px3 < Eww; px3++) { if (sa_stat == sa_stat_fini) { // select area active ii = py3 * Eww + px3; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } brite_ramp_posn(px3,py3,x3,y3); // nearest point on ramp line d1 = sqrtf((x3-ex1) * (x3-ex1) + (y3-ey1) * (y3-ey1)); // compute ramp value d2 = sqrtf((x3-ex2) * (x3-ex2) + (y3-ey2) * (y3-ey2)); rampval = d1 / (d1 + d2); // 0.0 ... 1.0 ii = 999.0 * rampval; // corresp. curve index 0-999 Fall = sd->yval[0][ii] * 2.0; // curve values 0.0 - 1.0 Fred = sd->yval[1][ii] * 2.0; // (0.5 is neutral value) Fgreen = sd->yval[2][ii] * 2.0; Fblue = sd->yval[3][ii] * 2.0; pix1 = PXMpix(E1pxm,px3,py3); // input pixel R1 = pix1[0]; G1 = pix1[1]; B1 = pix1[2]; R3 = R1 * Fall; // curve "all" adjustment G3 = G1 * Fall; // projected on each RGB color B3 = B1 * Fall; R3 = R3 * Fred; // add additional RGB adjustments G3 = G3 * Fgreen; B3 = B3 * Fblue; RGBfix(R3,G3,B3); pix3 = PXMpix(E3pxm,px3,py3); // output pixel pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; } return 0; } // get equation of ramp line in the form Ax + By + C = 0 // end points are (ex1,ey1) and (ex2,ey2) void brite_ramp_equation() { using namespace brite_ramp_names; if (ex1 != ex2) { A = (ey2 - ey1) / (ex2 - ex1); B = -1; C = ey1 - A * ex1; } else { A = 1; B = 0; C = -ex1; } return; } // compute nearest point on ramp line for given image pixel position void brite_ramp_posn(int px, int py, float &rx, float &ry) { using namespace brite_ramp_names; float F1, F2; F1 = B * px - A * py; F2 = A * A + B * B; rx = (B * F1 - A * C) / F2; ry = (-A * F1 - B * C) / F2; return; } // extend ramp line end points long enough for entire image void brite_ramp_rampline() { using namespace brite_ramp_names; void brite_ramp_posn(int px, int py, float &rx, float &ry); float rx, ry, d1, d2; if (B == 0) { // vertical line ey1 = 0; ey2 = Ehh - 1; return; } if (A == 0) { // horizontal line ex1 = 0; ex2 = Eww - 1; return; } brite_ramp_posn(0,0,rx,ry); if (rx < 0 || ry < 0) { d1 = (rx - ex1) * (rx - ex1) + (ry - ey1) * (ry - ey1); d2 = (rx - ex2) * (rx - ex2) + (ry - ey2) * (ry - ey2); if (d1 < d2) { ex1 = rx; ey1 = ry; } else { ex2 = rx; ey2 = ry; } } brite_ramp_posn(Eww,0,rx,ry); if (rx > Eww || ry < 0) { d1 = (rx - ex1) * (rx - ex1) + (ry - ey1) * (ry - ey1); d2 = (rx - ex2) * (rx - ex2) + (ry - ey2) * (ry - ey2); if (d1 < d2) { ex1 = rx; ey1 = ry; } else { ex2 = rx; ey2 = ry; } } brite_ramp_posn(Eww,Ehh,rx,ry); if (rx > Eww || ry > Ehh) { d1 = (rx - ex1) * (rx - ex1) + (ry - ey1) * (ry - ey1); d2 = (rx - ex2) * (rx - ex2) + (ry - ey2) * (ry - ey2); if (d1 < d2) { ex1 = rx; ey1 = ry; } else { ex2 = rx; ey2 = ry; } } brite_ramp_posn(0,Ehh,rx,ry); if (rx < 0 || ry > Ehh) { d1 = (rx - ex1) * (rx - ex1) + (ry - ey1) * (ry - ey1); d2 = (rx - ex2) * (rx - ex2) + (ry - ey2) * (ry - ey2); if (d1 < d2) { ex1 = rx; ey1 = ry; } else { ex2 = rx; ey2 = ry; } } return; } /************************************************************************************** Vignette function 1. Change the brightness from center to edge using a curve. 2. Change the color from center to edge using a color and a curve. (the pixel varies between original RGB and selected color) 3. Mouse click or drag on image sets a new vignette center. ***************************************************************************************/ void vign_mousefunc(); editfunc EFvignette; uint8 vignette_RGB[3] = { 0, 0, 255 }; int vignette_spc; float vign_cx, vign_cy; float vign_rad; void m_vignette(GtkWidget *, ch *menu) { int Vign_dialog_event(zdialog *zd, ch *event); void Vign_curvedit(int); void * Vign_thread(void *); ch *title = "Vignette"; F1_help_topic = TX("VIGNETTE"); printf("m_vignette \n"); EFvignette.menuname = "Vignette"; EFvignette.Farea = 2; // select area usable EFvignette.FprevReq = 1; // use preview image EFvignette.threadfunc = Vign_thread; // thread function EFvignette.mousefunc = vign_mousefunc; // mouse function if (! edit_setup(EFvignette)) return; // setup edit /*** ___________________________________ | _______________________________ | | | | | | | | | | | curve drawing area | | | | | | | | | | | |_______________________________| | | center edge | | | | (o) Brightness (o) Color [___] | | | | [OK] [X] | |___________________________________| ***/ zdialog *zd = zdialog_new(title,Mwin,"OK","X",null); EFvignette.zd = zd; zdialog_add_widget(zd,"frame","frame","dialog",0,"expand"); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labcenter","hb1",TX("Center"),"space=4"); zdialog_add_widget(zd,"label","space","hb1",0,"expand"); zdialog_add_widget(zd,"label","labedge","hb1",TX("Edge"),"space=5"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=3"); zdialog_add_widget(zd,"radio","RBbrite","hb2",TX("Brightness"),"space=5"); zdialog_add_widget(zd,"radio","RBcolor","hb2",TX("Color"),"space=5"); zdialog_add_widget(zd,"colorbutt","color","hb2","0|0|255"); vignette_RGB[0] = vignette_RGB[1] = 0; // initial color = blue vignette_RGB[2] = 255; vign_cx = Eww / 2; // initial vignette center vign_cy = Ehh / 2; vign_rad = vign_cx * vign_cx + vign_cy * vign_cy; // radius = distance to corners vign_rad = sqrtf(vign_rad); zdialog_stuff(zd,"RBbrite",1); // default curve = brightness GtkWidget *frame = zdialog_gtkwidget(zd,"frame"); // set up curve edit spldat *sd = splcurve_init(frame,Vign_curvedit); EFvignette.sd = sd; sd->Nspc = 2; // 2 curves sd->vert[0] = 0; // curve 0 = brightness curve sd->nap[0] = 2; sd->apx[0][0] = 0.01; sd->apy[0][0] = 0.5; sd->apx[0][1] = 0.99; sd->apy[0][1] = 0.5; splcurve_generate(sd,0); sd->vert[1] = 0; // curve 1 = color curve sd->nap[1] = 2; sd->apx[1][0] = 0.01; sd->apy[1][0] = 0.01; sd->apx[1][1] = 0.99; sd->apy[1][1] = 0.01; splcurve_generate(sd,1); vignette_spc = 0; // initial curve = brightness sd->fact[0] = 1; sd->fact[1] = 0; zdialog_run(zd,Vign_dialog_event,"save"); // run dialog - parallel takeMouse(vign_mousefunc,dragcursor); // connect mouse function return; } // dialog event and completion callback function int Vign_dialog_event(zdialog *zd, ch *event) { void Vign_curvedit(int); spldat *sd = EFvignette.sd; int ii; ch color[20]; ch *ppc; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (strmatch(event,"fullsize")) { // from select area edit_fullsize(); if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } return 1; } if (zd->zstat) { if (zd->zstat == 1) { // done thread_wait(); // insure thread done float R = 1.0 * E0pxm->ww / Eww; // bugfix vign_cx = R * vign_cx; // scale geometries to full size vign_cy = R * vign_cy; vign_rad = R * vign_rad; edit_fullsize(); // get full size image if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } edit_done(0); // commit edit } else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(vign_mousefunc,dragcursor); // connect mouse function if (strmatchN(event,"RB",2)) { // new choice of curve sd->fact[0] = sd->fact[1] = 0; ii = strmatchV(event,"RBbrite","RBcolor",null); vignette_spc = ii = ii - 1; sd->fact[ii] = 1; // active curve splcurve_generate(sd,ii); // regenerate curve gtk_widget_queue_draw(sd->drawarea); // draw curve thread_signal(); } if (strmatch(event,"color")) { // change color zdialog_fetch(zd,"color",color,19); // get color from color wheel ppc = substring(color,"|",1); if (ppc) vignette_RGB[0] = atoi(ppc); ppc = substring(color,"|",2); if (ppc) vignette_RGB[1] = atoi(ppc); ppc = substring(color,"|",3); if (ppc) vignette_RGB[2] = atoi(ppc); thread_signal(); // trigger update thread } return 1; } // get mouse position and set new center for vignette void vign_mousefunc() // mouse function { if (! LMclick && ! Mdrag) return; LMclick = 0; vign_cx = Mxposn; // new vignette center = mouse position vign_cy = Myposn; Mxdrag = Mydrag = 0; thread_signal(); // trigger image update return; } // this function is called when the curve is edited void Vign_curvedit(int) { thread_signal(); // update image return; } // thread function void * Vign_thread(void *) { void * Vign_wthread(void *arg); do_wthreads(Vign_wthread,NSMP); // worker threads CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); return 0; } // working thread void * Vign_wthread(void *arg) { float *pix1, *pix3; int index, ii, kk, px, py, dist = 0; float cx, cy, rad, radx, rady, f1, f2, xval, yval; float R1, G1, B1, R3, G3, B3; spldat *sd = EFvignette.sd; cx = vign_cx; // vignette center (mouse) cy = vign_cy; index = *((int *) arg); for (py = index; py < Ehh; py += NSMP) // loop all image pixels for (px = 0; px < Eww; px++) { ii = py * Eww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel is outside area } pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; // input RGB G1 = pix1[1]; B1 = pix1[2]; radx = px - cx; // distance from vignette center rady = py - cy; rad = sqrtf(radx*radx + rady*rady); // (px,py) distance from center xval = rad / vign_rad; // scale 0 to 1.0 kk = 999.0 * xval; // scale 0 to 999 if (kk > 999) kk = 999; // beyond radius yval = sd->yval[0][kk]; // brightness curve y-value 0 to 1.0 if (yval > 1.0) yval = 1.0; yval = 2.0 * yval; // 0 to 2.0 R3 = yval * R1; // adjust brightness G3 = yval * G1; B3 = yval * B1; yval = sd->yval[1][kk]; // color curve y-value 0 to 1.0 if (yval > 1.0) yval = 1.0; f1 = yval; // 0 to 1.0 new color f2 = 1.0 - f1; // 1.0 to 0 old color R3 = f1 * vignette_RGB[0] + f2 * R3; // mix input and vignette color G3 = f1 * vignette_RGB[1] + f2 * G3; B3 = f1 * vignette_RGB[2] + f2 * B3; RGBfix(R3,G3,B3); pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; } return 0; } fotocx/f.edit.cc0000664000175000017500000141037015247006660012516 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit - Edit menu functions get_edit_pixels get pixels from image, area, mouse m_rotate rotate or level an image m_upright upright a rotated image m_mirror make horizontal or vertical mirror image m_crop crop image margins m_retouch brightness, contrast, color ... blackbodyRGB convert deg. K to RGB factors m_rescale rescale image m_split_screen view before/after image using split-screen m_show_diffs highlight differences between two images m_margins add margins around image m_markup draw on image image: text, line, box, oval m_draw_text draw text on image m_draw_line draw line/arrow on image m_draw_box draw box on image m_draw_oval draw oval on image m_color_mode convert: B&W, color, sepia, positive, negative m_paint_edits set up edit via mouse painting m_paint_image paint on the image with a color RGB_chooser select RGB color or use color chooser file HSL_chooser select HSL color HSLtoRGB convert HSL color to RGB RGBtoHSL convert RGB color to HSL m_paint_transparency paint more or less transparency on an image m_area_fill fill selected areas or transparent areas m_copy_in_image copy pixels within one image m_copy_from_image copy pixels from source image to target image m_copy_prior_edit copy pixels from prior edits in current image ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) using namespace zfuncs; /************************************************************************************** get_edit_pixels() function Feed pixels to edit function, one at a time modes of operation: Fpaintedits = 0, sa_stat != sa_stat_fini return all pixels with blend = 1 sa_stat == sa_stat_fini return all pixels within selected area Fpaintedits = 1 return all pixela within mouse radius Mradius blend calculation for pixel at Pradius from mouse position: blend = MCpower + (MEpower - MCpower) * Pradius / Mradius where MCpower/MEpower is edit power at center/edge of mouse circle and Pradius/Mradius = pixel/circle radius initial call: get_edit_pixels_init(Nthreads,margin) subsequent calls (pixel processing loop) stat = get_edit_pixels(int thread, int &px, int &py, float &blend) stat = 0 next pixel is returned 1 finished, no more pixels ****/ namespace get_edit_pixels_names { int Nt; int FTF[XSMP]; int pxlo, pxhi, pylo, pyhi; float Cpow, Epow; } // initialization for returning pixels to the edit threads void get_edit_pixels_init(int Nthreads, int margin) { using namespace get_edit_pixels_names; int cc; if (! CEF) zappcrash("no edit function active"); if (! E3pxm) zappcrash("no E3pxm"); cc = NSMP * sizeof(int); // set first time flags for all threads memset(FTF,1,cc); if (! Nthreads) return; // re-initz. same area Nt = Nthreads; // edit thread count if (Fpaintedits) // paint_edit() is active, { // process pixels in mouse circle Cpow = 0.01 * MCpower; Epow = 0.01 * MEpower; pxlo = Mxposn - Mradius; if (pxlo < 0) pxlo = 0; pxlo += margin; pxhi = Mxposn + Mradius; if (pxhi > Eww) pxhi = Eww; pxhi -= margin; pylo = Myposn - Mradius; if (pylo < 0) pylo = 0; pylo += margin; pyhi = Myposn + Mradius; if (pyhi > Ehh) pyhi = Ehh; pyhi -= margin; return; } if (sa_stat == sa_stat_fini) // select area is valid and enabled, { // process pixels within area pxlo = sa_minx + margin; pxhi = sa_maxx - margin; pylo = sa_miny + margin; pyhi = sa_maxy - margin; return; } pxlo = pylo = margin; // process entire image pxhi = Eww - margin; pyhi = Ehh - margin; editpixels_pxlo = pxlo; // initz. externals editpixels_pxhi = pxhi; editpixels_pylo = pylo; editpixels_pyhi = pyhi; return; } // return next pixel for edit mode: full image, area, mouse paint int get_edit_pixels(int thread, int &px, int &py, float &blend) { using namespace get_edit_pixels_names; int ii, dist; float Pradius; if (Fpaintedits) // edit within mouse circle { if (FTF[thread]) { FTF[thread] = 0; px = pxlo; // initial px/py py = pylo + thread; if (py >= pyhi) return 1; // fini } while (true) { px++; // next px/py if (px >= pxhi) { px = pxlo; py += Nt; if (py >= pyhi) return 1; // end return } if (sa_stat == sa_stat_fini) { // select area active ii = Eww * py + px; dist = sa_pixmap[ii]; if (! dist) continue; // ignore pixels outside area } Pradius = (px - Mxposn) * (px - Mxposn); // get (px,py) discance from mouse center Pradius += (py - Myposn) * (py - Myposn); Pradius = sqrtf(Pradius); if (Pradius < Mradius) break; // pixel within mouse radius, keep } blend = Cpow + (Epow - Cpow) * Pradius / Mradius; // Cpow to Epow for center to edge pixel blend = blend * blend; // quadratic scale if (Mbutton > 2) blend = -blend; // left/right button == paint/erase edit return 0; } if (sa_stat == sa_stat_fini) // edit within select area { if (FTF[thread]) { FTF[thread] = 0; px = pxlo; // initial px/py py = pylo + thread; if (py >= pyhi) return 1; // fini } while (true) { px++; // next px/py if (px >= pxhi) { px = pxlo; py += Nt; if (py >= pyhi) return 1; // fini } ii = Eww * py + px; // blend = 0/1 for pixel out/in area dist = sa_pixmap[ii]; if (! dist) continue; // ignore pixels outside area blend = 1; return 0; } } blend = 1; // full image edit if (FTF[thread]) { FTF[thread] = 0; px = pxlo; // initial px/py py = pylo + thread; if (py < pyhi) return 0; return 1; // fini } px++; // next px/py if (px < pxhi) return 0; px = pxlo; py += Nt; if (py < pyhi) return 0; return 1; // fini } /**************************************************************************************/ // rotate or level an image namespace rotate_names { editfunc EFrotateimage; zdialog *zd; double rotate_goal, rotate_angle; // target and actual rotation int Ftimer1; double Ftimer2; int rotate_watchdog(void *); int dialog_event(zdialog *zd, ch *event); void mousefunc(); void KBfunc(int key); void rotate_final(); void rotate_func(int fast); void drawlines(cairo_t *cr); } // menu function void m_rotate(GtkWidget *, ch *menu) // 26.5 { using namespace rotate_names; ch *rotate_message = TX("Drag on image to level image.\n" "Click on image for level lines."); F1_help_topic = TX("ROTATE"); printf("m_rotate \n"); EFrotateimage.menufunc = m_rotate; // menu function EFrotateimage.menuname = "Rotate"; EFrotateimage.mousefunc = mousefunc; // preview mode removed EFrotateimage.FprevReq = 1; // use preview (small) size if (! edit_setup(EFrotateimage)) return; // setup edit PXM_addalpha(E0pxm); PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); rotate_goal = rotate_angle = 0; // initially no rotation /*** ______________________________________ | | | Drag on image to level image. | | Click on image for level lines. | | | | Rotate: [-90°] [+90°] [180°] [ 0 ] | | [Auto Level] | | | | [Crop] [OK] [X] | |______________________________________| ***/ zd = zdialog_new(TX("Rotate Image"),Mwin,TX("Crop"),"OK","X",null); EFrotateimage.zd = zd; zdialog_add_widget(zd,"label","labrotate","dialog",rotate_message,"space=3"); zdialog_add_widget(zd,"hbox","hbrot","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labrotate","hbrot",TX("Rotate:"),"space=5"); zdialog_add_widget(zd,"imagebutt","-90","hbrot","rotate-left.png","size=32|space=5"); zdialog_add_widget(zd,"imagebutt","+90","hbrot","rotate-right.png","size=32|space=5"); zdialog_add_widget(zd,"button","180","hbrot","180","space=5"); zdialog_add_widget(zd,"zspin","degrees","hbrot","-180|180|0.1|0","space=5"); zdialog_add_widget(zd,"hbox","hbauto","dialog",0,"space=3"); zdialog_add_widget(zd,"button","level","hbauto",TX("Auto Level"),"space=10"); zdialog_add_ttip(zd,"level",TX("level based on EXIF roll angle")); takeMouse(mousefunc,dragcursor); // connect mouse function Fzoom = 0; zdialog_run(zd,dialog_event,"save"); // run dialog - parallel g_timeout_add(100,rotate_watchdog,0); // start rotate watchdog Ftimer1 = 1; // rotate() active Ftimer2 = 0; // rotate fix pending return; } // watchdog watchdog function - watch for fast low-quality rotates // and fix them when rotation has apparently ended. int rotate_names::rotate_watchdog(void *) { if (! Ftimer1) return 0; // trim_rotate() ended if (! Ftimer2) return 1; // nothing pending if (get_seconds() - Ftimer2 < 1.0) return 1; // < 1 sec. since last rotate Ftimer2 = 0; // reset pending flag rotate_angle = 0; rotate_func(0); // high quality rotate return 1; } // dialog event and completion callback function int rotate_names::dialog_event(zdialog *zd, ch *event) { using namespace rotate_names; int Fcrop = 0; double fangle; ch *metatag[1]; ch *ppv[1]; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (strmatch(event,"undo")) // 'undo' button was used { Ftimer1 = Ftimer2 = 0; // stop watchdog timer Ntoplines = 0; // remove leveling lines edit_reset(); zdialog_stuff(zd,"degrees",0); rotate_goal = rotate_angle = 0; return 1; } if (strmatch(event,"focus")) { takeMouse(mousefunc,dragcursor); // re-connect mouse function return 1; } if (zd->zstat) // dialog complete { Ftimer1 = Ftimer2 = 0; // stop watchdog timer Ntoplines = 0; // remove leveling lines if (zd->zstat == 1 || zd->zstat == 2) // [crop] or [OK] { if (zd->zstat == 1) Fcrop = 1; // remember if crop if (! CEF->Fmods) { // nothing was done 26.5 edit_cancel(0); if (Fcrop) m_crop(0,0); // [crop] was pressed return 1; } edit_fullsize(); // get full size image rotate_angle = 0; // reset to no rotation rotate_func(0); // final rotate, high quality fangle = fabs(rotate_angle); if (! fangle && fangle != 90 && fangle != 180) { // small auto sharpen if not 0/90/180 26.5 sharp_AC(30,20); printf("small auto sharpen done \n"); } Fupright = Flevel = 1; // mark uprighted (for metadata update) edit_addhist("angle:%.1f",rotate_angle); // edit parms > edit hist edit_done(0); if (Fcrop) m_crop(0,"auto"); // [crop] was pressed return 1; } edit_cancel(0); // cancel return 1; } if (zstrstr("+90 -90 180",event)) // [-90] [+90] [180] button { if (strmatch(event,"+90")) // 90 deg. CW rotate_goal += 90; if (strmatch(event,"-90")) // 90 deg. CCW rotate_goal -= 90; if (strmatch(event,"180")) rotate_goal += 180; if (rotate_goal > 180) rotate_goal -= 360; // keep within -180 to +180 deg. if (rotate_goal < -180) rotate_goal += 360; if (fabs(rotate_goal) < 0.01) rotate_goal = 0; // = 0 within my precision zdialog_stuff(zd,"degrees",rotate_goal); rotate_func(0); // high quality rotate } if (strmatch(event,"degrees")) // manual input degrees { zdialog_fetch(zd,"degrees",rotate_goal); if (rotate_goal > 180) rotate_goal -= 360; // keep within -180 to +180 deg. if (rotate_goal < -180) rotate_goal += 360; if (fabs(rotate_goal) < 0.01) rotate_goal = 0; // = 0 within my precision zdialog_stuff(zd,"degrees",rotate_goal); rotate_func(1); // fast low quality rotate } if (strmatch(event,"level")) // auto level using EXIF RollAngle { metatag[0] = (ch *) meta_rollangle_tag; meta_get(curr_file,metatag,ppv,1); if (! ppv[0]) { zmessageACK(Mwin,TX("no metadata level data")); return 1; } rotate_goal = atofz(ppv[0]); zfree(ppv[0]); rotate_func(0); // high quality rotate } return 1; } // rotate image mouse function void rotate_names::mousefunc() { using namespace rotate_names; int mpx, mpy, xdrag, ydrag; int cx; zdialog *zd = EFrotateimage.zd; mpx = mpy = xdrag = ydrag = 0; // avoid gcc warnings if (LMclick) // add vertical and horizontal { // lines at click position LMclick = 0; Ntoplines = 2; toplines[0].x1 = Mxclick; toplines[0].y1 = 0; toplines[0].x2 = Mxclick; toplines[0].y2 = Ehh-1; toplines[0].type = 3; // black/white pair toplines[1].x1 = 0; toplines[1].y1 = Myclick; toplines[1].x2 = Eww-1; toplines[1].y2 = Myclick; toplines[1].type = 3; Fpaint2(); return; } if (RMclick) // remove the lines { RMclick = 0; Ntoplines = 0; Fpaint2(); return; } if (Mxdrag || Mydrag) // drag underway { mpx = Mxdrag; mpy = Mydrag; xdrag = Mxdrag - Mxdown; ydrag = Mydrag - Mydown; Mxdown = Mxdrag; // reset drag origin Mydown = Mydrag; Mxdrag = Mydrag = 0; } cx = Eww / 2; // image center if (mpx > cx) rotate_goal += 30.0 * ydrag / Eww; else rotate_goal -= 30.0 * ydrag / Eww; if (rotate_goal > 180) rotate_goal -= 360; // keep within -180 to +180 deg. if (rotate_goal < -180) rotate_goal += 360; if (fabs(rotate_goal) < 0.01) rotate_goal = 0; // = 0 within my precision zdialog_stuff(zd,"degrees",rotate_goal); // update dialog rotate_func(1); // fast low quality rotate return; } // rotate function // E3 = E1 with rotation // fast: 0 = slow / high quality // 1 = fast / low quality void rotate_names::rotate_func(int fast) { using namespace rotate_names; zdialog *zd = EFrotateimage.zd; static int fbusy = 0; if (rotate_goal == rotate_angle) return; if (fbusy) return; // stop re-entry (mouse event) fbusy = 1; if (fabs(rotate_goal) < 0.01) { // insignificant rotation zdialog_stuff(zd,"degrees",0.0); PXM_free(E3pxm); // E1 >> E3 E3pxm = PXM_copy(E1pxm); rotate_goal = 0.0; } else { PXM_free(E3pxm); E3pxm = PXM_rotate(E1pxm,rotate_goal,fast); // rotate (fast or high quality) if (! E3pxm) return; // 26.3 } Eww = E3pxm->ww; Ehh = E3pxm->hh; rotate_angle = rotate_goal; if (fast) Ftimer2 = get_seconds(); // flag watchdog timer to come back else Ftimer2 = 0; CEF->Fmods++; Fpaintnow(); fbusy = 0; return; } /**************************************************************************************/ // upright an image made with camera turned 90 degrees namespace upright_names { editfunc EFuprightimage; int dialog_event(zdialog *zd, ch *event); } // menu function void m_upright(GtkWidget *, ch *menu) // 26.5 { using namespace upright_names; zdialog *zd; F1_help_topic = TX("UPRIGHT"); printf("m_upright \n"); EFuprightimage.menufunc = m_upright; // menu function EFuprightimage.menuname = "upright"; if (! edit_setup(EFuprightimage)) return; // setup edit /*** ______________________________________ | | | [Upright] upright the image | | Mirror: [] horizontal [] vertical | | | | [Crop] [OK] [X] | |______________________________________| ***/ zd = zdialog_new(TX("Upright Image"),Mwin,TX("Crop"),"OK","X",null); EFuprightimage.zd = zd; zdialog_add_widget(zd,"hbox","hbup","dialog",0,"space=3"); zdialog_add_widget(zd,"button","upright","hbup",TX("Upright"),"space=8"); zdialog_add_widget(zd,"label","labup","hbup","upright the image"); zdialog_add_widget(zd,"hbox","hbmir","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labmir","hbmir",TX("Mirror:"),"space=5"); zdialog_add_widget(zd,"zbutton","horz","hbmir",TX("horizontal"),"space=5"); zdialog_add_widget(zd,"zbutton","vert","hbmir",TX("vertical"),"space=5"); zdialog_run(zd,dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int upright_names::dialog_event(zdialog *zd, ch *event) { using namespace upright_names; int angle = 0, Fcrop = 0; int mirror = 0; ch *metatag[1]; ch *ppv[1]; PXM *E2pxm; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (strmatch(event,"undo")) // 'undo' button was used { edit_reset(); return 1; } if (zd->zstat) // dialog complete { if (zd->zstat == 1 || zd->zstat == 2) // [crop] or [OK] { if (zd->zstat == 1) Fcrop = 1; // remember if crop if (! CEF->Fmods) { // nothing was done 26.5 edit_cancel(0); if (Fcrop) m_crop(0,0); // [crop] was pressed return 1; } Fupright = Flevel = 1; // mark uprighted (for metadata update) edit_addhist("upright"); // add edit history edit_done(0); if (Fcrop) m_crop(0,"auto"); // [crop] was pressed return 1; } edit_cancel(0); // cancel return 1; } if (strmatch(event,"upright")) // auto upright button { metatag[0] = (ch *) meta_orientation_tag; meta_get(curr_file,metatag,ppv,1); // get metadata Orientation if (! ppv[0] || *ppv[0] <= '1') { zmessageACK(Mwin,TX("no EXIF orientation data")); return 1; } if (*ppv[0] == '2') { angle = 0; mirror = 1; } // horizontal mirror if (*ppv[0] == '3') { angle = 180; mirror = 0; } // rotate 180 if (*ppv[0] == '4') { angle = 0; mirror = 2; } // vertical mirror if (*ppv[0] == '5') { angle = 90; mirror = 1; } // rotate 90 + horizontal mirror if (*ppv[0] == '6') { angle = 90; mirror = 0; } // rotate 90 if (*ppv[0] == '7') { angle = 270; mirror = 1; } // rotate 270 + horizontal mirror if (*ppv[0] == '8') { angle = 270; mirror = 0; } // rotate 270 zfree(ppv[0]); E2pxm = PXM_copy(E3pxm); PXM_free(E3pxm); E3pxm = PXM_upright(E2pxm,angle,mirror); // do rotate and mirror PXM_free(E2pxm); Eww = E3pxm->ww; Ehh = E3pxm->hh; CEF->Fmods++; Fpaintnow(); } if (strstr("horz vert",event)) // horizontal or vertical mirror { if (strmatch(event,"horz")) mirror = 1; if (strmatch(event,"vert")) mirror = 2; E2pxm = PXM_copy(E3pxm); PXM_free(E3pxm); E3pxm = PXM_upright(E2pxm,0,mirror); // mirror image PXM_free(E2pxm); Eww = E3pxm->ww; Ehh = E3pxm->hh; CEF->Fmods++; Fpaintnow(); } return 1; } /**************************************************************************************/ // crop an image (trim margins) // // fotocx.h // fotocx.h definitions // int cropx1, cropy1, cropx2, cropy2; // crop rectangle // ch *cropsizes[*]; // crop size buttons, "2000x1000" etc. // ch *cropratios[*]; // crop ratio buttons, "2:1" etc. namespace crop_names { editfunc EFcrop; zdialog *zd; int pcropx1, pcropy1, pcropx2, pcropy2; // prior crop rectangle int cropww, crophh; // crop rectangle width and height int Rlock; // lock width/height ratio int E0ww, E0hh; // full size image int Fcorner, Fside, Fcenter; int KBcorner, KBside; double cropR; // crop ratio, width/height double Zratio; // full / preview size >= 1.0 int dialog_event(zdialog *zd, ch *event); void prevcrop_menu_event(GtkWidget *, ch *menu); void update_prev_cropsize(); void mousefunc(); void KBfunc(int key); void crop_limits(); void crop_darkmargins(); void crop_final(); void drawlines(cairo_t *cr); void autocrop_max(); void crop_customize(); } // menu function void m_crop(GtkWidget *, ch *menu) // more accurate control of crop size { using namespace crop_names; int ii, xmargin, ymargin; ch *crop_message = TX("Drag margin box middle or edges"); ch text[20]; F1_help_topic = TX("CROP"); printf("m_crop \n"); EFcrop.menufunc = m_crop; // menu function EFcrop.menuname = "Crop"; EFcrop.mousefunc = mousefunc; EFcrop.FprevReq = 1; // use preview (small) size if (! edit_setup(EFcrop)) return; // setup edit PXM_addalpha(E0pxm); PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); E0ww = E0pxm->ww; // full-size image dimensions E0hh = E0pxm->hh; // (preview size = Eww/Ehh) Zratio = 1.0 * (E0ww + E0hh) / (Eww + Ehh); // full / preview size >= 1.0 if (E9pxm) PXM_free(E9pxm); // E9 invalid E9pxm = 0; cropww = 0.8 * E0ww; // initial crop rectangle, 80% image size crophh = 0.8 * E0hh; xmargin = 0.5 * (E0ww - cropww); // set balanced margins ymargin = 0.5 * (E0hh - crophh); cropx1 = xmargin; cropx2 = E0ww - xmargin; cropy1 = ymargin; cropy2 = E0hh - ymargin; cropR = 1.0 * cropww / crophh; // crop ratio = width/height pcropx1 = 0; // set prior crop rectangle pcropy1 = 0; // = 100% of image pcropx2 = E0ww; pcropy2 = E0hh; Rlock = 0; /*** ____________________________________________ | | | Drag margin box middle or edges | | | | Auto crop: [Max] [Prev] | | Set Width: [____] Height: [____] | | W/H Ratio: 1.778 [x] Lock | | Set Ratio: [5:4] [4:3] [8:5] [16:9] [2:1] | | [Invert] [Customize] | | | | [Rotate] [OK] [X] | |____________________________________________| ***/ zd = zdialog_new(TX("Crop Image"),Mwin,TX("Rotate"),"OK","X",null); EFcrop.zd = zd; zdialog_add_widget(zd,"label","labcrop","dialog",crop_message,"space=5"); zdialog_add_widget(zd,"hbox","hbcrop","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labauto","hbcrop",TX("Auto crop:"),"space=5"); zdialog_add_widget(zd,"button","max","hbcrop",TX("Max"),"space=8"); zdialog_add_widget(zd,"button","prev","hbcrop",TX("Prev"),"space=8"); zdialog_add_widget(zd,"hbox","hbwh","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labW","hbwh",TX("Set Width:"),"space=5"); zdialog_add_widget(zd,"zspin","width","hbwh","20|30000|1|1000"); // fotocx.h limits zdialog_add_widget(zd,"label","space","hbwh",0,"space=5"); zdialog_add_widget(zd,"label","labH","hbwh",TX("Height:"),"space=5"); zdialog_add_widget(zd,"zspin","height","hbwh","20|30000|1|600"); zdialog_add_widget(zd,"hbox","hbrat","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labR","hbrat",TX("W/H Ratio:"),"space=5"); zdialog_add_widget(zd,"label","cropR","hbrat","1.667"); zdialog_add_widget(zd,"check","Rlock","hbrat","Lock","space=15"); zdialog_add_widget(zd,"hbox","hbsr1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labsr1","hbsr1",TX("Set Ratio:"),"space=5"); for (ii = 0; ii < cropmem; ii++) zdialog_add_widget(zd,"button",cropratios[ii],"hbsr1",cropratios[ii],"space=5"); zdialog_add_widget(zd,"hbox","hbsr2","dialog",0,"space=3"); zdialog_add_widget(zd,"label","space","hbsr2",0,"space=50"); zdialog_add_widget(zd,"button","invert","hbsr2",TX("Invert"),"space=5"); zdialog_add_widget(zd,"button","custom","hbsr2",TX("Customize"),"space=5"); zdialog_add_ttip(zd,"max",TX("set maximum crop")); zdialog_add_ttip(zd,"prev",TX("use previous input")); zdialog_add_ttip(zd,"Rlock",TX("lock width/height ratio")); zd = EFcrop.zd; zdialog_load_inputs(zd); // restore all prior inputs zdialog_stuff(zd,"width",cropww); // stuff width, height, ratio as zdialog_stuff(zd,"height",crophh); // pre-calculated for this image snprintf(text,20,"%.3f ",cropR); zdialog_stuff(zd,"cropR",text); zdialog_stuff(zd,"Rlock",0); // no lock ratio takeMouse(mousefunc,dragcursor); // connect mouse function Fzoom = 0; crop_darkmargins(); zdialog_run(zd,dialog_event,"save"); // run dialog - parallel if (menu && strmatch(menu,"auto")) // crop after rotate zdialog_send_event(zd,"max"); return; } // dialog event and completion callback function int crop_names::dialog_event(zdialog *zd, ch *event) { using namespace crop_names; static GtkWidget *popmenu = 0; static int flip = 0; int ii, Frotate = 0; int width, height, delta; double r1, r2, Fratio = 0; ch text[20]; ch *pp; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (strmatch(event,"focus")) { takeMouse(mousefunc,dragcursor); // re-connect mouse function return 1; } if (zd->zstat) // dialog complete { if (zd->zstat == 1 || zd->zstat == 2) // [rotate] or [OK] { if (zd->zstat == 1) Frotate = 1; // remember if [rotate] draw_toplines(2,0); // erase crop rectangle erase_topcircles(); // erase center circle edit_fullsize(); // get full size image (Eww/Ehh) Zratio = 1.0; crop_final(); // rotate/crop final image update_prev_cropsize(); // update prev. crop size memory edit_addhist("width:%d height:%d",cropww,crophh); // edit parms > edit hist CEF->Fmods++; // finish edit edit_done(0); if (Frotate) m_rotate(0,0); // start rotate function return 1; } draw_toplines(2,0); // cancel - erase crop rectangle erase_topcircles(); // erase center circle edit_cancel(0); return 1; } zdialog_fetch(zd,"width",width); // full image scale, E0 zdialog_fetch(zd,"height",height); zdialog_fetch(zd,"Rlock",Rlock); // get w/h ratio lock, on/off Fcorner = Fside = KBcorner = KBside = 0; // no mouse or KB action underway if (strmatch(event,"max")) // auto crop, max within margins { zdialog_stuff(zd,"Rlock",0); // set no ratio lock Rlock = 0; autocrop_max(); // do max auto-crop zdialog_stuff(zd,"width",cropww); // update dialog values zdialog_stuff(zd,"height",crophh); cropR = 1.0 * cropww / crophh; // new w/h ratio snprintf(text,20,"%.3f ",cropR); zdialog_stuff(zd,"cropR",text); crop_darkmargins(); // show crop area in image return 1; } if (strmatch(event,"prev")) // [Prev] button - get prev. crop size { if (popmenu) gtk_widget_destroy(popmenu); popmenu = create_popmenu(); // make popup menu with crop sizes for (int ii = 0; ii < cropmem; ii++) // depth = fotocx.h 'cropmem' if (cropsizes[ii]) add_popmenu(popmenu,cropsizes[ii],prevcrop_menu_event,0,0); popup_menu(Mwin,popmenu); return 1; } if (zstrstr("width height",event)) // width or height input { if (width < 20) width = 20; if (width > E0ww) width = E0ww; if (height < 20) height = 20; if (height > E0hh) height = E0hh; if (Rlock) // w/h ratio lock { if (strmatch(event,"width")) height = width / cropR + 0.5; if (strmatch(event,"height")) width = height * cropR + 0.5; if (width > E0ww) { width = E0ww; height = width / cropR + 0.5; } if (height > E0hh) { height = E0hh; width = height * cropR + 0.5; } if (width > E0ww) width = E0ww; // rounding could put it over limit if (height > E0hh) height = E0hh; } zdialog_stuff(zd,"width",width); // adjusted for ratio lock zdialog_stuff(zd,"height",height); flip = 1 - flip; // alternates 0, 1, 0, 1 ... delta = width - cropww; // change in width if (delta > 0) { // increased width cropx1 = cropx1 - delta / 2; // left and right sides equally cropx2 = cropx2 + delta / 2; if (delta % 2) { // if increase is odd cropx1 = cropx1 - flip; // add 1 alternatively to each side cropx2 = cropx2 + 1 - flip; } if (cropx1 < 0) { // add balance to upper limit cropx2 = cropx2 - cropx1; cropx1 = 0; } if (cropx2 > E0ww) { // add balance to lower limit cropx1 = cropx1 - cropx2 + E0ww; cropx2 = E0ww; } } if (delta < 0) { // decreased width cropx1 = cropx1 - delta / 2; cropx2 = cropx2 + delta / 2; if (delta % 2) { cropx1 = cropx1 + flip; cropx2 = cropx2 - 1 + flip; } } if (cropx1 < 0) cropx1 = 0; // keep within limits if (cropx2 > E0ww) cropx2 = E0ww; // use ww not ww-1 cropww = cropx2 - cropx1; delta = height - crophh; // change in height if (delta > 0) { // increased height cropy1 = cropy1 - delta / 2; // top and bottom sides equally cropy2 = cropy2 + delta / 2; if (delta % 2) { // if increase is odd cropy1 = cropy1 - flip; // add 1 alternatively to each side cropy2 = cropy2 + 1 - flip; } if (cropy1 < 0) { cropy2 = cropy2 - cropy1; cropy1 = 0; } if (cropy2 > E0hh) { cropy1 = cropy1 - cropy2 + E0hh; cropy2 = E0hh; } } if (delta < 0) { // decreased height cropy1 = cropy1 - delta / 2; cropy2 = cropy2 + delta / 2; if (delta % 2) { cropy1 = cropy1 + flip; cropy2 = cropy2 - 1 + flip; } } if (cropy1 < 0) cropy1 = 0; // keep within limits if (cropy2 > E0hh) cropy2 = E0hh; // use hh not hh-1 crophh = cropy2 - cropy1; if (! Rlock) { cropR = 1.0 * width / height; // new w/h ratio snprintf(text,20,"%.3f ",cropR); zdialog_stuff(zd,"cropR",text); } crop_darkmargins(); // show crop area in image return 1; } if (! Rlock) cropR = 1.0 * width / height; snprintf(text,20,"%.3f ",cropR); // update crop ratio zdialog_stuff(zd,"cropR",text); for (ii = 0; ii < cropmem; ii++) // crop ratio button pressed? if (strmatch(event,cropratios[ii])) break; if (ii < cropmem) { r1 = r2 = Fratio = 0; // yes, get crop ratio pp = substring(cropratios[ii],':',1); if (pp) r1 = atofz(pp); pp = substring(cropratios[ii],':',2); if (pp) r2 = atofz(pp); if (r1 > 0 && r2 > 0) Fratio = r1/r2; if (Fratio < 0.1 || Fratio > 10) Fratio = 1.0; // reject extreme ratio else { zdialog_stuff(zd,"Rlock",1); // assume ratio lock is wanted Rlock = 1; } } if (strmatch(event,"invert")) // [invert] ratio button Fratio = 1.0 * crophh / cropww; if (Fratio) // w/h ratio was changed { cropR = Fratio; if (cropx2 - cropx1 > cropy2 - cropy1) // adjust smaller dimension cropy2 = cropy1 + (cropx2 - cropx1) / cropR + 0.5; // round else cropx2 = cropx1 + (cropy2 - cropy1) * cropR + 0.5; if (cropx2 > E0ww) { // if off the right edge, cropx2 = E0ww; // adjust height cropy2 = cropy1 + (cropx2 - cropx1) / cropR + 0.5; } if (cropy2 > E0hh) { // if off the bottom edge, cropy2 = E0hh; // adjust width cropx2 = cropx1 + (cropy2 - cropy1) * cropR + 0.5; } cropww = cropx2 - cropx1; // new rectangle dimensions crophh = cropy2 - cropy1; if (cropww > crophh) crophh = cropww / cropR + 0.5; else cropww = crophh * cropR + 0.5; zdialog_stuff(zd,"width",cropww); // stuff width, height, ratio zdialog_stuff(zd,"height",crophh); snprintf(text,20,"%.3f ",cropR); zdialog_stuff(zd,"cropR",text); crop_darkmargins(); // update crop area in image return 1; } if (strmatch(event,"custom")) { // [customize] button draw_toplines(2,0); // erase crop rectangle erase_topcircles(); // erase center circle edit_cancel(0); // cancel edit crop_customize(); // customize dialog m_crop(0,0); // restart function return 1; } return 1; } // crop size popup menu event function void crop_names::prevcrop_menu_event(GtkWidget *, ch *menu) { using namespace crop_names; int nn, width, height; zdialog *zd; nn = sscanf(menu,"%dx%d",&width,&height); // chosen crop size, "NNNNxNNNN" if (nn != 2) return; zd = EFcrop.zd; zdialog_stuff(zd,"width",width); // update dialog zdialog_stuff(zd,"height",height); zdialog_send_event(zd,"width"); zdialog_stuff(zd,"Rlock",0); // set no ratio lock Rlock = 0; return; } // update memory of previously used crop sizes, for future use void crop_names::update_prev_cropsize() { using namespace crop_names; int ii, nn = cropmem; // memory depth, fotocx.h 'cropmem' ch mysize[20]; snprintf(mysize,20,"%dx%d",cropww,crophh); // current crop size, "2345x1234" for (ii = 0; ii < nn; ii++) // depth = last cropmem values if (strmatch(cropsizes[ii],mysize)) break; // must match fotocx.h 'cropmem' if (ii < nn) { // found in list zfree(cropsizes[ii]); // remove from list for (ii++; ii < nn; ii++) // move remaining entries up cropsizes[ii-1] = cropsizes[ii]; cropsizes[nn-1] = 0; // last = null } if (cropsizes[nn-1]) zfree(cropsizes[nn-1]); // discard oldest (last) for (ii = nn-1; ii > 0; ii--) // move other entries up cropsizes[ii] = cropsizes[ii-1]; cropsizes[0] = zstrdup(mysize,"crop"); // entry 0 = this size return; } // mouse function - move crop rectangle via mouse drags void crop_names::mousefunc() { using namespace crop_names; int mpx, mpy, xdrag, ydrag; int d1, d2, d3, d4; int dc, ds, dx, dy, dz; int cx, cy, close; float fdc; mpx = mpy = xdrag = ydrag = 0; // avoid gcc warnings if (! LMclick && ! RMclick && ! Mxdrag && ! Mydrag) { // no click or drag underway Fcorner = Fside = Fcenter = 0; return; } if (Mxdrag || Mydrag) // continue drag underway { mpx = Mxdrag; mpy = Mydrag; xdrag = Mxdrag - Mxdown; ydrag = Mydrag - Mydown; Mxdown = Mxdrag; // reset drag origin Mydown = Mydrag; Mxdrag = Mydrag = 0; xdrag = xdrag * Zratio; // scale mouse drag ydrag = ydrag * Zratio; // to full image size } mpx = mpx * Zratio + 0.5; // scale mouse position mpy = mpy * Zratio + 0.5; // to full image size if (Fcorner) // continue drag corner { if (Fcorner == 1) { cropx1 = mpx; cropy1 = mpy; } if (Fcorner == 2) { cropx2 = mpx; cropy1 = mpy; } if (Fcorner == 3) { cropx2 = mpx; cropy2 = mpy; } if (Fcorner == 4) { cropx1 = mpx; cropy2 = mpy; } goto crop_finish; } if (Fside) // continue drag side { if (Fside == 1) cropx1 = mpx; if (Fside == 2) cropy1 = mpy; if (Fside == 3) cropx2 = mpx; if (Fside == 4) cropy2 = mpy; goto crop_finish; } if (Fcenter) // continue drag entire crop rectangle { cropx1 += xdrag; cropx2 += xdrag; cropy1 += ydrag; cropy2 += ydrag; if (cropx1 < 0) cropx1 = 0; if (cropy1 < 0) cropy1 = 0; if (cropx2 > E0ww) cropx2 = E0ww; if (cropy2 > E0hh) cropy2 = E0hh; goto crop_finish; } if (E0ww > E0hh) close = 0.05 * E0ww; // mouse capture threshold else close = 0.05 * E0hh; // = 5% of image size dx = mpx - cropx1; // find closest corner/side to mouse dy = mpy - cropy1; d1 = sqrt(dx*dx + dy*dy); // distance from NW corner dx = mpx - cropx2; dy = mpy - cropy1; d2 = sqrt(dx*dx + dy*dy); // NE dx = mpx - cropx2; dy = mpy - cropy2; d3 = sqrt(dx*dx + dy*dy); // SE dx = mpx - cropx1; dy = mpy - cropy2; d4 = sqrt(dx*dx + dy*dy); // SW Fcorner = 1; // find closest corner to mouse dc = d1; // NW if (d2 < dc) { Fcorner = 2; dc = d2; } // NE if (d3 < dc) { Fcorner = 3; dc = d3; } // SE if (d4 < dc) { Fcorner = 4; dc = d4; } // SW d1 = abs(mpx - cropx1); // distance from left side d2 = abs(mpy - cropy1); // top d3 = abs(mpx - cropx2); // right d4 = abs(mpy - cropy2); // bottom Fside = 1; // find closest side to mouse ds = d1; // left if (d2 < ds) { Fside = 2; ds = d2; } // top if (d3 < ds) { Fside = 3; ds = d3; } // right if (d4 < ds) { Fside = 4; ds = d4; } // bottom cx = (cropx1 + cropx2) * 0.5; // center of crop rectangle cy = (cropy1 + cropy2) * 0.5; dx = mpx - cx; // get mouse distance from dy = mpy - cy; // center of crop rectangle dz = sqrtf(dx * dx + dy * dy); if (dz < dc && dz < ds) { // if center closer, drag center Fcorner = Fside = KBcorner = KBside = 0; if (dz > close) return; // not close enough Fcenter = 1; goto crop_finish; } Fcenter = 0; // side or corner is closer fdc = (cropx2 - cropx1 + cropy2 - cropy1); // crop rectangle size fdc = 1.0 * dc / fdc; // corner distance / rectangle size if (fdc < 0.05) Fside = 0; // if near corner, use corner else Fcorner = 0; // else use closest side if (Fcorner == 1) { cropx1 = mpx; cropy1 = mpy; } // move this corner to mouse if (Fcorner == 2) { cropx2 = mpx; cropy1 = mpy; } if (Fcorner == 3) { cropx2 = mpx; cropy2 = mpy; } if (Fcorner == 4) { cropx1 = mpx; cropy2 = mpy; } if (Fside == 1) cropx1 = mpx; // move this side to mouse if (Fside == 2) cropy1 = mpy; if (Fside == 3) cropx2 = mpx; if (Fside == 4) cropy2 = mpy; KBcorner = Fcorner; // save last corner/side moved KBside = Fside; crop_finish: crop_limits(); // check margin limits and adjust if req. crop_darkmargins(); // show crop area in image return; } // Keyboard function // KB arrow keys tweak the last selected corner or side void crop_names::KBfunc(int key) { using namespace crop_names; int xstep, ystep; xstep = ystep = 0; if (key == GDK_KEY_Left) xstep = -1; if (key == GDK_KEY_Right) xstep = +1; if (key == GDK_KEY_Up) ystep = -1; if (key == GDK_KEY_Down) ystep = +1; if (KBcorner == 1) { // NW cropx1 += xstep; cropy1 += ystep; } if (KBcorner == 2) { // NE cropx2 += xstep; cropy1 += ystep; } if (KBcorner == 3) { // SE cropx2 += xstep; cropy2 += ystep; } if (KBcorner == 4) { // SW cropx1 += xstep; cropy2 += ystep; } if (KBside == 1) cropx1 += xstep; // left if (KBside == 2) cropy1 += ystep; // top if (KBside == 3) cropx2 += xstep; // right if (KBside == 4) cropy2 += ystep; // bottom crop_limits(); // check margin limits and adjust if req. crop_darkmargins(); // show crop area in image return; } // check new margins for sanity and enforce locked aspect ratio void crop_names::crop_limits() { using namespace crop_names; int chop; int ww, hh, ww2, hh2; float drr; ch text[20]; zdialog *zd = EFcrop.zd; if (cropx1 > cropx2-10) cropx1 = cropx2-10; // sanity limits if (cropy1 > cropy2-10) cropy1 = cropy2-10; if (cropx1 < 0) { cropx2 -= cropx1; cropx1 = 0; } if (cropy1 < 0) { cropy2 -= cropy1; cropy1 = 0; } if (cropx2 > E0ww) { cropx1 -= (cropx2 - E0ww); cropx2 = E0ww; } if (cropy2 > E0hh) { cropy1 -= (cropy2 - E0hh); cropy2 = E0hh; } if (Rlock && Fcorner) { // w/h ratio locked if (Fcorner < 3) cropy1 = cropy2 - 1.0 * (cropx2 - cropx1) / cropR + 0.5; // round else cropy2 = cropy1 + 1.0 * (cropx2 - cropx1) / cropR + 0.5; } else if (Rlock) { // default Fside 25.1 ww = cropx2 - cropx1; hh = cropy2 - cropy1; ww2 = ww; hh2 = hh; if (Fside == 1 || Fside == 3) hh2 = ww / cropR + 0.5; else ww2 = hh * cropR + 0.5; ww2 = (ww2 - ww) / 2; hh2 = (hh2 - hh) / 2; cropx1 -= ww2; cropx2 += ww2; cropy1 -= hh2; cropy2 += hh2; } chop = 0; if (cropx1 < 0) { // look for off the edge cropx1 = 0; // after corner move chop = 1; } if (cropx2 > E0ww) { cropx2 = E0ww; chop = 2; } if (cropy1 < 0) { cropy1 = 0; chop = 3; } if (cropy2 > E0hh) { cropy2 = E0hh; chop = 4; } if (Rlock && chop) { // keep ratio if off edge if (chop < 3) cropy2 = cropy1 + 1.0 * (cropx2 - cropx1) / cropR + 0.5; // round else cropx2 = cropx1 + 1.0 * (cropy2 - cropy1) * cropR + 0.5; } if (cropx1 > cropx2-10) cropx1 = cropx2-10; // sanity limits if (cropy1 > cropy2-10) cropy1 = cropy2-10; if (cropx1 < 0) cropx1 = 0; // keep within visible area if (cropx2 > E0ww) cropx2 = E0ww; if (cropy1 < 0) cropy1 = 0; if (cropy2 > E0hh) cropy2 = E0hh; cropww = cropx2 - cropx1; // new rectangle dimensions crophh = cropy2 - cropy1; drr = 1.0 * cropww / crophh; // new w/h ratio if (! Rlock) cropR = drr; zdialog_stuff(zd,"width",cropww); // stuff width, height, ratio zdialog_stuff(zd,"height",crophh); snprintf(text,20,"%.3f ",cropR); zdialog_stuff(zd,"cropR",text); return; } // Darken image pixels outside of current crop margins. // messy logic: update pixmaps only for changed pixels to increase speed void crop_names::crop_darkmargins() { using namespace crop_names; static int fbusy = 0; int zx1, zx2, zy1, zy2; // crop rectangle, reduced image scale int ox1, oy1, ox2, oy2; // outer crop rectangle int nx1, ny1, nx2, ny2; // inner crop rectangle int px, py; float *pix1, *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); if (fbusy++) return; // prevent re-entrance if (cropx1 < 0) cropx1 = 0; // keep within visible area if (cropx2 > E0ww) cropx2 = E0ww; if (cropy1 < 0) cropy1 = 0; if (cropy2 > E0hh) cropy2 = E0hh; if (pcropx1 < cropx1) ox1 = pcropx1; // outer rectangle else ox1 = cropx1; if (pcropx2 > cropx2) ox2 = pcropx2; else ox2 = cropx2; if (pcropy1 < cropy1) oy1 = pcropy1; else oy1 = cropy1; if (pcropy2 > cropy2) oy2 = pcropy2; else oy2 = cropy2; if (pcropx1 > cropx1) nx1 = pcropx1; // inner rectangle else nx1 = cropx1; if (pcropx2 < cropx2) nx2 = pcropx2; else nx2 = cropx2; if (pcropy1 > cropy1) ny1 = pcropy1; else ny1 = cropy1; if (pcropy2 < cropy2) ny2 = pcropy2; else ny2 = cropy2; ox1 /= Zratio; // outer rectangle, reduced image scale oy1 /= Zratio; ox2 /= Zratio; oy2 /= Zratio; nx1 /= Zratio; // inner rectangle ny1 /= Zratio; nx2 /= Zratio; ny2 /= Zratio; ox1 -= 2; // expand outer rectangle oy1 -= 2; ox2 += 2; oy2 += 2; nx1 += 2; // reduce inner rectangle ny1 += 2; nx2 -= 2; ny2 -= 2; if (ox1 < 0) ox1 = 0; if (oy1 < 0) oy1 = 0; if (ox2 > Eww) ox2 = Eww; if (oy2 > Ehh) oy2 = Ehh; if (nx1 < ox1) nx1 = ox1; if (ny1 < oy1) ny1 = oy1; if (nx2 > ox2) nx2 = ox2; if (ny2 > oy2) ny2 = oy2; if (nx2 < nx1) nx2 = nx1; if (ny2 < ny1) ny2 = ny1; if (! E9pxm) E9pxm = PXM_copy(E3pxm); // E9 = original source image (reduced) zx1 = cropx1 / Zratio + 0.5; // crop rectangle for reduced image zy1 = cropy1 / Zratio + 0.5; zx2 = cropx2 / Zratio + 0.5; zy2 = cropy2 / Zratio + 0.5; if (zx2 > Eww) zx2 = Eww; if (zy2 > Ehh) zy2 = Ehh; for (py = oy1; py < ny1; py++) // top band of pixels for (px = ox1; px < ox2; px++) { pix1 = PXMpix(E9pxm,px,py); pix3 = PXMpix(E3pxm,px,py); if (px < zx1 || px >= zx2 || py < zy1 || py >= zy2) { pix3[0] = pix1[0] / 2; // outside crop margins pix3[1] = pix1[1] / 2; // 50% brightness pix3[2] = pix1[2] / 2; } else memcpy(pix3,pix1,pcc); // inside, full brightness } for (py = oy1; py < oy2; py++) // right band for (px = nx2; px < ox2; px++) { pix1 = PXMpix(E9pxm,px,py); pix3 = PXMpix(E3pxm,px,py); if (px < zx1 || px >= zx2 || py < zy1 || py >= zy2) { pix3[0] = pix1[0] / 2; pix3[1] = pix1[1] / 2; pix3[2] = pix1[2] / 2; } else memcpy(pix3,pix1,pcc); } for (py = ny2; py < oy2; py++) // bottom band for (px = ox1; px < ox2; px++) { pix1 = PXMpix(E9pxm,px,py); pix3 = PXMpix(E3pxm,px,py); if (px < zx1 || px >= zx2 || py < zy1 || py >= zy2) { pix3[0] = pix1[0] / 2; pix3[1] = pix1[1] / 2; pix3[2] = pix1[2] / 2; } else memcpy(pix3,pix1,pcc); } for (py = oy1; py < oy2; py++) // left band for (px = ox1; px < nx1; px++) { pix1 = PXMpix(E9pxm,px,py); pix3 = PXMpix(E3pxm,px,py); if (px < zx1 || px >= zx2 || py < zy1 || py >= zy2) { pix3[0] = pix1[0] / 2; pix3[1] = pix1[1] / 2; pix3[2] = pix1[2] / 2; } else memcpy(pix3,pix1,pcc); } cairo_t *cr = draw_context_create(Fgdkwin,draw_context); Fpaint3(ox1,oy1,ox2-ox1,ny1-oy1,cr); // 4 updated rectangles Fpaint3(nx2,oy1,ox2-nx2,oy2-oy1,cr); Fpaint3(ox1,ny2,ox2-ox1,oy2-ny2,cr); Fpaint3(ox1,oy1,nx1-ox1,oy2-oy1,cr); drawlines(cr); // draw crop margin lines draw_context_destroy(draw_context); if (ox1 == 0 || oy1 == 0 || ox2 == Eww || oy2 == Ehh) // insure edges are refreshed Fpaint2(); pcropx1 = cropx1; // prior crop rectangle pcropy1 = cropy1; // = current crop rectangle pcropx2 = cropx2; pcropy2 = cropy2; fbusy = 0; return; } // draw lines on image: crop rectangle, center circle void crop_names::drawlines(cairo_t *cr) { using namespace crop_names; int cx, cy, rad, rad2; int zx1, zx2, zy1, zy2; // crop rectangle, reduced image scale zx1 = cropx1 / Zratio + 0.5; // crop rectangle for reduced image zy1 = cropy1 / Zratio + 0.5; zx2 = cropx2 / Zratio + 0.5; zy2 = cropy2 / Zratio + 0.5; if (zx2 > Eww) zx2 = Eww; if (zy2 > Ehh) zy2 = Ehh; Ntoplines = 4; // outline crop rectangle toplines[0].x1 = zx1; toplines[0].y1 = zy1; toplines[0].x2 = zx2; toplines[0].y2 = zy1; toplines[0].type = 2; // white lines toplines[1].x1 = zx2; toplines[1].y1 = zy1; toplines[1].x2 = zx2; toplines[1].y2 = zy2; toplines[1].type = 2; toplines[2].x1 = zx2; toplines[2].y1 = zy2; toplines[2].x2 = zx1; toplines[2].y2 = zy2; toplines[2].type = 2; toplines[3].x1 = zx1; toplines[3].y1 = zy2; toplines[3].x2 = zx1; toplines[3].y2 = zy1; toplines[3].type = 2; draw_toplines(1,cr); // draw crop rectangle and guidelines erase_topcircles(); // erase center circle rad = 15 / Mscale; // repaint center area rad2 = 2 * rad + 1; cx = (pcropx1 + pcropx2) * 0.5 / Zratio; cy = (pcropy1 + pcropy2) * 0.5 / Zratio; Fpaint3(cx-rad,cy-rad,rad2,rad2,cr); cx = (cropx1 + cropx2) * 0.5 / Zratio; // draw center circle cy = (cropy1 + cropy2) * 0.5 / Zratio; add_topcircle(cx,cy,10); draw_topcircles(cr); return; } // final crop - cut margins off // E3 is the full size input image, maybe rotated // E3 is the output image from user crop rectangle void crop_names::crop_final() { using namespace crop_names; int px1, py1, px2, py2; float *pix3, *pix9; int nc = E3pxm->nc, pcc = nc * sizeof(float); int ww, hh, nn; ww = cropww; // save final width/height in user dialog hh = crophh; if (ww < 2 || hh < 2) return; nn = ww - (cropx2 - cropx1); // adjust crop rectangle to hit cropx1 -= nn/2; // target width and height if (cropx1 < 0) cropx1 = 0; cropx2 = cropx1 + ww; if (cropx2 > Eww) cropx2 = Eww; nn = hh - (cropy2 - cropy1); cropy1 -= nn/2; if (cropy1 < 0) cropy1 = 0; cropy2 = cropy1 + hh; if (cropy2 > Ehh) cropy2 = Ehh; if (E9pxm) PXM_free(E9pxm); E9pxm = PXM_make(ww,hh,nc); // new pixmap with requested size for (py1 = cropy1; py1 < cropy2; py1++) // copy E3 (rotated) to new size for (px1 = cropx1; px1 < cropx2; px1++) { px2 = px1 - cropx1; py2 = py1 - cropy1; pix3 = PXMpix(E3pxm,px1,py1); pix9 = PXMpix(E9pxm,px2,py2); memcpy(pix9,pix3,pcc); } PXM_free(E3pxm); E3pxm = E9pxm; E9pxm = 0; Eww = E3pxm->ww; // update E3 dimensions Ehh = E3pxm->hh; CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); return; } // auto-crop image - set max. crop rectangle to exclude transparent regions void crop_names::autocrop_max() { using namespace crop_names; PXM *pxm = 0; int px1, py1, px2, py2; int qx1, qy1, qx2, qy2; int qx, qy, step1, step2; int area1, area2, Fgrow = 0; float *ppix; if (! E3pxm) return; // no edit image if (! E0pxm) return; pxm = E0pxm; if (pxm->nc < 4) { // no alpha channel cropx1 = 0; cropx2 = pxm->ww; // set max. dimensions cropy1 = 0; cropy2 = pxm->hh; cropww = pxm->ww; crophh = pxm->hh; return; } for (px1 = 0; px1 < pxm->ww; px1++) { // check image edges for transparency ppix = PXMpix(pxm,px1,0); if (ppix[3] < 200) break; ppix = PXMpix(pxm,px1,pxm->hh-1); if (ppix[3] < 200) break; } for (py1 = 0; py1 < pxm->hh; py1++) { ppix = PXMpix(pxm,0,py1); if (ppix[3] < 200) break; ppix = PXMpix(pxm,pxm->ww-1,py1); if (ppix[3] < 200) break; } if (px1 == pxm->ww && py1 == pxm->hh) { // no edge transparencies found cropx1 = 0; cropx2 = pxm->ww; // set max. dimensions cropy1 = 0; cropy2 = pxm->hh; cropww = pxm->ww; crophh = pxm->hh; return; } px1 = 0.4 * pxm->ww; // select small rectangle in the middle py1 = 0.4 * pxm->hh; px2 = 0.6 * pxm->ww; py2 = 0.6 * pxm->hh; step1 = 0.02 * (pxm->ww + pxm->hh); // start with big search steps if (step1 < 2) step1 = 2; step2 = 0.2 * step1; if (step2 < 1) step2 = 1; while (true) { while (true) { Fgrow = 0; area1 = (px2 - px1) * (py2 - py1); // area of current selection rectangle area2 = area1; for (qx1 = px1-step1; qx1 <= px1+step1; qx1 += step2) // loop, vary NW and SE corners +/- for (qy1 = py1-step1; qy1 <= py1+step1; qy1 += step2) for (qx2 = px2-step1; qx2 <= px2+step1; qx2 += step2) for (qy2 = py2-step1; qy2 <= py2+step1; qy2 += step2) { if (qx1 < 0) continue; // check image limits if (qy1 < 0) continue; if (qx1 > 0.5 * pxm->ww) continue; if (qy1 > 0.5 * pxm->hh) continue; if (qx2 > pxm->ww-1) continue; if (qy2 > pxm->hh-1) continue; if (qx2 < 0.5 * pxm->ww) continue; if (qy2 < 0.5 * pxm->hh) continue; ppix = PXMpix(pxm,qx1,qy1); // check 4 corners are not if (ppix[3] < 200) continue; // in transparent zones ppix = PXMpix(pxm,qx2,qy1); if (ppix[3] < 200) continue; ppix = PXMpix(pxm,qx2,qy2); if (ppix[3] < 200) continue; ppix = PXMpix(pxm,qx1,qy2); if (ppix[3] < 200) continue; area2 = (qx2 - qx1) * (qy2 - qy1); // look for larger enclosed area if (area2 <= area1) continue; for (qx = qx1; qx < qx2; qx++) { // check top/bottom sides not intersect ppix = PXMpix(pxm,qx,qy1); // transparent zones if (ppix[3] < 200) break; ppix = PXMpix(pxm,qx,qy2); if (ppix[3] < 200) break; } if (qx < qx2) continue; for (qy = qy1; qy < qy2; qy++) { // also left/right sides ppix = PXMpix(pxm,qx1,qy); if (ppix[3] < 200) break; ppix = PXMpix(pxm,qx2,qy); if (ppix[3] < 200) break; } if (qy < qy2) continue; area1 = area2; Fgrow = 1; // successfully grew the rectangle px1 = qx1; // new bigger rectangle coordinates py1 = qy1; // for the next search iteration px2 = qx2; py2 = qy2; } if (! Fgrow) break; } if (step2 == 1) break; // done step1 = 0.7 * step1; // reduce search step size if (step1 < 2) step1 = 2; step2 = 0.2 * step1; if (step2 < 1) step2 = 1; } cropx1 = px1; // set parameters for crop function cropx2 = px2; cropy1 = py1; cropy2 = py2; cropww = px2 - px1; crophh = py2 - py1; return; } // dialog to set custom crop button names and corresponding ratios void crop_names::crop_customize() { using namespace crop_names; ch text[20], rlab[8]; float r1, r2, ratio = 0; ch *pp; int ii, zstat; /*** ____________________________________________ | Crop Buttons | | | | [ 5:4 ] [ 4:3 ] [ 8:5 ] [ 16:9 ] [ 2:1 ] | | | | [OK] [X] | |____________________________________________| ***/ zdialog *zd = zdialog_new(TX("Crop Buttons"),Mwin,"OK","X",null); zdialog_add_widget(zd,"hbox","hbr","dialog",0,"homog|space=3"); strcpy(rlab,"ratio-0"); for (ii = 0; ii < cropmem; ii++) // add crop ratio buttons to dialog { rlab[6] = '0' + ii; zdialog_add_widget(zd,"zentry",rlab,"hbr",cropratios[ii],"size=4"); } zdialog_set_modal(zd); zdialog_run(zd,0,"mouse"); // run dialog zstat = zdialog_wait(zd); // wait for complete if (zstat == 1) // done { for (ii = 0; ii < cropmem; ii++) // get new ratios { rlab[6] = '0' + ii; zdialog_fetch(zd,rlab,text,12); strTrim2(text); r1 = r2 = ratio = 0; pp = substring(text,':',1); if (! pp) continue; r1 = atofz(pp); pp = substring(text,':',2); if (! pp) continue; r2 = atofz(pp); if (r1 > 0 && r2 > 0) ratio = r1/r2; if (ratio < 0.1 || ratio > 10) continue; zstrcopy(cropratios[ii],text,"crop buttons"); } } zdialog_free(zd); // kill dialog save_params(); // save parameters return; } /**************************************************************************************/ // Retouch // Adjust all aspects of brightness, contrast, color: // Black level, white balance, brightness, contrast, color temperature, color saturation namespace retouch_names { editfunc EFretouch; float blackR, blackG, blackB; // black level RGB values float Rbscale, Gbscale, Bbscale; // scaled RGB factors - black clip float wbalR, wbalG, wbalB; // white balance RGB factors int Fblack; // flag, black level was set int sampWB, sampBL; // sample size, % pixels int spotWB, spotBL; // spot white balance or black level float tempR, tempG, tempB; // illumination temperature RGB factors float combR, combG, combB; // combined RGB factors float brightness; // brightness input, -1 ... +1 float contrast; // contrast input, -1 ... +1 float colorsat; // saturation input, -1 ... +1 int colortemp; // illumination temp. input, 1K ... 8K int Fapply; // flag, apply dialog controls to image float whitebalance[4] = { 1.0, 1.0, 1.0, 5000 }; // white balance RGB factors, deg. K } // menu function void m_retouch(GtkWidget *, ch *menu) { using namespace retouch_names; void retouch_mousefunc(); int retouch_dialog_event(zdialog* zd, ch *event); void retouch_curvedit(int spc); void * retouch_thread(void *); GtkWidget *drawwin_scale; F1_help_topic = TX("RETOUCH"); printf("m_retouch \n"); EFretouch.menuname = "Retouch"; EFretouch.menufunc = m_retouch; EFretouch.FprevReq = 1; // use preview EFretouch.Farea = 2; // select area usable EFretouch.Fpaintedits = 1; // use with paint edits OK EFretouch.Fscript = 1; // scripting supported EFretouch.threadfunc = retouch_thread; EFretouch.mousefunc = retouch_mousefunc; if (! edit_setup(EFretouch)) return; // setup edit /*** ____________________________________________ | Retouch | | ________________________________________ | | | | | // 5 curves are maintained: | | | | // 0: current display curve | | curve edit area | | // 1: curve for overall brightness | | | | // 2, 3, 4: red, green, blue | |________________________________________| | | |________________________________________| | // brightness scale: black to white stripe | (o) all (o) red (o) green (o) blue | // select curve to display | | | [_] Auto black level [__] sample % | // auto black level | [_] Auto white balance [__] sample % | // auto white balance | [x] Click gray spot for white balance | // click gray spot | [x] Click dark spot for black level | // click dark spot | [_] Click for RGB histogram | // show RGB histogram in popup window | | | Brightness =============[]=============== | // brightness | Contrast ===============[]============= | // contrast | Saturation =================[]========== | // saturation B/W ... saturated | Temperature ===============[]============ | // illumination temperature | | | [Reset] [Prev] [OK] [X] | |____________________________________________| ***/ zdialog *zd = zdialog_new(TX("Retouch"),Mwin,"Reset","Prev","OK","X",null); EFretouch.zd = zd; zdialog_add_widget(zd,"frame","frameH","dialog",0,"expand"); // edit-curve zdialog_add_widget(zd,"frame","frameB","dialog"); // black to white brightness scale zdialog_add_widget(zd,"hbox","hbrgb","dialog"); // (o) all (o) red (o) green (o) blue zdialog_add_widget(zd,"radio","all","hbrgb",TX("All"),"space=5"); zdialog_add_widget(zd,"radio","red","hbrgb",TX("Red"),"space=3"); zdialog_add_widget(zd,"radio","green","hbrgb",TX("Green"),"space=3"); zdialog_add_widget(zd,"radio","blue","hbrgb",TX("Blue"),"space=3"); zdialog_add_widget(zd,"hbox","hbabl","dialog"); // black level zdialog_add_widget(zd,"zbutton","autoBL","hbabl",TX("Auto black level"),"space=3"); zdialog_add_widget(zd,"label","space","hbabl",0,"space=5"); zdialog_add_widget(zd,"zspin","sampBL","hbabl","1|50|1|1","space=3|size=3"); zdialog_add_widget(zd,"label","labsamp","hbabl",TX("sample %")); zdialog_add_widget(zd,"hbox","hbawb","dialog"); // white balance zdialog_add_widget(zd,"zbutton","autoWB","hbawb",TX("Auto white balance"),"space=3"); zdialog_add_widget(zd,"label","space","hbawb",0,"space=5"); zdialog_add_widget(zd,"zspin","sampWB","hbawb","1|50|1|1","space=3|size=3"); zdialog_add_widget(zd,"label","labsamp","hbawb",TX("sample %")); zdialog_add_widget(zd,"hbox","hbwb","dialog"); // click gray spot zdialog_add_widget(zd,"check","spotWB","hbwb",TX("Click gray spot for white balance"),"space=3"); zdialog_add_widget(zd,"hbox","hbbl","dialog"); // click dark spot zdialog_add_widget(zd,"check","spotBL","hbbl",TX("Click dark spot for black level"),"space=3"); zdialog_add_widget(zd,"hbox","hbhist","dialog"); // click RGB histogram zdialog_add_widget(zd,"zbutton","hist","hbhist",TX("Click for RGB histogram"),"space=3"); zdialog_add_widget(zd,"hbox","hbcolor","dialog",0,"space=8"); zdialog_add_widget(zd,"label","space","hbcolor",0,"space=1"); zdialog_add_widget(zd,"vbox","vbcolor1","hbcolor",0,"homog"); zdialog_add_widget(zd,"label","space","hbcolor",0,"space=1"); zdialog_add_widget(zd,"vbox","vbcolor2","hbcolor",0,"homog|expand"); zdialog_add_widget(zd,"label","labrite","vbcolor1",TX("Brightness")); zdialog_add_widget(zd,"label","labcont","vbcolor1",TX("Contrast")); zdialog_add_widget(zd,"label","labsat1","vbcolor1",TX("Saturation")); zdialog_add_widget(zd,"label","labtemp1","vbcolor1",TX("Temperature")); zdialog_add_widget(zd,"hscale2","brightness","vbcolor2","-1.0|1.0|0.01|0"); zdialog_add_widget(zd,"hscale2","contrast","vbcolor2","-1.0|1.0|0.01|0"); zdialog_add_widget(zd,"hscale2","colorsat","vbcolor2","-1.0|1.0|0.01|0"); zdialog_add_widget(zd,"hscale2","colortemp","vbcolor2","2000|8000|1|5000"); zdialog_add_ttip(zd,"Prev",TX("use previous input")); GtkWidget *frameH = zdialog_gtkwidget(zd,"frameH"); // setup edit curves spldat *sd = splcurve_init(frameH,retouch_curvedit); EFretouch.sd = sd; sd->Nscale = 1; // horizontal line, neutral value sd->xscale[0][0] = 0.00; sd->yscale[0][0] = 0.50; sd->xscale[1][0] = 1.00; sd->yscale[1][0] = 0.50; for (int ii = 0; ii < 4; ii++) // loop curves 0-3 { sd->nap[ii] = 3; // initial curves are neutral sd->vert[ii] = 0; sd->fact[ii] = 0; sd->apx[ii][0] = 0.01; // horizontal lines sd->apy[ii][0] = 0.50; sd->apx[ii][1] = 0.50; sd->apy[ii][1] = 0.50; // curve 0 = overall brightness sd->apx[ii][2] = 0.99; sd->apy[ii][2] = 0.50; // curve 1/2/3 = R/G/B adjustment splcurve_generate(sd,ii); sd->mod[ii] = 0; // mark curve unmodified } sd->Nspc = 4; // 4 curves sd->fact[0] = 1; // curve 0 active zdialog_stuff(zd,"all",1); // stuff default selection, all GtkWidget *frameB = zdialog_gtkwidget(zd,"frameB"); // setup brightness scale drawing area drawwin_scale = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(frameB),drawwin_scale); gtk_widget_set_size_request(drawwin_scale,100,12); G_SIGNAL(drawwin_scale,"draw",brightness_scale,0); wbalR = wbalG = wbalB = 1.0; // neutral white balance colortemp = 5000; // neutral illumination temp. blackbodyRGB(colortemp,tempR,tempG,tempB); // neutral temp. RGB factors combR = combG = combB = 1.0; // neutral combined RGB factors blackR = blackG = blackB = 0.0; // zero black point Fblack = 0; zdialog_stuff(zd,"spotWB",0); // reset mouse click status zdialog_stuff(zd,"spotBL",0); spotWB = spotBL = 0; brightness = 0; // neutral brightness contrast = 0; // neutral contrast colorsat = 0; // neutral saturation Fapply = 0; zdialog_resize(zd,350,450); zdialog_run(zd,retouch_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int retouch_dialog_event(zdialog *zd, ch *event) { using namespace retouch_names; void retouch_mousefunc(); void retouch_autoWB(); void retouch_autoBL(); spldat *sd = EFretouch.sd; float bright0, dbrite, cont0, dcont; float dx, dy; int ii; Fapply = 0; if (strmatch(event,"done")) zd->zstat = 3; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 4; if (strmatch(event,"apply")) Fapply = 1; // from script if (strmatch(event,"fullsize")) { // from select area etc. edit_fullsize(); // get full size image if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } return 1; } if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active zdialog_stuff(zd,"brightness",0); // neutral brightness zdialog_stuff(zd,"contrast",0); // neutral contrast brightness = contrast = 0; zdialog_stuff(zd,"colorsat",0); // neutral saturation colorsat = 0; for (int ii = 0; ii < 4; ii++) // loop brightness curves 0-3 { sd->nap[ii] = 3; // all curves are neutral sd->vert[ii] = 0; sd->fact[ii] = 0; sd->apx[ii][0] = 0.01; sd->apy[ii][0] = 0.50; sd->apx[ii][1] = 0.50; sd->apy[ii][1] = 0.50; sd->apx[ii][2] = 0.99; sd->apy[ii][2] = 0.50; splcurve_generate(sd,ii); sd->mod[ii] = 0; // mark curve unmodified } sd->fact[0] = 1; // active curve is 'all' gtk_widget_queue_draw(sd->drawarea); // redraw curves zdialog_stuff(zd,"all",1); zdialog_stuff(zd,"red",0); zdialog_stuff(zd,"green",0); zdialog_stuff(zd,"blue",0); zdialog_stuff(zd,"spotWB",0); zdialog_stuff(zd,"spotBL",0); wbalR = wbalG = wbalB = 1.0; // neutral white balance colortemp = 5000; // neutral illumination temp. zdialog_stuff(zd,"colortemp",colortemp); blackbodyRGB(colortemp,tempR,tempG,tempB); // neutral temp. RGB factors combR = combG = combB = 1.0; // neutral combined RGB factors blackR = blackG = blackB = 0.0; // zero black point Fblack = 0; edit_reset(); return 1; } if (zd->zstat == 2) // [prev] restore previous settings { zd->zstat = 0; // keep dialog active zdialog_load_prev_widgets(zd,sd,"retouch"); wbalR = whitebalance[0]; // use previous white balance settings wbalG = whitebalance[1]; wbalB = whitebalance[2]; colortemp = whitebalance[3]; zdialog_stuff(zd,"colortemp",colortemp); Fapply = 1; // trigger apply event } if (zd->zstat == 3) // [OK] { freeMouse(); if (CEF->Fmods) // modifications made { edit_fullsize(); // get full size image thread_signal(); // apply changes zdialog_save_last_widgets(zd,sd,"retouch"); // save settings whitebalance[0] = wbalR; // save settings for next time whitebalance[1] = wbalG; whitebalance[2] = wbalB; whitebalance[3] = colortemp; edit_addhist("br:%.2f con:%.2f sat:%.2f temp:%d", // edit params > edit hist brightness,contrast,colorsat,colortemp); edit_done(0); // complete edit } else edit_cancel(0); // no changes made return 1; } if (zd->zstat < 0 || zd->zstat > 3) { // cancel edit_cancel(0); return 1; } if (strmatch(event,"autoWB")) { // auto white balance zdialog_fetch(zd,"sampWB",sampWB); // % brightest pixels to sample zdialog_stuff(zd,"spotWB",0); zdialog_stuff(zd,"spotBL",0); spotWB = spotBL = 0; retouch_autoWB(); } if (strmatch(event,"autoBL")) { // auto black level zdialog_fetch(zd,"sampBL",sampBL); // % darkest pixels to sample zdialog_stuff(zd,"spotWB",0); zdialog_stuff(zd,"spotBL",0); spotWB = spotBL = 0; retouch_autoBL(); } if (strmatch(event,"spotWB")) { // spot white balance checkbox zdialog_fetch(zd,"spotWB",spotWB); if (spotWB) { zdialog_stuff(zd,"spotBL",0); spotBL = 0; } } if (strmatch(event,"spotBL")) { // spot black level checkbox zdialog_fetch(zd,"spotBL",spotBL); if (spotBL) { zdialog_stuff(zd,"spotWB",0); spotWB = 0; } } if (zstrstr("spotWB spotBL",event)) { // spot white balance or black level if (spotWB || spotBL) // if either is on, takeMouse(retouch_mousefunc,dragcursor); // connect mouse function else freeMouse(); // both off: free mouse return 1; } if (strmatch(event,"hist")) m_RGB_hist(0,0); // popup RGB histogram window if (zstrstr("all red green blue",event)) // new choice of curve { zdialog_fetch(zd,event,ii); if (! ii) return 0; // button OFF event, wait for ON event for (ii = 0; ii < 4; ii++) sd->fact[ii] = 0; ii = strmatchV(event,"all","red","green","blue",null); ii = ii-1; // new active curve: 0, 1, 2, 3 sd->fact[ii] = 1; splcurve_generate(sd,ii); // regenerate curve gtk_widget_queue_draw(sd->drawarea); // draw curve } if (strmatch(event,"brightness")) // brightness slider, 0 ... 1 { bright0 = brightness; zdialog_fetch(zd,"brightness",brightness); dbrite = brightness - bright0; // change in brightness, + - zdialog_stuff(zd,"all",1); // active curve is "all" sd->fact[0] = 1; for (ii = 1; ii < 4; ii++) sd->fact[ii] = 0; for (ii = 0; ii < sd->nap[0]; ii++) // update curve 0 nodes from slider { dy = sd->apy[0][ii] + 0.5 * dbrite; // increment brightness if (dy < 0) dy = 0; if (dy > 1) dy = 1; sd->apy[0][ii] = dy; } splcurve_generate(sd,0); // regenerate curve 0 gtk_widget_queue_draw(sd->drawarea); // draw curve 0 } if (strmatch(event,"contrast")) // contrast slider, 0 ... 1 { cont0 = contrast; zdialog_fetch(zd,"contrast",contrast); dcont = contrast - cont0; // change in contrast, + - zdialog_stuff(zd,"all",1); // active curve is "all" sd->fact[0] = 1; for (ii = 1; ii < 4; ii++) sd->fact[ii] = 0; for (ii = 0; ii < sd->nap[0]; ii++) // update curve 0 nodes from slider { dx = sd->apx[0][ii]; // 0 ... 0.5 ... 1 if (dx < 0.0 || dx >= 1.0) continue; dy = dcont * (dx - 0.5); // -0.5 ... 0 ... +0.5 * dcont dy += sd->apy[0][ii]; if (dy < 0) dy = 0; if (dy > 1) dy = 1; sd->apy[0][ii] = dy; } splcurve_generate(sd,0); // regenerate curve 0 gtk_widget_queue_draw(sd->drawarea); // draw curve 0 } if (strmatch(event,"paint")) Fapply = 1; // from paint_edits() if (zstrstr("brightness contrast colortemp colorsat " // detect change "autoWB autoBL load",event)) Fapply = 1; if (! Fapply) return 1; // wait for change zdialog_fetch(zd,"colortemp",colortemp); // get illumination temp. setting blackbodyRGB(colortemp,tempR,tempG,tempB); // generate temp. adjustments zdialog_fetch(zd,"brightness",brightness); // get brightness setting zdialog_fetch(zd,"contrast",contrast); // get contrast setting zdialog_fetch(zd,"colorsat",colorsat); // get saturation setting thread_signal(); // update the image return 1; } // this function is called when a curve is edited void retouch_curvedit(int spc) { using namespace retouch_names; thread_signal(); return; } // use brightest pixels to estimate RGB values of illumination // and use these to adjust image RGB values for neutral illumination void retouch_autoWB() { using namespace retouch_names; int pixR[256], pixG[256], pixB[256]; // pixel counts per RGB value 0-255 int samplesize; // sample size, pixel count int px, py, ii, dist; int sampR, sampG, sampB; double sumR, sumG, sumB; float meanR, meanG, meanB; float *pix; for (ii = 0; ii < 256; ii++) pixR[ii] = pixG[ii] = pixB[ii] = 0; for (py = 0; py < Ehh; py++) // scan image file, get pixel counts for (px = 0; px < Eww; px++) // per RGB value 0-255 { if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } pix = PXMpix(E1pxm,px,py); ii = pix[0]; // pixel R value 0-255 pixR[ii]++; // accumulate pixel count for R value ii = pix[1]; pixG[ii]++; ii = pix[2]; pixB[ii]++; } samplesize = Eww * Ehh; // image pixel count if (sa_stat == sa_stat_fini) samplesize = sa_Npixel; // use area count samplesize = samplesize * 0.01 * sampWB; // % sample size >> sample pixel count sampR = sampG = sampB = 0; sumR = sumG = sumB = 0; for (ii = 254; ii > 0; ii--) // sample brightest % pixels { // (avoid blowout value 255) if (sampR < samplesize) { sampR += pixR[ii]; // pixels with R value ii sumR += ii * pixR[ii]; // sum product } if (sampG < samplesize) { sampG += pixG[ii]; sumG += ii * pixG[ii]; } if (sampB < samplesize) { sampB += pixB[ii]; sumB += ii * pixB[ii]; } } meanR = sumR / sampR; // mean RGB for brightest % pixels meanG = sumG / sampG; meanB = sumB / sampB; wbalR = meanG / meanR; // = 1.0 if all RGB are equal wbalG = meanG / meanG; // <1/>1 if RGB should be less/more wbalB = meanG / meanB; return; } // use darkest pixels to estimate black point and reduce image RGB values void retouch_autoBL() { using namespace retouch_names; int pixR[256], pixG[256], pixB[256]; // pixel counts per RGB value 0-255 int samplesize; // sample size, pixel count int px, py, ii, dist; int sampR, sampG, sampB; double sumR, sumG, sumB; float meanR, meanG, meanB; float *pix; for (ii = 0; ii < 256; ii++) pixR[ii] = pixG[ii] = pixB[ii] = 0; for (py = 0; py < Ehh; py++) // scan image file, get pixel counts for (px = 0; px < Eww; px++) // per RGB value 0-255 { if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } pix = PXMpix(E1pxm,px,py); ii = pix[0]; // pixel R value 0-255 pixR[ii]++; // accumulate pixel count for R value ii = pix[1]; pixG[ii]++; ii = pix[2]; pixB[ii]++; } samplesize = Eww * Ehh; // image pixel count if (sa_stat == sa_stat_fini) samplesize = sa_Npixel; // use area count samplesize = samplesize * 0.01 * sampBL; // % sample size >> sample pixel count sampR = sampG = sampB = 0; sumR = sumG = sumB = 0; for (ii = 0; ii < 100; ii++) // sample darkest % pixels { if (sampR < samplesize) { sampR += pixR[ii]; // pixels with R value ii sumR += ii * pixR[ii]; // sum product } if (sampG < samplesize) { sampG += pixG[ii]; sumG += ii * pixG[ii]; } if (sampB < samplesize) { sampB += pixB[ii]; sumB += ii * pixB[ii]; } } meanR = sumR / sampR; // mean RGB for darkest % pixels meanG = sumG / sampG; meanB = sumB / sampB; blackR = meanR; // set black RGB levels blackG = meanG; blackB = meanB; Fblack = 1; return; } // get nominal white color or black point from mouse click position void retouch_mousefunc() // mouse function { using namespace retouch_names; int px, py, dx, dy; float red, green, blue; float *ppix; ch mousetext[60]; if (! LMclick) return; LMclick = 0; px = Mxclick; // mouse click position py = Myclick; if (px < 2) px = 2; // pull back from edge if (px > Eww-3) px = Eww-3; if (py < 2) py = 2; if (py > Ehh-3) py = Ehh-3; red = green = blue = 0; for (dy = -1; dy <= 1; dy++) // 3x3 block around mouse position for (dx = -1; dx <= 1; dx++) { ppix = PXMpix(E1pxm,px+dx,py+dy); // input image red += ppix[0]; green += ppix[1]; blue += ppix[2]; } red = red / 9.0; // mean RGB levels green = green / 9.0; blue = blue / 9.0; snprintf(mousetext,60,"3x3 Pixels RGB: %.0f %.0f %.0f \n",red,green,blue); poptext_mouse(TX(mousetext),10,10,0,3); if (spotWB && (red<5 || red>250 || green<5 || green>250 || blue<5 || blue>250)) { // refuse unscalable spot zmessageACK(Mwin,TX("choose a better spot")); return; } if (spotWB) { // click pixel is new gray/white wbalR = green / red; // = 1.0 if all RGB are equal wbalG = green / green; // <1/>1 if RGB should be less/more wbalB = green / blue; thread_signal(); // trigger image update } if (spotBL) { // click pixel is new black point blackR = red; blackG = green; blackB = blue; Fblack = 1; thread_signal(); // update image } return; } // thread function void * retouch_thread(void *arg) { using namespace retouch_names; void * retouch_wthread(void *); if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag combR = wbalR * tempR / 255.0; // combine white balance colors combG = wbalG * tempG / 255.0; // and illumination temperature. combB = wbalB * tempB / 255.0; // <1/>1 if RGB should be less/more Rbscale = Gbscale = Bbscale = 1.0; if (Fblack) { // if RGB black points defined, Rbscale = 256.0 / (256.0 - blackR); // rescale for full brightness Gbscale = 256.0 / (256.0 - blackG); Bbscale = 256.0 / (256.0 - blackB); } get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(retouch_wthread,NSMP); // do working threads CEF->Fmods++; // image3 modified CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } void * retouch_wthread(void *arg) // worker thread function { using namespace retouch_names; int index = *((int *) arg); int ii, px, py, Fend; float *pix1, *pix3; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float pixbrite, ff, F1, F2; float blend, coeff = 1000.0 / 256.0; spldat *sd = EFretouch.sd; while (true) { Fend = get_edit_pixels(index,px,py,blend); if (Fend) return 0; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = R9 = pix1[0]; // input image RGB values G1 = G9 = pix1[1]; B1 = B9 = pix1[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; // apply RGB black points to input RGB values if (Fblack) { R9 = R9 - blackR; // clip black value at low end R9 = R9 * Rbscale; // rescale so that high end = 256 if (R9 < 0) R9 = 0; G9 = G9 - blackG; G9 = G9 * Gbscale; if (G9 < 0) G9 = 0; B9 = B9 - blackB; B9 = B9 * Bbscale; if (B9 < 0) B9 = 0; } // apply white balance and temperature color shifts // dampen as RGB values approach 256 if (combR > 1) { F1 = (256 - R9) / 256; // R1 = 0...256 >> F1 = 1...0 F2 = F1 * combR + 1 - F1; // F2 = combR ... 1 R9 = F2 * R9; // R9 is adjusted R1 } else R9 = combR * R9; if (combG > 1) { // same for G9 and B9 F1 = (256 - G9) / 256; F2 = F1 * combG + 1 - F1; G9 = F2 * G9; } else G9 = combG * G9; if (combB > 1) { F1 = (256 - B9) / 256; F2 = F1 * combB + 1 - F1; B9 = F2 * B9; } else B9 = combB * B9; // apply saturation color shift if (colorsat != 0) { pixbrite = 0.333 * (R9 + G9 + B9); // pixel brightness, 0 to 255.9 R9 = R9 + colorsat * (R9 - pixbrite); // colorsat is -1 ... +1 G9 = G9 + colorsat * (G9 - pixbrite); B9 = B9 + colorsat * (B9 - pixbrite); } // apply brightness/contrast curves if (sd->mod[0]) // curve was modified { pixbrite = R9; // use max. RGB value if (G9 > pixbrite) pixbrite = G9; if (B9 > pixbrite) pixbrite = B9; ii = coeff * pixbrite; // "all" curve index 0-999 if (ii < 0) ii = 0; if (ii > 999) ii = 999; ff = 2.0 * sd->yval[0][ii]; // 0.0 - 2.0 R9 = ff * R9; G9 = ff * G9; B9 = ff * B9; } if (sd->mod[1]) { ii = coeff * R9; // additional RGB curve adjustments if (ii < 0) ii = 0; if (ii > 999) ii = 999; R9 = R9 * (0.5 + sd->yval[1][ii]); // 0.5 - 1.5 } if (sd->mod[2]) { ii = coeff * G9; if (ii < 0) ii = 0; if (ii > 999) ii = 999; G9 = G9 * (0.5 + sd->yval[2][ii]); } if (sd->mod[3]) { ii = coeff * B9; if (ii < 0) ii = 0; if (ii > 999) ii = 999; B9 = B9 * (0.5 + sd->yval[3][ii]); } RGBfix(R9,G9,B9); if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; // increase edit G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // Return relative RGB illumination values for a light source // having a given input temperature of 1000-10000 deg. K // 5000 K is neutral: all returned factors relative to 1.0 void blackbodyRGB(int K, float &R, float &G, float &B) { float kk[19] = { 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0 }; float r1[19] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 250, 242, 231, 220, 211, 204, 197, 192, 188, 184 }; float g1[19] = { 060, 148, 193, 216, 232, 242, 249, 252, 255, 254, 251, 245, 239, 233, 228, 224, 220, 217, 215 }; float b1[19] = { 000, 010, 056, 112, 158, 192, 219, 241, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; static int ftf = 1; static float r2[10000], g2[10000], b2[10000]; if (ftf) { // initialize spline curves spline1(19,kk,r1); for (int T = 1000; T < 10000; T++) r2[T] = spline2(0.001 * T); spline1(19,kk,g1); for (int T = 1000; T < 10000; T++) g2[T] = spline2(0.001 * T); spline1(19,kk,b1); for (int T = 1000; T < 10000; T++) b2[T] = spline2(0.001 * T); ftf = 0; } if (K < 1000 || K > 9999) zappcrash("blackbody bad K: %dK",K); R = r2[K]; G = g2[K]; B = b2[K]; return; } /**************************************************************************************/ // Rescale image namespace rescale_names { editfunc EFrescale; int width, height; // new image size int orgwidth, orgheight; // original image size int pctwidth, pctheight; // percent of original size int Fnewwidth, Fnewheight; // flags, width or height was changed int Flockratio; // flag, W/H ratio is locked float WHratio; } void m_rescale(GtkWidget *, ch *menu) { using namespace rescale_names; int rescale_dialog_event(zdialog *zd, ch *event); void * rescale_thread(void *); F1_help_topic = TX("RESCALE"); printf("m_rescale \n"); ch rtext[12]; EFrescale.menuname = "Rescale"; EFrescale.menufunc = m_rescale; EFrescale.Fscript = 0; // script NOT supported 26.6 EFrescale.threadfunc = rescale_thread; // thread function if (! edit_setup(EFrescale)) return; // setup edit /**** __________________________________________________ | | | Pixels Percent | | Width [_____] [_____] [Previous] | | Height [_____] [_____] | | | | [_] 3/1 [_] 2/1 [_] 3/2 [_] 1/1 | | [_] 3/4 [_] 2/3 [_] 1/2 [_] 1/3 [_] 1/4 | | | | W/H Ratio: 1.333 Lock [_] | | [OK] [X] | |__________________________________________________| ****/ zdialog *zd = zdialog_new(TX("Rescale Image"),Mwin,"OK","X",null); EFrescale.zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"vbox","vb11","hb1",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vb12","hb1",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vb13","hb1",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vb14","hb1",0,"homog|space=10"); zdialog_add_widget(zd,"label","placeholder","vb11",0); zdialog_add_widget(zd,"label","labw","vb11",TX("Width")); zdialog_add_widget(zd,"label","labh","vb11",TX("Height")); zdialog_add_widget(zd,"label","labpix","vb12",TX("Pixels")); zdialog_add_widget(zd,"zspin","width","vb12","10|80000|1|200","size=6"); // fotocx.h limits 26.3 zdialog_add_widget(zd,"zspin","height","vb12","10|80000|1|200","size=6"); zdialog_add_widget(zd,"label","labpct","vb13",TX("Percent")); zdialog_add_widget(zd,"zspin","pctwidth","vb13","1|999|1|100"); zdialog_add_widget(zd,"zspin","pctheight","vb13","1|999|1|100"); zdialog_add_widget(zd,"button","prev","vb14",TX("Previous")); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=5"); zdialog_add_widget(zd,"label","space","hb2",0); zdialog_add_widget(zd,"check","3/1","hb2","3/1"); zdialog_add_widget(zd,"check","2/1","hb2","2/1"); zdialog_add_widget(zd,"check","3/2","hb2","3/2"); zdialog_add_widget(zd,"check","1/1","hb2","1/1"); zdialog_add_widget(zd,"hbox","hb3","dialog",0,"space=5"); zdialog_add_widget(zd,"label","space","hb3",0); zdialog_add_widget(zd,"check","3/4","hb3","3/4"); zdialog_add_widget(zd,"check","2/3","hb3","2/3"); zdialog_add_widget(zd,"check","1/2","hb3","1/2"); zdialog_add_widget(zd,"check","1/3","hb3","1/3"); zdialog_add_widget(zd,"check","1/4","hb3","1/4"); zdialog_add_widget(zd,"hbox","hb4","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labratio","hb4",TX("W/H Ratio:"),"space=5"); zdialog_add_widget(zd,"label","WHratio","hb4","1.6667"); zdialog_add_widget(zd,"check","Flockratio","hb4",TX("Lock"),"space=10"); zdialog_add_ttip(zd,"prev",TX("use previous input")); orgwidth = E1pxm->ww; // original width, height orgheight = E1pxm->hh; width = orgwidth; // = initial width, height height = orgheight; WHratio = 1.0 * width / height; // initial W/H ratio pctwidth = pctheight = 100; Fnewwidth = Fnewheight = 0; Flockratio = 1; // W/H ratio initially locked zdialog_stuff(zd,"width",width); zdialog_stuff(zd,"height",height); zdialog_stuff(zd,"pctwidth",pctwidth); zdialog_stuff(zd,"pctheight",pctheight); snprintf(rtext,12,"%.3f",WHratio); zdialog_stuff(zd,"WHratio",rtext); zdialog_stuff(zd,"Flockratio",1); zdialog_stuff(zd,"3/1",0); zdialog_stuff(zd,"2/1",0); zdialog_stuff(zd,"3/2",0); zdialog_stuff(zd,"1/1",1); // begin with full size zdialog_stuff(zd,"3/4",0); zdialog_stuff(zd,"2/3",0); zdialog_stuff(zd,"1/2",0); zdialog_stuff(zd,"1/3",0); zdialog_stuff(zd,"1/4",0); zdialog_run(zd,rescale_dialog_event,"save"); // run dialog return; } // dialog event and completion callback function int rescale_dialog_event(zdialog *zd, ch *event) { using namespace rescale_names; int nn; double memreq, memavail; ch rtext[12]; int pixcc = 4 * sizeof(float); // pixel size, RGBA if (strmatch(event,"done")) zd->zstat = 1; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 2; // cancel if (strmatch(event,"apply")) { // from script zdialog_fetch(zd,"width",width); zdialog_fetch(zd,"height",height); thread_signal(); return 1; } if (zd->zstat) // dialog complete { if (zd->zstat == 1) { // done editrescale[0] = width; // remember size used editrescale[1] = height; thread_signal(); edit_addhist("width:%d height:%d",width,height); // edit params > edit hist edit_done(0); } else edit_cancel(0); // cancel or kill Fzoom = 0; return 1; } if (strmatch(event,"focus")) return 1; // ignore focus Fnewwidth = Fnewheight = 0; // reset flags if (strmatch(event,"pctwidth")) { // % width input zdialog_fetch(zd,"pctwidth",nn); if (nn != pctwidth) { width = nn / 100.0 * orgwidth + 0.5; Fnewwidth = 1; // note changed } } if (strmatch(event,"pctheight")) { // same for height zdialog_fetch(zd,"pctheight",nn); if (nn != pctheight) { height = nn / 100.0 * orgheight + 0.5; Fnewheight = 1; } } if (strmatch(event,"width")) { // width input zdialog_fetch(zd,"width",nn); if (nn != width) { width = nn; // set new width Fnewwidth = 1; // note change } } if (strmatch(event,"height")) { // same for height zdialog_fetch(zd,"height",nn); if (nn != height) { height = nn; Fnewheight = 1; } } if (Fnewwidth || Fnewheight) { // width or height was set directly zdialog_stuff(zd,"3/1",0); // uncheck all preset sizes zdialog_stuff(zd,"2/1",0); zdialog_stuff(zd,"3/2",0); zdialog_stuff(zd,"1/1",0); zdialog_stuff(zd,"3/4",0); zdialog_stuff(zd,"2/3",0); zdialog_stuff(zd,"1/2",0); zdialog_stuff(zd,"1/3",0); zdialog_stuff(zd,"1/4",0); } if (zstrstr("3/1 2/1 3/2 1/1 3/4 2/3 1/2 1/3 1/4",event)) { // a ratio button was selected zdialog_stuff(zd,"3/1",0); // uncheck all preset sizes zdialog_stuff(zd,"2/1",0); zdialog_stuff(zd,"3/2",0); zdialog_stuff(zd,"1/1",0); zdialog_stuff(zd,"3/4",0); zdialog_stuff(zd,"2/3",0); zdialog_stuff(zd,"1/2",0); zdialog_stuff(zd,"1/3",0); zdialog_stuff(zd,"1/4",0); zdialog_stuff(zd,event,1); // set selected button on if (strmatch(event,"3/1")) { width = 3 * orgwidth; height = 3 * orgheight; } if (strmatch(event,"2/1")) { width = 2 * orgwidth; height = 2 * orgheight; } if (strmatch(event,"3/2")) { width = 1.5 * orgwidth; height = 1.5 * orgheight; } if (strmatch(event,"1/1")) { width = orgwidth; height = orgheight; } if (strmatch(event,"3/4")) { width = 0.75 * orgwidth; height = 0.75 * orgheight; } if (strmatch(event,"2/3")) { width = 0.66667 * orgwidth; height = 0.66667 * orgheight; } if (strmatch(event,"1/2")) { width = 0.5 * orgwidth; height = 0.5 * orgheight; } if (strmatch(event,"1/3")) { width = 0.33333 * orgwidth; height = 0.33333 * orgheight; } if (strmatch(event,"1/4")) { width = 0.25 * orgwidth; height = 0.25 * orgheight; } WHratio = 1.0 * orgwidth / orgheight; // new W/H ratio Flockratio = 1; // lock W/H ratio } if (strmatch("prev",event)) { // Previous size button checked zdialog_stuff(zd,"3/1",0); // uncheck all preset sizes zdialog_stuff(zd,"2/1",0); zdialog_stuff(zd,"3/2",0); zdialog_stuff(zd,"1/1",0); zdialog_stuff(zd,"3/4",0); zdialog_stuff(zd,"2/3",0); zdialog_stuff(zd,"1/2",0); zdialog_stuff(zd,"1/3",0); zdialog_stuff(zd,"1/4",0); width = editrescale[0]; // set previous size height = editrescale[1]; WHratio = 1.0 * width / height; // new W/H ratio Flockratio = 1; // lock W/H ratio } if (strmatch(event,"Flockratio")) // toggle W/H ratio lock zdialog_fetch(zd,"Flockratio",Flockratio); if (Flockratio) { // if W/H ratio locked, if (Fnewwidth) height = width / WHratio + 0.5; // force same W/H ratio if (Fnewheight) width = height * WHratio + 0.5; // round } if (width < 10) { // enforce lower limits width = 10; height = width / WHratio + 0.5; } if (height < 10) { height = 10; width = height * WHratio + 0.5; } if (! edit_wwhhOK(width,height)) return 1; // enforce image size limits if (! Flockratio) WHratio = 1.0 * width / height; // track actual W/H ratio pctwidth = 100.0 * width / orgwidth + 0.5; // final % size pctheight = 100.0 * height / orgheight + 0.5; zdialog_stuff(zd,"width",width); // update all zdialog data zdialog_stuff(zd,"height",height); zdialog_stuff(zd,"pctwidth",pctwidth); zdialog_stuff(zd,"pctheight",pctheight); zdialog_stuff(zd,"Flockratio",Flockratio); snprintf(rtext,12,"%.3f",WHratio); zdialog_stuff(zd,"WHratio",rtext); memreq = 1.0 * width * height * pixcc; // memory for rescaled image memreq = memreq / 1024 / 1024; // peak required memory, MB memavail = availmemory(); if (memreq > memavail - 1000) { // 1 GB margin zmessageACK(Mwin,TX("insufficient memory, cannot proceed")); edit_cancel(0); return 1; } thread_signal(); // update image, no wait for idle return 1; } // do the rescale job void * rescale_thread(void *) { using namespace rescale_names; PXM *pxmtemp; pxmtemp = PXM_rescale(E1pxm,width,height); // rescale the edit image if (! pxmtemp) { zmessageACK(Mwin,TX("insufficient memory, cannot proceed")); // 26.3 return 0; } PXM_free(E3pxm); E3pxm = pxmtemp; Eww = E3pxm->ww; Ehh = E3pxm->hh; CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); return 0; } /**************************************************************************************/ // Split-screen function // View before/after images with a movable split-screen during an edit function. // If no edit function is active, split_screen2() is started to choose two files. namespace split_screen_names { PXM *E2pxm; editfunc EFsplit_screen2; } // menu function void m_split_screen(GtkWidget *, ch *menu) // 26.8 { using namespace split_screen_names; void m_split_screen2(GtkWidget *, ch *); int split_screen_dialog_event(zdialog *, ch *); void split_screen_mousefunc(); void split_screen_show(int arg); zdialog *zd; F1_help_topic = TX("SPLIT-SCREEN"); printf("m_split_screen \n"); if (! CEF) { // if no edit function active, m_split_screen2(0,0); // choose files to view split-screen return; } zdialog_show(CEF->zd,0); // hide edit dialog if (zd_paintedits) zdialog_show(zd_paintedits,0); // hide paint_edits dialog if present E9pxm = PXM_copy(E3pxm); // save E3 to E9 E2pxm = PXM_copy(E3pxm); // E1/E2 = original/modified image split_screen_show(-1); // show initial split screen 50/50 zd = zdialog_new("",Mwin,"X",null); // small dialog to exit split screen zdialog_add_widget(zd,"label","labx","dialog",TX("exit split-screen")); zdialog_set_decorated(zd,0); zdialog_run(zd,split_screen_dialog_event,"90/90"); takeMouse(split_screen_mousefunc,dragcursor); // capture mouse return; } // dialog event function - kill dialog and restore edit E3 image int split_screen_dialog_event(zdialog *zd, ch *event) { using namespace split_screen_names; if (zd->zstat == 0) return 0; freeMouse(); PXM_free(E3pxm); // restore original E3 E3pxm = E9pxm; E9pxm = 0; PXM_free(E2pxm); // free E2 E2pxm = 0; zdialog_show(CEF->zd,1); // restore edit and paint_edits dialogs if (zd_paintedits) zdialog_show(zd_paintedits,1); edit_undo(); edit_redo(); zdialog_free(zd); return 0; } // mouse function - drag image separator using the mouse void split_screen_mousefunc() { using namespace split_screen_names; void split_screen_show(int arg); if (! Mxdrag) return; // wait for drag event split_screen_show(Mxdrag); Mxdrag = 0; return; } // show the two images with split screen // use pxbL image for pixels left of P and pxbR image for pixels right of P void split_screen_show(int xposn) { using namespace split_screen_names; static int P, PP; static int Pww, Phh, Rww; int px, py, rx, cc; int pcc = E3pxm->nc * sizeof(float); // pixel size float *pix1, *pix2, *pix3; float red[4] = { 255, 0, 0, 255 }; // red pixel if (xposn == -1) // first call, initialize { Rww = 3 / Mscale; // 1/2 red line width if (Rww < 1) Rww = 1; Pww = E3pxm->ww; // image dimensions Phh = E3pxm->hh; PP = P = Pww/2; // initial split posn for (py = 0; py < Phh; py++) { px = 0; // left image cc = P-Rww; if (cc > 0) { pix1 = PXMpix(E1pxm,px,py); pix3 = PXMpix(E3pxm,px,py); memcpy(pix3,pix1,cc*pcc); } for (px = P-Rww; px <= P+Rww; px++) // red line { if (px >= 0 && px < Pww) { pix3 = PXMpix(E3pxm,px,py); memcpy(pix3,red,pcc); } } px = P+Rww; // right image cc = Pww - px - 1; if (cc > 0) { pix2 = PXMpix(E2pxm,px,py); pix3 = PXMpix(E3pxm,px,py); memcpy(pix3,pix2,cc*pcc); } } Fpaint2(); // paint full image return; } P = xposn; // mouse x-position if (P == PP) return; // no movement px = cc = 0; for (py = 0; py < Phh; py++) { if (P > PP) // movement to right { px = PP - 2 * Rww; cc = P - PP + 4 * Rww; if (px < 0) px = 0; if (px + cc > Pww-1) cc = Pww-1 - px; pix1 = PXMpix(E1pxm,px,py); // expose left image pix3 = PXMpix(E3pxm,px,py); memcpy(pix3,pix1,cc*pcc); } if (P < PP) // movement to left { px = P - 2 * Rww; cc = PP - P + 4 * Rww; if (px < 0) px = 0; if (px + cc > Pww-1) cc = Pww-1 - px; pix2 = PXMpix(E2pxm,px,py); // expose right image pix3 = PXMpix(E3pxm,px,py); memcpy(pix3,pix2,cc*pcc); } for (rx = P - Rww; rx <= P + Rww; rx++) // red line { if (rx >= 0 && rx < Pww) { pix3 = PXMpix(E3pxm,rx,py); memcpy(pix3,red,pcc); } } } PP = P; // save prior position if (px < 0) px = 0; if (px + cc > Pww-1) cc = Pww-1 - px; Fpaint3(px,0,cc,Phh,0); // paint new exposed area return; } /**************************************************************************************/ // Split Screen2 function // Get two images from user. They must have the same width and height. // View the two images with a movable split-screen. // menu function void m_split_screen2(GtkWidget *, ch *menu) // 26.8 { using namespace split_screen_names; int split_screen2_dialog_event(zdialog *, ch *); void split_screen_mousefunc(); void split_screen_show(int arg); zdialog *zd; int err; ch *file1, *file2; printf("m_split_screen2 \n"); err = select_2files(file1,file2); if (err) return; err = f_open(file1,0,0,1,0); // open file1 for edit if (err) return; EFsplit_screen2.menufunc = m_split_screen2; // setup edit function EFsplit_screen2.menuname = "Split Screen"; EFsplit_screen2.mousefunc = split_screen_mousefunc; if (! edit_setup(EFsplit_screen2)) return; // E1 from file1 (before image) E2pxm = PXM_load(file2,1); // E2 from file2 (after image) split_screen_show(-1); // show initial split screen 50/50 zd = zdialog_new("",Mwin,"OK","X",null); // small dialog to exit split screen EFsplit_screen2.zd = zd; zdialog_add_widget(zd,"label","labx","dialog",TX("exit split-screen")); zdialog_set_decorated(zd,0); zdialog_run(zd,split_screen2_dialog_event,"90/90"); takeMouse(split_screen_mousefunc,dragcursor); // capture mouse return; } // dialog event function - kill split screen and close edit int split_screen2_dialog_event(zdialog *zd, ch *event) { using namespace split_screen_names; if (strmatch(event,"focus")) return 1; // ignore focus if (strmatch(event,"done")) zd->zstat = 1; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 2; // cancel if (zd->zstat == 0) return 0; freeMouse(); PXM_free(E2pxm); E2pxm = 0; CEF->Fmods++; if (zd->zstat == 1) edit_done(0); else edit_cancel(0); zdialog_free(zd); return 1; } /**************************************************************************************/ // Show differences between two images, typically edit input and output images. // If no edit function is active, get two files to compare from the user. // Show output image pixels > difference threshold, dim all other pixels. namespace show_diffs_names { PXM *E2pxm; editfunc EFshow_diffs2; float diffs; } // menu function void m_show_diffs(GtkWidget *, ch *menu) // 26.8 { using namespace show_diffs_names; void m_show_diffs2(GtkWidget *, ch *); int show_diffs_dialog_event(zdialog *, ch *); void show_diffs_show(); zdialog *zd; F1_help_topic = TX("SHOW DIFFS"); printf("m_show_diffs \n"); if (! CEF) { // if no edit function active, m_show_diffs2(0,0); // choose files to view return; } zdialog_show(CEF->zd,0); // hide edit dialog if (zd_paintedits) zdialog_show(zd_paintedits,0); // hide paint_edits dialog freeMouse(); // stop edit mouse action E9pxm = PXM_copy(E3pxm); // save E3 to E9 E2pxm = PXM_copy(E3pxm); // E1/E2 = original/modified image diffs = 0; show_diffs_show(); // show initial output image zd = zdialog_new(TX("Image Differences"),Mwin,"X",null); // start dialog for diffs slider zdialog_add_widget(zd,"hbox","hb3","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labthresh","hb3",TX("Diffs"),"space=3"); zdialog_add_widget(zd,"hscale","diffs","hb3","0|1|0.01|0","space=3|expand"); zdialog_rescale(zd,"diffs",0,0,1); zdialog_resize(zd,300,0); zdialog_run(zd,show_diffs_dialog_event); // run dialog - parallel return; } // dialog event and completion function int show_diffs_dialog_event(zdialog *zd, ch *event) { using namespace show_diffs_names; void show_diffs_show(); if (strmatch(event,"focus")) return 1; // ignore focus if (strmatch(event,"done")) zd->zstat = 1; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 2; // cancel if (zd->zstat) // dialog complete { PXM_free(E3pxm); E3pxm = E9pxm; // restore original E3 E9pxm = 0; PXM_free(E2pxm); // free E2 E2pxm = 0; zdialog_show(CEF->zd,1); // restore edit dialog if (zd_paintedits) zdialog_show(zd_paintedits,1); // restore paint_edits dialog edit_undo(); // restore window image edit_redo(); zdialog_free(zd); // close dialog return 0; } zdialog_fetch(zd,"diffs",diffs); // get diffs input show_diffs_show(); // show differences image return 1; } // show the differences between the two images void show_diffs_show() { using namespace show_diffs_names; void * show_diffs_thread(void *); void *show_diffs_wthread(void *arg); do_wthreads(show_diffs_wthread,NSMP); Fpaint2(); return; } void * show_diffs_wthread(void *arg) // worker thread function { using namespace show_diffs_names; int index = *((int *) arg); int ww = E3pxm->ww; int hh = E3pxm->hh; int px, py, rgb, pdiff; float *pix1, *pix2, *pix3; for (py = index; py < hh; py += NSMP) // loop image pixels for (px = 0; px < ww; px++) { pix1 = PXMpix(E1pxm,px,py); // input pixel image1 pix2 = PXMpix(E2pxm,px,py); // input pixel image2 pix3 = PXMpix(E3pxm,px,py); // output pixel for (rgb = 0; rgb < 3; rgb++) { // get pixel1/pixel2 RGB diffs pdiff = pix1[rgb] - pix2[rgb]; if (abs(pdiff) > 2) break; // ignore invisible changes } if (rgb < 3) // some RGB difference for (rgb = 0; rgb < 3; rgb++) // output changed pixel pix3[rgb] = pix2[rgb]; else // no difference for (rgb = 0; rgb < 3; rgb++) // output darkened pixel pix3[rgb] = (1.0 - diffs) * pix2[rgb]; } return 0; } // m_show_diffs2() - get two files to compare from user void m_show_diffs2(GtkWidget *, ch *menu) // 26.8 { using namespace show_diffs_names; int show_diffs2_dialog_event(zdialog *, ch *); void show_diffs_show(); int err; ch *file1, *file2; zdialog *zd; err = select_2files(file1,file2); if (err) return; err = f_open(file1,0,0,1,0); // open file1 for edit if (err) return; EFshow_diffs2.menufunc = m_show_diffs2; // setup edit function EFshow_diffs2.menuname = "Show Diffs"; if (! edit_setup(EFshow_diffs2)) return; // E1 from file1 (before image) E2pxm = PXM_load(file2,1); // E2 from file2 (after image) diffs = 0; show_diffs_show(); // show initial image zd = zdialog_new(TX("Image Differences"),Mwin,"OK","X",null); // start dialog for diffs slider zdialog_add_widget(zd,"hbox","hb3","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labthresh","hb3",TX("Diffs"),"space=3"); zdialog_add_widget(zd,"hscale","diffs","hb3","0|1|0.01|0","space=3|expand"); zdialog_rescale(zd,"diffs",0,0,1); zdialog_resize(zd,300,0); zdialog_run(zd,show_diffs2_dialog_event); // run dialog - parallel return; } // dialog event function - get diffs input and show diffs image int show_diffs2_dialog_event(zdialog *zd, ch *event) { using namespace show_diffs_names; if (strmatch(event,"focus")) return 1; // ignore focus if (strmatch(event,"done")) zd->zstat = 1; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 2; // cancel if (zd->zstat) { PXM_free(E2pxm); // free E2 E2pxm = 0; CEF->Fmods++; if (zd->zstat == 1) edit_done(0); else edit_cancel(0); zdialog_free(zd); // close dialog return 0; } zdialog_fetch(zd,"diffs",diffs); // get diffs slider show_diffs_show(); // show differences image return 1; } /**************************************************************************************/ // Add Margins to an image namespace margins_names { editfunc EFmargins; int Eww1, Ehh1; int Eww2, Ehh2; int top, bott, left, right; int red, green, blue, alpha; } void m_margins(GtkWidget *, ch *menu) { using namespace margins_names; int margins_dialog_event(zdialog *zd, ch *event); void * margins_thread(void *); F1_help_topic = TX("MARGINS"); printf("m_margins \n"); EFmargins.menuname = TX("Margins"); EFmargins.menufunc = m_margins; EFmargins.FprevReq = 1; // use preview (small) size EFmargins.Fscript = 1; // script supported EFmargins.threadfunc = margins_thread; // thread function if (! edit_setup(EFmargins)) return; // setup edit Eww1 = E1pxm->ww; // input image dimensions Ehh1 = E1pxm->hh; PXM_addalpha(E1pxm); /**** ________________________________ | Add Margins | | | | Top [____] All ± 1 [__] | | Left [____] All ± 10 [__] | | Right [____] Color [###] | | Bottom [____] Alpha [___] | | | | [OK] [X] | |________________________________| ****/ zdialog *zd = zdialog_new(TX("Add Margins"),Mwin,"OK","X",null); EFmargins.zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"homog|space=5"); zdialog_add_widget(zd,"label","space","hb1"," "); zdialog_add_widget(zd,"vbox","vb3","hb1",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vb4","hb1",0,"homog|space=5"); zdialog_add_widget(zd,"label","Ltop","vb1",TX("Top")); zdialog_add_widget(zd,"label","Lleft","vb1",TX("Left")); zdialog_add_widget(zd,"label","Lright","vb1",TX("Right")); zdialog_add_widget(zd,"label","Lbott","vb1",TX("Bottom")); zdialog_add_widget(zd,"zspin","top","vb2","0|999|1|0"); zdialog_add_widget(zd,"zspin","left","vb2","0|999|1|0"); zdialog_add_widget(zd,"zspin","right","vb2","0|999|1|0"); zdialog_add_widget(zd,"zspin","bott","vb2","0|999|1|0"); zdialog_add_widget(zd,"label","Lall1","vb3",TX("All±1")); zdialog_add_widget(zd,"label","Lall10","vb3",TX("All±10")); zdialog_add_widget(zd,"label","Lcolor","vb3",TX("Color")); zdialog_add_widget(zd,"label","Lalpha","vb3",TX("Alpha")); zdialog_add_widget(zd,"zspin","all±1","vb4","-1|+1|1|0"); zdialog_add_widget(zd,"zspin","all±10","vb4","-10|+10|10|0"); zdialog_add_widget(zd,"colorbutt","color","vb4","255|255|255"); zdialog_add_widget(zd,"zspin","alpha","vb4","0|255|1|255"); zdialog_run(zd,margins_dialog_event,"save"); // run dialog return; } // dialog event and completion callback function int margins_dialog_event(zdialog *zd, ch *event) { using namespace margins_names; void margins_final(); int addall; ch color[20]; ch *pp; if (strmatch(event,"focus")) return 1; // ignore focus if (strmatch(event,"done")) zd->zstat = 1; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 2; // cancel if (zd->zstat) // dialog complete { if (zd->zstat == 1) // done { edit_fullsize(); // get full size image PXM_addalpha(E1pxm); margins_final(); // rotate/crop final image edit_addhist("%d %d %d %d",top,bott,left,right); // edit params > edit hist edit_done(0); } else edit_cancel(0); // cancel or kill return 1; } if (strmatch(event,"all±1")) { zdialog_fetch(zd,"all±1",addall); zdialog_stuff(zd,"all±1",0); } if (strmatch(event,"all±10")) { zdialog_fetch(zd,"all±10",addall); zdialog_stuff(zd,"all±10",0); } if (addall) { zdialog_fetch(zd,"top",top); top += addall; zdialog_stuff(zd,"top",top); zdialog_fetch(zd,"bott",bott); bott += addall; zdialog_stuff(zd,"bott",bott); zdialog_fetch(zd,"left",left); left += addall; zdialog_stuff(zd,"left",left); zdialog_fetch(zd,"right",right); right += addall; zdialog_stuff(zd,"right",right); addall = 0; } zdialog_fetch(zd,"top",top); // get margin sizes zdialog_fetch(zd,"bott",bott); zdialog_fetch(zd,"left",left); zdialog_fetch(zd,"right",right); zdialog_fetch(zd,"alpha",alpha); // margin alpha channel zdialog_fetch(zd,"color",color,20); // margin color from color button pp = substring(color,"|",1); if (pp) red = atoi(pp); pp = substring(color,"|",2); if (pp) green = atoi(pp); pp = substring(color,"|",3); if (pp) blue = atoi(pp); thread_signal(); // update image, no wait return 1; } // do the margins job void * margins_thread(void *) { using namespace margins_names; PXM *pxmtemp; int leftx, topx; int cc, ii; float pix1[4], *pix2; topx = top; // guaranteed constant values leftx = left; pix1[0] = red; // margin color and alpha pix1[1] = green; pix1[2] = blue; pix1[3] = alpha; Eww2 = Eww1 + right + leftx; // output image size Ehh2 = Ehh1 + topx + bott; pxmtemp = PXM_make(Eww2,Ehh2,4); // output image with alpha channel pix2 = pxmtemp->pixels; cc = 4 * sizeof(float); for (ii = 0; ii < Eww2 * Ehh2 * 4; ii += 4) // fill output image with margin color memcpy(pix2+ii,pix1,cc); PXM_copy_area(E1pxm,pxmtemp,0,0,leftx,topx,Eww1,Ehh1); // copy input image into output PXM_free(E3pxm); E3pxm = pxmtemp; Eww = E3pxm->ww; Ehh = E3pxm->hh; CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); return 0; } void margins_final() { using namespace margins_names; PXM *pxmtemp; int cc, ii; float pix1[4], *pix2; float R; pix1[0] = red; // margin color and alpha pix1[1] = green; pix1[2] = blue; pix1[3] = alpha; if (E1pxm->ww == Eww1) return; // preview image is full size image R = 1.0 * (Eww2 + Ehh2) / (Eww1 + Ehh1); // size with margins / size without top *= R + 0.5; // rescale full size margins bott *= R + 0.5; left *= R + 0.5; right *= R + 0.5; Eww1 = E1pxm->ww; // full size input image Ehh1 = E1pxm->hh; Eww2 = Eww1 + right + left; // full size output image Ehh2 = Ehh1 + top + bott; pxmtemp = PXM_make(Eww2,Ehh2,4); // output image with alpha channel pix2 = pxmtemp->pixels; cc = 4 * sizeof(float); for (ii = 0; ii < Eww2 * Ehh2 * 4; ii += 4) // fill output image with margin color memcpy(pix2+ii,pix1,cc); PXM_copy_area(E1pxm,pxmtemp,0,0,left,top,Eww1,Ehh1); // copy input image into output PXM_free(E3pxm); E3pxm = pxmtemp; Eww = E3pxm->ww; Ehh = E3pxm->hh; CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); return; } /**************************************************************************************/ // draw on image: text, line/arrow, box, oval void m_markup(GtkWidget *widget, ch *menu) { int markup_dialog_event(zdialog *zd, ch *event); zdialog *zd; F1_help_topic = TX("MARKUP"); printf("m_markup \n"); /*** ___________________________________ | Image Markup | | | | [_] Draw text on image | | [_] Draw line or arrow on image | | [_] Draw box on image | | [_] Draw oval on image | | | | [X] | |___________________________________| ***/ zd = zdialog_new(TX("Image Markup"),Mwin,"X",null); zdialog_add_widget(zd,"check","text","dialog",TX("Draw text on image")); zdialog_add_widget(zd,"check","line","dialog",TX("Draw line or arrow on image")); zdialog_add_widget(zd,"check","box","dialog",TX("Draw box on image")); zdialog_add_widget(zd,"check","oval","dialog",TX("Draw oval on image")); zdialog_stuff(zd,"text",0); zdialog_stuff(zd,"line",0); zdialog_stuff(zd,"box",0); zdialog_stuff(zd,"oval",0); zdialog_run(zd,markup_dialog_event,"save"); return; } // dialog event and completion function int markup_dialog_event(zdialog *zd, ch *event) { if (zd->zstat) { zdialog_free(zd); return 1; } if (strmatch(event,"text")) m_draw_text(0,0); if (strmatch(event,"line")) m_draw_line(0,0); if (strmatch(event,"box")) m_draw_box(0,0); if (strmatch(event,"oval")) m_draw_oval(0,0); if (zstrstr("text line box oval",event)) zdialog_free(zd); return 1; } /**************************************************************************************/ // add text on top of the image namespace drawtext_names { textattr_t attr; // text attributes and image ch file[1000] = ""; // file for write_text data ch metatag[60] = ""; int Tpx, Tpy; // text position on image int textpresent; // flag, text present on image int dialog_event(zdialog *zd, ch *event); // dialog event function void mousefunc(); // mouse event function void write(int mode); // write text on image editfunc EFdrawtext; } // menu function void m_draw_text(GtkWidget *, ch *menu) { using namespace drawtext_names; ch *title = TX("Draw text on image"); ch *tip = TX("Enter text, click/drag on image, right click to remove"); printf("m_draw_text \n"); EFdrawtext.menufunc = m_draw_text; EFdrawtext.menuname = "Markup Text"; EFdrawtext.Farea = 1; // select area ignored EFdrawtext.mousefunc = mousefunc; if (! edit_setup(EFdrawtext)) return; // setup edit /*** _________________________________________________________________ | Draw text on image | | | | Enter text, click/drag on image, right click to remove. | | | | Text [_______________________________________________________] | text | Use metadata tag [___________________________________] [Fetch] | metatag "Fetch" | [Font] [FreeSans_________] Size [ 44|v] | "Font" fontname fontsize | | | Color Transp. Width Angle | | text [###] [____] [____] | txcolor txtransp txangle | backing [###] [____] | bgcolor bgtransp | outline [###] [____] [___] | tocolor totransp towidth | shadow [###] [____] [___] [____] | shcolor shtransp shwidth shangle | | | emboss radius [____] depth [____] | | | | Use settings file [Open] [Save] | "Open" "Save" | | | [Clear] [Commit] [X] | |_________________________________________________________________| [Clear] clear text and metadata tag [Commit] save edit, restart dialog [X] edit_cancel ***/ zdialog *zd = zdialog_new(title,Mwin,"Clear","Commit","X",null); EFdrawtext.zd = zd; EFdrawtext.mousefunc = mousefunc; EFdrawtext.menufunc = m_draw_text; // allow restart zdialog_add_widget(zd,"label","tip","dialog",tip,"space=5"); zdialog_add_widget(zd,"hbox","hbtext","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labtext","hbtext","Text","space=5"); zdialog_add_widget(zd,"zedit","text","hbtext","text","expand|wrap"); zdialog_add_widget(zd,"hbox","hbmeta","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labmeta","hbmeta",TX("Use metadata tag"),"space=5"); zdialog_add_widget(zd,"zentry","metatag","hbmeta",0,"space=2|expand"); zdialog_add_widget(zd,"button","Fetch","hbmeta",TX("Fetch")); zdialog_add_widget(zd,"hbox","hbfont","dialog",0,"space=2"); zdialog_add_widget(zd,"button","Font","hbfont",TX("Font")); zdialog_add_widget(zd,"zentry","fontname","hbfont","FreeSans","space=2|size=20"); zdialog_add_widget(zd,"label","space","hbfont",0,"space=10"); zdialog_add_widget(zd,"label","labfsize","hbfont",TX("Size")); zdialog_add_widget(zd,"zspin","fontsize","hbfont","8|500|1|40","space=3"); zdialog_add_widget(zd,"hsep","sep1","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbattr","dialog",0,"space=3"); zdialog_add_widget(zd,"vbox","vbattr1","hbattr",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbattr2","hbattr",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbattr3","hbattr",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbattr4","hbattr",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbattr5","hbattr",0,"homog|space=5"); zdialog_add_widget(zd,"label","space","vbattr1"); zdialog_add_widget(zd,"label","labtext","vbattr1",TX("text")); zdialog_add_widget(zd,"label","labback","vbattr1",TX("backing")); zdialog_add_widget(zd,"label","laboutln","vbattr1",TX("outline")); zdialog_add_widget(zd,"label","labshadow","vbattr1",TX("shadow")); zdialog_add_widget(zd,"label","labcol","vbattr2",TX("Color")); zdialog_add_widget(zd,"colorbutt","txcolor","vbattr2","0|0|0"); zdialog_add_widget(zd,"colorbutt","bgcolor","vbattr2","255|255|255"); zdialog_add_widget(zd,"colorbutt","tocolor","vbattr2","255|0|0"); zdialog_add_widget(zd,"colorbutt","shcolor","vbattr2","255|0|0"); zdialog_add_widget(zd,"label","labtran","vbattr3",TX("Transp.")); zdialog_add_widget(zd,"zspin","txtransp","vbattr3","0|100|1|0"); zdialog_add_widget(zd,"zspin","bgtransp","vbattr3","0|100|1|0"); zdialog_add_widget(zd,"zspin","totransp","vbattr3","0|100|1|0"); zdialog_add_widget(zd,"zspin","shtransp","vbattr3","0|100|1|0"); zdialog_add_widget(zd,"label","labw","vbattr4",TX("Width")); zdialog_add_widget(zd,"label","space","vbattr4"); zdialog_add_widget(zd,"label","space","vbattr4"); zdialog_add_widget(zd,"zspin","towidth","vbattr4","0|30|1|0"); zdialog_add_widget(zd,"zspin","shwidth","vbattr4","0|50|1|0"); zdialog_add_widget(zd,"label","labw","vbattr5",TX("Angle")); zdialog_add_widget(zd,"zspin","txangle","vbattr5","-360|360|0.5|0"); zdialog_add_widget(zd,"label","space","vbattr5"); zdialog_add_widget(zd,"label","space","vbattr5"); zdialog_add_widget(zd,"zspin","shangle","vbattr5","-360|360|1|0"); zdialog_add_widget(zd,"hsep","sep2","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbemboss","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labemboss","hbemboss",TX("emboss"),"space=5"); zdialog_add_widget(zd,"label","labradius","hbemboss",TX("radius"),"space=5"); zdialog_add_widget(zd,"zspin","radius","hbemboss","0|10|1|0"); zdialog_add_widget(zd,"label","labdepth","hbemboss",TX("depth"),"space=5"); zdialog_add_widget(zd,"zspin","depth","hbemboss","0|20|1|0"); zdialog_add_widget(zd,"hbox","hbfile","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labfile","hbfile",TX("Use settings file"),"space=5"); zdialog_add_widget(zd,"button","Open","hbfile","Open","space=5"); zdialog_add_widget(zd,"button","Save","hbfile","Save","space=5"); zdialog_add_ttip(zd,"Clear",TX("clear text")); zdialog_add_ttip(zd,"Commit",TX("save edit, start new text")); // 26.0 zdialog_load_inputs(zd); // restore prior inputs memset(&attr,0,sizeof(attr)); zdialog_fetch(zd,"text",attr.text,1000); // get defaults or prior inputs zdialog_fetch(zd,"fontname",attr.font,80); zdialog_fetch(zd,"fontsize",attr.size); zdialog_fetch(zd,"txcolor",attr.color[0],20); zdialog_fetch(zd,"txtransp",attr.transp[0]); zdialog_fetch(zd,"txangle",attr.angle); zdialog_fetch(zd,"bgcolor",attr.color[1],20); zdialog_fetch(zd,"bgtransp",attr.transp[1]); zdialog_fetch(zd,"tocolor",attr.color[2],20); zdialog_fetch(zd,"totransp",attr.transp[2]); zdialog_fetch(zd,"towidth",attr.towidth); zdialog_fetch(zd,"shcolor",attr.color[3],20); zdialog_fetch(zd,"shtransp",attr.transp[3]); zdialog_fetch(zd,"shwidth",attr.shwidth); zdialog_fetch(zd,"shangle",attr.shangle); zdialog_fetch(zd,"radius",attr.emboss[0]); zdialog_fetch(zd,"depth",attr.emboss[1]); zdialog_fetch(zd,"metatag",metatag,60); gentext(&attr); // initial text takeMouse(mousefunc,dragcursor); // connect mouse function textpresent = 0; // no text on image yet zdialog_run(zd,dialog_event,"save"); // run dialog, parallel if (*metatag) zdialog_send_event(zd,"Fetch"); // metadata tag active, get text return; } // dialog event and completion callback function int drawtext_names::dialog_event(zdialog *zd, ch *event) { using namespace drawtext_names; GtkWidget *font_dialog; ch font[100]; // font name and size int size, yn; ch *pp; ch *tagname[1]; ch *tagval[1]; if (strmatch(event,"done")) zd->zstat = 6; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 7; // cancel if (zd->zstat) { if (zd->zstat == 1) { // [clear] *attr.text = 0; zdialog_stuff(zd,"text",""); zd->zstat = 0; // keep dialog active write(2); // erase text on image return 1; } if (zd->zstat == 2) { // [Commit] if (textpresent) edit_done(0); // save mods else edit_cancel(0); m_draw_text(0,0); // restart text dialog return 1; } if (textpresent) { // [X] cancel yn = zmessageYN(Mwin,TX("discard changes?")); // unsaved changes if (! yn) { zd->zstat = 0; // back out return 1; } } edit_cancel(0); m_markup(0,0); // restart main dialog return 1; } if (strmatch(event,"focus")) { // toggle mouse capture takeMouse(mousefunc,dragcursor); // connect mouse function return 1; } if (strmatch(event,"Open")) // load zdialog fields from a file { load_text(zd); zdialog_fetch(zd,"text",attr.text,1000); // get all zdialog fields zdialog_fetch(zd,"fontname",attr.font,80); zdialog_fetch(zd,"fontsize",attr.size); zdialog_fetch(zd,"txcolor",attr.color[0],20); zdialog_fetch(zd,"txtransp",attr.transp[0]); zdialog_fetch(zd,"txangle",attr.angle); zdialog_fetch(zd,"bgcolor",attr.color[1],20); zdialog_fetch(zd,"bgtransp",attr.transp[1]); zdialog_fetch(zd,"tocolor",attr.color[2],20); zdialog_fetch(zd,"totransp",attr.transp[2]); zdialog_fetch(zd,"towidth",attr.towidth); zdialog_fetch(zd,"shcolor",attr.color[3],20); zdialog_fetch(zd,"shtransp",attr.transp[3]); zdialog_fetch(zd,"shwidth",attr.shwidth); zdialog_fetch(zd,"shangle",attr.shangle); zdialog_fetch(zd,"radius",attr.emboss[0]); zdialog_fetch(zd,"depth",attr.emboss[1]); } if (strmatch(event,"Save")) { // save zdialog fields to file save_text(zd); return 1; } if (strmatch(event,"Fetch")) { // load text from metadata tagname zdialog_fetch(zd,"metatag",metatag,60); if (*metatag < ' ') return 1; tagname[0] = metatag; meta_get(curr_file,tagname,tagval,1); if (! tagval[0]) return 1; if (strlen(tagval[0]) > 999) tagval[0][999] = 0; repl_1str(tagval[0],attr.text,999,"\\n","\n"); // replace "\n" with newlines zfree(tagval[0]); zdialog_stuff(zd,"text",attr.text); // stuff dialog with metadata } if (strmatch(event,"text")) // get text from dialog zdialog_fetch(zd,"text",attr.text,1000); if (strmatch(event,"Font")) { // select new font snprintf(font,100,"%s %d",attr.font,attr.size); font_dialog = gtk_font_chooser_dialog_new("select font",MWIN); gtk_font_chooser_set_font(GTK_FONT_CHOOSER(font_dialog),font); gtk_dialog_run(GTK_DIALOG(font_dialog)); pp = gtk_font_chooser_get_font(GTK_FONT_CHOOSER(font_dialog)); gtk_widget_destroy(font_dialog); if (pp) { // should have "fontname nn" strncpy0(font,pp,100); g_free(pp); pp = font + strlen(font); while (*pp != ' ') pp--; if (pp > font) { size = atoi(pp); if (size < 8) size = 8; zdialog_stuff(zd,"fontsize",size); attr.size = size; *pp = 0; strncpy0(attr.font,font,80); // get fontname = new font name zdialog_stuff(zd,"fontname",font); } } } if (strmatch(event,"fontsize")) // new font size zdialog_fetch(zd,"fontsize",attr.size); if (strmatch(event,"txangle")) zdialog_fetch(zd,"txangle",attr.angle); if (strmatch(event,"txcolor")) // foreground (text) color zdialog_fetch(zd,"txcolor",attr.color[0],20); if (strmatch(event,"bgcolor")) // background color zdialog_fetch(zd,"bgcolor",attr.color[1],20); if (strmatch(event,"tocolor")) // text outline color zdialog_fetch(zd,"tocolor",attr.color[2],20); if (strmatch(event,"shcolor")) // text shadow color zdialog_fetch(zd,"shcolor",attr.color[3],20); if (strmatch(event,"txtransp")) // foreground transparency zdialog_fetch(zd,"txtransp",attr.transp[0]); if (strmatch(event,"bgtransp")) // background transparency zdialog_fetch(zd,"bgtransp",attr.transp[1]); if (strmatch(event,"totransp")) // text outline transparency zdialog_fetch(zd,"totransp",attr.transp[2]); if (strmatch(event,"shtransp")) // text shadow transparency zdialog_fetch(zd,"shtransp",attr.transp[3]); if (strmatch(event,"towidth")) // text outline width zdialog_fetch(zd,"towidth",attr.towidth); if (strmatch(event,"shwidth")) // text shadow width zdialog_fetch(zd,"shwidth",attr.shwidth); if (strmatch(event,"shangle")) // text shadow angle zdialog_fetch(zd,"shangle",attr.shangle); if (strmatch(event,"radius")) // text emboss radius zdialog_fetch(zd,"radius",attr.emboss[0]); if (strmatch(event,"depth")) // text emboss depth zdialog_fetch(zd,"depth",attr.emboss[1]); gentext(&attr); // build text image from text and attributes if (textpresent) write(1); // update text on image return 1; } // mouse function, set position for text on image void drawtext_names::mousefunc() { using namespace drawtext_names; if (LMclick) { // left mouse click Tpx = Mxclick; // new text position on image Tpy = Myclick; write(1); // erase old, write new text on image } if (RMclick) { // right mouse click write(2); // erase old text, if any Tpx = Tpy = -1; } if (Mxdrag || Mydrag) // mouse dragged { Tpx = Mxdrag; // new text position on image Tpy = Mydrag; write(1); // erase old, write new text on image } LMclick = RMclick = Mxdrag = Mydrag = 0; return; } // write text on image at designated location // mode: 1 erase old and write to new position // 2 erase old and write nothing void drawtext_names::write(int mode) { using namespace drawtext_names; if (! E1pxm) return; // can happen with wild key bashing float *pix1, *pix3; uint8 *pixT; int px1, py1, px3, py3, done; float e3part, Ot, Om, Ob; static int orgx1, orgy1, ww1, hh1; // old text image overlap rectangle int orgx2, orgy2, ww2, hh2; // new overlap rectangle int nc = E1pxm->nc, pcc = nc * sizeof(float); int rad, depth, dx, dy, rgb; float kernel[23][23]; // emboss radius <= 10 float R, sumpix,*pixN; PXM *E9pxm; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); if (textpresent) { for (py3 = orgy1; py3 < orgy1 + hh1; py3++) // erase prior text image for (px3 = orgx1; px3 < orgx1 + ww1; px3++) // replace E3 pixels with E1 pixels { // in prior overlap rectangle if (px3 < 0 || px3 >= Eww) continue; if (py3 < 0 || py3 >= Ehh) continue; pix1 = PXMpix(E1pxm,px3,py3); pix3 = PXMpix(E3pxm,px3,py3); memcpy(pix3,pix1,pcc); } } done = 0; if (mode == 2) done = 1; // erase only if (! *attr.text) done = 2; // no text defined if (Tpx < 0 && Tpy < 0) done = 3; // no position defined if (done) { if (textpresent) { Fpaint3(orgx1,orgy1,ww1,hh1,cr); // update window to erase old text textpresent = 0; // mark no text present CEF->Fmods--; } draw_context_destroy(draw_context); return; } ww2 = attr.pxb_text->ww; // text image size hh2 = attr.pxb_text->hh; if (Tpx >= Eww) Tpx = Eww-1; // if off image, pull back within if (Tpy >= Ehh) Tpy = Ehh-1; orgx2 = Tpx - ww2/2; // copy-to image3 location orgy2 = Tpy - hh2/2; if (orgx2 < 0) orgx2 = 0; if (orgy2 < 0) orgy2 = 0; if (orgx2 + ww2 > Eww) ww2 = Eww - orgx2; if (orgy2 + hh2 > Ehh) hh2 = Ehh - orgy2; for (py1 = 0; py1 < hh2; py1++) // loop all pixels in text image for (px1 = 0; px1 < ww2; px1++) { px3 = orgx2 + px1; // copy-to image3 pixel py3 = orgy2 + py1; if (px3 < 0 || px3 >= Eww) continue; // omit parts beyond edges if (py3 < 0 || py3 >= Ehh) continue; pixT = PXBpix(attr.pxb_text,px1,py1); // copy-from text pixel pix3 = PXMpix(E3pxm,px3,py3); // copy-to image pixel e3part = pixT[3] / 256.0; // text image transparency pix3[0] = pixT[0] + e3part * pix3[0]; // combine text part + image part pix3[1] = pixT[1] + e3part * pix3[1]; pix3[2] = pixT[2] + e3part * pix3[2]; if (nc > 3) { Ot = (1.0 - e3part); // text opacity Om = pix3[3] / 256.0; // image opacity Ob = 1.0 - (1.0 - Ot) * (1.0 - Om); // combined opacity pix3[3] = 255.0 * Ob; } } rad = attr.emboss[0]; // emboss text pixels in image depth = attr.emboss[1]; if (rad && depth) { E9pxm = PXM_copy_area(E3pxm,orgx2,orgy2,ww2,hh2); R = 0.1 * depth / (rad * rad + 1); for (dy = -rad; dy <= rad; dy++) // build kernel with radius and depth for (dx = -rad; dx <= rad; dx++) kernel[dx+rad][dy+rad] = R * (dx + dy); kernel[rad][rad] = 1; // kernel center cell = 1 for (py1 = 0; py1 < hh2; py1++) // loop all pixels in text image for (px1 = 0; px1 < ww2; px1++) { pixT = PXBpix(attr.pxb_text,px1,py1); // text pixel e3part = pixT[3] / 256.0; // transparency if (e3part > 0.99) continue; // omit transparent areas px3 = orgx2 + px1; // image3 pixel py3 = orgy2 + py1; if (px3 < 0 || px3 >= Eww) continue; // omit parts beyond edges if (py3 < 0 || py3 >= Ehh) continue; pix3 = PXMpix(E3pxm,px3,py3); // text in image pixel for (rgb = 0; rgb < 3; rgb++) { sumpix = 0; for (dy = -rad; dy <= rad; dy++) // loop surrounding block of pixels for (dx = -rad; dx <= rad; dx++) { if (px1+dx < 0 || px1+dx >= ww2) continue; if (py1+dy < 0 || py1+dy >= hh2) continue; pixN = PXMpix(E9pxm,px1+dx,py1+dy); R = kernel[dx+rad][dy+rad]; sumpix += R * pixN[rgb]; } if (sumpix < 0) sumpix = 0; if (sumpix > 255) sumpix = 255; pix3[rgb] = sumpix; } } PXM_free(E9pxm); } if (textpresent) { Fpaint3(orgx1,orgy1,ww1,hh1,cr); // update window to erase old text textpresent = 0; CEF->Fmods--; } // (updates together to reduce flicker) Fpaint3(orgx2,orgy2,ww2,hh2,cr); // update window for new text draw_context_destroy(draw_context); textpresent = 1; // mark text is present CEF->Fmods++; // increase mod count CEF->Fsaved = 0; orgx1 = orgx2; // remember overlap rectangle orgy1 = orgy2; // for next call ww1 = ww2; hh1 = hh2; return; } // load text and attributes into dialog from a file void load_text(zdialog *zd) { FILE *fid; int err, nn; ch *pp, *pp2, *file, buff[1200]; ch *dialogtitle = TX("load text data from a file"); textattr_t attr; file = zgetfile(dialogtitle,MWIN,"file",markup_folder); // get input file from user if (! file) return; fid = fopen(file,"r"); // open for read if (! fid) { zmessageACK(Mwin,strerror(errno)); zfree(file); return; } pp = fgets_trim(buff,1200,fid); // read text string if (! pp) goto badfile; if (! strmatchN(pp,"text string: ",13)) goto badfile; pp += 13; if (strlen(pp) < 2) goto badfile; repl_Nstrs(pp,attr.text,999,"\\n","\n",null); // replace "\n" with newline char. pp = fgets_trim(buff,1200,fid); // read font and size if (! pp) goto badfile; if (! strmatchN(pp,"font: ",6)) goto badfile; pp += 6; strTrim(pp); pp2 = (ch *) zstrstr(pp,"size: "); if (! pp2) goto badfile; *pp2 = 0; pp2 += 6; strncpy0(attr.font,pp,80); attr.size = atoi(pp2); if (attr.size < 8) goto badfile; pp = fgets_trim(buff,1200,fid); // read text attributes if (! pp) goto badfile; nn = sscanf(pp,"attributes: %f %s %s %s %s %d %d %d %d %d %d %d", &attr.angle, attr.color[0], attr.color[1], attr.color[2], attr.color[3], &attr.transp[0], &attr.transp[1], &attr.transp[2], &attr.transp[3], &attr.towidth, &attr.shwidth, &attr.shangle); if (nn != 12) goto badfile; err = fclose(fid); if (err) { zmessageACK(Mwin,strerror(errno)); zfree(file); return; } zdialog_stuff(zd,"text",attr.text); // stuff zdialog fields zdialog_stuff(zd,"fontname",attr.font); zdialog_stuff(zd,"fontsize",attr.size); zdialog_stuff(zd,"txangle",attr.angle); zdialog_stuff(zd,"txcolor",attr.color[0]); zdialog_stuff(zd,"bgcolor",attr.color[1]); zdialog_stuff(zd,"tocolor",attr.color[2]); zdialog_stuff(zd,"shcolor",attr.color[3]); zdialog_stuff(zd,"txtransp",attr.transp[0]); zdialog_stuff(zd,"bgtransp",attr.transp[1]); zdialog_stuff(zd,"totransp",attr.transp[2]); zdialog_stuff(zd,"shtransp",attr.transp[3]); zdialog_stuff(zd,"towidth",attr.towidth); zdialog_stuff(zd,"shwidth",attr.shwidth); zdialog_stuff(zd,"shangle",attr.shangle); return; badfile: // project file had a problem fclose(fid); zmessageACK(Mwin,TX("text file is defective")); printf("*** text file: %s\n",buff); } // save text and attributes from dialog to a file void save_text(zdialog *zd) { ch *dialogtitle = TX("save text data to a file"); FILE *fid; ch *file, text2[1200]; textattr_t attr; file = zgetfile(dialogtitle,MWIN,"save",markup_folder); // get output file from user if (! file) return; fid = fopen(file,"w"); // open for write if (! fid) { zmessageACK(Mwin,strerror(errno)); zfree(file); return; } zdialog_fetch(zd,"text",attr.text,1000); // get text and attributes from zdialog zdialog_fetch(zd,"fontname",attr.font,80); zdialog_fetch(zd,"fontsize",attr.size); zdialog_fetch(zd,"txangle",attr.angle); zdialog_fetch(zd,"txcolor",attr.color[0],20); zdialog_fetch(zd,"bgcolor",attr.color[1],20); zdialog_fetch(zd,"tocolor",attr.color[2],20); zdialog_fetch(zd,"shcolor",attr.color[3],20); zdialog_fetch(zd,"txtransp",attr.transp[0]); zdialog_fetch(zd,"bgtransp",attr.transp[1]); zdialog_fetch(zd,"totransp",attr.transp[2]); zdialog_fetch(zd,"shtransp",attr.transp[3]); zdialog_fetch(zd,"towidth",attr.towidth); zdialog_fetch(zd,"shwidth",attr.shwidth); zdialog_fetch(zd,"shangle",attr.shangle); repl_Nstrs(attr.text,text2,1200,"\n","\\n",null); // replace newlines with "\n" fprintf(fid,"text string: %s\n",text2); fprintf(fid,"font: %s size: %d \n",attr.font, attr.size); fprintf(fid,"attributes: %.4f %s %s %s %s %d %d %d %d %d %d %d \n", attr.angle, attr.color[0], attr.color[1], attr.color[2], attr.color[3], attr.transp[0], attr.transp[1], attr.transp[2], attr.transp[3], attr.towidth, attr.shwidth, attr.shangle); fclose(fid); return; } /************************************************************************************** Create a graphic image with text, any color, any font, any angle. Add outline and shadow colors. Apply transparencies. struct textattr_t // attributes for gentext() function ch text[1000]; // text to generate image from ch font[80]; // font name int size; // font size int tww, thh; // generated image size, unrotated float angle; // text angle, degrees float sinT, cosT; // trig funcs for text angle ch color[4][20]; // text, backing, outline, shadow "R|G|B" int transp[4]; // corresponding transparencies 0-255 int towidth; // outline width, pixels int shwidth; // shadow width int shangle; // shadow angle -180...+180 PXB *pxb_text; // output image with text/outline/shadow ************************************/ int gentext(textattr_t *attr) { PXB * gentext_outline(textattr_t *, PXB *); PXB * gentext_shadow(textattr_t *, PXB *); PangoFontDescription *pfont; PangoLayout *playout; cairo_surface_t *surface; cairo_t *cr; float angle; int txred, txgreen, txblue; int bgred, bggreen, bgblue; int tored, togreen, toblue; int shred, shgreen, shblue; float txtransp, bgtransp, totransp, shtransp; PXB *pxb_temp1, *pxb_temp2; uint8 *cairo_data, *cpix; uint8 *pix1, *pix2; int px, py, ww, hh; ch font[100]; // font name and size int red, green, blue; float txpart, topart, shpart, bgpart; if (! *attr->text) strcpy(attr->text," "); // no text if (attr->pxb_text) PXB_free(attr->pxb_text); snprintf(font,100,"%s %d",attr->font,attr->size); // font name and size together angle = attr->angle; // text angle, degrees attr->sinT = sin(angle/57.296); // trig funcs for text angle attr->cosT = cos(angle/57.296); txred = atoi(substring(attr->color[0],'|',1)); // get text foreground color txgreen = atoi(substring(attr->color[0],'|',2)); txblue = atoi(substring(attr->color[0],'|',3)); bgred = atoi(substring(attr->color[1],'|',1)); // get text background color bggreen = atoi(substring(attr->color[1],'|',2)); bgblue = atoi(substring(attr->color[1],'|',3)); tored = atoi(substring(attr->color[2],'|',1)); // get text outline color togreen = atoi(substring(attr->color[2],'|',2)); toblue = atoi(substring(attr->color[2],'|',3)); shred = atoi(substring(attr->color[3],'|',1)); // get text shadow color shgreen = atoi(substring(attr->color[3],'|',2)); shblue = atoi(substring(attr->color[3],'|',3)); txtransp = 0.01 * attr->transp[0]; // get transparencies bgtransp = 0.01 * attr->transp[1]; // text, background, outline, shadow totransp = 0.01 * attr->transp[2]; shtransp = 0.01 * attr->transp[3]; pfont = pango_font_description_from_string(font); // make layout with text playout = gtk_widget_create_pango_layout(Fdrawin,null); if (! playout) zappcrash("gentext(): cannot create pango layout"); pango_layout_set_font_description(playout,pfont); pango_layout_set_text(playout,attr->text,-1); pango_layout_get_pixel_size(playout,&ww,&hh); ww += 2 + 0.2 * attr->size; // compensate bad font metrics hh += 2 + 0.1 * attr->size; attr->tww = ww; // save text image size before rotate attr->thh = hh; surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24,ww,hh); // cairo output image cr = cairo_create(surface); pango_cairo_show_layout(cr,playout); // write text layout to image cairo_data = cairo_image_surface_get_data(surface); // get text image pixels pxb_temp1 = PXB_make(ww+5,hh,3); // create PXB for (py = 0; py < hh; py++) // copy text image to PXB for (px = 0; px < ww; px++) { cpix = cairo_data + 4 * (ww * py + px); // pango output is monocolor pix2 = PXBpix(pxb_temp1,px+4,py); // small pad before text pix2[0] = cpix[3]; // use red [0] for text intensity pix2[1] = pix2[2] = 0; } pango_font_description_free(pfont); // free resources g_object_unref(playout); cairo_destroy(cr); cairo_surface_destroy(surface); pxb_temp2 = gentext_outline(attr,pxb_temp1); // add text outline if any if (pxb_temp2) { // using green [1] for outline intensity PXB_free(pxb_temp1); pxb_temp1 = pxb_temp2; } pxb_temp2 = gentext_shadow(attr,pxb_temp1); // add text shadow color if any if (pxb_temp2) { // using blue [2] for shadow intensity PXB_free(pxb_temp1); pxb_temp1 = pxb_temp2; } if (fabsf(angle) > 0.1) { // rotate text if wanted pxb_temp2 = PXB_rotate(pxb_temp1,angle); PXB_free(pxb_temp1); pxb_temp1 = pxb_temp2; } ww = pxb_temp1->ww; // text image input PXB hh = pxb_temp1->hh; pxb_temp2 = PXB_make(ww,hh,4); // text image output PXB for (py = 0; py < hh; py++) // loop all pixels in text image for (px = 0; px < ww; px++) { pix1 = PXBpix(pxb_temp1,px,py); // copy-from pixel (text + outline + shadow) pix2 = PXBpix(pxb_temp2,px,py); // copy-to pixel txpart = pix1[0] / 256.0; // text opacity 0-1 topart = pix1[1] / 256.0; // outline shpart = pix1[2] / 256.0; // shadow bgpart = (1.0 - txpart - topart - shpart); // background txpart = txpart * (1.0 - txtransp); // reduce for transparencies topart = topart * (1.0 - totransp); shpart = shpart * (1.0 - shtransp); bgpart = bgpart * (1.0 - bgtransp); red = txpart * txred + topart * tored + shpart * shred + bgpart * bgred; green = txpart * txgreen + topart * togreen + shpart * shgreen + bgpart * bggreen; blue = txpart * txblue + topart * toblue + shpart * shblue + bgpart * bgblue; pix2[0] = red; // output total red, green, blue pix2[1] = green; pix2[2] = blue; pix2[3] = 255 * (1.0 - txpart - topart - shpart - bgpart); // image part visible through text } PXB_free(pxb_temp1); attr->pxb_text = pxb_temp2; return 0; } // add an outline color to the text character edges // red color [0] is original monocolor text // use green color [1] for added outline PXB * gentext_outline(textattr_t *attr, PXB *pxb1) { PXB *pxb2; int toww, ww1, hh1, ww2, hh2; int px, py, dx, dy; uint8 *pix1, *pix2; float theta; toww = attr->towidth; // text outline color width if (toww == 0) return 0; // zero ww1 = pxb1->ww; // input PXB dimensions hh1 = pxb1->hh; ww2 = ww1 + toww * 2; // add margins for outline width hh2 = hh1 + toww * 2; pxb2 = PXB_make(ww2,hh2,3); // output PXB for (py = 0; py < hh1; py++) // copy text pixels to outline pixels for (px = 0; px < ww1; px++) // displaced by outline width { pix1 = PXBpix(pxb1,px,py); pix2 = PXBpix(pxb2,px+toww,py+toww); pix2[0] = pix1[0]; } theta = 0.7 / toww; for (theta = 0; theta < 6.3; theta += 0.7/toww) // displace outline pixels in all directions { dx = roundf(toww * sinf(theta)); dy = roundf(toww * cosf(theta)); for (py = 0; py < hh1; py++) for (px = 0; px < ww1; px++) { pix1 = PXBpix(pxb1,px,py); pix2 = PXBpix(pxb2,px+toww+dx,py+toww+dy); if (pix2[1] < pix1[0] - pix2[0]) // compare text to outline brightness pix2[1] = pix1[0] - pix2[0]; // brighter part is outline pixel } } return pxb2; // pix2[0] / pix2[1] = text / outline } // add a shadow to the text character edges // red color [0] is original monocolor text intensity // green color [1] is added outline if any // use blue color [2] for added shadow PXB * gentext_shadow(textattr_t *attr, PXB *pxb1) { PXB *pxb2; int shww, ww1, hh1, ww2, hh2; int px, py, dx, dy; uint8 *pix1, *pix2; float theta; shww = attr->shwidth; // text shadow width if (shww == 0) return 0; // zero ww1 = pxb1->ww; // input PXB dimensions hh1 = pxb1->hh; ww2 = ww1 + shww * 2; // add margins for shadow width hh2 = hh1 + shww * 2; pxb2 = PXB_make(ww2,hh2,3); // output PXB for (py = 0; py < hh1; py++) // copy text pixels to shadow pixels for (px = 0; px < ww1; px++) // displaced by shadow width { pix1 = PXBpix(pxb1,px,py); pix2 = PXBpix(pxb2,px+shww,py+shww); pix2[0] = pix1[0]; pix2[1] = pix1[1]; } theta = (90 - attr->shangle) / 57.3; // degrees to radians, 0 = to the right dx = roundf(shww * sinf(theta)); dy = roundf(shww * cosf(theta)); for (py = 0; py < hh1; py++) // displace text by shadow width for (px = 0; px < ww1; px++) { pix1 = PXBpix(pxb1,px,py); pix2 = PXBpix(pxb2,px+shww+dx,py+shww+dy); if (pix2[2] < pix1[0] + pix1[1] - pix2[0] - pix2[1]) // compare text+outline to shadow pixels pix2[2] = pix1[0] + pix1[1] - pix2[0] - pix2[1]; // brighter part is shadow pixel } return pxb2; // pix2[0] / pix2[1] / pix2[2] } // = text / outline / shadow brightness /**************************************************************************************/ // draw a line or arrow on top of the image namespace drawline_names { lineattr_t attr; // line/arrow attributes and image int mpx, mpy; // mouse position on image int linepresent; // flag, line present on image int orgx1, orgy1, ww1, hh1; // old line image overlap rectangle int orgx2, orgy2, ww2, hh2; // new overlap rectangle zdialog *zd; int dialog_event(zdialog *zd, ch *event); // dialog event function void mousefunc(); // mouse event function void write(int mode); // write line on image editfunc EFdrawline; } void m_draw_line(GtkWidget *, ch *menu) { using namespace drawline_names; ch *intro = TX("Enter line or arrow properties in dialog, \n" "click/drag on image, right click to remove"); printf("m_draw_line \n"); EFdrawline.menufunc = m_draw_line; EFdrawline.menuname = "Markup Line"; EFdrawline.Farea = 1; // select area ignored EFdrawline.mousefunc = mousefunc; if (! edit_setup(EFdrawline)) return; // setup edit /*** ________________________________________________ | Draw line or arrow on image | | | | Enter line or arrow properties in dialog, | | click/drag on image, right click to remove. | | | | Line length [____] width [____] | | Arrow head [x] left [x] right | | | | Color Transp. Width Angle | | line [###] [____] [___] | lncolor lntransp lnangle | backing [###] [____] | bgcolor bgtransp | outline [###] [____] [___] | tocolor totransp towidth | shadow [###] [____] [___] [___] | shcolor shtransp shwidth shangle | | | [Commit] [OK] [X] | |________________________________________________| ***/ zd = zdialog_new(TX("Draw line or arrow on image"),Mwin,"Commit","OK","X",null); EFdrawline.zd = zd; EFdrawline.mousefunc = mousefunc; EFdrawline.menufunc = m_draw_line; // allow restart zdialog_add_widget(zd,"label","intro","dialog",intro,"space=3"); zdialog_add_widget(zd,"hbox","hbline","dialog",0,"space=3"); zdialog_add_widget(zd,"label","lablength","hbline",TX("Line length"),"space=5"); zdialog_add_widget(zd,"zspin","length","hbline","2|9999|1|20"); zdialog_add_widget(zd,"label","space","hbline",0,"space=10"); zdialog_add_widget(zd,"label","labwidth","hbline",TX("Width"),"space=5"); zdialog_add_widget(zd,"zspin","width","hbline","1|99|1|2"); zdialog_add_widget(zd,"hbox","hbarrow","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labarrow","hbarrow",TX("Arrow head"),"space=5"); zdialog_add_widget(zd,"check","larrow","hbarrow",TX("Left")); zdialog_add_widget(zd,"label","space","hbarrow",0,"space=10"); zdialog_add_widget(zd,"check","rarrow","hbarrow",TX("Right")); zdialog_add_widget(zd,"hbox","hbcol","dialog"); zdialog_add_widget(zd,"vbox","vbcol1","hbcol",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbcol2","hbcol",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbcol3","hbcol",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbcol4","hbcol",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbcol5","hbcol",0,"homog|space=5"); zdialog_add_widget(zd,"label","space","vbcol1"); zdialog_add_widget(zd,"label","labline","vbcol1",TX("line")); zdialog_add_widget(zd,"label","labback","vbcol1",TX("backing")); zdialog_add_widget(zd,"label","laboutln","vbcol1",TX("outline")); zdialog_add_widget(zd,"label","labshadow","vbcol1",TX("shadow")); zdialog_add_widget(zd,"label","labcol","vbcol2",TX("Color")); zdialog_add_widget(zd,"colorbutt","lncolor","vbcol2","0|0|0"); zdialog_add_widget(zd,"colorbutt","bgcolor","vbcol2","255|255|255"); zdialog_add_widget(zd,"colorbutt","tocolor","vbcol2","255|0|0"); zdialog_add_widget(zd,"colorbutt","shcolor","vbcol2","255|0|0"); zdialog_add_widget(zd,"label","labcol","vbcol3",TX("Transp.")); zdialog_add_widget(zd,"zspin","lntransp","vbcol3","0|100|1|0"); zdialog_add_widget(zd,"zspin","bgtransp","vbcol3","0|100|1|0"); zdialog_add_widget(zd,"zspin","totransp","vbcol3","0|100|1|0"); zdialog_add_widget(zd,"zspin","shtransp","vbcol3","0|100|1|0"); zdialog_add_widget(zd,"label","labw","vbcol4",TX("Width")); zdialog_add_widget(zd,"label","space","vbcol4"); zdialog_add_widget(zd,"label","space","vbcol4"); zdialog_add_widget(zd,"zspin","towidth","vbcol4","0|30|1|0"); zdialog_add_widget(zd,"zspin","shwidth","vbcol4","0|50|1|0"); zdialog_add_widget(zd,"label","labw","vbcol5",TX("Angle")); zdialog_add_widget(zd,"zspin","lnangle","vbcol5","-360|360|0.1|0"); zdialog_add_widget(zd,"label","space","vbcol5"); zdialog_add_widget(zd,"label","space","vbcol5"); zdialog_add_widget(zd,"zspin","shangle","vbcol5","-360|360|1|0"); zdialog_add_ttip(zd,"Commit",TX("fix line in layout and start new line")); zdialog_load_inputs(zd); // restore prior inputs memset(&attr,0,sizeof(attr)); zdialog_fetch(zd,"length",attr.length); // get defaults or prior inputs zdialog_fetch(zd,"width",attr.width); zdialog_fetch(zd,"larrow",attr.larrow); zdialog_fetch(zd,"rarrow",attr.rarrow); zdialog_fetch(zd,"lnangle",attr.angle); zdialog_fetch(zd,"lncolor",attr.color[0],20); zdialog_fetch(zd,"bgcolor",attr.color[1],20); zdialog_fetch(zd,"tocolor",attr.color[2],20); zdialog_fetch(zd,"shcolor",attr.color[3],20); zdialog_fetch(zd,"lntransp",attr.transp[0]); zdialog_fetch(zd,"bgtransp",attr.transp[1]); zdialog_fetch(zd,"totransp",attr.transp[2]); zdialog_fetch(zd,"shtransp",attr.transp[3]); zdialog_fetch(zd,"towidth",attr.towidth); zdialog_fetch(zd,"shwidth",attr.shwidth); zdialog_fetch(zd,"shangle",attr.shangle); genline(&attr); // generate initial line takeMouse(mousefunc,dragcursor); // connect mouse function linepresent = 0; // no line on image yet mpx = mpy = -1; // no position defined yet zdialog_run(zd,dialog_event,"save"); // run dialog, parallel return; } // dialog event and completion callback function int drawline_names::dialog_event(zdialog *zd, ch *event) { using namespace drawline_names; int yn; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (zd->zstat) { if (zd->zstat == 1) { // [Commit] current line to image zd->zstat = 0; write(1); linepresent = 0; // (no old line to erase) mpx = mpy = -1; PXM_free(E1pxm); // copy edits in E3 to source image E1 E1pxm = PXM_copy(E3pxm); Fpaintnow(); // update image synchronous return 1; } if (zd->zstat == 2) { if (CEF->Fmods) edit_done(0); // [OK], complete pending edit else edit_cancel(0); if (attr.pxb_line) PXB_free(attr.pxb_line); m_markup(0,0); // restore main markup dialog return 1; } if (CEF->Fmods) { yn = zmessageYN(Mwin,TX("discard changes?")); // unsaved changes if (! yn) { zd->zstat = 0; // back out return 1; } } edit_cancel(0); // cancel, no changes if (attr.pxb_line) PXB_free(attr.pxb_line); m_markup(0,0); // restore main markup dialog return 1; } if (strmatch(event,"focus")) { // toggle mouse capture takeMouse(mousefunc,dragcursor); // connect mouse function return 1; } if (strmatch(event,"length")) // line length zdialog_fetch(zd,"length",attr.length); if (strmatch(event,"width")) // line width zdialog_fetch(zd,"width",attr.width); if (strmatch(event,"larrow")) // left arrow head zdialog_fetch(zd,"larrow",attr.larrow); if (strmatch(event,"rarrow")) // right arrow head zdialog_fetch(zd,"rarrow",attr.rarrow); if (strmatch(event,"lnangle")) // line angle zdialog_fetch(zd,"lnangle",attr.angle); if (strmatch(event,"lncolor")) // foreground (line) color zdialog_fetch(zd,"lncolor",attr.color[0],20); if (strmatch(event,"bgcolor")) // background color zdialog_fetch(zd,"bgcolor",attr.color[1],20); if (strmatch(event,"tocolor")) // line outline color zdialog_fetch(zd,"tocolor",attr.color[2],20); if (strmatch(event,"shcolor")) // line shadow color zdialog_fetch(zd,"shcolor",attr.color[3],20); if (strmatch(event,"lntransp")) // foreground transparency zdialog_fetch(zd,"lntransp",attr.transp[0]); if (strmatch(event,"bgtransp")) // background transparency zdialog_fetch(zd,"bgtransp",attr.transp[1]); if (strmatch(event,"totransp")) // line outline transparency zdialog_fetch(zd,"totransp",attr.transp[2]); if (strmatch(event,"shtransp")) // line shadow transparency zdialog_fetch(zd,"shtransp",attr.transp[3]); if (strmatch(event,"towidth")) // line outline width zdialog_fetch(zd,"towidth",attr.towidth); if (strmatch(event,"shwidth")) // line shadow width zdialog_fetch(zd,"shwidth",attr.shwidth); if (strmatch(event,"shangle")) // line shadow angle zdialog_fetch(zd,"shangle",attr.shangle); genline(&attr); // build line image from attributes write(1); // write on image return 1; } // mouse function, set new position for line on image void drawline_names::mousefunc() { using namespace drawline_names; float ax1, ay1, ax2, ay2, ax3, ay3; // line/arrow end points, mid point float angle, rad, l2; float amx, amy; float d1, d2, d3, sinv; if (RMclick) { // right mouse click write(2); // erase old line, if any mpx = mpy = -1; LMclick = RMclick = Mxdrag = Mydrag = 0; return; } if (LMclick + Mxdrag + Mydrag == 0) return; if (LMclick) { mpx = Mxclick; // new line position on image mpy = Myclick; } else { mpx = Mxdrag; mpy = Mydrag; } LMclick = RMclick = Mxdrag = Mydrag = 0; if (! linepresent) { orgx2 = mpx; orgy2 = mpy; write(1); return; } angle = attr.angle; // move closest line endpoint to mouse rad = -angle / 57.296; // posn and leave other endpoint fixed l2 = attr.length / 2.0; ww2 = attr.pxb_line->ww; // line image buffer hh2 = attr.pxb_line->hh; amx = ww2 / 2.0; // line midpoint within line image amy = hh2 / 2.0; ax1 = amx - l2 * cosf(rad) + 0.5; // line end points ay1 = amy + l2 * sinf(rad) + 0.5; ax2 = amx + l2 * cosf(rad) + 0.5; ay2 = amy - l2 * sinf(rad) + 0.5; ax3 = (ax1 + ax2) / 2; // line mid point ay3 = (ay1 + ay2) / 2; d1 = (mpx-ax1-orgx1) * (mpx-ax1-orgx1) + (mpy-ay1-orgy1) * (mpy-ay1-orgy1); d2 = (mpx-ax2-orgx1) * (mpx-ax2-orgx1) + (mpy-ay2-orgy1) * (mpy-ay2-orgy1); d3 = (mpx-amx-orgx1) * (mpx-amx-orgx1) + (mpy-amy-orgy1) * (mpy-amy-orgy1); d1 = sqrtf(d1); // mouse - end point distances d2 = sqrtf(d2); d3 = sqrtf(d3); // mouse - mid point distance if (d1 < d2 && d1 < d3) { // move ax1/ay1 end to mouse ax2 += orgx1; ay2 += orgy1; ax1 = mpx; ay1 = mpy; attr.length = d2 + 0.5; sinv = (ay1-ay2) / d2; if (sinv > 1.0) sinv = 1.0; if (sinv < -1.0) sinv = -1.0; rad = asinf(sinv); angle = -57.296 * rad; if (mpx > ax2) angle = -180 - angle; } else if (d2 < d1 && d2 < d3) { // move ax2/ay2 end to mouse ax1 += orgx1; ay1 += orgy1; ax2 = mpx; ay2 = mpy; attr.length = d1 + 0.5; sinv = (ay1-ay2) / d1; if (sinv > 1.0) sinv = 1.0; if (sinv < -1.0) sinv = -1.0; rad = asinf(sinv); angle = -57.296 * rad; if (mpx < ax1) angle = -180 - angle; } else { // move entire arrow unchanged ax1 += (mpx - ax3); ay1 += (mpy - ay3); ax2 += (mpx - ax3); ay2 += (mpy - ay3); } if (angle < -180) angle += 360; if (angle > 180) angle -= 360; attr.angle = angle; genline(&attr); ww2 = attr.pxb_line->ww; hh2 = attr.pxb_line->hh; amx = (ax1 + ax2) / 2.0; amy = (ay1 + ay2) / 2.0; orgx2 = amx - ww2 / 2.0; orgy2 = amy - hh2 / 2.0; write(1); zdialog_stuff(zd,"lnangle",attr.angle); zdialog_stuff(zd,"length",attr.length); return; } // write line on image at designated location // mode: 1 erase old and write to new position // 2 erase old and write nothing void drawline_names::write(int mode) { using namespace drawline_names; float *pix1, *pix3; uint8 *pixL; int px1, py1, px3, py3, done; float e3part, Ot, Om, Ob; int nc = E1pxm->nc, pcc = nc * sizeof(float); cairo_t *cr = draw_context_create(Fgdkwin,draw_context); if (linepresent) { for (py3 = orgy1; py3 < orgy1 + hh1; py3++) // erase prior line image for (px3 = orgx1; px3 < orgx1 + ww1; px3++) // replace E3 pixels with E1 pixels { // in prior overlap rectangle if (px3 < 0 || px3 >= Eww) continue; if (py3 < 0 || py3 >= Ehh) continue; pix1 = PXMpix(E1pxm,px3,py3); pix3 = PXMpix(E3pxm,px3,py3); memcpy(pix3,pix1,pcc); } } done = 0; if (mode == 2) done = 1; // erase only if (mpx < 0 && mpy < 0) done = 1; // no position defined if (done) { if (linepresent) { Fpaint3(orgx1,orgy1,ww1,hh1,cr); // update window to erase old line linepresent = 0; // mark no line present } draw_context_destroy(draw_context); return; } ww2 = attr.pxb_line->ww; // line image buffer hh2 = attr.pxb_line->hh; for (py1 = 0; py1 < hh2; py1++) // loop all pixels in line image for (px1 = 0; px1 < ww2; px1++) { px3 = orgx2 + px1; // copy-to image3 pixel py3 = orgy2 + py1; if (px3 < 0 || px3 >= Eww) continue; // omit parts beyond edges if (py3 < 0 || py3 >= Ehh) continue; pixL = PXBpix(attr.pxb_line,px1,py1); // copy-from line pixel pix3 = PXMpix(E3pxm,px3,py3); // copy-to image pixel e3part = pixL[3] / 256.0; // line image transparency pix3[0] = pixL[0] + e3part * pix3[0]; // combine line part + image part pix3[1] = pixL[1] + e3part * pix3[1]; pix3[2] = pixL[2] + e3part * pix3[2]; if (nc > 3) { Ot = (1.0 - e3part); // line opacity Om = pix3[3] / 256.0; // image opacity Ob = 1.0 - (1.0 - Ot) * (1.0 - Om); // combined opacity pix3[3] = 255.0 * Ob; } } if (linepresent) { Fpaint3(orgx1,orgy1,ww1,hh1,cr); // update window to erase old line linepresent = 0; } // (updates together to reduce flicker) Fpaint3(orgx2,orgy2,ww2,hh2,cr); // update window for new line draw_context_destroy(draw_context); CEF->Fmods++; CEF->Fsaved = 0; linepresent = 1; // mark line is present orgx1 = orgx2; // remember overlap rectangle orgy1 = orgy2; // for next call ww1 = ww2; hh1 = hh2; return; } /**************************************************************************************/ // Create a graphic image of a line or arrow, any color, // any size, any angle. Add outline and shadow colors. int genline(lineattr_t *attr) { PXB * genline_outline(lineattr_t *, PXB *); PXB * genline_shadow(lineattr_t *, PXB *); cairo_surface_t *surface; cairo_t *cr; float angle; int lnred, lngreen, lnblue; int bgred, bggreen, bgblue; int tored, togreen, toblue; int shred, shgreen, shblue; float lntransp, bgtransp, totransp, shtransp; PXB *pxb_temp1, *pxb_temp2; uint8 *cairo_data, *cpix; uint8 *pix1, *pix2; float length, width; int px, py, ww, hh; int red, green, blue; float lnpart, topart, shpart, bgpart; if (attr->pxb_line) PXB_free(attr->pxb_line); angle = attr->angle; // line angle, degrees attr->sinT = sin(angle/57.296); // trig funcs for line angle attr->cosT = cos(angle/57.296); lnred = atoi(substring(attr->color[0],'|',1)); // get line foreground color lngreen = atoi(substring(attr->color[0],'|',2)); lnblue = atoi(substring(attr->color[0],'|',3)); bgred = atoi(substring(attr->color[1],'|',1)); // get line background color bggreen = atoi(substring(attr->color[1],'|',2)); bgblue = atoi(substring(attr->color[1],'|',3)); tored = atoi(substring(attr->color[2],'|',1)); // get line outline color togreen = atoi(substring(attr->color[2],'|',2)); toblue = atoi(substring(attr->color[2],'|',3)); shred = atoi(substring(attr->color[3],'|',1)); // get line shadow color shgreen = atoi(substring(attr->color[3],'|',2)); shblue = atoi(substring(attr->color[3],'|',3)); lntransp = 0.01 * attr->transp[0]; // get transparencies bgtransp = 0.01 * attr->transp[1]; // line, background, outline, shadow totransp = 0.01 * attr->transp[2]; shtransp = 0.01 * attr->transp[3]; length = attr->length; // line dimensions width = attr->width; ww = length + 20; // create cairo surface hh = width + 20; // with margins all around if (attr->larrow || attr->rarrow) // wider if arrow head used hh += width * 4; attr->lww = ww; attr->lhh = hh; surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24,ww,hh); cr = cairo_create(surface); cairo_set_antialias(cr,CAIRO_ANTIALIAS_BEST); cairo_set_line_width(cr,width); cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND); cairo_move_to(cr, 10, hh/2.0); // draw line in middle of surface cairo_line_to(cr, length+10, hh/2.0); if (attr->larrow) { // add arrow heads if req. cairo_move_to(cr, 10, hh/2.0); cairo_line_to(cr, 10 + 2 * width, hh/2.0 - 2 * width); cairo_move_to(cr, 10, hh/2.0); cairo_line_to(cr, 10 + 2 * width, hh/2.0 + 2 * width); } if (attr->rarrow) { cairo_move_to(cr, length+10, hh/2.0); cairo_line_to(cr, length+10 - 2 * width, hh/2.0 - 2 * width); cairo_move_to(cr, length+10, hh/2.0); cairo_line_to(cr, length+10 - 2 * width, hh/2.0 + 2 * width); } cairo_stroke(cr); cairo_data = cairo_image_surface_get_data(surface); // cairo image pixels pxb_temp1 = PXB_make(ww,hh,3); // create PXB for (py = 0; py < hh; py++) // copy image to PXB for (px = 0; px < ww; px++) { cpix = cairo_data + 4 * (ww * py + px); // pango output is monocolor pix2 = PXBpix(pxb_temp1,px,py); pix2[0] = cpix[3]; // use red [0] for line intensity pix2[1] = pix2[2] = 0; } cairo_destroy(cr); // free resources cairo_surface_destroy(surface); pxb_temp2 = genline_outline(attr,pxb_temp1); // add line outline if any if (pxb_temp2) { // using green [1] for outline intensity PXB_free(pxb_temp1); pxb_temp1 = pxb_temp2; } pxb_temp2 = genline_shadow(attr,pxb_temp1); // add line shadow color if any if (pxb_temp2) { // using blue [2] for shadow intensity PXB_free(pxb_temp1); pxb_temp1 = pxb_temp2; } if (fabsf(angle) > 0.1) { // rotate line if wanted pxb_temp2 = PXB_rotate(pxb_temp1,angle); PXB_free(pxb_temp1); pxb_temp1 = pxb_temp2; } ww = pxb_temp1->ww; // line image input PXB hh = pxb_temp1->hh; pxb_temp2 = PXB_make(ww,hh,4); // line image output PXB for (py = 0; py < hh; py++) // loop all pixels in line image for (px = 0; px < ww; px++) { pix1 = PXBpix(pxb_temp1,px,py); // copy-from pixel (line + outline + shadow) pix2 = PXBpix(pxb_temp2,px,py); // copy-to pixel lnpart = pix1[0] / 256.0; topart = pix1[1] / 256.0; shpart = pix1[2] / 256.0; bgpart = (1.0 - lnpart - topart - shpart); lnpart = lnpart * (1.0 - lntransp); topart = topart * (1.0 - totransp); shpart = shpart * (1.0 - shtransp); bgpart = bgpart * (1.0 - bgtransp); red = lnpart * lnred + topart * tored + shpart * shred + bgpart * bgred; green = lnpart * lngreen + topart * togreen + shpart * shgreen + bgpart * bggreen; blue = lnpart * lnblue + topart * toblue + shpart * shblue + bgpart * bgblue; pix2[0] = red; // output total red, green blue pix2[1] = green; pix2[2] = blue; pix2[3] = 255 * (1.0 - lnpart - topart - shpart - bgpart); // image part visible through line } PXB_free(pxb_temp1); attr->pxb_line = pxb_temp2; return 0; } // add an outline color to the line edges // red color [0] is original monocolor line // use green color [1] for added outline PXB * genline_outline(lineattr_t *attr, PXB *pxb1) { PXB *pxb2; int toww, ww1, hh1, ww2, hh2; int px, py, dx, dy; uint8 *pix1, *pix2; float theta; toww = attr->towidth; // line outline color width if (toww == 0) return 0; // zero ww1 = pxb1->ww; // input PXB dimensions hh1 = pxb1->hh; ww2 = ww1 + toww * 2; // add margins for outline width hh2 = hh1 + toww * 2; pxb2 = PXB_make(ww2,hh2,3); // output PXB for (py = 0; py < hh1; py++) // copy line pixels to outline pixels for (px = 0; px < ww1; px++) // displaced by outline width { pix1 = PXBpix(pxb1,px,py); pix2 = PXBpix(pxb2,px+toww,py+toww); pix2[0] = pix1[0]; } theta = 0.7 / toww; for (theta = 0; theta < 6.3; theta += 0.7/toww) // displace outline pixels in all directions { dx = roundf(toww * sinf(theta)); dy = roundf(toww * cosf(theta)); for (py = 0; py < hh1; py++) for (px = 0; px < ww1; px++) { pix1 = PXBpix(pxb1,px,py); pix2 = PXBpix(pxb2,px+toww+dx,py+toww+dy); if (pix2[1] < pix1[0] - pix2[0]) // compare line to outline brightness pix2[1] = pix1[0] - pix2[0]; // brighter part is outline pixel } } return pxb2; // pix2[0] / pix2[1] = line / outline } // add a shadow to the line edges // red color [0] is original monocolor line intensity // green color [1] is added outline if any // use blue color [2] for added shadow PXB * genline_shadow(lineattr_t *attr, PXB *pxb1) { PXB *pxb2; int shww, ww1, hh1, ww2, hh2; int px, py, dx, dy; uint8 *pix1, *pix2; float theta; shww = attr->shwidth; // line shadow width if (shww == 0) return 0; // zero ww1 = pxb1->ww; // input PXB dimensions hh1 = pxb1->hh; ww2 = ww1 + shww * 2; // add margins for shadow width hh2 = hh1 + shww * 2; pxb2 = PXB_make(ww2,hh2,3); // output PXB for (py = 0; py < hh1; py++) // copy line pixels to shadow pixels for (px = 0; px < ww1; px++) // displaced by shadow width { pix1 = PXBpix(pxb1,px,py); pix2 = PXBpix(pxb2,px+shww,py+shww); pix2[0] = pix1[0]; pix2[1] = pix1[1]; } theta = (90 - attr->shangle) / 57.3; // degrees to radians, 0 = to the right dx = roundf(shww * sinf(theta)); dy = roundf(shww * cosf(theta)); for (py = 0; py < hh1; py++) // displace line by shadow width for (px = 0; px < ww1; px++) { pix1 = PXBpix(pxb1,px,py); pix2 = PXBpix(pxb2,px+shww+dx,py+shww+dy); if (pix2[2] < pix1[0] + pix1[1] - pix2[0] - pix2[1]) // compare line+outline to shadow pixels pix2[2] = pix1[0] + pix1[1] - pix2[0] - pix2[1]; // brighter part is shadow pixel } return pxb2; // pix2[0] / pix2[1] / pix2[2] } // = line / outline / shadow brightness /**************************************************************************************/ // draw a box around an area drag-selected with the mouse namespace drawbox_names { editfunc EFdrawbox; int RGB[3]; // box line color int width; // box line width int bx1, by1, bx2, by2; // box NW and SE corners } // menu function void m_draw_box(GtkWidget *, ch *menu) { using namespace drawbox_names; int drawbox_dialog_event(zdialog *zd, ch *event); void drawbox_mousefunc(); printf("m_draw_box \n"); zdialog *zd; ch *tip = TX("drag mouse to draw box \n" "shift + drag center to move box \n" "shift + drag edge to move edge"); EFdrawbox.menufunc = m_draw_box; EFdrawbox.menuname = "Markup Box"; EFdrawbox.Farea = 1; // select area ignored EFdrawbox.mousefunc = drawbox_mousefunc; if (! edit_setup(EFdrawbox)) return; /*** ___________________________________ | Draw box on image | | drag mouse to draw box | | shift + drag center to move box | | shift + drag edge to move edge | | | | line color [###] line width [__] | | | | [Commit] [OK] [X] | |___________________________________| ***/ zd = zdialog_new(TX("Draw box on image"),Mwin,TX("Commit"),"OK","X",null); EFdrawbox.zd = zd; zdialog_add_widget(zd,"label","labtip","dialog",tip,"space=3"); zdialog_add_widget(zd,"hbox","space","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbline","dialog"); zdialog_add_widget(zd,"label","labrgb","hbline",TX("line color"),"space=3"); zdialog_add_widget(zd,"colorbutt","RGB","hbline","255|0|0","space=3"); zdialog_add_widget(zd,"label","space","hbline",0,"space=5"); zdialog_add_widget(zd,"label","labwidth","hbline",TX("line width"),"space=3"); zdialog_add_widget(zd,"zspin","width","hbline","1|20|1|1","space=3"); zdialog_add_ttip(zd,"Commit",TX("fix box in layout and start new box")); zdialog_load_inputs(zd); zdialog_run(zd,drawbox_dialog_event,"save"); zdialog_send_event(zd,"init"); takeMouse(drawbox_mousefunc,dragcursor); bx1 = by1 = bx2 = by2 = 0; // no box yet return; } // dialog event and completion function int drawbox_dialog_event(zdialog *zd, ch *event) { using namespace drawbox_names; ch color[20]; ch *pp; int yn; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (zd->zstat) { if (zd->zstat == 1) { // [commit] and stay open zd->zstat = 0; PXM_free(E1pxm); // copy edits in E3 to source image E1 E1pxm = PXM_copy(E3pxm); Fpaintnow(); // update image synchronous return 1; } if (zd->zstat == 2) { // [OK] done if (CEF->Fmods) edit_done(0); else edit_cancel(0); m_markup(0,0); // restart main markup dialog return 1; } if (CEF->Fmods) { // [X] cancel yn = zmessageYN(Mwin,TX("discard changes?")); // unsaved changes if (! yn) { zd->zstat = 0; // back out return 1; } } edit_cancel(0); // cancel, no changes m_markup(0,0); // restore main markup dialog return 1; } if (zstrstr("init RGB width",event)) // set new line color and width { zdialog_fetch(zd,"RGB",color,19); pp = substring(color,"|",1); if (pp) RGB[0] = atoi(pp); pp = substring(color,"|",2); if (pp) RGB[1] = atoi(pp); pp = substring(color,"|",3); if (pp) RGB[2] = atoi(pp); zdialog_fetch(zd,"width",width); } return 1; } // mouse function // record drag start and current mouse position // draw box with opposing corners at these positions void drawbox_mousefunc() { using namespace drawbox_names; void drawline(int x1, int y1, int x2, int y2, int RGB[3], int width); int mx, my, dx, dy, bump; int cx, cy, rx, ry, rr; int min, dt, db, dl, dr; if (Mxdrag || Mydrag) // drag underway { PXM_copy(E1pxm,E3pxm); // erase prior if (KBshiftkey && bx1) // shift key, move prior box { dx = Mxdrag - Mxdown; // new drag displacement dy = Mydrag - Mydown; Mxdown = Mxdrag; // reset drag Mydown = Mydrag; Mxdrag = Mydrag = 0; mx = Mxdown; // mouse position my = Mydown; cx = (bx1 + bx2) / 2; // box center cy = (by1 + by2) / 2; rx = mx - cx; // get mouse distance from center ry = my - cy; rr = sqrt(rx*rx + ry*ry); dt = abs(my - by1); // get mouse distance from each edge db = abs(my - by2); // top, bottom, left, right dl = abs(mx - bx1); dr = abs(mx - bx2); min = dt; // find minimum edge distance if (db < min) min = db; if (dl < min) min = dl; if (dr < min) min = dr; if (rr < min) { // mouse is closer to center bx1 += dx; // move unchanged box by1 += dy; bx2 += dx; by2 += dy; } else { if (min == dt) by1 = my; // move line closest to mouse if (min == db) by2 = my; if (min == dl) bx1 = mx; if (min == dr) bx2 = mx; } } else { // no shift key: create new box bx1 = Mxdown; by1 = Mydown; bx2 = Mxdrag; by2 = Mydrag; Mxdrag = Mydrag = 0; } bump = 1; // fill last pixel if (by2 < by1) bump = -1; // (bx2,by2) at NW corner of pixel drawline(bx1,by1,bx2,by1,RGB,width); drawline(bx1,by2,bx2,by2,RGB,width); drawline(bx1,by1,bx1,by2,RGB,width); drawline(bx2,by1,bx2,by2+bump,RGB,width); CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); } return; } /**************************************************************************************/ // draw an oval around an area drag-selected with the mouse namespace drawoval_names { editfunc EFdrawoval; int RGB[3]; // oval line color int width; // oval line width int type = 1; // 1/2 = circle/oval int mx1, my1, mx2, my2; // mouse drag coordinates float exa, exb; // ellipse axes float angle; // ellipse angle int Fupdate; } // menu function void m_draw_oval(GtkWidget *, ch *menu) { using namespace drawoval_names; int drawoval_dialog_event(zdialog *zd, ch *event); void drawoval_mousefunc(); printf("m_draw_oval \n"); zdialog *zd; ch *tip = TX("drag mouse down/right to draw oval \n" "shift + drag center to move oval \n" "shift + drag lower right edge to change"); EFdrawoval.menufunc = m_draw_oval; EFdrawoval.menuname = "Markup Oval"; EFdrawoval.Farea = 1; // select area ignored EFdrawoval.mousefunc = drawoval_mousefunc; if (! edit_setup(EFdrawoval)) return; /*** _________________________________________ | Draw oval on image | | drag mouse down/right to draw oval | | shift + drag center to move oval | | shift + drag lower right edge to change | | | | line color [###] line width [__] | | [x] circle [x] oval angle [__] | | | | [Commit] [OK] [X] | |_________________________________________| ***/ zd = zdialog_new(TX("Draw oval on image"),Mwin,TX("Commit"),"OK","X",null); EFdrawoval.zd = zd; zdialog_add_widget(zd,"label","labtip","dialog",tip,"space=3"); zdialog_add_widget(zd,"hbox","space","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbline","dialog"); zdialog_add_widget(zd,"label","labline","hbline",TX("line color"),"space=3"); zdialog_add_widget(zd,"colorbutt","RGB","hbline","255|0|0","space=3"); zdialog_add_widget(zd,"label","space","hbline",0,"space=5"); zdialog_add_widget(zd,"label","labwidth","hbline",TX("line width"),"space=3"); zdialog_add_widget(zd,"zspin","width","hbline","1|20|1|1","space=3"); zdialog_add_widget(zd,"hbox","hbco","dialog"); zdialog_add_widget(zd,"check","circle","hbco",TX("circle"),"space=8"); zdialog_add_widget(zd,"label","space","hbco",0,"space=10"); zdialog_add_widget(zd,"check","oval","hbco",TX("oval"),"space=3"); zdialog_add_widget(zd,"label","labangle","hbco",TX("angle"),"space=3"); zdialog_add_widget(zd,"zspin","angle","hbco","0|90|1|0"); zdialog_add_ttip(zd,"Commit",TX("fix oval in layout and start new oval")); zdialog_load_inputs(zd); zdialog_fetch(zd,"angle",angle); zdialog_run(zd,drawoval_dialog_event,"save"); zdialog_send_event(zd,"init"); takeMouse(drawoval_mousefunc,dragcursor); mx1 = my1 = 0; // no oval yet Fupdate = 0; return; } // dialog event and completion function int drawoval_dialog_event(zdialog *zd, ch *event) { using namespace drawoval_names; void drawoval_mousefunc(); ch color[20]; ch *pp; int yn; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (zd->zstat) { if (zd->zstat == 1) { // [commit] zd->zstat = 0; PXM_free(E1pxm); // copy edits in E3 to source image E1 E1pxm = PXM_copy(E3pxm); Fpaintnow(); // update image synchronous return 1; } if (zd->zstat == 2) { // [OK] done if (CEF->Fmods) edit_done(0); else edit_cancel(0); m_markup(0,0); // restart main markup dialog return 1; } if (CEF->Fmods) { // [X] cancel yn = zmessageYN(Mwin,TX("discard changes?")); // unsaved changes if (! yn) { zd->zstat = 0; // back out return 1; } } edit_cancel(0); // cancel, no changes m_markup(0,0); // restore main markup dialog return 1; } if (zstrstr("init RGB width",event)) // set line color { zdialog_fetch(zd,"RGB",color,19); pp = substring(color,"|",1); if (pp) RGB[0] = atoi(pp); pp = substring(color,"|",2); if (pp) RGB[1] = atoi(pp); pp = substring(color,"|",3); if (pp) RGB[2] = atoi(pp); zdialog_fetch(zd,"width",width); // line width zdialog_stuff(zd,"oval",0); zdialog_stuff(zd,"circle",0); if (type == 1) zdialog_stuff(zd,"circle",1); if (type == 2) zdialog_stuff(zd,"oval",1); if (zstrstr("RGB width",event)) Fupdate = 1; } if (zstrstr("oval circle",event)) { zdialog_stuff(zd,"oval",0); zdialog_stuff(zd,"circle",0); zdialog_stuff(zd,event,1); if (strmatch(event,"oval")) type = 2; else type = 1; Fupdate = 1; } if (strmatch(event,"angle")) { zdialog_fetch(zd,"angle",angle); Fupdate = 1; } if (Fupdate) drawoval_mousefunc(); return 1; } // mouse function // record drag start and current mouse position // draw oval (ellipse) with major/minor axes from drag X/Y distances. void drawoval_mousefunc() { using namespace drawoval_names; void * drawoval_draw(void *arg); int dx, dy, rx, ry, rr; if (! Mxdrag && ! Mydrag && ! Fupdate) return; Fupdate = 0; if (Mxdrag || Mydrag) // drag underway { if (KBshiftkey && mx1) // shift key: move prior oval { dx = Mxdrag - Mxdown; // new drag displacement dy = Mydrag - Mydown; Mxdown = Mxdrag; // reset drag Mydown = Mydrag; Mxdrag = Mydrag = 0; rx = mx1 - Mxdown; // get mouse distance from prior center ry = my1 - Mydown; rr = sqrtf(rx*rx + ry*ry); if (rr < 0.6 * exa || rr < 0.6 * exb) { // small, move unchanged oval mx1 += dx; // move center my1 += dy; } mx2 += dx; // move edge (change size) my2 += dy; } else { // no shift key: create new oval mx1 = Mxdown; my1 = Mydown; mx2 = Mxdrag; my2 = Mydrag; Mxdrag = Mydrag = 0; } exa = abs(mx2 - mx1); // ellipse constants from exb = abs(my2 - my1); // enclosing rectangle } drawoval_draw(0); // faster than thread return; } // drawoval thread function - runs parallel with GTK stuff void * drawoval_draw(void *arg) { using namespace drawoval_names; void rotatepoint(float T, int cx, int cy, int &px, int &py); void drawpoint(int px, int py, int RGB[3], int W); int px, py; float a2, b2; float x, y, x2, y2, cx, cy; float T; PXM_copy(E1pxm,E3pxm); // erase prior if (type == 1) // make a circle { if (exa > exb) exb = exa; // ellipse axes are equal else exa = exb; a2 = exa * exa; b2 = exb * exb; cx = mx1; // center at drag origin cy = my1; for (y = -exb; y < exb; y++) // step through y values { y2 = y * y; x2 = a2 * (1 - y2 / b2); x = sqrtf(x2); // corresp. x values, + and - py = y + cy; px = cx - x + 0.5; drawpoint(px,py,RGB,width); // draw 2 points on ellipse px = cx + x + 0.5; drawpoint(px,py,RGB,width); } for (x = -exa; x < exa; x++) // step through x values { x2 = x * x; y2 = b2 * (1 - x2 / a2); y = sqrtf(y2); // corresp. y values, + and - px = cx + x; py = cy - y + 0.5; drawpoint(px,py,RGB,width); // draw 2 points on ellipse py = cy + y + 0.5; drawpoint(px,py,RGB,width); } } if (type == 2) // make an ellipse { a2 = exa * exa; b2 = exb * exb; cx = mx1; // center at drag origin cy = my1; T = PI * angle / 180; for (y = -exb; y < exb; y++) // step through y values { y2 = y * y; x2 = a2 * (1 - y2 / b2); x = sqrtf(x2); // corresp. x values, + and - px = cx - x + 0.5; py = y + cy; rotatepoint(T,cx,cy,px,py); drawpoint(px,py,RGB,width); // draw 2 points on ellipse px = cx + x + 0.5; py = y + cy; rotatepoint(T,cx,cy,px,py); drawpoint(px,py,RGB,width); } for (x = -exa; x < exa; x++) // step through x values { x2 = x * x; y2 = b2 * (1 - x2 / a2); y = sqrtf(y2); // corresp. y values, + and - px = cx + x; py = cy - y + 0.5; rotatepoint(T,cx,cy,px,py); drawpoint(px,py,RGB,width); // draw 2 points on ellipse px = cx + x; py = cy + y + 0.5; rotatepoint(T,cx,cy,px,py); drawpoint(px,py,RGB,width); } } CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); return 0; } /**************************************************************************************/ // rotate a point (px,py) around point (cx,cy) by angle T void rotatepoint(float T, int cx, int cy, int &px, int &py) { float R, T2; R = sqrtf((px-cx)*(px-cx) + (py-cy)*(py-cy)); T2 = acosf((px-cx)/R); if (py < cy) T2 = - T2; T2 += T; px = cx + R * cosf(T2); py = cy + R * sinf(T2); return; } /**************************************************************************************/ // draw a line from pixel (x1,y1) to (x2,y2) with given pixel width. // color is RGB[3], range 0-255. void drawline(int x1, int y1, int x2, int y2, int RGB[3], int W) { void drawpoint(int px, int py, int RGB[3], int W); float M; int px, py, inc; if (abs(x1-x2) > abs(y1-y2)) // line more horizontal { M = 1.0 * (y2-y1) / (x2-x1); inc = 1; if (x2 < x1) inc = -1; for (px = x1; px != x2; px += inc) { // loop points in line center py = y1 + M * (px-x1); drawpoint(px,py,RGB,W); // color center + neighbor points } } else { M = 1.0 * (x2-x1) / (y2-y1); // line more vertical inc = 1; if (y2 < y1) inc = -1; for (py = y1; py != y2; py += inc) { px = x1 + M * (py-y1); drawpoint(px,py,RGB,W); } } return; } // draw one 'point' of line (point size = line width) void drawpoint(int px, int py, int RGB[3], int W) { int qx, qy, w1, w2; float *pix3; w1 = W / 2; w2 = w1; if (!(W & 1)) w2 -= 1; for (qy = py-w1; qy <= py+w2; qy++) // loop pixels overlapping point for (qx = px-w1; qx <= px+w2; qx++) { if (qx < 0 || qx > Eww-1) continue; if (qy < 0 || qy > Ehh-1) continue; pix3 = PXMpix(E3pxm,qx,qy); pix3[0] = RGB[0]; pix3[1] = RGB[1]; pix3[2] = RGB[2]; } return; } /**************************************************************************************/ // make a black & white or color positive or negative, or sepia image namespace colormode_names { editfunc EFcolormode; int mode; float mblend; } // menu function void m_color_mode(GtkWidget *, ch *menu) { using namespace colormode_names; int colormode_dialog_event(zdialog *zd, ch *event); void * colormode_thread(void *); F1_help_topic = TX("COLOR MODE"); printf("m_color_mode \n"); EFcolormode.menuname = "Color Mode"; EFcolormode.menufunc = m_color_mode; EFcolormode.threadfunc = colormode_thread; EFcolormode.FprevReq = 1; // use preview EFcolormode.Farea = 2; // select area usable EFcolormode.Fpaintedits = 1; // allow paint edits EFcolormode.Fscript = 1; // scripting supported if (! edit_setup(EFcolormode)) return; // setup edit /*** _____________________________ | Color Mode | | | | [_] reset | // check boxes | [_] black/white positive | | [_] black/white negative | | [_] color negative | | [_] RGB -> GBR | | [_] RGB -> BRG | | [_] sepia | | | | 0% ===========[]==== 100% | | | | [OK] [X] | |_____________________________| ***/ zdialog *zd = zdialog_new(TX("Color Mode"),Mwin,"OK","X",null); EFcolormode.zd = zd; zdialog_add_widget(zd,"check","reset","dialog",TX("reset")); zdialog_add_widget(zd,"check","b&wpos","dialog",TX("black/white positive")); zdialog_add_widget(zd,"check","b&wneg","dialog",TX("black/white negative")); zdialog_add_widget(zd,"check","colneg","dialog",TX("color negative")); zdialog_add_widget(zd,"check","rgb-gbr","dialog",TX("RGB -> GBR")); zdialog_add_widget(zd,"check","rgb-brg","dialog",TX("RGB -> BRG")); zdialog_add_widget(zd,"check","sepia","dialog",TX("sepia")); zdialog_add_widget(zd,"hbox","hbmblend","dialog"); zdialog_add_widget(zd,"label","lab0","hbmblend","0%","space=5"); zdialog_add_widget(zd,"hscale","mblend","hbmblend","0.0|1.0|0.01|1.0","expand"); zdialog_add_widget(zd,"label","lab100","hbmblend","100%","space=8"); zdialog_resize(zd,300,0); zdialog_run(zd,colormode_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int colormode_dialog_event(zdialog *zd, ch *event) { using namespace colormode_names; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (strmatch(event,"fullsize")) { // from select area edit_fullsize(); // get full size image thread_signal(); thread_wait(); // required for paint edits return 1; } if (zd->zstat) { if (zd->zstat == 1) { edit_fullsize(); // get full size image thread_signal(); edit_addhist("mode:%d blend:%.2f",mode,mblend); // edit params > edit hist edit_done(0); // commit edit } else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"focus")) return 1; if (zstrstr("reset b&wpos b&wneg colneg rgb-gbr rgb-brg sepia",event)) { zdialog_stuff(zd,"reset",0); zdialog_stuff(zd,"b&wpos",0); zdialog_stuff(zd,"b&wneg",0); zdialog_stuff(zd,"colneg",0); zdialog_stuff(zd,"rgb-gbr",0); zdialog_stuff(zd,"rgb-brg",0); zdialog_stuff(zd,"sepia",0); zdialog_stuff(zd,event,1); if (strmatch(event,"reset")) mode = 0; if (strmatch(event,"b&wpos")) mode = 1; if (strmatch(event,"b&wneg")) mode = 2; if (strmatch(event,"colneg")) mode = 3; if (strmatch(event,"rgb-gbr")) mode = 4; if (strmatch(event,"rgb-brg")) mode = 5; if (strmatch(event,"sepia")) mode = 6; } zdialog_fetch(zd,"mblend",mblend); if (mode == 0) { edit_reset(); return 1; } thread_signal(); return 1; } // thread function void * colormode_thread(void *) { using namespace colormode_names; void * colormode_wthread(void *arg); if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(colormode_wthread,NSMP); // worker threads CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved if (! Fpaintedits) Fpaint2(); // update window return 0; } // worker thread functions void * colormode_wthread(void *arg) { using namespace colormode_names; int index = *((int *) (arg)); int px, py, Fend; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float *pix1, *pix3; float brite, ff1, ff2, blend; while (true) { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; G1 = pix1[1]; B1 = pix1[2]; R3 = R9 = pix3[0]; G3 = G9 = pix3[1]; B3 = B9 = pix3[2]; switch (mode) { case 1: { // black and white positive R9 = G9 = B9 = 0.333 * (R1 + G1 + B1); break; } case 2: { // black and white negative R9 = G9 = B9 = 255.9 - 0.333 * (R1 + G1 + B1); break; } case 3: { // color negative R9 = 255.9 - R1; G9 = 255.9 - G1; B9 = 255.9 - B1; break; } case 4: { // RGB - GBR R9 = G1; G9 = B1; B9 = R1; break; } case 5: { // RGB - BRG R9 = B1; G9 = R1; B9 = G1; break; } case 6: { // sepia brite = R1; if (G1 > brite) brite = G1; // max. color level if (B1 > brite) brite = B1; brite = 0.2 * brite + 0.2666 * (R1 + G1 + B1); // brightness, 0.0 ... 255.9 brite = brite * 0.003906; // 0.0 ... 1.0 ff1 = 1.0 - 0.7 * brite; // sepia part, 1.0 ... 0.3 ff2 = 1.0 - ff1; // B & W part, 0.0 ... 0.7 R9 = ff1 * 255.0 + ff2 * 256; // combine max. sepia with white G9 = ff1 * 150.0 + ff2 * 256; B9 = ff1 * 46.0 + ff2 * 256; brite = 0.8333 * (brite + 0.2); // add brightness at low end R9 = R9 * brite; // output = combined color * brightness G9 = G9 * brite; B9 = B9 * brite; break; } } RGBfix(R9,G9,B9); // prevent underflow/overflow if (mblend < 1.0) { // image blend slider ff1 = mblend; ff2 = 1.0 - ff1; R9 = ff1 * R9 + ff2 * R1; // blend input and edited images G9 = ff1 * G9 + ff2 * G1; B9 = ff1 * B9 + ff2 * B1; } if (Fpaintedits) // mouse paint edit { if (blend > 0) { // increase edit R3 = blend * R9 + (1-blend) * R3; G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { // decrease edit R3 = -blend * R1 + (1+blend) * R3; G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full image edit { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // Current edit function is applied to areas painted with the mouse. // Mouse can be weak or strong, and edits are applied incrementally. void m_paint_edits(GtkWidget *, ch *) // menu function { int paint_edits_dialog_event(zdialog *, ch *event); // dialog event function void paint_edits_mousefunc(); // mouse function ch *title = TX("Paint Edits"); F1_help_topic = TX("PAINT EDITS"); printf("m_paint_edits \n"); if (Fbusy()) { printf("paint edits: function busy \n"); return; } if (! CEF) { // edit func must be active zmessageACK(Mwin,TX("Edit function must be active")); return; } if (! CEF->Fpaintedits) { zmessageACK(Mwin,TX("Edit function can not use Paint Edits")); return; } if (zd_paintedits) { zmessageACK(Mwin,TX("Paint Edits already active")); return; } if (CEF->Fpreview) zdialog_send_event(CEF->zd,"fullsize"); // use full-size image /*** ______________________________________ | Press F1 for help | | | | Mouse Radius [____] | | Power: Center [____] Edge [____] | | | | [OK] | |______________________________________| ***/ zd_paintedits = zdialog_new(title,Mwin,"OK",null); zdialog *zd = zd_paintedits; zdialog_add_widget(zd,"label","labhelp1","dialog",TX("Press F1 for help"),"space=5"); zdialog_add_widget(zd,"hbox","hbr","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labr","hbr",TX("Mouse Radius"),"space=5"); zdialog_add_widget(zd,"zspin","radius","hbr","2|500|1|50"); zdialog_add_widget(zd,"hbox","hbt","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labtc","hbt",TX("Power: Center"),"space=5"); zdialog_add_widget(zd,"zspin","center","hbt","0|100|1|50"); zdialog_add_widget(zd,"label","labte","hbt",TX("Edge"),"space=5"); zdialog_add_widget(zd,"zspin","edge","hbt","0|100|1|0"); Mradius = 50; MCpower = 50; MEpower = 0; zdialog_load_inputs(zd); zdialog_fetch(zd,"radius",Mradius); zdialog_fetch(zd,"center",MCpower); zdialog_fetch(zd,"edge",MEpower); zdialog_run(zd,paint_edits_dialog_event,"save"); // run dialog - parallel Fpaintedits = 1; // activate mouse paint mode return; } // dialog event and completion function int paint_edits_dialog_event(zdialog *zd, ch *event) { void paint_edits_mousefunc(); // mouse function if (strmatch(event,"focus")) // toggle mouse capture { if (CEF && CEF->Fpaintedits) // check edit function OK takeMouse(paint_edits_mousefunc,0); else { // no edit function active freeMouse(); return 1; } } if (strmatch(event,"done")) zd->zstat = 1; // from edit_done() if (strmatch(event,"cancel")) zd->zstat = 2; // from edit_cancel() if (zd->zstat) // done or cancel { if (CEF) zdialog_send_event(CEF->zd,"done"); // complete edit zdialog_free(zd); // kill dialog zd_paintedits = 0; Fpaintedits = 0; // paint_edits not active freeMouse(); // disconnect mouse return 1; } if (strmatch(event,"radius")) zdialog_fetch(zd,"radius",Mradius); // set mouse radius if (strmatch(event,"center")) zdialog_fetch(zd,"center",MCpower); // set mouse center power 0-100 if (strmatch(event,"edge")) zdialog_fetch(zd,"edge",MEpower); // set mouse edge power 0-100 return 1; } // mouse function - adjust edit strength for areas within mouse radius // "edge distance" is increased for more strength, decreased for less void paint_edits_mousefunc() { if (! CEF || ! CEF->Fpaintedits) { // no active edit Fpaintedits = 0; freeMouse(); // disconnect mouse return; } if (zd_paintedits != zdialog_focus_zd) { // KB focus lost 26.8 freeMouse(); draw_mousecircle(0,0,0,1,0); return; } draw_mousecircle(Mxposn,Myposn,Mradius,0,0); // show mouse selection circle if (! Mdrag) return; // wait for drag event Mxdrag = Mydrag = 0; // prevent image drag zdialog_send_event(CEF->zd,"paint"); // do edit function within mouse Fpaintmouse(Mxposn,Myposn,Mradius); // update drawing window draw_mousecircle(Mxposn,Myposn,Mradius,0,0); // refresh mouse selection circle return; } /**************************************************************************************/ // Pixel paint function - paint individual pixels with the mouse. // The mouse circle paints a selected color. namespace paint_image_names { int paint_dialog_event(zdialog* zd, ch *event); void paint_mousefunc(); void paint_dopixels(int px, int py); // update pixel block void paint_savepixB(int px, int py); // save pixel block for poss. undo void paint_undolastB(); // undo last pixel block, free memory void paint_freefirstB(); // free memory for first pixel block void paint_freeallB(); // free memory for all pixel blocks uint8 RGB[3] = { 0, 0, 0 }; // color to paint int mode; // 1/2 = paint / erase int Mrad; // mouse radius int Fptran = 0; // flag, paint over transparent areas int Fdrag = 0; // flag, mouse drags image int nc, ac; // no. channels, alpha channel float kernel[202][202]; // Mrad <= 100 int64 maxmem = (int64) 4000 * MEGA; // max. pixel block memory (4 GB) int64 totmem; // pixB memory allocated int maxpixB = 10000; // max. pixel blocks int totpixB = 0; // total pixel blocks int pixBseq = 0; // last pixel block sequence no. typedef struct { // pixel block before edit int seq; // block sequence no. uint16 px, py; // center pixel (radius org.) uint16 radius; // radius of pixel block float pixel[][4]; // array of pixel[npix][4] } pixBmem_t; pixBmem_t **pixBmem = 0; // *pixBmem_t[] int pixBmem_cc = 12; // all except pixel array + pad int pcc4 = 4 * sizeof(float); // pixel cc: RGBA = 4 channels editfunc EFpaint; } // menu function void m_paint_image(GtkWidget *, ch *menu) // separate paint and copy { using namespace paint_image_names; ch *mess1 = TX("shift + left click: pick color from image \n" "left drag: paint color on image \n" // remove click actions "right drag: restore original image"); ch *dash = " \xcc\xb6 "; F1_help_topic = TX("PAINT IMAGE"); printf("m_paint_image \n"); EFpaint.menufunc = m_paint_image; EFpaint.menuname = "Paint Image"; EFpaint.Farea = 2; // select area usable EFpaint.mousefunc = paint_mousefunc; // mouse function if (! edit_setup(EFpaint)) return; // setup edit /**** __________________________________________________ | Paint on Image | | | | shift + left click: pick color from image | | left drag: paint color on image | | right drag: restore original image | | | | paint color [######] [palette] [HSL] | | | | brush size NN ============[]============= | | opacity center NN ==================[]======= | | opacity edge NN ====[]===================== | | | | (o) paint (o) erase [undo last] [undo all] | | [x] include transparent areas | | [x] drag image zoom image [+] [-] | | | | [OK] [X] | |__________________________________________________| ****/ zdialog *zd = zdialog_new(TX("Paint on Image"),Mwin,"OK","X",null); EFpaint.zd = zd; zdialog_add_widget(zd,"label","labm","dialog",mess1,"space=5"); zdialog_add_widget(zd,"hbox","hbp","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labp","hbp",TX("paint color"),"space=5"); zdialog_add_widget(zd,"colorbutt","colorbutt","hbp","255|0|0"); zdialog_add_widget(zd,"label","space","hbp",0,"space=10"); zdialog_add_widget(zd,"button","palette","hbp",TX("palette"),"space=10"); zdialog_add_widget(zd,"button","HSL","hbp","HSL"); zdialog_add_widget(zd,"hbox","hbbru","dialog",0,"space=5"); zdialog_add_widget(zd,"vbox","vbbru1","hbbru",0,"homog|space=1"); zdialog_add_widget(zd,"vbox","vbbru2","hbbru",0,"homog|space=1"); zdialog_add_widget(zd,"vbox","vbbru3","hbbru",0,"homog|expand|space=1"); zdialog_add_widget(zd,"label","labbr","vbbru1",TX("brush size")); zdialog_add_widget(zd,"label","laboc","vbbru1",TX("opacity center")); zdialog_add_widget(zd,"label","laboe","vbbru1",TX("opacity edge")); zdialog_add_widget(zd,"label","labbrNN","vbbru2","NN"); zdialog_add_widget(zd,"label","labocNN","vbbru2","NNN"); zdialog_add_widget(zd,"label","laboeNN","vbbru2","NNN"); zdialog_add_widget(zd,"hscale","Mrad","vbbru3","1|100|1|20","expand"); zdialog_add_widget(zd,"hscale","opccent","vbbru3","1|100|1|50","expand"); zdialog_add_widget(zd,"hscale","opcedge","vbbru3","0|100|1|100","expand"); zdialog_add_widget(zd,"hbox","hbp","dialog",0,"space=3"); zdialog_add_widget(zd,"radio","paint","hbp",TX("paint"),"space=3"); zdialog_add_widget(zd,"radio","erase","hbp",TX("erase")); zdialog_add_widget(zd,"button","undlast","hbp",TX("Undo Last"),"space=5"); zdialog_add_widget(zd,"button","undall","hbp",TX("Undo All")); zdialog_add_widget(zd,"hbox","hbt","dialog",0,"space=3"); zdialog_add_widget(zd,"check","Fptran","hbt",TX("include transparent areas"),"space=3"); zdialog_add_widget(zd,"hbox","hbd","dialog"); zdialog_add_widget(zd,"check","Fdrag","hbd",TX("drag image"),"space=3"); zdialog_add_widget(zd,"label","space","hbd",0,"space=10"); zdialog_add_widget(zd,"label","labzoom","hbd",TX("zoom image"),"space=3"); zdialog_add_widget(zd,"button","zoom+","hbd"," + ","space=3"); zdialog_add_widget(zd,"button","zoom-","hbd",dash,"space=3"); zdialog_rescale(zd,"Mrad",1,2,100); // stretch scales at sensitive end zdialog_rescale(zd,"opccent",1,2,100); zdialog_rescale(zd,"opcedge",0,1,100); zdialog_load_inputs(zd); // preload prior user inputs zdialog_stuff(zd,"Fptran",0); // initialize zdialog_stuff(zd,"paint",1); zdialog_stuff(zd,"erase",0); zdialog_stuff(zd,"Fdrag",0); mode = 1; Fdrag = 0; zdialog_run(zd,paint_dialog_event,"save"); // run dialog, parallel zdialog_send_event(zd,"colorbutt"); // initialize paint color zdialog_send_event(zd,"Mrad"); // get kernel initialized zdialog_fetch(zd,"Fptran",Fptran); // paint over transparent areas totmem = 0; // memory used pixBmem = 0; // pixel block memory totpixB = 0; // pixel blocks pixBseq = 0; ac = 0; nc = E1pxm->nc; // channels, RGBA if (nc > 3) ac = 1; // alpha channel present takeMouse(paint_mousefunc,drawcursor); // connect mouse function return; } // dialog event and completion callback function int paint_image_names::paint_dialog_event(zdialog *zd, ch *event) { using namespace paint_image_names; ch *pp; ch color[20], text[20]; float opccent, opcedge; // center and edge opacities int paint, radius, dx, dy, err; float rad, kern; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat == 1) edit_done(0); // commit edit else edit_cancel(0); // discard edit paint_freeallB(); // free pixel block memory return 1; } draw_mousecircle(0,0,0,1,0); // erase mouse circle if (strmatch(event,"focus")) // toggle mouse capture takeMouse(paint_mousefunc,drawcursor); if (strmatch(event,"colorbutt")) { zdialog_fetch(zd,"colorbutt",color,19); // get paint color from color button pp = substring(color,"|",1); if (pp) RGB[0] = atoi(pp); pp = substring(color,"|",2); if (pp) RGB[1] = atoi(pp); pp = substring(color,"|",3); if (pp) RGB[2] = atoi(pp); } if (strmatch(event,"palette")) err = RGB_chooser(zd,"colorbutt",RGB); // select color from palette if (strmatch(event,"HSL")) { err = HSL_chooser(zd,"colorbutt",RGB); // select color from palette if (err) return 1; snprintf(color,20,"%d|%d|%d",RGB[0],RGB[1],RGB[2]); zdialog_stuff(zd,"colorbutt",color); } if (zstrstr("Mrad opccent opcedge",event)) { zdialog_fetch(zd,"Mrad",Mrad); // get new brush attributes zdialog_fetch(zd,"opccent",opccent); zdialog_fetch(zd,"opcedge",opcedge); sprintf(text,"%3d",Mrad); // stuff corresp. number values zdialog_stuff(zd,"labbrNN",text); sprintf(text,"%3.0f",opccent); zdialog_stuff(zd,"labocNN",text); sprintf(text,"%3.0f",opcedge); zdialog_stuff(zd,"laboeNN",text); opccent = 0.01 * opccent; // opacity 0 ... 1 opcedge = 0.01 * opcedge; opccent = pow(opccent,2.0); // change response curve opcedge = opccent * opcedge; // edge relative to center radius = Mrad; for (dy = -radius; dy <= radius; dy++) // build kernel for (dx = -radius; dx <= radius; dx++) { rad = sqrt(dx*dx + dy*dy); kern = (radius - rad) / radius; // center ... edge >> 1 ... 0 kern = kern * (opccent - opcedge) + opcedge; // opacity center ... edge if (rad > radius) kern = 0; // beyond radius, within square if (kern < 0) kern = 0; if (kern > 1) kern = 1; kernel[dx+radius][dy+radius] = kern; } } if (strmatch(event,"undlast")) // undo last edit (click or drag) paint_undolastB(); if (strmatch(event,"undall")) { // undo all edits edit_reset(); paint_freeallB(); } if (strmatch(event,"Fptran")) // flag, paint over transparency zdialog_fetch(zd,"Fptran",Fptran); if (zstrstr("paint erase",event)) { // set paint or erase mode zdialog_fetch(zd,"paint",paint); if (paint) mode = 1; else mode = 2; } if (strmatch(event,"Fdrag")) // mouse drags image zdialog_fetch(zd,"Fdrag",Fdrag); if (strmatch(event,"zoom+")) m_zoom(0,"in"); // zoom image in or out if (strmatch(event,"zoom-")) m_zoom(0,"out"); return 1; } // mouse function void paint_image_names::paint_mousefunc() // no action on clicks { using namespace paint_image_names; static int pmxdown = 0, pmydown = 0; static int pmxdrag = 0, pmydrag = 0; ch color[20]; float *pix3; zdialog *zd = EFpaint.zd; if (Fdrag) return; // pass through to main() if (LMclick && KBshiftkey) // shift + left mouse click { LMclick = 0; pix3 = PXMpix(E3pxm,Mxclick,Myclick); // pick new color from image RGB[0] = pix3[0]; RGB[1] = pix3[1]; RGB[2] = pix3[2]; snprintf(color,19,"%d|%d|%d",RGB[0],RGB[1],RGB[2]); if (zd) zdialog_stuff(zd,"colorbutt",color); return; } if (Mxdrag || Mydrag) // drag in progress { if (Mxdown != pmxdown || Mydown != pmydown) { // new drag pixBseq++; // new undo seq. no. pmxdown = Mxdown; pmydown = Mydown; } if (Mxdrag == pmxdrag && Mydrag == pmydrag) { // no movement Mxdrag = Mydrag = 0; return; } pmxdrag = Mxdrag; pmydrag = Mydrag; paint_dopixels(Mxdrag,Mydrag); // do 1 block of pixels } draw_mousecircle(Mxposn,Myposn,Mrad,0,0); // draw mouse circle Mxdrag = Mydrag = LMclick = 0; return; } // paint or erase 1 block of pixels within mouse radius of px, py void paint_image_names::paint_dopixels(int px, int py) { using namespace paint_image_names; float *pix1, *pix3; int radius, dx, dy, qx, qy; int ii, ww, hh, dist = 0; int pot = ac * Fptran; // paint over transparent areas float red, green, blue; float kern; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); draw_mousecircle(0,0,0,1,cr); // erase mouse circle ww = Eww; hh = Ehh; paint_savepixB(px,py); // save pixels for poss. undo red = RGB[0]; // paint color green = RGB[1]; blue = RGB[2]; radius = Mrad; if (mode == 1) { // paint CEF->Fmods++; CEF->Fsaved = 0; } for (dy = -radius; dy <= radius; dy++) // loop surrounding block of pixels for (dx = -radius; dx <= radius; dx++) { qx = px + dx; qy = py + dy; if (qx < 0 || qx > ww-1) continue; if (qy < 0 || qy > hh-1) continue; if (sa_stat == sa_stat_fini) { // select area active ii = qy * ww + qx; dist = sa_pixmap[ii]; if (! dist) continue; // pixel is outside area } kern = kernel[dx+radius][dy+radius]; // mouse opacities if (kern == 0) continue; // outside mouse radius pix1 = PXMpix(E1pxm,qx,qy); // source image pixel pix3 = PXMpix(E3pxm,qx,qy); // edited image pixel if (mode == 1 && Mbutton < 2) // paint { kern = kern * (1.0 + 50.0 * wacom_pressure); // wacom if (kern > 1.0) kern = 1.0; pix3[0] = kern * red + (1.0 - kern) * pix3[0]; // overpaints accumulate pix3[1] = kern * green + (1.0 - kern) * pix3[1]; pix3[2] = kern * blue + (1.0 - kern) * pix3[2]; if (pot) pix3[3] = kern * 255.0 + (1.0 - kern) * pix3[3]; // overpaint transparent area } if (mode == 2 || Mbutton >= 2) // erase { kern = kern * (2.0 + 50.0 * wacom_pressure); // wacom if (kern > 1.0) kern = 1.0; if (kern > 1) kern = 1; pix3[0] = kern * pix1[0] + (1.0 - kern) * pix3[0]; // gradual erase pix3[1] = kern * pix1[1] + (1.0 - kern) * pix3[1]; pix3[2] = kern * pix1[2] + (1.0 - kern) * pix3[2]; if (pot) pix3[3] = kern * pix1[3] + (1.0 - kern) * pix3[3]; } } px = px - radius - 1; // repaint modified area py = py - radius - 1; ww = 2 * radius + 3; Fpaint3(px,py,ww,ww,cr); draw_context_destroy(draw_context); return; } // save 1 block of pixels for possible undo void paint_image_names::paint_savepixB(int px, int py) { using namespace paint_image_names; int cc, npix, radius, dx, dy; float *pix3; pixBmem_t *paintsave1; if (! pixBmem) { // first time cc = maxpixB * sizeof(void *); pixBmem = (pixBmem_t **) zmalloc(cc,"paint image"); totpixB = 0; totmem = 0; } if (totmem > maxmem || totpixB == maxpixB) // free memory for oldest updates while (totmem > 0.7 * maxmem || totpixB > 0.7 * maxpixB) paint_freefirstB(); radius = Mrad; npix = 0; for (dy = -radius; dy <= radius; dy++) // count pixels in block for (dx = -radius; dx <= radius; dx++) { if (px + dx < 0 || px + dx > Eww-1) continue; if (py + dy < 0 || py + dy > Ehh-1) continue; npix++; } cc = npix * pcc4 + pixBmem_cc; paintsave1 = (pixBmem_t *) zmalloc(cc,"paint image"); // allocate memory for block pixBmem[totpixB] = paintsave1; totpixB += 1; totmem += cc; paintsave1->seq = pixBseq; // save pixel block poop paintsave1->px = px; paintsave1->py = py; paintsave1->radius = radius; npix = 0; for (dy = -radius; dy <= radius; dy++) // save pixels in block for (dx = -radius; dx <= radius; dx++) { if (px + dx < 0 || px + dx > Eww-1) continue; if (py + dy < 0 || py + dy > Ehh-1) continue; pix3 = PXMpix(E3pxm,(px+dx),(py+dy)); // edited image pixel paintsave1->pixel[npix][0] = pix3[0]; paintsave1->pixel[npix][1] = pix3[1]; paintsave1->pixel[npix][2] = pix3[2]; if (ac) paintsave1->pixel[npix][3] = pix3[3]; npix++; } return; } // undo last pixel block (newest edit) and free memory void paint_image_names::paint_undolastB() { using namespace paint_image_names; int ii, cc, npix, radius; int ww, px, py, dx, dy; float *pix3; pixBmem_t *paintsave1; for (ii = totpixB-1; ii >= 0; ii--) { paintsave1 = pixBmem[ii]; if (paintsave1->seq != pixBseq) break; px = paintsave1->px; py = paintsave1->py; radius = paintsave1->radius; npix = 0; for (dy = -radius; dy <= radius; dy++) for (dx = -radius; dx <= radius; dx++) { if (px + dx < 0 || px + dx > Eww-1) continue; if (py + dy < 0 || py + dy > Ehh-1) continue; pix3 = PXMpix(E3pxm,(px+dx),(py+dy)); pix3[0] = paintsave1->pixel[npix][0]; pix3[1] = paintsave1->pixel[npix][1]; pix3[2] = paintsave1->pixel[npix][2]; if (ac) pix3[3] = paintsave1->pixel[npix][3]; npix++; } px = px - radius - 1; py = py - radius - 1; ww = 2 * radius + 3; Fpaint3(px,py,ww,ww,0); zfree(paintsave1); pixBmem[ii] = 0; cc = npix * pcc4 + pixBmem_cc; totmem -= cc; totpixB--; } if (pixBseq > 0) --pixBseq; return; } // free memory for first pixel block (oldest edit) void paint_image_names::paint_freefirstB() { using namespace paint_image_names; int firstseq; int ii, jj, cc, npix, radius; int px, py, dx, dy; pixBmem_t *paintsave1; if (! totpixB) return; firstseq = pixBmem[0]->seq; for (ii = 0; ii < totpixB; ii++) { paintsave1 = pixBmem[ii]; if (paintsave1->seq != firstseq) break; px = paintsave1->px; py = paintsave1->py; radius = paintsave1->radius; npix = 0; for (dy = -radius; dy <= radius; dy++) for (dx = -radius; dx <= radius; dx++) { if (px + dx < 0 || px + dx > Eww-1) continue; if (py + dy < 0 || py + dy > Ehh-1) continue; npix++; } zfree(paintsave1); pixBmem[ii] = 0; cc = npix * pcc4 + pixBmem_cc; totmem -= cc; } for (jj = 0; ii < totpixB; jj++, ii++) pixBmem[jj] = pixBmem[ii]; totpixB = jj; return; } // free all pixel block memory void paint_image_names::paint_freeallB() { using namespace paint_image_names; int ii; pixBmem_t *paintsave1; for (ii = totpixB-1; ii >= 0; ii--) { paintsave1 = pixBmem[ii]; zfree(paintsave1); } if (pixBmem) zfree(pixBmem); pixBmem = 0; pixBseq = 0; totpixB = 0; totmem = 0; return; } /**************************************************************************************/ // Select a color from a color chooser image file. // Returns color button in callers zdialog. // Returns selected RGB color in prgb[3] argument. namespace RGB_chooser_names { // ch *RGB_chooser_file; // defined in fotocx.h ch color[20]; zdialog *pzdialog; ch *pcolorbutt; uint8 *pRGB; PIXBUF *pixbuf = 0; GtkWidget *frame, *drawarea; } int RGB_chooser(zdialog *pzd, ch *pbutt, uint8 prgb[3]) { using namespace RGB_chooser_names; int RGB_chooser_dialog_event(zdialog *zd, ch *event); // dialog events function int RGB_chooser_draw(GtkWidget *window, cairo_t *cr); // window draw function int RGB_chooser_mouse(GtkWidget *window, GdkEventButton *); // window mouse button event pzdialog = pzd; // copy args from caller pcolorbutt = pbutt; pRGB = prgb; if (! RGB_chooser_file || ! regfile(RGB_chooser_file)) { // default color chooser file RGB_chooser_file = (ch *) zmalloc(200,"color chooser"); snprintf(RGB_chooser_file,200,"%s/CIE1931.jpg",get_zdatadir()); } /*** ____________________________________________ | Color Chooser | | | | click on desired color | | ________________________________________ | | | | | | | | | | | | | | | image | | | | | | | | | | | | | | | | | | | |________________________________________| | | | | [_______________________________] [Browse] | | | | [X] | |____________________________________________| ***/ zdialog *zd = zdialog_new(TX("Color Chooser"),Mwin,"X",null); zdialog_add_widget(zd,"label","labclick","dialog",TX("click on desired color")); zdialog_add_widget(zd,"frame","frame","dialog"); frame = zdialog_gtkwidget(zd,"frame"); drawarea = gtk_drawing_area_new(); gtk_widget_set_size_request(drawarea,-1,200); gtk_container_add(GTK_CONTAINER(frame),drawarea); zdialog_add_widget(zd,"hbox","hbfile","dialog",0,"space=3"); zdialog_add_widget(zd,"zentry","file","hbfile",0,"space=3|expand"); zdialog_add_widget(zd,"button","browse","hbfile",TX("Browse"),"space=3"); zdialog_stuff(zd,"file",RGB_chooser_file); G_SIGNAL(drawarea,"draw",RGB_chooser_draw,0); G_SIGNAL(drawarea,"button-press-event",RGB_chooser_mouse,0); gtk_widget_add_events(drawarea,GDK_BUTTON_PRESS_MASK); zdialog_resize(zd,300,0); zdialog_run(zd,RGB_chooser_dialog_event,"save"); return 0; } // dialog event and completion function int RGB_chooser_dialog_event(zdialog *zd, ch *event) { using namespace RGB_chooser_names; ch *pp; if (strmatch(event,"browse")) { pp = navi::galleryname; if (! pp) pp = topfolders[0]; pp = select_1file(pp); if (! pp) return 1; zdialog_stuff(zd,"file",pp); if (RGB_chooser_file) zfree(RGB_chooser_file); RGB_chooser_file = pp; gtk_widget_queue_draw(drawarea); } if (zd->zstat) zdialog_free(zd); return 1; } // color chooser window draw function int RGB_chooser_draw(GtkWidget *widget, cairo_t *cr) { using namespace RGB_chooser_names; PIXBUF *pixbuf1; GError *gerror = 0; GdkWindow *Cgdkwin; int ww1, hh1, ww2, hh2; if (*RGB_chooser_file != '/') return 1; // load last color chooser file pixbuf1 = gdk_pixbuf_new_from_file_at_size(RGB_chooser_file,500,500,&gerror); if (! pixbuf1) { printf("*** pixbuf error: %s \n",gerror->message); // popup message >> draw event loop return 1; } ww1 = gdk_pixbuf_get_width(pixbuf1); // image dimensions hh1 = gdk_pixbuf_get_height(pixbuf1); Cgdkwin = gtk_widget_get_window(widget); // set drawing area to match ww2 = gdk_window_get_width(Cgdkwin); // aspect ratio hh2 = ww2 * hh1 / ww1; gtk_widget_set_size_request(widget,-1,hh2); if (pixbuf) g_object_unref(pixbuf); pixbuf = gdk_pixbuf_scale_simple(pixbuf1,ww2,hh2,BILINEAR); g_object_unref(pixbuf1); if (! pixbuf) return 1; gdk_cairo_set_source_pixbuf(cr,pixbuf,0,0); // draw image cairo_paint(cr); return 1; } // color chooser mouse click function int RGB_chooser_mouse(GtkWidget *widget, GdkEventButton *event) { using namespace RGB_chooser_names; int mx, my, rs, nc; uint8 *pixels, *pix1; if (! pixbuf) return 1; rs = gdk_pixbuf_get_rowstride(pixbuf); nc = gdk_pixbuf_get_n_channels(pixbuf); pixels = gdk_pixbuf_get_pixels(pixbuf); mx = event->x; my = event->y; pix1 = pixels + my * rs + mx * nc; snprintf(color,20,"%d|%d|%d",pix1[0],pix1[1],pix1[2]); // update caller's color button zdialog_stuff(pzdialog,pcolorbutt,color); pRGB[0] = pix1[0]; // update caller's paint color pRGB[1] = pix1[1]; pRGB[2] = pix1[2]; return 1; } /**************************************************************************************/ // HSL color chooser function // Returns color button in callers zdialog. // Returns selected RGB color in prgb[3] argument. namespace HSL_chooser_names { zdialog *HSLzdialog; GtkWidget *RGBframe, *RGBcolor; GtkWidget *Hframe, *Hscale; zdialog *pzdialog; ch *pcolorbutt; uint8 *pRGB; float H, S, L; // chosen HSL color float R, G, B; // corresp. RGB color } int HSL_chooser(zdialog *pzd, ch *pbutt, uint8 prgb[3]) { using namespace HSL_chooser_names; void HSL_chooser_RGB(GtkWidget *drawarea, cairo_t *cr, int *); void HSL_chooser_Hscale(GtkWidget *drawarea, cairo_t *cr, int *); int HSL_chooser_dialog_event(zdialog *zd, ch *event); pzdialog = pzd; // copy args from caller pcolorbutt = pbutt; pRGB = prgb; /*** ________________________________________________ | | | [#######] [##############################] | | Color Hue ================[]============== | | Saturation =====================[]========= | | Lightness ===========[]=================== | | | | [X] | |________________________________________________| ***/ zdialog *zd = zdialog_new(TX("Adjust HSL"),Mwin,"X",null); HSLzdialog = zd; zdialog_add_widget(zd,"hbox","hb2","dialog"); zdialog_add_widget(zd,"vbox","vb1","hb2",0,"homog|space=0"); zdialog_add_widget(zd,"vbox","vb2","hb2",0,"homog|expand|space=0"); zdialog_add_widget(zd,"frame","RGBframe","vb1",0,"space=1"); // drawing area for RGB color RGBframe = zdialog_gtkwidget(zd,"RGBframe"); RGBcolor = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(RGBframe),RGBcolor); gtk_widget_set_size_request(RGBcolor,0,16); G_SIGNAL(RGBcolor,"draw",HSL_chooser_RGB,0); zdialog_add_widget(zd,"frame","Hframe","vb2",0,"space=1"); // drawing area for hue scale Hframe = zdialog_gtkwidget(zd,"Hframe"); Hscale = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(Hframe),Hscale); gtk_widget_set_size_request(Hscale,200,16); G_SIGNAL(Hscale,"draw",HSL_chooser_Hscale,0); zdialog_add_widget(zd,"label","labhue","vb1",TX("Color Hue")); zdialog_add_widget(zd,"label","labsat","vb1",TX("Saturation")); zdialog_add_widget(zd,"label","lablgt","vb1",TX("Lightness")); zdialog_add_widget(zd,"hscale","H","vb2","0|359.9|0.1|180","expand"); zdialog_add_widget(zd,"hscale","S","vb2","0|1|0.001|0.5","expand"); zdialog_add_widget(zd,"hscale","L","vb2","0|1|0.001|0.5","expand"); H = 180; // chosen HSL color = not set S = 0.5; L = 0.5; zdialog_run(zd,HSL_chooser_dialog_event,"save"); // run dialog - parallel return 1; } // Paint RGBcolor drawing area with RGB color from chosen HSL color void HSL_chooser_RGB(GtkWidget *drawarea, cairo_t *cr, int *) { using namespace HSL_chooser_names; int ww, hh; int r, g, b; ch color[20]; ww = gtk_widget_get_allocated_width(drawarea); // drawing area size hh = gtk_widget_get_allocated_height(drawarea); HSLtoRGB(H,S,L,R,G,B); // RGB color from chosen HSL cairo_set_source_rgb(cr,R,G,B); cairo_rectangle(cr,0,0,ww-1,hh-1); cairo_fill(cr); r = 255 * R; g = 255 * G; b = 255 * B; snprintf(color,20,"%d|%d|%d",r,g,b); // update caller's color button zdialog_stuff(pzdialog,pcolorbutt,color); pRGB[0] = r; // update caller's paint color pRGB[1] = g; pRGB[2] = b; return; } // Paint Hscale drawing area with all hue values in a horizontal scale void HSL_chooser_Hscale(GtkWidget *drawarea, cairo_t *cr, int *) { using namespace HSL_chooser_names; int px, ww, hh; float H, S, L, R, G, B; ww = gtk_widget_get_allocated_width(drawarea); // drawing area size hh = gtk_widget_get_allocated_height(drawarea); S = L = 0.5; for (px = 0; px < ww; px++) // paint hue color scale { H = 360 * px / ww; HSLtoRGB(H,S,L,R,G,B); cairo_set_source_rgb(cr,R,G,B); cairo_move_to(cr,px,0); cairo_line_to(cr,px,hh-1); cairo_stroke(cr); } return; } // HSL dialog event and completion function int HSL_chooser_dialog_event(zdialog *zd, ch *event) // HSL dialog event function { using namespace HSL_chooser_names; if (zd->zstat) { // zdialog complete zdialog_free(zd); freeMouse(); HSLzdialog = 0; return 1; } if (zstrstr("H S L",event)) { // HSL inputs changed zdialog_fetch(zd,"H",H); zdialog_fetch(zd,"S",S); zdialog_fetch(zd,"L",L); gtk_widget_queue_draw(RGBcolor); // draw corresp. RGB color } return 1; } /**************************************************************************************/ // HSL to RGB converter (Wikipedia) // H = 0-360 deg. S = 0-1 L = 0-1 // output RGB values = 0-1 void HSLtoRGB(float H, float S, float L, float &R, float &G, float &B) { float C, X, M; float h1, h2; h1 = H / 60; h2 = h1 - 2 * int(h1/2); C = (1 - fabsf(2*L-1)) * S; X = C * (1 - fabsf(h2-1)); M = L - C/2; if (H < 60) { R = C; G = X; B = 0; } else if (H < 120) { R = X; G = C; B = 0; } else if (H < 180) { R = 0; G = C; B = X; } else if (H < 240) { R = 0; G = X; B = C; } else if (H < 300) { R = X; G = 0; B = C; } else { R = C; G = 0; B = X; } R = R + M; G = G + M; B = B + M; if (R < 0) R = 0; if (G < 0) G = 0; if (B < 0) B = 0; if (R > 255.0) R = 255.0; if (G > 255.0) G = 255.0; if (B > 255.0) B = 255.0; return; } // RGB to HSL converter // input RGB values 0-1 // outputs: H = 0-360 deg. S = 0-1 L = 0-1 void RGBtoHSL(float R, float G, float B, float &H, float &S, float &L) { float max, min, D; max = R; if (G > max) max = G; if (B > max) max = B; min = R; if (G < min) min = G; if (B < min) min = B; D = max - min; L = 0.5 * (max + min); if (D < 0.004) { H = S = 0; return; } if (L > 0.5) S = D / (2 - max - min); else S = D / (max + min); if (max == R) H = (G - B) / D; else if (max == G) H = 2 + (B - R) / D; else H = 4 + (R - G) / D; H = H * 60; if (H < 0) H += 360; return; } /**************************************************************************************/ // Paint transparency function - paint pixel alpha channel with the mouse. namespace paint_transparency_names { int mode = 1; // 1/2 = more/less transparency int Fgrad = 1; // gradual or instant transparency int Mrad; // mouse radius float kernel[400][400]; // radius <= 199 editfunc EFpaintransp; } // menu function void m_paint_transparency(GtkWidget *, ch *menu) { using namespace paint_transparency_names; int paint_transparency_dialog_event(zdialog* zd, ch *event); void paint_transparency_mousefunc(); ch *mess1 = TX("left drag: add transparency \n" "right drag: add opacity"); F1_help_topic = TX("PAINT TRANSPARENCY"); printf("m_paint_transp \n"); EFpaintransp.menufunc = m_paint_transparency; EFpaintransp.menuname = "Paint Transparency"; EFpaintransp.Farea = 2; // select area usable EFpaintransp.mousefunc = paint_transparency_mousefunc; // mouse function if (! edit_setup(EFpaintransp)) return; // setup edit PXM_addalpha(E1pxm); // add an alpha channel if req. PXM_addalpha(E3pxm); Fpaintnow(); /*** ________________________________ | Paint transparency | | | | left drag: add transparency | | right drag: add opacity | | | | paint radius [____] | | power center [____] | | power edge [____] | | [x] gradual paint | | | | [OK] [X] | |________________________________| ***/ zdialog *zd = zdialog_new(TX("Paint Transparency"),Mwin,"OK","X",null); EFpaintransp.zd = zd; zdialog_add_widget(zd,"hbox","hbr","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labm","dialog",mess1,"space=5"); zdialog_add_widget(zd,"hbox","hbbri","dialog",0,"space=5"); zdialog_add_widget(zd,"vbox","vbbr1","hbbri",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbbr2","hbbri",0,"homog|space=5"); zdialog_add_widget(zd,"label","labbr","vbbr1",TX("paint radius")); zdialog_add_widget(zd,"label","labsc","vbbr1",TX("power center")); zdialog_add_widget(zd,"label","labse","vbbr1",TX("power edge")); zdialog_add_widget(zd,"zspin","radius","vbbr2","1|199|1|30"); zdialog_add_widget(zd,"zspin","stcent","vbbr2","0|100|1|95"); zdialog_add_widget(zd,"zspin","stedge","vbbr2","0|100|1|100"); zdialog_add_widget(zd,"hbox","hb4","dialog",0,"space=3"); zdialog_add_widget(zd,"check","Fgrad","hb4",TX("gradual paint"),"space=5"); zdialog_stuff(zd,"Fgrad",1); zdialog_load_inputs(zd); // preload prior user inputs zdialog_run(zd,paint_transparency_dialog_event,"save"); // run dialog, parallel zdialog_send_event(zd,"radius"); // get kernel initialized zdialog_fetch(zd,"Fgrad",Fgrad); // instant/gradual paint mode = 1; // start with paint mode takeMouse(paint_transparency_mousefunc,drawcursor); // connect mouse function return; } // dialog event and completion callback function int paint_transparency_dialog_event(zdialog *zd, ch *event) { using namespace paint_transparency_names; void paint_transparency_mousefunc(); int radius, dx, dy; float rad, kern, stcent, stedge; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat == 1) edit_done(0); // commit edit else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(paint_transparency_mousefunc,drawcursor); if (zstrstr("radius stcent stedge",event)) // get new brush attributes { zdialog_fetch(zd,"radius",Mrad); // mouse radius zdialog_fetch(zd,"stcent",stcent); // center transparency zdialog_fetch(zd,"stedge",stedge); // edge transparency stcent = 0.01 * stcent; // scale 0 ... 1 stedge = 0.01 * stedge; radius = Mrad; for (dy = -radius; dy <= radius; dy++) // build kernel for (dx = -radius; dx <= radius; dx++) { rad = sqrt(dx*dx + dy*dy); kern = (radius - rad) / radius; // center ... edge >> 1 ... 0 kern = kern * (stcent - stedge) + stedge; // power center ... edge if (kern < 0) kern = 0; if (kern > 1) kern = 1; if (rad > radius) kern = 2; // beyond radius, within square kernel[dx+radius][dy+radius] = kern; } } if (strmatch(event,"Fgrad")) // flag, gradual overpaints zdialog_fetch(zd,"Fgrad",Fgrad); return 1; } // pixel paint mouse function void paint_transparency_mousefunc() { using namespace paint_transparency_names; void paint_transparency_dopixels(int px, int py); static int pmxdown = 0, pmydown = 0; int px, py; if (LMclick || RMclick) { if (LMclick) mode = 1; // left click, paint if (RMclick) mode = 2; // right click, erase px = Mxclick; py = Myclick; paint_transparency_dopixels(px,py); // do 1 block of pixels } else if (Mxdrag || Mydrag) // drag in progress { if (Mbutton == 1) mode = 1; // left drag, paint if (Mbutton == 3) mode = 2; // right drag, erase px = Mxdrag; py = Mydrag; if (Mxdown != pmxdown || Mydown != pmydown) { // new drag pmxdown = Mxdown; pmydown = Mydown; } paint_transparency_dopixels(px,py); // do 1 block of pixels LMclick = RMclick = Mxdrag = Mydrag = 0; return; } LMclick = RMclick = Mxdrag = Mydrag = 0; draw_mousecircle(Mxposn,Myposn,Mrad,0,0); // draw mouse circle return; } // paint or erase 1 block of pixels within mouse radius of px, py void paint_transparency_dopixels(int px, int py) { using namespace paint_transparency_names; float *pix3; int radius, dx, dy, qx, qy; int ii, rr, dist = 0; float kern; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); radius = Mrad; for (dy = -radius; dy <= radius; dy++) // loop surrounding block of pixels for (dx = -radius; dx <= radius; dx++) { qx = px + dx; qy = py + dy; if (qx < 0 || qx > Eww-1) continue; if (qy < 0 || qy > Ehh-1) continue; if (sa_stat == sa_stat_fini) { // select area active ii = qy * Eww + qx; dist = sa_pixmap[ii]; if (! dist) continue; // pixel is outside area } kern = kernel[dx+radius][dy+radius]; // mouse transparencies if (kern > 1) continue; // outside mouse radius pix3 = PXMpix(E3pxm,qx,qy); // edited image pixel if (mode == 1) { // add transparency if (Fgrad) { pix3[3] -= 2 * kern; // accumulate transparency if (pix3[3] < 0) pix3[3] = 0; } else pix3[3] = 0; // instant } if (mode == 2) { // add opacity if (Fgrad) { pix3[3] += 2 * kern; // accumulate if (pix3[3] > 255.0) pix3[3] = 255.0; } else pix3[3] = 255.0; // instant } } CEF->Fmods++; CEF->Fsaved = 0; px = px - radius - 1; // repaint modified area py = py - radius - 1; rr = 2 * radius + 3; Fpaint3(px,py,rr,rr,cr); draw_mousecircle(Mxposn,Myposn,Mrad,0,cr); // draw mouse circle draw_context_destroy(draw_context); return; } /**************************************************************************************/ // fill selected areas or transparent areas with selected color namespace areafill_names { editfunc EFareafill; int Fareas, Ftransp; // flags, fill select areas, fill transp. areas float mblend; // 0 - 1.0 input/output blend uint8 RGB[3] = { 0, 0, 0 }; // fill color } // menu function void m_area_fill(GtkWidget *, ch *menu) // 25.50 { using namespace areafill_names; int areafill_dialog_event(zdialog *zd, ch *event); void * areafill_thread(void *); ch color[20]; F1_help_topic = TX("AREA FILL"); printf("m_area_fill \n"); EFareafill.menuname = "Area Fill"; EFareafill.menufunc = m_area_fill; EFareafill.threadfunc = areafill_thread; EFareafill.Farea = 2; // select area usable EFareafill.Fscript = 1; // scripting supported if (! edit_setup(EFareafill)) return; // setup edit PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); /*** ________________________________ | Area Fill | | | | color [####] [palette] [HSL] | | | | [_] fill selected areas | | [_] fill transparent areas | | | | Blend 0% ======[]======= 100% | | | | [OK] [X] | |________________________________| ***/ zdialog *zd = zdialog_new(TX("Area Fill"),Mwin,"OK","X",null); EFareafill.zd = zd; zdialog_add_widget(zd,"hbox","hbp","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labp","hbp",TX("color"),"space=5"); zdialog_add_widget(zd,"colorbutt","colorbutt","hbp","0|0|0"); zdialog_add_widget(zd,"button","palette","hbp",TX("palette"),"space=10"); zdialog_add_widget(zd,"button","HSL","hbp","HSL"); zdialog_add_widget(zd,"check","Fareas","dialog",TX("fill selected areas")); zdialog_add_widget(zd,"check","Ftransp","dialog",TX("fill transparent areas")); zdialog_add_widget(zd,"hbox","hbmblend","dialog",0,"space=3"); zdialog_add_widget(zd,"label","lab0","hbmblend",TX("Blend 0%"),"space=5"); zdialog_add_widget(zd,"hscale","mblend","hbmblend","0.0|1.0|0.01|1.0","expand"); zdialog_add_widget(zd,"label","lab100","hbmblend","100%","space=5"); snprintf(color,20,"%d|%d|%d",RGB[0],RGB[1],RGB[2]); // initz. current color zdialog_stuff(zd,"colorbutt",color); zdialog_resize(zd,200,0); zdialog_run(zd,areafill_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int areafill_dialog_event(zdialog *zd, ch *event) { using namespace areafill_names; int err; ch *pp, color[20]; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat == 1) // [OK] { edit_addhist("areas:%d transp:%d mblend:%.2f", // edit params > edit hist Fareas,Ftransp,mblend); edit_done(0); // commit edit } else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"focus")) return 1; if (strmatch(event,"colorbutt")) { zdialog_fetch(zd,"colorbutt",color,19); // get paint color from color button pp = substring(color,"|",1); if (pp) RGB[0] = atoi(pp); pp = substring(color,"|",2); if (pp) RGB[1] = atoi(pp); pp = substring(color,"|",3); if (pp) RGB[2] = atoi(pp); } if (strmatch(event,"palette")) err = RGB_chooser(zd,"colorbutt",RGB); // select color from palette if (strmatch(event,"HSL")) { err = HSL_chooser(zd,"colorbutt",RGB); // select color from palette if (err) return 1; snprintf(color,20,"%d|%d|%d",RGB[0],RGB[1],RGB[2]); zdialog_stuff(zd,"colorbutt",color); } if (strstr("Fareas Ftransp mblend",event)) { zdialog_fetch(zd,"Fareas",Fareas); zdialog_fetch(zd,"Ftransp",Ftransp); zdialog_fetch(zd,"mblend",mblend); thread_signal(); } return 1; } // thread function void * areafill_thread(void *) { using namespace areafill_names; void * areafill_wthread(void *arg); if (! Fareas && ! Ftransp) return 0; // nothing to do do_wthreads(areafill_wthread,NSMP); // worker threads CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); return 0; } // worker thread functions void * areafill_wthread(void *arg) { using namespace areafill_names; int index = *((int *) (arg)); int px, py; int dist, Fdopixel; float R1, G1, B1, R3, G3, B3; float *pix1, *pix3; float ff1, ff2; for (py = index; py < Ehh; py += NSMP) for (px = 0; px < Eww; px++) { pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel Fdopixel = 0; if (Fareas && sa_stat == sa_stat_fini) // selected areas fill wanted { int ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (dist) Fdopixel = 1; // pixel inside area } if (Ftransp && pix1[3] < 250) Fdopixel = 1; // transparent areas fill wanted if (! Fdopixel) continue; R1 = pix1[0]; // input pixel color G1 = pix1[1]; B1 = pix1[2]; R3 = RGB[0]; // fill color G3 = RGB[1]; B3 = RGB[2]; if (pix1[3] < 250) // pixel has transparency { ff1 = (255 - pix1[3]) / 255.0; // fill color part ff2 = 1.0 - ff1; // input pixel part R3 = ff1 * R3 + ff2 * R1; // blend input and fill color G3 = ff1 * G3 + ff2 * G1; B3 = ff1 * B3 + ff2 * B1; } if (mblend < 1.0) // image blend slider { ff1 = mblend; ff2 = 1.0 - ff1; R3 = ff1 * R3 + ff2 * R1; // blend input and fill color G3 = ff1 * G3 + ff2 * G1; B3 = ff1 * B3 + ff2 * B1; } pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; pix3[3] = 255; } return 0; } /**************************************************************************************/ // Copy in Image function. // Copy from one image area to another with variable opacity. namespace copy_in_image { int dialog_event(zdialog* zd, ch *event); void mousefunc(); void dopixels(int px, int py); // update pixel block void savepixB(int px, int py); // save pixel block for poss. undo void undolastB(); // undo last pixel block, free memory void freefirstB(); // free memory for first pixel block void freeallB(); // free memory for all pixel blocks int mode; // 1/2 = paint / erase int Mrad; // mouse radius int xorg1, yorg1; // source pixel origin int xorg2, yorg2; // dest pixel origin float kernel[402][402]; // radius <= 200 int Fptran = 0; // flag, paint over transparent areas int nc, ac; // no. channels, alpha channel int64 maxmem = (int64) 4000 * MEGA; // max. pixel block memory int64 totmem; // pixB memory allocated int maxpixB = 10000; // max. pixel blocks int totpixB = 0; // total pixel blocks int pixBseq = 0; // last pixel block sequence no. typedef struct { // pixel block before edit int seq; // block sequence no. uint16 px, py; // center pixel (radius org.) uint16 radius; // radius of pixel block float pixel[][4]; // array of pixel[npix][4] } pixBmem_t; pixBmem_t **pixBmem = 0; // *pixBmem_t[] int pixBmem_cc = 12; // all except pixel array + pad int pcc4 = 4 * sizeof(float); // pixel cc: RGBA = 4 channels editfunc EFcopyinimage; } // menu function void m_copy_in_image(GtkWidget *, ch *menu) // separate paint and copy { using namespace copy_in_image; ch *mess1 = TX("left click: set image source location \n" "right click: set corresponding destination"); ch *mess2 = TX("left drag: copy image to mouse position \n" "right drag: restore original image"); F1_help_topic = TX("COPY IN IMAGE"); printf("m_copy_in_image \n"); EFcopyinimage.menufunc = m_copy_in_image; EFcopyinimage.menuname = "Copy in Image"; EFcopyinimage.Farea = 2; // select area usable EFcopyinimage.mousefunc = mousefunc; // mouse function if (! edit_setup(EFcopyinimage)) return; // setup edit /*** _______________________________________________ | Copy Within Image | | | | left click: set image source location | | right click: set corresponding destination | | | | left drag: copy image to mouse position | | right drag: restore original image | | | | brush size [____] [undo last] | | opacity center [____] [undo all] | | opacity edge [____] | | | | [x] paint transparent areas | | | | [OK] [X] | |_______________________________________________| ***/ zdialog *zd = zdialog_new(TX("Copy Within Image"),Mwin,"OK","X",null); EFcopyinimage.zd = zd; zdialog_add_widget(zd,"hbox","hbm1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labm","hbm1",mess1,"space=3"); zdialog_add_widget(zd,"hbox","hbm2","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labm","hbm2",mess2,"space=3"); zdialog_add_widget(zd,"hsep","sep1","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbbri","dialog",0,"space=5"); zdialog_add_widget(zd,"vbox","vbbr1","hbbri",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbbr2","hbbri",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","space","hbbri",0,"space=10"); zdialog_add_widget(zd,"vbox","vbbr3","hbbri",0,"space=10"); zdialog_add_widget(zd,"label","labbr","vbbr1",TX("brush size")); zdialog_add_widget(zd,"label","labtc","vbbr1",TX("opacity center")); zdialog_add_widget(zd,"label","labte","vbbr1",TX("opacity edge")); zdialog_add_widget(zd,"zspin","Mrad","vbbr2","1|200|1|30"); zdialog_add_widget(zd,"zspin","opccent","vbbr2","1|100|1|30"); zdialog_add_widget(zd,"zspin","opcedge","vbbr2","0|100|1|0"); zdialog_add_widget(zd,"button","undlast","vbbr3",TX("Undo Last")); zdialog_add_widget(zd,"button","undall","vbbr3",TX("Undo All")); zdialog_add_widget(zd,"hbox","hb4","dialog",0,"space=3"); zdialog_add_widget(zd,"check","Fptran","hb4",TX("paint over transparent areas"),"space=5"); zdialog_load_inputs(zd); // preload prior user inputs zdialog_run(zd,dialog_event,"save"); // run dialog, parallel zdialog_fetch(zd,"Fptran",Fptran); // paint over transparent areas zdialog_send_event(zd,"Mrad"); // get kernel initialized totmem = 0; // memory used pixBmem = 0; // pixel block memory totpixB = 0; // pixel blocks pixBseq = 0; xorg1 = yorg1 = -1; // no source pixel origin xorg2 = yorg2 = -1; // no dest. pixel origin ac = 0; nc = E1pxm->nc; // channels, RGBA if (nc > 3) ac = 1; // alpha channel present takeMouse(mousefunc,drawcursor); // connect mouse function return; } // dialog event and completion callback function int copy_in_image::dialog_event(zdialog *zd, ch *event) { using namespace copy_in_image; int radius, dx, dy; float rad, kern, opccent, opcedge; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat == 1) edit_done(0); // commit edit else edit_cancel(0); // discard edit freeallB(); // free pixel block memory return 1; } draw_mousecircle(0,0,0,1,0); // erase mouse circle draw_mousecircle2(0,0,0,1,0); // erase source tracking circle if (strmatch(event,"focus")) // toggle mouse capture takeMouse(mousefunc,drawcursor); if (zstrstr("Mrad opccent opcedge",event)) // get new brush attributes { zdialog_fetch(zd,"Mrad",Mrad); zdialog_fetch(zd,"opccent",opccent); zdialog_fetch(zd,"opcedge",opcedge); opccent = 0.01 * opccent; // scale 0 ... 1 opcedge = 0.01 * opcedge; opccent = pow(opccent,2); // change response curve opcedge = opccent * opcedge; // edge relative to center radius = Mrad; for (dy = -radius; dy <= radius; dy++) // build kernel for (dx = -radius; dx <= radius; dx++) { rad = sqrt(dx*dx + dy*dy); kern = (radius - rad) / radius; // center ... edge >> 1 ... 0 kern = kern * (opccent - opcedge) + opcedge; // opacity center ... edge if (rad > radius) kern = 0; // beyond radius, within square if (kern < 0) kern = 0; if (kern > 1) kern = 1; kernel[dx+radius][dy+radius] = kern; } } if (strmatch(event,"undlast")) // undo last edit (click or drag) undolastB(); if (strmatch(event,"undall")) { // undo all edits edit_reset(); freeallB(); } if (strmatch(event,"Fptran")) // flag, paint over transparency zdialog_fetch(zd,"Fptran",Fptran); return 1; } // pixel paint mouse function void copy_in_image::mousefunc() // improve source/destination { // mouse tracking using namespace copy_in_image; static int pmxdown = 0, pmydown = 0; int px, py; if (LMclick) { xorg1 = Mxclick; // new source pixel origin yorg1 = Myclick; LMclick = 0; } if (RMclick) { // new corresp. destination pixel xorg2 = Mxclick; yorg2 = Myclick; RMclick = 0; } if ((Mxdrag || Mydrag) && xorg1 > 0 && xorg2 > 0) // drag in progress { if (Mbutton == 1) mode = 1; // left drag, paint if (Mbutton == 3) mode = 2; // right drag, erase if (Mxdown != pmxdown || Mydown != pmydown) // new drag { pmxdown = Mxdown; pmydown = Mydown; pixBseq++; // new undo seq. no. } px = Mxdrag; py = Mydrag; dopixels(px,py); // do 1 block of pixels } else mode = 0; draw_mousecircle(Mxposn,Myposn,Mrad,0,0); // draw mouse circle if (xorg1 > 0 && xorg2 > 0 && mode != 2) { // 2nd circle tracks source pixels px = xorg1 + Mxposn - xorg2; py = yorg1 + Myposn - yorg2; if (px > 0 && px < Eww-1 && py > 0 && py < Ehh-1) draw_mousecircle2(px,py,Mrad,0,0); } else draw_mousecircle2(0,0,0,1,0); // erase 2nd circle LMclick = RMclick = Mxdrag = Mydrag = 0; return; } // paint or erase 1 block of pixels within mouse radius of px, py void copy_in_image::dopixels(int px, int py) { using namespace copy_in_image; float *pix1, *pix3; int radius, dx, dy, qx, qy, sx, sy; int ii, ww, hh, dist = 0; int pot = ac * Fptran; // paint over transparent areas float kern; if (xorg1 < 0 || yorg1 < 0) return; // no source pixel origin if (xorg2 < 0 || yorg2 < 0) return; // no dest. pixel origin cairo_t *cr = draw_context_create(Fgdkwin,draw_context); draw_mousecircle(0,0,0,1,cr); // erase mouse circle draw_mousecircle2(0,0,0,1,cr); // erase source tracking circle ww = Eww; hh = Ehh; savepixB(px,py); // save pixels for poss. undo radius = Mrad; if (mode == 1) { CEF->Fmods++; CEF->Fsaved = 0; } for (dy = -radius; dy <= radius; dy++) // loop surrounding block of pixels for (dx = -radius; dx <= radius; dx++) { qx = px + dx; qy = py + dy; if (qx < 0 || qx > ww-1) continue; if (qy < 0 || qy > hh-1) continue; if (sa_stat == sa_stat_fini) { // select area active ii = qy * ww + qx; dist = sa_pixmap[ii]; if (! dist) continue; // pixel is outside area } kern = kernel[dx+radius][dy+radius]; // mouse opacities if (kern == 0) continue; // outside mouse radius pix1 = PXMpix(E1pxm,qx,qy); // source image pixel pix3 = PXMpix(E3pxm,qx,qy); // edited image pixel if (mode == 1) // paint { sx = xorg1 + qx - xorg2; // source image pixel sy = yorg1 + qy - yorg2; if (sx < 0) sx = 0; if (sx > ww-1) sx = ww-1; if (sy < 0) sy = 0; if (sy > hh-1) sy = hh-1; pix1 = PXMpix(E1pxm,sx,sy); // source image pixel at location kern = 0.3 * kern; pix3[0] = kern * pix1[0] + (1.0 - kern) * pix3[0]; // overpaints accumulate pix3[1] = kern * pix1[1] + (1.0 - kern) * pix3[1]; pix3[2] = kern * pix1[2] + (1.0 - kern) * pix3[2]; if (pot) pix3[3] = kern * pix1[3] + (1.0 - kern) * pix3[3]; // overpaint transparent area } if (mode == 2) // erase { pix3[0] = kern * pix1[0] + (1.0 - kern) * pix3[0]; // gradual erase pix3[1] = kern * pix1[1] + (1.0 - kern) * pix3[1]; pix3[2] = kern * pix1[2] + (1.0 - kern) * pix3[2]; if (pot) pix3[3] = kern * pix1[3] + (1.0 - kern) * pix3[3]; } } px = px - radius - 1; // repaint modified area py = py - radius - 1; ww = 2 * radius + 3; Fpaint3(px,py,ww,ww,cr); draw_context_destroy(draw_context); return; } // save 1 block of pixels for possible undo void copy_in_image::savepixB(int px, int py) { using namespace copy_in_image; int cc, npix, radius, dx, dy; float *pix3; pixBmem_t *save1B; if (! pixBmem) { // first time cc = maxpixB * sizeof(void *); pixBmem = (pixBmem_t **) zmalloc(cc,"copy in image"); totpixB = 0; totmem = 0; } if (totmem > maxmem || totpixB == maxpixB) // free memory for oldest updates while (totmem > 0.7 * maxmem || totpixB > 0.7 * maxpixB) freefirstB(); radius = Mrad; npix = 0; for (dy = -radius; dy <= radius; dy++) // count pixels in block for (dx = -radius; dx <= radius; dx++) { if (px + dx < 0 || px + dx > Eww-1) continue; if (py + dy < 0 || py + dy > Ehh-1) continue; npix++; } cc = npix * pcc4 + pixBmem_cc; save1B = (pixBmem_t *) zmalloc(cc,"copy in image"); // allocate memory for block pixBmem[totpixB] = save1B; totpixB += 1; totmem += cc; save1B->seq = pixBseq; // save pixel block poop save1B->px = px; save1B->py = py; save1B->radius = radius; npix = 0; for (dy = -radius; dy <= radius; dy++) // save pixels in block for (dx = -radius; dx <= radius; dx++) { if (px + dx < 0 || px + dx > Eww-1) continue; if (py + dy < 0 || py + dy > Ehh-1) continue; pix3 = PXMpix(E3pxm,(px+dx),(py+dy)); // edited image pixel save1B->pixel[npix][0] = pix3[0]; save1B->pixel[npix][1] = pix3[1]; save1B->pixel[npix][2] = pix3[2]; if (ac) save1B->pixel[npix][3] = pix3[3]; npix++; } return; } // undo last pixel block (newest edit) and free memory void copy_in_image::undolastB() { using namespace copy_in_image; int ii, cc, npix, radius; int ww, px, py, dx, dy; float *pix3; pixBmem_t *save1B; for (ii = totpixB-1; ii >= 0; ii--) { save1B = pixBmem[ii]; if (save1B->seq != pixBseq) break; px = save1B->px; py = save1B->py; radius = save1B->radius; npix = 0; for (dy = -radius; dy <= radius; dy++) for (dx = -radius; dx <= radius; dx++) { if (px + dx < 0 || px + dx > Eww-1) continue; if (py + dy < 0 || py + dy > Ehh-1) continue; pix3 = PXMpix(E3pxm,(px+dx),(py+dy)); pix3[0] = save1B->pixel[npix][0]; pix3[1] = save1B->pixel[npix][1]; pix3[2] = save1B->pixel[npix][2]; if (ac) pix3[3] = save1B->pixel[npix][3]; npix++; } px = px - radius - 1; py = py - radius - 1; ww = 2 * radius + 3; Fpaint3(px,py,ww,ww,0); zfree(save1B); pixBmem[ii] = 0; cc = npix * pcc4 + pixBmem_cc; totmem -= cc; totpixB--; } if (pixBseq > 0) --pixBseq; return; } // free memory for first pixel block (oldest edit) void copy_in_image::freefirstB() { using namespace copy_in_image; int firstseq; int ii, jj, cc, npix, radius; int px, py, dx, dy; pixBmem_t *save1B; if (! totpixB) return; firstseq = pixBmem[0]->seq; for (ii = 0; ii < totpixB; ii++) { save1B = pixBmem[ii]; if (save1B->seq != firstseq) break; px = save1B->px; py = save1B->py; radius = save1B->radius; npix = 0; for (dy = -radius; dy <= radius; dy++) for (dx = -radius; dx <= radius; dx++) { if (px + dx < 0 || px + dx > Eww-1) continue; if (py + dy < 0 || py + dy > Ehh-1) continue; npix++; } zfree(save1B); pixBmem[ii] = 0; cc = npix * pcc4 + pixBmem_cc; totmem -= cc; } for (jj = 0; ii < totpixB; jj++, ii++) pixBmem[jj] = pixBmem[ii]; totpixB = jj; return; } // free all pixel block memory void copy_in_image::freeallB() { using namespace copy_in_image; int ii; pixBmem_t *save1B; for (ii = totpixB-1; ii >= 0; ii--) { save1B = pixBmem[ii]; zfree(save1B); } if (pixBmem) zfree(pixBmem); pixBmem = 0; pixBseq = 0; totpixB = 0; totmem = 0; return; } /**************************************************************************************/ // Copy From Image function. // 'Paint' a target image with pixels from a different source image. namespace copy_from_image { int dialog_event(zdialog* zd, ch *event); void mousefunc(); // generate mouse circle void dopixels(); // copy pixel block to target void save_pixblock(); // save pixel block for poss. undo void undo_lastblock(); // undo last pixel block, free memory void free_firstblock(); // free memory for first pixel block void free_allblocks(); // free memory for all pixel blocks editfunc EFcopyfromimage; int mode; // 1/2 = paint / erase int Fptran; // flag, paint over transparent areas int mpxC, mpyC; // center of pixel copy area int mpx, mpy; // center of moving mouse circle int mrad; // radius of pixel copy area typedef struct { // shared memory data int killsource; // source image process should exit int mpxC, mpyC; // center of pixel copy area (dest image) int mpxS, mpyS; // center of pixel copy area (source image) int mpx, mpy; // mouse drag position int mrad; // mouse radius float Fscale; // source image scale factor int Freq; // source/target coord. flag float pixels[402*402*4]; // pixel block, max. mrad = 200 } mmap_data_t; mmap_data_t *mmap_data; // shared memory pointer float kernel[402][402]; // mrad <= 200 int64 maxmem = (int64) 4000 * MEGA; // max. pixel block memory int64 totmem; // pixblock memory allocated int maxpixblock = 10000; // max. pixel blocks int totpixblock = 0; // total pixel blocks int pixblockseq = 0; // last pixel block sequence no. typedef struct { // saved pixel block before edit int seq; // block sequence no. uint16 mpx, mpy; // center pixel (mrad org.) uint16 mrad; // radius of pixel block float pixels[][4]; // array of pixels, rows x cols } pixblockmem_t; pixblockmem_t **pixblockmem; int pixblockmem_cc = 12; // all except pixel array + pad } // menu function void m_copy_from_image(GtkWidget *, ch *menu) // split source/target processes { using namespace copy_from_image; int err, fd; size_t cc; F1_help_topic = TX("COPY FROM IMAGE"); printf("m_copy_from_image \n"); fd = shm_open("/fotocx_copy_from_image",O_RDWR+O_CREAT,0600); // identify memory mapped region if (fd < 0) { zmessageACK(Mwin,"shm_open() failure: %s",strerror(errno)); return; } cc = sizeof(mmap_data_t); err = ftruncate(fd,cc); if (err) { zmessageACK(Mwin,"ftruncate() failure: %s",strerror(errno)); return; } mmap_data = (mmap_data_t *) mmap(0,cc,PROT_WRITE,MAP_SHARED,fd,0); // create memory mapped region if (mmap_data == (void *) -1) { zmessageACK(Mwin,"mmap() failure: %s",strerror(errno)); return; } memset(mmap_data,0,cc); mpxC = mpyC = 0; // default pixel copy area selected mrad = 50; // default mouse radius mmap_data->Fscale = 1.0; // default source image scale factor EFcopyfromimage.menufunc = m_copy_from_image; // start edit function for target image EFcopyfromimage.menuname = "Copy From Image"; EFcopyfromimage.Farea = 2; // select area usable EFcopyfromimage.mousefunc = mousefunc; // mouse function if (! edit_setup(EFcopyfromimage)) return; PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); cc = maxpixblock * sizeof(void *); pixblockmem = (pixblockmem_t **) zmalloc(cc,"copy from image"); // saved pixel blocks list totmem = 0; // memory used totpixblock = 0; // pixel blocks pixblockseq = 0; /**** __________________________________________________ | Copy From Image | | | | shift + left click: synchronize copy position | | left drag: copy source image to mouse | | right drag: restore original image | | | | source image scale [____] | | | | brush size [____] [undo last] | | opacity center [____] [undo all] | | opacity edge [____] | | | | [x] paint over transparent areas | | | | [OK] [X] | |__________________________________________________| ****/ ch *mess1 = TX("shift + left click: synchronize copy position \n" "left drag: copy source image to mouse \n" "right drag: restore original image"); zdialog *zd = zdialog_new(TX("Copy From Image"),Mwin,"OK","X",null); EFcopyfromimage.zd = zd; zdialog_add_widget(zd,"hbox","hbr","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labm","dialog",mess1,"space=5"); zdialog_add_widget(zd,"hbox","hbsc","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labsc","hbsc",TX("source image scale"),"space=3"); zdialog_add_widget(zd,"zspin","scale","hbsc","0.2|5.0|0.01|1.0","space=3"); zdialog_add_widget(zd,"hbox","hbbri","dialog",0,"space=3"); zdialog_add_widget(zd,"vbox","vbbr1","hbbri",0,"homog|space=3"); zdialog_add_widget(zd,"vbox","vbbr2","hbbri",0,"homog|space=3"); zdialog_add_widget(zd,"vbox","space","hbbri",0,"space=10"); zdialog_add_widget(zd,"vbox","vbbr3","hbbri",0,"space=10"); zdialog_add_widget(zd,"label","labbr","vbbr1",TX("brush size")); zdialog_add_widget(zd,"label","labtc","vbbr1",TX("opacity center")); zdialog_add_widget(zd,"label","labte","vbbr1",TX("opacity edge")); zdialog_add_widget(zd,"zspin","mrad","vbbr2","1|200|1|50"); zdialog_add_widget(zd,"zspin","opccent","vbbr2","1|100|1|10"); zdialog_add_widget(zd,"zspin","opcedge","vbbr2","0|100|1|0"); zdialog_add_widget(zd,"button","undlast","vbbr3",TX("Undo Last")); zdialog_add_widget(zd,"button","undall","vbbr3",TX("Undo All")); zdialog_add_widget(zd,"hbox","hb4","dialog",0,"space=3"); zdialog_add_widget(zd,"check","Fptran","hb4",TX("paint over transparent areas"),"space=5"); zdialog_load_inputs(zd); // preload prior user inputs zdialog_run(zd,dialog_event,"save"); // run dialog, parallel zdialog_fetch(zd,"Fptran",Fptran); // paint over transparent areas zdialog_fetch(zd,"scale",mmap_data->Fscale); zdialog_send_event(zd,"mrad"); // get kernel initialized takeMouse(mousefunc,drawcursor); // connect mouse function save_params(); // communicate current file new_session("-x1 -menu \"Copy From Image Slave\" "); // slave process for source image 26.8 return; } // dialog event and completion callback function int copy_from_image::dialog_event(zdialog *zd, ch *event) { using namespace copy_from_image; int dx, dy; float rad, kern, opccent, opcedge; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat == 1) edit_done(0); // commit edit else edit_cancel(0); // discard edit free_allblocks(); // free pixel block memory zfree(pixblockmem); mmap_data->killsource = 1; // make source image process exit return 1; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(mousefunc,drawcursor); if (strmatch(event,"scale")) // source image scale change zdialog_fetch(zd,"scale",mmap_data->Fscale); if (zstrstr("mrad opccent opcedge",event)) // get new brush attributes { zdialog_fetch(zd,"mrad",mrad); zdialog_fetch(zd,"opccent",opccent); zdialog_fetch(zd,"opcedge",opcedge); opccent = 0.01 * opccent; // scale 0 ... 1 opcedge = 0.01 * opcedge; opccent = pow(opccent,2); // change response curve opcedge = opccent * opcedge; // edge relative to center for (dy = -mrad; dy <= mrad; dy++) // rebuild kernel for (dx = -mrad; dx <= mrad; dx++) { rad = sqrt(dx*dx + dy*dy); kern = (mrad - rad) / mrad; // center ... edge >> 1 ... 0 kern = kern * (opccent - opcedge) + opcedge; // opacity center ... edge if (rad > mrad) kern = 0; // beyond mrad, within square if (kern < 0) kern = 0; if (kern > 1) kern = 1; kernel[dx+mrad][dy+mrad] = kern; } } if (strmatch(event,"undlast")) // undo last edit (click or drag) undo_lastblock(); if (strmatch(event,"undall")) { // undo all edits edit_reset(); free_allblocks(); } if (strmatch(event,"Fptran")) // flag, paint over transparency zdialog_fetch(zd,"Fptran",Fptran); return 1; } // mouse function void copy_from_image::mousefunc() { using namespace copy_from_image; static int pmxdown = 0, pmydown = 0; static int pmpx, pmpy; mode = 0; mpx = Mxposn; mpy = Myposn; mmap_data->mpx = mpx; // inform source image, mmap_data->mpy = mpy; // mouse position, mmap_data->mrad = mrad; // mouse radius if (LMclick && KBshiftkey) // shift + left mouse click { Mxdown = Mxclick; // click position Mydown = Myclick; mmap_data->mpxC = Mxdown; // inform source image, mmap_data->mpyC = Mydown; // new mouse drag start pixblockseq++; // new undo seq. no. mode = 1; if (! mmap_data->Freq) { // request pixel block from source mmap_data->Freq = 1; pmpx = mpx; // save mouse position pmpy = mpy; } } else if (Mxdrag || Mydrag) // drag in progress { if (Mbutton == 1) mode = 1; // left drag, paint if (Mbutton == 3) mode = 2; // right drag, erase if (Mxdown != pmxdown || Mydown != pmydown) { // new drag pmxdown = Mxdown; pmydown = Mydown; if (mode == 1) pixblockseq++; // new undo seq. no. } if (mode == 1 && ! mmap_data->Freq) { // request pixel block from source mmap_data->Freq = 1; pmpx = mpx; // save mouse position pmpy = mpy; } } if (mode == 1 && mmap_data->Freq == 2) { // new pixel block from source avail. mpx = pmpx; // synch mouse position mpy = pmpy; dopixels(); // paint pixel block on target image mmap_data->Freq = 0; // ready for next } if (mode == 2) dopixels(); // erase target image draw_mousecircle(0,0,0,1,0); // erase mouse circle draw_mousecircle(mpx,mpy,mrad,0,0); // draw mouse circle LMclick = RMclick = Mxdrag = Mydrag = 0; return; } // paint or erase 1 block of pixels within mouse radius of mpx, mpy void copy_from_image::dopixels() { using namespace copy_from_image; float *pix1, *pix2, *pix3, pixF[4]; int dx, dy, qx, qy, px, py; int ii, ww, hh, rs, dist = 0; int pot = Fptran; // paint over transparent areas float kern, alpha1, alpha2; ww = Eww; hh = Ehh; rs = 2 * mrad + 1; // pixel block row stride save_pixblock(); // save pixels for poss. undo for (dy = -mrad; dy <= mrad; dy++) // loop surrounding block of pixels for (dx = -mrad; dx <= mrad; dx++) { qx = mpx + dx; qy = mpy + dy; if (qx < 0 || qx > ww-1) continue; if (qy < 0 || qy > hh-1) continue; if (sa_stat == sa_stat_fini) { // select area active ii = qy * ww + qx; dist = sa_pixmap[ii]; if (! dist) continue; // pixel is outside area } kern = kernel[dx+mrad][dy+mrad]; // mouse opacities if (kern == 0) continue; // outside mouse radius pix1 = PXMpix(E1pxm,qx,qy); // input target image pixel ii = (dy + mrad) * rs + (dx + mrad); // source image pixel >> target pix2 = mmap_data->pixels + ii * 4; pix3 = PXMpix(E3pxm,qx,qy); // output target image pixel if (mode == 1) // paint { if (pot) alpha1 = 1; // paint over transparent areas else alpha1 = 0.00392 * pix1[3]; // input target image opacity alpha2 = 0.00392 * pix2[3]; // source image opacity if (alpha2 < 0.99) { pixF[0] = pix2[0] * alpha2 + pix1[0] * (1 - alpha2); // construct output target pixel pixF[1] = pix2[1] * alpha2 + pix1[1] * (1 - alpha2); // = source image pixel pixF[2] = pix2[2] * alpha2 + pix1[2] * (1 - alpha2); // + target image pixel pixF[3] = pix2[3] * alpha2 + pix1[3] * (1 - alpha2); } else { pixF[0] = pix2[0]; // (no transparency case) pixF[1] = pix2[1]; pixF[2] = pix2[2]; pixF[3] = pix2[3]; } if (alpha1 < 0.99) { pixF[0] = pixF[0] * alpha1; // apply target image opacity pixF[1] = pixF[1] * alpha1; pixF[2] = pixF[2] * alpha1; pixF[3] = pixF[3] * alpha1; } kern = 0.2 * kern; // output target image changes pix3[0] = kern * pixF[0] + (1 - kern) * pix3[0]; // gradually to source image pix3[1] = kern * pixF[1] + (1 - kern) * pix3[1]; pix3[2] = kern * pixF[2] + (1 - kern) * pix3[2]; pix3[3] = kern * pixF[3] + (1 - kern) * pix3[3]; } if (mode == 2) // erase { kern = 0.4 * kern; pix3[0] = kern * pix1[0] + (1.0 - kern) * pix3[0]; // gradual erase pix3[1] = kern * pix1[1] + (1.0 - kern) * pix3[1]; pix3[2] = kern * pix1[2] + (1.0 - kern) * pix3[2]; pix3[3] = kern * pix1[3] + (1.0 - kern) * pix3[3]; } } if (mode == 1) { CEF->Fmods++; CEF->Fsaved = 0; } px = mpx - mrad - 1; // repaint modified area py = mpy - mrad - 1; ww = 2 * mrad + 3; Fpaint3(px,py,ww,ww,0); return; } // save 1 block of pixels for possible undo void copy_from_image::save_pixblock() { using namespace copy_from_image; int cc, npix, dx, dy; int pcc = 4 * sizeof(float); float *pix3; pixblockmem_t *save1B; if (totmem > maxmem || totpixblock == maxpixblock) // free memory for oldest updates while (totmem > 0.7 * maxmem || totpixblock > 0.7 * maxpixblock) free_firstblock(); npix = 0; for (dy = -mrad; dy <= mrad; dy++) // count pixels in block for (dx = -mrad; dx <= mrad; dx++) { if (mpx + dx < 0 || mpx + dx > Eww-1) continue; if (mpy + dy < 0 || mpy + dy > Ehh-1) continue; npix++; } cc = npix * pcc + pixblockmem_cc; save1B = (pixblockmem_t *) zmalloc(cc,"copy from image"); // allocate memory for block pixblockmem[totpixblock] = save1B; totpixblock += 1; totmem += cc; save1B->seq = pixblockseq; // save pixel block poop save1B->mpx = mpx; save1B->mpy = mpy; save1B->mrad = mrad; npix = 0; for (dy = -mrad; dy <= mrad; dy++) // save pixels in block for (dx = -mrad; dx <= mrad; dx++) { if (mpx + dx < 0 || mpx + dx > Eww-1) continue; if (mpy + dy < 0 || mpy + dy > Ehh-1) continue; pix3 = PXMpix(E3pxm,(mpx+dx),(mpy+dy)); // edited image pixel memcpy(save1B->pixels[npix],pix3,pcc); npix++; } return; } // undo last pixel block (newest edit) and free memory void copy_from_image::undo_lastblock() { using namespace copy_from_image; int ii, cc, npix; int ww, px, py, dx, dy; int pcc = 4 * sizeof(float); float *pix3; pixblockmem_t *save1B; for (ii = totpixblock-1; ii >= 0; ii--) { save1B = pixblockmem[ii]; if (save1B->seq != pixblockseq) break; px = save1B->mpx; py = save1B->mpy; mrad = save1B->mrad; npix = 0; for (dy = -mrad; dy <= mrad; dy++) for (dx = -mrad; dx <= mrad; dx++) { if (px + dx < 0 || px + dx > Eww-1) continue; if (py + dy < 0 || py + dy > Ehh-1) continue; pix3 = PXMpix(E3pxm,(px+dx),(py+dy)); memcpy(pix3,save1B->pixels[npix],pcc); npix++; } px = px - mrad - 1; py = py - mrad - 1; ww = 2 * mrad + 3; Fpaint3(px,py,ww,ww,0); zfree(save1B); pixblockmem[ii] = 0; cc = npix * pcc + pixblockmem_cc; totmem -= cc; totpixblock--; } if (pixblockseq > 0) --pixblockseq; return; } // free memory for first pixel block (oldest edit) void copy_from_image::free_firstblock() { using namespace copy_from_image; int firstseq; int ii, jj, cc, npix; int px, py, dx, dy; int pcc = 4 * sizeof(float); pixblockmem_t *save1B; if (! totpixblock) return; firstseq = pixblockmem[0]->seq; for (ii = 0; ii < totpixblock; ii++) { save1B = pixblockmem[ii]; if (save1B->seq != firstseq) break; px = save1B->mpx; py = save1B->mpy; mrad = save1B->mrad; npix = 0; for (dy = -mrad; dy <= mrad; dy++) for (dx = -mrad; dx <= mrad; dx++) { if (px + dx < 0 || px + dx > Eww-1) continue; if (py + dy < 0 || py + dy > Ehh-1) continue; npix++; } zfree(save1B); pixblockmem[ii] = 0; cc = npix * pcc + pixblockmem_cc; totmem -= cc; } for (jj = 0; ii < totpixblock; jj++, ii++) pixblockmem[jj] = pixblockmem[ii]; totpixblock = jj; return; } // free all pixel block memory void copy_from_image::free_allblocks() { using namespace copy_from_image; int ii; pixblockmem_t *save1B; for (ii = totpixblock-1; ii >= 0; ii--) { save1B = pixblockmem[ii]; zfree(save1B); } pixblockseq = 0; totpixblock = 0; totmem = 0; return; } /**************************************************************************************/ // Copy From Image slave process - copy pixels from source image into shared memory. // Started by m_copy_from_image() as a separate session to view the source image. namespace copy_from_image_slave { void mousefunc(); void dopixels(); // update pixel block PXM *pxm_1x = 0, *pxm_scaled = 0; int mpxC, mpyC; // center of pixel copy area int mpx, mpy; // center of moving mouse circle int mrad; // radius of pixel copy area float Fscale = 1; typedef struct { // shared memory data int killsource; // source image process should exit int mpxC, mpyC; // center of pixel copy area (dest image) int mpxS, mpyS; // center of pixel copy area (source image) int mpx, mpy; // mouse drag position int mrad; // mouse radius float Fscale; // source image scale factor int Freq; // source/target coord. flag float pixels[402*402*4]; // pixel block, max. mrad = 200 } mmap_data_t; mmap_data_t *mmap_data; // shared memory pointer } // menu function void m_copy_from_image_slave(GtkWidget *, ch *) // split source/target processes { using namespace copy_from_image_slave; int err, fd; int pmpx = 0, pmpy = 0, pmrad = 0; size_t cc; F1_help_topic = TX("COPY FROM IMAGE"); printf("m_copy_from_image_slave \n"); fd = shm_open("/fotocx_copy_from_image",O_RDWR+O_CREAT,0600); // identify memory mapped region if (fd < 0) { zmessageACK(Mwin,"shm_open() failure: %s",strerror(errno)); return; } cc = sizeof(mmap_data_t); err = ftruncate(fd,cc); if (err) { zmessageACK(Mwin,TX("ftruncate() failure: %s"),strerror(errno)); return; } mmap_data = (mmap_data_t *) mmap(0,cc,PROT_WRITE,MAP_SHARED,fd,0); // create memory mapped region if (mmap_data == (void *) -1) { zmessageACK(Mwin,TX("mmap() failure: %s"),strerror(errno)); return; } ch *Pcurr_file = 0; int Frefresh = 1; int ww, hh; int mpx2, mpy2, mrad2; mrad = 50; while (true) { zmainloop(); if (! curr_file) { zmainsleep(0.1); continue; } if (mmap_data->killsource) goto done; // target image process is done if (! Pcurr_file || ! strmatch(curr_file,Pcurr_file)) { // detect file change zstrcopy(Pcurr_file,curr_file,"copy from image"); Frefresh = 1; } if (CEF) { // source image edit, wait until done Frefresh = 1; continue; } if (mmap_data->Fscale != Fscale) Frefresh = 1; if (Frefresh) { printf("m_copy_from_image_slave() source image: %s \n",curr_file); if (pxm_1x) PXM_free(pxm_1x); // refresh edited image if (E0pxm) pxm_1x = PXM_copy(E0pxm); else pxm_1x = PXM_load(curr_file,1); // load new image if (! pxm_1x) goto fail; Fscale = mmap_data->Fscale; ww = pxm_1x->ww * Fscale; hh = pxm_1x->hh * Fscale; if (pxm_scaled) PXM_free(pxm_scaled); pxm_scaled = PXM_rescale(pxm_1x,ww,hh); if (! pxm_scaled) goto fail; PXM_addalpha(pxm_scaled); takeMouse(mousefunc,targcursor); // connect mouse function Frefresh = 0; } mpx = mpxC + mmap_data->mpx - mmap_data->mpxC; // convert target copy area mpy = mpyC + mmap_data->mpy - mmap_data->mpyC; // to source copy area mrad = mmap_data->mrad; if (mpx != pmpx || mpy != pmpy || mrad != pmrad) { // mouse circle changed pmpx = mpx; pmpy = mpy; pmrad = mrad; mpx2 = mpx / Fscale; mpy2 = mpy / Fscale; mrad2 = mrad / Fscale; gdk_window_freeze_updates(Fgdkwin); draw_mousecircle(0,0,0,1,0); // erase mouse circle draw_mousecircle(mpx2,mpy2,mrad2,0,0); // draw mouse circle gdk_window_thaw_updates(Fgdkwin); zmainloop(); } if (mmap_data->Freq == 1) { // pixels wanted from target image dopixels(); // copy pixel block to shared memory mmap_data->Freq = 2; // pixel block available } } fail: zmessageACK(Mwin,TX("source image failure (scale too big?)")); done: if (CEF) edit_cancel(0); printf("m_copy_from_image_slave() exit \n"); quitxx(); } // mouse function void copy_from_image_slave::mousefunc() { using namespace copy_from_image_slave; if (LMclick && KBshiftkey) { // shift + left mouse click LMclick = 0; mmap_data->mpxS = Mxclick; // source image mouse center mmap_data->mpyS = Myclick; mpxC = Mxclick * Fscale; // source pixel copy area mpyC = Myclick * Fscale; } return; } // copy block of pixels within mouse circle to shared memory void copy_from_image_slave::dopixels() { using namespace copy_from_image_slave; float *pix0, *pix1; float pixnull[4] = { 0, 0, 0, 0 }; // black, alpha = 0 int dx, dy, qx, qy; int ii, ww, hh, rs; int pcc = 4 * sizeof(float); ww = pxm_scaled->ww; hh = pxm_scaled->hh; rs = 2 * mrad + 1; // pixel block row stride for (dy = -mrad; dy <= mrad; dy++) // loop surrounding block of pixels for (dx = -mrad; dx <= mrad; dx++) { qx = mpx + dx; qy = mpy + dy; if (qx < 0 || qx > ww-1 || qy < 0 || qy > hh-1) pix0 = pixnull; // pixel outside source image else pix0 = PXMpix(pxm_scaled,qx,qy); // source image pixel ii = (dy + mrad) * rs + (dx + mrad); pix1 = mmap_data->pixels + ii * 4; // to shared memory memcpy(pix1,pix0,pcc); } return; } /**************************************************************************************/ // Copy pixels from prior edit steps of current image. // Mouse can be weak or strong, and edits are removed incrementally. // E3 image (target) is incrementally replaced from chosen source image // (one of the previous edit steps for the current image). namespace copy_prior_edit_names { int radius; int cpower; int epower; editfunc EFcopy_prior_edit; } // menu function void m_copy_prior_edit(GtkWidget *, ch *menu) // menu function { using namespace copy_prior_edit_names; int copy_prior_edit_dialog_event(zdialog *, ch *event); // dialog event function void copy_prior_edit_mousefunc(); // mouse function zdialog *zd; ch text[40]; F1_help_topic = TX("COPY PRIOR EDIT"); printf("m_copy_prior_edit \n"); if (CEF) { zmessageACK(Mwin,TX("finish current edit first")); return; } if (URS_pos < 1) { zmessageACK(Mwin,TX("no prior edit")); return; } if (! E0pxm) { zmessageACK(Mwin,TX("no current edit image")); return; } EFcopy_prior_edit.menufunc = m_copy_prior_edit; // start new edit EFcopy_prior_edit.menuname = "Copy Prior Edit"; EFcopy_prior_edit.Farea = 1; // ignore area EFcopy_prior_edit.mousefunc = copy_prior_edit_mousefunc; if (! edit_setup(EFcopy_prior_edit)) return; // initz. edit /*** ______________________________________ | Copy Prior Edit | | | | prior edit step [_______________|v] | | mouse radius [____] | | power: center [____] edge [____] | | | | [OK] [X] | |______________________________________| ***/ zd = zdialog_new(TX("Copy Prior Edit"),Mwin,"OK","X",null); CEF->zd = zd; zdialog_add_widget(zd,"hbox","hbstep","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labstep","hbstep",TX("prior edit step"),"space=5"); zdialog_add_widget(zd,"combo","editstep","hbstep"); zdialog_add_widget(zd,"hbox","hbr","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labr","hbr",TX("Mouse Radius"),"space=5"); zdialog_add_widget(zd,"zspin","radius","hbr","2|500|1|200"); zdialog_add_widget(zd,"hbox","hbt","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labtc","hbt",TX("power: center"),"space=5"); zdialog_add_widget(zd,"zspin","center","hbt","0|100|1|50"); zdialog_add_widget(zd,"label","labte","hbt",TX("Edge"),"space=5"); zdialog_add_widget(zd,"zspin","edge","hbt","0|100|1|0"); for (int ii = 0; ii <= URS_pos; ii++) { // prior edit steps > dropdown list snprintf(text,40,"%d %s",ii,URS_menu[ii]); // (includes current image, URS_pos 0) zdialog_stuff(zd,"editstep",text); } E9pxm = PXM_copy(E1pxm); // initial source image (copy from) radius = 100; cpower = 50; epower = 0; zdialog_run(zd,copy_prior_edit_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion function int copy_prior_edit_dialog_event(zdialog *zd, ch *event) { using namespace copy_prior_edit_names; void copy_prior_edit_mousefunc(); ch text[40]; int nn; if (strmatch(event,"done")) zd->zstat = 1; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 2; // cancel if (zd->zstat) // done or cancel { if (zd->zstat == 1) edit_done(0); // complete edit else edit_cancel(0); freeMouse(); // disconnect mouse function return 1; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(copy_prior_edit_mousefunc,0); if (strmatch(event,"radius")) zdialog_fetch(zd,"radius",radius); // mouse radius if (strmatch(event,"center")) zdialog_fetch(zd,"center",cpower); // mouse center power if (strmatch(event,"edge")) zdialog_fetch(zd,"edge",epower); // mouse edge power if (strmatch(event,"editstep")) // select prior edit step { zdialog_fetch(zd,"editstep",text,40); // "nn menuname" nn = atoi(text); if (nn < 0 || nn > URS_max) return 1; if (E9pxm) PXM_free(E9pxm); E9pxm = load_undo(nn); // load prior edit output image if (! E9pxm) return 1; if (E9pxm->ww != Eww || E9pxm->hh != Ehh) { zmessageACK(Mwin,TX("Image dimensions have changed \n" "Copy Prior Edit cannot be used")); PXM_free(E9pxm); // free memory E9pxm = 0; } } return 1; } // mouse function void copy_prior_edit_mousefunc() { using namespace copy_prior_edit_names; int px, py, ww, rx, ry, radius2; float rad, rad2, power, F1; float R0, G0, B0, R3, G3, B3, R9, G9, B9; float *pix0, *pix3, *pix9; if (! CEF || ! E9pxm) return; // no source image radius2 = radius * radius; draw_mousecircle(Mxposn,Myposn,radius,0,0); // show mouse selection circle if (! Mxdrag && ! Mydrag) return; // wait for drag event Mxdrag = Mydrag = 0; // neutralize drag for (rx = -radius; rx <= radius; rx++) // loop every pixel in radius for (ry = -radius; ry <= radius; ry++) { rad2 = rx * rx + ry * ry; if (rad2 > radius2) continue; // outside radius px = Mxposn + rx; py = Myposn + ry; if (px < 0 || px > Eww-1) continue; // off the image edge if (py < 0 || py > Ehh-1) continue; rad = sqrt(rad2); power = cpower + rad / radius * (epower - cpower); // power at pixel radius, 0 - 100 F1 = 0.0004 * power; // scale 0 - 0.04 pix0 = PXMpix(E0pxm,px,py); // original image pixel pix3 = PXMpix(E3pxm,px,py); // current (painted) pixel pix9 = PXMpix(E9pxm,px,py); // source image pixel R0 = pix0[0]; // original pixel RGB G0 = pix0[1]; B0 = pix0[2]; R3 = pix3[0]; // current pixel RGB G3 = pix3[1]; B3 = pix3[2]; R9 = pix9[0]; // source pixel RGB G9 = pix9[1]; B9 = pix9[2]; if (Mbutton == 1) { // left mouse, move to source image R3 += F1 * (R9 - R0); // (paint) G3 += F1 * (G9 - G0); B3 += F1 * (B9 - B0); } else if (Mbutton == 3) { // right mouse, move to original image R3 += F1 * (R0 - R9); // (unpaint) G3 += F1 * (G0 - G9); B3 += F1 * (B0 - B9); } if (R0 > R9) { // limit R3 range to R0 ... R1 if (R3 < R9) R3 = R9; else if (R3 > R0) R3 = R0; } else { if (R3 < R0) R3 = R0; else if (R3 > R9) R3 = R9; } if (G0 > G9) { // G3 range if (G3 < G9) G3 = G9; else if (G3 > G0) G3 = G0; } else { if (G3 < G0) G3 = G0; else if (G3 > G9) G3 = G9; } if (B0 > B9) { // B3 range if (B3 < B9) B3 = B9; else if (B3 > B0) B3 = B0; } else { if (B3 < B0) B3 = B0; else if (B3 > B9) B3 = B9; } pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; } px = Mxposn - radius - 1; // repaint modified area py = Myposn - radius - 1; ww = 2 * radius + 3; Fpaint3(px,py,ww,ww,0); draw_mousecircle(Mxposn,Myposn,radius,0,0); // show mouse selection circle CEF->Fmods++; CEF->Fsaved = 0; return; } fotocx/fotocx.h0000664000175000017500000037566115247006660012525 0ustar micomico/******************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *********************************************************************************/ #include #include #include #include "jpeglib.h" #include "zfuncs.h" // Fotocx definitions #define Frelease "fotocx-26.8" // current release: 26.8 #define Flicense "Free software - GNU General Public License v.3" #define Fwebsite "https://kornelix.net/fotocx/fotocx.html" // fotocx web site #define Fgitlab "https://gitlab.com/fotocx" // GitLab home #define Fprivacy "https://gitlab.com/fotocx/fotocx/wikis/privacy" // Gitlab privacy policy #define Fcontact "mkornelix@gmail.com" #define MEGA (1024.0 * 1024.0) // 2**20 #define GIGA (1024.0 * MEGA) // 2**30 #define PI 3.141592654 #define RAD (180.0/PI) // PXM and PXB pixel address arithmetic // PXM / PXB >4 GB #define PXMpix(PXM,px,py) (PXM->pixels+(int64)(1)*(py)*(PXM->rs)+(px)*(PXM->nc)) #define PXBpix(PXB,px,py) (PXB->pixels+(int64)(1)*(py)*(PXB->rs)+(px)*(PXB->nc)) #define PIXBRIGHT(pix) (0.25*(pix)[0]+0.65*(pix)[1]+0.10*(pix)[2]) // compile time limits that could be increased #define XSMP 64 // max. SMP compute threads to use #define thumbfilesize 512 // thumbnail file pixel size #define maxtopfolders 500 // max. no. of top image folders #define indexrecl 2000 // max. image index rec. (>XFCC) #define maximages 1000000 // max. image files supported #define maxgallery 100000 // max. gallery/folder files supported #define maxworldcities 100000 // max entries in worldcities.txt #define SFmax 100000 // max files for select_files() #define ANCC 100 // max album name #define AFCC 300 // max album file name (path) #define maxalbums 300 // max total albums #define maxalbumfiles maxgallery // max files in one album // metadata tags for embedded image metadata #define meta_fdate_tag "FileModifyDate" // yyyy:mm:dd hh:mm:ss #define meta_fsize_tag "FileSize" // bytes #define meta_pdate_tag "DateTimeOriginal" // photo date/time #define meta_psize_tag "ImageSize" // image pixel size: 2345 1234 #define meta_bpc_tag "BitsPerSample" // 8/16/raw BPC #define meta_rating_tag "Rating" // star rating, 0-5 stars #define meta_keywords_tag "Keywords" // comma-delimited list for image search #define meta_title_tag "Title" // others: headline, event, abstract #define meta_desc_tag "Description" // others: imagedescription, subject ... #define meta_city_tag "City" // city or location name (geotags) #define meta_country_tag "Country" // country name #define meta_gps_tag "GPSposition" // GPS coordinates 123.45678 22.34567 #define meta_make_tag "Make" // camera make #define meta_model_tag "Model" // camera model #define meta_lens_tag "Lens" // camera lens #define meta_exp_tag "ExposureTime" // photo exposure time #define meta_fnum_tag "FNumber" // F-number or aperture #define meta_flen_tag "FocalLength" // focal length, real #define meta_iso_tag "ISO" // ISO speed/sensitivity #define meta_fl35_tag "FocalLengthIn35mmFormat" // 35mm equivalent (used by pano) #define meta_creator_tag "Creator" // others: artist, author, photographer ... #define meta_orientation_tag "Orientation" // orientation (number format) #define meta_rollangle_tag "RollAngle" // roll angle - canera tilt error #define meta_edithist_tag "ImageHistory" // tag for fotocx edit history #define edithistXcc 200 // max edit hist cc (per edit step) #define meta_copyright_tag "Copyright" // image copyright #define maxkeywords 10000 // max overall keywords #define maxkeywordcats 200 // max keyword categories #define keywordXcc 50 // max cc for one keyword or category name #define catgkeywordsXcc 20000 // max keywords cc for catg (textwidget limit) #define filekeywordsXcc 1000 // max keywords cc for one image file #define batchkeywordsXcc 1000 // max keywords cc for batch add tags #define searchkeywordsXcc 500 // max keywords cc for search tags #define recentkeywordsXcc 300 // max keywords cc for recent tags #define maxcaptags 20 // max tags in image popup captions #define capsXcc 2000 // max text in image popup captions #define maxbatchtags 50 // max metadata tags in batch report #define metatagXcc 80 // max cc for metadata tag name #define metadataXcc 2000 // max cc for metadata tag data 26.0 #define xmetaXtags 20 // max extra indexed metadata tags 26.0 #define xmetaXcc 2000 // max extra indexed metadata total cc 26.0 // GTK/GDK definitions #define TEXTWIN GTK_TEXT_WINDOW_TEXT #define NODITHER GDK_RGB_DITHER_NONE #define ALWAYS GTK_POLICY_ALWAYS #define NEVER GTK_POLICY_NEVER #define AUTO GTK_POLICY_AUTOMATIC #define GDKRGB GDK_COLORSPACE_RGB #define LINEATTRIBUTES GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER #define BILINEAR GDK_INTERP_BILINEAR #define HYPER GDK_INTERP_HYPER #define NEAREST GDK_INTERP_NEAREST #define SCROLLWIN GTK_SCROLLED_WINDOW #define VERTICAL GTK_ORIENTATION_VERTICAL #define HORIZONTAL GTK_ORIENTATION_HORIZONTAL #define MWIN GTK_WINDOW(Mwin) // externals from zfuncs module namespace zfuncs { extern GdkDisplay *display; // X11 workstation (KB, mouse, screen) extern GdkScreen *screen; // display (screen) extern GdkDevice *mouse; // pointer device extern GtkSettings *settings; // screen settings extern GtkWidget *mainwin; // main window for zfuncs parent extern ch *build_date_time; // build date and time extern ch *progexe; // executable path name extern int Fescape; // zdialog, escape key pressed extern int Fshutdown; // app shutdown is underway extern int monitor_ww, monitor_hh; // monitor pixel dimensions extern ch *appfont; // app font ("sans 10") extern int appfontsize; // app font size extern ch zappname[40]; // app name/version extern ch logfile[200]; // app log file extern ch zimagedir[200]; // where app image files live extern int Nmalloc, Nstrdup, Nfree; // malloc() strdup() free() counters extern int vmenuclickposn; // Vmenu icon click position, 0-100 extern int vmenuclickbutton; // Vmenu button: 1/3 = left/right mouse extern int vmenustop; // Vmenu setupfunc() stop flag extern int zdialog_count; // zdialog count (new - free) extern int zdialog_busy; // open zdialog count (run - destroy) extern zdialog *zdialog_list[zdialog_max]; // active zdialog list extern zdialog *zdialog_focus_zd; // zdialog with KB focus 26.8 extern pthread_t tid_main; // main() thread ID extern float splcurve_minx; // min. anchor point dist, % scale extern ch *zappcrash_context1, *zappcrash_context2; // zappcrash context data } // Image index record - xxrec_tab[] in-memory info for image files #define NKX 19 // metadata tags in xxrec_tab[] EX ch *tagnamex[NKX]; // initialization in fotocx.cc 25.1 EX ch *tagname_alt_title[3]; // alt. image title tag names ATD EX ch *tagname_alt_desc[6]; // alt. description tag names ATD struct xxrec_t { ch *file = 0; // - image filespec ch fdate[20]; // 0 file date, "yyyy:mm:dd hh:mm:ss" ch fsize[16]; // 1 file size, bytes "12345678" ch pdate[20]; // 2 photo date, "yyyy:mm:dd hh:mm:ss" ch psize[16]; // 3 pixel size, "12345 23456" ch bpc[4]; // 4 bits/color "8" "16" "12" (raw) ch rating[4]; // 5 rating, "0" to "5" stars ch *keywords = 0; // 6 keywords ch *title = 0; // 7 title ch *desc = 0; // 8 description ch location[40]; // 9 city, park, monument ... ch country[40]; // 10 country ch gps_data[24]; // 11 GPS coordinates "123.45678 -23.45678" ch make[20], model[20], lens[20]; // 12-14 camera data ch exp[12], fn[12], fl[12], iso[12]; // 15-18 exposure data ch *xmeta; // 19 extra indexed metadata }; EX xxrec_t **xxrec_tab; // image index table, filename sequence EX int Nxxrec; // count, < maximages EX ch *xmeta_tags[xmetaXtags]; // extra indexed metadata tag names EX int xmetaNtags; // extra indexed metadata tag count 26.0 // gallery files record struct Gindex_t { // gallery index ch *file = 0; // /folder.../filename int folder; // flag, this is a folder ch fdate[16]; // file date: yyyymmddhhmmss ch pdate[16]; // photo date: yyyymmddhhmmss uint fsize; // file size, bytes uint psize; // image size, pixels ch *mdata1 = 0; // fixed text for metadata report ch *mdata2 = 0; // variable text for metadata report }; enum FTYPE { IMAGE, RAW, VIDEO, FDIR, THUMB, OTHER, FNF }; // file types, FNF = file not found enum GTYPE { TNONE, FOLDER, SEARCH, META, RECENT, NEWEST, ALBUM }; // gallery types enum GSORT { SNONE, FNAME, FNUMBER, FDATE, PDATE, FSIZE, PSIZE, MDATA }; // gallery sort types enum GSEQ { QNONE, ASCEND, DESCEND }; // gallery sort sequence // externals from f.gallery namespace navi // gallery() data { extern Gindex_t *Gindex; // gallery index extern int Gmdrows; // text rows in metadata list extern int Gfiles; // gallery file count (images + subdirs) extern int Gfolders; // gallery subfolder count extern int Gimages; // gallery image file count extern ch *galleryname; // folder path or gallery type name extern GTYPE gallerytype; // gallery type: folder, recent, etc. extern GSORT gallerysort; // filename/file-date/photo-date extern GSEQ galleryseq; // ascending/descending extern int gallerypainted; // gallery paint is complete extern int galleryposn; // gallery target scroll position extern int scrollposn; // current scroll position extern int xwinW, xwinH; // image gallery window size extern int thumbsize; // curr. thumbnail display size extern int genthumbs; // counts thumbnails generated extern double thumbcache_MB; // thumbnail cache size, MB int gallery_paint(GtkWidget *, cairo_t *); // gallery window paint function void menufuncx(GtkWidget *, ch *menu); // gallery menu buttons function void changefolder(GtkWidget *widget, GdkEventButton *event); // gallery folder change function void newtop(GtkWidget *widget, GdkEventButton *event); // gallery change top folder function int mouse_event(GtkWidget *, GdkEvent *, void *); // gallery window mouse event function ch * gallery_dragfile(); // gallery window file drag function void gallery_dropfile(int mx, int my, ch *file); // gallery window file drop function int KBaction(ch *action); // gallery window KB key function } EX ch *SelFiles[SFmax]; // select_files(), selected files list EX int SFcount; // select_files(), file count // GTK etc. parameters EX GtkWidget *Mwin, *MWhbox, *MWvbox, *MWmenu; // main window containers EX GtkWidget *Fhbox, *Fvbox, *Fpanel, *Fpanlab, *Fdrawin; // F window widgets, file view EX GtkWidget *Ghbox, *Gvbox, *Gsep, *Gpanel, *Gtop; // G window widgets, gallery view EX GtkWidget *Mhbox; // M window widgets, net map view EX GtkWidget *Gscroll, *Gdrawin; // F view drawing window EX GtkAdjustment *Gadjust; EX GtkWidget *Cdrawin; // drawing area, Fdrawin or null EX GdkWindow *Fgdkwin; // corresp. GDK window EX PIXBUF *BGpixbuf; // window background pixbuf EX GdkCursor *arrowcursor; // main window cursors EX GdkCursor *dragcursor; EX GdkCursor *targcursor; EX GdkCursor *drawcursor; EX GdkCursor *blankcursor; EX GdkCursor *dotcursor; EX int BLACK[3], WHITE[3], RED[3], GREEN[3], BLUE[3]; // RGB values 0-255 EX int LINE_COLOR[3]; // line drawing color, one of the above EX draw_context_t draw_context; // GDK window drawing context // user preferences and settings EX ch *menu_style; // menu style: icons/text/both EX int FBrgb[3]; // F view background color, RGB 0-255 EX int GBrgb[3]; // G view background color, RGB 0-255 EX int MFrgb[3]; // menu font color, RGB 0-255 EX int MBrgb[3]; // menu background color, RGB 0-255 EX int iconsize; // menu icon size EX int SMPcount; // SMP processor cores to use EX ch *application_font; // menu + dialog font e.g. "sans 10" 26.3 EX ch *startdisplay; // startup display option EX ch *startalbum; // start album: file name EX ch *startfolder; // start folder EX ch *startfile; // start file EX int Findexlev; // 0/1/2 = none/old/old+new image files EX int FMindexlev; // Findexlev if start via file manager EX int Xindexlev; // actual index level, 0/1/2 25.1 EX int Findexnew; // new/mod files since full index 25.1 EX int Flastversion; // gallery shows last versions only EX ch *ImagePosn; // F-view image posn: left/center/right EX int Faskquit; // ask to quit option EX int Fshowhidden; // show hidden files option 26.4 EX int zoomcount; // zoom count to reach 2x (1-8) EX float zoomratio; // corresp. zoom ratio: 2**(1/zoomcount) EX int jpeg_def_quality; // default jpeg save quality EX ch *raw_loader_command; // RAW file loader command EX int Fraw_match_embed; // match RAW colors to embedded image EX ch *RAWfiletypes; // recognized RAW files: .raw .rw2 ... EX ch *VIDEOfiletypes; // recognized video files: .mov .mp4 ... // menu name and function table typedef void menufunc_t(GtkWidget *,ch *); // menu function type struct menutab_t { GtkWidget *topmenu; // parent menu ch *menu = 0; // menu text ch *icon = 0; // menu icon ch *desc = 0; // menu short description (tooltip) menufunc_t *func; // menu function (GtkWidget *, ch *) ch *arg = 0; // argument }; #define CCC (XFCC*2+200) // max. command line size EX ch command[CCC]; // (command, parameters, 2 filespecs) #define maxmenus 300 EX menutab_t menutab[maxmenus]; EX int Nmenus; // KB shortcut tables struct KBsftab_t { // eligible menus for KB shortcut ch *menu = 0; // menu name menufunc_t *func; // function ch *arg = 0; // argument }; #define maxkbsf 200 // functions that can have KB shortcuts EX KBsftab_t KBsftab[maxkbsf]; EX int Nkbsf; struct KBsutab_t { // user-defined shortcuts ch *key = 0; // key name, e.g. "Shift+U" ch *menu = 0; // menu name, e.g. "Redo" }; #define maxkbsu 100 // max. KB shortcuts EX KBsutab_t KBsutab[maxkbsu]; EX int Nkbsu; // general parameters EX int wwhh_limit1; // max. image width or height 26.3 EX int wwhh_limit2; // max. image width x height 26.3 EX int Fdevelop; // flag, show developer menu EX ch desktopname[100]; // locale specific desktop folder EX ch *Prelease; // prior fotocx version EX int mwgeom[4]; // main window position and size EX pid_t fotocxPID; // my process PID EX int *Nval; // static integer values 0-maximages EX ch FGM; // curr. view mode: 'F' 'G' 'M' EX int Fdcraw; // flag, dcraw installed EX int Fexiftool; // flag, exiftool installed EX int Fheif; // flag, heif-convert installed EX int Fjp2; // flag, opj_decompress installed EX int Fwebp; // flag, dwebp installed EX int Fvlc; // flag, vlc installed EX int Ffmpeg; // flag, ffmpeg installed EX int Faddr2line; // flag, addr2line installed EX int Fpaintrequest; // window paint request pending EX int Fpaintlock; // main window paint is blocked EX int Fmetamod; // image metadata unsaved changes EX int Ffullscreen; // flag, window is fullscreen EX int Fpanelshow; // show or hide F view top panel EX int Fmashup; // flag, mashup function is active EX int Fslideshow; // flag, slide show is active EX int Fview360; // flag, view360 function is active EX int Frecent; // start with recent files gallery EX int Fnew; // start with newly added files gallery EX int Fprev; // start with previous file EX int Fblank; // start with blank window EX int Fmousevents; // show popup text of mouse events EX ch *topmenu; // latest top-menu selection EX ch *initial_menu; // menu on command line EX ch *initial_file; // file name on command line EX ch *initial_album; // album name on command line EX ch *video_command; // command to show video file EX ch *F1_help_topic; // current function help topic EX int Fcaps; // toggle captions on or off EX ch *topfolders[maxtopfolders]; // user top-level image folders EX int Ntopfolders; // topfolders[] count EX ch *misstops[maxtopfolders]; // missing top folders (not mounted) EX int Nmisstops; // missing top folders count EX ch *thumbfolder; // thumbnails folder EX ch *curr_file; // current image file EX ch curr_file_type[8]; // jpg / tif / png / jxl / other jxl EX int curr_file_bpc; // image file bits/color, 8/16 EX uint curr_file_size; // image file size on disk EX int curr_file_posn; // position in current gallery, 0-last EX ch *curr_album; // current or last used album EX ch *recent_folders[10]; // recently used file folders EX ch meta_edithist[metadataXcc]; // EXIF edit history text EX int meta_edithist_cc0; // edit history text cc at file open EX int Fmeta_edithist; // edit history loaded for curr. file EX ch *copymove_loc; // last used copy/move to location EX ch *clicked_file; // image file / thumbnail clicked EX int clicked_posn; // clicked gallery position (Nth) EX int clicked_width; // clicked thumbnail position EX int clicked_height; // (normalized 0-100) EX ch *imagefiletypes; // supported image types: .jpg .png etc. EX ch *colormapfile; // curr. printer color map file EX ch *RGB_chooser_file; // user's color chooser image file EX ch paneltext[200]; // top panel application text EX int NSMP; // actual SMP threads to use (<= XSMP) EX ch *lc; // language code, default "en" 26.0 EX int Fscriptbuild; // edit script build is in-progress EX ch scriptfile[200]; // current script file name EX FILE *script_fid; // current script file FID EX int Fscriptrun; // flag, script file is active EX ch f_load_type[8]; // data set by PXB/PXM_load() EX int f_load_bpc; EX int f_load_size; EX ch *f_save_file; // data set by PXB/PXM_save() EX ch f_save_type[8]; EX int f_save_bpc; EX uint f_save_size; // files and folders in Fotocx home folder (normally /home//.fotocx) EX ch index_folder[200]; // image index folder EX ch image_folders_file[200]; // top image and thumbnail folders EX ch image_index_file[200]; // image index file EX ch meta_index_file[200]; // extra metadata index tags EX ch parameters_file[200]; // fotocx parameters file EX ch albums_folder[200]; // saved image albums EX ch custom_kernel_folder[200]; // custom convolution kernels EX ch markup_folder[200]; // saved markup text EX ch mashup_folder[200]; // mashup projects EX ch palettes_folder[200]; // color palett files EX ch pattern_folder[200]; // pattern files EX ch printer_color_folder[200]; // printer calibration EX ch saved_areas_folder[200]; // saved select area files EX ch saved_curves_folder[200]; // saved curve data EX ch scripts_folder[200]; // script files EX ch saved_searches_folder[200]; // saved search dialogs EX ch slideshow_folder[200]; // slide show files EX ch slideshow_trans_folder[200]; // slide show transition files EX ch temp_folder[200]; // temp. files folder EX ch keywords_defined_file[200]; // keywords defined file EX ch recentfiles_file[200]; // file of recent image files EX ch recent_folders_file[200]; // file of recently used folders EX ch gallerymem_file[200]; // file for recent galleries memory EX ch searchresults_file[200]; // file for search results EX ch meta_picklist_file[200]; // metadata tagname picklist EX ch meta_view_extras_file[200]; // view metadata optional tagnames EX ch meta_report_tags_file[200]; // metadata report tagnames EX ch KB_shortcuts_file[200]; // KB shortcuts file EX ch capstags_file[200]; // metadata tags for image captions EX ch raw_commands_file[200]; // file for RAW file loader commands EX ch bookmarks_file[200]; // file for gallery bookmarks EX ch custom_menu_file[200]; // file for user custom menu functions EX ch plugins_file[200]; // plugin menu functions file EX ch grid_picklist_file[200]; // grid settings file EX ch translations_folder[200]; // contains en.text. de.text ... 26.0 EX ch UG_file[200]; // userguide file, def. "ug_en" 26.5 // fotocx PXM and PXB pixmaps struct PXM { // PXM pixmap, 3|4 x float per pixel ch wmi[8]; // self-identifier int ww, hh, nc, rs; // width, height, channels, row stride float *pixels; // ww * hh * nc * sizeof(float) }; struct PXB { // PXB pixmap, 3|4 x uint8/pixel ch wmi[8]; // self-identifier int ww, hh, nc, rs; // width, height, channels, row stride uint8 *pixels; // hh * rs bytes (in pixbuf) PIXBUF *pixbuf; // parallel GDK pixbuf sharing pixels }; // parameters for F/W image window painting (functions Fpaint() etc.) struct Fstate_t { PXB *fpxb; // image PXB, size = 1x PXB *mpxb; // image PXB, size = Mscale int morgx, morgy; // Dpxb origin in Mpxb image int dorgx, dorgy; // Dpxb origin in drawing window float fzoom; // image zoom scale (0 = fit window) float mscale; // scale factor, 1x image to window image float pscale; // prior scale factor }; EX Fstate_t Fstate; // parameters for F view window EX Fstate_t *Cstate; // current state, Fstate or null #define Fpxb Fstate.fpxb // F/W window parameters #define Mpxb Fstate.mpxb #define Morgx Fstate.morgx #define Morgy Fstate.morgy #define Dorgx Fstate.dorgx #define Dorgy Fstate.dorgy #define Fzoom Fstate.fzoom #define Mscale Fstate.mscale #define Pscale Fstate.pscale EX PXM *E0pxm; // edit pixmap, original image EX PXM *E1pxm; // edit pixmap, base image for editing EX PXM *E3pxm; // edit pixmap, edited image EX PXM *ERpxm; // edit pixmap, undo/redo image EX PXM *E8pxm; // scratch image for some functions EX PXM *E9pxm; // scratch image for some functions EX int Dww, Dhh; // main/drawing window size EX int dww, dhh; // Dpxb size in drawing window, <= Dww, Dhh EX int zoomx, zoomy; // req. zoom center of window EX int Mbutton; // mouse button, 1/3 = left/right EX int Mwxposn, Mwyposn; // mouse position, window space EX int Mxposn, Myposn; // mouse position, image space EX int LMclick, RMclick; // mouse left, right click EX int Mxclick, Myclick; // mouse click position, image space EX int Mdrag; // mouse drag underway EX int mouse_dragtime; // current drag duration, milliseconds EX double wacom_pressure; // Wacom tablet, stylus pressure 0.0 to 1.0 EX int Mwdragx, Mwdragy; // drag increment, window space EX int Mxdown, Mydown, Mxdrag, Mydrag; // mouse drag vector, image space EX int Fmousemain; // mouse acts on main window not dialog EX int Mcapture; // mouse captured by edit function EX int Mradius; // mouse circle radius EX int MCpower, MEpower; // mouse paint power, center and edge EX int KBcapture; // KB key captured by edit function EX int KBkey; // active keyboard key EX int KBcontrolkey; // keyboard key states, 1 = down EX int KBshiftkey; EX int KBaltkey; // lines, text and circles drawn over window image whenever repainted struct topline_t { int x1, y1, x2, y2; // endpoint coordinates in image space int type; // 1/2/3/4 = black/white/both/dash }; #define maxtoplines 8 // max. top lines EX topline_t toplines[8], ptoplines[8]; // top lines, prior top lines EX int Ntoplines, Nptoplines; // current counts struct toptext_t { int ID, px, py; ch *text = 0; ch *font = 0; }; #define maxtoptext 100 // max. text strings EX toptext_t toptext[100]; // text strings EX int Ntoptext; // current count struct topcircle_t { // circle drawn over image int px, py; int radius; }; #define maxtopcircles 200 // max. circles on image EX topcircle_t topcircles[200]; // circles EX int Ntopcircles; // current count // select area data #define sa_initseq 10 // initial sequence number (0/1/2 reserved) #define sa_maxseq 9999 // ultimate limit 64K #define sa_mode_rect 1 // select rectangle by drag/click #define sa_mode_ellipse 2 // select ellipse by drag #define sa_mode_draw 3 // freehand draw by drag/click #define sa_mode_follow 4 // follow edge indicated by clicks #define sa_mode_mouse 5 // select area within mouse (radius) #define sa_mode_onecolor 6 // select one matching color within mouse #define sa_mode_allcolors 7 // select all matching colors within mouse #define sa_stat_none 0 // no select area present #define sa_stat_edit 1 // select area edit mode #define sa_stat_fini 2 // select area finished, enabled #define sa_stat_disab 3 // select area finished, disabled EX VOL int sa_stat; // select area status EX int sa_mode; // select area edit method EX uint16 sa_endpx[10000], sa_endpy[10000]; // last pixel drawn per sequence no. EX int sa_thresh; // mouse pixel distance threshold EX int sa_mouseradius; // mouse selection radius EX int sa_searchrange; // search range (* mouse radius) EX int sa_mousex, sa_mousey; // mouse position in image EX int sa_lastx, sa_lasty; // last selected mouse position EX float sa_colormatch; // color range to match (0.001 to 1.0) EX int sa_edgecalc_done; // edge distance calculation done EX int sa_edgecalc_busy; // edge distance calculation busy EX int sa_minx, sa_maxx; // enclosing rectangle for area EX int sa_miny, sa_maxy; EX ch *sa_stackdirec; // pixel search stack EX int *sa_stack; EX int sa_maxstack; EX int sa_Nstack; EX int sa_currseq; // current select sequence no. EX int sa_Ncurrseq; // current sequence pixel count EX uint8 *sa_pixselc; // maps pixels selected in current cycle EX uint16 *sa_pixmap; // 0/1/2+ = outside/edge/inside edge dist EX uint8 *sa_pixmap2; // maps mouse-selected pixels EX uint sa_Npixel; // total select area pixel count EX int sa_fww, sa_fhh; // valid image dimensions for select area EX int Fshowarea; // show/hide select area outline EX int areanumber; // increasing sequential number EX int gridsettings[5]; // grid line settings #define GON 0 // [0] grid lines on/off #define GXC 1 // [1] x-lines count #define GYC 2 // [2] y-lines count #define GXF 3 // [3] x-lines offset #define GYF 4 // [4] y-lines offset // image edit function data struct editfunc { // edit function data ch *menuname = 0; // menu name in menutab[*] ch edit_hist[edithistXcc]; // metadata edit history text int FprevReq; // request to use smaller image if poss. int Farea; // area: 0/1/2 = delete/ignore/usable int Fmods; // flag, image modifications by this func int Fpreview; // flag, using smaller image for edits int Fpaintedits; // flag, OK to use with paint edits int Fscript; // flag, function can be scripted int Fsaved; // current mods are saved to disk zdialog *zd = 0; // edit dialog spldat *sd = 0; // edit curve data void (*menufunc)(GtkWidget *, ch *); // edit menu function in menutab[*] void * (*threadfunc)(void *); // edit thread function void (*mousefunc)(); // edit mouse function }; EX editfunc *CEF; // current active edit function EX int Eww, Ehh; // dimensions of image being edited EX int Fpaintedits; // paint_edits() is active EX int editrescale[2]; // edit rescale width, height EX int Fupright; // flag, image was uprighted EX int Flevel; // flag, image was levelled EX int editpixels_pxlo; // get_edit_pixels() image area: EX int editpixels_pxhi; // - mouse circle box enclosure EX int editpixels_pylo; // - select area box enclosure EX int editpixels_pyhi; // - full image #define cropmem 5 // depth of crop memory below EX ch *cropsizes[5]; // crop size buttons, "2000x1200" etc. EX ch *cropratios[5]; // crop ratio buttons, "3:2" etc. EX int cropx1, cropy1, cropx2, cropy2; // crop rectangle NW and SE corners // edit undo/redo stack data #define maxedits 100 // undo/redo stack size EX ch URS_filename[200]; // stack image filename template EX int URS_pos; // stack position, 0-99 EX int URS_max; // stack max. position, 0-99 EX ch URS_menu[100][32]; // edit function menu name EX ch URS_parms[100][edithistXcc]; // edit parameters or null EX int URS_saved[100]; // flag, edit saved to file or not struct textattr_t { // attributes for gentext() function ch text[1000]; // text to generate image from ch font[80]; // font name int size; // font size int tww, thh; // generated image size, unrotated float angle; // text angle, degrees float sinT, cosT; // trig funcs for text angle ch color[4][20]; // text, backing, outline, shadow "R|G|B" int transp[4]; // corresponding transparencies 0-255 int towidth; // outline width, pixels int shwidth; // shadow width int shangle; // shadow angle -180...+180 int emboss[2]; // emboss radius, depth PXB *pxb_text; // image with text/outline/shadow }; struct lineattr_t { // attributes for genline() function int length, width; // line length and width, pixels int larrow, rarrow; // left/right arrow head size (0 = no arrow) int lww, lhh; // generated image size, unrotated float angle; // line angle, degrees float sinT, cosT; // trig funcs for line angle ch color[4][20]; // line, background, outline, shadow "R|G|B" int transp[4]; // corresponding transparencies 0-255 int towidth; // outline width, pixels int shwidth; // shadow width int shangle; // shadow angle -180...+180 PXB *pxb_line; // image with line/outline/shadow }; struct gallerymap_t { // geocoordinates for gallery files ch *file; float flati, flongi; }; EX gallerymap_t *gallerymap; EX int Ngallerymap; struct glocs_t { // geolocations table, memory DB ch *location, *country; // maps locations <-> earth coordinates float flati, flongi; // " float, 7 digit precision }; EX glocs_t **worldlocs; // cities geolocations table EX int Nworldlocs; // size of geolocations table EX glocs_t **imagelocs; // image geolocations table EX int Nimagelocs; // size of geolocations table // dialogs with global visibility EX zdialog *zd_paintedits; // m_paint_edits(), control dialog EX zdialog *zd_RGB_hist; // brightness histogram window EX zdialog *zd_darkbrite; // highlight dark/bright pixels zdialog EX zdialog *zd_editmeta; // edit metadata zdialog EX zdialog *zd_editanymeta; // edit any metadata zdialog EX zdialog *zd_deletemeta; // delete metadata zdialog EX zdialog *zd_batchkeywords; // batch keywords zdialog EX zdialog *zd_metaview; // view metadata zdialog EX zdialog *zd_filesave; // file save zdialog EX zdialog *zd_rename; // rename file zdialog EX zdialog *zd_copymove; // copy/move file zdialog EX zdialog *zd_deltrash; // delete/trash zdialog EX zdialog *zd_sela; // select area zdialog EX zdialog *zd_magnify; // magnify image zdialog EX zdialog *zd_album_update; // album_replacefile zdialog EX zdialog *zd_select_1file; // select_1file zdialog EX zdialog *zd_select_files; // select_files zdialog EX zdialog *zd_edit_bookmarks; // bookmarks edit zdialog EX zdialog *zd_ss_imageprefs; // slide show image prefs zdialog EX zdialog *zd_mapgeotags; // dialog wanting geotags via map click // initialization and GTK functions (fotocx.cc) int main(int argc, ch * argv[]); // main program int check_outboards(int fshow); // check required/optional program installs void first_index(); // initial user indexing decision int delete_event(); // window delete event function int destroy_event(); // window destroy event function int state_event(GtkWidget *, GdkEvent *event); // window state event function void drop_event(int mousex, int mousey, ch *file); // file drag-drop event function int Fbusy(int increment = 0); // +1/-1/0 and return function busy count void progress_setgoal(double goal); // reset progress counters, set goal value void progress_addvalue(double value); // increment progress value void progress_addvalue(int index, double value); // increment thread progress value int progress_getvalue(); // get progress value, 0 - goal int progress_percent(); // get progress value as percent 0-100 int timerfunc(void *arg); // periodic function for panel update void update_Fpanel(); // update top panel information void panelmessage(int red, int secs, ch *format, ...); // post application message in top panel void panelmessage(int secs); // clear top panel message (secs = 0) int Fblock(ch *funcname); // block/unblock mutex functions int paintlock(int lock); // block/unblock main window updates int Fpaint(GtkWidget *, cairo_t *); // F and W drawing area paint function void Fpaintnow(); // window repaint synchronously void Fpaint2(); // window repaint (thread callable) void Fpaint3(int px, int py, int ww, int hh, cairo_t *cr); // update Mpxb area from updated E3 area void Fpaint0(int px, int py, int ww, int hh, cairo_t *cr); // update Mpxb area from updated E0 area void Fpaint4(int px, int py, int ww, int hh, cairo_t *cr); // update Dpxb area from updated Mpxb void Fpaint3_thread(int px, int py, int ww, int hh); // Fpaint3 for threads (define update area) void Fpaint3_main(); // update Fpaint3 area in main thread void Fpaintmouse(int mxposn, int mypons, int radius); // update Mpxb area for mouse painted E3 area void mouse_event(GtkWidget *, GdkEventButton *, void *); // mouse event function void m_zoom(GtkWidget *, ch *); // zoom image +/- void KBevent(GdkEventKey *event); // pass dialog KB events to main app int KBpress(GtkWidget *, GdkEventKey *, void *); // KB key press event function int KBrelease(GtkWidget *, GdkEventKey *, void *); // KB key release event function void win_fullscreen(int hidemenu); // full screen without menu/panel void win_unfullscreen(); // restore to prior size with menu etc. void set_mwin_title(); // main window title = curr_file path // cairo drawing functions (fotocx.cc) void draw_pixel(int px, int py, cairo_t *cr, int mode = 0); // draw pixel void erase_pixel(int px, int py, cairo_t *cr); // erase pixel void draw_line(int x1, int y1, int x2, int y2, int type, cairo_t *cr); // draw line or dotted line (type 1/2) void erase_line(int x1, int y1, int x2, int y2, cairo_t *cr); // erase line void draw_toplines(int arg, cairo_t *cr); // draw all pre-set overlay lines void draw_gridlines(cairo_t *cr); // draw grid lines on image void add_toptext(int ID, int px, int py, ch *text, ch *font); // add text string with ID on window void draw_toptext(cairo_t *cr); // draw text strings when window repainted void erase_toptext(int ID); // remove all text strings with ID void draw_text(int px, int py, ch *text, ch *font, cairo_t *cr); // draw text on window void add_topcircle(int px, int py, int radius); // draw circle on window void draw_topcircles(cairo_t *cr); // draw circles when window repainted void erase_topcircles(); // remove all circles void draw_mousecircle(int cx, int cy, int rad, int Ferase, cairo_t *cr); // draw circle around mouse pointer void draw_mousecircle2(int cx, int cy, int rad, int Ferase, cairo_t *cr); // 2nd circle for m_copypixels1() void draw_mousearc(int cx, int cy, int ww, int hh, int Ferase, cairo_t *cr); // draw ellipse around pointer float RGBmatch(uint8 r1, uint8 g1, uint8 b1, uint8 r2, uint8 g2, uint8 b2); // match two RGB values float RGBmatch(float r1, float g1, float b1, float r2, float g2, float b2); // 0 - 1.0 = perfect match float RGBmatch(float r1, float g1, float b1, uint8 r2, uint8 g2, uint8 b2); float PIXmatch(uint8 *pix1, uint8 *pix2); // match two RGB pixels float PIXmatch(float *pix1, float *pix2); // 0 - 1.0 = perfect match float PIXmatch(float *pix1, uint8 *pix2); int RGBfix(float &R, float &G, float &B); // fix overflows, preserve colors int RGBfix(int &R, int &G, int &B); // edit support functions (fotocx.cc) int edit_wwhhOK(int ww, int hh); // check image size within limits int edit_setup(editfunc &EF); // start new edit transaction void edit_cancel(int keep); // cancel edit (keep zdialog etc.) void edit_fullsize(); // convert to full-size pixmaps void edit_done(int keep); // commit edit, add undo stack void edit_undo(); // undo edit, back to org. image void edit_redo(); // redo the edit after undo void edit_reset(); // reset to initial status void edit_addhist(ch *format, ...); // edit params > editfunc.edit_hist void m_undo_redo(GtkWidget *, ch *); // undo / redo if left / right mouse click void m_undo(GtkWidget *, ch *); // undo one edit void m_redo(GtkWidget *, ch *); // redo one edit void undo_all(); // undo all edits of current image void redo_all(); // redo all edits of current image void save_undo(); // undo/redo save function PXM * load_undo(int posn); // load image from undo/redo stack typedef void mcbFunc(); // callback function type EX mcbFunc *mouseCBfunc; // current edit mouse function void takeMouse(mcbFunc func, GdkCursor *); // capture mouse for edit dialog void freeMouse(); // free mouse for main window // thread support functions (fotocx.cc) typedef void * threadfunc(void *); // thread function type void thread_start(threadfunc func, void *arg); // start thread in idle state void thread_signal(); // signal thread that work is pending void thread_stop(); // stop thread and wait for exit void thread_wait(); // wait for thread to become idle void do_wthreads(threadfunc func, int Nt); // thread: start worker threads and wait // save and load parameters (fotocx.cc) void save_params(); // save parameters for next session void load_params(); // load parameters from prior session void free_resources(int fkeepundo = 0); // free resources associated with curr file // window and menu builder (f.widgets.cc) void build_widgets(); // build widgets for F/G/W/M view modes void popup_menufunc(GtkWidget *, ch *menu); // image/thumb right-click menu func void image_Rclick_popup(); // popup menu for image right-click void gallery_Lclick_func(int Nth); // function for thumbnail left-click void gallery_Rclick_popup(int Nth); // popup menu for thumbnail right-click void m_viewmode(GtkWidget *, ch *fgm); // set F/G/M view mode - menu func void viewmode(ch fgm); // set F/G/M view mode - callable void m_custom_menu(GtkWidget *, ch *); // build custom user menu void m_edit_script(GtkWidget *, ch *); // build script file with N edit funcs void edit_script_addfunc(editfunc *); // edit_done() hook to add script func void m_run_script(GtkWidget *, ch *); // run script on current image file void m_batch_script(GtkWidget *, ch *); // run script on batch of image files void m_plugins(GtkWidget *, ch *); // plugins menu function void m_edit_plugins(GtkWidget *, ch *); // edit plugin function void m_run_plugin(GtkWidget *, ch *); // run plugin function // pixmap/pixbuf memory image and file I/O functions (f.pixmap.cc) int64 imagesize(int ww, int hh, int nc, int pz); // get image size (pz = 1/4 for PXB/PXM) PXM * PXM_make(int ww, int hh, int nc); // create a PXM pixmap void PXM_free(PXM *&pxm); // free PXM pixmap void PXM_audit(PXM *pxm); // audit contents of a PXM pixmap void PXM_clear(PXM *pxm, int BW); // clear PXM pixmap to value BW (0/255) void PXM_addalpha(PXM *pxm); // add alpha channel to PXM pixmap void PXM_subalpha(PXM *pxm); // remove alpha channel from PXM pixmap void PXM_applyalpha(PXM *pxm); // apply alpha channel to RGB values PXM * PXM_copy(PXM *pxm); // copy PXM pixmap >> created PXM void PXM_copy(PXM *pxm1, PXM *pxm2); // copy PXM to existing PXM of equal size PXM * PXM_copy_area(PXM *pxm, int orgx, int orgy, int ww, int hh); // copy PXM section to a new PXM void PXM_copy_area(PXM *pxm1, PXM *pxm2, int orgx, int orgy, int ww, int hh); // copy PXM section into another PXM void PXM_copy_area(PXM *pxm1, PXM *pxm2, int orgx1, int orgy1, // copy PXM section into another PXM int orgx2, int orgy2, int ww, int hh); // (with destination offset) PXM * PXM_rescale(PXM *pxm, int ww, int hh); // rescale PXM pixmap (ww/hh) PXM * PXM_rotate(PXM *pxm, float angle, int fast = 0); // rotate PXM pixmap PXM * PXM_upright(PXM *pxm, int angle, int mirror); // upright PXM pixmap (rotate and mirror) void PXM_blur(PXM *pxm, int radius); // blur PXM pixmap image using blur radius void PXM_rgbdepth(PXM *pxm, int depth); // set PXM pixmap image RGB color depth 1-16 PXB * PXB_make(int ww, int hh, int nc); // create a PXB pixmap void PXB_free(PXB *&pxb); // free PXB pixmap void PXB_clear(PXB *pxb); // clear PXB pixmap to zeros (black) int PXB_addalpha(PXB *pxb); // add alpha channel to PXB pixmap int PXB_subalpha(PXB *pxb); // remove alpha channel from PXB pixmap PXB * PXB_copy(PXB *pxb); // copy (duplicate) PXB pixmap void PXB_copy_area(PXB *, int, int, int, int, PXB *, int, int); // copy area from one PXB to another PXB * PXB_subpxb(PXB *pxb1, int px1, int py1, int ww, int hh); // create new PXB from PXB section PXB * PXB_half(PXB *pxb1); // rescale PXB pixmap to 1/2 size PXB * PXB_rescale(PXB *pxb, int ww, int hh); // rescale PXB pixmap (ww/hh) PXB * PXB_rescale_fast(PXB *pxb1, int ww, int hh); // rescale " " faster, less quality PXB * PXB_rescale(PXB *pxb1, int size); // rescale PXB pixmap to max. ww/hh PXB * PXB_rescale_fast(PXB *pxb1, int size); // rescale PXB pixmap to max. ww/hh PXB * PXB_rotate(PXB *pxb, float angle); // rotate PXB pixmap int vpixel(PXB *pxb, float px, float py, uint8 *vpix); // get PXB virtual pixel at (px,py) int vpixel(PXM *pxm, float px, float py, float *vpix); // get PXM virtual pixel at (px,py) PXB * PXM_PXB_copy(PXM *pxm); // PXM to pixbuf, same scale void PXM_PXB_update(PXM *, PXB *, int px3, int py3, int ww3, int hh3); // update PXB area from PXM, same scale void PXB_PXB_update(PXB *, PXB *, int px3, int py3, int ww3, int hh3); // update PXB area from PXB, any scale PXB * PXB_load(ch *filespec, int fack); // load file to PXB pixmap, 8 bpc PXM * PXM_load(ch *filespec, int fack); // load file to PXM pixmap, 8/16 bpc int PXB_save(PXB *pxb, ch *filespec, int bpc, int quality, int fack); // save PXB pixmap to file int PXM_save(PXM *pxm, ch *filespec, int bpc, int quality, int fack); // save PXM pixmap to file PXB * JPG_PXB_load(ch *file, int size = 0); // JPG file to PXB, 8 bpc PXM * JPG_PXM_load(ch *file); // JPG file to PXM, 8 bpc int PXB_JPG_save(PXB *pxb, ch *file, int quality); // PXB to JPG file, 8 bpc int PXM_JPG_save(PXM *pxm, ch *file, int quality); // PXM to JPG file, 8 bpc PXB * TIFF_PXB_load(ch *filespec); // TIFF file to PXB, 8 bpc PXM * TIFF_PXM_load(ch *filespec); // TIFF file to PXM, 8/16 bpc int PXB_TIFF_save(PXB *pxb, ch *filespec, int bpc); // PXB to TIFF file, 8/16 bpc int PXM_TIFF_save(PXM *pxm, ch *filespec, int bpc); // PXM to TIFF file, 8/16 bpc PXB * PNG_PXB_load(ch *filespec); // PNG file to PXB, 8 bpc PXM * PNG_PXM_load(ch *filespec); // PNG file to PXM, 8/16 bpc int PXB_PNG_save(PXB *pxb, ch *filespec, int bpc); // PXB to PNG file, 8/16 bpc int PXM_PNG_save(PXM *pxm, ch *filespec, int bpc); // PXM to PNG file, 8/16 bpc PXB * JXL_PXB_load(ch *file); // JXL file to PXB, 8 bpc jxl PXM * JXL_PXM_load(ch *file); // JXL file to PXM, 16 bpc int PXB_JXL_save(PXB *pxb, ch *file); // PXB to JXL file, 8 bpc int PXM_JXL_save(PXM *pxm, ch *file); // PXM to JXL file, 16 bpc PXB * HEIC_PXB_load(ch *file, int size = 0); // HEIC file to PXB, 8 bpc PXM * HEIC_PXM_load(ch *file); // HEIC file to PXM, 8 bpc int PXB_HEIC_save(PXB *pxb, ch *file); // PXB to HEIC file, 8 bpc int PXM_HEIC_save(PXM *pxm, ch *file); // PXM to HEIC file, 8 bpc PXB * JP2_PXB_load(ch *file); // JP2 file to PXB, 8 bpc PXM * JP2_PXM_load(ch *file); // JP2 file to PXM, 8 bpc int PXB_JP2_save(PXB *pxb, ch *file); // PXB to JP2 file, 8 bpc int PXM_JP2_save(PXM *pxm, ch *file); // PXM to JP2 file, 8 bpc PXB * WEBP_PXB_load(ch *file); // WEBP file to PXB, 8 bpc PXM * WEBP_PXM_load(ch *file); // WEBP file to PXM, 8 bpc int PXB_WEBP_save(PXB *pxb, ch *file); // PXB to WEBP file, 8 bpc int PXM_WEBP_save(PXM *pxm, ch *file); // PXM to WEBP file, 8 bpc PXB * PDF_PXB_load(ch *file); // PDF/PS/EPS file to PXB, 8 bpc PXM * PDF_PXM_load(ch *file); // PDF/PS/EPS file to PXM, 8 bpc int PXB_PDF_save(PXB *pxb, ch *file); // PXB to PDF/PS/EPS file, 8 bpc int PXM_PDF_save(PXM *pxm, ch *file); // PXM to PDF/PS/EPS file, 8 bpc PXB * ANY_PXB_load(ch *filespec); // ANY file to PXB, 8 bpc PXM * ANY_PXM_load(ch *filespec); // ANY file to PXM, 8 bpc PXB * RAW_PXB_load(ch *rawfile, int matchthumb); // RAW file to PXB, 8 bpc PXM * RAW_PXM_load(ch *rawfile, int matchthumb); // RAW file to PXM, 16 bpc PXB * RAW_thumb_pxb(ch *rawfile); // RAW file to PXB for thumbnail creation void pixelvert(uint8 *buff1, uint8 *buff2, int ww, int hh, int nc1, int nc2); // convert pixel buffer format void pixelvert(uint8 *buff1, uint16 *buff2, int ww, int hh, int nc1, int nc2); // and/or channel count void pixelvert(uint8 *buff1, float *buff2, int ww, int hh, int nc1, int nc2); void pixelvert(uint16 *buff1, uint8 *buff2, int ww, int hh, int nc1, int nc2); void pixelvert(uint16 *buff1, uint16 *buff2, int ww, int hh, int nc1, int nc2); void pixelvert(uint16 *buff1, float *buff2, int ww, int hh, int nc1, int nc2); void pixelvert(float *buff1, uint8 *buff2, int ww, int hh, int nc1, int nc2); void pixelvert(float *buff1, uint16 *buff2, int ww, int hh, int nc1, int nc2); void pixelvert(float *buff1, float *buff2, int ww, int hh, int nc1, int nc2); // file menu functions (f.file.cc) void m_new_session(GtkWidget *, ch *); // start parallel fotocx session void new_session(ch *args); // callable function void m_open_file(GtkWidget *, ch *); // file open dialog void m_open_drag(int x, int y, ch *file); // open drag-drop file void m_cycle2files(GtkWidget *, ch *); // open/cycle 2 previous files void m_cycle3files(GtkWidget *, ch *); // open/cycle 3 previous files void m_view360(GtkWidget *, ch *); // view a 360 degree panorama int f_open(ch *file, int n=0, int kp=0, int ak=1, int z=0); // open new current image file int f_open_saved(); // open saved file, retain undo/redo stack int f_remove(ch *file, ch *opt); // delete/trash file/index/thumb/gallery void f_preload(int next); // start preload of next file void m_prev(GtkWidget *, ch *); // open previous file in gallery void m_next(GtkWidget *, ch *); // open next file in gallery void m_prev_next(GtkWidget *, ch *); // left/right mouse >> prev/next image void m_zoom_menu(GtkWidget *, ch *); // left/right mouse >> image/thumb zoom void m_rename(GtkWidget *, ch *); // rename an image file (same location) void m_blank_image(GtkWidget *, ch *); // create new blank image file int create_blank_file(ch *file, int ww, int hh, int RGB[3]); // create new blank image file, callable void m_copy_move(GtkWidget *, ch *); // copy or move image file to new location void m_copyto_desktop(GtkWidget *, ch *); // copy image file to desktop void m_copyto_clip(GtkWidget *, ch *file); // copy an image file to the clipboard void m_delete_trash(GtkWidget *, ch *); // delete or trash an image file void m_wallpaper(GtkWidget *, ch *file); // current file >> desktop wallpaper void set_wallpaper(ch *file); // set wallpaper (GNOME, KDE ...) 26.3 void m_print_image(GtkWidget *, ch *); // print an image file void m_print_calibrated(GtkWidget *, ch *); // print an image file with adjusted colors void m_calibrate_printer(GtkWidget *, ch *); // calibrate printer colors void m_quit(GtkWidget *, ch *); // exit application with checks void quitxx(); // exit unconditionally void m_uninstall(GtkWidget *, ch *); // uninstall fotocx void show_help(ch *topic); // show userguide topic 26.5 void m_help(GtkWidget *, ch *menu); // various help menu functions void m_file_save(GtkWidget *, ch *); // save modified image file to disk void m_file_save_replace(GtkWidget *, ch *menu); // for KB shortcut Save File (replace) void m_file_save_version(GtkWidget *, ch *menu); // for KB shortcut Save File Version int f_save(ch *outfile, ch *type, int bpc, int qual, int ack); // save current image file to disk int f_save_as(); // save_as dialog (choose file and bpc) ch * f_realpath(ch *infile); // get real path for file with symlinks ch * file_rootname(ch *file); // get root name without .vNN.ext ch * file_basename(ch *file); // get base name /.../filename.ext ch ** file_all_versions(ch *file, int &nf); // get all versions for given file ch * file_new_version(ch *file); // get next avail. file version name ch * file_newest_version(ch *file); // get newest version or original file ch * file_prior_version(ch *file); // get prior version or original file int find_imagefiles(ch *dir, int flags, ch **&files, int &Nf); // find all image files within a folder int regfile(ch *file, struct stat *statb = 0); // test file is regular file, opt. return stat int dirfile(ch *file, struct stat *statb = 0); // test file is directory, opt. return stat int hasperm(ch *file, ch rw); // test file exists with 'r'/'w' permission int set_permissions(GtkWidget *win, ch *file, ch *p1, ch *p2); // show and set file permissions int conv_permissions(ch *perms, mode_t &mode); // conv. "read+write" etc. to mode_t int conv_permissions(mode_t mode, ch *perms); // conv. mode_t to "read+write" etc. // thumbnail gallery and navigation functions (f.gallery.cc) ch * gallery(ch *filez, ch *action, int Nth); // display image gallery window, navigate void gallery_memory(ch *action); // save/recall gallery sort and posn. void set_gwin_title(); // main window title = gallery name ch * prev_next_file(int index, int lastver); // get prev/next file with last version option ch * prev_next_gallery(int index); // get prev/next gallery (physical folder) int file_position(ch *file, int Nth); // get rel. position of file in gallery void image_file_type_init(void); // initialization for image_file_type() FTYPE image_file_type(ch *file); // FNF folder IMAGE RAW THUMB OTHER ch * thumb2imagefile(ch *thumbfile); // get image file for thumbnail file ch * image2thumbfile(ch *imagefile); // get thumbnail file for image file int thumbfile_OK(ch *imagefile); // check thumbnail file exists and not stale int update_thumbfile(ch *imagefile); // create or refresh thumbnail file int thumbfile_set_mod_time(ch *imagefile); // set thumbnail mod time from image file void delete_thumbfile(ch *imagefile); // delete thumbnail for file PIXBUF * get_thumb_pixbuf(ch *imagefile); // get thumbnail pixbuf for image file void gallery_popimage(); // popup big image of clicked thumbnail ch * select_1file(ch *gfolder); // select one file from gallery window void select_1file_Lclick_func(int Nth); // select_1file, thumbnail left-click int select_2files(ch *&file1, ch *&file2); // select two files, check ww/hh match 26.8 void select_files(int fclear = 0); // select files from gallery window void add_file_to_selection(ch *file); // add file to selection void select_files_Lclick_func(int Nth); // select_files, thumbnail left-click void select_files_Rclick_func(int Nth); // select_files, thumbnail right-click void m_thumbview(GtkWidget *, ch *); // gallery, thumbnails + file data void m_metaview(GtkWidget *, ch *); // gallery, thumbnails + basic metadata void m_recentfiles(GtkWidget *, ch *); // gallery of recently viewed files void m_search_results(GtkWidget *, ch *); // gallery of latest search results 26.5 void add_recent_file(ch *file); // add file to recent file list void m_newest_files(GtkWidget *, ch *); // gallery of newest files void m_gallery_sort(GtkWidget *, ch *); // sort gallery by file, date, size ... void m_gallery_filter(GtkWidget *, ch *); // filter gallery for new/old/pattern void m_current_file_folder(GtkWidget *, ch *); // set gallery to current file folder void m_recent_folders(GtkWidget *, ch *); // set gallery to chosen recent folder void add_recent_folder(ch *foldername); // add current folder to top of list void m_folder_tree(GtkWidget *, ch *); // list folders, click for gallery void m_select_files(GtkWidget *, ch *); // files for album/batch/script funcs void m_bookmarks(GtkWidget *, ch *); // select bookmark, goto gallery posn void m_edit_bookmarks(GtkWidget *, ch *); // edit bookmarks (gallery/file position) void edit_bookmarks_Lclick_func(int Nth); // thumbnail click response function void m_current_album(GtkWidget *, ch *); // for KB shortcut "Current Album" int popup_image(ch *imagefile, GtkWindow *parent, int Fnewin, int size); // popup window with image // albums menu (f.albums.cc) void m_album_create(GtkWidget *, ch *); // create a new album int album_create_from_gallery(ch *newalbumfile); // create album from current gallery void m_album_rename(GtkWidget *, ch *); // rename an album void m_album_delete(GtkWidget *, ch *); // delete an album void m_album_choose(GtkWidget *, ch *); // choose an album, show as gallery void album_show(ch *albumfile = 0); // set/show current album gallery void m_album_current(GtkWidget *, ch *); // show current (last used) album void m_gallery_to_album(GtkWidget *, ch *); // save current gallery as album void album_add_selfiles(int mode); // add selected files to album void album_add_currfile(int mode); // add current file to album void album_add_file(ch *file, int posn); // add one file to album (drag/drop) void album_remove_file(int posn); // remove file from album void album_move_file(int pos1, int pos2); // move file position (drag/drop) void album_folder_rename(ch *oldname, ch *newname); // fix album files after folder rename void album_purge_replace(ch *album, int Nt, ch **tfile, ch **rfile); // purge missing, replace target files void album_purge_replace(ch *album, ch *targfile, ch *repfile); // version for single target file void m_update_albums(GtkWidget *, ch *); // update albums for new file version void update_albums_Lclick_func(int Nth); // m_update_albums() thumbnail click void m_album_mass_update(GtkWidget *, ch *); // album mass update tools void m_cycle_wallpaper(int argc, ch *argv[]); // cycle wallpaper (command line, no menu) // slide show menu (f.albums.cc) void m_slideshow(GtkWidget *, ch *); // enter or leave slideshow mode void ss_imageprefs_Lclick_func(int Nth); // slideshow image prefs thumbnail click func void ss_KBfunc(int KBkey); // slideshow keyboard input // metadata menu functions (f.meta.cc) int select_meta_tags(zlist_t *mlist, int maxout, int exclude); // dialog to select metadata tags void meta_view(int type); // refresh current metadata report void m_meta_view_main(GtkWidget *, ch *menu); // metadata short report void m_meta_view_all(GtkWidget *, ch *menu); // report all metadata void m_meta_edit_main(GtkWidget *, ch *menu); // primary edit main metadata dialog void m_meta_edit_any(GtkWidget *, ch *menu); // dialog to fetch and save any metadata by name void m_meta_delete(GtkWidget *, ch *menu); // dialog to delete any image file metadata by name void m_meta_copy(GtkWidget *, ch *menu); // copy metadata from one image file to another void m_meta_fix(GtkWidget *, ch *menu); // fix file with malformed metadata void m_meta_manage_keywords(GtkWidget *, ch *menu); // define keywords for image searching void m_meta_choose_caps(GtkWidget *, ch *menu); // choose metadata tags for image captions void meta_show_caps(int show); // show captions on current image void meta_popup_title(int onoff); // show title & description in popup window void m_meta_toggle_caps(GtkWidget *, ch *menu); // toggle display of image captions on/off void m_batch_keywords(GtkWidget *, ch *menu); // batch add and delete keywords for selected files void m_batch_rename_keywords(GtkWidget *, ch *menu); // rename or delete keywords using a from-to list void m_batch_purge_keywords(GtkWidget *, ch *menu); // purge keyword names from all image files void m_batch_photo_date_time(GtkWidget *, ch *menu); // change or shift photo date/time void m_batch_change_meta(GtkWidget *, ch *menu); // add/change or delete metadata for selected files void m_batch_report_meta(GtkWidget *, ch *menu); // batch metadata report to text file void m_batch_geotags(GtkWidget *, ch *menu); // add given geotag to selected set of images void m_meta_places_dates(GtkWidget *, ch *); // find images by location and date range void m_meta_timeline(GtkWidget *, ch *); // find images by year and month void m_meta_tags(GtkWidget *, ch *); // find images by tag name and value void m_autosearch(GtkWidget *, ch *); // search function for use with scripts void m_search_images(GtkWidget *, ch *); // find images using any metadata and/or file names int load_imagelocs(); // load image geolocations table int load_worldlocs(); // load world cities geolocations table int find_location(zdialog *zd); // combined image and world search int choose_location(ch *location, ch *country, float &flati, float &flongi); // find location name matching partial inputs float nearest_loc(float flati, float flongi, int &iim, int &iic); // find nearest loc, image or world city int get_gps_data(ch *gps_data, float &flat, float &flong); // convert and validate GPS data int get_gallerymap(); // get map coordinates for current gallery files int meta_get(ch *file, ch **tagname, ch **tagval, int NK); // get image file metadata from list of tags int meta_getN(ch **files, int NF, ch **tagname, ch **tagval, int NK, int Fall); // same for multiple files, using multiple threads int meta_put(ch *file, ch **tagname, ch **tagval, int ntags); // update image metadata from list of tags and data int meta_copy(ch *file1, ch *file2, ch **tagname, ch **tagval, int NK); // copy metadata file1 >> file2, with revisions int file_to_xxrec(ch *file); // update xxrec_tab[] record from file metadata int xxrec_index(ch *file); // return xxrec_tab[] index for input file xxrec_t * get_xxrec(ch *file); // get image xxrec_tab[] for image file xxrec_t * read_xxrec_seq(int &ftf); // read xxrec_tab[] records sequentially int write_xxrec_seq(xxrec_t *xxrec, int &ftf); // write xxrec_tab[] records sequentially // internet map functions (f.netmap.cc) void m_load_netmap(GtkWidget *, ch *); // initialize internet map void map_marker_event(ch *); // find images within marker, show gallery void map_mouse_event(int type, float lati, float longi); // handle mouse movement and clicks on map void m_show_on_map(GtkWidget *, ch *); // go to map position and set zoom level int find_geocoordinates(ch *loc, ch *country, float &lati, float &longi); // get geocoordinates for location // select area menu functions (f.select.cc) void m_select_area(GtkWidget *, ch *); // select area to edit within image void m_select_find_gap(GtkWidget *, ch *); // find gap in area outline void m_select_blend(GtkWidget *, ch *); // blend area edits using mouse void m_select_show(GtkWidget *, ch *); // enable area for subsequent edits void m_select_hide(GtkWidget *, ch *); // show area outline void m_select_enable(GtkWidget *, ch *); // hide area outline void m_select_disable(GtkWidget *, ch *); // disable area void m_select_invert(GtkWidget *, ch *); // invert area void m_select_clear(GtkWidget *, ch *); // clear area void m_select_copy(GtkWidget *, ch *); // copy area to default file void m_select_save(GtkWidget *, ch *); // copy area to designated file void select_copysave(GtkWidget *, ch *menu); // common function for above two void m_select_load(GtkWidget *, ch *); // load file and paste as area in image void m_select_paste(GtkWidget *, ch *); // paste last copied area into image void sa_geom_mousefunc(); // select rectangle or ellipse void sa_draw_mousefunc(); // edge line drawing function int sa_nearpix(int mx, int my, int rad, int &px, int &py, int fx); // find nearest pixel void sa_draw_line(int px1, int py1, int px2, int py2, cairo_t *cr); // draw a connected line void sa_draw1pix(int px, int py, cairo_t *cr); // add one pixel to select area void sa_mouse_select(); // select by mouse (opt. color match) void sa_nextseq(); // start next sequence number void sa_unselect_pixels(cairo_t *cr); // remove current selection void sa_pixmap_create(); // create area pixel maps void sa_finish(); // finish - map interior pixels void sa_finish_auto(); // finish - interior pixels already known void sa_unfinish(); // set finished area back to edit mode void sa_map_pixels(); // map edge and interior pixels void sa_show(int flag, cairo_t *cr); // show or hide area outline void sa_show_rect(int px1, int py1, int ww, int hh, cairo_t *cr); // show area outline inside a rectangle int sa_validate(); // validate area for curr. image void sa_enable(); // enable area void sa_disable(); // disable area void sa_invert(); // invert area void sa_clear(); // clear area void sa_edgecalc(); // calculate area edge distances void sa_edgecreep(int); // adjust area edge +/- void sa_postfix(); // copy E1 to E3 outside area, blend E3 edges // image edit functions - Edit menu (f.edit.cc) void get_edit_pixels_init(int Nthreads, int margin); // get edit pixels initz. (mouse/area/full) int get_edit_pixels(int thread, int &px, int &py, float &blend); // get edit pixels from image, area, or mouse void m_rotate(GtkWidget *, ch *); // rotate or level image void m_upright(GtkWidget *, ch *); // upright or mirror-flip an image void m_crop(GtkWidget *, ch *); // crop image margins void m_retouch(GtkWidget *, ch *); // brightness, contrast, color void blackbodyRGB(int K, float &R, float &G, float &B); // convert deg. K to RGB factors void m_rescale(GtkWidget *, ch *); // rescale image void m_split_screen(GtkWidget *, ch *); // view edit before/after using split-screen void m_show_diffs(GtkWidget *, ch *); // show image differences on the image void m_margins(GtkWidget *, ch *); // add margins around image void m_markup(GtkWidget *, ch *); // draw text/line/box/oval on image void m_draw_text(GtkWidget *, ch *); // draw text on image void load_text(zdialog *zd); // load text and attributes from a file void save_text(zdialog *zd); // save text and attributes to a file int gentext(textattr_t *attr); // generate text image from attributes void m_draw_line(GtkWidget *, ch *); // draw line/arrow on image void load_line(zdialog *zd); // load line attributes from a file void save_line(zdialog *zd); // save line attributes to a file int genline(lineattr_t *attr); // generate line/arrow image from attributes void m_draw_box(GtkWidget *, ch *); // draw box on image void m_draw_oval(GtkWidget *, ch *); // draw oval on image void m_color_mode(GtkWidget *, ch *); // B+W/color, negative/positive, sepia void m_paint_edits(GtkWidget *, ch *); // paint edits gradually by mouse painting void m_paint_image(GtkWidget *, ch *); // paint on image with the mouse int RGB_chooser(zdialog *zd, ch *butt, uint8 rgb[3]); // dialog, get color from color file int HSL_chooser(zdialog *zd, ch *butt, uint8 RGB[3]); // dialog, get color from HSL dialog void HSLtoRGB(float H, float S, float L, float &R, float &G, float &B); // convert HSL color space to RGB void RGBtoHSL(float R, float G, float B, float &H, float &S, float &L); // convert RGB color space to HSL void m_paint_transparency(GtkWidget *, ch *); // paint transparency with the mouse void m_area_fill(GtkWidget *, ch *); // fill selected areas or transparent areas void m_copy_in_image(GtkWidget *, ch *); // copy pixels within one image void m_copy_from_image(GtkWidget *, ch *); // copy pixels from one image to another void m_copy_from_image_slave(GtkWidget *, ch *); // source image slave process for the above void m_copy_prior_edit(GtkWidget *, ch *); // undo prior edits by mouse painting // image edit functions - Repair menu (f.repair.cc) void m_sharpen(GtkWidget *, ch *); // sharpen image void sharp_AC(int amount, int thresh); // callable amplify contrast void m_fix_motionblur(GtkWidget *, ch *); // reduce blur from camera motion void m_blur(GtkWidget *, ch *); // blur image - main menu void m_blur_normal(GtkWidget *, ch *); // submenu, normal blur void m_blur_radial(GtkWidget *, ch *); // submenu, radial blur void m_blur_directed(GtkWidget *, ch *); // submenu, mouse-directed blur void m_blur_graduated(GtkWidget *, ch *); // submenu, graduated blur void m_blur_background(GtkWidget *, ch *); // submenu, background blur void m_denoise(GtkWidget *, ch *); // image noise reduction void m_defog(GtkWidget *, ch *); // add/remove fog/haze based on brightness void m_redeyes(GtkWidget *, ch *); // red-eye removal void m_smart_erase(GtkWidget *, ch *); // smart erase object void m_remove_halo(GtkWidget *, ch *); // remove halo left by other edits void m_jpeg_artifacts(GtkWidget *, ch *); // suppress jpeg compression artifacts void m_anti_alias(GtkWidget *, ch *); // suppress jaggies on feature edges void m_adjust_RGB(GtkWidget *, ch *); // color adjust using RGB or CMY colors void m_adjust_HSL(GtkWidget *, ch *); // color adjust with HSL color model void m_remove_dust(GtkWidget *, ch *); // remove dust spots void m_fringes(GtkWidget *, ch *); // reduce lateral chromatic aberration // image edit functions - Refine menu (f.refine.cc) void m_flat_hist(GtkWidget *, ch *); // flatten brightness histogram void m_localcon(GtkWidget *, ch *); // increase local contrast void m_amplifycon(GtkWidget *, ch *); // amplify existing contrast levels void m_gretinex(GtkWidget *, ch *); // rescale RGB levels - global void m_lretinex(GtkWidget *, ch *); // rescale RGB levels - local void m_saturation(GtkWidget *, ch *); // adjust saturation based on brightness void m_soft_focus(GtkWidget *, ch *); // apply lens soft focus effect void m_match_colors(GtkWidget *, ch *); // set image2 colors to match image1 void m_brite_ramp(GtkWidget *, ch *); // add brightness ramp across image void m_vignette(GtkWidget *, ch *); // vignette tool // image edit functions - Effects menu (f.effects.cc) void m_outlines(GtkWidget *, ch *); // outline drawing void m_sketch1(GtkWidget *, ch *); // simulated sketch (1) void m_sketch2(GtkWidget *, ch *); // simulated sketch (2) void m_cartoon(GtkWidget *, ch *); // cartoon drawing void m_emboss(GtkWidget *, ch *); // simulated embossing void m_tiles1(GtkWidget *, ch *); // square tiles void m_tiles2(GtkWidget *, ch *); // irregular tiles matching image void m_painting(GtkWidget *, ch *); // simulated painting void m_texture(GtkWidget *, ch *); // add texture to image void m_fusion(GtkWidget *, ch *); // suppress fine details, retaining sharpness void m_pattern(GtkWidget *, ch *); // tile image with a pattern void m_crosshatch(GtkWidget *, ch *); // crosshatch drawing void m_dither(GtkWidget *, ch *); // dithered dots - main menu void m_dither0(GtkWidget *, ch *); // submenu, Roy Lichtenstein dots void m_dither1(GtkWidget *, ch *); // submenu, pure RGB or B&W dots void m_dither2(GtkWidget *, ch *); // submenu, RGB reduced bit-depth dots void m_dither3(GtkWidget *, ch *); // submenu, custom palette color dots void m_dither4(GtkWidget *, ch *); // submenu, pixels condense into blobs void m_engrave(GtkWidget *, ch *); // engrave - black/white lines void m_addglare(GtkWidget *, ch *); // add glare around bright objects void m_mosaic(GtkWidget *, ch *); // make mosaic with tiles from images void m_add_noise(GtkWidget *, ch *); // add random_noise to image void m_set_colors(GtkWidget *, ch *); // set no. colors for R/G/B or total void m_shift_colors(GtkWidget *, ch *); // shift colors into other colors void m_alien_colors(GtkWidget *, ch *); // revise hues using an algorithm void m_anykernel(GtkWidget *, ch *); // apply custom convolution kernel // image edit functions - Warp menu (f.warp.cc) void m_unbend(GtkWidget *, ch *); // unbend panoramas void m_perspective(GtkWidget *, ch *); // warp tetragon into rectangle void m_warp_area(GtkWidget *, ch *); // warp image within an area void m_warp_linear1(GtkWidget *, ch *); // warp image, linear 1 transform void m_warp_linear2(GtkWidget *, ch *); // warp image, linear 2 transform void m_warp_curved(GtkWidget *, ch *); // warp image, curved transform void m_warp_affine(GtkWidget *, ch *); // warp image, affine transform void m_warp_radial(GtkWidget *, ch *); // add/remove barrel/pincushion distortion void m_unwarp_closeup(GtkWidget *, ch *); // warp image within closeup face area void m_makewaves(GtkWidget *, ch *); // warp image using a wave pattern void m_twist(GtkWidget *, ch *); // twist image centered at mouse void m_sphere(GtkWidget *, ch *); // image spherical projection void m_inside_out(GtkWidget *, ch *); // turn an image inside-out void m_tiny_planet(GtkWidget *, ch *); // convert image to tiny planet void m_escher_spiral(GtkWidget *, ch *); // generate inward spiraling image void m_flatphoto(GtkWidget *, ch *); // flatten photo of a curved surface // image edit functions - Combine menu (f.combine.cc) void m_HDR(GtkWidget *, ch *); // make HDR combined image void m_HDF(GtkWidget *, ch *); // make HDF combined image void m_stack_paint(GtkWidget *, ch *); // stack / paint images void m_stack_noise(GtkWidget *, ch *); // stack / noise reduction void m_stack_layers(GtkWidget *, ch *); // stack / paint image layers void m_panorama(GtkWidget *, ch *); // make panorama combined image void m_cim_show_files(GtkWidget *, ch *); // show input files for cim edit function // image edit functions - mashup and image_array (f.mashup.cc) void m_mashup(GtkWidget *, ch *); // arrange images and text in custom layout void m_image_array(GtkWidget *, ch *); // combine images into a array layout void image_array_Lclick_func(int mx, int my); // array image click function // batch menu functions (f.batch.cc) void m_batch_convert(GtkWidget *, ch *); // rename/convert/rescale/export image files void m_batch_copy_move(GtkWidget *, ch *); // copy/move image files to new folder void m_batch_upright(GtkWidget *, ch *); // upright rotated image files void m_batch_deltrash(GtkWidget *, ch *); // delete or trash selected files void m_batch_overlay(GtkWidget *, ch *); // add overlay image to selected host images void m_export_files(GtkWidget *, ch *); // export image files to a folder // tools menu functions (f.tools.cc) void m_index(GtkWidget *, ch *); // rebuild image index and thumbnails void index_rebuild(int level, int keepopen); // index rebuild function void index_rebuild_old(); // index, no search for updates, no log void m_settings(GtkWidget *, ch *); // user preferences and settings void m_KB_shortcuts(GtkWidget *, ch *); // edit KB shortcuts, update file void KB_shortcuts_load(); // load KB shortcuts at startup time void m_RGB_hist(GtkWidget *, ch *); // show brightness histogram graph void brightness_scale(GtkWidget *drawarea, cairo_t *cr, int *); // draw black to white horizontal band void m_magnify(GtkWidget *, ch *); // magnify image within a radius of the mouse void m_measure_image(GtkWidget *, ch *); // measure distances within an image void m_show_RGB(GtkWidget *, ch *); // show RGB values at mouse click void m_grid_settings(GtkWidget *, ch *); // grid lines settings dialog void m_toggle_grid(GtkWidget *, ch *); // toggle grid lines on and off void m_line_color(GtkWidget *, ch *); // foreground line color (area/mouse/crop...) void m_darkbrite(GtkWidget *, ch *); // highlight the darkest and brightest pixels void darkbrite_paint(); // paint function called from Fpaint() void m_monitor_color(GtkWidget *, ch *); // check monitor brightness and color void m_duplicates(GtkWidget *, ch *); // find duplicate image files void m_find_bad_files(GtkWidget *, ch *); // find unreadable image files 26.8 void m_move_fotocx_home(GtkWidget *, ch *); // $HOME/.fotocx_home --> home folder 26.2 void m_resources(GtkWidget *, ch *); // report CPU and memory usage // developer functions (f.develop.cc) void m_zmalloc_report(GtkWidget *, ch *); // report memory allocation by tag name void m_zmalloc_growth(GtkWidget *, ch *); // report memory increases by tag name void m_mouse_events(GtkWidget *, ch *); // toggle: show mouse events void m_zappcrash_test(GtkWidget *, ch *); // test backtrace dumps void m_editfunc_template(GtkWidget *, ch *); // template to develop new edit function // translation functions (f.develop.cc) void m_capture_GUI(GtkWidget *, ch *); // generate gui_en from source files 26.5 void m_slice_GUI(GtkWidget *, ch *); // slice gui_en for AI translator 26.5 void m_transtab_GUI(GtkWidget *, ch *); // gui_en + gui_xx --> gui_en_xx 26.5 void m_audit_GUI(GtkWidget *, ch *); // audit gui_en_xx for en/xx formats 26.5 void m_slice_UG(GtkWidget *, ch *); // slice ug_en for AI translator 26.5 void m_sync_UG(GtkWidget *, ch *); // sync ug_xx with gui_xx translations 26.5 void m_audit_UG(GtkWidget *, ch *); // check ug_xx, all topic refs. present 26.5 fotocx/f.widgets.cc0000664000175000017500000031342115247006660013235 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx window and menu build functions build_widgets build widgets and menus for F/G/M view modes m_viewmode set current F/G/M view mode popup_menufunc image/thumb right-click menu func image_Rclick_popup popup menu for image right-click gallery_Lclick_func thumbnail left-click function gallery_Rclick_popup popup menu for thumbnail right-click m_custom_menu build custom user menu m_edit_script edit a script file calling multiple edit functions m_edit_script_addfunc edit_done() hook to insert dialog settings into script m_run_script run script like edit function for current image file m_batch_script run script for batch of selected image files m_plugins plugins menu function m_edit_plugins add/revise/delete plugin menu functions m_run_plugin run a plugin menu command and update image ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" // (variables in fotocx.h are defined) using namespace zfuncs; /**************************************************************************************/ GtkWidget *mFile, *mGallery, *mMaps, *mAlbums, *mMeta, *mSelect; // top menus GtkWidget *mEdit, *mRepair, *mRefine, *mEffects, *mWarp, *mComb; GtkWidget *mBatch, *mTools, *mHelp, *mDevelop; GtkWidget *popmenu_image, *popmenu_raw, *popmenu_mpo, *popmenu_video; // popup menus GtkWidget *popmenu_thumb, *popmenu_album; // initialize widgets and menus for F/G/M view modes // called from main() before gtk_main() loop is entered void build_widgets() { Mwin = gtk_window_new(GTK_WINDOW_TOPLEVEL); // create main window gtk_window_set_title(MWIN,Frelease); MWhbox = gtk_box_new(HORIZONTAL,0); // main window top container gtk_container_add(GTK_CONTAINER(Mwin),MWhbox); MWmenu = gtk_box_new(VERTICAL,0); // container for main window menus gtk_box_pack_start(GTK_BOX(MWhbox),MWmenu,0,1,0); MWvbox = gtk_box_new(VERTICAL,0); // container for F/G/M views gtk_box_pack_start(GTK_BOX(MWhbox),MWvbox,1,1,0); G_SIGNAL(Mwin,"delete-event",delete_event,0); // connect signals to main window G_SIGNAL(Mwin,"destroy",destroy_event,0); G_SIGNAL(Mwin,"window-state-event",state_event,0); G_SIGNAL(Mwin,"key-press-event",KBpress,0); // connect KB events to main window G_SIGNAL(Mwin,"key-release-event",KBrelease,0); // F view widgets - image file Fhbox = gtk_box_new(HORIZONTAL,0); // top container gtk_box_pack_start(GTK_BOX(MWvbox),Fhbox,1,1,0); Fvbox = gtk_box_new(VERTICAL,0); // vbox for image gtk_box_pack_start(GTK_BOX(Fhbox),Fvbox,1,1,5); // margin = 5 25.1 Fpanel = gtk_box_new(HORIZONTAL,0); // panel over image gtk_box_pack_start(GTK_BOX(Fvbox),Fpanel,0,0,0); gtk_widget_set_size_request(Fpanel,0,20); Fpanlab = gtk_label_new("panel"); gtk_box_pack_start(GTK_BOX(Fpanel),Fpanlab,0,0,0); Fpanelshow = 1; // panel normally shows Fdrawin = gtk_drawing_area_new(); // image drawing area gtk_box_pack_start(GTK_BOX(Fvbox),Fdrawin,1,1,0); gtk_widget_hide(Fhbox); gtk_widget_add_events(Fdrawin,GDK_BUTTON_PRESS_MASK); // connect mouse events to image window gtk_widget_add_events(Fdrawin,GDK_BUTTON_RELEASE_MASK); gtk_widget_add_events(Fdrawin,GDK_BUTTON_MOTION_MASK); gtk_widget_add_events(Fdrawin,GDK_POINTER_MOTION_MASK); gtk_widget_add_events(Fdrawin,GDK_SCROLL_MASK); G_SIGNAL(Fdrawin,"button-press-event",mouse_event,0); // connect signals G_SIGNAL(Fdrawin,"button-release-event",mouse_event,0); G_SIGNAL(Fdrawin,"motion-notify-event",mouse_event,0); G_SIGNAL(Fdrawin,"scroll-event",mouse_event,0); G_SIGNAL(Fdrawin,"draw",Fpaint,0); drag_drop_dest(Fdrawin,drop_event); // accept drag-drop file // G view widgets - thumbnail gallery Ghbox = gtk_box_new(HORIZONTAL,0); // top container gtk_box_pack_start(GTK_BOX(MWvbox),Ghbox,1,1,0); Gvbox = gtk_box_new(VERTICAL,0); // vbox for gallery gtk_box_pack_start(GTK_BOX(Ghbox),Gvbox,1,1,5); // margin = 5 26.0 Gpanel = gtk_box_new(HORIZONTAL,0); // top panel for [TOP] and navi buttons gtk_box_pack_start(GTK_BOX(Gvbox),Gpanel,0,0,2); Gtop = gtk_button_new_with_label("TOP"); // [TOP] button in panel gtk_box_pack_start(GTK_BOX(Gpanel),Gtop,0,0,3); Gsep = gtk_label_new(0); gtk_label_set_markup(GTK_LABEL(Gsep),"@"); gtk_box_pack_start(GTK_BOX(Gpanel),Gsep,0,0,10); Gsep = gtk_separator_new(HORIZONTAL); // separator line gtk_box_pack_start(GTK_BOX(Gvbox),Gsep,0,0,3); Gscroll = gtk_scrolled_window_new(0,0); // scrolled window for gallery gtk_scrolled_window_set_policy(SCROLLWIN(Gscroll),NEVER,ALWAYS); Gadjust = gtk_scrolled_window_get_vadjustment(SCROLLWIN(Gscroll)); gtk_box_pack_start(GTK_BOX(Gvbox),Gscroll,1,1,0); Gdrawin = gtk_drawing_area_new(); // gallery drawing area gtk_container_add(GTK_CONTAINER(Gscroll),Gdrawin); gtk_widget_hide(Ghbox); gtk_widget_add_events(Gdrawin,GDK_BUTTON_PRESS_MASK); // connect mouse events to gallery window gtk_widget_add_events(Gdrawin,GDK_BUTTON_RELEASE_MASK); gtk_widget_add_events(Gdrawin,GDK_POINTER_MOTION_MASK); G_SIGNAL(Gtop,"clicked",navi::newtop,0); G_SIGNAL(Gdrawin,"button-press-event",navi::mouse_event,0); G_SIGNAL(Gdrawin,"button-release-event",navi::mouse_event,0); G_SIGNAL(Gdrawin,"motion-notify-event",navi::mouse_event,0); G_SIGNAL(Gdrawin,"draw",navi::gallery_paint,null); drag_drop_source(Gdrawin,navi::gallery_dragfile); // start file drag-drop drag_drop_dest(Gdrawin,navi::gallery_dropfile); // accept drag-drop file // M view widgets - internet map container Mhbox = gtk_frame_new(null); // top container for internet map gtk_box_pack_start(GTK_BOX(MWvbox),Mhbox,1,1,0); // menu popup text (tool tips) ---------------------------------------- // main menu buttons ch * File_tip = TX("File: new session, open, rename, copy/move, delete, print"); ch * Gallery_tip = TX("Gallery: thumbnails, new/recent, sort, select, bookmarks"); ch * Maps_tip = TX("Maps: view images by map location"); ch * Albums_tip = TX("Albums: gallery of chosen images, arrange via drag & drop"); ch * custom_menu_tip = TX("Custom menu: favorite/frequent functions, scripts, plugins"); ch * zoom_menu_tip = TX("Left/right click: zoom image/thumbnail in/out (also +/- keys)"); ch * prev_next_tip = TX("Left/right click: previous/next image (also arrow keys)"); ch * save_tip = TX("Save modified image as new file or new file version"); ch * metadata_tip = TX("View/edit metadata, image report and search functions"); ch * select_tip = TX("Select image areas to edit separately, copy/paste selections"); ch * undo_redo_tip = TX("Left/right click: undo/redo one edit step \n" "Middle click: go back to selected edit step"); ch * edit_tip = TX("Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas"); ch * repair_tip = TX("Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color"); ch * refine_tip = TX("Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation"); ch * effects_tip = TX("Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution"); ch * warp_tip = TX("Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms"); ch * combine_tip = TX("Combine: HDR, HDF, stack, panorama, mashup, image array"); ch * batch_tip = TX("Batch: copy, move, convert, RAW convert, add/change metadata"); ch * tools_tip = TX("Tools: image index, settings, shortcuts, grid, find duplicates"); ch * help_tip = TX("Help: user guide, tutorial, change log, licenses, privacy, about"); // file menu ch * new_session_tip = TX("Open a parallel Fotocx session"); ch * open_file_tip = TX("Select and view an image file"); ch * cycle2files_tip = TX("Cycle 2 Prior Files"); ch * cycle3files_tip = TX("Cycle 3 Prior Files"); ch * view360_tip = TX("View 360 degree panorama image"); ch * rename_tip = TX("Change file name"); ch * blank_image_tip = TX("Create a blank image"); ch * copy_move_tip = TX("Copy or Move image file to new location"); ch * copyto_desktop_tip = TX("Copy image file to the desktop"); ch * copyto_clipboard_tip = TX("Copy image file to the clipboard"); ch * deltrash_tip = TX("Delete or trash an image file"); ch * set_wallpaper_tip = TX("Set image file as desktop wallpaper"); ch * print_image_tip = TX("Print the current image file"); ch * print_calibrated_tip = TX("Print current image file with calibrated colors"); ch * calib_printer_tip = TX("Color calibration tool for printer and paper type"); ch * quit_tip = TX("Quit Fotocx"); // gallery menu ch * thumbview_tip = TX("Gallery view with thumbnails and file data"); ch * metaview_tip = TX("Gallery view with thumbnails and basic metadata"); ch * recentfiles_tip = TX("Gallery of recently viewed image files"); ch * newest_files_tip = TX("Gallery of newest image files"); ch * gallery_sort_tip = TX("Change gallery sort order"); ch * gallery_filter_tip = TX("Select versions, ratings, keywords, filename text"); ch * gallery_home_tip = TX("Jump to gallery beginning [home]"); ch * gallery_end_tip = TX("Jump to gallery end [end]"); ch * current_file_folder_tip = TX("Set gallery to folder of current file"); ch * recent_folders_tip = TX("Set gallery from recent folders list"); ch * search_results_tip = TX("Set gallery from latest search results"); ch * folder_tree_tip = TX("Show folder hierarchy, click folder for gallery view"); ch * select_files_tip = TX("Select input files for subsequent function"); ch * bookmarks_tip = TX("Set and view bookmarks, select for gallery view"); // maps menu ch * show_on_map_tip = TX("Show map position of the current image file"); // 26.7 // albums menu // 25.1 ch * create_album_tip = TX("Create a new album (ordered set of image files)"); ch * rename_album_tip = TX("Rename an existing album"); ch * delete_album_tip = TX("Delete an album"); ch * choose_album_tip = TX("Choose an album and show as gallery of images"); ch * current_album_tip = TX("Show the current (last used) album"); ch * gallery_to_album_tip = TX("Save current gallery as album"); ch * update_albums_tip = TX("Update albums for new file versions"); ch * album_mass_update_tip = TX("Mass update album files"); ch * slideshow_tip = TX("Start a slide show"); // metadata menu ch * meta_view_main_tip = TX("Show key metadata for current image or clicked thumbnail"); ch * meta_view_all_tip = TX("List all metadata for current image or clicked thumbnail"); ch * meta_edit_main_tip = TX("Edit key metadata: keywords/geotags/description/rating ..."); ch * meta_edit_any_tip = TX("Edit any metadata tag"); ch * meta_delete_tip = TX("Remove selected image metadata"); ch * meta_copy_tip = TX("Copy metadata from one image to another"); ch * meta_fix_tip = TX("Repair malformed metadata preventing metadata edits"); ch * meta_manage_keywords_tip = TX("Define keywords used for searching images"); ch * meta_choose_caps_tip = TX("Choose metadata shown on image captions"); ch * meta_toggle_caps_tip = TX("Toggle image metadata display ON/OFF"); ch * meta_places_dates_tip = TX("Find all images for a location [date range]"); ch * meta_timeline_tip = TX("Show image counts in year/month table, select, report"); ch * meta_tags_tip = TX("Find all images for a selected tag name and value"); ch * search_images_tip = TX("Find images meeting multiple search criteria"); // select area menu ch * select_area_tip = TX("Select image objects or areas for separate editing"); ch * select_find_gap_tip = TX("Find a gap in an area outline"); ch * select_blend_tip = TX("Blend area edits/edges using the mouse"); ch * select_show_tip = TX("Show (outline) selected areas"); ch * select_hide_tip = TX("Hide selected areas"); ch * select_enable_tip = TX("Enable areas for editing"); ch * select_disable_tip = TX("Disable areas for editing"); ch * select_invert_tip = TX("Invert selected areas (selected ↔ not selected)"); ch * select_clear_tip = TX("Erase existing areas"); ch * select_copy_tip = TX("Copy area for later pasting into image"); ch * select_paste_tip = TX("Paste previously copied area into image"); ch * select_load_tip = TX("Open a file and paste as selected area into an image"); ch * select_save_tip = TX("Save selected area to a file with transparency"); // edit menu ch * rotate_tip = TX("Rotate or level an image"); ch * upright_tip = TX("Upright or mirror-flip an image"); ch * crop_tip = TX("Crop (trim) image margins"); ch * retouch_tip = TX("Adjust brightness, contrast, color"); ch * rescale_tip = TX("Change image pixel dimensions"); ch * split_screen_tip = TX("View before/after images using split-screen"); ch * show_diffs_tip = TX("Show image differences on the image"); ch * margins_tip = TX("Add margins around an image"); ch * markup_tip = TX("Draw on image: text, line/arrow, box, circle, ellipse"); ch * color_mode_tip = TX("Set black-white/color, negative/positive, sepia"); ch * paint_edits_tip = TX("Paint current edit function gradually using the mouse"); ch * paint_image_tip = TX("Paint on image using the mouse"); ch * paint_transparency_tip = TX("Paint image transparency using the mouse"); ch * area_fill_tip = TX("Fill selected areas or transparent areas with a color"); ch * copy_in_image_tip = TX("Copy areas within an image using the mouse"); ch * copy_from_image_tip = TX("Copy areas from another image using the mouse"); ch * copy_prior_edit_tip = TX("Copy areas from prior edits using the mouse"); // repair menu ch * sharpen_tip = TX("Sharpen the image (various methods)"); ch * blur_tip = TX("Blur the image (various methods)"); ch * denoise_tip = TX("Suppress noise from low-light photos"); ch * defog_tip = TX("Reduce fog/haze in an image or selected areas"); ch * redeyes_tip = TX("Fix red-eyes from flash photo"); ch * smart_erase_tip = TX("Remove unwanted objects in an image"); ch * remove_halo_tip = TX("Remove halos left by some edit functions"); ch * jpeg_artifacts_tip = TX("Suppress JPEG compression artifacts"); ch * anti_alias_tip = TX("Remove jaggies on hard image feature edges"); ch * adjust_RGB_tip = TX("Adjust color using RGB or CMY colors"); ch * adjust_HSL_tip = TX("Adjust color using HSL color model"); ch * remove_dust_tip = TX("Remove dust spots from old scanned photos"); ch * fringes_tip = TX("Fix color fringes (chromatic aberration)"); // refine menu ch * flat_hist_tip = TX("Flatten brightness histogram to enhance details"); ch * localcon_tip = TX("Rescale brightness levels to increase local contrast"); ch * amplifycon_tip = TX("Amplify area contrast to enhance visibility of details"); ch * retinex_tip = TX("Rescale RGB levels to reduce color caste and fog/haze"); ch * saturation_tip = TX("Adjust color saturation based on brightness"); ch * soft_focus_tip = TX("Apply a soft focus effect to an image"); ch * match_colors_tip = TX("Match image colors to colors of another image"); ch * brite_ramp_tip = TX("Add a brightness/color ramp across an image"); ch * vignette_tip = TX("Add/remove brightness/color radially from chosen center"); // effects menu ch * outlines_tip = TX("Convert image into a line drawing"); ch * sketch1_tip = TX("Convert image into a simulated sketch (1)"); ch * sketch2_tip = TX("Convert image into a simulated sketch (2)"); ch * cartoon_tip = TX("Convert image into a cartoon drawing"); ch * emboss_tip = TX("Create an embossed or 3D appearance"); ch * tiles1_tip = TX("Convert image into square tiles with 3D effect"); ch * tiles2_tip = TX("Convert image into tiles matching feature contours"); ch * painting_tip = TX("Convert image into a simulated painting"); ch * texture_tip = TX("Add texture to an image"); ch * fusion_tip = TX("Suppress fine details while retaining sharpness"); ch * pattern_tip = TX("Tile image with a repeating pattern"); ch * crosshatch_tip = TX("Convert image into a crosshatch sketch"); ch * dither_tip = TX("Convert image into dithered dots"); ch * engrave_tip = TX("Convert image into black/white lines"); ch * addglare_tip = TX("Add glare around bright objects"); ch * mosaic_tip = TX("Create a mosaic with tiles made from all images"); ch * add_noise_tip = TX("Add random noise to an image"); ch * set_colors_tip = TX("Set number of colors for each R/G/B or total"); ch * shift_colors_tip = TX("Shift/convert image colors into other colors"); ch * alien_colors_tip = TX("Change image colors using an algorithm"); ch * anykernel_tip = TX("Process an image using a custom convolution kernel"); // warp menu ch * unbend_tip = TX("Remove image curvature, especially in panoramas"); ch * perspective_tip = TX("Fix perspective for object photographed from an angle"); ch * warp_area_tip = TX("Distort image areas using the mouse"); ch * warp_linear1_tip = TX("Warp image (linear 1) using the mouse"); ch * warp_linear2_tip = TX("Warp image (linear 2) using the mouse"); ch * warp_curved_tip = TX("Warp image (curved) using the mouse"); ch * warp_affine_tip = TX("Warp image (affine) using the mouse"); ch * warp_radial_tip = TX("Add/remove barrel/pincushion distortion"); ch * unwarp_closeup_tip = TX("Rectify closeup face photo (balloon face)"); ch * makewaves_tip = TX("Warp an image with a wave pattern"); ch * twist_tip = TX("Twist image centered at mouse position"); ch * sphere_tip = TX("Make a spherical projection of an image"); ch * inside_out_tip = TX("Turn an image inside-out"); ch * tiny_planet_tip = TX("Convert an image into a Tiny Planet image"); ch * escher_spiral_tip = TX("Generate an inward spiraling repeating image"); ch * flatphoto_tip = TX("Flatten photo of a curved image (e.g. poster on round column"); // combine menu ch * HDR_tip = TX("High Dynamic Range - combine bright/dark images for better detail"); ch * HDF_tip = TX("High Depth of Field - combine near/far focus images for deeper focus"); ch * stack_paint_tip = TX("Combine multiple photos to erase passing people, etc."); ch * stack_noise_tip = TX("Combine multiple noisy photos into a low-noise image"); ch * stack_layers_tip = TX("Combine multiple images in layers, select and expose layers"); ch * panorama_tip = TX("Combine 2-6 images into a wide panorama image"); ch * show_cim_files_tip = TX("Show input files used in combine function"); ch * mashup_tip = TX("Arrange images and text in a layout (photo-montage)"); ch * image_array_tip = TX("Combine many images into an array of images"); // batch menu ch * batch_convert_tip = TX("Rename/convert/rescale/move selected image or RAW files"); ch * batch_copy_move_tip = TX("Copy/move selected image files to a new folder"); ch * batch_upright_tip = TX("Upright rotated image files, selected set or ALL"); ch * batch_deltrash_tip = TX("Delete or Trash selected image files"); ch * batch_overlay_tip = TX("Add overlay image (e.g. copyright) to selected images"); ch * batch_keywords_tip = TX("Add/remove keywords for selected image files"); ch * batch_rename_keywords_tip = TX("Rename or delete keywords for all image files"); ch * batch_purge_keywords_tip = TX("Purge unwanted keywords from all image files"); ch * batch_photo_DT_tip = TX("Set or shift photo date/time for selected image files"); ch * batch_change_meta_tip = TX("Add/change/delete metadata for selected image files"); ch * batch_report_meta_tip = TX("Report selected metadata for selected image files"); ch * batch_geotags_tip = TX("Add/revise location/geocoordinates for selected image files"); ch * export_files_tip = TX("Export selected image files to another folder"); // tools menu ch * index_tip = TX("Index new image files and make thumbnails"); ch * move_fotocx_home_tip = TX("Move Fotocx home folder to chosen folder"); // 26.2 ch * settings_tip = TX("User preferences and settings"); ch * KB_shortcuts_tip = TX("Show or make Keyboard Shortcuts"); ch * RGB_hist_tip = TX("RGB brightness histogram graph"); ch * magnify_tip = TX("Magnify image around the mouse position"); ch * measure_image_tip = TX("Measure pixel distances within an image"); ch * show_RGB_tip = TX("Show RGB levels at mouse position"); ch * grid_settings_tip = TX("Set horizontal/vertical grid line counts"); ch * toggle_grid_tip = TX("Toggle grid lines on and off"); ch * line_color_tip = TX("Set foreground line color (crop, grid, select, warp)"); ch * darkbrite_tip = TX("Highlight darkest and brightest pixels"); ch * monitor_color_tip = TX("Chart to adjust monitor color"); ch * duplicates_tip = TX("Search all image files and report duplicates"); ch * find_bad_files_tip = TX("find and report all unreadable image files"); ch * resources_tip = TX("Show memory and CPU resources used"); // help menu ch * user_guide_tip = TX("Read or search the user guide"); ch * video_tutorial_tip = TX("Fotocx video tutorial on YouTube"); ch * outboard_programs_tip = TX("List outboard programs and functions"); ch * show_logfile_tip = TX("Show the current log file"); // 26.0 ch * command_params_tip = TX("List Fotocx command line parameters"); ch * changelog_tip = TX("Show Fotocx updates for recent releases"); ch * copyright_tip = TX("Fotocx copyright notice"); ch * privacy_tip = TX("Fotocx privacy policy"); ch * about_tip = TX("Show Fotocx installed version and author contact"); ch * homepage_tip = TX("Fotocx web site (information and downloads)"); ch * uninstall_tip = TX("How to remove Fotocx application and user files"); // develop menu ch * zmalloc_report_tip = "report memory allocation by tag"; ch * zmalloc_growth_tip = "report memory increases by tag"; ch * mouse_events_tip = "toggle: show mouse events on screen"; ch * zappcrash_test_tip = "test zappcrash backtrace dump"; ch * edit_template_tip = "edit function development template"; ch * capture_gui_tip = "capture translatable text from source files > gui_en"; ch * slice_gui_tip = "slice gui_en into small pieces for AI translator"; ch * trans_table_tip = "merge gui_en + gui_xx > gui_xx translation table"; ch * audit_gui_tip = "check gui_xx for matching text pairs and format codes"; ch * slice_ug_tip = "slice ug_en into small pieces for AI translator"; ch * sync_ug_tip = "sync ug_xx translations with gui_xx translations"; ch * audit_ug_tip = "check ug_xx - all topic references are present"; // build menu table --------------------------------------------------------- #define MENU(_topmenu, _text, _icon, _tip, _func, _arg) \ me = Nmenus++; \ if (me >= maxmenus) zappcrash("maxmenus exceeded"); \ menutab[me].topmenu = _topmenu; \ menutab[me].menu = _text; \ menutab[me].icon = _icon; \ menutab[me].desc = _tip; \ menutab[me].func = _func; \ if (_arg) menutab[me].arg = _arg; \ else menutab[me].arg = _text; \ int me; Nmenus = 0; mFile = create_popmenu(); MENU(mFile, TX("New Session"), 0, new_session_tip, m_new_session, 0 ); MENU(mFile, TX("Open Image File"), 0, open_file_tip, m_open_file, 0 ); MENU(mFile, TX("Cycle 2 Files"), 0, cycle2files_tip, m_cycle2files, 0 ); MENU(mFile, TX("Cycle 3 Files"), 0, cycle3files_tip, m_cycle3files, 0 ); MENU(mFile, TX("View 360° Pano"), 0, view360_tip, m_view360, 0); MENU(mFile, TX("Rename"), 0, rename_tip, m_rename, 0 ); MENU(mFile, TX("Blank Image"), 0, blank_image_tip, m_blank_image, 0 ); MENU(mFile, TX("Copy/Move"), 0, copy_move_tip, m_copy_move, 0 ); MENU(mFile, TX("Copy to Desktop"), 0, copyto_desktop_tip, m_copyto_desktop, 0 ); MENU(mFile, TX("Copy to Clipboard"), 0, copyto_clipboard_tip, m_copyto_clip, 0 ); MENU(mFile, TX("Delete/Trash"), 0, deltrash_tip, m_delete_trash, 0 ); MENU(mFile, TX("Set Wallpaper"), 0, set_wallpaper_tip, m_wallpaper, 0 ); MENU(mFile, TX("Print Image"), 0, print_image_tip, m_print_image, 0 ); MENU(mFile, TX("Print Calibrated"), 0, print_calibrated_tip, m_print_calibrated, 0 ); MENU(mFile, TX("Calibrate Printer"), 0, calib_printer_tip, m_calibrate_printer, 0 ); MENU(mFile, TX("Quit"), 0, quit_tip, m_quit, 0 ); mGallery = create_popmenu(); MENU(mGallery, TX("Thumbnail View"), 0, thumbview_tip, m_thumbview, 0 ); MENU(mGallery, TX("Metadata View"), 0, metaview_tip, m_metaview, 0 ); MENU(mGallery, TX("Recent Files"), 0, recentfiles_tip, m_recentfiles, 0 ); MENU(mGallery, TX("Newest Files"), 0, newest_files_tip, m_newest_files, 0 ); MENU(mGallery, TX("Gallery Sort"), 0, gallery_sort_tip, m_gallery_sort, 0); MENU(mGallery, TX("Gallery Filter"), 0, gallery_filter_tip, m_gallery_filter, 0); MENU(mGallery, TX("Gallery Home"), 0, gallery_home_tip, navi::menufuncx, "Home"); MENU(mGallery, TX("Gallery End"), 0, gallery_end_tip, navi::menufuncx, "End"); MENU(mGallery, TX("Current File Folder"), 0, current_file_folder_tip, m_current_file_folder, 0 ); MENU(mGallery, TX("Recent Folders"), 0, recent_folders_tip, m_recent_folders, 0 ); MENU(mGallery, TX("Search Results"), 0, search_results_tip, m_search_results, 0 ); // 26.5 MENU(mGallery, TX("Folder Tree"), 0, folder_tree_tip, m_folder_tree, 0 ); MENU(mGallery, TX("Select Files"), 0, select_files_tip, m_select_files, 0 ); MENU(mGallery, TX("Bookmarks"), 0, bookmarks_tip, m_bookmarks, 0 ); mMaps = create_popmenu(); MENU(mMaps, TX("Show on Map"), 0, show_on_map_tip, m_show_on_map, 0 ); // 26.7 mAlbums = create_popmenu(); // 25.1 MENU(mAlbums, TX("Create Album"), 0, create_album_tip, m_album_create, 0 ); MENU(mAlbums, TX("Rename Album"), 0, rename_album_tip, m_album_rename, 0 ); MENU(mAlbums, TX("Delete Album"), 0, delete_album_tip, m_album_delete, 0 ); MENU(mAlbums, TX("Choose Album"), 0, choose_album_tip, m_album_choose, 0 ); MENU(mAlbums, TX("Current Album"), 0, current_album_tip, m_album_current, 0 ); MENU(mAlbums, TX("Gallery to Album"), 0, gallery_to_album_tip, m_gallery_to_album, 0 ); MENU(mAlbums, TX("Update Albums"), 0, update_albums_tip, m_update_albums, 0 ); MENU(mAlbums, TX("Album Mass Update"), 0, album_mass_update_tip, m_album_mass_update, 0 ); MENU(mAlbums, TX("Slide Show"), 0, slideshow_tip, m_slideshow, 0 ); mMeta = create_popmenu(); MENU(mMeta, TX("View Main Meta"), 0, meta_view_main_tip, m_meta_view_main, 0 ); MENU(mMeta, TX("View All Meta"), 0, meta_view_all_tip, m_meta_view_all, 0 ); MENU(mMeta, TX("Edit Main Meta"), 0, meta_edit_main_tip, m_meta_edit_main, 0 ); MENU(mMeta, TX("Edit Any Meta"), 0, meta_edit_any_tip, m_meta_edit_any, 0 ); MENU(mMeta, TX("Delete Meta"), 0, meta_delete_tip, m_meta_delete, 0 ); MENU(mMeta, TX("Copy Meta"), 0, meta_copy_tip, m_meta_copy, 0 ); MENU(mMeta, TX("Fix Meta"), 0, meta_fix_tip, m_meta_fix, 0 ); MENU(mMeta, TX("Manage Keywords"), 0, meta_manage_keywords_tip, m_meta_manage_keywords, 0 ); MENU(mMeta, TX("Choose Captions"), 0, meta_choose_caps_tip, m_meta_choose_caps, 0 ); MENU(mMeta, TX("Toggle Captions"), 0, meta_toggle_caps_tip, m_meta_toggle_caps, 0 ); MENU(mMeta, TX("Places/Dates"), 0, meta_places_dates_tip, m_meta_places_dates, 0 ); MENU(mMeta, TX("Timeline"), 0, meta_timeline_tip, m_meta_timeline, 0 ); MENU(mMeta, TX("Metadata Tags"), 0, meta_tags_tip, m_meta_tags, 0 ); MENU(mMeta, TX("Search"), 0, search_images_tip, m_search_images, 0 ); mSelect = create_popmenu(); MENU(mSelect, TX("Select Area"), 0, select_area_tip, m_select_area, 0 ); MENU(mSelect, TX("Find Gap"), 0, select_find_gap_tip, m_select_find_gap, 0 ); MENU(mSelect, TX("Area Blend"), 0, select_blend_tip, m_select_blend, 0 ); MENU(mSelect, TX("Show"), 0, select_show_tip, m_select_show, 0 ); MENU(mSelect, TX("Hide"), 0, select_hide_tip, m_select_hide, 0 ); MENU(mSelect, TX("Enable"), 0, select_enable_tip, m_select_enable, 0 ); MENU(mSelect, TX("Disable"), 0, select_disable_tip, m_select_disable, 0 ); MENU(mSelect, TX("Invert"), 0, select_invert_tip, m_select_invert, 0 ); MENU(mSelect, TX("Clear"), 0, select_clear_tip, m_select_clear, 0 ); MENU(mSelect, TX("Copy"), 0, select_copy_tip, m_select_copy, 0 ); MENU(mSelect, TX("Paste"), 0, select_paste_tip, m_select_paste, 0 ); MENU(mSelect, TX("Load"), 0, select_load_tip, m_select_load, 0 ); MENU(mSelect, TX("Save"), 0, select_save_tip, m_select_save, 0 ); mEdit = create_popmenu(); MENU(mEdit, TX("Rotate"), 0, rotate_tip, m_rotate, 0 ); MENU(mEdit, TX("Upright"), 0, upright_tip, m_upright, 0 ); MENU(mEdit, TX("Crop"), 0, crop_tip, m_crop, 0 ); MENU(mEdit, TX("Retouch"), 0, retouch_tip, m_retouch, 0 ); MENU(mEdit, TX("Rescale"), 0, rescale_tip, m_rescale, 0 ); MENU(mEdit, TX("Split-Screen"), 0, split_screen_tip, m_split_screen, 0 ); MENU(mEdit, TX("Show Diffs"), 0, show_diffs_tip, m_show_diffs, 0 ); MENU(mEdit, TX("Margins"), 0, margins_tip, m_margins, 0 ); MENU(mEdit, TX("Markup"), 0, markup_tip, m_markup, 0 ); MENU(mEdit, TX("Color Mode"), 0, color_mode_tip, m_color_mode, 0 ); MENU(mEdit, TX("Paint Edits"), 0, paint_edits_tip, m_paint_edits, 0 ); MENU(mEdit, TX("Paint Image"), 0, paint_image_tip, m_paint_image, 0 ); MENU(mEdit, TX("Paint transparency"), 0, paint_transparency_tip, m_paint_transparency, 0 ); MENU(mEdit, TX("Area Fill"), 0, area_fill_tip, m_area_fill, 0 ); MENU(mEdit, TX("Copy in Image"), 0, copy_in_image_tip, m_copy_in_image, 0 ); MENU(mEdit, TX("Copy From Image"), 0, copy_from_image_tip, m_copy_from_image, 0 ); MENU(mEdit, TX("Copy Prior Edit"), 0, copy_prior_edit_tip, m_copy_prior_edit, 0 ); mRepair = create_popmenu(); MENU(mRepair, TX("Sharpen"), 0, sharpen_tip, m_sharpen, 0 ); MENU(mRepair, TX("Blur"), 0, blur_tip, m_blur, 0 ); MENU(mRepair, TX("Denoise"), 0, denoise_tip, m_denoise, 0 ); MENU(mRepair, TX("Defog"), 0, defog_tip, m_defog, 0 ); MENU(mRepair, TX("Red Eyes"), 0, redeyes_tip, m_redeyes, 0 ); MENU(mRepair, TX("Smart Erase"), 0, smart_erase_tip, m_smart_erase, 0 ); MENU(mRepair, TX("Remove Halo"), 0, remove_halo_tip, m_remove_halo, 0 ); MENU(mRepair, TX("JPEG Artifacts"), 0, jpeg_artifacts_tip, m_jpeg_artifacts, 0 ); MENU(mRepair, TX("Anti-Alias"), 0, anti_alias_tip, m_anti_alias, 0 ); MENU(mRepair, TX("Adjust RGB"), 0, adjust_RGB_tip, m_adjust_RGB, 0 ); MENU(mRepair, TX("Adjust HSL"), 0, adjust_HSL_tip, m_adjust_HSL, 0 ); MENU(mRepair, TX("Remove Dust"), 0, remove_dust_tip, m_remove_dust, 0 ); MENU(mRepair, TX("Color Fringes"), 0, fringes_tip, m_fringes, 0 ); mRefine = create_popmenu(); MENU(mRefine, TX("Flatten Histogram"), 0, flat_hist_tip, m_flat_hist, 0 ); MENU(mRefine, TX("Local Contrast"), 0, localcon_tip, m_localcon, 0 ); MENU(mRefine, TX("Amplify Contrast"), 0, amplifycon_tip, m_amplifycon, 0 ); MENU(mRefine, TX("Global Retinex"), 0, retinex_tip, m_gretinex, 0 ); MENU(mRefine, TX("Local Retinex"), 0, retinex_tip, m_lretinex, 0 ); MENU(mRefine, TX("Saturation"), 0, saturation_tip, m_saturation, 0 ); MENU(mRefine, TX("Soft Focus"), 0, soft_focus_tip, m_soft_focus, 0 ); MENU(mRefine, TX("Match Colors"), 0, match_colors_tip, m_match_colors, 0 ); MENU(mRefine, TX("Brightness Ramp"), 0, brite_ramp_tip, m_brite_ramp, 0 ); MENU(mRefine, TX("Vignette"), 0, vignette_tip, m_vignette, 0 ); mEffects = create_popmenu(); MENU(mEffects, TX("Outlines"), 0, outlines_tip, m_outlines, 0 ); MENU(mEffects, TX("Sketch1"), 0, sketch1_tip, m_sketch1, 0 ); MENU(mEffects, TX("Sketch2"), 0, sketch2_tip, m_sketch2, 0 ); MENU(mEffects, TX("Cartoon"), 0, cartoon_tip, m_cartoon, 0 ); MENU(mEffects, TX("Emboss"), 0, emboss_tip, m_emboss, 0 ); MENU(mEffects, TX("Tiles1"), 0, tiles1_tip, m_tiles1, 0 ); MENU(mEffects, TX("Tiles2"), 0, tiles2_tip, m_tiles2, 0 ); MENU(mEffects, TX("Painting"), 0, painting_tip, m_painting, 0 ); MENU(mEffects, TX("Texture"), 0, texture_tip, m_texture, 0 ); MENU(mEffects, TX("Fusion"), 0, fusion_tip, m_fusion, 0 ); MENU(mEffects, TX("Pattern"), 0, pattern_tip, m_pattern, 0 ); MENU(mEffects, TX("Crosshatch"), 0, crosshatch_tip, m_crosshatch, 0 ); MENU(mEffects, TX("Dither"), 0, dither_tip, m_dither, 0 ); MENU(mEffects, TX("Engrave"), 0, engrave_tip, m_engrave, 0 ); MENU(mEffects, TX("Add Glare"), 0, addglare_tip, m_addglare, 0 ); MENU(mEffects, TX("Mosaic"), 0, mosaic_tip, m_mosaic, 0 ); MENU(mEffects, TX("Add Noise"), 0, add_noise_tip, m_add_noise, 0 ); MENU(mEffects, TX("Set Colors"), 0, set_colors_tip, m_set_colors, 0 ); MENU(mEffects, TX("Shift Colors"), 0, shift_colors_tip, m_shift_colors, 0 ); MENU(mEffects, TX("Alien Colors"), 0, alien_colors_tip, m_alien_colors, 0 ); MENU(mEffects, TX("Custom Kernel"), 0, anykernel_tip, m_anykernel, 0 ); mWarp = create_popmenu(); MENU(mWarp, TX("Unbend"), 0, unbend_tip, m_unbend, 0 ); MENU(mWarp, TX("Perspective"), 0, perspective_tip, m_perspective, 0 ); MENU(mWarp, TX("Warp Area"), 0, warp_area_tip, m_warp_area, 0 ); MENU(mWarp, TX("Warp Linear1"), 0, warp_linear1_tip, m_warp_linear1, 0 ); MENU(mWarp, TX("Warp Linear2"), 0, warp_linear2_tip, m_warp_linear2, 0 ); MENU(mWarp, TX("Warp Curved"), 0, warp_curved_tip, m_warp_curved, 0 ); MENU(mWarp, TX("Warp Affine"), 0, warp_affine_tip, m_warp_affine, 0 ); MENU(mWarp, TX("Warp Radial"), 0, warp_radial_tip, m_warp_radial, 0); MENU(mWarp, TX("Unwarp Closeup"), 0, unwarp_closeup_tip, m_unwarp_closeup, 0 ); MENU(mWarp, TX("Make Waves"), 0, makewaves_tip, m_makewaves, 0); MENU(mWarp, TX("Twist"), 0, twist_tip, m_twist, 0); MENU(mWarp, TX("Sphere"), 0, sphere_tip, m_sphere, 0); MENU(mWarp, TX("Inside-out"), 0, inside_out_tip, m_inside_out, 0); MENU(mWarp, TX("Tiny Planet"), 0, tiny_planet_tip, m_tiny_planet, 0); MENU(mWarp, TX("Escher Spiral"), 0, escher_spiral_tip, m_escher_spiral, 0); MENU(mWarp, TX("Flatten Photo"), 0, flatphoto_tip, m_flatphoto, 0 ); mComb = create_popmenu(); MENU(mComb, "HDR", 0, HDR_tip, m_HDR, 0 ); MENU(mComb, "HDF", 0, HDF_tip, m_HDF, 0 ); MENU(mComb, TX("Stack/Paint"), 0, stack_paint_tip, m_stack_paint, 0 ); MENU(mComb, TX("Stack/Noise"), 0, stack_noise_tip, m_stack_noise, 0 ); MENU(mComb, TX("Stack/Layers"), 0, stack_layers_tip, m_stack_layers, 0 ); MENU(mComb, TX("Panorama"), 0, panorama_tip, m_panorama, 0 ); MENU(mComb, TX("Show CIM Files"), 0, show_cim_files_tip, m_cim_show_files, 0 ); MENU(mComb, TX("Mashup"), 0, mashup_tip, m_mashup, 0 ); MENU(mComb, TX("Image Array"), 0, image_array_tip, m_image_array, 0 ); mBatch = create_popmenu(); MENU(mBatch, TX("Batch Convert"), 0, batch_convert_tip, m_batch_convert, 0 ); MENU(mBatch, TX("Batch Copy/Move"), 0, batch_copy_move_tip, m_batch_copy_move, 0 ); MENU(mBatch, TX("Batch Upright"), 0, batch_upright_tip, m_batch_upright, 0 ); MENU(mBatch, TX("Batch Delete/Trash"), 0, batch_deltrash_tip, m_batch_deltrash, 0 ); MENU(mBatch, TX("Batch Overlay"), 0, batch_overlay_tip, m_batch_overlay, 0 ); MENU(mBatch, TX("Batch Keywords"), 0, batch_keywords_tip, m_batch_keywords, 0 ); MENU(mBatch, TX("Batch Rename Keywords"), 0, batch_rename_keywords_tip, m_batch_rename_keywords, 0 ); MENU(mBatch, TX("Batch Purge Keywords"), 0, batch_purge_keywords_tip, m_batch_purge_keywords, 0 ); MENU(mBatch, TX("Batch Photo Date"), 0, batch_photo_DT_tip, m_batch_photo_date_time, 0 ); MENU(mBatch, TX("Batch Change Meta"), 0, batch_change_meta_tip, m_batch_change_meta, 0 ); MENU(mBatch, TX("Batch Report Meta"), 0, batch_report_meta_tip, m_batch_report_meta, 0 ); MENU(mBatch, TX("Batch Geotags"), 0, batch_geotags_tip, m_batch_geotags, 0 ); MENU(mBatch, TX("Export Files"), 0, export_files_tip, m_export_files, 0 ); mTools = create_popmenu(); MENU(mTools, TX("Index Files"), 0, index_tip, m_index, 0 ); MENU(mTools, TX("Settings"), 0, settings_tip, m_settings, 0 ); MENU(mTools, TX("Keyboard Shortcuts"), 0, KB_shortcuts_tip, m_KB_shortcuts, 0 ); MENU(mTools, TX("RGB Histogram"), 0, RGB_hist_tip, m_RGB_hist, 0 ); MENU(mTools, TX("Magnify Image"), 0, magnify_tip, m_magnify, 0 ); MENU(mTools, TX("Measure Image"), 0, measure_image_tip, m_measure_image, 0 ); MENU(mTools, TX("Show RGB"), 0, show_RGB_tip, m_show_RGB, 0 ); MENU(mTools, TX("Grid Settings"), 0, grid_settings_tip, m_grid_settings, 0 ); MENU(mTools, TX("Toggle Grid"), 0, toggle_grid_tip, m_toggle_grid, 0 ); MENU(mTools, TX("Line Color"), 0, line_color_tip, m_line_color, 0 ); MENU(mTools, TX("Dark/Bright Pixels"), 0, darkbrite_tip, m_darkbrite, 0 ); MENU(mTools, TX("Monitor Color"), 0, monitor_color_tip, m_monitor_color, 0 ); MENU(mTools, TX("Find Duplicates"), 0, duplicates_tip, m_duplicates, 0 ); MENU(mTools, TX("Find Bad Files"), 0, find_bad_files_tip, m_find_bad_files, 0 ); // 26.8 MENU(mTools, TX("Move Fotocx Home"), 0, move_fotocx_home_tip, m_move_fotocx_home, 0); // 26.2 MENU(mTools, TX("Show Resources"), 0, resources_tip, m_resources, 0 ); mHelp = create_popmenu(); MENU(mHelp, TX("User Guide"), 0, user_guide_tip, m_help, 0 ); MENU(mHelp, TX("Video Tutorial"), 0, video_tutorial_tip, m_help, 0 ); MENU(mHelp, TX("Outboard Programs"), 0, outboard_programs_tip, m_help, 0 ); MENU(mHelp, TX("Show Log File"), 0, show_logfile_tip, m_help, 0 ); // 26.0 MENU(mHelp, TX("Command Params"), 0, command_params_tip, m_help, 0 ); MENU(mHelp, TX("Change Log"), 0, changelog_tip, m_help, 0 ); MENU(mHelp, TX("Copyright"), 0, copyright_tip, m_help, 0 ); MENU(mHelp, TX("Privacy"), 0, privacy_tip, m_help, 0 ); MENU(mHelp, TX("About"), 0, about_tip, m_help, 0 ); MENU(mHelp, TX("Home Page"), 0, homepage_tip, m_help, 0 ); MENU(mHelp, TX("Uninstall"), 0, uninstall_tip, m_help, 0 ); // main menu buttons - must be last MENU(0, TX("File"), "file.png", File_tip, (cbFunc *) popup_menu, (ch *) mFile); MENU(0, TX("Gallery"), "gallery.png", Gallery_tip, (cbFunc *) popup_menu, (ch *) mGallery); MENU(0, TX("Maps"), "maps.png", Maps_tip, (cbFunc *) popup_menu, (ch *) mMaps); MENU(0, TX("Albums"), "albums.png", Albums_tip, (cbFunc *) popup_menu, (ch *) mAlbums); MENU(0, TX("Custom"), "custom.png", custom_menu_tip, m_custom_menu, 0 ); MENU(0, TX("Zoom"), "zoom.png", zoom_menu_tip, m_zoom_menu, 0 ); MENU(0, TX("Prev/Next"), "prev-next.png", prev_next_tip, m_prev_next, 0 ); MENU(0, TX("Save"), "save.png", save_tip, m_file_save, 0 ); MENU(0, TX("Metadata"), "metadata.png", metadata_tip, (cbFunc *) popup_menu, (ch *) mMeta); MENU(0, TX("Select"), "select.png", select_tip, (cbFunc *) popup_menu, (ch *) mSelect); MENU(0, TX("Undo/Redo"), "undo-redo.png", undo_redo_tip, m_undo_redo, 0 ); MENU(0, TX("Edit"), "edit.png", edit_tip, (cbFunc *) popup_menu, (ch *) mEdit); MENU(0, TX("Repair"), "repair.png", repair_tip, (cbFunc *) popup_menu, (ch *) mRepair); MENU(0, TX("Refine"), "refine.png", refine_tip, (cbFunc *) popup_menu, (ch *) mRefine); MENU(0, TX("Effects"), "effects.png", effects_tip, (cbFunc *) popup_menu, (ch *) mEffects); MENU(0, TX("Warp"), "warp.png", warp_tip, (cbFunc *) popup_menu, (ch *) mWarp); MENU(0, TX("Combine"), "combine.png", combine_tip, (cbFunc *) popup_menu, (ch *) mComb); MENU(0, TX("Batch"), "batch.png", batch_tip, (cbFunc *) popup_menu, (ch *) mBatch); MENU(0, TX("Tools"), "tools.png", tools_tip, (cbFunc *) popup_menu, (ch *) mTools); MENU(0, TX("Help"), "help.png", help_tip, (cbFunc *) popup_menu, (ch *) mHelp); // show developer tools menu if required if (Fdevelop) { mDevelop = create_popmenu(); MENU(0, "Develop", "develop.png", "Developer tools", (cbFunc *) popup_menu, (ch *) mDevelop); MENU(mDevelop, "zmalloc report", 0, zmalloc_report_tip, m_zmalloc_report, 0); MENU(mDevelop, "zmalloc growth", 0, zmalloc_growth_tip, m_zmalloc_growth, 0); MENU(mDevelop, "mouse events", 0, mouse_events_tip, m_mouse_events, 0); MENU(mDevelop, "zappcrash test", 0, zappcrash_test_tip, m_zappcrash_test, 0); MENU(mDevelop, "EditFunc Template", 0, edit_template_tip, m_editfunc_template, 0); MENU(mDevelop, "Capture GUI", 0, capture_gui_tip, m_capture_GUI, 0); // 26.5 MENU(mDevelop, "Slice GUI", 0, slice_gui_tip, m_slice_GUI, 0); // 26.5 MENU(mDevelop, "Transtab GUI", 0, trans_table_tip, m_transtab_GUI, 0); // 26.5 MENU(mDevelop, "Audit GUI", 0, audit_gui_tip, m_audit_GUI, 0); // 26.5 MENU(mDevelop, "Slice UG", 0, slice_ug_tip, m_slice_UG, 0); // 26.5 MENU(mDevelop, "Sync UG", 0, sync_ug_tip, m_sync_UG, 0); // 26.5 MENU(mDevelop, "Audit UG", 0, audit_ug_tip, m_audit_UG, 0); // 26.5 } int Vmenus = Nmenus; // visible menus stop here // internal functions not shown in menus - visible for scripting MENU(mDevelop, "Copy From Image Slave", 0, 0, m_copy_from_image_slave, 0 ); MENU(mDevelop, "Autosearch", 0, 0, m_autosearch, 0); MENU(mRepair, "Blur Normal", 0, 0, m_blur_normal, 0 ); MENU(mRepair, "Blur Graduated", 0, 0, m_blur_graduated, 0 ); MENU(mEffects, "dither0", 0, 0, m_dither0, 0 ); MENU(mEffects, "dither1", 0, 0, m_dither1, 0 ); MENU(mEffects, "dither2", 0, 0, m_dither2, 0 ); MENU(mEffects, "dither3", 0, 0, m_dither3, 0 ); MENU(mEdit, "Plugins", 0, 0, m_plugins, 0); MENU(mBatch, "Edit Script", 0, 0, m_edit_script, 0 ); MENU(mBatch, "Run Script", 0, 0, m_run_script, 0); MENU(mBatch, "Batch Script", 0, 0, m_batch_script, 0); // build the menu buttons for the main menu --------------------------- float frgb[3], brgb[3]; frgb[0] = MFrgb[0] / 256.0; // menu font color frgb[1] = MFrgb[1] / 256.0; // convert range to 0-1 frgb[2] = MFrgb[2] / 256.0; brgb[0] = MBrgb[0] / 256.0; // menu background color brgb[1] = MBrgb[1] / 256.0; // convert range to 0-1 brgb[2] = MBrgb[2] / 256.0; Vmenu *Xvm = Vmenu_new(MWmenu,frgb,brgb); // create main menu int siz = iconsize; // user settings parameter for (me = 0; me < Vmenus; me++) { if (menutab[me].topmenu) // submenu within top menu add_popmenu(menutab[me].topmenu, menutab[me].menu, menutab[me].func, menutab[me].arg, menutab[me].desc); else // top menu (button) { if (strmatch(menu_style,"icons")) { // icons only if (menutab[me].icon) Vmenu_add(Xvm, 0, menutab[me].icon,siz,siz,menutab[me].desc, menutab[me].func, menutab[me].arg); else // no icon, use menu text Vmenu_add(Xvm, menutab[me].menu, 0, 0, 0, menutab[me].desc, menutab[me].func, menutab[me].arg); } else if (strmatch(menu_style,"text")) { // text only Vmenu_add(Xvm, menutab[me].menu, 0, 0, 0, menutab[me].desc, menutab[me].func, menutab[me].arg); } else // icons + menu text Vmenu_add(Xvm, menutab[me].menu, menutab[me].icon, siz, siz, menutab[me].desc, menutab[me].func, menutab[me].arg); } } Vmenu_add_setup(Xvm, 0, m_viewmode, "F"); // add setup functions Vmenu_add_setup(Xvm, 1, m_viewmode, "G"); // for top 3 menu buttons Vmenu_add_setup(Xvm, 2, m_viewmode, "M"); // to set corresp. view mode Vmenu_add_RMfunc(Xvm, 0, m_viewmode, "F"); // add right-mouse function Vmenu_add_RMfunc(Xvm, 1, m_viewmode, "G"); // for top 3 menu buttons Vmenu_add_RMfunc(Xvm, 2, m_viewmode, "M"); // build table of eligible menus for KB shortcut assignment ----------------- #define KBshort(_menu, _func, _arg) \ me = Nkbsf++; \ if (me >= maxkbsf) zappcrash("maxkbs exceeded"); \ KBsftab[me].menu = _menu; \ KBsftab[me].func = _func; \ KBsftab[me].arg = _arg; Nkbsf = 0; // menu called function arg KBshort(TX("Adjust HSL"), m_adjust_HSL, 0 ); KBshort(TX("Adjust RGB"), m_adjust_RGB, 0 ); KBshort(TX("Amplify Contrast"), m_amplifycon, 0 ); KBshort(TX("Blur Normal"), m_blur_normal, 0 ); KBshort(TX("Bookmarks"), m_bookmarks, 0 ); KBshort(TX("Choose Captions"), m_meta_choose_caps, 0 ); KBshort(TX("Color Mode"), m_color_mode, 0 ); KBshort(TX("Copy/Move"), m_copy_move, 0 ); KBshort(TX("Copy to Clipboard"), m_copyto_clip, 0 ); KBshort(TX("Copy to Desktop"), m_copyto_desktop, 0 ); KBshort(TX("Crop"), m_crop, 0 ); KBshort(TX("Current Album"), m_album_current, 0 ); KBshort(TX("Current File Folder"), m_current_file_folder, 0 ); KBshort(TX("Cycle 2 Files"), m_cycle2files, 0 ); KBshort(TX("Cycle 3 Files"), m_cycle3files, 0 ); KBshort(TX("Delete Meta"), m_meta_delete, 0 ); KBshort(TX("Delete/Trash"), m_delete_trash, 0 ); KBshort(TX("Denoise"), m_denoise, 0 ); KBshort(TX("Dither"), m_dither, 0 ); KBshort(TX("Edit Any Meta"), m_meta_edit_any, 0 ); KBshort(TX("Edit Main Meta"), m_meta_edit_main, 0 ); KBshort(TX("File View"), m_viewmode, "F" ); KBshort(TX("Flatten Histogram"), m_flat_hist, 0 ); KBshort(TX("Folder Tree"), m_folder_tree, 0 ); KBshort(TX("Gallery View"), m_viewmode, "G" ); KBshort(TX("Global Retinex"), m_gretinex, 0 ); KBshort(TX("Grid Settings"), m_grid_settings, 0 ); KBshort(TX("Keyboard Shortcuts"), m_KB_shortcuts, 0 ); KBshort(TX("Line Color"), m_line_color, 0 ); KBshort(TX("Local Retinex"), m_lretinex, 0 ); KBshort(TX("Magnify Image"), m_magnify, 0 ); KBshort(TX("Map View"), m_viewmode, "M" ); KBshort(TX("Markup"), m_markup, 0 ); KBshort(TX("Metadata View"), m_metaview, 0 ); KBshort(TX("Newest"), m_newest_files, 0 ); KBshort(TX("New Session"), m_new_session, 0 ); KBshort(TX("New Version"), m_file_save_version, 0 ); KBshort(TX("Open Image File"), m_open_file, 0 ); KBshort(TX("Paint Edits"), m_paint_edits, 0 ); KBshort(TX("Perspective"), m_perspective, 0 ); KBshort(TX("Places/Dates"), m_meta_places_dates, 0 ); KBshort(TX("Print Calibrated"), m_print_calibrated, 0 ); KBshort(TX("Print Image"), m_print_image, 0 ); KBshort(TX("Quit"), m_quit, 0 ); KBshort(TX("Recent Files"), m_recentfiles, 0 ); KBshort(TX("Recent Folders"), m_recent_folders, 0 ); KBshort(TX("Red Eyes"), m_redeyes , 0 ); KBshort(TX("Redo"), m_redo, 0 ); KBshort(TX("Rename"), m_rename, 0 ); KBshort(TX("Replace"), m_file_save_replace, 0 ); KBshort(TX("Rescale"), m_rescale, 0 ); KBshort(TX("Retouch"), m_retouch, 0 ); KBshort(TX("RGB Histogram"), m_RGB_hist, 0 ); KBshort(TX("Rotate"), m_rotate, 0 ); KBshort(TX("Save"), m_file_save, 0 ); KBshort(TX("Search"), m_search_images, 0 ); KBshort(TX("Search Results"), m_search_results, 0 ); KBshort(TX("Select Area"), m_select_area, 0 ); KBshort(TX("Select Files"), m_select_files, 0 ); KBshort(TX("Set Colors"), m_set_colors, 0 ); KBshort(TX("Settings"), m_settings, 0 ); KBshort(TX("Sharpen"), m_sharpen, 0 ); KBshort(TX("Show on Map"), m_show_on_map, 0 ); KBshort(TX("Show Resources"), m_resources, 0 ); KBshort(TX("Metadata Tags"), m_meta_tags, 0 ); KBshort(TX("Timeline"), m_meta_timeline, 0 ); KBshort(TX("Toggle Captions"), m_meta_toggle_caps, 0 ); KBshort(TX("Toggle Grid"), m_toggle_grid, 0 ); KBshort(TX("Undo"), m_undo, 0 ); KBshort(TX("Upright"), m_upright, 0 ); KBshort(TX("View 360° Pano"), m_view360, 0 ); KBshort(TX("View Main Meta"), m_meta_view_main, 0 ); KBshort(TX("Split-Screen"), m_split_screen, 0 ); KBshort("zmalloc by tag", m_zmalloc_report, 0 ); KBshort("zmalloc growth", m_zmalloc_growth, 0 ); KBshort(TX("Zoom-in"), m_zoom, "in" ); KBshort(TX("Zoom-out"), m_zoom, "out" ); // zdialog completion buttons that can have KB shortcuts assigned KBshort(TX("Apply"), 0, 0 ); KBshort("X", 0, 0 ); KBshort("OK", 0, 0 ); KBshort(TX("Reset"), 0, 0 ); // build right-click popup menus -------------------------------------------- ch *menumeta1 = TX("View Main Meta"); ch *menumeta1A = TX("View All Meta"); ch *menumeta2 = TX("Edit Main Meta"); ch *menurename = TX("Rename"); ch *menudeltrash = TX("Delete/Trash"); ch *menucopymove = TX("Copy/Move"); ch *menucopytodesktop = TX("Copy to Desktop"); ch *menucopytoclip = TX("Copy to Clipboard"); ch *menurotateimage = TX("Rotate"); ch *menucropimage = TX("Crop"); ch *menuretouch = TX("Retouch"); ch *menurescale = TX("Rescale"); ch *menusharpen = TX("Sharpen"); ch *menublur = TX("Blur"); ch *menudenoise = TX("Denoise"); ch *menuflattenhist = TX("Flatten Histogram"); ch *menulocalcon = TX("Local Contrast"); ch *menuamplifycon = TX("Amplify Contrast"); ch *menusaturation = TX("Saturation"); ch *menushowonmap = TX("Show on Map"); ch *menuaddtoselection = TX("Add to Selection"); ch *menupopimage = TX("Popup Image"); ch *menualbumaddselfiles = TX("Add Selected Files Here"); ch *menualbumaddcurrfile = TX("Add Current File Here"); ch *menuremovefromalbum = TX("Remove from Album"); popmenu_image = create_popmenu(); // popup menu for image files add_popmenu(popmenu_image,menumeta1,popup_menufunc,"view main meta",0); add_popmenu(popmenu_image,menumeta1A,popup_menufunc,"view all meta",0); add_popmenu(popmenu_image,menumeta2,popup_menufunc,"edit main meta",0); add_popmenu(popmenu_image,menurename,popup_menufunc,"rename",0); add_popmenu(popmenu_image,menudeltrash,popup_menufunc,"delete/trash",0); add_popmenu(popmenu_image,menucopymove,popup_menufunc,"copymove",0); add_popmenu(popmenu_image,menucopytodesktop,popup_menufunc,"copytodesktop",0); add_popmenu(popmenu_image,menucopytoclip,popup_menufunc,"copytoclip",0); add_popmenu(popmenu_image,menurotateimage,popup_menufunc,"rotate",0); add_popmenu(popmenu_image,menucropimage,popup_menufunc,"crop",0); add_popmenu(popmenu_image,menuretouch,popup_menufunc,"retouch",0); add_popmenu(popmenu_image,menurescale,popup_menufunc,"rescale",0); add_popmenu(popmenu_image,menusharpen,popup_menufunc,"sharpen",0); add_popmenu(popmenu_image,menublur,popup_menufunc,"blur",0); add_popmenu(popmenu_image,menudenoise,popup_menufunc,"denoise",0); add_popmenu(popmenu_image,menuflattenhist,popup_menufunc,"flatten hist",0); add_popmenu(popmenu_image,menulocalcon,popup_menufunc,"local contrast",0); add_popmenu(popmenu_image,menuamplifycon,popup_menufunc,"amplify contrast",0); add_popmenu(popmenu_image,menusaturation,popup_menufunc,"saturation",0); add_popmenu(popmenu_image,menushowonmap,popup_menufunc,"show on map",0); add_popmenu(popmenu_image,menuaddtoselection,popup_menufunc,"add to selection",0); popmenu_raw = create_popmenu(); // popup menu for RAW files add_popmenu(popmenu_raw,menumeta1,popup_menufunc,"view main meta",0); add_popmenu(popmenu_raw,menumeta1A,popup_menufunc,"view all meta",0); add_popmenu(popmenu_raw,menumeta2,popup_menufunc,"edit main meta",0); add_popmenu(popmenu_raw,menurename,popup_menufunc,"rename",0); add_popmenu(popmenu_raw,menudeltrash,popup_menufunc,"delete/trash",0); add_popmenu(popmenu_raw,menucopymove,popup_menufunc,"copymove",0); popmenu_video = create_popmenu(); // popup menu for VIDEO files add_popmenu(popmenu_video,menumeta1,popup_menufunc,"view main meta",0); add_popmenu(popmenu_video,menumeta1A,popup_menufunc,"view all meta",0); add_popmenu(popmenu_video,menumeta2,popup_menufunc,"edit main meta",0); add_popmenu(popmenu_video,menurename,popup_menufunc,"rename",0); add_popmenu(popmenu_video,menudeltrash,popup_menufunc,"delete/trash",0); add_popmenu(popmenu_video,menucopymove,popup_menufunc,"copymove",0); add_popmenu(popmenu_video,menucopytodesktop,popup_menufunc,"copytodesktop",0); popmenu_thumb = create_popmenu(); // gallery thumbnail popup menu add_popmenu(popmenu_thumb,menupopimage,popup_menufunc,"popimage",0); add_popmenu(popmenu_thumb,menumeta1,popup_menufunc,"view main meta",0); add_popmenu(popmenu_thumb,menumeta1A,popup_menufunc,"view all meta",0); add_popmenu(popmenu_thumb,menumeta2,popup_menufunc,"edit main meta",0); add_popmenu(popmenu_thumb,menurename,popup_menufunc,"rename",0); add_popmenu(popmenu_thumb,menudeltrash,popup_menufunc,"delete/trash",0); add_popmenu(popmenu_thumb,menucopymove,popup_menufunc,"copymove",0); add_popmenu(popmenu_thumb,menucopytodesktop,popup_menufunc,"copytodesktop",0); add_popmenu(popmenu_thumb,menucopytoclip,popup_menufunc,"copytoclip",0); add_popmenu(popmenu_thumb,menushowonmap,popup_menufunc,"show on map",0); popmenu_album = create_popmenu(); // album thumbnail popup menu add_popmenu(popmenu_album,menupopimage,popup_menufunc,"popimage",0); add_popmenu(popmenu_album,menumeta1,popup_menufunc,"view main meta",0); add_popmenu(popmenu_album,menumeta1A,popup_menufunc,"view all meta",0); add_popmenu(popmenu_album,menumeta2,popup_menufunc,"edit main meta",0); add_popmenu(popmenu_album,menucopytodesktop,popup_menufunc,"copytodesktop",0); add_popmenu(popmenu_album,menucopytoclip,popup_menufunc,"copytoclip",0); add_popmenu(popmenu_album,menushowonmap,popup_menufunc,"show on map",0); add_popmenu(popmenu_album,menualbumaddselfiles,popup_menufunc,"albumaddselfiles",0); add_popmenu(popmenu_album,menualbumaddcurrfile,popup_menufunc,"albumaddcurrfile",0); add_popmenu(popmenu_album,menuremovefromalbum,popup_menufunc,"removefromalbum",0); return; } // right-click popup menu response function void popup_menufunc(GtkWidget *, ch *menu) { if (strmatch(menu,"view main meta")) meta_view(1); if (strmatch(menu,"view all meta")) meta_view(2); if (strmatch(menu,"edit main meta")) m_meta_edit_main(0,0); if (strmatch(menu,"rename")) m_rename(0,0); if (strmatch(menu,"delete/trash")) m_delete_trash(0,0); if (strmatch(menu,"copymove")) m_copy_move(0,0); if (strmatch(menu,"copytodesktop")) m_copyto_desktop(0,0); if (strmatch(menu,"copytoclip")) m_copyto_clip(0,0); if (strmatch(menu,"rotate")) m_rotate(0,0); if (strmatch(menu,"crop")) m_crop(0,0); if (strmatch(menu,"retouch")) m_retouch(0,0); if (strmatch(menu,"rescale")) m_rescale(0,0); if (strmatch(menu,"sharpen")) m_sharpen(0,0); if (strmatch(menu,"blur")) m_blur(0,0); if (strmatch(menu,"denoise")) m_denoise(0,0); if (strmatch(menu,"flatten hist")) m_flat_hist(0,0); if (strmatch(menu,"local contrast")) m_localcon(0,0); if (strmatch(menu,"amplify contrast")) m_amplifycon(0,0); if (strmatch(menu,"saturation")) m_saturation(0,0); if (strmatch(menu,"show on map")) m_show_on_map(0,0); if (strmatch(menu,"add to selection")) add_file_to_selection(curr_file); if (strmatch(menu,"popimage")) gallery_popimage(); if (strmatch(menu,"albumaddselfiles")) album_add_selfiles(2); if (strmatch(menu,"albumaddcurrfile")) album_add_currfile(2); if (strmatch(menu,"removefromalbum")) album_remove_file(clicked_posn); return; } // main window mouse right-click popup menu void image_Rclick_popup() { int ftype; if (! curr_file) return; ftype = image_file_type(curr_file); if (ftype == IMAGE) popup_menu(Mwin,popmenu_image); if (ftype == RAW) popup_menu(Mwin,popmenu_raw); if (ftype == VIDEO) popup_menu(Mwin,popmenu_video); return; } // gallery thumbnail mouse left-click function // open the clicked file in view mode F void gallery_Lclick_func(int Nth) { ch *file; int err = 0; if (clicked_file) { // free memory of clicked thumbnail zfree(clicked_file); clicked_file = 0; } file = gallery(0,"get",Nth); if (! file) return; err = f_open(file,Nth,0,1); // clicked file >> current file if (! err) viewmode('F'); zfree(file); return; } // gallery thumbnail mouse right-click popup menu void gallery_Rclick_popup(int Nth) { FTYPE ftype; clicked_posn = Nth; // clicked gallery position (0 base) clicked_file = gallery(0,"get",Nth); // clicked_file is subject for zfree() if (! clicked_file) return; if (navi::gallerytype == ALBUM) { popup_menu(Mwin,popmenu_album); return; } ftype = image_file_type(clicked_file); if (ftype == IMAGE) popup_menu(Mwin,popmenu_thumb); if (ftype == RAW) popup_menu(Mwin,popmenu_raw); if (ftype == VIDEO) popup_menu(Mwin,popmenu_video); return; } /**************************************************************************************/ // set window view mode, F/G/M/N void m_viewmode(GtkWidget *, ch *fgm) // menu function { viewmode(fgm[0]); return; } void viewmode(ch fgm) // callable { if (! fgm) fgm = '0'; // null -> '0' if (fgm == FGM) { // no view mode change zfuncs::vmenustop = 0; // continue menu func return; } zfuncs::vmenustop = 1; // view mode change, stop menu func if (fgm == '0') // set no view mode (blank window) { gtk_widget_hide(Fhbox); gtk_widget_hide(Ghbox); gtk_widget_hide(Mhbox); FGM = '0'; Cstate = 0; // no image drawing area Cdrawin = 0; Fgdkwin = 0; if (zd_deltrash) m_delete_trash(0,0); // set target file in active dialog if (zd_copymove) m_copy_move(0,0); if (zd_metaview) meta_view(0); if (zd_rename) m_rename(0,0); } if (fgm == 'F') // set F view mode for image file { gtk_widget_hide(Ghbox); gtk_widget_hide(Mhbox); gtk_widget_show_all(Fhbox); if (! Fpanelshow) gtk_widget_hide(Fpanel); // no panel Cstate = &Fstate; // set drawing area Cdrawin = Fdrawin; Fgdkwin = gtk_widget_get_window(Fdrawin); // GDK window FGM = 'F'; set_mwin_title(); if (zd_deltrash) m_delete_trash(0,0); // set target file in active dialog if (zd_copymove) m_copy_move(0,0); if (zd_metaview) meta_view(0); if (zd_rename) m_rename(0,0); } if (fgm == 'G') // set G view mode for thumbnail gallery { gtk_widget_hide(Fhbox); gtk_widget_hide(Mhbox); gtk_widget_show_all(Ghbox); FGM = 'G'; Cstate = 0; // no image drawing area Cdrawin = 0; Fgdkwin = 0; if (curr_file) gallery(curr_file,"paint",0); // set gallery posn. at curr. file else gallery(0,"paint",-1); // else leave unchanged } if (fgm == 'M') { if (CEF) return; // don't interrupt edit func. if (Xindexlev < 1) { index_rebuild(1,0); if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } gtk_widget_hide(Fhbox); gtk_widget_hide(Ghbox); gtk_widget_show_all(Mhbox); FGM = 'M'; Cstate = 0; // no image drawing area Cdrawin = 0; Fgdkwin = 0; m_load_netmap(0,0); // show internet map } return; } /**************************************************************************************/ // generate custom user menu from custom menu file // menu entry options: // # comment or heading comment or heading for a group of menunames // menuname # tooltip start a fotocx menu function // album albumname open an album // file filename open an image file namespace custom_menu_names { ch **menulist = 0; int Nm = 0; } // custom menu function void m_custom_menu(GtkWidget *, ch *) { using namespace custom_menu_names; void custom_menu_process(GtkWidget *, ch *); void custom_menu_edit(GtkWidget *, ch *); GtkWidget *popmenu; ch *menu, *text, *pp; int ii, nn; F1_help_topic = TX("CUSTOM MENU"); printf("m_custom_menu \n"); if (menulist) zreadfile_free(menulist); // clear prior Nm = zreadfile(custom_menu_file,menulist); // (may be empty) popmenu = create_popmenu(); // create popup menu for (ii = 0; ii < Nm; ii++) // parse: menuname # text { menu = text = 0; pp = strchr(menulist[ii],'#'); // get text alone after '#' if (pp) { *pp = 0; text = pp + 1; nn = strTrim2(text); // remove blanks if (! nn) text = 0; } nn = strTrim2(menulist[ii]); // get menuname before '#' if (nn) menu = menulist[ii]; // have menuname # text (tool tip) else { *pp = '#'; // no menuname, restore '#' menu = pp; // have only # text text = 0; } if (strmatchN(menu,"album",5)) text = TX("view album"); add_popmenu(popmenu,menu,custom_menu_process,0,text); } add_popmenu(popmenu,TX("Edit Menu"),custom_menu_edit,0,TX("edit this menu")); // add menu edit function at end popup_menu(Mwin,popmenu); // show popup menu return; } // process custom menu entry: void custom_menu_process(GtkWidget *, ch *text) { using namespace custom_menu_names; ch text2[300], albumfile[300]; int ii; printf("custom menu: %s \n",text); if (*text == '#') return; // text = # comment - do nothing if (strchr(text,'~')) repl_1str(text,text2,300,"~",getenv("HOME")); // replace embedded "~" or "$HOME" else if (strstr(text,"$HOME")) // with "/home/" repl_1str(text,text2,300,"$HOME",getenv("HOME")); else strncpy0(text2,text,300); if (strmatchcaseN(text2,"album",5)) // text = album albumname { strTrim2(text2+5); snprintf(albumfile,300,"%s/%s",albums_folder,text2+5); // add albums folder before name album_show(albumfile); // show the album return; } if (strmatchcaseN(text2,"file",4)) // text = file filename { strTrim2(text2+4); f_open(text2+4); // show the file (image) viewmode('F'); return; } for (ii = 0; ii < Nmenus; ii++) // text = fotocx menu name { // find menu name in menu table if (! menutab[ii].menu) continue; // separator, null menu if (strmatchcase(text,menutab[ii].menu)) break; // find menu function 26.0 if (strmatchcase(TX(text),menutab[ii].menu)) break; if (strmatchcase(text,TX(menutab[ii].menu))) break; } if (ii < Nmenus) menutab[ii].func(0,0); // found, call menu function else zmessageACK(Mwin,TX(text)); // menu not found, display it return; } void custom_menu_edit(GtkWidget *, ch *) // edit the custom menu file { zdialog_edit_textfile(Mwin,custom_menu_file); // edit new menu return; } /************************************************************************************** Build a script file with one or more predefined edit functions that can be executed like a single edit function. fotocx.h: ch scriptfile[200]; // current script file FILE *script_fid; // script file FID int Fscriptbuild; // flag, script build in progress ***/ // menu function void m_edit_script(GtkWidget *, ch *menu) { int edit_script_dialog_event(zdialog *zd, ch *event); zdialog *zd; F1_help_topic = TX("SCRIPT FILES"); printf("m_edit_script \n"); /*** _________________________________________ | Script Files | | | | [start] begin making a script file | | [close] finish making a script file | | | | [X] | |_________________________________________| ***/ zd = zdialog_new("Script Files",Mwin,"X",null); zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"button","start","hb1","Start","space=5"); zdialog_add_widget(zd,"label","labstart","hb1",TX("begin making a script file")); zdialog_add_widget(zd,"hbox","hb2","dialog"); zdialog_add_widget(zd,"button","close","hb2","Close","space=5"); zdialog_add_widget(zd,"label","labclose","hb2",TX("finish making a script file")); zdialog_run(zd,edit_script_dialog_event,"parent"); return; } // dialog event and completion function int edit_script_dialog_event(zdialog *zd, ch *event) { int edit_script_start(void); int edit_script_close(void); if (zd->zstat) { // canceled zdialog_free(zd); if (script_fid) fclose(script_fid); script_fid = 0; Fscriptbuild = 0; return 1; } if (strmatch(event,"start")) // start building script edit_script_start(); if (strmatch(event,"close")) { // script if finished edit_script_close(); zdialog_free(zd); } return 1; } // start building a script file // if Fscriptbuild is active, edit_done() saves edit settings in script file int edit_script_start() { ch *pp; if (Fscriptbuild) { zmessageACK(Mwin,TX("script already started")); return 0; } pp = zgetfile(TX("start a new script file"),MWIN,"save",scripts_folder,1); if (! pp) return 0; strncpy0(scriptfile,pp,200); // script file name from user zfree(pp); pp = strrchr(scriptfile,'/'); // script name = file base name if (! pp || strlen(pp) > 99) { zmessageACK(Mwin,TX("script file name too big")); return 0; } script_fid = fopen(scriptfile,"w"); // open script file if (! script_fid) { zmessageACK(Mwin,strerror(errno)); return 0; } fprintf(script_fid,"script name: %s\n",pp+1); // write header record Fscriptbuild = 1; zmessageACK(Mwin,TX("perform edits to include in the script file")); return 1; } // this function is called from edit_done() when Fscriptbuild is active // save all widget settings in the script file data void edit_script_addfunc(editfunc *CEF) { int err; fprintf(script_fid,"menu: %s\n",CEF->menuname); // write "menu: menu name" if (CEF->zd) { err = zdialog_save_widgets(CEF->zd,CEF->sd,CEF->menuname,script_fid); // write widget settings if (err) { zmessageACK(Mwin,TX("script file error")); return; } } zmessageACK(Mwin,TX("%s added to script"),CEF->menuname); return; } // complete and save a script file under construction int edit_script_close() { if (! Fscriptbuild) { zmessageACK(Mwin,TX("no script file was started")); return 0; } fprintf(script_fid,"menu: end"); fclose(script_fid); script_fid = 0; Fscriptbuild = 0; zmessageACK(Mwin,TX("script file closed")); return 1; } // present a popup menu for user to select a script file // run the given function using the selected script file // called by m_run_script() and m_batch_script() // // 'runfunc' arg: void runfunc(GtkWidget *, ch *scriptname); void select_script(cbFunc *runfunc) { static ch **scriptnames = 0; static GtkWidget *scriptmenu = 0; static int ns = 0; ch buff[200], *pp; int ii, kk; FILE *fid; if (scriptnames) { for (ii = 0; ii < ns; ii++) // free prior memory zfree(scriptnames[ii]); zfree(scriptnames); scriptnames = 0; } if (scriptmenu) gtk_widget_destroy(scriptmenu); scriptmenu = 0; ns = zreaddir(scripts_folder,scriptnames); // get all script names if (ns < 1) { // from script file folder zmessageACK(Mwin,TX("no script files found")); return; } scriptmenu = create_popmenu(); // create popup menu for script names add_popmenu(scriptmenu,TX("Cancel"),0,0,0); for (ii = kk = 0; ii < ns; ii++) { snprintf(scriptfile,200,"%s/%s",scripts_folder,scriptnames[ii]); // read script file 1st record fid = fopen(scriptfile,"r"); if (! fid) continue; pp = fgets_trim(buff,200,fid,1); // read "script name: scriptname" if (pp && strmatch(pp+13,scriptnames[ii])) { // must match file name add_popmenu(scriptmenu,scriptnames[ii],runfunc,0,0); // add to popup menu kk++; } fclose(fid); } if (kk) popup_menu(0,scriptmenu); // present menu to select and run else zmessageACK(Mwin,TX("no script files found")); return; } // execute a script file using the current image file void run_script(GtkWidget *, ch *scriptname) { ch buff[200]; ch *pp, menuname[40]; int ii, err; if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } if (script_fid) printf("*** run_script(): script_fid not 0 \n"); Fbusy(+1); // enable user kill snprintf(scriptfile,200,"%s/%s",scripts_folder,scriptname); // script file from script name printf("start script: %s \n",scriptfile); script_fid = fopen(scriptfile,"r"); // open script file if (! script_fid) { zmessageACK(Mwin,TX("script error: %s, %s"),scriptfile,strerror(errno)); goto badfile; } pp = fgets_trim(buff,200,script_fid,1); // read "script name: scriptname" if (! pp) goto badfile; if (! strmatch(pp+13,scriptname)) goto badfile; // must match script name Fscriptrun = 1; // script file active while (true) // process script file { if (Fescape) break; // user kill zmainsleep(0.01); pp = fgets_trim(buff,200,script_fid,1); // read "menu: menuname" if (! pp) goto badfile; if (! strmatchN(pp,"menu: ",6)) goto badfile; strncpy0(menuname,pp+6,40); if (strmatch(menuname,"end")) break; // end of script for (ii = 0; menutab[ii].menu; ii++) { // convert menu name to menu function if (strmatch(menuname,menutab[ii].menu)) break; // 26.0 if (strmatch(menuname,TX(menutab[ii].menu))) break; if (strmatch(TX(menuname),menutab[ii].menu)) break; } if (! menutab[ii].menu) { zmessageACK(Mwin,TX("unknown edit function: %s"),menuname); goto badfile; } printf("start edit: %s for file: %s \n",menuname,curr_file); menutab[ii].func(0,menutab[ii].arg); // call the menu function if (CEF && CEF->zd) { err = zdialog_load_widgets(CEF->zd,CEF->sd,CEF->menuname,script_fid); // read and load dialog settings if (err) { zmessageACK(Mwin,TX("load widgets failed: %s"),menuname); goto badfile; } zdialog_send_event(CEF->zd,"apply"); // finish edit if (CEF && CEF->threadfunc) thread_wait(); // insure complete if (CEF && CEF->zd) zdialog_send_event(CEF->zd,"done"); printf("finish edit \n"); } } fclose(script_fid); // close script file script_fid = 0; Fscriptrun = 0; // script file not active Fescape = 0; Fbusy(-1); return; badfile: zmessageACK(Mwin,TX("script file format error: %s"),scriptname); if (script_fid) fclose(script_fid); script_fid = 0; Fscriptrun = 0; Fescape = 0; Fbusy(-1); return; } // execute a script file using pre-selected image files void batch_script(GtkWidget *, ch *scriptname) { ch *imagefile; ch *newfilevers; int ii, err; if (! SFcount) { // preselected file list zmessageACK(Mwin,TX("no files selected")); return; } Fbusy(+1); // enable user kill for (ii = 0; ii < SFcount; ii++) // loop image files to process { if (Fescape) break; imagefile = SelFiles[ii]; err = f_open(imagefile); // open, current image file if (err) { zmessageACK(Mwin,"open failure: %s \n %s",imagefile,strerror(errno)); break; } run_script(0,scriptname); // run script for image file newfilevers = file_new_version(curr_file); // get next avail. file version name if (! newfilevers) break; if (strmatch(curr_file_type,"RAW")) { // if RAW, substitute tif-16 strcpy(curr_file_type,"tif"); curr_file_bpc = 16; } err = f_save(newfilevers,curr_file_type,curr_file_bpc,0,1); // save file zfree(newfilevers); } Fescape = 0; Fbusy(-1); panelmessage(1,3,TX("script complete")); // 25.1 return; } // menu function // select and run a script file using the current image file void m_run_script(GtkWidget *, ch *menu) { F1_help_topic = TX("SCRIPT FILES"); printf("m_run_script \n"); select_script(run_script); return; } // menu function // select and run a script file using multiple selected files void m_batch_script(GtkWidget *, ch *menu) { int batch_script_dialog_event(zdialog *zd, ch *event); zdialog *zd; ch text[100]; F1_help_topic = TX("SCRIPT FILES"); printf("m_batch_script \n"); /*** _________________________________________ | Batch Script | | | | [Select Files] NN files selected | | [Select Script] script file to run | | | | [X] | |_________________________________________| ***/ zd = zdialog_new("Batch Script",Mwin,"X",null); zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"button","select-files","hb1",TX("Select Files"),"space=5"); zdialog_add_widget(zd,"label","fcount","hb1",TX("no files selected")); zdialog_add_widget(zd,"hbox","hb2","dialog"); zdialog_add_widget(zd,"button","select-script","hb2",TX("Select Script"),"space=5"); zdialog_add_widget(zd,"label","labscript","hb2",TX("script file to run")); snprintf(text,100,"%d image files selected",SFcount); // show selected files count zdialog_stuff(zd,"fcount",text); zdialog_run(zd,batch_script_dialog_event,"parent"); return; } // dialog event and completion function int batch_script_dialog_event(zdialog *zd, ch *event) { ch countmess[80]; F1_help_topic = TX("SCRIPT FILES"); if (zd->zstat) { // canceled zdialog_free(zd); return 1; } if (strmatch(event,"select-files")) { select_files(0); // get new file list if (SFcount) { snprintf(countmess,80,TX("%d image files selected"),SFcount); // update dialog file count zdialog_stuff(zd,"fcount",countmess); } else zdialog_stuff(zd,"fcount",TX("no files selected")); } if (strmatch(event,"select-script")) { // select and run a script file if (! SFcount) zmessageACK(Mwin,TX("no files selected")); else { select_script(batch_script); zdialog_free(zd); } } return 1; } /**************************************************************************************/ // Plugin menu functions namespace plugins_names { int Nplugins; // plugin menu items ch **plugins = 0; GtkWidget *popup_plugmenu = 0; } // choose and run a plugin function or edit the plugins menu void m_plugins(GtkWidget *, ch *) { using namespace plugins_names; void m_edit_plugins(GtkWidget *, ch *); void m_run_plugin(GtkWidget *, ch *); ch *pp, *tt; FILE *fid; int ii; F1_help_topic = TX("PLUGINS"); printf("m_plugins \n"); if (! regfile(plugins_file)) { fid = fopen(plugins_file,"w"); // not found, create default fprintf(fid,"Gimp = gimp %%s # edit current image using Gimp \n"); fprintf(fid,"auto-gamma = mogrify -auto-gamma %%s # auto gamma \n"); // imagemagick package fclose(fid); } if (plugins) zreadfile_free(plugins); // read plugins file each time Nplugins = zreadfile(plugins_file,plugins); if (Nplugins < 1) return; popup_plugmenu = create_popmenu(); // create popup menu for plugins for (ii = 0; ii < Nplugins; ii++) // add the plugin menu functions { pp = strstr(plugins[ii]," = "); // get plugin record: if (! pp) { // xxxx = xxxxx # tooltip printf("*** plugin bad format: %s \n",plugins[ii]); // | | continue; // pp tt } pp++; *pp = 0; tt = strchr(pp+1,'#'); // locate tool tip if (tt) { *tt = 0; tt++; } add_popmenu(popup_plugmenu, plugins[ii], m_run_plugin,0,tt); // create menu, menu name and tooltip *pp = '='; // restore '=' } add_popmenu(popup_plugmenu,TX("Edit Plugins"), // last entry is Edit Plugins m_edit_plugins, 0, TX("Edit plugins menu")); popup_menu(Mwin,popup_plugmenu); // popup the menu return; } /**************************************************************************************/ // edit plugins menu // edit the plugins file in /home//.fotocx/plugins void m_edit_plugins(GtkWidget *, ch *) { F1_help_topic = TX("PLUGINS"); printf("m_edit_plugins \n"); if (FGM != 'F' && FGM != 'G') return; zdialog_edit_textfile(Mwin,plugins_file); return; } /**************************************************************************************/ // process plugin menu selection // execute corresponding command using current image file editfunc EFplugin; void m_run_plugin(GtkWidget *, ch *menu) { using namespace plugins_names; ch * find_outfile(ch *infile, uint basetime); int ii, jj, err; ch *pp = 0, *pp1, *pp2; ch plugcommand[400], temp[400]; ch menuname[100]; ch *plugfile = 0, *outfile = 0; uint basetime; F1_help_topic = TX("PLUGINS"); printf("run plugin: %s \n",menu); for (ii = 0; ii < Nplugins; ii++) // search plugins for menu name { pp = strchr(plugins[ii],'='); // match menu name to plugin command if (! pp) continue; // menu name = command "%s" *pp = 0; jj = strmatch(plugins[ii],menu); *pp = '='; if (jj) break; } if (ii == Nplugins) { zmessageACK(Mwin,TX("plugin menu not found %s"),menu); return; } strncpy0(plugcommand,pp+1,400); // corresp. command strTrim2(plugcommand); pp = strstr(plugcommand,"%s"); // no file placeholder in command if (! pp) { panelmessage(1,0,TX("Plugin working ...")); // 25.1 err = zshell("log ack thread",plugcommand); // execute non-file plugin command 25.1 panelmessage(0); return; } if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } plugfile = zstrdup(curr_file,"run_plugin",50); pp1 = strrchr(plugfile,'/'); // plugfile: /.../curr_file.ext pp2 = strrchr(curr_file,'.'); // | | // pp1 pp2 if (! pp1 || ! pp2) { zmessageACK(Mwin,TX("cannot parse current file")); return; } strcpy(pp1,"/fotocx-plugin-file"); // plugfile: /.../fotocx-plugin-file.ext strcat(pp1,pp2); err = cp_copy(curr_file,plugfile); if (err) { zmessageACK(Mwin,TX("cannot copy current file")); return; } if (! strstr(plugcommand,"\"%s\"")) { // insure plugin command "%s" repl_1str(plugcommand,temp,400,"%s","\"%s\""); // is bracketed with quotes strcpy(plugcommand,temp); } pp = zescape_quotes(plugfile); // escape quotes in file name repl_1str(plugcommand,command,CCC,"%s",pp); // command = plugcommand "plugfile" zfree(pp); panelmessage(1,0,TX("Plugin working ...")); // 25.1 Fblock("plugin"); basetime = get_seconds(); // basetime = NOW err = zshell("log ack thread",command); // execute plugin command, return 25.1 panelmessage(0); Fblock(0); if (err) { zmessageACK(Mwin,TX("plugin command failed")); return; } snprintf(menuname,100,"Plugin %s",menu); // make fotocx edit function pp = strchr(menuname,'='); // Plugin progname = ... if (pp) pp[-1] = 0; EFplugin.menuname = zstrdup(menuname,"run_plugin"); // Plugin progname EFplugin.menufunc = m_run_plugin; EFplugin.Farea = 2; // select area usable if (! edit_setup(EFplugin)) return; outfile = find_outfile(plugfile,basetime); // search for plugin output file if (! outfile) { // with mod time > basetime zmessageACK(Mwin,TX("no plugin output file found")); edit_cancel(0); return; } PXM_free(E3pxm); // discard E3 image from edit_setup E3pxm = PXM_load(outfile,1); // new E3 from plugin output file if (! E3pxm) { zmessageACK(Mwin,TX("cannot read pluging output file")); edit_cancel(0); return; } Eww = E3pxm->ww; // new E3 size Ehh = E3pxm->hh; if (sa_stat == sa_stat_fini) { // if select area, restore unselected if (Eww != E1pxm->ww || Ehh != E1pxm->hh) zmessageACK(Mwin,TX("output file size change, cannot use select area")); else sa_postfix(); } CEF->Fmods++; // E3 modified CEF->Fsaved = 0; edit_done(0); remove(outfile); return; } /**************************************************************************************/ // Find the output file from a plugin or other function which processes // an input file and creates an output file. // Searches for output file with root name match and modtime > basetime. // Returned filename is subject for zfree(). // Note: only files < 1 hour old are checked, so user must return from // the plugin app to Fotocx within 1 hour after making the output file. ch * find_outfile(ch *infile, uint basetime) { ch *findcommand = "find %s -type f -cmin -60 -print"; // get files < 1 hour old ch buff[XFCC]; ch outfile[XFCC]; ch findpatt[XFCC]; ch basename[200]; ch *pp, *pp1, *pp2; int bcc, err; FILE *fid; STATB statB; uint modtime = basetime; uint modtimex; *outfile = 0; if (! regfile(infile,&statB)) return 0; pp = strrchr(infile,'/'); // get input file base name if (! pp) return 0; strncpy0(basename,pp,200); pp = strrchr(basename,'.'); if (pp) *pp = 0; bcc = strlen(basename); repl_Nstrs(infile,findpatt,XFCC," ","\\ ","\"","\\\"","'","\\'",null); // escapes for 'find' command pp = strrchr(findpatt,'/'); // search folder if (! pp) return 0; pp[1] = 0; snprintf(command,XFCC,findcommand,findpatt); // search input file folder printf("%s\n",command); // for recent regular files fid = popen(command,"r"); if (! fid) return 0; while ((pp1 = fgets_trim(buff,XFCC,fid))) { // loop files found if (image_file_type(pp1) != IMAGE) continue; // not image file type pp2 = strrchr(buff,'/'); // get file base name if (! pp2 || ! strmatchN(pp2,basename,bcc)) continue; // no match err = stat(pp1,&statB); // 26.0 if (err) continue; modtimex = statB.st_mtim.tv_sec; // file mod time if (modtimex < modtime) continue; // older than me strncpy0(outfile,pp1,XFCC); // save latest file found modtime = modtimex; } pclose(fid); printf("plugin output file: %s \n",outfile); if (*outfile) return zstrdup(outfile,"find_outfile"); else return 0; } fotocx/f.batch.cc0000664000175000017500000025600015247006660012647 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit - Batch Menu functions m_batch_convert batch rename, convert, rescale, move m_batch_copy_move batch copy/move selected files to another folder m_batch_upright find rotated files and upright them m_batch_deltrash delete or trash selected files m_batch_overlay add overlay image (copyright ...) to selected files m_export_files select files and export to a folder ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) #include using namespace zfuncs; /**************************************************************************************/ // Batch file rename, convert, rescale, move namespace batch_convert_names { int Fsametype, Fsamebpc, newbpc, jpeg_quality; int Fupsize, Fdownsize, maxww, maxhh; int Fdelete, Fcopymeta, Fupalbums, Freplace, Fnewtext; int Fplugdate, Fplugseq, Fplugname; int Frescale; // a rescale button is pressed 25.1 ch Arescale[8]; // which one: "1/4" "1/3" etc. 25.1 ch text1[100], text2[100]; ch newloc[XFCC], newname[200], newext[8]; int baseseq, addseq; int NT = 8; // threads ch **infile, **outfile, **statmess; zdialog *zdpop; }; // menu function void m_batch_convert(GtkWidget *, ch *) // use parallel threads 25.1 { using namespace batch_convert_names; int batch_convert_dialog_event(zdialog *zd, ch *event); void * batch_convert_wthread(void *); zdialog *zd; int zstat; ch text[100]; int im, Nrep; F1_help_topic = TX("BATCH CONVERT"); printf("m_batch_convert \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } /*** ___________________________________________________________________________ | Batch Convert | | | | [Select Files] N files selected | | | | Replace Text [________________________] --> [_________________________] | replace substring in file names | New Name [_____________________________________________________________] | $yyyy $mm $dd $oldname $ss | Sequence Numbers base [______] adder [______] | | New Location [_______________________________________________] [browse] | | | | New Type: (o) tif (o) png (o) jxl (o) jpg [90] quality (o) no change | jxl | Color Depth: (o) 8-bit (o) 16-bit (o) no change | | Max. Width [_____] Height [_____] [x] downsize [x] upsize | | Rescale: (o) 1/4 (o) 1/3 (o) 1/2 (o) 2/3 (o) 1.0 (o) 1.4 (o) 2.0 | 25.1 | [x] Delete Originals [x] Copy Metadata [x] Update Albums | | | | [Proceed] [X] | |___________________________________________________________________________| ***/ zd = zdialog_new("Batch Convert",Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbf","dialog",0,"space=5"); zdialog_add_widget(zd,"button","files","hbf",TX("Select Files"),"space=5"); zdialog_add_widget(zd,"label","fcount","hbf",TX("no files selected"),"space=10"); zdialog_add_widget(zd,"hbox","hbrep","dialog"); zdialog_add_widget(zd,"label","labrep1","hbrep",TX("Replace Text"),"space=5"); zdialog_add_widget(zd,"zentry","text1","hbrep",0,"expand"); zdialog_add_widget(zd,"label","arrow","hbrep"," --> ","space=5"); zdialog_add_widget(zd,"zentry","text2","hbrep",0,"expand"); zdialog_add_ttip(zd,"labrep1",TX("replace substring within file name")); zdialog_add_widget(zd,"hbox","hbname","dialog"); zdialog_add_widget(zd,"label","labname","hbname",TX("New Name"),"space=5"); zdialog_add_widget(zd,"zentry","newname","hbname",0,"expand"); zdialog_add_ttip(zd,"labname",TX("plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s")); zdialog_add_widget(zd,"hbox","hbseq","dialog"); zdialog_add_widget(zd,"label","labseq","hbseq",TX("Sequence Numbers"),"space=5"); zdialog_add_widget(zd,"label","space","hbseq",0,"space=8"); zdialog_add_widget(zd,"label","labbase","hbseq",TX("base"),"space=5"); zdialog_add_widget(zd,"zspin","baseseq","hbseq","0|100000|1|0","size=5"); zdialog_add_widget(zd,"label","space","hbseq","","space=3"); zdialog_add_widget(zd,"label","labadder","hbseq",TX("adder"),"space=5"); zdialog_add_widget(zd,"zspin","addseq","hbseq","0|100|1|0","size=3"); zdialog_add_widget(zd,"label","space","hbseq",0,"space=60"); // push back oversized entries zdialog_add_widget(zd,"hbox","hbloc","dialog"); zdialog_add_widget(zd,"label","labloc","hbloc",TX("New Location"),"space=5"); zdialog_add_widget(zd,"zentry","newloc","hbloc",0,"expand|space=5"); zdialog_add_widget(zd,"button","browse","hbloc",TX("Browse"),"space=5"); zdialog_add_widget(zd,"hbox","hbft","dialog"); zdialog_add_widget(zd,"label","labtyp","hbft",TX("New Type:"),"space=5"); zdialog_add_widget(zd,"radio","tif","hbft","tif","space=4"); zdialog_add_widget(zd,"radio","png","hbft","png","space=4"); zdialog_add_widget(zd,"radio","jxl","hbft","jxl","space=4"); // jxl zdialog_add_widget(zd,"radio","jpg","hbft","jpg","space=4"); zdialog_add_widget(zd,"zspin","jpgqual","hbft","10|100|1|90","size=3"); zdialog_add_widget(zd,"label","labqual","hbft",TX("quality"),"space=6"); zdialog_add_widget(zd,"radio","sametype","hbft",TX("no change"),"space=6"); zdialog_add_widget(zd,"hbox","hbcd","dialog"); zdialog_add_widget(zd,"label","labcd","hbcd",TX("Color Depth:"),"space=5"); zdialog_add_widget(zd,"radio","8-bit","hbcd","8-bit","space=4"); zdialog_add_widget(zd,"radio","16-bit","hbcd","16-bit","space=4"); zdialog_add_widget(zd,"radio","samebpc","hbcd",TX("no change"),"space=4"); zdialog_add_widget(zd,"hbox","hbwh","dialog"); zdialog_add_widget(zd,"label","labw","hbwh",TX("Max. Width"),"space=5"); zdialog_add_widget(zd,"zspin","maxww","hbwh","0|10000|1|1000","size=5"); zdialog_add_widget(zd,"label","space","hbwh",0,"space=5"); zdialog_add_widget(zd,"label","labh","hbwh",TX("Height"),"space=5"); zdialog_add_widget(zd,"zspin","maxhh","hbwh","0|10000|1|700","size=5"); zdialog_add_widget(zd,"check","downsize","hbwh",TX("downsize"),"space=20"); zdialog_add_widget(zd,"check","upsize","hbwh",TX("upsize")); zdialog_add_widget(zd,"label","space","hbwh",0,"space=30"); // push back oversized entries zdialog_add_ttip(zd,"downsize",TX("reduce to these limits if larger")); zdialog_add_ttip(zd,"upsize",TX("expand to these limits if smaller")); zdialog_add_widget(zd,"hbox","hbrs","dialog"); // 25.1 zdialog_add_widget(zd,"label","labrs","hbrs",TX("Rescale:"),"space=5"); zdialog_add_widget(zd,"radio","rs-1/4","hbrs","1/4","space = 5"); zdialog_add_widget(zd,"radio","rs-1/3","hbrs","1/3","space = 5"); zdialog_add_widget(zd,"radio","rs-1/2","hbrs","1/2","space = 5"); zdialog_add_widget(zd,"radio","rs-2/3","hbrs","2/3","space = 5"); zdialog_add_widget(zd,"radio","rs-1.0","hbrs","1.0","space = 5"); zdialog_add_widget(zd,"radio","rs-1.4","hbrs","1.4","space = 5"); zdialog_add_widget(zd,"radio","rs-2.0","hbrs","2.0","space = 5"); zdialog_add_widget(zd,"hbox","hbopts","dialog"); zdialog_add_widget(zd,"check","delete","hbopts",TX("Delete Originals"),"space=3"); zdialog_add_widget(zd,"check","copymeta","hbopts",TX("Copy Metadata"),"space=5"); zdialog_add_widget(zd,"check","upalbums","hbopts",TX("Update Albums"),"space=5"); // 25.1 snprintf(text,100,TX("%d image files selected"),SFcount); // show selected files count zdialog_stuff(zd,"fcount",text); // set default inputs zdialog_stuff(zd,"tif",0); zdialog_stuff(zd,"png",0); zdialog_stuff(zd,"jxl",0); // jxl zdialog_stuff(zd,"jpg",0); zdialog_stuff(zd,"jpgqual",jpeg_def_quality); zdialog_stuff(zd,"sametype",1); // same file type zdialog_stuff(zd,"8-bit",0); zdialog_stuff(zd,"16-bit",0); zdialog_stuff(zd,"samebpc",1); // same bits/color *newloc = 0; // no new location zdialog_stuff(zd,"downsize",0); // downsize - no zdialog_stuff(zd,"upsize",0); // upsize - no zdialog_stuff(zd,"rs-1/4",0); // 25.1 zdialog_stuff(zd,"rs-1/3",0); zdialog_stuff(zd,"rs-1/2",0); zdialog_stuff(zd,"rs-2/3",0); zdialog_stuff(zd,"rs-1.0",1); // no rescale zdialog_stuff(zd,"rs-1.4",0); zdialog_stuff(zd,"rs-2.0",0); zdialog_stuff(zd,"delete",0); // delete originals - no zdialog_stuff(zd,"copymeta",1); // copy metadata - yes zdialog_stuff(zd,"upalbums",0); // update albums - no 25.1 zdialog_load_inputs(zd); // preload prior user inputs // run dialog, get user inputs zdialog_run(zd,batch_convert_dialog_event,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for completion zdialog_free(zd); if (zstat != 1) return; // canceled if (! SFcount) return; // no input files if (Fblock("batch_convert")) return; // block other functions // start processing image files Fbusy(+1); // top panel busy indicator infile = (ch **) zmalloc(SFcount * sizeof(ch **),"batch_convert"); // make table of file names outfile = (ch **) zmalloc(SFcount * sizeof(ch **),"batch_convert"); statmess = (ch **) zmalloc(SFcount * sizeof(ch **),"batch_convert"); for (im = 0; im < SFcount; im++) { infile[im] = zstrdup(SelFiles[im],"batch_convert"); // input file name outfile[im] = 0; // output file name statmess[im] = TX("waiting"); // conversion status } zdpop = popup_report_open(TX("converting files"),Mwin,600,300,0,0,0,"X",null); // open popup report zmainloop(); for (im = 0; im < NT; im++) // start threads for conversion work start_detached_thread(batch_convert_wthread,&Nval[im]); for (Nrep = 0; Nrep < SFcount;) { for (im = 0; im < SFcount; im++) // report results { if (statmess[im] && ! strmatch(statmess[im],TX("waiting"))) { // look for next finished file popup_report_write2(zdpop,0,"\n"); popup_report_write2(zdpop,0,TX("input file: %s \n"),infile[im]); // log input file popup_report_write2(zdpop,0,TX("output file: %s \n"),outfile[im]); // log output file if (strmatch(statmess[im],TX("completed"))) popup_report_write2(zdpop,0,TX("status: completed \n")); // report status else popup_report_write2(zdpop,1,TX("status: %s \n"),statmess[im]); // bold if not "completed" statmess[im] = 0; Nrep++; zmainloop(); } } zmainsleep(0.1); } // processing complete if (! zdialog_valid(zdpop)) popup_report_write2(zdpop,0,TX("\n *** CANCELED \n")); else popup_report_write2(zdpop,0,TX("\n *** COMPLETED \n")); popup_report_bottom(zdpop); Fbusy(-1); index_rebuild(2,0); // update index and thumbnails 25.1 if (Fupalbums) album_purge_replace("ALL",SFcount,infile,outfile); // update album files 25.1 Fblock(0); for (im = 0; im < SFcount; im++) { // free memory zfree(infile[im]); if (outfile[im]) zfree(outfile[im]); } zfree(infile); zfree(outfile); zfree(statmess); if (*newloc) gallery(newloc,"init",0); // refresh gallery 25.1 else gallery(0,"init",0); gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); // repaint from same position viewmode('G'); return; } // thread function which does the conversion work without use of GTK functions void * batch_convert_wthread(void *arg) { using namespace batch_convert_names; int index = *((int *) arg); int im, jj, cc, err; ch *pp; ch *inloc, *inname, *inext; ch *outloc, *outname, *outext; ch *tempname, seqplug[8], seqnum[8]; ch plugyyyy[8], plugmm[4], plugdd[4]; int outww, outhh, outbpc, Fdelete2; float scale, wscale, hscale; PXM *pxmin, *pxmout; xxrec_t *xxrec; for (im = index; im < SFcount; im += NT) // thread count { if (! zdialog_valid(zdpop)) break; // report canceled if ((image_file_type(infile[im]) != IMAGE) && (image_file_type(infile[im]) != RAW)) { // RAW added 25.1 statmess[im] = TX("not an image file"); continue; } parsefile(infile[im],inloc,inname,inext); // parse folder, filename, .ext if (! inloc || ! inname || ! inext) { statmess[im] = TX("cannot parse file"); continue; } outloc = zstrdup(inloc,"batch convert"); // initial output = input file outname = zstrdup(inname,"batch convert"); outext = zstrdup(inext,"batch convert",4); if (*newname) { // new name was specified zfree(outname); outname = zstrdup(newname,"batch convert"); // may contain $-plugins } if (Fnewtext) { // file name replacement text tempname = zstrdup(outname,"batch convert",100); cc = strlen(outname) + 100; repl_1str(outname,tempname,cc,text1,text2); // replace text1 (if present) with text2 zfree(outname); outname = tempname; } if (Fplugname) // insert old file name { cc = strlen(outname) + strlen(inname); // 25.1 tempname = zstrdup(outname,"batch convert",cc); repl_1str(outname,tempname,cc,"$oldname",inname); // ...$oldname... >> ...inname... zfree(outname); outname = tempname; } if (Fplugdate) // insert meta date { xxrec = get_xxrec(infile[im]); // get photo date, yyyymmddhhmmdd if (! *xxrec->pdate) { statmess[im] = TX("no photo date, skipped"); zfree(outloc); zfree(outname); zfree(outext); continue; } strncpy0(plugyyyy,xxrec->pdate,5); // yyyy:mm:dd strncpy0(plugmm,xxrec->pdate+5,3); strncpy0(plugdd,xxrec->pdate+8,3); tempname = zstrdup(outname,"batch convert",8); cc = strlen(outname) + 8; repl_Nstrs(outname,tempname,cc,"$yyyy",plugyyyy,"$mm",plugmm,"$dd",plugdd,null); zfree(outname); outname = tempname; } if (Fplugseq) // insert sequence number { pp = strcasestr(outname,"$s"); // find $s... in output name if (pp) { for (cc = 1; pp[cc] == pp[1] && cc < 6; cc++); // length of "$s...s" 2-6 chars. strncpy0(seqplug,pp,cc+1); jj = baseseq + im * addseq; // new sequence number snprintf(seqnum,8,"%0*d",cc-1,jj); // 1-5 chars. tempname = zstrdup(outname,"batch convert",8); cc = strlen(outname) + 8; repl_1str(outname,tempname,cc,seqplug,seqnum); // ...$ssss... >> ...1234... zfree(outname); outname = tempname; } } if (*newloc) { // new location was given zfree(outloc); outloc = zstrdup(newloc,"batch convert"); } if (Fsametype) { // new .ext = old .ext if (strcasestr(".jpg .jpeg .png .jxl .tif .tiff",inext)) // jxl strcpy(outext,inext); else strcpy(outext,".jpg"); // other >> .jpg } else strcpy(outext,newext); // new .ext was given cc = strlen(outloc) + strlen(outname) + strlen(outext) + 4; // construct output file name outfile[im] = (ch *) zmalloc(cc,"batch convert"); snprintf(outfile[im],cc,"%s/%s%s",outloc,outname,outext); zfree(outloc); zfree(outname); zfree(outext); pxmin = PXM_load(infile[im],0); // read input file if (! pxmin) { statmess[im] = TX("cannot load input file"); continue; } if (*newloc) { if (regfile(outfile[im])) { // check if file exists in new location statmess[im] = TX("output file exists"); continue; } } outbpc = f_load_bpc; // input file bits/color outww = pxmin->ww; // input file size outhh = pxmin->hh; if (! Fsamebpc) outbpc = newbpc; // new bits/color pp = strrchr(outfile[im],'.'); if (pp && strmatch(pp,".jpg")) outbpc = 8; // if jpeg, force 8 bits/color if (Fdownsize) // downsize larger images { wscale = hscale = 1.0; if (outww > maxww) wscale = 1.0 * maxww / outww; // compute new size if (outhh > maxhh) hscale = 1.0 * maxhh / outhh; if (wscale < hscale) scale = wscale; // scale < 1 else scale = hscale; if (scale < 1.0) { outww = outww * scale + 0.5; // round outhh = outhh * scale + 0.5; pxmout = PXM_rescale(pxmin,outww,outhh); // rescaled output file PXM_free(pxmin); pxmin = 0; } } if (Fupsize && pxmin) // upsize smaller images { wscale = hscale = 1.0; if (outww < maxww) wscale = 1.0 * maxww / outww; // compute new size if (outhh < maxhh) hscale = 1.0 * maxhh / outhh; if (wscale < hscale) scale = wscale; // scale > 1 else scale = hscale; if (scale > 1.0) { outww = outww * scale + 0.5; // round outhh = outhh * scale + 0.5; pxmout = PXM_rescale(pxmin,outww,outhh); // rescaled output file PXM_free(pxmin); pxmin = 0; } } if (*Arescale && pxmin) // image rescale wanted 25.1 { scale = 1.0; if (strmatch(Arescale,"1/4")) scale = 0.25; // get rescale factor if (strmatch(Arescale,"1/3")) scale = 0.333333; if (strmatch(Arescale,"1/2")) scale = 0.5; if (strmatch(Arescale,"2/3")) scale = 0.666667; if (strmatch(Arescale,"1.0")) scale = 1.0; if (strmatch(Arescale,"1.4")) scale = 1.4; if (strmatch(Arescale,"2.0")) scale = 2.0; if (scale != 1.0) { outww = outww * scale + 0.5; // round outhh = outhh * scale + 0.5; pxmout = PXM_rescale(pxmin,outww,outhh); // rescaled output file PXM_free(pxmin); pxmin = 0; } } if (pxmin) { // no size change pxmout = pxmin; pxmin = 0; } err = PXM_save(pxmout,outfile[im],outbpc,jpeg_quality,0); // write output file PXM_free(pxmout); if (err) { statmess[im] = TX("cannot create output file"); continue; } if (Fcopymeta) { // copy metadata if requested err = meta_copy(infile[im],outfile[im],0,0,0); if (err) { statmess[im] = TX("metadata update error"); continue; } } Fdelete2 = 0; // figure out if input file can be deleted if (Fdelete) Fdelete2 = 1; // user says yes if (err) Fdelete2 = 0; // not if error if (strmatch(infile[im],outfile[im])) Fdelete2 = 0; // not if overwritten by output if (Fdelete2) // delete input file err = f_remove(infile[im],"delete"); // file/index/thumb/gallery statmess[im] = TX("COMPLETED"); } return 0; } // dialog event and completion callback function int batch_convert_dialog_event(zdialog *zd, ch *event) { using namespace batch_convert_names; ch *pp, *ploc, badplug[20]; ch countmess[80]; int ii, cc, yn, err; if (strmatch(event,"files")) // select images to convert { zdialog_show(zd,0); // hide parent dialog select_files(0); // get list of files to convert zdialog_show(zd,1); snprintf(countmess,80,TX("%d image files selected"),SFcount); // update dialog zdialog_stuff(zd,"fcount",countmess); } if (strmatch(event,"browse")) { zdialog_fetch(zd,"newloc",newloc,XFCC); ploc = zgetfile(TX("Select folder"),MWIN,"folder",newloc); // new location browse if (! ploc) return 1; zdialog_stuff(zd,"newloc",ploc); zfree(ploc); } if (zstrstr("tif png jxl jpg sametype",event)) { // jxl zdialog_stuff(zd,"tif",0); zdialog_stuff(zd,"png",0); zdialog_stuff(zd,"jxl",0); // jxl zdialog_stuff(zd,"jpg",0); zdialog_stuff(zd,"sametype",0); zdialog_stuff(zd,event,1); } if (zstrstr("8-bit 16-bit samebpc",event)) { zdialog_stuff(zd,"8-bit",0); zdialog_stuff(zd,"16-bit",0); zdialog_stuff(zd,"samebpc",0); zdialog_stuff(zd,event,1); } zdialog_fetch(zd,"jpg",ii); // if jpeg, force 8 bits/color if (ii) { zdialog_stuff(zd,"16-bit",0); zdialog_stuff(zd,"samebpc",0); zdialog_stuff(zd,"8-bit",1); } if (strstr("downsize upsize",event)) { // if upsize/downsize, no rescale 25.1 zdialog_fetch(zd,"downsize",Fdownsize); zdialog_fetch(zd,"upsize",Fupsize); if (Fupsize || Fdownsize) zdialog_stuff(zd,"rs-1.0",1); } if (strmatchN(event,"rs-",3)) { // if rescale, no upsize/downsize 25.1 zdialog_fetch(zd,"rs-1.0",Frescale); if (Frescale != 1) { // is rescale = 1.0 ? zdialog_stuff(zd,"upsize",0); // no, no upsize/downsize zdialog_stuff(zd,"downsize",0); } } // wait for dialog completion via [proceed] button if (zd->zstat != 1) return 1; zd->zstat = 0; // keep active until inputs OK zdialog_fetch(zd,"text1",text1,100); // text within file name zdialog_fetch(zd,"text2",text2,100); // replacement text zdialog_fetch(zd,"newname",newname,200); // new file name zdialog_fetch(zd,"baseseq",baseseq); // base sequence number zdialog_fetch(zd,"addseq",addseq); // sequence number adder zdialog_fetch(zd,"newloc",newloc,XFCC); // new location (folder) zdialog_fetch(zd,"maxww",maxww); // new max width zdialog_fetch(zd,"maxhh",maxhh); // new max height zdialog_fetch(zd,"downsize",Fdownsize); // downsize checkbox zdialog_fetch(zd,"upsize",Fupsize); // upsize checkbox zdialog_fetch(zd,"jpgqual",jpeg_quality); // jpeg quality zdialog_fetch(zd,"delete",Fdelete); // delete originals zdialog_fetch(zd,"copymeta",Fcopymeta); // copy metadata zdialog_fetch(zd,"upalbums",Fupalbums); // update albums 25.1 zdialog_fetch(zd,"sametype",Fsametype); zdialog_fetch(zd,"jpg",ii); if (ii) strcpy(newext,".jpg"); zdialog_fetch(zd,"tif",ii); if (ii) strcpy(newext,".tif"); zdialog_fetch(zd,"png",ii); if (ii) strcpy(newext,".png"); zdialog_fetch(zd,"jxl",ii); // jxl if (ii) strcpy(newext,".jxl"); zdialog_fetch(zd,"samebpc",Fsamebpc); zdialog_fetch(zd,"8-bit",ii); if (ii) newbpc = 8; zdialog_fetch(zd,"16-bit",ii); if (ii) newbpc = 16; if (! SFcount) { zmessageACK(Mwin,TX("no files selected")); return 1; } Fnewtext = 0; if (*text1) Fnewtext = 1; // replace text1 with text2 (may be null) Fplugdate = Fplugseq = Fplugname = 0; strTrim2(newname); if (! blank_null(newname)) { if (Fnewtext) { zmessageACK(Mwin,TX("you cannot use new name and replace text together")); return 1; } pp = newname; while ((pp = strchr(pp,'$'))) { if (strmatchN(pp,"$yyyy",5)) Fplugdate = 1; // $yyyy else if (strmatchN(pp,"$mm",3)) Fplugdate = 1; // $mm else if (strmatchN(pp,"$dd",3)) Fplugdate = 1; // $dd else if (strmatchN(pp,"$s",2)) Fplugseq = 1; // $s...s (sequence number cc) else if (strmatchN(pp,"$oldname",8)) Fplugname = 1; // $oldname else { for (cc = 0; pp[cc] > ' ' && cc < 20; cc++); strncpy0(badplug,pp,cc); zmessageACK(Mwin,TX("invalid plugin: %s"),badplug); return 1; } pp++; } } if (! blank_null(newname) && ! Fplugname && ! Fplugseq) { zmessageACK(Mwin,TX("you must use either $s or $oldname")); return 1; } if (Fplugseq && (baseseq < 1 || addseq < 1)) { zmessageACK(Mwin,TX("$s plugin needs base and adder")); return 1; } if (! Fplugseq && (baseseq > 0 || addseq > 0)) { zmessageACK(Mwin,TX("base and adder need $s plugin")); return 1; } strTrim2(newloc); // check location if (! blank_null(newloc)) { cc = strlen(newloc) - 1; if (newloc[cc] == '/') newloc[cc] = 0; // remove trailing '/' err = check_create_dir(newloc); // create if needed if (err) return 1; } if (Fdownsize || Fupsize) { // downsize and/or upsize wanted, if (maxww < 20 || maxhh < 20 // check max. width and height values || maxww > wwhh_limit1 || maxhh > wwhh_limit1 || maxww * maxhh > wwhh_limit2) { zmessageACK(Mwin,TX("max. width or height is not reasonable")); return 1; } } *Arescale = 0; zdialog_fetch(zd,"rs-1/4",Frescale); // get rescale option 25.1 if (Frescale) strcpy(Arescale,"1/4"); zdialog_fetch(zd,"rs-1/3",Frescale); if (Frescale) strcpy(Arescale,"1/3"); zdialog_fetch(zd,"rs-1/2",Frescale); if (Frescale) strcpy(Arescale,"1/2"); zdialog_fetch(zd,"rs-2/3",Frescale); if (Frescale) strcpy(Arescale,"2/3"); zdialog_fetch(zd,"rs-1.0",Frescale); if (Frescale) strcpy(Arescale,"1.0"); zdialog_fetch(zd,"rs-1.4",Frescale); if (Frescale) strcpy(Arescale,"1.4"); zdialog_fetch(zd,"rs-2.0",Frescale); if (Frescale) strcpy(Arescale,"2.0"); if (strmatch(Arescale,"1.0")) *Arescale = 0; // rescale 1.0 --> no rescale 25.1 if (*newname <= ' ' && *newloc <= ' ' && Fsametype) Freplace = 1; // if no new name or location, else Freplace = 0; // assume input file is replaced if (Freplace && Fdelete) { zmessageACK(Mwin,TX("delete originals specified but no new name given")); return 1; } /** Convert NN image files CF Replace text: xxxx --> yyyy RT Rename to xxxxxxx RN Convert to .ext N-bits/color CX CXa Downsize within NNxNN DZ Upsize within NNxNN DZa Rescale to N.Nx RS // 25.1 Output to /.../... OP Copy Metadata CM Update Albums UA *** Delete Originals *** DO *** Replace Originals *** RO PROCEED? PR **/ ch messCF[100], messRN[100], messRT[400], messCX[100], messCXa[100], // more room for big translations 26.0 messDZ[100], messDZa[100], messRS[100], messOP[800], messCM[140], messUA[140], messDO[100], messRO[100], messPR[80]; ch warnmess[1000]; *messCF = *messRN = *messRT = *messCX = *messCXa = *messDZ = *messDZa = *messRS = *messOP = *messCM = *messUA = *messDO = *messRO = *messPR = 0; snprintf(messCF,100,TX("Convert %d image files"),SFcount); if (Fnewtext) snprintf(messRT,400,TX("\n Replace text: %s --> %s"),text1,text2); if (*newname) snprintf(messRN,100,TX("\n Rename to %s"),newname); if (! Fsametype) snprintf(messCX,100,TX("\n Convert to %s"),newext); if (! Fsamebpc) snprintf(messCXa,100,TX("\n %d-bits/color"),newbpc); if (Fdownsize) snprintf(messDZ,100,TX("\n Downsize within %dx%d"),maxww,maxhh); if (Fupsize) snprintf(messDZa,100,TX("\n Upsize within %dx%d"),maxww,maxhh); if (*Arescale) snprintf(messRS,100,TX("\n Rescale to %sx"),Arescale); if (*newloc) snprintf(messOP,800,TX("\n Output to %s"),newloc); if (Fcopymeta) { strncpy0(messCM,TX("\n Copy Metadata"),140); } if (Fupalbums) { strncpy0(messUA,TX("\n Update Albums"),140); } if (Fdelete) strncpy0(messDO,TX("\n *** Delete Originals ***"),100); if (Freplace) strncpy0(messRO,TX("\n *** Replace Originals ***"),100); strncpy0(messPR,TX("\n\nPROCEED?"),80); snprintf(warnmess,1000,"%s %s %s %s %s %s %s %s %s %s %s %s %s %s", messCF, messRT, messRN, messCX, messCXa, messDZ, messDZa, messRS, messOP, messCM, messUA, messDO, messRO, messPR); yn = zmessageYN(Mwin,warnmess); if (! yn) return 1; zd->zstat = 1; // [proceed] return 1; } /**************************************************************************************/ // Move selected files to a new location (Fotocx indexed) namespace batch_copy_move_names { ch newloc[XFCC]; // destination folder int Fdelete; // delete originals } // menu function void m_batch_copy_move(GtkWidget *, ch *) { using namespace batch_copy_move_names; int batch_copy_move_dialog_event(zdialog *zd, ch *event); zdialog *zd, *zdpop; int ii, cc, err; int zstat; ch *pp, text[100]; ch *infile, *outfile; ch **oldfiles, **newfiles; int Noldnew; F1_help_topic = TX("BATCH COPY/MOVE"); printf("m_batch_copy_move \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("batch copy/move")) return; /*** ___________________________________________________________ | Batch Copy/Move | | | | [Select Files] N files selected | | | | New Location [_______________________________] [browse] | | | | [x] Delete Originals | | | | [Proceed] [X] | |___________________________________________________________| ***/ zd = zdialog_new(TX("Batch Copy/Move"),Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbf","dialog",0,"space=5"); zdialog_add_widget(zd,"button","files","hbf",TX("Select Files"),"space=5"); zdialog_add_widget(zd,"label","fcount","hbf",TX("no files selected"),"space=10"); zdialog_add_widget(zd,"hbox","hbloc","dialog"); zdialog_add_widget(zd,"label","labloc","hbloc",TX("New Location"),"space=5"); zdialog_add_widget(zd,"zentry","newloc","hbloc",0,"expand"); zdialog_add_widget(zd,"button","browse","hbloc",TX("Browse"),"space=5"); zdialog_add_widget(zd,"hbox","hbdel","dialog"); zdialog_add_widget(zd,"check","delete","hbdel",TX("Delete Originals"),"space=3"); snprintf(text,100,TX("%d image files selected"),SFcount); // show selected files count zdialog_stuff(zd,"fcount",text); zdialog_stuff(zd,"delete",0); // delete originals - no *newloc = 0; // no new location oldfiles = newfiles = 0; // list of old/new files Noldnew = 0; // for album updates zdialog_load_inputs(zd); // preload prior user inputs zdialog_run(zd,batch_copy_move_dialog_event,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for completion zdialog_free(zd); if (zstat != 1) goto cleanup; // canceled if (! SFcount) goto cleanup; // no files selected free_resources(); // no curr. file if (Fdelete) { cc = SFcount * sizeof(ch *); // input files are to be deleted: oldfiles = (ch **) zmalloc(cc,"batch copy/move"); // reserve space to hold list of newfiles = (ch **) zmalloc(cc,"batch copy/move"); // old/new filespecs to update albums } cc = strlen(newloc); // output location if (newloc[cc-1] == '/') newloc[cc-1] = 0; // remove trailing '/' zdpop = popup_report_open(TX("Processing files"),Mwin,600,300,0,0,0,"X",null); // log report Fbusy(+1); for (ii = 0; ii < SFcount; ii++) // loop selected files { zmainloop(); // keep GTK alive if (! zdialog_valid(zdpop)) break; // report canceled infile = SelFiles[ii]; // input file popup_report_write2(zdpop,0,"\n"); popup_report_write2(zdpop,0,"%s \n",infile); // log each input file if (image_file_type(infile) != IMAGE) { popup_report_write2(zdpop,0,TX("*** invalid file \n")); continue; } pp = strrchr(infile,'/'); // /filename.ext cc = strlen(newloc) + strlen(pp) + 2; outfile = (ch *) zmalloc(cc,"batch copy/move"); strcpy(outfile,newloc); // /newloc/.../filename.ext strcat(outfile,pp); popup_report_write2(zdpop,0,"%s \n",outfile); // log each output file if (regfile(outfile)) { // check if file exists in new location popup_report_write2(zdpop,1,"%s \n",TX("output file exists")); zfree(outfile); continue; } err = cp_copy(infile,outfile); // copy infile to outfile if (err) { popup_report_write2(zdpop,1,"%s \n",strerror(err)); // error, do nothing zfree(outfile); continue; } if (Fdelete) // delete input file { err = f_remove(infile,"delete"); // file/index/thumb/gallery oldfiles[Noldnew] = zstrdup(infile,"batch copy/move"); // mark for updating albums newfiles[Noldnew] = zstrdup(outfile,"batch copy/move"); Noldnew++; } zfree(outfile); } if (! zdialog_valid(zdpop)) popup_report_write2(zdpop,0,TX("\n *** CANCELED \n")); else popup_report_write2(zdpop,0,TX("\n *** COMPLETED \n")); popup_report_bottom(zdpop); Fbusy(-1); index_rebuild(2,0); // update index and thumbnails 25.1 if (Noldnew) { // update albums for renamed/moved files popup_report_write2(zdpop,0,TX("updating albums ...\n")); album_purge_replace("ALL",Noldnew,oldfiles,newfiles); } cleanup: Fblock(0); if (Noldnew) { // free memory for (ii = 0; ii < Noldnew; ii++) { zfree(oldfiles[ii]); zfree(newfiles[ii]); } if (oldfiles) zfree(oldfiles); if (newfiles) zfree(newfiles); Noldnew = 0; } if (*newloc) gallery(newloc,"init",0); // refresh file list 25.1 else gallery(0,"init",0); gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); // repaint from same position viewmode('G'); return; } // dialog event and completion callback function int batch_copy_move_dialog_event(zdialog *zd, ch *event) { using namespace batch_copy_move_names; ch countmess[80]; ch *ploc; int cc, yn, err; if (strmatch(event,"files")) // select images to convert { zdialog_show(zd,0); // hide parent dialog select_files(0); // get list of files to copy zdialog_show(zd,1); snprintf(countmess,80,TX("%d image files selected"),SFcount); // update dialog zdialog_stuff(zd,"fcount",countmess); } if (strmatch(event,"browse")) { zdialog_fetch(zd,"newloc",newloc,XFCC); ploc = zgetfile(TX("Select folder"),MWIN,"folder",newloc); // new location browse if (! ploc) return 1; zdialog_stuff(zd,"newloc",ploc); zfree(ploc); } if (zd->zstat != 1) return 1; // not [proceed] // proceed with copy or move zd->zstat = 0; // keep active until inputs OK if (! SFcount) { zmessageACK(Mwin,TX("no files selected")); return 1; } zdialog_fetch(zd,"newloc",newloc,XFCC); zdialog_fetch(zd,"delete",Fdelete); // delete originals strTrim2(newloc); // check location cc = strlen(newloc) - 1; if (newloc[cc] == '/') newloc[cc] = 0; // remove trailing '/' err = check_create_dir(newloc); // create if needed if (err) return 1; ch mess0[100], mess1[800], mess2[100], mess3[100]; // enlarge for translations 26.0 ch warnmess[1000]; *mess0 = *mess1 = *mess2 = *mess3 = 0; if (Fdelete) { // clarified text 26.0 snprintf(mess0,100,TX("Move %d image files"),SFcount); snprintf(mess1,800,TX("\n New Location: %s"),newloc); strncpy0(mess2,TX("\n *** Delete Originals ***"),100); strncpy0(mess3,TX("\n PROCEED?"),100); } else { snprintf(mess0,100,TX("Copy %d image files"),SFcount); snprintf(mess1,800,TX("\n New Location: %s"),newloc); strncpy0(mess2,TX("\n *** Keep Originals ***"),100); strncpy0(mess3,TX("\n PROCEED?"),100); } snprintf(warnmess,1000,"%s %s %s %s",mess0,mess1,mess2,mess3); yn = zmessageYN(Mwin,warnmess); if (! yn) return 1; zd->zstat = 1; // [proceed] return 1; } /**************************************************************************************/ // Batch upright image files. // Look for files rotated 90˚ (according to metadata) and upright them. int Fbupall; void m_batch_upright(GtkWidget *, ch *) { int batch_upright_dialog_event(zdialog *zd, ch *event); zdialog *zd, *zdpop; int zstat; ch *infile, *newfile, *delfile; ch *pp, *ppv[1], text[100]; int ii, err, yn; int Fcount, fwarn; int angle, mirror; ch *metatag[1] = { meta_orientation_tag }; ch orient; F1_help_topic = TX("BATCH UPRIGHT"); printf("m_batch_upright \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("batch upright")) return; /*** ___________________________________ | Batch Upright | | | | [Select Files] N files selected | | [x] Survey all files | | | | [Proceed] [X] | |___________________________________| ***/ Fbupall = 0; zd = zdialog_new("Batch Upright",Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbf","dialog",0,"space=5"); zdialog_add_widget(zd,"button","files","hbf",TX("Select Files"),"space=5"); zdialog_add_widget(zd,"label","fcount","hbf",TX("no files selected"),"space=10"); zdialog_add_widget(zd,"hbox","hbaf","dialog"); zdialog_add_widget(zd,"check","allfiles","hbaf",TX("Survey all files"),"space=5"); snprintf(text,100,TX("%d image files selected"),SFcount); // show selected files count zdialog_stuff(zd,"fcount",text); zdialog_run(zd,batch_upright_dialog_event,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for completion zdialog_free(zd); if (zstat != 1) goto cleanup; // canceled if (! Fbupall && ! SFcount) goto cleanup; // nothing selected free_resources(); // no curr. file fwarn = 0; if (Fbupall) // "survey all files" selected { for (ii = 0; ii < Nxxrec; ii++) { pp = strrchr(xxrec_tab[ii]->file,'.'); if (pp && strcasestr(".jp2 .heic .avif .webp",pp)) break; } if (ii < Nxxrec) fwarn = 1; } else if (SFcount) { for (ii = 0; ii < SFcount; ii++) { pp = strrchr(SelFiles[ii],'.'); if (pp && strcasestr(".jp2 .heic .avif .webp",pp)) break; } if (ii < SFcount) fwarn = 1; } if (fwarn) { yn = zmessageYN(Mwin,TX("file types: .jp2 .heic .avif .webp \n" "will become: .jpg - CONTINUE?")); if (! yn) goto cleanup; } zdpop = popup_report_open(TX("Processing files"),Mwin,500,200,0,0,0,"X",null); // log report Fbusy(+1); if (Fbupall) Fcount = Nxxrec; else Fcount = SFcount; for (ii = 0; ii < Fcount; ii++) { zmainloop(); // keep GTK alive if (! zdialog_valid(zdpop)) break; // report canceled if (Fbupall) infile = xxrec_tab[ii]->file; else infile = SelFiles[ii]; popup_report_write2(zdpop,0,"%s \n",infile); // log each input file if (image_file_type(infile) != IMAGE) { popup_report_write2(zdpop,0,TX("*** invalid file \n")); continue; } meta_get(infile,(ch **) metatag,ppv,1); // get metadata Orientation if (! ppv[0]) continue; orient = *ppv[0]; zfree(ppv[0]); if (orient < '2' || orient > '8') continue; // not rotated angle = mirror = 0; if (orient == '2') { angle = 0; mirror = 1; } // horizontal mirror if (orient == '3') { angle = 180; mirror = 0; } // rotate 180 if (orient == '4') { angle = 0; mirror = 2; } // vertical mirror if (orient == '5') { angle = 90; mirror = 1; } // rotate 90 + horizontal mirror if (orient == '6') { angle = 90; mirror = 0; } // rotate 90 if (orient == '7') { angle = 270; mirror = 1; } // rotate 270 + horizontal mirror if (orient == '8') { angle = 270; mirror = 0; } // rotate 270 err = f_open(infile); if (err) { popup_report_write2(zdpop,0,TX("*** cannot open input file")); continue; } E0pxm = PXM_load(curr_file,0); // load poss. 16-bit image if (! E0pxm) { popup_report_write2(zdpop,0,TX("*** cannot read input file")); continue; } E3pxm = PXM_upright(E0pxm,angle,mirror); // do rotate/mirror PXM_free(E0pxm); E0pxm = E3pxm; E3pxm = 0; if (strcasestr("jp2 heic avif webp",curr_file_type)) { // save these types as .jpg newfile = zstrdup(curr_file,"batch_upright",16); delfile = zstrdup(curr_file,"batch_upright"); pp = strrchr(newfile,'.'); strcpy(pp,"-upright.jpg"); Fupright = 1; // mark uprighted (for metadata update) f_save(newfile,"jpg",8,0,1); // make .jpg duplicate f_open(newfile); // show uprighted file remove(delfile); zfree(newfile); zfree(delfile); } else { Fupright = 1; // mark uprighted (for metadata update) f_save(curr_file,curr_file_type,curr_file_bpc,0,1); // re-open file f_open(curr_file); } } Fbusy(-1); if (! zdialog_valid(zdpop)) printf("*** report canceled \n"); else popup_report_write2(zdpop,0,TX("\n *** COMPLETED \n")); popup_report_bottom(zdpop); cleanup: Fblock(0); gallery(0,"init",0); // refresh gallery 25.1 gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); // repaint from same position viewmode('G'); return; } // dialog event and completion callback function int batch_upright_dialog_event(zdialog *zd, ch *event) { ch countmess[80]; if (strmatch(event,"files")) // select images to convert { zdialog_show(zd,0); // hide parent dialog select_files(0); // get new list zdialog_show(zd,1); snprintf(countmess,80,TX("%d image files selected"),SFcount); // update dialog zdialog_stuff(zd,"fcount",countmess); zdialog_stuff(zd,"allfiles",0); if (! SFcount) return 1; } if (zd->zstat != 1) return 1; // wait for [proceed] zdialog_fetch(zd,"allfiles",Fbupall); // get "survey all" option if (! Fbupall && ! SFcount) { // nothing selected zmessageACK(Mwin,TX("no files selected")); zd->zstat = 0; // keep dialog active } if (Fbupall && SFcount) { zmessageACK(Mwin,TX("both 'All Files' and specific files were selected")); zd->zstat = 0; } return 1; } /**************************************************************************************/ // Batch delete or trash image files. int bdt_option; // 1/2 = delete/trash void m_batch_deltrash(GtkWidget *, ch *) { int batch_deltrash_dialog_event(zdialog *zd, ch *event); zdialog *zd, *zdpop; int zstat, nn, err; ch *file, text[100]; int ii; F1_help_topic = TX("BATCH DELETE/TRASH"); printf("m_batch_deltrash \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("batch delete/trash")) return; /*** ___________________________________ | Batch Delete/Trash | | | | [Select Files] N files selected | | (o) delete (o) trash | | | | [Proceed] [X] | |___________________________________| ***/ zd = zdialog_new(TX("Batch Delete/Trash"),Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbf","dialog",0,"space=5"); zdialog_add_widget(zd,"button","files","hbf",TX("Select Files"),"space=5"); zdialog_add_widget(zd,"label","fcount","hbf",TX("no files selected"),"space=10"); zdialog_add_widget(zd,"hbox","hbdt","dialog"); zdialog_add_widget(zd,"label","labdel","hbdt",TX("delete"),"space=5"); zdialog_add_widget(zd,"radio","delete","hbdt",0); zdialog_add_widget(zd,"label","space","hbdt",0,"space=10"); zdialog_add_widget(zd,"label","labtrash","hbdt",TX("trash"),"space=5"); zdialog_add_widget(zd,"radio","trash","hbdt",0); bdt_option = 2; snprintf(text,100,TX("%d image files selected"),SFcount); // show selected files count zdialog_stuff(zd,"fcount",text); zdialog_stuff(zd,"delete",0); zdialog_stuff(zd,"trash",1); zdialog_run(zd,batch_deltrash_dialog_event,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for completion zdialog_fetch(zd,"delete",bdt_option); // get delete/trash option if (! bdt_option) bdt_option = 2; zdialog_free(zd); if (zstat != 1) goto finish; // canceled if (! SFcount) goto finish; free_resources(); // no curr. file zdpop = popup_report_open(TX("Processing files"),Mwin,500,200,0,0,0,"X",null); // log report Fbusy(+1); for (ii = 0; ii < SFcount; ii++) // loop selected files { zmainloop(); // keep GTK alive if (! zdialog_valid(zdpop)) break; // report canceled file = SelFiles[ii]; // log each file popup_report_write2(zdpop,0,"%s \n",file); if (! regfile(file)) { // file exists? popup_report_write2(zdpop,1,TX("file not found \n")); continue; } err = 0; if (bdt_option == 1) // delete file err = f_remove(file,"delete"); // file/index/thumb/gallery if (bdt_option == 2) // move file to trash err = f_remove(file,"trash"); if (err) { popup_report_write2(zdpop,1,TX("move to trash failed \n")); // gnome trash failed nn = zdialog_choose(Mwin,"parent",TX("continue?"),TX("Yes"),TX("Quit"),null); if (nn == 2) { // quit zdpop->zstat = 1; break; } } album_purge_replace("ALL",file,0); // remove from albums 25.1 } Fbusy(-1); if (! zdialog_valid(zdpop)) printf("*** report canceled \n"); else popup_report_write2(zdpop,0,TX("\n *** COMPLETED \n")); popup_report_bottom(zdpop); index_rebuild(2,0); // update index and thumbnails 25.1 finish: Fblock(0); gallery(0,"init",0); // refresh gallery 25.1 gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); // repaint from same position viewmode('G'); return; } // dialog event and completion callback function int batch_deltrash_dialog_event(zdialog *zd, ch *event) { ch countmess[80]; int ii; if (strmatch(event,"files")) // select images to convert { zdialog_show(zd,0); // hide parent dialog select_files(0); // get files zdialog_show(zd,1); snprintf(countmess,80,TX("%d image files selected"),SFcount); // update dialog zdialog_stuff(zd,"fcount",countmess); } if (strmatch(event,"delete")) { // delete radio button zdialog_fetch(zd,"delete",ii); if (ii) bdt_option = 1; zdialog_stuff(zd,"trash",0); } if (strmatch(event,"trash")) { // trash radio button zdialog_fetch(zd,"trash",ii); if (ii) bdt_option = 2; zdialog_stuff(zd,"delete",0); } if (zd->zstat != 1) return 1; // wait for [proceed] if (! SFcount) { // nothing selected zmessageACK(Mwin,TX("no files selected")); zd->zstat = 0; // keep dialog active } return 1; } /**************************************************************************************/ // Add a small image file over selected host files (for author, copyright, etc.). // Added image position is designated % from host image top and left. // Added image width is designated % of host image width. // Added image can have transparency. namespace batch_overlay { ch *ovfile = 0; // overlay image file PXB *ovfilepxb = 0; // overlay file PXB int pcttop, pctleft; // overlay position, % from top, % from left, 1-99 int pctwidth; // overlay width, % host image width, 5-95 int Fwinadj; // flag, adjust overlay width for window size int winww, winhh; // window size (current or user input) int Frepl, Fvers; // flags, replace host files or make new versions }; // menu function void m_batch_overlay(GtkWidget *, ch *) { using namespace batch_overlay; int batch_overlay_dialog_event(zdialog *zd, ch *event); zdialog *zd, *zdpop; int zstat; ch *infile = 0, *outfile = 0; ch text[100], *pp; int ii, err; PXM *infilepxm = 0; PXB *ovpxb = 0; int ovww, ovhh; int ovorgx, ovorgy; int px1, py1, px2, py2; uint8 *pix1; float *pix2; float f1, f2; float winAR, infileAR; // window and host image ww/hh ratios F1_help_topic = TX("BATCH OVERLAY"); printf("m_batch_overlay \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("batch overlay")) return; /*** __________________________________________________ | Batch Overlay Image | | | | [Select host image files] no files selected | button: hostselect | [Select overlay file] no file selected | button: ovselect | - - - - - - - - - - - - - - - - - - - - - - - - | | Overlay position in host image: | | % from top: [__] % from left: [__] | zspin: pcttop pctleft | - - - - - - - - - - - - - - - - - - - - - - - - | | Overlay width, % host image width: [__] | zspin: pctwidth | [x] Make width constant for window size: | check: Fwinadj | width [____] height [____] [_] refresh] | zspin: winww, winhh zbutton: refresh | - - - - - - - - - - - - - - - - - - - - - - - - | | [x] Replace host files [x] Make new versions | check: Frepl check: Fvers | | | [Proceed] [X] | |__________________________________________________| ***/ zd = zdialog_new("Batch Overlay",Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbhf","dialog",0,"space=2"); zdialog_add_widget(zd,"button","hostselect","hbhf",TX("Select host image files"),"space=5"); zdialog_add_widget(zd,"label","hostcount","hbhf",TX("no files selected"),"space=10"); zdialog_add_widget(zd,"hbox","hbovf","dialog",0,"space=2"); zdialog_add_widget(zd,"button","ovselect","hbovf",TX("Select overlay file"),"space=5"); zdialog_add_widget(zd,"label","ovfile","hbovf",TX("no file selected"),"space=10"); zdialog_add_widget(zd,"hsep","hsep1","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbpos1","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labpos1","hbpos1",TX("Overlay position in host image:"),"space=5"); zdialog_add_widget(zd,"hbox","hbpos2","dialog",0,"space=1"); zdialog_add_widget(zd,"label","space","hbpos2","","space=10"); zdialog_add_widget(zd,"label","labtop","hbpos2",TX("% from top:"),"space=2"); zdialog_add_widget(zd,"zspin","pcttop","hbpos2","1|99|1|99","space=2"); zdialog_add_widget(zd,"label","space","hbpos2","","space=10"); zdialog_add_widget(zd,"label","lableft","hbpos2",TX("% from left:"),"space=2"); zdialog_add_widget(zd,"zspin","pctleft","hbpos2","1|99|1|99","space=2"); zdialog_add_widget(zd,"hsep","hsep2","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbwidth1","dialog"); zdialog_add_widget(zd,"label","labwidth1","hbwidth1",TX("Overlay width, % host image width:"),"space=5"); zdialog_add_widget(zd,"zspin","pctwidth","hbwidth1","5|95|1|20","space=2"); zdialog_add_widget(zd,"hbox","hbwidth2","dialog"); zdialog_add_widget(zd,"check","Fwinadj","hbwidth2",TX("Make width constant for window size"),"space=6"); zdialog_add_widget(zd,"hbox","hbwidth3","dialog"); zdialog_add_widget(zd,"label","space","hbwidth3","","space=10"); zdialog_add_widget(zd,"label","labwinww","hbwidth3",TX("width"),"space=2"); zdialog_add_widget(zd,"zspin","winww","hbwidth3","100|9999|1|2000","space=2"); zdialog_add_widget(zd,"label","space","hbwidth3","","space=10"); zdialog_add_widget(zd,"label","labwinhh","hbwidth3",TX("height"),"space=2"); zdialog_add_widget(zd,"zspin","winhh","hbwidth3","100|9999|1|1000","space=2"); zdialog_add_widget(zd,"zbutton","refresh","hbwidth3",TX("refresh"),"space=15"); zdialog_add_ttip(zd,"refresh",TX("set current window size")); zdialog_add_widget(zd,"hsep","hsep3","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbrepl","dialog",0,"space=1"); zdialog_add_widget(zd,"check","Frepl","hbrepl",TX("Replace host files"),"space=6"); zdialog_add_widget(zd,"check","Fvers","hbrepl",TX("Make new versions"),"space=6"); if (SFcount) { snprintf(text,100,TX("%d image files selected"),SFcount); // show selected files count zdialog_stuff(zd,"hostcount",text); } if (ovfile) { // show overlay file if known pp = strrchr(ovfile,'/'); zdialog_stuff(zd,"ovfile",pp+1); } pctwidth = 20; // match dialog defaults pcttop = 99; pctleft = 99; Fwinadj = 0; gtk_window_get_size(MWIN,&winww,&winhh); zdialog_stuff(zd,"winww",winww); // default window = current size zdialog_stuff(zd,"winhh",winhh); Frepl = 0; Fvers = 1; // default new version zdialog_stuff(zd,"Frepl",Frepl); zdialog_stuff(zd,"Fvers",Fvers); if (ovfile && ! ovfilepxb) ovfilepxb = PXB_load(ovfile,1); zdialog_run(zd,batch_overlay_dialog_event,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for completion zdialog_free(zd); if (zstat != 1) { // canceled printf("*** canceled \n"); Fblock(0); return; } free_resources(); // no current file zdpop = popup_report_open(TX("Processing files"),Mwin,600,300,0,0,0,"X",null); // log report Fbusy(+1); for (ii = 0; ii < SFcount; ii++) // loop selected files { zmainloop(); // keep GTK alive if (outfile) zfree(outfile); outfile = 0; if (infilepxm) PXM_free(infilepxm); infilepxm = 0; if (! zdialog_valid(zdpop)) break; // report canceled infile = SelFiles[ii]; // input file if (image_file_type(infile) != IMAGE) { popup_report_write2(zdpop,0,TX("*** invalid file \n")); continue; } popup_report_write2(zdpop,0,"\n"); popup_report_write2(zdpop,0,"%s \n",infile); // log each input file outfile = f_realpath(infile); // outfile = infile if (! outfile) { popup_report_write2(zdpop,0,TX("*** cannot get real path of input file \n")); continue; } if (Fvers) { pp = file_new_version(outfile); // outfile is new version zfree(outfile); outfile = pp; if (! outfile) { popup_report_write2(zdpop,0,TX("*** cannot make new version of input file \n")); continue; } } infilepxm = PXM_load(infile,0); // load input host file if (! infilepxm) { popup_report_write2(zdpop,0,TX("*** cannot load input file \n")); continue; } ovww = 0.01 * pctwidth * infilepxm->ww + 0.5; // overlay width, % host image width if (Fwinadj) { // increase overlay width if left/right infileAR = 1.0 * infilepxm->ww / infilepxm->hh; // margins needed for 'tall' image winAR = 1.0 * winww / winhh; if (winAR > infileAR) ovww = ovww * winAR / infileAR; } if (ovww < 20) ovww = 20; // sanity limit ovhh = 1.0 * ovfilepxb->hh * ovww / ovfilepxb->ww + 0.5; // overlay image height if (ovpxb) PXB_free(ovpxb); ovpxb = PXB_rescale(ovfilepxb,ovww,ovhh); // rescale overlay image ovorgx = 0.01 * pctleft * (infilepxm->ww - ovww); // overlay posn from host image left edge ovorgy = 0.01 * pcttop * (infilepxm->hh - ovhh); // overlay posn from host image top edge for (py1 = 0; py1 < ovhh; py1++) // loop overlay image pixels for (px1 = 0; px1 < ovww; px1++) { px2 = ovorgx + px1; // corresp. host image pixel py2 = ovorgy + py1; pix1 = PXBpix(ovpxb,px1,py1); // overlay image pixel pix2 = PXMpix(infilepxm,px2,py2); // host image pixel if (ovpxb->nc == 4) f1 = pix1[3] / 256.0; // use transparency if present else f1 = 1.0; f2 = 1.0 - f1; pix2[0] = f1 * pix1[0] + f2 * pix2[0]; // copy pixel pix2[1] = f1 * pix1[1] + f2 * pix2[1]; pix2[2] = f1 * pix1[2] + f2 * pix2[2]; } err = PXM_save(infilepxm,outfile,f_load_bpc,90,0); if (err) { popup_report_write2(zdpop,0,TX("*** cannot save output file \n")); continue; } popup_report_write2(zdpop,0,TX("*** completed \n")); } Fbusy(-1); if (! zdialog_valid(zdpop)) printf("*** report canceled \n"); else popup_report_write2(zdpop,0,TX("\n *** COMPLETED \n")); popup_report_bottom(zdpop); index_rebuild(2,0); // update index and thumbnails 25.1 Fblock(0); if (outfile) zfree(outfile); outfile = 0; if (infilepxm) PXM_free(infilepxm); infilepxm = 0; if (ovfilepxb) PXB_free(ovfilepxb); ovfilepxb = 0; if (ovpxb) PXB_free(ovpxb); ovpxb = 0; gallery(0,"init",0); // refresh file list 25.1 gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); // repaint from same position viewmode('G'); return; } // dialog event and completion callback function int batch_overlay_dialog_event(zdialog *zd, ch *event) { using namespace batch_overlay; ch countmess[80]; ch *pp, *ofile; if (zd->zstat) // dialog completed { if (zd->zstat != 1) return 1; // canceled if (! SFcount) { // selected host files count zmessageACK(Mwin,TX("no host files selected")); zd->zstat = 0; return 1; } if (! ovfilepxb) { // selected overlay file zmessageACK(Mwin,TX("no overlay file selected")); zd->zstat = 0; return 1; } return 1; // finished } if (strmatch(event,"hostselect")) { zdialog_show(zd,0); // hide parent dialog select_files(0); // get list of files to convert zdialog_show(zd,1); snprintf(countmess,80,TX("%d image files selected"),SFcount); // update dialog zdialog_stuff(zd,"hostcount",countmess); } if (strmatch(event,"ovselect")) // select overlay image file { zdialog_show(zd,0); // hide main dialog if (ovfile) ofile = select_1file(ovfile); else ofile = select_1file(saved_areas_folder); zdialog_show(zd,1); gallery(0,"paint",-1); // repaint from same position if (! ofile) return 1; if (image_file_type(ofile) != IMAGE) { zmessageACK(Mwin,TX("not an image file")); return 1; } if (ovfilepxb) PXB_free(ovfilepxb); // create overlay PXB pixmap ovfilepxb = PXB_load(ofile,1); if (! ovfilepxb) return 1; if (ovfile) zfree(ovfile); // selected file --> dialog ovfile = ofile; pp = strrchr(ovfile,'/'); zdialog_stuff(zd,"ovfile",pp+1); } if (strmatch(event,"pctwidth")) // overlay width % value zdialog_fetch(zd,"pctwidth",pctwidth); if (strmatch(event,"pcttop")) // overlay position from top zdialog_fetch(zd,"pcttop",pcttop); if (strmatch(event,"pctleft")) // overlay position from left zdialog_fetch(zd,"pctleft",pctleft); if (strmatch(event,"Fwinadj")) // adjust overlay width for window zdialog_fetch(zd,"Fwinadj",Fwinadj); if (strmatch(event,"winww")) // window width zdialog_fetch(zd,"winww",winww); if (strmatch(event,"winhh")) // window height zdialog_fetch(zd,"winhh",winhh); if (strmatch(event,"refresh")) { // refresh current window size gtk_window_get_size(MWIN,&winww,&winhh); zdialog_stuff(zd,"winww",winww); // target window = current size zdialog_stuff(zd,"winhh",winhh); } if (strmatch(event,"Frepl")) { // replace host files zdialog_fetch(zd,"Frepl",Frepl); Fvers = 1 - Frepl; zdialog_stuff(zd,"Fvers",Fvers); } if (strmatch(event,"Fvers")) { // make new versions zdialog_fetch(zd,"Fvers",Fvers); Frepl = 1 - Fvers; zdialog_stuff(zd,"Frepl",Frepl); } return 1; } /**************************************************************************************/ // Export selected image files to another folder with optional downsizing. // Only the metadata relevant for web photo services is copied. namespace export_files_names { ch tolocation[XFCC]; int Fsamesize; int maxww, maxhh; int Fmeta; }; // menu function void m_export_files(GtkWidget*, ch *menu) { using namespace export_files_names; int export_files_dialog_event(zdialog *zd, ch *event); zdialog *zd, *zdpop; int ii, cc, err, ww, hh, zstat; PXM *pxmin, *pxmout; ch *infile, *outfile, *pp, text[100]; float scale, wscale, hscale; #define NK 5 ch *tagnames[NK] = { meta_pdate_tag, meta_keywords_tag, meta_copyright_tag, meta_desc_tag, meta_title_tag }; ch *tagvals[NK]; F1_help_topic = TX("EXPORT FILES"); printf("m_export_files \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("export files")) return; /*** __________________________________________________ | Export Files | | | | [Select Files] N files selected | | To Location [________________________] [Browse] | | Max. Width [____] Height [____] [x] no change | | [x] export metadata | | | | [Proceed] [X] | |__________________________________________________| ***/ zd = zdialog_new("Export Files",Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbf","dialog"); zdialog_add_widget(zd,"button","files","hbf",TX("Select Files"),"space=5"); zdialog_add_widget(zd,"label","fcount","hbf",TX("no files selected"),"space=10"); zdialog_add_widget(zd,"hbox","hbloc","dialog"); zdialog_add_widget(zd,"label","labloc","hbloc",TX("To Location"),"space=5"); zdialog_add_widget(zd,"zentry","toloc","hbloc",0,"expand"); zdialog_add_widget(zd,"button","browse","hbloc",TX("Browse"),"space=5"); zdialog_add_widget(zd,"hbox","hbwh","dialog"); zdialog_add_widget(zd,"label","labw","hbwh",TX("max. Width"),"space=5"); zdialog_add_widget(zd,"zentry","maxww","hbwh","1000","size=5"); zdialog_add_widget(zd,"label","space","hbwh",0,"space=5"); zdialog_add_widget(zd,"label","labh","hbwh",TX("Height"),"space=5"); zdialog_add_widget(zd,"zentry","maxhh","hbwh","700","size=5"); zdialog_add_widget(zd,"check","samesize","hbwh","no change","space=12"); zdialog_add_widget(zd,"hbox","hbmeta","dialog"); zdialog_add_widget(zd,"check","meta","hbmeta","export metadata"); zdialog_load_inputs(zd); // preload prior location snprintf(text,100,TX("%d image files selected"),SFcount); // show selected files count zdialog_stuff(zd,"fcount",text); zdialog_resize(zd,400,0); zdialog_run(zd,export_files_dialog_event,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for completion zdialog_free(zd); if (zstat != 1) { Fblock(0); return; } free_resources(); // no current file zdpop = popup_report_open(TX("exporting files"),Mwin,600,400,0,0,0,"X",null); // log report Fbusy(+1); for (ii = 0; ii < SFcount; ii++) // loop selected files { zmainloop(); // keep GTK awake if (! zdialog_valid(zdpop)) break; // canceled infile = SelFiles[ii]; // input filespec popup_report_write2(zdpop,0,"%s \n",infile); pp = strrchr(infile,'/'); // construct output filespec if (! pp) continue; cc = strlen(pp) + 8; outfile = zstrdup(tolocation,"export files",cc); strcat(outfile,pp); pp = strrchr(outfile,'.'); // outfile is type .jpg if (! pp) continue; strcpy(pp,".jpg"); pxmin = PXM_load(infile,0); // read input file if (! pxmin) { popup_report_write2(zdpop,1,TX("*** file type not supported \n")); zfree(outfile); continue; } ww = pxmin->ww; // input file size hh = pxmin->hh; if (Fsamesize) pxmout = pxmin; // same size, output = input else { wscale = hscale = 1.0; if (ww > maxww) wscale = 1.0 * maxww / ww; // compute new size if (hh > maxhh) hscale = 1.0 * maxhh / hh; if (wscale < hscale) scale = wscale; else scale = hscale; if (scale > 0.999) pxmout = pxmin; // no change else { ww = ww * scale; hh = hh * scale; pxmout = PXM_rescale(pxmin,ww,hh); // rescaled output file PXM_free(pxmin); // free memory } } err = PXM_JPG_save(pxmout,outfile,jpeg_def_quality); // write output file if (err) popup_report_write2(zdpop,1,TX("*** cannot create new file \n")); if (! err && Fmeta) { // optional copy metadata err = meta_get(infile,(ch **) tagnames,tagvals,NK); if (! err) { err = meta_put(outfile,(ch **) tagnames,tagvals,NK); if (err) popup_report_write2(zdpop,1,TX("*** metadata update error \n")); } } PXM_free(pxmout); zfree(outfile); } if (! zdialog_valid(zdpop)) printf("*** report canceled \n"); else popup_report_write2(zdpop,0,TX("\n *** COMPLETED \n")); popup_report_bottom(zdpop); Fbusy(-1); Fblock(0); return; } // dialog event and completion callback function int export_files_dialog_event(zdialog *zd, ch *event) { using namespace export_files_names; int cc; ch countmess[80]; ch *ploc; if (strmatch(event,"files")) // select files to export { select_files(0); // get list of files to export snprintf(countmess,80,TX("%d image files selected"),SFcount); // update dialog zdialog_stuff(zd,"fcount",countmess); } if (strmatch(event,"browse")) { zdialog_fetch(zd,"toloc",tolocation,XFCC); ploc = zgetfile(TX("Select folder"),MWIN,"folder",tolocation); // new location browse if (! ploc) return 1; zdialog_stuff(zd,"toloc",ploc); zfree(ploc); } if (! zd->zstat) return 1; // wait for dialog completion if (zd->zstat != 1) return 1; // canceled if (! SFcount) { // [proceed] zmessageACK(Mwin,TX("no files selected")); // no files selected zd->zstat = 0; // keep dialog active return 1; } zdialog_fetch(zd,"toloc",tolocation,XFCC); // get output location if (! dirfile(tolocation)) { zmessageACK(Mwin,TX("location is not a folder")); zd->zstat = 0; } cc = strlen(tolocation) - 1; // remove trailing '/' if present if (tolocation[cc] == '/') tolocation[cc] = 0; zdialog_fetch(zd,"samesize",Fsamesize); // get rescale options zdialog_fetch(zd,"maxww",maxww); zdialog_fetch(zd,"maxhh",maxhh); zdialog_fetch(zd,"meta",Fmeta); // metadata option return 1; } fotocx/fotocx.desktop0000664000175000017500000000041115247006660013721 0ustar micomico[Desktop Entry] Name=fotocx GenericName=Photo Editor Comment=Edit photos and manage collection Categories=Graphics;Photography;GTK; Type=Application Terminal=false MimeType=image/gif;image/tiff;image/jpeg;image/jxl;image/png;image/webp; Exec=fotocx %f Icon=fotocx fotocx/f.file.cc0000664000175000017500000050505115247006660012510 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit - file menu and file functions m_new_session start a new parallel session of Fotocx m_open_file file open dialog m_cycle2files cycle 2 previous image files m_cycle3files cycle 3 previous image files m_view360 view a 360 degree panorama image m_rename rename current image file or clicked thumbnail f_open open and display an image file f_open_saved open the last image file saved f_remove remove file and fix index, gallery, thumbs, albums f_preload preload image files ahead of need x_prev_next open prev/next file in current or prev/next gallery m_prev menu/mouse function - open previous m_next menu/mouse function - open next m_prev_next menu button function - open previous or next file m_zoom_menu menu button function - zoom image/thumb (F/G view) m_blank_image create a new monocolor image create_blank_file callable function to create a new monocolor image m_copy_move copy or move an image file to a new location m_copyto_desktop copy an image file to the desktop m_copyto_clip copy clicked file or current file to the clipboard m_delete_trash delete or trash an image file m_wallpaper set current image file as wallpaper set_wallpaper set wallpaper from given file m_print_image print an image file m_print_calibrated print an image file with calibrated colors m_calibrate_printer printer color calibration tool m_quit menu quit quitxx callable quit m_uninstall uninstall fotocx m_help help menu: user guide, change log, about m_file_save save a (modified) image file to disk m_file_save_replace save file (replace) for KB shortcut m_file_save_version save file (new version) for KB shortcut f_save save an image file to disk (replace, new version, new file) f_save_as dialog to save an image file with a designated file name f_realpath get real path for filename having symlinks file_rootname get root file name /.../filename file_basename get base file name /.../filename.ext file_all_versions get base file and all versions /.../filename.vNN.ext file_new_version get next available version /.../filename.vNN.ext file_newest_version get newest file version or base file name if none file_prior_version get prior version or base file name for given file find_imagefiles find all image files under a given folder path regfile test if file exists, is regular file dirfile test if file exists, is a directory/folder hasperm test if file exists, has read or write permission set_permissions dialog to show and set file permissions conv_permissions conv. permission formats: external <> mode_t ***************************************************************************************/ #define EX extern // disable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) using namespace zfuncs; /**************************************************************************************/ // start a new parallel session of fotocx // new window is slightly down and right from old window // args = optional command line args // current file is appended if it exists void m_new_session(GtkWidget *, ch *) { ch *pp; int cc; F1_help_topic = TX("NEW SESSION"); printf("m_new_session \n"); if (curr_file) { cc = strlen(curr_file); pp = (ch *) zmalloc(cc+100,"new-session"); repl_1str(curr_file,pp+1,cc+99,"\"","\\\""); // replace embedded " with \" pp[0] = '"'; cc = strlen(pp); // add " at both ends pp[cc] = '"'; pp[cc+1] = 0; new_session(pp); zfree(pp); } else new_session(0); return; } // callable new session function void new_session(ch *args) { int cc, xx, yy, ww, hh; ch progexe[300]; // do before new session: zdialog_inputs("save"); // save dialog inputs zdialog_geometry("save"); // save dialogs position/size gallery_memory("save"); // save recent gallery positions save_params(); // save state for next session gtk_window_get_position(MWIN,&xx,&yy); // get window position and size gtk_window_get_size(MWIN,&ww,&hh); xx += 100; // shift down and right yy += 100; cc = readlink("/proc/self/exe",progexe,300); // get own program path if (cc <= 0) { zmessageACK(Mwin,"cannot get /proc/self/exe"); return; } progexe[cc] = 0; if (! args) args = ""; zshell("log ack","%s -clone %d %d %d %d %s &",progexe,xx,yy,ww,hh,args); // 26.8 return; } /**************************************************************************************/ // find and open an image file using a file open dialog void m_open_file(GtkWidget *, ch *) { int err; F1_help_topic = TX("OPEN IMAGE FILE"); printf("m_open_file \n"); err = f_open(0); if (err) return; viewmode('F'); // file view mode return; } /**************************************************************************************/ // open the previous file opened (not the same as toolbar [prev] button) // repeated use will alternate the two most recent files void m_cycle2files(GtkWidget *, ch *) { FILE *fid; ch *file, buff[XFCC]; int Nth = 0, err; float gzoom; F1_help_topic = TX("CYCLE 2 FILES"); printf("m_cycle2files \n"); viewmode('F'); if (! Cstate) return; gzoom = Cstate->fzoom; fid = fopen(recentfiles_file,"r"); if (! fid) return; file = fgets_trim(buff,XFCC,fid,1); // skip over first most recent file while (true) { file = fgets_trim(buff,XFCC,fid,1); // find next most recent file if (! file) break; err = f_open(file,Nth,0,0,0); if (! err) break; } fclose(fid); Cstate->fzoom = gzoom; // keep same image scale Fpaint2(); return; } /**************************************************************************************/ // open the 2nd previous file opened // repeated use will alternate the 3 most recent files void m_cycle3files(GtkWidget *, ch *) { FILE *fid; ch *file, buff[XFCC]; int Nth = 0, err; float gzoom; F1_help_topic = TX("CYCLE 3 FILES"); printf("m_cycle3files \n"); viewmode('F'); if (! Cstate) return; gzoom = Cstate->fzoom; fid = fopen(recentfiles_file,"r"); if (! fid) return; file = fgets_trim(buff,XFCC,fid,1); // skip over 2 most recent files file = fgets_trim(buff,XFCC,fid,1); while (true) { file = fgets_trim(buff,XFCC,fid,1); // find next most recent file if (! file) break; err = f_open(file,Nth,0,0,0); if (! err) break; } fclose(fid); Cstate->fzoom = gzoom; // keep same image scale Fpaint2(); return; } /**************************************************************************************/ // view a 360 degree panorama image // center of view direction can be any angle 0-360 degrees // image width is assumed to correspond to a 360 degree view namespace view360 { void show(); void * show_thread(void *arg); void mousefunc(); void KB_func(int key); void quit(); PXB *filepxb, *viewpxb; PIXBUF *viewpixbuf; ch *filename = 0; int Frecalc; int fww, fhh; // file dimensions int dww, dhh; // window dimensions int pdww, pdhh; int cx, cy; float *Fx, *Fy, zoom; zdialog *zd; } // menu function void m_view360(GtkWidget *, ch *) { using namespace view360; F1_help_topic = TX("VIEW 360° PANO"); printf("m_view360 \n"); if (clicked_file) { // use clicked file if present filename = clicked_file; clicked_file = 0; } else if (curr_file) // else use current file filename = zstrdup(curr_file,"view360"); else return; filepxb = PXB_load(filename,1); zfree(filename); if (! filepxb) return; zd = zmessage_post(Mwin,"5/5",10, TX("Mouse drag: pan image 360° \n" "L/R mouse click: zoom in/out \n" "Escape: quit panorama view")); Vmenu_block(1); // block menus Fview360 = 1; // flag for main window KBpress() fww = filepxb->ww; fhh = filepxb->hh; cx = fww/2; // initial view center = middle cy = fhh/2; zoom = 1.0; // initial zoom Fx = Fy = 0; // no allocated constants pdww = pdhh = 0; Frecalc = 1; viewmode('F'); gdk_window_freeze_updates(Fgdkwin); takeMouse(mousefunc,0); show(); return; } // show current view region on window void view360::show() { using namespace view360; int ii, px, py, dx, dy; float sx, sy, R, C, Tx, Ty; static int fbusy = 0; if (! Fview360) return; dww = gdk_window_get_width(Fgdkwin); // drawing window size dhh = gdk_window_get_height(Fgdkwin); if (dww < 20 || dhh < 20) return; // too small if (fbusy++) return; // 26.5 if (dww != pdww || dhh != pdhh) { pdww = dww; pdhh = dhh; if (Fx) zfree(Fx); if (Fy) zfree(Fy); Fx = (float *) zmalloc(dww * dhh * sizeof(float),"view360"); Fy = (float *) zmalloc(dww * dhh * sizeof(float),"view360"); Frecalc = 1; } viewpxb = PXB_make(dww,dhh,3); if (! viewpxb) { fbusy = 0; return; } // 26.3 viewpixbuf = viewpxb->pixbuf; gdk_pixbuf_fill(viewpixbuf,0); if (Frecalc) { Frecalc = 0; for (py = 0; py < dhh; py++) // loop window pixels for (px = 0; px < dww; px++) { dx = px - dww/2; // distance from center dy = py - dhh/2; dx = dx / zoom; // scale for zoom dy = dy / zoom; ii = py * dww + px; sx = 6.28 * dx / fww; // scale (dx,dy) so that fww/4 sy = 6.28 * dy / fww; // (90 deg.) is PI/2 if (sx > 1.0 || sx < -1.0 || sy > 0.7 || sy < -0.7) { // limit +-90 and +-63 deg. view Fx[ii] = Fy[ii] = 0; continue; } R = sqrtf(sx*sx + sy*sy); // conv. (dx,dy) in rectilinear proj. C = atanf(R); // to spherical coordinates Tx = atanf(sx); Ty = asinf(sy/R * sinf(C)); if (R == 0.0) Tx = Ty = 0; // avoid Ty = nan sx = 0.25 * fww * Tx; // conv. spherical coordinate (Ty,Tx) sy = 0.25 * fww * Ty * cosf(Tx); // to flat coordinates (sx,sy) Fx[ii] = sx; Fy[ii] = sy; } } do_wthreads(show_thread,NSMP); cairo_t *cr = draw_context_create(Fgdkwin,draw_context); gdk_cairo_set_source_pixbuf(cr,viewpxb->pixbuf,0,0); cairo_paint(cr); draw_context_destroy(draw_context); PXB_free(viewpxb); fbusy = 0; return; } // thread function to generate the image void * view360::show_thread(void *arg) { using namespace view360; int index = *((int *) (arg)); int ii, stat, px, py; float sx, sy; uint8 pixs[4], *pixss, *pixp; for (py = index; py < dhh; py += NSMP) // loop window pixels for (px = 0; px < dww; px++) { ii = py * dww + px; sx = Fx[ii]; sy = Fy[ii]; if (sx == 0 && sy == 0) continue; if (sx == NAN || sy == NAN) continue; sx += cx; // add back center sy += cy; if (sy < 0) continue; // off the image if (sy >= fhh) continue; if (sx < 0) sx = fww + sx; // handle x wrap-around if (sx >= fww) sx = sx - fww; pixp = PXBpix(viewpxb,px,py); // dest. pixel stat = vpixel(filepxb,sx,sy,pixs); // source pixel interpolated if (stat) memcpy(pixp,pixs,3); // fails at image left/right edge else { pixss = PXBpix(filepxb,int(sx),int(sy)); // use no interpolation memcpy(pixp,pixss,3); } } return 0; } // mouse function - move center of view with mouse drag void view360::mousefunc() { using namespace view360; int Fshow = 0; if (Mxdrag || Mydrag) { // change center of view cx += 2 * Mwdragx; // horizontal center if (cx < 0) cx = fww + cx; if (cx >= fww) cx = cx - fww; // cy += Mwdragy; // vertical center Mxdrag = Mydrag = 0; Fshow = 1; } if (LMclick) { // zoom-in LMclick = 0; zoom = zoom * 1.414; if (zoom > 1.99) zoom = 2; Fshow = 1; Frecalc = 1; } if (RMclick) { // zoom-out RMclick = 0; zoom = zoom / 1.414; if (zoom < 0.3) zoom = 0.3; Fshow = 1; Frecalc = 1; } if (Fshow) { if (zd) zdialog_free(zd); zd = 0; show(); } return; } // keyboard function void view360::KB_func(int key) { using namespace view360; int ii; if (zd) zdialog_free(zd); zd = 0; if (key == GDK_KEY_Escape) quit(); for (ii = 0; ii < Nkbsu; ii++) { // test if KB key is "Quit" shortcut if (toupper(key) == KBsutab[ii].key[0]) { if (strmatchcase(KBsutab[ii].menu,"Quit")) quit(); else break; } } if (key == GDK_KEY_Left) { // left/right arrow keys pan image cx -= 20; if (cx < 0) cx = fww + cx; } if (key == GDK_KEY_Right) { cx += 20; if (cx >= fww) cx = cx - fww; } show(); return; } // quit and free resources void view360::quit() { if (! Fview360) return; freeMouse(); PXB_free(filepxb); PXB_free(viewpxb); if (Fx) zfree(Fx); if (Fy) zfree(Fy); Fview360 = 0; Vmenu_block(0); gdk_window_thaw_updates(Fgdkwin); Fpaint2(); } /**************************************************************************************/ // rename menu function // activate rename dialog, stuff data from current or clicked file // dialog remains active when new file is opened ch rename_old[200] = ""; // base names only ch rename_new[200] = ""; ch rename_prev[200] = ""; ch *rename_file = 0; void m_rename(GtkWidget *, ch *menu) { int rename_dialog_event(zdialog *zd, ch *event); ch *pdir, *pfile, *pext; F1_help_topic = TX("RENAME"); printf("m_rename \n"); if (rename_file) zfree(rename_file); rename_file = 0; if (clicked_file) { // use clicked file if present rename_file = clicked_file; clicked_file = 0; } else if (curr_file) // else current file rename_file = zstrdup(curr_file,"rename"); else { zmessageACK(Mwin,TX("no current file")); return; } if (FGM != 'F' && FGM != 'G') viewmode('F'); /*** ______________________________________ | Rename Image File | | | | Old Name [_______________________] | | New Name [_______________________] | | [previous name] [Add 1] | | | | [x] stay open | | | | [Apply] [X] | |______________________________________| ***/ if (! zd_rename) // restart dialog { zd_rename = zdialog_new(TX("Rename Image File"),Mwin,TX("Apply"),"X",null); zdialog *zd = zd_rename; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"homog|expand"); zdialog_add_widget(zd,"label","Lold","vb1",TX("Old Name")); zdialog_add_widget(zd,"label","Lnew","vb1",TX("New Name")); zdialog_add_widget(zd,"label","space","vb1"); zdialog_add_widget(zd,"hbox","hb2","vb2"); zdialog_add_widget(zd,"label","oldname","hb2"); zdialog_add_widget(zd,"label","space","hb2",0,"expand"); zdialog_add_widget(zd,"zentry","newname","vb2",0,"size=20"); zdialog_add_widget(zd,"hbox","hb3","vb2",0,"space=3"); zdialog_add_widget(zd,"button","prev","hb3",TX("previous name")); zdialog_add_widget(zd,"button","Badd1","hb3",TX("Add 1"),"space=8"); zdialog_add_widget(zd,"hbox","hb4","dialog",0,"space=3"); zdialog_add_widget(zd,"check","keepopen","hb4",TX("stay open"),"space=3"); zdialog_load_inputs(zd); zdialog_run(zd,rename_dialog_event,"parent"); // run dialog } zdialog *zd = zd_rename; parsefile(rename_file,pdir,pfile,pext); // 25.1 strncpy0(rename_old,pfile,199); strncpy0(rename_new,pfile,199); zdialog_stuff(zd,"oldname",rename_old); // current file name zdialog_stuff(zd,"newname",rename_new); // entered file name (same) parsefile_free(pdir,pfile,pext); return; } // dialog event and completion callback function int rename_dialog_event(zdialog *zd, ch *event) { ch *pp, suffix[16]; ch *pdir = 0, *pfile = 0, *pext = 0; ch *newfile = 0, *nextfile = 0, namever[200]; int nseq, digits, ccp, ccn, ccx, err, Fkeep; if (strmatch(event,"prev")) // previous name >> new name { if (! *rename_prev) return 1; if (! rename_file) return 1; pp = strrchr(rename_prev,'.'); if (pp && strlen(pp) == 4 && pp[1] == 'v' // look for file version .vNN && pp[2] >= '0' && pp[2] <= '9' // and remove if found && pp[3] >= '0' && pp[3] <= '9') *pp = 0; zdialog_stuff(zd,"newname",rename_prev); // stuff prev rename name into dialog parsefile(rename_file,pdir,pfile,pext); // curr. file to be renamed pp = strrchr(pfile,'.'); // look for file version .vNN if (pp && strlen(pp) == 4 && pp[1] == 'v' && pp[2] >= '0' && pp[2] <= '9' && pp[3] >= '0' && pp[3] <= '9') { *namever = 0; // prev rename name + curr file version strncatv(namever,200,rename_prev,pp,null); zdialog_stuff(zd,"newname",namever); // stuff into dialog } } if (strmatch(event,"Badd1")) // increment sequence number { zdialog_fetch(zd,"newname",rename_new,188); // get entered filename pp = strrchr(rename_new,'.'); // find .ext if (pp && strlen(pp) < 8) { if (strmatchN(pp-4,".v",2) && // find .vNN.ext (pp[2] >= '0' && pp[2] <= '9') && (pp[3] >= '0' && pp[3] <= '9')) pp -= 4; strncpy0(suffix,pp,16); // save .ext or .vNN.ext } else { pp = rename_new + strlen(rename_new); *suffix = 0; } digits = 0; while (pp[-1] >= '0' && pp[-1] <= '9') { pp--; // look for NNN in filenameNNN digits++; } nseq = 1; if (digits) nseq += atoi(pp); // NNN + 1 if (nseq > 9999) nseq = 1; if (digits < 1) digits = 1; if (nseq > 9 && digits < 2) digits = 2; if (nseq > 99 && digits < 3) digits = 3; if (nseq > 999 && digits < 4) digits = 4; sprintf(pp,"%0*d",digits,nseq); // replace NNN with NNN + 1 strncat(rename_new,suffix,199); // append .ext or .vNN.ext zdialog_stuff(zd,"newname",rename_new); } if (zd->zstat == 0) goto CLEANUP; // not finished if (zd->zstat != 1) goto KILL; // canceled zd->zstat = 0; // apply - keep dialog active if (! rename_file) goto CLEANUP; parsefile(rename_file,pdir,pfile,pext); // existing /folders/file.ext strcat(pdir,"/"); zdialog_fetch(zd,"newname",rename_new,194); // new file name from user ccp = strlen(pdir); // length of /folders/ ccn = strlen(rename_new); // length of file if (pext) ccx = strlen(pext); // length of .ext else ccx = 0; newfile = (ch *) zmalloc(ccp + ccn + ccx + 1,"rename"); // put it all together strncpy(newfile,rename_file,ccp); // /folders.../newfilename.ext strcpy(newfile+ccp,rename_new); if (ccx) strcpy(newfile+ccp+ccn,pext); if (regfile(newfile)) { // check if new name exists zmessageACK(Mwin,TX("output file exists")); zfree(newfile); newfile = 0; goto CLEANUP; } if (FGM == 'F') nextfile = gallery(0,"get",curr_file_posn+1); // save next file, before rename else nextfile = 0; err = rename(rename_file,newfile); // rename the file if (err) { zmessageACK(Mwin,TX("file error: %s"),strerror(errno)); goto KILL; } file_to_xxrec(newfile); // add xxrec_tab[] for new file delete_thumbfile(rename_file); // remove old thumbnail album_purge_replace("ALL",rename_file,newfile); // replace name in albums strncpy0(rename_prev,rename_new,199); // save new name to previous name if (curr_file && strmatch(rename_file,curr_file)) // current file exists no more free_resources(); if (navi::gallerytype == FOLDER) { // refresh gallery list gallery(0,"init",0); gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); } zdialog_fetch(zd,"keepopen",Fkeep); if (Fkeep) { // keep dialog open if (FGM == 'F' && nextfile) { f_open(nextfile); // will call m_rename() gtk_window_present(MWIN); // keep focus on main window } if (newfile) zfree(newfile); newfile = 0; goto CLEANUP; } else { // close dialog f_open(newfile); // open renamed file goto KILL; } KILL: zdialog_free(zd); // kill dialog zd_rename = 0; CLEANUP: if (newfile) zfree(newfile); if (nextfile) zfree(nextfile); parsefile_free(pdir,pfile,pext); // 25.1 return 1; } /**************************************************************************************/ // Open a file and initialize Fpxb pixbuf. New current file. // // Nth: if Nth matches file position in current gallery, curr_file_posn // is set to Nth, otherwise it is searched and set correctly. // (a file can be present multiple times in an album gallery). // Fkeep: edit undo/redo stack is not purged, and current edits are kept // after opening the new file (used by file_save()). // Fack: failure will cause a popup ACK dialog. // fzoom: keep current zoom level and position, otherwise fit window. // // Following are set: curr_file_type, curr_file_bpc, curr_file_size. // Returns: 0 = OK, +N = error. // errors: 1 reentry // 2 unsaved changes in current file // 3 file not found or user cancel // 4 unsupported file type or PXB_load() failure int f_open(ch *filespec, int Nth, int Fkeep, int Fack, int fzoom) { PXB *tempxb = 0; int fposn, retcode = 0; FTYPE ftype; static int Freent = 0; ch *pp, *file; int Funsaved = 0, yn; poptext_killnow(); // kill pending popup message if (Freent++) goto ret1; // stop re-entry - no diagnostic 25.4 if (CEF && CEF->Fmods && ! CEF->Fsaved) Funsaved = 1; // active edits unsaved if (URS_pos > 0 && URS_saved[URS_pos] == 0) Funsaved = 1; // completed edits unsaved if (Fmetamod) Funsaved = 1; // metadata edits unsaved if (Funsaved) { yn = zmessageYN(Mwin,TX("Discard unsaved changes?")); // 25.0 if (! yn) goto ret2; } if (CEF && CEF->zd) // cancel pending edit zdialog_send_event(CEF->zd,"cancel"); if (CEF) { // cannot zmessageACK(Mwin,TX("finish or cancel pending edit")); goto ret2; } sa_clear(); // clear area if any file = 0; if (filespec) file = zstrdup(filespec,"f-open"); // use passed filespec else { pp = curr_file; // use file open dialog if (! pp && navi::gallerytype == FOLDER) pp = navi::galleryname; file = zgetfile(TX("Open Image File"),MWIN,"file",pp); } if (! file) goto ret3; if (! regfile(file)) { // check file exists panelmessage(1,3,TX("file not found: %s"),file); // 25.1 zfree(file); goto ret3; } ftype = image_file_type(file); // reject thumbnail if (ftype == THUMB) { if (Fack) zmessageACK(Mwin,TX("thumbnail file")); goto ret4; } if (ftype != IMAGE && ftype != RAW && ftype != VIDEO) { // must be supported image file type if (Fack) { printf("*** %s\n",file); zmessageACK(Mwin,TX("unknown file type")); } zfree(file); goto ret4; } tempxb = PXB_load(file,1); // load image as PXB pixbuf if (! tempxb) { // PXB_load() messages user zfree(file); goto ret4; } free_resources(Fkeep); // free resources for prior image file curr_file = file; // new current file Fpxb = tempxb; // pixmap for current image strcpy(curr_file_type,f_load_type); // set curr_file_xxx from f_load_xxx curr_file_bpc = f_load_bpc; curr_file_size = f_load_size; Fmeta_edithist = 0; // no edit history data loaded Fupright = Flevel = 0; // file not uprighted or levelled if (ftype == RAW) Fupright = 1; // assume RAW loaders do upright fposn = file_position(file,Nth); // file position in gallery list if (fposn < 0) { // not there gallery(curr_file,"init",0); // generate new gallery list gallery(0,"sort",-2); // recall sort and position gallery(curr_file,"paint",0); // position at curr. file fposn = file_position(curr_file,0); // position and count in gallery list } curr_file_posn = fposn; // keep track of file position if (! fzoom) { // discard zoom state Fzoom = 0; // zoom level = fit window zoomx = zoomy = 0; // no zoom center } add_recent_file(curr_file); // most recent file opened if (zd_rename) m_rename(0,0); // update active rename dialog if (zd_copymove) m_copy_move(0,0); // " copy/move dialog if (zd_deltrash) m_delete_trash(0,0); // " delete/trash dialog if (zd_metaview) meta_view(0); // " metadata view window if (zd_editmeta) m_meta_edit_main(0,0); // " edit metadata dialog if (zd_editanymeta) m_meta_edit_any(0,0); // " edit any metadata dialog if (zd_deletemeta) m_meta_delete(0,0); // " delete metadata dialog if (Fcaps) meta_show_caps(1); // show captions on current image if (CEF && CEF->menufunc) CEF->menufunc(0,0); // restart edit function if (ftype == VIDEO) // offer to play video file zmessage_post(Mwin,"parent",2,TX("VIDEO press P to play")); // 26.0 if (FGM == 'F') { Fpaintnow(); // force repaint set_mwin_title(); // set win title from curr_file info } if (FGM == 'G') gallery(0,"paint",-1); // paint gallery goto ret0; ret4: retcode++; ret3: retcode++; ret2: retcode++; ret1: retcode++; ret0: Freent = 0; return retcode; } /**************************************************************************************/ // Open a file that was just saved. Used by file_save(). // The edit undo/redo stack is not purged and current edits are kept. // Following are set: // curr_file *_folder *_file_posn *_file_type *_file_bpc *_file_size // Returns: 0 = OK, +N = error. int f_open_saved() { int Nth = -1, fposn; if (! f_save_file) return 1; if (E0pxm) { // edits were made PXB_free(Fpxb); // new window image Fpxb = PXM_PXB_copy(E0pxm); } zstrcopy(curr_file,f_save_file,"f_open_saved"); // curr. file = last saved file fposn = file_position(curr_file,Nth); // file position in gallery list if (fposn < 0) { // not there gallery(curr_file,"init",0); // generate new gallery list gallery(0,"sort",-2); // recall sort and position gallery(curr_file,"paint",-1); // position at current file fposn = file_position(curr_file,0); // position and count in gallery list } curr_file_posn = fposn; // keep track of file position strcpy(curr_file_type,f_save_type); // set curr_file_xxx from f_save_xxx curr_file_bpc = f_save_bpc; curr_file_size = f_save_size; zoomx = zoomy = 0; // no zoom center if (FGM == 'F') set_mwin_title(); // set win title from curr_file info if (zd_metaview) meta_view(0); // update meta view window return 0; } /************************************************************************************** Remove a file and clean up index, thumbnails, gallery, curr_file. 'opt' is "delete" or "trash". trash logic: Move target file to ~/Desktop/ first, then move to trash. Gnome trash fails for files on mounted volumes. Returns 0 if OK, else error code. Albums: caller must delete or update album links (file moved or renamed) ****/ int f_remove(ch *file, ch *opt) { int err, Nth; ch *cfile = 0; ch trashfile[400] = "~/Desktop/"; ch *pp; GFile *gfile; GError *gerror = 0; int gstat; if (*opt == 'd') // delete { err = remove(file); if (err && errno != ENOENT) { // OK if already deleted zmessageACK(Mwin,TX("delete %s \n%s"),file,strerror(errno)); return err; } } if (*opt == 't') // trash { strcpy(trashfile,getenv("HOME")); // copy to desktop, then Gnome trash strcat(trashfile,"/Desktop/"); pp = strrchr(file,'/'); // get base file name, filename.jpg if (pp) pp++; else pp = file; strncatv(trashfile,400,pp,null); // ~/Desktop/filename.jpg err = cp_copy(file,trashfile); // copy target file to desktop if (err) { zmessageACK(Mwin,TX("copy to Desktop failed: %s"),strerror(errno)); return 1; } gfile = g_file_new_for_path(trashfile); gstat = g_file_trash(gfile,0,&gerror); g_object_unref(gfile); if (! gstat) { zmessageACK(Mwin,TX("move to trash failed: %s"),gerror->message); return 2; } err = remove(file); // delete file if (err && errno != ENOENT) { // OK if already deleted zmessageACK(Mwin,TX("delete %s \n%s"),file,strerror(errno)); return err; } } delete_thumbfile(file); // delete thumbnail Nth = file_position(file,0); // find in gallery list if (Nth >= 0) gallery(0,"delete",Nth); // delete from gallery list if (curr_file && strmatch(file,curr_file)) { // current file was removed free_resources(); cfile = gallery(0,"getR",curr_file_posn); // new current file = next if (cfile) f_open(cfile); else { Nth = curr_file_posn - 1; if (Nth >= navi::Gfolders && Nth < navi::Gfiles) { // no next, try previous cfile = gallery(0,"getR",curr_file_posn - 1); if (cfile) f_open(cfile); } } } return 0; } /**************************************************************************************/ // Function to preload image files hopefully ahead of need. // Usage: f_preload(next) // next = -1 / +1 to read previous / next image file in curr. gallery // preload_file will be non-zero if and when preload_pxb is available. void f_preload(int next, int Flast) { int fd; ch *file; if (! curr_file) return; file = prev_next_file(next,Flast); if (! file) return; if (strmatch(file,curr_file)) return; fd = open(file,O_RDONLY); if (fd >= 0) { posix_fadvise(fd,0,0,POSIX_FADV_WILLNEED); // preload file in kernel cache close(fd); } return; } /**************************************************************************************/ // Open previous or next file in current gallery list, // or jump to previous or next gallery when at the limits. // index is -1 / +1 for prev / next file. // Fjump: jump to last file version, jump to prev/next folder. void x_prev_next(int index, int Fjump) { using namespace navi; ch *newfile = 0, *newgallery = 0; int err, Nth = 0; static int xbusy = 0, jumpswitch = 0; ch *mess1 = TX("Previous gallery"); ch *mess2 = TX("Next gallery"); ch *mess3 = TX("Start of gallery"); ch *mess4 = TX("End of gallery"); if (! curr_file) return; if (FGM != 'F' && FGM != 'G') return; if (xbusy) return; // avoid "function busy" xbusy = 1; newfile = prev_next_file(index,Fjump); // get prev/next file (last version) if (newfile) { Nth = curr_file_posn + index; // albums can have repeat files err = f_open(newfile,Nth,0,1,1); // open image or RAW file if (! err) f_preload(index,Fjump); // preload next image goto returnx; } if (Fjump) { if (index == -1) panelmessage(1,3,mess1); // notify jump to prev/next gallery 25.1 if (index == +1) panelmessage(1,3,mess2); } else { if (index == -1) panelmessage(1,3,mess3); // notify gallery start/end 25.1 if (index == +1) panelmessage(1,3,mess4); jumpswitch = 0; } if (Fjump && jumpswitch) { // jump to prev/next gallery jumpswitch = 0; newgallery = prev_next_gallery(index); if (! newgallery) goto returnx; gallery(newgallery,"init",0); // load gallery zfree(newgallery); gallery(0,"sort",-2); // preserve sort if (Gfiles - Gfolders > 0) { // at least one image file present if (index == +1) Nth = Gfolders; // get first or last image file if (index == -1) Nth = Gfiles - 1; newfile = gallery(0,"getR",Nth); err = f_open(newfile,Nth,0,1,0); // open image or RAW file if (! err) gallery(newfile,"paint",Nth); if (! err) f_preload(index,Fjump); // preload next image goto returnx; } else { // no image files in gallery gallery(0,"paint",0); viewmode('G'); free_resources(); } } else if (Fjump) jumpswitch = 1; // hesitate once, jump next time returnx: zmainloop(); // refresh window (holding arrow key) xbusy = 0; return; } void m_prev(GtkWidget *, ch *menu) { if (menu) x_prev_next(-1,1); // jump option else x_prev_next(-1,0); // search from curr_file -1 return; // to first file } void m_next(GtkWidget *, ch *menu) { if (menu) x_prev_next(+1,1); // jump option else x_prev_next(+1,0); // search from curr_file +1 return; // to last file } void m_prev_next(GtkWidget *, ch *menu) // left/right mouse click >> { // previous/next image file F1_help_topic = TX("PREV/NEXT"); // 26.3 int button = zfuncs::vmenuclickbutton; if (button == 1) m_prev(0,0); else m_next(0,0); return; } /**************************************************************************************/ // zoom in/out - left/right mouse click on zoom button or F-view image void m_zoom_menu(GtkWidget *, ch *menu) // left/right mouse click { F1_help_topic = TX("ZOOM"); int button = zfuncs::vmenuclickbutton; if (FGM == 'G') { // G view, larger/smaller thumbnails if (button == 1) navi::menufuncx(0,"Zoom+"); else navi::menufuncx(0,"Zoom-"); } if (FGM == 'F') { // F view, zoom image in/out if (button == 1) m_zoom(0,"Zoom+"); else m_zoom(0,"Zoom-"); } return; } /**************************************************************************************/ // create a new blank image file with desired background color void m_blank_image(GtkWidget *, ch *pname) { ch color[20], fname[100], fext[8], *filespec; int zstat, err, cc, ww, hh, RGB[3]; zdialog *zd; ch *pp; ch *curr_folder = 0; F1_help_topic = TX("BLANK IMAGE"); printf("m_blank_image \n"); if (navi::gallerytype == FOLDER) curr_folder = navi::galleryname; else curr_folder = topfolders[0]; if (! curr_folder) { printf("*** no top image folders defined \n"); // should not happen return; } viewmode('F'); /*** __________________________________________________ | Create Blank Image | | | | file name [___________________________] [.jpg|v] | | width [____] height [____] (pixels) | | color [____] | | | | [OK] [X] | |__________________________________________________| ***/ zd = zdialog_new(TX("Create Blank Image"),Mwin,"OK","X",null); zdialog_add_widget(zd,"hbox","hbf","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labf","hbf",TX("file name"),"space=3"); zdialog_add_widget(zd,"zentry","file","hbf",0,"space=3|expand"); zdialog_add_widget(zd,"combo","ext","hbf",".jpg","space=3|size=3"); zdialog_add_widget(zd,"hbox","hbz","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labw","hbz",TX("Width"),"space=5"); zdialog_add_widget(zd,"zspin","width","hbz","100|30000|1|1600"); zdialog_add_widget(zd,"label","space","hbz",0,"space=5"); zdialog_add_widget(zd,"label","labh","hbz",TX("Height"),"space=5"); zdialog_add_widget(zd,"zspin","height","hbz","100|16000|1|1000"); zdialog_add_widget(zd,"label","labp","hbz",TX("(pixels)"),"space=3"); zdialog_add_widget(zd,"hbox","hbc","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labc","hbc",TX("Color"),"space=5"); zdialog_add_widget(zd,"colorbutt","color","hbc","200|200|200"); zdialog_stuff(zd,"ext",".jpg"); zdialog_stuff(zd,"ext",".png"); zdialog_load_inputs(zd); zdialog_set_modal(zd); zdialog_run(zd,0,"save"); // run dialog zstat = zdialog_wait(zd); // wait for completion if (zstat != 1) { // cancel zdialog_free(zd); return; } zdialog_fetch(zd,"file",fname,92); // get new file name strTrim2(fname); if (*fname <= ' ') { zmessageACK(zd->dialog,TX("supply a file name")); zdialog_free(zd); m_blank_image(0,0); // retry return; } zdialog_fetch(zd,"ext",fext,8); // add extension strcat(fname,fext); cc = strlen(fname); filespec = zstrdup(curr_folder,"blank-image",cc+4); // make full filespec strcat(filespec,"/"); strcat(filespec,fname); zdialog_fetch(zd,"width",ww); // get image dimensions zdialog_fetch(zd,"height",hh); RGB[0] = RGB[1] = RGB[2] = 255; zdialog_fetch(zd,"color",color,19); // get image color pp = substring(color,"|",1); if (pp) RGB[0] = atoi(pp); pp = substring(color,"|",2); if (pp) RGB[1] = atoi(pp); pp = substring(color,"|",3); if (pp) RGB[2] = atoi(pp); zdialog_free(zd); err = create_blank_file(filespec,ww,hh,RGB); if (! err) f_open(filespec); // make it the current file zfree(filespec); return; } // function to create a new blank image file // file extension must be one of: .jpg .png .jxl // RGB args are in the range 0 - 255 // if file exists it is overwritten // returns 0 if OK, 1 if file exists, +N if error int create_blank_file(ch *file, int ww, int hh, int RGB[3]) { ch *pp; ch *fext; int cstat; PXB *tempxb; GError *gerror = 0; uint8 *pixel; if (regfile(file)) { zmessageACK(Mwin,TX("output file exists")); // file already exists return 1; } pp = strrchr(file,'.'); // get file .ext if (! pp || strlen(pp) > 4) return 1; if (strmatch(pp,".jpg")) fext = "jpeg"; // validate and set gdk_pixbuf arg. else if (strmatch(pp,".png")) fext = "png"; else if (strmatch(pp,".jxl")) fext = "jxl"; // jxl else return 2; tempxb = PXB_make(ww,hh,3); // create pixbuf image if (! tempxb) return 0; // 26.3 for (int py = 0; py < hh; py++) // fill with color for (int px = 0; px < ww; px++) { pixel = PXBpix(tempxb,px,py); pixel[0] = RGB[0]; pixel[1] = RGB[1]; pixel[2] = RGB[2]; } cstat = gdk_pixbuf_save(tempxb->pixbuf,file,fext,&gerror,null); if (! cstat) { zmessageACK(Mwin,"error: %s",gerror->message); PXB_free(tempxb); return 3; } PXB_free(tempxb); return 0; } /**************************************************************************************/ // copy or move an image file to a new location namespace copymove_names { ch *sorcfile = 0; // source file full name ch *destname = 0; // destination file base name ch *destfile = 0; // destination file full name ch *nextfile = 0; // next file in source gallery ch *prevfile = 0; } // menu function void m_copy_move(GtkWidget *, ch *) { using namespace copymove_names; int copymove_dialog_event(zdialog *zd, ch *event); ch *title = TX("Copy or Move Image File"); ch *pp; int Funsaved = 0, yn; F1_help_topic = TX("COPY/MOVE"); printf("m_copy_move \n"); if (sorcfile) zfree(sorcfile); sorcfile = 0; if (clicked_file) { // use clicked file if present sorcfile = clicked_file; clicked_file = 0; } else if (curr_file) // else use current file sorcfile = zstrdup(curr_file,"copy_move"); else return; if (CEF && CEF->Fmods && ! CEF->Fsaved) Funsaved = 1; // active edits unsaved 25.1 if (URS_pos > 0 && URS_saved[URS_pos] == 0) Funsaved = 1; // completed edits unsaved if (Fmetamod) Funsaved = 1; // metadata edits unsaved if (Funsaved) { yn = zmessageYN(Mwin,TX("Copy without unsaved changes?")); if (! yn) return; } /*** ________________________________________________________ | Copy or Move Image File | | | | Image File: [________________________________________] | sorcname file base name | New Location: [_____________________________] [browse] | copymove_loc destination folder | New File Name: [______________________________] [prev] | destname file base name | | | (o) copy (duplicate file) (o) move (delete original) | | [x] stay open | | [x] move to next input file | | [Apply] [X] | |________________________________________________________| ***/ if (! zd_copymove) // globally visible dialog { zd_copymove = zdialog_new(title,Mwin,TX("Apply"),"X",null); zdialog *zd = zd_copymove; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labf","hb1",TX("Image File:"),"space=5"); zdialog_add_widget(zd,"label","sorcname","hb1"); // sorcname not editable zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labl","hb2",TX("New Location:"),"space=5"); zdialog_add_widget(zd,"zentry","copymove_loc","hb2",0,"expand"); zdialog_add_widget(zd,"button","Browse","hb2",TX("Browse"),"space=5"); zdialog_add_widget(zd,"hbox","hb3","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labl","hb3",TX("New File Name:"),"space=5"); zdialog_add_widget(zd,"zentry","destname","hb3",0,"expand"); zdialog_add_widget(zd,"button","Prev","hb3","Prev","space=5"); zdialog_add_widget(zd,"hbox","hb4","dialog",0,"space=3"); zdialog_add_widget(zd,"radio","copy","hb4",TX("copy (duplicate file)"),"space=5"); zdialog_add_widget(zd,"radio","move","hb4",TX("move (delete original)"),"space=5"); zdialog_add_widget(zd,"hbox","hb5","dialog"); zdialog_add_widget(zd,"check","keepopen","hb5",TX("stay open"),"space=3"); zdialog_add_widget(zd,"hbox","hb6","dialog"); zdialog_add_widget(zd,"check","next","hb6",TX("move to next input file"),"space=3"); zdialog_stuff(zd,"copy",1); zdialog_stuff(zd,"move",0); zdialog_stuff(zd,"keepopen",0); zdialog_stuff(zd,"next",0); zdialog_load_inputs(zd); // default prior inputs zdialog_resize(zd,400,0); zdialog_run(zd,copymove_dialog_event,"parent"); // run dialog } zdialog *zd = zd_copymove; zdialog_stuff(zd,"sorcname",""); // clear dialog zdialog_stuff(zd,"copymove_loc",""); zdialog_stuff(zd,"destname",""); if (sorcfile) { if (FGM == 'G') f_open(sorcfile); // show or highlight gallery pp = strrchr(sorcfile,'/'); if (pp) { zdialog_stuff(zd,"sorcname",pp+1); // use given source file zdialog_stuff(zd,"destname",pp+1); // initz. dest file name from source } } if (! sorcfile || ! pp) { // should not happen zmessageACK(Mwin,TX("invalid source file: %s"),sorcfile); zdialog_free(zd); zd_copymove = 0; return; } if (! copymove_loc || ! *copymove_loc || strmatch(copymove_loc,"null")) { // 26.0 if (*topfolders[0]) zdialog_stuff(zd,"copymove_loc",topfolders[0]); } else if (copymove_loc) zdialog_stuff(zd,"copymove_loc",copymove_loc); // last used copy-to location return; } // dialog event and completion callback function int copymove_dialog_event(zdialog *zd, ch *event) { using namespace copymove_names; int Fcopy, Fmove, Fnext; ch *pp, *pext; ch copyloc[XFCC], ftype[8], fvers[6]; int nn, cc, err, Fkeep, Nth; if (strmatch(event,"Browse")) { // browse for new location pp = zgetfile(TX("Select folder"),MWIN,"folder",topfolders[0]); // 26.0 if (! pp) return 1; if (copymove_loc) zfree(copymove_loc); // save new copymove location copymove_loc = pp; zdialog_stuff(zd,"copymove_loc",copymove_loc); return 1; } if (strmatch(event,"Prev")) // use previous file name { if (! prevfile) return 1; // none zdialog_fetch(zd,"destname",copyloc,XFCC); // look for existing file version pp = strrchr(copyloc,'.'); if (! pp || strncmp(pp-4,".v01",4) < 0 || strncmp(pp-4,".v99",4) > 0) { zdialog_stuff(zd,"destname",prevfile); // none, use prev. file name unchanged return 1; } strncpy0(fvers,pp-4,5); // save existing version 26.0 strncpy0(copyloc,prevfile,XFCC-14); // previous file pp = strrchr(copyloc,'.'); if (pp) strncpy0(ftype,pp,8); // previous file type else strcpy(ftype,".jpg"); if (pp && strmatchN(pp-4,".v",2)) pp -= 4; // previous file version if (pp) *pp = 0; // truncate version and type if (*fvers) strcat(copyloc,fvers); // add existing version if present strcat(copyloc,ftype); // add previous type zdialog_stuff(zd,"destname",copyloc); return 1; } if (zd->zstat == 0) return 1; // wait for dialog finished if (zd->zstat != 1) { // cancel zdialog_free(zd); // kill dialog zd_copymove = 0; return 1; } zd->zstat = 0; // [apply] - keep dialog active if (image_file_type(sorcfile) != IMAGE) { zmessageACK(Mwin,TX("invalid source file: %s"),sorcfile); // validate source file return 1; } zdialog_fetch(zd,"copy",Fcopy); // get options zdialog_fetch(zd,"move",Fmove); zdialog_fetch(zd,"next",Fnext); if (Fcopy + Fmove != 1) return 1; // one of copy/move must be set zdialog_fetch(zd,"copymove_loc",copyloc,XFCC); // get move-to location from dialog if (! dirfile(copyloc)) { // check for valid folder zmessageACK(Mwin,TX("new location is not a folder")); return 1; } zstrcopy(copymove_loc,copyloc,"copy_move"); // save new copymove location if (destname) zfree(destname); destname = (ch *) zmalloc(200,"copy_move"); // get dest file name zdialog_fetch(zd,"destname",destname,190); if (*destname <= ' ' || strchr(destname,'/')) { zmessageACK(Mwin,TX("new file name is invalid")); return 1; } pext = strrchr(destname,'.'); // find dest file .ext if (! pext || strlen(pext) > 8) pext = destname + strlen(destname); // try to skip over '.' in file name if (strlen(pext) > 3 && pext[1] == 'v') pext = destname + strlen(destname); // try to skip over version number *pext = 0; pp = strrchr(sorcfile,'.'); if (pp && strlen(pp) < 9) strcpy(pext,pp); // copy source file .ext to dest file cc = strlen(copymove_loc) + strlen(destname) + 2; // new file = copymove_loc/destname.ext if (destfile) zfree(destfile); destfile = (ch *) zmalloc(cc,"copy_move"); *destfile = 0; strncatv(destfile,cc,copymove_loc,"/",destname,null); if (strmatch(sorcfile,destfile)) { // block copy to self zmessageACK(Mwin,TX("cannot copy a file to itself")); return 1; } if (regfile(destfile)) // if new file exists { nn = zdialog_choose(Mwin,"mouse",TX("output file exists"),TX("do nothing"), TX("replace file"),TX("make new version"),null); if (nn == 1) return 1; // do nothing else if (nn == 2); // replace file (continue below) else if (nn == 3) { // copy file to new version pp = file_new_version(destfile); // get next version of destfile if (! pp) return 1; zfree(destfile); destfile = pp; } } err = cp_copy(sorcfile,destfile); // copy source file to destination if (err) { zmessageACK(Mwin,strerror(err)); return 1; } if (prevfile) zfree(prevfile); // save last dest file name pp = strrchr(destfile,'/'); prevfile = zstrdup(pp+1,"copy_move"); file_to_xxrec(destfile); // update xxrec_tab[] add_recent_file(destfile); // add to recent files list if (nextfile) zfree(nextfile); // find next file in gallery, if any nextfile = 0; Nth = file_position(sorcfile,0); // source file position in gallery if (Nth >= 0) nextfile = gallery(0,"get",Nth+1); if (Fmove) // move - delete source file { album_purge_replace("ALL",sorcfile,destfile); // replace in albums where present // (must precede f_remove) err = f_remove(sorcfile,"delete"); // delete file/index/thumb/gallery if (err) { zmessageACK(Mwin,TX("delete failed: \n%s"),strerror(errno)); return 1; } if (curr_file && strmatch(curr_file,sorcfile)) { // current file deleted zfree(curr_file); curr_file = 0; } } if (sorcfile) zfree(sorcfile); // initz. no source file sorcfile = 0; zdialog_stuff(zd,"sorcname",""); zdialog_stuff(zd,"destname",""); if (Fnext && nextfile) { // move to next file in gallery sorcfile = nextfile; nextfile = 0; f_open(sorcfile); // show file or highlight thumb pp = strrchr(sorcfile,'/'); if (pp) { zdialog_stuff(zd,"sorcname",pp+1); // next source and dest file name zdialog_stuff(zd,"destname",pp+1); zdialog_stuff(zd,"keepopen",1); // force keep open 26.8 } } else if (curr_file) f_open(curr_file); // restore curr. metadata else viewmode('G'); if (FGM == 'G' && navi::gallerytype == FOLDER) { // refresh gallery gallery(0,"init",0); gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); } zdialog_fetch(zd,"keepopen",Fkeep); if (! Fkeep) { zdialog_free(zd); // kill dialog zd_copymove = 0; } else gtk_window_present(MWIN); // keep focus on main window return 1; } /**************************************************************************************/ // copy selected image file to the desktop void m_copyto_desktop(GtkWidget *, ch *) { ch *file, *pp, newfile[XFCC]; int err; F1_help_topic = TX("COPY TO DESKTOP"); printf("m_copyto_desktop \n"); if (FGM != 'F' && FGM != 'G') return; file = clicked_file; if (! file) file = curr_file; if (! file) return; snprintf(newfile,XFCC,"%s/%s",getenv("HOME"),desktopname); // locale specific desktop name pp = strrchr(file,'/'); if (! pp) return; strncatv(newfile,XFCC,pp,null); // new desktop file name if (regfile(newfile)) { // check if file exists int yn = zmessageYN(Mwin,TX("output file exists, overwrite?")); // confirm overwrite if (! yn) goto cleanup; } if (curr_file && strmatch(file,curr_file) // current file is copied && image_file_type(file) == IMAGE) f_save(newfile,curr_file_type,curr_file_bpc,0,1); // preserve edits else { err = cp_copy(file,newfile); // copy other file if (err) { zmessageACK(Mwin,strerror(err)); goto cleanup; } file_to_xxrec(newfile); // update image index } cleanup: if (clicked_file) zfree(clicked_file); clicked_file = 0; return; } /**************************************************************************************/ // copy selected image file to the clipboard void m_copyto_clip(GtkWidget *, ch *) { int file_copytoclipboard(ch *file); ch tempfile[200]; int err; F1_help_topic = TX("COPY TO CLIPBOARD"); printf("m_copyto_clip \n"); if (FGM != 'F' && FGM != 'G') return; if (clicked_file) { file_copytoclipboard(clicked_file); // get file behind thumbnail zfree(clicked_file); clicked_file = 0; return; } if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } if (image_file_type(curr_file) != IMAGE) { // non-image file file_copytoclipboard(curr_file); return; } snprintf(tempfile,200,"%s/clipboard.jpg",temp_folder); // may be edited and unsaved err = f_save(tempfile,"jpg",8,0,1); if (err) return; file_copytoclipboard(tempfile); remove(tempfile); return; } // copy an image file to the clipboard (as pixbuf) // any prior clipboard image is replaced // supports copy/paste to other apps (not used within fotocx) // returns 1 if OK, else 0 int file_copytoclipboard(ch *file) { GtkClipboard *clipboard; PIXBUF *pixbuf; GError *gerror = 0; pixbuf = gdk_pixbuf_new_from_file(file,&gerror); if (! pixbuf) return 0; clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); if (! clipboard) return 0; gtk_clipboard_clear(clipboard); gtk_clipboard_set_image(clipboard,pixbuf); gtk_clipboard_set_can_store(clipboard,0,0); gtk_clipboard_store(clipboard); // persistence after exit does not work g_object_unref(pixbuf); return 1; } /**************************************************************************************/ // Delete or Trash an image file. // Use the Linux standard trash function. // If not available, show diagnostic and do nothing. ch *deltrash_file = 0; void m_delete_trash(GtkWidget *, ch *) // combined delete/trash function { int delete_trash_dialog_event(zdialog *zd, ch *event); ch *title = "Delete/Trash Image File"; F1_help_topic = TX("DELETE/TRASH"); printf("m_delete_trash \n"); if (FGM != 'F' && FGM != 'G') return; if (clicked_file && deltrash_file && strmatch(clicked_file,deltrash_file)) { // if selected file clicked again 26.0 f_open(clicked_file); // view full size file viewmode('F'); } if (deltrash_file) zfree(deltrash_file); deltrash_file = 0; if (clicked_file) { // use clicked file if present deltrash_file = clicked_file; clicked_file = 0; } else if (curr_file) // else current file deltrash_file = zstrdup(curr_file,"delete-trash"); /*** ______________________________________ | Delete/Trash Image File | | | | File: [____________________________] | | | | [x] stay open | | | | [Delete] [Trash] [X] | |______________________________________| ***/ if (! zd_deltrash) // start dialog if not already { zd_deltrash = zdialog_new(title,Mwin,TX("Delete"),TX("Trash"),"X",null); zdialog *zd = zd_deltrash; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labf","hb1",TX("File:"),"space=3"); zdialog_add_widget(zd,"label","file","hb1",0,"space=3"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=3"); zdialog_add_widget(zd,"check","keepopen","hb2",TX("stay open"),"space=3"); zdialog_resize(zd,300,0); zdialog_load_inputs(zd); zdialog_run(zd,delete_trash_dialog_event,"parent"); // run dialog } if (deltrash_file) { ch *pp = strrchr(deltrash_file,'/'); if (pp) pp++; else pp = deltrash_file; zdialog_stuff(zd_deltrash,"file",pp); if (FGM == 'G') f_open(deltrash_file); // show or highlight gallery } else zdialog_stuff(zd_deltrash,"file",""); return; } // dialog event and completion callback function int delete_trash_dialog_event(zdialog *zd, ch *event) { int err = 0, yn = 0; int ftype, Fkeep; STATB statB; ch *opt = 0; ch *pp; if (zd->zstat == 0) return 1; // wait for dialog finished if (zd->zstat == 1) goto PREP; // [delete] button if (zd->zstat == 2) goto PREP; // [trash] button goto EXIT; // cancel PREP: if (! deltrash_file) goto EXIT; // no file to delete or trash if (! regfile(deltrash_file,&statB)) { // check file exists zmessageACK(Mwin,strerror(errno)); goto EXIT; } ftype = image_file_type(deltrash_file); if (ftype != IMAGE && ftype != RAW && ftype != VIDEO) { // must be image or RAW or VIDEO zmessageACK(Mwin,TX("not a known image file")); goto EXIT; } if (! hasperm(deltrash_file,'w')) { // check permission if (zd->zstat == 1) yn = zmessageYN(Mwin,TX("Delete read-only file?")); if (zd->zstat == 2) yn = zmessageYN(Mwin,TX("Trash read-only file?")); if (! yn) goto NEXT; // keep file statB.st_mode |= S_IWUSR; // make writable err = chmod(deltrash_file,statB.st_mode); if (err) { zmessageACK(Mwin,strerror(errno)); goto EXIT; } } album_purge_replace("ALL",deltrash_file,0); // remove from albums if present if (zd->zstat == 1) opt = "delete"; // [delete] button if (zd->zstat == 2) opt = "trash"; // [trash] button err = f_remove(deltrash_file,opt); // remove file/index/thumb/gallery if (err) goto EXIT; if (FGM == 'F') { // F window zdialog_fetch(zd,"keepopen",Fkeep); if (! Fkeep) goto EXIT; zd->zstat = 0; // keep dialog active gtk_window_present(MWIN); // keep focus on main window return 1; } NEXT: // step to next file if (FGM == 'G') { // gallery view gallery(0,"init",0); // refresh for removed file gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); // paint } if (FGM == 'F') m_next(0,0); // file view mode, open next image zdialog_fetch(zd,"keepopen",Fkeep); // keep going if wanted if (! Fkeep) goto EXIT; zd->zstat = 0; // keep dialog active gtk_window_present(MWIN); // keep focus on main window zdialog_stuff(zd_deltrash,"file",""); // set no next file in dialog if (deltrash_file) zfree(deltrash_file); deltrash_file = 0; if (! curr_file) goto EXIT; // no current file deltrash_file = zstrdup(curr_file,"delete-trash"); // default delete new current file pp = strrchr(deltrash_file,'/'); if (pp) pp++; else pp = deltrash_file; zdialog_stuff(zd_deltrash,"file",pp); if (FGM == 'G') f_open(deltrash_file); // show or highlight gallery return 1; EXIT: if (deltrash_file) zfree(deltrash_file); // free memory deltrash_file = 0; zdialog_free(zd); // quit dialog zd_deltrash = 0; return 1; } /**************************************************************************************/ // set current file as desktop wallpaper void m_wallpaper(GtkWidget *, ch *) { F1_help_topic = TX("SET WALLPAPER"); printf("m_wallpaper \n"); if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } set_wallpaper(curr_file); // 26.3 return; } // set wallpaper file using method for desktop session in use // (note: standard Linux chaos) void set_wallpaper(ch *file) // 26.3 { ch *desktop = getenv("XDG_CURRENT_DESKTOP"); ch *wpf = zescape_quotes(file); if (strcasestr(desktop,"KDE")) zshell("log ack","plasma-apply-wallpaper \"%s\" ",wpf); else if (strcasestr(desktop,"XFCE")) zshell("log ack","xfconf-query -c xfce4-desktop " "-p /backdrop/screen0/monitor0/image-path -s \"%s\" ",wpf); else if (strcasestr(desktop,"MATE")) zshell("log ack","gsettings set org.mate.background " "picture-filename \"%s\" ",wpf); else if (strcasestr(desktop,"LXDE")) zshell("log ack","feh --bg-scale \"%s\" ",wpf); else // assume GNOME variant { zshell("log ack","gsettings set org.gnome.desktop.background picture-uri \"file://%s\" ",wpf); zshell("log ack","gsettings set org.gnome.desktop.background picture-uri-dark \"file://%s\" ",wpf); } return; } /**************************************************************************************/ // print image file void m_print_image(GtkWidget *, ch *) // use GTK print { int print_addgrid(PXB *Ppxb); int pstat, yn; ch printfile[200]; PXB *Ppxb = 0; GError *gerror = 0; F1_help_topic = TX("PRINT IMAGE"); printf("m_print_image \n"); if (FGM != 'F' && FGM != 'G') return; if (clicked_file) Ppxb = PXB_load(clicked_file,1); // clicked thumbnail else if (E0pxm) Ppxb = PXM_PXB_copy(E0pxm); // current edited file else if (curr_file) Ppxb = PXB_load(curr_file,1); // current file clicked_file = 0; if (! Ppxb) return; if (sa_stat == sa_stat_fini) { // ask if print select area yn = zmessageYN(Mwin,TX("print select area(s) only?")); if (yn) { select_copysave(0,"copy"); // copy select area to file snprintf(printfile,200,"%s/copied_area.png",saved_areas_folder); Ppxb = PXB_load(printfile,1); if (! Ppxb) return; } } print_addgrid(Ppxb); // add grid lines if wanted snprintf(printfile,200,"%s/printfile.bmp",temp_folder); pstat = gdk_pixbuf_save(Ppxb->pixbuf,printfile,"png",&gerror,null); // .png for non-print of transp. areas if (! pstat) { zmessageACK(Mwin,"error: %s",gerror->message); PXB_free(Ppxb); return; } print_image_file(Mwin,printfile); PXB_free(Ppxb); return; } // add grid lines to print image if wanted int print_addgrid(PXB *Ppxb) { uint8 *pix; int px, py, ww, hh; int startx, starty, stepx, stepy; if (! gridsettings[GON]) return 0; // grid lines off ww = Ppxb->ww; hh = Ppxb->hh; stepx = stepy = 0; if (gridsettings[GXC]) // if line counts specified, stepx = ww / (1 + gridsettings[GXC]); // set spacing accordingly if (gridsettings[GYC]) stepy = hh / ( 1 + gridsettings[GYC]); startx = stepx * gridsettings[GXF] / 100; // variable offsets if (startx < 0) startx += stepx; starty = stepy * gridsettings[GYF] / 100; if (starty < 0) starty += stepy; if (stepx) { // x-grid enabled for (px = startx; px < ww-6; px += stepx) for (py = 0; py < hh; py++) { pix = PXBpix(Ppxb,px,py); // wwwbbb fat grid lines memset(pix,255,9); // wwwbbb memset(pix+9,0,9); // wwwbbb } // ...... } if (stepy) { // y-grid enabled for (py = starty; py < hh-6; py += stepy) for (px = 0; px < ww-3; px += 3) { pix = PXBpix(Ppxb,px,py); // www... memset(pix,255,9); // www... pix = PXBpix(Ppxb,px,py+1); // www... memset(pix,255,9); // bbb... pix = PXBpix(Ppxb,px,py+2); // bbb... memset(pix,255,9); // bbb... pix = PXBpix(Ppxb,px,py+3); memset(pix,0,9); pix = PXBpix(Ppxb,px,py+4); memset(pix,0,9); pix = PXBpix(Ppxb,px,py+5); memset(pix,0,9); } } return 1; } // print calibrated image // menu function calling print_calibrated() in f.tools.cc namespace calibprint { int dialog_event(zdialog *zd, ch *event); void printchart(); void scanchart(); void fixchart(); void processchart(); // parameters for RGB step size of 23: 0 23 46 69 ... 253 (253 --> 255) // NC colors per RGB dimension (12) (counting both 0 and 255) // step size from 16 to 23 // CS color step size (23) // TS tile size in pixels (70) // ROWS chart rows (50) ROWS x COLS must be >= NC*NC*NC // COLS chart columns (35) #define NC 12 #define CS 23 #define TS 70 #define ROWS 50 #define COLS 35 #define NC2 (NC*NC) #define NC3 (NC*NC*NC) int RGBvals[NC]; int Ntiles = NC3; int chartww = COLS * TS; // chart image size int charthh = ROWS * TS; int margin = 80; // chart margins ch printchartfile[200]; ch scanchartfile[200]; } // Print the current image file with adjusted colors // Also called from the file menu function m_print_calibrated() void m_print_calibrated(GtkWidget *, ch *) { using namespace calibprint; zdialog *zd; int zstat; ch *title = TX("Color map file to use"); ch mapfile[200]; FILE *fid; PIXBUF *pixbuf; GError *gerror = 0; uint8 *pixels, *pix1; ch *pp, *pp2, printfile[200]; int ww, hh, rs, nc, px, py, nn, err; int R1, G1, B1, R2, G2, B2; int RGB[NC][NC][NC][3], ERR[NC][NC][NC][3]; int rr1, rr2, gg1, gg2, bb1, bb2; int rx, gx, bx; int ii, Dr, Dg, Db; float W[8], w, Wsum, D, Dmax, F; float Er, Eg, Eb; printf("m_print_calibrated \n"); F1_help_topic = TX("PRINT CALIBRATED"); viewmode('F'); // file view mode if (! curr_file) { zmessageACK(Mwin,TX("Select the image file to print.")); return; } for (int ii = 0; ii < NC; ii++) // construct RGBvals table RGBvals[ii] = CS * ii; RGBvals[NC-1] = 255; // set last value = 255 zd = zdialog_new(title,Mwin,TX("Browse"),TX("Proceed"),"X",null); // show current color map file zdialog_add_widget(zd,"hbox","hbmap","dialog"); // and allow user to choose another zdialog_add_widget(zd,"label","labmap","hbmap",0,"space=3"); zdialog_stuff(zd,"labmap",colormapfile); zdialog_resize(zd,250,0); zdialog_run(zd,0,"parent"); zstat = zdialog_wait(zd); zdialog_free(zd); if (zstat == 1) { // [browse] snprintf(mapfile,200,"%s/%s",printer_color_folder,colormapfile); pp = zgetfile(TX("Color Map File"),MWIN,"file",mapfile,1); if (! pp) return; pp2 = strrchr(pp,'/'); zstrcopy(colormapfile,pp2+1,"print calibrated"); zfree(pp); } else if (zstat != 2) return; // not proceed: cancel snprintf(mapfile,200,"%s/%s",printer_color_folder,colormapfile); fid = fopen(mapfile,"r"); // read color map file if (! fid) return; for (R1 = 0; R1 < NC; R1++) for (G1 = 0; G1 < NC; G1++) for (B1 = 0; B1 < NC; B1++) { nn = fscanf(fid,"RGB: %d %d %d ERR: %d %d %d ", &RGB[R1][G1][B1][0], &RGB[R1][G1][B1][1], &RGB[R1][G1][B1][2], &ERR[R1][G1][B1][0], &ERR[R1][G1][B1][1], &ERR[R1][G1][B1][2]); if (nn != 6) { zmessageACK(Mwin,TX("file format error")); fclose(fid); return; } } fclose(fid); pixbuf = gdk_pixbuf_copy(Fpxb->pixbuf); // get image pixbuf to convert if (! pixbuf) { if (gerror) zmessageACK(Mwin,gerror->message); return; } ww = gdk_pixbuf_get_width(pixbuf); hh = gdk_pixbuf_get_height(pixbuf); pixels = gdk_pixbuf_get_pixels(pixbuf); rs = gdk_pixbuf_get_rowstride(pixbuf); nc = gdk_pixbuf_get_n_channels(pixbuf); panelmessage(1,0,TX("converting colors...")); // 25.1 for (py = 0; py < hh; py++) for (px = 0; px < ww; px++) { zmainloop(); // keep GTK alive pix1 = pixels + py * rs + px * nc; R1 = pix1[0]; // image RGB values G1 = pix1[1]; B1 = pix1[2]; rr1 = R1/CS; // get color map values surrounding RGB rr2 = rr1 + 1; if (rr2 > NC-1) { // if > last entry, use last entry rr1--; rr2--; } gg1 = G1/CS; gg2 = gg1 + 1; if (gg2 > NC-1) { gg1--; gg2--; } bb1 = B1/CS; bb2 = bb1 + 1; if (bb2 > NC-1) { bb1--; bb2--; } ii = 0; Wsum = 0; Dmax = CS; for (rx = rr1; rx <= rr2; rx++) // loop 8 enclosing error map nodes for (gx = gg1; gx <= gg2; gx++) for (bx = bb1; bx <= bb2; bx++) { Dr = R1 - RGBvals[rx]; // RGB distance from enclosing node Dg = G1 - RGBvals[gx]; Db = B1 - RGBvals[bx]; D = sqrtf(Dr*Dr + Dg*Dg + Db*Db); if (D > Dmax) W[ii] = 0; else W[ii] = (Dmax - D) / Dmax; // weight of node Wsum += W[ii]; // sum of weights ii++; } ii = 0; Er = Eg = Eb = 0; for (rx = rr1; rx <= rr2; rx++) // loop 8 enclosing error map nodes for (gx = gg1; gx <= gg2; gx++) for (bx = bb1; bx <= bb2; bx++) { w = W[ii] / Wsum; Er += w * ERR[rx][gx][bx][0]; // weighted sum of map node errors Eg += w * ERR[rx][gx][bx][1]; Eb += w * ERR[rx][gx][bx][2]; ii++; } F = 1.0; // use 100% of calculated error R2 = R1 - F * Er; // adjusted RGB = image RGB - error G2 = G1 - F * Eg; B2 = B1 - F * Eb; RGBfix(R2,G2,B2); pix1[0] = R2; pix1[1] = G2; pix1[2] = B2; } panelmessage(0); // 25.1 snprintf(printfile,200,"%s/printfile.png",temp_folder); // save revised pixbuf to print file gdk_pixbuf_save(pixbuf,printfile,"png",&gerror,"compression","1",null); if (gerror) { zmessageACK(Mwin,gerror->message); return; } g_object_unref(pixbuf); err = f_open(printfile); // open print file if (err) return; zmessageACK(Mwin,TX("Image colors are converted for printing.")); print_image_file(Mwin,printfile); return; } /**************************************************************************************/ // printer color calibration tool void m_calibrate_printer(GtkWidget *, ch *menu) { using namespace calibprint; zdialog *zd; ch *title = TX("Calibrate Printer"); F1_help_topic = TX("CALIBRATE PRINTER"); printf("m_calibrate_printer \n"); viewmode('F'); // file view mode for (int ii = 0; ii < NC; ii++) // construct RGBvals table RGBvals[ii] = CS * ii; RGBvals[NC-1] = 255; // set last value = 255 /*** ______________________________________ | Calibrate Printer | | | | (o) print color chart | | (o) scan and save color chart | | (o) align and trim color chart | | (o) open and process color chart | | | | [Proceed] [X] | |______________________________________| ***/ zd = zdialog_new(title,Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"radio","printchart","dialog",TX("print color chart")); zdialog_add_widget(zd,"radio","scanchart","dialog",TX("scan and save color chart")); zdialog_add_widget(zd,"radio","fixchart","dialog",TX("align and trim color chart")); zdialog_add_widget(zd,"radio","processchart","dialog",TX("open and process color chart")); zdialog_stuff(zd,"printchart",1); zdialog_stuff(zd,"scanchart",0); zdialog_stuff(zd,"fixchart",0); zdialog_stuff(zd,"processchart",0); zdialog_resize(zd,250,0); zdialog_run(zd,dialog_event,"parent"); return; } // dialog event and completion function int calibprint::dialog_event(zdialog *zd, ch *event) { using namespace calibprint; int nn; if (! zd->zstat) return 1; // wait for proceed or cancel if (zd->zstat != 1) { // cancel zdialog_free(zd); return 1; } zdialog_fetch(zd,"printchart",nn); if (nn) printchart(); zdialog_fetch(zd,"scanchart",nn); if (nn) scanchart(); zdialog_fetch(zd,"fixchart",nn); if (nn) fixchart(); zdialog_fetch(zd,"processchart",nn); if (nn) processchart(); zd->zstat = 0; // keep dialog active return 1; } // generate and print the color chart void calibprint::printchart() { using namespace calibprint; int ii, cc, fww, fhh, rx, gx, bx; int row, col, px, py; int chartrs; uint8 *chartpixels, *pix1; PIXBUF *chartpxb; GError *gerror = 0; fww = chartww + 2 * margin; fhh = charthh + 2 * margin; chartpxb = gdk_pixbuf_new(GDKRGB,0,8,fww,fhh); // make chart image if (! chartpxb) { zmessageACK(Mwin,TX("cannot create pixbuf")); return; } chartpixels = gdk_pixbuf_get_pixels(chartpxb); // clear to white chartrs = gdk_pixbuf_get_rowstride(chartpxb); cc = fhh * chartrs; memset(chartpixels,255,cc); for (py = 0; py < charthh; py++) // fill chart tiles with colors for (px = 0; px < chartww; px++) { row = py / TS; col = px / TS; ii = row * COLS + col; if (ii >= Ntiles) break; // last chart positions may be unused rx = ii / NC2; gx = (ii - NC2 * rx) / NC; // RGB index values for tile ii bx = ii - NC2 * rx - NC * gx; pix1 = chartpixels + (py + margin) * chartrs + (px + margin) * 3; pix1[0] = RGBvals[rx]; pix1[1] = RGBvals[gx]; pix1[2] = RGBvals[bx]; } for (py = margin-10; py < fhh-margin+10; py++) // add green margin around tiles for (px = margin-10; px < fww-margin+10; px++) // for easier de-skew and trim { if (py > margin-1 && py < fhh-margin && px > margin-1 && px < fww-margin) continue; pix1 = chartpixels + py * chartrs + px * 3; pix1[0] = pix1[2] = 0; pix1[1] = 255; } snprintf(printchartfile,200,"%s/printchart.png",printer_color_folder); gdk_pixbuf_save(chartpxb,printchartfile,"png",&gerror,null); if (gerror) { zmessageACK(Mwin,gerror->message); return; } g_object_unref(chartpxb); zmessageACK(Mwin,TX("Print chart in vertical orientation without margins.")); print_image_file(Mwin,printchartfile); // print the chart return; } // scan the color chart void calibprint::scanchart() { using namespace calibprint; zmessageACK(Mwin,TX("Scan the printed color chart, darkest row on top. \n" "Save as .png file using printer and paper names \n" "(e.g. %s/Epson_glossy.png). \n"),printer_color_folder); return; } // edit and fix the color chart void calibprint::fixchart() { using namespace calibprint; ch *pp; zmessageACK(Mwin,TX("Open and edit the scanned color chart file. \n" "Remove any skew or rotation from scanning. \n" "(Use the Fix Perspective function for this). \n" "Cut off the thin green margin ACCURATELY. \n" "Save (replace) the color chart file.")); pp = zgetfile(TX("scanned color chart file"),MWIN,"file",printer_color_folder,1); if (! pp) return; strncpy0(scanchartfile,pp,200); f_open(scanchartfile); return; } // process the scanned and fixed color chart void calibprint::processchart() { using namespace calibprint; PIXBUF *chartpxb; GError *gerror = 0; uint8 *chartpixels, *pix1; FILE *fid; ch mapfile[200], *pp, *pp2; int chartrs, chartnc, px, py; int ii, nn, row, col, rx, gx, bx; int xlo, xhi, ylo, yhi; float fww, fhh; int Rsum, Gsum, Bsum, Rout, Gout, Bout; int r1, r2, ry, g1, g2, gy, b1, b2, by; int ERR1[NC][NC][NC][3], ERR2[NC][NC][NC][3]; zmessageACK(Mwin,TX("Open the trimmed color chart file")); pp = zgetfile(TX("trimmed color chart file"),MWIN,"file",printer_color_folder,1); if (! pp) return; strncpy0(scanchartfile,pp,200); chartpxb = gdk_pixbuf_new_from_file(scanchartfile,&gerror); // scanned chart without margins if (! chartpxb) { if (gerror) zmessageACK(Mwin,gerror->message); return; } chartww = gdk_pixbuf_get_width(chartpxb); charthh = gdk_pixbuf_get_height(chartpxb); chartpixels = gdk_pixbuf_get_pixels(chartpxb); chartrs = gdk_pixbuf_get_rowstride(chartpxb); chartnc = gdk_pixbuf_get_n_channels(chartpxb); fww = 1.0 * chartww / COLS; fhh = 1.0 * charthh / ROWS; for (row = 0; row < ROWS; row++) // loop each tile for (col = 0; col < COLS; col++) { ii = row * COLS + col; if (ii >= Ntiles) break; ylo = row * fhh; // tile position within chart image yhi = ylo + fhh; xlo = col * fww; xhi = xlo + fww; Rsum = Gsum = Bsum = nn = 0; for (py = ylo+fhh/5; py < yhi-fhh/5; py++) // get tile pixels less 20% margins for (px = xlo+fww/5; px < xhi-fww/5; px++) { pix1 = chartpixels + py * chartrs + px * chartnc; Rsum += pix1[0]; Gsum += pix1[1]; Bsum += pix1[2]; nn++; } Rout = Rsum / nn; // average tile RGB values Gout = Gsum / nn; Bout = Bsum / nn; rx = ii / NC2; gx = (ii - NC2 * rx) / NC; bx = ii - NC2 * rx - NC * gx; ERR1[rx][gx][bx][0] = Rout - RGBvals[rx]; // error = (scammed RGB) - (printed RGB) ERR1[rx][gx][bx][1] = Gout - RGBvals[gx]; ERR1[rx][gx][bx][2] = Bout - RGBvals[bx]; } g_object_unref(chartpxb); // anneal the error values to reduce randomness for (int pass = 1; pass <= 4; pass++) // 4 passes { for (rx = 0; rx < NC; rx++) // use neighbors in 3 channels for (gx = 0; gx < NC; gx++) for (bx = 0; bx < NC; bx++) { r1 = rx-1; r2 = rx+1; g1 = gx-1; g2 = gx+1; b1 = bx-1; b2 = bx+1; if (r1 < 0) r1 = 0; if (r2 > NC-1) r2 = NC-1; if (g1 < 0) g1 = 0; if (g2 > NC-1) g2 = NC-1; if (b1 < 0) b1 = 0; if (b2 > NC-1) b2 = NC-1; Rsum = Gsum = Bsum = nn = 0; for (ry = r1; ry <= r2; ry++) for (gy = g1; gy <= g2; gy++) for (by = b1; by <= b2; by++) { Rsum += ERR1[ry][gy][by][0]; Gsum += ERR1[ry][gy][by][1]; Bsum += ERR1[ry][gy][by][2]; nn++; } ERR2[rx][gx][bx][0] = Rsum / nn; ERR2[rx][gx][bx][1] = Gsum / nn; ERR2[rx][gx][bx][2] = Bsum / nn; } for (rx = 0; rx < NC; rx++) for (gx = 0; gx < NC; gx++) for (bx = 0; bx < NC; bx++) { ERR1[rx][gx][bx][0] = ERR2[rx][gx][bx][0]; ERR1[rx][gx][bx][1] = ERR2[rx][gx][bx][1]; ERR1[rx][gx][bx][2] = ERR2[rx][gx][bx][2]; } for (rx = 1; rx < NC-1; rx++) // use neighbors in same channel for (gx = 0; gx < NC; gx++) for (bx = 0; bx < NC; bx++) ERR2[rx][gx][bx][0] = 0.5 * (ERR1[rx-1][gx][bx][0] + ERR1[rx+1][gx][bx][0]); for (rx = 0; rx < NC; rx++) for (gx = 1; gx < NC-1; gx++) for (bx = 0; bx < NC; bx++) ERR2[rx][gx][bx][1] = 0.5 * (ERR1[rx][gx-1][bx][1] + ERR1[rx][gx+1][bx][1]); for (rx = 0; rx < NC; rx++) for (gx = 0; gx < NC; gx++) for (bx = 1; bx < NC-1; bx++) ERR2[rx][gx][bx][2] = 0.5 * (ERR1[rx][gx][bx-1][2] + ERR1[rx][gx][bx+1][2]); for (rx = 0; rx < NC; rx++) for (gx = 0; gx < NC; gx++) for (bx = 0; bx < NC; bx++) { ERR1[rx][gx][bx][0] = ERR2[rx][gx][bx][0]; ERR1[rx][gx][bx][1] = ERR2[rx][gx][bx][1]; ERR1[rx][gx][bx][2] = ERR2[rx][gx][bx][2]; } } // pass loop // save finished color map to user-selected file zmessageACK(Mwin,TX("Set the name for the output calibration file \n" "[your calibration name].dat")); snprintf(mapfile,200,"%s/%s",printer_color_folder,colormapfile); pp = zgetfile(TX("Color Map File"),MWIN,"save",mapfile,1); if (! pp) return; pp2 = strrchr(pp,'/'); zstrcopy(colormapfile,pp2+1,"calibrate printer"); save_params(); zfree(pp); snprintf(mapfile,200,"%s/%s",printer_color_folder,colormapfile); fid = fopen(mapfile,"w"); if (! fid) return; for (rx = 0; rx < NC; rx++) for (gx = 0; gx < NC; gx++) for (bx = 0; bx < NC; bx++) { fprintf(fid,"RGB: %3d %3d %3d ERR: %4d %4d %4d \n", RGBvals[rx], RGBvals[gx], RGBvals[bx], ERR2[rx][gx][bx][0], ERR2[rx][gx][bx][1], ERR2[rx][gx][bx][2]); } fclose(fid); return; } /**************************************************************************************/ // Quit menu function // Click on window [x] button (delete event) also comes here. // User can bail out if unsaved edit, open dialog, or running function. void m_quit(GtkWidget *, ch *) { int yn, ii; int Funsaved = 0; printf("m_quit \n"); if (CEF && CEF->Fmods && ! CEF->Fsaved) Funsaved = 1; // active edits unsaved if (URS_pos > 0 && URS_saved[URS_pos] == 0) Funsaved = 1; // completed edits unsaved if (Fmetamod) Funsaved = 1; // metadata edits unsaved if (Funsaved) { yn = zmessageYN(Mwin,TX("Discard unsaved edits?")); if (! yn) return; } if (Fbusy()) { // something is still running yn = zmessageYN(Mwin,TX("Kill busy function?")); if (! yn) return; Fescape = 1; // tell it to exit for (ii = 0; ii < 20; ii++) { // allow 2 secs. if (Fbusy()) zmainsleep(0.1); else break; } if (ii == 20) printf("*** busy function will be killed \n"); // still running } if (zfuncs::zdialog_count) { yn = zmessageYN(Mwin,TX("Kill active dialog?")); // allow user bailout if (! yn) return; } if (Faskquit) { // "ask to quit" option yn = zmessageYN(Mwin,TX("Quit Fotocx?")); if (! yn) return; } printf("Quit Fotocx\n"); quitxx(); // does not return } // used also for main window destroy event // does not return void quitxx() { Fshutdown = 1; Fescape = 1; // stop long-running funcs gtk_window_get_position(MWIN,&mwgeom[0],&mwgeom[1]); // save main window position and size gtk_window_get_size(MWIN,&mwgeom[2],&mwgeom[3]); // for next session zdialog_inputs("save"); // save dialog inputs zdialog_geometry("save"); // save dialogs position/size gallery_memory("save"); // save recent gallery positions free_resources(); // free memory zshell(0,"rm -R -f %s",temp_folder); // delete temp files save_params(); // save state for next session fflush(null); // flush stdout, stderr zexit(0,"Fotocx exit"); } /**************************************************************************************/ // uninstall fotocx from either /usr/bin etc. or $HOME/.local/bin etc. void m_uninstall(GtkWidget *, ch *) { zdialog *zd; ch *pp, baseloc[300]; ch text[200]; int cc; F1_help_topic = TX("HELP MENU"); printf("m_uninstall \n"); cc = readlink("/proc/self/exe",baseloc,300); // get own program path if (cc <= 0) { // [baseloc]/bin/fotocx zmessageACK(Mwin,"cannot get /proc/self/exe"); return; } baseloc[cc] = 0; pp = strstr(baseloc,"/bin/"); if (pp) *(pp+1) = 0; snprintf(text,200,"Delete fotocx program files: \n" "$ sudo find %s -path \"*fotocx*\" -type l,f,d -delete \n" "\n" "Delete fotocx user data: \n" "$ rm -f -d -R %s", baseloc, get_zhomedir()); zd = zdialog_new(TX("copy and paste commands"),Mwin,"X",null); zdialog_add_widget(zd,"text","text","dialog",text,"space=3"); zdialog_run(zd,0,"parent"); zdialog_wait(zd); zdialog_free(zd); return; } /**************************************************************************************/ // help menu functions void show_help(ch *topic) // 26.5 { showz_docfile(Mwin,UG_file,topic); return; } void m_help(GtkWidget *, ch *menu) { printf("m_help \n"); F1_help_topic = TX("HELP MENU"); if (! *menu) { show_help(TX("HELP MENU")); return; } if (strmatch(menu,TX("User Guide"))) show_help(0); if (strmatch(menu,TX("Video Tutorial"))) zshell("log ack","xdg-open https://youtu.be/F5Kwnr4TrwM"); if (strmatch(menu,TX("Outboard Programs"))) check_outboards(1); if (strmatch(menu,TX("Show Log File"))) { // 26.0 if (! isatty(fileno(stdin))) showz_logfile(Mwin); else zmessageACK(Mwin,TX("log file is in a terminal")); } if (strmatch(menu,TX("Command Params"))) show_help(TX("COMMAND PARAMETERS")); if (strmatch(menu,TX("Change Log"))) showz_textfile("doc","changelog",Mwin); if (strmatch(menu,TX("Copyright"))) showz_textfile("doc","copyright",Mwin); if (strmatch(menu,TX("Licenses"))) showz_textfile("doc","licenses",Mwin); if (strmatch(menu,TX("Privacy"))) show_help(TX("PRIVACY")); if (strmatch(menu,TX("About"))) zabout(Mwin); if (strmatch(menu,TX("Home Page"))) zshell("log ack","xdg-open https://kornelix.net"); if (strmatch(menu,TX("Uninstall"))) m_uninstall(0,0); return; } /**************************************************************************************/ // save (modified) image file to disk void m_file_save(GtkWidget *, ch *menu) { int file_save_dialog_event(zdialog *zd, ch *event); ch *pp; zdialog *zd; F1_help_topic = TX("FILE SAVE"); printf("m_file_save \n"); if (FGM != 'F' && FGM != 'G') return; if (! curr_file) { zmessageACK(Mwin,TX("no current file")); if (zd_filesave) zdialog_free(zd_filesave); zd_filesave = 0; return; } if (strmatch(curr_file_type,"other")) // if unsupported type, use jpg strcpy(curr_file_type,"jpg"); /*** _______________________________________________ | Save Image File | | | | filename.jpg | | | | [new version] save as new file version | | [new file ...] save as new file name or type | | [replace file] replace file (OVERWRITE) | | | | [X] | |_______________________________________________| ***/ if (! zd_filesave) { zd = zdialog_new(TX("Save Image File"),Mwin,"X",null); zd_filesave = zd; zdialog_add_widget(zd,"hbox","hbf","dialog",0,"space=3"); zdialog_add_widget(zd,"label","filename","hbf",0,"space=10"); zdialog_add_widget(zd,"hbox","hb0","dialog"); zdialog_add_widget(zd,"vbox","vb1","hb0",0,"space=3|homog"); zdialog_add_widget(zd,"vbox","vb2","hb0",0,"space=5|homog"); zdialog_add_widget(zd,"button","newvers","vb1",TX("new version")); zdialog_add_widget(zd,"button","newfile","vb1",TX("new file ...")); zdialog_add_widget(zd,"button","replace","vb1",TX("replace file")); zdialog_add_widget(zd,"hbox","hb1","vb2"); zdialog_add_widget(zd,"hbox","hb2","vb2"); zdialog_add_widget(zd,"hbox","hb3","vb2"); zdialog_add_widget(zd,"label","labvers","hb1",TX("save as new file version")); zdialog_add_widget(zd,"label","labfile","hb2",TX("save as new file name or type")); zdialog_add_widget(zd,"icon","warning","hb3","warning.png","size=30"); zdialog_add_widget(zd,"label","labrepl","hb3",TX("replace old file (OVERWRITE)"),"space=3"); } zd = zd_filesave; pp = strrchr(curr_file,'/'); if (pp) zdialog_stuff(zd,"filename",pp+1); zdialog_run(zd,file_save_dialog_event,"mouse"); return; } // dialog event and completion function int file_save_dialog_event(zdialog *zd, ch *event) { ch *RP = 0, *newfilename = 0; ch temp[8]; int err; if (zd->zstat) goto retx; // cancel if (! zstrstr("newvers newfile replace",event)) return 1; // ignore other events if (strmatch(event,"newvers")) // save as new version { RP = f_realpath(curr_file); // use real path if (! RP) { zmessageACK(Mwin,TX("file not found: %s"),curr_file); goto retx; } newfilename = file_new_version(RP); // get next avail. file version name if (! newfilename) goto retx; if (strmatch(curr_file_type,"RAW")) // if RAW file, save as 16-bit TIFF err = f_save(newfilename,"tif",16,0,1); else if (strcasestr("jp2 heic avif webp",curr_file_type)) // save these types as jpg err = f_save(newfilename,"jpg",8,0,1); else if (strcasestr("pdf ps eps",curr_file_type)) // if pdf/ps/eps, save as jpg err = f_save(newfilename,"jpg",8,0,1); else err = f_save(newfilename,curr_file_type,curr_file_bpc,0,1); // save with same file type if (! err) f_open_saved(); // open saved file with edit hist goto retx; } if (strmatch(event,"replace")) // replace current file { if (strcasestr("RAW jp2 heic avif webp pdf ps eps",curr_file_type)) { strToUpper(temp,curr_file_type); zmessageACK(Mwin,TX("cannot replace %s file"),temp); goto retx; } RP = f_realpath(curr_file); // use real path if (! RP) { zmessageACK(Mwin,TX("file not found: %s"),curr_file); goto retx; } err = f_save(RP,curr_file_type,curr_file_bpc,0,1); // save with current edits if (! err) f_open_saved(); // open saved file with edit hist goto retx; } if (strmatch(event,"newfile")) err = f_save_as(); // save-as file chooser dialog retx: if (RP) zfree(RP); if (newfilename) zfree(newfilename); zdialog_free(zd); // kill dialog zd_filesave = 0; return 1; } // menu entry for KB shortcut Save File (replace) void m_file_save_replace(GtkWidget *, ch *menu) { int err; ch *RP; printf("m_file_save_replace \n"); RP = f_realpath(curr_file); // use real path if (! RP) { zmessageACK(Mwin,TX("file not found: %s"),curr_file); return; } err = f_save(RP,curr_file_type,curr_file_bpc,0,1); // save file if (! err) f_open_saved(); // open saved file with edit hist zfree(RP); return; } // menu entry for KB shortcut Save File Version void m_file_save_version(GtkWidget *, ch *menu) { ch *newfilename = 0, *RP = 0; ch newfiletype[8]; int err; printf("m_file_save_version \n"); RP = f_realpath(curr_file); // use real path if (! RP) { zmessageACK(Mwin,TX("file not found: %s"),curr_file); return; } strncpy0(newfiletype,curr_file_type,6); newfilename = file_new_version(RP); // get next avail. file version name if (! newfilename) goto retx; err = f_save(newfilename,newfiletype,curr_file_bpc,0,1); // save file if (! err) f_open_saved(); // open saved file with edit hist retx: if (RP) zfree(RP); if (newfilename) zfree(newfilename); return; } /**************************************************************************************/ // Save current image to specified file (same or new). // Update image index file and thumbnail file. // Set f_save_type, f_save_bpc, f_save_size // Returns 0 if OK, else +N. // If Fack is true, failure will cause a popup ACK dialog. int f_save(ch *outfile, ch *outype, int outbpc, int qual, int Fack) { ch *metatag[5], *metadata[5]; ch *ppv[1], *tempfile, *pext, *RP; int ntags, err, cc1, cc2, cc3, ii, yn; int Fmod, Fcopy, Ftransp, Fnewfile; int px, py; STATB statB; ch *warnalpha = TX("Transparency map will be lost \n" "(save as TIFF|PNG|JXL to retain) \n" // jxl "Save anyway?"); if (! curr_file) return 1; if (strmatch(outype,"RAW")) { // disallow saving as RAW type zmessageACK(Mwin,TX("cannot save as RAW type")); return 1; } Fmod = 0; if (! qual) qual = jpeg_def_quality; // use default jpeg compression if (CEF) { // edit function active if (CEF->Fmods) Fmod = 1; // active edits pending if (CEF->zd) zdialog_send_event(CEF->zd,"done"); // tell it to finish if (CEF) return 1; // failed (HDR etc.) } if (URS_pos > 0 && URS_saved[URS_pos] == 0) Fmod = 1; // completed edits not yet saved if (strmatch(outfile,curr_file)) Fnewfile = 0; // replace current file else Fnewfile = 1; // new file (folder/filename/ext change) if (! Fnewfile) { err = access(outfile,W_OK); // test file can be written by me if (err) { zmessageACK(Mwin,"%s: %s",TX("no write permission"),outfile); return 1; } } RP = f_realpath(outfile); // resolve symlinks in file path if (! RP) { zmessageACK(Mwin,TX("file not found: %s"),outfile); return 2; } tempfile = zstrdup(RP,"f_save",8); // add space for new extension zfree(RP); RP = tempfile; if (Fnewfile) { // if new file, get .ext from caller pext = strrchr(RP,'/'); if (pext) pext = strrchr(pext,'.'); if (! pext) pext = RP + strlen(RP); pext[0] = '.'; strcpy(pext+1,outype); } if (! Fnewfile && ! Fmod) { // no edit changes to file Fcopy = 1; // direct copy to output file? if (E0pxm) Fcopy = 0; // no, non-edit change (upright) if (curr_file_bpc != outbpc) Fcopy = 0; // no, BPC change if (qual < jpeg_def_quality) Fcopy = 0; // no, higher compression wanted if (Fcopy) { err = cp_copy(curr_file,RP); // copy unchanged file to output if (! err) goto updateindex; zmessageACK(Mwin,strerror(err)); zfree(RP); return 1; } } if (! E0pxm) { E0pxm = PXM_load(curr_file,1); // no prior edits, load image file if (! E0pxm) { zfree(RP); return 1; } } tempfile = zstrdup(RP,"f_save",20); // temp file in same folder strcat(tempfile,"-fotocx-temp."); strcat(tempfile,outype); if (E0pxm->nc == 4 && ! strstr("tif png jxl",outype)) // alpha channel will be lost jxl { Ftransp = 0; for (py = 2; py < E0pxm->hh-2; py += 2) // ignore extreme edges for (px = 2; px < E0pxm->ww-2; px += 2) if (PXMpix(E0pxm,px,py)[3] < 250) { Ftransp = 1; goto breakout; } breakout: // warn transparency lost if (Ftransp) { yn = zmessageYN(Mwin,warnalpha); // 25.0 if (! yn) { remove(tempfile); // user canceled zfree(tempfile); zfree(RP); return 0; } } } if (! strstr("tif png jxl",outype)) outbpc = 8; // force bpc 8 if 16 not supported jxl err = PXM_save(E0pxm,tempfile,outbpc,qual,Fack); if (err) { remove(tempfile); // failure, clean up zfree(tempfile); zfree(RP); return 1; } cc1 = 0; // meta_edithist[] text cc if (Fmeta_edithist) cc1 = meta_edithist_cc0; // meta_edithist at file open else { metatag[0] = (ch *) meta_edithist_tag; meta_get(curr_file,metatag,ppv,1); // get edits made before if (ppv[0]) { // this file was opened strncpy0(meta_edithist,ppv[0],metadataXcc-2); zfree(ppv[0]); cc1 = strlen(meta_edithist); meta_edithist_cc0 = cc1; // edit hist cc when file was opened } // (not updated for new edits) Fmeta_edithist = 1; // history is loaded } for (ii = 1; ii <= URS_pos; ii++) // append edits from undo/redo stack { // (omit index 0 = initial image) cc2 = strlen(URS_menu[ii]); cc3 = strlen(URS_parms[ii]); if (cc1 + 7 + cc2 + cc3 + 5 > metadataXcc) break; // no more room strcpy(meta_edithist+cc1,Frelease); cc1 += strlen(Frelease); // append "Fotocx-nn.n: Menu: parms|" strcpy(meta_edithist+cc1,": "); cc1 += 2; strcpy(meta_edithist+cc1,URS_menu[ii]); cc1 += cc2; if (cc3) { strcpy(meta_edithist+cc1,": "); cc1 += 2; strcpy(meta_edithist+cc1,URS_parms[ii]); cc1 += cc3; } meta_edithist[cc1++] = '|'; } if (CEF && CEF->Fmods) // append active edit function { cc2 = strlen(CEF->menuname); cc3 = strlen(CEF->edit_hist); if (cc1 + 7 + cc2 + cc3 + 5 < metadataXcc) { strcpy(meta_edithist+cc1,"Fotocx:"); cc1 += 7; // append "Fotocx:Menu:parms|" strcpy(meta_edithist+cc1,CEF->menuname); if (cc3) { cc1 += cc2; strcpy(meta_edithist+cc1,": "); cc1 += 2; strcpy(meta_edithist+cc1,CEF->edit_hist); cc1 += cc3; } meta_edithist[cc1++] = '|'; } } meta_edithist[cc1] = 0; ntags = 0; if (Fupright) { // image was uprighted Fupright = 0; metatag[ntags] = meta_orientation_tag; // orientation = upright metadata[ntags] = "1"; ntags++; } if (Flevel) { // image was levelled Flevel = 0; metatag[ntags] = meta_rollangle_tag; // rollangle = 0 metadata[ntags] = "0"; ntags++; } if (cc1) { // prior and/or curr. edit history metatag[ntags] = meta_edithist_tag; // add to metadata metadata[ntags] = meta_edithist; ntags++; } err = meta_copy(curr_file,tempfile,metatag,metadata,ntags); // copy all metadata to if (err) { // temp file with above revisions if (Fack) zmessageACK(Mwin,TX("Unable to copy metadata")); // bugfix: do this even if ntags=0 26.1 else printf("Unable to copy metadata \n"); } err = rename(tempfile,RP); // rename temp file to output file if (err) { if (Fack) zmessageACK(Mwin,strerror(err)); remove(tempfile); // delete temp file zfree(tempfile); zfree(RP); return 2; // could not save } zfree(tempfile); // free memory for (ii = 0; ii <= URS_pos; ii++) // mark all prior edits as saved URS_saved[ii] = 1; if (CEF && Fmod) CEF->Fsaved = 1; // current edit is saved updateindex: file_to_xxrec(RP); // update xxrec_tab[] and thumbnail add_recent_file(RP); // first in recent files list zstrcopy(f_save_file,RP,"f_save"); // for f_open_saved() err = stat(curr_file,&statB); // get current file permissions chmod(RP,statB.st_mode); // set permissions for output file stat(RP,&statB); // set output file size, type, bit depth f_save_size = statB.st_size; strcpy(f_save_type,outype); f_save_bpc = outbpc; if (strmatch(curr_file,RP)) // curr. file is being overwritten if (zd_metaview) meta_view(0); // view meta dialog active if (CEF && CEF->menufunc) CEF->menufunc(0,0); // restart edit function zfree(RP); return 0; } /**************************************************************************************/ // save (modified) image to new file name or type // confirm if overwrite of existing file // returns 0 if OK, 1 if cancel or error GtkWidget *saveas_fchooser; int f_save_as() { int f_save_as_dialog_event(zdialog *zd, ch *event); zdialog *zd; ch *save_folder = 0; ch *type; ch *newfile, *fname; ch *outfile = 0, *outfile2 = 0, *pp, *pext; ch permissions[100]; int ii, zstat, err, bpc; int jpgqual = jpeg_def_quality; int mkcurr = 0; STATB statB; mode_t mode; /*** ________________________________________________________ | Save as New File Name or Type | | ___________________________________________________ | | | | | | | file chooser dialog | | | | | | | | | | | | | | | | | | | | | | | |___________________________________________________| | | | | (o) tif (o) png (o) jxl (o) jpg [90] quality | // jxl | color depth: (o) 8-bit (o) 16-bit | | [x] open as new current file | | permissions: [___________________] [change] | | | | [Save] [X] | |________________________________________________________| ***/ zd = zdialog_new(TX("Save as new file name or type"),Mwin,TX("Save"),"X",null); zdialog_add_widget(zd,"hbox","hbfc","dialog",0,"expand"); saveas_fchooser = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_SAVE); gtk_container_add(GTK_CONTAINER(zdialog_gtkwidget(zd,"hbfc")),saveas_fchooser); zdialog_add_widget(zd,"vbox","space","dialog",0,"space=3"); zdialog_add_widget(zd,"hbox","hbft","dialog"); zdialog_add_widget(zd,"radio","tif","hbft","tif","space=4"); zdialog_add_widget(zd,"radio","png","hbft","png","space=4"); zdialog_add_widget(zd,"radio","jxl","hbft","jxl","space=4"); // jxl zdialog_add_widget(zd,"radio","jpg","hbft","jpg","space=4"); zdialog_add_widget(zd,"zspin","jpgqual","hbft","10|100|1|90","size=3"); zdialog_add_widget(zd,"label","labqual","hbft",TX("quality"),"space=4"); zdialog_add_widget(zd,"hbox","hbcd","hbft"); zdialog_add_widget(zd,"label","space","hbcd","","space=12"); zdialog_add_widget(zd,"label","labdepth","hbcd",TX("color depth:"),"space=3"); zdialog_add_widget(zd,"radio","8-bit","hbcd","8-bit","space=4"); zdialog_add_widget(zd,"radio","16-bit","hbcd","16-bit","space=4"); zdialog_add_widget(zd,"hbox","hbmc","dialog"); zdialog_add_widget(zd,"check","mkcurr","hbmc",0,"space=8"); zdialog_add_widget(zd,"label","labmc","hbmc",TX("open as new current file")); zdialog_add_widget(zd,"hbox","hbperm","dialog"); zdialog_add_widget(zd,"label","labperm","hbperm",TX("permissions:"),"space=8"); zdialog_add_widget(zd,"label","permissions","hbperm"); zdialog_add_widget(zd,"button","change","hbperm",TX("Change"),"space=8"); save_folder = f_realpath(curr_file); // use real path if (! save_folder) save_folder = zstrdup(curr_file,"file-save"); pp = strrchr(save_folder,'/'); if (pp) *pp = 0; gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(saveas_fchooser),save_folder); zfree(save_folder); newfile = zstrdup(curr_file,"file-save"); fname = strrchr(newfile,'/') + 1; gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(saveas_fchooser),fname); zfree(newfile); zdialog_stuff(zd,"tif",0); // no file type selected zdialog_stuff(zd,"png",0); zdialog_stuff(zd,"png",0); zdialog_stuff(zd,"jxl",0); // jxl zdialog_stuff(zd,"8-bit",0); zdialog_stuff(zd,"16-bit",0); zdialog_stuff(zd,"jpgqual",jpeg_def_quality); // default jpeg quality, user setting if (strmatch(curr_file_type,"tif")) { // if curr. file type is tif, zdialog_stuff(zd,"tif",1); // set corresp. type and bit depth if (curr_file_bpc == 16) zdialog_stuff(zd,"16-bit",1); else zdialog_stuff(zd,"8-bit",1); } else if (strmatch(curr_file_type,"png")) { // same for png zdialog_stuff(zd,"png",1); if (curr_file_bpc == 16) zdialog_stuff(zd,"16-bit",1); else zdialog_stuff(zd,"8-bit",1); } else if (strmatch(curr_file_type,"jxl")) { // same for jxl zdialog_stuff(zd,"jxl",1); if (curr_file_bpc == 16) zdialog_stuff(zd,"16-bit",1); else zdialog_stuff(zd,"8-bit",1); } else { // same for jpg zdialog_stuff(zd,"jpg",1); zdialog_stuff(zd,"8-bit",1); } zdialog_stuff(zd,"mkcurr",1); // "make current" is default err = stat(curr_file,&statB); // current file permissions conv_permissions(statB.st_mode,permissions); // >> default new file permissions zdialog_stuff(zd,"permissions",permissions); zdialog_resize(zd,700,500); zdialog_run(zd,f_save_as_dialog_event,"parent"); zdialog_wait: zstat = zdialog_wait(zd); if (zstat != 1) { // user cancel zdialog_free(zd); return 1; } outfile2 = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(saveas_fchooser)); if (! outfile2) { zd->zstat = 0; goto zdialog_wait; } zstrcopy(outfile,outfile2,"f_save_as",12); // add space for possible .vNN and .ext g_free(outfile2); type = ""; bpc = -1; zdialog_fetch(zd,"tif",ii); // get selected file type if (ii) type = "tif"; zdialog_fetch(zd,"png",ii); if (ii) type = "png"; zdialog_fetch(zd,"jxl",ii); // jxl if (ii) type = "jxl"; zdialog_fetch(zd,"jpg",ii); if (ii) type = "jpg"; zdialog_fetch(zd,"8-bit",ii); // get selected color depth if (ii) bpc = 8; zdialog_fetch(zd,"16-bit",ii); if (ii) bpc = 16; if (! strstr("tif png jxl jpg",type)) goto zdialog_wait; // should not happen jxl if (bpc != 8 && bpc != 16) goto zdialog_wait; if (strmatch(type,"jpg") && bpc != 8) goto zdialog_wait; zdialog_fetch(zd,"jpgqual",jpgqual); // jpeg compression level pext = strrchr(outfile,'/'); // locate file .ext if (pext) pext = strrchr(pext,'.'); if (pext) { // validate .ext OK for type if (strmatch(type,"jpg") && ! strcasestr(".jpg .jpeg",pext)) *pext = 0; if (strmatch(type,"tif") && ! strcasestr(".tif .tiff",pext)) *pext = 0; if (strmatch(type,"png") && ! strcasestr(".png",pext)) *pext = 0; if (strmatch(type,"jxl") && ! strcasestr(".jxl",pext)) *pext = 0; // jxl } if (! pext || ! *pext) { pext = outfile + strlen(outfile); // wrong or missing, add new .ext *pext = '.'; // NO replace .JPG with .jpg etc. strcpy(pext+1,type); } zdialog_fetch(zd,"mkcurr",mkcurr); // get make current option if (regfile(outfile)) { // check if file exists int yn = zmessageYN(Mwin,TX("Overwrite file? \n%s"),outfile); // confirm overwrite if (! yn) { zd->zstat = 0; goto zdialog_wait; } } zdialog_fetch(zd,"permissions",permissions,100); // get permissions from dialog conv_permissions(permissions,mode); zdialog_free(zd); // zdialog_free(zd); err = f_save(outfile,type,bpc,jpgqual,1); // save the file if (err) { zfree(outfile); return 1; } chmod(outfile,mode); // set permissions if (samefolder(outfile,navi::galleryname)) { // if saving into current gallery gallery(outfile,"init",0); // refresh gallery list gallery(0,"sort",-2); // recall sort and position curr_file_posn = file_position(curr_file,curr_file_posn); // update curr. file position set_mwin_title(); // update window title (file count) } if (mkcurr) f_open_saved(); // open saved file with edit hist zfree(outfile); return 0; } // dialog event and completion function int f_save_as_dialog_event(zdialog *zd, ch *event) { int ii, err; ch *filespec, *filename, *pp; ch oldperms[100], newperms[100]; ch ext[4]; if (zd->zstat) return 1; // [save] or cancel if (strmatch(event,"jpgqual")) { // if jpg quality edited, set jpg .ext zdialog_stuff(zd,"jpg",1); event = "jpg"; } if (zstrstr("tif png jxl jpg",event)) { // file type selection jxl zdialog_stuff(zd,"tif",0); // turn off all types zdialog_stuff(zd,"png",0); zdialog_stuff(zd,"jxl",0); // jxl zdialog_stuff(zd,"jpg",0); zdialog_stuff(zd,event,1); // turn on selected type } if (zstrstr("8-bit 16-bit",event)) { // color depth selection zdialog_stuff(zd,"8-bit",0); // turn off all depths zdialog_stuff(zd,"16-bit",0); zdialog_stuff(zd,event,1); // turn on selected depth } zdialog_fetch(zd,"jpg",ii); // if jpg, force 8-bit if (ii) { zdialog_stuff(zd,"16-bit",0); zdialog_stuff(zd,"8-bit",1); } zdialog_fetch(zd,"jxl",ii); // if jxl, force 16-bit jxl if (ii) { zdialog_stuff(zd,"8-bit",0); zdialog_stuff(zd,"16-bit",1); } zdialog_fetch(zd,"tif",ii); // get chosen file type "tif" ... if (ii) strcpy(ext,"tif"); // set corresp. extension ".tif" ... zdialog_fetch(zd,"png",ii); if (ii) strcpy(ext,"png"); zdialog_fetch(zd,"jxl",ii); // jxl if (ii) strcpy(ext,"jxl"); zdialog_fetch(zd,"jpg",ii); if (ii) strcpy(ext,"jpg"); filespec = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(saveas_fchooser)); if (! filespec) return 1; filename = strrchr(filespec,'/'); // revise file .ext in chooser dialog if (! filename) return 1; filename = zstrdup(filename+1,"file-save",6); pp = strrchr(filename,'.'); if (! pp || strlen(pp) > 5) pp = filename + strlen(filename); *pp = '.'; strcpy(pp+1,ext); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(saveas_fchooser),filename); zfree(filename); g_free(filespec); if (strmatch(event,"change")) { // change saved file permissions zdialog_fetch(zd,"permissions",oldperms,100); err = set_permissions(zd->dialog,"",oldperms,newperms); if (! err) zdialog_stuff(zd,"permissions",newperms); } return 1; } /**************************************************************************************/ // get real path for filename possibly having symlinks // all folders in input filename path must exist // final file name need not exist (f_save() caller) // returns real path or null if error // returned path is subject for zfree() ch * f_realpath(ch * infile) { int cc; ch *pp, *RP, *outfile; ch tempfile[XFCC]; RP = realpath(infile,null); // try full file path if (RP) { outfile = zstrdup(RP,"realpath"); // OK free(RP); return outfile; } strcpy(tempfile,infile); // fail, try folders only pp = strrchr(tempfile + 2,'/'); if (! pp) return 0; *pp = 0; RP = realpath(tempfile,null); *pp = '/'; if (! RP) return 0; // fail cc = strlen(pp); // return folders/file outfile = zstrdup(RP,"realpath",cc+2); strcat(outfile,pp); free(RP); return outfile; } /**************************************************************************************/ // get the root name of an image file, without version and extension // /.../filename.V03.jpg --> /.../filename // returned root name has extra length to add .vNN.exxxxt // returned root name is subject for zfree() ch * file_rootname(ch *file) { ch *rootname, *pp1, *pp2; rootname = zstrdup(file,"rootname",16); pp1 = strrchr(rootname,'/'); // find file .ext if (! pp1) pp1 = rootname; pp2 = strrchr(pp1,'.'); // pp2 --> .ext or ending null if (! pp2) pp2 = pp1 + strlen(pp1); if (pp2[-4] == '.' && pp2[-3] == 'v' && // look for .vNN.ext pp2[-2] >= '0' && pp2[-2] <= '9' && pp2[-1] >= '0' && pp2[-1] <= '9') pp2 -= 4; // pp2 --> .ext or .vNN.ext *pp2 = 0; // pp2 --> new ending null return rootname; } /**************************************************************************************/ // return base name for given file = original file name /.../filename.ext // returns null if base file does not exist. // returned base name has extra length to add .vNN.exxxxt // returned base name is subject for zfree() ch * file_basename(ch *file) { ch *rootname, **flist, *pp = 0; int ii, cc, nf; flist = file_all_versions(file,nf); // get base file and all versions if (! nf) return 0; rootname = file_rootname(file); cc = strlen(rootname); zfree(rootname); for (ii = 0; ii < nf; ii++) { pp = flist[ii]; if (strmatchN(pp+cc,".v",2)) continue; if (pp[cc] == '.') break; } if (ii < nf) pp = zstrdup(pp,"basename",16); else pp = 0; for (ii = 0; ii < nf; ii++) zfree(flist[ii]); zfree(flist); return pp; } /**************************************************************************************/ // Get all versions of a given file name in sequence, including base file. // Returned list of file names is subject for zfree() // (each returned flist[*] member and flist itself) // returns null if nothing found ch ** file_all_versions(ch *file, int &NF) { int file_comp_versions(ch *f1, ch *f2); ch **flist1, **flist2, *rootname; ch *pext, *pvers; int ii, jj, err, cc1, cc2; rootname = file_rootname(file); // /.../fname.vNN.ext --> /.../fname if (! rootname) return 0; cc1 = strlen(rootname); // file cc without .vNN.ext strcpy(rootname + cc1,".*"); err = zfind(rootname,flist1,NF); // find /.../fname.* zfree(rootname); if (err || NF < 1) return 0; flist2 = (ch **) zmalloc(NF * sizeof(ch *),"file-vers"); // scan for valid versions for (ii = jj = 0; ii < NF; ii++) // validate fname.ext or fname.vNN.ext { if (image_file_type(flist1[ii]) > VIDEO) continue; // not image file pext = strrchr(flist1[ii],'.'); // get file .ext if (! pext) continue; cc2 = pext - flist1[ii]; // file cc without .ext if (cc2 > cc1) { // version present? .vNN.ext cc2 -= 4; pvers = flist1[ii] + cc2; if (strncmp(pvers,".v01",4) < 0) continue; // not valid version if (strncmp(pvers,".v99",4) > 0) continue; } flist2[jj++] = flist1[ii]; // valid version, add to list } zfree(flist1); NF = jj; if (NF == 0) { zfree(flist2); return 0; } if (NF == 1) return flist2; if (NF > 99) { // screen out problem file zmessageACK(Mwin,TX("file: %s \nexceed 99 versions"),file); zfree(flist2); return 0; } HeapSort(flist2,NF,file_comp_versions); // sort in base, version order return flist2; } int file_comp_versions(ch *f1, ch *f2) { f1 = strrchr(f1,'.'); // find .ext in file f1 if (! f1) return -1; // f1 has no .ext f2 = strrchr(f2,'.'); if (! f2) return +1; // f2 has no .ext f1 -= 4; // point to '.v' in filename.vNN.ext if (! strmatchN(f1,".v",2)) return -1; // f1 not a version f2 -= 4; if (! strmatchN(f2,".v",2)) return +1; // f2 not a version return strcmp(f1,f2); // compare versions } /**************************************************************************************/ // Get next available version /.../filename.vNN.ext for given file. // Returns "/.../filename.v01.ext" if no versions are found. // Returns null if bad file name or 99 versions already exist. // Returned file name is subject for zfree(). ch * file_new_version(ch *file) { ch *retname, *pp, pext[8]; ch **flist = 0; int ii, cc, NF = 0, vers; pp = (ch *) strrchr(file,'/'); // find .ext for file if (! pp) return 0; pp = strrchr(pp,'.'); if (pp) strncpy0(pext,pp,8); else strcpy(pext,".jpg"); if (strcasestr(".jp2 .heic .avif .webp",pext)) // replace these types with .jpg strcpy(pext,".jpg"); flist = file_all_versions(file,NF); // get base file and all versions if (! NF) { // nothing exists retname = file_rootname(file); // get /.../filename retname = zstrdup(retname,"new-version",12); cc = strlen(retname); strcpy(retname+cc,".v01"); // return /.../filename.v01.ext strcpy(retname+cc+4,pext); return retname; } retname = zstrdup(flist[NF-1],"new-version",12); // get last version found for (ii = 0; ii < NF; ii++) // free memory zfree(flist[ii]); zfree(flist); pp = strrchr(retname,'/'); // find .ext if (! pp) return 0; pp = strrchr(pp,'.'); if (! pp) { // none strcat(retname,"v.01.jpg"); // return /.../filename.v01.jpg return retname; } if (strmatchN(pp-4,".v",2)) { // find /.../filename.vNN.ext if (pp[-2] >= '0' && pp[-2] <= '9' && // | pp[-1] >= '0' && pp[-1] <= '9') // pp { vers = 10 * (pp[-2] - '0') + pp[-1] - '0'; if (vers >= 99) { zmessageACK(Mwin,TX("file: %s \nexceed 99 versions"),file); return 0; } vers++; // add 1 to .vNN, leave same .ext pp[-2] = vers/10 + '0'; pp[-1] = vers - 10 * (vers/10) + '0'; return retname; // return /.../filename.vNN.ext } } strncpy0(pext,pp,8); // keep .ext strcpy(pp,".v01"); // return /.../filename.v01.ext strcpy(pp+4,pext); return retname; } /**************************************************************************************/ // Get the newest version /.../filename.vNN.ext for the given file. // Returns unversioned file /.../filename.ext if found by itself. // Returns null if bad file name. // Returned file name is subject for zfree(). ch * file_newest_version(ch *file) { ch *retname; ch **flist; int ii, NF; flist = file_all_versions(file,NF); // get base file and all versions if (! NF) return 0; retname = zstrdup(flist[NF-1],"newest-version",12); // get last version found for (ii = 0; ii < NF; ii++) // free memory zfree(flist[ii]); zfree(flist); return retname; } /**************************************************************************************/ // Get the prior version /.../filename.vNN.ext for the given file. // Returns unversioned file /.../filename.ext if no prior .vNN found. // Returns null if bad file name or no prior version. ch * file_prior_version(ch *file) { ch *retname; ch **flist; int ii, NF; flist = file_all_versions(file,NF); // get base file and all versions if (! NF) return 0; for (ii = 0; ii < NF; ii++) // find input file in list if (strmatch(file,flist[ii])) break; if (ii == 0) return 0; // input is base file (no prior) if (ii == NF) return 0; // should not happen retname = zstrdup(flist[ii-1],"prior-version"); // prior file in list for (ii = 0; ii < NF; ii++) // free memory zfree(flist[ii]); zfree(flist); return retname; } /************************************************************************************** Find all image files under given path. int find_imagefiles(ch *folder, int flags, ch **&flist, int &NF) folder folder path to search flags sum of the following: 1 include image files (+RAW +video) 2 include thumbnails 8 include folders 16 recurse folders 32 include symlinks flist list of files returned NF count of files returned Returns 0 if OK, +N if error (errno is set). flist and flist[*] are subjects for zfree(). command: "find -L -type f" all files under folder "find -L maxdepth 1 -type f" only next level files "find -L -type f,d" include folders ***************************************************************************************/ int find_imagefiles(ch *folder, int flags, ch **&flist, int &Nf) // 25.1 { static ch **fif_filelist; // list of filenames returned int fif_max; // filelist slots allocated int fif_count; // filelist slots filled FILE *fid; int Fimages = 0, Fthumbs = 0, Fdirs = 0; int Frecurse = 0, Fsymlinks = 0; int cc, ftype; ch command[XFCC+100]; // max file cc + 100 ch *pp, file[XFCC]; ch **templist; fif_count = fif_max = 0; if (flags & 1) Fimages = 1; if (flags & 2) Fthumbs = 1; if (flags & 8) Fdirs = 1; if (flags & 16) Frecurse = 1; if (flags & 32) Fsymlinks = 1; Nf = 0; // empty output flist = 0; strcpy(command,"find "); // build command line if (Fsymlinks) strcat(command,"-L "); // include symlinks strncatv(command,XFCC,"\"",folder,"\" ",null); // "folder" to search if (! Frecurse) strcat(command,"-maxdepth 1 "); // no recurse folders if (Fimages && Fdirs) strcat(command,"-type f,d "); // include files and folders else if (Fimages) strcat(command,"-type f "); // include files only else if (Fdirs) strcat(command,"-type d "); // include folders only fid = popen(command,"r"); if (! fid) return errno; while (true) { pp = fgets_trim(file,XFCC,fid); // get next file if (! pp) break; // EOF or error ftype = image_file_type(file); if (ftype == OTHER) continue; // unknown file type if (ftype == FDIR && strmatch(file,folder)) continue; // don't include input folder if ((ftype == IMAGE || ftype == RAW || ftype == VIDEO) && ! Fimages) continue; if (ftype == THUMB && ! Fthumbs) continue; if (ftype == FDIR && ! Fdirs) continue; if (fif_count == fif_max) // output list is full { if (fif_max == 0) { fif_max = 1000; // initial space, 1000 files cc = fif_max * sizeof(ch *); fif_filelist = (ch **) zmalloc(cc,"find_imagefiles"); } else { templist = fif_filelist; // expand by 2x each time needed cc = fif_max * sizeof(ch *); fif_filelist = (ch **) zmalloc(cc+cc,"find_imagefiles"); memcpy(fif_filelist,templist,cc); memset(fif_filelist+fif_max,0,cc); zfree(templist); fif_max *= 2; } } fif_filelist[fif_count] = zstrdup(file,"find_imagefiles"); // add file to output list fif_count += 1; } pclose(fid); Nf = fif_count; if (Nf) flist = fif_filelist; return 0; } /**************************************************************************************/ // test if a file exists, is a regular file int regfile(ch *file, struct stat *statb) { STATB statB; int err; err = stat(file,&statB); if (err) return 0; if (! S_ISREG(statB.st_mode)) return 0; if (statb) *statb = statB; return 1; } // test if a file exists, is a directory/folder int dirfile(ch *file, struct stat *statb) { STATB statB; int err; err = stat(file,&statB); if (err) return 0; if (! S_ISDIR(statB.st_mode)) return 0; if (statb) *statb = statB; return 1; } // test if file exists, is a regular file, and read or write permission // rw: 'r' or read or 'w' for write or ' ' for file exists only // returns 0 if file does not exist, is not a regular file, or access is not permitted // returns 1 if all is OK int hasperm(ch *file, ch rw) { STATB statB; if (! regfile(file,&statB)) return 0; if (rw == 'r' && ! (S_IRUSR & statB.st_mode)) return 0; if (rw == 'w' && ! (S_IWUSR & statB.st_mode)) return 0; return 1; } /**************************************************************************************/ // Show a permissions setting, edit and return changed permissions. // 'fname' is a file name or permission category, e.g. 'default' // Permissions are strings: "read+write", "read only", "no access". // 'p1' and 'p2' are input and output permissions strings, which are // any combination of three of the above strings, comma separated, // which define the access permissions for user, group, other. // p1 and p2 are char[100] strings to allow for fat translations. // Returns 1 if user cancel or error, 0 if changes were made OK. int set_permissions(GtkWidget *parent, ch *fname, ch *p1, ch *p2) { ch operm[50], gperm[50], wperm[50]; ch *pp; zdialog *zd; int zstat; /*** ________________________________ | permissions | | | | owner [read+write |v] | | group [read only |v] | | other [no access |v] | | | | [Apply] [X] | |________________________________| ***/ zd = zdialog_new(TX("Permissions"),parent,TX("Apply"),"X",null); zdialog_add_widget(zd,"hbox","space","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"homog|space=5"); zdialog_add_widget(zd,"label","labowner","vb1",TX("owner")); zdialog_add_widget(zd,"label","labgroup","vb1",TX("group")); zdialog_add_widget(zd,"label","labother","vb1",TX("other")); zdialog_add_widget(zd,"combo","ownerperm","vb2"); zdialog_add_widget(zd,"combo","groupperm","vb2"); zdialog_add_widget(zd,"combo","otherperm","vb2"); zdialog_stuff(zd,"ownerperm","read+write"); // initz. combo boxes zdialog_stuff(zd,"ownerperm","read only"); zdialog_stuff(zd,"ownerperm","no access"); zdialog_stuff(zd,"groupperm","read+write"); zdialog_stuff(zd,"groupperm","read only"); zdialog_stuff(zd,"groupperm","no access"); zdialog_stuff(zd,"otherperm","read+write"); zdialog_stuff(zd,"otherperm","read only"); zdialog_stuff(zd,"otherperm","no access"); pp = substring(p1,',',1); // initz. dialog from input permissions if (pp) zdialog_stuff(zd,"ownerperm",pp); pp = substring(p1,',',2); if (pp) zdialog_stuff(zd,"groupperm",pp); pp = substring(p1,',',3); if (pp) zdialog_stuff(zd,"otherperm",pp); zdialog_run(zd,0,0); // run dialog zstat = zdialog_wait(zd); // wait for completion if (zstat != 1) { zdialog_free(zd); // cancel return 1; // error return } *p2 = 0; zdialog_fetch(zd,"ownerperm",operm,50); // get permissions from dialog zdialog_fetch(zd,"groupperm",gperm,50); zdialog_fetch(zd,"otherperm",wperm,50); snprintf(p2,100,"%s, %s, %s",operm,gperm,wperm); // output permissions zdialog_free(zd); return 0; // normal return } // convert between permission formats // string: "read+write, read only, no access" // mode_t: bitmap of permissions, e.g. 0640 int conv_permissions(ch *perms, mode_t &mode) // string permissions to mode_t { int err = 0; ch *pp; mode = 0; pp = substring(perms,',',1); if (pp) { if (strmatch(pp,"read+write")) mode += S_IRUSR + S_IWUSR; else if (strmatch(pp,"read only")) mode += S_IRUSR; else if (strmatch(pp,"no access")); else err = 1; } else err = 1; pp = substring(perms,',',2); if (pp) { if (strmatch(pp,"read+write")) mode += S_IRGRP + S_IWGRP; else if (strmatch(pp,"read only")) mode += S_IRGRP; else if (strmatch(pp,"no access")); else err = 1; } else err = 1; pp = substring(perms,',',3); if (pp) { if (strmatch(pp,"read+write")) mode += S_IROTH + S_IWOTH; else if (strmatch(pp,"read only")) mode += S_IROTH; else if (strmatch(pp,"no access")); else err = 1; } else err = 1; return err; } int conv_permissions(mode_t mode, ch *perms) // mode_t to string permissions { int err = 0; *perms = 0; if (mode & S_IRUSR && mode & S_IWUSR) strcat(perms,"read+write"); else if (mode & S_IRUSR) strcat(perms,"read only"); else strcat(perms,"no access"); strcat(perms,", "); if (mode & S_IRGRP && mode & S_IWGRP) strcat(perms,"read+write"); else if (mode & S_IRGRP) strcat(perms,"read only"); else strcat(perms,"no access"); strcat(perms,", "); if (mode & S_IROTH && mode & S_IWOTH) strcat(perms,"read+write"); else if (mode & S_IROTH) strcat(perms,"read only"); else strcat(perms,"no access"); return err; } fotocx/data/0000775000175000017500000000000015247006660011741 5ustar micomicofotocx/data/custom_menu0000664000175000017500000000101615247006660014220 0ustar micomicoCrop # trim image margins Zuschneiden # crop auf deutsch Retouch # adjust brightness, contrast, color Flatten Histogram # flatten brightness histogram Local Contrast # enhance visibility of details Edit Script # create new script function Run Script # run a script function using current file Batch Script # run a script function using multiple files Plugins # create or run a plugin function fotocx/data/raw_commands0000664000175000017500000000037115247006660014337 0ustar micomicodcraw -w -T -6 -q 0 # sRGB dcraw -a -T -6 -q 0 # auto WB dcraw -w -T -6 -q 0 -o 2 # Adobe RGB dcraw -w -T -6 -q 0 -b 0.8 # sRGB 80% rawtherapee-cli -q -d -t -b16 -Y -c darktable-cli fotocx/data/plugins0000664000175000017500000000072115247006660013345 0ustar micomicoGimp = gimp %s # edit current image using Gimp RAW Therapee = rawtherapee %s # RAW file processing tool auto-gamma = mogrify -auto-gamma %s # apply auto gamma curve drawing = mogrify -morphology Convolve DoG:15,100,0 -negate -normalize -level 60%,91%,0.1 %s MPO left = exiftool %s -mpimage2 -b > %s-left.jpg # extract left image from .MPO file 3D pair MPO right = exiftool -trailer:all= %s -o %s-right.jpg # extract right image from .MPO file 3D pair fotocx/data/palettes/0000775000175000017500000000000015247006660013562 5ustar micomicofotocx/data/palettes/Visibone_2.gpl0000664000175000017500000002134015247006660016265 0ustar micomicoGIMP Palette Name: Visibone 2 Columns: 16 # # Visibone 2 -- GIMP Palette file # # Arrangement idea from www.visibone.com # Conversion to GIMP Palette and addition of # RGB and hex codes by Carey Bunks # 255 255 255 (255 255 255) #FFFFFF 204 204 204 (204 204 204) #CCCCCC 153 153 153 (153 153 153) #999999 102 102 102 (102 102 102) #666666 51 51 51 ( 51 51 51) #333333 0 0 0 ( 0 0 0) #000000 255 204 0 (255 204 0) #FFCC00 255 153 0 (255 153 0) #FF9900 255 102 0 (255 102 0) #FF6600 255 51 0 (255 51 0) #FF3300 0 0 0 ( 0 0 0) #000000 51 51 51 ( 51 51 51) #333333 102 102 102 (102 102 102) #666666 153 153 153 (153 153 153) #999999 204 204 204 (204 204 204) #CCCCCC 255 255 255 (255 255 255) #FFFFFF 153 204 0 (153 204 0) #99CC00 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 204 153 0 (204 153 0) #CC9900 255 204 51 (255 204 51) #FFCC33 255 204 102 (255 204 102) #FFCC66 255 153 102 (255 153 102) #FF9966 255 102 51 (255 102 51) #FF6633 204 51 0 (204 51 0) #CC3300 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 204 0 51 (204 0 51) #CC0033 204 255 0 (204 255 0) #CCFF00 204 255 51 (204 255 51) #CCFF33 51 51 0 ( 51 51 0) #333300 102 102 0 (102 102 0) #666600 153 153 0 (153 153 0) #999900 204 204 0 (204 204 0) #CCCC00 255 255 0 (255 255 0) #FFFF00 204 153 51 (204 153 51) #CC9933 204 102 51 (204 102 51) #CC6633 51 0 0 ( 51 0 0) #330000 102 0 0 (102 0 0) #660000 153 0 0 (153 0 0) #990000 204 0 0 (204 0 0) #CC0000 255 0 0 (255 0 0) #FF0000 255 51 102 (255 51 102) #FF3366 255 0 51 (255 0 51) #FF0033 153 255 0 (153 255 0) #99FF00 204 255 102 (204 255 102) #CCFF66 153 204 51 (153 204 51) #99CC33 102 102 51 (102 102 51) #666633 153 153 51 (153 153 51) #999933 204 204 51 (204 204 51) #CCCC33 255 255 51 (255 255 51) #FFFF33 153 102 0 (153 102 0) #996600 153 51 0 (153 51 0) #993300 102 51 51 (102 51 51) #663333 153 51 51 (153 51 51) #993333 204 51 51 (204 51 51) #CC3333 255 51 51 (255 51 51) #FF3333 204 51 102 (204 51 102) #CC3366 255 102 153 (255 102 153) #FF6699 255 0 102 (255 0 102) #FF0066 102 255 0 (102 255 0) #66FF00 153 255 102 (153 255 102) #99FF66 102 204 51 (102 204 51) #66CC33 102 153 0 (102 153 0) #669900 153 153 102 (153 153 102) #999966 204 204 102 (204 204 102) #CCCC66 255 255 102 (255 255 102) #FFFF66 153 102 51 (153 102 51) #996633 102 51 0 (102 51 0) #663300 153 102 102 (153 102 102) #996666 204 102 102 (204 102 102) #CC6666 255 102 102 (255 102 102) #FF6666 153 0 51 (153 0 51) #990033 204 51 153 (204 51 153) #CC3399 255 102 204 (255 102 204) #FF66CC 255 0 153 (255 0 153) #FF0099 51 255 0 ( 51 255 0) #33FF00 102 255 51 (102 255 51) #66FF33 51 153 0 ( 51 153 0) #339900 102 204 0 (102 204 0) #66CC00 153 255 51 (153 255 51) #99FF33 204 204 153 (204 204 153) #CCCC99 255 255 153 (255 255 153) #FFFF99 204 153 102 (204 153 102) #CC9966 204 102 0 (204 102 0) #CC6600 204 153 153 (204 153 153) #CC9999 255 153 153 (255 153 153) #FF9999 255 51 153 (255 51 153) #FF3399 204 0 102 (204 0 102) #CC0066 153 0 102 (153 0 102) #990066 255 51 204 (255 51 204) #FF33CC 255 0 204 (255 0 204) #FF00CC 0 204 0 ( 0 204 0) #00CC00 51 204 0 ( 51 204 0) #33CC00 51 102 0 ( 51 102 0) #336600 102 153 51 (102 153 51) #669933 153 204 102 (153 204 102) #99CC66 204 255 153 (204 255 153) #CCFF99 255 255 204 (255 255 204) #FFFFCC 255 204 153 (255 204 153) #FFCC99 255 153 51 (255 153 51) #FF9933 255 204 204 (255 204 204) #FFCCCC 255 153 204 (255 153 204) #FF99CC 204 102 153 (204 102 153) #CC6699 153 51 102 (153 51 102) #993366 102 0 51 (102 0 51) #660033 204 0 153 (204 0 153) #CC0099 51 0 51 ( 51 0 51) #330033 51 204 51 ( 51 204 51) #33CC33 102 204 102 (102 204 102) #66CC66 0 255 0 ( 0 255 0) #00FF00 51 255 51 ( 51 255 51) #33FF33 102 255 102 (102 255 102) #66FF66 153 255 153 (153 255 153) #99FF99 204 255 204 (204 255 204) #CCFFCC 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 204 153 204 (204 153 204) #CC99CC 153 102 153 (153 102 153) #996699 153 51 153 (153 51 153) #993399 153 0 153 (153 0 153) #990099 102 51 102 (102 51 102) #663366 102 0 102 (102 0 102) #660066 0 102 0 ( 0 102 0) #006600 51 102 51 ( 51 102 51) #336633 0 153 0 ( 0 153 0) #009900 51 153 51 ( 51 153 51) #339933 102 153 102 (102 153 102) #669966 153 204 153 (153 204 153) #99CC99 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 255 204 255 (255 204 255) #FFCCFF 255 153 255 (255 153 255) #FF99FF 255 102 255 (255 102 255) #FF66FF 255 51 255 (255 51 255) #FF33FF 255 0 255 (255 0 255) #FF00FF 204 102 204 (204 102 204) #CC66CC 204 51 204 (204 51 204) #CC33CC 0 51 0 ( 0 51 0) #003300 0 204 51 ( 0 204 51) #00CC33 0 102 51 ( 0 102 51) #006633 51 153 102 ( 51 153 102) #339966 102 204 153 (102 204 153) #66CC99 153 255 204 (153 255 204) #99FFCC 204 255 255 (204 255 255) #CCFFFF 51 153 255 ( 51 153 255) #3399FF 153 204 255 (153 204 255) #99CCFF 204 204 255 (204 204 255) #CCCCFF 204 153 255 (204 153 255) #CC99FF 153 102 204 (153 102 204) #9966CC 102 51 153 (102 51 153) #663399 51 0 102 ( 51 0 102) #330066 153 0 204 (153 0 204) #9900CC 204 0 204 (204 0 204) #CC00CC 0 255 51 ( 0 255 51) #00FF33 51 255 102 ( 51 255 102) #33FF66 0 153 51 ( 0 153 51) #009933 0 204 102 ( 0 204 102) #00CC66 51 255 153 ( 51 255 153) #33FF99 153 255 255 (153 255 255) #99FFFF 153 204 204 (153 204 204) #99CCCC 0 102 204 ( 0 102 204) #0066CC 102 153 204 (102 153 204) #6699CC 153 153 255 (153 153 255) #9999FF 153 153 204 (153 153 204) #9999CC 153 51 255 (153 51 255) #9933FF 102 0 204 (102 0 204) #6600CC 102 0 153 (102 0 153) #660099 204 51 255 (204 51 255) #CC33FF 204 0 255 (204 0 255) #CC00FF 0 255 102 ( 0 255 102) #00FF66 102 255 153 (102 255 153) #66FF99 51 204 102 ( 51 204 102) #33CC66 0 153 102 ( 0 153 102) #009966 102 255 255 (102 255 255) #66FFFF 102 204 204 (102 204 204) #66CCCC 102 153 153 (102 153 153) #669999 0 51 102 ( 0 51 102) #003366 51 102 153 ( 51 102 153) #336699 102 102 255 (102 102 255) #6666FF 102 102 204 (102 102 204) #6666CC 102 102 153 (102 102 153) #666699 51 0 153 ( 51 0 153) #330099 153 51 204 (153 51 204) #9933CC 204 102 255 (204 102 255) #CC66FF 153 0 255 (153 0 255) #9900FF 0 255 153 ( 0 255 153) #00FF99 102 255 204 (102 255 204) #66FFCC 51 204 153 ( 51 204 153) #33CC99 51 255 255 ( 51 255 255) #33FFFF 51 204 204 ( 51 204 204) #33CCCC 51 153 153 ( 51 153 153) #339999 51 102 102 ( 51 102 102) #336666 0 102 153 ( 0 102 153) #006699 0 51 153 ( 0 51 153) #003399 51 51 255 ( 51 51 255) #3333FF 51 51 204 ( 51 51 204) #3333CC 51 51 153 ( 51 51 153) #333399 51 51 102 ( 51 51 102) #333366 102 51 204 (102 51 204) #6633CC 153 102 255 (153 102 255) #9966FF 102 0 255 (102 0 255) #6600FF 0 255 204 ( 0 255 204) #00FFCC 51 255 204 ( 51 255 204) #33FFCC 0 255 255 ( 0 255 255) #00FFFF 0 204 204 ( 0 204 204) #00CCCC 0 153 153 ( 0 153 153) #009999 0 102 102 ( 0 102 102) #006666 0 51 51 ( 0 51 51) #003333 51 153 204 ( 51 153 204) #3399CC 51 102 204 ( 51 102 204) #3366CC 0 0 255 ( 0 0 255) #0000FF 0 0 204 ( 0 0 204) #0000CC 0 0 153 ( 0 0 153) #000099 0 0 102 ( 0 0 102) #000066 0 0 51 ( 0 0 51) #000033 102 51 255 (102 51 255) #6633FF 51 0 255 ( 51 0 255) #3300FF 0 204 153 ( 0 204 153) #00CC99 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 0 153 202 ( 0 153 202) #0099CA 51 204 255 ( 51 204 255) #33CCFF 102 204 255 (102 204 255) #66CCFF 102 153 255 (102 153 255) #6699FF 51 102 255 ( 51 102 255) #3366FF 0 51 204 ( 0 51 204) #0033CC 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 0 0 0 ( 0 0 0) #000000 51 0 204 ( 51 0 204) #3300CC 255 255 255 (255 255 255) #FFFFFF 204 204 204 (204 204 204) #CCCCCC 153 153 153 (153 153 153) #999999 102 102 102 (102 102 102) #666666 51 51 51 ( 51 51 51) #333333 0 0 0 ( 0 0 0) #000000 0 204 255 ( 0 204 255) #00CCFF 0 153 255 ( 0 153 255) #0099FF 0 102 255 ( 0 102 255) #0066FF 0 51 255 ( 0 51 255) #0033FF 0 0 0 ( 0 0 0) #000000 51 51 51 ( 51 51 51) #333333 102 102 102 (102 102 102) #666666 153 153 153 (153 153 153) #999999 204 204 204 (204 204 204) #CCCCCC 255 255 255 (255 255 255) #FFFFFF fotocx/data/palettes/Topographic.gpl0000664000175000017500000000635615247006660016557 0ustar micomicoGIMP Palette Name: Topographic # # "Topographic" color map - M. Davis # waterline # Rocks # Snow # Rocks # 0 0 0 grey0 0 0 168 4 0 172 4 8 172 4 12 172 4 16 172 8 20 176 8 24 176 8 28 176 12 32 176 12 36 180 16 40 184 16 44 184 20 48 184 20 52 188 24 56 192 24 60 192 28 64 192 28 68 196 32 72 200 32 76 200 36 80 200 36 84 204 40 88 208 40 92 208 44 96 208 44 100 212 48 104 216 48 108 216 52 112 216 52 116 220 56 120 224 60 124 224 60 128 224 64 132 228 64 136 232 68 132 232 68 136 232 68 140 232 68 144 232 72 148 236 72 152 240 76 156 240 76 160 240 80 164 244 80 168 248 84 172 248 84 176 248 40 124 0 40 124 0 44 124 0 44 124 0 44 124 4 44 124 4 44 128 4 44 128 4 48 128 4 48 128 4 48 128 8 48 128 8 48 132 8 48 132 8 52 132 8 52 132 8 56 132 12 56 132 12 60 132 12 60 132 12 60 136 12 60 136 12 60 136 16 60 136 16 60 140 16 60 140 16 64 140 16 64 140 16 64 140 20 64 140 20 64 144 20 64 144 20 68 144 20 68 144 20 68 144 24 68 144 24 68 148 24 72 148 24 72 148 28 72 152 28 72 152 32 76 152 32 76 156 32 80 156 32 80 156 36 80 160 36 80 160 40 84 160 40 84 164 40 88 164 40 88 164 44 88 168 44 88 168 48 92 168 48 92 172 48 96 172 48 96 172 52 96 176 52 100 176 52 100 176 56 100 180 56 100 180 56 104 180 60 104 184 60 104 184 64 108 184 64 108 188 64 108 188 68 112 188 68 112 188 72 112 192 72 112 192 76 116 192 76 116 196 76 116 196 80 120 196 80 120 200 80 120 200 84 124 200 84 124 204 84 124 204 88 128 204 88 128 208 88 128 208 92 132 208 92 132 212 92 136 212 92 136 212 96 136 216 96 136 216 100 140 216 100 140 220 100 140 220 104 144 220 104 144 224 104 144 224 108 148 224 108 148 228 108 152 228 108 152 228 108 156 228 108 156 228 108 160 228 108 164 228 108 168 228 108 168 228 108 172 228 108 172 228 108 176 228 108 176 228 108 180 228 108 180 228 108 184 228 108 184 228 108 188 228 108 188 228 108 192 228 108 196 228 108 196 228 108 200 228 108 204 228 108 204 228 108 208 228 108 208 228 108 212 228 108 212 228 108 216 228 108 220 228 108 220 228 108 224 228 108 228 228 108 228 228 108 232 228 108 232 228 108 232 228 104 232 228 104 232 228 100 232 228 100 232 228 96 232 228 96 232 228 92 232 224 92 232 224 92 232 220 88 232 216 84 232 216 80 232 212 80 232 212 76 232 208 76 232 204 72 232 204 68 232 200 68 232 200 64 232 200 64 232 196 64 232 196 60 232 192 60 232 192 56 232 188 56 232 188 52 232 184 52 232 184 48 232 180 48 232 180 44 232 180 44 232 176 44 232 176 44 232 176 40 232 176 40 232 172 40 232 172 36 232 168 36 232 168 36 228 164 32 228 164 32 228 160 32 228 160 32 224 156 28 224 152 24 224 152 24 224 148 20 220 148 20 220 140 16 220 140 16 220 132 16 216 132 16 216 124 8 216 124 8 216 116 8 128 128 128 128 128 128 252 252 252 grey99 252 252 252 grey99 252 252 252 grey99 252 252 252 grey99 252 252 252 grey99 252 252 252 grey99 252 252 252 grey99 252 252 252 grey99 192 192 192 192 192 192 252 252 252 grey99 252 252 252 grey99 252 252 252 grey99 252 252 252 grey99 252 252 252 grey99 252 252 252 grey99 252 252 252 grey99 fotocx/data/palettes/Op2.gpl0000664000175000017500000000604015247006660014726 0ustar micomicoGIMP Palette Name: Op2 # 204 144 100 204 144 100 200 148 104 200 152 108 200 152 112 196 156 116 196 160 120 192 164 124 172 212 180 192 168 128 192 172 132 188 176 136 188 180 140 184 184 144 184 184 148 180 188 152 180 192 156 180 196 160 176 200 164 176 204 168 172 208 172 172 212 176 248 88 24 244 92 28 244 96 32 240 96 36 240 100 36 240 100 40 236 104 44 236 104 44 236 108 48 232 108 52 232 112 52 232 116 56 228 116 60 228 120 64 228 120 64 224 124 68 224 124 72 224 128 72 220 128 76 220 132 80 220 136 80 216 136 84 216 140 88 216 140 92 212 144 92 212 144 96 212 148 100 208 148 100 208 152 104 208 156 108 204 156 108 204 160 112 204 160 116 200 164 116 200 164 120 200 168 124 196 168 128 196 172 128 196 176 132 192 176 136 192 180 136 192 180 140 188 184 144 188 184 144 188 188 148 184 188 152 184 192 156 184 196 156 180 196 160 180 200 164 180 200 164 176 204 168 176 204 172 176 208 172 172 208 176 172 212 180 12 0 120 16 4 124 16 8 124 20 8 124 20 12 124 24 16 124 24 16 128 28 20 128 28 24 128 32 24 128 32 28 128 36 32 132 36 32 132 40 36 132 40 40 132 44 40 132 44 44 132 48 48 136 48 48 136 52 52 136 52 56 136 56 56 136 56 60 140 60 64 140 60 64 140 64 68 140 64 72 140 68 72 144 68 76 144 72 80 144 72 80 144 76 84 144 76 88 144 80 88 148 80 92 148 84 96 148 84 96 148 88 100 148 88 104 152 92 104 152 92 108 152 96 112 152 96 112 152 100 116 156 100 120 156 104 120 156 104 124 156 108 128 156 108 128 156 112 132 160 112 136 160 116 136 160 116 140 160 120 144 160 120 144 164 124 148 164 124 152 164 128 152 164 128 156 164 132 160 168 132 160 168 136 164 168 136 168 168 140 168 168 140 172 168 144 176 172 144 176 172 148 180 172 148 184 172 152 184 172 152 188 176 156 192 176 156 192 176 160 196 176 160 200 176 164 200 180 164 204 180 168 208 180 168 208 180 172 212 180 240 172 224 236 176 220 236 176 220 236 176 220 236 176 220 236 176 220 236 176 220 232 176 220 232 176 220 232 176 220 232 176 216 232 180 216 232 180 216 228 180 216 228 180 216 228 180 216 228 180 216 228 180 216 228 180 216 224 180 216 224 180 212 224 180 212 224 184 212 224 184 212 224 184 212 220 184 212 220 184 212 220 184 212 220 184 212 220 184 208 220 184 208 220 184 208 216 188 208 216 188 208 216 188 208 216 188 208 216 188 208 216 188 208 212 188 208 212 188 204 212 188 204 212 188 204 212 188 204 212 192 204 208 192 204 208 192 204 208 192 204 208 192 204 208 192 204 208 192 200 204 192 200 204 192 200 204 192 200 204 192 200 204 196 200 204 196 200 204 196 200 200 196 200 200 196 196 200 196 196 200 196 196 200 196 196 200 196 196 196 196 196 grey77 196 200 196 196 200 196 196 200 196 196 200 196 196 200 192 192 200 192 192 200 192 192 200 192 192 200 192 192 200 192 192 200 192 188 204 192 188 204 192 188 204 192 188 204 188 188 204 188 188 204 188 188 204 188 184 204 188 184 204 188 184 204 188 184 208 188 184 208 188 184 208 184 180 208 184 180 208 184 180 208 184 180 208 184 180 208 184 180 208 184 176 208 184 176 208 184 176 212 184 176 212 180 fotocx/data/palettes/Greens.gpl0000664000175000017500000000613115247006660015512 0ustar micomicoGIMP Palette Name: Greens # 0 0 0 grey0 0 0 0 grey0 0 4 0 0 12 0 0 16 0 0 24 0 0 32 0 0 36 0 0 44 0 0 48 0 0 56 0 0 64 0 0 68 0 0 76 0 0 80 0 0 88 0 0 96 0 0 100 0 DarkGreen 0 108 0 0 116 0 0 120 0 0 128 0 0 132 0 0 140 0 0 148 0 0 152 0 0 160 0 0 164 0 0 172 0 0 180 0 0 184 0 0 192 0 0 200 0 4 200 0 12 200 0 16 204 0 24 204 0 28 208 0 36 208 0 40 208 0 48 212 0 56 212 0 60 216 0 68 216 0 72 216 0 80 220 0 84 220 0 92 224 0 100 224 0 104 224 0 112 228 0 116 228 0 124 232 0 128 232 0 136 232 0 140 236 0 148 236 0 156 240 0 160 240 0 168 240 0 172 244 0 180 244 0 184 248 0 192 248 0 200 252 0 200 252 4 200 252 12 204 252 20 204 252 28 208 252 36 208 252 44 208 252 52 212 252 60 212 252 68 216 252 76 216 252 84 216 252 92 220 252 100 220 252 108 224 252 116 224 252 124 224 252 132 228 252 140 228 252 148 232 252 156 232 252 164 232 252 172 236 252 180 236 252 188 240 252 196 240 252 204 240 252 212 244 252 220 244 252 228 248 252 236 248 252 244 252 252 252 grey99 252 252 248 252 252 244 252 252 240 252 252 232 252 252 228 252 252 224 252 252 216 252 252 212 252 252 208 252 252 200 252 252 196 252 252 192 252 252 184 252 252 180 252 252 176 252 252 168 252 252 164 252 252 160 252 252 156 252 252 148 252 252 144 252 252 140 252 252 132 252 252 128 252 252 124 252 252 116 252 252 112 252 252 108 252 252 100 252 252 96 252 252 92 252 252 84 252 252 80 252 252 76 252 252 72 252 252 64 252 252 60 252 252 56 252 252 48 252 252 44 252 252 40 252 252 32 252 252 28 252 252 24 252 252 16 252 252 12 252 252 8 252 252 0 248 252 0 244 252 0 240 252 0 232 252 0 228 252 0 224 252 0 216 252 0 212 252 0 208 252 0 200 252 0 196 252 0 192 252 0 184 252 0 180 252 0 176 252 0 168 252 0 164 252 0 160 252 0 156 252 0 148 252 0 144 252 0 140 252 0 132 252 0 128 252 0 124 252 0 LawnGreen 116 252 0 112 252 0 108 252 0 100 252 0 96 252 0 92 252 0 84 252 0 80 252 0 76 252 0 72 252 0 64 252 0 60 252 0 56 252 0 48 252 0 44 252 0 40 252 0 32 252 0 28 252 0 24 252 0 16 252 0 12 252 0 8 252 0 0 252 0 0 248 0 0 244 0 0 240 0 0 236 0 0 232 0 0 228 0 0 224 0 0 220 0 0 216 0 0 212 0 0 208 0 0 204 0 0 200 0 0 196 0 0 192 0 0 188 0 0 184 0 0 180 0 0 176 0 0 172 0 0 168 0 0 164 0 0 160 0 0 156 0 0 152 0 0 148 0 0 144 0 0 140 0 0 136 0 0 132 0 0 128 0 0 124 0 0 120 0 0 116 0 0 112 0 0 108 0 0 104 0 0 100 0 DarkGreen 0 96 0 0 92 0 0 88 0 0 84 0 0 80 0 0 76 0 0 72 0 0 68 0 0 64 0 0 60 0 0 56 0 0 52 0 0 48 0 0 44 0 0 40 0 0 36 0 0 32 0 0 28 0 0 24 0 0 20 0 0 16 0 0 12 0 0 8 0 0 0 0 grey0 0 0 0 grey0 fotocx/data/palettes/Cranes.gpl0000664000175000017500000000607615247006660015512 0ustar micomicoGIMP Palette Name: Cranes # 8 8 8 grey3 192 176 144 192 164 128 80 72 68 112 140 88 104 132 96 92 104 84 24 8 12 96 108 92 128 104 76 44 28 24 156 140 116 156 148 116 68 68 60 212 196 148 144 136 108 160 148 128 216 220 216 44 28 40 68 12 16 12 8 32 56 8 48 48 8 40 44 20 40 104 104 92 52 28 48 156 176 124 124 160 96 44 40 24 168 168 172 196 188 168 8 28 20 160 60 60 180 144 100 192 144 112 132 40 60 48 8 24 156 176 144 80 84 64 136 148 136 120 160 116 44 20 24 128 84 80 128 20 56 168 68 76 64 56 44 56 40 40 156 172 164 100 92 72 124 116 88 32 8 28 176 180 180 156 44 68 172 176 156 176 168 144 188 8 88 148 8 52 20 48 52 68 60 68 216 204 160 140 160 112 112 116 88 152 160 164 116 156 104 192 192 184 80 84 72 56 24 24 24 36 40 48 56 52 92 84 64 180 160 120 112 100 76 156 120 88 96 96 84 148 160 152 192 200 144 68 56 56 100 48 96 108 144 100 188 180 160 60 48 68 80 48 52 188 56 72 196 176 128 220 180 164 132 116 100 68 36 52 168 132 100 180 168 132 148 156 140 120 128 108 108 12 48 108 80 68 44 40 56 140 124 104 24 28 20 204 172 120 164 156 132 116 104 96 144 152 148 84 92 72 120 148 100 120 112 108 60 64 56 204 176 140 212 140 128 80 56 64 152 140 108 72 72 76 20 12 48 140 152 128 208 100 88 8 36 48 80 104 68 44 40 8 76 60 84 56 40 24 112 52 64 212 124 112 152 72 76 212 124 128 88 88 96 16 68 8 36 8 40 128 168 112 208 212 196 216 208 176 76 68 56 40 44 28 32 20 80 136 64 68 60 76 64 200 104 96 92 84 80 164 148 116 116 108 84 148 128 100 80 80 84 136 140 128 88 16 76 124 12 8 100 96 104 132 52 36 56 28 40 196 96 88 64 84 44 164 188 132 204 196 168 216 220 208 136 172 100 148 188 124 52 72 32 108 108 116 136 172 132 60 60 64 108 92 92 216 156 144 104 96 84 172 180 172 140 108 88 160 164 156 148 132 108 128 140 120 40 84 56 132 56 108 96 32 56 164 88 84 96 104 72 172 192 152 192 196 172 208 108 100 68 84 72 140 128 96 224 228 224 128 128 132 76 96 56 88 76 100 72 12 52 56 44 56 68 48 68 60 20 64 44 12 56 84 68 76 44 8 8 148 136 100 148 180 108 184 52 20 0 0 0 grey0 40 0 0 0 56 92 0 0 4 0 0 0 grey0 60 56 56 56 20 40 192 28 36 72 80 60 72 92 68 88 100 76 88 116 72 0 0 0 grey0 56 40 56 72 76 68 128 48 52 168 36 60 76 96 76 80 108 80 128 120 108 184 72 80 104 128 84 136 132 108 148 140 116 112 152 92 208 184 132 104 116 100 132 128 116 136 120 88 0 0 0 grey0 116 124 120 136 152 152 144 156 160 156 168 176 184 184 176 152 172 184 184 188 188 196 200 196 212 212 208 148 164 172 84 96 84 96 8 20 100 116 80 96 120 92 164 176 184 204 188 152 128 128 100 44 40 40 204 204 188 92 128 80 100 140 88 56 48 44 128 148 112 36 28 40 196 160 112 124 116 96 104 104 84 132 140 140 140 132 116 204 208 200 196 80 84 116 112 96 88 116 84 64 44 56 44 24 8 196 116 116 180 148 116 136 176 116 148 140 124 fotocx/data/palettes/Pastels.gpl0000664000175000017500000000036515247006660015705 0ustar micomicoGIMP Palette Name: Pastels # 226 145 145 153 221 146 147 216 185 148 196 211 148 154 206 179 148 204 204 150 177 204 164 153 223 229 146 255 165 96 107 255 99 101 255 204 101 196 255 101 107 255 173 101 255 255 101 244 255 101 132 255 101 101 fotocx/data/palettes/Caramel.gpl0000664000175000017500000000604415247006660015636 0ustar micomicoGIMP Palette Name: Caramel # 48 48 48 grey19 164 136 192 172 140 192 180 144 192 188 148 192 196 152 192 204 152 192 212 156 192 220 160 192 228 164 192 236 168 192 228 160 188 216 148 184 204 136 180 192 124 176 180 112 168 168 104 164 156 92 160 144 80 156 132 68 152 120 56 144 140 84 140 160 116 132 180 144 128 200 176 120 224 208 112 212 200 120 196 188 132 184 176 144 168 168 156 156 156 164 140 144 176 128 136 188 112 124 200 96 112 212 108 112 192 124 116 172 136 116 148 152 120 128 168 120 108 180 124 84 196 124 64 212 128 40 212 128 44 212 132 48 212 136 52 212 140 56 216 144 60 216 148 64 216 148 68 216 152 72 220 156 76 220 160 80 220 164 84 220 168 88 224 168 92 224 172 96 224 176 100 224 180 104 228 184 108 228 188 112 228 188 116 228 192 120 232 196 124 232 200 128 232 204 132 232 208 136 236 212 140 232 208 140 224 204 140 216 196 140 208 192 136 200 188 136 192 180 136 188 176 132 180 172 132 172 164 132 164 160 128 156 156 128 148 148 128 144 144 124 136 136 124 128 132 124 120 128 120 112 120 120 104 116 120 100 112 116 92 104 116 84 100 116 76 96 112 68 88 112 60 84 112 52 76 108 56 80 108 60 88 108 64 96 108 72 100 108 76 108 108 80 116 108 88 120 108 92 128 108 96 136 108 104 144 104 108 148 104 112 156 104 116 164 104 124 168 104 128 176 104 132 184 104 140 188 104 144 196 104 148 204 104 156 212 100 156 208 100 156 204 100 156 200 96 156 196 96 156 192 92 156 188 92 156 184 88 156 180 88 156 176 84 156 172 84 156 168 80 156 164 80 156 160 76 156 156 76 156 152 72 156 148 72 156 144 68 156 140 68 156 136 64 156 132 64 156 124 60 160 124 72 164 128 84 168 132 96 176 136 112 180 136 124 184 140 136 188 144 148 196 148 164 196 148 164 196 148 160 196 144 156 196 144 152 192 140 148 192 140 144 192 140 140 192 136 136 192 136 132 188 132 128 188 132 124 188 132 120 188 128 116 184 128 112 184 124 108 184 124 104 184 124 104 184 120 100 180 120 96 180 116 92 180 116 88 180 116 84 176 112 80 176 112 76 176 108 72 176 108 68 176 108 64 172 104 60 172 104 56 172 100 52 172 100 48 168 96 44 160 96 44 152 96 48 140 100 52 132 100 56 120 100 60 112 104 60 100 104 64 92 104 68 80 108 72 72 108 76 60 108 80 52 112 80 40 112 84 32 112 88 20 116 92 12 116 96 0 120 100 0 120 100 0 116 100 0 112 104 0 112 104 0 108 104 0 104 108 0 104 108 0 100 112 0 96 112 0 96 112 0 92 116 4 88 116 4 84 120 4 84 120 4 80 120 4 76 124 4 76 124 4 72 128 4 68 128 4 68 128 4 64 132 4 60 132 8 56 136 28 60 136 48 68 140 72 76 144 92 80 148 116 88 152 136 96 156 160 100 160 180 108 164 204 116 168 204 116 168 204 120 168 200 124 168 200 128 168 200 128 168 196 132 168 196 136 168 192 140 168 192 140 168 192 144 168 188 148 168 188 152 168 184 156 168 184 156 168 184 160 168 180 164 168 180 168 168 180 168 168 176 172 168 176 176 168 172 180 168 172 184 168 172 184 168 168 188 168 168 192 168 164 196 168 164 196 168 164 200 168 160 204 168 160 208 168 156 212 164 148 212 168 136 216 176 fotocx/data/palettes/Blues.gpl0000664000175000017500000000617315247006660015347 0ustar micomicoGIMP Palette Name: Blues # # For them rainy days ... by Daniel Egnor # 0 0 0 grey0 0 0 0 grey0 0 0 4 0 0 12 0 0 16 0 0 24 0 0 32 0 0 36 0 0 44 0 0 48 0 0 56 0 0 64 0 0 68 0 0 76 0 0 80 0 0 88 0 0 96 0 0 100 0 0 108 0 0 116 0 0 120 0 0 128 NavyBlue 0 0 132 0 0 140 0 0 148 0 0 152 0 0 160 0 0 164 0 0 172 0 0 180 0 0 184 0 0 192 0 0 200 0 4 200 0 12 200 0 16 204 0 24 204 0 28 208 0 36 208 0 40 208 0 48 212 0 56 212 0 60 216 0 68 216 0 72 216 0 80 220 0 84 220 0 92 224 0 100 224 0 104 224 0 112 228 0 116 228 0 124 232 0 128 232 0 136 232 0 140 236 0 148 236 0 156 240 0 160 240 0 168 240 0 172 244 0 180 244 0 184 248 0 192 248 0 200 252 4 200 252 12 200 252 20 204 252 28 204 252 36 208 252 44 208 252 52 208 252 60 212 252 68 212 252 76 216 252 84 216 252 92 216 252 100 220 252 108 220 252 116 224 252 124 224 252 132 224 252 140 228 252 148 228 252 156 232 252 164 232 252 172 232 252 180 236 252 188 236 252 196 240 252 204 240 252 212 240 252 220 244 252 228 244 252 236 248 252 244 248 252 252 252 252 grey99 248 252 252 244 252 252 240 252 252 232 252 252 228 252 252 224 252 252 216 252 252 212 252 252 208 252 252 200 252 252 196 252 252 192 252 252 184 252 252 180 252 252 176 252 252 168 252 252 164 252 252 160 252 252 156 252 252 148 252 252 144 252 252 140 252 252 132 252 252 128 252 252 124 252 252 116 252 252 112 252 252 108 252 252 100 252 252 96 252 252 92 252 252 84 252 252 80 252 252 76 252 252 72 252 252 64 252 252 60 252 252 56 252 252 48 252 252 44 252 252 40 252 252 32 252 252 28 252 252 24 252 252 16 252 252 12 252 252 8 252 252 0 252 252 0 248 252 0 244 252 0 240 252 0 232 252 0 228 252 0 224 252 0 216 252 0 212 252 0 208 252 0 200 252 0 196 252 0 192 252 0 184 252 0 180 252 0 176 252 0 168 252 0 164 252 0 160 252 0 156 252 0 148 252 0 144 252 0 140 252 0 132 252 0 128 252 0 124 252 0 116 252 0 112 252 0 108 252 0 100 252 0 96 252 0 92 252 0 84 252 0 80 252 0 76 252 0 72 252 0 64 252 0 60 252 0 56 252 0 48 252 0 44 252 0 40 252 0 32 252 0 28 252 0 24 252 0 16 252 0 12 252 0 8 252 0 0 252 0 0 248 0 0 244 0 0 240 0 0 236 0 0 232 0 0 228 0 0 224 0 0 220 0 0 216 0 0 212 0 0 208 0 0 204 0 0 200 0 0 196 0 0 192 0 0 188 0 0 184 0 0 180 0 0 176 0 0 172 0 0 168 0 0 164 0 0 160 0 0 156 0 0 152 0 0 148 0 0 144 0 0 140 0 0 136 0 0 132 0 0 128 NavyBlue 0 0 124 0 0 120 0 0 116 0 0 112 0 0 108 0 0 104 0 0 100 0 0 96 0 0 92 0 0 88 0 0 84 0 0 80 0 0 76 0 0 72 0 0 68 0 0 64 0 0 60 0 0 56 0 0 52 0 0 48 0 0 44 0 0 40 0 0 36 0 0 32 0 0 28 0 0 24 0 0 20 0 0 16 0 0 12 0 0 8 0 0 0 grey0 0 0 0 grey0 fotocx/data/palettes/Ega.gpl0000664000175000017500000000622115247006660014763 0ustar micomicoGIMP Palette Name: Ega Columns: 16 # 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 0 0 0 grey0 168 0 168 252 84 84 252 84 168 252 84 252 252 168 252 252 252 0 252 252 168 252 252 252 grey99 168 252 252 0 252 252 84 168 252 0 0 252 0 84 168 0 0 84 84 84 84 grey33 fotocx/data/palettes/Cool_Colors.gpl0000664000175000017500000000020115247006660016474 0ustar micomicoGIMP Palette Name: Cool Colors # 17 42 198 83 155 226 22 16 102 64 35 76 7 63 147 44 108 204 38 81 33 4 66 44 fotocx/data/palettes/Tango.gpl0000664000175000017500000000123315247006660015335 0ustar micomicoGIMP Palette Name: Tango Icon Theme Columns: 3 # 252 233 79 Butter 1 237 212 0 Butter 2 196 160 0 Butter 3 138 226 52 Chameleon 1 115 210 22 Chameleon 2 78 154 6 Chameleon 3 252 175 62 Orange 1 245 121 0 Orange 2 206 92 0 Orange 3 114 159 207 Sky Blue 1 52 101 164 Sky Blue 2 32 74 135 Sky Blue 3 173 127 168 Plum 1 117 80 123 Plum 2 92 53 102 Plum 3 233 185 110 Chocolate 1 193 125 17 Chocolate 2 143 89 2 Chocolate 3 239 41 41 Scarlet Red 1 204 0 0 Scarlet Red 2 164 0 0 Scarlet Red 3 238 238 236 Aluminium 1 211 215 207 Aluminium 2 186 189 182 Aluminium 3 136 138 133 Aluminium 4 85 87 83 Aluminium 5 46 52 54 Aluminium 6 fotocx/data/palettes/Khaki.gpl0000664000175000017500000000603315247006660015317 0ustar micomicoGIMP Palette Name: Khaki # 144 132 108 144 132 112 144 132 112 144 132 116 144 136 116 144 136 120 144 136 120 144 140 120 144 140 124 144 140 124 144 140 128 144 144 128 144 144 132 144 144 132 144 144 136 144 148 136 144 148 136 144 148 140 144 152 140 144 152 144 144 152 144 144 152 148 144 156 148 144 156 152 144 156 152 144 160 152 144 160 156 144 160 156 144 160 160 144 164 160 144 164 164 144 164 164 144 164 168 144 168 168 144 168 168 144 168 172 144 172 172 144 172 176 144 172 176 144 172 180 144 176 180 144 176 184 144 176 184 144 180 184 144 180 188 144 180 188 144 180 192 144 184 192 144 184 196 144 184 196 144 184 196 148 188 192 148 188 192 152 188 192 152 188 192 152 188 188 156 188 188 156 188 188 156 188 188 160 188 184 160 188 184 160 188 184 164 188 184 164 188 180 164 192 180 168 192 180 168 192 180 168 192 180 172 192 176 172 192 176 172 192 176 176 192 176 176 192 172 176 192 172 180 192 172 180 192 172 180 192 168 184 192 168 184 196 168 184 196 168 188 196 164 188 196 164 188 196 164 192 196 164 192 196 164 192 196 160 196 196 160 196 196 160 196 196 160 200 196 156 200 196 156 200 200 156 204 200 156 204 200 152 204 200 152 208 200 152 208 200 152 208 200 148 212 200 148 212 200 148 212 200 148 216 200 148 216 200 144 216 200 144 220 200 144 220 204 144 220 204 140 224 204 140 224 204 140 224 204 140 228 204 136 228 204 136 228 204 136 232 204 136 232 204 132 232 204 132 236 204 132 236 204 132 236 204 132 232 200 128 232 200 128 232 200 128 228 200 128 228 196 128 228 196 124 224 196 124 224 196 124 224 196 124 220 192 124 220 192 124 220 192 120 216 192 120 216 192 120 216 188 120 212 188 120 212 188 120 212 188 116 208 188 116 208 184 116 208 184 116 204 184 116 204 184 116 204 184 112 204 180 112 200 180 112 200 180 112 200 180 112 196 180 108 196 176 108 196 176 108 192 176 108 192 176 108 192 176 108 188 172 104 188 172 104 188 172 104 184 172 104 184 172 104 184 168 104 180 168 100 180 168 100 180 168 100 176 168 100 176 164 100 176 164 100 176 164 96 172 164 96 172 164 96 172 160 96 168 160 96 168 160 92 168 160 92 164 160 92 164 156 92 164 156 92 160 156 92 160 156 88 160 156 88 156 152 88 156 152 88 156 152 88 152 152 88 152 152 84 152 148 84 148 148 84 148 148 84 148 148 84 148 148 84 144 144 80 144 144 80 144 144 80 140 144 80 140 140 80 140 140 76 136 140 76 136 140 76 136 140 76 132 136 76 132 136 76 132 136 72 60 92 36 128 136 72 128 136 72 128 132 72 124 132 72 124 132 72 124 132 68 120 132 68 120 128 68 120 128 68 116 128 68 116 128 68 116 128 64 116 124 64 112 124 64 112 124 64 112 124 64 108 124 60 108 120 60 108 120 60 104 120 60 104 120 60 104 120 60 100 116 56 100 116 56 100 116 56 96 116 56 96 116 56 96 112 56 92 112 52 92 112 52 92 112 52 88 112 52 88 108 52 88 108 52 88 108 48 84 108 48 84 108 48 84 104 48 80 104 48 80 104 44 80 104 44 76 104 44 76 100 44 76 100 44 72 100 44 72 100 40 72 100 40 68 96 40 68 96 40 68 96 40 64 96 40 64 96 36 64 92 36 60 92 36 60 92 36 fotocx/data/palettes/Paintjet.gpl0000664000175000017500000000053015247006660016042 0ustar micomicoGIMP Palette Name: Paintjet # # A map with the PaintJet's 8 primary colors repeated twice. # Use these colors for 180dpi PaintJet images. # 24 20 12 244 240 232 196 68 72 48 132 92 240 232 72 52 48 116 188 48 108 40 116 196 24 20 12 244 240 232 196 68 72 48 132 92 240 232 72 52 48 116 188 48 108 40 116 196 fotocx/data/palettes/Grays.gpl0000664000175000017500000000116515247006660015356 0ustar micomicoGIMP Palette Name: Grays 0 0 0 gray0 7 7 7 gray3 15 15 15 gray6 23 23 23 gray9 31 31 31 gray12 39 39 39 gray15 47 47 47 gray18 55 55 55 gray21 63 63 63 gray25 71 71 71 gray28 79 79 79 gray31 87 87 87 gray34 95 95 95 gray37 103 103 103 gray40 111 111 111 gray43 119 119 119 gray46 127 127 127 gray50 135 135 135 gray53 143 143 143 gray56 151 151 151 gray59 159 159 159 gray62 167 167 167 gray65 175 175 175 gray68 183 183 183 gray71 191 191 191 gray75 199 199 199 gray78 207 207 207 gray81 215 215 215 gray84 223 223 223 gray87 231 231 231 gray90 239 239 239 gray93 247 247 247 gray96 fotocx/data/palettes/Plasma.gpl0000664000175000017500000000605715247006660015513 0ustar micomicoGIMP Palette Name: Plasma Columns: 16 # 240 240 0 240 224 0 240 208 0 240 192 0 240 176 0 240 160 0 240 144 0 240 128 0 240 112 0 240 96 0 240 80 0 240 64 0 240 48 0 240 32 0 240 16 0 240 0 0 224 224 16 224 212 16 224 200 16 224 184 16 224 172 12 224 156 12 224 144 12 224 128 12 224 116 8 224 100 8 224 88 8 224 72 8 224 60 4 224 44 4 224 32 4 224 16 0 208 208 32 208 200 32 208 188 28 208 176 28 208 164 24 208 152 24 208 140 20 208 128 20 208 116 16 208 104 16 208 92 12 208 80 12 208 68 8 208 56 8 208 44 4 208 32 0 192 192 48 192 184 48 192 176 44 192 164 40 192 156 36 192 144 32 192 136 32 192 128 28 192 116 24 192 108 20 192 96 16 192 88 16 192 80 12 192 68 8 192 60 4 192 48 0 176 176 64 176 172 60 176 164 56 176 156 52 176 148 48 176 140 44 176 132 40 176 124 36 176 120 32 176 112 28 176 104 24 176 96 20 176 88 16 176 80 12 176 72 8 176 64 0 160 160 80 160 156 76 160 152 72 160 144 64 160 140 60 160 136 56 160 128 48 160 124 44 160 120 40 160 112 32 160 108 28 160 104 24 160 96 16 160 92 12 160 88 8 160 80 0 144 144 96 144 144 92 144 140 84 144 136 80 144 132 72 144 128 64 144 128 60 144 124 52 144 120 48 144 116 40 144 112 32 144 112 28 144 108 20 144 104 16 144 100 8 144 96 0 128 128 112 128 128 108 128 128 100 128 128 92 128 124 84 128 124 76 128 124 68 128 124 60 128 120 56 128 120 48 128 120 40 128 120 32 128 116 24 128 116 16 128 116 8 128 112 0 112 112 128 112 112 120 112 112 112 grey44 112 112 104 112 116 96 112 116 88 112 116 80 112 116 72 112 120 60 112 120 52 112 120 44 112 120 36 112 124 28 112 124 20 112 124 12 112 128 0 96 96 144 96 96 136 96 100 128 96 104 116 96 108 108 96 112 96 96 112 88 96 116 80 96 120 68 96 124 60 96 128 48 96 128 40 96 132 32 96 136 20 96 140 12 96 144 0 80 80 160 80 84 152 80 88 140 80 96 128 80 100 120 80 104 108 80 112 96 80 116 88 80 120 76 80 128 64 80 132 56 80 136 44 80 144 32 80 148 24 80 152 12 80 160 0 64 64 176 64 68 168 64 76 156 64 84 144 64 92 132 64 100 120 64 108 108 64 116 96 64 120 84 64 128 72 64 136 60 64 144 48 64 152 36 64 160 24 64 168 12 64 176 0 48 48 192 48 56 180 48 64 168 48 76 156 48 84 144 48 96 128 48 104 116 48 112 104 48 124 92 48 132 80 48 144 64 48 152 52 48 160 40 48 172 28 48 180 16 48 192 0 32 32 208 32 40 196 32 52 184 32 64 168 32 76 156 32 88 140 32 100 128 32 112 112 32 124 100 32 136 84 32 148 72 32 160 56 32 172 44 32 184 28 32 196 16 32 208 0 16 16 224 16 28 212 16 40 196 16 56 180 16 68 168 16 84 152 16 96 136 16 112 120 16 124 108 16 140 92 16 152 76 16 168 60 16 180 48 16 196 32 16 208 16 16 224 0 0 0 240 0 16 224 0 32 208 0 48 192 0 64 176 0 80 160 0 96 144 0 112 128 0 128 112 0 144 96 0 160 80 0 176 64 0 192 48 0 208 32 0 224 16 0 240 0 fotocx/data/palettes/Gold.gpl0000664000175000017500000000606215247006660015157 0ustar micomicoGIMP Palette Name: Gold # 252 252 128 252 252 128 252 248 124 252 248 124 252 244 120 248 244 120 248 240 116 248 240 112 248 236 112 244 236 108 244 232 108 244 232 104 244 228 104 240 228 100 240 224 96 240 224 96 240 220 92 236 220 92 236 216 88 236 216 84 236 212 84 236 212 80 232 208 80 232 208 76 232 204 76 232 204 72 228 200 68 228 200 68 228 196 64 228 196 64 224 192 60 224 192 56 224 188 56 224 188 52 220 184 52 220 184 48 220 180 48 220 180 44 220 176 40 216 176 40 216 172 36 216 172 36 216 168 32 212 168 28 212 164 28 212 164 24 212 160 24 208 160 20 208 156 20 208 156 16 208 152 12 204 152 12 204 148 8 204 148 8 204 144 4 200 140 0 196 136 0 196 136 0 196 136 0 196 136 0 192 132 0 192 132 0 192 132 0 192 132 0 188 128 0 188 128 0 188 128 0 188 128 0 184 124 0 184 124 0 184 124 0 184 124 0 180 120 0 180 120 0 180 120 0 180 120 0 176 116 0 176 116 0 176 116 0 176 116 0 172 112 0 172 112 0 172 112 0 172 112 0 168 108 0 168 108 0 168 108 0 168 108 0 164 104 0 164 104 0 164 104 0 164 104 0 160 100 0 160 100 0 160 100 0 160 100 0 156 96 0 156 96 0 156 96 0 156 96 0 152 92 0 152 92 0 152 92 0 152 92 0 148 88 0 148 88 0 148 88 0 148 88 0 144 84 0 144 84 0 144 84 0 144 84 0 140 80 0 140 80 0 140 80 0 140 80 0 136 76 0 136 76 0 136 76 0 136 76 0 132 72 0 132 72 0 132 72 0 132 72 0 128 68 0 128 68 0 128 68 0 128 68 0 124 64 0 124 64 0 124 64 0 124 64 0 120 60 0 120 60 0 120 60 0 120 60 0 116 56 0 116 56 0 116 56 0 116 56 0 112 52 0 112 52 0 112 52 0 112 52 0 108 48 0 108 48 0 108 48 0 108 48 0 104 44 0 104 44 0 104 44 0 104 44 0 100 40 0 100 40 0 100 40 0 100 40 0 96 36 0 96 36 0 96 36 0 96 36 0 92 32 0 92 32 0 92 32 0 92 32 0 88 28 0 88 28 0 88 28 0 88 28 0 84 24 0 84 24 0 84 24 0 84 24 0 80 20 0 80 20 0 80 20 0 80 20 0 76 16 0 76 16 0 76 16 0 76 16 0 72 12 0 72 12 0 72 12 0 72 12 0 68 8 0 68 8 0 68 8 0 68 8 0 64 4 0 64 4 0 64 4 0 64 4 0 60 0 0 60 0 0 60 0 0 60 0 0 56 0 0 56 0 0 56 0 0 56 0 0 52 0 0 52 0 0 52 0 0 52 0 0 48 0 0 48 0 0 48 0 0 48 0 0 44 0 0 44 0 0 44 0 0 44 0 0 40 0 0 40 0 0 40 0 0 40 0 0 36 0 0 36 0 0 36 0 0 36 0 0 32 0 0 32 0 0 32 0 0 32 0 0 28 0 0 28 0 0 28 0 0 28 0 0 24 0 0 24 0 0 24 0 0 24 0 0 20 0 0 20 0 0 20 0 0 20 0 0 16 0 0 16 0 0 16 0 0 16 0 0 12 0 0 12 0 0 12 0 0 12 0 0 8 0 0 8 0 0 8 0 0 8 0 0 4 0 0 4 0 0 4 0 0 4 0 0 0 0 0 grey0 0 0 0 grey0 0 0 0 grey0 0 0 0 grey0 fotocx/data/palettes/Browns_And_Yellows.gpl0000664000175000017500000000102015247006660020031 0ustar micomicoGIMP Palette Name: Browns And Yellows # 189 183 107 Dark Khaki 240 230 140 Khaki 238 232 170 Pale Goldenrod 250 250 210 Light Goldenrod Yellow 255 255 224 Light Yellow 255 255 0 Yellow 255 215 0 Gold 238 221 130 Light Goldenrod 218 165 32 Goldenrod 184 134 11 Dark Goldenrod 188 143 143 Rosy Brown 139 69 19 Saddle Brown 160 82 45 Sienna 205 133 63 Peru 222 184 135 Burlywood 245 245 220 Beige 245 222 179 Wheat 244 164 96 Sandy Brown 210 180 140 Tan 210 105 30 Chocolate 255 165 0 Orange 255 140 0 Dark Orange fotocx/data/palettes/China.gpl0000664000175000017500000000603315247006660015312 0ustar micomicoGIMP Palette Name: China # 224 76 240 224 76 240 224 80 240 224 84 240 228 88 240 228 92 240 228 96 240 228 96 240 228 100 240 228 104 240 228 108 240 232 112 240 232 116 240 232 120 240 232 120 240 232 124 240 232 128 240 232 132 240 232 136 240 236 140 240 236 140 240 236 144 240 236 148 240 236 152 240 236 156 240 236 160 240 240 164 240 232 156 236 220 148 232 208 140 228 196 128 220 184 120 216 172 112 212 160 104 208 148 92 200 136 68 204 124 40 208 108 12 216 108 12 216 108 12 216 108 12 216 108 12 216 112 8 216 112 8 216 112 8 216 112 8 216 112 8 216 116 4 216 116 4 216 116 4 216 116 4 216 120 0 216 120 12 216 124 24 220 128 36 224 128 48 228 132 64 232 136 76 232 136 88 236 140 100 240 144 112 244 148 128 248 148 128 248 148 128 248 148 132 248 148 132 248 148 132 248 148 136 248 148 136 248 144 136 248 144 140 248 144 140 248 144 140 248 144 144 248 144 144 248 144 144 248 144 148 248 140 148 248 140 152 248 140 152 248 140 152 248 140 156 248 140 156 248 140 156 248 140 160 248 136 160 248 136 160 248 136 164 248 136 164 248 136 164 248 136 168 248 136 168 248 132 172 244 132 168 244 128 164 244 128 160 244 124 156 244 124 152 244 120 148 244 120 144 244 116 136 244 116 132 244 112 128 244 112 124 244 108 120 244 108 116 244 104 112 244 104 108 244 100 100 244 100 96 244 96 92 244 96 88 244 92 84 244 92 80 244 88 76 244 88 68 244 84 64 244 84 60 244 80 56 244 80 52 244 76 48 244 76 44 244 72 40 244 72 32 244 68 28 244 68 24 244 64 20 244 64 16 244 60 12 244 60 8 244 56 0 248 56 4 248 56 8 244 52 16 240 52 20 236 52 28 232 48 32 228 48 40 228 44 44 224 44 52 220 44 56 216 40 64 212 40 68 208 36 76 204 36 80 204 36 84 200 32 92 196 32 96 192 32 104 188 28 108 184 28 116 184 24 120 180 24 128 176 24 132 172 20 140 168 20 144 164 16 152 160 20 152 160 24 152 160 28 152 160 32 152 160 40 148 164 44 148 164 48 148 164 52 148 164 56 148 168 64 144 168 68 144 168 72 144 168 76 144 172 80 144 172 88 140 172 92 140 172 96 140 176 100 140 176 108 136 176 112 136 176 116 136 176 120 136 180 124 136 180 132 132 180 136 132 180 140 132 184 144 132 184 148 132 184 156 128 184 160 128 188 164 128 188 168 128 188 172 128 188 180 124 192 184 124 192 188 124 192 192 124 192 200 120 196 160 132 176 116 148 152 76 160 128 32 176 104 32 176 104 36 172 104 40 168 108 44 164 108 48 160 108 52 156 112 56 152 112 60 148 112 64 144 116 68 140 116 72 136 120 76 132 120 80 128 120 84 124 124 88 120 124 92 116 124 96 112 128 100 108 128 104 104 128 108 100 132 108 100 132 112 96 136 116 92 136 120 88 136 124 84 140 128 80 140 132 76 140 136 72 144 140 68 144 144 64 144 148 60 148 152 56 148 156 52 152 160 48 152 164 44 152 168 40 156 172 36 156 176 32 156 180 28 160 184 24 160 188 20 164 188 24 164 184 28 164 180 32 164 176 36 164 176 40 164 172 48 164 168 52 164 164 56 164 164 60 164 160 64 164 156 72 164 152 76 164 152 80 164 148 84 164 144 88 164 140 96 168 fotocx/data/palettes/Web.gpl0000664000175000017500000000510415247006660015003 0ustar micomicoGIMP Palette Name: Web Columns: 6 # 255 255 255 255 255 204 255 255 153 255 255 102 255 255 51 255 255 0 255 204 255 255 204 204 255 204 153 255 204 102 255 204 51 255 204 0 255 153 255 255 153 204 255 153 153 255 153 102 255 153 51 255 153 0 255 102 255 255 102 204 255 102 153 255 102 102 255 102 51 255 102 0 255 51 255 255 51 204 255 51 153 255 51 102 255 51 51 255 51 0 255 0 255 255 0 204 255 0 153 255 0 102 255 0 51 255 0 0 204 255 255 204 255 204 204 255 153 204 255 102 204 255 51 204 255 0 204 204 255 204 204 204 204 204 153 204 204 102 204 204 51 204 204 0 204 153 255 204 153 204 204 153 153 204 153 102 204 153 51 204 153 0 204 102 255 204 102 204 204 102 153 204 102 102 204 102 51 204 102 0 204 51 255 204 51 204 204 51 153 204 51 102 204 51 51 204 51 0 204 0 255 204 0 204 204 0 153 204 0 102 204 0 51 204 0 0 153 255 255 153 255 204 153 255 153 153 255 102 153 255 51 153 255 0 153 204 255 153 204 204 153 204 153 153 204 102 153 204 51 153 204 0 153 153 255 153 153 204 153 153 153 153 153 102 153 153 51 153 153 0 153 102 255 153 102 204 153 102 153 153 102 102 153 102 51 153 102 0 153 51 255 153 51 204 153 51 153 153 51 102 153 51 51 153 51 0 153 0 255 153 0 204 153 0 153 153 0 102 153 0 51 153 0 0 102 255 255 102 255 204 102 255 153 102 255 102 102 255 51 102 255 0 102 204 255 102 204 204 102 204 153 102 204 102 102 204 51 102 204 0 102 153 255 102 153 204 102 153 153 102 153 102 102 153 51 102 153 0 102 102 255 102 102 204 102 102 153 102 102 102 102 102 51 102 102 0 102 51 255 102 51 204 102 51 153 102 51 102 102 51 51 102 51 0 102 0 255 102 0 204 102 0 153 102 0 102 102 0 51 102 0 0 51 255 255 51 255 204 51 255 153 51 255 102 51 255 51 51 255 0 51 204 255 51 204 204 51 204 153 51 204 102 51 204 51 51 204 0 51 153 255 51 153 204 51 153 153 51 153 102 51 153 51 51 153 0 51 102 255 51 102 204 51 102 153 51 102 102 51 102 51 51 102 0 51 51 255 51 51 204 51 51 153 51 51 102 51 51 51 51 51 0 51 0 255 51 0 204 51 0 153 51 0 102 51 0 51 51 0 0 0 255 255 0 255 204 0 255 153 0 255 102 0 255 51 0 255 0 0 204 255 0 204 204 0 204 153 0 204 102 0 204 51 0 204 0 0 153 255 0 153 204 0 153 153 0 153 102 0 153 51 0 153 0 0 102 255 0 102 204 0 102 153 0 102 102 0 102 51 0 102 0 0 51 255 0 51 204 0 51 153 0 51 102 0 51 51 0 51 0 0 0 255 0 0 204 0 0 153 0 0 102 0 0 51 0 0 0 fotocx/data/palettes/Muted.gpl0000664000175000017500000000332615247006660015350 0ustar micomicoGIMP Palette Name: Muted # 139 137 137 Snow 139 134 130 Seashell 139 131 120 Antique White 139 125 107 Bisque 139 119 101 Peach Puff 139 121 94 Navajo White 139 137 112 Lemon Chiffon 139 136 120 Cornsilk 139 139 131 Ivory 131 139 131 Honeydew 139 131 134 Lavender Blush 139 125 123 Misty Rose 131 139 139 Azure 71 60 139 Slate Blue 39 64 139 Royal Blue 0 0 139 Blue 16 78 139 Dodger Blue 54 100 139 Steel Blue 0 104 139 Deep Sky Blue 74 112 139 Sky Blue 96 123 139 Light Sky Blue 108 123 139 Slate Gray 110 123 139 Light Steel Blue 104 131 139 Light Blue 122 139 139 Light Cyan 102 139 139 Pale Turquoise 83 134 139 Cadet Blue 0 134 139 Turquoise 0 139 139 Cyan 82 139 139 Dark Slate Gray 69 139 116 Aquamarine 105 139 105 Dark Sea Green 46 139 87 Sea Green 84 139 84 Pale Green 0 139 69 Spring Green 0 139 0 Green 69 139 0 Chartreuse 105 139 34 Olive Drab 110 139 61 Dark Olive Green 139 134 78 Khaki 139 129 76 Light Goldenrod 139 139 122 Light Yellow 139 139 0 Yellow 139 117 0 Gold 139 105 20 Goldenrod 139 101 8 Dark Goldenrod 139 105 105 Rosy Brown 139 58 58 Indian Red 139 71 38 Sienna 139 115 85 Burlywood 139 126 102 Wheat 139 90 43 Tan 139 69 19 Chocolate 139 26 26 Firebrick 139 35 35 Brown 139 76 57 Salmon 139 87 66 Light Salmon 139 90 0 Orange 139 69 0 Dark Orange 139 62 47 Coral 139 54 38 Tomato 139 37 0 Orange Red 139 0 0 Red 139 10 80 Deep Pink 139 58 98 Hot Pink 139 99 108 Pink 139 95 101 Light Pink 139 71 93 Pale Violet Red 139 28 98 Maroon 139 34 82 Violet Red 139 0 139 Magenta 139 71 137 Orchid 139 102 139 Plum 122 55 139 Medium Orchid 104 34 139 Dark Orchid 85 26 139 Purple 93 71 139 Medium Purple 139 123 139 Thistle fotocx/data/palettes/Bgold.gpl0000664000175000017500000000603315247006660015317 0ustar micomicoGIMP Palette Name: Bgold # 236 216 20 236 216 20 236 216 20 236 212 20 236 212 20 236 208 24 236 208 24 232 204 24 232 204 24 232 204 24 232 200 24 232 200 24 232 196 24 232 196 24 228 192 24 228 192 28 228 188 28 228 188 28 228 184 28 228 184 28 228 184 28 224 180 28 224 180 28 224 176 28 224 176 28 224 172 32 224 172 32 224 168 32 224 168 32 220 164 32 220 164 32 220 164 32 220 160 32 220 160 32 220 156 32 220 156 36 216 152 36 216 152 36 216 148 36 216 148 36 216 144 36 216 144 36 216 144 36 212 140 36 212 140 36 212 136 40 212 136 40 212 132 40 212 132 40 212 128 40 208 128 40 208 124 40 208 124 40 208 124 40 208 120 40 208 120 44 208 116 44 204 116 44 204 112 44 204 112 44 204 108 44 204 108 44 204 104 44 204 104 44 204 104 44 200 108 40 200 108 40 200 108 40 200 108 40 200 108 40 200 108 40 200 108 40 200 112 40 200 112 40 200 112 36 200 112 36 200 112 36 200 112 36 200 112 36 200 116 36 200 116 36 200 116 36 200 116 36 200 116 36 196 116 32 196 116 32 196 120 32 196 120 32 196 120 32 196 120 32 196 120 32 196 120 32 196 120 32 196 124 32 196 124 28 196 124 28 196 124 28 196 124 28 196 124 28 196 124 28 196 128 28 196 128 28 196 128 28 196 128 28 192 128 24 192 128 24 192 128 24 192 132 24 192 132 24 192 132 24 192 132 24 192 132 24 192 132 24 192 132 20 192 136 20 192 136 20 192 136 20 192 136 20 192 136 20 192 136 20 192 136 20 192 140 20 192 140 20 188 140 16 188 140 16 188 140 16 188 140 16 188 140 16 188 144 16 188 144 16 188 144 16 188 144 16 188 144 16 188 144 12 188 144 12 188 148 12 188 148 12 188 148 12 188 148 12 188 148 12 188 148 12 188 148 12 188 148 12 148 136 60 112 124 108 116 128 112 116 128 112 116 128 116 120 128 116 120 128 120 120 128 120 120 128 124 124 132 124 124 132 128 124 132 128 124 132 132 128 132 132 128 132 136 128 132 136 132 136 140 132 136 140 132 136 144 132 136 144 136 136 148 136 136 148 136 136 152 136 136 152 140 140 156 140 140 156 140 140 160 144 140 160 144 140 164 144 140 164 144 140 168 148 144 168 148 144 172 148 144 172 148 144 176 152 144 176 152 144 180 152 144 180 156 148 184 156 148 184 156 148 188 156 148 188 160 148 192 160 148 192 160 148 196 160 148 196 164 152 200 164 152 200 164 152 204 168 152 204 168 152 208 168 152 208 168 152 212 172 156 212 172 156 216 172 156 216 172 156 220 176 156 220 176 156 224 176 156 224 176 156 224 168 152 220 164 148 216 156 148 212 152 144 212 148 144 208 140 140 204 136 140 204 132 136 200 124 136 196 120 132 196 116 132 192 108 128 188 104 128 188 100 124 184 92 124 180 88 120 180 80 120 176 76 116 172 72 116 172 64 112 168 60 112 164 56 108 164 48 108 160 44 104 156 40 104 156 32 100 152 28 100 148 24 96 148 16 96 144 12 92 140 8 92 140 12 88 136 16 88 136 20 88 136 20 88 132 24 84 132 28 84 132 28 84 128 32 84 128 36 84 128 36 80 128 40 80 124 44 80 124 44 80 124 48 76 120 52 76 120 52 76 120 56 76 116 60 76 116 60 72 116 64 72 116 68 72 112 fotocx/data/palettes/Dark_pastels.gpl0000664000175000017500000000604215247006660016704 0ustar micomicoGIMP Palette Name: Dark pastels # 56 104 184 52 104 180 52 104 180 52 104 176 52 104 176 48 104 172 48 104 172 48 100 168 48 100 168 44 100 164 44 100 164 44 100 164 44 100 160 44 100 160 40 100 156 40 100 156 40 96 152 40 96 152 36 96 148 36 96 148 36 96 144 36 96 144 32 96 140 32 96 140 32 96 136 32 92 136 28 92 132 28 92 132 28 92 128 28 92 128 24 92 124 24 92 124 24 92 120 24 92 120 24 92 120 60 108 112 96 120 104 128 132 100 164 148 92 200 160 84 232 172 80 228 168 84 228 164 88 224 160 88 224 156 92 224 152 92 220 148 96 220 144 96 220 144 100 216 140 100 216 136 104 216 132 104 212 128 108 212 124 112 208 120 112 208 120 116 208 116 116 204 112 120 204 108 120 204 104 124 200 100 124 200 96 128 200 96 128 196 100 124 192 104 124 188 108 124 184 112 124 76 196 112 72 200 112 64 204 108 60 208 108 56 208 108 60 204 112 64 204 112 64 204 116 68 200 116 68 200 120 72 200 120 76 200 124 76 196 124 80 196 128 80 196 128 84 196 132 88 192 132 88 192 132 92 192 136 92 192 136 96 188 140 100 188 140 100 188 144 104 188 144 104 184 148 108 184 148 112 184 152 112 180 152 116 180 156 116 180 156 120 180 156 120 176 160 124 176 160 128 176 164 128 176 164 132 172 168 132 172 168 136 172 172 140 172 172 140 168 176 144 168 176 144 168 180 148 168 180 152 164 180 152 164 184 156 164 184 156 160 188 160 160 188 164 160 192 164 160 192 168 156 196 168 156 196 172 156 200 176 156 200 176 152 204 180 152 204 180 152 204 184 152 208 184 148 208 188 148 212 192 148 212 192 148 216 196 144 216 196 144 220 200 144 220 204 140 224 204 140 224 208 140 228 208 140 228 212 136 228 216 136 232 216 136 232 220 136 236 220 132 236 224 132 240 228 132 240 228 132 244 232 128 244 232 128 248 236 128 248 236 128 248 232 124 240 228 124 236 224 124 232 220 120 224 216 120 220 212 120 216 212 116 212 208 116 204 204 116 200 200 112 196 196 112 192 192 112 184 188 108 180 188 108 176 184 108 168 180 104 164 176 104 160 172 104 156 168 100 148 164 100 144 164 100 140 160 100 136 156 96 128 152 96 124 148 96 120 144 92 116 140 92 108 140 92 104 136 88 100 132 88 92 128 88 88 124 84 84 120 84 80 116 84 72 116 80 68 112 80 64 108 80 60 104 76 52 100 76 48 96 76 44 96 76 40 92 80 44 92 80 48 92 80 52 92 80 56 92 80 56 92 80 60 92 84 64 88 84 68 88 84 68 88 84 72 88 84 76 88 84 80 88 88 80 88 88 84 88 88 88 84 88 92 84 88 92 84 88 96 84 92 100 84 92 104 84 92 108 84 92 108 84 92 112 80 92 116 80 96 120 80 96 120 80 96 124 80 96 128 80 96 132 80 96 132 80 100 136 76 100 140 76 100 144 76 100 144 76 100 148 76 100 152 76 104 156 76 104 160 76 104 160 72 104 164 72 104 168 72 104 172 72 108 172 72 108 176 72 108 180 72 108 184 72 108 184 68 108 188 68 112 192 68 112 196 68 112 196 68 112 200 68 112 204 68 112 208 68 112 208 64 108 204 64 108 204 64 108 200 64 108 200 60 108 196 60 108 196 60 108 192 60 108 192 56 108 188 56 104 188 56 104 184 56 104 184 fotocx/data/palettes/GrayViolet.gpl0000664000175000017500000000612215247006660016354 0ustar micomicoGIMP Palette Name: GrayViolet # 0 0 0 grey0 0 0 0 grey0 4 4 4 4 4 4 8 8 8 grey3 8 8 8 grey3 12 12 12 12 12 12 16 16 16 16 16 16 20 20 20 grey8 20 20 20 grey8 20 24 24 24 24 24 24 28 28 28 28 28 grey11 28 32 32 32 32 32 32 32 36 36 36 36 grey14 36 36 40 40 40 40 40 40 44 40 44 44 44 44 48 44 48 48 48 48 52 48 52 52 52 52 56 52 56 56 56 56 60 56 60 60 56 60 64 60 64 64 60 64 68 64 64 68 64 68 72 68 68 72 68 72 76 72 72 76 72 76 80 76 76 80 76 80 84 76 80 84 80 84 88 80 84 88 84 88 92 84 88 92 88 92 96 88 92 96 92 96 100 92 96 100 96 96 104 96 100 104 96 100 108 100 104 108 100 104 112 104 108 112 104 108 116 108 112 116 108 112 120 112 116 120 112 116 124 116 120 124 116 120 128 116 124 128 120 124 132 120 124 132 124 128 136 124 128 136 128 132 140 128 132 140 132 136 144 132 136 144 136 140 148 136 140 148 136 144 152 140 144 152 140 148 156 144 148 156 144 152 160 148 152 160 148 156 164 152 156 164 152 156 168 156 160 168 156 160 172 156 164 172 160 164 176 160 168 176 164 168 180 164 172 180 168 172 184 168 176 184 172 176 188 172 180 188 172 180 192 176 184 192 176 184 196 180 188 196 180 188 200 184 188 200 184 192 204 188 192 204 188 196 208 192 196 208 192 200 212 192 200 212 196 204 216 196 204 216 200 208 220 200 208 220 204 212 224 204 212 224 208 216 228 208 216 228 212 220 232 212 220 232 240 240 252 228 232 244 240 240 252 224 232 244 236 236 248 220 228 240 232 236 248 220 228 236 228 232 244 216 224 236 224 232 244 212 220 232 220 228 240 208 220 232 220 228 236 204 216 228 216 224 236 200 216 224 212 220 232 200 212 224 208 220 232 196 212 220 204 216 228 192 208 220 200 216 224 188 208 216 200 212 224 180 204 216 196 212 220 188 208 216 196 212 220 184 204 212 192 208 216 180 200 208 188 208 216 180 200 208 184 204 212 180 196 204 180 200 208 176 192 200 180 200 208 176 188 196 180 196 204 172 184 192 176 192 200 172 180 192 176 188 196 168 176 188 172 184 192 168 172 184 172 180 192 164 168 180 168 176 188 164 164 176 168 172 184 160 160 176 164 168 180 160 156 172 164 164 176 156 152 168 160 160 176 156 148 164 160 156 172 152 144 160 156 152 168 152 140 160 156 148 164 148 136 156 152 144 160 148 132 152 152 140 160 144 128 148 148 136 156 144 124 144 148 132 152 140 120 144 144 128 148 140 116 140 144 124 144 136 112 136 140 120 144 136 108 132 140 116 140 132 104 128 136 112 136 132 100 124 136 108 132 128 96 124 132 104 128 128 92 120 132 100 124 124 88 116 128 96 124 124 84 112 128 92 120 120 80 108 124 88 116 120 76 108 124 84 112 116 72 104 120 80 108 116 68 100 120 76 108 112 64 96 116 72 104 112 60 92 116 68 100 108 56 92 112 64 96 108 52 88 112 60 92 104 48 84 108 56 92 104 44 80 108 52 88 100 40 76 104 48 84 100 36 76 104 44 80 96 32 72 100 40 76 96 28 68 100 36 76 92 24 64 96 32 72 96 28 68 76 24 60 92 24 64 56 28 52 76 24 60 48 28 48 56 28 52 28 32 40 36 28 44 8 36 32 20 32 36 16 24 24 8 12 12 fotocx/data/palettes/Borders.gpl0000664000175000017500000000603515247006660015672 0ustar micomicoGIMP Palette Name: Borders # 204 52 180 204 52 180 204 52 184 204 48 188 200 48 192 200 44 200 200 44 204 196 40 208 196 40 212 196 36 220 192 36 224 192 32 228 192 32 232 188 28 240 188 28 244 188 24 248 188 24 252 192 28 248 192 32 248 196 36 248 196 40 244 200 44 244 200 48 244 204 48 240 204 52 240 208 56 240 208 60 236 212 64 236 212 68 236 216 72 236 216 72 232 220 76 232 220 80 232 224 84 228 224 88 228 228 92 228 228 92 224 232 96 224 232 100 224 236 104 224 236 108 220 240 112 220 240 116 220 244 116 216 244 120 216 248 124 216 248 128 212 252 132 212 252 136 212 252 136 212 244 132 208 236 128 204 232 124 200 224 120 196 216 116 192 212 112 188 204 112 184 200 108 180 192 104 176 184 100 172 180 96 168 172 92 164 168 92 160 160 88 156 152 84 152 148 80 148 140 76 144 132 72 140 128 68 136 120 68 132 116 64 128 108 60 124 100 56 120 96 52 116 88 48 112 84 48 108 76 44 104 68 40 100 64 36 96 56 32 92 48 28 88 44 24 84 36 24 80 32 20 76 24 16 72 16 12 68 12 8 64 4 4 60 0 4 60 4 12 56 8 16 56 8 20 56 12 28 52 12 32 52 16 36 52 16 40 48 20 48 48 20 52 48 24 56 44 24 64 44 28 68 44 28 72 40 32 76 40 32 84 40 36 88 36 36 92 36 40 100 36 40 104 36 44 108 32 44 112 32 172 24 56 160 20 52 152 20 52 144 20 48 136 16 48 128 16 44 120 16 44 108 16 40 100 12 40 92 12 40 84 12 36 76 8 36 68 8 32 56 8 32 48 8 28 40 4 28 32 4 24 24 4 24 16 4 24 20 12 28 24 16 32 24 20 36 28 24 40 32 28 44 32 32 48 36 36 52 36 40 56 40 44 56 44 48 60 44 52 64 48 56 68 48 60 72 52 64 76 56 68 80 56 72 84 60 76 88 60 80 88 64 88 92 68 92 96 68 96 100 72 100 104 76 104 108 76 108 112 80 112 116 80 116 120 84 120 120 88 124 124 88 128 128 92 132 132 92 136 136 96 140 140 100 144 144 100 148 148 104 152 152 104 156 152 96 148 148 88 144 148 84 140 144 76 136 144 72 132 140 64 128 140 60 124 136 52 120 136 44 116 136 40 112 132 32 108 132 28 104 128 20 100 128 16 96 124 8 92 124 4 88 124 12 92 120 16 92 116 24 92 116 28 92 112 32 92 112 40 96 108 44 96 104 48 96 104 56 96 100 60 96 100 64 96 96 72 100 96 76 100 92 80 100 88 88 100 88 92 100 84 100 104 84 104 104 80 108 104 80 116 104 76 120 104 72 124 104 72 132 108 68 136 108 68 140 108 64 148 108 60 152 108 60 156 108 56 164 112 56 168 112 52 176 112 52 180 112 48 184 112 44 192 116 44 196 116 40 200 116 40 208 116 36 212 116 36 216 116 32 224 120 28 228 120 28 232 120 24 240 120 24 244 120 20 248 120 20 244 116 28 244 112 32 244 112 36 240 108 44 240 108 48 240 104 52 236 104 56 236 100 64 236 100 68 232 96 72 232 96 76 232 92 84 228 92 88 228 88 92 228 88 96 224 84 104 224 84 108 224 80 112 220 80 116 220 76 124 220 76 128 216 72 132 216 72 136 216 68 144 212 64 148 212 64 152 212 60 160 208 60 164 208 56 168 208 56 172 fotocx/data/palettes/Firecode.gpl0000664000175000017500000000605315247006660016012 0ustar micomicoGIMP Palette Name: Firecode # 0 0 0 grey0 0 0 24 0 0 24 0 0 28 0 0 32 0 0 32 0 0 36 0 0 40 8 0 40 16 0 36 24 0 36 32 0 32 40 0 28 48 0 28 56 0 24 64 0 20 72 0 20 80 0 16 88 0 16 96 0 12 104 0 8 112 0 8 120 0 4 128 0 0 128 0 0 132 0 0 136 0 0 140 0 0 144 0 0 144 0 0 148 0 0 152 0 0 156 0 0 160 0 0 160 0 0 164 0 0 168 0 0 172 0 0 176 0 0 180 0 0 184 4 0 188 4 0 192 8 0 196 8 0 200 12 0 204 12 0 208 16 0 212 16 0 216 20 0 220 20 0 224 24 0 228 24 0 232 28 0 236 28 0 240 32 0 244 32 0 252 36 0 252 36 0 252 40 0 252 40 0 252 44 0 252 44 0 252 48 0 252 48 0 252 52 0 252 52 0 252 56 0 252 56 0 252 60 0 252 60 0 252 64 0 252 64 0 252 68 0 252 68 0 252 72 0 252 72 0 252 76 0 252 76 0 252 80 0 252 80 0 252 84 0 252 84 0 252 88 0 252 88 0 252 92 0 252 96 0 252 96 0 252 100 0 252 100 0 252 104 0 252 104 0 252 108 0 252 108 0 252 112 0 252 112 0 252 116 0 252 116 0 252 120 0 252 120 0 252 124 0 252 124 0 252 128 0 252 128 0 252 132 0 252 132 0 252 136 0 252 136 0 252 140 0 252 140 0 252 144 0 252 144 0 252 148 0 252 152 0 252 152 0 252 156 0 252 156 0 252 160 0 252 160 0 252 164 0 252 164 0 252 168 0 252 168 0 252 172 0 252 172 0 252 176 0 252 176 0 252 180 0 252 180 0 252 184 0 252 184 0 252 188 0 252 188 0 252 192 0 252 192 0 252 196 0 252 196 0 252 200 0 252 200 0 252 204 0 252 208 0 252 208 0 252 208 0 252 208 0 252 208 0 252 212 0 252 212 0 252 212 0 252 212 0 252 216 0 252 216 0 252 216 0 252 216 0 252 216 0 252 220 0 252 220 0 252 220 0 252 220 0 252 224 0 252 224 0 252 224 0 252 224 0 252 228 0 252 228 0 252 228 0 252 228 0 252 228 0 252 232 0 252 232 0 252 232 0 252 232 0 252 236 0 252 236 0 252 236 0 252 236 0 252 240 0 252 240 0 252 240 0 252 240 0 252 240 0 252 244 0 252 244 0 252 244 0 252 244 0 252 248 0 252 248 0 252 248 0 252 248 0 252 252 0 252 252 4 252 252 8 252 252 12 252 252 16 252 252 20 252 252 24 252 252 28 252 252 32 252 252 36 252 252 40 252 252 40 252 252 44 252 252 48 252 252 52 252 252 56 252 252 60 252 252 64 252 252 68 252 252 72 252 252 76 252 252 80 252 252 84 252 252 84 252 252 88 252 252 92 252 252 96 252 252 100 252 252 104 252 252 108 252 252 112 252 252 116 252 252 120 252 252 124 252 252 124 252 252 128 252 252 132 252 252 136 252 252 140 252 252 144 252 252 148 252 252 152 252 252 156 252 252 160 252 252 164 252 252 168 252 252 168 252 252 172 252 252 176 252 252 180 252 252 184 252 252 188 252 252 192 252 252 196 252 252 200 252 252 204 252 252 208 252 252 208 252 252 212 252 252 216 252 252 220 252 252 224 252 252 228 252 252 232 252 252 236 252 252 240 252 252 244 252 252 248 252 252 252 grey99 fotocx/data/palettes/Grayblue.gpl0000664000175000017500000000603615247006660016045 0ustar micomicoGIMP Palette Name: Grayblue # 124 164 128 124 164 128 124 164 124 124 160 124 124 160 124 120 160 124 120 160 124 120 156 124 120 156 124 120 156 120 116 156 120 116 152 120 116 152 120 116 152 120 116 152 120 112 148 116 112 148 116 112 148 116 112 148 116 112 144 116 108 144 116 108 144 112 108 144 112 108 140 112 108 140 112 104 140 112 104 140 112 104 136 108 104 136 108 100 136 108 100 136 108 100 132 108 100 132 108 100 132 104 96 132 104 96 128 104 96 128 104 96 128 104 96 128 104 92 124 100 92 124 100 92 124 100 92 124 100 92 120 100 88 120 100 88 120 96 88 120 96 88 116 96 88 116 96 84 116 96 84 116 96 84 112 96 84 112 92 80 112 92 80 112 92 80 108 92 80 108 92 80 108 92 76 108 88 76 104 88 76 104 88 76 104 88 76 100 88 72 100 88 72 100 84 72 100 84 72 96 84 72 96 84 68 96 84 68 96 84 68 92 80 68 92 80 68 92 80 64 92 80 64 88 80 64 88 80 64 88 76 60 88 76 60 84 76 60 84 76 60 84 76 60 84 76 56 80 72 56 80 72 56 80 72 56 80 72 56 76 72 52 76 72 52 76 72 52 76 68 52 72 68 52 72 68 48 72 68 48 72 68 48 68 68 48 68 64 48 68 64 44 68 64 44 64 64 44 64 64 44 64 64 40 64 60 40 60 60 40 60 60 40 60 60 40 60 60 36 56 60 36 56 56 36 56 56 36 56 56 36 52 56 32 52 56 32 52 56 32 52 52 32 48 52 32 48 52 28 48 52 28 48 52 28 44 52 28 44 48 28 44 48 24 44 48 24 40 48 24 40 48 24 40 48 20 36 44 24 40 48 24 40 48 24 40 48 24 40 48 24 40 52 24 40 52 24 40 52 28 44 52 28 44 56 28 44 56 28 44 56 28 44 56 28 44 56 28 44 60 28 48 60 32 48 60 32 48 60 32 48 64 32 48 64 32 48 64 32 48 64 32 52 64 36 52 68 36 52 68 36 52 68 36 52 68 36 52 72 36 52 72 36 52 72 36 56 72 40 56 72 40 56 76 40 56 76 40 56 76 40 56 76 40 56 80 40 60 80 44 60 80 44 60 80 44 60 80 44 60 84 44 60 84 44 60 84 44 64 84 44 64 88 48 64 88 48 64 88 48 64 88 48 64 88 48 64 92 48 64 92 48 68 92 48 68 92 52 68 96 52 68 96 52 68 96 52 68 96 52 68 96 52 72 100 52 72 100 56 72 100 56 72 100 56 72 104 56 72 104 56 72 104 56 76 104 56 76 104 56 76 108 60 76 108 60 76 108 60 76 108 60 76 112 60 80 112 60 80 112 60 80 112 64 80 112 64 80 116 64 80 116 64 80 116 64 80 116 64 84 120 64 84 120 64 84 120 68 84 120 68 84 120 68 84 124 68 84 124 68 88 124 68 88 124 68 88 128 72 88 128 72 88 128 72 88 128 72 88 128 72 92 132 72 92 132 72 92 132 72 92 132 76 92 136 76 92 136 76 92 136 76 92 136 76 96 140 76 96 140 76 96 140 76 96 140 80 96 140 80 96 144 80 96 144 80 100 144 80 100 144 80 100 148 80 100 148 84 100 148 84 100 148 84 100 148 84 104 152 84 104 152 84 104 152 84 104 152 84 104 156 88 104 156 88 104 156 88 104 156 88 108 156 88 108 160 88 108 160 88 108 160 92 108 160 92 108 164 fotocx/data/palettes/Volcano.gpl0000664000175000017500000000613315247006660015672 0ustar micomicoGIMP Palette Name: Volcano # 0 0 0 grey0 0 0 0 grey0 0 0 8 0 0 16 0 0 24 0 0 32 0 0 40 0 0 48 0 0 56 0 0 64 0 0 72 0 0 84 0 0 92 0 0 100 0 0 108 0 0 116 0 0 124 0 0 132 0 0 140 0 0 148 0 0 156 0 0 168 0 0 176 0 0 184 0 0 192 0 0 200 0 0 208 0 0 216 0 0 224 0 0 232 0 0 240 0 0 252 8 0 252 16 0 252 24 0 252 32 0 252 40 0 252 48 0 252 56 0 252 64 0 252 72 0 252 84 0 252 92 0 252 100 0 252 108 0 252 116 0 252 124 0 252 132 0 252 140 0 252 148 0 252 156 0 252 168 0 252 176 0 252 184 0 252 192 0 252 200 0 252 208 0 252 216 0 252 224 0 252 232 0 252 240 0 252 252 0 252 252 0 244 252 0 236 252 0 228 252 0 220 252 0 212 252 0 200 252 0 192 252 0 184 252 0 176 252 0 168 252 0 160 252 0 148 252 0 140 252 0 132 252 0 124 252 0 116 252 0 108 252 0 96 252 0 88 252 0 80 252 0 72 252 0 64 252 0 56 252 0 44 252 0 36 252 0 28 252 0 20 252 0 12 252 0 0 252 8 0 252 16 0 252 24 0 252 32 0 252 40 0 252 48 0 252 56 0 252 64 0 252 72 0 252 80 0 252 88 0 252 96 0 252 104 0 252 112 0 252 120 0 252 128 0 252 128 0 252 132 0 252 136 0 252 140 0 252 144 0 252 148 0 252 152 0 252 156 0 252 160 0 252 164 0 252 168 0 252 172 0 252 176 0 252 180 0 252 184 0 252 188 0 252 192 0 252 196 0 252 200 0 252 204 0 252 208 0 252 212 0 252 216 0 252 220 0 252 224 0 252 228 0 252 232 0 252 236 0 252 240 0 252 244 0 252 248 0 252 252 0 248 252 0 240 252 0 232 252 0 224 252 0 216 252 0 208 252 0 200 252 0 192 252 0 184 252 0 176 252 0 168 252 0 160 252 0 152 252 0 144 252 0 136 252 0 128 252 0 124 252 0 LawnGreen 116 252 0 108 252 0 100 252 0 92 252 0 84 252 0 76 252 0 68 252 0 60 252 0 52 252 0 44 252 0 36 252 0 28 252 0 20 252 0 12 252 0 4 252 0 12 252 0 20 252 0 28 252 0 36 252 0 44 252 0 52 252 0 60 252 0 68 252 0 76 252 0 84 252 0 92 252 0 100 252 0 108 252 0 116 252 0 124 252 0 LawnGreen 128 252 0 132 252 0 136 252 0 140 252 0 144 252 0 148 252 0 152 252 0 156 252 0 160 252 0 164 252 0 168 252 0 172 252 0 176 252 0 180 252 0 184 252 0 188 252 0 192 252 0 196 252 0 200 252 0 204 252 0 208 252 0 212 252 0 216 252 0 220 252 0 224 252 0 228 252 0 232 252 0 236 252 0 240 252 0 244 252 0 248 252 0 252 252 0 252 232 0 252 208 0 252 184 0 252 164 0 252 140 0 252 116 0 252 92 0 252 72 0 252 48 0 252 24 0 252 0 0 252 8 0 252 20 0 252 32 0 252 44 0 252 56 0 252 68 0 252 80 0 252 88 0 252 100 0 252 112 0 252 124 0 252 136 0 252 148 0 252 160 0 252 168 0 252 180 0 252 192 0 252 204 0 252 216 0 252 228 0 252 240 0 252 252 0 0 0 0 grey0 0 0 0 grey0 0 0 0 grey0 0 0 0 grey0 0 0 0 grey0 fotocx/data/palettes/Hilite.gpl0000664000175000017500000000603415247006660015507 0ustar micomicoGIMP Palette Name: Hilite # 164 144 180 160 144 180 160 144 180 160 144 176 160 144 176 160 140 172 160 140 172 160 140 168 160 140 168 160 140 168 160 140 164 160 136 164 156 136 160 156 136 160 156 136 156 156 136 156 156 136 156 156 132 152 156 132 152 156 132 148 156 132 148 156 132 144 156 132 144 152 128 144 152 128 140 152 128 140 152 128 136 152 128 136 152 128 132 152 128 132 152 124 132 152 124 128 152 124 128 152 124 124 148 124 124 148 124 120 148 120 120 148 120 120 148 120 116 148 120 116 148 120 112 148 120 112 148 116 108 148 116 108 144 116 108 144 116 104 144 116 104 144 116 100 144 112 100 144 112 96 144 112 96 144 112 96 144 112 92 144 112 92 144 112 88 140 108 88 140 108 84 140 108 84 140 108 84 140 108 80 140 108 80 140 104 76 140 104 76 140 104 72 140 104 72 140 104 72 136 104 68 136 100 68 136 100 64 136 100 64 136 100 60 136 100 60 136 100 60 136 96 56 136 96 56 136 96 52 136 96 52 132 96 48 132 96 48 132 96 48 132 92 44 132 92 44 132 92 40 132 92 40 132 92 36 132 92 36 132 88 36 132 88 32 128 88 32 128 88 28 128 88 28 128 88 24 128 84 24 128 84 24 128 84 20 128 84 20 128 84 16 128 84 16 124 80 12 124 80 12 124 80 12 124 84 16 128 84 16 128 88 20 128 88 20 128 92 24 132 92 24 132 92 28 132 96 28 136 96 32 136 100 32 136 100 32 136 104 36 140 104 36 140 108 40 140 108 40 144 108 44 144 112 44 144 112 48 144 116 48 148 116 52 148 120 52 148 120 56 152 120 56 152 124 56 152 124 60 152 128 60 156 128 64 156 132 64 156 132 68 160 136 68 160 136 72 160 136 72 160 140 76 164 140 76 164 144 76 164 144 80 164 148 80 168 148 84 168 148 84 168 152 88 172 152 88 172 156 92 172 156 92 172 160 96 176 160 96 176 164 100 176 164 100 180 164 100 180 168 104 180 168 104 180 172 108 184 172 108 184 176 112 184 176 112 188 176 116 188 180 116 188 180 120 188 184 120 192 184 120 192 188 124 192 188 124 196 192 128 196 192 128 196 192 132 196 196 132 200 196 136 200 200 136 200 200 140 200 204 140 204 204 144 204 204 144 204 208 144 208 208 148 208 212 148 208 212 152 208 216 152 212 216 156 212 220 156 212 220 160 216 220 160 216 224 164 216 224 164 216 228 164 220 228 168 220 232 168 220 232 172 224 232 172 224 236 176 224 236 176 224 240 180 228 240 180 228 244 184 228 244 184 232 248 188 232 248 188 232 248 188 232 248 188 228 244 188 228 244 188 228 244 188 224 244 188 224 240 188 224 240 188 220 240 188 220 236 188 220 236 188 216 236 188 216 236 188 216 232 188 212 232 188 212 232 184 212 228 184 208 228 184 208 228 184 208 228 184 204 224 184 204 224 184 204 224 184 204 220 184 200 220 184 200 220 184 200 220 184 196 216 184 196 216 184 196 216 184 192 212 184 192 212 184 192 212 180 188 212 180 188 208 180 188 208 180 184 208 180 184 204 180 184 204 180 180 204 180 180 204 180 180 200 180 176 200 180 176 200 180 176 196 180 172 196 180 172 196 180 172 196 180 172 192 180 168 192 176 168 192 176 168 188 176 164 188 176 164 188 176 164 188 176 160 184 176 160 184 176 160 184 176 156 180 176 156 180 176 fotocx/data/palettes/Bears.gpl0000664000175000017500000000605515247006660015330 0ustar micomicoGIMP Palette Name: Bears # 8 8 8 grey3 68 44 44 80 8 12 72 56 56 104 84 68 116 96 80 84 56 44 140 104 88 172 116 92 68 44 56 88 72 68 112 84 76 8 8 28 104 96 84 128 116 96 164 136 104 120 116 116 136 128 108 204 160 112 220 184 124 104 100 108 120 116 140 128 124 140 128 132 152 132 144 164 204 172 124 144 152 168 224 196 136 136 152 172 144 156 176 204 184 152 148 164 184 228 212 164 96 8 8 116 112 128 144 116 96 132 132 124 224 220 192 128 104 84 56 40 40 84 56 56 228 208 148 196 144 108 160 124 100 96 80 76 56 24 24 148 96 80 140 56 16 60 8 12 224 216 176 160 168 184 60 52 52 152 152 160 208 184 136 184 152 112 216 172 116 220 200 152 88 8 32 92 56 68 68 12 44 24 8 8 128 84 76 192 120 20 24 12 28 56 24 40 236 232 192 148 148 128 148 136 112 112 108 96 140 40 44 80 12 48 136 100 72 80 44 48 112 104 116 72 12 36 124 36 32 44 20 40 104 72 68 56 40 24 132 92 80 140 132 148 104 68 56 184 64 8 44 8 8 68 44 28 112 8 12 28 24 40 92 40 44 40 8 24 112 68 68 56 8 36 128 84 56 144 104 72 100 32 12 176 28 8 68 36 44 152 108 80 120 96 64 116 8 36 88 44 56 220 208 184 92 68 56 228 228 204 124 56 44 180 136 104 204 136 16 152 96 72 80 40 8 88 12 60 80 60 68 172 172 172 164 116 84 140 140 156 124 88 68 156 112 92 124 120 132 76 44 56 124 36 8 120 72 44 72 56 64 240 244 212 172 128 92 216 204 168 176 92 12 92 56 56 44 24 24 136 76 64 116 68 56 44 40 40 232 240 236 96 60 48 168 116 72 124 60 20 100 40 56 112 76 60 24 8 40 72 56 44 192 168 132 152 160 172 232 224 176 248 252 236 156 56 8 160 100 84 140 116 84 8 8 48 136 68 44 104 12 48 120 76 68 228 228 220 176 172 156 188 140 96 172 80 40 44 28 40 124 36 60 140 28 76 88 72 80 44 8 40 184 104 60 132 88 64 160 104 72 124 76 64 92 12 48 184 180 180 104 72 48 44 40 28 56 44 56 36 12 48 96 44 36 192 192 192 164 176 192 188 128 96 160 84 72 108 56 52 172 156 128 148 72 24 164 160 164 80 36 56 156 84 8 152 128 92 144 16 48 152 8 8 76 52 28 148 40 12 220 220 208 104 56 60 128 64 64 68 28 56 208 192 160 136 136 140 44 36 56 44 40 16 148 80 56 120 72 12 80 68 56 148 92 44 188 184 160 156 160 140 112 20 40 144 88 76 192 180 144 180 200 188 56 56 60 72 68 72 104 60 32 148 64 68 172 112 36 212 204 192 144 96 60 112 36 44 56 36 56 116 56 64 148 144 148 172 160 144 12 60 72 96 64 8 128 72 72 36 40 40 116 48 12 112 40 56 168 96 60 196 192 172 184 168 128 96 92 100 204 212 188 92 24 40 132 100 16 204 216 204 188 124 68 156 60 44 76 28 24 92 88 84 204 152 100 136 52 64 84 80 72 92 76 32 28 36 16 140 84 68 56 12 56 132 84 16 84 40 28 44 72 80 196 136 88 172 96 80 132 12 12 120 12 56 180 116 84 204 196 176 164 148 116 136 80 76 8 32 44 204 8 20 0 0 0 grey0 40 0 0 0 56 92 0 0 4 0 0 0 grey0 fotocx/data/palettes/Lights.gpl0000664000175000017500000000110215247006660015512 0ustar micomicoGIMP Palette Name: Lights # 255 250 250 Snow 248 248 255 Ghost White 245 245 245 White Smoke 220 220 220 Gainsboro 255 250 240 Floral White 253 245 230 Old Lace 250 240 230 Linen 250 235 215 Antique White 255 239 213 Papaya Whip 255 235 205 Blanched Almond 255 228 196 Bisque 255 218 185 Peach Puff 255 222 173 Navajo White 255 228 181 Moccasin 255 248 220 Cornsilk 255 255 240 Ivory 255 250 205 Lemon Chiffon 255 245 238 Seashell 240 255 240 Honeydew 245 255 250 Mint Cream 240 255 255 Azure 240 248 255 Alice Blue 230 230 250 Lavender 255 228 225 Misty Rose 255 255 255 White fotocx/data/palettes/Coldfire.gpl0000664000175000017500000000604515247006660016022 0ustar micomicoGIMP Palette Name: Coldfire # 0 172 252 0 172 252 0 172 252 0 168 252 0 164 252 0 160 252 0 156 252 0 152 252 0 152 252 0 148 252 0 144 252 0 140 252 0 136 252 0 132 252 0 132 252 0 128 252 0 124 252 0 120 252 0 116 252 0 112 252 0 112 252 0 108 252 0 104 252 0 100 252 0 96 252 0 92 252 0 92 252 0 88 252 0 84 252 0 80 252 0 76 252 0 72 252 0 68 252 0 64 252 0 60 252 0 56 252 0 52 252 0 48 252 0 44 252 0 40 252 0 36 252 0 32 252 0 28 252 0 24 252 0 20 252 0 16 252 0 12 252 0 8 252 0 4 252 0 4 252 4 4 248 4 4 248 8 4 244 8 8 240 12 8 240 12 8 236 16 8 232 16 12 232 20 12 228 20 12 224 24 12 224 24 16 220 28 16 216 28 16 216 32 16 212 32 20 212 36 20 208 36 20 204 40 20 204 40 24 200 44 24 196 44 24 196 48 24 192 48 24 188 52 28 188 52 28 184 56 28 180 56 28 180 60 32 176 60 32 172 64 32 172 64 32 168 68 36 168 68 36 164 72 36 160 72 36 160 76 40 156 76 40 152 80 40 152 80 40 148 84 44 144 84 44 144 88 44 140 88 44 136 92 48 136 92 48 132 96 48 128 100 48 128 100 48 124 104 52 124 104 52 120 108 52 116 108 52 116 112 56 112 112 56 108 116 56 108 116 56 104 120 60 100 120 60 100 124 60 96 124 60 92 128 64 92 128 64 88 132 64 88 132 64 84 136 68 80 136 68 80 140 68 76 140 68 72 144 72 72 144 72 68 148 72 64 148 72 64 152 72 60 152 76 56 156 76 56 156 76 52 160 76 48 160 80 48 164 80 44 164 80 44 168 80 40 168 84 36 172 84 36 172 84 32 176 84 28 176 88 28 180 88 24 180 88 20 184 88 20 184 92 16 188 92 12 188 92 12 192 92 8 196 96 4 196 96 4 196 100 4 196 100 4 196 104 4 200 108 4 200 108 4 200 112 4 200 112 4 200 116 4 204 120 4 204 120 4 204 124 4 204 124 4 208 128 4 208 132 4 208 132 4 208 136 4 208 136 4 212 140 4 212 144 4 212 144 4 212 148 4 216 152 4 216 152 4 216 156 4 216 156 4 216 160 4 220 164 4 220 164 4 220 168 4 220 168 4 224 172 4 224 176 4 224 176 4 224 180 4 224 180 4 228 184 4 228 188 4 228 188 4 228 192 4 228 192 4 232 196 4 232 200 4 232 200 4 232 204 4 236 208 4 236 208 4 236 212 4 236 212 4 236 216 4 240 220 4 240 220 4 240 224 4 240 224 4 244 228 4 244 232 4 244 232 4 244 236 4 244 236 4 248 240 4 248 244 4 248 244 4 248 248 4 252 252 0 252 252 104 252 252 104 252 252 108 252 252 112 252 252 116 252 252 120 252 252 120 252 252 124 252 252 128 252 252 132 252 252 136 252 252 136 252 252 140 252 252 144 252 252 148 252 252 152 252 252 152 252 252 156 252 252 160 252 252 164 252 252 168 252 252 168 252 252 172 252 252 176 252 252 180 252 252 184 252 252 184 252 252 188 252 252 192 252 252 196 252 252 200 252 252 200 252 252 204 252 252 208 252 252 212 252 252 216 252 252 216 252 252 220 252 252 224 252 252 228 252 252 232 252 252 232 252 252 236 252 252 240 252 252 244 252 252 248 252 252 252 grey99 fotocx/data/palettes/Cascade.gpl0000664000175000017500000000603515247006660015615 0ustar micomicoGIMP Palette Name: Cascade # 108 88 128 108 88 128 108 88 128 104 92 132 104 92 132 100 92 132 96 92 132 96 96 136 92 96 136 92 96 136 88 96 136 84 100 140 84 100 140 80 100 140 76 96 136 80 100 140 84 104 144 88 104 148 92 108 148 96 112 152 100 112 156 104 116 160 108 116 160 112 120 164 116 124 168 120 124 168 124 128 172 128 128 176 132 132 180 136 136 180 140 136 184 144 140 188 148 140 188 152 144 192 156 148 196 160 148 200 164 152 200 168 156 204 172 156 208 176 160 212 180 160 212 184 164 216 188 168 220 192 168 220 196 172 224 200 172 228 204 176 232 208 180 232 212 180 236 216 184 240 220 184 240 216 180 236 216 180 236 216 180 236 212 180 236 212 180 236 212 180 236 212 180 236 208 180 232 208 176 232 208 176 232 208 176 232 204 176 232 204 176 232 204 176 232 200 176 232 200 176 228 200 176 228 200 172 228 196 172 228 196 172 228 196 172 228 196 172 228 192 172 228 192 172 224 192 172 224 188 172 224 188 168 224 188 168 224 188 168 224 184 168 224 184 168 224 184 168 220 184 168 220 180 168 220 180 168 220 180 164 220 176 164 220 176 164 220 176 164 220 176 164 216 172 164 216 172 164 216 172 164 216 172 160 216 168 160 216 168 160 216 168 160 216 164 160 212 164 160 212 164 160 212 164 160 212 160 160 212 160 156 212 160 156 212 160 156 212 156 156 208 156 156 208 156 156 208 152 156 208 152 156 208 152 156 208 152 152 208 148 152 208 148 152 204 148 152 204 148 152 204 144 152 204 144 152 204 144 152 204 140 152 204 140 148 204 140 148 200 140 148 200 136 148 200 136 148 200 136 148 200 136 148 200 132 148 200 132 148 200 132 144 196 128 144 196 128 144 196 128 144 196 128 144 196 124 144 196 124 144 196 124 144 192 124 140 192 120 140 192 120 140 192 120 140 192 116 140 192 116 140 192 116 140 192 116 140 188 112 140 188 112 136 188 112 136 188 112 136 188 108 136 188 108 136 188 108 136 188 104 136 184 104 136 184 104 136 184 104 132 184 100 132 184 100 132 184 100 132 184 100 132 184 96 132 180 96 132 180 96 132 180 92 132 180 92 128 180 92 128 180 92 128 180 88 128 180 88 128 176 88 128 176 88 128 176 84 128 176 84 124 176 84 124 176 80 124 176 80 124 176 80 124 172 80 124 172 76 124 172 76 124 172 76 124 172 76 120 172 72 120 172 72 120 172 72 120 168 68 120 168 68 120 168 68 120 168 68 120 168 64 120 168 64 116 168 64 116 168 64 116 164 60 116 164 60 116 164 60 116 164 56 116 164 56 116 164 56 116 164 56 112 164 52 112 160 52 112 160 52 112 160 52 112 160 48 112 160 48 112 160 48 112 160 44 116 156 48 112 160 48 112 160 48 112 160 48 112 160 48 112 160 48 112 160 48 112 160 48 112 160 48 112 160 48 112 160 52 112 160 52 112 160 52 112 160 52 112 160 52 112 160 52 112 160 52 112 160 52 112 160 52 112 160 52 112 160 52 112 160 56 112 160 56 112 160 56 112 160 56 112 160 56 112 160 160 68 108 156 68 108 156 68 108 152 72 112 152 72 112 148 72 112 144 72 112 144 76 116 140 76 116 140 76 116 136 76 116 132 80 120 132 80 120 128 80 120 128 80 120 124 84 124 120 84 124 120 84 124 116 84 124 116 88 128 112 88 128 fotocx/data/palettes/Default.gpl0000664000175000017500000000076215247006660015657 0ustar micomicoGIMP Palette Name: Default # 255 0 0 Red 255 0 255 Magenta 0 0 255 Blue 0 255 255 Cyan 0 255 0 Green 255 255 0 Yellow 127 0 0 Dark Red 127 0 127 Dark Magenta 0 0 127 Dark Blue 0 127 127 Dark Cyan 0 127 0 Dark Green 130 127 0 Dark Yellow 0 0 0 Black 25 25 25 Gray 10% 51 51 51 Gray 20% 76 76 76 Gray 30% 102 102 102 Gray 40% 127 127 127 Gray 50% 153 153 153 Gray 60% 178 178 178 Gray 70% 204 204 204 Gray 80% 229 229 229 Gray 90% 255 255 255 White fotocx/data/palettes/News3.gpl0000664000175000017500000000603315247006660015267 0ustar micomicoGIMP Palette Name: News3 # 236 232 4 236 232 4 232 232 4 228 232 4 228 232 4 224 232 4 220 232 4 220 232 4 216 232 4 212 228 4 212 228 4 208 228 4 204 228 4 204 228 4 200 228 4 196 228 4 196 228 4 192 228 4 188 228 4 188 228 4 184 228 4 180 224 4 180 224 4 176 224 4 172 224 4 172 224 4 168 224 4 164 224 4 164 224 8 160 224 8 156 224 8 156 224 8 152 220 8 148 220 8 148 220 8 144 220 8 140 220 8 140 220 8 136 220 8 132 220 8 132 220 8 128 220 8 124 220 8 124 220 8 120 216 8 116 216 8 112 216 8 112 216 8 108 216 8 104 216 8 104 216 8 100 216 8 96 216 8 96 216 8 92 216 8 88 212 8 88 212 8 84 212 8 80 212 8 80 212 12 76 212 12 72 212 12 72 212 12 68 212 12 64 212 12 64 212 12 60 212 12 56 208 12 56 208 12 52 208 12 48 208 12 48 208 12 44 208 12 40 208 12 40 208 12 36 208 12 32 208 12 32 208 12 28 204 12 24 204 12 24 204 12 20 204 12 16 204 12 16 204 12 12 204 12 8 204 12 8 204 12 4 204 12 0 204 12 0 204 12 8 200 28 16 196 40 24 192 52 32 188 64 40 188 76 48 184 88 56 180 100 64 176 112 72 176 124 68 184 120 64 188 120 60 192 116 56 196 116 52 204 116 48 208 112 44 212 112 40 216 112 36 212 116 36 212 120 32 212 124 32 208 124 28 208 128 28 208 132 28 204 136 24 204 136 24 204 140 20 200 144 20 200 144 20 200 148 16 196 152 16 196 156 12 196 156 12 192 160 12 192 164 8 192 168 8 188 168 4 188 172 4 188 176 4 188 176 8 180 172 12 172 168 12 164 168 16 156 164 16 148 164 20 140 160 20 132 160 24 124 156 24 116 156 28 108 152 28 100 152 32 92 148 32 84 148 36 76 144 36 68 144 40 60 140 40 52 140 44 44 136 44 40 136 48 36 132 48 36 132 48 36 128 48 36 128 48 36 128 48 36 124 48 36 124 48 36 124 48 36 120 48 36 120 48 32 116 48 32 116 48 32 116 48 32 112 48 32 112 48 32 112 52 32 108 52 32 108 52 32 104 52 32 104 52 32 104 52 28 100 52 28 100 52 28 100 52 28 96 52 28 96 52 28 96 52 28 92 52 28 92 52 28 88 52 28 88 52 24 88 52 24 84 56 24 84 56 24 84 56 24 80 56 24 80 56 24 76 56 24 76 56 24 76 56 24 72 56 24 72 56 20 72 56 20 68 56 20 68 56 20 68 56 20 64 56 20 64 56 20 60 56 20 60 60 20 60 60 20 56 60 16 56 60 16 56 60 16 52 60 16 52 60 16 48 60 16 48 60 16 48 60 16 44 60 16 44 60 16 44 60 16 40 60 12 40 60 12 40 60 12 36 60 12 36 64 12 32 64 12 32 64 12 32 64 12 28 64 12 28 64 12 28 64 8 24 64 8 24 64 8 20 64 8 20 64 8 20 64 8 16 64 8 16 64 8 16 64 8 12 64 8 12 64 8 12 68 12 16 68 16 16 68 16 16 68 20 16 68 20 20 72 24 20 72 24 20 72 28 20 72 28 24 72 32 24 76 32 24 76 36 24 76 36 28 76 40 28 76 44 28 80 44 28 80 48 32 80 48 32 80 52 32 80 52 32 84 56 36 84 56 36 84 60 36 84 60 36 fotocx/data/palettes/Royal.gpl0000664000175000017500000000605715247006660015364 0ustar micomicoGIMP Palette Name: Royal # 0 0 0 grey0 60 0 80 60 0 80 60 0 84 64 0 84 64 0 84 64 0 88 64 0 88 68 0 88 68 0 92 68 0 92 68 0 92 72 0 96 72 0 96 72 0 96 72 0 100 76 0 100 76 0 100 76 0 104 76 0 104 76 0 104 80 0 104 80 0 108 80 0 108 80 0 108 84 0 112 84 0 112 84 0 112 84 0 116 88 0 116 88 0 116 88 0 120 88 0 120 92 0 120 92 0 124 92 0 124 92 0 124 96 0 128 96 0 128 96 0 128 96 0 132 96 0 132 100 0 132 100 0 132 100 0 136 100 0 136 104 0 136 104 0 140 104 0 140 104 0 140 108 0 144 108 0 144 108 0 144 108 0 148 112 0 148 112 0 148 112 0 152 112 0 152 116 0 152 116 0 156 116 0 156 116 0 156 120 0 160 120 0 160 124 4 160 124 8 164 128 12 164 128 16 164 132 20 168 132 24 168 136 28 168 136 32 172 140 36 172 140 40 172 144 44 176 144 48 176 148 52 180 148 56 180 152 60 180 152 64 184 156 68 184 156 72 184 160 76 188 160 80 188 164 84 188 164 88 192 168 92 192 168 96 192 172 100 196 172 104 196 176 108 200 176 112 200 180 116 200 180 120 204 184 124 204 188 128 204 188 132 208 192 136 208 192 140 208 196 144 212 196 148 212 200 152 216 200 156 216 204 160 216 204 164 220 208 168 220 208 172 220 212 176 224 212 180 224 216 184 224 216 188 228 220 192 228 220 196 228 224 200 232 224 204 232 228 208 236 228 212 236 232 216 236 232 220 240 236 224 240 236 228 240 240 232 244 240 236 244 244 240 244 244 244 248 248 248 248 252 252 252 grey99 252 252 252 grey99 252 252 248 252 252 244 252 252 240 252 252 236 252 252 232 252 252 228 252 252 224 252 252 220 252 252 216 252 252 212 252 252 208 252 252 204 252 252 200 252 252 196 252 252 192 252 252 188 252 252 184 252 252 180 252 252 176 252 252 172 252 252 168 252 252 164 252 252 160 252 252 156 252 252 152 252 252 148 252 252 144 252 252 140 252 252 136 252 252 132 252 252 128 252 252 124 252 252 120 252 252 116 252 252 112 252 252 108 252 252 104 252 252 100 252 252 96 252 252 92 252 252 88 252 252 84 252 252 80 252 252 76 252 252 72 252 252 68 252 252 64 252 252 60 252 252 56 252 252 52 252 252 48 252 252 44 252 252 40 252 252 36 252 252 32 252 252 28 252 252 24 252 252 20 252 252 16 252 252 12 252 252 8 252 252 4 252 252 0 252 248 0 248 244 0 244 240 0 240 236 4 240 232 4 236 228 4 232 224 8 228 220 8 228 216 8 224 212 12 220 208 12 216 204 12 212 200 16 212 196 16 208 192 16 204 188 20 200 184 20 200 180 20 196 176 24 192 172 24 188 168 24 184 164 28 184 160 28 180 156 28 176 152 32 172 148 32 172 144 32 168 140 36 164 136 36 160 132 36 160 128 36 156 124 40 152 120 40 148 116 40 144 112 44 144 108 44 140 104 44 136 100 48 132 96 48 132 92 48 128 88 52 124 84 52 120 80 52 116 76 56 116 72 56 112 68 56 108 64 60 104 60 60 104 56 60 100 52 64 96 48 64 92 44 64 88 40 68 88 36 68 84 32 68 80 28 72 76 24 72 76 20 72 72 16 76 68 12 76 64 8 76 60 0 80 60 0 80 60 0 80 60 0 80 fotocx/data/palettes/Named_Colors.gpl0000664000175000017500000004110015247006660016627 0ustar micomicoGIMP Palette Name: Named Colors Columns: 16 # 255 250 250 snow (255 250 250) 248 248 255 ghost white (248 248 255) 245 245 245 white smoke (245 245 245) 220 220 220 gainsboro (220 220 220) 255 250 240 floral white (255 250 240) 253 245 230 old lace (253 245 230) 250 240 230 linen (250 240 230) 250 235 215 antique white (250 235 215) 255 239 213 papaya whip (255 239 213) 255 235 205 blanched almond (255 235 205) 255 228 196 bisque (255 228 196) 255 218 185 peach puff (255 218 185) 255 222 173 navajo white (255 222 173) 255 228 181 moccasin (255 228 181) 255 248 220 cornsilk (255 248 220) 255 255 240 ivory (255 255 240) 255 250 205 lemon chiffon (255 250 205) 255 245 238 seashell (255 245 238) 240 255 240 honeydew (240 255 240) 245 255 250 mint cream (245 255 250) 240 255 255 azure (240 255 255) 240 248 255 alice blue (240 248 255) 230 230 250 lavender (230 230 250) 255 240 245 lavender blush (255 240 245) 255 228 225 misty rose (255 228 225) 255 255 255 white (255 255 255) 0 0 0 black ( 0 0 0) 47 79 79 dark slate gray ( 47 79 79) 105 105 105 dim gray (105 105 105) 112 128 144 slate gray (112 128 144) 119 136 153 light slate gray (119 136 153) 190 190 190 gray (190 190 190) 211 211 211 light gray (211 211 211) 25 25 112 midnight blue ( 25 25 112) 0 0 128 navy blue ( 0 0 128) 100 149 237 cornflower blue (100 149 237) 72 61 139 dark slate blue ( 72 61 139) 106 90 205 slate blue (106 90 205) 123 104 238 medium slate blue (123 104 238) 132 112 255 light slate blue (132 112 255) 0 0 205 medium blue ( 0 0 205) 65 105 225 royal blue ( 65 105 225) 0 0 255 blue ( 0 0 255) 30 144 255 dodger blue ( 30 144 255) 0 191 255 deep sky blue ( 0 191 255) 135 206 235 sky blue (135 206 235) 135 206 250 light sky blue (135 206 250) 70 130 180 steel blue ( 70 130 180) 176 196 222 light steel blue (176 196 222) 173 216 230 light blue (173 216 230) 176 224 230 powder blue (176 224 230) 175 238 238 pale turquoise (175 238 238) 0 206 209 dark turquoise ( 0 206 209) 72 209 204 medium turquoise ( 72 209 204) 64 224 208 turquoise ( 64 224 208) 0 255 255 cyan ( 0 255 255) 224 255 255 light cyan (224 255 255) 95 158 160 cadet blue ( 95 158 160) 102 205 170 medium aquamarine (102 205 170) 127 255 212 aquamarine (127 255 212) 0 100 0 dark green ( 0 100 0) 85 107 47 dark olive green ( 85 107 47) 143 188 143 dark sea green (143 188 143) 46 139 87 sea green ( 46 139 87) 60 179 113 medium sea green ( 60 179 113) 32 178 170 light sea green ( 32 178 170) 152 251 152 pale green (152 251 152) 0 255 127 spring green ( 0 255 127) 124 252 0 lawn green (124 252 0) 0 255 0 green ( 0 255 0) 127 255 0 chartreuse (127 255 0) 0 250 154 medium spring green ( 0 250 154) 173 255 47 green yellow (173 255 47) 50 205 50 lime green ( 50 205 50) 154 205 50 yellow green (154 205 50) 34 139 34 forest green ( 34 139 34) 107 142 35 olive drab (107 142 35) 189 183 107 dark khaki (189 183 107) 240 230 140 khaki (240 230 140) 238 232 170 pale goldenrod (238 232 170) 250 250 210 light goldenrod yellow (250 250 210) 255 255 224 light yellow (255 255 224) 255 255 0 yellow (255 255 0) 255 215 0 gold (255 215 0 ) 238 221 130 light goldenrod (238 221 130) 218 165 32 goldenrod (218 165 32) 184 134 11 dark goldenrod (184 134 11) 188 143 143 rosy brown (188 143 143) 205 92 92 indian red (205 92 92) 139 69 19 saddle brown (139 69 19) 160 82 45 sienna (160 82 45) 205 133 63 peru (205 133 63) 222 184 135 burlywood (222 184 135) 245 245 220 beige (245 245 220) 245 222 179 wheat (245 222 179) 244 164 96 sandy brown (244 164 96) 210 180 140 tan (210 180 140) 210 105 30 chocolate (210 105 30) 178 34 34 firebrick (178 34 34) 165 42 42 brown (165 42 42) 233 150 122 dark salmon (233 150 122) 250 128 114 salmon (250 128 114) 255 160 122 light salmon (255 160 122) 255 165 0 orange (255 165 0) 255 140 0 dark orange (255 140 0) 255 127 80 coral (255 127 80) 240 128 128 light coral (240 128 128) 255 99 71 tomato (255 99 71) 255 69 0 orange red (255 69 0) 255 0 0 red (255 0 0) 255 105 180 hot pink (255 105 180) 255 20 147 deep pink (255 20 147) 255 192 203 pink (255 192 203) 255 182 193 light pink (255 182 193) 219 112 147 pale violet red (219 112 147) 176 48 96 maroon (176 48 96) 199 21 133 medium violet red (199 21 133) 208 32 144 violet red (208 32 144) 255 0 255 magenta (255 0 255) 238 130 238 violet (238 130 238) 221 160 221 plum (221 160 221) 218 112 214 orchid (218 112 214) 186 85 211 medium orchid (186 85 211) 153 50 204 dark orchid (153 50 204) 148 0 211 dark violet (148 0 211) 138 43 226 blue violet (138 43 226) 160 32 240 purple (160 32 240) 147 112 219 medium purple (147 112 219) 216 191 216 thistle (216 191 216) 255 250 250 snow 1 (255 250 250) 238 233 233 snow 2 (238 233 233) 205 201 201 snow 3 (205 201 201) 139 137 137 snow 4 (139 137 137) 255 245 238 seashell 1 (255 245 238) 238 229 222 seashell 2 (238 229 222) 205 197 191 seashell 3 (205 197 191) 139 134 130 seashell 4 (139 134 130) 255 239 219 antique white 1 (255 239 219) 238 223 204 antique white 2 (238 223 204) 205 192 176 antique white 3 (205 192 176) 139 131 120 antique white 4 (139 131 120) 255 228 196 bisque 1 (255 228 196) 238 213 183 bisque 2 (238 213 183) 205 183 158 bisque 3 (205 183 158) 139 125 107 bisque 4 (139 125 107) 255 218 185 peach puff 1 (255 218 185) 238 203 173 peach puff 2 (238 203 173) 205 175 149 peach puff 3 (205 175 149) 139 119 101 peach puff 4 (139 119 101) 255 222 173 navajo white 1 (255 222 173) 238 207 161 navajo white 2 (238 207 161) 205 179 139 navajo white 3 (205 179 139) 139 121 94 navajo white 4 (139 121 94) 255 250 205 lemon chiffon 1 (255 250 205) 238 233 191 lemon chiffon 2 (238 233 191) 205 201 165 lemon chiffon 3 (205 201 165) 139 137 112 lemon chiffon 4 (139 137 112) 255 248 220 cornsilk 1 (255 248 220) 238 232 205 cornsilk 2 (238 232 205) 205 200 177 cornsilk 3 (205 200 177) 139 136 120 cornsilk 4 (139 136 120) 255 255 240 ivory 1 (255 255 240) 238 238 224 ivory 2 (238 238 224) 205 205 193 ivory 3 (205 205 193) 139 139 131 ivory 4 (139 139 131) 240 255 240 honeydew 1 (240 255 240) 224 238 224 honeydew 2 (224 238 224) 193 205 193 honeydew 3 (193 205 193) 131 139 131 honeydew 4 (131 139 131) 255 240 245 lavender blush 1 (255 240 245) 238 224 229 lavender blush 2 (238 224 229) 205 193 197 lavender blush 3 (205 193 197) 139 131 134 lavender blush 4 (139 131 134) 255 228 225 misty rose 1 (255 228 225) 238 213 210 misty rose 2 (238 213 210) 205 183 181 misty rose 3 (205 183 181) 139 125 123 misty rose 4 (139 125 123) 240 255 255 azure 1 (240 255 255) 224 238 238 azure 2 (224 238 238) 193 205 205 azure 3 (193 205 205) 131 139 139 azure 4 (131 139 139) 131 111 255 slate blue 1 (131 111 255) 122 103 238 slate blue 2 (122 103 238) 105 89 205 slate blue 3 (105 89 205) 71 60 139 slate blue 4 ( 71 60 139) 72 118 255 royal blue 1 ( 72 118 255) 67 110 238 royal blue 2 ( 67 110 238) 58 95 205 royal blue 3 ( 58 95 205) 39 64 139 royal blue 4 ( 39 64 139) 0 0 255 blue 1 ( 0 0 255) 0 0 238 blue 2 ( 0 0 238) 0 0 205 blue 3 ( 0 0 205) 0 0 139 blue 4 ( 0 0 139) 30 144 255 dodger blue 1 ( 30 144 255) 28 134 238 dodger blue 2 ( 28 134 238) 24 116 205 dodger blue 3 ( 24 116 205) 16 78 139 dodger blue 4 ( 16 78 139) 99 184 255 steel blue 1 ( 99 184 255) 92 172 238 steel blue 2 ( 92 172 238) 79 148 205 steel blue 3 ( 79 148 205) 54 100 139 steel blue 4 ( 54 100 139) 0 191 255 deep sky blue 1 ( 0 191 255) 0 178 238 deep sky blue 2 ( 0 178 238) 0 154 205 deep sky blue 3 ( 0 154 205) 0 104 139 deep sky blue 4 ( 0 104 139) 135 206 255 sky blue 1 (135 206 255) 126 192 238 sky blue 2 (126 192 238) 108 166 205 sky blue 3 (108 166 205) 74 112 139 sky blue 4 ( 74 112 139) 176 226 255 light sky blue 1 (176 226 255) 164 211 238 light sky blue 2 (164 211 238) 141 182 205 light sky blue 3 (141 182 205) 96 123 139 light sky blue 4 ( 96 123 139) 198 226 255 slate gray 1 (198 226 255) 185 211 238 slate gray 2 (185 211 238) 159 182 205 slate gray 3 (159 182 205) 108 123 139 slate gray 4 (108 123 139) 202 225 255 light steel blue 1 (202 225 255) 188 210 238 light steel blue 2 (188 210 238) 162 181 205 light steel blue 3 (162 181 205) 110 123 139 light steel blue 4 (110 123 139) 191 239 255 light blue 1 (191 239 255) 178 223 238 light blue 2 (178 223 238) 154 192 205 light blue 3 (154 192 205) 104 131 139 light blue 4 (104 131 139) 224 255 255 light cyan 1 (224 255 255) 209 238 238 light cyan 2 (209 238 238) 180 205 205 light cyan 3 (180 205 205) 122 139 139 light cyan 4 (122 139 139) 187 255 255 pale turquoise 1 (187 255 255) 174 238 238 pale turquoise 2 (174 238 238) 150 205 205 pale turquoise 3 (150 205 205) 102 139 139 pale turquoise 4 (102 139 139) 152 245 255 cadet blue 1 (152 245 255) 142 229 238 cadet blue 2 (142 229 238) 122 197 205 cadet blue 3 (122 197 205) 83 134 139 cadet blue 4 ( 83 134 139) 0 245 255 turquoise 1 ( 0 245 255) 0 229 238 turquoise 2 ( 0 229 238) 0 197 205 turquoise 3 ( 0 197 205) 0 134 139 turquoise 4 ( 0 134 139) 0 255 255 cyan 1 ( 0 255 255) 0 238 238 cyan 2 ( 0 238 238) 0 205 205 cyan 3 ( 0 205 205) 0 139 139 cyan 4 ( 0 139 139) 151 255 255 dark slate gray 1 (151 255 255) 141 238 238 dark slate gray 2 (141 238 238) 121 205 205 dark slate gray 3 (121 205 205) 82 139 139 dark slate gray 4 ( 82 139 139) 127 255 212 aquamarine 1 (127 255 212) 118 238 198 aquamarine 2 (118 238 198) 102 205 170 aquamarine 3 (102 205 170) 69 139 116 aquamarine 4 ( 69 139 116) 193 255 193 dark sea green 1 (193 255 193) 180 238 180 dark sea green 2 (180 238 180) 155 205 155 dark sea green 3 (155 205 155) 105 139 105 dark sea green 4 (105 139 105) 84 255 159 sea green 1 ( 84 255 159) 78 238 148 sea green 2 ( 78 238 148) 67 205 128 sea green 3 ( 67 205 128) 46 139 87 sea green 4 ( 46 139 87) 154 255 154 pale green 1 (154 255 154) 144 238 144 pale green 2 (144 238 144) 124 205 124 pale green 3 (124 205 124) 84 139 84 pale green 4 ( 84 139 84) 0 255 127 spring green 1 ( 0 255 127) 0 238 118 spring green 2 ( 0 238 118) 0 205 102 spring green 3 ( 0 205 102) 0 139 69 spring green 4 ( 0 139 69) 0 255 0 green 1 ( 0 255 0) 0 238 0 green 2 ( 0 238 0) 0 205 0 green 3 ( 0 205 0) 0 139 0 green 4 ( 0 139 0) 127 255 0 chartreuse 1 (127 255 0) 118 238 0 chartreuse 2 (118 238 0) 102 205 0 chartreuse 3 (102 205 0) 69 139 0 chartreuse 4 ( 69 139 0) 192 255 62 olive drab 1 (192 255 62) 179 238 58 olive drab 2 (179 238 58) 154 205 50 olive drab 3 (154 205 50) 105 139 34 olive drab 4 (105 139 34) 202 255 112 dark olive green 1 (202 255 112) 188 238 104 dark olive green 2 (188 238 104) 162 205 90 dark olive green 3 (162 205 90) 110 139 61 dark olive green 4 (110 139 61) 255 246 143 khaki 1 (255 246 143) 238 230 133 khaki 2 (238 230 133) 205 198 115 khaki 3 (205 198 115) 139 134 78 khaki 4 (139 134 78) 255 236 139 light goldenrod 1 (255 236 139) 238 220 130 light goldenrod 2 (238 220 130) 205 190 112 light goldenrod 3 (205 190 112) 139 129 76 light goldenrod 4 (139 129 76) 255 255 224 light yellow 1 (255 255 224) 238 238 209 light yellow 2 (238 238 209) 205 205 180 light yellow 3 (205 205 180) 139 139 122 light yellow 4 (139 139 122) 255 255 0 yellow 1 (255 255 0) 238 238 0 yellow 2 (238 238 0) 205 205 0 yellow 3 (205 205 0) 139 139 0 yellow 4 (139 139 0) 255 215 0 gold 1 (255 215 0) 238 201 0 gold 2 (238 201 0) 205 173 0 gold 3 (205 173 0) 139 117 0 gold 4 (139 117 0) 255 193 37 goldenrod 1 (255 193 37) 238 180 34 goldenrod 2 (238 180 34) 205 155 29 goldenrod 3 (205 155 29) 139 105 20 goldenrod 4 (139 105 20) 255 185 15 dark goldenrod 1 (255 185 15) 238 173 14 dark goldenrod 2 (238 173 14) 205 149 12 dark goldenrod 3 (205 149 12) 139 101 8 dark goldenrod 4 (139 101 8) 255 193 193 rosy brown 1 (255 193 193) 238 180 180 rosy brown 2 (238 180 180) 205 155 155 rosy brown 3 (205 155 155) 139 105 105 rosy brown 4 (139 105 105) 255 106 106 indian red 1 (255 106 106) 238 99 99 indian red 2 (238 99 99) 205 85 85 indian red 3 (205 85 85) 139 58 58 indian red 4 (139 58 58) 255 130 71 sienna 1 (255 130 71) 238 121 66 sienna 2 (238 121 66) 205 104 57 sienna 3 (205 104 57) 139 71 38 sienna 4 (139 71 38) 255 211 155 burlywood 1 (255 211 155) 238 197 145 burlywood 2 (238 197 145) 205 170 125 burlywood 3 (205 170 125) 139 115 85 burlywood 4 (139 115 85) 255 231 186 wheat 1 (255 231 186) 238 216 174 wheat 2 (238 216 174) 205 186 150 wheat 3 (205 186 150) 139 126 102 wheat 4 (139 126 102) 255 165 79 tan 1 (255 165 79) 238 154 73 tan 2 (238 154 73) 205 133 63 tan 3 (205 133 63) 139 90 43 tan 4 (139 90 43) 255 127 36 chocolate 1 (255 127 36) 238 118 33 chocolate 2 (238 118 33) 205 102 29 chocolate 3 (205 102 29) 139 69 19 chocolate 4 (139 69 19) 255 48 48 firebrick 1 (255 48 48) 238 44 44 firebrick 2 (238 44 44) 205 38 38 firebrick 3 (205 38 38) 139 26 26 firebrick 4 (139 26 26) 255 64 64 brown 1 (255 64 64) 238 59 59 brown 2 (238 59 59) 205 51 51 brown 3 (205 51 51) 139 35 35 brown 4 (139 35 35) 255 140 105 salmon 1 (255 140 105) 238 130 98 salmon 2 (238 130 98) 205 112 84 salmon 3 (205 112 84) 139 76 57 salmon 4 (139 76 57) 255 160 122 light salmon 1 (255 160 122) 238 149 114 light salmon 2 (238 149 114) 205 129 98 light salmon 3 (205 129 98) 139 87 66 light salmon 4 (139 87 66) 255 165 0 orange 1 (255 165 0) 238 154 0 orange 2 (238 154 0) 205 133 0 orange 3 (205 133 0) 139 90 0 orange 4 (139 90 0) 255 127 0 dark orange 1 (255 127 0) 238 118 0 dark orange 2 (238 118 0) 205 102 0 dark orange 3 (205 102 0) 139 69 0 dark orange 4 (139 69 0) 255 114 86 coral 1 (255 114 86) 238 106 80 coral 2 (238 106 80) 205 91 69 coral 3 (205 91 69) 139 62 47 coral 4 (139 62 47) 255 99 71 tomato 1 (255 99 71) 238 92 66 tomato 2 (238 92 66) 205 79 57 tomato 3 (205 79 57) 139 54 38 tomato 4 (139 54 38) 255 69 0 orange red 1 (255 69 0) 238 64 0 orange red 2 (238 64 0) 205 55 0 orange red 3 (205 55 0) 139 37 0 orange red 4 (139 37 0) 255 0 0 red 1 (255 0 0) 238 0 0 red 2 (238 0 0) 205 0 0 red 3 (205 0 0) 139 0 0 red 4 (139 0 0) 255 20 147 deep pink 1 (255 20 147) 238 18 137 deep pink 2 (238 18 137) 205 16 118 deep pink 3 (205 16 118) 139 10 80 deep pink 4 (139 10 80) 255 110 180 hot pink 1 (255 110 180) 238 106 167 hot pink 2 (238 106 167) 205 96 144 hot pink 3 (205 96 144) 139 58 98 hot pink 4 (139 58 98) 255 181 197 pink 1 (255 181 197) 238 169 184 pink 2 (238 169 184) 205 145 158 pink 3 (205 145 158) 139 99 108 pink 4 (139 99 108) 255 174 185 light pink 1 (255 174 185) 238 162 173 light pink 2 (238 162 173) 205 140 149 light pink 3 (205 140 149) 139 95 101 light pink 4 (139 95 101) 255 130 171 pale violet red 1 (255 130 171) 238 121 159 pale violet red 2 (238 121 159) 205 104 137 pale violet red 3 (205 104 137) 139 71 93 pale violet red 4 (139 71 93) 255 52 179 maroon 1 (255 52 179) 238 48 167 maroon 2 (238 48 167) 205 41 144 maroon 3 (205 41 144) 139 28 98 maroon 4 (139 28 98) 255 62 150 violet red 1 (255 62 150) 238 58 140 violet red 2 (238 58 140) 205 50 120 violet red 3 (205 50 120) 139 34 82 violet red 4 (139 34 82) 255 0 255 magenta 1 (255 0 255) 238 0 238 magenta 2 (238 0 238) 205 0 205 magenta 3 (205 0 205) 139 0 139 magenta 4 (139 0 139) 255 131 250 orchid 1 (255 131 250) 238 122 233 orchid 2 (238 122 233) 205 105 201 orchid 3 (205 105 201) 139 71 137 orchid 4 (139 71 137) 255 187 255 plum 1 (255 187 255) 238 174 238 plum 2 (238 174 238) 205 150 205 plum 3 (205 150 205) 139 102 139 plum 4 (139 102 139) 224 102 255 medium orchid 1 (224 102 255) 209 95 238 medium orchid 2 (209 95 238) 180 82 205 medium orchid 3 (180 82 205) 122 55 139 medium orchid 4 (122 55 139) 191 62 255 dark orchid 1 (191 62 255) 178 58 238 dark orchid 2 (178 58 238) 154 50 205 dark orchid 3 (154 50 205) 104 34 139 dark orchid 4 (104 34 139) 155 48 255 purple 1 (155 48 255) 145 44 238 purple 2 (145 44 238) 125 38 205 purple 3 (125 38 205) 85 26 139 purple 4 ( 85 26 139) 171 130 255 medium purple 1 (171 130 255) 159 121 238 medium purple 2 (159 121 238) 137 104 205 medium purple 3 (137 104 205) 93 71 139 medium purple 4 ( 93 71 139) 255 225 255 thistle 1 (255 225 255) 238 210 238 thistle 2 (238 210 238) 205 181 205 thistle 3 (205 181 205) 139 123 139 thistle 4 (139 123 139) 169 169 169 dark grey (169 169 169) 169 169 169 dark gray (169 169 169) 0 0 139 dark blue (0 0 139) 0 139 139 dark cyan (0 139 139) 139 0 139 dark magenta (139 0 139) 139 0 0 dark red (139 0 0) 144 238 144 light green (144 238 144) fotocx/data/palettes/Reds_And_Purples.gpl0000664000175000017500000000126615247006660017464 0ustar micomicoGIMP Palette Name: Reds And Purples # 205 92 92 Indian Red 178 34 34 Firebrick 165 42 42 Brown Red 233 150 122 Dark Salmon 250 128 114 Salmon 255 160 122 Light Salmon 255 127 80 Coral 240 128 128 Light Coral 255 99 71 Tomato 255 69 0 Orange Red 255 0 0 Red 255 105 180 Hot Pink 255 20 147 Deep Pink 255 192 203 Pink 255 182 193 Light Pink 219 112 147 Pale Violet Red 176 48 96 Maroon 199 21 133 Medium Violet Red 208 32 144 Violet Red 255 0 255 Magenta 238 130 238 Violet 221 160 221 Plum 218 112 214 Orchid 186 85 211 Medium Orchid 153 50 204 Dark Orchid 148 0 211 Dark Violet 138 43 226 Blue Violet 160 32 240 Purple 147 112 219 Medium Purple 216 191 216 Thistle fotocx/data/palettes/Reds.gpl0000664000175000017500000000610015247006660015160 0ustar micomicoGIMP Palette Name: Reds # 0 0 0 grey0 76 0 0 76 0 0 72 0 0 68 0 0 68 0 0 64 0 0 60 0 0 56 0 0 56 0 0 52 0 0 48 0 0 48 0 0 44 0 0 40 0 0 40 0 0 36 0 0 32 0 0 28 0 0 28 0 0 24 0 0 20 0 0 20 0 0 16 0 0 12 0 0 12 0 0 8 0 0 4 0 0 0 0 0 grey0 0 0 0 grey0 0 0 0 grey0 4 0 0 4 0 0 4 4 4 8 4 4 8 4 4 8 4 4 12 8 8 12 8 8 16 8 8 16 8 8 16 12 12 20 12 12 20 12 12 20 12 12 24 16 16 24 16 16 28 16 16 28 16 16 28 20 20 32 20 20 32 20 20 32 20 20 36 24 24 36 24 24 36 24 24 40 24 24 40 28 28 44 28 28 44 28 28 44 28 28 48 32 32 48 32 32 48 32 32 52 32 32 52 36 36 56 36 36 56 36 36 56 36 36 60 40 40 60 40 40 60 40 40 64 40 40 64 44 44 64 44 44 68 44 44 68 44 44 72 48 48 72 48 48 72 48 48 76 48 48 76 52 52 76 52 52 80 52 52 80 52 52 84 56 56 84 56 56 84 56 56 88 56 56 88 60 60 88 60 60 92 60 60 92 60 60 92 64 64 96 64 64 96 64 64 100 64 64 100 68 68 100 68 68 104 68 68 104 68 68 104 72 72 108 72 72 108 72 72 112 72 72 112 76 76 112 76 76 116 76 76 116 76 76 116 80 80 120 80 80 120 80 80 120 80 80 124 84 84 124 84 84 128 84 84 128 84 84 128 88 88 132 88 88 132 88 88 132 88 88 252 252 252 grey99 252 252 252 grey99 252 248 248 252 244 244 252 240 240 252 236 236 252 232 232 252 228 228 252 224 224 252 224 224 252 220 220 252 216 216 252 212 212 252 208 208 252 204 204 252 200 200 252 196 196 252 196 196 252 192 192 252 188 188 252 184 184 252 180 180 252 176 176 252 172 172 252 168 168 252 168 168 252 164 164 252 160 160 252 156 156 252 152 152 252 148 148 252 144 144 252 140 140 252 140 140 252 136 136 252 132 132 252 128 128 252 124 124 252 120 120 252 116 116 252 112 112 252 112 112 252 108 108 252 104 104 252 100 100 252 96 96 252 92 92 252 88 88 252 84 84 252 84 84 252 80 80 252 76 76 252 72 72 252 68 68 252 64 64 252 60 60 252 56 56 252 56 56 252 52 52 252 48 48 252 44 44 252 40 40 252 36 36 252 32 32 252 28 28 252 28 28 252 24 24 252 20 20 252 16 16 252 12 12 252 8 8 252 4 4 252 0 0 252 0 0 248 0 0 244 0 0 244 0 0 240 0 0 236 0 0 236 0 0 232 0 0 228 0 0 224 0 0 224 0 0 220 0 0 216 0 0 216 0 0 212 0 0 208 0 0 208 0 0 204 0 0 200 0 0 196 0 0 196 0 0 192 0 0 188 0 0 188 0 0 184 0 0 180 0 0 180 0 0 176 0 0 172 0 0 168 0 0 168 0 0 164 0 0 160 0 0 160 0 0 156 0 0 152 0 0 152 0 0 148 0 0 144 0 0 140 0 0 140 0 0 136 0 0 132 0 0 132 0 0 128 0 0 124 0 0 124 0 0 120 0 0 116 0 0 112 0 0 112 0 0 108 0 0 104 0 0 104 0 0 100 0 0 96 0 0 96 0 0 92 0 0 88 0 0 84 0 0 84 0 0 80 0 0 fotocx/data/palettes/Warm_Colors.gpl0000664000175000017500000000016515247006660016517 0ustar micomicoGIMP Palette Name: Warm Colors # 196 9 9 216 213 8 237 110 0 232 0 50 140 11 11 228 170 4 117 0 0 fotocx/data/palettes/Visibone.gpl0000664000175000017500000002741415247006660016054 0ustar micomicoGIMP Palette Name: Visibone Columns: 16 # # Visibone -- GIMP Palette file # # Arrangement idea from www.visibone.com # Conversion to GIMP Palette and addition of # hex codes and color names by Tigert # 255 255 255 #FFFFFF - White 204 204 204 #CCCCCC - Pale Gray 153 153 153 #999999 - Light Gray 102 102 102 #666666 - Dark Gray 51 51 51 #333333 - Obscure Gray 0 0 0 #000000 - Black 255 204 0 #FFCC00 - Yellow-Yellow-Orange 255 153 0 #FF9900 - Orange-Orange-Yellow 255 102 0 #FF6600 - Orange-Orange-Red 255 51 0 #FF3300 - Red-Red-Orange 0 0 0 #000000 - Black 51 51 51 #333333 - Obscure Gray 102 102 102 #666666 - Dark Gray 153 153 153 #999999 - Light Gray 204 204 204 #CCCCCC - Pale Gray 255 255 255 #FFFFFF - White 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 255 204 51 #FFCC33 - Light Yellow-Orange 255 204 102 #FFCC66 - Light Orange-Yellow 255 153 102 #FF9966 - Light Orange-Red 255 102 51 #FF6633 - Light Red-Orange 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 204 153 0 #CC9900 - Dark Yellow-Orange 204 153 51 #CC9933 - Medium Orange-Yellow 204 102 51 #CC6633 - Medium Orange-Red 204 51 0 #CC3300 - Dark Red-Orange 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 51 51 0 #333300 - Obscure Weak Yellow 102 102 0 #666600 - Obscure Dull Yellow 153 153 0 #999900 - Dark Faded Yellow 204 204 0 #CCCC00 - Dark Hard Yellow 255 255 0 #FFFF00 - Yellow 153 102 0 #996600 - Dark Orange-Yellow 153 51 0 #993300 - Dark Orange-Red 51 0 0 #330000 - Obscure Weak Red 102 0 0 #660000 - Obscure Dull Red 153 0 0 #990000 - Dark Faded Red 204 0 0 #CC0000 - Dark Hard Red 255 0 0 #FF0000 - Red 0 0 0 #000000 - Black 0 0 0 #000000 - Black 204 255 0 #CCFF00 - Yellow-Yellow-Spring 204 255 51 #CCFF33 - Light Yellow-Spring 153 204 0 #99CC00 - Dark Yellow-Spring 102 102 51 #666633 - Dark Weak Yellow 153 153 51 #999933 - Dark Dull Yellow 204 204 51 #CCCC33 - Medium Faded Yellow 255 255 51 #FFFF33 - Light Hard Yellow 102 51 0 #663300 - Obscure Dull Orange 0 0 0 #000000 - Black 102 51 51 #663333 - Dark Weak Red 153 51 51 #993333 - Dark Dull Red 204 51 51 #CC3333 - Medium Faded Red 255 51 51 #FF3333 - Light Hard Red 204 0 51 #CC0033 - Dark Red-Pink 255 51 102 #FF3366 - Light Red-Pink 255 0 51 #FF0033 - Red-Red-Pink 153 255 0 #99FF00 - Spring-Spring-Yellow 204 255 102 #CCFF66 - Light Spring-Yellow 153 204 51 #99CC33 - Medium Spring-Yellow 102 153 0 #669900 - Dark Spring-Yellow 153 153 102 #999966 - Medium Weak Yellow 204 204 102 #CCCC66 - Light Dull Yellow 255 255 102 #FFFF66 - Light Faded Yellow 153 102 51 #996633 - Dark Dull Orange 204 102 0 #CC6600 - Dark Hard Orange 153 102 102 #996666 - Medium Weak Red 204 102 102 #CC6666 - Light Dull Red 255 102 102 #FF6666 - Light Faded Red 153 0 51 #990033 - Dark Pink-Red 204 51 102 #CC3366 - Medium Pink-Red 255 102 153 #FF6699 - Light Pink-Red 255 0 102 #FF0066 - Pink-Pink-Red 102 255 0 #66FF00 - Spring-Spring-Green 153 255 102 #99FF66 - Light Spring-Green 102 204 51 #66CC33 - Medium Spring-Green 51 153 0 #339900 - Dark Spring-Green 0 0 0 #000000 - Black 204 204 153 #CCCC99 - Light Weak Yellow 255 255 153 #FFFF99 - Pale Dull Yellow 204 153 102 #CC9966 - Light Dull Orange 255 153 51 #FF9933 - Light Hard Orange 204 153 153 #CC9999 - Light Weak Red 255 153 153 #FF9999 - Pale Dull Red 0 0 0 #000000 - Black 153 0 102 #990066 - Dark Pink-Magenta 204 51 153 #CC3399 - Medium Pink-Magenta 255 102 204 #FF66CC - Light Pink-Magenta 255 0 153 #FF0099 - Pink-Pink-Magenta 51 255 0 #33FF00 - Green-Green-Spring 102 255 51 #66FF33 - Light Green-Spring 51 204 0 #33CC00 - Dark Green-Spring 51 102 0 #336600 - Obscure Dull Spring 102 204 0 #66CC00 - Dark Hard Spring 153 255 51 #99FF33 - Light Hard Spring 255 255 204 #FFFFCC - Pale Weak Yellow 255 204 153 #FFCC99 - Pale Dull Orange 0 0 0 #000000 - Black 255 204 204 #FFCCCC - Pale Weak Red 204 102 153 #CC6699 - Light Dull Pink 153 51 102 #993366 - Dark Dull Pink 102 0 51 #660033 - Obscure Dull Pink 204 0 153 #CC0099 - Dark Magenta-Pink 255 51 204 #FF33CC - Light Magenta-Pink 255 0 204 #FF00CC - Magenta-Magenta-Pink 0 255 0 #00FF00 - Green 0 0 0 #000000 - Black 0 0 0 #000000 - Black 102 153 51 #669933 - Dark Dull Spring 153 204 102 #99CC66 - Light Dull Spring 204 255 153 #CCFF99 - Pale Dull Spring 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 255 153 204 #FF99CC - Pale Dull Pink 255 51 153 #FF3399 - Light Hard Pink 204 0 102 #CC0066 - Dark Hard Pink 0 0 0 #000000 - Black 102 51 102 #663366 - Dark Weak Magenta 51 0 51 #330033 - Obscure Weak Magenta 0 204 0 #00CC00 - Dark Hard Green 51 255 51 #33FF33 - Light Hard Green 102 255 102 #66FF66 - Light Faded Green 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 204 153 204 #CC99CC - Light Weak Magenta 153 102 153 #996699 - Medium Weak Magenta 153 51 153 #993399 - Dark Dull Magenta 102 0 102 #660066 - Obscure Dull Magenta 0 153 0 #009900 - Dark Faded Green 51 204 51 #33CC33 - Medium Faded Green 102 204 102 #66CC66 - Light Dull Green 153 255 153 #99FF99 - Pale Dull Green 204 255 204 #CCFFCC - Pale Weak Green 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 255 204 255 #FFCCFF - Pale Weak Magenta 255 153 255 #FF99FF - Pale Dull Magenta 204 102 204 #CC66CC - Light Dull Magenta 204 51 204 #CC33CC - Medium Faded Magenta 153 0 153 #990099 - Dark Faded Magenta 0 102 0 #006600 - Obscure Dull Green 51 153 51 #339933 - Dark Dull Green 102 153 102 #669966 - Medium Weak Green 153 204 153 #99CC99 - Light Weak Green 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 255 102 255 #FF66FF - Light Faded Magenta 255 51 255 #FF33FF - Light Hard Magenta 204 0 204 #CC00CC - Dark Hard Magenta 0 51 0 #003300 - Obscure Weak Green 51 102 51 #336633 - Dark Weak Green 0 0 0 #000000 - Black 0 204 102 #00CC66 - Dark Hard Teal 51 255 153 #33FF99 - Light Hard Teal 153 255 204 #99FFCC - Pale Dull Teal 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 204 153 255 #CC99FF - Pale Dull Violet 153 102 204 #9966CC - Light Dull Violet 102 51 153 #663399 - Dark Dull Violet 0 0 0 #000000 - Black 0 0 0 #000000 - Black 255 0 255 #FF00FF - Magenta 0 255 51 #00FF33 - Green-Green-Teal 51 255 102 #33FF66 - Light Green-Teal 0 204 51 #00CC33 - Dark Green-Teal 0 102 51 #006633 - Obscure Dull Teal 51 153 102 #339966 - Dark Dull Teal 102 204 153 #66CC99 - Light Dull Teal 204 255 255 #CCFFFF - Pale Weak Cyan 0 0 0 #000000 - Black 153 204 255 #99CCFF - Pale Dull Azure 204 204 255 #CCCCFF - Pale Weak Blue 153 51 255 #9933FF - Light Hard Violet 102 0 204 #6600CC - Dark Hard Violet 51 0 102 #330066 - Obscure Dull Violet 153 0 204 #9900CC - Dark Magenta-Violet 204 51 255 #CC33FF - Light Magenta-Violet 204 0 255 #CC00FF - Magenta-Magenta-Violet 0 255 102 #00FF66 - Teal-Teal-Green 102 255 153 #66FF99 - Light Teal-Green 51 204 102 #33CC66 - Medium Teal-Green 0 153 51 #009933 - Dark Teal-Green 0 0 0 #000000 - Black 153 255 255 #99FFFF - Pale Dull Cyan 153 204 204 #99CCCC - Light Weak Cyan 51 153 255 #3399FF - Light Hard Azure 102 153 204 #6699CC - Light Dull Azure 153 153 255 #9999FF - Pale Dull Blue 153 153 204 #9999CC - Light Weak Blue 0 0 0 #000000 - Black 102 0 153 #660099 - Dark Violet-Magenta 153 51 204 #9933CC - Medium Violet-Magenta 204 102 255 #CC66FF - Light Violet-Magenta 153 0 255 #9900FF - Violet-Violet-Magenta 0 255 153 #00FF99 - Teal-Teal-Cyan 102 255 204 #66FFCC - Light Teal-Cyan 51 204 153 #33CC99 - Medium Teal-Cyan 0 153 102 #009966 - Dark Teal-Cyan 102 255 255 #66FFFF - Light Faded Cyan 102 204 204 #66CCCC - Light Dull Cyan 102 153 153 #669999 - Medium Weak Cyan 0 102 204 #0066CC - Dark Hard Azure 51 102 153 #336699 - Dark Dull Azure 102 102 255 #6666FF - Light Faded Blue 102 102 204 #6666CC - Light Dull Blue 102 102 153 #666699 - Medium Weak Blue 102 0 153 #660099 - Dark Violet-Magenta 153 51 204 #9933CC - Medium Violet-Magenta 204 102 255 #CC66FF - Light Violet-Magenta 153 0 255 #9900FF - Violet-Violet-Magenta 0 255 204 #00FFCC - Cyan-Cyan-Teal 51 255 204 #33FFCC - Light Cyan-Teal 0 204 153 #00CC99 - Dark Cyan-Teal 51 255 255 #33FFFF - Light Hard Cyan 51 204 204 #33CCCC - Medium Faded Cyan 51 153 153 #339999 - Dark Dull Cyan 51 102 102 #336666 - Dark Weak Cyan 0 0 0 #000000 - Black 0 51 102 #003366 - Obscure Dull Azure 51 51 255 #3333FF - Light Hard Blue 51 51 204 #3333CC - Medium Faded Blue 51 51 153 #333399 - Dark Dull Blue 51 51 102 #333366 - Dark Weak Blue 51 0 204 #3300CC - Dark Blue-Violet 102 51 255 #6633FF - Light Blue-Violet 51 0 255 #3300FF - Blue-Blue-Violet 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 255 255 #00FFFF - Cyan 0 204 204 #00CCCC - Dark Hard Cyan 0 153 153 #009999 - Dark Faded Cyan 0 102 102 #006666 - Obscure Dull Cyan 0 51 51 #003333 - Obscure Weak Cyan 0 102 153 #006699 - Dark Azure-Cyan 0 51 153 #003399 - Dark Azure-Blue 0 0 255 #0000FF - Blue 0 0 204 #0000CC - Dark Hard Blue 0 0 153 #000099 - Dark Faded Blue 0 0 102 #000066 - Obscure Dull Blue 0 0 51 #000033 - Obscure Weak Blue 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 153 204 #0099CC - Dark Cyan-Azure 51 153 204 #3399CC - Medium Azure-Cyan 51 102 204 #3366CC - Medium Azure-Blue 0 51 204 #0033CC - Dark Blue-Azure 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 51 204 255 #33CCFF - Light Cyan-Azure 102 204 255 #66CCFF - Light Azure-Cyan 102 153 255 #6699FF - Light Azure-Blue 51 102 255 #3366FF - Light Blue-Azure 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 0 0 0 #000000 - Black 255 255 255 #FFFFFF - White 204 204 204 #CCCCCC - Pale Gray 153 153 153 #999999 - Light Gray 102 102 102 #666666 - Dark Gray 51 51 51 #333333 - Obscure Gray 0 0 0 #000000 - Black 0 204 255 #00CCFF - Cyan-Cyan-Azure 0 153 255 #0099FF - Azure-Azure-Cyan 0 102 255 #0066FF - Azure-Azure-Blue 0 51 255 #0033FF - Blue-Blue-Azure 0 0 0 #000000 - Black 51 51 51 #333333 - Obscure Gray 102 102 102 #666666 - Dark Gray 153 153 153 #999999 - Light Gray 204 204 204 #CCCCCC - Pale Gray 255 255 255 #FFFFFF - White fotocx/data/worldcities.txt0000664000175000017500000713676615247006660015064 0ustar micomicoTokyo, Japan, 35.6870, 139.7495 Jakarta, Indonesia, -6.1750, 106.8275 Delhi, India, 28.6100, 77.2300 Guangzhou, China, 23.1300, 113.2600 Mumbai, India, 19.0761, 72.8775 Manila, Philippines, 14.5958, 120.9772 Shanghai, China, 31.2286, 121.4747 Sao Paulo, Brazil, -23.5504, -46.6339 Seoul, Korea, South, 37.5667, 126.9833 Mexico City, Mexico, 19.4333, -99.1333 Kolkata, India, 22.5675, 88.3700 Cairo, Egypt, 30.0444, 31.2358 Karachi, Pakistan, 24.8600, 67.0100 Dhaka, Bangladesh, 23.7289, 90.3944 New York, United States, 40.6943, -73.9249 Beijing, China, 39.9067, 116.3975 Bangkok, Thailand, 13.7525, 100.4942 Shenzhen, China, 22.5415, 114.0596 Moscow, Russia, 55.7506, 37.6175 Buenos Aires, Argentina, -34.6036, -58.3814 Lagos, Nigeria, 6.4550, 3.3841 Bangalore, India, 12.9789, 77.5917 Ho Chi Minh City, Vietnam, 10.7756, 106.7019 Osaka, Japan, 34.6939, 135.5022 Chengdu, China, 30.6600, 104.0633 Istanbul, Turkey, 41.0136, 28.9550 Tehran, Iran, 35.6889, 51.3897 Kinshasa, Congo (Kinshasa), -4.3219, 15.3119 Rio de Janeiro, Brazil, -22.9111, -43.2056 Chennai, India, 13.0825, 80.2750 Xi'an, China, 34.2611, 108.9422 Lahore, Pakistan, 31.5497, 74.3436 Chongqing, China, 29.5637, 106.5504 Los Angeles, United States, 34.1141, -118.4068 London, United Kingdom, 51.5072, -0.1275 Paris, France, 48.8567, 2.3522 Linyi, China, 35.1038, 118.3564 Dongguan, China, 23.0210, 113.7520 Baoding, China, 38.8740, 115.4640 Hyderabad, India, 17.3617, 78.4747 Tianjin, China, 39.1336, 117.2054 Lima, Peru, -12.0600, -77.0375 Wuhan, China, 30.5934, 114.3046 Nanyang, China, 32.9902, 112.5285 Hangzhou, China, 30.2670, 120.1530 Nagoya, Japan, 35.1833, 136.9000 Luanda, Angola, -8.8383, 13.2344 Foshan, China, 23.0214, 113.1216 Kuala Lumpur, Malaysia, 3.1686, 101.6980 Zhoukou, China, 33.6367, 114.7014 Tongshan, China, 34.2610, 117.1859 Hanoi, Vietnam, 21.0000, 105.8500 Chicago, United States, 41.8375, -87.6866 Nanjing, China, 32.0608, 118.7789 Heze, China, 35.2343, 115.4796 Pune, India, 18.5203, 73.8567 Jining, China, 35.4151, 116.5871 Bogota, Colombia, 4.7111, -74.0722 Ahmedabad, India, 23.0225, 72.5714 Shenyang, China, 41.8025, 123.4281 Dar es Salaam, Tanzania, -6.8161, 39.2803 Khartoum, Sudan, 15.6031, 32.5265 Johannesburg, South Africa, -26.2044, 28.0456 Fuyang, China, 32.8900, 115.8140 Hong Kong, Hong Kong, 22.3000, 114.2000 Ganzhou, China, 25.8310, 114.9330 Shangqiu, China, 34.4150, 115.6560 Cangzhou, China, 38.3047, 116.8387 Riyadh, Saudi Arabia, 24.6500, 46.7100 Santiago, Chile, -33.4372, -70.6506 Zhumadian, China, 33.0140, 114.0220 Zhanjiang, China, 21.2701, 110.3575 Rangoon, Burma, 16.7950, 96.1600 Yancheng, China, 33.3500, 120.1569 Bijie, China, 27.2840, 105.2920 Xingtai, China, 37.0717, 114.5048 Hengyang, China, 26.8940, 112.5720 Shaoyang, China, 27.2395, 111.4679 Surabaya, Indonesia, -7.2458, 112.7378 Surat, India, 21.2050, 72.8400 Quanzhou, China, 24.8744, 118.6757 Shangrao, China, 28.4551, 117.9431 Zunyi, China, 27.7220, 107.0310 Madrid, Spain, 40.4169, -3.7033 Baghdad, Iraq, 33.3153, 44.3661 Maoming, China, 21.6627, 110.9255 Miami, United States, 25.7840, -80.2101 Xinyang, China, 32.1490, 114.0910 Houston, United States, 29.7860, -95.3885 Singapore, Singapore, 1.3000, 103.8000 Prayagraj, India, 25.4358, 81.8464 Huanggang, China, 30.4537, 114.8724 Dalian, China, 38.9000, 121.6000 Ankara, Turkey, 39.9300, 32.8500 Dallas, United States, 32.7935, -96.7667 Qingdao, China, 36.0669, 120.3827 Yulin, China, 22.6540, 110.1810 Liaocheng, China, 36.4559, 115.9852 Douala, Cameroon, 4.0500, 9.7000 Qujing, China, 25.4910, 103.7960 Nangandao, China, 35.3036, 113.9268 Addis Ababa, Ethiopia, 9.0300, 38.7400 Philadelphia, United States, 40.0077, -75.1339 Toronto, Canada, 43.7417, -79.3733 Zhengzhou, China, 34.7640, 113.6840 Nanchong, China, 30.8372, 106.1106 Jinan, China, 36.6702, 117.0207 Giza, Egypt, 29.9870, 31.2118 Saint Petersburg, Russia, 59.9375, 30.3086 Jieyang, China, 23.5510, 116.3727 Dezhou, China, 37.4360, 116.3590 Nairobi, Kenya, -1.2864, 36.8172 Guadalajara, Mexico, 20.6767, -103.3475 Tai'an, China, 36.2020, 117.0870 Dazhou, China, 31.2093, 107.4678 Belo Horizonte, Brazil, -19.9281, -43.9419 Suzhou, China, 33.6480, 116.9640 Monterrey, Mexico, 25.6844, -100.3181 Yongzhou, China, 26.4200, 111.6130 Changde, China, 29.0310, 111.6990 Xiangyang, China, 32.0100, 112.1220 Atlanta, United States, 33.7628, -84.4220 Pudong, China, 31.2347, 121.5064 Washington, United States, 38.9047, -77.0163 Zhaotong, China, 27.3380, 103.7170 Zhangzhou, China, 24.5130, 117.6470 Yueyang, China, 29.3647, 113.1309 Melbourne, Australia, -37.8142, 144.9631 Yichun, China, 27.8160, 114.4170 Abidjan, Côte d’Ivoire, 5.3364, -4.0267 Guilin, China, 25.2750, 110.2960 Pingdingshan, China, 33.7666, 113.1926 Alexandria, Egypt, 31.1975, 29.8925 Bozhou, China, 33.8463, 115.7786 Sydney, Australia, -33.8667, 151.2000 Barcelona, Spain, 41.3833, 2.1833 Yuncheng, China, 35.0267, 111.0070 Cape Town, South Africa, -33.9253, 18.4239 Changsha, China, 28.2280, 112.9390 Suqian, China, 33.9630, 118.2750 Jeddah, Saudi Arabia, 21.5428, 39.1728 Weinan, China, 34.5206, 109.4710 Berlin, Germany, 52.5200, 13.4050 Chenzhou, China, 25.7700, 113.0160 Jiangmen, China, 22.5789, 113.0815 Mianyang, China, 31.4680, 104.6790 Jiujiang, China, 29.6610, 115.9540 Huaihua, China, 27.5698, 110.0016 Huanglongsi, China, 34.7950, 114.3450 Taizhou, China, 32.4567, 119.9229 Belahi, India, 26.4000, 86.2500 Yibin, China, 28.7520, 104.6430 Ji'an, China, 27.0912, 114.9668 Yangzhou, China, 32.3944, 119.4128 Kunming, China, 25.0464, 102.7094 Changchun, China, 43.8970, 125.3260 Lu'an, China, 31.7360, 116.5200 Xinpu, China, 34.5966, 119.2214 Langfang, China, 39.5383, 116.6835 Boston, United States, 42.3188, -71.0852 Urumqi, China, 43.8225, 87.6125 Suzhou, China, 31.3000, 120.6194 Guigang, China, 23.1120, 109.5990 Shantou, China, 23.3540, 116.6820 Jiangguanchi, China, 34.0370, 113.8520 Kabul, Afghanistan, 34.5253, 69.1783 Xiaoganzhan, China, 30.9180, 113.9570 Bamako, Mali, 12.6458, -7.9922 Kano, Nigeria, 12.0000, 8.5167 Luzhou, China, 28.8710, 105.4420 Hefei, China, 31.8206, 117.2273 Hengshui, China, 37.7390, 115.6690 Fortaleza, Brazil, -3.7275, -38.5275 Anqing, China, 30.5318, 117.1153 Zhangjiakou, China, 40.7690, 114.8860 Zhaoqing, China, 23.0500, 112.4667 Shijiazhuang, China, 38.0425, 114.5100 Ningbo, China, 29.8603, 121.6245 Qiqihar, China, 47.3549, 123.9182 Phoenix, United States, 33.5722, -112.0892 Liuzhou, China, 24.3278, 109.4278 Chifeng, China, 42.2550, 118.8825 Xiaoxita, China, 30.6920, 111.2870 Amman, Jordan, 31.9497, 35.9328 Linfen, China, 36.0880, 111.5190 Xianyang, China, 34.3299, 108.7088 Chuzhou, China, 32.2560, 118.3330 Kumasi, Ghana, 6.7000, -1.6250 Zhuzhou, China, 27.8290, 113.1330 Taiyuan, China, 37.8704, 112.5497 Qingyuan, China, 23.6820, 113.0560 Meizhou, China, 24.2890, 116.1220 Yiyang, China, 28.5549, 112.3560 Nanning, China, 22.8167, 108.3275 Harbin, China, 45.7576, 126.6409 Loudi, China, 27.6998, 111.9944 Abuja, Nigeria, 9.0667, 7.4833 Yokohama, Japan, 35.4442, 139.6381 Suihua, China, 46.6540, 126.9690 Binzhou, China, 37.3830, 117.9710 Zaozhuang, China, 34.8109, 117.3238 Detroit, United States, 42.3834, -83.1024 Xiamen, China, 24.4796, 118.0889 Mashhad, Iran, 36.3264, 59.5433 Montreal, Canada, 45.5089, -73.5617 Fuzhou, China, 26.0743, 119.2964 Wuhu, China, 31.3526, 118.4331 Medan, Indonesia, 3.5894, 98.6739 Yulinshi, China, 38.2858, 109.7341 Fuzhou, China, 27.9490, 116.3580 Wenzhou, China, 27.9938, 120.6993 Changzhou, China, 31.8110, 119.9740 Puyang, China, 35.7627, 115.0292 Nanchang, China, 28.6830, 115.8580 Baicheng, China, 23.9030, 106.6190 Seattle, United States, 47.6211, -122.3244 Ibadan, Nigeria, 7.3964, 3.9167 Jiaozuo, China, 35.2157, 113.2419 Nadampalaiyam, India, 11.0125, 76.9714 Deyang, China, 31.1270, 104.3980 Busan, Korea, South, 35.1800, 129.0750 Hechi, China, 24.6930, 108.0850 Tangshan, China, 39.6294, 118.1739 Lucknow, India, 26.8500, 80.9500 San Francisco, United States, 37.7558, -122.4449 Boankra, Ghana, 6.6919, -1.4051 Dubai, United Arab Emirates, 25.2631, 55.2972 Anshan, China, 41.1080, 122.9940 Guozhen, China, 34.3609, 107.1751 Baojishi, China, 34.3630, 107.2380 Qinzhou, China, 21.9810, 108.6540 Guiyang, China, 26.6470, 106.6300 Wuxi, China, 31.5667, 120.2833 Kannankulam, India, 10.5200, 76.2100 Caracas, Venezuela, 10.4806, -66.9036 Kotla Qasim Khan, Pakistan, 32.5833, 73.7500 Casablanca, Morocco, 33.5333, -7.5833 Hanzhong, China, 33.0664, 107.0232 Shiyan, China, 32.6290, 110.7987 Guang'an, China, 30.4564, 106.6326 Faisalabad, Pakistan, 31.4167, 73.0911 Changzhi, China, 36.1950, 113.1170 Tongren, China, 27.7316, 109.1895 Bengbu, China, 32.9170, 117.3890 Leshan, China, 29.5520, 103.7660 Santa Cruz de la Sierra, Bolivia, -17.7892, -63.1975 Neijiang, China, 29.5802, 105.0580 Zhenjiang, China, 32.1880, 119.4240 Qinhuangdao, China, 39.8882, 119.5202 Bursa, Turkey, 40.1833, 29.0500 Tashkent, Uzbekistan, 41.3111, 69.2797 Guayaquil, Ecuador, -2.1900, -79.8875 Jaipur, India, 26.9000, 75.8000 Lanzhou, China, 36.0606, 103.8268 Ouagadougou, Burkina Faso, 12.3686, -1.5275 Athens, Greece, 37.9842, 23.7281 San Diego, United States, 32.8313, -117.1222 Guatemala City, Guatemala, 14.6417, -90.5133 Kuwait City, Kuwait, 29.3697, 47.9783 Qincheng, China, 34.5815, 105.7248 Izmir, Turkey, 38.4200, 27.1400 Quezon City, Philippines, 14.6500, 121.0475 Kyiv, Ukraine, 50.4500, 30.5233 Kottarassheri, India, 10.7750, 76.6510 Meishan, China, 30.0771, 103.8484 Incheon, Korea, South, 37.4833, 126.6333 Ningde, China, 26.6662, 119.5477 Zhongshan, China, 22.5170, 113.3925 Minneapolis, United States, 44.9635, -93.2678 Tampa, United States, 27.9945, -82.4447 Putian, China, 25.4526, 119.0078 Mbuji-Mayi, Congo (Kinshasa), -6.1500, 23.6000 Tongliao, China, 43.6540, 122.2430 Chaoyang, China, 41.5710, 120.4530 Hohhot, China, 40.8420, 111.7490 Pyongyang, Korea, North, 39.0167, 125.7475 Shaoguan, China, 24.8110, 113.5970 Taichung, Taiwan, 24.1439, 120.6794 Cali, Colombia, 3.4206, -76.5222 Heyuan, China, 23.7443, 114.7002 Wuzhou, China, 23.4767, 111.2790 Pretoria, South Africa, -25.7461, 28.1881 Suining, China, 30.5330, 105.5930 Omdurman, Sudan, 15.6835, 32.4629 Weihai, China, 37.5133, 122.1205 Rizhao, China, 35.4170, 119.5270 Malang, Indonesia, -7.9800, 112.6200 Stuttgart, Germany, 48.7775, 9.1800 Daqing, China, 46.5890, 125.1040 Rome, Italy, 41.8931, 12.4828 Kaohsiung, Taiwan, 22.6150, 120.2975 Brooklyn, United States, 40.6501, -73.9496 Xiangtan, China, 27.8313, 112.9454 Bazhou, China, 31.8680, 106.7480 Handan, China, 36.6010, 114.4870 Brisbane, Australia, -27.4678, 153.0281 Jinzhou, China, 41.1290, 121.1480 Denver, United States, 39.7620, -104.8758 Xinzhou, China, 38.4160, 112.7340 Nanping, China, 26.6418, 118.1774 Gazipura, Bangladesh, 23.9234, 90.3959 Shanwei, China, 22.7872, 115.3756 Maracaibo, Venezuela, 10.6333, -71.6333 Chaozhou, China, 23.6580, 116.6220 Baotou, China, 40.6213, 109.9532 Longyan, China, 25.0760, 117.0170 Weifang, China, 36.7080, 119.1620 Huai'an, China, 33.5510, 119.1130 Zibo, China, 36.8138, 118.0550 Attadappa, India, 11.8689, 75.3555 Munich, Germany, 48.1375, 11.5750 Gulou, China, 26.0865, 119.2980 Birmingham, United Kingdom, 52.4800, -1.9025 Valencia, Venezuela, 10.1833, -68.0000 Damascus, Syria, 33.5020, 36.2981 Chattogram, Bangladesh, 22.3350, 91.8325 Brazzaville, Congo (Brazzaville), -4.2667, 15.2667 Yangjiang, China, 21.8570, 111.9830 Sanaa, Yemen, 15.3483, 44.2064 Barmhan Kalan, India, 19.1972, 72.9722 Medellin, Colombia, 6.2308, -75.5906 Dingxi, China, 35.6080, 104.5920 Shaoxing, China, 30.0511, 120.5833 Yantai, China, 37.4646, 121.4478 Huizhou, China, 23.1120, 114.4160 Xuanzhou, China, 30.9390, 118.7590 Mirzapur, India, 25.1460, 82.5690 Hamburg, Germany, 53.5500, 10.0000 Taipei, Taiwan, 25.0375, 121.5625 Ankang, China, 32.6854, 109.0290 Zigong, China, 29.3390, 104.7790 Sanming, China, 26.2634, 117.6389 Toluca, Mexico, 19.2925, -99.6569 Huangshi, China, 30.2011, 115.0390 Yaounde, Cameroon, 3.8667, 11.5167 Zhuhai, China, 22.2742, 113.5719 Huludao, China, 40.7110, 120.8370 Baoshan, China, 25.1120, 99.1610 Mecca, Saudi Arabia, 21.4225, 39.8261 Vancouver, Canada, 49.2500, -123.1000 Lianshan, China, 40.7523, 120.8280 Beirut, Lebanon, 33.8981, 35.5058 Salvador, Brazil, -12.9831, -38.4928 Bucharest, Romania, 44.4325, 26.1039 Longba, China, 33.3702, 104.9603 Nagpur, India, 21.1497, 79.0806 Queens, United States, 40.7498, -73.7976 Tieling, China, 42.2237, 123.7260 Yunfu, China, 22.9152, 112.0445 Bekasi, Indonesia, -6.2333, 107.0000 Daegu, Korea, South, 35.8717, 128.6017 Ghaziabad, India, 28.6700, 77.4200 Luoyang, China, 34.6197, 112.4539 Luohe, China, 33.5804, 114.0166 Algiers, Algeria, 36.7325, 3.0872 Anshun, China, 26.2531, 105.9476 Huainan, China, 32.6314, 117.0194 Depok, Indonesia, -6.3940, 106.8225 Konya, Turkey, 37.8667, 32.4833 Haiphong, Vietnam, 20.8651, 106.6838 Yanjiang, China, 30.1290, 104.6270 Guangyuan, China, 32.4360, 105.8440 Baku, Azerbaijan, 40.3667, 49.8352 Yingkou, China, 40.6250, 122.2190 Mudanjiang, China, 44.5514, 129.6329 Riverside, United States, 33.9381, -117.3949 Fukuoka, Japan, 33.5900, 130.4017 Nantong, China, 31.9810, 120.8940 Lincang, China, 23.8840, 100.0890 Las Vegas, United States, 36.2333, -115.2654 Haikou, China, 20.0186, 110.3488 Yuxi, China, 24.3470, 102.5270 Tangerang, Indonesia, -6.1703, 106.6403 Supaul, India, 26.1260, 86.6050 Almaty, Kazakhstan, 43.2400, 76.9150 Vienna, Austria, 48.2083, 16.3725 Esfahan, Iran, 32.6653, 51.6703 Xining, China, 36.6224, 101.7804 Jincheng, China, 35.4910, 112.8520 Baltimore, United States, 39.3051, -76.6144 Dandong, China, 40.1167, 124.3833 Yan'an, China, 36.6500, 109.4940 Qinbaling, China, 35.7091, 107.6436 Gaoping, China, 30.7824, 106.1281 Awka, Nigeria, 6.2069, 7.0678 Taizhou, China, 28.6557, 121.4208 Ma'anshan, China, 31.6690, 118.5070 Jiamusi, China, 46.8000, 130.3190 Perth, Australia, -31.9558, 115.8597 Gaziantep, Turkey, 37.0628, 37.3792 Phnom Penh, Cambodia, 11.5696, 104.9210 St. Louis, United States, 38.6359, -90.2451 Mogadishu, Somalia, 2.0392, 45.3419 Lishui, China, 28.4680, 119.9230 Kowloon, Hong Kong, 22.3167, 114.1833 Cordoba, Argentina, -31.4167, -64.1833 Zamboanga City, Philippines, 6.9042, 122.0761 Rawalpindi, Pakistan, 33.6000, 73.0333 Havana, Cuba, 23.1367, -82.3589 Chongzuo, China, 22.3770, 107.3650 Portland, United States, 45.5371, -122.6500 Laibin, China, 23.7501, 109.2212 San Antonio, United States, 29.4632, -98.5238 Vadodara, India, 22.3000, 73.2000 Qingyang, China, 24.7816, 118.5517 Rajkot, India, 22.3000, 70.7833 Shangzhou, China, 33.8734, 109.9186 Vishakhapatnam, India, 17.7042, 83.2978 Shengli, China, 37.4340, 118.6746 Sanmenxia, China, 34.7732, 111.2004 Warsaw, Poland, 52.2300, 21.0111 Gujranwala, Pakistan, 32.1567, 74.1900 Hezhou, China, 24.4042, 111.5672 Aleppo, Syria, 36.2319, 37.1681 Tijuana, Mexico, 32.5250, -117.0333 Puning, China, 23.2980, 116.1660 Indore, India, 22.7167, 75.8472 Minsk, Belarus, 53.9006, 27.5586 Karaj, Iran, 35.8292, 50.9675 Kananga, Congo (Kinshasa), -5.8970, 22.4488 Huaibei, China, 33.9560, 116.7980 Peshawar, Pakistan, 34.0144, 71.5675 Sacramento, United States, 38.5677, -121.4685 Sapporo, Japan, 43.0619, 141.3544 Tilburg, Netherlands, 51.5572, 5.0911 Austin, United States, 30.3005, -97.7522 Orlando, United States, 28.4773, -81.3370 Davao, Philippines, 7.0700, 125.6000 Songjiang, China, 31.0058, 121.2333 Yinchuan, China, 38.4850, 106.2250 Abhepur, India, 39.4100, 116.3800 Thane, India, 19.1972, 72.9722 Multan, Pakistan, 30.1978, 71.4697 Port Harcourt, Nigeria, 4.8242, 7.0336 Fushun, China, 41.8810, 123.9570 Tainan, Taiwan, 22.9833, 120.1833 Pingliang, China, 35.5424, 106.6649 Siping, China, 43.1668, 124.3506 San Juan, Puerto Rico, 18.3985, -66.0610 Pingxiang, China, 27.6590, 113.8870 Bhopal, India, 23.2599, 77.4126 Mosul, Iraq, 36.3667, 43.1167 Diyarbakir, Turkey, 37.9100, 40.2400 Lubumbashi, Congo (Kinshasa), -11.6647, 27.4794 Benin City, Nigeria, 6.3333, 5.6222 Curitiba, Brazil, -25.4297, -49.2719 San Jose, United States, 37.3012, -121.8480 Shuyangzha, China, 34.1299, 118.7734 Adana, Turkey, 37.0000, 35.3213 Quito, Ecuador, -0.2200, -78.5125 Agra, India, 27.1800, 78.0200 Peyanvilai, India, 8.9000, 77.9833 Lusaka, Zambia, -15.4167, 28.2833 Indianapolis, United States, 39.7771, -86.1458 Hyderabad City, Pakistan, 25.3792, 68.3683 Pimpri-Chinchwad, India, 18.6186, 73.8037 Maracay, Venezuela, 10.2469, -67.5961 Masqat, Oman, 23.6140, 58.5911 Montevideo, Uruguay, -34.9056, -56.1842 Pittsburgh, United States, 40.4397, -79.9763 Cincinnati, United States, 39.1413, -84.5060 Manhattan, United States, 40.7834, -73.9662 Kansas City, United States, 39.1238, -94.5541 Budapest, Hungary, 47.4983, 19.0408 Patna, India, 25.5940, 85.1376 Kampala, Uganda, 0.3136, 32.5811 Beihai, China, 21.4810, 109.1200 Sanzhou, China, 30.8200, 108.4000 Cleveland, United States, 41.4764, -81.6805 Conakry, Guinea, 9.5092, -13.7122 Ximeicun, China, 24.9612, 118.3849 Caloocan City, Philippines, 14.6500, 120.9700 Ecatepec, Mexico, 19.6097, -99.0600 Yushan, China, 31.3220, 120.9850 Fuxin, China, 42.0220, 121.6700 Novosibirsk, Russia, 55.0500, 82.9500 Bilaspur, India, 22.0900, 82.1500 Semarang, Indonesia, -6.9900, 110.4225 Jingdezhen, China, 29.2917, 117.1986 Ludhiana, India, 30.9100, 75.8500 Liaoyang, China, 41.2790, 123.1760 Jiangyin, China, 31.8390, 120.2950 Valencia, Spain, 39.4700, -0.3764 Shuozhou, China, 39.3317, 112.4329 Leon de los Aldama, Mexico, 21.1167, -101.6833 Columbus, United States, 39.9862, -82.9855 Puebla, Mexico, 19.0333, -98.1833 Bien Hoa, Vietnam, 10.9500, 106.8167 Chengtangcun, China, 35.0833, 117.1500 Yopougon, Côte d’Ivoire, 5.3748, -4.0867 Hebi, China, 35.7480, 114.2970 Shiraz, Iran, 29.6100, 52.5425 Dushanbe, Tajikistan, 38.5367, 68.7800 Madurai, India, 9.9252, 78.1198 Huzhou, China, 30.8925, 120.0875 Harare, Zimbabwe, -17.8292, 31.0522 Tabriz, Iran, 38.0817, 46.2992 Jamshedpur, India, 22.7925, 86.1842 Baicheng, China, 45.6200, 122.8380 San Jose, Costa Rica, 9.9325, -84.0800 Shaoyang, China, 32.9120, 119.8526 San Salvador, El Salvador, 13.6989, -89.1914 Palembang, Indonesia, -2.9861, 104.7556 Kawasaki, Japan, 35.5167, 139.7000 Kobe, Japan, 34.6900, 135.1956 Jiaxing, China, 30.7470, 120.7560 Zhangjiajie, China, 29.1170, 110.4790 Baiyin, China, 36.5451, 104.1389 Guiping, China, 23.4000, 110.0833 Changshu, China, 31.6560, 120.7530 Jixi, China, 45.2950, 130.9690 Xushan, China, 30.1667, 121.2333 Lome, Togo, 6.1308, 1.2153 Niamey, Niger, 13.5150, 2.1175 Gwangju, Korea, South, 35.1653, 126.8486 Recife, Brazil, -8.0539, -34.8808 Nasik, India, 19.9975, 73.7898 Abu Dhabi, United Arab Emirates, 24.4667, 54.3667 Onitsha, Nigeria, 6.1667, 6.7833 Amsterdam, Netherlands, 52.3728, 4.8936 Vijayawada, India, 16.5193, 80.6305 Zapopan, Mexico, 20.7167, -103.4000 Daejeon, Korea, South, 36.3500, 127.3850 Bronx, United States, 40.8501, -73.8662 Auckland, New Zealand, -36.8492, 174.7653 Yekaterinburg, Russia, 56.8356, 60.6128 Wuwei, China, 37.9290, 102.6380 Jinhua, China, 29.0790, 119.6470 Kyoto, Japan, 35.0117, 135.7683 Pizhou, China, 34.3980, 117.8900 Yangshe, China, 31.8767, 120.5560 Dakar, Senegal, 14.6726, -17.4320 Charlotte, United States, 35.2083, -80.8303 Yucheng, China, 30.0100, 103.0415 Kayseri, Turkey, 38.7225, 35.4875 Virginia Beach, United States, 36.7335, -76.0435 Rui'an, China, 27.7833, 120.6250 Muscat, Oman, 23.6139, 58.5922 Kharkiv, Ukraine, 49.9925, 36.2311 Pointe-Noire, Congo (Brazzaville), -4.7975, 11.8503 Medina, Saudi Arabia, 24.4700, 39.6100 Sangereng, Indonesia, -6.2889, 106.7181 Faridabad, India, 28.4211, 77.3078 Sofia, Bulgaria, 42.6979, 23.3217 Ulaanbaatar, Mongolia, 47.9214, 106.9055 Adelaide, Australia, -34.9275, 138.6000 Prague, Czechia, 50.0875, 14.4214 Wenling, China, 28.3667, 121.3667 Copenhagen, Denmark, 55.6805, 12.5615 Najafgarh, India, 28.6125, 76.9847 Lianjiang, China, 21.7333, 110.2833 Helsinki, Finland, 60.1708, 24.9375 Samsun, Turkey, 41.2903, 36.3336 Milan, Italy, 45.4669, 9.1900 Antalya, Turkey, 36.8874, 30.7075 Santiago, Dominican Republic, 19.4572, -70.6889 Chizhou, China, 30.6654, 117.4916 Makassar, Indonesia, -5.1331, 119.4136 Porto Alegre, Brazil, -30.0328, -51.2300 Huangshan, China, 29.7149, 118.3376 Gaozhou, China, 21.9244, 110.8422 Barranquilla, Colombia, 10.9833, -74.8019 Al Basrah, Iraq, 30.5150, 47.8100 Benxi, China, 41.3039, 123.7649 Saitama, Japan, 35.8614, 139.6456 Ahvaz, Iran, 31.3047, 48.6783 Guarulhos, Brazil, -23.4667, -46.5333 Leizhou, China, 20.9143, 110.0967 Juarez, Mexico, 31.7450, -106.4850 Mandalay, Burma, 21.9831, 96.0844 Yangquan, China, 37.8571, 113.5804 Fuqing, China, 25.7167, 119.3833 Xintai, China, 35.9090, 117.7680 Wusong, China, 30.9450, 117.8110 Tongling, China, 30.9456, 117.8114 Calgary, Canada, 51.0500, -114.0667 Meerut, India, 28.9800, 77.7100 Jacksonville, United States, 30.3322, -81.6749 Kuaidamao, China, 41.7283, 125.9397 Huazhou, China, 21.6640, 110.6396 Milwaukee, United States, 43.0642, -87.9675 Wuzhong, China, 37.9978, 106.1986 Belem, Brazil, -1.4558, -48.5039 Cacuaco, Angola, -8.8053, 13.2444 Rosario, Argentina, -32.9575, -60.6394 Tangier, Morocco, 35.7767, -5.8039 Antananarivo, Madagascar, -18.9100, 47.5250 Canagatan, Philippines, 18.0000, 121.8000 Soweto, South Africa, -26.2678, 27.8585 Providence, United States, 41.8230, -71.4187 Xiantao, China, 30.3280, 113.4430 Jabalpur, India, 23.1667, 79.9333 Huaiyin, China, 33.5819, 119.0280 Yutan, China, 28.2780, 112.5520 Kazan, Russia, 55.7964, 49.1089 Bagam, Indonesia, 1.1300, 104.0531 Dayan, China, 26.8552, 100.2259 Comayaguela, Honduras, 14.0980, -87.2100 Brussels, Belgium, 50.8467, 4.3525 Laiwu, China, 36.1833, 117.6667 Huazhou, China, 32.6880, 112.0870 Sharjah, United Arab Emirates, 25.3575, 55.3908 Kalyan, India, 19.2400, 73.1300 Rucheng, China, 32.2460, 120.5910 Barquisimeto, Venezuela, 10.0636, -69.3347 Yongcheng, China, 33.9299, 116.4500 Sumedang, Indonesia, -6.8400, 107.9208 Can Tho, Vietnam, 10.0333, 105.7833 Suwon, Korea, South, 37.2667, 127.0167 Yiwu, China, 29.3069, 120.0753 Vasai-Virar, India, 19.4700, 72.8000 Campinas, Brazil, -22.9009, -47.0573 Dadukou, China, 26.5824, 101.7184 Lingcheng, China, 22.7080, 110.3540 Shuangyashan, China, 46.6762, 131.1416 Nizhniy Novgorod, Russia, 56.3269, 44.0075 Panipat, India, 29.3875, 76.9700 Qom, Iran, 34.6400, 50.8764 Mombasa, Kenya, -4.0500, 39.6667 Hargeysa, Somalia, 9.5600, 44.0650 Baidoa, Somalia, 3.1167, 43.6500 Varanasi, India, 25.3189, 83.0128 Hiroshima, Japan, 34.3914, 132.4519 Chiang Mai, Thailand, 18.7953, 98.9986 Belgrade, Serbia, 44.8178, 20.4569 Maiduguri, Nigeria, 11.8372, 13.1542 Kalleli, India, 9.2807, 76.8697 Batam Centre, Indonesia, 1.1272, 104.0556 Pingdu, China, 36.7769, 119.9884 Rongcheng, China, 26.2180, 104.1030 Mbandaka, Congo (Kinshasa), 0.0478, 18.2558 Xinyu, China, 27.8186, 114.9167 Doha, Qatar, 25.2867, 51.5333 Shymkent, Kazakhstan, 42.3167, 69.5958 Tripoli, Libya, 32.8872, 13.1914 Srinagar, India, 34.0900, 74.7900 Nashville, United States, 36.1715, -86.7842 Chelyabinsk, Russia, 55.1547, 61.3758 Aurangabad, India, 19.8800, 75.3200 Cilacap, Indonesia, -7.7167, 109.0170 Xinhualu, China, 34.3964, 113.7402 Salt Lake City, United States, 40.7776, -111.9311 Guankou, China, 28.1637, 113.6433 Bandar Lampung, Indonesia, -5.4500, 105.2667 Dhanbad, India, 23.7998, 86.4305 Nay Pyi Taw, Burma, 19.7475, 96.1150 Aba, Nigeria, 5.1167, 7.3667 Jingling, China, 30.6640, 113.1670 Zhuji, China, 29.7167, 120.2333 Tegucigalpa, Honduras, 14.1057, -87.2040 Kigali, Rwanda, -1.9536, 30.0606 Samara, Russia, 53.2028, 50.1408 Yingtan, China, 28.2721, 117.0395 Edmonton, Canada, 53.5344, -113.4903 Raleigh, United States, 35.8324, -78.6429 Bishkek, Kyrgyzstan, 42.8667, 74.5667 Bujumbura, Burundi, -3.3833, 29.3667 Guyuan, China, 36.0100, 106.2570 Leiyang, China, 26.4223, 112.8598 Krasnodar, Russia, 45.0333, 38.9667 Rostov, Russia, 47.2225, 39.7100 Maputo, Mozambique, -25.9153, 32.5764 Bukavu, Congo (Kinshasa), -2.5061, 28.8608 Amritsar, India, 31.6400, 74.8600 Shagamu, Nigeria, 6.8333, 3.6500 Aligarh, India, 27.8800, 78.0800 Zhangye, China, 38.9248, 100.4499 Ufa, Russia, 54.7261, 55.9475 Santo Domingo, Dominican Republic, 18.4764, -69.8933 Ulsan, Korea, South, 35.5500, 129.3167 Rongcheng, China, 29.8402, 112.9048 Tbilisi, Georgia, 41.7225, 44.7925 Guwahati, India, 26.1722, 91.7458 Fes, Morocco, 34.0433, -5.0033 Yingchuan, China, 34.1420, 113.4890 Ninh Binh, Vietnam, 20.2500, 105.8333 Yerevan, Armenia, 40.1814, 44.5144 Mwanza, Tanzania, -2.5167, 32.9000 Omsk, Russia, 54.9833, 73.3667 Mexicali, Mexico, 32.6633, -115.4678 Sevilla, Spain, 37.3900, -5.9900 Ikare, Nigeria, 7.5167, 5.7500 Dingzhou, China, 38.5160, 114.9900 Tamale, Ghana, 9.4075, -0.8533 Yuyao, China, 30.0500, 121.1500 Goiania, Brazil, -16.6806, -49.2564 Krasnoyarsk, Russia, 56.0089, 92.8719 Cologne, Germany, 50.9364, 6.9528 Ubungo, Tanzania, -6.7889, 39.2056 Yicheng, China, 31.3600, 119.8150 Richmond, United States, 37.5295, -77.4756 Kisangani, Congo (Kinshasa), 0.5167, 25.2000 Ezhou, China, 30.3914, 114.8949 Astana, Kazakhstan, 51.1472, 71.4222 Zhufeng, China, 36.0000, 119.4167 Nezahualcoyotl, Mexico, 19.4081, -99.0186 Nouakchott, Mauritania, 18.0858, -15.9785 Haora, India, 22.5800, 88.3294 Tongjin, Korea, South, 37.2333, 127.2000 Ranchi, India, 23.3600, 85.3300 Ciudad Nezahualcoyotl, Mexico, 19.4006, -99.0148 Gwalior, India, 26.2125, 78.1775 Ottawa, Canada, 45.4247, -75.6950 Haicheng, China, 40.8824, 122.6852 Jianguang, China, 28.1958, 115.7833 Goyang, Korea, South, 37.6500, 126.8000 Sendai, Japan, 38.2682, 140.8694 Xibeijie, China, 39.7334, 98.4943 Chandigarh, India, 30.7500, 76.7800 Voronezh, Russia, 51.6717, 39.2106 Managua, Nicaragua, 12.1364, -86.2514 Zhongwei, China, 37.5002, 105.1968 Jiancheng, China, 30.3800, 104.5300 Mersin, Turkey, 36.8000, 34.6333 Shouguang, China, 36.8570, 118.7910 Liangshi, China, 27.2600, 111.7442 Sao Luis, Brazil, -2.5300, -44.3028 Jodhpur, India, 26.2800, 73.0200 Memphis, United States, 35.1087, -89.9663 Matola, Mozambique, -25.9667, 32.4667 Ogbomoso, Nigeria, 8.1333, 4.2500 Sanya, China, 18.2533, 109.5036 Rangapukur, Bangladesh, 25.5206, 89.2147 Ashgabat, Turkmenistan, 37.9375, 58.3800 Enugu, Nigeria, 6.5000, 7.5000 Linhai, China, 28.8500, 121.1167 Perm, Russia, 58.0000, 56.3167 Shubra al Khaymah, Egypt, 30.1286, 31.2422 Monrovia, Liberia, 6.3133, -10.8014 Islamabad, Pakistan, 33.6931, 73.0639 Xinyi, China, 22.3549, 110.9468 Thu Duc, Vietnam, 10.8266, 106.7609 Aqchah, Afghanistan, 36.9114, 66.1858 Odesa, Ukraine, 46.4920, 30.7081 Raipur, India, 21.2444, 81.6306 Namangan, Uzbekistan, 41.0011, 71.6683 Changwon, Korea, South, 35.2708, 128.6631 Arequipa, Peru, -16.3989, -71.5369 Tshikapa, Congo (Kinshasa), -6.4167, 20.8000 Volgograd, Russia, 48.7086, 44.5147 Morelia, Mexico, 19.7683, -101.1894 Kota, India, 25.1800, 75.8300 Quetta, Pakistan, 30.1833, 67.0000 Oklahoma City, United States, 35.4676, -97.5136 Domaa-Ahenkro, Ghana, 7.2739, -2.8735 Bareilly, India, 28.3667, 79.4306 Liaoyuan, China, 42.8880, 125.1447 Stockholm, Sweden, 59.3275, 18.0547 Bordeaux, France, 44.8400, -0.5800 Taixing, China, 32.1590, 120.0290 Lilongwe, Malawi, -13.9669, 33.7873 Port-au-Prince, Haiti, 18.5425, -72.3386 Esenyurt, Turkey, 41.0342, 28.6800 Pekanbaru, Indonesia, 0.5092, 101.4453 Bogor, Indonesia, -6.5966, 106.7972 Ciudad Guayana, Venezuela, 8.3667, -62.6500 Chiba, Japan, 35.6073, 140.1064 Kirkuk, Iraq, 35.4667, 44.4000 Shuizhai, China, 33.4658, 114.8753 Qianxi, China, 27.0087, 106.0323 Hartford, United States, 41.7661, -72.6834 Dnipro, Ukraine, 48.4675, 35.0400 Baishan, China, 41.9440, 126.4147 Narayanganj, Bangladesh, 23.6167, 90.5000 Gqeberha, South Africa, -33.9581, 25.6000 Huilong, China, 31.8700, 121.7030 Malaga, Spain, 36.7194, -4.4200 Marrakech, Morocco, 31.6300, -8.0089 Louisville, United States, 38.1663, -85.6485 Cebu City, Philippines, 10.3200, 123.7500 Asmara, Eritrea, 15.3358, 38.9411 Coimbatore, India, 11.0008, 76.9633 Maceio, Brazil, -9.6658, -35.7350 Nada, China, 19.5209, 109.5808 Fangchenggang, China, 21.6867, 108.3547 Solapur, India, 17.6800, 75.9200 Freetown, Sierra Leone, 8.4833, -13.2331 Kaiyuan, China, 36.0193, 113.8600 Buffalo, United States, 42.9018, -78.8487 Santo Domingo Este, Dominican Republic, 18.4855, -69.8734 Vientiane, Laos, 17.9800, 102.6300 Kermanshah, Iran, 34.3369, 47.0911 Kibanseke Premiere, Congo (Kinshasa), -4.4419, 15.3950 Seberang Jaya, Malaysia, 5.3909, 100.4104 Sale, Morocco, 34.0333, -6.8000 Hubli, India, 15.3502, 75.1376 El Alto, Bolivia, -16.5047, -68.1633 Cankaya, Turkey, 39.9244, 32.8856 Hwasu-dong, Korea, South, 37.1997, 126.8314 Yingcheng, China, 24.2100, 113.4010 Fort Worth, United States, 32.7817, -97.3474 Setagaya, Japan, 35.6466, 139.6532 Kecioren, Turkey, 40.0000, 32.8667 Luocheng, China, 22.7689, 111.5697 Jerusalem, Israel, 31.7789, 35.2256 Khartoum North, Sudan, 15.6333, 32.6333 Meishan, China, 34.1670, 112.8440 Mushin, Nigeria, 6.5333, 3.3500 Trujillo, Peru, -8.1120, -79.0288 Kitakyushu, Japan, 33.8833, 130.8833 Aguascalientes, Mexico, 21.8760, -102.2960 Khulna, Bangladesh, 22.8167, 89.5500 Chihuahua, Mexico, 28.6369, -106.0769 Bridgeport, United States, 41.1918, -73.1954 Xin'an, China, 34.2860, 118.3550 Mysore, India, 12.3086, 76.6531 Kashgar, China, 39.4681, 75.9938 Songnam, Korea, South, 37.4333, 127.1500 New Orleans, United States, 30.0687, -89.9288 Trichinopoly, India, 10.7903, 78.7047 Cartagena, Colombia, 10.4000, -75.5000 Qingzhou, China, 36.6853, 118.4796 Naples, Italy, 40.8358, 14.2486 Santiago del Estero, Argentina, -27.7833, -64.2667 Naucalpan de Juarez, Mexico, 19.4753, -99.2378 Masbate, Philippines, 12.2700, 123.5800 Owerri, Nigeria, 5.4850, 7.0350 Taishan, China, 22.2520, 112.7940 Jiaozhou, China, 36.2647, 120.0334 Wuchuan, China, 21.4410, 110.7790 Wafangdian, China, 39.6271, 121.9796 La Plata, Argentina, -34.9211, -57.9544 Bobo-Dioulasso, Burkina Faso, 11.1833, -4.2833 Ad Dammam, Saudi Arabia, 26.4333, 50.1000 Hanchuan, China, 30.6667, 113.8333 Quzhou, China, 28.9702, 118.8593 Donetsk, Ukraine, 48.0028, 37.8053 Ashmun, Egypt, 30.2974, 30.9764 Bunia, Congo (Kinshasa), 1.5667, 30.2500 Wuchang, China, 44.9240, 127.1580 Sao Goncalo, Brazil, -22.8269, -43.0539 Hengzhou, China, 22.6799, 109.2614 Feicheng, China, 36.1861, 116.7719 Bucaramanga, Colombia, 7.1333, -73.0000 Cazenga, Angola, -8.8214, 13.2911 Merida, Mexico, 20.9667, -89.6167 Hegang, China, 47.3501, 130.2980 Osmangazi, Turkey, 40.1983, 29.0600 Moradabad, India, 28.8319, 78.7764 Bangui, Central African Republic, 4.3733, 18.5628 Abeokuta, Nigeria, 7.1608, 3.3483 Cancun, Mexico, 21.1606, -86.8475 Zaoyang, China, 32.1290, 112.7720 Dongtai, China, 32.7950, 120.5190 Antipolo, Philippines, 14.5842, 121.1763 Taguig City, Philippines, 14.5200, 121.0500 Tabuk, Saudi Arabia, 28.3972, 36.5789 Xishan, China, 27.6461, 113.4970 Zhoushan, China, 29.9856, 122.2074 Panama City, Panama, 8.9711, -79.5347 Tucson, United States, 32.1541, -110.8787 Yichun, China, 47.7280, 128.8410 As Sulaymaniyah, Iraq, 35.5500, 45.4333 Klang, Malaysia, 3.0223, 101.5481 Tiruppur, India, 11.1085, 77.3411 Marseille, France, 43.2964, 5.3700 Gurgaon, India, 28.4560, 77.0290 Yangchun, China, 22.1704, 111.7916 Ar Ramadi, Iraq, 33.4258, 43.2992 Hai'an, China, 32.5350, 120.5630 Jalandhar, India, 31.3260, 75.5762 Daye, China, 30.0961, 114.9804 Zhongxiang, China, 31.1680, 112.5880 Gaomi, China, 36.3833, 119.7500 Teresina, Brazil, -5.0903, -42.8167 Lhasa, China, 29.6534, 91.1719 Ipoh, Malaysia, 4.6000, 101.0650 Saltillo, Mexico, 25.4231, -100.9919 Aden, Yemen, 12.8000, 45.0333 El Paso, United States, 31.8476, -106.4300 Gongzhuling, China, 43.5053, 124.8224 Lianyuan, China, 27.6920, 111.6640 Ikeja, Nigeria, 6.6000, 3.3500 Tyumen, Russia, 57.1500, 65.5333 Cochabamba, Bolivia, -17.3883, -66.1597 Portsmouth, United Kingdom, 50.8058, -1.0872 Southampton, United Kingdom, 50.9025, -1.4042 Hermosillo, Mexico, 29.0989, -110.9542 Cheongju, Korea, South, 36.6333, 127.4833 Shache, China, 38.4261, 77.2500 Thanh Hoa, Vietnam, 19.8075, 105.7764 Macheng, China, 31.1730, 115.0080 Akure, Nigeria, 7.2500, 5.1950 Ilorin, Nigeria, 8.5000, 4.5500 Erbil, Iraq, 36.1911, 44.0094 Kathmandu, Nepal, 27.7100, 85.3200 Turin, Italy, 45.0792, 7.6761 Anqiu, China, 36.4780, 119.2190 Yuci, China, 37.6823, 112.7281 Dehui, China, 44.5350, 125.7030 Pietermaritzburg, South Africa, -29.6167, 30.3833 Durban, South Africa, -29.8833, 31.0500 Saratov, Russia, 51.5300, 46.0350 Bhubaneshwar, India, 20.2700, 85.8400 Yushu, China, 44.8260, 126.5500 Joao Pessoa, Brazil, -7.1200, -34.8800 Samarinda, Indonesia, -0.5000, 117.1378 Omaha, United States, 41.2627, -96.0529 Qingping, China, 34.5390, 113.3910 Rongjiawan, China, 29.1500, 113.1024 Weichanglu, China, 37.1792, 119.9333 Sakai, Japan, 34.5733, 135.4831 Eskisehir, Turkey, 39.7767, 30.5206 Renqiu, China, 38.6860, 116.0840 Wutong, China, 30.6333, 120.5333 Barcelona, Venezuela, 10.1403, -64.6833 Wu'an, China, 36.6970, 114.2040 Sao Bernardo do Campo, Brazil, -23.6939, -46.5650 McAllen, United States, 26.2252, -98.2467 Narela, India, 28.8500, 77.1000 Bhayandar, India, 19.2900, 72.8500 Culiacan, Mexico, 24.8069, -107.3939 N'Djamena, Chad, 12.1053, 15.0447 Xiashi, China, 30.5333, 120.6833 Cucuta, Colombia, 7.8942, -72.5039 Danyang, China, 32.0000, 119.5860 Dongyang, China, 29.2667, 120.2167 Krakow, Poland, 50.0614, 19.9372 Oran, Algeria, 35.6969, -0.6331 Pasig City, Philippines, 14.5605, 121.0765 Thessaloniki, Greece, 40.6403, 22.9356 Blantyre, Malawi, -15.7861, 35.0058 Palermo, Colombia, 2.8917, -75.4375 Qamdo, China, 31.1430, 97.1700 Karimnagar, India, 18.4386, 79.1288 Libreville, Gabon, 0.3901, 9.4544 Hejian, China, 38.4466, 116.0995 Seyhan, Turkey, 36.9831, 35.3328 Laiyang, China, 36.9758, 120.7136 Queretaro, Mexico, 20.5875, -100.3928 Wuxi, China, 26.5800, 111.8410 Yiyang, China, 26.4221, 112.3999 Niigata, Japan, 37.9161, 139.0364 Vinh, Vietnam, 18.6667, 105.6667 Puxi, China, 35.2125, 114.7350 Hempstead, United States, 40.6629, -73.6089 Hamamatsu, Japan, 34.7108, 137.7275 Zijinglu, China, 34.7667, 112.9667 Kumila, Pakistan, 35.2500, 73.5000 Xingyi, China, 25.0920, 104.8955 Xingcheng, China, 24.1347, 115.7300 Birmingham, United States, 33.5279, -86.7971 Ailan Mubage, China, 43.9080, 81.2777 Lubango, Angola, -14.9167, 13.5000 Frankfurt, Germany, 50.1106, 8.6822 Homs, Syria, 34.7319, 36.7181 Bilbao, Spain, 43.2569, -2.9236 San Luis Potosi, Mexico, 22.1511, -100.9761 Bucheon, Korea, South, 37.5000, 126.7833 Fuyang, China, 30.0553, 119.9500 Korla, China, 41.7259, 86.1746 Khujand, Tajikistan, 40.2833, 69.6333 Hamhung, Korea, North, 39.9167, 127.5333 Erzurum, Turkey, 39.9086, 41.2769 Albuquerque, United States, 35.1054, -106.6465 Zagreb, Croatia, 45.8131, 15.9772 Al `Ayn, United Arab Emirates, 24.2075, 55.7447 Dodoma, Tanzania, -6.1731, 35.7419 Pikine, Senegal, 14.7440, -17.4021 Patiala, India, 30.3400, 76.3800 Bahawalpur, Pakistan, 29.3956, 71.6836 Qingnian, China, 36.8494, 115.7061 Sanhe, China, 40.0167, 117.0833 Kaduna, Nigeria, 10.5167, 7.4333 Winnipeg, Canada, 49.8844, -97.1464 Baardheere, Somalia, 2.3447, 42.2764 Shishgarh, India, 28.7200, 79.3200 Leping, China, 28.9780, 117.1520 Colombo, Sri Lanka, 6.9167, 79.8333 Nerima, Japan, 35.7356, 139.6517 Natal, Brazil, -5.7950, -35.2089 Lichuan, China, 30.2910, 108.9364 Pendik, Turkey, 40.8747, 29.2350 Gdansk, Poland, 54.3475, 18.6453 Licheng, China, 31.4306, 119.4788 Santo Andre, Brazil, -23.6533, -46.5280 Andijon, Uzbekistan, 40.7833, 72.3333 Gaalkacyo, Somalia, 6.7697, 47.4308 Ota-ku, Japan, 35.5614, 139.7161 Thiruvananthapuram, India, 8.5241, 76.9366 Nampula, Mozambique, -15.1167, 39.2667 Zhuanghe, China, 39.6810, 122.9670 Kyaukse, Burma, 21.6131, 96.1303 Tulsa, United States, 36.1283, -95.9042 Chengguan, China, 35.4623, 113.8054 Bagcilar, Turkey, 41.0344, 28.8564 Bouake, Côte d’Ivoire, 7.6833, -5.0331 Cabinda, Angola, -5.5600, 12.1900 Kumamoto, Japan, 32.8031, 130.7078 Kerman, Iran, 30.2625, 57.0575 Lingbao Chengguanzhen, China, 34.5176, 110.8942 Orumiyeh, Iran, 37.5439, 45.0647 Quebec City, Canada, 46.8139, -71.2081 Taihe, China, 30.8710, 105.3880 Yanggok, Korea, South, 37.6333, 127.2167 Zhongba, China, 31.7710, 104.7550 Osogbo, Nigeria, 7.7667, 4.5667 Sizhan, China, 38.9846, 106.3828 Suohe, China, 34.7833, 113.3500 Xiangxiang, China, 27.7186, 112.5502 Hamilton, Canada, 43.2567, -79.8692 Songyang, China, 34.4553, 113.0253 Cagayan de Oro, Philippines, 8.4800, 124.6500 Qian'an, China, 39.9990, 118.7010 Shuangqiao, China, 35.0670, 112.6020 Chaohucun, China, 31.6244, 117.8902 Manama, Bahrain, 26.2233, 50.5875 Zouping, China, 36.8630, 117.7430 Charleston, United States, 32.8168, -79.9687 Uvira, Congo (Kinshasa), -3.4000, 29.1500 Durgapur, India, 23.5500, 87.3200 An Najaf, Iraq, 32.0290, 44.3396 Fresno, United States, 36.7830, -119.7939 Cencheng, China, 22.9167, 111.0000 Umraniye, Turkey, 41.0311, 29.1081 Sorocaba, Brazil, -23.5019, -47.4578 Guli, China, 28.9000, 120.0333 Sagamihara, Japan, 35.5667, 139.3667 Laixi, China, 36.8667, 120.5333 Okayama, Japan, 34.6500, 133.9167 Concepcion, Chile, -36.8282, -73.0514 San Pedro Sula, Honduras, 15.5062, -88.0249 Mississauga, Canada, 43.6000, -79.6500 Changsha, China, 22.3773, 112.6982 Lviv, Ukraine, 49.8425, 24.0322 Shihezi, China, 44.3054, 86.0804 Valenzuela, Philippines, 14.7000, 120.9800 Huambo, Angola, -12.7767, 15.7347 Xichang, China, 27.8944, 102.2644 Guangshui, China, 31.6170, 113.8260 Zaporizhzhia, Ukraine, 47.8500, 35.1175 Bhiwandi, India, 19.2967, 73.0631 Gaoyou, China, 32.8450, 119.5080 Chengxiang, China, 31.5640, 121.1740 Bhilwara, India, 25.3500, 74.6300 Oslo, Norway, 59.9133, 10.7389 George Town, Malaysia, 5.4136, 100.3294 Bristol, United Kingdom, 51.4536, -2.5975 Zunhua, China, 40.1890, 117.9660 Saharanpur, India, 29.9639, 77.5458 Yenimahalle, Turkey, 39.9719, 32.8119 Warangal, India, 17.9689, 79.5941 Nampo, Korea, North, 38.7356, 125.4089 Dasmarinas, Philippines, 14.3300, 120.9400 Shiliguri, India, 26.7100, 88.4300 Boosaaso, Somalia, 11.2800, 49.1800 Parachinar, Pakistan, 33.9000, 70.1000 Latakia, Syria, 35.5400, 35.7800 Tongchuan, China, 34.8970, 108.9450 Xindi, China, 29.8270, 113.4760 Edogawa, Japan, 35.7000, 139.8833 General Santos, Philippines, 6.1200, 125.1700 Hamah, Syria, 35.1503, 36.7300 Rochester, United States, 43.1680, -77.6162 Bauchi, Nigeria, 10.5000, 10.0000 Salem, India, 11.6500, 78.1500 Sinnuris, Egypt, 29.4072, 30.8667 Cocody, Côte d’Ivoire, 5.3351, -4.0039 Lokoja, Nigeria, 7.8019, 6.7442 Guadalupe, Mexico, 25.6775, -100.2597 Selcuklu, Turkey, 37.8814, 32.4922 Karbala', Iraq, 32.6167, 44.0333 Borvayeh-ye Al Bu `Aziz, Iran, 31.6283, 48.6147 City of Paranaque, Philippines, 14.5008, 120.9915 Taihecun, China, 45.7710, 131.0030 Mamak, Turkey, 39.9422, 32.9231 Jianshe, China, 34.2137, 113.7629 Zaragoza, Spain, 41.6500, -0.8833 Shishi, China, 24.7167, 118.7000 Shizuoka, Japan, 34.9756, 138.3828 Agege, Nigeria, 6.6219, 3.3258 Mar del Plata, Argentina, -38.0000, -57.5500 Adachi, Japan, 35.7833, 139.8000 Pontianak, Indonesia, -0.0206, 109.3414 Rasht, Iran, 37.2744, 49.5889 Xigaze, China, 29.2500, 88.8833 Cotonou, Benin, 6.3667, 2.4333 Tasikmalaya, Indonesia, -7.3161, 108.1975 Kochi, India, 9.9312, 76.2673 Soledad, Colombia, 10.9167, -74.7500 Shanhu, China, 29.6000, 120.8167 Gothenburg, Sweden, 57.7075, 11.9675 Acapulco de Juarez, Mexico, 16.8636, -99.8825 Gorakhpur, India, 26.7637, 83.4039 Bahar, Iran, 34.9078, 48.4394 Wroclaw, Poland, 51.1100, 17.0325 Murcia, Spain, 37.9861, -1.1303 Pinghu, China, 30.7000, 121.0167 Guankou, China, 30.9880, 103.6470 Lodz, Poland, 51.7769, 19.4547 Yatou, China, 37.1653, 122.4867 Denpasar, Indonesia, -8.6717, 115.2339 Guntur, India, 16.3008, 80.4428 Tolyatti, Russia, 53.5089, 49.4222 Dayton, United States, 39.7805, -84.2003 Ch'ongjin, Korea, North, 41.7833, 129.7667 Zhaodong, China, 46.0510, 125.9620 Puyang Chengguanzhen, China, 35.7004, 114.9800 Bulawayo, Zimbabwe, -20.1700, 28.5800 Aracaju, Brazil, -10.9111, -37.0717 Bacoor, Philippines, 14.4624, 120.9645 Rotterdam, Netherlands, 51.9200, 4.4800 Tlaquepaque, Mexico, 20.6167, -103.3167 Villavicencio, Colombia, 4.1500, -73.6333 Campo Grande, Brazil, -20.4686, -54.6222 Jingcheng, China, 32.0090, 120.2630 Makhachkala, Russia, 42.9825, 47.5050 Banjarmasin, Indonesia, -3.3200, 114.5925 Kitwe, Zambia, -12.8167, 28.2000 Catia La Mar, Venezuela, 10.6000, -67.0333 Nneyi-Umuleri, Nigeria, 6.3333, 6.8333 Al Hufuf, Saudi Arabia, 25.3608, 49.5997 Dali, China, 25.6811, 100.3003 Jalingo, Nigeria, 8.9000, 11.3667 Sargodha, Pakistan, 32.0836, 72.6711 Karaikandi, India, 24.8309, 92.6143 Ch'onan, Korea, South, 36.8100, 127.1475 Brampton, Canada, 43.6833, -79.7667 Cape Coral, United States, 26.6443, -81.9957 Haldwani, India, 29.2200, 79.5200 Abomey-Calavi, Benin, 6.4486, 2.3556 Yildirim, Turkey, 40.1100, 29.0821 Dhulia, India, 20.8997, 74.7697 Zhongshu, China, 27.7919, 106.4013 Durango, Mexico, 24.0250, -104.6675 Songzi, China, 30.1740, 111.7570 Tondo, Philippines, 14.6170, 120.9670 Dayrut, Egypt, 27.5564, 30.8106 Tlalnepantla, Mexico, 19.5367, -99.1947 Xiping, China, 25.6005, 103.8166 Osasco, Brazil, -23.5328, -46.7919 Hue, Vietnam, 16.4619, 107.5955 San Jose del Monte, Philippines, 14.8139, 121.0453 Denizli, Turkey, 37.7833, 29.0964 Maturin, Venezuela, 9.7500, -63.1830 Honcho, Japan, 35.6946, 139.9826 Wuxue, China, 29.8440, 115.5610 Bhavnagar, India, 21.7600, 72.1500 Jinghong, China, 22.0090, 100.7970 Wugang, China, 26.7266, 110.6319 Sha Tin, Hong Kong, 22.3802, 114.1898 Provo, United States, 40.2457, -111.6457 Chisinau, Moldova, 47.0228, 28.8353 Petaling Jaya, Malaysia, 3.0833, 101.6500 Colorado Springs, United States, 38.8674, -104.7605 Tallinn, Estonia, 59.4372, 24.7453 Noida, India, 28.57, 77.32 Las Palmas, Spain, 28.1258, -15.4353 Mission Viejo, United States, 33.6096, -117.6551 Bhangar, India, 22.5800, 88.4200 Allentown, United States, 40.5961, -75.4756 Benghazi, Libya, 32.1167, 20.0667 Chuxiong, China, 25.0330, 101.5459 Dusseldorf, Germany, 51.2256, 6.7767 Palermo, Italy, 38.1157, 13.3613 Baton Rouge, United States, 30.4420, -91.1311 Makati City, Philippines, 14.5567, 121.0214 Ndola, Zambia, -12.9689, 28.6325 Tukh, Egypt, 30.3549, 31.2011 Glasgow, United Kingdom, 55.8611, -4.2500 Bazal'tove, Ukraine, 50.6765, 26.1600 Al Qatif, Saudi Arabia, 26.5196, 50.0115 Bhilai, India, 21.2100, 81.3800 Mangalore, India, 12.8717, 74.8425 Kaihua, China, 23.3870, 104.2330 Irkutsk, Russia, 52.2892, 104.2800 Ogden, United States, 41.2279, -111.9682 Meilan, China, 19.9990, 110.4030 Ansan, Korea, South, 37.3167, 126.8333 Barnaul, Russia, 53.3486, 83.7764 Bazhou, China, 39.1333, 116.3833 Turpan, China, 42.9512, 89.1895 Jos, Nigeria, 9.9167, 8.8903 Langzhong, China, 31.5580, 106.0050 Qufu, China, 35.5819, 116.9862 Al Mansurah, Egypt, 31.0500, 31.3833 Tengyue, China, 25.0167, 98.4833 Leipzig, Germany, 51.3400, 12.3750 Halwan, Egypt, 29.8493, 31.3327 Tan An, Vietnam, 10.9050, 106.6994 Port-Bouet, Côte d’Ivoire, 5.2568, -3.9630 Izhevsk, Russia, 56.8333, 53.1833 Knoxville, United States, 35.9692, -83.9496 Jurong, China, 31.9460, 119.1640 Arusha, Tanzania, -3.3667, 36.6833 Bihta, India, 25.5619, 84.8700 Yuhuan, China, 28.1277, 121.2288 Khabarovsk, Russia, 48.4833, 135.0833 Etimesgut, Turkey, 39.9458, 32.6694 Changping, China, 40.2248, 116.1944 Chimalhuacan, Mexico, 19.4131, -98.9839 Kandahar, Afghanistan, 31.6200, 65.7158 Oujda-Angad, Morocco, 34.6867, -1.9114 Ruiming, China, 25.8860, 116.0270 Serang, Indonesia, -6.1200, 106.1503 Ulyanovsk, Russia, 54.3167, 48.3667 Shenzhou, China, 38.0020, 115.5600 Jambi, Indonesia, -1.5900, 103.6100 Hasanpur, India, 28.7200, 78.2800 Grand Rapids, United States, 42.9619, -85.6562 Yukarikaraman, Turkey, 36.9167, 30.6833 Kuantan, Malaysia, 3.8300, 103.3200 Gold Coast, Australia, -28.0167, 153.4000 Kawaguchi, Japan, 35.8077, 139.7241 Dashiqiao, China, 40.6167, 122.5167 Las Pinas City, Philippines, 14.4500, 120.9800 Cuttack, India, 20.5236, 85.7881 San Miguel de Tucuman, Argentina, -26.8167, -65.2167 Ar Rayyan, Qatar, 25.2500, 51.4000 Riga, Latvia, 56.9475, 24.1069 Columbia, United States, 34.0378, -80.9036 Salimpur, India, 26.3000, 83.9167 Malanje, Angola, -9.5333, 16.3500 Kryvyi Rih, Ukraine, 47.9100, 33.3900 Djibouti, Djibouti, 11.5944, 43.1481 Zhuozhou, China, 39.4850, 115.9740 Tianchang, China, 32.6811, 119.0137 Albany, United States, 42.6664, -73.7987 Bacolod, Philippines, 10.6765, 122.9509 Garoua, Cameroon, 9.3000, 13.4000 Bamenda, Cameroon, 5.9614, 10.1517 Bafoussam, Cameroon, 5.4667, 10.4167 Haifa, Israel, 32.8192, 34.9992 Raurkela, India, 22.2492, 84.8828 Tunis, Tunisia, 36.8064, 10.1817 Tumkur, India, 13.3400, 77.1000 Balikpapan, Indonesia, -1.2768, 116.8277 Somolu, Nigeria, 6.5408, 3.3872 Sanliurfa, Turkey, 37.1583, 38.7917 Dortmund, Germany, 51.5139, 7.4653 Al Mukalla, Yemen, 14.5333, 49.1333 Xinji, China, 37.9430, 115.2180 Melikgazi, Turkey, 38.7167, 35.5000 Kagoshima, Japan, 31.5969, 130.5572 Wenchang, China, 31.0358, 116.9367 Sihui, China, 23.3265, 112.7338 Irapuato, Mexico, 20.6667, -101.3500 Dublin, Ireland, 53.3497, -6.2603 Al Mahallah al Kubra, Egypt, 30.9667, 31.1667 Sialkot City, Pakistan, 32.4925, 74.5311 Vladivostok, Russia, 43.1150, 131.8853 Luocheng, China, 30.9900, 104.2500 Pereira, Colombia, 4.8143, -75.6946 Gaza, Gaza Strip, 31.5069, 34.4560 Reynosa, Mexico, 26.0922, -98.2778 Zahedan, Iran, 29.5025, 60.8558 Essen, Germany, 51.4508, 7.0131 Cimahi, Indonesia, -6.8712, 107.5548 Wenlan, China, 23.3961, 103.3649 Itabashi, Japan, 35.7667, 139.6833 Shah Alam, Malaysia, 3.0667, 101.5500 Suginami-ku, Japan, 35.6994, 139.6364 Jaboatao dos Guararapes, Brazil, -8.1128, -35.0150 Vilnius, Lithuania, 54.6872, 25.2800 Kingston, Jamaica, 17.9714, -76.7931 Al Mafraq, Jordan, 32.3399, 36.2052 At Ta'if, Saudi Arabia, 21.2667, 40.4167 Port Sudan, Sudan, 19.6158, 37.2164 Nha Trang, Vietnam, 12.2450, 109.1917 Tuxtla, Mexico, 16.7528, -93.1167 Bakersfield, United States, 35.3529, -119.0359 Dehra Dun, India, 30.3450, 78.0290 Bremen, Germany, 53.0758, 8.8072 Fu'an, China, 27.1000, 119.6333 Mymensingh, Bangladesh, 24.7504, 90.3800 Hachioji, Japan, 35.6664, 139.3160 Iloilo, Philippines, 10.7200, 122.5700 Puente Alto, Chile, -33.6167, -70.5667 Botou, China, 38.0833, 116.5833 Rabat, Morocco, 34.0209, -6.8416 Sincan, Turkey, 39.9594, 32.5767 Kabinda, Congo (Kinshasa), -6.1300, 24.4800 Kottayam, India, 9.5916, 76.5222 Kahramanmaras, Turkey, 37.5833, 36.9333 Shibin al Qanatir, Egypt, 30.3127, 31.3202 Tonala, Mexico, 20.6167, -103.2333 Abu Hummus, Egypt, 31.0931, 30.3142 Irbid, Jordan, 32.5500, 35.8500 Jin'e, China, 29.3394, 105.2875 Macau, Macau, 22.2006, 113.5461 Xinxing, China, 39.8667, 124.1500 Surrey, Canada, 49.1900, -122.8489 Yaroslavl, Russia, 57.6167, 39.8500 Qionghu, China, 28.9450, 112.5980 Dresden, Germany, 51.0500, 13.7400 Xinmin, China, 41.9970, 122.8230 New Haven, United States, 41.3113, -72.9246 Antwerp, Belgium, 51.2178, 4.4003 Kuiju, China, 36.8667, 119.4000 Asansol, India, 23.6800, 86.9900 Bokaro Steel City, India, 23.6700, 86.1500 Jieshou, China, 33.2570, 115.3746 Bello, Colombia, 6.3333, -75.5667 Kolhapur, India, 16.6917, 74.2333 Wencheng, China, 19.6170, 110.7551 Miluo Chengguanzhen, China, 28.7610, 113.1600 Lanxi, China, 29.2080, 119.4580 Zhenzhou, China, 32.2723, 119.1848 Des Moines, United States, 41.5725, -93.6105 Nava Raipur, India, 21.1610, 81.7870 Gaizhou, China, 40.4000, 122.3500 Leling, China, 37.7300, 117.2320 Genoa, Italy, 44.4072, 8.9340 Ensenada, Mexico, 31.8578, -116.6058 Herat, Afghanistan, 34.3419, 62.2031 Uyo, Nigeria, 5.0333, 7.9275 Hamadan, Iran, 34.8064, 48.5161 Chiclayo, Peru, -6.7630, -79.8366 Surakarta, Indonesia, -7.5667, 110.8167 Ajmer, India, 26.4499, 74.6399 Braunschweig, Germany, 52.2667, 10.5167 Nanded, India, 19.1500, 77.3000 Wuhai, China, 39.6550, 106.7940 Palma, Spain, 39.5667, 2.6500 Rustenburg, South Africa, -25.6667, 27.2428 Amravati, India, 20.9258, 77.7647 Lisbon, Portugal, 38.7122, -9.1340 Yanji, China, 42.9000, 129.5000 The Hague, Netherlands, 52.0800, 4.3100 Hannover, Germany, 52.3667, 9.7167 Sevastopol, Ukraine, 44.6050, 33.5225 Palm Bay, United States, 27.9631, -80.6593 Manchester, United Kingdom, 53.4790, -2.2452 Nellore, India, 14.4431, 79.9861 Poznan, Poland, 52.4083, 16.9336 Ibague, Colombia, 4.4333, -75.2333 Wancheng, China, 18.8000, 110.4000 Tomsk, Russia, 56.5000, 84.9667 Sungai Petani, Malaysia, 5.6497, 100.4793 Xinshi, China, 31.1333, 113.1167 Kemerovo, Russia, 55.3667, 86.0667 Naberezhnyye Chelny, Russia, 55.6833, 52.3167 Valledupar, Colombia, 10.4833, -73.2500 Muntinlupa City, Philippines, 14.3800, 121.0500 K'ebri Beyah, Ethiopia, 9.0833, 43.0833 Luofeng, China, 37.3590, 120.3960 Ghulja, China, 43.9000, 81.3500 Ixtapaluca, Mexico, 19.3186, -98.8822 Fuding, China, 27.2000, 120.2000 Heroica Matamoros, Mexico, 25.8797, -97.5042 Mbeya, Tanzania, -8.9000, 33.4500 An Nasiriyah, Iraq, 31.0439, 46.2575 Al Hillah, Iraq, 32.4833, 44.4333 Lingyuan, China, 41.2500, 119.4000 Juiz de Fora, Brazil, -21.7642, -43.3503 Guixi, China, 28.2925, 117.2454 City of Calamba, Philippines, 14.2200, 121.1700 Sao Jose dos Campos, Brazil, -23.1789, -45.8869 Akron, United States, 41.0798, -81.5219 El Geneina, Sudan, 13.4500, 22.4400 Contagem, Brazil, -19.9319, -44.0539 Santa Cruz, Spain, 28.4667, -16.2500 Agadir, Morocco, 30.4214, -9.5831 Orenburg, Russia, 51.7833, 55.1000 Nilufer, Turkey, 40.2833, 28.9500 Leeds, United Kingdom, 53.7975, -1.5436 Kassala, Sudan, 15.4500, 36.4000 Aksu, China, 41.1850, 80.2904 Salta, Argentina, -24.7833, -65.4167 Dispur, India, 26.1397, 91.7925 Gulbarga, India, 17.3290, 76.8250 Nansana, Uganda, 0.3639, 32.5286 Kimhae, Korea, South, 35.2342, 128.8811 Novokuznetsk, Russia, 53.7667, 87.1333 Beira, Mozambique, -19.8333, 34.8500 Balashikha, Russia, 55.8167, 37.9667 Yazd, Iran, 31.8822, 54.3397 Ardabil, Iran, 38.2517, 48.2975 Touba, Senegal, 14.8667, -15.8833 Bikaner, India, 28.0167, 73.3119 Gaobeidian, China, 39.3270, 115.8740 Mixco, Guatemala, 14.6331, -90.6064 Himeji, Japan, 34.8167, 134.6833 Bandar `Abbas, Iran, 27.1961, 56.2878 Nuremberg, Germany, 49.4539, 11.0775 Concord, United States, 37.9722, -122.0016 Van, Turkey, 38.4942, 43.3800 Port Said, Egypt, 31.2625, 32.3061 Koto-ku, Japan, 35.6667, 139.8167 Ciudad Apodaca, Mexico, 25.7817, -100.1886 Kitchener, Canada, 43.4186, -80.4728 Agartala, India, 23.8314, 91.2869 Soacha, Colombia, 4.5872, -74.2214 Buca, Turkey, 38.3500, 27.1667 Maipu, Chile, -33.5167, -70.7667 Arak, Iran, 34.0914, 49.6933 Lyon, France, 45.7600, 4.8400 Tultitlan de Mariano Escobedo, Mexico, 19.6450, -99.1694 Ryazan, Russia, 54.6300, 39.7425 Meknes, Morocco, 33.8950, -5.5547 Luanzhou, China, 39.7410, 118.7040 Al Fayyum, Egypt, 29.3000, 30.8333 Utsunomiya, Japan, 36.5550, 139.8825 Sheffield, United Kingdom, 53.3808, -1.4703 Chanda, India, 19.9500, 79.2970 Suez, Egypt, 29.9667, 32.5333 Heshan, China, 22.7667, 112.9500 Loni, India, 28.7500, 77.2800 Jiaji, China, 19.2431, 110.4642 Qaraghandy, Kazakhstan, 49.8028, 73.1056 Santa Marta, Colombia, 11.2419, -74.2053 Ujjain, India, 23.1700, 75.7900 Abu Tisht, Egypt, 26.1204, 32.0954 Samarkand, Uzbekistan, 39.6547, 66.9758 Liverpool, United Kingdom, 53.4072, -2.9917 Macapa, Brazil, 0.0330, -51.0500 Benguela, Angola, -12.5500, 13.4167 Cuito, Angola, -12.3833, 16.9333 Al Fashn, Egypt, 28.8231, 30.8990 Toulouse, France, 43.6045, 1.4440 Al `Amarah, Iraq, 31.8333, 47.1500 Carrefour, Haiti, 18.5333, -72.4000 Campos, Brazil, -21.7523, -41.3304 Cadaado, Somalia, 6.1393, 46.6241 Meihekou, China, 42.5407, 125.7107 Kenitra, Morocco, 34.2500, -6.5833 Newcastle, South Africa, -27.7464, 29.9328 Mesa, United States, 33.4015, -111.7178 Jhansi, India, 25.4486, 78.5696 Matsuyama, Japan, 33.8333, 132.7667 Ulhasnagar, India, 19.2200, 73.1500 Ribeirao Preto, Brazil, -21.1776, -47.8101 Pohang, Korea, South, 36.0322, 129.3650 Duisburg, Germany, 51.4347, 6.7625 Jammu, India, 32.7300, 74.8700 Ile-Ife, Nigeria, 7.4833, 4.5592 Wichita, United States, 37.6895, -97.3443 Mazatlan, Mexico, 23.2167, -106.4167 Uberlandia, Brazil, -18.9189, -48.2769 Homyel', Belarus, 52.4453, 30.9842 Farah, Afghanistan, 32.3436, 62.1194 Belas, Angola, -8.9983, 13.2650 Talatona, Angola, -8.9167, 13.1833 Nenjiang, China, 49.1100, 125.1300 Tuticorin, India, 8.8056, 78.1450 Asaba, Nigeria, 6.1833, 6.7333 El Fasher, Sudan, 13.6300, 25.3500 Sukkur, Pakistan, 27.7061, 68.8483 K'ebri Dehar, Ethiopia, 6.7333, 44.2667 Harrisburg, United States, 40.2752, -76.8843 Taozhou, China, 30.8956, 119.4110 Anlu, China, 31.2667, 113.6667 Lapu-Lapu City, Philippines, 10.3127, 123.9488 Matsudo, Japan, 35.7876, 139.9032 Johor Bahru, Malaysia, 1.4820, 103.7281 Purnea, India, 25.7780, 87.4760 Imus, Philippines, 14.4297, 120.9367 Niteroi, Brazil, -22.8833, -43.1036 Lipetsk, Russia, 52.6167, 39.6000 Cheboksary, Russia, 56.1500, 47.2333 Staten Island, United States, 40.5834, -74.1496 Likasi, Congo (Kinshasa), -10.9833, 26.7333 Xiangyang, China, 34.2995, 108.4905 Jiangshan, China, 28.7361, 118.6250 Duyun, China, 26.2594, 107.5186 Pindi Bhattian, Pakistan, 31.8958, 73.2761 Nyala, Sudan, 12.0500, 24.8833 Ichikawa, Japan, 35.7219, 139.9311 Villa Nueva, Guatemala, 14.5269, -90.5875 Kumul, China, 42.8193, 93.5151 Toledo, United States, 41.6638, -83.5827 Bissau, Guinea-Bissau, 11.8500, -15.5667 Accra, Ghana, 5.5461, -0.2067 Kota Bharu, Malaysia, 6.1200, 102.2300 Higashi-osaka, Japan, 34.6794, 135.6008 Larkana, Pakistan, 27.5583, 68.2111 Xingcheng, China, 40.6167, 120.7333 `Ajman, United Arab Emirates, 25.4136, 55.4456 Ciudad Lopez Mateos, Mexico, 19.5500, -99.2833 Kaliningrad, Russia, 54.7003, 20.4531 Yueqing, China, 28.1200, 120.9600 Penza, Russia, 53.2000, 45.0000 Belgaum, India, 15.8500, 74.5000 Edinburgh, United Kingdom, 55.9500, -3.1833 Yucheng, China, 36.9340, 116.6380 Brookhaven, United States, 40.8320, -72.9517 Worcester, United States, 42.2705, -71.8079 Nishinomiya-hama, Japan, 34.7376, 135.3416 Karamay, China, 45.5799, 84.8892 Kawachicho, Japan, 34.6794, 135.6008 Zhangshu, China, 28.0546, 115.5462 Mingguang, China, 32.7833, 117.9667 Malatya, Turkey, 38.3486, 38.3194 Garoowe, Somalia, 8.4000, 48.4833 Vellore, India, 12.9165, 79.1325 Huanghua, China, 38.3720, 117.3300 Encheng, China, 22.1833, 112.3000 Lianran, China, 24.9190, 102.4780 Kartal, Turkey, 40.8872, 29.1900 Cuiaba, Brazil, -15.5958, -56.0969 Akhmim, Egypt, 26.5667, 31.7500 Az Zarqa', Jordan, 32.0833, 36.1000 Malegaon, India, 20.5500, 74.5500 Feira de Santana, Brazil, -12.2669, -38.9669 Hailun, China, 47.4667, 126.9667 Valletta, Malta, 35.8983, 14.5125 Kolwezi, Congo (Kinshasa), -10.7167, 25.4667 Jamnagar, India, 22.4700, 70.0700 Sylhet, Bangladesh, 24.9000, 91.8667 Ananindeua, Brazil, -1.3658, -48.3719 Berbera, Somalia, 10.4396, 45.0143 Chiniot, Pakistan, 31.7194, 72.9842 Asuncion, Paraguay, -25.2945, -57.6435 Chengjiao, China, 35.3984, 114.0649 Bardoli, India, 21.1200, 73.1200 Bratislava, Slovakia, 48.1447, 17.1128 Kurashiki, Japan, 34.5850, 133.7722 Oita, Japan, 33.2333, 131.6067 Al Jubayl, Saudi Arabia, 27.0046, 49.6460 Worthing, United Kingdom, 50.8147, -0.3714 Gaya, India, 24.7500, 85.0100 Port St. Lucie, United States, 27.2796, -80.3884 Xiulin, China, 29.7209, 112.4254 Shekhupura, Pakistan, 31.7111, 73.9878 Piura, Peru, -5.2000, -80.6333 Vila Velha, Brazil, -20.3364, -40.2936 Ar Rusayfah, Jordan, 32.0178, 36.0464 Kirov, Russia, 58.6000, 49.6833 Morogoro, Tanzania, -6.8242, 37.6633 San Juan, Argentina, -31.5342, -68.5261 Mykolaiv, Ukraine, 46.9750, 31.9950 Yicheng, China, 31.7210, 112.2570 Fengcheng, China, 40.4500, 124.0667 Mazar-e Sharif, Afghanistan, 36.7000, 67.1167 Xiaoyi, China, 36.0833, 111.5167 Ba`qubah, Iraq, 33.7447, 44.6436 Katlehong, South Africa, -26.3333, 28.1500 Tel Aviv-Yafo, Israel, 32.0800, 34.7800 Jiangshandicun, China, 28.7412, 118.6225 Little Rock, United States, 34.7256, -92.3577 Qingzhen, China, 26.5704, 106.4687 Buraydah, Saudi Arabia, 26.3664, 43.9628 Kupang, Indonesia, -10.1702, 123.6077 Tula, Russia, 54.2000, 37.6167 Ambattur, India, 13.1143, 80.1548 Nakhon Ratchasima, Thailand, 14.9806, 102.1000 Tan Uyen, Vietnam, 11.0508, 106.7636 Astrakhan, Russia, 46.3500, 48.0350 Longjiang, China, 27.5819, 120.5489 Leicester, United Kingdom, 52.6361, -1.1331 Rushan, China, 36.8700, 121.5050 Shangzhi, China, 45.2070, 127.9650 Angeles City, Philippines, 15.1472, 120.5847 Kuqa, China, 41.7156, 82.9322 Kanazawa, Japan, 36.5611, 136.6564 Manado Light, Indonesia, 1.4858, 124.8347 Manado, Indonesia, 1.4931, 124.8413 Kaiyuan, China, 42.5460, 124.0380 Cranbourne, Australia, -38.0996, 145.2834 Jalgaon, India, 21.0040, 75.5680 Madison, United States, 43.0822, -89.3930 Chhatarpur, India, 24.5500, 79.3527 Fukuyama, Japan, 34.4858, 133.3622 Juba, South Sudan, 4.8300, 31.5800 Lanus, Argentina, -34.7000, -58.4000 Spokane, United States, 47.6671, -117.4330 Ta`izz, Yemen, 13.5789, 44.0219 Long Beach, United States, 33.7977, -118.1670 Kikwit, Congo (Kinshasa), -5.0386, 18.8181 Pyeongtaek, Korea, South, 36.9922, 127.1128 Kurnool, India, 15.8300, 78.0500 Marikina City, Philippines, 14.6500, 121.1000 Kagithane, Turkey, 41.0719, 28.9664 Amagasaki, Japan, 34.7333, 135.4000 Melaka, Malaysia, 2.2064, 102.2465 Denton, United States, 33.2175, -97.1418 Ciudad General Escobedo, Mexico, 25.7933, -100.1583 Reno, United States, 39.5497, -119.8483 Manizales, Colombia, 5.0675, -75.5100 Bornova, Turkey, 38.4697, 27.2211 Puerto La Cruz, Venezuela, 10.2000, -64.6333 Kahama, Tanzania, -3.8375, 32.6000 Hsinchu, Taiwan, 24.8167, 120.9833 Gaoping, China, 35.7980, 112.9240 Batman, Turkey, 37.8870, 41.1320 Demiryol, Turkey, 37.8870, 41.1320 Erkoklu, Turkey, 37.8870, 41.1320 Avcilar, Turkey, 40.9792, 28.7214 Kota Kinabalu, Malaysia, 5.9800, 116.1100 Katsushika-ku, Japan, 35.7333, 139.8500 Udaipur, India, 24.5800, 73.6800 Mogi das Cruzes, Brazil, -23.5228, -46.1931 Stavropol, Russia, 45.0500, 41.9833 General Trias, Philippines, 14.3800, 120.8800 Warder, Ethiopia, 6.9667, 45.3500 Sirajganj, Bangladesh, 24.4500, 89.7167 Wapi, India, 20.3720, 72.9170 Bac Giang, Vietnam, 21.2667, 106.2000 Boise, United States, 43.6005, -116.2308 Zurich, Switzerland, 47.3744, 8.5411 Constantine, Algeria, 36.3500, 6.6000 Nam Dinh, Vietnam, 20.4200, 106.1683 Eslamshahr, Iran, 35.5386, 51.2228 Rajshahi, Bangladesh, 24.3667, 88.6000 Piraeus, Greece, 37.9430, 23.6469 Matadi, Congo (Kinshasa), -5.8167, 13.4833 Zebediela, South Africa, -24.3100, 29.2700 Shah Latif Town, Pakistan, 24.8806, 67.1625 Tanbei, China, 35.0880, 112.9510 Londrina, Brazil, -23.3100, -51.1628 Ado-Ekiti, Nigeria, 7.6211, 5.2214 Bonita Springs, United States, 26.3558, -81.7859 Esenler, Turkey, 41.0339, 28.8903 Sochi, Russia, 43.5853, 39.7203 Santiago de Cuba, Cuba, 20.0217, -75.8294 Rodriguez, Philippines, 14.7200, 121.1200 Chauddagram, Bangladesh, 23.2244, 91.3731 San Nicolas de los Garza, Mexico, 25.7500, -100.2833 Taoyuan District, Taiwan, 24.9913, 121.3143 Kissimmee, United States, 28.3041, -81.4169 Baisha, China, 29.4896, 119.3370 Ndjili, Congo (Kinshasa), -4.4089, 15.3775 Mathura, India, 27.4925, 77.6736 Meicheng, China, 30.6310, 116.5810 Lembok, Indonesia, -8.5650, 116.3510 Korhogo, Côte d’Ivoire, 9.4578, -5.6294 Pasay City, Philippines, 14.5439, 120.9950 Beipiao, China, 41.8010, 120.7710 Jiannan, China, 31.3333, 104.2000 Halifax, Canada, 44.6475, -63.5906 Fujisawa, Japan, 35.3500, 139.4667 Augusta, United States, 33.3645, -82.0708 Ulan-Ude, Russia, 51.8333, 107.6000 Springfield, United States, 42.1155, -72.5395 Laval, Canada, 45.5833, -73.7500 Oakland, United States, 37.7904, -122.2166 Jinchang, China, 38.5214, 102.1880 Sunch'on, Korea, North, 39.4167, 125.9333 Nehe, China, 48.4833, 124.8833 Kursk, Russia, 51.7167, 36.1833 Sangli, India, 16.8530, 74.5830 Lobito, Angola, -12.3500, 13.5464 Jeju, Korea, South, 33.5130, 126.5230 Zhuangyuan, China, 37.3056, 120.8290 Davangere, India, 14.4666, 75.9242 Jian'ou, China, 27.0333, 118.3167 Machida, Japan, 35.5542, 139.4431 Winston-Salem, United States, 36.1029, -80.2610 Sanghar, Pakistan, 26.0442, 68.9536 Chang'an, China, 29.4768, 113.4504 Al Maraghah, Egypt, 26.6998, 31.6046 Bandung, Indonesia, -6.9120, 107.6097 Shahe, China, 36.8549, 114.5033 Calicut, India, 11.2588, 75.7804 Windhoek, Namibia, -22.5700, 17.0836 Joinvile, Brazil, -26.3039, -48.8458 Ismailia, Egypt, 30.5833, 32.2667 Cusco, Peru, -13.5250, -71.9722 Veracruz, Mexico, 19.1903, -96.1533 Sokoto, Nigeria, 13.0833, 5.2500 Kashiwa, Japan, 35.8676, 139.9758 Al Bajur, Egypt, 30.4305, 31.0368 Yan'an Beilu, China, 44.0144, 87.2674 Mothihari, India, 26.6500, 84.9167 Aomori, Japan, 40.8228, 140.7469 Tepic, Mexico, 21.5083, -104.8931 Akola, India, 20.7000, 77.0000 Mandaluyong City, Philippines, 14.5800, 121.0300 Aves, Portugal, 41.3703, -8.4101 Sihung, Korea, South, 37.3799, 126.8029 Burco, Somalia, 9.5221, 45.5336 Tver, Russia, 56.8625, 35.9242 Xalapa, Mexico, 19.5400, -96.9275 Buenaventura, Colombia, 3.8772, -77.0267 London, Canada, 42.9836, -81.2497 Piracicaba, Brazil, -22.7252, -47.6493 Tetouan, Morocco, 35.5667, -5.3667 Yogyakarta, Indonesia, -7.8014, 110.3644 Ciudad Bolivar, Venezuela, 8.1219, -63.5500 Skopje, North Macedonia, 41.9961, 21.4317 Beining, China, 41.6000, 121.8000 Toyota, Japan, 35.0824, 137.1563 Daloa, Côte d’Ivoire, 6.8900, -6.4500 Uijeongbu, Korea, South, 37.7486, 127.0389 Hpa-An, Burma, 16.8906, 97.6333 Laohekou, China, 32.3590, 111.6840 Rahimyar Khan, Pakistan, 28.4200, 70.3000 Ugep, Nigeria, 5.8000, 8.0833 Thai Nguyen, Vietnam, 21.6000, 105.8500 Seremban, Malaysia, 2.7105, 101.9400 Kayapinar, Turkey, 37.9500, 40.1667 Campina Grande, Brazil, -7.2306, -35.8811 Xicheng, China, 23.3667, 103.1500 Kowloon City, Hong Kong, 22.3282, 114.1916 Santos, Brazil, -23.9608, -46.3339 Tirana, Albania, 41.3272, 19.8186 Kushtia, Bangladesh, 23.9000, 89.1200 El Obeid, Sudan, 13.1833, 30.2167 Maua, Brazil, -23.6678, -46.4608 Xingren, China, 25.4350, 105.1862 Takamatsu, Japan, 34.3500, 134.0500 Stockton, United States, 37.9765, -121.3109 Ajdabiya, Libya, 30.7700, 20.2200 Callao, Peru, -12.0522, -77.1392 Awsim, Egypt, 30.1222, 31.1333 Shinagawa-ku, Japan, 35.6000, 139.7333 Paju, Korea, South, 37.8667, 126.8000 Beylikduzu, Turkey, 41.0011, 28.6419 Viet Tri, Vietnam, 21.3000, 105.4333 Santa Rosa, Philippines, 14.3200, 121.1200 Nagqu, China, 31.4760, 92.0510 Bettiah, India, 26.8014, 84.5028 Jhang City, Pakistan, 31.2694, 72.3161 Fujin, China, 47.2500, 132.0333 Altindag, Turkey, 39.9636, 32.9033 Yuanping, China, 38.7310, 112.7110 Tala, Egypt, 30.6798, 30.9436 Talkha, Egypt, 31.0592, 31.3767 Boa Vista, Brazil, 2.8200, -60.6719 Banjul, Gambia, The, 13.4581, -16.5786 Jayapura, Indonesia, -2.5330, 140.7170 Toyama, Japan, 36.6959, 137.2137 Sanandaj, Iran, 35.3114, 46.9961 Khon Kaen, Thailand, 16.4333, 102.8333 Linghai, China, 41.1667, 121.3500 Shorapur, India, 16.5200, 76.7600 Koumassi, Côte d’Ivoire, 5.2972, -3.9675 Durham, United States, 35.9792, -78.9022 Tinnevelly, India, 8.7136, 77.7567 Pasto, Colombia, 1.2078, -77.2772 Chattanooga, United States, 35.0660, -85.2481 Bellary, India, 15.1000, 76.9167 Bhagalpur, India, 25.2500, 87.0000 Danjiangkou, China, 32.5401, 111.5131 Kisumu, Kenya, -0.1000, 34.7500 Zhangjiakou Shi Xuanhua Qu, China, 40.5944, 115.0243 Maringa, Brazil, -23.4250, -51.9389 Manampizha, India, 9.2972, 76.6500 Kocasinan, Turkey, 38.7333, 35.4833 Mataram, Indonesia, -8.5833, 116.1167 Magnitogorsk, Russia, 53.3833, 59.0333 Greenville, United States, 34.8354, -82.3646 Zhijiang, China, 30.4260, 111.7610 Zaria, Nigeria, 11.0667, 7.7000 Lancaster, United States, 40.0420, -76.3012 Fenyang, China, 37.2616, 111.7699 Syracuse, United States, 43.0407, -76.1437 Binan, Philippines, 14.3300, 121.0800 Gebze, Turkey, 40.8000, 29.4333 Shashemene, Ethiopia, 7.2000, 38.6000 Fangting, China, 31.1270, 104.1670 Shulan, China, 44.4059, 126.9655 Wanyuan, China, 31.9833, 107.9667 Jiexiu, China, 37.0270, 111.9170 Hat Yai, Thailand, 7.0167, 100.4667 Baglar, Turkey, 37.9167, 40.1833 Sham Shui Po, Hong Kong, 22.3307, 114.1622 Santa Fe, Argentina, -31.6333, -60.7000 Delhi Cantonment, India, 28.6000, 77.1333 Cumana, Venezuela, 10.4564, -64.1675 Fayetteville, United States, 36.0714, -94.1661 Barura, Bangladesh, 23.3683, 91.0484 Kumi, Korea, South, 36.1195, 128.3444 Nagasaki, Japan, 32.7447, 129.8736 Al Hudaydah, Yemen, 14.8022, 42.9511 Pencheng, China, 29.6760, 115.6810 Salt Lake City, India, 22.6100, 88.4000 Qazvin, Iran, 36.2886, 50.0069 Etawa, India, 24.1800, 78.2000 Sonipat, India, 28.9900, 77.0220 Jundiai, Brazil, -23.1864, -46.8842 Pensacola, United States, 30.4413, -87.1911 Bogra, Bangladesh, 24.8510, 89.3711 Brno, Czechia, 49.1925, 16.6083 Oskemen, Kazakhstan, 49.9833, 82.6167 Gifu, Japan, 35.4232, 136.7608 Monteria, Colombia, 8.7500, -75.8833 Maungdaw, Burma, 20.8167, 92.3667 Igboho, Nigeria, 8.8333, 3.7500 Yuregir, Turkey, 36.9928, 35.3764 Pingquan, China, 41.0184, 118.7020 Toyonaka, Japan, 34.7833, 135.4667 Dera Ghazi Khan, Pakistan, 30.0331, 70.6400 Hatay, Turkey, 36.2025, 36.1606 Luhansk, Ukraine, 48.5678, 39.3031 Miyazaki, Japan, 31.9078, 131.4203 Dangyang, China, 30.8210, 111.7890 Quilon, India, 8.8932, 76.6141 Mulangodi, India, 9.0000, 76.6167 Munro Turuttu, India, 9.0000, 76.6167 Barinas, Venezuela, 8.6333, -70.2000 Gwangju, Korea, South, 37.3667, 127.2833 Nangong, China, 37.3590, 115.4090 Hirakata, Japan, 34.8167, 135.6500 Sandakan, Malaysia, 5.8430, 118.1080 Szczecin, Poland, 53.4325, 14.5481 Surgut, Russia, 61.2500, 73.4333 Yongji, China, 34.8670, 110.4480 Arlington, United States, 32.6998, -97.1250 Karur, India, 10.9601, 78.0766 Betsiboka, Madagascar, -16.8667, 46.9500 Ijebu-Ode, Nigeria, 6.8208, 3.9208 Al Jahra', Kuwait, 29.3500, 47.6833 Tanga, Tanzania, -5.0742, 39.0992 Diadema, Brazil, -23.6858, -46.6228 Saurimo, Angola, -9.6500, 20.4000 Jalna, India, 19.8410, 75.8864 Yola, Nigeria, 9.2300, 12.4600 Zhugang, China, 28.1358, 121.2264 Hejin, China, 35.5960, 110.7120 Dunhua, China, 43.3667, 128.2333 Tangail, Bangladesh, 24.2500, 89.9200 Khayelitsha, South Africa, -34.0403, 18.6778 Ad Diwaniyah, Iraq, 31.9892, 44.9247 Nnewi, Nigeria, 6.0167, 6.9167 San-Pedro, Côte d’Ivoire, 4.7704, -6.6400 Gujrat, Pakistan, 32.5739, 74.0789 Huili Chengguanzhen, China, 26.6333, 102.2500 Yokosuka, Japan, 35.0000, 16.0000 Aurora, United States, 39.7083, -104.7237 Asyut, Egypt, 27.1869, 31.1714 Gwoza, Nigeria, 11.0861, 13.6914 Sampaloc, Philippines, 14.6031, 121.0022 Saki, Nigeria, 8.6667, 3.4000 Bologna, Italy, 44.4939, 11.3428 Aqtobe, Kazakhstan, 50.2836, 57.2297 Cilegon, Indonesia, -6.0027, 106.0112 Uvinza, Tanzania, -5.1069, 30.3839 Hafr al Batin, Saudi Arabia, 28.4337, 45.9601 Elazig, Turkey, 38.6744, 39.2228 Zanjan, Iran, 36.6864, 48.4953 Bairia, India, 25.7583, 84.1489 Oyo, Nigeria, 7.8417, 3.9306 Taytay, Philippines, 14.5692, 121.1325 Kisenzi, Congo (Kinshasa), -4.4094, 15.3425 Bhatpara, India, 22.8700, 88.4100 Sintra, Portugal, 38.7974, -9.3904 Manisa, Turkey, 38.6144, 27.4292 Sirur, India, 18.8300, 74.3800 Tarlac City, Philippines, 15.4869, 120.5900 Okazaki, Japan, 34.9543, 137.1744 Ceel Baraf, Somalia, 3.2072, 45.7593 Lingxi, China, 27.5036, 120.3975 Ilesa, Nigeria, 7.6167, 4.7167 Kakinada, India, 16.9661, 82.2550 Savar, Bangladesh, 23.8482, 90.2577 Nuevo Laredo, Mexico, 27.4861, -99.5069 Lecheng, China, 25.1333, 113.3333 Bawshar, Oman, 23.5777, 58.3998 Christchurch, New Zealand, -43.5311, 172.6361 Gusau, Nigeria, 12.1500, 6.6667 Hancheng, China, 35.4667, 110.4333 Zetang, China, 29.2380, 91.7710 Serekunda, Gambia, The, 13.4450, -16.6750 Kanifing, Gambia, The, 13.4475, -16.6725 Canberra, Australia, -35.2931, 149.1269 Minamisuita, Japan, 34.7594, 135.5169 Malabon, Philippines, 14.6600, 120.9600 Neiva, Colombia, 2.9345, -75.2809 Ha Tinh, Vietnam, 18.3333, 105.9000 Huancayo, Peru, -12.0667, -75.2167 Celaya, Mexico, 20.5222, -100.8122 Ichinomiya, Japan, 35.3039, 136.8031 Iquitos, Peru, -3.7500, -73.2500 Panihati, India, 22.6900, 88.3700 Lianzhou, China, 24.7810, 112.3770 Cainta, Philippines, 14.5700, 121.1200 Helixi, China, 30.6267, 118.9861 Madinat as Sadis min Uktubar, Egypt, 29.9361, 30.9269 Mamou, Guinea, 10.3833, -12.0833 Scranton, United States, 41.4044, -75.6649 Itaquaquecetuba, Brazil, -23.4864, -46.3486 Cantonment, Pakistan, 31.5167, 74.3833 Rohtak, India, 28.8909, 76.5796 Maler Kotla, India, 30.5167, 75.8833 Bhawana, Pakistan, 31.5661, 72.6461 Oxnard, United States, 34.1964, -119.1815 Bryansk, Russia, 53.2425, 34.3667 Lipa City, Philippines, 13.9411, 121.1622 Butuan, Philippines, 8.9480, 125.5430 Dikirnis, Egypt, 31.0890, 31.5948 Takasaki, Japan, 36.3219, 139.0033 Ambon, Indonesia, -3.6967, 128.1783 Indio, United States, 33.7346, -116.2346 Malakwal, Pakistan, 32.5531, 73.2067 Toyohashi, Japan, 34.7692, 137.3915 Chitungwiza, Zimbabwe, -17.9939, 31.0481 Panshi, China, 42.9500, 126.0667 Az Zubayr, Iraq, 30.3892, 47.7081 Bharatpur, Nepal, 27.6833, 84.4333 Petare, Venezuela, 10.4833, -66.8167 Mardan, Pakistan, 34.2012, 72.0258 Nagano, Japan, 36.6486, 138.1947 Bauru, Brazil, -22.3147, -49.0606 La Florida, Chile, -33.5333, -70.5833 Nicolas Romero, Mexico, 19.5833, -99.3667 Jinshan, China, 25.1475, 101.9764 Bochum, Germany, 51.4819, 7.2158 Baguio City, Philippines, 16.4119, 120.5933 Cibinong, Indonesia, -6.4850, 106.8420 Sivas, Turkey, 39.7500, 37.0167 Kolga, India, 22.3500, 82.6800 Korba, India, 22.3458, 82.6963 Qardho, Somalia, 9.5004, 49.1660 Rio Branco, Brazil, -9.9781, -67.8117 Tecamac, Mexico, 19.7131, -98.9683 Alanya, Turkey, 36.5500, 32.0000 Mandaue City, Philippines, 10.3300, 123.9300 Victorville, United States, 34.5277, -117.3536 Kocaeli, Turkey, 40.7625, 29.9175 Warri, Nigeria, 5.5167, 5.7500 Victoria, Canada, 48.4283, -123.3647 Wonsan, Korea, North, 39.1475, 127.4461 Iligan, Philippines, 8.2300, 124.2500 Anguo, China, 38.4180, 115.3270 Coventry, United Kingdom, 52.4081, -1.5106 Trenton, United States, 40.2237, -74.7641 Keelung, Taiwan, 25.1333, 121.7333 Geita, Tanzania, -2.8714, 32.2294 Ivanovo, Russia, 56.9967, 40.9819 Cuenca, Ecuador, -2.8974, -79.0045 Caerdydd, United Kingdom, 51.4817, -3.1792 Blumenau, Brazil, -26.9189, -49.0658 Nanqiao, China, 30.9167, 121.4547 Hrodna, Belarus, 53.6667, 23.8333 Florence, Italy, 43.7714, 11.2542 Buurhakaba, Somalia, 2.7837, 44.0833 Bengkulu, Indonesia, -3.7956, 102.2592 Caxias do Sul, Brazil, -29.1678, -51.1789 Malmo, Sweden, 55.5833, 13.0333 Shuanghe, China, 30.3746, 106.7903 Petion-Ville, Haiti, 18.5098, -72.2856 Dengtacun, China, 41.4333, 123.3333 Huntsville, United States, 34.6981, -86.6412 Utrecht, Netherlands, 52.0908, 5.1217 Palu, Indonesia, -0.8950, 119.8594 Sikar, India, 27.6200, 75.1500 Umuahia, Nigeria, 5.5333, 7.4833 Wuppertal, Germany, 51.2667, 7.1833 Palmira, Colombia, 3.5833, -76.2500 Alicante, Spain, 38.3453, -0.4831 Sao Jose do Rio Preto, Brazil, -20.8200, -49.3789 Ash Shuhada', Egypt, 30.5968, 30.8993 Ondo, Nigeria, 7.0833, 4.8333 Vitsyebsk, Belarus, 55.1917, 30.2056 Sasaram, India, 24.9500, 84.0300 Sultanbeyli, Turkey, 40.9683, 29.2617 Xunyang, China, 32.8341, 109.3653 Taraz, Kazakhstan, 42.9000, 71.3667 Cubal, Angola, -13.0333, 14.2500 Anda, China, 46.4240, 125.3520 Luena, Angola, -11.7918, 19.9062 Karnal, India, 29.6860, 76.9890 Gonaives, Haiti, 19.4456, -72.6883 Vinnytsia, Ukraine, 49.2333, 28.4833 Minatitlan, Mexico, 17.9833, -94.5500 Linxia Chengguanzhen, China, 35.6047, 103.2422 Brahmapur, India, 19.3150, 84.7941 Modesto, United States, 37.6375, -121.0028 Caucaia, Brazil, -3.7328, -38.6558 Cabuyao, Philippines, 14.2750, 121.1250 Gedaref, Sudan, 14.0333, 35.3833 San Fernando, Philippines, 15.0300, 120.6800 Kawagoe, Japan, 35.9251, 139.4858 Pokhara, Nepal, 28.2097, 83.9853 Nice, France, 43.7034, 7.2663 Villahermosa, Mexico, 17.9892, -92.9281 Wakayama, Japan, 34.2333, 135.1667 Mahilyow, Belarus, 53.9167, 30.3500 Osh, Kyrgyzstan, 40.5333, 72.7833 Kita-ku, Japan, 35.7500, 139.7333 Gimpo, Korea, South, 37.7000, 126.6000 Corrientes, Argentina, -27.4833, -58.8167 Thari Mir Wah, Pakistan, 27.0683, 68.6023 Nara, Japan, 34.6844, 135.8050 Vladimir, Russia, 56.1286, 40.4058 Sinuiju, Korea, North, 40.1000, 124.4000 Oruro, Bolivia, -17.9667, -67.1167 Arkhangelsk, Russia, 64.5431, 40.5375 Batangas, Philippines, 13.8300, 121.0000 Ahmadnagar, India, 19.0800, 74.7300 Varna, Bulgaria, 43.2114, 27.9111 Tarsus, Turkey, 36.9165, 34.8951 Sariyer, Turkey, 41.1669, 29.0572 Semey, Kazakhstan, 50.4333, 80.2667 Holguin, Cuba, 20.8872, -76.2631 Tungi, Bangladesh, 23.8915, 90.4023 Gode, Ethiopia, 5.9527, 43.5516 Sawran, Iraq, 36.6532, 44.5441 An Nhon, Vietnam, 13.9170, 109.0830 Olinda, Brazil, -8.0089, -34.8550 Praia Grande, Brazil, -24.0058, -46.4028 Shinjuku, Japan, 35.7014, 139.7097 Antofagasta, Chile, -23.6500, -70.4000 Meram, Turkey, 37.8364, 32.4383 Cascavel, Brazil, -24.9558, -53.4553 Pamukkale, Turkey, 37.9167, 29.1167 Canoas, Brazil, -29.9200, -51.1800 Takatsuki, Japan, 34.8461, 135.6175 Yidu, China, 30.3780, 111.4500 Antonio Enes, Mozambique, -16.2308, 39.9105 Plovdiv, Bulgaria, 42.1434, 24.7510 Central Coast, Australia, -33.3000, 151.2000 Honolulu, United States, 21.3294, -157.8460 Karsiyaka, Turkey, 38.4594, 27.1153 Shahjanpur, India, 27.8800, 79.9100 Gwagwalada, Nigeria, 8.9392, 7.0758 Avadi, India, 13.1147, 80.1098 Tanch'on, Korea, North, 40.4580, 128.9110 Greensboro, United States, 36.0956, -79.8271 Khanapur, India, 15.6394, 74.5083 Wad Medani, Sudan, 14.4000, 33.5100 Fort Wayne, United States, 41.0888, -85.1436 Kusti, Sudan, 13.1700, 32.6600 Belfast, United Kingdom, 54.5967, -5.9300 Cuddapah, India, 14.4700, 78.8200 Nakano, Japan, 35.7074, 139.6638 Yong'an, China, 25.9420, 117.3650 Alamadi, India, 13.1097, 80.0972 Carapicuiba, Brazil, -23.5228, -46.8358 Anaheim, United States, 33.8390, -117.8574 Brest, Belarus, 52.1347, 23.6569 Otsu, Japan, 35.0167, 135.8500 Maseru, Lesotho, -29.3100, 27.4800 Pavlodar, Kazakhstan, 52.3000, 76.9500 Chon Buri, Thailand, 13.3611, 100.9850 Naga City, Philippines, 13.6244, 123.1864 Vahdat, Tajikistan, 38.5531, 69.0206 Florianopolis, Brazil, -27.5933, -48.5530 Paulista, Brazil, -7.9408, -34.8728 Sfax, Tunisia, 34.7400, 10.7600 Rajahmundry, India, 16.9800, 81.7800 Koshigaya, Japan, 35.8911, 139.7909 Hongjiang, China, 27.1910, 109.8190 Yesilyurt, Turkey, 38.2961, 38.2489 Vung Tau, Vietnam, 10.3833, 107.1167 Jeonju, Korea, South, 35.8167, 127.1500 Alwar, India, 27.5498, 76.6355 Huadian, China, 42.9720, 126.7460 Tokorozawa, Japan, 35.7996, 139.4686 Sumqayit, Azerbaijan, 40.5961, 49.6700 Vitoria da Conquista, Brazil, -14.8661, -40.8394 Yamoussoukro, Côte d’Ivoire, 6.8161, -5.2742 Buon Ma Thuot, Vietnam, 12.6667, 108.0500 Corpus Christi, United States, 27.7254, -97.3767 Fort Collins, United States, 40.5477, -105.0656 Mishan, China, 45.5298, 131.8466 Makiivka, Ukraine, 48.0556, 37.9611 Islip, United States, 40.7385, -73.1888 Cuernavaca, Mexico, 18.9186, -99.2342 Markham, Canada, 43.8767, -79.2633 Bielefeld, Germany, 52.0211, 8.5347 Bydgoszcz, Poland, 53.1219, 18.0003 Chinju, Korea, South, 35.2000, 128.0833 Reading, United Kingdom, 51.4542, -0.9731 Randburg, South Africa, -26.0936, 28.0064 Iwaki, Japan, 37.0505, 140.8877 Oshawa, Canada, 43.9000, -78.8500 Bonn, Germany, 50.7353, 7.1022 Sambalpur, India, 21.4700, 83.9700 Santo Domingo de los Colorados, Ecuador, -0.2542, -79.1719 Uruapan, Mexico, 19.4208, -102.0628 Lublin, Poland, 51.2500, 22.5667 Porto Velho, Brazil, -8.7619, -63.9039 Licheng, China, 24.5000, 110.4000 Huichang, China, 34.9073, 112.7914 Tampere, Finland, 61.4981, 23.7600 Antioch, United States, 37.9787, -121.7960 Muzaffarpur, India, 26.1225, 85.3906 Chita, Russia, 52.0500, 113.4667 Vina del Mar, Chile, -33.0244, -71.5517 Khipro, Pakistan, 25.8230, 69.3770 Asan, Korea, South, 36.7836, 127.0042 Nukus, Uzbekistan, 42.4667, 59.6000 Chak Jhumra, Pakistan, 31.5667, 73.1833 Simferopol, Ukraine, 44.9519, 34.1022 Konak, Turkey, 38.4189, 27.1285 Soledad de Graciano Sanchez, Mexico, 22.1833, -100.9333 Salalah, Oman, 17.0197, 54.0897 Santarem, Brazil, -2.4431, -54.7083 Yanbu`, Saudi Arabia, 24.0523, 38.1503 Maebashi, Japan, 36.3895, 139.0634 Kaluga, Russia, 54.5500, 36.2833 Ganca, Azerbaijan, 40.6828, 46.3606 Asahikawa, Japan, 43.7667, 142.3667 Jackson, United States, 32.3157, -90.2125 Kendari, Indonesia, -3.9907, 122.5086 Wonju, Korea, South, 37.3417, 127.9208 Birkat as Sab`, Egypt, 30.6291, 31.0824 Lafia, Nigeria, 8.4917, 8.5167 Dahuk, Iraq, 36.8500, 42.9833 Nizhniy Tagil, Russia, 57.9167, 59.9667 Finglas, Ireland, 53.3892, -6.2969 Kamarhati, India, 22.6686, 88.3704 Nicosia, Cyprus, 35.1725, 33.3650 Lengshuijiang, China, 27.6860, 111.4360 Ribeirao das Neves, Brazil, -19.7669, -44.0869 Guediawaye, Senegal, 14.7724, -17.3884 Ciudad Obregon, Mexico, 27.4939, -109.9389 Campiernagar, India, 27.0290, 83.2668 Phatthaya, Thailand, 12.9357, 100.8890 Minzhu, China, 43.7238, 127.3448 Belgorod, Russia, 50.6000, 36.6000 Gomez Palacio, Mexico, 25.5611, -103.4983 Bijapur, India, 16.8300, 75.7100 Cabanatuan City, Philippines, 15.4908, 120.9678 Si Racha, Thailand, 13.1740, 100.9300 Salamanca, Mexico, 20.5703, -101.1972 Ratnagiri, India, 16.9944, 73.3000 Ulanhot, China, 46.0722, 122.0933 Chipata, Zambia, -13.6453, 32.6464 Koriyama, Japan, 37.4004, 140.3597 Yunzhong, China, 39.8279, 113.1000 Fayetteville, United States, 35.0850, -78.9772 Arnavutkoy, Turkey, 41.1856, 28.7406 Kucukcekmece, Turkey, 41.0000, 28.8000 Roodepoort, South Africa, -26.1625, 27.8725 Pucallpa, Peru, -8.3833, -74.5500 San Pedro, Philippines, 14.3583, 121.0583 Myrtle Beach, United States, 33.7094, -78.8844 Kochi, Japan, 33.5589, 133.5314 Jagdalpur, India, 19.1800, 81.9200 Rampur, India, 28.8000, 79.0000 Kuching, Malaysia, 1.5300, 110.3300 Cotabato, Philippines, 7.2200, 124.2500 Nantes, France, 47.2181, -1.5528 Henderson, United States, 36.0133, -115.0381 Cariacica, Brazil, -20.2639, -40.4200 Mobile, United States, 30.6782, -88.1162 Nazret, Ethiopia, 8.5414, 39.2689 Safi, Morocco, 32.2833, -9.2333 Kikuyu, Kenya, -1.2463, 36.6629 Cordoba, Spain, 37.8900, -4.7800 Kluang, Malaysia, 2.0383, 103.3179 Mekele, Ethiopia, 13.4969, 39.4769 Pelotas, Brazil, -31.7719, -52.3428 Vaughan, Canada, 43.8333, -79.5000 Kaiyuan, China, 23.7111, 103.2461 Tangdong, China, 25.9730, 113.2310 Munster, Germany, 51.9625, 7.6256 Vitoria, Brazil, -20.3106, -40.2972 Shimoga, India, 13.9333, 75.5667 Uige, Angola, -7.6167, 15.0500 Hotan, China, 37.1167, 79.9167 Minna, Nigeria, 9.6139, 6.5569 Ning'an, China, 44.3410, 129.4830 Camaguey, Cuba, 21.3786, -77.9186 Taourirt, Morocco, 34.4169, -2.8850 San Salvador de Jujuy, Argentina, -24.1833, -65.3000 Kashipur, India, 29.2200, 78.9500 Thu Dau Mot, Vietnam, 10.9667, 106.6500 Serra, Brazil, -20.1289, -40.3078 Lexington, United States, 38.0423, -84.4587 La Paz, Bolivia, -16.4958, -68.1333 Sukabumi, Indonesia, -6.9181, 106.9315 Menongue, Angola, -14.6556, 17.6842 Okene, Nigeria, 7.5619, 6.2411 Junagadh, India, 21.5222, 70.4579 Guasavito, Mexico, 25.5744, -108.4706 Kaech'on, Korea, North, 39.6986, 125.9061 Tehuacan, Mexico, 18.4617, -97.3928 Coatzacoalcos, Mexico, 18.1414, -94.4344 Saint-Denis, Reunion, -20.8789, 55.4481 Muhanga, Rwanda, -2.0845, 29.7527 Zalantun, China, 48.0270, 122.7080 Hafizabad, Pakistan, 32.0714, 73.6878 Katsina, Nigeria, 12.2500, 7.5000 Puerto Plata, Dominican Republic, 19.8000, -70.6833 Gwangmyeongni, Korea, South, 37.4760, 126.8660 Lansing, United States, 42.7142, -84.5601 Taubate, Brazil, -23.0333, -45.5500 Zhengjiatun, China, 43.5183, 123.5027 Port Moresby, Papua New Guinea, -9.4789, 147.1494 Fontibon, Colombia, 4.6786, -74.1411 Hapur, India, 28.7309, 77.7757 Mannheim, Germany, 49.4878, 8.4661 Barueri, Brazil, -23.5111, -46.8764 Savannah, United States, 32.0286, -81.1821 Naha, Japan, 26.2122, 127.6792 Bari, Italy, 41.1253, 16.8667 Pattikad, India, 10.5276, 76.2144 Xiaoli, China, 22.6721, 113.2509 Youngstown, United States, 41.0993, -80.6463 Trichur, India, 10.5276, 76.2144 Yingzhong, China, 32.2370, 119.8150 Bor, South Sudan, 6.2072, 31.5591 Volzhskiy, Russia, 48.8056, 44.7417 San Miguelito, Panama, 9.0503, -79.4707 N'Zerekore, Guinea, 7.7522, -8.8217 Balikesir, Turkey, 39.6333, 27.8833 Espoo, Finland, 60.2056, 24.6556 Muar, Malaysia, 2.0337, 102.5666 Ann Arbor, United States, 42.2759, -83.7310 Kasur, Pakistan, 31.1167, 74.4500 Usme, Colombia, 4.4464, -74.1522 Barddhaman, India, 23.2333, 87.8667 Sousse, Tunisia, 35.8333, 10.6333 Kingston upon Hull, United Kingdom, 53.7444, -0.3325 Binangonan, Philippines, 14.4514, 121.1919 Attiecoube, Côte d’Ivoire, 5.3453, -4.0350 Podolsk, Russia, 55.4311, 37.5456 Smolensk, Russia, 54.7828, 32.0453 Jiayuguan, China, 39.7732, 98.2882 Pasir Gudang, Malaysia, 1.4620, 103.9053 Vologda, Russia, 59.2167, 39.9000 Gorgan, Iran, 36.8369, 54.4372 Tanza, Philippines, 14.3944, 120.8531 Yakutsk, Russia, 62.0300, 129.7300 Santa Ana, United States, 33.7367, -117.8819 Catania, Italy, 37.5027, 15.0873 Panvel, India, 18.9944, 73.1139 Guaruja, Brazil, -23.9936, -46.2564 Nizamabad, India, 18.6720, 78.0940 Quy Nhon, Vietnam, 13.7667, 109.2333 Kurgan, Russia, 55.4667, 65.3500 Saransk, Russia, 54.1833, 45.1833 Ha'il, Saudi Arabia, 27.5167, 41.6833 Datang, China, 22.9406, 113.9436 Longquan, China, 25.9106, 114.7860 Mitchells Plain, South Africa, -34.0506, 18.6181 Yokkaichi, Japan, 34.9650, 136.6244 Chalco, Mexico, 19.2647, -98.8975 Karlsruhe, Germany, 49.0092, 8.4040 Shahriar, Iran, 35.6531, 51.0600 Shahr-e Qods, Iran, 35.7103, 51.1131 Ciudad del Este, Paraguay, -25.5167, -54.6161 Tabora, Tanzania, -5.0167, 32.8000 Ciudad Benito Juarez, Mexico, 25.6500, -100.0833 Beian, China, 48.2500, 126.5167 Irvine, United States, 33.6772, -117.7738 Hisor, Tajikistan, 38.5264, 68.5381 Nakuru, Kenya, -0.2833, 36.0667 Karawang, Indonesia, -6.3125, 107.2950 Sariwon, Korea, North, 38.5064, 125.7597 St. Paul, United States, 44.9478, -93.1039 Poughkeepsie, United States, 41.6950, -73.9211 Battalgazi, Turkey, 38.4228, 38.3656 Nghi Son, Vietnam, 19.4170, 105.7500 Guangming, China, 45.3333, 122.7833 Newark, United States, 40.7245, -74.1725 Parbhani, India, 19.2700, 76.7800 Montpellier, France, 43.6119, 3.8772 Puerto Princesa, Philippines, 9.7500, 118.7500 Hisar, India, 29.1500, 75.7000 Montes Claros, Brazil, -16.7322, -43.8636 Betim, Brazil, -19.9678, -44.1978 Windsor, Canada, 42.2833, -83.0000 Kasugai, Japan, 35.2475, 136.9722 Ciudad Santa Catarina, Mexico, 25.6833, -100.4500 Fatehpur, India, 27.9800, 74.9500 Birania, India, 27.9800, 74.9500 Ciudad Victoria, Mexico, 23.7389, -99.1431 Kaunas, Lithuania, 54.9000, 23.9333 Playa del Carmen, Mexico, 20.6281, -87.0755 Yonghetun, China, 39.9131, 116.6458 Kashan, Iran, 33.9825, 51.4325 La Pena, Mexico, 19.3606, -98.9417 Sumbawanga, Tanzania, -7.9667, 31.6167 Vila Nova de Gaia, Portugal, 41.1333, -8.6167 Orel, Russia, 52.9686, 36.0694 Vladikavkaz, Russia, 43.0400, 44.6775 Sao Vicente, Brazil, -23.9664, -46.3861 Karaikkudi, India, 10.0735, 78.7732 Augsburg, Germany, 48.3689, 10.8978 Panjakent, Tajikistan, 39.5000, 67.6167 Akita, Japan, 39.7200, 140.1026 Lachhmangarh Sikar, India, 27.8225, 75.0253 Kurume, Japan, 33.3192, 130.5083 Az Zaqaziq, Egypt, 30.5667, 31.5000 Palmas, Brazil, -10.1886, -48.3336 Bahia Blanca, Argentina, -38.7167, -62.2667 Al Waqf, Egypt, 26.0866, 32.4226 San Bernardo, Chile, -33.5833, -70.7000 San Juan del Rio, Mexico, 20.3833, -99.9833 Armenia, Colombia, 4.5300, -75.6800 Qianzhou, China, 28.2760, 109.7120 Popayan, Colombia, 2.4542, -76.6092 Valladolid, Spain, 41.6528, -4.7236 Al Qunfudhah, Saudi Arabia, 19.1264, 41.0789 Corlu, Turkey, 41.1500, 27.8000 Binxian, China, 35.0542, 108.0814 Yakou, China, 33.2950, 113.5269 Newcastle, United Kingdom, 54.9780, -1.6102 Oulgaret, India, 11.9265, 79.7789 Awasa, Ethiopia, 7.0500, 38.4667 Ingraj Bazar, India, 25.0119, 88.1433 Varzea Grande, Brazil, -15.6469, -56.1328 Oaxaca, Mexico, 17.0606, -96.7253 Sucre, Bolivia, -19.0475, -65.2600 Barrancabermeja, Colombia, 7.0667, -73.8500 Al `Ajami, Egypt, 31.1227, 29.7838 Al Matariyah, Egypt, 31.1833, 32.0333 Bada Barabil, India, 22.1200, 85.4000 Ash Shamiyah, Iraq, 31.9625, 44.6008 Khairpur Tamewah, Pakistan, 29.5800, 72.2328 Jinja, Uganda, 0.4233, 33.2039 Santa Rosa, United States, 38.4458, -122.7067 Ar Raqqah, Syria, 35.9304, 39.0200 Chakwal, Pakistan, 32.9303, 72.8556 Oakashicho, Japan, 34.6500, 135.0000 Oyster Bay, United States, 40.7846, -73.5140 Farg`ona, Uzbekistan, 40.3864, 71.7864 Tursunzoda, Tajikistan, 38.5108, 68.2303 Cherepovets, Russia, 59.1167, 37.9000 Resistencia, Argentina, -27.4514, -58.9867 Jember, Indonesia, -8.1727, 113.6873 Al Mubarraz, Saudi Arabia, 25.4416, 49.6642 Pekalongan, Indonesia, -6.8833, 109.6667 Los Mochis, Mexico, 25.7835, -108.9937 Toshima, Japan, 35.7333, 139.7167 Pachuca, Mexico, 20.1000, -98.7500 Yangsan, Korea, South, 35.3333, 129.0333 Concord, United States, 35.3933, -80.6369 Tampico, Mexico, 22.2553, -97.8686 Bihar, India, 25.1970, 85.5180 Temara, Morocco, 33.9267, -6.9122 Malabo, Equatorial Guinea, 3.7456, 8.7744 Winter Haven, United States, 28.0118, -81.7014 Valparaiso, Chile, -33.0461, -71.6197 Cirebon, Indonesia, -6.7071, 108.5574 Tagum, Philippines, 7.4478, 125.8078 Cekme, Turkey, 41.0369, 29.1786 Darbhanga, India, 26.1700, 85.9000 Comilla, Bangladesh, 23.4500, 91.2000 Idar, India, 23.8390, 73.0020 Pondokaren, Indonesia, -6.2811, 106.7019 Sorong, Indonesia, -0.8667, 131.2500 Shubrakhit, Egypt, 31.0279, 30.7149 Floridablanca, Colombia, 7.2167, -73.0667 Silang, Philippines, 14.2306, 120.9750 Al Kharj, Saudi Arabia, 24.1483, 47.3050 Rufisque, Senegal, 14.7140, -17.2723 Eloy Alfaro, Ecuador, -2.1733, -79.8311 Asheville, United States, 35.5707, -82.5537 Sikandarabad, India, 28.4512, 77.6955 Stockport, United Kingdom, 53.4083, -2.1494 Kafr Saqr, Egypt, 30.7934, 31.6257 Divo, Côte d’Ivoire, 5.8372, -5.3572 Vila Teixeira da Silva, Angola, -12.1958, 15.8556 Inegol, Turkey, 40.0806, 29.5097 Paarl, South Africa, -33.7242, 18.9558 Rangpur, Bangladesh, 25.7500, 89.2444 Bialystok, Poland, 53.1353, 23.1456 Vigo, Spain, 42.2314, -8.7124 Trabzon, Turkey, 41.0050, 39.7225 Canton, United States, 40.8078, -81.3676 Coacalco, Mexico, 19.6333, -99.0931 Aizawl, India, 23.7272, 92.7178 Bali, India, 22.6500, 88.3400 Bradford, United Kingdom, 53.8000, -1.7500 Mabalacat, Philippines, 15.2200, 120.5800 Dexing, China, 28.9306, 117.5947 Lincoln, United States, 40.8099, -96.6784 Hailin, China, 44.5940, 129.3800 Graz, Austria, 47.0708, 15.4386 Strasbourg, France, 48.5833, 7.7458 Flint, United States, 43.0236, -83.6921 Groznyy, Russia, 43.3125, 45.6986 Mahikeng, South Africa, -25.8656, 25.6436 Chimbote, Peru, -9.0745, -78.5936 Bergen, Norway, 60.3925, 5.3233 Gatineau, Canada, 45.4833, -75.6500 Surajgarha, India, 25.2500, 86.2300 Lakeland, United States, 28.0557, -81.9545 Batna, Algeria, 35.5500, 6.1667 San Miguel, El Salvador, 13.4814, -88.1775 Aarhus, Denmark, 56.1572, 10.2107 Morioka, Japan, 39.7021, 141.1545 Hong'an, China, 47.2100, 123.6100 Nagercoil, India, 8.1750, 77.4306 Santa Maria, Philippines, 14.8200, 120.9600 Tambov, Russia, 52.7231, 41.4539 Jersey City, United States, 40.7184, -74.0686 Dewas, India, 22.9600, 76.0600 Eldoret, Kenya, 0.5167, 35.2833 Nottingham, United Kingdom, 52.9561, -1.1512 Magway, Burma, 20.1500, 94.9500 Anchorage, United States, 61.1508, -149.1091 Springfield, United States, 37.1943, -93.2916 Neuquen, Argentina, -38.9525, -68.0642 Tuzla, Turkey, 40.8161, 29.3006 Kabwe, Zambia, -14.4333, 28.4500 Cabimas, Venezuela, 10.4000, -71.4500 Setif, Algeria, 36.1900, 5.4100 Sonpur, India, 25.7000, 85.1800 Hugli, India, 22.9000, 88.3900 Chunchura, India, 22.9000, 88.3900 Meguro, Japan, 35.6333, 139.6833 Anapolis, Brazil, -16.3269, -48.9528 Machala, Ecuador, -3.2667, -79.9667 San Lorenzo, Paraguay, -25.3400, -57.5200 Franca, Brazil, -20.5389, -47.4008 Bac Ninh, Vietnam, 21.1833, 106.0500 Ichalkaranji, India, 16.7000, 74.4700 Tirupati, India, 13.6500, 79.4200 Plano, United States, 33.0502, -96.7486 Pathein, Burma, 16.7842, 94.7333 Sincelejo, Colombia, 9.2950, -75.3961 Cluj-Napoca, Romania, 46.7667, 23.5833 Songea, Tanzania, -10.6833, 35.6500 Tacna, Peru, -18.0147, -70.2489 Tin Shui Wai, Hong Kong, 22.4600, 114.0020 Juazeiro do Norte, Brazil, -7.2128, -39.3150 Al Qurnah, Iraq, 31.0155, 47.4336 Bhatinda, India, 30.2300, 74.9519 Katowice, Poland, 50.2625, 19.0217 Wiesbaden, Germany, 50.0825, 8.2400 Masaka, Uganda, -0.3411, 31.7361 Foz do Iguacu, Brazil, -25.5400, -54.5875 Bolton, United Kingdom, 53.5783, -2.4300 San Pablo, Philippines, 14.0700, 121.3250 Huixquilucan, Mexico, 19.3611, -99.3508 Qillin, Egypt, 31.0475, 30.8549 Croix-des-Bouquets, Haiti, 18.5761, -72.2269 San Juan Sacatepequez, Guatemala, 14.7189, -90.6442 Ostrava, Czechia, 49.8356, 18.2925 Soyapango, El Salvador, 13.7333, -89.1500 Ljubljana, Slovenia, 46.0514, 14.5061 Fukushima, Japan, 37.7608, 140.4747 Bago, Burma, 17.3333, 96.4833 Delmas, Haiti, 18.5500, -72.3000 Fuquan, China, 26.6863, 107.5204 Ibaraki, Japan, 34.8164, 135.5686 Nizhnevartovsk, Russia, 60.9500, 76.6000 Lubbock, United States, 33.5657, -101.8879 Satna, India, 24.6005, 80.8322 San Cristobal, Venezuela, 7.7667, -72.2333 Chernihiv, Ukraine, 51.4939, 31.2947 Gungoren, Turkey, 41.0225, 28.8717 Temuco, Chile, -38.7333, -72.6667 Ica, Peru, -14.0667, -75.7333 Davenport, United States, 41.5565, -90.6053 Phitsanulok, Thailand, 16.8158, 100.2636 Khanewal, Pakistan, 30.3000, 71.9333 Jining, China, 41.0300, 113.0800 Chuncheon, Korea, South, 37.8667, 127.7333 Sakarya, Turkey, 40.7833, 30.4000 Kaura Namoda, Nigeria, 12.6000, 6.5897 Malard, Iran, 35.6806, 50.9783 Bukhara, Uzbekistan, 39.7667, 64.4231 Reading, United States, 40.3400, -75.9267 Marot, Pakistan, 28.5100, 71.5000 Sumbe, Angola, -11.2053, 13.8417 Mingaora, Pakistan, 34.7717, 72.3600 Caala, Angola, -12.8500, 15.5500 Poltava, Ukraine, 49.5894, 34.5514 Petrozavodsk, Russia, 61.7833, 34.3333 Kherson, Ukraine, 46.6425, 32.6250 Lucena, Philippines, 13.9300, 121.6200 Petropolis, Brazil, -22.5050, -43.1789 Mamuju, Indonesia, -2.6833, 118.9000 Mau, India, 25.9417, 83.5611 Long Xuyen, Vietnam, 10.3736, 105.4458 Gyeongsan, Korea, South, 35.8167, 128.7333 Barasat, India, 22.7200, 88.4800 Qarshi, Uzbekistan, 38.8667, 65.8000 Shreveport, United States, 32.4653, -93.7955 Chandler, United States, 33.2825, -111.8514 Pematangsiantar, Indonesia, 2.9600, 99.0600 Sunderland, United Kingdom, 54.9060, -1.3810 Sterlitamak, Russia, 53.6333, 55.9500 Santa Ana, El Salvador, 13.9950, -89.5561 Buyukcekmece, Turkey, 41.0200, 28.5775 Gagnoa, Côte d’Ivoire, 6.1333, -5.9333 Xingsha, China, 28.2573, 113.1234 Dire Dawa, Ethiopia, 9.6000, 41.8667 Lashkar Gah, Afghanistan, 31.5831, 64.3692 Itagui, Colombia, 6.1667, -75.6167 Juliaca, Peru, -15.4833, -70.1333 Posadas, Argentina, -27.3667, -55.9000 Tegal, Indonesia, -6.8675, 109.1375 Farrukhabad, India, 27.3900, 79.5810 South Bend, United States, 41.6767, -86.2696 Mytishchi, Russia, 55.9167, 37.7667 Kunsan, Korea, South, 35.9833, 126.7167 Wilmington, United States, 34.2099, -77.8866 Chula Vista, United States, 32.6281, -117.0144 Yoshkar-Ola, Russia, 56.6500, 47.8833 Saugor, India, 23.8300, 78.7100 Khmelnytskyi, Ukraine, 49.4167, 27.0000 Khorabar, India, 26.7410, 83.8880 Nassau, Bahamas, The, 25.0442, -77.3503 Rockford, United States, 42.2596, -89.0640 Isfara, Tajikistan, 40.1167, 70.6333 Ratlam, India, 23.3340, 75.0370 Mehrabpur, Pakistan, 27.0994, 68.4208 Yeosu, Korea, South, 34.7607, 127.6622 Shaowu, China, 27.3403, 117.4925 Ponta Grossa, Brazil, -25.0950, -50.1619 Taboao da Serra, Brazil, -23.6019, -46.7528 Istaravshan, Tajikistan, 39.9108, 69.0064 San Mateo, Philippines, 14.6969, 121.1219 Tsu, Japan, 34.7331, 136.5133 Imperatriz, Brazil, -5.5258, -47.4758 Huozhou, China, 36.5690, 111.7551 Los Alcarrizos, Dominican Republic, 18.5167, -70.0167 Soubre, Côte d’Ivoire, 5.7836, -6.5939 Eugene, United States, 44.0564, -123.1174 Maragheh, Iran, 37.3894, 46.2378 Majene, Indonesia, -3.5403, 118.9707 Huilong, China, 30.3866, 106.7756 Salem, United States, 44.9233, -123.0244 Sumida, Japan, 35.7000, 139.8167 Gabela, Angola, -10.8500, 14.3667 Dayr az Zawr, Syria, 35.3304, 40.1300 Iasi, Romania, 47.1622, 27.5889 Sarta, Iran, 36.4486, 53.3233 Gilbert, United States, 33.3100, -111.7463 Da'an, China, 45.5000, 124.2833 North Las Vegas, United States, 36.2883, -115.0888 Iksan, Korea, South, 35.9439, 126.9544 My Tho, Vietnam, 10.3500, 106.3500 Nguru, Nigeria, 12.8792, 10.4525 Mito, Japan, 36.3658, 140.4712 Kunp'o, Korea, South, 37.3500, 126.9500 Bijiao, China, 22.9253, 113.2067 Cherkasy, Ukraine, 49.4444, 32.0597 Bayat, Turkey, 40.5455, 34.9570 Corum, Turkey, 40.5455, 34.9570 Handwara, India, 34.3997, 74.2817 Binjai, Indonesia, 3.5986, 98.4803 Monchengladbach, Germany, 51.2000, 6.4333 Kunduz, Afghanistan, 36.7286, 68.8681 Parana, Argentina, -31.7331, -60.5297 Yeosu, Korea, South, 34.7333, 127.7333 Drug, India, 21.1900, 81.2800 Turbat, Pakistan, 26.0042, 63.0606 Gijon, Spain, 43.5333, -5.7000 Brahmanbaria, Bangladesh, 23.9723, 91.1099 Thai Binh, Vietnam, 20.4461, 106.3422 Ichihara, Japan, 35.4981, 140.1154 Tarija, Bolivia, -21.5333, -64.7333 Shibin al Kawm, Egypt, 30.5500, 31.0000 Siverek, Turkey, 37.7500, 39.3167 Plymouth, United Kingdom, 50.3714, -4.1422 Aswan, Egypt, 24.0889, 32.8997 Potosi, Bolivia, -19.5892, -65.7533 Hulin, China, 45.7667, 132.9333 Kostroma, Russia, 57.7681, 40.9269 Murmansk, Russia, 68.9706, 33.0750 Maradi, Niger, 13.5010, 7.1036 Xiangkhoang, Laos, 19.4167, 103.5000 Anantapur, India, 14.6800, 77.5990 Kiziltepe, Turkey, 37.1939, 40.5861 Adiyaman, Turkey, 37.7639, 38.2778 East London, South Africa, -33.0175, 27.9047 Saskatoon, Canada, 52.1333, -106.6833 Sumare, Brazil, -22.8219, -47.2669 Gelsenkirchen, Germany, 51.5167, 7.1000 Nagaoka, Japan, 37.4462, 138.8512 Khwazakhela, Pakistan, 34.9333, 72.4667 Santa Clarita, United States, 34.4175, -118.4964 Suncheon, Korea, South, 34.9506, 127.4875 Kibaha, Tanzania, -6.7667, 38.9167 Nalchik, Russia, 43.4833, 43.6167 Gent, Belgium, 51.0536, 3.7253 Karakopru, Turkey, 37.1847, 38.7908 Antsirabe, Madagascar, -19.8667, 47.0333 Feni, Bangladesh, 23.0150, 91.3967 Imphal, India, 24.8074, 93.9384 Taunggyi, Burma, 20.7836, 97.0354 Nogales, Mexico, 31.3000, -110.9333 Ed Daein, Sudan, 11.4672, 26.1317 Dezful, Iran, 32.3786, 48.4144 Mossoro, Brazil, -5.1878, -37.3439 Milton Keynes, United Kingdom, 52.0400, -0.7600 Chernivtsi, Ukraine, 48.3000, 25.9333 Dumai, Indonesia, 1.6667, 101.4500 Itajai, Brazil, -26.9078, -48.6619 Kutahya, Turkey, 39.4167, 29.9833 Constanta, Romania, 44.1667, 28.6333 Luque, Paraguay, -25.2672, -57.4853 Yao, Japan, 34.6269, 135.6010 Jalalabad, Afghanistan, 34.4342, 70.4478 Chiayi, Taiwan, 23.4800, 120.4497 Nawabshah, Pakistan, 26.2442, 68.4100 Talisay, Philippines, 10.2500, 123.8300 Tchibota, Congo (Brazzaville), -4.1794, 11.3731 Matala, Angola, -14.7306, 15.0367 Peoria, United States, 40.7520, -89.6154 Quilmes, Argentina, -34.7167, -58.2667 Novorossiysk, Russia, 44.7167, 37.7833 Wollongong, Australia, -34.4331, 150.8831 Zhytomyr, Ukraine, 50.2500, 28.6667 Fukui, Japan, 36.0641, 136.2196 Arrah, India, 25.5514, 84.6603 Tallahassee, United States, 30.4551, -84.2527 Malolos, Philippines, 14.8436, 120.8114 Heroica Nogales, Mexico, 31.3186, -110.9458 Killeen, United States, 31.0753, -97.7297 Bariadi, Tanzania, -2.7919, 33.9894 Hong, Nigeria, 10.2317, 12.9303 Santa Teresa del Tuy, Venezuela, 10.2333, -66.6639 St. Petersburg, United States, 27.7931, -82.6652 Fuchu, Japan, 35.6689, 139.4776 Minato, Japan, 35.6581, 139.7514 Novi Sad, Serbia, 45.2542, 19.8425 Boksburg, South Africa, -26.2125, 28.2625 Olongapo, Philippines, 14.8300, 120.2800 Quang Ngai, Vietnam, 15.1167, 108.8000 Engels, Russia, 51.5017, 46.1222 Kennewick, United States, 46.1978, -119.1732 Sivakasi, India, 9.4533, 77.8024 Al Hamzah, Iraq, 31.7244, 44.9769 Skardu, Pakistan, 35.2903, 75.6444 Qo`qon, Uzbekistan, 40.5286, 70.9425 Kotri, Pakistan, 25.3740, 68.3013 Misratah, Libya, 32.3775, 15.0920 Aydin, Turkey, 37.8481, 27.8453 Singa, Sudan, 13.1483, 33.9311 Taluqan, Afghanistan, 36.7167, 69.5167 Manta, Ecuador, -0.9500, -80.7162 Ndulo, Angola, -11.4833, 15.8333 Andulo, Angola, -11.4926, 16.7035 Vitoria-Gasteiz, Spain, 42.8500, -2.6833 Hiratsuka, Japan, 35.3167, 139.3500 Columbus, United States, 32.5100, -84.8771 Raniyah, Iraq, 36.2550, 44.8822 Annaba, Algeria, 36.9000, 7.7667 Etawah, India, 26.7700, 79.0300 Siddhirganj, Bangladesh, 23.6913, 90.5149 Khimki, Russia, 55.8892, 37.4450 Chingola, Zambia, -12.5333, 27.8500 Sumy, Ukraine, 50.9119, 34.8028 Yakeshi, China, 49.2860, 120.7120 Indaiatuba, Brazil, -23.0903, -47.2181 Bloemfontein, South Africa, -29.1167, 26.2167 Laredo, United States, 27.5625, -99.4874 Malkajgiri, India, 17.4519, 78.5362 Germiston, South Africa, -26.2178, 28.1672 Verona, Italy, 45.4386, 10.9928 Kakogawacho-honmachi, Japan, 34.7500, 134.8333 Derby, United Kingdom, 52.9247, -1.4780 Pasarkemis, Indonesia, -6.1703, 106.5300 Westminster, United Kingdom, 51.4947, -0.1353 Kuala Terengganu, Malaysia, 5.3304, 103.1200 Irving, United States, 32.8583, -96.9702 San Pedro Carcha, Guatemala, 15.4667, -90.3000 Mocamedes, Angola, -15.1953, 12.1508 Tokushima, Japan, 34.0667, 134.5500 Sao Carlos, Brazil, -22.0178, -47.8908 Longueuil, Canada, 45.5333, -73.5167 Marilao, Philippines, 14.7581, 120.9481 Tuni, India, 17.3500, 82.5500 Sodo, Ethiopia, 6.8550, 37.7808 Ash Shatrah, Iraq, 31.4175, 46.1772 Sab` al Bur, Iraq, 33.4617, 44.1557 Fort-de-France, Martinique, 14.6000, -61.0667 Mawlamyine, Burma, 16.4847, 97.6258 Caruaru, Brazil, -8.2828, -35.9758 Tanta, Egypt, 30.7833, 31.0000 Amarnath, India, 19.2090, 73.1860 Godome, Benin, 6.3667, 2.3500 Rapar, India, 23.5700, 70.6300 Samastipur, India, 25.8629, 85.7811 Gokak, India, 16.1667, 74.8333 Manavgat, Turkey, 36.7833, 31.4333 Shinozaki, Japan, 33.9578, 130.9414 Aachen, Germany, 50.7756, 6.0836 Parnamirim, Brazil, -5.9158, -35.2628 Jhenida, Bangladesh, 23.5425, 89.1749 Cimanggis, Indonesia, -6.3645, 106.8591 Bharatpur, India, 27.2200, 77.4800 Los Teques, Venezuela, 10.3333, -67.0417 Round Lake Beach, United States, 42.3791, -88.0811 Osmaniye, Turkey, 37.0750, 36.2500 Uberaba, Brazil, -19.7478, -47.9319 Begusarai, India, 25.4200, 86.1300 Kediri, Indonesia, -7.8111, 112.0047 Kanggye, Korea, North, 40.9667, 126.6000 Hakodate, Japan, 41.7686, 140.7289 Tacloban, Philippines, 11.2400, 125.0000 Afyonkarahisar, Turkey, 38.7578, 30.5386 Iskenderun, Turkey, 36.5817, 36.1650 Montgomery, United States, 32.3482, -86.2668 Soka, Japan, 35.8254, 139.8053 Nedumana, India, 8.9139, 76.6889 Higuey, Dominican Republic, 18.6181, -68.7111 Chesapeake, United States, 36.6778, -76.3023 Wolverhampton, United Kingdom, 52.5833, -2.1333 Pointe-a-Pitre, Guadeloupe, 16.2411, -61.5331 Al Fallujah, Iraq, 33.3500, 43.7833 Timisoara, Romania, 45.7597, 21.2300 Bata, Equatorial Guinea, 1.8650, 9.7700 Chemnitz, Germany, 50.8333, 12.9167 Rach Gia, Vietnam, 10.0167, 105.0833 Companiganj, Bangladesh, 22.8730, 91.2782 Venice, Italy, 45.4397, 12.3319 Babol, Iran, 36.5475, 52.6783 Glendale, United States, 33.5791, -112.2311 La Paz, Mexico, 24.1422, -110.3108 Kalar, Iraq, 34.6281, 45.3185 Turkistan, Kazakhstan, 43.3019, 68.2692 Al Bayda', Libya, 32.7628, 21.7550 Natogyi, Burma, 21.4167, 95.6500 Kurmuk, Sudan, 10.5563, 34.2848 New Delhi, India, 28.6139, 77.2089 Las Condes, Chile, -33.4117, -70.5500 Goma, Congo (Kinshasa), -1.6794, 29.2336 Rishon LeZiyyon, Israel, 31.9500, 34.8000 Osorno, Chile, -40.5725, -73.1353 Campeche, Mexico, 19.8500, -90.5306 Tiruvottiyur, India, 13.1600, 80.3000 Palangkaraya, Indonesia, -2.2100, 113.9200 A Coruna, Spain, 43.3650, -8.4100 Burnaby, Canada, 49.2667, -122.9667 Ramnagar, India, 27.1700, 84.3200 Limeira, Brazil, -22.5647, -47.4017 Kiel, Germany, 54.3233, 10.1394 Carmen, Mexico, 18.6431, -91.8306 Gandhidham, India, 23.0800, 70.1300 Banikoara, Benin, 11.3000, 2.4333 Salumbar, India, 24.0800, 74.0200 Kyongju, Korea, South, 35.8500, 129.2167 Vantaa, Finland, 60.2944, 25.0403 Sibu, Malaysia, 2.3030, 111.8430 Qa'em Shahr, Iran, 36.4636, 52.8581 Beykoz, Turkey, 41.1342, 29.0922 Nashua, United States, 42.7491, -71.4910 Sahiwal, Pakistan, 30.6611, 73.1083 Isparta, Turkey, 37.7647, 30.5567 Navotas, Philippines, 14.6667, 120.9417 Santa Clara, Cuba, 22.4067, -79.9531 Yamagata, Japan, 38.2554, 140.3396 Aksaray, Turkey, 38.3742, 34.0289 Governador Valadares, Brazil, -18.8508, -41.9489 Khomeyni Shahr, Iran, 32.6803, 51.5361 Shijing, China, 23.0930, 113.7965 York, United States, 39.9651, -76.7315 Abertawe, United Kingdom, 51.6167, -3.9500 Tsukuba-kenkyugakuen-toshi, Japan, 36.0835, 140.0764 Oruro, Bolivia, -17.9799, -67.1300 Macae, Brazil, -22.3708, -41.7869 Gyor, Hungary, 47.6842, 17.6344 Al `Ashir min Ramadan, Egypt, 30.2964, 31.7463 Mahajanga, Madagascar, -15.6700, 46.3450 Mount Lavinia, Sri Lanka, 6.8339, 79.8644 Garland, United States, 32.9100, -96.6304 Gdynia, Poland, 54.5175, 18.5400 Barnsley, United Kingdom, 53.5547, -1.4791 Taiping, Malaysia, 4.8650, 100.7200 Syktyvkar, Russia, 61.6667, 50.8167 Stoke-on-Trent, United Kingdom, 53.0255, -2.1761 Sao Jose de Ribamar, Brazil, -2.5619, -44.0539 Rock Hill, United States, 34.9415, -81.0241 Puducherry, India, 11.9167, 79.8167 Merlo, Argentina, -34.6653, -58.7275 Portoviejo, Ecuador, -1.0561, -80.4553 Damanhur, Egypt, 31.0500, 30.4667 Sarajevo, Bosnia and Herzegovina, 43.8564, 18.4131 Jessore, Bangladesh, 23.1704, 89.2000 Rivne, Ukraine, 50.6192, 26.2519 Kesbewa, Sri Lanka, 6.7914, 79.9378 Kanpur, India, 26.4499, 80.3319 Fuji, Japan, 35.1613, 138.6763 Eindhoven, Netherlands, 51.4344, 5.4842 Sabzevar, Iran, 36.2125, 57.6764 Santa Maria, Brazil, -29.6839, -53.8069 Bahir Dar, Ethiopia, 11.6000, 37.3833 Wudalianchi, China, 48.7500, 126.1667 Elche, Spain, 38.2669, -0.6983 Myitkyina, Burma, 25.3833, 97.4000 Ramgundam, India, 18.7639, 79.4750 Tuy Hoa, Vietnam, 13.0819, 109.2950 Sasebo, Japan, 33.1800, 129.7150 Sapele, Nigeria, 5.9000, 5.6667 Biratnagar, Nepal, 26.4833, 87.2833 Pandharpur, India, 17.6778, 75.3278 Marg`ilon, Uzbekistan, 40.4711, 71.7247 Qyzylorda, Kazakhstan, 44.8500, 65.5167 St. Catharines, Canada, 43.1833, -79.2333 Chigasaki, Japan, 35.3333, 139.4000 Araraquara, Brazil, -21.7939, -48.1758 Halle, Germany, 51.4828, 11.9697 Scottsdale, United States, 33.6872, -111.8651 Volta Redonda, Brazil, -22.5231, -44.1042 Americana, Brazil, -22.7392, -47.3314 Zhangping, China, 25.2902, 117.4200 Man, Côte d’Ivoire, 7.4004, -7.5500 Sete Lagoas, Brazil, -19.4658, -44.2469 Banchpar, Bangladesh, 23.2081, 90.7979 Sakaka, Saudi Arabia, 29.9697, 40.2000 Haeju, Korea, North, 38.0333, 125.7167 Taganrog, Russia, 47.2167, 38.9167 Hai Duong, Vietnam, 20.9397, 106.3306 Masaurhi Buzurg, India, 25.3500, 85.0200 Gelemso, Ethiopia, 8.8167, 40.5167 Alleppey, India, 9.4900, 76.3300 Paramaribo, Suriname, 5.8522, -55.2039 Baruta, Venezuela, 10.4322, -66.8739 Marilia, Brazil, -22.2139, -49.9458 Katihar, India, 25.5300, 87.5800 Tarapoto, Peru, -6.4833, -76.3667 Nizhnekamsk, Russia, 55.6333, 51.8167 Atushi, China, 39.7162, 76.1684 Abi al Khasib, Iraq, 30.4464, 47.9781 Jacarei, Brazil, -23.3050, -45.9658 Anju, Korea, North, 39.6200, 125.6600 Magdeburg, Germany, 52.1317, 11.6392 Andimeshk, Iran, 32.4714, 48.3489 Bunkyo-ku, Japan, 35.7167, 139.7500 Blagoveshchensk, Russia, 50.2500, 127.5333 Horlivka, Ukraine, 48.3000, 38.0500 Ahor, India, 25.3670, 72.7830 Yato, Japan, 35.4833, 139.4500 Matsumoto, Japan, 36.2380, 137.9720 Chimoio, Mozambique, -19.1167, 33.4500 Lille, France, 50.6278, 3.0583 Kasulu, Tanzania, -4.5800, 30.1000 Ivano-Frankivsk, Ukraine, 48.9228, 24.7106 Chofugaoka, Japan, 35.6506, 139.5407 Gonzalez Catan, Argentina, -34.7667, -58.6167 Wuyishan, China, 27.7564, 118.0353 Shenmu, China, 38.8244, 110.4831 Ganganagar, India, 29.9200, 73.8800 Brasov, Romania, 45.6667, 25.6167 Amol, Iran, 36.4703, 52.3467 Freiburg im Breisgau, Germany, 47.9950, 7.8500 Monclova, Mexico, 26.9103, -101.4222 Chishui, China, 28.5904, 105.6975 Djougou, Benin, 9.7000, 1.6667 Mirpur Khas, Pakistan, 25.5250, 69.0158 P'yongsong-si, Korea, North, 39.2605, 125.8618 North Hempstead, United States, 40.7912, -73.6688 Centurion, South Africa, -25.8603, 28.1894 Tinkhang, India, 27.2300, 95.1700 Rewa, India, 24.5381, 81.2953 Usak, Turkey, 38.6778, 29.4042 Lyubertsy, Russia, 55.6783, 37.8944 Pakdasht, Iran, 35.4828, 51.6814 Kajang, Malaysia, 2.9927, 101.7909 Petah Tiqwa, Israel, 32.0833, 34.8833 Abha, Saudi Arabia, 18.2167, 42.5000 Al Minya, Egypt, 28.0833, 30.7500 Iseyin, Nigeria, 7.9667, 3.6000 Central District, Hong Kong, 22.2867, 114.1550 Gaborone, Botswana, -24.6569, 25.9086 Zinder, Niger, 13.8014, 8.9849 Bole, China, 44.8539, 82.0514 Aguadilla, Puerto Rico, 18.4382, -67.1537 Komsomol'sk-na-Amure, Russia, 50.5667, 137.0000 Ganda, Angola, -13.0167, 14.6333 Arlington, United States, 38.8786, -77.1011 Uluberiya, India, 22.4700, 88.1100 Bulandshahr, India, 28.4069, 77.8497 Banda Aceh, Indonesia, 5.5500, 95.3175 Najafabad, Iran, 32.6331, 51.3650 Shibuya-ku, Japan, 35.6594, 139.7006 Ba Ria, Vietnam, 10.4992, 107.1675 Bayamo, Cuba, 20.3795, -76.6433 Limassol, Cyprus, 34.6747, 33.0442 Norfolk, United States, 36.8945, -76.2590 Georgetown, Guyana, 6.8011, -58.1550 Borujerd, Iran, 33.9111, 48.7522 Ibb, Yemen, 13.9759, 44.1709 Appleton, United States, 44.2780, -88.3892 Garcia, Mexico, 25.8167, -100.5833 Arapiraca, Brazil, -9.7525, -36.6611 Longquan, China, 28.0667, 119.1333 Hoa Binh, Vietnam, 20.8133, 105.3383 Miri, Malaysia, 4.3999, 113.9845 Maracanau, Brazil, -3.8769, -38.6258 Oral, Kazakhstan, 51.2225, 51.3725 Craiova, Romania, 44.3333, 23.8167 Raichur, India, 16.2000, 77.3700 Formosa, Argentina, -26.1833, -58.1833 Purwokerto, Indonesia, -7.4278, 109.2417 Chauhanpatti, India, 25.1500, 82.6000 Bo, Sierra Leone, 7.9564, -11.7400 Mambere, Central African Republic, 5.5000, 15.5000 Damboa, Nigeria, 11.1500, 12.7500 Groningen, Netherlands, 53.2167, 6.5667 Anyang, Korea, South, 37.3833, 126.9333 Ipswich, Australia, -27.6144, 152.7608 Teluk Intan, Malaysia, 4.0119, 101.0314 Mbour, Senegal, 14.4104, -16.9649 San Cristobal, Dominican Republic, 18.4167, -70.1333 Granada, Spain, 37.1781, -3.6008 Gravatai, Brazil, -29.9433, -50.9939 Cannanore, India, 11.8745, 75.3704 Singida, Tanzania, -4.8167, 34.7500 Kigoma, Tanzania, -4.8833, 29.6333 Okara, Pakistan, 30.8092, 73.4536 Saga, Japan, 33.2636, 130.3008 Lin'an, China, 23.6025, 102.8309 Enterprise, United States, 36.0091, -115.2278 Beni, Congo (Kinshasa), 0.5000, 29.4667 Machilipatnam, India, 16.1700, 81.1300 Nazipur, Bangladesh, 25.0455, 88.7609 Porto, Portugal, 41.1495, -8.6108 Gulfport, United States, 30.4274, -89.0704 Biyala, Egypt, 31.1742, 31.2218 Lafayette, United States, 30.2082, -92.0325 Madan, Iran, 30.3469, 48.2825 Huangjingkeng, China, 22.9173, 113.9958 Rancagua, Chile, -34.1667, -70.7500 Phu Yen, Vietnam, 21.4156, 105.8739 Divinopolis, Brazil, -20.1389, -44.8839 Qarchak, Iran, 35.4267, 51.5842 Ormoc, Philippines, 11.0106, 124.6075 Yoshiicho-shimobaru, Japan, 33.1800, 129.7150 Fresnillo, Mexico, 23.1750, -102.8675 Turkmenabat, Turkmenistan, 39.0833, 63.5667 Son Tay, Vietnam, 21.1333, 105.5000 Singkawang, Indonesia, 0.9000, 108.9833 Zegoua, Mali, 10.4519, -5.6511 Marka, Somalia, 1.7156, 44.7703 Barishal, Bangladesh, 22.7000, 90.3667 Kulai, Malaysia, 1.6561, 103.6032 Pali, India, 25.7700, 73.3300 Songadh, India, 21.1670, 73.5640 Gadda Madiral, India, 18.7519, 79.5133 Hosur, India, 12.7409, 77.8253 Ordu, Turkey, 40.9833, 37.8833 Kosice, Slovakia, 48.7167, 21.2500 Kasukabe, Japan, 35.9753, 139.7523 Bojnurd, Iran, 37.4722, 57.3289 Envigado, Colombia, 6.1667, -75.5667 Haridwar, India, 29.9450, 78.1630 Vizianagaram, India, 18.1159, 83.4060 Tarrasa, Spain, 41.5700, 2.0130 Suzano, Brazil, -23.5428, -46.3108 Coban, Guatemala, 15.4833, -90.3667 Bremerton, United States, 47.5436, -122.7121 Khenifra, Morocco, 32.9394, -5.6675 Krefeld, Germany, 51.3333, 6.5667 Fremont, United States, 37.5265, -121.9843 Guantanamo, Cuba, 20.1383, -75.2061 Sabya, Saudi Arabia, 17.1495, 42.6254 Pathardi, India, 19.1700, 75.1800 Mage, Brazil, -22.6528, -43.0408 Neya, Japan, 34.7667, 135.6333 Mel Palaiyam, India, 8.7000, 77.7069 Tripoli, Lebanon, 34.4367, 35.8344 Rennes, France, 48.1147, -1.6794 Ipatinga, Brazil, -19.4678, -42.5369 Saqultah, Egypt, 26.6582, 31.6714 Green Bay, United States, 44.5148, -87.9895 Choloma, Honduras, 15.6127, -87.9507 Khatima, India, 28.9198, 79.9699 Badalona, Spain, 41.4489, 2.2461 Petlad, India, 22.4700, 72.8000 Kamianske, Ukraine, 48.5167, 34.6133 Ageoshimo, Japan, 35.9774, 139.5932 Changhua, Taiwan, 24.0667, 120.5333 Regina, Canada, 50.4547, -104.6067 Ca Mau, Vietnam, 9.1833, 105.1500 Korolev, Russia, 55.9167, 37.8167 Tieli, China, 46.9500, 128.0500 Dianbu, China, 31.8883, 117.4608 Kolpino, Russia, 59.7333, 30.6000 Chilpancingo, Mexico, 17.5500, -99.5000 Rio Verde, Brazil, -17.7978, -50.9278 Meycauayan, Philippines, 14.7300, 120.9500 Presidente Prudente, Brazil, -22.1258, -51.3889 Varamin, Iran, 35.3503, 51.6364 Padangsidempuan, Indonesia, 1.3786, 99.2722 Uacu Cungo, Angola, -11.3583, 15.1194 Pudukkottai, India, 10.3833, 78.8001 Hunchun, China, 42.8630, 130.3660 Nadiad, India, 22.6900, 72.8600 Toamasina, Madagascar, -18.1550, 49.4100 Fargo, United States, 46.8651, -96.8292 Ternopil, Ukraine, 49.5667, 25.6000 Mutare, Zimbabwe, -18.9667, 32.6333 Chuadanga, Bangladesh, 23.6418, 88.8577 Carlos Manuel de Cespedes, Cuba, 21.5767, -78.2775 Nong'an, China, 44.4347, 125.1750 Ota, Japan, 36.2911, 139.3754 Deltona, United States, 28.9050, -81.2137 Itaborai, Brazil, -22.7475, -42.8558 Puerto Vallarta, Mexico, 20.6458, -105.2222 Capiata, Paraguay, -25.3538, -57.4426 Viamao, Brazil, -30.0808, -51.0228 Chapeco, Brazil, -27.0958, -52.6178 Banfield, Argentina, -34.7500, -58.3833 Atsugicho, Japan, 35.4333, 139.3667 Cox's Bazar, Bangladesh, 21.4539, 91.9677 Bandar-e Bushehr, Iran, 28.9264, 50.8514 Tanjung Morawa, Indonesia, 3.5167, 98.7833 Brownsville, United States, 25.9975, -97.4580 Itapevi, Brazil, -23.5489, -46.9342 Probolinggo, Indonesia, -7.7500, 113.2167 Tanjore, India, 10.7870, 79.1378 Mainz, Germany, 49.9994, 8.2736 Hachinohe, Japan, 40.5123, 141.4884 Barra do Dande, Angola, -8.4728, 13.3731 Mezitli, Turkey, 36.7500, 34.5333 Sandton, South Africa, -26.1070, 28.0517 Velikiy Novgorod, Russia, 58.5500, 31.2667 Cork, Ireland, 51.9000, -8.4731 Dili, Timor-Leste, -8.5594, 125.5795 Tyrnavos, Greece, 39.7333, 22.2833 Owo, Nigeria, 7.1961, 5.5864 Swindon, United Kingdom, 51.5600, -1.7800 Ciputat, Indonesia, -6.3111, 106.7619 Sabadell, Spain, 41.5486, 2.1075 Myeik, Burma, 12.4333, 98.6000 Kichha, India, 28.9200, 79.5000 Hialeah, United States, 25.8696, -80.3045 Longjiang, China, 22.8853, 113.0758 Katri, India, 23.4800, 80.4000 Takarazuka, Japan, 34.8114, 135.3406 San Bernardino, United States, 34.1416, -117.2943 Saricam, Turkey, 37.0333, 35.4167 Gueckedou, Guinea, 8.5667, -10.1333 Neyshabur, Iran, 36.2200, 58.8200 Xiqiao, China, 22.9409, 112.9819 Ibb, Yemen, 13.9667, 44.1667 Soc Trang, Vietnam, 9.6028, 105.9736 Dagarua, India, 25.8000, 87.6400 Tchaourou, Benin, 8.8833, 2.6000 Lutsk, Ukraine, 50.7500, 25.3358 Duekoue, Côte d’Ivoire, 6.7419, -7.3492 Sambhal, India, 28.5800, 78.5500 Shakhty, Russia, 47.7000, 40.2333 San Felipe, Venezuela, 10.3406, -68.7369 Saveh, Iran, 35.0278, 50.3611 Oviedo, Spain, 43.3600, -5.8450 Tacoma, United States, 47.2431, -122.4531 Santa Luzia, Brazil, -19.7697, -43.8514 Chi Linh, Vietnam, 21.1330, 106.3830 La Vega, Dominican Republic, 19.2200, -70.5300 Singrauliya, India, 24.2020, 82.6660 El Jadid, Morocco, 33.2333, -8.5000 Ashdod, Israel, 31.7978, 34.6503 Prizren, Kosovo, 42.2139, 20.7397 Bratsk, Russia, 56.1167, 101.6000 Thatta, Pakistan, 24.7461, 67.9244 Gainesville, United States, 29.6804, -82.3459 Spring Valley, United States, 36.0952, -115.2636 Cartagena, Spain, 37.6019, -0.9842 Yenisehir, Turkey, 37.9333, 40.2333 Al Khubar, Saudi Arabia, 26.3000, 50.2167 Kropyvnytskyi, Ukraine, 48.5000, 32.2667 Osisioma, Nigeria, 5.1497, 7.3303 Tulua, Colombia, 4.0833, -76.2000 Lubeck, Germany, 53.8697, 10.6864 Zanzibar, Tanzania, -6.1650, 39.1990 Konibodom, Tajikistan, 40.2833, 70.4167 Kafue, Zambia, -15.7667, 28.1833 Messina, Italy, 38.1936, 15.5542 Pangkalpinang, Indonesia, -2.1333, 106.1167 Petrolina, Brazil, -9.3928, -40.5078 Bitung, Indonesia, 1.4472, 125.1978 Santo Tomas, Philippines, 14.0800, 121.1800 Clarksville, United States, 36.5692, -87.3413 Naihati, India, 22.8900, 88.4200 Arakawa, Japan, 35.7333, 139.7833 Babylon, United States, 40.6925, -73.3586 Galati, Romania, 45.4233, 28.0425 Jaynagar, India, 26.5925, 86.1372 Laayoune, Morocco, 27.1500, -13.1989 Tapachula, Mexico, 14.9000, -92.2667 Angarsk, Russia, 52.5500, 103.9000 Apapa, Nigeria, 6.4500, 3.3667 Netanya, Israel, 32.3286, 34.8567 Silivri, Turkey, 41.0736, 28.2478 Qostanay, Kazakhstan, 53.2000, 63.6200 Staryy Oskol, Russia, 51.2967, 37.8350 Alor Setar, Malaysia, 6.1133, 100.3729 Wayaobu, China, 37.1427, 109.6752 Zielona Gora, Poland, 51.9333, 15.5000 Jose C. Paz, Argentina, -34.5167, -58.7667 Yamunanagar, India, 30.1330, 77.2880 Banjarbaru, Indonesia, -3.4425, 114.8325 Valencia, Philippines, 7.9042, 125.0928 Ayacucho, Peru, -13.1631, -74.2244 Wellington, New Zealand, -41.2889, 174.7772 Penalolen, Chile, -33.4833, -70.5500 Dongxing, China, 21.5478, 107.9717 Ar Ruseris, Sudan, 11.8633, 34.3877 Hortolandia, Brazil, -22.8583, -47.2200 College Station, United States, 30.5852, -96.2959 Olympia, United States, 47.0417, -122.8959 Pallavaram, India, 12.9675, 80.1491 Jiutepec, Mexico, 18.8833, -99.1667 Kremenchuk, Ukraine, 49.0631, 33.4039 Dzerzhinsk, Russia, 56.2333, 43.4500 Tan An, Vietnam, 10.5333, 106.4167 Golmud, China, 36.4072, 94.9283 San Rafael, Argentina, -34.6000, -68.3333 Sidi Aissa, Algeria, 36.5000, 4.2978 Khargone, India, 21.8200, 75.6187 As Samawah, Iraq, 31.3167, 45.2833 Matrah, Oman, 23.6167, 58.5667 Comalcalco, Mexico, 18.2801, -93.2018 Oulu, Finland, 65.0142, 25.4719 Almere, Netherlands, 52.3667, 5.2167 Kulob, Tajikistan, 37.9092, 69.7819 Sa Dec, Vietnam, 10.3000, 105.7667 Mokpo, Korea, South, 34.7589, 126.3800 Al Ghardaqah, Egypt, 27.2578, 33.8117 Warnes, Bolivia, -17.5167, -63.1667 Cascais, Portugal, 38.6972, -9.4217 Cigli, Turkey, 38.4833, 27.0500 Marcory, Côte d’Ivoire, 5.3120, -3.9936 Roanoke, United States, 37.2785, -79.9581 Chilas, Pakistan, 35.4194, 74.0944 Sikasso, Mali, 11.3167, -5.6667 Bouafle, Côte d’Ivoire, 6.9903, -5.7442 Osan, Korea, South, 37.1498, 127.0771 Oakville, Canada, 43.4500, -79.6833 Secunderabad, India, 17.4399, 78.4983 Jerez de la Frontera, Spain, 36.6817, -6.1378 Portland, United States, 43.6773, -70.2715 El Tigre, Venezuela, 8.8861, -64.2611 Isesaki, Japan, 36.3114, 139.1968 Norwich, United Kingdom, 52.6286, 1.2928 Czestochowa, Poland, 50.8000, 19.1167 Monghyr, India, 25.3810, 86.4650 Luton, United Kingdom, 51.8783, -0.4147 Chapra, India, 25.7848, 84.7274 Sidi Bel Abbes, Algeria, 35.1939, -0.6414 Jinshi, China, 29.5000, 111.9080 Zhubei, Taiwan, 24.8333, 121.0119 Tumaco, Colombia, 1.8067, -78.7647 Trondheim, Norway, 63.4400, 10.4000 Mallawi, Egypt, 27.7306, 30.8425 Kure, Japan, 34.2492, 132.5658 Kuje, Nigeria, 8.8822, 7.2203 Bhadravati, India, 13.8485, 75.7050 `Aqrah, Iraq, 36.7604, 43.8943 Linz, Austria, 48.3058, 14.2864 Fontana, United States, 34.0968, -117.4599 Cao Lanh, Vietnam, 10.4672, 105.6303 Nagareyama, Japan, 35.8563, 139.9029 Xujing, China, 31.1731, 121.2723 Xigujing, China, 31.2988, 121.1742 Taito, Japan, 35.7125, 139.7800 Irakleio, Greece, 35.3403, 25.1344 Criciuma, Brazil, -28.6775, -49.3697 Panchkula, India, 30.7400, 76.8000 Oberhausen, Germany, 51.4967, 6.8706 Mirpur Bhtoro, Pakistan, 24.7300, 68.2500 Burhanpur, India, 21.3114, 76.2289 Ait Melloul, Morocco, 30.3342, -9.4972 Rostock, Germany, 54.0833, 12.1333 Gujiao, China, 37.9070, 112.1760 Sobral, Brazil, -3.6861, -40.3497 Trece Martires City, Philippines, 14.2800, 120.8700 Gangneung, Korea, South, 37.7500, 128.9000 Pagadian, Philippines, 7.8272, 123.4364 Quilicura, Chile, -33.3667, -70.7333 Spartanburg, United States, 34.9442, -81.9251 Moreno Valley, United States, 33.9244, -117.2045 Kairouan, Tunisia, 35.6772, 10.1008 Burgas, Bulgaria, 42.5030, 27.4702 Frisco, United States, 33.1560, -96.8216 Arroyo Naranjo, Cuba, 23.0436, -82.3328 Bukit Mertajam, Malaysia, 5.3630, 100.4667 Richmond, Canada, 49.1667, -123.1333 Kapra, India, 17.4859, 78.5651 Burutu, Nigeria, 5.3500, 5.5167 Mostoles, Spain, 40.3333, -3.8667 Beni Mellal, Morocco, 32.3394, -6.3608 Legazpi City, Philippines, 13.1300, 123.7300 Yonkers, United States, 40.9466, -73.8673 Thingangyun, Burma, 16.8281, 96.1842 Panabo, Philippines, 7.3000, 125.6800 Cikupa, Indonesia, -6.4947, 106.6511 Puerto Cabello, Venezuela, 10.4667, -68.0167 Ich'on, Korea, South, 37.2667, 127.4333 Beersheba, Israel, 31.2522, 34.7867 Nowgong, India, 26.3504, 92.6796 Santo Agostinho, Brazil, -8.2900, -35.0300 Taisheng, China, 23.2939, 113.3531 Sunyani, Ghana, 7.3360, -2.3360 Thousand Oaks, United States, 34.1914, -118.8756 Lubuklinggau, Indonesia, -3.2967, 102.8617 Ashaiman, Ghana, 5.6995, -0.0348 Phan Rang-Thap Cham, Vietnam, 11.5667, 108.9833 Ambala, India, 30.3800, 76.7800 Zamora, Mexico, 19.9833, -102.2833 Torbali, Turkey, 38.1619, 27.3583 Chungju, Korea, South, 36.9667, 127.9500 Kasangati, Uganda, 0.4378, 32.6025 Sioux Falls, United States, 43.5396, -96.7311 Pamplona, Spain, 42.8167, -1.6500 Quetzaltenango, Guatemala, 14.8333, -91.5167 Kharagpur, India, 22.3302, 87.3237 Farshut, Egypt, 26.0550, 32.1627 Monywa, Burma, 22.1083, 95.1417 Nishitokyo, Japan, 35.7256, 139.5383 Babruysk, Belarus, 53.1500, 29.2333 Robertsonpet, India, 12.9563, 78.2754 Dindigul, India, 10.3500, 77.9500 Viransehir, Turkey, 37.2306, 39.7653 Toledo, Philippines, 10.3800, 123.6500 Bila Tserkva, Ukraine, 49.7989, 30.1153 Marawi City, Philippines, 8.0031, 124.2850 Hagerstown, United States, 39.6401, -77.7217 Raniwara Kalan, India, 24.7500, 72.2167 Cerkezkoy, Turkey, 41.2889, 28.0042 Solihull, United Kingdom, 52.4130, -1.7780 Parakou, Benin, 9.3500, 2.6167 Bakaga, Benin, 9.3500, 2.6167 Damietta, Egypt, 31.4167, 31.8214 Shimla, India, 31.1033, 77.1722 Padova, Italy, 45.4064, 11.8778 Cidade de Nacala, Mozambique, -14.5500, 40.6833 Evansville, United States, 37.9881, -87.5341 Dinajpur, Bangladesh, 25.6300, 88.6500 Hospet, India, 15.2689, 76.3909 Islington, United Kingdom, 51.5440, -0.1027 Talca, Chile, -35.4269, -71.6656 Diaobingshancun, China, 42.4667, 123.5667 Ifakara, Tanzania, -8.1000, 36.6833 Northcote, New Zealand, -36.8019, 174.7494 Maldah, India, 25.0044, 88.1458 San Carlos City, Philippines, 15.9281, 120.3489 Jiutai, China, 44.1447, 125.8443 Phan Thiet, Vietnam, 10.9333, 108.1000 Khan Yunis, Gaza Strip, 31.3402, 34.3063 Huayin, China, 34.5833, 110.1000 Amarillo, United States, 35.1984, -101.8316 Ongole, India, 15.5060, 80.0490 Cordoba, Mexico, 18.8942, -96.9347 Brahmanpara, Bangladesh, 23.6165, 91.0679 Kassel, Germany, 51.3158, 9.4979 Biskra, Algeria, 34.8500, 5.7333 Bingerville, Côte d’Ivoire, 5.3500, -3.9000 Kalamazoo, United States, 42.2749, -85.5882 Mpanda, Tanzania, -6.3500, 31.0667 Charleroi, Belgium, 50.4167, 4.4442 Sao Jose dos Pinhais, Brazil, -25.5350, -49.2058 Ternate, Indonesia, 0.7800, 127.3819 Sejong, Korea, South, 36.4870, 127.2822 Coquimbo, Chile, -29.9531, -71.3433 Luzhang, China, 25.8226, 98.8577 Kukawa, Nigeria, 12.9167, 13.5667 Geneva, Switzerland, 46.2017, 6.1469 Lorain, United States, 41.4409, -82.1840 Ellore, India, 16.7117, 81.1031 Da Lat, Vietnam, 11.9417, 108.4383 Huntington, United States, 40.8521, -73.3823 Kinh Mon, Vietnam, 21.0330, 106.5000 Birjand, Iran, 32.8781, 59.2161 Santa Ana, Philippines, 14.5800, 121.0120 La Guaira, Venezuela, 10.6000, -66.9331 Loja, Ecuador, -3.9833, -79.2000 Mandi Burewala, Pakistan, 30.1592, 72.6817 Banjar, Indonesia, -7.3695, 108.5414 Acarigua, Venezuela, 9.5597, -69.2019 Deoghar, India, 24.4800, 86.7000 Tanjungpinang, Indonesia, 0.9188, 104.4554 Phu Tu Son, Vietnam, 21.1189, 105.9611 Galveston, United States, 29.2484, -94.8913 Cabo San Lucas, Mexico, 22.8897, -109.9156 El Tezal, Mexico, 22.8897, -109.9156 Chhindwara, India, 22.0570, 78.9396 Almeria, Spain, 36.8417, -2.4639 Madiun, Indonesia, -7.6300, 111.5231 Iringa, Tanzania, -7.7700, 35.6900 Mokameh, India, 25.3898, 85.9191 McKinney, United States, 33.2016, -96.6670 Turku, Finland, 60.4517, 22.2669 Luxor, Egypt, 25.6967, 32.6444 Jizzax, Uzbekistan, 40.1158, 67.8422 Arica, Chile, -18.4784, -70.3212 Las Tunas, Cuba, 20.9667, -76.9500 Qal`at Bishah, Saudi Arabia, 20.0087, 42.5987 Richmond Hill, Canada, 43.8667, -79.4333 Timayy al Imdid, Egypt, 30.9438, 31.5293 Al Khums, Libya, 32.6497, 14.2644 Matsue, Japan, 35.4681, 133.0486 Debrecen, Hungary, 47.5300, 21.6392 Tarakan, Indonesia, 3.3000, 117.6333 Loures, Portugal, 38.8309, -9.1684 Radom, Poland, 51.4036, 21.1567 Petropavl, Kazakhstan, 54.8833, 69.1667 Rio Claro, Brazil, -22.4108, -47.5608 Maroua, Cameroon, 10.5971, 14.3157 Cajamarca, Peru, -7.1575, -78.5175 Comodoro Rivadavia, Argentina, -45.8647, -67.4808 Huntington, United States, 38.4109, -82.4345 Qina, Egypt, 26.1667, 32.7167 Mai'Adua, Nigeria, 13.1906, 8.2117 Moshi, Tanzania, -3.3349, 37.3404 Dasoguz, Turkmenistan, 41.8333, 59.9667 Nampa, United States, 43.5844, -116.5638 Hebron, West Bank, 31.5293, 35.0938 Puri, India, 19.8106, 85.8314 Sidfa, Egypt, 26.9664, 31.3795 Soio, Angola, -6.1333, 12.3667 Menemen, Turkey, 38.6000, 27.0667 Haldia, India, 22.0667, 88.0698 Jacobabad, Pakistan, 28.2769, 68.4514 Khandwa, India, 21.8200, 76.3500 Aberdeen, United Kingdom, 57.1500, -2.1100 Huacho, Peru, -11.1067, -77.6050 Yachiyo, Japan, 35.7224, 140.0999 Nandyal, India, 15.4800, 78.4800 Hickory, United States, 35.7410, -81.3223 Morena, India, 26.5000, 78.0000 Guatire, Venezuela, 10.4717, -66.5406 Guarenas, Venezuela, 10.4667, -66.6167 Nasim Shahr, Iran, 35.5617, 51.1617 Bouskoura, Morocco, 33.4489, -7.6486 Kabankalan, Philippines, 9.9800, 122.8200 Aracatuba, Brazil, -21.2089, -50.4328 Vinh Long, Vietnam, 10.2500, 105.9667 Lang Son, Vietnam, 21.8478, 106.7578 Rio Cuarto, Argentina, -33.1333, -64.3500 Lochau, Austria, 47.5167, 9.7500 Karjat, India, 18.5500, 75.0000 Kasba Pataspur, India, 22.0216, 87.5423 At Taji, Iraq, 33.5294, 44.2775 Khorramabad, Iran, 33.4875, 48.3561 Kakuma, Kenya, 3.7167, 34.8667 Az Zawiyah, Libya, 32.7522, 12.7278 Isanlu, Nigeria, 8.1667, 5.8000 Waterbury, United States, 41.5582, -73.0361 Merida, Venezuela, 8.4800, -71.1900 Lahad Datu, Malaysia, 5.0464, 118.3360 Concordia, Argentina, -31.4000, -58.0333 Drabar, India, 33.4300, 75.0900 Sunrise Manor, United States, 36.1783, -115.0487 Pristina, Kosovo, 42.6666, 21.1724 Uripa, Colombia, 11.9167, -72.0000 Khowy, Iran, 38.5464, 44.9542 Gbadolite, Congo (Kinshasa), 4.2833, 21.0167 Laqtah, Qatar, 25.4175, 51.5075 Grand Prairie, United States, 32.6871, -97.0208 Apopa, El Salvador, 13.8000, -89.1833 Amroha, India, 28.9044, 78.4675 Lunga-Lunga, Kenya, -4.5500, 39.1200 Trieste, Italy, 45.6503, 13.7703 Torun, Poland, 53.0222, 18.6111 Martapura, Indonesia, -3.4500, 114.8333 Rani, India, 9.3667, 76.7667 Kankan, Guinea, 10.3833, -9.3000 Chakradharpur, India, 22.7000, 85.6300 Ocala, United States, 29.1780, -82.1511 Segamat, Malaysia, 2.5148, 102.8158 Bhiwani, India, 28.7800, 76.1300 Waco, United States, 31.5599, -97.1882 Bhind, India, 26.5647, 78.7864 Hobart, Australia, -42.8806, 147.3250 Baure, Nigeria, 12.7833, 8.7667 Higashi-Hiroshima, Japan, 34.4264, 132.7433 La Ceiba, Honduras, 15.7833, -86.7918 Ciudad Madero, Mexico, 22.2475, -97.8375 Itami, Japan, 34.7833, 135.4000 Overland Park, United States, 38.8870, -94.6870 Sawangan, Indonesia, -6.4086, 106.7647 Bamiantong, China, 44.9167, 130.5167 Zakhu, Iraq, 37.1436, 42.6819 Kodaira, Japan, 35.7285, 139.4774 Rajin, Korea, North, 42.3444, 130.3844 Alcala de Henares, Spain, 40.4667, -3.3667 Parma, Italy, 44.8015, 10.3280 Frederick, United States, 39.4337, -77.4141 Huanuco, Peru, -9.9295, -76.2397 San Lorenzo, Argentina, -32.7500, -60.7333 Kusong, Korea, North, 39.9667, 125.1667 Brescia, Italy, 45.5389, 10.2203 Zipaquira, Colombia, 5.0333, -74.0000 Khammam, India, 17.2473, 80.1514 Madhyamgram, India, 22.7000, 88.4500 Huntington Beach, United States, 33.6960, -118.0018 Kajo Kaji, South Sudan, 3.8863, 31.6670 Kouribga, Morocco, 32.8833, -6.9167 Ghandinagar, India, 23.2231, 72.6500 Rzeszow, Poland, 50.0333, 22.0000 Prato, Italy, 43.8808, 11.0966 Myawadi, Burma, 16.6878, 98.5083 Mwene-Ditu, Congo (Kinshasa), -7.0000, 23.4500 Dongning, China, 44.1167, 130.8167 Koronadal, Philippines, 6.5000, 124.8500 La Serena, Chile, -29.9000, -71.2500 Maharagama, Sri Lanka, 6.8480, 79.9265 San Pedro de Macoris, Dominican Republic, 18.4572, -69.3061 Liege, Belgium, 50.6397, 5.5706 Suzuka, Japan, 34.8820, 136.5842 Beichengqu, China, 40.4370, 113.1100 Coro, Venezuela, 11.4170, -69.6700 Baharampur, India, 24.1000, 88.2500 Tchitato, Angola, -7.3667, 20.8333 Malema, Mozambique, -14.9486, 37.4144 Mbarara, Uganda, -0.6133, 30.6583 Santa Barbara, United States, 34.4285, -119.7202 Morbi, India, 22.8200, 70.8300 Cuautla, Mexico, 18.8167, -98.9500 Guanajuato, Mexico, 21.0178, -101.2567 Tebessa, Algeria, 35.4000, 8.1167 Kamirenjaku, Japan, 35.6836, 139.5595 Mohammedia, Morocco, 33.6833, -7.3833 Peoria, United States, 33.7843, -112.2989 Holon, Israel, 32.0167, 34.7667 Duzce, Turkey, 40.8417, 31.1583 Leganes, Spain, 40.3281, -3.7644 Peterborough, United Kingdom, 52.5661, -0.2364 Tanauan, Philippines, 14.0800, 121.1500 Suhaj, Egypt, 26.5606, 31.6917 Bene Beraq, Israel, 32.0807, 34.8338 Sosnowiec, Poland, 50.2833, 19.1333 Pingtung, Taiwan, 22.6761, 120.4942 Cholula de Rivadabia, Mexico, 19.0633, -98.3064 Sao Leopoldo, Brazil, -29.7600, -51.1469 Bukan, Iran, 36.5150, 46.2075 Kokshetau, Kazakhstan, 53.2833, 69.3833 Anseong, Korea, South, 37.0078, 127.2797 Fatehpur, India, 25.9300, 80.8000 Kumagaya, Japan, 36.1474, 139.3886 Krasnogorsk, Russia, 55.8217, 37.3386 Bani Suwayf, Egypt, 29.0667, 31.0833 Quelimane, Mozambique, -17.8764, 36.8872 Cedar Rapids, United States, 41.9662, -91.6783 Vancouver, United States, 45.6366, -122.5967 Hyesan, Korea, North, 41.4000, 128.1833 Jalapa, Guatemala, 14.6333, -89.9833 Kaesong, Korea, North, 37.9667, 126.5500 Nossa Senhora do Socorro, Brazil, -10.8550, -37.1258 Glendale, United States, 34.1819, -118.2468 Croydon, United Kingdom, 51.3727, -0.1099 Rio Grande, Brazil, -32.0350, -52.0989 Gorontalo, Indonesia, 0.5422, 123.0614 Florencia, Colombia, 1.6139, -75.6128 Fianarantsoa, Madagascar, -21.4333, 47.0833 Tsing Yi Town, Hong Kong, 22.3456, 114.1000 Yamaguchi, Japan, 34.1781, 131.4739 Iwo, Nigeria, 7.6333, 4.1833 Rae Bareli, India, 26.2236, 81.2403 Angren, Uzbekistan, 41.0167, 70.1436 Godoy Cruz, Argentina, -32.9167, -68.8333 Ciudad del Carmen, Mexico, 18.6333, -91.8333 Bago, Philippines, 10.5388, 122.8384 Valera, Venezuela, 9.3200, -70.6200 Ouargla, Algeria, 31.9500, 5.3167 Manzanillo, Mexico, 19.0522, -104.3158 Fuenlabrada, Spain, 40.2833, -3.8000 Malaybalay, Philippines, 8.1564, 125.1333 Isidro Casanova, Argentina, -34.7000, -58.5833 Chibia, Angola, -15.1833, 13.7000 Hino, Japan, 35.6713, 139.3951 Orai, India, 25.9800, 79.4700 Hagen, Germany, 51.3667, 7.4833 Shahr-e Kord, Iran, 32.3322, 50.8564 Jhelum, Pakistan, 32.9425, 73.7256 Ingabu, Burma, 17.8167, 95.2667 Mahbubnagar, India, 16.7488, 78.0035 Pabna, Bangladesh, 24.0004, 89.2500 Pak Kret, Thailand, 13.9125, 100.4978 Cam Pha, Vietnam, 21.0167, 107.3167 Batu, Indonesia, -7.8720, 112.5250 Taihe, China, 23.7413, 113.0076 Getafe, Spain, 40.3047, -3.7311 Saddiqabad, Pakistan, 28.3006, 70.1302 Ngaoundere, Cameroon, 7.3167, 13.5833 Gastonia, United States, 35.2494, -81.1854 Chongju, Korea, North, 39.6500, 125.3333 Poza Rica de Hidalgo, Mexico, 20.5333, -97.4500 Pskov, Russia, 57.8167, 28.3333 Murtazabad, India, 28.7111, 77.2688 Donostia, Spain, 43.3214, -1.9856 Las Heras, Argentina, -32.8500, -68.8167 Odawara, Japan, 35.2500, 139.1500 Abu Ghurayb, Iraq, 33.3056, 44.1848 Sokode, Togo, 8.9833, 1.1333 Anjomachi, Japan, 34.9587, 137.0803 Spring Hill, United States, 28.4798, -82.5300 Pinar del Rio, Cuba, 22.4122, -83.6719 Kenema, Sierra Leone, 7.8833, -11.1833 Balkanabat, Turkmenistan, 39.5167, 54.3667 Digos, Philippines, 6.7500, 125.3500 El Progreso, Honduras, 15.4009, -87.8120 Bhuj, India, 23.2500, 69.6700 Al Hasakah, Syria, 36.4833, 40.7500 San Francisco de Macoris, Dominican Republic, 19.3000, -70.2500 Taranto, Italy, 40.4711, 17.2431 Prabumulih, Indonesia, -3.4328, 104.2356 Kishiwada, Japan, 34.4667, 135.3667 Iquique, Chile, -20.2167, -70.1500 Dese, Ethiopia, 11.1333, 39.6333 Gharyan, Libya, 32.1697, 13.0167 Numazu, Japan, 35.0956, 138.8634 Murfreesboro, United States, 35.8490, -86.4121 Ratanpur, India, 23.0851, 72.5716 Orsk, Russia, 51.2000, 58.5667 Bournemouth, United Kingdom, 50.7200, -1.8800 Bhusaval, India, 21.0500, 75.7700 Tottori, Japan, 35.5000, 134.2333 Joetsu, Japan, 37.1479, 138.2361 San Diego, Venezuela, 10.2540, -68.0109 Kofu, Japan, 35.6621, 138.5682 Ucu Seles, Angola, -11.4047, 14.3006 Potsdam, Germany, 52.4006, 13.0592 Calbayog City, Philippines, 12.0700, 124.6000 Kirikkale, Turkey, 39.8417, 33.5139 Burlington, Canada, 43.3167, -79.8000 Kielce, Poland, 50.8742, 20.6333 Itabuna, Brazil, -14.7858, -39.2800 Klerksdorp, South Africa, -26.8667, 26.6667 Tekirdag, Turkey, 40.9778, 27.5153 Tempe, United States, 33.3881, -111.9319 Pasuruan, Indonesia, -7.6406, 112.9065 Bahraigh, India, 27.5750, 81.5940 Paradise, United States, 36.0872, -115.1355 Ed Damazin, Sudan, 11.7704, 34.3500 Basildon, United Kingdom, 51.5800, 0.4900 Plzen, Czechia, 49.7475, 13.3775 St. John's, Canada, 47.4817, -52.7971 Umreth, India, 22.6986, 73.1156 Dunhuang, China, 40.1411, 94.6639 Semnan, Iran, 35.5811, 53.3833 Narsingdi, Bangladesh, 23.9000, 90.7167 Temirtau, Kazakhstan, 50.0500, 72.9500 Banja Luka, Bosnia and Herzegovina, 44.7725, 17.1925 Ittikara, India, 8.8633, 76.6972 Yei, South Sudan, 4.0904, 30.6800 Mahesana, India, 23.6000, 72.4000 Kuchlagh, Pakistan, 31.0833, 67.1056 Newport News, United States, 37.1051, -76.5185 Ferraz de Vasconcelos, Brazil, -23.5411, -46.3689 Bolu, Turkey, 40.7347, 31.6075 Alasandigutta, India, 15.6244, 77.2731 `Unayzah, Saudi Arabia, 26.0860, 43.9970 Armavir, Russia, 45.0000, 41.1167 Erie, United States, 42.1167, -80.0733 Izuo, Japan, 34.4836, 135.4236 Seixal, Portugal, 38.6428, -9.1061 Al Qamishli, Syria, 37.0300, 41.2300 Padalarang, Indonesia, -6.8435, 107.4779 Modena, Italy, 44.6458, 10.9257 Breda, Netherlands, 51.5875, 4.7750 Toyokawa, Japan, 34.8268, 137.3759 Vinh Chau, Vietnam, 9.3330, 106.0000 Siguiri, Guinea, 11.4167, -9.1667 Biysk, Russia, 52.5333, 85.2167 Cuango, Angola, -9.1444, 18.0464 Raiganj, India, 25.6200, 88.1200 Saarbrucken, Germany, 49.2333, 7.0000 San Cristobal, Mexico, 16.7367, -92.6383 Fernando de la Mora, Paraguay, -25.3281, -57.5509 Trang Bang, Vietnam, 11.0330, 106.3670 Aqtau, Kazakhstan, 43.6525, 51.1575 Santa Barbara d'Oeste, Brazil, -22.7539, -47.4139 Colombo, Brazil, -25.2919, -49.2239 Batala, India, 31.8186, 75.2028 Saint Helens, United Kingdom, 53.4542, -2.7361 Nis, Serbia, 43.3192, 21.8961 Oradea, Romania, 47.0722, 21.9211 Tumpat, Malaysia, 6.1978, 102.1710 Fort Lauderdale, United States, 26.1412, -80.1464 Malumfashi, Nigeria, 11.8000, 7.6167 Isiro, Congo (Kinshasa), 2.7833, 27.6167 Termiz, Uzbekistan, 37.2167, 67.2833 Jaragua do Sul, Brazil, -26.4858, -49.0669 Palanpur, India, 24.1722, 72.4333 Sirsa, India, 29.5333, 75.0167 Donghua, China, 35.2167, 106.6000 Odense, Denmark, 55.4004, 10.3833 Noumea, New Caledonia, -22.2625, 166.4443 Dinapore, India, 25.6225, 85.0417 Sorsogon, Philippines, 12.9742, 124.0058 Gainesville, United States, 34.2902, -83.8294 Guarapuava, Brazil, -25.3950, -51.4578 Tambaram, India, 12.8310, 80.0459 Bethelsdorp, South Africa, -33.8833, 25.5000 Shrirampur, India, 22.7500, 88.3400 Balakovo, Russia, 52.0333, 47.7833 Abakan, Russia, 53.7167, 91.4667 Braga, Portugal, 41.5503, -8.4200 Epe, Nigeria, 6.5833, 3.9833 Kelowna, Canada, 49.8881, -119.4956 Fardis, Iran, 35.7300, 50.9822 Himatnagar, India, 23.6000, 72.9500 Kindia, Guinea, 10.0497, -12.8542 Tachikawa, Japan, 35.6942, 139.4197 Turbo, Colombia, 8.1000, -76.7333 La Rioja, Argentina, -29.4125, -66.8542 Guna, India, 24.6500, 77.3200 Toulon, France, 43.1258, 5.9306 Hamm, Germany, 51.6833, 7.8167 Singosari, Indonesia, -7.8925, 112.6658 Nawada, India, 24.8800, 85.5300 Cuauhtemoc, Mexico, 28.4050, -106.8667 Mukdahan, Thailand, 16.5431, 104.7228 Ploiesti, Romania, 44.9411, 26.0225 Inisa, Nigeria, 7.9833, 4.6500 Berazategui, Argentina, -34.7167, -58.2500 Funtua, Nigeria, 11.5204, 7.3200 Obuase, Ghana, 6.2000, -1.6833 Castellon de la Plana, Spain, 39.9831, -0.0331 Jaunpur, India, 25.7300, 82.6800 Mbanza Kongo, Angola, -6.2678, 14.2481 Geelong, Australia, -38.1500, 144.3500 Lhokseumawe, Indonesia, 5.1881, 97.1403 Mahad, India, 18.0830, 73.4170 Madanapalle, India, 13.5500, 78.5000 Palopo, Indonesia, -3.0000, 120.2000 Yuzhno-Sakhalinsk, Russia, 46.9667, 142.7333 Petarukan, Indonesia, -6.8961, 109.4514 Guri, Korea, South, 37.6000, 127.1500 Quang Yen, Vietnam, 20.9170, 106.8330 Edirne, Turkey, 41.6769, 26.5556 Longjin, China, 22.9525, 113.0065 Santander de Quilichao, Colombia, 3.0167, -76.4833 Wadlakonda, India, 17.7736, 79.5750 Bhachau, India, 23.2960, 70.3430 Kyaukpyu, Burma, 19.4264, 93.5458 Shivpuri, India, 25.4300, 77.6500 Caluquembe, Angola, -13.7833, 14.6833 Aurora, United States, 41.7638, -88.2902 Ussuriysk, Russia, 43.8000, 131.9667 Budhanilkantha, Nepal, 27.7758, 85.3619 Uji, Japan, 34.8844, 135.7997 Mongu, Zambia, -15.2775, 23.1319 Calabar, Nigeria, 4.9767, 8.3383 Dosquebradas, Colombia, 4.8333, -75.6833 Roxas City, Philippines, 11.5894, 122.7511 Masan, Korea, South, 35.1833, 128.5500 Purwakarta, Indonesia, -6.5533, 107.4472 Mauldin, United States, 34.7821, -82.3032 Satara, India, 17.6880, 74.0060 El Khroub, Algeria, 36.2667, 6.7000 Tiaret, Algeria, 35.3667, 1.3167 Cuautitlan, Mexico, 19.6833, -99.1833 Njeru, Uganda, 0.4311, 33.1478 Al `Arish, Egypt, 31.1249, 33.8006 Reims, France, 49.2628, 4.0347 Vada, India, 19.3900, 73.0800 Ontario, United States, 34.0393, -117.6064 Langsa, Indonesia, 4.4800, 97.9633 Phillaur, India, 31.0300, 75.7800 Korfez, Turkey, 40.7833, 29.7333 Guacara, Venezuela, 10.2536, -67.9000 Quevedo, Ecuador, -1.0333, -79.4500 Fethiye, Turkey, 36.6514, 29.1231 Kandi, Benin, 11.1286, 2.9369 Nijmegen, Netherlands, 51.8425, 5.8528 Unnao, India, 26.5500, 80.4900 Dundo, Angola, -7.3801, 20.8351 Meiktila, Burma, 20.8833, 95.8833 Akhisar, Turkey, 38.9239, 27.8400 Sitapur, India, 27.5700, 80.6600 La Pintana, Chile, -33.5833, -70.6333 Ambato, Ecuador, -1.2422, -78.6289 Almada, Portugal, 38.6803, -9.1583 Elk Grove, United States, 38.4161, -121.3842 Riobamba, Ecuador, -1.6731, -78.6483 Kalamboli, India, 19.2333, 73.1333 Panama City, United States, 30.1995, -85.6003 Ciudad Valles, Mexico, 21.9833, -99.0167 Norilsk, Russia, 69.3333, 88.2167 Cary, United States, 35.7819, -78.8195 San Luis Rio Colorado, Mexico, 32.4767, -114.7625 Saila, India, 25.3330, 72.3670 Curug, Indonesia, -6.3711, 106.8000 Al Muharraq, Bahrain, 26.2500, 50.6167 Letpandan, Burma, 17.7866, 95.7507 Hurlingham, Argentina, -34.6000, -58.6333 Hamilton, New Zealand, -37.7833, 175.2833 Al Juwayyidah, Jordan, 31.9167, 35.9500 Cianjur, Indonesia, -6.8200, 107.1408 Ar Rahmaniyah, Egypt, 31.1048, 30.6414 Waraseoni, India, 21.7647, 80.0494 Leon, Nicaragua, 12.4333, -86.8867 Mauli, India, 30.6990, 76.6930 Harnaut, India, 25.3694, 85.5319 Bejaia, Algeria, 36.7511, 5.0642 Tongjiang, China, 47.6500, 132.5000 Ludwigshafen, Germany, 49.4811, 8.4353 Biu, Nigeria, 10.6111, 12.1950 Hemet, United States, 33.7341, -116.9969 Arafat, Mauritania, 18.0583, -15.9621 Rantau Prapat, Indonesia, 2.3333, 100.0500 Golcuk, Turkey, 40.7172, 29.8228 Burgos, Spain, 42.3500, -3.7067 Catumbela, Angola, -12.4339, 13.5433 Chittoor, India, 13.2160, 79.0980 Shibirghan, Afghanistan, 36.6650, 65.7520 El Bosque, Chile, -33.5667, -70.6750 Santa Maria Texmelucan, Mexico, 19.2833, -98.4333 Navadwip, India, 23.4200, 88.3700 Turgutlu, Turkey, 38.5000, 27.7000 Karaman, Turkey, 37.1819, 33.2181 Manaus, Brazil, -3.1189, -60.0217 Salatiga, Indonesia, -7.3247, 110.5444 Kotdwara, India, 29.7500, 78.5300 Danbury, United States, 41.4015, -73.4709 Chicoloapan, Mexico, 19.4167, -98.9000 Pilibhit, India, 28.6267, 79.8058 Sirjan, Iran, 29.4370, 55.6802 Khapalu, Pakistan, 35.1667, 76.3333 Bodrum, Turkey, 37.0378, 27.4242 Narashino, Japan, 35.6804, 140.0265 Uppsala, Sweden, 59.8498, 17.6389 Cachoeiro de Itapemirim, Brazil, -20.8489, -41.1128 Rancho Cucamonga, United States, 34.1247, -117.5667 Kangqiao, China, 31.3500, 105.0667 Oldenburg, Germany, 53.1439, 8.2139 Juazeiro, Brazil, -9.4139, -40.5028 Luziania, Brazil, -16.2528, -47.9500 Timon, Brazil, -5.0939, -42.8369 Dagupan City, Philippines, 16.0430, 120.3340 Ada, Nigeria, 7.8956, 4.7094 Albacete, Spain, 38.9956, -1.8558 Habaswein, Kenya, 1.0166, 39.4912 Santander, Spain, 43.4628, -3.8050 Gliwice, Poland, 50.2833, 18.6667 Piedras Negras, Mexico, 28.7000, -100.5231 Carupano, Venezuela, 10.6722, -63.2403 Bida, Nigeria, 9.0804, 6.0100 Sakura, Japan, 35.7167, 140.2167 Townsville, Australia, -19.2500, 146.8167 Cuddalore, India, 11.7500, 79.7500 Alcorcon, Spain, 40.3500, -3.8333 Patra, Greece, 38.2500, 21.7333 Sao Jose, Brazil, -27.6150, -48.6278 Basel, Switzerland, 47.5606, 7.5906 Lubao, Philippines, 14.9300, 120.6000 Tocuyito, Venezuela, 10.1144, -68.0656 Nova Friburgo, Brazil, -22.2819, -42.5308 Mexico, Philippines, 15.0645, 120.7203 Gondal, India, 21.9580, 70.7950 Shahin Shahr, Iran, 32.8606, 51.5531 Mulheim, Germany, 51.4275, 6.8825 Deo, India, 24.6583, 84.4378 Fenglu, China, 24.6506, 102.9350 Keningau, Malaysia, 5.3378, 116.1602 Salinas, United States, 36.6883, -121.6317 Sherbrooke, Canada, 45.4000, -71.9000 Kamakurayama, Japan, 35.3197, 139.5525 Ha Long, Vietnam, 20.9500, 107.0667 Silchar, India, 24.8200, 92.8000 Chirala, India, 15.8246, 80.3521 Gadag, India, 15.4167, 75.6167 Mang La, Vietnam, 14.3617, 108.0083 Hitachi, Japan, 36.5991, 140.6515 Jabalya, Gaza Strip, 31.5272, 34.4835 Prokopyevsk, Russia, 53.8833, 86.7167 Polomolok, Philippines, 6.2200, 125.0700 Ongata Rongai, Kenya, -1.4000, 36.7700 Saint-Etienne, France, 45.4347, 4.3903 Matosinhos, Portugal, 41.1867, -8.6844 Oceanside, United States, 33.2247, -117.3083 Sacaba, Bolivia, -17.4042, -66.0408 General Mariano Alvarez, Philippines, 14.3000, 121.0000 Lagos de Moreno, Mexico, 21.3500, -101.9167 Tiruvannamalai, India, 12.1300, 79.0700 Kindu, Congo (Kinshasa), -2.9500, 25.9500 Kaolack, Senegal, 14.1389, -16.0764 Bidar, India, 17.9120, 77.5200 Podgorica, Montenegro, 42.4414, 19.2628 San Miguel, Philippines, 15.1458, 120.9783 Talhar, Pakistan, 24.8833, 68.8167 Jalalabad, India, 30.6200, 74.2500 Izumo, Japan, 35.3669, 132.7547 Rafah, Gaza Strip, 31.2870, 34.2595 Bir el Djir, Algeria, 35.7367, -0.5542 Rybinsk, Russia, 58.0500, 38.8333 Cazanga, Angola, -9.3000, 14.9500 Beji, Indonesia, -6.3704, 106.8176 Oeiras, Portugal, 38.6970, -9.3017 Kempton Park, South Africa, -26.1000, 28.2333 Settat, Morocco, 33.0000, -7.6167 Guiglo, Côte d’Ivoire, 6.5436, -7.4933 Amadora, Portugal, 38.7500, -9.2333 Vallejo, United States, 38.1125, -122.2342 Baranavichy, Belarus, 53.1333, 26.0167 High Point, United States, 35.9910, -79.9937 Al Kufah, Iraq, 32.0300, 44.4000 Araguaina, Brazil, -7.1908, -48.2069 Tangjin, Korea, South, 36.8931, 126.6281 Villupuram, India, 11.9401, 79.4861 Nawsari, India, 20.9500, 72.9300 Surigao, Philippines, 9.7897, 125.4958 Ercis, Turkey, 39.0311, 43.3597 Reggio di Calabria, Italy, 38.1144, 15.6500 Makurdi, Nigeria, 7.7333, 8.5000 Bao Loc, Vietnam, 11.5481, 107.8075 Kohat, Pakistan, 33.5833, 71.4333 Petite Riviere de l'Artibonite, Haiti, 19.1240, -72.4817 Garden Grove, United States, 33.7787, -117.9601 Pembroke Pines, United States, 26.0128, -80.3382 Nigde, Turkey, 37.9667, 34.6792 Nqutu, South Africa, -28.2320, 30.5660 Tonacatepeque, El Salvador, 13.7833, -89.1167 Escuintla, Guatemala, 14.2978, -90.7869 Fusagasuga, Colombia, 4.3452, -74.3618 Malayer, Iran, 34.3000, 48.8178 Olsztyn, Poland, 53.7778, 20.4792 Tomakomai, Japan, 42.6333, 141.6000 Aplahoue, Benin, 6.9333, 1.6833 Valsad, India, 20.6100, 72.9260 Guadalupe, Mexico, 22.7528, -102.5078 Lancaster, United States, 34.6935, -118.1753 As Suwayq, Oman, 23.8494, 57.4386 Concepcion, Philippines, 15.3249, 120.6554 San Luis, Argentina, -33.3000, -66.3333 Barra Mansa, Brazil, -22.5439, -44.1708 Cape Coast, Ghana, 5.1000, -1.2500 Ipiales, Colombia, 0.8303, -77.6444 Magwe, South Sudan, 4.1354, 32.2869 Tebingtinggi, Indonesia, 3.3194, 99.1522 Urayasu, Japan, 35.6539, 139.9022 Puerto Montt, Chile, -41.4667, -72.9333 Reggio Emilia, Italy, 44.7000, 10.6333 Al Marj, Libya, 32.5005, 20.8300 Sahab, Jordan, 31.8667, 36.0000 Caluquembe, Angola, -13.7833, 14.6833 Medinipur, India, 22.4240, 87.3190 Sosan, Korea, South, 36.7817, 126.4522 Ji'an Shi, China, 41.1253, 126.1940 Talas, Turkey, 38.6833, 35.5667 Chuo-ku, Japan, 35.6667, 139.7667 Batumi, Georgia, 41.6458, 41.6417 Bielsko-Biala, Poland, 49.8225, 19.0444 Chetumal, Mexico, 18.5036, -88.3053 Nishio, Japan, 34.8300, 137.0697 Damoh, India, 23.8331, 79.4419 Kalale, Benin, 10.2953, 3.3786 Kroonstad, South Africa, -27.6500, 27.2333 Toliara, Madagascar, -23.3500, 43.6667 Barrechid, Morocco, 33.2667, -7.5833 Marysville, United States, 48.0809, -122.1561 Malanville, Benin, 11.8667, 3.3833 Calabozo, Venezuela, 8.9333, -67.4333 Baliuag, Philippines, 14.9540, 120.9010 Passo Fundo, Brazil, -28.2628, -52.4069 Haripur, India, 31.5300, 75.9200 Mahabad, Iran, 36.7678, 45.7339 Neyveli, India, 11.6088, 79.4994 Bordj Bou Arreridj, Algeria, 36.0667, 4.7667 Moratuwa, Sri Lanka, 6.7804, 79.8800 Francisco Morato, Brazil, -23.2817, -46.7425 Haicheng, China, 22.9658, 115.3187 Huich'on, Korea, North, 40.1707, 126.2761 Ilford, United Kingdom, 51.5575, 0.0858 Maraba, Brazil, -5.3689, -49.1178 Baramula, India, 34.1980, 74.3640 Teluknaga, Indonesia, -6.0989, 106.6381 Edremit, Turkey, 39.5922, 27.0200 Jamalpur, Bangladesh, 24.9004, 89.9500 Riohacha, Colombia, 11.5442, -72.9069 Gabes, Tunisia, 33.8833, 10.1167 Catape, Angola, -13.7667, 15.0833 Caconda, Angola, -13.7393, 15.0607 Hirosaki, Japan, 40.6031, 140.4638 Villa Canales, Guatemala, 14.4833, -90.5333 Malkapur, India, 20.8850, 76.2000 Katha, Burma, 24.1822, 96.3306 Oyama, Japan, 36.3146, 139.8002 Basuo, China, 19.0920, 108.6710 Jind, India, 29.3167, 76.3167 Bandirma, Turkey, 40.3500, 27.9667 Bayamon, Puerto Rico, 18.3794, -66.1635 Itapecerica da Serra, Brazil, -23.7172, -46.8494 Itu, Brazil, -23.2642, -47.2992 Al Qurayyat, Saudi Arabia, 31.3167, 37.3667 Jutiapa, Guatemala, 14.2828, -89.8925 Mary, Turkmenistan, 37.6069, 61.8344 Osnabruck, Germany, 52.2833, 8.0500 Chandannagar, India, 22.8700, 88.3800 Linhares, Brazil, -19.3987, -40.0651 Tiantoujiao, China, 23.0241, 114.1046 Sampit, Indonesia, -2.5333, 112.9500 Fredericksburg, United States, 38.2992, -77.4872 Kismaayo, Somalia, -0.3603, 42.5489 Le Havre, France, 49.4900, 0.1000 Leverkusen, Germany, 51.0333, 6.9833 Adoni, India, 15.6279, 77.2749 Tuguegarao, Philippines, 17.6133, 121.7303 Gia Rai, Vietnam, 9.2500, 105.4170 Visalia, United States, 36.3276, -119.3269 Kuytun, China, 44.4264, 84.9032 Tuscaloosa, United States, 33.2348, -87.5268 Offa, Nigeria, 8.1470, 4.7200 Ocumare del Tuy, Venezuela, 10.1136, -66.7814 Sudbury, Canada, 46.4900, -81.0100 Ratnapura, Sri Lanka, 6.6930, 80.3860 Niiza, Japan, 35.7935, 139.5653 Takaoka, Japan, 36.7541, 137.0257 Tanjungbalai, Indonesia, 2.9700, 99.8000 Kushiro, Japan, 42.9833, 144.3833 Iwata, Japan, 34.7179, 137.8515 Obihiro, Japan, 42.9167, 143.2000 Sao Caetano do Sul, Brazil, -23.6228, -46.5508 Bechar, Algeria, 31.6167, -2.2167 Samandag, Turkey, 36.0850, 35.9806 Palmdale, United States, 34.5944, -118.1057 Warrington, United Kingdom, 53.3900, -2.5900 Udipi, India, 13.3389, 74.7451 Santa Cruz, United States, 36.9789, -122.0346 Saqqez, Iran, 36.2411, 46.2706 Fyzabad, India, 26.7730, 82.1460 Salihli, Turkey, 38.4811, 28.1392 San Fernando, Venezuela, 7.8940, -67.4730 Ebo, Angola, -11.0000, 14.6667 Muse, Burma, 23.9792, 97.9047 Fukang, China, 44.1646, 87.9536 Xuejiawan, China, 39.8600, 111.2400 Sawai Madhopur, India, 26.0000, 76.3500 Shahrud, Iran, 36.4133, 54.9781 Idlib, Syria, 35.9297, 36.6317 Lajes, Brazil, -27.8158, -50.3258 Dourados, Brazil, -22.2208, -54.8058 Tenali, India, 16.2390, 80.6450 Cienfuegos, Cuba, 22.1456, -80.4364 Ungaran, Indonesia, -7.1381, 110.4050 Darmstadt, Germany, 49.8722, 8.6528 Bocoio, Angola, -12.4500, 14.1500 Medford, United States, 42.3372, -122.8540 Khodabandeh, Iran, 36.0000, 48.4167 Abengourou, Côte d’Ivoire, 6.7297, -3.4964 Conjeeveram, India, 12.8185, 79.6947 Hadano, Japan, 35.3667, 139.2167 Chillan, Chile, -36.6000, -72.1167 Gondomar, Portugal, 41.1500, -8.5333 Dong Ha, Vietnam, 16.8303, 107.0972 Abu Hulayfah, Kuwait, 29.1322, 48.1261 Musoma, Tanzania, -1.5000, 33.8000 Madhubani, India, 26.3519, 86.0719 Arnhem, Netherlands, 51.9833, 5.9167 Quibala, Angola, -10.7333, 14.9833 Proddatur, India, 14.7500, 78.5500 Volgodonsk, Russia, 47.5167, 42.1500 San Martin Texmelucan de Labastida, Mexico, 19.2833, -98.4333 Tunja, Colombia, 5.5333, -73.3667 Almetyevsk, Russia, 54.9000, 52.3000 San Marcos, Costa Rica, 10.6204, -84.5120 Pocos de Caldas, Brazil, -21.7878, -46.5608 Sultanpur Mazra, India, 28.6981, 77.0689 Sidon, Lebanon, 33.5606, 35.3758 Tigaraksa, Indonesia, -6.2667, 106.4667 Wau, South Sudan, 7.7000, 27.9900 Tokat, Turkey, 40.3139, 36.5542 Pocheon, Korea, South, 37.8947, 127.2002 Skikda, Algeria, 36.8667, 6.9000 Norwich, United States, 41.5495, -72.0882 Muridke, Pakistan, 31.8020, 74.2550 Muzaffargarh, Pakistan, 30.0694, 71.1942 Merced, United States, 37.3057, -120.4779 San Fernando, Argentina, -34.4500, -58.5667 Petropavlovsk-Kamchatskiy, Russia, 53.0167, 158.6500 Heidelberg, Germany, 49.4167, 8.7167 Huddersfield, United Kingdom, 53.6450, -1.7798 Ube, Japan, 33.9517, 131.2467 Chirchiq, Uzbekistan, 41.4667, 69.5833 Bandar-e Mahshahr, Iran, 30.5567, 49.1897 Nazilli, Turkey, 37.9125, 28.3206 Manchester, United States, 42.9848, -71.4447 Odessa, United States, 31.8801, -102.3448 Haarlem, Netherlands, 52.3833, 4.6333 Boma, Congo (Kinshasa), -5.8500, 13.0500 Tuxtepec, Mexico, 18.1000, -96.1167 Muskegon, United States, 43.2281, -86.2562 Sullana, Peru, -4.9000, -80.6833 San Andres Tuxtla, Mexico, 18.4483, -95.2122 Villeurbanne, France, 45.7667, 4.8803 Parnaiba, Brazil, -2.9050, -41.7769 Bizerte, Tunisia, 37.2778, 9.8639 Mukono, Uganda, 0.3533, 32.7553 Godhra, India, 22.7772, 73.6203 Rafsanjan, Iran, 30.3983, 55.9919 Sariaya, Philippines, 13.9700, 121.5300 Multai, India, 21.7700, 78.2500 Metro, Indonesia, -5.1167, 105.3000 Perugia, Italy, 43.1121, 12.3888 Camacari, Brazil, -12.6978, -38.3239 Talcahuano, Chile, -36.7167, -73.1219 Guadalajara, Spain, 40.6337, -3.1674 Tema, Ghana, 5.6667, -0.0167 Syzran, Russia, 53.1667, 48.4667 Zemun, Serbia, 44.8500, 20.4000 Ndalatando, Angola, -9.3000, 14.9167 Solingen, Germany, 51.1719, 7.0847 Leesburg, United States, 28.7672, -81.8962 Daule, Ecuador, -1.8667, -79.9833 Zhanlicun, China, 23.2881, 116.2594 Pangzawl, India, 22.9100, 92.7600 Bontang, Indonesia, 0.1333, 117.5000 Jinggang, China, 23.2722, 113.2183 Prantij, India, 23.4384, 72.8572 Ash Shihaniyah, Qatar, 25.3722, 51.2047 Papantla de Olarte, Mexico, 20.4478, -97.3200 Kamensk-Ural'skiy, Russia, 56.4000, 61.9333 San Miguel del Padron, Cuba, 23.0964, -82.3267 Tan Phu, Vietnam, 11.2720, 107.4367 Naic, Philippines, 14.3200, 120.7700 Liancheng, China, 24.0519, 105.0750 Zaranj, Afghanistan, 30.9600, 61.8600 Kidapawan, Philippines, 7.0083, 125.0894 Braganca Paulista, Brazil, -22.9189, -46.5425 Pindamonhangaba, Brazil, -22.9239, -45.4617 Split, Croatia, 43.5100, 16.4400 Novocherkassk, Russia, 47.4222, 40.0939 Ziarat, Pakistan, 30.3810, 67.7270 Miyakonojo, Japan, 31.7194, 131.0617 Lafayette, United States, 40.3991, -86.8593 Siirt, Turkey, 37.9250, 41.9458 Tra Vinh, Vietnam, 9.9333, 106.3500 Khanpur, Pakistan, 28.6500, 70.6800 Ferkessedougou, Côte d’Ivoire, 9.5928, -5.1944 La Laguna, Spain, 28.4853, -16.3167 Southend, United Kingdom, 51.5500, 0.7100 Ciudad Acuna, Mexico, 29.3242, -100.9317 Jose Maria Ezeiza, Argentina, -34.8333, -58.5167 Khost, Afghanistan, 33.3331, 69.9169 Koudougou, Burkina Faso, 12.2500, -2.3667 Saint-Marc, Haiti, 19.1167, -72.7000 San Nicolas de los Arroyos, Argentina, -33.3333, -60.2167 Huaycan, Peru, -12.0181, -76.8139 Milagro, Ecuador, -2.1347, -79.5872 Dijon, France, 47.3167, 5.0167 Moga, India, 30.8220, 75.1740 Ede, Nigeria, 7.7389, 4.4361 Ekibastuz, Kazakhstan, 51.6667, 75.3667 Enschede, Netherlands, 52.2225, 6.8925 Newport, United Kingdom, 51.5886, -2.9978 Regensburg, Germany, 49.0167, 12.0833 Patos de Minas, Brazil, -18.5871, -46.5149 Kisarawe, Tanzania, -7.2622, 38.7367 Budaun, India, 28.0500, 79.1200 Hayward, United States, 37.6328, -122.0766 Ramat Gan, Israel, 32.0700, 34.8235 Uttarpara, India, 22.6700, 88.3500 Catamarca, Argentina, -28.4667, -65.7833 Marbella, Spain, 36.5167, -4.8833 Daltonganj, India, 24.0300, 84.0700 Ceyhan, Turkey, 37.0289, 35.8125 Quipungo, Angola, -14.8167, 14.5500 Corona, United States, 33.8616, -117.5649 Benoni, South Africa, -26.1883, 28.3206 Djelfa, Algeria, 34.6667, 3.2500 Macuspana, Mexico, 17.7667, -92.6000 Zhengding, China, 38.1464, 114.5708 Zlatoust, Russia, 55.1667, 59.6667 Aral, China, 40.5480, 81.2810 Cadiz, Philippines, 10.9500, 123.3000 Matsuzaka, Japan, 34.5779, 136.5276 Copiapo, Chile, -27.3664, -70.3331 Klaipeda, Lithuania, 55.7125, 21.1350 Ogaki, Japan, 35.3594, 136.6129 Jamkhed, India, 18.7200, 75.3200 Zabrze, Poland, 50.3025, 18.7781 Bharuch, India, 21.7120, 72.9930 Nanqiaotou, China, 22.7176, 113.2918 Ilagan, Philippines, 17.1489, 121.8894 Gweru, Zimbabwe, -19.4614, 29.8022 Abaetetuba, Brazil, -1.7178, -48.8828 Tacheng, China, 46.7517, 82.9869 Szeged, Hungary, 46.2500, 20.1667 Herne, Germany, 51.5500, 7.2167 Gojra, Pakistan, 31.1500, 72.6833 Banha, Egypt, 30.4628, 31.1797 Panjgur, Pakistan, 26.9683, 64.1014 Mahlaing, Burma, 21.0900, 95.6400 Paterson, United States, 40.9147, -74.1624 Ilheus, Brazil, -14.7889, -39.0489 Calama, Chile, -22.4667, -68.9333 Angers, France, 47.4736, -0.5542 San Miguel, Argentina, -34.5333, -58.7167 's-Hertogenbosch, Netherlands, 51.6833, 5.3167 Amersfoort, Netherlands, 52.1550, 5.3875 George, South Africa, -33.9667, 22.4500 Mandi Bahauddin, Pakistan, 32.5797, 73.4814 Itapetininga, Brazil, -23.5917, -48.0531 Lunglei, India, 22.8800, 92.7300 Nablus, West Bank, 32.2199, 35.2636 Nan Zhuang, China, 22.9839, 113.0139 Zaanstad, Netherlands, 52.4333, 4.8167 Guaymas, Mexico, 27.9183, -110.8933 Enfield, United Kingdom, 51.6522, -0.0808 Guimaraes, Portugal, 41.4450, -8.2908 Alexandria, United States, 38.8185, -77.0861 Kamina, Congo (Kinshasa), -8.7386, 24.9906 Molo, Kenya, -0.2485, 35.7319 Domodedovo, Russia, 55.4400, 37.7619 Macon, United States, 32.8065, -83.6974 Saharsa, India, 25.8800, 86.6000 Chaoshan, China, 23.0768, 113.8696 Ketou, Benin, 7.3581, 2.6075 Rio das Ostras, Brazil, -22.5269, -41.9450 Adzope, Côte d’Ivoire, 6.1035, -3.8648 Portmore, Jamaica, 17.9500, -76.8799 Girona, Spain, 41.9844, 2.8211 Grenoble, France, 45.1715, 5.7224 Qalyub, Egypt, 30.1997, 31.2053 Danao, Philippines, 10.5300, 123.9300 Lakewood, United States, 39.6977, -105.1172 Springfield, United States, 39.7709, -89.6540 Ghorahi, Nepal, 28.0408, 82.4861 Bac Lieu, Vietnam, 9.2833, 105.7167 Capas, Philippines, 15.3372, 120.5900 Xiaping, China, 26.7480, 114.2890 Al Miqdadiyah, Iraq, 33.9786, 44.9369 Vidisha, India, 23.5300, 77.8200 Pathankot, India, 32.2668, 75.6000 Ravenna, Italy, 44.4161, 12.2017 Paderborn, Germany, 51.7181, 8.7542 Ar Ramtha, Jordan, 32.5589, 36.0147 Severodvinsk, Russia, 64.5667, 39.8667 Borazjan, Iran, 29.2694, 51.2200 Kisi, Nigeria, 9.0833, 3.8500 Cap-Haitien, Haiti, 19.7500, -72.2000 Esmeraldas, Ecuador, 0.9667, -79.6528 Souk Ahras, Algeria, 36.2864, 7.9511 Karwar, India, 14.8000, 74.1300 Daiwanishi, Japan, 34.8892, 135.4167 Neuss, Germany, 51.2000, 6.7000 Khasavyurt, Russia, 43.2500, 46.5833 Chlef, Algeria, 36.1647, 1.3317 Pandi, Philippines, 14.8700, 120.9500 Camarajibe, Brazil, -8.0219, -34.9808 El Eulma, Algeria, 36.1500, 5.6833 Salzburg, Austria, 47.8000, 13.0450 Thanesar, India, 29.9667, 76.8167 Danzao, China, 23.0427, 112.9145 Kishangarh, India, 26.5700, 74.8700 Uiwang, Korea, South, 37.3448, 126.9683 Luanshya, Zambia, -13.1333, 28.4000 Hanam, Korea, South, 37.5167, 127.2000 Kansas City, United States, 39.1235, -94.7443 Zango, Nigeria, 12.9333, 8.5333 Braila, Romania, 45.2692, 27.9575 Barrie, Canada, 44.3711, -79.6769 Butembo, Congo (Kinshasa), 0.1500, 29.2833 Saint-Louis, Senegal, 16.0333, -16.5000 Burlington, United States, 36.0760, -79.4685 Rudarpur, India, 28.9800, 79.4000 Kitenkela, Kenya, -1.4855, 36.9047 Tindwara, India, 25.4833, 80.3333 Warner Robins, United States, 32.5961, -83.6527 Nalgonda, India, 17.0575, 79.2684 Jinghai, China, 38.9294, 116.9169 Hitachi-Naka, Japan, 36.3967, 140.5347 Lucapa, Angola, -8.4228, 20.7392 Noda, Japan, 35.9500, 139.8667 Santana de Parnaiba, Brazil, -23.4439, -46.9178 Dibrugarh, India, 27.4800, 95.0000 Singaraja, Indonesia, -8.1167, 115.0833 Moanda, Congo (Kinshasa), -5.9342, 12.3494 Seogwipo, Korea, South, 33.2497, 126.56 Palo Negro, Venezuela, 10.1739, -67.5419 Veraval, India, 20.9159, 70.3629 Durres, Albania, 41.3133, 19.4458 Hoeryong, Korea, North, 42.4333, 129.7500 Abbotsford, Canada, 49.0500, -122.3167 Tochigi, Japan, 36.3813, 139.7303 Sunnyvale, United States, 37.3836, -122.0255 Betul Bazar, India, 21.9050, 77.9020 Sukrah, Tunisia, 36.8833, 10.2500 Andong, Korea, South, 36.5592, 128.7289 Balurghat, India, 25.2200, 88.7600 Bytom, Poland, 50.3483, 18.9156 San Jose, Philippines, 12.3528, 121.0676 Jorhat, India, 26.7500, 94.2200 Poblacion, Philippines, 10.4111, 123.9822 Ixtlahuaca, Mexico, 19.5689, -99.7669 Kariya, Japan, 34.9893, 137.0021 Krishnanagar, India, 23.4000, 88.5000 Dutse, Nigeria, 11.7011, 9.3419 Newcastle, Australia, -32.9306, 151.7542 Ueda, Japan, 36.4019, 138.2491 Hollywood, United States, 26.0293, -80.1679 Livorno, Italy, 43.5500, 10.3167 Tete, Mozambique, -16.1579, 33.5898 Vinh Yen, Vietnam, 21.3100, 105.5967 Barakpur, India, 22.7600, 88.3700 Porbandar, India, 21.6417, 69.6293 Sinpo, Korea, North, 40.0347, 128.1856 Giron, Colombia, 7.0708, -73.1731 Pouso Alegre, Brazil, -22.2281, -45.9336 Ciudad Choluteca, Honduras, 13.3014, -87.1842 Roseville, United States, 38.7703, -121.3196 Hoa Thanh, Vietnam, 11.2831, 106.1297 Alagoinhas, Brazil, -12.1356, -38.4192 Mudon, Burma, 16.2578, 97.7164 Amatitlan, Guatemala, 14.4833, -90.6167 Gulu, Uganda, 2.7817, 32.2992 Gwangyang, Korea, South, 34.9333, 127.6833 Hoi An, Vietnam, 15.8833, 108.3333 Baubau, Indonesia, -5.4622, 122.6058 Imabari, Japan, 34.0667, 133.0000 New Bedford, United States, 41.6697, -70.9428 Kawashiri, Japan, 34.8333, 135.4167 Bordj el Kiffan, Algeria, 36.7375, 3.1931 Go Cong, Vietnam, 10.3667, 106.6667 Erdemli, Turkey, 36.6056, 34.3111 Gonbad-e Kavus, Iran, 37.2436, 55.1658 Al Manaqil, Sudan, 14.2504, 32.9800 Shantipur, India, 23.2500, 88.4300 Hindupur, India, 13.8300, 77.4900 Araucaria, Brazil, -25.5928, -49.4100 Matanzas, Cuba, 23.0494, -81.5736 Tulancingo, Mexico, 20.0833, -98.3667 Ipswich, United Kingdom, 52.0594, 1.1556 Beawar, India, 26.1000, 74.3200 Long Khanh, Vietnam, 10.9170, 107.1670 Bhalswa Jahangirpur, India, 28.7354, 77.1638 Mufulira, Zambia, -12.5356, 28.2419 Tauranga, New Zealand, -37.6858, 176.1667 South Lyon, United States, 42.4614, -83.6526 Bellevue, United States, 47.5951, -122.1535 Erode, India, 11.3409, 77.7171 Logrono, Spain, 42.4650, -2.4456 Dahuaishu, China, 36.2601, 111.6743 Minglanilla, Philippines, 10.2450, 123.7964 Manzanillo, Cuba, 20.3397, -77.1086 Eregli, Turkey, 37.5128, 34.0483 Chichicastenango, Guatemala, 14.9333, -91.1167 Duc Pho, Vietnam, 14.8100, 108.9600 San Jose, Philippines, 15.8037, 120.9991 Tafeng, China, 25.3775, 112.2034 Fairfield, United States, 38.2583, -122.0335 Cayirova, Turkey, 40.8000, 29.4167 Sibsagar, India, 26.9844, 94.6375 Mahmutlu, Turkey, 39.7464, 39.4914 Buyuk Cakirman, Turkey, 39.7464, 39.4914 Bugdayli, Turkey, 39.7464, 39.4914 Erzincan, Turkey, 39.7464, 39.4914 Kirsehir, Turkey, 39.1456, 34.1608 Eminabad, Pakistan, 32.0422, 74.2600 Kragujevac, Serbia, 44.0142, 20.9394 Badajoz, Spain, 38.8803, -6.9753 Binghamton, United States, 42.1014, -75.9093 Manzhouli, China, 49.5980, 117.3790 Delicias, Mexico, 28.1931, -105.4717 Piedecuesta, Colombia, 7.0833, -73.0000 Toledo, Brazil, -24.7139, -53.7428 Higashimurayama, Japan, 35.7546, 139.4685 Nimes, France, 43.8383, 4.3597 Ipokia, Nigeria, 6.5333, 2.8500 Jaranwala, Pakistan, 31.3333, 73.4167 Nangloi Jat, India, 28.6833, 77.0667 Topeka, United States, 39.0346, -95.6955 Rondonopolis, Brazil, -16.4708, -54.6358 Ramapo, United States, 41.1404, -74.1072 Kukichuo, Japan, 36.0621, 139.6668 Fengyicun, China, 23.6636, 116.6028 Mzuzu, Malawi, -11.4500, 34.0333 Valle de Santiago, Mexico, 20.3900, -101.2600 Dong Xoai, Vietnam, 11.5169, 106.8392 Valdivia, Chile, -39.8139, -73.2458 Golbasi, Turkey, 39.7953, 32.8028 Naogaon, Bangladesh, 24.8118, 88.9470 Willemstad, Curaçao, 12.1080, -68.9350 Bavaro, Dominican Republic, 18.7170, -68.4500 Soro, India, 21.2900, 86.6900 El Minie, Lebanon, 34.4470, 35.8178 Borj Hammoud, Lebanon, 33.8936, 35.5403 Auchi, Nigeria, 7.0667, 6.2667 Kashikishi, Zambia, -9.3000, 28.7167 Villanueva, Honduras, 15.3157, -87.9932 Penjamo, Mexico, 20.4311, -101.7222 Escondido, United States, 33.1348, -117.0723 Santa Rita, Brazil, -7.1139, -34.9778 Mariveles, Philippines, 14.4300, 120.4800 Saumlaki, Indonesia, -7.9750, 131.3075 Joliet, United States, 41.5188, -88.1499 Villa de Alvarez, Mexico, 19.2500, -103.7333 Levis, Canada, 46.8000, -71.1833 Zacatecas, Mexico, 22.7736, -102.5736 Kerch, Ukraine, 45.3619, 36.4711 Surprise, United States, 33.6815, -112.4515 Naperville, United States, 41.7480, -88.1659 Lashio, Burma, 22.9333, 97.7500 Pasadena, United States, 29.6575, -95.1498 Bohicon, Benin, 7.2000, 2.0667 Harrow, United Kingdom, 51.5836, -0.3464 Rimini, Italy, 44.0594, 12.5683 Port Louis, Mauritius, -20.1644, 57.5042 Maimanah, Afghanistan, 35.9333, 64.7500 Cotia, Brazil, -23.6039, -46.9189 Musashino, Japan, 35.7177, 139.5661 Melipilla, Chile, -33.6253, -71.2711 Sagay, Philippines, 10.9000, 123.4200 `Ajlun, Jordan, 32.3325, 35.7517 Marvdasht, Iran, 29.8786, 52.8067 Melitopol, Ukraine, 46.8489, 35.3675 Mesquite, United States, 32.7602, -96.5865 Agri, Turkey, 39.7186, 43.0508 Coquitlam, Canada, 49.2839, -122.7919 Xianshuigu, China, 38.9786, 117.3886 Nuzvid, India, 16.7881, 80.8465 Abbottabad, Pakistan, 34.1558, 73.2194 Santiago, Philippines, 16.6800, 121.5500 Champaign, United States, 40.1142, -88.2737 Sayama, Japan, 35.8530, 139.4122 Jean-Rabel, Haiti, 19.8500, -73.2000 Taza, Morocco, 34.2167, -4.0167 Pomona, United States, 34.0585, -117.7626 Nizip, Turkey, 37.0100, 37.7972 Dundee, United Kingdom, 56.4606, -2.9700 Sitarganj, India, 28.9300, 79.7000 Moc Chau, Vietnam, 20.9221, 104.7521 Dongguazhen, China, 25.0911, 101.5075 Al Hawiyah, Saudi Arabia, 21.4411, 40.4975 Cagliari, Italy, 39.2167, 9.1167 Odivelas, Portugal, 38.8000, -9.1833 Consolacion, Philippines, 10.4000, 123.9500 Maridi, South Sudan, 4.9151, 29.4769 Quilpue, Chile, -33.0500, -71.4500 Rafael Castillo, Argentina, -34.7167, -58.6167 Zhangaozen, Kazakhstan, 43.3378, 52.8553 Aix-en-Provence, France, 43.5263, 5.4454 Nchelenge, Zambia, -9.3533, 28.7403 Szombathely, Hungary, 47.2351, 16.6219 Kutaisi, Georgia, 42.2717, 42.7056 Komaki, Japan, 35.2910, 136.9121 Kiambu, Kenya, -1.1714, 36.8356 Siem Reap, Cambodia, 13.3622, 103.8597 Jyvaskyla, Finland, 62.2417, 25.7417 Houma, United States, 29.5800, -90.7059 Clermont-Ferrand, France, 45.7831, 3.0824 Hajipur, India, 25.6925, 85.2084 Kisaran, Indonesia, 2.9833, 99.6125 Pesqueria, Mexico, 25.7850, -100.0511 Mati, Philippines, 6.9483, 126.2272 Malakal, South Sudan, 9.5369, 31.6560 Milas, Turkey, 37.3167, 27.7833 La Lisa, Cuba, 23.0247, -82.4631 Kafr ash Shaykh, Egypt, 31.1000, 30.9500 Tipitapa, Nicaragua, 12.2000, -86.1000 Athens, United States, 33.9508, -83.3689 St. George, United States, 37.0758, -113.5752 Miass, Russia, 55.0000, 60.1000 Tama, Japan, 35.6369, 139.4463 Dongsheng, China, 22.8847, 113.4550 Habra, India, 22.8300, 88.6300 Yonago, Japan, 35.4333, 133.3333 Jequie, Brazil, -13.8578, -40.0839 Kramatorsk, Ukraine, 48.7392, 37.5839 Kalemie, Congo (Kinshasa), -5.9128, 29.1906 Colima, Mexico, 19.2433, -103.7247 Dawei, Burma, 14.0833, 98.2000 Maquela do Zombo, Angola, -6.0500, 15.1167 Wamba, Congo (Kinshasa), 2.1442, 27.9929 Bara Banki, India, 26.9200, 81.2000 Cairns, Australia, -16.9200, 145.7800 Xinjing, China, 31.2142, 121.3681 Cam Ranh, Vietnam, 11.9020, 109.2207 Bir, India, 18.9900, 75.7600 Florencio Varela, Argentina, -34.8167, -58.2833 Salavat, Russia, 53.3667, 55.9333 Beaumont, United States, 30.0849, -94.1451 Elkhart, United States, 41.6916, -85.9627 Keren, Eritrea, 15.7778, 38.4581 West Bromwich, United Kingdom, 52.5190, -1.9950 Derince, Turkey, 40.7539, 29.8231 Dhamar, Yemen, 14.5500, 44.4017 Gandajika, Congo (Kinshasa), -6.7500, 23.9667 Colina, Chile, -33.2017, -70.6703 Dadu, Pakistan, 26.7325, 67.7792 Pleiku, Vietnam, 13.9833, 108.0000 Stavanger, Norway, 58.9700, 5.7314 Taungdwingyi, Burma, 20.0017, 95.5461 Narnaul, India, 28.0444, 76.1056 Chitaldrug, India, 14.2300, 76.4000 Calapan, Philippines, 13.4140, 121.1800 Calapan, Philippines, 13.4140, 121.1800 Franco da Rocha, Brazil, -23.3286, -46.7244 Mostaganem, Algeria, 35.9333, 0.0833 Paco do Lumiar, Brazil, -2.5319, -44.1078 Etah, India, 27.6300, 78.6700 Bani, Dominican Republic, 18.2900, -70.3300 Gloucester, United Kingdom, 51.8653, -2.2458 Quchan, Iran, 37.1060, 58.5095 Vila Junqueiro, Mozambique, -15.4669, 36.9778 Foggia, Italy, 41.4584, 15.5519 Iruma, Japan, 35.8358, 139.3911 Abohar, India, 30.1334, 74.2001 Thanatpin, Burma, 17.2942, 96.5800 Bhandaria, Bangladesh, 22.4890, 90.0627 Le Mans, France, 48.0077, 0.1984 Lake Charles, United States, 30.2010, -93.2111 Facatativa, Colombia, 4.8167, -74.3667 Arad, Romania, 46.1750, 21.3125 Fujita, Japan, 34.8674, 138.2577 Urganch, Uzbekistan, 41.5500, 60.6333 Kopeysk, Russia, 55.1000, 61.6167 Khairpur Mir's, Pakistan, 27.5333, 68.7667 Bukoba, Tanzania, -1.3333, 31.8167 Kaithal, India, 29.8015, 76.3998 Arayat, Philippines, 15.1493, 120.7692 Salamanca, Spain, 40.9650, -5.6642 Santa Maria, United States, 34.9333, -120.4431 Porlamar, Venezuela, 10.9500, -63.8500 Poole, United Kingdom, 50.7167, -1.9833 Comayagua, Honduras, 14.4528, -87.6379 Lleida, Spain, 41.6167, 0.6333 Rangkasbitung, Indonesia, -6.3667, 106.2500 Saguenay, Canada, 48.4167, -71.0667 Urdaneta, Philippines, 15.9761, 120.5711 Xintang, China, 22.7833, 113.1500 Lodhran, Pakistan, 29.5333, 71.6333 Yuma, United States, 32.5995, -114.5491 Balasore, India, 21.5033, 86.9250 Guelph, Canada, 43.5500, -80.2500 Zhaxi, China, 27.8508, 104.9687 Mehtar Lam, Afghanistan, 34.6683, 70.2089 Navoiy, Uzbekistan, 40.0844, 65.3792 Dar Naim, Mauritania, 18.0973, -15.9327 Pinetown, South Africa, -29.8167, 30.8500 Asaka, Japan, 35.7972, 139.5939 Ramu, Kenya, 3.9375, 41.2203 Olathe, United States, 38.8833, -94.8200 Midland, United States, 32.0243, -102.1147 Kakamigahara, Japan, 35.3988, 136.8484 Canakkale, Turkey, 40.1519, 26.4056 Aalborg, Denmark, 57.0337, 9.9166 Greeley, United States, 40.4152, -104.7706 Koiridih, India, 24.1800, 86.3000 Miskolc, Hungary, 48.1000, 20.7833 Torrance, United States, 33.8346, -118.3416 La Victoria, Venezuela, 10.2278, -67.3336 Ciego de Avila, Cuba, 21.8481, -78.7631 Bandundu, Congo (Kinshasa), -3.3167, 17.3667 Pyatigorsk, Russia, 44.0500, 43.0667 Disuq, Egypt, 31.1325, 30.6478 Calabayan, Philippines, 16.7700, 121.7800 Ghazni, Afghanistan, 33.5492, 68.4233 Zhaoxiang, China, 31.1490, 121.1962 Huelva, Spain, 37.2500, -6.9500 Touggourt, Algeria, 33.1000, 6.0667 Shillong, India, 25.5822, 91.8944 Bafra, Turkey, 41.5722, 35.9147 Malasiqui, Philippines, 15.9200, 120.4200 Ikot Ekpene, Nigeria, 5.1833, 7.7167 Sannar, Sudan, 13.5500, 33.6000 Los Angeles, Chile, -37.4667, -72.3500 Rewari, India, 28.1800, 76.6200 Paghman, Afghanistan, 34.5833, 68.9500 Ilopango, El Salvador, 13.7000, -89.1167 Jinjiang, China, 19.7288, 110.0085 Tinipuka, Indonesia, -4.5500, 136.8900 Cartago, Colombia, 4.7000, -75.9167 Ashikaga, Japan, 36.3402, 139.4497 Thornton, United States, 39.9197, -104.9438 Stara Zagora, Bulgaria, 42.4333, 25.6500 Telford, United Kingdom, 52.6766, -2.4469 Shahrisabz, Uzbekistan, 39.0500, 66.8333 Garanhuns, Brazil, -8.8903, -36.4928 Hazaribagh, India, 23.9800, 85.3500 Las Cruces, United States, 32.3265, -106.7893 Trindade, Brazil, -16.6489, -49.4889 Nawabganj, Bangladesh, 24.6000, 88.2667 Toda, Japan, 35.8176, 139.6779 Ingolstadt, Germany, 48.7631, 11.4250 Lichinga, Mozambique, -13.3000, 35.2456 Bhimavaram, India, 16.5430, 81.5230 Tsuchiura, Japan, 36.0667, 140.2000 Negombo, Sri Lanka, 7.2111, 79.8386 Okinawa, Japan, 26.3342, 127.8056 Namacunde, Angola, -17.3000, 15.8500 Boca Chica, Dominican Republic, 18.4539, -69.6064 Altay, China, 47.8666, 88.1166 Bahawalnagar, Pakistan, 29.9928, 73.2536 Misato, Japan, 35.8301, 139.8723 Moriguchi, Japan, 34.7375, 135.5642 Columbia, United States, 38.9472, -92.3268 Preston, United Kingdom, 53.8300, -2.7350 Elektrostal, Russia, 55.7833, 38.4667 Brasilia, Brazil, -15.7939, -47.8828 Jun'an, China, 22.7057, 113.1526 York, United Kingdom, 53.9600, -1.0800 Mandsaur, India, 24.0720, 75.0690 Chas, India, 23.6300, 86.1700 Jahrom, Iran, 28.5147, 53.5731 Bondoukou, Côte d’Ivoire, 8.0304, -2.8000 Lausanne, Switzerland, 46.5200, 6.6333 Bocaue, Philippines, 14.8000, 120.9300 Khuzdar, Pakistan, 27.8000, 66.6167 Brusque, Brazil, -27.0978, -48.9178 Mejicanos, El Salvador, 13.7333, -89.2167 Tepatitlan de Morelos, Mexico, 20.8139, -102.7639 Pemba, Mozambique, -12.9667, 40.5167 Elbistan, Turkey, 38.2014, 37.1883 Bilbays, Egypt, 30.4167, 31.5667 Fullerton, United States, 33.8841, -117.9279 Pitesti, Romania, 44.8606, 24.8678 Tan Chau, Vietnam, 10.7739, 105.2369 Numan, Nigeria, 9.4669, 12.0328 Kamalshahr, Iran, 35.8658, 50.8717 Tarragona, Spain, 41.1175, 1.2528 Subang, Indonesia, -6.5714, 107.7614 Las Maravillas, Mexico, 16.3667, -91.7333 Grand Junction, United States, 39.0877, -108.5673 Brest, France, 48.3900, -4.4900 Tabaco, Philippines, 13.3500, 123.7300 Fukayacho, Japan, 36.1975, 139.2815 Nsele, Congo (Kinshasa), -4.3744, 15.4947 Coimbra, Portugal, 40.2111, -8.4289 Mtwara, Tanzania, -10.2736, 40.1828 Porac, Philippines, 15.0719, 120.5419 Carsamba, Turkey, 41.1992, 36.7275 Krugersdorp, South Africa, -26.1000, 27.7667 Port Blair, India, 11.6683, 92.7378 Middlesbrough, United Kingdom, 54.5767, -1.2355 Ruse, Bulgaria, 43.8445, 25.9539 Shizhaobi, China, 23.9210, 115.7774 Dos Hermanas, Spain, 37.2836, -5.9222 Samarra', Iraq, 34.1959, 43.8857 Ozamiz City, Philippines, 8.1500, 123.8500 Pecs, Hungary, 46.0708, 18.2331 Harchandpur, India, 26.3600, 81.1700 Yaritagua, Venezuela, 10.0753, -69.1283 Kumbakonam, India, 10.9602, 79.3845 Cuautitlan Izcalli, Mexico, 19.6500, -99.2500 Torbat-e Heydariyeh, Iran, 35.2872, 59.2219 Xiangcheng, China, 25.4783, 100.5551 Nahiyat Ghammas, Iraq, 31.7422, 44.6102 Al `Aqabah, Jordan, 29.5322, 35.0061 Batu Pahat, Malaysia, 1.8504, 102.9333 Kusatsu, Japan, 35.0167, 135.9667 Santa Tecla, El Salvador, 13.6731, -89.2406 Darwin, Australia, -12.4381, 130.8411 Reykjavik, Iceland, 64.1458, -21.9425 Atbara, Sudan, 17.7167, 33.9833 Caxias, Brazil, -4.8589, -43.3558 Kanasin, Mexico, 20.9344, -89.5578 Payatas, Philippines, 14.7099, 121.0997 Shinyanga, Tanzania, -3.6619, 33.4231 Aul, India, 20.6700, 86.6400 Masaya, Nicaragua, 11.9667, -86.1000 Malambo, Colombia, 10.8500, -74.7500 Momostenango, Guatemala, 15.0000, 2.0000 Serik, Turkey, 36.9167, 31.1000 Pakpattan, Pakistan, 30.3442, 73.3839 Botucatu, Brazil, -22.8858, -48.4450 Tanay, Philippines, 14.4972, 121.2864 Blackpool, United Kingdom, 53.8142, -3.0503 La Romana, Dominican Republic, 18.4300, -68.9700 Trois-Rivieres, Canada, 46.3500, -72.5500 Balneario de Camboriu, Brazil, -26.9908, -48.6350 Mino, Japan, 34.8269, 135.4706 Maykop, Russia, 44.6000, 40.0833 Carolina, Puerto Rico, 18.4054, -65.9792 Metairie, United States, 29.9977, -90.1780 Apeldoorn, Netherlands, 52.2100, 5.9700 Pantanal, Dominican Republic, 18.5586, -68.3694 Ishizaki, Japan, 38.4176, 141.3027 Kuwana, Japan, 35.0667, 136.6833 Orange, United States, 33.8038, -117.8218 Tours, France, 47.3936, 0.6892 Gemena, Congo (Kinshasa), 3.2500, 19.7667 Cam Ranh, Vietnam, 11.9136, 109.1369 Sancti Spiritus, Cuba, 21.9339, -79.4439 Whitby, Canada, 43.8833, -78.9417 Cambridge, Canada, 43.3972, -80.3114 Kolar, India, 13.1333, 78.1333 Medea, Algeria, 36.2675, 2.7500 Koga, Japan, 36.1782, 139.7554 Dipolog, Philippines, 8.5872, 123.3408 Warren, United States, 42.4934, -83.0270 Dabou, Côte d’Ivoire, 5.3256, -4.3767 Teresopolis, Brazil, -22.4119, -42.9658 Jacmel, Haiti, 18.2350, -72.5370 Orekhovo-Borisovo Yuzhnoye, Russia, 55.6000, 37.7333 West Valley City, United States, 40.6886, -112.0123 Chicacole, India, 18.3000, 83.9000 Montero, Bolivia, -17.3422, -63.2558 Moundou, Chad, 8.5667, 16.0833 Koutiala, Mali, 12.3833, -5.4667 Shunan, Japan, 34.0550, 131.8061 Candelaria, Philippines, 13.9311, 121.4233 Gaziemir, Turkey, 38.3214, 27.1275 Negage, Angola, -7.7667, 15.2667 Vila Franca de Xira, Portugal, 38.9500, -8.9833 Kapakli, Turkey, 41.3333, 27.9667 Inezgane, Morocco, 30.3658, -9.5381 Northampton, United Kingdom, 52.2304, -0.8938 Teofilo Otoni, Brazil, -17.8578, -41.5050 La Trinidad, Philippines, 16.4600, 120.5900 Bankura, India, 23.2500, 87.0700 Mandya, India, 12.5200, 76.9000 Hampton, United States, 37.0551, -76.3630 Norrkoping, Sweden, 58.5919, 16.1856 Jolo, Philippines, 6.0000, 121.0000 Cunduacan, Mexico, 18.0667, -93.1667 Dehri, India, 24.9100, 84.1800 Sinfra, Côte d’Ivoire, 6.6210, -5.9114 Myebon, Burma, 20.0500, 93.3667 Atibaia, Brazil, -23.1172, -46.5506 Quillacollo, Bolivia, -17.4000, -66.2833 Medina Estates, Ghana, 5.6658, -0.1631 Kanata, Canada, 45.3333, -75.9000 Gunungsitoli, Indonesia, 1.2833, 97.6167 Porto Amboim, Angola, -10.7183, 13.7500 Cacula, Angola, 14.0000, 29.0000 Minoo, Japan, 34.8269, 135.4704 Durgauti, India, 25.2114, 83.5308 Curico, Chile, -34.9833, -71.2333 Taxila, Pakistan, 33.7458, 72.7875 Gingoog, Philippines, 8.8200, 125.1000 Lakewood, United States, 40.0763, -74.2031 Marivan, Iran, 35.5217, 46.1806 Phu Ly, Vietnam, 20.5411, 105.9139 Huehuetenango, Guatemala, 15.3147, -91.4761 Karatepe, Turkey, 40.7333, 29.9667 San Justo, Argentina, -34.6833, -58.5500 Mainpuri, India, 27.2300, 79.0200 Nasugbu, Philippines, 14.0700, 120.6300 Quimbele, Angola, -6.5167, 16.2167 Bima, Indonesia, -8.4600, 118.7267 Varginha, Brazil, -21.5508, -45.4300 Port-Gentil, Gabon, -0.7167, 8.7833 Pasadena, United States, 34.1597, -118.1390 Carcar, Philippines, 10.1200, 123.6300 Qabr as Sitt, Syria, 33.4466, 36.3364 Campo Largo, Brazil, -25.4589, -49.5278 San Jose del Cabo, Mexico, 23.0614, -109.7081 Cachoeirinha, Brazil, -29.9508, -51.0939 Pageralam, Indonesia, -4.0167, 103.2500 Zinacantepec, Mexico, 19.2833, -99.7333 Batang, Indonesia, -6.9081, 109.7304 Ergani, Turkey, 38.2692, 39.7617 Nakhodka, Russia, 42.8167, 132.8667 Bacau, Romania, 46.5833, 26.9167 Norzagaray, Philippines, 14.9200, 121.0500 Yaizu, Japan, 34.8669, 138.3247 Talaivasal, India, 11.5867, 78.7583 Kisarazu, Japan, 35.3760, 139.9168 Miramar, United States, 25.9773, -80.3351 Shchelkovo, Russia, 55.9167, 38.0000 Birganj, Nepal, 27.0000, 84.8667 Elizabeth, United States, 40.6658, -74.1913 Tobruk, Libya, 32.0833, 23.9500 Yima, China, 34.7469, 111.8750 Stamford, United States, 41.1039, -73.5585 Jicheon, Korea, South, 36.1333, 128.1000 Ebina, Japan, 35.4464, 139.3908 Floridablanca, Philippines, 14.9740, 120.5280 Racine, United States, 42.7274, -87.8135 Gitega, Burundi, -3.4283, 29.9250 Rionegro, Colombia, 6.1535, -75.3743 Nkongsamba, Cameroon, 4.9500, 9.9333 Raigarh, India, 21.8974, 83.3950 Ahuachapan, El Salvador, 13.9167, -89.8500 Tay Ninh, Vietnam, 11.3678, 106.1189 Tizi Ouzou, Algeria, 36.7167, 4.0500 Agboville, Côte d’Ivoire, 5.9333, -4.2167 Haraipur, India, 26.2200, 84.3600 Siwan, India, 26.2200, 84.3600 Kent, United States, 47.3887, -122.2128 Maldonado, Uruguay, -34.9000, -54.9500 Ipetumodu, Nigeria, 7.4999, 4.4472 Ruhengeri, Rwanda, -1.5000, 29.6333 Maia, Portugal, 41.2333, -8.6167 Shahreza, Iran, 32.0122, 51.8594 Zabol, Iran, 31.0339, 61.4878 Inazawa, Japan, 35.2647, 136.7969 Pyay, Burma, 18.8165, 95.2114 Parla, Spain, 40.2372, -3.7742 Amiens, France, 49.8920, 2.2990 Djakotome, Benin, 6.9000, 1.7167 El Oued, Algeria, 33.3611, 6.8606 Moron, Mongolia, 49.6375, 100.1614 Bern, Switzerland, 46.9480, 7.4474 Castanhal, Brazil, -1.2969, -47.9219 Ashqelon, Israel, 31.6658, 34.5664 Mabacun, China, 24.6771, 113.5858 Laghouat, Algeria, 33.8028, 2.8750 Livingstone, Zambia, -17.8500, 25.8667 Salto, Brazil, -23.2008, -47.2869 Sibiu, Romania, 45.7928, 24.1519 Brighton, United Kingdom, 50.8208, -0.1375 Zafarwal, Pakistan, 32.3500, 74.9000 Londuimbali, Angola, -12.2419, 15.3133 Santa Rita, Venezuela, 10.2003, -67.5514 Cameta, Brazil, -2.2439, -49.4958 Dumaguete City, Philippines, 9.3103, 123.3081 Berezniki, Russia, 59.4167, 56.7833 Marianao, Cuba, 23.0833, -82.4333 Sale, United Kingdom, 53.4240, -2.3220 Yakima, United States, 46.5923, -120.5496 Luuq, Somalia, 3.8005, 42.5500 Ba Don, Vietnam, 17.7547, 106.4231 Coral Springs, United States, 26.2702, -80.2591 Gubeng, Indonesia, -7.2729, 112.7493 Daraga, Philippines, 13.1619, 123.6939 Famalicao, Portugal, 41.4144, -8.5222 Tiraspol, Moldova, 46.8500, 29.6333 Ruda Slaska, Poland, 50.2628, 18.8536 Idfu, Egypt, 24.9781, 32.8789 Rybnik, Poland, 50.0833, 18.5500 Serpukhov, Russia, 54.9167, 37.4000 Tokha, Nepal, 27.7500, 85.3333 Kalol, India, 23.2460, 72.4960 Larache, Morocco, 35.1833, -6.1500 San Andres, Philippines, 14.5739, 121.0039 Marituba, Brazil, -10.2833, -36.4000 Dong Hoi, Vietnam, 17.4831, 106.5997 Peristeri, Greece, 38.0167, 23.6833 Yunxian Chengguanzhen, China, 32.8082, 110.8136 Madinat Hamad, Bahrain, 26.1128, 50.5139 Renca, Chile, -33.4000, -70.7167 Segou, Mali, 13.4500, -6.2667 Jau, Brazil, -22.2958, -48.5578 Tando Allahyar, Pakistan, 25.4617, 68.7167 Thandwe, Burma, 18.4667, 94.3667 Sterling Heights, United States, 42.5809, -83.0305 Hagonoy, Philippines, 14.8300, 120.7300 Hassan, India, 13.0120, 76.0680 Bingol, Turkey, 38.8861, 40.5017 Batu Gajah, Malaysia, 4.4692, 101.0411 Matagalpa, Nicaragua, 12.9167, -85.9167 Olmaliq, Uzbekistan, 40.8500, 69.6000 Lalitpur, India, 24.6900, 78.4100 Conchali, Chile, -33.3833, -70.6750 Santa Cruz do Sul, Brazil, -29.7178, -52.4258 Long Binh, Vietnam, 10.9458, 106.8775 Pitalito, Colombia, 1.8989, -76.0419 Bibemi, Cameroon, 9.3167, 13.8833 Naga, Philippines, 10.2200, 123.7500 Billings, United States, 45.7891, -108.5526 Porto-Novo, Benin, 6.4972, 2.6050 Uppsala, Sweden, 59.8601, 17.6400 Yalova, Turkey, 40.6556, 29.2750 Bloomington, United States, 40.4757, -88.9703 Khorramshahr, Iran, 30.4394, 48.1817 Charleston, United States, 38.3484, -81.6322 Ibirite, Brazil, -20.0219, -44.0589 Tarime, Tanzania, -1.3500, 34.3833 Crato, Brazil, -7.2342, -39.4094 Male, Maldives, 4.1753, 73.5089 Paramagudi, India, 9.5494, 78.5891 Milton, Canada, 43.5083, -79.8833 M'Sila, Algeria, 35.7019, 4.5472 Sripur, Bangladesh, 24.2000, 90.4731 Duitama, Colombia, 5.8333, -73.0167 Kipushi, Congo (Kinshasa), -11.7625, 27.2500 Gondia, India, 21.4598, 80.1950 Zhangmu Touwei, China, 22.9149, 114.0833 Schaarbeek, Belgium, 50.8675, 4.3736 Luxembourg, Luxembourg, 49.6117, 6.1319 Carrollton, United States, 32.9890, -96.8999 Odemis, Turkey, 38.2311, 27.9719 Kozan, Turkey, 37.4500, 35.8000 Rehovot, Israel, 31.8914, 34.8078 Silifke, Turkey, 36.3761, 33.9322 San Carlos, Philippines, 10.4929, 123.4095 Sao Mateus, Brazil, -18.7201, -39.8589 Dalupura, India, 28.6004, 77.3194 Mogaung, Burma, 25.3014, 96.9417 Kingston, Canada, 44.3128, -76.4553 Obninsk, Russia, 55.0931, 36.6106 Centro Habana, Cuba, 23.1348, -82.3701 Unye, Turkey, 41.1272, 37.2881 Zagnanado, Benin, 7.2667, 2.3500 Adonara, Indonesia, -8.2500, 123.1500 Talavera, Philippines, 15.5839, 120.9189 Rustavi, Georgia, 41.5436, 45.0117 Kolomna, Russia, 55.0833, 38.7833 Okigwe, Nigeria, 5.4830, 7.5500 San Juan, Dominican Republic, 18.8100, -71.2300 Aware, Ethiopia, 8.2667, 44.1500 Naryai ka Puri, India, 26.5200, 78.3500 Surat Thani, Thailand, 9.1397, 99.3306 Furth, Germany, 49.4667, 11.0000 Blitar, Indonesia, -8.1000, 112.1500 Neftekamsk, Russia, 56.1028, 54.2867 Palwal, India, 28.1447, 77.3255 Ome, Japan, 35.7880, 139.2758 Ibarra, Ecuador, 0.3627, -78.1307 Barreiras, Brazil, -12.1528, -44.9900 Chicomba, Angola, -14.1333, 14.9167 Punto Fijo, Venezuela, 11.7167, -70.1833 Papeete, French Polynesia, -17.5334, -149.5667 Vasteras, Sweden, 59.6173, 16.5422 Cubatao, Brazil, -23.8953, -46.4256 Conselheiro Lafaiete, Brazil, -20.6600, -43.7858 Tultepec, Mexico, 19.6850, -99.1281 Jijel, Algeria, 36.8167, 5.7500 Isahaya, Japan, 32.8433, 130.0531 Leuwiliang, Indonesia, -6.5742, 106.6320 Buea, Cameroon, 4.1667, 9.2333 Annecy, France, 45.9160, 6.1330 Itapipoca, Brazil, -3.4939, -39.5789 Spanish Town, Jamaica, 17.9959, -76.9551 Villa Mercedes, Argentina, -33.6667, -65.4667 Tyler, United States, 32.3184, -95.3062 Lam Tin, Hong Kong, 22.3094, 114.2361 Palghat, India, 10.7750, 76.6510 Atyrau, Kazakhstan, 47.1167, 51.8833 Cizre, Turkey, 37.3320, 42.1870 Araras, Brazil, -22.3569, -47.3839 Maijdi, Bangladesh, 22.8667, 91.1000 Kusadasi, Turkey, 37.8597, 27.2597 Vlore, Albania, 40.4500, 19.4833 Quibdo, Colombia, 5.6922, -76.6581 Marand, Iran, 38.4308, 45.7742 Bassila, Benin, 9.0167, 1.6667 Thaton, Burma, 16.9250, 97.3667 Zama, Japan, 35.4833, 139.4000 Shuangcheng, China, 45.3503, 126.2800 Narita, Japan, 35.7767, 140.3183 Lao Cai, Vietnam, 22.4806, 103.9750 Trinidad, Bolivia, -14.8292, -64.9014 Innsbruck, Austria, 47.2683, 11.3933 Udon Thani, Thailand, 17.4167, 102.7500 Angono, Philippines, 14.5234, 121.1536 Silay, Philippines, 10.8000, 122.9700 Anand, India, 22.5560, 72.9510 Jiroft, Iran, 28.6797, 57.7447 City of Isabela, Philippines, 6.7000, 121.9700 Nantou, China, 22.7217, 113.2926 Los Guayos, Venezuela, 10.1833, -67.9333 Arcahaie, Haiti, 18.7702, -72.5123 Botad, India, 22.1700, 71.6700 Abiko, Japan, 35.8667, 140.0333 Tabarre, Haiti, 18.5833, -72.2667 Baiyashi, China, 26.4019, 111.2864 Amherst, United States, 43.0117, -78.7570 Lincoln, United Kingdom, 53.2283, -0.5389 Mojokerto, Indonesia, -7.4722, 112.4336 Onomichi, Japan, 34.4167, 133.2000 Apucarana, Brazil, -23.5508, -51.4608 Jamundi, Colombia, 3.2667, -76.5500 Relizane, Algeria, 35.7333, 0.5500 Heilbronn, Germany, 49.1500, 9.2167 Polokwane, South Africa, -23.9000, 29.4500 Cili, China, 29.4225, 111.1219 Battambang, Cambodia, 13.1028, 103.1983 Ulm, Germany, 48.4000, 9.9833 Iowa City, United States, 41.6559, -91.5303 Mataro, Spain, 41.5333, 2.4500 Mardin, Turkey, 37.3131, 40.7350 Mukerian, India, 31.9500, 75.6200 Zwolle, Netherlands, 52.5167, 6.1000 Girardot, Colombia, 4.3050, -74.8017 Johnson City, United States, 36.3406, -82.3806 Sam Son, Vietnam, 19.7333, 105.9000 Idanre, Nigeria, 7.0922, 5.1322 Vespasiano, Brazil, -19.6919, -43.9233 Limoges, France, 45.8353, 1.2625 Ponnagyun, Burma, 20.3342, 93.0039 Hanumangarh, India, 29.5800, 74.3200 Jetpur, India, 21.7542, 70.6222 Arcot, India, 12.9047, 79.3238 Kokubunji, Japan, 35.7109, 139.4622 Kanchrapara, India, 22.9456, 88.4332 Parepare, Indonesia, -4.0167, 119.6236 Ituzaingo, Argentina, -34.6667, -58.6667 Cienaga, Colombia, 11.0069, -74.2500 Chinguar, Angola, -12.5500, 16.3333 Ferrara, Italy, 44.8353, 11.6199 Zhangbei, China, 41.1580, 114.7122 Antsiranana, Madagascar, -12.2765, 49.3115 Akcaabat, Turkey, 41.0167, 39.5500 Longjing, China, 42.7667, 129.4333 Santa Clara, United States, 37.3646, -121.9680 Tottenham, United Kingdom, 51.5975, -0.0681 Charallave, Venezuela, 10.2431, -66.8622 Mansa, Zambia, -11.2000, 28.8833 Jamaame, Somalia, 0.0722, 42.7506 Petapa, Guatemala, 14.5000, -90.5667 Chech'on, Korea, South, 37.1333, 128.2167 Bamban, Philippines, 15.2742, 120.5669 Harar, Ethiopia, 9.3111, 42.1278 Pforzheim, Germany, 48.8950, 8.7050 Sarhari, Pakistan, 26.1000, 68.4833 Guadalajara de Buga, Colombia, 3.9000, -76.3019 Dortyol, Turkey, 36.8428, 36.2244 Ciudad Ojeda, Venezuela, 10.2000, -71.3000 Braganca, Brazil, -1.0536, -46.7656 Mubi, Nigeria, 10.2667, 13.2667 Guagua, Philippines, 14.9700, 120.6300 Kovrov, Russia, 56.3683, 41.3108 Songnim, Korea, North, 38.7542, 125.6450 Bat Yam, Israel, 32.0231, 34.7503 Osaki, Japan, 38.5771, 140.9556 Bellingham, United States, 48.7548, -122.4690 Norman, United States, 35.2335, -97.3471 Coeur d'Alene, United States, 47.7040, -116.7936 Santo Tomas, Philippines, 7.5300, 125.6200 Orebro, Sweden, 59.2669, 15.1965 Puno, Peru, -15.8433, -70.0236 Hoshangabad, India, 22.7475, 77.7274 Tariba, Venezuela, 7.8167, -72.2167 Fengcheng, China, 37.4328, 112.0233 Saida, Algeria, 34.8333, 0.1500 Fort Smith, United States, 35.3495, -94.3695 Polatli, Turkey, 39.5842, 32.1472 Rosario, Philippines, 13.8460, 121.2060 Lewisville, United States, 33.0454, -96.9815 Apatzingan de la Constitucion, Mexico, 19.0886, -102.3508 Wurzburg, Germany, 49.7833, 9.9333 Rudnyy, Kazakhstan, 52.9667, 63.1333 Tuaran, Malaysia, 6.1774, 116.2314 Khanna, India, 30.7000, 76.2200 Ahmadpur East, Pakistan, 29.1439, 71.2592 Wazirabad, Pakistan, 32.4353, 74.1142 Avrankou, Benin, 6.5500, 2.6667 Dover, United States, 39.1610, -75.5202 Vihari, Pakistan, 30.0419, 72.3528 Mosquera, Colombia, 4.7078, -74.2328 Dongsheng, China, 22.4889, 113.2069 Garut, Indonesia, -7.2167, 107.9000 Votorantim, Brazil, -23.5469, -47.4378 Buon Ho, Vietnam, 12.8544, 108.2703 Abaji, Nigeria, 8.4756, 6.9433 Cua, Venezuela, 10.1667, -66.8833 Salmas, Iran, 38.2028, 44.7669 Yuba City, United States, 39.1357, -121.6383 Edremit, Turkey, 38.4242, 43.2561 Jazan, Saudi Arabia, 16.8892, 42.5611 Santa Lucia Cotzumalguapa, Guatemala, 14.3500, -91.0167 Guimba, Philippines, 15.6606, 120.7650 Worcester, South Africa, -33.6450, 19.4436 Latina, Italy, 41.4672, 12.9036 Zhaozhou, China, 37.7527, 114.7775 Dessalines, Haiti, 19.2618, -72.5161 San Ignacio, Peru, -5.1456, -79.0017 Ciudad Sandino, Nicaragua, 12.1655, -86.3579 Allada, Benin, 6.6500, 2.1500 Iwakuni, Japan, 34.1664, 132.2189 Nagda, India, 23.4564, 75.4131 Bam, Iran, 29.0994, 58.3436 Lehigh Acres, United States, 26.6120, -81.6388 Opole, Poland, 50.6667, 17.9333 Kayes, Mali, 14.4497, -11.4367 Paranagua, Brazil, -25.5208, -48.5094 Koforidua, Ghana, 6.1000, -0.2667 Seto, Japan, 35.2236, 137.0842 Wolfsburg, Germany, 52.4231, 10.7872 Omiyacho, Japan, 35.2221, 138.6216 Misserete, Benin, 6.5625, 2.5853 Koganei, Japan, 35.6995, 139.5030 Salerno, Italy, 40.6806, 14.7594 Oume, Côte d’Ivoire, 6.3833, -5.4167 Torrejon de Ardoz, Spain, 40.4614, -3.4978 Abilene, United States, 32.4543, -99.7384 Saidpur, Bangladesh, 25.7833, 88.9000 Derbent, Russia, 42.0578, 48.2889 Nahiyat Khan Bani Sa`d, Iraq, 33.5656, 44.5435 Leiria, Portugal, 39.7431, -8.8069 Sertaozinho, Brazil, -21.1378, -47.9900 Hardoi, India, 27.4200, 80.1200 Delgado, El Salvador, 13.7167, -89.1667 Cabo Frio, Brazil, -22.8789, -42.0189 Nemby, Paraguay, -25.3940, -57.5398 Lucheng, China, 29.9985, 101.9569 Kamez, Albania, 41.3833, 19.7667 Fatsa, Turkey, 41.0306, 37.5000 Santa Cruz, Philippines, 14.5998, 120.9802 Guelmim, Morocco, 28.9833, -10.0667 Bokhtar, Tajikistan, 37.8364, 68.7803 Fuyuan, China, 48.3647, 134.3079 Nefteyugansk, Russia, 61.0833, 72.7000 Gurabo al Medio, Dominican Republic, 19.4739, -70.6727 Ajax, Canada, 43.8583, -79.0364 Barcarena, Brazil, -1.5058, -48.6258 Catabola, Angola, -12.1167, 17.3000 Villa Alemana, Chile, -33.0422, -71.3733 My Drarga, Morocco, 30.3800, -9.4800 Simi Valley, United States, 34.2663, -118.7490 Kislovodsk, Russia, 43.9167, 42.7167 Suhum, Ghana, 6.0409, -0.4500 Jandira, Brazil, -23.5278, -46.9028 San Juan, Philippines, 14.6040, 121.0300 Nazran, Russia, 43.2167, 44.7667 Altamira, Brazil, -3.2028, -52.2058 Guntakal, India, 15.1700, 77.3800 Iizuka, Japan, 33.6467, 130.6911 Pithampur, India, 22.6197, 75.6933 Pearland, United States, 29.5581, -95.3218 Jijiga, Ethiopia, 9.3500, 42.8000 Kenosha, United States, 42.5865, -87.8773 Rosetta, Egypt, 31.4014, 30.4194 Giresun, Turkey, 40.9153, 38.3894 San Fernando, Philippines, 16.6200, 120.3200 Kastamonu, Turkey, 41.3764, 33.7764 Payakumbuh, Indonesia, -0.2333, 100.6333 Arecibo, Puerto Rico, 18.4491, -66.7387 Patan, India, 23.8500, 72.1250 Luleburgaz, Turkey, 41.4056, 27.3569 Karabuk, Turkey, 41.1986, 32.6264 Bonao, Dominican Republic, 18.9500, -70.4100 Barbacena, Brazil, -21.2258, -43.7739 Zoetermeer, Netherlands, 52.0667, 4.5000 Basirhat, India, 22.6572, 88.8942 Resende, Brazil, -22.4689, -44.4469 Raxaul, India, 26.9833, 84.8500 Sakiet ed Daier, Tunisia, 34.8000, 10.7800 Nzega, Tanzania, -4.2169, 33.1864 Gashua, Nigeria, 12.8681, 11.0464 Az Zulfi, Saudi Arabia, 26.2994, 44.8154 Jilib, Somalia, 0.4883, 42.7853 Cerro, Cuba, 23.0881, -82.3950 Bataysk, Russia, 47.1667, 39.7333 Algeciras, Spain, 36.1275, -5.4539 Halisahar, India, 22.9469, 88.4184 Magelang, Indonesia, -7.4667, 110.2167 Jagadhri, India, 30.1680, 77.3010 Tychy, Poland, 50.1236, 18.9867 Meridian, United States, 43.6116, -116.3977 Juticalpa, Honduras, 14.6672, -86.2196 Jizhou, China, 37.5455, 115.5663 Ksar El Kebir, Morocco, 35.0090, -5.9000 Koidu, Sierra Leone, 8.6439, -10.9717 Guarapari, Brazil, -20.6578, -40.5108 Yeebo Town, Liberia, 5.2500, -7.9167 Sunam, India, 30.1300, 75.8000 Ouahigouya, Burkina Faso, 13.5833, -2.4167 Rishra, India, 22.7100, 88.3500 Grand-Bassam, Côte d’Ivoire, 5.2000, -3.7333 Jharsugra, India, 21.8500, 84.0300 Leeuwarden, Netherlands, 53.2000, 5.7833 Ben Tre, Vietnam, 10.2333, 106.3833 Glazoue, Benin, 7.9736, 2.2400 Ovalle, Chile, -30.6000, -71.2000 Chinautla, Guatemala, 14.7000, -90.5000 New Mirpur, Pakistan, 33.1500, 73.7333 Chia, Colombia, 4.8500, -74.0500 Pinsk, Belarus, 52.1153, 26.1031 Round Rock, United States, 30.5270, -97.6642 Mogi Guacu, Brazil, -22.3719, -46.9419 Magalang, Philippines, 15.2200, 120.6700 Waldorf, United States, 38.6085, -76.9194 Exeter, United Kingdom, 50.7256, -3.5269 Bimbo, Central African Republic, 4.2558, 18.4042 Pali, India, 23.3500, 81.0500 Kuopio, Finland, 62.8925, 27.6783 Baleraja, Indonesia, -6.5167, 107.9169 Leiden, Netherlands, 52.1600, 4.4900 Fugu, China, 39.0259, 111.0683 Savannakhet, Laos, 16.5500, 104.7500 Temple, United States, 31.1068, -97.3891 Magangue, Colombia, 9.2500, -74.7667 Nevsehir, Turkey, 38.6264, 34.7139 Cambridge, United Kingdom, 52.2050, 0.1225 Kirishima, Japan, 31.7411, 130.7633 Cai Lay, Vietnam, 10.4170, 106.0830 Maicao, Colombia, 11.3778, -72.2389 Pobe, Benin, 6.9667, 2.6833 Akcakale, Turkey, 36.7108, 38.9478 Giugliano in Campania, Italy, 40.9283, 14.2011 Lynchburg, United States, 37.4003, -79.1909 Dongfeng, China, 22.6904, 113.2460 Paleng, Indonesia, -1.4000, 123.1667 Santa Cruz, Philippines, 14.2800, 121.4200 Djidja, Benin, 7.3333, 1.9333 Duma, Syria, 33.5833, 36.4000 Longtian, China, 34.9000, 106.8500 Punta Arenas, Chile, -53.1667, -70.9333 Rubtsovsk, Russia, 51.5167, 81.2000 Soke, Turkey, 37.7508, 27.4103 Tres Lagoas, Brazil, -20.7876, -51.7034 Rochester, United States, 44.0154, -92.4780 Nandgaon, India, 20.3070, 74.6570 Orizaba, Mexico, 18.8500, -97.1000 Bento Goncalves, Brazil, -29.1708, -51.5189 Baraki, Algeria, 36.6667, 3.1000 Cherkessk, Russia, 44.2167, 42.0500 Ariana, Tunisia, 36.8625, 10.1956 Alwal, India, 17.5047, 78.5038 Gapan, Philippines, 15.3122, 120.9489 Kaya, Burkina Faso, 13.0833, -1.0833 Ed Damer, Sudan, 17.5900, 33.9600 Munch'on, Korea, North, 39.259, 127.356 Gexianzhuang, China, 37.0694, 115.6591 Logan, United States, 41.7399, -111.8422 Kilifi, Kenya, -3.6333, 39.8500 Romford, United Kingdom, 51.5768, 0.1801 Arvada, United States, 39.8320, -105.1510 Dimapur, India, 25.9092, 93.7266 Shiyan, China, 23.1251, 113.8633 Pati, Indonesia, -6.7415, 111.0347 Yuanlin, Taiwan, 23.9611, 120.5736 Bayawan, Philippines, 9.3700, 122.8000 Clovis, United States, 36.8278, -119.6830 Skhirate, Morocco, 33.8500, -7.0300 Hoima, Uganda, 1.4319, 31.3525 San Pedro Garza Garcia, Mexico, 25.6667, -100.3000 Bayan Lepas, Malaysia, 5.2999, 100.2605 Ciudad Hidalgo, Mexico, 19.6917, -100.5536 Behbahan, Iran, 30.5942, 50.2433 Itatiba, Brazil, -23.0058, -46.8389 Barretos, Brazil, -20.5569, -48.5678 Ise, Japan, 34.4833, 136.7167 Puerto Cortes, Honduras, 15.8833, -87.9500 Maina, Guam, 13.4692, 144.7332 Indramayu, Indonesia, -6.3528, 108.3242 Tam Ky, Vietnam, 15.5667, 108.4833 Uruma, Japan, 26.3792, 127.8575 Sarangapuram, India, 18.9447, 78.9936 Eregli, Turkey, 41.2792, 31.4208 Bhadrakh, India, 21.0545, 86.5156 Leon, Spain, 42.6056, -5.5700 Gyumri, Armenia, 40.7894, 43.8475 Independence, United States, 39.0871, -94.3501 Dharmavaram, India, 14.4300, 77.7200 Colchester, United Kingdom, 51.8917, 0.9030 Sanjiao, China, 22.6856, 113.4272 Monza, Italy, 45.5836, 9.2736 Chinandega, Nicaragua, 12.6167, -87.1500 Metz, France, 49.1203, 6.1778 Faridpur, Bangladesh, 23.5986, 89.8353 Linjiang, China, 41.8167, 126.9167 Springs, South Africa, -26.2547, 28.4428 Dorud, Iran, 33.4994, 49.0531 Kashiwara, Japan, 34.5094, 135.8092 Ondjiva, Angola, -17.0667, 15.7333 Alberton, South Africa, -26.2672, 28.1219 Yessentuki, Russia, 44.0333, 42.8500 Temperley, Argentina, -34.7667, -58.3833 Waterloo, Canada, 43.4667, -80.5167 Dordrecht, Netherlands, 51.7958, 4.6783 Kamalia, Pakistan, 30.7333, 72.6500 Tsuruoka, Japan, 38.7272, 139.8267 Lianhe, China, 47.1314, 129.2906 Ar Rass, Saudi Arabia, 25.8694, 43.4973 Port-de-Paix, Haiti, 19.9500, -72.8333 Wuling, China, 39.4421, 114.2300 Chon Thanh, Vietnam, 11.4292, 106.6572 Ambikapur, India, 23.1200, 83.2000 Puruliya, India, 23.3400, 86.3600 Mit Ghamr, Egypt, 30.7192, 31.2628 Tabuk, Philippines, 17.4069, 121.4425 Kirikhan, Turkey, 36.4975, 36.3608 Sassari, Italy, 40.7267, 8.5592 Ghazipur, India, 25.5800, 83.5700 Ch'ungmu, Korea, South, 34.8333, 128.4167 Apartado, Colombia, 7.8833, -76.6333 Tumen, China, 42.9667, 129.8500 Perpignan, France, 42.6986, 2.8956 Thanh Pho Uong Bi, Vietnam, 21.0356, 106.7644 Jima, Ethiopia, 7.6667, 36.8333 Genhe, China, 50.7833, 121.5167 Navojoa, Mexico, 27.0813, -109.4461 Anderlecht, Belgium, 50.8333, 4.3333 Redding, United States, 40.5698, -122.3650 Winterveld, South Africa, -25.4200, 27.9490 Lahti, Finland, 60.9833, 25.6500 Chilapa de Alvarez, Mexico, 17.5944, -99.1778 Gafsa, Tunisia, 34.4225, 8.7842 Coatepeque, Guatemala, 14.7000, -91.8667 Bagaha, India, 27.0992, 84.0900 Mus, Turkey, 38.7333, 41.4911 Catchiungo, Angola, -12.5667, 16.2333 Nakhon Pathom, Thailand, 13.8206, 100.0625 Pingshan, China, 38.2506, 114.1969 Kotamobagu, Indonesia, 0.7333, 124.3167 Greenville, United States, 35.5943, -77.3760 Gurdaspur, India, 32.0333, 75.4000 Ky Anh, Vietnam, 18.0678, 106.2967 Novocheboksarsk, Russia, 56.1333, 47.5000 Pelabuhanratu, Indonesia, -6.9878, 106.5439 Kot Addu, Pakistan, 30.4664, 70.9656 Duluth, United States, 46.7756, -92.1393 Tindivanam, India, 12.2267, 79.6504 Honmachi, Japan, 32.5075, 130.6017 Ramos Mejia, Argentina, -34.6500, -58.5667 Gottingen, Germany, 51.5339, 9.9356 High Wycombe, United Kingdom, 51.6287, -0.7482 Gemlik, Turkey, 40.4317, 29.1561 Maastricht, Netherlands, 50.8667, 5.6833 Berkeley, United States, 37.8722, -122.2760 Boulogne-Billancourt, France, 48.8352, 2.2409 Khurda, India, 20.1800, 85.6200 Boulder, United States, 40.0248, -105.2524 Poblacion, Philippines, 14.3854, 121.0290 Kandy, Sri Lanka, 7.2931, 80.6350 Midyat, Turkey, 37.4167, 41.3697 Ban Bang Pu Mai, Thailand, 13.5204, 100.6660 Besancon, France, 47.2400, 6.0200 Gateshead, United Kingdom, 54.9556, -1.6000 Pueblo, United States, 38.2701, -104.6114 Guelma, Algeria, 36.4500, 7.4333 Baraka, Congo (Kinshasa), -4.1041, 29.0940 Ghardaia, Algeria, 32.4833, 3.6667 Hengken, India, 24.3460, 93.7000 Nokha, India, 27.6000, 73.4200 Jandrapeta, India, 15.8246, 80.3521 Unwana, Nigeria, 5.8625, 7.9486 Ar Rustaq, Oman, 23.3908, 57.4244 Mariupol, Ukraine, 47.0958, 37.5494 Dong Hoa, Vietnam, 12.9931, 109.3314 Gorzow Wielkopolski, Poland, 52.7333, 15.2500 Terrebonne, Canada, 45.7000, -73.6333 Lalo, Benin, 6.9167, 1.8833 Yelahanka, India, 13.1007, 77.5963 Ghotki, Pakistan, 28.1000, 69.1900 Kwekwe, Zimbabwe, -18.9167, 29.8167 Malindi, Kenya, -3.2100, 40.1000 Rize, Turkey, 41.0247, 40.5222 Almirante Tamandare, Brazil, -25.3250, -49.3100 Ebetsu, Japan, 43.1000, 141.5333 Moncton, Canada, 46.1328, -64.7714 Palma Soriano, Cuba, 20.2139, -75.9919 An, Burma, 19.7833, 94.0333 Suceava, Romania, 47.6514, 26.2556 Jiangna, China, 23.6092, 104.3731 Pleven, Bulgaria, 43.4167, 24.6167 Fulgazi, Bangladesh, 23.1461, 91.4409 Bergamo, Italy, 45.6950, 9.6700 Shuixi, China, 22.5090, 113.3213 Sanxi, China, 22.5111, 113.3161 Nazarabad, Iran, 35.9561, 50.6044 West Palm Beach, United States, 26.7469, -80.1320 Candaba, Philippines, 15.0933, 120.8283 Namakkal, India, 11.2167, 78.1667 Parow, South Africa, -33.9000, 18.6000 Tizayuca, Mexico, 19.8333, -98.9833 Mohammad Shahr, Iran, 35.7533, 50.9014 Port Dickson, Malaysia, 2.5228, 101.7959 Angra dos Reis, Brazil, -23.0069, -44.3178 Arapongas, Brazil, -23.4189, -51.4239 Dolgoprudnyy, Russia, 55.9333, 37.5000 Guaratingueta, Brazil, -22.8167, -45.2278 Slough, United Kingdom, 51.5084, -0.5881 Tuz Khurmatu, Iraq, 34.8881, 44.6325 Aw Dheegle, Somalia, 1.9775, 44.8325 Birigui, Brazil, -21.2889, -50.3400 Totonicapan, Guatemala, 14.9108, -91.3606 Huaraz, Peru, -9.5333, -77.5333 Daitocho, Japan, 34.7167, 135.6167 Darjeeling, India, 27.0375, 88.2631 Piraquara, Brazil, -25.4419, -49.0628 Bottrop, Germany, 51.5247, 6.9228 Bet Shemesh, Israel, 31.7514, 34.9886 Bismil, Turkey, 37.8467, 40.6661 Vihiga, Kenya, 0.0369, 34.7101 Berrouaghia, Algeria, 36.1333, 2.9167 Pescara, Italy, 42.4643, 14.2142 Hung Yen, Vietnam, 20.6464, 106.0511 Rundu, Namibia, -17.9167, 19.7667 Miramar, Mexico, 22.3375, -97.8694 Soasio, Indonesia, 0.6833, 127.4000 Sopur, India, 34.3000, 74.4700 Nowshera, Pakistan, 34.0153, 71.9747 Bandar-e Anzali, Iran, 37.4708, 49.4700 Reutlingen, Germany, 48.4833, 9.2167 Bruges, Belgium, 51.2089, 3.2242 Yongqing, China, 39.2958, 116.4897 Calumpit, Philippines, 14.9200, 120.7700 Iguala de la Independencia, Mexico, 18.3450, -99.5383 Bwana Mkubwa, Zambia, -12.9833, 28.7000 Butwal, Nepal, 27.7000, 83.4500 Senador Canedo, Brazil, -16.7081, -49.0931 Burlington, United States, 44.4876, -73.2316 Chikmagalur, India, 13.3130, 75.7370 Seaside, United States, 36.6224, -121.8199 Matamoros, Mexico, 25.5330, -103.2500 Kadoma, Japan, 34.7333, 135.5833 Yangliuqing, China, 39.1300, 117.0142 Richardson, United States, 32.9716, -96.7093 Xuqiaocun, China, 30.4274, 120.3866 Kampong Cham, Cambodia, 12.0000, 105.4500 Dinalupihan, Philippines, 14.8800, 120.4700 Malita, Philippines, 6.4108, 125.6144 Gudivada, India, 16.4300, 80.9900 Bama, Nigeria, 11.5189, 13.6842 Quyang, China, 26.5755, 109.7008 Ilobu, Nigeria, 7.8400, 4.4860 Ligao, Philippines, 13.2200, 123.5200 Trento, Italy, 46.0667, 11.1167 Nouadhibou, Mauritania, 20.9333, -17.0333 Dongsheng, China, 22.6228, 113.2917 Amreli, India, 21.6006, 71.2164 Blackburn, United Kingdom, 53.7480, -2.4820 Phagwara, India, 31.2200, 75.7700 Bage, Brazil, -31.3308, -54.1069 Aizuwakamatsu, Japan, 37.4948, 139.9298 Tahoua, Niger, 14.9000, 5.2599 Matsubara, Japan, 34.5833, 135.5500 Araguari, Brazil, -18.6489, -48.1869 Erlangen, Germany, 49.5833, 11.0167 Cambridge, United States, 42.3759, -71.1185 Gogounou, Benin, 10.8386, 2.8361 Agadez, Niger, 16.9959, 7.9828 Saanich, Canada, 48.4840, -123.3810 Nobeoka, Japan, 32.5822, 131.6650 Uribia, Colombia, 11.9167, -72.0000 Beni Yakhlef, Morocco, 33.6555, -7.3221 Vitoria de Santo Antao, Brazil, -8.1264, -35.3075 Banyuwangi, Indonesia, -8.2186, 114.3669 Handa, Japan, 34.8919, 136.9381 Monroe, United States, 32.5185, -92.0774 Salman Bak, Iraq, 33.1020, 44.5835 Catacamas, Honduras, 14.8484, -85.8936 North Charleston, United States, 32.9067, -80.0722 Badin, Pakistan, 24.6572, 68.8406 Saginaw, United States, 43.4199, -83.9501 Midsayap, Philippines, 7.1900, 124.5300 Heroica Guaymas, Mexico, 27.9183, -110.8989 Munuf, Egypt, 30.4667, 30.9333 Uruguaiana, Brazil, -29.7550, -57.0878 Banfora, Burkina Faso, 10.6308, -4.7589 Harshin, Ethiopia, 9.2167, 43.5878 Novomoskovsk, Russia, 54.0833, 38.2167 Adilabad, India, 19.6700, 78.5300 Apalit, Philippines, 14.9496, 120.7587 Yulu, China, 23.4760, 116.3978 Umuarama, Brazil, -23.7658, -53.3250 Helong, China, 42.5436, 129.0028 Clearwater, United States, 27.9790, -82.7623 Alcobendas, Spain, 40.5333, -3.6333 Cassongue, Angola, -11.8333, 15.0000 Faqus, Egypt, 30.7282, 31.7970 Dabrowa Gornicza, Poland, 50.3214, 19.1872 The Woodlands, United States, 30.1738, -95.5134 Baripada, India, 21.9400, 86.7200 Linkoping, Sweden, 58.4094, 15.6257 Soreang, Indonesia, -7.0372, 107.5167 Konosu, Japan, 36.0659, 139.5222 Samal, Philippines, 7.0500, 125.7300 Datu Odin Sinsuat, Philippines, 7.1889, 124.1839 Manpo, Korea, North, 41.1570, 126.2900 Barcelos, Portugal, 41.5333, -8.6167 Tatui, Brazil, -23.3556, -47.8569 Sidi Yahya Zaer, Morocco, 33.7105, -6.8831 Chimaltenango, Guatemala, 14.6622, -90.8208 La Granja, Chile, -33.5333, -70.6250 Yavatmal, India, 20.2400, 78.0600 Titagarh, India, 22.7400, 88.3700 Macul, Chile, -32.6583, -70.6000 Ikoma, Japan, 34.7000, 135.7000 Honcho, Japan, 35.7580, 139.5299 Barnala, India, 30.3700, 75.5400 Cheltenham, United Kingdom, 51.9000, -2.0667 Forli, Italy, 44.2225, 12.0408 Oktyabr'skiy, Russia, 54.4667, 53.4667 Chittaurgarh, India, 24.8800, 74.6300 Brandon, United States, 27.9367, -82.3000 St. Cloud, United States, 45.5340, -94.1718 Orleans, France, 47.9025, 1.9090 Xai-Xai, Mozambique, -25.0500, 33.6500 Rouen, France, 49.4428, 1.0886 Tecoman, Mexico, 18.9089, -103.8747 Kadoma, Zimbabwe, -18.3400, 29.9000 West Jordan, United States, 40.6024, -112.0008 Boke, Guinea, 10.9400, -14.3000 Coronel, Chile, -37.0167, -73.2167 Narasaraopet, India, 16.2360, 80.0498 Siracusa, Italy, 37.0692, 15.2875 Himamaylan, Philippines, 10.1000, 122.8700 Ocana, Colombia, 8.2333, -73.3500 Ballarat, Australia, -37.5608, 143.8475 Dharan, Nepal, 26.8167, 87.2667 Temixco, Mexico, 18.8500, -99.2333 Bongao, Philippines, 5.0292, 119.7731 Tianmu, China, 39.2003, 117.1431 Ain Beida, Algeria, 35.7833, 7.3833 Karatsu, Japan, 33.4500, 129.9683 Nagahama, Japan, 35.3833, 136.2833 Targu-Mures, Romania, 46.5456, 24.5625 Sogamoso, Colombia, 5.7167, -72.9208 Helsingborg, Sweden, 56.0424, 12.7210 San Tung Chung Hang, Hong Kong, 22.2869, 113.9436 Sabha, Libya, 27.0389, 14.4264 Kyzyl, Russia, 51.7167, 94.4500 Beppu, Japan, 33.2847, 131.4914 Smithtown, United States, 40.8663, -73.2164 Adjaouere, Benin, 7.0000, 2.6167 Ra's al Khaymah, United Arab Emirates, 25.7667, 55.9500 Noksan, Korea, South, 36.2039, 127.0847 Broken Arrow, United States, 36.0380, -95.7806 Chidambaram, India, 11.4070, 79.6912 Urasoe, Japan, 26.2458, 127.7219 Sao Goncalo do Amarante, Brazil, -5.7928, -35.3289 Sri Jayewardenepura Kotte, Sri Lanka, 6.9000, 79.9164 Varzea Paulista, Brazil, -23.2108, -46.8278 Harlingen, United States, 26.1916, -97.6977 Yitong, China, 43.3456, 125.3039 San Ildefonso, Philippines, 15.0789, 120.9419 Tarogong, Indonesia, -7.2150, 107.8856 Kailua, United States, 21.3920, -157.7396 Nasushiobara, Japan, 36.9617, 140.0461 Nusaybin, Turkey, 37.0750, 41.2153 Pedro Juan Caballero, Paraguay, -22.5446, -55.7600 Ribeirao Pires, Brazil, -23.7108, -46.4128 Westminster, United States, 39.8837, -105.0624 Sandvika, Norway, 59.8900, 10.5264 Uzhhorod, Ukraine, 48.6239, 22.2950 Gilroy, United States, 37.0046, -121.5854 Koencho, Japan, 43.8031, 143.8947 Kovilpatti, India, 9.1744, 77.8688 Ar Rumaythah, Iraq, 31.5283, 45.2039 Kasese, Uganda, 0.1867, 30.0881 Richmond, United States, 37.9477, -122.3389 Bijnor, India, 29.3700, 78.1300 Chelmsford, United Kingdom, 51.7300, 0.4800 Nyiregyhaza, Hungary, 47.9558, 21.7168 Puerto Madryn, Argentina, -42.7667, -65.0500 Los Banos, Philippines, 14.1700, 121.2200 Sabara, Brazil, -19.8858, -43.8069 Koblenz, Germany, 50.3597, 7.5978 Mandeville, United States, 30.3751, -90.0904 El Pueblito, Mexico, 20.5397, -100.4414 Thies, Senegal, 14.7916, -16.9249 Sliven, Bulgaria, 42.6833, 26.3333 Saint-Denis, France, 48.9356, 2.3539 Elblag, Poland, 54.1667, 19.4000 Igarassu, Brazil, -7.8339, -34.9058 Guanabacoa, Cuba, 23.1252, -82.3007 Aihua, China, 24.4167, 100.1000 Mendoza, Argentina, -32.8897, -68.8444 Al Mudaybi, Oman, 22.5703, 58.1211 Swabi, Pakistan, 34.1202, 72.4702 Turbaco, Colombia, 10.3500, -75.3333 Ciudad Guzman, Mexico, 19.7000, -103.4667 Tlapacoyan, Mexico, 19.9617, -97.2108 Bu'aale, Somalia, 1.0833, 42.5833 Xiva, Uzbekistan, 41.3814, 60.3611 Niihama, Japan, 33.9667, 133.2833 Utica, United States, 43.0962, -75.2261 Ponce, Puerto Rico, 18.0127, -66.6212 Al Mansurah, Yemen, 12.8531, 44.9722 Amasya, Turkey, 40.6500, 35.8331 League City, United States, 29.4874, -95.1087 Ben Guerir, Morocco, 32.0000, 14.0000 Rawajaya, Indonesia, -7.5800, 108.8828 Port Arthur, United States, 29.8554, -93.9264 Hofu, Japan, 34.0514, 131.5625 Sano, Japan, 36.3145, 139.5783 Lowell, United States, 42.6389, -71.3217 Dam Dam, India, 22.6352, 88.4143 Qiaotou, China, 36.9350, 101.6736 Hatsukaichi, Japan, 34.3483, 132.3317 Bremerhaven, Germany, 53.5500, 8.5833 Bijeljina, Bosnia and Herzegovina, 44.7567, 19.2156 Maghnia, Algeria, 34.8617, -1.7306 East Los Angeles, United States, 34.0326, -118.1691 Shacheng, China, 40.4039, 115.5189 Nevinnomyssk, Russia, 44.6333, 41.9333 Thimphu, Bhutan, 27.4722, 89.6361 Carlsbad, United States, 33.1246, -117.2834 Iriga City, Philippines, 13.4231, 123.4122 Boras, Sweden, 57.7304, 12.9200 Plaridel, Philippines, 14.8869, 120.8569 Catalao, Brazil, -18.1700, -47.9419 Tando Muhammad Khan, Pakistan, 25.1239, 68.5389 Jaramana, Syria, 33.4862, 36.3461 Yoju, Korea, South, 37.3000, 127.6333 Kemalpasa, Turkey, 38.4278, 27.4161 Ambovombe, Madagascar, -25.1754, 46.0882 Sakete, Benin, 6.7364, 2.6581 Alphen aan den Rijn, Netherlands, 52.1333, 4.6667 Lugazi, Uganda, 0.3833, 32.9242 Machakos, Kenya, -1.5167, 37.2667 Elgin, United States, 42.0383, -88.3240 San Juan, Philippines, 13.8260, 121.3960 Bintulu, Malaysia, 3.1664, 113.0360 Tenggarong, Indonesia, -0.4000, 116.9667 Namur, Belgium, 50.4667, 4.8667 Petrzalka, Slovakia, 48.1333, 17.1167 Materi, Benin, 10.6978, 1.0633 Kakegawa, Japan, 34.7687, 137.9984 Zhijiang, China, 27.4409, 109.6780 Kuningan, Indonesia, -6.9764, 108.4844 Waterloo, United States, 42.4918, -92.3522 Quilengues, Angola, -14.0814, 14.0931 Tawau, Malaysia, 4.2710, 117.8960 Poa, Brazil, -23.5286, -46.3450 Iranshahr, Iran, 27.1978, 60.6836 Ifanhim, Benin, 6.6667, 2.7167 Ndali, Benin, 9.8608, 2.7181 Lauro de Freitas, Brazil, -12.8939, -38.3269 Pul-e Khumri, Afghanistan, 35.9500, 68.7000 Fujimino, Japan, 35.8795, 139.5198 Comitan, Mexico, 16.2500, -92.1333 Leominster, United States, 42.5209, -71.7717 Bend, United States, 44.0563, -121.3095 Mungo, Angola, -11.6667, 16.1667 Guiguinto, Philippines, 14.8300, 120.8800 Itabira, Brazil, -19.6189, -43.2269 Shahdadpur, Pakistan, 25.9228, 68.6206 Sa-ch'on, Korea, South, 35.0667, 128.0833 Bukittinggi, Indonesia, -0.3056, 100.3692 Satkhira, Bangladesh, 22.7082, 89.0718 Vejalpur, India, 23.0061, 72.5165 Ait Ali, Morocco, 30.1765, -9.4886 Manolo Fortich, Philippines, 8.3675, 124.8656 Hikone, Japan, 35.2667, 136.2667 Jauharabad, Pakistan, 32.2919, 72.2736 Mangaldan, Philippines, 16.0700, 120.4039 Tokai, Japan, 35.0231, 136.9022 Libmanan, Philippines, 13.6964, 123.0600 Remscheid, Germany, 51.1833, 7.2000 San Carlos de Bariloche, Argentina, -41.1500, -71.3000 Paulo Afonso, Brazil, -9.4078, -38.2219 Tecpan Guatemala, Guatemala, 14.7667, -91.0000 Afdem, Ethiopia, 9.4667, 41.0000 Sioux City, United States, 42.4959, -96.3901 Gresham, United States, 45.5021, -122.4413 Kazo, Japan, 36.1314, 139.6018 Larisa, Greece, 39.6417, 22.4167 Jonkoping, Sweden, 57.7713, 14.1650 Trier, Germany, 49.7567, 6.6414 Longview, United States, 32.5193, -94.7622 Bergisch Gladbach, Germany, 50.9918, 7.1303 Tayabas, Philippines, 14.0200, 121.5800 Al Misrakh, Yemen, 13.4700, 44.0375 Carora, Venezuela, 10.1711, -70.0797 Lomas de Zamora, Argentina, -34.7667, -58.4000 Balangir, India, 20.7200, 83.4800 Lawang, Indonesia, -7.8300, 112.7000 Shegaon, India, 20.7944, 76.6944 Oshu, Japan, 39.1445, 141.1391 Plock, Poland, 52.5500, 19.7000 Nkayi, Zimbabwe, -19.0000, 28.9000 Higashiomi, Japan, 35.1167, 136.2000 Otaru, Japan, 43.1833, 141.0000 Nador, Morocco, 35.1667, -2.9333 Ciudad de la Costa, Uruguay, -34.8167, -55.9500 Santa Lucia, Venezuela, 10.2606, -66.6639 Goth Tando Sumro, Pakistan, 25.4500, 68.7167 Sepatan, Indonesia, -6.1143, 106.5784 Guanare, Venezuela, 9.0436, -69.7489 Magra, India, 22.9793, 88.3748 Madrid, Colombia, 4.7344, -74.2683 Mahasamund, India, 21.1100, 82.1000 Pompano Beach, United States, 26.2428, -80.1312 Rajpura, India, 30.4840, 76.5940 Kilis, Turkey, 36.7167, 37.1167 Mikhaylovsk, Russia, 45.1333, 42.0333 Hezuo, China, 35.0002, 102.9103 La Libertad, Ecuador, -2.2333, -80.9000 Pochuta, Guatemala, 14.5450, -91.0889 Dassa-Zoume, Benin, 7.7500, 2.1833 Akishima, Japan, 35.7057, 139.3535 Bagalkot, India, 16.1817, 75.6958 Osmanabad, India, 18.3194, 76.0736 Esteli, Nicaragua, 13.0833, -86.3500 Jaen, Spain, 37.7667, -3.7711 San Martin, El Salvador, 13.7333, -89.0500 Kouande, Benin, 10.3317, 1.6914 Kalianpur, India, 26.5191, 80.2498 Shujalpur, India, 23.4000, 76.7200 Sahibganj, India, 25.2500, 87.6500 Passos, Brazil, -20.7189, -46.6100 Subic, Philippines, 14.8769, 120.2328 Fujimi, Japan, 35.8566, 139.5492 Baybay, Philippines, 10.6800, 124.8000 Ichinoseki, Japan, 38.9347, 141.1266 Downey, United States, 33.9379, -118.1311 Soma, Turkey, 39.1883, 27.6089 Colatina, Brazil, -19.5389, -40.6308 Bou Saada, Algeria, 36.7524, 4.5833 Alkmaar, Netherlands, 52.6333, 4.7500 Pervouralsk, Russia, 56.9167, 59.9333 Mawanella, Sri Lanka, 7.2519, 80.4453 Daet, Philippines, 14.1142, 122.9564 Nova Lima, Brazil, -19.9858, -43.8469 Recklinghausen, Germany, 51.5850, 7.1619 Araxa, Brazil, -19.5928, -46.9408 Laoag, Philippines, 18.1978, 120.5936 Murrieta, United States, 33.5719, -117.1909 Odintsovo, Russia, 55.6667, 37.2667 Pushkino, Russia, 56.0167, 37.8333 Chilon, Mexico, 17.2333, -92.4167 Chiquimula, Guatemala, 14.7833, -89.5333 Sabara Bangou, Niger, 15.1197, 2.0006 Kayabasi, Turkey, 41.1167, 28.7333 Jawhar, Somalia, 2.7833, 45.5000 Idaho Falls, United States, 43.4871, -112.0362 Santamesa, Philippines, 14.6000, 121.0167 Kasempa, Zambia, -13.4550, 25.8350 Miami Gardens, United States, 25.9433, -80.2426 Champdani, India, 22.8020, 88.3460 Harad, Saudi Arabia, 24.1485, 49.0577 Disa, India, 24.2501, 72.1822 Ariquemes, Brazil, -9.9161, -63.0408 Codo, Brazil, -4.4550, -43.8858 Kasuga, Japan, 33.5328, 130.4703 Everett, United States, 47.9525, -122.1669 Nsukka, Nigeria, 6.8567, 7.3958 Mersa, Ethiopia, 11.6667, 39.6583 Kintampo, Ghana, 8.0563, -1.7306 Nandurbar, India, 21.3700, 74.2500 Purwa Utar, India, 26.0680, 83.1840 Tuzla, Bosnia and Herzegovina, 44.5384, 18.6671 Kaiyun, China, 27.2399, 112.8639 Trujillo, Venezuela, 9.4170, -70.5000 Cadiz, Spain, 36.5350, -6.2975 Holland, United States, 42.7677, -86.0984 Khushab, Pakistan, 32.2986, 72.3508 Puerto Barrios, Guatemala, 15.7133, -88.5899 Fasa, Iran, 28.9503, 53.6272 Rosario, Philippines, 14.4200, 120.8500 Jena, Germany, 50.9272, 11.5861 Montreuil, France, 48.8611, 2.4436 Kiffa, Mauritania, 16.6164, -11.4044 Al Ahad al Masarihah, Saudi Arabia, 16.7098, 42.9550 As Salamiyah, Syria, 35.0113, 37.0532 Sorriso, Brazil, -12.5450, -55.7108 Franceville, Gabon, -1.6333, 13.5833 San Antonio la Isla, Mexico, 19.1677, -99.5542 San Antonio Enchisi, Mexico, 19.7072, -99.7867 Costa Mesa, United States, 33.6667, -117.9135 Socopo, Venezuela, 8.2306, -70.8220 Manzini, Eswatini, -26.4950, 31.3880 Masindi, Uganda, 1.6836, 31.7222 Martinez de la Torre, Mexico, 20.0667, -97.0500 Temecula, United States, 33.4928, -117.1315 Changbang, China, 30.4555, 120.4433 Empangeni, South Africa, -28.7500, 31.9000 Ferozepore, India, 30.9166, 74.6000 Baneh, Iran, 35.9969, 45.8853 Itele, Nigeria, 6.7667, 4.0625 Rochdale, United Kingdom, 53.6100, -2.1600 Jeonghae, Korea, South, 35.5667, 126.8500 Shirayamamachi, Japan, 36.5166, 136.5656 Al Jizah, Jordan, 31.6833, 35.9500 Tubarao, Brazil, -28.4669, -49.0069 Zhukovskiy, Russia, 55.5972, 38.1203 Bridgetown, Barbados, 13.0969, -59.6131 Wythenshawe, United Kingdom, 53.3920, -2.2640 Mancheral, India, 18.8714, 79.4443 Qal`at Sukkar, Iraq, 31.8632, 46.0732 Tinaquillo, Venezuela, 9.9167, -68.3000 Pisco, Peru, -13.7167, -76.2000 Jacksonville, United States, 34.7289, -77.3941 Retalhuleu, Guatemala, 14.5333, -91.6833 Reus, Spain, 41.1560, 1.1080 Bernal, Argentina, -34.7000, -58.2833 San Buenaventura, United States, 34.2741, -119.2314 Mirialguda, India, 16.8667, 79.5833 Birkenhead, United Kingdom, 53.3930, -3.0140 Vicenza, Italy, 45.5500, 11.5500 Brovary, Ukraine, 50.5111, 30.7900 Doncaster, United Kingdom, 53.5228, -1.1325 Winterthur, Switzerland, 47.4992, 8.7267 Sugar Land, United States, 29.5935, -95.6358 Dali, China, 34.7953, 109.9378 Rotherham, United Kingdom, 53.4300, -1.3570 Dera Ismail Khan, Pakistan, 31.8314, 70.9019 Esteban Echeverria, Argentina, -34.8167, -58.4667 Quezon, Philippines, 7.7306, 125.1000 Aguachica, Colombia, 8.3167, -73.6333 Naujan, Philippines, 13.3233, 121.3028 Glan, Philippines, 5.8200, 125.2000 Bayugan, Philippines, 8.7100, 125.7500 Maidstone, United Kingdom, 51.2720, 0.5290 Gualeguaychu, Argentina, -33.0167, -58.5167 Kecskemet, Hungary, 46.9075, 19.6917 Zarate, Argentina, -34.0833, -59.0333 Delft, Netherlands, 52.0117, 4.3592 Walthamstow, United Kingdom, 51.5840, -0.0210 Drammen, Norway, 59.7439, 10.2045 Chico, United States, 39.7578, -121.8161 Nkpor, Nigeria, 6.1500, 6.8333 Kamagaya, Japan, 35.7768, 140.0008 Tacurong, Philippines, 6.6800, 124.6700 Malacatan, Guatemala, 14.9000, -92.0497 Taoyang, China, 35.3754, 103.8612 Yongju, Korea, South, 36.8058, 128.6239 Labo, Philippines, 14.1561, 122.8294 Sandacho, Japan, 34.8833, 135.2333 Roquetas de Mar, Spain, 36.7642, -2.6147 White Rock, Canada, 49.0250, -122.8028 Marugame, Japan, 34.2833, 133.8000 South Fulton, United States, 33.6273, -84.5800 Tangjia, China, 22.3566, 113.5919 Sehore, India, 23.2000, 77.0800 Sparks, United States, 39.5736, -119.7161 Handeni, Tanzania, -5.4242, 38.0194 Balombo, Angola, -12.3500, 14.7667 Talisay, Philippines, 10.7300, 122.9700 Hosan, Korea, South, 36.2000, 127.0833 Silopi, Turkey, 37.2486, 42.4703 Bangaon, India, 23.0700, 88.8200 Thunder Bay, Canada, 48.3822, -89.2461 Pulilan, Philippines, 14.9020, 120.8490 Maxixe, Mozambique, -23.8597, 35.3472 Dimitrovgrad, Russia, 54.1833, 49.5833 Kasserine, Tunisia, 35.1667, 8.8333 Bagu Na Mohra, Pakistan, 33.2200, 73.2100 Matruh, Egypt, 31.3333, 27.2167 Baia Mare, Romania, 47.6567, 23.5719 Shihuajie, China, 32.2742, 111.4717 Tondabayashicho, Japan, 34.5000, 135.6000 San Francisco de la Piedad, Mexico, 20.0325, -100.7214 Witbank, South Africa, -25.8770, 29.2010 Khopoli, India, 18.7890, 73.3430 Ferizaj, Kosovo, 42.3706, 21.1553 Oxford, United Kingdom, 51.7519, -1.2578 Xishancun, China, 23.6014, 116.3257 Mascara, Algeria, 35.4000, 0.1333 Khenchela, Algeria, 35.4167, 7.1333 Taungoo, Burma, 18.9333, 96.4333 Mong Cai, Vietnam, 21.5333, 107.9667 Artem, Russia, 43.3667, 132.2000 La Gi, Vietnam, 10.6600, 107.7719 Komatsu, Japan, 36.4083, 136.4455 Islamabad, India, 33.7353, 75.1478 Yasuj, Iran, 30.6672, 51.5797 Khardah, India, 22.7200, 88.3800 Cawayan, Philippines, 9.9700, 122.6200 Eau Claire, United States, 44.8197, -91.4948 Mopti, Mali, 14.4900, -4.1800 Delta, Canada, 49.0847, -123.0586 Toowoomba, Australia, -27.5667, 151.9500 Caen, France, 49.1814, -0.3636 Mungeli, India, 22.0700, 81.6800 Alto Hospicio, Chile, -20.2500, -70.1167 Habikino, Japan, 34.5500, 135.6000 Auburn, United States, 32.6087, -85.4903 Maramag, Philippines, 7.7631, 125.0050 Nantang, China, 22.4986, 113.5310 Tadpatri, India, 14.9200, 78.0200 Acharnes, Greece, 38.0833, 23.7333 Birnin Kebbi, Nigeria, 12.4504, 4.1999 Yilong, China, 23.6914, 102.4870 Reyhanli, Turkey, 36.2681, 36.5675 Mudanya, Turkey, 40.3764, 28.8833 An Nuhud, Sudan, 12.6904, 28.4200 Villa del Rosario, Colombia, 7.8339, -72.4742 Liberec, Czechia, 50.7667, 15.0667 Itumbiara, Brazil, -18.4200, -49.2178 Rijeka, Croatia, 45.3333, 14.4333 Cagua, Venezuela, 10.1875, -67.4611 Douliu, Taiwan, 23.7075, 120.5439 Dearborn, United States, 42.3127, -83.2130 Baia Farta, Angola, -12.6072, 13.1944 Mazhang, China, 21.2757, 110.3221 Castelar, Argentina, -34.6667, -58.6667 Villa Krause, Argentina, -31.5833, -68.5333 Riverview, United States, 27.8227, -82.3023 Balsas, Brazil, -7.5325, -46.0356 Lingayen, Philippines, 16.0167, 120.2333 Labe, Guinea, 11.3167, -12.2833 Allen, United States, 33.1088, -96.6735 Gharbara, India, 28.4700, 77.5100 Chaman, Pakistan, 30.9222, 66.4447 Pishin, Pakistan, 30.5848, 66.9948 Sultanpur, India, 26.2583, 82.0722 Joyabaj, Guatemala, 14.9950, -90.8075 Umm Qasr, Iraq, 30.0342, 47.9294 Kogon Shahri, Uzbekistan, 39.7275, 64.5547 Kawit, Philippines, 14.4300, 120.9000 Kotmale, Sri Lanka, 7.0142, 80.5897 Teixeira de Freitas, Brazil, -17.5350, -39.7419 West Covina, United States, 34.0555, -117.9113 Mineshita, Japan, 35.1185, 138.9186 Shikohabad, India, 27.1000, 78.6000 Morales, Guatemala, 15.4725, -88.8414 Centennial, United States, 39.5926, -104.8673 Basingstoke, United Kingdom, 51.2667, -1.0876 Jalpaiguri, India, 26.5200, 88.7300 Manokwari, Indonesia, -0.8667, 134.0833 Bloomington, United States, 39.1637, -86.5257 Shamli, India, 29.4500, 77.3200 Wa, Ghana, 10.0667, -2.5000 Cambe, Brazil, -23.2758, -51.2778 Sandy Springs, United States, 33.9366, -84.3703 Bhilai Karanja, India, 21.2198, 81.4575 Argenteuil, France, 48.9478, 2.2489 Monastir, Tunisia, 35.7694, 10.8194 Chongshan, China, 18.7751, 109.5169 Ilebo, Congo (Kinshasa), -4.3167, 20.6000 El Monte, United States, 34.0739, -118.0291 Hillsboro, United States, 45.5273, -122.9360 Edison, United States, 40.5360, -74.3697 Emmen, Netherlands, 52.7833, 6.9000 Menifee, United States, 33.6909, -117.1849 Bante, Benin, 8.4167, 1.8833 Lujan, Argentina, -34.5667, -59.1000 Novyy Urengoy, Russia, 66.0833, 76.6833 Bagong Silangan, Philippines, 14.7094, 121.1000 Yopal, Colombia, 5.3500, -72.4100 Erdenet, Mongolia, 49.0278, 104.0444 Suriapet, India, 17.1415, 79.6236 Ji-Parana, Brazil, -10.8853, -61.9517 Kalmunai, Sri Lanka, 7.4090, 81.8347 Tajimi, Japan, 35.3328, 137.1316 Chabahar, Iran, 25.2928, 60.6497 Maipu, Argentina, -32.9667, -68.7500 Crawley, United Kingdom, 51.1092, -0.1872 Acailandia, Brazil, -4.9469, -47.5050 Rio Rancho, United States, 35.2873, -106.6982 As Safirah, Syria, 36.0770, 37.3725 Wardha, India, 20.7417, 78.6056 La Banda, Argentina, -27.7333, -64.2500 Catbalogan, Philippines, 11.7800, 124.8800 Htison, Burma, 15.9000, 98.1833 El Kelaa des Srarhna, Morocco, 32.0481, -7.4083 Davie, United States, 26.0789, -80.2870 Ranibennur, India, 14.6167, 75.6167 Omuta, Japan, 33.0303, 130.4458 Longjiang, China, 47.3404, 123.1800 Terni, Italy, 42.5667, 12.6500 Hammamet, Tunisia, 36.4000, 10.6167 Berdiansk, Ukraine, 46.7556, 36.7889 Toufen, Taiwan, 24.6832, 120.9072 Ad Dakhla, Morocco, 23.7081, -15.9456 Tiaong, Philippines, 13.9500, 121.3200 Tarnow, Poland, 50.0125, 20.9886 Carmona, Philippines, 14.3200, 121.0500 Dagenham, United Kingdom, 51.5397, 0.1422 Jurupa Valley, United States, 34.0010, -117.4706 Vidnoye, Russia, 55.5500, 37.7167 El Limon, Venezuela, 10.3003, -67.6336 Menderes, Turkey, 38.2540, 27.1340 Barnoi, India, 32.4300, 75.4300 Bolzano, Italy, 46.4981, 11.3548 Raba, Indonesia, -8.4614, 118.7469 Mingacevir, Azerbaijan, 40.7700, 47.0489 Sitamarhi, India, 26.6000, 85.4800 Lokossa, Benin, 6.6333, 1.7167 Nanaimo, Canada, 49.1642, -123.9364 Son La, Vietnam, 21.3270, 103.9141 Ocotlan, Mexico, 20.3467, -102.7744 Sao Pedro da Aldeia, Brazil, -22.8392, -42.1028 Saijo, Japan, 33.9167, 133.1833 Contramaestre, Cuba, 20.3000, -76.2506 Anaco, Venezuela, 9.4819, -64.4917 Khanty-Mansiysk, Russia, 61.0000, 69.0000 Binh Hoa, Vietnam, 10.9061, 106.7308 Atebubu, Ghana, 7.7554, -0.9808 Koszalin, Poland, 54.2000, 16.1833 Idku, Egypt, 31.3058, 30.2956 Columbia, United States, 39.2004, -76.8590 Granada, Nicaragua, 11.9333, -85.9500 Catanduva, Brazil, -21.1378, -48.9728 Lo Barnechea, Chile, -33.3500, -70.5167 Funchal, Portugal, 32.6500, -16.9167 Kishanganj, India, 26.0794, 87.9372 Song Cau, Vietnam, 13.5500, 109.2000 Temoaya, Mexico, 19.4686, -99.5933 Bergama, Turkey, 39.1167, 27.1833 Kiryu, Japan, 36.4052, 139.4973 Jatai, Brazil, -17.8808, -51.7139 Yevpatoriia, Ukraine, 45.1939, 33.3681 Erechim, Brazil, -27.6339, -52.2739 Tikrit, Iraq, 34.6000, 43.6833 Hindaun, India, 26.7400, 77.0300 Azare, Nigeria, 11.6742, 10.1911 Semari, India, 24.0555, 73.8566 Moers, Germany, 51.4592, 6.6197 Lerma, Mexico, 19.2847, -99.5119 Inglewood, United States, 33.9566, -118.3444 Nova Serrana, Brazil, -19.8758, -44.9839 Japeri, Brazil, -22.6431, -43.6533 Gangawati, India, 15.4300, 76.5300 Binh Long, Vietnam, 11.6527, 106.6093 Pangkalan Bun, Indonesia, -2.6833, 111.6167 Cipolletti, Argentina, -38.9333, -67.9833 Malungun, Philippines, 6.2700, 125.2800 Spokane Valley, United States, 47.6626, -117.2346 Mostar, Bosnia and Herzegovina, 43.3436, 17.8075 Sabac, Serbia, 44.7558, 19.6939 Charsadda, Pakistan, 34.1500, 71.7333 Valle de La Pascua, Venezuela, 9.2033, -66.0103 Robat Karim, Iran, 35.4819, 51.0808 North Lakhimpur, India, 27.2414, 94.1056 Seversk, Russia, 56.6000, 84.8500 Renton, United States, 47.4784, -122.1918 Ash Shaykh `Uthman, Yemen, 12.8864, 45.0156 San Tan Valley, United States, 33.1786, -111.5629 Lagarto, Brazil, -10.9172, -37.6500 Jamalpur, India, 25.3000, 86.5000 Kongolo, Congo (Kinshasa), -5.4000, 27.0000 Mityana, Uganda, 0.4006, 32.0422 Bulan, Philippines, 12.6697, 123.8758 Kamyshin, Russia, 50.0833, 45.4000 Texcoco, Mexico, 19.5200, -98.8800 Burbank, United States, 34.1879, -118.3235 Nikopol, Ukraine, 47.5667, 34.4000 Mazyr, Belarus, 52.0500, 29.2500 Sloviansk, Ukraine, 48.8533, 37.6250 Sultan Kudarat, Philippines, 7.2300, 124.2500 Maranguape, Brazil, -3.8900, -38.6858 Ndjamba, Angola, -14.7000, 16.0667 Makrana, India, 27.0409, 74.7273 Al Faw, Iraq, 29.9800, 48.4700 Brockton, United States, 42.0821, -71.0242 Salzgitter, Germany, 52.1500, 10.3333 Jincheng, China, 39.5591, 113.1855 Planaltina, Brazil, -15.4528, -47.6139 Sheopur, India, 25.6700, 76.7000 Kandhkot, Pakistan, 28.2440, 69.1810 Guasdualito, Venezuela, 7.2467, -70.7292 Pergamino, Argentina, -33.8833, -60.5667 Tagbilaran City, Philippines, 9.6500, 123.8500 Mulhouse, France, 47.7500, 7.3400 El Cajon, United States, 32.8017, -116.9604 Ourense, Spain, 42.3364, -7.8633 Los Minas, Dominican Republic, 18.4989, -69.8576 Parral, Mexico, 26.9333, -105.6667 Aliaga, Turkey, 38.8008, 26.9728 Murom, Russia, 55.5667, 42.0333 Lavras, Brazil, -21.2450, -45.0000 Coronel Fabriciano, Brazil, -19.5189, -42.6289 Orekhovo-Zuyevo, Russia, 55.8000, 38.9667 Alasehir, Turkey, 38.3500, 28.5167 Kafr ad Dawwar, Egypt, 31.1339, 30.1297 Wloclawek, Poland, 52.6592, 19.0681 Brantford, Canada, 43.1667, -80.2500 Tenancingo, Mexico, 18.9608, -99.5906 Presidente Franco, Paraguay, -25.5638, -54.6110 Tuyen Quang, Vietnam, 21.8167, 105.2167 Olanchito, Honduras, 15.4836, -86.5725 Ballia, India, 25.7604, 84.1471 Walbrzych, Poland, 50.7667, 16.2833 Barika, Algeria, 35.3972, 5.3658 Nancy, France, 48.6936, 6.1846 Siauliai, Lithuania, 55.9281, 23.3167 Vi Thanh, Vietnam, 9.7833, 105.4667 Aquin, Haiti, 18.2797, -73.3943 Techiman, Ghana, 7.5905, -1.9395 Chorzow, Poland, 50.3000, 18.9500 Tam Diep, Vietnam, 20.1556, 105.9181 Balanga, Philippines, 14.6800, 120.5300 Gillingham, United Kingdom, 51.3850, 0.5500 Ikeda, Japan, 34.8217, 135.4286 Muriae, Brazil, -21.1308, -42.3658 Halifax, United Kingdom, 53.7250, -1.8630 Tadepallegudem, India, 16.8150, 81.5260 Salto, Uruguay, -31.3833, -57.9500 Natitingou, Benin, 10.3000, 1.3667 Moulay Abdallah, Morocco, 33.1978, -8.5883 Chatham, Canada, 42.4229, -82.1324 Seguela, Côte d’Ivoire, 7.9611, -6.6731 Ourinhos, Brazil, -22.9789, -49.8708 Sindangan, Philippines, 8.2386, 122.9986 Chicoutimi, Canada, 48.4333, -71.0667 Bansbaria, India, 22.9700, 88.4000 Tula de Allende, Mexico, 20.0500, -99.3500 Lida, Belarus, 53.8956, 25.2958 Toride, Japan, 35.9115, 140.0504 Salford, United Kingdom, 53.4830, -2.2931 Rialto, United States, 34.1175, -117.3892 Kilinochchi, Sri Lanka, 9.4004, 80.3999 Bacabal, Brazil, -4.2250, -44.7800 Xianghe, China, 39.7532, 116.9814 Uitenhage, South Africa, -33.7667, 25.4000 Arzamas, Russia, 55.4000, 43.8167 Biak, Indonesia, -1.1800, 136.0800 Wigan, United Kingdom, 53.5448, -2.6318 Roncaglia, Italy, 45.0437, 9.7957 Itacoatiara, Brazil, -3.1428, -58.4439 San Mateo, United States, 37.5522, -122.3121 Yunfu, China, 28.6331, 104.4181 Breves, Brazil, -1.6822, -50.4803 Buzau, Romania, 45.1531, 26.8208 Mubende, Uganda, 0.5575, 31.3950 Woodbridge, United States, 40.5611, -74.2943 Francistown, Botswana, -21.1736, 27.5125 Lower Hutt, New Zealand, -41.2167, 174.9167 Uba, Brazil, -21.1200, -42.9428 Hounslow, United Kingdom, 51.4668, -0.3750 Bumba, Congo (Kinshasa), 2.1844, 22.4703 Bundi, India, 25.4400, 75.6400 Gujar Khan, Pakistan, 33.2530, 73.3040 Sarh, Chad, 9.1500, 18.3833 Taitung, Taiwan, 22.7583, 121.1444 Elista, Russia, 46.3167, 44.2667 Chikushino, Japan, 33.4875, 130.5258 Hanau, Germany, 50.1328, 8.9169 Patos, Brazil, -7.0244, -37.2800 Itanhaem, Brazil, -24.1831, -46.7889 Aracruz, Brazil, -19.8203, -40.2733 San Rafael, Philippines, 14.9500, 120.9700 Inzai, Japan, 35.8333, 140.1500 Iguatu, Brazil, -6.3594, -39.2986 Camboriu, Brazil, -27.0250, -48.6539 Miryang, Korea, South, 35.5000, 128.7500 Tanjungpandan, Indonesia, -2.7500, 107.7500 Santo Antonio de Jesus, Brazil, -12.9692, -39.2611 Bendigo, Australia, -36.7500, 144.2667 Paniqui, Philippines, 15.6681, 120.5789 Amaravati, India, 16.5131, 80.5165 Sumber, Indonesia, -6.7544, 108.4858 Noyabrsk, Russia, 63.2000, 75.4500 Parang, Philippines, 7.3744, 124.2686 Negapatam, India, 10.7672, 79.8449 Sangju, Korea, South, 36.4400, 128.1700 Goodyear, United States, 33.2614, -112.3622 Santa Rosa, Argentina, -36.6167, -64.2833 Buxar, India, 25.5605, 83.9805 Wembley, United Kingdom, 51.5528, -0.2979 Onojo, Japan, 33.5364, 130.4786 Charlottesville, United States, 38.0375, -78.4855 Caieiras, Brazil, -23.3642, -46.7406 Telde, Spain, 27.9833, -15.4167 Berdsk, Russia, 54.7500, 83.1000 Orsha, Belarus, 54.5092, 30.4258 Hinche, Haiti, 19.1430, -72.0040 Palhoca, Brazil, -27.6444, -48.6678 Hoyacho, Japan, 35.7483, 139.5675 Walvisbaai, Namibia, -22.9494, 14.5069 Tepexpan, Mexico, 19.6192, -98.9353 Guihulngan, Philippines, 10.1200, 123.2700 Lafayette, United States, 39.9946, -105.0998 Gursu, Turkey, 40.2144, 29.1931 Jirja, Egypt, 26.3383, 31.8917 Kheda, India, 22.7500, 72.6800 Lee's Summit, United States, 38.9171, -94.3816 Edinburg, United States, 26.3196, -98.1597 Daly City, United States, 37.6862, -122.4685 Wichita Falls, United States, 33.9072, -98.5291 Tezpur, India, 26.6300, 92.8000 Piacenza, Italy, 45.0500, 9.7000 Gutersloh, Germany, 51.9000, 8.3833 Messaad, Algeria, 34.1667, 3.5000 Noginsk, Russia, 55.8500, 38.4333 Mayari, Cuba, 20.6592, -75.6781 Seoni, India, 22.0800, 79.5300 Hildesheim, Germany, 52.1500, 9.9500 Ngong, Kenya, -1.3667, 36.6333 Olomouc, Czechia, 49.5939, 17.2508 Ban Mangkon, Thailand, 13.6090, 100.6638 Mustafakemalpasa, Turkey, 40.0353, 28.4117 Kashmar, Iran, 35.2447, 58.4608 Bahrain, Pakistan, 35.2075, 72.5456 Bowling Green, United States, 36.9716, -86.4378 Aurangabad, India, 24.7000, 84.3500 Jounie, Lebanon, 33.9697, 35.6156 Ituiutaba, Brazil, -18.9689, -49.4650 Mositai, China, 45.5333, 119.6528 Matehuala, Mexico, 23.6528, -100.6444 Longmont, United States, 40.1686, -105.1005 Nakhon Si Thammarat, Thailand, 8.4364, 99.9631 Rishikesh, India, 30.1083, 78.2972 Siegen, Germany, 50.8833, 8.0167 Simanggang, Malaysia, 1.2472, 111.4528 Yishi, China, 35.1650, 110.7460 Isehara, Japan, 35.3833, 139.3000 Vacaville, United States, 38.3587, -121.9673 Kot Radha Kishan, Pakistan, 31.1725, 74.0997 Shibuya, Japan, 35.6536, 139.7092 Sabratah, Libya, 32.7922, 12.4842 Lahan, Nepal, 26.7167, 86.4833 Aflou, Algeria, 34.1089, 2.1019 Fugangcun, China, 23.5873, 116.5957 Al Jumayl, Libya, 32.8528, 12.0611 San Vicente de Baracaldo, Spain, 43.2972, -2.9917 Dhangadhi, Nepal, 28.7056, 80.5750 Worcester, United Kingdom, 52.1911, -2.2206 Shushtar, Iran, 32.0450, 48.8594 Tota, Benin, 6.8000, 1.7833 Kapurthala, India, 31.3800, 75.3800 Boryeong, Korea, South, 36.3333, 126.6167 Kasama, Zambia, -10.2117, 31.1783 Al Hajar al Aswad, Syria, 33.4576, 36.3042 Akyazi, Turkey, 40.6833, 30.6253 Chau Doc, Vietnam, 10.7000, 105.1167 Zonguldak, Turkey, 41.4564, 31.7986 Calandala, Angola, -9.0894, 15.9550 Igdir, Turkey, 39.9208, 44.0444 Dhamtari, India, 20.7100, 81.5500 Raneswar, India, 24.0311, 87.4197 Chishtian, Pakistan, 29.8000, 72.8333 Espejo, Chile, -33.5167, -70.6917 Cinere, Indonesia, -6.3333, 106.7833 Brajarajnagar, India, 21.8167, 83.9167 Eastbourne, United Kingdom, 50.7700, 0.2800 Sujangarh, India, 27.7000, 74.4700 Kaiserslautern, Germany, 49.4447, 7.7689 Novoshakhtinsk, Russia, 47.7667, 39.9167 Ciudad Rio Bravo, Mexico, 25.9861, -98.0889 Bhadreswar, India, 22.8200, 88.3500 Highlands Ranch, United States, 39.5419, -104.9708 Pavlohrad, Ukraine, 48.5167, 35.8667 Clarington, Canada, 43.9350, -78.6083 Hengnan, China, 22.5348, 113.2491 Assis, Brazil, -22.6619, -50.4119 Klagenfurt, Austria, 46.6167, 14.3000 Chilakalurupet, India, 16.0892, 80.1672 Quincy, United States, 42.2506, -71.0187 Hikkaduwa, Sri Lanka, 6.1407, 80.1012 Sungai Penuh, Indonesia, -2.0589, 101.3914 Jingping, China, 39.5189, 112.2837 Chaguanas, Trinidad and Tobago, 10.5167, -61.4000 Novara, Italy, 45.4500, 8.6200 Kousseri, Cameroon, 12.0833, 15.0333 Ain Oussera, Algeria, 35.4489, 2.9044 Deventer, Netherlands, 52.2500, 6.2000 Arsuz, Turkey, 36.4128, 35.8867 KwaDukuza, South Africa, -29.3333, 31.2917 Nga Bay, Vietnam, 9.8164, 105.8197 Hong Ngu, Vietnam, 10.8330, 105.2830 Jeypore, India, 18.8563, 82.5716 Zomba, Malawi, -15.3860, 35.3188 Daoukro, Côte d’Ivoire, 7.0586, -3.9646 Santa Cruz, Philippines, 6.8300, 125.4200 Presidencia Roque Saenz Pena, Argentina, -26.7833, -60.4500 Itaperuna, Brazil, -21.2050, -41.8878 Mporokoso, Zambia, -9.3833, 30.1000 Suruc, Turkey, 36.9764, 38.4269 Karanja, India, 20.4833, 77.4833 Fishers, United States, 39.9588, -85.9659 Lynn, United States, 42.4781, -70.9664 Aboisso, Côte d’Ivoire, 5.4667, -3.2000 Xirdalan, Azerbaijan, 40.4486, 49.7564 Salavan, Laos, 15.7167, 106.4167 Saint-Jerome, Canada, 45.7833, -74.0000 Red Deer, Canada, 52.2681, -113.8111 Sakado, Japan, 35.9573, 139.4030 Bim Son, Vietnam, 20.0781, 105.8603 Kefar Sava, Israel, 32.1858, 34.9077 Xinhua, China, 23.6243, 105.6229 Sungailiat, Indonesia, -1.8561, 106.1192 Sittwe, Burma, 20.1670, 92.7850 Concepcion del Uruguay, Argentina, -32.4833, -58.2333 Leer, South Sudan, 8.3031, 30.1406 Norwalk, United States, 33.9069, -118.0829 Lae, Papua New Guinea, -6.7303, 147.0008 Cavite City, Philippines, 14.4800, 120.9000 Playas de Rosarito, Mexico, 32.3422, -117.0561 Ahar, Iran, 38.4797, 47.0669 Asagicinik, Turkey, 41.2719, 36.3508 Yen Bai, Vietnam, 21.7000, 104.8667 Weifen, China, 38.4633, 111.1203 Sur, Turkey, 37.9106, 40.2358 Nahiyat al Iskandariyah, Iraq, 32.9000, 44.3500 Kalyani, India, 22.9750, 88.4344 Ha Tien, Vietnam, 10.3833, 104.4833 Carmel, United States, 39.9650, -86.1460 Masjed Soleyman, Iran, 31.9600, 49.2881 Calasiao, Philippines, 16.0200, 120.3700 Datia, India, 25.6700, 78.4700 Itaugua, Paraguay, -25.3926, -57.3542 Torbat-e Jam, Iran, 35.2431, 60.6250 Diourbel, Senegal, 14.6550, -16.2314 Kawachinagano, Japan, 34.4667, 135.5667 Libertad, Argentina, -34.6833, -58.6833 Gangtok, India, 27.3300, 88.6200 Oulad Teima, Morocco, 30.4000, -9.2167 Vaciamadrid, Spain, 40.3394, -3.5181 Bocono, Venezuela, 9.2461, -70.2617 San Felipe del Progreso, Mexico, 19.7125, -99.9511 Chust, Uzbekistan, 40.9978, 71.2403 Lamitan, Philippines, 6.6500, 122.1300 Hesperia, United States, 34.3975, -117.3147 Talipao, Philippines, 5.9760, 121.1087 Renala Khurd, Pakistan, 30.8833, 73.6000 Sabanalarga, Colombia, 6.8500, -75.8167 Cottbus, Germany, 51.7606, 14.3342 Pyinmana, Burma, 19.7500, 96.2000 Bamyan, Afghanistan, 34.8250, 67.8333 Mbanza-Ngungu, Congo (Kinshasa), -5.2500, 14.8667 Banzhuangcun, China, 34.8504, 118.8510 Ra's Gharib, Egypt, 28.3597, 33.0775 Gwelej, Eritrea, 14.7500, 36.7167 Babile, Ethiopia, 9.2167, 42.3333 Dzolokpuita, Ghana, 6.7847, 0.4416 Suramala, India, 13.7600, 79.7000 Barod, India, 27.8947, 76.3681 Bijaynagar, India, 25.9300, 74.6386 Khambhaliya, India, 22.2000, 69.6500 Abbigeri, India, 13.0767, 77.5250 Kundli, India, 28.9900, 77.0220 Sojat, India, 25.9200, 73.6700 Navalyal, India, 16.4800, 74.7800 Ad Dujayl, Iraq, 33.8467, 44.2344 Zahle, Lebanon, 33.8333, 35.9167 Sakiet ez Zit, Tunisia, 34.8000, 10.7700 La Marsa, Tunisia, 36.8764, 10.3253 Mumias, Kenya, 0.3333, 34.4833 Luckeesarai, India, 25.1678, 86.0944 Pouytenga, Burkina Faso, 12.2500, -0.4333 St. Augustine, United States, 29.8976, -81.3100 Solola, Guatemala, 14.7667, -91.1833 Mabai, China, 23.0128, 104.4508 Debre Zeyit, Ethiopia, 8.7500, 38.9833 Yelets, Russia, 52.6167, 38.4667 Nabire, Indonesia, -3.3622, 135.5028 Buckeye, United States, 33.4314, -112.6429 Ejido, Venezuela, 8.3333, -71.4000 Sundsvall, Sweden, 62.4001, 17.3167 Kadaiyanallur, India, 9.0743, 77.3419 Sayaxche, Guatemala, 16.5167, -90.1833 Ciamis, Indonesia, -7.3281, 108.3336 Putatan, Philippines, 14.3984, 121.0364 Xiongzhou, China, 38.9653, 116.0972 Urgut Shahri, Uzbekistan, 39.4190, 67.2612 Fengning, China, 41.2108, 116.6404 Achinsk, Russia, 56.2817, 90.5039 Talara, Peru, -4.5799, -81.2719 Kani, Japan, 35.4261, 137.0613 Santiago de Compostela, Spain, 42.8778, -8.5444 Roubaix, France, 50.6901, 3.1817 Tinsukia, India, 27.5000, 95.3670 San Angelo, United States, 31.4424, -100.4504 Lugo, Spain, 43.0167, -7.5500 Santa Cruz del Quiche, Guatemala, 15.0300, -91.1500 Hualien, Taiwan, 23.9722, 121.6064 Tobolsk, Russia, 58.2000, 68.2667 Campo Mourao, Brazil, -24.0458, -52.3828 Alaminos, Philippines, 16.1553, 119.9808 Xiegang, China, 22.9616, 114.1487 Tellicherry, India, 11.7481, 75.4929 Jinotega, Nicaragua, 13.0884, -85.9994 Omura, Japan, 32.9000, 129.9583 Itarsi, India, 22.6115, 77.7623 Izumisano, Japan, 34.4000, 135.3333 Thika, Kenya, -1.0396, 37.0900 Bislig, Philippines, 8.2133, 126.3161 Abhar, Iran, 36.1464, 49.2225 Viseu, Portugal, 40.6575, -7.9139 Malate, Philippines, 14.5642, 120.9913 Ginowan, Japan, 26.2817, 127.7783 Wakefield, United Kingdom, 53.6825, -1.4975 Sakata, Japan, 38.9145, 139.8364 Federal Way, United States, 47.3091, -122.3358 Khamis Mushayt, Saudi Arabia, 18.3000, 42.7333 Blida, Algeria, 36.4686, 2.8319 Pili, Philippines, 13.5542, 123.2753 Pickering, Canada, 43.8354, -79.0890 Hasilpur, Pakistan, 29.6917, 72.5453 Tourcoing, France, 50.7239, 3.1612 Trincomalee, Sri Lanka, 8.5667, 81.2333 Riberalta, Bolivia, -11.0128, -66.0572 Berkane, Morocco, 34.9167, -2.3167 Sievierodonetsk, Ukraine, 48.9481, 38.4933 Moron, Argentina, -34.6500, -58.6167 Bismarck, United States, 46.8143, -100.7694 Lira, Uganda, 2.2472, 32.9000 Kohima, India, 25.6700, 94.1000 Sisophon, Cambodia, 13.5839, 102.9736 Mossel Bay, South Africa, -34.1833, 22.1333 Vereeniging, South Africa, -26.6736, 27.9319 Mianeh, Iran, 37.4233, 47.7136 Heshan, China, 23.8000, 108.8833 Paoy Paet, Cambodia, 13.6500, 102.5667 Nyeri, Kenya, -0.4167, 36.9500 Zelenodol'sk, Russia, 55.8500, 48.5167 Burzaco, Argentina, -34.8167, -58.3667 Uch Sharif, Pakistan, 29.2333, 71.0667 Boca Raton, United States, 26.3752, -80.1080 Kontagora, Nigeria, 10.4030, 5.4730 Schwerin, Germany, 53.6333, 11.4167 Senahu, Guatemala, 15.4164, -89.8203 Khambhat, India, 22.3000, 72.6200 New Braunfels, United States, 29.6994, -98.1148 Ixmiquilpan, Mexico, 20.4819, -99.2181 Vista, United States, 33.1896, -117.2386 Caldas Novas, Brazil, -17.7439, -48.6258 San Cugat del Valles, Spain, 41.4667, 2.0833 Las Rozas de Madrid, Spain, 40.4917, -3.8733 Itoshima, Japan, 33.5539, 130.1978 Mahuva, India, 21.0833, 71.8000 Oton, Philippines, 10.6931, 122.4736 Manacapuru, Brazil, -3.2997, -60.6206 Ain El Aouda, Morocco, 33.8111, -6.7922 Sopron, Hungary, 47.6849, 16.5831 Koytendag, Turkmenistan, 37.5000, 66.0000 Kadirli, Turkey, 37.3697, 36.1000 Abreu e Lima, Brazil, -7.9117, -34.9028 Lethbridge, Canada, 49.6942, -112.8328 Chikusei, Japan, 36.3071, 139.9831 Patzcuaro, Mexico, 19.5164, -101.6097 Kanoya, Japan, 31.3783, 130.8522 Ancona, Italy, 43.6167, 13.5167 Lorca, Spain, 37.6798, -1.6944 Novokuybyshevsk, Russia, 53.1000, 49.9333 Saku, Japan, 36.2488, 138.4769 Santa Cruz do Capibaribe, Brazil, -7.9573, -36.2047 Babahoyo, Ecuador, -1.8167, -79.5167 Sergiyev Posad, Russia, 56.3150, 38.1367 M'lang, Philippines, 6.9500, 124.8800 Nanterre, France, 48.8988, 2.1969 Rio Grande, Argentina, -53.7833, -67.7000 Moortebeek, Belgium, 50.8547, 4.3386 Chitose, Japan, 42.8167, 141.6500 Balti, Moldova, 47.7667, 27.9167 Smederevo, Serbia, 44.6633, 20.9289 Ramnagar, India, 29.3950, 79.1264 Trelew, Argentina, -43.2500, -65.3000 Kamloops, Canada, 50.6761, -120.3408 Montego Bay, Jamaica, 18.4667, -77.9167 Catarman, Philippines, 12.4994, 124.6328 Valenca, Brazil, -13.3703, -39.0731 Saint-Jean-sur-Richelieu, Canada, 45.3167, -73.2667 Salihorsk, Belarus, 52.8000, 27.5333 Marmaris, Turkey, 36.8500, 28.2667 Udine, Italy, 46.0667, 13.2333 Janakpur, Nepal, 26.7122, 85.9217 Nanxicun, China, 23.4975, 116.2436 Paulinia, Brazil, -22.7611, -47.1542 Kambar, Pakistan, 27.9833, 68.6500 Errachidia, Morocco, 31.9319, -4.4244 Al Jammaliyah, Egypt, 31.1806, 31.8650 Itauna, Brazil, -20.0750, -44.5758 Ipojuca, Brazil, -8.3989, -35.0639 Quilenda, Angola, -10.6333, 14.3333 Gambela, Ethiopia, 8.2500, 34.5833 Kallithea, Greece, 37.9500, 23.7000 Deoni Buzurg, India, 18.2639, 77.0822 Mariano Roque Alonso, Paraguay, -25.2079, -57.5320 Tsuyama, Japan, 35.0692, 134.0044 Nantou, Taiwan, 23.9167, 120.6833 Beaverton, United States, 45.4779, -122.8168 Isulan, Philippines, 6.6300, 124.6000 Kalluru, India, 15.8344, 78.0292 Tartu, Estonia, 58.3800, 26.7225 Konan, Japan, 35.3321, 136.8707 Lajeado, Brazil, -29.4669, -51.9614 Adjarra, Benin, 6.5333, 2.6667 Dongducheon, Korea, South, 37.9167, 127.0667 Al Fqih Ben Calah, Morocco, 32.5000, -6.5333 Ceske Budejovice, Czechia, 48.9747, 14.4747 Attock Khurd, Pakistan, 33.7667, 72.3667 Fanyang, China, 31.1006, 118.1876 Portsmouth, United States, 36.8468, -76.3540 Yacuiba, Bolivia, -22.0153, -63.6772 Pernik, Bulgaria, 42.6000, 23.0330 Andria, Italy, 41.2317, 16.3083 Para de Minas, Brazil, -19.8600, -44.6078 Modi`in Makkabbim Re`ut, Israel, 31.9339, 34.9856 Orem, United States, 40.2981, -111.6994 Munakata, Japan, 33.8056, 130.5408 Zheleznogorsk, Russia, 52.3333, 35.3667 Toms River, United States, 39.9895, -74.1654 Harnai, Pakistan, 30.1000, 67.9378 Didim, Turkey, 37.3756, 27.2678 Colon, El Salvador, 13.7167, -89.3667 Kimberley, South Africa, -28.7383, 24.7639 Conroe, United States, 30.3238, -95.4824 Tumbes, Peru, -3.5708, -80.4597 Es Senia, Algeria, 35.6500, -0.6333 Bodinayakkanur, India, 10.0101, 77.3511 Quvasoy, Uzbekistan, 40.3000, 71.9667 Bekobod, Uzbekistan, 40.2167, 69.2167 Paletwa, Burma, 21.3000, 92.8500 Kamianets-Podilskyi, Ukraine, 48.6833, 26.5833 Caotun, Taiwan, 23.9830, 120.7326 Tamazunchale, Mexico, 21.2667, -98.7833 Arauca, Colombia, 7.0903, -70.7617 Tela, Honduras, 15.7825, -87.4514 Paraiso, Mexico, 18.3961, -93.2128 Do Gonbadan, Iran, 30.3600, 50.7839 Atamyrat, Turkmenistan, 37.8531, 65.2369 Kazerun, Iran, 29.6156, 51.6567 Francisco Beltrao, Brazil, -26.0808, -53.0550 Sangolqui, Ecuador, -0.3344, -78.4475 Iida, Japan, 35.5150, 137.8214 Suffolk, United States, 36.6953, -76.6398 Votuporanga, Brazil, -20.4228, -49.9728 Sunrise, United States, 26.1547, -80.2997 Ad Darwa, Morocco, 33.4167, -7.5333 Buin, Chile, -33.7333, -70.7333 Ben Arous, Tunisia, 36.7472, 10.3333 Bab Ezzouar, Algeria, 36.7217, 3.1853 Oldham, United Kingdom, 53.5444, -2.1169 Zhudong, Taiwan, 24.7366, 121.0916 Half Way Tree, Jamaica, 18.0106, -76.7847 Sutton Coldfield, United Kingdom, 52.5630, -1.8220 Peje, Kosovo, 42.6600, 20.2922 Caceres, Spain, 39.4833, -6.3667 Wujiaqu, China, 44.1670, 87.5430 Harihar, India, 14.5129, 75.8072 Tomohon, Indonesia, 1.3250, 124.8389 Lawrence, United States, 38.9597, -95.2642 Parintins, Brazil, -2.6278, -56.7358 Arden-Arcade, United States, 38.6017, -121.3845 Osijek, Croatia, 45.5603, 18.6703 Corumba, Brazil, -19.0089, -57.6528 Arezzo, Italy, 43.4631, 11.8781 Maribor, Slovenia, 46.5500, 15.6333 Prescott Valley, United States, 34.5980, -112.3185 Mbale, Uganda, 1.0806, 34.1750 Doudian, China, 39.6503, 116.0617 Mezhdurechensk, Russia, 53.6864, 88.0703 Escalante, Philippines, 10.8300, 123.5000 Itabaiana, Brazil, -10.6850, -37.4253 Mthatha, South Africa, -31.5886, 28.7900 Charikar, Afghanistan, 35.0131, 69.1689 Harran, Turkey, 36.8708, 39.0250 Votkinsk, Russia, 57.0500, 54.0000 Szekesfehervar, Hungary, 47.1910, 18.4108 Muzaffarabad, Pakistan, 34.3583, 73.4722 Hammersmith, United Kingdom, 51.4928, -0.2229 Amalner, India, 21.0500, 75.0500 Balayan, Philippines, 13.9300, 120.7300 Sardarshahr, India, 28.4401, 74.4908 Kalisz, Poland, 51.7575, 18.0800 Martil, Morocco, 35.6167, -5.2667 Middletown, United States, 39.5033, -84.3659 Longkeng, China, 23.9824, 112.2149 Esslingen, Germany, 48.7333, 9.3167 Longquan, China, 40.3703, 113.7483 Greece, United States, 43.2460, -77.6988 Vanderbijlpark, South Africa, -26.6992, 27.8356 Vilhena, Brazil, -12.7406, -60.1458 Rio Gallegos, Argentina, -51.6233, -69.2161 Weiyuan, China, 23.4683, 100.6835 Caseros, Argentina, -34.6106, -58.5625 Cesena, Italy, 44.1333, 12.2333 Witten, Germany, 51.4333, 7.3333 Porto Seguro, Brazil, -16.4500, -39.0650 Navapolatsk, Belarus, 55.5333, 28.6500 Dhulian, India, 24.6810, 87.9540 Hadera, Israel, 32.4500, 34.9167 Arifwala, Pakistan, 30.2981, 73.0561 San German, Puerto Rico, 18.0827, -67.0460 Edmond, United States, 35.6689, -97.4160 Sao Cristovao, Brazil, -11.0150, -37.2058 Zerakpur, India, 30.6500, 76.8200 Tandwa, India, 26.5500, 82.6500 Shire, Ethiopia, 14.1000, 38.2833 Kamisu, Japan, 35.8899, 140.6645 Cubuk, Turkey, 40.2386, 33.0331 Burdur, Turkey, 37.7194, 30.2833 Candelaria, Colombia, 3.4000, -76.3833 Pesaro, Italy, 43.9102, 12.9133 Tracy, United States, 37.7269, -121.4523 Manteca, United States, 37.7927, -121.2264 Tiruchengodu, India, 11.3790, 77.8949 Mons, Belgium, 50.4547, 3.9525 Huong Thuy, Vietnam, 16.4000, 107.6889 Pedagadi, India, 17.6615, 83.2104 Vitry-sur-Seine, France, 48.7875, 2.3928 Boli, China, 45.7564, 130.5759 Nagina, India, 29.4430, 78.4330 Bogo, Cameroon, 10.7340, 14.6080 Saint-Michel de l'Atalaye, Haiti, 19.3708, -72.3347 Chakdaha, India, 23.0800, 88.5200 Shimada, Japan, 34.8363, 138.1927 Closepet, India, 12.7230, 77.2860 Jiantang, China, 27.8333, 99.7000 Emmiganur, India, 15.7333, 77.4833 Yalamakuru, India, 15.5103, 77.5249 Balamban, Philippines, 10.4700, 123.7800 Siguatepeque, Honduras, 14.5978, -87.8353 Labuan, Malaysia, 5.2803, 115.2475 Sidi Slimane, Morocco, 34.2167, -5.7000 Naxcivan, Azerbaijan, 39.2089, 45.4122 Lindi, Tanzania, -9.9969, 39.7144 Rawanduz, Iraq, 36.6121, 44.5237 Yumbo, Colombia, 3.5850, -76.4958 Vaniyambadi, India, 12.6825, 78.6167 Kingsport, United States, 36.5224, -82.5454 Mianwali, Pakistan, 32.5853, 71.5436 Dongping, China, 28.3817, 111.2194 Meizichong, China, 28.1419, 111.6444 Nabha, India, 30.3700, 76.1500 Nahiyat al Karmah, Iraq, 33.3997, 43.9089 Giessen, Germany, 50.5833, 8.6667 Moca, Dominican Republic, 19.3833, -70.5167 Rincon de Romos, Mexico, 22.2333, -102.3167 Sibolga, Indonesia, 1.7400, 98.7800 San Sebastian de los Reyes, Spain, 40.5469, -3.6258 Cerete, Colombia, 8.8833, -75.8000 Hemel Hempstead, United Kingdom, 51.7526, -0.4692 San Ramon, Chile, -33.5333, -70.6417 San Martin Jilotepeque, Guatemala, 14.7833, -90.8000 Bouna, Côte d’Ivoire, 9.2667, -3.0000 Legnica, Poland, 51.2083, 16.1603 Kangan, India, 34.2630, 74.9030 Ludwigsburg, Germany, 48.8975, 9.1922 Los Patios, Colombia, 7.8333, -72.5167 Gera, Germany, 50.8806, 12.0833 Portsmouth, United States, 43.0580, -70.7826 Torrevieja, Spain, 37.9778, -0.6833 Lecce, Italy, 40.3520, 18.1691 Itaituba, Brazil, -4.2758, -55.9839 Sandy, United States, 40.5709, -111.8506 Behshahr, Iran, 36.6936, 53.5531 Hanamaki Onsen, Japan, 39.3886, 141.1169 Lopez, Philippines, 13.8840, 122.2604 Lingwala, Congo (Kinshasa), -4.3203, 15.2983 Bhadohi, India, 25.4200, 82.5700 Kanuma, Japan, 36.5671, 139.7451 Gjakove, Kosovo, 42.3803, 20.4308 San Joaquin, Chile, -33.4792, -70.6413 Gerona, Philippines, 15.6069, 120.5986 Allinagaram, India, 10.0119, 77.4786 Bayan Hot, China, 38.8556, 105.7001 Amstelveen, Netherlands, 52.3000, 4.8500 Niagara Falls, Canada, 43.0600, -79.1067 Villa Luzuriaga, Argentina, -34.6667, -58.5833 Vasco Da Gama, India, 15.3981, 73.8111 Marmagao, India, 15.4000, 73.8000 Palm Coast, United States, 29.5389, -81.2457 Pingyuanjie, China, 23.7475, 103.7525 Shibata, Japan, 37.9479, 139.3273 Umea, Sweden, 63.8285, 20.2706 Slidell, United States, 30.2887, -89.7828 Haskovo, Bulgaria, 41.9330, 25.5670 Ashiya, Japan, 34.7278, 135.3033 Yishui, China, 35.7904, 118.6200 Yi Xian, China, 39.3537, 115.4960 Bath, United Kingdom, 51.3814, -2.3597 Ruwa, Zimbabwe, -17.8897, 31.2447 San Marcos, United States, 33.1350, -117.1743 Zhoujiajing, China, 31.1128, 121.0503 Simoes Filho, Brazil, -12.7839, -38.4039 Livonia, United States, 42.3972, -83.3733 Santa Fe, United States, 35.6619, -105.9819 Plantation, United States, 26.1259, -80.2617 Herzliyya, Israel, 32.1556, 34.8422 Aksehir, Turkey, 38.3575, 31.4164 Greenburgh, United States, 41.0330, -73.8412 Ponta Pora, Brazil, -22.5361, -55.7256 Monkayo, Philippines, 7.8239, 126.0536 Hayes, United Kingdom, 51.5127, -0.4211 Rio Largo, Brazil, -9.4778, -35.8528 Azumino, Japan, 36.3039, 137.9058 Atascocita, United States, 29.9777, -95.1953 Dhar, India, 22.5972, 75.3042 Hradec Kralove, Czechia, 50.2092, 15.8322 Qormi, Malta, 35.8794, 14.4722 Birecik, Turkey, 37.0250, 37.9769 Valongo, Portugal, 41.1833, -8.5000 Mairipora, Brazil, -23.3189, -46.5869 Alvand, Iran, 36.1867, 50.0639 Lingtang, China, 23.6032, 113.0740 Chiantla, Guatemala, 15.3500, -91.4500 Oued Zem, Morocco, 32.8667, -6.5667 Fall River, United States, 41.7136, -71.1015 Simeulu, Indonesia, 2.6300, 96.0900 Zifta, Egypt, 30.7119, 31.2394 Cape Breton, Canada, 46.1389, -60.1931 Al Fujayrah, United Arab Emirates, 25.1222, 56.3344 Sanjo, Japan, 37.6368, 138.9617 San Fernando, Spain, 36.4667, -6.2000 Tubingen, Germany, 48.5200, 9.0556 Compton, United States, 33.8930, -118.2274 Carson, United States, 33.8374, -118.2559 Daanbantayan, Philippines, 11.2500, 124.0000 Inagi, Japan, 35.6379, 139.5046 Lysychansk, Ukraine, 48.9167, 38.4000 Duren, Germany, 50.8000, 6.4833 Mijas, Spain, 36.6000, -4.6333 Wangjia, China, 30.5939, 120.7795 Yashio, Japan, 35.8225, 139.8392 Jinbi, China, 25.7086, 101.3368 Yotsukaido, Japan, 35.6698, 140.1679 Chilliwack, Canada, 49.1577, -121.9509 Serov, Russia, 59.6000, 60.5667 Santa Cruz Xoxocotlan, Mexico, 17.0264, -96.7333 Lemery, Philippines, 13.8810, 120.9127 Indanan, Philippines, 6.0000, 120.9700 La Crosse, United States, 43.8241, -91.2268 Ramnicu Valcea, Romania, 45.1047, 24.3756 Fenggang, China, 23.6283, 116.5718 Galle, Sri Lanka, 6.0328, 80.2156 Dod Ballapur, India, 13.2920, 77.5430 Itajuba, Brazil, -22.4258, -45.4528 Darlington, United Kingdom, 54.5270, -1.5526 Ciudad General Belgrano, Argentina, -34.7167, -58.5333 Rafaela, Argentina, -31.2667, -61.4833 Missoula, United States, 46.8751, -114.0214 Wukari, Nigeria, 7.8704, 9.7800 Guaiba, Brazil, -30.1139, -51.3250 Barra do Pirai, Brazil, -22.4700, -43.8258 Creteil, France, 48.7911, 2.4628 Palimbang, Philippines, 6.2200, 124.2000 Nisshin, Japan, 35.1320, 137.0394 Boundiali, Côte d’Ivoire, 9.5167, -6.4833 La Reina, Chile, -33.4500, -70.5500 Wimbledon, United Kingdom, 51.4220, -0.2080 Ketapang, Indonesia, -1.8500, 109.9833 O'Fallon, United States, 38.7850, -90.7175 Kadugli, Sudan, 11.0100, 29.7000 Flensburg, Germany, 54.7819, 9.4367 Mount Pleasant, United States, 32.8537, -79.8203 Yozgat, Turkey, 39.8208, 34.8083 Akot, India, 21.1000, 77.0600 Tamanrasset, Algeria, 22.7889, 5.5256 Helmond, Netherlands, 51.4797, 5.6556 Rongwo, China, 35.5161, 102.0183 Sablayan, Philippines, 12.8428, 120.7750 Naju, Korea, South, 35.0333, 126.7167 Roswell, United States, 34.0391, -84.3513 Oss, Netherlands, 51.7667, 5.5167 Barletta, Italy, 41.3167, 16.2833 Bedford, United Kingdom, 52.1350, -0.4700 Iserlohn, Germany, 51.3833, 7.6667 Hoover, United States, 33.3763, -86.8068 Pardubice, Czechia, 50.0386, 15.7792 Tatakan, Indonesia, -6.1116, 106.1036 Kitakami, Japan, 39.2867, 141.1132 Florence, United States, 34.1780, -79.7898 Kalamaria, Greece, 40.5833, 22.9500 Leninsk-Kuznetskiy, Russia, 54.6575, 86.1617 Serra Talhada, Brazil, -7.9858, -38.2958 Contai, India, 21.7800, 87.7500 Santa Barbara, Philippines, 16.0031, 120.4008 Obu, Japan, 35.0117, 136.9637 Teziutlan, Mexico, 19.8178, -97.3667 Coatepec, Mexico, 19.4522, -96.9614 La Spezia, Italy, 44.1080, 9.8289 Kot Kapura, India, 30.5833, 74.9000 Wuji, China, 38.1790, 114.9763 Netrakona, Bangladesh, 24.8835, 90.7290 Williamsburg, United States, 37.2693, -76.7076 Sa'ada, Morocco, 31.6210, -8.1303 Hove, United Kingdom, 50.8352, -0.1758 Cruzeiro do Sul, Brazil, -7.6308, -72.6700 Satsumasendai, Japan, 31.8133, 130.3039 Shabqadar, Pakistan, 34.2054, 71.5833 Pato Branco, Brazil, -26.2289, -52.6708 South Gate, United States, 33.9447, -118.1926 Higashi-Matsuyama, Japan, 36.0422, 139.3999 Hamilton, United States, 40.2046, -74.6765 Kakamega, Kenya, 0.2833, 34.7500 Chino, United States, 33.9836, -117.6654 Avignon, France, 43.9500, 4.8075 Turkmenbasy, Turkmenistan, 40.0167, 52.9667 Raub, Malaysia, 3.7927, 101.8423 Fort Myers, United States, 26.6194, -81.8302 Gatchina, Russia, 59.5833, 30.1333 Turayf, Saudi Arabia, 31.6775, 38.6531 Southport, United Kingdom, 53.6475, -3.0053 Ouidah, Benin, 6.3667, 2.0833 Goalundo Ghat, Bangladesh, 23.7241, 89.7650 Sinende, Benin, 10.3447, 2.3792 Linquan, China, 37.9513, 110.9877 Phu Tho, Vietnam, 21.4003, 105.2225 Kirkland, United States, 47.6970, -122.2057 Niono, Mali, 14.2500, -6.0000 Grahamstown, South Africa, -33.2996, 26.5200 Myingyan, Burma, 21.4600, 95.3883 Santa Monica, United States, 34.0235, -118.4810 Brossard, Canada, 45.4667, -73.4500 Satu Mare, Romania, 47.7900, 22.8900 Piranshahr, Iran, 36.6956, 45.1456 Yao, Chad, 12.8508, 17.5608 Samalut, Egypt, 28.3122, 30.7100 Kars, Turkey, 40.6078, 43.0958 Cisauk, Indonesia, -6.3333, 106.6500 Mizan Teferi, Ethiopia, 7.0000, 35.5833 Arzew, Algeria, 35.8500, -0.3167 Vineland, United States, 39.4653, -74.9981 Norwalk, United States, 41.1144, -73.4215 Azua, Dominican Republic, 18.4600, -70.7400 San Jose del Rincon Centro, Mexico, 19.6606, -100.1525 Salaman, Philippines, 6.6333, 124.0667 Usti nad Labem, Czechia, 50.6583, 14.0417 Mandvi, India, 22.8333, 69.3556 San Francisco Solano, Argentina, -34.7667, -58.3167 Tucurui, Brazil, -3.7678, -49.6728 Kendu Bay, Kenya, -0.3596, 34.6400 Hilversum, Netherlands, 52.2333, 5.1667 Rayachoti, India, 14.0583, 78.7517 Avare, Brazil, -23.0989, -48.9258 Paloncha, India, 17.6018, 80.7051 Manhuacu, Brazil, -20.2581, -42.0336 Cacapava, Brazil, -23.1008, -45.7069 Pamekasan, Indonesia, -7.1574, 113.4718 Xiancun, China, 23.2374, 116.3152 Alessandria, Italy, 44.9133, 8.6200 Ambohimangakely, Madagascar, -18.8998, 47.5931 Hastings, United Kingdom, 50.8500, 0.5700 Agua Prieta, Mexico, 31.3258, -109.5489 Maple Ridge, Canada, 49.2167, -122.6000 Parli Vaijnath, India, 18.8500, 76.5300 Grudziadz, Poland, 53.4875, 18.7550 Alafaya, United States, 28.5280, -81.1868 Solwezi, Zambia, -12.1433, 26.3858 Caimbambo, Angola, -12.9000, 14.0833 Bauan, Philippines, 13.7917, 121.0085 Sivaganga, India, 9.8433, 78.4809 Chinhoyi, Zimbabwe, -17.3497, 30.1944 Pantukan, Philippines, 7.1269, 125.8975 Pongotan, Philippines, 7.1269, 125.8975 Ramagiri Udayagiri, India, 19.1619, 84.1440 Cambambe, Angola, -9.7586, 14.5122 Mengdingjie, China, 23.5500, 99.0833 Colombes, France, 48.9236, 2.2522 Funza, Colombia, 4.7167, -74.2167 Lawton, United States, 34.6175, -98.4202 Zhezqazghan, Kazakhstan, 47.7833, 67.7000 Avondale, United States, 33.3873, -112.3235 Katiola, Côte d’Ivoire, 8.1333, -5.1000 Kattaqo'rg'on Shahri, Uzbekistan, 39.8989, 66.2561 Cankiri, Turkey, 40.5986, 33.6192 Eslamabad-e Gharb, Iran, 34.1103, 46.5275 Chililabombwe, Zambia, -12.3667, 27.8278 Vanadzor, Armenia, 40.8128, 44.4883 Germantown, United States, 39.1755, -77.2643 Fundacion, Colombia, 10.5214, -74.1867 Ponnani, India, 10.7700, 75.9000 Sahagun, Colombia, 8.9500, -75.4500 Michurinsk, Russia, 52.8833, 40.4833 Montelibano, Colombia, 7.9750, -75.4208 Ceylanpinar, Turkey, 36.8461, 40.0489 Jamtara, India, 23.9633, 86.8014 Rapid City, United States, 44.0716, -103.2204 Larnaca, Cyprus, 34.9167, 33.6333 Sao Lourenco da Mata, Brazil, -8.0019, -35.0178 Guliston, Uzbekistan, 40.4833, 68.7833 Pinamalayan, Philippines, 13.0364, 121.4889 Orpington, United Kingdom, 51.3741, 0.0986 Valjevo, Serbia, 44.2708, 19.8866 Julu, China, 37.2075, 115.0233 Vezirkopru, Turkey, 41.1431, 35.4600 Mandurah, Australia, -32.5289, 115.7231 Watford, United Kingdom, 51.6550, -0.3957 Masvingo, Zimbabwe, -20.0744, 30.8328 Sao Joao del Rei, Brazil, -21.1358, -44.2619 Yoshiwara, Japan, 35.1633, 138.6866 Puerto Padre, Cuba, 21.1950, -76.6017 Caucasia, Colombia, 7.9833, -75.2000 Penaflor, Chile, -33.6167, -70.9167 Imizucho, Japan, 36.7306, 137.0756 Nasatta, Pakistan, 34.1022, 71.7964 Abomey, Benin, 7.1856, 1.9881 Pollachi, India, 10.6590, 77.0080 Gjilan, Kosovo, 42.4689, 21.4633 Hendek, Turkey, 40.8050, 30.7492 Westminster, United States, 33.7523, -117.9938 El Ejido, Spain, 36.7831, -2.8167 Jalalpur Jattan, Pakistan, 32.6419, 74.2033 Wajir, Kenya, 1.7472, 40.0572 Victorias, Philippines, 10.9000, 123.0800 Marudi, Malaysia, 4.1833, 114.3167 Kavali, India, 14.9130, 79.9929 Botosani, Romania, 47.7486, 26.6694 Luau, Angola, -10.7044, 22.2283 Necochea, Argentina, -38.5500, -58.7333 Tangjia, China, 30.7833, 120.3000 Al Badrashayn, Egypt, 29.8500, 31.2667 Leogane, Haiti, 18.5108, -72.6339 Darnah, Libya, 32.7648, 22.6391 Mong Tun, Burma, 20.3000, 98.9333 Richard-Toll, Senegal, 16.4661, -15.6933 Afmadow, Somalia, 0.5127, 42.0796 Barwaaqo, Somalia, 3.4832, 42.1868 Ma`arrat an Nu`man, Syria, 35.6483, 36.6769 La Grita, Venezuela, 8.1333, -71.9833 Mihara, Japan, 34.3975, 133.0786 El Puerto de Santa Maria, Spain, 36.6015, -6.2381 Hoopstad, South Africa, -27.8333, 25.9167 Compostela, Philippines, 7.6700, 126.0800 Mogok, Burma, 22.9167, 96.5000 Bayt Lahya, Gaza Strip, 31.5464, 34.4951 Patrocinio, Brazil, -18.9439, -46.9928 Chiclana de la Frontera, Spain, 36.4167, -6.1500 Msaken, Tunisia, 35.7333, 10.5833 Itapeva, Brazil, -23.9819, -48.8758 Olavarria, Argentina, -36.9000, -60.3333 Stevenage, United Kingdom, 51.9017, -0.2019 San Jose Pinula, Guatemala, 14.5500, -90.4167 Sankeshwar, India, 16.2700, 74.4800 Koka, Japan, 34.9667, 136.1667 Glyfada, Greece, 37.8667, 23.7500 Serdar, Turkmenistan, 38.9833, 56.2833 Saquarema, Brazil, -22.9200, -42.5100 Bangkalan, Indonesia, -7.0253, 112.7519 Los Cerrillos, Chile, -33.5000, -70.7167 Aubervilliers, France, 48.9131, 2.3831 Conda, Angola, -11.1667, 14.5000 Poitiers, France, 46.5800, 0.3400 Tartus, Syria, 34.8846, 35.8866 Sarapul, Russia, 56.4667, 53.8000 Kadiri, India, 14.1200, 78.1700 Zhunan, Taiwan, 24.6833, 120.8833 Torrente, Spain, 39.4389, -0.4656 Ipil, Philippines, 7.7822, 122.5867 Prijedor, Bosnia and Herzegovina, 44.9808, 16.7133 Mestre, Italy, 45.4906, 12.2381 Villa de Cura, Venezuela, 10.0383, -67.4892 Caracase, Somalia, 3.7532, 42.5441 Surallah, Philippines, 6.3700, 124.7300 Ciudad de Atlixco, Mexico, 18.9000, -98.4500 Pistoia, Italy, 43.9333, 10.9167 Segbana, Benin, 10.9278, 3.6944 Clifton, United States, 40.8630, -74.1575 Lere, Chad, 9.6572, 14.2283 Cheektowaga, United States, 42.9082, -78.7466 Kazanlak, Bulgaria, 42.6170, 25.4000 Magadan, Russia, 59.5667, 150.8000 Phusro, India, 23.7700, 85.9900 Polangui, Philippines, 13.2922, 123.4856 Banga, Philippines, 6.3000, 124.7800 Humpata, Angola, -15.0000, 13.3333 Kalibo, Philippines, 11.7072, 122.3700 San Francisco, Mexico, 30.7841, -112.5180 Kuhdasht, Iran, 33.5294, 47.6092 Maladzyechna, Belarus, 54.3208, 26.8572 Jalal-Abad, Kyrgyzstan, 40.9375, 72.9861 Kairana, India, 29.3953, 77.2053 Jaworzno, Poland, 50.2044, 19.2700 Waukegan, United States, 42.3698, -87.8716 Shwebo, Burma, 22.5667, 95.7000 Hinigaran, Philippines, 10.2700, 122.8500 Calabanga, Philippines, 13.7089, 123.2161 As Salt, Jordan, 32.0333, 35.7333 Passi, Philippines, 11.1000, 122.6300 Murcia, Philippines, 10.6000, 123.0300 Bogo, Philippines, 11.0200, 124.0000 Aalst, Belgium, 50.9383, 4.0392 Al Khmissat, Morocco, 33.8167, -6.0667 Bloomington, United States, 44.8306, -93.3151 Lucca, Italy, 43.8500, 10.5167 Solikamsk, Russia, 59.6433, 56.7500 Hemei, Taiwan, 24.1167, 120.5000 Pisa, Italy, 43.7167, 10.4000 Wangqing, China, 43.3126, 129.7572 Viana do Castelo, Portugal, 41.7000, -8.8333 Danli, Honduras, 14.0324, -86.5683 Mayaguez, Puerto Rico, 18.2003, -67.1397 Gueznaia, Morocco, 35.7066, -5.9088 Toviklin, Benin, 6.8333, 1.8167 Chosica, Peru, -11.9361, -76.6972 Paingkyon, Burma, 17.0242, 97.9844 Villa Maria, Argentina, -32.4103, -63.2314 Rasipuram, India, 11.4618, 78.1909 Leping, China, 37.6147, 113.6650 Najibabad, India, 29.6128, 78.3425 San Leandro, United States, 37.7074, -122.1599 Newton, United States, 42.3316, -71.2085 Podujeve, Kosovo, 42.9111, 21.1899 San Luis, Cuba, 20.1881, -75.8486 Barra do Corda, Brazil, -5.5031, -45.2369 Joplin, United States, 37.0757, -94.5018 Bhakkar, Pakistan, 31.6278, 71.0625 Berisso, Argentina, -34.8728, -57.8858 Bertoua, Cameroon, 4.5833, 13.6833 Solana, Philippines, 17.6522, 121.6914 Ain M'Lila, Algeria, 36.0361, 6.5708 Nirmal, India, 19.1000, 78.3500 Nirala, India, 19.8143, 78.1662 Ootacamund, India, 11.4100, 76.7000 Fulad Shahr, Iran, 32.4906, 51.4211 Echague, Philippines, 16.7056, 121.6761 Aroroy, Philippines, 12.5125, 123.3989 Buzuluk, Russia, 52.7833, 52.2500 Mobara, Japan, 35.4285, 140.2881 Prosperidad, Philippines, 8.6100, 125.9200 Lawrence, United States, 42.7002, -71.1626 Alabel, Philippines, 6.1023, 125.2868 Suva, Fiji, -18.1333, 178.4333 Ban Laem Chabang, Thailand, 13.0833, 100.8833 Beja, Tunisia, 36.7333, 9.1833 Grimsby, United Kingdom, 53.5675, -0.0800 Villingen-Schwenningen, Germany, 48.0603, 8.4586 Jangipur, India, 24.4691, 88.1032 Jaffna, Sri Lanka, 9.6647, 80.0167 Nikaia, Greece, 37.9667, 23.6333 Janzur, Libya, 32.8172, 13.0111 Leshou, China, 38.1822, 116.1108 Sangrur, India, 30.2506, 75.8442 Damaturu, Nigeria, 11.7444, 11.9611 Qiantangcun, China, 23.6742, 116.9150 Hartlepool, United Kingdom, 54.6900, -1.2100 Al Wakrah, Qatar, 25.1800, 51.6100 Tuban, Indonesia, -6.9000, 112.0500 Sassandra, Côte d’Ivoire, 4.9504, -6.0833 Sakai, Japan, 36.1669, 136.2314 Newmarket, Canada, 44.0500, -79.4667 Jilotepec, Mexico, 19.9519, -99.5328 Makilala, Philippines, 6.9700, 125.0800 Panevezys, Lithuania, 55.7250, 24.3639 Wislane, Morocco, 30.2250, -8.3801 Maiquetia, Venezuela, 10.5958, -66.9772 Mettupalaiyam, India, 11.2341, 76.9067 Wakiso, Uganda, 0.3981, 32.4781 Bromley, United Kingdom, 51.4070, 0.0210 Jumri Tilaiya, India, 24.4289, 85.5355 Guanambi, Brazil, -14.2228, -42.7808 Jaguey Grande, Cuba, 22.5292, -81.1325 Glazov, Russia, 58.1333, 52.6667 Baggao, Philippines, 17.9347, 121.7733 San Juan de los Morros, Venezuela, 9.9010, -67.3540 Tonghae, Korea, South, 37.5248, 129.1143 Ende, Indonesia, -8.8333, 121.6500 Aruppukkottai, India, 9.5139, 78.1002 Menglang, China, 22.5586, 99.9336 Faridkot, India, 30.6700, 74.7600 Calauan, Philippines, 14.1500, 121.3200 Ama, Japan, 35.2004, 136.7832 Slupsk, Poland, 54.4658, 17.0292 Madgaon, India, 15.2736, 73.9581 Baras, Philippines, 14.5200, 121.2700 Gitarama, Rwanda, -2.0696, 29.7600 Zwickau, Germany, 50.7167, 12.5000 Koidu-Bulma, Sierra Leone, 8.4405, -10.8500 Palangotu Adwar, India, 32.7888, 76.0009 Ratingen, Germany, 51.3000, 6.8500 Western Bicutan, Philippines, 14.5094, 121.0381 Chester, United Kingdom, 53.1914, -2.8903 Consolacion del Sur, Cuba, 22.5083, -83.5172 Tire, Turkey, 38.0833, 27.7333 Changting, China, 25.8670, 116.3167 Maasin, Philippines, 10.1300, 124.8500 San Fabian, Philippines, 16.1500, 120.4500 Ben Gardane, Tunisia, 33.1389, 11.2167 Satrovka, Azerbaijan, 39.8290, 48.9478 Springdale, United States, 36.1901, -94.1574 Midrand, South Africa, -25.9992, 28.1264 Denan, Ethiopia, 6.5000, 43.5000 Chauk Azam, Pakistan, 30.9648, 71.2170 Santa Catarina Pinula, Guatemala, 14.5667, -90.5000 Dobrich, Bulgaria, 43.5667, 27.8333 Calaca, Philippines, 13.9300, 120.8131 Caratinga, Brazil, -19.7900, -42.1389 Jamui, India, 24.9278, 86.2239 Middelburg, South Africa, -25.7681, 29.4547 Nahuala, Guatemala, 14.8500, -91.3167 Camiling, Philippines, 15.6867, 120.4131 Troy, United States, 42.5817, -83.1457 Limpio, Paraguay, -25.1673, -57.4695 Reutov, Russia, 55.7622, 37.8567 Shuangshuicun, China, 22.4356, 112.9964 Chongoroi, Angola, -13.5667, 13.9500 Lunen, Germany, 51.6167, 7.5167 Chimbas, Argentina, -31.5000, -68.5319 Rubio, Venezuela, 7.7000, -72.3500 Bhola, Bangladesh, 22.6833, 90.6500 Lorena, Brazil, -22.7308, -45.1247 Dipalpur, Pakistan, 30.6708, 73.6533 Fulham, United Kingdom, 51.4828, -0.1950 Hounde, Burkina Faso, 11.5000, -3.5167 Usulutan, El Salvador, 13.3500, -88.4500 Ad Diwem, Sudan, 13.9904, 32.3000 Norton, Zimbabwe, -17.8833, 30.7000 Citrus Heights, United States, 38.6948, -121.2880 Dunkerque, France, 51.0383, 2.3775 Bama, China, 24.1474, 107.2593 Wulan, China, 36.5585, 104.6765 Cuscatancingo, El Salvador, 13.7333, -89.1833 Heyunkeng, China, 23.9533, 112.9808 Kumarapalaiyam, India, 11.4416, 77.6907 Heerlen, Netherlands, 50.8833, 5.9833 Mechelen, Belgium, 51.0281, 4.4803 Takasagocho-takasemachi, Japan, 34.7667, 134.7833 Binmaley, Philippines, 16.0323, 120.2690 Tangxing, China, 35.7261, 111.7108 Campana, Argentina, -34.1667, -58.9167 Paredes, Portugal, 41.2000, -8.3333 Fukuroi, Japan, 34.7502, 137.9247 Widekum, Cameroon, 5.8717, 9.7706 Kansk, Russia, 56.2000, 95.7167 Taohuajiang, China, 28.5239, 112.1342 Longonjo, Angola, -12.9067, 15.1864 Les Cayes, Haiti, 18.2000, -73.7500 Hansi, India, 29.1000, 75.9700 Salinas Victoria, Mexico, 25.9667, -100.3000 Deerfield Beach, United States, 26.3050, -80.1277 Cardenas, Cuba, 23.0428, -81.2036 Shahdol, India, 23.2800, 81.3500 Yoro, Honduras, 15.1379, -87.1249 Hamakita, Japan, 34.7931, 137.7900 Arona, Spain, 28.1000, -16.6667 Unai, Brazil, -16.3639, -46.8944 Belladere, Haiti, 18.8500, -71.7833 Clarkstown, United States, 41.1319, -73.9660 Nuneaton, United Kingdom, 52.5230, -1.4680 Town 'n' Country, United States, 28.0106, -82.5763 Gavle, Sweden, 60.6748, 17.1444 Toledo, Spain, 39.8567, -4.0244 Anakapalle, India, 17.6913, 83.0039 Gravata, Brazil, -8.2008, -35.5650 Winchester, United States, 39.1735, -78.1746 Nabua, Philippines, 13.4083, 123.3750 Tucupita, Venezuela, 9.0592, -62.0681 Tuncheng, China, 19.3633, 110.0978 Nimbahera, India, 24.6200, 74.6800 Yaofeng, China, 35.1395, 111.2174 Nachchandupatti, India, 10.3238, 78.7233 Hassi Bahbah, Algeria, 35.0667, 3.0333 Loznica, Serbia, 44.5333, 19.2258 Kalpitiya, Sri Lanka, 8.2372, 79.7628 Karanganyar, Indonesia, -7.6033, 110.9778 Navegantes, Brazil, -26.8989, -48.6539 Yabelo, Ethiopia, 4.8833, 38.0833 Santa Rosa Jauregui, Mexico, 20.7418, -100.4473 Dingcheng, China, 19.6803, 110.3681 Guasave, Mexico, 25.5655, -108.4718 Aulnay-sous-Bois, France, 48.9386, 2.4906 Gotenba, Japan, 35.3087, 138.9346 Miaoli, Taiwan, 24.5700, 120.8200 Odienne, Côte d’Ivoire, 9.5000, -7.5667 Bilwi, Nicaragua, 14.0281, -83.3808 Bantayan, Philippines, 11.2000, 123.7300 San Antonio, Chile, -33.5933, -71.6217 Mission, United States, 26.2039, -98.3256 Kahta, Turkey, 37.7803, 38.6217 Batticaloa, Sri Lanka, 7.7170, 81.7000 Ibshaway, Egypt, 29.3590, 30.6806 La Libertad, Guatemala, 16.7861, -90.1167 Bryan, United States, 30.6650, -96.3807 Settsu, Japan, 34.7772, 135.5622 Chekhov, Russia, 55.1500, 37.4500 Silvan, Turkey, 38.1422, 41.0014 Sarni, India, 22.1040, 78.1730 Repentigny, Canada, 45.7333, -73.4667 Shchekino, Russia, 54.0000, 37.5167 Thanhlyin, Burma, 16.7333, 96.2500 Khowrasgan, Iran, 32.6528, 51.7589 Kitanagoya, Japan, 35.2456, 136.8659 Shaoshanzhan, China, 27.9150, 112.5267 Potiskum, Nigeria, 11.7104, 11.0800 Tajrish, Iran, 35.8056, 51.4381 Velez-Malaga, Spain, 36.7833, -4.1000 Velikiye Luki, Russia, 56.3333, 30.5333 Ciudad de Melilla, Spain, 35.2922, -2.9408 Sharurah, Saudi Arabia, 17.4908, 47.1126 Kameoka, Japan, 35.0167, 135.5667 Hawthorne, United States, 33.9147, -118.3476 Whittier, United States, 33.9678, -118.0188 Keffi, Nigeria, 8.8464, 7.8733 Qaracuxur, Azerbaijan, 40.3969, 49.9733 Iga, Japan, 34.7667, 136.1333 Livermore, United States, 37.6868, -121.7607 Chiguayante, Chile, -36.9167, -73.0167 Cabiao, Philippines, 15.2522, 120.8575 Fuengirola, Spain, 36.5417, -4.6250 Caceres, Brazil, -16.0711, -57.6789 Lake Forest, United States, 33.6605, -117.6714 Volos, Greece, 39.3667, 22.9333 Guinobatan, Philippines, 13.1800, 123.6000 Konstanz, Germany, 47.6667, 9.1833 Kharian, Pakistan, 32.8108, 73.8647 Anapa, Russia, 44.8944, 37.3167 San Ramon, United States, 37.7624, -121.9365 Melbourne, United States, 28.1086, -80.6627 Basoda, India, 23.8515, 77.9365 Longhua, China, 41.3246, 117.7344 Taishan Houcun, China, 41.3170, 117.7264 San Pedro Sacatepequez, Guatemala, 14.9667, -91.7667 Ducheng, China, 23.2445, 111.5342 Sekimachi, Japan, 35.4958, 136.9180 Maratturai, India, 11.1536, 79.5329 Worms, Germany, 49.6319, 8.3653 Redencao, Brazil, -8.0289, -50.0308 Karakol, Kyrgyzstan, 42.4906, 78.3936 El Bayadh, Algeria, 33.6803, 1.0203 Franklin, United States, 35.9200, -86.8516 Mukacheve, Ukraine, 48.4500, 22.7500 Fusui, China, 22.6325, 107.9047 Karad, India, 17.2850, 74.1840 Xuddur, Somalia, 4.1200, 43.8878 Kirklareli, Turkey, 41.7347, 27.2253 Pariaman, Indonesia, -0.6264, 100.1178 Auburn, United States, 47.3039, -122.2108 Chinnachauku, India, 14.4732, 78.8451 Batarasa, Philippines, 8.6700, 117.6200 Colonie, United States, 42.7396, -73.7874 Lugang, Taiwan, 24.0500, 120.4333 Junin, Argentina, -34.5833, -60.9500 Caldas, Colombia, 6.0900, -75.6380 Kombolcha, Ethiopia, 11.0867, 39.7367 Novo Hamburgo, Brazil, -29.6778, -51.1308 Mitrovice, Kosovo, 42.8833, 20.8667 Jinhe, China, 22.7667, 103.2500 Garulia, India, 22.8200, 88.3700 Tagaytay, Philippines, 14.1000, 120.9300 Apaseo el Grande, Mexico, 20.5531, -100.6347 Chanwari, India, 23.1917, 82.3542 General Rodriguez, Argentina, -34.6167, -58.9500 Chiquinquira, Colombia, 5.6333, -73.7500 Krishnagiri, India, 12.5317, 78.2174 Dapitan, Philippines, 8.6549, 123.4243 Takayama, Japan, 36.1460, 137.2522 Upper Darby, United States, 39.9490, -75.2891 Grand Bourg, Argentina, -34.4833, -58.7167 Harda Khas, India, 22.3441, 77.0954 Maga, Cameroon, 10.8500, 14.9333 Zarafshon Shahri, Uzbekistan, 41.6081, 64.2264 Araripina, Brazil, -7.5500, -40.5667 Monte Chingolo, Argentina, -34.7333, -58.3500 Port Huron, United States, 42.9821, -82.4388 Puerto Maldonado, Peru, -12.6000, -69.1833 Mhow, India, 22.5500, 75.7600 Derry, United Kingdom, 54.9975, -7.3200 Santa Ines, Brazil, -3.6669, -45.3800 Ealing, United Kingdom, 51.5175, -0.2988 Marl, Germany, 51.6667, 7.1167 Hovsan, Azerbaijan, 40.3753, 50.0839 Luvungi, Congo (Kinshasa), -2.8600, 29.0300 Bahla', Oman, 22.9789, 57.3047 Atakpame, Togo, 7.5269, 1.1267 Woolwich, United Kingdom, 51.4880, 0.0630 Longchuan, China, 25.1615, 101.2942 Karacabey, Turkey, 40.2167, 28.3500 Baabda, Lebanon, 33.8333, 35.5333 Hinthada, Burma, 17.6461, 95.4603 San Baudilio de Llobregat, Spain, 41.3360, 2.0430 Presov, Slovakia, 49.0000, 21.2333 Sayhat, Saudi Arabia, 26.4834, 50.0485 Yuksekova, Turkey, 37.5690, 44.2830 Peterborough, Canada, 44.3000, -78.3167 Ciudad Mante, Mexico, 22.7333, -98.9500 Pandacan, Philippines, 14.5940, 121.0070 Tuxpam de Rodriguez Cano, Mexico, 20.9500, -97.4000 Chirundu, Zambia, -16.0500, 28.8333 Mohammadia, Algeria, 35.5833, 0.0667 Dien Bien Phu, Vietnam, 21.3833, 103.0167 Catanzaro, Italy, 38.9100, 16.5875 Sumenep, Indonesia, -7.0049, 113.8496 Tshilenge, Congo (Kinshasa), -6.2500, 23.7667 Sentani, Indonesia, -2.5636, 140.5146 Decatur, United States, 39.8557, -88.9342 Treviso, Italy, 45.6722, 12.2422 Madaba, Jordan, 31.7167, 35.8000 Khemis Miliana, Algeria, 36.2667, 2.2167 Yokotemachi, Japan, 39.3113, 140.5533 Dhoraji, India, 21.7337, 70.4499 Baytown, United States, 29.7587, -94.9671 Rafha, Saudi Arabia, 29.6202, 43.4948 Honiara, Solomon Islands, -9.4333, 159.9500 Ushiku, Japan, 35.9794, 140.1496 Houmt Souk, Tunisia, 33.8667, 10.8500 Virappanchathiram, India, 11.3553, 77.6678 Komae, Japan, 35.6348, 139.5787 Santana do Livramento, Brazil, -30.8908, -55.5328 Sabanalarga, Colombia, 10.6300, -74.9236 New Kru Town, Liberia, 6.3733, -10.7928 Carpina, Brazil, -7.8508, -35.2547 Standerton, South Africa, -26.9500, 29.2500 Kaizuka, Japan, 34.4333, 135.3667 Brooklyn Park, United States, 45.1112, -93.3505 Nabunturan, Philippines, 7.6008, 125.9656 Bais, Philippines, 9.5907, 123.1213 Villa Altagracia, Dominican Republic, 18.6700, -70.1700 Springfield, United States, 39.9300, -83.7959 Science City of Munoz, Philippines, 15.7153, 120.9039 Newport Beach, United States, 33.6151, -117.8668 Nabeul, Tunisia, 36.4542, 10.7347 Athurugiriya, Sri Lanka, 6.8687, 79.9998 Higashiyamato, Japan, 35.7500, 139.4264 Ayase, Japan, 35.4333, 139.4333 Bangil, Indonesia, -7.5978, 112.7846 Chigorodo, Colombia, 7.6675, -76.6808 Westland, United States, 42.3192, -83.3805 Concepcion Tutuapa, Guatemala, 15.2833, -91.7833 Port of Spain, Trinidad and Tobago, 10.6667, -61.5167 Euriapolis, Brazil, -16.3778, -39.5800 Wako, Japan, 35.7812, 139.6057 Al Hindiyah, Iraq, 32.5467, 44.2277 Luancheng, China, 37.9003, 114.6483 Darayya, Syria, 33.4583, 36.2326 Sambava, Madagascar, -14.2662, 50.1666 Pori, Finland, 61.4833, 21.8000 Kitakoriyamacho, Japan, 34.6494, 135.7828 Ilion, Greece, 38.0333, 23.7000 Laharpur, India, 27.7200, 80.9000 Hetauda, Nepal, 27.4167, 85.0333 Ath Thawrah, Syria, 35.8367, 38.5481 Bolinao, Philippines, 16.3881, 119.8947 San Carlos, Venezuela, 9.6500, -68.5833 Aruja, Brazil, -23.3967, -46.3211 El Milia, Algeria, 36.7500, 6.2667 Channapatna, India, 12.6514, 77.2067 Versailles, France, 48.8050, 2.1350 Newark, United States, 40.0706, -82.4250 Chita, Japan, 35.0000, 136.8667 Kesan, Turkey, 40.8500, 26.6333 Ermelo, South Africa, -26.5333, 29.9833 Yambol, Bulgaria, 42.4833, 26.5000 Xishancun, China, 23.2618, 116.2321 Acayucan, Mexico, 17.9422, -94.9103 Lucas do Rio Verde, Brazil, -13.0500, -55.9108 Dolisie, Congo (Brazzaville), -4.2006, 12.6792 Gubkin, Russia, 51.2828, 37.5353 Pilkhua, India, 28.7120, 77.6545 Ho, Ghana, 6.6004, 0.4700 Matao, Brazil, -21.6033, -48.3658 Barahona, Dominican Republic, 18.2079, -71.0996 Tiruppattur, India, 12.4915, 78.5684 Hamma Bouziane, Algeria, 36.5333, 6.7167 Moriyama, Japan, 35.0586, 135.9942 Nizwa, Oman, 22.9333, 57.5333 Konotop, Ukraine, 51.2167, 33.2000 Foumban, Cameroon, 5.7167, 10.9167 Valdemoro, Spain, 40.1908, -3.6742 Baghlan, Afghanistan, 36.1328, 68.7000 Talavera de la Reina, Spain, 39.9583, -4.8328 Muncie, United States, 40.1989, -85.3950 Lafey, Kenya, 3.1508, 41.1864 Galway, Ireland, 53.2729, -9.0418 Aylesbury, United Kingdom, 51.8168, -0.8124 Nazareth, Israel, 32.7019, 35.3033 Taytay, Philippines, 10.8200, 119.5200 Phuc Yen, Vietnam, 21.2333, 105.7000 Resita, Romania, 45.3008, 21.8892 La Piedad, Mexico, 20.3333, -102.0167 Farmington Hills, United States, 42.4860, -83.3771 Gokulgarh, India, 28.2468, 76.6176 Kamensk-Shakhtinskiy, Russia, 48.3206, 40.2611 Serrinha, Brazil, -11.6642, -39.0075 Venado Tuerto, Argentina, -33.7500, -61.9667 Maco, Philippines, 7.3619, 125.8553 Ciudad de Ceuta, Spain, 35.8883, -5.3156 Cicero, United States, 41.8445, -87.7593 Ashford, United Kingdom, 51.1465, 0.8676 Sirsilla, India, 18.3800, 78.8300 Como, Italy, 45.8103, 9.0861 Boukoumbe, Benin, 10.1833, 1.1000 Habiganj, Bangladesh, 24.3804, 91.4130 Lakshmipur, Bangladesh, 22.9443, 90.8301 La Trinidad, Mexico, 15.9833, -91.8667 Minden, Germany, 52.2883, 8.9167 Picos, Brazil, -7.0769, -41.4669 Siaton, Philippines, 9.0700, 123.0300 Pontevedra, Spain, 42.4333, -8.6333 Kampong Trach, Cambodia, 10.5585, 104.4675 San Antonio, Philippines, 15.3078, 120.8533 Buena Park, United States, 33.8572, -118.0046 Lelystad, Netherlands, 52.5167, 5.4833 San Fernando, Trinidad and Tobago, 10.2833, -61.4667 Wutiancun, China, 23.1852, 116.4757 Mingxing, China, 37.4264, 112.5442 Valinhos, Brazil, -22.9708, -46.9958 Mazatenango, Guatemala, 14.5333, -91.5000 Mansa, India, 29.9906, 75.3996 Tual, Indonesia, -5.6368, 132.7508 Mabinay, Philippines, 9.7300, 122.9200 Busto Arsizio, Italy, 45.6120, 8.8518 Nantingcun, China, 20.8422, 110.0586 David, Panama, 8.4333, -82.4333 Al Hayy, Iraq, 32.1742, 46.0433 Louga, Senegal, 15.6167, -16.2167 Warwick, United States, 41.7062, -71.4334 Ufeyn, Somalia, 10.6524, 49.7537 Ji'an, Taiwan, 23.9500, 121.5722 Wadala Sandhuan, Pakistan, 32.1833, 74.4000 Araruama, Brazil, -22.8728, -42.3428 Jastrzebie-Zdroj, Poland, 49.9500, 18.5833 Bayeux, Brazil, -7.1333, -34.9333 Hattiesburg, United States, 31.3074, -89.3170 Stockton-on-Tees, United Kingdom, 54.5700, -1.3200 Zheleznogorsk, Russia, 56.2500, 93.5333 Norderstedt, Germany, 53.7064, 10.0103 Mugla, Turkey, 37.2167, 28.3667 Nakatsu, Japan, 33.5983, 131.1883 Brindisi, Italy, 40.6383, 17.9458 Shirvan, Iran, 37.4019, 57.9281 Villa Vicente Guerrero, Mexico, 19.1190, -98.1700 Zilina, Slovakia, 49.2167, 18.7333 Tanjay, Philippines, 9.5200, 123.1600 Cranston, United States, 41.7658, -71.4858 Ushuaia, Argentina, -54.8019, -68.3031 Albany, United States, 31.5776, -84.1762 Chingleput, India, 12.6918, 79.9766 Jacobina, Brazil, -11.1808, -40.5178 Mian Channun, Pakistan, 30.4500, 72.3667 Manfalut, Egypt, 27.3128, 30.9703 Rivadavia, Argentina, -31.5303, -68.5947 Rivadavia, Argentina, -33.1833, -68.4667 Bagamoyo, Tanzania, -6.4444, 38.9028 Cruzeiro, Brazil, -22.5772, -44.9583 Chelghoum el Aid, Algeria, 36.1667, 6.1667 Bhalwal, Pakistan, 32.2656, 72.8994 Mussende, Angola, -10.5103, 16.0107 Calatrava, Philippines, 10.6000, 123.4800 Wuyi, China, 37.7965, 115.8920 Chulucanas, Peru, -5.0961, -80.1647 Layton, United States, 41.0770, -111.9620 Madera, United States, 36.9630, -120.0778 Largo, United States, 27.9088, -82.7712 El Estor, Guatemala, 15.5333, -89.3500 Velbert, Germany, 51.3333, 7.0500 Cukai, Malaysia, 4.2332, 103.4479 Redwood City, United States, 37.5025, -122.2253 Sabaneta, Colombia, 6.1500, -75.6000 Mountain View, United States, 37.4001, -122.0796 Owariasahi, Japan, 35.2165, 137.0354 Izalco, El Salvador, 13.7333, -89.6667 Shikokuchuo, Japan, 33.9833, 133.5500 Nakhon Sawan, Thailand, 15.7133, 100.1353 Deurne, Belgium, 51.2247, 4.4625 Pine Hills, United States, 28.5818, -81.4692 Cajica, Colombia, 4.9167, -74.0333 Omihachiman, Japan, 35.1283, 136.0981 Puerto Iguazu, Argentina, -25.6000, -54.5667 Nueva Concepcion, Guatemala, 14.1997, -91.2997 Comonfort, Mexico, 20.7167, -100.7667 Quixeramobim, Brazil, -5.1989, -39.2928 Yeysk, Russia, 46.7111, 38.2733 Saint Albans, United Kingdom, 51.7550, -0.3360 Folsom, United States, 38.6668, -121.1422 Silver Spring, United States, 39.0028, -77.0207 Johns Creek, United States, 34.0333, -84.2027 The Villages, United States, 28.9034, -81.9887 Tacana, Guatemala, 15.2414, -92.0683 Harlow, United Kingdom, 51.7790, 0.1280 Carmen, Philippines, 7.3606, 125.7064 Burnley, United Kingdom, 53.7890, -2.2480 Courbevoic, France, 48.8978, 2.2531 Ratodero, Pakistan, 27.8000, 68.2833 Jepara, Indonesia, -6.5333, 110.6667 Redditch, United Kingdom, 52.3000, -1.9333 Saunda, India, 23.6600, 85.3500 Kongjiazhuangcun, China, 40.7536, 114.7237 Ashoknagar, India, 24.5800, 77.7300 Ubay, Philippines, 10.0560, 124.4729 Bhaktapur, Nepal, 27.6722, 85.4278 Banco Filipino International Village, Philippines, 14.4499, 120.9996 Owensboro, United States, 37.7575, -87.1172 Yildiz, Turkey, 41.6344, 32.3375 Gurgenpinari, Turkey, 41.6344, 32.3375 Uzungoz, Turkey, 41.6344, 32.3375 Bartin, Turkey, 41.6344, 32.3375 Lucerne, Switzerland, 47.0523, 8.3059 Siasi, Philippines, 5.5462, 120.8145 Concordia, Brazil, -27.2339, -52.0278 Napa, United States, 38.2975, -122.3010 Watampone, Indonesia, -4.5386, 120.3297 Katoya, India, 23.6500, 88.1300 An Khe, Vietnam, 13.9531, 108.6569 New Rochelle, United States, 40.9304, -73.7836 Jaen, Peru, -5.7083, -78.8083 Muroran, Japan, 42.3167, 140.9667 Timoteo, Brazil, -19.5828, -42.6439 Apizaco, Mexico, 19.4167, -98.1333 Hukou, Taiwan, 24.9000, 121.0500 Rubi, Spain, 41.4933, 2.0325 Uman, Ukraine, 48.7500, 30.2167 Purmerend, Netherlands, 52.5000, 4.9500 Dar el Beida, Algeria, 36.7142, 3.2125 Imam Qasim, Iraq, 32.2980, 44.6828 Kentau, Kazakhstan, 43.5167, 68.5167 Alhambra, United States, 34.0840, -118.1355 Mogi Mirim, Brazil, -22.4319, -46.9578 Remedios de Escalada, Argentina, -34.7167, -58.4000 Xicotepec de Juarez, Mexico, 20.3000, -97.9667 Fiumicino, Italy, 41.7667, 12.2333 Shuibian, China, 24.1263, 112.7668 Mandiraja Kulon, Indonesia, -7.4722, 109.5133 Kadi, India, 23.3009, 72.3322 Chapadinha, Brazil, -3.7419, -43.3600 Xiedian, China, 35.4190, 110.8281 Cheyenne, United States, 41.1350, -104.7902 Kimje, Korea, South, 35.8017, 126.8889 Kimitsu, Japan, 35.3304, 139.9027 Matalam, Philippines, 7.0800, 124.9000 Grosseto, Italy, 42.7722, 11.1089 Miami Beach, United States, 25.8171, -80.1396 Buhi, Philippines, 13.4347, 123.5167 Athi River, Kenya, -1.4500, 36.9833 Nowy Sacz, Poland, 49.6239, 20.6972 San Jose de las Lajas, Cuba, 22.9614, -82.1511 Lambunao, Philippines, 11.0500, 122.4800 Bulacan, Philippines, 14.7928, 120.8789 Shumen, Bulgaria, 43.2746, 26.9349 Mannargudi, India, 10.6653, 79.4521 Pilar, Argentina, -34.4500, -58.9167 Orhangazi, Turkey, 40.4889, 29.3083 Wenatchee, United States, 47.4360, -120.3295 Hengkou, China, 32.7378, 108.7695 Ita, Paraguay, -25.5096, -57.3600 Kapalong, Philippines, 7.5854, 125.7052 Panzos, Guatemala, 15.4000, -89.6667 Salina Cruz, Mexico, 16.1833, -95.2083 Tecate, Mexico, 32.5722, -116.6403 Jackson, United States, 42.2431, -84.4038 Balrampur, India, 27.4300, 82.1800 Baalbek, Lebanon, 34.0063, 36.2073 Hengelo, Netherlands, 52.2656, 6.7931 Lehi, United States, 40.4136, -111.8725 Kashiwazaki, Japan, 37.3719, 138.5590 Tallaght, Ireland, 53.2878, -6.3411 Khamanon Kalan, India, 30.8200, 76.3500 La Louviere, Belgium, 50.4667, 4.1833 Launceston, Australia, -41.4419, 147.1450 Dera Allahyar, Pakistan, 28.4167, 68.1667 Gonder, Ethiopia, 12.6075, 37.4592 Campo Limpo, Brazil, -23.2064, -46.7844 Rueil-Malmaison, France, 48.8760, 2.1810 Gaoliying Ercun, China, 40.1578, 116.4933 Rafah, Egypt, 31.2820, 34.2387 Anderson, United States, 40.0891, -85.6892 Beziers, France, 43.3476, 3.2190 Ahenkro, Ghana, 7.1146, 0.3211 Kharan, Pakistan, 28.5833, 65.4167 Yonezawa, Japan, 37.9222, 140.1168 Orihuela, Spain, 38.0856, -0.9469 Shiji, China, 23.5045, 112.9345 Gobernador Galvez, Argentina, -33.0256, -60.6336 San Francisco, Philippines, 8.5100, 125.9800 Leme, Brazil, -22.1858, -47.3900 Malapatan, Philippines, 5.9700, 125.2800 Homestead, United States, 25.4665, -80.4472 Balcova, Turkey, 38.3856, 27.0581 Florence, United States, 34.8303, -87.6655 Barili, Philippines, 10.1200, 123.5300 Wujindian, China, 31.9839, 112.7703 Meybod, Iran, 32.2456, 54.0153 Gelendzhik, Russia, 44.5750, 38.0725 Guercif, Morocco, 34.2333, -3.3667 Yanggao, China, 21.3298, 109.9177 Rancho Cordova, United States, 38.5737, -121.2527 Morgantown, United States, 39.6383, -79.9464 Bargarh, India, 21.3333, 83.6167 Curvelo, Brazil, -18.7564, -44.4308 San Cristobal Verapaz, Guatemala, 15.3650, -90.4792 Comitancillo, Guatemala, 15.0833, -91.7167 Boynton Beach, United States, 26.5281, -80.0811 Seropedica, Brazil, -22.7439, -43.7078 Bamberg, Germany, 49.8914, 10.8869 San Ramon, Costa Rica, 10.2182, -84.5992 Somerville, United States, 42.3908, -71.1014 Edmonton, United Kingdom, 51.6154, -0.0708 Sama'il, Oman, 23.2984, 57.9531 Dahegam, India, 23.1700, 72.8200 North Port, United States, 27.0576, -82.1977 Lakewood, United States, 33.8471, -118.1222 Torre del Greco, Italy, 40.7853, 14.3953 Randfontein, South Africa, -26.1797, 27.7042 Batley, United Kingdom, 53.7167, -1.6356 Adigala, Ethiopia, 10.4236, 42.2333 Santana, Brazil, -0.0350, -51.1750 Nagaoka, Japan, 34.9269, 135.6958 Rajula, India, 21.0500, 71.4300 Azov, Russia, 47.1083, 39.4181 Butterworth, Malaysia, 5.4171, 100.4000 Tala, Mexico, 20.6667, -103.7000 Antehiroka, Madagascar, -18.8492, 47.4828 Oum el Bouaghi, Algeria, 35.8775, 7.1136 Cabadbaran, Philippines, 9.1200, 125.5300 Salisbury, United States, 38.3756, -75.5865 South Jordan, United States, 40.5570, -111.9784 Tagoloan, Philippines, 8.5300, 124.7500 Kamareddipet, India, 18.3205, 78.3370 Zuwarah, Libya, 32.9333, 12.0833 Bafut, Cameroon, 6.0833, 10.1000 Takestan, Iran, 36.0672, 49.6958 Arni, India, 12.6677, 79.2853 Echizen, Japan, 35.9035, 136.1687 Maravatio de Ocampo, Mexico, 19.8976, -100.4500 Livingston, Guatemala, 15.8300, -88.7500 Kumbo, Cameroon, 6.2050, 10.6850 Bolpur, India, 23.6700, 87.7200 Manresa, Spain, 41.7294, 1.8272 Peruvancha, India, 17.1719, 80.5839 Neumunster, Germany, 54.0714, 9.9900 Sint-Niklaas, Belgium, 51.1667, 4.1333 Namsan, Korea, North, 42.2275, 129.2541 Parma, United States, 41.3843, -81.7286 Gumla, India, 23.0444, 84.5417 Simdega, India, 22.6200, 84.5200 San Andres Cholula, Mexico, 19.0500, -98.3000 Hanno, Japan, 35.8557, 139.3277 Gandia, Spain, 38.9667, -0.1833 Cachoeira do Sul, Brazil, -30.0394, -52.8953 Gamagori, Japan, 34.8431, 137.2196 Dogubayazit, Turkey, 39.5472, 44.0833 Manmad, India, 20.2510, 74.4390 Goiana, Brazil, -7.5606, -35.0025 Afsin, Turkey, 38.2464, 36.9186 Koktokay, China, 47.0004, 89.4666 Piro, India, 25.3300, 84.4200 Sira, India, 13.7450, 76.9090 Arsikere, India, 13.3139, 76.2369 Tall `Afar, Iraq, 36.3792, 42.4497 Taldyqorghan, Kazakhstan, 45.0167, 78.3667 Nabatiye, Lebanon, 33.3833, 35.4500 Masallatah, Libya, 32.5822, 14.0400 Andahuaylas, Peru, -13.6575, -73.3833 Kathri, Pakistan, 26.4583, 68.3192 Jamshoro, Pakistan, 25.4244, 68.2811 Khewra, Pakistan, 32.6500, 73.0167 Puerto Ayacucho, Venezuela, 5.6631, -67.6264 Scunthorpe, United Kingdom, 53.5809, -0.6502 La Rochelle, France, 46.1600, -1.1500 Mit Salsil, Egypt, 31.1676, 31.8012 Jagannathaprasad, India, 19.9700, 84.7700 San Jose, Philippines, 13.8772, 121.1050 Drobeta-Turnu Severin, Romania, 44.6333, 22.6500 Sokcho, Korea, South, 38.2069, 128.5919 Paco, Philippines, 14.5830, 120.9830 Kottagudem, India, 17.5500, 80.6300 Idah, Nigeria, 7.0978, 6.7433 Marsala, Italy, 37.7981, 12.4342 Pharr, United States, 26.1685, -98.1904 State College, United States, 40.7909, -77.8567 Ban Map Ta Phut, Thailand, 12.7258, 101.1722 Poblacion, Philippines, 6.8000, 124.6300 Piatra Neamt, Romania, 46.9275, 26.3708 Ciudad Lerdo, Mexico, 25.5500, -103.5167 Tissamaharama, Sri Lanka, 6.2765, 81.2865 Akiruno, Japan, 35.7289, 139.2941 Polatsk, Belarus, 55.4833, 28.8000 Ust'-Ilimsk, Russia, 58.0000, 102.6667 Patikul, Philippines, 6.0700, 121.1000 Ezpeleta, Argentina, -34.7517, -58.2344 Bani Mazar, Egypt, 28.5036, 30.8003 Bugulma, Russia, 54.5364, 52.7975 Vila do Conde, Portugal, 41.3500, -8.7500 Krasnyi Luch, Ukraine, 48.1333, 38.9333 Khrustalnyi, Ukraine, 48.1333, 38.9333 Cianorte, Brazil, -23.6628, -52.6050 Plymouth, United States, 45.0225, -93.4617 Belo Jardim, Brazil, -8.3358, -36.4239 Viana, Brazil, -20.3893, -40.4948 Eseka, Cameroon, 3.6500, 10.7667 Xai, Laos, 20.6914, 101.9861 Dosemealti, Turkey, 37.0236, 30.6011 Robles, Philippines, 10.3500, 123.0700 Sao Roque, Brazil, -23.5289, -47.1350 San Martin, Argentina, -33.0806, -68.4706 Torres Vedras, Portugal, 39.0833, -9.2667 Chibemba, Angola, 15.0000, 46.0000 Langarud, Iran, 37.1911, 50.1556 Senhor do Bonfim, Brazil, -10.4614, -40.1894 Medenine, Tunisia, 33.3547, 10.5053 Afgooye, Somalia, 2.1381, 45.1212 Turlock, United States, 37.5053, -120.8588 Vicosa, Brazil, -20.7539, -42.8819 Dudley, United Kingdom, 52.5080, -2.0890 San Isidro, Philippines, 14.4685, 121.0118 Iwamizawa, Japan, 43.2000, 141.7833 Davis, United States, 38.5553, -121.7370 Perris, United States, 33.7898, -117.2233 Mangatarem, Philippines, 15.7874, 120.2921 Ban Talat Rangsit, Thailand, 13.9833, 100.6167 Cacador, Brazil, -26.7753, -51.0150 Phuket, Thailand, 7.8881, 98.3975 Owendo, Gabon, 0.2912, 9.5047 Schiedam, Netherlands, 51.9167, 4.4000 Ban Nong Prue, Thailand, 12.9228, 100.9375 Drummondville, Canada, 45.8833, -72.4833 Viersen, Germany, 51.2561, 6.3972 Natori-shi, Japan, 38.1715, 140.8918 Kawartha Lakes, Canada, 44.3500, -78.7500 Lisala, Congo (Kinshasa), 2.1486, 21.5136 Evosmos, Greece, 40.6689, 22.9083 Warzat, Morocco, 30.9167, -6.9167 Tatvan, Turkey, 38.5022, 42.2814 Ciudad Lazaro Cardenas, Mexico, 17.9561, -102.1922 Jaen, Philippines, 15.3392, 120.9069 Jonesboro, United States, 35.8212, -90.6791 Dobni Para, India, 22.8347, 74.2556 Carmen, Philippines, 7.2000, 124.7800 Ceara-Mirim, Brazil, -5.6339, -35.4258 Tikamgarh, India, 24.7472, 78.8500 Ikom, Nigeria, 6.0833, 8.6167 Tustin, United States, 33.7311, -117.8107 Bumahen, Iran, 35.7322, 51.8672 Baharestan, Iran, 32.4867, 51.7808 Araria, India, 26.1500, 87.5200 Cuamba, Mozambique, -14.8200, 36.5486 Huaral, Peru, -11.5000, -77.2000 Madinat as Sadat, Egypt, 30.4182, 30.5747 Perere, Benin, 9.7994, 2.9928 Delmenhorst, Germany, 53.0506, 8.6317 Turkoglu, Turkey, 37.3914, 36.8522 Alfenas, Brazil, -21.4289, -45.9469 Sougueur, Algeria, 35.1833, 1.5000 Terre Haute, United States, 39.4660, -87.3751 Upland, United States, 34.1178, -117.6604 Nakatsugawa, Japan, 35.4876, 137.5006 Caraguatatuba, Brazil, -23.6200, -45.4128 New Westminster, Canada, 49.2069, -122.9111 Tiko, Cameroon, 4.0750, 9.3600 Sesto San Giovanni, Italy, 45.5333, 9.2333 Bistrita, Romania, 47.1333, 24.5000 Kouvola, Finland, 60.8681, 26.7042 Georgetown, United States, 30.6660, -97.6966 Subulussalam, Indonesia, 2.6422, 98.0042 Tambacounda, Senegal, 13.7689, -13.6672 Dome, Ghana, 5.6500, -0.2361 Tierralta, Colombia, 7.9167, -76.1667 Zarzis, Tunisia, 33.5000, 11.1167 Maizuru, Japan, 35.4667, 135.3833 Bury, United Kingdom, 53.5930, -2.2980 Eastleigh, United Kingdom, 50.9667, -1.3500 Elbasan, Albania, 41.1111, 20.0806 Pagbilao, Philippines, 13.9720, 121.6870 Villa Celina, Argentina, -34.7167, -58.4833 Ra's al Khafji, Saudi Arabia, 28.4237, 48.5091 Aligudarz, Iran, 33.4025, 49.6903 Zaandam, Netherlands, 52.4333, 4.8333 Mooka, Japan, 36.4404, 140.0134 Formosa, Brazil, -15.5369, -47.3339 Arlit, Niger, 18.7333, 7.3833 Skarzysko-Kamienna, Poland, 51.1167, 20.9167 Dabakala, Côte d’Ivoire, 8.3667, -4.4333 Moju, Brazil, -1.8839, -48.7689 Pau, France, 43.3000, -0.3700 Curepipe, Mauritius, -20.3188, 57.5263 Dongchuan, China, 25.4765, 101.2847 Hengbei, China, 23.8787, 115.7309 Kuvango, Angola, -14.4667, 16.3000 Texarkana, United States, 33.4500, -94.0847 Brixton, United Kingdom, 51.4575, -0.1175 Kendall, United States, 25.6697, -80.3556 Taher, Algeria, 36.7719, 5.8983 Gyoda, Japan, 36.1389, 139.4556 Sahuayo de Morelos, Mexico, 20.0500, -102.7333 Ijui, Brazil, -28.3878, -53.9150 Aveiro, Portugal, 40.6389, -8.6553 Bauang, Philippines, 16.5300, 120.3300 Pasco, United States, 46.2506, -119.1305 Dinga, Pakistan, 32.6410, 73.7243 Estepona, Spain, 36.4264, -5.1472 Iperu, Nigeria, 6.9143, 3.6632 Varese, Italy, 45.8167, 8.8333 Arkonam, India, 13.0778, 79.6667 Kuznetsk, Russia, 53.1167, 46.6000 Champigny-sur-Marne, France, 48.8172, 2.5156 Samadiala, India, 21.3370, 71.3100 Bandar-e Emam Khomeyni, Iran, 30.5491, 49.0586 Bandar Emam, Iran, 30.5058, 49.0742 Tres Rios, Brazil, -22.1169, -43.2089 Kashiba, Japan, 34.5414, 135.6992 Barreiro, Portugal, 38.6631, -9.0725 Denov, Uzbekistan, 38.2667, 67.9000 Pototan, Philippines, 10.9500, 122.6300 Qorveh, Iran, 35.1678, 47.8008 Queluz, Portugal, 38.7566, -9.2545 Limay, Philippines, 14.5619, 120.5983 Bamban, Philippines, 15.2742, 120.5669 Manbij, Syria, 36.5266, 37.9563 Yuanshan, China, 24.3733, 114.4856 Pingyi, China, 35.5104, 117.6200 Southall, United Kingdom, 51.5111, -0.3756 Huolu, China, 38.0874, 114.3159 San Pedro Pinula, Guatemala, 14.6667, -89.8500 Rheine, Germany, 52.2833, 7.4333 Pehonko, Benin, 10.2283, 2.0019 Milpitas, United States, 37.4336, -121.8921 Sankt Gallen, Switzerland, 47.4233, 9.3772 Marburg, Germany, 50.8100, 8.7708 Argao, Philippines, 9.8800, 123.6000 Al Khankah, Egypt, 30.2104, 31.3681 Joensuu, Finland, 62.6000, 29.7500 Tanashicho, Japan, 35.7275, 139.5489 Chitembo, Angola, -13.5138, 16.7541 Chitemo, Angola, -13.5167, 16.7667 Macabebe, Philippines, 14.9081, 120.7156 Kuacjok, South Sudan, 8.3028, 27.9800 Faranah, Guinea, 10.0333, -10.7333 Carmichael, United States, 38.6318, -121.3263 Baracoa, Cuba, 20.3444, -74.4956 Kizugawa, Japan, 34.7372, 135.8200 Chino Hills, United States, 33.9508, -117.7254 Godawari, Nepal, 28.9100, 80.5900 Vsevolozhsk, Russia, 60.0333, 30.6667 Balqash, Kazakhstan, 46.8481, 74.9950 Colon, Panama, 9.3650, -79.8750 Tanuku, India, 16.7566, 81.6770 Narra, Philippines, 9.2800, 118.4200 Koch Bihar, India, 26.3242, 89.4510 Maumere, Indonesia, -8.6222, 122.2122 Chengbin, China, 19.9969, 110.3375 Honjo, Japan, 36.2436, 139.1904 Pakxe, Laos, 15.1167, 105.7833 Toyomamachi-teraike, Japan, 38.6918, 141.1877 Fray Bartolome de Las Casas, Guatemala, 15.8456, -89.8658 Novouralsk, Russia, 57.2500, 60.0833 Flower Mound, United States, 33.0343, -97.1146 Hoofddorp, Netherlands, 52.3061, 4.6907 Flagstaff, United States, 35.1872, -111.6194 Villa Victoria, Mexico, 19.4333, -100.0000 Daugavpils, Latvia, 55.8714, 26.5161 Linkou, China, 45.2819, 130.2519 Birkhadem, Algeria, 36.7167, 3.0500 Kuniyamuttur, India, 10.9638, 76.9525 Kortrijk, Belgium, 50.8275, 3.2658 Kambam, India, 9.7375, 77.2823 Bir el Ater, Algeria, 34.7497, 8.0578 Brikama, Gambia, The, 13.2667, -16.6500 Kineshma, Russia, 57.4333, 42.1333 Beysehir, Turkey, 37.6764, 31.7261 Ukunda, Kenya, -4.2929, 39.5640 Huebampo, Mexico, 26.7228, -109.4856 Benalmadena, Spain, 36.6000, -4.5167 Hasselt, Belgium, 50.9304, 5.3383 Bebedouro, Brazil, -20.9494, -48.4792 Aksu, Turkey, 36.9500, 30.8500 Nitra, Slovakia, 48.3147, 18.0875 Lipjan, Kosovo, 42.5217, 21.1258 Alton, United States, 38.9037, -90.1520 Bodhan, India, 18.6700, 77.9000 Santa Rosa, Brazil, -27.8708, -54.4814 Zhongcheng, China, 28.5973, 103.9773 Luneburg, Germany, 53.2525, 10.4144 Santa Catalina, Philippines, 9.3331, 122.8658 Pleasanton, United States, 37.6663, -121.8805 Molina de Segura, Spain, 38.0548, -1.2131 Stellenbosch, South Africa, -33.9367, 18.8614 Cedar Park, United States, 30.5105, -97.8197 Catalca, Turkey, 41.1417, 28.4631 Hermosa, Philippines, 14.8300, 120.5000 Blagoevgrad, Bulgaria, 42.0227, 23.0975 Perote, Mexico, 19.5619, -97.2419 Mengla, China, 21.4686, 101.5507 Katano, Japan, 34.7833, 135.6833 Bellflower, United States, 33.8880, -118.1271 San Luis, Guatemala, 16.1989, -89.4403 Sao Joao da Boa Vista, Brazil, -21.9689, -46.7978 Tsubame, Japan, 37.6731, 138.8822 Loveland, United States, 40.4166, -105.0623 Bor, Russia, 56.3500, 44.0833 Tirkakara, India, 10.0350, 76.3290 Quatre Bornes, Mauritius, -20.2654, 57.4791 Jelenia Gora, Poland, 50.9033, 15.7344 Puli, Taiwan, 23.9667, 120.9667 Caxito, Angola, -8.5800, 13.6642 Latacunga, Ecuador, -0.9319, -78.6161 Fnidq, Morocco, 35.8500, -5.3500 Ban Tha Khlong, Thailand, 14.0894, 100.6236 Cozumel, Mexico, 20.5104, -86.9493 Paisley, United Kingdom, 55.8456, -4.4239 Pattoki, Pakistan, 31.0167, 73.8500 Harunabad, Pakistan, 29.6097, 73.1378 As Suwayrah, Iraq, 32.9256, 44.7758 Roosendaal, Netherlands, 51.5314, 4.4556 Bustos, Philippines, 14.9500, 120.9200 Ukhta, Russia, 63.5667, 53.7000 Kabacan, Philippines, 7.1200, 124.8200 Fukuchiyama, Japan, 35.3000, 135.1333 Shush, Iran, 32.1947, 48.2475 Mansfield, United States, 40.7656, -82.5275 Merignac, France, 44.8386, -0.6436 Chalandri, Greece, 38.0167, 23.8000 Hammond, United States, 41.6168, -87.4909 Umingan, Philippines, 15.9289, 120.8419 Bethlehem, United States, 40.6266, -75.3679 Tecamachalco, Mexico, 18.8667, -97.7167 Guildford, United Kingdom, 51.2365, -0.5703 Nikko, Japan, 36.7198, 139.6982 Talakag, Philippines, 8.2319, 124.6025 Nabari, Japan, 34.6276, 136.1084 Balagtas, Philippines, 14.8145, 120.9085 Toyooka, Japan, 35.5500, 134.8167 Balkh, Afghanistan, 36.7581, 66.8981 Bongabong, Philippines, 12.7469, 121.4881 Cinar, Turkey, 37.7242, 40.4150 Woodbury, United States, 44.9057, -92.9230 Nagua, Dominican Republic, 19.3800, -69.8500 Alcala de Guadaira, Spain, 37.3333, -5.8500 Berberati, Central African Republic, 4.2614, 15.7894 Santo Angelo, Brazil, -28.2989, -54.2628 Ebolowa, Cameroon, 2.9167, 11.1500 Alameda, United States, 37.7668, -122.2670 Valenca, Brazil, -22.2456, -43.7003 Wyoming, United States, 42.8908, -85.7066 Mao, Dominican Republic, 19.5667, -71.0833 Zhlobin, Belarus, 52.9000, 30.0333 Dorsten, Germany, 51.6600, 6.9642 Baj Baj, India, 22.4737, 88.1739 Chatham, United Kingdom, 51.3700, 0.5200 Surt, Libya, 31.2050, 16.5886 Schaumburg, United States, 42.0308, -88.0838 El Viejo, Nicaragua, 12.6667, -87.1667 Usta Muhammad, Pakistan, 28.1783, 68.0431 Yalta, Ukraine, 44.4994, 34.1700 Pyapon, Burma, 16.2860, 95.6658 Palencia, Spain, 42.0167, -4.5333 Marica, Brazil, -22.9189, -42.8189 Atambua, Indonesia, -9.1061, 124.8925 Ilioupoli, Greece, 37.9333, 23.7500 Prince George, Canada, 53.9169, -122.7494 Mafra, Portugal, 38.9333, -9.3333 Yenakiieve, Ukraine, 48.2167, 38.2000 Nipani, India, 16.3990, 74.3829 Tacambaro de Codallos, Mexico, 19.2356, -101.4569 Castle Rock, United States, 39.3763, -104.8535 Antibes, France, 43.5808, 7.1239 Aira, Japan, 31.7283, 130.6278 Caledon, Canada, 43.8667, -79.8667 Cotui, Dominican Republic, 19.0600, -70.1500 Evanston, United States, 42.0464, -87.6943 Tiangua, Brazil, -3.7322, -40.9917 Daxincun, China, 38.4428, 106.3111 Dschang, Cameroon, 5.4500, 10.0667 Virac, Philippines, 13.5800, 124.2300 Mahdia, Tunisia, 35.5000, 11.0667 Troisdorf, Germany, 50.8161, 7.1556 Trinidad, Cuba, 21.8019, -79.9842 Fazilka, India, 30.4030, 74.0250 Abeche, Chad, 13.8331, 20.8347 Doral, United States, 25.8152, -80.3565 St. Joseph, United States, 39.7598, -94.8210 Khemis el Khechna, Algeria, 36.6500, 3.3306 Funing, China, 39.8879, 119.2314 Armant, Egypt, 25.6167, 32.5333 Al Musayyib, Iraq, 32.7786, 44.2900 Paragominas, Brazil, -2.9950, -47.3528 Shinkai, Japan, 35.8367, 139.5803 Ozersk, Russia, 55.7500, 60.7167 Ibiuna, Brazil, -23.6564, -47.2225 Kafr az Zayyat, Egypt, 30.8248, 30.8180 Paysandu, Uruguay, -32.3214, -58.0756 Valdosta, United States, 30.8502, -83.2788 Crateus, Brazil, -5.1778, -40.6778 Wausau, United States, 44.9620, -89.6459 Pocatello, United States, 42.8724, -112.4647 Ninh Hoa, Vietnam, 12.4917, 109.1258 Elizabethtown, United States, 37.7031, -85.8773 Siedlce, Poland, 52.1650, 22.2714 Sasolburg, South Africa, -26.8142, 27.8286 Melton, Australia, -37.6833, 144.5833 Pozzuoli, Italy, 40.8231, 14.1222 Shajapur, India, 23.4264, 76.2778 So-Awa, Benin, 6.4667, 2.4167 Wilhelmshaven, Germany, 53.5286, 8.1056 Palmerston North, New Zealand, -40.3549, 175.6095 Anniston, United States, 33.6712, -85.8135 Arlington Heights, United States, 42.0955, -87.9826 Padre Hurtado, Chile, -33.5667, -70.8333 Palo, Philippines, 11.1583, 124.9917 Keshod, India, 21.3000, 70.2500 East Ham, United Kingdom, 51.5323, 0.0554 Infanta, Philippines, 14.7425, 121.6494 Daisen, Japan, 39.4531, 140.4754 Nahavand, Iran, 34.1928, 48.3731 Bender, Moldova, 46.8333, 29.4833 Knysna, South Africa, -34.0356, 23.0489 Weston-super-Mare, United Kingdom, 51.3460, -2.9770 Montepuez, Mozambique, -13.1167, 39.0000 Esteio, Brazil, -29.8608, -51.1789 Padre Las Casas, Chile, -38.7667, -72.6000 Kahror Pakka, Pakistan, 29.6236, 71.9167 Oleksandriia, Ukraine, 48.6667, 33.1167 Lins, Brazil, -21.6786, -49.7425 Fancheng, China, 39.1891, 113.2729 Rochester Hills, United States, 42.6645, -83.1563 San Ramon de la Nueva Oran, Argentina, -23.1333, -64.3333 Chintamani, India, 13.4000, 78.0660 Ryugasaki, Japan, 35.9116, 140.1823 Manaoag, Philippines, 16.0439, 120.4856 Southfield, United States, 42.4765, -83.2605 Banska Bystrica, Slovakia, 48.7353, 19.1453 Saint-Maur-des-Fosses, France, 48.7994, 2.4997 Shkoder, Albania, 42.0681, 19.5119 Merouana, Algeria, 35.6333, 5.9167 Yanam, India, 16.7333, 82.2167 Sakon Nakhon, Thailand, 17.1564, 104.1456 Tailai, China, 46.3909, 123.4161 Toba Tek Singh, Pakistan, 30.9711, 72.4825 Villa Elisa, Paraguay, -25.3734, -57.5841 Sirnak, Turkey, 37.5200, 42.4590 Daytona Beach, United States, 29.1995, -81.0982 Ciudad Real, Spain, 38.9833, -3.9167 Rulin, China, 26.3585, 110.3117 Chateauguay, Canada, 45.3800, -73.7500 Catacaos, Peru, -5.2653, -80.6750 Pittsburg, United States, 38.0182, -121.8965 Kengtung, Burma, 21.2917, 99.6083 Oshkosh, United States, 44.0227, -88.5619 Espinal, Colombia, 4.2000, -74.8333 Gladbeck, Germany, 51.5667, 6.9667 Pilar, Philippines, 12.9244, 123.6756 Surendranagar, India, 22.7000, 71.6833 Paranavai, Brazil, -23.0728, -52.4650 Malappuram, India, 11.0420, 76.0815 Kargilik, China, 37.8850, 77.4131 Keratsini, Greece, 37.9667, 23.6167 Cadereyta Jimenez, Mexico, 25.6000, -100.0000 Redmond, United States, 47.6763, -122.1169 Laiyuan, China, 39.3478, 114.6808 Lod, Israel, 31.9500, 34.9000 Xaignabouli, Laos, 19.2500, 101.7500 Maghaghah, Egypt, 28.6483, 30.8422 Santa Rosa, Philippines, 15.4239, 120.9389 Sapiranga, Brazil, -29.6378, -51.0069 Hoorn, Netherlands, 52.6500, 5.0667 Cherry Hill, United States, 39.9034, -74.9947 San Pedro, Argentina, -33.6792, -59.6669 Arjona, Colombia, 10.2586, -75.3461 Saratoga Springs, United States, 43.0674, -73.7775 Jocotan, Guatemala, 14.8167, -89.3833 Ain Temouchent, Algeria, 35.3000, -1.1333 Garhi, India, 28.6317, 77.3186 Cataguases, Brazil, -21.3892, -42.6967 Jablah, Syria, 35.3621, 35.9276 Ramla, Israel, 31.9275, 34.8625 Tres Coracoes, Brazil, -21.6947, -45.2553 Apple Valley, United States, 34.5352, -117.2109 Carlisle, United Kingdom, 54.8947, -2.9364 Mansfield, United States, 32.5690, -97.1213 Srivilliputtur, India, 9.5120, 77.6330 Kiyose, Japan, 35.7857, 139.5265 Xinglong, China, 40.4146, 117.4930 Bhadarwah, India, 32.9800, 75.7137 Ranaghat, India, 23.1800, 88.5800 Aviles, Spain, 43.5561, -5.9083 Cheria, Algeria, 35.2667, 7.7500 Ajaccio, France, 41.9267, 8.7369 South Shields, United Kingdom, 54.9950, -1.4300 Kai, Japan, 35.6608, 138.5158 Bonab, Iran, 37.3383, 46.0539 Villa Carlos Paz, Argentina, -31.4000, -64.5167 Ekpe, Benin, 6.4000, 2.5333 Pawtucket, United States, 41.8744, -71.3743 Landshut, Germany, 48.5397, 12.1508 Ardakan, Iran, 32.3094, 54.0186 Acacias, Colombia, 3.9878, -73.7597 Frontera, Mexico, 26.9260, -101.4490 Itapira, Brazil, -22.4361, -46.8217 Missouri City, United States, 29.5630, -95.5365 Nek'emte, Ethiopia, 9.0833, 36.5500 Paracatu, Brazil, -17.2217, -46.8750 Moussoro, Chad, 13.6431, 16.4919 Erbaa, Turkey, 40.6744, 36.5681 Tissemsilt, Algeria, 35.6078, 1.8111 Sehwan, Pakistan, 26.4193, 67.8594 Lagoa Santa, Brazil, -19.6357, -43.8966 Dongguan, China, 39.0173, 111.1267 Dhrangadhra, India, 22.9800, 71.4700 Kunitachi, Japan, 35.6839, 139.4414 Dayr al Balah, Gaza Strip, 31.4178, 34.3503 Pinamungahan, Philippines, 10.2700, 123.5800 East Kilbride, United Kingdom, 55.7644, -4.1769 Teyateyaneng, Lesotho, -29.1511, 27.7425 Broomfield, United States, 39.9542, -105.0526 Zacatecoluca, El Salvador, 13.5000, -88.8667 Kpalime, Togo, 6.9000, 0.6333 Newcastle under Lyme, United Kingdom, 53.0109, -2.2278 Mawatagama, Sri Lanka, 7.4322, 80.4479 Burton upon Trent, United Kingdom, 52.8019, -1.6367 Libon, Philippines, 13.3000, 123.4333 Belleville, Canada, 44.1667, -77.3833 Telemaco Borba, Brazil, -24.3239, -50.6158 Sidi Qacem, Morocco, 34.2167, -5.7000 Gangammapeta, India, 18.4980, 83.9642 Puqiancun, China, 23.5797, 114.6200 Khejroli, India, 27.3700, 75.5700 Afak, Iraq, 32.0889, 45.2506 Wisil, Somalia, 5.4281, 48.1201 Feriana, Tunisia, 34.9500, 8.5667 Warabi, Japan, 35.8256, 139.6797 Bugallon, Philippines, 15.9200, 120.1800 Tocumen, Panama, 9.0894, -79.3831 Chaykovskiy, Russia, 56.7667, 54.1500 Panggezhuang, China, 39.6336, 116.3178 Bayreuth, Germany, 49.9481, 11.5783 Jaora, India, 23.6300, 75.1300 Kropotkin, Russia, 45.4333, 40.5667 Arba Minch', Ethiopia, 6.0333, 37.5500 Gonen, Turkey, 40.1014, 27.6514 Fouchana, Tunisia, 36.7000, 10.1667 Amakusa, Japan, 32.4586, 130.1931 Tura, India, 25.5200, 90.2200 Ambajogai, India, 18.7300, 76.3800 Palencia, Guatemala, 14.6667, -90.3667 Detmold, Germany, 51.9378, 8.8833 Upington, South Africa, -28.4500, 21.2500 Sinop, Brazil, -11.8639, -55.5039 Juchitan de Zaragoza, Mexico, 16.4333, -95.0167 Paterna, Spain, 39.5028, -0.4406 Dabra, India, 25.8857, 78.3322 Brick, United States, 40.0600, -74.1099 Ubud, Indonesia, -8.5069, 115.2624 Sasagawa, Japan, 37.2865, 140.3727 La Paz, Argentina, -30.7500, -59.6500 Usol'ye-Sibirskoye, Russia, 52.7500, 103.6333 Darhan, Mongolia, 49.4867, 105.9228 Darhan, Mongolia, 49.6167, 106.3500 Urla, Turkey, 38.3222, 26.7647 Pozorrubio, Philippines, 16.1200, 120.5500 Toffo, Benin, 6.8500, 2.0833 Esperanza, Philippines, 6.7167, 124.5167 Tanguieta, Benin, 10.6167, 1.2667 Tosu, Japan, 33.3833, 130.5000 Benidorm, Spain, 38.5342, -0.1314 Mirpur Mathelo, Pakistan, 28.0167, 69.5333 Cotorro, Cuba, 23.0261, -82.2475 Janesville, United States, 42.6854, -89.0135 Dalaguete, Philippines, 9.7612, 123.5349 Piracununga, Brazil, -21.9961, -47.4258 Ouro Preto, Brazil, -20.3853, -43.5036 Stakhanov, Ukraine, 48.5681, 38.6586 Cinisello Balsamo, Italy, 45.5500, 9.2167 Dayong, China, 22.4653, 113.3004 Itahari, Nepal, 26.6667, 87.2833 Naro-Fominsk, Russia, 55.3833, 36.7667 Peda-Houeyogbe, Benin, 6.4500, 1.9333 Katori, Japan, 35.6833, 140.0333 Kandori, Japan, 35.6796, 139.9062 Novotroitsk, Russia, 51.2039, 58.3114 San Marcos, United States, 29.8734, -97.9356 Shancheng, China, 34.7904, 116.0800 Bilecik, Turkey, 40.1431, 29.9792 San Antonio de Los Altos, Venezuela, 10.3744, -66.9669 Assab, Eritrea, 13.0078, 42.7411 Gbawe, Ghana, 5.5769, -0.3104 Skelleftea, Sweden, 64.6500, 20.8500 Balingasag, Philippines, 8.7500, 124.7800 Castrop-Rauxel, Germany, 51.5500, 7.3167 Wandiwash, India, 12.5000, 79.6200 Ouake, Benin, 9.6617, 1.3847 Ramhormoz, Iran, 31.2753, 49.6044 Bongouanou, Côte d’Ivoire, 6.6517, -4.2041 San Juan Opico, El Salvador, 13.8833, -89.3500 Zlin, Czechia, 49.2331, 17.6669 Miki, Japan, 34.7936, 134.9931 Uspantan, Guatemala, 15.3458, -90.8694 Silao, Mexico, 20.9478, -101.4281 San Marcos, El Salvador, 13.5833, -89.2167 Camarillo, United States, 34.2230, -119.0321 Arnsberg, Germany, 51.3833, 8.0833 Izumiotsu, Japan, 34.5000, 135.4000 Caninde, Brazil, -4.3589, -39.3119 Eusebio, Brazil, -3.8900, -38.4508 Mankono, Côte d’Ivoire, 8.0586, -6.1897 Le Kram, Tunisia, 36.8333, 10.3167 Aprilia, Italy, 41.5833, 12.6500 Okegawa, Japan, 36.0057, 139.5427 Meshgin Shahr, Iran, 38.3906, 47.6742 Al Qa'im, Iraq, 34.3925, 40.9895 Airdrie, Canada, 51.2917, -114.0144 Balashov, Russia, 51.5469, 43.1733 Jackson, United States, 35.6538, -88.8354 Cannes, France, 43.5513, 7.0128 Coatepeque, El Salvador, 13.9167, -89.5000 Pennepalli, India, 14.1473, 79.8477 Gudur, India, 14.1473, 79.8477 Dubna, Russia, 56.7364, 37.1625 Ayvalik, Turkey, 39.3167, 26.6944 Casoria, Italy, 40.9000, 14.3000 Pedro Brand, Dominican Republic, 18.5667, -70.0911 Dothan, United States, 31.2336, -85.4070 Gravesend, United Kingdom, 51.4415, 0.3685 Ra`ananna, Israel, 32.1833, 34.8667 Brookes Point, Philippines, 8.7800, 117.8300 Tatebayashi, Japan, 36.2448, 139.5421 Kyotanabe, Japan, 34.8144, 135.7678 Sherman, United States, 33.6273, -96.6221 Kahan, Pakistan, 29.2982, 68.9023 Sarai Alamgir, Pakistan, 32.9000, 73.7500 Singaparna, Indonesia, -7.3497, 108.1106 Lauderhill, United States, 26.1605, -80.2241 Le Bardo, Tunisia, 36.8092, 10.1406 Tatsunocho-tominaga, Japan, 34.8508, 134.5453 Majalengka, Indonesia, -6.8353, 108.2278 Sarnia, Canada, 42.9994, -82.3089 Pazardzhik, Bulgaria, 42.1935, 24.3328 Harrisonburg, United States, 38.4362, -78.8735 Tamworth, United Kingdom, 52.6330, -1.6950 Vlaardingen, Netherlands, 51.9167, 4.3500 Brandenburg, Germany, 52.4167, 12.5333 Samundri, Pakistan, 31.0625, 72.9542 Dumangas, Philippines, 10.8300, 122.7200 Alicia, Philippines, 16.7787, 121.6972 Di An, Vietnam, 10.9039, 106.7678 Yurihonjo, Japan, 39.3859, 140.0488 Ain Oulmene, Algeria, 35.9167, 5.3000 Cunhinga, Angola, -12.2333, 16.7833 Bolingbrook, United States, 41.6901, -88.1021 Haveri, India, 14.7935, 75.4045 Yelabuga, Russia, 55.7667, 52.0833 Ellicott City, United States, 39.2774, -76.8345 Verkhnyaya Pyshma, Russia, 56.9761, 60.5944 Drohobych, Ukraine, 49.3500, 23.5000 Gouda, Netherlands, 52.0181, 4.7056 Tefe, Brazil, -3.3539, -64.7108 Tarn Taran, India, 31.4519, 74.9278 Nandi Hills, Kenya, 0.1037, 35.1843 Birobidzhan, Russia, 48.8000, 132.9333 Mangalagiri, India, 16.4300, 80.5500 Joao Monlevade, Brazil, -19.8100, -43.1736 Linares, Chile, -35.8500, -71.6000 Vriddhachalam, India, 11.5000, 79.3300 Harrogate, United Kingdom, 53.9919, -1.5378 Copacabana, Colombia, 6.3333, -75.5000 Cacoal, Brazil, -11.4386, -61.4472 Cao Bang, Vietnam, 22.6667, 106.2583 Targu Jiu, Romania, 45.0342, 23.2747 Xindian, China, 25.2814, 101.5583 Kallakkurichchi, India, 11.7380, 78.9620 Bat Khela, Pakistan, 34.6200, 71.9700 Irece, Brazil, -11.3042, -41.8558 Kasama, Japan, 36.3452, 140.3043 Novoaltaysk, Russia, 53.3833, 83.9333 Kumluca, Turkey, 36.3667, 30.2833 Bandar-e Genaveh, Iran, 29.5808, 50.5172 Tupi, Philippines, 6.3300, 124.9500 Alexandria, United States, 31.2923, -92.4702 Battle Creek, United States, 42.2985, -85.2296 Kasipalaiyam, India, 11.3156, 77.7092 Lala, Philippines, 7.9700, 123.7500 Asti, Italy, 44.9000, 8.2069 Inuyama, Japan, 35.3786, 136.9445 Pancevo, Serbia, 44.8739, 20.6519 Jose Abad Santos, Philippines, 5.9200, 125.6500 Ban Plai Bua Phatthana, Thailand, 13.9032, 100.3989 Bagan Si Api-api, Indonesia, 2.1667, 100.8167 Majadahonda, Spain, 40.4728, -3.8722 Tavsanli, Turkey, 39.5333, 29.4833 New Britain, United States, 41.6759, -72.7862 Aguilares, El Salvador, 13.9500, -89.1833 Reconquista, Argentina, -29.2333, -59.9333 Sheboygan, United States, 43.7403, -87.7316 Quillota, Chile, -32.8667, -71.2500 Fada Ngourma, Burkina Faso, 12.0500, 0.3667 Otawara, Japan, 36.8711, 140.0156 Pacajus, Brazil, -4.1725, -38.4606 Shakargarh, Pakistan, 32.2628, 75.1583 Ragusa, Italy, 36.9250, 14.7306 Brunswick, United States, 31.1449, -81.4746 Ciudadela, Argentina, -34.6333, -58.5333 Bula, Philippines, 13.4694, 123.2775 Pattukkottai, India, 10.4300, 79.3200 Almelo, Netherlands, 52.3567, 6.6625 Gobindgarh, India, 30.6709, 76.3019 Edea, Cameroon, 3.8000, 10.1333 Saint-Nazaire, France, 47.2736, -2.2139 Brakpan, South Africa, -26.2353, 28.3700 Altoona, United States, 40.5082, -78.4007 Shibukawa, Japan, 36.3894, 139.0633 Lujan de Cuyo, Argentina, -32.9980, -68.8730 Moa, Cuba, 20.6556, -74.9417 Berdychiv, Ukraine, 49.9000, 28.5667 Chaigoubu, China, 37.7868, 114.6107 Santa Rosa de Cabal, Colombia, 4.8667, -75.6167 Santa Isabel do Para, Brazil, -1.2989, -48.1608 Sharm ash Shaykh, Egypt, 27.8519, 34.3050 Lodi, United States, 38.1218, -121.2932 Redlands, United States, 34.0512, -117.1712 Naqadeh, Iran, 36.9547, 45.3881 Lappeenranta, Finland, 61.0667, 28.1833 San Vicente del Caguan, Colombia, 2.1167, -74.7667 Sidi Bibi, Morocco, 30.2333, -9.5333 Russas, Brazil, -4.9400, -37.9758 La Dorada, Colombia, 5.4538, -74.6647 Aschaffenburg, Germany, 49.9667, 9.1500 Mackay, Australia, -21.1411, 149.1858 Khomeyn, Iran, 33.6422, 50.0789 Joyo, Japan, 34.8531, 135.7800 Caguas, Puerto Rico, 18.2319, -66.0388 Nea Smyrni, Greece, 37.9500, 23.7167 Tocoa, Honduras, 15.6576, -86.0050 Jingzhou, China, 37.6911, 116.2672 Caserta, Italy, 41.0667, 14.3333 Dale City, United States, 38.6473, -77.3459 Chopda, India, 21.2500, 75.3000 Glen Burnie, United States, 39.1560, -76.6071 Paine, Chile, -33.8167, -70.7500 Catanauan, Philippines, 13.5917, 122.3250 Spijkenisse, Netherlands, 51.8333, 4.3167 Chalchuapa, El Salvador, 13.9833, -89.6833 Sodertalje, Sweden, 59.1978, 17.6272 Amparo, Brazil, -22.7031, -46.7650 Huong Tra, Vietnam, 16.4675, 107.5181 Yafran, Libya, 32.0629, 12.5267 Carles, Philippines, 11.5700, 123.1300 Sanwal, Nepal, 27.6300, 83.6500 Rio do Sul, Brazil, -27.2139, -49.6428 Sremska Mitrovica, Serbia, 44.9661, 19.6106 Gaspar, Brazil, -26.9308, -48.9589 Myslowice, Poland, 50.2333, 19.1333 Zhuolu, China, 40.3753, 115.2150 Lanxi, China, 46.2664, 126.2760 Mount Vernon, United States, 40.9136, -73.8291 San Dionisio, Philippines, 14.4839, 120.9925 Esmeraldas, Brazil, -19.7625, -44.3139 Weligama, Sri Lanka, 5.9750, 80.4297 Siruguppa, India, 15.6000, 77.0000 Nepalganj, Nepal, 28.0500, 81.6167 Tangalla, Sri Lanka, 6.0240, 80.7911 Bacacay, Philippines, 13.2925, 123.7917 Hekinan, Japan, 34.8847, 136.9934 Lakeville, United States, 44.6774, -93.2520 Dover, United States, 43.1887, -70.8845 Lebanon, United States, 40.3412, -76.4228 Ede, Netherlands, 52.0436, 5.6667 Sipalay, Philippines, 9.7500, 122.4000 Dazaifu, Japan, 33.5128, 130.5239 Samborondon, Ecuador, -2.1833, -79.8833 Longkoucun, China, 23.5742, 116.7303 Alegrete, Brazil, -29.7839, -55.7911 Bocholt, Germany, 51.8333, 6.6167 Keshan, China, 48.0263, 125.8659 Candeias, Brazil, -12.6678, -38.5508 Yukuhashi, Japan, 33.7289, 130.9831 Sangareddi, India, 17.6119, 78.0819 Rocklin, United States, 38.8075, -121.2489 Zogbodome, Benin, 7.0833, 2.1000 Wood Buffalo, Canada, 57.6042, -111.3284 Kotelniki, Russia, 55.6617, 37.8672 Dambulla, Sri Lanka, 7.8600, 80.6517 Goya, Argentina, -29.1333, -59.2500 Oroquieta, Philippines, 8.4800, 123.8000 Virudunagar, India, 9.5680, 77.9624 Abancay, Peru, -13.6333, -72.8833 Penafiel, Portugal, 41.2000, -8.2833 San Fernando, Philippines, 10.1700, 123.7000 Rades, Tunisia, 36.7667, 10.2833 Palin, Guatemala, 14.4039, -90.6986 Tlemcen, Algeria, 34.8828, -1.3167 Turbana, Colombia, 10.2833, -75.4500 Yoshikawa, Japan, 35.8939, 139.8414 El Banco, Colombia, 8.9983, -73.9747 Warora, India, 20.2300, 79.0008 Tibati, Cameroon, 6.4667, 12.6333 Sault Ste. Marie, Canada, 46.5333, -84.3500 Camalig, Philippines, 13.1300, 123.6700 Sakrand, Pakistan, 26.1381, 68.2731 Najran, Saudi Arabia, 17.4917, 44.1322 Framingham, United States, 42.3085, -71.4368 Bella Vista, Argentina, -34.5333, -58.6667 Bailongqiaocun, China, 29.0767, 119.5517 Colon, Cuba, 22.7225, -80.9067 Chaklasi, India, 22.6500, 72.9300 Nilanga, India, 18.1161, 76.7525 Belo Tsiribihina, Madagascar, -19.7016, 44.5465 Myaydo, Burma, 19.3667, 95.2167 Haka, Burma, 22.6455, 93.6050 Al Lith, Saudi Arabia, 20.1480, 40.2722 Sonsonate, El Salvador, 13.7167, -89.7167 Shostka, Ukraine, 51.8667, 33.4833 Wesley Chapel, United States, 28.2106, -82.3238 Long My, Vietnam, 9.6814, 105.5708 Borongan, Philippines, 11.6094, 125.4361 San Andres, Colombia, 12.5847, -81.7006 Wenping, China, 27.1931, 103.5273 Gumaca, Philippines, 13.9210, 122.1002 Noblesville, United States, 40.0355, -86.0042 Stara Pazova, Serbia, 44.9833, 20.1667 Ararangua, Brazil, -28.9350, -49.4858 Esbjerg, Denmark, 55.4670, 8.4500 Goianira, Brazil, -16.4958, -49.4258 La Lima, Honduras, 15.4402, -87.9278 Chiryu, Japan, 35.0014, 137.0506 Tamarac, United States, 26.2056, -80.2539 Centreville, United States, 38.8390, -77.4389 Cacak, Serbia, 43.8914, 20.3497 Quilandi, India, 11.4390, 75.6950 Carpi, Italy, 44.7833, 10.8850 Sao Tome, Sao Tome and Principe, 0.3361, 6.7306 Mun'gyong, Korea, South, 36.5939, 128.2014 Ishioka, Japan, 36.1908, 140.2872 Marousi, Greece, 38.0500, 23.8000 Jabuticabal, Brazil, -21.2550, -48.3219 Castro, Brazil, -24.7893, -50.0123 Calauag, Philippines, 13.9575, 122.2875 Bozuyuk, Turkey, 39.9078, 30.0367 Cajamar, Brazil, -23.3561, -46.8769 Sao Sebastiao do Paraiso, Brazil, -20.9169, -46.9908 Kresek, Indonesia, -6.1314, 106.3800 Patzun, Guatemala, 14.6833, -91.0167 Kabarore, Rwanda, -1.6306, 30.3787 Sambrial, Pakistan, 32.1600, 74.4000 Pila, Poland, 53.1500, 16.7333 Dondo, Angola, -9.6942, 14.4228 Shrewsbury, United Kingdom, 52.7080, -2.7540 Mazabuka, Zambia, -15.8467, 27.7475 Manikganj, Bangladesh, 23.8614, 90.0003 Florida, Cuba, 21.5294, -78.2228 Poinciana, United States, 28.1217, -81.4821 Agios Dimitrios, Greece, 37.9333, 23.7333 Noisy-le-Grand, France, 48.8478, 2.5528 Kayes, Congo (Brazzaville), -4.1683, 13.2933 Sertolovo, Russia, 60.1500, 30.2167 Calarca, Colombia, 4.5333, -75.6500 Tarin Kot, Afghanistan, 32.6267, 65.8733 Bakixanov, Azerbaijan, 40.4217, 49.9644 Kawm Umbu, Egypt, 24.4667, 32.9500 Mandla, India, 22.5978, 80.3714 Palmeira dos Indios, Brazil, -9.4069, -36.6278 Ostend, Belgium, 51.2258, 2.9194 Saymayl, Iraq, 36.8582, 42.8482 Fairbanks, United States, 64.8353, -147.6533 Indaial, Brazil, -26.8978, -49.2319 Anzhero-Sudzhensk, Russia, 56.0833, 86.0333 La Estrella, Colombia, 6.1667, -75.6667 Pililla, Philippines, 14.4800, 121.3000 Santo Tirso, Portugal, 41.3425, -8.4775 Gosport, United Kingdom, 50.7900, -1.1200 Lake Elsinore, United States, 33.6847, -117.3344 Kirovo-Chepetsk, Russia, 58.5500, 50.0000 Parang, Philippines, 5.9200, 120.9200 Dias d'Avila, Brazil, -12.6128, -38.2969 Lomas del Mirador, Argentina, -34.6667, -58.5297 Nanfengcun, China, 23.7460, 111.7966 Salama, Guatemala, 15.1000, -90.2667 Camden, United States, 39.9361, -75.1073 Biankouma, Côte d’Ivoire, 7.7333, -7.6167 Korgas, China, 44.2125, 80.4097 Lisburn, United Kingdom, 54.5120, -6.0310 Ludenscheid, Germany, 51.2167, 7.6333 Rayadrug, India, 14.6997, 76.8524 Mamoudzou, Mayotte, -12.7806, 45.2278 Halmstad, Sweden, 56.6718, 12.8556 Rogers, United States, 36.3170, -94.1531 Binalbagan, Philippines, 10.2000, 122.8700 Shahrixon, Uzbekistan, 40.7167, 72.0500 Bilara, India, 26.1792, 73.7056 Villa Tunari, Bolivia, -16.9747, -65.4203 Huanchaco, Peru, -7.7000, -79.4333 Campo Formoso, Brazil, -10.5089, -40.3208 Sagunto, Spain, 39.6800, -0.2783 Goa, Philippines, 13.6983, 123.4889 Erd, Hungary, 47.3833, 18.9167 Drancy, France, 48.9300, 2.4500 Vyborg, Russia, 60.7167, 28.7667 Talibon, Philippines, 10.1200, 124.2800 Las Piedras, Uruguay, -34.7167, -56.2167 Ganthier, Haiti, 18.5316, -72.0633 Blaine, United States, 45.1696, -93.2077 Jinsha, China, 23.5286, 116.6150 Parappanangadi, India, 11.0497, 75.8575 Konongo, Ghana, 6.6167, -1.2167 Waingapu, Indonesia, -9.6500, 120.2667 Gela, Italy, 37.0667, 14.2500 Placetas, Cuba, 22.3158, -79.6556 Rayagada, India, 19.1700, 83.4200 Melong, Cameroon, 5.1211, 9.9528 Fernandopolis, Brazil, -20.2839, -50.2458 Musashimurayama, Japan, 35.7548, 139.3874 Morong, Philippines, 14.5127, 121.2385 San Francisco del Rincon, Mexico, 21.0228, -101.8600 Gibara, Cuba, 21.1072, -76.1367 Ratangarh, India, 28.0787, 74.6219 Wilmington, United States, 39.7415, -75.5416 Tandur, India, 17.2576, 77.5875 Hala, Pakistan, 25.8100, 68.4300 Bakhmut, Ukraine, 48.5947, 38.0008 Markapur, India, 15.7300, 79.2600 Terme, Turkey, 41.2092, 36.9739 Bunbury, Australia, -33.3272, 115.6369 Sihanoukville, Cambodia, 10.6333, 103.5000 Mauban, Philippines, 14.1911, 121.7308 Tejupilco, Mexico, 18.9058, -100.1528 Goianesia, Brazil, -15.3175, -49.1175 Alabang, Philippines, 14.4184, 121.0385 Montecristi, Ecuador, -1.0500, -80.6667 Nadi, Fiji, -17.8000, 177.4167 St. Charles, United States, 38.7954, -90.5157 Blacksburg, United States, 37.2300, -80.4279 An Nu`maniyah, Iraq, 32.5562, 45.4129 Abu Tij, Egypt, 27.0442, 31.3189 Juayua, El Salvador, 13.8333, -89.7333 Malaut, India, 30.1900, 74.4990 Samraong, Cambodia, 14.2500, 103.5833 Kopargo, Benin, 9.8375, 1.5481 Torremolinos, Spain, 36.6218, -4.5003 Kodungallur, India, 10.2338, 76.1946 Corozal, Colombia, 9.3333, -75.2500 Gwadar, Pakistan, 25.1264, 62.3225 Neyyattinkara, India, 8.4000, 77.0800 Kumanovo, North Macedonia, 42.1322, 21.7144 Dondo, Mozambique, -19.6167, 34.7500 Ejura, Ghana, 7.3856, -1.3562 Sesvete, Croatia, 45.8311, 16.1164 Zadar, Croatia, 44.1170, 15.2355 Waukesha, United States, 43.0087, -88.2464 Bapatla, India, 15.9044, 80.4675 Fatehabad, India, 29.5200, 75.4500 Kalamasseri, India, 10.0520, 76.3158 Casas Adobes, United States, 32.3423, -111.0113 Tumauini, Philippines, 17.2700, 121.8000 Ostrow Wielkopolski, Poland, 51.6494, 17.8164 Baldwin Park, United States, 34.0829, -117.9722 Sirvan, Azerbaijan, 39.9323, 48.9203 Al Qurayya, Syria, 34.9563, 40.5414 Gardez, Afghanistan, 33.6000, 69.2169 Cremona, Italy, 45.1333, 10.0247 Pavia, Italy, 45.1853, 9.1550 Paphos, Cyprus, 34.7667, 32.4167 Rugby, United Kingdom, 52.3700, -1.2600 Badvel, India, 14.7500, 79.0500 Loule, Portugal, 37.1440, -8.0235 Yinying, China, 37.9410, 113.5602 Longzhou, China, 38.4348, 114.5465 Karasu, Turkey, 41.1036, 30.6936 Poblacion, Philippines, 10.2500, 123.9500 Shujaabad, Pakistan, 29.8792, 71.3028 Stafford, United Kingdom, 52.8070, -2.1170 Valparai, India, 10.3276, 76.9553 Chingford, United Kingdom, 51.6230, 0.0090 Cabudare, Venezuela, 10.0331, -69.2633 Cleveland, United States, 35.1817, -84.8707 Sankaranayinar Kovil, India, 9.1600, 77.5500 Xangongo, Angola, -16.7467, 14.9747 Uxbridge, United Kingdom, 51.5404, -0.4778 Zenica, Bosnia and Herzegovina, 44.2017, 17.9039 Tenkasi, India, 8.9564, 77.3152 Dublin, United States, 37.7161, -121.8963 Ankeny, United States, 41.7288, -93.6031 Bundaberg, Australia, -24.8661, 152.3494 Maple Grove, United States, 45.1089, -93.4626 Suratgarh, India, 29.3177, 73.8989 Quibor, Venezuela, 9.9311, -69.6247 Kaukhali, Bangladesh, 22.6333, 90.0667 Sig, Algeria, 35.5278, -0.1861 Baiquan, China, 47.6018, 126.0819 Mindelo, Cabo Verde, 16.8860, -24.9880 Bayonne, United States, 40.6668, -74.1158 Palni, India, 10.4500, 77.5161 Mubarakpur, India, 26.0900, 83.2900 Togoch'ale, Ethiopia, 9.6014, 43.3361 Bur Fu'ad, Egypt, 31.2314, 32.3253 Capanema, Brazil, -1.1958, -47.1808 Nelamangala, India, 13.1020, 77.3740 Pavia, Philippines, 10.7750, 122.5417 Bayramaly, Turkmenistan, 37.6167, 62.1500 Yawata-shimizui, Japan, 34.8756, 135.7075 Linares, Mexico, 24.8597, -99.5647 Fulda, Germany, 50.5508, 9.6753 Aliaga, Philippines, 15.5036, 120.8450 Dandeli, India, 15.2667, 74.6167 Orani, Philippines, 14.8000, 120.5300 North Richland Hills, United States, 32.8604, -97.2180 Santa Maria La Pila, Guatemala, 15.6056, -89.8125 Minxiong, Taiwan, 23.5504, 120.4457 Huwei, Taiwan, 23.7200, 120.4354 Celle, Germany, 52.6256, 10.0825 Bopa, Benin, 6.5833, 1.9833 Brumado, Brazil, -14.2036, -41.6653 Chapayevsk, Russia, 52.9833, 49.7167 Tataouine, Tunisia, 32.9306, 10.4500 Hujra Shah Muqim, Pakistan, 30.7333, 73.8167 Nandura Buzurg, India, 20.8333, 76.4597 Dimbokro, Côte d’Ivoire, 6.6505, -4.7100 Rizal, Philippines, 15.7100, 121.1047 Eastvale, United States, 33.9617, -117.5803 Tinambac, Philippines, 13.8183, 123.3244 Pazarcik, Turkey, 37.4894, 37.2967 San Antonio, Philippines, 14.4656, 121.0311 Kabirwala, Pakistan, 30.2000, 70.4300 Thaba Nchu, South Africa, -29.2000, 26.8333 Eniwa, Japan, 42.8833, 141.5833 Guzhou, China, 25.9278, 108.5186 Guaynabo, Puerto Rico, 18.3832, -66.1134 Gaura, India, 25.4961, 85.9709 Pan'an, China, 34.7575, 105.1135 Tsurugashima, Japan, 35.9345, 139.3931 Grajau, Brazil, -5.8194, -46.1386 Cahama, Angola, -16.2833, 14.3167 Ko Samui, Thailand, 9.5000, 100.0000 Kempten, Germany, 47.7333, 10.3167 Lubin, Poland, 51.3972, 16.2056 Glens Falls, United States, 43.3109, -73.6458 Longview, United States, 46.1461, -122.9630 Luodong, Taiwan, 24.6753, 121.7711 Zhanggu, China, 30.9504, 101.9167 Longtangwan, China, 27.7772, 111.7514 `Izbat al Burj, Egypt, 31.5084, 31.8411 Satyamangalam, India, 11.5167, 77.2500 Madhipura, India, 25.9200, 86.7920 Bhattu Kolan, India, 29.3872, 75.3422 Kodoli, India, 16.8800, 74.2000 Az Zubaydiyah, Iraq, 32.7588, 45.1773 Thakhek, Laos, 17.4000, 104.8000 Castries, Saint Lucia, 14.0108, -60.9894 Al `Amirat, Oman, 23.5224, 58.4987 Talamba, Pakistan, 30.5255, 72.2398 Badhan, Somalia, 10.7142, 48.3359 Phu Quoc, Vietnam, 10.2289, 103.9669 Hosa'ina, Ethiopia, 7.5500, 37.8500 Mansfield, United Kingdom, 53.1444, -1.1964 Tulare, United States, 36.1995, -119.3400 Troitsk, Russia, 54.0833, 61.5667 Raha Tiga, Indonesia, -4.8311, 122.7239 Raha, Indonesia, -4.8311, 122.7239 San Antonio, Paraguay, -25.4138, -57.5659 Nikki, Benin, 9.9333, 3.2083 Avaniyapuram, India, 9.8818, 78.1125 Entebbe, Uganda, 0.0500, 32.4600 Imerintsiatosika, Madagascar, -18.9804, 47.3285 Eskilstuna, Sweden, 59.3674, 16.5160 Izmail, Ukraine, 45.3517, 28.8364 Rohri, Pakistan, 27.6831, 68.9000 Conway, United States, 35.0753, -92.4692 Sagaing, Burma, 21.8822, 95.9786 Qingquan, China, 38.7931, 101.0887 Saint John, Canada, 45.2806, -66.0761 West Des Moines, United States, 41.5521, -93.7806 Chiang Rai, Thailand, 19.9094, 99.8275 Moquegua, Peru, -17.2000, -70.9333 Yueshanwan, China, 27.8614, 112.2911 Altamura, Italy, 40.8167, 16.5500 Sanlucar de Barrameda, Spain, 36.7667, -6.3500 Zografos, Greece, 37.9783, 23.7717 Vushtrri, Kosovo, 42.8231, 20.9675 Encarnacion, Paraguay, -27.3472, -55.8739 Konin, Poland, 52.2167, 18.2667 Novomoskovsk, Ukraine, 48.6333, 35.2167 Kwamhlanga, South Africa, -25.4320, 28.7080 Ratnanagar, Nepal, 27.5833, 84.5000 Garzon, Colombia, 2.1819, -75.6578 Redondo Beach, United States, 33.8577, -118.3765 San Miguel de Allende, Mexico, 20.9142, -100.7436 Walnut Creek, United States, 37.9024, -122.0399 San Juan de los Lagos, Mexico, 21.2458, -102.3308 Los Reyes de Salgado, Mexico, 19.5833, -102.4667 Basavakalyan, India, 17.8728, 76.9497 Escada, Brazil, -8.3592, -35.2236 Faridpur, India, 28.2086, 79.5381 Havirov, Czechia, 49.7831, 18.4228 Kiyosu, Japan, 35.1998, 136.8529 Quixada, Brazil, -4.9708, -39.0150 Passaic, United States, 40.8574, -74.1282 Ziguinchor, Senegal, 12.5861, -16.2707 Minami-Alps, Japan, 35.6083, 138.4650 Uwajima, Japan, 33.2167, 132.5667 Roxas, Philippines, 10.3197, 119.3408 Porterville, United States, 36.0643, -119.0338 Rioverde, Mexico, 21.9300, -99.9800 Ritto, Japan, 35.0167, 136.0000 Saint-Louis du Nord, Haiti, 19.9340, -72.7214 Cergy, France, 49.0361, 2.0631 Inowroclaw, Poland, 52.7931, 18.2611 Somasso, Mali, 12.8728, -5.6033 L'Aquila, Italy, 42.3540, 13.3920 Tivaouane, Senegal, 14.9543, -16.8132 Tournai, Belgium, 50.6056, 3.3881 Buynaksk, Russia, 42.8167, 47.1167 Maricopa, United States, 33.0408, -112.0011 Samch'ok, Korea, South, 37.4500, 129.1650 Rhondda, United Kingdom, 51.6159, -3.4175 Apatity, Russia, 67.5667, 33.4000 Biguacu, Brazil, -27.4942, -48.6556 Thohoyandou, South Africa, -22.9500, 30.4833 Castelldefels, Spain, 41.2860, 1.9820 Poptun, Guatemala, 16.3222, -89.4222 Soja, Japan, 34.6728, 133.7464 Izucar de Matamoros, Mexico, 18.6000, -98.4667 Tripunittura, India, 9.9439, 76.3494 Toyoake, Japan, 35.0509, 137.0128 Al Qusiyah, Egypt, 27.4444, 30.8167 Fajardo, Puerto Rico, 18.3331, -65.6589 Alenquer, Brazil, -1.9419, -54.7378 Victoria, Philippines, 15.5781, 120.6819 Aqsu, Kazakhstan, 52.0333, 76.9167 Chisec, Guatemala, 15.8125, -90.3217 Kirdasah, Egypt, 30.0310, 31.1111 Nowrangapur, India, 19.2300, 82.5500 Welland, Canada, 42.9833, -79.2333 Spring Hill, United States, 35.7437, -86.9116 Bitola, North Macedonia, 41.0319, 21.3347 Planeta Rica, Colombia, 8.4089, -75.5819 Don Carlos, Philippines, 7.6808, 124.9953 Bafia, Cameroon, 4.7500, 11.2167 Cawayan, Philippines, 11.9303, 123.7689 Anan, Japan, 33.9167, 134.6667 Limonade, Haiti, 19.6701, -72.1243 Limbe, Haiti, 19.7060, -72.4034 Shangchuankou, China, 36.3283, 102.8015 Gaithersburg, United States, 39.1346, -77.2131 El Paso de Robles, United States, 35.6394, -120.6560 Barra do Garcas, Brazil, -15.8900, -52.2569 Ongjang, Korea, North, 37.9371, 125.3571 Cuimba, Angola, -6.1178, 14.6172 Torbeck, Haiti, 18.1634, -73.8095 East Orange, United States, 40.7651, -74.2117 Aalen, Germany, 48.8333, 10.1000 Fedosiia, Ukraine, 45.0342, 35.3792 Rongcheng, China, 39.0525, 115.8603 Ad Darb, Saudi Arabia, 17.7229, 42.2526 Imola, Italy, 44.3531, 11.7147 Necocli, Colombia, 8.4167, -76.7833 Mansehra, Pakistan, 34.3339, 73.2014 Mineral'nyye Vody, Russia, 44.2167, 43.1333 Renk, South Sudan, 11.7431, 32.8049 Kladno, Czechia, 50.1431, 14.1053 Mila, Algeria, 36.4503, 6.2644 Lippstadt, Germany, 51.6667, 8.3500 Bhawanipatna, India, 19.9100, 83.1280 Mocuba, Mozambique, -16.8391, 36.9855 Dharmasagaram, India, 17.9933, 79.4428 Vaasa, Finland, 63.1000, 21.6167 Granby, Canada, 45.4000, -72.7333 San Pascual, Philippines, 13.8000, 121.0300 Southampton, United States, 40.8997, -72.4931 Peruibe, Brazil, -24.3200, -46.9983 Kireka, Uganda, 0.3467, 32.5000 Kamsar, Guinea, 10.6500, -14.6167 Moriya, Japan, 35.9514, 139.9754 Tanabe, Japan, 33.7333, 135.3833 Mocuba, Mozambique, -16.8496, 38.2600 Mococa, Brazil, -21.4678, -47.0047 Piotrkow Trybunalski, Poland, 51.4000, 19.6833 Varisshiyakuni, India, 11.6325, 75.5840 Huishi, China, 35.6918, 105.0531 Yitiaoshan, China, 37.1889, 104.0571 La Paz, Philippines, 15.4431, 120.7289 Bagumbayan, Philippines, 6.5339, 124.5633 Liuhe, China, 42.2669, 125.7404 Palghar, India, 19.6969, 72.7654 Sumter, United States, 33.9392, -80.3930 La Chorrera, Panama, 8.8792, -79.7822 Buenavista, Philippines, 8.9700, 125.4100 San Jose del Guaviare, Colombia, 2.5667, -72.6333 Queenstown, South Africa, -31.9000, 26.8833 Yunnanyi, China, 25.4245, 100.6890 Villanueva y Geltru, Spain, 41.2242, 1.7256 Grand Forks, United States, 47.9214, -97.0884 Aparri, Philippines, 18.3575, 121.6372 Assen, Netherlands, 52.9953, 6.5606 Ixtaczoquitlan, Mexico, 18.8500, -97.0667 Ponta Delgada, Portugal, 37.7400, -25.6700 Purisima de Bustos, Mexico, 21.0333, -101.8667 Jacona de Plancarte, Mexico, 19.9333, -102.3167 Pakribarawan, India, 24.9516, 85.7347 Al Ahmadi, Kuwait, 29.0769, 48.0838 Suwalki, Poland, 54.0989, 22.9286 Say'un, Yemen, 15.9430, 48.7873 Yuriria, Mexico, 20.2000, -101.1500 Bristol, United States, 36.5572, -82.2154 Todupulai, India, 9.9000, 76.7192 Mineral de la Reforma, Mexico, 20.1500, -98.4333 Indang, Philippines, 14.2000, 120.8800 Sabae, Japan, 35.9565, 136.1843 Alamada, Philippines, 7.3868, 124.5534 Isna, Egypt, 25.2933, 32.5564 Pozarevac, Serbia, 44.6200, 21.1897 Kayankulam, India, 9.1720, 76.5010 Velsen-Zuid, Netherlands, 52.4667, 4.6167 Michigan City, United States, 41.7092, -86.8690 Gary, United States, 41.5905, -87.3473 Minusinsk, Russia, 53.7000, 91.6833 Solok, Indonesia, -0.7997, 100.6661 Jarabacoa, Dominican Republic, 19.1167, -70.6333 Paradip Garh, India, 20.3160, 86.6100 Quartu Sant'Elena, Italy, 39.2413, 9.1839 Valle Hermoso, Mexico, 25.6736, -97.8144 Dubuque, United States, 42.5002, -90.7070 Bouira, Algeria, 36.3800, 3.9014 San Leonardo, Philippines, 15.3611, 120.9622 Ilkal, India, 15.9592, 76.1135 Schenectady, United States, 42.8025, -73.9275 Zapotlanejo, Mexico, 20.6228, -103.0689 Doboj, Bosnia and Herzegovina, 44.7333, 18.1333 Victor Larco Herrera, Peru, -8.1333, -79.0500 Nihtaur, India, 29.3300, 78.3800 E'erguna, China, 50.2430, 120.1810 Ubon Ratchathani, Thailand, 15.2281, 104.8594 Mamungan, Philippines, 8.1200, 124.2200 Casper, United States, 42.8420, -106.3208 Levallois-Perret, France, 48.8950, 2.2872 Sanza Pombo, Angola, -7.3333, 16.0000 Tangub, Philippines, 8.0667, 123.7500 Anjangaon, India, 21.1500, 77.2800 Franklin, United States, 40.4759, -74.5515 Saki, Azerbaijan, 41.1919, 47.1706 Bardibas, Nepal, 26.9917, 85.8917 Tuymazy, Russia, 54.6000, 53.7000 Puerto San Jose, Guatemala, 13.9333, -90.8167 Ash Shihr, Yemen, 14.7608, 49.6069 Oriximina, Brazil, -1.7658, -55.8658 Hameenlinna, Finland, 60.9944, 24.4667 Adrar, Algeria, 27.8667, -0.2833 Hanford, United States, 36.3274, -119.6549 Lodja, Congo (Kinshasa), -3.5242, 23.5964 Matara, Sri Lanka, 5.9500, 80.5333 St. Albert, Canada, 53.6303, -113.6258 Otukpo, Nigeria, 7.1904, 8.1300 Swedru, Ghana, 5.5371, -0.6998 Nghia Lo, Vietnam, 21.5758, 104.5192 Tynemouth, United Kingdom, 55.0170, -1.4230 Shawnee, United States, 39.0158, -94.8076 Sipocot, Philippines, 13.7675, 122.9783 Tuburan, Philippines, 10.7300, 123.8300 South Hill, United States, 47.1198, -122.2853 Eagan, United States, 44.8170, -93.1638 Union City, United States, 37.6032, -122.0181 Miagao, Philippines, 10.6442, 122.2352 Xa Muteba, Angola, -9.5167, 17.8167 Cuyapo, Philippines, 15.7778, 120.6608 Mbake, Senegal, 14.7903, -15.9078 Pinheiro, Brazil, -2.5208, -45.0828 Fort McMurray, Canada, 56.7333, -111.3833 Lindong, China, 43.9681, 119.3756 Renukut, India, 24.2000, 83.0300 Ixtlahuacan de los Membrillos, Mexico, 20.3500, -103.1833 Putrajaya, Malaysia, 2.9140, 101.7019 Al Buraymi, Oman, 24.2558, 55.8025 Weston, United States, 26.1006, -80.4054 Dinslaken, Germany, 51.5667, 6.7333 San Pedro Ayampuc, Guatemala, 14.7833, -90.4500 La Barca, Mexico, 20.2833, -102.5667 Kankakee, United States, 41.1020, -87.8643 Yanghe, China, 38.2727, 106.2496 Castillejos, Philippines, 14.9300, 120.2000 Antalaha, Madagascar, -14.8833, 50.2833 Leander, United States, 30.5728, -97.8618 Hammond, United States, 30.5061, -90.4563 Odate, Japan, 40.2714, 140.5642 Siuri, India, 23.9100, 87.5270 Boditi, Ethiopia, 6.8667, 37.8667 Januaria, Brazil, -15.4886, -44.3600 Chengjiao Chengguanzhen, China, 34.4362, 104.0306 Conceicao do Coite, Brazil, -11.5639, -39.2828 Formiga, Brazil, -20.4644, -45.4264 Ksar el Boukhari, Algeria, 35.8856, 2.7508 Kamuli, Uganda, 0.9450, 33.1250 Xo`jayli Shahri, Uzbekistan, 42.4000, 59.4500 Rajsamand, India, 25.0700, 73.8800 Longshan, China, 26.4519, 106.9718 Bishnupur, India, 23.0750, 87.3170 Corvallis, United States, 44.5698, -123.2779 Cannock, United Kingdom, 52.6910, -2.0270 Apex, United States, 35.7237, -78.8743 Kashiwara, Japan, 34.5833, 135.6333 Pesqueira, Brazil, -8.3578, -36.6964 Tepotzotlan, Mexico, 19.7161, -99.2236 Bayombong, Philippines, 16.4800, 121.1500 Sant'Eufemia Lamezia, Italy, 38.9198, 16.2522 Shashijie, China, 28.3458, 113.4240 Apac, Uganda, 1.9850, 32.5350 Issy-les-Moulineaux, France, 48.8239, 2.2700 Pongnam, Korea, South, 37.2200, 126.9494 Cumra, Turkey, 37.5750, 32.7747 Islahiye, Turkey, 37.0250, 36.6345 Modasa, India, 23.4700, 73.3000 Santa Barbara, Philippines, 10.8231, 122.5344 Banepa, Nepal, 27.6333, 85.5167 Kerpen, Germany, 50.8719, 6.6961 Ishim, Russia, 56.1167, 69.5000 Santa Catarina Otzolotepec, Mexico, 18.5667, -97.2500 Heroica Caborca, Mexico, 30.7167, -112.1500 M'diq, Morocco, 35.6858, -5.3253 Molepolole, Botswana, -24.4066, 25.4951 Walsall, United Kingdom, 52.5800, -1.9800 Calais, France, 50.9481, 1.8564 Manaure, Colombia, 11.7792, -72.4494 Kovel, Ukraine, 51.2167, 24.7167 Baprola, India, 28.6408, 77.0104 Vorkuta, Russia, 67.5000, 64.0333 Abnub, Egypt, 27.2667, 31.1500 Zigon, Burma, 18.3385, 95.6230 Gauravaram, India, 17.1000, 80.6000 Bergen op Zoom, Netherlands, 51.5000, 4.3000 Tejen, Turkmenistan, 37.3833, 60.5000 Aregua, Paraguay, -25.3125, -57.3847 Ayolas, Paraguay, -27.3842, -56.8395 Sausar, India, 21.6500, 78.7800 Yuquan, China, 40.4203, 114.0864 Babati, Tanzania, -4.2167, 35.7500 Taman Senai, Malaysia, 1.6006, 103.6419 Omidiyeh, Iran, 30.7583, 49.7050 Huajing, China, 31.1194, 121.4519 Dhenkanal, India, 20.6700, 85.6000 Zihuatanejo, Mexico, 17.6444, -101.5511 Yorba Linda, United States, 33.8890, -117.7714 Bethesda, United States, 38.9866, -77.1188 Chicacao, Guatemala, 14.5333, -91.3167 Fuefuki, Japan, 35.6473, 138.6397 Old Bridge, United States, 40.4004, -74.3126 Urun-Islampur, India, 17.0500, 74.2670 Haverhill, United States, 42.7838, -71.0871 Rolandia, Brazil, -23.3097, -51.3692 Colmar, France, 48.0817, 7.3556 Kostiantynivka, Ukraine, 48.5333, 37.7167 Viladecans, Spain, 41.3158, 2.0197 Stargard Szczecinski, Poland, 53.3333, 15.0333 Gopalganj, India, 26.4700, 84.4300 Itapema, Brazil, -27.0903, -48.6114 Ankazoabokely, Madagascar, -21.5031, 45.2112 Bongaigaon, India, 26.4769, 90.5583 Capelle aan den IJssel, Netherlands, 51.9357, 4.5782 Cuilco, Guatemala, 15.4000, -91.9667 Tolanaro, Madagascar, -25.0325, 46.9833 Lala Musa, Pakistan, 32.7003, 73.9578 Russelsheim, Germany, 50.0000, 8.4333 Asela, Ethiopia, 7.9500, 39.1167 Herford, Germany, 52.1333, 8.6833 Sousa, Brazil, -6.7608, -38.2308 Shiojiri, Japan, 36.1150, 137.9534 Palo Alto, United States, 37.3905, -122.1468 La Plata, Colombia, 2.3900, -75.9075 Rockville, United States, 39.0834, -77.1553 Tabatinga, Brazil, -4.2312, -69.9386 Bay, Philippines, 14.1800, 121.2800 Wanggezhuang, China, 39.6706, 116.4382 Washington, United Kingdom, 54.9000, -1.5200 Lushar, China, 36.4842, 101.5633 Zrenjanin, Serbia, 45.3833, 20.3894 Spring, United States, 30.0613, -95.3830 Dolores Hidalgo Cuna de la Independencia Nacional, Mexico, 21.1516, -100.9369 Coari, Brazil, -4.0850, -63.1408 Chiyoda-ku, Japan, 35.6940, 139.7536 Pikit, Philippines, 7.0500, 124.6700 Dharapuram, India, 10.7314, 77.5189 Guruvayur, India, 10.5946, 76.0369 Kashima, Japan, 35.9656, 140.6448 Cedeno, Venezuela, 7.6492, -66.1759 Aravattur, India, 10.6649, 79.4507 Jagoniguda, India, 17.3200, 78.5200 Mirpeta, India, 17.3200, 78.5200 Lupon, Philippines, 6.8969, 126.0117 Phalodi, India, 27.1310, 72.3640 Embu-Guacu, Brazil, -23.8322, -46.8114 Targoviste, Romania, 44.9244, 25.4572 Veliko Tarnovo, Bulgaria, 43.0787, 25.6283 Delray Beach, United States, 26.4550, -80.0905 Nueva Guinea, Nicaragua, 11.6833, -84.4500 Acilia, Italy, 41.7833, 12.3667 Veenendaal, Netherlands, 52.0250, 5.5550 Kati, Mali, 12.7504, -8.0800 Guines, Cuba, 22.8475, -82.0236 Beypore, India, 11.1800, 75.8100 Pessac, France, 44.8067, -0.6311 El Seibo, Dominican Republic, 18.7700, -69.0400 Ubatuba, Brazil, -23.4339, -45.0708 Middletown, United States, 40.3892, -74.0820 Grays, United Kingdom, 51.4750, 0.3300 Watsonville, United States, 36.9206, -121.7708 Develi, Turkey, 38.3886, 35.4925 Bongabon, Philippines, 15.6321, 121.1448 Kissidougou, Guinea, 9.1905, -10.1200 Cosmopolis, Brazil, -22.6458, -47.1961 Janauba, Brazil, -15.8025, -43.3089 Aksum, Ethiopia, 14.1208, 38.7278 Janiuay, Philippines, 10.9500, 122.5000 Calimera, Italy, 40.2500, 18.2833 San Mateo Atenco, Mexico, 19.2667, -99.5333 Botolan, Philippines, 15.2896, 120.0245 Siddipet, India, 18.1019, 78.8519 Ilidza, Bosnia and Herzegovina, 43.8331, 18.3039 Rosales, Philippines, 15.8944, 120.6328 Mount Vernon, United States, 48.4203, -122.3115 Hihya, Egypt, 30.6687, 31.5904 Venissieux, France, 45.6978, 4.8867 Hit, Iraq, 33.6417, 42.8250 Collado-Villalba, Spain, 40.6333, -4.0083 Kraljevo, Serbia, 43.7234, 20.6870 Bolgatanga, Ghana, 10.7904, -0.8500 Liepaja, Latvia, 56.5083, 21.0111 Karimama, Benin, 12.0667, 3.1833 Karlskrona, Sweden, 56.1611, 15.5881 La Carlota, Philippines, 10.4200, 122.9200 San Mateo, Philippines, 16.8800, 121.5800 Focsani, Romania, 45.7000, 27.1797 Nalut, Libya, 31.8685, 10.9812 Katwijk, Netherlands, 52.2000, 4.4167 Jidd Hafs, Bahrain, 26.2190, 50.5380 Walton upon Thames, United Kingdom, 51.3868, -0.4133 Ramos Arizpe, Mexico, 25.5500, -100.9667 Palatine, United States, 42.1180, -88.0430 Aflao, Ghana, 6.1468, 1.1799 Karakax, China, 37.2714, 79.7267 Novi Pazar, Serbia, 43.1500, 20.5167 Lytkarino, Russia, 55.5833, 37.9000 Victoria, United States, 28.8287, -96.9849 Cabedelo, Brazil, -6.9808, -34.8339 Koratla, India, 18.8215, 78.7119 Saiki, Japan, 32.9597, 131.9000 Weiyuan, China, 36.8413, 101.9557 Damba, Angola, -6.8833, 15.0167 Chignahuapan, Mexico, 19.8333, -98.0333 Yachimata, Japan, 35.6667, 140.3167 Skokie, United States, 42.0360, -87.7400 Szolnok, Hungary, 47.1747, 20.1764 Zacapa, Guatemala, 14.9667, -89.5333 Morristown, United States, 36.2043, -83.3001 Guangping, China, 36.4778, 114.9333 Sammamish, United States, 47.6017, -122.0416 Union City, United States, 40.7675, -74.0323 Queen Creek, United States, 33.2454, -111.6173 Alpharetta, United States, 34.0704, -84.2738 Gudermes, Russia, 43.3500, 46.1000 Opol, Philippines, 8.5200, 124.5700 Hashima, Japan, 35.3199, 136.7033 Lima, United States, 40.7410, -84.1120 Vaxjo, Sweden, 56.8837, 14.8167 Huquan, China, 39.7603, 114.2834 Seinajoki, Finland, 62.7917, 22.8417 Zanhuang, China, 37.6656, 114.3861 Neuwied, Germany, 50.4286, 7.4614 Sandefjord, Norway, 59.1288, 10.2197 Novi, United States, 42.4786, -83.4893 Reghaia, Algeria, 36.7631, 3.3426 Kampung Tengah, Indonesia, 1.4836, 101.9561 Bengkalis, Indonesia, 1.4897, 102.0797 Virginia, South Africa, -28.1064, 26.8622 Sahaswan, India, 28.0680, 78.7510 Marondera, Zimbabwe, -18.1897, 31.5467 Ocoyoacac, Mexico, 19.2739, -99.4606 El Prat de Llobregat, Spain, 41.3333, 2.1000 Arambagh, India, 22.8800, 87.7800 Great Falls, United States, 47.5022, -111.2996 Piduguralla, India, 16.4793, 79.8863 Massa, Italy, 44.0333, 10.1333 Cazin, Bosnia and Herzegovina, 44.9667, 15.9333 Lencois Paulista, Brazil, -22.5986, -48.8003 Tsuruga, Japan, 35.6452, 136.0555 Ilo, Peru, -17.6459, -71.3453 Obera, Argentina, -27.4833, -55.1333 Ames, United States, 42.0256, -93.6217 Genk, Belgium, 50.9653, 5.5006 Goz-Beida, Chad, 12.2236, 21.4144 Chibok, Nigeria, 10.8697, 12.8467 Juana Diaz, Puerto Rico, 18.0532, -66.5044 Oued Lill, Tunisia, 36.8333, 10.0500 Ban Suan, Thailand, 13.3516, 101.0082 Oas, Philippines, 13.2589, 123.4953 Wamena, Indonesia, -4.0975, 138.9511 Dangbo, Benin, 6.5000, 2.6833 Moita, Portugal, 38.6500, -8.9833 Agoo, Philippines, 16.3220, 120.3647 El Carmen de Bolivar, Colombia, 9.7167, -75.1333 Torreon, Mexico, 25.5419, -103.4083 Puliyankudi, India, 9.1725, 77.3956 Madirovalo, Madagascar, -16.4416, 46.5456 Taman Johor Jaya, Malaysia, 1.5392, 103.8092 Hua Hin, Thailand, 12.5686, 99.9578 Lantapan, Philippines, 8.0000, 125.0233 Asenovgrad, Bulgaria, 42.0167, 24.8667 Gloucester, United States, 39.7924, -75.0363 Viterbo, Italy, 42.4186, 12.1042 Anamur, Turkey, 36.0243, 32.8026 Lahat, Indonesia, -3.8000, 103.5333 Itapetinga, Brazil, -15.2489, -40.2478 Wilde, Argentina, -34.7000, -58.3167 Garissa, Kenya, -0.4569, 39.6583 Tatabanya, Hungary, 47.5862, 18.3949 Martinez, Argentina, -34.4833, -58.5000 Kavala, Greece, 40.9333, 24.4000 Karlstad, Sweden, 59.3671, 13.4999 Coron, Philippines, 12.0000, 120.2000 Roxas, Philippines, 17.1200, 121.6200 Aigaleo, Greece, 37.9920, 23.6780 Nizhyn, Ukraine, 51.0381, 31.8861 Finchley, United Kingdom, 51.5990, -0.1870 Thornton Heath, United Kingdom, 51.4002, -0.1086 Sangamner, India, 19.5678, 74.2115 Chegutu, Zimbabwe, -18.1400, 30.1500 Kiamba, Philippines, 5.9912, 124.6257 Fukutsu, Japan, 33.7669, 130.4911 Romita, Mexico, 20.8708, -101.5169 San Remigio, Philippines, 11.0000, 123.9500 Gohna, India, 29.1300, 76.9000 Pulivendla, India, 14.4194, 78.2250 Urus-Martan, Russia, 43.1333, 45.5500 Ruteng, Indonesia, -8.6127, 120.4630 Santo Tome, Argentina, -31.6667, -60.7667 Smila, Ukraine, 49.2336, 31.8822 Ina, Japan, 35.8275, 137.9540 Youssoufia, Morocco, 32.2500, -8.5333 Surubim, Brazil, -7.8331, -35.7547 Lutayan, Philippines, 6.6000, 124.8500 Tulcea, Romania, 45.1775, 28.8036 Arima, Trinidad and Tobago, 10.6333, -61.2833 Angat, Philippines, 14.9281, 121.0293 Weimar, Germany, 50.9811, 11.3294 Qiryat Gat, Israel, 31.6100, 34.7642 Kirtipur, Nepal, 27.6667, 85.2833 Kronjo, Indonesia, -6.0667, 106.4167 Qarqan, China, 38.1338, 85.5333 Bom Jesus da Lapa, Brazil, -13.2550, -43.4178 Korba, Tunisia, 36.5667, 10.8667 Piripiri, Brazil, -4.2728, -41.7769 Xarardheere, Somalia, 4.6544, 47.8575 San Francisco El Alto, Guatemala, 14.9500, -91.4500 Malden, United States, 42.4305, -71.0576 Sindelfingen, Germany, 48.7133, 9.0028 San Antonio Suchitepequez, Guatemala, 14.5333, -91.4167 Kanhangad, India, 12.3167, 75.0667 Shanxia, China, 24.2678, 116.1107 Xiantangcun, China, 23.7940, 114.7447 Al Minshah, Egypt, 26.4769, 31.8036 Los Amates, Guatemala, 15.2667, -89.1000 Xieqiaocun, China, 30.4973, 120.6106 Jaisalmer, India, 26.9130, 70.9150 Seydisehir, Turkey, 37.4183, 31.8506 Kurabur, India, 13.4000, 78.0060 Ain Defla, Algeria, 36.2652, 1.9703 Gniezno, Poland, 52.5358, 17.5958 Dundalk, United States, 39.2704, -76.4942 Sao Bento do Sul, Brazil, -26.2500, -49.3789 Narok, Kenya, -1.0833, 35.8667 Sao Felix do Xingu, Brazil, -6.6450, -51.9950 Albany, United States, 44.6272, -123.0965 Aran Bidgol, Iran, 34.0589, 51.4817 Castro Valley, United States, 37.7088, -122.0626 Baqershahr, Iran, 35.5344, 51.4058 Giddarbaha, India, 30.2000, 74.6700 Taby, Sweden, 59.5000, 18.0500 Purulha, Guatemala, 15.2667, -90.2000 Rovaniemi, Finland, 66.5000, 25.7333 Dalton, United States, 34.7690, -84.9720 Villa Curuguaty, Paraguay, -24.4692, -55.6947 Tamluk, India, 22.3000, 87.9200 Wels, Austria, 48.1500, 14.0167 Hadjout, Algeria, 36.5167, 2.4167 Jamjamal, Iraq, 35.5333, 44.8342 Sinnar, India, 19.8500, 74.0000 Pavlovskiy Posad, Russia, 55.7667, 38.6667 Vaijapur, India, 19.9267, 74.7275 Jocotitlan, Mexico, 19.7072, -99.7867 Lynwood, United States, 33.9240, -118.2016 Solano, Philippines, 16.5183, 121.1811 Quezon, Philippines, 9.2350, 117.9967 Pruszkow, Poland, 52.1667, 20.8000 Birnin Konni, Niger, 13.7904, 5.2599 Ouricuri, Brazil, -7.8828, -40.0819 Tigbauan, Philippines, 10.6747, 122.3776 Jagraon, India, 30.7800, 75.4800 Alipur Duar, India, 26.4890, 89.5270 Debre Birhan, Ethiopia, 9.6833, 39.5333 Pateros, Philippines, 14.5448, 121.0671 Plauen, Germany, 50.4833, 12.1167 Dhuri, India, 30.3685, 75.8679 Rechytsa, Belarus, 54.3667, 30.4000 Xibang, China, 30.9472, 120.8889 Halabjah, Iraq, 35.1833, 45.9833 Rosenheim, Germany, 47.8500, 12.1333 Kitamoto, Japan, 36.0269, 139.5302 Dormagen, Germany, 51.1000, 6.8167 Irpin, Ukraine, 50.5167, 30.2500 Guider, Cameroon, 9.9342, 13.9486 Pflugerville, United States, 30.4515, -97.6018 San Jose, Philippines, 10.7433, 121.9411 Toboali, Indonesia, -2.9997, 106.4656 Sebring, United States, 27.4770, -81.4530 Villach, Austria, 46.6167, 13.8500 Kenner, United States, 30.0109, -90.2549 Clichy, France, 48.9044, 2.3064 Xinbin, China, 41.7342, 125.0400 Kalush, Ukraine, 49.0442, 24.3597 Estancia, Brazil, -11.2678, -37.4378 Itaberaba, Brazil, -12.5278, -40.3069 Rath, India, 25.5800, 79.5700 Ogoshi, Japan, 32.8858, 130.7897 Villasis, Philippines, 15.9000, 120.5800 Mecheria, Algeria, 33.5500, -0.2833 Zeist, Netherlands, 52.0906, 5.2331 Gurupi, Brazil, -11.7289, -49.0689 Farnborough, United Kingdom, 51.2900, -0.7500 Bazar-e Yakawlang, Afghanistan, 34.7333, 66.9667 Patuakhali, Bangladesh, 22.2591, 90.3184 Kanyobagonga, Congo (Kinshasa), -0.7020, 29.1726 Tasgaon, India, 17.0300, 74.6000 Popondetta, Papua New Guinea, -8.7656, 148.2347 Saidu Sharif, Pakistan, 34.7500, 72.3572 Matamey, Niger, 13.4231, 8.4748 Port Charlotte, United States, 26.9918, -82.1140 Caripito, Venezuela, 10.1167, -63.1000 Maasin, Philippines, 5.8700, 125.0000 Keitumkawn, India, 23.3100, 92.8500 Autlan de Navarro, Mexico, 19.7667, -104.3667 Busia, Uganda, 0.4669, 34.0900 Ioannina, Greece, 39.6636, 20.8522 La Ceja, Colombia, 6.0306, -75.4317 Kolonnawa, Sri Lanka, 6.9329, 79.8848 Coyula, Mexico, 20.6586, -103.2264 Loughborough, United Kingdom, 52.7725, -1.2078 Chiquimulilla, Guatemala, 14.0833, -90.3833 Don Torcuato, Argentina, -34.5000, -58.6167 Tigre, Argentina, -34.5000, -58.6167 Nagcarlan, Philippines, 14.1364, 121.4165 Palaio Faliro, Greece, 37.9333, 23.7000 Ladysmith, South Africa, -28.5597, 29.7806 Tomigusuku, Japan, 26.1611, 127.6689 Igarape-Miri, Brazil, -1.9750, -48.9600 Bordj Menaiel, Algeria, 36.7417, 3.7231 Gwacheon, Korea, South, 37.4333, 127.0000 Sabinas, Mexico, 27.9167, -101.3000 Ostrowiec Swietokrzyski, Poland, 50.9333, 21.4000 Soloma, Guatemala, 15.7167, -91.4500 As Suwayda', Syria, 32.7004, 36.5666 Waltham, United States, 42.3889, -71.2423 Weishui, China, 38.0230, 114.1458 Chipindo, Angola, -13.8244, 15.8000 Faizabad, Afghanistan, 37.1166, 70.5800 Sangzishi, China, 27.6675, 111.3706 Oued Rhiou, Algeria, 35.9667, 0.9167 Kensington, United Kingdom, 51.5000, -0.1900 Meulaboh, Indonesia, 4.1333, 96.1167 Marinilla, Colombia, 6.1738, -75.3347 Gerli, Argentina, -34.6833, -58.3667 Commerce City, United States, 39.8641, -104.8430 Binga, Congo (Kinshasa), 2.4000, 20.4200 Santo Domingo Tehuantepec, Mexico, 16.3244, -95.2389 Fredericton, Canada, 45.9636, -66.6431 Nea Ionia, Greece, 38.0333, 23.7500 Brentwood, United States, 37.9356, -121.7190 Boston, United Kingdom, 52.9740, -0.0214 Grevenbroich, Germany, 51.0883, 6.5875 Lechang, China, 35.6415, 111.4633 Faro, Portugal, 37.0161, -7.9350 Pirane, Argentina, -25.7328, -59.1100 Narapalli, India, 17.4167, 78.6287 Fujioka, Japan, 36.2587, 139.0746 Tulkarm, West Bank, 32.3104, 35.0286 Quimper, France, 47.9967, -4.0964 Ivry-sur-Seine, France, 48.8078, 2.3747 Beloretsk, Russia, 53.9667, 58.4000 Isabela, Philippines, 10.2000, 122.9800 Hilongos, Philippines, 10.3700, 124.7500 North Little Rock, United States, 34.7807, -92.2371 Arrecife, Spain, 28.9625, -13.5506 Palitana, India, 21.5200, 71.8300 Roeselare, Belgium, 50.9333, 3.1167 South San Francisco, United States, 37.6538, -122.4196 Rivera, Uruguay, -30.9025, -55.5506 Rahat, Israel, 31.3925, 34.7544 Itamaraju, Brazil, -17.0392, -39.5311 Al Qurayn, Egypt, 30.6161, 31.7350 Dharmapuri, India, 12.1211, 78.1582 Apaseo el Alto, Mexico, 20.4500, -100.6167 Sokhumi, Georgia, 43.0000, 41.0167 Idappadi, India, 11.5835, 77.8341 Hiriyur, India, 13.9446, 76.6172 Porto Nacional, Brazil, -10.7078, -48.4169 Paignton, United Kingdom, 50.4353, -3.5625 Potenza, Italy, 40.6333, 15.8000 Neubrandenburg, Germany, 53.5569, 13.2611 Chunian, Pakistan, 31.0167, 73.8500 Malvar, Philippines, 14.0417, 121.1583 Santiago Tianguistenco, Mexico, 19.1797, -99.4706 Bellevue, United States, 41.1485, -95.9390 Waterlooville, United Kingdom, 50.8800, -1.0300 Sirsi, India, 28.6400, 78.6400 Sibulan, Philippines, 9.3500, 123.2800 Povoa de Varzim, Portugal, 41.3828, -8.7628 Ash Shaykh Zuwayd, Egypt, 31.2119, 34.1106 Chervonohrad, Ukraine, 50.3867, 24.2289 Burnsville, United States, 44.7648, -93.2793 Saravia, Philippines, 10.8800, 122.9700 Valence, France, 44.9333, 4.8917 Burhaniye, Turkey, 39.5000, 26.9500 Seraing, Belgium, 50.5986, 5.5122 Glogow, Poland, 51.6589, 16.0803 Atimonan, Philippines, 14.0036, 121.9199 Rayong, Thailand, 12.6742, 101.2789 Misantla, Mexico, 19.9333, -96.8500 Bourges, France, 47.0844, 2.3964 Greenwood, United States, 39.6019, -86.1073 Kodad, India, 16.9978, 79.9653 Sangmelima, Cameroon, 2.9333, 11.9833 Alba Iulia, Romania, 46.0669, 23.5700 Cienaga de Oro, Colombia, 8.8833, -75.6167 Ferrol, Spain, 43.4844, -8.2328 Bertioga, Brazil, -23.8539, -46.1389 Qinggang, China, 46.6900, 126.1000 Granollers, Spain, 41.6080, 2.2880 La Linea de la Concepcion, Spain, 36.1681, -5.3486 Tadepalle, India, 16.4803, 80.6186 Grande Prairie, Canada, 55.1708, -118.7947 Rowlett, United States, 32.9155, -96.5489 Welkom, South Africa, -27.9831, 26.7208 Qal`ah-ye Now, Afghanistan, 34.9867, 63.1292 San Felipe, Chile, -32.7500, -70.7239 Yanagawa, Japan, 33.1631, 130.4058 Pomezia, Italy, 41.6693, 12.5021 Boryspil, Ukraine, 50.3500, 30.9500 Plettenberg Bay, South Africa, -34.0500, 23.3667 Siuna, Nicaragua, 13.7333, -84.7667 Talagang, Pakistan, 32.9278, 72.4111 Teresa, Philippines, 14.5586, 121.2083 Randers, Denmark, 56.4607, 10.0364 Kristiansand, Norway, 58.1467, 7.9956 Ishimbay, Russia, 53.4500, 56.0333 Antony, France, 48.7539, 2.2975 Armur, India, 18.7900, 78.2900 Laguna Niguel, United States, 33.5275, -117.7050 Atotonilco el Alto, Mexico, 20.5333, -102.5000 Guiseley, United Kingdom, 53.8750, -1.7060 Ensenada Berisso, Argentina, -34.8667, -57.9000 Kashmor, Pakistan, 28.2600, 69.3500 Sodegaura, Japan, 35.4300, 139.9544 Tiquisate, Guatemala, 14.2833, -91.3667 Tuao, Philippines, 17.7350, 121.4553 Bankra, India, 22.6086, 88.2797 Nawalgarh, India, 27.8458, 75.2680 Tupa, Brazil, -21.9350, -50.5139 Bozeman, United States, 45.6833, -111.0558 Lower Merion, United States, 40.0282, -75.2807 Most, Czechia, 50.5031, 13.6367 Tohana, India, 29.7000, 75.9000 Nieuwegein, Netherlands, 52.0314, 5.0919 Penedo, Brazil, -10.2900, -36.5858 Santa Cruz, Philippines, 15.7700, 119.9200 Inhambane, Mozambique, -23.8650, 35.3833 Donskoy, Russia, 53.9658, 38.3247 Sibalom, Philippines, 10.7883, 122.0175 Port Orange, United States, 29.1085, -81.0137 Trnava, Slovakia, 48.3777, 17.5862 Kangbao, China, 41.8511, 114.6176 Khagaul, India, 25.5790, 85.0456 Cosenza, Italy, 39.3000, 16.2500 Tenri, Japan, 34.5967, 135.8372 Dalja, Egypt, 27.6430, 30.7001 Ponferrada, Spain, 42.5500, -6.5833 Magong, Taiwan, 23.5667, 119.5833 Guamuchil, Mexico, 25.4639, -108.0794 Odendaalsrus, South Africa, -27.8667, 26.6833 Chakpi Karong, India, 24.3167, 93.9833 Ambarawa, Indonesia, -7.2667, 110.4000 Sundapalaiyam, India, 11.0014, 76.8732 Fraijanes, Guatemala, 14.4667, -90.4333 Jatani, India, 20.1700, 85.7000 Chokwe, Mozambique, -24.5253, 33.0086 Kurihara, Japan, 38.7301, 141.0215 Zvornik, Bosnia and Herzegovina, 44.3833, 19.1000 Nawa, Syria, 32.8865, 36.0390 Maroochydore, Australia, -26.6553, 153.0932 Chincha Alta, Peru, -13.4500, -76.1333 Jose Panganiban, Philippines, 14.2922, 122.6928 Siemianowice Slaskie, Poland, 50.2758, 18.9858 Irun, Spain, 43.3378, -1.7888 Chik Ballapur, India, 13.4300, 77.7200 Athni, India, 16.7300, 75.0700 Dedougou, Burkina Faso, 12.4667, -3.4667 Fredrikstad, Norway, 59.2181, 10.9298 Oyo, Congo (Brazzaville), -1.1603, 15.9736 Capao da Canoa, Brazil, -29.7608, -50.0300 Tanjung Selor, Indonesia, 2.8500, 117.3833 Hornchurch, United Kingdom, 51.5565, 0.2128 Assi Bou Nif, Algeria, 35.7000, -0.5000 Maidenhead, United Kingdom, 51.5230, -0.7220 Yangqingcun, China, 21.3594, 110.1164 Benevides, Brazil, -1.3608, -48.2450 At Tall, Syria, 33.6103, 36.3107 Reston, United States, 38.9497, -77.3461 Midoun, Tunisia, 33.8000, 11.0000 Yattir, West Bank, 31.4333, 35.0833 San Clemente, United States, 33.4499, -117.6102 Asahi, Japan, 35.7167, 140.6500 Stupino, Russia, 54.8833, 38.1000 Slatina, Romania, 44.4297, 24.3642 Bhairahawa, Nepal, 27.5000, 83.4500 Badr Hunayn, Saudi Arabia, 23.7829, 38.7905 Caldwell, United States, 43.6453, -116.6594 Khulays, Saudi Arabia, 22.1555, 39.3202 Friedrichshafen, Germany, 47.6500, 9.4833 Tajumulco, Guatemala, 15.0833, -91.8833 Fengang, China, 30.8910, 121.0130 Akurana, Sri Lanka, 7.3667, 80.6167 Mitcham, United Kingdom, 51.4009, -0.1517 Medicine Hat, Canada, 50.0417, -110.6775 Feltham, United Kingdom, 51.4496, -0.4089 Sumbawa Besar, Indonesia, -8.5000, 117.4167 Coon Rapids, United States, 45.1755, -93.3094 Ito, Japan, 34.9657, 139.1019 Millcreek, United States, 40.6892, -111.8292 Dhuburi, India, 26.0200, 90.0000 Fujiidera, Japan, 34.5667, 135.6000 Mirassol, Brazil, -20.8189, -49.5208 Vittoria, Italy, 36.9500, 14.5333 Prilep, North Macedonia, 41.3464, 21.5542 Stourbridge, United Kingdom, 52.4575, -2.1479 Mercedes, Argentina, -34.6500, -59.4333 Galgamuwa, Sri Lanka, 8.0000, 80.2831 Ban Lam Sam Kaeo, Thailand, 13.9728, 100.6511 Abu Qurqas, Egypt, 27.9304, 30.8383 Kelaa Kebira, Tunisia, 35.8667, 10.5333 Eden Prairie, United States, 44.8488, -93.4595 Kitale, Kenya, 1.0167, 35.0000 Cajazeiras, Brazil, -6.8900, -38.5619 Ouled Djellal, Algeria, 34.4167, 5.0667 Parkersburg, United States, 39.2623, -81.5420 Banda del Rio Sali, Argentina, -26.8500, -65.1667 Gorno-Altaysk, Russia, 51.9500, 85.9667 Anuradhapura, Sri Lanka, 8.3350, 80.4108 Tartagal, Argentina, -22.5000, -63.8333 Lugano, Switzerland, 46.0103, 8.9625 Gadwal, India, 16.2300, 77.8000 Tetovo, North Macedonia, 42.0103, 20.9714 Horsens, Denmark, 55.8657, 9.8735 Rockhampton, Australia, -23.3781, 150.5136 Qurayyat, Oman, 23.2652, 58.9034 Hamilton, United States, 39.3939, -84.5653 Teoloyucan, Mexico, 19.7442, -99.1811 Sidi Barani, Egypt, 31.6108, 25.9256 Novaya Balakhna, Russia, 56.4899, 43.6011 Visnagar, India, 23.7000, 72.5500 Nankana Sahib, Pakistan, 31.4500, 73.7067 Puerto Asis, Colombia, 0.5167, -76.5000 Nago, Japan, 26.5917, 127.9775 Klintsy, Russia, 52.7500, 32.2333 San Fernando, Philippines, 7.9178, 125.3286 Moore, United States, 35.3293, -97.4757 Vaslui, Romania, 46.6383, 27.7292 Nyagan, Russia, 62.1333, 65.3833 Lakewood, United States, 47.1628, -122.5299 Pamuru, India, 15.0970, 79.4090 Kasongo, Congo (Kinshasa), -4.4500, 26.6500 Machiques, Venezuela, 10.0667, -72.5667 Kaga, Japan, 36.3028, 136.3150 Kelibia, Tunisia, 36.8500, 11.1000 Rochester, United Kingdom, 51.3750, 0.5000 Batatais, Brazil, -20.8911, -47.5850 Bay City, United States, 43.5902, -83.8887 Miyoshi, Japan, 35.0894, 137.0748 Pabianice, Poland, 51.6500, 19.3833 Halton Hills, Canada, 43.6300, -79.9500 Dewsbury, United Kingdom, 53.6910, -1.6330 Beledweyne, Somalia, 4.7360, 45.2040 Sheikhpura, India, 25.1403, 85.8508 Marina di Carrara, Italy, 44.0381, 10.0456 Narlidere, Turkey, 38.3911, 27.0028 Mahdasht, Iran, 35.7278, 50.8089 La Seyne-sur-Mer, France, 43.1000, 5.8830 Yurimaguas, Peru, -5.9000, -76.0833 Campo Bom, Brazil, -29.6789, -51.0528 Sirsi, India, 14.6194, 74.8375 Balboa Heights, Panama, 8.9500, -79.5500 Mut, Turkey, 36.6458, 33.4375 Dmitrov, Russia, 56.3500, 37.5333 Washim, India, 20.1113, 77.1330 Calinog, Philippines, 11.1300, 122.5000 Tres Arroyos, Argentina, -38.3667, -60.2667 Bossier City, United States, 32.5224, -93.6668 Palmela, Portugal, 38.5675, -8.8991 Brookline, United States, 42.3243, -71.1408 Moncada, Philippines, 15.7331, 120.5725 Balad, Iraq, 34.0147, 44.1456 Itupeva, Brazil, -23.1531, -47.0578 Moknine, Tunisia, 35.6333, 10.9000 Gampaha, Sri Lanka, 7.0897, 79.9925 Woking, United Kingdom, 51.3050, -0.5390 Tamana, Japan, 32.9356, 130.5628 Nanpara, India, 27.8700, 81.5000 Tan Phuoc Khanh, Vietnam, 11.0000, 106.7167 Castellammare di Stabia, Italy, 40.6947, 14.4803 Bansalan, Philippines, 6.7800, 125.2200 Champasak, Laos, 14.8400, 105.7500 Schwabisch Gmund, Germany, 48.8000, 9.8000 Bari, India, 26.6300, 77.6200 Lingshou, China, 38.3064, 114.3783 Limerick, Ireland, 52.6653, -8.6238 Gusang, China, 28.2864, 113.7424 Qoryooley, Somalia, 1.7878, 44.5300 Dovzhansk, Ukraine, 48.0778, 39.6472 Bensalem, United States, 40.1086, -74.9431 Koro, Mali, 14.0639, -3.0753 Tandag, Philippines, 9.0789, 126.1986 Plymouth, United States, 41.8783, -70.6309 Midalt, Morocco, 32.6800, -4.7300 Boadilla del Monte, Spain, 40.4069, -3.8750 Svyetlahorsk, Belarus, 52.6333, 29.7333 Carmen de Viboral, Colombia, 6.0833, -75.3333 Kapatagan, Philippines, 7.9000, 123.7700 Council Bluffs, United States, 41.2369, -95.8516 Anse a Galets, Haiti, 18.8345, -72.8664 Ico, Brazil, -6.4008, -38.8619 Debre Mark'os, Ethiopia, 10.3333, 37.7167 Montauban, France, 44.0181, 1.3558 Acton, United Kingdom, 51.5135, -0.2707 Nagakute, Japan, 35.1840, 137.0487 Huntersville, United States, 35.4060, -80.8716 Mobarakeh, Iran, 32.3494, 51.5000 Phalia, Pakistan, 32.4328, 73.5778 Troyes, France, 48.2997, 4.0792 Pervomaisk, Ukraine, 48.0439, 30.8500 Wenxicun, China, 28.1627, 120.3885 Taylor, United States, 42.2260, -83.2688 Shuya, Russia, 56.8500, 41.3667 Hendersonville, United States, 36.3063, -86.5997 Zouerate, Mauritania, 22.7333, -12.4667 Berekum, Ghana, 7.4504, -2.5900 Ranipet, India, 12.9247, 79.3333 Ambilobe, Madagascar, -13.1873, 49.0524 Wundanyi, Kenya, -3.3964, 38.3573 Kolding, Denmark, 55.4929, 9.4681 Camocim, Brazil, -2.9008, -40.8428 Kesamudram, India, 17.6875, 79.8944 Villa Dominico, Argentina, -34.6917, -58.3333 Ras Tanura, Saudi Arabia, 26.7074, 50.0674 Puerto Penasco, Mexico, 31.3167, -113.5369 Bainet, Haiti, 18.1840, -72.7523 Kattagan, Uzbekistan, 39.7167, 64.5500 Riosucio, Colombia, 5.4208, -75.7025 Sanford, United States, 28.7891, -81.2757 Shangtangcun, China, 21.5989, 111.5907 Carazinho, Brazil, -28.2839, -52.7864 Kolda, Senegal, 12.8958, -14.9408 Nagari, India, 13.3214, 79.5856 Nordre Fale, Norway, 59.7500, 10.8667 Napier, New Zealand, -39.4903, 176.9178 La Habra, United States, 33.9282, -117.9515 Sherkot, India, 29.3500, 78.5800 Tighenif, Algeria, 35.4167, 0.3333 Mandi Dabwali, India, 29.9477, 74.7322 Esperanza, Dominican Republic, 19.5800, -70.9900 Herten, Germany, 51.6000, 7.1333 Camaqua, Brazil, -30.8528, -51.8153 Santarem, Portugal, 39.2333, -8.6833 Asaka, Uzbekistan, 40.6333, 72.2333 Panchari Bazar, Bangladesh, 23.2867, 91.9027 Offenburg, Germany, 48.4667, 7.9333 Bannu, Pakistan, 32.9864, 70.6044 Cyuve, Rwanda, -1.4833, 29.6500 Kungur, Russia, 57.4333, 56.9333 Bergheim, Germany, 50.9667, 6.6500 Boituva, Brazil, -23.2833, -47.6722 Raghogarh, India, 24.4442, 77.1986 Horizon West, United States, 28.4417, -81.6146 Twickenham, United Kingdom, 51.4490, -0.3370 Agia Paraskevi, Greece, 38.0117, 23.8200 Analavory, Madagascar, -18.9741, 46.7190 Figueira da Foz, Portugal, 40.1508, -8.8618 Dearborn Heights, United States, 42.3164, -83.2769 Aurora, Philippines, 13.3500, 122.5200 Narwana, India, 29.6167, 76.1117 Vigevano, Italy, 45.3167, 8.8667 Cabaret, Haiti, 18.7358, -72.4193 Aurora, Canada, 44.0000, -79.4667 Okha, India, 22.4667, 69.0667 Korogwe, Tanzania, -5.1558, 38.4503 Turhal, Turkey, 40.3900, 36.0900 Derik, Turkey, 37.3658, 40.2697 Nova Odessa, Brazil, -22.7797, -47.2962 Meshkin Dasht, Iran, 35.7514, 50.9397 San Francisco, Argentina, -31.4356, -62.0714 Sihushan, China, 28.9716, 112.6413 Bhabhua, India, 25.0500, 83.6200 Koshizuka, Japan, 32.8931, 130.7251 San Francisco de los Romo, Mexico, 22.0833, -102.2667 Manicaragua, Cuba, 22.1500, -79.9764 Rouiba, Algeria, 36.7333, 3.2833 Tendo, Japan, 38.3623, 140.3779 Borj el Qoble, Lebanon, 33.2631, 35.2389 St. Cloud, United States, 28.2363, -81.2779 Arua, Uganda, 3.0353, 30.9108 Nanjangud, India, 12.1200, 76.6800 Camotan, Guatemala, 14.8167, -89.3817 Mongagua, Brazil, -24.0869, -46.6289 Tagajo, Japan, 38.2938, 141.0043 Yongbei, China, 26.6462, 100.7807 Pontiac, United States, 42.6493, -83.2878 Richland, United States, 46.2824, -119.2939 Cambanugoy, Philippines, 7.5386, 125.7508 Satbayev, Kazakhstan, 47.9000, 67.5333 Al Khawr, Qatar, 25.6900, 51.5100 Zengqiao, China, 27.5153, 112.2336 Siddhapur, India, 23.9167, 72.3833 Plato, Colombia, 9.7919, -74.7872 Mitoyo, Japan, 34.1825, 133.7150 Patnos, Turkey, 39.2358, 42.8686 Sao Miguel dos Campos, Brazil, -9.7811, -36.0936 Diphu, India, 25.8300, 93.4300 Zory, Poland, 50.0500, 18.7000 Leszno, Poland, 51.8458, 16.5806 Runcorn, United Kingdom, 53.3417, -2.7313 Nakhyaungcharipara, Bangladesh, 21.4281, 92.1779 Nkawkaw, Ghana, 6.5505, -0.7800 Hatogaya-honcho, Japan, 35.8333, 139.7333 Neu-Ulm, Germany, 48.3833, 10.0000 Marietta, United States, 33.9533, -84.5422 Camabatela, Angola, -8.1833, 15.3667 Songkhla, Thailand, 7.2061, 100.5967 Hita, Japan, 33.3214, 130.9411 Morada Nova, Brazil, -5.1067, -38.3725 Florence-Graham, United States, 33.9682, -118.2447 Jhargram, India, 22.4500, 86.9800 Afragola, Italy, 40.9167, 14.3167 Santo Amaro, Brazil, -12.5469, -38.7119 Yangiyul, Uzbekistan, 41.1125, 69.0467 Sungo, Angola, -11.2333, 14.3167 Penapolis, Brazil, -21.4200, -50.0778 Shiroi, Japan, 35.7915, 140.0563 Xiluodu, China, 28.2442, 103.6385 Cortazar, Mexico, 20.4828, -100.9611 Praia, Cabo Verde, 14.9177, -23.5092 Kolea, Algeria, 36.6406, 2.7650 Springfield, United States, 44.0538, -122.9811 San Juan Chamelco, Guatemala, 15.4257, -90.3263 San Antonio del Tachira, Venezuela, 7.8167, -72.4500 Karonga, Malawi, -9.9329, 33.9333 Trikala, Greece, 39.5500, 21.7667 Wrecsam, United Kingdom, 53.0467, -2.9936 Kstovo, Russia, 56.1667, 44.1667 Arcoverde, Brazil, -8.4189, -37.0539 Sayyid Sadiq, Iraq, 35.3500, 45.8667 Garbsen, Germany, 52.4183, 9.5981 Valle de Bravo, Mexico, 19.1925, -100.1306 Encinitas, United States, 33.0492, -117.2610 Cayenne, French Guiana, 4.9330, -52.3300 May Pen, Jamaica, 17.9650, -77.2450 Georgiyevsk, Russia, 44.1500, 43.4667 Santa Ana, Philippines, 15.0939, 120.7681 Asker, Norway, 59.8331, 10.4392 Hato Mayor, Dominican Republic, 18.7670, -69.2670 Ostuncalco, Guatemala, 14.8667, -91.6167 Ilobasco, El Salvador, 13.8400, -88.8500 Oudtshoorn, South Africa, -33.5833, 22.2000 Norak, Tajikistan, 38.3833, 69.3167 Itogon, Philippines, 16.3700, 120.6700 Port Coquitlam, Canada, 49.2625, -122.7811 Wellington, United States, 26.6461, -80.2699 Korosten, Ukraine, 50.9500, 28.6333 Baao, Philippines, 13.4535, 123.3654 Menzel Temime, Tunisia, 36.7833, 10.9833 La Democracia, Guatemala, 15.6333, -91.8667 Hasuda, Japan, 35.9945, 139.6624 Widnes, United Kingdom, 53.3620, -2.7340 Taal, Philippines, 13.8800, 120.9300 Djibo, Burkina Faso, 14.1011, -1.6306 Euclides da Cunha, Brazil, -10.5078, -39.0139 Palm Harbor, United States, 28.0847, -82.7481 Xinmin, China, 35.1278, 108.1447 Ramanathapuram, India, 9.3639, 78.8395 Candon, Philippines, 17.1958, 120.4489 Sawahlunto, Indonesia, -0.6667, 100.7833 Gia Nghia, Vietnam, 11.9833, 107.7000 Merzifon, Turkey, 40.8750, 35.4633 Montebello, United States, 34.0155, -118.1108 Tunasan, Philippines, 14.3725, 121.0364 Vejle, Denmark, 55.7090, 9.5350 Madinat `Isa, Bahrain, 26.1736, 50.5478 Mariana, Brazil, -20.3783, -43.4165 Tarnowskie Gory, Poland, 50.4444, 18.8583 Trikonavattam, India, 8.9000, 76.6500 Wesel, Germany, 51.6586, 6.6178 Santa Catarina Ixtahuacan, Guatemala, 14.8000, -91.3667 Shilu, China, 19.2792, 109.0518 Woodland, United States, 38.6712, -121.7500 Hurth, Germany, 50.8775, 6.8761 Salgueiro, Brazil, -8.0742, -39.1192 Korydallos, Greece, 37.9833, 23.6500 Halvad, India, 23.0200, 71.1800 Venancio Aires, Brazil, -29.6058, -52.1919 Mateare, Nicaragua, 12.2333, -86.4333 Barbalha, Brazil, -7.3111, -39.3042 Margate, United Kingdom, 51.3850, 1.3838 Abuyog, Philippines, 10.7458, 125.0122 Coyhaique, Chile, -45.5667, -72.0667 Maues, Brazil, -3.3836, -57.7186 North Bergen, United States, 40.7938, -74.0242 Bocaranga, Central African Republic, 6.9844, 15.6408 Aracati, Brazil, -4.5619, -37.7700 Ar Rastan, Syria, 34.9267, 36.7324 Bawku, Ghana, 11.0600, -0.2422 Caico, Brazil, -6.4578, -37.0978 Udamalpet, India, 10.5855, 77.2513 Bristol, United States, 41.6812, -72.9407 Cabatuan, Philippines, 10.8800, 122.4800 Mirabel, Canada, 45.6500, -74.0833 Jupiter, United States, 26.9200, -80.1128 Santo Domingo, Philippines, 15.5900, 120.8786 Ellesmere Port, United Kingdom, 53.2790, -2.8970 Santa Rosa de Copan, Honduras, 14.7675, -88.7781 Barberena, Guatemala, 14.3167, -90.3667 Velika Gorica, Croatia, 45.7000, 16.0667 Hashimoto, Japan, 34.3167, 135.6000 Idiofa, Congo (Kinshasa), -4.9668, 19.5910 Scheveningen, Netherlands, 52.1081, 4.2731 Olbia, Italy, 40.9167, 9.5000 Malikounda, Senegal, 14.4724, -16.9459 Bangor, United Kingdom, 54.6600, -5.6700 Leninogorsk, Russia, 54.6000, 52.5000 Neka, Iran, 36.6500, 53.2972 Tulunan, Philippines, 6.8300, 124.8800 Adjohon, Benin, 6.7000, 2.4667 Pantin, France, 48.8966, 2.4017 Wanparti, India, 16.3623, 78.0622 Tafo, Ghana, 6.7316, -1.6137 Aisai, Japan, 35.1528, 136.7282 Seferhisar, Turkey, 38.2000, 26.8333 Tsushima, Japan, 35.1771, 136.7413 Itoman, Japan, 26.1236, 127.6658 Soroti, Uganda, 1.7150, 33.6111 Chachoengsao, Thailand, 13.6903, 101.0703 Nambuangongo, Angola, -8.0167, 14.2000 Rossosh, Russia, 50.2000, 39.5500 Los Polvorines, Argentina, -34.5000, -58.7000 Jinoba-an, Philippines, 9.6018, 122.4668 Lomza, Poland, 53.1764, 22.0731 Aleksin, Russia, 54.5167, 37.1000 La Mesa, United States, 32.7703, -117.0204 Tamba, Japan, 35.1833, 135.0333 Kolomyia, Ukraine, 48.5306, 25.0403 Pico Rivera, United States, 33.9901, -118.0888 Chamrajnagar, India, 11.9260, 76.9402 Saraburi, Thailand, 14.5286, 100.9114 Ain Harrouda, Morocco, 33.6372, -7.4483 Jinzecun, China, 31.0397, 120.9164 Fort Portal, Uganda, 0.6544, 30.2744 Meihuacun, China, 37.8862, 114.8204 Yamatotakada, Japan, 34.5150, 135.7364 Bethal, South Africa, -26.4500, 29.4500 Orion, Philippines, 14.6206, 120.5817 Sarandi, Argentina, -34.6833, -58.3333 El Wak, Kenya, 2.8167, 40.9333 Villamaria, Colombia, 5.0000, -75.5000 Shihe, China, 39.2527, 113.6757 Calulo, Angola, -10.0007, 14.9010 Galapa, Colombia, 10.8969, -74.8860 Cubulco, Guatemala, 15.1083, -90.6306 Mbabane, Eswatini, -26.3167, 31.1333 Borisoglebsk, Russia, 51.3667, 42.0833 Oyem, Gabon, 1.6000, 11.5736 Huatusco, Mexico, 19.1489, -96.9661 Castilla, Philippines, 12.9553, 123.8764 Piscataway, United States, 40.5467, -74.4636 Yala, Thailand, 6.5425, 101.2831 Laoang, Philippines, 12.5700, 125.0200 Oda, Ghana, 5.9267, -0.9858 San Rafael, United States, 37.9905, -122.5221 Ibitinga, Brazil, -21.7578, -48.8289 Kukarmunda, India, 21.5167, 74.1333 Kokawa, Japan, 34.2664, 135.3653 Fryazino, Russia, 55.9500, 38.0500 Viareggio, Italy, 43.8672, 10.2506 Berezovskiy, Russia, 56.9000, 60.8167 Trujillo, Honduras, 15.9179, -85.9530 Yongyang, China, 27.0900, 106.6892 Tigaon, Philippines, 13.6319, 123.4975 Matanao, Philippines, 6.7500, 125.2300 Taunton, United Kingdom, 51.0190, -3.1000 Aquiraz, Brazil, -3.9008, -38.3908 Dumraon, India, 25.5526, 84.1515 Meriden, United States, 41.5369, -72.7946 Elk, Poland, 53.8214, 22.3622 Euless, United States, 32.8508, -97.0800 Alcoy, Spain, 38.6983, -0.4736 Gukovo, Russia, 48.0500, 39.9167 Belogorsk, Russia, 50.9167, 128.4667 Altinozu, Turkey, 36.1000, 36.2300 Irvington, United States, 40.7243, -74.2317 Panruti, India, 11.7700, 79.5500 Lalmanirhat, Bangladesh, 25.9172, 89.4459 Ambanja, Madagascar, -13.6786, 48.4522 Ciudad Arce, El Salvador, 13.8333, -89.4333 Velampalaiyam, India, 11.1376, 77.3106 Laeken, Belgium, 50.8778, 4.3558 Gubat, Philippines, 12.9189, 124.1231 Souq Sebt Oulad Nemma, Morocco, 32.2948, -6.7007 Wallasey, United Kingdom, 53.4239, -3.0531 Yisuhe, China, 27.7736, 112.9558 Rosario, Philippines, 16.2300, 120.4800 San Vicente del Raspeig, Spain, 38.3964, -0.5253 Euskirchen, Germany, 50.6597, 6.7917 Chambery, France, 45.5700, 5.9118 Mizusawa, Japan, 39.1438, 141.1390 Unna, Germany, 51.5347, 7.6889 Tirukkoyilur, India, 11.9675, 79.2056 San Mateo Ixtatan, Guatemala, 15.8333, -91.4833 Parkent, Uzbekistan, 41.2944, 69.6764 Paracale, Philippines, 14.2797, 122.7869 Yame, Japan, 33.2119, 130.5578 Qoorlugud, Somalia, 8.5533, 46.2256 Razampeta, India, 14.1954, 79.1590 Kangan, Iran, 27.8392, 52.0608 Nedumangad, India, 8.6033, 77.0028 Zamosc, Poland, 50.7167, 23.2528 Pasaje, Ecuador, -3.3269, -79.8049 Petroupoli, Greece, 38.0333, 23.6833 San Mariano, Philippines, 16.9800, 122.0200 Union, United States, 40.6953, -74.2697 Parker, United States, 39.5084, -104.7753 Nioro, Mali, 15.1833, -9.5500 Abyek, Iran, 36.0411, 50.5306 Samut Sakhon, Thailand, 13.5486, 100.2775 Halesowen, United Kingdom, 52.4502, -2.0509 Mbalmayo, Cameroon, 3.5167, 11.5000 Jinxing, China, 37.9869, 106.2027 Clay, United States, 43.1808, -76.1954 Bracknell, United Kingdom, 51.4160, -0.7490 Malay, Philippines, 11.8997, 121.9094 Niort, France, 46.3258, -0.4606 Greifswald, Germany, 54.0833, 13.3833 Towada, Japan, 40.6127, 141.2059 Pirojpur, Bangladesh, 22.5796, 89.9752 Slutsk, Belarus, 53.0333, 27.5667 Hamburg, United States, 42.7394, -78.8581 Manhica, Mozambique, -25.4000, 32.8000 Horqueta, Paraguay, -23.3396, -57.0500 Floriano, Brazil, -6.7669, -43.0225 Prokhladnyy, Russia, 43.7500, 44.0333 Sao Borja, Brazil, -28.6606, -56.0044 Saravan, Iran, 27.3708, 62.3325 Kribi, Cameroon, 2.9350, 9.9100 Suifenhe, China, 44.4124, 131.1518 Consuelito, Dominican Republic, 18.6124, -69.2577 Baba Hassen, Algeria, 36.7000, 2.9667 Meskiana, Algeria, 35.6333, 7.6667 Juan-les-Pins, France, 43.5711, 7.1094 Afula, Israel, 32.6064, 35.2881 Nahariyya, Israel, 33.0058, 35.0989 Gunupur, India, 19.0800, 83.8200 Mehnajpur, India, 25.6722, 83.1181 Bayji, Iraq, 34.9292, 43.4931 Banane, Kenya, 0.5035, 38.6620 Kratie, Cambodia, 12.4881, 106.0188 Tyre, Lebanon, 33.2708, 35.1961 Faruka, Pakistan, 31.8853, 72.4153 Buqda Caqable, Somalia, 4.0601, 45.2577 Oodweyne, Somalia, 9.4092, 45.0640 Guigue, Venezuela, 10.0833, -67.7833 Viedma, Argentina, -40.8000, -63.0000 Barneveld, Netherlands, 52.1333, 5.5833 Obando, Philippines, 14.7083, 120.9375 San Marcos, Colombia, 8.6611, -75.1347 Civril, Turkey, 38.3014, 29.7386 Babolsar, Iran, 36.7006, 52.6500 Thatri, India, 33.1453, 75.7911 Legnano, Italy, 45.5958, 8.9060 Revere, United States, 42.4189, -71.0040 Stonecrest, United States, 33.6842, -84.1372 Ponnuru, India, 16.0667, 80.5667 Le Blanc-Mesnil, France, 48.9387, 2.4614 Langenfeld, Germany, 51.1167, 6.9500 Carrara, Italy, 44.0833, 10.1000 Ain Touta, Algeria, 35.3833, 5.9000 Arankhola, Bangladesh, 24.6928, 90.0806 Trang, Thailand, 7.5575, 99.6103 Sigaboy, Philippines, 6.6536, 126.0717 Chapel Hill, United States, 35.9271, -79.0391 Kathua, India, 32.3694, 75.5254 Merida, Spain, 38.9000, -6.3333 Ilog, Philippines, 10.0300, 122.7700 Ozalp, Turkey, 38.6583, 43.9894 Portimao, Portugal, 37.1333, -8.5333 Aranjuez, Spain, 40.0333, -3.6028 Huejotzingo, Mexico, 19.1619, -98.4064 Blainville, Canada, 45.6700, -73.8800 White Plains, United States, 41.0220, -73.7547 Fano, Italy, 43.8425, 13.0136 Andradina, Brazil, -20.8958, -51.3789 Dongcun, China, 38.2800, 111.6751 Ragay, Philippines, 13.8217, 122.7897 Gardena, United States, 33.8943, -118.3072 Palm Beach Gardens, United States, 26.8466, -80.1679 Uzice, Serbia, 43.8500, 19.8500 Lakhdaria, Algeria, 36.5622, 3.5944 Vinukonda, India, 16.0500, 79.7500 Suhareke, Kosovo, 42.3586, 20.8250 Huehuetoca, Mexico, 19.8342, -99.2033 Taunton, United States, 41.9036, -71.0943 Zvishavane, Zimbabwe, -20.3333, 30.0333 Vicosa do Ceara, Brazil, -3.5619, -41.0919 Gohadi, India, 26.4328, 78.4420 Kananya, Philippines, 11.1856, 124.5597 Khagaria, India, 25.5022, 86.4671 Hardenberg, Netherlands, 52.5758, 6.6194 Matera, Italy, 40.6667, 16.6000 Bougouni, Mali, 11.4177, -7.4832 Karamursel, Turkey, 40.6892, 29.6150 Huajiang, China, 25.6969, 105.5920 Sanyo-Onoda, Japan, 34.0031, 131.1819 Monterey Park, United States, 34.0497, -118.1326 Aguacatan, Guatemala, 15.3500, -91.3167 Sennan, Japan, 34.3628, 135.2761 Motril, Spain, 36.7500, -3.5167 Date, Japan, 37.8191, 140.5630 Pachora, India, 20.6700, 75.3500 Medellin, Philippines, 11.1286, 123.9622 Maimbung, Philippines, 5.9300, 121.0300 West Allis, United States, 43.0068, -88.0296 Lianzhuangcun, China, 37.1146, 115.7594 Coroata, Brazil, -4.1300, -44.1239 Betou, Congo (Brazzaville), 3.0594, 18.5142 Limoeiro do Norte, Brazil, -5.1458, -38.0978 Chelm, Poland, 51.1322, 23.4778 Tiptur, India, 13.2600, 76.4800 Altamira, Mexico, 22.3375, -97.8694 Gopichettipalaiyam, India, 11.4549, 77.4365 Revda, Russia, 56.8053, 59.9283 Givatayim, Israel, 32.0697, 34.8117 Zamora, Spain, 41.4989, -5.7556 Itanagar, India, 27.1000, 93.6200 Esfarayen, Iran, 37.0706, 57.5056 Santee, United States, 32.8554, -116.9851 Ban Bang Kaeo, Thailand, 13.0000, 38.0000 Pallini, Greece, 38.0000, 23.8833 Wangzhuang, China, 39.8003, 116.1500 Stralsund, Germany, 54.3092, 13.0819 North Miami, United States, 25.9008, -80.1686 Stryi, Ukraine, 49.2500, 23.8500 Blue Springs, United States, 39.0124, -94.2721 Yara, Cuba, 20.2767, -76.9469 Des Plaines, United States, 42.0345, -87.9008 Shimotsuke, Japan, 36.3872, 139.8421 Shirakawa, Japan, 37.1263, 140.2109 Los Andes, Chile, -32.8333, -70.6167 Ouinhri, Benin, 7.0000, 2.4500 Kokomo, United States, 40.4640, -86.1277 Moron, Cuba, 22.1108, -78.6278 Esperanza, Philippines, 8.6800, 125.6500 Jackson, United States, 40.0980, -74.3578 Uzunkopru, Turkey, 41.2667, 26.6833 Koga, Japan, 33.7289, 130.4700 As Saff, Egypt, 29.5647, 31.2811 Kesennuma, Japan, 38.9081, 141.5699 Garin, Argentina, -34.4167, -58.7500 Petaluma, United States, 38.2423, -122.6266 Joso, Japan, 36.0236, 139.9938 Alfonso, Philippines, 14.1379, 120.8552 Goppingen, Germany, 48.7025, 9.6528 Gaibandha, Bangladesh, 25.3290, 89.5415 Uniao dos Palmares, Brazil, -9.1628, -36.0319 Shoreline, United States, 47.7564, -122.3426 Hyuga, Japan, 32.4228, 131.6239 Dhone, India, 15.3960, 77.8720 Irosin, Philippines, 12.7050, 124.0319 Irati, Brazil, -25.4669, -50.6508 Gannan, China, 47.9117, 123.4978 San Francisco, Philippines, 10.6500, 124.3500 Trollhattan, Sweden, 58.2671, 12.3000 Neuilly-sur-Seine, France, 48.8881, 2.2686 Belebey, Russia, 54.1000, 54.1333 Rajgarh, India, 28.6400, 75.3800 Katerini, Greece, 40.2667, 22.5000 San Simon, Philippines, 14.9980, 120.7800 Dila, Ethiopia, 6.4083, 38.3083 Vyronas, Greece, 37.9617, 23.7533 Artemisa, Cuba, 22.8136, -82.7633 Chalkida, Greece, 38.4625, 23.5950 Mansalay, Philippines, 12.5204, 121.4385 Damghan, Iran, 36.1642, 54.3408 Chichibu, Japan, 35.9918, 139.0855 Umm al Qaywayn, United Arab Emirates, 25.5533, 55.5475 Antigua Guatemala, Guatemala, 14.5667, -90.7333 Panna, India, 24.2700, 80.1700 Barking, United Kingdom, 51.5400, 0.0800 Medford, United States, 42.4234, -71.1087 Chivacoa, Venezuela, 10.1600, -68.9097 Constanza, Dominican Republic, 18.9100, -70.7500 Saint-Louis du Sud, Haiti, 18.2624, -73.5460 Yevlax, Azerbaijan, 40.6172, 47.1500 El Palomar, Argentina, -34.6167, -58.5833 Tahara, Japan, 34.6688, 137.2809 Taylorsville, United States, 40.6569, -111.9493 Upi, Philippines, 7.0106, 124.1629 Metapan, El Salvador, 14.3314, -89.4428 Camacupa, Angola, -12.0256, 17.4686 Wylie, United States, 33.0362, -96.5161 Florida, Colombia, 3.3275, -76.2386 Jiguani, Cuba, 20.3731, -76.4222 Huauchinango, Mexico, 20.1767, -98.0528 Buderim, Australia, -26.6847, 153.0532 Anzio, Italy, 41.4472, 12.6283 Nirgua, Venezuela, 10.0833, -68.6667 Santa Maria Chiquimula, Guatemala, 15.0292, -91.3294 Cruz Alta, Brazil, -28.6386, -53.6064 Cerro de Pasco, Peru, -10.6864, -76.2625 Xikeng, China, 24.0505, 116.8538 Lac-Brome, Canada, 45.2167, -72.5167 Cupertino, United States, 37.3168, -122.0466 Sutton, United Kingdom, 51.3656, -0.1963 Andoharanofotsy, Madagascar, -18.9851, 47.5364 Gattaran, Philippines, 18.0611, 121.6453 Carvajal, Venezuela, 9.3300, -70.5767 Parobe, Brazil, -29.6286, -50.8347 Sidi ech Chahmi, Algeria, 35.6667, -0.5167 Zahirabad, India, 17.6814, 77.6074 Roxas, Philippines, 12.5800, 121.5000 Wani, India, 20.0556, 78.9533 Binnaguri, India, 26.7641, 89.0558 Merthyr Tudful, United Kingdom, 51.7430, -3.3780 Ban Rangsit, Thailand, 14.0167, 100.7500 Kaposvar, Hungary, 46.3667, 17.7833 Canlaon, Philippines, 10.3800, 123.2000 Frankfurt (Oder), Germany, 52.3419, 14.5517 Chistopol, Russia, 55.3647, 50.6261 Beccar, Argentina, -34.4667, -58.5167 Menzel Bourguiba, Tunisia, 37.1500, 9.7833 Upleta, India, 21.7300, 70.2800 El Salvador, Philippines, 8.5700, 124.5200 Narasapur, India, 16.4361, 81.7016 Xanthi, Greece, 41.1333, 24.8833 Chikuma, Japan, 36.5339, 138.1200 Zarechnyy, Russia, 53.2000, 45.1667 Barranca, Peru, -10.7541, -77.7610 Krusevac, Serbia, 43.5833, 21.3267 Pedro Leopoldo, Brazil, -19.6181, -44.0431 Jaguariuna, Brazil, -22.6800, -46.9900 Calatagan, Philippines, 13.8322, 120.6322 Baganga, Philippines, 7.5752, 126.5585 Faenza, Italy, 44.2856, 11.8833 Sandnes, Norway, 58.8500, 5.7333 Viseu, Brazil, -1.1969, -46.1400 Jovellanos, Cuba, 22.8106, -81.1981 Dosso, Niger, 13.0505, 3.2081 Baguineda, Mali, 12.6129, -7.7734 Koja, Japan, 26.3344, 127.8057 Kasungu, Malawi, -13.0364, 33.4822 Sonabedha, India, 18.7300, 82.8300 Pasrur, Pakistan, 32.2637, 74.6628 Caldiran, Turkey, 39.1419, 43.9139 Wuyang, China, 27.0570, 108.3959 Raharpur, Bangladesh, 24.8194, 88.3250 Edgware, United Kingdom, 51.6185, -0.2729 Xinfeng, Taiwan, 24.9167, 121.0000 Alta Floresta, Brazil, -9.8758, -56.0858 Tenkodogo, Burkina Faso, 11.7833, -0.3667 Kas, Turkey, 36.2020, 29.6380 Mpondwe, Uganda, 0.0400, 29.7250 Sayama, Japan, 34.5036, 135.5557 Frutal, Brazil, -20.0250, -48.9408 Cambundi Catembo, Angola, -10.0756, 17.5569 Piparia, India, 22.7570, 78.3550 Sarcelles, France, 48.9956, 2.3808 Tonsberg, Norway, 59.2981, 10.4236 Mehdya, Morocco, 34.2597, -6.6500 San Luis, Philippines, 15.0400, 120.7919 The Hammocks, United States, 25.6700, -80.4482 Caltanissetta, Italy, 37.4915, 14.0624 Gllogovc, Kosovo, 42.6283, 20.8939 Una, India, 20.8200, 71.0300 Balancan, Mexico, 17.8000, -91.5333 Tarim, Yemen, 16.0500, 49.0000 Ibaan, Philippines, 13.8176, 121.1330 Frejus, France, 43.4330, 6.7370 Sardhana, India, 29.1450, 77.6100 Sao Gabriel, Brazil, -30.3358, -54.3200 Hakkari, Turkey, 37.5770, 43.7390 Abington, United States, 40.1108, -75.1146 Mexquitic de Carmona, Mexico, 22.2667, -101.1167 Osakasayama, Japan, 34.5000, 135.5500 Hastinapur, India, 29.1700, 78.0200 Crotone, Italy, 39.0833, 17.1167 San Pedro, Argentina, -24.2196, -64.8700 Tianningcun, China, 30.8938, 120.8009 Liannong, China, 31.0107, 121.0393 Liantangcun, China, 22.9517, 112.4597 Benevento, Italy, 41.1256, 14.7811 Qaskeleng, Kazakhstan, 43.2000, 76.6200 Margate, United States, 26.2466, -80.2119 Trairi, Brazil, -3.2778, -39.2689 Przemysl, Poland, 49.7833, 22.7667 Serres, Greece, 41.0833, 23.5500 Ma'erkang, China, 31.9057, 102.2065 Heerhugowaard, Netherlands, 52.6667, 4.8333 San Fernando, Chile, -34.5833, -70.9833 Carson City, United States, 39.1511, -119.7476 Chaiyaphum, Thailand, 15.8056, 102.0311 Sandila, India, 27.0800, 80.5200 Pebane, Mozambique, -17.2642, 38.1350 Hoboken, United States, 40.7452, -74.0281 Zengcun, China, 38.2451, 114.7367 Zengcun, China, 38.2461, 114.7394 Madison, United States, 34.7114, -86.7626 Acerra, Italy, 40.9500, 14.3667 Ogori, Japan, 33.3964, 130.5556 Punta Alta, Argentina, -38.8800, -62.0750 Palompon, Philippines, 11.0500, 124.3800 Tiruvalur, India, 10.7730, 79.6370 Sucun, China, 31.0554, 118.1057 Murakami, Japan, 38.2240, 139.4800 St. Clair Shores, United States, 42.4925, -82.8961 Capenda Camulemba, Angola, -9.4233, 18.4328 Ishikari, Japan, 43.1667, 141.3167 Antsalova, Madagascar, -18.6764, 44.6227 Lambayeque, Peru, -6.7000, -79.9000 Doetinchem, Netherlands, 51.9656, 6.2889 Pursat, Cambodia, 12.5337, 103.9167 Mouscron, Belgium, 50.7333, 3.2167 Sillod, India, 20.3000, 75.6500 Ruislip, United Kingdom, 51.5760, -0.4330 Mielec, Poland, 50.2833, 21.4333 Calarasi, Romania, 44.2000, 27.3333 Myaungmya, Burma, 16.6036, 94.9289 Lorient, France, 47.7500, -3.3600 Zaraza, Venezuela, 9.3394, -65.3167 St. Peters, United States, 38.7825, -90.6061 Savona, Italy, 44.3081, 8.4811 Naval, Philippines, 11.5800, 124.4500 Barotac Nuevo, Philippines, 10.9000, 122.7000 Midwest City, United States, 35.4630, -97.3710 Temascalcingo, Mexico, 19.9147, -100.0036 Samana, Dominican Republic, 19.2053, -69.3364 Chivilcoy, Argentina, -34.9000, -60.0167 Villejuif, France, 48.7919, 2.3636 Kitahiroshima, Japan, 42.9833, 141.5667 Mulbagal, India, 13.1635, 78.3935 North Vancouver, Canada, 49.3202, -123.0699 Rouissat, Algeria, 31.9167, 5.3500 Avila, Spain, 40.6500, -4.6833 Beitbridge, Zimbabwe, -22.2167, 30.0000 Bakwa-Kalonji, Congo (Kinshasa), -4.3500, 20.7200 Lampang, Thailand, 18.3000, 99.5000 Dapaong, Togo, 10.8667, 0.2000 Felgueiras, Portugal, 41.3667, -8.2000 Streatham, United Kingdom, 51.4279, -0.1235 Timargara, Pakistan, 34.8278, 71.8417 Severn, United States, 39.1355, -76.6956 Sao Sebastiao, Brazil, -23.8040, -45.4051 Lake Havasu City, United States, 34.5006, -114.3113 Ambahikily, Madagascar, -21.6050, 43.6748 Chibuto, Mozambique, -24.6867, 33.5306 Lop Buri, Thailand, 14.8000, 100.6269 Pradera, Colombia, 3.4167, -76.1667 Masantol, Philippines, 14.9000, 120.7200 Tczew, Poland, 54.0875, 18.7972 Lenexa, United States, 38.9609, -94.8018 Chornomorsk, Ukraine, 46.0000, 18.0000 Santa Isabel, Brazil, -23.3156, -46.2214 Orland Park, United States, 41.6075, -87.8619 Kawthoung, Burma, 9.9833, 98.5500 Kumertau, Russia, 52.7667, 55.7833 Hunsur, India, 12.3036, 76.2927 Salsk, Russia, 46.4833, 41.5333 Panskura, India, 22.4170, 87.7000 Nanjakkad, India, 9.2069, 76.6319 Kan'onjicho, Japan, 34.1272, 133.6614 Hameln, Germany, 52.1000, 9.3667 New Corella, Philippines, 7.5866, 125.8237 Galatsi, Greece, 38.0167, 23.7500 Zempoala, Mexico, 19.9153, -98.6689 Kolondieba, Mali, 11.0883, -6.8925 Allanmyo, Burma, 19.3783, 95.2279 Cogan, Philippines, 10.5800, 123.9700 Nausori, Fiji, -18.0244, 178.5454 Royal Oak, United States, 42.5084, -83.1539 Glew, Argentina, -34.8833, -58.3833 Rampur Hat, India, 24.1700, 87.7800 Dumanjog, Philippines, 10.0500, 123.4800 Asingan, Philippines, 16.0023, 120.6695 Suileng, China, 47.2419, 127.1161 Weymouth, United States, 42.1981, -70.9466 Marano di Napoli, Italy, 40.9000, 14.1833 Orito, Colombia, 0.6661, -76.8708 Xiezhou, China, 34.9124, 110.8517 Royal Tunbridge Wells, United Kingdom, 51.1320, 0.2630 Bowie, United States, 38.9549, -76.7406 Zivinice, Bosnia and Herzegovina, 44.4493, 18.6498 Decatur, United States, 34.5731, -86.9905 Zarand, Iran, 30.8108, 56.5658 El Attaf, Algeria, 36.2167, 1.6667 Ouezzane, Morocco, 34.8000, -5.5833 Hervey Bay, Australia, -25.2900, 152.8400 Biba, Egypt, 28.9218, 30.9844 Bel Air South, United States, 39.5022, -76.3113 Bellevue, France, 48.8710, 2.3850 Khandala, India, 18.7481, 73.4072 Lonavale, India, 18.7481, 73.4072 Towson, United States, 39.3944, -76.6190 Kosai, Japan, 34.7184, 137.5316 Dompu, Indonesia, -8.5364, 118.4633 General Pico, Argentina, -35.6667, -63.7333 Anahuac, Mexico, 22.1833, -97.9333 Mogoditshane, Botswana, -24.6333, 25.8667 Grand-Popo, Benin, 6.2833, 1.8333 Stalowa Wola, Poland, 50.5667, 22.0500 Gengzhuangqiaocun, China, 37.4453, 114.9804 Jerez de Garcia Salinas, Mexico, 22.6481, -102.9903 Yanguancun, China, 30.4541, 120.5545 Camajuani, Cuba, 22.4678, -79.7239 New Plymouth, New Zealand, -39.0578, 174.0742 Tomaszow Mazowiecki, Poland, 51.5167, 20.0167 Casa Grande, United States, 32.9069, -111.7624 Adigrat, Ethiopia, 14.2667, 39.4500 Coconut Creek, United States, 26.2803, -80.1842 Taquara, Brazil, -29.6506, -50.7806 Bilimora, India, 20.7500, 72.9500 Kothapet, India, 19.3333, 79.4833 Maduraivayal, India, 13.0631, 80.1719 Togane, Japan, 35.5599, 140.3661 Sicuani, Peru, -14.2720, -71.2290 Lucan, Ireland, 53.3592, -6.4389 Diriamba, Nicaragua, 11.8500, -86.2333 Taliwang, Indonesia, -8.7336, 116.8667 Milagros, Philippines, 12.2192, 123.5089 Santa Maria, Philippines, 6.5500, 125.4700 Palasa, India, 18.7731, 84.4078 Tokoname, Japan, 34.8865, 136.8323 Ejmiatsin, Armenia, 40.1728, 44.2925 Wiwili de Jinotega, Nicaragua, 13.6200, -85.8182 Wiwili, Nicaragua, 13.6167, -85.8333 Guarabira, Brazil, -6.8550, -35.4900 Humaita, Brazil, -7.5061, -63.0208 Santiago Tuxtla, Mexico, 18.4653, -95.3025 Tanauan, Philippines, 11.1200, 125.0200 Kettering, United States, 39.6956, -84.1494 Meerbusch, Germany, 51.2667, 6.6667 Chintalapalli, India, 18.3310, 79.6740 Dzerzhinskiy, Russia, 55.6333, 37.8500 Maisons-Alfort, France, 48.8058, 2.4378 Baden-Baden, Germany, 48.7628, 8.2408 Lohardaga, India, 23.4331, 84.6799 Buluan, Philippines, 6.7154, 124.7854 Sinop, Turkey, 42.0267, 35.1511 Cuvelai, Angola, -15.6667, 15.8000 Ponte Nova, Brazil, -20.4164, -42.9086 Richards Bay, South Africa, -28.7694, 32.0594 Bezerros, Brazil, -8.2333, -35.7500 Foumbot, Cameroon, 5.5000, 10.6333 Antsinanantsena, Madagascar, -18.8360, 47.5564 Huaniu, China, 34.5478, 105.8650 Qianwu, China, 22.1346, 113.2208 Nacaome, Honduras, 13.5325, -87.4881 Vacaria, Brazil, -28.5119, -50.9339 Bebington, United Kingdom, 53.3500, -3.0030 Herriman, United States, 40.4899, -112.0170 Molfetta, Italy, 41.2000, 16.6000 Eldorado, Argentina, -26.4000, -54.6333 Mali, China, 23.1262, 104.7409 Roermond, Netherlands, 51.1933, 5.9872 Coruripe, Brazil, -10.1256, -36.1756 Macherla, India, 16.4800, 79.4300 Boac, Philippines, 13.4500, 121.8300 Targovishte, Bulgaria, 43.2500, 26.5830 Nova Esperanca, Angola, -6.7333, 15.9000 Icara, Brazil, -28.7133, -49.3000 Kandukur, India, 15.2167, 79.9042 Saint-Hyacinthe, Canada, 45.6167, -72.9500 Keonjhargarh, India, 21.6300, 85.5800 Brookhaven, United States, 33.8743, -84.3314 Riosucio, Colombia, 7.4406, -77.1189 Villa Hayes, Paraguay, -25.0900, -57.5300 Aldershot, United Kingdom, 51.2483, -0.7614 Cupang, Philippines, 14.4315, 121.0486 Daqiao, China, 30.7450, 120.8564 Alangalang, Philippines, 11.2061, 124.8478 Samannud, Egypt, 30.9622, 31.2425 Bulungu, Congo (Kinshasa), -4.5500, 18.6000 Uson, Philippines, 12.2253, 123.7834 Hele, China, 18.9058, 110.4737 Boufarik, Algeria, 36.5706, 2.9108 Ping'an, China, 36.4969, 102.1247 Kollegal, India, 12.1539, 77.1010 Sarapiqui, Costa Rica, 10.4853, -83.9362 Cosamaloapan, Mexico, 18.3676, -95.7986 Iskitim, Russia, 54.6400, 83.3061 Granadilla de Abona, Spain, 28.1167, -16.5667 Taroudannt, Morocco, 30.4710, -8.8806 Cascavel, Brazil, -4.1308, -38.2358 Biga, Turkey, 40.2281, 27.2422 Pavlovo, Russia, 55.9653, 43.0711 Unjha, India, 23.8000, 72.4000 Oak Lawn, United States, 41.7139, -87.7528 Uki, Japan, 32.6478, 130.6842 Nonoichi, Japan, 36.5194, 136.6098 Lacey, United States, 47.0462, -122.7933 Moramanga, Madagascar, -18.9480, 48.2297 Lingen, Germany, 52.5231, 7.3231 Borujen, Iran, 31.9719, 51.2917 Devrek, Turkey, 41.2333, 31.9667 Maun, Botswana, -19.9833, 23.4167 Shali, Russia, 43.1500, 45.9000 Mafeteng, Lesotho, -29.8167, 27.2500 Bail-Hongal, India, 15.8137, 74.8589 Jasaan, Philippines, 8.6500, 124.7500 Aleksandrov, Russia, 56.4000, 38.7333 Dehdasht, Iran, 30.7964, 50.5658 Semara, Morocco, 26.7394, -11.6703 Alvarado, Mexico, 18.7811, -95.7572 Colmenar Viejo, Spain, 40.6589, -3.7658 Minokamo, Japan, 35.4402, 137.0157 Ipele, Nigeria, 7.1333, 5.6667 Bura, Somalia, 3.1722, 42.1411 Bartlett, United States, 35.2337, -89.8195 Zushi, Japan, 35.2833, 139.5833 Talagante, Chile, -33.6667, -70.8667 Ribnita, Moldova, 47.7664, 29.0006 Nasirabad, India, 26.3000, 74.7300 Cerignola, Italy, 41.2667, 15.9000 Rodos, Greece, 36.4412, 28.2225 Cuemba, Angola, -12.1500, 18.0833 Tezonapa, Mexico, 18.6000, -96.6833 Cachoeiras de Macacu, Brazil, -22.4628, -42.6528 Machang, Malaysia, 5.7641, 102.2141 Huaixiangcun, China, 22.4817, 111.0542 San Luis, Dominican Republic, 18.5473, -69.8019 Kedzierzyn-Kozle, Poland, 50.3500, 18.2000 Puerto Boyaca, Colombia, 6.0000, -74.4167 Bina, Azerbaijan, 40.4500, 50.0833 Azzaba, Algeria, 36.7333, 7.1000 Mora, Costa Rica, 10.0088, -84.0216 Hagonoy, Philippines, 6.6800, 125.3000 Xam Nua, Laos, 20.4150, 104.0480 Limbang, Malaysia, 4.7500, 115.0000 Gudalur, India, 11.5014, 76.4916 Dina, Pakistan, 33.0283, 73.6011 Clamart, France, 48.8014, 2.2628 Ipira, Brazil, -12.1578, -39.7369 Miragoane, Haiti, 18.4411, -73.0883 Samalkot, India, 17.0531, 82.1695 Caacupe, Paraguay, -25.3870, -57.1400 Karimganj, India, 24.8700, 92.3500 Acambay, Mexico, 19.9539, -99.8431 Santa Rosa, Ecuador, -3.4522, -79.9617 Pinagkaisahan, Philippines, 14.5229, 121.0555 Bobbili, India, 18.5667, 83.3667 Bebandem, Indonesia, -8.4046, 115.5395 Fussa, Japan, 35.7333, 139.3333 Bowmanville, Canada, 43.9125, -78.6871 Duzici, Turkey, 37.2431, 36.4567 Kalna, India, 23.2200, 88.3700 Sattenapalle, India, 16.3962, 80.1497 Tulcan, Ecuador, 0.8117, -77.7186 Lagonoy, Philippines, 13.7353, 123.5208 Gorlitz, Germany, 51.1528, 14.9872 Sankt Augustin, Germany, 50.7700, 7.1867 Narbonne, France, 43.1836, 3.0042 Highland, United States, 34.1113, -117.1650 Basey, Philippines, 11.2817, 125.0683 Hassa, Turkey, 36.7994, 36.5178 Kudamatsu, Japan, 34.0150, 131.8703 Meaux, France, 48.9603, 2.8883 Hod HaSharon, Israel, 32.1500, 34.8833 Pirapora, Brazil, -17.3450, -44.9419 Vrindavan, India, 27.5800, 77.7000 Chini, China, 23.3901, 113.0736 Diglipur, India, 13.2667, 93.0000 Acambaro, Mexico, 20.0361, -100.7314 Stolberg, Germany, 50.7667, 6.2333 Khash, Iran, 28.2200, 61.2114 Den Helder, Netherlands, 52.9333, 4.7500 Forest, Belgium, 50.8131, 4.3247 Pangantocan, Philippines, 7.8331, 124.8294 Taybad, Iran, 34.7408, 60.7792 Mafra, Brazil, -26.1114, -49.8053 Ar Riqqah, Kuwait, 29.1489, 48.1057 San Pedro Sacatepequez, Guatemala, 14.6833, -90.6333 Asbest, Russia, 57.0000, 61.4667 Ramon, Philippines, 16.7800, 121.5300 Saruhanli, Turkey, 38.7342, 27.5658 Sibay, Russia, 52.7000, 58.6500 Ixtahuacan, Guatemala, 15.4167, -91.7667 Limoeiro, Brazil, -7.8750, -35.4500 Meleuz, Russia, 52.9500, 55.9333 San Carlos del Zulia, Venezuela, 9.0000, -71.9333 Porto Feliz, Brazil, -23.2150, -47.5239 Naugaon Sadat, India, 28.9833, 78.4167 Budennovsk, Russia, 44.7833, 44.1667 Colomba, Guatemala, 14.7167, -91.7333 Sendhwa, India, 21.6847, 75.0953 Athieme, Benin, 6.5833, 1.6667 El Cerrito, Colombia, 3.6667, -76.1667 Kannapolis, United States, 35.4764, -80.6408 Bartolome Maso, Cuba, 20.1686, -76.9428 Fountainebleau, United States, 25.7723, -80.3460 Moyobamba, Peru, -6.0333, -76.9667 Bianyang, China, 25.6194, 106.5350 Chekfa, Algeria, 36.7667, 5.9667 Tiwi, Philippines, 13.4585, 123.6805 Talegaon Dabhade, India, 18.7200, 73.6800 Tama, Japan, 34.4886, 133.9486 Bluefields, Nicaragua, 12.0000, -83.7500 Rafael Calzada, Argentina, -34.7833, -58.3667 Wote, Kenya, -1.7808, 37.6288 Rolim de Moura, Brazil, -11.7254, -61.7778 Mocoa, Colombia, 1.1500, -76.6475 Boudouaou, Algeria, 36.7300, 3.4100 Villarrica, Paraguay, -25.7500, -56.4333 Binalonan, Philippines, 16.0500, 120.6000 Longxing, China, 35.6091, 111.2304 Fountain Valley, United States, 33.7105, -117.9514 Sucat, Philippines, 14.4600, 121.0500 Placer, Philippines, 11.8689, 123.9167 Pacos de Ferreira, Portugal, 41.2833, -8.3833 Bentonville, United States, 36.3547, -94.2305 Tekkekoy, Turkey, 41.2125, 36.4569 Rosh Ha`Ayin, Israel, 32.0833, 34.9500 Bradenton, United States, 27.4901, -82.5757 Korkuteli, Turkey, 37.0667, 30.2000 Smyrna, United States, 33.8633, -84.5168 Pulheim, Germany, 51.0000, 6.8000 Lian, Philippines, 14.0300, 120.6500 Narammala, Sri Lanka, 7.4337, 80.1971 Rio Bonito, Brazil, -22.7078, -42.6258 Libungan, Philippines, 7.2500, 124.5200 Amarante, Portugal, 41.2728, -8.0825 Magsaysay, Philippines, 6.7700, 125.1800 Bihac, Bosnia and Herzegovina, 44.8147, 15.8692 Pelengana, Mali, 13.4275, -6.2219 Esquipulas, Guatemala, 14.5667, -89.3500 Kut-e `Abdollah, Iran, 31.2447, 48.6594 Poonamallee, India, 13.0465, 80.1100 Sarikei, Malaysia, 2.1167, 111.5167 Kettering, United Kingdom, 52.3931, -0.7229 Sarasota, United States, 27.3387, -82.5432 Gangarampur, India, 25.4000, 88.5200 Rahovec, Kosovo, 42.3994, 20.6547 Oosterhout, Netherlands, 51.6431, 4.8569 Hohoe, Ghana, 7.1490, 0.4746 Apopka, United States, 28.7015, -81.5316 Khartsyzk, Ukraine, 48.0428, 38.1425 Dongola, Sudan, 19.1769, 30.4839 Mukocho, Japan, 34.9486, 135.6983 Eschweiler, Germany, 50.8167, 6.2833 Khlong Luang, Thailand, 14.0647, 100.6458 Tilakpur, Nepal, 28.5278, 81.1189 Kotlas, Russia, 61.2500, 46.6333 Moncalieri, Italy, 45.0005, 7.6848 Castelo Branco, Portugal, 39.8228, -7.4931 Mizuho, Japan, 35.3918, 136.6909 Diffun, Philippines, 16.5936, 121.5025 Cuizhuangzi, China, 38.3237, 116.4460 Essaouira, Morocco, 31.5131, -9.7697 Parsippany-Troy Hills, United States, 40.8601, -74.4237 Granada, Colombia, 3.5472, -73.7086 Mandapeta, India, 16.8700, 81.9300 San Andres Villa Seca, Guatemala, 14.5667, -91.5833 Tirur, India, 10.9000, 75.9200 Mendi, Papua New Guinea, -6.1478, 143.6572 Takizawa, Japan, 39.7347, 141.0771 Kimilili, Kenya, 0.7877, 34.7156 Uman, Mexico, 20.8833, -89.7500 Pithoragarh, India, 29.5800, 80.2200 Kengri, India, 12.9122, 77.4827 Mikhaylovka, Russia, 50.0667, 43.2500 Veszprem, Hungary, 47.1000, 17.9167 Huaquillas, Ecuador, -3.4814, -80.2432 Tit Mellil, Morocco, 33.5533, -7.4822 Intibuca, Honduras, 14.3121, -88.1781 Pinto, Spain, 40.2500, -3.7000 Langtang, China, 27.9636, 111.1100 Ropar, India, 30.9664, 76.5331 Oke-Mesi, Nigeria, 7.8167, 4.9167 Izberbash, Russia, 42.5633, 47.8636 Bad Homburg, Germany, 50.2167, 8.6000 Karditsa, Greece, 39.3667, 21.9167 National City, United States, 32.6654, -117.0983 Abu Za`bal, Egypt, 30.2495, 31.3545 Chiapa de Corzo, Mexico, 16.7069, -93.0139 Lower Bicutan, Philippines, 14.5053, 121.0654 General Tinio, Philippines, 15.3500, 121.0500 Waiblingen, Germany, 48.8303, 9.3169 Takaishi, Japan, 34.5167, 135.4500 Acul du Nord, Haiti, 19.6807, -72.3198 Beauvais, France, 49.4303, 2.0952 Beruniy, Uzbekistan, 41.6833, 60.7500 DeSoto, United States, 32.5992, -96.8633 Ajodhya, India, 26.7992, 82.2044 Berwyn, United States, 41.8433, -87.7909 Poblacion, Philippines, 10.4700, 123.9700 Bungoma, Kenya, 0.5666, 34.5666 Incirliova, Turkey, 37.8547, 27.7236 Longmen, China, 35.5489, 110.5153 Sidi Bennour, Morocco, 32.6500, -8.4333 Fier, Albania, 40.7167, 19.5500 Khan Shaykhun, Syria, 35.4421, 36.6509 Changling, China, 44.2700, 123.9900 Belampalli, India, 19.0756, 79.4881 Kharar, India, 30.7400, 76.6500 Zarrin Shahr, Iran, 32.3889, 51.3733 Bambang, Philippines, 16.3872, 121.1075 Biswan, India, 27.4933, 80.9964 Tsevie, Togo, 6.4333, 1.2167 Rengo, Chile, -34.4167, -70.8667 Rzhev, Russia, 56.2500, 34.3167 Gulariya, Nepal, 28.2056, 81.3472 Langenhagen, Germany, 52.4394, 9.7400 Cuneo, Italy, 44.3833, 7.5500 New Brunswick, United States, 40.4870, -74.4450 Umm Ruwaba, Sudan, 12.9058, 31.2156 Kannamangalam, India, 10.0500, 77.0500 Casa Nova, Brazil, -9.1619, -40.9708 Lesosibirsk, Russia, 58.2358, 92.4828 Azul, Argentina, -36.7833, -59.8500 Krasnotur'insk, Russia, 59.7733, 60.1853 Atchampeta, India, 15.5412, 78.9503 Oulad Yaich, Algeria, 36.5039, 2.8619 Nogata, Japan, 33.7442, 130.7297 Asadabad, Iran, 34.7825, 48.1219 Paombong, Philippines, 14.8311, 120.7892 Apple Valley, United States, 44.7457, -93.2004 Bedzin, Poland, 50.3333, 19.1167 Hilden, Germany, 51.1714, 6.9394 Barabai, Indonesia, -2.5833, 115.3833 Nawucun, China, 21.9856, 110.5877 Jambe, Indonesia, -6.3160, 106.4853 Mount Prospect, United States, 42.0641, -87.9375 Siliancun, China, 22.7153, 111.2846 Hashtgerd, Iran, 35.9628, 50.6794 Kandi, India, 23.9500, 88.0300 Nueva Loja, Ecuador, 0.0847, -76.8828 Nordhorn, Germany, 52.4319, 7.0678 Hoogeveen, Netherlands, 52.7167, 6.4667 Opava, Czechia, 49.9381, 17.9044 Nyenga, Uganda, 0.3800, 33.1500 Debre Tabor, Ethiopia, 11.8500, 38.0167 Yongqing, China, 34.7522, 106.1312 Iba, Philippines, 15.3300, 119.9800 Mulanay, Philippines, 13.5222, 122.4042 Kuala Kapuas, Indonesia, -3.0013, 114.3916 Trapani, Italy, 38.0175, 12.5150 Ha Giang, Vietnam, 22.8333, 104.9833 Urbiztondo, Philippines, 15.8227, 120.3295 Saravena, Colombia, 6.9556, -71.8722 Nuevo Casas Grandes, Mexico, 30.4167, -107.9167 Arcadia, United States, 34.1342, -118.0373 Buthidaung, Burma, 20.8667, 92.5333 Wellington, South Africa, -33.6333, 18.9833 Southaven, United States, 34.9514, -89.9786 Kidderminster, United Kingdom, 52.3885, -2.2490 Shendi, Sudan, 16.6805, 33.4200 Sankt Polten, Austria, 48.2000, 15.6167 Agrigento, Italy, 37.3107, 13.5766 San Agustin Acasaguastlan, Guatemala, 14.9500, -89.9667 Barwani, India, 22.0300, 74.9000 PortoAlexandre, Angola, -15.8000, 11.8500 Barrow in Furness, United Kingdom, 54.1108, -3.2261 Batac, Philippines, 18.0554, 120.5649 Villarrica, Chile, -39.2667, -72.2167 Videira, Brazil, -27.0078, -51.1519 Qiryat Ata, Israel, 32.8000, 35.1000 Monte Alegre, Brazil, -2.0078, -54.0689 Vratsa, Bulgaria, 43.2121, 23.5444 Nansan, China, 23.7784, 98.8253 Tonekabon, Iran, 36.8153, 50.8711 Biala Podlaska, Poland, 52.0333, 23.1167 Xinqing, China, 48.2363, 129.5059 Ksar Hellal, Tunisia, 35.6429, 10.8911 Monte Mor, Brazil, -22.9467, -47.3150 Tatalon, Philippines, 14.6242, 121.0153 Sacapulas, Guatemala, 15.2892, -91.0892 Ovar, Portugal, 40.8597, -8.6253 Asturias, Philippines, 10.5679, 123.7172 Tigard, United States, 45.4237, -122.7845 Toki, Japan, 35.4192, 137.1832 Erumaippatti, India, 11.5800, 77.8500 Hyeres, France, 43.1199, 6.1316 Khorramdarreh, Iran, 36.2061, 49.2003 Union, United States, 42.1258, -76.0329 Thermi, Greece, 40.5500, 23.0167 Yamasa, Dominican Republic, 18.7667, -70.0167 Mercedes, Philippines, 14.1093, 123.0109 Winneba, Ghana, 5.3500, -0.6333 Harpanahalli, India, 14.7877, 75.9886 Crewe, United Kingdom, 53.0990, -2.4400 Buta, Congo (Kinshasa), 2.8000, 24.7333 Farroupilha, Brazil, -29.2250, -51.3478 Umm el Fahm, Israel, 32.5194, 35.1536 Djemmal, Tunisia, 35.6400, 10.7600 Meyerton, South Africa, -26.5583, 28.0197 Periya Semur, India, 11.3700, 77.6908 Perth Amboy, United States, 40.5202, -74.2724 Bobigny, France, 48.9106, 2.4397 Linares, Spain, 38.0833, -3.6333 Wangguanzhuang Sicun, China, 37.0183, 115.5773 Rubizhne, Ukraine, 49.0100, 38.3714 Madhupur, India, 24.2600, 86.6500 Foligno, Italy, 42.9561, 12.7033 Rijswijk, Netherlands, 52.0456, 4.3300 Porirua, New Zealand, -41.1333, 174.8500 Pombal, Portugal, 39.9161, -8.6281 Chalil, India, 11.7519, 75.5959 Chicopee, United States, 42.1764, -72.5719 South Whittier, United States, 33.9336, -118.0312 Verviers, Belgium, 50.5835, 5.8641 Challakere, India, 14.3120, 76.6510 Wuhuang, China, 29.9649, 104.7883 Biel/Bienne, Switzerland, 47.1372, 7.2472 Zalaegerszeg, Hungary, 46.8392, 16.8511 Puthiyangadi, India, 12.0189, 75.2588 West Haven, United States, 41.2739, -72.9672 Lazarevac, Serbia, 44.3828, 20.2583 Vranje, Serbia, 42.5542, 21.8972 Ibipora, Brazil, -23.2692, -51.0481 Santa Cruz, Costa Rica, 10.2358, -85.6408 Mangrol, India, 21.1200, 70.1200 Shijonawate, Japan, 34.7400, 135.6394 Novohrad-Volynskyi, Ukraine, 50.5833, 27.6333 Chonthrhu, India, 32.4865, 75.9941 Manapla, Philippines, 10.9580, 123.1230 Bhimunipatnam, India, 17.8846, 83.4393 Zgierz, Poland, 51.8500, 19.4167 Sorgun, Turkey, 39.8144, 35.1903 Radhanpur, India, 23.8300, 71.6000 Schweinfurt, Germany, 50.0500, 10.2333 Eqbaliyeh, Iran, 36.2306, 49.9225 Smyrna, United States, 35.9687, -86.5264 Rangewala, Pakistan, 30.8222, 74.2611 Ucuma, Angola, -12.8500, 15.0667 Falakata, India, 26.5300, 89.2000 Volsk, Russia, 52.0500, 47.3833 Uniao da Vitoria, Brazil, -26.2300, -51.0858 Chino, Japan, 35.9955, 138.1588 Canoinhas, Brazil, -26.1769, -50.3900 Touba, Côte d’Ivoire, 8.2833, -7.6833 Belorechensk, Russia, 44.7686, 39.8733 Tinley Park, United States, 41.5670, -87.8049 Agbangnizoun, Benin, 7.0667, 1.9667 Elenga, Bangladesh, 24.3386, 89.9219 Polur, India, 12.5119, 79.1258 Bilis Qooqaani, Somalia, 0.2837, 41.7141 Narutocho-mitsuishi, Japan, 34.1667, 134.6167 Songjiangcun, China, 42.1756, 127.4842 Catu, Brazil, -12.3531, -38.3789 Hacienda Heights, United States, 33.9970, -117.9727 Vannes, France, 47.6559, -2.7603 Trani, Italy, 41.2667, 16.4167 Oxchuc, Mexico, 16.7833, -92.2833 Corby, United Kingdom, 52.4877, -0.7013 Nandod, India, 21.8706, 73.5028 Tivoli, Italy, 41.9667, 12.8000 Acipayam, Turkey, 37.4250, 29.3539 Macaiba, Brazil, -5.8578, -35.3539 Luquembo, Angola, -10.7333, 17.8833 Canterbury, United Kingdom, 51.2800, 1.0800 Daxing, China, 22.9968, 102.3950 Pithapuram, India, 17.1167, 82.2667 Queensburgh, South Africa, -29.8667, 30.9333 Yenisehir, Turkey, 40.2644, 29.6531 Minamiuonuma, Japan, 37.0655, 138.8761 Beaumont, United States, 33.9076, -116.9766 Khurai, India, 24.0437, 78.3301 Swidnica, Poland, 50.8500, 16.4833 San Jacinto, United States, 33.7970, -116.9916 Tacuarembo, Uruguay, -31.7333, -55.9833 Punganuru, India, 13.3667, 78.5833 Trencin, Slovakia, 48.8919, 18.0367 Wellingborough, United Kingdom, 52.3028, -0.6944 Hidaka, Japan, 35.9078, 139.3391 Bhamo, Burma, 24.2667, 97.2333 Piedade, Brazil, -23.7119, -47.4278 Huesca, Spain, 42.1333, -0.4167 Jelgava, Latvia, 56.6522, 23.7244 El Kef, Tunisia, 36.1822, 8.7147 Nargol, India, 20.2330, 72.7500 La Roche-sur-Yon, France, 46.6705, -1.4260 Barranqueras, Argentina, -27.4833, -58.9333 Montenegro, Brazil, -29.6889, -51.4608 Santa Cruz, Philippines, 13.4800, 122.0300 Chaiwu, China, 39.6556, 116.6292 Belen de Escobar, Argentina, -34.3333, -58.8167 Sarpsborg, Norway, 59.2839, 11.1096 Phuthaditjhaba, South Africa, -28.5333, 28.8167 Carigara, Philippines, 11.3000, 124.6800 Sara, Philippines, 11.2500, 123.0200 Wetzlar, Germany, 50.5667, 8.5000 Chone, Ecuador, -0.6833, -80.1000 Hattingen, Germany, 51.3992, 7.1858 Pila, Philippines, 14.2300, 121.3700 Chota, Peru, -6.5614, -78.6486 Annaka, Japan, 36.3263, 138.8871 Ghatal, India, 22.6700, 87.7200 Terneuzen, Netherlands, 51.3333, 3.8333 Bad Salzuflen, Germany, 52.0833, 8.7467 Palmares, Brazil, -8.6828, -35.5919 Tikhoretsk, Russia, 45.8667, 40.1333 Choshi, Japan, 35.7346, 140.8268 Santa Elena, Ecuador, -2.2267, -80.8583 Giurgiu, Romania, 43.9008, 25.9739 Sagar, India, 14.1667, 75.0333 Mundka, India, 28.6794, 77.0284 Yenangyaung, Burma, 20.4597, 94.8742 Jinchang, China, 38.4858, 112.9643 Masinloc, Philippines, 15.5300, 119.9500 Plainfield, United States, 40.6154, -74.4157 Pontevedra, Philippines, 10.3700, 122.8800 West Sacramento, United States, 38.5557, -121.5505 Trento, Philippines, 8.0500, 126.0600 Jalapa, Nicaragua, 13.9167, -86.1333 Marana, United States, 32.4355, -111.1558 Ortaca, Turkey, 36.8389, 28.7644 Douar Ain Chkef, Morocco, 33.9652, -5.2880 Kampen, Netherlands, 52.5500, 5.9000 Ensenada, Argentina, -34.8644, -57.9103 Bekescsaba, Hungary, 46.6833, 21.0833 Antanifotsy, Madagascar, -19.6641, 47.3207 Nihonmatsu, Japan, 37.5849, 140.4312 Kouri, Mali, 12.1833, -4.8031 Capitao Poco, Brazil, -1.7464, -47.0594 Mbulungu, Congo (Kinshasa), -6.0667, 21.9000 Tapas, Philippines, 11.2622, 122.5369 Tiruvallur, India, 13.1231, 79.9120 Baramati, India, 18.1500, 74.5800 Passau, Germany, 48.5744, 13.4647 Caojia, China, 27.8197, 111.3364 Sittingbourne, United Kingdom, 51.3400, 0.7400 Konan, Japan, 35.0000, 136.0833 Karak, Indonesia, -0.5298, 101.5721 Chelles, France, 48.8833, 2.6000 San Isidro, Philippines, 15.3097, 120.9069 Dikwella South, Sri Lanka, 5.9667, 80.6833 Medianeira, Brazil, -25.2950, -54.0939 Polevskoy, Russia, 56.4500, 60.1833 Javanrud, Iran, 34.8078, 46.4939 Yucaipa, United States, 34.0336, -117.0429 Shidong, China, 23.6873, 111.9296 Shidongcun, China, 23.6193, 112.0701 Sakurai, Japan, 34.5186, 135.8433 Islampur, India, 26.2700, 88.2000 Umm Qurun, Qatar, 25.2500, 51.3732 Ruma, Serbia, 45.0031, 19.8289 Belchatow, Poland, 51.3667, 19.3667 Morsott, Algeria, 35.6667, 8.0167 Sidhi, India, 24.4200, 81.8800 Rahuri, India, 19.3800, 74.6500 Sado, Japan, 38.0183, 138.3683 Zelenogorsk, Russia, 56.1000, 94.5833 San Manuel, Philippines, 16.0656, 120.6667 Kizilpinar, Turkey, 41.2667, 27.9667 Paracin, Serbia, 43.8667, 21.4167 Cornillon, Haiti, 18.6755, -71.9527 Kapchagay, Kazakhstan, 43.8833, 77.0833 Valle del Guamuez, Colombia, 0.4253, -76.9053 Ankadinondry-Sakay, Madagascar, -18.9667, 46.4500 Rotorua, New Zealand, -38.1378, 176.2514 San Benito, Guatemala, 16.9167, -89.9000 Don Bosco, Philippines, 14.4817, 121.0258 Peabody, United States, 42.5335, -70.9725 Hashtpar, Iran, 37.7975, 48.9042 Rocky Mount, United States, 35.9685, -77.8040 Kasaragod, India, 12.5000, 75.0000 Sefrou, Morocco, 33.0000, 49.0000 Frenda, Algeria, 35.0667, 1.0500 Texas City, United States, 29.4154, -94.9682 Bristol, United States, 40.1216, -74.8667 Liski, Russia, 50.9667, 39.5167 Bir Ali Ben Khalifa, Tunisia, 34.7339, 10.1000 Balykchy, Kyrgyzstan, 42.4603, 76.1872 Ixhuatlan de Madero, Mexico, 20.6833, -98.0167 San Bartolome, Spain, 27.9256, -15.5725 Kentwood, United States, 42.8852, -85.5926 Louang Namtha, Laos, 20.9500, 101.4000 Lower Paxton, United States, 40.3183, -76.7983 Mariano Acosta, Argentina, -34.7167, -58.7833 Jalor, India, 25.3500, 72.6200 Tarma, Peru, -11.4186, -75.6908 Cholet, France, 47.0600, -0.8783 Samana, India, 30.1500, 76.1900 Cheddra, Chad, 13.4428, 16.0508 Kunnamkulam, India, 10.6500, 76.0800 Palmaner, India, 13.2000, 78.7500 Xihu, Taiwan, 23.9594, 120.4800 Jalakati, Bangladesh, 22.6409, 90.1988 Deolali, India, 19.9510, 73.8340 Ribeira do Pombal, Brazil, -10.8339, -38.5358 Juanjui, Peru, -7.1802, -76.7265 Tagkawayan, Philippines, 13.9700, 122.5300 Ghoriyan, Afghanistan, 34.3400, 61.4700 Jihong, China, 32.6972, 111.7928 Kennedy Town, Hong Kong, 22.2800, 114.1250 Titay, Philippines, 7.8703, 122.5594 Puerto Libertador, Colombia, 7.9067, -75.6733 Jihlava, Czechia, 49.4003, 15.5906 Minalabac, Philippines, 13.5700, 123.1844 Druzhkivka, Ukraine, 48.6214, 37.5278 Umred, India, 20.8500, 79.3300 Sabbashahr, Iran, 35.5817, 51.1119 Bandar-e Torkaman, Iran, 36.9014, 54.0736 Hamura, Japan, 35.7672, 139.3109 Chenab Nagar, Pakistan, 31.7528, 72.9222 Sohna, India, 28.2500, 77.0700 Cheremkhovo, Russia, 53.1500, 103.0833 Chilibre, Panama, 9.1540, -79.6202 Manhattan, United States, 39.1886, -96.6048 Frydek-Mistek, Czechia, 49.6856, 18.3506 Vigan, Philippines, 17.5747, 120.3869 Tikhvin, Russia, 59.6500, 33.5333 Neustadt, Germany, 49.3500, 8.1500 Manicore, Brazil, -5.8089, -61.3000 Chania, Greece, 35.5167, 24.0167 An Nimas, Saudi Arabia, 19.1455, 42.1201 Manfredonia, Italy, 41.6333, 15.9167 Cabagan, Philippines, 17.4300, 121.7700 Bacaadweyn, Somalia, 7.1919, 47.5261 Hajjah, Yemen, 15.6950, 43.5975 Chenaran, Iran, 36.6406, 59.1186 Bijar, Iran, 35.8729, 47.5993 Iganga, Uganda, 0.6150, 33.4850 Impasugong, Philippines, 8.3028, 125.0014 Parvatipuram, India, 18.7800, 83.4250 Ban Om Noi, Thailand, 13.7001, 100.3241 Elda, Spain, 38.4789, -0.7967 Ullal, India, 12.8149, 74.8429 Magpet, Philippines, 7.1200, 125.1200 Juigalpa, Nicaragua, 12.1000, -85.3667 Colton, United States, 34.0538, -117.3255 Kitaotao, Philippines, 7.6406, 125.0086 Dholka, India, 22.7200, 72.4700 Louangphabang, Laos, 19.8900, 102.1347 Ottappalam, India, 10.7700, 76.3800 Registro, Brazil, -24.4878, -47.8439 Aspen Hill, United States, 39.0927, -77.0826 Diamond Bar, United States, 33.9992, -117.8161 Sao Francisco do Sul, Brazil, -26.2433, -48.6381 Zongo, Congo (Kinshasa), 4.3433, 18.5928 Wayne, United States, 40.9481, -74.2453 Cangola, Angola, -7.9667, 15.8667 A Yun Pa, Vietnam, 13.3939, 108.4408 Ibiza, Spain, 38.9089, 1.4328 Funato, Japan, 34.2500, 135.3167 Corbeil-Essonnes, France, 48.6139, 2.4820 Gazipasa, Turkey, 36.2728, 32.3131 San Francisco Menendez, El Salvador, 13.8425, -90.0167 Upata, Venezuela, 8.0204, -62.4100 Hadali, Pakistan, 32.2922, 72.1922 Mora, Cameroon, 11.0500, 14.1500 Howell, United States, 40.1819, -74.1976 Huntington Park, United States, 33.9800, -118.2167 Manjeri, India, 11.1202, 76.1200 Alcobaca, Portugal, 39.5522, -8.9775 Kongoussi, Burkina Faso, 13.3333, -1.5333 Evry, France, 48.6238, 2.4296 Millcreek, United States, 42.0859, -80.1194 Al Majaridah, Saudi Arabia, 19.1236, 41.9111 Ashta, India, 23.0175, 76.7221 Narva, Estonia, 59.3758, 28.1961 Gisenyi, Rwanda, -1.7000, 29.2500 Evora, Portugal, 38.5667, -7.9000 San Juan, Trinidad and Tobago, 10.6500, -61.4500 Epinay-sur-Seine, France, 48.9553, 2.3092 Dimitrovgrad, Bulgaria, 42.0500, 25.6000 Ilindu Kothi, India, 32.1461, 76.2784 Bisceglie, Italy, 41.2409, 16.5021 Kaliyaganj, India, 25.6300, 88.3200 Jaggayyapeta, India, 16.8920, 80.0976 Neryungri, Russia, 56.6833, 124.6667 Brits, South Africa, -25.6344, 27.7811 Morondava, Madagascar, -20.2833, 44.2833 Modica, Italy, 36.8672, 14.7614 Marechal Candido Rondon, Brazil, -24.5561, -54.0567 Ilgin, Turkey, 38.2792, 31.9139 Travnik, Bosnia and Herzegovina, 44.2264, 17.6597 Extrema, Brazil, -22.8550, -46.3178 Hongshandian, China, 27.5736, 112.0158 Ajuy, Philippines, 11.1725, 123.0196 Chystiakove, Ukraine, 48.0219, 38.6264 Pasacao, Philippines, 13.5103, 123.0419 Kleve, Germany, 51.7900, 6.1400 Wheaton, United States, 41.8561, -88.1085 Marco de Canavezes, Portugal, 41.1833, -8.1500 Popesti-Leordeni, Romania, 44.3800, 26.1700 Goalpara, India, 26.1700, 90.6200 Cuenca, Spain, 40.0667, -2.1500 Sibonga, Philippines, 10.0300, 123.5700 Pinellas Park, United States, 27.8589, -82.7078 Dilovasi, Turkey, 40.7797, 29.5350 Santa Lucia, Cuba, 21.0281, -75.9964 Chortoq, Uzbekistan, 41.0689, 71.8153 Mutsu, Japan, 41.2928, 141.1836 Liberia, Costa Rica, 10.6333, -85.4333 Yaguajay, Cuba, 22.3303, -79.2369 Shahpur, India, 16.7000, 76.8300 Aloha, United States, 45.4920, -122.8725 Guiuan, Philippines, 11.0300, 125.7300 Tutoia, Brazil, -2.7619, -42.2739 Granja, Brazil, -3.1200, -40.8258 Bhongir, India, 17.5100, 78.8900 Chaozhou, Taiwan, 22.5500, 120.5333 Tokamachi, Japan, 37.1333, 138.7500 Keighley, United Kingdom, 53.8670, -1.9110 Oak Park, United States, 41.8872, -87.7899 Bayonne, France, 43.4900, -1.4800 Gorkha, Nepal, 28.0000, 84.6333 Ahlen, Germany, 51.7633, 7.8911 Montesilvano, Italy, 42.5119, 14.1373 Tame, Colombia, 6.4667, -71.7333 Inhumas, Brazil, -16.3578, -49.4961 Minnetonka, United States, 44.9322, -93.4598 Dongshan, Taiwan, 24.6319, 121.7539 Amalapuram, India, 16.5787, 82.0061 Tokmok, Kyrgyzstan, 42.8390, 75.2910 Yangmei, China, 22.8728, 112.7802 Kunnamangalam, India, 11.3064, 75.8789 Bakhtiyarpur, India, 25.4590, 85.5390 Twin Falls, United States, 42.5645, -114.4613 Legionowo, Poland, 52.4000, 20.8833 San Vicente, El Salvador, 13.6453, -88.7842 La Gomera, Guatemala, 14.0833, -91.0500 Qingan, China, 46.8719, 127.5118 Estancia, Philippines, 11.4500, 123.1500 Kabale, Uganda, -1.2500, 29.9900 Hamilton, United Kingdom, 55.7770, -4.0390 Dongsheng, China, 29.7139, 112.5300 Bitonto, Italy, 41.1083, 16.6917 Barbosa, Colombia, 6.4390, -75.3330 Patancheruvu, India, 17.5333, 78.2645 Capivari, Brazil, -22.9950, -47.5078 Lubuk Sikaping, Indonesia, 0.1500, 100.1667 Pinotepa, Mexico, 16.3401, -98.0530 Barobo, Philippines, 8.5292, 126.1217 Rondon do Para, Brazil, -4.7758, -48.0669 Vikarabad, India, 17.3300, 77.9000 Asuncion Mita, Guatemala, 14.3333, -89.7167 Molave, Philippines, 8.0933, 123.4850 Frechen, Germany, 50.9167, 6.8167 Baruipur, India, 22.3607, 88.4323 Lozova, Ukraine, 48.8833, 36.3833 Edina, United States, 44.8914, -93.3602 Beberibe, Brazil, -4.1800, -38.1308 Deva, Romania, 45.8781, 22.9144 Hereford, United Kingdom, 52.0560, -2.7160 Dandarah, Egypt, 26.1422, 32.6697 Dunfermline, United Kingdom, 56.0719, -3.4393 Lucban, Philippines, 14.1133, 121.5569 Zaragoza, Philippines, 15.4492, 120.7933 San Manuel, Honduras, 15.3318, -87.9194 Westchester, United States, 25.7471, -80.3523 Sagua la Grande, Cuba, 22.8086, -80.0711 Itapage, Brazil, -3.6867, -39.5861 Puttur, India, 12.7648, 75.1842 Puttur, India, 13.4500, 79.5500 Lysva, Russia, 58.1003, 57.8042 Cruz das Almas, Brazil, -12.6700, -39.1019 Methuen Town, United States, 42.7340, -71.1889 Saint-Ouen, France, 48.9123, 2.3342 Naka, Japan, 36.4574, 140.4868 Wolfenbuttel, Germany, 52.1622, 10.5369 Mahmutlar, Turkey, 36.4928, 32.0992 Mahmutlar, Turkey, 36.4928, 32.0992 Bitlis, Turkey, 38.4000, 42.1083 Safranbolu, Turkey, 41.2494, 32.6833 Saint-Quentin, France, 49.8486, 3.2864 Aurora, Philippines, 7.9484, 123.5819 Bad Kreuznach, Germany, 49.8500, 7.8667 At Tawahi, Yemen, 12.7833, 44.9833 San Estanislao, Paraguay, -24.6657, -56.4467 Bloomfield, United States, 40.8098, -74.1869 Manglaur, India, 29.8000, 77.8700 Beloeil, Canada, 45.5667, -73.2000 Simojovel de Allende, Mexico, 17.1500, -92.7167 Kadiolo, Mali, 10.5500, -5.7667 Bagheria, Italy, 38.0833, 13.5000 Hyosha, Congo (Kinshasa), 0.6975, 29.5197 Tilhar, India, 27.9628, 79.7383 Normal, United States, 40.5217, -88.9884 Xincheng, China, 39.9883, 112.4673 Buenavista, Philippines, 10.7000, 122.6300 Xinguara, Brazil, -7.0950, -49.9458 Sultanganj, India, 25.2460, 86.7380 Congonhas, Brazil, -20.5000, -43.8578 Megion, Russia, 61.0331, 76.1097 Tiruvalla, India, 9.3856, 76.5756 Kandira, Turkey, 41.0722, 30.1611 Cagnes-sur-Mer, France, 43.6644, 7.1489 `Aliabad-e Katul, Iran, 36.9075, 54.8667 Elyria, United States, 41.3760, -82.1060 Xingcheng, China, 40.1431, 118.3008 Siena, Italy, 43.3183, 11.3314 Gallarate, Italy, 45.6649, 8.7914 Timbauba, Brazil, -7.5053, -35.3183 San Remo, Italy, 43.8175, 7.7750 Lorica, Colombia, 9.2419, -75.8160 Usa, Japan, 33.5319, 131.3494 Harrismith, South Africa, -28.2833, 29.1333 Sao Francisco, Brazil, -15.9489, -44.8639 Grand Island, United States, 40.9218, -98.3586 Ksar Chellala, Algeria, 35.2167, 2.3167 Beihu, China, 38.1559, 114.8090 Pigcawayan, Philippines, 7.2800, 124.4300 Hanyu, Japan, 36.1726, 139.5485 Ouenza, Algeria, 35.9500, 8.1333 Jette, Belgium, 50.8667, 4.3333 Lagoa da Prata, Brazil, -20.0225, -45.5436 Pabbi, Pakistan, 34.0100, 71.7975 Woerden, Netherlands, 52.0833, 4.8833 Novato, United States, 38.0920, -122.5575 Ibbenburen, Germany, 52.2778, 7.7167 Venkatagiri, India, 13.9667, 79.5833 Hamtic, Philippines, 10.7000, 121.9800 Paracambi, Brazil, -22.6083, -43.7083 Bozova, Turkey, 37.3628, 38.5256 Sidi Mohamed Lahmar, Morocco, 34.7167, -6.2667 Temsia, Morocco, 30.3600, -9.4140 North Bay, Canada, 46.3000, -79.4500 Lancaster, United Kingdom, 54.0489, -2.8014 Porto Ferreira, Brazil, -21.8539, -47.4789 Fontenay-sous-Bois, France, 48.8517, 2.4772 Quezaltepeque, El Salvador, 13.8333, -89.2667 San Jose Villa de Allende, Mexico, 19.3747, -100.1475 Kobryn, Belarus, 52.2167, 24.3667 Tramandai, Brazil, -29.9847, -50.1336 Kahnuj, Iran, 27.9406, 57.6992 Yaozhuangcun, China, 30.9113, 120.9573 Minami-Soma, Japan, 37.6422, 140.9573 San Joaquin, Philippines, 10.6000, 122.0800 Zhangjiazhuang, China, 38.2487, 114.8675 Zhangjiazhuangcun, China, 38.1753, 114.7394 Sihor, India, 21.7000, 71.9700 Bani, Philippines, 16.1869, 119.8592 Pola de Siero, Spain, 43.3833, -5.6500 Tizimin, Mexico, 21.1425, -88.1647 Brentwood, United Kingdom, 51.6200, 0.3050 Roskilde, Denmark, 55.6500, 12.0833 Nerkunram, India, 13.0619, 80.2094 Paramount, United States, 33.8977, -118.1651 Lalian, Pakistan, 31.8253, 72.8027 Guernica, Argentina, -34.9167, -58.3833 Velletri, Italy, 41.6667, 12.7833 President Roxas, Philippines, 7.1544, 125.0558 Burauen, Philippines, 10.9800, 124.9000 Macclesfield, United Kingdom, 53.2500, -2.1300 Tlacotepec, Mexico, 18.6882, -97.6489 Villareal, Spain, 39.9378, -0.1014 Neibu, Taiwan, 22.6500, 120.5875 An Nabk, Syria, 34.0170, 36.7333 Qabqa, China, 36.2667, 100.6167 Bamei, China, 24.3166, 105.0380 Thongwa, Burma, 16.7547, 96.5193 Pacora, Panama, 9.0800, -79.2800 Baduria, India, 22.7400, 88.7900 Dauis, Philippines, 9.6250, 123.8650 El Rama, Nicaragua, 12.3333, -84.6667 Claveria, Philippines, 8.6100, 124.8947 Barlad, Romania, 46.2167, 27.6667 Sironj, India, 24.1031, 77.6905 San Miguel Ixtahuacan, Guatemala, 15.2500, -91.7500 Vaulx-en-Velin, France, 45.7768, 4.9186 Kyle, United States, 29.9932, -97.8852 Padangpanjang, Indonesia, -0.4500, 100.4167 Altrincham, United Kingdom, 53.3838, -2.3547 Dar Chabanne, Tunisia, 36.4700, 10.7500 Coronel Oviedo, Paraguay, -25.4500, -56.4400 Jangaon, India, 17.7227, 79.1518 Miyakojima, Japan, 24.8056, 125.2811 Charlottetown, Canada, 46.2403, -63.1347 Placentia, United States, 33.8807, -117.8553 Marechal Deodoro, Brazil, -9.7103, -35.8950 El Carmen, Ecuador, -0.2736, -79.4597 Daudnagar, India, 25.0300, 84.4000 Ibajay, Philippines, 11.8211, 122.1617 Paraiso do Tocantins, Brazil, -10.1758, -48.8669 Jiyyammavalasa, India, 18.8186, 83.5797 Zalau, Romania, 47.1911, 23.0572 Mandamari, India, 18.9822, 79.4811 Mae Sot, Thailand, 16.7131, 98.5747 Sidi Bouzid, Tunisia, 35.0381, 9.4858 Lakhminia, India, 25.4126, 86.3253 Ain Sefra, Algeria, 32.7500, -0.5833 Sison, Philippines, 16.1700, 120.5200 Krasnokamensk, Russia, 50.1000, 118.0333 Ellenabad, India, 29.4500, 74.6500 Hrazdan, Armenia, 40.5000, 44.7667 Mollet, Spain, 41.5390, 2.2130 Akbou, Algeria, 36.4667, 4.5333 Campo Belo, Brazil, -20.8969, -45.2769 Delmiro Gouveia, Brazil, -9.3886, -37.9992 Taquaritinga, Brazil, -21.4058, -48.5050 Enerhodar, Ukraine, 47.4989, 34.6558 Rincon de la Victoria, Spain, 36.7167, -4.2833 Obidos, Brazil, -1.9178, -55.5178 Lautoka, Fiji, -17.6242, 177.4528 Pula, Croatia, 44.8703, 13.8456 San Pablo, Guatemala, 14.9333, -92.0000 Taxco de Alarcon, Mexico, 18.5564, -99.6050 Koraput, India, 18.8120, 82.7105 Mudhol, India, 16.3500, 75.2833 Avellino, Italy, 40.9153, 14.7897 Plottier, Argentina, -38.9500, -68.2333 Naguilian, Philippines, 16.5300, 120.4000 Victoria, Philippines, 13.1719, 121.2756 Utrera, Spain, 37.1830, -5.7670 Wheaton, United States, 39.0492, -77.0573 Volzhsk, Russia, 55.8703, 48.3561 Alesund, Norway, 62.4723, 6.1549 Uriangato, Mexico, 20.1333, -101.1667 Bato, Philippines, 13.3578, 123.3678 Jurmala, Latvia, 56.9665, 23.7221 Antratsyt, Ukraine, 48.1192, 39.0900 El Tumbador, Guatemala, 14.8667, -91.9333 Kendale Lakes, United States, 25.7081, -80.4078 Gaoyi, China, 37.6069, 114.6088 Bhajani, Nepal, 28.4924, 80.9753 Acara, Brazil, -1.9608, -48.1969 Phaltan, India, 17.9800, 74.4300 Shiraoka, Japan, 36.0191, 139.6769 Buique, Brazil, -8.6233, -37.1564 Boblingen, Germany, 48.6856, 9.0153 Acatzingo, Mexico, 18.9817, -97.7822 Diu, India, 20.7158, 70.9858 Lengquancun, China, 39.9431, 116.0886 Portici, Italy, 40.8197, 14.3411 Ampanihy, Madagascar, -24.6888, 44.7483 Cathedral City, United States, 33.8362, -116.4642 Albu Kamal, Syria, 34.4504, 40.9186 Chajul, Guatemala, 15.4872, -91.0347 Pontes e Lacerda, Brazil, -15.2258, -59.3350 Thomazeau, Haiti, 18.6530, -72.0939 Tangkak, Malaysia, 2.2673, 102.5453 Caetite, Brazil, -14.0689, -42.4750 Yendi, Ghana, 9.4337, -0.0167 Dungu, Congo (Kinshasa), 3.6167, 28.5667 Takeo, Cambodia, 10.9833, 104.7833 Ambohibary, Madagascar, -19.6176, 47.1398 Slavyansk-na-Kubani, Russia, 45.2500, 38.1167 Ad Dabbah, Sudan, 18.0500, 30.9500 Shiogama, Japan, 38.3144, 141.0220 Huamantla, Mexico, 19.3133, -97.9228 San Onofre, Colombia, 9.7333, -75.5333 Khattan, India, 33.3773, 75.7254 Leon, Philippines, 10.7808, 122.3894 Rawatbhata, India, 24.9300, 75.5800 Vaisampakkal, India, 9.4562, 76.5241 Kumarankari, India, 9.4596, 76.4986 Ntoum, Gabon, 0.3905, 9.7610 Taua, Brazil, -6.0028, -40.2928 Piaseczno, Poland, 52.0667, 21.0167 Eilat, Israel, 29.5500, 34.9500 Muban Saeng Bua Thong, Thailand, 13.9650, 100.3924 Mikkeli, Finland, 61.6890, 27.2720 Florissant, United States, 38.7996, -90.3269 Santa Eulalia, Guatemala, 15.7333, -91.4586 Mengmeng, China, 23.4650, 99.8021 Santo Antonio do Descoberto, Brazil, -15.9400, -48.2550 Vernon, Canada, 50.2670, -119.2720 San Luis de la Paz, Mexico, 21.3000, -100.5167 Liaquatpur, Pakistan, 28.9353, 70.9508 Bloxwich, United Kingdom, 52.6140, -2.0040 Rumia, Poland, 54.5667, 18.4000 Piekary Slaskie, Poland, 50.3833, 18.9500 Imaricho-ko, Japan, 33.2647, 129.8808 San Gil, Colombia, 6.5592, -73.1350 Sa`dah, Yemen, 16.9400, 43.7592 Wangjiazhai, China, 26.6895, 104.8043 El Bagre, Colombia, 7.5942, -74.8119 Tomiya, Japan, 38.4000, 140.8833 Alytus, Lithuania, 54.4000, 24.0500 Padre Garcia, Philippines, 13.8800, 121.2200 Vila Real, Portugal, 41.2953, -7.7461 Arwal, India, 25.2442, 84.6631 Gummersbach, Germany, 51.0333, 7.5667 Choma, Zambia, -16.7711, 26.9922 Kardzhali, Bulgaria, 41.6500, 25.3670 Melo, Uruguay, -32.3667, -54.1833 Matta, Pakistan, 35.0931, 72.3097 M.A. Rasulzada, Azerbaijan, 40.4344, 49.8336 Rastatt, Germany, 48.8500, 8.2000 Zhushan, Taiwan, 23.6889, 120.7289 Palenque, Mexico, 17.4333, -91.8000 Covilha, Portugal, 40.2833, -7.5000 Sao Gabriel da Cachoeira, Brazil, -0.1300, -67.0889 Crosby, United Kingdom, 53.4870, -3.0340 Ravensburg, Germany, 47.7831, 9.6114 Catalina Foothills, United States, 32.3046, -110.8838 Palmas, Brazil, -26.4842, -51.9906 Sherpur, Bangladesh, 24.6765, 89.4159 Burla, India, 21.5098, 83.8726 Bom Despacho, Brazil, -19.7358, -45.2519 Gadarwara, India, 22.9235, 78.7849 Caleta Olivia, Argentina, -46.4333, -67.5333 Baranoa, Colombia, 10.8000, -74.9167 Caldas da Rainha, Portugal, 39.4069, -9.1363 Caramoan, Philippines, 13.7707, 123.8631 Pordenone, Italy, 45.9626, 12.6563 Belle-Anse, Haiti, 18.2377, -72.0664 Guapimirim, Brazil, -22.5369, -42.9819 Pacatuba, Brazil, -3.9839, -38.6200 Tamboril, Dominican Republic, 19.4800, -70.6000 Pardiguda, India, 17.3974, 78.5783 Qalqilyah, West Bank, 32.1897, 34.9706 West New York, United States, 40.7857, -74.0094 Kalpi, India, 26.1200, 79.7300 Aguadulce, Panama, 8.2415, -80.5398 Torrelavega, Spain, 43.3531, -4.0458 Girardota, Colombia, 6.3764, -75.4473 Civitavecchia, Italy, 42.1000, 11.8000 Baiao, Brazil, -2.7908, -49.6719 Sevran, France, 48.9333, 2.5333 Pryluky, Ukraine, 50.5892, 32.3856 Lincoln, United States, 38.8774, -121.2937 Santa Ignacia, Philippines, 15.6200, 120.4300 Alaminos, Philippines, 14.0635, 121.2451 Kulu, Turkey, 39.0892, 33.0806 Xanxere, Brazil, -26.8769, -52.4039 Mulongo, Congo (Kinshasa), -7.8333, 27.0000 Huazangsi, China, 36.9836, 103.1265 Tijucas, Brazil, -27.2408, -48.6339 Irinjalakuda, India, 10.3424, 76.2112 Menggala, Indonesia, -4.4750, 105.2414 Sartrouville, France, 48.9372, 2.1644 Dunwoody, United States, 33.9418, -84.3122 Kokstad, South Africa, -30.5539, 29.4269 Ayutuxtepeque, El Salvador, 13.0000, 44.0000 Levittown, United States, 40.7241, -73.5125 Tachilek, Burma, 20.4528, 99.8958 Zeralda, Algeria, 36.7167, 2.8500 Gus'-Khrustal'nyy, Russia, 55.6167, 40.6833 Palm Desert, United States, 33.7378, -116.3695 Teramo, Italy, 42.6589, 13.7039 Tirupparangunram, India, 9.8815, 78.0731 Cuihuangkou, China, 39.5322, 117.1917 Tulsipur, Nepal, 28.1278, 82.2956 Segovia, Spain, 40.9481, -4.1183 Peine, Germany, 52.3203, 10.2336 Bando, Japan, 36.0484, 139.8887 Zangareddigudem, India, 17.1229, 81.2953 Barri, United Kingdom, 51.4050, -3.2700 Baham, Cameroon, 5.3333, 10.4000 Abdul Hakim, Pakistan, 30.5500, 72.1328 Ras el Oued, Algeria, 35.9497, 5.0358 Sombor, Serbia, 45.7833, 19.1167 Bantacan, Philippines, 7.5483, 126.1381 Porvoo, Finland, 60.3944, 25.6639 Izumi, Japan, 32.0906, 130.3528 Mooresville, United States, 35.5847, -80.8266 Viana, Brazil, -3.2200, -45.0039 Susangerd, Iran, 31.5569, 48.1894 Willenhall, United Kingdom, 52.5798, -2.0605 Mangochi, Malawi, -14.4722, 35.2639 Little Elm, United States, 33.1858, -96.9295 Cerca la Source, Haiti, 19.1670, -71.7901 Gabrovo, Bulgaria, 42.8742, 25.3178 Timashevsk, Russia, 45.6167, 38.9333 Encarnacion de Diaz, Mexico, 21.5167, -102.2333 Bootle, United Kingdom, 53.4457, -2.9891 Stratford, United Kingdom, 51.5423, -0.0026 Morrinhos, Brazil, -17.7319, -49.1008 Glendora, United States, 34.1449, -117.8467 Nenton, Guatemala, 15.8000, -91.7500 Koumantou, Mali, 11.4072, -6.8467 Gopalganj, Bangladesh, 23.0000, 89.8167 Boukadir, Algeria, 36.0667, 1.1333 Burien, United States, 47.4762, -122.3394 'Ain Merane, Algeria, 36.1628, 0.9706 Tadmur, Syria, 34.5504, 38.2833 Aliso Viejo, United States, 33.5792, -117.7289 Brandon, Canada, 49.8483, -99.9500 Kalawana, Sri Lanka, 6.5391, 80.4039 Sape, Brazil, -7.0950, -35.2328 Lankaran, Azerbaijan, 38.7536, 48.8511 Kyzyl-Kyya, Kyrgyzstan, 40.2667, 72.0500 Puerto Francisco de Orellana, Ecuador, -0.4625, -76.9842 Cutervo, Peru, -6.3778, -78.8167 Peranampattu, India, 12.9387, 78.7028 Guarne, Colombia, 6.2800, -75.4427 Tamalous, Algeria, 36.8361, 6.6417 Summerville, United States, 33.0016, -80.1799 Raciborz, Poland, 50.0833, 18.2333 Rongat, India, 12.4667, 92.9333 Walin, Nepal, 27.9889, 83.7675 Dartford, United Kingdom, 51.4444, 0.2172 Dabhoi, India, 22.1376, 73.4162 Turmero, Venezuela, 10.2283, -67.4725 Montijo, Portugal, 38.7049, -8.9757 Collierville, United States, 35.0470, -89.6987 Speyer, Germany, 49.3194, 8.4311 Tamiami, United States, 25.7556, -80.4016 Wake Forest, United States, 35.9632, -78.5140 Tirumangalam, India, 9.8216, 77.9891 Herning, Denmark, 56.1333, 8.9833 Salekhard, Russia, 66.5333, 66.6000 Bhavani, India, 11.4455, 77.6821 Hoffman Estates, United States, 42.0640, -88.1468 Puthuppariyaram, India, 10.8036, 76.6221 Mascouche, Canada, 45.7500, -73.6000 Sidlaghatta, India, 13.3900, 77.8600 Arles, France, 43.6767, 4.6278 Korce, Albania, 40.6167, 20.7667 Leopoldina, Brazil, -21.5319, -42.6428 Martin, Slovakia, 49.0636, 18.9214 Tsukubamirai, Japan, 35.9631, 140.0370 Westfield, United States, 40.0341, -86.1529 Columbus, United States, 39.2093, -85.9183 Fuchu, Japan, 34.3925, 132.5044 Barra, Brazil, -11.0889, -43.1419 Brejo Santo, Brazil, -7.4928, -38.9850 Marpalli, India, 17.5389, 77.7708 Bowringpet, India, 12.9912, 78.1780 Sar-e Pul, Afghanistan, 36.2214, 65.9278 Ocampo, Philippines, 13.5594, 123.3761 Bondy, France, 48.9022, 2.4828 Bestavarapeta, India, 15.5500, 79.1167 San Narciso, Philippines, 13.5677, 122.5667 Salo, Finland, 60.3861, 23.1250 Troy, United States, 42.7354, -73.6751 Hodal, India, 27.8940, 77.3690 Aurangabad, India, 27.8940, 77.3690 Fatwa, India, 25.5096, 85.3050 Rosso, Mauritania, 16.5128, -15.8050 Tres Pontas, Brazil, -21.3669, -45.5128 Shimencun, China, 30.6265, 120.4417 Kot Mumin, Pakistan, 32.1883, 73.0286 Weymouth, United Kingdom, 50.6097, -2.4547 Kalba, United Arab Emirates, 25.0742, 56.3553 Iormughanlo, Georgia, 41.5999, 45.5278 Country Club, United States, 25.9407, -80.3102 Andover, United Kingdom, 51.2080, -1.4800 Uman, Mexico, 20.8833, -89.7500 Malkara, Turkey, 40.8933, 26.9042 Burleson, United States, 32.5170, -97.3344 Ciftlikkoy, Turkey, 40.6500, 29.3333 Tucuru, Guatemala, 15.3000, -90.0667 East Honolulu, United States, 21.2975, -157.7211 Teplice, Czechia, 50.6444, 13.8319 Horsham, United Kingdom, 51.0620, -0.3250 Levittown, United States, 40.1533, -74.8531 Cumbernauld, United Kingdom, 55.9450, -3.9940 Pardwal, India, 32.3286, 76.1153 Djamaa, Algeria, 33.5333, 6.0000 Guaxupe, Brazil, -21.3050, -46.7128 Mishawaka, United States, 41.6742, -86.1666 Tobias Barreto, Brazil, -11.1839, -37.9978 Esher, United Kingdom, 51.3691, -0.3650 Kalamansig, Philippines, 6.5700, 124.0500 Kosonsoy, Uzbekistan, 41.2500, 71.5500 Juruti, Brazil, -2.1519, -56.0919 Babila, Syria, 33.4710, 36.3308 Grapevine, United States, 32.9343, -97.0742 Gennevilliers, France, 48.9256, 2.2944 Silkeborg, Denmark, 56.1701, 9.5652 Repalle, India, 16.0172, 80.8294 Cuyahoga Falls, United States, 41.1641, -81.5207 Huaiyang, China, 37.7701, 114.5312 Mabini, Philippines, 13.7496, 120.9405 Skenderaj, Kosovo, 42.7467, 20.7886 Kyotango, Japan, 35.6242, 135.0611 Miyako, Japan, 39.6414, 141.9571 Pontal, Brazil, -21.0225, -48.0372 Campos do Jordao, Brazil, -22.7394, -45.5914 Delano, United States, 35.7662, -119.2635 Vigia, Brazil, -0.8578, -48.1419 Phra Nakhon Si Ayutthaya, Thailand, 14.3478, 100.5606 Livingston, United Kingdom, 55.8834, -3.5157 Nicoya, Costa Rica, 10.1024, -85.4431 Bani Walid, Libya, 31.7619, 14.0139 Karamdiha, India, 24.4700, 83.5500 Enid, United States, 36.4063, -97.8700 Turtkul, Uzbekistan, 41.5500, 61.0000 Geyve, Turkey, 40.5089, 30.2900 Vyara, India, 21.1200, 73.4000 Whangarei, New Zealand, -35.7250, 174.3236 Zabid, Yemen, 14.2000, 43.3167 Mahmudabad, India, 27.3000, 81.1200 Saray, Turkey, 41.4411, 27.9216 Goshogawara, Japan, 40.8080, 140.4401 Milford city, United States, 41.2255, -73.0625 Jarash, Jordan, 32.2806, 35.8972 Zumpango, Mexico, 19.7969, -99.0992 Marigot, Haiti, 18.2317, -72.3229 Elmshorn, Germany, 53.7519, 9.6511 Snezhinsk, Russia, 56.0833, 60.7333 Rio Tinto, Portugal, 41.1833, -8.5667 Hinckley, United Kingdom, 52.5413, -1.3725 Ranchuelo, Cuba, 22.3358, -80.1131 Quirinopolis, Brazil, -18.4483, -50.4517 Royal Leamington Spa, United Kingdom, 52.2919, -1.5358 Bikramganj, India, 25.2107, 84.2551 Agrinio, Greece, 38.6167, 21.4000 Cihanbeyli, Turkey, 38.6581, 32.9281 Goksun, Turkey, 38.0211, 36.4917 Mweka, Congo (Kinshasa), -4.8500, 21.5667 Chinchina, Colombia, 4.9825, -75.6036 Estancia Velha, Brazil, -29.6483, -51.1739 Lorrach, Germany, 47.6167, 7.6667 Sunamganj, Bangladesh, 25.0667, 91.4000 Emden, Germany, 53.3669, 7.2061 Neath, United Kingdom, 51.6600, -3.8100 Chinnamanur, India, 9.8422, 77.3857 Fafe, Portugal, 41.4500, -8.1667 Cataingan, Philippines, 12.0028, 123.9944 Viramgam, India, 23.1200, 72.0300 Vyazma, Russia, 55.2107, 34.2912 Skien, Norway, 59.2096, 9.6090 Albi, France, 43.9289, 2.1464 Massy, France, 48.7309, 2.2713 Haskah Menah, Afghanistan, 34.1000, 70.4667 Jaru, Brazil, -10.4389, -62.4664 Sakaidecho, Japan, 34.3167, 133.8667 Arao, Japan, 32.9867, 130.4331 Anaiyur, India, 9.9615, 78.1118 Kosamba, India, 21.4800, 72.9500 Saint-Herblain, France, 47.2122, -1.6497 La Calera, Chile, -32.7867, -71.1972 El Dorado Hills, United States, 38.6750, -121.0490 Adeje, Spain, 28.1167, -16.7167 Clacton-on-Sea, United Kingdom, 51.7918, 1.1457 Cava de' Tirreni, Italy, 40.7008, 14.7056 Jaspur, India, 29.2833, 78.8167 Nichinan, Japan, 31.6019, 131.3786 Acireale, Italy, 37.6125, 15.1656 Susono, Japan, 35.1739, 138.9068 Beni Enzar, Morocco, 35.2667, -2.9333 Gloria, Philippines, 12.9722, 121.4778 Irakleio, Greece, 38.0500, 23.7667 El Nido, Philippines, 11.1956, 119.4075 Mahmud-e Raqi, Afghanistan, 35.0206, 69.3306 Amahai, Indonesia, -3.3439, 128.9322 Kotka, Finland, 60.4667, 26.9417 Forbesganj, India, 26.3000, 87.2650 San Ignacio, Paraguay, -26.8876, -57.0230 Haverford, United States, 39.9868, -75.3164 Navirai, Brazil, -23.0650, -54.1908 Hunedoara, Romania, 45.7697, 22.9203 Bas Limbe, Haiti, 19.7684, -72.3847 Tuyserkan, Iran, 34.5528, 48.4417 Laksar, India, 29.7490, 78.0240 Irondequoit, United States, 43.2096, -77.5705 Youfangcun, China, 37.0049, 115.7768 Cabreuva, Brazil, -23.3075, -47.1331 El Talar de Pacheco, Argentina, -34.4719, -58.6550 Bar Bigha, India, 25.2186, 85.7332 Tundla, India, 27.2146, 78.2368 Boa Viagem, Brazil, -5.1278, -39.7319 Bindura, Zimbabwe, -17.3000, 31.3333 Bangued, Philippines, 17.6000, 120.6200 Aringay, Philippines, 16.3982, 120.3555 Tanjombato, Madagascar, -18.9603, 47.5332 Ampitatafika, Madagascar, -18.9388, 47.4773 Chaparral, Colombia, 3.7500, -75.5833 Plaisance, Haiti, 19.5980, -72.4699 Wao, Philippines, 7.6404, 124.7257 Chbar Mon, Cambodia, 11.4533, 104.5208 Ma`an, Jordan, 30.1962, 35.7341 Rosemead, United States, 34.0689, -118.0823 Amulung, Philippines, 17.8387, 121.7235 Karapinar, Turkey, 37.7147, 33.5508 Cojutepeque, El Salvador, 13.7167, -88.9333 Chinu, Colombia, 9.0833, -75.3333 Baghpat, India, 28.9500, 77.2200 Floresti, Romania, 46.7475, 23.4908 Penablanca, Philippines, 17.6258, 121.7853 Rho, Italy, 45.5333, 9.0333 Beveren, Belgium, 51.2000, 4.2500 Donsol, Philippines, 12.9083, 123.5981 Rowley Regis, United Kingdom, 52.4880, -2.0500 Goslar, Germany, 51.9072, 10.4300 Artur Nogueira, Brazil, -22.5731, -47.1725 Bhawanipur Rajdham, India, 25.6501, 87.1396 McLean, United States, 38.9436, -77.1943 Lakewood, United States, 41.4822, -81.8008 Al Hoceima, Morocco, 35.2472, -3.9322 Houten, Netherlands, 52.0261, 5.1728 Yuki, Japan, 36.3055, 139.8766 Willich, Germany, 51.2631, 6.5492 Gombong, Indonesia, -7.6000, 109.5167 Nes Ziyyona, Israel, 31.9333, 34.8000 Ghulakandoz, Tajikistan, 40.1617, 69.4678 Nakagawa, Japan, 33.4994, 130.4222 Palpala, Argentina, -24.2500, -65.1167 Hamada, Japan, 34.8992, 132.0964 Jeffersonville, United States, 38.3376, -85.7026 Gopalpur, Bangladesh, 24.5601, 89.9218 Draper, United States, 40.4957, -111.8605 Gronau, Germany, 52.2125, 7.0417 Qinhe, China, 36.5014, 112.3247 Cardona, Philippines, 14.4861, 121.2289 Covina, United States, 34.0903, -117.8818 Bang Bua Thong, Thailand, 13.9102, 100.4258 Scarborough, United Kingdom, 54.2825, -0.4000 Ercolano, Italy, 40.8068, 14.3526 Sour el Ghozlane, Algeria, 36.1472, 3.6906 Deressia, Chad, 9.7603, 16.2697 Itarare, Brazil, -24.1125, -49.3317 Metpalli, India, 18.8492, 78.6261 Bhadrachalam, India, 17.6669, 80.8826 Francisco I. Madero, Mexico, 25.7753, -103.2731 Sfantu-Gheorghe, Romania, 45.8636, 25.7875 Sao Jose do Rio Pardo, Brazil, -21.5958, -46.8889 Tubod, Philippines, 8.0500, 123.8000 Biaora, India, 23.9163, 76.9112 Yerba Buena, Argentina, -26.8167, -65.3167 Wolossebougou, Mali, 11.9989, -7.9140 Yasu, Japan, 35.0667, 136.0333 Miyoshi, Japan, 34.8000, 132.8500 Hassan Abdal, Pakistan, 33.8195, 72.6890 Mazara del Vallo, Italy, 37.6517, 12.5875 Leith, United Kingdom, 55.9800, -3.1700 Pamplona, Colombia, 7.3781, -72.6525 Erftstadt, Germany, 50.8167, 6.7667 Weert, Netherlands, 51.2510, 5.7090 Krems an der Donau, Austria, 48.4167, 15.6167 Bandar Seri Begawan, Brunei, 4.8903, 114.9422 Kahemba, Congo (Kinshasa), -7.2829, 19.0000 Gutao, China, 37.2000, 112.1500 Xiayang, China, 26.4906, 113.7708 Dongxishan, China, 27.7056, 111.8561 Xiazhai, China, 27.7038, 107.0880 Jieshangya, China, 29.5050, 110.7653 Saoula, Algeria, 36.7000, 3.0167 'Ain el Turk, Algeria, 35.7408, -0.7492 Semera, Ethiopia, 11.7922, 41.0086 Bogoso, Ghana, 5.5675, -2.0137 Chiplun, India, 17.5300, 73.5200 Saha, India, 30.3000, 76.9667 Sujanpur, India, 32.3127, 75.6012 Shiv, India, 26.1831, 71.2500 Walidpur, India, 26.0583, 83.3778 Qabb Elias, Lebanon, 33.7986, 35.8250 El Ghaziye, Lebanon, 33.5186, 35.3661 Aarsal, Lebanon, 34.1794, 36.4208 Iju, Nigeria, 6.6107, 3.0857 Ikot Okoro, Nigeria, 4.9000, 7.7167 Harderwijk, Netherlands, 52.3506, 5.6172 Sechura, Peru, -5.5576, -80.8223 Chak Thirty-six North Branch, Pakistan, 32.1261, 72.7297 Rukan, Pakistan, 32.4236, 73.2722 Buni, Pakistan, 36.2728, 72.2597 Chak Sixty-one Gugera Branch, Pakistan, 31.5875, 73.6897 Al Wajh, Saudi Arabia, 26.2324, 36.4636 Abu Hamad, Sudan, 19.5375, 33.3275 Godinlabe, Somalia, 5.8794, 46.6308 Ceel Dheere, Somalia, 5.3686, 46.1913 Mao, Chad, 14.1194, 15.3133 Tukuyu, Tanzania, -9.2500, 33.6500 Kyaliwajjala, Uganda, 0.3800, 32.6467 Sakubva, Zimbabwe, -18.9833, 32.6500 Kizlyar, Russia, 43.8500, 46.7167 Louveira, Brazil, -23.0864, -46.9506 Al Kharjah, Egypt, 25.4400, 30.5500 Sihora, India, 23.4871, 80.1040 Chatra, India, 24.2064, 84.8708 Rovigo, Italy, 45.0809, 11.7940 Parasia, India, 22.1913, 78.7590 Satte, Japan, 36.0781, 139.7259 Chake Chake, Tanzania, -5.2395, 39.7700 Middelburg, Netherlands, 51.4997, 3.6136 Chahar Dangeh, Iran, 35.6056, 51.3092 Freising, Germany, 48.4028, 11.7489 Simraungadh, Nepal, 26.8893, 85.1168 Tiflet, Morocco, 33.8931, -6.3069 Muktagacha, Bangladesh, 24.7668, 90.2573 Ejeda, Madagascar, -24.3415, 44.5178 Janin, West Bank, 32.4594, 35.3009 Murray, United States, 40.6498, -111.8874 Shankou, China, 24.5455, 116.4151 Heidenheim, Germany, 48.6761, 10.1544 Al Ma`alla', Yemen, 12.7897, 45.0064 Downers Grove, United States, 41.7949, -88.0172 Stouffville, Canada, 43.9667, -79.2500 Hilsa, India, 25.3200, 85.2800 Poprad, Slovakia, 49.0500, 20.3000 Nanjian, China, 25.0531, 100.5231 Horishni Plavni, Ukraine, 49.0167, 33.6667 Neyriz, Iran, 29.1928, 54.3197 Tepeapulco, Mexico, 19.7856, -98.5517 Rheda-Wiedenbruck, Germany, 51.8417, 8.3000 Pananaw, Philippines, 5.9800, 121.2500 Xankandi, Azerbaijan, 39.8153, 46.7519 Leonberg, Germany, 48.8014, 9.0131 Boaco, Nicaragua, 12.4667, -85.6667 Nohar, India, 29.1800, 74.7700 Ostersund, Sweden, 63.1833, 14.6500 Cerquilho Velho, Brazil, -23.1650, -47.7436 Hannan, Japan, 34.3597, 135.2394 El Meghaier, Algeria, 33.9506, 5.9242 Concepcion, Argentina, -27.3333, -65.5833 Chitral, Pakistan, 35.8461, 71.7858 Straubing, Germany, 48.8833, 12.5667 Novovolynsk, Ukraine, 50.7333, 24.1667 Bhainsa, India, 19.1000, 77.9667 Pontevedra, Philippines, 11.4800, 122.8300 Selibe Phikwe, Botswana, -21.9667, 27.9167 Karvina, Czechia, 49.8542, 18.5428 Perintalmanna, India, 10.9765, 76.2269 Padrauna, India, 26.9000, 83.9800 Finike, Turkey, 36.3000, 30.1500 Bignay, Philippines, 14.7456, 120.9961 Gualan, Guatemala, 15.1333, -89.3667 Ridder, Kazakhstan, 50.3500, 83.5167 Jacqueville, Côte d’Ivoire, 5.2000, -4.4167 Wagga Wagga, Australia, -35.1189, 147.3689 Cangucu, Brazil, -31.3950, -52.6758 Nanao, Japan, 37.0431, 136.9674 Zyryanovsk, Kazakhstan, 49.7453, 84.2548 Itupiranga, Brazil, -5.1350, -49.3269 Perambalur, India, 11.2300, 78.8800 Lulea, Sweden, 65.5838, 22.1915 Cermik, Turkey, 38.1372, 39.4511 Kirishi, Russia, 59.4500, 32.0167 Noshiromachi, Japan, 40.2121, 140.0266 Coelho Neto, Brazil, -4.2567, -43.0128 Shawinigan, Canada, 46.5667, -72.7500 Aversa, Italy, 40.9730, 14.2065 Rosario, Philippines, 8.3800, 126.0000 Rockwall, United States, 32.9169, -96.4374 Kandangan, Indonesia, -2.7833, 115.2667 Karunagapalli, India, 9.0544, 76.5353 Pirot, Serbia, 43.1519, 22.5850 Cimitarra, Colombia, 6.3167, -73.9500 Sosua, Dominican Republic, 19.7500, -70.5200 Chesterfield, United States, 38.6589, -90.5803 Huancavelica, Peru, -12.7864, -74.9756 Bad Oeynhausen, Germany, 52.2000, 8.8000 Snizhne, Ukraine, 48.0283, 38.7656 St. Louis Park, United States, 44.9488, -93.3649 Florin, United States, 38.4832, -121.4043 Cypress, United States, 33.8171, -118.0386 Kizhake Chalakudi, India, 10.3000, 76.3300 Mojo, Ethiopia, 8.6500, 39.0833 Singen, Germany, 47.7628, 8.8400 Eagle Mountain, United States, 40.3137, -112.0114 Dumarao, Philippines, 11.2631, 122.6878 Sulleru, India, 18.5333, 83.2167 Sesimbra, Portugal, 38.4437, -9.0996 Mpigi, Uganda, 0.2300, 32.3300 Eger, Hungary, 47.8989, 20.3747 North Bethesda, United States, 39.0393, -77.1191 San Pedro, Mexico, 24.7260, -102.9840 Gao, Mali, 16.2667, -0.0500 Peddapuram, India, 17.0800, 82.1300 Bergkamen, Germany, 51.6167, 7.6333 Laval, France, 48.0733, -0.7689 Payyoli, India, 11.5333, 75.6667 Tomisato, Japan, 35.7000, 140.5667 Maria la Baja, Colombia, 10.0000, -75.3333 Santa Lucia del Camino, Mexico, 17.0667, -96.7000 Kameyama, Japan, 34.8558, 136.4517 Monte Alto, Brazil, -21.2611, -48.4964 Majalgaon, India, 19.1500, 76.2333 Noveleta, Philippines, 14.4300, 120.8800 Catemaco, Mexico, 18.4167, -95.1167 Villaguay, Argentina, -31.8500, -59.0167 Uzlovaya, Russia, 53.9833, 38.1667 Perico, Argentina, -24.3833, -65.1167 Battipaglia, Italy, 40.6167, 14.9833 East Brunswick, United States, 40.4281, -74.4179 Ozgon, Kyrgyzstan, 40.7667, 73.3000 Pen-y-Bont ar Ogwr, United Kingdom, 51.5070, -3.5780 Nowshahr, Iran, 36.6475, 51.4931 Prudentopolis, Brazil, -25.2128, -50.9778 Suzaka, Japan, 36.6511, 138.3073 Scandicci, Italy, 43.7544, 11.1894 Kemer, Turkey, 36.6000, 30.5500 Kiblawan, Philippines, 6.6200, 125.2200 Karlovac, Croatia, 45.4931, 15.5558 Santiago, Brazil, -29.1917, -54.8672 Karlovy Vary, Czechia, 50.2306, 12.8725 Arifiye, Turkey, 40.7167, 30.3667 Mulukuku, Nicaragua, 13.1503, -84.9700 Sebeta, Ethiopia, 8.9111, 38.6214 San Severo, Italy, 41.6951, 15.3793 Bagumbayan, Philippines, 14.4744, 121.0569 Haripur, Pakistan, 33.9942, 72.9333 Azusa, United States, 34.1386, -117.9124 Mbouda, Cameroon, 5.6333, 10.2500 Goba, Ethiopia, 7.0000, 39.9833 Kapadvanj, India, 23.0200, 73.0700 Mailiao, Taiwan, 23.7500, 120.2500 Edenvale, South Africa, -26.1411, 28.1528 Odiongan, Philippines, 12.4000, 122.0000 Lawrence, United States, 39.8674, -85.9904 Asakura, Japan, 33.4233, 130.6656 Wandan, Taiwan, 22.5897, 120.4851 Higashiura, Japan, 34.9700, 136.9561 Joliette, Canada, 46.0167, -73.4500 Coral Gables, United States, 25.7037, -80.2715 Everett, United States, 42.4064, -71.0545 Zargar, Tajikistan, 37.8000, 68.6500 Agustin Codazzi, Colombia, 10.0367, -73.2369 Barnstable, United States, 41.6655, -70.3639 Tuodian, China, 24.6667, 101.6333 Tennala, India, 11.0000, 75.9333 Baicheng, China, 41.7957, 81.8715 Moreno, Brazil, -8.1186, -35.0922 Cintalapa de Figueroa, Mexico, 16.6978, -93.7203 Saint-Priest, France, 45.6972, 4.9447 Carmen, Philippines, 9.8200, 124.2000 Bedford, United States, 32.8464, -97.1350 Midori, Japan, 36.3948, 139.2811 Samaniego, Colombia, 1.3500, -77.6000 Yong'an, China, 31.0206, 109.4587 Qalat, Afghanistan, 32.1061, 66.9069 Kaedi, Mauritania, 16.1503, -13.5037 Notse, Togo, 6.9483, 1.1681 Ramnagar, India, 25.2800, 83.0300 Tunuyan, Argentina, -33.5667, -69.0167 Frankenthal, Germany, 49.5333, 8.3500 San Marcos, Guatemala, 14.9653, -91.7958 Hikari, Japan, 33.9619, 131.9422 Luwero, Uganda, 0.8331, 32.4994 Malabang, Philippines, 7.5933, 124.0722 Nahuizalco, El Salvador, 13.7833, -89.7333 Antelope, United States, 38.7153, -121.3610 Bornheim, Germany, 50.7592, 7.0050 Pio Duran, Philippines, 13.0300, 123.4500 Naugachhia, India, 25.4000, 87.1000 Ardea, Italy, 41.6167, 12.5500 Bulancak, Turkey, 40.9333, 38.2333 Vinzons, Philippines, 14.1739, 122.9081 La Libertad, Guatemala, 15.5000, -91.8333 Port-Vila, Vanuatu, -17.7333, 168.3167 Dublin, United States, 40.1112, -83.1454 Oamishirasato, Japan, 35.5167, 140.3167 Misterbianco, Italy, 37.5183, 15.0069 Portage, United States, 42.2000, -85.5906 Biloxi, United States, 30.4426, -88.9514 Nizampur, India, 21.1117, 74.3300 Titusville, United States, 28.5727, -80.8193 Zhexiang, China, 24.2591, 98.2826 Farajok, South Sudan, 3.8651, 32.4821 Song Doc, Vietnam, 9.0333, 104.8167 Jaggisettigudem, India, 17.1167, 81.3000 Dulag, Philippines, 10.9525, 125.0317 Euclid, United States, 41.5903, -81.5188 Changyon, Korea, North, 38.2517, 125.1021 Valladolid, Mexico, 20.6894, -88.2017 Suwa, Japan, 36.0391, 138.1140 Acarau, Brazil, -2.8858, -40.1200 Libona, Philippines, 8.3333, 124.7433 Eltham, United Kingdom, 51.4510, 0.0520 Washington, United States, 39.7469, -75.0724 Fouka, Algeria, 36.6667, 2.7500 Naikankudi, India, 9.8430, 77.1519 Rimouski, Canada, 48.4500, -68.5300 Suresnes, France, 48.8700, 2.2200 Cesme, Turkey, 38.3236, 26.3028 Al Mayadin, Syria, 35.0198, 40.4515 Ceres, United States, 37.5952, -120.9620 Bigadic, Turkey, 39.3925, 28.1311 Courtenay, Canada, 49.6878, -124.9944 Alcala, Philippines, 15.8468, 120.5218 Slonim, Belarus, 53.0833, 25.3167 Upplands Vasby, Sweden, 59.5167, 17.9000 `Akko, Israel, 32.9278, 35.0817 Kangar, Malaysia, 6.4330, 100.1900 Panay, Philippines, 11.5553, 122.7931 Dumingag, Philippines, 8.1550, 123.3450 Figueras, Spain, 42.2667, 2.9650 University, United States, 28.0771, -82.4335 Nomimachi, Japan, 36.4470, 136.5541 Jimenez, Mexico, 27.1300, -104.9067 Hampstead, United Kingdom, 51.5541, -0.1744 Couva, Trinidad and Tobago, 10.4167, -61.4500 Godda, India, 24.8270, 87.2125 Telerghma, Algeria, 36.1167, 6.3667 Empoli, Italy, 43.7167, 10.9500 Tajura', Libya, 32.8818, 13.3399 Badurpalle, India, 17.5468, 78.3650 Santo Domingo Suchitepequez, Guatemala, 14.4667, -91.4833 Vertientes, Cuba, 21.2569, -78.1492 Martigues, France, 43.4053, 5.0475 Stillwater, United States, 36.1317, -97.0742 Yonglonghe, China, 30.7723, 112.8341 Waalwijk, Netherlands, 51.6825, 5.0694 Shimotsucho-kominami, Japan, 34.1500, 135.2167 Kingisepp, Russia, 59.3667, 28.6167 Ain Fakroun, Algeria, 35.9667, 6.8667 Cacongo, Angola, -5.2333, 12.1333 Chikugo, Japan, 33.2122, 130.5019 Svobodnyy, Russia, 51.4000, 128.1000 Leesburg, United States, 39.1057, -77.5544 Rye, United States, 41.0075, -73.6872 Jales, Brazil, -20.2689, -50.5458 Nikaweratiya, Sri Lanka, 7.7475, 80.1156 Ocotal, Nicaragua, 13.6333, -86.4833 Sanare, Venezuela, 9.7822, -69.7931 El`ad, Israel, 32.0523, 34.9512 Sesto Fiorentino, Italy, 43.8333, 11.2000 Tunglangan, Indonesia, -8.4167, 115.3000 Tucano, Brazil, -10.9628, -38.7869 Lal-lo, Philippines, 18.2000, 121.6622 Verrettes, Haiti, 19.0505, -72.4658 Centenario, Argentina, -38.8000, -68.1333 Cuxhaven, Germany, 53.8611, 8.6944 Ostroleka, Poland, 53.0667, 21.5667 Stade, Germany, 53.6008, 9.4764 Boucan Carre, Haiti, 18.9667, -72.2000 Dongzhang, China, 37.9350, 115.0839 Takahama, Japan, 34.9275, 136.9878 Mladenovac, Serbia, 44.4418, 20.6970 Koduvalli, India, 11.3594, 75.9111 Garmsar, Iran, 35.2206, 52.3389 Grasse, France, 43.6667, 6.9167 Guntakal Junction, India, 15.1711, 77.3624 Gooty, India, 15.1210, 77.6340 Mantova, Italy, 45.1564, 10.7911 Roman, Romania, 46.9300, 26.9300 Barendrecht, Netherlands, 51.8500, 4.5333 Colcapirhua, Bolivia, -17.4167, -66.2500 Amora, Portugal, 38.6265, -9.1189 Caraballeda, Venezuela, 10.6131, -66.8506 Zajecar, Serbia, 43.9042, 22.2847 Bantval, India, 12.8905, 75.0349 Barotac Viejo, Philippines, 11.0500, 122.8500 Bothell, United States, 47.7735, -122.2044 Tuckahoe, United States, 37.5878, -77.5858 Angol, Chile, -37.8000, -72.7167 Leiktho, Burma, 19.2222, 96.5811 Batajnica, Serbia, 44.9022, 20.2814 Namtu, Burma, 23.0925, 97.4011 Arakli, Turkey, 40.9333, 40.0500 Nushki, Pakistan, 29.5556, 66.0217 Zhigulevsk, Russia, 53.3997, 49.4953 Torquay, United Kingdom, 50.4700, -3.5300 Sao Joaquim da Barra, Brazil, -20.5808, -47.8550 Omitama, Japan, 36.2393, 140.3526 Masagua, Guatemala, 14.2000, -90.8500 Cedar Hill, United States, 32.5810, -96.9591 Cwmbran, United Kingdom, 51.6530, -3.0210 Inabanga, Philippines, 10.0300, 124.0700 Suzukawa, Japan, 35.3767, 139.3847 Nyaungu, Burma, 21.2000, 94.9167 Siocon, Philippines, 7.7067, 122.1361 Kilvisharam, India, 12.9143, 79.2854 Alsdorf, Germany, 50.8833, 6.1667 Begoro, Ghana, 6.3871, -0.3774 Poway, United States, 32.9871, -117.0201 Liujiaxia, China, 35.9423, 103.3146 Oranienburg, Germany, 52.7544, 13.2369 Khairabad, India, 27.5300, 80.7500 'Ain Azel, Algeria, 35.8433, 5.5219 Jasdan, India, 22.0300, 71.2000 Etterbeek, Belgium, 50.8333, 4.3833 Upperu, India, 16.6427, 77.4874 Kawkareik, Burma, 16.5556, 98.2400 Cine, Turkey, 37.6117, 28.0614 Pedreira, Brazil, -22.7419, -46.9014 Chieti, Italy, 42.3511, 14.1674 Mangalapadi, India, 12.6431, 74.9194 Orangetown, United States, 41.0527, -73.9475 Wakema, Burma, 16.6000, 95.1833 Dollard-des-Ormeaux, Canada, 45.4833, -73.8167 Welwyn Garden City, United Kingdom, 51.8062, -0.1932 Damavand, Iran, 35.6961, 52.0467 Minalin, Philippines, 14.9700, 120.6800 Erlin, Taiwan, 23.9229, 120.4091 Lidingo, Sweden, 59.3630, 18.1510 Aksay, Russia, 47.2500, 39.8667 Waterford, Ireland, 52.2583, -7.1190 Vincennes, France, 48.8478, 2.4392 Vich, Spain, 41.9301, 2.2549 Beypazari, Turkey, 40.1703, 31.9211 Landau, Germany, 49.2000, 8.1167 Collegno, Italy, 45.0775, 7.5724 Cerritos, United States, 33.8678, -118.0686 Kalima, Congo (Kinshasa), -2.5667, 26.6167 Dachau, Germany, 48.2603, 11.4342 San Pedro Mixtepec, Mexico, 16.0000, -97.1169 Evreux, France, 49.0200, 1.1500 IJmuiden, Netherlands, 52.4586, 4.6194 Mandeville, Jamaica, 18.0333, -77.5000 Upper Buchanan, Liberia, 5.9161, -10.0525 Tuba, Philippines, 16.3928, 120.5603 Levakant, Tajikistan, 37.8667, 68.9167 Kokkola, Finland, 63.8367, 23.1333 Monroe, United States, 40.3191, -74.4286 Vite, India, 17.2711, 74.5378 Kara-Balta, Kyrgyzstan, 42.8306, 73.8857 West Orange, United States, 40.7893, -74.2628 Jiashizhuangcun, China, 37.8683, 114.9478 Ishigaki, Japan, 24.3406, 124.1556 Mahayag, Philippines, 8.1297, 123.4383 Douar Laouamra, Morocco, 31.8000, -8.7167 Soest, Germany, 51.5711, 8.1092 Berastagi, Indonesia, 3.1833, 98.5167 Chhagalnaiya, Bangladesh, 23.0248, 91.5109 Titao, Burkina Faso, 13.2500, -2.0500 Morden, United Kingdom, 51.4015, -0.1949 Lesnoy, Russia, 58.6333, 59.7833 Dongshan, China, 22.0597, 112.8319 Hilo, United States, 19.6883, -155.0863 Duyen Hai, Vietnam, 9.6331, 106.4975 Santa Rita, Philippines, 14.9953, 120.6153 Shakhtarsk, Ukraine, 48.0469, 38.4686 Homnabad, India, 17.7707, 77.1252 Joshimath, India, 30.5550, 79.5650 Niagara Falls, United States, 43.0921, -79.0147 Sanmu, Japan, 35.6000, 140.4167 Qulicun, China, 22.5650, 107.8022 Hennef, Germany, 50.7833, 7.2833 Yamaga, Japan, 33.0175, 130.6744 Smethwick, United Kingdom, 52.4931, -1.9686 Qasbat Tadla, Morocco, 32.6000, -6.2667 Hagere Hiywet, Ethiopia, 8.9833, 37.8500 Shuishang, Taiwan, 23.4319, 120.4147 Florida, Argentina, -34.5167, -58.5000 Playas, Ecuador, -2.6300, -80.3900 Gumia, India, 23.8106, 85.8232 Alta Gracia, Argentina, -31.6667, -64.4333 Aziylal, Morocco, 31.9669, -6.5694 Shenze, China, 38.1831, 115.2037 Kirkcaldy, United Kingdom, 56.1107, -3.1674 Ciudad Fernandez, Mexico, 21.9500, -100.0000 El Tambo, Colombia, 2.4514, -76.8108 Fort Pierce, United States, 27.4255, -80.3431 Faya, Chad, 17.9169, 19.1167 Bokaro, India, 23.7871, 85.9564 Ami, Japan, 36.0308, 140.2148 Durham, United Kingdom, 54.7761, -1.5733 Dornbirn, Austria, 47.4139, 9.7444 Bacolor, Philippines, 14.9984, 120.6526 Balimbing, Philippines, 5.0728, 119.8847 Scafati, Italy, 40.7536, 14.5253 San Luis Obispo, United States, 35.2669, -120.6690 Bayburt, Turkey, 40.2597, 40.2278 Nettuno, Italy, 41.4667, 12.6667 Bocaiuva, Brazil, -17.1078, -43.8150 Colonia del Sol, Mexico, 22.9125, -109.9208 Aquidauana, Brazil, -20.4711, -55.7872 Kanye, Botswana, -24.9833, 25.3500 Gava, Spain, 41.3072, 2.0039 Liutuancun, China, 36.9450, 119.3950 Santangpai, China, 27.4008, 111.9942 Nangal Township, India, 31.3850, 76.3750 Soyagaon, India, 20.5514, 74.5072 Tunduru, Tanzania, -11.0667, 37.3500 Ena, Japan, 35.4492, 137.4128 Monopoli, Italy, 40.9500, 17.3000 Yongping, China, 37.0044, 109.8128 Cuetzalan, Mexico, 20.0333, -97.5167 Ash Shaykh Badr, Syria, 34.9917, 36.0835 Kasuya, Japan, 33.6108, 130.4806 Iwakura, Japan, 35.2794, 136.8714 Basoko, Congo (Kinshasa), 1.2333, 23.6000 Krasnokamsk, Russia, 58.0833, 55.6833 Sadaseopet, India, 17.6203, 77.9539 Antiguo Cuscatlan, El Salvador, 13.6731, -89.2406 New Washington, Philippines, 11.6483, 122.4339 Koumra, Chad, 8.9100, 17.5500 Hoskote, India, 13.0721, 77.7892 Barras, Brazil, -4.2469, -42.2958 Clondalkin, Ireland, 53.3187, -6.4092 Dulmen, Germany, 51.8308, 7.2783 Carepa, Colombia, 7.7578, -76.6553 Minot, United States, 48.2375, -101.2780 Birendranagar, Nepal, 28.6000, 81.6333 Acu, Brazil, -5.5769, -36.9089 North Highlands, United States, 38.6713, -121.3721 Mairena del Aljarafe, Spain, 37.3333, -6.0667 Vila Verde, Portugal, 41.6484, -8.4367 Tibigan, Philippines, 9.9500, 123.9700 Ocoee, United States, 28.5796, -81.5332 Borovichi, Russia, 58.4000, 33.9167 Dyero, Mali, 12.8292, -6.4964 Chong Nonsi, Thailand, 13.6965, 100.5427 Baguanos, Cuba, 20.7631, -76.0297 Golpayegan, Iran, 33.4508, 50.2817 Jalandhar Cantonment, India, 31.2860, 75.6150 Cornwall, Canada, 45.0275, -74.7400 La Reja, Argentina, -34.6394, -58.8283 Horsholm, Denmark, 55.8810, 12.5011 Pativilca, Peru, -10.6958, -77.7742 Roswell, United States, 33.3730, -104.5294 Cosquin, Argentina, -31.2436, -64.4653 Jiquilisco, El Salvador, 13.3167, -88.5833 Monte Santo, Brazil, -10.4378, -39.3328 Luwuk, Indonesia, -0.9396, 122.7900 Manacor, Spain, 39.5667, 3.2000 Victoriaville, Canada, 46.0500, -71.9667 Bhatkal, India, 13.9853, 74.5553 Higashine, Japan, 38.4313, 140.3911 Al Majma`ah, Saudi Arabia, 25.9039, 45.3456 Wilson, United States, 35.7311, -77.9284 Agueda, Portugal, 40.5745, -8.4480 Bilhorod-Dnistrovskyi, Ukraine, 46.1833, 30.3500 Lowestoft, United Kingdom, 52.4800, 1.7500 Aubagne, France, 43.2908, 5.5708 Egg Harbor, United States, 39.3787, -74.6102 Al Madrah Sama'il, Oman, 23.3103, 57.9455 Wauwatosa, United States, 43.0616, -88.0347 Tremembe, Brazil, -22.9583, -45.5494 Dungarpur, India, 23.8400, 73.7200 Mamburao, Philippines, 13.2233, 120.5960 Diamantina, Brazil, -18.2489, -43.6000 Chandrawada, India, 21.6525, 69.6746 Kamidani, Japan, 34.1575, 135.2397 Zawiercie, Poland, 50.5000, 19.4167 Ocosingo, Mexico, 16.9072, -92.0961 Glenview, United States, 42.0825, -87.8214 Vale de Cavalos, Portugal, 38.6500, -9.1500 Queimadas, Brazil, -7.3578, -35.8978 Ambatondrazaka, Madagascar, -17.8329, 48.4167 Pabellon de Arteaga, Mexico, 22.1500, -102.2667 Middletown, United States, 41.5476, -72.6549 Rasskazovo, Russia, 52.6667, 41.8833 Georgina, Canada, 44.3000, -79.4333 Sao Benedito, Brazil, -4.0489, -40.8650 Tonami, Japan, 36.6475, 136.9622 Kefamenanu, Indonesia, -9.4467, 124.4781 San Lorenzo, Argentina, -28.1381, -58.7681 Invercargill, New Zealand, -46.4290, 168.3620 Longchamps, Argentina, -34.8500, -58.3833 Gracias, Honduras, 14.5890, -88.5814 Esplugas de Llobregat, Spain, 41.3767, 2.0858 Evesham, United States, 39.8605, -74.8947 Ono, Japan, 34.8497, 134.9342 Chetouane, Algeria, 34.9203, -1.2897 Yumbe, Uganda, 3.4650, 31.2450 Oro Valley, United States, 32.4208, -110.9767 Hitachi-ota, Japan, 36.5383, 140.5309 Araci, Brazil, -11.3328, -38.9669 Dumka, India, 24.4200, 87.3400 `Amuda, Syria, 37.1042, 40.9300 Yecun, China, 33.7663, 110.1305 Catriel, Argentina, -37.8667, -67.8333 Helsingor, Denmark, 56.0294, 12.5863 Akonolinga, Cameroon, 3.7667, 12.2500 Chioggia, Italy, 45.2189, 12.2785 Sogod, Philippines, 10.3800, 124.9800 Jendouba, Tunisia, 36.4833, 8.7833 Pampan, Venezuela, 9.4511, -70.4758 Lamia, Greece, 38.9000, 22.4333 Puerto Lempira, Honduras, 15.2664, -83.7725 Hammam Sousse, Tunisia, 35.8589, 10.5939 Solnechnogorsk, Russia, 56.1833, 36.9833 Bunawan, Philippines, 8.1800, 125.9900 Rengam, Malaysia, 1.8867, 103.4015 Gaocheng, China, 30.0167, 100.2667 Okaya, Japan, 36.0671, 138.0493 Buena Vista Tomatlan, Mexico, 19.2102, -102.5869 Azna, Iran, 33.4597, 49.4547 Changanacheri, India, 9.4667, 76.5500 Dalaman, Turkey, 36.7667, 28.8000 Poso, Indonesia, -1.4000, 120.7500 Campi Bisenzio, Italy, 43.8256, 11.1333 Bastia, France, 42.7008, 9.4503 Umarkhed, India, 19.6014, 77.6888 Altos, Brazil, -5.0389, -42.4608 Serowe, Botswana, -22.3833, 26.7167 Liuhu, China, 35.5449, 106.6801 Indija, Serbia, 45.0492, 20.0792 Perth, United Kingdom, 56.3958, -3.4333 Huichapan, Mexico, 20.3733, -99.6489 Zutphen, Netherlands, 52.1400, 6.1950 Atarra, India, 25.2800, 80.5700 La Vega, Colombia, 2.0008, -76.7778 Malinao, Philippines, 13.4000, 123.7000 Nanto, Japan, 36.5878, 136.9194 Melle, Germany, 52.2044, 8.3389 Lousada, Portugal, 41.2833, -8.2833 Inverness, United Kingdom, 57.4778, -4.2247 Villa Constitucion, Argentina, -33.2333, -60.3333 Chenalho, Mexico, 16.9333, -92.5667 Penco, Chile, -36.7333, -72.9833 Voluntari, Romania, 44.4925, 26.1914 Vryheid, South Africa, -27.7669, 30.8000 Dikili, Turkey, 39.0667, 26.8833 Barnet, United Kingdom, 51.6444, -0.1997 Folkestone, United Kingdom, 51.0792, 1.1794 Jobabo, Cuba, 20.9075, -77.2819 General Martin Miguel de Guemes, Argentina, -24.6667, -65.0500 Sumisip, Philippines, 6.4200, 121.9800 Brea, United States, 33.9254, -117.8655 Alcira, Spain, 39.1500, -0.4350 Kifisia, Greece, 38.0833, 23.8167 Azhikkod, India, 11.9076, 75.3446 Azhikkal, India, 11.9076, 75.3446 Rio de Mouro, Portugal, 38.7689, -9.3327 Arsenyev, Russia, 44.1667, 133.2500 Loum, Cameroon, 4.7180, 9.7300 Talghar, Kazakhstan, 43.3000, 77.2333 Sao Jose de Mipibu, Brazil, -6.0750, -35.2378 Yomra, Turkey, 40.9589, 39.8469 San Andres de Sotavento, Colombia, 9.1500, -75.5000 Mataquescuintla, Guatemala, 14.5336, -90.1839 Tome-Acu, Brazil, -2.4189, -48.1519 Gosen, Japan, 37.7444, 139.1826 Rancho Santa Margarita, United States, 33.6318, -117.5988 Saint-Malo, France, 48.6494, -2.0261 Cunen, Guatemala, 15.3333, -91.0333 Oued Sly, Algeria, 36.1000, 1.2000 Ayapel, Colombia, 8.3167, -75.1500 Vikramasingapuram, India, 8.6700, 77.3300 Clorinda, Argentina, -25.2833, -57.7167 Roseville, United States, 42.5074, -82.9369 Waspan, Nicaragua, 14.7333, -83.9667 Jiaganj, India, 24.2300, 88.2700 Manapparai, India, 10.6075, 78.4253 Vinhedo, Brazil, -23.0300, -46.9750 Mentor, United States, 41.6893, -81.3362 Kasumbalesa, Congo (Kinshasa), -12.2564, 27.8028 As Sa`diyah, Iraq, 34.1906, 45.1208 Zhongtanying, China, 40.2125, 116.5844 Kikugawa, Japan, 34.7500, 138.0833 Winter Garden, United States, 28.5421, -81.5967 Albuera, Philippines, 10.9186, 124.6923 Rivoli, Italy, 45.0697, 7.5177 Newark, United States, 37.5201, -122.0307 Takeocho-takeo, Japan, 33.1947, 130.0214 Yabrud, Syria, 33.9692, 36.6573 Henrietta, United States, 43.0555, -77.6413 Urrao, Colombia, 6.3156, -76.1342 Perinton, United States, 43.0781, -77.4283 Sidrolandia, Brazil, -20.9319, -54.9608 Capao Bonito, Brazil, -24.0058, -48.3494 Cumanayagua, Cuba, 22.1522, -80.2011 Paderno Dugnano, Italy, 45.5719, 9.1692 Ayungon, Philippines, 9.8584, 123.1468 Pilar, Philippines, 11.4878, 122.9956 Neunkirchen, Germany, 49.3500, 7.1667 Blois, France, 47.5939, 1.3281 Nancaicun, China, 39.4811, 117.0103 Cantel, Guatemala, 14.8112, -91.4555 La Courneuve, France, 48.9322, 2.3967 Sowme`eh Sara, Iran, 37.3000, 49.3142 Mattanur, India, 11.9310, 75.5720 Campobasso, Italy, 41.5610, 14.6684 Herzogenrath, Germany, 50.8667, 6.1000 Qingyuan, China, 24.5004, 108.6667 Zarzal, Colombia, 4.3983, -76.0772 San Justo, Argentina, -30.7833, -60.5833 Chaidari, Greece, 38.0167, 23.6500 Dracena, Brazil, -21.4825, -51.5328 Hagaribommanahalli, India, 15.0400, 76.2000 Pallipalaiyam, India, 11.3679, 77.7435 Corato, Italy, 41.1500, 16.4000 Calimaya, Mexico, 19.1608, -99.6172 Chomutov, Czechia, 50.4611, 13.4167 Bruchsal, Germany, 49.1333, 8.6000 Dahutang, China, 28.0694, 112.5442 Saranambana, Madagascar, -17.2730, 49.1696 El Hamma, Tunisia, 33.8864, 9.7951 Al Balyana, Egypt, 26.2329, 31.9993 Banisilan, Philippines, 7.5000, 124.7000 Haeryong, Korea, South, 34.9131, 127.5394 Casalnuovo di Napoli, Italy, 40.9167, 14.3500 Liulin, China, 36.5478, 109.4725 Viti, Kosovo, 42.3214, 21.3583 Santo Domingo, Cuba, 22.5833, -80.2383 Otradnyy, Russia, 53.3667, 51.3500 Jitaicun, China, 36.3860, 115.2442 Cuilapa, Guatemala, 14.2833, -90.3000 East Providence, United States, 41.8065, -71.3565 Yarim, Yemen, 14.2972, 44.3803 Goose Creek, United States, 32.9927, -80.0055 Hof, Germany, 50.3167, 11.9167 San Benedetto del Tronto, Italy, 42.9438, 13.8833 Nandikotkur, India, 15.8667, 78.2667 La Mirada, United States, 33.9025, -118.0093 Denia, Spain, 38.8444, 0.1111 Tomioka, Japan, 36.2599, 138.8899 Hyvinkaa, Finland, 60.6333, 24.8500 Huntsville, United States, 30.7009, -95.5567 Selu, India, 19.4551, 76.4372 Stretford, United Kingdom, 53.4466, -2.3086 Soest, Netherlands, 52.1733, 5.2917 Matay, Egypt, 28.4189, 30.7792 Mela Gudalur, India, 9.6806, 77.2462 Martina Franca, Italy, 40.7000, 17.3333 Valencia, Colombia, 8.2000, -76.2167 Campo Maior, Brazil, -4.8278, -42.1686 Borgne, Haiti, 19.8451, -72.5235 Kabasalan, Philippines, 7.7968, 122.7627 Pocoes, Brazil, -14.5297, -40.3653 Lecco, Italy, 45.8533, 9.3905 Banbury, United Kingdom, 52.0610, -1.3360 Beckenham, United Kingdom, 51.4080, -0.0220 Noboribetsu, Japan, 42.4167, 141.1000 Albstadt, Germany, 48.2119, 9.0239 Joao Pinheiro, Brazil, -17.7442, -46.1739 Decin, Czechia, 50.7736, 14.1961 Lorenskog, Norway, 59.8989, 10.9642 Nanzhuangzhen, China, 23.7210, 102.8231 Greenford, United Kingdom, 51.5299, -0.3488 Rowland Heights, United States, 33.9716, -117.8912 Beavercreek, United States, 39.7310, -84.0624 Santiago, Mexico, 25.4333, -100.1333 Isabel, Philippines, 10.9300, 124.4300 Ayr, United Kingdom, 55.4580, -4.6290 San Jacinto de Buena Fe, Ecuador, -0.8986, -79.4889 Teotihuacan, Mexico, 19.6897, -98.8608 Santa Ana Chiautempan, Mexico, 19.3167, -98.1833 Los Banos, United States, 37.0630, -120.8406 Al Qusayr, Syria, 34.5078, 36.5803 Araioses, Brazil, -2.8900, -41.9031 Brive-la-Gaillarde, France, 45.1583, 1.5321 Prescott, United States, 34.5849, -112.4473 Lukavac, Bosnia and Herzegovina, 44.5333, 18.5333 Prinzapolka, Nicaragua, 13.4000, -83.5667 Jesus Menendez, Cuba, 21.1633, -76.4775 Sanuki, Japan, 34.3200, 134.1794 La Jagua de Ibirico, Colombia, 9.5667, -73.3333 Meudon, France, 48.8123, 2.2382 Taebaek, Korea, South, 37.1667, 128.9833 Stepnogorsk, Kazakhstan, 52.3497, 71.8900 Guaramirim, Brazil, -26.4728, -49.0028 Cologno Monzese, Italy, 45.5286, 9.2783 Woodstock, Canada, 43.1306, -80.7467 Punalur, India, 9.0170, 76.9260 Kampli, India, 15.4063, 76.6001 Yashan, China, 22.4776, 112.7289 Ramat HaSharon, Israel, 32.1461, 34.8394 La Caleta, Dominican Republic, 18.4500, -69.6833 South Brunswick, United States, 40.3840, -74.5256 Kuilsrivier, South Africa, -33.9414, 18.7066 Rodgau, Germany, 50.0167, 8.8833 Norala, Philippines, 6.5500, 124.6700 Nellikkuppam, India, 11.7667, 79.6833 Daxiang, China, 22.3775, 112.8008 Hioki, Japan, 31.6336, 130.4025 Ridderkerk, Netherlands, 51.8667, 4.6000 Gallatin, United States, 36.3782, -86.4698 Dongnanyanfa, China, 39.6300, 116.4083 Padra, India, 22.2300, 73.0800 Okhtyrka, Ukraine, 50.3030, 34.8920 Fujiyoshida, Japan, 35.4875, 138.8077 Muara Teweh, Indonesia, -0.9535, 114.8981 Libertador General San Martin, Argentina, -23.8000, -64.7833 El Dorado, Mexico, 24.3231, -107.3631 Puerto Villarroel, Bolivia, -16.8667, -64.7831 Donetsk, Russia, 48.3333, 39.9333 Langford Station, Canada, 48.4506, -123.5058 Obra, India, 24.4200, 82.9800 Schwerte, Germany, 51.4458, 7.5653 Faratsiho, Madagascar, -19.4064, 46.9519 Nakai, Japan, 33.5833, 133.6333 Quinte West, Canada, 44.1833, -77.5667 Montevista, Philippines, 7.7053, 125.9903 Yurga, Russia, 55.7231, 84.8861 San Feliu de Llobregat, Spain, 41.3833, 2.0439 Schagen, Netherlands, 52.7833, 4.8000 Al Aaroui, Morocco, 34.9833, -3.0167 Olive Branch, United States, 34.9610, -89.8469 Lucaya, Bahamas, The, 26.5117, -78.6431 Aland, India, 17.5642, 76.5685 Dori, Burkina Faso, 14.0300, -0.0300 Tuy, Philippines, 14.0200, 120.7300 Punal, Dominican Republic, 19.4000, -70.6167 Livry-Gargan, France, 48.9192, 2.5361 Hadithah, Iraq, 34.1366, 42.3773 Attleboro, United States, 41.9311, -71.2950 Lower Tungawan, Philippines, 7.6047, 122.4228 Swietochlowice, Poland, 50.2919, 18.9178 Jarvenpaa, Finland, 60.4750, 25.0917 Vuyyuru, India, 16.3667, 80.8500 Cordon, Philippines, 16.6700, 121.4500 Kadinamkulam, India, 8.6000, 76.8167 Corroios, Portugal, 38.6147, -9.1508 Manvi, India, 15.9833, 77.0500 Jeomchon, Korea, South, 36.6028, 127.3042 Wejherowo, Poland, 54.6000, 18.2500 Santa Cruz do Rio Pardo, Brazil, -22.8989, -49.6328 Nelson, New Zealand, -41.2931, 173.2381 Skierniewice, Poland, 51.9528, 20.1417 Kita, Mali, 13.0504, -9.4833 Salina, United States, 38.8136, -97.6143 Carcassonne, France, 43.2100, 2.3500 Mlada Boleslav, Czechia, 50.4125, 14.9044 Rio Tercero, Argentina, -32.1833, -64.1000 Pakenham, Australia, -38.0712, 145.4878 Sardasht, Iran, 36.1553, 45.4800 La Independencia, Mexico, 16.2526, -92.0237 Quva, Uzbekistan, 40.5247, 72.0700 Lissone, Italy, 45.6167, 9.2500 Kurganinsk, Russia, 44.8667, 40.6167 Starogard Gdanski, Poland, 53.9667, 18.5333 Nilambur, India, 11.2769, 76.2258 Shahezhai, China, 40.0892, 119.6019 Kilmarnock, United Kingdom, 55.6111, -4.4957 Marino, Italy, 41.7667, 12.6667 Farmington, United States, 36.7555, -108.1823 Cuihua, China, 27.7377, 103.8574 La Tebaida, Colombia, 4.4500, -75.8000 Bhalki, India, 18.0435, 77.2060 Gotha, Germany, 50.9492, 10.7050 Filderstadt, Germany, 48.6803, 9.2183 Genova, Guatemala, 14.6167, -91.8333 Mrirt, Morocco, 33.1667, -5.5667 Halle-Neustadt, Germany, 51.4789, 11.9214 Pagalungan, Philippines, 7.0592, 124.6987 Montrouge, France, 48.8172, 2.3219 Starachowice, Poland, 51.0500, 21.0667 Vidin, Bulgaria, 43.9931, 22.8722 Kurayoshi, Japan, 35.4333, 133.8167 Farim, Guinea-Bissau, 12.4833, -15.2167 Whitney, United States, 36.1008, -115.0379 Cobija, Bolivia, -11.0333, -68.7333 Zhongzhai, China, 25.7783, 107.8665 Douera, Algeria, 36.6667, 2.9500 Anandpur, India, 21.2141, 86.1249 Capannori, Italy, 43.8756, 10.5736 Koure, Niger, 13.3106, 2.5760 Santurce-Antiguo, Spain, 43.3303, -3.0314 Takashima, Japan, 35.3500, 136.0333 Nichelino, Italy, 44.9955, 7.6466 Pilar, Philippines, 14.6700, 120.5700 Talisay, Philippines, 14.1000, 121.0200 Narvacan, Philippines, 17.4192, 120.4756 Potomac, United States, 39.0141, -77.1943 Jablonec nad Nisou, Czechia, 50.7244, 15.1681 Arandelovac, Serbia, 44.3042, 20.5561 Santana do Ipanema, Brazil, -9.3778, -37.2450 Izunokuni, Japan, 35.0333, 138.9333 Shimeo, Japan, 33.5914, 130.4797 Fellbach, Germany, 48.8086, 9.2758 Lawas, Malaysia, 4.8604, 115.4090 Tingo Maria, Peru, -9.2953, -75.9975 Nong Khai, Thailand, 17.8681, 102.7444 Memmingen, Germany, 47.9878, 10.1811 Labutta, Burma, 16.1467, 94.7611 Chefchaouene, Morocco, 35.1714, -5.2697 Puerto Tejada, Colombia, 3.2500, -76.4167 Zhob, Pakistan, 31.3417, 69.4486 Seabra, Brazil, -12.4189, -41.7700 Uzynaghash, Kazakhstan, 43.2297, 76.3100 Mislata, Spain, 39.4750, -0.4156 Weldiya, Ethiopia, 11.8306, 39.6000 Tlalmanalco, Mexico, 19.2044, -98.8025 Choisy-le-Roi, France, 48.7630, 2.4090 Limache, Chile, -33.0167, -71.2667 Uniao, Brazil, -4.5858, -42.8639 Manono, Congo (Kinshasa), -7.2947, 27.4545 Casimiro de Abreu, Brazil, -22.4808, -42.2039 Myrnohrad, Ukraine, 48.2911, 37.2681 Borca, Serbia, 44.8697, 20.4541 Sumpango, Guatemala, 14.6478, -90.7347 Kasaoka, Japan, 34.5039, 133.5100 Sapanca, Turkey, 40.6906, 30.2703 Jammalamadugu, India, 14.8500, 78.3800 Beringen, Belgium, 51.0507, 5.2216 Acaxochitlan, Mexico, 20.1667, -98.2000 Garhwa, India, 24.1600, 83.8075 Sikandra Rao, India, 27.7000, 78.4000 Cavaillon, Haiti, 18.2999, -73.6546 Aourir, Morocco, 30.4833, -9.6333 Bothaville, South Africa, -27.3833, 26.6167 Urbandale, United States, 41.6390, -93.7812 Tomboco, Angola, -6.8000, 13.3000 Nawashahr, India, 31.1167, 76.1333 Strongsville, United States, 41.3128, -81.8313 Trenque Lauquen, Argentina, -35.9667, -62.7000 Ranavav, India, 21.6800, 69.7500 Mairinque, Brazil, -23.5464, -47.1836 Arlington, United States, 42.4187, -71.1639 Olimpia, Brazil, -20.7369, -48.9150 Bihat, India, 25.4253, 86.0208 Gahini, Rwanda, -1.8244, 30.5175 Mindat, Burma, 21.3667, 93.9833 Bajil, Yemen, 15.0590, 43.2873 Huilongcun, China, 32.7028, 115.4742 Camp Perrin, Haiti, 18.3265, -73.8673 Isiolo, Kenya, 0.3500, 37.5833 Amboasary, Madagascar, -25.0364, 46.3843 Longtancun, China, 26.4106, 104.0051 Harasta, Syria, 33.5587, 36.3652 Ban Bang Mae Nang, Thailand, 13.8521, 100.3889 Donggang, Taiwan, 22.4667, 120.4544 Kikuchi, Japan, 32.9794, 130.8133 San Rafael, Costa Rica, 10.0417, -84.0750 Dingle, Philippines, 11.0500, 122.6700 Jaguaquara, Brazil, -13.5308, -39.9708 Markala, Mali, 13.6739, -6.0750 Santiago, Panama, 8.1004, -80.9833 Coonoor, India, 11.3450, 76.7950 Wodzislaw Slaski, Poland, 50.0000, 18.4500 Rosny-sous-Bois, France, 48.8667, 2.4833 Thoubal, India, 24.6300, 94.0200 Tamagawa, Japan, 33.6389, 130.8061 Paraguacu Paulista, Brazil, -22.4197, -50.5797 Freeport City, Bahamas, The, 26.5286, -78.6967 Bridgewater, United States, 40.5934, -74.6076 Ourem, Portugal, 39.6500, -8.5833 Lupao, Philippines, 15.8794, 120.8994 Noisy-le-Sec, France, 48.8894, 2.4503 Hokota, Japan, 36.1587, 140.5164 Lumba-a-Bayabao, Philippines, 7.8800, 124.3800 Joal-Fadiout, Senegal, 14.1531, -16.8316 Koupela, Burkina Faso, 12.1794, -0.3517 Campo Novo do Parecis, Brazil, -13.6750, -57.8919 Chepen, Peru, -7.2271, -79.4298 Bunde, Germany, 52.2000, 8.6000 Stavroupoli, Greece, 40.6667, 22.9333 Arendal, Norway, 58.4617, 8.7721 Dharmaragar, India, 24.3785, 92.1783 Juina, Brazil, -11.3778, -58.7408 Talence, France, 44.8000, -0.5840 Parys, South Africa, -26.9000, 27.4500 Bucak, Turkey, 37.4592, 30.5953 Middletown, United States, 40.1790, -74.9059 Tallbisah, Syria, 34.8407, 36.7309 Chajari, Argentina, -30.7667, -57.9833 Igarape, Brazil, -20.0700, -44.3019 Pakaur, India, 24.6300, 87.8500 Settimo Torinese, Italy, 45.1333, 7.7667 Shima, Japan, 34.3333, 136.8333 Cheshunt, United Kingdom, 51.7020, -0.0350 Vyshniy Volochek, Russia, 57.5833, 34.5667 Shertallai, India, 9.6869, 76.3361 Havant, United Kingdom, 50.8517, -0.9842 Tan-Tan, Morocco, 28.4333, -11.1000 Aribinda, Burkina Faso, 14.2292, -0.8633 Hexiwu, China, 39.6225, 116.9539 Pahrump, United States, 36.2235, -115.9974 Phan Ri Cua, Vietnam, 11.1739, 108.5661 Velingrad, Bulgaria, 42.0167, 24.0000 Kaufbeuren, Germany, 47.8800, 10.6225 Nawai, India, 26.3824, 75.9240 Salvador, Cuba, 20.2094, -75.2231 Badrashni, Pakistan, 33.9886, 72.0250 Ouled Moussa, Algeria, 36.6831, 3.3681 Borgerhout, Belgium, 51.2167, 4.4333 Gollalagunta, India, 17.1672, 82.2847 Hackensack, United States, 40.8891, -74.0462 Dongsu, China, 38.0153, 115.1461 Kariya, Japan, 34.7517, 134.3931 Tantangan, Philippines, 6.6200, 124.7500 Dialakorodji, Mali, 12.7036, -7.9647 Wentzville, United States, 38.8153, -90.8669 St. Thomas, Canada, 42.7750, -81.1833 Maluso, Philippines, 6.5500, 121.8800 Rajgarh, India, 24.0300, 76.8800 Muradiye, Turkey, 38.9947, 43.7681 La Goulette, Tunisia, 36.8181, 10.3050 Plainfield, United States, 41.6207, -88.2253 Changchong, China, 26.3404, 107.1866 Yambio, South Sudan, 4.5705, 28.4163 Haltom City, United States, 32.8176, -97.2707 Santa Maria Huatulco, Mexico, 15.8500, -96.3333 Farrukhnagar, India, 17.0778, 78.2011 Dendermonde, Belgium, 51.0333, 4.1000 Hokuto, Japan, 41.8242, 140.6528 Puttalam, Sri Lanka, 8.0330, 79.8260 Shangpa, China, 26.9195, 98.9516 Altamonte Springs, United States, 28.6615, -81.3953 Belfort, France, 47.6400, 6.8500 Lohja, Finland, 60.2500, 24.0667 Porangatu, Brazil, -13.4408, -49.1486 Chattamangalam, India, 11.2960, 75.9150 Jones, Philippines, 16.5583, 121.7000 Remedios, Cuba, 22.4922, -79.5458 Tangdukou, China, 27.0000, 111.2001 Tindouf, Algeria, 27.6753, -8.1286 El Valle del Espiritu Santo, Venezuela, 10.9833, -63.8833 Qianjiang Shequ, China, 23.6157, 108.9603 La Calera, Argentina, -31.3439, -64.3353 Keller, United States, 32.9335, -97.2256 Kitakata, Japan, 37.6511, 139.8748 Odenton, United States, 39.0661, -76.6938 Caiguantun, China, 26.3363, 105.9841 Nueva Gerona, Cuba, 21.8847, -82.8011 Baiji, China, 26.1041, 106.9900 Ascoli Piceno, Italy, 42.8547, 13.5753 Alfortville, France, 48.8050, 2.4239 Kirkby, United Kingdom, 53.4800, -2.8900 Mauriti, Brazil, -7.3889, -38.7739 Ashburn, United States, 39.0277, -77.4714 Rio Cauto, Cuba, 20.5636, -76.9172 Guacharachi, Mexico, 27.1500, -107.3167 Talagutong, Philippines, 6.2700, 125.6700 Kumta, India, 14.4264, 74.4122 Elmhurst, United States, 41.8973, -87.9432 Busaar, Somalia, 2.6778, 41.3253 Cuautepec de Hinojosa, Mexico, 20.1500, -98.4333 Manchester, United States, 39.9652, -74.3738 Sangarebougou, Mali, 12.9697, -8.4375 Bruhl, Germany, 50.8333, 6.9000 Rovenky, Ukraine, 48.0711, 39.3428 Veldhoven, Netherlands, 51.4200, 5.4050 Canela, Brazil, -29.3562, -50.8136 Voi, Kenya, -3.3696, 38.5700 Warud, India, 21.4167, 78.4000 Pandhurna, India, 21.6000, 78.5200 Salisbury, United Kingdom, 51.0697, -1.7950 Gaya, Niger, 11.8853, 3.4549 Bafq, Iran, 31.6050, 55.4056 Surcin, Serbia, 44.7944, 20.2781 Labrea, Brazil, -7.2589, -64.7978 Kerkrade, Netherlands, 50.8667, 6.0667 Mount Laurel, United States, 39.9483, -74.9047 Carnot, Central African Republic, 4.9400, 15.8700 Birak, Libya, 27.5333, 14.2834 Ganapathivattam, India, 11.6700, 76.2800 San Pelayo, Colombia, 8.9667, -75.8500 Olhao, Portugal, 37.0278, -7.8389 East Lansing, United States, 42.7480, -84.4836 Fuxing, Taiwan, 24.0341, 120.4235 Mbulu, Tanzania, -3.8500, 35.5500 Palayan City, Philippines, 15.5422, 121.0844 Jipijapa, Ecuador, -1.3486, -80.5786 Weinheim, Germany, 49.5500, 8.6667 Gobardanga, India, 22.8700, 88.7600 Pyrgos, Greece, 37.6667, 21.4333 Sao Bento do Una, Brazil, -8.5228, -36.4439 Erith, United Kingdom, 51.4800, 0.1778 San Antonio Abad, Spain, 37.6261, -0.9896 Nazarovo, Russia, 56.0000, 90.3833 West Seneca, United States, 42.8374, -78.7509 San Isidro, Costa Rica, 9.3403, -83.7338 Neustadt am Rubenberge, Germany, 52.5000, 9.4667 Ciudad de Huajuapam de Leon, Mexico, 17.8000, -97.7667 Karmiel, Israel, 32.9136, 35.2961 Vallenar, Chile, -28.5708, -70.7581 Gaoua, Burkina Faso, 10.3167, -3.1667 Yatagan, Turkey, 37.3425, 28.1394 Rieti, Italy, 42.4044, 12.8567 Webster, United States, 43.2294, -77.4454 Saint-Eustache, Canada, 45.5700, -73.9000 Brentwood, United States, 35.9918, -86.7758 Pulawy, Poland, 51.4167, 21.9667 Tayug, Philippines, 16.0267, 120.7478 Misseni, Mali, 10.3181, -6.0758 Vyksa, Russia, 55.3167, 42.1667 Sayreville, United States, 40.4656, -74.3237 Rada`, Yemen, 14.4151, 44.8371 Nadym, Russia, 65.5333, 72.5167 Kelo, Chad, 9.3100, 15.8100 Jaragua, Brazil, -15.7569, -49.3339 Chimteppa, Tajikistan, 38.4667, 68.7333 Gracanica, Bosnia and Herzegovina, 44.7031, 18.3101 Cornelio Procopio, Brazil, -23.1808, -50.6469 Vercelli, Italy, 45.3256, 8.4231 Sierra Vista, United States, 31.5630, -110.3153 Ashton, United Kingdom, 53.4897, -2.0952 Puertollano, Spain, 38.6833, -4.1167 Gaoua, Burkina Faso, 10.3167, -3.1667 Drachten, Netherlands, 53.1000, 6.1000 Jukal, India, 18.3689, 77.6169 Medemblik, Netherlands, 52.6833, 5.0333 Paterno, Italy, 37.5667, 14.9025 Inongo, Congo (Kinshasa), -1.9500, 18.2667 Bani `Ubayd, Egypt, 31.0247, 31.6487 Presidente Dutra, Brazil, -5.2900, -44.4900 Morgan Hill, United States, 37.1325, -121.6419 Garango, Burkina Faso, 11.8000, -0.5500 Hassi Messaoud, Algeria, 31.7000, 6.0667 Pau d'Alho, Brazil, -7.8969, -35.1800 Basud, Philippines, 14.0700, 122.9700 Surbiton, United Kingdom, 51.3940, -0.3070 Numata, Japan, 36.6460, 139.0442 Seoni Malwa, India, 22.4508, 77.4681 Massigui, Mali, 11.8600, -6.7692 Montemorelos, Mexico, 25.1872, -99.8267 Castleford, United Kingdom, 53.7160, -1.3560 Kwaggafontein, South Africa, -25.3075, 28.9469 Chalungalpadam, India, 9.5490, 76.3237 Aguilar, Philippines, 15.8899, 120.2379 Nanchang, China, 35.6718, 111.7521 Lehrte, Germany, 52.3667, 9.9667 Bingmei, China, 25.7408, 108.9023 Bountiful, United States, 40.8721, -111.8647 Littleton, United States, 39.5915, -105.0188 Sete, France, 43.4053, 3.6975 Pearl City, United States, 21.4031, -157.9566 Concepcion, Paraguay, -23.4064, -57.4344 Krosno, Poland, 49.6833, 21.7500 Arantangi, India, 10.1686, 78.9920 Nayudupet, India, 13.9000, 79.9000 Soliman, Tunisia, 36.7000, 10.4833 Maracaju, Brazil, -21.6139, -55.1678 Caete, Brazil, -19.8800, -43.6697 Haugesund, Norway, 59.4164, 5.2700 Naj` Hammadi, Egypt, 26.0500, 32.2500 Sundargarh, India, 22.1200, 84.0300 Bac Kan, Vietnam, 22.1333, 105.8333 Abqaiq, Saudi Arabia, 25.9340, 49.6688 Lancaster, United States, 42.9099, -78.6378 Ales, France, 44.1281, 4.0817 Prievidza, Slovakia, 48.7714, 18.6242 Bilacari, Azerbaijan, 40.4444, 49.8057 Lake Ridge, United States, 38.6847, -77.3066 Falkensee, Germany, 52.5583, 13.0917 Heusden, Netherlands, 51.7339, 5.1383 Shchuchinsk, Kazakhstan, 52.9333, 70.2000 Lapa, Brazil, -25.7700, -49.7158 Shakopee, United States, 44.7745, -93.4772 Pinamar, Argentina, -37.1000, -56.8500 Baba I, Cameroon, 6.0622, 10.4903 Rabinal, Guatemala, 15.0680, -90.4890 Mahalingpur, India, 16.3800, 75.1200 Bhayala, India, 22.8335, 72.3643 Nalegaon, India, 18.4167, 76.8167 Muddebihal, India, 16.3300, 76.1300 Kedgaon, India, 18.4300, 74.3500 Sachin, India, 21.0800, 72.8800 Alamuru, India, 16.7833, 81.9000 Qarabulaq, Kazakhstan, 42.5167, 69.8000 Pakxan, Laos, 18.3964, 103.6558 Batroun, Lebanon, 34.2500, 35.6500 Shahhat, Libya, 32.8167, 21.8500 Kanganpur, Pakistan, 30.9489, 73.7433 Parma, Russia, 65.9230, 57.4030 Kutum, Sudan, 14.2056, 24.6500 Nimule, South Sudan, 3.6000, 32.0500 Jedeida, Tunisia, 36.8333, 9.9167 Dig, India, 27.4700, 77.3300 Hekou, China, 22.5385, 104.0111 Palm Springs, United States, 33.8017, -116.5382 Naestved, Denmark, 55.2249, 11.7842 Barnagar, India, 23.0489, 75.3780 Tank, Pakistan, 32.1300, 70.2300 Clermont, United States, 28.5325, -81.7208 Marhanets, Ukraine, 47.6447, 34.6042 Izium, Ukraine, 49.2128, 37.2569 Tres Valles, Mexico, 18.1667, -96.0167 Timbo, Brazil, -26.8233, -49.2717 Angadanan, Philippines, 16.7571, 121.7479 Acopiara, Brazil, -6.0950, -39.4528 Maria Aurora, Philippines, 15.7967, 121.4737 Riverton, United States, 40.5176, -111.9636 Astaneh-ye Ashrafiyeh, Iran, 37.2658, 49.9431 Inuma, Japan, 36.0001, 139.6242 Seregno, Italy, 45.6500, 9.2000 The Colony, United States, 33.0925, -96.8976 Pederneiras, Brazil, -22.3517, -48.7750 Catford, United Kingdom, 51.4452, -0.0207 Tarnobrzeg, Poland, 50.5833, 21.6833 Port Loko, Sierra Leone, 8.7667, -12.7833 Borlange, Sweden, 60.4833, 15.4167 Charkhi Dadri, India, 28.5900, 76.2700 Azarshahr, Iran, 37.7628, 45.9758 Mankato, United States, 44.1715, -93.9772 Buguias, Philippines, 16.8033, 120.8211 Sagua de Tanamo, Cuba, 20.5858, -75.2417 Shangshan, China, 23.4792, 115.6918 Shazhou, China, 40.1376, 94.6638 Dois Vizinhos, Brazil, -25.7500, -53.0569 Bolivar, Colombia, 1.9708, -76.9694 Guledagudda, India, 16.0502, 75.7900 Al `Aziziyah, Iraq, 32.9094, 45.0636 Tateyama, Japan, 34.9966, 139.8700 Parigi, Indonesia, -7.6914, 108.5372 Rameswaram, India, 9.2880, 79.3130 Santiago Atitlan, Guatemala, 14.6333, -91.2333 Xinji, China, 38.4682, 116.8918 Nurmijarvi, Finland, 60.4667, 24.8083 Port Macquarie, Australia, -31.4333, 152.9000 Colotenango, Guatemala, 15.4167, -91.7167 Nasipit, Philippines, 8.9900, 125.3400 `Ayn al `Arab, Syria, 36.8910, 38.3535 Barru, Indonesia, -4.3587, 119.6399 Santa Barbara, Guatemala, 15.3167, -91.6167 Merksem, Belgium, 51.2428, 4.4414 West Lafayette, United States, 40.4432, -86.9238 Santana do Paraiso, Brazil, -19.3639, -42.5689 Manjuyod, Philippines, 9.6800, 123.1500 Sao Lourenco, Brazil, -22.1158, -45.0539 Balcarce, Argentina, -37.8456, -58.2578 Pemangkat, Indonesia, 1.1768, 108.9624 Pemangkat, Indonesia, -1.1003, 109.8902 Tiruttani, India, 13.1746, 79.6117 Chusovoy, Russia, 58.3167, 57.8167 Sakura, Japan, 36.6853, 139.9664 Zwijndrecht, Netherlands, 51.8240, 4.6126 Chichigalpa, Nicaragua, 12.5667, -87.0333 Portugalete, Spain, 43.3194, -3.0194 Liuquancun, China, 39.3635, 116.3154 Brianka, Ukraine, 48.5133, 38.6431 Xique-Xique, Brazil, -10.8229, -42.7281 Pinneberg, Germany, 53.6333, 9.8000 Mount Pleasant, United States, 41.1119, -73.8121 Kenge, Congo (Kinshasa), -4.8056, 17.0417 Cascina, Italy, 43.6800, 10.5003 Itaberai, Brazil, -16.0200, -49.8100 Worksop, United Kingdom, 53.3042, -1.1244 San Pedro Perulapan, El Salvador, 13.7667, -89.0333 Melur, India, 10.0313, 78.3381 Terracina, Italy, 41.2833, 13.2500 Dhupgari, India, 26.5889, 89.0069 Kafr al Battikh, Egypt, 31.4040, 31.7378 Lodi, Italy, 45.3167, 9.5000 Flores, Guatemala, 16.9297, -89.8917 Moorhead, United States, 46.8673, -96.7461 Yaopu, China, 26.1700, 105.8489 Cleveland Heights, United States, 41.5113, -81.5636 Tangjiacun, China, 20.8425, 109.8469 Chebarkul, Russia, 54.9833, 60.3667 Katipunan, Philippines, 8.5134, 123.2847 Zamalka, Syria, 33.5261, 36.3538 Bharella, Bangladesh, 23.5653, 91.0889 North Lauderdale, United States, 26.2113, -80.2209 Pyu, Burma, 18.4819, 96.4369 Puerto del Rosario, Spain, 28.5000, -13.8667 Dowlaiswaram, India, 16.9556, 81.7931 Concepcion, Philippines, 11.2000, 123.1000 Dolores, Philippines, 12.0378, 125.4828 Conceicao do Araguaia, Brazil, -8.2578, -49.2650 Xiluo, Taiwan, 23.7827, 120.4551 Saint-Brieuc, France, 48.5136, -2.7653 Jacaltenango, Guatemala, 15.6667, -91.7333 Kitgum, Uganda, 3.2889, 32.8778 Sainthia, India, 23.9451, 87.6803 Gogrial, South Sudan, 8.5337, 28.1167 Mamanguape, Brazil, -6.8389, -35.1258 Fairfield, United States, 39.3301, -84.5409 Grabouw, South Africa, -34.1500, 19.0167 Chalon-sur-Saone, France, 46.7806, 4.8528 Upper Bicutan, Philippines, 14.4873, 121.0503 Augusto Correa, Brazil, -1.0219, -46.6450 Erkelenz, Germany, 51.0833, 6.3167 Tori-Bossito, Benin, 6.5031, 2.1450 Alcamo, Italy, 37.9667, 12.9667 Guisa, Cuba, 20.2608, -76.5381 Jangamguda, India, 17.6238, 78.6251 Arboletes, Colombia, 8.8517, -76.4283 Cayambe, Ecuador, 0.0439, -78.1561 Salon-de-Provence, France, 43.6406, 5.0972 Mach, Pakistan, 29.8669, 67.3264 Mawlaik, Burma, 23.2833, 94.0833 Garca, Brazil, -22.2153, -49.6511 San Vicente, Argentina, -35.0167, -58.4167 Tarbes, France, 43.2300, 0.0700 Gori, Georgia, 41.9817, 44.1124 Otwock, Poland, 52.1167, 21.2667 Tarutung, Indonesia, 2.0167, 98.9667 Nsawam, Ghana, 5.8089, -0.3503 Cyanika I, Rwanda, -1.3444, 29.7422 Sicklerville, United States, 39.7452, -74.9934 Culasi, Philippines, 11.4272, 122.0560 Fond du Lac, United States, 43.7718, -88.4397 Jalacingo, Mexico, 19.6000, -97.2167 Petatlan, Mexico, 17.5383, -101.2739 Cutler Bay, United States, 25.5765, -80.3356 Shekhupur, India, 28.3500, 79.0200 Masuda, Japan, 34.6747, 131.8428 Wiener Neustadt, Austria, 47.8089, 16.2325 Tsiroanomandidy, Madagascar, -18.7698, 46.0500 Rohnert Park, United States, 38.3479, -122.6965 Banaybanay, Philippines, 6.9664, 126.0114 San Pascual, Philippines, 13.1286, 122.9775 Radomsko, Poland, 51.0667, 19.4500 Karvarakundu, India, 11.1167, 76.3333 Sao Sebastiao do Passe, Brazil, -12.5125, -38.4953 Nova Kakhovka, Ukraine, 46.7550, 33.3750 Rapur, India, 14.2015, 79.5351 Tejutla, Guatemala, 15.1225, -91.8053 Abu al Matamir, Egypt, 30.9102, 30.1744 Siyana, India, 28.6269, 78.0607 Abovyan, Armenia, 40.2739, 44.6256 Angul, India, 20.8381, 85.0956 Bacnotan, Philippines, 16.7197, 120.3481 Rajaldesar, India, 28.0300, 74.4700 Robe, Ethiopia, 7.1167, 40.0000 Kandiaro, Pakistan, 27.0581, 68.2078 Elmadag, Turkey, 39.9208, 33.2308 Tongoma, Sierra Leone, 8.6598, -11.0588 Alajuela, Costa Rica, 10.1640, -84.2645 Yaoquan, China, 34.5850, 105.7261 Santo Antonio da Platina, Brazil, -23.2950, -50.0769 Bulalacao, Philippines, 12.3250, 121.3430 Dalli Rajhara, India, 20.5800, 81.0800 Houbu, China, 36.4167, 112.9833 Nandigama, India, 16.7833, 80.3000 Beigangwa, China, 39.8400, 116.2033 Vlissingen, Netherlands, 51.4500, 3.5833 Kanash, Russia, 55.5069, 47.4914 Pattani, Thailand, 6.8664, 101.2508 San Jacinto, Philippines, 16.0725, 120.4411 Bonou, Benin, 6.9000, 2.4500 San Juan y Martinez, Cuba, 22.2667, -83.8333 Eqlid, Iran, 30.8928, 52.6889 Iwanuma, Japan, 38.1043, 140.8702 Kolobrzeg, Poland, 54.1761, 15.5761 Mochudi, Botswana, -24.4167, 26.1500 Kaimana, Indonesia, -3.6444, 133.6953 Sao Miguel d'Oeste, Brazil, -26.7250, -53.5178 Pagsanjan, Philippines, 14.2700, 121.4500 Changtoushang, China, 19.3619, 110.5430 Karabulak, Russia, 43.3167, 44.9167 Jisr ash Shughur, Syria, 35.8142, 36.3198 Nanjo, Japan, 26.1631, 127.7706 Nanmengcun, China, 38.1804, 114.7740 Deinze, Belgium, 50.9833, 3.5333 General Mamerto Natividad, Philippines, 15.6030, 121.0510 Oakley, United States, 37.9929, -121.6952 Barwah, India, 22.2539, 76.0385 Birsk, Russia, 55.4167, 55.5333 Chauk, Burma, 20.8833, 94.8167 Daman, India, 20.4200, 72.8500 Labangan, Philippines, 7.8667, 123.5167 Drama, Greece, 41.1500, 24.1467 Sonqor, Iran, 34.7828, 47.5983 Medak, India, 18.0460, 78.2630 Talipparamba, India, 12.0368, 75.3601 Mantes-la-Jolie, France, 48.9908, 1.7172 Huatan, Taiwan, 24.0316, 120.5579 Salem, United States, 42.5129, -70.9021 Tineghir, Morocco, 31.5147, -5.5328 Manakara, Madagascar, -22.1455, 48.0080 Iznik, Turkey, 40.4292, 29.7211 Jora, India, 26.3421, 77.8092 Loon, Philippines, 9.8000, 123.8000 Berkeley, United States, 39.9156, -74.1923 Ruyigi, Burundi, -3.4833, 30.2500 Kalaa Srira, Tunisia, 35.8236, 10.5583 Ananipalle, India, 13.4902, 79.2895 Concord, United States, 43.2305, -71.5595 Wilkes-Barre, United States, 41.2469, -75.8760 Majurwa, India, 26.1036, 86.9193 Kaarst, Germany, 51.2167, 6.6167 Cateel, Philippines, 7.7900, 126.4531 Hammam-Lif, Tunisia, 36.7333, 10.3333 Miliana, Algeria, 36.3000, 2.2333 Tiberias, Israel, 32.7944, 35.5333 Yangiyer, Uzbekistan, 40.2667, 68.8167 Puteaux, France, 48.8850, 2.2389 North Fort Myers, United States, 26.7244, -81.8485 El Centro, United States, 32.7865, -115.5595 Regla, Cuba, 23.1317, -82.3364 Maitum, Philippines, 6.0300, 124.4800 Germencik, Turkey, 37.8697, 27.6058 Al `Ayyat, Egypt, 29.6197, 31.2575 Rio Grande da Serra, Brazil, -23.7439, -46.3978 Baskale, Turkey, 38.0475, 44.0150 Las Matas de Farfan, Dominican Republic, 18.8700, -71.5200 Raisen, India, 23.3300, 77.8000 Albufeira, Portugal, 37.0889, -8.2511 Harsin, Iran, 34.2706, 47.5803 Turnhout, Belgium, 51.3231, 4.9483 Central Signal Village, Philippines, 14.5115, 121.0563 Mandaon, Philippines, 12.2259, 123.2842 West Vancouver, Canada, 49.3667, -123.1667 Ogimachi, Japan, 33.2736, 130.2169 Hagi, Japan, 34.4081, 131.3992 Daijiazhuang, China, 38.1344, 114.3906 Togo, Japan, 35.0966, 137.0525 Tlajomulco de Zuniga, Mexico, 20.4736, -103.4431 Freeport, United States, 40.6515, -73.5850 Roghun, Tajikistan, 38.6978, 69.7522 Zevenaar, Netherlands, 51.9167, 6.0833 Lubny, Ukraine, 50.0167, 33.0000 Talata-maty, Madagascar, -18.8402, 47.4635 Saratoga Springs, United States, 40.3450, -111.9154 Noordwijk, Netherlands, 52.2333, 4.4500 Janakammapeta, India, 15.0125, 79.8439 Georgetown, Canada, 43.6526, -79.9281 Alhaurin de la Torre, Spain, 36.6667, -4.5500 Otofuke, Japan, 43.0000, 143.2000 Sihora, India, 23.0000, 80.1200 Debica, Poland, 50.0500, 21.4167 San Vicente de Tagua Tagua, Chile, -34.4394, -71.0761 Guinayangan, Philippines, 13.9000, 122.4500 Istres, France, 43.5151, 4.9895 Al Midhnab, Saudi Arabia, 25.8601, 44.2223 Nocera Inferiore, Italy, 40.7500, 14.6333 Wismar, Germany, 53.9000, 11.4667 Murshidabad, India, 24.1800, 88.2700 Senigallia, Italy, 43.7131, 13.2183 Vilvoorde, Belgium, 50.9333, 4.4167 Oakland Park, United States, 26.1780, -80.1528 Fastiv, Ukraine, 50.0833, 29.9167 Ahmadpur, India, 18.7000, 76.9333 Kangayam, India, 11.0054, 77.5620 Kiselevsk, Russia, 54.0000, 86.6500 Xonobod, Uzbekistan, 40.8000, 73.0000 Tinajdad, Morocco, 31.5000, -5.0167 Seohara, India, 29.2200, 78.5800 Yuchengcun, China, 23.5633, 116.2691 La Paz, Honduras, 14.3234, -87.6832 Mucaba, Angola, -7.1667, 14.9333 San Jose, Philippines, 13.6981, 123.5186 Columbia, United States, 35.6238, -87.0484 Guerra, Dominican Republic, 18.5500, -69.7000 Coatbridge, United Kingdom, 55.8625, -4.0266 New Tecumseth, Canada, 44.0833, -79.7500 Casale, Haiti, 18.7999, -72.3828 Gifhorn, Germany, 52.4886, 10.5464 Labason, Philippines, 8.0647, 122.5200 Yuanli, Taiwan, 24.4168, 120.6830 Yakacik, Turkey, 36.7500, 36.2167 Shahr-e Babak, Iran, 30.1214, 55.1228 Bakamune, Sri Lanka, 7.7833, 80.8167 Goshikicho-aihara-minamidani, Japan, 34.3000, 134.7833 Serrana, Brazil, -21.2108, -47.5958 Monte Carmelo, Brazil, -18.7250, -47.4989 Wankaner, India, 22.6161, 70.9531 Loreto, Philippines, 8.1900, 125.8500 Zongolica, Mexico, 18.6667, -97.0000 Greenacres, United States, 26.6270, -80.1371 Etten-Leur, Netherlands, 51.5706, 4.6356 Hicksville, United States, 40.7637, -73.5245 North Brunswick, United States, 40.4505, -74.4798 Addanki, India, 15.8167, 79.9833 Hinatuan, Philippines, 8.3661, 126.3361 Wallsend, United Kingdom, 54.9910, -1.5340 Lompoc, United States, 34.6618, -120.4714 Yirga `Alem, Ethiopia, 6.7500, 38.4167 Nidadavole, India, 16.9200, 81.6700 Bietigheim-Bissingen, Germany, 48.9667, 9.1333 Ciudad Constitucion, Mexico, 25.0322, -111.6703 Beni Saf, Algeria, 35.3000, -1.3833 Erkrath, Germany, 51.2239, 6.9147 Xinjun, China, 28.7233, 120.0189 Bellinzona, Switzerland, 46.1956, 9.0238 Baler, Philippines, 15.7583, 121.5625 Varazdin, Croatia, 46.3081, 16.3378 Gryazi, Russia, 52.5000, 39.9667 Anekal, India, 12.7105, 77.6967 Azadshahr, Iran, 37.0869, 55.1742 Jaro, Philippines, 11.1894, 124.7853 Sugito, Japan, 36.0258, 139.7367 Trujillo Alto, Puerto Rico, 18.3599, -66.0096 Salto de Pirapora, Brazil, -23.6489, -47.5728 Himi, Japan, 36.8567, 136.9731 Shyorongi, Rwanda, -1.8555, 29.9702 Zabki, Poland, 52.2928, 21.1161 Badian, Philippines, 9.8694, 123.3959 Thun, Switzerland, 46.7590, 7.6300 Kottangara, India, 8.9167, 76.6333 Murzuq, Libya, 25.9000, 13.9000 Lombard, United States, 41.8741, -88.0157 Venray, Netherlands, 51.5258, 5.9747 Kalilangan, Philippines, 7.7464, 124.7475 Takab, Iran, 36.4008, 47.1108 Mastaga, Azerbaijan, 40.5286, 50.0103 Cameron Highlands, Malaysia, 4.4833, 101.4500 Bushenyi, Uganda, -0.5417, 30.1878 Porsa, India, 26.6700, 78.3700 Bodupal, India, 17.4139, 78.5783 Melun, France, 48.5406, 2.6600 Tanghin-Dassouri, Burkina Faso, 12.2667, -1.7167 Ramachandrapuram, India, 16.8500, 82.0200 Bagneux, France, 48.7983, 2.3137 Chembra, India, 11.0420, 75.9110 Spanish Fork, United States, 40.1101, -111.6405 Jinku, China, 23.0372, 112.5151 Heinsberg, Germany, 51.0631, 6.0964 Shinshiro, Japan, 34.8989, 137.4977 Linden, United States, 40.6251, -74.2383 Nijkerk, Netherlands, 52.2214, 5.4842 Bouknadel, Morocco, 34.1333, -6.7333 San Isidro, Argentina, -34.4739, -58.5250 Roslavl, Russia, 53.9500, 32.8833 Of, Turkey, 40.9450, 40.2644 Waxahachie, United States, 32.4035, -96.8446 Borken, Germany, 51.8333, 6.8667 Santa Elena, Philippines, 14.1797, 122.3919 Raduzhnyy, Russia, 62.1333, 77.4667 Roseller Lim, Philippines, 7.6583, 122.4639 Villeta, Colombia, 5.0083, -74.4738 Kumatori, Japan, 34.4000, 135.3500 Prostejov, Czechia, 49.4722, 17.1106 Pittsfield, United States, 42.4517, -73.2605 Uruara, Brazil, -3.7178, -53.7369 Mozhga, Russia, 56.4500, 52.2167 Gabu, Guinea-Bissau, 12.2833, -14.2167 Cove, Benin, 7.2333, 2.3000 Guambog, Philippines, 7.3092, 125.8556 'Ain Arnat, Algeria, 36.1833, 5.3167 Alcantarilla, Spain, 37.9722, -1.2094 Channelview, United States, 29.7914, -95.1144 Presidente Epitacio, Brazil, -21.7633, -52.1156 Kyustendil, Bulgaria, 42.2797, 22.6870 Shoranur, India, 10.7700, 76.2800 Ksar, Mauritania, 18.0995, -15.9574 Rheden, Netherlands, 52.0000, 6.0167 Panambi, Brazil, -28.2928, -53.5019 Ormond Beach, United States, 29.2985, -81.1014 Kiraz, Turkey, 38.2306, 28.2044 Newnan, United States, 33.3767, -84.7761 Cimerak, Indonesia, -7.7422, 108.4244 Ponte de Lima, Portugal, 41.7667, -8.5833 Bahia Honda, Cuba, 22.9064, -83.1639 Caluire-et-Cuire, France, 45.7953, 4.8472 Hillsborough, United States, 40.4985, -74.6740 Sile, Turkey, 41.1764, 29.6128 Moises Padilla, Philippines, 10.2700, 123.0800 Paoskoto, Senegal, 13.7833, -15.8167 Al Kiswah, Syria, 33.3581, 36.2419 Hokuto, Japan, 35.7765, 138.4236 Potchefstroom, South Africa, -26.7150, 27.1033 Pedro Celestino Negrete, Mexico, 24.6113, -103.0944 Toboso, Philippines, 10.7200, 123.5200 Woodbridge, United States, 38.6409, -77.2580 Kikuyo, Japan, 32.8625, 130.8286 Holly Springs, United States, 35.6526, -78.8399 Danville, United States, 37.8121, -121.9698 Nettetal, Germany, 51.3167, 6.2833 Kilosa, Tanzania, -6.8300, 36.9875 Frosinone, Italy, 41.6333, 13.3500 Loreto, Mexico, 22.2667, -101.9833 Victoria, Philippines, 14.2250, 121.3250 G'ijduvon Shahri, Uzbekistan, 40.1000, 64.6667 Anse Rouge, Haiti, 19.6333, -73.0500 Severomorsk, Russia, 69.0667, 33.4167 Actopan, Mexico, 19.5036, -96.6192 De Bilt, Netherlands, 52.1167, 5.2000 Aurich, Germany, 53.4714, 7.4836 Nilothi, India, 28.8167, 76.8667 Dounan, Taiwan, 23.6833, 120.4833 Trelleborg, Sweden, 55.3667, 13.1667 Yutiancun, China, 25.8747, 119.4578 Reze, France, 47.1917, -1.5694 Isla, Mexico, 18.0333, -95.5333 Jambusar, India, 22.0500, 72.8000 Xihuachi, China, 35.8164, 108.0125 Sawakin, Sudan, 19.1025, 37.3300 Burke, United States, 38.7773, -77.2633 Innisfil, Canada, 44.3000, -79.5833 Turda, Romania, 46.5667, 23.7833 Shinas, Oman, 24.7426, 56.4670 Hueyapan de Ocampo, Mexico, 18.1500, -95.1500 El Cua, Nicaragua, 13.3675, -85.6733 General Pacheco, Argentina, -34.4500, -58.6500 Kottoppadam, India, 10.9979, 76.3914 Douar Bni Malek, Morocco, 34.7800, -5.6425 El Asintal, Guatemala, 14.6000, -91.7333 Zhongbu, Taiwan, 23.4082, 120.5343 Lota, Chile, -37.0833, -73.1667 San Clemente, Chile, -35.5500, -71.4833 Andes, Colombia, 5.5833, -75.9167 Vaudreuil-Dorion, Canada, 45.4000, -74.0333 Alenquer, Portugal, 39.0531, -9.0092 Huber Heights, United States, 39.8595, -84.1130 Vargem Grande, Brazil, -3.5428, -43.9158 San Sebastian Huehuetenango, Guatemala, 15.3833, -91.5833 Konarak, Iran, 25.3589, 60.3992 Aleksinac, Serbia, 43.5383, 21.7047 Paso de los Libres, Argentina, -29.7167, -57.0833 Ocozocoautla de Espinosa, Mexico, 16.7500, -93.3667 Mahallat, Iran, 33.9056, 50.4572 West Babylon, United States, 40.7129, -73.3585 Kula, Turkey, 38.5458, 28.6494 Khawr Fakkan, United Arab Emirates, 25.3333, 56.3500 Chalons-en-Champagne, France, 48.9575, 4.3650 Braintree, United Kingdom, 51.8780, 0.5500 Ambasamudram, India, 8.7037, 77.4527 Vergina, Greece, 40.5203, 22.2019 Veroia, Greece, 40.5167, 22.2000 Laurel, Philippines, 14.0504, 120.9323 Yeola, India, 20.0420, 74.4890 Nagaizumi, Japan, 35.1377, 138.8972 Shanshan, China, 27.8203, 112.0164 South Upi, Philippines, 6.8548, 124.1443 Kapan, Armenia, 39.2011, 46.4150 Aguazul, Colombia, 5.1731, -72.5547 Darcheh, Iran, 32.6131, 51.5531 Berchem, Belgium, 51.2000, 4.4167 Alimos, Greece, 37.9167, 23.7167 Dock Sur, Argentina, -34.6417, -58.3478 Delaware, United States, 40.2851, -83.0741 San al Hajar al Qibliyah, Egypt, 30.9769, 31.8800 Sonaguera, Honduras, 15.6185, -86.2712 Zhangliangcun, China, 37.0624, 112.0078 Baniyas, Syria, 35.1819, 35.9487 Kozlu, Turkey, 41.4333, 31.7500 Chicaman, Guatemala, 15.3483, -90.7994 Cumaribo, Colombia, 4.4333, -69.8000 Maissade, Haiti, 19.1761, -72.1396 Svitlovodsk, Ukraine, 49.0503, 33.2419 Schertz, United States, 29.5650, -98.2535 Khutubi, China, 44.1874, 86.8946 Rantepao, Indonesia, -2.9690, 119.9000 Kayalpattanam, India, 8.5638, 78.1246 Kobayashi, Japan, 31.9967, 130.9725 Inabe, Japan, 35.1156, 136.5614 Sanjiao, China, 22.4348, 113.1061 Vargem Grande do Sul, Brazil, -21.8322, -46.8936 North Miami Beach, United States, 25.9302, -80.1659 Macenta, Guinea, 8.5504, -9.4800 Et Taiyiba, Israel, 32.2667, 35.0000 Bakau, Gambia, The, 13.4833, -16.6833 Taketoyo, Japan, 34.8511, 136.9147 Rudauli, India, 26.7500, 81.7500 Hatfield, United Kingdom, 51.7636, -0.2258 Voorburg, Netherlands, 52.0700, 4.3550 Lucena, Spain, 37.4089, -4.4853 Chateauroux, France, 46.8103, 1.6911 Dhaka, India, 26.7200, 85.3300 Woonsocket, United States, 42.0010, -71.4993 Lubao, Congo (Kinshasa), -5.3850, 25.7450 Tesanj, Bosnia and Herzegovina, 44.6119, 17.9855 Makinohara, Japan, 34.7333, 138.2167 Yatomi, Japan, 35.1167, 136.7167 Barhiya, India, 25.2833, 86.0333 Kattivakkam, India, 13.2167, 80.3167 Betun, Indonesia, -9.4953, 124.9603 Nova Venecia, Brazil, -18.7108, -40.4008 Kingston upon Thames, United Kingdom, 51.4103, -0.2995 Jesus Maria, Mexico, 21.9667, -102.3500 Gualeguay, Argentina, -33.1500, -59.3333 Pengzhen, China, 30.5833, 103.8751 Santa Cruz, Portugal, 32.6750, -16.8309 Hollister, United States, 36.8555, -121.3986 Kamen, Germany, 51.5917, 7.6653 Tiznit, Morocco, 29.7167, -9.7167 Agcabadi, Azerbaijan, 40.0489, 47.4502 Garbahaarrey, Somalia, 3.3500, 42.2667 Yepocapa, Guatemala, 14.5000, -90.9500 Abucay, Philippines, 14.7222, 120.5354 Vyshneve, Ukraine, 50.3869, 30.3581 Valenciennes, France, 50.3581, 3.5233 Periyakulam, India, 10.1239, 77.5475 Cuchi, Angola, -14.6500, 16.9000 Lai Chau, Vietnam, 22.3992, 103.4392 Middleton, United Kingdom, 53.5550, -2.1870 Jatibonico, Cuba, 21.9464, -79.1675 Heist-op-den-Berg, Belgium, 51.0758, 4.7286 San Cristobal Totonicapan, Guatemala, 14.9167, -91.4333 Nandongcun, China, 38.1024, 114.7658 Nandazhang, China, 38.0826, 114.7616 Livny, Russia, 52.4239, 37.5997 Badulla, Sri Lanka, 6.9847, 81.0564 Char Fasson, Bangladesh, 22.1865, 90.7610 Zhangcun, China, 38.1333, 114.9333 Bairagnia, India, 26.7381, 85.2736 Sevanagala, Sri Lanka, 6.3635, 80.9197 Pirthipur, India, 25.1853, 78.6650 Seevetal, Germany, 53.3833, 9.9667 Bradford West Gwillimbury, Canada, 44.1333, -79.6333 Tepalcatepec, Mexico, 19.1833, -102.8500 Villaba, Philippines, 11.2200, 124.4000 Shimabara, Japan, 32.7881, 130.3703 Mahbubabad, India, 17.6167, 80.0167 Bron, France, 45.7394, 4.9139 Campbell, United States, 37.2802, -121.9539 Santo Tomas, Philippines, 15.0000, 120.7500 Kalaiya, Nepal, 27.0333, 85.0000 Buffalo Grove, United States, 42.1675, -87.9615 Eisenach, Germany, 50.9761, 10.3206 Puerto Colombia, Colombia, 11.0167, -74.8833 King's Lynn, United Kingdom, 52.7540, 0.3980 Salaberry-de-Valleyfield, Canada, 45.2500, -74.1300 Laguna, Brazil, -28.4828, -48.7808 Edmonds, United States, 47.8115, -122.3533 Thionville, France, 49.3589, 6.1692 Itapecuru Mirim, Brazil, -3.3928, -44.3589 Ban Pet, Thailand, 16.4262, 102.7609 Nueva Valencia, Philippines, 10.5259, 122.5398 Al Badari, Egypt, 26.9925, 31.4156 Limbdi, India, 22.5685, 71.7949 Barreiros, Brazil, -8.8183, -35.1864 Dunakeszi, Hungary, 47.6297, 19.1381 Schwabisch Hall, Germany, 49.1122, 9.7375 Atenco, Mexico, 19.5167, -98.9167 Bukama, Congo (Kinshasa), -9.2000, 25.8333 Catonsville, United States, 39.2646, -76.7424 Naranjo, Costa Rica, 10.1053, -84.3885 Ciechanow, Poland, 52.8667, 20.6333 Lokeren, Belgium, 51.1000, 3.9833 Gravina in Puglia, Italy, 40.8206, 16.4233 Castres, France, 43.6000, 2.2500 Thol, India, 23.0674, 72.5121 Taniyama-chuo, Japan, 31.5211, 130.5176 Orlandia, Brazil, -20.7203, -47.8867 Musina, South Africa, -22.3381, 30.0417 Meru, Kenya, 0.0500, 37.6500 Amberg, Germany, 49.4444, 11.8483 Jincheng, Taiwan, 24.4167, 118.3167 Manassas, United States, 38.7479, -77.4838 Proper Bansud, Philippines, 12.8594, 121.4567 Nakano, Japan, 36.7420, 138.3694 Quinhamel, Guinea-Bissau, 11.8833, -15.8500 Evere, Belgium, 50.8667, 4.4000 Kafr al Kurdi, Egypt, 31.1684, 31.7655 Cabo Bojador, Morocco, 26.1333, -14.5000 Barpeta, India, 26.3200, 91.0000 Vineyard, United States, 38.4740, -121.3240 Webuye, Kenya, 0.6004, 34.7712 Puyallup, United States, 47.1793, -122.2902 Fareham, United Kingdom, 50.8500, -1.1800 Miranda, Colombia, 3.2500, -76.2500 Kharik, India, 25.3679, 87.0026 Mondoro, Mali, 14.6717, -1.9511 El Affroun, Algeria, 36.4667, 2.6333 Sukheke Mandi, Pakistan, 31.8833, 73.4667 Kalmar, Sweden, 56.6643, 16.3656 Arras, France, 50.2920, 2.7800 Biella, Italy, 45.5664, 8.0533 Tecoanapa, Mexico, 16.8000, -99.1500 Zharkent, Kazakhstan, 44.1667, 80.0000 San Bruno, United States, 37.6256, -122.4313 Lloret de Mar, Spain, 41.7000, 2.8333 Sibenik, Croatia, 43.7339, 15.8956 Awaji, Japan, 34.4333, 134.9167 Salar, India, 23.7748, 88.1026 Coachella, United States, 33.6905, -116.1430 Nyunzu, Congo (Kinshasa), -5.9500, 28.0333 La Orotava, Spain, 28.3906, -16.5247 Simao Dias, Brazil, -10.7378, -37.8108 Shuilou, China, 22.3403, 112.8019 Machali, Chile, -34.1825, -70.6514 Mata de Sao Joao, Brazil, -12.5300, -38.2989 Panitan, Philippines, 11.4639, 122.7694 Jefferson City, United States, 38.5676, -92.1759 Laatzen, Germany, 52.3167, 9.8000 Jose de Freitas, Brazil, -4.7558, -42.5758 Thomassique, Haiti, 19.0821, -71.8385 Jajpur, India, 21.2140, 86.1070 Sokoura, Mali, 14.5461, -4.0914 French Valley, United States, 33.5999, -117.1069 Tamu, Burma, 24.2167, 94.3097 Uruacu, Brazil, -14.5250, -49.1408 Alluru, India, 15.1336, 78.4975 Guarda, Portugal, 40.5364, -7.2683 Maroantsetra, Madagascar, -15.4333, 49.7333 Balabac, Philippines, 7.9800, 117.0500 El Charco, Colombia, 2.4775, -78.1111 Kota, Japan, 34.8645, 137.1657 Loufan, China, 38.0694, 111.7911 Kadalur, India, 11.1333, 75.8167 Itapa-Ekiti, Nigeria, 7.8131, 5.3844 Nagykanizsa, Hungary, 46.4558, 16.9975 Mariel, Cuba, 22.9936, -82.7539 Homburg, Germany, 49.3167, 7.3333 San Giorgio a Cremano, Italy, 40.8333, 14.3333 Jambughoda, India, 22.3667, 73.7167 Bairuo, China, 28.4782, 112.8048 Midland, United States, 43.6241, -84.2319 Karsiyang, India, 26.8778, 88.2772 Maubin, Burma, 16.7300, 95.6500 Dilbeek, Belgium, 50.8450, 4.2650 Tucuran, Philippines, 7.8547, 123.5783 Singhanakhon, Thailand, 7.2390, 100.5527 Sanarate, Guatemala, 14.7950, -90.1922 Carranglan, Philippines, 15.9608, 121.0631 San Rafael del Sur, Nicaragua, 11.8500, -86.4500 Santa Cruz, Philippines, 13.0831, 120.7192 Beverly, United States, 42.5681, -70.8627 Santos Dumont, Brazil, -21.4567, -43.5525 Mableton, United States, 33.8133, -84.5655 Xidiancun, China, 29.4787, 121.4368 Bassano del Grappa, Italy, 45.7667, 11.7342 Bang Kruai, Thailand, 13.8050, 100.4728 Dreieich, Germany, 50.0000, 8.7000 Garges-les-Gonesse, France, 48.9728, 2.4008 Bhatpalli, India, 18.4293, 79.8635 Santa Rita, Philippines, 11.4522, 124.9408 Kotabumi, Indonesia, -4.8333, 104.9000 Than, India, 22.5667, 71.1833 Acatlan de Perez Figueroa, Mexico, 18.5333, -96.6000 Laungowal, India, 30.2167, 75.6833 Akaiwa, Japan, 34.7553, 134.0189 Shenjiatun, China, 40.5910, 114.9500 Yaguate, Dominican Republic, 18.3300, -70.1800 Qa'en, Iran, 33.7333, 59.1811 Rupsa, India, 21.6167, 87.0167 Krasnodon, Ukraine, 48.3000, 39.7333 Ben Zakkay, Israel, 31.8833, 34.7333 Rouyn-Noranda, Canada, 48.2333, -79.0167 Tome, Chile, -36.6167, -72.9500 Iten, Kenya, 0.6703, 35.5081 Ansbach, Germany, 49.3000, 10.5833 Pallisa, Uganda, 1.1675, 33.7100 Kasai, Japan, 34.9333, 134.8333 Anglet, France, 43.4850, -1.5183 Alghero, Italy, 40.5600, 8.3150 Llanera, Philippines, 15.6625, 121.0197 Futtsu, Japan, 35.3041, 139.8570 Coronel Suarez, Argentina, -37.4667, -61.9333 Goryachiy Klyuch, Russia, 44.6333, 39.1333 Alerce, Chile, -41.4000, -72.9333 Polanco, Philippines, 8.5319, 123.3631 Juventino Rosas, Mexico, 20.6500, -101.0000 Maniwa, Japan, 35.0758, 133.7525 Kutno, Poland, 52.2333, 19.3667 Hoddesdon, United Kingdom, 51.7590, -0.0150 Myanaung, Burma, 18.2833, 95.3167 Marki, Poland, 52.3333, 21.1000 Akbarpur, India, 26.4333, 82.5403 President Quirino, Philippines, 6.7000, 124.7300 Danville, United States, 36.5831, -79.4088 Moline, United States, 41.4821, -90.4920 Viborg, Denmark, 56.4333, 9.4000 Palladam, India, 10.9900, 77.2000 Uozu, Japan, 36.8273, 137.4092 Hilvan, Turkey, 37.5886, 38.9556 Liloy, Philippines, 8.1228, 122.6736 Karmegh, India, 26.5307, 86.4263 Blanes, Spain, 41.6760, 2.7930 Aritao, Philippines, 16.2973, 121.0338 Bullhead City, United States, 35.1205, -114.5461 Smederevska Palanka, Serbia, 44.3655, 20.9587 Machang, China, 26.5634, 106.1103 Villenave-d'Ornon, France, 44.7806, -0.5658 Peachtree Corners, United States, 33.9670, -84.2320 Sarakhs, Iran, 36.5425, 61.1589 Kirchheim unter Teck, Germany, 48.6483, 9.4511 Qapshaghay, Kazakhstan, 43.8844, 77.0687 Jocotepec, Mexico, 20.2863, -103.4304 Amontada, Brazil, -3.3608, -39.8308 Puerto Real, Spain, 36.5292, -6.1919 Nysa, Poland, 50.4714, 17.3339 Morarano Chrome, Madagascar, -17.7613, 48.1655 Claveria, Philippines, 12.9035, 123.2457 Liantang, China, 22.8791, 111.7480 Coburg, Germany, 50.2667, 10.9667 Anakaputtur, India, 12.9823, 80.1282 Angelholm, Sweden, 56.2500, 12.8667 Caceres, Colombia, 7.6667, -75.3333 Jinotepe, Nicaragua, 11.8500, -86.2000 Pardes Hanna Karkur, Israel, 32.4711, 34.9675 Kalol, India, 22.6060, 73.4630 Azemmour, Morocco, 33.2878, -8.3422 Villa Bisono, Dominican Republic, 19.5600, -70.8700 Bom Conselho, Brazil, -9.1700, -36.6800 Esperanza, Argentina, -31.4427, -60.9257 Pratapgarh, India, 24.0300, 74.7800 Linton Hall, United States, 38.7551, -77.5750 Coyuca de Catalan, Mexico, 18.3256, -100.6992 Bourg-en-Bresse, France, 46.2056, 5.2289 Paraiba do Sul, Brazil, -22.1619, -43.2928 Guaratuba, Brazil, -25.8828, -48.5750 Satka, Russia, 55.0500, 59.0333 Quesada, Costa Rica, 10.3441, -84.4199 Imperia, Italy, 43.8865, 8.0297 Soran, Kazakhstan, 49.7833, 72.8500 Sarab, Iran, 37.9422, 47.5361 Guaraciaba do Norte, Brazil, -4.1669, -40.7478 Zhovti Vody, Ukraine, 48.3500, 33.5000 Madridejos, Philippines, 11.2700, 123.7300 Mampong, Ghana, 7.0627, -1.4001 San Jose de Bocay, Nicaragua, 13.5333, -85.5333 Miercurea-Ciuc, Romania, 46.3594, 25.8017 Coppell, United States, 32.9639, -96.9903 Siegburg, Germany, 50.8014, 7.2044 Wangyuanqiao, China, 38.3849, 106.2664 Nathdwara, India, 24.9300, 73.8200 Dronten, Netherlands, 52.5242, 5.7125 Pachkhal, Nepal, 27.6500, 85.6167 Tinpiple, Nepal, 27.6283, 85.6136 Kallar, India, 9.8500, 77.1333 Santa Rosa del Sur, Colombia, 7.9667, -74.0500 Songhuajiangcun, China, 44.7158, 125.9544 Lebrija, Colombia, 7.1131, -73.2189 Qiryat Mozqin, Israel, 32.8333, 35.0833 Stip, North Macedonia, 41.7358, 22.1914 Myedu, Burma, 23.1833, 95.4000 Cantaura, Venezuela, 9.3111, -64.3594 Bor, Turkey, 37.8964, 34.5628 Shelekhov, Russia, 52.2167, 104.1167 Lingquan, China, 36.9985, 110.8417 Muttayyapuram, India, 8.7498, 78.1311 Greenock, United Kingdom, 55.9500, -4.7650 Sao Lourenco do Sul, Brazil, -31.3650, -51.9778 Matnog, Philippines, 12.5856, 124.0856 Annandale, United States, 38.8324, -77.1960 Mercedes, Uruguay, -33.2500, -58.0333 Zhujiacun, China, 26.3204, 104.3957 Puerto Galera, Philippines, 13.5000, 120.9542 Yangcunzai, China, 23.4338, 114.4664 Yagoua, Cameroon, 10.3428, 15.2406 Nuevo San Carlos, Guatemala, 14.6000, -91.7000 Lebanon, United States, 36.2040, -86.3481 Tactic, Guatemala, 15.3167, -90.3511 Marataizes, Brazil, -21.0428, -40.8239 Ho Nai, Vietnam, 10.9725, 106.8789 Santa Maria Atzompa, Mexico, 17.1014, -96.7778 Altadena, United States, 34.1927, -118.1346 Tiel, Netherlands, 51.8833, 5.4333 Oizumi, Japan, 36.2478, 139.4049 Moroleon, Mexico, 20.1333, -101.2000 Tieshansi, China, 30.2064, 114.9003 Tororo, Uganda, 0.6928, 34.1811 Minamishimabara, Japan, 32.6597, 130.2978 Amadeo, Philippines, 14.1728, 120.9277 Qiryat Ono, Israel, 32.0636, 34.8553 Kibawe, Philippines, 7.5678, 124.9903 Cortlandt, United States, 41.2552, -73.9018 San Luis Acatlan, Mexico, 16.5333, -98.0500 Ban Wat Lak Hok, Thailand, 13.5520, 99.9898 Barauli, India, 26.3815, 84.5872 Beverwijk, Netherlands, 52.4833, 4.6500 Macaubas, Brazil, -13.0189, -42.6989 Montenegro, Colombia, 4.5671, -75.7504 Marialva, Brazil, -23.4850, -51.7919 Quezon, Philippines, 15.5542, 120.8111 Land O' Lakes, United States, 28.2075, -82.4476 Yinggen, China, 19.0372, 109.8283 Tadjenanet, Algeria, 36.1167, 5.9833 Grove City, United States, 39.8654, -83.0690 Lyudinovo, Russia, 53.8667, 34.4333 Germering, Germany, 48.1333, 11.3667 Coyotepec, Mexico, 19.7500, -99.1711 San Miguel, Philippines, 8.9322, 126.0403 Miura, Japan, 35.1500, 139.6167 Palmares, Costa Rica, 10.0466, -84.4373 Diamond Harbour, India, 22.1927, 88.1895 Jardinopolis, Brazil, -21.0178, -47.7639 Civitanova Marche, Italy, 43.3068, 13.7286 Tadif, Syria, 36.3481, 37.5309 Koniz, Switzerland, 46.9250, 7.4153 Surampatti, India, 11.3411, 77.6956 Uden, Netherlands, 51.6667, 5.6167 Hodmezovasarhely, Hungary, 46.4303, 20.3189 Velasco Ibarra, Ecuador, -1.0439, -79.6383 Bagnolet, France, 48.8692, 2.4181 Kasibu, Philippines, 16.3181, 121.2958 Paicandu, Brazil, -23.4575, -52.0486 Dacun, China, 34.7201, 109.0549 Bensheim, Germany, 49.6667, 8.6167 Narayanpet, India, 16.7445, 77.4960 Torres, Brazil, -29.3350, -49.7269 El Consejo, Venezuela, 10.2442, -67.2450 Naga, Philippines, 7.7978, 122.6944 Boucherville, Canada, 45.6000, -73.4500 Santa Barbara, Honduras, 14.9216, -88.2364 Saidpur Dabra, India, 25.3207, 87.1793 Fenoarivo Atsinanana, Madagascar, -17.3819, 49.4090 Shadegan, Iran, 30.6492, 48.6653 Urmston, United Kingdom, 53.4487, -2.3747 Teboulba, Tunisia, 35.6700, 10.9000 Danderesso, Mali, 11.4867, -5.4819 Belleville, United States, 38.5164, -89.9900 Bodo, Norway, 67.2827, 14.3751 Campechuela, Cuba, 20.2333, -77.2792 Otavalo, Ecuador, 0.2303, -78.2625 Post Falls, United States, 47.7213, -116.9384 Tavas, Turkey, 37.5728, 29.0714 Varash, Ukraine, 51.3444, 25.8508 Oued Fodda, Algeria, 36.1833, 1.5333 Santa Eulalia del Rio, Spain, 38.0000, 59.0000 Tolosa, Argentina, -34.8942, -57.9647 Eberswalde, Germany, 52.8333, 13.8333 Kampong Chhnang, Cambodia, 12.2500, 104.6667 Billerica, United States, 42.5587, -71.2673 Salinas, Brazil, -15.4000, -43.1667 Marion, United States, 42.0451, -91.5850 Boumerdes, Algeria, 36.7603, 3.4724 Pueblo Nuevo, Colombia, 8.5008, -75.5072 Gonzaga, Philippines, 18.2614, 121.9969 Hempfield, United States, 40.2847, -79.5841 Litian Gezhuang, China, 39.8151, 119.0219 Wunstorf, Germany, 52.4275, 9.4294 Halfeti, Turkey, 37.2289, 37.9457 Prerov, Czechia, 49.4556, 17.4511 Bayt al Faqih, Yemen, 14.5161, 43.3244 Jaltipan de Morelos, Mexico, 17.9703, -94.7144 Ponneri, India, 13.3200, 80.2000 Konigswinter, Germany, 50.6736, 7.1947 Larantuka, Indonesia, -8.3133, 123.0042 Soe, Indonesia, -9.8667, 124.2833 Fitchburg, United States, 42.5912, -71.8156 Volklingen, Germany, 49.2500, 6.8333 Antequera, Spain, 37.0183, -4.5597 Gay, Russia, 51.4678, 58.4431 Daram, Philippines, 11.6341, 124.7947 Ambohitrimanjaka, Madagascar, -18.8589, 47.4422 Yuzawa, Japan, 39.1641, 140.4948 Shefar`am, Israel, 32.8056, 35.1694 Oqtosh Shahri, Uzbekistan, 39.9269, 65.9256 Huckelhoven, Germany, 51.0608, 6.2197 Berubari, India, 26.3603, 88.7152 Ayagoz, Kazakhstan, 47.9667, 80.4333 Brookfield, United States, 43.0640, -88.1231 Rajgir, India, 25.0300, 85.4200 Socorro, Philippines, 13.0583, 121.4117 Santa Cruz de Los Taques, Venezuela, 11.8240, -70.2509 Sipe Sipe, Bolivia, -17.4500, -66.3833 Shetou, Taiwan, 23.9076, 120.5992 San Pedro Necta, Guatemala, 15.5000, -91.7667 Dubrovnik, Croatia, 42.6403, 18.1083 Santa Helena, Brazil, -2.2308, -45.3000 Pimpalgaon Baswant, India, 20.1667, 73.9833 Erzin, Turkey, 36.9533, 36.2033 Indi, India, 17.1773, 75.9526 Amuntai, Indonesia, -2.4177, 115.2494 Rajaori, India, 33.3767, 74.3122 Slobozia, Romania, 44.5639, 27.3661 Aguas Belas, Brazil, -9.1167, -37.1167 Anda, Philippines, 16.2896, 119.9491 Patulul, Guatemala, 14.4167, -91.1667 Yarumal, Colombia, 7.0000, -75.5000 Copan, Honduras, 14.8333, -89.1500 Tagudin, Philippines, 16.9361, 120.4464 San Dona di Piave, Italy, 45.6298, 12.5641 Nalhati, India, 24.2940, 87.8390 Ventanas, Ecuador, -1.4500, -79.4700 Sanand, India, 22.9800, 72.3800 Puntarenas, Costa Rica, 9.9667, -84.8333 Coram, United States, 40.8812, -73.0059 Redcliff, Zimbabwe, -19.0333, 29.7833 Mission, Canada, 49.1337, -122.3112 Puerto Gaitan, Colombia, 4.3142, -72.0825 Barra dos Coqueiros, Brazil, -10.9089, -37.0389 Maloyaroslavets, Russia, 55.0167, 36.4667 Vawkavysk, Belarus, 53.1667, 24.4667 Marlboro, United States, 40.3427, -74.2567 Villafranca del Panades, Spain, 41.0000, 20.0000 Poti, Georgia, 42.1500, 41.6667 Shimotsuma, Japan, 36.1844, 139.9675 Teaneck, United States, 40.8900, -74.0107 Zugdidi, Georgia, 42.5081, 41.8725 Kodinar, India, 20.8600, 70.8000 Sagauli, India, 26.7639, 84.7434 Golaghat, India, 26.5200, 93.9700 Pileru, India, 13.6549, 78.9471 Princeton, United States, 25.5396, -80.3971 Tuusula, Finland, 60.4333, 25.0500 Igualada, Spain, 41.5833, 1.6167 Sansanne-Mango, Togo, 10.3556, 0.4756 Llavallol, Argentina, -34.7667, -58.3833 Desio, Italy, 45.6167, 9.2167 Memari, India, 23.2000, 88.1200 Nurtingen, Germany, 48.6333, 9.3333 San Antonio del Monte, El Salvador, 13.7167, -89.7333 Bani Suhayla, Gaza Strip, 31.3434, 34.3234 Weslaco, United States, 26.1599, -97.9877 Tabogon, Philippines, 10.9300, 124.0300 Svay Rieng, Cambodia, 11.0833, 105.8000 Angouleme, France, 45.6500, 0.1600 Lusambo, Congo (Kinshasa), -4.9729, 23.4368 Mondragon, Philippines, 12.5200, 124.7500 Kendraparha, India, 20.5000, 86.4200 Villa Angela, Argentina, -27.5833, -60.7167 Shelton, United States, 41.3060, -73.1383 Nebbi, Uganda, 2.4792, 31.0900 Marlborough, United States, 42.3494, -71.5468 Dunaujvaros, Hungary, 46.9833, 18.9167 Tortuguitas, Argentina, -34.4750, -58.7556 San, Mali, 13.3004, -4.9000 Schwabach, Germany, 49.3292, 11.0208 Naini Tal, India, 29.3919, 79.4542 Tozeur, Tunisia, 33.9167, 8.1333 Sao Miguel do Guama, Brazil, -1.6269, -47.4828 Santa Cruz, Philippines, 17.0853, 120.4553 Maulavi Bazar, Bangladesh, 24.4889, 91.7708 Bambari, Central African Republic, 5.7653, 20.6742 Kitaibaraki, Japan, 36.8019, 140.7510 Tuchin, Colombia, 9.1833, -75.5500 Obita, Japan, 32.8253, 129.8753 Tezoyuca, Mexico, 19.7500, -99.1833 Ramganj Mandi, India, 24.6472, 75.9444 El Tocuyo, Venezuela, 9.7822, -69.7931 Santo Antonio de Padua, Brazil, -21.5389, -42.1800 Nurdagi, Turkey, 37.1789, 36.7397 Mahalapye, Botswana, -23.1041, 26.8142 Uray, Russia, 60.1333, 64.8000 Meiganga, Cameroon, 6.5300, 14.3700 Arauquita, Colombia, 7.0303, -71.4356 Milton, United States, 34.1353, -84.3139 San Lorenzo, Honduras, 13.4213, -87.4487 Alcala, Philippines, 17.9031, 121.6556 Caloundra, Australia, -26.8047, 153.1338 Alcalde Diaz, Panama, 9.1227, -79.5567 Buchholz in der Nordheide, Germany, 53.3167, 9.8667 Leigh, United Kingdom, 53.4975, -2.5150 Jayamkondacholapuram, India, 11.2127, 79.3637 Zarinsk, Russia, 53.7089, 84.9672 Cherupulassheri, India, 10.8793, 76.3148 Guacimo, Costa Rica, 10.2025, -83.6223 Mikolow, Poland, 50.1667, 18.9000 Wijchen, Netherlands, 51.8067, 5.7211 Panchimalco, El Salvador, 13.6167, -89.1833 Rancho Palos Verdes, United States, 33.7554, -118.3634 Buxtehude, Germany, 53.4769, 9.7011 Neumarkt, Germany, 49.2833, 11.4667 Niquero, Cuba, 20.0472, -77.5781 Fredericia, Denmark, 55.5758, 9.7617 Chaves, Portugal, 41.7399, -7.4707 Rozzano, Italy, 45.3833, 9.1500 Nordhausen, Germany, 51.5050, 10.7911 Maayon, Philippines, 11.3903, 122.7828 Schweizer-Reineke, South Africa, -27.1833, 25.3333 Lasam, Philippines, 18.0700, 121.6000 Hallandale Beach, United States, 25.9854, -80.1423 Hoboken, Belgium, 51.1667, 4.3667 Mangaratiba, Brazil, -22.9600, -44.0408 Sensuntepeque, El Salvador, 13.8667, -88.6333 Saundatti, India, 15.7833, 75.1167 Constitucion, Chile, -35.3333, -72.4167 Bacong, Philippines, 9.2464, 123.2948 Tuquerres, Colombia, 1.0833, -77.6167 Woburn, United States, 42.4869, -71.1543 Trikarpur North, India, 12.1439, 75.1789 Shutayil, India, 12.1439, 75.1789 Brighton, United States, 39.9716, -104.7963 Agar, India, 23.7118, 76.0157 San Jose de Urquico, Philippines, 15.4781, 120.4639 Tanxia, China, 23.9475, 115.5361 Zakynthos, Greece, 37.8000, 20.7500 Claypole, Argentina, -34.8000, -58.3333 Peddapalli, India, 18.6162, 79.3832 Villa Alsina, Argentina, -34.6667, -58.4167 Kirkkonummi, Finland, 60.1167, 24.4333 Sevilla, Colombia, 4.2689, -75.9361 Geel, Belgium, 51.1661, 4.9919 Indian Trail, United States, 35.0699, -80.6452 Santo Estevao, Brazil, -12.4300, -39.2508 Bilasipara, India, 26.2328, 90.2341 Timmins, Canada, 48.4667, -81.3333 Guaduas, Colombia, 5.0694, -74.5981 Toritama, Brazil, -8.0067, -36.0567 Matiguas, Nicaragua, 12.8333, -85.4667 Palia Kalan, India, 28.4500, 80.5833 Torzhok, Russia, 57.0333, 34.9667 Jose Marmol, Argentina, -34.7833, -58.3667 Halol, India, 22.5000, 73.4700 Washuk, Pakistan, 27.7231, 64.8122 Ganta, Liberia, 7.2375, -8.9814 Mambajao, Philippines, 9.2500, 124.7200 Embu, Kenya, -0.5333, 37.4500 Huizen, Netherlands, 52.3000, 5.2500 Ambam, Cameroon, 2.3833, 11.2833 La Libertad, Philippines, 10.0300, 123.2200 Sevilla de Niefang, Equatorial Guinea, 1.8500, 10.2500 Rivas, Nicaragua, 11.4393, -85.8270 Ambositra, Madagascar, -20.5294, 47.2425 Merano, Italy, 46.6696, 11.1594 Bujanovac, Serbia, 42.4667, 21.7667 Komoro, Japan, 36.3275, 138.4258 Ishaka, Uganda, -0.5450, 30.1383 Sumoto, Japan, 34.3500, 134.9000 Tagbina, Philippines, 8.4578, 126.1578 Amami, Japan, 28.3783, 129.4944 Freiberg, Germany, 50.9119, 13.3428 Pozi, Taiwan, 23.4611, 120.2420 Arraijan, Panama, 8.9398, -79.6404 Boulogne-sur-Mer, France, 50.7264, 1.6147 Reynoldsburg, United States, 39.9588, -82.7943 Unzen, Japan, 32.8353, 130.1875 Tampakan, Philippines, 6.4500, 124.9300 Jerada, Morocco, 34.3117, -2.1636 Ciudad Dario, Nicaragua, 12.7167, -86.1167 Bazar-Korgon, Kyrgyzstan, 41.0376, 72.7459 Ciudad Vieja, Guatemala, 14.5233, -90.7667 Sarande, Albania, 39.8770, 20.0000 Dongyangshi, China, 28.2133, 113.3997 Shengaocun, China, 32.5844, 120.1336 Dongluocun, China, 22.3994, 107.6850 Segovia, Colombia, 7.0781, -74.7017 Chambas, Cuba, 22.1967, -78.9133 Welling, United Kingdom, 51.4594, 0.1097 Upper Hutt, New Zealand, -41.1333, 175.0500 Gatunda, Rwanda, -1.4350, 30.0211 Romeoville, United States, 41.6318, -88.0997 Temryuk, Russia, 45.2667, 37.3667 Hongfengcun, China, 21.9231, 111.9329 Wujie, Taiwan, 24.7000, 121.7833 Maplewood, United States, 44.9842, -93.0247 Monterotondo, Italy, 42.0500, 12.6167 Patti, India, 31.2800, 74.8600 Esperantina, Brazil, -3.9019, -42.2339 Paranaiba, Brazil, -19.6769, -51.1908 Drogheda, Ireland, 53.7150, -6.3525 Ilkeston, United Kingdom, 52.9711, -1.3092 Lynnwood, United States, 47.8284, -122.3033 Nanbei, Japan, 35.3167, 139.1000 Dowlatabad, Iran, 32.8003, 51.6958 Maddela, Philippines, 16.3411, 121.6833 Pirmasens, Germany, 49.2000, 7.6000 Lijiaxiang, China, 39.5556, 116.4292 Yingzhou Linchang, China, 18.4199, 109.8553 Salinopolis, Brazil, -0.6136, -47.3561 Famagusta, Cyprus, 35.1250, 33.9417 Ciudad Piar, Venezuela, 7.4522, -63.3200 Colomiers, France, 43.6139, 1.3367 Dhamdaha, India, 25.7435, 87.1835 Muana, Brazil, -1.5283, -49.2167 Delijan, Iran, 33.9903, 50.6836 Velika Plana, Serbia, 44.3333, 21.0833 Lancaster, United States, 39.7248, -82.6049 Covington, United States, 39.0334, -84.5166 Jalalpur Bhattian, Pakistan, 32.0644, 73.3770 Talukkara, India, 10.9500, 75.9097 Wattrelos, France, 50.7000, 3.2170 Meftah, Algeria, 36.6167, 3.2333 Kimry, Russia, 56.8667, 37.3500 Apostoles, Argentina, -27.9167, -55.7667 Malilipot, Philippines, 13.3200, 123.7300 Patzicia, Guatemala, 14.6317, -90.9269 Santo Tomas, Philippines, 16.2800, 120.3800 Talcher, India, 20.9500, 85.2300 Cuito Cuanavale, Angola, -15.1667, 19.1667 Promissao, Brazil, -21.5369, -49.8583 Anyuan, China, 34.8808, 105.2764 Mount Juliet, United States, 36.1990, -86.5115 Qadian, India, 31.8192, 75.3764 Friendswood, United States, 29.5110, -95.1981 Fourou, Mali, 10.7397, -6.1439 Mobo, Philippines, 12.3372, 123.6581 Pamban, India, 9.2790, 79.2109 Thotada, India, 11.8430, 75.4214 Abadan, Turkmenistan, 38.0517, 58.2100 Germantown, United States, 35.0829, -89.7824 Compiegne, France, 49.4149, 2.8231 Azrou, Morocco, 33.4417, -5.2247 Saint-Germain-en-Laye, France, 48.8989, 2.0938 Kitob, Uzbekistan, 39.1336, 66.8819 Poissy, France, 48.9294, 2.0456 Currais Novos, Brazil, -6.2608, -36.5150 Gagny, France, 48.8833, 2.5333 Draguignan, France, 43.5403, 6.4667 Vallehermoso, Philippines, 10.3300, 123.3200 Mariinsk, Russia, 56.2000, 87.7833 Vavveru, India, 14.5594, 79.8725 Elmali, Turkey, 36.7333, 29.9000 Gonabad, Iran, 34.3575, 58.6783 Lancaster, United States, 32.5922, -96.7739 Sidi Moussa, Algeria, 36.6056, 3.0886 Soria, Spain, 41.7667, -2.4667 Baichigan, China, 39.5317, 115.9117 Annapolis, United States, 38.9706, -76.5047 Meadow Woods, United States, 28.3698, -81.3467 Sassuolo, Italy, 44.5517, 10.7856 Lobo, Philippines, 13.6473, 121.2104 Kingswood, United Kingdom, 51.4600, -2.5050 Pie de Pato, Colombia, 5.5333, -77.0000 Buddh Gaya, India, 24.6981, 84.9869 Shanhe, China, 35.4950, 108.3519 Kato, Japan, 34.9167, 134.9667 Ozu, Japan, 33.5000, 132.5500 Khowrmuj, Iran, 28.6572, 51.3811 Arys, Kazakhstan, 42.4333, 68.8000 Ipiau, Brazil, -14.1369, -39.7339 Dunstable, United Kingdom, 51.8860, -0.5210 Vasto, Italy, 42.1115, 14.7065 Mambusao, Philippines, 11.4300, 122.5953 Maragondon, Philippines, 14.2700, 120.7300 Itabaianinha, Brazil, -11.2739, -37.7900 Qeshm, Iran, 26.9494, 56.2681 Tomar, Portugal, 39.6000, -8.4167 Sukuta, Gambia, The, 13.4167, -16.7000 Kadur, India, 13.5529, 76.0116 Westfield, United States, 42.1382, -72.7561 Sint-Truiden, Belgium, 50.8156, 5.1868 Mundakkal, India, 11.3244, 75.9928 Essex, United States, 39.3021, -76.4449 Sherghati, India, 24.5617, 84.7953 Manalapan, United States, 40.2800, -74.3436 Nanuque, Brazil, -17.8392, -40.3539 Bury Saint Edmunds, United Kingdom, 52.2474, 0.7183 Veles, North Macedonia, 41.7153, 21.7753 Cedar Falls, United States, 42.5195, -92.4536 Avezzano, Italy, 42.0310, 13.4264 Ladispoli, Italy, 41.9544, 12.0742 Artigas, Uruguay, -30.4667, -56.4667 Gap, France, 44.5594, 6.0786 El Aioun, Morocco, 34.5852, -2.5056 Dayr Mawas, Egypt, 27.6414, 30.8494 Santa Rita do Sapucai, Brazil, -22.2519, -45.7028 Burjasot, Spain, 39.5064, -0.4067 Nabas, Philippines, 11.8278, 122.0939 Akyurt, Turkey, 40.1333, 33.0833 Evren, Turkey, 39.0167, 33.8000 Yangtangxu, China, 21.5375, 110.0044 Yatangcun, China, 21.6172, 110.0319 Schorndorf, Germany, 48.8000, 9.5333 Njombe, Tanzania, -9.3333, 34.7667 Samkir, Azerbaijan, 40.8297, 46.0189 Stains, France, 48.9500, 2.3833 Porto de Moz, Brazil, -1.7478, -52.2378 Pilani, India, 28.3700, 75.6000 Remanso, Brazil, -9.6219, -42.0808 Siay, Philippines, 7.7056, 122.8641 Ahaus, Germany, 52.0667, 7.0000 Nowgong, India, 25.0574, 79.4381 Santa Maria da Boa Vista, Brazil, -8.8089, -39.8250 Metlili Chaamba, Algeria, 32.2728, 3.6275 Kearny, United States, 40.7528, -74.1202 Olgiy, Mongolia, 48.9683, 89.9686 Bosconia, Colombia, 9.9761, -73.8903 Janjgir, India, 22.0170, 82.5670 Romblon, Philippines, 12.5500, 122.2800 Padre Las Casas, Dominican Republic, 18.7317, -70.9392 Katsuren-haebaru, Japan, 26.1911, 127.7286 Lemgo, Germany, 52.0272, 8.9117 Bartlett, United States, 41.9804, -88.2071 La Rinconada, Spain, 37.4878, -5.9789 Lordegan, Iran, 31.5094, 50.8344 Penn Hills, United States, 40.4762, -79.8254 Leinfelden-Echterdingen, Germany, 48.6928, 9.1428 Narathiwat, Thailand, 6.4167, 101.8167 San Juan, Philippines, 16.6700, 120.3300 Adwa, Ethiopia, 14.1667, 38.9000 Ciudad Barrios, El Salvador, 13.7667, -88.2667 Macerata, Italy, 43.3003, 13.4533 Cumbal, Colombia, 0.9078, -77.7908 Guariba, Brazil, -21.3600, -48.2283 Erramvaripalem, India, 15.8495, 80.3861 Corigliano Calabro, Italy, 39.6000, 16.5167 Woodlawn, United States, 39.3054, -76.7489 Verkhnyaya Salda, Russia, 58.0456, 60.5533 Zapala, Argentina, -38.9000, -70.0667 Minsk Mazowiecki, Poland, 52.1833, 21.5667 DeKalb, United States, 41.9314, -88.7481 Dacun, Taiwan, 23.9911, 120.5394 Belaya Kalitva, Russia, 48.1833, 40.7667 Bol'shoy Kamen', Russia, 43.1167, 132.3500 Pilate, Haiti, 19.6675, -72.5523 Cauquenes, Chile, -35.9667, -72.3500 Vendrell, Spain, 41.2203, 1.5347 Pine Bluff, United States, 34.2116, -92.0173 Crystal Lake, United States, 42.2333, -88.3351 Krishnarajasagara, India, 12.4398, 76.3828 Rizal, Philippines, 12.4700, 120.9700 Skovde, Sweden, 58.3995, 13.8538 Villanueva, Philippines, 8.5800, 124.7800 Hofheim, Germany, 50.0833, 8.4500 Lakeshore, Canada, 42.2399, -82.6511 Ramsgate, United Kingdom, 51.3360, 1.4160 Marakkara, India, 10.9500, 76.0333 Aracataca, Colombia, 10.5937, -74.1928 Channarayapatna, India, 12.9020, 76.3640 Huaura, Peru, -11.0701, -77.5993 Leyte, Philippines, 11.3700, 124.4800 Alexandria, Romania, 43.9686, 25.3333 Palampur, India, 32.1097, 76.5366 New Berlin, United States, 42.9726, -88.1291 Agano, Japan, 37.8344, 139.2260 Reguiba, Algeria, 33.5667, 6.7167 Lake Oswego, United States, 45.4129, -122.7004 Zainsk, Russia, 55.3000, 52.0167 Almenara, Brazil, -16.1833, -40.7000 Jhabua, India, 22.7677, 74.5909 Vellakkovil, India, 10.9300, 77.7200 Montelimar, France, 44.5581, 4.7508 Bouar, Central African Republic, 5.9500, 15.6000 Cutral-Co, Argentina, -38.9333, -69.2333 Beyneu, Kazakhstan, 45.3247, 55.1958 La Union, Colombia, 3.6539, -76.5722 Balaoan, Philippines, 16.8200, 120.4000 Rubengera, Rwanda, -2.0519, 29.4144 Sabalgarh, India, 26.2500, 77.4000 Yartsevo, Russia, 55.0667, 32.7000 Molina, Chile, -35.1144, -71.2825 Komono, Japan, 35.0167, 136.5000 Kualaserba, Indonesia, 4.2333, 97.8667 Banga, Philippines, 11.6389, 122.3331 Magburaka, Sierra Leone, 8.7211, -11.9494 Hellevoetsluis, Netherlands, 51.8333, 4.1333 Talas, Kyrgyzstan, 42.5184, 72.2429 Payabon, Philippines, 9.7700, 123.1300 Ampana, Indonesia, -0.8667, 121.5833 Shepetivka, Ukraine, 50.1833, 27.0667 Murtajapur, India, 20.7300, 77.5100 Peringalam, India, 11.7137, 75.5860 Autazes, Brazil, -3.5797, -59.1306 Yajalon, Mexico, 17.1833, -92.3167 Tameslouht, Morocco, 31.5000, -8.1000 Findlay, United States, 41.0469, -83.6379 Valley Stream, United States, 40.6647, -73.7043 Bugarama, Rwanda, -2.6972, 29.0083 Afogados da Ingazeira, Brazil, -7.7508, -37.6342 Majibacoa, Cuba, 20.9172, -76.8764 Parnu, Estonia, 58.3833, 24.5000 Hidirbey, Turkey, 36.2030, 36.1290 Fonds Verrettes, Haiti, 18.3957, -71.8563 Merta, India, 26.6500, 74.0333 Camargo, Mexico, 27.6670, -105.1670 Uttarkashi, India, 30.7300, 78.4500 Boa Esperanca, Brazil, -21.0900, -45.5658 Kabuga, Rwanda, -1.9765, 30.2247 Pala Oua, Chad, 9.3625, 14.9106 Leramatang, Indonesia, -8.4000, 123.5700 Itoigawa, Japan, 37.0390, 137.8627 Le Cannet, France, 43.5769, 7.0194 Secunda, South Africa, -26.5161, 29.2028 El Golea, Algeria, 30.5833, 2.8833 Maihar, India, 24.2620, 80.7610 Begamganj, India, 23.5992, 78.3406 The Acreage, United States, 26.7740, -80.2779 Pedra Branca, Brazil, -5.4539, -39.7169 Santa Quiteria, Brazil, -4.3319, -40.1569 Pyt'-Yakh, Russia, 60.7500, 72.7833 Salinas, Brazil, -16.1185, -42.1740 Tiruchendur, India, 8.4946, 78.1219 Mokolo, Cameroon, 10.7400, 13.8000 Lohne, Germany, 52.2000, 8.7000 Malalag, Philippines, 6.6000, 125.4000 Balud, Philippines, 12.0369, 123.1935 Maha Sarakham, Thailand, 16.1772, 103.3008 Torre Annunziata, Italy, 40.7569, 14.4444 Dohazari, Bangladesh, 22.1639, 92.0733 Taysan, Philippines, 13.7800, 121.2000 Taicheng, China, 38.7206, 113.2437 Gourcy, Burkina Faso, 13.2167, -2.3500 Kilakkarai, India, 9.2314, 78.7848 Kalimpong, India, 27.0600, 88.4700 Cihuatlan, Mexico, 19.2500, -104.5667 Gramado, Brazil, -29.3789, -50.8739 Oroqen Zizhiqi, China, 50.5667, 123.7167 Dingras, Philippines, 18.1036, 120.6975 Pugachev, Russia, 52.0167, 48.8000 Cottage Grove, United States, 44.8161, -92.9274 Heroica Ciudad de Tlaxiaco, Mexico, 17.2077, -97.6798 Socorro, Brazil, -22.5908, -46.5289 Phulwaria, India, 25.4697, 85.9847 Sisak, Croatia, 45.4872, 16.3761 Si Sa Ket, Thailand, 15.1069, 104.3294 Luebo, Congo (Kinshasa), -5.3500, 21.4167 Chiredzi, Zimbabwe, -21.0389, 31.6778 Longtang, China, 26.2553, 107.8675 Raxruha, Guatemala, 15.8666, -90.0424 Kakrala, India, 27.8922, 79.1953 Bragadiru, Romania, 44.3708, 25.9750 Marratxi, Spain, 39.6422, 2.7528 Hlegu, Burma, 17.0953, 96.2211 Torre-Pacheco, Spain, 37.7333, -0.9500 Bayindir, Turkey, 38.2192, 27.6481 Santo Domingo, Costa Rica, 9.9880, -84.0686 Halberstadt, Germany, 51.8958, 11.0467 Szigetszentmiklos, Hungary, 47.3453, 19.0483 Menghan, China, 21.8667, 100.9833 Kunigal, India, 13.0232, 77.0252 Altagracia de Orituco, Venezuela, 9.8504, -66.3800 Mailapur, India, 13.0210, 77.9380 Varkkallai, India, 8.7433, 76.6968 Cape Girardeau, United States, 37.3109, -89.5597 Curitibanos, Brazil, -27.2828, -50.5839 Soavinandriana, Madagascar, -19.1693, 46.7401 Montana, Bulgaria, 43.4086, 23.2257 Vanersborg, Sweden, 58.3833, 12.3167 Mayyanad, India, 8.8391, 76.6469 Panaji, India, 15.4989, 73.8278 Huejutla de Reyes, Mexico, 21.1333, -98.4167 Sieradz, Poland, 51.6000, 18.7500 Baksan, Russia, 43.6825, 43.5339 Langen, Germany, 49.9833, 8.6667 Plant City, United States, 28.0140, -82.1201 Armacao dos Buzios, Brazil, -22.7469, -41.8819 Oraiokastro, Greece, 40.7333, 22.9167 Zacualpa, Guatemala, 15.0272, -90.8778 Ihnasya al Madinah, Egypt, 29.0833, 30.9333 Bamessing, Cameroon, 5.9847, 10.3603 Strood, United Kingdom, 51.3930, 0.4780 L'Asile, Haiti, 18.3840, -73.4144 Rajgarh, India, 22.6800, 74.9500 Sindgi, India, 16.9200, 76.2340 Wadegaon, India, 20.3400, 76.5100 Sardulgarh, India, 29.6970, 75.2388 Samalkha, India, 29.2300, 77.0200 Junnar, India, 19.2072, 73.8742 Salaiya, India, 23.1000, 80.1200 Tazah Khurmatu, Iraq, 35.3024, 44.3264 Nicastro, Italy, 38.9833, 16.3167 Jbail, Lebanon, 34.1236, 35.6519 Barr Elias, Lebanon, 33.7750, 35.9000 Matsoandakana, Madagascar, -15.0352, 49.3220 Bukit Gambir, Malaysia, 2.2110, 102.6546 Safdarabad, Pakistan, 31.7167, 73.5667 Safdarabad, Pakistan, 31.7256, 73.5771 Jalalabad, Pakistan, 35.8800, 74.4930 Choa Saidan Shah, Pakistan, 32.7167, 72.9833 Ranipur, Pakistan, 27.2889, 68.5044 Lidkoping, Sweden, 58.5000, 13.1667 Kambia, Sierra Leone, 9.1239, -12.9181 Kambia, Sierra Leone, 9.1167, -12.9167 Uchqurghon Shahri, Uzbekistan, 41.1214, 72.0936 Valladolid, Philippines, 10.4700, 122.8300 Kasumigaura, Japan, 36.1517, 140.2371 Culver City, United States, 34.0058, -118.3968 Cabatuan, Philippines, 16.9589, 121.6692 Oviedo, United States, 28.6580, -81.1872 Lishaocun, China, 22.7368, 111.4302 Herstal, Belgium, 50.6644, 5.6300 Jujutla, El Salvador, 13.7833, -89.8500 Fushe Kosove, Kosovo, 42.6639, 21.0961 Sidi Yahia El Gharb, Morocco, 34.3058, -6.3058 Marcq-en-Baroeul, France, 50.6711, 3.0972 Visoko, Bosnia and Herzegovina, 43.9894, 18.1806 Kyaukme, Burma, 22.5392, 97.0283 Zimapan, Mexico, 20.7333, -99.3833 Yian, China, 47.8804, 125.3000 Santa Cruz del Sur, Cuba, 20.7118, -77.9986 Lluchmayor, Spain, 39.4833, 2.8833 Hurst, United States, 32.8353, -97.1809 Jayrud, Syria, 33.8071, 36.7386 Saraqib, Syria, 35.8645, 36.8059 Xacmaz, Azerbaijan, 41.4681, 48.8028 Qiryat Bialik, Israel, 32.8333, 35.0833 Winslow, United States, 39.7027, -74.9029 Brcko, Bosnia and Herzegovina, 44.8783, 18.8092 Zhongbai, China, 26.7723, 107.8883 Hobbs, United States, 32.7281, -103.1600 Barcellona-Pozzo di Gotto, Italy, 38.1477, 15.2147 Ngozi, Burundi, -2.9083, 29.8269 Kord Kuy, Iran, 36.7931, 54.1122 Duncanville, United States, 32.6460, -96.9127 Acevedo, Colombia, 1.8192, -75.8964 Montclair, United States, 40.8253, -74.2111 Waipahu, United States, 21.3859, -158.0101 Northampton, United States, 40.2104, -75.0014 Yecapixtla, Mexico, 18.8833, -98.8650 Sagae, Japan, 38.3809, 140.2760 Kish, Iran, 26.5553, 53.9850 Zvolen, Slovakia, 48.5744, 19.1533 Ramdurg, India, 15.9500, 75.3000 Plaridel, Philippines, 8.6214, 123.7101 Panglao, Philippines, 9.5790, 123.7450 Braine-l'Alleud, Belgium, 50.6833, 4.3667 Tutayev, Russia, 57.8833, 39.5500 Hutchinson, United States, 38.0671, -97.9081 Ostfildern, Germany, 48.7333, 9.2500 Douai, France, 50.3714, 3.0800 DeLand, United States, 29.0225, -81.2875 Tago, Philippines, 9.0192, 126.2333 Plasencia, Spain, 40.0333, -6.1000 Matias Romero, Mexico, 16.8769, -95.0411 Fort Lee, United States, 40.8509, -73.9713 Baco, Philippines, 13.3584, 121.0977 Pinhal, Brazil, -22.1908, -46.7408 Kopavogur, Iceland, 64.1108, -21.9094 Rovereto, Italy, 45.8833, 11.0342 Huamachuco, Peru, -7.8120, -78.0487 Pamplona, Philippines, 9.4700, 123.1200 Villamontes, Bolivia, -21.2608, -63.4761 Sebdou, Algeria, 34.6333, -1.3333 Amudalavalasa, India, 18.4167, 83.9000 'Ain el Melh, Algeria, 34.8483, 4.1611 Santo Nino, Philippines, 6.4300, 124.6800 Atmakur, India, 15.8779, 78.5884 Yomitan, Japan, 26.3961, 127.7444 Palauig, Philippines, 15.4336, 119.9083 Toukountouna, Benin, 10.4986, 1.3756 San Nicolas, Philippines, 16.0700, 120.7653 Carini, Italy, 38.1333, 13.1833 Nykoping, Sweden, 58.7582, 17.0185 Blyth, United Kingdom, 55.1260, -1.5140 Magsaysay, Philippines, 12.3117, 121.1472 Benenitra, Madagascar, -23.4522, 45.0808 Hangu, Pakistan, 33.5333, 71.0667 Ettlingen, Germany, 48.9333, 8.4000 Aizawa, Japan, 35.5289, 139.3217 Massawa, Eritrea, 15.6097, 39.4500 Nileshwar, India, 12.2600, 75.1300 Maarssen, Netherlands, 52.1351, 5.0413 Apache Junction, United States, 33.3985, -111.5350 Shirone, Japan, 37.7658, 139.0192 Andkhoy, Afghanistan, 36.9500, 65.1167 Alimodian, Philippines, 10.8196, 122.4322 Albano Laziale, Italy, 41.7333, 12.6667 Kurobeshin, Japan, 36.8667, 137.4500 Cantu, Italy, 45.7333, 9.1333 Veruela, Philippines, 8.0700, 125.9600 Pomigliano d'Arco, Italy, 40.9167, 14.4000 Caraga, Philippines, 7.3283, 126.5658 Tianzhong, Taiwan, 23.8595, 120.5878 Maintal, Germany, 50.1500, 8.8333 Buldon, Philippines, 7.5200, 124.3700 Masaki, Japan, 33.7833, 132.7167 Temascal, Mexico, 18.2394, -96.4031 Shebekino, Russia, 50.4167, 36.9000 Oshakati, Namibia, -17.7833, 15.6995 Srebrenik, Bosnia and Herzegovina, 44.7082, 18.4883 Talacogon, Philippines, 8.4500, 125.7900 Tabas, Iran, 33.5961, 56.9281 Barreirinhas, Brazil, -2.7469, -42.8258 Kovvur, India, 17.0170, 81.7310 Libano, Colombia, 4.9167, -75.1667 Fonseca, Colombia, 10.8333, -72.8333 Xisa, China, 23.4500, 104.7077 Villepinte, France, 48.9550, 2.5410 Todos Santos Cuchumatan, Guatemala, 15.5167, -91.6167 Wageningen, Netherlands, 51.9644, 5.6631 Nakama, Japan, 33.8167, 130.7092 Poblacion, Philippines, 7.5086, 125.9206 Ninove, Belgium, 50.8333, 4.0167 Despatch, South Africa, -33.8015, 25.4768 Basudebpur, India, 21.1197, 86.7290 Charbagh, Pakistan, 34.8333, 72.4417 Tafi Viejo, Argentina, -26.7333, -65.2667 Samaxi, Azerbaijan, 40.6339, 48.6392 Huanghuajie, China, 27.9945, 103.5520 La Troncal, Ecuador, -2.4000, -79.3300 Isfisor, Tajikistan, 40.2433, 69.7447 Rexburg, United States, 43.8226, -111.7919 Villa del Carbon, Mexico, 19.7272, -99.5417 Apsheronsk, Russia, 44.4667, 39.7333 Manay, Philippines, 7.2108, 126.5328 Villa de San Diego de Ubate, Colombia, 5.3072, -73.8144 Jordan, Philippines, 10.6000, 122.6000 Salcedo, Dominican Republic, 19.3780, -70.4180 Djidian Kenieba, Mali, 13.0975, -11.3953 Ihosy, Madagascar, -22.3996, 46.1167 Jiaozishan, China, 26.3342, 105.9324 Tucuma, Brazil, -6.7519, -51.1539 Fondi, Italy, 41.3500, 13.4167 Kalingalan Caluang, Philippines, 5.8800, 121.2700 Duba, Saudi Arabia, 27.3513, 35.6901 Fariman, Iran, 35.7011, 59.8464 Sao Goncalo dos Campos, Brazil, -12.4328, -38.9669 Lincoln Park, United States, 42.2432, -83.1811 Nova Vicosa, Brazil, -17.8919, -39.3719 Virreyes, Argentina, -34.4500, -58.5333 Media, Romania, 46.1500, 24.3500 Ecija, Spain, 37.5333, -5.0833 Lake Stevens, United States, 48.0024, -122.0953 Severna Park, United States, 39.0870, -76.5687 Itapolis, Brazil, -21.5958, -48.8128 Lilio, Philippines, 14.1300, 121.4360 Freital, Germany, 51.0167, 13.6500 Aldridge, United Kingdom, 52.6060, -1.9179 Pachrukha, India, 26.7373, 84.8861 Brant, Canada, 43.1167, -80.3667 San Juan del Cesar, Colombia, 10.7667, -73.0000 Issaquah, United States, 47.5439, -122.0471 Rosenberg, United States, 29.5456, -95.8223 Siniloan, Philippines, 14.4200, 121.4500 Chelsea, United States, 42.3959, -71.0325 Alicia, Philippines, 7.5060, 122.9412 San Jose de Ocoa, Dominican Republic, 18.5500, -70.5000 Sogod, Philippines, 10.7500, 124.0000 San Giuliano Milanese, Italy, 45.4000, 9.2833 Asamankese, Ghana, 5.8601, -0.6635 Lakewood Ranch, United States, 27.4185, -82.3948 Lalganj, India, 25.8700, 85.1800 Kalu Khan, Pakistan, 34.2167, 72.3000 Carol Stream, United States, 41.9181, -88.1307 Islampur, India, 25.1407, 85.2059 Niederkassel, Germany, 50.8167, 7.0333 Neu Isenburg, Germany, 50.0500, 8.7000 Qiryat Yam, Israel, 32.8333, 35.0667 Presidente Venceslau, Brazil, -21.8761, -51.8439 Parral, Chile, -36.1500, -71.8333 Whanganui, New Zealand, -39.9325, 175.0519 Xonqa, Uzbekistan, 41.4742, 60.7822 Sanjiang, China, 24.7265, 112.2884 Olintepeque, Guatemala, 14.8833, -91.5167 Khachrod, India, 23.4232, 75.2819 Badepalli, India, 16.7549, 78.1443 Zyrardow, Poland, 52.0500, 20.4333 Sijua, India, 23.7762, 86.3303 Aventura, United States, 25.9566, -80.1371 Kaffrine, Senegal, 14.1016, -15.5467 Clarin, Philippines, 8.2000, 123.8500 Spruce Grove, Canada, 53.5450, -113.9008 Placilla de Penuelas, Chile, -33.1156, -71.5678 Seram, India, 17.1786, 77.2900 Gradacac, Bosnia and Herzegovina, 44.8785, 18.4276 Pamplona, Philippines, 13.5925, 123.0833 Vadasinor, India, 22.9500, 73.3300 Amambai, Brazil, -23.1039, -55.2258 Abrantes, Portugal, 39.4667, -8.2000 West Fargo, United States, 46.8573, -96.9057 Naranjal, Ecuador, -2.6736, -79.6183 Jacarezinho, Brazil, -23.1606, -49.9694 Damulog, Philippines, 7.4853, 124.9411 Ossining, United States, 41.1559, -73.8564 Puerto Berrio, Colombia, 6.4900, -74.4025 Cesano Maderno, Italy, 45.6307, 9.1456 Cocorote, Venezuela, 10.3217, -68.7825 Sadiola, Mali, 13.8911, -11.6928 Pirna, Germany, 50.9622, 13.9403 Cacuso, Angola, -8.2377, 15.3512 Cacuso, Angola, -9.4167, 15.7333 Tangpingcun, China, 22.0292, 111.9346 Moanda, Gabon, -1.5655, 13.2000 Bettendorf, United States, 41.5657, -90.4765 Marovoay, Madagascar, -16.0995, 46.6333 Istog, Kosovo, 42.7808, 20.4875 Nueva Santa Rosa, Guatemala, 14.3811, -90.2761 Suluova, Turkey, 40.8333, 35.6500 Naron, Spain, 43.5500, -8.1500 Jogbani, India, 26.3961, 87.2597 Galkot, Nepal, 28.2500, 83.4200 Chojnice, Poland, 53.7000, 17.5500 Ripollet, Spain, 41.4969, 2.1574 Masamba, Indonesia, -2.5531, 120.3275 Takikawa, Japan, 43.5500, 141.9167 Oliveira, Brazil, -20.6958, -44.8269 Matinhos, Brazil, -25.8178, -48.5428 Taraza, Colombia, 7.5881, -75.4028 Solan, India, 30.9050, 77.0970 Hailakandi, India, 24.6839, 92.5610 Al Qa`idah, Yemen, 13.7555, 44.1320 Magra, Algeria, 35.6000, 5.0667 Apan, Mexico, 19.7000, -98.4333 Tamba-Sasayama, Japan, 35.0725, 135.2219 Erattukulakkada, India, 8.9000, 76.8833 Koycegiz, Turkey, 36.9714, 28.6889 Nawabganj, India, 28.5400, 79.6330 Park Ridge, United States, 42.0125, -87.8436 Podilsk, Ukraine, 47.7419, 29.5350 Ospino, Venezuela, 9.3000, -69.4500 Ayirapuram, India, 9.8800, 76.3000 Gumushane, Turkey, 40.4597, 39.4778 Playa Vicente, Mexico, 17.8333, -95.8167 Mettmann, Germany, 51.2500, 6.9667 Heemskerk, Netherlands, 52.5167, 4.6667 Greer, United States, 34.9330, -82.2313 Swinoujscie, Poland, 53.9167, 14.2500 Las Cruces, Guatemala, 16.6583, -90.2950 Quincy, United States, 39.9336, -91.3799 Kampot, Cambodia, 10.6000, 104.1667 Grants Pass, United States, 42.4333, -123.3317 Weissenfels, Germany, 51.2000, 11.9667 Surin, Thailand, 14.0000, 53.0000 Axochiapan, Mexico, 18.5000, -98.7500 Parkland, United States, 47.1417, -122.4376 Strezhevoy, Russia, 60.7333, 77.5833 Guemar, Algeria, 33.5000, 6.8333 Androka, Madagascar, -25.1302, 44.4545 Kurchatov, Russia, 51.6667, 35.6500 Baikonur, Kazakhstan, 45.6167, 63.3167 Visconde do Rio Branco, Brazil, -21.0103, -42.8406 Cacocum, Cuba, 20.7439, -76.3242 Marcos Paz, Argentina, -34.7667, -58.8333 Mibu, Japan, 36.4271, 139.8040 Bayanan, Philippines, 14.4078, 121.0500 Ilmenau, Germany, 50.6839, 10.9194 Iesi, Italy, 43.5228, 13.2439 Manggar, Indonesia, -2.8900, 108.2700 Cakung, Indonesia, -6.2138, 106.9473 Idangansalai, India, 11.6272, 77.9890 Taounate, Morocco, 34.5358, -4.6400 Agoncillo, Philippines, 13.9334, 120.9285 Metlaoui, Tunisia, 34.3333, 8.4000 Chittaranjan, India, 23.8700, 86.8700 Halle, Belgium, 50.7361, 4.2372 Konigs Wusterhausen, Germany, 52.2917, 13.6250 Sual, Philippines, 16.0661, 120.0958 Royal Palm Beach, United States, 26.7038, -80.2241 Moatize, Mozambique, -16.1167, 33.7500 Nueva Rosita, Mexico, 27.9372, -101.2172 Warren, United States, 41.2390, -80.8174 Streamwood, United States, 42.0209, -88.1779 Huanren, China, 41.2672, 125.3611 Partapnagar, India, 25.4145, 87.0787 San Dionisio, Philippines, 11.2711, 123.0948 Revelganj, India, 25.7800, 84.6700 Marinha Grande, Portugal, 39.7478, -8.9322 Sebekoro, Mali, 13.6822, -9.0411 Mineiros, Brazil, -17.5689, -52.5508 Mitsuke, Japan, 37.5316, 138.9127 Morshansk, Russia, 53.4500, 41.8167 Roy, United States, 41.1714, -112.0485 Keizer, United States, 45.0028, -123.0243 Owasso, United States, 36.2878, -95.8311 Amla, India, 21.9248, 78.1279 Toumodi, Côte d’Ivoire, 6.5520, -5.0190 Dun Dealgan, Ireland, 54.0044, -6.4003 Tharad, India, 24.3926, 71.6248 Ambatomainty, Madagascar, -17.6768, 48.2166 Al Malikiyah, Syria, 37.1770, 42.1401 Trofa, Portugal, 41.3374, -8.5596 Ramallah, West Bank, 31.9026, 35.1955 Cleethorpes, United Kingdom, 53.5533, -0.0215 Nuevitas, Cuba, 21.5403, -77.2644 Betamcherla, India, 15.4667, 78.1667 Ciudad Melchor Muzquiz, Mexico, 27.8667, -101.5000 Ancud, Chile, -41.8667, -73.8333 Navarre, United States, 30.4174, -86.8907 Sidi Khaled, Algeria, 34.3833, 4.9833 Gornji Milanovac, Serbia, 44.0212, 20.4560 Varzea Alegre, Brazil, -6.7889, -39.2958 Nongzhangjie, China, 24.5833, 97.8667 San Fernando de Henares, Spain, 40.4256, -3.5353 Tromso, Norway, 69.6517, 18.9556 Peachtree City, United States, 33.3942, -84.5710 Sciacca, Italy, 37.5092, 13.0889 La Chaux-de-Fonds, Switzerland, 47.1028, 6.8300 Menomonee Falls, United States, 43.1487, -88.1227 La Mata, Dominican Republic, 19.1000, -70.1681 Qorday, Kazakhstan, 43.0369, 74.7114 Gabaldon, Philippines, 15.4506, 121.3378 Nabaruh, Egypt, 31.0975, 31.3031 Goes, Netherlands, 51.5000, 3.8833 Niutuo Wucun, China, 39.2618, 116.3421 Stendal, Germany, 52.6000, 11.8500 La Vergne, United States, 36.0200, -86.5586 Mafamude, Portugal, 41.1152, -8.6036 Alexandroupoli, Greece, 40.8500, 25.8667 Arucas, Spain, 28.1188, -15.5231 Sao Raimundo Nonato, Brazil, -9.0150, -42.6989 Dibaya-Lubwe, Congo (Kinshasa), -4.1500, 19.8667 Nallur, India, 11.1003, 77.3914 Galeana, Mexico, 24.8333, -100.0667 Yangfang, China, 40.5552, 115.0722 Haverstraw, United States, 41.2055, -74.0384 Brumadinho, Brazil, -20.1428, -44.2000 Staoueli, Algeria, 36.7500, 2.8833 Caluya, Philippines, 11.9320, 121.5480 Walajapet, India, 12.9255, 79.3652 Huangyoutang, China, 23.5968, 115.5153 Huadong, China, 23.6173, 115.4856 Garalo, Mali, 10.9900, -7.4370 Changchunpu, China, 27.2388, 105.1850 Juan Rodriguez Clara, Mexico, 18.0000, -95.4000 San Nicolas, Philippines, 18.1750, 120.5950 Sbeitla, Tunisia, 35.2297, 9.1294 San Raimundo, Guatemala, 14.7647, -90.5956 Tuvagudi, India, 10.7526, 78.8298 Draa el Mizan, Algeria, 36.5333, 3.8333 Empalme, Mexico, 27.9617, -110.8125 Cabugao, Philippines, 17.7947, 120.4556 Yalutorovsk, Russia, 56.6500, 66.2833 Higashimatsushima, Japan, 38.4263, 141.2104 Xiwanzi, China, 40.9717, 115.2737 Dwarka, India, 22.2464, 68.9667 Shenwan, China, 22.3024, 113.3638 Birmitrapur, India, 22.4000, 84.7667 Penfield, United States, 43.1602, -77.4483 Sattivayal, India, 10.6017, 78.5464 Pehowa, India, 29.9800, 76.5800 Inashiki, Japan, 35.9565, 140.3239 Prattville, United States, 32.4597, -86.4573 Saryaghash, Kazakhstan, 41.4667, 69.1667 Tshela, Congo (Kinshasa), -4.9667, 12.9333 Papenburg, Germany, 53.0667, 7.4000 Hitachiomiya, Japan, 36.5425, 140.4109 Rauma, Finland, 61.1333, 21.5000 Sao Mateus do Maranhao, Brazil, -4.0400, -44.4700 Ain Tedeles, Algeria, 35.9947, 0.2956 Ngororero, Rwanda, -1.8650, 29.6250 Olot, Spain, 42.1833, 2.4833 Valrico, United States, 27.9193, -82.2293 Ohrid, North Macedonia, 41.1169, 20.8019 Skelmersdale, United Kingdom, 53.5500, -2.7760 Santa Helena de Goias, Brazil, -17.8136, -50.5969 Nurpur, India, 29.1500, 78.4000 Neuilly-sur-Marne, France, 48.8537, 2.5490 Ermezinde, Portugal, 41.2133, -8.5472 Marikina Heights, Philippines, 14.6534, 121.1187 Omagari, Japan, 39.4531, 140.4754 Dubbo, Australia, -32.2569, 148.6011 Mehidpur, India, 23.4888, 75.6580 Tipton, United Kingdom, 52.5259, -2.0751 Lambarene, Gabon, -0.6883, 10.2319 Campina Grande do Sul, Brazil, -25.3056, -49.0553 San Gabriel, United States, 34.0949, -118.0990 Braintree, United States, 42.2039, -71.0022 Ban Bang Khu Lat, Thailand, 13.8770, 100.3687 Los Palacios y Villafranca, Spain, 37.1625, -5.9242 Eccles, United Kingdom, 53.4824, -2.3390 Clinton, United States, 38.7499, -76.9063 Wurselen, Germany, 50.8167, 6.1333 Gujo, Japan, 35.7486, 136.9643 Fasano, Italy, 40.8333, 17.3667 Aborlan, Philippines, 9.4386, 118.5481 Sujawal, Pakistan, 24.6031, 68.0792 Sao Francisco do Conde, Brazil, -12.6278, -38.6800 Valencia, Philippines, 9.2800, 123.2500 Penalva, Brazil, -3.2942, -45.1736 Los Palacios, Cuba, 22.5822, -83.2489 Kamp-Lintfort, Germany, 51.5000, 6.5333 Yoshinogawa, Japan, 34.0631, 134.3614 Ouro Branco, Brazil, -20.5208, -43.6919 Kehl, Germany, 48.5667, 7.8167 Tinnanur, India, 13.1145, 80.0271 Barbacoas, Colombia, 1.6717, -78.1397 Vestavia Hills, United States, 33.4518, -86.7437 Cajibio, Colombia, 2.6333, -76.6333 Pinner, United Kingdom, 51.5932, -0.3894 Monreale, Italy, 38.0817, 13.2889 Taibao, Taiwan, 23.4500, 120.3333 Yako, Burkina Faso, 12.9667, -2.2667 Tudela, Spain, 42.0653, -1.6067 Novozybkov, Russia, 52.5333, 31.9333 Real, Philippines, 14.6700, 121.6000 Sakuragawa, Japan, 36.3273, 140.0906 Kwai Chung, Hong Kong, 22.3674, 114.1273 Vetapalem, India, 15.7800, 80.3200 Jamindan, Philippines, 11.4094, 122.5103 Bell Gardens, United States, 33.9663, -118.1550 Margosatubig, Philippines, 7.5783, 123.1659 Security-Widefield, United States, 38.7489, -104.7142 Tonbridge, United Kingdom, 51.1987, 0.2764 Zacatelco, Mexico, 19.2167, -98.2333 Paravurkambolam, India, 8.8100, 76.6702 Pereslavl'-Zalesskiy, Russia, 56.7333, 38.8500 Stanton, United States, 33.8003, -117.9935 Shibata, Japan, 38.0566, 140.7658 Voghera, Italy, 44.9925, 9.0092 Armavir, Armenia, 40.1500, 44.0400 San Jose de Las Matas, Dominican Republic, 19.3300, -70.9300 Abrego, Colombia, 8.0000, -73.2000 San Fernando, Philippines, 13.5661, 123.1422 Dzhankoi, Ukraine, 45.7086, 34.3933 Dabola, Guinea, 10.7500, -11.1167 Sovetsk, Russia, 55.0808, 21.8864 Kampung Baharu Nilai, Malaysia, 2.8033, 101.7972 Su-ngai Kolok, Thailand, 6.0333, 101.9667 Bahharet Oulad Ayyad, Morocco, 34.7702, -6.3047 Nantun, China, 38.0619, 114.6365 Vengat, India, 11.8828, 75.5351 Santa Maria da Vitoria, Brazil, -13.3978, -44.1978 Cinarcik, Turkey, 40.6333, 29.1167 Ciampino, Italy, 41.8000, 12.6000 Aketi, Congo (Kinshasa), 2.7333, 23.7500 Koge, Denmark, 55.4600, 12.1834 Schio, Italy, 45.7111, 11.3556 Leyland, United Kingdom, 53.6903, -2.6992 Phatthalung, Thailand, 7.5000, 100.0000 Ibusuki, Japan, 31.2528, 130.6331 Champerico, Guatemala, 14.2930, -91.9140 Yuzhnoukrainsk, Ukraine, 47.8217, 31.1750 Leribe, Lesotho, -28.8734, 28.0416 Santa Pola, Spain, 38.1897, -0.5556 Ban Na Pa, Thailand, 13.3986, 101.0077 Westerville, United States, 40.1241, -82.9210 Sungandiancun, China, 36.2221, 115.3246 Vangaindrano, Madagascar, -23.3498, 47.6047 Komotini, Greece, 41.1219, 25.4042 Strangnas, Sweden, 59.3833, 17.0333 Achaguas, Venezuela, 7.7667, -68.2333 Khalkhal, Iran, 37.6147, 48.5314 Glenrothes, United Kingdom, 56.1980, -3.1780 Alingsas, Sweden, 57.9333, 12.5167 Santa Clara del Cobre, Mexico, 19.4050, -101.6380 Barda, Azerbaijan, 40.3831, 47.1186 Belize City, Belize, 17.4986, -88.1886 Kline, Kosovo, 42.6217, 20.5778 Wheeling, United States, 42.1308, -87.9240 Havza, Turkey, 40.9667, 35.6667 San Adrian de Besos, Spain, 41.4285, 2.2230 Atlantic City, United States, 39.3797, -74.4527 San Andres, Philippines, 13.5961, 124.0992 Caibarien, Cuba, 22.5158, -79.4722 Nishiwaki, Japan, 34.9903, 134.9722 Phenix City, United States, 32.4585, -85.0253 Calexico, United States, 32.6849, -115.4944 Rosario, Brazil, -2.9339, -44.2350 Sarikishty, Tajikistan, 38.4667, 68.7000 La Union, Guatemala, 14.9667, -89.2833 Al Ghizlaniyah, Syria, 33.3967, 36.4549 San Felipe Orizatlan, Mexico, 21.1719, -98.6064 Ingeniero Pablo Nogues, Argentina, -34.4667, -58.7667 Emir Abdelkader, Algeria, 36.7500, 5.8333 Maasin, Philippines, 10.8800, 122.4300 Coto Brus, Costa Rica, 8.8890, -82.9092 Chichaoua, Morocco, 31.5333, -8.7667 Mahadeopur, India, 18.7316, 79.9837 Winter Springs, United States, 28.6889, -81.2703 Urbana, United States, 40.1107, -88.1973 Szczecinek, Poland, 53.7167, 16.6833 Minas, Uruguay, -34.3667, -55.2333 Saronno, Italy, 45.6255, 9.0370 Tulun, Russia, 54.5667, 100.5667 Shrewsbury, United States, 42.2842, -71.7154 Olutanga, Philippines, 7.3106, 122.8464 Mechanicsville, United States, 37.6263, -77.3561 Joue-les-Tours, France, 47.3514, 0.6625 Lanyi, China, 38.7048, 111.5601 Sanjiang, China, 26.6764, 109.1918 Buug, Philippines, 7.7286, 123.0608 Chorley, United Kingdom, 53.6530, -2.6320 Chacabuco, Argentina, -34.6333, -60.4667 Sibate, Colombia, 4.4908, -74.2594 Melmadai, India, 9.9264, 78.1503 Buchireddipalem, India, 14.5380, 79.8750 Shijiazhuangnan, China, 37.9383, 114.4453 Qiaotouyi, China, 28.4114, 112.9270 Daraw, Egypt, 24.4003, 32.9306 Herne Bay, United Kingdom, 51.3700, 1.1300 Vredenburg, South Africa, -32.9064, 17.9958 Kaka, Turkmenistan, 37.3500, 59.6000 Shevgaon, India, 19.3500, 75.2333 Fribourg, Switzerland, 46.8000, 7.1500 Miyoshidai, Japan, 35.8284, 139.5265 Wesseling, Germany, 50.8167, 6.9667 Nindiri, Nicaragua, 12.0047, -86.1194 Bougara, Algeria, 36.5333, 3.0833 Misawa, Japan, 40.6831, 141.3691 Waregem, Belgium, 50.8833, 3.4167 Xiaguanying, China, 35.9427, 104.1717 Marcianise, Italy, 41.0333, 14.3000 Kizilyurt, Russia, 43.2167, 46.8667 Oleiros, Spain, 43.3333, -8.3166 Patnongon, Philippines, 10.9142, 121.9947 Itaitinga, Brazil, -3.9694, -38.5281 Novo Horizonte, Brazil, -21.4678, -49.2208 Greven, Germany, 52.0917, 7.6083 Wilrijk, Belgium, 51.1667, 4.3833 Nigel, South Africa, -26.4203, 28.4683 Bayan, China, 36.1064, 102.2547 Bridgwater, United Kingdom, 51.1280, -2.9930 Chikodi, India, 16.4255, 74.5870 Samal, Philippines, 14.7678, 120.5431 Chuangjian, China, 29.1558, 112.2456 La Quinta, United States, 33.6536, -116.2785 Khairtal, India, 27.8346, 76.6388 Mmabatho, South Africa, -25.8500, 25.6333 Iturama, Brazil, -19.7278, -50.1958 Wokingham, United Kingdom, 51.4102, -0.8432 Azzano, Italy, 42.8167, 12.4833 Sama, Spain, 43.3000, -5.6833 Funes, Argentina, -32.9167, -60.8167 Maule, Chile, -35.5333, -71.7000 Taki, India, 22.5900, 88.9200 Laur, Philippines, 15.5797, 121.1864 Siyang, China, 27.2116, 108.7463 Am-Timan, Chad, 11.0333, 20.2833 Maibara, Japan, 35.3167, 136.2833 Antsohihy, Madagascar, -14.8661, 47.9834 Ciudad del Plata, Uruguay, -34.7667, -56.3806 Xiushui, Taiwan, 24.0356, 120.5037 Yugorsk, Russia, 61.3167, 63.3333 Ibara, Japan, 34.6000, 133.4667 East Point, United States, 33.6696, -84.4701 Brasschaat, Belgium, 51.2914, 4.4950 Citta di Castello, Italy, 43.4574, 12.2403 Pitangueiras, Brazil, -21.0094, -48.2217 Kerava, Finland, 60.4000, 25.1000 Georgetown, United States, 38.2247, -84.5487 Americo Brasiliense, Brazil, -21.7361, -48.1114 Bishops Stortford, United Kingdom, 51.8720, 0.1725 Xico, Mexico, 19.4170, -97.0000 Mechelen-aan-de-Maas, Belgium, 50.9967, 5.7025 Furstenfeldbruck, Germany, 48.1778, 11.2556 Borbon, Philippines, 10.8300, 124.0000 Backnang, Germany, 48.9464, 9.4306 Naushahro Firoz, Pakistan, 26.8500, 68.1333 Porur, India, 13.0356, 80.1582 Izobil'nyy, Russia, 45.3667, 41.7167 Pallipram, India, 11.1500, 75.9000 Oeiras, Brazil, -7.0250, -42.1308 Tayasan, Philippines, 9.9200, 123.1500 Zacualtipan, Mexico, 20.6500, -98.6500 Fereydun Kenar, Iran, 36.6850, 52.5208 Karuvambram, India, 11.0158, 76.1131 Clovis, United States, 34.4376, -103.1923 Matozinhos, Brazil, -19.5578, -44.0814 Selcuk, Turkey, 37.9500, 27.3667 Choybalsan, Mongolia, 48.0706, 114.5228 Bradford, Canada, 44.1167, -79.5667 Cananea, Mexico, 30.9819, -110.3006 Brejo da Madre de Deus, Brazil, -8.1458, -36.3708 Campbell River, Canada, 50.0244, -125.2475 Navgilem, Tajikistan, 40.1333, 70.6500 Vavuniya, Sri Lanka, 8.7514, 80.4971 Quba, Azerbaijan, 41.3611, 48.5134 Entre Rios, Brazil, -11.9419, -38.0839 Orange, Australia, -33.2833, 149.1000 San German, Cuba, 20.6011, -76.1325 Shankarpur Khawas, India, 25.2016, 87.1496 Shengang, Taiwan, 24.1648, 120.4886 Sabang, Indonesia, 5.8942, 95.3192 Veghel, Netherlands, 51.6169, 5.5481 Savelugu, Ghana, 9.6244, -0.8253 Thakraha, India, 26.7419, 84.2562 San Mateo, Venezuela, 10.2133, -67.4225 Mapandan, Philippines, 16.0260, 120.4540 Prokuplje, Serbia, 43.2339, 21.5861 Guajara-Mirim, Brazil, -10.7828, -65.3394 Portel, Brazil, -1.9358, -50.8208 Dubrajpur, India, 23.8000, 87.3800 Bangar, Philippines, 16.9000, 120.4200 Bautzen, Germany, 51.1814, 14.4242 Steyr, Austria, 48.0333, 14.4167 Riviera Beach, United States, 26.7813, -80.0741 Cheltenham, United States, 40.0781, -75.1382 Livramento de Nossa Senhora, Brazil, -13.6428, -41.8408 Franconville, France, 48.9889, 2.2314 Mantingan, Indonesia, -7.3682, 111.1644 Hot Springs, United States, 34.4892, -93.0501 Saint-Martin-d'Heres, France, 45.1672, 5.7653 Shambhunath, Nepal, 26.6316, 86.6951 Sun City, United States, 33.6165, -112.2819 Adelanto, United States, 34.5814, -117.4397 Gudarah, Afghanistan, 34.8169, 69.0878 Aristobulo del Valle, Argentina, -27.1167, -54.9167 Zhongdong Shequ, China, 22.8317, 107.8331 Malgobek, Russia, 43.5000, 44.7500 Rudsar, Iran, 37.1444, 50.2936 Abu Qir, Egypt, 31.3167, 30.0667 Clifton Park, United States, 42.8587, -73.8242 Gurais, India, 34.6333, 74.8333 Chartres, France, 48.4560, 1.4840 San Pedro Jocopilas, Guatemala, 15.0953, -91.1508 Bagabag, Philippines, 16.6044, 121.2521 Dengtangcun, China, 23.6821, 116.5259 Tlapa de Comonfort, Mexico, 17.5461, -98.5764 Yamen, China, 22.2999, 113.0585 Northglenn, United States, 39.9108, -104.9783 Portage, United States, 41.5856, -87.1797 Holyoke, United States, 42.2125, -72.6411 San Juan Cancuc, Mexico, 16.9333, -92.3833 Qaratog, Tajikistan, 38.5500, 68.2833 Goribidnur, India, 13.6111, 77.5167 Kenieran, Guinea, 11.1167, -8.9333 Ali Sabieh, Djibouti, 11.1500, 42.7167 Hajin, Syria, 34.6951, 40.8314 Urena, Venezuela, 7.9183, -72.4467 Sampues, Colombia, 9.1833, -75.3833 Srinagar, India, 30.2200, 78.7800 Raalte, Netherlands, 52.3828, 6.2828 Puri, Angola, -7.6833, 15.6000 Volodymyrivka, Ukraine, 50.8481, 24.3222 Rusape, Zimbabwe, -18.5367, 32.1247 Itabirito, Brazil, -20.2528, -43.8008 Shakhtinsk, Kazakhstan, 49.7100, 72.5872 Pedro II, Brazil, -4.4338, -41.4534 Bitterfeld, Germany, 51.6167, 12.3167 Dhanera, India, 24.5200, 72.0200 Guayacanes, Dominican Republic, 18.4186, -69.4582 Obala, Cameroon, 4.1667, 11.5333 Myrhorod, Ukraine, 49.9667, 33.6000 Lewiston, United States, 44.0915, -70.1681 Swidnik, Poland, 51.2167, 22.7000 Giyon, Ethiopia, 8.5333, 37.9667 Luuk, Philippines, 5.9676, 121.3133 Celje, Slovenia, 46.2358, 15.2675 Gampola, Sri Lanka, 7.1643, 80.5696 Ameca, Mexico, 20.5486, -104.0431 Namlea, Indonesia, -3.2500, 127.0833 Tlalixcoyan, Mexico, 18.8031, -96.0611 Cerveteri, Italy, 42.0075, 12.1050 Dibulla, Colombia, 11.2667, -73.3000 Gaspar Hernandez, Dominican Republic, 19.6200, -70.2800 Pen, India, 18.7500, 73.0800 Tumba, Sweden, 59.2000, 17.8167 Rtishchevo, Russia, 52.2667, 43.7667 Warendorf, Germany, 51.9539, 7.9933 Bangkinang, Indonesia, 0.3500, 101.0333 Yacha, China, 19.2253, 109.4512 Mateus Leme, Brazil, -19.9858, -44.4278 Guira de Melena, Cuba, 22.8019, -82.5047 Santaluz, Brazil, -11.2558, -39.3750 Koboko, Uganda, 3.4100, 30.9600 Tupelo, United States, 34.2692, -88.7318 Al Bayda', Yemen, 13.9790, 45.5740 Al Qaryatayn, Syria, 34.2296, 37.2407 Pentecoste, Brazil, -3.7928, -39.2700 Montclair, United States, 34.0715, -117.6981 Hilton Head Island, United States, 32.1896, -80.7499 Cheyyar, India, 12.6620, 79.5435 Pathanamthitta, India, 9.2648, 76.7870 Mahanoro, Madagascar, -19.8990, 48.8113 Kastel Stari, Croatia, 43.5500, 16.3500 Teijlingen, Netherlands, 52.2167, 4.4833 Nove Zamky, Slovakia, 47.9831, 18.1728 Tuttlingen, Germany, 47.9850, 8.8233 Ohangaron, Uzbekistan, 40.9061, 69.6444 Patia, Colombia, 2.1667, -77.0833 Kalamata, Greece, 37.0378, 22.1111 Galloway, United States, 39.4914, -74.4803 Sillanwali, Pakistan, 31.8250, 72.5389 San Antonio de Padua, Argentina, -34.6667, -58.7000 Savigny-sur-Orge, France, 48.6797, 2.3457 Charaut, India, 26.5322, 85.7942 Winchester, United States, 36.1365, -115.1370 Arnold, United Kingdom, 53.0050, -1.1270 Kwidzyn, Poland, 53.7358, 18.9308 Afua, Brazil, -0.1569, -50.3869 Santo Domingo, Philippines, 13.2350, 123.7769 Romny, Ukraine, 50.7500, 33.4667 Rani, India, 25.5564, 85.9021 Marantao, Philippines, 7.9500, 124.2330 Beigang, Taiwan, 23.5667, 120.3000 Villagarcia de Arosa, Spain, 42.5977, -8.7632 Long Eaton, United Kingdom, 52.8980, -1.2710 Belleville, United States, 40.7950, -74.1617 Prince Albert, Canada, 53.2000, -105.7500 Rome, United States, 34.2662, -85.1863 Guzelbahce, Turkey, 38.3356, 26.8911 Central Islip, United States, 40.7836, -73.1945 Jalapa, Mexico, 17.7000, -92.8000 Fuquay-Varina, United States, 35.5953, -78.7778 Manali, India, 13.1667, 80.2667 Karuhatan, Philippines, 14.6883, 120.9761 Mixquiahuala de Juarez, Mexico, 20.2311, -99.2131 Mamun, India, 32.2824, 75.6983 Haedo, Argentina, -34.6500, -58.6000 Kolchugino, Russia, 56.3167, 39.3667 Coondapoor, India, 13.6313, 74.6902 Hanumannagar, Nepal, 26.5394, 86.7483 Mombaca, Brazil, -5.7428, -39.6278 Gomoh, India, 23.8735, 86.1516 Don Benito, Spain, 38.9545, -5.8617 Susurluk, Turkey, 39.9139, 28.1603 Matina, Costa Rica, 10.0099, -83.3096 San Marcelino, Philippines, 14.9742, 120.1573 Evans, United States, 33.5619, -82.1351 Aklera, India, 24.4200, 76.5700 Umi, Japan, 33.5675, 130.5111 Jacunda, Brazil, -4.4508, -49.1158 Rio Negrinho, Brazil, -26.2539, -49.5178 Melchor Ocampo, Mexico, 19.7083, -99.1444 Povazska Bystrica, Slovakia, 49.1167, 18.4500 Mizunami, Japan, 35.3618, 137.2545 Yoloten, Turkmenistan, 37.3000, 62.3500 Falavarjan, Iran, 32.5558, 51.5106 Satana, India, 20.5797, 74.2160 Tokai, Japan, 36.4730, 140.5661 Tonzang, Burma, 23.6000, 93.7000 Custodia, Brazil, -8.0875, -37.6431 Basavana Bagevadi, India, 16.5728, 75.9725 Massape, Brazil, -3.5228, -40.3428 Dogansehir, Turkey, 38.0958, 37.8792 Thonon-les-Bains, France, 46.3627, 6.4750 Drean, Algeria, 36.6833, 7.7500 Machado, Brazil, -21.6750, -45.9200 Ksour Essaf, Tunisia, 35.4300, 10.9800 Basista, Philippines, 15.8524, 120.3976 Sanchahe, China, 36.3780, 106.0869 Les Abricots, Haiti, 18.6490, -74.3079 Tiete, Brazil, -23.1019, -47.7150 Venlo, Netherlands, 51.3700, 6.1681 Huzurabad, India, 18.2000, 79.4200 Yanqi, China, 42.0586, 86.5683 Benjamin Constant, Brazil, -4.3755, -70.0318 Attingal, India, 8.6800, 76.8300 Kolongo-Bozo, Mali, 13.8806, -5.6861 Kirkagac, Turkey, 39.1056, 27.6733 Hatta, India, 24.1341, 79.6012 Malbork, Poland, 54.0333, 19.0333 Bom Jardim, Brazil, -7.7958, -35.5869 Jeremoabo, Brazil, -10.0669, -38.3500 Monte Plata, Dominican Republic, 18.8100, -69.7900 Stirling, United Kingdom, 56.1166, -3.9369 Shenghu, Taiwan, 24.5961, 121.8511 Su'ao, Taiwan, 24.5961, 121.8511 Rio Brilhante, Brazil, -21.8019, -54.5458 Malavalli, India, 12.3800, 77.0800 Salto del Guaira, Paraguay, -24.0625, -54.3069 Lampa, Chile, -33.2833, -70.9000 La Ciotat, France, 43.1769, 5.6086 Barra de Sao Francisco, Brazil, -18.7550, -40.8908 Sirinhaem, Brazil, -8.5908, -35.1158 Annemasse, France, 46.1958, 6.2364 New Albany, United States, 38.3090, -85.8234 Boleslawiec, Poland, 51.2667, 15.5667 Bartlesville, United States, 36.7365, -95.9456 Rio Branco do Sul, Brazil, -25.1900, -49.3139 Barrancas, Colombia, 11.0000, -72.7500 Kranj, Slovenia, 46.2333, 14.3667 Monrovia, United States, 34.1650, -117.9921 Bamendjou, Cameroon, 5.4000, 10.3167 Villaflores, Mexico, 16.2355, -93.2677 Pleasant Grove, United States, 40.3716, -111.7412 Carpentersville, United States, 42.1227, -88.2896 Mira, Italy, 45.4375, 12.1329 Volkhov, Russia, 59.9167, 32.3000 Kisii, Kenya, -0.6698, 34.7675 Kahrizak, Iran, 35.5169, 51.3603 Pacifica, United States, 37.6113, -122.4782 South Miami Heights, United States, 25.5886, -80.3862 Bletchley, United Kingdom, 51.9940, -0.7320 Tuxpan, Mexico, 19.5539, -103.3756 Atalaia, Brazil, -9.5019, -36.0228 Phonsavan, Laos, 19.4600, 103.1800 El Bordo, Colombia, 2.1667, -77.0833 Allahabad, Pakistan, 28.9333, 70.9667 Pokrov, Ukraine, 47.6533, 34.0842 Turiacu, Brazil, -1.6628, -45.3719 Ma`arratmisrin, Syria, 36.0115, 36.6718 Itaqui, Brazil, -29.1253, -56.5531 Ceska Lipa, Czechia, 50.6886, 14.5386 Oregon City, United States, 45.3418, -122.5924 Tambulig, Philippines, 8.0700, 123.5372 Bonito, Brazil, -8.4700, -35.7289 Leighton Buzzard, United Kingdom, 51.9165, -0.6617 Tabount, Morocco, 30.8800, -6.9100 Paracho de Verduzco, Mexico, 19.6500, -102.0667 Souma, Algeria, 36.5183, 2.9053 San Carlos, Nicaragua, 11.1333, -84.7833 La Union, El Salvador, 13.3369, -87.8439 San Andres, Philippines, 13.3231, 122.6761 Beckum, Germany, 51.7550, 8.0403 Oras, Philippines, 12.1414, 125.4392 San Antonio, Philippines, 14.9486, 120.0864 Donji Kakanj, Bosnia and Herzegovina, 44.1311, 18.0972 Cansancao, Brazil, -10.6708, -39.4978 Porteirinha, Brazil, -15.7428, -43.0278 Santa Rosa de Osos, Colombia, 6.6500, -75.4667 Samobor, Croatia, 45.8011, 15.7110 Sarangpur, India, 23.5700, 76.4700 Sandur, India, 15.1000, 76.5500 Kanigiri, India, 15.4000, 79.5167 Kerou, Benin, 10.8250, 2.1094 Aguilas, Spain, 37.4042, -1.5819 Magallanes, Philippines, 12.8283, 123.8344 Airdrie, United Kingdom, 55.8600, -3.9800 Gorinchem, Netherlands, 51.8306, 4.9742 Ambatofinandrahana, Madagascar, -20.5509, 46.8030 Trou du Nord, Haiti, 19.6167, -72.0244 La Puente, United States, 34.0323, -117.9533 Shiji, China, 22.2120, 112.8632 Agudos, Brazil, -22.4739, -48.9836 Santiago Nonualco, El Salvador, 13.5167, -88.9500 Mabuhay, Philippines, 7.4176, 122.8370 Jaito, India, 30.4509, 74.8829 Phulbani, India, 20.4700, 84.2300 Progreso, Mexico, 21.2800, -89.6700 Bayur, Indonesia, -0.2610, 100.2220 Conchagua, El Salvador, 13.3000, -87.8667 Greenfield, United States, 42.9619, -88.0052 Grimbergen, Belgium, 50.9333, 4.3833 Villa Gonzalez, Dominican Republic, 19.5333, -70.7833 Eboli, Italy, 40.6169, 15.0564 Mullaittivu, Sri Lanka, 9.2833, 80.8000 Fengguangcun, China, 23.9062, 116.6984 Morsi, India, 21.3180, 78.0095 Foothill Farms, United States, 38.6867, -121.3475 Besni, Turkey, 37.6942, 37.8614 Bucha, Ukraine, 50.5464, 30.2350 Sitangkai, Philippines, 4.6615, 119.3919 Luna, Philippines, 16.8500, 120.3800 Ataq, Yemen, 14.5364, 46.8331 Santa Cruz, Brazil, -6.2289, -36.0228 Yuzhnouralsk, Russia, 54.4500, 61.2500 Krasnoufimsk, Russia, 56.6167, 57.7722 Al Hashimiyah, Iraq, 32.3744, 44.6569 Bagua Grande, Peru, -5.7572, -78.4453 Sanankoroba, Mali, 12.3975, -7.9394 Sandino, Cuba, 22.0815, -84.2040 Lahar, India, 26.1940, 78.9414 Falun, Sweden, 60.6130, 15.6470 Dajiecun, China, 36.2960, 115.2057 Sao Manuel, Brazil, -22.7308, -48.5708 Pilibangan, India, 29.4888, 74.0748 Tibu, Colombia, 8.6500, -72.7333 Mariano Escobedo, Mexico, 18.9167, -97.1333 Goygol, Azerbaijan, 40.5858, 46.3189 Cloppenburg, Germany, 52.8500, 8.0500 Mission Bend, United States, 29.6948, -95.6658 Port Talbot, United Kingdom, 51.5906, -3.7986 Zvenigorod, Russia, 55.7333, 36.8500 Tooele, United States, 40.5393, -112.3082 Landgraaf, Netherlands, 50.9083, 6.0297 Coesfeld, Germany, 51.9500, 7.1667 Gajendragarh, India, 15.7363, 75.9698 Lydenburg, South Africa, -25.0960, 30.4460 Estero, United States, 26.4276, -81.7951 Jale, India, 26.3800, 85.7200 Midlothian, United States, 32.4669, -96.9890 Paravur Tekkumbhagam, India, 8.8110, 76.6690 Gangshangcun, China, 38.0469, 114.6904 Jelilyuzi, China, 43.9749, 81.5328 Mankayan, Philippines, 16.8567, 120.7933 Molndal, Sweden, 57.6542, 12.0139 Sidi Ali, Algeria, 36.1047, 0.4233 Andilamena, Madagascar, -17.0131, 48.5720 Katsuragi, Japan, 34.4892, 135.7264 Melgar, Colombia, 4.2039, -74.6428 Protvino, Russia, 54.8833, 37.2167 Vettur, India, 8.7178, 76.7444 Comapa, Guatemala, 14.1167, -89.9167 Arroyomolinos, Spain, 40.2667, -3.9000 Salvatierra, Mexico, 20.2156, -100.8961 Cedar City, United States, 37.6834, -113.0956 Rukungiri, Uganda, -0.7900, 29.9250 Mangai, Congo (Kinshasa), -4.0499, 19.5333 Chunar, India, 25.1300, 82.9000 Moerdijk, Netherlands, 51.7031, 4.6314 Wangsicun, China, 37.9998, 116.9224 Tunzi, China, 35.5753, 107.3694 Leavenworth, United States, 39.3239, -94.9240 Laindon, United Kingdom, 51.5740, 0.4181 Erding, Germany, 48.2833, 11.9000 Moncada, Spain, 41.4872, 2.1878 Ratia, India, 29.6833, 75.5750 Kadiyam, India, 16.9167, 81.8333 Copperas Cove, United States, 31.1192, -97.9140 Ciudad Manuel Doblado, Mexico, 20.7303, -101.9533 Formia, Italy, 41.2564, 13.6069 Sao Caitano, Brazil, -8.3258, -36.1428 Silves, Portugal, 37.1833, -8.4333 Bantay, Philippines, 17.5839, 120.3908 Bahadurganj, India, 26.2617, 87.8244 Imbatug, Philippines, 8.3128, 124.6873 Masyaf, Syria, 35.0653, 36.3406 Obburdon, Tajikistan, 40.4278, 69.3047 Qulsary, Kazakhstan, 46.9833, 54.0167 Binaqadi, Azerbaijan, 40.4758, 49.8222 Adjumani, Uganda, 3.3772, 31.7906 Qo`ng`irot Shahri, Uzbekistan, 43.0521, 58.8460 Qunghirot, Uzbekistan, 43.0497, 58.8542 Languyan, Philippines, 5.2667, 120.0833 Pennsauken, United States, 39.9649, -75.0563 Sittard, Netherlands, 51.0000, 5.8667 Long Lama, Malaysia, 3.7667, 114.4000 Kalutara, Sri Lanka, 6.5869, 79.9603 Redcar, United Kingdom, 54.6180, -1.0690 Jagdispur, India, 25.4674, 84.4204 Uthal, Pakistan, 25.8000, 66.6167 Vasylkiv, Ukraine, 50.1783, 30.3158 Siribala, Mali, 14.0433, -6.1067 Chorkuh, Tajikistan, 39.9739, 70.5822 Prijepolje, Serbia, 43.5439, 19.6514 Kearns, United States, 40.6519, -112.0095 Porsgrunn, Norway, 59.1419, 9.6568 Safonovo, Russia, 55.1167, 33.2500 Sitalkuchi, India, 26.1697, 89.1914 Tokar, Sudan, 18.4333, 37.7333 Pedreiras, Brazil, -4.5739, -44.5969 Pujali, India, 22.4601, 88.1340 Kalihati, Bangladesh, 24.3833, 89.9833 Santana, Brazil, -3.1439, -44.3258 Santo Antonio, Brazil, -29.8178, -50.5200 Kampene, Congo (Kinshasa), -3.5968, 26.6658 Mol, Belgium, 51.1842, 5.1156 Holstebro, Denmark, 56.3595, 8.6208 Lagkadas, Greece, 40.7500, 23.0667 Tucker, United States, 33.8436, -84.2024 Niksar, Turkey, 40.5917, 36.9517 Luga, Russia, 58.7333, 29.8167 Beeston, United Kingdom, 52.9270, -1.2150 Raisinghnagar, India, 29.5342, 73.4477 Dargot, India, 31.2411, 76.9358 Bentota, Sri Lanka, 6.4254, 79.9948 Mandoto, Madagascar, -19.5746, 46.2888 Manazary, Madagascar, -19.0482, 46.8684 Granadero Baigorria, Argentina, -32.8500, -60.7000 Suhl, Germany, 50.6106, 10.6931 Villeta, Paraguay, -25.5123, -57.5647 Soriyankuppam, India, 11.7870, 79.7310 Murtikuppam, India, 11.7902, 79.7873 Manamedu, India, 11.8120, 79.6839 Seliyamedur, India, 11.8249, 79.7532 Kuruvinattam, India, 11.7965, 79.7328 Aranganur, India, 11.8316, 79.7492 Parikkalpattu, India, 11.7928, 79.7516 Karaiyamputtur, India, 11.8194, 79.6498 Panaiyadikuppam, India, 11.8435, 79.6518 Baishi Airikecun, China, 40.8748, 80.3616 Santiago Sacatepequez, Guatemala, 14.6531, -90.6525 Dom Pedrito, Brazil, -30.9828, -54.6728 Sinsheim, Germany, 49.2500, 8.8833 Benslimane, Morocco, 33.6167, -7.1167 Stara Gora, Bosnia and Herzegovina, 43.7538, 18.3689 Nakodar, India, 31.1275, 75.4781 Nanshuicun, China, 22.0316, 113.2358 Tabligbo, Togo, 6.5833, 1.5000 Shaxi, China, 22.3067, 113.1469 Oswiecim, Poland, 50.0381, 19.2214 Lunavada, India, 23.1333, 73.6167 Wildomar, United States, 33.6173, -117.2582 Ban Doi Suthep, Thailand, 18.7944, 98.9142 Kalinkavichy, Belarus, 52.1250, 29.3333 Shengli, China, 37.9842, 106.1967 Port-Margot, Haiti, 19.7518, -72.4301 Monatele, Cameroon, 4.2667, 11.2000 Campos Novos, Brazil, -27.4019, -51.2250 Dalkola, India, 25.8767, 87.8414 Moalboal, Philippines, 9.9500, 123.4000 Burriana, Spain, 39.8894, -0.0925 Bindki, India, 26.0300, 80.6000 Martinez, United States, 37.9985, -122.1161 Kankuria, India, 24.6523, 87.9604 Colon, Venezuela, 8.0378, -72.2519 Santa Ana, Venezuela, 7.6453, -72.2758 Swords, Ireland, 53.4597, -6.2181 Guilderland, United States, 42.7080, -73.9631 Chimboy Shahri, Uzbekistan, 42.9295, 59.7820 San Martin de los Andes, Argentina, -40.1667, -71.3500 Segrate, Italy, 45.4900, 9.2953 Basilisa, Philippines, 10.0654, 125.5968 San Enrique, Philippines, 11.0697, 122.6567 Kachkanar, Russia, 58.7000, 59.4833 Vavur, India, 11.2167, 75.9083 Dubno, Ukraine, 50.3931, 25.7350 Small Heath, United Kingdom, 52.4629, -1.8542 Grugliasco, Italy, 45.0680, 7.5776 Penticton, Canada, 49.4911, -119.5886 Dagua, Colombia, 3.6667, -76.7000 Manucan, Philippines, 8.5161, 123.0917 Musiri, India, 10.9333, 78.4500 Siyabuswa, South Africa, -25.1167, 29.0500 Anosiala, Madagascar, -18.7833, 47.4167 Pathri, India, 19.2500, 76.4500 Faraskur, Egypt, 31.3297, 31.7147 Hanover Park, United States, 41.9818, -88.1446 Cambrils, Spain, 41.0667, 1.0583 San Miguel Chicaj, Guatemala, 15.1000, -90.4000 Sarzedo, Brazil, -20.0350, -44.1450 Six-Fours-les-Plages, France, 43.1009, 5.8200 Pylaia, Greece, 40.6000, 22.9833 Nowa Sol, Poland, 51.8000, 15.7167 Sagnay, Philippines, 13.6039, 123.5233 Kesavapuram, India, 8.4212, 76.9996 Maddaloni, Italy, 41.0333, 14.3833 Mahe, India, 11.7011, 75.5367 Missao Velha, Brazil, -7.2500, -39.1428 Muskogee, United States, 35.7432, -95.3567 Caimito, Cuba, 22.9575, -82.5964 Marijampole, Lithuania, 54.5567, 23.3544 Magsaysay, Philippines, 9.0200, 125.1800 Yayladagi, Turkey, 35.9025, 36.0606 Ipueiras, Brazil, -4.5419, -40.7189 Agogo, Ghana, 6.8000, -1.0833 Elixku, China, 38.7092, 77.3706 Qaladizay, Iraq, 36.1811, 45.1286 Uster, Switzerland, 47.3492, 8.7192 Sao Fidelis, Brazil, -21.6458, -41.7469 Salima, Malawi, -13.7829, 34.4333 Camberley, United Kingdom, 51.3350, -0.7420 Kanie, Japan, 35.1322, 136.7868 La Macarena, Colombia, 2.1828, -73.7847 Sayula, Mexico, 19.8667, -103.6167 Oakton, United States, 38.8887, -77.3016 Tuensang, India, 26.2716, 94.8314 Mulavana, India, 8.9936, 76.6765 Bellaa, Morocco, 30.0314, -9.5542 Kona, Mali, 14.9467, -3.8933 Zaio, Morocco, 34.9333, -2.7333 Manoli, India, 15.7800, 75.1200 Zavolzhye, Russia, 56.6500, 43.4000 Chippenham, United Kingdom, 51.4590, -2.1160 Dargaz, Iran, 37.4425, 59.1072 Rock Island, United States, 41.4699, -90.5827 Lakshmeshwar, India, 15.1300, 75.4700 Koneurgench, Turkmenistan, 42.3333, 59.1500 Bugojno, Bosnia and Herzegovina, 44.0500, 17.4500 Taxisco, Guatemala, 14.0667, -90.4667 Vastervik, Sweden, 57.7500, 16.6333 Houghton le Spring, United Kingdom, 54.8410, -1.4680 San Jose, Uruguay, -34.3333, -56.7167 Zira, India, 30.9700, 74.9900 Wangtuan, China, 36.9145, 105.8500 Tsubata, Japan, 36.6692, 136.7288 Richfield, United States, 44.8763, -93.2829 Karamadai, India, 11.2428, 76.9617 Torres Novas, Portugal, 39.4833, -8.5333 Mandaguari, Brazil, -23.5225, -51.6788 Esik, Kazakhstan, 43.3500, 77.4667 Shatura, Russia, 55.5667, 39.5500 Teruel, Spain, 40.3436, -1.1072 Yasugicho, Japan, 35.4314, 133.2508 Echirolles, France, 45.1436, 5.7183 Or Yehuda, Israel, 32.0333, 34.8500 Enrile, Philippines, 17.5622, 121.7011 Michalovce, Slovakia, 48.7575, 21.9183 Kambove, Congo (Kinshasa), -10.8764, 26.5969 Yovon, Tajikistan, 38.3167, 69.0500 Xinpo, China, 21.6311, 110.9747 Robertsganj, India, 24.7000, 83.0700 Esquel, Argentina, -42.9000, -71.3167 Ikongo, Madagascar, -21.8789, 47.4350 Thana Bhawan, India, 29.5833, 77.4167 Uryupinsk, Russia, 50.8000, 42.0167 La Presa, United States, 32.7110, -117.0027 Pande, Indonesia, -8.6840, 115.2264 Risalpur Cantonment, Pakistan, 34.0811, 71.9725 Sitakund, Bangladesh, 22.6216, 91.6594 Sorel-Tracy, Canada, 46.0333, -73.1167 Lierre, Belgium, 51.1311, 4.5697 Ulan Hua, China, 41.5300, 111.7000 Muhlhausen, Germany, 51.2167, 10.4500 Hojai, India, 26.0000, 92.8700 Jose Bonifacio, Brazil, -21.0528, -49.6878 Brighton, United States, 43.1175, -77.5835 Matan, China, 30.5731, 113.3342 Saint-Raphael, France, 43.4252, 6.7684 Rosario do Sul, Brazil, -30.2578, -54.9139 Belalcazar, Colombia, 2.6547, -75.9928 Natick, United States, 42.2847, -71.3497 Esch-sur-Alzette, Luxembourg, 49.4969, 5.9806 Whitley Bay, United Kingdom, 55.0456, -1.4443 Aurora, Philippines, 16.9918, 121.6357 Las Navas, Philippines, 12.3400, 125.0320 Demirci, Turkey, 39.0450, 28.6581 Vitrolles, France, 43.4600, 5.2486 Kannan, Japan, 35.0889, 138.9534 Makan, South Africa, -25.6050, 27.9100 South Valley, United States, 35.0093, -106.6819 Kadungutt, India, 11.0333, 76.1000 Kidangazhi, India, 11.0333, 76.1000 Rossano, Italy, 39.5667, 16.6333 Mek'i, Ethiopia, 8.1500, 38.8167 Cantanhede, Portugal, 40.3464, -8.5942 Denton, United Kingdom, 53.4554, -2.1122 Korkino, Russia, 54.9000, 61.4167 Bandhi, Pakistan, 26.5833, 68.3000 Schaffhausen, Switzerland, 47.6965, 8.6339 Irbit, Russia, 57.6667, 63.0667 Jaral del Progreso, Mexico, 20.3667, -101.0667 Tienen, Belgium, 50.8075, 4.9372 Alekseyevka, Russia, 50.6333, 38.7000 Sao Joao da Barra, Brazil, -21.6400, -41.0508 Zoumi, Morocco, 34.8000, -5.3500 Kiryas Joel, United States, 41.3411, -74.1667 Sao Mateus do Sul, Brazil, -25.8739, -50.3828 Ebebiyin, Equatorial Guinea, 2.1500, 11.3167 `Afrin, Syria, 36.5119, 36.8695 Aguelmous, Morocco, 33.1500, -5.8333 Hilliard, United States, 40.0353, -83.1578 Dabutou, China, 36.0667, 112.8667 Emsdetten, Germany, 52.1728, 7.5344 Tunduma, Tanzania, -9.3000, 32.7667 Beloit, United States, 42.5230, -89.0184 Claremont, United States, 34.1259, -117.7153 Nemmara, India, 10.5934, 76.6006 Baishan, China, 40.1656, 116.3144 Yefremov, Russia, 53.1500, 38.1167 Punarakh, India, 25.4930, 85.8054 Novaya Usman', Russia, 51.6450, 39.4142 Barra do Choca, Brazil, -14.8808, -40.5789 Patamundai, India, 20.5700, 86.5700 Bulicun, China, 24.3657, 116.2726 Benapol, Bangladesh, 23.0419, 88.8956 Tomelloso, Spain, 39.1578, -3.0208 Songo, Mozambique, -15.5958, 32.7647 Horasan, Turkey, 40.0397, 42.1711 Binde, Burkina Faso, 11.7500, -1.1000 Bargny, Senegal, 14.6944, -17.2306 Haomen, China, 37.3619, 101.5871 Kajaani, Finland, 64.2311, 27.7194 Neiba, Dominican Republic, 18.4900, -71.4200 Limburg, Germany, 50.3833, 8.0667 Kodaikanal, India, 10.2300, 77.4800 Mamfe, Cameroon, 5.7667, 9.2833 Chelora, India, 11.8892, 75.4293 Dashtobod, Uzbekistan, 40.1269, 68.4944 Winsen, Germany, 53.3667, 10.2167 Knurow, Poland, 50.2167, 18.6833 Berat, Albania, 40.7049, 19.9497 Nueve de Julio, Argentina, -35.4500, -60.8833 Creil, France, 49.2583, 2.4833 Zhetisay, Kazakhstan, 40.7753, 68.3272 Ichchapuram, India, 19.1200, 84.7000 Netishyn, Ukraine, 50.3500, 26.6333 West Bridgford, United Kingdom, 52.9320, -1.1270 Kaniama, Congo (Kinshasa), -7.5696, 24.1700 Bossangoa, Central African Republic, 6.4833, 17.4500 Oak Creek, United States, 42.8803, -87.9009 Guapiles, Costa Rica, 10.2070, -83.8581 Surab, Pakistan, 28.4925, 66.2597 Andover, United States, 42.6466, -71.1651 Sun Prairie, United States, 43.1825, -89.2362 Athis-Mons, France, 48.7074, 2.3889 Matale, Sri Lanka, 7.4667, 80.6167 Lecherias, Venezuela, 10.1917, -64.6921 Sonson, Colombia, 5.7097, -75.3108 Arawa, Papua New Guinea, -6.2280, 155.5660 Mazidagi, Turkey, 37.4792, 40.4864 Zinzana, Mali, 13.2506, -5.9678 Tocancipa, Colombia, 4.9657, -73.9136 Meyzieu, France, 45.7667, 5.0036 Elmont, United States, 40.7033, -73.7078 Rende, Italy, 39.3333, 16.1833 Purna, India, 19.1800, 77.0500 Onteniente, Spain, 38.8222, -0.6072 Liwonde, Malawi, -15.0667, 35.2333 Estahban, Iran, 29.1269, 54.0394 Sutton in Ashfield, United Kingdom, 53.1250, -1.2610 Anse d'Hainault, Haiti, 18.4853, -74.4514 Byumba, Rwanda, -1.5794, 30.0694 Cegled, Hungary, 47.1772, 19.7981 Ingelheim, Germany, 49.9747, 8.0564 Cumberland, United States, 41.9703, -71.4198 Kaarina, Finland, 60.4000, 22.3667 Simbahan, Philippines, 6.3000, 120.5800 Monaco, Monaco, 43.7333, 7.4167 Namakgale, South Africa, -23.9380, 31.0280 Kinel, Russia, 53.2222, 50.6333 Maur, India, 30.0833, 75.2500 Commack, United States, 40.8435, -73.2833 Merrillville, United States, 41.4728, -87.3196 San Pablo, Colombia, 7.4825, -73.9250 Fuchucho, Japan, 34.5650, 133.2419 Zawyat an Nwacer, Morocco, 33.3611, -7.6114 Borehamwood, United Kingdom, 51.6578, -0.2722 Barra Bonita, Brazil, -22.4947, -48.5581 Upper Arlington, United States, 40.0272, -83.0704 Bjelovar, Croatia, 45.8989, 16.8422 Tomatlan, Mexico, 19.9369, -105.2500 Danihe, China, 39.8707, 119.3300 Wolomin, Poland, 52.3500, 21.2333 Conflans-Sainte-Honorine, France, 48.9992, 2.0983 Jaroslaw, Poland, 50.0186, 22.6797 Porta Westfalica, Germany, 52.2167, 8.9333 San Juan Cotzal, Guatemala, 15.4353, -91.0356 Ez Zahra, Tunisia, 36.7439, 10.3083 Mpessoba, Mali, 12.6725, -5.7156 Woodstock, United States, 34.1026, -84.5091 Nargund, India, 15.7200, 75.3800 Dinas, Philippines, 7.6161, 123.3378 Cabanglasan, Philippines, 8.0772, 125.2992 Douglasville, United States, 33.7384, -84.7054 Voerde, Germany, 51.6000, 6.6833 Kurtalan, Turkey, 37.9261, 41.7003 Spoleto, Italy, 42.7333, 12.7333 Aketao, China, 39.1349, 75.9337 Parappur, India, 11.0335, 76.0001 Yandian, China, 31.3271, 113.5800 Melito di Napoli, Italy, 40.9167, 14.2333 Coatepec Harinas, Mexico, 18.9000, -99.7167 Cisterna di Latina, Italy, 41.5889, 12.8306 Kotma, India, 23.2038, 81.9790 Prey Veng, Cambodia, 11.4840, 105.3240 Farmers Branch, United States, 32.9272, -96.8804 Tuntum, Brazil, -5.2578, -44.6489 San Miguel Acatan, Guatemala, 15.7000, -91.6167 Beiya, China, 36.4393, 104.3940 Crailsheim, Germany, 49.1347, 10.0706 Socorro, United States, 31.6383, -106.2601 Siayan, Philippines, 8.2517, 123.1144 Cuenca, Philippines, 13.8988, 121.0505 Rezh, Russia, 57.3667, 61.3667 Piendamo, Colombia, 2.6408, -76.5284 Chatillon, France, 48.8000, 2.2900 Villefranche-sur-Saone, France, 45.9833, 4.7167 Modugno, Italy, 41.0833, 16.7833 Capalonga, Philippines, 14.3314, 122.4928 Chelmsford, United States, 42.6000, -71.3631 Isla de Maipo, Chile, -33.7500, -70.9000 Palapye, Botswana, -22.5500, 27.1333 Canaman, Philippines, 13.6481, 123.1711 Bollate, Italy, 45.5500, 9.1167 Vyazniki, Russia, 56.2500, 42.1667 Cuyotenango, Guatemala, 14.5333, -91.5667 Goycay, Azerbaijan, 40.6553, 47.7389 Yelizovo, Russia, 53.1833, 158.3833 Gasan, Philippines, 13.3200, 121.8500 Manouba, Tunisia, 36.8078, 10.1011 Taastrup, Denmark, 55.6475, 12.3120 Ouled Beni Messous, Algeria, 36.7833, 2.9833 La Vallee de Jacmel, Haiti, 18.2694, -72.6670 Aparecida, Brazil, -22.8469, -45.2297 Madingou, Congo (Brazzaville), -4.1642, 13.5517 Dagami, Philippines, 11.0611, 124.9031 Kalaleh, Iran, 37.3789, 55.4889 Uchaly, Russia, 54.3167, 59.3833 San Luis, Philippines, 13.8300, 120.9300 Villeneuve-Saint-Georges, France, 48.7325, 2.4497 Ratchaburi, Thailand, 13.5356, 99.8133 Zacatepec, Mexico, 18.6833, -99.1833 Boende, Congo (Kinshasa), -0.2810, 20.8760 Ban Mueang Na Tai, Thailand, 19.7308, 98.9017 Rapu-Rapu, Philippines, 13.1800, 124.1300 Nellaya, India, 10.8729, 76.2890 Petit-Trou de Nippes, Haiti, 18.5269, -73.5088 Barira, Philippines, 7.4706, 124.3561 Pingshang, China, 23.5315, 115.8171 Pestel, Haiti, 18.5411, -73.7947 Meppen, Germany, 52.6936, 7.2928 Sareh Mowndeh, Gambia, The, 13.4036, -16.6833 Balarampuram, India, 8.3833, 77.0833 Amancio, Cuba, 20.8197, -77.5844 Mieres, Spain, 43.2508, -5.7767 Osorio, Brazil, -29.8869, -50.2700 Mingjian, Taiwan, 23.8510, 120.6775 Kishmat Dhanbari, Bangladesh, 24.6167, 90.0250 Dinhata, India, 26.1300, 89.4700 Dighwara, India, 25.7443, 85.0100 Komatsushimacho, Japan, 34.0003, 134.5844 Garhakota, India, 23.7791, 79.1432 Guaimaro, Cuba, 21.0589, -77.3478 Dicle, Turkey, 38.3750, 40.0733 Novovyatsk, Russia, 58.5083, 49.6994 Lunsar, Sierra Leone, 8.6844, -12.5350 Girau do Ponciano, Brazil, -9.8839, -36.8289 Chatelet, Belgium, 50.4039, 4.5253 Al Jabayish, Iraq, 30.9549, 46.9751 Frankston, Australia, -38.1333, 145.1167 Pervomaisk, Ukraine, 48.6297, 38.5619 Gutalac, Philippines, 7.9800, 122.4000 Castricum, Netherlands, 52.5500, 4.6667 Kamenice, Kosovo, 42.5781, 21.5803 Sunbury, Australia, -37.5811, 144.7139 Berriozabal, Mexico, 16.8003, -93.2733 El Plan, Spain, 37.6405, -1.0085 East Kelowna, Canada, 49.8625, -119.5833 La Porte, United States, 29.6689, -95.0484 Kanada, Japan, 33.7758, 130.9806 Haguenau, France, 48.8200, 7.7900 Dunedin, New Zealand, -45.8742, 170.5036 Mtsensk, Russia, 53.2833, 36.5667 Palaiseau, France, 48.7145, 2.2457 Piui, Brazil, -20.4650, -45.9578 Mouila, Gabon, -1.8667, 11.0550 Pioltello, Italy, 45.5000, 9.3333 Dunedin, United States, 28.0329, -82.7862 Ozu, Japan, 32.8789, 130.8683 Sibuco, Philippines, 7.2928, 122.0669 Hillerod, Denmark, 55.9333, 12.3167 North Ridgeville, United States, 41.3852, -82.0195 Tamamura, Japan, 36.3044, 139.1149 Asilah, Morocco, 35.4667, -6.0333 Matanog, Philippines, 7.4700, 124.2500 Claveria, Philippines, 9.5742, 125.7328 Masasi, Tanzania, -10.7296, 38.7999 Vempalle, India, 14.3667, 78.4667 Wai, India, 17.9500, 73.8900 Viru, Peru, -8.4143, -78.7524 Bombardopolis, Haiti, 19.7000, -73.3333 Malpura, India, 26.2800, 75.3800 Bramhapuri, India, 20.6068, 79.8644 Bad Vilbel, Germany, 50.1781, 8.7361 Miranda de Ebro, Spain, 42.6833, -2.9333 Douar Oulad Hssine, Morocco, 33.0680, -8.5107 Pihani, India, 27.6199, 80.2034 Beslan, Russia, 43.1833, 44.5500 Guayaramerin, Bolivia, -10.8000, -65.3833 Bel-Air, Philippines, 14.5639, 121.0263 Shirdi, India, 19.7700, 74.4800 Zary, Poland, 51.6333, 15.1333 San Carlos Sija, Guatemala, 14.9833, -91.5500 Farafenni, Gambia, The, 13.5667, -15.6000 Nim ka Thana, India, 27.7350, 75.7797 Taloda, India, 21.5607, 74.2200 Vohipeno, Madagascar, -17.1648, 49.2943 Ampasina-Maningory, Madagascar, -17.2166, 49.4064 Mugumu, Tanzania, -1.8333, 34.6667 Bugiri, Uganda, 0.5694, 33.7486 Olney, United States, 39.1465, -77.0715 San Luis, United States, 32.4911, -114.7089 Ramsar, Iran, 36.9225, 50.6431 La Libertad, El Salvador, 13.4833, -89.3167 Naduvattam, India, 11.0583, 75.8569 Chekkal, India, 8.3653, 77.1075 Krong Kep, Cambodia, 10.4833, 104.3167 Richmond West, United States, 25.6105, -80.4297 Tlokweng, Botswana, -24.6686, 25.9711 Randallstown, United States, 39.3723, -76.8024 Apia, Samoa, -13.8333, -171.7500 Alapayevsk, Russia, 57.8500, 61.7000 Yorktown, United States, 41.2727, -73.8092 Boyarka, Russia, 70.7670, 97.5000 Minas, Cuba, 21.4894, -77.6050 Pandan, Philippines, 11.7206, 122.0961 Moorpark, United States, 34.2861, -118.8768 Benton, United States, 34.5776, -92.5713 Seika, Japan, 34.7608, 135.7858 Siliana, Tunisia, 36.0819, 9.3747 Uto, Japan, 32.6881, 130.6597 Kaneohe, United States, 21.4062, -157.7904 Tarikere, India, 13.7104, 75.8122 Oued Athmenia, Algeria, 36.2497, 6.2861 Anloga, Ghana, 5.7947, 0.8973 Hellendoorn, Netherlands, 52.3885, 6.4497 Rumonge, Burundi, -3.9736, 29.4386 Az Zahiriyah, West Bank, 31.4097, 34.9733 Lauderdale Lakes, United States, 26.1682, -80.2017 San Lorenzo de Guayubin, Dominican Republic, 19.6200, -71.3300 Ambohibary, Madagascar, -18.9075, 48.2295 Windsor, United States, 40.4690, -104.9198 Yangshuwa, China, 34.7647, 111.7603 Mokokchung, India, 26.3200, 94.5000 Majhaul, India, 25.5570, 86.1280 Roseville, United States, 45.0155, -93.1545 Malmesbury, South Africa, -33.4500, 18.7333 Hyde, United Kingdom, 53.4474, -2.0820 Daiyue, China, 39.5284, 112.8056 San Antonio, Philippines, 13.9000, 121.3000 Dinangorou, Mali, 14.4519, -2.2419 Partur, India, 19.5911, 76.2161 Chieri, Italy, 45.0139, 7.8224 Gorukle, Turkey, 40.2333, 28.8333 Santa Cruz Verapaz, Guatemala, 15.3667, -90.4333 Hendon, United Kingdom, 51.5837, -0.2252 Caivano, Italy, 40.9500, 14.3000 Dumbea, New Caledonia, -22.1576, 166.4572 San Javier, Spain, 37.8037, -0.8343 Jalarpet, India, 12.5703, 78.5732 Maragogipe, Brazil, -12.7778, -38.9189 Tirkadavur, India, 8.9206, 76.5948 Olesnica, Poland, 51.2000, 17.3833 Beja, Portugal, 38.0150, -7.8633 Falkirk, United Kingdom, 56.0011, -3.7835 Huzurnagar, India, 16.9000, 79.8833 Ampelokipoi, Greece, 40.6500, 22.9167 Munro, Argentina, -34.5333, -58.5167 Karak, Pakistan, 33.1167, 71.1000 Jagna, Philippines, 9.6500, 124.3700 Riverhead, United States, 40.9408, -72.7095 Agualva, Portugal, 38.7700, -9.2988 El Mirage, United States, 33.5905, -112.3271 Pantnagar, India, 28.9700, 79.4100 East Meadow, United States, 40.7197, -73.5604 Tammampatti, India, 11.4381, 78.4836 Colinas, Brazil, -6.0258, -44.2489 Parkland, United States, 26.3219, -80.2533 Igarape-Acu, Brazil, -1.1269, -47.6178 Kattipparutti, India, 10.8833, 76.0500 Tambolaka, Indonesia, -9.4333, 119.2333 Fermo, Italy, 43.1604, 13.7181 Plainfield, United States, 39.6954, -86.3716 Varberg, Sweden, 57.1086, 12.2661 Norristown, United States, 40.1225, -75.3398 Morley, United Kingdom, 53.7492, -1.6023 Inver Grove Heights, United States, 44.8247, -93.0596 Marion, United States, 40.5973, -83.1227 Caltagirone, Italy, 37.2333, 14.5167 Azogues, Ecuador, -2.7333, -78.8333 Prestea, Ghana, 5.4338, -2.1429 Kalakkadu, India, 8.5138, 77.5494 Deggendorf, Germany, 48.8333, 12.9667 Coventry, United States, 41.6934, -71.6611 Khair, India, 27.9500, 77.8300 Franklin, United States, 42.8854, -88.0104 Vavatenina, Madagascar, -17.4668, 49.1963 Temple City, United States, 34.1022, -118.0579 Tam Hiep, Vietnam, 10.9497, 106.8575 Alianca, Brazil, -7.6028, -35.2308 Mengdong, China, 23.1475, 99.2492 Kharagpur, India, 25.1245, 86.5558 Nawan Shahr, Pakistan, 34.1642, 73.2639 Pak Chong, Thailand, 14.7080, 101.4161 Midvale, United States, 40.6148, -111.8927 Nokia, Finland, 61.4767, 23.5053 Salisbury, United States, 35.6658, -80.4905 Leamington, Canada, 42.0667, -82.5833 Guane, Cuba, 22.2006, -84.0839 Sainte-Genevieve-des-Bois, France, 48.6369, 2.3403 Sukhothai, Thailand, 17.0167, 99.7000 Kumo, Nigeria, 10.0431, 11.2183 Egypt Lake-Leto, United States, 28.0177, -82.5062 Ewing, United States, 40.2650, -74.8006 Chernyakhovsk, Russia, 54.6347, 21.8119 Vrsac, Serbia, 45.1206, 21.2986 Imbituba, Brazil, -28.2400, -48.6700 Zefat, Israel, 32.9658, 35.4983 Krasnyy Sulin, Russia, 47.8833, 40.1000 Numancia, Philippines, 11.7042, 122.3289 Santa Ana, Philippines, 18.4589, 122.1419 Ipora, Brazil, -16.4419, -51.1178 Collo, Algeria, 37.0056, 6.5603 Macomia, Mozambique, -12.2467, 40.1208 Usuki, Japan, 33.1261, 131.8053 Mahna, India, 30.2280, 74.9937 Shiggaon, India, 14.9910, 75.2230 Sosa, Japan, 35.7075, 140.5642 San Juan, United States, 26.1903, -98.1520 Graaff-Reinet, South Africa, -32.2522, 24.5406 Hole Narsipur, India, 12.7863, 76.2433 Santiago de Tolu, Colombia, 9.5333, -75.5833 Camara de Lobos, Portugal, 32.6500, -16.9667 Miyajima, Japan, 33.1525, 130.4747 Mozdok, Russia, 43.7333, 44.7000 Frolovo, Russia, 49.7667, 43.6667 Inca, Spain, 39.7167, 2.9167 Chitapur, India, 17.1201, 77.0869 Carrollwood, United States, 28.0577, -82.5148 Akhtubinsk, Russia, 48.2833, 46.1667 Port Shepstone, South Africa, -30.7500, 30.4500 Awa, Japan, 34.1014, 134.2964 Al `Aqiq, Saudi Arabia, 20.2736, 41.6643 Owings Mills, United States, 39.4115, -76.7913 Setouchi, Japan, 34.6667, 134.1000 Andujar, Spain, 38.0392, -4.0506 Zhentang, China, 21.8662, 110.6996 Walkden, United Kingdom, 53.5239, -2.3991 Medina, Philippines, 8.9200, 125.0200 Medchal, India, 17.6297, 78.4814 Fruit Cove, United States, 30.0972, -81.6175 Sao Goncalo do Amarante, Brazil, -3.6058, -38.9689 Casiguran, Philippines, 12.8731, 124.0081 Kenton, United Kingdom, 51.5878, -0.3086 Monroe, United States, 35.0063, -80.5596 Kula, Serbia, 45.6117, 19.5292 Saint-Chamond, France, 45.4775, 4.5153 Cha-am, Thailand, 12.8000, 99.9667 San Andres Itzapa, Guatemala, 14.6167, -90.8500 Hoogvliet, Netherlands, 51.8667, 4.3500 Narsampet, India, 17.9285, 79.8925 Shangzhuangcun, China, 23.5226, 116.7134 Isumi, Japan, 35.2539, 140.3852 Uravakonda, India, 14.9500, 77.2700 Veinticinco de Mayo, Argentina, -35.4167, -60.1667 Savanur, India, 14.9731, 75.3328 Aibak, Afghanistan, 36.2653, 68.0167 Bariri, Brazil, -22.0744, -48.7403 Richmond, United States, 39.8318, -84.8905 Niamina, Mali, 13.3131, -6.9831 Sanok, Poland, 49.5500, 22.2167 Sykies, Greece, 40.6500, 22.9500 Cookeville, United States, 36.1482, -85.5109 Catarina, Guatemala, 14.8500, -92.0833 Sarigol, Turkey, 38.2381, 28.6961 Rafiganj, India, 24.8200, 84.6500 Aravankara, India, 11.0745, 75.9369 Mahabo, Madagascar, -20.3807, 44.6654 Pambujan, Philippines, 12.5700, 124.9300 Yangambi, Congo (Kinshasa), 0.7675, 24.4414 Sirohi, India, 24.8850, 72.8625 Belluno, Italy, 46.1408, 12.2156 Lokbatan, Azerbaijan, 40.3272, 49.7300 Rifu, Japan, 38.3329, 140.9772 Goch, Germany, 51.6839, 6.1619 Miahuatlan de Porfirio Diaz, Mexico, 16.3167, -96.5833 Freehold, United States, 40.2233, -74.2986 Guama Abajo, Cuba, 19.9758, -76.4100 Guacari, Colombia, 3.7667, -76.3333 Sahneh, Iran, 34.4819, 47.6900 Udhampur, India, 32.9160, 75.1419 Saiha, India, 22.4800, 92.9700 Gigante, Colombia, 2.3867, -75.5461 Richmond, United States, 37.7307, -84.2925 Sungaiselam, Indonesia, -2.3839, 105.9800 Kendall West, United States, 25.7065, -80.4388 Chatenay-Malabry, France, 48.7653, 2.2781 Coevorden, Netherlands, 52.6610, 6.7405 Blagoveshchensk, Russia, 55.0350, 55.9781 Yahyali, Turkey, 38.1000, 35.3608 Torrington, United States, 41.8349, -73.1282 Umarga, India, 17.8400, 76.6217 Hamirpur, India, 25.9500, 80.1500 Ringsaker, Norway, 60.9000, 10.7333 Stockbridge, United States, 33.5254, -84.2295 La Concordia, Ecuador, -0.0067, -79.3958 Springville, United States, 40.1638, -111.6205 Cartagena del Chaira, Colombia, 1.3500, -74.8333 Simiganj, Tajikistan, 38.6525, 69.0064 Fair Oaks, United States, 38.8653, -77.3586 Addison, United States, 41.9313, -88.0085 San Andres, Guatemala, 16.9675, -89.9103 Oswego, United States, 41.6834, -88.3372 Tenes, Algeria, 36.5122, 1.3044 Steinfurt, Germany, 52.1475, 7.3442 Accrington, United Kingdom, 53.7534, -2.3638 Pola, Philippines, 13.1439, 121.4400 Minami-Boso, Japan, 35.0432, 139.8400 Ofunato, Japan, 39.0620, 141.7132 Lugoj, Romania, 45.7056, 21.9258 Boca do Acre, Brazil, -8.7519, -67.3978 Tamuin, Mexico, 22.0000, -98.7833 Tallkalakh, Syria, 34.6684, 36.2599 Gahanna, United States, 40.0251, -82.8637 Savalou, Benin, 7.9333, 1.9667 Spisska Nova Ves, Slovakia, 48.9500, 20.5667 Ulliyil, India, 12.0333, 75.6500 Feijo, Brazil, -8.1639, -70.3539 Tomobe, Japan, 36.3450, 140.3042 Smarhon, Belarus, 54.4836, 26.4000 Santuario, Colombia, 6.1375, -75.2639 Pinerolo, Italy, 44.8873, 7.3319 Matanzas, Dominican Republic, 18.2430, -70.4177 Casalecchio di Reno, Italy, 44.4833, 11.2833 Dayr Hafir, Syria, 36.1569, 37.7078 Zorgo, Burkina Faso, 12.2500, -0.6167 Kundian, Pakistan, 32.4522, 71.4718 Bou Noura, Algeria, 32.4825, 3.7036 Angra do Heroismo, Portugal, 38.6558, -27.2153 Buhriz, Iraq, 33.7069, 44.6554 Pampatar, Venezuela, 10.9994, -63.7944 Bautista, Philippines, 15.8103, 120.4756 Ratnapur, Nepal, 27.8500, 83.8667 Morong, Philippines, 14.6800, 120.2683 Baohezhuangcun, China, 39.6850, 116.2967 Hamidiye, Turkey, 40.0997, 26.3967 Guskhara, India, 23.5000, 87.7500 Samokov, Bulgaria, 42.3300, 23.5500 Camamu, Brazil, -13.9450, -39.1039 Chur, Switzerland, 46.8521, 9.5297 Pilar, Brazil, -9.5972, -35.9567 Morohongo, Japan, 35.9415, 139.3160 Unnan, Japan, 35.3078, 132.9003 Yongjing, Taiwan, 23.9223, 120.5356 Roanne, France, 46.0367, 4.0689 Rio Real, Brazil, -11.4833, -37.9344 Cieza, Spain, 38.2392, -1.4189 Morfelden-Walldorf, Germany, 50.0000, 8.5833 Pilao Arcado, Brazil, -10.0018, -42.4830 Dama, China, 30.5009, 120.3413 La Palma, Cuba, 22.7472, -83.5525 Braganca, Portugal, 41.8000, -6.7500 Timbuktu, Mali, 16.7735, -3.0074 Kyshtym, Russia, 55.7000, 60.5500 Tonala, Mexico, 16.0914, -93.7518 Yarumal, Colombia, 7.0306, -75.5905 Romainville, France, 48.8840, 2.4350 American Fork, United States, 40.3783, -111.7953 Lage, Germany, 51.9889, 8.7944 Ati, Chad, 13.2133, 18.3381 Saint-Benoit, Reunion, -21.0339, 55.7128 Conceicao de Jacuipe, Brazil, -12.3269, -38.7650 Villa Adelina, Argentina, -34.5167, -58.5333 Barra do Bugres, Brazil, -15.0725, -57.1811 Tahuna, Indonesia, 3.6119, 125.5008 Villa Ballester, Argentina, -34.5167, -58.5333 Newton, Sierra Leone, 8.3388, -13.0048 Juban, Philippines, 12.8478, 123.9894 Bedesa, Ethiopia, 6.8830, 37.9329 Ciudad de Allende, Mexico, 25.2833, -100.0167 Brunswick, United States, 41.2465, -81.8198 Chakapara, India, 22.6300, 88.3500 Hinesville, United States, 31.8248, -81.6137 Quimbaya, Colombia, 4.6333, -75.7500 Surandai, India, 8.9773, 77.4206 Watertown Town, United States, 42.3700, -71.1774 Aizumi, Japan, 34.1266, 134.4951 Dietzenbach, Germany, 50.0167, 8.7833 Diabali, Mali, 14.6936, -6.0169 Tortosa, Spain, 40.8128, 0.5233 Czechowice-Dziedzice, Poland, 49.9131, 19.0064 Tangancicuaro de Arista, Mexico, 19.8870, -102.2080 Pansol, Philippines, 14.6514, 121.0800 Calumet City, United States, 41.6134, -87.5505 General Villegas, Argentina, -35.0333, -63.0167 Chandanais, Bangladesh, 22.2113, 92.0111 Gandara, Philippines, 12.0130, 124.8118 Evergem, Belgium, 51.1167, 3.7000 Jieshang, China, 25.6989, 107.6481 Azuqueca de Henares, Spain, 40.5647, -3.2681 Auxerre, France, 47.7986, 3.5672 Yecla, Spain, 38.6136, -1.1147 Allacapan, Philippines, 18.2270, 121.5556 Cento, Italy, 44.7333, 11.2833 Usilampatti, India, 9.9651, 77.7885 Orangevale, United States, 38.6881, -121.2209 Baturite, Brazil, -4.3289, -38.8850 Kamata, Japan, 33.5983, 130.7194 Bria, Central African Republic, 6.5369, 21.9919 Datteln, Germany, 51.6539, 7.3417 Winchester, United Kingdom, 51.0632, -1.3080 Victoria Falls, Zimbabwe, -17.9333, 25.8333 Tilingzhai, China, 40.1317, 118.6731 Buenos Aires, Colombia, 2.9167, -76.6667 San Luis, Philippines, 8.5000, 125.7400 Zaventem, Belgium, 50.8667, 4.4667 Praya, Indonesia, -8.7223, 116.2923 Banaz, Turkey, 38.7333, 29.7500 Abra de Ilog, Philippines, 13.4448, 120.7260 Bom Jesus do Itabapoana, Brazil, -21.1339, -41.6797 Perunad, India, 8.9563, 76.6400 Izki, Oman, 22.9339, 57.7750 Wildwood, United States, 38.5800, -90.6698 Oakville, United States, 38.4479, -90.3199 Leer, Germany, 53.2308, 7.4528 Chillum, United States, 38.9666, -76.9791 Aktuluk, Turkey, 39.1064, 39.5472 Tunceli, Turkey, 39.1064, 39.5472 Redmond, United States, 44.2612, -121.1810 Hammam Bou Hadjar, Algeria, 35.3792, -0.9706 Soteapan, Mexico, 18.2333, -94.8667 Fair Lawn, United States, 40.9359, -74.1177 Mahasolo, Madagascar, -19.1205, 46.3644 Sulop, Philippines, 6.5986, 125.3436 Giddalur, India, 15.3764, 78.9251 Mananara Avaratra, Madagascar, -16.1684, 49.7654 Mason, United States, 39.3571, -84.3023 Lingig, Philippines, 8.0381, 126.4127 Jaguariaiva, Brazil, -24.2508, -49.7058 Pappinissheri, India, 11.9500, 75.3500 Tazhakara, India, 9.2551, 76.5539 Trinidad, Philippines, 10.0795, 124.3432 Ikalamavony, Madagascar, -21.1617, 46.5952 Pandaul, India, 26.2517, 86.0747 Adamantina, Brazil, -21.6847, -51.0733 Bibhutpur, India, 25.6878, 85.9992 Qazax, Azerbaijan, 41.0933, 45.3661 Rawatsar, India, 29.2800, 74.3800 Mazarron, Spain, 37.5983, -1.3139 Puerto Lopez, Colombia, 4.0872, -72.9606 Spassk-Dal'niy, Russia, 44.6000, 132.8167 Effia-Kuma, Ghana, 4.9228, -1.7669 Pulppatta, India, 11.1511, 76.0669 Cassino, Italy, 41.4917, 13.8333 Chrzanow, Poland, 50.1333, 19.4000 West Hollywood, United States, 34.0883, -118.3719 Graham, United States, 47.0322, -122.2827 Lebowakgomo, South Africa, -24.3050, 29.5650 Al Hisn, Jordan, 32.4583, 35.8583 San Juan Despi, Spain, 41.3681, 2.0581 Kherrata, Algeria, 36.5000, 5.2833 Confresa, Brazil, -10.6439, -51.5689 Salinas, Ecuador, -2.2167, -80.9501 Vinces, Ecuador, -1.5500, -79.7333 Balasan, Philippines, 11.4728, 123.0878 Sankt Ingbert, Germany, 49.3000, 7.1167 Umarkot, Pakistan, 25.3631, 69.7425 Casilda, Argentina, -33.0500, -61.1667 Yellandu, India, 17.6000, 80.3300 Balingen, Germany, 48.2731, 8.8506 Suong, Cambodia, 11.9118, 105.6582 Rio Grande, Mexico, 23.8225, -103.0361 Sopot, Poland, 54.4333, 18.5500 Ano Liosia, Greece, 38.0833, 23.7000 Ouro Preto d'Oeste, Brazil, -10.7481, -62.2158 Golden Glades, United States, 25.9129, -80.2013 Ieper, Belgium, 50.8508, 2.8850 Koryo, Japan, 34.5428, 135.7508 Tebesbest, Algeria, 33.1167, 6.0833 Bridlington, United Kingdom, 54.0819, -0.1923 San Luis de Since, Colombia, 9.2500, -75.1500 Guimbal, Philippines, 10.6700, 122.3200 Union de Reyes, Cuba, 22.8003, -81.5372 San Pedro de Ycuamandiyu, Paraguay, -24.0900, -57.0800 Munai, Philippines, 7.9758, 124.0636 Charqueadas, Brazil, -29.9550, -51.6250 Sahuarita, United States, 31.9323, -110.9654 Palotina, Brazil, -24.2839, -53.8400 Marancheri, India, 10.7383, 75.9736 Prairieville, United States, 30.3151, -90.9571 Kotah-ye `Ashro, Afghanistan, 34.4492, 68.7939 Maidan Shahr, Afghanistan, 34.3972, 68.8697 Wokha, India, 26.1000, 94.2700 Prado, Brazil, -17.3408, -39.2208 Bethlehem, United States, 42.5856, -73.8219 Maojiatang, China, 27.5692, 111.7647 Cangxi, China, 27.6481, 111.1458 Dikhil, Djibouti, 11.1167, 42.3667 Bapaura, India, 28.8150, 76.0630 Kudachi, India, 16.4800, 74.7800 Harra, India, 29.1278, 77.4861 Mel Nariyappanur, India, 11.6495, 78.8599 Dulhanganj, India, 25.3820, 84.8580 Al Hamdaniyah, Iraq, 36.2698, 43.3754 Shu, Kazakhstan, 43.5983, 73.7614 Aaley, Lebanon, 33.8000, 35.6000 Mannar, Sri Lanka, 8.9667, 79.8833 Awbari, Libya, 26.5833, 12.7667 Firavahana, Madagascar, -18.6460, 46.8599 Fotadrevo, Madagascar, -24.0571, 45.0191 Ibra', Oman, 22.6906, 58.5334 Chakdarra, Pakistan, 34.6500, 72.0333 Negotin, Serbia, 44.2167, 22.5167 Dulay` Rashid, Saudi Arabia, 25.5098, 42.8573 Shaqra', Saudi Arabia, 25.2402, 45.2510 Salkhad, Syria, 32.4920, 36.7111 Tall Salhab, Syria, 35.2588, 36.3846 Magu, Tanzania, -2.5833, 33.4333 Caucagua, Venezuela, 10.2822, -66.3772 Guanta, Venezuela, 10.2383, -64.5917 Brugherio, Italy, 45.5508, 9.3011 San Juan Capistrano, United States, 33.5008, -117.6544 Talanga, Honduras, 14.4043, -87.0811 Pueblo West, United States, 38.3465, -104.7246 Maglaj, Bosnia and Herzegovina, 44.5478, 18.1000 Timberwood Park, United States, 29.6995, -98.4838 Ngaoundal, Cameroon, 6.5000, 13.2667 Istra, Russia, 55.9167, 36.8667 Oildale, United States, 35.4293, -119.0306 Mlimba, Tanzania, -8.7786, 35.8111 Francavilla Fontana, Italy, 40.5314, 17.5858 Padre Bernardo, Brazil, -15.1600, -48.2839 Lesozavodsk, Russia, 45.4667, 133.4000 Niquelandia, Brazil, -14.4739, -48.4600 Shenjiabang, China, 30.6008, 120.8229 Shendang Tingzi, China, 30.5783, 120.8193 Camoapa, Nicaragua, 12.3833, -85.5167 Kaizu, Japan, 35.2206, 136.6365 Tsumeb, Namibia, -19.2500, 17.7000 Chipinge, Zimbabwe, -20.2000, 32.6200 Barsinghausen, Germany, 52.3000, 9.4811 Payao, Philippines, 7.5857, 122.8022 Karumattampatti, India, 11.1093, 77.1820 At Turrah, Jordan, 32.6368, 35.9900 Tenosique, Mexico, 17.4756, -91.4225 Foca, Turkey, 38.6667, 26.7667 Ypane, Paraguay, -25.4561, -57.5069 Tarkwa, Ghana, 5.3038, -1.9896 Gaur, Nepal, 26.7644, 85.2783 Kahoku, Japan, 36.7198, 136.7067 Tambe, Brazil, -7.4100, -35.1128 Ilhabela, Brazil, -23.7778, -45.3578 Lingsugur, India, 16.1700, 76.5200 Jiaoxi, Taiwan, 24.8167, 121.7667 Kuchaiburi, India, 22.2700, 86.1700 Butte, United States, 45.9020, -112.6571 Shiyali, India, 11.2391, 79.7357 Iyo, Japan, 33.7500, 132.7000 Dundee, South Africa, -28.1725, 30.2314 Campoalegre, Colombia, 2.6867, -75.3256 Nyamata, Rwanda, -2.1569, 30.0932 Khodabandeh, Iran, 36.1194, 48.5917 Tamura, Japan, 37.4333, 140.5667 Slavuta, Ukraine, 50.3028, 26.8683 Posse, Brazil, -14.0928, -46.3689 Santa Cruz, Chile, -34.6372, -71.3631 Armenia, El Salvador, 13.7500, -89.5000 Ikot Abasi, Nigeria, 4.5704, 7.5600 Santa Cruz del Norte, Cuba, 23.1537, -81.9261 Juara, Brazil, -11.2550, -57.5200 Madukkarai, India, 10.9057, 76.9634 Piskent, Uzbekistan, 40.8992, 69.3425 Seiyo, Japan, 33.3628, 132.5108 Saarlouis, Germany, 49.3167, 6.7500 Jagodina, Serbia, 43.9750, 21.2564 Ouled Fares, Algeria, 36.2667, 1.1833 Victoria, Chile, -38.2333, -72.3333 Kempen, Germany, 51.3658, 6.4194 Ville Bonheur, Haiti, 18.8160, -72.2019 Wenlangkou, China, 37.6569, 115.2802 Zhitiqara, Kazakhstan, 52.1908, 61.2011 Mendez-Nunez, Philippines, 14.1286, 120.9058 Alandatte, India, 12.1910, 75.4673 Ewell, United Kingdom, 51.3500, -0.2490 Vadigenhalli, India, 13.2900, 77.8000 Aguai, Brazil, -22.0603, -46.9736 University Place, United States, 47.2147, -122.5461 Cernusco sul Naviglio, Italy, 45.5167, 9.3333 Imzouren, Morocco, 35.1500, -3.8500 Sao Jose do Belmonte, Brazil, -7.8608, -38.7600 Millerovo, Russia, 48.9167, 40.3833 Hirakud, India, 21.5250, 83.8727 Munnarkod, India, 10.9800, 76.4700 Mannarakkat, India, 10.9800, 76.4700 Galapagar, Spain, 40.5764, -4.0019 Villajoyosa, Spain, 38.5053, -0.2328 Dragash, Kosovo, 42.0265, 20.6533 Naryn, Kyrgyzstan, 41.4333, 76.0000 Allagadda, India, 15.1322, 78.5138 Rishton, Uzbekistan, 40.3567, 71.2847 Seelze, Germany, 52.3961, 9.5981 Trebic, Czechia, 49.2150, 15.8817 Santa Fe do Sul, Brazil, -20.2108, -50.9258 Limbiate, Italy, 45.5972, 9.1300 Hammam Dalaa, Algeria, 35.9281, 4.3744 Khajamahalpur, India, 17.8000, 77.3600 San Bernardo del Viento, Colombia, 9.3500, -75.9500 Uddevalla, Sweden, 58.3667, 11.9333 Vernier, Switzerland, 46.2000, 6.1000 Macon, France, 46.3063, 4.8313 Sao Luis Gonzaga, Brazil, -28.4078, -54.9608 Kakhovka, Ukraine, 46.7978, 33.4750 Long Beach, United States, 40.5887, -73.6660 Yhu, Paraguay, -25.0578, -55.9227 Safidon, India, 29.4200, 76.6700 Shangcaiyuan, China, 24.6999, 102.7540 Leganes, Philippines, 10.7800, 122.5800 Merseburg, Germany, 51.3544, 11.9928 Kolattupuzha, India, 8.9082, 77.0555 Merritt Island, United States, 28.3139, -80.6708 Zhujiezhen, China, 23.7442, 104.8964 Sion, Switzerland, 46.2304, 7.3661 Gladstone, Australia, -23.8427, 151.2555 Simpang Renggam, Malaysia, 1.8250, 103.3107 Osimo, Italy, 43.4861, 13.4821 Azazga, Algeria, 36.7453, 4.3711 Randolph, United States, 42.1778, -71.0539 Dhamnod, India, 22.2093, 75.4706 Farafangana, Madagascar, -22.8166, 47.8332 Bugasong, Philippines, 11.0447, 122.0647 Wermelskirchen, Germany, 51.1500, 7.2167 Naranjito, Ecuador, -2.1667, -79.4653 Leidschendam, Netherlands, 52.0833, 4.4000 Augusta, Italy, 37.2303, 15.2194 University City, United States, 38.6657, -90.3315 Rio Pardo, Brazil, -29.9900, -52.3778 Le Perreux-Sur-Marne, France, 48.8422, 2.5036 Manamadurai, India, 9.6956, 78.4564 Slagelse, Denmark, 55.4027, 11.3541 Soma, Japan, 37.7967, 140.9196 Northbrook, United States, 42.1292, -87.8352 Abashiri, Japan, 44.0167, 144.2667 Del Rio, United States, 29.3708, -100.8801 East Gwillimbury, Canada, 44.1333, -79.4167 Sarpol-e Zahab, Iran, 34.4589, 45.8614 Marutharod, India, 10.7737, 76.6973 Wedel, Germany, 53.5833, 9.7000 Andapa, Madagascar, -14.6622, 49.6528 Zweibrucken, Germany, 49.2500, 7.3667 Anse-a-Veau, Haiti, 18.5037, -73.3440 Sidi Lakhdar, Algeria, 36.1428, 0.4606 Medgidia, Romania, 44.2503, 28.2614 Misungwi, Tanzania, -2.8500, 33.0833 Guaira, Brazil, -20.3178, -48.3108 Mugnano di Napoli, Italy, 40.9094, 14.2098 Dabouziya, Morocco, 33.3064, -8.3548 Geldern, Germany, 51.5197, 6.3325 Ahrensburg, Germany, 53.6747, 10.2411 Duenas, Philippines, 11.0700, 122.6200 Phokeng, South Africa, -25.5833, 27.1333 Grantham, United Kingdom, 52.9180, -0.6380 Tynaarlo, Netherlands, 53.0833, 6.6000 Zhangziying, China, 39.6842, 116.5900 Canton, United States, 34.2467, -84.4897 Morecambe, United Kingdom, 54.0730, -2.8700 Qasr al Qarabulli, Libya, 32.7500, 13.7167 Manhattan Beach, United States, 33.8894, -118.3967 Abulug, Philippines, 18.4441, 121.4576 Swadlincote, United Kingdom, 52.7740, -1.5570 Yangquan, China, 37.0749, 111.5541 Prosper, United States, 33.2394, -96.8087 Mildura, Australia, -34.1889, 142.1583 Banda, India, 24.0449, 78.9609 Yeonil, Korea, South, 36.0000, 129.3500 Ofunato, Japan, 39.0819, 141.7089 Cativa, Panama, 9.3624, -79.8357 Bonifacio, Philippines, 8.0527, 123.6136 Paithan, India, 19.4751, 75.3856 Manitowoc, United States, 44.0991, -87.6812 Falls, United States, 40.1686, -74.7915 Dapoli, India, 17.7589, 73.1856 Sabaneta, Dominican Republic, 19.4833, -71.3500 Canete, Chile, -37.7994, -73.3953 Kulittalai, India, 10.9357, 78.4241 Gisborne, New Zealand, -38.6625, 178.0178 Pasni, Pakistan, 25.2652, 63.4698 Bayog, Philippines, 7.8474, 123.0423 Baft, Iran, 29.2350, 56.5989 Mogpog, Philippines, 13.4800, 121.8700 Santa Maria, Philippines, 14.4750, 121.4250 Fairborn, United States, 39.8010, -84.0094 Cote-Saint-Luc, Canada, 45.4687, -73.6673 Ankola, India, 14.6605, 74.3047 Ain Taya, Algeria, 36.7917, 3.2889 Lebork, Poland, 54.5500, 17.7500 Barugo, Philippines, 11.3200, 124.7300 Sadda, Pakistan, 33.7056, 70.3292 McMinnville, United States, 45.2110, -123.1918 Brzeg, Poland, 50.8667, 17.4833 Tayshet, Russia, 55.9500, 98.0167 Ballesteros, Philippines, 18.4108, 121.5169 Ocuilan de Arteaga, Mexico, 19.0000, -99.4000 Shangzhen, China, 33.7116, 110.2575 Bodoco, Brazil, -7.7778, -39.9408 Santa Fe, Philippines, 11.1500, 123.8000 Lewiston, United States, 46.3934, -116.9933 Curuzu Cuatia, Argentina, -29.7833, -58.0833 Gerash, Iran, 27.6667, 54.1411 Nola, Italy, 40.9261, 14.5282 Formigine, Italy, 44.5739, 10.8478 Aloguinsan, Philippines, 10.2229, 123.5491 Meridian, United States, 32.3846, -88.6896 Smolyan, Bulgaria, 41.5830, 24.7000 Nishihara, Japan, 26.2167, 127.7667 Schoten, Belgium, 51.2500, 4.5000 Saparua, Indonesia, -3.5749, 128.6470 Motosu, Japan, 35.4830, 136.6786 Banes, Cuba, 20.9697, -75.7117 Madakalavaripalli, India, 14.7475, 79.0843 Canicatti, Italy, 37.3600, 13.8511 Belen, Turkey, 36.4889, 36.1944 Hatibanda, Bangladesh, 24.2155, 90.1600 Bela Vista de Goias, Brazil, -16.9728, -48.9528 Zaidpur, India, 26.8300, 81.3300 Sochaczew, Poland, 52.2333, 20.2333 Fort Liberte, Haiti, 19.6656, -71.8448 Exmouth, United Kingdom, 50.6200, -3.4130 Ye, Burma, 15.2467, 97.8556 Kalasin, Thailand, 16.4342, 103.5092 Goto, Japan, 32.7000, 128.8333 North Shields, United Kingdom, 55.0097, -1.4448 Kuji, Japan, 40.1905, 141.7757 Merauke, Indonesia, -8.4932, 140.4018 Itaporanga d'Ajuda, Brazil, -10.9978, -37.3108 Riccione Marina, Italy, 44.0000, 12.6500 Paxtaobod, Uzbekistan, 40.9294, 72.4969 Navodari, Romania, 44.3211, 28.6133 College Park, United States, 38.9960, -76.9337 Boyarka, Ukraine, 50.3292, 30.2886 Meppel, Netherlands, 52.6958, 6.1944 Villena, Spain, 38.6350, -0.8658 Schiltigheim, France, 48.6078, 7.7500 Valparaiso, United States, 41.4783, -87.0506 Biwong, Cameroon, 3.1333, 11.1500 Santa Ana Nextlalpan, Mexico, 19.7167, -99.0667 Goshen, United States, 41.5743, -85.8309 Corsico, Italy, 45.4333, 9.1167 Cherchell, Algeria, 36.6075, 2.1900 Tabor, Czechia, 49.4144, 14.6578 Durazno, Uruguay, -33.3667, -56.5167 Yihezhuang, China, 39.1373, 116.0744 Kulp, Turkey, 38.6642, 41.0067 Houlong, Taiwan, 24.6167, 120.7833 Sao Joaquim de Bicas, Brazil, -20.0489, -44.2739 Viernheim, Germany, 49.5417, 8.5786 Kita Chauhattar, India, 25.6770, 84.8720 Betafo, Madagascar, -19.8383, 46.8558 Garibaldi, Brazil, -29.2558, -51.5339 Pleasant Hill, United States, 37.9539, -122.0759 Derry, United States, 42.8888, -71.2804 Biberach, Germany, 48.1000, 9.7833 Heunghae, Korea, South, 36.1167, 129.3500 Korschenbroich, Germany, 51.1833, 6.5167 Phra Phutthabat, Thailand, 14.7253, 100.7954 Same, Tanzania, -4.0667, 37.7833 Spanaway, United States, 47.0979, -122.4233 Stow, United States, 41.1765, -81.4344 Tandubas, Philippines, 5.1340, 120.3461 Degana, India, 26.8951, 74.3222 Bezons, France, 48.9261, 2.2178 La Blanca, Guatemala, 14.5791, -92.1414 Wavre, Belgium, 50.7147, 4.6107 Bathurst, Australia, -33.4200, 149.5778 Swakopmund, Namibia, -22.6667, 14.5333 Isingiro, Uganda, -0.7950, 30.8153 Sokol, Russia, 59.4667, 40.1167 Quilevo, Angola, -7.6167, 15.0500 Aracuai, Brazil, -16.8500, -42.0700 Conegliano, Italy, 45.8872, 12.2969 Westmont, United States, 33.9417, -118.3018 Nandaime, Nicaragua, 11.7500, -86.0500 Licata, Italy, 37.1083, 13.9469 Sao Pedro, Brazil, -22.5486, -47.9139 Almendralejo, Spain, 38.6833, -6.4167 Shinjo, Japan, 38.7667, 140.3000 Almeirim, Brazil, -1.5228, -52.5819 Kalaruch, India, 34.5731, 74.3210 Santa Rosa de Lima, El Salvador, 13.6167, -87.9000 Trappes, France, 48.7775, 2.0025 Pinukpuk, Philippines, 17.5731, 121.3653 Upper Merion, United States, 40.0902, -75.3791 Buchanan, Liberia, 5.8808, -10.0467 Nova Cruz, Brazil, -6.4778, -35.4339 Lautaro, Chile, -38.5167, -72.4500 Fuso, Japan, 35.3591, 136.9132 Aiyappan Kovil, India, 9.7158, 77.0333 Sao Desiderio, Brazil, -12.3633, -44.9733 Trinec, Czechia, 49.6778, 18.6728 Hitchin, United Kingdom, 51.9470, -0.2830 Vedaranniyam, India, 10.3774, 79.8495 Zhangzhengqiao, China, 38.4042, 106.3567 Lixingcun, China, 23.0852, 116.3666 Esposende, Portugal, 41.5333, -8.7833 Pikesville, United States, 39.3893, -76.7020 New Panamao, Philippines, 5.9700, 121.2000 Simunul, Philippines, 4.8980, 119.8213 La Huacana, Mexico, 18.9625, -101.8069 Sibutu, Philippines, 4.8500, 119.4700 Baraidih, India, 25.9798, 86.1434 Colinas do Tocantins, Brazil, -8.0589, -48.4750 Atami, Japan, 35.0960, 139.0716 Roi Et, Thailand, 16.0531, 103.6511 General Nakar, Philippines, 14.7631, 121.6350 Douz, Tunisia, 33.4500, 9.0167 Santa Maria, Philippines, 15.9808, 120.7003 Isfana, Kyrgyzstan, 39.8389, 69.5276 Sao Sebastiao, Brazil, -9.9336, -36.5542 Pangururan, Indonesia, 2.6075, 98.6959 Ubeda, Spain, 38.0133, -3.3705 Badiadka, India, 12.5833, 75.0667 Shahin Dezh, Iran, 36.6806, 46.5681 Toumoukro, Côte d’Ivoire, 10.3833, -5.7500 Karoi, Zimbabwe, -16.8100, 29.7000 South Riding, United States, 38.9120, -77.5132 Toon, Japan, 33.7833, 132.8667 Bintuni, Indonesia, -2.1167, 133.5333 San Roque, Spain, 36.2097, -5.3844 Sid, Serbia, 45.1283, 19.2264 Curaca, Brazil, -8.9919, -39.9078 Kornwestheim, Germany, 48.8598, 9.1852 Orangeville, Canada, 43.9167, -80.1167 Cariari, Costa Rica, 10.4349, -83.6851 Stuhr, Germany, 53.0167, 8.7500 Apodi, Brazil, -5.6639, -37.7989 Tiruvur, India, 17.1000, 80.6000 Datang, China, 26.3297, 108.0639 Cooper City, United States, 26.0463, -80.2862 Mosonmagyarovar, Hungary, 47.8737, 17.2687 Montgomery Village, United States, 39.1788, -77.1954 Znojmo, Czechia, 48.8556, 16.0489 Bor, Serbia, 44.1303, 22.1036 Dakota Ridge, United States, 39.6192, -105.1344 Lufkin, United States, 31.3217, -94.7277 Talayan, Philippines, 6.9844, 124.3564 Sambir, Ukraine, 49.5167, 23.2028 Les Mureaux, France, 48.9875, 1.9172 Tepeji del Rio de Ocampo, Mexico, 19.9039, -99.3414 Tobelo, Indonesia, 1.7319, 128.0078 Vechta, Germany, 52.7306, 8.2886 Yasynuvata, Ukraine, 48.1278, 37.8625 Kozani, Greece, 40.3000, 21.7833 Kokrajhar, India, 26.4000, 90.2700 Risod, India, 19.9700, 76.7800 Dimona, Israel, 31.0700, 35.0300 New City, United States, 41.1542, -73.9912 Caldono, Colombia, 2.8000, -76.5333 Laoac East, Philippines, 16.0333, 120.5500 Takhemaret, Algeria, 35.1072, 0.6833 Almora, India, 29.5971, 79.6591 Brejo, Brazil, -3.6839, -42.7500 San Agustin, Colombia, 1.9000, -76.2833 Cristalina, Brazil, -16.7689, -47.6139 Shiso, Japan, 35.0000, 134.5500 Balarampur, India, 26.2432, 89.5863 Uonuma, Japan, 37.2301, 138.9615 Cravinhos, Brazil, -21.3403, -47.7294 Gyapekurom, Ghana, 7.5833, -2.7833 Fungurume, Congo (Kinshasa), -10.6167, 26.3000 Guindulman, Philippines, 9.7620, 124.4880 Pingtang, China, 22.7542, 111.7527 Diakon, Mali, 14.6275, -10.7347 San Dimas, United States, 34.1082, -117.8090 Qingyang, China, 36.1985, 113.4313 Leduc, Canada, 53.2594, -113.5492 Rainham, United Kingdom, 51.3600, 0.6100 San Manuel, Philippines, 17.0200, 121.6300 Beaufort West, South Africa, -32.3500, 22.5833 Lexington, United States, 42.4456, -71.2307 Petrel, Spain, 38.4845, -0.7696 Honaz, Turkey, 37.7578, 29.2642 Titlagarh, India, 20.2871, 83.1466 Cantilan, Philippines, 9.3356, 125.9769 Waris Aliganj, India, 25.0100, 85.6300 Eastchester, United States, 40.9536, -73.8133 Gbarnga, Liberia, 6.9980, -9.4730 San Remigio, Philippines, 10.8331, 122.0875 Podgorze, Poland, 50.0417, 19.9833 Lommel, Belgium, 51.2317, 5.3110 Pagani, Italy, 40.7417, 14.6167 Crown Point, United States, 41.4143, -87.3457 Sint-Pieters-Leeuw, Belgium, 50.7833, 4.2500 Arteijo, Spain, 43.3044, -8.5114 Westlake, United States, 41.4524, -81.9294 Aldaya, Spain, 39.4639, -0.4628 Sao Domingos do Maranhao, Brazil, -5.5758, -44.3850 Palapag, Philippines, 12.5470, 125.1160 Puqiancun, China, 20.0289, 110.5769 Kearney, United States, 40.7011, -99.0833 Jalajala, Philippines, 14.3540, 121.3240 Rudarpur, India, 26.4293, 83.6104 Mirnyy, Russia, 62.5500, 113.9667 San Juan Nepomuceno, Colombia, 9.9500, -75.0833 Minamishiro, Japan, 36.0227, 139.7227 Majagual, Colombia, 8.5000, -74.6667 Syracuse, United States, 41.0859, -112.0698 Divandarreh, Iran, 35.9158, 47.0228 Quinchia, Colombia, 5.3379, -75.7296 Onesti, Romania, 46.2586, 26.7692 Gibraltar, Gibraltar, 36.1400, -5.3500 Eastpointe, United States, 42.4657, -82.9461 Koryazhma, Russia, 61.3167, 47.1333 Vac, Hungary, 47.7753, 19.1311 Zhegaozhen, China, 31.7827, 117.7553 Tamra, Israel, 32.8536, 35.1978 Ankazomiriotra, Madagascar, -19.6604, 46.5348 Maromandia, Madagascar, -14.2040, 48.0828 Mahasoabe, Madagascar, -21.5895, 47.2204 Lushoto, Tanzania, -4.7928, 38.2911 Uelzen, Germany, 52.9647, 10.5658 Nurlat, Russia, 54.4333, 50.8000 Letchworth, United Kingdom, 51.9780, -0.2300 Kallidaikurichi, India, 8.6859, 77.4659 Menen, Belgium, 50.8000, 3.1167 Shariff Aguak, Philippines, 6.8647, 124.4417 San Quintin, Philippines, 15.9844, 120.8150 Vassouras, Brazil, -22.4039, -43.6628 City of Orange, United States, 40.7681, -74.2348 Angri, Italy, 40.7431, 14.5694 Peyziwat, China, 39.4955, 76.7428 Milaor, Philippines, 13.5956, 123.1781 Kignan, Mali, 11.8553, -6.0164 Sharypovo, Russia, 55.5333, 89.2000 Cieszyn, Poland, 49.7484, 18.6332 Sibagat, Philippines, 8.8200, 125.6900 Acatlan de Osorio, Mexico, 18.2086, -98.0575 Lochem, Netherlands, 52.1606, 6.4158 Kakata, Liberia, 6.5300, -10.3517 Likino-Dulevo, Russia, 55.7167, 38.9500 Lanciano, Italy, 42.2312, 14.3905 North Providence, United States, 41.8616, -71.4575 Annigeri, India, 15.4251, 75.4335 San Jose Poaquil, Guatemala, 14.8167, -90.9000 San Juan Evangelista, Mexico, 17.8833, -95.1333 Bassin Bleu, Haiti, 19.7833, -72.8000 Pulgaon, India, 20.7260, 78.3170 Weatherford, United States, 32.7536, -97.7723 Starokostiantyniv, Ukraine, 49.7556, 27.2208 Hemer, Germany, 51.3833, 7.7667 Oued el Alleug, Algeria, 36.5500, 2.7833 Billingham, United Kingdom, 54.6100, -1.2700 Impfondo, Congo (Brazzaville), 1.6186, 18.0622 Zhuqi, Taiwan, 23.5065, 120.6021 Aznakayevo, Russia, 54.8500, 53.1000 Salt, Spain, 41.9761, 2.7881 Curralinho, Brazil, -1.8139, -49.7950 Initao, Philippines, 8.5000, 124.3167 Mulavur, India, 10.0111, 76.6056 Adrano, Italy, 37.6625, 14.8356 Lupi Viejo, Philippines, 13.7908, 122.9092 Reo, Burkina Faso, 12.3167, -2.4667 Woodridge, United States, 41.7370, -88.0409 Navan, Ireland, 53.6528, -6.6814 Guying, China, 38.0887, 114.5560 Timbio, Colombia, 2.3445, -76.6839 Zhaitangcun, China, 24.5010, 112.4296 Toda Bhim, India, 26.9167, 76.8167 Byadgi, India, 14.6733, 75.4868 Itiuba, Brazil, -10.6908, -39.8528 Lianga, Philippines, 8.6330, 126.0932 Gubkinskiy, Russia, 66.4333, 76.5000 Tabango, Philippines, 11.3067, 124.3714 Desamparados, Costa Rica, 9.8967, -84.0706 Petrovaradin, Serbia, 45.2500, 19.8667 Palmeira, Brazil, -25.4289, -50.0058 Sneek, Netherlands, 53.0325, 5.6600 Sao Luis de Montes Belos, Brazil, -16.5250, -50.3719 Selmane, Algeria, 35.6833, 4.7833 Chaodongcun, China, 25.0183, 111.1683 Nuoro, Italy, 40.3201, 9.3281 Baclaran, Philippines, 14.5319, 120.9942 Kingman, United States, 35.2170, -114.0105 Rheinfelden (Baden), Germany, 47.5611, 7.7917 Beni Tamou, Algeria, 36.5333, 2.8167 Oeiras do Para, Brazil, -2.0028, -49.8539 Leawood, United States, 38.9075, -94.6258 Dao, Philippines, 11.3800, 122.6300 Camiri, Bolivia, -20.1000, -63.5333 Camiri, Bolivia, -20.0968, -63.5217 Bell Ville, Argentina, -32.6333, -62.6833 Golungo Alto, Angola, -9.1333, 14.7667 Jaslo, Poland, 49.7478, 21.4714 Cibolo, United States, 29.5634, -98.2115 San Martin Sacatepequez, Guatemala, 14.8246, -91.6425 Strumica, North Macedonia, 41.4375, 22.6431 Deer Park, United States, 29.6898, -95.1151 Harima, Japan, 34.7167, 134.8667 Waikabubak, Indonesia, -9.6358, 119.4131 IJsselstein, Netherlands, 52.0200, 5.0422 Parras de la Fuente, Mexico, 25.4403, -102.1792 Tobias Fornier, Philippines, 10.5178, 121.9450 Buxin, Taiwan, 23.9523, 120.5349 San Antonio de los Banos, Cuba, 22.8889, -82.4989 Bad Nauheim, Germany, 50.3667, 8.7500 Rio Verde Arriba, Dominican Republic, 19.3200, -70.5700 Radebeul, Germany, 51.1000, 13.6500 Inhambupe, Brazil, -11.7839, -38.3528 Newbury, United Kingdom, 51.4010, -1.3230 Kadungapuram, India, 11.0167, 76.0667 Somoto, Nicaragua, 13.4833, -86.5833 Naguilian, Philippines, 17.0200, 121.8500 Xinzhancun, China, 43.8667, 127.3333 Crema, Italy, 45.3667, 9.6833 Beni Slimane, Algeria, 36.2270, 3.3060 Ghazaouet, Algeria, 35.1000, -1.8500 Englewood, United States, 39.6468, -104.9942 Braco do Norte, Brazil, -28.2750, -49.1658 Bangaon, India, 25.8673, 86.5115 Nejapa, El Salvador, 13.8167, -89.2333 Walla Walla, United States, 46.0671, -118.3368 Puerto Rico, Colombia, 1.9142, -75.1450 Carmel, United States, 41.3899, -73.7239 Aranda de Duero, Spain, 41.6833, -3.6833 Narsipatnam, India, 17.6650, 82.6140 Zhmerynka, Ukraine, 49.0500, 28.1000 Nautanwa, India, 27.4300, 83.4200 Catmon, Philippines, 10.6700, 123.9500 Varzea da Palma, Brazil, -17.5978, -44.7308 Tekes, China, 43.1903, 81.7778 Mankoeng, South Africa, -23.8860, 29.7180 Zacatlan, Mexico, 19.9319, -97.9600 Kadingilan, Philippines, 7.6003, 124.9097 Saint George's, Grenada, 12.0500, -61.7500 Ojiya, Japan, 37.3144, 138.7951 El Ksar, Tunisia, 34.3900, 8.8000 Jaguaribe, Brazil, -5.8908, -38.6219 Chilecito, Argentina, -29.1667, -67.5000 Kovin, Serbia, 44.7475, 20.9761 Kaippakancheri, India, 10.9380, 75.9870 Capoocan, Philippines, 11.2944, 124.6419 Azezo, Ethiopia, 12.5586, 37.4308 Karaagac, Turkey, 36.5667, 36.1333 Leo, Burkina Faso, 11.1000, -2.1000 Zapotiltic, Mexico, 19.6270, -103.4170 Midsalip, Philippines, 8.0328, 123.3147 Grodzisk Mazowiecki, Poland, 52.1089, 20.6250 Vemalwada, India, 18.4667, 78.8833 Dupnitsa, Bulgaria, 42.2650, 23.1185 Statesboro, United States, 32.4375, -81.7751 Xiaotangzhuang, China, 40.3997, 116.7650 Irvine, United Kingdom, 55.6201, -4.6614 Roldanillo, Colombia, 4.4167, -76.1500 Somma Vesuviana, Italy, 40.8725, 14.4369 Landi Kotal, Pakistan, 34.1053, 71.1553 Palmerston, Australia, -12.4806, 130.9831 Tlanchinol, Mexico, 19.9892, -98.6786 Kasba, India, 25.8564, 87.5384 Datu Paglas, Philippines, 6.7669, 124.8500 Kohtla-Jarve, Estonia, 59.3978, 27.2572 Anserma, Colombia, 5.2381, -75.7840 Pierrefitte-sur-Seine, France, 48.9656, 2.3614 Mella, Cuba, 20.3694, -75.9111 Moose Jaw, Canada, 50.3933, -105.5519 Batobato, Philippines, 6.8361, 126.0889 Penha, Brazil, -26.7689, -48.6458 Villa Riva, Dominican Republic, 19.1800, -69.9200 Totana, Spain, 37.7711, -1.5003 San Antero, Colombia, 9.3833, -75.7500 Ylojarvi, Finland, 61.5500, 23.5833 Barhadashi, Nepal, 26.5500, 87.9200 Ono, Japan, 35.9797, 136.4875 Florida, Uruguay, -34.1000, -56.2167 Uniondale, United States, 40.7176, -73.5947 Lianmuqin Kancun, China, 42.8833, 89.9333 Schwedt (Oder), Germany, 53.0500, 14.2667 Demnat, Morocco, 31.7311, -7.0361 Chumphon, Thailand, 10.4939, 99.1800 Alabaster, United States, 33.2198, -86.8225 Cranberry, United States, 40.7104, -80.1059 Kennesaw, United States, 34.0260, -84.6177 Macuro, Venezuela, 10.6500, -61.9333 Houilles, France, 48.9261, 2.1892 Gadsden, United States, 34.0086, -86.0157 Forchheim, Germany, 49.7197, 11.0581 Chascomus, Argentina, -35.5750, -58.0089 `Ajab Shir, Iran, 37.4833, 45.8911 Hampden, United States, 40.2602, -76.9809 Kangasala, Finland, 61.4667, 24.0667 Binche, Belgium, 50.4103, 4.1652 Baldwin, United States, 40.6511, -73.6075 Harker Heights, United States, 31.0572, -97.6446 Morro do Chapeu, Brazil, -11.5500, -41.1570 Batouri, Cameroon, 4.4333, 14.3667 Koh Kong, Cambodia, 11.6167, 102.9833 Atiquizaya, El Salvador, 13.9667, -89.7500 Masiu, Philippines, 7.8200, 124.3200 Sapa Sapa, Philippines, 5.0899, 120.2729 Cotes de Fer, Haiti, 18.1887, -73.0029 Elmina, Ghana, 5.0898, -1.3480 Daganbhuiya, Bangladesh, 22.9366, 91.3036 Iriba, Chad, 15.1167, 22.2500 Qadsayya, Syria, 33.5483, 36.2156 Pitanga, Brazil, -24.7569, -51.7608 Maassluis, Netherlands, 51.9189, 4.2567 Konakovo, Russia, 56.7000, 36.7500 Aleshtar, Iran, 33.8653, 48.2622 Zile, Turkey, 40.3000, 35.8833 Mount Lebanon, United States, 40.3752, -80.0494 Mercedes, Argentina, -29.2000, -58.0833 Bagh, Pakistan, 33.9735, 73.7918 Winsford, United Kingdom, 53.1940, -2.5200 Chavakkad, India, 10.5820, 76.0410 Ixtapan de la Sal, Mexico, 18.8333, -99.6833 Aweil, South Sudan, 8.7666, 27.4000 Port Moody, Canada, 49.2831, -122.8317 Cabarroguis, Philippines, 16.5103, 121.5222 Acornhoek, South Africa, -24.5930, 31.0970 Ayorou, Niger, 14.7318, 0.9195 Columbio, Philippines, 6.7000, 124.9300 Manganam, India, 9.7958, 76.4500 Saint Helier, Jersey, 49.1858, -2.1100 Slantsy, Russia, 59.1167, 28.0667 Sidi Okba, Algeria, 34.7500, 5.9000 Come, Benin, 6.4000, 1.8833 Ribeirao, Brazil, -8.5139, -35.3778 San Vicente, Philippines, 10.5281, 119.2542 Gorizia, Italy, 45.9352, 13.6193 Leticia, Colombia, -4.2167, -69.9333 Niangoloko, Burkina Faso, 10.2833, -4.9167 Bacarra, Philippines, 18.2519, 120.6107 Kamenka, Russia, 53.1833, 44.0500 Corinto, Colombia, 3.1739, -76.2594 Chempalli, India, 12.0451, 75.5074 Nelson, United Kingdom, 53.8346, -2.2180 Pointe-Claire, Canada, 45.4500, -73.8167 Batan, Philippines, 11.5853, 122.4981 Warminster, United States, 40.2043, -75.0915 Castro-Urdiales, Spain, 43.3844, -3.2150 Fraiburgo, Brazil, -27.0258, -50.9208 Silistra, Bulgaria, 44.1092, 27.2654 Neuchatel, Switzerland, 47.0000, 6.9333 Ben Ahmed, Morocco, 33.0655, -7.2464 Sarkoy, Turkey, 40.6039, 27.1064 Radnor, United States, 40.0287, -75.3675 Olkusz, Poland, 50.2833, 19.5667 Dhekiajuli, India, 26.7037, 92.4781 Coxim, Brazil, -18.5067, -54.7600 Badr, Egypt, 30.1401, 31.7305 Ronda, Spain, 36.7372, -5.1647 Goldsboro, United States, 35.3778, -77.9717 Chimbarongo, Chile, -34.7089, -71.0431 Bolvadin, Turkey, 38.7167, 31.0500 Mangalam, India, 10.8450, 75.9190 Kamiimaizumi, Japan, 35.5530, 139.3633 Voznesensk, Ukraine, 47.5667, 31.3000 Poco Redondo, Brazil, -9.8058, -37.6850 Cukurcayir, Turkey, 40.9867, 39.7297 Sabanagrande, Colombia, 10.8000, -74.7500 Santa Ana, Venezuela, 11.0680, -63.9221 Monteiro, Brazil, -7.8894, -37.1200 Vettam, India, 10.8667, 75.9000 Paidha, Uganda, 2.4167, 30.9875 Madhubani, India, 26.5147, 84.7645 Angamali, India, 10.1960, 76.3860 Orodara, Burkina Faso, 10.9800, -4.9100 Getafe, Philippines, 10.1500, 124.1500 Feldkirch, Austria, 47.2381, 9.5983 Darsi, India, 15.7667, 79.6833 Castro, Chile, -42.4667, -73.8000 Siripur, India, 25.9970, 86.9599 My Hoa, Vietnam, 10.3655, 105.4011 Orillia, Canada, 44.6000, -79.4167 Kacanik, Kosovo, 42.2319, 21.2594 Ban Pak Phun, Thailand, 8.5298, 99.9722 Ken Caryl, United States, 39.5770, -105.1144 Butajira, Ethiopia, 8.1208, 38.3792 Date, Japan, 42.4667, 140.8667 Geraardsbergen, Belgium, 50.7667, 3.8667 Manlius, United States, 43.0490, -75.9792 Santiago Juxtlahuaca, Mexico, 17.3333, -98.0167 Oguzeli, Turkey, 36.9650, 37.5092 Paso de Ovejas, Mexico, 19.2850, -96.4400 Kong, Côte d’Ivoire, 9.1506, -4.6103 Riachao do Jacuipe, Brazil, -11.8100, -39.3819 Asakuchi, Japan, 34.5247, 133.5875 Namhkam, Burma, 23.8333, 97.6833 Madikeri, India, 12.4209, 75.7397 Oulad Hammou, Morocco, 33.2499, -8.3346 Banate, Philippines, 11.0500, 122.7800 Tulum, Mexico, 20.2119, -87.4658 Kondapalle, India, 16.6183, 80.5411 Golbasi, Turkey, 37.7839, 37.6444 Landskrona, Sweden, 55.8667, 12.8333 Ipero, Brazil, -23.3503, -47.6886 Petersburg, United States, 37.2043, -77.3913 Julich, Germany, 50.9222, 6.3583 Uttaradit, Thailand, 17.6231, 100.0958 Loughton, United Kingdom, 51.6494, 0.0735 Bafang, Cameroon, 5.1500, 10.1833 Vintar, Philippines, 18.2306, 120.6489 An'gang, Korea, South, 35.9900, 129.2270 Dursunbey, Turkey, 39.5878, 28.6275 Shirakawa-tsuda, Japan, 38.0025, 140.6197 Shiroishi, Japan, 38.0025, 140.6197 Puyo, Ecuador, -1.4861, -78.0028 Batcha, Cameroon, 5.1500, 10.1833 Taishi, Japan, 34.8333, 134.5667 Boujad, Morocco, 32.7667, -6.4000 Al Mindak, Saudi Arabia, 20.1588, 41.2834 Montlucon, France, 46.3408, 2.6033 Argyroupoli, Greece, 37.9000, 23.7500 Bamaur, India, 26.3390, 78.1010 Amparafaravola, Madagascar, -17.5858, 48.2229 Ziniare, Burkina Faso, 12.5833, -1.3000 Dupax Del Norte, Philippines, 16.3075, 121.1019 Estreito, Brazil, -6.5608, -47.4508 Churi, India, 23.6549, 85.0128 Kidamangalam, India, 10.3167, 76.1333 Joao Camara, Brazil, -5.5378, -35.8200 Mohnyin, Burma, 24.7833, 96.3667 Beidou, Taiwan, 23.8747, 120.5248 Obukhiv, Ukraine, 50.1300, 30.6567 Shanawan, Egypt, 30.5031, 31.0058 Huntington Station, United States, 40.8446, -73.4050 Gillette, United States, 44.2752, -105.4982 Nowy Targ, Poland, 49.4667, 20.0167 Hisua, India, 24.8336, 85.4173 Olawa, Poland, 50.9333, 17.3000 Didouche Mourad, Algeria, 36.4500, 6.6333 Muconda, Angola, -10.6000, 21.3167 Calpulalpan, Mexico, 19.5869, -98.5683 Lower Makefield, United States, 40.2309, -74.8550 Zamania, India, 25.4194, 83.5569 Mengdan, China, 24.2752, 98.4672 Mazeikiai, Lithuania, 56.3167, 22.3333 Xincheng, China, 38.2667, 114.6833 Salaya, India, 22.3200, 69.6000 La Mesa, Colombia, 4.6303, -74.4625 Barguna, Bangladesh, 22.1567, 90.1176 Capim Grosso, Brazil, -11.3808, -40.0128 Stratford, Canada, 43.3708, -80.9819 Kampong Speu, Cambodia, 11.4520, 104.5190 Kolin, Czechia, 50.0281, 15.2006 Kavundappadi, India, 11.4248, 77.5579 Pivijay, Colombia, 10.4667, -74.6167 Ceres, South Africa, -33.3667, 19.3167 Bragado, Argentina, -35.1167, -60.5000 Alamat'a, Ethiopia, 12.4167, 39.5500 Geiro, Tanzania, -6.1428, 36.8694 Chester, United States, 39.8456, -75.3718 Gotse Delchev, Bulgaria, 41.5667, 23.7333 Guarambare, Paraguay, -25.4910, -57.4557 Kyrenia, Cyprus, 35.3403, 33.3192 Kartarpur, India, 31.4427, 75.4985 Manghit, Uzbekistan, 42.1167, 60.0667 Borne, India, 25.5431, 86.6999 Epe, Netherlands, 52.3464, 5.9842 Huyton, United Kingdom, 53.4111, -2.8403 Khvaf, Iran, 34.5711, 60.1439 Katiena, Mali, 13.3225, -5.6411 Aguimes, Spain, 27.8833, -15.4333 Pandami, Philippines, 5.5300, 120.7500 Gulkevichi, Russia, 45.3594, 40.7072 Nevers, France, 46.9933, 3.1572 Eirunepe, Brazil, -6.6597, -69.8744 Puerto Cumarebo, Venezuela, 11.4861, -69.3503 Partizansk, Russia, 43.1167, 133.1167 Marignane, France, 43.4160, 5.2145 West Little River, United States, 25.8571, -80.2367 Shamsabad, India, 27.0200, 78.1300 Sereflikochisar, Turkey, 38.9444, 33.5419 Romans-sur-Isere, France, 45.0464, 5.0517 Baocheng, China, 18.6431, 109.6994 Palmeira das Missoes, Brazil, -27.8994, -53.3136 Dipaculao, Philippines, 15.9800, 121.6300 Abingdon, United Kingdom, 51.6717, -1.2783 Shikarpur, India, 28.2814, 78.0108 Helena, United States, 46.5965, -112.0202 Korsakov, Russia, 46.6333, 142.7667 Panuco, Mexico, 22.0500, -98.1833 Kusapin, Panama, 9.1800, -81.8900 Minamikyushu, Japan, 31.3783, 130.4417 Umaria, India, 23.5250, 80.8361 Trowbridge, United Kingdom, 51.3200, -2.2080 Bugembe, Uganda, 0.4675, 33.2414 Knokke-Heist, Belgium, 51.3333, 3.2833 Aosta, Italy, 45.7372, 7.3206 Chernushka, Russia, 56.5167, 56.1000 Shima, Japan, 39.5544, 141.1555 Ross, United States, 40.5256, -80.0243 Tekkebhagam, India, 9.4361, 76.5667 El Arrouch, Algeria, 36.6531, 6.8364 Chanderi, India, 24.7200, 78.1300 Calape, Philippines, 9.8800, 123.8800 Nijar, Spain, 36.9667, -2.2000 Bethel Park, United States, 40.3238, -80.0364 Franklin, United States, 42.0862, -71.4113 Bungoono, Japan, 32.9775, 131.5842 Temascalapa, Mexico, 19.8000, -98.9000 Mushie, Congo (Kinshasa), -3.0167, 16.9167 Kamaishi, Japan, 39.2758, 141.8857 Timimoun, Algeria, 29.2628, -0.2389 Kareli, India, 22.9153, 79.0638 Castelfranco Emilia, Italy, 44.5967, 11.0528 Lampertheim, Germany, 49.6000, 8.4667 Tutin, Serbia, 42.9875, 20.3256 Taiobeiras, Brazil, -15.8078, -42.2328 `Ain el Hadjel, Algeria, 35.6739, 3.8817 San Luis, Cuba, 22.2828, -83.7681 Didy, Madagascar, -18.1200, 48.5515 Wakabadai, Japan, 45.4156, 141.6731 Touros, Brazil, -5.1989, -35.4608 Valuyki, Russia, 50.2167, 38.1000 Puebloviejo, Colombia, 10.9942, -74.2833 Dalnegorsk, Russia, 44.5500, 135.5833 Las Mercedes, Venezuela, 9.1104, -66.3961 Lubon, Poland, 52.3333, 16.8833 Jishi, China, 35.8461, 102.4817 Martinez, United States, 33.5209, -82.0985 East Lake, United States, 28.1206, -82.6868 Shingu, Japan, 33.7153, 130.4467 Hangal, India, 14.7646, 75.1246 Ksebia, Morocco, 34.2933, -6.1594 Xinbu, Taiwan, 24.8478, 121.0956 Osvaldo Cruz, Brazil, -21.7967, -50.8786 Luxitun, China, 22.2606, 107.6442 Garston, United Kingdom, 51.6889, -0.3845 Ambodimanga II, Madagascar, -17.2667, 49.1667 Vohitromby, Madagascar, -23.3085, 47.5316 Zumbo, Mozambique, -15.6148, 30.4440 Forbe Oroya, Peru, -11.5220, -75.9100 Gumdag, Turkmenistan, 39.2061, 54.5906 Gyzylgaya, Turkmenistan, 40.6219, 55.4656 Qorasuv, Uzbekistan, 40.7222, 72.8872 Nogent-sur-Marne, France, 48.8375, 2.4833 Villafranca di Verona, Italy, 45.3500, 10.8500 Hinda, Congo (Brazzaville), -4.6167, 12.0406 Spring Valley, United States, 41.1151, -74.0486 Pribram, Czechia, 49.6883, 14.0092 Turkauliya, India, 26.6079, 84.8296 Cottonwood Heights, United States, 40.6137, -111.8144 Clarence, United States, 43.0196, -78.6375 Boxtel, Netherlands, 51.5911, 5.3275 Porto Uniao, Brazil, -26.2378, -51.0778 Andradas, Brazil, -22.0678, -46.5689 Taguasco, Cuba, 22.0050, -79.2650 Sao Paulo de Olivenca, Brazil, -3.4500, -68.9500 Cleburne, United States, 32.3568, -97.4151 Foster City, United States, 37.5553, -122.2659 Achim, Germany, 53.0653, 9.0342 Herrenberg, Germany, 48.5967, 8.8708 Shalingzicun, China, 40.6807, 114.9205 Asse, Belgium, 50.9000, 4.2000 Bembe, Angola, -7.1000, 14.4500 Dellys, Algeria, 36.9133, 3.9141 Ornskoldsvik, Sweden, 63.2940, 18.7122 Itamarandiba, Brazil, -17.8569, -42.8589 Salina, United States, 43.1023, -76.1768 Djenne, Mali, 13.9000, -4.5500 Rencun, China, 22.6585, 112.3674 Dehloran, Iran, 32.6892, 47.2689 Dara, Senegal, 15.3508, -15.4783 Musikot-Khalanga, Nepal, 28.6291, 82.4554 Carapegua, Paraguay, -25.7634, -57.2468 Biritiba-Mirim, Brazil, -23.5728, -46.0389 Castelfranco Veneto, Italy, 45.6667, 11.9333 Saint-Georges, Canada, 46.0966, -70.6768 Araban, Turkey, 37.4247, 37.6928 Dumalinao, Philippines, 7.8200, 123.3700 Elesvaram, India, 17.2833, 82.1000 Yamanashi, Japan, 35.6934, 138.6869 Canyon Lake, United States, 29.8761, -98.2611 Massango, Angola, -11.3167, 14.9333 Aravan, Kyrgyzstan, 40.5161, 72.4996 Sherwood, United States, 34.8507, -92.2029 Baragua, Cuba, 21.6819, -78.6244 Saintard, Haiti, 18.8253, -72.5496 Fatehpur Sikri, India, 27.0910, 77.6610 Escuque, Venezuela, 9.2500, -70.7500 Fort Erie, Canada, 42.9167, -79.0167 Patratu, India, 23.6700, 85.2800 Moninnpebougou, Mali, 14.1508, -5.5208 Clearfield, United States, 41.1030, -112.0238 Dana Point, United States, 33.4733, -117.6967 Sanchor, India, 24.7536, 71.7714 Delbruck, Germany, 51.7667, 8.5667 Aksay, Kazakhstan, 51.1678, 52.9950 Dar Bel Hamri, Morocco, 34.1889, -5.9697 Pantelimon, Romania, 44.4500, 26.2000 Oued Zenati, Algeria, 36.3167, 7.1667 Kifri, Iraq, 34.6896, 44.9606 Rochester, United States, 43.2990, -70.9787 Tawsalun, Burma, 21.4060, 94.1360 Glendale Heights, United States, 41.9196, -88.0785 Kaysville, United States, 41.0290, -111.9456 Lohagaon, India, 20.5988, 77.6837 Lohogaon, India, 20.6000, 77.6833 So, Japan, 31.6533, 131.0192 Watari, Japan, 38.0378, 140.8526 Falmouth, United States, 41.5913, -70.5912 Odacho-oda, Japan, 35.1919, 132.4994 Villanueva, Mexico, 22.3536, -102.8831 Sanana, Indonesia, -2.0545, 125.9754 San Felipe, Mexico, 21.4833, -101.2167 Bell, United States, 33.9801, -118.1798 Kollo, Niger, 13.0167, 1.8833 Novodvinsk, Russia, 64.4167, 40.8333 Cheb, Czechia, 50.0794, 12.3706 Andover, United States, 45.2571, -93.3265 Carache, Venezuela, 9.7072, -70.1933 Kakira, Uganda, 0.5036, 33.2825 Gostivar, North Macedonia, 41.8000, 20.9167 Umarkot, India, 19.6653, 82.2063 Urbano Santos, Brazil, -3.2078, -43.4039 Ames, Spain, 42.9000, -8.6333 Sertania, Brazil, -8.0706, -37.2658 Brooklyn Center, United States, 45.0681, -93.3162 Pilar, Paraguay, -26.8695, -58.3000 Arumuganeri, India, 8.5717, 78.0922 Igrejinha, Brazil, -29.5739, -50.7900 Tecuci, Romania, 45.8467, 27.4278 Baraawe, Somalia, 1.1133, 44.0303 Teutonia, Brazil, -29.4478, -51.8058 Ticul, Mexico, 20.3953, -89.5339 Sighetu Marmatiei, Romania, 47.9286, 23.8925 Buco Zau, Angola, -4.7617, 12.5419 Desert Hot Springs, United States, 33.9550, -116.5429 Parambil, India, 11.5575, 75.7605 Bela Cruz, Brazil, -3.0508, -40.1678 Rubino, Côte d’Ivoire, 6.0692, -4.3086 Menlo Park, United States, 37.4685, -122.1673 Los Gatos, United States, 37.2304, -121.9562 Ubajara, Brazil, -3.8544, -40.9211 Geesthacht, Germany, 53.4375, 10.3675 Furstenwalde, Germany, 52.3667, 14.0667 Bocas de Satinga, Colombia, 2.3469, -78.3256 Baja, Hungary, 46.1833, 18.9536 Udaipur, India, 23.5389, 91.4917 Sayram, Kazakhstan, 42.3000, 69.7667 Castelo, Brazil, -20.6039, -41.1850 Chand Chaur, India, 25.7276, 85.7865 Val-d'Or, Canada, 48.1000, -77.7833 Saint-Medard-en-Jalles, France, 44.8964, -0.7164 Mankada, India, 11.0187, 76.1755 Ingenio, Spain, 27.9214, -15.4325 Puerto Escondido, Colombia, 8.9500, -76.2500 Balzar, Ecuador, -1.3600, -79.9000 Baroueli, Mali, 13.0769, -6.8311 St. Charles, United States, 41.9193, -88.3109 Kallur, India, 8.6714, 76.7944 Oshnaviyeh, Iran, 37.0364, 45.0956 Sayula de Aleman, Mexico, 17.8833, -94.9500 LaSalle, Canada, 42.2167, -83.0667 Ivaipora, Brazil, -24.2478, -51.6850 Gonglang, China, 24.8392, 100.3122 Rodas, Cuba, 22.3428, -80.5553 Warwick, United Kingdom, 52.2800, -1.5900 Geraldton, Australia, -28.7744, 114.6089 Pasadena, United States, 39.1552, -76.5537 Ansongo, Mali, 15.6650, 0.5028 Vadavalli, India, 11.0258, 76.9038 Savage, United States, 44.7545, -93.3632 Jaguarari, Brazil, -10.2600, -40.1958 Tskhinvali, Georgia, 42.2257, 43.9701 Yufu, Japan, 33.1800, 131.4267 Lens, France, 50.4322, 2.8333 Lathrop, United States, 37.8090, -121.3131 Debagram, India, 23.6833, 88.2833 Sidi Smai'il, Morocco, 32.8167, -8.5000 Goleta, United States, 34.4361, -119.8594 Silvia, Colombia, 2.6167, -76.3833 Cota, Colombia, 4.8167, -74.1000 Nanjikkottai, India, 10.7453, 79.1289 Arcos, Brazil, -20.2914, -45.5397 Sao Joao Batista, Brazil, -27.2758, -48.8489 Xiaodian, China, 40.0742, 116.8258 Vargem Grande Paulista, Brazil, -23.6028, -47.0258 Vilakkudi, India, 9.0167, 76.8500 Yuzhne, Ukraine, 46.6300, 31.1000 Zhanjia, China, 34.7564, 109.3846 Ilawa, Poland, 53.5964, 19.5656 Itaiba, Brazil, -8.9478, -37.4228 City Bell, Argentina, -34.8500, -58.0500 Jamikunta, India, 18.2864, 79.4761 Krabi, Thailand, 8.0592, 98.9189 San Sebastian de Mariquita, Colombia, 5.2500, -74.9167 Earley, United Kingdom, 51.4330, -0.9330 Taranagar, India, 28.6689, 75.0406 Putla Villa de Guerrero, Mexico, 17.0167, -97.9167 El Dificil, Colombia, 9.8500, -74.2386 Belhi, India, 26.5769, 86.1723 Ventspils, Latvia, 57.3906, 21.5733 Frederico Westphalen, Brazil, -27.3589, -53.3939 Dartmouth, United States, 41.6138, -70.9973 Mechraa Bel Ksiri, Morocco, 34.5600, -5.9500 San Lazzaro di Savena, Italy, 44.4716, 11.4049 Ain el Bya, Algeria, 35.8167, -0.2833 Bozdogan, Turkey, 37.6728, 28.3103 Xinyuan, Taiwan, 22.5149, 120.4470 Arris, Algeria, 35.2500, 6.3500 Mayantoc, Philippines, 15.6203, 120.3775 Krasnik, Poland, 50.9167, 22.2167 Motherwell, United Kingdom, 55.7839, -3.9852 Mashiki, Japan, 32.7833, 130.8000 Matalom, Philippines, 10.2800, 124.8000 Diplahan, Philippines, 7.6911, 122.9853 Businga, Congo (Kinshasa), 3.3397, 20.8700 Shamsabad, India, 17.2603, 78.3969 Inza, Colombia, 2.5500, -76.0667 Isser, Algeria, 36.7160, 3.6660 Lichfield, United Kingdom, 52.6820, -1.8290 Radolfzell am Bodensee, Germany, 47.7333, 8.9667 Erraguntla, India, 14.6333, 78.5333 Balindong, Philippines, 7.9200, 124.2000 Shimanto, Japan, 33.0000, 132.9333 Ain Bessem, Algeria, 36.2967, 3.6700 Ain Smara, Algeria, 36.2664, 6.4967 Villiers-sur-Marne, France, 48.8275, 2.5447 Mateur, Tunisia, 37.0400, 9.6650 Des Moines, United States, 47.3914, -122.3156 Garner, United States, 35.6936, -78.6181 Chemancheri, India, 11.4116, 75.7350 Badoc, Philippines, 17.9267, 120.4754 Godollo, Hungary, 47.6000, 19.3667 Hani, Turkey, 38.4136, 40.3925 I-n-Salah, Algeria, 27.1950, 2.4833 Madira, India, 16.9167, 80.3667 Cacapava do Sul, Brazil, -30.5119, -53.4908 Dolores, Philippines, 14.0157, 121.4011 Lobougoula, Mali, 11.0375, -5.9906 Minamisatsuma, Japan, 31.4167, 130.3233 Garfield, United States, 40.8791, -74.1085 Burgess Hill, United Kingdom, 50.9535, -0.1262 Manwat, India, 19.3000, 76.5000 Shiyeli, Kazakhstan, 44.1789, 66.7328 Shahrabad, Iran, 35.6883, 50.8397 Pombal, Brazil, -6.7700, -37.8019 Baiyan, China, 26.3584, 106.2347 Boryslav, Ukraine, 49.2892, 23.4189 Yinchengpu, China, 39.8189, 118.1880 Ourilandia do Norte, Brazil, -6.7550, -51.0839 Nueva Italia de Ruiz, Mexico, 19.0194, -102.1089 Fallbrook, United States, 33.3693, -117.2259 Sotouboua, Togo, 8.5667, 0.9833 Fucheng, China, 35.3725, 103.7056 Lower Macungie, United States, 40.5303, -75.5700 Sukhoy Log, Russia, 56.9167, 62.0167 Staryy Beyneu, Kazakhstan, 45.1834, 55.1000 Virei, Angola, -15.7167, 12.9500 Chemmaruthi, India, 8.7597, 76.7435 Turaiyur, India, 11.1497, 78.5987 Sendawar, Indonesia, 2.1833, 98.3833 Deurne, Netherlands, 51.4639, 5.7947 Nouna, Burkina Faso, 12.7333, -3.8667 Abbiategrasso, Italy, 45.4009, 8.9185 Omaezaki, Japan, 34.6379, 138.1281 Dioungani, Mali, 14.3131, -2.7394 Vrilissia, Greece, 38.0333, 23.8333 Sosnogorsk, Russia, 63.6000, 53.9000 Bussum, Netherlands, 52.2833, 5.1667 Sindirgi, Turkey, 39.2400, 28.1750 Sitges, Spain, 41.2370, 1.8230 Nedroma, Algeria, 35.0000, -1.7333 Razgrad, Bulgaria, 43.5409, 26.5288 Kamen'-na-Obi, Russia, 53.7833, 81.3333 Ketti, India, 11.4000, 76.7000 Kameda-honcho, Japan, 37.8678, 139.0942 Dumfries, United Kingdom, 55.0700, -3.6030 Pires do Rio, Brazil, -17.3008, -48.2800 Oisterwijk, Netherlands, 51.5833, 5.2000 Chamtha, India, 25.5789, 85.7734 Brighouse, United Kingdom, 53.7070, -1.7940 Massantola, Mali, 13.4889, -7.8058 Dracut, United States, 42.6832, -71.3010 Kiranomena, Madagascar, -18.2955, 46.0521 Yankou, China, 27.5950, 105.4174 Guararapes, Brazil, -21.2608, -50.6428 Shobara, Japan, 34.8544, 133.0192 Kavlinge, Sweden, 55.8000, 13.1000 Pattanapuram, India, 9.0927, 76.8612 Naumburg, Germany, 51.1500, 11.8167 Ire, Nigeria, 7.9361, 4.7250 Lawrence, United States, 40.2954, -74.7205 Florence, United States, 38.9899, -84.6471 Aiken, United States, 33.5303, -81.7271 La Virginia, Colombia, 4.9167, -75.8333 Sasthankotta, India, 9.0365, 76.6239 Manakkara, India, 9.0365, 76.6239 Lumbang, Philippines, 14.2970, 121.4590 Narsinghgarh, India, 23.7000, 77.1000 San Pedro de Uraba, Colombia, 8.2833, -76.3833 Kalyandrug, India, 14.5500, 77.1000 Wigston Magna, United Kingdom, 52.5812, -1.0930 Lugo, Italy, 44.4214, 11.9109 Itzehoe, Germany, 53.9250, 9.5164 Bilzen, Belgium, 50.8730, 5.5163 Oharu, Japan, 35.1751, 136.8201 Namerikawa, Japan, 36.7644, 137.3412 Chancay, Peru, -11.5653, -77.2714 Buenaventura Lakes, United States, 28.3349, -81.3539 Sant'Antimo, Italy, 40.9431, 14.2368 Terga, Algeria, 35.4167, -1.1833 Iranduba, Brazil, -3.2850, -60.1886 Nagarote, Nicaragua, 12.2667, -86.5667 El Abiodh Sidi Cheikh, Algeria, 32.8986, 0.5444 Madinat al Habbaniyah, Iraq, 33.3836, 43.5855 Nurota, Uzbekistan, 40.5650, 65.6850 Tattamangalam, India, 10.7000, 76.7500 Sibiti, Congo (Brazzaville), -3.6850, 13.3511 Epinal, France, 48.1744, 6.4512 Cachoeira Paulista, Brazil, -22.6650, -45.0094 Littlehampton, United Kingdom, 50.8094, -0.5409 Curanilahue, Chile, -37.4764, -73.3444 Venaria Reale, Italy, 45.1167, 7.6333 Komarno, Slovakia, 47.7633, 18.1283 Agioi Anargyroi, Greece, 38.0267, 23.7183 Messamena, Cameroon, 3.7333, 12.8333 Concon, Chile, -32.9167, -71.5167 Manises, Spain, 39.4833, -0.4500 Tavda, Russia, 58.0500, 65.2667 Chalatenango, El Salvador, 14.0333, -88.9333 Chiche, Guatemala, 15.0106, -91.0650 Penaranda, Philippines, 15.3531, 121.0017 Niena, Mali, 11.4247, -6.3458 Alatyr, Russia, 54.8500, 46.5833 Zarqan, Iran, 29.7683, 52.7186 Zaojiao, China, 34.4727, 105.7062 Primorsko-Akhtarsk, Russia, 46.0500, 38.1667 Jimalalud, Philippines, 9.9797, 123.1999 Bambadinca, Guinea-Bissau, 12.0333, -14.8667 Boro, Mali, 14.0152, -7.5121 Rayleigh, United Kingdom, 51.5864, 0.6049 Guanhaes, Brazil, -18.7750, -42.9328 Tafas, Syria, 32.7371, 36.0665 Sao Bento, Brazil, -6.4858, -37.4508 Termoli, Italy, 42.0028, 14.9947 Laranjeiras do Sul, Brazil, -25.4078, -52.4158 Yokaichiba, Japan, 35.7000, 140.5604 Sebaco, Nicaragua, 12.8500, -86.1000 Paraipaba, Brazil, -3.4389, -39.1478 Arrecifes, Argentina, -34.0667, -60.1167 Spring Valley, United States, 32.7317, -116.9766 Safita, Syria, 34.8210, 36.1177 Lajedo, Brazil, -8.6639, -36.3200 Mallig, Philippines, 17.2086, 121.6106 Kindi, Burkina Faso, 12.4333, -2.0167 Casale Monferrato, Italy, 45.1342, 8.4583 Buloqboshi, Uzbekistan, 40.6222, 72.5028 Cochrane, Canada, 51.1890, -114.4670 Igbaras, Philippines, 10.7200, 122.2700 Maryville, United States, 35.7468, -83.9789 Piombino, Italy, 42.9348, 10.5221 Agen, France, 44.2049, 0.6212 Kristianstad, Sweden, 56.0337, 14.1333 Hutto, United States, 30.5396, -97.5440 Didcot, United Kingdom, 51.6060, -1.2410 Windsor, United Kingdom, 51.4791, -0.6095 Kulebaki, Russia, 55.4167, 42.5333 Long Branch, United States, 40.2965, -73.9915 Estrela, Brazil, -29.5019, -51.9658 Nagato, Japan, 34.3706, 131.1825 Gandu, Brazil, -13.7439, -39.4869 Ibate, Brazil, -21.9550, -47.9969 Massillon, United States, 40.7838, -81.5254 Xangda, China, 32.2055, 96.4781 Aix-les-Bains, France, 45.6885, 5.9153 Matoes, Brazil, -5.5189, -43.1989 Maragogi, Brazil, -9.0122, -35.2225 Homa Bay, Kenya, -0.5167, 34.4500 Catubig, Philippines, 12.4080, 125.0540 Myski, Russia, 53.7000, 87.8167 Yorii, Japan, 36.1183, 139.1930 Papendrecht, Netherlands, 51.8333, 4.6833 Ortega, Colombia, 3.9167, -75.2500 Alubijid, Philippines, 8.5714, 124.4751 Wheat Ridge, United States, 39.7728, -105.1028 Catende, Brazil, -8.6669, -35.7169 Trevani, Mayotte, -12.7385, 45.2071 Koungou, Mayotte, -12.7385, 45.2071 Rokhaty, Tajikistan, 38.6000, 68.9333 Sint-Amandsberg, Belgium, 51.0539, 3.7492 Eramala, India, 11.6789, 75.5931 Miguel Alves, Brazil, -4.1658, -42.8950 Montigny-le-Bretonneux, France, 48.7711, 2.0333 Ganderkesee, Germany, 53.0358, 8.5483 Buguey, Philippines, 18.2882, 121.8331 Utraula, India, 27.3200, 82.4200 O'Fallon, United States, 38.5974, -89.9148 Salug, Philippines, 8.1075, 122.7575 Elk Grove Village, United States, 42.0064, -87.9921 Shilou, China, 39.6519, 115.9747 Pojuca, Brazil, -12.3500, -38.3333 Ptolemaida, Greece, 40.5167, 21.6833 Konan, Japan, 33.5667, 133.7000 San Pedro de Ribas, Spain, 41.2597, 1.7736 Maputsoe, Lesotho, -28.8950, 27.9070 Termas de Rio Hondo, Argentina, -27.4833, -64.8667 Balimbing, Philippines, 7.9000, 123.8500 Caramoran, Philippines, 13.9800, 124.1300 Ribeira Grande, Portugal, 37.8167, -25.5167 Huixtla, Mexico, 15.1386, -92.4647 Canada de Gomez, Argentina, -32.8167, -61.4000 Mizuho, Japan, 35.7720, 139.3540 Campo Alegre, Brazil, -9.7819, -36.3508 Bernburg, Germany, 51.8000, 11.7333 Deptford, United States, 39.8157, -75.1181 Nacogdoches, United States, 31.6134, -94.6528 Odamachi, Japan, 35.1921, 132.4994 Rumbek, South Sudan, 6.8000, 29.6833 Waiyuanshan, Taiwan, 24.7443, 121.6684 Aguilares, Argentina, -27.4333, -65.6167 Guaira, Brazil, -24.0800, -54.2558 Ouro Fino, Brazil, -22.2828, -46.3689 Kukshi, India, 22.2068, 74.7579 Mangur, India, 17.9373, 80.8185 Nueva Concepcion, El Salvador, 14.1333, -89.3000 Oak Ridge, United States, 35.9639, -84.2938 Mardakan, Azerbaijan, 40.4918, 50.1429 Quitilipi, Argentina, -26.8667, -60.2167 Kovur, India, 14.5001, 79.9859 Sami, Burma, 21.2933, 93.0965 Antsohimbondrona, Madagascar, -13.0910, 48.8442 Tamparan, Philippines, 7.8790, 124.3330 Tosno, Russia, 59.5500, 30.9000 Shepparton, Australia, -36.3833, 145.4000 Dhahran, Saudi Arabia, 26.2667, 50.1500 Needham, United States, 42.2814, -71.2411 Remedios, Colombia, 7.0275, -74.6939 Uglich, Russia, 57.5333, 38.3333 Ciudad Sabinas Hidalgo, Mexico, 26.5000, -100.1833 Niksic, Montenegro, 42.7778, 18.9500 Saint Paul's Bay, Malta, 35.9483, 14.4017 Sao Miguel Arcanjo, Brazil, -23.8778, -47.9969 Menglie, China, 22.5833, 101.8661 North Olmsted, United States, 41.4149, -81.9190 Fair Oaks, United States, 38.6504, -121.2496 Munnar, India, 10.0892, 77.0597 Fontana, Argentina, -27.4167, -59.0333 Chachapoyas, Peru, -6.2167, -77.8500 Brasilia de Minas, Brazil, -16.2078, -44.4289 Georgsmarienhutte, Germany, 52.2000, 8.0667 Malangas, Philippines, 7.6317, 123.0322 Bauko, Philippines, 16.9917, 120.8644 Bizen, Japan, 34.7453, 134.1889 San Donato Milanese, Italy, 45.4167, 9.2667 Atwater, United States, 37.3529, -120.5959 Sakaiminato, Japan, 35.5333, 133.2333 Cornelius, United States, 35.4724, -80.8813 Thiais, France, 48.7650, 2.3923 South Kingstown, United States, 41.4458, -71.5440 Santo Tomas, Colombia, 10.7667, -74.9167 Cabaiguan, Cuba, 22.0839, -79.4953 Bandarawela, Sri Lanka, 6.8333, 80.9853 Andriba, Madagascar, -17.5977, 46.9308 Bekoratsaka, Madagascar, -16.1083, 47.4914 Vohilava, Madagascar, -21.0776, 48.0092 Itampolo, Madagascar, -24.6829, 43.9512 Ambano, Madagascar, -19.7968, 47.0490 Ghuenke, Pakistan, 32.4244, 74.4603 Yaguaron, Paraguay, -25.5622, -57.2866 Ezine, Turkey, 39.7900, 26.3325 Makhdumpur, India, 25.0720, 84.9730 Milot, Haiti, 19.6084, -72.2132 Aalsmeer, Netherlands, 52.2667, 4.7500 North Cowichan, Canada, 48.8236, -123.7192 Wrzesnia, Poland, 52.3333, 17.5833 Youwangjie, China, 24.8667, 99.0833 West Odessa, United States, 31.8389, -102.5003 Arzano, Italy, 40.9153, 14.2681 Levice, Slovakia, 48.2136, 18.6069 Plaisir, France, 48.8183, 1.9472 Juneau, United States, 58.4546, -134.1739 Nuevo Progreso, Guatemala, 14.8000, -91.9167 Puraini, India, 25.1426, 86.9797 Mascalucia, Italy, 37.5737, 15.0518 Massafra, Italy, 40.5833, 17.1167 Duluth, United States, 34.0053, -84.1492 Tholikuzhi, India, 8.6526, 77.0704 Beverly Hills, United States, 34.0786, -118.4021 Ban Bang Krang, Thailand, 13.8422, 100.4539 La Concepcion, Nicaragua, 11.9333, -86.1833 Mangalia, Romania, 43.8172, 28.5828 Opelika, United States, 32.6612, -85.3769 Willingboro, United States, 40.0280, -74.8882 Wernigerode, Germany, 51.8350, 10.7853 Nisia Floresta, Brazil, -6.0908, -35.2089 Landecy, Switzerland, 46.1834, 6.1166 Sergio Osmena Sr, Philippines, 8.3003, 123.5083 Milford Mill, United States, 39.3444, -76.7668 Pullman, United States, 46.7336, -117.1680 San Carlos Alzatate, Guatemala, 14.5000, -90.0667 Akouda, Tunisia, 35.8714, 10.5697 Neropolis, Brazil, -16.4058, -49.2189 Erie, United States, 40.0404, -105.0399 Quintero, Chile, -32.7833, -71.5333 Bougaa, Algeria, 36.3333, 5.0833 Santo Antonio do Taua, Brazil, -1.1519, -48.1294 Araguatins, Brazil, -5.6508, -48.1239 Xaxim, Brazil, -26.9619, -52.5350 Oer-Erkenschwick, Germany, 51.6422, 7.2508 Palamel, India, 9.1875, 76.6498 Purattur, India, 10.8022, 75.9225 Warwick, United States, 41.2597, -74.3614 Southport, Australia, -27.9678, 153.4136 Polillo, Philippines, 14.7200, 121.9500 Nilka, China, 43.7826, 82.5089 Oceanside, United States, 40.6328, -73.6364 Santa Maria Capua Vetere, Italy, 41.0833, 14.2500 Erdek, Turkey, 40.3986, 27.7931 Canuelas, Argentina, -35.0333, -58.7333 Atlautla, Mexico, 19.0279, -98.7814 Claveria, Philippines, 18.6061, 121.0822 Lovech, Bulgaria, 43.1348, 24.7115 Cacolo, Angola, -10.1333, 19.2667 Avellaneda, Argentina, -34.6625, -58.3678 Paso del Macho, Mexico, 18.9667, -96.7167 Bayaguana, Dominican Republic, 18.7600, -69.6400 Samut Prakan, Thailand, 13.5897, 100.6386 Turicato, Mexico, 19.0500, -101.4167 Kampong Thom, Cambodia, 12.7000, 104.9000 Jyvaskylan Maalaiskunta, Finland, 62.2889, 25.7417 Alengad, India, 10.1000, 76.3000 Paipa, Colombia, 5.8333, -73.1500 Oudenaarde, Belgium, 50.8500, 3.6000 Dzierzoniow, Poland, 50.7281, 16.6511 Marrero, United States, 29.8871, -90.1126 Newburgh, United States, 41.5531, -74.0599 Gurpinar, Turkey, 38.3269, 43.4133 Allen, Argentina, -38.9667, -67.8333 Buu Long, Vietnam, 10.9600, 106.7967 Palmeiras de Goias, Brazil, -16.8050, -49.9258 Guachaves, Colombia, 1.2219, -77.6772 Maur Kalan, India, 30.0800, 75.2500 Laramie, United States, 41.3099, -105.6085 El Oro de Hidalgo, Mexico, 19.8008, -100.1314 Exu, Brazil, -7.5133, -39.7239 Savonlinna, Finland, 61.8681, 28.8861 Remchi, Algeria, 35.0667, -1.4333 Pampanito, Venezuela, 9.4114, -70.4958 Sherpur, India, 25.6539, 84.9793 Calafell, Spain, 41.2020, 1.5700 Namegata, Japan, 35.9905, 140.4890 Jhanjharpur, India, 26.2647, 86.2799 Tredyffrin, United States, 40.0663, -75.4540 Rahachow, Belarus, 53.1000, 30.0500 Sao Gotardo, Brazil, -19.3111, -46.0489 Sao Bento, Brazil, -2.6958, -44.8208 Alamnagar, India, 25.5610, 86.9014 Palmira, Cuba, 22.2444, -80.3944 Carlsbad, United States, 32.4010, -104.2388 Pekin, United States, 40.5678, -89.6251 Santa Rita, Venezuela, 10.5318, -71.5039 North Huntingdon, United States, 40.3294, -79.7336 San Lucas Toliman, Guatemala, 14.6333, -91.1333 Neuruppin, Germany, 52.9331, 12.8000 Masi-Manimba, Congo (Kinshasa), -4.7790, 17.9077 Bramsche, Germany, 52.4000, 7.9833 Sun City Center, United States, 27.7150, -82.3569 Tongxiao, Taiwan, 24.4833, 120.6833 Rome, United States, 43.2260, -75.4909 Ithaca, United States, 42.4442, -76.5032 Bagasra, India, 21.4833, 70.9500 Stadskanaal, Netherlands, 52.9895, 6.9504 Hlukhiv, Ukraine, 51.6747, 33.9133 Seguin, United States, 29.5891, -97.9676 Hassi Khelifa, Algeria, 33.5622, 6.9903 Gallipoli, Turkey, 40.4139, 26.6703 Kottaikuppam, India, 11.9613, 79.8392 Ferrenafe, Peru, -6.7183, -79.7703 San Pablo, United States, 37.9629, -122.3426 Velliyod, India, 11.6256, 75.6294 Komagane, Japan, 35.7288, 137.9339 Pantabangan, Philippines, 15.8086, 121.1433 Tubao, Philippines, 16.3500, 120.4200 Bocana de Paiwas, Nicaragua, 12.7861, -85.1231 Singia, India, 25.8424, 86.1622 General Jose de San Martin, Argentina, -26.5375, -59.3417 Descalvado, Brazil, -21.9039, -47.6189 Pimenta Bueno, Brazil, -11.6725, -61.1936 Tekkekara Kizhakku, India, 9.2000, 76.5000 'Ain Abid, Algeria, 36.2325, 6.9440 La Mana, Ecuador, -0.9300, -79.2200 Farrokh Shahr, Iran, 32.2733, 50.9800 Dania Beach, United States, 26.0593, -80.1637 Sadabad, India, 27.4500, 78.0500 Chapa de Mota, Mexico, 19.8144, -99.5269 Amatenango de la Frontera, Mexico, 15.5333, -92.0833 Al `Aydabi, Saudi Arabia, 17.2334, 42.9419 Lake Magdalene, United States, 28.0875, -82.4791 Donggou, China, 35.5600, 112.7028 La Uruca, Costa Rica, 9.9575, -84.1327 Maebara, Japan, 35.1140, 140.0989 West Bend, United States, 43.4173, -88.1818 Kochugaon, India, 26.5518, 90.0762 Staffanstorp, Sweden, 55.6333, 13.2167 Tuljapur, India, 18.0085, 76.0699 Bostanici, Turkey, 38.5072, 43.4356 Kavar, Iran, 29.2017, 52.6917 Santa Catarina Mita, Guatemala, 14.4500, -89.7500 Sitionuevo, Colombia, 10.7833, -74.7167 El Palmar, Guatemala, 14.6500, -91.5833 Jaguaruana, Brazil, -4.8339, -37.7808 Oldenzaal, Netherlands, 52.3125, 6.9292 Bethany, United States, 45.5614, -122.8370 Ostrogozhsk, Russia, 50.8667, 39.0667 Lalgola, India, 24.4200, 88.2500 Baraderes, Haiti, 18.4826, -73.6388 Sigma, Philippines, 11.4214, 122.6662 Rushden, United Kingdom, 52.2880, -0.6010 Amecameca de Juarez, Mexico, 19.7500, -99.1711 Orestiada, Greece, 41.5000, 26.5333 Zhaoyu, China, 37.3512, 112.3193 Jasim, Syria, 32.9912, 36.0609 Bagrami, Afghanistan, 34.4911, 69.2756 Itapicuru, Brazil, -11.3169, -38.2328 Otegen Batyr, Kazakhstan, 43.3333, 77.0500 Kumba, Cameroon, 4.6333, 9.4500 Masur, India, 17.2800, 74.2000 Vught, Netherlands, 51.6533, 5.2875 Bangor, United States, 44.8323, -68.7906 Shimizucho, Japan, 35.0990, 138.9029 Nautan Dube, India, 26.7118, 84.5030 Barros Blancos, Uruguay, -34.7542, -56.0042 Rumuruti, Kenya, 0.2725, 36.5381 Calubian, Philippines, 11.4467, 124.4278 Capela, Brazil, -10.5028, -37.0528 Saint-Laurent-du-Var, France, 43.6680, 7.1880 Siquirres, Costa Rica, 10.0901, -83.5016 Naugatuck, United States, 41.4890, -73.0518 Yeovil, United Kingdom, 50.9452, -2.6370 Nueva Imperial, Chile, -38.7433, -72.9500 Mundelein, United States, 42.2693, -88.0102 Nicholasville, United States, 37.8906, -84.5668 Balyqshy, Kazakhstan, 47.0667, 51.8667 Pontoise, France, 49.0516, 2.1017 Morro Agudo, Brazil, -20.7314, -48.0578 Zentsujicho, Japan, 34.2167, 133.7833 Middle River, United States, 39.3436, -76.4253 Kiryandongo, Uganda, 1.9525, 32.1389 Tecozautla, Mexico, 20.5333, -99.6333 Osawa, Japan, 33.2067, 130.3839 Kuroishi, Japan, 40.6426, 140.6113 Jesus Maria, Argentina, -30.9833, -64.1000 Jalpatagua, Guatemala, 14.1333, -90.0167 Jerez, Guatemala, 14.1000, -89.7500 Bel Air North, United States, 39.5543, -76.3732 Chum Phae, Thailand, 16.5443, 102.0992 Carballo, Spain, 43.2167, -8.6833 Favara, Italy, 37.3186, 13.6631 Media Luna, Cuba, 20.1444, -77.4361 Chorbog, Tajikistan, 38.6667, 68.7667 Masatepe, Nicaragua, 11.9167, -86.1500 Zepce, Bosnia and Herzegovina, 44.4333, 18.0333 Pruszcz Gdanski, Poland, 54.2667, 18.6333 Lloydminster, Canada, 53.2783, -110.0050 Manlin, China, 23.6630, 101.8853 Altenburg, Germany, 50.9850, 12.4333 Great Sankey, United Kingdom, 53.3918, -2.6383 Nanyuki, Kenya, 0.0167, 37.0667 Merida, Philippines, 10.9098, 124.5376 Rass el Djebel, Tunisia, 37.2150, 10.1200 Fangyuan, Taiwan, 23.9250, 120.3158 Cambrai, France, 50.1767, 3.2356 Fitchburg, United States, 42.9859, -89.4255 New Bern, United States, 35.0955, -77.0723 Cururupu, Brazil, -1.8278, -44.8678 Katagami, Japan, 39.8832, 139.9886 Vienne, France, 45.5242, 4.8781 Pehuajo, Argentina, -35.8000, -61.9000 Cueto, Cuba, 20.6481, -75.9317 Lakeside, United States, 30.1356, -81.7674 Thazhamel, India, 8.8667, 76.6667 Hayama, Japan, 35.2725, 139.5861 Rahatgarh, India, 23.7800, 78.3700 Ayabe, Japan, 35.3000, 135.2667 I`zaz, Syria, 36.5866, 37.0463 Ivrindi, Turkey, 39.5833, 27.4833 Shawnee, United States, 35.3531, -96.9647 Puerto Wilches, Colombia, 7.3500, -73.9000 Shikarpur, India, 14.2700, 75.3500 Kurivikod, India, 8.3196, 77.1104 Centereach, United States, 40.8681, -73.0821 Buzovna, Azerbaijan, 40.5167, 50.1167 Encrucijada, Cuba, 22.6180, -79.8660 Prestwich, United Kingdom, 53.5333, -2.2833 Cholavandan, India, 10.0167, 77.9667 Voula, Greece, 37.8500, 23.7500 Charthawal, India, 29.5500, 77.5833 Knjazevac, Serbia, 43.5000, 22.4333 Eagle, United States, 43.7223, -116.3866 Epsom, United Kingdom, 51.3331, -0.2686 Dialoube, Mali, 15.0192, -4.2325 Colombia, Cuba, 20.9906, -77.4158 Qara, Saudi Arabia, 29.8833, 40.2167 Rillieux-la-Pape, France, 45.8214, 4.8983 Samdhin, India, 27.1370, 79.7030 LaGrange, United States, 33.0274, -85.0384 Dej, Romania, 47.0872, 23.8053 Sejiyon, Korea, North, 41.8000, 128.3167 Zug, Switzerland, 47.1681, 8.5169 Elur, India, 10.0667, 76.3000 Mandaguacu, Brazil, -23.3469, -52.0950 Mont-de-Marsan, France, 43.8900, -0.5000 Bangassou, Central African Republic, 4.7374, 22.8195 Airmadidi, Indonesia, 1.4333, 124.9833 Parambu, Brazil, -6.2108, -40.6939 Save, Benin, 8.0333, 2.4833 Chambly, Canada, 45.4311, -73.2873 Zionsville, United States, 39.9897, -86.3182 Kalisizo, Uganda, -0.5350, 31.6225 Nagdha Simla, Bangladesh, 24.6071, 89.9151 Jam, Iran, 27.8211, 52.3306 Trebinje, Bosnia and Herzegovina, 42.7089, 18.3217 Forquilhinha, Brazil, -28.7469, -49.4719 Zeghanghane, Morocco, 35.1500, -3.0000 Nauagarhi, India, 25.3443, 86.5358 Deori Khas, India, 23.3902, 79.0163 Renkum, Netherlands, 51.9738, 5.7294 Nieuw-Vennep, Netherlands, 52.2644, 4.6347 Lemery, Philippines, 11.2300, 122.9300 Wevelgem, Belgium, 50.8000, 3.1667 Dagestanskiye Ogni, Russia, 42.1167, 48.1833 Areka, Ethiopia, 7.0710, 37.7076 Hoyerswerda, Germany, 51.4333, 14.2500 Kunnatnad, India, 10.0179, 76.4010 Neira, Colombia, 5.1664, -75.5189 Kolachel, India, 8.1767, 77.2591 Kaseda-shirakame, Japan, 31.4167, 130.3233 Sanha, India, 25.4020, 86.3592 Shentang, China, 22.2985, 113.4313 Halden, Norway, 59.1500, 11.3833 Yawatahama-shi, Japan, 33.4667, 132.4167 Vellanad, India, 8.4461, 77.1971 Ilhavo, Portugal, 40.6000, -8.6667 Draa Ben Khedda, Algeria, 36.7333, 3.9667 Alcazar de San Juan, Spain, 39.4056, -3.2056 Aspropyrgos, Greece, 38.0667, 23.5833 Buyan, Taiwan, 23.9961, 120.4618 Norwood, United States, 42.1861, -71.1948 Navalcarnero, Spain, 40.2847, -4.0136 Christchurch, United Kingdom, 50.7300, -1.7800 Puerto de la Cruz, Spain, 28.4167, -16.5333 Courcelles, Belgium, 50.4667, 4.3667 Myoko, Japan, 37.0252, 138.2535 Colider, Brazil, -10.8128, -55.4550 Bolobo, Congo (Kinshasa), -2.1667, 16.2333 Sri Madhopur, India, 27.4667, 75.6000 Novoyavorovskoye, Ukraine, 49.9311, 23.5731 Bagac, Philippines, 14.5951, 120.3918 Humenne, Slovakia, 48.9306, 21.9122 Villaricca, Italy, 40.9167, 14.2000 Dasol, Philippines, 15.9896, 119.8805 Point Pedro, Sri Lanka, 9.8167, 80.2333 Guamo, Colombia, 4.0833, -74.9167 Maralal, Kenya, 1.1000, 36.7000 Mossaka, Congo (Brazzaville), -1.2258, 16.7947 Lumding, India, 25.7500, 93.1700 Candido Mota, Brazil, -22.7464, -50.3869 Waddinxveen, Netherlands, 52.0500, 4.6500 Dimataling, Philippines, 7.5297, 123.3661 Wenxian Chengguanzhen, China, 32.9471, 104.6814 L'Hay-les-Roses, France, 48.7800, 2.3374 Odorheiu Secuiesc, Romania, 46.3139, 25.3017 Klela, Mali, 11.6886, -5.6622 Diemen, Netherlands, 52.3333, 4.9667 Hitoyoshi, Japan, 32.2103, 130.7625 Marathonas, Greece, 38.1500, 23.9500 Monjas, Guatemala, 14.5000, -89.8667 Rio das Pedras, Brazil, -22.8428, -47.6058 Gongguan, Taiwan, 24.5053, 120.8447 Rio Negro, Brazil, -26.1058, -49.7978 Bluffton, United States, 32.2135, -80.9316 Tanmen, China, 19.2429, 110.6120 Sherpur Khurd, India, 25.5565, 83.8052 Aracoiaba da Serra, Brazil, -23.5053, -47.6142 Ibanda, Uganda, -0.1347, 30.4950 Netivot, Israel, 31.4167, 34.5833 Imisli, Azerbaijan, 39.8697, 48.0600 Magsingal, Philippines, 17.6850, 120.4244 Cholargos, Greece, 38.0000, 23.8000 Rio Bravo, Guatemala, 14.4011, -91.3195 Burgdorf, Germany, 52.4500, 10.0083 Zaqatala, Azerbaijan, 41.6336, 46.6433 Eyvan, Iran, 33.8278, 46.3061 Mahallat Damanah, Egypt, 31.0729, 31.4950 Amarante do Maranhao, Brazil, -5.5669, -46.7419 Shimotoba, Japan, 34.8833, 135.6667 Yby Yau, Paraguay, -22.9661, -56.5407 Ennery, Haiti, 19.4834, -72.4854 Orcutt, United States, 34.8691, -120.4222 Aguada de Pasajeros, Cuba, 22.3847, -80.8461 Ibaraki, Japan, 36.2869, 140.4245 Ivisan, Philippines, 11.5217, 122.6908 Bay Shore, United States, 40.7288, -73.2495 Bandeirantes, Brazil, -23.1100, -50.3678 President Roxas, Philippines, 11.4297, 122.9247 Cuauhtemoc, Mexico, 19.3281, -103.6028 Vadakakarai, India, 10.1731, 76.2096 Tiquipaya, Bolivia, -17.3333, -66.2167 Boghni, Algeria, 36.5500, 3.9500 Oiso, Japan, 35.3086, 139.3128 Petrovac na Mlavi, Serbia, 44.3783, 21.4194 Hendrik-Ido-Ambacht, Netherlands, 51.8500, 4.6300 Inkhil, Syria, 33.0181, 36.1283 Terre Neuve, Haiti, 19.6000, -72.7833 Kreuztal, Germany, 50.9667, 7.9667 Sterling, United States, 39.0052, -77.4050 Parnarama, Brazil, -5.6819, -43.0928 Naspur, India, 18.8604, 79.4849 Mamaroneck, United States, 40.9443, -73.7488 Carangola, Brazil, -20.7328, -42.0289 Unchagao, India, 16.6988, 74.2749 Holladay, United States, 40.6600, -111.8226 Vigneux-sur-Seine, France, 48.7001, 2.4170 Capelinha, Brazil, -17.6908, -42.5158 Esperanca, Brazil, -7.0333, -35.8500 Barrinha, Brazil, -21.1936, -48.1639 Andirin, Turkey, 37.5764, 36.3506 Changuinola, Panama, 9.4333, -82.5167 Valkenswaard, Netherlands, 51.3500, 5.4592 Rosmalen, Netherlands, 51.7167, 5.3667 Cicero, United States, 43.1662, -76.0662 Pocone, Brazil, -16.2569, -56.6228 Itaperucu, Brazil, -25.2212, -49.3458 New Smyrna Beach, United States, 29.0249, -80.9652 Bittou, Burkina Faso, 11.2575, -0.3039 Alba, Italy, 44.6915, 8.0256 Tacuba, El Salvador, 13.9000, -89.9333 Pontypridd, United Kingdom, 51.6020, -3.3420 Kadinhani, Turkey, 38.2397, 32.2114 Dreux, France, 48.7372, 1.3664 Duanshan, China, 25.7943, 106.6983 Santa Paula, United States, 34.3545, -119.0656 Usinsk, Russia, 66.0000, 57.5333 Gevelsberg, Germany, 51.3167, 7.3333 Yahsihan, Turkey, 39.8503, 33.4536 Lobos, Argentina, -35.1833, -59.0833 Rutherglen, United Kingdom, 55.8280, -4.2140 Dyurtyuli, Russia, 55.4833, 54.8667 Sakaraha, Madagascar, -22.9075, 44.5303 Paracelis, Philippines, 17.1811, 121.4036 Tewksbury, United States, 42.6120, -71.2278 Saint Neots, United Kingdom, 52.2280, -0.2700 Siraway, Philippines, 7.5853, 122.1406 Port Chester, United States, 41.0051, -73.6680 Khanah Sur, Iraq, 36.4778, 41.6114 Buenavista, Philippines, 13.7394, 122.4675 Haines City, United States, 28.1102, -81.6157 Podili, India, 15.6040, 79.6080 Yaita, Japan, 36.8067, 139.9241 SeaTac, United States, 47.4444, -122.2986 Tongeren, Belgium, 50.7807, 5.4623 Gata, Philippines, 7.8500, 124.3500 Ambatomiady, Madagascar, -19.6939, 47.4143 Beizhuang, China, 39.9686, 119.5515 Sovetskiy, Russia, 61.3614, 63.5842 Shrigonda, India, 18.6160, 74.6980 Fomento, Cuba, 22.1053, -79.7203 Friedberg, Germany, 50.3333, 8.7500 Goiatuba, Brazil, -18.0128, -49.3569 Livingston, United States, 40.7855, -74.3291 Ecclesfield, United Kingdom, 53.4429, -1.4698 Ngudu, Tanzania, -2.9667, 33.3333 Kalliyassheri, India, 11.9712, 75.3616 Rosa Zarate, Ecuador, 0.3300, -79.4800 Socorro, Colombia, 6.5333, -73.2000 Tequila, Mexico, 20.8828, -103.8367 Lawndale, United States, 33.8884, -118.3531 Viry-Chatillon, France, 48.6713, 2.3750 Yingyangcun, China, 22.0974, 106.7567 Amargosa, Brazil, -13.0300, -39.6050 Chatellerault, France, 46.8178, 0.5461 Bembereke, Benin, 10.2250, 2.6681 Bachhraon, India, 28.9300, 78.2200 Sakhnin, Israel, 32.8667, 35.3000 Tancitaro, Mexico, 19.3378, -102.3625 Danghara, Tajikistan, 38.0983, 69.3467 Rheinberg, Germany, 51.5467, 6.6006 Sabana Grande de Boya, Dominican Republic, 18.9500, -69.8000 Coria del Rio, Spain, 37.2833, -6.0500 Montebelluna, Italy, 45.7753, 12.0389 Centre Wellington, Canada, 43.7000, -80.3667 Vibo Valentia, Italy, 38.6753, 16.0959 Sasaguri, Japan, 33.6239, 130.5261 Bedworth, United Kingdom, 52.4791, -1.4712 Huangxicun, China, 24.4672, 115.7773 Tangua, Brazil, -22.7300, -42.7139 Culleredo, Spain, 43.2883, -8.3894 San Juan Ixcoy, Guatemala, 15.6000, -91.4500 Atotonilco de Tula, Mexico, 20.0500, -99.1833 Nantan, Japan, 35.1000, 135.4667 Weil am Rhein, Germany, 47.5947, 7.6108 Alamogordo, United States, 32.8837, -105.9625 Cambita Garabitos, Dominican Republic, 18.4500, -70.2000 Manaratsandry, Madagascar, -16.1880, 46.5078 Malaikkal, India, 8.8058, 76.8301 Lagos, Portugal, 37.1000, -8.6667 Pompeu, Brazil, -19.2239, -44.9350 Arcos de la Frontera, Spain, 36.7500, -5.8000 Petrosani, Romania, 45.4122, 23.3733 Southlake, United States, 32.9545, -97.1503 Tairan Camp, Philippines, 6.6500, 121.8700 Tummapala, India, 17.7166, 82.9965 Mushabani, India, 22.5200, 86.4500 Pushangcun, China, 36.3470, 115.0703 Chantal, Haiti, 18.2017, -73.8896 Espinho, Portugal, 41.0100, -8.6400 Karera, India, 25.4581, 78.1358 West Warwick, United States, 41.6986, -71.5157 North Andover, United States, 42.6713, -71.0865 Dover, United Kingdom, 51.1295, 1.3089 Chuhuiv, Ukraine, 49.8356, 36.6864 North Royalton, United States, 41.3138, -81.7450 Hopkinsville, United States, 36.8381, -87.4775 Voorhees, United States, 39.8450, -74.9549 Malakanagiri, India, 18.3500, 81.9000 Konseguela, Mali, 12.4094, -5.8767 Rodolfo Sanchez Taboada, Mexico, 31.7958, -116.5911 Sao Jose do Egito, Brazil, -7.4733, -37.2744 Dashao, China, 39.5517, 115.8206 Vohitrandriana, Madagascar, -20.7601, 48.2652 Andranovory, Madagascar, -23.1431, 44.1520 Wobulenzi, Uganda, 0.7200, 32.5300 San Vicente, Costa Rica, 9.9636, -84.0454 Sagwara, India, 23.6681, 74.0244 Northport, United States, 33.2586, -87.5993 Iguape, Brazil, -24.7081, -47.5553 Diffa, Niger, 13.3171, 12.6089 Arraial do Cabo, Brazil, -22.9658, -42.0278 Pisek, Czechia, 49.3089, 14.1475 Santa Vitoria do Palmar, Brazil, -33.5189, -53.3678 Ban Chang, Thailand, 12.7208, 101.0669 Gimbi, Ethiopia, 9.1667, 35.8333 Ban Ang Sila, Thailand, 13.3364, 100.9278 Thal, Pakistan, 33.3644, 70.5478 Lucera, Italy, 41.5000, 15.3333 Yaese, Japan, 26.1581, 127.7186 Can, Turkey, 40.0275, 27.0475 La Paz, Philippines, 8.2800, 125.8100 Begles, France, 44.8086, -0.5478 Irituia, Brazil, -1.7689, -47.4389 Goussainville, France, 49.0325, 2.4747 Dachen, China, 38.2456, 115.0218 Tawaramoto, Japan, 34.5567, 135.7950 Mocimboa da Praia, Mozambique, -11.3500, 40.3333 Tarakeswar, India, 22.8900, 88.0200 Minas de Matahambre, Cuba, 22.5822, -83.9492 Wanghong Yidui, China, 38.2125, 106.2250 Badami, India, 15.9200, 75.6803 Husainabad, India, 24.5285, 84.0000 Save, Rwanda, -2.5461, 29.7721 Werl, Germany, 51.5500, 7.9200 Chagne, Ethiopia, 10.9500, 36.5000 Bella Vista, United States, 36.4667, -94.2707 Dedza, Malawi, -14.3667, 34.3333 Laguna Hills, United States, 33.5918, -117.6991 Sacele, Romania, 45.6200, 25.7097 Mlawa, Poland, 53.1167, 20.3667 Jeremie, Haiti, 18.6339, -74.1184 Arsin, Turkey, 40.9500, 39.9333 Salgotarjan, Hungary, 48.0853, 19.7867 Itatiaia, Brazil, -22.4914, -44.5592 Cicero Dantas, Brazil, -10.6000, -38.3828 Canavieiras, Brazil, -15.6750, -38.9472 Pichanal, Argentina, -23.3167, -64.2167 Escuintla, Mexico, 15.3333, -92.6333 Lohmar, Germany, 50.8167, 7.2167 Springfield, United States, 38.7810, -77.1839 Flores da Cunha, Brazil, -29.0289, -51.1819 Okagaki, Japan, 33.8536, 130.6111 Walsrode, Germany, 52.8667, 9.5833 Kaminokawa, Japan, 36.4393, 139.9099 Bairi Chak, India, 24.6951, 84.9913 Neuburg, Germany, 48.7333, 11.1833 Pontefract, United Kingdom, 53.6910, -1.3120 Champoton, Mexico, 19.3500, -90.7167 Sao Luis do Quitunde, Brazil, -9.3178, -35.5608 Leh, India, 34.1642, 77.5847 Pattanakkad, India, 9.7286, 76.3189 Sabirabad, Azerbaijan, 40.0053, 48.4719 San Antonio Ilotenango, Guatemala, 15.0544, -91.2294 Sholinghur, India, 13.1116, 79.4310 Dharampur, India, 28.6000, 76.9900 Juanacatlan, Mexico, 20.5000, -103.1667 Carpentras, France, 44.0558, 5.0489 Bicester, United Kingdom, 51.9000, -1.1500 Manavadar, India, 21.5000, 70.1300 Palaiya Ayakkudi, India, 10.4560, 77.5595 Careiro da Varzea, Brazil, -3.1970, -59.8267 Vinkovci, Croatia, 45.2833, 18.8000 Kalgoorlie, Australia, -30.7489, 121.4658 Capulhuac, Mexico, 19.2000, -99.4667 Kostopil, Ukraine, 50.8833, 26.4500 Ballwin, United States, 38.5950, -90.5500 Saraykoy, Turkey, 37.9264, 28.9267 Sanford, United States, 35.4875, -79.1770 Nartkala, Russia, 43.5500, 43.8500 Ulundi, South Africa, -28.3167, 31.4167 Haywards Heath, United Kingdom, 51.0048, -0.0979 Al Husayniyah, Egypt, 30.8617, 31.9181 Chinnalapatti, India, 10.2875, 77.9120 Ridley, United States, 39.8854, -75.3280 Taunusstein, Germany, 50.1333, 8.1500 Tiruvambadi, India, 11.3608, 76.0089 Pattittara, India, 10.8119, 76.0915 Arlon, Belgium, 49.6836, 5.8167 Korinthos, Greece, 37.9386, 22.9272 Lohagara, Bangladesh, 22.0112, 92.1009 Salou, Spain, 41.0770, 1.1440 Vitoria do Mearim, Brazil, -3.4619, -44.8708 Dharmadam, India, 11.7935, 75.4709 Ungheni, Moldova, 47.2167, 27.8167 La Verne, United States, 34.1207, -117.7703 Nalchiti, Bangladesh, 22.6370, 90.2719 Lavras da Mangabeira, Brazil, -6.7528, -38.9719 Ganassi, Philippines, 7.8269, 124.1034 Trekhgornyy, Russia, 54.8000, 58.4500 Qo`rg`ontepa, Uzbekistan, 40.7336, 72.7583 Jonuta, Mexico, 18.0833, -92.1333 Careiro, Brazil, -3.7678, -60.3689 Nardo, Italy, 40.1797, 18.0333 Escuinapa, Mexico, 22.8350, -105.7780 Wallkill, United States, 41.4854, -74.3939 Rio Blanco, Nicaragua, 12.9333, -85.2167 Barao de Cocais, Brazil, -19.9458, -43.4869 Busia, Kenya, 0.4608, 34.1108 North Chicago, United States, 42.3172, -87.8595 Bad Hersfeld, Germany, 50.8683, 9.7075 Mahemdavad, India, 22.8300, 72.7700 Pascani, Romania, 47.2494, 26.7272 Andingcun, China, 39.6172, 116.4944 Tsuruno, Japan, 40.8087, 140.3801 Westfield, United States, 40.6516, -74.3432 San Narciso, Philippines, 15.0200, 120.0800 Guaranda, Ecuador, -1.6000, -79.0000 Gadarpur, India, 29.0437, 79.2465 Ban Sai Ma Tai, Thailand, 13.8642, 100.4741 Ulliyeri, India, 11.4333, 75.7833 Ferizli, Turkey, 40.9333, 30.4833 Tekkali, India, 18.6057, 84.2355 Chak Five Hundred Seventy-five, Pakistan, 31.5500, 73.8333 Oakleaf Plantation, United States, 30.1689, -81.8337 Los Altos, United States, 37.3684, -122.0965 Udaypur Gadhi, Nepal, 26.9333, 86.5167 Miami Lakes, United States, 25.9125, -80.3214 Einbeck, Germany, 51.8167, 9.8667 San Sebastian, Guatemala, 14.5667, -91.6500 San Isidro, Philippines, 11.4200, 124.3500 Pedana, India, 16.2667, 81.1667 Mattathur, India, 10.3792, 76.3208 Alem Paraiba, Brazil, -21.8878, -42.7039 Osterholz-Scharmbeck, Germany, 53.2167, 8.8000 Agblangandan, Benin, 6.3667, 2.5167 Juatuba, Brazil, -19.9519, -44.3428 Aglipay, Philippines, 16.4889, 121.5874 Riacho de Santana, Brazil, -13.6089, -42.9389 Sekiyado, Japan, 36.0967, 139.7803 Dois Irmaos, Brazil, -29.5800, -51.0850 Tekeli, Kazakhstan, 44.8300, 78.8239 Pandua, India, 23.0800, 88.2800 Nova Russas, Brazil, -4.7000, -40.5667 Babura, India, 25.6838, 84.7825 Vichuga, Russia, 57.2000, 41.9167 Washington, United States, 37.1303, -113.4878 Treviglio, Italy, 45.5214, 9.5928 Ciudad Melchor de Mencos, Guatemala, 17.0667, -89.1500 San Ramon, Nicaragua, 12.9167, -85.8333 Czeladz, Poland, 50.3333, 19.0833 Becej, Serbia, 45.6167, 20.0333 Cruz del Eje, Argentina, -30.7333, -64.8000 Tepetlaoxtoc, Mexico, 19.5731, -98.8203 Banning, United States, 33.9460, -116.8992 Bannur, India, 12.3329, 76.8620 Partinico, Italy, 38.0500, 13.1167 Campo Alegre de Lourdes, Brazil, -9.5158, -43.0108 Moche, Peru, -8.1706, -79.0094 Friedberg, Germany, 48.3500, 10.9833 Balatan, Philippines, 13.3167, 123.2333 Presidente Figueiredo, Brazil, -2.0172, -60.0250 Gobernador Virasora, Argentina, -28.0500, -56.0333 Catole do Rocha, Brazil, -6.3439, -37.7469 Lahij, Yemen, 13.0500, 44.8833 Chuo, Japan, 35.5996, 138.6339 West Falls Church, United States, 38.8648, -77.1878 Novovoronezh, Russia, 51.3167, 39.2167 Gamu, Philippines, 17.0500, 121.8300 Chengam, India, 12.3112, 78.7925 Tabuleiro do Norte, Brazil, -5.2481, -38.1300 San Giuliano Terme, Italy, 43.7625, 10.4414 Nazare da Mata, Brazil, -7.7419, -35.2278 Salem, United States, 42.7902, -71.2202 Ardesen, Turkey, 41.1900, 40.9831 Juquitiba, Brazil, -23.9319, -47.0686 Luis Correia, Brazil, -2.8789, -41.6669 Yunoshima, Japan, 35.8059, 137.2441 Savigny-le-Temple, France, 48.5841, 2.5832 Santana do Acarau, Brazil, -3.4608, -40.2119 Lawrenceville, United States, 33.9523, -83.9932 Eldersburg, United States, 39.4041, -76.9528 Victoria, Argentina, -32.6167, -60.1667 Police, Poland, 53.5333, 14.5667 Mataas Na Kahoy, Philippines, 13.9592, 121.1126 Jarinu, Brazil, -23.1014, -46.7283 Valdepenas, Spain, 38.7617, -3.3850 Carapo, Brazil, -22.6339, -54.8219 Kaele, Cameroon, 10.1000, 14.4500 Sao Jose da Tapera, Brazil, -9.5578, -37.3808 Keles, Uzbekistan, 41.4033, 69.2067 Capim, Brazil, -1.6750, -47.7750 Taozhuangcun, China, 30.9694, 120.8095 Diema, Mali, 14.5333, -9.2000 Banamba, Mali, 13.5500, -7.4500 Grottaglie, Italy, 40.5333, 17.4333 Crevillente, Spain, 38.2486, -0.8089 Correntina, Brazil, -13.3428, -44.6369 Talakkad, India, 10.8833, 75.9333 Devarshola, India, 11.5437, 76.4404 Birtouta, Algeria, 36.6500, 3.0000 Ain Kercha, Algeria, 35.9167, 6.7000 Buey Arriba, Cuba, 20.1736, -76.7494 Hafnarfjordhur, Iceland, 64.0200, -21.9700 Domingos Martins, Brazil, -20.3628, -40.6589 Sarno, Italy, 40.8167, 14.6167 Franklin Square, United States, 40.7002, -73.6775 Haan, Germany, 51.1667, 7.0000 Spalding, United Kingdom, 52.7858, -0.1529 Illescas, Spain, 40.1167, -3.8333 Ozd, Hungary, 48.2192, 20.2869 Rendsburg, Germany, 54.3000, 9.6667 Leusden, Netherlands, 52.1331, 5.4297 Xingang, Taiwan, 23.5600, 120.3500 Sokuluk, Kyrgyzstan, 42.8540, 74.3026 Osmancik, Turkey, 40.9667, 34.8000 Olopa, Guatemala, 14.6833, -89.3500 Suzak, Kyrgyzstan, 40.8982, 72.9048 Founougo, Benin, 11.4808, 2.5322 Cachan, France, 48.7919, 2.3319 Burlingame, United States, 37.5859, -122.3667 Liptovsky Mikulas, Slovakia, 49.0811, 19.6181 Hayrabolu, Turkey, 41.2131, 27.1000 Gariadhar, India, 21.5300, 71.5800 Anilao, Philippines, 10.9785, 122.7531 Ouatagouna, Mali, 15.1786, 0.7239 Bongor, Chad, 10.2806, 15.3722 Aungban, Burma, 20.6667, 96.6333 Westville, South Africa, -29.8310, 30.9250 Farsan, Iran, 32.2550, 50.5631 Ennepetal, Germany, 51.2833, 7.3333 Sankaramangalam, India, 8.6561, 76.7870 Nagawaram, India, 17.4875, 78.6012 Igbanke, Nigeria, 6.3869, 6.1647 Thung Song, Thailand, 8.1540, 99.7286 Khorugh, Tajikistan, 37.4833, 71.5500 Giannitsa, Greece, 40.7833, 22.4000 Stratford-upon-Avon, United Kingdom, 52.1928, -1.7064 Hellin, Spain, 38.5167, -1.6833 Masho Khel, Pakistan, 33.9103, 71.5025 Mainaguri, India, 26.5658, 88.8214 Rotterdam, United States, 42.8133, -74.0129 Gurnee, United States, 42.3708, -87.9392 Pamukova, Turkey, 40.5167, 30.1667 Pau dos Ferros, Brazil, -6.1108, -38.2089 Gubbio, Italy, 43.3518, 12.5773 Amir Kola, Iran, 36.5967, 52.6658 Torrijos, Philippines, 13.3200, 122.0800 Karuvakulam, India, 9.7605, 77.2205 Morrisville, United States, 35.8368, -78.8348 Mukumbura, Zimbabwe, -16.2000, 31.6833 Ferry Pass, United States, 30.5205, -87.1899 Santa Barbara, Brazil, -19.9589, -43.4150 Vestal, United States, 42.0492, -76.0260 Rietberg, Germany, 51.8000, 8.4333 Yanai, Japan, 33.9639, 132.1186 Afonso Claudio, Brazil, -20.0739, -41.1239 Motema, Sierra Leone, 8.6884, -11.1805 Princeton, United States, 40.3562, -74.6693 Ar Ruhaybah, Syria, 33.7442, 36.7039 Ono, Japan, 35.9797, 136.4875 Liberty, United States, 39.2394, -94.4191 Tchindjendje, Angola, -12.8167, 14.9333 Espinosa, Brazil, -14.9081, -42.8103 Ash Shinan, Saudi Arabia, 27.1748, 42.4449 Uran, India, 18.8900, 72.9500 Maguing, Philippines, 7.9000, 124.4000 Bandar-e Lengeh, Iran, 26.5594, 54.8850 Mandera, Kenya, 3.9167, 41.8333 Magdalena de Kino, Mexico, 30.6167, -111.0500 Redan, United States, 33.7394, -84.1644 Pontal do Parana, Brazil, -25.5768, -48.3581 Parkville, United States, 39.3832, -76.5519 Quillabamba, Peru, -12.8681, -72.6931 Bala Koh, Afghanistan, 36.5753, 66.8203 Myszkow, Poland, 50.5706, 19.3144 Kailahun, Sierra Leone, 8.2794, -10.5733 Andernach, Germany, 50.4397, 7.4017 Karjan, India, 22.0530, 73.1235 Okotoks, Canada, 50.7250, -113.9750 Schonebeck, Germany, 52.0167, 11.7500 Pittsford, United States, 43.0733, -77.5268 Motomiya, Japan, 37.5132, 140.3938 Banlung, Cambodia, 13.7394, 106.9873 Muvattupula, India, 9.9905, 76.5789 Salyan, Azerbaijan, 39.5961, 48.9847 Manawar, India, 22.2300, 75.0800 Avola, Italy, 36.9167, 15.1333 Tripoli, Greece, 37.5167, 22.3833 Samrong, Thailand, 13.6516, 100.5922 Amaga, Colombia, 6.0500, -75.7000 Dedovsk, Russia, 55.8500, 37.1167 Ob, Russia, 54.9917, 82.7125 Chamblee, United States, 33.8842, -84.3007 Ondangwa, Namibia, -17.9167, 15.9500 Oristano, Italy, 39.9058, 8.5916 Kuttanallur, India, 10.7069, 79.5235 Dhari, India, 21.3261, 71.0272 Itarema, Brazil, -2.9200, -39.9150 Mansa, India, 23.4300, 72.6700 Newark upon Trent, United Kingdom, 53.0772, -0.8089 Nanyo, Japan, 38.0551, 140.1476 North Tonawanda, United States, 43.0457, -78.8659 Temascaltepec de Gonzalez, Mexico, 19.0433, -100.0414 Saratoga, United States, 37.2684, -122.0263 Zywiec, Poland, 49.6892, 19.2058 Alma, Canada, 48.5500, -71.6500 Oulad Barhil, Morocco, 30.6408, -8.4750 Rehli, India, 23.6300, 79.0800 Kanzakimachi-kanzaki, Japan, 33.3119, 130.3714 Menton, France, 43.7750, 7.5000 Hirakawacho, Japan, 40.5841, 140.5665 Fengrenxu, China, 24.1364, 115.2836 Huatabampo, Mexico, 27.0500, -109.4167 Trindade, Brazil, -7.7619, -40.2678 Graneros, Chile, -34.0647, -70.7264 Abu Suwayr, Egypt, 30.5698, 32.1146 Shahpura, India, 25.6300, 74.9300 Sallimedu, India, 11.1147, 77.3975 Xinpo, China, 19.6929, 110.4869 Kessel-Lo, Belgium, 50.9000, 4.7500 Pothuhera, Sri Lanka, 7.4214, 80.3303 Kurunegala, Sri Lanka, 7.4833, 80.3667 Al 'Attawia, Morocco, 31.8347, -7.3125 Telimele, Guinea, 10.9050, -13.0430 Geliping, China, 26.5986, 101.5483 Brownsburg, United States, 39.8337, -86.3830 Newark, United States, 39.6776, -75.7576 Segala Mba, Mali, 14.5585, -10.9617 Northolt, United Kingdom, 51.5467, -0.3700 Milford, United States, 42.1565, -71.5188 Chimichagua, Colombia, 9.2500, -73.8167 San Salvador El Seco, Mexico, 19.1333, -97.6500 Dolores, Guatemala, 16.5142, -89.4158 To`raqo`rg`on, Uzbekistan, 41.0000, 71.5158 Koni, India, 9.2410, 76.8784 Cabrobo, Brazil, -8.5119, -39.3069 Wishaw, United Kingdom, 55.7742, -3.9183 Ris-Orangis, France, 48.6537, 2.4161 Bai Chay, Vietnam, 20.9658, 107.0347 Chimakurti, India, 15.5149, 80.0368 Granger, United States, 41.7374, -86.1348 Vinaroz, Spain, 40.4686, 0.4736 Sungurlu, Turkey, 40.1610, 34.3770 Ometepec, Mexico, 16.6833, -98.4167 Idil, Turkey, 37.3410, 41.8940 San Gregorio de Nigua, Dominican Republic, 18.3800, -70.0800 Benguema, Sierra Leone, 8.3215, -13.0724 Bardejov, Slovakia, 49.2950, 21.2758 Candelaria, Philippines, 15.6300, 119.9300 Niles, United States, 42.0278, -87.8099 Jima Abajo, Dominican Republic, 19.1300, -70.3800 Majidpur, Bangladesh, 23.5797, 90.7684 Caycuma, Turkey, 41.4267, 32.0758 Jinka, Ethiopia, 5.7833, 36.5667 Bir Jdid, Morocco, 33.3737, -8.0002 Pantao-Ragat, Philippines, 8.0500, 124.1500 Zhedao, China, 24.8193, 98.2763 Harpenden, United Kingdom, 51.8175, -0.3524 Las Nieves, Philippines, 8.7400, 125.6000 Schwandorf, Germany, 49.3283, 12.1100 Falou, Mali, 14.5967, -7.9350 Salamina, Greece, 37.9667, 23.5000 Huanta, Peru, -12.9397, -74.2475 Highland Park, United States, 42.1823, -87.8104 Middletown, United States, 41.4459, -74.4236 Chabet el Ameur, Algeria, 36.6333, 3.7000 Taramangalam, India, 11.6956, 77.9716 Serdobsk, Russia, 52.4667, 44.2000 Anse-a-Foleur, Haiti, 19.8926, -72.6201 Best, Netherlands, 51.5108, 5.3922 Austintown, United States, 41.0932, -80.7405 Wik'ro, Ethiopia, 13.7833, 39.6000 Lewe, Burma, 19.6333, 96.1167 Uithoorn, Netherlands, 52.2333, 4.8333 Anjad, India, 22.0417, 75.0552 Qaratau, Kazakhstan, 43.1667, 70.4500 Berriane, Algeria, 32.8333, 3.7667 Daheba, China, 28.0258, 106.4133 Whitstable, United Kingdom, 51.3610, 1.0260 Balabanovo, Russia, 55.1833, 36.6667 Tsuru, Japan, 35.5515, 138.9054 Gaggenau, Germany, 48.8039, 8.3194 Calintaan, Philippines, 12.5756, 120.9428 Malakoff, France, 48.8169, 2.2944 Waterloo, Belgium, 50.7175, 4.3979 Metamorfosi, Greece, 38.0500, 23.7500 Ndora, Rwanda, -2.6033, 29.8336 Djendel, Algeria, 36.2186, 2.4089 Kaipram, India, 10.8833, 76.1833 Kibiti, Tanzania, -7.7296, 38.9500 Claudio, Brazil, -20.4428, -44.7658 Bankass, Mali, 14.0775, -3.5158 Yverdon-les-Bains, Switzerland, 46.7785, 6.6408 Periyanayakkanpalaiyam, India, 11.1544, 76.9499 Lewoleba, Indonesia, -8.3833, 123.4000 Ypacarai, Paraguay, -25.4100, -57.2800 Egra, India, 21.9000, 87.5300 Inami, Japan, 34.7500, 134.9167 Joacaba, Brazil, -27.1778, -51.5050 Anse a Pitre, Haiti, 18.0431, -71.7583 Ostuni, Italy, 40.7322, 17.5778 Catarroja, Spain, 39.4028, -0.4044 Bretten, Germany, 49.0364, 8.7061 Quezaltepeque, Guatemala, 14.6333, -89.4500 Piagapo, Philippines, 8.0000, 124.2000 Kanniparamba, India, 11.3611, 76.0097 San Giuseppe Vesuviano, Italy, 40.8333, 14.5000 Candijay, Philippines, 9.8180, 124.4960 Mussoorie, India, 30.4500, 78.0800 Marogong, Philippines, 7.6700, 124.1500 Planadas, Colombia, 3.1964, -75.6444 Pulupandan, Philippines, 10.5200, 122.8000 San Miguel, Philippines, 10.7800, 122.4700 Dar Ould Zidouh, Morocco, 32.3167, -6.9000 Lievin, France, 50.4228, 2.7786 Mucari, Angola, -9.4667, 16.9167 Gukeng, Taiwan, 23.6500, 120.5667 Persembe, Turkey, 41.0656, 37.7714 Miramar, Argentina, -38.2667, -57.8333 Sakti, India, 22.0300, 82.9700 Dumalag, Philippines, 11.3039, 122.6214 Rury, Poland, 51.2386, 22.5164 Gumduru, India, 16.6500, 78.4800 Balete, Philippines, 11.5553, 122.3792 Rahimpur, India, 25.4894, 86.4774 Postmasburg, South Africa, -28.3279, 23.0706 Marimba, Angola, -8.3667, 17.0167 Minudasht, Iran, 37.2306, 55.3736 Rosignano Marittimo, Italy, 43.4000, 10.4667 Cramlington, United Kingdom, 55.0820, -1.5850 Oltu, Turkey, 40.5456, 41.9958 Summerlin South, United States, 36.1242, -115.3324 Ruskin, United States, 27.7065, -82.4209 Merzig, Germany, 49.4500, 6.6167 Bou Arfa, Morocco, 32.5309, -1.9650 Muratli, Turkey, 41.1742, 27.5086 Kondarangi Kiranur, India, 10.6150, 77.7240 Iguig, Philippines, 17.7517, 121.7364 Wuyuan, China, 41.0896, 108.2722 Monte Patria, Chile, -30.8333, -70.7000 Nethirimangalam, India, 10.8054, 76.1877 McDonough, United States, 33.4397, -84.1505 Margram, India, 24.1512, 87.8422 Chatou, France, 48.8897, 2.1573 Bad Zwischenahn, Germany, 53.1836, 8.0097 Bowling Green, United States, 41.3776, -83.6495 Sainte-Julie, Canada, 45.5833, -73.3333 Milazzo, Italy, 38.2170, 15.2370 Tchibanga, Gabon, -2.9331, 10.9831 Oulad Zemam, Morocco, 32.3500, -6.6333 Nanchital de Lazaro Cardenas del Rio, Mexico, 18.0667, -94.4167 Beni Khiar, Tunisia, 36.4667, 10.7833 Villa Regina, Argentina, -39.1000, -67.0667 Zemoura, Algeria, 35.7167, 0.7500 Degeh Bur, Ethiopia, 8.2167, 43.5667 Brandsen, Argentina, -35.1667, -58.2167 Kericho, Kenya, -0.3692, 35.2839 Alacuas, Spain, 39.4583, -0.4628 Cahul, Moldova, 45.9075, 28.1944 Dauin, Philippines, 9.2000, 123.2700 Comiso, Italy, 36.9500, 14.6000 Drexel Hill, United States, 39.9495, -75.3038 Kulat, Indonesia, -8.8243, 115.0983 Mahugaon, India, 22.5748, 75.7445 Jamalpur, India, 25.4112, 86.6593 Arda, India, 32.3087, 76.5772 Santa Maria, Philippines, 17.3719, 120.4814 Balungao, Philippines, 15.9000, 120.7000 Qahderijan, Iran, 32.5772, 51.4539 Gongyefu, China, 41.8378, 118.5011 Liaojiayuan, China, 29.3906, 109.9919 Tarrafal, Cabo Verde, 15.2787, -23.7516 Les Palmes, Haiti, 18.3333, -72.8500 Mundahal Khurd, India, 28.9800, 76.1950 Masabdisa, India, 25.9682, 93.4372 Ranpur, India, 22.3752, 71.6898 Patri, India, 23.1900, 71.8000 Edassheri, India, 10.9833, 75.9667 Mundi, India, 22.0700, 76.5000 Padappakara, India, 8.9667, 76.6333 Tirwa, India, 26.9620, 79.7923 Baghmari, India, 20.2206, 85.5014 Hasanparti, India, 18.0681, 79.5236 Sarpavaram, India, 17.0102, 82.2250 Dhandhuka, India, 22.3700, 71.9800 `Aynkawah, Iraq, 36.2306, 43.9944 Jalawla', Iraq, 34.2739, 45.1691 Mutsamudu, Comoros, -12.1675, 44.3939 Chmistar, Lebanon, 33.9667, 36.0167 El Fanar, Lebanon, 33.8667, 35.5667 Bent Jbail, Lebanon, 33.1208, 35.4336 Zgharta, Lebanon, 34.4000, 35.9000 Andranomanelatra, Madagascar, -19.7859, 47.1043 Tsitondroina, Madagascar, -21.3134, 45.9940 Ambinanitelo, Madagascar, -15.3495, 49.5805 Ambalavao, Madagascar, -21.8295, 46.9402 Majuro, Marshall Islands, 7.0833, 171.3833 Bourem Guindou, Mali, 16.9004, -0.3500 Du Yar, Burma, 15.2617, 97.7819 Arvayheer, Mongolia, 46.2689, 102.7575 Kuah, Malaysia, 6.3265, 99.8432 Dulmial, Pakistan, 32.7333, 72.9167 Malak Abad, Pakistan, 34.8000, 71.8000 Makhdum Rashid, Pakistan, 30.0000, 5.0000 Maleme Hodar, Senegal, 14.0883, -15.2944 Uar Esgudud, Somalia, 1.2667, 41.3833 Ikoto, South Sudan, 4.0795, 33.1089 Tecoluca, El Salvador, 13.5333, -88.7833 Kafr Nubl, Syria, 35.6138, 36.5645 Fang, Thailand, 19.9189, 99.2136 Anew, Turkmenistan, 37.8833, 58.5333 Mpwapwa, Tanzania, -6.3500, 36.4833 Kayunga, Uganda, 0.7033, 32.9036 Kamonkoli, Uganda, 1.0750, 34.0956 Pop, Uzbekistan, 40.8736, 71.1089 Saundhonwali, India, 30.3331, 77.9608 Salay, Philippines, 8.8700, 124.8000 Parakadavu, India, 10.2126, 76.3520 Eshtehard, Iran, 35.7250, 50.3650 Panagyurishte, Bulgaria, 42.5031, 24.1839 Dala, Angola, -11.0342, 20.2036 Soledade, Brazil, -28.8178, -52.5100 Sombrio, Brazil, -29.1039, -49.6289 Koratgi, India, 15.6081, 76.6597 Askoy, Norway, 60.4000, 5.1833 Meschede, Germany, 51.3500, 8.2833 Kamisato, Japan, 36.2516, 139.1447 Anchieta, Brazil, -20.8056, -40.6444 Navapur, India, 21.1700, 73.7800 Riga, India, 26.6553, 85.4420 Kaminoyama, Japan, 38.1496, 140.2679 Villemomble, France, 48.8833, 2.5000 Birur, India, 13.5972, 75.9717 Zgorzelec, Poland, 51.1500, 15.0083 Aarschot, Belgium, 50.9875, 4.8333 Kotturu, India, 14.8262, 76.2259 Holbaek, Denmark, 55.7135, 11.7169 Garopaba, Brazil, -28.0228, -48.6128 Matthews, United States, 35.1195, -80.7101 Saint-Constant, Canada, 45.3700, -73.5700 Radcliffe, United Kingdom, 53.5615, -2.3268 Tebourba, Tunisia, 36.8333, 9.8333 Agno, Philippines, 16.1161, 119.8027 Verbania, Italy, 45.9228, 8.5519 Fridley, United States, 45.0841, -93.2595 Paragould, United States, 36.0555, -90.5149 Gerakas, Greece, 38.0333, 23.8500 Dalin, Taiwan, 23.5989, 120.4700 Greenville, United States, 33.1116, -96.1099 Pind Dadan Khan, Pakistan, 32.5883, 73.0447 Manduria, Italy, 40.4028, 17.6342 Marhaura, India, 25.9700, 84.8700 Winter Park, United States, 28.5989, -81.3442 Ragan Sur, Philippines, 17.3200, 121.7800 Santa Rita, Honduras, 14.8680, -89.0941 Mohyliv-Podilskyi, Ukraine, 48.4500, 27.7833 Imbituva, Brazil, -25.2300, -50.6044 Subotica, Serbia, 46.1003, 19.6656 Carshalton, United Kingdom, 51.3652, -0.1676 Elektrogorsk, Russia, 55.8833, 38.8000 Triprangottur, India, 11.7843, 75.6559 General Alvear, Argentina, -34.9667, -67.7000 Dandenong, Australia, -37.9810, 145.2150 Wellesley, United States, 42.3043, -71.2855 Decines-Charpieu, France, 45.7694, 4.9594 Algonquin, United States, 42.1629, -88.3159 Mahon, Spain, 39.8875, 4.2611 Northfleet, United Kingdom, 51.4400, 0.3400 Plympton, United Kingdom, 50.3860, -4.0510 Panakkudi, India, 8.3492, 77.5672 Taza, Morocco, 35.0639, -5.2025 Bogdanovich, Russia, 56.7803, 62.0494 Serra Negra, Brazil, -22.6119, -46.7008 Durango, Spain, 43.1689, -2.6300 Conguaco, Guatemala, 14.0500, -90.0333 Aral, Kazakhstan, 46.7833, 61.6667 Pinhao, Brazil, -25.6958, -51.6600 Hazleton, United States, 40.9505, -75.9725 San Andres del Rabanedo, Spain, 42.6167, -5.6000 Mandali, Iraq, 33.7481, 45.5550 San Roque, Philippines, 12.5330, 124.8670 Mabole, Sri Lanka, 7.0022, 79.8980 Padada, Philippines, 6.6300, 125.3500 Crofton, United States, 39.0144, -76.6800 Perigueux, France, 45.1929, 0.7217 Werve, Germany, 51.6667, 7.6167 Balabagan, Philippines, 7.5300, 124.1200 Gloucester, United States, 42.6260, -70.6897 Saint-Cloud, France, 48.8400, 2.2200 El Idrissia, Algeria, 34.4500, 2.5333 Villa Dolores, Argentina, -31.9333, -65.2000 Al Madad, Yemen, 13.7167, 44.7333 Be'er Ya`aqov, Israel, 31.9436, 34.8392 San Andres Xecul, Guatemala, 14.9000, -91.4833 Xiaba, China, 27.8826, 108.0570 Quiapo, Philippines, 14.6000, 120.9830 Puente-Genil, Spain, 37.3833, -4.7667 El Kseur, Algeria, 36.6844, 4.8522 Waslala, Nicaragua, 13.2333, -85.3833 East Windsor, United States, 40.2606, -74.5295 Ozhur, India, 10.9542, 75.9167 Kabalo, Congo (Kinshasa), -6.0500, 26.9167 La Garenne-Colombes, France, 48.9056, 2.2445 Draveil, France, 48.6852, 2.4080 San Luis, Philippines, 15.7200, 121.5200 Motala, Sweden, 58.5500, 15.0500 Bourgoin-Jallieu, France, 45.5861, 5.2736 Kodayattur, India, 11.2833, 75.9833 Petite Riviere de Nippes, Haiti, 18.4764, -73.2413 Nanga Eboko, Cameroon, 4.6708, 12.3731 Shibancun, China, 22.1539, 110.7082 Oosterend, Netherlands, 53.0036, 6.0664 Shetang, China, 34.5514, 105.9703 Tiruvegapra, India, 10.8730, 76.1250 Thuan Tien, Vietnam, 10.0894, 105.8281 Krishnarajpet, India, 12.6662, 76.4877 Tequisquiapan, Mexico, 20.5206, -99.8958 Bontoc, Philippines, 10.3500, 124.9700 Guapi, Colombia, 2.5703, -77.8856 Talwara, India, 31.9376, 75.8866 San Carlos, United States, 37.4982, -122.2677 Dzyarzhynsk, Belarus, 53.6833, 27.1333 Santa Elena de Uairen, Venezuela, 4.0000, 36.0000 Fresno, Colombia, 5.1556, -75.0403 Kaita, Japan, 34.3722, 132.5361 West Windsor, United States, 40.2897, -74.6266 Antsampandrano, Madagascar, -19.9200, 47.5705 Oelde, Germany, 51.8333, 8.1500 Madavur, India, 11.2597, 75.9486 Hengshuicun, China, 22.3611, 111.4199 Dahana, Tajikistan, 38.0583, 69.8667 Ramnicu Sarat, Romania, 45.3800, 27.0600 Santa Cruz, Venezuela, 10.1819, -67.5025 Monterey, United States, 36.5919, -121.8808 Bulwell, United Kingdom, 53.0010, -1.1970 Nutley, United States, 40.8192, -74.1571 Mount Hagen, Papua New Guinea, -5.8667, 144.2167 Mananasy-Tsitakondaza, Madagascar, -19.1481, 46.6495 Charneca, Portugal, 38.6167, -9.1833 Cruz, Brazil, -2.9178, -40.1719 Ancon, Panama, 8.9627, -79.5474 Nattam, India, 10.2249, 78.2310 Guyancourt, France, 48.7714, 2.0739 Benito Soliven, Philippines, 16.9800, 121.9500 Bazeh Kalagh, Iran, 36.5325, 59.3636 Chahchaheh, Iran, 36.5325, 59.3636 Bozmargi, Iran, 36.5325, 59.3636 Kalateh-ye Mir Ab, Iran, 36.5325, 59.3636 Vera Cruz, Brazil, -12.9600, -38.6089 Santiago do Cacem, Portugal, 38.0167, -8.7000 Rahway, United States, 40.6077, -74.2807 Perico, Cuba, 22.7753, -81.0153 Reghin, Romania, 46.7758, 24.7083 Vyatskiye Polyany, Russia, 56.2239, 51.0633 Landsberg, Germany, 48.0478, 10.8989 Sardrud, Iran, 38.0267, 46.1528 Phu My, Vietnam, 10.5906, 107.0481 Atascadero, United States, 35.4827, -120.6858 Atbasar, Kazakhstan, 51.8000, 68.3333 Mbanga, Cameroon, 4.5092, 9.5681 Yong'ancun, China, 23.1788, 112.6904 Tabio, Colombia, 4.9158, -74.0983 Devarkonda, India, 16.7000, 78.9333 Heesch, Netherlands, 51.7314, 5.5300 Igarapava, Brazil, -20.0383, -47.7469 Tena, Ecuador, -0.9890, -77.8159 Tournefeuille, France, 43.5853, 1.3442 Orchard Park, United States, 42.7516, -78.7455 Karahrud, Iran, 34.0628, 49.6461 East Fishkill, United States, 41.5567, -73.7824 Savanette, Haiti, 18.6833, -72.0500 Makato, Philippines, 11.7120, 122.2922 Orchards, United States, 45.6890, -122.5306 Bergen, Netherlands, 52.6667, 4.7167 Furmanov, Russia, 57.2500, 41.1333 Buenavista, Philippines, 10.0800, 124.1200 Szekszard, Hungary, 46.3558, 18.7039 Bunyan, Turkey, 38.8486, 35.8592 Kloof, South Africa, -29.7833, 30.8333 Nu`ayjah, Qatar, 25.2525, 51.5592 Hengchun, Taiwan, 22.0000, 120.7500 Acajutla, El Salvador, 13.5900, -89.8336 Vandoeuvre-les-Nancy, France, 48.6567, 6.1683 Kitaakita, Japan, 40.2260, 140.3708 La Oliva, Spain, 28.6111, -13.9278 Parsuram, Bangladesh, 23.2114, 91.4686 Sursand, India, 26.6500, 85.7167 San Jacinto, Philippines, 12.5683, 123.7336 Buriti, Brazil, -3.9419, -42.9250 Hosdurga, India, 13.7963, 76.2841 Manjo, Cameroon, 4.8500, 9.8167 Uychi, Uzbekistan, 41.0294, 71.8483 Nepanagar, India, 21.4558, 76.4494 Zaragoza, El Salvador, 13.5833, -89.2833 La Rinconada, Peru, -14.6325, -69.4458 Pasuquin, Philippines, 18.3342, 120.6183 Newtownards, United Kingdom, 54.5910, -5.6800 Vlasotince, Serbia, 42.9667, 22.1333 Canguaretama, Brazil, -6.3800, -35.1289 Zaragoza, Guatemala, 14.6500, -90.8833 Stung Treng, Cambodia, 13.5259, 105.9683 Piraju, Brazil, -23.1936, -49.3839 Yingshouyingzi, China, 40.5451, 117.6560 Pedras de Fogo, Brazil, -7.4019, -35.1158 Warrnambool, Australia, -38.3833, 142.4833 Toksun, China, 42.7918, 88.6536 Galesburg, United States, 40.9506, -90.3763 Synelnykove, Ukraine, 48.3178, 35.5119 West Rembo, Philippines, 14.5602, 121.0615 Husnabad, India, 18.1000, 79.3000 Hobart, United States, 41.5140, -87.2729 Novyi Rozdil, Ukraine, 49.4697, 24.1367 Monfalcone, Italy, 45.8046, 13.5329 Puthupalli, India, 9.5594, 76.5722 Selouane, Morocco, 35.0667, -2.9333 Schererville, United States, 41.4861, -87.4442 Villa Donato Guerra, Mexico, 19.3083, -100.1422 Bregenz, Austria, 47.5050, 9.7492 Jamai, India, 22.1964, 78.5919 Pati do Alferes, Brazil, -22.4289, -43.4189 Alquizar, Cuba, 22.8067, -82.5828 Placer, Philippines, 9.6570, 125.6016 Xinmin, China, 25.4831, 104.8416 Agde, France, 43.3108, 3.4758 Chikuzen, Japan, 33.4569, 130.5953 Benicarlo, Spain, 40.4167, 0.4167 Central, United States, 30.5593, -91.0369 Kalpatta, India, 11.6087, 76.0834 Mannargudi, India, 11.2761, 79.5520 Agdas, Azerbaijan, 40.6500, 47.4833 Veliyangod, India, 10.7296, 75.9471 Kendal, United Kingdom, 54.3260, -2.7450 Fritissa, Morocco, 33.6167, -3.5500 Laurel, United States, 39.0949, -76.8622 Villa Gesell, Argentina, -37.2500, -56.9833 Raytown, United States, 38.9944, -94.4641 San Agustin Chahal, Guatemala, 15.7500, -89.5667 Dayr Abu Sa`id, Jordan, 32.5025, 35.6922 Mangdongshan, China, 24.1844, 98.3385 Kollengode, India, 10.6139, 76.6908 Waltrop, Germany, 51.6167, 7.3833 Trutnov, Czechia, 50.5606, 15.9131 Rarott, India, 11.4504, 75.9306 South Ubian, Philippines, 5.1800, 120.4800 Gustrow, Germany, 53.7939, 12.1764 Barbosa, Colombia, 5.9330, -73.6210 Point Fortin, Trinidad and Tobago, 10.1667, -61.6667 Mashan, China, 37.0235, 112.0467 Tokmak, Ukraine, 47.2556, 35.7056 Lakheri, India, 25.6700, 76.1700 Xalatlaco, Mexico, 19.1811, -99.4164 Inagawa, Japan, 34.9000, 135.3833 Limoeiro do Ajuru, Brazil, -1.8950, -49.3808 Zamboanguita, Philippines, 9.1000, 123.1990 Pedro Betancourt, Cuba, 22.7303, -81.2908 Anderson, United States, 34.5211, -82.6478 Bogoroditsk, Russia, 53.7667, 38.1333 Johnston, United States, 41.8274, -71.5202 Bafata, Guinea-Bissau, 12.1719, -14.6575 Antsahalava, Madagascar, -19.5835, 47.4685 Chiknayakanhalli, India, 13.4161, 76.6206 Rota, Spain, 36.6167, -6.3500 Clichy-sous-Bois, France, 48.9102, 2.5532 Southgate, United States, 42.2047, -83.2057 Maranga, India, 25.7592, 87.4665 Marmara Ereglisi, Turkey, 40.9697, 27.9553 Paraty, Brazil, -23.2194, -44.7147 Purificacion, Colombia, 3.8586, -74.9306 Cambui, Brazil, -22.6119, -46.0578 Behror, India, 27.8903, 76.2861 Sumilao, Philippines, 8.3281, 124.9783 Longhong, China, 19.8828, 110.4111 Olocuilta, El Salvador, 13.5667, -89.1167 Burton, United States, 42.9974, -83.6175 Temse, Belgium, 51.1167, 4.2000 Bra, Italy, 44.7000, 7.8500 Vallentuna, Sweden, 59.5333, 18.0833 Nan'ao, China, 38.5162, 114.5648 N'Gaous, Algeria, 35.5550, 5.6106 Dongyuya, China, 29.5619, 111.0350 Duanzhuang, China, 36.5796, 111.7577 Sint-Michielsgestel, Netherlands, 51.6433, 5.3586 Minad, India, 8.8500, 76.6958 Ja`ar, Yemen, 13.2231, 45.3056 Shangmuping, China, 30.8117, 111.0156 Augustow, Poland, 53.8436, 22.9794 Melrose, United States, 42.4556, -71.0590 Magna, United States, 40.7634, -112.1599 Petrich, Bulgaria, 41.3981, 23.2069 Kumalarang, Philippines, 7.7478, 123.1442 Flandes, Colombia, 4.2833, -74.8000 Escarcega, Mexico, 18.6067, -90.7344 Casselberry, United States, 28.6624, -81.3217 Arari, Brazil, -3.4539, -44.7800 Manticao, Philippines, 8.4042, 124.2867 Sankaridrug, India, 11.4745, 77.8691 Brecht, Belgium, 51.3494, 4.6394 San Lorenzo, United States, 37.6733, -122.1332 Dembi Dolo, Ethiopia, 8.5353, 34.8003 Zaltbommel, Netherlands, 51.8123, 5.2470 Ludwigsfelde, Germany, 52.2997, 13.2667 Pirakkad, India, 9.3500, 76.3500 Winnenden, Germany, 48.8764, 9.3978 Juchitepec, Mexico, 19.0997, -98.8792 Garchitorena, Philippines, 13.8800, 123.7000 Ibrahimpatnam, India, 16.6056, 80.3786 Mudbidri, India, 12.9101, 75.0030 Bujaru, Brazil, -1.5150, -48.0447 Gorna Oryahovitsa, Bulgaria, 43.1304, 25.7041 Sena Madureira, Brazil, -9.0658, -68.6569 Atmakur, India, 14.6167, 79.6167 Pueblo Nuevo Vinas, Guatemala, 14.2333, -90.4667 Vadakku Valliyur, India, 8.3829, 77.6122 Eastern Goleta Valley, United States, 34.4448, -119.7879 Krimpen aan den IJssel, Netherlands, 51.9200, 4.6000 Tizi Gheniff, Algeria, 36.5833, 3.7667 Chichester, United Kingdom, 50.8365, -0.7792 Perafita, Portugal, 41.2239, -8.6989 Bixby, United States, 35.9454, -95.8776 Kyegegwa, Uganda, 0.4803, 31.0547 Figuil, Cameroon, 9.7667, 13.9667 Budaors, Hungary, 47.4606, 18.9578 Pontedera, Italy, 43.6625, 10.6328 Tirukkalikkunram, India, 12.6092, 80.0675 Lavezares, Philippines, 12.5300, 124.3300 Bagong Pag-Asa, Philippines, 14.6622, 121.0331 Vaihingen an der Enz, Germany, 48.9328, 8.9564 Lamerd, Iran, 27.3336, 53.1886 Livadeia, Greece, 38.4333, 22.8667 L'Arbaa Nait Irathen, Algeria, 36.6367, 4.2067 Bois-Colombes, France, 48.9175, 2.2683 Stafford, United States, 39.7049, -74.2643 Oak Park, United States, 42.4649, -83.1824 Garfield Heights, United States, 41.4199, -81.6038 Marar, India, 25.5392, 86.5074 Santiago de Baney, Equatorial Guinea, 3.7000, 8.9167 Vero Beach South, United States, 27.6132, -80.4163 Baglung, Nepal, 28.2667, 83.6000 Orange, France, 44.1383, 4.8097 Fleming Island, United States, 30.0988, -81.7124 Didieni, Mali, 13.8850, -8.0928 Pilachikare, India, 12.0855, 75.2545 Povoa de Santa Iria, Portugal, 38.8562, -9.0685 Gloria do Goita, Brazil, -7.9992, -35.2911 Ra's al `Ayn, Syria, 36.8503, 40.0706 Casma, Peru, -9.4742, -78.3106 Texarkana, United States, 33.4360, -93.9959 Pattikonda, India, 15.4000, 77.5167 Nalakadoddi, India, 15.4000, 77.5167 Englewood, United States, 40.8917, -73.9736 Castelvetrano, Italy, 37.6786, 12.7917 Madang, Papua New Guinea, -5.2248, 145.7853 Northeim, Germany, 51.7067, 10.0011 Tonisvorst, Germany, 51.3208, 6.4931 Aralam, India, 11.9992, 75.7640 Pignon, Haiti, 19.3370, -72.1171 Fountain, United States, 38.6886, -104.6829 Shikharpur, Nepal, 27.7467, 85.5097 Mioveni, Romania, 44.9569, 24.9406 Guotang, China, 23.8384, 115.9201 Pitou, Taiwan, 23.8775, 120.4706 Hajduboszormeny, Hungary, 47.6667, 21.5167 Yoro, Japan, 35.3084, 136.5614 Ski, Norway, 59.7167, 10.8333 Kirkwood, United States, 38.5788, -90.4203 Fresnes, France, 48.7550, 2.3221 Benhao, China, 18.6150, 109.9310 Swarzedz, Poland, 52.4083, 17.0714 Emmen, Switzerland, 47.0772, 8.3000 Jacksonville, United States, 34.8807, -92.1304 Glenville, United States, 42.8869, -73.9925 Carmona, Spain, 37.4667, -5.6333 Harrison, United States, 41.0236, -73.7193 San Rafael, Mexico, 20.1889, -96.8658 Shuangtian, China, 22.8640, 114.5443 Namaacha, Mozambique, -25.9667, 32.0333 Khunti, India, 23.0810, 85.2774 Licab, Philippines, 15.5400, 120.7619 Shibushi, Japan, 31.4772, 131.1000 Cocula, Mexico, 20.3900, -103.8200 Oslob, Philippines, 9.5500, 123.4000 Rasra, India, 25.8500, 83.8500 Geislingen an der Steige, Germany, 48.6244, 9.8306 Garaimari, India, 24.0217, 88.6263 Springe, Germany, 52.2167, 9.5500 McCandless, United States, 40.5836, -80.0283 Quivican, Cuba, 22.8247, -82.3558 Paratinga, Brazil, -12.6908, -43.1839 Cachoeira, Brazil, -12.6178, -38.9558 Clarksburg, United States, 39.2246, -77.2659 Dildarnagar, India, 25.4309, 83.6665 Lepe, Spain, 37.2542, -7.2033 Villiers-le-Bel, France, 49.0094, 2.3911 Bromsgrove, United Kingdom, 52.3353, -2.0592 Koshu, Japan, 35.7043, 138.7294 Udaipur, India, 27.7289, 75.4716 Fandriana, Madagascar, -20.2296, 47.3745 Ternivka, Ukraine, 48.5167, 36.0000 Actopan, Mexico, 20.2681, -98.9442 Capitan Bermudez, Argentina, -32.8167, -60.7167 Maddagiri, India, 13.6600, 77.2100 Babaeski, Turkey, 41.4325, 27.0931 Buhl, Germany, 48.6953, 8.1350 Tomi, Japan, 36.3594, 138.3304 Fundao, Portugal, 40.1333, -7.5000 Cottica, Suriname, 3.8542, -54.2281 Dougabougou, Mali, 13.8186, -6.1189 Rosrath, Germany, 50.9000, 7.1833 Beldanga, India, 23.9300, 88.2500 Suisun City, United States, 38.2473, -122.0091 Esmeralda, Cuba, 21.8561, -78.1114 Bulung'ur Shahri, Uzbekistan, 39.7600, 67.2700 Poas, Costa Rica, 10.1060, -84.2475 Redondela, Spain, 42.2833, -8.6167 Ermont, France, 48.9922, 2.2603 Santa Cruz Cabralia, Brazil, -16.2778, -39.0250 Poona-Piagapo, Philippines, 8.0800, 124.0800 Nola, Central African Republic, 3.5333, 16.0667 Arniquet, Haiti, 18.1463, -73.8750 La Source, Haiti, 18.0714, -73.9006 Alegre, Brazil, -20.7639, -41.5328 Aipe, Colombia, 3.2167, -75.2333 Changzhi, Taiwan, 22.6833, 120.5333 Irara, Brazil, -12.0500, -38.7667 San Fernando, Mexico, 24.8504, -98.1600 Oktyabr'sk, Kazakhstan, 49.4556, 57.4161 Ath, Belgium, 50.6167, 3.7667 Lacey, United States, 39.8564, -74.2624 Statesville, United States, 35.7842, -80.8713 Blankenfelde, Germany, 52.3500, 13.4000 Queensbury, United States, 43.3568, -73.6765 Nieuwkoop, Netherlands, 52.1833, 4.7667 Raghopur, India, 26.1785, 86.0892 Hinunangan, Philippines, 10.4000, 125.2000 Slobodskoy, Russia, 58.7208, 50.1850 Sidi Allal el Bahraoui, Morocco, 33.9830, -6.4170 Yehud, Israel, 32.0333, 34.8833 Losino-Petrovskiy, Russia, 55.8744, 38.2017 East Palo Alto, United States, 37.4671, -122.1352 Yomou, Guinea, 7.5660, -9.2533 Ban Bang Khu Wat, Thailand, 13.9576, 100.4903 Gates, United States, 43.1514, -77.7130 Pallijkarani, India, 12.9333, 80.2022 Mahendragarh, India, 28.2800, 76.1500 Whitehall, United States, 40.6571, -75.5046 Riesa, Germany, 51.3081, 13.2939 Nakrekal, India, 17.1647, 79.4275 Takanezawa, Japan, 36.6310, 139.9865 Sao Miguel do Iguacu, Brazil, -25.3478, -54.2378 Saalfeld, Germany, 50.6500, 11.3667 Culemborg, Netherlands, 51.9500, 5.2333 Sopo, Colombia, 4.9167, -73.9333 Incesu, Turkey, 38.6222, 35.1847 San Cristobal, Cuba, 22.7169, -83.0511 Monitos, Colombia, 9.2503, -76.1325 Primero de Enero, Cuba, 21.9453, -78.4189 Sankrail, India, 22.5583, 88.2278 Ozumba, Mexico, 19.0392, -98.7936 Viacha, Bolivia, -16.6533, -68.3017 Xiaobazi, China, 27.3330, 105.5099 Kelkheim (Taunus), Germany, 50.1378, 8.4497 Desenzano del Garda, Italy, 45.4689, 10.5350 Colgong, India, 25.2633, 87.2326 Asipovichy, Belarus, 53.2933, 28.4756 Rapallo, Italy, 44.3500, 9.2333 Cambuslang, United Kingdom, 55.8190, -4.1671 Suran, Syria, 35.2919, 36.7485 Budaka, Uganda, 1.0167, 33.9450 Sherobod, Uzbekistan, 37.6667, 67.0000 Madinat Zayid, United Arab Emirates, 23.6522, 53.6536 Palpa, Nepal, 27.8667, 83.5500 Boyabat, Turkey, 41.4653, 34.7708 Mehlville, United States, 38.5018, -90.3149 Sonamukhi, India, 23.3000, 87.4200 Kalappatti, India, 11.0794, 77.0371 Zhongwangzhuang, China, 38.0333, 115.2667 Easton, United States, 40.6858, -75.2209 Alushta, Ukraine, 44.6672, 34.3978 Sexmoan, Philippines, 14.9360, 120.6230 Heswall, United Kingdom, 53.3280, -3.0990 Sachse, United States, 32.9726, -96.5793 Stoughton, United States, 42.1192, -71.1019 Bella Vista, Argentina, -28.4667, -59.0500 Chili, United States, 43.0845, -77.7541 Teapa, Mexico, 17.5483, -92.9530 Marigliano, Italy, 40.9333, 14.4500 Boxmeer, Netherlands, 51.6483, 5.9444 East Lake-Orient Park, United States, 27.9970, -82.3653 Pont-y-pwl, United Kingdom, 51.7030, -3.0410 Kitui, Kenya, -1.3667, 38.0167 Paripiranga, Brazil, -10.6875, -37.8617 Russellville, United States, 35.2762, -93.1383 Vattalkundu, India, 10.1630, 77.7580 Catandica, Mozambique, -18.0564, 33.1747 Meissen, Germany, 51.1667, 13.4833 Shiqiao, China, 34.1418, 105.1214 Uttamapalaiyam, India, 9.8000, 77.3333 Mirandopolis, Brazil, -21.1336, -51.1017 Sendjas, Algeria, 36.0667, 1.4000 Lugus, Philippines, 5.7000, 120.8200 Santo Domingo, Philippines, 17.6414, 120.4108 Sotteville-les-Rouen, France, 49.4092, 1.0900 Emmendingen, Germany, 48.1214, 7.8492 Deodrug, India, 16.4167, 76.9341 Johi, Pakistan, 26.6921, 67.6133 Somotillo, Nicaragua, 13.0333, -86.9167 Vallikunnam, India, 9.1167, 76.5333 Tocache Nuevo, Peru, -8.1889, -76.5139 Togitsu, Japan, 32.8289, 129.8486 Kudat, Malaysia, 6.8837, 116.8477 Independence, United States, 38.9510, -84.5492 Winterswijk, Netherlands, 51.9667, 6.7167 San Marcos, Nicaragua, 11.9167, -86.2000 Benavente, Portugal, 38.9833, -8.8167 Reforma, Mexico, 17.8658, -93.1472 San Javier, Chile, -36.6000, -71.7500 Hendijan, Iran, 30.2383, 49.7075 Ouled Haddaj, Algeria, 36.7200, 3.3500 Carmo do Paranaiba, Brazil, -19.0008, -46.3158 Pirri, Italy, 39.2458, 9.1288 Ipubi, Brazil, -7.6519, -40.1489 Vandiyur, India, 9.9092, 78.1609 Ponmana, India, 9.0167, 76.5167 Dapa, Philippines, 9.7578, 126.0528 Ursulo Galvan, Mexico, 19.4000, -96.3000 Shaker Heights, United States, 41.4744, -81.5496 Abasolo, Mexico, 20.4500, -101.5170 Ahmer el 'Ain, Algeria, 36.4781, 2.5639 Ofaqim, Israel, 31.2833, 34.6167 Sortobe, Kazakhstan, 42.8600, 75.2300 Senhora da Hora, Portugal, 41.1856, -8.6508 Timizart, Algeria, 36.8000, 4.2667 Gudalur, India, 11.1455, 76.9366 Campina, Romania, 45.1300, 25.7400 Humansdorp, South Africa, -34.0333, 24.7667 Enterprise, United States, 31.3275, -85.8463 Harij, India, 23.7000, 71.9000 Jeffersontown, United States, 38.2049, -85.5701 Ystad, Sweden, 55.4167, 13.8167 Cervia, Italy, 44.2500, 12.3667 La Dorada, Colombia, 0.3436, -76.9108 Great Yarmouth, United Kingdom, 52.6078, 1.7331 Cruces, Cuba, 22.3419, -80.2761 Placheri, India, 11.8361, 76.1750 Germi, Iran, 39.0297, 48.0803 Mount Olive, United States, 40.8662, -74.7426 Tosya, Turkey, 41.0172, 34.0383 Langley, Canada, 49.0987, -122.6597 Ammi Moussa, Algeria, 35.8667, 1.1167 Horki, Belarus, 54.2667, 30.9833 Kailaras, India, 26.3050, 77.6160 Hawtat Sudayr, Saudi Arabia, 25.5967, 45.6274 Limoeiro de Anadia, Brazil, -9.7406, -36.5028 Hajira, Pakistan, 33.7717, 73.8961 Premia de Mar, Spain, 41.4919, 2.3619 Tondela, Portugal, 40.5164, -8.0808 Hakmana, Sri Lanka, 6.0836, 80.6445 Ampatuan, Philippines, 6.8348, 124.4581 Cartama, Spain, 36.7114, -4.6306 Humberto de Campos, Brazil, -2.5983, -43.4611 Sibanicu, Cuba, 21.2389, -77.5211 Siroki Brijeg, Bosnia and Herzegovina, 43.3667, 17.5833 Hanawa, Japan, 40.2158, 140.7884 Santo Nino, Philippines, 14.5033, 121.0031 Pucon, Chile, -39.2767, -71.9744 Fabriano, Italy, 43.3386, 12.9085 Siquijor, Philippines, 9.1800, 123.5800 Ban Phai, Thailand, 16.0600, 102.7310 Arfoud, Morocco, 31.4361, -4.2328 Jimenez, Philippines, 8.3333, 123.8333 La Calera, Colombia, 4.7531, -73.9200 Perry Hall, United States, 39.4068, -76.4780 Kuttuparamba, India, 11.8278, 75.5659 Tabuelan, Philippines, 10.8500, 123.9000 Candelaria, Brazil, -29.6689, -52.7889 Ariyalur, India, 11.1372, 79.0778 Dalfsen, Netherlands, 52.5064, 6.2606 Mechernich, Germany, 50.6000, 6.6500 Nahan, India, 30.5500, 77.3000 Bielawa, Poland, 50.7000, 16.6167 Tres Marias, Brazil, -18.2058, -45.2419 Coromandel, Brazil, -18.4728, -47.2000 Le Plessis-Robinson, France, 48.7811, 2.2633 Tazmalt, Algeria, 36.3844, 4.3992 Karippira, India, 8.9500, 76.7167 Borzya, Russia, 50.3833, 116.5167 Ladwa, India, 29.9958, 77.0400 Arrentela, Portugal, 38.6267, -9.1036 Gidri, India, 30.8461, 75.8623 Grimsby, Canada, 43.2000, -79.5500 Ponot, Philippines, 8.4428, 123.0219 Munsan, Korea, South, 37.8529, 126.7848 Maubeuge, France, 50.2775, 3.9734 Mondlo, South Africa, -27.9670, 30.7220 Carinhanha, Brazil, -14.3050, -43.7650 Welk'it'e, Ethiopia, 8.2833, 37.7833 Brodnica, Poland, 53.2597, 19.3956 Santa Cruz das Palmeiras, Brazil, -21.8269, -47.2489 Pokhram, India, 25.9358, 86.1974 Baleno, Philippines, 12.4739, 123.4982 Lake in the Hills, United States, 42.1913, -88.3477 Mathba, Bangladesh, 22.2862, 89.9588 Woodley, United Kingdom, 51.4530, -0.9020 Thabazimbi, South Africa, -24.6000, 27.4000 Piracuruca, Brazil, -3.9278, -41.7089 Izegem, Belgium, 50.9167, 3.2000 Rehoboth, Namibia, -23.3167, 17.0833 Kudligi, India, 14.9050, 76.3853 Virapandi, India, 11.0625, 77.3508 Vicar, Spain, 36.8317, -2.6431 Srem, Poland, 52.0886, 17.0147 Greenville, United States, 33.3850, -91.0514 Duzhuang, China, 39.9867, 119.5409 Labinsk, Russia, 44.6333, 40.7333 Ibaiti, Brazil, -23.8489, -50.1878 Las Rosas, Mexico, 16.3667, -92.3500 Kodumur, India, 15.6833, 77.7833 Caetes, Brazil, -8.7728, -36.6228 Caicedonia, Colombia, 4.3333, -75.8333 Takahashi, Japan, 34.7914, 133.6164 Babatngon, Philippines, 11.4207, 124.8434 Hirado, Japan, 33.3681, 129.5536 Burbank, United States, 41.7444, -87.7686 Gusev, Russia, 54.5833, 22.2000 San Lucas Sacatepequez, Guatemala, 14.6167, -90.6500 Narsimlapet, India, 17.5100, 79.8044 Curridabat, Costa Rica, 9.9160, -84.0348 Kamphaeng Phet, Thailand, 16.4811, 99.5222 Kamalapuram, India, 15.3044, 76.4765 Garupa, Argentina, -27.4833, -55.8333 Vihti, Finland, 60.4167, 24.3167 Roseaux, Haiti, 18.6006, -74.0195 Yoshida, Japan, 34.7667, 138.2500 Asago, Japan, 35.3333, 134.8500 Tarawa, Kiribati, 1.3382, 173.0176 Pingdeng, China, 26.0564, 109.9239 Candelaria, Spain, 28.3547, -16.3711 Ponmala, India, 11.0221, 76.0432 Landhaura, India, 29.8200, 77.9300 Metu, Ethiopia, 8.3000, 35.5833 Acatenango, Guatemala, 14.5544, -90.9439 Artemovskiy, Russia, 57.3564, 61.8711 Manati, Cuba, 21.3144, -76.9378 Hanwell, United Kingdom, 51.5090, -0.3380 Golden Gate, United States, 26.1844, -81.7031 Stanford le Hope, United Kingdom, 51.5140, 0.4244 Zighout Youcef, Algeria, 36.5333, 6.7167 Converse, United States, 29.5091, -98.3084 Umrat, India, 21.1152, 72.8570 Misilmeri, Italy, 38.0333, 13.4500 Charenton-le-Pont, France, 48.8265, 2.4050 Maddur, India, 12.5849, 77.0500 Pilon, Cuba, 19.9053, -77.3208 Hoxter, Germany, 51.7667, 9.3667 Marks, Russia, 51.7167, 46.7500 Zhonghechang, China, 27.8886, 107.2531 Kikinda, Serbia, 45.8333, 20.4500 Carauari, Brazil, -4.8828, -66.8958 Nongstoin, India, 25.5200, 91.2700 Twentynine Palms, United States, 34.1478, -116.0659 Villanueva, Colombia, 10.6000, -72.9833 Sabaa Aiyoun, Morocco, 33.9000, -5.3667 Raikot, India, 30.6500, 75.6000 Kais, Algeria, 35.4947, 6.9242 Tanglou, China, 22.2272, 110.8630 Tantoucun, China, 22.1888, 110.8710 Maki, Japan, 37.7605, 138.8893 Chahe, China, 27.1694, 105.3792 Schwelm, Germany, 51.2667, 7.2667 Andoharanomaitso, Madagascar, -21.4738, 46.9628 Muritiba, Brazil, -12.6258, -38.9900 San Pedro del Pinatar, Spain, 37.8167, -0.7500 Camas, Spain, 37.4000, -6.0333 Ballymena, United Kingdom, 54.8600, -6.2800 Krotoszyn, Poland, 51.6833, 17.4333 Tibiao, Philippines, 11.2892, 122.0342 Paraparaumu, New Zealand, -40.9144, 175.0056 Mabini, Philippines, 9.8650, 124.5230 Pakwach, Uganda, 2.4619, 31.4983 Katima Mulilo, Namibia, -17.5000, 24.2667 Leonding, Austria, 48.2667, 14.2500 Ferdows, Iran, 34.0192, 58.1731 Kinik, Turkey, 39.0939, 27.3767 Pilar, Philippines, 9.8300, 124.3300 Bochnia, Poland, 49.9833, 20.4333 Bang Phongphang, Thailand, 13.6791, 100.5291 Murliganj, India, 25.9000, 86.9800 Nauhata, India, 25.9971, 86.4887 Navolato, Mexico, 24.7656, -107.7019 Linden, Guyana, 6.0000, -58.3000 Daphne, United States, 30.6263, -87.8816 Bridgewater, United States, 41.9728, -70.9749 Soissons, France, 49.3817, 3.3236 Old Harbour, Jamaica, 17.9333, -77.1167 Danville, United States, 40.1426, -87.6111 Oranjestad, Aruba, 12.5186, -70.0358 Santiago, Philippines, 9.2700, 125.5600 Dona Remedios Trinidad, Philippines, 15.0000, 121.0800 Saint-Etienne-du-Rouvray, France, 49.3786, 1.1050 Nowy Dwor Mazowiecki, Poland, 52.4333, 20.7167 Esparza, Costa Rica, 9.9959, -84.6467 Shamalgan, Kazakhstan, 43.3708, 76.6236 Esztergom, Hungary, 47.7856, 18.7403 Northampton, United States, 42.3266, -72.6745 San Salvador, Mexico, 20.2833, -99.0153 Ciudad Ixtepec, Mexico, 16.5628, -95.1000 Pitoa, Cameroon, 9.3833, 13.5333 West Springfield, United States, 42.1253, -72.6503 Oyabe, Japan, 36.6755, 136.8687 Pattambi, India, 10.8057, 76.1957 Kudymkar, Russia, 59.0167, 54.6667 Sarny, Ukraine, 51.3372, 26.6058 Carney, United States, 39.4050, -76.5235 Mondragone, Italy, 41.1000, 13.8833 Borba, Brazil, -4.3878, -59.5939 Saito, Japan, 32.1086, 131.4014 Kombissiri, Burkina Faso, 12.0667, -1.3333 Fenoarivobe, Madagascar, -18.4517, 46.5640 Pawayan, India, 28.0663, 80.1031 Manga, Burkina Faso, 11.6667, -1.0667 Ciudad Sahagun, Mexico, 19.7714, -98.5803 Neduvannur, India, 10.1167, 76.3500 Edayikunnam, India, 10.1009, 76.3713 Mirzapur, Bangladesh, 24.1029, 90.0984 Bom Jesus, Brazil, -4.4200, -46.7650 Dieppe, France, 49.9250, 1.0750 Tudela, Philippines, 8.2472, 123.8424 Saugus, United States, 42.4681, -71.0145 San Carlos, Colombia, 8.8006, -75.7022 Xizhou, Taiwan, 24.1156, 120.5350 Tracuateua, Brazil, -1.0719, -46.8969 Laoaoba, China, 26.8667, 105.5167 Mampikony, Madagascar, -16.0925, 47.6460 Akkattettar, India, 10.8167, 76.6500 Bethlehem, West Bank, 31.7049, 35.2038 Iuna, Brazil, -20.3458, -41.5358 Rancharia, Brazil, -22.2289, -50.8928 Simri Bakhriarpur, India, 25.7216, 86.5937 East Niles, United States, 35.3683, -118.9225 Sottaiyampalaiyam, India, 11.4053, 77.6794 Ain Cheggag, Morocco, 33.8833, -5.0333 Shangluhu, China, 23.2538, 115.5815 Koprivnica, Croatia, 46.1500, 16.8167 El Khiyam, Lebanon, 33.3272, 35.6111 Reinbek, Germany, 53.5089, 10.2483 Vallauris, France, 43.5805, 7.0538 Zhongtai, China, 35.0675, 107.6130 Moribabougou, Mali, 13.1200, -7.6300 Jaciara, Brazil, -15.9650, -54.9678 Frome, United Kingdom, 51.2279, -2.3215 Kiskunfelegyhaza, Hungary, 46.7050, 19.8500 Temescal Valley, United States, 33.7581, -117.4677 Blackrock, Ireland, 53.3015, -6.1778 Yongxiu, China, 19.8941, 110.2643 Sabra, Algeria, 34.8333, -1.5333 Mouzaia, Algeria, 36.4667, 2.6833 El Copey, Colombia, 10.1500, -73.9667 Papa, Hungary, 47.3237, 17.4680 Dobryanka, Russia, 58.4667, 56.4167 Plaine du Nord, Haiti, 19.6771, -72.2697 Baradero, Argentina, -33.8000, -59.5167 Santo Nino, Philippines, 17.8861, 121.5691 Rudehen, Iran, 35.7356, 51.9072 Basay, Philippines, 9.4200, 122.6300 Isnos, Colombia, 1.9333, -76.2333 Hattersheim, Germany, 50.0722, 8.4864 Azangaro, Peru, -14.9099, -70.1974 Bamba, Mali, 17.0350, -1.4050 Nivelles, Belgium, 50.5833, 4.3167 Harir, Iraq, 36.5517, 44.3516 Zarechnyy, Russia, 56.8167, 61.3333 La Asuncion, Venezuela, 11.0333, -63.8628 Pervomaiskyi, Ukraine, 49.3869, 36.2142 Agawam, United States, 42.0657, -72.6526 Martorell, Spain, 41.4770, 1.9280 Vanves, France, 48.8208, 2.2897 Bagha Purana, India, 30.6881, 75.0984 Reda, Poland, 54.6167, 18.3500 Losal, India, 27.4000, 74.9200 Dubasari, Moldova, 47.2667, 29.1667 Ambatolampy, Madagascar, -19.3796, 47.4335 Bin-Houye, Côte d’Ivoire, 6.7825, -8.3163 Longavi, Chile, -35.9667, -71.6833 Rajpur, India, 22.3053, 74.3525 Almazora, Spain, 39.9403, -0.0625 Heerenveen, Netherlands, 52.9500, 5.9333 Pardi, India, 20.5200, 72.9500 Cajati, Brazil, -24.7361, -48.1228 Matsubushi, Japan, 35.9258, 139.8152 Forest Hills, United States, 42.9577, -85.4895 Izu, Japan, 34.9765, 138.9468 Mendefera, Eritrea, 14.8833, 38.8167 Frattamaggiore, Italy, 40.9417, 14.2722 San Lorenzo de Esmeraldas, Ecuador, 1.2864, -78.8353 Sue, Japan, 33.5872, 130.5072 Congleton, United Kingdom, 53.1620, -2.2170 Pavugada, India, 14.1000, 77.2800 Riihimaki, Finland, 60.7333, 24.7667 Ilave, Peru, -16.0836, -69.6383 Condega, Nicaragua, 13.3500, -86.4000 Milton, United States, 42.2412, -71.0844 Sueca, Spain, 39.2000, -0.3114 Laplace, United States, 30.0731, -90.4758 Nenmem, India, 11.6333, 76.2611 Elanjivaliseri, India, 8.9500, 76.6667 Grand-Lahou, Côte d’Ivoire, 5.1333, -5.0167 Venezuela, Cuba, 21.7375, -78.7934 Puerto Leguizamo, Colombia, -0.1939, -74.7806 Kevelaer, Germany, 51.5833, 6.2500 Zhailuo, China, 26.8833, 105.2833 Tsushima, Japan, 34.2000, 129.2833 Verden, Germany, 52.9233, 9.2350 Wood Green, United Kingdom, 51.5981, -0.1149 Frankfort, United States, 38.1924, -84.8643 Monchegorsk, Russia, 67.9333, 32.9167 Spring, United States, 40.3038, -76.0262 Selargius, Italy, 39.2537, 9.1606 Mpika, Zambia, -11.8300, 31.4600 Szentendre, Hungary, 47.6733, 19.0725 Coyaima, Colombia, 3.8333, -75.0833 Siraha, Nepal, 26.6528, 86.2069 Kandalaksha, Russia, 67.1569, 32.4117 Goio-Ere, Brazil, -24.1850, -53.0278 Tha Yang, Thailand, 12.9723, 99.8827 Castel Volturno, Italy, 41.0500, 13.9167 Kumru, Turkey, 40.8744, 37.2639 Ouled Ben Abd el Kader, Algeria, 36.0258, 1.2764 Bonito Oriental, Honduras, 15.7476, -85.7314 Baishaling, China, 24.0950, 113.7592 Bushey, United Kingdom, 51.6429, -0.3604 Lansing, United States, 41.5648, -87.5462 Saint Bernard, Philippines, 10.2800, 125.1300 Madison Heights, United States, 42.5073, -83.1034 Harur, India, 12.0510, 78.4827 Missour, Morocco, 33.0500, -3.9833 San Vicente dels Horts, Spain, 41.3953, 2.0108 East Hampton, United States, 41.0117, -72.1277 Jamestown, United States, 42.0976, -79.2367 Geilenkirchen, Germany, 50.9653, 6.1194 Jaramijo, Ecuador, -0.9487, -80.6363 Valencia, Philippines, 9.6097, 124.2080 San Manuel, Philippines, 15.7975, 120.6072 Ogawa, Japan, 36.0567, 139.2618 Banswada, India, 18.3833, 77.8833 Yalda, Syria, 33.4640, 36.3208 Monroeville, United States, 40.4262, -79.7605 Mitu, Colombia, 1.1983, -70.1733 Conceicao das Alagoas, Brazil, -19.9150, -48.3878 Qianxucun, China, 37.8360, 116.6708 Datu Piang, Philippines, 7.0178, 124.4974 Toli, China, 45.9313, 83.6039 Konigsbrunn, Germany, 48.2689, 10.8908 Byaroza, Belarus, 52.5500, 24.9667 Henstedt-Ulzburg, Germany, 53.7833, 10.0000 Saint-Sebastien-sur-Loire, France, 47.2081, -1.5014 Ciro Redondo, Cuba, 22.0189, -78.7031 Ramanayyapeta, India, 17.3203, 82.1014 Maharajpur, India, 25.0194, 79.7319 Marau, Brazil, -28.4489, -52.2000 Sidi Lakhdar, Algeria, 36.2653, 2.1617 Kamatero, Greece, 38.0597, 23.7120 Pongoz, Tajikistan, 40.7500, 70.2500 Aioi, Japan, 34.8000, 134.4667 Nkhotakota, Malawi, -12.9163, 34.3000 Yerres, France, 48.7171, 2.4881 Apollo Beach, United States, 27.7618, -82.4003 Zeitz, Germany, 51.0478, 12.1383 Guararema, Brazil, -23.4150, -46.0350 Prata, Brazil, -19.3069, -48.9239 Orvault, France, 47.2717, -1.6225 Passira, Brazil, -7.9950, -35.5808 General San Martin, Argentina, -34.5667, -58.5333 Mannanchori, India, 9.5764, 76.3481 Princes Town, Trinidad and Tobago, 10.2667, -61.3833 Kpandu, Ghana, 6.9954, 0.2931 Toucheng, Taiwan, 24.8500, 121.8167 Kocani, North Macedonia, 41.9167, 22.4125 Brahmana Periya Agraharam, India, 11.3690, 77.7063 Arivonimamo, Madagascar, -19.0060, 47.1802 Puvali, India, 11.7930, 76.1650 San Jeronimo, Guatemala, 15.0611, -90.2403 Tarana, India, 23.3300, 76.0300 Kizhakkott, India, 11.3583, 75.8986 Puttankulam, India, 8.8111, 76.7152 Magog, Canada, 45.2667, -72.1500 Boisbriand, Canada, 45.6200, -73.8300 Taiwa, Japan, 38.4373, 140.8864 Saho, India, 25.9718, 86.1537 Higashikagawa, Japan, 34.2500, 134.3667 Mollendo, Peru, -17.0231, -72.0147 Srungavarapukota, India, 18.1167, 83.1667 Karanjia, India, 21.7626, 85.9732 Karasuk, Russia, 53.7167, 78.0500 Oltinko`l, Uzbekistan, 43.0758, 58.9067 Baunatal, Germany, 51.2589, 9.4183 Aberdeen, United States, 45.4649, -98.4686 Truskavets, Ukraine, 49.2806, 23.5050 Supe, Peru, -10.8017, -77.7436 Bermejo, Bolivia, -22.7322, -64.3425 Kuruvattur, India, 11.3061, 75.8236 Ruy Barbosa, Brazil, -12.2839, -40.4939 Huanghuajing, China, 24.1989, 112.9104 Fort Mill, United States, 35.0061, -80.9389 Ashington, United Kingdom, 55.1810, -1.5680 Chortkiv, Ukraine, 49.0075, 25.7906 Rockledge, United States, 28.3203, -80.7360 Guamal, Colombia, 9.1472, -74.2300 Tablat, Algeria, 36.4167, 3.3167 Bakhor, Tajikistan, 38.5500, 68.9833 Herentals, Belgium, 51.1767, 4.8364 Libacao, Philippines, 11.4800, 122.3000 Rio Pardo de Minas, Brazil, -15.6100, -42.5400 Glen Ellyn, United States, 41.8666, -88.0629 Grimma, Germany, 51.2386, 12.7253 Bergenfield, United States, 40.9236, -73.9982 Velikiy Ustyug, Russia, 60.7667, 46.3000 Adrogue, Argentina, -34.8000, -58.3833 Kolambugan, Philippines, 8.1144, 123.8971 Arnstadt, Germany, 50.8342, 10.9464 Busogo, Rwanda, -1.5572, 29.5442 Safaja, Egypt, 26.7517, 33.9344 Shakiso, Ethiopia, 5.7500, 38.9167 Montfermeil, France, 48.9000, 2.5667 Juangriego, Venezuela, 11.0833, -63.9667 Ivirgarzama, Bolivia, -17.0333, -64.8500 Maravilha, Brazil, -26.7700, -53.2167 Qiman al `Arus, Egypt, 29.3005, 31.1683 Lagdo, Cameroon, 9.0500, 13.7333 Ans, Belgium, 50.6625, 5.5200 Aneho, Togo, 6.2333, 1.6000 Kosk, Turkey, 37.8533, 28.0517 Bardaskan, Iran, 35.2625, 57.9703 Gizycko, Poland, 54.0400, 21.7589 Sestao, Spain, 43.3108, -3.0056 Cuitzeo del Porvenir, Mexico, 19.9686, -101.1394 Fortuna Foothills, United States, 32.6616, -114.3974 Hajipur, India, 31.9771, 75.7544 Edappalli, India, 9.8167, 76.3000 Caucete, Argentina, -31.6500, -68.2833 Forney, United States, 32.7440, -96.4529 Antur, India, 11.9870, 75.3760 Eonyang, Korea, South, 35.5667, 129.1167 Diangoute Kamara, Mali, 14.5447, -9.5128 Cocal, Brazil, -3.4708, -41.5550 Sirsaganj, India, 27.0569, 78.6861 Santo Antonio do Ica, Brazil, -3.1019, -67.9400 Griesheim, Germany, 49.8639, 8.5639 Poggibonsi, Italy, 43.4667, 11.1500 Kotagiri, India, 11.4300, 76.8800 Bejucal, Cuba, 22.9328, -82.3869 Heywood, United Kingdom, 53.5900, -2.2190 Zacoalco de Torres, Mexico, 20.2333, -103.5833 Metepec, Mexico, 19.2511, -99.6047 Amircan, Azerbaijan, 40.4264, 49.9836 Wappinger, United States, 41.5899, -73.8918 Leichlingen, Germany, 51.1167, 7.0167 Whitehorse, Canada, 60.7029, -135.0691 Heshancun, China, 30.6455, 120.3483 Eagle Pass, United States, 28.7125, -100.4840 Ljubuski, Bosnia and Herzegovina, 43.1981, 17.5467 Babar, Algeria, 35.1692, 7.1013 Carmagnola, Italy, 44.8469, 7.7179 Ayun, Pakistan, 35.7225, 71.7669 Ouesso, Congo (Brazzaville), 1.6106, 16.0514 Short Pump, United States, 37.6549, -77.6201 Agui, Japan, 34.9333, 136.9167 Shahpura, India, 27.3897, 75.9596 Dobropillia, Ukraine, 48.4689, 37.0828 Arqalyq, Kazakhstan, 50.2481, 66.9278 Chatan, Japan, 26.3200, 127.7639 Lier, Norway, 59.8675, 10.2142 Itabela, Brazil, -16.5750, -39.5528 Caungula, Angola, -8.4316, 18.6328 Guma, China, 37.6168, 78.2809 Citrus Park, United States, 28.0730, -82.5628 Tynda, Russia, 55.1667, 124.7167 Warin Chamrap, Thailand, 15.1932, 104.8628 Villaviciosa de Odon, Spain, 40.3583, -3.9033 Nalayh, Mongolia, 47.7725, 107.2550 Nirasaki, Japan, 35.7089, 138.4461 Gaotan, China, 32.4078, 108.3225 Chaska, United States, 44.8164, -93.6091 Obama, Japan, 35.4957, 135.7466 Saldanha, South Africa, -32.9978, 17.9456 Carrickfergus, United Kingdom, 54.7136, -5.8075 Tetela de Ocampo, Mexico, 19.8167, -97.8000 Ridgecrest, United States, 35.6308, -117.6622 Sonderborg, Denmark, 54.9106, 9.7928 Chennamangalam, India, 10.1797, 76.2097 Alotenango, Guatemala, 14.4878, -90.8058 Pinyahan, Philippines, 14.6400, 121.0461 Allen Park, United States, 42.2595, -83.2107 Darwen, United Kingdom, 53.6980, -2.4610 Cabrican, Guatemala, 15.0747, -91.6486 Capljina, Bosnia and Herzegovina, 43.1100, 17.7000 Itapemirim, Brazil, -21.0108, -40.8339 Maple Valley, United States, 47.3659, -122.0368 Bearsden, United Kingdom, 55.9195, -4.3337 La Paz Centro, Nicaragua, 12.3400, -86.6753 Cabangan, Philippines, 15.1300, 120.1500 Sangola, India, 17.4378, 75.1939 Sheohar, India, 26.5200, 85.3000 Dieppe, Canada, 46.0989, -64.7242 Massama, Portugal, 38.7568, -9.2748 Oakdale, United States, 44.9876, -92.9641 Tsinjoarivo, Madagascar, -19.6323, 47.6828 Neptune, United States, 40.2105, -74.0539 Golo-Djigbe, Benin, 6.5403, 2.3253 Bom Jardim, Brazil, -22.1519, -42.4189 Sesena, Spain, 40.1036, -3.6981 Glen Cove, United States, 40.8709, -73.6287 Hazar, Turkmenistan, 39.4450, 53.1150 Kakiri, Uganda, 0.4200, 32.3900 Hara Gebeya, Ethiopia, 11.8333, 39.7333 Kuli, India, 24.7366, 87.9426 Kromeriz, Czechia, 49.2989, 17.3931 Xochistlahuaca, Mexico, 16.7914, -98.2419 Nakhal, Oman, 23.3985, 57.8218 Mima, Japan, 34.0500, 134.1667 Qujingpu, China, 38.0814, 106.0489 San Vicente de Chucuri, Colombia, 6.8833, -73.4167 Casa Branca, Brazil, -21.7739, -47.0858 Kebili, Tunisia, 33.7050, 8.9650 Po, Burkina Faso, 11.1667, -1.1500 Khulm, Afghanistan, 36.6833, 67.6833 Guaimaca, Honduras, 14.5488, -86.8277 Honcho, Japan, 41.9000, 140.7000 Dajabon, Dominican Republic, 19.5667, -71.7100 Ramsey, United States, 45.2617, -93.4494 Mucuri, Brazil, -18.0858, -39.5508 Djugu, Congo (Kinshasa), 1.9184, 30.5019 Kalwakurti, India, 16.6500, 78.4800 Havran, Turkey, 39.5583, 27.0983 Reddish, United Kingdom, 53.4383, -2.1613 Lincoln, Argentina, -34.8500, -61.5167 Devanhalli, India, 13.2300, 77.7000 Gingee, India, 12.2528, 79.4173 Rhennouch, Tunisia, 33.9300, 10.0700 Crestview, United States, 30.7477, -86.5785 Villazon, Bolivia, -22.0911, -65.5961 Clayton, United States, 35.6590, -78.4498 Khust, Ukraine, 48.1814, 23.2978 Paiania, Greece, 37.9500, 23.8500 Akersberga, Sweden, 59.4833, 18.3000 Kefar Yona, Israel, 32.3171, 34.9358 Bayang, Philippines, 7.7930, 124.1920 Tysons, United States, 38.9215, -77.2273 Nunspeet, Netherlands, 52.3667, 5.7833 Mainit, Philippines, 9.5369, 125.5231 Anajas, Brazil, -0.9869, -49.9400 Mchinji, Malawi, -13.8167, 32.9000 Lomme, France, 50.6358, 3.0142 Baesweiler, Germany, 50.9000, 6.1833 Douentza, Mali, 14.9950, -2.9667 Tainai, Japan, 38.0597, 139.4103 Villa de Zaachila, Mexico, 16.9508, -96.7492 Dubendorf, Switzerland, 47.3981, 8.6194 Geldrop, Netherlands, 51.4222, 5.5578 Qianshanhong Nongchang, China, 29.1442, 112.4347 Jiaoxiling, China, 28.2190, 113.4764 Batufah, Iraq, 37.1744, 43.0132 Qornet Chahouane, Lebanon, 33.9200, 35.6700 Sahavato, Madagascar, -20.5968, 48.3245 Imito, Madagascar, -20.4170, 47.3181 Sandrandahy, Madagascar, -20.3432, 47.2976 Ambohijanahary, Madagascar, -17.4041, 48.3821 Masanwa, Tanzania, -3.1833, 33.7833 Karakurisshi, India, 10.9667, 76.4917 Billericay, United Kingdom, 51.6280, 0.4184 Henderson, United States, 37.8397, -87.5798 Cuartero, Philippines, 11.3428, 122.6714 Langedijk, Netherlands, 52.6833, 4.8000 Lubok Antu, Malaysia, 1.0419, 111.8340 Maryland Heights, United States, 38.7189, -90.4749 San Felipe Jalapa de Diaz, Mexico, 18.0667, -96.5333 Pacho, Colombia, 5.1306, -74.1583 Belpasso, Italy, 37.5861, 14.9772 Yangyuhe, China, 33.8614, 109.8740 Algemesi, Spain, 39.1897, -0.4378 Williston, United States, 48.1814, -103.6364 San Andres Sajcabaja, Guatemala, 15.1756, -90.9417 Kasangulu, Congo (Kinshasa), -4.5911, 15.1703 Kushtagi, India, 15.7562, 76.1911 Gragnano, Italy, 40.6957, 14.5154 Megrine, Tunisia, 36.7667, 10.2333 Shalqar, Kazakhstan, 47.8333, 59.6000 Kanavaikuli, India, 9.8500, 76.9400 Aron, India, 24.3811, 77.4174 Punceres, Venezuela, 9.9898, -63.3366 Dhabauli, India, 25.8346, 86.8057 Lohne, Germany, 52.6667, 8.2386 Labasa, Fiji, -16.4333, 179.3667 Goriar, India, 25.5513, 87.2046 Hamar, Norway, 60.7944, 11.0678 Canosa di Puglia, Italy, 41.2167, 16.0667 Vilangudi, India, 9.9458, 78.0935 Noe, Côte d’Ivoire, 5.2833, -2.8000 Douglas, Isle of Man, 54.1500, -4.4775 Semiluki, Russia, 51.6833, 39.0333 Navahrudak, Belarus, 53.5833, 25.8167 Tsinjoarivo, Madagascar, -18.9337, 46.3102 Aloran, Philippines, 8.4146, 123.8228 Nochistlan de Mejia, Mexico, 21.3642, -102.8464 New Iberia, United States, 30.0049, -91.8202 Danvers, United States, 42.5740, -70.9494 Bitam, Gabon, 2.0833, 11.4833 Malmal, India, 26.4833, 86.0500 Iguaba Grande, Brazil, -22.8389, -42.2289 Sabaur, Pakistan, 32.8031, 74.0614 Sfizef, Algeria, 35.2333, -0.2500 Newry, United Kingdom, 54.1760, -6.3490 Mocimboa, Mozambique, -11.3196, 40.3500 Comendador, Dominican Republic, 18.8833, -71.7000 Dahmani, Tunisia, 35.9500, 8.8333 Bouka, Benin, 10.2167, 3.1333 Lukow, Poland, 51.9272, 22.3833 Ash Shajarah, Jordan, 32.6417, 35.9417 Lake Jackson, United States, 29.0516, -95.4521 Bordj el Bahri, Algeria, 36.8167, 3.2333 El Sauce, Nicaragua, 12.8833, -86.5333 Reina Mercedes Viejo, Philippines, 17.0018, 121.7863 Reina Mercedes, Philippines, 16.9872, 121.8272 Ambohitompoina, Madagascar, -19.7569, 47.5722 Larreynaga, Nicaragua, 12.6744, -86.5708 Douar Olad. Salem, Morocco, 32.8739, -8.8588 Majayjay, Philippines, 14.1463, 121.4729 Caridad, Philippines, 14.4828, 120.8958 Gulnar, Turkey, 36.3389, 33.3986 Hiji, Japan, 33.3694, 131.5322 Harelbeke, Belgium, 50.8500, 3.3000 Cecina, Italy, 43.3139, 10.5250 Teltow, Germany, 52.4022, 13.2706 Ar Rutbah, Iraq, 33.0333, 40.2833 Dingalan, Philippines, 15.3800, 121.4000 Akcakoca, Turkey, 41.0878, 31.1244 Talusan, Philippines, 7.4263, 122.8084 Akcadag, Turkey, 38.3450, 37.9686 Zanandore, Burundi, -3.2500, 30.1167 San Isidro, Philippines, 12.3880, 124.3310 Ampasimanolotra, Madagascar, -18.8178, 49.0726 Mahaplag, Philippines, 10.6072, 124.9636 Quiroga, Mexico, 19.6667, -101.5333 Villa Luvianos, Mexico, 18.9200, -100.2983 Sirakorola, Mali, 13.2861, -7.5681 Huntley, United States, 42.1599, -88.4330 Umargam, India, 20.1700, 72.7600 Chalhuanca, Peru, -14.2950, -73.2444 Walnut, United States, 34.0334, -117.8593 Kakuda, Japan, 37.9770, 140.7821 Hadishahr, Iran, 38.8400, 45.6647 Barughutu, India, 23.8038, 85.5555 Bernards, United States, 40.6761, -74.5677 Uchturpan, China, 41.1517, 79.2250 Muchun, Tajikistan, 39.8833, 69.1833 Gyula, Hungary, 46.6500, 21.2828 Prior Lake, United States, 44.7246, -93.4419 Hamtramck, United States, 42.3954, -83.0559 Traipu, Brazil, -9.9706, -37.0033 Wasi, India, 18.5422, 75.7789 Kozluk, Turkey, 38.1944, 41.4911 Mizumaki, Japan, 33.8547, 130.6950 Kasimov, Russia, 54.9333, 41.4000 Baixo Guandu, Brazil, -19.5189, -41.0158 Nibria, India, 22.6100, 88.2500 Magdalena, Philippines, 14.2000, 121.4300 Motozintla, Mexico, 15.3632, -92.2477 Vleuten, Netherlands, 52.1081, 5.0150 Shirley, United States, 40.7936, -72.8748 Limeil-Brevannes, France, 48.7464, 2.4883 Mattul, India, 11.9580, 75.2942 Witham, United Kingdom, 51.7978, 0.6373 Orlova, Czechia, 49.8453, 18.4303 Ocean, United States, 40.2520, -74.0392 Vadnagar, India, 23.7850, 72.6400 Aci Catena, Italy, 37.5917, 15.1451 Tlalpujahua de Rayon, Mexico, 19.8050, -100.1744 Monsey, United States, 41.1181, -74.0682 Sundern, Germany, 51.3167, 8.0000 Garden City, United States, 37.9753, -100.8527 New Windsor, United States, 41.4742, -74.1089 Strausberg, Germany, 52.5833, 13.8833 Chato, Tanzania, -2.6378, 31.7669 Madison, United States, 32.4738, -90.1300 McHenry, United States, 42.3387, -88.2932 Vicuna, Chile, -30.0333, -70.7167 Vinales, Cuba, 22.6153, -83.7158 Sarayonu, Turkey, 38.2661, 32.4064 Soledad de Doblado, Mexico, 19.0500, -96.4167 Ivanjica, Serbia, 43.5811, 20.2297 Tenares, Dominican Republic, 19.3700, -70.3500 Swatara, United States, 40.2463, -76.8031 Reisterstown, United States, 39.4550, -76.8140 Fuman, Iran, 37.2242, 49.3125 Mongo, Chad, 12.1837, 18.7000 Muchamiel, Spain, 38.4136, -0.4456 Ramotswa, Botswana, -24.8667, 25.8167 Charkhari, India, 25.4000, 79.7500 Paivalike, India, 12.6875, 74.9833 Pirapozinho, Brazil, -22.2753, -51.5000 Moncao, Brazil, -3.4919, -45.2508 Guryevsk, Russia, 54.7833, 20.6167 Qibray, Uzbekistan, 41.3897, 69.4650 Itapissuma, Brazil, -7.7764, -34.8919 Paiporta, Spain, 39.4278, -0.4183 Ouda-yamaguchi, Japan, 34.5281, 135.9522 Lebrija, Spain, 36.9194, -6.0781 Khategaon, India, 22.5957, 76.9133 As Sarw, Egypt, 31.2387, 31.6538 Gabasumdo, China, 35.2481, 100.5903 Melton Mowbray, United Kingdom, 52.7661, -0.8884 Lapuyan, Philippines, 7.6325, 123.1914 South Laurel, United States, 39.0603, -76.8456 North Kingstown, United States, 41.5687, -71.4629 Shaler, United States, 40.5229, -79.9632 Batken, Kyrgyzstan, 40.0625, 70.8194 Palmar de Varela, Colombia, 10.7500, -74.7500 Joao Alfredo, Brazil, -7.8558, -35.5878 Tudiyalur, India, 11.0816, 76.9446 Parabiago, Italy, 45.5540, 8.9484 Mogliano Veneto, Italy, 45.5619, 12.2364 San Giovanni in Persiceto, Italy, 44.6408, 11.1850 Axim, Ghana, 4.8667, -2.2414 Koewarasan, Suriname, 5.7697, -55.2922 Borsa, Romania, 47.6553, 24.6631 Kashima, Japan, 33.1039, 130.0986 Tualatin, United States, 45.3772, -122.7748 Santa Barbara, Guatemala, 14.4333, -91.2333 George Town, Cayman Islands, 19.2950, -81.3811 San Miniato, Italy, 43.6833, 10.8500 Shuiding, China, 44.0500, 80.8667 Alvin, United States, 29.3872, -95.2938 Wajimazakimachi, Japan, 37.3906, 136.8992 Homewood, United States, 33.4619, -86.8090 Spinea, Italy, 45.4931, 12.1606 Mount Pleasant, United States, 42.7129, -87.8876 Alatri, Italy, 41.7264, 13.3422 Demre, Turkey, 36.2472, 29.9828 Poruvakara, India, 9.0667, 76.6333 Porto Belo, Brazil, -27.1578, -48.5528 Le Chesnay, France, 48.8211, 2.1311 Tabira, Brazil, -7.5908, -37.5394 Aparecida do Taboado, Brazil, -20.0869, -51.0939 Amarpur, India, 25.0397, 86.9025 San Pablo, Costa Rica, 9.9918, -84.0937 Argelia, Colombia, 2.2431, -77.2786 Brunssum, Netherlands, 50.9500, 5.9667 Kitsuki, Japan, 33.4169, 131.6161 Tuku, Taiwan, 23.6911, 120.3620 Kirov, Russia, 54.0833, 34.3167 Malargue, Argentina, -35.4750, -69.5833 Lagoa Vermelha, Brazil, -28.2089, -51.5258 Phuntsholing, Bhutan, 26.8500, 89.3833 Merrimack, United States, 42.8547, -71.5188 Tanguturu, India, 15.3500, 80.0500 Dodge City, United States, 37.7611, -100.0182 Niuchangqiao, China, 26.6247, 106.0077 Zongdi, China, 25.5909, 106.3163 Mukher, India, 18.7008, 77.3628 Barabinsk, Russia, 55.3500, 78.3500 Bad Neuenahr-Ahrweiler, Germany, 50.5447, 7.1133 Alhaurin el Grande, Spain, 36.6331, -4.6831 San Juan Guichicovi, Mexico, 16.9667, -95.0833 Gyongyos, Hungary, 47.7833, 19.9333 Di Linh, Vietnam, 11.5778, 108.0751 Parsa, India, 26.0021, 84.5979 West Melbourne, United States, 28.0694, -80.6736 Hikawa, Japan, 35.3833, 132.8333 Longtan, China, 40.7861, 115.5786 Pachor, India, 23.7098, 76.7339 Leon Postigo, Philippines, 8.1514, 122.9244 Padiyanallur, India, 13.2004, 80.1761 Yahaba, Japan, 39.6060, 141.1429 Bhimbar, Pakistan, 32.9747, 74.0731 Drexel Heights, United States, 32.1453, -111.0480 Mutum, Brazil, -19.8000, -41.4378 Saint Annes on the Sea, United Kingdom, 53.7513, -3.0320 Williamsport, United States, 41.2399, -77.0370 Theniet el Had, Algeria, 35.8708, 2.0289 Quijingue, Brazil, -10.7525, -39.2092 Shatiancun, China, 21.9053, 110.7151 Shilan, China, 21.8724, 110.6604 Maracas, Brazil, -13.4408, -40.4308 Mont-Dore, New Caledonia, -22.2833, 166.5833 Lagoa Seca, Brazil, -7.1708, -35.8536 Veendam, Netherlands, 53.1000, 6.8667 Heppenheim, Germany, 49.6431, 8.6389 Contla, Mexico, 19.3333, -98.1667 Wangen im Allgau, Germany, 47.6858, 9.8342 Vila do Conde, Brazil, -7.2600, -34.9078 Magadi, India, 12.9700, 77.2300 Assisi, Italy, 43.0700, 12.6175 Soignies, Belgium, 50.5667, 4.0667 Wickford, United Kingdom, 51.6114, 0.5207 Nuku`alofa, Tonga, -21.1333, -175.2000 Boysun, Uzbekistan, 38.2000, 67.2000 Gurlan, Uzbekistan, 41.8500, 60.4000 Kariba, Zimbabwe, -16.5167, 28.8000 Ambodibonara, Madagascar, -20.3137, 48.5208 Cabrero, Chile, -37.0333, -72.4000 Svendborg, Denmark, 55.0704, 10.6167 Ouled Fayet, Algeria, 36.7333, 2.9500 Sucy-en-Brie, France, 48.7697, 2.5228 Nakhon Phanom, Thailand, 17.4069, 104.7808 Lochearn, United States, 39.3461, -76.7307 Waddan, Libya, 29.1611, 16.1436 Betera, Spain, 39.5933, -0.4628 Laojiezi, China, 26.8600, 103.1306 Hulst, Netherlands, 51.2800, 4.0528 Taougrite, Algeria, 36.2500, 0.9167 Campulung, Romania, 45.2678, 25.0464 Andenne, Belgium, 50.4833, 5.1000 Ouled Slama Tahta, Algeria, 36.5483, 3.1100 Narat, China, 43.3667, 84.0500 Wengtiancun, China, 19.9327, 110.8750 Wangtang, China, 19.9117, 110.8072 Cinco Saltos, Argentina, -38.8167, -68.0667 Ahlat, Turkey, 38.7528, 42.4944 Karlskoga, Sweden, 59.3333, 14.5167 Atharan Hazari, Pakistan, 31.1671, 72.0898 Jauja, Peru, -11.7750, -75.5000 Mulchen, Chile, -37.7167, -72.2333 Silver Springs Shores, United States, 29.1126, -82.0149 Mazenod, Lesotho, -29.4642, 27.4969 Pombos, Brazil, -8.1492, -35.4011 Conner, Philippines, 17.8086, 121.2889 Ilchester, United States, 39.2187, -76.7683 Wilmette, United States, 42.0771, -87.7282 Kantai, India, 26.2142, 85.2975 Kobuleti, Georgia, 41.8214, 41.7792 Novo Oriente, Brazil, -5.5339, -40.7739 Heemstede, Netherlands, 52.3500, 4.6167 Paracuru, Brazil, -3.4100, -39.0308 Rardhu, India, 22.6430, 72.7762 Citong, Taiwan, 23.7729, 120.5277 Rayamangalam, India, 10.0879, 76.5088 Haciqabul, Azerbaijan, 40.0387, 48.9429 Ninomiya, Japan, 35.2995, 139.2555 Patjirwa, India, 26.8084, 84.3847 Teno, Chile, -34.8667, -71.1833 Anadia, Portugal, 40.4333, -8.4333 Butzbach, Germany, 50.4367, 8.6622 Jarrow, United Kingdom, 54.9814, -1.4900 Niimi, Japan, 34.9739, 133.4731 Abarkuh, Iran, 31.1256, 53.2625 Witney, United Kingdom, 51.7800, -1.4900 Takahagi, Japan, 36.7192, 140.7167 Apaxco de Ocampo, Mexico, 19.9800, -99.1500 Schloss Holte-Stukenbrock, Germany, 51.8833, 8.6167 Pindare-Mirim, Brazil, -3.6078, -45.3428 Pitogo, Philippines, 7.4536, 123.3133 Daulatkhan, Bangladesh, 22.5998, 90.7414 Marolambo, Madagascar, -20.0506, 48.1335 Belmont, United States, 37.5154, -122.2953 Ehingen an der Donau, Germany, 48.2833, 9.7236 Suluru, India, 13.7000, 80.0180 Sitakili, Mali, 13.1069, -11.2325 Timaru, New Zealand, -44.3931, 171.2508 Nuwara Eliya, Sri Lanka, 6.9667, 80.7667 Triunfo, Brazil, -29.9428, -51.7178 Sint-Joost-ten-Node, Belgium, 50.8500, 4.3833 Mililani Town, United States, 21.4465, -158.0147 Tazoult-Lambese, Algeria, 35.4900, 6.2600 Fiche, Ethiopia, 9.8000, 38.7333 Shingu, Japan, 33.7167, 136.0000 Marshalltown, United States, 42.0343, -92.9068 Nasriganj, India, 25.0514, 84.3284 Supia, Colombia, 5.4667, -75.6500 Overath, Germany, 50.9500, 7.3000 Lemon Grove, United States, 32.7331, -117.0344 Staraya Russa, Russia, 58.0000, 31.3333 Bourem, Mali, 16.9542, -0.3503 Oiapoque, Brazil, 3.8428, -51.8350 Bandipura, India, 34.4231, 74.6361 Karimba, India, 10.9100, 76.5250 Divnogorsk, Russia, 55.9594, 92.3619 Tongyangdao, China, 41.7676, 109.9711 Duayaw-Nkwanta, Ghana, 7.1749, -2.0996 Pirai, Brazil, -22.6287, -43.8982 Konnur, India, 16.2013, 74.7436 Ukiha, Japan, 33.3500, 130.7500 Athens, United States, 34.7843, -86.9503 San Carlos, Uruguay, -34.8000, -54.9167 Aguas Santas, Portugal, 41.2106, -8.5866 Fetesti, Romania, 44.4150, 27.8236 Purral, Costa Rica, 9.9594, -84.0165 Ciudad Bolivar, Colombia, 5.8500, -76.0333 Pearl, United States, 32.2730, -90.0918 New Lenox, United States, 41.5095, -87.9703 Toqsu, China, 41.5417, 82.6040 Los Reyes de Juarez, Mexico, 18.9458, -97.8058 Hamminkeln, Germany, 51.7319, 6.5908 Wetter (Ruhr), Germany, 51.3881, 7.3950 Vandikarai, India, 9.9912, 76.8050 Villa El Carmen, Nicaragua, 11.9833, -86.5167 Arar, Saudi Arabia, 30.9753, 41.0231 Bakhchysarai, Ukraine, 44.7528, 33.8608 Asha, Russia, 55.0000, 57.2667 Kernersville, United States, 36.1065, -80.0842 Millville, United States, 39.3903, -75.0561 Malekan, Iran, 37.1428, 46.1053 Bulanik, Turkey, 39.0950, 42.2667 Arriaga, Spain, 42.8667, -2.6800 Horley, United Kingdom, 51.1740, -0.1720 Mu'tah, Jordan, 31.1000, 35.7000 Clinton, United States, 32.3540, -90.3403 Cyangugu, Rwanda, -2.4833, 28.8967 Jardim, Brazil, -7.5819, -39.2978 Neenah, United States, 44.1669, -88.4767 Guastatoya, Guatemala, 14.8500, -90.0667 Ruzomberok, Slovakia, 49.0786, 19.3083 Heilbron, South Africa, -27.2836, 27.9708 Caracal, Romania, 44.1125, 24.3472 Shotley Bridge, United Kingdom, 54.8700, -1.8600 Sadri, India, 25.1800, 73.4300 Oppegard, Norway, 59.7797, 10.7519 Villareal, Philippines, 11.5700, 124.9300 Ayyagarpet, India, 17.2197, 80.8339 Ibipetuba, Brazil, -11.0089, -44.5189 Nalbari, India, 26.4450, 91.4400 Marion, United States, 40.5497, -85.6604 Itai, Brazil, -23.4178, -49.0906 Ashford, United Kingdom, 51.4340, -0.4640 Penukonda, India, 14.0850, 77.5960 Green, United States, 40.9483, -81.4757 Leiderdorp, Netherlands, 52.1667, 4.5333 Itako, Japan, 35.9471, 140.5554 Tuxpan, Mexico, 19.5661, -100.4625 Khrestivka, Ukraine, 48.1464, 38.3606 Macau, Brazil, -5.1150, -36.6339 Ciudad Tecun Uman, Guatemala, 14.6667, -92.1500 Kedu, China, 25.7103, 106.8460 Balussheri, India, 11.4500, 75.8300 Chillan Viejo, Chile, -36.6239, -72.1358 K'olito, Ethiopia, 7.3122, 38.0892 Panauti, Nepal, 27.5844, 85.5147 Asheboro, United States, 35.7158, -79.8127 Paouignan, Benin, 7.6937, 2.2673 Korgan, Turkey, 40.8247, 37.3467 Varandarapilli, India, 10.4167, 76.3333 Jalpan, Mexico, 21.2167, -99.4725 Illkirch-Graffenstaden, France, 48.5300, 7.7200 Deer Park, United States, 40.7623, -73.3218 Pokhvistnevo, Russia, 53.6500, 52.1333 King, Canada, 44.0463, -79.6044 Ikaruga, Japan, 34.6089, 135.7306 Blerick, Netherlands, 51.3705, 6.1429 Parksville, Canada, 49.3150, -124.3120 Aytos, Bulgaria, 42.7000, 27.2500 Drimmelen, Netherlands, 51.6944, 4.7972 Shtime, Kosovo, 42.4331, 21.0397 Bihpur, India, 25.3889, 86.9337 Palanas, Philippines, 12.1464, 123.9219 Fremont, United States, 41.4395, -96.4873 Kirzhach, Russia, 56.1500, 38.8667 Blagnac, France, 43.6364, 1.3906 Oulad Hassoune, Morocco, 31.6503, -7.8361 Castanos, Mexico, 26.7833, -101.4167 Macalelon, Philippines, 13.7500, 122.1300 Almunecar, Spain, 36.7333, -3.6833 Cueramaro, Mexico, 20.6258, -101.6739 Pallippurattuseri, India, 9.7566, 76.3607 Chiavari, Italy, 44.3164, 9.3237 Navrongo, Ghana, 10.8917, -1.0889 Wegberg, Germany, 51.1417, 6.2792 Zarraga, Philippines, 10.8200, 122.6000 Nokha, India, 25.1015, 84.1228 Prainha, Brazil, -1.8000, -53.4800 Xovos, Uzbekistan, 40.2197, 68.8400 Union City, United States, 33.5942, -84.5629 Rostov, Russia, 57.1833, 39.4167 Santo Antonio do Monte, Brazil, -20.0869, -45.2939 Porto Calvo, Brazil, -9.0562, -35.3985 Bhander, India, 25.7358, 78.7456 Leimen, Germany, 49.3481, 8.6911 Behara, Madagascar, -24.9560, 46.3897 Wakefield, United States, 42.5035, -71.0656 Ramon Magsaysay, Philippines, 8.0053, 123.4869 Corrente, Brazil, -10.4428, -45.1619 Sens, France, 48.1975, 3.2877 Santo Amaro da Imperatriz, Brazil, -27.6878, -48.7789 Sipacapa, Guatemala, 15.2122, -91.6347 Jumilla, Spain, 38.4792, -1.3250 Haliyal, India, 15.3294, 74.7633 Thomasville, United States, 35.8813, -80.0807 Bady Bassitt, Brazil, -20.9178, -49.4450 Zalingei, Sudan, 12.9092, 23.4706 Choba, Nigeria, 4.8906, 6.9033 Novi Ligure, Italy, 44.7592, 8.7856 Akitakata, Japan, 34.6631, 132.7064 Talisay, Philippines, 14.1356, 122.9244 Tepehuacan de Guerrero, Mexico, 21.0131, -98.8442 Rheinbach, Germany, 50.6333, 6.9500 Paracuellos de Jarama, Spain, 40.5500, -3.5167 Debiapur, India, 26.6358, 79.5733 Mtubatuba, South Africa, -28.4167, 32.1833 Hayang, Korea, South, 35.9167, 128.8167 Grombalia, Tunisia, 36.6000, 10.5000 Pooler, United States, 32.1043, -81.2569 Wright, United States, 30.4445, -86.6419 Esplanada, Brazil, -11.7958, -37.9450 Moron de la Frontera, Spain, 37.1222, -5.4517 Redencao, Brazil, -4.2258, -38.7308 Longton, United Kingdom, 52.9877, -2.1327 Bourzanga, Burkina Faso, 13.6781, -1.5461 Calimete, Cuba, 22.5339, -80.9097 Raseborg, Finland, 59.9750, 23.4333 Baler, India, 26.9042, 81.1923 Ezhipram, India, 9.8233, 76.3100 Zolotonosha, Ukraine, 49.6686, 32.0422 Hairel Nhai, Morocco, 35.6108, -5.9186 Castelli, Argentina, -25.9500, -60.6167 New London, United States, 41.3502, -72.1022 Mocajuba, Brazil, -2.5839, -49.5069 Sihecun, China, 22.4761, 111.5707 Kimbe, Papua New Guinea, -5.5500, 150.1430 Kent, United States, 41.1490, -81.3610 Boralday, Kazakhstan, 43.3603, 76.8578 El Abadia, Algeria, 36.2667, 1.6833 Kobylka, Poland, 52.3333, 21.2000 Taraka, Philippines, 7.8994, 124.3481 Les Anglais, Haiti, 18.3058, -74.2192 Balch Springs, United States, 32.7194, -96.6151 Tauramena, Colombia, 5.0167, -72.7500 Nahuatzen, Mexico, 19.6536, -101.9158 Mirnyy, Russia, 62.7667, 40.3333 Conception Bay South, Canada, 47.5167, -52.9833 Topki, Russia, 55.3333, 85.7500 Bo'ao, China, 19.1606, 110.5808 Nguti, Cameroon, 5.3167, 9.4167 San Juan de Uraba, Colombia, 8.7667, -76.5333 Zhongshan, China, 34.9381, 105.8775 Dargecit, Turkey, 37.5440, 41.7200 Tara, Russia, 56.8833, 74.3667 Rambouillet, France, 48.6444, 1.8308 Keswick, Canada, 44.2500, -79.4667 Pfaffenhofen, Germany, 48.5333, 11.5167 La Teste-de-Buch, France, 44.6200, -1.1457 Celina, United States, 33.3154, -96.7941 Mason City, United States, 43.1487, -93.1997 Jonava, Lithuania, 55.0722, 24.2806 Hohen Neuendorf, Germany, 52.6667, 13.2833 Pijnacker, Netherlands, 52.0183, 4.4361 Digboi, India, 27.3932, 95.6184 Picarras, Brazil, -26.7500, -48.6667 Dame-Marie, Haiti, 18.5615, -74.4205 Cakovec, Croatia, 46.3833, 16.4333 Parimpudi, India, 17.1171, 81.4342 Wiesloch, Germany, 49.2942, 8.6983 Aalten, Netherlands, 51.9250, 6.5808 San Agustin Tlaxiaca, Mexico, 20.1144, -98.8867 Rappang, Indonesia, -3.8447, 119.8205 Oratorio, Guatemala, 14.2281, -90.1758 Sikonge, Tanzania, -5.6333, 32.7667 Santa Eugenia, Spain, 42.5667, -8.9833 Nemuro, Japan, 43.3300, 145.5828 Awara, Japan, 36.2113, 136.2290 Jeffrey's Bay, South Africa, -34.0333, 24.9167 Lindenhurst, United States, 40.6858, -73.3710 Haigangli, China, 39.9534, 119.5431 Lambersart, France, 50.6500, 3.0250 Lishanpu, China, 27.6256, 112.4047 Zavodoukovsk, Russia, 56.4833, 66.5333 Upper Macungie, United States, 40.5694, -75.6244 Pershotravens'k, Ukraine, 48.3475, 36.4017 Mirano, Italy, 45.4928, 12.1099 Afzalpur, India, 17.2011, 76.3611 Ambohijanaka, Madagascar, -18.9981, 47.5617 Springettsbury, United States, 39.9907, -76.6736 Fort Saskatchewan, Canada, 53.7128, -113.2133 Cormeilles-en-Parisis, France, 48.9739, 2.2014 Tall Rif`at, Syria, 36.4723, 37.0947 Liugoucun, China, 40.9471, 118.2762 Yerkoy, Turkey, 39.6381, 34.4672 Long Thanh, Vietnam, 10.8667, 106.9167 Sidi Lmokhtar, Morocco, 31.5700, -9.0100 Batgram, Pakistan, 34.6833, 73.0167 Quakers Hill, Australia, -33.7361, 150.8778 Ichikikushikino, Japan, 31.7144, 130.2719 Villagran, Mexico, 20.5170, -100.9830 Vittorio Veneto, Italy, 45.9833, 12.3000 Zomin Shaharchasi, Uzbekistan, 39.9631, 68.3939 Minacu, Brazil, -13.5328, -48.2200 Irimbiliyam, India, 10.8667, 76.0833 Gladstone, United States, 39.2134, -94.5592 Pedernales, Ecuador, 0.0700, -80.0550 Kahului, United States, 20.8715, -156.4603 Taverny, France, 49.0264, 2.2275 West Linn, United States, 45.3670, -122.6399 Kuzhittura, India, 8.3165, 77.2061 Nova Olinda do Norte, Brazil, -3.8878, -59.0939 San Andres de la Barca, Spain, 41.4478, 1.9769 Nayoro, Japan, 44.3558, 142.4631 Vakfikebir, Turkey, 41.0475, 39.2797 Klosterneuburg, Austria, 48.3042, 16.3167 Carrollton, United States, 33.5818, -85.0838 Toguere-Koumbe, Mali, 14.9169, -4.5947 Harbiye, Turkey, 36.1450, 36.1411 Badiangan, Philippines, 10.9860, 122.5369 Pasinler, Turkey, 39.9797, 41.6756 Libenge, Congo (Kinshasa), 3.6508, 18.6375 Guanxi, Taiwan, 24.8000, 121.1833 San Isidro, Philippines, 16.8700, 121.7700 Raver, India, 21.2431, 76.0333 Quezon, Philippines, 17.3119, 121.6050 Imamoglu, Turkey, 37.2589, 35.6728 Marsta, Sweden, 59.6167, 17.8500 Nguekhokh, Senegal, 14.5088, -17.0027 Baltiysk, Russia, 54.6500, 19.9167 Nizao, Dominican Republic, 18.2500, -70.2000 Catamayo, Ecuador, -3.9833, -79.3500 Amatepec, Mexico, 18.6500, -100.1500 Malebennur, India, 14.3537, 75.7400 Madhura, India, 26.3388, 87.1027 Lemoore, United States, 36.2949, -119.7983 Amangal, India, 16.8499, 78.5327 Ermelo, Netherlands, 52.3000, 5.6331 Chios, Greece, 38.3725, 26.1375 Wooster, United States, 40.8172, -81.9336 Bagepalli, India, 13.7800, 77.7900 Belmont, United States, 42.3960, -71.1795 Alexania, Brazil, -16.0819, -48.5069 Ticuantepe, Nicaragua, 12.0167, -86.2000 Pueblo Bello, Colombia, 10.4167, -73.5833 Chiriguana, Colombia, 9.3667, -73.6000 Marcos Juarez, Argentina, -32.7000, -62.1000 Lamzoudia, Morocco, 31.5833, -8.4833 Sun City West, United States, 33.6695, -112.3573 Payakaraopeta, India, 17.3627, 82.5572 Lushnje, Albania, 40.9333, 19.7000 Barbacha, Algeria, 36.5667, 4.9667 Vohipaho, Madagascar, -23.5521, 47.5093 Tsaravary, Madagascar, -21.2455, 48.2982 Miandrarivo, Madagascar, -19.4392, 46.7538 Mandabe, Madagascar, -21.0489, 44.9392 Andranomavo, Madagascar, -16.5757, 45.5647 Antsiatsiaka, Madagascar, -17.0458, 49.3727 Alakamisy Itenina, Madagascar, -21.6425, 47.1598 Arandu, Pakistan, 35.3103, 71.5486 Jaglot, Pakistan, 35.6850, 74.6239 Haqqulobod, Uzbekistan, 40.9061, 72.1194 Aragua de Barcelona, Venezuela, 9.4575, -64.8261 Woolwich, Canada, 43.5667, -80.4833 Gojo, Japan, 34.3564, 135.6956 Kriens, Switzerland, 47.0344, 8.2800 Estarreja, Portugal, 40.7500, -8.5667 Tarragona, Philippines, 7.0491, 126.4471 Rapperswil-Jona, Switzerland, 47.2286, 8.8317 Oullins, France, 45.7150, 4.8083 Ourika Wawrmas, Morocco, 30.7167, -6.5333 Ambinanisakana, Madagascar, -16.9884, 49.4786 Soanierana Ivongo, Madagascar, -16.9216, 49.5857 Ondokuzmayis, Turkey, 41.4944, 36.0789 Anajatuba, Brazil, -3.2644, -44.6197 Limbe, Cameroon, 4.0167, 9.2167 El Transito, El Salvador, 13.3500, -88.3500 Kirovsk, Russia, 59.8667, 30.9833 Fulshear, United States, 29.6930, -95.8804 Basi, India, 30.5872, 76.8428 Aripuana, Brazil, -10.1767, -59.4439 Kapellen, Belgium, 51.3167, 4.4333 Kadappuram, India, 10.5500, 76.1167 San Sebastian de Yali, Nicaragua, 13.3000, -86.1833 Ar Rudayyif, Tunisia, 34.3833, 8.1500 Novo Cruzeiro, Brazil, -17.4678, -41.8750 Waukee, United States, 41.5985, -93.8869 Nava, Mexico, 28.4214, -100.7675 Gonesse, France, 48.9875, 2.4494 Uyuni, Bolivia, -20.4628, -66.8239 Bouguirat, Algeria, 35.7508, 0.2556 Potrerillos, Honduras, 15.2333, -87.9667 Mint Hill, United States, 35.1783, -80.6528 Wassenaar, Netherlands, 52.1500, 4.4000 Zuitou, China, 34.0622, 107.3128 Molins de Rey, Spain, 41.4139, 2.0158 Fidenza, Italy, 44.8664, 10.0611 Sali, Senegal, 14.4425, -17.0165 Sao Bernardo, Brazil, -3.3608, -42.4178 Werkendam, Netherlands, 51.8097, 4.8928 Farnworth, United Kingdom, 53.5452, -2.3999 Chicago Heights, United States, 41.5100, -87.6345 Dietikon, Switzerland, 47.4056, 8.4039 Brawley, United States, 32.9783, -115.5287 Safashahr, Iran, 30.6133, 53.1928 Kamyshlov, Russia, 56.8333, 62.7167 Santa Maria, Argentina, -26.6833, -66.0333 Nainijor, India, 25.6811, 84.3456 Tambo, Philippines, 14.5164, 120.9889 Lowicz, Poland, 52.1000, 19.9333 Prachuap Khiri Khan, Thailand, 11.8167, 99.8000 Celendin, Peru, -6.8667, -78.1500 Temple Terrace, United States, 28.0436, -82.3773 Nelliyalam, India, 11.5255, 76.3589 Qa'emiyeh, Iran, 29.8525, 51.5842 Gevas, Turkey, 38.2978, 43.1056 Leisure City, United States, 25.4935, -80.4363 Moon, United States, 40.5081, -80.2074 Khmilnyk, Ukraine, 49.5569, 27.9572 Sandanski, Bulgaria, 41.5681, 23.2823 Margherita, India, 27.2800, 95.6800 Maner, India, 25.6500, 84.8800 Nossa Senhora da Gloria, Brazil, -10.2178, -37.4200 Garden City, United States, 42.3244, -83.3412 Kulasekharapuram, India, 8.1500, 77.5000 Atitalaquia, Mexico, 20.0583, -99.2208 Kaluderica, Serbia, 44.7500, 20.5500 Lobatse, Botswana, -25.2167, 25.6667 Wahga, Pakistan, 31.6047, 74.5731 Acapetahua, Mexico, 15.2333, -92.7667 San Antonio de Areco, Argentina, -34.2500, -59.4667 Pemberton, United States, 39.9562, -74.6000 Paducah, United States, 37.0711, -88.6440 Al Qitena, Sudan, 14.8648, 32.3668 Kushva, Russia, 58.2833, 59.7333 Albignasego, Italy, 45.3500, 11.8667 Pappakurichchi, India, 10.8137, 78.7481 Oak Forest, United States, 41.6054, -87.7527 Upper Dublin, United States, 40.1502, -75.1813 Zhongnan, China, 19.1476, 110.4695 Pamidi, India, 14.9500, 77.5833 Douglas, Ireland, 51.8744, -8.4350 Idigny, Benin, 7.4833, 2.7000 Miracema, Brazil, -21.4119, -42.1969 Kadambanad, India, 9.1167, 76.6833 Lukula, Congo (Kinshasa), -5.4000, 12.9333 Zasechnoye, Russia, 53.1142, 45.0601 Kararan, India, 30.7720, 76.7959 San Luis Jilotepeque, Guatemala, 14.6500, -89.7333 Shumerlya, Russia, 55.5333, 46.3833 Plum, United States, 40.5024, -79.7495 Kizilcahamam, Turkey, 40.4697, 32.6506 Simav, Turkey, 39.0833, 28.9833 Palm Springs, United States, 26.6348, -80.0969 Susquehanna, United States, 40.3111, -76.8699 Areraj, India, 26.5527, 84.6726 Madattukkulam, India, 10.5587, 77.3660 Kalikavu, India, 11.1720, 76.3211 Benicia, United States, 38.0725, -122.1526 Haverhill, United Kingdom, 52.0800, 0.4400 Miki, Japan, 34.2667, 134.1333 Feidh el Botma, Algeria, 34.5278, 3.7819 Gursarai, India, 25.6200, 79.1800 Punch, India, 33.7703, 74.0925 Scicli, Italy, 36.7914, 14.7025 Taungup, Burma, 18.8500, 94.2333 Bergerac, France, 44.8500, 0.4800 Woodburn, United States, 45.1472, -122.8603 Nsanje, Malawi, -16.9167, 35.2667 Xima, China, 37.9764, 114.6258 Grootfontein, Namibia, -19.5658, 18.1036 Bridgeton, United States, 39.4286, -75.2281 Caninde de Sao Francisco, Brazil, -9.6419, -37.7878 Majagua, Cuba, 21.9244, -78.9906 Stalybridge, United Kingdom, 53.4834, -2.0400 Vadippatti, India, 10.0843, 77.9634 Kalispell, United States, 48.2153, -114.3274 Tunapuna, Trinidad and Tobago, 10.6333, -61.3833 Bankapur, India, 14.9230, 75.2622 Shencottah, India, 8.9733, 77.2464 Calpe, Spain, 38.6444, 0.0461 Alitagtag, Philippines, 13.8650, 121.0063 Santa Margarita, Philippines, 12.0378, 124.6578 Bozyazi, Turkey, 36.1000, 32.9667 Labrador, Philippines, 16.0339, 120.1392 Wesselsbron, South Africa, -27.8500, 26.3667 Ban Phonla Krang, Thailand, 15.0199, 102.0123 Khanabad, Afghanistan, 36.6831, 69.1636 Bamessi, Cameroon, 6.0333, 10.5792 Magilampupuram, India, 8.8408, 78.1497 Uchquduq Shahri, Uzbekistan, 42.1567, 63.5556 Fortul, Colombia, 6.7922, -71.7756 Tuvur, India, 11.1000, 76.2833 Bolton, Canada, 43.8833, -79.7333 Villeparisis, France, 48.9503, 2.6025 Srinivaspur, India, 13.3378, 78.2122 Garbagnate Milanese, Italy, 45.5771, 9.0814 Trikkunnapuzha, India, 9.2500, 76.4000 Paracuaro, Mexico, 19.1467, -102.2194 Mirassol d'Oeste, Brazil, -15.6750, -58.0958 Margate, South Africa, -30.8500, 30.3667 Cenon, France, 44.8578, -0.5317 South Portland, United States, 43.6310, -70.2895 Camas, United States, 45.6005, -122.4304 Solanea, Brazil, -6.7778, -35.6969 Tamayo, Dominican Republic, 18.4000, -71.2000 Sannois, France, 48.9722, 2.2578 Vernon Hills, United States, 42.2340, -87.9608 Santa Maria de Jesus, Guatemala, 14.4933, -90.7094 Selm, Germany, 51.6833, 7.4833 Qarah Zia' od Din, Iran, 38.8900, 45.0283 `Abasan al Kabirah, Gaza Strip, 31.3191, 34.3401 Thatha, India, 25.4988, 86.5908 Agia Varvara, Greece, 38.0000, 23.6500 Tlaxcoapan, Mexico, 20.0953, -99.2200 Mahina, Mali, 13.2964, -10.6489 Gadhada, India, 21.9700, 71.5700 Bidur, Nepal, 27.8961, 85.1456 Meppayyur, India, 11.5167, 75.7000 Magarao, Philippines, 13.6619, 123.1903 Goianinha, Brazil, -6.2669, -35.2100 Malitbog, Philippines, 8.5361, 124.8808 Ewa Gentry, United States, 21.3344, -158.0262 Douar Oulad Aj-jabri, Morocco, 32.2567, -6.7839 Cabot, United States, 34.9766, -92.0274 Lutz, United States, 28.1396, -82.4467 Batavia, United States, 41.8479, -88.3109 Hukumati Baghran, Afghanistan, 33.0669, 65.0917 Shoreview, United States, 45.0842, -93.1358 Keystone, United States, 28.1312, -82.5999 Soron, India, 27.8800, 78.7500 Santa Maria Ixhuatan, Guatemala, 14.1833, -90.2667 Alattur, India, 10.6481, 76.5383 Palm River-Clair Mel, United States, 27.9239, -82.3791 Troy, United States, 40.0437, -84.2186 Cangas, Spain, 42.2642, -8.7819 Burntwood, United Kingdom, 52.6831, -1.9200 Miacatlan, Mexico, 18.7722, -99.3547 Saguiaran, Philippines, 8.0300, 124.2700 Bhuban, India, 20.8820, 85.8333 Morales, Colombia, 2.7603, -76.6339 Los Cordobas, Colombia, 8.9000, -76.3667 Circasia, Colombia, 4.6167, -75.6333 Kiruna, Sweden, 67.8500, 20.2166 Ronse, Belgium, 50.7500, 3.6000 Wanlaweyn, Somalia, 2.6185, 44.8938 Gwanda, Zimbabwe, -20.9389, 29.0186 Horsham, United States, 40.1993, -75.1665 Sapian, Philippines, 11.4939, 122.6047 Qaha, Egypt, 30.2833, 31.2000 Mamidalapadu, India, 15.8310, 78.0500 Kotovsk, Russia, 52.5833, 41.5167 Lamego, Portugal, 41.0975, -7.8100 Pirenopolis, Brazil, -15.8526, -48.9589 Miyanaga, Japan, 33.7236, 130.6675 Piracaia, Brazil, -23.0539, -46.3581 Shelek, Kazakhstan, 43.5972, 78.2511 Shangxiao, China, 35.4969, 107.4914 Wellington, India, 11.3655, 76.7844 Pitangui, Brazil, -19.6828, -44.8900 Quarrata, Italy, 43.8475, 10.9833 Turrialba, Costa Rica, 9.8897, -83.6807 Nediyanad, India, 11.1297, 76.0021 Ipu, Brazil, -4.3257, -40.7103 San Juan, Philippines, 17.7431, 120.4583 Ambodiangezoka, Madagascar, -14.5969, 49.5103 Itamaraca, Brazil, -7.7514, -34.8276 Al Qutayfah, Syria, 33.7385, 36.6007 Espiye, Turkey, 40.9500, 38.7333 Sacramento, Brazil, -19.8650, -47.4400 Birine, Algeria, 35.6333, 3.2167 Wheeling, United States, 40.0752, -80.6951 Granite City, United States, 38.7296, -90.1268 Nannamukku, India, 10.7167, 76.0333 Piest'any, Slovakia, 48.5842, 17.8336 Talaja, India, 21.3500, 72.0500 Bien Unido, Philippines, 10.1300, 124.3800 Samayac, Guatemala, 14.5833, -91.4667 Muhlacker, Germany, 48.9500, 8.8394 Achern, Germany, 48.6333, 8.0667 Highbury, United Kingdom, 51.5520, -0.0970 Kuppadi, India, 11.6792, 76.2625 Gediz, Turkey, 38.9939, 29.3914 Champs-Sur-Marne, France, 48.8529, 2.6027 Mizque, Bolivia, -17.9333, -65.3167 Bretigny-sur-Orge, France, 48.6114, 2.3059 Dalsingh Sarai, India, 25.6680, 85.8364 Bugho, Philippines, 10.8000, 124.9300 Suphan Buri, Thailand, 14.4675, 100.1169 Kirovsk, Ukraine, 48.6375, 38.6428 Holubivske, Ukraine, 48.6333, 38.6500 Las Flores, Argentina, -36.0139, -59.1000 Frias, Argentina, -28.6333, -65.1333 San Pablo, Philippines, 7.6578, 123.4597 Chettipalaiyam, India, 11.1667, 77.3350 Rama, Israel, 32.8511, 35.3386 Manjacaze, Mozambique, -24.7117, 33.8828 San Felipe, Guatemala, 14.6206, -91.5961 Silao, India, 25.0836, 85.4280 Sibi, Mali, 12.3756, -8.3350 Rajgarh, India, 27.2360, 76.6220 Buldan, Turkey, 38.0450, 28.8306 Manihari, India, 25.3500, 87.6300 Cuajinicuilapa, Mexico, 16.4717, -98.4153 Kupiansk, Ukraine, 49.7167, 37.5833 Vilyeyka, Belarus, 54.4972, 26.9111 Hennigsdorf, Germany, 52.6378, 13.2036 Horn Lake, United States, 34.9512, -90.0501 Lauri, India, 25.1396, 80.0011 Propria, Brazil, -10.2111, -36.8403 Toribio, Colombia, 2.9581, -76.2714 Gross-Gerau, Germany, 49.9192, 8.4850 Ula, Turkey, 37.1036, 28.4147 Dar Chioukh, Algeria, 34.9000, 3.4833 Baytunya, West Bank, 31.8966, 35.1705 Jaguarao, Brazil, -32.5658, -53.3758 Chuanliaocun, China, 28.2582, 120.2118 Etampes, France, 48.4343, 2.1615 Newton Mearns, United Kingdom, 55.7716, -4.3347 Pantar, Philippines, 8.0667, 124.2667 Wieliczka, Poland, 49.9894, 20.0661 San Benito Abad, Colombia, 8.9333, -75.0333 Sidi Akkacha, Algeria, 36.4667, 1.3000 Ghataro Chaturbhuj, India, 25.8146, 85.1862 Voinjama, Liberia, 8.4167, -9.7500 Heiligenhaus, Germany, 51.3167, 6.9667 Okuta, Nigeria, 9.2199, 3.2005 Sao Gabriel, Brazil, -19.0169, -40.5358 Nova Esperanca, Brazil, -23.1839, -52.2050 Ratau, Lesotho, -29.3828, 27.7892 Macrohon, Philippines, 10.0797, 124.9431 Lauaan, Philippines, 11.1429, 122.0417 Porto da Folha, Brazil, -9.9169, -37.2778 Casiguran, Philippines, 16.2800, 122.1200 Gioia del Colle, Italy, 40.8000, 16.9333 West Islip, United States, 40.7041, -73.2954 Iesolo, Italy, 45.5331, 12.6448 Tarui, Japan, 35.3664, 136.5381 Plainview, Philippines, 14.5777, 121.0337 Shahganj, India, 26.0560, 82.6820 Nallihan, Turkey, 40.1836, 31.3506 San Alberto, Colombia, 7.7525, -73.3892 Lanquin, Guatemala, 15.5667, -89.9667 Manasa, India, 24.4800, 75.1500 Dasuya, India, 31.8168, 75.6531 Perumbalam, India, 10.8311, 76.0430 Superior, United States, 46.6941, -92.0823 Echemmaia Est, Morocco, 32.0786, -8.6325 Nyamti, India, 14.1400, 75.5600 Edwardsville, United States, 38.7922, -89.9874 Marysville, United States, 40.2279, -83.3595 Zeboudja, Algeria, 36.3500, 1.4333 Mantena, Brazil, -18.7819, -40.9800 Sainte-Therese, Canada, 45.6333, -73.8500 Deogarh, India, 21.5383, 84.7334 Ituporanga, Brazil, -27.4139, -49.6008 Kantabanji, India, 20.4671, 82.9204 Ban Wang Kalang, Thailand, 15.1505, 98.4525 Nacimiento, Chile, -37.5000, -72.6667 Neckarsulm, Germany, 49.1917, 9.2246 Aleksandrovac, Serbia, 43.4553, 21.0514 Jenks, United States, 35.9981, -95.9736 Tumwater, United States, 46.9891, -122.9175 Dois Corregos, Brazil, -22.3661, -48.3803 La Union, Chile, -40.2833, -73.0833 Hennaya, Algeria, 34.9500, -1.3667 Sanger, United States, 36.6990, -119.5575 Bubong, Philippines, 8.0200, 124.4800 Ahmadabad, India, 25.3019, 87.7938 San Andres de Giles, Argentina, -34.4333, -59.4333 Giarre, Italy, 37.7297, 15.1844 Qingshan, China, 27.3500, 105.0200 Rosemount, United States, 44.7466, -93.0661 East Hempfield, United States, 40.0825, -76.3831 Clarence-Rockland, Canada, 45.4833, -75.2000 Uchinada, Japan, 36.6535, 136.6454 Grigny, France, 48.6562, 2.3849 Paramus, United States, 40.9455, -74.0712 Charata, Argentina, -27.2167, -61.2000 Karumandi Chellipalaiyam, India, 11.3019, 77.5860 Conceicao da Barra, Brazil, -18.5928, -39.7319 Sebes, Romania, 45.9600, 23.5700 Al Karnak, Egypt, 25.7184, 32.6581 Capao do Leao, Brazil, -31.7628, -52.4839 Xincun, China, 21.6657, 111.4024 Timbiras, Brazil, -4.2550, -43.9408 Cheadle Hulme, United Kingdom, 53.3761, -2.1897 Sokoura, Mali, 13.5025, -3.7661 Madalum, Philippines, 7.8530, 124.1190 Wall, United States, 40.1674, -74.0974 Kimovsk, Russia, 53.9667, 38.5333 Auburn, United States, 42.9338, -76.5685 Kayapa, Philippines, 16.3583, 120.8861 Langdu, China, 23.3250, 102.2050 Venice, United States, 27.1184, -82.4137 Apam, Ghana, 5.2790, -0.7397 Owatonna, United States, 44.0912, -93.2312 Agua Preta, Brazil, -8.7000, -35.3500 Quilali, Nicaragua, 13.5667, -86.0333 Randolph, United States, 40.8434, -74.5819 El Monte, Chile, -33.6833, -71.0167 Gordes, Turkey, 38.9328, 28.2903 Mabini, Philippines, 16.0697, 119.9400 Wete, Tanzania, -5.0567, 39.7281 Perez, Argentina, -33.0000, -60.7667 Lido di Iesolo, Italy, 45.5020, 12.6325 Makubetsu, Japan, 42.9167, 143.3500 Maski, India, 15.9581, 76.6569 Tamarakulam, India, 9.4833, 76.5000 Caboolture, Australia, -27.0850, 152.9513 Panchla, India, 22.5400, 88.1400 Tortona, Italy, 44.8942, 8.8656 Santa Josefa, Philippines, 7.9800, 126.0300 Tecolutla, Mexico, 20.4797, -97.0100 Peniche, Portugal, 39.3633, -9.3792 Mandi, India, 31.7069, 76.9317 Mavelikara, India, 9.2670, 76.5500 Mauganj, India, 24.6800, 81.8800 Selibaby, Mauritania, 15.1670, -12.1833 Aschersleben, Germany, 51.7500, 11.4667 Newton Aycliffe, United Kingdom, 54.6200, -1.5800 Lauf, Germany, 49.5103, 11.2772 Beohari, India, 24.0242, 81.3783 Madruga, Cuba, 22.9114, -81.8561 Nadbai, India, 27.2300, 77.2000 Nordenham, Germany, 53.5000, 8.4667 Droitwich, United Kingdom, 52.2670, -2.1530 Ouaoula, Morocco, 31.8667, -6.7500 Dinokana, South Africa, -25.4470, 25.8630 Zemmouri, Algeria, 36.7833, 3.6000 Ajka, Hungary, 47.1006, 17.5522 Forest Grove, United States, 45.5243, -123.1097 La Prairie, Canada, 45.4200, -73.5000 Gorlice, Poland, 49.6547, 21.1597 Del Gallego, Philippines, 13.9233, 122.5961 Blenheim, New Zealand, -41.5167, 173.9500 Kaltan, Russia, 53.5167, 87.2833 Jarocin, Poland, 51.9667, 17.5000 Estoril, Portugal, 38.7057, -9.3977 Dinanagar, India, 32.1500, 75.4667 Cajuru, Brazil, -21.2753, -47.3042 Jinju, China, 22.7073, 111.8223 Virakeralam, India, 11.0077, 76.9126 Ouled Mimoun, Algeria, 34.9000, -1.0333 Rangia, India, 26.4700, 91.6300 Balboa, Colombia, 2.0436, -77.2197 East Grinstead, United Kingdom, 51.1286, -0.0144 Elakadu, India, 8.9009, 76.8357 Lunel, France, 43.6778, 4.1361 Ashton in Makerfield, United Kingdom, 53.4870, -2.6410 San Jose, Philippines, 10.0083, 125.5889 Zottegem, Belgium, 50.8667, 3.8000 Carolina Forest, United States, 33.7651, -78.9130 Bombo, Uganda, 0.5778, 32.5450 Gundlupet, India, 11.8000, 76.6800 Dongen, Netherlands, 51.6258, 4.9433 Elk River, United States, 45.3314, -93.5670 Nazare, Brazil, -13.0350, -39.0139 Lagindingan, Philippines, 8.5800, 124.4500 Vicencia, Brazil, -7.6569, -35.3269 Reoti, India, 25.8500, 84.3833 Jaltenco, Mexico, 19.7511, -99.0931 Panchanandapur, India, 24.9339, 87.9761 Pandag, Philippines, 6.7411, 124.7827 Yuanyangzhen, China, 34.7847, 104.7762 Poldokhtar, Iran, 33.1489, 47.7164 Wyszkow, Poland, 52.5928, 21.4584 Elmira, United States, 42.0938, -76.8097 Elancourt, France, 48.7847, 1.9589 Tougan, Burkina Faso, 13.0667, -3.0667 Sapouy, Burkina Faso, 11.5544, -1.7736 Ilha Solteira, Brazil, -20.4272, -51.3436 Vogosca, Bosnia and Herzegovina, 43.9000, 18.3500 Bagh-e Malek, Iran, 31.5247, 49.8869 Pensilvania, Colombia, 5.5000, -75.0833 Bingen am Rhein, Germany, 49.9667, 7.9000 Lichtenburg, South Africa, -26.1500, 26.1667 Duptiair, Bangladesh, 23.9925, 89.7973 Eloi Mendes, Brazil, -21.6100, -45.5650 Bussy-Saint-Georges, France, 48.8422, 2.6983 Balakliia, Ukraine, 49.4658, 36.8678 Cheranallur, India, 10.1807, 76.4792 Parit Buntar, Malaysia, 5.1267, 100.4932 Dolo Odo, Ethiopia, 4.1667, 42.0667 Tehuipango, Mexico, 18.5167, -97.0500 Navabad, Tajikistan, 38.5667, 68.5167 Caririacu, Brazil, -7.0419, -39.2839 Clydebank, United Kingdom, 55.8997, -4.4006 San Pablo, Philippines, 17.4478, 121.7950 Ulaangom, Mongolia, 49.9833, 92.0667 Petrovsk, Russia, 52.3167, 45.3833 Ubaidullahganj, India, 22.9983, 77.5862 Werota, Ethiopia, 11.9167, 37.7000 Siquinala, Guatemala, 14.3000, -90.9667 La Garde, France, 43.1256, 6.0108 Woodstock, United States, 42.3096, -88.4353 Amaliada, Greece, 37.8000, 21.3500 Ibotirama, Brazil, -12.1850, -43.2208 Leland, United States, 34.2042, -78.0279 Cotoca, Bolivia, -17.7536, -62.9967 Portishead, United Kingdom, 51.4840, -2.7626 Visby, Sweden, 57.6290, 18.3071 Koelwar, India, 25.5805, 84.7975 Eureka, United States, 40.7943, -124.1564 Khadbari, Nepal, 27.3667, 87.2167 La Ceiba, Venezuela, 9.4764, -71.0556 Batalha, Brazil, -4.0239, -42.0778 Nuevo Arraijan, Panama, 8.9200, -79.7200 South Pasadena, United States, 34.1103, -118.1573 Walpole, United States, 42.1464, -71.2555 Weiterstadt, Germany, 49.9000, 8.6000 Aru, Congo (Kinshasa), 2.8617, 30.8333 Baden, Austria, 48.0075, 16.2344 Az Zabadani, Syria, 33.7249, 36.1005 Fagaras, Romania, 45.8447, 24.9742 Narasannapeta, India, 18.4167, 84.0500 Rasiari, India, 26.0464, 86.3471 Obiaruku, Nigeria, 5.8500, 6.1500 South Salt Lake, United States, 40.7057, -111.8986 Beramanja, Madagascar, -13.3430, 48.8767 Pereyaslav-Khmel'nyts'kyy, Ukraine, 50.0650, 31.4450 Saint-Bruno-de-Montarville, Canada, 45.5333, -73.3500 Kaboila, Mali, 11.2139, -5.6339 Yapacani, Bolivia, -17.4017, -63.9098 Kaisariani, Greece, 37.9683, 23.7583 As Sanamayn, Syria, 33.0719, 36.1832 Yany Kapu, Ukraine, 45.9675, 33.8003 Ora, Japan, 36.2524, 139.4623 Lisen, Czechia, 49.2075, 16.6861 Bouansa, Congo (Brazzaville), -4.2178, 13.7628 Wilmslow, United Kingdom, 53.3250, -2.2390 Teustepe, Nicaragua, 12.4167, -85.8000 Laranjal Paulista, Brazil, -23.0118, -47.8657 Semirom, Iran, 31.4094, 51.5736 Alboraya, Spain, 39.5000, -0.3522 Zirndorf, Germany, 49.4500, 10.9500 Holbrook, United States, 40.7944, -73.0700 Zhaicun, China, 22.6174, 112.6275 Bayanhongor, Mongolia, 46.1944, 100.7181 Plainview, United States, 40.7832, -73.4732 Carbonia, Italy, 39.1668, 8.5220 Khenichet-sur Ouerrha, Morocco, 34.4333, -5.6667 Nyaungdon, Burma, 17.0461, 95.6374 Midland, Canada, 44.7500, -79.8833 Hercules, United States, 38.0064, -122.2564 Rionegro, Colombia, 7.2642, -73.1494 Infanta, Philippines, 15.8208, 119.9083 Mirganj, India, 26.3638, 84.3640 Mel Bhuvanagiri, India, 11.4380, 79.6328 Paz de Ariporo, Colombia, 5.8833, -71.9000 Wenquan, China, 19.2439, 110.4050 Kudlu, India, 12.5260, 74.9687 San Giovanni Rotondo, Italy, 41.7000, 15.7333 Lamut, Philippines, 16.6517, 121.2178 Poro, Philippines, 10.6290, 124.4070 Colonia del Sacramento, Uruguay, -34.4714, -57.8442 Buesaco, Colombia, 1.3833, -77.1667 Lainate, Italy, 45.5667, 9.0333 Lockport, United States, 41.5906, -88.0293 Fleetwood, United Kingdom, 53.9220, -3.0120 Ganjing, China, 35.3338, 110.0955 Tekkalakote, India, 15.5348, 76.8785 Chivasso, Italy, 45.1910, 7.8872 Willebroek, Belgium, 51.0667, 4.3667 Kalfou, Cameroon, 10.2833, 14.9333 Rancho Grande, Nicaragua, 13.2536, -85.5528 Burlington, United States, 42.5022, -71.2027 Wasco, United States, 35.5938, -119.3671 Muniz, Argentina, -34.5333, -58.7000 Zhihe, China, 36.7624, 110.6230 Gedera, Israel, 31.8139, 34.7783 Talikota, India, 16.4800, 76.3200 Londonderry, United States, 42.8796, -71.3873 Novelda, Spain, 38.3850, -0.7680 Sograha, India, 25.4798, 85.9992 Pojuca, Brazil, -12.4260, -38.3267 Canas, Costa Rica, 10.4457, -85.0992 Et Tira, Israel, 32.2328, 34.9503 Iradan, Kyrgyzstan, 40.2667, 72.1000 Vadakkanandal, India, 11.7739, 78.8666 Buddayyakota, India, 13.8196, 78.1729 Kottakota, India, 13.6592, 78.2467 Guruzala, India, 16.5800, 79.5700 Aurillac, France, 44.9261, 2.4406 Gradignan, France, 44.7725, -0.6156 Wilsonville, United States, 45.3109, -122.7702 Elkridge, United States, 39.1941, -76.7428 Fairland, United States, 39.0803, -76.9527 Trussville, United States, 33.6405, -86.5815 Phetchaburi, Thailand, 13.1119, 99.9458 Windsor, United States, 38.5422, -122.8089 Mota, Ethiopia, 11.0833, 37.8667 Loutete, Congo (Brazzaville), -4.2972, 13.8556 Rosario de la Frontera, Argentina, -25.8000, -64.9667 Flemalle-Haute, Belgium, 50.6011, 5.4628 Zagora, Morocco, 30.3306, -5.8381 Ketrzyn, Poland, 54.0833, 21.3833 Puerto Varas, Chile, -41.3167, -72.9833 Budhlada, India, 29.9300, 75.5700 Shuanghe, China, 33.0320, 109.6099 Montemor-o-Velho, Portugal, 40.1725, -8.6847 Sant'Anastasia, Italy, 40.8667, 14.4000 Tavira, Portugal, 37.1309, -7.6506 Austin, United States, 43.6721, -92.9784 Sanchez-Mira, Philippines, 18.5611, 121.2344 Jirwa, India, 26.0064, 86.8604 Mankachar, India, 25.5300, 89.8700 Manito, Philippines, 13.1235, 123.8693 Lubbecke, Germany, 52.3081, 8.6231 Iskandar, Uzbekistan, 41.5581, 69.7047 Curuca, Brazil, -0.7339, -47.8550 East Chicago, United States, 41.6469, -87.4545 Mortsel, Belgium, 51.1667, 4.4667 Beuningen, Netherlands, 51.8667, 5.7667 Lindau, Germany, 47.5458, 9.6833 Ives Estates, United States, 25.9632, -80.1830 San Ignacio, Belize, 17.1588, -89.0696 Mesagne, Italy, 40.5667, 17.8000 Ipsala, Turkey, 40.9167, 26.3833 Frankfort, South Africa, -27.2833, 28.5167 Dum Duma, India, 27.5688, 95.5566 Suar, India, 29.0270, 79.0570 Guduru, India, 15.7750, 77.8070 Ciempozuelos, Spain, 40.1592, -3.6183 Ringas, India, 27.3700, 75.5700 Kaous, Algeria, 36.7702, 5.8136 Oum Hadjer, Chad, 13.2944, 19.6914 Cifuentes, Cuba, 22.6208, -80.0661 Ouled Rahmoun, Algeria, 36.1803, 6.7050 Rezekne, Latvia, 56.5067, 27.3308 Dongfeng, China, 22.2479, 112.3794 Bijbiara, India, 33.7938, 75.1070 Harsewinkel, Germany, 51.9667, 8.2331 Pacasmayo, Peru, -7.4003, -79.5700 Wum, Cameroon, 6.3833, 10.0667 Oliva, Spain, 38.9194, -0.1211 Santiago Papasquiaro, Mexico, 25.0439, -105.4192 Amnat Charoen, Thailand, 15.8500, 104.6333 Baruni, India, 25.4751, 85.9681 Vadakku Viravanallur, India, 8.6979, 77.5192 Montichiari, Italy, 45.4161, 10.3917 Gourma Rharous, Mali, 16.8800, -1.9239 Tuxpan, Mexico, 21.8667, -105.4500 Huaquechula, Mexico, 18.7667, -98.5500 Itapuranga, Brazil, -15.5619, -49.9489 Terlizzi, Italy, 41.1333, 16.5500 Kuyucak, Turkey, 37.9153, 28.4592 Tono, Japan, 39.3279, 141.5334 Desamparados, Costa Rica, 10.0315, -84.1877 Armentieres, France, 50.6881, 2.8811 Anosipatrana, Madagascar, -18.9258, 47.4999 Campos Gerais, Brazil, -21.2350, -45.7589 Misserghin, Algeria, 35.6167, -0.7333 Camanducaia, Brazil, -22.7550, -46.1450 Mzimba, Malawi, -11.9000, 33.6000 Tianyingcun, China, 29.9197, 119.4139 Tianyingji, China, 29.9167, 119.4167 Sierra Bullones, Philippines, 9.8200, 124.2800 Elangunnapuzha, India, 10.0167, 76.2167 Phulera, India, 26.8740, 75.2417 Requinoa, Chile, -34.2786, -70.8117 Erice, Italy, 38.0375, 12.5875 Terdal, India, 16.5000, 75.0500 Oxford, United States, 34.3627, -89.5336 Tholen, Netherlands, 51.5322, 4.2206 Konobougou, Mali, 12.9169, -6.7578 Conway, United States, 33.8401, -79.0431 Dengjiazhuang, China, 37.7051, 115.7883 Halemba, Poland, 50.2378, 18.8633 Unterhaching, Germany, 48.0658, 11.6100 Tralee, Ireland, 52.2675, -9.6962 Kathu, Thailand, 7.9090, 98.3332 Chellalat el Adhaouara, Algeria, 35.9403, 3.4139 Dancagan, Philippines, 7.6119, 125.0028 Ridgewood, United States, 40.9821, -74.1127 Mahates, Colombia, 10.2333, -75.1833 Saumur, France, 47.2600, -0.0769 Thetford Mines, Canada, 46.1000, -71.3000 Odemira, Portugal, 37.5833, -8.6333 Tianwei, Taiwan, 23.9023, 120.5214 Alagoa Grande, Brazil, -7.0822, -35.6000 La Maquina, Guatemala, 14.3000, -91.5667 Bad Honnef am Rhein, Germany, 50.6450, 7.2269 El Hadjar, Algeria, 36.8000, 7.7333 Nansang, Burma, 20.8889, 97.7361 Casillas, Guatemala, 14.4167, -90.2500 Mahitsy, Madagascar, -18.7464, 47.3439 Emmeloord, Netherlands, 52.7097, 5.7508 Dardoq, Uzbekistan, 40.8156, 72.8311 Gamboma, Congo (Brazzaville), -1.8711, 15.8781 Upper Moreland, United States, 40.1572, -75.1021 Kulmbach, Germany, 50.1000, 11.4333 Vertou, France, 47.1689, -1.4697 Chuimatan, China, 35.7166, 102.8771 Buenavista, Philippines, 13.2500, 121.9500 Burgos, Philippines, 17.0700, 121.7000 Medina, United States, 41.1358, -81.8695 North Tustin, United States, 33.7636, -117.7947 Tarauaca, Brazil, -8.1608, -70.7658 San Juan Atitan, Guatemala, 15.4333, -91.6333 Renigunta, India, 13.6500, 79.5200 Bangzha, China, 24.8333, 104.6667 Barra da Estiva, Brazil, -13.6258, -41.3269 Hovd, Mongolia, 48.0042, 91.6406 Bajina Basta, Serbia, 43.9731, 19.5597 Haymana, Turkey, 39.4311, 32.4956 Cave Spring, United States, 37.2254, -80.0072 Kiskunhalas, Hungary, 46.4319, 19.4883 Idhna, West Bank, 31.5587, 34.9744 Sandi, India, 27.3000, 79.9500 Bresso, Italy, 45.5333, 9.1833 Chanhassen, United States, 44.8546, -93.5621 Brasileia, Brazil, -11.0100, -68.7478 Ambatomborona, Madagascar, -19.3011, 47.1573 Malaimbandy, Madagascar, -20.3463, 45.5964 Mahambo, Madagascar, -17.4914, 49.4498 Ambatofotsy, Madagascar, -21.7620, 47.4894 Tsarazaza, Madagascar, -20.1333, 47.2333 Poytug`, Uzbekistan, 40.9000, 72.2500 Majiadiancun, China, 39.9672, 123.8753 Franklin, United States, 39.4948, -86.0544 Sinait, Philippines, 17.8667, 120.4583 Winona, United States, 44.0505, -91.6684 Halfmoon, United States, 42.8640, -73.7275 Lakshmicharipara, Bangladesh, 22.7937, 91.9160 Gahmar, India, 25.4970, 83.8220 Gaoya, China, 36.5049, 104.9920 Dehgolan, Iran, 35.2778, 47.4175 Rich, Morocco, 32.2583, -4.5056 Mangaldai, India, 26.4300, 92.0300 Bom Jesus dos Perdoes, Brazil, -23.1350, -46.4653 Montreux, Switzerland, 46.4350, 6.9125 Dharmapuram, India, 8.1203, 77.3890 Istmina, Colombia, 5.1667, -76.6833 Tiruppattur, India, 10.1300, 78.6200 Naduvannur, India, 11.4833, 75.7667 San Juan, Costa Rica, 9.9609, -84.0731 Curtea de Arges, Romania, 45.1392, 24.6792 Rampur, India, 26.2126, 87.2491 Maracana, Brazil, -0.7650, -47.4500 Kamo, Japan, 37.6663, 139.0402 Labytnangi, Russia, 66.6572, 66.4183 Santa Lucia, Philippines, 17.1222, 120.4494 Binidayan, Philippines, 7.8000, 124.1700 Bobon, Philippines, 12.5200, 124.5700 Norfolk, United States, 42.0324, -97.4217 Florence, United States, 33.0590, -111.4209 Santa Perpetua de Moguda, Spain, 41.5375, 2.1819 Golkoy, Turkey, 40.6875, 37.6178 Kuna, United States, 43.4880, -116.3933 Giussano, Italy, 45.7000, 9.2167 Otake, Japan, 34.2378, 132.2222 Le Grand-Quevilly, France, 49.4072, 1.0531 Giyani, South Africa, -23.3100, 30.7064 Chintalapudi, India, 17.0417, 80.5901 Udomlya, Russia, 57.8833, 35.0000 Surmene, Turkey, 40.9142, 40.1125 Gressier, Haiti, 18.5409, -72.5268 Pando, Uruguay, -34.7167, -55.9583 Lodi, United States, 40.8784, -74.0814 Mathibestad, South Africa, -25.2760, 28.1780 Montgomery, United States, 40.2411, -75.2318 Fish Hawk, United States, 27.8511, -82.2164 Socorro, Philippines, 9.6180, 125.9660 Dolores, Argentina, -36.3167, -57.6667 Sao Joaquim, Brazil, -28.2939, -49.9319 Boscoreale, Italy, 40.7750, 14.4750 Santa Ana, Colombia, 9.3190, -74.5700 Bournville, United Kingdom, 52.4299, -1.9355 Friedrichsdorf, Germany, 50.2556, 8.6397 Masrakh, India, 26.1054, 84.8026 San Sebastian Coatan, Guatemala, 15.7333, -91.5667 Putignano, Italy, 40.8492, 17.1225 Sidi Abdel Aziz, Morocco, 33.0494, -8.6886 Eaubonne, France, 48.9922, 2.2806 Gembloux, Belgium, 50.5610, 4.6970 Mannachchanellur, India, 10.9078, 78.7022 Maevatanana, Madagascar, -16.9470, 46.8292 Kostomuksha, Russia, 64.5833, 30.6000 Krishnapuram, India, 9.1500, 76.5000 Dano, Burkina Faso, 11.1436, -3.0628 Jaynagar-Majilpur, India, 22.1752, 88.4201 Cesenatico, Italy, 44.2012, 12.4007 Azacualpa, Honduras, 14.7167, -88.1000 El Grullo, Mexico, 19.8000, -104.2000 San Juan de Alicante, Spain, 38.4014, -0.4367 Hjorring, Denmark, 57.4663, 9.9889 Tubize, Belgium, 50.6930, 4.2047 Finote Selam, Ethiopia, 10.7000, 37.2667 Yanaul, Russia, 56.2833, 54.9333 Colleyville, United States, 32.8913, -97.1486 Schleswig, Germany, 54.5186, 9.5653 Haoping, China, 32.5933, 108.6117 San Martin, Colombia, 3.6944, -73.6936 Puerto Escondido, Mexico, 15.8619, -97.0672 Lucenec, Slovakia, 48.3314, 19.6708 El Jicaro, Nicaragua, 13.7167, -86.1333 Milagres, Brazil, -7.3128, -38.9458 Formosa do Rio Preto, Brazil, -11.0478, -45.1928 Gandujie, China, 35.8908, 102.3272 Gilarchat, India, 22.0703, 88.4455 Imperial Beach, United States, 32.5693, -117.1180 Jodhpur, India, 21.8800, 70.0300 Miramas, France, 43.5822, 5.0019 Cavaillon, France, 43.8375, 5.0381 Teniente Primero Manuel Irala Fernandez, Paraguay, -22.8174, -59.5820 El Quetzal, Guatemala, 14.7667, -91.8167 Noicattaro, Italy, 41.0333, 16.9833 Galatina, Italy, 40.1667, 18.1667 Kibeho, Rwanda, -2.6333, 29.5500 Dhrol, India, 22.5700, 70.4200 Omachi, Japan, 36.5030, 137.8511 Sofiyivs'ka Borshchahivka, Ukraine, 50.4114, 30.3692 Xishan, China, 23.0590, 115.5564 Vimercate, Italy, 45.6167, 9.3667 Vesala, India, 12.1620, 75.4956 Jharka, India, 26.3047, 85.6686 Fonte Boa, Brazil, -2.5139, -66.0917 Moscow, United States, 46.7308, -116.9986 Ballenger Creek, United States, 39.3807, -77.4206 Santa Isabel do Rio Negro, Brazil, -0.4139, -65.0192 Perunkalattu, India, 12.9182, 80.0824 Geretsried, Germany, 47.8667, 11.4667 Ban Pa Sak, Thailand, 16.8477, 100.2563 Kotal, India, 31.7570, 76.8729 Port Alfred, South Africa, -33.5917, 26.8875 Gokarn, India, 14.5500, 74.3167 Ciudad Altamirano, Mexico, 18.3472, -100.6531 Triggiano, Italy, 41.0667, 16.9167 Calilabad, Azerbaijan, 39.2042, 48.4958 Dondon, Haiti, 19.5273, -72.2434 Jaszbereny, Hungary, 47.5000, 19.9167 Terrytown, United States, 29.9014, -90.0279 Fort Washington, United States, 38.7339, -77.0069 Artvin, Turkey, 41.1833, 41.8181 El Progreso, Guatemala, 14.3500, -89.8500 Vitez, Bosnia and Herzegovina, 44.1585, 17.7885 Nagai, Japan, 38.1075, 140.0405 Assemini, Italy, 39.2897, 9.0048 Andasibe, Madagascar, -17.3589, 49.0781 Polasara, India, 19.6939, 84.8140 San Vicente de Canete, Peru, -13.0833, -76.4000 Shenley Brook End, United Kingdom, 52.0090, -0.7890 Karkala, India, 13.2000, 74.9830 Key West, United States, 24.5642, -81.7775 Grandview, United States, 38.8802, -94.5227 Lanaken, Belgium, 50.8925, 5.6497 Onda, Spain, 39.9625, -0.2639 Vignola, Italy, 44.4808, 11.0022 Vayakkalattu, India, 8.5285, 77.1035 Consett, United Kingdom, 54.8500, -1.8300 Biarritz, France, 43.4800, -1.5600 Rockaway, United States, 40.9602, -74.4988 Coin, Spain, 36.6667, -4.7500 Raman, India, 29.9504, 74.9619 Derby, United States, 37.5571, -97.2551 Marco, Brazil, -3.1239, -40.1469 Samana, Colombia, 5.5833, -74.9167 Marshfield, United States, 42.1140, -70.7151 Kadamalaikkundu, India, 9.8110, 77.5039 Brunoy, France, 48.6979, 2.5044 Koko, Nigeria, 11.4232, 4.5170 Ladkhed, India, 20.3200, 77.7700 Nechi, Colombia, 8.1000, -74.7833 Kunisakimachi-tsurugawa, Japan, 33.5633, 131.7322 Maintirano, Madagascar, -18.0666, 44.0167 Mungaoli, India, 24.4084, 78.0959 Chhota Udepur, India, 22.3056, 74.0139 Fort Hood, United States, 31.1357, -97.7834 Oulad Yaich, Morocco, 32.4167, -6.3333 Tubay, Philippines, 9.1600, 125.5200 Villanueva de la Serena, Spain, 38.9667, -5.8000 Santo Cristo, Philippines, 14.6603, 121.0300 Warrington, United States, 40.2489, -75.1580 Pura, Philippines, 15.6248, 120.6480 El Cerrito, United States, 37.9196, -122.3025 Temerin, Serbia, 45.4167, 19.8833 Karavaram, India, 8.7127, 76.9524 Conversano, Italy, 40.9667, 17.1167 Koba, India, 21.2844, 72.8763 Arapoti, Brazil, -24.1578, -49.8269 Bishunpur Sundar, India, 26.0579, 86.9833 Seondha, India, 26.1542, 78.7812 Wagrowiec, Poland, 52.8000, 17.2000 Lower Providence, United States, 40.1485, -75.4266 De Witt, United States, 43.0501, -76.0710 Paveh, Iran, 35.0433, 46.3550 Natividad, Philippines, 16.0422, 120.7953 Zakopane, Poland, 49.3000, 19.9500 Rockville Centre, United States, 40.6643, -73.6383 Cherukolattur, India, 11.1881, 75.9173 Staunton, United States, 38.1593, -79.0611 Henin-Beaumont, France, 50.4217, 2.9508 Chinna Salem, India, 11.6342, 78.8741 Talisayan, Philippines, 8.9917, 124.8833 Sebastian, United States, 27.7822, -80.4819 Santa Maria, Philippines, 17.4700, 121.7500 Firmat, Argentina, -33.4500, -61.4833 Brevnov, Czechia, 50.0844, 14.3631 Vorkadi, India, 12.7598, 74.9311 Koper, Slovenia, 45.5500, 13.7333 Coffs Harbour, Australia, -30.3022, 153.1189 San Antonio del Sur, Cuba, 20.0569, -74.8078 Ginan, Japan, 35.3896, 136.7825 Tecax, Mexico, 20.2019, -89.2881 Bema, Mali, 15.0411, -9.3533 Yinajia, China, 26.8333, 105.7000 Felipe Carrillo Puerto, Mexico, 19.5786, -88.0453 Allendale, United States, 42.9845, -85.9499 Arida, Japan, 34.0833, 135.1333 Le Ray, United States, 44.0771, -75.7975 Lourinha, Portugal, 39.2425, -9.3122 Tabina, Philippines, 7.4655, 123.4086 Mpophomeni, South Africa, -29.5670, 30.1820 Bandar-e Deylam, Iran, 30.0550, 50.1653 Mytilini, Greece, 39.1000, 26.5500 Kirkburton, United Kingdom, 53.6100, -1.7030 Ban Piang Luang, Thailand, 19.6826, 98.6260 Guroymak, Turkey, 38.5769, 42.0211 Lincoln, Canada, 43.1300, -79.4300 Klodzko, Poland, 50.4386, 16.6550 Santeramo in Colle, Italy, 40.8000, 16.7667 Tarangnan, Philippines, 11.9000, 124.7500 Nanpingcun, China, 39.8081, 114.0473 An Nazlah, Egypt, 29.3063, 30.6513 Idstein, Germany, 50.2214, 8.2697 Skopin, Russia, 53.8167, 39.5500 Kommunar, Russia, 59.6333, 30.4000 Jardin America, Argentina, -27.0500, -55.2333 Vichy, France, 46.1278, 3.4267 Zhutailing, China, 27.4028, 113.0614 Mogtedo, Burkina Faso, 12.2833, -0.8333 Palm City, United States, 27.1735, -80.2862 Haisyn, Ukraine, 48.8103, 29.3842 Carahue, Chile, -38.7089, -73.1647 Horb am Neckar, Germany, 48.4453, 8.6911 Coulsdon, United Kingdom, 51.3211, -0.1386 Nova Prata, Brazil, -28.7839, -51.6100 Verl, Germany, 51.8831, 8.5167 Diebougou, Burkina Faso, 10.9667, -3.2500 Espigao D'Oeste, Brazil, -11.5247, -61.0128 Safipur, India, 26.7300, 80.3500 Nagod, India, 24.5692, 80.5881 Scandiano, Italy, 44.5925, 10.6878 Ipatovo, Russia, 45.7167, 42.0000 Columbine, United States, 39.5879, -105.0694 Medford, United States, 40.8220, -72.9859 Netapur Tanda, India, 16.8321, 79.4356 Pereira Barreto, Brazil, -20.6383, -51.1092 Malanguan, China, 40.1899, 117.7001 Fenoarivo, Madagascar, -18.9344, 47.4346 Santa Lucia La Reforma, Guatemala, 15.1333, -91.2333 Fort Beaufort, South Africa, -32.7789, 26.6353 Alencon, France, 48.4306, 0.0931 Tosa, Japan, 33.5000, 133.4333 Galt, United States, 38.2698, -121.3004 Batabano, Cuba, 22.7167, -82.2833 Villanueva, Nicaragua, 12.9636, -86.8147 Toin, Japan, 35.0667, 136.6000 Sagara, Japan, 34.6863, 138.1987 Bessemer, United States, 33.3712, -86.9728 Siqba, Syria, 33.5189, 36.3831 Muret, France, 43.4611, 1.3267 Koulamoutou, Gabon, -1.1333, 12.4833 Kanchanaburi, Thailand, 14.0194, 99.5311 Voorschoten, Netherlands, 52.1333, 4.4500 Doba, Chad, 8.6600, 16.8500 Haql, Saudi Arabia, 29.2833, 34.9333 Yolombo, Colombia, 6.5978, -75.0122 Foughala, Algeria, 34.7167, 5.3167 Sao Sebastiao da Boa Vista, Brazil, -1.7178, -49.5408 Altavas, Philippines, 11.5383, 122.4869 Helmstedt, Germany, 52.2281, 11.0106 Polysayevo, Russia, 54.6014, 86.2486 Pace, United States, 30.6188, -87.1667 Phulpur, Bangladesh, 24.9487, 90.2495 Perama, Greece, 37.9667, 23.5667 Nanminda, India, 11.4222, 75.8319 Palma, Mozambique, -10.7833, 40.4833 Kesla, Azerbaijan, 40.3978, 49.8986 Rinteln, Germany, 52.1906, 9.0814 Brilon, Germany, 51.3956, 8.5678 Immokalee, United States, 26.4253, -81.4251 Samut Songkhram, Thailand, 13.4097, 100.0017 Francavilla al Mare, Italy, 42.4181, 14.2919 Newberg, United States, 45.3075, -122.9601 Alegria, Philippines, 9.7243, 123.3402 Busuanga, Philippines, 12.1335, 119.9363 Saint-Ouen-l'Aumone, France, 49.0447, 2.1111 Igaci, Brazil, -9.5369, -36.6336 Starkville, United States, 33.4608, -88.8297 Utena, Lithuania, 55.5000, 25.6000 Kako, India, 25.2259, 85.0642 Farnham, United Kingdom, 51.2150, -0.7990 Inkster, United States, 42.2935, -83.3148 Valdagno, Italy, 45.6500, 11.3000 Migdal Ha`Emeq, Israel, 32.6714, 35.2406 Porto Sant'Elpidio, Italy, 43.2586, 13.7585 Sliedrecht, Netherlands, 51.8222, 4.7744 Vaterstetten, Germany, 48.1050, 11.7706 El Tarf, Algeria, 36.7670, 8.3170 Velenje, Slovenia, 46.3625, 15.1144 Moses Lake, United States, 47.1279, -119.2759 Genet, Ethiopia, 9.0500, 38.5000 Mount Gambier, Australia, -37.8294, 140.7828 Ohringen, Germany, 49.2000, 9.5000 Tarkeshwar, India, 21.0957, 72.8225 Sirumugai, India, 11.3214, 77.0052 South Bradenton, United States, 27.4612, -82.5822 Chainpura, India, 25.5200, 86.3100 Ligang, Taiwan, 22.8011, 120.5070 Nocatee, United States, 30.0927, -81.4095 Cliffside Park, United States, 40.8222, -73.9879 Bilston, United Kingdom, 52.5660, -2.0730 Nagar, India, 27.4247, 77.0995 Happy Valley, United States, 45.4358, -122.5081 Haiwei, China, 19.4261, 108.8145 Villeneuve-la-Garenne, France, 48.9372, 2.3278 Sao Joao Nepomuceno, Brazil, -21.5400, -43.0108 Pszczyna, Poland, 49.9833, 18.9500 Bandiagara, Mali, 14.3500, -3.6111 Kami, Japan, 33.6000, 133.6833 Raghunathpur, India, 23.5500, 86.6700 Kireyevsk, Russia, 53.9333, 37.9333 Vijapur, India, 23.5700, 72.7500 Jericoacoara, Brazil, -2.8000, -40.4833 Xenia, United States, 39.6829, -83.9413 Aracoiaba, Brazil, -4.3708, -38.8139 Abay, Kazakhstan, 49.6311, 72.8539 Ipameri, Brazil, -17.7219, -48.1600 Rottweil, Germany, 48.1681, 8.6247 Niramaruthur, India, 10.9267, 75.9033 Solano, Colombia, 0.6983, -75.2539 New Milton, United Kingdom, 50.7600, -1.6500 Poranki, India, 16.4743, 80.7128 Shahedshahr, Iran, 35.5731, 51.0869 Karayazi, Turkey, 39.7039, 42.1486 Oltiariq, Uzbekistan, 40.3917, 71.4767 Licey al Medio, Dominican Republic, 19.4300, -70.6200 Miranda, Brazil, -20.2408, -56.3778 Obertshausen, Germany, 50.0667, 8.8333 Tougue, Guinea, 11.4400, -11.6700 Tipo-Tipo, Philippines, 6.5300, 122.1700 Falconara Marittima, Italy, 43.6296, 13.3968 Jacutinga, Brazil, -22.2858, -46.6119 Tarpon Springs, United States, 28.1493, -82.7623 Weingarten, Germany, 47.8092, 9.6444 Salor, Uzbekistan, 41.3833, 69.3583 Mar de Ajo, Argentina, -36.7203, -56.6878 Montbeliard, France, 47.5100, 6.8000 Adra, Spain, 36.7478, -3.0161 Ayuquitan, Philippines, 9.4644, 123.2237 Enna, Italy, 37.5667, 14.2667 Lopez Jaena, Philippines, 8.5500, 123.7667 Manyoni, Tanzania, -5.7500, 34.8333 Sankt Wendel, Germany, 49.4667, 7.1667 Nettappakkam, India, 11.8663, 79.6327 Okemos, United States, 42.7057, -84.4135 Roseto degli Abruzzi, Italy, 42.6833, 14.0167 Bhikhi, India, 30.0700, 75.5300 Al `Awwamiyah, Saudi Arabia, 26.5914, 49.9795 Ciying, China, 25.3607, 103.9100 Mimasaka, Japan, 35.0086, 134.1486 Stevens Point, United States, 44.5241, -89.5507 Fujikawaguchiko, Japan, 35.4973, 138.7549 Santa Helena, Brazil, -24.8600, -54.3328 Guacui, Brazil, -20.7758, -41.6789 Tomares, Spain, 37.3764, -6.0458 Oldbury, United Kingdom, 52.5050, -2.0159 Kyonpyaw, Burma, 17.3000, 95.2000 Exeter, United States, 40.3139, -75.8340 Peekskill, United States, 41.2884, -73.9227 Menaceur, Algeria, 36.4920, 2.2208 Wetteren, Belgium, 51.0000, 3.8833 Bungku, Indonesia, -2.5333, 121.9667 Treinta y Tres, Uruguay, -33.2333, -54.3833 Salem, United States, 37.2864, -80.0555 Backa Palanka, Serbia, 45.2500, 19.4000 Hudson, United States, 42.7639, -71.4072 Astorga, Brazil, -23.2328, -51.6658 Sobrado, Brazil, -9.4550, -40.8228 Mimata, Japan, 31.7306, 131.1250 Mannadipattu, India, 11.9842, 79.6321 Salaga, Ghana, 8.5508, -0.5187 Tupaciguara, Brazil, -18.5928, -48.7050 Andalucia, Colombia, 4.1667, -76.1667 Thatcham, United Kingdom, 51.4050, -1.2640 Veenoord, Netherlands, 52.9875, 6.2914 Vistahermosa, Colombia, 3.1239, -73.7514 Mill Creek East, United States, 47.8361, -122.1877 Elassona, Greece, 39.8833, 22.1833 Bilgoraj, Poland, 50.5500, 22.7333 West Whittier-Los Nietos, United States, 33.9759, -118.0689 Agaro, Ethiopia, 7.8558, 36.5858 Bathnaha, India, 26.6433, 85.5747 Bailey's Crossroads, United States, 38.8477, -77.1305 Avon Lake, United States, 41.4944, -82.0159 Unisan, Philippines, 13.8413, 121.9752 Reading, United States, 42.5351, -71.1056 San Pedro Masahuat, El Salvador, 13.5500, -89.0333 Reedley, United States, 36.5988, -119.4471 Sao Jose do Norte, Brazil, -32.0150, -52.0419 Pauri, India, 30.1500, 78.7800 Nittedal, Norway, 60.0731, 10.8722 Tumbao, Philippines, 7.1200, 124.3800 Anage, Brazil, -14.6119, -41.1358 Tres Passos, Brazil, -27.4558, -53.9319 West Chicago, United States, 41.8960, -88.2253 San Jose, Colombia, 1.6967, -78.2453 Rocha, Uruguay, -34.4833, -54.3500 Limonar, Cuba, 22.9561, -81.4086 Kiranur, India, 11.6920, 79.2899 Omigawa, Japan, 35.8500, 140.6167 Northdale, United States, 28.1058, -82.5263 Nyanza, Rwanda, -2.3500, 29.7333 Caloto, Colombia, 3.0333, -76.4167 Longbridge, United Kingdom, 52.3950, -1.9790 Maplewood, United States, 40.7330, -74.2712 Roth, Germany, 49.2461, 11.0911 Armilla, Spain, 37.1500, -3.6167 Leandro N. Alem, Argentina, -27.6000, -55.3333 Castelnau-le-Lez, France, 43.6369, 3.9019 Rouached, Algeria, 36.4583, 6.0397 Nagtipunan, Philippines, 16.2200, 121.6000 Craibas, Brazil, -9.6178, -36.7678 Karpinsk, Russia, 59.7667, 59.9833 Pudsey, United Kingdom, 53.7970, -1.6630 Chengannur, India, 9.3157, 76.6151 Miyaki, Japan, 33.3250, 130.4547 Lamu, Kenya, -2.2620, 40.9197 Demba, Congo (Kinshasa), -5.5000, 22.2667 Jilikul, Tajikistan, 37.4928, 68.5286 Showt, Iran, 39.2197, 44.7722 Aleysk, Russia, 52.5000, 82.7833 Coracao de Jesus, Brazil, -16.6850, -44.3650 Luzilandia, Brazil, -3.4578, -42.3700 Mahwah, United States, 41.0816, -74.1856 Gagarin, Russia, 55.5500, 35.0167 Zhongcun, China, 35.3615, 107.9791 Ellwangen, Germany, 48.9611, 10.1306 Cherbourg, France, 49.6300, -1.6200 Diego Martin, Trinidad and Tobago, 10.7167, -61.5667 De Pere, United States, 44.4308, -88.0785 Nonahi, India, 26.7892, 85.6482 Legnago, Italy, 45.1929, 11.3115 Arriaga, Mexico, 16.2361, -93.8995 Upminster, United Kingdom, 51.5557, 0.2512 Louis Trichardt, South Africa, -23.0500, 29.9000 Llanelli, United Kingdom, 51.6840, -4.1630 Wiehl, Germany, 50.9500, 7.5333 San Miguel, Philippines, 10.0000, 124.3200 Yanyan, China, 24.3240, 116.3142 Ottumwa, United States, 41.0195, -92.4186 Brandon, United States, 32.2778, -89.9896 Denison, United States, 33.7672, -96.5808 Santo Tomas, El Salvador, 13.6333, -89.1333 Corsicana, United States, 32.0824, -96.4665 Bethune, France, 50.5303, 2.6408 Delitzsch, Germany, 51.5264, 12.3425 San Giovanni Lupatoto, Italy, 45.3833, 11.0333 Raisio, Finland, 60.4858, 22.1692 Busselton, Australia, -33.6478, 115.3458 Westhoughton, United Kingdom, 53.5490, -2.5290 Rakovski, Bulgaria, 42.3000, 24.9667 Salamanca, Chile, -31.7667, -70.9667 Yamagata, Japan, 35.5061, 136.7811 Pinal de Amoles, Mexico, 21.1342, -99.4586 Moschato, Greece, 37.9500, 23.6667 Timurni, India, 22.3712, 77.2274 Ditzingen, Germany, 48.8264, 9.0667 Vynohradiv, Ukraine, 48.1497, 23.0250 Torrelodones, Spain, 40.5756, -3.9292 Jevargi, India, 17.0139, 76.7732 Requena, Peru, -5.0569, -73.8515 Saintes, France, 45.7464, -0.6333 Harbel, Liberia, 6.2833, -10.3500 Ulongue, Mozambique, -14.7167, 34.3667 Bozkir, Turkey, 37.1886, 32.2456 Ludinghausen, Germany, 51.7667, 7.4333 Sangerhausen, Germany, 51.4667, 11.3000 Krasnoznamensk, Russia, 55.6008, 37.0358 Farkhor, Tajikistan, 37.5000, 69.4000 Pfungstadt, Germany, 49.8056, 8.6044 Giv`at Shemu'el, Israel, 32.0781, 34.8489 Lengir, Kazakhstan, 42.1819, 69.8878 Oupeye, Belgium, 50.7100, 5.6449 Kovancilar, Turkey, 38.7217, 39.8672 Espelkamp, Germany, 52.3772, 8.6328 Caledonia, United States, 42.7986, -87.8762 Sugar Hill, United States, 34.1080, -84.0558 Salzkotten, Germany, 51.6708, 8.6047 Mercer Island, United States, 47.5661, -122.2320 Arzignano, Italy, 45.5203, 11.3397 Lafayette, United States, 37.8919, -122.1189 Belen de Umbria, Colombia, 5.2000, -75.8667 Lennestadt, Germany, 51.1236, 8.0681 Holt, United States, 42.6416, -84.5308 La Union, Colombia, 1.6019, -77.1317 Babra, India, 21.8442, 71.3042 Denizciler, Turkey, 36.6500, 36.2167 Budai, Taiwan, 23.3600, 120.1700 Tanabi, Brazil, -20.6258, -49.6489 Kirkby in Ashfield, United Kingdom, 53.0990, -1.2450 Seriate, Italy, 45.6847, 9.7178 Merkanam, India, 12.1942, 79.9435 Villarrobledo, Spain, 39.2667, -2.6000 Arbaoua, Morocco, 34.9000, -5.9167 Camillus, United States, 43.0539, -76.3056 Mequon, United States, 43.2352, -87.9839 Wadi, India, 17.0700, 76.9800 Mariano Comense, Italy, 45.7000, 9.1833 Choconta, Colombia, 5.1467, -73.6825 Thetford, United Kingdom, 52.4100, 0.7400 Vsetin, Czechia, 49.3386, 17.9961 Dyatkovo, Russia, 53.6000, 34.3333 Vierzon, France, 47.2225, 2.0694 Kawlin, Burma, 23.7903, 95.6806 Albergaria-a-Velha, Portugal, 40.6936, -8.4806 Acatlan, Mexico, 20.2333, -103.5333 Topol'cany, Slovakia, 48.5500, 18.1833 Candido Sales, Brazil, -15.5050, -41.2389 Chardonnieres, Haiti, 18.2742, -74.1659 Fengruncun, China, 34.7714, 109.7123 Talugtug, Philippines, 15.7789, 120.8111 Camalaniugan, Philippines, 18.2756, 121.6756 Chiromo, Malawi, -16.5500, 35.1332 Ganshoren, Belgium, 50.8667, 4.3167 Ilaiyankudi, India, 9.6271, 78.6247 Mudgal, India, 16.0119, 76.4420 Atlatlahucan, Mexico, 18.9350, -98.9000 Oulad Said, Morocco, 32.6320, -8.8456 Bacoli, Italy, 40.8000, 14.0833 Miahuatlan, Mexico, 18.5667, -97.4333 Allen, Philippines, 12.5013, 124.2820 Petershagen, Germany, 52.3833, 8.9667 Tipasa, Algeria, 36.5919, 2.4494 Mananjary, Madagascar, -21.2167, 48.3333 Wumayingcun, China, 38.0094, 116.8032 Sandona, Colombia, 1.2833, -77.4667 Dickinson, United States, 46.8918, -102.7925 Hazelwood, United States, 38.7931, -90.3899 Apiai, Brazil, -24.5097, -48.8428 Norco, United States, 33.9252, -117.5498 Norden, Germany, 53.5967, 7.2056 Workington, United Kingdom, 54.6365, -3.5549 Guene, Benin, 11.7306, 3.2242 Oroshaza, Hungary, 46.5678, 20.6428 Urucui, Brazil, -7.2333, -44.5500 Maaseik, Belgium, 51.1019, 5.7856 Brodosqui, Brazil, -20.9908, -47.6589 North Laurel, United States, 39.1285, -76.8476 Walker, United States, 42.9853, -85.7446 Dinuba, United States, 36.5453, -119.3987 Saranga, India, 22.5400, 88.2100 Somoniyon, Tajikistan, 38.4422, 68.7769 Taquari, Brazil, -29.8000, -51.8597 Nea Filadelfeia, Greece, 38.0367, 23.7367 Barstow, United States, 34.8661, -117.0471 Albany, Australia, -35.0228, 117.8814 Uttaramerur, India, 12.6160, 79.7530 Saydnaya, Syria, 33.6947, 36.3715 Kingswinford, United Kingdom, 52.4980, -2.1660 Kola, India, 22.4300, 87.8700 Latehar, India, 23.7442, 84.4998 Carteret, United States, 40.5849, -74.2284 Sarrat, Philippines, 18.1578, 120.6447 Saikaicho-kobago, Japan, 32.9331, 129.6431 Piranhas, Brazil, -9.6239, -37.7569 Paonta Sahib, India, 30.4380, 77.6240 Erlun, Taiwan, 23.7910, 120.3954 Tirora, India, 21.4072, 79.9326 Banhatti, India, 16.3853, 75.1494 Jutai, Brazil, -2.7469, -66.7669 Malyn, Ukraine, 50.7689, 29.2700 Edgewood, United States, 39.4190, -76.2964 Overijse, Belgium, 50.7751, 4.5372 Aridagawa, Japan, 34.0500, 135.2167 Monreal, Philippines, 12.6440, 123.6648 Easton, United States, 42.0362, -71.1103 Pitsea, United Kingdom, 51.5690, 0.5040 Vasudevanallur, India, 9.2417, 77.4118 Fatime, Mali, 13.5739, -5.3815 Alamo, Mexico, 20.9167, -97.6750 Debila, Algeria, 33.5064, 6.9381 Prachin Buri, Thailand, 14.0567, 101.3739 Bagno a Ripoli, Italy, 43.7500, 11.3167 Muskego, United States, 42.8860, -88.1291 Bardsir, Iran, 29.9275, 56.5764 Rhyl, United Kingdom, 53.3210, -3.4800 Gulam, India, 25.7965, 86.7416 Harstad, Norway, 68.7989, 16.5314 Kasrawad, India, 22.1274, 75.6110 Rajgurunagar, India, 18.8667, 73.9000 Saky, Ukraine, 45.1336, 33.5772 Panagar, India, 23.3000, 79.9800 Wewak, Papua New Guinea, -3.5500, 143.6333 Aimores, Brazil, -19.4958, -41.0639 Candelaria, Argentina, -27.4594, -55.7453 Campos Sales, Brazil, -7.0739, -40.3758 Otuzco, Peru, -7.9000, -78.5833 Pallappatti, India, 10.7198, 77.8915 Santa Maria Tonameca, Mexico, 15.7458, -96.5472 Sahibpur Kamal, India, 25.4167, 86.3901 Simpsonville, United States, 34.7287, -82.2569 Sohwal, India, 26.7500, 81.9861 Rania, India, 29.5300, 74.8300 Atuntaqui, Ecuador, 0.3317, -78.2189 Waldshut-Tiengen, Germany, 47.6231, 8.2144 Mombin Crochu, Haiti, 19.3688, -71.9824 Dedham, United States, 42.2467, -71.1777 Mountain House, United States, 37.7673, -121.5449 Novi Travnik, Bosnia and Herzegovina, 44.1748, 17.6634 Namrup, India, 27.1939, 95.3193 Bad Oldesloe, Germany, 53.8117, 10.3742 Ashkhaneh, Iran, 37.5578, 56.9258 University Park, United States, 32.8506, -96.7937 Malangawa, Nepal, 26.8667, 85.5667 El Fahs, Tunisia, 36.3667, 9.9000 Baliqchi, Uzbekistan, 40.9000, 71.8528 Pagudpud, Philippines, 18.5614, 120.7878 Muliyar, India, 12.5074, 75.0957 Iglesias, Italy, 39.3103, 8.5372 Sahjanwa, India, 26.7500, 83.2167 Rajakheri, India, 23.8593, 78.7852 Yarmouth, United States, 41.6756, -70.2242 Kongsberg, Norway, 59.6500, 9.6500 Zawyat ech Cheikh, Morocco, 32.6414, -5.9206 Santo Tomas, Peru, -14.4510, -72.0820 Bure, Ethiopia, 10.7000, 37.0667 Ninohe, Japan, 40.2713, 141.3048 Ibiapina, Brazil, -3.9233, -40.8894 Avon, United States, 41.4485, -82.0187 Yapqan, China, 39.1917, 76.1656 Jafarabad, India, 20.8667, 71.3667 Liria, Spain, 39.6258, -0.5942 Correggio, Italy, 44.7717, 10.7806 Soccorro, Philippines, 14.6179, 121.0558 Beersel, Belgium, 50.7667, 4.3000 Duiven, Netherlands, 51.9472, 6.0211 Perrysburg, United States, 41.5377, -83.6413 Calahorra, Spain, 42.3000, -1.9667 Oegstgeest, Netherlands, 52.1833, 4.4667 Shrirangapattana, India, 12.4140, 76.7040 Kingsville, United States, 27.5094, -97.8610 El Karimia, Algeria, 36.1167, 1.5500 Bombinhas, Brazil, -27.1378, -48.5169 Steenbergen, Netherlands, 51.5842, 4.3194 Bellview, United States, 30.4620, -87.3120 Imi-n-Tanout, Morocco, 31.1600, -8.8500 Valls, Spain, 41.2883, 1.2519 Husi, Romania, 46.6742, 28.0597 Lanling, China, 23.0033, 114.5671 Dix Hills, United States, 40.8033, -73.3375 Nabinagar, India, 24.6200, 84.1200 Sohagpur, India, 22.7000, 78.2000 Charentsavan, Armenia, 40.4097, 44.6431 Camaligan, Philippines, 13.6208, 123.1656 Wolfsberg, Austria, 46.8500, 14.8333 San Felipe, Philippines, 15.0619, 120.0700 Meckenheim, Germany, 50.6333, 7.0167 Datca, Turkey, 36.7283, 27.6869 Newport, United States, 41.4801, -71.3203 Barwa Sagar, India, 25.3799, 78.7390 Daventry, United Kingdom, 52.2578, -1.1628 Pangil, Philippines, 14.4000, 121.4700 King of Prussia, United States, 40.0963, -75.3821 Quirino, Philippines, 17.1356, 121.7350 Bousse, Burkina Faso, 12.6667, -1.8975 Loma Linda, United States, 34.0450, -117.2498 Sao Joao dos Patos, Brazil, -6.4950, -43.7019 Bognor Regis, United Kingdom, 50.7824, -0.6764 Barki Ballia, India, 25.4223, 86.2758 Nepomuceno, Brazil, -21.2358, -45.2358 Simria, India, 25.9663, 85.8324 Trikodi, India, 11.4667, 75.6167 Hukeri, India, 16.2300, 74.6000 Naubatpur, India, 25.5000, 84.9611 Ramshir, Iran, 30.8936, 49.4086 Pathiyanikunnu, India, 8.7733, 76.8801 Sonzacate, El Salvador, 13.7356, -89.7161 Hastings, United States, 40.5961, -98.3900 Attili, India, 16.7000, 81.6000 Hindley, United Kingdom, 53.5355, -2.5658 Khed Brahma, India, 24.0283, 73.0414 Paoay, Philippines, 18.0625, 120.5203 Drodro, Congo (Kinshasa), 1.7667, 30.5333 Dbarwa, Eritrea, 15.1000, 38.8333 Moyale, Ethiopia, 3.5270, 39.0560 Tegalbuleud, Indonesia, -7.3578, 106.6220 Kali, India, 19.9436, 77.7317 Ayirurpara, India, 8.5030, 76.9522 Parner, India, 19.0030, 74.4380 Lalru, India, 30.4867, 76.8006 Singhana, India, 27.9800, 75.8000 Kalamner, India, 20.4444, 78.3256 Sojitra, India, 22.5500, 72.7197 Madha, India, 29.1966, 76.0653 Chanasma, India, 23.7200, 72.1200 Vodurivandlagudem, India, 16.4286, 81.1330 Khiria Jhansi, India, 25.4639, 78.5829 Data, India, 29.2670, 75.9950 Malanvadi, India, 16.0080, 73.6870 As Saqlawiyah, Iraq, 33.3964, 43.6833 Shaqlawah, Iraq, 36.3964, 44.3436 Ash Shunah ash Shamaliyah, Jordan, 32.6100, 35.6081 Moyale, Kenya, 3.5270, 39.0560 Vangviang, Laos, 18.9267, 102.4494 Ehden, Lebanon, 34.2919, 35.9546 Ampahana, Madagascar, -14.7617, 50.2208 Fidirana, Madagascar, -19.5095, 46.5655 Mahatalaky, Madagascar, -24.7908, 47.0787 Ankazomborona, Madagascar, -16.1163, 46.7539 Antsirabe Avaratra, Madagascar, -13.9746, 49.9724 Bidur, Malaysia, 4.1167, 101.2833 Catembe, Mozambique, -26.0092, 32.5667 Nijverdal, Netherlands, 52.3631, 6.4617 Santiago de Chuco, Peru, -8.1502, -78.1783 Caballococha, Peru, -3.9058, -70.5164 Dainyor, Pakistan, 35.9194, 74.3889 Pinhal Novo, Portugal, 38.6297, -8.9136 Baxdo, Somalia, 5.7890, 47.2266 Tall Shihab, Syria, 32.6918, 35.9745 Kibuku, Uganda, 1.0375, 33.8400 Sho`rchi, Uzbekistan, 38.0111, 67.7875 Araira, Venezuela, 10.4525, -66.4850 Higuerote, Venezuela, 10.4833, -66.1000 Norton Shores, United States, 43.1621, -86.2519 Simaria, India, 25.4221, 86.0060 Nossa Senhora das Dores, Brazil, -10.4919, -37.1928 Tateyama, Japan, 36.6636, 137.3137 Mohale's Hoek, Lesotho, -30.1500, 27.4667 Sultepec, Mexico, 18.8667, -99.9500 Ponta de Pedras, Brazil, -1.3900, -48.8708 Kabanga, Tanzania, -2.9022, 30.4986 Barberton, United States, 41.0095, -81.6037 Sidhauli, India, 27.2800, 80.8300 Tsaratanana, Madagascar, -16.7978, 47.6509 Schmallenberg, Germany, 51.1490, 8.2845 Tapa, India, 30.2979, 75.3694 Yingshui, China, 37.5061, 105.1301 Sumperk, Czechia, 49.9653, 16.9706 Paduvari, India, 13.8833, 74.6333 Illiltene, Algeria, 36.5161, 4.3944 Olpe, Germany, 51.0167, 7.8333 Gajwel, India, 17.8517, 78.6828 Baindur, India, 13.8660, 74.6333 Sprockhovel, Germany, 51.3667, 7.2500 Syke, Germany, 52.9131, 8.8269 Springfield, United States, 39.9281, -75.3362 Romulus, United States, 42.2237, -83.3660 La Esperanza, Guatemala, 14.8667, -91.5667 Harmanli, Bulgaria, 41.9333, 25.9000 Paete, Philippines, 14.3700, 121.4800 Rio Preto da Eva, Brazil, -2.6989, -59.7000 Yuzhang, China, 25.3333, 105.2000 Niscemi, Italy, 37.1500, 14.3833 Farmington, United States, 40.9845, -111.9065 Traralgon, Australia, -38.1958, 146.5403 Uherske Hradiste, Czechia, 49.0697, 17.4597 Chivolo, Colombia, 10.0261, -74.6211 Cuijk, Netherlands, 51.7269, 5.8794 Portalegre, Portugal, 39.3167, -7.4167 Marneuli, Georgia, 41.4872, 44.7981 North Augusta, United States, 33.5214, -81.9547 Ixchiguan, Guatemala, 15.1675, -91.9319 Dalupo, China, 19.4245, 110.5387 Pinillos, Colombia, 8.9167, -74.4667 Termini Imerese, Italy, 37.9833, 13.7000 Imatra, Finland, 61.1833, 28.7667 Mundargi, India, 15.2070, 75.8840 Rathenow, Germany, 52.6000, 12.3333 Tres de Maio, Brazil, -27.7728, -54.2400 Koumia, Mali, 12.5967, -4.6864 Nainpur, India, 22.4300, 80.1200 Asino, Russia, 57.0000, 86.1333 Auburn Hills, United States, 42.6735, -83.2448 Elefsina, Greece, 38.0333, 23.5333 Hunucma, Mexico, 21.0153, -89.8744 Dimasalang, Philippines, 12.1933, 123.8583 Montalban, Venezuela, 10.2522, -68.3019 Wanchuan, China, 35.0875, 105.8561 Szentes, Hungary, 46.6519, 20.2572 Dugda, India, 23.7452, 86.1717 Broadstairs, United Kingdom, 51.3589, 1.4394 Nogi, Japan, 36.2332, 139.7407 Pezinok, Slovakia, 48.2919, 17.2661 Yaypan, Uzbekistan, 40.3758, 70.8156 Sand, Norway, 59.0886, 10.4317 Ixhuatlancillo, Mexico, 18.9000, -97.1500 Ushtobe, Kazakhstan, 45.2422, 77.9822 Rethymno, Greece, 35.3689, 24.4739 Flores Costa Cuca, Guatemala, 14.6500, -91.8167 Minowa, Japan, 35.9150, 137.9819 Westerlo, Belgium, 51.0897, 4.9153 Sora, Italy, 41.7167, 13.6167 Kholmsk, Russia, 47.0500, 142.0500 Piracanjuba, Brazil, -17.3028, -49.0178 Pedro Carbo, Ecuador, -1.8179, -80.2330 Kouhu, Taiwan, 23.5763, 120.1725 Martinopolis, Brazil, -22.1461, -51.1709 Riverbank, United States, 37.7260, -120.9433 Quispamsis, Canada, 45.4322, -65.9462 Sahasoa, Madagascar, -21.9480, 45.9891 Stein, Netherlands, 50.9679, 5.7652 Iki, Japan, 33.7497, 129.6914 Les Pavillons-sous-Bois, France, 48.9000, 2.5000 Villa Tapia, Dominican Republic, 19.3000, -70.4200 Seal Beach, United States, 33.7542, -118.0714 Meiningen, Germany, 50.5500, 10.4167 Kobo, Ethiopia, 12.1500, 39.6333 Breclav, Czechia, 48.7589, 16.8819 Almonte, Spain, 37.2667, -6.5167 Wasaga Beach, Canada, 44.5206, -80.0167 Wujiaying, China, 33.1871, 107.0480 Karukurti, India, 10.2167, 76.3833 Derry, United States, 40.2709, -76.6561 Kalavad, India, 22.2200, 70.3800 Edavanakad, India, 10.0150, 76.2200 Ishii, Japan, 34.0667, 134.4333 Jabonga, Philippines, 9.3431, 125.5156 Solsona, Philippines, 18.0961, 120.7725 Adis Zemen, Ethiopia, 12.1167, 37.7833 Rangapara, India, 26.8377, 92.6688 Maduru, India, 14.7616, 78.6171 Cherukara, India, 9.4667, 76.6000 Vernon, France, 49.0900, 1.4900 Valambur, India, 11.0000, 76.2000 Liangwu, China, 23.6012, 111.8238 Raghopur, India, 25.5323, 85.3809 Ghoti Budrukh, India, 19.7167, 73.6333 Anivorano Avaratra, Madagascar, -12.7410, 49.2332 Santa Rita do Passa Quatro, Brazil, -21.7100, -47.4778 Sirmatpur, India, 25.3235, 87.3836 Hamme, Belgium, 51.0833, 4.1333 Dangila, Ethiopia, 11.2667, 36.8333 Banga, India, 31.1887, 75.9949 Turuttikkara, India, 8.9438, 76.6039 Bourdoud, Morocco, 34.5922, -4.5492 Savur, Turkey, 37.5375, 40.8892 Aso, Japan, 32.9519, 131.1214 Westchase, United States, 28.0597, -82.6110 Perevalsk, Ukraine, 48.4333, 38.8167 Tamboril, Brazil, -4.8319, -40.3208 Nazareth, India, 8.5580, 77.9600 Centerville, United States, 39.6339, -84.1449 Morales, Colombia, 8.3133, -73.8719 Galdar, Spain, 28.1439, -15.6503 Collingwood, Canada, 44.5000, -80.2167 Basopatti, India, 26.5780, 86.0052 Piat, Philippines, 17.7919, 121.4769 Madaoua, Niger, 14.0762, 5.9586 General Luna, Philippines, 13.6881, 122.1708 Yukon, United States, 35.5201, -97.7639 Thundersley, United Kingdom, 51.5700, 0.5900 Poblacion, Philippines, 10.1614, 125.1303 Kuttampuzha, India, 10.1500, 76.7333 Pecan Grove, United States, 29.6235, -95.7330 Wisbech, United Kingdom, 52.6640, 0.1600 Swiecie, Poland, 53.4167, 18.4333 Icatu, Brazil, -2.7758, -44.0658 Khalari, India, 23.6506, 85.0074 Baarn, Netherlands, 52.2117, 5.2875 Corralillo, Cuba, 22.9856, -80.5831 Voorst, Netherlands, 52.1692, 6.1428 Plettenberg, Germany, 51.2167, 7.8833 Turek, Poland, 52.0167, 18.5000 Fort Dodge, United States, 42.5098, -94.1751 Usia, India, 25.4309, 83.7075 Suchitoto, El Salvador, 13.9333, -89.0333 Gorleston-on-Sea, United Kingdom, 52.5757, 1.7235 Shivganj, India, 25.1500, 73.0700 Salanso, Burkina Faso, 12.1833, -4.0833 Cambre, Spain, 43.2830, -8.3330 Pamplona, Philippines, 18.4661, 121.3425 Tugaya, Philippines, 7.8840, 124.1720 Guarai, Brazil, -8.8339, -48.5100 Nar'yan-Mar, Russia, 67.6333, 53.0500 Galdacano, Spain, 43.2306, -2.8458 Big Spring, United States, 32.2389, -101.4799 Pepa, Congo (Kinshasa), -7.7106, 29.7760 Pweto, Congo (Kinshasa), -8.4667, 28.9000 Rudolstadt, Germany, 50.7169, 11.3275 Dodola, Ethiopia, 6.9833, 39.1833 Beifan, China, 31.3881, 113.5269 San Francisco Zapotitlan, Guatemala, 14.5833, -91.5167 Ardmore, United States, 34.1949, -97.1256 Santana, Brazil, -12.9828, -44.0508 Kalayaan, Philippines, 14.3280, 121.4800 Jamay, Mexico, 20.2900, -102.7100 Bad Mergentheim, Germany, 49.5000, 9.7667 Sandusky, United States, 41.4468, -82.7024 Tres Isletas, Argentina, -26.3500, -60.4167 Ban Khamen, Thailand, 13.8823, 100.2879 Boureit, Morocco, 34.9833, -4.9167 Tuburan, Philippines, 6.6000, 122.2000 Thornaby on Tees, United Kingdom, 54.5585, -1.3025 Villanueva, Colombia, 4.6087, -72.9288 Kulachi, Pakistan, 31.9286, 70.4592 Taquaritinga do Norte, Brazil, -7.9001, -36.0502 Owando, Congo (Brazzaville), -0.4833, 15.8975 Patian, Philippines, 5.8444, 121.1439 Djambala, Congo (Brazzaville), -2.5400, 14.7519 Guaymango, El Salvador, 13.7500, -89.8333 Barnegat, United States, 39.7668, -74.2776 Floresta, Brazil, -8.6008, -38.5678 Lapao, Brazil, -11.3828, -41.8319 Zanesville, United States, 39.9565, -82.0132 Bazarak, Afghanistan, 35.3128, 69.5158 Ain Aicha, Morocco, 34.4833, -4.7000 Junqueiro, Brazil, -9.9253, -36.4758 Hertford, United Kingdom, 51.7966, -0.0774 Haren, Germany, 52.7667, 7.2167 Zumpango del Rio, Mexico, 17.6500, -99.5000 Marapanim, Brazil, -0.7139, -47.6939 Brasil Novo, Brazil, -3.2619, -52.6678 Delfzijl, Netherlands, 53.3333, 6.9167 Moron, Haiti, 18.5604, -74.2578 Castro Alves, Brazil, -12.7658, -39.4278 Lempaala, Finland, 61.3167, 23.7500 Zittau, Germany, 50.8961, 14.8072 Joao Lisboa, Brazil, -5.4478, -47.4008 Macka, Turkey, 40.8119, 39.6131 Algeciras, Colombia, 2.5333, -75.3167 Ma`bar, Yemen, 14.7940, 44.2935 Zhenbeibu, China, 38.6275, 106.0669 Gouna, Mali, 10.9167, -8.0000 Podaturpeta, India, 13.2817, 79.4854 Victoria, Seychelles, -4.6231, 55.4525 G'allaorol Shahri, Uzbekistan, 40.0214, 67.5975 Mairwa, India, 26.2322, 84.1635 Santa Rosa, Colombia, 10.4456, -75.3686 Oga, Japan, 39.8868, 139.8476 Saltpond, Ghana, 5.2091, -1.0606 Betong, Thailand, 5.7731, 101.0725 Kakonko, Tanzania, -3.2796, 30.9600 Morton Grove, United States, 42.0423, -87.7890 Baroy, Philippines, 8.0300, 123.7800 Tamilisan, Philippines, 7.9761, 122.6639 Raska, Serbia, 43.2856, 20.6092 Hinis, Turkey, 39.3586, 41.7003 Panapur, India, 25.6729, 85.0715 Kajiado, Kenya, -1.8500, 36.7833 Paris, United States, 33.6688, -95.5460 Olesa de Montserrat, Spain, 41.5450, 1.8944 Naruto, Japan, 35.5864, 140.4136 San Benito, United States, 26.1298, -97.6440 Patnagarh, India, 20.7083, 83.1326 Herzogenaurach, Germany, 49.5700, 10.8819 Monte Cristi, Dominican Republic, 19.8667, -71.6500 Stutterheim, South Africa, -32.5667, 27.4167 Narasingapuram, India, 11.6038, 78.5778 Libourne, France, 44.9200, -0.2400 Charleville-Mezieres, France, 49.7719, 4.7161 Shitan, China, 22.4546, 112.5832 Suitland, United States, 38.8492, -76.9225 Scotch Plains, United States, 40.6332, -74.3739 Uaua, Brazil, -9.8419, -39.4819 Chandili, India, 19.2467, 83.4058 Erandio, Spain, 43.3047, -2.9731 Jiquilpan de Juarez, Mexico, 19.5900, -102.4300 Miguel Calmon, Brazil, -11.4289, -40.5950 Kaga Bandoro, Central African Republic, 7.0000, 19.1833 Portao, Brazil, -29.7019, -51.2419 Pasighat, India, 28.0700, 95.3300 Bystrc, Czechia, 49.2247, 16.5239 Lormont, France, 44.8792, -0.5217 Ternate, Philippines, 14.2800, 120.7200 Eidsvoll, Norway, 60.3167, 11.2333 Larvik, Norway, 59.0532, 10.0271 Alacam, Turkey, 41.6100, 35.5950 Urgup, Turkey, 38.6314, 34.9131 Leoben, Austria, 47.3817, 15.0972 Bedburg, Germany, 51.0000, 6.5625 Burdeos, Philippines, 14.8436, 121.9697 Newton in Makerfield, United Kingdom, 53.4500, -2.6330 Las Cabras, Chile, -34.2917, -71.3097 Palakodu, India, 12.3037, 78.0730 Shamgarh, India, 24.1800, 75.6300 Merelbeke, Belgium, 51.0000, 3.7500 West Milford, United States, 41.1060, -74.3914 Bielsk Podlaski, Poland, 52.7667, 23.2000 Al Qubbah, Libya, 32.7568, 22.2411 Cloverleaf, United States, 29.7882, -95.1724 Socastee, United States, 33.6871, -79.0086 Znamensk, Russia, 48.5833, 45.7500 El Milagro, Peru, -8.0284, -79.0672 Ban Bang Phun, Thailand, 13.9851, 100.5701 Santa Maria do Para, Brazil, -1.3519, -47.5758 Zwevegem, Belgium, 50.8000, 3.3333 Desnogorsk, Russia, 54.1500, 33.2833 Belton, United States, 38.8192, -94.5335 Port St. John, United States, 28.4757, -80.8104 Rawson, Argentina, -43.3000, -65.1000 Navalgund, India, 15.5700, 75.3700 San Borja, Bolivia, -14.8583, -66.7475 Iacu, Brazil, -12.7669, -40.2119 Bainbridge Island, United States, 47.6439, -122.5434 Donggangli, China, 39.9733, 119.6406 Waldkraiburg, Germany, 48.2167, 12.4000 Queimadas, Brazil, -10.9778, -39.6239 Khashuri, Georgia, 41.9975, 43.5986 Pata Kalidindi, India, 16.5014, 81.2908 Sebt Gzoula, Morocco, 32.1167, -9.0833 Madougou, Mali, 14.3992, -3.0789 Etajima, Japan, 34.2167, 132.4500 Ramdiri, India, 25.3118, 86.1023 Fatoma, Mali, 14.6111, -4.0614 Telagh, Algeria, 34.7833, -0.5667 Maywood, United States, 33.9886, -118.1877 Wyandotte, United States, 42.2113, -83.1558 Darende, Turkey, 38.5472, 37.5111 Medford, United States, 39.8639, -74.8231 Condado, Brazil, -7.5858, -35.1058 Fontenay-aux-Roses, France, 48.7893, 2.2888 Gorantla, India, 13.9892, 77.7703 Carrascal, Philippines, 9.3683, 125.9494 Selma, United States, 36.5715, -119.6143 Westford, United States, 42.5864, -71.4401 Cayeli, Turkey, 40.7500, 41.0667 Rio Tinto, Brazil, -6.8028, -35.0808 Irugur, India, 11.0178, 77.0629 Watertown, United States, 43.9734, -75.9094 Reserva, Brazil, -24.6500, -50.8508 Calamar, Colombia, 10.2500, -74.9158 Biharamulo, Tanzania, -2.6333, 31.3167 Ain Kechera, Algeria, 36.7483, 6.4325 Greenbelt, United States, 38.9953, -76.8885 Sept-Iles, Canada, 50.2167, -66.3833 Goulburn, Australia, -34.7558, 149.7206 Panglong, Burma, 24.1003, 98.3139 Carlos A. Carrillo, Mexico, 18.3748, -95.7544 Douar Ouled Ayad, Morocco, 32.2000, -6.7975 Paita, New Caledonia, -22.1289, 166.3690 Takhli, Thailand, 15.2667, 100.3500 El Retorno, Colombia, 2.3306, -72.6278 Landover, United States, 38.9241, -76.8875 Tapejara, Brazil, -28.0678, -52.0139 Ridgeland, United States, 32.4236, -90.1481 Guabiruba, Brazil, -27.0858, -48.9808 Mponela, Malawi, -13.5310, 33.7393 Stjordal, Norway, 63.4703, 10.9122 Kottapeta, India, 16.7167, 81.9000 Valdivia, Colombia, 7.2890, -75.3980 Cheruvaranam, India, 9.6522, 76.3179 Wierden, Netherlands, 52.3592, 6.5931 Kerrville, United States, 30.0398, -99.1320 Alcobaca, Brazil, -17.5189, -39.1958 Ureshinomachi-shimojuku, Japan, 33.1281, 130.0600 Herndon, United States, 38.9699, -77.3867 Santo Tomas, Philippines, 17.4000, 121.7700 Ravansar, Iran, 34.7156, 46.6519 Sirkhandi Bhitha, India, 26.6244, 85.7787 Dungra Chhota, India, 23.1667, 74.3000 Douar 'Ayn Dfali, Morocco, 34.5990, -5.5488 Qutur, Egypt, 30.9765, 30.9532 Malinao, Philippines, 11.6431, 122.3072 Watsa, Congo (Kinshasa), 3.0372, 29.5355 Homer Glen, United States, 41.6043, -87.9497 Cordeiropolis, Brazil, -22.4819, -47.4569 Melrose Park, United States, 41.9030, -87.8636 Amatan, Mexico, 17.3667, -92.8167 Belvidere, United States, 42.2543, -88.8649 Pelham, United States, 33.3114, -86.7573 Sanchez, Dominican Republic, 19.2289, -69.6119 Akividu, India, 16.5812, 81.3747 Aklvidu, India, 16.6000, 81.3833 Ronnenberg, Germany, 52.3194, 9.6556 Qualiano, Italy, 40.9167, 14.1500 Zdolbuniv, Ukraine, 50.5094, 26.2597 Hulbuk, Tajikistan, 37.8050, 69.6464 Bereket, Turkmenistan, 39.2431, 55.5169 G`uzor, Uzbekistan, 38.6208, 66.2481 Andhra Tharhi, India, 26.3771, 86.3341 Nij Khari, India, 22.0929, 88.4288 Dongxiaozhai, China, 40.1672, 118.0699 Tirumuruganpundi, India, 11.1649, 77.3084 Parambatt Kavu, India, 11.3268, 75.8906 Ocara, Brazil, -4.4908, -38.5969 Markkleeberg, Germany, 51.2778, 12.3833 Orly, France, 48.7439, 2.3928 Tulsipur, India, 27.5500, 82.4200 Pindwara, India, 24.7945, 73.0550 Dhamnagar, India, 20.9141, 86.4468 Ap Khanh Hoa, Vietnam, 10.6333, 105.2167 Mahdishahr, Iran, 35.7144, 53.3569 World Golf Village, United States, 29.9654, -81.4896 Kaynarca, Turkey, 41.0308, 30.3075 Hanerik, China, 39.2627, 76.4190 Khajuraho, India, 24.8500, 79.9250 Fairfax, United States, 38.8531, -77.2997 Traun, Austria, 48.2217, 14.2397 Soledad, United States, 36.4432, -121.3426 Mimoso do Sul, Brazil, -21.0639, -41.3658 Decatur, United States, 33.7711, -84.2963 Purwa, India, 26.4700, 80.7800 San Agustin Loxicha, Mexico, 16.0167, -96.6167 Saginaw, United States, 32.8657, -97.3654 Zion, United States, 42.4603, -87.8511 Baar, Switzerland, 47.1956, 8.5264 Warstein, Germany, 51.4500, 8.3500 Slavutych, Ukraine, 51.5206, 30.7569 Sahaspur, India, 29.1208, 78.6208 Cartaxo, Portugal, 39.1619, -8.7864 Isernhagen-Sud, Germany, 52.4342, 9.8572 Canton, United States, 42.1750, -71.1264 Faribault, United States, 44.2996, -93.2789 Sahawar, India, 27.8000, 78.8500 Nasukarasuyama, Japan, 36.6569, 140.1514 Wetzikon, Switzerland, 47.3208, 8.7931 Attendorn, Germany, 51.1289, 7.9022 Igaracu do Tiete, Brazil, -22.5092, -48.5578 Calw, Germany, 48.7167, 8.7333 Eisenhuttenstadt, Germany, 52.1450, 14.6728 Zungeru, Nigeria, 9.8128, 6.1558 Vinnamala, India, 13.9074, 79.9086 Bundu, India, 23.1609, 85.5901 Tamahu, Guatemala, 15.3333, -90.1667 Felixstowe, United Kingdom, 51.9639, 1.3514 Qabatiyah, West Bank, 32.4104, 35.2809 Napindan, Philippines, 14.5403, 121.0961 Eysines, France, 44.8853, -0.6500 Arad, Israel, 31.2603, 35.2147 Channagiri, India, 14.0240, 75.9258 'Ain Boucif, Algeria, 35.8912, 3.1585 Gaz, Iran, 32.8061, 51.6206 Vilankulo, Mozambique, -22.0000, 35.3167 Zhuangwei, Taiwan, 24.7702, 121.8023 Riverside, United States, 39.7835, -84.1219 Balarampur, India, 23.1200, 86.2200 Yokadouma, Cameroon, 3.5167, 15.0500 Garcia Hernandez, Philippines, 9.6144, 124.2946 Benbrook, United States, 32.6788, -97.4637 Sao Sebastiao do Cai, Brazil, -29.5869, -51.3758 Tres Coroas, Brazil, -29.5169, -50.7778 Clinton, United States, 41.8435, -90.2412 Zagan, Poland, 51.6167, 15.3167 Cazones de Herrera, Mexico, 20.7044, -97.3106 Mola di Bari, Italy, 41.0667, 17.0833 Armiansk, Ukraine, 46.1074, 33.6919 Pedra Azul, Brazil, -16.0050, -41.2969 Oirase, Japan, 40.5992, 141.3977 Ramain, Philippines, 7.9700, 124.3500 Fray Bentos, Uruguay, -33.1333, -58.3000 Minas Novas, Brazil, -17.2189, -42.5900 Ashwaraopeta, India, 17.2500, 81.1333 Los Barrios, Spain, 36.1833, -5.4833 Tirutturaippundi, India, 10.5300, 79.6500 Abim, Uganda, 2.7019, 33.6600 Upper Providence, United States, 40.1654, -75.4888 Garhara, India, 25.4407, 85.9983 Panmana, India, 8.9333, 76.6167 Buturlinovka, Russia, 50.8333, 40.5833 Oak Harbor, United States, 48.2964, -122.6333 Oak Ridge, United States, 28.4727, -81.4169 Itambe, Brazil, -15.2450, -40.6239 Ngorkou, Mali, 15.6597, -3.7158 Kings Norton, United Kingdom, 52.4072, -1.9272 Santa Ana, Guatemala, 16.8069, -89.8272 Tbeng Meanchey, Cambodia, 13.8167, 104.9667 Ponca City, United States, 36.7235, -97.0677 Gyal, Hungary, 47.3822, 19.2136 Les Irois, Haiti, 18.4049, -74.4528 Alicia, Philippines, 9.8957, 124.4415 Asan, India, 25.7300, 74.3300 Buzen, Japan, 33.6114, 131.1303 Bacolod, Philippines, 8.1892, 124.0238 Putten, Netherlands, 52.2592, 5.6069 Lice, Turkey, 38.4500, 40.6500 Wandlitz, Germany, 52.7500, 13.4497 Martos, Spain, 37.7167, -3.9667 Valente, Brazil, -11.4119, -39.4619 Preah Vihear, Cambodia, 13.8047, 104.9783 Middleborough, United States, 41.8803, -70.8745 Hirriyat Raznah, Egypt, 30.6028, 31.5372 Kenndie, Mali, 14.7006, -3.4178 Duncan, Canada, 48.7787, -123.7079 Birkirkara, Malta, 35.8967, 14.4625 Puerto Guzman, Colombia, 0.9667, -76.5833 Hennenman, South Africa, -27.9667, 27.0333 Ubach-Palenberg, Germany, 50.9197, 6.1194 Nagarpara, India, 25.4155, 86.8832 Ambohimasina, Madagascar, -19.6506, 46.7341 Taquarituba, Brazil, -23.5328, -49.2439 Ruvo di Puglia, Italy, 41.1173, 16.4837 Nova Xavantina, Brazil, -14.6728, -52.3528 Paruthur, India, 10.8174, 76.1178 Sundarnagar, India, 31.5300, 76.8800 Porto de Mos, Portugal, 39.6000, -8.8167 Ibimirim, Brazil, -8.5408, -37.6903 Saidpur, India, 25.5500, 83.1800 Freudenstadt, Germany, 48.4633, 8.4111 Varel, Germany, 53.3969, 8.1361 Sagbayan, Philippines, 9.9200, 124.1000 Horquetas, Costa Rica, 10.3195, -83.9647 Canhotinho, Brazil, -8.8819, -36.1908 Las Margaritas, Mexico, 16.3153, -91.9817 Singarayakonda, India, 15.2500, 80.0203 Bloomington, United States, 34.0601, -117.4013 Tadjmout, Algeria, 33.8667, 2.5167 Pallapatti, India, 9.4664, 77.8219 Iringal, India, 11.5667, 75.6000 Xinxing, China, 47.1601, 123.8000 Gose, Japan, 34.4633, 135.7403 Portogruaro, Italy, 45.7833, 12.8333 Sarykemer, Kazakhstan, 43.0106, 71.5172 Lucena, Philippines, 10.8800, 122.6000 Ipixuna, Brazil, -7.0508, -71.6950 Farragut, United States, 35.8731, -84.1821 Greenfield, United States, 39.7937, -85.7738 Bijawar, India, 24.6235, 79.4899 Patterson, United States, 37.4758, -121.1536 Cedros, Honduras, 14.5956, -87.1186 Velur, India, 11.1114, 78.0048 Qazi Ahmad, Pakistan, 26.4083, 68.1564 Cantanhede, Brazil, -3.6328, -44.3769 Wadsworth, United States, 41.0279, -81.7323 Oud-Beijerland, Netherlands, 51.8200, 4.4200 Qianwangcun, China, 29.2283, 121.3483 Koloriang, India, 27.9167, 93.3500 Pinheiral, Brazil, -22.5128, -44.0008 Curacavi, Chile, -33.4000, -71.1500 Daksinkali, Nepal, 27.6089, 85.2672 Ajim, Tunisia, 33.7167, 10.7500 Auburn, United States, 44.0851, -70.2492 Mandan, United States, 46.8290, -100.8870 Radauti, Romania, 47.8425, 25.9192 Saint-Laurent-du-Maroni, French Guiana, 5.4976, -54.0325 Kien Luong, Vietnam, 10.2856, 104.6444 Icod de los Vinos, Spain, 28.3500, -16.7000 Baheri, India, 25.9426, 86.0471 Maharajgani, India, 26.1075, 84.5025 Zhuchangba, China, 26.6615, 106.5485 Almansa, Spain, 38.0000, 52.0000 Volksrust, South Africa, -27.3667, 29.8833 Satuba, Brazil, -9.5628, -35.8239 Nueva Paz, Cuba, 22.7667, -81.7500 Kalach-na-Donu, Russia, 48.7000, 43.5167 Unecha, Russia, 52.8461, 32.6767 Carlow, Ireland, 52.8306, -6.9317 Borre, Norway, 59.3819, 10.4380 Katrineholm, Sweden, 59.0000, 16.2000 Lomianki, Poland, 52.3333, 20.8833 Ayanavelikulangara Tekku, India, 9.0436, 76.5199 Senador Pompeu, Brazil, -5.5878, -39.3719 Noto, Italy, 36.8833, 15.0833 Mograne, Morocco, 34.4167, -6.4333 Le Bouscat, France, 44.8651, -0.5996 Umga, India, 24.6396, 84.5577 Zhangshanying, China, 40.4775, 115.8508 Tamorot, Morocco, 34.9333, -4.7833 Morozovsk, Russia, 48.3667, 41.8333 Sao Geraldo do Araguaia, Brazil, -6.4008, -48.5550 Ennis, Ireland, 52.8463, -8.9807 Saint-Nicolas, Belgium, 50.6302, 5.5373 Montegnee, Belgium, 50.6333, 5.5333 Lukaya, Uganda, -0.1508, 31.8744 Tocopilla, Chile, -22.0889, -70.1958 Palmetto Bay, United States, 25.6219, -80.3221 Benua Baru, Indonesia, 0.9878, 117.9800 Hudson, Canada, 45.4500, -74.1500 Mau, India, 26.2658, 78.6711 Mahaiza, Madagascar, -19.9016, 46.8060 Dahecun, China, 32.8956, 108.7584 San Juan Nepomuceno, Paraguay, -26.1117, -55.9353 Valparaiso, Brazil, -21.2278, -50.8678 El Salto, Mexico, 23.7823, -105.3585 El Factor, Dominican Republic, 19.3200, -69.8800 Mayang Imphal, India, 24.6000, 93.9000 Carutapera, Brazil, -1.1950, -46.0200 Mairena del Alcor, Spain, 37.3667, -5.7333 uMhlanga Rocks, South Africa, -29.7333, 31.0708 Mekla, Algeria, 36.6833, 4.2667 Nova Soure, Brazil, -11.2328, -38.4828 Ganzhu, China, 26.9483, 116.3714 Vettakkaranpudur, India, 10.5637, 76.9166 Qiaomaichuan, China, 39.7866, 113.8239 Foum el Anser, Morocco, 32.3718, -6.2613 South Plainfield, United States, 40.5748, -74.4152 Haaksbergen, Netherlands, 52.1547, 6.7419 Freha, Algeria, 36.7500, 4.3167 Chester-le-Street, United Kingdom, 54.8594, -1.5699 Sroda Wielkopolska, Poland, 52.2333, 17.2833 Jan Kempdorp, South Africa, -27.9194, 24.8361 El Congo, El Salvador, 13.9000, -89.4833 Frederickson, United States, 47.0916, -122.3603 Cabrera, Dominican Republic, 19.6426, -69.9049 Gotvand, Iran, 32.2433, 48.8136 Farnley, United Kingdom, 53.7876, -1.6159 Ambalamanasy II, Madagascar, -14.5255, 49.5885 Ibi, Spain, 38.6272, -0.5753 Debaltseve, Ukraine, 48.3333, 38.4000 Canarana, Brazil, -11.6850, -41.7689 Calliaqua, Saint Vincent and the Grenadines, 13.1308, -61.1928 Soure, Brazil, -0.7169, -48.5228 Donmatias, Colombia, 6.4833, -75.4333 Westmont, United States, 41.7948, -87.9742 Boulsa, Burkina Faso, 12.6667, -0.5833 Buwenge, Uganda, 0.6503, 33.1703 Aioun, Mauritania, 16.6614, -9.6150 Naravarikuppam, India, 13.1913, 80.1847 Halikner, India, 17.8500, 77.2700 Johnston, United States, 41.6910, -93.7234 Kauswagan, Philippines, 8.1917, 124.0847 Ortigueira, Brazil, -24.2078, -50.9489 Quatro Barras, Brazil, -25.3658, -49.0769 Fossano, Italy, 44.5500, 7.7333 Souk Tlet El Gharb, Morocco, 34.6211, -6.1336 Lagonglong, Philippines, 8.8000, 124.7800 Maksi, India, 23.2600, 76.1457 Mogalturru, India, 16.4167, 81.6000 Boquim, Brazil, -11.1469, -37.6208 Machachi, Ecuador, -0.5100, -78.5700 Columbus, United States, 41.4366, -97.3565 Hingham, United States, 42.2176, -70.8854 Novo Mesto, Slovenia, 45.8000, 15.1667 Cullera, Spain, 39.1639, -0.2517 Magenta, Italy, 45.4603, 8.8766 Liberty Triangle, United States, 29.0760, -82.2191 San Enrique, Philippines, 10.4200, 122.8500 Skawina, Poland, 49.9833, 19.8333 Forquilha, Brazil, -3.7978, -40.2608 Helleland, Norway, 58.8333, 5.6000 San Fernando, Philippines, 12.3200, 122.6000 Golborne, United Kingdom, 53.4758, -2.5943 Sehnde, Germany, 52.3161, 9.9642 Caibiran, Philippines, 11.5700, 124.5800 Walcz, Poland, 53.2667, 16.4667 Ukkayapalle, India, 14.4898, 78.8927 Kosigi, India, 15.8500, 77.2667 Jaruco, Cuba, 23.0428, -82.0094 Angatuba, Brazil, -23.4903, -48.4128 Oguchi, Japan, 35.3325, 136.9078 Setti Fatma, Morocco, 31.2256, -7.6758 Yoqne`am `Illit, Israel, 32.6594, 35.1100 Pingtang, China, 26.0677, 107.4035 Marin, Spain, 42.3933, -8.7000 Macia, Mozambique, -25.0333, 33.1000 Liushui, China, 32.5959, 108.7479 West Memphis, United States, 35.1530, -90.1996 Meyrin, Switzerland, 46.2167, 6.0667 Heiloo, Netherlands, 52.6000, 4.7167 Juchen, Germany, 51.1011, 6.5017 Rioblanco, Colombia, 3.5000, -75.8333 Baharly, Turkmenistan, 38.4303, 57.4369 Itapora, Brazil, -22.0789, -54.7889 Rodez, France, 44.3506, 2.5750 Zapresic, Croatia, 45.8500, 15.8000 Lexington, United States, 33.9890, -81.2202 Marsella, Colombia, 4.9167, -75.7500 Isa, Japan, 32.0569, 130.6131 Nixa, United States, 37.0453, -93.2959 Marple, United States, 39.9654, -75.3657 Salvaterra, Brazil, -0.7528, -48.5169 Korostyshiv, Ukraine, 50.3167, 29.0667 Collinsville, United States, 38.6770, -90.0063 Loha, India, 18.9623, 77.1309 Shelbyville, United States, 35.4987, -86.4517 Oleshky, Ukraine, 46.6167, 32.7167 Tiruvattar, India, 8.3307, 77.2673 Anjozorobe, Madagascar, -18.3952, 47.8834 San Agustin, Philippines, 12.5689, 122.1314 Sundararaopeta, India, 16.5193, 80.6305 Vrbas, Serbia, 45.5667, 19.6500 Takelsa, Tunisia, 36.7833, 10.6333 Wekiwa Springs, United States, 28.6984, -81.4251 Paraopeba, Brazil, -19.2739, -44.4039 Tayyibat al Imam, Syria, 35.2659, 36.7122 Bontoc, Philippines, 17.0900, 120.9772 Plymstock, United Kingdom, 50.3569, -4.0900 Espera Feliz, Brazil, -20.6500, -41.9069 Jaisinghpur, India, 26.6318, 84.7855 Ryde, United Kingdom, 50.7271, -1.1618 Medjez el Bab, Tunisia, 36.6436, 9.6042 Emporia, United States, 38.4028, -96.1932 As Sulayyil, Saudi Arabia, 20.4623, 45.5722 Barnstaple, United Kingdom, 51.0800, -4.0600 Areia Branca, Brazil, -4.9558, -37.1369 Qiloane, Lesotho, -29.3625, 27.6319 Vicosa, Brazil, -9.3714, -36.2408 Cogua, Colombia, 5.0667, -73.9833 Monte Siao, Brazil, -22.4328, -46.5728 Korbach, Germany, 51.2833, 8.8667 Lagoa Grande, Brazil, -8.9969, -40.2719 Fresno, United States, 29.5357, -95.4696 Mirandola, Italy, 44.8873, 11.0660 Deyr, Iran, 27.8403, 51.9400 Montevarchi, Italy, 43.5234, 11.5679 Vicente Lopez, Argentina, -34.5333, -58.4750 Santa Maria Colotepec, Mexico, 15.8833, -96.9167 Zernograd, Russia, 46.8500, 40.3167 Ormskirk, United Kingdom, 53.5665, -2.8869 Goias, Brazil, -15.9339, -50.1400 Middletown, United States, 39.4450, -75.7183 Morfou, Cyprus, 35.1981, 32.9939 Zaragoza, Colombia, 7.4940, -74.8710 Laon, France, 49.5639, 3.6244 Bay Point, United States, 38.0329, -121.9615 Sangrampur, India, 26.4752, 84.6898 Papillion, United States, 41.1511, -96.0665 Balete, Philippines, 14.0200, 121.1000 Quezon, Philippines, 16.4894, 121.2639 Skoura, Morocco, 31.0606, -6.5556 Boo, Sweden, 59.3333, 18.2833 Coral Terrace, United States, 25.7464, -80.3049 Senboku, Japan, 39.7017, 140.7315 Arttuvattala, India, 9.5167, 76.3167 Mina, Philippines, 10.9300, 122.5800 Tangcun, China, 37.4172, 115.8410 Rita, Costa Rica, 10.4337, -83.7530 Whitehaven, United Kingdom, 54.5480, -3.5855 Siswa, India, 26.7027, 84.9133 Suleswaranpatti, India, 10.6388, 77.0084 Tegina, Nigeria, 10.0706, 6.1906 Sakai, Japan, 36.1085, 139.7949 Sanando, Mali, 12.9672, -6.4083 Saint-Lin--Laurentides, Canada, 45.8500, -73.7667 Kourou, French Guiana, 5.1600, -52.6499 Severouralsk, Russia, 60.1500, 59.9667 White Bear Lake, United States, 45.0656, -93.0150 Independencia, Brazil, -5.3958, -40.3089 Ipala, Guatemala, 14.6191, -89.6226 Pontinha, Portugal, 38.7678, -9.1994 Koscian, Poland, 52.0833, 16.6500 Veranopolis, Brazil, -28.9358, -51.5489 Siofok, Hungary, 46.9000, 18.0500 Atar, Mauritania, 20.5167, -13.0500 Gardner, United States, 38.8122, -94.9275 Yadiki, India, 15.0500, 77.8800 Tehri, India, 30.3800, 78.4800 Soamanandrariny, Madagascar, -19.6510, 47.2792 Ambatotsipihina, Madagascar, -19.6514, 47.7505 Sheghnan, Afghanistan, 37.6167, 71.4500 East Retford, United Kingdom, 53.3228, -0.9431 Maheshwar, India, 22.1100, 75.3500 Payipira, India, 10.0250, 76.5569 Bcharre, Lebanon, 34.2511, 36.0111 Ambohimandroso, Madagascar, -19.5239, 47.4320 Lopary, Madagascar, -23.1973, 47.6714 Antanimieva, Madagascar, -22.2457, 43.7711 Miarinarivo, Madagascar, -17.6447, 49.1723 Tsiatosika, Madagascar, -21.2021, 48.2257 Antonibe, Madagascar, -15.1195, 47.3928 La Palma, El Salvador, 14.3167, -89.1667 Chirilagua, El Salvador, 13.2167, -88.1386 Badou, Togo, 7.5833, 0.6000 Niamtougou, Togo, 9.7667, 1.1000 Itigi, Tanzania, -5.7000, 34.4833 Butaleja, Uganda, 0.9250, 33.9450 Chinobod, Uzbekistan, 40.8767, 71.9725 Jalolquduq, Uzbekistan, 40.7194, 72.6428 Brambleton, United States, 38.9803, -77.5323 Conil de la Frontera, Spain, 36.2667, -6.0833 Caazapa, Paraguay, -26.2000, -56.3800 North Potomac, United States, 39.0955, -77.2373 Quellon, Chile, -43.0992, -73.5961 Maxcanu, Mexico, 20.5833, -89.9833 Kazincbarcika, Hungary, 48.2531, 20.6456 Sikandarpur, India, 26.0333, 84.0500 Westerstede, Germany, 53.2500, 7.9167 South Elgin, United States, 41.9906, -88.3135 Elmwood Park, United States, 41.9225, -87.8163 Jardim, Brazil, -21.4800, -56.1378 Cachoeira do Arari, Brazil, -1.0108, -48.9628 Rolling Meadows, United States, 42.0747, -88.0252 Burlington, United States, 40.0641, -74.8394 Cavinti, Philippines, 14.2450, 121.5070 Taiyangxi, China, 30.8500, 111.0000 Pennadam, India, 11.4039, 79.2416 Bloomingdale, United States, 27.8784, -82.2624 San Pedro, Costa Rica, 9.9332, -84.0470 Huilong, China, 28.1887, 106.2086 Huilongping, China, 28.1889, 106.2086 Laranjeiras, Brazil, -10.8061, -37.1717 Rickmansworth, United Kingdom, 51.6383, -0.4659 Kamiamakusa, Japan, 32.5875, 130.4306 General Emilio Aguinaldo, Philippines, 14.1800, 120.8000 Peshtera, Bulgaria, 42.0330, 24.3000 Solon, United States, 41.3865, -81.4400 Dabaga, Niger, 17.2682, 8.1012 Embarcacion, Argentina, -23.2167, -64.1000 Shahpur, India, 21.2374, 76.2256 Stassfurt, Germany, 51.8667, 11.5667 Altea, Spain, 38.5986, -0.0519 Laguna Salada, Dominican Republic, 19.6500, -71.0833 Acton, United States, 42.4843, -71.4378 Sao Goncalo do Sapucai, Brazil, -21.8919, -45.5950 Bom Jesus, Brazil, -18.2150, -49.7419 Littleover, United Kingdom, 52.9060, -1.5050 Santa Quiteria do Maranhao, Brazil, -3.5158, -42.5469 Newport, United Kingdom, 50.7010, -1.2883 Raritan, United States, 40.5070, -74.8662 Wil, Switzerland, 47.4664, 9.0497 Plainsboro, United States, 40.3377, -74.5879 Goirle, Netherlands, 51.5203, 5.0671 Neduvattur, India, 8.9931, 76.7500 Alfter, Germany, 50.7356, 7.0092 Ambohimahamasina, Madagascar, -21.9339, 47.1858 Pilar do Sul, Brazil, -23.8128, -47.7158 Urucurituba, Brazil, -3.1308, -58.1550 Kingston, United States, 41.9295, -73.9968 Easley, United States, 34.8188, -82.5827 Itaporanga, Brazil, -7.3039, -38.1500 Starnberg, Germany, 47.9972, 11.3406 Arbroath, United Kingdom, 56.5610, -2.5860 Tsawwassen, Canada, 49.0436, -123.0985 Willoughby, United States, 41.6459, -81.4084 Bulusan, Philippines, 12.7522, 124.1356 Sao Joao da Ponte, Brazil, -15.9289, -44.0078 Belo Oriente, Brazil, -19.2200, -42.4839 Sighisoara, Romania, 46.2169, 24.7911 Solin, Croatia, 43.5394, 16.4831 Mapoteng, Lesotho, -29.1097, 27.9739 Wijk bij Duurstede, Netherlands, 51.9742, 5.3417 Puyappalli, India, 8.9000, 76.7500 Limbach-Oberfrohna, Germany, 50.8667, 12.7500 Jucas, Brazil, -6.5250, -39.5278 El Zulia, Colombia, 7.9333, -72.6000 Douar Bou Tlelis, Algeria, 35.5730, -0.9000 Koulikoro, Mali, 12.8833, -7.5500 Chandlers Ford, United Kingdom, 50.9840, -1.3792 Hajduszoboszlo, Hungary, 47.4500, 21.3833 Manlio Fabio Altamirano, Mexico, 19.1003, -96.3411 Umbauba, Brazil, -11.3828, -37.6578 Iraucuba, Brazil, -3.7458, -39.7828 Mnasra, Morocco, 34.3603, -6.5508 Sendamangalam, India, 11.2825, 78.2339 Sudbury, United Kingdom, 52.0417, 0.7282 Zolochiv, Ukraine, 49.8075, 24.9031 Hatonuevo, Colombia, 11.0694, -72.7669 Sao Joao do Paraiso, Brazil, -15.3139, -42.0139 Buritizeiro, Brazil, -17.3508, -44.9619 Pompei, Italy, 40.7500, 14.5000 San Nicolas, Philippines, 13.9283, 120.9510 Porto Franco, Brazil, -6.3378, -47.3989 Zwedru, Liberia, 6.0667, -8.1333 Miguel Pereira, Brazil, -22.4539, -43.4689 Tacaratu, Brazil, -9.1058, -38.1500 Falticeni, Romania, 47.4597, 26.3000 Paxtakor Shahri, Uzbekistan, 40.3153, 67.9544 Katy, United States, 29.7905, -95.8353 Brotas, Brazil, -22.2839, -48.1269 Mejorada del Campo, Spain, 40.3967, -3.3858 Gungu, Congo (Kinshasa), -5.7333, 19.3167 Tantoyuca, Mexico, 21.3500, -98.2333 Lebedyn, Ukraine, 50.5831, 34.4822 Hadzici, Bosnia and Herzegovina, 43.8236, 18.2211 Montgeron, France, 48.7039, 2.4605 Matabhanga, India, 26.3300, 89.2200 Xiawuqi, China, 39.6156, 117.0553 Mulgund, India, 15.2807, 75.5213 Cibitoke, Burundi, -2.8886, 29.1200 Maimon, Dominican Republic, 18.7700, -70.3300 Caversham, United Kingdom, 51.4670, -0.9730 Seveso, Italy, 45.6434, 9.1374 Noqui, Angola, -5.8681, 13.4325 Macaparana, Brazil, -7.5550, -35.4528 Iraquara, Brazil, -12.2489, -41.6189 Peringuzha, India, 9.9667, 76.4167 Yanbu, Taiwan, 22.7544, 120.5724 Karian, India, 25.8594, 86.0104 Strathroy-Caradoc, Canada, 42.9575, -81.6167 Subaykhan, Syria, 34.8530, 40.5999 Arnold, United States, 39.0437, -76.4974 Seaford, United Kingdom, 50.7700, 0.1000 Buon Trap, Vietnam, 12.4833, 108.0167 Koilkuntla, India, 15.2333, 78.3167 Matriz de Camarajibe, Brazil, -9.1519, -35.5328 Dunleary, Ireland, 53.3000, -6.1400 Ourikela, Mali, 12.1097, -5.0628 Mansfield, United States, 42.0163, -71.2187 Lihe, China, 33.9312, 105.2682 Herohalli, India, 12.9911, 77.4873 Magallanes, Philippines, 14.1800, 120.7500 Somerset, United States, 40.5083, -74.5010 Mirandela, Portugal, 41.4833, -7.1833 Oadby, United Kingdom, 52.5987, -1.0763 Raymore, United States, 38.8029, -94.4583 Oulad Salmane, Morocco, 34.3356, -6.4604 Zegzel, Morocco, 34.8407, -2.3543 Hopa, Turkey, 41.3903, 41.4194 Pilar de la Horadada, Spain, 37.8667, -0.7833 Jurh, China, 44.6833, 120.5167 Gelnhausen, Germany, 50.2000, 9.1667 Ksar el Hirane, Algeria, 33.7833, 3.1500 Caras, Peru, -9.0472, -77.7433 Az Zuwaydah, Gaza Strip, 31.4395, 34.3805 Cranford, United States, 40.6564, -74.3036 Mulakumud, India, 8.2681, 77.2860 Cruzeiro do Oeste, Brazil, -23.7850, -53.0728 Honda, Colombia, 5.2042, -74.7417 Annur, India, 11.2325, 77.1069 Makhmur, Iraq, 35.7833, 43.5833 Pickerington, United States, 39.8890, -82.7678 Vilaseca de Solcina, Spain, 41.1108, 1.1450 Ozery, Russia, 54.8500, 38.5667 Diest, Belgium, 50.9847, 5.0514 San Miguel Ocotenco, Mexico, 19.0666, -97.4525 Ciudad Serdan, Mexico, 18.9833, -97.4500 Pao de Acucar, Brazil, -9.7478, -37.4369 Atotonilco el Grande, Mexico, 20.6667, -98.6667 Phetchabun, Thailand, 16.4169, 101.1533 Quesada, Guatemala, 14.2667, -90.0333 Kasongo-Lunda, Congo (Kinshasa), -6.4783, 16.8166 Encruzilhada do Sul, Brazil, -30.5439, -52.5219 Squamish, Canada, 49.7017, -123.1589 Thorold, Canada, 43.1167, -79.2000 Husum, Germany, 54.4667, 9.0500 Firuzoba, Tajikistan, 40.3000, 70.4000 Carandai, Brazil, -20.9539, -43.8058 Kuju, India, 23.7254, 85.5102 Kalawit, Philippines, 7.9051, 122.5279 Dongsheng, China, 36.9996, 105.0029 Hungund, India, 16.0621, 76.0586 Kumar Khad, India, 26.5918, 86.2640 Catigbian, Philippines, 9.8300, 124.0300 Southold, United States, 41.0432, -72.4185 Chiroqchi, Uzbekistan, 39.0336, 66.5739 Burlington, United States, 40.8071, -91.1247 Raahe, Finland, 64.6833, 24.4667 Sulya, India, 12.5610, 75.3874 Misato, Japan, 38.5444, 141.0567 Bithar, India, 26.6294, 85.7697 Thiene, Italy, 45.7072, 11.4786 Frontignan, France, 43.4483, 3.7561 Bayonet Point, United States, 28.3254, -82.6834 Lawang Bato, Philippines, 14.7300, 120.9961 Fada, Chad, 17.1833, 21.5833 Gaojiayingcun, China, 40.8814, 114.9662 Ituango, Colombia, 7.1717, -75.7642 Dole, France, 47.0931, 5.4906 Dakor, India, 22.7500, 73.1500 Vallabh Vidyanagar, India, 22.5600, 72.9500 Stepanavan, Armenia, 41.0096, 44.3841 El Tejar, Guatemala, 14.6500, -90.8000 Stroitel, Russia, 50.7833, 36.4833 Agrestina, Brazil, -8.4500, -35.9500 Tirumala, India, 13.6833, 79.3500 Hoh Ereg, China, 41.0955, 111.4408 Kagal, India, 16.5800, 74.3200 Ishiki, Japan, 34.8167, 137.0333 Velingara, Senegal, 13.1500, -14.1167 Besikduzu, Turkey, 41.0494, 39.2353 Roseburg, United States, 43.2231, -123.3520 Baliguian, Philippines, 7.8088, 122.1452 Webster Groves, United States, 38.5866, -90.3544 Belton, United States, 31.0525, -97.4790 Fountain Hills, United States, 33.6073, -111.7398 Akwatia, Ghana, 6.0402, -0.8088 Basankusu, Congo (Kinshasa), 1.2222, 19.8028 Manari, Brazil, -8.9639, -37.6278 Verukulambu, India, 8.2953, 77.2939 Oldebroek, Netherlands, 52.4667, 5.9167 De Aar, South Africa, -30.6500, 24.0167 Santa Apolonia, Guatemala, 14.7833, -90.9667 Candoni, Philippines, 9.8200, 122.6000 Burgos, Philippines, 16.0465, 119.8568 Highland, United States, 41.5483, -87.4588 Havlickuv Brod, Czechia, 49.6078, 15.5808 Limbuhan, Philippines, 11.8836, 124.0497 Chantilly, United States, 38.8868, -77.4453 Hachimantai, Japan, 39.9561, 141.0711 Elukone, India, 8.9667, 76.7167 Lalgudi, India, 10.8712, 78.8197 Avanigadda, India, 16.0197, 80.9200 Birpur, India, 26.5082, 87.0119 Nocera Superiore, Italy, 40.7417, 14.6722 Vizela, Portugal, 41.3833, -8.3000 Munster, United States, 41.5468, -87.5040 Huntingdon, United Kingdom, 52.3364, -0.1717 Mummidivaram, India, 16.6500, 82.1167 Fria, Guinea, 10.3804, -13.5500 Dobeln, Germany, 51.1194, 13.1128 Karachayevsk, Russia, 43.7731, 41.9169 Alice Springs, Australia, -23.7000, 133.8700 San Giovanni la Punta, Italy, 37.5833, 15.1000 Koscierzyna, Poland, 54.1167, 17.9833 Lebu, Chile, -37.6000, -73.6667 Norresundby, Denmark, 57.0483, 9.9352 La Reforma, Guatemala, 14.8000, -91.8167 Puduva, India, 9.9770, 76.2260 San Fernando, United States, 34.2886, -118.4362 Aurora, Brazil, -6.9428, -38.9678 Dasungezhuang, China, 40.0839, 116.9219 Brookings, United States, 44.3022, -96.7859 Devikolam, India, 10.0626, 77.1040 Muluppilagadu, India, 11.8000, 75.4500 Karavalur, India, 8.9833, 76.9250 Ouardenine, Tunisia, 35.7200, 10.6700 Sarkisla, Turkey, 39.3500, 36.4000 Oji, Japan, 34.5892, 135.7233 Tangalan, Philippines, 11.7775, 122.2603 Stanmore, United Kingdom, 51.6180, -0.3140 Nesher, Israel, 32.7711, 35.0394 Salqin, Syria, 36.1387, 36.4524 Chinoz, Uzbekistan, 40.9375, 68.7578 Shama, Ghana, 5.0041, -1.6421 Sezze, Italy, 41.5000, 13.0667 Miantso, Madagascar, -18.7169, 47.1323 Maldegem, Belgium, 51.2000, 3.4333 Droylsden, United Kingdom, 53.4828, -2.1582 San Juan Otzolotepec, Mexico, 17.2984, -95.4918 Taylors, United States, 34.9157, -82.3124 Tianmingsi, China, 32.9784, 107.2947 Le Kremlin-Bicetre, France, 48.8100, 2.3581 Silappadi, India, 10.3940, 78.0078 Anupshahr, India, 28.3700, 78.2700 Farmington, United States, 44.6572, -93.1687 Sanaur, India, 30.3018, 76.4579 Santo Antonio do Sudoeste, Brazil, -26.0700, -53.7228 Dalyoni Bolo, Tajikistan, 39.7422, 68.9944 Borne, Netherlands, 52.3000, 6.7500 San Lorenzo, Nicaragua, 12.3667, -85.6667 Orleaes, Brazil, -28.3589, -49.2908 La Valette-du-Var, France, 43.1383, 5.9831 Bonito, Brazil, -21.1333, -56.4833 Independencia, Bolivia, -16.5000, -66.5833 Alangulam, India, 8.8640, 77.4994 Yellapur, India, 14.9637, 74.7093 Hodonin, Czechia, 48.8489, 17.1325 Yuanchang, Taiwan, 23.6420, 120.3229 Kunnada, India, 9.2333, 76.6667 North Lynnwood, United States, 47.8533, -122.2762 Perry Barr, United Kingdom, 52.5249, -1.9042 Sredneuralsk, Russia, 56.9833, 60.4667 Griffin, United States, 33.2418, -84.2748 Mosbach, Germany, 49.3522, 9.1467 Marshall, United States, 32.5370, -94.3515 Araquari, Brazil, -26.3700, -48.7219 Rajpur, India, 21.9402, 75.1361 Montgomery, United States, 40.4260, -74.6791 Freeport, United States, 42.2891, -89.6346 Fernley, United States, 39.5627, -119.1906 Ahualulco de Mercado, Mexico, 20.6167, -103.8667 Bang Sao Thong, Thailand, 13.5950, 100.8304 Chandrakona, India, 22.7300, 87.5200 Tecali, Mexico, 18.9000, -97.9667 Pitogo, Philippines, 10.1210, 124.5530 Taupo, New Zealand, -38.6900, 176.0800 Beni Amrane, Algeria, 36.6667, 3.5833 Berhoum, Algeria, 35.6500, 5.0333 Gosforth, United Kingdom, 55.0070, -1.6230 Melissia, Greece, 38.0500, 23.8333 Cartersville, United States, 34.1644, -84.8009 Columbus, United States, 33.5088, -88.4096 Mannamturuttu, India, 9.9008, 76.3900 Santa Gertrudes, Brazil, -22.4569, -47.5300 Ladera Ranch, United States, 33.5492, -117.6417 Dunaharaszti, Hungary, 47.3553, 19.0844 Yesagyo, Burma, 21.6333, 95.2414 Jacksonville Beach, United States, 30.2782, -81.4045 Kenmore, United States, 47.7516, -122.2489 Luninyets, Belarus, 52.2500, 26.8000 Leutkirch im Allgau, Germany, 47.8256, 10.0222 Tapiales, Argentina, -34.7058, -58.5047 Ogawara, Japan, 38.0494, 140.7308 Kulgam, India, 33.6400, 75.0200 Shamsabad, India, 27.5364, 79.4394 Uvarovo, Russia, 51.9833, 42.2667 Truro, Canada, 45.3647, -63.2800 Kyeintali, Burma, 18.0061, 94.4900 Oostkamp, Belgium, 51.1500, 3.2333 Newton Abbot, United Kingdom, 50.5290, -3.6100 Kebila, Mali, 11.2833, -7.0333 Bedford, United States, 42.9406, -71.5302 Lustenau, Austria, 47.4297, 9.6597 Perungudi, India, 8.2792, 77.6031 Alhama de Murcia, Spain, 37.8514, -1.4264 Dakovo, Croatia, 45.3083, 18.4106 Argostoli, Greece, 38.1733, 20.4908 San Martin Totolan, Mexico, 19.9852, -102.6802 Cerro Azul, Mexico, 21.1920, -97.7409 Kotturu, India, 17.0436, 81.7705 Amstetten, Austria, 48.1167, 14.8667 San Ignacio de Velasco, Bolivia, -16.3667, -60.9500 Eustis, United States, 28.8563, -81.6771 Muscatine, United States, 41.4195, -91.0680 Tamandare, Brazil, -8.7600, -35.1050 Monsefu, Peru, -6.8778, -79.8719 Toda Rai Singh, India, 26.0167, 75.4833 Peravur, India, 11.8962, 75.7342 Bauta, Cuba, 22.9919, -82.5492 Castiglione delle Stiviere, Italy, 45.4000, 10.5000 Heverlee, Belgium, 50.8600, 4.6900 Gollapudi, India, 16.5412, 80.5784 Dhing, India, 26.4679, 92.4734 Staraya Kupavna, Russia, 55.8000, 38.1667 Moguer, Spain, 37.0000, 16.0000 Ma`alot Tarshiha, Israel, 33.0167, 35.2708 Codajas, Brazil, -3.8369, -62.0569 Tata, Hungary, 47.6500, 18.3167 Belsand, India, 26.4436, 85.4008 Gerede, Turkey, 40.8006, 32.1986 Bambui, Brazil, -20.0058, -45.9769 Van Buren, United States, 35.4483, -94.3528 Coueron, France, 47.2156, -1.7228 Kerkyra, Greece, 39.6239, 19.9214 Bishopbriggs, United Kingdom, 55.9046, -4.2250 Sao Miguel, Brazil, -6.2119, -38.4969 Khelil, Algeria, 36.1756, 5.0292 Nyuzen, Japan, 36.9335, 137.5021 Xiaojiangcun, China, 24.6168, 112.5945 Xiaping, China, 24.6725, 112.6106 El Paso, Colombia, 9.6622, -73.7519 Dillenburg, Germany, 50.7333, 8.2833 Jaleshwar, Nepal, 26.6500, 85.8000 Corinto, Brazil, -18.3808, -44.4558 Ayt Mohamed, Morocco, 32.5667, -6.9833 Yangi Marg`ilon, Uzbekistan, 40.4311, 71.7183 Dumaran, Philippines, 10.5300, 119.7700 Honavar, India, 14.2809, 74.4450 General Panfilo Natera, Mexico, 22.6650, -102.1097 Amherstburg, Canada, 42.1000, -83.0833 Roissy-en-Brie, France, 48.7906, 2.6519 East San Gabriel, United States, 34.1157, -118.0791 Canalete, Colombia, 8.7900, -76.2411 Chester, United States, 37.3531, -77.4342 Cupira, Brazil, -8.6169, -35.9500 Ban Phru, Thailand, 6.9514, 100.4723 Sastamala, Finland, 61.3417, 22.9083 At Tafilah, Jordan, 30.8375, 35.6044 Pesochin, Ukraine, 49.9594, 36.1108 Loon op Zand, Netherlands, 51.6275, 5.0758 Kadavur, India, 9.3436, 76.5347 Mujui dos Campos, Brazil, -2.6847, -54.6403 Quarai, Brazil, -30.3878, -56.4508 Arukutti, India, 9.8309, 76.4270 Miyoshi, Japan, 34.0260, 133.8072 Muang Sing, Laos, 21.2000, 101.1500 Suonan, China, 35.6633, 103.3900 Nayanakulam, India, 9.9611, 78.1371 Karatas, Turkey, 36.5625, 35.3803 Ringsted, Denmark, 55.4411, 11.8094 Pakil, Philippines, 14.3800, 121.4800 Port Laoise, Ireland, 53.0309, -7.3008 Gersthofen, Germany, 48.4167, 10.8667 Jocotenango, Guatemala, 14.5819, -90.7436 Clinton, United States, 41.1395, -112.0656 Cuyo, Philippines, 10.8500, 121.0200 Padre Burgos, Philippines, 13.9226, 121.8116 Eastmont, United States, 47.8968, -122.1818 Fleet, United Kingdom, 51.2834, -0.8456 Matinha, Brazil, -3.1006, -45.0336 Oued el Djemaa, Algeria, 35.7972, 0.6814 Koili Simra, India, 25.4714, 87.2175 Yugawara, Japan, 35.1500, 139.0667 Carmo do Cajuru, Brazil, -20.1839, -44.7708 Kaltenkirchen, Germany, 53.8397, 9.9603 Chanaur, India, 25.8510, 86.6739 Bloemendaal, Netherlands, 52.4000, 4.6000 Gauripur, India, 26.0800, 89.9700 Francisco Sa, Brazil, -16.4777, -43.4943 Kharupatia, India, 26.5184, 92.1472 Monte Caseros, Argentina, -30.2500, -57.6500 Maharlika Village, Philippines, 14.4974, 121.0555 Bonoufla, Côte d’Ivoire, 7.1291, -6.4742 Kidsgrove, United Kingdom, 53.0874, -2.2478 Kyenjojo, Uganda, 0.6100, 30.6442 Dank, Oman, 23.5505, 56.2573 Muggio, Italy, 45.5864, 9.2259 Gazojak, Turkmenistan, 41.1833, 61.4000 Sinj, Croatia, 43.7017, 16.6369 Champlin, United States, 45.1702, -93.3903 Beni Rached, Algeria, 36.2806, 1.5161 Madangir, India, 28.3553, 76.9327 Rosemont, United States, 38.5478, -121.3553 Kedainiai, Lithuania, 55.2833, 23.9667 Minamikarasuyama, Japan, 35.6683, 139.6012 Cherry Hill, United States, 38.5696, -77.2895 L'Assomption, Canada, 45.8333, -73.4167 Chrudim, Czechia, 49.9511, 15.7956 Brent, United States, 30.4727, -87.2495 Rampura, India, 24.4670, 75.4400 Sonneberg, Germany, 50.3500, 11.1667 Nasu, Japan, 37.0198, 140.1210 Dafni, Greece, 37.9500, 23.7333 Netphen, Germany, 50.9147, 8.1000 Sakhipur, Bangladesh, 24.3199, 90.1694 Elburg, Netherlands, 52.4500, 5.8333 Lubliniec, Poland, 50.6833, 18.6833 Kilindoni, Tanzania, -7.9167, 39.6500 Badnawar, India, 23.0218, 75.2327 Raul Soares, Brazil, -20.1019, -42.4528 Douzhangzhuang, China, 39.3986, 116.9417 Pissila, Burkina Faso, 13.1667, -0.8167 Maychew, Ethiopia, 12.7833, 39.5333 Hannoversch Munden, Germany, 51.4167, 9.6500 Kailashahar, India, 24.3300, 92.0200 Sattahip, Thailand, 12.6664, 100.9007 Blue Island, United States, 41.6578, -87.6811 Upper Allen, United States, 40.1800, -76.9808 San Buenaventura, Mexico, 27.0625, -101.5467 Lisle, United States, 41.7918, -88.0888 Srvanampatti, India, 11.0764, 77.0045 Santa Rosa de Viterbo, Brazil, -21.4728, -47.3628 Teguise, Spain, 29.0500, -13.5667 Niskayuna, United States, 42.8030, -73.8729 Al `Aziziyah, Libya, 32.5308, 13.0211 Binh Hoa, Vietnam, 10.9353, 106.8614 Burhar, India, 23.2149, 81.5320 Salzwedel, Germany, 52.8500, 11.1500 Galikesh, Iran, 37.2728, 55.4328 Ban Thoet Thai, Thailand, 20.3084, 99.6445 Pottstown, United States, 40.2508, -75.6445 Pindoretama, Brazil, -4.0278, -38.3058 Svilajnac, Serbia, 44.2167, 21.2000 Kafr Shukr, Egypt, 30.5470, 31.2673 Makouda, Algeria, 36.7833, 4.0667 Meda, Italy, 45.6667, 9.1667 Sluis, Netherlands, 51.3089, 3.3883 Rio Hondo, Guatemala, 15.0464, -89.5847 Teorama, Colombia, 8.4333, -72.2833 Ponda, India, 15.4034, 74.0152 Weilheim, Germany, 47.8333, 11.1500 Selimpasa, Turkey, 41.0540, 28.3670 Kitzingen, Germany, 49.7333, 10.1667 Albenga, Italy, 44.0491, 8.2130 Almeirim, Portugal, 39.2090, -8.6164 Glassboro, United States, 39.7014, -75.1113 Zarautz, Spain, 43.2833, -2.1667 Giulianova, Italy, 42.7525, 13.9567 El Hajeb, Morocco, 33.6928, -5.3711 Vanimel, India, 11.7197, 75.6990 Gamay, Philippines, 12.3800, 125.3000 Bultfontein, South Africa, -28.2869, 26.1506 Buri Ram, Thailand, 14.9942, 103.1022 Canico, Portugal, 32.6412, -16.8504 Fairhope, United States, 30.5209, -87.8813 Barbasa, Philippines, 11.1961, 122.0389 Beni Khalled, Tunisia, 36.6500, 10.6000 Quang Tri, Vietnam, 16.7469, 107.1940 Dighwa, India, 26.2437, 84.7532 Sakleshpur, India, 12.8930, 75.7250 Montecchio Maggiore, Italy, 45.5037, 11.4120 Takehara, Japan, 34.3417, 132.9069 Pitea, Sweden, 65.3333, 21.5000 Maple Heights, United States, 41.4094, -81.5625 Sandwa, India, 27.7500, 74.1667 Avellaneda, Argentina, -29.1175, -59.6583 Tazhava, India, 9.0833, 76.5333 Madappalli, India, 9.0833, 76.5333 Sokolo, Mali, 14.7328, -6.1219 Maigo, Philippines, 8.1500, 123.9700 Warburg, Germany, 51.5000, 9.1697 Piravanthur, India, 9.0500, 76.9167 Watauga, United States, 32.8719, -97.2515 Saint-Ghislain, Belgium, 50.4500, 3.8167 Mandawa, India, 28.0554, 75.1483 Copiague, United States, 40.6707, -73.3922 Coronel Vivida, Brazil, -25.9800, -52.5678 Antanimasaka, Madagascar, -16.2355, 46.5121 Keflavik, Iceland, 64.0167, -22.5667 Dongshi, Taiwan, 23.4748, 120.1769 Zemst, Belgium, 50.9722, 4.4222 Berehove, Ukraine, 48.2056, 22.6472 Godalming, United Kingdom, 51.1855, -0.6155 Collipulli, Chile, -37.9500, -72.4333 Nagold, Germany, 48.5519, 8.7256 Ambohimiadana, Madagascar, -19.2438, 47.7758 Horgen, Switzerland, 47.2608, 8.5975 Wertheim, Germany, 49.7589, 9.5175 Minja, India, 12.7083, 74.9500 Westerly, United States, 41.3635, -71.7899 Dalmine, Italy, 45.6500, 9.6000 Sai Mai, Thailand, 13.9207, 100.6455 Capinzal, Brazil, -27.3439, -51.6119 Pelitli, Turkey, 40.9833, 39.8000 Edgewater, United States, 28.9594, -80.9406 Jieshang, China, 26.2663, 104.6671 Ron, India, 15.6700, 75.7300 Ikeda, Japan, 35.4423, 136.5730 Calbiga, Philippines, 11.6300, 125.0200 Bazhajiemicun, China, 38.8944, 77.6367 Waverly, United States, 42.7401, -84.6354 Moskva, Tajikistan, 37.6567, 69.6292 Tecumseh, Canada, 42.2431, -82.9256 Santo Tome, Argentina, -28.5500, -56.0500 Tugatog, Philippines, 14.6629, 120.9690 Tobati, Paraguay, -25.2611, -57.0833 Bordj Ghdir, Algeria, 35.9000, 4.8900 Anatuya, Argentina, -28.4667, -62.8333 Goumori, Benin, 11.1833, 2.2833 Aldeias Altas, Brazil, -4.6278, -43.4708 La Cruz de Rio Grande, Nicaragua, 13.1167, -84.1833 Poxoreo, Brazil, -15.8369, -54.3889 Carambei, Brazil, -24.9178, -50.0969 San Rafael Abajo, Costa Rica, 9.8943, -84.0837 Whitefield, United Kingdom, 53.5521, -2.2992 Kedavur, India, 11.4167, 75.9333 Cesky Tesin, Czechia, 49.7461, 18.6261 Senftenberg, Germany, 51.5167, 14.0167 Piastow, Poland, 52.1833, 20.8500 West Goshen, United States, 39.9756, -75.5927 San Jose, Colombia, 1.4744, -77.0836 Quedlinburg, Germany, 51.7917, 11.1472 Rathfarnham, Ireland, 53.3006, -6.2828 Monteros, Argentina, -27.1667, -65.5000 Bingley, United Kingdom, 53.8460, -1.8360 Teodoro Sampaio, Brazil, -22.5325, -52.1675 Mulampilli, India, 10.1083, 76.4167 Union Hill-Novelty Hill, United States, 47.6788, -122.0284 Telica, Nicaragua, 12.5167, -86.8667 Vreden, Germany, 52.0333, 6.8333 Cockeysville, United States, 39.4804, -76.6294 Krychaw, Belarus, 53.7194, 31.7139 Les Lilas, France, 48.8800, 2.4200 Tekari, India, 24.9425, 84.8427 Cajidiocan, Philippines, 12.3700, 122.6800 La Higuerita, Mexico, 19.4833, -104.6500 La Huerta, Mexico, 19.4844, -104.6438 Maibog, Philippines, 10.1500, 125.0000 Karben, Germany, 50.2322, 8.7681 Alliston, Canada, 44.1500, -79.8667 Dammarie-le-Lys, France, 48.5177, 2.6402 Tsaratanana, Madagascar, -21.1788, 47.6384 Neusass, Germany, 48.4000, 10.8333 Kant, Kyrgyzstan, 42.8833, 74.8500 Piritu, Venezuela, 10.0395, -65.0304 Rastede, Germany, 53.2500, 8.2000 Bad Kissingen, Germany, 50.2000, 10.0667 Santo Antonio de Posse, Brazil, -22.6058, -46.9189 Uberlingen, Germany, 47.7667, 9.1650 Motul, Mexico, 21.1667, -89.4667 Morris, United States, 40.7959, -74.4945 North Salt Lake, United States, 40.8439, -111.9187 Grande Saline, Haiti, 19.2500, -72.7833 Mine, Japan, 34.1631, 131.2083 Montgomery, United States, 41.5399, -74.2073 Xunjiansi, China, 23.9586, 103.1939 Friesoythe, Germany, 53.0206, 7.8586 Vaikam, India, 9.7500, 76.3928 Mantua, Cuba, 22.2908, -84.2875 Kun Puhal, India, 33.0058, 76.5334 Rock Springs, United States, 41.5947, -109.2209 Calamba, Philippines, 8.5583, 123.6417 Wareham, United States, 41.7662, -70.6999 Loanda, Brazil, -22.9228, -53.1369 Samrala, India, 30.8360, 76.1932 Mizdah, Libya, 31.4450, 12.9831 Linda, United States, 39.1241, -121.5421 Kedia, India, 23.7945, 85.5872 Culion, Philippines, 11.8944, 120.0186 Sheyban, Iran, 31.4061, 48.7944 Nakashunbetsu, Japan, 43.5500, 144.9667 Polonne, Ukraine, 50.1200, 27.5078 Athens, United States, 39.3270, -82.0987 Fergus, Canada, 43.7070, -80.3777 Kelishad va Sudarjan, Iran, 32.5489, 51.5286 Patakakani, India, 16.3400, 80.4908 Sevan, Armenia, 40.5550, 44.9536 Amarapura, Burma, 21.9000, 96.0500 Manambur, India, 8.7206, 76.7635 Touboro, Cameroon, 7.7708, 15.3567 Puenteareas, Spain, 42.1667, -8.5000 Tekman, Turkey, 39.6450, 41.5083 Wilmington, United States, 42.5609, -71.1654 Tranquebar, India, 11.0292, 79.8494 Rochefort, France, 45.9421, -0.9588 Lanester, France, 47.7647, -3.3422 Kazhukambalam, India, 10.0333, 76.4000 Capoterra, Italy, 39.1752, 8.9709 Loves Park, United States, 42.3364, -88.9975 Itabaiana, Brazil, -7.3289, -35.3328 Bassar, Togo, 9.2500, 0.7833 `Ali Shahr, Iran, 28.9269, 51.0653 Vukovar, Croatia, 45.3500, 19.0033 Bad Soden am Taunus, Germany, 50.1333, 8.5000 Ponmundam, India, 10.9628, 75.9519 Kannamangalam Tekku, India, 9.2167, 76.4833 Maywood, United States, 41.8798, -87.8442 Carmen, Philippines, 9.0000, 125.2600 Kaniv, Ukraine, 49.7500, 31.4667 Colon, Argentina, -33.8833, -61.1000 Pajapita, Guatemala, 14.7167, -92.0333 Tototlan, Mexico, 20.0833, -102.6500 Cottage Lake, United States, 47.7466, -122.0755 Kouoro, Mali, 12.0147, -5.7081 Gitega, Burundi, -3.4260, 29.8436 Tukrah, Libya, 32.5322, 20.5722 Minamata, Japan, 32.2167, 130.4000 Apatin, Serbia, 45.6667, 18.9833 Oakdale, United States, 37.7618, -120.8468 Sonepur, India, 20.8333, 83.9167 Jasmine Estates, United States, 28.2930, -82.6907 Colon, Argentina, -32.2167, -58.1333 Ribas do Rio Pardo, Brazil, -20.4428, -53.7589 Abreus, Cuba, 22.2806, -80.5678 Senden, Germany, 48.3167, 10.0667 Ravulapalem, India, 16.4833, 81.9833 Bialogard, Poland, 54.0000, 15.9833 Bananeiras, Brazil, -6.7500, -35.6328 Shuilin, Taiwan, 23.5662, 120.2340 Brody, Ukraine, 50.0831, 25.1477 Bad Salzungen, Germany, 50.8117, 10.2333 Douar Imoukkane, Morocco, 35.0298, -4.8125 Puerto Concordia, Colombia, 2.6833, -72.7667 Soledad Atzompa, Mexico, 18.7500, -97.1500 Chanthaburi, Thailand, 12.6086, 102.1039 Elgin, United Kingdom, 57.6486, -3.3153 Neihuzhai, China, 22.9748, 115.8345 Lalganj, India, 26.1277, 80.7855 Manage, Belgium, 50.5000, 4.2333 Sao Mamede de Infesta, Portugal, 41.1934, -8.6143 Mahthi, India, 25.7281, 86.0093 Tamiahua, Mexico, 21.2788, -97.4462 Caba, Philippines, 16.4316, 120.3446 Ottaviano, Italy, 40.8500, 14.4775 Searcy, United States, 35.2418, -91.7351 Yasica Arriba, Dominican Republic, 19.6333, -70.6000 Garmisch-Partenkirchen, Germany, 47.5000, 11.0833 Rafael Delgado, Mexico, 18.8167, -97.0667 Los Arabos, Cuba, 22.7400, -80.7161 Ono, Japan, 35.4706, 136.6276 Roxbury, United States, 40.8822, -74.6523 Singhara Buzurg, India, 25.7964, 85.4539 El Ghiate, Morocco, 32.0331, -9.1625 Sansanding, Mali, 13.7253, -6.0042 Fanzeres, Portugal, 41.1667, -8.5333 Vuliyattara, India, 8.5933, 76.9506 Sonari, India, 27.0246, 95.0163 Engandiyur, India, 10.5000, 76.0400 Tupiza, Bolivia, -21.4375, -65.7158 Qiryat Mal'akhi, Israel, 31.7333, 34.7500 La Mornaghia, Tunisia, 36.7667, 10.0167 Hombori, Mali, 15.2789, -1.6978 Gurupa, Brazil, -1.4050, -51.6400 Oxkutzkab, Mexico, 20.3056, -89.4183 San Juan de Aznalfarache, Spain, 37.3667, -6.0167 Sederot, Israel, 31.5250, 34.5969 Hazel Dell, United States, 45.6797, -122.6553 Bafilo, Togo, 9.3500, 1.2667 Mujiayu, China, 40.4097, 116.9325 Khirkiyan, India, 22.1673, 76.8614 Siwah, Egypt, 29.2000, 25.5167 Rucphen, Netherlands, 51.5325, 4.5583 Vilachcheri, India, 9.8937, 78.0603 Qiryat Shemona, Israel, 33.2075, 35.5697 Neftekumsk, Russia, 44.7833, 44.7667 Tnine Lgharbia, Morocco, 32.5719, -8.8568 Vigonza, Italy, 45.4500, 11.9833 Peters, United States, 40.2739, -80.0803 Horizon City, United States, 31.6799, -106.1903 Lengerich, Germany, 52.1750, 7.8667 Pallikondai, India, 12.9167, 78.9333 Yakinca, Turkey, 38.3000, 38.2500 Edewecht, Germany, 53.1258, 7.9825 Orbassano, Italy, 45.0073, 7.5369 Asafabad, India, 19.3650, 79.2740 Haar, Germany, 48.1000, 11.7333 Dom Pedro, Brazil, -5.0328, -44.4358 Warragul, Australia, -38.1500, 145.9333 Achi, Colombia, 8.5667, -74.5500 Velugodu, India, 15.7817, 78.6892 Koussane, Mali, 14.8842, -11.2347 Devonport, Australia, -41.1800, 146.3503 Youwarou, Mali, 15.3683, -4.2628 Laupheim, Germany, 48.2289, 9.8797 Dunajska Streda, Slovakia, 47.9961, 17.6147 Thiotte, Haiti, 18.2438, -71.8416 Trotwood, United States, 39.7926, -84.3165 Buyende, Uganda, 1.1475, 33.1611 Koiri Bigha, India, 25.2167, 85.0667 Ensley, United States, 30.5259, -87.2733 Lysander, United States, 43.1799, -76.3745 Copertino, Italy, 40.2667, 18.0500 Mangidy, Madagascar, -21.2569, 46.7952 Kapolei, United States, 21.3399, -158.0677 Monte Alegre, Brazil, -6.0678, -35.3319 Bataguacu, Brazil, -21.7139, -52.4219 Anjarkandi, India, 11.8822, 75.5097 North Platte, United States, 41.1263, -100.7641 Oliveira do Bairro, Portugal, 40.5167, -8.5000 Dalnerechensk, Russia, 45.9333, 133.7333 Nova Milanese, Italy, 45.5833, 9.2000 Frontera, Mexico, 18.5336, -92.6469 Shiling, China, 27.3576, 105.1535 Tembagapura, Indonesia, -4.1428, 137.0906 Tubungan, Philippines, 10.7800, 122.3000 Curumani, Colombia, 9.2000, -73.5500 Kulattuppalaiyam, India, 10.7613, 77.5843 Ain Dfali, Morocco, 34.5984, -5.5473 Nagykoros, Hungary, 47.0331, 19.7839 Ladner, Canada, 49.0833, -123.0833 Mednogorsk, Russia, 51.4222, 57.5953 Khaira Tola, India, 26.8958, 84.1403 Hudson, United States, 41.2399, -81.4408 Harborne, United Kingdom, 52.4600, -1.9500 Xingang, China, 28.9294, 112.3160 Gyegu, China, 33.0166, 96.7333 Zhaoling, China, 27.5975, 113.1156 Rawtenstall, United Kingdom, 53.6990, -2.2910 Hailsham, United Kingdom, 50.8647, 0.2577 Majdel Aanjar, Lebanon, 33.7075, 35.9039 Ambohitrarivo, Madagascar, -17.4772, 48.3541 Mahela, Madagascar, -20.9687, 48.4412 Marovato, Madagascar, -15.7830, 48.0861 Farahalana, Madagascar, -14.4272, 50.1521 Analamisampy, Madagascar, -22.4767, 43.6617 Ambohitoaka, Madagascar, -16.0053, 47.6498 Miantsoarivo, Madagascar, -19.1964, 47.4109 Ankaramy, Madagascar, -13.9809, 48.1804 Ankilizato, Madagascar, -20.4088, 45.0463 Andalatanosy, Madagascar, -24.6713, 45.5976 Kungsbacka, Sweden, 57.4833, 12.0667 Ka-Bungeni, South Africa, -23.2060, 30.2240 Carletonville, South Africa, -26.3581, 27.3981 Dindori, India, 22.9414, 81.0797 Candiac, Canada, 45.3800, -73.5200 Valencia, Ecuador, -0.9525, -79.3531 Despotovac, Serbia, 44.0833, 21.4333 Wichian Buri, Thailand, 15.6578, 101.1060 Novy Jicin, Czechia, 49.5944, 18.0103 Panelas, Brazil, -8.6639, -36.0058 Olivet, France, 47.8639, 1.9006 Stoneham, United States, 42.4741, -71.0972 Fishkill, United States, 41.5129, -73.9271 Douar Azla, Morocco, 35.5564, -5.2453 Ivoti, Brazil, -29.5908, -51.1608 Litomerice, Czechia, 50.5342, 14.1328 Mobetsu, Japan, 44.3500, 143.3500 Lisse, Netherlands, 52.2500, 4.5500 Vandiperiyar, India, 9.5700, 77.0906 Emirdag, Turkey, 39.0167, 31.1500 Lagoa, Portugal, 37.1347, -8.4528 Yaguachi Nuevo, Ecuador, -2.1200, -79.6900 Labuleng, China, 35.1973, 102.5187 Bormujos, Spain, 37.3667, -6.0667 Malinalco, Mexico, 18.9483, -99.4947 Essa, Canada, 44.2500, -79.7833 Latauna, India, 26.0912, 86.8809 Radcliff, United States, 37.8204, -85.9365 Sandviken, Sweden, 60.6167, 16.7667 Manuel B. Gonnet, Argentina, -34.8500, -58.0167 March, United Kingdom, 52.5510, 0.0880 Encantado, Brazil, -29.2358, -51.8700 Minbu, Burma, 20.1800, 94.8700 Frederikshavn, Denmark, 57.4337, 10.5333 Nikaho, Japan, 39.2030, 139.9077 Paradise, Canada, 47.5333, -52.8667 Dabeiba, Colombia, 7.0000, -76.2500 Las Brenas, Argentina, -27.0667, -61.0667 Scherpenheuvel, Belgium, 50.9797, 4.9764 Kamabougou, Mali, 12.4822, -6.7911 Loos, France, 50.6128, 3.0144 Muttupet, India, 10.3950, 79.4935 Minbya, Burma, 20.3622, 93.2733 Mekhe, Senegal, 15.1135, -16.6316 Hopewell, United States, 37.2915, -77.2985 Abu, India, 24.5925, 72.7083 Torcy, France, 48.8502, 2.6508 Klatovy, Czechia, 49.3953, 13.2950 Prairie Village, United States, 38.9874, -94.6362 Nijlen, Belgium, 51.1611, 4.6703 Clifton, United Kingdom, 52.9040, -1.1770 Huaibaijie, China, 35.7050, 109.5828 San Feliu de Guixols, Spain, 41.7833, 3.0333 Vyshhorod, Ukraine, 50.5833, 30.5000 Swinton, United Kingdom, 53.5122, -2.3412 Dover, United States, 40.0019, -76.8698 Ardahan, Turkey, 41.1111, 42.7022 Famailla, Argentina, -27.0500, -65.4000 Stadthagen, Germany, 52.3247, 9.2069 Keene, United States, 42.9494, -72.2998 Bathgate, United Kingdom, 55.9024, -3.6431 Itaocara, Brazil, -21.6789, -42.0819 Biancavilla, Italy, 37.6453, 14.8636 Gubakha, Russia, 58.8706, 57.5933 Pul-e `Alam, Afghanistan, 33.9808, 69.0350 Market Harborough, United Kingdom, 52.4775, -0.9206 Nyakrom, Ghana, 5.6103, -0.7877 Wulongpu, China, 37.9356, 110.3566 Laguna de Duero, Spain, 41.5833, -4.7167 Dialakoroba, Mali, 12.2664, -7.9261 West Springfield, United States, 38.7771, -77.2268 Bhiraha, India, 25.7978, 86.0736 Zdunska Wola, Poland, 51.6000, 18.9667 Deuil-la-Barre, France, 48.9767, 2.3272 Shahriston, Tajikistan, 39.7667, 68.8167 Jequitinhonha, Brazil, -16.4339, -41.0028 Vadakarai Kil Pidagai, India, 9.0401, 77.2741 Kotido, Uganda, 3.0061, 34.1125 Shurugwi, Zimbabwe, -19.6667, 30.0000 New Brighton, United States, 45.0658, -93.2060 Ayos, Cameroon, 3.9069, 12.5272 El Palmar, Spain, 37.9422, -1.1614 Wellington, United Kingdom, 52.7001, -2.5157 Colorado, Brazil, -22.8378, -51.9728 Apolda, Germany, 51.0167, 11.5167 Dorohoi, Romania, 47.9597, 26.3997 Challans, France, 46.8467, -1.8781 Trebisov, Slovakia, 48.6333, 21.7167 Vellalur, India, 10.9775, 77.0260 Losser, Netherlands, 52.2617, 7.0044 Lermontov, Russia, 44.1167, 42.9833 Pointe a Raquettes, Haiti, 18.7847, -73.0617 Hollola, Finland, 60.9867, 25.5167 La Democracia, Guatemala, 14.2308, -90.9472 Garoua Boulai, Cameroon, 5.8833, 14.5500 Kocaali, Turkey, 41.0547, 30.8503 Zeewolde, Netherlands, 52.3333, 5.5167 Ramos, Philippines, 15.6667, 120.6417 Kalat, Pakistan, 29.0300, 66.5890 Luruaco, Colombia, 10.6083, -75.1417 Marcinelle, Belgium, 50.3992, 4.4469 Rivera, Colombia, 2.7853, -75.2589 Mahadebnagar, India, 24.6896, 87.9384 Mendeleyevsk, Russia, 55.9000, 52.3333 Ekeren, Belgium, 51.2833, 4.4167 Watertown, United States, 43.1893, -88.7285 Duncan, United States, 34.5408, -97.9215 Northwich, United Kingdom, 53.2590, -2.5180 Pietrasanta, Italy, 43.9452, 10.2183 Baile Atha Luain, Ireland, 53.4236, -7.9425 Viga, Philippines, 13.8700, 124.3000 Calabasas, United States, 34.1375, -118.6689 Corinth, United States, 33.1434, -97.0682 Guadalupe, Colombia, 2.0250, -75.7572 Bhadas, India, 25.5184, 86.4434 Garden City, United States, 40.7266, -73.6447 Genzano di Roma, Italy, 41.7022, 12.6925 Vale de Cambra, Portugal, 40.8500, -8.4000 Winchester, United States, 42.4518, -71.1463 Golitsyno, Russia, 55.6147, 36.9872 Aracariguama, Brazil, -23.4386, -47.0614 Waltham Abbey, United Kingdom, 51.6846, 0.0004 Malacatancito, Guatemala, 15.2167, -91.5167 Nazca, Peru, -14.8289, -74.9436 Watertown, United States, 44.9094, -97.1532 Patacamaya, Bolivia, -17.2333, -67.9167 Wallenhorst, Germany, 52.3500, 8.0167 Maisons-Laffitte, France, 48.9469, 2.1456 Oteiza, Philippines, 8.7437, 126.2214 Azove, Benin, 6.9500, 1.7000 General Luna, Philippines, 9.7830, 126.1560 Sarandi, Brazil, -27.9439, -52.9228 Ventimiglia, Italy, 43.7903, 7.6083 Vagos, Portugal, 40.5553, -8.6814 Hadyach, Ukraine, 50.3667, 34.0000 Blangmangat, Indonesia, 5.1881, 97.1403 Arcos de Valdevez, Portugal, 41.8500, -8.4167 Coralville, United States, 41.6990, -91.5967 Villanueva de la Canada, Spain, 40.4500, -3.9833 El Calafate, Argentina, -50.3378, -72.2600 Guanajay, Cuba, 22.9306, -82.6881 Nayagaon, India, 26.7486, 76.3273 Tadmait, Algeria, 36.7500, 3.9000 Chitarpur, India, 23.5794, 85.6548 Naolinco de Victoria, Mexico, 19.6367, -96.8525 Dokuchaievsk, Ukraine, 47.7519, 37.6783 Valasske Mezirici, Czechia, 49.4717, 17.9711 Selvazzano Dentro, Italy, 45.3898, 11.7859 Qatana, Syria, 33.4376, 36.0789 Cajabamba, Peru, -7.6237, -78.0460 Xinsi, China, 34.6503, 104.6302 Ahwa, India, 20.7500, 73.6833 Ramona, United States, 33.0474, -116.8766 Erdington, United Kingdom, 52.5236, -1.8378 Auch, France, 43.6465, 0.5855 Nogoya, Argentina, -32.4000, -59.8000 Pawni, India, 20.7800, 79.6300 Christiansburg, United States, 37.1406, -80.4036 Torre del Mar, Spain, 36.7500, -4.0833 Tassin-la-Demi-Lune, France, 45.7640, 4.7800 Bressanone, Italy, 46.7165, 11.6579 Balen, Belgium, 51.1708, 5.1697 Tadotsu, Japan, 34.2667, 133.7500 Kagadi, Uganda, 0.9411, 30.8108 Siqueira Campos, Brazil, -23.6889, -49.8339 Yanshanbu, China, 26.3326, 107.1071 Saint-Dizier, France, 48.6383, 4.9497 Camilo Ponce Enriquez, Ecuador, -3.0500, -79.7333 Zunheboto, India, 26.0146, 94.5264 Pulimathu, India, 8.7420, 76.8941 Manosque, France, 43.8342, 5.7839 Beek en Donk, Netherlands, 51.5161, 5.6208 Nahiyat al Kifl, Iraq, 32.2302, 44.3817 Beshariq, Uzbekistan, 40.4358, 70.6103 Kapfenberg, Austria, 47.4333, 15.2833 Pitogo, Philippines, 13.7850, 122.0881 Pedra, Brazil, -8.5006, -36.9456 Frascati, Italy, 41.8167, 12.6833 Ashland, United States, 37.6942, -122.1159 Sevres, France, 48.8239, 2.2117 Achhnera, India, 27.1800, 77.7700 Ait Bouziyane, Morocco, 33.8167, -5.2749 Lumbatan, Philippines, 7.7850, 124.2560 Gormi, India, 26.6003, 78.5119 Lunbei, Taiwan, 23.7789, 120.3331 Laguna Beach, United States, 33.5455, -117.7613 Bonney Lake, United States, 47.1791, -122.1700 Cartago, Costa Rica, 9.8667, -83.9167 Naraura, India, 28.1967, 78.3814 San Jose Ojetenam, Guatemala, 15.2167, -91.9667 Butig, Philippines, 7.7239, 124.3011 Kungalv, Sweden, 57.8667, 11.9667 Catano, Puerto Rico, 18.4375, -66.1440 Amoucha, Algeria, 36.3833, 5.4167 Ogre, Latvia, 56.8169, 24.6047 Pariyapuram, India, 11.0146, 75.8746 Kavallemmavu, India, 9.4361, 76.8819 Kodarma, India, 24.4675, 85.5940 Kaler, India, 25.1180, 84.4955 Yavuzeli, Turkey, 37.3192, 37.5686 Baravat, Iran, 29.0656, 58.4039 Saint-Lambert, Canada, 45.5000, -73.5167 Kumano, Japan, 34.3358, 132.5847 Linstead, Jamaica, 18.1368, -77.0317 Kanchika, India, 16.6856, 80.3892 Nasrullahganj, India, 22.6837, 77.2707 Morrinhos, Brazil, -3.2289, -40.1250 Vernag, India, 33.5377, 75.2503 San Miguel de Papasquiaro, Mexico, 24.8304, -105.3400 Kavak, Turkey, 41.0736, 36.0403 Scarborough, United States, 43.5911, -70.3682 Ivato, Madagascar, -20.6332, 47.1981 Quartier Militaire, Mauritius, -20.2500, 57.5500 Nefta, Tunisia, 33.8833, 7.8833 Ojinaga, Mexico, 29.5644, -104.4164 Machesney Park, United States, 42.3666, -89.0266 Vayanur, India, 12.0699, 75.6825 Cambara, Brazil, -23.0458, -50.0739 Ashtown, Ireland, 53.3753, -6.3306 Martha Lake, United States, 47.8479, -122.2327 Keta, Ghana, 5.9167, 0.9833 Seva, Ghana, 5.9167, 0.9833 Cartagena, Chile, -33.5425, -71.5958 Burg, Germany, 52.2725, 11.8550 Boura, Mali, 12.4117, -4.5392 Kulkent, Tajikistan, 40.1500, 70.7000 Roselle, United States, 41.9809, -88.0861 Chunakara Vadakku, India, 9.1853, 76.5995 Curchorem, India, 15.2603, 74.1083 Ayagawa, Japan, 34.2500, 133.9167 Vega Baja, Puerto Rico, 18.4406, -66.3997 Ravar, Iran, 31.2633, 56.8072 Kerur, India, 16.0138, 75.5463 Garmdarreh, Iran, 35.7478, 51.0678 Idak, Pakistan, 32.9741, 70.1988 Rosita, Nicaragua, 13.8833, -84.4000 Asaita, Ethiopia, 11.5667, 41.4333 Fangliao, Taiwan, 22.3656, 120.5936 Byala Slatina, Bulgaria, 43.4670, 23.9330 Krnov, Czechia, 50.0906, 17.6986 Volendam, Netherlands, 52.4994, 5.0675 Amalfi, Colombia, 6.9167, -75.0833 Kittanapalli, India, 12.5133, 78.1844 Muradpur, India, 25.8000, 86.0055 Ambriz, Angola, -7.8500, 13.1167 Feira Grande, Brazil, -9.9000, -36.6778 Combs-la-Ville, France, 48.6700, 2.5600 Nakur, India, 29.9189, 77.3044 Buenavista, Colombia, 8.6833, -75.2500 Bulle, Switzerland, 46.6167, 7.0500 Barbate de Franco, Spain, 36.1833, -5.9167 Atkarsk, Russia, 51.8667, 45.0000 Kluczbork, Poland, 50.9833, 18.2167 Jarqo`rg`on, Uzbekistan, 37.5083, 67.4167 Sun Valley, United States, 39.6104, -119.7770 Sidi Ifni, Morocco, 29.3833, -10.1667 Picasent, Spain, 39.3611, -0.4600 Kenilworth, United Kingdom, 52.3410, -1.5660 Goldasht, Iran, 32.6244, 51.4383 Inhapim, Brazil, -19.5489, -42.1200 Dalan, India, 25.6030, 87.5592 Shaomi, China, 26.4500, 104.8833 Gaoshu, Taiwan, 22.8202, 120.5979 Candelaria de La Frontera, El Salvador, 14.1167, -89.6500 Crystal, United States, 45.0377, -93.3599 Patharia, India, 23.8992, 79.1939 Avon, United States, 39.7601, -86.3916 Beixingzhuang, China, 35.7054, 111.1176 Andoany, Madagascar, -13.4000, 48.2666 Horad Smalyavichy, Belarus, 54.1000, 28.0667 Mallasamudram, India, 11.4933, 78.0312 Conchal, Brazil, -22.3300, -47.1728 Tequixquiac, Mexico, 19.9097, -99.1417 Lucala, Angola, -9.6333, 14.0667 Moirang, India, 24.3490, 93.6900 Dip, India, 26.2369, 86.3107 Oytal, Kazakhstan, 42.9153, 73.2549 Kitajima, Japan, 34.1333, 134.5500 Mullingar, Ireland, 53.5333, -7.3500 North Plainfield, United States, 40.6209, -74.4386 Herdecke, Germany, 51.4000, 7.4333 Khaw Zar Chaung Wa, Burma, 15.0375, 97.8293 Alvares Machado, Brazil, -22.0789, -51.4719 Llaillay, Chile, -32.8403, -70.9483 Moncagua, El Salvador, 13.5333, -88.2500 Nanyangcun, China, 34.7015, 108.3295 Lefkada, Greece, 38.7167, 20.6500 Haddada, Morocco, 34.2236, -6.5111 General Viamonte, Argentina, -35.0000, -61.0333 Bagula, India, 23.3350, 88.6440 Wednesfield, United Kingdom, 52.5998, -2.0827 La Trinidad, Nicaragua, 12.5578, -86.1835 Prieto Diaz, Philippines, 13.0408, 124.1931 Gujan-Mestras, France, 44.6364, -1.0667 Guia de Isora, Spain, 28.2110, -16.7784 Pullappalli, India, 9.6833, 76.6167 Okahandja, Namibia, -21.9796, 16.9100 Zaghouan, Tunisia, 36.4056, 10.1431 Zedelgem, Belgium, 51.1333, 3.1333 Royken, Norway, 59.7336, 10.4289 Onondaga, United States, 42.9686, -76.2169 Hialeah Gardens, United States, 25.8878, -80.3569 Olindina, Brazil, -11.3669, -38.3328 Areia, Brazil, -6.9628, -35.6919 Chincholi, India, 17.4651, 77.4187 Fucecchio, Italy, 43.7333, 10.8000 Manimala, India, 9.5736, 77.0819 Corcoran, United States, 36.0841, -119.5613 Morombe, Madagascar, -21.7391, 43.3657 Oltenita, Romania, 44.0867, 26.6367 Manzanares, Colombia, 5.2519, -75.1569 Baraki Barak, Afghanistan, 33.9692, 68.9447 Anthem, United States, 33.8560, -112.1168 Andorra la Vella, Andorra, 42.5000, 1.5000 Tocantinopolis, Brazil, -6.3289, -47.4158 Santa Fe de Antioquia, Colombia, 6.5500, -75.8167 Timmapur, India, 19.0484, 78.6414 Budingen, Germany, 50.2908, 9.1125 Bear, United States, 39.6189, -75.6808 Lajas, Cuba, 22.4164, -80.2906 DeBary, United States, 28.8815, -81.3240 Savanna-la-Mar, Jamaica, 18.2167, -78.1333 Hirpardangal, India, 24.0474, 86.8648 Manki, India, 14.1789, 74.4818 Sipoo, Finland, 60.3750, 25.2667 Penarth, United Kingdom, 51.4300, -3.1700 Fleurus, Belgium, 50.4843, 4.5518 Farsley, United Kingdom, 53.8116, -1.6718 Sliema, Malta, 35.9122, 14.5042 Parabcan, Philippines, 13.7100, 123.7450 Bouzeghaia, Algeria, 36.3333, 1.2500 Millbrae, United States, 37.5994, -122.4023 Warrenton, South Africa, -28.1114, 24.8497 Bad Rappenau, Germany, 49.2333, 9.1000 Yahualica de Gonzalez Gallo, Mexico, 21.1781, -102.8860 Furukawa, Japan, 36.2381, 137.1862 Svishtov, Bulgaria, 43.6113, 25.3569 Albertville, United States, 34.2633, -86.2108 Sardinata, Colombia, 8.0833, -72.8000 Dawmat al Jandal, Saudi Arabia, 29.8153, 39.8664 Santa Ana, Philippines, 14.5277, 121.0766 Cadca, Slovakia, 49.4386, 18.7883 Barreirinha, Brazil, -2.8025, -57.0686 Camacan, Brazil, -15.4189, -39.4958 Gif-sur-Yvette, France, 48.7018, 2.1339 Senador Jose Porfirio, Brazil, -2.5908, -51.9539 Oshwe, Congo (Kinshasa), -3.4188, 19.4334 Govardhan, India, 27.5000, 77.4700 Meoqui, Mexico, 28.2722, -105.4819 Waynesboro, United States, 38.0674, -78.9014 Los Llanos, Dominican Republic, 18.6200, -69.5000 Boriziny, Madagascar, -15.5602, 47.6691 El Amria, Algeria, 35.5333, -1.0167 Talayolaparambu, India, 9.7850, 76.4481 Lincoln, United States, 41.9171, -71.4505 Kihei, United States, 20.7653, -156.4454 Penwortham, United Kingdom, 53.7400, -2.7200 West Rancho Dominguez, United States, 33.9057, -118.2683 Uenohara, Japan, 35.6302, 139.1113 Belabo, Cameroon, 4.9333, 13.3000 Raman Mandi, India, 29.9504, 74.9619 Eschborn, Germany, 50.1436, 8.5700 Esparraguera, Spain, 41.5381, 1.8692 Pokhuria, India, 25.2379, 87.6459 Letterkenny, Ireland, 54.9500, -7.7333 Sinjar, Iraq, 36.3208, 41.8764 Verkhniy Ufaley, Russia, 56.0667, 60.2333 Mentana, Italy, 42.0337, 12.6444 Biggleswade, United Kingdom, 52.0855, -0.2557 Vengattur, India, 13.0999, 79.9321 Yalvac, Turkey, 38.2956, 31.1800 Potters Bar, United Kingdom, 51.6980, -0.1830 Ust'-Katav, Russia, 54.9333, 58.1833 Kafr Batna, Syria, 33.5117, 36.3727 Metzingen, Germany, 48.5367, 9.2858 Saint-Louis, France, 47.5900, 7.5700 Melila, India, 9.0083, 76.8500 Sanga, Japan, 34.6003, 135.6956 Bobleshwar, India, 16.8300, 75.7300 Greenwood, United States, 34.1947, -82.1542 Meiwa, Japan, 34.5500, 136.6167 Strakonice, Czechia, 49.2614, 13.9025 Katangi, India, 23.4412, 79.7962 Huautla, Mexico, 21.0308, -98.2850 Sarangani, Philippines, 5.4120, 125.4220 Vernon, United States, 41.1973, -74.4857 Sabana de Torres, Colombia, 7.4000, -73.5000 Litvinov, Czechia, 50.6008, 13.6111 Jogipet, India, 17.8356, 78.0681 Summit, United States, 40.7154, -74.3647 Melchor Romero, Argentina, -34.9492, -58.0472 Hulikal, India, 11.3193, 76.7732 Ottobrunn, Germany, 48.0667, 11.6667 Mutata, Colombia, 7.2442, -76.4358 Nadvirna, Ukraine, 48.6333, 24.5833 Ouani, Comoros, -12.1350, 44.4275 Kafr Sa`d, Egypt, 31.3557, 31.6848 Reni, India, 27.1610, 76.7130 Vilcun, Chile, -38.6500, -72.2333 Zabrat, Azerbaijan, 40.4775, 49.9417 Coracao de Maria, Brazil, -12.2333, -38.7500 San Antonio La Paz, Guatemala, 14.7500, -90.2833 San Pablo Jocopilas, Guatemala, 14.5833, -91.4500 Aljaraque, Spain, 37.2667, -7.0167 Lazi, Philippines, 9.1280, 123.6340 East Peoria, United States, 40.6736, -89.5419 Nkowakowa, South Africa, -23.8860, 30.2930 Velizy-Villacoublay, France, 48.7834, 2.1834 Central Falls, United States, 41.8901, -71.3934 Sucre, Colombia, 8.8139, -74.7253 Chavassheri, India, 11.9647, 75.6176 Foleshill, United Kingdom, 52.4255, -1.5020 San Juan Cotzocon, Mexico, 17.1667, -95.7833 Anastacio, Brazil, -20.4839, -55.8069 Mount Pearl Park, Canada, 47.5189, -52.8058 Piddig, Philippines, 18.1647, 120.7172 Yuli, China, 41.3351, 86.2614 Herouville-Saint-Clair, France, 49.2044, -0.3253 Chatayamangalam, India, 8.8421, 76.8644 Fontaine, France, 45.1939, 5.6856 Emiliano Zapata, Mexico, 17.7446, -91.7651 Heide, Germany, 54.1961, 9.0933 Kondazhi, India, 10.7270, 76.3954 Karnobat, Bulgaria, 42.6500, 26.9830 Almoradi, Spain, 38.1097, -0.7894 Biddeford, United States, 43.4673, -70.4511 Cacule, Brazil, -14.5028, -42.2219 Baclayon, Philippines, 9.6227, 123.9135 Ladyzhyn, Ukraine, 48.6667, 29.2500 Villa Park, United States, 41.8865, -87.9779 Buriti Bravo, Brazil, -5.8369, -43.8339 Roselle, United States, 40.6527, -74.2599 Puente Nacional, Mexico, 19.3302, -96.4837 Gan Yavne, Israel, 31.7886, 34.7053 Pullanpallikonam, India, 8.6976, 76.9582 McNair, United States, 38.9513, -77.4115 Molodohvardiisk, Ukraine, 48.3444, 39.6583 Chalmette, United States, 29.9438, -89.9660 Naawan, Philippines, 8.4333, 124.3000 Mihama, Japan, 34.7789, 136.9082 Aymangala, India, 12.0333, 75.7333 Moyo, Uganda, 3.6504, 31.7200 Pirajui, Brazil, -21.9989, -49.4569 Naciria, Algeria, 36.7500, 3.8333 Junction City, United States, 39.0277, -96.8508 Finnkolo, Mali, 11.2681, -5.5111 Spennymoor, United Kingdom, 54.7000, -1.5900 Alwaye, India, 10.1167, 76.3500 Sarea Khas, India, 26.6350, 84.5483 Junnardev, India, 22.2000, 78.5800 Les Pennes-Mirabeau, France, 43.4106, 5.3103 Montville, United States, 40.9135, -74.3594 Sibut, Central African Republic, 5.7333, 19.0833 Sipilou, Côte d’Ivoire, 7.8667, -8.1000 Fenyuan, Taiwan, 24.0154, 120.6274 Maying, China, 36.0448, 102.8343 Kasamatsucho, Japan, 35.3672, 136.7632 Jebba, Nigeria, 9.1286, 4.8183 Betsizaraina, Madagascar, -19.9591, 48.7554 Las Torres de Cotillas, Spain, 38.0264, -1.2436 Abbeville, France, 50.1058, 1.8358 Rixensart, Belgium, 50.7167, 4.5333 Sanhe, China, 35.3266, 112.7681 Zhengtun, China, 25.1500, 105.1333 Zurbatiyah, Iraq, 33.1581, 46.0385 Kiboga, Uganda, 0.9200, 31.7600 Macas, Ecuador, -2.3667, -78.1333 Bermo, India, 23.7878, 85.9353 Quissama, Brazil, -22.1069, -41.4719 Freire, Chile, -38.9558, -72.6256 Montigny-les-Cormeilles, France, 48.9944, 2.1958 Szczytno, Poland, 53.5628, 20.9853 Taishituncun, China, 40.5364, 117.1219 Bloomingdale, United States, 41.9497, -88.0895 Pavlovsk, Russia, 50.4578, 40.1081 Oyonnax, France, 46.2561, 5.6556 Ivatsevichy, Belarus, 52.7167, 25.3333 Valmiera, Latvia, 57.5381, 25.4231 Gonghe, China, 35.3333, 108.0856 Hartbeespoort, South Africa, -25.7442, 27.8994 Acworth, United States, 34.0566, -84.6716 Kato Polemidia, Cyprus, 34.6931, 32.9992 Mechta Ouled Oulha, Algeria, 35.6706, 4.8778 Lindsay, Canada, 44.3500, -78.7333 Perundurai, India, 11.2777, 77.5837 Abaete, Brazil, -19.1583, -45.4522 Arouca, Portugal, 40.9289, -8.2436 The Crossings, United States, 25.6708, -80.4018 Rumphi, Malawi, -11.0172, 33.8539 Ivrea, Italy, 45.4674, 7.8748 Saint-Lazare, Canada, 45.4000, -74.1333 Arbi'a Tighadwiyn, Morocco, 31.4279, -7.5253 Tapaktuan, Indonesia, 3.2500, 97.1667 Diriomo, Nicaragua, 11.8667, -86.0500 Caglayancerit, Turkey, 37.7506, 37.2931 Yorkville, United States, 41.6563, -88.4507 Sek'ot'a, Ethiopia, 12.6253, 39.0350 Sabuncu, Azerbaijan, 40.4425, 49.9481 Cedro, Brazil, -6.6069, -39.0619 Lyndhurst, United States, 40.7965, -74.1099 Quickborn, Germany, 53.7333, 9.8972 Gurmatkal, India, 16.8677, 77.3909 Carouge, Switzerland, 46.1833, 6.1333 Montilla, Spain, 37.5833, -4.6333 Gilan-e Gharb, Iran, 34.1406, 45.9183 Foley, United States, 30.3983, -87.6650 Kadiria, Algeria, 36.5333, 3.6833 Sambhar, India, 26.9121, 75.1836 Cudahy, United States, 33.9631, -118.1830 Palmer, United States, 40.7007, -75.2628 El Tortuguero, Nicaragua, 12.8167, -84.2000 Marina, United States, 36.6810, -121.7892 Dajianchang, China, 39.4772, 117.0842 Guerou, Mauritania, 16.8177, -11.8359 Taulaha, India, 26.9566, 84.0731 Natagaima, Colombia, 3.5833, -75.0833 Bhawanigarh, India, 30.2700, 76.0400 Ceccano, Italy, 41.5667, 13.3333 Owen Sound, Canada, 44.5667, -80.9333 Bristol, United States, 41.6827, -71.2694 Frauenfeld, Switzerland, 47.5580, 8.8964 Donaueschingen, Germany, 47.9531, 8.5033 Daxin, China, 26.6210, 107.2398 Chinameca, El Salvador, 13.5000, -88.3500 Maracena, Spain, 37.2000, -3.6333 Hayesville, United States, 44.9793, -122.9738 Panniyannur, India, 11.7538, 75.5528 El Doncello, Colombia, 1.6833, -75.2833 Yuli, Taiwan, 23.3875, 121.3764 Gornji Vakuf, Bosnia and Herzegovina, 43.9333, 17.5833 Evesham, United Kingdom, 52.0920, -1.9470 Hillsborough, United States, 40.5069, -74.6523 Lochristi, Belgium, 51.1000, 3.8333 Piuma, Brazil, -20.8350, -40.7289 Bundibugyo, Uganda, 0.7125, 30.0600 Qorako`l Shahri, Uzbekistan, 39.5028, 63.8556 Marion Oaks, United States, 29.0011, -82.1953 West Deptford, United States, 39.8431, -75.1852 Montclair, United States, 38.6111, -77.3400 Pozega, Croatia, 45.3314, 17.6744 Rosiori de Vede, Romania, 44.1114, 24.9942 Magallanes, Philippines, 9.0200, 125.5200 Brockville, Canada, 44.5833, -75.6833 Tiverton, United Kingdom, 50.9030, -3.4880 Braine-le-Comte, Belgium, 50.6000, 4.1333 Laja, Chile, -37.2667, -72.7000 Cayo Mambi, Cuba, 20.6647, -75.2814 Sanso, Mali, 11.7114, -6.8503 Pale, Bosnia and Herzegovina, 43.8167, 18.5667 Bartoszyce, Poland, 54.2500, 20.8000 Monte Aprazivel, Brazil, -20.7728, -49.7139 Valenca do Piaui, Brazil, -6.4078, -41.7458 Had Sahary, Algeria, 35.3517, 3.3608 Cisnadie, Romania, 45.7128, 24.1508 Shoeburyness, United Kingdom, 51.5316, 0.7978 Chankou, China, 35.7122, 104.5219 Yokoshibahikari, Japan, 35.6667, 140.5000 Lordelo do Ouro, Portugal, 41.1532, -8.6509 Acatlan, Mexico, 20.1444, -98.4383 Sapulpa, United States, 36.0091, -96.1003 Palaw, Burma, 12.9597, 98.6545 Waldkirch, Germany, 48.1000, 7.9667 Sidi Allal Tazi, Morocco, 34.5197, -6.3236 Ugong, Philippines, 14.5842, 121.0729 Tiruttangal, India, 9.4833, 77.8333 Evans, United States, 40.3660, -104.7390 Rancho San Diego, United States, 32.7624, -116.9197 Senekane, Lesotho, -29.2525, 27.7433 Edegem, Belgium, 51.1500, 4.4500 Telsiai, Lithuania, 55.9833, 22.2500 Nagla, India, 29.0100, 79.5100 Sant Pere, Andorra, 42.5000, 1.5000 Ankireddikuntapalem, India, 15.9154, 80.2108 Bhatpuri, India, 29.1700, 79.1600 Chausa, India, 25.5283, 87.0322 Eppingen, Germany, 49.1333, 8.9167 Singampunari, India, 10.1815, 78.4231 Itsukaichi, Japan, 35.7522, 139.2667 Athiringal, India, 9.0667, 76.5000 El Hermel, Lebanon, 34.3914, 36.3958 Karacoban, Turkey, 39.3508, 42.1119 Tervuren, Belgium, 50.8167, 4.5000 El Colegio, Colombia, 4.5808, -74.4425 Silvania, Brazil, -16.6589, -48.6078 Souahlia, Algeria, 35.0333, -1.8833 Alangayam, India, 12.6223, 78.7521 Perry, United States, 32.4720, -83.7283 Versmold, Germany, 52.0436, 8.1500 Litherland, United Kingdom, 53.4727, -2.9990 Takahata, Japan, 38.0027, 140.1891 Kheiredine, Algeria, 35.9806, 0.1681 Koziatyn, Ukraine, 49.7167, 28.8333 Bignona, Senegal, 12.8096, -16.2301 Middleton, United States, 43.1064, -89.5059 Huangzhai, China, 38.0751, 112.6595 Yeadon, United Kingdom, 53.8690, -1.6880 Ibia, Brazil, -19.4778, -46.5389 Kundgol, India, 15.2561, 75.2474 Yahualica, Mexico, 20.9531, -98.3800 Sao Filipe, Cabo Verde, 14.8950, -24.4980 Chebba, Tunisia, 35.2372, 11.1150 Metekora, India, 22.1189, 88.5772 Ruston, United States, 32.5328, -92.6363 Aichach, Germany, 48.4500, 11.1333 Murayama, Japan, 38.4833, 140.3833 Sharunah, Egypt, 28.5940, 30.8516 Saint John's, Antigua and Barbuda, 17.1167, -61.8500 Swiebodzice, Poland, 50.8667, 16.3333 Dasnapur, India, 19.4482, 78.6129 Poggiomarino, Italy, 40.8000, 14.5500 Acomb, United Kingdom, 53.9600, -1.1308 Abu Sir Bana, Egypt, 30.9127, 31.2427 Bahia de Caraquez, Ecuador, -0.5995, -80.4245 Ortona, Italy, 42.3557, 14.4036 Tiruverumbur, India, 10.7937, 78.7690 Topola, Serbia, 44.2525, 20.6761 Zirapur, India, 24.0222, 76.3771 Payson, United States, 40.0355, -111.7390 Samtredia, Georgia, 42.1625, 42.3417 Tirat Karmel, Israel, 32.7667, 34.9667 Bo`ka, Uzbekistan, 40.8136, 69.2019 West Puente Valley, United States, 34.0513, -117.9681 Guazacapan, Guatemala, 14.0667, -90.4167 Hillegom, Netherlands, 52.2833, 4.5833 Rioja, Peru, -6.0500, -77.1417 Repelon, Colombia, 10.5500, -75.1333 Soroca, Moldova, 48.1667, 28.3000 Medeiros Neto, Brazil, -17.3739, -40.2208 Adalhat, India, 25.2820, 82.9563 Simaria, India, 25.5671, 87.4929 's-Gravenzande, Netherlands, 52.0053, 4.1740 Surdulica, Serbia, 42.6950, 22.1672 Sandomierz, Poland, 50.6833, 21.7500 Nerja, Spain, 36.7469, -3.8789 Kondalampatti, India, 11.6262, 78.1189 Pattiyurgramam, India, 9.2000, 76.5000 Phularwan, Pakistan, 32.1883, 73.0286 Haderslev, Denmark, 55.2524, 9.4893 Gubbi, India, 13.3122, 76.9410 Shabestar, Iran, 38.1800, 45.7031 Akdagmadeni, Turkey, 39.6658, 35.8836 Kilkenny, Ireland, 52.6477, -7.2561 Bakhri, India, 25.5989, 86.2607 Hillside, United States, 40.6961, -74.2286 Maribojoc, Philippines, 9.7500, 123.8500 Santo Antonio, Brazil, -6.3108, -35.4789 Ibirapitanga, Brazil, -14.1639, -39.3739 Yabu, Japan, 35.4000, 134.7667 Nova Zagora, Bulgaria, 42.4830, 26.0170 Sulmona, Italy, 42.0480, 13.9262 Camp Springs, United States, 38.8052, -76.9199 Guabo, Ecuador, -3.2388, -79.8292 Qarazhal, Kazakhstan, 48.0253, 70.7999 Mbaiki, Central African Republic, 3.8833, 18.0000 Goleniow, Poland, 53.5636, 14.8281 Chestermere, Canada, 51.0500, -113.8225 La Madeleine, France, 50.6558, 3.0710 Mountain Brook, United States, 33.4871, -86.7400 Radevormwald, Germany, 51.2000, 7.3500 Salvaterra de Magos, Portugal, 39.0253, -8.7933 Batad, Philippines, 11.4200, 123.1200 Sokolov, Czechia, 50.1814, 12.6403 Vellithiruthi, India, 10.6434, 76.1624 Paraguari, Paraguay, -25.6200, -57.1600 Ghriss, Algeria, 35.2500, 0.1667 Sarapaka, India, 17.6922, 80.8614 Sant'Arcangelo di Romagna, Italy, 44.0633, 12.4466 Aleksandrow Lodzki, Poland, 51.8194, 19.3039 Quedgeley, United Kingdom, 51.8250, -2.2800 Vayalar, India, 9.7750, 76.4292 Katkol, India, 15.9500, 75.3000 Bayou Cane, United States, 29.6243, -90.7510 Bhanvad, India, 21.9300, 69.7800 Ban Pa Tueng, Thailand, 20.1339, 99.8325 Salcedo, Philippines, 11.1500, 125.6700 Guryevsk, Russia, 54.2833, 85.9333 Alfafar, Spain, 39.4222, -0.3906 Pirmed, India, 9.3667, 76.8708 Pomerode, Brazil, -26.7408, -49.1769 La Porte, United States, 41.6069, -86.7142 Sunny Isles Beach, United States, 25.9385, -80.1246 Reigate, United Kingdom, 51.2370, -0.2060 Clarksville, United States, 38.3220, -85.7673 Pingtan, China, 23.2525, 111.4119 Formby, United Kingdom, 53.5586, -3.0666 Tabarka, Tunisia, 36.9544, 8.7581 Kingsville, Canada, 42.1000, -82.7167 Bourkika, Algeria, 36.5000, 2.4833 Fantino, Dominican Republic, 19.1200, -70.3000 Sahil, Azerbaijan, 40.2239, 49.5760 Bellavista, Peru, -7.0668, -76.5847 Talwandi Sabo, India, 29.9838, 75.0820 Qapqal, China, 43.8340, 81.1581 Salemata, Senegal, 12.6333, -12.8167 Krolevets, Ukraine, 51.5500, 33.3833 Cunha, Brazil, -23.0744, -44.9597 Allison Park, United States, 40.5730, -79.9603 Santa Fe, Philippines, 11.1856, 124.9161 Karlsfeld, Germany, 48.2167, 11.4667 Caojiachuan, China, 34.9000, 111.5000 Arroyito, Paraguay, -23.1751, -56.7781 Namayumba, Uganda, 0.5281, 32.2506 Doutou, Benin, 6.5500, 1.8833 La Cruz, Chile, -32.8281, -71.1761 Madhupur, India, 24.7000, 83.0200 San Agustin, Philippines, 16.5200, 121.7500 Sanford, United States, 43.4244, -70.7573 Palmital, Brazil, -22.7889, -50.2175 Saint-Jean-de-Braye, France, 47.9128, 1.9719 Argos, Greece, 37.6167, 22.7167 Peravurani, India, 10.3000, 79.1800 Pailitas, Colombia, 8.9667, -73.6333 Howli, India, 26.4224, 90.9800 Huejucar, Mexico, 22.3591, -103.2108 Ocatlan, Mexico, 19.3167, -98.2283 Muelle de los Bueyes, Nicaragua, 12.0667, -84.5333 Brunswick, United States, 43.9007, -69.9761 Sao Jose do Rio Preto, Brazil, -22.1508, -42.9239 Ilsede, Germany, 52.2667, 10.1833 Hoogezand, Netherlands, 53.1572, 6.7533 Vilnohirsk, Ukraine, 48.4781, 34.0281 Timbiqui, Colombia, 2.7719, -77.6650 Vereshchagino, Russia, 58.1000, 54.6667 Taixi, Taiwan, 23.7000, 120.2000 Smithfield, United States, 41.9014, -71.5308 Newquay, United Kingdom, 50.4120, -5.0757 Camborne, United Kingdom, 50.2130, -5.3000 Kalchini, India, 26.6889, 89.4483 Estcourt, South Africa, -29.0000, 29.8833 Oxford, United States, 39.5061, -84.7446 Qift, Egypt, 26.0000, 32.8167 Palestrina, Italy, 41.8333, 12.9000 Yorosso, Mali, 12.3581, -4.7769 Oxford, United States, 33.5967, -85.8687 Imbert, Dominican Republic, 19.7500, -70.8300 Parsagarhi, India, 26.0935, 87.0672 Hamidiyeh, Iran, 31.4811, 48.4350 Langley Park, United States, 38.9897, -76.9808 Adampur, India, 31.4322, 75.7148 Chhanera, India, 21.6230, 76.3720 Itaiopolis, Brazil, -26.3358, -49.9058 Chambersburg, United States, 39.9315, -77.6556 Madamba, Philippines, 7.8800, 124.0700 Hastings, United States, 44.7318, -92.8538 Rimavska Sobota, Slovakia, 48.3814, 20.0200 Lower, United States, 38.9819, -74.9087 Northwood, United Kingdom, 51.6010, -0.4176 Honmachi, Japan, 36.0609, 136.5006 San Martin, Argentina, -31.4397, -68.5206 Ceres, Brazil, -15.3078, -49.5978 Aswapuram, India, 17.8348, 80.8236 Khandela, India, 27.3600, 75.3000 Kirovsk, Russia, 67.6167, 33.6500 Karaisali, Turkey, 37.2611, 35.0600 Tiquisio, Colombia, 8.5667, -74.2667 Dongta, China, 38.0824, 106.3390 Soltau, Germany, 52.9833, 9.8333 Mondovi, Italy, 44.3833, 7.8167 Sevlievo, Bulgaria, 43.0207, 25.0945 Sonthofen, Germany, 47.5158, 10.2811 East Ridge, United States, 34.9973, -85.2285 Jizhuang, China, 40.3614, 116.9858 Nevyansk, Russia, 57.4833, 60.2000 Banbishancun, China, 40.3700, 117.9317 Woensdrecht, Netherlands, 51.4300, 4.3050 Jawad, India, 24.5992, 74.8626 Naregal, India, 15.5732, 75.8080 Epernay, France, 49.0403, 3.9600 Corail, Haiti, 18.5677, -73.8894 Silvania, Colombia, 4.4033, -74.3881 Taveta, Kenya, -3.3956, 37.6761 Dioumanzana, Mali, 12.5960, -7.3083 Anini-y, Philippines, 10.4325, 121.9253 Comacchio, Italy, 44.7000, 12.1833 Meixedo, Portugal, 41.8522, -6.7706 Kotelnikovo, Russia, 47.6333, 43.1500 Columbia Heights, United States, 45.0484, -93.2472 Ostrow Mazowiecka, Poland, 52.8000, 21.9000 Tola, Nicaragua, 11.4333, -85.9333 Greystones, Ireland, 53.1408, -6.0631 Uliastay, Mongolia, 47.7428, 96.8433 Villeneuve-sur-Lot, France, 44.4081, 0.7050 Paese, Italy, 45.6667, 12.1500 Winter Gardens, United States, 32.8376, -116.9268 Jugial, India, 32.3684, 75.6782 Haci Zeynalabdin, Azerbaijan, 40.6242, 49.5575 Aoshang, China, 25.6842, 113.0322 Atherton, United Kingdom, 53.5230, -2.4950 Saoner, India, 21.3858, 78.9201 Bukkarayasamudram, India, 14.6944, 77.6381 Ghat, Libya, 24.9644, 10.1781 Ampasimanjeva, Madagascar, -21.7368, 48.0384 Manakambahiny, Madagascar, -17.8593, 48.2947 Ambodimotso Atsimo, Madagascar, -15.3803, 48.5889 Iarintsena, Madagascar, -21.8279, 46.8813 Andranovorivato, Madagascar, -21.6293, 46.9897 Bemanonga, Madagascar, -20.2920, 44.3513 Vohimasina, Madagascar, -21.7766, 48.1187 Andilanatoby, Madagascar, -17.9335, 48.2366 Alakamisy-Ambohimaha, Madagascar, -21.3211, 47.2240 Ambalaroka, Madagascar, -22.1522, 47.7293 Jafaro, Madagascar, -24.9253, 45.5191 Ankiabe-Salohy, Madagascar, -15.6050, 48.7201 Antsakabary, Madagascar, -15.0429, 48.9283 Lebane, Serbia, 42.9167, 21.7333 Huskvarna, Sweden, 57.7919, 14.2756 Kigumba, Uganda, 1.8150, 32.0100 Machagai, Argentina, -26.9167, -60.0333 Unchahra, India, 24.3825, 80.7809 Elsdorf, Germany, 50.9333, 6.5667 Moncada, Spain, 39.5431, -0.3928 Ecoporanga, Brazil, -18.3728, -40.8308 Coalville, United Kingdom, 52.7240, -1.3690 Dras, India, 34.4468, 75.7586 Zundert, Netherlands, 51.4703, 4.6600 Gavimane, Mali, 15.1350, -9.8936 Taminango, Colombia, 1.5667, -77.2833 Bilthoven, Netherlands, 52.1283, 5.1986 Al Bahah, Saudi Arabia, 20.0129, 41.4677 Pitrufquen, Chile, -38.9833, -72.6500 Tashtagol, Russia, 52.7667, 87.8667 Nema, Mauritania, 16.6171, -7.2500 Pinhalzinho, Brazil, -26.8478, -52.9919 Khosrowshahr, Iran, 37.9514, 46.0508 Bad Krozingen, Germany, 47.9167, 7.7000 Aspe, Spain, 38.3456, -0.7689 Ampanotokana, Madagascar, -18.7193, 47.3079 Iracemapolis, Brazil, -22.5808, -47.5189 San Rafael del Yuma, Dominican Republic, 18.4333, -68.6667 Mililani Mauka, United States, 21.4756, -157.9948 Djinet, Algeria, 36.8833, 3.7167 Robbah, Algeria, 33.2811, 6.9108 Kuppam, India, 12.7500, 78.3700 Lorton, United States, 38.6983, -77.2164 Koekelberg, Belgium, 50.8667, 4.3333 Vertentes, Brazil, -7.9028, -35.9878 Chillicothe, United States, 39.3393, -82.9939 Koksijde, Belgium, 51.1000, 2.6500 San Jose, Philippines, 9.4200, 123.2300 Villa de Leyva, Colombia, 5.6333, -73.5333 Dudelange, Luxembourg, 49.4833, 6.0833 Ozark, United States, 37.0365, -93.2158 Serro, Brazil, -18.6044, -43.3794 Chakia, India, 26.4160, 85.0467 Zalun, Burma, 17.4719, 95.5522 Pocharam, India, 17.4255, 78.6450 Diamantino, Brazil, -14.4089, -56.4458 Mundamala, Bangladesh, 24.6081, 88.4728 Ramantali, India, 12.0500, 75.1833 Le Petit-Quevilly, France, 49.4311, 1.0539 Harim, Syria, 36.2118, 36.5208 Ap Phu My, Vietnam, 9.7500, 106.0000 Muhlenberg, United States, 40.3955, -75.9250 Golden Valley, United States, 44.9901, -93.3591 Gardelegen, Germany, 52.5264, 11.3925 Artemida, Greece, 37.9667, 24.0000 Nakagusuku, Japan, 26.2678, 127.7914 Sandbach, United Kingdom, 53.1460, -2.3670 Duarte, United States, 34.1610, -117.9504 Samba Cango, Angola, -9.1000, 15.5500 New Hartford, United States, 43.0586, -75.2821 Chalchihuitan, Mexico, 17.0333, -92.6167 Axapusco, Mexico, 19.7194, -98.7972 Neuilly-Plaisance, France, 48.8619, 2.5064 Gotsucho, Japan, 35.0117, 132.2178 West Carson, United States, 33.8229, -118.2931 Al Fuhays, Jordan, 32.0167, 35.7667 Krathum Baen, Thailand, 13.6631, 100.2572 Itubera, Brazil, -13.7319, -39.1489 Pak Tin Pa, Hong Kong, 22.3364, 114.1667 Shiroishi, Japan, 33.1814, 130.1433 Bungotakada, Japan, 33.5561, 131.4469 San Buenaventura, El Salvador, 13.5333, -88.3833 Sao Miguel do Araguaia, Brazil, -13.2750, -50.1628 Sayada, Algeria, 35.9500, 0.1333 Kachhari, India, 22.0808, 88.6511 Darreh Shahr, Iran, 33.1431, 47.3794 Membakut, Malaysia, 5.4748, 115.8030 Berezovskiy, Russia, 55.6167, 86.2500 Arta, Greece, 39.1650, 20.9875 Beguedo, Burkina Faso, 11.7833, -0.7333 Eislingen, Germany, 48.6933, 9.7067 Sao Francisco de Paula, Brazil, -29.4478, -50.5839 Sainte-Foy-les-Lyon, France, 45.7300, 4.8000 Muzambinho, Brazil, -21.3758, -46.5258 Vanthli, India, 21.4778, 70.3306 Silvassa, India, 20.2708, 73.0050 Manor, United States, 39.9848, -76.4216 Kueneng, Lesotho, -29.0161, 27.9981 Pio XII, Brazil, -3.8939, -45.1700 Povoa de Lanhoso, Portugal, 41.5667, -8.2667 Caranavi, Bolivia, -15.8333, -67.5667 Klamath Falls, United States, 42.2195, -121.7754 Frameries, Belgium, 50.4088, 3.8906 God, Hungary, 47.6906, 19.1344 Casablanca, Chile, -33.3167, -71.4167 Mantes-la-Ville, France, 48.9750, 1.7117 Shinhidaka, Japan, 42.2500, 142.5667 Montigny-les-Metz, France, 49.1006, 6.1539 Maghalleen, Lesotho, -30.0942, 27.4189 Parsippany, United States, 40.8645, -74.4135 Sedalia, United States, 38.7059, -93.2340 Arcueil, France, 48.8075, 2.3361 Shelby, United States, 35.2904, -81.5451 Gunzburg, Germany, 48.4527, 10.2713 Ossett, United Kingdom, 53.6800, -1.5800 Muhldorf, Germany, 48.2456, 12.5228 Millau, France, 44.0986, 3.0783 Nogent-sur-Oise, France, 49.2756, 2.4683 Nogales, Chile, -32.7350, -71.2025 Darien, United States, 41.7448, -87.9822 Renfrew, United Kingdom, 55.8780, -4.3890 Gigaquit, Philippines, 9.5947, 125.6975 Tongzhou, China, 25.7000, 106.9333 Kafr Qasim, Israel, 32.1142, 34.9772 Binnish, Syria, 35.9566, 36.7138 Lino Lakes, United States, 45.1679, -93.0830 Rajauli, India, 24.6449, 85.5003 Mata Grande, Brazil, -9.1178, -37.7339 Lihuzhuang, China, 39.6210, 117.8190 Mbandjok, Cameroon, 4.4500, 11.9000 Montereau-faut-Yonne, France, 48.3853, 2.9508 Lindlar, Germany, 51.0167, 7.3833 Mangrol, India, 25.3300, 76.5200 Otsuki, Japan, 35.6106, 138.9400 Davlekanovo, Russia, 54.2167, 55.0333 Kocarli, Turkey, 37.7608, 27.7061 Los Palmitos, Colombia, 9.3811, -75.2714 Khadyzhensk, Russia, 44.4256, 39.5319 Machico, Portugal, 32.7000, -16.7667 Woodlawn, United States, 38.7332, -77.1149 Bujie, China, 28.0269, 105.0517 Priego de Cordoba, Spain, 37.4333, -4.1833 Kepsut, Turkey, 39.6889, 28.1522 Mangalvedha, India, 17.5167, 75.4667 Yoshioka, Japan, 36.4474, 139.0097 Danwan, India, 25.5292, 84.4598 Puttige, India, 12.6191, 75.0129 Massapequa, United States, 40.6676, -73.4706 Kizhakkemanad, India, 9.0174, 76.6509 Ginosa, Italy, 40.5000, 16.7500 Sheldon, United Kingdom, 52.4500, -1.7666 Mehnatobod, Tajikistan, 37.7167, 69.5500 Merrick, United States, 40.6515, -73.5535 Ginebra, Colombia, 3.7500, -76.1667 De Meern, Netherlands, 52.0781, 5.0281 Ma'muniyeh, Iran, 35.3050, 50.4975 Azambuja, Portugal, 39.0667, -8.8667 Carbondale, United States, 37.7221, -89.2237 Pascagoula, United States, 30.3666, -88.5506 Suwanee, United States, 34.0508, -84.0686 Pallippuram, India, 10.8406, 76.1118 Amtali, Bangladesh, 22.1189, 90.2210 Orobo, Brazil, -7.7450, -35.6019 Glauchau, Germany, 50.8233, 12.5444 Muzhakkunnu, India, 11.9528, 75.6694 Pueblo Juarez, Mexico, 17.7000, -93.2000 Dubnica nad Vahom, Slovakia, 48.9606, 18.1739 Kreuzlingen, Switzerland, 47.6458, 9.1783 Plonsk, Poland, 52.6231, 20.3706 Looc, Philippines, 12.2605, 121.9926 Rio Rico, United States, 31.4957, -110.9885 Falmouth, United Kingdom, 50.1500, -5.0700 Palmas de Monte Alto, Brazil, -14.2672, -43.1619 Silver Firs, United States, 47.8635, -122.1497 Poco Verde, Brazil, -10.7078, -38.1828 Millburn, United States, 40.7394, -74.3240 Santa Lucia Utatlan, Guatemala, 14.7667, -91.2667 Yate, United Kingdom, 51.5402, -2.4110 Morinda, India, 30.7900, 76.5000 Lakeside, United States, 32.8560, -116.9040 Four Square Mile, United States, 39.6808, -104.8880 Polkowice, Poland, 51.5000, 16.0667 Hazebrouck, France, 50.7250, 2.5392 Charo, Mexico, 19.7500, -101.0500 Ad Dabyah, Yemen, 13.6967, 44.7308 Ad Dali`, Yemen, 13.6957, 44.7314 Puruk Cahu, Indonesia, -0.6384, 114.5677 Magdalena, Mexico, 20.9167, -103.9500 Tuneri, India, 11.6833, 75.6167 Had Oulad Issa, Morocco, 32.9519, -8.6982 Ambatomanoina, Madagascar, -18.3110, 47.6253 Hassi Maameche, Algeria, 35.8611, 0.7250 Xanten, Germany, 51.6622, 6.4539 Sidi Amrane, Algeria, 33.5000, 6.0167 Surpur, India, 23.1895, 73.8928 Bhanpura, India, 24.5108, 75.7483 Geertruidenberg, Netherlands, 51.7008, 4.8603 Chatra Gobraura, India, 26.4973, 86.2179 El Callao, Venezuela, 7.3463, -61.8271 Holiday, United States, 28.1864, -82.7429 Kayanza, Burundi, -2.9167, 29.6167 Waghausel, Germany, 49.2500, 8.5167 Maniche, Haiti, 18.3450, -73.7772 Mailavaram, India, 16.7833, 80.6333 Mako, Hungary, 46.2200, 20.4789 Seia, Portugal, 40.4203, -7.7033 Seligenstadt, Germany, 50.0333, 8.9667 Florsheim, Germany, 50.0167, 8.4333 Otopeni, Romania, 44.5500, 26.0700 Geseke, Germany, 51.6500, 8.5167 Oberwingert, Switzerland, 47.5170, 8.7690 Shendurjana, India, 21.5217, 78.2908 Penonome, Panama, 8.5187, -80.3553 Bato, Philippines, 13.6000, 124.3000 Sarai Ranjan, India, 25.7671, 85.7245 Cagwait, Philippines, 8.9181, 126.3017 Puerto Triunfo, Colombia, 5.8667, -74.6500 Banapur, India, 19.7789, 85.1703 Yucca Valley, United States, 34.1234, -116.4216 Zoersel, Belgium, 51.2675, 4.7126 Guipos, Philippines, 7.7350, 123.3231 Chimore, Bolivia, -16.9833, -65.1333 Anamalais, India, 10.5830, 76.9344 Sori, Benin, 10.7281, 2.7825 Shanywathit, Burma, 17.4244, 97.8878 Stadtallendorf, Germany, 50.8333, 9.0167 Kalleribhagam, India, 9.0500, 76.5500 Massarosa, Italy, 43.8667, 10.3333 Vamanapuram, India, 8.7251, 76.9012 Miguelopolis, Brazil, -20.1794, -48.0319 Comalapa, Mexico, 15.6500, -92.1500 New Castle, United States, 40.9956, -80.3458 Zabre, Burkina Faso, 11.1833, -0.6333 Mezdra, Bulgaria, 43.1500, 23.7000 Yaojiazhuangcun, China, 40.7437, 114.9286 Yaojiafen, China, 40.6669, 115.0586 Erval d'Oeste, Brazil, -27.1939, -51.4950 Idukki, India, 9.8500, 76.9700 Tixtla de Guerrero, Mexico, 17.5667, -99.4000 Semikarakorsk, Russia, 47.5167, 40.8000 Vendram, India, 16.5620, 81.4696 Wadenswil, Switzerland, 47.2303, 8.6722 Guimar, Spain, 28.3150, -16.4100 Dax, France, 43.7100, -1.0500 Moulares, Tunisia, 34.4833, 8.2667 Amposta, Spain, 40.7106, 0.5808 Pachino, Italy, 36.7167, 15.1000 Bankoumana, Mali, 12.4214, -7.6075 Caransebes, Romania, 45.4214, 22.2219 Boumia, Morocco, 32.7228, -5.1053 Sao Joao da Madeira, Portugal, 40.9000, -8.5000 Guapiacu, Brazil, -20.7950, -49.2200 Port Alberni, Canada, 49.2339, -124.8050 Harvey, United States, 29.8876, -90.0666 Kozakai-cho, Japan, 34.8000, 137.3667 Pampierstad, South Africa, -27.7760, 24.6900 Selden, United States, 40.8714, -73.0466 Chagallu, India, 16.9833, 81.6667 Sombrerete, Mexico, 23.6333, -103.6397 Springwater, Canada, 44.4333, -79.7333 Eyl, Somalia, 7.9667, 49.8500 American Canyon, United States, 38.1796, -122.2583 Assare, Brazil, -6.8739, -39.8750 Paramirim, Brazil, -13.4425, -42.2389 Qadirganj, India, 24.9138, 85.5926 Port Hueneme, United States, 34.1618, -119.2036 Crowborough, United Kingdom, 51.0600, 0.1600 Kadiapattanam, India, 8.1312, 77.3067 Can-Avid, Philippines, 12.0000, 125.4500 Pampur, India, 34.0200, 74.9300 Al Karak, Jordan, 31.1833, 35.7000 Sirat, Algeria, 35.7800, 0.1919 Montmorency, France, 48.9906, 2.3228 Hurricane, United States, 37.1487, -113.3517 Ocotlan de Morelos, Mexico, 16.7914, -96.6750 Tigbao, Philippines, 7.8205, 123.2277 San Luis Talpa, El Salvador, 13.4667, -89.0833 Chantenay-sur-Loire, France, 47.2070, -1.5950 Senda, India, 24.4017, 87.9875 Kami, Japan, 38.5718, 141.8548 Zantiebougou, Mali, 11.2308, -7.2703 Ibicarai, Brazil, -14.8650, -39.5878 Fleury-les-Aubrais, France, 47.9312, 1.9210 Acheres, France, 48.9602, 2.0684 Bailleston, United Kingdom, 55.8474, -4.1147 Gros Islet, Saint Lucia, 14.0810, -60.9530 Nangavaram, India, 10.8692, 78.5392 Kobilo, Senegal, 15.9251, -13.5242 Himora, Ethiopia, 14.2861, 36.6097 Papanasam, India, 10.9273, 79.2708 Lohuti, Tajikistan, 40.2500, 70.1333 Jaipur Chuhar, India, 25.4187, 86.8352 Anuppur, India, 23.1034, 81.6908 Kanke, India, 23.4348, 85.3206 Sarzana, Italy, 44.1136, 9.9600 Pirai do Sul, Brazil, -24.5258, -49.9489 Lentini, Italy, 37.2833, 15.0000 San Jacinto, Colombia, 9.8311, -75.1219 Raja Pakar, India, 25.7350, 85.3376 Tiruvankod, India, 8.2452, 77.3010 Zossen, Germany, 52.2167, 13.4497 Okuchi-shinohara, Japan, 32.0500, 130.6167 Riachao das Neves, Brazil, -11.7458, -44.9100 Willowbrook, United States, 33.9209, -118.2356 Isla-Cristina, Spain, 37.1992, -7.3214 Kumla, Sweden, 59.1333, 15.1333 Howick, South Africa, -29.4667, 30.2333 St. John, United States, 41.4429, -87.4697 Oulad Embarek, Morocco, 32.2833, -6.4667 Tlaltenango de Sanchez Roman, Mexico, 21.7815, -103.3059 Sao Miguel do Guapore, Brazil, -11.6936, -62.7114 Mercato San Severino, Italy, 40.7831, 14.7348 Herent, Belgium, 50.9081, 4.6706 Hockenheim, Germany, 49.3181, 8.5472 Orzesze, Poland, 50.1500, 18.7500 Jiuru, Taiwan, 22.7333, 120.4833 Bavly, Russia, 54.3833, 53.2833 Pushkar, India, 26.4877, 74.5559 Valinda, United States, 34.0400, -117.9300 Zarnesti, Romania, 45.5667, 25.3333 Ayamonte, Spain, 37.2000, -7.4000 Mashiko, Japan, 36.4673, 140.0934 Notteroy, Norway, 59.2011, 10.4078 Tsetserleg, Mongolia, 47.4769, 101.4503 Novopokrovka, Kyrgyzstan, 42.8686, 74.7368 Sainte-Suzanne, Haiti, 19.5834, -72.0889 Scugog, Canada, 44.0900, -78.9360 Pajara, Spain, 28.3511, -14.1075 Bela Vista, Brazil, -22.1089, -56.5208 Nueva Granada, Colombia, 9.8031, -74.3903 Birmingham, United States, 42.5446, -83.2166 Dickinson, United States, 29.4548, -95.0589 Nerupperichchal, India, 11.1610, 77.3740 Schwetzingen, Germany, 49.3833, 8.5667 Amarpatan, India, 24.3137, 80.9770 Savigliano, Italy, 44.6500, 7.6333 Lakato, Madagascar, -19.1775, 48.4408 Xinzhai, China, 26.6959, 106.9964 South Euclid, United States, 41.5240, -81.5245 Paraguacu, Brazil, -21.5331, -45.7664 Vicente Noble, Dominican Republic, 18.3833, -71.1833 Koprivnice, Czechia, 49.5994, 18.1447 Voiron, France, 45.3642, 5.5906 Ashtarak, Armenia, 40.2975, 44.3617 Adra, India, 23.5000, 86.6700 San Fernando, Philippines, 12.4858, 123.7628 G`azalkent, Uzbekistan, 41.5625, 69.7750 Cuilapan de Guerrero, Mexico, 16.9972, -96.7817 Senaki, Georgia, 42.2689, 42.0678 Chapala, Mexico, 20.2961, -103.1911 Seynod, France, 45.8897, 6.0967 M'Chedallah, Algeria, 36.3667, 4.2667 Rosario de Lerma, Argentina, -24.9833, -65.5833 Laziska Gorne, Poland, 50.1500, 18.8500 Westborough, United States, 42.2681, -71.6140 Bougado, Portugal, 41.3306, -8.5371 Qal'acha, Tajikistan, 40.1333, 69.6833 Ibiruba, Brazil, -28.6278, -53.0900 Torrox, Spain, 36.7500, -3.9500 Marti, Cuba, 22.9522, -80.9167 Alcala la Real, Spain, 37.4500, -3.9167 Green Valley, United States, 31.8393, -111.0009 MacArthur, Philippines, 10.8356, 124.9964 Salcaja, Guatemala, 14.8833, -91.4500 Alliance, United States, 40.9107, -81.1189 Clemmons, United States, 36.0319, -80.3861 Chilca, Peru, -12.5208, -76.7369 Mandapam, India, 9.2822, 79.1436 Pergine Valsugana, Italy, 46.0667, 11.2333 Pakala, India, 13.4667, 79.1167 Waxhaw, United States, 34.9363, -80.7439 San Nicolas, Cuba, 22.7819, -81.9069 Agios Nikolaos, Greece, 35.1833, 25.7167 Del City, United States, 35.4483, -97.4408 Rancheria Payau, Philippines, 7.8509, 123.1542 Santa Teresita, Philippines, 13.8664, 120.9814 Kutna Hora, Czechia, 49.9483, 15.2683 Uxbridge, Canada, 44.1167, -79.1333 Horsforth, United Kingdom, 53.8370, -1.6430 Truro, United Kingdom, 50.2600, -5.0510 Kalpakathukonam, India, 8.8325, 76.7453 Traunstein, Germany, 47.8667, 12.6333 Beni Douala, Algeria, 36.6167, 4.0833 Colle di Val d'Elsa, Italy, 43.4225, 11.1267 Pancas, Brazil, -19.2250, -40.8508 Galeras, Colombia, 9.1667, -75.0500 Ennis, United States, 32.3254, -96.6347 Darlaston, United Kingdom, 52.5708, -2.0457 El Jem, Tunisia, 35.2967, 10.7128 Cabucgayan, Philippines, 11.4719, 124.5750 Naranammalpuram, India, 8.7599, 77.7399 Kontela, Mali, 14.7664, -11.1022 Saint-Michel-sur-Orge, France, 48.6303, 2.3025 Seymour, United States, 38.9476, -85.8911 Corciano, Italy, 43.1290, 12.2877 Gardanne, France, 43.4553, 5.4760 Lindenwold, United States, 39.8173, -74.9898 Sahline, Tunisia, 35.7506, 10.7122 Naqadah, Egypt, 25.9017, 32.7242 Acatic, Mexico, 20.7803, -102.9100 Sermadevi, India, 8.6873, 77.5662 Ladario, Brazil, -19.0050, -57.6019 Selydove, Ukraine, 48.1500, 37.3039 Dean Funes, Argentina, -30.4333, -64.3500 Florida Ridge, United States, 27.5805, -80.3848 Pleasant Prairie, United States, 42.5266, -87.8895 Cardito, Italy, 40.9362, 14.2993 Mari, Brazil, -7.0600, -35.3189 Caombo, Angola, -8.7000, 16.5167 San Martin de las Piramides, Mexico, 19.7333, -98.8167 Villagarzon, Colombia, 1.0294, -76.6164 Ano Syros, Greece, 37.4333, 24.9167 Goroka, Papua New Guinea, -6.0833, 145.3833 Chebli, Algeria, 36.5778, 3.0083 Unity, United States, 40.2811, -79.4236 Bastos, Brazil, -21.9167, -50.7333 Aarau, Switzerland, 47.3923, 8.0446 Bad Harzburg, Germany, 51.8811, 10.5622 Alnavar, India, 15.4273, 74.7411 Whyalla, Australia, -33.0333, 137.5667 Juma Shahri, Uzbekistan, 39.7161, 66.6642 Parelhas, Brazil, -6.6878, -36.6578 Satun, Thailand, 6.6147, 100.0681 Boquira, Brazil, -12.8231, -42.7306 Spremberg, Germany, 51.5717, 14.3794 North Guwahati, India, 26.1900, 91.7100 Muthutala, India, 10.7800, 76.1700 Tanki Leendert, Aruba, 12.5418, -70.0220 Alta Floresta D'Oeste, Brazil, -11.9283, -61.9950 Jawor, Poland, 51.0500, 16.2000 Askale, Turkey, 39.9211, 40.6947 San Bernardo, Colombia, 1.5108, -77.0467 Iguai, Brazil, -14.7558, -40.0889 Aldan, Russia, 58.6167, 125.4167 Rocky River, United States, 41.4702, -81.8525 Rose Hill, United States, 38.7872, -77.1085 Zerbst, Germany, 51.9681, 12.0844 Chesham, United Kingdom, 51.7120, -0.6120 Tukwila, United States, 47.4750, -122.2728 Puerto Natales, Chile, -51.7333, -72.5167 Trezzano sul Naviglio, Italy, 45.4333, 9.0667 Takaba, Kenya, 3.3553, 40.2228 Pandan, Philippines, 14.0500, 124.1700 North Ogden, United States, 41.3123, -111.9584 Kodikuthi, India, 9.4667, 76.9500 Richmond, United Kingdom, 51.4560, -0.3010 Ambohitromby, Madagascar, -19.0439, 46.4287 Bezhetsk, Russia, 57.7667, 36.7000 Darganata, Turkmenistan, 40.4833, 62.1667 Hojambaz, Turkmenistan, 38.1167, 65.0000 Gokdepe, Turkmenistan, 38.1578, 57.9664 Fort St. John, Canada, 56.2465, -120.8476 Madakasira, India, 13.9369, 77.2694 El Paujil, Colombia, 1.5644, -75.3319 Juli, Peru, -16.2125, -69.4603 Kotli, Pakistan, 33.5156, 73.9019 Llorente, Philippines, 11.4125, 125.5458 Loncoche, Chile, -39.3667, -72.6333 Sihu, Taiwan, 23.6411, 120.2010 Beni Mered, Algeria, 36.5233, 2.8617 Ganapavaram, India, 16.1233, 80.1721 Laventille, Trinidad and Tobago, 10.6500, -61.4833 Paramonga, Peru, -10.6744, -77.8186 Rees, Germany, 51.7667, 6.4000 Palatka, Russia, 60.1000, 150.9000 Helena, United States, 33.2837, -86.8791 Qalansuwa, Israel, 32.2850, 34.9811 Riehen, Switzerland, 47.5806, 7.6492 Tong'anyi, China, 35.3041, 104.6802 Paravai, India, 9.9690, 78.0613 Pendurti, India, 17.8278, 83.2022 Bariarpur, India, 25.6860, 86.0295 Five Corners, United States, 45.6883, -122.5738 Bogande, Burkina Faso, 12.9667, -0.1500 Nhamunda, Brazil, -2.1861, -56.7131 Grand Island, United States, 43.0198, -78.9619 Belper, United Kingdom, 53.0290, -1.4750 Thenia, Algeria, 36.7278, 3.5539 Partizanske, Slovakia, 48.6333, 18.3667 Secaucus, United States, 40.7810, -74.0659 Tambau, Brazil, -21.7050, -47.2739 Gauting, Germany, 48.0678, 11.3739 Andippatti, India, 9.9980, 77.6210 Maruturu, India, 15.9862, 80.1041 Egil, Turkey, 38.2572, 40.0847 Icapui, Brazil, -4.7128, -37.3550 Shahbazpur, Bangladesh, 24.0517, 91.1733 Trinidad, Uruguay, -33.5333, -56.8833 Wilmot, Canada, 43.4000, -80.6500 Feira Nova, Brazil, -7.9508, -35.3889 Lom, Bulgaria, 43.8256, 23.2375 Hoogstraten, Belgium, 51.4008, 4.7611 Wildeshausen, Germany, 52.9000, 8.4333 Noamundi, India, 22.1609, 85.5042 Sao Joao do Piaui, Brazil, -8.3578, -42.2469 Grevena, Greece, 40.0850, 21.4275 Urucuca, Brazil, -14.5928, -39.2839 Ghanzi, Botswana, -21.7000, 21.6500 Mount Pleasant, United States, 43.5966, -84.7759 Mountlake Terrace, United States, 47.7921, -122.3077 Chaumont, France, 48.1117, 5.1389 San Bonifacio, Italy, 45.4000, 11.2833 Lioua, Algeria, 34.6375, 5.3958 Taurage, Lithuania, 55.2522, 22.2897 Santa Rosa de Lima, Guatemala, 14.3833, -90.3000 Santa Barbara, Colombia, 5.8747, -75.5661 Srivaikuntam, India, 8.6318, 77.9130 Moorestown, United States, 39.9784, -74.9413 Puchheim, Germany, 48.1500, 11.3500 Jandaia do Sul, Brazil, -23.6028, -51.6428 Cartaya, Spain, 37.2833, -7.1500 Alejandro Korn, Argentina, -34.9667, -58.3667 Stowmarket, United Kingdom, 52.1900, 1.0000 Velsk, Russia, 61.0667, 42.1167 Ashland, United States, 38.4592, -82.6448 Allauch, France, 43.3369, 5.4828 Clevedon, United Kingdom, 51.4380, -2.8540 New Hope, United States, 45.0375, -93.3869 Bayi, China, 29.6664, 94.3628 Swiedbodzin, Poland, 52.2500, 15.5333 Cumaral, Colombia, 4.2694, -73.4864 Pamarru, India, 16.3270, 80.9610 Grajewo, Poland, 53.6500, 22.4500 Shirhatti, India, 15.2313, 75.5772 Naas, Ireland, 53.2158, -6.6669 Annecy-le-Vieux, France, 45.9200, 6.1428 Inopacan, Philippines, 10.5000, 124.7500 Khowai, India, 24.0650, 91.6050 Mohiuddinnagar, India, 25.7428, 86.0812 Perdoes, Brazil, -21.0908, -45.0908 Krasnouralsk, Russia, 58.3500, 60.0500 Vecses, Hungary, 47.4108, 19.2722 Los Vilos, Chile, -31.9167, -71.5167 Osterode, Germany, 51.7286, 10.2522 Singur, India, 22.8100, 88.2300 Kirkintilloch, United Kingdom, 55.9380, -4.1550 Gummudipundi, India, 13.3995, 80.1187 Granite Bay, United States, 38.7601, -121.1714 Nedre Eiker, Norway, 59.7667, 10.0333 Masis, Armenia, 40.0633, 44.4408 Allende, Mexico, 28.3333, -100.8333 Zulpich, Germany, 50.7000, 6.6500 Teteven, Bulgaria, 42.9170, 24.2670 Almaguer, Colombia, 1.9167, -76.8667 Chouafa, Morocco, 34.7667, -6.0500 Palma di Montechiaro, Italy, 37.1936, 13.7658 Igreja Nova, Brazil, -10.1253, -36.6619 Senago, Italy, 45.5833, 9.1333 Fortin de las Flores, Mexico, 18.9000, -97.0000 Mons-en-Baroeul, France, 50.6369, 3.1103 Bilohorodka, Ukraine, 50.3942, 30.2314 Ambinanindrano, Madagascar, -20.6791, 47.5671 East Patchogue, United States, 40.7704, -72.9817 Fukuyoshi, Japan, 33.6833, 130.7800 Otsego, United States, 45.2660, -93.6201 Stange, Norway, 60.7167, 11.1833 Bornem, Belgium, 51.1000, 4.2333 Silva Jardim, Brazil, -22.6508, -42.3919 Hafshejan, Iran, 32.2253, 50.7961 Galugah, Iran, 36.7269, 53.8089 Polygyros, Greece, 40.3667, 23.4333 Zambrow, Poland, 52.9833, 22.2500 Tiruppuvanam, India, 9.8550, 78.2744 Krasnoarmeysk, Russia, 51.0231, 45.7031 Manlleu, Spain, 42.0000, 2.2836 Mi'eso, Ethiopia, 9.2333, 40.7500 Metahara, Ethiopia, 8.9000, 39.9167 Mundgod, India, 14.9714, 75.0366 Darton, United Kingdom, 53.5850, -1.5325 Kasumpti, India, 31.0700, 77.1800 Hammanskraal, South Africa, -25.4000, 28.2833 Stephenville, United States, 32.2147, -98.2205 Ashland, United States, 42.1905, -122.6992 Padmanabhapuram, India, 8.2446, 77.3367 Doaba, Pakistan, 33.5333, 70.7333 Kaman, Turkey, 39.3575, 33.7239 Karlovo, Bulgaria, 42.6420, 24.8082 Pambadi, India, 9.4264, 76.5611 Carlisle, United States, 40.2000, -77.2034 Gallup, United States, 35.5182, -108.7431 Antilla, Cuba, 20.8411, -75.7206 Saint-Genis-Laval, France, 45.6960, 4.7930 Terrier Rouge, Haiti, 19.6363, -71.9548 Bouznika, Morocco, 33.7897, -7.1575 Oum Drou, Algeria, 36.2000, 1.3833 Sriperumbudur, India, 12.9680, 79.9473 Mragowo, Poland, 53.8667, 21.3000 Youganning, China, 34.7356, 101.6114 Yegainnyin, China, 34.7356, 101.5978 Alcudia, Spain, 39.8525, 3.1192 Mit Nama, Egypt, 30.1453, 31.2343 South Lake Tahoe, United States, 38.9393, -119.9828 Carcagente, Spain, 39.1222, -0.4489 Stevenson Ranch, United States, 34.3894, -118.5883 Kelkit, Turkey, 40.1286, 39.4383 Candler-McAfee, United States, 33.7267, -84.2723 Tubbergen, Netherlands, 52.4000, 6.7667 Alagir, Russia, 43.0333, 44.2333 Naryn, Tajikistan, 38.2000, 68.9000 Mesquite, United States, 36.8032, -114.1330 Armidale, Australia, -30.5000, 151.6500 Sao Joao, Brazil, -8.8756, -36.3667 Mukilteo, United States, 47.9096, -122.3035 Aiud, Romania, 46.3122, 23.7292 Nirmali, India, 26.3140, 86.5854 Narippatta, India, 11.6972, 75.7181 Wang Nam Yen, Thailand, 13.5033, 102.1812 Artashat, Armenia, 39.9539, 44.5506 Makulubita, Uganda, 0.5122, 32.3664 Hwange, Zimbabwe, -18.3647, 26.5000 Monroe, United States, 41.3043, -74.1941 Geneva, United States, 41.8833, -88.3242 Puzol, Spain, 39.6167, -0.3011 Casal di Principe, Italy, 41.0108, 14.1319 Saint-Gratien, France, 48.9719, 2.2828 Luna, Philippines, 18.3311, 121.3725 Germersheim, Germany, 49.2167, 8.3667 Kaduturutti, India, 9.7833, 76.3000 Huy, Belgium, 50.5201, 5.2375 Pefki, Greece, 38.0667, 23.8000 Battle Ground, United States, 45.7766, -122.5413 Kaikalur, India, 16.5509, 81.2000 Siilinjarvi, Finland, 63.0750, 27.6600 Mustang, United States, 35.3917, -97.7246 Chagalamarri, India, 14.9667, 78.5833 Cacem, Portugal, 38.7704, -9.3081 Krus na Ligas, Philippines, 14.6442, 121.0636 Elmwood Park, United States, 40.9049, -74.1201 Sevilimedu, India, 12.8083, 79.6864 Royton, United Kingdom, 53.5660, -2.1210 Mansourah, Algeria, 36.0819, 4.4600 Kitcharao, Philippines, 9.4600, 125.5800 Carthage, Tunisia, 36.8528, 10.3233 Belovodskoe, Kyrgyzstan, 42.8333, 74.1167 Mabitac, Philippines, 14.4300, 121.4200 Somers, United States, 41.3056, -73.7252 Beroun, Czechia, 49.9642, 14.0739 Wielun, Poland, 51.2206, 18.5700 Linamon, Philippines, 8.1800, 124.1700 Nowa Ruda, Poland, 50.5833, 16.5000 Agropoli, Italy, 40.3469, 14.9965 Vialonga, Portugal, 38.8740, -9.0834 Almasi, Tajikistan, 38.6833, 68.6000 Gobo, Japan, 33.8833, 135.1500 Oshoba, Tajikistan, 40.7347, 70.4417 Akkus, Turkey, 40.7931, 37.0164 Nang Rong, Thailand, 14.6283, 102.7933 Iruttarakonam, India, 8.5863, 76.8976 Milwaukie, United States, 45.4445, -122.6219 Hunters Creek, United States, 28.3610, -81.4358 Rolante, Brazil, -29.6508, -50.5758 Xinjie, China, 27.7049, 103.3808 Namagiripettai, India, 11.4700, 78.2700 Sulejowek, Poland, 52.2442, 21.2800 Koduvilarpatti, India, 9.9695, 77.4915 Ntcheu, Malawi, -14.8167, 34.6333 Pinarbasi, Turkey, 38.7220, 36.3910 Sanxing, Taiwan, 24.6739, 121.6631 Aguadas, Colombia, 5.6167, -75.4667 Manuel Tames, Cuba, 20.1803, -75.0514 Bhairi, Nepal, 28.9300, 81.6300 Brownhills, United Kingdom, 52.6470, -1.9330 Schramberg, Germany, 48.2269, 8.3842 Montecristo, Colombia, 8.2994, -74.4756 Narkher, India, 21.4383, 78.5683 Urk, Netherlands, 52.6653, 5.6058 Tadikombu, India, 10.4390, 77.9546 Degollado, Mexico, 20.4667, -102.1500 Fierenana, Madagascar, -18.5428, 45.8463 Dupax del Sur, Philippines, 16.2842, 121.0917 Saint-Mande, France, 48.8422, 2.4186 Znamianka, Ukraine, 48.7136, 32.6733 Sasovo, Russia, 54.3500, 41.9167 Sao Sepe, Brazil, -30.1608, -53.5650 Pillaiyarkuppam, India, 11.8119, 79.7922 Waren, Germany, 53.5167, 12.6833 Bobonong, Botswana, -21.9655, 28.4363 Gorgonzola, Italy, 45.5333, 9.4000 Lebanon, United States, 39.4254, -84.2133 Essex, Canada, 42.0833, -82.9000 Mouyondzi, Congo (Brazzaville), -3.9956, 13.9219 Kosgi, India, 16.9878, 77.7169 Zonhoven, Belgium, 50.9914, 5.3709 Concepcion Huista, Guatemala, 15.6167, -91.6833 Montgomery, United States, 41.7237, -88.3633 Jiangjiadong, China, 24.5811, 112.8994 Kontich, Belgium, 51.1333, 4.4500 Parasi, India, 24.1908, 82.7817 Matsuura, Japan, 33.3408, 129.7092 Snellville, United States, 33.8562, -84.0038 Merefa, Ukraine, 49.8167, 36.0500 Mandelieu-la-Napoule, France, 43.5464, 6.9381 Obock, Djibouti, 11.9667, 43.2833 Rybnoye, Russia, 54.7333, 39.5167 Varennes, Canada, 45.6833, -73.4333 Lucelia, Brazil, -21.7203, -51.0189 Chorwad, India, 21.0167, 70.2333 Ratu, India, 23.4204, 85.2146 Caapora, Brazil, -7.5158, -34.9078 Rio Maior, Portugal, 39.3333, -8.9333 Qia'erbagecun, China, 37.9724, 77.3399 Valle Nacional, Mexico, 17.7667, -96.3000 Nagamangala, India, 12.8194, 76.7546 Borgomanero, Italy, 45.7000, 8.4667 Boca da Mata, Brazil, -9.6408, -36.2200 Rupauli, India, 25.8695, 87.0600 Sondershausen, Germany, 51.3667, 10.8667 Sal'a, Slovakia, 48.1500, 17.8833 Floridia, Italy, 37.0833, 15.1500 Vryburg, South Africa, -26.9586, 24.7322 Shazand, Iran, 33.9292, 49.4103 Lensk, Russia, 60.7333, 114.9167 Belonia, India, 23.2500, 91.4500 Mogan, Spain, 27.8667, -15.7167 Lathi, India, 21.4500, 71.3800 South Whitehall, United States, 40.6154, -75.5503 Belas, Portugal, 38.7772, -9.2608 Varadero, Cuba, 23.1394, -81.2861 Tiburon, Haiti, 18.3266, -74.3953 Carrboro, United States, 35.9259, -79.0878 Sarari, India, 26.2523, 84.5484 Sevenoaks, United Kingdom, 51.2781, 0.1874 Tinja, Tunisia, 37.1667, 9.7667 Volnovakha, Ukraine, 47.6022, 37.4919 Guasipati, Venezuela, 7.4667, -61.4667 San Juan de Vilasar, Spain, 41.5060, 2.3910 Morsang-sur-Orge, France, 48.6618, 2.3461 Dronfield, United Kingdom, 53.3024, -1.4664 Tighedouine, Morocco, 31.4236, -7.5208 Seydi, Turkmenistan, 39.4167, 62.9000 Baldwin, United States, 40.3690, -79.9669 Clarin, Philippines, 9.9700, 124.0200 Khromtau, Kazakhstan, 50.2503, 58.4347 Dukinfield, United Kingdom, 53.4739, -2.0828 Kuttikkattur, India, 11.2667, 75.8750 La Union, Spain, 37.6192, -0.8756 Hallein, Austria, 47.6831, 13.0969 Allschwil, Switzerland, 47.5508, 7.5358 Florencia, Cuba, 22.1475, -78.9669 Morasar, India, 23.0942, 72.5961 Jekabpils, Latvia, 56.4975, 25.8664 Maracacume, Brazil, -2.0428, -45.9589 Hancha, China, 37.8822, 109.4947 Sapone, Burkina Faso, 12.0528, -1.6036 Kanmaki, Japan, 34.5628, 135.7167 Herborn, Germany, 50.6825, 8.3061 Bourg-la-Reine, France, 48.7796, 2.3151 Loyola Heights, Philippines, 14.6403, 121.0744 Kannanendal, India, 9.9649, 78.1416 Willmar, United States, 45.1216, -95.0569 Quirima, Angola, -10.9000, 18.0833 Saurh, India, 25.3789, 86.8223 Yasothon, Thailand, 15.7972, 104.1431 Cortona, Italy, 43.2756, 11.9881 Kagizman, Turkey, 40.1583, 43.1342 Aguinaldo, Philippines, 16.9789, 121.3272 Skegness, United Kingdom, 53.1436, 0.3428 Carlos Casares, Argentina, -35.6167, -61.3667 Bryant, United States, 34.6152, -92.4914 Adigaratti, India, 11.3357, 76.6971 Enkoping, Sweden, 59.6333, 17.0667 Old Jamestown, United States, 38.8394, -90.2847 Shark, Kyrgyzstan, 40.5569, 72.8264 Suaza, Colombia, 1.9833, -75.8167 Hanahan, United States, 32.9302, -80.0027 Adet, Ethiopia, 11.2667, 37.4833 Kokofata, Mali, 12.8833, -9.9500 Princesa Isabel, Brazil, -7.7369, -37.9928 San Juan de Rio Coco, Nicaragua, 13.5500, -86.1667 Nogales, Mexico, 18.8167, -97.1667 Forbach, France, 49.1900, 6.9000 Irukanni, India, 11.7500, 76.1833 Martellago, Italy, 45.5467, 12.1575 Amodei, India, 26.8975, 84.8182 Banki, India, 20.3791, 85.5295 Conceicao de Macabu, Brazil, -22.0850, -41.8678 Molde, Norway, 62.7375, 7.1631 Chocaman, Mexico, 19.0167, -97.0333 Altepexi, Mexico, 18.3500, -97.3167 Tomarza, Turkey, 38.4472, 35.7992 Le Plessis-Trevise, France, 48.8111, 2.5717 Tehata, India, 23.7000, 88.5500 Little Egg Harbor, United States, 39.5969, -74.3454 El Pinar, Uruguay, -34.7972, -55.9097 Hyde Park, United States, 41.8011, -73.9060 San Isidro de Lules, Argentina, -26.9333, -65.3500 Oued el Aneb, Algeria, 36.8833, 7.4833 Itapaci, Brazil, -14.9508, -49.5489 Tizi-n-Bechar, Algeria, 36.4311, 5.3600 Sadao, Thailand, 6.6388, 100.4234 Sao Marcos, Brazil, -28.9708, -51.0678 Seria, Brunei, 4.6141, 114.3302 Mineola, United States, 40.7470, -73.6394 Hays, United States, 38.8821, -99.3221 West St. Paul, United States, 44.9018, -93.0858 Gardner, United States, 42.5845, -71.9868 Xoxocotla, Mexico, 18.6850, -99.2439 Nong Bua Lamphu, Thailand, 17.2042, 102.4444 Furano, Japan, 43.3500, 142.3833 Paiganapalli, India, 12.4760, 78.1748 Phulpur, India, 25.5500, 82.1000 Sondrio, Italy, 46.1697, 9.8700 Injibara, Ethiopia, 10.9500, 36.9333 Orhei, Moldova, 47.3831, 28.8231 Melgaco, Brazil, -1.8039, -50.7119 Xinnongcun, China, 42.2357, 122.9455 Palmeiras, Brazil, -2.6450, -44.8950 Wipperfurth, Germany, 51.1167, 7.4000 Behat, India, 26.2435, 86.2799 Caxambu, Brazil, -21.9769, -44.9328 Paulistana, Brazil, -8.1439, -41.1500 Svetlyy, Russia, 54.6667, 20.1333 Nordlingen, Germany, 48.8511, 10.4883 Laje, Brazil, -13.1819, -39.4250 Villapinzon, Colombia, 5.2167, -73.6000 Horstel, Germany, 52.2972, 7.5861 Palafrugell, Spain, 41.9174, 3.1631 Jangy-Nookat, Kyrgyzstan, 40.2500, 72.5500 San Francisco, El Salvador, 13.7000, -88.1000 Ukmerge, Lithuania, 55.2500, 24.7667 Itapecerica, Brazil, -20.4728, -45.1258 Silverdale, United States, 47.6663, -122.6828 Joaquin V. Gonzalez, Argentina, -25.0833, -64.1833 Itambacuri, Brazil, -18.0364, -41.6830 Veresegyhaz, Hungary, 47.6569, 19.2847 Nubl, Syria, 36.3787, 36.9929 Oro-Medonte, Canada, 44.5667, -79.5833 Jozefow, Poland, 52.1356, 21.2369 Praia da Vitoria, Portugal, 38.7333, -27.0667 Mirador, Brazil, -6.3708, -44.3628 Caterham, United Kingdom, 51.2803, -0.0816 Porto Torres, Italy, 40.8369, 8.4014 Sao Jeronimo, Brazil, -29.9589, -51.7219 Kotovo, Russia, 50.3167, 44.8000 Lealman, United States, 27.8197, -82.6847 Patpara, India, 26.4328, 86.1916 Ariano Irpino, Italy, 41.1528, 15.0889 Tabursuq, Tunisia, 36.4572, 9.2483 East Pennsboro, United States, 40.2886, -76.9394 Traunreut, Germany, 47.9667, 12.5833 Klaukkala, Finland, 60.3820, 24.7492 San Jose de Jachal, Argentina, -30.2333, -68.7500 Gross-Umstadt, Germany, 49.8667, 8.9333 Tornio, Finland, 65.8500, 24.1500 South Holland, United States, 41.5977, -87.6022 Az Zuwaytinah, Libya, 30.9522, 20.1203 Timmarasanayakkanur, India, 10.0015, 77.6769 Bothell West, United States, 47.8056, -122.2401 Loei, Thailand, 17.4853, 101.7303 Woodlesford, United Kingdom, 53.7567, -1.4530 Ait Ben Daoudi, Morocco, 31.6345, -7.6440 Wulfrath, Germany, 51.2833, 7.0333 San Victor Abajo, Dominican Republic, 19.4500, -70.5300 Manjhi, India, 25.8384, 84.5788 Fatehgarh Churian, India, 31.8643, 74.9567 Tanhacu, Brazil, -14.0208, -41.2478 Samba, India, 32.5624, 75.1199 Stratton Saint Margaret, United Kingdom, 51.5860, -1.7620 Ronda, Philippines, 10.0003, 123.4095 Alto-Cuilo, Angola, -10.0490, 19.5155 Cuilo, Angola, -10.0500, 19.5167 Daddi, India, 16.0667, 74.4333 Mangghystau, Kazakhstan, 43.6956, 51.3261 Sulphur, United States, 30.2286, -93.3566 Cranendonck, Netherlands, 51.2853, 5.5881 Sremcica, Serbia, 44.6767, 20.3910 Murphy, United States, 33.0186, -96.6105 Fengjia, China, 27.7969, 110.8603 Dabaozi, China, 26.7006, 109.4634 Luckenwalde, Germany, 52.0833, 13.1667 Sancoale, India, 15.4708, 73.8431 Kudal, India, 17.8356, 73.9175 `Anah, Iraq, 34.3686, 41.9819 Mandza, Comoros, -11.4167, 43.3000 Morafeno, Madagascar, -15.4902, 48.2067 Sitampiky, Madagascar, -16.6758, 46.1094 Ambalavato, Madagascar, -22.9693, 47.4773 Tongobory, Madagascar, -23.5317, 44.3231 Tsarasaotra, Madagascar, -20.4394, 47.2187 Ambohipandrano, Madagascar, -19.1451, 47.3471 Andolofotsy, Madagascar, -18.7493, 46.6373 Soanindrariny, Madagascar, -19.9069, 47.2352 Ankililoaka, Madagascar, -22.7674, 43.6159 Tsiamalao, Madagascar, -15.0346, 48.4477 Fiadanana, Madagascar, -20.4377, 48.3807 Antanambao, Madagascar, -19.6773, 47.3391 Sahamadio, Madagascar, -22.5208, 47.5766 Miorimivalana, Madagascar, -17.2219, 49.2050 Ambohimanambola, Madagascar, -19.8049, 46.6112 Ampasimatera, Madagascar, -15.9339, 47.7362 Karianga, Madagascar, -22.4291, 47.3720 Matanga, Madagascar, -23.5238, 47.5525 La Colonia Tovar, Venezuela, 10.4056, -67.2894 Sidi Lahssen, Algeria, 35.1633, -0.6958 Tufanganj, India, 26.3345, 89.6699 Torqabeh, Iran, 36.3142, 59.3725 Fredonia, Colombia, 5.9167, -75.6667 San Antonio Sacatepequez, Guatemala, 14.9667, -91.7333 Vadakkum, India, 9.0167, 76.5500 Senden, Germany, 51.8572, 7.4828 Yunak, Turkey, 38.8172, 31.7356 Walia, Mali, 13.5939, -10.3775 Cassilandia, Brazil, -19.1128, -51.7339 Laranjeira, Portugal, 38.6567, -9.1497 Barcelona, Philippines, 12.8694, 124.1419 Capela do Alto, Brazil, -23.4706, -47.7347 Agan, China, 35.9176, 103.8501 Saint Austell, United Kingdom, 50.3400, -4.7900 Welench'iti, Ethiopia, 8.6667, 39.4333 Daboh, India, 26.0024, 78.8766 Safsaf, Morocco, 34.5581, -6.0078 Nizampatam, India, 15.9000, 80.6667 El Reten, Colombia, 10.6167, -74.2667 Mossingen, Germany, 48.4064, 9.0575 Suzzara, Italy, 44.9927, 10.7494 Dolton, United States, 41.6284, -87.5979 Alnif, Morocco, 31.1167, -5.1667 Zele, Belgium, 51.0667, 4.0333 Archena, Spain, 38.1150, -1.2992 Anna, United States, 33.3472, -96.5508 Santa Vitoria, Brazil, -18.8389, -50.1208 Baiheqiao, China, 22.9711, 103.7964 Thuan An, Vietnam, 16.5489, 107.6436 Bugalagrande, Colombia, 4.2167, -76.1667 Ozoir-la-Ferriere, France, 48.7780, 2.6800 Ankaraobato, Madagascar, -19.0000, 47.5333 Aybasti, Turkey, 40.6867, 37.3992 Hualqui, Chile, -36.9600, -72.9300 Princeton, United States, 33.1778, -96.5044 Caracarai, Brazil, 1.8158, -61.1278 Mantsala, Finland, 60.6361, 25.3194 Covington, United States, 47.3667, -122.1045 Croix, France, 50.6781, 3.1508 Fort Walton Beach, United States, 30.4255, -86.6222 Carmo do Rio Claro, Brazil, -20.9731, -46.1189 St. Andrews, United States, 34.0510, -81.1057 Brushy Creek, United States, 30.5128, -97.7386 Mont-Royal, Canada, 45.5161, -73.6431 Pacatu, Brazil, -11.9578, -38.9750 Hirekerur, India, 14.4551, 75.3952 Quela, Angola, -9.3833, 17.0500 Purranque, Chile, -40.9167, -73.1667 Hino, Japan, 35.0167, 136.2500 Vicksburg, United States, 32.3173, -90.8868 Givors, France, 45.5914, 4.7694 Imperial, United States, 32.8390, -115.5720 Germantown, United States, 43.2343, -88.1217 San Cataldo, Italy, 37.4833, 13.9833 Vladicin Han, Serbia, 42.7000, 22.0667 Chaudfontaine, Belgium, 50.5818, 5.6340 Cuncolim, India, 15.1773, 73.9939 Ondorhaan, Mongolia, 47.3167, 110.6500 Piedra Blanca, Dominican Republic, 18.8438, -70.3157 Schortens, Germany, 53.5333, 7.9500 Damua, India, 22.1929, 78.4670 Punturin, Philippines, 14.7381, 120.9978 Renens, Switzerland, 46.5333, 6.5833 Dingolfing, Germany, 48.6333, 12.5000 Nambiyur, India, 11.3581, 77.3211 Ostrov, Russia, 57.3500, 28.3500 Cho Phuoc Hai, Vietnam, 10.4283, 107.2953 Alagoa Nova, Brazil, -7.0708, -35.7583 Concepcion Chiquirichapa, Guatemala, 14.8500, -91.6167 Gazi, Greece, 35.3250, 25.0667 Argenta, Italy, 44.6148, 11.8368 San Guillermo, Philippines, 16.7244, 121.8100 Vili, Burkina Faso, 12.2833, -2.2167 Aisho, Japan, 35.1667, 136.2167 Leskovac, Serbia, 42.9981, 21.9461 Guara, Brazil, -20.4283, -47.8242 Hallim, Korea, South, 33.3729, 126.2827 Jericho, West Bank, 31.8571, 35.4603 Esperalvillo, Dominican Republic, 18.8200, -70.0300 Vakkam, India, 8.6900, 76.7700 Park Forest, United States, 41.4817, -87.6867 Pudupattanam, India, 12.5037, 80.1507 Lucani, Serbia, 43.8667, 20.1333 Kamamaung, Burma, 17.3469, 97.6528 Bruchkobel, Germany, 50.1833, 8.9167 Upper St. Clair, United States, 40.3336, -80.0842 Eeklo, Belgium, 51.1833, 3.5500 Monte Santo de Minas, Brazil, -21.1900, -46.9800 Pico Truncado, Argentina, -46.7950, -67.9550 Beaumont, Canada, 53.3572, -113.4147 Texistepec, Mexico, 17.9000, -94.8167 Balugan, India, 19.7333, 85.2167 Steinhagen, Germany, 52.0050, 8.4147 Brummen, Netherlands, 52.0833, 6.1500 Arnold, United States, 38.4297, -90.3733 Sant Just Desvern, Spain, 41.3830, 2.0750 Don Bosco, Argentina, -34.7000, -58.2833 Koath, India, 25.3264, 84.2598 Roshal, Russia, 55.6667, 39.8833 Quixere, Brazil, -5.0739, -37.9889 Normanton, United Kingdom, 53.6970, -1.4160 Ambohimanga, Madagascar, -18.7333, 47.5667 Villeneuve-le-Roi, France, 48.7333, 2.4167 Bobrov, Russia, 51.1000, 40.0333 Sint-Katelijne-Waver, Belgium, 51.0667, 4.5333 Palavur, India, 8.2055, 77.5755 Mulanje, Malawi, -16.0333, 35.5000 Murree, Pakistan, 33.9042, 73.3903 Arbutus, United States, 39.2428, -76.6922 Zaliohouan, Côte d’Ivoire, 6.7952, -6.2355 Springfield, United States, 40.0986, -75.2016 Sotomayor, Colombia, 1.4933, -77.5214 Bordj Bounaama, Algeria, 35.8500, 1.6167 Bambalang, Cameroon, 5.8867, 10.5331 Mudakkal, India, 8.7011, 76.8589 Kara-Suu, Kyrgyzstan, 40.7000, 72.8833 Aurad, India, 18.2540, 77.4176 Hyattsville, United States, 38.9613, -76.9548 Fot, Hungary, 47.6092, 19.1928 Karia Ba Mohamed, Morocco, 34.3667, -5.2000 Luisiana, Philippines, 14.1850, 121.5109 El Carmen de Chucuri, Colombia, 6.6981, -73.5111 Bonga, Ethiopia, 7.2667, 36.2333 Showa, Japan, 35.6333, 138.5333 Saka, Morocco, 34.6167, -3.4167 Oliveira do Hospital, Portugal, 40.3667, -7.8667 Sidi Abdelkader, Morocco, 33.0494, -8.6886 Birkerod, Denmark, 55.8423, 12.4335 Beni Haoua, Algeria, 36.5333, 1.5667 Wallington, United Kingdom, 51.3647, -0.1403 Amdjarass, Chad, 16.0658, 22.8431 Hindang, Philippines, 10.4339, 124.7278 Pogradec, Albania, 40.9000, 20.6500 Moniquira, Colombia, 5.9167, -73.5000 Ovejas, Colombia, 9.5000, -75.1667 Loja, Spain, 37.1667, -4.1500 Mill Creek, United States, 47.8631, -122.2037 Ludlow, United States, 42.1921, -72.4580 Rosedale, United States, 39.3266, -76.5084 Sanhe, China, 36.5639, 105.6439 Vinany, Madagascar, -19.6139, 46.4860 Wettingen, Switzerland, 47.4659, 8.3267 Cercado Abajo, Dominican Republic, 18.7300, -71.5200 Letlhakane, Botswana, -21.4250, 25.5892 Musselburgh, United Kingdom, 55.9420, -3.0540 Harohalli, India, 12.6801, 77.4699 Debark', Ethiopia, 13.1333, 37.9000 Murrysville, United States, 40.4456, -79.6554 Yachiyo, Japan, 36.1816, 139.8911 Buckingham, United States, 40.3188, -75.0580 Paldorak, Tajikistan, 40.4833, 69.3000 East Moline, United States, 41.5199, -90.3879 Lajinha, Brazil, -20.1508, -41.6228 Wittmund, Germany, 53.5750, 7.7808 Rosamond, United States, 34.8658, -118.2155 Coudekerque-Branche, France, 51.0253, 2.3917 Junqueiropolis, Brazil, -21.5147, -51.4336 Norton, United Kingdom, 54.5890, -1.3157 Conselheiro Pena, Brazil, -19.1719, -41.4719 Kolpashevo, Russia, 58.3000, 82.9000 Gaura, India, 26.4800, 85.3900 Castrovillari, Italy, 39.8167, 16.2000 Neufahrn bei Freising, Germany, 48.3167, 11.6667 Karmana, Uzbekistan, 40.1422, 65.3625 Sao Jose da Laje, Brazil, -9.0100, -36.0578 Miches, Dominican Republic, 18.9800, -69.0500 Bhainsdehi, India, 21.6449, 77.6302 Sonagazi, Bangladesh, 22.8518, 91.3916 Devirammanahalli, India, 12.1922, 76.6653 Tupanatinga, Brazil, -8.7528, -37.3400 Mariani, India, 26.6700, 94.3300 Conceicao da Feira, Brazil, -12.5058, -38.9989 Malaba, Uganda, 0.6444, 34.2606 Chelak, Uzbekistan, 39.9203, 66.8611 Banting, Philippines, 5.7167, 120.9000 Ambondro, Madagascar, -25.2500, 45.8333 Werdau, Germany, 50.7333, 12.3833 General Belgrano, Argentina, -35.7667, -58.5000 Stadtlohn, Germany, 51.9925, 6.9150 Alta, India, 17.2500, 74.5700 Louisville, United States, 39.9710, -105.1441 Bad Waldsee, Germany, 47.9211, 9.7519 Ibicoara, Brazil, -13.4108, -41.2850 Maghull, United Kingdom, 53.5174, -2.9449 Peringanad, India, 9.1525, 76.6988 Joinville-le-Pont, France, 48.8214, 2.4728 Cordeiro, Brazil, -22.0289, -42.3608 North Liberty, United States, 41.7438, -91.6112 Jicome, Dominican Republic, 19.6500, -70.9500 Alapli, Turkey, 41.1806, 31.3861 North Bellmore, United States, 40.6904, -73.5390 Sestu, Italy, 39.2994, 9.0918 Hauppauge, United States, 40.8211, -73.2109 Villanueva, Colombia, 10.4456, -75.2761 Leek, United Kingdom, 53.1080, -2.0234 Samaca, Colombia, 5.5000, -73.4833 Algete, Spain, 40.5978, -3.5003 Gavarr, Armenia, 40.3667, 45.1333 Barhampur, India, 26.3042, 86.4729 Pirkkala, Finland, 61.4667, 23.6500 Genc, Turkey, 38.7500, 40.5560 Colfontaine, Belgium, 50.4138, 3.8555 West Hempstead, United States, 40.6959, -73.6507 Palkonda, India, 18.6000, 83.7500 Ul, Portugal, 40.8192, -8.4990 Oliveira de Azemeis, Portugal, 40.8400, -8.4764 Chaves, Brazil, -0.1600, -49.9878 Fate, United States, 32.9430, -96.3858 Yermal, India, 13.1675, 74.7619 Luacano, Angola, -11.2167, 21.6500 Coolbaugh, United States, 41.1837, -75.4386 Illapel, Chile, -31.6333, -71.1667 Valljkkod, India, 9.2300, 76.7711 Ino, Japan, 33.5500, 133.4333 Banganapalle, India, 15.3167, 78.2333 Mino, Japan, 35.5448, 136.9076 Jindrichuv Hradec, Czechia, 49.1442, 15.0031 Supaul, India, 25.9469, 86.2497 Kuknur, India, 15.4900, 75.9914 Midway, United States, 30.4169, -87.0229 Stamford, United Kingdom, 52.6560, -0.4840 Narwar, India, 25.6439, 77.9129 Bandar-e Gaz, Iran, 36.7739, 53.9481 Requena, Spain, 39.4861, -1.1017 Sceaux, France, 48.7786, 2.2906 Mathukumnel, India, 9.2167, 76.4583 Leigh-on-Sea, United Kingdom, 51.5425, 0.6535 Castel San Pietro Terme, Italy, 44.3978, 11.5894 Kempston, United Kingdom, 52.1140, -0.4970 Sonbarsa, India, 25.7640, 84.4890 Penzance, United Kingdom, 50.1190, -5.5370 Tittagudi, India, 11.4167, 79.1167 Anagni, Italy, 41.7500, 13.1500 Monsummano, Italy, 43.8667, 10.8167 Zhangatas, Kazakhstan, 43.5705, 69.7335 Iriona, Honduras, 15.9691, -85.0933 Hexiang, China, 19.5286, 109.6353 Gannavaram, India, 16.5333, 80.8000 Enger, Germany, 52.1333, 8.5667 Kiseljak, Bosnia and Herzegovina, 43.9500, 18.0833 Achampet, India, 16.3990, 78.6370 Mohammadabad, Iran, 28.6517, 59.0158 Boscombe, United Kingdom, 50.7250, -1.8400 Great Linford, United Kingdom, 52.0680, -0.7637 Palestina de los Altos, Guatemala, 14.9333, -91.7000 Beruri, Brazil, -3.9022, -61.3714 Arnaud, Haiti, 18.4481, -73.3870 Limerick, United States, 40.2323, -75.5344 Oliveira dos Brejinhos, Brazil, -12.3169, -42.8958 Hanmayingcun, China, 41.2636, 117.8596 Goodlands, Mauritius, -20.0350, 57.6431 Lebedinovka, Kyrgyzstan, 42.8800, 74.6800 Tolosa, Philippines, 11.0633, 125.0353 Grayslake, United States, 42.3405, -88.0338 Divino, Brazil, -20.6139, -42.1489 Elvas, Portugal, 38.8800, -7.1628 Oktyabrsk, Russia, 53.1667, 48.6667 Wade Hampton, United States, 34.8821, -82.3336 Montrose, United States, 38.4689, -107.8590 Menaka, Mali, 15.9167, 2.4000 Vranov nad Topl'ou, Slovakia, 48.8806, 21.6731 Sao Joao Batista, Brazil, -2.9553, -44.8069 Guaratinga, Brazil, -16.5856, -39.7819 Kolaras, India, 25.2193, 77.6117 Lockport, United States, 43.1698, -78.6956 Luna, Philippines, 16.9700, 121.7300 Campestre, Brazil, -21.7108, -46.2458 Olho d'Agua das Flores, Brazil, -9.5358, -37.2939 Valkeakoski, Finland, 61.2667, 24.0333 Chithara, India, 8.8025, 76.9792 Marquette, United States, 46.5440, -87.4082 Horwich, United Kingdom, 53.5920, -2.5400 Montecatini Terme, Italy, 43.8828, 10.7711 Sao Joao de Pirabas, Brazil, -0.7689, -47.1739 Baroda, India, 25.5000, 76.6500 San Julian, Bolivia, -16.9064, -62.6169 Baie-Comeau, Canada, 49.2167, -68.1500 Halluin, France, 50.7836, 3.1256 Bussolengo, Italy, 45.4667, 10.8500 Soye, Mali, 14.2281, -4.2783 Lingolsheim, France, 48.5600, 7.6800 Schifferstadt, Germany, 49.3833, 8.3667 Zaouiet Sousse, Tunisia, 35.7833, 10.6333 Failsworth, United Kingdom, 53.5102, -2.1575 Recanati, Italy, 43.3986, 13.5525 West Pensacola, United States, 30.4263, -87.2679 Cornaredo, Italy, 45.4882, 9.0247 Northfield, United States, 44.4550, -93.1698 Forest Lake, United States, 45.2536, -92.9582 Altinho, Brazil, -8.4900, -36.0589 Wasquehal, France, 50.6694, 3.1308 Kirkstall, United Kingdom, 53.8160, -1.6020 Tullahoma, United States, 35.3721, -86.2172 Wuustwezel, Belgium, 51.3922, 4.5942 Tirebolu, Turkey, 41.0056, 38.8167 Profesor Salvador Mazza, Argentina, -22.0500, -63.7000 Wachtberg, Germany, 50.6167, 7.1333 Dzialdowo, Poland, 53.2333, 20.1833 Bozoum, Central African Republic, 6.3172, 16.3783 Guadalupe, Costa Rica, 9.9494, -84.0512 Ismayilli, Azerbaijan, 40.7847, 48.1514 Lagoa do Itaenga, Brazil, -7.9167, -35.3333 Muttatodi, India, 12.5417, 75.0194 Meinerzhagen, Germany, 51.1167, 7.6333 Makokou, Gabon, 0.5667, 12.8667 Nidderau, Germany, 50.2500, 8.9000 As, Norway, 59.6667, 10.8000 Banaue, Philippines, 16.9119, 121.0614 Los Llanos de Aridane, Spain, 28.6500, -17.9000 Metouia, Tunisia, 33.9667, 10.0000 Melena del Sur, Cuba, 22.7814, -82.1486 Piazza Armerina, Italy, 37.3833, 14.3667 Vinjamur, India, 15.1167, 79.4167 Lieto, Finland, 60.5050, 22.4583 Saco, United States, 43.5390, -70.4624 El Hammadia, Algeria, 35.9833, 4.7500 Kladovo, Serbia, 44.6039, 22.6072 San Isidro, Costa Rica, 10.0299, -84.0431 Ripley, United Kingdom, 53.0500, -1.4070 South St. Paul, United States, 44.8877, -93.0411 Concarneau, France, 47.8761, -3.9178 Parramos, Guatemala, 14.6078, -90.8031 Lubalo, Angola, -9.1500, 19.2833 Bagou, Benin, 10.8147, 2.7164 Miandrivazo, Madagascar, -19.5239, 45.4573 Sidi Rahal, Morocco, 33.7897, -7.1575 Yanagawamachi-saiwaicho, Japan, 37.8500, 140.6000 Sour, Algeria, 36.0006, 0.3414 Elko, United States, 40.8381, -115.7678 Kamalapuram, India, 14.5833, 78.6500 Santa Teresa, Brazil, -19.9358, -40.6000 Denain, France, 50.3294, 3.3958 Groveland, United States, 28.6098, -81.8246 Arroyo Seco, Argentina, -33.1667, -60.5000 Pueblo Nuevo, Nicaragua, 13.3833, -86.4833 Chachahuantla, Mexico, 20.2756, -98.1503 Pahuatlan de Valle, Mexico, 20.2756, -98.1503 Iisalmi, Finland, 63.5567, 27.1883 Shafter, United States, 35.4794, -119.2013 Marau, Brazil, -14.1039, -39.0149 Bockum, Germany, 51.3333, 6.5667 Isernia, Italy, 41.6028, 14.2397 Parma Heights, United States, 41.3865, -81.7637 Kleppe, Norway, 58.7667, 5.6667 Hardi, India, 26.0785, 86.6809 Huercal-Overa, Spain, 37.3833, -1.9333 Na Klang, Thailand, 17.3072, 102.1889 Pittsburg, United States, 37.4129, -94.6985 Bethany, United States, 35.5071, -97.6418 Tarnaveni, Romania, 46.3297, 24.2700 Pleasantville, United States, 39.3900, -74.5169 Al Qays, Egypt, 28.4833, 30.7833 Tan Phong, Vietnam, 19.7322, 105.7817 Botevgrad, Bulgaria, 42.9000, 23.7800 Fougeres, France, 48.3525, -1.1986 Paraiso, Costa Rica, 9.8322, -83.8461 Celbridge, Ireland, 53.3416, -6.5442 Ghafurov, Tajikistan, 40.2200, 69.7300 Yakkabog`, Uzbekistan, 38.9800, 66.6800 Schwanewede, Germany, 53.2333, 8.6000 Sunbat, Egypt, 30.8057, 31.2070 Banolas, Spain, 42.1194, 2.7664 Arlington, United States, 48.1701, -122.1442 Patuvilayi, India, 11.8667, 75.5194 Tepexi de Rodriguez, Mexico, 18.5833, -97.9333 Somanya, Ghana, 6.1055, -0.0150 Bulnes, Chile, -36.7425, -72.2983 Altoona, United States, 41.6483, -93.4783 Goris, Armenia, 39.5111, 46.3417 Manbengtang, China, 22.1460, 100.9360 Bouguenais, France, 47.1800, -1.6236 Jatara, India, 25.0096, 79.0487 Campia Turzii, Romania, 46.5486, 23.8800 Gjovik, Norway, 60.7957, 10.6916 Kawambwa, Zambia, -9.7914, 29.0789 Savda, India, 21.1500, 75.8800 Riverview, Canada, 46.0613, -64.8052 Kapay, Philippines, 8.0800, 124.4000 Nuenen, Netherlands, 51.4667, 5.5500 Lillehammer, Norway, 61.1161, 10.4578 Kekem, Cameroon, 5.1667, 10.0333 Rosolini, Italy, 36.8167, 14.9500 Toktogul, Kyrgyzstan, 41.8826, 72.9372 Chapulhuacan, Mexico, 21.1547, -98.9039 Buftea, Romania, 44.5700, 25.9500 Palo del Colle, Italy, 41.0500, 16.7000 Romano di Lombardia, Italy, 45.5167, 9.7500 Hashtrud, Iran, 37.4758, 47.0497 Qagan Us, China, 36.3972, 98.0122 Mbala, Zambia, -8.8333, 31.3833 Foya Tangia, Liberia, 8.2713, -10.2283 Sa al Hajar, Egypt, 30.9647, 30.7683 Buy, Russia, 58.4833, 41.5333 Baza, Spain, 37.4833, -2.7667 Coswig, Germany, 51.1333, 13.5833 Dumbarton, United Kingdom, 55.9500, -4.5667 Lugait, Philippines, 8.3411, 124.2592 `Adra, Syria, 33.6041, 36.5146 Chintalapalle, India, 15.0400, 76.2000 Hlohovec, Slovakia, 48.4311, 17.8031 Modling, Austria, 48.0833, 16.2667 Sultanpur, India, 31.2235, 75.2041 Honnali, India, 14.2399, 75.6474 Merrifield, United States, 38.8731, -77.2426 Zest'aponi, Georgia, 42.1092, 43.0360 La Resolana, Mexico, 19.3425, -104.2878 Shoreham-by-Sea, United Kingdom, 50.8340, -0.2730 South Milwaukee, United States, 42.9120, -87.8627 Cha Grande, Brazil, -8.2378, -35.4619 Palma del Rio, Spain, 37.7000, -5.2833 Namioka, Japan, 40.7000, 140.5833 Vakon, Benin, 6.5167, 2.5667 Arsk, Russia, 56.1000, 49.8833 Santa Elena, Argentina, -30.9500, -59.8000 Sunchales, Argentina, -30.9333, -61.5667 Ravelo, Bolivia, -18.7833, -65.5500 Bati, Ethiopia, 11.1833, 40.0167 Le Creusot, France, 46.8014, 4.4411 Gainsborough, United Kingdom, 53.4016, -0.7732 Colleferro, Italy, 41.7287, 13.0031 Carquefou, France, 47.2975, -1.4914 Jefferson, United States, 41.0003, -74.5531 Laboulaye, Argentina, -34.1167, -63.4000 Codlea, Romania, 45.6969, 25.4439 Carmen de Patagones, Argentina, -40.7833, -62.9667 Quemado de Guines, Cuba, 22.7900, -80.2561 Guadalupe Nuevo, Philippines, 14.5587, 121.0446 Piqua, United States, 40.1506, -84.2441 Aomar, Algeria, 36.5000, 3.7667 Maniyamturuttu, India, 9.7943, 76.4179 Torhout, Belgium, 51.0500, 3.1000 Lami, Fiji, -18.1167, 178.4167 Sonkach, India, 22.9717, 76.3467 Bladel, Netherlands, 51.3667, 5.2167 Tamallalt, Morocco, 31.8289, -7.5261 Hythe, United Kingdom, 50.8690, -1.3990 Zd'ar nad Sazavou, Czechia, 49.5628, 15.9392 Lannion, France, 48.7333, -3.4542 Vadamadurai, India, 10.4408, 78.0978 La Paz, Uruguay, -34.7617, -56.2233 Madipakkam, India, 12.9623, 80.1986 Chennimalai, India, 11.1638, 77.6039 Baiao, Portugal, 41.1667, -8.0333 Bala, Turkey, 39.5539, 33.1211 Lower Southampton, United States, 40.1541, -74.9903 Carlos Barbosa, Brazil, -29.2978, -51.5039 Bohumin, Czechia, 49.9042, 18.3575 Cobourg, Canada, 43.9667, -78.1667 Ohara, Japan, 35.2508, 140.3886 Atoyac de Alvarez, Mexico, 17.2000, -100.4333 Colonia General Felipe Angeles, Mexico, 23.9167, -104.6000 Ortakoy, Turkey, 38.7361, 34.0403 Cauto Cristo, Cuba, 20.5571, -76.4727 Trecate, Italy, 45.4333, 8.7333 Nishigo, Japan, 37.1417, 140.1554 Bibai, Japan, 43.3333, 141.8500 Bekalta, Tunisia, 35.6167, 11.0000 Muhammadabad, India, 27.3333, 79.5000 Horten, Norway, 59.4172, 10.4834 Pendembu, Sierra Leone, 8.0981, -10.6943 North Bay Shore, United States, 40.7602, -73.2617 Tielt, Belgium, 51.0000, 3.3167 Khampat, Burma, 23.7823, 94.1442 Shimogamo, Japan, 34.6795, 138.9453 Cranbrook, Canada, 49.5097, -115.7667 Vyskov, Czechia, 49.2775, 16.9989 Nellimarla, India, 18.1667, 83.4333 Pantanaw, Burma, 16.9850, 95.4656 Grottaferrata, Italy, 41.8000, 12.6667 Lubartow, Poland, 51.4667, 22.6000 Libertyville, United States, 42.2870, -87.9670 Adrian, United States, 41.8994, -84.0447 Binondo, Philippines, 14.6000, 120.9670 San Bernardino, Paraguay, -25.3044, -57.2938 Nahorkatiya, India, 27.2891, 95.3418 Khvansar, Iran, 33.2208, 50.3153 Sapang Dalaga, Philippines, 8.5500, 123.5700 South Burlington, United States, 44.4622, -73.2202 Westbrook, United States, 43.6954, -70.3539 La Chapelle-sur-Erdre, France, 47.2997, -1.5517 Capanema, Brazil, -25.6719, -53.8089 Alza, Spain, 43.3139, -1.9347 Peritoro, Brazil, -4.3828, -44.3328 Saint-Pol-sur-Mer, France, 51.0314, 2.3439 Posusje, Bosnia and Herzegovina, 43.4722, 17.3267 Becerril, Colombia, 9.7000, -73.2833 Kremenets, Ukraine, 50.1081, 25.7275 Bhojpur Kadim, India, 25.5841, 84.1265 Plaisance-du-Touch, France, 43.5667, 1.2972 Kurshab, Kyrgyzstan, 40.6664, 73.1367 Longjumeau, France, 48.6943, 2.2958 Dulken, Germany, 51.2522, 6.3353 Recani, Morocco, 31.2859, -4.2751 Khotkovo, Russia, 56.2500, 38.0000 El Gara, Morocco, 33.1119, -7.4058 Golden, United States, 39.7406, -105.2118 Timana, Colombia, 1.9833, -75.9500 Magsaysay, Philippines, 8.0300, 123.9200 Mindouli, Congo (Brazzaville), -4.2747, 14.3575 Omagh, United Kingdom, 54.5980, -7.3090 Kizhattur, India, 11.0500, 76.2167 Sidney, United States, 40.2891, -84.1667 Atarfe, Spain, 37.2229, -3.6899 Sidi Jaber, Morocco, 32.3833, -6.4167 Kawayan, Philippines, 11.7000, 124.3700 Costas de Cao, Portugal, 38.6640, -9.2000 Caparica, Portugal, 38.6683, -9.1900 Painesville, United States, 41.7240, -81.2536 San Martin, Colombia, 8.0472, -73.5153 Saint-Cyr-l'Ecole, France, 48.8008, 2.0633 Frondenberg, Germany, 51.4719, 7.7658 Hassloch, Germany, 49.3631, 8.2558 Muong Lay, Vietnam, 22.0678, 103.1506 Buckhall, United States, 38.7239, -77.4476 Paraisopolis, Brazil, -22.5539, -45.7800 Puerto Quito, Ecuador, 0.1272, -79.2531 La Celle-Saint-Cloud, France, 48.8411, 2.1344 Keevallur, India, 11.9167, 75.5500 Culpeper, United States, 38.4704, -78.0001 'Ain el Bell, Algeria, 34.3500, 3.2167 Sysert, Russia, 56.5000, 60.8167 Fara, Burkina Faso, 11.5333, -2.7667 Faversham, United Kingdom, 51.3177, 0.8928 Susaki, Japan, 33.3925, 133.2931 Mealhada, Portugal, 40.3781, -8.4514 Lai, Chad, 9.4000, 16.3000 Jarajus, Egypt, 25.8681, 32.7566 Cinfaes, Portugal, 41.0667, -8.0833 Conde, Brazil, -11.8139, -37.6108 Pak Phanang, Thailand, 8.3511, 100.2020 Itatira, Brazil, -4.6072, -39.6541 Baud, India, 20.8400, 84.3200 Aigio, Greece, 38.2506, 22.0811 Sandwich, United States, 41.7137, -70.4851 Nizhniy Lomov, Russia, 53.5167, 43.6667 Chepo, Panama, 9.1678, -79.0935 Koipadi, India, 12.5846, 74.9404 Zhetigen, Kazakhstan, 43.6743, 77.1082 Dolyna, Ukraine, 48.9706, 24.0111 Frankfort, United States, 41.4892, -87.8363 Lambari, Brazil, -21.9758, -45.3500 Kuala Pembuang, Indonesia, -3.3871, 112.5434 Campo Magro, Brazil, -25.3689, -49.4508 Lomita, United States, 33.7933, -118.3175 Phichit, Thailand, 16.4431, 100.3467 Jaboticatubas, Brazil, -19.5139, -43.7450 Pariyaram, India, 12.0732, 75.2917 San Lorenzo, Colombia, 1.5039, -77.2178 Lichtenfels, Germany, 50.1333, 11.0333 Reggane, Algeria, 26.7203, 0.1728 'Ain el Hammam, Algeria, 36.5714, 4.3097 Iztapa, Guatemala, 13.9331, -90.7075 Follonica, Italy, 42.9189, 10.7614 Buritis, Brazil, -15.6178, -46.4228 Korntal-Munchingen, Germany, 48.8306, 9.1214 Donggou, China, 19.5911, 110.9239 Mitry-Mory, France, 48.9833, 2.6167 Ochtrup, Germany, 52.2056, 7.1903 Uetze, Germany, 52.4661, 10.2039 Komarom, Hungary, 47.7400, 18.1217 Puduppalli Kunnam, India, 9.1500, 76.4833 Sukhodilsk, Ukraine, 48.3500, 39.7167 Neustrelitz, Germany, 53.3647, 13.0636 Chokkampatti, India, 9.1259, 77.3634 Meadowbrook, United States, 37.4301, -77.4740 Bruges, France, 44.8836, -0.6114 Beforona, Madagascar, -18.9719, 48.5759 Kolo, Poland, 52.2000, 18.6333 Longbangcun, China, 22.8833, 106.3333 Jaguaruna, Brazil, -28.6150, -49.0258 Barki Saria, India, 24.1759, 85.8894 Ramnagar Farsahi, India, 25.8904, 87.1284 Porto Real, Brazil, -22.4200, -44.2900 Sandhurst, United Kingdom, 51.3490, -0.8000 Samboan, Philippines, 9.5288, 123.3064 Sokal, Ukraine, 50.4833, 24.2833 Makakilo, United States, 21.3591, -158.0813 Alatsinainy-Bakaro, Madagascar, -19.3230, 47.6813 Calella, Spain, 41.6128, 2.6575 Kuttampala, India, 12.1216, 75.4829 Feltre, Italy, 46.0167, 11.9000 Portland, United States, 27.8942, -97.3278 San Pablo Tacachico, El Salvador, 13.9833, -89.3333 Kanaya, Japan, 34.8345, 138.1267 North Amityville, United States, 40.7005, -73.4119 Rosas, Spain, 42.2631, 3.1831 Yangping, China, 27.7352, 100.6070 Giengen an der Brenz, Germany, 48.6217, 10.2450 Cormano, Italy, 45.5500, 9.1667 Hernani, Spain, 43.2667, -1.9667 Rothwell, United Kingdom, 53.7485, -1.4780 Karaiyampudur, India, 11.0077, 77.2942 Froyland, Norway, 58.9167, 5.8500 Hoyland, Norway, 58.6833, 5.5833 Hazlet, United States, 40.4265, -74.1712 Melnik, Czechia, 50.3519, 14.4750 Blankenberge, Belgium, 51.3000, 3.1167 Sartalillo, Costa Rica, 9.9759, -84.0232 Kihihi, Uganda, -0.7489, 29.7003 Flores, Brazil, -7.8658, -37.9750 Grande-Synthe, France, 51.0139, 2.3028 Whitpain, United States, 40.1578, -75.2769 Middle, United States, 39.0852, -74.8337 Deal, United Kingdom, 51.2226, 1.4006 Harpalpur, India, 25.2877, 79.3328 Bratunac, Bosnia and Herzegovina, 44.1839, 19.3308 Lower Allen, United States, 40.2082, -76.9287 Yellowknife, Canada, 62.4709, -114.4053 Makhtal, India, 16.5012, 77.5156 Mundra, India, 22.8500, 69.7300 Tala Yfassene, Algeria, 36.4583, 5.0889 Huanuni, Bolivia, -18.2900, -66.8383 Kashkar-Kyshtak, Kyrgyzstan, 40.6223, 72.8310 Marblehead, United States, 42.4992, -70.8639 Gyomro, Hungary, 47.4353, 19.3986 Trentola, Italy, 40.9762, 14.1773 Dan Gorayo, Somalia, 8.7269, 49.3416 Monroe, United States, 41.9155, -83.3849 Peterlee, United Kingdom, 54.7600, -1.3300 Monte Azul, Brazil, -15.1553, -42.8589 Santa Maria Chilchotla, Mexico, 18.2333, -96.8167 Dharmkot, India, 30.9456, 75.2324 Sarreguemines, France, 49.1100, 7.0700 Benicasim, Spain, 40.0553, 0.0642 Nesoddtangen, Norway, 59.8086, 10.6556 Duderstadt, Germany, 51.5125, 10.2597 Farashband, Iran, 28.8617, 52.0936 Farum, Denmark, 55.8099, 12.3623 Fangasso, Mali, 13.5333, -4.4500 L'Isle-sur-la-Sorgue, France, 43.9199, 5.0549 Baihar, India, 22.1013, 80.5497 Wednesbury, United Kingdom, 52.5520, -2.0190 Xincheng, Taiwan, 24.0514, 121.6083 Santa Rosa, Paraguay, -26.8873, -56.8490 Rawicz, Poland, 51.6092, 16.8575 Katakos, India, 25.3339, 87.6715 Senta, Serbia, 45.9314, 20.0900 Diyadin, Turkey, 39.5400, 43.6772 Telgte, Germany, 51.9819, 7.7856 Santa Rita, Honduras, 15.2001, -87.8841 Khowrzuq, Iran, 32.7783, 51.6478 Las Vigas de Ramirez, Mexico, 19.6369, -97.1000 Chandragiri, India, 13.5833, 79.3167 Gryfino, Poland, 53.2531, 14.4875 East Hemet, United States, 33.7301, -116.9410 Sidi Chiker, Morocco, 31.7453, -8.7069 Bellshill, United Kingdom, 55.8160, -4.0260 Tobe, Japan, 33.7500, 132.8000 Tak, Thailand, 16.8711, 99.1250 Lennox, United States, 33.9380, -118.3586 Abejorral, Colombia, 5.7894, -75.4281 Sao Felipe, Brazil, -12.8469, -39.0889 Tidili Masfiywat, Morocco, 31.4667, -7.6167 San Martin De Porres, Philippines, 14.4817, 121.0425 Birpur, India, 25.5209, 85.4614 Salgado, Brazil, -11.0319, -37.4750 Inirida, Colombia, 3.8653, -67.9239 Candido Mendes, Brazil, -1.4467, -45.7167 Shisui, Japan, 35.7167, 140.2667 Lalin, Spain, 42.6500, -8.1167 Chorozinho, Brazil, -4.3003, -38.4978 Reichenbach/Vogtland, Germany, 50.6167, 12.3000 Shamgarh, India, 25.8935, 86.8759 Nyon, Switzerland, 46.3833, 6.2333 Teculutan, Guatemala, 14.9831, -89.5667 Simiti, Colombia, 7.9667, -73.9500 Concordia, Colombia, 6.0490, -75.9090 Tenjo, Colombia, 4.9167, -74.1667 Minturno, Italy, 41.2667, 13.7500 Gopavaram, India, 14.7841, 78.5729 Devrukh, India, 17.0650, 73.6158 Tettnang, Germany, 47.6708, 9.5875 Kokopo, Papua New Guinea, -4.3500, 152.2736 Howard, United States, 44.5703, -88.0928 Pulicat, India, 13.4161, 80.3168 Rumoi, Japan, 43.9408, 141.6369 Wodonga, Australia, -36.1214, 146.8881 Parkal, India, 18.2000, 79.7167 Westminster, United States, 39.5796, -77.0067 Ely, United Kingdom, 52.3981, 0.2622 Morristown, United States, 40.7967, -74.4772 Ervalia, Brazil, -20.8400, -42.6569 Rovira, Colombia, 4.2500, -75.3333 Vico Equense, Italy, 40.6667, 14.4333 Ban Wiang Phan, Thailand, 20.4128, 99.8853 Chodavaram, India, 17.8333, 82.9500 Lynbrook, United States, 40.6579, -73.6742 Danao, Philippines, 10.0200, 124.2700 Husainpur, India, 31.3387, 75.1969 Mosta, Malta, 35.9097, 14.4261 Aguas Zarcas, Costa Rica, 10.4223, -84.3554 Cugnaux, France, 43.5386, 1.3444 Schopfheim, Germany, 47.6500, 7.8167 Raipura, India, 32.7880, 74.7785 Touna, Mali, 13.1172, -5.8303 Oberkirch, Germany, 48.5333, 8.0833 Bologoye, Russia, 57.8833, 34.0500 Beaune, France, 47.0250, 4.8397 Abano Terme, Italy, 45.3619, 11.7924 Sultanhisar, Turkey, 37.8897, 28.1575 Ogden, United States, 43.1646, -77.8220 Zhangjiazhuang, China, 39.7507, 118.3497 Samthar, India, 25.8400, 78.9000 Sherwood, United States, 45.3594, -122.8427 Asosa, Ethiopia, 10.0667, 34.5167 Coomera, Australia, -27.8722, 153.3147 Belur, India, 13.1629, 75.8571 Parnamirim, Brazil, -8.0906, -39.5783 Xionglin, Taiwan, 24.7742, 121.0964 Pinan, Philippines, 8.4822, 123.4500 Greiz, Germany, 50.6547, 12.1997 Edakkunnam, India, 9.5333, 76.8333 Khilchipur, India, 24.0394, 76.5780 Holzminden, Germany, 51.8297, 9.4483 Solhan, Turkey, 38.9681, 41.0536 Afourar, Morocco, 32.2167, -6.5000 Kortenberg, Belgium, 50.8865, 4.5412 Centerton, United States, 36.3566, -94.2971 Ban Tha Pha, Thailand, 13.8454, 99.8652 Azacualpa, Honduras, 15.3441, -88.5515 Gostyn, Poland, 51.8792, 17.0125 San Francisco, Costa Rica, 9.9083, -84.0582 Sessa Aurunca, Italy, 41.2333, 13.9333 Chandpur, India, 25.5059, 87.2488 Entroncamento, Portugal, 39.4667, -8.4667 Vega de Alatorre, Mexico, 19.9833, -96.6750 Pennagaram, India, 12.1343, 77.8952 Rhenen, Netherlands, 51.9597, 5.5689 Blieskastel, Germany, 49.2333, 7.2500 Tondi, India, 9.7417, 79.0177 Agsu, Azerbaijan, 40.5703, 48.4009 Agstafa, Azerbaijan, 41.1189, 45.4539 Mayluu-Suu, Kyrgyzstan, 41.2457, 72.4480 Stebnyk, Ukraine, 49.3000, 23.5667 Xo`jaobod, Uzbekistan, 40.6653, 72.5667 Rivalta di Torino, Italy, 45.0340, 7.5184 Chaville, France, 48.8086, 2.1886 Pontassieve, Italy, 43.7750, 11.4375 Ryazhsk, Russia, 53.7000, 40.0500 Pompeia, Brazil, -22.1089, -50.1719 Boromo, Burkina Faso, 11.7500, -2.9333 Kavaje, Albania, 41.1842, 19.5619 Palisades Park, United States, 40.8472, -73.9966 Uruburetama, Brazil, -3.6250, -39.5078 Mont-Saint-Aignan, France, 49.4630, 1.0883 Wexford, Ireland, 52.3383, -6.4617 South Frontenac, Canada, 44.5081, -76.4939 Douar Lamrabih, Morocco, 34.8167, -5.8167 Blansko, Czechia, 49.3631, 16.6431 Puerto Viejo, Costa Rica, 10.5737, -83.9548 Guacima, Costa Rica, 9.9613, -84.2588 Reitz, South Africa, -27.8000, 28.4333 Voyenno-Antonovka, Kyrgyzstan, 42.8738, 74.4406 Skive, Denmark, 56.5638, 9.0402 Oulad Fraj, Morocco, 32.9667, -8.2333 Cruz Grande, Mexico, 16.7333, -99.1333 Taibet, Algeria, 33.0833, 6.3833 Ban Klang, Thailand, 16.9760, 100.5600 Talayazham, India, 9.6986, 76.4236 Monte Alegre de Minas, Brazil, -18.8708, -48.8808 Hazel Grove, United Kingdom, 53.3750, -2.1110 Bad Schwartau, Germany, 53.9194, 10.6975 Silver Spring, United States, 40.2503, -77.0567 Abou el Hassan, Algeria, 36.4167, 1.2000 Pargi, India, 17.1756, 77.8781 Motatan, Venezuela, 9.3931, -70.5933 Sivagiri, India, 9.3300, 77.4300 Nelkattumseval, India, 9.2361, 77.4606 Diondiori, Mali, 14.6167, -4.7667 Kurten, Germany, 51.0497, 7.2667 Akora, Pakistan, 34.0006, 72.1217 Medina, Brazil, -16.2228, -41.4769 Frontino, Colombia, 6.7833, -76.1333 Erragondapalem, India, 16.0397, 79.3043 Rio Grande, Dominican Republic, 19.7300, -70.8000 Aurad Shahjahani, India, 18.0958, 76.8881 Koropi, Greece, 37.9000, 23.8733 Ayaviri, Peru, -14.8818, -70.5901 Sesheke, Zambia, -17.4667, 24.3000 Bhitarwar, India, 25.7922, 78.1108 Tahla, Morocco, 34.0500, -4.4200 Regente Feijo, Brazil, -22.2208, -51.3028 Rolla, United States, 37.9459, -91.7607 Kheralu, India, 23.8800, 72.6200 East Massapequa, United States, 40.6742, -73.4359 La Trinidad, Nicaragua, 12.5578, -86.1835 Mattigiri, India, 12.6980, 77.8083 Alampalaiyam, India, 11.3635, 77.7677 Alblasserdam, Netherlands, 51.8667, 4.6667 Dorchester, United Kingdom, 50.7154, -2.4367 Teonthar, India, 24.9821, 81.6419 Karukachal, India, 9.5000, 76.6333 Aquidaba, Brazil, -10.2833, -37.0333 Del Carmen, Philippines, 9.8690, 125.9700 Farakka, India, 24.8190, 87.9110 Turmalina, Brazil, -17.2856, -42.7300 Belmonte, Brazil, -15.8628, -38.8828 Pujehun, Sierra Leone, 7.3506, -11.7181 Leinefelde, Germany, 51.3833, 10.3333 Bela, Pakistan, 26.2267, 66.3113 Vettikkavala, India, 8.9833, 76.8167 Villa Verde, Philippines, 16.6067, 121.1828 Riviere-du-Loup, Canada, 47.8333, -69.5333 Silla, Spain, 39.3611, -0.4114 Huanimaro, Mexico, 20.3675, -101.4969 Halewood, United Kingdom, 53.3599, -2.8400 Senec, Slovakia, 48.2189, 17.3997 Comrat, Moldova, 46.3003, 28.6572 Donauworth, Germany, 48.7000, 10.8000 Pallazzolo sull'Oglio, Italy, 45.6000, 9.8833 Nykobing Falster, Denmark, 54.7655, 11.8751 Barkly West, South Africa, -28.5381, 24.5186 Caravelas, Brazil, -17.7319, -39.2658 Bueng Kan, Thailand, 18.3254, 103.6704 Galvez, Argentina, -32.0333, -61.2167 Nkoteng, Cameroon, 4.5167, 12.0333 Bilasuvar, Azerbaijan, 39.4553, 48.5458 Celorico de Basto, Portugal, 41.3869, -8.0022 Medina del Campo, Spain, 41.3000, -4.9167 Mar''ina Horka, Belarus, 53.5072, 28.1522 Kulpahar, India, 25.3190, 79.6410 Luban, Poland, 51.1181, 15.2889 Montalto Uffugo, Italy, 39.4000, 16.1500 La Canada Flintridge, United States, 34.2097, -118.2002 Satsuma, Japan, 31.9056, 130.4556 Bourne, United States, 41.7233, -70.5816 Nanuet, United States, 41.0957, -74.0155 Villa Hidalgo, Mexico, 21.6667, -102.6000 Sivrihisar, Turkey, 39.4500, 31.5378 Port Angeles, United States, 48.1141, -123.4565 Kwinana, Australia, -32.2394, 115.7702 Denderleeuw, Belgium, 50.8833, 4.0667 Piata, Brazil, -13.1519, -41.7728 Yabayo, Côte d’Ivoire, 5.9388, -6.5983 Douglas, South Africa, -29.0500, 23.7667 Lonar, India, 19.9853, 76.5205 Mayfield Heights, United States, 41.5174, -81.4534 Waldbrol, Germany, 50.8789, 7.6150 Virarajendrapet, India, 12.1964, 75.8051 Barroso, Brazil, -21.1869, -43.9758 Skanderborg, Denmark, 56.0313, 9.9317 Killingworth, United Kingdom, 55.0318, -1.5557 Mithi, Pakistan, 24.7400, 69.8000 Depalpur, India, 22.8509, 75.5422 Sidhapa, India, 26.5355, 86.3355 Brandys nad Labem-Stara Boleslav, Czechia, 50.1894, 14.6672 Naranjos, Mexico, 21.3509, -97.6866 Esanboy, Tajikistan, 38.0833, 68.3833 Dhorimanna, India, 25.1997, 71.4331 Dillingen, Germany, 48.5667, 10.4667 El Ancer, Algeria, 36.8000, 6.1667 Mahaditra, Madagascar, -21.7500, 47.1000 Temacine, Algeria, 33.0219, 6.0228 Lyman, Ukraine, 48.9853, 37.8111 Llallagua, Bolivia, -18.4167, -66.5833 Bani Murr, Egypt, 27.2240, 31.1955 Schroeder, Brazil, -26.4128, -49.0728 Ban Wat Sala Daeng, Thailand, 13.8097, 100.3589 Mesra, Algeria, 35.8333, 0.1667 Pita, Guinea, 11.0800, -12.4010 Kartikapalli, India, 9.2603, 76.4498 Durbat, Tajikistan, 38.5333, 68.6333 Guding, China, 26.4876, 107.4460 Diguapo, China, 25.6988, 104.9614 Buxton, United Kingdom, 53.2590, -1.9110 Ferentino, Italy, 41.6833, 13.2500 Lohur, Tajikistan, 38.3833, 68.7000 Bulach, Switzerland, 47.5189, 8.5422 Kannod, India, 22.6676, 76.7429 Teopisca, Mexico, 16.5500, -92.5000 Kafr Laha, Syria, 34.8947, 36.4958 Fukagawa, Japan, 43.7178, 142.0403 Makoua, Congo (Brazzaville), -0.0067, 15.6181 Thebes, Greece, 38.3208, 23.3178 Mutuipe, Brazil, -13.2289, -39.5050 Sao Joaquim do Monte, Brazil, -8.4319, -35.8039 Nachod, Czechia, 50.4169, 16.1631 Bhopatpur, India, 26.4495, 84.8545 Affton, United States, 38.5499, -90.3264 Yumbel, Chile, -37.1333, -72.5333 Tolu Viejo, Colombia, 9.4500, -75.4500 Atescatempa, Guatemala, 14.1750, -89.7417 Port Colborne, Canada, 42.8833, -79.2500 Bubanza, Burundi, -3.0833, 29.4000 Hakui, Japan, 36.8936, 136.7790 Takanabe, Japan, 32.1281, 131.5033 La Esmeralda, Venezuela, 3.1739, -65.5467 Moosburg, Germany, 48.4667, 11.9333 Manhumirim, Brazil, -20.3578, -41.9578 Cabra, Spain, 37.0000, 28.0000 Cittadella, Italy, 45.6486, 11.7836 Tarhzirt, Morocco, 32.4333, -6.1833 Cournon-d'Auvergne, France, 45.7422, 3.1972 Sidi Merouane, Algeria, 36.5333, 1.3333 Ngathainggyaung, Burma, 17.4000, 95.0833 Kissa, Benin, 7.0333, 1.7833 Oderzo, Italy, 45.7808, 12.4928 Kurri Kurri, Australia, -32.8167, 151.4833 Jiangjiehe, China, 27.2618, 107.3886 Dumbravita, Romania, 45.8000, 21.2500 Borna, Germany, 51.1167, 12.5000 Ait Bouchta, Morocco, 35.0986, -3.8397 Nan, Thailand, 18.7833, 100.7833 Calceta, Ecuador, -0.8400, -80.1700 Etzatlan, Mexico, 20.7667, -104.0833 Presidente Getulio, Brazil, -27.0508, -49.6228 Kandakkadava, India, 9.7000, 76.3000 Rio Formoso, Brazil, -8.6639, -35.1589 Goraya, India, 31.1241, 75.7724 Alamo, United States, 26.1810, -98.1177 Tupancireta, Brazil, -29.0808, -53.8358 Piove di Sacco, Italy, 45.2977, 12.0368 Bispham, United Kingdom, 53.8520, -3.0410 Liubotyn, Ukraine, 49.9483, 35.9294 Sangin, Afghanistan, 32.0733, 64.8339 Sitrah, Bahrain, 26.1200, 50.6500 Zemio, Central African Republic, 5.0333, 25.1333 Bamukumbit, Cameroon, 5.8167, 10.4167 Bamumkumbit, Cameroon, 5.8167, 10.4167 Sanjianxiang, China, 27.5425, 111.3475 Hampton, United Kingdom, 51.4220, -0.3670 Shri Mahavirji, India, 26.6833, 76.9167 Tadas, India, 15.1333, 75.1167 Asarganj, India, 25.1500, 86.6800 Rankhandi, India, 29.6167, 77.6500 Bhaluhar, India, 24.8200, 84.6500 Mandi Bamora, India, 24.0800, 78.0800 Bareja, India, 22.8500, 72.5833 Sikka, India, 22.4244, 69.8420 Munak, India, 29.5203, 76.8401 Pirbahora, India, 28.3640, 79.4150 Hudli, India, 15.8800, 74.5600 Mangapet, India, 18.2500, 80.5200 Bazidpur Madhaul, India, 25.5236, 85.4572 Suroth, India, 26.8098, 77.1470 Sujnipur, India, 23.9667, 71.8167 Marjampad, India, 16.5920, 79.9080 Sohana, India, 30.6833, 76.7000 Chimthana, India, 21.1800, 74.6900 Ankalgi, India, 16.0333, 74.7000 Kothanuru, India, 16.0022, 81.0417 Tuminkatti, India, 14.4131, 75.6206 Naranda, India, 19.7739, 79.1365 Sonaimukh, India, 24.7333, 92.8903 Baragoi, Kenya, 1.7840, 36.7860 Kfar Kidde, Lebanon, 34.2028, 35.6544 El Bazouriye, Lebanon, 33.2539, 35.2717 Slobozia, Moldova, 46.7293, 29.7045 Ampasimena, Madagascar, -24.3687, 47.1630 Mandrosohasina, Madagascar, -19.5817, 47.1709 Ambalakirajy, Madagascar, -15.7464, 48.5184 Rantabe, Madagascar, -15.7023, 49.6391 Mandiavato, Madagascar, -19.0925, 47.0233 Ambatosoratra, Madagascar, -17.6134, 48.5140 Antsampandrano, Madagascar, -19.5440, 47.5921 Tsararafa, Madagascar, -22.7196, 47.7996 Analapatsy, Madagascar, -24.2547, 47.2061 Tsarabaria, Madagascar, -13.7584, 49.9466 Soavina Antanety, Madagascar, -19.7983, 46.7362 Bekatra Maromiandra, Madagascar, -22.0994, 47.7187 Tiddim, Burma, 23.3758, 93.6539 Hakha, Burma, 22.6428, 93.6096 Cardenas, Mexico, 22.0100, -99.6520 Kuala Lipis, Malaysia, 4.1840, 102.0420 Bulolo, Papua New Guinea, -7.2000, 146.6500 Gahi Mammar, Pakistan, 29.7375, 71.9575 Alfena, Portugal, 41.2381, -8.5253 Kebemer, Senegal, 15.3667, -16.4333 Tejutepeque, El Salvador, 13.8500, -88.9000 Velimese, Turkey, 41.2500, 27.8833 Mikumi, Tanzania, -7.4072, 36.9722 Muheza, Tanzania, -5.1739, 38.7875 Sultonobod, Uzbekistan, 40.7644, 72.9764 Indwe, South Africa, -31.4660, 27.3330 Naantali, Finland, 60.4667, 22.0333 Ciudad Miguel Aleman, Mexico, 26.4003, -99.0253 'Ain Mabed, Algeria, 34.8000, 3.1333 Comanesti, Romania, 46.4297, 26.4500 Garhshankar, India, 31.2154, 76.1415 Beloyarskiy, Russia, 63.7167, 66.6667 Forest Park, United States, 39.2861, -84.5258 Vasiana, Madagascar, -19.6376, 46.2352 Salsomaggiore Terme, Italy, 44.8156, 9.9783 Dillingen, Germany, 49.3500, 6.7333 Kilimli, Turkey, 41.4833, 31.8333 Evaz, Iran, 27.7600, 54.0067 Antrim, United Kingdom, 54.7176, -6.1997 Troyan, Bulgaria, 42.8915, 24.7105 Schmalkalden, Germany, 50.7167, 10.4500 Sanrh Majhgawan, India, 24.6845, 85.3650 Palashi, India, 23.8000, 88.2500 Coreau, Brazil, -3.5328, -40.6569 Chilly-Mazarin, France, 48.7025, 2.3125 Sidi Taibi, Morocco, 34.1917, -6.6845 San Marcos, Honduras, 14.4093, -88.9545 Kumil, India, 8.7833, 76.9333 Shonai, Japan, 38.8499, 139.9047 West Haven, United States, 41.2083, -112.0541 Shirahama, Japan, 33.6817, 135.3444 Vazante, Brazil, -17.9869, -46.9078 Whitehall, United States, 39.9682, -82.8833 Sand Springs, United States, 36.1353, -96.1283 Shiruru, India, 13.9080, 74.6058 Seaham, United Kingdom, 54.8400, -1.3400 Valderrama, Philippines, 11.0036, 122.1294 Vairag, India, 18.0500, 75.8000 Valiyakumaramangalam, India, 9.8333, 76.7833 Maple Shade, United States, 39.9520, -74.9950 Kadakola, India, 12.1922, 76.6653 Buinsk, Russia, 54.9667, 48.2833 Vianen, Netherlands, 51.9833, 5.1000 Buri, Brazil, -23.7975, -48.5928 Matheu, Argentina, -34.3667, -58.8333 El Ksiba, Morocco, 32.5681, -6.0308 Tibagi, Brazil, -24.5089, -50.4139 Maurepas, France, 48.7600, 1.9500 Itsoseng, South Africa, -26.0830, 25.8820 Hudson, United States, 42.3887, -71.5465 Alpinopolis, Brazil, -20.8639, -46.3878 Bafoulabe, Mali, 13.8064, -10.8322 Altagracia, Nicaragua, 11.5667, -85.5833 Carrieres-sous-Poissy, France, 48.9486, 2.0394 Kampong Thum, Cambodia, 12.7120, 104.8890 West Whiteland, United States, 40.0227, -75.6239 Petrinja, Croatia, 45.4375, 16.2900 Ampefy, Madagascar, -19.0429, 46.7344 Bhasawar, India, 27.0361, 77.0528 Coruche, Portugal, 38.9581, -8.5283 Hatvan, Hungary, 47.6681, 19.6697 Wilnsdorf, Germany, 50.8167, 8.1000 La Crescenta-Montrose, United States, 34.2322, -118.2353 Carira, Brazil, -10.3581, -37.7008 Acquaviva delle Fonti, Italy, 40.9000, 16.8500 Butare, Rwanda, -2.6000, 29.7500 Ypsilanti, United States, 42.2440, -83.6208 Irlam, United Kingdom, 53.4450, -2.4220 Venmani, India, 9.2444, 76.6131 Dharampur, India, 20.5300, 73.1800 Mapai, Mozambique, -22.7306, 32.0583 Mulundo, Philippines, 7.9300, 124.3800 Tarko-Sale, Russia, 64.9167, 77.8000 Koskapur, India, 26.0216, 87.2279 Doany, Madagascar, -14.3740, 49.5196 San Martin de la Vega, Spain, 40.2094, -3.5722 Chatia, India, 26.5396, 84.5660 Andal, India, 23.6000, 87.2000 Siahkal, Iran, 37.1536, 49.8711 Nottuln, Germany, 51.9167, 7.2833 Ulcinj, Montenegro, 41.9200, 19.2000 Claremore, United States, 36.3146, -95.6095 Dhanaula, India, 30.2800, 75.5800 Palliman, India, 8.9000, 76.7139 Burnie, Australia, -41.0636, 145.8753 Merad, Algeria, 36.4667, 2.4333 Bichena, Ethiopia, 10.4500, 38.2000 Chipiona, Spain, 36.7333, -6.4333 Yuancun, China, 27.4540, 106.6649 Lincolnia, United States, 38.8158, -77.1543 Novate Milanese, Italy, 45.5333, 9.1333 Senapparetti, India, 10.9625, 78.1132 Pukhrayan, India, 26.2300, 79.8500 Saint-Augustin-de-Desmaures, Canada, 46.7333, -71.4667 Mokena, United States, 41.5327, -87.8781 Piedade, Portugal, 38.6703, -9.1595 Sparta, United States, 41.0486, -74.6264 Cahors, France, 44.4483, 1.4414 Sakae, Japan, 35.8333, 140.2500 Ban Tha Ton, Thailand, 20.0608, 99.3622 El Arenal, Mexico, 20.7000, -103.6167 Cachoeirinha, Brazil, -8.4858, -36.2328 Zawiyat Razin, Egypt, 30.4125, 30.8532 Hiddenhausen, Germany, 52.1667, 8.6167 Sarstedt, Germany, 52.2394, 9.8606 Apastepeque, El Salvador, 13.6667, -88.7667 Akureyri, Iceland, 65.6833, -18.1000 Plainview, United States, 34.1911, -101.7235 Vevey, Switzerland, 46.4667, 6.8500 Saynshand, Mongolia, 44.8917, 110.1367 Kurovskoye, Russia, 55.5833, 38.9167 Vila Rica, Brazil, -10.0119, -51.1158 Okha, Russia, 53.5889, 142.9492 Nejo, Ethiopia, 9.5000, 35.5000 Tolosa, Spain, 43.1333, -2.0833 Punta Gorda, United States, 26.8941, -82.0513 Oschersleben, Germany, 52.0167, 11.2500 Namegawa, Japan, 36.0660, 139.3610 Holden, United States, 42.3561, -71.8608 Guatuba, Brazil, -4.0400, -38.6369 Loudima Poste, Congo (Brazzaville), -4.1122, 13.0600 Kisai, Japan, 36.1000, 139.5667 Mayen, Germany, 50.3333, 7.2167 El Paraiso, Honduras, 15.0253, -88.9831 Gil, India, 30.8469, 75.8636 Agoura Hills, United States, 34.1510, -118.7609 Guire, Mali, 14.6433, -6.6908 Zinjibar, Yemen, 13.1283, 45.3803 Andira, Brazil, -23.0508, -50.2289 Kuysinjaq, Iraq, 36.0828, 44.6286 Plattsburgh, United States, 44.6951, -73.4563 Teminabuan, Indonesia, -1.4333, 132.0167 Karlapalem, India, 15.9333, 80.5500 Dagohoy, Philippines, 9.9200, 124.2800 Castilho, Brazil, -20.8722, -51.4875 Bni Frassen, Morocco, 34.3833, -4.3833 Gherla, Romania, 47.0200, 23.9000 Nikolsk, Russia, 53.7167, 46.0667 Bourg-les-Valence, France, 44.9486, 4.8961 Shelbyville, United States, 39.5352, -85.7793 Canelones, Uruguay, -34.5167, -56.2833 Opfikon, Switzerland, 47.4331, 8.5719 Sacile, Italy, 45.9541, 12.5027 El Castillo de La Concepcion, Nicaragua, 11.0333, -84.4667 Ibirama, Brazil, -27.0569, -49.5178 Orasje, Bosnia and Herzegovina, 45.0336, 18.6933 Bressuire, France, 46.8408, -0.4872 Comapa, Mexico, 19.1650, -96.8856 Miamisburg, United States, 39.6322, -84.2724 Quepos, Costa Rica, 9.4571, -84.1387 Bara Malehra, India, 24.5681, 79.3069 Likak, Iran, 30.8928, 50.0928 Boussu, Belgium, 50.4331, 3.7961 Vence, France, 43.7236, 7.1142 Umrapur, India, 24.5863, 87.9294 Oroville, United States, 39.4999, -121.5634 Universal City, United States, 29.5521, -98.3074 Pozanti, Turkey, 37.4278, 34.8711 Calatayud, Spain, 41.3500, -1.6333 Zimatlan de Alvarez, Mexico, 16.8667, -96.7833 Kavieng, Papua New Guinea, -2.5667, 150.8000 Altamont, United States, 42.1980, -121.7248 Lalla Mimouna, Morocco, 34.8500, -6.0669 Tepetlixpa, Mexico, 19.0006, -98.8178 Cartavio, Peru, -7.8833, -79.2167 Humanes de Madrid, Spain, 40.2539, -3.8278 Ratanpur, India, 22.2880, 82.1660 San Miguel, Philippines, 7.6500, 123.2678 Rhede, Germany, 51.8333, 6.7006 Gjirokaster, Albania, 40.0758, 20.1389 Campamento, Honduras, 14.5514, -86.6646 Kuusankoski, Finland, 60.9083, 26.6236 Harvey, United States, 41.6076, -87.6520 Jagatpur, Bangladesh, 23.6075, 90.7660 Rechaiga, Algeria, 35.4081, 1.9733 Gebre Guracha, Ethiopia, 9.8000, 38.4000 Peto, Mexico, 20.1256, -88.9214 Oregon, United States, 41.6524, -83.4321 Sint-Andries, Belgium, 51.1972, 3.1803 Rio Verde de Mato Grosso, Brazil, -18.9178, -54.8439 Masterton, New Zealand, -40.9667, 175.6500 Schenefeld, Germany, 53.6028, 9.8233 Khizrpur, India, 30.5843, 76.7572 Kolavallur, India, 11.7788, 75.6298 Makurazaki, Japan, 31.2731, 130.2969 Huntsville, Canada, 45.3333, -79.2167 Sleaford, United Kingdom, 52.9960, -0.4130 Pradopolis, Brazil, -21.3594, -48.0656 Jambai, India, 11.4678, 77.6434 Chevilly-Larue, France, 48.7663, 2.3533 Ennigerloh, Germany, 51.8367, 8.0256 Atlapexco, Mexico, 21.0221, -98.3543 Garforth, United Kingdom, 53.7920, -1.3880 Dokolo, Uganda, 1.9186, 33.1700 Anghad, India, 22.3913, 72.9946 Mannur, India, 10.8040, 76.4652 Mannur, India, 10.8027, 76.4698 Aramil, Russia, 56.7000, 60.8333 Kochas, India, 25.2340, 83.9215 Kamakhyanagar, India, 20.9338, 85.5449 Hirokawa, Japan, 33.2417, 130.5514 Ban Na San, Thailand, 8.8004, 99.3637 Bartow, United States, 27.8868, -81.8214 Whitemarsh, United States, 40.1040, -75.2483 Remigio, Brazil, -6.9660, -35.7951 Stroud, United States, 41.0001, -75.2173 Sainte-Marthe-sur-le-Lac, Canada, 45.5300, -73.9300 Brigham City, United States, 41.5035, -112.0453 Agryz, Russia, 56.5219, 52.9975 Kannankurichchi, India, 11.6969, 78.1794 Ruhango, Rwanda, -2.2325, 29.7803 Tamri, Morocco, 30.6950, -9.8250 Brezno, Slovakia, 48.8036, 19.6381 Itaparica, Brazil, -12.8878, -38.6789 Rubiataba, Brazil, -15.1639, -49.8028 Nosy Varika, Madagascar, -20.5877, 48.5354 Puttur, India, 9.0400, 76.7100 Araripe, Brazil, -7.2128, -40.0458 Poperinge, Belgium, 50.8500, 2.7333 Stoke Gifford, United Kingdom, 51.5170, -2.5480 Time, Norway, 58.7333, 5.7000 Mosopa, Botswana, -24.7792, 25.4183 Smorumnedre, Denmark, 55.7423, 12.3028 Lackawanna, United States, 42.8182, -78.8325 Palm Valley, United States, 30.2011, -81.3948 Gerlingen, Germany, 48.8000, 9.0653 Massy, Kyrgyzstan, 41.0640, 72.6375 Vulcan, Romania, 45.3811, 23.2914 Grafton, United States, 42.2085, -71.6838 Malabuyoc, Philippines, 9.6500, 123.3300 Cheung Chau, Hong Kong, 22.2106, 114.0289 Albany, United States, 37.8897, -122.3018 Broadview Heights, United States, 41.3196, -81.6779 Pertuis, France, 43.6950, 5.5036 Kattanam, India, 9.1764, 76.5641 Korsholm, Finland, 63.1125, 21.6778 Ghatkesar, India, 17.4494, 78.6853 Puerto Armuelles, Panama, 8.2833, -82.8667 Senador Guiomard, Brazil, -10.1497, -67.7374 Bishunpur, India, 26.0868, 86.6541 Kurikka, Finland, 62.6167, 22.4000 Mirfield, United Kingdom, 53.6807, -1.6888 Greenfield, United States, 36.3242, -121.2428 Mullheim, Germany, 47.8000, 7.6333 Ryuyo, Japan, 34.6783, 137.8167 Jnane Bouih, Morocco, 32.0308, -8.7894 Buckeburg, Germany, 52.2608, 9.0492 Crest Hill, United States, 41.5723, -88.1124 Huangtong, China, 19.8350, 109.8455 San Miguel, Philippines, 11.2942, 124.8300 Nogales, United States, 31.3624, -110.9336 Xingangli, China, 39.9101, 119.5468 Simonesia, Brazil, -20.1239, -42.0008 Prudnik, Poland, 50.3228, 17.5767 Tres Barras, Brazil, -26.1058, -50.3219 Poshkent, Tajikistan, 39.8833, 69.0333 Clifton, United States, 39.0764, -108.4605 Bad Aibling, Germany, 47.8639, 12.0100 Monor, Hungary, 47.3475, 19.4489 Pattamadai, India, 8.6726, 77.5845 Calvillo, Mexico, 21.8500, -102.7167 Os, Norway, 60.1835, 5.4666 Lloydminster, Canada, 53.2807, -110.0350 Itatinga, Brazil, -23.1017, -48.6158 Tavares, United States, 28.7920, -81.7352 Assebroek, Belgium, 51.1964, 3.2536 Thimiri, India, 12.8283, 79.3079 Beldaur, India, 25.5947, 86.7909 Cherakhera, India, 25.6869, 86.4187 Yonabaru, Japan, 26.1994, 127.7547 Imi n'Oulaoun, Morocco, 31.4224, -6.5641 Issaba, Benin, 7.0833, 2.6167 Grobenzell, Germany, 48.2000, 11.3667 Kanekallu, India, 14.8864, 77.0317 Crisopolis, Brazil, -11.5108, -38.1500 Moinesti, Romania, 46.4333, 26.4833 Varkaus, Finland, 62.3167, 27.8917 Lake Zurich, United States, 42.1956, -88.0870 Yosano, Japan, 35.5667, 135.1500 Viadana, Italy, 44.9267, 10.5200 Pecinci, Serbia, 44.9089, 19.9664 Cuite, Brazil, -6.4850, -36.1569 Hongshui, China, 38.4246, 100.7926 Wittlich, Germany, 49.9869, 6.8897 Shinjo, Japan, 34.4892, 135.7266 Saavedra, Argentina, -37.7833, -62.3500 Castelo do Piaui, Brazil, -5.3222, -41.5525 Pichidegua, Chile, -34.3586, -71.2831 Rio Segundo, Argentina, -31.6501, -63.9116 Payimattam, India, 10.0255, 76.4507 Echizen, Japan, 35.9742, 136.1298 Albertville, France, 45.6767, 6.3933 Alga, Kazakhstan, 49.9028, 57.3333 Marsberg, Germany, 51.4500, 8.8333 Llandudno, United Kingdom, 53.3225, -3.8250 Babanusah, Sudan, 11.3334, 27.8000 Lehara, India, 26.1515, 86.1034 Monroe, United States, 47.8595, -121.9851 Houghton Regis, United Kingdom, 51.9039, -0.5247 Lexington, United States, 35.8018, -80.2682 Suarez, Colombia, 2.9589, -76.6953 Colotlan, Mexico, 22.2000, -103.3000 San Salvo, Italy, 42.0455, 14.7315 Taketa, Japan, 32.9736, 131.3978 Jimaguayu, Cuba, 21.2422, -77.8263 Dicholi, India, 15.5932, 73.9457 Mokeri, India, 11.7432, 75.6178 Torgau, Germany, 51.5603, 13.0056 Katpadi, India, 12.9695, 79.1455 Busra ash Sham, Syria, 32.5174, 36.4816 Komlo, Hungary, 46.1911, 18.2611 Kanniyakumari, India, 8.0883, 77.5385 Erlanger, United States, 39.0109, -84.5864 Oros, Brazil, -6.2439, -38.9139 Krasnohrad, Ukraine, 49.3667, 35.4500 East Northport, United States, 40.8791, -73.3233 Sinacaban, Philippines, 8.2854, 123.8436 Mahmudabad Nemuneh, Iran, 36.2903, 49.8994 Bruz, France, 48.0256, -1.7447 Hajnowka, Poland, 52.7333, 23.5667 Guantiankan, China, 28.2727, 106.6320 Udalguri, India, 26.7537, 92.1021 Pastores, Guatemala, 14.6000, -90.7500 Budipuram, India, 10.3606, 78.0106 Callosa de Segura, Spain, 38.1225, -0.8797 Westmount, Canada, 45.4833, -73.6000 Pichor, India, 25.1756, 78.1886 Andaingo Gara, Madagascar, -18.2177, 48.2687 Chiconcuac, Mexico, 19.5500, -98.9000 Buriti dos Lopes, Brazil, -3.1750, -41.8669 Casa de Oro-Mount Helix, United States, 32.7640, -116.9688 Yuanhucun, China, 44.1977, 86.8928 Karuizawa, Japan, 36.3486, 138.5969 Sao Lourenco d'Oeste, Brazil, -26.3589, -52.8508 Kondur, India, 9.6856, 76.7622 Nove Mesto nad Vahom, Slovakia, 48.7547, 17.8308 Villa Elisa, Argentina, -34.8533, -58.0792 Luenoufla, Côte d’Ivoire, 7.0724, -6.2413 Dayr Abu Hinnis, Egypt, 27.7864, 30.9050 Engelskirchen, Germany, 50.9833, 7.4167 Zachary, United States, 30.6643, -91.1634 Roosevelt, United States, 40.6797, -73.5837 Nzalat Laadam, Morocco, 32.1000, -7.9500 Davyhulme, United Kingdom, 53.4559, -2.3683 Villabate, Italy, 38.0833, 13.4500 Biddulph, United Kingdom, 53.1200, -2.1700 Nilakkottai, India, 10.1700, 77.8700 Urumita, Colombia, 10.5667, -73.0167 Hanumana, India, 24.7789, 82.0960 Rawah, Iraq, 34.4792, 41.9083 Highland, United States, 40.4276, -111.7957 Bir Kasdali, Algeria, 36.1500, 5.0333 Ampere, Brazil, -25.9150, -53.4728 Sartell, United States, 45.6188, -94.2206 Toguchin, Russia, 55.2333, 84.4167 Forest Park, United States, 33.6209, -84.3590 Atasu, Kazakhstan, 48.6903, 71.6499 Otjiwarongo, Namibia, -20.4642, 16.6528 Ramjibanpur, India, 22.8300, 87.6200 Baranain, Spain, 42.8000, -1.6667 Lerdo de Tejada, Mexico, 18.6239, -95.5142 Okhmalynka, Ukraine, 47.5333, 29.3000 Wenden, Germany, 50.9667, 7.8667 Mayahaura, India, 22.1898, 88.5033 Ilijas, Bosnia and Herzegovina, 43.9583, 18.2667 El Coco, Panama, 8.8701, -79.8041 Veroli, Italy, 41.6833, 13.4167 Niiyama, Japan, 35.0533, 138.9455 Bondo, Congo (Kinshasa), 3.8167, 23.6833 Kutina, Croatia, 45.4791, 16.7768 Sadpur, India, 25.4758, 86.3786 San Juan Zitlaltepec, Mexico, 19.7167, -99.0500 Petrila, Romania, 45.4500, 23.4200 Diinsoor, Somalia, 2.4085, 42.9771 Tapaua, Brazil, -5.6278, -63.1828 Harrison, United States, 40.7431, -74.1531 Ischia, Italy, 40.7333, 13.9500 Russell, Canada, 45.2569, -75.3583 La Eliana, Spain, 39.5661, -0.5281 Turnu Magurele, Romania, 43.7517, 24.8708 Angleton, United States, 29.1721, -95.4293 Xapuri, Brazil, -10.6517, -68.5044 Bad Pyrmont, Germany, 51.9867, 9.2636 Haiger, Germany, 50.7422, 8.2039 Bidkingaon, India, 19.7062, 75.3001 Salmon Creek, United States, 45.7099, -122.6632 Buritirama, Brazil, -10.7078, -43.6308 Lastra a Signa, Italy, 43.7667, 11.1000 Mead Valley, United States, 33.8333, -117.2852 Albolote, Spain, 37.2306, -3.6569 Hidalgotitlan, Mexico, 17.7833, -94.6333 Venadillo, Colombia, 4.7500, -74.9167 Visaginas, Lithuania, 55.6000, 26.4333 Schilde, Belgium, 51.2389, 4.5815 Bequimao, Brazil, -2.4489, -44.7828 Liuliang, China, 35.2207, 105.9697 Les Coteaux, Canada, 45.2800, -74.2300 Jajarm, Iran, 36.9500, 56.3800 Punjai Puliyampatti, India, 11.3516, 77.1667 Arroyito, Argentina, -31.4167, -63.0500 Springboro, United States, 39.5615, -84.2348 Burnham-on-Sea, United Kingdom, 51.2378, -2.9989 Kinston, United States, 35.2747, -77.5939 Ituzaingo, Argentina, -27.6000, -56.6667 Abbots Langley, United Kingdom, 51.7010, -0.4160 Caoayan, Philippines, 17.5469, 120.3831 Ghardimaou, Tunisia, 36.4500, 8.4333 Santa Teresita, Philippines, 18.2519, 121.9100 Extremoz, Brazil, -5.7058, -35.3069 Suchiapa, Mexico, 16.6181, -93.0942 Amorebieta, Spain, 43.2192, -2.7342 Aysha, Ethiopia, 10.7500, 42.5667 Molln, Germany, 53.6269, 10.6847 Atchoupa, Benin, 6.5333, 2.6333 Doujing, China, 26.4789, 105.1253 Nauen, Germany, 52.6000, 12.8831 Gallipoli, Italy, 40.0556, 17.9917 Ansermanuevo, Colombia, 4.8000, -76.0000 Ballyfermot, Ireland, 53.3428, -6.3548 Vallam, India, 10.7199, 79.0598 Morwa, India, 25.8030, 85.6861 Rizal, Philippines, 17.5000, 121.6000 Mogiyon, Tajikistan, 39.2500, 67.6500 Tole Bi, Kazakhstan, 43.0000, 40.0000 Saint-Fons, France, 45.7090, 4.8530 Carai, Brazil, -17.1889, -41.6950 Sulzbach-Rosenberg, Germany, 49.5000, 11.7500 Bradfordville, United States, 30.5735, -84.2055 Thamaga, Botswana, -24.7167, 25.5333 Huseni, India, 26.3768, 84.7952 Pathrajolhania, India, 26.1369, 86.6614 Tirthahalli, India, 13.6884, 75.2455 Guapo, Brazil, -16.8308, -49.5319 Jhalida, India, 23.3700, 85.9700 Trostyanets', Ukraine, 50.4667, 34.9500 Sweetwater, United States, 25.7785, -80.3760 Artik, Armenia, 40.6167, 43.9500 Mihona, India, 26.2837, 78.9805 Marahra, India, 27.7500, 78.5667 Wassenberg, Germany, 51.1000, 6.1500 Liuguang, China, 26.9833, 106.3833 Lisieux, France, 49.1500, 0.2300 Jacare, Brazil, -18.9058, -40.0758 Crespo, Argentina, -32.0333, -60.3167 Bagaces, Costa Rica, 10.5157, -85.2478 Herceg Novi, Montenegro, 42.4530, 18.5312 Artik, Armenia, 40.6172, 43.9758 Hamina, Finland, 60.5667, 27.2000 Rajaudha, India, 26.7046, 78.4223 Boone, United States, 36.2111, -81.6669 Knightdale, United States, 35.7911, -78.4966 Alzey, Germany, 49.7458, 8.1153 Schonefeld, Germany, 52.3883, 13.5047 Eersel, Netherlands, 51.3572, 5.3147 Le Mee-sur-Seine, France, 48.5333, 2.6289 Eupen, Belgium, 50.6333, 6.0333 Candelaria, Cuba, 22.7439, -82.9581 Selestat, France, 48.2594, 7.4542 Ipanema, Brazil, -19.8008, -41.7128 Pauini, Brazil, -7.7136, -66.9764 San Jorge, Argentina, -31.8961, -61.8597 Hoxut, China, 42.2552, 86.8607 Ibigawa, Japan, 35.4873, 136.5686 Goole, United Kingdom, 53.6992, -0.8692 Bedele, Ethiopia, 8.4500, 36.3500 Parsahi Sirsia, India, 26.4676, 86.4984 Kempele, Finland, 64.9125, 25.5083 Arese, Italy, 45.5500, 9.0783 Fukude, Japan, 34.6781, 137.8797 Kalayapuram, India, 9.0545, 76.7696 Amta, India, 22.5834, 88.0104 Alaca, Turkey, 40.1683, 34.8425 Telavi, Georgia, 41.9169, 45.4764 Boerne, United States, 29.7847, -98.7292 Mahinawan, India, 26.0208, 86.1672 Tibba, India, 30.4876, 75.6967 Akanavaritota, India, 16.4141, 81.6367 Los Alcazares, Spain, 37.7436, -0.8497 Asasa, Ethiopia, 7.1000, 39.1944 Castellana Grotte, Italy, 40.8838, 17.1679 Ait Bousarane, Morocco, 31.7318, -7.0876 Garsfontein, South Africa, -25.7913, 28.2935 Solon, China, 46.6194, 121.2433 Wolfratshausen, Germany, 47.9133, 11.4278 Sao Vicente Ferrer, Brazil, -2.8939, -44.8800 Evergreen Park, United States, 41.7213, -87.7013 Sjobo, Sweden, 55.6333, 13.7000 Bad Driburg, Germany, 51.7333, 9.0167 Sangasso, Mali, 12.1567, -5.6231 Hushihacun, China, 40.8899, 116.9870 Los Alamos, Chile, -37.6272, -73.4619 Burghausen, Germany, 48.1667, 12.8333 Vera, Spain, 37.2500, -1.8667 Katangi, India, 21.7737, 79.8051 Cedar Mill, United States, 45.5355, -122.8006 San Juan de Dios, Costa Rica, 9.8800, -84.0914 Mougins, France, 43.6008, 6.9956 Hoveyzeh, Iran, 31.4606, 48.0781 Nilgiri, India, 21.6466, 86.9199 Deneysville, South Africa, -26.8950, 28.0983 Arvin, United States, 35.1944, -118.8306 Capinota, Bolivia, -17.7150, -66.2636 Hechingen, Germany, 48.3517, 8.9633 Jakobstad, Finland, 63.6667, 22.7000 Cugir, Romania, 45.8436, 23.3636 Hawthorne, United States, 40.9579, -74.1582 Orinda, United States, 37.8808, -122.1790 Santiago, Philippines, 17.2947, 120.4453 Saray, Turkey, 38.6506, 44.1700 Homewood, United States, 41.5591, -87.6610 Annaberg-Buchholz, Germany, 50.5800, 13.0022 Jesus Maria, Mexico, 20.6078, -102.2242 Cutlerville, United States, 42.8403, -85.6734 Jagalur, India, 14.5196, 76.3391 Krishnapur, India, 24.4123, 88.2582 Orvieto, Italy, 42.7167, 12.1000 Sondiha, India, 24.8950, 87.0175 Polonuevo, Colombia, 10.7833, -74.8667 Gogogogo, Madagascar, -24.2659, 44.8069 Ramchandrapur, India, 24.0154, 87.9446 Teghra English, India, 25.4072, 87.7410 Setlagode, South Africa, -26.2870, 25.1170 Lynn Haven, United States, 30.2337, -85.6370 Narsapur, India, 17.7374, 78.2805 Cervantes, Philippines, 16.9917, 120.7333 San Bartolome, Spain, 29.0016, -13.6139 Madisonville, United States, 37.3409, -87.5034 Marihatag, Philippines, 8.8008, 126.2983 Al Brouj, Morocco, 32.5050, -7.1927 Warrensburg, United States, 38.7627, -93.7260 Ronchin, France, 50.6053, 3.0886 Eschwege, Germany, 51.1881, 10.0528 Sabaudia, Italy, 41.2998, 13.0248 Salmon Arm, Canada, 50.7022, -119.2722 Cardonal, Mexico, 20.6167, -99.1167 Adel, United Kingdom, 53.8489, -1.5849 Senica, Slovakia, 48.6806, 17.3667 Albania, Colombia, 11.1597, -72.5856 Alton, United Kingdom, 51.1498, -0.9769 Tublay, Philippines, 16.4764, 120.6333 Someren, Netherlands, 51.3847, 5.7119 Santiago Texacuangos, El Salvador, 13.6500, -89.1167 Fokino, Russia, 42.9667, 132.4000 Heusenstamm, Germany, 50.0500, 8.8000 Ban Thap Kwang, Thailand, 14.6103, 101.0753 Fouriesburg, South Africa, -28.6227, 28.2109 Gaeta, Italy, 41.2167, 13.5667 Naples, United States, 26.1504, -81.7936 Kemise, Ethiopia, 10.7167, 39.8667 Liversedge, United Kingdom, 53.7067, -1.6900 Nova Granada, Brazil, -20.5339, -49.3139 Siruma, Philippines, 14.0219, 123.2589 El Arahal, Spain, 37.2667, -5.5500 Karttigappalli, India, 11.6000, 75.6667 La Crau, France, 43.1506, 6.0747 Kolbermoor, Germany, 47.8500, 12.0667 South El Monte, United States, 34.0493, -118.0484 Kirkland, Canada, 45.4500, -73.8667 Dorou, Mali, 14.4569, -3.0936 Samalapuram, India, 11.0724, 77.1980 Salangaippalaiyam, India, 11.4260, 77.5707 Abrisham, Iran, 32.5675, 51.5733 Hermiston, United States, 45.8326, -119.2854 Xihuangcun, China, 37.1411, 114.2293 El Rodeo, Guatemala, 14.9167, -91.9667 Los Bajos, Chile, -41.0698, -72.9317 Frutillar Alto, Chile, -41.0872, -73.0956 Yandrapalle, India, 16.0472, 79.3073 Pahsara, India, 25.5482, 86.1667 Dalanzadgad, Mongolia, 43.5700, 104.4258 Varpalota, Hungary, 47.1972, 18.1394 Kantharalak, Thailand, 14.6406, 104.6499 Pariquera-Acu, Brazil, -24.7150, -47.8811 Kushiro, Japan, 42.9800, 144.3800 Cantagalo, Brazil, -21.9808, -42.3678 Jdour, Morocco, 32.1269, -8.7633 Cabildo, Chile, -32.4275, -71.0664 Alto Araguaia, Brazil, -17.3147, -53.2153 Englewood, United States, 26.9717, -82.3524 Arbaoun, Algeria, 36.4667, 5.6500 Marchena, Spain, 37.3333, -5.4167 Barro, Brazil, -7.1769, -38.7819 Malgrat de Mar, Spain, 41.6500, 2.7500 Kalghatgi, India, 15.1832, 74.9710 Shikrapur, India, 18.6936, 74.1381 Charef, Algeria, 34.6167, 2.8000 Manjathala, India, 11.3624, 76.7789 Les Coteaux, Haiti, 18.2060, -74.0401 Casarano, Italy, 40.0167, 18.1667 Inta, Russia, 66.0833, 60.1333 Middelkerke, Belgium, 51.1833, 2.8167 Kemi, Finland, 65.7361, 24.5636 Heishanzuicun, China, 41.0354, 116.9304 Osa, Russia, 57.3000, 55.4667 Abhayapuri, India, 26.3225, 90.6853 Kakdwip, India, 21.8791, 88.1913 Sherrelwood, United States, 39.8390, -105.0014 Giovinazzo, Italy, 41.1833, 16.6667 Canto do Buriti, Brazil, -8.1100, -42.9439 Fayetteville, United States, 33.4501, -84.4710 Kloten, Switzerland, 47.4481, 8.5828 Kitatajima, Japan, 35.9821, 139.4816 Tajerouine, Tunisia, 35.8833, 8.5500 Godo, Japan, 35.4174, 136.6252 Bad Tolz, Germany, 47.7603, 11.5567 Juquia, Brazil, -24.3208, -47.6347 Rifadpur, India, 25.2635, 87.4157 Pastrana, Philippines, 11.1300, 124.8800 Mukaiengaru, Japan, 44.0667, 143.5333 Paranapanema, Brazil, -23.3886, -48.7228 Heishuikeng, China, 37.7905, 110.5711 Lancing, United Kingdom, 50.8320, -0.3190 Sare-Yamou, Mali, 16.0897, -3.2353 Buruanga, Philippines, 11.8438, 121.8888 Arbatache, Algeria, 36.6361, 3.3708 Kozmodemyansk, Russia, 56.3367, 46.5711 Zverevo, Russia, 47.0206, 40.1225 Saint-Lo, France, 49.1200, -1.0900 Kuttyadi, India, 11.6542, 75.7539 Dudu, Romania, 44.4563, 25.9906 Mahajeran-e Kamar, Iran, 34.0486, 49.4311 Ban Bueng, Thailand, 13.3142, 101.1114 Ban Patong, Thailand, 7.8931, 98.2983 Twinsburg, United States, 41.3220, -81.4451 Oruvadalkotta, India, 8.4778, 77.1347 Moulins, France, 46.5653, 3.3333 North Myrtle Beach, United States, 33.8232, -78.7082 Pushchino, Russia, 54.8333, 37.6167 Jose Cardel, Mexico, 19.3667, -96.3667 Tadian, Philippines, 16.9961, 120.8208 Weil der Stadt, Germany, 48.7508, 8.8706 West Mifflin, United States, 40.3581, -79.9073 Pugo, Philippines, 16.2800, 120.4800 Allanridge, South Africa, -27.7544, 26.6367 Seminole, United States, 27.8435, -82.7840 Tangbian, China, 25.6539, 106.7793 Sorada, India, 19.7608, 84.4300 San Roque, Philippines, 14.4800, 120.9011 Weesp, Netherlands, 52.3000, 5.0500 Bierun, Poland, 50.1333, 19.1000 Cajola, Guatemala, 14.9167, -91.6167 Corner Brook, Canada, 48.9287, -57.9260 Dashtigulho, Tajikistan, 37.7000, 69.5000 Cocoa, United States, 28.3820, -80.7675 Presidente Medici, Brazil, -11.1758, -61.9008 Bholsar, India, 25.2133, 87.2147 Pultusk, Poland, 52.7000, 21.0833 Ban Fang Tuen, Thailand, 19.5497, 99.7566 Rosedale, United States, 35.3886, -119.2058 Saint-Die-des-Vosges, France, 48.2800, 6.9500 Jirkov, Czechia, 50.5003, 13.4419 Peruru, India, 14.3503, 77.3497 Stillwater, United States, 45.0573, -92.8313 Royan, France, 45.6200, -1.0300 Tevaram, India, 9.8967, 77.2809 Kamiichi, Japan, 36.7000, 137.3667 New Glasgow, Canada, 45.5926, -62.6455 Moana, Spain, 42.2833, -8.7500 Palera, India, 25.0201, 79.2282 Panniperumthalai, India, 10.6986, 76.6875 Mancio Lima, Brazil, -7.6142, -72.8958 San Antonio Huista, Guatemala, 15.6500, -91.7667 Assamannur, India, 10.1129, 76.5517 Pohadi, India, 26.0809, 86.2831 El Viso del Alcor, Spain, 37.3833, -5.7167 Tash-Komur, Kyrgyzstan, 41.3461, 72.2171 Santa Fe Springs, United States, 33.9329, -118.0625 Pottanikad, India, 10.0061, 76.6808 Dudinka, Russia, 69.4064, 86.1764 Monte Azul Paulista, Brazil, -20.9072, -48.6414 Virovitica, Croatia, 45.8333, 17.3833 Dorval, Canada, 45.4500, -73.7500 Qandala, Somalia, 11.4667, 49.8667 Marechal Taumaturgo, Brazil, -8.9411, -72.7917 Espiritu, Philippines, 17.9806, 120.6544 Kapangan, Philippines, 16.5764, 120.6053 Gilching, Germany, 48.1167, 11.3000 Trinity, United States, 28.1809, -82.6582 Sirvar, India, 16.1739, 77.0225 Casamassima, Italy, 40.9500, 16.9167 Sukumo, Japan, 32.9333, 132.7167 Ganyesa, South Africa, -26.5908, 24.1594 Douar Ait Sidi Daoud, Morocco, 31.6347, -7.6444 Prunedale, United States, 36.8064, -121.6555 Maumelle, United States, 34.8522, -92.4000 Bouanri, Benin, 10.2000, 2.8667 Bhojpur Jadid, India, 25.5880, 84.1621 Iiyama, Japan, 36.8516, 138.3655 Rovato, Italy, 45.5670, 9.9986 Beaconsfield, Canada, 45.4333, -73.8667 Pitimbu, Brazil, -7.4706, -34.8086 Aberdeen, United States, 40.4165, -74.2249 Sint-Gillis-Waas, Belgium, 51.2167, 4.1167 Mapastepec, Mexico, 15.4411, -92.8916 Peterhead, United Kingdom, 57.5091, -1.7832 Eitorf, Germany, 50.7697, 7.4517 Indargarh, India, 25.9109, 78.5619 Maitland, United States, 28.6295, -81.3718 St. Michael, United States, 45.2014, -93.6920 Kudra, India, 25.0463, 83.7926 Cassano d'Adda, Italy, 45.5333, 9.5167 Valle Vista, United States, 33.7436, -116.8871 Tillaberi, Niger, 14.2120, 1.4531 Babai, India, 22.7026, 77.9349 Balintawak, Philippines, 14.6506, 121.0014 East Dereham, United Kingdom, 52.6810, 0.9400 Cabusao, Philippines, 13.7275, 123.1142 Durango, United States, 37.2659, -107.8781 Tinton Falls, United States, 40.2708, -74.0949 Holtsville, United States, 40.8124, -73.0447 Schwalmtal, Germany, 51.2225, 6.2625 Hermosa Beach, United States, 33.8653, -118.3962 Tonantins, Brazil, -2.8728, -67.8019 Realeza, Brazil, -25.7669, -53.5269 Dracevo, North Macedonia, 41.9335, 21.5247 Opoczno, Poland, 51.3772, 20.2869 Soure, Portugal, 40.0688, -8.6277 Aracoiaba, Brazil, -7.7900, -35.0908 Quartier Morin, Haiti, 19.6970, -72.1571 Sirnia, India, 25.4903, 87.5892 Kamwenge, Uganda, 0.1861, 30.4539 Holalkere, India, 14.0429, 76.1850 Diadi, Philippines, 16.6600, 121.3686 Brookfield, United States, 41.8245, -87.8470 West Chester, United States, 39.9601, -75.6058 Schkeuditz, Germany, 51.4000, 12.2167 Ballitoville, South Africa, -29.5333, 31.2167 Republic, United States, 37.1452, -93.4446 Garot, India, 24.3234, 75.6520 Uwchlan, United States, 40.0522, -75.6679 Kassama, Mali, 13.0544, -11.1239 Moncao, Portugal, 42.0733, -8.4800 Ghosai, India, 25.5562, 87.0304 Magitang, China, 35.9506, 101.9686 Suhbaatar, Mongolia, 50.2364, 106.2064 Pescia, Italy, 43.9017, 10.6898 Pfullingen, Germany, 48.4656, 9.2261 Lumberton, United States, 34.6312, -79.0186 Vigna di Valle, Italy, 42.1000, 12.1833 Atok, Philippines, 16.6272, 120.7672 Khonj, Iran, 27.8897, 53.4308 Amboanana, Madagascar, -19.1336, 47.1717 Wanluan, Taiwan, 22.5727, 120.5678 Eruvatti, India, 12.0500, 75.5500 Cheticheri, India, 12.0950, 75.5451 Kabudarahang, Iran, 35.2069, 48.7228 Tingloy, Philippines, 13.6500, 120.8700 Bandar-e Kong, Iran, 26.5947, 54.9381 Ecclesall, United Kingdom, 53.3620, -1.4980 Ibatiba, Brazil, -20.2364, -41.5092 Kalabahi, Indonesia, -8.2167, 124.5167 Durant, United States, 33.9949, -96.3923 Abomsa, Ethiopia, 8.5833, 39.8500 Zola Predosa, Italy, 44.4883, 11.2181 Tamgrout, Morocco, 30.2667, -5.6667 Texcaltitlan, Mexico, 18.9297, -99.9372 Lumphat, Cambodia, 13.5070, 106.9810 Puerto Morelos, Mexico, 20.8536, -86.8753 Jiabong, Philippines, 11.7625, 124.9519 Alton, United States, 26.2884, -98.3098 Ystrad Mynach, United Kingdom, 51.6419, -3.2405 Rangra, India, 25.3803, 87.1866 Selendi, Turkey, 38.7444, 28.8678 Harrisburg, United States, 35.3125, -80.6485 Kale, Turkey, 37.4392, 28.8453 Devgadh Bariya, India, 22.7022, 73.9150 Jamiltepec, Mexico, 16.2833, -97.8167 Ijevan, Armenia, 40.8756, 45.1492 Attapu, Laos, 14.8000, 106.8333 Aradippou, Cyprus, 34.9528, 33.5900 Sligo, Ireland, 54.2667, -8.4833 Torokszentmiklos, Hungary, 47.1833, 20.4167 West Manchester, United States, 39.9456, -76.7952 Lebbeke, Belgium, 51.0000, 4.1167 Rurrenabaque, Bolivia, -14.4422, -67.5283 La Corredoria, Spain, 43.3853, -5.8208 Binka, India, 21.0263, 83.8120 Khamaria, India, 23.2129, 80.0313 Gomishan, Iran, 37.0700, 54.0769 Lake Forest, United States, 42.2380, -87.8596 Ermita, Philippines, 14.5830, 120.9830 Venceslau Bras, Brazil, -23.8739, -49.8028 Haldensleben, Germany, 52.2833, 11.4167 Ranst, Belgium, 51.1896, 4.5634 Laaouama, Morocco, 35.7167, -5.8000 Melville, United States, 40.7824, -73.4088 Zerong, China, 24.8955, 104.9590 Pattiayal, India, 12.4356, 75.0691 Dumra, India, 26.5671, 85.5204 Pokaran, India, 26.9200, 71.9200 Alcoy, Philippines, 9.7082, 123.5060 Vera, Argentina, -29.4667, -60.2167 Seesen, Germany, 51.8931, 10.1783 Sibila, Mali, 13.7775, -5.8781 Deerfield, United States, 42.1654, -87.8516 Oued el Abtal, Algeria, 35.4500, 0.6833 Sirpur, India, 19.4833, 79.6000 Central Point, United States, 42.3764, -122.9111 Jamsa, Finland, 61.8667, 25.1833 Maghar, India, 26.7600, 83.1300 Gioia Tauro, Italy, 38.4333, 15.9000 Orange, United States, 30.1226, -93.7607 Krasnogorskiy, Uzbekistan, 41.1542, 69.6697 Ghogardiha, India, 26.2799, 86.4700 La Paz, Philippines, 10.8911, 124.9572 Jaicos, Brazil, -7.3592, -41.1378 Schneverdingen, Germany, 53.1167, 9.8000 Meise, Belgium, 50.9333, 4.3333 Chiari, Italy, 45.5272, 9.9174 'Ali Ben Sliman, Morocco, 31.9100, -7.2100 Ambatomirahavavy, Madagascar, -18.9326, 47.3818 Essen, Belgium, 51.4667, 4.4667 Raita, India, 32.5495, 76.2390 Izra`, Syria, 32.8671, 36.2507 Point Pleasant, United States, 40.0772, -74.0702 Dixon, United States, 38.4469, -121.8250 Pauktaw, Burma, 20.2128, 93.1308 Vila Real de Santo Antonio, Portugal, 37.2000, -7.4167 Ferndale, United States, 42.4592, -83.1313 La Union, Peru, -5.4022, -80.7422 Norton, United States, 41.9640, -71.1842 Tiruvadi, India, 10.8805, 79.1049 Cocos, Brazil, -14.1839, -44.5339 Iselin, United States, 40.5697, -74.3172 Papanduva, Brazil, -26.3700, -50.1439 Guaranesia, Brazil, -21.2989, -46.8028 Senguio, Mexico, 19.7328, -100.3522 Pitt Meadows, Canada, 49.2333, -122.6833 Biswanath Chariali, India, 26.7278, 93.1517 Scituate, United States, 42.1992, -70.7590 Reinach, Switzerland, 47.4936, 7.5908 Gerze, Turkey, 41.8056, 35.1981 Fukusaki, Japan, 34.9500, 134.7667 Ad Dir`iyah, Saudi Arabia, 24.7333, 46.5756 Diamante, Argentina, -32.0667, -60.6500 Siralkoppa, India, 14.3807, 75.2501 Mahbes, Morocco, 27.4160, -9.0510 Cinco Ranch, United States, 29.7395, -95.7607 Billinghurst, Argentina, -34.5667, -58.5333 Kodumba, India, 10.7333, 76.6833 Diepenbeek, Belgium, 50.9072, 5.4175 Passagem Franca, Brazil, -6.1797, -43.7836 Iramala, India, 10.0374, 76.5135 Pljevlja, Montenegro, 43.3567, 19.3583 Ampanety, Madagascar, -18.9667, 47.4833 Trzebinia, Poland, 50.1667, 19.4833 Calne, United Kingdom, 51.4380, -2.0050 Winchester, United States, 38.0018, -84.1908 Saugerties, United States, 42.0891, -73.9969 Ainan, Japan, 32.9667, 132.5833 Lakeway, United States, 30.3544, -97.9864 Contenda, Brazil, -25.6758, -49.5350 La Ligua, Chile, -32.4500, -71.2167 Shemonaikha, Kazakhstan, 50.6269, 81.9109 Kufstein, Austria, 47.5833, 12.1667 Chennirkara, India, 9.2487, 76.7248 Mavinpalli, India, 17.9100, 77.5300 Ashkezar, Iran, 31.9997, 54.2075 Shimokizukuri, Japan, 40.8085, 140.3805 Krymsk, Russia, 44.9233, 37.9806 Ban Mon Pin, Thailand, 19.9168, 99.1583 Baden, Switzerland, 47.4729, 8.3080 Martin Coronado, Argentina, -34.6000, -58.5500 Morauna, India, 26.1706, 86.4231 Shahgarh, India, 24.3137, 79.1181 San Teodoro, Philippines, 13.4358, 121.0192 Prichard, United States, 30.7735, -88.1301 La Union, Colombia, 5.9736, -75.3614 Phayao, Thailand, 19.1653, 99.9036 Cerqueira Cesar, Brazil, -23.0356, -49.1661 Lebach, Germany, 49.4100, 6.9100 Cacahoatan, Mexico, 17.1667, -92.1667 Liberal, United States, 37.0466, -100.9295 Montemurlo, Italy, 43.9278, 11.0400 Gobabis, Namibia, -22.4500, 18.9667 Kingsland, United States, 30.8194, -81.7216 Bierun Stary, Poland, 50.0897, 19.0928 Shahpur, India, 25.6029, 84.4041 Harpur, India, 26.4527, 86.0710 Stord, Norway, 59.7738, 5.4903 Nilambur, India, 11.0590, 77.0838 Taka, Japan, 35.0500, 134.9236 Frimley, United Kingdom, 51.3143, -0.7387 Five Forks, United States, 34.8069, -82.2271 Chautapal, India, 17.2508, 78.8972 Anguillara Sabazia, Italy, 42.0883, 12.2775 Lumbayanague, Philippines, 7.7800, 124.2800 Warwick, United States, 40.1558, -76.2799 Paillaco, Chile, -40.0667, -72.8833 Molesey, United Kingdom, 51.4010, -0.3630 Niagara-on-the-Lake, Canada, 43.2553, -79.0717 Bad Reichenhall, Germany, 47.7247, 12.8769 Mumbwa, Zambia, -14.9853, 27.0619 Beltsville, United States, 39.0394, -76.9211 Butia, Brazil, -30.1200, -51.9619 Chopinzinho, Brazil, -25.8558, -52.5228 Pindobacu, Brazil, -10.7428, -40.3628 Tazishan, China, 41.0904, 118.9931 Cheran, Mexico, 19.6833, -101.9500 Aizumisato, Japan, 37.4599, 139.8411 Menzel Abderhaman, Tunisia, 37.2300, 9.8600 Rizal, Philippines, 17.8478, 121.3450 Cirencester, United Kingdom, 51.7167, -1.9667 Karlshamn, Sweden, 56.1697, 14.8638 Perumkulam, India, 8.7052, 76.7861 Ban Bueng Phra, Thailand, 16.7460, 100.2750 Mahisi, India, 25.8544, 86.4650 Simri, India, 25.6405, 84.1195 Nalua, India, 22.1051, 88.4619 Olivehurst, United States, 39.0795, -121.5566 Ixtlahuacan del Rio, Mexico, 20.8667, -103.2500 Sao Jose de Piranhas, Brazil, -7.1208, -38.5019 Sudbury, United States, 42.3847, -71.4234 Sant'Antonio Abate, Italy, 40.7218, 14.5436 Cardedeu, Spain, 41.6406, 2.3594 Cunco, Chile, -38.9167, -72.0333 Phoenixville, United States, 40.1359, -75.5201 Chinna Ganjam, India, 15.7000, 80.2500 Murugampalaiyam, India, 11.0806, 77.3238 Malanday, Philippines, 14.7194, 120.9547 Sommerda, Germany, 51.1617, 11.1169 Sabanitas, Panama, 9.3452, -79.8054 Hopkinton, United States, 42.2255, -71.5378 Zatec, Czechia, 50.3300, 13.5444 Hindoria, India, 23.9035, 79.5686 Tanbaichicho, Japan, 34.5966, 135.8374 Monkseaton, United Kingdom, 55.0430, -1.4590 East Riverdale, United States, 38.9600, -76.9109 Puranpur, India, 28.5200, 80.1500 Dachepalle, India, 16.6000, 79.7333 Svay Pak, Cambodia, 11.6460, 104.8741 Itaosy, Madagascar, -18.9138, 47.4712 Lejiangxiang, China, 25.9161, 109.8719 Sylvania, United States, 41.7100, -83.7092 Vynnyky, Ukraine, 49.8156, 24.1297 Sheridan, United States, 44.7961, -106.9642 Blankenburg, Germany, 51.7953, 10.9622 Quisqueya, Dominican Republic, 18.5542, -69.4056 Dharmsala, India, 32.2153, 76.3186 Marktoberdorf, Germany, 47.7667, 10.6167 Kovur, India, 12.1094, 75.3941 Bukungu, Uganda, 1.4361, 32.8686 Badger, United States, 64.8006, -147.3877 Taquarana, Brazil, -9.6450, -36.4969 Sorgues, France, 44.0092, 4.8730 Tirmitine, Algeria, 36.6618, 3.9848 Villa Ocampo, Argentina, -28.4833, -59.3500 Gautier, United States, 30.4106, -88.6568 Telpaneca, Nicaragua, 13.5333, -86.2833 Haslett, United States, 42.7525, -84.4020 Rahata, India, 19.7167, 74.4833 Bremervorde, Germany, 53.4833, 9.1333 Norwood, United States, 39.1605, -84.4535 Prenzlau, Germany, 53.3167, 13.8667 Utebo, Spain, 41.7167, -1.0000 Sarauli, India, 28.4931, 79.0853 Wervik, Belgium, 50.7833, 3.0333 Morlanwelz-Mariemont, Belgium, 50.4500, 4.2333 Terrell, United States, 32.7340, -96.2931 Villefontaine, France, 45.6142, 5.1494 Cotija de la Paz, Mexico, 19.8167, -102.6833 Caowotan, China, 37.3044, 104.1720 Dadeldhura, Nepal, 29.3000, 80.6000 Station des Essais M.V.A., Morocco, 34.9352, -2.4306 Santa Ana Jilotzingo, Mexico, 19.4000, -99.2333 Santa Rosa de Calamuchita, Argentina, -32.0667, -64.5333 Spoltore, Italy, 42.4550, 14.1399 Manjha, India, 26.4061, 84.5002 Horseheads, United States, 42.1625, -76.7941 Fond des Blancs, Haiti, 18.2778, -73.1273 El Bolson, Argentina, -41.9667, -71.5333 Akune, Japan, 32.0144, 130.1928 Agua Branca, Brazil, -9.2608, -37.9361 Ashland, United States, 40.8668, -82.3156 Crowley, United States, 32.5781, -97.3585 Quaregnon, Belgium, 50.4417, 3.8670 Burscheid, Germany, 51.1000, 7.1167 Lagoa de Itaenga, Brazil, -7.9358, -35.2900 Zwijndrecht, Belgium, 51.2167, 4.3333 Durpalli, India, 18.5967, 78.4517 Befandriana Atsimo, Madagascar, -22.1033, 43.8927 Ampataka, Madagascar, -23.3527, 47.4650 Anjahabe, Madagascar, -16.3883, 46.6318 Ambalanirana, Madagascar, -18.7598, 46.5139 Ambatomena, Madagascar, -19.8508, 47.2534 Mitsinjo, Madagascar, -16.0099, 45.8703 Belamoty, Madagascar, -23.5585, 44.8091 Vohimasy, Madagascar, -22.1067, 47.7938 Ifanirea, Madagascar, -22.1924, 47.4741 Tanambe, Madagascar, -17.3850, 48.4523 Ambodinonoka, Madagascar, -20.9789, 47.8864 Miarinavaratra, Madagascar, -20.2173, 47.5020 Ambatosia, Madagascar, -14.6764, 48.6592 Mahazoarivo, Madagascar, -22.3254, 47.5691 Manantenina, Madagascar, -24.2815, 47.3178 Bezaha, Madagascar, -23.5007, 44.5007 Ranomena, Madagascar, -23.4259, 47.2817 Nootdorp, Netherlands, 52.0439, 4.3978 Bajo Boquete, Panama, 8.7800, -82.4400 Shovot, Uzbekistan, 41.6500, 60.3000 Brie-Comte-Robert, France, 48.6917, 2.6083 Augusta, United States, 44.3341, -69.7319 Cafelandia, Brazil, -24.6178, -53.3200 Vista Hermosa de Negrete, Mexico, 20.2717, -102.4749 Yahotyn, Ukraine, 50.2569, 31.7817 Pruzhany, Belarus, 52.5567, 24.4644 Haukipudas, Finland, 65.1833, 25.3500 Kouloum, Mali, 14.4714, -11.3644 Sarangpur, India, 25.7389, 85.6951 Druten, Netherlands, 51.8889, 5.6044 Chapada dos Guimaraes, Brazil, -15.4608, -55.7500 Le Puy-en-Velay, France, 45.0444, 3.8847 Birpur, India, 25.5181, 86.0826 Chinchali, India, 16.5650, 74.8175 Kosatarosh, Tajikistan, 39.4000, 67.7500 Springfield, United States, 36.4949, -86.8711 Barao do Grajau, Brazil, -6.7558, -43.0239 Proletarsk, Russia, 46.7000, 41.7333 Narapala, India, 14.7206, 77.8106 Sukhasan, India, 25.4944, 87.5263 Scorze, Italy, 45.5719, 12.1089 Rufino, Argentina, -34.2619, -62.7114 Juvisy-sur-Orge, France, 48.6889, 2.3783 Kaveripatnam, India, 12.4219, 78.2188 Lebanon, United States, 44.5317, -122.9071 Onex, Switzerland, 46.1833, 6.1000 Ferguson, United States, 40.7432, -77.9403 Caconde, Brazil, -21.5289, -46.6439 Boiro, Spain, 42.6500, -8.9000 Redland, United States, 39.1339, -77.1464 Siripur, India, 26.7336, 84.7217 Koliakkod, India, 8.6333, 76.9000 Sarso, India, 26.2333, 86.1768 Seagoville, United States, 32.6530, -96.5456 Acqui Terme, Italy, 44.6761, 8.4686 Windham, United States, 43.7981, -70.4056 Varidhanam, India, 16.5576, 81.8303 Ban Na Yang, Thailand, 12.8849, 99.9475 Colwood, Canada, 48.4236, -123.4958 Southbourne, United Kingdom, 50.7220, -1.7980 Konstantynow Lodzki, Poland, 51.7500, 19.3333 Chichiriviche, Venezuela, 10.9343, -68.2771 Fox Crossing, United States, 44.2228, -88.4763 El Rosal, Colombia, 4.8519, -74.2628 Saint Peter Port, Guernsey, 49.4555, -2.5368 Carei, Romania, 47.6839, 22.4669 Sarsawa, India, 30.0160, 77.4000 Tamman, Pakistan, 33.6772, 72.8558 Makronia, India, 23.8476, 78.7990 Krommenie, Netherlands, 52.5000, 4.7667 Chilkuru, India, 16.9611, 79.9125 San Ignacio Cerro Gordo, Mexico, 20.7333, -102.5167 Ansonia, United States, 41.3443, -73.0689 Krizevci, Croatia, 46.0333, 16.5333 Atacames, Ecuador, 0.8667, -79.8333 Pitseng, Lesotho, -29.0097, 28.2575 El Malah, Algeria, 35.3883, -1.0944 Guru Har Sahai, India, 30.7086, 74.4041 Motomachi, Japan, 43.8250, 144.1056 San Gabriel, Philippines, 16.6700, 120.4000 Aikaranad, India, 10.0002, 76.4550 Cumberland, United States, 39.6515, -78.7584 Neviges, Germany, 51.3128, 7.0869 Casalgrande, Italy, 44.5898, 10.7394 Lakhnadon, India, 22.6005, 79.6009 Weissenburg, Germany, 49.0306, 10.9719 Laatatra, Morocco, 32.6315, -8.4148 Ayvacik, Turkey, 41.0036, 36.6319 Middlesex Centre, Canada, 43.0500, -81.4500 Desavilakku, India, 11.6476, 77.9670 Monserrato, Italy, 39.2568, 9.1387 Barauna, Brazil, -5.0800, -37.6169 Eiheiji, Japan, 36.0922, 136.2987 Knik-Fairview, United States, 61.5082, -149.6252 Nakasi, Fiji, -18.0708, 178.5214 Elamattur, India, 9.4167, 76.7000 Zuidhorn, Netherlands, 53.2468, 6.4077 Ardon, Russia, 43.1833, 44.3167 Ab Pakhsh, Iran, 29.3611, 51.0717 Ellensburg, United States, 46.9999, -120.5475 Ismailpur, India, 25.3113, 87.1270 Onalaska, United States, 43.8883, -91.2075 Kotekara, India, 12.7929, 74.8722 Ranbirsinghpura, India, 32.6079, 74.7293 Tado, Colombia, 5.2667, -76.5667 Lagoa Formosa, Brazil, -18.7789, -46.4078 Fakfak, Indonesia, -2.9167, 132.3000 Sironko, Uganda, 1.2306, 34.2481 Beshkent Shahri, Uzbekistan, 38.8167, 65.6500 Shirin, Uzbekistan, 40.2269, 69.1344 Milton, United States, 43.0406, -73.8998 Mo i Rana, Norway, 66.3167, 14.1667 Mebane, United States, 36.0852, -79.2736 Utazu, Japan, 34.3167, 133.8333 Somandepalle, India, 14.0078, 77.6086 Nayagarh, India, 20.1288, 85.0963 Cullman, United States, 34.1775, -86.8407 Gatada, India, 18.4144, 83.5041 Vitre, France, 48.1242, -1.2081 Bad Segeberg, Germany, 53.9167, 10.3167 Gardhabaer, Iceland, 64.0902, -21.9264 Prestatyn, United Kingdom, 53.3310, -3.4050 Madalag, Philippines, 11.5269, 122.3064 Nanjanad, India, 11.3669, 76.6415 Amares, Portugal, 41.6333, -8.3500 Henichesk, Ukraine, 46.1667, 34.8000 Palestine, United States, 31.7544, -95.6471 Guarei, Brazil, -23.3728, -48.1842 Eastwood, United Kingdom, 53.0180, -1.3040 Hemmingen, Germany, 52.3236, 9.7256 Ezhamkulam, India, 9.1333, 76.7667 Gentilly, France, 48.8133, 2.3444 Sugaon, India, 26.7317, 84.7629 Kasterlee, Belgium, 51.2407, 4.9669 Formoso do Araguaia, Brazil, -11.7969, -49.5289 Jaggampeta, India, 17.1833, 82.0500 Pozzallo, Italy, 36.7303, 14.8467 Hun, Libya, 29.1268, 15.9477 Lagawe, Philippines, 16.7975, 121.1228 Chowchilla, United States, 37.1095, -120.2349 Korsimoro, Burkina Faso, 12.8250, -1.0672 Guisborough, United Kingdom, 54.5350, -1.0563 Signa, Italy, 43.7833, 11.1000 Ap Khanh Hung, Vietnam, 10.2000, 105.8500 Ploemeur, France, 47.7372, -3.4261 Malazgirt, Turkey, 39.1478, 42.5442 Kalmthout, Belgium, 51.3833, 4.4667 Ajacuba, Mexico, 20.0833, -99.1167 Massaguet, Chad, 12.4742, 15.4428 Groesbeek, Netherlands, 51.7833, 5.9333 Altamira, Dominican Republic, 19.6667, -70.8333 Kabbur, India, 16.4200, 74.5800 Virapandi, India, 9.9633, 77.4472 Sidi Yakoub, Morocco, 31.6667, -7.0667 Varapatti, India, 10.0167, 76.6167 Arita, Japan, 33.2106, 129.8492 San Sebastian de Buenavista, Colombia, 9.2403, -74.3556 Lansdale, United States, 40.2417, -75.2812 Aridaia, Greece, 40.9667, 22.0500 Kottakota, India, 17.7513, 82.7004 Duero, Philippines, 9.7200, 124.4000 Conceicao, Brazil, -7.5619, -38.5089 Mont-Saint-Hilaire, Canada, 45.5622, -73.1917 Traiskirchen, Austria, 48.0167, 16.3000 Naaldwijk, Netherlands, 51.9936, 4.2133 Moul El Bergui, Morocco, 32.5113, -8.9849 Malloussa, Morocco, 35.7333, -5.6333 Larne, United Kingdom, 54.8517, -5.8133 Malimono, Philippines, 9.6183, 125.4019 Horizontina, Brazil, -27.6258, -54.3078 Felanitx, Spain, 39.4669, 3.1483 Anzoategui, Colombia, 4.6339, -75.0972 Veternik, Serbia, 45.2533, 19.7608 Winder, United States, 33.9917, -83.7218 Fihaonana, Madagascar, -18.6061, 47.2092 Guachucal, Colombia, 0.9667, -77.7333 White Oak, United States, 39.2106, -84.6060 Kara-Kol, Kyrgyzstan, 41.6333, 72.6667 Oirschot, Netherlands, 51.5047, 5.3128 Varzelandia, Brazil, -15.7008, -44.0278 Zahana, Algeria, 35.5167, -0.4167 Dukli, India, 22.3000, 79.4833 Ben 'Aknoun, Algeria, 36.7500, 3.0000 Nakhl-e Taqi, Iran, 27.5003, 52.5822 Chelmno, Poland, 53.3492, 18.4231 Acri, Italy, 39.5000, 16.3833 Tradate, Italy, 45.7000, 8.9167 Pinole, United States, 37.9931, -122.2833 Barcelos, Brazil, -0.9750, -62.9239 Bad Berleburg, Germany, 51.0497, 8.4000 Cusano Milanino, Italy, 45.5500, 9.1833 La Marque, United States, 29.3683, -94.9941 Qitai, China, 41.5494, 113.5339 Gibsonton, United States, 27.8260, -82.3761 Dzuunharaa, Mongolia, 48.8666, 106.4666 Las Terrenas, Dominican Republic, 19.3200, -69.5300 Edam, Netherlands, 52.5167, 5.0500 Khetia, India, 21.6712, 74.5853 Nunungan, Philippines, 7.8200, 123.9700 Sao Jose da Coroa Grande, Brazil, -8.8978, -35.1478 Somerset East, South Africa, -32.7167, 25.5833 Radeberg, Germany, 51.1167, 13.9167 Camarate, Portugal, 38.8062, -9.1412 Odzak, Bosnia and Herzegovina, 45.0246, 18.3211 Bad Durkheim, Germany, 49.4594, 8.1681 Carlos Spegazzini, Argentina, -34.8833, -58.5667 Villa Nueva, Argentina, -32.4331, -63.2475 Ascencion de Guarayos, Bolivia, -15.8922, -63.1881 Sebaste, Philippines, 11.5901, 122.0945 Caraubas, Brazil, -5.7928, -37.5569 Hochheim am Main, Germany, 50.0167, 8.3500 Sabalpur, India, 25.6053, 85.1835 Velez, Colombia, 6.0103, -73.6763 Purushottampur, India, 19.5202, 84.8851 Cimarron Hills, United States, 38.8597, -104.6995 Winthrop, United States, 42.3761, -70.9846 Talsint, Morocco, 32.5398, -3.4408 Brownwood, United States, 31.7127, -98.9767 St. Marys, United States, 30.7567, -81.5722 Martinsburg, United States, 39.4582, -77.9776 Udumanthala, India, 12.2333, 75.4667 Malacky, Slovakia, 48.4381, 17.0236 Huehuetla, Mexico, 20.1075, -97.6233 Pastos Bons, Brazil, -6.6019, -44.0769 Shimomura, Japan, 36.0696, 138.0802 Abdurahmoni Jomi, Tajikistan, 37.9458, 68.8117 Dusti, Tajikistan, 37.3486, 68.6733 Hazorasp, Uzbekistan, 41.3167, 61.0667 Ware, United Kingdom, 51.8108, -0.0314 Diallassagou, Mali, 13.7378, -3.6264 Xinhua, China, 37.8291, 102.5986 Hala, China, 26.8167, 103.9833 Ibirataia, Brazil, -14.0669, -39.6408 Arilje, Serbia, 43.7531, 20.0956 Bogazliyan, Turkey, 39.1942, 35.2472 Tocaima, Colombia, 4.5000, -74.6667 Meylan, France, 45.2092, 5.7800 Ban Bang Rin, Thailand, 9.9531, 98.6342 Alzenau in Unterfranken, Germany, 50.0667, 9.0667 Taft, Philippines, 11.9058, 125.4181 Weirton, United States, 40.4060, -80.5671 Jwaneng, Botswana, -24.6017, 24.7281 La Nucia, Spain, 38.6172, -0.1231 Terra Santa, Brazil, -2.1039, -56.4869 Kralupy nad Vltavou, Czechia, 50.2408, 14.3067 Itajuipe, Brazil, -14.6778, -39.3750 Owego, United States, 42.0881, -76.1905 Sompeta, India, 18.9300, 84.6000 Corbetta, Italy, 45.4667, 8.9167 Ban Bo Haeo, Thailand, 18.3048, 99.4657 Uetersen, Germany, 53.6872, 9.6692 Heerde, Netherlands, 52.3833, 6.0333 Clive, United States, 41.6147, -93.7980 Antotohazo, Madagascar, -18.4600, 47.0800 Madeley, United Kingdom, 52.6370, -2.4480 Triolet, Mauritius, -20.0500, 57.5500 Camrose, Canada, 53.0167, -112.8333 Kabala, Sierra Leone, 9.5878, -11.5517 Zlotow, Poland, 53.3603, 17.0408 Maranchi, India, 25.3544, 85.9919 Presidente Olegario, Brazil, -18.4178, -46.4178 Donihue, Chile, -34.2261, -70.9650 Laukaa, Finland, 62.4167, 25.9500 Villa Rica, Colombia, 2.5167, -76.8500 San Celoni, Spain, 41.6900, 2.4900 Ayyampettai, India, 10.8971, 79.1915 Birnagar, India, 25.9785, 87.1110 Wisconsin Rapids, United States, 44.3927, -89.8265 Retiro, Chile, -36.0333, -71.7667 Bergeijk, Netherlands, 51.3203, 5.3592 San Juan Ermita, Guatemala, 14.7667, -89.4333 Nanthankulam, India, 8.3331, 77.8442 Kurumbapalaiyam, India, 11.1053, 76.9217 Rutherford, United States, 40.8203, -74.1057 Koporo-Kenie-na, Mali, 14.1308, -3.3539 Kiliia, Ukraine, 45.4500, 29.2667 Altonia, Brazil, -23.8739, -53.9019 Harihans, India, 26.1457, 84.3476 Elizabeth City, United States, 36.2942, -76.2360 Hatfield, United States, 40.2758, -75.2895 Melmuri, India, 11.1806, 76.0167 San Lorenzo de El Escorial, Spain, 40.5936, -4.1428 Los Lagos, Chile, -39.8500, -72.8333 San Rafael La Independencia, Guatemala, 15.7167, -91.5333 Adliswil, Switzerland, 47.3122, 8.5256 Schlieren, Switzerland, 47.3989, 8.4497 Sendamaram, India, 9.0648, 77.4369 Paglat, Philippines, 6.7811, 124.7849 Gunri, India, 25.6509, 84.6233 Guadix, Spain, 37.3006, -3.1350 Gorele, Turkey, 41.0333, 39.0000 Eragny, France, 49.0181, 2.0922 Ozorkow, Poland, 51.9667, 19.2833 Thomasville, United States, 30.8394, -83.9782 Fuente-Alamo de Murcia, Spain, 37.7394, -1.1881 Marshfield, United States, 44.6627, -90.1728 Junin de los Andes, Argentina, -39.9167, -71.0667 Tlalnelhuayocan, Mexico, 19.5667, -96.9667 Kljuc, Bosnia and Herzegovina, 44.5333, 16.7667 Ottawa, United States, 41.3555, -88.8261 Snina, Slovakia, 48.9881, 22.1567 Dhariwal, India, 31.9500, 75.3200 Aroeiras, Brazil, -7.5450, -35.7078 Salamina, Colombia, 5.4083, -75.4900 Hednesford, United Kingdom, 52.7115, -2.0006 Vadakkangara, India, 11.0000, 76.1583 Choghadak, Iran, 28.9858, 51.0392 Djidian, Mali, 13.2014, -9.4572 Midlothian, United States, 37.4856, -77.6522 Peduasi, Ghana, 5.8065, -0.1847 Aburi, Ghana, 5.8472, -0.1775 Abong Mbang, Cameroon, 3.9833, 13.1667 Qo'shko'pir, Uzbekistan, 41.5333, 60.3500 Lupeni, Romania, 45.3603, 23.2383 Tyele, Mali, 12.3036, -7.5658 Hopkins, United States, 44.9259, -93.4056 Tsivory, Madagascar, -24.0727, 46.0793 Balilihan, Philippines, 9.7500, 123.9700 Ashland, United States, 42.2573, -71.4687 Qaryat al Qi`an, Libya, 32.0167, 11.5000 Country Walk, United States, 25.6330, -80.4353 Valle, Ecuador, -2.9500, -78.9833 Nefas Mewch'a, Ethiopia, 11.7333, 38.4667 Perunturuttu, India, 9.6333, 76.5667 Ocean Acres, United States, 39.7430, -74.2805 Anderanboukan, Mali, 15.4275, 3.0175 Areia Branca, Brazil, -10.7578, -37.3153 Majdanpek, Serbia, 44.4167, 21.9333 Steiner Ranch, United States, 30.3654, -97.8960 Middelburg, South Africa, -31.4939, 25.0172 Matteson, United States, 41.5095, -87.7468 Riom, France, 45.8944, 3.1133 Ceglie Messapico, Italy, 40.6500, 17.5167 Zapote, Costa Rica, 9.9203, -84.0592 Alfeld, Germany, 51.9886, 9.8269 Leicester, Sierra Leone, 8.4604, -13.2192 Kinzau-Vuete, Congo (Kinshasa), -5.4967, 13.2893 Doura, Guinea, 12.0167, -9.0167 Togba, Benin, 7.1000, 1.6667 Afranio, Brazil, -8.5000, -41.0000 Sao Raimundo das Mangabeiras, Brazil, -7.0219, -45.4808 Mansa Konko, Gambia, The, 13.4667, -15.5500 Blooming Grove, United States, 41.3948, -74.1840 Sonhauli, India, 25.5108, 86.4707 Altus, United States, 34.6565, -99.3061 Maryland City, United States, 39.1016, -76.8051 Lakhna, India, 25.4532, 85.1431 Almel, India, 16.9200, 76.2400 Rishivandiyam, India, 11.8170, 79.1000 Tarifa, Spain, 36.0140, -5.6060 Lelydorp, Suriname, 5.6967, -55.2167 Schwalmstadt, Germany, 50.9333, 9.2167 Meerssen, Netherlands, 50.8858, 5.7519 Jasidih, India, 24.5138, 86.6458 Broughty Ferry, United Kingdom, 56.4672, -2.8699 Samma, Jordan, 32.5700, 35.6900 Kavalerovo, Russia, 44.2702, 135.0498 Glinde, Germany, 53.5406, 10.2111 Siyazan, Azerbaijan, 41.0783, 49.1061 Renningen, Germany, 48.7661, 8.9347 Soalkuchi, India, 26.2833, 91.9500 Molakalumuru, India, 14.7178, 76.7468 Andrychow, Poland, 49.8550, 19.3414 Selwyn, Canada, 44.4167, -78.3333 Elumalai, India, 9.8650, 77.6992 Cambridge, New Zealand, -37.8833, 175.4667 Alsip, United States, 41.6701, -87.7368 San Julian, El Salvador, 13.6976, -89.5596 Villaquilambre, Spain, 42.6167, -5.6000 Laualagaon, India, 25.4940, 87.0412 Khamir, Yemen, 15.9889, 43.9589 Carnaiba, Brazil, -7.8050, -37.7939 Ras el Ma, Algeria, 34.4974, -0.8195 Kangazha, India, 9.5500, 76.7180 Telwa, India, 25.8796, 86.3837 Adria, Italy, 45.0500, 12.0500 Creve Coeur, United States, 38.6620, -90.4430 Aldama, Mexico, 28.8386, -105.9111 Futog, Serbia, 45.2333, 19.7167 Basatpur, India, 26.0011, 85.0643 Mukkanur, India, 10.2405, 76.4162 Enkhuizen, Netherlands, 52.7000, 5.3000 Kilmangalam, India, 10.0933, 77.6108 Bonanza, Nicaragua, 14.0167, -84.5833 Manikkal, India, 8.6544, 76.9090 Lede, Belgium, 50.9667, 3.9833 Ribeirao Branco, Brazil, -24.2208, -48.7658 Chakur, India, 18.5131, 76.8753 Manakayi, India, 11.8611, 75.5625 Ubaira, Brazil, -13.2678, -39.6628 Sanharo, Brazil, -8.3608, -36.5658 Vellmar, Germany, 51.3500, 9.4667 Bergneustadt, Germany, 51.0333, 7.6500 Ballincollig, Ireland, 51.8833, -8.5833 Londerzeel, Belgium, 51.0000, 4.3000 Seara, Brazil, -27.1489, -52.3108 Pastavy, Belarus, 55.1167, 26.8333 Vanino, Russia, 49.0873, 140.2425 Medjedel, Algeria, 35.1500, 3.6833 Carlos Chagas, Brazil, -17.7028, -40.7658 Volketswil, Switzerland, 47.3906, 8.6953 Tillsonburg, Canada, 42.8667, -80.7333 Onga, Japan, 33.8478, 130.6683 Mullach Ide, Ireland, 53.4508, -6.1544 Stannington, United Kingdom, 53.3960, -1.5360 Reriutaba, Brazil, -4.1419, -40.5819 Nea Erythraia, Greece, 38.0833, 23.8167 Nelidovo, Russia, 56.2167, 32.8000 Ajnala, India, 31.8400, 74.7600 Corinto, Nicaragua, 12.4833, -87.1833 Qutan, China, 36.3537, 102.2970 Sao Gabriel, Brazil, -11.2289, -41.9119 Saylac, Somalia, 11.3539, 43.4731 Toshloq, Uzbekistan, 40.4808, 71.7608 Leposaviq, Kosovo, 43.1039, 20.8028 Miyatoko, Japan, 33.6992, 130.9203 San Miguel, Philippines, 14.6000, 121.0000 Timoktene, Algeria, 27.0217, 1.0150 Kalugumalai, India, 9.1494, 77.7057 Antombana, Madagascar, -14.9927, 50.1695 Majhua, India, 26.0140, 87.3018 Valavanur, India, 11.9205, 79.5785 Round Lake, United States, 42.3435, -88.1059 Al Jawf, Libya, 24.2167, 23.3000 Huercal de Almeria, Spain, 36.8833, -2.4333 Sebikhotane, Senegal, 14.7428, -17.1419 Jalakandapuram, India, 11.6986, 77.8776 San Mauro Torinese, Italy, 45.1039, 7.7536 Skara, Sweden, 58.3667, 13.4167 Hem, France, 50.6558, 3.1886 Shika, Japan, 37.0062, 136.7780 Illertissen, Germany, 48.2167, 10.0833 Rhynern, Germany, 51.6299, 7.8581 Arcata, United States, 40.8615, -124.0758 Mohana, India, 25.9027, 77.7715 Liuma, China, 25.6682, 105.8732 Bensenville, United States, 41.9579, -87.9442 Liancourt, Haiti, 19.1247, -72.5371 Narangba, Australia, -27.2022, 152.9591 Kasongan, Indonesia, -1.8959, 113.3878 Kronberg, Germany, 50.1833, 8.5000 Bougtob, Algeria, 34.0425, 0.0892 Tomaszow Lubelski, Poland, 50.4500, 23.4167 Miracema do Tocantins, Brazil, -9.5669, -48.3919 Paluan, Philippines, 13.4200, 120.4700 San Sebastian Salitrillo, El Salvador, 13.9500, -89.6333 Erumakkuzhi, India, 9.2833, 76.5500 Zhosaly, Kazakhstan, 45.4893, 64.0915 Pizarro, Colombia, 4.9500, -77.3667 Bhadaur, India, 30.4764, 75.3306 Ocean Springs, United States, 30.4082, -88.7861 Ebbw Vale, United Kingdom, 51.7800, -3.2100 Coronado, United States, 32.6649, -117.1604 Hoppegarten, Germany, 52.5167, 13.6667 Hessisch Oldendorf, Germany, 52.1667, 9.2500 Boom, Belgium, 51.0833, 4.3667 Mingjiujie, China, 23.4561, 103.6506 Leteri, India, 24.0598, 77.4086 Morros, Brazil, -2.8639, -44.0389 Miracatu, Brazil, -24.2808, -47.4600 Zakiyah, Syria, 33.3341, 36.1588 Lessines, Belgium, 50.7167, 3.8333 Matipo, Brazil, -20.2839, -42.3408 Kumbhraj, India, 24.3734, 77.0484 Santa Brigida, Spain, 28.0338, -15.4998 Mennzel Bou Zelfa, Tunisia, 36.6817, 10.5847 Wheatfield, United States, 43.0975, -78.8831 Mellacheruvu, India, 16.8173, 79.9331 Shaogang, China, 38.1583, 106.0661 Ban Mae Kha Tai, Thailand, 18.7352, 98.9678 Ban Mae Hia Nai, Thailand, 18.7433, 98.9640 Orhaneli, Turkey, 39.9028, 28.9875 Tarrega, Spain, 41.6469, 1.1392 Konz, Germany, 49.7000, 6.5833 Kothia, India, 25.7612, 84.8811 Ait Majdane, Morocco, 31.8514, -6.9658 Preakness, United States, 40.9382, -74.2242 Morro da Fumaca, Brazil, -28.6508, -49.2100 Lahnstein, Germany, 50.3011, 7.6056 Kulu, India, 31.9500, 77.1100 Colina, Brazil, -20.7136, -48.5411 San Diego, Colombia, 10.3375, -73.1825 Stabroek, Belgium, 51.3333, 4.3667 Santander, Philippines, 9.4500, 123.3300 Ba, Fiji, -17.5333, 177.6833 Rohar, India, 25.9917, 86.2366 Sokolow Podlaski, Poland, 52.4067, 22.2464 Goffstown, United States, 43.0190, -71.5680 Thalwil, Switzerland, 47.2953, 8.5647 Asuncion Nochixtlan, Mexico, 17.4500, -97.2167 Lodhwe, India, 24.6404, 85.2913 Foxborough, United States, 42.0627, -71.2461 Tessenderlo, Belgium, 51.0679, 5.0891 Guanzhai, China, 26.2697, 105.3089 Kharabali, Russia, 47.4050, 47.2556 Santa Cruz Zenzontepec, Mexico, 16.5333, -97.5000 Bilar, Philippines, 9.7000, 124.1000 Franklin Farm, United States, 38.9133, -77.3969 Galhinna, Sri Lanka, 7.4162, 80.5639 Tadikonda, India, 16.4167, 80.4542 Madre de Deus, Brazil, -12.7408, -38.6208 Anicuns, Brazil, -16.4608, -49.9619 Tatsuno, Japan, 35.9824, 137.9876 Palaiyampatti, India, 9.5392, 78.0984 Barentu, Eritrea, 15.1167, 37.6000 Appley Bridge, United Kingdom, 53.5790, -2.7210 Hassleholm, Sweden, 56.1568, 13.7702 Buikwe, Uganda, 0.3442, 33.0300 Moissy-Cramayel, France, 48.6269, 2.5931 Rawmarsh, United Kingdom, 53.4636, -1.3439 Ghedi, Italy, 45.4020, 10.2803 Kirovgrad, Russia, 57.4350, 60.0561 Potirendaba, Brazil, -21.0428, -49.3769 Vechelde, Germany, 52.2608, 10.3720 Ammon, United States, 43.4745, -111.9568 Rhaude, Germany, 53.1667, 7.5500 Bitkine, Chad, 11.9817, 18.2125 Seabrook, United States, 38.9802, -76.8502 Misato, Japan, 39.4211, 140.5439 Panama City Beach, United States, 30.2370, -85.8776 Kalynivka, Ukraine, 49.4472, 28.5231 Oxon Hill, United States, 38.7884, -76.9727 Chubek, Tajikistan, 37.6167, 69.7000 Busovaca, Bosnia and Herzegovina, 44.0978, 17.8783 Glenvar Heights, United States, 25.7090, -80.3155 Gelligaer, United Kingdom, 51.6667, -3.2500 Staines-upon-Thames, United Kingdom, 51.4340, -0.5110 Unquillo, Argentina, -31.2333, -64.3167 Zagarolo, Italy, 41.8333, 12.8333 Pinas, Ecuador, -3.6806, -79.6806 Fatima, Brazil, -10.6000, -38.2169 Crimmitschau, Germany, 50.8181, 12.3875 Castaic, United States, 34.4818, -118.6316 Sirvel, India, 15.3170, 78.5330 Sharon, United States, 42.1085, -71.1830 Fushe-Kruje, Albania, 41.4833, 19.7167 Kherameh, Iran, 29.4992, 53.3131 Ajaigarh, India, 24.8988, 80.2592 Tinoc, Philippines, 16.6750, 120.9367 Giszowiec, Poland, 50.2236, 19.0694 Nederland, United States, 29.9707, -94.0015 Tirmalgiri, India, 17.4746, 79.4361 Qasr-e Shirin, Iran, 34.5117, 45.5792 Chernogolovka, Russia, 56.0000, 38.3667 Zephyrhills, United States, 28.2409, -82.1797 Bedlington, United Kingdom, 55.1330, -1.5830 Sacavem, Portugal, 38.7944, -9.1053 Alcantara, Brazil, -2.4089, -44.4150 El Astillero, Spain, 43.4017, -3.8194 Cognac, France, 45.7000, -0.3300 Hostomel, Ukraine, 50.5692, 30.2653 Taft, Iran, 31.7494, 54.2089 Castel Maggiore, Italy, 44.5778, 11.3617 Catak, Turkey, 38.0086, 43.0597 Kotancheri, India, 11.4719, 75.9690 Kunitomi, Japan, 31.9906, 131.3236 North Decatur, United States, 33.8074, -84.2889 Greene, United States, 39.9543, -77.5668 Pio IX, Brazil, -6.8375, -40.5792 Kannapuram, India, 11.9691, 75.3208 Osku, Iran, 37.9161, 46.1244 Nara, Mali, 15.1800, -7.2800 Lagoa da Canoa, Brazil, -9.8300, -36.7378 Sarikaya, Turkey, 39.4936, 35.3769 Centralia, United States, 46.7223, -122.9696 Od, India, 22.6219, 73.1161 Kariyapatti, India, 9.6741, 78.1007 Mill Hill, United Kingdom, 51.6200, -0.2300 Matelandia, Brazil, -25.2408, -53.9958 Fort Carson, United States, 38.7095, -104.7720 Shimokodanaka, Japan, 35.6616, 139.6666 Ngolonianasso, Mali, 12.4269, -5.6831 Narlica, Turkey, 36.2333, 36.2167 Coalcoman de Vasquez Pallares Uno, Mexico, 18.6442, -103.1267 Coalcoman de Vazquez Pallares, Mexico, 18.7833, -103.1667 Lodeynoye Pole, Russia, 60.7167, 33.5500 Newburyport, United States, 42.8124, -70.8878 Haaltert, Belgium, 50.9000, 4.0000 Newton, United States, 38.0368, -97.3449 Achocalla, Bolivia, -16.5833, -68.1667 Kassaro, Mali, 12.9517, -8.8781 Jucuapa, El Salvador, 13.5167, -88.3833 Hellemmes-Lille, France, 50.6167, 3.1167 Fairwood, United States, 47.4467, -122.1430 Zhangshicun, China, 24.5477, 113.5240 Baena, Spain, 37.6167, -4.3167 Choi Hung, Hong Kong, 22.3350, 114.2067 Astrea, Colombia, 9.5000, -73.9833 Dumjor, India, 22.6400, 88.2200 Baliangao, Philippines, 8.6700, 123.6000 Ponedera, Colombia, 10.6500, -74.7500 Staveley, United Kingdom, 53.2694, -1.3484 Khotyn, Ukraine, 48.5069, 26.4903 Mukkudal, India, 8.7431, 77.5225 Dover, United States, 40.8859, -74.5597 Sudley, United States, 38.7878, -77.4961 Montrouis, Haiti, 18.9511, -72.7057 Castelfidardo, Italy, 43.4642, 13.5461 Loreto, Paraguay, -23.2747, -57.3269 San Vicente Pacaya, Guatemala, 14.4161, -90.6392 Fatick, Senegal, 14.3167, -16.4167 Devadanappatti, India, 10.1467, 77.6439 Basse Santa Su, Gambia, The, 13.3167, -14.2167 Unhel, India, 23.3379, 75.5593 Hardinxveld-Giessendam, Netherlands, 51.8300, 4.8700 Belo Campo, Brazil, -15.0378, -41.2600 Arroyo Grande, United States, 35.1241, -120.5845 Pomaz, Hungary, 47.6472, 19.0269 El Alia, Tunisia, 37.1667, 10.0333 Tordera, Spain, 41.7008, 2.7200 Tilothu, India, 24.8051, 84.0833 San Blas Atempa, Mexico, 16.3167, -95.2167 Worth am Rhein, Germany, 49.0517, 8.2603 Vlotho, Germany, 52.1667, 8.8497 Quitandinha, Brazil, -25.8719, -49.4978 Kumarapuram, India, 8.2922, 77.3215 Szamotuly, Poland, 52.6000, 16.5833 Santa Marinella, Italy, 42.0333, 11.8500 Langen, Germany, 53.6167, 8.5833 Srikhanda, India, 23.5981, 88.0799 Tallmadge, United States, 41.1023, -81.4216 Inhapi, Brazil, -9.2214, -37.7486 East Goshen, United States, 39.9934, -75.5478 Aragarcas, Brazil, -15.8978, -52.2508 Tinajeros, Philippines, 14.6733, 120.9690 Longjia, China, 19.1487, 110.3209 Oconomowoc, United States, 43.0996, -88.4948 Rio Maria, Brazil, -7.3108, -50.0478 Bhawanipur, India, 26.4361, 84.7356 Itapororoca, Brazil, -6.8300, -35.2469 Pornic, France, 47.1167, -2.1000 Sanpaicun, China, 34.8000, 104.3167 Bracciano, Italy, 42.1000, 12.1833 Albert Lea, United States, 43.6548, -93.3643 Walcourt, Belgium, 50.2534, 4.4347 Straseni, Moldova, 47.1414, 28.6103 Cesario Lange, Brazil, -23.2267, -47.9531 North Aurora, United States, 41.8086, -88.3414 Bellwood, United States, 41.8829, -87.8762 Cuautitlan, Mexico, 19.4522, -104.3583 Clonmel, Ireland, 52.3550, -7.7039 Qatlupur, India, 28.7733, 77.1593 Mumford, Ghana, 5.2618, -0.7590 Ronkonkoma, United States, 40.8037, -73.1246 Agarpur, India, 25.1957, 87.0423 Filomeno Mata, Mexico, 20.2000, -97.7000 Baependi, Brazil, -21.9589, -44.8900 Santiago Ixcuintla, Mexico, 21.8110, -105.2079 New River, United States, 33.8835, -112.0858 Sao Benedito do Rio Preto, Brazil, -3.3339, -43.5278 Chateauneuf-les-Martigues, France, 43.3838, 5.1650 Olten, Switzerland, 47.3531, 7.9078 Noci, Italy, 40.8000, 17.1333 Chhoti Sadri, India, 24.3800, 74.7000 Novyy Oskol, Russia, 50.7583, 37.8736 Brook Park, United States, 41.4036, -81.8219 Krasyliv, Ukraine, 49.6519, 26.9706 Porto Real do Colegio, Brazil, -10.1858, -36.8400 Campo de la Cruz, Colombia, 10.3778, -74.8814 Stekene, Belgium, 51.2000, 4.0333 San Rafael Pie de la Cuesta, Guatemala, 14.9333, -91.9167 Cagdianao, Philippines, 9.9200, 125.6700 Ferguson, United States, 38.7490, -90.2950 Saladas, Argentina, -28.2500, -58.6167 Ammapettai, India, 10.7948, 79.3199 Louviers, France, 49.2200, 1.1700 Almondbury, United Kingdom, 53.6344, -1.7489 Nari Bhadaun, India, 26.0065, 86.2509 Buenavista, Colombia, 8.6805, -75.2554 Cortes, Philippines, 9.7200, 123.8800 Sendarappatti, India, 11.4373, 78.5215 Mineros, Bolivia, -17.1178, -63.2331 Bonneuil-sur-Marne, France, 48.7742, 2.4875 Mirante do Paranapanema, Brazil, -22.2919, -51.9064 Capoeiras, Brazil, -8.7350, -36.6269 Daryabad, India, 26.8922, 81.5556 Caldas de Montbuy, Spain, 41.6292, 2.1694 Pembroke, United States, 42.0655, -70.8014 Xintian, China, 23.2845, 103.4920 Picui, Brazil, -6.5550, -36.3489 Anandpur, India, 31.2393, 76.5025 Novopavlovka, Kyrgyzstan, 42.8700, 74.4800 Rizal, Philippines, 14.1083, 121.3917 Szigethalom, Hungary, 47.3228, 19.0128 Cran-Gevrier, France, 45.9097, 6.1107 Berea, United States, 41.3696, -81.8641 Memuro-minami, Japan, 42.9167, 143.0500 Sandare, Mali, 14.7000, -10.3000 South Fayette, United States, 40.3556, -80.1617 Shaoyu, China, 34.0641, 105.3651 Nuuk, Greenland, 64.1767, -51.7361 Skydra, Greece, 40.7667, 22.1500 Bayshore Gardens, United States, 27.4345, -82.5793 Karuppur, India, 11.7170, 78.0924 Pathum Thani, Thailand, 14.0500, 100.4833 Tha Bo, Thailand, 17.8500, 102.5814 Melzo, Italy, 45.5000, 9.4167 San Jose Tenango, Mexico, 18.1500, -96.7333 Plymouth, United States, 40.1115, -75.2976 Talata-Volonondry, Madagascar, -18.7501, 47.6435 Riachao do Dantas, Brazil, -11.0689, -37.7250 Pully, Switzerland, 46.5167, 6.6667 Faches-Thumesnil, France, 50.5994, 3.0744 Cherial, India, 17.9264, 78.9719 Pontalina, Brazil, -17.5258, -49.4489 Morretes, Brazil, -25.4769, -48.8339 Gerd Faramarz Shahediyeh, Iran, 31.9417, 54.2677 Abrandabad-e Shahediyeh, Iran, 31.9383, 54.2786 Kitagata, Japan, 35.4333, 136.6833 Nossombougou, Mali, 13.0967, -7.9342 Nehbandan, Iran, 31.5411, 60.0397 Mangualde, Portugal, 40.6058, -7.7658 Fairmont, United States, 39.4768, -80.1491 Belem de Sao Francisco, Brazil, -8.7578, -38.9639 Niles, United States, 41.1879, -80.7531 Hadleigh, United Kingdom, 51.5535, 0.6095 Do'stlik Shahri, Uzbekistan, 40.5247, 68.0358 South Orange Village, United States, 40.7491, -74.2602 Sint-Genesius-Rode, Belgium, 50.7500, 4.3500 Chennevieres-sur-Marne, France, 48.7983, 2.5339 Ommen, Netherlands, 52.5167, 6.4167 Volochysk, Ukraine, 49.5333, 26.1667 Colonia, United States, 40.5926, -74.3148 Rutigliano, Italy, 40.9969, 17.0069 Aveiro, Brazil, -3.6058, -55.3319 Bischheim, France, 48.6144, 7.7528 Taung, South Africa, -27.5625, 24.7481 Lake Ronkonkoma, United States, 40.8297, -73.1128 Sakoueba, Mali, 13.3117, -6.2797 Lenoir, United States, 35.9094, -81.5249 Navraftor, Tajikistan, 37.7333, 68.7667 East St. Louis, United States, 38.6155, -90.1304 Fomboni, Comoros, -12.2800, 43.7425 Santa Fe, Philippines, 16.1592, 120.9378 Paraibano, Brazil, -6.4328, -43.9839 Rampur, India, 26.4424, 89.8038 Syosset, United States, 40.8157, -73.5020 Mannara, India, 8.5614, 77.1263 Kristiansund, Norway, 63.1105, 7.7279 Hampton, United States, 40.5844, -79.9534 Rosendael, France, 51.0413, 2.4037 Bni Bouayach, Morocco, 35.1051, -3.8403 Parchim, Germany, 53.4167, 11.8333 Karcag, Hungary, 47.3167, 20.9333 Kasba Maker, India, 25.9591, 85.0316 Jussara, Brazil, -15.8650, -50.8678 Paraibuna, Brazil, -23.3861, -45.6622 Lake Shore, United States, 39.1030, -76.4876 Yupiltepeque, Guatemala, 14.2000, -89.7833 Siloe, Lesotho, -29.9836, 27.2792 Shenandoah, United States, 30.4019, -91.0020 Sahel, Morocco, 34.9667, -4.5500 Luz, Brazil, -19.8008, -45.6858 Ban Mai, Thailand, 14.9658, 102.0205 Monte Cristo, Argentina, -31.3431, -63.9444 Regensdorf, Switzerland, 47.4383, 8.4744 Fanipal', Belarus, 53.7500, 27.3333 Yoichi, Japan, 43.2000, 140.7833 San Carlos Park, United States, 26.4765, -81.8193 Ansfelden, Austria, 48.2083, 14.2889 Mulanur, India, 10.7943, 77.7115 Shuangluan, China, 40.9611, 117.7962 Asakapalle, India, 17.7364, 83.3000 Mathurapur, India, 25.5112, 86.4557 Somerset, United States, 41.7404, -71.1612 Shaw, United Kingdom, 53.5783, -2.0951 Pisz, Poland, 53.6167, 21.8000 Johnstown, United States, 40.3260, -78.9194 Puttlingen, Germany, 49.2833, 6.8833 Narayankher, India, 18.0333, 77.7833 Plast, Russia, 54.3833, 60.8167 Sycamore, United States, 41.9957, -88.6821 Monforte de Lemos, Spain, 42.5164, -7.5161 Trenton, United States, 42.1394, -83.1929 Sivandipuram, India, 8.7811, 77.3428 Santa Iria da Azoia, Portugal, 38.8464, -9.0881 Bonen, Germany, 51.5986, 7.7592 Carrigaline, Ireland, 51.8117, -8.3986 Had Zraqtane, Morocco, 31.4500, -7.4000 Comodoro, Brazil, -13.6593, -59.7941 Kanp, India, 25.8337, 86.7402 Harnosand, Sweden, 62.6323, 17.9379 Calera de Tango, Chile, -33.6302, -70.7616 Priozersk, Russia, 61.0500, 30.1333 Fulwood, United Kingdom, 53.3650, -1.5440 Franklin Park, United States, 41.9361, -87.8794 Antanambao, Madagascar, -15.1669, 50.3612 Malaga, Colombia, 6.7833, -72.6667 Thala, Tunisia, 35.5667, 8.6667 Eski-Nookat, Kyrgyzstan, 40.2713, 72.6131 Mount Washington, United States, 38.0430, -85.5551 Kottukal, India, 8.8833, 76.9000 Surovikino, Russia, 48.6000, 42.8500 Julio de Castilhos, Brazil, -29.2269, -53.6819 Manga, Brazil, -14.7558, -43.9322 Budrio, Italy, 44.5374, 11.5344 Concord, United States, 42.4620, -71.3639 Galaat el Andeless, Tunisia, 37.0625, 10.1183 Dolynska, Ukraine, 48.1111, 32.7647 Mahiari, India, 22.5900, 88.2400 Sveta Nedjelja, Croatia, 45.8000, 15.7833 Baixa Grande, Brazil, -11.9600, -40.1678 Bronte, Italy, 37.8000, 14.8333 Semdinli, Turkey, 37.3080, 44.5710 Pijijiapan, Mexico, 15.6833, -93.2167 Zielonka, Poland, 52.3008, 21.1586 Bani Hasan ash Shuruq, Egypt, 27.9314, 30.8753 Taqah, Oman, 17.0483, 54.3906 Shorewood, United States, 41.5169, -88.2146 Nazare Paulista, Brazil, -23.1808, -46.3950 Farias Brito, Brazil, -6.9308, -39.5658 Bettioua, Algeria, 35.8000, -0.2667 Taku, Japan, 33.2886, 130.1103 Gameleira, Brazil, -8.5844, -35.3867 Sipacate, Guatemala, 13.9333, -91.1500 Stillorgan, Ireland, 53.2888, -6.1958 Tirunageswaram, India, 10.9646, 79.4293 Sahna, India, 30.4293, 75.3813 Gaocun, China, 39.6197, 116.8861 Filadelfia, Paraguay, -22.3400, -60.0300 Colonial Heights, United States, 37.2650, -77.3969 Sikhio, Thailand, 14.9000, 101.7167 Nigran, Spain, 42.1419, -8.8056 North Babylon, United States, 40.7314, -73.3248 Serrita, Brazil, -7.9328, -39.2958 Blindio, Mali, 11.6183, -6.3428 Bogotol, Russia, 56.2000, 89.5167 Amaraji, Brazil, -8.3758, -35.4522 Kudatini, India, 15.1500, 76.9200 Dagana, Senegal, 16.4833, -15.6000 Budhni, India, 22.7825, 77.6820 Kishi, Japan, 35.3333, 139.1333 Shaying, China, 25.9667, 105.3667 Buchen in Odenwald, Germany, 49.5217, 9.3233 Konskie, Poland, 51.2000, 20.4167 Santiago de Maria, El Salvador, 13.4833, -88.4667 Bet She'an, Israel, 32.5000, 35.5000 Schrobenhausen, Germany, 48.5333, 11.2667 Woodmere, United States, 40.6375, -73.7219 Ranquitte, Haiti, 19.4133, -72.0808 Kiangara, Madagascar, -17.9717, 47.0299 Concord, United States, 39.8741, -75.5135 Griffith, Australia, -34.2900, 146.0400 Bideford, United Kingdom, 51.0160, -4.2090 Udaipura, India, 23.0743, 78.5111 Gorham, United States, 43.7034, -70.4581 Pelham, Canada, 43.0333, -79.3333 Lora del Rio, Spain, 37.6500, -5.5167 Manchester, United States, 38.5830, -90.5064 Bedesa, Ethiopia, 8.9000, 40.7833 Sarvestan, Iran, 29.2739, 53.2203 `Anbarabad, Iran, 28.4794, 57.8414 Spanish Lake, United States, 38.7884, -90.2077 Rikuzen-Takata, Japan, 39.0280, 141.6254 Oyama, Japan, 35.3601, 138.9873 Laurel, United States, 37.6375, -77.5062 Solonopole, Brazil, -5.7328, -39.0078 Dapi, Taiwan, 23.6494, 120.4254 Washington, United States, 40.7877, -74.7918 Quibaxi, Angola, -8.5000, 14.5833 Taufkirchen, Germany, 48.0500, 11.6167 Aldo Bonzi, Argentina, -34.7083, -58.5181 Mohiuddinnagar, India, 25.5737, 85.6694 Warminster, United Kingdom, 51.2050, -2.1810 North Druid Hills, United States, 33.8185, -84.3254 Gossau, Switzerland, 47.4164, 9.2500 Vredendal, South Africa, -31.6644, 18.5061 Bluffdale, United States, 40.4744, -111.9381 Kadan, Czechia, 50.3761, 13.2714 Tummalapenta, India, 14.8997, 80.0687 Bhadrapur, Nepal, 26.5419, 88.0944 Meishan, Taiwan, 23.5607, 120.6296 Redhill, United Kingdom, 51.2393, -0.1726 Laives, Italy, 46.4228, 11.3348 Amsterdam, United States, 42.9420, -74.1906 Kottapalle, India, 17.2918, 81.8939 Asane, Norway, 60.4744, 5.3250 Petawawa, Canada, 45.9000, -77.2833 Heusweiler, Germany, 49.3500, 6.9167 Zinvie, Benin, 6.6167, 2.3500 Xochiatipan de Castillo, Mexico, 20.8333, -98.2850 Qishe, China, 24.9167, 104.7833 El Achir, Algeria, 36.0667, 4.6333 Heckmondwike, United Kingdom, 53.7080, -1.6700 Lavasan, Iran, 35.8208, 51.6342 Nyandoma, Russia, 61.6667, 40.2167 Inga, Brazil, -7.2808, -35.6044 San Antonio del Golfo, Venezuela, 10.4333, -63.7833 Steubenville, United States, 40.3653, -80.6519 Riacho das Almas, Brazil, -8.1339, -35.6892 Trujillo, Colombia, 4.2500, -76.3333 Franconia, United States, 38.7682, -77.1587 Citluk, Bosnia and Herzegovina, 43.2286, 17.7008 Piatykhatky, Ukraine, 48.4136, 33.7028 Palos Hills, United States, 41.6986, -87.8266 Frankenberg, Germany, 51.0589, 8.7967 Minamishibetsucho, Japan, 43.1758, 142.4000 Pinecrest, United States, 25.6650, -80.3042 Pinabacdao, Philippines, 11.6200, 124.9800 Yoshimi, Japan, 36.0399, 139.4538 Palanga, Lithuania, 55.9167, 21.0667 Una, Brazil, -15.2928, -39.0750 Southeast, United States, 41.4032, -73.5985 Gangwuzhen, China, 25.9667, 105.3333 Tominian, Mali, 13.2875, -4.5933 Menasha, United States, 44.2125, -88.4271 Svilengrad, Bulgaria, 41.7670, 26.2000 Beerse, Belgium, 51.3191, 4.8555 San Pedro, Colombia, 4.0000, -76.2292 Sigmaringen, Germany, 48.0869, 9.2167 Sangre Grande, Trinidad and Tobago, 10.5667, -61.1333 Dumri, India, 25.5356, 85.5996 Jora Khurd, India, 26.4893, 77.9758 Colonial Park, United States, 40.2987, -76.8069 Bagnols-sur-Ceze, France, 44.1623, 4.6193 Ouankoro, Mali, 13.3822, -3.8308 Cirie, Italy, 45.2353, 7.6003 Itacare, Brazil, -14.2778, -38.9969 Pottanur, India, 11.1098, 77.9888 Feyzabad, Iran, 35.0183, 58.7839 Terra Roxa d'Oeste, Brazil, -24.1667, -54.0833 Barhampur, India, 25.5976, 84.3011 White Settlement, United States, 32.7554, -97.4605 Ambiula, Angola, -7.4333, 14.6500 Raisari, India, 26.1319, 87.0238 Kreminna, Ukraine, 49.0500, 38.2167 Coronda, Argentina, -31.9667, -60.9167 Poulton le Fylde, United Kingdom, 53.8470, -2.9950 Nea Makri, Greece, 38.0833, 23.9833 Rampur, India, 21.0735, 84.3409 Yaiza, Spain, 28.9550, -13.7667 Convencion, Colombia, 8.8333, -73.2000 Guardamar del Segura, Spain, 38.0897, -0.6550 Gandarbal, India, 34.2262, 74.7748 Polohy, Ukraine, 47.4833, 36.2500 Bazhou, China, 36.2137, 102.7618 Manikpur, India, 25.9100, 86.8210 Paharpur, India, 25.5681, 85.3763 Bourbonnais, United States, 41.1830, -87.8784 Campos Belos, Brazil, -13.0369, -46.7719 Mure, Japan, 34.3376, 134.1397 Wallingford Center, United States, 41.4499, -72.8189 Varjota, Brazil, -4.1939, -40.4769 Binh Minh, Vietnam, 10.0961, 105.7894 Sevierville, United States, 35.8872, -83.5678 Maoussa, Algeria, 35.3833, 0.2500 Pavullo nel Frignano, Italy, 44.3327, 10.8331 San Vito dei Normanni, Italy, 40.6556, 17.7036 Canby, United States, 45.2652, -122.6867 Borgo San Lorenzo, Italy, 43.9555, 11.3856 Concepcion de Ataco, El Salvador, 13.8667, -89.8500 Berkhampstead, United Kingdom, 51.7600, -0.5600 Cofradia, Honduras, 15.4168, -88.1603 Kikube, Uganda, 1.3328, 31.2075 Belterra, Brazil, -2.6358, -54.9369 Manilva, Spain, 36.3833, -5.2500 McAlester, United States, 34.9257, -95.7734 Thorne, United Kingdom, 53.6083, -0.9583 Siloam Springs, United States, 36.1844, -94.5315 Bry-sur-Marne, France, 48.8411, 2.5222 Yershov, Russia, 51.3500, 48.2667 Dolny Kubin, Slovakia, 49.2117, 19.2992 Tora, India, 21.3262, 83.6708 Chapelle, Haiti, 19.4167, -72.5500 Antonina, Brazil, -25.4289, -48.7119 Ait Tamlil, Morocco, 31.4800, -6.9400 Featherstone, United Kingdom, 53.7000, -1.3700 Burlington, United States, 39.0223, -84.7217 General Juan Madariaga, Argentina, -37.0167, -57.1333 Heguri, Japan, 34.6292, 135.7006 Brenham, United States, 30.1584, -96.3966 Calenzano, Italy, 43.8567, 11.1636 Dobrush, Belarus, 52.4167, 31.3167 Barikot, Nepal, 29.0400, 82.3300 Agua Azul do Norte, Brazil, -6.7908, -50.4669 Kopa, India, 25.8513, 84.6308 Grossenhain, Germany, 51.2833, 13.5500 Cesson-Sevigne, France, 48.1217, -1.6025 Neftegorsk, Russia, 52.8000, 51.1667 Johnstown, United States, 40.3499, -104.9482 Hendaye, France, 43.3600, -1.7700 Arajpur, India, 25.5197, 87.0808 Wandsworth, United Kingdom, 51.4550, -0.1920 Dumont, United States, 40.9452, -73.9923 Mayorga, Philippines, 10.9000, 125.0000 Soisy-sous-Montmorency, France, 48.9886, 2.3006 Ricaurte, Colombia, 1.2108, -77.9933 Kety, Poland, 49.9000, 19.2167 Pedra Preta, Brazil, -16.6228, -54.4739 Manyas, Turkey, 40.0464, 27.9700 Sao Tiago de Custoias, Portugal, 41.2069, -8.6485 Luganville, Vanuatu, -15.5333, 167.1667 Tottiyam, India, 10.9880, 78.3363 Bidestan, Iran, 36.2308, 50.1236 Kotta Kalidindi, India, 16.5032, 81.2877 Phelan, United States, 34.4398, -117.5248 Slyudyanka, Russia, 51.6567, 103.7186 Stuart, United States, 27.1959, -80.2444 Sanderao, India, 25.1800, 73.1000 Tlacoachistlahuaca, Mexico, 16.7833, -98.2000 Ambala, India, 17.6500, 79.0500 Louny, Czechia, 50.3572, 13.7969 San Vicente, Colombia, 6.2819, -75.3322 Badkulla, India, 23.3036, 88.5302 Libjo, Philippines, 10.1960, 125.5328 Myslenice, Poland, 49.8347, 19.9389 Bhambia Bhai, India, 30.4812, 75.0940 Middelharnis, Netherlands, 51.7535, 4.1647 Annakunnu, India, 11.7463, 76.0415 Pataskala, United States, 40.0110, -82.7155 Vilavur, India, 8.2669, 77.3052 Buadiposo-Buntong, Philippines, 7.9700, 124.3800 Taperoa, Brazil, -13.5378, -39.0989 Timri, India, 12.2000, 75.3861 Chodziez, Poland, 52.9833, 16.9000 Ismaning, Germany, 48.2264, 11.6725 Cohoes, United States, 42.7732, -73.7077 Halstenbek, Germany, 53.6333, 9.8667 Sunbury, United Kingdom, 51.4230, -0.4240 Carmelo, Uruguay, -34.0000, -58.2833 Abangaritos, Costa Rica, 10.2492, -85.0268 Mwanza, Malawi, -15.6167, 34.5167 North Massapequa, United States, 40.7031, -73.4678 Freilassing, Germany, 47.8333, 12.9667 Bou Izakarn, Morocco, 29.1667, -9.7333 Gainesville, United States, 38.7931, -77.6347 Cristinapolis, Brazil, -11.4756, -37.7553 San Pedro, Colombia, 8.7333, -74.7167 Targu Neamt, Romania, 47.2025, 26.3586 Porto Novo, Cabo Verde, 17.0190, -25.0640 Concord, United States, 38.5117, -90.3574 Schwechat, Austria, 48.1411, 16.4786 Destelbergen, Belgium, 51.0500, 3.8000 Gidi, India, 23.6909, 85.3641 Valenza, Italy, 45.0140, 8.6458 Piossasco, Italy, 44.9906, 7.4637 Matigou, China, 37.6043, 109.9024 Hranice, Czechia, 49.5525, 17.7683 Koratagere, India, 13.5220, 77.2373 Lakshmaneswaram, India, 16.4082, 81.6867 General Las Heras, Argentina, -34.9333, -58.9500 Bobingen, Germany, 48.2667, 10.8167 Ulao, India, 25.4165, 86.0936 Ecully, France, 45.7753, 4.7783 Banbalah, Tunisia, 35.7000, 10.8000 Itabera, Brazil, -23.8619, -49.1372 Fundao, Brazil, -19.9328, -40.4069 Beverley, United Kingdom, 53.8450, -0.4270 Jasien, Poland, 54.3667, 18.6333 New Castle, United States, 41.1841, -73.7721 Campina Verde, Brazil, -19.5358, -49.4858 Toyono, Japan, 34.9189, 135.4942 Marsciano, Italy, 42.9167, 12.3333 Marcos, Philippines, 18.0444, 120.6786 Rwamagana, Rwanda, -1.9525, 30.4378 Patiriyat, India, 11.8425, 75.5094 Scarsdale, United States, 40.9902, -73.7773 Biro, Benin, 9.9000, 2.9333 Sakri, India, 26.2197, 86.0853 Qal`ah-ye Zal, Afghanistan, 37.0150, 68.4672 General Deheza, Argentina, -32.7564, -63.7889 Al Hamalah, Bahrain, 26.1497, 50.4653 Ad Diraz, Bahrain, 26.2186, 50.4756 Doruma, Congo (Kinshasa), 4.7333, 27.7000 Mickleover, United Kingdom, 52.9010, -1.5520 Gondar, India, 29.5667, 76.7833 Tankara, India, 22.6560, 70.7480 Ghogaon, India, 21.9100, 75.7000 Mahraurh, India, 25.2378, 84.1017 Tall Qasab, Iraq, 36.2586, 41.9438 Dbaiye, Lebanon, 33.9353, 35.5897 Antsampanimahazo, Madagascar, -19.6836, 47.1656 Antanambe, Madagascar, -16.4326, 49.8482 Manampatrana, Madagascar, -21.6500, 47.5833 Alakamisy, Madagascar, -20.2102, 47.3080 Maroteza, Madagascar, -22.2863, 47.1904 Bemahatazana-Belobaka, Madagascar, -19.3442, 45.9972 Vohilengo, Madagascar, -17.3000, 49.4167 Amboahangibe, Madagascar, -14.1441, 49.8115 Mahazoma, Madagascar, -17.1689, 46.5669 Ambongo, Madagascar, -23.4642, 47.2795 Alatsinainy Ialamarina, Madagascar, -21.5296, 47.3046 Analaiva, Madagascar, -20.3283, 44.4983 Maroaloka, Madagascar, -25.1984, 46.1902 Belobaka, Madagascar, -18.9950, 45.6917 Ankofa, Madagascar, -15.3947, 49.6462 Matsakabanja, Madagascar, -15.9152, 45.8357 Ambovombe Afovoany, Madagascar, -20.7770, 47.0749 Tsianisiha, Madagascar, -22.9000, 43.5833 Beantake, Madagascar, -23.8003, 44.3078 Behenjy, Madagascar, -19.2127, 47.4909 Tranoroa, Madagascar, -24.6897, 45.0419 Athar, India, 26.0392, 86.0590 Giroc, Romania, 45.7000, 21.2333 Farmington, United States, 37.7822, -90.4282 Kamienna Gora, Poland, 50.7833, 16.0333 Amvrosiivka, Ukraine, 47.7833, 38.4833 Batie, Burkina Faso, 9.8833, -2.9167 Munguia, Spain, 43.3547, -2.8472 Kolonodale, Indonesia, -1.9833, 121.3333 Lamrasla, Morocco, 32.0247, -8.9153 Serra Preta, Brazil, -12.1600, -39.3319 Whitestown, United States, 43.1350, -75.3404 Tyagadurgam, India, 11.7411, 79.0770 Aci Sant'Antonio, Italy, 37.6059, 15.1260 Bombon, Philippines, 13.6867, 123.1994 Stony Plain, Canada, 53.5264, -114.0069 Pinehurst, United States, 35.1922, -79.4684 San Alejo, El Salvador, 13.4333, -87.9667 Oak Bay, Canada, 48.4264, -123.3228 Hijuelas, Chile, -32.7986, -71.1439 San Cristobal Cucho, Guatemala, 14.9000, -91.7833 Ariccia, Italy, 41.7167, 12.6667 Le Pontet, France, 43.9650, 4.8606 Nizhnyaya Tura, Russia, 58.6208, 59.8478 Torredembarra, Spain, 41.1500, 1.4000 Lagoa do Carro, Brazil, -7.8450, -35.3200 Kosvik, Norway, 58.1500, 8.0667 Cuquio, Mexico, 20.9290, -103.0229 Towamencin, United States, 40.2417, -75.3387 Sivagiri, India, 11.1179, 77.7881 Sukhsena, India, 25.7952, 87.1089 Rampur Tilak, India, 25.8513, 87.0930 Rajmahal, India, 25.0500, 87.8400 Terenure, Ireland, 53.3097, -6.2853 Aanekoski, Finland, 62.6000, 25.7250 Szazhalombatta, Hungary, 47.3167, 18.9114 Carvin, France, 50.4939, 2.9589 Dizicheh, Iran, 32.3869, 51.5122 Konakli, Turkey, 36.5833, 31.8833 Antenor Navarro, Brazil, -6.7289, -38.4489 Melegnano, Italy, 45.3588, 9.3238 Cudahy, United States, 42.9467, -87.8641 Wantagh, United States, 40.6686, -73.5104 North Grenville, Canada, 44.9667, -75.6500 Sapeacu, Brazil, -12.7278, -39.1819 Santo Anastacio, Brazil, -21.9769, -51.6519 Chaita, India, 25.7671, 85.8792 Kegalle, Sri Lanka, 7.2531, 80.3453 Fecamp, France, 49.7600, 0.3800 Payyannur, India, 12.0935, 75.2025 Souba, Mali, 13.4125, -6.5953 Kivsharivka, Ukraine, 49.6289, 37.6831 Jadcherla, India, 16.7630, 78.1443 Stanford, United States, 37.4252, -122.1674 Torit, South Sudan, 4.4118, 32.5705 Doylestown, United States, 40.2962, -75.1393 Ranzan, Japan, 36.0565, 139.3205 Bodegraven, Netherlands, 52.0822, 4.7504 Almeria, Philippines, 11.6206, 124.3794 Ben Daoud, Algeria, 35.7192, 0.5203 Heinola, Finland, 61.2000, 26.0333 Erumapalaiyam, India, 11.6324, 78.1695 Koula, Mali, 13.1117, -7.6514 Bucay, Philippines, 17.5400, 120.7200 Barvala, India, 22.1500, 71.9000 Haren, Netherlands, 53.1721, 6.6093 Mukondapalli, India, 12.7514, 77.8017 Flora, Philippines, 18.2147, 121.4186 Loyalist, Canada, 44.2500, -76.7500 Stilfontein, South Africa, -26.8428, 26.7744 Yeddumailaram, India, 17.5011, 78.1242 Anoka, United States, 45.2099, -93.3893 Floirac, France, 44.8375, -0.5247 Colne, United Kingdom, 53.8554, -2.1756 Miyauchi, Japan, 38.0667, 140.1333 Falkoping, Sweden, 58.1667, 13.5500 Sanary-sur-Mer, France, 43.1180, 5.8014 Delran, United States, 40.0170, -74.9495 Agliana, Italy, 43.9000, 11.0000 Kuchinda, India, 21.7436, 84.3485 Los Lunas, United States, 34.8115, -106.7803 Saint-Egreve, France, 45.2325, 5.6836 Quipapa, Brazil, -8.8278, -36.0119 Pontarlier, France, 46.9067, 6.3556 Tres de Mayo, Paraguay, -26.4813, -56.0959 Mount Holly, United States, 35.3136, -81.0073 Manthani, India, 18.6500, 79.6667 Cortes, Philippines, 9.2753, 126.1911 Texistepeque, El Salvador, 14.1333, -89.5000 Lqoliaa, Morocco, 30.2908, -9.4661 Luneville, France, 48.5894, 6.5017 Palmi, Italy, 38.3667, 15.8500 Gitagum, Philippines, 8.5956, 124.4054 Olho d'Agua das Cunhas, Brazil, -4.1389, -45.1200 Kafr al Ma', Jordan, 32.4839, 35.6969 Ashtabula, United States, 41.8805, -80.7984 Portsmouth, United States, 38.7538, -82.9445 El Reno, United States, 35.5429, -97.9660 Coltauco, Chile, -34.3000, -71.1000 Kapsabet, Kenya, 0.2000, 35.1000 Paks, Hungary, 46.6219, 18.8558 Shirosato, Japan, 36.4792, 140.3762 Conyers, United States, 33.6646, -83.9966 Union de San Antonio, Mexico, 21.1280, -102.0060 Roulia, Pakistan, 32.7972, 74.0639 Deux-Montagnes, Canada, 45.5333, -73.8833 Ituacu, Brazil, -13.8128, -41.2969 Sangenjo, Spain, 42.4017, -8.8067 Narni, Italy, 42.5167, 12.5167 Pelaya, Colombia, 8.6833, -73.6667 Parole, United States, 38.9863, -76.5518 Mabehiri, Côte d’Ivoire, 5.6667, -6.4167 Khokha, India, 25.9741, 87.4062 Wadowice, Poland, 49.8833, 19.5000 Sidi Redouane, Morocco, 34.6833, -5.4500 Manambaro, Madagascar, -25.0349, 46.8087 Saatli, Azerbaijan, 39.9311, 48.3697 Nyborg, Denmark, 55.3058, 10.8034 Sorochinsk, Russia, 52.4167, 53.1000 Kostrzyn nad Odra, Poland, 52.5883, 14.6667 Nao-Me-Toque, Brazil, -28.4589, -52.8208 Filadelfia, Brazil, -10.7408, -40.1328 Nguigmi, Niger, 14.2532, 13.1108 Zapotlan del Rey, Mexico, 20.4674, -102.9248 Sint-Oedenrode, Netherlands, 51.5636, 5.4608 Silvani, India, 23.3026, 78.4408 Pudunagaram, India, 10.6810, 76.6611 Murambi, Rwanda, -1.8112, 30.0420 Bafanji, Cameroon, 5.8361, 10.4000 Sanghera, India, 30.3986, 75.5614 Veldurti, India, 15.5667, 77.9167 Puquio, Peru, -14.6939, -74.1241 Cal, Turkey, 38.0836, 29.3989 Mount Eliza, Australia, -38.1890, 145.0920 Murray, United States, 36.6146, -88.3207 Yuanquan, China, 40.5004, 95.8000 Kukmor, Russia, 56.1833, 50.8833 Ptuj, Slovenia, 46.4186, 15.8714 Ban Tha Kham, Thailand, 9.1059, 99.2326 Guapiara, Brazil, -24.1850, -48.5328 Gaoniang, China, 26.8425, 109.1789 Hybla Valley, United States, 38.7484, -77.0821 Santa Cruz Naranjo, Guatemala, 14.3858, -90.3708 Vilattikulam, India, 9.1312, 78.1687 Cary, United States, 42.2129, -88.2494 El Bordj, Algeria, 35.5158, 0.3017 Oroszlany, Hungary, 47.4892, 18.3164 Ramsbottom, United Kingdom, 53.6483, -2.3167 Tolentino, Italy, 43.2086, 13.2841 Zuhres, Ukraine, 48.0167, 38.2667 Patar, Tajikistan, 40.3333, 70.4500 Vordingborg, Denmark, 55.0104, 11.9039 Segue, Mali, 13.8153, -2.9650 Pimentel, Dominican Republic, 19.1833, -70.1000 Chortiatis, Greece, 40.6333, 23.0167 Marturu, India, 10.1694, 76.4292 Pachmir, India, 25.4077, 86.3803 Marwa, India, 25.3994, 86.9257 San Kamphaeng, Thailand, 18.7449, 99.1195 Hidrolandia, Brazil, -4.4078, -40.4378 Ourem, Brazil, -1.5478, -47.1189 Loay, Philippines, 9.6000, 124.0200 Balta, Ukraine, 47.9400, 29.6219 Vissannapeta, India, 16.9398, 80.7828 Aci Castello, Italy, 37.5500, 15.1500 Shirali, India, 14.0297, 74.5280 Ambohitralanana, Madagascar, -15.2431, 50.4455 Keszthely, Hungary, 46.7675, 17.2463 Porto Grande, Brazil, 0.7128, -51.4128 Edessa, Greece, 40.8000, 22.0500 Zaouia Ait Ishak, Morocco, 32.7600, -5.7233 Brignoles, France, 43.4058, 6.0615 Aguas Formosas, Brazil, -17.0819, -40.9358 Sidi Kada, Algeria, 35.3333, 0.3500 Sing Buri, Thailand, 14.8911, 100.4031 Savignano sul Rubicone, Italy, 44.0881, 12.3933 Marabut, Philippines, 11.1200, 125.2200 Itapiuna, Brazil, -4.5639, -38.9219 Kristinehamn, Sweden, 59.3333, 14.1167 Jiadong, Taiwan, 22.4305, 120.5471 Harper, Liberia, 4.3667, -7.7167 San Bartolo Tutotepec, Mexico, 20.4000, -98.2000 Anacortes, United States, 48.4878, -122.6292 Ribera, Italy, 37.4994, 13.2650 Baymak, Russia, 52.5833, 58.3167 Pelahiivka, Ukraine, 48.0989, 38.6128 Policoro, Italy, 40.2000, 16.6667 Timbedgha, Mauritania, 16.2447, -8.1675 Naousa, Greece, 40.6333, 22.0667 Goshaingaon, India, 26.4395, 89.9631 Parede, Portugal, 38.6933, -9.3569 Bredene, Belgium, 51.2333, 2.9667 Weilerswist, Germany, 50.7667, 6.8331 Salaspils, Latvia, 56.8614, 24.3500 Leczna, Poland, 51.3000, 22.8833 Glossop, United Kingdom, 53.4430, -1.9490 Arcore, Italy, 45.6333, 9.3167 Yakacik, Turkey, 40.9164, 29.2222 Villa Corona, Mexico, 20.2417, -103.6167 Blythe, United States, 33.6219, -114.6195 Hope Mills, United States, 34.9710, -78.9597 Mengjiacun, China, 40.0001, 119.8457 Lumbreras, Spain, 37.5633, -1.8072 Las Heras, Argentina, -46.5500, -68.9500 Sao Luis Gonzaga do Maranhao, Brazil, -4.3800, -44.6700 Carate Brianza, Italy, 45.6833, 9.2333 Blaj, Romania, 46.1753, 23.9144 Bay City, United States, 28.9838, -95.9601 Guayama, Puerto Rico, 17.9743, -66.1104 Tiffin, United States, 41.1165, -83.1805 Itanhem, Brazil, -17.1658, -40.3300 Mazapil, Mexico, 24.6383, -101.5553 Pariharpur, India, 26.7114, 85.6797 Muttenz, Switzerland, 47.5228, 7.6452 Oberasbach, Germany, 49.4219, 10.9583 Southbridge, United States, 42.0604, -72.0338 Steinbach, Canada, 49.5258, -96.6839 Salgar, Colombia, 5.9617, -75.9753 Seyah Cheshmeh, Iran, 39.0619, 44.3825 Santa Fe, Philippines, 12.1500, 122.0000 Fontaine-l'Eveque, Belgium, 50.4092, 4.3242 Gazantarak, Tajikistan, 39.9667, 69.1333 Dhansaria, India, 24.7219, 87.8572 Feilding, New Zealand, -40.2250, 175.5650 Vobkent Shahri, Uzbekistan, 40.0333, 64.5167 Herenfa, Algeria, 36.2453, 1.0458 Bagahi, India, 26.7632, 84.4670 Villa Rica, United States, 33.7294, -84.9177 Alice, United States, 27.7556, -98.0653 Vennandur, India, 11.5150, 78.0908 San Rafael, Philippines, 11.1728, 122.8267 Jovellar, Philippines, 13.0700, 123.6000 Ostroda, Poland, 53.7000, 19.9667 Jucurutu, Brazil, -6.0339, -37.0200 Ponmana, India, 8.3552, 77.3283 Shichigahama, Japan, 38.3045, 141.0591 Aminpur, India, 17.5241, 78.3242 Portchester, United Kingdom, 50.8420, -1.1200 San Rafael del Norte, Nicaragua, 13.2167, -86.1167 Mankara, India, 10.7500, 76.4333 Berlin, El Salvador, 13.5000, -88.5333 Arakkapadi, India, 10.0599, 76.4592 Cordenons, Italy, 45.9833, 12.7000 Mooirivier, South Africa, -29.2000, 29.9833 Anda, Philippines, 9.7440, 124.5760 Monthey, Switzerland, 46.2500, 6.9500 Khasab, Oman, 26.1833, 56.2500 Dhamaun, India, 25.5999, 85.5479 Dastgerd, Iran, 32.8008, 51.6647 Willimantic, United States, 41.7171, -72.2114 Varvarin, Serbia, 43.7167, 21.3667 Nidda, Germany, 50.4128, 9.0092 Lancut, Poland, 50.0667, 22.2333 Vise, Belgium, 50.7370, 5.6958 Somma Lombardo, Italy, 45.6833, 8.7000 Tall `Aran, Syria, 36.1231, 37.3400 Ash Shaykhan, Iraq, 36.6959, 43.3520 Logansport, United States, 40.7472, -86.3520 Agua Blanca, Guatemala, 14.4833, -89.6494 Klaeng, Thailand, 12.7797, 101.6483 Werdohl, Germany, 51.2667, 7.7667 Cairu, Brazil, -13.4869, -39.0439 Or `Aqiva, Israel, 32.5000, 34.9167 Clemson, United States, 34.6837, -82.8124 Penn, United States, 39.7994, -76.9642 Kreuzau, Germany, 50.7500, 6.4831 North Valley Stream, United States, 40.6840, -73.7077 Mahis, Jordan, 31.9833, 35.7667 Ostermundigen, Switzerland, 46.9553, 7.4833 Arco, Italy, 45.9167, 10.8833 Dergaon, India, 26.7000, 93.9667 Eslov, Sweden, 55.8333, 13.3333 Pokrov, Russia, 55.9117, 39.1847 Hlybokaye, Belarus, 55.1333, 27.6833 Kuttalam, India, 11.0758, 79.5608 Horodok, Ukraine, 49.1667, 26.5667 North Canton, United States, 40.8742, -81.3971 Manzanares, Spain, 38.9964, -3.3731 Trossingen, Germany, 48.0756, 8.6361 Chitipa, Malawi, -9.7024, 33.2697 Koping, Sweden, 59.5141, 15.9915 Godfrey, United States, 38.9577, -90.2156 Toba, Japan, 34.4813, 136.8434 Portsmouth, United States, 41.5922, -71.2745 Saint-Colomban, Canada, 45.7300, -74.1300 Dianopolis, Brazil, -11.6258, -46.8203 Freudenberg, Germany, 50.8997, 7.8667 Stowbtsy, Belarus, 53.4833, 26.7333 Qal'at Mgouna, Morocco, 31.2414, -6.1283 Vysokaya Gora, Russia, 55.9121, 49.3128 Dniprorudne, Ukraine, 47.3863, 34.9970 Reni, Ukraine, 45.4575, 28.2711 Troy, United States, 31.8021, -85.9664 Kodiyeri, India, 11.7067, 75.5331 Nikshahr, Iran, 26.2253, 60.2167 Liulin, China, 34.5891, 103.5081 Laukaha, India, 26.5500, 86.4700 Sapucaia, Brazil, -21.9950, -42.9139 Erjie, China, 24.7285, 102.3720 Susner, India, 23.9467, 76.0882 Estancia Pozo Colorado, Paraguay, -23.4333, -58.9667 Herzele, Belgium, 50.8833, 3.8833 West Columbia, United States, 33.9932, -81.0936 Forst (Lausitz), Germany, 51.7333, 14.6333 Calverton, United States, 39.0578, -76.9488 Ban Mae Ngon Khilek, Thailand, 19.8021, 99.1614 Pirapemas, Brazil, -3.7269, -44.2228 East Lampeter, United States, 40.0375, -76.2162 Manno, Japan, 34.2000, 133.8333 Domodossola, Italy, 46.1161, 8.2911 Rockland, United States, 42.1295, -70.9100 Broken Hill, Australia, -31.9500, 141.4667 Balaguer, Spain, 41.7900, 0.8050 Garches, France, 48.8461, 2.1889 Dialafara, Mali, 13.4631, -11.3797 Major Isidoro, Brazil, -9.5319, -36.9850 Numbrecht, Germany, 50.9053, 7.5422 Zaltan, Libya, 32.9500, 11.8658 Ashton, New Zealand, -44.0330, 171.7720 Ngora, Uganda, 1.4575, 33.7764 Kharhial, India, 20.2885, 82.7606 Digne-les-Bains, France, 44.0933, 6.2364 Mallapalli, India, 9.4461, 76.6567 Holly Springs, United States, 34.1681, -84.4847 Miramichi, Canada, 47.0196, -65.5072 Saint-Maximin-la-Sainte-Baume, France, 43.4532, 5.8614 Kiangan, Philippines, 16.7775, 121.0878 Vettavalam, India, 12.1077, 79.2452 Miaojiaping, China, 37.5777, 110.0658 Kalyanpur Bamaiya, India, 25.7140, 85.9212 Kaspiysk, Russia, 42.8803, 47.6383 Vrede, South Africa, -27.4300, 29.1600 Gainesville, United States, 33.6390, -97.1487 Ban Houayxay, Laos, 20.2631, 100.4336 Oulmes, Morocco, 33.4450, -6.0011 Starodub, Russia, 52.5833, 32.7667 Glassmanor, United States, 38.8181, -76.9833 Damme, Germany, 52.5208, 8.1986 Florina, Greece, 40.7833, 21.4000 Maripad, India, 17.3720, 79.8807 Harwich, United Kingdom, 51.9340, 1.2660 Palanan, Philippines, 17.0589, 122.4300 Bad Worishofen, Germany, 48.0058, 10.5969 Dourbali, Chad, 11.8050, 15.8647 Natchitoches, United States, 31.7315, -93.0975 Panorama, Greece, 40.5833, 23.0333 Tillmans Corner, United States, 30.5819, -88.2128 Bechem, Ghana, 7.0887, -2.0271 Dugo Selo, Croatia, 45.8000, 16.2333 Dumri, India, 25.4014, 86.1165 Mairi, Brazil, -11.7108, -40.1489 Webster, United States, 42.0521, -71.8485 South Ockendon, United Kingdom, 51.5207, 0.2956 Moreton, United Kingdom, 53.4010, -3.1110 Levin, New Zealand, -40.6333, 175.2750 Kitahiroshima, Japan, 34.6744, 132.5383 Norcross, United States, 33.9379, -84.2065 Beni Fouda, Algeria, 36.2861, 5.6072 Duffel, Belgium, 51.0957, 4.5056 Minquan, China, 37.4420, 103.3811 Bexbach, Germany, 49.3494, 7.2594 Biliran, Philippines, 11.5800, 124.4800 El Omaria, Algeria, 36.2667, 3.0333 Jaguaripe, Brazil, -13.1128, -38.8958 Whittlesey, United Kingdom, 52.5580, -0.1300 Vandalur, India, 12.8924, 80.0808 Yumurtalik, Turkey, 36.7678, 35.7922 Tohoue, Benin, 6.3967, 2.5853 Pianoro, Italy, 44.3833, 11.3333 Monzon, Spain, 41.9100, 0.1900 Fern Down, United Kingdom, 50.8100, -1.9000 Tabara Arriba, Dominican Republic, 18.5667, -70.8833 Fornaka, Algeria, 35.7517, -0.0161 Pirapora do Bom Jesus, Brazil, -23.3972, -47.0028 Daimiel, Spain, 39.0833, -3.6167 Kappiyara, India, 8.2466, 77.2617 Fanandrana, Madagascar, -18.2585, 49.2687 Lemont, United States, 41.6695, -87.9838 Arsanjan, Iran, 29.9142, 53.3058 Valluvandad, India, 11.0996, 76.1972 Vettikattiri, India, 11.1167, 76.1833 San Jose, Philippines, 12.5310, 124.4870 Sao Miguel do Tapuio, Brazil, -5.5036, -41.3233 Abare, Brazil, -8.7208, -39.1150 Dingjiagouxiang, China, 35.5307, 105.0207 Bad Sackingen, Germany, 47.5500, 7.9500 Cerrillos, Argentina, -24.9000, -65.4833 Carire, Brazil, -3.9508, -40.4728 Pupri, India, 26.4708, 85.7031 Manullahpatti, India, 26.0619, 87.1751 Tabernes de Valldigna, Spain, 39.0722, -0.2658 Stegen, Switzerland, 47.4764, 8.7697 Oborniki, Poland, 52.6500, 16.8167 Ban Mae Ka Hua Thung, Thailand, 19.0942, 99.9136 Zhukovka, Russia, 53.5333, 33.7333 La Primavera, Colombia, 5.4906, -70.4092 Rugeley, United Kingdom, 52.7599, -1.9388 Pinili, Philippines, 17.9540, 120.5270 Gostynin, Poland, 52.4167, 19.4667 Kalach, Russia, 50.4333, 41.0000 Kotsyubyns'ke, Ukraine, 50.4900, 30.3347 Lobogo, Benin, 6.6333, 1.9000 Longjia, China, 36.0962, 113.4190 Yayas de Viajama, Dominican Republic, 18.6000, -70.9200 Naklo nad Notecia, Poland, 53.1403, 17.5928 Karacasu, Turkey, 37.7308, 28.6061 Colbun, Chile, -35.7000, -71.4167 Sao Francisco de Assis, Brazil, -29.5500, -55.1308 Vittal, India, 12.7660, 75.1220 Benito Juarez, Mexico, 20.8833, -98.2000 Ambolomadinika, Madagascar, -21.9645, 47.4405 Sokolka, Poland, 53.4000, 23.5000 Belakoba, India, 26.5900, 88.5890 Port Washington, United States, 40.8268, -73.6765 Iskilip, Turkey, 40.7361, 34.4739 Totoro, Colombia, 2.5117, -76.4003 Omallur, India, 9.2468, 76.7510 Sam Phran, Thailand, 13.7270, 100.2153 Calhoun, United States, 34.4910, -84.9386 Buford, United States, 34.1192, -83.9903 Zhongguyue, China, 38.2833, 113.8667 Restrepo, Colombia, 4.2500, -73.5667 Barrhead, United Kingdom, 55.8010, -4.3890 Veliko Gradiste, Serbia, 44.7500, 21.5167 Capua, Italy, 41.1056, 14.2139 Chedaopo, China, 36.4008, 106.7351 Diepholz, Germany, 52.6072, 8.3711 Bel Air, Mauritius, -20.2582, 57.7545 Lousa, Portugal, 40.1125, -8.2469 Siderno Marina, Italy, 38.2667, 16.3000 Pirayu, Paraguay, -25.4842, -57.2361 Raghunathpur, India, 26.1145, 87.1590 Bakouma, Central African Republic, 5.6986, 22.7833 Herve, Belgium, 50.6394, 5.7942 Boqueirao, Brazil, -7.4819, -36.1350 Sigus, Algeria, 36.1167, 6.7833 Amacuzac, Mexico, 18.6000, -99.3700 Suvorov, Russia, 54.1500, 36.5500 Goodlettsville, United States, 36.3330, -86.7026 Arauco, Chile, -37.2500, -73.3167 Yondo, Colombia, 7.0000, -73.9167 Otrokovice, Czechia, 49.2100, 17.5308 Ubaitaba, Brazil, -14.3128, -39.3228 Raghunathpur, India, 25.8440, 86.9697 Neder-Over-Heembeek, Belgium, 50.9000, 4.3833 Para, Côte d’Ivoire, 5.5196, -7.3275 Pollensa, Spain, 39.8772, 3.0164 Marcon, Italy, 45.5543, 12.2994 Palau, Mexico, 27.9167, -101.4167 Cham, Germany, 49.2167, 12.6500 Lattes, France, 43.5700, 3.9094 Chamalieres, France, 45.7744, 3.0678 Holzwickede, Germany, 51.5000, 7.6167 Mula, Spain, 38.0419, -1.4906 Manganj, India, 26.1388, 86.9944 Putte, Belgium, 51.0566, 4.6292 Zamora, Ecuador, -4.0692, -78.9567 Limay, France, 48.9942, 1.7367 Santos Reyes Nopala, Mexico, 16.1000, -97.1500 Inkollu, India, 15.8300, 80.2000 Eldama Ravine, Kenya, 0.0504, 35.7200 Aja, Egypt, 30.9416, 31.2904 Saint Andrews, United Kingdom, 56.3404, -2.7955 Chakkuvarakal, India, 8.9833, 76.8500 Hernando, United States, 34.8500, -89.9921 Babenhausen, Germany, 49.9667, 8.9500 San Jorge, Philippines, 11.9800, 124.8200 Quanzhang, China, 35.6576, 111.0838 Muhradah, Syria, 35.2479, 36.5725 Garching bei Munchen, Germany, 48.2500, 11.6500 Bryn Mawr-Skyway, United States, 47.4949, -122.2410 Peruvanthanam, India, 9.5500, 76.9167 Rayappanpatti, India, 9.7997, 77.2372 Lebanon, United States, 40.0324, -86.4551 Krishnapuram, India, 10.3667, 76.1500 Agua Branca, Brazil, -5.8900, -42.6378 Compostela, Mexico, 21.2389, -104.9000 Avion, France, 50.4100, 2.8336 Cerca Carvajal, Haiti, 19.2696, -71.9386 Colchester, United States, 44.5545, -73.2168 Sagrada Familia, Chile, -35.0000, -71.3833 Catarman, Philippines, 9.1300, 124.6800 Alcochete, Portugal, 38.7553, -8.9608 Roznava, Slovakia, 48.6586, 20.5314 Terra Boa, Brazil, -23.7678, -52.4439 Bad Munstereifel, Germany, 50.5531, 6.7661 Piritiba, Brazil, -11.7300, -40.5550 Ban Thum, Thailand, 16.4515, 102.7198 Sirari, Tanzania, -1.2244, 34.4383 Barhampur, India, 26.3023, 85.7476 New Philadelphia, United States, 40.4860, -81.4401 South Ogden, United States, 41.1722, -111.9576 Auerbach, Germany, 50.5094, 12.4000 Kambla, India, 12.9607, 74.9332 Douar Oulad Mbarek, Morocco, 34.2833, -4.3167 Kisoro, Uganda, -1.2850, 29.6850 Shinfield, United Kingdom, 51.4080, -0.9470 Bistaria, India, 26.1262, 87.2300 Arroio Grande, Brazil, -32.2378, -53.0869 Barbastro, Spain, 42.0361, 0.1264 Khutaha, India, 25.2645, 86.0598 Arhavi, Turkey, 41.3333, 41.3000 Bni Tajjit, Morocco, 32.2833, -3.4833 Palaiyam, India, 10.7256, 78.1354 Piera, Spain, 41.5222, 1.7494 Mawkanin, Burma, 15.5106, 97.8533 Son en Breugel, Netherlands, 51.5158, 5.5022 Cameli, Turkey, 37.0708, 29.3453 Glencoe, South Africa, -28.1833, 30.1500 Punnayur, India, 10.6500, 76.0000 Morarano-Gara, Madagascar, -18.6955, 48.2720 Aliyabad, India, 12.6317, 79.2164 Waalre, Netherlands, 51.3867, 5.4456 Dabas, Hungary, 47.1833, 19.3167 Morganton, United States, 35.7408, -81.7002 Mandirituba, Brazil, -25.7789, -49.3258 Gadani, Pakistan, 25.1194, 66.7319 Fairview, United States, 40.1735, -76.8655 Koriapatti, India, 26.1149, 86.9905 Lake St. Louis, United States, 38.7846, -90.7886 Eastlake, United States, 41.6581, -81.4322 Etacheri, India, 10.6028, 76.6444 Sona, Italy, 45.4333, 10.8333 Yeniseysk, Russia, 58.4667, 92.1333 Al `Asharah, Syria, 34.9213, 40.5601 Scarborough, Trinidad and Tobago, 11.1833, -60.7375 Graham, United States, 36.0589, -79.3894 Mitake, Japan, 35.4344, 137.1307 Vayalpad, India, 13.6500, 78.6333 Camano, United States, 48.1865, -122.4708 Shangjing, China, 24.5601, 114.8943 Shanglingcun, China, 24.6076, 114.9939 Esperanza, Philippines, 11.7369, 124.0417 Harinakunda, Bangladesh, 23.6500, 89.0333 Duijiang, China, 27.0782, 105.5256 Esquimalt, Canada, 48.4306, -123.4147 Polignano a Mare, Italy, 40.9961, 17.2203 Rio Bananal, Brazil, -19.2650, -40.3333 Bonnyrigg, United Kingdom, 55.8747, -3.1031 Turuvekere, India, 13.1637, 76.6664 Shirva, India, 13.2465, 74.8444 Mistrato, Colombia, 5.3000, -75.8833 Attimarappatti, India, 8.7297, 78.1169 Bekes, Hungary, 46.7769, 21.1250 Guidan Roumdji, Niger, 13.6575, 6.6958 Boljoon, Philippines, 9.6300, 123.4300 Villorba, Italy, 45.7333, 12.2333 Matagob, Philippines, 11.1469, 124.4733 Takoma Park, United States, 38.9810, -77.0028 Manin, Syria, 33.6406, 36.2991 Gunjur, Gambia, The, 13.1833, -16.7667 McKeesport, United States, 40.3418, -79.8440 Krasnystaw, Poland, 51.0000, 23.1667 Malacacheta, Brazil, -17.8419, -42.0769 Wahiawa, United States, 21.5012, -158.0178 Streetsboro, United States, 41.2396, -81.3456 Ivanovka, Kyrgyzstan, 42.8878, 75.0850 Rocca di Papa, Italy, 41.7620, 12.7069 Strzelce Opolskie, Poland, 50.5000, 18.2833 Spanish Springs, United States, 39.6568, -119.6694 Bad Munder am Deister, Germany, 52.1992, 9.4653 Sulaco, Honduras, 14.9113, -87.2622 Ebino, Japan, 32.0453, 130.8108 Elankur, India, 11.1333, 76.1667 Libertad, Philippines, 11.7690, 121.9189 Piratini, Brazil, -31.4478, -53.1039 Moloacan, Mexico, 17.9833, -94.3500 Tenango de Doria, Mexico, 20.3356, -98.2267 Mendes, Brazil, -22.5269, -43.7328 San Antonio de Ibarra, Ecuador, 0.3627, -78.1307 Eksambe, India, 16.4200, 74.5800 Baxt, Uzbekistan, 40.7139, 68.6933 Cafelandia, Brazil, -21.8025, -49.6100 Buguda, India, 19.8081, 84.7908 Wymondham, United Kingdom, 52.5700, 1.1160 Yutz, France, 49.3594, 6.1892 Kudavasal, India, 10.8582, 79.4823 Melissa, United States, 33.2891, -96.5573 Puerto Guzman, Colombia, 0.9703, -76.5858 Kirksville, United States, 40.1986, -92.5752 Puerto Rico, Argentina, -26.8000, -55.0167 Ilam, Nepal, 26.9080, 87.9260 St. Matthews, United States, 38.2497, -85.6384 Bourne, United Kingdom, 52.7684, -0.3775 Jacksonville, United States, 39.7292, -90.2317 Biyahmu, Egypt, 29.3675, 30.8528 Ciudad Hidalgo, Mexico, 14.6792, -92.1497 Karukh, Afghanistan, 34.4922, 62.5922 Augustinopolis, Brazil, -5.4658, -47.8878 Zhoujia, China, 35.2976, 108.0347 Bhucho Mandi, India, 30.2129, 75.0969 Ambatolahy, Madagascar, -20.0082, 45.5385 Villa Sarmiento, Argentina, -34.6333, -58.5667 Croata, Brazil, -4.4000, -40.9108 Pajapan, Mexico, 18.2667, -94.6833 Kushk, Afghanistan, 33.2956, 61.9522 Urucuia, Brazil, -16.1328, -45.7419 Shin-Kamigoto, Japan, 32.9844, 129.0733 Budva, Montenegro, 42.2881, 18.8425 Bad Wildungen, Germany, 51.1167, 9.1167 Dharampuri, India, 22.1495, 75.3444 Tepatlaxco, Mexico, 19.0667, -97.9667 Osny, France, 49.0600, 2.0633 Umirim, Brazil, -3.6769, -39.3500 Corbelia, Brazil, -24.7989, -53.3069 Vallieres, Haiti, 19.4355, -71.9209 Anantavur, India, 10.8925, 75.9983 Saluzzo, Italy, 44.6453, 7.4906 Pocinhos, Brazil, -7.0769, -36.0608 Idylwood, United States, 38.8896, -77.2056 Gretna, United States, 29.9101, -90.0515 Gescher, Germany, 51.9569, 7.0056 Cafarnaum, Brazil, -11.6939, -41.4678 Bitburg, Germany, 49.9667, 6.5333 Cortland, United States, 42.6004, -76.1784 Talitay, Philippines, 7.0353, 124.3758 Vladimirci, Serbia, 44.6167, 19.7833 Cruz do Espirito Santo, Brazil, -7.1400, -35.0864 Vovchansk, Ukraine, 50.2878, 36.9428 Guanagazapa, Guatemala, 14.2333, -90.6500 Gautampura, India, 22.9866, 75.5192 Karkamb, India, 17.8630, 75.2981 Marche-en-Famenne, Belgium, 50.2266, 5.3437 Kiyama, Japan, 33.4269, 130.5231 Falea, Mali, 12.2647, -11.2753 Mandvi, India, 21.1500, 73.1800 Sibutao, Philippines, 8.6131, 123.4797 Puurs, Belgium, 51.0761, 4.2803 Tasquillo, Mexico, 20.6167, -99.2500 South San Jose Hills, United States, 34.0123, -117.9043 Woodhouse, United Kingdom, 53.3580, -1.3730 Albino, Italy, 45.7606, 9.7969 Karachev, Russia, 53.1167, 34.9667 Burke Centre, United States, 38.7903, -77.2999 Pecanha, Brazil, -18.5489, -42.5569 Abdullahnagar, India, 25.7683, 87.5557 Royston, United Kingdom, 52.0471, -0.0202 Sobinka, Russia, 56.0000, 40.0333 Rio Pomba, Brazil, -21.2750, -43.1789 Nedugula, India, 11.4764, 76.8904 Lakhnaur, India, 26.2020, 86.3090 Selma, United States, 32.4166, -87.0336 Puerto Aysen, Chile, -45.4000, -72.6833 Patan, India, 23.2864, 79.6896 Rozdilna, Ukraine, 46.8486, 30.0792 Brielle, Netherlands, 51.9017, 4.1625 Nova Era, Brazil, -19.7606, -43.0289 Conceicao do Mato Dentro, Brazil, -19.0369, -43.4250 Nisang, India, 29.6900, 76.7500 Heber, United States, 40.5070, -111.3986 Auburndale, United States, 28.0963, -81.8012 Reota, India, 25.8194, 86.3061 Forio, Italy, 40.7333, 13.8500 Lubang, Philippines, 13.8586, 120.1228 Montemor-o-Novo, Portugal, 38.6500, -8.2167 Kingstowne, United States, 38.7625, -77.1444 Shelbyville, United States, 38.2067, -85.2292 Mehran, Iran, 33.1208, 46.1642 Kahoku, Japan, 38.4264, 140.3144 Derhachi, Ukraine, 50.1066, 36.1211 Balma, France, 43.6111, 1.4994 Seoni Chhapara, India, 22.3939, 79.5424 Totutla, Mexico, 19.2167, -96.9667 Pinewood, United States, 25.8697, -80.2174 Poyo, Spain, 42.4333, -8.6667 Pescantina, Italy, 45.4833, 10.8667 Anosiarivo, Madagascar, -19.9202, 47.0389 Guaranda, Colombia, 8.4667, -75.5333 Santa Lucia Milpas Altas, Guatemala, 14.5833, -90.6833 Nahazari, India, 22.4347, 88.2487 Kolokonde, Benin, 9.9000, 1.7667 Camocim de Sao Felix, Brazil, -8.3589, -35.7619 Loboc, Philippines, 9.6300, 124.0300 Bahon, Haiti, 19.4696, -72.1147 Wilton, United States, 43.1502, -73.7276 Viradouro, Brazil, -20.8728, -48.2969 Powder Springs, United States, 33.8659, -84.6840 Wayne, United States, 42.2774, -83.3877 San Isidro, Nicaragua, 12.9319, -86.1953 Jouy-le-Moutier, France, 49.0117, 2.0397 Dar Chaifat, Morocco, 32.5500, -7.5000 Calayan, Philippines, 19.2619, 121.4753 South Hadley, United States, 42.2567, -72.5793 Karahia, India, 26.4054, 86.1490 Isola Capo Rizzuto, Italy, 38.9667, 17.1000 Richmond Hill, United States, 31.9012, -81.3125 Oak Grove, United States, 45.4156, -122.6349 Viljandi, Estonia, 58.3667, 25.6000 Buckingham, Canada, 45.5889, -75.4164 Ummannur, India, 8.9500, 76.7833 Namminikara, India, 10.4392, 76.2680 Jhagarua, India, 26.0059, 86.3496 Beinasco, Italy, 45.0221, 7.5794 Fraserpet, India, 12.4587, 75.9605 Borda da Mata, Brazil, -22.2739, -46.1650 Zaslawye, Belarus, 54.0083, 27.2847 Stockach, Germany, 47.8514, 9.0114 Rio Claro, Brazil, -22.7228, -44.1358 Odaipatti, India, 9.8323, 77.4433 Douetire, Mali, 16.5833, -3.3667 Holmdel, United States, 40.3768, -74.1725 Martahalli, India, 11.9919, 77.4972 Miedzyrzecz, Poland, 52.4483, 15.5883 Jomboy Shahri, Uzbekistan, 39.6989, 67.0933 Sinzig, Germany, 50.5453, 7.2519 South Venice, United States, 27.0444, -82.4155 Bhagabanpur, India, 24.7765, 88.0217 Curti, India, 15.4167, 74.0167 Kawa, Burma, 17.0897, 96.4663 Ziracuaretiro, Mexico, 19.4333, -101.9167 Pyskowice, Poland, 50.3833, 18.6167 Sao Domingos do Prata, Brazil, -19.8650, -42.9678 Abelardo Luz, Brazil, -26.5650, -52.3278 Minster, United Kingdom, 51.4210, 0.8090 Remagen, Germany, 50.5786, 7.2306 Banni, India, 25.4692, 86.6068 Aurora, United States, 41.3118, -81.3450 Plunge, Lithuania, 55.9167, 21.8500 Mareth, Tunisia, 33.6333, 10.3000 Central Saanich, Canada, 48.5142, -123.3839 Solrod Strand, Denmark, 55.5364, 12.2252 Villanueva del Pardillo, Spain, 40.4833, -3.9667 El Dorado, United States, 33.2184, -92.6640 Kurugodu, India, 15.3460, 76.8360 Santa Maria di Sala, Italy, 45.5089, 12.0363 Wangaratta, Australia, -36.3583, 146.3125 Pecel, Hungary, 47.4911, 19.3419 Vargem Alta, Brazil, -20.6708, -41.0069 Louth, United Kingdom, 53.3669, -0.0061 Gunjapalle, India, 14.3845, 77.9495 Rancho Mirage, United States, 33.7635, -116.4271 Osuna, Spain, 37.2333, -5.1000 Ban Song, Thailand, 8.6355, 99.3716 Paoua, Central African Republic, 7.2500, 16.4333 Schwarzenbek, Germany, 53.5042, 10.4792 Ignacio de la Llave, Mexico, 18.6618, -95.9721 Scott, United States, 40.3875, -80.0791 Lalibela, Ethiopia, 12.0317, 39.0411 Cluses, France, 46.0611, 6.5794 Mujikharf, Tajikistan, 38.8500, 69.8833 Kelsterbach, Germany, 50.0617, 8.5311 Sanwer, India, 22.9742, 75.8271 Barhan, India, 27.3299, 78.1896 Ayacucho, Argentina, -37.1333, -58.4667 Marmande, France, 44.5000, 0.1700 Oued el Kheir, Algeria, 35.9503, 0.3808 Royse City, United States, 32.9762, -96.3175 West Lampeter, United States, 39.9947, -76.2560 Betio, Kiribati, 1.3500, 172.9333 New Castle, United States, 39.9191, -85.3697 Firestone, United States, 40.1565, -104.9494 Coalinga, United States, 36.1420, -120.3242 Carcarana, Argentina, -32.8500, -61.1500 Sestri Levante, Italy, 44.2733, 9.3932 Sainte-Catherine, Canada, 45.4000, -73.5800 Kembhavi, India, 16.6500, 76.5333 Ibrahimpatan, India, 17.1017, 78.6294 Laguna Woods, United States, 33.6099, -117.7299 Kadogawa, Japan, 32.4711, 131.6461 Kamudi, India, 9.4090, 78.3679 Tonj, South Sudan, 7.2739, 28.6775 Valenzano, Italy, 41.0500, 16.8833 Bad Langensalza, Germany, 51.1081, 10.6467 Gothini, India, 26.1626, 84.0379 Mollasani, Iran, 31.5850, 48.8850 Pannaipuram, India, 9.7908, 77.1578 Yerrapalem, India, 16.1500, 80.0300 Ellamanda, India, 16.1500, 80.0300 Boissy-Saint-Leger, France, 48.7511, 2.5106 Sedeh Lanjan, Iran, 32.3786, 51.3178 Padre Paraiso, Brazil, -17.0719, -41.5239 Bethpage, United States, 40.7495, -73.4856 Jenison, United States, 42.9063, -85.8269 Mori, Japan, 34.8333, 137.9333 Riva del Garda, Italy, 45.8858, 10.8412 Horn-Bad Meinberg, Germany, 51.8833, 8.9667 New Amsterdam, Guyana, 6.2500, -57.5167 Mau Dhaneshpur, India, 25.5899, 85.8337 Betroka, Madagascar, -23.2684, 46.0963 Mudukulattur, India, 9.3440, 78.5138 Matam, Senegal, 15.6167, -13.3333 Tagana-an, Philippines, 9.6964, 125.5825 Dijiasuoxiang, China, 35.6871, 105.2571 Ain Zaouia, Algeria, 36.5500, 3.8944 Uryzhar, Kazakhstan, 47.0900, 81.6228 Muniz Freire, Brazil, -20.4642, -41.4131 El Kouif, Algeria, 35.5000, 8.3167 Miharu, Japan, 37.4410, 140.4926 Suesca, Colombia, 5.1000, -73.8000 Pital, Costa Rica, 10.6024, -84.2474 Betulia, Colombia, 6.1122, -75.9839 Tak Bai, Thailand, 6.2592, 102.0531 Villiers, South Africa, -27.0333, 28.6000 Chadchan, India, 17.3126, 75.6581 Pohadi, India, 26.0387, 86.1612 As Suqaylibiyah, Syria, 35.3667, 36.3936 Otacilio Costa, Brazil, -27.4828, -50.1219 Canovellas, Spain, 41.6203, 2.2847 Mecayapan, Mexico, 18.2167, -94.8333 Cajamarca, Colombia, 4.4167, -75.5000 Tiogollo, Colombia, 10.3408, -74.7333 Sierpc, Poland, 52.8833, 19.6667 Maranello, Italy, 44.5264, 10.8667 Murraysville, United States, 34.2919, -77.8429 Charipara, India, 20.4500, 84.4000 Mundo Novo, Brazil, -11.8589, -40.4719 La Garriga, Spain, 41.6833, 2.2833 Almolonga, Guatemala, 14.8122, -91.4944 Bon Air, United States, 37.5187, -77.5713 Namayingo, Uganda, 0.3450, 33.8800 Kanrangana, Mali, 12.2297, -5.0353 Ambares-et-Lagrave, France, 44.9258, -0.4853 Saram, India, 23.7625, 85.8300 Ban Pong, Thailand, 13.8163, 99.8774 Chorhat, India, 24.4274, 81.6695 Eutin, Germany, 54.1378, 10.6181 Krupanj, Serbia, 44.3667, 19.3667 Fortim, Brazil, -4.4500, -37.7833 Port Hope, Canada, 43.9500, -78.3000 Keota, India, 25.6440, 85.8287 Jawkatia, India, 26.7308, 84.6263 Porciuncula, Brazil, -20.9628, -42.0408 Pont-a-Celles, Belgium, 50.5000, 4.3500 Oerlinghausen, Germany, 51.9667, 8.6667 Kouka, Burkina Faso, 11.9000, -4.3333 Santo Antonio do Amparo, Brazil, -20.9458, -44.9189 Talwandi Bhai, India, 30.8622, 74.9285 Brand, Germany, 50.7489, 6.1650 Toledo, Colombia, 7.3131, -72.4875 Cameron Park, United States, 38.6738, -120.9872 Clayton, United States, 38.6444, -90.3303 Garwolin, Poland, 51.8972, 21.6150 Stafford, United States, 29.6271, -95.5654 Zebala, Mali, 12.3114, -5.1533 Baie de Henne, Haiti, 19.6667, -73.2000 Malta, United States, 42.9853, -73.7879 Amesbury, United States, 42.8530, -70.9446 Thornton, United Kingdom, 53.7898, -1.8504 Kukraun, India, 25.6858, 87.1638 Dadhar, Pakistan, 29.4700, 67.6500 Yur'yev-Pol'skiy, Russia, 56.5000, 39.6833 Stone, United Kingdom, 52.9000, -2.1500 Norrtalje, Sweden, 59.7667, 18.7000 Colon, Costa Rica, 9.9096, -84.2620 Selby, United Kingdom, 53.7836, -1.0678 Mulki, India, 13.1000, 74.8000 Abdulino, Russia, 53.6667, 53.6333 Arinos, Brazil, -15.9169, -46.1058 Senges, Brazil, -24.1128, -49.4639 Kulasegaram, India, 8.3667, 77.3000 Moroni, Comoros, -11.6990, 43.2560 Nipomo, United States, 35.0319, -120.4985 Bailen, Spain, 38.0833, -3.7667 Montanha, Brazil, -18.1269, -40.3628 Shongzhy, Kazakhstan, 43.5417, 79.4703 Dehti, India, 26.2115, 87.5513 Staphorst, Netherlands, 52.6333, 6.2000 Heilbad Heiligenstadt, Germany, 51.3789, 10.1386 Maigh Nuad, Ireland, 53.3850, -6.5936 Oskarshamn, Sweden, 57.2667, 16.4333 Rattaphum, Thailand, 7.1348, 100.2565 Capistrano, Brazil, -4.4700, -38.9008 Marktredwitz, Germany, 50.0000, 12.0667 Illizi, Algeria, 26.5050, 8.4822 Venturosa, Brazil, -8.5747, -36.8742 Heanor, United Kingdom, 53.0140, -1.3540 Friern Barnet, United Kingdom, 51.6126, -0.1584 Milton, United Kingdom, 53.0500, -2.1420 Khanpur, India, 28.5300, 78.0500 Benavente, Spain, 42.0031, -5.6742 Chiva, Spain, 39.4714, -0.7197 Cubellas, Spain, 41.0000, 12.0000 Dharmapuri, India, 18.9475, 79.0940 Cinnaminson, United States, 40.0008, -74.9930 Fort Thomas, United States, 39.0801, -84.4518 Lake Butler, United States, 28.4862, -81.5460 Mariakerke, Belgium, 51.0728, 3.6761 Baturbari, India, 26.2281, 87.4714 Mettuppalaiyam, India, 11.4325, 77.6658 Nadikude, India, 16.5927, 79.7174 Nadugadda, India, 16.6241, 79.4448 Gunzenhausen, Germany, 49.1147, 10.7542 Bawgalegyi, Burma, 18.9144, 96.7856 Kaukauna, United States, 44.2773, -88.2641 Danville, United States, 37.6418, -84.7777 Inverness, Canada, 46.2000, -61.1000 Jaguaretama, Brazil, -5.6128, -38.7669 Kangaba, Mali, 11.9333, -8.4167 Ejutla de Crespo, Mexico, 16.5672, -96.7308 Voskresensk, Russia, 55.3167, 38.7000 Swansea, United States, 41.7571, -71.2120 Cipo, Brazil, -11.1000, -38.5169 Pavumba, India, 9.0597, 76.8889 Milla'ab, Morocco, 31.4737, -4.7424 Resplendor, Brazil, -19.3258, -41.2550 Littau, Switzerland, 47.0494, 8.2639 Souaflia, Algeria, 35.8500, 0.3333 Minakami, Japan, 36.6786, 138.9991 Annonay, France, 45.2408, 4.6714 Lima Duarte, Brazil, -21.8428, -43.7928 Monselice, Italy, 45.2333, 11.7500 Castelfiorentino, Italy, 43.6108, 10.9700 Bakeshiyingcun, China, 40.7237, 117.1930 Masamagrell, Spain, 39.5703, -0.3300 Korsun-Shevchenkivskyi, Ukraine, 49.4833, 31.2833 Martigny, Switzerland, 46.1022, 7.0750 Pisaflores, Mexico, 21.1933, -99.0050 Dallas, United States, 44.9221, -123.3130 Bareggio, Italy, 45.4780, 8.9984 Charleston, United States, 39.4842, -88.1781 Terzigno, Italy, 40.8000, 14.5000 Carnaubal, Brazil, -4.1669, -40.9428 Adelphi, United States, 39.0017, -76.9649 Itacarambi, Brazil, -15.1019, -44.0919 Bendorf, Germany, 50.4297, 7.5703 Schwalbach, Germany, 49.2833, 6.8167 Port-a-Piment, Haiti, 18.2498, -74.0972 Kretinga, Lithuania, 55.8900, 21.2422 Konstantinovsk, Russia, 47.5667, 41.0833 Simin Shahr, Iran, 37.0264, 54.2214 Raiyam, India, 26.2702, 86.2071 Chouafaa, Morocco, 34.7624, -6.0450 Easton, United States, 38.7760, -76.0701 Mohacs, Hungary, 45.9958, 18.6797 Shahritus, Tajikistan, 37.2667, 68.1333 Carmo, Brazil, -21.9339, -42.6089 Akassato, Benin, 6.5000, 2.3667 Lerida, Colombia, 4.9000, -74.9167 Banabuiu, Brazil, -5.3100, -38.9208 Bramhall, United Kingdom, 53.3570, -2.1640 Anori, Brazil, -3.7728, -61.6442 Badantola, India, 25.2517, 87.8420 Araruna, Brazil, -6.5321, -35.7398 Mont-Organise, Haiti, 19.4082, -71.7813 Dormentes, Brazil, -8.4469, -40.7708 Calera, United States, 33.1254, -86.7449 Sudipen, Philippines, 16.9000, 120.4700 Cherakara, India, 8.8456, 76.7164 Trstenik, Serbia, 43.6186, 20.9972 Cacimba de Dentro, Brazil, -6.6417, -35.7900 Padugupadu, India, 14.4885, 79.9923 Glenn Heights, United States, 32.5506, -96.8548 Neerpelt, Belgium, 51.2272, 5.4317 Dolores, Uruguay, -33.5333, -58.2167 Cahokia Heights, United States, 38.5710, -90.1525 Al Harah, Syria, 33.0559, 36.0046 Nederweert, Netherlands, 51.2858, 5.7486 Alcantara, Philippines, 12.2584, 122.0543 Shek Tong Tsui, Hong Kong, 22.2871, 114.1357 Villa Isabela, Dominican Republic, 19.8200, -71.0500 Viera West, United States, 28.2467, -80.7387 Zandvoort, Netherlands, 52.3667, 4.5333 Guoxing, Taiwan, 24.0550, 120.8700 Sume, Brazil, -7.6719, -36.8800 Conceicao do Almeida, Brazil, -12.7794, -39.1700 Iati, Brazil, -9.0458, -36.8458 Traiguen, Chile, -38.2500, -72.6833 Calnali, Mexico, 20.9000, -98.5833 Massaranduba, Brazil, -26.6108, -49.0078 Rojales, Spain, 38.0833, -0.7167 Upper Grand Lagoon, United States, 30.1690, -85.7407 Pocao de Pedras, Brazil, -4.7500, -44.9333 Tizi Rached, Algeria, 36.6667, 4.1833 Sinnai, Italy, 39.3026, 9.2031 Peka, Lesotho, -28.9667, 27.7667 Itirapina, Brazil, -22.2528, -47.8228 Berga, Spain, 42.1011, 1.8439 Bellingham, United States, 42.0777, -71.4741 Kayaralam, India, 12.0000, 75.4167 Tanque Novo, Brazil, -13.5458, -42.4908 Upper Saucon, United States, 40.5364, -75.4084 Konstancin-Jeziorna, Poland, 52.0833, 21.1167 Cassia, Brazil, -20.5828, -46.9219 Hinsdale, United States, 41.8007, -87.9273 Tejucuoca, Brazil, -3.9889, -39.5808 Castilleja de la Cuesta, Spain, 37.3833, -6.0500 Tlahuelilpan, Mexico, 20.1297, -99.2286 Pasaquina, El Salvador, 13.5844, -87.8411 McKinleyville, United States, 40.9488, -124.0857 Bom Sucesso, Brazil, -21.0328, -44.7578 Perdizes, Brazil, -19.3528, -47.2928 Sake, Congo (Kinshasa), -1.5741, 29.0413 Mayuge, Uganda, 0.4578, 33.4800 Joaquim Gomes, Brazil, -9.1328, -35.7478 Settiyarpatti, India, 9.3935, 77.4935 Monsenhor Tabosa, Brazil, -4.7889, -40.0628 Hatfield, United Kingdom, 53.5800, -1.0000 Majitha, India, 31.7571, 74.9589 Sawankhalok, Thailand, 17.3160, 99.8319 Oi, Japan, 35.3333, 139.1500 Grumo Nevano, Italy, 40.9357, 14.2604 Ginsheim-Gustavsburg, Germany, 49.9833, 8.3333 Ayinikkad, India, 11.4974, 75.7200 San Felipe, Mexico, 31.0275, -114.8353 Avenel, United States, 40.5842, -74.2716 Tricase, Italy, 39.9333, 18.3667 Grenchen, Switzerland, 47.1931, 7.3958 Sada, Spain, 43.3500, -8.2500 Tifton, United States, 31.4624, -83.5203 Berezhany, Ukraine, 49.4458, 24.9361 Clitheroe, United Kingdom, 53.8711, -2.3916 Hampton Bays, United States, 40.8695, -72.5225 Panchgram, India, 24.1996, 88.0077 Saguday, Philippines, 16.5394, 121.5636 Ipaba, Brazil, -19.4139, -42.4189 Figline Valdarno, Italy, 43.6167, 11.4667 Frederikssund, Denmark, 55.8389, 12.0676 Regeneracao, Brazil, -6.2378, -42.6878 Zelenogradsk, Russia, 54.9667, 20.4833 Banovici, Bosnia and Herzegovina, 44.4089, 18.5287 Correntes, Brazil, -9.1289, -36.3300 Giria, India, 24.5167, 88.0767 Sa`adat Shahr, Iran, 30.0772, 53.1328 Peso da Regua, Portugal, 41.1632, -7.7890 Hunfeld, Germany, 50.6667, 9.7667 Sidi Zouine, Morocco, 31.6706, -8.3508 Laurel, United States, 31.6956, -89.1449 Firminy, France, 45.3889, 4.2878 Addison, United States, 32.9590, -96.8355 Marsabit, Kenya, 2.3333, 37.9833 West Richland, United States, 46.3115, -119.3999 Wixom, United States, 42.5243, -83.5346 Ksar Sghir, Morocco, 35.8419, -5.5586 Ejea de los Caballeros, Spain, 42.1292, -1.1372 Wadi Halfa', Sudan, 21.8000, 31.3500 Ilaka Atsinanana, Madagascar, -19.5503, 48.8371 Novo Aripuana, Brazil, -5.1214, -60.3806 West Hempfield, United States, 40.0564, -76.4632 Wang Tau Hom, Hong Kong, 22.3408, 114.1871 Ban Phe, Thailand, 12.6282, 101.4376 Bellaire, United States, 29.7040, -95.4621 Peruwelz, Belgium, 50.5167, 3.5833 Barrington, United States, 41.7443, -71.3145 Distraccion, Colombia, 10.9000, -72.8833 Upper Gwynedd, United States, 40.2144, -75.2891 Damous, Algeria, 36.5500, 1.7000 Woodcrest, United States, 33.8789, -117.3687 San Bernardino, Guatemala, 14.5333, -91.4500 Denville, United States, 40.8890, -74.4893 Kutiyana, India, 21.6300, 69.9800 Manaquiri, Brazil, -3.4281, -60.4594 Lyepyel, Belarus, 54.8750, 28.6944 Shoufeng, Taiwan, 23.8667, 121.5167 Bulbula, Azerbaijan, 40.4364, 49.9731 Nova Pazova, Serbia, 44.9500, 20.2167 Yizhu, Taiwan, 23.3565, 120.2235 Ginir, Ethiopia, 7.1333, 40.7000 Dilasag, Philippines, 16.4000, 122.2200 Ojus, United States, 25.9563, -80.1606 Xintangcun, China, 23.9423, 116.7865 Pottassheri, India, 10.9950, 76.5053 Taxtako`pir, Uzbekistan, 43.0225, 60.2886 Canon City, United States, 38.4430, -105.2203 Mosbrough, United Kingdom, 53.3250, -1.3620 L'Isle-d'Abeau, France, 45.6233, 5.2305 Santa Magdalena, Philippines, 12.6489, 124.1083 Braunau am Inn, Austria, 48.2583, 13.0350 Kolaccheri, India, 11.9737, 75.4083 Kelheim, Germany, 48.9167, 11.8667 Melfi, Italy, 40.9964, 15.6558 Mata Roma, Brazil, -3.6250, -43.1108 San Esteban, Chile, -32.7992, -70.5803 Tadigadapa, India, 16.4713, 80.6970 Montornes del Valles, Spain, 41.5333, 2.2667 Chandia, India, 23.6565, 80.7091 Toluprpatti, India, 11.0244, 78.3134 Lac, Albania, 41.6353, 19.7131 Elias Fausto, Brazil, -23.0428, -47.3739 Usmanpur, India, 24.7367, 87.8676 Sunland Park, United States, 31.8201, -106.5958 Peragamanna, India, 11.2139, 76.1270 Sarotar, India, 26.4291, 84.7813 Condeixa-a-Nova, Portugal, 40.1167, -8.5000 Wadgassen, Germany, 49.2667, 6.7667 Gudipallipadu, India, 14.4588, 80.0482 Ferndale, United States, 39.1869, -76.6331 Pendleton, United States, 45.6757, -118.8201 Al Bayahu, Egypt, 28.2614, 30.7317 Sibinal, Guatemala, 15.1342, -92.0500 San Rafael Cedros, El Salvador, 13.7333, -88.8833 Puchov, Slovakia, 49.1200, 18.3306 Xiulin, Taiwan, 24.2167, 121.5333 Svalyava, Ukraine, 48.5472, 22.9861 Mannukara, India, 9.3000, 76.5333 Ayikudi, India, 9.0032, 77.3449 Challapalle, India, 16.1167, 80.9333 Crixas, Brazil, -14.5489, -49.9689 Guadarrama, Spain, 40.6728, -4.0889 Mavalli, India, 14.1000, 74.4833 Chuarrancho, Guatemala, 14.8181, -90.5153 New Port Richey, United States, 28.2468, -82.7170 Paulino Neves, Brazil, -2.7189, -42.5328 Norwalk, United States, 41.2443, -82.6088 Condeuba, Brazil, -14.8950, -41.9689 Baildon, United Kingdom, 53.8510, -1.7630 Ramnagar, India, 22.3245, 88.4940 Saint-Basile-le-Grand, Canada, 45.5333, -73.2833 Itarantim, Brazil, -15.6600, -40.0658 Kafr Zayta, Syria, 35.3743, 36.6033 Kibungan, Philippines, 16.6939, 120.6539 Porteiras, Brazil, -7.5350, -39.1178 Pieksamaki, Finland, 62.3003, 27.1642 Fairview Park, United States, 41.4419, -81.8530 Caqueza, Colombia, 4.4053, -73.9478 Maesteg, United Kingdom, 51.6100, -3.6500 Taskopru, Turkey, 41.5097, 34.2142 Ilhota, Brazil, -26.9000, -48.8269 Cheraro, Ethiopia, 14.3958, 37.7731 Velddrif, South Africa, -32.7833, 18.1667 Bermeo, Spain, 43.4200, -2.7264 Sallanches, France, 45.9372, 6.6328 Dombovar, Hungary, 46.3769, 18.1310 Pernamitta, India, 15.5333, 80.0000 Bredbury, United Kingdom, 53.4200, -2.1130 Carlentini, Italy, 37.2758, 15.0145 Safety Harbor, United States, 28.0080, -82.6964 Aberdeen, United States, 46.9757, -123.8094 Albal, Spain, 39.3972, -0.4156 Kitanakagusuku, Japan, 26.3011, 127.7931 Grojec, Poland, 51.8656, 20.8675 Benesov, Czechia, 49.7828, 14.6886 Gennep, Netherlands, 51.6942, 5.9733 Ribeiropolis, Brazil, -10.5389, -37.4361 Guernica y Luno, Spain, 43.3167, -2.6667 San Miguelito, Nicaragua, 11.4000, -84.9000 Navalmoral de la Mata, Spain, 39.8983, -5.5403 Oswego, United States, 43.4516, -76.5005 Gachancipa, Colombia, 4.9908, -73.8731 Huntington, United States, 40.8810, -85.5063 Kunzell, Germany, 50.5500, 9.7167 Sinsina, Mali, 12.3517, -5.4422 Barreira, Brazil, -4.2869, -38.6428 Tsararivotra, Madagascar, -19.0688, 47.5509 Bristol, United States, 36.6181, -82.1604 Stockelsdorf, Germany, 53.8833, 10.6500 Groves, United States, 29.9457, -93.9164 Sao Simao, Brazil, -19.0127, -50.6748 Sao Simao, Brazil, -18.9908, -50.5439 Rubeho, Tanzania, -6.2578, 36.8653 Piranga, Brazil, -20.6850, -43.3000 Xinying, China, 35.7039, 104.1783 Heysham, United Kingdom, 54.0460, -2.8940 Nayakanhatti, India, 14.4644, 76.5451 Hinode, Japan, 35.7421, 139.2546 Carius, Brazil, -6.5369, -39.4969 Karratha, Australia, -20.7364, 116.8464 Macatuba, Brazil, -22.5022, -48.7114 Sitamau, India, 24.0147, 75.3532 Abington, United States, 42.1180, -70.9590 Juazeirinho, Brazil, -7.0678, -36.5778 Avitanallur, India, 11.5002, 75.8059 Penamiller, Mexico, 21.0519, -99.8150 Hollins, United States, 37.3434, -79.9534 Brasnorte, Brazil, -12.1550, -57.9789 Qajortebu, China, 30.9347, 88.7047 Jayal, India, 27.2167, 74.1833 Matauna, India, 26.6699, 85.4870 Ad Dulu`iyah, Iraq, 34.0328, 44.2248 Baaqline, Lebanon, 33.6797, 35.5583 Marosangy, Madagascar, -21.0045, 48.2867 Tolongoina, Madagascar, -21.5595, 47.5127 Etrotroka, Madagascar, -22.8885, 47.5880 Ilakatra, Madagascar, -22.3495, 47.6696 Ambila, Madagascar, -22.0029, 47.9721 Marofoty, Madagascar, -22.9348, 43.5408 Ambohitrolomahitsy, Madagascar, -18.7068, 47.6821 Lazarivo, Madagascar, -23.8987, 44.9567 Milanoa, Madagascar, -13.5833, 49.7833 Isoanala, Madagascar, -23.8353, 45.7145 Amboanjo, Madagascar, -22.0041, 47.8564 Befotaka, Madagascar, -14.5306, 48.0241 Tsarahonenana, Madagascar, -15.4785, 48.4727 Antanimora Atsinanana, Madagascar, -24.8152, 45.6613 Ankarongana, Madagascar, -15.4124, 48.9152 Ambondromisotra, Madagascar, -20.3350, 46.9099 Ambohitsimanova, Madagascar, -19.9570, 47.1144 Anosivelo, Madagascar, -22.7371, 47.7803 Manombo Atsimo, Madagascar, -22.9524, 43.4748 Sahamadio, Madagascar, -20.3000, 47.4000 Anosibe-Ifanja, Madagascar, -18.8831, 46.7518 Beahitse, Madagascar, -24.1673, 44.4421 Antsahavaribe, Madagascar, -14.0284, 49.6664 Ambohipihaonana, Madagascar, -19.4333, 47.4167 Mandritsara, Madagascar, -15.8328, 48.8166 Ambolidibe Atsinanana, Madagascar, -15.0980, 48.7898 Sadabe, Madagascar, -18.6164, 47.7098 Dzitbalche, Mexico, 20.3167, -90.0500 Tyrnyauz, Russia, 43.4000, 42.9167 Chapeltique, El Salvador, 13.6333, -88.2667 Ghonchi, Tajikistan, 39.9589, 69.1369 Yangirabot, Uzbekistan, 40.0372, 65.9653 Yangi Mirishkor, Uzbekistan, 38.8514, 65.2778 Santo Antonio do Leverger, Brazil, -15.8656, -56.0767 Hindarx, Azerbaijan, 40.0675, 47.2058 Alauli, India, 25.6440, 86.4065 Peraia, Greece, 40.5000, 22.9250 Naula, India, 25.5535, 86.0636 Santo Tomas de Janico, Dominican Republic, 19.3261, -70.8150 Kakraul, India, 26.3620, 86.0139 Tomas Oppus, Philippines, 10.2500, 124.9800 Itajobi, Brazil, -21.3178, -49.0539 Flowing Wells, United States, 32.2937, -111.0110 Ambalavayal, India, 11.6190, 76.2102 Ban Rawai, Thailand, 7.7851, 98.3316 Analanampotsy, Madagascar, -17.1667, 49.4833 Massapequa Park, United States, 40.6817, -73.4496 Bruckmuhl, Germany, 47.8833, 11.9167 Springfield, United States, 40.6994, -74.3254 Shankar Saraiya, India, 26.5967, 84.8526 Kawai, Japan, 34.5783, 135.7367 Wittenberge, Germany, 53.0000, 11.7500 Laconia, United States, 43.5725, -71.4775 Sikandra, India, 24.9564, 86.0344 Lodwar, Kenya, 3.1167, 35.6000 Burstadt, Germany, 49.6333, 8.4500 Brunico, Italy, 46.7963, 11.9355 Bayt Ummar, West Bank, 31.6233, 35.1045 Beckley, United States, 37.7877, -81.1841 Fortuna, Brazil, -5.7328, -44.1578 Ulubey, Turkey, 40.8761, 37.7406 Verkhnodniprovsk, Ukraine, 48.6561, 34.3283 Arai, Japan, 34.6833, 137.5667 Retiro, Colombia, 6.0572, -75.5025 Srikurmam, India, 18.2718, 84.0064 San Juan Lalana, Mexico, 17.4667, -95.8833 Andranofasika, Madagascar, -16.3351, 46.8433 Zarumilla, Peru, -3.5014, -80.2722 L'Ancienne-Lorette, Canada, 46.8000, -71.3500 Ibitita, Brazil, -11.5469, -41.9778 Koroth, India, 11.5833, 75.7667 Skadovsk, Ukraine, 46.1167, 32.9167 Ramachandrapuran, India, 17.4944, 78.2942 Wath upon Dearne, United Kingdom, 53.5022, -1.3402 Ughara, India, 26.0563, 86.0013 Ahmetli, Turkey, 38.5183, 27.9386 Serafina Corea, Brazil, -28.7119, -51.9350 Yanggezhuang, China, 39.4560, 118.7128 Meltonakkal, India, 8.6341, 76.8521 Bishunpura, India, 26.5436, 84.4364 Teocelo, Mexico, 19.3833, -96.9667 Ricany, Czechia, 49.9919, 14.6556 Santana do Cariri, Brazil, -7.1878, -39.7369 Cercola, Italy, 40.8667, 14.3500 Bou Hanifia el Hamamat, Algeria, 35.3167, -0.0500 Dirba, India, 30.0700, 75.9800 Arroio do Meio, Brazil, -29.4008, -51.9450 Kombai, India, 9.8475, 77.2960 Puerto Caimito, Panama, 8.8739, -79.7157 Rio Linda, United States, 38.6875, -121.4417 Liuchuan, China, 26.6549, 108.5876 Mers el Kebir, Algeria, 35.7286, -0.7069 Octeville, France, 49.6269, -1.6431 Balmazujvaros, Hungary, 47.6167, 21.3500 Perupalem, India, 16.3705, 81.5813 Cottingham, United Kingdom, 53.7822, -0.4136 Hohenems, Austria, 47.3667, 9.6667 Pozoblanco, Spain, 38.3833, -4.8500 Montceau-les-Mines, France, 46.6678, 4.3697 Acoyapa, Nicaragua, 11.9667, -85.1667 Weehawken, United States, 40.7677, -74.0168 Washougal, United States, 45.5825, -122.3451 Garagoa, Colombia, 5.0825, -73.3642 Viroflay, France, 48.8000, 2.1670 San Jose de Chiquitos, Bolivia, -17.8500, -60.7500 Lons-le-Saunier, France, 46.6744, 5.5539 Namyslow, Poland, 51.0728, 17.7069 Truckee, United States, 39.3455, -120.1848 Les Clayes-sous-Bois, France, 48.8167, 1.9833 Chavara Gramam, India, 8.9633, 76.5619 Aranyaprathet, Thailand, 13.6928, 102.5017 Saint Ives, United Kingdom, 52.3344, -0.0761 Boki-Were, Mali, 14.0106, -5.6033 Wondelgem, Belgium, 51.0889, 3.7131 Kottapeta, India, 15.7913, 80.3770 Ashwaubenon, United States, 44.4796, -88.0889 Tibau do Sul, Brazil, -6.1869, -35.0919 Liuguoju, China, 38.2500, 110.3667 Long'e, China, 25.8072, 109.2125 Aubange, Belgium, 49.5667, 5.8050 Dalain Hob, China, 41.9645, 101.0667 Tekanpur, India, 25.9940, 78.2832 Kronach, Germany, 50.2411, 11.3281 Millbrook, United States, 32.5027, -86.3737 Manassas Park, United States, 38.7709, -77.4429 Huruta, Ethiopia, 8.1500, 39.3500 Middletown, United States, 41.5175, -71.2769 Baikatpur, India, 25.4939, 85.3792 Malancha, India, 24.6660, 87.9220 Shingucho-shingu, Japan, 34.9186, 134.5493 Carovigno, Italy, 40.7072, 17.6594 Manor, United States, 30.3562, -97.5227 Stockerau, Austria, 48.3833, 16.2167 Glace Bay, Canada, 46.2000, -59.9667 Sanski Most, Bosnia and Herzegovina, 44.7667, 16.6667 Tobre, Benin, 10.2000, 2.1333 Ait Yaazem, Morocco, 33.7333, -5.5833 Alcantara, Philippines, 9.9715, 123.4047 Rio Bueno, Chile, -40.3167, -72.9667 Penzberg, Germany, 47.7500, 11.3833 Ginatilan, Philippines, 9.6000, 123.3500 Carlopolis, Brazil, -23.4250, -49.7208 Zinapecuaro, Mexico, 19.8603, -100.8275 Mari`, Syria, 36.4826, 37.1971 Masse, Benin, 7.1578, 2.5436 Naranattenvanpatti, India, 9.7233, 77.3099 Nidgundi, India, 16.3583, 75.9310 Sidi Daoud, Algeria, 36.8500, 3.8500 High Blantyre, United Kingdom, 55.7936, -4.0919 Pallikapuzha, India, 8.8412, 76.8007 Ramayampet, India, 18.1166, 78.4298 Dehaqan, Iran, 31.9386, 51.6475 Douar Lamjaara, Morocco, 34.6147, -5.2887 Dazhangzicun, China, 40.6239, 118.1081 Dazhangzi, China, 40.7463, 118.1318 Dhulkot, India, 21.6095, 75.5522 Tubaran, Philippines, 7.7200, 124.1700 Aklanpa, Benin, 8.1684, 2.2320 Fetromby, Madagascar, -18.6333, 48.9000 Plavsk, Russia, 53.7167, 37.2833 Khed, India, 17.7178, 73.3939 Bou Fekrane, Morocco, 33.7667, -5.4833 Nova Petropolis, Brazil, -29.3758, -51.1119 Santa Teresa, Nicaragua, 11.7333, -86.2167 Morteros, Argentina, -30.7000, -62.0000 Ngara, Tanzania, -2.5122, 30.6558 Sao Joao dos Poleiros, Brazil, -5.1000, -43.8500 Soumagne, Belgium, 50.6124, 5.7469 Virapandi, India, 11.1723, 76.9692 Ettaiyapuram, India, 9.1474, 77.9928 Majra, India, 28.6670, 76.4560 Miqiao, China, 35.4991, 108.2949 Amarante, Brazil, -6.2408, -42.8550 Bad Lippspringe, Germany, 51.7833, 8.8167 Windlesham, United Kingdom, 51.3600, -0.6600 Geddes, United States, 43.0762, -76.2252 Azaourisse, Benin, 6.6944, 2.5075 Chambellan, Haiti, 18.5504, -74.3132 Laferriere, Haiti, 18.5712, -74.3309 Pikalevo, Russia, 59.5333, 34.1333 New Milford, United States, 40.9337, -74.0196 Gomec, Turkey, 39.3911, 26.8400 Ziar nad Hronom, Slovakia, 48.5919, 18.8533 Ighram, Algeria, 36.4667, 4.5167 Long Beach, United States, 30.3608, -89.1651 La Quiaca, Argentina, -22.1042, -65.5972 Agaram, India, 10.4433, 77.9485 Boa Vista do Tupim, Brazil, -12.6600, -40.6089 Milledgeville, United States, 33.0874, -83.2414 Bedigoazon, Côte d’Ivoire, 6.5663, -7.7204 Finnentrop, Germany, 51.1667, 7.9667 Lamas, Peru, -6.4167, -76.5333 Canutama, Brazil, -6.5339, -64.3828 Colesberg, South Africa, -30.7167, 25.1000 Hosakote, India, 14.2817, 77.1742 Saran, France, 47.9514, 1.8747 Live Oak, United States, 36.9860, -121.9804 Wyckoff, United States, 40.9989, -74.1676 Nerang, Australia, -27.9902, 153.3358 Japaratuba, Brazil, -10.5933, -36.9403 Nerviano, Italy, 45.5500, 8.9833 Bambara-Maounde, Mali, 15.8503, -2.7847 Damascus, United States, 39.2701, -77.1957 El Segundo, United States, 33.9170, -118.4018 Bakhmach, Ukraine, 51.1831, 32.8297 Kamenz, Germany, 51.2667, 14.1000 Jask, Iran, 25.6531, 57.7817 Alfajayucan, Mexico, 20.4000, -99.3500 Ban Tha Mai I, Thailand, 18.7461, 98.9819 Latifpur, Bangladesh, 24.1283, 90.1398 Sayarpuram, India, 8.6822, 78.0265 Korem, Ethiopia, 12.5000, 39.5167 Rampur Jalalpur, India, 25.6712, 85.8606 Rubano, Italy, 45.4333, 11.7833 Linnei, Taiwan, 23.7591, 120.6184 Lerum, Sweden, 57.7667, 12.2667 Pulimel, India, 9.3000, 76.5833 Madanpur, India, 26.2103, 87.5141 Sao Pedro do Sul, Portugal, 40.7500, -8.0667 Pran Buri, Thailand, 12.3849, 99.9016 Braunstone, United Kingdom, 52.6160, -1.1750 Fiorano Modenese, Italy, 44.5392, 10.8117 Whakatane, New Zealand, -37.9640, 176.9840 Haslingden, United Kingdom, 53.7050, -2.3280 Azeffoun, Algeria, 36.9000, 4.4167 Meiti, India, 24.2477, 94.3031 Boden, Sweden, 65.8333, 21.7000 North Hykeham, United Kingdom, 53.1833, -0.5875 Shahkot, India, 31.0800, 75.3400 Bhawanipur, India, 25.3944, 87.1264 Ain Feka, Algeria, 35.4333, 3.5833 Auburn, United States, 42.1972, -71.8453 Xixinzhuangzhen, China, 37.0165, 111.4908 Vallegrande, Bolivia, -18.4833, -64.1000 Lillerod, Denmark, 55.8687, 12.3458 Acharipallam, India, 8.1700, 77.3698 Tsuiki, Japan, 33.6561, 131.0561 Upper Chichester, United States, 39.8414, -75.4421 Hrubieszow, Poland, 50.8167, 23.8833 Konigstein im Taunus, Germany, 50.1833, 8.4667 Brixham, United Kingdom, 50.3940, -3.5160 Trzcianka, Poland, 53.0500, 16.4667 Aberdeen, United States, 39.5151, -76.1733 Vechur, India, 9.6667, 76.4167 Defiance, United States, 41.2813, -84.3657 Zirara, Morocco, 32.3500, -8.5333 Haslemere, United Kingdom, 51.0900, -0.7120 Achaljamu, India, 24.0243, 85.8306 Orastie, Romania, 45.8500, 23.2000 Hannibal, United States, 39.7098, -91.3939 Yabuki, Japan, 37.2013, 140.3386 Salinas de Hidalgo, Mexico, 22.6280, -101.7156 Gemert, Netherlands, 51.5558, 5.6867 Bhainsoda, India, 24.4427, 75.8403 Makinsk, Kazakhstan, 52.6292, 70.4169 Belle Glade, United States, 26.6916, -80.6656 Asten, Netherlands, 51.4031, 5.7472 Dongjiangshui, China, 33.3787, 104.9516 Kadikkad, India, 10.6667, 75.9667 Mount Dora, United States, 28.8142, -81.6344 Iglino, Russia, 54.8383, 56.4231 Vazhani, India, 10.5917, 76.5333 Bedford, United States, 41.2250, -73.6673 Baronissi, Italy, 40.7500, 14.7800 Minamichita, Japan, 34.7151, 136.9298 Daireaux, Argentina, -36.6000, -61.7500 Kodikulam, India, 9.9932, 79.2007 Mount Vernon, United States, 40.3854, -82.4737 Pinarayi, India, 11.8218, 75.4973 Cerea, Italy, 45.1894, 11.2166 Astara, Azerbaijan, 38.4400, 48.8750 Keetmanshoop, Namibia, -26.5833, 18.1333 Rijen, Netherlands, 51.5920, 4.9168 Busolwe, Uganda, 0.8492, 33.9269 Druzhba, Uzbekistan, 41.2222, 61.3067 Sinuni, Iraq, 36.4680, 41.7105 Beinan, Taiwan, 22.7833, 121.1167 Kaliro, Uganda, 0.8944, 33.4994 Marion, United States, 37.7345, -88.9420 Brackenheim, Germany, 49.0833, 9.0667 Puliyankunnu, India, 9.4120, 76.4100 Bassum, Germany, 52.8494, 8.7267 Marib, Yemen, 15.4606, 45.3261 Mocha, Yemen, 13.3203, 43.2500 Famy, Philippines, 14.4300, 121.4500 Sierre, Switzerland, 46.2918, 7.5320 Roxana, Costa Rica, 10.3586, -83.6738 Kamavarapukota, India, 17.0031, 81.1219 Moraga, United States, 37.8439, -122.1225 San Roque, Colombia, 6.4853, -75.0197 Ashmyany, Belarus, 54.4250, 25.9375 San Francisco, Guatemala, 16.7833, -89.9361 Tromsdalen, Norway, 69.6500, 19.0167 Sao Paulo do Potengi, Brazil, -5.8950, -35.7628 Blanquefort, France, 44.9114, -0.6364 Fazakerley, United Kingdom, 53.4676, -2.9408 Vero Beach, United States, 27.6463, -80.3930 Batuco, Chile, -33.2308, -70.8089 Orta Nova, Italy, 41.3308, 15.7114 Tsundupalle, India, 13.9809, 78.9152 Pionki, Poland, 51.4833, 21.4500 Lgov, Russia, 51.6667, 35.2667 Solothurn, Switzerland, 47.2081, 7.5375 Eggenstein-Leopoldshafen, Germany, 49.0778, 8.3925 Vila Bela da Santissima Trindade, Brazil, -15.0078, -59.9508 Latsia, Cyprus, 35.1000, 33.3667 Buntok, Indonesia, -1.7190, 114.8448 Donna, United States, 26.1468, -98.0559 Connahs Quay, United Kingdom, 53.2180, -3.0570 Posoltega, Nicaragua, 12.5500, -86.9833 Svetlogorsk, Russia, 54.9500, 20.1500 'Ain Abessa, Algeria, 36.3000, 5.2950 Taylor, United States, 30.5729, -97.4268 Saint-Cyr-sur-Loire, France, 47.3990, 0.6673 Masif Sarsink, Iraq, 37.0405, 43.3435 Savastepe, Turkey, 39.3839, 27.6547 Dhobauli, India, 25.4008, 86.1885 Bauria, India, 22.4521, 88.1853 Puerto Carreno, Colombia, 6.1903, -67.4836 Attappampatti, India, 11.4820, 78.0248 Estelle, United States, 29.8447, -90.1021 Egirdir, Turkey, 37.8750, 30.8506 Cestas, France, 44.7453, -0.6811 Young, Uruguay, -32.7000, -57.6333 Newmarket, United Kingdom, 52.2459, 0.4105 Schofield Barracks, United States, 21.4936, -158.0617 El Pinon, Colombia, 10.3333, -74.6667 Nandigaon, India, 17.1190, 78.2564 Bovisio Masciago, Italy, 45.6110, 9.1478 Novomichurinsk, Russia, 54.0500, 39.7167 Djouab, Algeria, 36.1333, 3.4333 San Miguel de Salcedo, Ecuador, -1.0500, -78.5833 Swift Current, Canada, 50.2881, -107.7939 Campo do Brito, Brazil, -10.7333, -37.4933 Kadod, India, 21.2180, 73.2200 Nuevo San Juan Parangaricutiro, Mexico, 19.4000, -102.1333 Shahba, Syria, 32.8524, 36.6285 Thandla, India, 23.0096, 74.5775 Kushima, Japan, 31.4644, 131.2283 Santa Lucia, Uruguay, -34.4525, -56.3964 Agua Clara, Brazil, -20.4500, -52.8667 Vimodrone, Italy, 45.5139, 9.2844 Chinampa de Gorostiza, Mexico, 21.3667, -97.7333 Slany, Czechia, 50.2306, 14.0869 Diksmuide, Belgium, 51.0333, 2.8650 Arakkal, India, 8.9480, 76.8631 Bytow, Poland, 54.1333, 17.5000 Wildwood, United States, 28.7752, -82.0075 Yerbas Buenas, Chile, -35.7500, -71.5667 Preganziol, Italy, 45.6000, 12.2333 Plumstead, United Kingdom, 51.4900, 0.0900 Livinjipuram, India, 8.1535, 77.5719 Pampa, United States, 35.5479, -100.9651 Le Pre-Saint-Gervais, France, 48.8833, 2.4000 Sobrado de Paiva, Portugal, 41.0444, -8.2769 Katav-Ivanovsk, Russia, 54.7500, 58.2167 Dera, Ethiopia, 8.3333, 39.3167 Tengampudur, India, 8.1158, 77.4579 Bek'oji, Ethiopia, 7.5833, 39.3333 Reinheim, Germany, 49.8269, 8.8308 Villeneuve-Loubet, France, 43.6589, 7.1222 Takhatgarh, India, 25.3300, 73.0000 Fullerton, United States, 40.6309, -75.4834 Sendurai, India, 10.3934, 78.2517 Sedan, France, 49.7034, 4.9388 Roche-a-Bateau, Haiti, 18.1818, -74.0034 Hirna, Ethiopia, 9.2167, 41.1000 Cloverly, United States, 39.1064, -76.9995 Lake Mary, United States, 28.7592, -81.3360 Katsuura, Japan, 35.1500, 140.3167 Ponte de Sor, Portugal, 39.2478, -8.0097 Baicoi, Romania, 45.0453, 25.8658 Thale, Germany, 51.7500, 11.0500 Chalala, India, 21.4200, 71.1700 Bridgeview, United States, 41.7403, -87.8067 Holzkirchen, Germany, 47.8833, 11.7000 Iluppur, India, 10.5137, 78.6216 Konodimini, Mali, 13.3264, -6.4231 Fuying, China, 41.0302, 117.7205 Fuyingzicun, China, 40.8754, 117.6978 Vari, Greece, 37.8333, 23.8000 Dour, Belgium, 50.3979, 3.7807 Kodumudi, India, 11.0769, 77.8876 Wurzen, Germany, 51.3667, 12.7167 Elliniko, Greece, 37.8667, 23.7333 Glanerbrug, Netherlands, 52.2150, 6.9742 Klippansbruk, Sweden, 56.1167, 13.1500 Krasnohorivka, Ukraine, 48.0067, 37.5128 Zafra, Spain, 38.4167, -6.4167 Cabeceiras de Basto, Portugal, 41.5167, -8.0000 Pisticci, Italy, 40.3833, 16.5500 Hovelhof, Germany, 51.8167, 8.6500 Waterville, United States, 44.5441, -69.6624 Asadabad, Afghanistan, 34.8742, 71.1528 Saalfelden am Steinernen Meer, Austria, 47.4269, 12.8483 Devizes, United Kingdom, 51.3528, -1.9958 Ibitiara, Brazil, -12.6519, -42.2178 Kattiyeri, India, 11.8764, 75.8542 Balighattam, India, 17.6510, 82.6059 Gikongoro, Rwanda, -2.4723, 29.5815 Costessey, United Kingdom, 52.6602, 1.2161 Porto Acre, Brazil, -9.5878, -67.5328 Churriana de la Vega, Spain, 37.1500, -3.6500 Vammala, Finland, 61.3417, 22.9083 Centerville, United States, 40.9284, -111.8848 Gonegandla, India, 15.7167, 77.6000 Ketama, Morocco, 34.9158, -4.5686 Aston, United States, 39.8719, -75.4349 Pazhayannur, India, 10.6661, 76.4252 Bull Run, United States, 38.7802, -77.5204 Seeheim-Jugenheim, Germany, 49.7500, 8.6500 Piriyapatna, India, 12.3365, 76.0792 Guerande, France, 47.3200, -2.4200 Jilotepec, Mexico, 19.6097, -96.9511 Slavonski Brod, Croatia, 45.1553, 18.0144 Jalpa de Mendez, Mexico, 18.1764, -93.0631 Rotselaar, Belgium, 50.9511, 4.7108 Wellington, United Kingdom, 50.9755, -3.2243 Erumad, India, 11.5681, 76.2608 Nassjo, Sweden, 57.6500, 14.6833 Chestnuthill, United States, 40.9568, -75.4183 Sao Vicente Ferrer, Brazil, -7.5908, -35.4908 Havi Bhauar, India, 26.1091, 86.1059 Vincennes, United States, 38.6759, -87.5102 La Cruz, Colombia, 1.6047, -76.9742 Ostashkov, Russia, 57.1500, 33.1000 Deoria, India, 26.1791, 85.0234 Ocho Rios, Jamaica, 18.4167, -77.1167 Eloy, United States, 32.7470, -111.5992 Muscle Shoals, United States, 34.7432, -87.6343 Chateaurenard, France, 43.8833, 4.8553 Kundal, India, 25.7620, 86.2081 Campagna, Italy, 40.6666, 15.1064 Heidenau, Germany, 50.9833, 13.8667 Sao Caetano de Odivelas, Brazil, -0.7500, -48.0200 Zequ, China, 35.0376, 101.4606 Poing, Germany, 48.1667, 11.8167 La Algaba, Spain, 37.4500, -6.0000 Banstead, United Kingdom, 51.3220, -0.2040 Kumage, Japan, 34.0495, 131.9690 Murehwa, Zimbabwe, -17.6500, 31.7833 Riemst, Belgium, 50.8089, 5.6019 Fillmore, United States, 34.3989, -118.9174 Youngsville, United States, 30.0963, -91.9968 Podalakur, India, 14.3667, 79.7333 Przasnysz, Poland, 53.0167, 20.8833 Douar Bni Ansar, Morocco, 35.1586, -4.9128 Red Wing, United States, 44.5817, -92.6036 Federacion, Argentina, -30.9833, -57.9167 Leopoldshohe, Germany, 52.0167, 8.6914 Kinel'-Cherkassy, Russia, 53.4683, 51.4775 Kruibeke, Belgium, 51.1667, 4.3000 Orsay, France, 48.6993, 2.1875 Kakkalapalle, India, 14.6415, 77.5668 Madrid, Philippines, 9.2619, 125.9647 Whickham, United Kingdom, 54.9460, -1.6761 Grangemouth, United Kingdom, 56.0120, -3.7170 Arani, India, 13.3346, 80.0848 Berber, Sudan, 18.0170, 33.9833 Zvecan, Kosovo, 42.9075, 20.8403 Sidi Ettiji, Morocco, 32.1717, -8.8686 Tawargeri, India, 15.7668, 76.4037 Bogatynia, Poland, 50.9069, 14.9569 Aracagi, Brazil, -6.8528, -35.3808 Ban Na Sai, Thailand, 17.7334, 98.9513 Arenys de Mar, Spain, 41.5819, 2.5503 Khirhar, India, 26.5168, 85.9618 Berea, United States, 34.8802, -82.4650 Chaparral, United States, 32.0442, -106.4060 Keynsham, United Kingdom, 51.4135, -2.4968 Pleszew, Poland, 51.8833, 17.7833 Barangka, Philippines, 14.6297, 121.0803 Itapiranga, Brazil, -27.1689, -53.7119 Shiraoi, Japan, 42.5500, 141.3500 Harborcreek, United States, 42.1498, -79.9501 Myrtle Grove, United States, 30.4158, -87.3027 Ittiva, India, 8.8500, 76.8833 Xiaolongtan, China, 23.7836, 103.1563 Salitre, Brazil, -7.2839, -40.4606 Loxstedt, Germany, 53.4667, 8.6500 Denby Dale, United Kingdom, 53.5720, -1.6550 Regenstauf, Germany, 49.1236, 12.1283 Glen Allen, United States, 37.6660, -77.4838 Beaver Dam, United States, 43.4688, -88.8309 Mullanwala, India, 31.0619, 74.8228 Tadaoka-higashi, Japan, 34.4833, 135.4000 Anisoc, Equatorial Guinea, 1.8500, 10.7667 Tantega, Benin, 10.8500, 1.0333 Tiahounkossi, Benin, 10.8167, 1.0667 San Isidro, Costa Rica, 9.9737, -83.9861 Medicina, Italy, 44.4833, 11.6333 Cleckheaton, United Kingdom, 53.7250, -1.7190 Epitacio Huerta, Mexico, 20.1348, -100.2934 East Greenbush, United States, 42.6122, -73.6969 Pratteln, Switzerland, 47.5185, 7.6928 Micoud, Saint Lucia, 13.8190, -60.9000 Brod, Bosnia and Herzegovina, 45.1333, 17.9833 Marly-le-Roi, France, 48.8675, 2.0947 El Escorial, Spain, 40.5817, -4.1258 Itororo, Brazil, -15.1169, -40.0700 Valu lui Traian, Romania, 44.1650, 28.4550 Piquet Carneiro, Brazil, -5.8039, -39.4178 Bariarpur, India, 25.2920, 86.5710 Banovce nad Bebravou, Slovakia, 48.7186, 18.2581 Ad Dis, Yemen, 14.8833, 49.8667 Thompson, United States, 41.6474, -74.6745 Escoublac, France, 47.2867, -2.3908 Mariestad, Sweden, 58.7050, 13.8280 Verdun, France, 49.1620, 5.3876 Fairburn, United States, 33.5496, -84.5914 Saint-Jean-de-la-Ruelle, France, 47.9139, 1.8745 Bargur, India, 12.5429, 78.3574 Porec, Croatia, 45.2272, 13.5952 Shek Wai Kok, Hong Kong, 22.3753, 114.1237 Khaniadhana, India, 25.0298, 78.1271 Ceadir-Lunga, Moldova, 46.0550, 28.8303 Noordwijkerhout, Netherlands, 52.2667, 4.5000 Farmingville, United States, 40.8390, -73.0404 Clearlake, United States, 38.9589, -122.6330 Ibipeba, Brazil, -11.6408, -42.0108 Mangueirinha, Brazil, -25.9408, -52.1758 Lomas de Sargentillo, Ecuador, -1.8833, -80.0833 Tecolotlan, Mexico, 20.1000, -103.8333 Kozelsk, Russia, 54.0353, 35.7767 Getulio Vargas, Brazil, -27.8900, -52.2278 Dilijan, Armenia, 40.7408, 44.8631 The Mumbles, United Kingdom, 51.5730, -3.9992 Kaatsheuvel, Netherlands, 51.6667, 5.0667 Macetown, New Zealand, -44.8650, 168.8190 Burbaliq, Uzbekistan, 40.3247, 71.3692 Turinsk, Russia, 58.0333, 63.7000 Anamoros, El Salvador, 13.7333, -87.8667 Hilltown, United States, 40.3415, -75.2534 La Vista, United States, 41.1816, -96.0664 San Juan Bautista, Paraguay, -26.6800, -57.1500 Warsaw, United States, 41.2448, -85.8465 Sa Kaeo, Thailand, 13.8206, 102.0589 Soumpi, Mali, 15.8436, -4.3256 Les Herbiers, France, 46.8700, -1.0100 Bijni, India, 26.4959, 90.7030 Eenhana, Namibia, -17.4658, 16.3369 Palmetto Estates, United States, 25.6211, -80.3616 Xinyuan, China, 37.3000, 99.0000 Puerto El Triunfo, El Salvador, 13.2833, -88.5500 Buritama, Brazil, -21.0667, -50.1475 Cidreira, Brazil, -30.1811, -50.2056 N'Goussa, Algeria, 32.1408, 5.3083 Kirchhain, Germany, 50.8167, 8.9167 Lask, Poland, 51.5903, 19.1333 Ham Lake, United States, 45.2545, -93.2039 Ilkhchi, Iran, 37.9373, 45.9790 Ilkhechi, Iran, 37.9358, 45.9794 La Sierpe, Cuba, 21.7606, -79.2433 Mohan Eghu, India, 25.4002, 86.1450 Ippy, Central African Republic, 6.2500, 21.2000 Brentford, United Kingdom, 51.4860, -0.3100 San Giovanni Valdarno, Italy, 43.5644, 11.5328 Pembroke, Canada, 45.8167, -77.1000 Heumen, Netherlands, 51.7656, 5.8433 Barkot, India, 30.8200, 78.2000 Pirque, Chile, -33.6333, -70.5500 Lille, Belgium, 51.2383, 4.8242 Raunheim, Germany, 50.0167, 8.4500 Miyazu, Japan, 35.5333, 135.2000 Paragaticherla, India, 16.2496, 79.9679 Tongluo, Taiwan, 24.4833, 120.7833 Lakhipur, India, 26.2897, 90.2281 Bhai Rupa, India, 30.4311, 75.2206 Placido de Castro, Brazil, -10.2758, -67.1500 Cabaceiras do Paraguacu, Brazil, -12.5358, -39.1908 Ina, Benin, 9.9833, 2.7167 Guaymate, Dominican Republic, 18.5800, -68.9800 Itaquitinga, Brazil, -7.6678, -35.1019 Anazzou, Morocco, 31.6753, -7.2672 Domchanch, India, 24.4748, 85.6921 Indiaroba, Brazil, -11.5189, -37.5119 Coaraci, Brazil, -14.6408, -39.5511 Santa Maria das Barreiras, Brazil, -8.8550, -49.7219 San Gabriel, Mexico, 19.7000, -103.7333 Menomonie, United States, 44.8893, -91.9084 Honefoss, Norway, 60.1667, 10.3000 Middelfart, Denmark, 55.4992, 9.7445 Tichi, Algeria, 36.6667, 5.1667 Bostonia, United States, 32.8189, -116.9480 Straelen, Germany, 51.4500, 6.2667 Marupe, Latvia, 56.9069, 24.0575 Cattolica, Italy, 43.9584, 12.7386 Sujina, Tajikistan, 39.4833, 67.7167 Wentang, China, 23.9918, 112.2868 Kade, Ghana, 6.0939, -0.8360 Odumase, Ghana, 7.3713, -2.3190 Hueytown, United States, 33.4239, -87.0220 Bni Rzine, Morocco, 35.0108, -4.7262 Bogucice, Poland, 50.2668, 19.0397 Ada, United States, 34.7662, -96.6681 Parali, India, 10.8028, 76.5585 Mangrauni, India, 26.3479, 86.0719 Batan, Costa Rica, 10.1041, -83.3529 Segbwema, Sierra Leone, 7.9947, -10.9502 Ledeberg, Belgium, 51.0375, 3.7425 Liangyi, China, 35.2698, 106.0930 Glenmont, United States, 39.0698, -77.0467 Ban Cho Ho, Thailand, 15.0279, 102.1395 Albemarle, United States, 35.3594, -80.1915 Westchester, United States, 41.8492, -87.8906 Rentachintala, India, 16.5525, 79.5533 Thi Tran Ngai Giao, Vietnam, 10.6406, 107.2478 Mapiri, Bolivia, -15.3097, -68.2161 Fort Hunt, United States, 38.7361, -77.0589 San Estanislao, Colombia, 10.4000, -75.1500 Wardenburg, Germany, 53.0617, 8.1967 Pedregulho, Brazil, -20.2569, -47.4767 Kirchlengern, Germany, 52.2000, 8.6331 Gussago, Italy, 45.6000, 10.1500 Puerto Pilon, Panama, 9.3632, -79.7933 Grovetown, United States, 33.4503, -82.2073 Torre Maggiore, Italy, 41.6833, 15.2833 Sunagawa, Japan, 43.5000, 141.9000 Tahlequah, United States, 35.9112, -94.9770 Pamiers, France, 43.1175, 1.6117 Tlacolula de Matamoros, Mexico, 16.9542, -96.4792 Pocking, Germany, 48.4000, 13.3167 Hot Springs Village, United States, 34.6566, -92.9643 Burbage, United Kingdom, 52.5272, -1.3483 Eppelborn, Germany, 49.3833, 6.9667 Cassano al Ionio, Italy, 39.7839, 16.3189 Ciudad Guadalupe Victoria, Mexico, 24.4497, -104.1225 Haji Shah, Pakistan, 33.7500, 72.4000 Langrucun, China, 36.9014, 79.6261 Radford, United States, 37.1229, -80.5587 Sant'Elpidio a Mare, Italy, 43.2295, 13.6861 Morton, United States, 40.6135, -89.4669 Middletown, United States, 39.9094, -75.4311 Sidi Lamine, Morocco, 32.9000, -6.0500 Qarqin, Afghanistan, 37.4128, 66.0472 Qusar, Azerbaijan, 41.4219, 48.4214 Cowley, United Kingdom, 51.7330, -1.2150 Pilappulli, India, 10.7344, 76.7294 Chinde, Mozambique, -18.5833, 36.4667 Al Ghat, Saudi Arabia, 26.0289, 44.9469 Dingyuan, China, 35.9624, 104.0028 Mudakkiraye, India, 9.9500, 76.5500 Amba Icharua, India, 25.6140, 86.4258 Alpignano, Italy, 45.0957, 7.5254 Fleron, Belgium, 50.6167, 5.6833 Shintomi, Japan, 32.0689, 131.4881 Slubice, Poland, 52.3500, 14.5667 Stallings, United States, 35.1088, -80.6598 Luperon, Dominican Republic, 19.9000, -70.9500 Adelfia, Italy, 41.0000, 16.8667 Payson, United States, 34.2433, -111.3195 Jinjicun, China, 22.1696, 112.4812 Jinji, China, 22.1650, 112.4848 Tafresh, Iran, 34.6942, 50.0211 Zapotlan de Juarez, Mexico, 19.9667, -98.8500 La Paz, Philippines, 17.6739, 120.6847 Hebburn, United Kingdom, 54.9720, -1.5130 Ait Youssef Ou Ali, Morocco, 31.9833, -5.7833 Sudak, Ukraine, 44.8514, 34.9725 Kerman, United States, 36.7248, -120.0625 Milanowek, Poland, 52.1167, 20.6500 Moreau, United States, 43.2469, -73.6659 Humble, United States, 29.9921, -95.2655 Chorbogh, Tajikistan, 39.8667, 69.0833 Grimari, Central African Republic, 5.7167, 20.0500 Bobangui, Central African Republic, 4.0500, 18.1167 Kalundborg, Denmark, 55.6820, 11.1004 Rasivarai Tottam, India, 9.9639, 77.1000 Reggello, Italy, 43.6833, 11.5333 Erwitte, Germany, 51.6167, 8.3500 Hanover, United States, 39.8118, -76.9836 Espartinas, Spain, 37.3833, -6.1167 Ervadi, India, 9.2082, 78.7101 Antanambao Mahatsara, Madagascar, -19.3134, 48.7997 Braniewo, Poland, 54.3833, 19.8333 Red Hill, United States, 33.7777, -79.0111 Rajbalhai, India, 22.7758, 88.0054 Sabotsy, Madagascar, -19.2285, 47.6014 Havelock, United States, 34.9078, -76.8987 Maltby, United Kingdom, 53.4260, -1.2100 Ban Lam Narai, Thailand, 15.2039, 101.1308 Forssa, Finland, 60.8167, 23.6250 Enfield Lock, United Kingdom, 51.6686, -0.0260 Barbacoas, Venezuela, 9.4833, -66.9761 Mifune, Japan, 32.7144, 130.8019 Dighaun, India, 25.5549, 86.8097 Ujre, India, 12.9961, 75.3248 Madison, United States, 40.7586, -74.4169 Nytva, Russia, 57.9500, 55.3333 Ban Nong Han, Thailand, 18.9000, 99.0000 Palayat, India, 11.7917, 75.4681 Dahibhat Madhopur, India, 26.2763, 86.0847 Kilwinning, United Kingdom, 55.6550, -4.7030 Loma Plata, Paraguay, -22.3820, -59.8325 Chopadandi, India, 18.5833, 79.1667 White Oak, United States, 39.0451, -76.9885 Mohanur, India, 11.0594, 78.1397 Mannur, India, 9.9083, 76.4583 Oulad Amrane, Morocco, 32.2833, -9.2333 San Casciano in Val di Pesa, Italy, 43.6569, 11.1858 Tuineje, Spain, 28.3250, -14.0486 Nanbu, Japan, 40.4669, 141.3817 Tohoku, Japan, 40.7281, 141.2578 Onega, Russia, 63.9167, 38.0833 Mercedes, United States, 26.1533, -97.9128 Batalha, Brazil, -9.6778, -37.1247 Anori, Colombia, 7.0736, -75.1458 Sakardih, India, 25.2280, 85.3546 Encruzilhada, Brazil, -15.5314, -40.9094 Rakitovo, Bulgaria, 41.9898, 24.0866 Uhersky Brod, Czechia, 49.0250, 17.6472 Nakanoto, Japan, 36.9894, 136.9015 Katosi, Uganda, 0.1528, 32.8014 Pianco, Brazil, -7.1978, -37.9289 Charqueada, Brazil, -22.5097, -47.7781 Ciney, Belgium, 50.2963, 5.1007 Cayetano Germosen, Dominican Republic, 19.3300, -70.4800 Ubrique, Spain, 36.6833, -5.4500 Edmundston, Canada, 47.3765, -68.3253 Kunzelsau, Germany, 49.2833, 9.6833 Hannut, Belgium, 50.6720, 5.0781 Gurh, India, 24.5026, 81.5004 Greenville, Liberia, 5.0167, -9.0333 Lufeng, China, 24.5601, 103.0910 Rajnagar, India, 24.8893, 79.9118 Pupiales, Colombia, 0.8667, -77.6500 Lemay, United States, 38.5325, -90.2845 Rawa Mazowiecka, Poland, 51.7658, 20.2533 Carlet, Spain, 39.2264, -0.5211 Belen, Nicaragua, 11.5000, -85.8833 Vedelago, Italy, 45.6833, 12.0167 Neopolis, Brazil, -10.3200, -36.5794 Boshruyeh, Iran, 33.8681, 57.4286 Gasparillo, Trinidad and Tobago, 10.3167, -61.4167 Three Lakes, United States, 25.6415, -80.4000 San Miguel, Philippines, 11.4920, 119.8710 Peer, Belgium, 51.1330, 5.4530 Adjahome, Benin, 7.0618, 1.8368 Jasper, United States, 38.3933, -86.9402 Batangafo, Central African Republic, 7.3000, 18.3000 Burgdorf, Switzerland, 47.0567, 7.6264 Pelhrimov, Czechia, 49.4314, 15.2233 Marienberg, Germany, 50.6333, 13.1500 Oyten, Germany, 53.0611, 9.0178 Krasnoslobodsk, Russia, 48.7000, 44.5667 Country Club Hills, United States, 41.5636, -87.7251 Ukiah, United States, 39.1464, -123.2105 Curacautin, Chile, -38.4333, -71.8833 Nilaiyur, India, 9.8572, 78.0598 Ambohimanambola, Madagascar, -18.9490, 47.6187 Mauguio, France, 43.6169, 4.0083 Povorino, Russia, 51.2000, 42.2500 Franklin, United States, 39.5954, -75.0190 Lugu, Taiwan, 23.7500, 120.7330 Cajari, Brazil, -3.3208, -45.0108 Tagalft, Morocco, 32.2389, -6.1238 Las Cabezas de San Juan, Spain, 36.9817, -5.9406 Islam Qal`ah, Afghanistan, 34.6667, 61.0667 Portachuelo, Bolivia, -17.3572, -63.3906 Crawfordsville, United States, 40.0428, -86.8976 Baro, India, 25.4487, 85.9924 Wiefelstede, Germany, 53.2581, 8.1172 Westbury, United Kingdom, 51.2600, -2.1910 Pudu, India, 12.8667, 74.9673 South Middleton, United States, 40.1324, -77.1642 Ghouazi, Morocco, 34.4667, -5.3000 Raikal, India, 18.9000, 78.8000 Belem, Brazil, -6.7469, -35.5189 Tabant, Morocco, 31.6581, -6.4200 Mastchoh, Tajikistan, 40.3667, 69.3333 Tufanbeyli, Turkey, 38.2647, 36.2225 Ntungamo, Uganda, -0.8819, 30.2653 Dyer, United States, 41.4977, -87.5090 Port Orchard, United States, 47.5163, -122.6610 Bosobolo, Congo (Kinshasa), 4.1833, 19.9000 Santa Margarida, Brazil, -20.3839, -42.2508 Toro, Colombia, 4.6117, -76.0814 Hatti, India, 16.1984, 76.6604 Mahesh Khunt, India, 25.4500, 86.6333 Passa Quatro, Brazil, -22.3900, -44.9669 Freienbach, Switzerland, 47.2047, 8.7578 Brownsville, United States, 25.8216, -80.2417 Kesath, India, 25.4208, 84.2414 Faxinal, Brazil, -24.0008, -51.3200 Gokavaram, India, 17.2667, 81.8500 Grossostheim, Germany, 49.9167, 9.0833 Buffalo, United States, 45.1794, -93.8644 Nova Resende, Brazil, -21.1258, -46.4200 Bou Hadjar, Algeria, 36.5031, 8.1053 Khargapur, India, 24.8230, 79.1440 Libiaz, Poland, 50.1000, 19.3167 Karema, Tanzania, -6.8205, 30.4389 Khirpai, India, 22.7000, 87.6200 Linbian, Taiwan, 22.4333, 120.5167 Mastic Beach, United States, 40.7664, -72.8369 Westport, United States, 41.5886, -71.0837 Puan, Argentina, -37.5500, -62.7667 Zhongzai, China, 26.6877, 105.6548 Oued Jdida, Morocco, 33.9333, -5.3667 Taohongpozhen, China, 36.9854, 111.4737 Malnate, Italy, 45.8000, 8.8833 Caridade, Brazil, -4.2319, -39.1928 Bad Essen, Germany, 52.3214, 8.3400 Panukulan, Philippines, 14.9300, 121.8200 Petersberg, Germany, 50.5667, 9.7167 Aki, Japan, 33.5000, 133.9000 Angara-Debou, Benin, 11.3289, 3.0406 Vienna, United States, 38.8996, -77.2597 Piru, Indonesia, -3.0811, 128.1411 Zitorada, Serbia, 43.1833, 21.7167 Kingsborough, South Africa, -30.0833, 30.8667 North Arlington, United States, 40.7874, -74.1273 East Longmeadow, United States, 42.0597, -72.4990 Hampton, United States, 42.9391, -70.8370 Barra de Santo Antonio, Brazil, -9.4000, -35.5000 Phirangipuram, India, 16.2889, 80.2628 Erba, Italy, 45.8067, 9.2269 Lake Wales, United States, 27.9195, -81.5961 San Juan, Philippines, 9.1590, 123.4940 Sebt Ait Saghiouchen, Morocco, 34.0122, -4.5536 Bagnacavallo, Italy, 44.4169, 11.9761 Juchique de Ferrer, Mexico, 19.8333, -96.7000 Arteche, Philippines, 12.2694, 125.3712 Fujioka, Japan, 35.1500, 138.6167 Northbridge, United States, 42.1300, -71.6547 Apostolove, Ukraine, 47.6594, 33.7167 Jussara, Brazil, -11.0469, -41.9689 Usgao, India, 15.4333, 74.0667 Nunna, India, 16.5760, 80.6850 Mahalandi, India, 24.0738, 88.1214 Chettinayakkanpatti, India, 10.3940, 77.9754 Bilohirsk, Ukraine, 45.0544, 34.6022 Jambalo, Colombia, 2.8500, -76.3167 Sulzbach, Germany, 49.2833, 7.0667 Cosautlan, Mexico, 19.3333, -96.9833 Nova Olimpia, Brazil, -14.7969, -57.2878 General Arenales, Argentina, -34.2833, -61.2833 Barnia, India, 23.7311, 88.3917 Rolleston, New Zealand, -43.5960, 172.3830 Bykhaw, Belarus, 53.5167, 30.2500 River Falls, United States, 44.8609, -92.6247 Chickasha, United States, 35.0409, -97.9474 Central, Brazil, -11.1542, -42.0814 Chinacota, Colombia, 7.6167, -72.6000 Wemmel, Belgium, 50.9078, 4.3067 Galivedu, India, 14.0333, 78.5000 Kakching, India, 24.6085, 94.0029 Ban Thung Tam Sao, Thailand, 6.9476, 100.3675 Schmelz, Germany, 49.4167, 6.8333 Huong Canh, Vietnam, 21.2833, 105.6500 Stone Ridge, United States, 38.9294, -77.5557 Kargil, India, 34.5594, 76.1256 Vadugappatti, India, 10.1036, 77.5731 Lady Lake, United States, 28.9241, -81.9299 Villa San Jose, Argentina, -32.2000, -58.2167 La Falda, Argentina, -31.0833, -64.5000 Ouled Chebel, Algeria, 36.6000, 3.0000 Sahatavy, Madagascar, -17.4514, 48.9984 Mattoon, United States, 39.4774, -88.3623 Baipingshan, China, 26.1960, 106.5500 Bouarouss, Morocco, 34.3667, -4.8167 Sunnyside, United States, 46.3157, -120.0058 Sananduva, Brazil, -27.9497, -51.8067 Shuzenji, Japan, 34.9717, 138.9304 Landerneau, France, 48.4517, -4.2481 Boskoop, Netherlands, 52.0667, 4.6500 Bree, Belgium, 51.1414, 5.5980 Yoshinogari, Japan, 33.3211, 130.3989 Elsen, Germany, 51.7333, 8.6833 Shpola, Ukraine, 48.9997, 31.3922 Benetuser, Spain, 39.4250, -0.3961 Bad Bentheim, Germany, 52.3031, 7.1597 Kierspe, Germany, 51.1333, 7.5667 Bargteheide, Germany, 53.7167, 10.2667 Santomera, Spain, 38.0617, -1.0492 Bandar Murcaayo, Somalia, 11.6833, 50.4500 Guelendeng, Chad, 10.9183, 15.5486 Tukums, Latvia, 56.9688, 23.1535 Wallisellen, Switzerland, 47.4150, 8.5967 Altena, Germany, 51.3000, 7.6667 Ac-cahrij, Morocco, 31.8000, -7.1400 Yuvileine, Ukraine, 48.5531, 39.1742 Brakel, Germany, 51.7167, 9.1833 Ahfir, Morocco, 34.9514, -2.1025 Ban Wang Nok Aen, Thailand, 16.8300, 100.4800 Xianxi, Taiwan, 24.1334, 120.4589 Changji, China, 26.9631, 108.7331 Khunti Dhanaili, India, 25.9376, 87.3790 Saraland, United States, 30.8479, -88.1004 Hude, Germany, 53.1111, 8.4625 Moroto, Uganda, 2.5300, 34.6700 Lyantonde, Uganda, -0.4069, 31.1575 Leini, Italy, 45.1846, 7.7133 Birstall, United Kingdom, 53.7320, -1.6600 Noniya, India, 26.6763, 84.6163 Umbertide, Italy, 43.3056, 12.3366 Shuili, Taiwan, 23.7989, 120.8553 Tremedal, Brazil, -14.9758, -41.4108 Kodala, India, 19.6243, 84.9408 Merchtem, Belgium, 50.9667, 4.2333 Inza, Russia, 53.8500, 46.3500 Arachchalur, India, 11.1627, 77.7007 Sohtha, India, 25.6449, 87.3068 Malhipur, India, 25.4069, 86.0234 Al Mahwit, Yemen, 15.4694, 43.5453 Bacuri, Brazil, -1.7028, -45.1339 Acarape, Brazil, -4.2242, -38.7083 Saltash, United Kingdom, 50.4080, -4.2120 Barharwa Kalan, India, 26.5434, 84.8286 Sao Francisco do Guapore, Brazil, -12.0522, -63.5675 Birsinghpur, India, 24.7981, 80.9739 Halver, Germany, 51.1833, 7.4667 Noria de Angeles, Mexico, 22.4433, -101.9097 Dungannon, United Kingdom, 54.5000, -6.7700 Pearl River, United States, 41.0615, -74.0047 Colle Salvetti, Italy, 43.6000, 10.4833 Yorkton, Canada, 51.2139, -102.4628 Raposos, Brazil, -19.9669, -43.8039 Kabo, Central African Republic, 7.6994, 18.6292 Omalur, India, 11.7450, 78.0470 Zumarraga, Philippines, 11.6390, 124.8410 Utinga, Brazil, -12.0819, -41.0939 Domoni, Comoros, -12.2586, 44.5303 Ocean Pointe, United States, 21.3145, -158.0289 Kassorola, Mali, 12.7556, -4.9742 Berriche, Algeria, 35.9167, 7.3833 Ripon, United Kingdom, 54.1361, -1.5236 Nawnghkio, Burma, 22.3167, 96.8000 Hoganas, Sweden, 56.1960, 12.5769 Queensbury, United Kingdom, 53.7683, -1.8453 Madukkur, India, 10.4800, 79.4000 San Dionisio, Nicaragua, 12.7500, -85.8500 Sabana de La Mar, Dominican Republic, 19.0700, -69.3900 Nobsa, Colombia, 5.7667, -72.9500 Martinsicuro, Italy, 42.8851, 13.9160 Simaria, India, 24.7950, 81.1520 Zvenyhorodka, Ukraine, 49.0697, 30.9678 Al Lataminah, Syria, 35.3215, 36.6229 Stahnsdorf, Germany, 52.3922, 13.2167 San Antonio Oeste, Argentina, -40.7333, -64.9500 Mountain Home, United States, 43.1324, -115.6970 Momil, Colombia, 9.2333, -75.6833 Acahay, Paraguay, -25.9141, -57.1133 Yotoco, Colombia, 3.8667, -76.3833 Brus, Serbia, 43.3836, 21.0336 Taishacho-kizukikita, Japan, 35.3867, 132.6902 Ladson, United States, 33.0093, -80.1078 Tiverton, United States, 41.6090, -71.1741 Jagdispur, India, 22.6500, 88.2900 Milford, United States, 42.8178, -71.6736 Taio, Brazil, -27.1158, -49.9978 Kasumi, Japan, 35.6333, 134.6333 Fairview Heights, United States, 38.5974, -90.0053 Bellevue, United States, 44.4592, -87.9550 Ispica, Italy, 36.7833, 14.9167 Asni, Morocco, 31.2500, -7.9833 Antsahanoro, Madagascar, -14.8369, 50.1389 Goundam, Mali, 16.4144, -3.6708 Radzionkow Nowy, Poland, 50.3833, 18.8833 Naama, Algeria, 33.2622, -0.3144 Ambalabe, Madagascar, -15.1644, 50.4205 Llanquihue, Chile, -41.2581, -73.0086 Kings Park, United States, 40.8881, -73.2475 Montalvo, Ecuador, -1.7900, -79.2875 Benjamin Aceval, Paraguay, -24.9974, -57.5524 Eghezee, Belgium, 50.5925, 4.9104 Bikou, China, 32.7489, 105.2408 Wendelstein, Germany, 49.3536, 11.1483 Alcaniz, Spain, 41.0511, -0.1336 Forks, United States, 40.7358, -75.2211 Jalalpur, India, 20.9491, 72.9136 Az Zaydiyah, Yemen, 15.3292, 43.0094 Dickson, United States, 36.0637, -87.3665 Carhue, Argentina, -37.1796, -62.7601 Ransiki, Indonesia, -1.5000, 134.1667 Progreso, Uruguay, -34.6650, -56.2194 Hewitt, United States, 31.4520, -97.1960 Manamelkudi, India, 10.0419, 79.2300 Targu Secuiesc, Romania, 45.9969, 26.1406 Poplar Bluff, United States, 36.7632, -90.4135 Burrillville, United States, 41.9706, -71.6984 Balasamudram, India, 10.4190, 77.4992 Cheran, India, 25.3610, 85.5421 Beni Zouli, Morocco, 30.4839, -5.8619 San Sebastian Tutla, Mexico, 17.0667, -96.6667 Longchang, China, 27.6627, 105.7881 Khirbat Ghazalah, Syria, 32.7338, 36.2046 Stepney, United Kingdom, 51.5152, -0.0462 Mukhtarpur Salkani, India, 25.6643, 85.7784 Kota, India, 14.0333, 80.0500 Fiano Romano, Italy, 42.1667, 12.6000 Massakory, Chad, 13.0000, 15.7333 Bethlehem, South Africa, -28.2240, 28.3110 Garou, Benin, 11.8053, 3.4739 Tadikalapudi, India, 16.5356, 81.1033 San Martino Buon Albergo, Italy, 45.4167, 11.1000 Nizhnyaya Salda, Russia, 58.0667, 60.7167 Cangandala, Angola, -9.7833, 16.4333 Welby, United States, 39.8403, -104.9655 Sikeston, United States, 36.8854, -89.5877 Jicin, Czechia, 50.4367, 15.3517 Griffith, United States, 41.5277, -87.4239 La Grange, United States, 41.6787, -73.8029 Restrepo, Colombia, 3.8250, -76.5250 Freiberg am Neckar, Germany, 48.9333, 9.2000 Sainte-Luce-sur-Loire, France, 47.2503, -1.4856 Mindelheim, Germany, 48.0333, 10.4667 Bois-d'Arcy, France, 48.8000, 2.0300 El Penol, Colombia, 6.2186, -75.2433 Giaveno, Italy, 45.0420, 7.3520 Oteapan, Mexico, 18.0000, -94.6667 Palma Campania, Italy, 40.8667, 14.5500 Yunshan, China, 34.7610, 105.7915 Oyamazaki, Japan, 34.9028, 135.6883 Turgutalp, Turkey, 39.1833, 27.5833 Neratovice, Czechia, 50.2594, 14.5178 Cotorra, Colombia, 9.0500, -75.8000 Ikast, Denmark, 56.1367, 9.1600 Kabugao, Philippines, 18.0239, 121.1833 Vitthalapuram, India, 8.6833, 77.8292 Petrovsk-Zabaykal'skiy, Russia, 51.2667, 108.8333 Readington, United States, 40.5822, -74.7796 Westwood, United States, 42.2202, -71.2106 Guben, Germany, 51.9533, 14.7167 Ait Faska, Morocco, 31.5058, -7.7161 Al Hibah, Egypt, 28.8000, 30.9167 Basford, United Kingdom, 52.9780, -1.1690 Alsfeld, Germany, 50.7511, 9.2711 eMuziwezinto, South Africa, -30.3167, 30.6667 Singhwara, India, 26.1842, 85.7368 West Norriton, United States, 40.1308, -75.3794 Altinopolis, Brazil, -21.0231, -47.3728 Santa Anita, Mexico, 30.5118, -111.1234 Eilenburg, Germany, 51.4608, 12.6358 Porumamilla, India, 15.0167, 78.9833 Silute, Lithuania, 55.3500, 21.4833 Do`stobod, Uzbekistan, 40.8564, 68.9281 Vodil, Uzbekistan, 40.1789, 71.7297 Handlova, Slovakia, 48.7272, 18.7619 Xiangjiaba, China, 28.5627, 104.3461 Gokarna, India, 24.0541, 88.1176 San Pedro de Lloc, Peru, -7.4167, -79.5000 Taree, Australia, -31.9000, 152.4500 Khutauna, India, 26.4969, 86.3959 Llantwit Fardre, United Kingdom, 51.5578, -3.3341 Saraikela, India, 22.6996, 85.9313 Izamal, Mexico, 20.9314, -89.0178 Brzesko, Poland, 49.9667, 20.6167 Bandora, India, 15.4082, 73.9813 Kozienice, Poland, 51.5833, 21.5667 Osmaneli, Turkey, 40.3500, 30.0167 Aguas de Lindoia, Brazil, -22.4758, -46.6328 Rosu, Romania, 44.4509, 26.0083 Bileh Savar, Iran, 39.3794, 48.3542 Kanhauli Manohar, India, 25.9755, 84.6853 Preetz, Germany, 54.2367, 10.2822 Tocantins, Brazil, -21.1750, -43.0178 Sulphur Springs, United States, 33.1421, -95.6122 Attur, India, 8.3224, 77.2558 Ampahimanga, Madagascar, -19.1046, 47.2004 Alegria, Philippines, 9.4667, 125.5767 Itahri, India, 25.3130, 86.5459 Aruvapalam, India, 9.1833, 76.8500 Castellaneta, Italy, 40.6333, 16.9333 Harenkarspel, Netherlands, 52.7300, 4.7500 Bruggen, Germany, 51.2417, 6.1822 Chotala, India, 29.7808, 74.5226 Shimanovsk, Russia, 52.0000, 127.7000 Grosse Pointe Woods, United States, 42.4366, -82.8987 Aguadulce, Spain, 36.7642, -2.6147 Riversdale, South Africa, -34.0969, 21.2622 Ganeshpur, India, 25.7678, 87.3587 Segoubougou, Mali, 13.3481, -6.3889 Monte Carmelo, Venezuela, 9.1875, -70.8131 Chorfa, Algeria, 36.3617, 4.3308 As Sukhnah, Syria, 34.8853, 38.8711 Ivanava, Belarus, 52.1333, 25.5500 Huarmey, Peru, -10.0686, -78.1603 Maardu, Estonia, 59.4781, 25.0161 Four Corners, United States, 44.9290, -122.9732 Banora Point, Australia, -28.2167, 153.5333 Kotoura, Japan, 35.5000, 133.7000 Moulay Bousselham, Morocco, 34.8786, -6.2933 Bingawan, Philippines, 11.2300, 122.5700 Kirsanov, Russia, 52.6500, 42.7333 Ranong, Thailand, 9.9619, 98.6389 Erlensee, Germany, 50.1333, 8.9333 Grossenkneten, Germany, 52.9500, 8.2667 Wendlingen am Neckar, Germany, 48.6747, 9.3817 Baharu, India, 22.2040, 88.4283 Knemis Dades, Morocco, 31.3090, -6.0280 Kamyzyak, Russia, 46.1167, 48.0833 Pujili, Ecuador, -0.9500, -78.6900 Ramnagar, India, 26.0773, 86.8387 Roznov pod Radhostem, Czechia, 49.4586, 18.1431 Caldera, Chile, -27.0667, -70.8333 Pielisjarvi, Finland, 63.3000, 30.0500 Agiripalle, India, 16.6833, 80.6500 Al Awjam, Saudi Arabia, 26.5632, 49.9433 Ban Kao, Thailand, 13.8667, 99.1500 Markranstadt, Germany, 51.3017, 12.2211 Castenaso, Italy, 44.5097, 11.4706 Rygge, Norway, 59.3747, 10.7147 Svatove, Ukraine, 49.4150, 38.1550 Kittur, India, 15.5993, 74.7879 Venustiano Carranza, Mexico, 16.3294, -92.5625 Voss, Norway, 60.7025, 6.4231 Tyldesley, United Kingdom, 53.5166, -2.4667 Caravaggio, Italy, 45.4978, 9.6431 Springfield, Canada, 49.9292, -96.6939 Sylvan Lake, Canada, 52.3083, -114.0964 Mafune, Mali, 12.7847, -4.3597 Trindade, Sao Tome and Principe, 0.3000, 6.6833 Parma, United States, 43.2651, -77.7968 Upala, Costa Rica, 10.8645, -84.9942 Port-de-Bouc, France, 43.4058, 4.9892 Santa Cruz Mulua, Guatemala, 14.5833, -91.6167 Lithia Springs, United States, 33.7811, -84.6487 Punta Umbria, Spain, 37.1667, -6.9500 East Barnet, United Kingdom, 51.6430, -0.1630 Grandville, United States, 42.9004, -85.7564 Cerro Azul, Brazil, -24.8239, -49.2608 Jaypul, India, 22.7833, 88.5695 Los Muermos, Chile, -41.4000, -73.4833 Hermitage, United States, 41.2305, -80.4413 Bishop Auckland, United Kingdom, 54.6630, -1.6760 Noale, Italy, 45.5501, 12.0709 Quarteira, Portugal, 37.0695, -8.1006 Upton, United Kingdom, 53.3850, -3.0990 Bang Phae, Thailand, 13.6916, 99.9298 'Ain Babouche, Algeria, 35.9411, 7.1856 Yeni Suraxani, Azerbaijan, 40.4303, 50.0360 Jakkampalaiyam, India, 10.5264, 77.2884 Schluchtern, Germany, 50.3500, 9.5167 Chennur, India, 14.5667, 78.8000 Center Point, United States, 33.6447, -86.6852 Segou, Benin, 6.6167, 2.2167 Fort Drum, United States, 44.0450, -75.7845 Janakkala, Finland, 60.9167, 24.6500 Rustampur, India, 25.5700, 85.3061 Bumpe, Sierra Leone, 7.8921, -11.9054 Simcoe, Canada, 42.8376, -80.3073 Math Lohiyar, India, 26.6247, 84.7072 Kamayakkavundanpatti, India, 9.7386, 77.3200 Ustron, Poland, 49.7194, 18.8119 Golhisar, Turkey, 37.1408, 29.5075 Douglas, United States, 31.3602, -109.5394 Subachoque, Colombia, 4.9281, -74.1736 Ripon, United States, 37.7417, -121.1310 Sultanabad, India, 18.5247, 79.2722 Kujwa, Korea, South, 33.5025, 126.7944 Parrita, Costa Rica, 9.5471, -84.3464 Abiy Adi, Ethiopia, 13.6231, 39.0017 Ambarakaraka, Madagascar, -13.5088, 48.8484 Gubin, Poland, 51.9500, 14.7167 Bals, Romania, 44.3500, 24.0994 Jalalabad, India, 29.5972, 78.3153 Aghbal, Morocco, 34.9394, -2.1272 Medjana, Algeria, 36.1333, 4.6667 Verneuil-sur-Seine, France, 48.9806, 1.9747 Chaona, China, 35.1000, 107.2167 Cherukunnu, India, 12.0041, 75.3004 Bahce, Turkey, 37.2000, 36.5833 Azalea Park, United States, 28.5473, -81.2956 Duxbury, United States, 42.0465, -70.7139 Gardendale, United States, 33.6677, -86.8069 Khusropur, India, 25.4817, 85.3849 Tarqui, Colombia, 2.1106, -75.8231 Svitavy, Czechia, 49.7556, 16.4694 El Ach, Algeria, 35.9500, 4.6833 Diabigue, Mali, 15.1528, -9.3228 Pilkha, India, 23.1645, 83.1821 Bakarpur Ogairah, India, 25.3294, 87.5138 Nonantola, Italy, 44.6777, 11.0430 Bovolone, Italy, 45.2500, 11.1333 Frogn, Norway, 59.6989, 10.6553 Canudos, Brazil, -9.9044, -39.1415 Kajur, India, 24.8768, 85.2920 Easthampton, United States, 42.2651, -72.6720 Surappalli, India, 11.7187, 77.8778 Nowogard, Poland, 53.6667, 15.1167 Panajachel, Guatemala, 14.7406, -91.1594 Hibbing, United States, 47.3980, -92.9486 North Fayette, United States, 40.4204, -80.2245 Chinggil, China, 46.6673, 90.3786 Montbrison, France, 45.6083, 4.0658 Birhana, India, 25.4489, 85.7054 Exeter, United States, 42.9901, -70.9646 Jacupiranga, Brazil, -24.6925, -48.0022 Opa-locka, United States, 25.8997, -80.2551 Glasgow, United States, 39.6015, -75.7473 Ubata, Brazil, -14.2139, -39.5228 Hazro, Turkey, 38.2561, 40.7831 Anantapalle, India, 16.9767, 81.4442 Nyahanga, Tanzania, -2.3829, 33.5500 Johnstone, United Kingdom, 55.8346, -4.5027 Chai Prakan, Thailand, 19.7322, 99.1403 Aurahi, India, 26.1895, 87.3372 Aquitania, Colombia, 5.5833, -72.8333 Hajdunanas, Hungary, 47.8500, 21.4333 Ottur, India, 8.7167, 76.7667 Horodok, Ukraine, 49.7833, 23.6444 Viskovo, Croatia, 45.3759, 14.3789 Fatipura, India, 22.8383, 74.2313 Ottakkadai, India, 9.9580, 78.1886 Gavrilov-Yam, Russia, 57.3167, 39.8500 Rumilly, France, 45.8758, 5.9447 Banigbe, Benin, 6.9000, 2.6500 Gaillac, France, 43.9014, 1.8992 Novoukrainka, Ukraine, 48.3231, 31.5242 Vaureal, France, 49.0353, 2.0328 Kolluru, India, 16.1847, 80.7961 Ramewadi, India, 16.0333, 74.3500 Owase, Japan, 34.0708, 136.1910 Wohlen, Switzerland, 47.3506, 8.2778 Santiago Tulantepec, Mexico, 20.0397, -98.3575 Mecheraa Asfa, Algeria, 35.3839, 1.0533 Shahpur, India, 23.8937, 79.0507 Olecko, Poland, 54.0333, 22.5000 Hugo, United States, 45.1671, -92.9588 Federal, Argentina, -30.9500, -58.8000 Dalachi, China, 36.6383, 105.0122 Domont, France, 49.0283, 2.3275 Kalanjur, India, 9.1167, 76.8500 Tankal, Philippines, 8.0000, 124.0000 Dyersburg, United States, 36.0465, -89.3777 Bhiloda, India, 23.4600, 73.1500 Quiindy, Paraguay, -25.9725, -57.2382 Yaojia, China, 28.4547, 109.1831 Fussen, Germany, 47.5667, 10.7000 Lere, Mali, 15.7117, -4.9117 Mennecy, France, 48.5661, 2.4369 Makhu, India, 31.1033, 74.9963 East Highland Park, United States, 37.5770, -77.3865 Fartura, Brazil, -23.3883, -49.5100 Ain Taoujdat, Morocco, 33.9333, -5.2167 Vontimitta, India, 14.3833, 79.0333 Safo, Mali, 12.7675, -7.9236 Sultonobod, Tajikistan, 38.4500, 68.9500 Tachiarai, Japan, 33.3722, 130.6225 Badshahpur, India, 28.3930, 77.0480 Baleyara, Niger, 13.7841, 2.9515 Sulechow, Poland, 52.0833, 15.6167 Mount Pleasant, United States, 33.1586, -94.9727 Serarou, Benin, 9.5833, 2.6500 Mikkabi, Japan, 34.8031, 137.5561 Gatesville, United States, 31.4445, -97.7317 Cenovi, Dominican Republic, 19.2500, -70.3700 Strathroy, Canada, 42.9558, -81.6226 Ayyampalaiyam, India, 10.2253, 77.7485 Darien, Colombia, 3.9167, -76.6667 Southern Pines, United States, 35.1927, -79.4039 Middle Smithfield, United States, 41.0918, -75.1031 Saint-Leu-la-Foret, France, 49.0175, 2.2472 Sivapuram, India, 11.9075, 75.6048 Berezan, Ukraine, 50.3197, 31.4700 Telfs, Austria, 47.2833, 11.0667 Mayilur, India, 9.9420, 76.6395 Al Hazm, Yemen, 16.1642, 44.7767 Artesia, United States, 33.8676, -118.0805 Niceville, United States, 30.5290, -86.4748 Saint-Amand-les-Eaux, France, 50.4486, 3.4281 Scordia, Italy, 37.3000, 14.8500 Agudo, Brazil, -29.6450, -53.2400 Ranohira, Madagascar, -22.4842, 45.3942 Tourlaville, France, 49.6417, -1.5775 Penugonda, India, 16.6547, 81.7445 Qarabulaq, Kazakhstan, 44.9089, 78.4922 Senkaya, Turkey, 40.5619, 42.3464 North Strabane, United States, 40.2279, -80.1488 Worcester Park, United Kingdom, 51.3752, -0.2390 Kayanna, India, 11.4917, 75.8417 Mahavelona, Madagascar, -18.5138, 47.2546 Samarate, Italy, 45.6167, 8.7833 St. Simons, United States, 31.1775, -81.3857 Ciudad de Huitzuco, Mexico, 18.3000, -99.3500 Floral Park, United States, 40.7227, -73.7029 Lynden, United States, 48.9502, -122.4545 Cajueiro, Brazil, -9.3967, -36.1536 Az Zintan, Libya, 31.9306, 12.2483 Dublin, United States, 32.5360, -82.9280 Zeulenroda, Germany, 50.6486, 11.9806 Hayden, United States, 47.7680, -116.8040 Wolf Trap, United States, 38.9395, -77.2842 Qazyan, Azerbaijan, 40.4302, 47.6779 South Houston, United States, 29.6611, -95.2285 Rahon, India, 31.0527, 76.1191 Marahom, India, 33.8303, 75.0832 Girua, Brazil, -28.0278, -54.3500 Hayange, France, 49.3300, 6.0628 Locarno, Switzerland, 46.1664, 8.7997 Ascheberg, Germany, 51.7889, 7.6200 Aue, Germany, 50.5881, 12.7006 Ya`bad, West Bank, 32.4457, 35.1682 Myrza-Ake, Kyrgyzstan, 40.7529, 73.4153 Marbach am Neckar, Germany, 48.9333, 9.2500 Bracebridge, Canada, 45.0333, -79.3000 Santa Ana, Honduras, 13.9296, -87.2733 Satiro Dias, Brazil, -11.6000, -38.6000 Menzelinsk, Russia, 55.7333, 53.1167 Urucara, Brazil, -2.5358, -57.7600 Breisach am Rhein, Germany, 48.0333, 7.5833 Rani Shakarpura, India, 25.5534, 86.2992 South River, United States, 40.4455, -74.3783 Sapatgram, India, 26.3373, 90.1236 Utnur, India, 19.3667, 78.7667 Kumaranallur, India, 9.6167, 76.5833 Highland Village, United States, 33.0897, -97.0615 Pewaukee, United States, 43.0701, -88.2412 Sughrain, India, 25.7460, 86.3250 Sidi Azzouz, Morocco, 31.7600, -7.6600 El Rosario, Mexico, 22.9922, -105.8572 Asarcik, Turkey, 41.0314, 36.2683 Summerside, Canada, 46.4000, -63.7833 Longji, China, 25.7317, 110.0631 Asara, India, 29.2494, 77.2915 Dandu Mailaram, India, 17.2333, 78.7667 Al Mazar ash Shamali, Jordan, 32.4725, 35.7928 Tsiningia, Madagascar, -15.4784, 47.4553 Antindra, Madagascar, -14.1337, 49.8131 Andapafito, Madagascar, -16.9147, 49.3762 Vohilengo, Madagascar, -22.5438, 47.6944 Manompana, Madagascar, -16.6871, 49.7385 Bevonotra, Madagascar, -14.0730, 49.6093 Betanty, Madagascar, -25.5666, 45.5272 Mandrosonoro, Madagascar, -20.5879, 45.9832 Ankazondandy, Madagascar, -18.6975, 47.7966 Androrangavola, Madagascar, -20.5292, 48.2371 Fiadanana, Madagascar, -20.8740, 47.1767 Alarobia, Madagascar, -18.9684, 47.7352 Inanantonana, Madagascar, -19.6489, 46.6193 Ambalatany, Madagascar, -22.5364, 47.5881 Andemaka, Madagascar, -22.2779, 47.7522 Vohiposa, Madagascar, -20.9925, 47.1623 Anjangoveratra, Madagascar, -14.1378, 50.0583 Leanja, Madagascar, -15.5430, 47.9186 Fenoarivo, Madagascar, -23.1246, 47.5686 Fenoarivo, Madagascar, -20.8688, 46.8754 Bekitro, Madagascar, -24.5503, 45.2991 Ambohibe, Madagascar, -17.4346, 49.1069 Tangainony, Madagascar, -22.6945, 47.7444 Antsenavolo, Madagascar, -21.3904, 48.0465 Analila, Madagascar, -14.4540, 49.0474 Mangabe, Madagascar, -16.7167, 46.8167 Baltit, Pakistan, 36.3330, 74.6660 Tullinge, Sweden, 59.2000, 17.8833 Kafia Kingi, South Sudan, 9.2734, 24.4170 San Ignacio, El Salvador, 14.3333, -89.1833 Manafwa, Uganda, 0.9564, 34.2844 Buwama, Uganda, 0.0633, 32.1064 Sardoba, Uzbekistan, 40.5422, 68.4125 Ishtixon Shahri, Uzbekistan, 39.9664, 66.4861 Mong Duong, Vietnam, 21.0553, 107.3431 Bethulie, South Africa, -30.4667, 25.9667 Troutdale, United States, 45.5372, -122.3955 Watrap, India, 9.6353, 77.6389 Lower Salford, United States, 40.2639, -75.3929 La Grange, United States, 41.8072, -87.8741 Marco Island, United States, 25.9330, -81.6993 Chilgazi, Tajikistan, 40.1500, 70.7333 Zemrane, Morocco, 31.6700, -7.4400 Iziaslav, Ukraine, 50.1167, 26.8000 Walldorf, Germany, 49.3000, 8.6500 Neriyamangalam, India, 10.0531, 76.7399 Dengka, China, 34.0587, 103.2074 Dianga, China, 34.0636, 103.2136 Bay Village, United States, 41.4851, -81.9317 Usharal, Kazakhstan, 46.1697, 80.9394 Caidat Sidi Boubker El Haj, Morocco, 34.9148, -6.0735 Seven Oaks, United States, 34.0475, -81.1435 Canmore, Canada, 51.0890, -115.3590 East Finchley, United Kingdom, 51.5902, -0.1753 Caerphilly, United Kingdom, 51.5780, -3.2180 Lewes, United Kingdom, 50.8747, 0.0117 Nanattuparai, India, 9.3790, 76.8779 San Cesareo, Italy, 41.8167, 12.8000 Ambohimalaza, Madagascar, -18.8667, 47.5833 Guioyo, Mali, 13.5033, -8.2453 Illingen, Germany, 49.3667, 7.0333 Santa Catarina Juquila, Mexico, 16.2364, -97.2919 Vallirana, Spain, 41.3878, 1.9322 Raiganj Bazar, India, 26.7800, 82.1430 Hammam al `Alil, Iraq, 36.1581, 43.2594 Tasil, Syria, 32.8339, 35.9697 Bathurst, Canada, 47.6200, -65.6500 Vicente Guerrero, Mexico, 23.7500, -103.9833 Balneario do Rincao, Brazil, -28.8344, -49.2361 Jawalgeri, India, 15.8656, 76.8156 Kizhur, India, 11.9667, 75.6667 Kudali, India, 9.1500, 76.8500 Cruz Machado, Brazil, -26.0169, -51.3469 Ouamri, Algeria, 36.2333, 2.5667 Antadinga, Madagascar, -22.1469, 47.4276 Michelstadt, Germany, 49.6786, 9.0039 Este, Italy, 45.2333, 11.6667 The Dalles, United States, 45.6053, -121.1818 Yurihama, Japan, 35.4833, 133.8667 Chittayankottai, India, 10.2686, 77.8327 Neykkarappatti, India, 10.4489, 77.4627 Mwingi, Kenya, -0.9296, 38.0700 Nyasvizh, Belarus, 53.2167, 26.6667 Chertsey, United Kingdom, 51.3902, -0.5074 Grain Valley, United States, 39.0171, -94.2084 Sukth, Albania, 41.3833, 19.5333 Valavakattumula, India, 9.9800, 76.5200 Obra, India, 24.8910, 84.3742 Mohanpur, India, 25.5620, 85.5917 Amarwara, India, 22.2978, 79.1694 Capitan Sarmiento, Argentina, -34.1667, -59.7833 Ambohidrapeto, Madagascar, -18.8971, 47.4804 Bahutal, India, 24.5714, 87.8971 Warren, United States, 40.6323, -74.5146 Landen, Belgium, 50.7547, 5.0814 Kyabe, Chad, 9.4514, 18.9447 Susehri, Turkey, 40.1658, 38.0942 Gentbrugge, Belgium, 51.0314, 3.7642 Simmerath, Germany, 50.6069, 6.3000 Patapatnam, India, 18.7500, 84.0833 Poronaysk, Russia, 49.2167, 143.1167 Gourrama, Morocco, 32.3333, -4.0833 Longwood, United States, 28.7014, -81.3487 Tagazhi, India, 9.3707, 76.4115 Ishidoriyacho-eso, Japan, 39.4839, 141.1471 Zhytkavichy, Belarus, 52.2333, 27.8667 Motru, Romania, 44.8036, 22.9708 Ras el Oued, Morocco, 34.1500, -4.0000 Mandiakui, Mali, 13.0197, -4.4644 Al Bahnasa, Egypt, 28.5353, 30.6606 South Hayling, United Kingdom, 50.7800, -0.9700 Starobilsk, Ukraine, 49.2775, 38.9242 Washington, United States, 40.7050, -89.4340 Ilanskiy, Russia, 56.2414, 96.0581 Valeggio sul Mincio, Italy, 45.3500, 10.7333 Tarquinia, Italy, 42.2492, 11.7561 Suchteln, Germany, 51.2833, 6.3833 Despujols, Philippines, 12.5183, 122.0108 Alotau, Papua New Guinea, -10.3167, 150.4333 Ormeau, Australia, -27.7966, 153.2600 Hongsi, China, 35.5107, 105.5108 Androy, Madagascar, -21.3350, 47.2719 Brahmadesam, India, 11.5449, 77.5803 Alabat, Philippines, 14.1023, 122.0136 Campanha, Brazil, -21.8389, -45.3997 Manatanna, India, 11.9125, 75.7569 Warrington, United States, 30.3835, -87.2946 Codru, Moldova, 46.9753, 28.8194 Gargzdai, Lithuania, 55.7128, 21.4033 Sertanopolis, Brazil, -23.0589, -51.0358 Xiaqiaotou, China, 27.2167, 100.1500 Bailesti, Romania, 44.0308, 23.3525 Noisiel, France, 48.8547, 2.6289 Penicuik, United Kingdom, 55.8260, -3.2200 Saint-Julien-en-Genevois, France, 46.1436, 6.0811 Bom Jesus, Brazil, -9.0739, -44.3589 Apora, Brazil, -11.6600, -38.0808 Windham, United States, 42.8076, -71.2995 Cumaru, Brazil, -8.0058, -35.6969 Rasnov, Romania, 45.5933, 25.4603 Comarapa, Bolivia, -17.9158, -64.5300 Indianola, United States, 41.3629, -93.5652 Weener, Germany, 53.1692, 7.3564 Sin-le-Noble, France, 50.3630, 3.1130 Alhandra, Brazil, -7.3504, -34.9284 Seymour, United States, 35.8783, -83.7669 Karambakkudi, India, 10.4587, 79.1410 Lakamane, Mali, 14.5060, -9.9070 Petite-Synthe, France, 51.0194, 2.3467 Adwick le Street, United Kingdom, 53.5677, -1.1931 Quixelo, Brazil, -6.2539, -39.2019 Americus, United States, 32.0736, -84.2248 Red Oak, United States, 32.5212, -96.7866 Piacabucu, Brazil, -10.4086, -36.4339 Sayalkudi, India, 9.1692, 78.4470 Suchindram, India, 8.1544, 77.4670 Vlagtwedde, Netherlands, 53.0261, 7.1117 Paso de Carrasco, Uruguay, -34.8714, -56.0272 Victor, United States, 42.9894, -77.4277 Hayes, United Kingdom, 51.3780, 0.0192 San Giovanni in Fiore, Italy, 39.2642, 16.7003 Seltso, Russia, 53.3678, 34.0978 Kursumlija, Serbia, 43.1408, 21.2678 Jbabra, Morocco, 34.4314, -4.9642 Calbuco, Chile, -41.7667, -73.1333 Marmeleiro, Brazil, -26.1489, -53.0258 Schaesberg, Netherlands, 50.8944, 6.0158 Chubbuck, United States, 42.9263, -112.4623 Heggadadevankote, India, 12.0881, 76.3296 Aladag, Turkey, 37.5464, 35.3986 Bastogne, Belgium, 50.0042, 5.7200 Rendon, United States, 32.5789, -97.2349 Zunil, Guatemala, 14.7833, -91.4833 Humacao, Puerto Rico, 18.1520, -65.8204 Frederick, United States, 40.1088, -104.9701 Sint-Kruis, Belgium, 51.2139, 3.2503 Eilendorf, Germany, 50.7794, 6.1625 Greater Napanee, Canada, 44.2500, -76.9500 Cerejeiras, Brazil, -13.1889, -60.8122 Luzhou, China, 23.3686, 114.5194 San Julian, Mexico, 21.0167, -102.1667 Plaza Huincul, Argentina, -38.9338, -69.1987 Vijayapuri North, India, 16.6028, 79.3075 Turffontein, South Africa, -26.2446, 28.0397 Quezon, Philippines, 14.0068, 122.1824 Gheorgheni, Romania, 46.7200, 25.5900 Seaford, United States, 40.6678, -73.4922 Addlestone, United Kingdom, 51.3695, -0.4901 Vellikulangara, India, 10.3667, 76.4167 Dighirpar, India, 22.3034, 88.6678 Lam Luk Ka, Thailand, 13.9323, 100.7494 Antrim, United States, 39.7862, -77.7221 Concorezzo, Italy, 45.5897, 9.3359 Serta, Portugal, 39.8008, -8.1003 Parkway, United States, 38.4993, -121.4520 Mahires, Tunisia, 34.5333, 10.5000 Fairhaven, United States, 41.6394, -70.8732 Brusciano, Italy, 40.9224, 14.4239 Esquipulas, Nicaragua, 12.6667, -85.7833 Davutlar, Turkey, 37.7333, 27.3000 Beek, Netherlands, 50.9394, 5.7961 Live Oak, United States, 29.5545, -98.3404 Kishundaspur, India, 25.3334, 87.3318 Dayton, United States, 39.2592, -119.5653 Palmer Ranch, United States, 27.2286, -82.4672 Udayagiri, India, 14.8667, 79.3167 Tapejara, Brazil, -23.7328, -52.8728 Bar, Montenegro, 42.1000, 19.1000 Garrel, Germany, 52.9581, 8.0253 Coos Bay, United States, 43.3789, -124.2330 Elkton, United States, 39.6066, -75.8209 Alvaraes, Brazil, -3.2000, -64.8333 Villalbilla, Spain, 40.4339, -3.2989 Drensteinfurt, Germany, 51.7944, 7.7392 Finsterwalde, Germany, 51.6282, 13.7102 Codroipo, Italy, 45.9614, 12.9774 Gryfice, Poland, 53.9147, 15.1986 Budakeszi, Hungary, 47.5111, 18.9300 Konigslutter am Elm, Germany, 52.2500, 10.8167 Wadern, Germany, 49.5167, 6.8667 Raychikhinsk, Russia, 49.7833, 129.4167 Rahden, Germany, 52.4167, 8.6167 Nidiyanga, India, 12.0889, 75.4806 Zevenbergen, Netherlands, 51.6453, 4.5997 Le Pecq, France, 48.8969, 2.1069 Oyodo, Japan, 34.3906, 135.7897 Tupi Paulista, Brazil, -21.3808, -51.5708 Baghlia, Algeria, 36.8167, 3.8500 Hammam M'Bails, Algeria, 36.3258, 7.6436 Valabhipur, India, 21.8878, 71.8795 Toma, Burkina Faso, 12.7667, -2.8833 Fremont, United States, 41.3535, -83.1147 Sahambala, Madagascar, -17.9199, 49.1574 Dembeni, Mayotte, -12.8339, 45.1725 Lonigo, Italy, 45.3833, 11.3833 Xiaozhengzhuang, China, 39.6250, 117.9031 Pawai, India, 24.2664, 80.1620 La Lucila, Argentina, -34.4833, -58.4833 Bonito, Brazil, -11.9658, -41.2669 Jatauba, Brazil, -7.9900, -36.4958 Gandevi, India, 20.8200, 72.9800 Osowa, Poland, 54.4272, 18.4708 Brofodoume, Côte d’Ivoire, 5.5136, -3.9307 Chhapra Bahas, India, 26.7266, 84.7912 Dassari, Benin, 10.8158, 1.1406 Odaiyakulam, India, 10.5679, 76.9105 Lewiston, United States, 43.1793, -78.9710 Bruck an der Mur, Austria, 47.4167, 15.2667 Vatomandry, Madagascar, -19.3279, 48.9815 Ban Dung, Thailand, 17.6986, 103.2611 Hadjadj, Algeria, 36.1000, 0.3333 Mandialaza, Madagascar, -18.6056, 48.0310 Miguelturra, Spain, 38.9667, -3.9500 Feke, Turkey, 37.8150, 35.9125 Rypin, Poland, 53.0667, 19.4500 Hennebont, France, 47.8050, -3.2775 Morriston, United Kingdom, 51.6647, -3.9389 Miedzyrzec Podlaski, Poland, 51.9833, 22.7833 Dhusar Tikapatti, India, 25.5214, 87.2212 Srimushnam, India, 11.4012, 79.4038 Clarksburg, United States, 39.2862, -80.3232 Fruitville, United States, 27.3328, -82.4616 Ostrov, Czechia, 50.3083, 12.9478 Kodikkulam, India, 9.6493, 77.5860 Kadamakudi, India, 10.0652, 76.2451 Harlingen, Netherlands, 53.1736, 5.4272 Ban Samo Khae, Thailand, 16.8408, 100.3415 Santa Rosa, Argentina, -33.2500, -68.1500 Tapiramuta, Brazil, -11.8469, -40.7908 Tlaltetela, Mexico, 19.3167, -96.9000 Middleburg Heights, United States, 41.3696, -81.8150 Lake Country, Canada, 50.0833, -119.4142 Colonia Leopoldina, Brazil, -8.9089, -35.7250 Ropczyce, Poland, 50.0861, 21.6333 Grottammare, Italy, 42.9891, 13.8681 Tanakpur, India, 29.0740, 80.1090 Saviano, Italy, 40.9167, 14.5167 Grimes, United States, 41.6779, -93.7947 Kallur, India, 17.2000, 80.5500 Kumano, Japan, 33.8886, 136.1002 Kabayan, Philippines, 16.6233, 120.8381 Mamadysh, Russia, 55.7131, 51.4106 Ash Shaddadah, Syria, 36.0576, 40.7348 Batalha, Portugal, 39.6603, -8.8247 Cunit, Spain, 41.1983, 1.6406 Serinyol, Turkey, 36.3667, 36.2000 Haftkel, Iran, 31.4444, 49.5314 Cadoneghe, Italy, 45.4500, 11.9333 Lentate sul Seveso, Italy, 45.6784, 9.1219 Cholai, India, 12.0400, 75.4600 Altay, Mongolia, 46.3728, 96.2572 Ixhuatlan del Sureste, Mexico, 18.0170, -94.3800 Adrasmon, Tajikistan, 40.6486, 69.9856 Maliana, Timor-Leste, -8.9917, 125.2197 Tarancon, Spain, 40.0167, -3.0000 Brooklyn Park, United States, 39.2170, -76.6174 Diang, Cameroon, 4.5833, 13.3500 Langenau, Germany, 48.4967, 10.1200 Puluvappatti, India, 10.9630, 76.8158 Dhani Sukhan, India, 28.7932, 76.0502 Salonta, Romania, 46.8000, 21.6500 Bennane, Tunisia, 35.6833, 10.8333 Thibodaux, United States, 29.7949, -90.8146 Centre de Flacq, Mauritius, -20.2002, 57.7177 Belaur, India, 25.4477, 84.6473 Kunithala, India, 11.9050, 75.7845 Westbury, United States, 40.7599, -73.5891 Dhumnagar, India, 26.7560, 84.5233 Fontainebleau, France, 48.4097, 2.7025 Fatehpur, India, 29.7500, 76.5500 Vardannapet, India, 17.7735, 79.5731 Oarai, Japan, 36.3133, 140.5749 Krapkowice, Poland, 50.4667, 17.9667 Palagiano, Italy, 40.5833, 17.0500 Gulf Shores, United States, 30.2764, -87.7017 Shahpura, India, 23.1366, 79.6640 Palagonia, Italy, 37.3333, 14.7500 Altopascio, Italy, 43.8167, 10.6747 Weston, United States, 44.8906, -89.5487 Kandla Port, India, 23.0300, 70.2200 Chethakal, India, 9.4386, 76.8322 Mahudha, India, 22.8200, 72.9300 San Bartolome Jocotenango, Guatemala, 15.1928, -91.0775 Macedo de Cavaleiros, Portugal, 41.5333, -6.9500 Lubbenau/Spreewald, Germany, 51.8667, 13.9667 Elbeuf, France, 49.2900, 1.0100 Yorito, Honduras, 15.0600, -87.2900 Jamestown, United States, 46.9063, -98.6937 Newberry, United States, 40.1286, -76.7919 Lara, Australia, -38.0167, 144.4167 Ouadhia, Algeria, 36.5500, 4.0833 Ramada, Portugal, 38.8036, -9.1911 Ebersbach an der Fils, Germany, 48.7147, 9.5236 Laurentides, Canada, 45.8500, -73.7667 Vatutine, Ukraine, 49.0119, 31.0714 Goubellat, Tunisia, 36.5333, 9.6667 Esme, Turkey, 38.4000, 28.9667 Overland, United States, 38.6966, -90.3689 Novo Airao, Brazil, -2.6208, -60.9439 Gonohe, Japan, 40.5312, 141.3080 Hartford, United States, 43.3223, -88.3784 Kannampalaiyam, India, 10.9954, 77.0990 Bayramic, Turkey, 39.8128, 26.6100 Pijino del Carmen, Colombia, 9.3333, -74.4500 Taucha, Germany, 51.3800, 12.4936 Mansingha, India, 26.7807, 84.8367 Al Mu`abbadah, Syria, 37.0214, 41.9609 Akambadam, India, 11.1000, 76.3167 Sulat, Philippines, 11.8200, 125.4500 Zhutian, Taiwan, 22.5890, 120.5303 Wattignies, France, 50.5856, 3.0439 Kalanadu, India, 12.4667, 75.0000 Rupbas, India, 26.9833, 77.5833 Wailuku, United States, 20.8834, -156.5059 Kasimkota, India, 17.6736, 82.9634 San Antonio Palopo, Guatemala, 14.7000, -91.1167 Vieux Fort, Saint Lucia, 13.7280, -60.9540 Neustadt in Holstein, Germany, 54.1072, 10.8158 Diafarabe, Mali, 14.1381, -5.0178 Rutland, United States, 43.6092, -72.9783 Ipora, Brazil, -24.0028, -53.7039 Sonapur, India, 25.3561, 86.2082 Herisau, Switzerland, 47.3851, 9.2786 Ardestan, Iran, 33.3731, 52.3689 Quimavango, Angola, -7.6200, 13.0300 General Pinedo, Argentina, -27.3167, -61.2833 Schwarzenberg, Germany, 50.5453, 12.7792 Rakovnik, Czechia, 50.1039, 13.7333 Titel, Serbia, 45.2000, 20.3000 Itatim, Brazil, -12.7119, -39.6978 Sered', Slovakia, 48.2833, 17.7333 Santa Juliana, Brazil, -19.3089, -47.5242 Mirangaba, Brazil, -10.9539, -40.5758 Kondrovo, Russia, 54.8000, 35.9333 Hanover, Canada, 49.4433, -96.8492 Meco, Spain, 40.5539, -3.3261 Hille, Germany, 52.3331, 8.7500 Trisshileri, India, 11.8333, 76.0333 Usuda, Japan, 36.1955, 138.4792 Lindas, Norway, 60.7381, 5.1600 Chelsea, United States, 33.3262, -86.6300 Ribnitz-Damgarten, Germany, 54.2500, 12.4667 Correia Pinto, Brazil, -27.5850, -50.3608 Guasca, Colombia, 4.8658, -73.8772 Puduppatti, India, 11.5500, 78.2833 Minamiminowa, Japan, 35.8729, 137.9751 Corbera de Llobregat, Spain, 41.4169, 1.9314 Lymington, United Kingdom, 50.7500, -1.5500 Carugate, Italy, 45.5500, 9.3333 Orizona, Brazil, -17.0314, -48.2958 La Montanita, Colombia, 1.5833, -75.2500 Dubacherla, India, 16.9116, 81.3569 Longmeadow, United States, 42.0475, -72.5718 Campina da Lagoa, Brazil, -24.5919, -52.7989 Dieburg, Germany, 49.9000, 8.8500 Vail, United States, 32.0217, -110.6937 Zulte, Belgium, 50.9167, 3.4333 Bad Neustadt, Germany, 50.3219, 10.2161 Tarur, India, 10.6722, 76.4694 San Jacinto Amilpas, Mexico, 17.1000, -96.7667 Patton, United States, 40.8258, -77.9237 Maruim, Brazil, -10.7378, -37.0819 Knaresborough, United Kingdom, 54.0084, -1.4670 Langenberg, Germany, 51.3519, 7.1217 Eravattur, India, 11.5833, 75.7333 Fort Mohave, United States, 35.0004, -114.5748 Bharanikavu Tekku, India, 9.1847, 76.5446 Le Vesinet, France, 48.8923, 2.1331 Coelemu, Chile, -36.4878, -72.7028 Sahar, India, 26.5408, 85.8590 Steffisburg, Switzerland, 46.7831, 7.6333 Castillo, Dominican Republic, 19.2200, -70.0300 Stara L'ubovna, Slovakia, 49.3167, 20.6833 Dunaivtsi, Ukraine, 48.8894, 26.8569 Morges, Switzerland, 46.5167, 6.5000 Whitewater, United States, 42.8372, -88.7341 Pochampalli, India, 17.3473, 78.8195 Mwinilunga, Zambia, -11.7172, 24.4289 Galvan, Dominican Republic, 18.5039, -71.3400 North Whitehall, United States, 40.6797, -75.5788 Conwy, United Kingdom, 53.2800, -3.8300 Beko, India, 24.0415, 85.9536 Kimwanyi, Uganda, 0.4533, 32.6347 Taima, Japan, 34.5111, 135.7069 Saint-Pierre-des-Corps, France, 47.3914, 0.7289 Hilvarenbeek, Netherlands, 51.4861, 5.1367 Oulad Alioua, Morocco, 30.3761, -9.3203 Niepolomice, Poland, 50.0339, 20.2172 Coulommiers, France, 48.8247, 3.1068 Newton, United States, 41.6963, -93.0403 Beaucaire, France, 43.8081, 4.6442 Fos-sur-Mer, France, 43.4403, 4.9486 Northborough, United States, 42.3231, -71.6462 Mellila, Morocco, 33.3833, -7.1333 Si Satchanalai, Thailand, 17.5203, 99.7640 Turkaguda, India, 17.1530, 78.6195 Damdama, India, 24.4341, 87.7849 Bucimas, Albania, 40.8914, 20.6814 Beernem, Belgium, 51.1333, 3.3333 Noto, Japan, 37.3066, 137.1500 Aabenraa, Denmark, 55.0362, 9.4180 Xixucun, China, 36.6930, 113.7950 Carterton, United Kingdom, 51.7600, -1.5900 Todi, Italy, 42.7833, 12.4167 Azzano Decimo, Italy, 45.8833, 12.7167 Ifanadiana, Madagascar, -21.3036, 47.6387 Prospect Heights, United States, 42.1039, -87.9267 San Miguel, Philippines, 13.6411, 124.3008 Nova Brasilandia d'Oeste, Brazil, -11.7197, -62.3158 Baeza, Spain, 37.9833, -3.4667 Binningen, Switzerland, 47.5333, 7.5667 Yakumo, Japan, 42.2500, 140.2667 Tiran, Iran, 32.7039, 51.1525 Copparo, Italy, 44.9000, 11.8333 Dhanot, Pakistan, 29.5333, 71.6333 Springdale, United States, 39.8769, -74.9724 Montivilliers, France, 49.5469, 0.1889 Melonguane, Indonesia, 4.0045, 126.6827 Renai, Taiwan, 24.0462, 121.1304 Hillcrest Heights, United States, 38.8373, -76.9641 Orimattila, Finland, 60.8042, 25.7333 Sumbark, Czechia, 49.7986, 18.4147 Hedongcun, China, 37.7544, 102.7906 Ihaddadene, Morocco, 31.2000, -9.6500 Namala Guimbala, Mali, 13.3636, -9.3875 Bayt Saham, Syria, 33.4736, 36.3382 Bububu, Tanzania, -6.1000, 39.2167 Buckley, United Kingdom, 53.1720, -3.0860 Francheville, France, 45.7372, 4.7642 Ponders End, United Kingdom, 51.6460, -0.0460 Ince-in-Makerfield, United Kingdom, 53.5402, -2.5990 Tsukumiura, Japan, 33.0722, 131.8614 Colorado do Oeste, Brazil, -13.1167, -60.5417 Wenwu, China, 24.7413, 116.1942 Opelousas, United States, 30.5252, -92.0816 Valmontone, Italy, 41.7833, 12.9167 Driouch, Morocco, 34.9833, -3.3833 Bhit Bhagwanpur, India, 26.1160, 86.3550 Kajha, India, 25.7747, 87.3545 Dhemaji, India, 27.4833, 94.5833 Luce, France, 48.4389, 1.4658 Murud, India, 18.3300, 72.9600 Soavina, Madagascar, -18.9625, 47.5010 La Cruz, Mexico, 23.9214, -106.8919 Zhukovo, Russia, 55.0333, 36.7500 Arkivan, Azerbaijan, 39.0171, 48.6431 Tarhzout n'Ait Yazza, Morocco, 31.4567, -5.4192 Marivorahona, Madagascar, -13.0863, 49.1041 Ochiai, Japan, 35.0181, 133.7524 Bellmore, United States, 40.6569, -73.5285 Zarah Sharan, Afghanistan, 33.1300, 68.7800 Palmview, United States, 26.2318, -98.3823 Ban Tha Pho, Thailand, 16.8582, 100.2291 Mvurwi, Zimbabwe, -17.0167, 30.8500 Bengonbeyene, Equatorial Guinea, 1.6931, 11.0342 Balkonda, India, 18.8726, 78.3432 Kukes, Albania, 42.0833, 20.4167 Nioro du Rip, Senegal, 13.7450, -15.7746 Chenlu, China, 35.0286, 109.1547 Baile an Bhiataigh, Ireland, 53.7014, -6.2461 Donacarney, Ireland, 53.7133, -6.2792 Yazu, Japan, 35.4000, 134.2500 Campulung Moldovenesc, Romania, 47.5308, 25.5514 Scottsboro, United States, 34.6438, -86.0491 Porthcawl, United Kingdom, 51.4800, -3.6900 Capilla de Guadalupe, Mexico, 20.6500, -102.8000 Leso, Philippines, 11.6697, 122.3269 Mitchell, United States, 43.7294, -98.0337 Molinella, Italy, 44.6167, 11.6667 Jiaojiazhuang, China, 38.2636, 101.8328 Summerfield, United States, 38.9042, -76.8678 Toui, Benin, 8.6833, 2.6000 Manujan, Iran, 27.4031, 57.4917 North Reading, United States, 42.5816, -71.0876 Rajapur, India, 26.2861, 83.1306 Manjil, Iran, 36.7447, 49.4014 Toyoyama, Japan, 35.2505, 136.9121 Boudjima, Algeria, 36.8000, 4.1500 Ermua, Spain, 43.1875, -2.5008 Guinguineo, Senegal, 14.2667, -15.9500 Palmitos, Brazil, -27.0678, -53.1608 Hofgeismar, Germany, 51.4833, 9.4000 Dammaj, Yemen, 16.8939, 43.8022 Cumru, United States, 40.2811, -75.9544 Leopoldsburg, Belgium, 51.1177, 5.2541 Langenthal, Switzerland, 47.2153, 7.7889 Loma de Cabrera, Dominican Republic, 19.4220, -71.6150 Serpa, Portugal, 37.9333, -7.5833 Puttalam, India, 8.0981, 77.4640 Ashikita, Japan, 32.2994, 130.4931 Mayoyao, Philippines, 16.9736, 121.2214 Trelaze, France, 47.4460, -0.4650 Cheramkod, India, 11.6000, 76.3167 Solapuram, India, 9.3757, 77.5598 Pallappatti, India, 10.3564, 77.9516 Porto San Giorgio, Italy, 43.1848, 13.7955 Tobetsu, Japan, 43.2167, 141.5167 Chom Thong, Thailand, 18.4901, 98.6747 Dragasani, Romania, 44.6611, 24.2606 Kara-Kulja, Kyrgyzstan, 40.6322, 73.5925 Mays Chapel, United States, 39.4343, -76.6516 Tatahuicapan, Mexico, 18.2500, -94.7667 Oswestry, United Kingdom, 52.8598, -3.0538 Jurawanpur Karari, India, 25.5273, 85.4182 Olmue, Chile, -32.9953, -71.1856 La Roda, Spain, 39.2070, -2.1604 Dewangarh, India, 24.8637, 85.8584 Mangqu, China, 35.5833, 100.7500 Molnlycke, Sweden, 57.6500, 12.1333 Narendrapatnam, India, 17.0964, 81.8812 Kolakaluru, India, 16.3052, 80.6182 Zastron, South Africa, -30.3000, 27.0833 Antarvedi, India, 16.3333, 81.7333 Templin, Germany, 53.1167, 13.5000 Chembagaramanpudur, India, 8.2461, 77.4907 Calumpang, Philippines, 14.6249, 121.0865 Bilpura, India, 23.2216, 79.9917 Bexleyheath, United Kingdom, 51.4590, 0.1380 Chislehurst, United Kingdom, 51.4120, 0.0750 Porto Empedocle, Italy, 37.2944, 13.5272 Bilopillya, Ukraine, 51.1458, 34.3117 Julita, Philippines, 10.9731, 124.9622 Ponsacco, Italy, 43.6167, 10.6333 Boppard, Germany, 50.2314, 7.5908 Mouiat Ouennsa, Algeria, 33.1969, 6.7053 Sayville, United States, 40.7478, -73.0840 Sundarpur, India, 26.3037, 84.8581 Crusinallo, Italy, 45.8900, 8.4081 Dalanping, China, 28.0189, 110.0025 Epe, Germany, 52.1833, 7.0333 Shizukuishi, Japan, 39.6952, 140.9758 Chengala, India, 12.5087, 75.0558 Bhagta, India, 30.4882, 75.1013 Bhagwangola, India, 24.3485, 88.3243 Galliate, Italy, 45.4833, 8.7000 Khombole, Senegal, 14.7629, -16.6909 Newport Pagnell, United Kingdom, 52.0870, -0.7220 Hartselle, United States, 34.4391, -86.9396 Pozos, Costa Rica, 9.9536, -84.1926 Nakhon Nayok, Thailand, 14.2069, 101.2142 Baynala, India, 22.4835, 88.4997 Karaga, Ghana, 9.9250, -0.4297 Maullin, Chile, -41.6167, -73.6000 Akdepe, Turkmenistan, 42.0500, 59.4000 Najasa, Cuba, 21.0836, -77.7472 Zevio, Italy, 45.3728, 11.1303 Marsaskala, Malta, 35.8625, 14.5675 Muhammadabad, India, 16.8731, 77.8909 Sao Pedro do Sul, Brazil, -29.6208, -54.1789 Sebt Bni Smith, Morocco, 35.1373, -4.7107 Cosio, Mexico, 22.3667, -102.3000 Ban Pang Mu, Thailand, 19.3336, 97.9656 Kadaiyam, India, 8.8320, 77.3570 Belo, India, 25.8747, 86.8855 Xinyi, Taiwan, 23.6624, 121.0157 Pequannock, United States, 40.9627, -74.3041 Kompalle, India, 17.4993, 78.4583 Bi'r al `Abd, Egypt, 31.0000, 33.0167 Chamgardan, Iran, 32.3931, 51.3392 Seekonk, United States, 41.8379, -71.3174 Ernagudem, India, 16.9989, 81.5061 Cochoapa el Grande, Mexico, 17.2000, -98.4500 Toul, France, 48.6750, 5.8917 Chos Malal, Argentina, -37.3833, -70.2667 Ipua, Brazil, -20.4381, -48.0122 Mount Clemens, United States, 42.5977, -82.8821 Vendome, France, 47.7936, 1.0664 Lahoysk, Belarus, 54.2000, 27.8500 Santa Cruz de la Palma, Spain, 28.6825, -17.7650 Kasagi, Japan, 34.3000, 135.5000 Skhour Rehamna, Morocco, 32.4833, -7.9167 San Miguel Duenas, Guatemala, 14.5167, -90.8000 Tung Tau Tsuen, Hong Kong, 22.3334, 114.1924 Miyota, Japan, 36.3212, 138.5088 West Lealman, United States, 27.8192, -82.7384 Canapi, Brazil, -9.1269, -37.6050 Swinton, United Kingdom, 53.4877, -1.3149 Berea, United States, 37.5904, -84.2898 Frei Paulo, Brazil, -10.5494, -37.5344 Cat, Turkey, 39.6111, 40.9789 Shively, United States, 38.1970, -85.8136 El Chal, Guatemala, 16.6400, -89.6500 Zhirnovsk, Russia, 50.9833, 44.7833 Amberieu-en-Bugey, France, 45.9631, 5.3541 Edakkazhiyur, India, 10.6167, 75.9833 Machang, China, 33.1912, 107.3732 Jasol, India, 25.4900, 72.1300 Sabbah, Morocco, 33.8036, -7.0372 Puerto Pimentel, Peru, -6.8367, -79.9342 West Ham, United Kingdom, 51.5340, 0.0080 Einsiedeln, Switzerland, 47.1278, 8.7431 Chittur, India, 11.5500, 77.7167 Saligrama, India, 12.5602, 76.2611 Agrate Brianza, Italy, 45.5783, 9.3522 Santa Cecilia, Brazil, -26.9608, -50.4269 Mollerusa, Spain, 41.6319, 0.8961 Ponnamaravati, India, 10.2803, 78.5360 Eppelheim, Germany, 49.4000, 8.6333 Qaryat Suluq, Libya, 31.6686, 20.2503 Mezokovesd, Hungary, 47.8067, 20.5647 Palhalan, India, 34.1823, 74.5506 Shimanto, Japan, 33.2167, 133.1333 My Luong, Vietnam, 20.8667, 105.6667 Nailsea, United Kingdom, 51.4300, -2.7600 Codogno, Italy, 45.1600, 9.7050 Schiffweiler, Germany, 49.3667, 7.1167 Souagui, Algeria, 36.1167, 3.2333 Kukkundur, India, 13.2404, 74.9541 Sanatikri, India, 22.0230, 88.5033 Rakhiv, Ukraine, 48.0500, 24.2000 Frankfort, United States, 40.2810, -86.5212 Kumaralingam, India, 10.4894, 77.3499 Bissegem, Belgium, 50.8167, 3.2167 Bituruna, Brazil, -26.1608, -51.5528 Anar, Iran, 30.8656, 55.2703 Tidjikja, Mauritania, 18.5500, -11.4166 Jackson, United States, 37.3792, -89.6522 Yesilhisar, Turkey, 38.3500, 35.0867 Kyazanga, Uganda, -0.3864, 31.3186 Tanque Verde, United States, 32.2687, -110.7437 Greeneville, United States, 36.1680, -82.8197 Barra Velha, Brazil, -26.6319, -48.6850 Nannestad, Norway, 60.2456, 10.9528 Wanda, Argentina, -25.9667, -54.5833 Itariri, Brazil, -24.2888, -47.1332 Barod, India, 23.7889, 75.8116 Igapora, Brazil, -13.7728, -42.7139 Lwengo, Uganda, -0.3911, 31.4606 Tarascon, France, 43.8058, 4.6603 Gloria, Brazil, -9.3389, -38.2569 Bredasdorp, South Africa, -34.5333, 20.0417 Aleg, Mauritania, 17.0580, -13.9090 El Palmar, Venezuela, 8.0244, -61.8819 Yulee, United States, 30.6350, -81.5678 Edinet, Moldova, 48.1667, 27.3167 Matlock, United Kingdom, 53.1400, -1.5500 Mainburg, Germany, 48.6500, 11.7833 Bokoro, Chad, 12.3667, 17.0500 Rakvere, Estonia, 59.3500, 26.3500 Kucevo, Serbia, 44.4833, 21.6667 Diapaga, Burkina Faso, 12.0667, 1.7833 Certaldo, Italy, 43.5478, 11.0411 Ebn Ziad, Algeria, 36.3833, 6.4667 Lake Stickney, United States, 47.8733, -122.2582 Carthage, United States, 37.1503, -94.3225 Podporozhye, Russia, 60.9000, 34.2000 Lezhe, Albania, 41.7819, 19.6444 Nymburk, Czechia, 50.1861, 15.0417 Palanisettipatti, India, 9.9998, 77.4641 Sayo, Japan, 35.0000, 134.3500 Andover, United States, 37.6873, -97.1352 Sirali, India, 22.1519, 77.0617 Kinna, Sweden, 57.4954, 12.6805 Escaldes-Engordany, Andorra, 42.5089, 1.5408 Meghauna, India, 25.6904, 86.3809 Morteza Gerd, Iran, 35.6022, 51.3486 Zhuolan, Taiwan, 24.3222, 120.8447 Teodoro Schmidt, Chile, -38.9949, -73.0894 Saffron Walden, United Kingdom, 52.0220, 0.2430 Leixlip, Ireland, 53.3636, -6.4864 Kifosso, Mali, 12.5014, -4.8992 Yankton, United States, 42.8901, -97.3927 Durlesti, Moldova, 47.0178, 28.7625 Buston, Tajikistan, 40.5217, 69.3308 Taromske, Ukraine, 48.4617, 34.7828 Pipra Latif, India, 25.3579, 86.7174 Kanan, Japan, 34.4833, 135.6333 Batavia, United States, 42.9987, -78.1802 Nobres, Brazil, -14.7200, -56.3278 Longwy, France, 49.5200, 5.7606 Wittenheim, France, 47.8081, 7.3375 Patilar, India, 27.0361, 84.2106 Daigo, Japan, 36.7681, 140.3552 Pudtol, Philippines, 18.2356, 121.3733 Traverse City, United States, 44.7546, -85.6038 Bemidji, United States, 47.4828, -94.8797 'Ayn Bni Mathar, Morocco, 34.0889, -2.0247 Kurawar, India, 23.5118, 77.0246 Buda, United States, 30.0758, -97.8487 Banqiao, China, 35.8914, 107.9572 Hessle, United Kingdom, 53.7239, -0.4319 Kalyvia Thorikou, Greece, 37.8333, 23.9167 Asthanwan, India, 25.2215, 85.6262 Casalpusterlengo, Italy, 45.1778, 9.6500 Kyaunggon, Burma, 17.1000, 95.1833 Greenwood Village, United States, 39.6153, -104.9131 Vemuladivi, India, 16.3408, 81.6958 Mauranwan, India, 26.4300, 80.8800 Montijo, Spain, 38.9100, -6.6175 Dejen, Ethiopia, 10.1667, 38.1333 Ain el Hadid, Algeria, 35.0581, 0.8833 Linguere, Senegal, 15.3833, -15.2167 Ternat, Belgium, 50.8667, 4.1833 Todmorden, United Kingdom, 53.7130, -2.0960 Boksitogorsk, Russia, 59.4833, 33.8333 Tizi-n-Tleta, Algeria, 36.5457, 4.0571 Overpelt, Belgium, 51.2111, 5.4256 Funyan Bira, Ethiopia, 9.3500, 42.4000 Pichhor, India, 25.9602, 78.3893 Maskanah, Syria, 35.9658, 38.0416 Lajkovac, Serbia, 44.3667, 20.1667 Nkouraba, Mali, 12.4850, -7.4717 Isorana, Madagascar, -21.3239, 46.9361 Ambaguio, Philippines, 16.5316, 121.0282 Moreni, Romania, 44.9803, 25.6444 Skalica, Slovakia, 48.8422, 17.2267 Ban Nong Kathao, Thailand, 16.9833, 100.7833 Alpine, United States, 32.8439, -116.7585 Mezotur, Hungary, 47.0042, 20.6181 Hiep Hoa, Vietnam, 10.9289, 106.8378 Sabana Grande de Palenque, Dominican Republic, 18.2700, -70.1500 Sarai Jattan, India, 31.1797, 75.6745 Amboavory, Madagascar, -17.3135, 48.5061 Homosassa Springs, United States, 28.8119, -82.5392 Baiceng, China, 25.4333, 105.8000 Kyzyl-Suu, Kyrgyzstan, 42.3421, 78.0064 Sagala, Mali, 14.1103, -7.8881 Ban Duea, Thailand, 16.1264, 101.9010 Udala, India, 21.5781, 86.5668 Panorama, Brazil, -21.3564, -51.8600 Solec Kujawski, Poland, 53.0833, 18.2333 Rive-de-Gier, France, 45.5303, 4.6178 Turhapatti, India, 26.8511, 84.4522 Differdange, Luxembourg, 49.5222, 5.8917 Podstepki, Russia, 53.5151, 49.1294 Phulaut, India, 25.5114, 86.9375 Bilgi, India, 16.3472, 75.6181 Pianezza, Italy, 45.1058, 7.5434 Rosario Oeste, Brazil, -14.8358, -56.4278 Stapleford, United Kingdom, 52.9290, -1.2740 Soliera, Italy, 44.7381, 10.9245 Robinson, United States, 40.4578, -80.1334 Mitrapur, India, 24.4371, 87.9666 Bad Bramstedt, Germany, 53.9186, 9.8844 Weybridge, United Kingdom, 51.3620, -0.4530 Chilamatturu, India, 13.8394, 77.7039 Madera, Mexico, 29.1900, -108.1414 Ferndale, United States, 48.8526, -122.5894 Bimgal, India, 18.7000, 78.4667 Walnut Park, United States, 33.9682, -118.2220 Kestel, Turkey, 36.5161, 32.0743 Ventaquemada, Colombia, 5.4167, -73.5000 Taperoa, Brazil, -7.2075, -36.8267 Kambaduru, India, 14.3464, 77.2297 Broxburn, United Kingdom, 55.9340, -3.4710 Romit, Tajikistan, 38.7167, 69.3167 Al Hammam, Morocco, 33.1868, -5.6225 Arumbavur, India, 11.3810, 78.7296 Clausthal-Zellerfeld, Germany, 51.8050, 10.3356 Cipanas, Indonesia, -6.7330, 107.0410 Uthai Thani, Thailand, 15.3800, 100.0250 Aldine, United States, 29.9123, -95.3784 Robbinsville, United States, 40.2220, -74.5910 Jiblah, Yemen, 13.9167, 44.1500 Clinton, United States, 42.4119, -71.6888 Estrela de Alagoas, Brazil, -9.3900, -36.7600 Dilarpur, India, 25.3968, 87.5969 Nedumudi, India, 9.4429, 76.4040 Concepcion, Peru, -11.9185, -75.3129 Jamalpur, India, 25.9549, 86.3600 Ala-Buka, Kyrgyzstan, 41.4083, 71.4806 Dacheng, Taiwan, 23.8483, 120.3089 Loimaa, Finland, 60.8500, 23.0583 Nuth, Netherlands, 50.9167, 5.8833 Manohisoa, Madagascar, -19.7867, 46.7924 Sandhausen, Germany, 49.3439, 8.6581 Saint-Rambert, France, 45.5003, 4.2406 Odanavattam, India, 8.9355, 76.7713 Vipparla, India, 16.3023, 79.9373 Machelen, Belgium, 50.9167, 4.4333 Blomberg, Germany, 51.9333, 9.0833 Neston, United Kingdom, 53.2890, -3.0740 Efkarpia, Greece, 40.6833, 22.9500 Bugganipalle, India, 15.4741, 78.1750 Khao Yoi, Thailand, 13.2402, 99.8243 Eggertsville, United States, 42.9665, -78.8065 Spittal an der Drau, Austria, 46.7833, 13.4833 Tari, Papua New Guinea, -5.8489, 142.9506 Tururu, Brazil, -3.5808, -39.4369 Biscarrosse, France, 44.3942, -1.1628 Agios Ioannis Rentis, Greece, 37.9667, 23.6667 Clark, United States, 40.6203, -74.3134 Nancagua, Chile, -34.6667, -71.2167 Csongrad, Hungary, 46.7111, 20.1403 Canarana I, Brazil, -13.5500, -52.1658 Sorrento, Italy, 40.6278, 14.3736 Kerouane, Guinea, 9.2704, -9.0200 Dison, Belgium, 50.6098, 5.8543 Messias, Brazil, -9.3828, -35.8419 Zabbar, Malta, 35.8772, 14.5381 Chokkanathapuram, India, 9.9921, 77.3566 Potenza Picena, Italy, 43.3663, 13.6203 Guipavas, France, 48.4342, -4.3994 Andrakata, Madagascar, -14.6279, 49.7177 Weigelstown, United States, 39.9852, -76.8306 Sidcup, United Kingdom, 51.4263, 0.1024 Siladon, India, 23.1527, 85.3657 Sodag, India, 23.1436, 85.3874 Lal Khatanga, India, 23.2627, 85.3376 Khijri, India, 22.8001, 84.9474 Nova Olinda, Brazil, -7.0919, -39.6808 Malhada, Brazil, -14.3358, -43.7739 Haddon, United States, 39.9063, -75.0625 Canyon, United States, 34.9911, -101.9190 Patos, Albania, 40.6841, 19.6194 Dentsville, United States, 34.0754, -80.9547 Landazuri, Colombia, 6.2181, -73.8114 Ilovaisk, Ukraine, 47.9260, 38.1940 Villa del Rosario, Argentina, -31.5833, -63.5333 Besana in Brianza, Italy, 45.7000, 9.2833 Midar, Morocco, 34.9500, -3.5333 Santaquin, United States, 39.9708, -111.7941 Jamao al Norte, Dominican Republic, 19.6500, -70.6167 Paraiso, Dominican Republic, 18.0000, -71.1667 Fraga, Spain, 41.5200, 0.3500 Ewa Beach, United States, 21.3181, -158.0073 Seacombe, United Kingdom, 53.4090, -3.0290 Santa Maria Petapa, Mexico, 16.8167, -95.1167 Santa Ursula, Spain, 28.4250, -16.4917 Kurdamir, Azerbaijan, 40.3383, 48.1608 Odenthal, Germany, 51.0333, 7.1167 Magdiwang, Philippines, 12.4800, 122.5200 Fortuna, Costa Rica, 10.4483, -84.6421 Awlouz, Morocco, 30.7000, -8.1500 Butiama, Tanzania, -1.7667, 33.9667 Ambongamarina, Madagascar, -18.3157, 47.9439 Ban Khek Noi, Thailand, 16.8118, 100.9671 Princeton Meadows, United States, 40.3347, -74.5651 Jelcz-Laskowice, Poland, 51.0333, 17.3333 Samsikapuram, India, 9.4156, 77.5917 La Palma, United States, 33.8504, -118.0407 Raspur Patasia, India, 25.5440, 85.7247 Shchuchyn, Belarus, 53.6167, 24.7333 Gopalnagar, India, 24.6910, 87.9299 Strzegom, Poland, 50.9611, 16.3444 Minneola, United States, 28.6067, -81.7322 Ayutla de los Libres, Mexico, 16.9000, -99.2167 Ylivieska, Finland, 64.0750, 24.5333 Skipton, United Kingdom, 53.9625, -2.0163 Bouc-Bel-Air, France, 43.4553, 5.4150 Belchertown, United States, 42.2788, -72.4004 San Policarpo, Philippines, 12.1791, 125.5072 Coto de Caza, United States, 33.5959, -117.5860 Cruzilia, Brazil, -21.8389, -44.8078 Putaendo, Chile, -32.6278, -70.7167 San Jeronimo, Colombia, 6.4417, -75.7278 Silvi Paese, Italy, 42.5500, 14.1167 Victoria, Philippines, 12.4500, 124.3200 Kot Bhai, India, 30.2678, 74.6990 Mortara, Italy, 45.2500, 8.7500 Thoen, Thailand, 17.6129, 99.2161 Talainayar Agraharam, India, 10.5614, 79.7723 Lopare, Bosnia and Herzegovina, 44.6350, 18.8433 Urandi, Brazil, -14.7708, -42.6550 Kocakoy, Turkey, 38.2897, 40.5014 Frattaminore, Italy, 40.9556, 14.2708 Rajgadh, Nepal, 26.5000, 87.9333 Genappe, Belgium, 50.6000, 4.4500 Ratekau, Germany, 53.9500, 10.7333 Eden, United States, 36.5027, -79.7412 Novoanninskiy, Russia, 50.5333, 42.6833 Sava, Italy, 40.4003, 17.5667 Viseu de Sus, Romania, 47.7092, 24.4239 San Luis del Palmar, Argentina, -27.5167, -58.5667 Anao-aon, Philippines, 9.7778, 125.4231 Kumaramputtur, India, 10.9667, 76.4333 Bambous, Mauritius, -20.2600, 57.4148 Amatitan, Mexico, 20.8350, -103.7310 Uvalde, United States, 29.2152, -99.7782 Villaviciosa, Spain, 43.4833, -5.4333 Alta, Norway, 69.9686, 23.2714 Bunnik, Netherlands, 52.0500, 5.2333 Eldorado, Brazil, -24.5200, -48.1081 Dvur Kralove nad Labem, Czechia, 50.4331, 15.8122 Perivale, United Kingdom, 51.5383, -0.3192 Castro Daire, Portugal, 40.9000, -7.9333 New Haven, United States, 41.0676, -85.0174 Biatorbagy, Hungary, 47.4742, 18.8236 Semra, India, 26.6523, 85.0872 Kanegasaki, Japan, 39.1957, 141.1163 Bar, Ukraine, 49.0750, 27.6761 Gomboussougou, Burkina Faso, 11.4333, -0.7667 Daisen, Japan, 35.5000, 133.5000 Monroe, United States, 33.7990, -83.7161 Chhajli, India, 30.0348, 75.8280 Winkler, Canada, 49.1817, -97.9397 Israin Kalan, India, 25.9844, 87.0372 Chaltyr, Russia, 47.2848, 39.4823 Bradley, United States, 41.1641, -87.8452 Basarh, India, 25.9808, 85.1285 Jupi, Brazil, -8.7119, -36.4150 Gehrden, Germany, 52.3117, 9.6003 Maddikera, India, 15.2496, 77.4159 Amanganj, India, 24.4266, 80.0358 Undi, India, 16.6000, 81.4667 Villa Paranacito, Argentina, -33.7000, -58.6833 Bandar-e Khamir, Iran, 26.9533, 55.5853 Inhuma, Brazil, -6.6683, -41.7078 Kizel, Russia, 59.0500, 57.6667 Mantua, United States, 39.7618, -75.1686 Fort Leonard Wood, United States, 37.7562, -92.1274 Wombwell, United Kingdom, 53.5160, -1.4000 Phrae, Thailand, 18.1453, 100.1419 Sao Joao Evangelista, Brazil, -18.5478, -42.7628 Pihra, India, 24.6424, 85.8043 Atalaia do Norte, Brazil, -4.3719, -70.1919 Stanley, United Kingdom, 53.7145, -1.4760 Bankheri, India, 22.7696, 78.5341 Maydolong, Philippines, 11.5000, 125.5000 Ober-Ramstadt, Germany, 49.8333, 8.7500 Bennington, United States, 42.8854, -73.2133 Veys, Iran, 31.4861, 48.8747 Itajiba, Brazil, -14.2839, -39.8428 Mottola, Italy, 40.6333, 17.0333 Schriesheim, Germany, 49.4736, 8.6592 Bhanumukkala, India, 15.3119, 78.2277 Guerouma, Algeria, 36.4833, 3.4333 Vesoul, France, 47.6231, 6.1558 Kezmarok, Slovakia, 49.1383, 20.4292 Broxbourne, United Kingdom, 51.7495, -0.0216 Dudhgaon, India, 18.2787, 76.0536 Uirauna, Brazil, -6.5183, -38.4122 Andicun, China, 28.9761, 119.6403 Elandakuttai, India, 11.3992, 77.7782 Coolidge, United States, 32.9363, -111.5254 Nagasu, Japan, 32.9297, 130.4528 Guamare, Brazil, -5.0950, -36.3250 Vennesla, Norway, 58.3106, 7.8569 Medrissa, Algeria, 34.9000, 1.2333 Belari, India, 25.9655, 86.9161 Erongaricuaro, Mexico, 19.5833, -101.7167 Shal, Iran, 35.8992, 49.7689 Lagoa da Confusao, Brazil, -10.7939, -49.6239 Maryborough, Australia, -25.5375, 152.7019 Yenice, Turkey, 40.0883, 29.4211 White, United States, 40.6210, -79.1513 Akhty, Russia, 41.4647, 47.7400 Saint-Charles-Borromee, Canada, 46.0500, -73.4667 Niederkruchten, Germany, 51.1989, 6.2194 Tekkampatti, India, 11.2559, 76.8872 Matar, India, 22.7500, 72.6800 Chilcuautla, Mexico, 20.3333, -99.2333 Lyss, Switzerland, 47.0750, 7.3069 Sidi Ghiles, Algeria, 36.5833, 2.1167 Ulladulla, Australia, -35.3486, 150.4678 Sippola, Finland, 60.7392, 27.0003 Shedbal, India, 16.6892, 74.7543 Atyra, Paraguay, -25.2794, -57.1729 Kalikapur, India, 26.4956, 86.0890 Galanta, Slovakia, 48.1914, 17.7308 Motiong, Philippines, 11.7800, 125.0000 Pereiro, Brazil, -6.0450, -38.4608 Chemini, Algeria, 36.6000, 4.6167 Boumahra Ahmed, Algeria, 36.4500, 7.5167 Peddaboddepalle, India, 17.6606, 82.6296 Sahpur, India, 25.7035, 85.1483 Franklin Park, United States, 40.5903, -80.0999 Raynham, United States, 41.9312, -71.0437 Santafe, Spain, 37.1894, -3.7181 Yasnogorsk, Russia, 54.5000, 37.6667 Ruza, Russia, 55.7000, 36.2000 Udayendram, India, 12.6962, 78.6227 Es Sebt, Algeria, 36.6624, 7.0774 Beldanga, India, 24.7041, 87.8730 Mering, Germany, 48.2625, 10.9844 Castanet-Tolosan, France, 43.5164, 1.4989 Dawlish, United Kingdom, 50.5810, -3.4660 San Rafael Arriba, Costa Rica, 9.8778, -84.0708 Brookside, United States, 39.6665, -75.7152 Sarikamis, Turkey, 40.3381, 42.5731 Mangawan, India, 24.6675, 81.5464 Ratan, India, 25.4349, 86.6432 Tortum, Turkey, 40.2981, 41.6325 Rio Grande City, United States, 26.3808, -98.8215 Peralta, Dominican Republic, 18.5167, -70.7833 Shimohata, Japan, 36.2000, 137.8500 Pureparo de Echaiz, Mexico, 19.9000, -102.0167 Project Six, Philippines, 14.6561, 121.0408 Nonkon, Mali, 13.2214, -7.8539 Hendersonville, United States, 35.3247, -82.4575 Tenafly, United States, 40.9176, -73.9532 Penacova, Portugal, 40.2667, -8.2667 Phillipsburg, United States, 40.6894, -75.1821 Ovruch, Ukraine, 51.3244, 28.8081 Yasnyy, Russia, 51.0500, 59.9667 Civita Castellana, Italy, 42.2961, 12.4100 Volpiano, Italy, 45.2000, 7.7833 Cuevas del Almanzora, Spain, 37.3000, -1.8667 Castellarano, Italy, 44.5139, 10.7339 Kinross, South Africa, -26.4167, 29.0833 Dengshangcun, China, 41.3442, 118.1676 Bruntal, Czechia, 49.9883, 17.4647 Mexborough, United Kingdom, 53.4992, -1.2830 Pichucalco, Mexico, 17.5000, -93.1167 Libagon, Philippines, 10.3000, 125.0500 Anosy Avaratra, Madagascar, -18.8167, 47.5500 Discovery Bay, United States, 37.9063, -121.5990 Marui, India, 24.8639, 85.6338 Asbury Park, United States, 40.2226, -74.0119 Senlis, France, 49.2081, 2.5875 Kriel, South Africa, -26.2550, 29.2630 Beterou, Benin, 9.2000, 2.2667 Itanhandu, Brazil, -22.2958, -44.9350 Evans, United States, 42.6528, -79.0063 Metkovic, Croatia, 43.0500, 17.6500 Pimpalgaon Raja, India, 20.7167, 76.4333 Mulakaledu, India, 14.3648, 76.9267 Mashpee, United States, 41.6178, -70.4908 Cowansville, Canada, 45.2000, -72.7500 Conchas, Brazil, -23.0134, -48.0078 Rochedale, Australia, -27.5991, 153.1297 Carsibasi, Turkey, 41.0833, 39.3833 La Solana, Spain, 38.6500, -3.0667 Avrille, France, 47.5078, -0.5878 Northview, United States, 43.0427, -85.6016 Billapadu, India, 16.6364, 80.9661 Sainte-Anne-des-Plaines, Canada, 45.7617, -73.8204 Morlaix, France, 48.5783, -3.8267 Avsallar, Turkey, 36.5833, 31.8833 Arnedo, Spain, 42.2167, -2.1000 Tamesis, Colombia, 5.6667, -75.7167 Charam, Iran, 30.7461, 50.7461 Chervonopartyzansk, Ukraine, 48.0833, 39.7833 Burbach, Germany, 50.7444, 8.0861 Vieiro, Spain, 43.6481, -7.5900 Bidston, United Kingdom, 53.4020, -3.0780 Novouzensk, Russia, 50.4667, 48.1333 Whitman, United States, 42.0800, -70.9399 Capurso, Italy, 41.0500, 16.9167 Bunkeflostrand, Sweden, 55.5333, 12.9500 Shangtianba, China, 28.0390, 103.8584 Musapur, India, 25.6417, 87.4154 Saint-Brice-sous-Foret, France, 48.9992, 2.3578 Kanding, Taiwan, 22.5194, 120.5032 Swampscott, United States, 42.4757, -70.9068 Azpeitia, Spain, 43.1819, -2.2653 Humayingcun, China, 41.1145, 116.8985 Sumidouro, Brazil, -22.0500, -42.6750 Aravakkurichchi, India, 10.7760, 77.9076 Souk Et-Tleta des Oulad Hamdane, Morocco, 33.1047, -8.2495 Ljungby, Sweden, 56.8333, 13.9333 Harper Woods, United States, 42.4390, -82.9293 La Apartada, Colombia, 8.1006, -75.3825 Barrocas, Brazil, -11.5289, -39.0778 Salesopolis, Brazil, -23.5319, -45.8458 Galaz, Morocco, 34.5500, -4.8000 Huasca de Ocampo, Mexico, 20.2028, -98.5758 Pyapali, India, 15.2669, 77.7611 Kumiyama, Japan, 34.8814, 135.7328 Hallstahammar, Sweden, 59.6167, 16.2167 Gagarin Shahri, Uzbekistan, 40.6619, 68.1722 Zubin Potok, Kosovo, 42.9144, 20.6897 Upper Southampton, United States, 40.1723, -75.0363 Chellaston, United Kingdom, 52.8671, -1.4384 Ahram, Iran, 28.8828, 51.2756 Chinsali, Zambia, -10.5522, 32.0692 Dorfen, Germany, 48.2667, 12.1500 Mahaly, Madagascar, -24.1733, 46.3495 Seshambe, Tajikistan, 38.5333, 68.2500 Gombe, Uganda, 0.1811, 32.1142 Imerimandroso, Madagascar, -17.4299, 48.5901 Golmarmara, Turkey, 38.7167, 27.9167 Uchiko, Japan, 33.5333, 132.6500 Bangassi-Nangou, Mali, 14.4961, -11.5078 Isny im Allgau, Germany, 47.6919, 10.0394 Melouza, Algeria, 35.9808, 4.1861 Jangid, India, 18.4475, 79.8414 Amersham, United Kingdom, 51.6770, -0.6030 Tondangi, India, 17.2500, 82.4667 Bellavista, Chile, -34.9333, -71.3167 Hebli, India, 15.4858, 75.1283 San Vito al Tagliamento, Italy, 45.9153, 12.8556 Nakanojomachi, Japan, 36.5898, 138.8410 Dougouni, Mali, 12.1436, -6.0011 Tasucu, Turkey, 36.3333, 33.8833 Schwyz, Switzerland, 47.0211, 8.6536 Xiangyuncun, China, 24.9641, 118.1668 Belokurikha, Russia, 51.9833, 84.9833 Adjud, Romania, 46.1000, 27.1797 Cessnock, Australia, -32.8342, 151.3555 Wakuya, Japan, 38.5397, 141.1282 Lake Wylie, United States, 35.0997, -81.0678 Norridge, United States, 41.9637, -87.8231 Fray Luis A. Beltran, Argentina, -32.7833, -60.7333 Tanhuato de Guerrero, Mexico, 20.2819, -102.3319 Montagu, South Africa, -33.7833, 20.1167 Petlawad, India, 23.0108, 74.7961 Borodino, Russia, 55.9056, 94.8997 Espumoso, Brazil, -28.7250, -52.8500 Itaporanga, Brazil, -23.7078, -49.4897 Yaguaraparo, Venezuela, 10.5667, -62.8333 Ramonville-Saint-Agne, France, 43.5434, 1.4787 Verwood, United Kingdom, 50.8815, -1.8785 Seven Pagodas, India, 12.6197, 80.1944 Salua, India, 22.6100, 88.2700 Gayeri, Burkina Faso, 12.6500, 0.5000 Pa, Burkina Faso, 11.5500, -3.2600 Redruth, United Kingdom, 50.2328, -5.2264 Cumbum, India, 15.5667, 79.1167 Waremme, Belgium, 50.6967, 5.2569 Rio San Juan, Dominican Republic, 19.6400, -70.0800 Puliyur, India, 10.9499, 78.1453 Hathiaundha, India, 25.7223, 86.9972 Moura, Portugal, 38.1397, -7.4505 Sobreda, Portugal, 38.6496, -9.1898 Dixon, United States, 41.8439, -89.4794 Kauhava, Finland, 63.1000, 23.0667 Douar El Arbaa Bou Quorra, Morocco, 34.7490, -5.1982 Skvyra, Ukraine, 49.7167, 29.6667 Lakhaura, India, 26.7522, 84.9647 Gaspe, Canada, 48.8333, -64.4833 Palmers Green, United Kingdom, 51.6178, -0.1092 Totteridge, United Kingdom, 51.6354, -0.2000 Gurramkonda, India, 13.7822, 78.5900 Nazare, Portugal, 39.6000, -9.0667 Meruoca, Brazil, -3.5419, -40.4550 Mateszalka, Hungary, 47.9431, 22.3167 Lebanon, United States, 37.6717, -92.6603 Podebrady, Czechia, 50.1425, 15.1189 Blaydon, United Kingdom, 54.9630, -1.7190 Winkfield, United Kingdom, 51.4318, -0.7096 Chittarikal, India, 12.3234, 75.3583 San Pedro Tapanatepec, Mexico, 16.3667, -94.2000 Front Royal, United States, 38.9260, -78.1838 Kawaminami, Japan, 32.1919, 131.5258 Vincent, United States, 34.0983, -117.9238 Florencia, Costa Rica, 10.3665, -84.4814 New Brighton, United Kingdom, 53.4320, -3.0490 Poco Fundo, Brazil, -21.7808, -45.9650 Argun, Russia, 43.2944, 45.8839 Biritinga, Brazil, -11.6169, -38.8000 Mallapuram, India, 11.9823, 78.2480 Huyuk, Turkey, 37.9519, 31.5958 Telua, India, 26.6396, 84.5108 Vicovu de Sus, Romania, 47.9258, 25.6800 Alice, South Africa, -32.7892, 26.8350 Glasgow, United States, 37.0048, -85.9263 Canet de Mar, Spain, 41.5833, 2.5833 Belmont, United States, 35.2212, -81.0401 America Dourada, Brazil, -11.4550, -41.4358 Castiglione del Lago, Italy, 43.1271, 12.0452 Kontiolahti, Finland, 62.7667, 29.8500 Horsham, Australia, -36.7167, 142.2000 Kawasaki, Japan, 33.6000, 130.8150 Vasterhaninge, Sweden, 59.1167, 18.1000 Grodzisk Wielkopolski, Poland, 52.2333, 16.3667 Johnson City, United States, 42.1230, -75.9624 Mineral Wells, United States, 32.8169, -98.0776 Gangapur, India, 25.5136, 86.8957 Majiagoucha, China, 37.5033, 109.6303 Ambohimierambe-Andranofito, Madagascar, -19.7909, 47.4258 Bella Vista, Argentina, -27.0333, -65.3000 Baiersbronn, Germany, 48.5058, 8.3711 Laxou, France, 48.6864, 6.1528 Sansepolcro, Italy, 43.5756, 12.1439 Lovua, Angola, -7.3470, 20.1751 Bayserke, Kazakhstan, 43.4797, 77.0336 Warni, India, 18.5436, 77.9072 Srivardhan, India, 18.0333, 73.0167 Kutchan, Japan, 42.9000, 140.7667 Ban Na Kham, Thailand, 14.0048, 101.8409 Jaguapita, Brazil, -23.1128, -51.5319 Tagounite, Morocco, 29.9585, -5.9151 Zacualpan, Mexico, 18.7197, -99.7800 Mazagran, Algeria, 35.9019, 0.7269 Ashby de la Zouch, United Kingdom, 52.7460, -1.4760 Xihuangni, China, 38.3575, 113.8519 Ceska Trebova, Czechia, 49.9019, 16.4472 Astravyets, Belarus, 54.6136, 25.9553 Vize, Turkey, 41.5736, 27.7653 Illzach, France, 47.7831, 7.3486 Ain Mediouna, Morocco, 34.5000, -4.5500 Rumst, Belgium, 51.0833, 4.4167 Koduman, India, 9.1917, 76.8000 Tamaki, Japan, 34.4833, 136.6333 Cuarte de Huerva, Spain, 41.5833, -0.9167 Radviliskis, Lithuania, 55.8000, 23.5500 Sakabansi, Benin, 10.0442, 3.3821 Mirai, Brazil, -21.1953, -42.6142 Maesawa, Japan, 39.0500, 141.1167 Bhoj, India, 16.5333, 74.4500 Itki Thakurgaon, India, 23.3456, 85.1114 Khaira, India, 26.3433, 87.1476 Chautham, India, 25.5439, 86.6567 Doumanaba, Mali, 11.6750, -5.9314 Gondomar, Spain, 42.1111, -8.7611 Brake, Germany, 53.3333, 8.4833 Bilaua, India, 26.0501, 78.2752 Kulunda, Russia, 52.5827, 78.9473 Fritzlar, Germany, 51.1333, 9.2833 Newtown, United States, 39.9920, -75.4106 Silvino Lobos, Philippines, 12.3281, 124.8464 Vandalia, United States, 39.8791, -84.1930 Markgroningen, Germany, 48.9047, 9.0808 Nopala de Villagran, Mexico, 20.2528, -99.6433 Witzenhausen, Germany, 51.3422, 9.8578 Kenmore, United States, 42.9646, -78.8713 Wulflingen, Switzerland, 47.5100, 8.6830 Huitzilan, Mexico, 19.9667, -97.6833 Usingen, Germany, 50.3344, 8.5375 Galatone, Italy, 40.1500, 18.0667 Torello, Spain, 42.0495, 2.2650 Ban Ton Thong Chai, Thailand, 18.3375, 99.5334 Grenzach-Wyhlen, Germany, 47.5450, 7.6758 Babhani Bholwa, India, 26.0876, 86.7456 Al Madamud, Egypt, 25.7333, 32.7125 Tagoloan, Philippines, 8.1333, 124.2667 Highland Springs, United States, 37.5516, -77.3285 Bhatranha, India, 25.9846, 86.6348 Neustadt bei Coburg, Germany, 50.3289, 11.1211 Changamkari, India, 9.6333, 76.8667 Putaparti, India, 14.1660, 77.8110 Cernavoda, Romania, 44.3381, 28.0336 Rossville, United States, 39.3572, -76.4767 Capotille, Haiti, 19.4480, -71.6929 Kidal, Mali, 18.4333, 1.4000 Sooke, Canada, 48.3761, -123.7378 Tabhka Khas, India, 25.6518, 85.9426 Berkley, United States, 42.4986, -83.1853 Bad Wurzach, Germany, 47.9094, 9.8994 Hasanpur, India, 26.1147, 87.2319 Jadia, India, 26.0937, 86.9852 Phongsali, Laos, 21.6833, 102.1000 Beech Grove, United States, 39.7157, -86.0871 La Fleche, France, 47.6959, -0.0747 Bina, India, 26.0792, 86.6326 Laurinburg, United States, 34.7602, -79.4773 Bonheiden, Belgium, 51.0224, 4.5479 Issoire, France, 45.5450, 3.2497 Makapanstad, South Africa, -25.2390, 28.1160 West Park, United States, 25.9840, -80.1923 Saint-Avertin, France, 47.3675, 0.7278 Kohir, India, 17.6000, 77.7167 Natividade do Carangola, Brazil, -21.0419, -41.9728 Hatton, Sri Lanka, 6.8897, 80.5981 Campodarsego, Italy, 45.5000, 11.9167 Hasanganj, India, 26.7800, 80.6700 Clevelandia, Brazil, -26.3958, -52.4708 Mqam at Tolba, Morocco, 33.9375, -6.2544 Ipaucu, Brazil, -23.0569, -49.6267 Grefrath, Germany, 51.3333, 6.3333 Buttelborn, Germany, 49.9000, 8.5167 Chateau-Thierry, France, 49.0400, 3.4000 Mani, Burkina Faso, 13.2600, -0.2094 Peddapalle, India, 14.4046, 78.9456 Devendranagar, India, 24.6169, 80.3789 Depew, United States, 42.9118, -78.7043 Northenden, United Kingdom, 53.4075, -2.2583 Ut Bulag, China, 44.9089, 82.2054 Ogijares, Spain, 37.1167, -3.6000 Olonne-sur-Mer, France, 46.5369, -1.7717 Degtyarsk, Russia, 56.7000, 60.1167 Sabou, Burkina Faso, 12.0667, -2.2333 Bangor, United Kingdom, 53.2280, -4.1280 Washington, United States, 39.7494, -77.5579 Alvinopolis, Brazil, -20.1069, -43.0489 Adilcevaz, Turkey, 38.8058, 42.7469 Pedara, Italy, 37.6167, 15.0667 Andondabe, Madagascar, -17.7665, 49.3793 Tatarikan, Philippines, 7.7300, 124.1200 Gantt, United States, 34.7837, -82.4027 Echuca, Australia, -36.1333, 144.7500 Kanungu, Uganda, -0.8969, 29.7756 Adams, United States, 40.7092, -80.0118 Bolivia, Cuba, 22.0750, -78.3503 Suhut, Turkey, 38.5333, 30.5500 Durham, United States, 43.1174, -70.9194 Le Bourget, France, 48.9353, 2.4256 Patnanungan, Philippines, 14.7800, 122.1800 Rizal, Philippines, 8.5272, 123.5517 New Paltz, United States, 41.7577, -74.0883 Rajni, India, 25.8132, 86.9772 Ekma, India, 25.9670, 84.5383 Kawagoe, Japan, 35.0167, 136.6667 Los Osos, United States, 35.3065, -120.8242 Perchtoldsdorf, Austria, 48.1167, 16.2667 Amlash, Iran, 37.0944, 50.1928 Port Royal, United States, 32.3557, -80.7029 Pontinia, Italy, 41.4083, 13.0443 La Magdalena Tlaltelulco, Mexico, 19.2667, -98.2000 Tonawanda, United States, 43.0105, -78.8805 Murray Bridge, Australia, -35.1170, 139.2670 Tubod, Philippines, 9.5547, 125.5697 Uckfield, United Kingdom, 50.9700, 0.1000 Revur, India, 16.8216, 79.9926 Guadalupe Victoria, Mexico, 19.2833, -97.3333 Talladega, United States, 33.4333, -86.0986 Kamitonda, Japan, 33.7000, 135.4333 Ochanthururtha, India, 10.0000, 76.2333 Chepica, Chile, -34.7333, -71.2833 El Arenal, Mexico, 20.2167, -98.9167 Contamana, Peru, -7.3333, -75.0167 Tone, Japan, 35.8578, 140.1392 Le Hochet, Mauritius, -20.1350, 57.5211 Capela, Brazil, -9.4075, -36.0736 Satyamangala, India, 13.0193, 76.1243 Filiasi, Romania, 44.4000, 23.5200 Mastic, United States, 40.8096, -72.8479 Langerwehe, Germany, 50.8167, 6.3497 Udiyavara, India, 13.3097, 74.7366 Bissendorf, Germany, 52.2333, 8.1667 Ban Ho Mae Salong, Thailand, 20.1631, 99.6225 Ferreiros, Brazil, -7.4478, -35.2439 Monroe, United States, 39.4461, -84.3667 Roanoke Rapids, United States, 36.4452, -77.6490 Swallownest, United Kingdom, 53.3623, -1.3251 Keralassheri, India, 10.8250, 76.5000 Kutavettur, India, 8.9167, 76.7500 Brasilandia, Brazil, -17.0087, -46.0086 Klimavichy, Belarus, 53.6167, 31.9500 Puerto Salgar, Colombia, 5.5000, -74.5833 Kuusamo, Finland, 65.9667, 29.1833 Islampur, India, 24.1548, 88.4665 Bangui, Philippines, 18.5378, 120.7653 Ban Mae Sun Luang, Thailand, 19.8305, 99.1706 Boa Esperanca do Sul, Brazil, -21.9925, -48.3908 Netherton, United Kingdom, 52.4908, -2.0835 Aruvikkara, India, 8.3331, 77.2788 White Center, United States, 47.5086, -122.3479 Kaintragarh, India, 20.7211, 84.5351 Landsberg, Germany, 51.5333, 12.1667 Konarka, India, 19.8908, 86.1003 Shamsa, India, 25.6230, 85.9310 Hudiksvall, Sweden, 61.7290, 17.1121 Westervoort, Netherlands, 51.9667, 5.9667 Busko-Zdroj, Poland, 50.4667, 20.7167 Andorinha, Brazil, -10.3450, -39.8328 Camp Pendleton South, United States, 33.2329, -117.3930 Cassano delle Murge, Italy, 40.8833, 16.7667 Gloversville, United States, 43.0491, -74.3465 Struga, North Macedonia, 41.1775, 20.6789 Dionisio Cerqueira, Brazil, -26.2550, -53.6400 Dembecha, Ethiopia, 10.5500, 37.4833 Naduvattam, India, 11.4808, 76.5437 Saidpur, India, 25.5436, 86.5640 Schiffdorf, Germany, 53.5358, 8.6589 Alpedrete, Spain, 40.6583, -4.0322 Roquebrune-sur-Argens, France, 43.4300, 6.6300 Kasli, Russia, 55.9000, 60.7667 Macomb, United States, 40.4709, -90.6807 Wallan, Australia, -37.4167, 144.9833 Hudson, United States, 44.9639, -92.7312 Mossendjo, Congo (Brazzaville), -2.9453, 12.7156 Barajor, India, 24.7992, 86.3731 Pavannur, India, 11.9500, 75.5000 Pacific Grove, United States, 36.6188, -121.9259 Carrieres-sur-Seine, France, 48.9108, 2.2889 Ben Taieb, Morocco, 35.0837, -3.4696 Verdal, Norway, 63.7922, 11.4817 Acala, Mexico, 16.5533, -92.8069 Fayroz Koh, Afghanistan, 34.5225, 65.2517 Taywarah, Afghanistan, 33.5100, 64.4200 Baraki, Afghanistan, 33.9333, 68.9167 Spitak, Armenia, 40.8372, 44.2675 Villa Ojo de Agua, Argentina, -29.5167, -63.7000 Baisari, Bangladesh, 22.7959, 90.1259 Jamaica, Cuba, 22.9756, -82.1685 Guayos, Cuba, 22.0496, -79.4611 Tillor Khurd, India, 22.6170, 75.9480 Chettikulam, India, 8.0943, 77.5614 Muttamtura, India, 8.1300, 77.3200 Mundia, India, 27.4014, 75.6892 Damalcheruvu, India, 13.4833, 79.0500 Miri, India, 19.2800, 74.8400 Cortalim, India, 15.3978, 73.9106 Majhgawan, India, 24.8000, 80.8000 Hombal, India, 15.5164, 75.5556 Bellatti, India, 12.6500, 78.0000 Singhanwala, India, 30.7699, 75.1218 Hullahalli, India, 12.1000, 76.5500 Sathamba, India, 23.1691, 73.3266 Valattur, India, 12.8899, 78.8394 Turori, India, 17.8278, 76.6903 Shafinagar, India, 28.4117, 78.1365 Khandhar, India, 26.0233, 76.6097 Galatge, India, 16.4200, 74.5800 Vasa, India, 22.6608, 72.7552 Bartalah, Iraq, 36.3537, 43.3813 Amirli, Iraq, 34.7271, 44.5878 Quthing, Lesotho, -30.4001, 27.7002 Manambondro, Madagascar, -23.7998, 47.5450 Milenaka, Madagascar, -22.8386, 43.5849 Soalala, Madagascar, -16.1025, 45.3267 Ambodiriana, Madagascar, -19.5888, 47.5319 Befasy, Madagascar, -20.5779, 44.3600 Kopoky, Madagascar, -25.2122, 45.2095 Ramainandro, Madagascar, -19.2969, 47.0040 Ambinanindrano, Madagascar, -20.6804, 47.8027 Analamary, Madagascar, -24.2455, 47.2196 Ambatomanjaka, Madagascar, -18.8761, 46.8658 Andranovelona, Madagascar, -19.6295, 47.6204 Ianantsony, Madagascar, -23.5523, 43.7603 Imanombo, Madagascar, -24.4363, 45.8257 Beroy Atsimo, Madagascar, -24.0044, 44.6642 Alarobia Bemaha, Madagascar, -20.2109, 46.8881 Talata Ampano, Madagascar, -21.5512, 47.0340 Ambatoharanana, Madagascar, -17.3424, 49.1186 Sahave, Madagascar, -21.0793, 47.1126 Bevoay, Madagascar, -24.4833, 47.0167 Anahidrano, Madagascar, -15.0162, 47.8912 Ambahive, Madagascar, -22.2000, 47.7167 Ifatsy, Madagascar, -22.3902, 47.7359 Ankisabe, Madagascar, -19.2951, 46.4812 Anjoma-Ramartina, Madagascar, -19.6397, 45.9543 Lokomby, Madagascar, -22.1826, 47.7463 Behisatse, Madagascar, -21.8062, 45.1226 Iharana, Madagascar, -13.3750, 50.0100 Manandona, Madagascar, -20.0553, 47.0556 Antanimenabaka, Madagascar, -16.9373, 48.4913 Marofototra, Madagascar, -20.8525, 48.1546 Tsiatajavona-Ankaratra, Madagascar, -19.3777, 47.3319 Antsoso, Madagascar, -19.8167, 46.8667 Ambesisika, Madagascar, -16.5205, 46.8544 Ankilimivory, Madagascar, -24.4724, 44.9772 Antanifotsy, Madagascar, -16.8667, 49.6333 Wan Long, Burma, 22.1667, 99.1833 Kyaukmyaung, Burma, 22.5833, 95.9500 Aiyetoro Gbede, Nigeria, 7.9833, 6.0000 Amawom, Nigeria, 5.4667, 7.5667 Ramechhap, Nepal, 27.3260, 86.0870 Bhimphedi, Nepal, 27.5510, 85.1300 Salyan, Nepal, 28.3500, 82.1833 Richmond, New Zealand, -41.3333, 173.1833 Mian Sahib, Pakistan, 28.1559, 68.6397 Awan Patti, Pakistan, 34.2500, 73.6600 Koungheul, Senegal, 13.9667, -14.8053 Bakel, Senegal, 14.9042, -12.4583 Yufle, Somalia, 10.3758, 47.1964 Kuljibrin, Syria, 36.5368, 37.1171 Sarmada, Syria, 36.1855, 36.7223 Gammarth, Tunisia, 36.9097, 10.2867 Ozdere, Turkey, 38.0175, 27.1283 Novyi Buh, Ukraine, 47.6833, 32.5000 Kalongo, Uganda, 3.0400, 33.3711 Matuga, Uganda, 0.4603, 32.5286 Zombo, Uganda, 2.5131, 30.9081 Mutukula, Uganda, -0.9997, 31.4167 Chaguaramas, Venezuela, 9.3333, -66.2667 Clarines, Venezuela, 9.9433, -65.1661 Kezi, Zimbabwe, -20.9167, 28.4667 Yinhua, China, 33.4500, 110.2500 Talpa de Allende, Mexico, 20.3806, -104.8222 Shambu, Ethiopia, 9.5667, 37.1000 Sanyi, Taiwan, 24.4167, 120.7667 Huchuan, China, 34.9249, 106.1409 Suvalan, Azerbaijan, 40.4843, 50.1840 Weisswasser/Oberlausitz, Germany, 51.5000, 14.6333 Anororo, Madagascar, -17.5149, 48.4353 Santa, Philippines, 17.4860, 120.4344 Susanville, United States, 40.4206, -120.6132 Pochep, Russia, 52.9333, 33.4500 Antequera, Philippines, 9.7812, 123.8975 La Gloria, Colombia, 8.5833, -73.5833 Arlington, United States, 35.2594, -89.6680 Kaguchi, India, 11.4519, 76.8061 Pyryatyn, Ukraine, 50.2500, 32.5333 Salinas da Margarida, Brazil, -12.8708, -38.7639 Sant'Arpino, Italy, 40.9575, 14.2492 Greenlawn, United States, 40.8632, -73.3646 Calanogas, Philippines, 7.7500, 124.1000 Yelur, India, 15.7817, 74.5178 Lapseki, Turkey, 40.3439, 26.6836 Mandleshwar, India, 22.1760, 75.6599 Pine, United States, 40.6437, -80.0315 Andipalaiyam, India, 11.0920, 77.3150 Metuchen, United States, 40.5424, -74.3628 Highland Park, United States, 40.5006, -74.4283 Obando, Colombia, 4.5833, -75.9167 Kurichchi, India, 11.5701, 77.6969 Belkheir, Algeria, 36.4667, 7.4833 Bouchegouf, Algeria, 36.4667, 7.4833 Tiadiaye, Senegal, 14.4209, -16.7061 Texenna, Algeria, 36.6500, 5.7833 Casalmaggiore, Italy, 44.9858, 10.4147 Candoi, Brazil, -25.6628, -52.1258 Porcia, Italy, 45.9667, 12.6167 Castelnuovo Rangone, Italy, 44.5519, 10.9358 Chrysoupoli, Greece, 40.9833, 24.7000 Avanos, Turkey, 38.7150, 34.8467 Spring Creek, United States, 40.7450, -115.5983 Kenora, Canada, 49.7667, -94.4833 Dinan, France, 48.4564, -2.0489 Kenley, United Kingdom, 51.3242, -0.0969 Harohalli, India, 12.6807, 77.4743 Pallasovka, Russia, 50.0500, 46.8833 Santa Brigida, Brazil, -9.7358, -38.1258 El Hadjira, Algeria, 32.6167, 5.5167 Holliston, United States, 42.1977, -71.4450 Paralimni, Cyprus, 35.0333, 33.9833 Saint-Servan-sur-Mer, France, 48.6361, -2.0147 Baucau, Timor-Leste, -8.4757, 126.4563 Cold Lake, Canada, 54.4642, -110.1825 Veliki Preslav, Bulgaria, 43.1667, 26.8167 Langelsheim, Germany, 51.9381, 10.3350 Goluwali, India, 29.6300, 74.0600 'Tlat Bni Oukil, Morocco, 32.5770, -6.8400 Santa Luzia, Brazil, -6.8719, -36.9189 Bludenz, Austria, 47.1333, 9.8167 Vianopolis, Brazil, -16.7419, -48.5158 Paris, Canada, 43.2000, -80.3833 Monkey Bay, Malawi, -14.0728, 34.9201 Much, Germany, 50.9167, 7.4000 Dolo, Italy, 45.4249, 12.0758 South Farmingdale, United States, 40.7175, -73.4473 Coconuco, Colombia, 2.2500, -76.4167 Great Baddow, United Kingdom, 51.7190, 0.5070 Finale Emilia, Italy, 44.8319, 11.2957 Sudbury, United Kingdom, 51.5537, -0.3199 Wyke, United Kingdom, 53.7333, -1.7667 Neustadt an der Donau, Germany, 48.8000, 11.7667 Kalininsk, Russia, 51.5000, 44.4667 Hooksett, United States, 43.0709, -71.4365 Branchburg, United States, 40.5629, -74.7140 Washington, United States, 38.5515, -91.0154 Vallur, India, 13.2560, 80.2818 Lambidou, Mali, 14.3122, -9.5508 Malsch, Germany, 48.8808, 8.3342 Beckingen, Germany, 49.3928, 6.7008 Hazel Park, United States, 42.4619, -83.0977 Mitane, Japan, 40.1017, 140.0050 Ratba, Morocco, 34.7833, -4.9333 Mendrisio, Switzerland, 45.8667, 8.9833 Ritterhude, Germany, 53.1831, 8.7561 Lemon Hill, United States, 38.5172, -121.4573 Joaima, Brazil, -16.6542, -41.0306 Popovo, Bulgaria, 43.3496, 26.2270 Sopelana, Spain, 43.3814, -2.9792 Restinga Seca, Brazil, -29.8128, -53.3750 Majholi, India, 23.5011, 79.9240 Lilburn, United States, 33.8897, -84.1364 Uusikaupunki, Finland, 60.8000, 21.4167 Villers-les-Nancy, France, 48.6731, 6.1547 Ganjam, India, 19.3870, 85.0508 Swidwin, Poland, 53.7833, 15.7667 Kimyogarlar, Uzbekistan, 39.6672, 66.8461 Calkini, Mexico, 20.3667, -90.0500 Chandi, India, 25.7296, 87.5195 Lake Arbor, United States, 38.9105, -76.8304 Itahara, Nepal, 26.5500, 87.6200 Jisr ez Zarqa, Israel, 32.5381, 34.9122 Ahigbe Koffikro, Côte d’Ivoire, 5.4075, -3.3802 Chemmanam, India, 9.8072, 76.2774 Nalerigu, Ghana, 10.5273, -0.3698 Waunakee, United States, 43.1829, -89.4447 Schwabmunchen, Germany, 48.1789, 10.7550 Barysh, Russia, 53.6500, 47.1000 Brooks, Canada, 50.5642, -111.8989 Yellareddi, India, 18.1859, 78.0212 Lanji, India, 21.5018, 80.5406 Haubourdin, France, 50.6097, 2.9878 Sembedu, India, 13.1298, 79.5634 Lakkundi, India, 15.3897, 75.7183 Henderson, United States, 36.3256, -78.4151 Castanuelas, Dominican Republic, 19.7000, -71.5000 Nakagawa, Japan, 36.7382, 140.1715 Tecuala, Mexico, 22.4004, -105.4600 Fairview, United States, 40.8182, -74.0022 Pursa, India, 26.3019, 86.4778 Nerchinsk, Russia, 51.9944, 116.5556 Kunnumel, India, 9.3500, 76.4000 Potsdam, United States, 44.6774, -75.0396 Lalejin, Iran, 34.9742, 48.4756 Lolotique, El Salvador, 13.5500, -88.3500 Kew Green, United Kingdom, 51.5308, -0.2248 Lagangilang, Philippines, 17.6100, 120.7300 Jever, Germany, 53.5744, 7.9008 Barra do Sul, Brazil, -26.4682, -48.6104 Sardinal, Costa Rica, 10.5343, -85.6955 Badarpur, India, 24.8685, 92.5961 San Juan, Philippines, 10.2700, 125.1800 Kela Khera, India, 29.0900, 79.1900 Ammur, India, 12.9750, 79.3628 Ain Kansara, Morocco, 34.1500, -4.8314 West University Place, United States, 29.7157, -95.4321 Sindhnur, India, 15.7700, 76.7556 Aizubange, Japan, 37.5615, 139.8216 Vinanivao, Madagascar, -15.8832, 50.2746 Cifteler, Turkey, 39.3831, 31.0392 Kentville, Canada, 45.0775, -64.4958 Yauco, Puerto Rico, 18.0344, -66.8615 Aiyampuzha, India, 10.2500, 76.4667 Kurate, Japan, 33.7921, 130.6741 Chapelle-lez-Herlaimont, Belgium, 50.4667, 4.2833 Beizhou, China, 29.1636, 112.6811 Vakhsh, Tajikistan, 37.7108, 68.8311 Qumqo`rg`on, Uzbekistan, 37.8278, 67.5972 Quan'ancun, China, 25.1345, 114.2646 Arnouville-les-Gonesse, France, 48.9878, 2.4175 Glenn Dale, United States, 38.9833, -76.8040 Tsabit, Algeria, 28.3503, -0.2208 Sisian, Armenia, 39.5208, 46.0322 Coquimatlan, Mexico, 19.2038, -103.8086 Nastola, Finland, 60.9500, 25.9333 Valangiman, India, 10.8897, 79.3940 Naxxar, Malta, 35.9150, 14.4447 Stolac, Bosnia and Herzegovina, 43.0839, 17.9592 Dimiao, Philippines, 9.6200, 124.1700 Kisvarda, Hungary, 48.2264, 22.0844 Boulder City, United States, 35.8407, -114.9257 Jhandapur, India, 25.3995, 86.9479 Sassenheim, Netherlands, 52.2258, 4.5225 Putyvl, Ukraine, 51.3167, 33.8667 Fort Payne, United States, 34.4559, -85.6965 Sahakevo, Madagascar, -20.2703, 47.8502 Chemax, Mexico, 20.6550, -87.9372 West Wickham, United Kingdom, 51.3765, -0.0193 Parapatti, India, 12.1083, 78.0198 Cerro Maggiore, Italy, 45.6000, 8.9500 Taruma, Brazil, -22.7469, -50.5769 Doukouya, Côte d’Ivoire, 6.4262, -5.5592 Champapur, India, 26.8881, 84.8340 Bacuag, Philippines, 9.6081, 125.6405 Przeworsk, Poland, 50.0667, 22.5000 Ngolobougou, Mali, 12.1733, -6.7089 Sera, Japan, 34.5869, 133.0567 San Tomas, Philippines, 15.8792, 120.5883 Lidzbark Warminski, Poland, 54.1167, 20.5833 Loganville, United States, 33.8353, -83.8958 Alampur, India, 15.8793, 78.1334 Hanamsagar, India, 15.8722, 76.0431 Fiorenzuola d'Arda, Italy, 44.9333, 9.9000 Nisko, Poland, 50.5200, 22.1394 Hereford, United States, 34.8225, -102.4001 Oldsmar, United States, 28.0506, -82.6698 Ravels, Belgium, 51.3708, 4.9926 Breaza, Romania, 45.1872, 25.6622 Forest City, United States, 28.6619, -81.4444 Kastsyukovichy, Belarus, 53.3333, 32.0500 Shklow, Belarus, 54.2236, 30.2864 Harchoune, Algeria, 36.1139, 1.5056 Tayum, Philippines, 17.6200, 120.6600 Hedehusene, Denmark, 55.6470, 12.1936 Shepshed, United Kingdom, 52.7711, -1.2951 Riverdale, United States, 33.5639, -84.4103 Madalena, Brazil, -4.8569, -39.5769 Cujubim, Brazil, -9.3628, -62.5853 Vellalapuram, India, 11.6525, 77.9380 Barharwa, India, 24.8571, 87.7790 Yuchi, Taiwan, 23.9000, 120.9333 Ayni, Tajikistan, 39.3975, 68.5406 Munsingen, Germany, 48.4128, 9.4953 Grecia, Costa Rica, 10.0693, -84.3136 Gross-Zimmern, Germany, 49.8833, 8.8333 Tamani, Mali, 13.1067, -7.8379 Chailaha, India, 26.6738, 84.8801 Havre de Grace, United States, 39.5480, -76.1146 Pomorie, Bulgaria, 42.5569, 27.6405 Chegdomyn, Russia, 51.1178, 133.0241 Williamstown, United States, 39.6874, -74.9786 Nagarur, India, 8.7333, 76.8500 Great Falls, United States, 39.0110, -77.3013 Davidson, United States, 35.4840, -80.8247 Qiaoyang, China, 35.0393, 104.1960 Stein bei Nurnberg, Germany, 49.4167, 11.0167 Mori, Japan, 42.1000, 140.5833 Bromborough, United Kingdom, 53.3360, -2.9780 Ritchie, South Africa, -29.0500, 24.6000 Berlare, Belgium, 51.0250, 4.0025 Montevrain, France, 48.8750, 2.7456 Chipurupalle, India, 18.3000, 83.5667 Niquinohomo, Nicaragua, 11.9000, -86.1000 El Maknassi, Tunisia, 34.6042, 9.6056 Madhuban, India, 26.4386, 85.1357 Rylsk, Russia, 51.5667, 34.6667 Tremelo, Belgium, 50.9918, 4.7039 Terra Rica, Brazil, -22.7089, -52.6169 Gabane, Botswana, -24.6667, 25.7822 Rellingen, Germany, 53.6500, 9.8167 Avalpundurai, India, 11.2310, 77.7182 Liangshan, China, 25.5903, 105.8050 Huitan, Guatemala, 15.1000, -91.6167 Koumaira, Mali, 15.7833, -3.8667 Tostedt, Germany, 53.2833, 9.7167 San Mateo del Mar, Mexico, 16.2105, -94.9822 San Vito, Costa Rica, 8.8400, -82.9784 Bela Vista do Paraiso, Brazil, -22.9969, -51.1908 Haga, Japan, 36.5483, 140.0582 Jinta, China, 37.8366, 102.5560 Taurianova, Italy, 38.3500, 16.0167 Timissa, Mali, 13.8228, -4.2078 Botelhos, Brazil, -21.6424, -46.3937 Monterrey, Colombia, 4.8783, -72.8972 Saint-Avold, France, 49.1044, 6.7067 Betsukai, Japan, 43.4000, 145.1167 Hariharpara, India, 24.0468, 88.4244 Cherry Hill Mall, United States, 39.9384, -75.0117 Grandola, Portugal, 38.1768, -8.5689 Tall Abyad, Syria, 36.6965, 38.9538 Mercaderes, Colombia, 1.8000, -77.1667 Kumaramangalam, India, 11.3676, 77.9300 Cabral, Dominican Republic, 18.2500, -71.2167 Tendukheda, India, 23.3962, 79.5395 California City, United States, 35.1578, -117.8721 Tadjourah, Djibouti, 11.7833, 42.8833 Petersfield, United Kingdom, 51.0038, -0.9374 Ponto Novo, Brazil, -10.8628, -40.1336 Montargis, France, 47.9978, 2.7333 Bolhrad, Ukraine, 45.6672, 28.6128 Cabanas, Guatemala, 14.9333, -89.8000 Warwick, United States, 40.2503, -75.0818 Cherrapunji, India, 25.2840, 91.7210 Port Antonio, Jamaica, 18.1757, -76.4503 Kumaripur, India, 25.4425, 87.6217 Nenmini, India, 11.0528, 76.2083 Kochkor-Ata, Kyrgyzstan, 41.0358, 72.4814 Doganhisar, Turkey, 38.1447, 31.6781 Niedernhausen, Germany, 50.1667, 8.3167 Karakocan, Turkey, 38.9500, 40.0333 Candido de Abreu, Brazil, -24.5669, -51.3333 Ilkley, United Kingdom, 53.9250, -1.8220 Patrocinio Paulista, Brazil, -20.6394, -47.2817 Benipati, India, 26.4442, 85.9083 Jozefoslaw, Poland, 52.1069, 21.0392 Radzyn Podlaski, Poland, 51.7828, 22.6242 Comox, Canada, 49.6733, -124.9022 Buerarema, Brazil, -14.9589, -39.3000 Drahichyn, Belarus, 52.1833, 25.1500 Cerritos, Mexico, 22.4275, -100.2783 Dennis, United States, 41.7064, -70.1644 Dehmoi, Tajikistan, 40.2167, 69.5167 Ostroh, Ukraine, 50.3333, 26.5167 Al Malikiyah, Bahrain, 26.1008, 50.4878 Weizhou, China, 21.0214, 109.1214 Muthallath al Azraq, Jordan, 31.8342, 36.8150 San Julian, Philippines, 11.7536, 125.4558 Anta, Portugal, 41.0073, -8.6250 Hanover, United States, 42.1224, -70.8566 Devarapalle, India, 17.0300, 81.3700 Merate, Italy, 45.7000, 9.4243 Souto Soares, Brazil, -12.0889, -41.6378 Palod, India, 8.7033, 77.0264 Citta Sant'Angelo, Italy, 42.5167, 14.0500 Baguley, United Kingdom, 53.3990, -2.2760 Stony Point, United States, 41.2593, -74.0112 Shuichecun, China, 24.0900, 116.0174 Kapiri Mposhi, Zambia, -13.9772, 28.6847 Bensville, United States, 38.6176, -77.0077 Deblin, Poland, 51.5667, 21.8614 Lapy, Poland, 52.9833, 22.8833 Harsefeld, Germany, 53.4500, 9.5000 Ezzhiliga, Morocco, 33.3000, -6.5333 Sortavala, Russia, 61.7056, 30.6958 Araputanga, Brazil, -15.4708, -58.3528 Itamonte, Brazil, -22.2839, -44.8700 Konina, Mali, 12.4567, -5.7725 Fiadanana, Madagascar, -18.2250, 46.8844 Lampa, Peru, -15.3636, -70.3656 Dubovka, Russia, 49.0500, 44.8333 Le Raincy, France, 48.9000, 2.5167 Oulad Dahmane, Algeria, 36.3667, 3.4667 Armagh, United Kingdom, 54.3499, -6.6546 Greensburg, United States, 40.3113, -79.5445 Sanquelim, India, 15.5027, 73.7669 Morris, United States, 41.3749, -88.4304 Sitio do Quinto, Brazil, -10.3500, -38.2169 Verrieres-le-Buisson, France, 48.7464, 2.2674 Laterza, Italy, 40.6333, 16.8000 Huckeswagen, Germany, 51.1450, 7.3417 Marlow, United Kingdom, 51.5700, -0.7800 Tabatinga, Brazil, -21.7169, -48.6878 Kamrawan, India, 25.6956, 85.8380 Curtorim, India, 15.2800, 74.0300 Harhorin, Mongolia, 47.2000, 102.8333 Hasanpur Juned, India, 25.5915, 85.5238 Lummen, Belgium, 50.9862, 5.1927 Chitila, Romania, 44.5083, 25.9819 Bo'ness, United Kingdom, 56.0168, -3.6089 Obanazawa, Japan, 38.6000, 140.4000 Diankabou, Mali, 14.5844, -3.0814 Tavares, Brazil, -7.6358, -37.8783 Fameck, France, 49.3000, 6.1100 Cherupazhasshi, India, 12.0916, 75.4414 Lebanon, United States, 43.6353, -72.2531 Hirono, Japan, 40.4085, 141.7187 Ludus, Romania, 46.4778, 24.0961 Cumpana, Romania, 44.1128, 28.5558 Penrith, United Kingdom, 54.6648, -2.7548 Maqat, Kazakhstan, 47.6500, 53.3167 Matungao, Philippines, 8.1300, 124.1700 Tiltil, Chile, -33.0817, -70.9278 Worthington, United States, 40.0950, -83.0209 Uhingen, Germany, 48.7058, 9.5919 Lockhart, United States, 28.6270, -81.4354 El Ateuf, Algeria, 32.4775, 3.7478 Briniamaro, Benin, 10.7411, 2.0731 Romilly-sur-Seine, France, 48.5167, 3.7275 Balham, United Kingdom, 51.4434, -0.1525 Vohipeno, Madagascar, -22.3569, 47.8407 Antioch, United States, 42.4742, -88.0721 Pincourt, Canada, 45.3833, -73.9833 Mozarlandia, Brazil, -14.7450, -50.5708 Whitefish Bay, United States, 43.1131, -87.9003 Teignmouth, United Kingdom, 50.5515, -3.4886 Perunkolattur, India, 12.0430, 78.9174 Sinmperekou, Benin, 11.2333, 2.4167 Sasso Marconi, Italy, 44.4000, 11.2500 Masalli, Azerbaijan, 39.0324, 48.6722 Entre Rios de Minas, Brazil, -20.6708, -44.0658 Danilov, Russia, 58.1833, 40.1667 Hammonton, United States, 39.6572, -74.7678 Ijra, India, 26.3119, 86.0037 Banbridge, United Kingdom, 54.3490, -6.2700 Eshowe, South Africa, -28.8883, 31.4483 Cocorna, Colombia, 6.0569, -75.1853 Punata, Bolivia, -17.5500, -65.8333 Garhpura, India, 25.6638, 86.1818 San Juan del Sur, Nicaragua, 11.2500, -85.8667 Tredegar, United Kingdom, 51.7776, -3.2407 Larkhall, United Kingdom, 55.7370, -3.9720 Boula'wane, Morocco, 32.8607, -8.0530 Chatham, United States, 39.6733, -89.6934 Cecil, United States, 40.3147, -80.1942 Mississippi Mills, Canada, 45.2167, -76.2000 Vaddapalli, India, 18.5323, 77.8959 Youdiou, Mali, 14.2772, -3.1703 Burshtyn, Ukraine, 49.2583, 24.6278 Bodmin, United Kingdom, 50.4660, -4.7180 Andurkonam, India, 8.5969, 76.8664 Tepetzintla, Mexico, 21.1658, -97.8511 Breukelen, Netherlands, 52.1717, 5.0017 Pilar, Argentina, -31.6833, -63.9000 Deming, United States, 32.2631, -107.7525 Bailleul, France, 50.7392, 2.7333 Labiod Medjadja, Algeria, 36.2500, 1.4000 Sakha, Egypt, 31.0881, 30.9456 Guilford, United States, 39.8811, -77.6012 Rio Negro, Chile, -40.7833, -73.2000 Sullivan, United States, 43.0923, -75.8794 Pindai, Brazil, -14.4928, -42.6869 Tsimlyansk, Russia, 47.6478, 42.0961 Chaabat el Leham, Algeria, 35.3361, -1.1011 Langwedel, Germany, 52.9667, 9.2167 Joubb Jannine, Lebanon, 33.6333, 35.7833 Selb, Germany, 50.1667, 12.1333 Roseau, Dominica, 15.3014, -61.3883 Loreto, Mexico, 26.0128, -111.3433 Sogutlu, Turkey, 40.9000, 30.4833 Neqab, Iran, 36.7108, 57.4100 Matsushige, Japan, 34.1339, 134.5803 Bou Djeniba, Morocco, 32.9000, -6.7833 Ramsey, United States, 41.0595, -74.1454 Baladharmaram, India, 17.4104, 79.9690 Muy Muy, Nicaragua, 12.7667, -85.6333 Prestwick, United Kingdom, 55.4956, -4.6142 San Gwann, Malta, 35.9094, 14.4786 Alagoinha, Brazil, -12.3333, -42.0833 Hickory Hills, United States, 41.7248, -87.8280 Riofrio, Colombia, 4.1561, -76.2878 Varnsdorf, Czechia, 50.9117, 14.6183 Oulad Driss, Morocco, 31.9996, -8.2276 Hilchenbach, Germany, 50.9983, 8.1094 Sahit, India, 25.5888, 85.7948 Mediouna, Morocco, 33.4500, -7.5100 Troon, United Kingdom, 55.5400, -4.6600 Chhapia, India, 26.0831, 84.8447 Tarumirim, Brazil, -19.2808, -42.0069 Paola, Italy, 39.3667, 16.0333 Androrangavola, Madagascar, -21.5037, 47.7174 Uch-Korgon, Kyrgyzstan, 40.2288, 72.0592 San Ramon, Peru, -11.1247, -75.3569 Lockhart, United States, 29.8785, -97.6831 Triunfo, Brazil, -7.8378, -38.1019 Purisima de la Concepcion, Colombia, 9.2333, -75.7333 Shimubi, China, 19.1645, 110.3043 Santa Croce sull' Arno, Italy, 43.7202, 10.7727 Tiszaujvaros, Hungary, 47.9228, 21.0519 Hima, Uganda, 0.2906, 30.1775 Tinchlik, Uzbekistan, 40.4264, 71.4956 Tirumalaiyampalaiyam, India, 10.8790, 76.9295 Cesis, Latvia, 57.3131, 25.2747 Koteshwar, India, 13.6070, 74.7500 Tapes, Brazil, -30.6728, -51.3958 Villa Alegre, Chile, -35.6747, -71.7439 Surbo, Italy, 40.4000, 18.1333 Ospitaletto, Italy, 45.5553, 10.0733 Nishinoomote, Japan, 30.7325, 130.9969 Onklou, Benin, 9.5000, 1.9833 Tlaxcala, Mexico, 19.3125, -98.2400 Saint-Jean-de-Luz, France, 43.3900, -1.6600 Lope de Vega, Philippines, 12.2983, 124.6238 Kirchhatten, Germany, 53.0184, 8.3500 Kodangipatti, India, 9.9920, 77.4332 Baie du Tombeau, Mauritius, -20.1138, 57.5066 Kurumbalur, India, 11.2360, 78.8005 Cedar Lake, United States, 41.3696, -87.4389 Alexander City, United States, 32.9229, -85.9358 Abensberg, Germany, 48.8000, 11.8500 Collecchio, Italy, 44.7527, 10.2157 Ankadinandriana, Madagascar, -19.0586, 47.6633 Coremas, Brazil, -7.0139, -37.9458 Paramati, India, 11.1544, 78.0213 La Carolina, Spain, 38.2667, -3.6167 Rubiera, Italy, 44.6500, 10.7833 Pattensen, Germany, 52.2667, 9.7667 Lognes, France, 48.8360, 2.6278 Montabaur, Germany, 50.4375, 7.8258 Melksham, United Kingdom, 51.3710, -2.1380 Ngoulemakong, Cameroon, 3.0833, 11.4333 Mahatsinjo, Madagascar, -17.7487, 47.0172 Enyelle, Congo (Brazzaville), 2.8119, 18.0136 Caiaponia, Brazil, -16.9569, -51.8100 Broadlands, United States, 39.0168, -77.5167 Chirpan, Bulgaria, 42.1981, 25.3304 Ranomafana, Madagascar, -18.9598, 48.8460 Thuin, Belgium, 50.3398, 4.2874 Wibsey, United Kingdom, 53.7672, -1.7728 Corridonia, Italy, 43.2482, 13.5075 Sterling, United States, 41.7996, -89.6956 Manantheri, India, 11.8428, 75.6150 Bellaa, Algeria, 36.2000, 5.8500 Bere, Chad, 9.3156, 16.1597 Pudur, India, 9.0001, 77.2076 Navashino, Russia, 55.5500, 42.2000 Lakeland North, United States, 47.3374, -122.2812 Esbiaat, Morocco, 32.2044, -8.5608 Malvik, Norway, 63.4333, 10.6833 Las Guaranas, Dominican Republic, 19.2000, -70.2200 Santa Marta de Tormes, Spain, 40.9494, -5.6325 Kushimoto, Japan, 33.4667, 135.7833 Slobozhanske, Ukraine, 48.5336, 35.0781 Condoto, Colombia, 5.1000, -76.6500 Dzuunmod, Mongolia, 47.7069, 106.9528 Kysucke Nove Mesto, Slovakia, 49.3000, 18.7833 Thonotosassa, United States, 28.0464, -82.2910 Kamalganj, India, 27.2700, 79.6500 Madagh, Morocco, 35.0133, -2.3397 St. Clair, Canada, 42.7833, -82.3500 Rasulpur Dhuria, India, 25.5693, 87.0375 Owosso, United States, 42.9955, -84.1760 Black Forest, United States, 39.0608, -104.6752 Gladeview, United States, 25.8395, -80.2368 Zlotoryja, Poland, 51.1333, 15.9167 Greendale, United States, 42.9371, -88.0018 Capinopolis, Brazil, -18.6819, -49.5700 Mmopone, Botswana, -24.5669, 25.8733 Djanet, Algeria, 24.5550, 9.4853 At-Bashy, Kyrgyzstan, 41.1725, 75.7968 Malo, Italy, 45.6582, 11.4047 Alginet, Spain, 39.2625, -0.4683 Kujukuri, Japan, 35.5333, 140.4333 Mulakad, India, 9.8902, 76.6546 Boguszow-Gorce, Poland, 50.7667, 16.2000 Kaonke, India, 30.7659, 75.4172 Sprimont, Belgium, 50.5053, 5.6618 Saint-Brevin-les-Pins, France, 47.2486, -2.1656 Chippewa Falls, United States, 44.9358, -91.3902 Ferrier, Haiti, 19.6155, -71.7779 Vubatalai, India, 11.3597, 76.7649 Mangamila, Madagascar, -18.5667, 47.8667 Mineral del Monte, Mexico, 20.1333, -98.6667 Goure, Niger, 13.9874, 10.2700 Sisa, Peru, -6.6142, -76.6936 Targuist, Morocco, 34.9500, -4.3000 Tecpan de Galeana, Mexico, 17.2500, -100.6833 Limanowa, Poland, 49.7006, 20.4267 Tiruvasaladi, India, 11.4013, 79.7746 Woudrichem, Netherlands, 51.8128, 5.0003 Mahinog, Philippines, 9.1500, 124.7800 Bilozerske, Ukraine, 48.8667, 37.1333 Sepidan, Iran, 30.2594, 51.9853 Terrace, Canada, 54.5164, -128.5997 Ternitz, Austria, 47.7167, 16.0333 Combita, Colombia, 5.7500, -73.2500 Montmagny, France, 48.9744, 2.3467 Farnborough, United Kingdom, 51.3591, 0.0741 Rosa, Italy, 45.7167, 11.7667 Sigulda, Latvia, 57.1539, 24.8544 Rio Piracicaba, Brazil, -19.9289, -43.1739 Teixeira, Brazil, -7.2228, -37.2539 Langenselbold, Germany, 50.1833, 9.0333 Djebahia, Algeria, 36.4764, 3.7578 Pinia, Mali, 14.2639, -3.9464 Misaki, Japan, 34.3167, 135.1500 Beacon, United States, 41.5036, -73.9655 Hutchinson, United States, 44.8855, -94.3768 Hanover, United States, 40.8197, -74.4287 Mercier, Canada, 45.3200, -73.7500 Nea Alikarnassos, Greece, 35.3167, 25.1833 Abony, Hungary, 47.1892, 20.0053 Goulmima, Morocco, 31.6944, -4.9592 Bohodukhiv, Ukraine, 50.1617, 35.5256 Lumino, Uganda, 0.3250, 33.9958 Dahe, Benin, 6.5167, 1.9500 Immenstadt im Allgau, Germany, 47.5667, 10.2167 Alanganallur, India, 10.0470, 78.0903 Port Glasgow, United Kingdom, 55.9340, -4.6906 Rafina, Greece, 38.0167, 24.0000 Magione, Italy, 43.1500, 12.2000 Zontecomatlan de Lopez y Fuentes, Mexico, 20.7667, -98.3333 Vredefort, South Africa, -27.0167, 27.3833 Neubiberg, Germany, 48.0833, 11.6833 Ringwood, United Kingdom, 50.8829, -1.7314 Boston, Philippines, 7.8697, 126.3761 Cambuci, Brazil, -21.5750, -41.9108 Guajiquiro, Honduras, 14.1209, -87.8303 Kankipadu, India, 16.4500, 80.7833 Negresti-Oas, Romania, 47.8694, 23.4242 Bar-le-Duc, France, 48.7719, 5.1603 Neutraubling, Germany, 48.9936, 12.1953 Wilsdruff, Germany, 51.0522, 13.5383 Vemuluru, India, 16.9337, 81.8057 Roncade, Italy, 45.6246, 12.3766 Kiri, Congo (Kinshasa), -1.4955, 18.9277 Paliaturutu, India, 10.2959, 76.1581 Bartabwa, Kenya, 0.8380, 35.8097 Huasuo, China, 35.4043, 107.0869 Castellammare del Golfo, Italy, 38.0264, 12.8806 Batuan, Philippines, 12.4222, 123.7817 Naranja, United States, 25.5164, -80.4222 Anzegem, Belgium, 50.8333, 3.4667 Hatten, Germany, 53.0083, 8.3167 Tullamore, Ireland, 53.2667, -7.5000 Ispir, Turkey, 40.4836, 40.9953 Monticello, United States, 45.2991, -93.7996 Tornesch, Germany, 53.7000, 9.7167 Montesson, France, 48.9085, 2.1496 Lowton, United Kingdom, 53.4710, -2.5690 Carmignano, Italy, 43.8103, 11.0149 Suo-Oshima, Japan, 33.9167, 132.2333 Rio Branco, Uruguay, -32.5972, -53.3833 Fraser, United States, 42.5388, -82.9496 Sinha, India, 25.6902, 84.6291 Ayt 'Attou ou L'Arbi, Morocco, 31.5456, -8.2967 Swansea, United States, 38.5507, -89.9858 Sveti Ivan Zelina, Croatia, 45.9500, 16.2333 Arroio dos Ratos, Brazil, -30.0769, -51.7289 Cabarete, Dominican Republic, 19.7511, -70.4083 Uzun, Uzbekistan, 38.3667, 68.0056 Chigwell, United Kingdom, 51.6225, 0.0723 Cay, Turkey, 38.5833, 31.0333 Nova Ponte, Brazil, -19.1983, -47.7272 Nesebar, Bulgaria, 42.6595, 27.7247 Lauda-Konigshofen, Germany, 49.5686, 9.7039 Great Bend, United States, 38.3593, -98.8015 Masmouda, Morocco, 34.7862, -5.7078 Holalagondi, India, 15.4873, 77.0464 Falls Church, United States, 38.8847, -77.1751 Jedrzejow, Poland, 50.6333, 20.3000 Red Bluff, United States, 40.1735, -122.2413 Guastalla, Italy, 44.9214, 10.6542 Plochingen, Germany, 48.7117, 9.4164 Satyun, India, 28.5667, 75.1167 Villa Yapacani, Bolivia, -17.4028, -63.8850 Yokoshiba, Japan, 35.6500, 140.4833 Kelamangalam, India, 12.6031, 77.8519 Dinmanpur, India, 25.9112, 85.9288 Palmeirais, Brazil, -5.9778, -43.0633 Sangota, Pakistan, 34.7833, 72.4167 Granados, Guatemala, 14.9139, -90.5233 Cajetina, Serbia, 43.7500, 19.7167 Saint-Genis-Pouilly, France, 46.2437, 6.0250 Thillangeri, India, 11.9500, 75.6167 Oulad Bou Rahmoun, Morocco, 32.2954, -6.6668 Tostado, Argentina, -29.2333, -61.7667 Baligaon, India, 25.4196, 84.4951 Gumushacikoy, Turkey, 40.8667, 35.2167 Bilina, Czechia, 50.5481, 13.7761 Al Qbab, Morocco, 32.7333, -5.5167 Lucao, Taiwan, 23.4133, 120.3092 Alexandria, United States, 45.8776, -95.3767 Agios Athanasios, Cyprus, 34.7086, 33.0503 Zabkowice Slaskie, Poland, 50.5833, 16.8167 Aleksandrovka, Kyrgyzstan, 42.8524, 74.2224 Severinia, Brazil, -20.8089, -48.8028 Cherryland, United States, 37.6792, -122.1038 Talya, India, 14.0420, 76.1840 Kanjikkovil, India, 11.3689, 77.5962 Jitwarpur Nizamat, India, 25.8489, 85.8006 Pineto, Italy, 42.6167, 14.0667 Bou Salem, Tunisia, 36.6167, 8.9667 Tzaneen, South Africa, -23.8333, 30.1667 Lakkampatti, India, 11.4461, 77.4118 Kuleshovka, Russia, 47.0833, 39.5667 Sassenberg, Germany, 51.9897, 8.0408 Palayad, India, 11.5847, 75.7528 Akora, India, 26.4721, 78.7989 Edenburg, South Africa, -29.7347, 25.9369 Benfreha, Algeria, 35.6933, -0.4192 Paniem, India, 15.5167, 78.3500 Breza, Bosnia and Herzegovina, 44.0210, 18.2610 Kottacheruvu, India, 14.1886, 77.7658 Andoain, Spain, 43.2167, -2.0167 Naivasha, Kenya, -0.7167, 36.4333 Qazyqurt, Kazakhstan, 41.7598, 69.3880 Jastrebarsko, Croatia, 45.6667, 15.6500 Darpa, India, 26.8400, 84.9774 Debar, North Macedonia, 41.5250, 20.5272 Essau, Gambia, The, 13.4833, -16.5333 Tiruppachur, India, 13.1384, 79.8764 Clarkston, United States, 33.8117, -84.2403 Key Biscayne, United States, 25.6908, -80.1653 San Francisco, Honduras, 15.6715, -87.0394 Relangi, India, 16.7050, 81.6470 Loviisa, Finland, 60.4583, 26.2333 Ban San Phak Wan Luang, Thailand, 18.7049, 98.9661 Bijaipur, India, 26.0556, 77.3697 Caln, United States, 40.0014, -75.7619 Bicas, Brazil, -21.7250, -43.0589 Solila, Madagascar, -21.4166, 46.6174 Ratzeburg, Germany, 53.7000, 10.7500 Adekar Kebouche, Algeria, 36.6833, 4.6667 Halwara, India, 30.7167, 75.6500 El Paisnal, El Salvador, 13.9667, -89.2167 Wilbraham, United States, 42.1270, -72.4308 Pontivy, France, 48.0692, -2.9614 Iakora, Madagascar, -23.1039, 46.6566 Talitsa, Russia, 57.0125, 63.7292 Reidsville, United States, 36.3376, -79.6725 Gundlapelle, India, 16.4102, 79.8813 Marofinaritra, Madagascar, -15.0384, 50.1171 Les Sables-d'Olonne, France, 46.4972, -1.7833 Merimandroso, Madagascar, -18.7517, 47.5162 Nolensville, United States, 35.9572, -86.6719 Parlier, United States, 36.6087, -119.5434 Moultrie, United States, 31.1591, -83.7708 Friedland, Germany, 51.4217, 9.9144 Edgewater, United States, 40.8237, -73.9740 Pindorama, Brazil, -21.1858, -48.9069 Ban Du, Thailand, 19.9691, 99.8589 Blidet Amor, Algeria, 32.9514, 5.9806 Narragansett, United States, 41.4291, -71.4668 Australind, Australia, -33.2800, 115.7260 Jun Bel, China, 39.2428, 106.1922 Ust'-Ordynskiy, Russia, 52.8056, 104.7622 Arbon, Switzerland, 47.5167, 9.4333 Bom Jesus do Galho, Brazil, -19.8289, -42.3158 Siswa, India, 26.6214, 84.6739 Bakun, Philippines, 16.7925, 120.6614 Siparia, Trinidad and Tobago, 10.1333, -61.5000 Nagireddipalli, India, 14.2701, 79.1013 Rio Paranaiba, Brazil, -19.1939, -46.2469 Nafplio, Greece, 37.5658, 22.8000 Zaouiet Kounta, Algeria, 27.2167, -0.2000 Ain Nouissy, Algeria, 35.8000, 0.0500 Kusaha, India, 26.2077, 86.9587 Falagueira, Portugal, 38.7589, -9.2261 Sarmin, Syria, 35.9040, 36.7250 Kizhakkummuri, India, 11.3333, 75.8167 Ban Kaeng, Thailand, 16.3940, 102.0586 Burglengenfeld, Germany, 49.2000, 12.0333 Plerin, France, 48.5353, -2.7694 Thorpe Saint Andrew, United Kingdom, 52.6354, 1.3431 Kannamanayakkanur, India, 10.5527, 77.2690 Pualas, Philippines, 7.8200, 124.0700 Dargahan, Iran, 26.9667, 56.0708 Cadaval, Portugal, 39.2500, -9.1000 Vitomirice, Kosovo, 42.6950, 20.3386 Moorestown-Lenola, United States, 39.9659, -74.9643 Ottweiler, Germany, 49.3667, 7.1667 Sha Kok Mei, Hong Kong, 22.3784, 114.1941 Pandhana, India, 21.6982, 76.2249 Herselt, Belgium, 51.0537, 4.8828 Minignan, Côte d’Ivoire, 9.9974, -7.8359 Salem Lakes, United States, 42.5366, -88.1306 West Bradford, United States, 39.9633, -75.7160 Anapoima, Colombia, 4.5503, -74.5361 Munster, Germany, 49.9167, 8.8667 Moston, United Kingdom, 53.5156, -2.1848 Cayey, Puerto Rico, 18.1150, -66.1630 Middlesex, United States, 40.5744, -74.5011 Torokbalint, Hungary, 47.4356, 18.9156 Sonora, Brazil, -17.5769, -54.7578 Saint-Fargeau, France, 48.5356, 2.5241 Pakarya Harsidhi, India, 26.6526, 84.7198 Tabuse, Japan, 33.9547, 132.0414 Reboucas, Brazil, -25.6208, -50.6928 Dieramana, Mali, 12.8517, -5.4003 Guachochi, Mexico, 26.8194, -107.0700 Mbuyapey, Paraguay, -26.2210, -56.7565 Mosina, Poland, 52.2467, 16.8450 Valea Lupului, Romania, 47.1833, 27.5000 Chelsfield, United Kingdom, 51.3582, 0.1278 Oria, Italy, 40.5000, 17.6333 Quinapundan, Philippines, 11.1578, 125.5208 Aberdare, United Kingdom, 51.7130, -3.4450 Suwasra, India, 24.0698, 75.6523 San Martin de Loba, Colombia, 8.8333, -73.9167 Farap, Turkmenistan, 39.1667, 63.6000 Angus, Canada, 44.3167, -79.8833 Turnov, Czechia, 50.5872, 15.1569 Nadisal, India, 13.1326, 74.7777 Gavinivaripalem, India, 15.8378, 80.4315 Surajpura, India, 25.2576, 86.2283 Sadhoa, India, 25.4049, 87.1980 Guanduqiao, China, 29.4792, 111.2975 Kandela, India, 29.4500, 77.3200 Sokone, Senegal, 13.8780, -16.3700 Oyam, Uganda, 2.2350, 32.3850 West Lincoln, Canada, 43.0667, -79.5667 Ceres, Argentina, -29.8667, -61.9500 Yanhewan, China, 36.7522, 109.3678 Ouled Sidi Brahim, Algeria, 36.3667, 3.7167 Verona, United States, 42.9892, -89.5383 Ludvika, Sweden, 60.1500, 15.1833 Mykolaiv, Ukraine, 49.5247, 23.9789 Tenente Portela, Brazil, -27.3708, -53.7578 Agua Fria, Brazil, -11.8669, -38.7669 San Gabriel, Ecuador, 0.5983, -77.8353 Bois-Guillaume, France, 49.4614, 1.1092 Lingal, India, 16.2833, 78.5167 Morton, United Kingdom, 51.6094, -2.5249 Chinnavadampatti, India, 11.0615, 76.9838 Poco das Trincheiras, Brazil, -9.3125, -37.2856 Niederzier, Germany, 50.8831, 6.4667 Lakho, India, 25.4113, 86.1792 Santa Catalina, Philippines, 17.5917, 120.3644 Barhni, India, 27.4972, 82.7861 Mount Vernon, United States, 38.3140, -88.9174 Deysbrook, United Kingdom, 53.4290, -2.9340 Harduli, India, 22.9278, 79.9030 Ksibet el Mediouni, Tunisia, 35.6900, 10.8500 Eberbach, Germany, 49.4667, 8.9833 Ahmed Rachedi, Algeria, 36.4000, 6.1167 Askim, Norway, 59.5832, 11.1629 Murra, Nicaragua, 13.7667, -86.0167 Bothell East, United States, 47.8064, -122.1844 Araruna, Brazil, -23.9319, -52.4958 Thornbury, United Kingdom, 51.6094, -2.5249 Olsberg, Germany, 51.3500, 8.4833 San Carlos, Colombia, 6.1897, -74.9969 Jasper, United States, 33.8508, -87.2710 Babhangawan, India, 25.3674, 86.9501 Fujisaki, Japan, 40.6561, 140.5028 Mesa Geitonia, Cyprus, 34.7022, 33.0453 Eisenstadt, Austria, 47.8500, 16.5167 Barroquinha, Brazil, -3.0189, -41.1369 Lotte, Germany, 52.2764, 7.9167 Cehegin, Spain, 38.0925, -1.7989 Nawada, India, 25.5431, 85.9240 Buggenhout, Belgium, 51.0000, 4.2000 Eching, Germany, 48.3000, 11.6167 Brainerd, United States, 46.3553, -94.1983 Nampicuan, Philippines, 15.7342, 120.6356 Qobustan, Azerbaijan, 40.0824, 49.4120 Haacht, Belgium, 50.9770, 4.6384 Hopatcong, United States, 40.9541, -74.6593 Ocana, Spain, 39.9569, -3.4967 Chai Nat, Thailand, 15.1872, 100.1283 Tachov, Czechia, 49.7953, 12.6331 Pilisvorosvar, Hungary, 47.6211, 18.9108 Douar Oulad Driss, Morocco, 31.9039, -8.3024 Lyzbice, Czechia, 49.6669, 18.6819 Pakala, India, 15.2694, 80.0720 Markacho, India, 24.3263, 85.8346 Roh, India, 24.8905, 85.6750 Tlayacapan, Mexico, 18.9556, -98.9811 Oneonta, United States, 42.4551, -75.0666 Huizucar, El Salvador, 13.5833, -89.2333 Szarvas, Hungary, 46.8500, 20.6000 Khallikot, India, 19.6091, 85.0861 Goshen, United States, 41.3817, -74.3498 Tiruvalanjuli, India, 10.9449, 79.3286 Sommacampagna, Italy, 45.4000, 10.8500 Radovis, North Macedonia, 41.6381, 22.4644 Plumtree, Zimbabwe, -20.4781, 27.7972 East Whiteland, United States, 40.0474, -75.5547 Ichikawamisato, Japan, 35.5653, 138.5025 Lagunia Surajkanth, India, 25.8304, 85.7887 Wilmington Island, United States, 32.0033, -80.9752 Salida, United States, 37.7083, -121.0842 Ankaramena, Madagascar, -25.0284, 46.7572 Yangasso, Mali, 13.0775, -5.3203 Lopik, Netherlands, 51.9722, 4.9464 Santo Domingo Xenacoj, Guatemala, 14.6822, -90.7067 Southgate, United Kingdom, 51.6316, -0.1265 Tarlapalli, India, 18.8345, 79.4907 Srinagar, India, 26.7830, 84.3018 Zayda, Morocco, 32.8167, -4.9500 Larena, Philippines, 9.2490, 123.5910 Sopetran, Colombia, 6.5017, -75.7433 Raj, Czechia, 49.8511, 18.5639 Valenton, France, 48.7450, 2.4672 Santa Maria, Chile, -32.7469, -70.6597 Shatrana, India, 29.9102, 76.1202 Mansala, India, 15.9417, 77.4281 Jacarau, Brazil, -6.6122, -35.2928 Narahia, India, 26.3681, 86.5434 Bara, India, 24.3146, 87.9643 Corinth, United States, 34.9474, -88.5143 Livingston, United States, 37.3875, -120.7248 Asagiri, Japan, 32.2403, 130.8978 Brwinow, Poland, 52.1417, 20.7167 Masty, Belarus, 53.4170, 24.5500 Tavagnacco, Italy, 46.1265, 13.2152 Skippack, United States, 40.2165, -75.4190 Romsey, United Kingdom, 50.9890, -1.4966 Lagoa, Portugal, 37.7500, -25.5833 Nether Providence, United States, 39.8971, -75.3697 Xintian, China, 28.1905, 107.6719 Alamo, United States, 37.8548, -122.0136 Verona, United States, 40.8323, -74.2431 Alloa, United Kingdom, 56.1160, -3.7930 Dallas, United States, 33.9152, -84.8416 Garmen, Bulgaria, 41.6000, 23.8167 Eggenfelden, Germany, 48.4039, 12.7642 Ait Yaich, Algeria, 36.5811, 4.3303 Gernsbach, Germany, 48.7633, 8.3342 Vinci, Italy, 43.7833, 10.9167 Kemp Mill, United States, 39.0412, -77.0215 Pahou, Benin, 6.3833, 2.2167 Jacaraci, Brazil, -14.8500, -42.4328 Claxton Bay, Trinidad and Tobago, 10.3405, -61.4555 Barranco de Loba, Colombia, 8.9500, -74.1167 Sirmaur, India, 24.8365, 81.3645 Bokod, Philippines, 16.4914, 120.8300 Ban Ao Nang, Thailand, 8.0314, 98.8225 Rauch, Argentina, -36.7667, -59.1000 Araceli, Philippines, 10.5529, 119.9904 Lengede, Germany, 52.2000, 10.3000 Kalocsa, Hungary, 46.5333, 18.9856 Junqan, Iran, 32.1522, 50.6911 Ampohibe, Madagascar, -15.0344, 50.2969 Perai, Malaysia, 5.3833, 100.3833 Busembatia, Uganda, 0.7750, 33.6250 Kolwara, India, 25.3538, 86.7700 Ascension, Bolivia, -15.6996, -63.0800 Morroa, Colombia, 9.3333, -75.3167 Baqiabad, India, 25.1000, 82.9000 Satwas, India, 22.5363, 76.6845 Bagulin, Philippines, 16.6079, 120.4378 Aartselaar, Belgium, 51.1333, 4.3833 Saint-Gilles, France, 43.6786, 4.4317 Davorlim, India, 15.2722, 73.9924 Alur, India, 15.3942, 77.2264 Ulchin, Korea, South, 37.0020, 129.4003 Dollis Hill, United Kingdom, 51.5641, -0.2341 Painan, Indonesia, -1.3511, 100.5756 Dornakal, India, 17.4470, 80.1510 Lavaltrie, Canada, 45.8833, -73.2833 Villa Vasquez, Dominican Republic, 19.7400, -71.4500 Tirkarur, India, 10.0667, 76.6167 Gryazovets, Russia, 58.8833, 40.2500 Kharki, India, 23.9165, 85.8596 Clarksdale, United States, 34.1933, -90.5693 Belvedere Park, United States, 33.7489, -84.2599 Preveza, Greece, 38.9575, 20.7517 Canteleu, France, 49.4411, 1.0261 Mantaly, Madagascar, -13.1662, 48.9647 East Bridgewater, United States, 42.0352, -70.9424 Zhabinka, Belarus, 52.2006, 24.0233 Korsor, Denmark, 55.3266, 11.1500 Barhi, India, 23.9033, 80.8152 Auray, France, 47.6686, -2.9814 Middlewich, United Kingdom, 53.1920, -2.4430 General Cabrera, Argentina, -32.7994, -63.8683 Vadugapatti, India, 11.1518, 77.7375 Gorbea, Chile, -39.1000, -72.6833 Magurele, Romania, 44.3494, 26.0297 New Cassel, United States, 40.7602, -73.5649 Killarney, Ireland, 52.0588, -9.5072 Saint-Maurice, France, 48.8156, 2.4592 Chateau-d'Olonne, France, 46.5050, -1.7361 General MacArthur, Philippines, 11.2486, 125.5400 San Sebastian, El Salvador, 13.7333, -88.8333 Ghora Gali, Pakistan, 33.8833, 73.3833 Chik Banavar, India, 13.0846, 77.5014 Yerere, Mali, 15.2590, -9.4270 Farmington, United States, 42.9895, -77.3087 Paidiipalli, India, 18.0172, 79.6159 Valbom, Portugal, 41.1333, -8.5667 Sukhinichi, Russia, 54.1000, 35.3500 East Greenwich, United States, 41.6362, -71.5058 Itau de Minas, Brazil, -20.7389, -46.7519 Markdorf, Germany, 47.7208, 9.3917 Mutyalapalle, India, 16.4019, 81.5703 Scottsbluff, United States, 41.8684, -103.6616 Washington Court House, United States, 39.5381, -83.4281 Nagra, India, 25.9680, 83.8730 Haldibari, India, 26.3300, 88.7700 Landau an der Isar, Germany, 48.6667, 12.6667 Hetton le Hole, United Kingdom, 54.8210, -1.4490 Baoshan, Taiwan, 24.7428, 120.9991 Alindao, Central African Republic, 5.0333, 21.2167 Tupran, India, 17.8452, 78.4787 Bo, Vietnam, 20.6736, 105.5311 Wangjiaxian, China, 36.5108, 104.1490 San Antonio, Colombia, 3.9167, -75.5000 Concepcion Quezaltepeque, El Salvador, 14.0833, -88.9500 Bo`ston, Uzbekistan, 41.8500, 60.9333 Choszczno, Poland, 53.1667, 15.4000 Short Hills, United States, 40.7389, -74.3278 Sorso, Italy, 40.7983, 8.5772 Lohfelden, Germany, 51.2667, 9.5333 Sainte-Maxime, France, 43.3090, 6.6350 Woippy, France, 49.1519, 6.1522 Chiconquiaco, Mexico, 19.7500, -96.8167 Lubbeek, Belgium, 50.8817, 4.8414 Kihoku, Japan, 34.2114, 136.3372 Majia, China, 35.4599, 103.2076 Hargawan, India, 25.1428, 85.5652 Liestal, Switzerland, 47.4839, 7.7350 San Cristobal, Argentina, -30.3167, -61.2333 Stafa, Switzerland, 47.2401, 8.7328 Lobau, Germany, 51.0944, 14.6667 Rheydt, Germany, 51.1667, 6.4500 Spenge, Germany, 52.1333, 8.4833 Anomabu, Ghana, 5.1749, -1.1214 Zaysan, Kazakhstan, 47.4667, 84.8667 Mohanpur Gaughata, India, 25.3345, 87.3404 Yamada, Japan, 39.4676, 141.9489 Kusnacht, Switzerland, 47.3181, 8.5825 Rokycany, Czechia, 49.7425, 13.5956 Shchigry, Russia, 51.8667, 36.9333 Karempudi, India, 16.4333, 79.7167 Maria, Philippines, 9.1960, 123.6550 Vasad, India, 22.4500, 73.0667 Ladainha, Brazil, -17.6319, -41.7378 Pont-a-Mousson, France, 48.9053, 6.0547 Somerton, United States, 32.6007, -114.6994 West Derby, United Kingdom, 53.4338, -2.9070 Lauro Muller, Brazil, -28.3928, -49.3969 La Carlota, Spain, 37.6667, -4.9333 Puraini, India, 25.5968, 86.9892 Kamatgi, India, 16.1190, 75.8482 Impruneta, Italy, 43.6854, 11.2544 New Hamburg, Canada, 43.3808, -80.7062 Opwijk, Belgium, 50.9667, 4.1833 Villa Rica, Colombia, 3.1736, -76.4631 Abinsk, Russia, 44.8667, 38.1500 Zeven, Germany, 53.3000, 9.2833 Morpeth, United Kingdom, 55.1675, -1.6908 Tezu, India, 27.9200, 96.1700 Sanlucar la Mayor, Spain, 37.3831, -6.2000 Ozarow Mazowiecki, Poland, 52.2167, 20.8000 Doria Sonapur, India, 26.1830, 87.3873 Penuganchiprolu, India, 16.9033, 80.2356 Sailana, India, 23.4622, 74.9232 West Drayton, United Kingdom, 51.5043, -0.4646 Boguchar, Russia, 49.9500, 40.5500 Rosarno, Italy, 38.4850, 15.9797 Nacozari Viejo, Mexico, 30.3833, -109.6833 Vatluru, India, 16.6998, 81.0524 Patiali, India, 27.7167, 79.0167 Churumuco de Morelos, Mexico, 18.6167, -101.6333 Miena, Mali, 12.6297, -5.9903 Lindenhurst, United States, 42.4175, -88.0257 Elizabethton, United States, 36.3367, -82.2370 West Nipissing / Nipissing Ouest, Canada, 46.3667, -79.9167 Moncks Corner, United States, 33.1730, -80.0107 Dumas, United States, 35.8613, -101.9642 Barela, India, 23.0968, 80.0508 Neu-Anspach, Germany, 50.2931, 8.5089 Bollullos par del Condado, Spain, 37.3358, -6.5364 Saint-Omer, France, 50.7461, 2.2617 Otley, United Kingdom, 53.9050, -1.6870 Santa Rosalia, Mexico, 27.3389, -112.2669 Srbobran, Serbia, 45.5333, 19.7833 Sidi Azzouz, Morocco, 31.7667, -7.6667 Jitauna, Brazil, -14.0189, -39.8889 Miho, Japan, 36.0045, 140.3019 Volgorechensk, Russia, 57.4439, 41.1592 Serinhisar, Turkey, 37.5806, 29.2697 Artsyz, Ukraine, 45.9944, 29.4322 North New Hyde Park, United States, 40.7460, -73.6876 Bainbridge, United States, 30.9052, -84.5732 Thondiamannu, India, 9.2639, 76.8833 Shepherdsville, United States, 37.9813, -85.7007 Simoes, Brazil, -7.5989, -40.8178 Saddle Brook, United States, 40.9033, -74.0955 Carmopolis de Minas, Brazil, -20.5408, -44.6350 Grafing bei Munchen, Germany, 48.0500, 11.9667 Persan, France, 49.1542, 2.2719 Ozark, United States, 31.4508, -85.6473 Breyten, South Africa, -26.3000, 29.9833 Huron, United States, 44.3623, -98.2094 Fallsburg, United States, 41.7391, -74.6038 Baulia, India, 25.3990, 87.6002 Bihpuriagaon, India, 27.0172, 93.9167 Iheddadene, Morocco, 35.1500, -2.9667 Jacksonville, United States, 33.8088, -85.7545 Zhutang, Taiwan, 23.8528, 120.4114 Bedford, United States, 42.4969, -71.2783 Jiaoxiyakou, China, 26.1283, 102.4500 Balangiga, Philippines, 11.1092, 125.3864 Narhan, India, 25.6941, 86.0074 Bhanukumari, India, 26.3395, 89.7697 Tianguistengo, Mexico, 20.7278, -98.6289 Alto Longa, Brazil, -5.2511, -42.2103 Tavros, Greece, 37.9667, 23.6950 Strathmore, Canada, 51.0378, -113.4003 Leno, Italy, 45.3703, 10.2167 Hindalgi, India, 16.1364, 74.6547 Monte Alegre de Sergipe, Brazil, -10.0269, -37.5619 Castelsarrasin, France, 44.0408, 1.1078 San Andres Timilpan, Mexico, 19.8667, -99.7333 Covington, United States, 33.6049, -83.8463 Hershey, United States, 40.2806, -76.6458 Conisbrough, United Kingdom, 53.4790, -1.2270 Muttukuru, India, 14.2667, 80.1000 Pelham, United States, 42.7335, -71.3240 Lakhsetipet, India, 18.8873, 79.2069 Hasami, Japan, 33.1381, 129.8956 Belazao, Madagascar, -19.8933, 46.9659 Privolzhsk, Russia, 57.3825, 41.2861 Degache, Tunisia, 33.9833, 8.2167 Yanshuiguan, China, 36.8252, 110.2345 Riegelsberg, Germany, 49.2833, 6.9167 Horta, Portugal, 38.5333, -28.6333 Mascali, Italy, 37.7578, 15.1958 Anpachi, Japan, 35.3353, 136.6654 Saldana, Colombia, 3.9347, -75.0203 Palda, India, 22.6800, 75.8939 Baia-Sprie, Romania, 47.6592, 23.7042 Latham, United States, 42.7427, -73.7497 Chesterton, United States, 41.5997, -87.0550 Walajabad, India, 12.7904, 79.8236 Vil'nyans'k, Ukraine, 47.9419, 35.4281 High River, Canada, 50.5808, -113.8744 Gua, India, 22.2136, 85.3877 Jori Kalan, India, 24.2045, 84.8770 Polaia Kalan, India, 23.2119, 76.5529 Chikhli Kalan, India, 22.2152, 78.7430 Tepecoyo, El Salvador, 13.7003, -89.4678 Kottavalasa, India, 17.9000, 83.2000 Ustka, Poland, 54.5833, 16.8500 Sadovoye, Ukraine, 46.0500, 30.3667 Tenerife, Colombia, 9.8989, -74.8589 Ollioules, France, 43.1330, 5.8500 Kizhariyur, India, 11.4833, 75.6833 Candelaria, Puerto Rico, 18.4042, -66.2175 Balangkas, Philippines, 14.7381, 120.9978 Estremoz, Portugal, 38.8422, -7.5881 Uxbridge, United States, 42.0593, -71.6380 Robbinsdale, United States, 45.0261, -93.3332 Karkudalpatti, India, 11.5002, 78.3521 Doctor Juan Eulogio Estigarribia, Paraguay, -25.3718, -55.7046 Viraghattam, India, 18.6833, 83.6000 Bradley Gardens, United States, 40.5711, -74.6678 Salimpur, India, 25.2480, 86.2347 Radzymin, Poland, 52.4167, 21.1833 Peumo, Chile, -34.3961, -71.1694 Hobe Sound, United States, 27.0729, -80.1425 Iflissen, Algeria, 36.8636, 4.2203 Lich, Germany, 50.5217, 8.8208 Flers, France, 48.7518, -0.5605 Murak, Syria, 35.3762, 36.6897 Mangoli, India, 16.6500, 75.8100 Tsukawaki, Japan, 33.2831, 131.1515 Amay, Belgium, 50.5478, 5.3192 Rehlingen-Siersburg, Germany, 49.3686, 6.6786 Sarqan, Kazakhstan, 45.4100, 79.9186 Santo Antonio dos Lopes, Brazil, -4.8689, -44.3600 Huliyar, India, 13.5828, 76.5361 Chudovo, Russia, 59.1167, 31.6667 Fakola, Mali, 10.5444, -6.9147 Kidbrooke, United Kingdom, 51.4621, 0.0273 Nagongera, Uganda, 0.7700, 34.0261 Romitan Shahri, Uzbekistan, 39.9333, 64.3833 Sariosiyo, Uzbekistan, 38.4133, 67.9572 Chenove, France, 47.2917, 5.0081 Kambainellur, India, 12.2071, 78.3187 Nantucket, United States, 41.2831, -70.0692 Rock Ferry, United Kingdom, 53.3730, -3.0080 Dayr al Barsha, Egypt, 27.7572, 30.9100 Baruun-Urt, Mongolia, 46.6829, 113.2786 Coronel Bogado, Paraguay, -27.1700, -56.2500 Shirley, United Kingdom, 51.3813, -0.0543 Krasnyy Kut, Russia, 50.9500, 46.9667 Pollokshaws, United Kingdom, 55.8252, -4.2947 Algarrobo, Colombia, 10.1000, -74.2667 Algarrobo, Colombia, 10.1000, -74.2667 Buckingham, United Kingdom, 51.9950, -0.9860 Korangal, India, 17.1070, 77.6270 Omegna, Italy, 45.8781, 8.4069 Eski Ikan, Kazakhstan, 43.1833, 68.5333 Ushkonyr, Kazakhstan, 43.1942, 76.5367 Ocher, Russia, 57.8833, 54.7333 Ambohimanga Atsimo, Madagascar, -20.8783, 47.5928 Orbetello, Italy, 42.4394, 11.2125 Nasice, Croatia, 45.4833, 18.1000 Sison, Philippines, 9.6592, 125.5272 Krasnozavodsk, Russia, 56.4333, 38.2333 Iona, United States, 26.5160, -81.9601 Chiaravalle, Italy, 43.5997, 13.3257 Altinekin, Turkey, 38.3078, 32.8686 Chard, United Kingdom, 50.8728, -2.9587 Anantarazupeta, India, 14.0014, 79.3319 Bariariya, India, 26.5105, 84.7165 Bousso, Chad, 10.4825, 16.7161 Ban Don Kaeo, Thailand, 18.8567, 98.9689 Shimada, Japan, 40.5990, 141.3976 Mjolby, Sweden, 58.3321, 15.1312 Gualdo Tadino, Italy, 43.2333, 12.7833 New Kingman-Butler, United States, 35.2645, -114.0091 Unguturu, India, 16.8230, 81.4238 East Milton, United States, 30.6175, -86.9636 Benito Juarez, Argentina, -37.6667, -59.7833 Bikkavolu, India, 16.9500, 82.0500 Bialy Kamien, Poland, 50.7814, 16.2539 Puxinana, Brazil, -7.1608, -35.9608 Patcham, United Kingdom, 50.8640, -0.1500 Santa Maria a Vico, Italy, 41.0333, 14.4833 El Barrio de la Soledad, Mexico, 16.8000, -95.1167 Razan, Iran, 35.3925, 49.0331 Nkhata Bay, Malawi, -11.6333, 34.3000 Ucar, Azerbaijan, 40.5183, 47.6542 Ghaura, India, 24.5059, 79.0781 Vedasandur, India, 10.5310, 77.9502 Mongeri, Sierra Leone, 8.3207, -11.7343 Ban Nong Kula, Thailand, 16.6500, 99.9500 Pak Thong Chai, Thailand, 14.7167, 102.0167 Ban Tha Thong, Thailand, 16.8582, 100.2291 Tendrara, Morocco, 33.0500, -2.0000 Cienega de Flores, Mexico, 25.9500, -100.1833 Pineville, United States, 31.3414, -92.4096 Bokonbaev, Kyrgyzstan, 42.1100, 76.9900 Manoharpur, India, 22.3746, 85.1923 Det Udom, Thailand, 14.9060, 105.0784 Weston, United Kingdom, 53.4130, -2.7980 Mannur, India, 17.2994, 76.0984 Mionica, Serbia, 44.2500, 20.0833 Poynton, United Kingdom, 53.3500, -2.1167 Morokweng, South Africa, -26.1270, 23.7750 Shipley, United Kingdom, 53.8330, -1.7770 Chikitigarh, India, 19.2023, 84.6145 Haramachida, Japan, 35.5434, 139.4452 Maisach, Germany, 48.2167, 11.2667 Levoca, Slovakia, 49.0228, 20.5906 Little Falls, United States, 40.8762, -74.2181 Belm, Germany, 52.3000, 8.1333 Rustington, United Kingdom, 50.8102, -0.5052 Zozocolco de Hidalgo, Mexico, 20.1333, -97.5833 Mondolfo, Italy, 43.7517, 13.0956 Hidalgo, United States, 26.1090, -98.2464 Athens, United States, 35.4573, -84.6045 Imbau, Brazil, -24.4450, -50.7608 Svrljig, Serbia, 43.4167, 22.1167 Jefferson, United States, 34.1373, -83.6021 Murrhardt, Germany, 48.9800, 9.5814 Raje, India, 26.2216, 86.1454 Maria da Fe, Brazil, -22.3078, -45.3750 Aibongo, Mali, 16.2381, -3.2842 Villa La Angostura, Argentina, -40.7625, -71.6463 Brazopolis, Brazil, -22.4739, -45.6078 Mittegrossefehn, Germany, 53.3833, 7.5833 Seacroft, United Kingdom, 53.8222, -1.4599 Kukdeshwar, India, 24.4828, 75.2675 Prieska, South Africa, -29.6683, 22.7439 Van Buren, United States, 43.1211, -76.3591 Opera, Italy, 45.3833, 9.2167 Kodanad, India, 10.1800, 76.5100 Arvika, Sweden, 59.6667, 12.5667 Wingene, Belgium, 51.0500, 3.2667 Horw, Switzerland, 47.0164, 8.3111 Crepy-en-Valois, France, 49.2358, 2.8900 Kelafo, Ethiopia, 5.5889, 44.2056 Neftcala, Azerbaijan, 39.3791, 49.2486 Padavedu, India, 12.6730, 79.1047 Manuel Ribas, Brazil, -24.5158, -51.6678 Sabinopolis, Brazil, -18.6658, -43.0839 Toubakoro, Mali, 13.8747, -7.1819 Bruhl, Germany, 49.4000, 8.5333 Saren, India, 25.1149, 84.9744 Sines, Portugal, 37.9547, -8.8642 Knic, Serbia, 43.9167, 20.7167 Kashti, India, 18.5492, 74.5822 Mahavanona, Madagascar, -12.4643, 49.3804 Mapanas, Philippines, 12.4750, 125.2540 Wennigsen, Germany, 52.2742, 9.5708 West Freehold, United States, 40.2324, -74.2943 Pannimadai, India, 11.0823, 76.9164 Warrenville, United States, 41.8209, -88.1857 Turvo, Brazil, -25.0428, -51.5300 Aldenhoven, Germany, 50.8958, 6.2831 San Giorgio Ionico, Italy, 40.4500, 17.3667 Forfar, United Kingdom, 56.6442, -2.8884 Bad Camberg, Germany, 50.3000, 8.2667 Saint-Orens-de-Gameville, France, 43.5518, 1.5338 Nagardevla Budrukh, India, 20.5667, 75.2167 Powell, United States, 40.1689, -83.0829 Al Mu`addamiyah, Syria, 33.7415, 36.6422 Plattling, Germany, 48.7667, 12.8667 Douar Hammadi, Morocco, 31.6090, -8.4604 Borborema, Brazil, -21.6200, -49.0739 Marianske Lazne, Czechia, 49.9647, 12.7011 Kouroussa, Guinea, 10.6530, -9.8920 Ishikawa, Japan, 37.1571, 140.4468 Maldon, United Kingdom, 51.7318, 0.6758 Terkuvenganallur, India, 9.4052, 77.5408 Barkuhi, India, 22.1901, 78.7047 Agidel, Russia, 55.9000, 53.9333 East Rancho Dominguez, United States, 33.8949, -118.1956 Caldas, Brazil, -21.9239, -46.3858 Shichinohe, Japan, 40.7447, 141.1579 Aqkol, Kazakhstan, 52.0000, 70.9333 Chebrolu, India, 16.8206, 81.4048 Oleggio, Italy, 45.6000, 8.6333 Sierra Vista Southeast, United States, 31.4525, -110.2160 Ad Dab`ah, Egypt, 31.0338, 28.4333 Kearsley, United Kingdom, 53.5300, -2.3700 North Mankato, United States, 44.1810, -94.0391 Edingen-Neckarhausen, Germany, 49.2833, 8.6167 Mykolaivka, Ukraine, 48.8521, 37.7740 Wulong, China, 23.3202, 112.1901 Natchez, United States, 31.5437, -91.3867 Antas, Brazil, -10.4000, -38.3328 Sremska Kamenica, Serbia, 45.2206, 19.8392 Piney Green, United States, 34.7498, -77.3208 Siddapur, India, 14.3470, 74.8940 Alangudi, India, 10.3604, 78.9779 Rescaldina, Italy, 45.6167, 8.9500 Minamiaizu, Japan, 37.2004, 139.7732 Kartuzy, Poland, 54.3333, 18.2000 Koprukoy, Turkey, 39.9756, 41.8711 Adustina, Brazil, -10.5328, -38.1000 Panr, India, 25.6884, 85.7980 Assenede, Belgium, 51.2333, 3.7500 Sarvar, Hungary, 47.2500, 16.9333 Begowal, India, 31.6125, 75.5194 Bochil, Mexico, 16.9833, -92.9167 Kaoma, Zambia, -14.8000, 24.8000 Kalkar, Germany, 51.7389, 6.2925 Feldkirchen, Austria, 46.7167, 14.1000 Mittweida, Germany, 50.9856, 12.9811 Bishops Cleeve, United Kingdom, 51.9470, -2.0610 Hautmont, France, 50.2486, 3.9253 Tranas, Sweden, 58.0500, 14.9833 Miraima, Brazil, -3.5689, -39.9700 Kawaii, Japan, 38.0045, 140.0458 Almoloya de Alquisiras, Mexico, 18.8500, -99.8500 Haaren, Netherlands, 51.6017, 5.2228 Jefferson Valley-Yorktown, United States, 41.3180, -73.8008 Odlabari, India, 26.8594, 88.6214 Shinto, Japan, 36.4384, 138.9671 Ayomi, Benin, 6.7833, 1.7167 Douarnenez, France, 48.0928, -4.3292 Tamarakulam, India, 8.1325, 77.4848 Montelupo Fiorentino, Italy, 43.7333, 11.0167 Jacksonville, United States, 31.9642, -95.2617 Caerfyrddin, United Kingdom, 51.8560, -4.3160 Juan de Acosta, Colombia, 10.8333, -75.0333 Leyton, United Kingdom, 51.5700, -0.0150 Mankera, Pakistan, 31.3833, 71.4333 Puerto Deseado, Argentina, -47.7500, -65.9167 Pansemal, India, 21.6598, 74.6994 Willowick, United States, 41.6342, -81.4678 Vinto, Bolivia, -17.3833, -66.3000 Grenaa, Denmark, 56.4128, 10.8956 Mnagueur, Algeria, 33.1264, 6.3519 Khat Azakane, Morocco, 32.2226, -9.1343 Nallagunta, India, 16.5763, 80.6854 Talbahat, India, 25.0420, 78.4330 Waimalu, United States, 21.3913, -157.9345 Klasterec nad Ohri, Czechia, 50.3903, 13.1719 Dippoldiswalde, Germany, 50.8933, 13.6667 Leuna, Germany, 51.3167, 12.0167 Pirangut, India, 18.5115, 73.6801 Bhulwal, India, 32.8094, 74.7683 Birqash, Egypt, 30.1692, 31.0417 Bamble, Norway, 59.0197, 9.5608 Hythe, United Kingdom, 51.0716, 1.0840 Hajdusamson, Hungary, 47.6000, 21.7667 Indiana, United States, 40.6220, -79.1552 Grunstadt, Germany, 49.5692, 8.1681 Ashtead, United Kingdom, 51.3100, -0.2990 Bua Yai, Thailand, 15.5840, 102.4186 Sao Jose do Cedro, Brazil, -26.4550, -53.4939 Mers el Hadjad, Algeria, 35.7833, -0.1667 Orumanayur, India, 10.5583, 76.0347 Mirandiba, Brazil, -8.1189, -38.7278 Uslar, Germany, 51.6597, 9.6358 Santol, Philippines, 16.7700, 120.4500 Fianga, Chad, 9.9153, 15.1375 Barwon Heads, Australia, -38.2500, 144.5167 Hemsworth, United Kingdom, 53.6100, -1.3500 Raghudebbati, India, 22.5300, 88.2000 Khmis Sidi al 'Aydi, Morocco, 33.1228, -7.6219 Wilkinsburg, United States, 40.4442, -79.8733 Ardmore, United States, 40.0033, -75.2947 Katravulapalle, India, 17.1277, 82.0831 Krasnovishersk, Russia, 60.4167, 57.1000 Ukrainka, Ukraine, 50.1531, 30.7435 Collingswood, United States, 39.9160, -75.0758 Armthorpe, United Kingdom, 53.5352, -1.0522 Antarvedipalem, India, 16.3319, 81.7320 Juan Aldama, Mexico, 24.2911, -103.3939 Jitwarpur Kumhra, India, 25.7852, 85.7044 Taki, Japan, 34.4961, 136.5462 Plewiska, Poland, 52.3664, 16.8089 Federal Heights, United States, 39.8651, -105.0154 Grajales, Mexico, 19.2275, -97.8039 Staszow, Poland, 50.5633, 21.1717 Pulur, India, 18.1000, 78.8500 Tazert, Morocco, 31.6597, -7.4092 Wells Branch, United States, 30.4433, -97.6790 Alto Santo, Brazil, -5.5208, -38.2719 Shergarh, Pakistan, 30.8281, 73.7383 Buhusi, Romania, 46.7150, 26.7042 St. Helens, United States, 45.8572, -122.8164 Kutavur, India, 8.7833, 76.8167 Clearview, Canada, 44.3981, -80.0742 Southchase, United States, 28.3793, -81.3903 Beronono, Madagascar, -18.1884, 47.5163 Shanliang, China, 19.8798, 110.6011 Sanjiang Nongchang, China, 19.8808, 110.6020 Sao Martinho do Bispo, Portugal, 40.2092, -8.4765 Chicago Ridge, United States, 41.7034, -87.7795 Rambha, India, 19.4433, 84.9881 Ahrensfelde, Germany, 52.5758, 13.5764 Yuscaran, Honduras, 13.9444, -86.8526 Circleville, United States, 39.6063, -82.9334 Birstall, United Kingdom, 52.6736, -1.1200 Ipiranga, Brazil, -25.0239, -50.5839 Boutilimit, Mauritania, 17.5504, -14.7000 Massalubrense, Italy, 40.6167, 14.3500 Kerben, Kyrgyzstan, 41.5000, 71.7500 Thong Pha Phum, Thailand, 14.7382, 98.6320 Massaranduba, Brazil, -7.2000, -35.7889 Omis, Croatia, 43.4458, 16.6883 Braselton, United States, 34.1087, -83.8127 Astolfo Dutra, Brazil, -21.3150, -42.8619 Kakunodatemachi, Japan, 39.5993, 140.5615 Fergus Falls, United States, 46.2854, -96.0758 McFarland, United States, 35.6781, -119.2413 Sai Buri, Thailand, 6.7013, 101.6167 Lone Tree, United States, 39.5309, -104.8709 Santiago Jocotepec, Mexico, 17.5833, -95.8833 Vohringen, Germany, 48.2833, 10.0833 Sur Singh, India, 31.3992, 74.7160 Uzhur, Russia, 55.3175, 89.8225 Bad Ischl, Austria, 47.7203, 13.6333 Ipanguacu, Brazil, -5.4978, -36.8550 Villasanta, Italy, 45.6053, 9.3033 Tepoztlan, Mexico, 18.9853, -99.0997 Kilattingal, India, 8.6891, 76.7877 Belison, Philippines, 10.8381, 121.9606 Luino, Italy, 46.0000, 8.7500 Gurinhem, Brazil, -7.1239, -35.4244 Valenca, Portugal, 42.0282, -8.6339 Leirvik, Norway, 59.7800, 5.4994 Grass Valley, United States, 39.2238, -121.0522 Rixheim, France, 47.7494, 7.4053 El Rodeo, Guatemala, 14.3906, -90.8314 Milha, Brazil, -5.6750, -39.1939 Chapra, India, 23.5391, 88.5467 Dunmore, United States, 41.4152, -75.6072 Thonex, Switzerland, 46.1833, 6.1833 Natanz, Iran, 33.5072, 51.9136 Matias Barbosa, Brazil, -21.8689, -43.3189 Port Lincoln, Australia, -34.7322, 135.8586 Buchloe, Germany, 48.0375, 10.7250 Curua, Brazil, -1.8878, -55.1169 Charcas, Mexico, 23.1261, -101.1128 Jericho, United States, 40.7875, -73.5416 Nowy Tomysl, Poland, 52.3167, 16.1333 Saint-Paul-les-Dax, France, 43.7264, -1.0517 Kisanuki, Japan, 31.3444, 130.9453 East Wenatchee, United States, 47.4174, -120.2822 Roldan, Argentina, -32.9011, -60.9072 Kashin, Russia, 57.3500, 37.6167 Siroda, India, 15.3292, 74.0271 Llantrisant, United Kingdom, 51.5420, -3.3750 Phulwar, India, 26.8148, 84.8430 Gudur, India, 17.7956, 79.9747 Shiloh, United States, 38.5534, -89.9161 Capitao Eneas, Brazil, -16.3239, -43.7108 Varde, Denmark, 55.6216, 8.4807 Melsungen, Germany, 51.1333, 9.5500 Lagoa Real, Brazil, -14.0350, -42.1419 Pilas, Spain, 37.3017, -6.2986 Sibundoy, Colombia, 1.2033, -76.9192 Wittstock, Germany, 53.1636, 12.4856 Feucht, Germany, 49.3757, 11.2130 Eraura, India, 24.6130, 84.4555 Pelezi, Côte d’Ivoire, 7.2817, -6.8145 Banos, Ecuador, -1.3964, -78.4247 Mu'minobod, Tajikistan, 38.1083, 70.0292 Lachute, Canada, 45.6500, -74.3333 Erbach, Germany, 49.6583, 8.9958 Torrijos, Spain, 39.9833, -4.2814 Trepuzzi, Italy, 40.4000, 18.0667 Valentim Gentil, Brazil, -20.4219, -50.0878 Usti nad Orlici, Czechia, 49.9739, 16.3936 Niska Banja, Serbia, 43.2943, 22.0099 Doranahalli, India, 16.7324, 76.9162 Byahatti, India, 15.4468, 75.2054 Castel San Giovanni, Italy, 45.0591, 9.4342 Neuenkirchen, Germany, 52.2411, 7.3689 Lieusaint, France, 48.6333, 2.5500 Bovenden, Germany, 51.5897, 9.9222 Bougzoul, Algeria, 35.6997, 2.8478 Bela, India, 25.8103, 85.0157 Sideropolis, Brazil, -28.5978, -49.4244 Titiribi, Colombia, 6.0667, -75.8000 Noya, Spain, 42.7833, -8.8833 Meru, France, 49.2356, 2.1339 Kinogitan, Philippines, 8.9855, 124.7937 Rajim, India, 20.9650, 81.8817 Rosemere, Canada, 45.6369, -73.8000 Emerald, Australia, -23.5208, 148.1619 Adakplame, Benin, 7.4500, 2.5500 Oschatz, Germany, 51.3003, 13.1072 Beilen, Netherlands, 52.8567, 6.5111 Lorsch, Germany, 49.6539, 8.5675 Weissenhorn, Germany, 48.3000, 10.1667 Sungai Guntung, Indonesia, 0.2956, 103.6114 El Guetar, Tunisia, 34.3372, 8.9528 Sidi Ben Adda, Algeria, 35.3000, -1.1833 Tan Van, Vietnam, 10.9119, 106.8261 San Lorenzo, Guatemala, 15.0211, -91.7378 Tamar, India, 23.0488, 85.6490 Erbach, Germany, 48.3281, 9.8878 Ershui, Taiwan, 23.8167, 120.6167 Jodoigne, Belgium, 50.7276, 4.8723 Joao Neiva, Brazil, -19.7578, -40.3858 Sun Lakes, United States, 33.2172, -111.8695 Storozhynets, Ukraine, 48.1619, 25.7200 Lakewood Park, United States, 27.5390, -80.3865 Aiuaba, Brazil, -6.5739, -40.1239 Lagoa dos Gatos, Brazil, -8.6578, -35.9000 Koundian, Mali, 13.1589, -10.6803 Colesville, United States, 39.0730, -77.0010 Oostakker, Belgium, 51.1003, 3.7633 Valday, Russia, 57.9667, 33.2500 Italva, Brazil, -21.4208, -41.6908 Ponnampatti, India, 10.3668, 78.3955 Andalgala, Argentina, -27.6000, -66.3167 Lakeland, United States, 35.2585, -89.7308 Ban Mueang Nga, Thailand, 18.5997, 99.0181 Santiago de Anaya, Mexico, 20.3844, -98.9647 New Ulm, United States, 44.3120, -94.4685 Sumbal, India, 34.2307, 74.6472 Mill Valley, United States, 37.9086, -122.5421 Tibasosa, Colombia, 5.8333, -72.9667 Hochstadt an der Aisch, Germany, 49.7000, 10.8000 Plumstead, United States, 40.3878, -75.1164 Arenoso, Dominican Republic, 19.1800, -69.8500 Nules, Spain, 39.8525, -0.1506 Zazafotsy, Madagascar, -22.2056, 46.3611 Montalvania, Brazil, -14.4228, -44.3658 Sjenica, Serbia, 43.2667, 20.0000 Vammanal, India, 12.0281, 75.7093 Douar Lehgagcha, Morocco, 32.5500, -8.7167 Arboga, Sweden, 59.4000, 15.8333 Beekman, United States, 41.6042, -73.6944 Kerugoya, Kenya, -0.4989, 37.2803 Pedro Afonso, Brazil, -8.9678, -48.1750 Beylul, Eritrea, 13.2639, 42.3347 Teploklyuchenka, Kyrgyzstan, 42.4995, 78.5270 Sasan, India, 25.6883, 86.1907 Fisciano, Italy, 40.7667, 14.8000 Ezequiel Montes, Mexico, 20.6667, -99.8833 Moudjbara, Algeria, 34.5037, 3.4704 Ayni, Tajikistan, 38.6667, 68.8167 Nantwich, United Kingdom, 53.0670, -2.5220 Narvik, Norway, 68.4383, 17.4278 Artondale, United States, 47.3021, -122.6406 Bellefontaine, United States, 40.3627, -83.7630 El Carmen de Atrato, Colombia, 5.8878, -75.1642 Karugamad, India, 10.4667, 76.1000 Frunze, Kyrgyzstan, 40.1233, 71.7221 El Socorro, Venezuela, 8.9936, -65.7456 Gouveia, Portugal, 40.5000, -7.6000 Khadra, Algeria, 36.2500, 0.5667 Chelmza, Poland, 53.1847, 18.6042 Karlivka, Ukraine, 49.4500, 35.1333 Cojedes, Venezuela, 9.6167, -68.9167 Asslar, Germany, 50.5833, 8.4667 Mazamitla, Mexico, 19.9153, -103.0208 Rio de Oro, Colombia, 8.0000, -73.5000 Ivdel, Russia, 60.6833, 60.4167 Santa Catalina, Colombia, 10.6039, -75.2878 Itakura, Japan, 36.2229, 139.6103 Newport, United States, 39.0856, -84.4868 Aguas Vermelhas, Brazil, -15.7469, -41.4600 Billere, France, 43.3031, -0.3906 Daean, Korea, South, 35.4038, 129.2788 Nelas, Portugal, 40.5167, -7.8500 Novohrodivka, Ukraine, 48.2000, 37.3394 Ostrzeszow, Poland, 51.4167, 17.9333 Kottaiyur, India, 10.1096, 78.7956 Mbini, Equatorial Guinea, 1.5833, 9.6167 Amari, India, 25.7179, 86.0839 Smithfield, United States, 41.8349, -111.8265 Beloeil, Belgium, 50.5333, 3.7167 Caudry, France, 50.1258, 3.4125 Pestovo, Russia, 58.6000, 35.8167 Ciro Marina, Italy, 39.3667, 17.1167 Schneeberg, Germany, 50.5942, 12.6456 Suknadanga, India, 24.4600, 88.0500 Karai, India, 12.9377, 79.3163 Uttukkottai, India, 13.3354, 79.8980 Rio Azul, Brazil, -25.7328, -50.7958 Mignoure, Côte d’Ivoire, 7.4875, -6.7882 Barari, India, 25.5068, 87.3761 Lapua, Finland, 62.9700, 23.0083 Primrose, South Africa, -26.1833, 28.1667 Midlothian, United States, 41.6254, -87.7243 Friesenheim, Germany, 48.3731, 7.8833 Allouez, United States, 44.4721, -88.0259 Kiashahr, Iran, 37.4214, 49.9408 Wezembeek-Oppem, Belgium, 50.8442, 4.4872 Uttoxeter, United Kingdom, 52.8980, -1.8600 Gafanha da Nazare, Portugal, 40.6333, -8.7167 Anderson Creek, United States, 35.2657, -78.9580 Petrolandia, Brazil, -9.1828, -38.2689 Rotenburg an der Fulda, Germany, 50.9961, 9.7278 Tierra Amarilla, Chile, -27.4822, -70.2658 Famenin, Iran, 35.1139, 48.9725 Santa Adelia, Brazil, -21.2428, -48.8039 Esquipulas Palo Gordo, Guatemala, 14.9333, -91.8167 Destin, United States, 30.3950, -86.4701 Lakoucun, China, 28.3431, 119.9521 Antohobe, Madagascar, -19.7667, 46.1833 Fawley, United Kingdom, 50.8280, -1.3520 Barjora, India, 23.4300, 87.2800 Sibirila, Mali, 11.4272, -7.7667 Velykodolynske, Ukraine, 46.3447, 30.5783 Taguatinga, Brazil, -12.4061, -46.4339 Ilampillai, India, 11.6066, 78.0068 East Norriton, United States, 40.1506, -75.3364 Keal, India, 25.1218, 84.6324 Hokuei, Japan, 35.4833, 133.7667 Haivoron, Ukraine, 48.3333, 29.8667 Wauconda, United States, 42.2749, -88.1359 Audincourt, France, 47.4836, 6.8403 Turuttiyad, India, 11.5167, 75.6500 Selmana, Algeria, 34.1833, 3.6000 Pierre, United States, 44.3748, -100.3205 Ranapur, India, 22.6470, 74.5212 Riposto, Italy, 37.7318, 15.2058 Cordoba, Colombia, 0.8550, -77.5211 Ricaurte, Ecuador, -2.8667, -78.9333 Tapolca, Hungary, 46.8828, 17.4411 Alewah, India, 29.4767, 76.4522 Fujikawa, Japan, 35.5611, 138.4614 Martinho Campos, Brazil, -19.3319, -45.2369 Rajasur, India, 17.8600, 76.9500 Busto Garolfo, Italy, 45.5478, 8.8867 Candeias, Brazil, -20.7669, -45.2758 Iracema, Brazil, -5.8167, -38.3000 Rafai, Central African Republic, 4.9731, 23.9319 Takerbouzt, Algeria, 36.4180, 4.3428 Brahmanandapuram, India, 16.9583, 82.0056 Tall Banat, Iraq, 36.2610, 42.0223 Seonsan, Korea, South, 37.0333, 127.5167 Beraketa, Madagascar, -24.1835, 45.6861 Ambahita, Madagascar, -24.0095, 45.2604 Mahavelona, Madagascar, -19.1699, 46.5235 Marotsiraka, Madagascar, -24.2796, 45.9850 Mahajamba, Madagascar, -15.7115, 47.1110 Ambatomarina, Madagascar, -20.5702, 47.0175 Antanambaobe, Madagascar, -16.2500, 49.6667 Kalandy, Madagascar, -15.7454, 48.7154 Bekipay, Madagascar, -16.2564, 46.1252 Marokarima, Madagascar, -21.2210, 48.1405 Fiadanana, Madagascar, -20.3299, 47.4016 Mahatsinjony, Madagascar, -21.4196, 47.2035 Vanono, Madagascar, -16.0397, 49.4607 Talata-Vohimena, Madagascar, -20.8609, 46.9681 Vatolatsaka, Madagascar, -23.3180, 44.3052 Belambo, Madagascar, -19.4070, 47.5213 Miarinarivo, Madagascar, -16.6200, 48.2446 Beharona, Madagascar, -21.5214, 44.3046 Ambohimitombo, Madagascar, -20.7173, 47.4302 Tsarahasina, Madagascar, -15.7719, 47.5806 Bevato, Madagascar, -18.6913, 46.2585 Ankiliabo, Madagascar, -21.7130, 43.8931 Amborondra, Madagascar, -21.9180, 47.7726 Bealanana, Madagascar, -14.5451, 48.7372 Sahalanona, Madagascar, -22.0551, 47.6175 Ambodihara, Madagascar, -14.8099, 48.9244 Ilha de Mocambique, Mozambique, -15.0367, 40.7328 O`nhayot, Uzbekistan, 41.0103, 71.7614 Shofirkon Shahri, Uzbekistan, 40.1167, 64.5000 Forest Park, United States, 41.8683, -87.8157 Meilen, Switzerland, 47.2703, 8.6411 Berettyoujfalu, Hungary, 47.2167, 21.5500 Lower Moreland, United States, 40.1346, -75.0542 Montfoort, Netherlands, 52.0500, 4.9500 Kamituga, Congo (Kinshasa), -3.0600, 28.1800 Annaram, India, 16.7840, 79.3020 Sahnaya, Syria, 33.4253, 36.2255 Coribe, Brazil, -13.8289, -44.4539 Koundara, Guinea, 12.4800, -13.2960 Bandraboua, Mayotte, -12.7254, 45.1072 Sharonville, United States, 39.2825, -84.4071 Beach Park, United States, 42.4260, -87.8583 Taiyong, China, 26.4726, 108.5105 Lys-les-Lannoy, France, 50.6722, 3.2153 Shandiz, Iran, 36.3961, 59.3092 Matane, Canada, 48.8500, -67.5333 Donji Vakuf, Bosnia and Herzegovina, 44.1500, 17.4000 Ettenheim, Germany, 48.2556, 7.8119 Mirzapur, India, 26.1616, 87.2349 Kongarapalli, India, 10.0448, 76.3552 Pali, India, 26.0576, 86.3097 Bni Darkoul, Morocco, 35.0563, -5.0688 Chumpak, China, 41.8585, 84.1370 Ambohimiera, Madagascar, -21.0551, 47.5059 Fort Lewis, United States, 47.0955, -122.5674 Greenwood, United States, 33.5126, -90.1993 Hassfurt, Germany, 50.0167, 10.5000 Pemberton, United Kingdom, 53.5360, -2.6738 Ganguvarpatti, India, 10.1694, 77.6973 Kuraymah, Sudan, 18.5500, 31.8500 Beiwusidui, China, 40.0692, 116.8228 Hunxe, Germany, 51.6417, 6.7672 Nevel, Russia, 56.0333, 29.9167 Thames Centre, Canada, 43.0300, -81.0800 Felixlandia, Brazil, -18.7578, -44.8989 Mirinzal, Brazil, -2.0650, -44.7839 Oud-Turnhout, Belgium, 51.3180, 4.9823 Jardim de Piranhas, Brazil, -6.3789, -37.3519 Sutihar, India, 25.8482, 84.9712 Boha, India, 29.8348, 75.5237 Santa Branca, Brazil, -23.3969, -45.8839 Mankal, India, 17.2014, 78.4678 Kambila, Mali, 12.7931, -8.1050 Raydah, Yemen, 15.8233, 44.0386 College Park, United States, 33.6363, -84.4640 Soledade, Brazil, -7.0569, -36.3628 Ovidiu, Romania, 44.2700, 28.5600 Merosina, Serbia, 43.2833, 21.7167 Goianapolis, Brazil, -16.5108, -49.0239 Lubben (Spreewald), Germany, 51.9500, 13.9000 Sakaki, Japan, 36.4618, 138.1801 Anadia, Brazil, -9.6844, -36.3042 Rajnagar, India, 23.9500, 87.3200 Roselle Park, United States, 40.6653, -74.2666 Saint-Martin-de-Crau, France, 43.6408, 4.8133 Papagos, Greece, 37.9900, 23.7933 Gvardeysk, Russia, 54.6667, 21.0833 Pacaembu, Brazil, -21.5622, -51.2606 Beasain, Spain, 43.0458, -2.1894 Teays Valley, United States, 38.4482, -81.9246 Bad Soden-Salmunster, Germany, 50.2667, 9.3667 Meridjonou, Benin, 6.4619, 2.6774 Chaugain, India, 25.4801, 84.2328 Krasnogvardeyskoye, Russia, 45.8500, 41.5167 Kargipinar, Turkey, 36.6667, 34.4167 Bedfordview, South Africa, -26.1794, 28.1361 Richland, United States, 40.4490, -75.3362 McPherson, United States, 38.3714, -97.6605 Nova Ipixuna, Brazil, -4.9208, -49.0769 Detva, Slovakia, 48.5572, 19.4208 Bolivar, Colombia, 4.3386, -76.1847 Hilpoltstein, Germany, 49.1833, 11.1833 Lauchhammer, Germany, 51.5000, 13.8000 Belwara, India, 25.7443, 86.4755 Amaha, India, 26.1284, 86.7998 Kepno, Poland, 51.2833, 17.9833 Michendorf, Germany, 52.3000, 13.0167 Havelock North, New Zealand, -39.6667, 176.8833 Kanakir, Syria, 33.2666, 36.0963 Thouars, France, 46.9758, -0.2142 La Entrada, Honduras, 15.0638, -88.7464 Belsandi Tara, India, 25.7722, 85.9608 Bambang, Philippines, 14.5257, 121.0729 Sankt Leon-Rot, Germany, 49.2653, 8.5986 Cassina de' Pecchi, Italy, 45.5167, 9.3667 Misano Adriatico, Italy, 43.9667, 12.7000 Quakenbruck, Germany, 52.6772, 7.9575 Perdur, India, 13.3844, 74.9029 Torre del Campo, Spain, 37.7667, -3.8833 Montataire, France, 49.2561, 2.4392 Narasingapuram, India, 12.9728, 79.2840 Powell River, Canada, 49.8353, -124.5247 Furukawamen, Japan, 33.2378, 129.6547 Berre-l'Etang, France, 43.4760, 5.1686 Grunberg, Germany, 50.6000, 8.9500 Krumbach, Germany, 48.2500, 10.3667 Marostica, Italy, 45.7456, 11.6553 Carleton Place, Canada, 45.1333, -76.1333 Ichtegem, Belgium, 51.0928, 3.0106 Castellanza, Italy, 45.6167, 8.9000 McCalla, United States, 33.3023, -87.0302 Llanera, Spain, 43.4667, -5.9333 San Jose Acatempa, Guatemala, 14.2667, -90.1333 Brandermill, United States, 37.4340, -77.6522 Hohenstein-Ernstthal, Germany, 50.8000, 12.7167 Attibele, India, 12.7781, 77.7726 Bang Racham, Thailand, 14.9000, 100.3167 Aracatu, Brazil, -14.4278, -41.4619 Sesquile, Colombia, 5.0453, -73.7972 Brierley Hill, United Kingdom, 52.4795, -2.1245 Ibicui, Brazil, -14.8419, -39.9869 Tarhzout, Algeria, 33.4833, 6.7500 Streetly, United Kingdom, 52.5770, -1.8840 Tsingoni, Mayotte, -12.7858, 45.1113 Hunasagi, India, 16.4575, 76.5239 Rocky Point, United States, 40.9357, -72.9364 San Lorenzo, Guatemala, 14.4833, -91.5167 Locorotondo, Italy, 40.7500, 17.3167 Nachikatsuura, Japan, 33.6333, 135.9333 Zhipingxiang, China, 35.2950, 105.6158 Cossato, Italy, 45.5604, 8.1852 Abre Campo, Brazil, -20.3008, -42.4778 Gesuba, Ethiopia, 6.7242, 37.5567 Khe Sanh, Vietnam, 16.6193, 106.7305 Sukma, India, 18.4000, 81.6667 Wood Dale, United States, 41.9668, -87.9808 Diego de Almagro, Chile, -26.3911, -70.0458 Julianadorp, Netherlands, 52.8833, 4.7333 Forest Hill, United States, 32.6619, -97.2662 Viraganur, India, 11.4761, 78.7355 Papagaios, Brazil, -19.4489, -44.7478 Milovice, Czechia, 50.2289, 14.8906 Mansidao, Brazil, -10.7158, -44.0339 Kaspiyskiy, Russia, 45.3908, 47.3658 Willow Grove, United States, 40.1469, -75.1174 Balassagyarmat, Hungary, 48.0712, 19.2937 Oued Taria, Algeria, 35.1167, 0.0833 Alterosa, Brazil, -21.2489, -46.1428 Maracai, Brazil, -22.6106, -50.6672 Muttunayakkanpatti, India, 11.7125, 78.0330 Khergam, India, 20.6300, 73.0900 Philippsburg, Germany, 49.2333, 8.4500 Rossington, United Kingdom, 53.4759, -1.0613 Kelangah, India, 28.8700, 76.3285 Alto Parana, Brazil, -23.1289, -52.3189 Pierrelatte, France, 44.3783, 4.6964 Bebra, Germany, 50.9711, 9.7903 Debre Werk', Ethiopia, 10.6667, 38.1667 Wanding, China, 24.0833, 98.0667 Midleton, Ireland, 51.9094, -8.1736 Moralzarzal, Spain, 40.6750, -3.9694 Bickley, United Kingdom, 51.4003, 0.0466 Kubadupuram, India, 16.4680, 79.9539 Guelph/Eramosa, Canada, 43.6300, -80.2200 Krishnarayapuram, India, 10.9563, 78.2782 Santo Augusto, Brazil, -27.8508, -53.7769 Grao Mogol, Brazil, -16.5589, -42.8900 Markt Schwaben, Germany, 48.1911, 11.8681 Tucacas, Venezuela, 10.7978, -68.3175 Oberhaching, Germany, 48.0167, 11.5833 Bukedea, Uganda, 1.3475, 34.0444 Mogeiro, Brazil, -7.2989, -35.4789 Denzlingen, Germany, 48.0683, 7.8825 Millbury, United States, 42.1925, -71.7741 Hall in Tirol, Austria, 47.2833, 11.5000 Urbana, United States, 39.3274, -77.3423 Tulchyn, Ukraine, 48.6744, 28.8497 Dumri, India, 26.9873, 84.0752 Bhogpur, India, 31.5500, 75.6300 Salaverry, Peru, -8.2214, -78.9764 Jiran, India, 24.3087, 74.8909 Bog Walk, Jamaica, 18.1020, -77.0054 Tidjelabine, Algeria, 36.7333, 3.5000 Galmi, Niger, 13.9673, 5.6747 Bellair-Meadowbrook Terrace, United States, 30.1796, -81.7375 Joaquim Pires, Brazil, -3.5078, -42.1978 Polukallu, India, 15.8284, 77.7431 Biougra, Morocco, 30.2144, -9.3708 Glenpool, United States, 35.9488, -96.0052 Hawarden, United Kingdom, 53.1820, -3.0200 Lauterbach, Germany, 50.6378, 9.3944 Jaca, Spain, 42.5500, -0.5500 Tumbippadi, India, 11.8080, 78.0783 Eastham, United Kingdom, 53.3130, -2.9620 Areado, Brazil, -21.3589, -46.1458 Cefalu, Italy, 38.0395, 14.0221 Jabbeke, Belgium, 51.1500, 3.2333 Marshall, United States, 44.4488, -95.7897 Sagar, India, 16.6249, 76.8015 Caselle Torinese, Italy, 45.1775, 7.6464 Sido, Mali, 11.6653, -7.5997 Elfers, United States, 28.2140, -82.7230 Matican, Kosovo, 42.6456, 21.1983 White House, United States, 36.4648, -86.6666 Tati, India, 23.3772, 85.4379 Roncq, France, 50.7544, 3.1211 Luling, United States, 29.9008, -90.3523 York, United States, 43.1860, -70.6660 Bollene, France, 44.2811, 4.7494 Hoa Thuong, Vietnam, 21.6472, 105.8278 South Sioux City, United States, 42.4627, -96.4125 Simplicio Mendes, Brazil, -7.8539, -41.9100 Ping'anbao, China, 40.4989, 117.5911 Westmont, United States, 39.9082, -75.0551 Aurora, United States, 42.7382, -78.6373 Linganaboyinacherla, India, 16.3961, 81.6598 Alcanena, Portugal, 39.4589, -8.6689 Taphan Hin, Thailand, 16.2209, 100.4198 Tracunhaem, Brazil, -7.8050, -35.2400 Eichstatt, Germany, 48.8919, 11.1839 Wakasa, Japan, 35.5489, 135.9082 Binkolo, Sierra Leone, 8.9522, -11.9803 Kettering, United States, 38.8888, -76.7889 Ibipitanga, Brazil, -12.8819, -42.4858 Megara, Greece, 37.9964, 23.3444 Elk Plain, United States, 47.0425, -122.3663 Tamalameque, Colombia, 8.8333, -73.5833 Frankenberg, Germany, 50.9108, 13.0378 Kishanpur Ratwara, India, 25.4822, 86.8511 Polavaram, India, 17.2479, 81.6432 Gonzalez, United States, 30.5822, -87.2906 Manoel Vitorino, Brazil, -14.1450, -40.2428 Tarauna, India, 26.2371, 87.5123 Qiblai, Tajikistan, 38.6167, 68.8333 Avanhandava, Brazil, -21.4608, -49.9497 Shterpce, Kosovo, 42.2394, 21.0272 Huangyadong, China, 36.8039, 113.4446 Guamal, Colombia, 3.8800, -73.7656 Weno, Micronesia, Federated States of, 7.4417, 151.8583 Luozi, Congo (Kinshasa), -4.9480, 14.1330 Saboeiro, Brazil, -6.5419, -39.9069 Solaro, Italy, 45.6150, 9.0839 Lyndhurst, United States, 41.5172, -81.4922 Channahon, United States, 41.4210, -88.2599 Carmopolis, Brazil, -10.6478, -36.9889 Grand Falls, Canada, 48.9578, -55.6633 Iskapalli, India, 14.7363, 80.0981 Toulal, Morocco, 32.3036, -3.9861 Zhovkva, Ukraine, 50.0550, 23.9767 Polotitlan de la Ilustracion, Mexico, 20.2253, -99.8154 Sauk Rapids, United States, 45.5981, -94.1538 San Rafael Las Flores, Guatemala, 14.4814, -90.1733 Amantea, Italy, 39.1332, 16.0745 Shlisselburg, Russia, 59.9536, 31.0383 Beachwood, United States, 41.4759, -81.5030 Parihara, India, 25.5378, 86.2728 Dogachi, India, 24.6195, 87.9221 Carapebus, Brazil, -22.1869, -41.6608 Coldwater, United States, 41.9465, -84.9989 Itaguara, Brazil, -20.3919, -44.4878 Batuan, Philippines, 9.8000, 124.1300 Mandalgarh, India, 25.2000, 75.1000 Trinitapoli, Italy, 41.3500, 16.1000 Fujimi, Japan, 35.9146, 138.2407 Mount Barker, Australia, -35.0667, 138.8500 Kauriya, India, 26.1517, 84.6948 Ribeiro do Amparo, Brazil, -11.0469, -38.4328 Holzgerlingen, Germany, 48.6392, 9.0108 Hidaj, Iran, 36.2558, 49.1314 Primavera, Brazil, -8.3378, -35.3550 Gangaikondan, India, 11.5389, 79.4765 Saloa, Brazil, -8.9758, -36.6878 Barra do Mendes, Brazil, -11.8100, -42.0589 Asperg, Germany, 48.9000, 9.1333 North Battleford, Canada, 52.7575, -108.2861 Paripueira, Brazil, -9.4650, -35.5519 Valayam, India, 11.7214, 75.6697 Fara in Sabina, Italy, 42.1902, 12.6962 Kamigori, Japan, 34.8667, 134.3500 Valencia West, United States, 32.1355, -111.1123 Haidarnagar, India, 24.4883, 83.9443 North Auburn, United States, 38.9306, -121.0820 Santa Cruz de Bezana, Spain, 43.4442, -3.9031 Antigua, Spain, 28.4186, -14.0111 Vellodu, India, 10.3048, 77.9552 Iygli, Morocco, 29.5001, -9.0501 Cosham, United Kingdom, 50.8424, -1.0660 New Franklin, United States, 40.9525, -81.5838 Bridgetown, United States, 39.1552, -84.6359 Vembarpatti, India, 10.2500, 78.1167 Strada, Italy, 43.6590, 11.2964 Pervomaysk, Russia, 54.8667, 43.8000 Wayland, United States, 42.3586, -71.3594 Pedro Velho, Brazil, -6.4389, -35.2208 Bedford, United States, 38.8602, -86.4895 Newington, United States, 38.7358, -77.1993 Loningen, Germany, 52.7167, 7.7667 Enniskillen, United Kingdom, 54.3447, -7.6389 Khajawa, India, 24.9174, 79.9269 Seiro, Japan, 37.9745, 139.2742 Pigue, Argentina, -37.6167, -62.4167 Trbovlje, Slovenia, 46.1500, 15.0500 Clemencia, Colombia, 10.5833, -75.3333 Irikkur, India, 11.9700, 75.5700 Ipswich, United States, 42.6857, -70.8399 Fleury-Merogis, France, 48.6300, 2.3620 Hawaiian Gardens, United States, 33.8304, -118.0728 Drapetsona, Greece, 37.9467, 23.6250 Skoczow, Poland, 49.8006, 18.7883 Wanzleben, Germany, 52.0667, 11.4333 eManzimtoti, South Africa, -30.0500, 30.8833 Waycross, United States, 31.2108, -82.3579 Worgl, Austria, 47.4833, 12.0667 Schwaz, Austria, 47.3500, 11.7000 Colangute, India, 15.5417, 73.7619 Turuvanur, India, 14.2200, 76.4000 Dowbaran, Iran, 28.4050, 54.1878 Halawa, United States, 21.3753, -157.9185 Magalhaes de Almeida, Brazil, -3.3958, -42.2039 Littleborough, United Kingdom, 53.6440, -2.0980 Ewarton, Jamaica, 18.1833, -77.0833 Calafat, Romania, 43.9858, 22.9575 Fontenay-le-Comte, France, 46.4660, -0.8061 Nawagarh, India, 31.1899, 77.6261 San Antonio de las Vueltas, Cuba, 22.5162, -79.7013 Pedernales, Dominican Republic, 18.0333, -71.7500 Plav, Montenegro, 42.6000, 19.9400 Passo de Camarajibe, Brazil, -9.2378, -35.4928 Tako, Japan, 35.7333, 140.4667 Itagi, Brazil, -14.1628, -40.0058 Gangavalli, India, 11.4983, 78.6461 Koppies, South Africa, -27.2333, 27.5833 Lumberton, United States, 30.2562, -94.2070 Graca, Brazil, -4.0458, -40.7528 Kamnik, Slovenia, 46.2257, 14.6120 Boyovut, Uzbekistan, 40.2822, 69.0183 Wombourn, United Kingdom, 52.5302, -2.1857 Union de Tula, Mexico, 19.9570, -104.2680 Ronne, Denmark, 55.1009, 14.7066 Verin, Spain, 41.9408, -7.4358 Kivertsi, Ukraine, 50.8331, 25.4614 Olean, United States, 42.0819, -78.4321 Assai, Brazil, -23.3728, -50.8408 Carmo de Minas, Brazil, -22.1219, -45.1289 Meerane, Germany, 50.8519, 12.4636 Achuapa, Nicaragua, 13.0500, -86.5833 Bideipur, India, 21.0147, 86.8195 Acajutiba, Brazil, -11.6619, -38.0169 Spaichingen, Germany, 48.0758, 8.7378 Sarayan, Iran, 33.8636, 58.5211 Beelitz, Germany, 52.2333, 12.9667 Tibri, India, 31.9854, 75.4316 Anapurus, Brazil, -3.6719, -43.1158 Bad Durrheim, Germany, 48.0167, 8.5333 Arbaa Laaounate, Morocco, 32.7446, -8.1942 El Kansera, Morocco, 34.0419, -5.9272 San Giljan, Malta, 35.9186, 14.4900 Worthington, United States, 43.6281, -95.5990 Oftringen, Switzerland, 47.3150, 7.9236 Vaires-sur-Marne, France, 48.8667, 2.6500 Broussard, United States, 30.1396, -91.9540 Villalba, Spain, 43.3000, -7.6833 San Rafael Petzal, Guatemala, 15.4167, -91.6667 Ban Bang Muang, Thailand, 13.8474, 100.4167 Stolin, Belarus, 51.8833, 26.8500 Akropong, Ghana, 5.9746, -0.0854 Ban Tha Luang Lang, Thailand, 12.6816, 102.1690 Couvin, Belgium, 50.0519, 4.4961 Tomino, Spain, 41.9833, -8.7167 Siemiatycze, Poland, 52.4272, 22.8625 Kingston, United States, 41.9862, -70.7482 Jinmingsi, China, 38.0512, 110.2869 Rosyth, United Kingdom, 56.0339, -3.4323 Sannicandro Garganico, Italy, 41.8333, 15.5667 Mont-Laurier, Canada, 46.5500, -75.5000 Juvignac, France, 43.6139, 3.8106 Higashimiyoshi, Japan, 34.0333, 133.9333 Angermunde, Germany, 53.0333, 14.0000 Madanpur, India, 25.8670, 86.7875 Simri, India, 26.1639, 85.7617 Bessonovka, Russia, 53.3094, 45.0419 Cacu, Brazil, -18.5569, -51.1308 Ampasinambo, Madagascar, -20.5235, 47.9923 Zhongliao, Taiwan, 23.9039, 120.7819 Chaoyangdicun, China, 42.0221, 118.2178 Morangis, France, 48.7055, 2.3326 Guape, Brazil, -20.7619, -45.9178 Lomma, Sweden, 55.6833, 13.0833 On Top of the World Designated Place, United States, 29.1058, -82.2866 Morwell, Australia, -38.2333, 146.4000 Varedo, Italy, 45.6000, 9.1667 Orange City, United States, 28.9348, -81.2881 Arugollu, India, 16.8253, 81.5775 Bouchabel, Morocco, 34.3833, -5.0167 Berceni, Romania, 44.3167, 26.1833 Messadine, Tunisia, 35.7619, 10.5953 Gouka, Benin, 8.1333, 1.9667 Kirkwood, South Africa, -33.4003, 25.4425 McMinnville, United States, 35.6864, -85.7812 Maumee, United States, 41.5696, -83.6636 Feliz, Brazil, -29.4508, -51.3058 Leverano, Italy, 40.2833, 18.0833 San Agustin de Guadalix, Spain, 40.6781, -3.6150 Sendenhorst, Germany, 51.8439, 7.8278 Taggia, Italy, 43.8439, 7.8509 Tampamolon Corona, Mexico, 21.5667, -98.8167 Kodigenahalli, India, 13.8608, 77.4792 Sidi Abdelkarim, Morocco, 33.1869, -7.2333 Auburn, United States, 38.8950, -121.0777 Santa Margarita, Spain, 39.7033, 3.1036 Singalandapuram, India, 11.4166, 78.2224 Sao Pedro do Piaui, Brazil, -5.9289, -42.7189 Gulcho, Kyrgyzstan, 40.3138, 73.4442 Amrabad, India, 16.3833, 78.8333 Travagliato, Italy, 45.5240, 10.0797 Bandarbeyla, Somalia, 9.4833, 50.8167 Nehram, Azerbaijan, 39.1160, 45.4617 Cambados, Spain, 42.5000, -8.8000 Chityal, India, 17.2333, 79.1333 Lipno, Poland, 52.8500, 19.1667 Megarine, Algeria, 33.1944, 6.0944 Orange Walk, Belize, 18.0750, -88.5583 Gardony, Hungary, 47.1973, 18.6091 Kannivadi, India, 10.3794, 77.8303 Snoqualmie, United States, 47.5293, -121.8412 Jardin, Colombia, 5.5986, -75.8194 Settara, Algeria, 36.7167, 6.3333 Uruoca, Brazil, -3.3139, -40.5569 Rostamabad, Iran, 36.8994, 49.4931 Central Elgin, Canada, 42.7667, -81.1000 Itinga, Brazil, -16.6128, -41.7650 Flores de Goias, Brazil, -14.4489, -47.0500 Urupes, Brazil, -21.2019, -49.2900 Soller, Spain, 39.7675, 2.7140 Nawada, India, 26.0881, 86.1530 Manavalakurichi, India, 8.1478, 77.3055 Flower Hill, United States, 39.1676, -77.1824 Barghat, India, 22.0306, 79.7328 Pegnitz, Germany, 49.7564, 11.5450 Forster, Australia, -32.1806, 152.5117 Hawick, United Kingdom, 55.4220, -2.7870 Omerli, Turkey, 37.4025, 40.9561 Msata, Tanzania, -6.3362, 38.3850 Badarwas, India, 24.9752, 77.5649 Mata, Chad, 14.0436, 21.1611 Tacaimbo, Brazil, -8.3158, -36.2928 Gopalpur, India, 26.1317, 84.3594 Bondeno, Italy, 44.8894, 11.4154 Ang Thong, Thailand, 14.5925, 100.4572 Zarghun Shahr, Afghanistan, 32.8500, 68.4167 Sidmouth, United Kingdom, 50.6800, -3.2390 Zmiiv, Ukraine, 49.6944, 36.3592 Ataleia, Brazil, -18.0439, -41.1100 Futrono, Chile, -40.1333, -72.4000 Guaraniacu, Brazil, -25.1008, -52.8778 Priverno, Italy, 41.4667, 13.1833 Enghien, Belgium, 50.6956, 4.0411 Urbino, Italy, 43.7252, 12.6372 Azle, United States, 32.8955, -97.5379 Bodagudipadu, India, 14.7385, 79.8602 Palkur, India, 15.4144, 78.2507 Angical, Brazil, -12.0069, -44.6939 Ibateguara, Brazil, -8.9728, -35.9389 Taglio, Italy, 45.0167, 12.2167 Darihat, India, 24.9702, 84.2319 Uruana, Brazil, -15.4978, -49.6878 Carros, France, 43.7933, 7.1883 Ephrata, United States, 40.1811, -76.1812 Malepur, India, 24.9740, 86.2555 Nova Trento, Brazil, -27.2867, -48.9303 Bhalil, Morocco, 33.8500, 4.8667 Ighrem n'Ougdal, Morocco, 31.2333, -7.4333 Sao Joao do Triunfo, Brazil, -25.6828, -50.2969 Alagoinha, Brazil, -6.9500, -35.5450 Milford Haven, United Kingdom, 51.7142, -5.0427 Albertirsa, Hungary, 47.2400, 19.6067 Xireg, China, 36.9250, 98.4780 Meckenbeuren, Germany, 47.7000, 9.5625 Tazzarine, Morocco, 30.7722, -5.5458 Sobraon, India, 31.1833, 74.8500 Nonoai, Brazil, -27.3619, -52.7708 Cayce, United States, 33.9459, -81.0429 Mistassini, Canada, 48.8229, -72.2154 Biedenkopf, Germany, 50.9128, 8.5322 Isla Vista, United States, 34.4128, -119.8614 Mions, France, 45.6629, 4.9560 Tamaraikkulam, India, 10.1085, 77.5553 Oki, Japan, 33.2106, 130.4397 Nova Canaa, Brazil, -14.7939, -40.1419 Wezep, Netherlands, 52.4635, 6.0058 Saugeen Shores, Canada, 44.4333, -81.3667 Sher Chakla, India, 25.3848, 86.6952 Plover, United States, 44.4615, -89.5382 Seiada, Tunisia, 35.6700, 10.9000 Knottingley, United Kingdom, 53.7050, -1.2490 Ipecaeta, Brazil, -12.3000, -39.3078 Bagre, Brazil, -1.9000, -50.1639 Lons, France, 43.3158, -0.4094 Tummalapenta, India, 15.0278, 78.0234 Kupino, Russia, 54.3667, 77.3000 Barssel, Germany, 53.1703, 7.7467 Kovilur, India, 12.5537, 78.9168 Crevalcore, Italy, 44.7167, 11.1500 Cerro Largo, Brazil, -28.1489, -54.7378 Ndele, Central African Republic, 8.4092, 20.6531 Kaleyanpur, India, 26.4297, 84.9327 Quata, Brazil, -22.2475, -50.6983 Jesenice, Slovenia, 46.4366, 14.0602 Worsborough, United Kingdom, 53.5200, -1.4700 Kartaly, Russia, 53.0500, 60.6500 Toyloq Qishlog'i, Uzbekistan, 39.6014, 67.0908 Sariq, Uzbekistan, 37.6722, 67.2375 Cornelius, United States, 45.5188, -123.0510 Marshall, United States, 39.1147, -93.2010 Mohda, India, 21.2751, 81.6676 Presidente Kennedy, Brazil, -21.0989, -41.0469 Tiruppanandal, India, 11.0919, 79.4538 Beverstedt, Germany, 53.4333, 8.8167 Pfarrkirchen, Germany, 48.4167, 12.9167 Arona, Italy, 45.7569, 8.5600 Cheval, United States, 28.1459, -82.5184 Hinabangan, Philippines, 11.7000, 125.0700 Mercerville, United States, 40.2360, -74.6917 Ingersoll, Canada, 43.0392, -80.8836 Auriflama, Brazil, -20.6858, -50.5550 Vempalle, India, 13.5382, 78.4604 Diai Koura, Mali, 15.1800, -9.9840 Kraainem, Belgium, 50.8667, 4.4667 Boa Nova, Brazil, -14.3628, -40.2078 Itapagipe, Brazil, -19.9089, -49.3808 Uarini, Brazil, -2.9900, -65.1083 Mangha, China, 23.3543, 98.9843 Mangpa, China, 23.4883, 98.9078 Dryden, United States, 42.4786, -76.3564 Rommerskirchen, Germany, 51.0347, 6.6914 Castel San Giorgio, Italy, 40.7833, 14.7000 Tarumizu, Japan, 31.4928, 130.7008 San Gabriel Chilac, Mexico, 18.3167, -97.3500 Royal Kunia, United States, 21.4053, -158.0318 East Islip, United States, 40.7257, -73.1869 South Park, United States, 40.2988, -79.9944 Chak Husaini, India, 25.5169, 86.5566 San Pedro Pochutla, Mexico, 15.7476, -96.4666 Radomyshl, Ukraine, 50.4947, 29.2333 Quatis, Brazil, -22.4069, -44.2578 Palmito, Colombia, 9.3333, -75.5500 Shorewood, United States, 43.0913, -87.8864 Marienheide, Germany, 51.0833, 7.5333 Karma, India, 23.6840, 85.5706 Motupe, Peru, -6.1519, -79.7142 St. James, United States, 40.8761, -73.1521 Maribondo, Brazil, -9.5769, -36.3050 L'Oulja, Morocco, 34.2894, -4.9481 Kannadiparamba, India, 11.9350, 75.4030 Copalchi, Costa Rica, 9.8473, -84.0834 Kaladgi, India, 16.2040, 75.5000 Madanpur, India, 23.0200, 88.4800 Slobozhanske, Ukraine, 49.5961, 36.5269 Sansare, Guatemala, 14.7500, -90.1167 Sale, Australia, -38.1000, 147.0667 Grafelfing, Germany, 48.1189, 11.4289 Novoulyanovsk, Russia, 54.1667, 48.3833 Bardstown, United States, 37.8175, -85.4550 Ikniwn, Morocco, 31.1736, -5.6733 Saint Ann's Bay, Jamaica, 18.4360, -77.2020 Muqui, Brazil, -20.9519, -41.3458 Yongcong, China, 26.0422, 109.1314 Altos del Rosario, Colombia, 8.8000, -74.1667 Bhimadolu, India, 16.8144, 81.2617 Spring Garden, United States, 39.9454, -76.7212 San Ferdinando di Puglia, Italy, 41.3000, 16.0667 Chiran, Japan, 31.3783, 130.4416 Rio Caribe, Venezuela, 10.7008, -63.1086 Mucambo, Brazil, -3.9089, -40.7469 Pote, Brazil, -17.8069, -41.7858 East Cleveland, United States, 41.5317, -81.5794 Nova Veneza, Brazil, -28.6369, -49.4978 Haselunne, Germany, 52.6667, 7.4667 Andresy, France, 48.9817, 2.0592 Ochakiv, Ukraine, 46.6186, 31.5392 Arcadia, United States, 43.0870, -77.0858 Flitwick, United Kingdom, 52.0038, -0.4966 Aldama, Mexico, 22.9194, -98.0736 Jindayris, Syria, 36.3950, 36.6889 Qantir, Egypt, 30.8032, 31.8379 Beaufort, United States, 32.4597, -80.7235 Namin, Iran, 38.4264, 48.4822 Fiesole, Italy, 43.8000, 11.3000 Isagarh, India, 24.8391, 77.8827 Xikou, Taiwan, 23.5947, 120.3948 Santa Coloma de Farnes, Spain, 41.8647, 2.6642 Chosei, Japan, 35.4167, 140.3500 El Crucero, Nicaragua, 11.9833, -86.3167 Brecksville, United States, 41.3079, -81.6192 Oak Park, United States, 34.1850, -118.7669 Pien, Brazil, -26.0978, -49.4289 Barahari, India, 25.7652, 87.0937 Lewisville, United States, 36.1030, -80.4166 Pfullendorf, Germany, 47.9242, 9.2567 Ajjampur, India, 13.7279, 76.0068 Bilaspur, India, 31.3300, 76.7500 Moissac, France, 44.1056, 1.0861 Sunset, United States, 25.7060, -80.3530 Mirabela, Brazil, -16.2628, -44.1639 Retirolandia, Brazil, -11.4950, -39.4258 Retirolandia, Brazil, -11.5667, -39.3167 Avalepalli, India, 12.7714, 77.8594 Bergen, Germany, 54.4167, 13.4333 Jurema, Brazil, -8.7178, -36.1358 Domkonda, India, 18.2561, 78.4377 Curiuva, Brazil, -24.0328, -50.4578 Genthin, Germany, 52.4000, 12.1667 Shodoshima, Japan, 34.4833, 134.2333 Eppstein, Germany, 50.1333, 8.4000 Umburanas, Brazil, -10.7328, -41.3258 Lanuza, Philippines, 9.2322, 126.0592 Marion, United States, 35.2035, -90.2059 Alexandria, Brazil, -6.4128, -38.0158 Fontenay-le-Fleury, France, 48.8144, 2.0494 Helensburgh, United Kingdom, 56.0166, -4.7333 Childwall, United Kingdom, 53.3950, -2.8810 Woudenberg, Netherlands, 52.0806, 5.4164 Carnot-Moon, United States, 40.5187, -80.2178 Beauharnois, Canada, 45.3200, -73.8700 El Kerma, Algeria, 35.6167, -0.5667 Kostolac, Serbia, 44.7167, 21.1667 Grantsville, United States, 40.6148, -112.4777 Frei Miguelinho, Brazil, -7.9408, -35.9106 Abadla, Algeria, 31.0167, -2.7333 Douar Tabouda, Morocco, 34.7167, -5.1333 Hammam el Rhezez, Tunisia, 36.8900, 11.1200 Moberly, United States, 39.4179, -92.4364 Manta, Benin, 10.3564, 1.1056 Vargem da Roca, Brazil, -11.6069, -40.1369 Kunjatturu, India, 12.7431, 74.8861 Dantewara, India, 18.9000, 81.3390 Uitgeest, Netherlands, 52.5333, 4.7167 Pitlam, India, 18.2227, 77.8238 Trzebnica, Poland, 51.3050, 17.0614 Jiquirica, Brazil, -13.2569, -39.5719 Neckargemund, Germany, 49.3939, 8.7975 Sampaloc, Philippines, 14.1625, 121.6378 Port Neches, United States, 29.9765, -93.9459 Balhapur, India, 25.3511, 86.2122 Rockland, Canada, 45.5459, -75.2836 Boninal, Brazil, -12.7019, -41.8278 Allestree, United Kingdom, 52.9519, -1.4856 Ottaikkalmantapam, India, 10.8827, 76.9943 Mahuwa Singhrai, India, 25.8168, 85.3853 Bamafele, Mali, 13.0956, -10.3967 Speedway, United States, 39.7937, -86.2481 Tauberbischofsheim, Germany, 49.6225, 9.6628 Saimbeyli, Turkey, 37.9833, 36.0833 Yesilli, Turkey, 37.3406, 40.8258 Syston, United Kingdom, 52.7000, -1.0800 Maglie, Italy, 40.1167, 18.3000 Babhanganwa, India, 26.1398, 86.8464 Ihtiman, Bulgaria, 42.4330, 23.8170 Iguatemi, Brazil, -23.6800, -54.5608 Seabrook, United States, 29.5751, -95.0235 Alfredo Chaves, Brazil, -20.6350, -40.7500 Santa Luzia do Itanhy, Brazil, -11.3508, -37.4478 Artena, Italy, 41.7333, 12.9167 Serra Branca, Brazil, -7.4828, -36.6650 Primeira Cruz, Brazil, -2.5100, -43.4378 Formello, Italy, 42.0833, 12.4000 Oroco, Brazil, -8.6200, -39.6019 Brejo do Cruz, Brazil, -6.3489, -37.4978 Kyzyl-Adyr, Kyrgyzstan, 42.6200, 71.5900 Castilla La Nueva, Colombia, 3.8333, -73.6833 Wiesmoor, Germany, 53.4160, 7.7337 Yamanobe, Japan, 38.2833, 140.2667 Norwalk, United States, 41.4895, -93.6913 Boa Esperanca, Brazil, -18.5400, -40.2958 Rozaje, Montenegro, 42.8400, 20.1600 Tejutla, El Salvador, 14.1667, -89.1000 Hockessin, United States, 39.7837, -75.6815 Elesbao Veloso, Brazil, -6.2019, -42.1400 Schmolln, Germany, 50.8950, 12.3564 Karpi, India, 25.1612, 84.7299 Masangshy, Kazakhstan, 42.9289, 75.3019 Miami Springs, United States, 25.8195, -80.2894 Combarbala, Chile, -31.1833, -71.0000 Salisbury, United States, 40.5768, -75.4535 San Javier, Argentina, -30.5833, -59.9500 Ait Lhaj All, Morocco, 33.7622, -5.3350 Marchtrenk, Austria, 48.1917, 14.1106 Qingxicun, China, 24.5918, 116.6217 Chengara, India, 10.1290, 76.3730 Tulle, France, 45.2678, 1.7706 Bezou, Morocco, 32.0833, -7.0500 Atner, India, 21.6238, 77.9152 Mohania, India, 25.1692, 83.6192 Amboasary-Gara, Madagascar, -18.4436, 48.2629 Dongshicuo, Taiwan, 23.7021, 120.2556 Vedi, Armenia, 39.9100, 44.7300 Vazquez, Cuba, 21.1403, -76.7297 Nighoj, India, 18.9597, 74.2769 Isilkul, Russia, 54.9500, 71.2500 Marhamat, Uzbekistan, 40.5000, 72.3333 Jannat Shahr, Iran, 28.6550, 54.6844 Rayapalle, India, 16.2828, 81.2504 Razole, India, 16.4743, 81.8402 Danielskuil, South Africa, -28.2000, 23.5833 Kidlington, United Kingdom, 51.8231, -1.2903 Sisai, India, 26.1899, 84.5643 Duvva, India, 16.7792, 81.6242 Guerrero Negro, Mexico, 27.9589, -114.0561 Canasgordas, Colombia, 6.7497, -76.0258 Okinoshima, Japan, 36.2000, 133.3167 South Charleston, United States, 38.3426, -81.7155 Saint-Jacques-de-la-Lande, France, 48.0656, -1.7186 Amingarh, India, 16.0572, 75.9489 Doume, Benin, 8.0167, 1.6333 Douar Souk L`qolla, Morocco, 35.0718, -5.5702 Tapilula, Mexico, 17.2500, -93.0167 Ixcatepec, Mexico, 21.2333, -98.0000 Itaguacu, Brazil, -19.8019, -40.8558 Raquira, Colombia, 5.5333, -73.6333 Leczyca, Poland, 52.0500, 19.2000 Warrensville Heights, United States, 41.4363, -81.5222 Martinsville, United States, 36.6826, -79.8636 Pirallahi, Azerbaijan, 40.4708, 50.3217 Camapua, Brazil, -19.5308, -54.0439 Oulad Tayeb, Morocco, 33.9598, -4.9954 Nybro, Sweden, 56.7500, 15.9000 Atome-Avegame, Benin, 7.2333, 1.6500 Suran, Iran, 27.2883, 61.9997 Pama, Burkina Faso, 11.2500, 0.7000 Fruita, United States, 39.1548, -108.7305 Villas, United States, 26.5504, -81.8678 West End, Bahamas, The, 26.6867, -78.9750 New Providence, United States, 40.6996, -74.4035 Echelon, United States, 39.8482, -74.9957 Wanze, Belgium, 50.5353, 5.2133 Gondalga, India, 17.8053, 79.8944 Dueville, Italy, 45.6333, 11.5500 Maktar, Tunisia, 35.8606, 9.2058 Piquete, Brazil, -22.6136, -45.1761 Usiacuri, Colombia, 10.7500, -74.9833 Cervignano del Friuli, Italy, 45.8231, 13.3350 Marghita, Romania, 47.3500, 22.3333 Patalia, India, 25.6600, 86.0066 Tokoroa, New Zealand, -38.2200, 175.8720 Montgomeryville, United States, 40.2502, -75.2405 Royal Wootton Bassett, United Kingdom, 51.5410, -1.9050 South Stormont, Canada, 45.0833, -74.9667 Kerepestarcsa, Hungary, 47.5478, 19.2633 Presidente Bernardes, Brazil, -22.0061, -51.5531 Serui, Indonesia, -1.8780, 136.2370 Gran, Norway, 60.3667, 10.5667 Samorin, Slovakia, 48.0267, 17.3117 Sogut, Turkey, 40.0186, 30.1814 Schermbeck, Germany, 51.6950, 6.8756 Latiano, Italy, 40.5739, 17.7145 Groveton, United States, 38.7605, -77.0980 San Benito, Bolivia, -17.5167, -65.9167 Dattapulia, India, 23.2400, 88.7058 Dhana, India, 23.7470, 78.8623 Becancour, Canada, 46.3333, -72.4333 Palestina, Colombia, 5.0833, -75.6667 Winsum, Netherlands, 53.3312, 6.5157 Ashiya, Japan, 33.8939, 130.6639 Nalatvad, India, 16.3400, 76.1400 Bandar-e `Asaluyeh, Iran, 27.4744, 52.6114 Nyzhnia Krynka, Ukraine, 48.1144, 38.1606 Lala, India, 24.5542, 92.6159 Hilsea, United Kingdom, 50.8300, -1.0700 Kurtkoti, India, 15.3681, 75.5239 Bni Quolla, Morocco, 34.7380, -5.5441 Llanes, Spain, 43.4214, -4.7564 Bishenpur, India, 24.6282, 93.7610 Chinique, Guatemala, 15.0411, -91.0269 Ugo, Japan, 39.1981, 140.4128 Oosterzele, Belgium, 50.9500, 3.8000 Niaogho, Burkina Faso, 11.7667, -0.7667 Rahui, India, 25.2728, 85.5555 Karnawad, India, 22.7361, 76.2439 Dinant, Belgium, 50.2600, 4.9101 Mascote, Brazil, -15.5628, -39.3028 Tamanique, El Salvador, 13.6000, -89.4167 Hola Prystan, Ukraine, 46.5167, 32.5167 New Carrollton, United States, 38.9656, -76.8775 Powell, United States, 36.0358, -84.0296 Alagoinha, Brazil, -8.4658, -36.7758 Castelfranco di Sotto, Italy, 43.7000, 10.7500 Rukhae, India, 25.3269, 85.3725 Vinings, United States, 33.8608, -84.4686 Kheri Naru, India, 29.6479, 76.9110 Eatontown, United States, 40.2913, -74.0558 Beur, India, 25.5690, 85.0944 Kharv-e Sofla, Iran, 36.1422, 59.0158 Amriswil, Switzerland, 47.5497, 9.3000 Thisted, Denmark, 56.9588, 8.6964 Croxley Green, United Kingdom, 51.6470, -0.4450 Janapadu, India, 16.4617, 79.8699 Wschowa, Poland, 51.8000, 16.3000 Shangping, China, 25.1800, 113.1172 `Alem T'ena, Ethiopia, 8.3000, 38.9500 Koubel-Koundia, Mali, 14.9853, -3.0311 Rheinfelden, Switzerland, 47.5539, 7.7958 Corabia, Romania, 43.7736, 24.5033 Avon, France, 48.4097, 2.7161 Mensora, Morocco, 34.8356, -4.9655 San Jorge, Guatemala, 14.9333, -89.6000 Darat `Izzah, Syria, 36.2825, 36.8522 Lappersdorf, Germany, 49.0525, 12.0903 Gines, Spain, 37.3875, -6.0781 Bad Salzdetfurth, Germany, 52.0653, 10.0092 Neustadt, Germany, 49.5967, 10.6089 Glen Carbon, United States, 38.7580, -89.9822 Tovuz, Azerbaijan, 40.9924, 45.6167 Borgaon, India, 16.4200, 74.5800 El Jicaro, Guatemala, 14.9131, -89.8953 Beeville, United States, 28.4053, -97.7490 Calolziocorte, Italy, 45.8000, 9.4333 Kafr Nabudah, Syria, 35.4317, 36.4935 King City, United States, 36.2164, -121.1330 Menaa, Algeria, 35.1667, 6.0000 Nynashamn, Sweden, 58.9044, 17.9464 Vineyard, United States, 40.3059, -111.7545 Sao Ludgero, Brazil, -28.3258, -49.1767 Mor, Hungary, 47.3717, 18.2086 University Heights, United States, 41.4948, -81.5350 Strabane, United Kingdom, 54.8300, -7.4700 Kodriva, India, 22.5342, 75.7725 Nova Varos, Serbia, 43.4667, 19.8203 Ban Bung Kha, Thailand, 16.1462, 104.6507 Avidha, India, 21.6651, 73.0366 Glowno, Poland, 51.9642, 19.7117 Harwich, United States, 41.6957, -70.0684 Bad Laasphe, Germany, 50.9303, 8.4167 Corozal, Belize, 18.4000, -88.4000 Calderara di Reno, Italy, 44.5639, 11.2719 Ban Mae Kaluang, Thailand, 19.0565, 99.9402 Storrs, United States, 41.8083, -72.2514 Perungala, India, 9.1764, 76.5278 Siriari, India, 25.6733, 73.8084 Muynoq, Uzbekistan, 43.7667, 59.0333 Hettstedt, Germany, 51.6333, 11.5000 Karuvellur, India, 12.1733, 75.2097 Hard, Austria, 47.4667, 9.6667 Bahcesaray, Turkey, 38.1286, 42.8075 Bunhe, Ukraine, 48.2206, 38.2739 Argentan, France, 48.7500, -0.0200 Wentorf bei Hamburg, Germany, 53.4931, 10.2533 Andasibe, Madagascar, -18.9252, 48.4187 Hazel Crest, United States, 41.5732, -87.6899 Itapetim, Brazil, -7.3778, -37.1900 Ganxi, China, 27.1274, 109.1755 Chima, Colombia, 9.1500, -75.6333 Kenadsa, Algeria, 31.5333, -2.4167 Ostwald, France, 48.5425, 7.7103 Novi Iskar, Bulgaria, 42.8226, 23.3538 Sikat, India, 25.5186, 87.4423 Courcouronnes, France, 48.6239, 2.4294 Nemocon, Colombia, 5.0500, -73.8833 Horndean, United Kingdom, 50.9136, -0.9961 Chandla, India, 25.0715, 80.1929 Khanapur, India, 19.0333, 78.6667 Stezzano, Italy, 45.6508, 9.6528 Baras, Philippines, 13.6700, 124.3700 Bayt Jala, West Bank, 31.7155, 35.1879 El Hachimia, Algeria, 36.2333, 3.8333 Marudur, India, 10.9160, 78.4509 Squinzano, Italy, 40.4333, 18.0500 Gudikallu, India, 15.7441, 77.4760 Kriva Palanka, North Macedonia, 42.2017, 22.3317 Lamont, United States, 35.2659, -118.9159 Vaghodia, India, 22.3000, 73.3800 Chalma, Mexico, 21.2167, -98.4000 Lake Los Angeles, United States, 34.6097, -117.8339 Sukhasan, India, 25.9644, 86.7732 Severn, Canada, 44.7500, -79.5167 Bedadka, India, 12.4500, 75.1500 Afzala, India, 25.9319, 86.2293 Fereydunshahr, Iran, 32.9419, 50.1203 Ilamatlan, Mexico, 20.7833, -98.4500 Strand, Norway, 59.0500, 5.9333 Al Ha'ir, Saudi Arabia, 25.7925, 45.3802 Itaete, Brazil, -12.9858, -40.9728 Madakkathara, India, 10.5500, 76.2583 Los Alamos, United States, 35.8927, -106.2862 Ataco, Colombia, 3.6000, -75.3833 Little Hulton, United Kingdom, 53.5300, -2.4180 Jamira, India, 25.5535, 84.7063 Udayagiri, India, 20.1242, 84.3687 Elanad, India, 10.6167, 76.3833 Kesariya, India, 26.3342, 84.8548 Yedapalli, India, 18.6789, 77.9505 Palakkuzhi, India, 9.8833, 76.6139 Dinklage, Germany, 52.6667, 8.1333 Weinsberg, Germany, 49.1518, 9.2857 Stroud, United Kingdom, 51.7440, -2.2150 Weddington, United States, 35.0228, -80.7383 Troy, United States, 38.9708, -90.9714 Chembrassheri, India, 11.1243, 76.2582 Dundigal, India, 17.5781, 78.4288 Asbury Lake, United States, 30.0472, -81.7853 Panjgirain Kalan, India, 30.6096, 74.9143 Auburn, United States, 41.3666, -85.0559 Irondale, United States, 33.5439, -86.6606 Nikolayevsk, Russia, 50.0333, 45.4500 Harrison, United States, 39.2584, -84.7868 Sarria, Spain, 42.7833, -7.4167 Nagnur, India, 16.1400, 74.8100 Mazinde, Tanzania, -4.8073, 38.2118 Nallajerla, India, 16.9500, 81.4000 Tonya, Turkey, 40.8856, 39.2922 Manati, Colombia, 10.4450, -74.9597 Gullapuram, India, 10.0657, 77.6446 Ascension, Mexico, 31.0928, -107.9964 Endicott, United States, 42.0980, -76.0639 Gex, France, 46.3333, 6.0578 Villanchirai, India, 9.7198, 76.6517 San Juan de Limay, Nicaragua, 13.1667, -86.6167 Beloozerskiy, Russia, 55.4589, 38.4411 Bula Atumba, Angola, -8.6753, 14.7949 Trophy Club, United States, 33.0040, -97.1899 Barro Alto, Brazil, -11.7608, -41.9119 Valdemorillo, Spain, 40.5017, -4.0667 Mambore, Brazil, -24.3189, -52.5300 Great Driffield, United Kingdom, 54.0050, -0.4380 Hevie, Benin, 6.4167, 2.2500 Bou Sfer, Algeria, 35.7108, -0.8106 Beesel, Netherlands, 51.2669, 6.0392 Dok Kham Tai, Thailand, 19.1624, 99.9934 Bhakua, India, 26.5167, 86.1974 Kulharia, India, 25.3382, 86.7612 Taneichi, Japan, 40.4167, 141.7167 Palmetto, United States, 27.5251, -82.5749 Genas, France, 45.7322, 5.0028 Sebekoro, Mali, 13.4669, -7.7881 Zabreh, Czechia, 49.8825, 16.8722 Kilgore, United States, 32.3980, -94.8602 Sao Simao, Brazil, -21.4789, -47.5508 Kadattur, India, 12.0861, 78.2926 Avenal, United States, 36.0311, -120.1162 Woodinville, United States, 47.7570, -122.1477 San Juan de Betulia, Colombia, 9.2756, -75.2456 Plouzane, France, 48.3831, -4.6189 Dakit, Philippines, 10.0600, 125.1606 Pefka, Greece, 40.6500, 22.9833 Orkney, South Africa, -26.9789, 26.6692 Uibai, Brazil, -11.3369, -42.1328 Amilly, France, 47.9742, 2.7708 Ouargaye, Burkina Faso, 11.5000, 0.0500 Gien, France, 47.6897, 2.6300 Plougastel-Daoulas, France, 48.3733, -4.3694 Sulingen, Germany, 52.6667, 8.8000 Mallet, Brazil, -25.8778, -50.8208 Tucapel, Chile, -37.2833, -71.9500 San Jacinto del Cauca, Colombia, 8.2500, -74.7167 Chinna Mushidivada, India, 17.8057, 83.2033 Monteroni di Lecce, Italy, 40.3333, 18.1000 Tounfit, Morocco, 32.4667, -5.2333 Golyshmanovo, Russia, 56.3819, 68.3715 Jucuaran, El Salvador, 13.2544, -88.2489 Adis `Alem, Ethiopia, 9.0333, 38.4000 Versoix, Switzerland, 46.2833, 6.1667 Germasogeia, Cyprus, 34.7181, 33.0856 Hlucin, Czechia, 49.8967, 18.1931 Veglie, Italy, 40.3333, 17.9667 Daharia, India, 26.1807, 87.0043 Svetogorsk, Russia, 61.1167, 28.8500 Lexington Park, United States, 38.2528, -76.4424 Anzin, France, 50.3722, 3.5050 Ghordaur, India, 25.7089, 86.6120 Andrews, United States, 32.3207, -102.5520 Canals, Spain, 38.9611, -0.5850 Godella, Spain, 39.5200, -0.4114 Chaddesden, United Kingdom, 52.9301, -1.4383 Kotgir, India, 18.5722, 77.8243 Sultanpur Mor, Pakistan, 32.1883, 73.0286 Corsham, United Kingdom, 51.4340, -2.1850 Zitiste, Serbia, 45.4833, 20.5500 Wolfhagen, Germany, 51.3167, 9.1667 Boudenib, Morocco, 31.9497, -3.6078 San Rafael, Honduras, 14.7280, -88.4184 Talegaon Dhamdhere, India, 18.6678, 74.1536 Srebrenica, Bosnia and Herzegovina, 44.1000, 19.3000 Cramond, United Kingdom, 55.9797, -3.3007 Basaon, India, 26.2082, 84.6174 Oulad Ouchchih, Morocco, 35.0939, -5.9454 Hopewell, United States, 40.5906, -80.2731 Sitio do Mato, Brazil, -13.0850, -43.4650 Sunjiayan, China, 27.8528, 108.1500 Vellarivalli, India, 11.6003, 77.7927 Benaulim, India, 15.2700, 73.9346 Tuchola, Poland, 53.6000, 17.8500 Canton, United States, 40.5632, -90.0409 Richterswil, Switzerland, 47.2081, 8.7058 Pariharpur, India, 26.4026, 86.1256 Melenki, Russia, 55.3333, 41.6500 Dyykan-Kyshtak, Kyrgyzstan, 40.5160, 72.7869 Zawodzie, Poland, 50.2585, 19.0449 Lincoln, United States, 40.1508, -89.3720 Santa Barbara, Chile, -37.6706, -72.0214 Chahbounia, Algeria, 35.5500, 2.6000 San Juan, Honduras, 14.4067, -88.4234 Vieste, Italy, 41.8833, 16.1667 Rogers, United States, 45.1865, -93.5783 Villa Union, Mexico, 23.1883, -106.2158 Gaundra, India, 26.3683, 85.0036 Inawashiro, Japan, 37.5744, 140.1215 Wawizaght, Morocco, 32.1586, -6.3550 Kalardasht, Iran, 36.5056, 51.1589 Ban Don Thong, Thailand, 16.9040, 100.3563 Kaiwen, China, 27.1548, 99.8371 Dalkeith, United Kingdom, 55.8958, -3.0583 San Juan La Laguna, Guatemala, 14.7000, -91.2833 Amaravati, India, 16.5730, 80.3580 Mosgiel, New Zealand, -45.8750, 170.3480 Kaabong, Uganda, 3.5200, 34.1200 Brock Hall, United States, 38.8604, -76.7459 Ermoupoli, Greece, 37.4333, 24.9167 Arklow, Ireland, 52.7941, -6.1649 Uppidamangalam, India, 10.9034, 78.1575 Panapakkam, India, 12.9210, 79.5663 Velanganni, India, 10.6814, 79.8508 Outreau, France, 50.7044, 1.5947 Testour, Tunisia, 36.5500, 9.4500 Joppatowne, United States, 39.4181, -76.3516 Sarioglan, Turkey, 39.0769, 35.9667 Lacombe, Canada, 52.4683, -113.7369 Balsa Nova, Brazil, -25.5839, -49.6358 Weilburg, Germany, 50.4833, 8.2500 Goudomp, Senegal, 12.5778, -15.8722 Jupiter Farms, United States, 26.9222, -80.2189 Amblecote, United Kingdom, 52.4600, -2.1600 Kokri, Mali, 13.9606, -5.5153 Drobak, Norway, 59.6667, 10.6333 Vikravandi, India, 12.0369, 79.5460 Arruda dos Vinhos, Portugal, 38.9833, -9.0667 Leninsk, Russia, 48.7000, 45.2167 Alsager, United Kingdom, 53.0960, -2.3050 Abhwar, India, 26.1740, 86.6324 Ubstadt-Weiher, Germany, 49.1656, 8.6250 Gangelt, Germany, 50.9831, 6.0000 Salisbury, United States, 40.7454, -73.5604 Englewood, United States, 39.8643, -84.3070 Schuttorf, Germany, 52.3167, 7.2167 Telmar, India, 25.4237, 85.4358 Besarh, India, 25.9537, 87.0491 Bouzina, Algeria, 35.2833, 6.1167 Aconibe, Equatorial Guinea, 1.3000, 10.9333 Sanankoro Djitoumou, Mali, 12.0547, -7.7072 Velen, Germany, 51.8939, 6.9897 San Jacinto, Guatemala, 14.6667, -89.5000 Faberg, Norway, 61.1667, 10.4000 Urziceni, Romania, 44.7181, 26.6453 Amondara, Tajikistan, 39.5178, 67.8131 Chalfont Saint Peter, United Kingdom, 51.6070, -0.5560 Chimalapadu, India, 16.8902, 80.6505 Luis Antonio, Brazil, -21.5550, -47.7044 Ergolding, Germany, 48.5833, 12.1667 Suluktu, Kyrgyzstan, 39.9365, 69.5678 Goldap, Poland, 54.3161, 22.3094 Moody, United States, 33.5986, -86.4963 Varzea Nova, Brazil, -11.2589, -40.9419 San Jose de Maipo, Chile, -33.6400, -70.3531 Paruchuru, India, 15.9670, 80.2750 Ribeira Brava, Portugal, 32.6722, -17.0639 Sainte-Sophie, Canada, 45.8200, -73.9000 Blue Ash, United States, 39.2480, -84.3827 Pottsville, United States, 40.6798, -76.2091 Wake, Japan, 34.8028, 134.1575 Aghbala, Morocco, 32.4833, -5.6333 Sault Ste. Marie, United States, 46.4817, -84.3723 Amity, United States, 40.2905, -75.7477 Boechout, Belgium, 51.1594, 4.4923 Chino Valley, United States, 34.7594, -112.4120 Kawatana, Japan, 33.0728, 129.8614 Margraten, Netherlands, 50.8225, 5.8203 Feldbach, Austria, 46.9500, 15.8833 Saint Budeaux, United Kingdom, 50.4033, -4.1856 Grez-Doiceau, Belgium, 50.7333, 4.7000 Bagli, India, 22.6412, 76.3488 Zollikon, Switzerland, 47.3422, 8.5783 Calle Larga, Chile, -32.8831, -70.6486 Douar Oulad Nader, Morocco, 32.3278, -6.5006 Barka Parbatta, India, 25.3396, 87.0576 Hatoyama, Japan, 35.9814, 139.3341 El Almendro, Nicaragua, 11.6833, -84.7000 Bischofsheim, Germany, 49.9833, 8.3500 Arzachena, Italy, 41.0801, 9.3880 Washington, United States, 40.1741, -80.2465 Shawangunk, United States, 41.6335, -74.2654 Charlton, United States, 42.1351, -71.9680 Yengema, Sierra Leone, 8.7144, -11.1706 Zehak, Iran, 30.8933, 61.6789 Lake Forest Park, United States, 47.7574, -122.2864 Hantsavichy, Belarus, 52.7500, 26.4333 Franconia, United States, 40.3055, -75.3590 Mangalapur, India, 13.6245, 79.5803 Slupca, Poland, 52.3000, 17.8667 Pell City, United States, 33.5610, -86.2669 Western Springs, United States, 41.8023, -87.9006 Atlantic Beach, United States, 30.3375, -81.4127 Egg Buckland, United Kingdom, 50.4006, -4.1136 Makwassie, South Africa, -27.3167, 25.9833 Tiorpara, India, 22.2380, 88.5614 Mucur, Turkey, 39.0636, 34.3783 Port-Alfred, Canada, 48.3333, -70.8833 Bijai, India, 25.4711, 87.0874 Udachnyy, Russia, 66.4000, 112.3167 Oxford, United States, 42.1286, -71.8665 Sabana Iglesia, Dominican Republic, 19.3300, -70.7500 Henderson, United States, 32.1576, -94.7960 Saarwellingen, Germany, 49.3500, 6.8333 Kotor, Montenegro, 42.4300, 18.7700 Cadereyta, Mexico, 20.6910, -99.8190 Clinton, United States, 40.6315, -74.8553 Peabiru, Brazil, -23.9128, -52.3428 Nattappettai, India, 12.8187, 79.7493 Sigli, India, 15.0631, 75.4667 Shetpe, Kazakhstan, 44.1667, 52.1167 Zbarazh, Ukraine, 49.6667, 25.7778 Conway, United States, 28.4968, -81.3316 Vemulapudi, India, 17.6087, 82.6138 El Carmen, El Salvador, 13.7167, -88.9000 Harrison, United States, 44.1935, -88.2941 Payyanadam, India, 11.0108, 76.4457 Nesconset, United States, 40.8467, -73.1522 Czluchow, Poland, 53.6500, 17.3667 Bedburg, Germany, 51.7667, 6.1833 Buli, Philippines, 14.4430, 121.0510 Steamboat Springs, United States, 40.4777, -106.8243 Pazhanji, India, 10.6885, 76.0505 Karapurcek, Turkey, 40.6425, 30.5386 Mangalapuram, India, 11.5667, 78.3788 Rezzato, Italy, 45.5150, 10.3175 Bonita, United States, 32.6651, -117.0296 Serrolandia, Brazil, -11.4158, -40.3019 Yantzaza, Ecuador, -3.8500, -78.7500 Marungur, India, 8.1721, 77.5037 Rajpur, India, 25.0768, 84.2055 Alzano Lombardo, Italy, 45.7317, 9.7283 Kumlu, Turkey, 36.3728, 36.4528 Kingston, United States, 41.2652, -75.8876 Chandi, India, 22.3503, 88.2828 Sant'Angelo Lodigiano, Italy, 45.2389, 9.4097 Cusset, France, 46.1353, 3.4572 Hillcrest, South Africa, -29.7800, 30.7628 Itapui, Brazil, -22.2333, -48.7192 Puerto Morazan, Nicaragua, 12.8500, -87.1833 Val-des-Monts, Canada, 45.6500, -75.6667 Franklin Park, United States, 40.4439, -74.5431 North Fair Oaks, United States, 37.4754, -122.2034 Torshavn, Faroe Islands, 62.0000, -6.7833 Amarpura, India, 26.3667, 73.9833 Santa Maria a Monte, Italy, 43.7000, 10.6833 Dambal, India, 15.2960, 75.7737 Ashton, South Africa, -33.8347, 20.0547 Portland, United States, 36.5921, -86.5239 Tiruvarpu, India, 9.5811, 76.4749 Pataili, India, 25.7872, 85.8316 Kodinsk, Russia, 58.6833, 99.1833 Okkerneutboom, South Africa, -24.5950, 31.1390 Bexley, United States, 39.9650, -82.9343 Hosbach, Germany, 50.0000, 9.2000 Bacup, United Kingdom, 53.7040, -2.1990 Dohta, India, 26.1071, 87.9091 Coatesville, United States, 39.9849, -75.8200 Beamsville, Canada, 43.1710, -79.4767 Hanimciftligi, Turkey, 38.3833, 38.3333 South Daytona, United States, 29.1657, -81.0055 Saint-Amable, Canada, 45.6500, -73.3000 Bachhauta, India, 25.5242, 86.4606 Kiiminki, Finland, 65.1333, 25.7750 Bonneville, France, 46.0797, 6.4014 Carluke, United Kingdom, 55.7340, -3.8340 Manerbio, Italy, 45.3667, 10.1333 Kuurne, Belgium, 50.8500, 3.2833 Dumaria, India, 26.7652, 84.3964 Faradonbeh, Iran, 32.0064, 51.2175 Santa Marcela, Philippines, 18.2872, 121.4375 Morag, Poland, 53.9167, 19.9333 Wabrzezno, Poland, 53.2833, 18.9500 Petushki, Russia, 55.9333, 39.4667 Busra al Harir, Syria, 32.8402, 36.3418 Duzkoy, Turkey, 40.8742, 39.4256 Ounagha, Morocco, 31.5333, -9.5500 Chifubu, Zambia, -12.9333, 28.6167 Sidi Abd el Moumene, Algeria, 35.6528, 0.0139 Narayangarh, India, 24.2708, 75.0501 Butler, United States, 40.8616, -79.8962 Ban Na Chom Thian, Thailand, 12.8356, 100.9264 Ambodilazana, Madagascar, -18.1000, 49.1667 Grimstad, Norway, 58.3405, 8.5934 Camana, Peru, -16.6167, -72.7167 Trenton, United States, 39.4792, -84.4620 Kagvad, India, 16.4800, 74.7800 Rosas, Colombia, 2.2667, -76.7500 Bouskene, Algeria, 36.1833, 3.2333 Sweden, United States, 43.1791, -77.9406 Stocksbridge, United Kingdom, 53.4780, -1.5880 Makarska, Croatia, 43.2931, 17.0200 Kadena, Japan, 26.3617, 127.7553 Saint-Jean-de-Vedas, France, 43.5772, 3.8247 Shiremoor, United Kingdom, 55.0366, -1.5048 Kusa, Russia, 55.3500, 59.4500 Nishon Tumani, Uzbekistan, 38.6558, 65.6994 Charxin, Uzbekistan, 39.6967, 66.7686 Ostringen, Germany, 49.2194, 8.7108 Ras El Oued, Morocco, 34.3390, -4.5558 Olfen, Germany, 51.7167, 7.3833 Goh, India, 24.9845, 84.6498 Callaway, United States, 30.1349, -85.5568 Albatera, Spain, 38.1786, -0.8681 Ponte San Giovanni, Italy, 43.0897, 12.4456 Reeuwijk, Netherlands, 52.0500, 4.7300 Penrith, Australia, -33.7511, 150.6942 Sirhali Kalan, India, 31.2783, 74.9414 Ratnapuram, India, 18.6283, 79.5517 Undrajavaram, India, 16.7866, 81.6997 Pushing, Tajikistan, 38.1833, 69.4333 Mani, Colombia, 4.8167, -72.2833 Debno, Poland, 52.7333, 14.7000 Arendonk, Belgium, 51.3226, 5.0845 Soyaniquilpan, Mexico, 19.9892, -99.4361 Badhoevedorp, Netherlands, 52.3333, 4.7833 San Rafael Oriente, El Salvador, 13.3833, -88.3500 Oued Tlelat, Algeria, 35.5500, -0.4500 Padaivedu, India, 11.4401, 77.8089 Trubchevsk, Russia, 52.5667, 33.7667 El Tabo, Chile, -33.4586, -71.6619 Catemu, Chile, -32.8828, -70.6483 Korenovsk, Russia, 45.4686, 39.4519 Woodland Park, United States, 40.8904, -74.1946 Aginiparru, India, 16.6817, 80.7839 Marietta, United States, 39.4241, -81.4465 Annamalainagar, India, 11.4000, 79.7333 Kuhbil, Iraq, 36.5169, 41.9605 Bayt Sahur, West Bank, 31.7009, 35.2263 Kings Park West, United States, 38.8151, -77.2960 Inaja, Brazil, -8.9030, -37.8270 Panchgani, India, 17.9250, 73.8000 Loveland, United States, 39.2677, -84.2733 Guillena, Spain, 37.5333, -6.0500 Fatehpur, India, 25.5089, 85.1939 Prattipadu, India, 16.1878, 80.3392 Vetralla, Italy, 42.3106, 12.0792 Standish, United Kingdom, 53.5860, -2.6640 Gura Humorului, Romania, 47.5539, 25.8892 Beverungen, Germany, 51.6628, 9.3725 Ayancik, Turkey, 41.9500, 34.5833 Ettapur, India, 11.6625, 78.4764 Ikizce, Turkey, 41.0531, 37.0769 New Hanover, United States, 40.3145, -75.5566 Graulhet, France, 43.7617, 1.9892 Tummanatti, India, 11.4284, 76.7585 Montepulciano, Italy, 43.1000, 11.7833 Hawaiian Paradise Park, United States, 19.5828, -154.9695 Sterling, United States, 40.6205, -103.1925 West Boldon, United Kingdom, 54.9450, -1.4410 Raghunathpur, India, 25.5615, 84.3050 Urtaowul, Uzbekistan, 41.1908, 69.1494 Portage La Prairie, Canada, 49.9728, -98.2919 Joaquim Nabuco, Brazil, -8.6239, -35.5328 Thame, United Kingdom, 51.7500, -0.9700 Buttar, India, 31.0038, 75.3973 Clayton, United States, 39.8689, -84.3292 Modakkurichchi, India, 11.2329, 77.7794 Znin, Poland, 52.8500, 17.7000 Zehdenick, Germany, 52.9833, 13.3333 Tega Cay, United States, 35.0390, -81.0111 Bugugoucun, China, 41.6904, 117.4483 Cremlingen, Germany, 52.2489, 10.6542 Lourdes, France, 43.0942, -0.0469 Ban Chomphu Nuea, Thailand, 16.6833, 100.6667 Kingersheim, France, 47.7922, 7.3386 Skoghall, Sweden, 59.3333, 13.4333 Sternberk, Czechia, 49.7306, 17.2989 Tanagura, Japan, 37.0299, 140.3796 Tarhunah, Libya, 32.4339, 13.6344 Rabor, Iran, 29.2903, 56.9133 Los Chiles, Costa Rica, 10.9639, -84.5990 Torredonjimeno, Spain, 37.7667, -3.9500 Betanzos, Spain, 43.2792, -8.2106 Tergnier, France, 49.6564, 3.2883 Peringom, India, 12.2236, 75.3139 Bas Goynuk, Azerbaijan, 41.3258, 47.1136 Linlithgow, United Kingdom, 55.9791, -3.6105 Torquay, Australia, -38.3333, 144.3167 Liangwancun, China, 28.5034, 104.2611 Karivalamvandanallur, India, 9.2715, 77.5416 Doddipatla, India, 16.5167, 81.8436 Aldeia de Paio Pires, Portugal, 38.6272, -9.0761 Knutsford, United Kingdom, 53.3025, -2.3708 Ourtzagh, Morocco, 34.5500, -4.9333 El Tablon, Colombia, 1.4269, -77.0969 Inderbor, Kazakhstan, 48.5500, 51.7833 Solonytsivka, Ukraine, 49.9869, 36.0619 Sheerness, United Kingdom, 51.4410, 0.7600 Cedar Grove, United States, 40.8565, -74.2288 Peshkopi, Albania, 41.6833, 20.4281 Ares, Brazil, -6.1939, -35.1600 Medway, United States, 42.1535, -71.4291 Montespertoli, Italy, 43.6500, 11.0833 Huntington, United States, 38.7916, -77.0740 Muragacha, India, 22.6960, 88.4200 La Victoria, Colombia, 4.5214, -76.0364 Fehmarnsund, Germany, 54.4454, 11.1702 Dingle, United Kingdom, 53.3774, -2.9613 Sumbha, India, 25.5789, 86.3608 Paraiso do Norte, Brazil, -23.2808, -52.6019 Usumatlan, Guatemala, 14.9489, -89.7767 Kuttyattur, India, 11.9754, 75.4927 Ad Duraykish, Syria, 34.8951, 36.1430 Puerto San Martin, Argentina, -32.7167, -60.7333 Pe de Serra, Brazil, -11.8339, -39.6128 Chhapra, India, 26.4005, 85.3721 Ortaklar, Turkey, 37.8833, 27.5000 Zhashkiv, Ukraine, 49.2358, 30.1111 Connersville, United States, 39.6582, -85.1410 Manivilundan, India, 11.6004, 78.7169 Lubsko, Poland, 51.7833, 14.9667 Mouvaux, France, 50.7039, 3.1414 Dharmaram, India, 18.3038, 79.4892 Fernandina Beach, United States, 30.6571, -81.4511 North Greenbush, United States, 42.6706, -73.6633 Daulatnagar, India, 25.3216, 87.8443 Ain Youcef, Algeria, 35.0500, -1.3667 Nanjai Kilabadi, India, 11.2658, 77.7700 Dharphari, India, 26.1501, 84.9564 Casandrino, Italy, 40.9333, 14.2500 Schleiden, Germany, 50.5331, 6.4667 Casatenovo, Italy, 45.6983, 9.3117 Star, United States, 43.7026, -116.4914 Damaishan, China, 24.5006, 112.2754 Perladka, India, 12.6426, 75.1049 Ivai, Brazil, -25.0108, -50.8589 Santa Juana, Chile, -37.1660, -72.9330 La Grange Park, United States, 41.8308, -87.8723 Terebovlya, Ukraine, 49.3000, 25.6903 Accokeek, United States, 38.6745, -77.0023 Sebt Labrikiyne, Morocco, 32.2944, -8.0722 Roding, Germany, 49.2000, 12.5167 Sabang, India, 22.1830, 87.5990 Adygeysk, Russia, 44.8832, 39.1902 Afir, Algeria, 36.7676, 3.7029 Mahalpur, India, 31.3618, 76.0377 Gopalasamudram, India, 8.6747, 77.6379 Waconia, United States, 44.8422, -93.7896 California, United States, 38.2969, -76.4949 Newton, United States, 35.6630, -81.2335 Domzale, Slovenia, 46.1394, 14.5950 Mesudiye, Turkey, 40.4625, 37.7725 Nioaque, Brazil, -21.1350, -55.8300 Basseterre, Saint Kitts and Nevis, 17.3000, -62.7333 Derecik, Turkey, 37.0830, 44.3110 Jula Buzarg, India, 19.4639, 76.9861 Yakage, Japan, 34.6275, 133.5872 Tafrant, Morocco, 34.6250, -5.1242 Harrison, United States, 36.2438, -93.1198 Muriedas, Spain, 43.4303, -3.8603 Pacora, Colombia, 5.5258, -75.4589 Arsali, India, 24.3754, 83.5903 Mathurapur, India, 24.9073, 85.9836 Wickede, Germany, 51.4964, 7.8658 El Esnam, Algeria, 36.3211, 4.0139 Bichkunda, India, 18.4000, 77.7167 Shin'onsen, Japan, 35.6167, 134.4500 Blegny, Belgium, 50.6667, 5.7333 Lariano, Italy, 41.7333, 12.8333 Fatima, Portugal, 39.6256, -8.6658 Aguilar, Spain, 37.5167, -4.6500 Yamato, Japan, 32.6858, 130.8358 Kathevaram, India, 16.2610, 80.6360 Khiria, India, 25.6047, 87.4578 San Martino di Lupari, Italy, 45.6557, 11.8594 Villa Gonzalez Ortega, Mexico, 22.5136, -101.9189 Walsall Wood, United Kingdom, 52.6277, -1.9301 Ambohidronono, Madagascar, -18.7611, 48.0264 El Sobrante, United States, 33.8724, -117.4624 Bondada, India, 16.5295, 81.4549 Chulumani, Bolivia, -16.6833, -67.8667 Brieselang, Germany, 52.5833, 13.0000 Beyla, Guinea, 8.6833, -8.6333 Sankt Georgen im Schwarzwald, Germany, 48.1247, 8.3308 Vaerlose, Denmark, 55.7825, 12.3686 Novellara, Italy, 44.8500, 10.7333 Noceto, Italy, 44.8098, 10.1773 Douar Sidi Laaroussi, Morocco, 31.8450, -9.1586 Benairia, Algeria, 36.3500, 1.3833 Zima, Russia, 53.9167, 102.0500 Xaafuun, Somalia, 10.4167, 51.2667 Rosbach vor der Hohe, Germany, 50.2986, 8.7006 Tonakkal, India, 8.6312, 76.9555 Guttal, India, 14.8333, 75.6333 Ain Lechiakh, Algeria, 36.1569, 2.4042 Tempio Pausania, Italy, 40.9015, 9.1044 Southwick, United Kingdom, 50.8360, -0.2390 Jaidte Lbatma, Morocco, 31.6806, -7.7281 Bombarral, Portugal, 39.2672, -9.1581 Chenggong, Taiwan, 23.1167, 121.3500 Bundala, India, 31.5333, 74.9833 Gmunden, Austria, 47.9181, 13.7994 Mutterstadt, Germany, 49.4333, 8.3500 Hullhorst, Germany, 52.2833, 8.6667 Hissaramuruvani, India, 15.7710, 77.4194 Orangeburg, United States, 33.4928, -80.8671 Liedekerke, Belgium, 50.8667, 4.0833 Jobat, India, 22.4160, 74.5683 Vila Pouca de Aguiar, Portugal, 41.4833, -7.6333 Green Valley, United States, 39.3414, -77.2400 Santa Ana, Costa Rica, 9.9320, -84.1760 Palsana, India, 27.5121, 75.3260 Ban Khlong, Thailand, 16.8353, 100.2320 Rio de Contas, Brazil, -13.5789, -41.8108 Villacidro, Italy, 39.4578, 8.7424 Castelnuovo di Verona, Italy, 45.4333, 10.7667 Agua de Dios, Colombia, 4.3781, -74.6739 Marathalli, India, 12.1500, 77.1000 Treuchtlingen, Germany, 48.9553, 10.9094 San Clemente, Philippines, 15.7119, 120.3603 Oncativo, Argentina, -31.9167, -63.6667 Parvomay, Bulgaria, 42.1000, 25.2167 Fraserburgh, United Kingdom, 57.6930, -2.0050 Herbrechtingen, Germany, 48.6253, 10.1739 Olympia Heights, United States, 25.7240, -80.3388 Lincolnwood, United States, 42.0054, -87.7330 Sovetskoe, Kyrgyzstan, 41.0518, 72.7397 Auria, India, 24.8563, 87.0112 Hashikami, Japan, 40.4525, 141.6211 Cariamanga, Ecuador, -4.3200, -79.5600 Santa Teresa, Brazil, -25.0167, -53.5667 Bagado, Colombia, 5.4167, -76.4167 Manikpur, India, 25.1339, 86.6777 Kiskoros, Hungary, 46.6203, 19.2836 Melilli, Italy, 37.1833, 15.1167 Penamaluru, India, 16.4681, 80.7194 Druskininkai, Lithuania, 54.0206, 23.9725 Bou Arada, Tunisia, 36.3500, 9.6167 River Ridge, United States, 29.9593, -90.2202 Qal`eh Ganj, Iran, 27.5250, 57.8800 Casale sul Sile, Italy, 45.5988, 12.3243 Khoyniki, Belarus, 51.8892, 29.9644 Ridgefield Park, United States, 40.8543, -74.0201 Enriquillo, Dominican Republic, 17.9000, -71.2333 Lezajsk, Poland, 50.2667, 22.4333 Hajan, India, 34.2989, 74.6168 Trebur, Germany, 49.9250, 8.4056 Samalsar, India, 30.6364, 74.9983 Santa Maria de Ipire, Venezuela, 8.8156, -65.3225 Arzgir, Russia, 45.3694, 44.2281 Monteux, France, 44.0361, 4.9970 Miahuatlan, Mexico, 18.2833, -97.2833 Vestby, Norway, 59.6051, 10.7524 Ban Chorakhe Samphan, Thailand, 14.3278, 99.8554 'Ain Mouilah, Algeria, 34.7500, 3.4833 Zabaykalsk, Russia, 49.6514, 117.3269 Oulad Chikh, Morocco, 32.8544, -7.5386 Villa Juarez, Mexico, 27.1278, -109.8426 Mulungu do Morro, Brazil, -11.9658, -41.6389 Villa Sandino, Nicaragua, 12.0500, -84.9833 Igrapiuna, Brazil, -13.8258, -39.1419 Mahao, China, 26.8675, 108.3267 Matsushima, Japan, 38.3802, 141.0673 Capaya, Venezuela, 10.4286, -66.2717 Dorado, Puerto Rico, 18.4657, -66.2726 Drochia, Moldova, 48.0333, 27.7500 Karabanovo, Russia, 56.3167, 38.7000 Celebration, United States, 28.3102, -81.5510 South Glengarry, Canada, 45.2000, -74.5833 Hulkoti, India, 15.4333, 75.5333 Barsbuttel, Germany, 53.5689, 10.1711 Santa Maria Jalapa del Marques, Mexico, 16.4401, -95.4434 Tinglayan, Philippines, 17.2650, 121.1489 Rio do Antonio, Brazil, -14.4108, -42.0758 Nako, Lesotho, -29.6481, 27.7336 Cypress Lake, United States, 26.5392, -81.8999 Gibraleon, Spain, 37.3753, -6.9694 Autun, France, 46.9517, 4.2994 Ban Nong Hoi, Thailand, 18.7500, 99.0167 Chanaral, Chile, -26.3444, -70.6219 Vigodarzere, Italy, 45.4814, 11.8738 Singuilucan, Mexico, 19.9675, -98.5178 Glucholazy, Poland, 50.3131, 17.3742 Alovera, Spain, 40.5967, -3.2481 Ketsch, Germany, 49.3658, 8.5336 Hamworthy, United Kingdom, 50.7207, -2.0109 Bajala, India, 12.8537, 74.8853 Crispiano, Italy, 40.6000, 17.2333 Webb City, United States, 37.1412, -94.4676 Sali, Algeria, 25.9606, -0.0275 Balsta, Sweden, 59.5833, 17.5000 Pacatuba, Brazil, -10.4533, -36.6514 Dardenne Prairie, United States, 38.7565, -90.7319 Superior, United States, 39.9340, -105.1588 Kaua Kol, India, 24.8447, 85.8867 Florham Park, United States, 40.7773, -74.3953 Glendale, United States, 43.1287, -87.9277 Sainte-Marie, Canada, 46.4500, -71.0333 Latisana, Italy, 45.7833, 13.0000 Novi Becej, Serbia, 45.6000, 20.1167 Kaharlyk, Ukraine, 49.8522, 30.8092 Shinile, Ethiopia, 9.6667, 41.8333 Amboise, France, 47.4042, 0.9800 Gothva, India, 23.4781, 72.5624 Mala Vyska, Ukraine, 48.6500, 31.6333 Bensekrane, Algeria, 35.0667, -1.2167 Whitby, United Kingdom, 54.4858, -0.6206 North Perth, Canada, 43.7300, -80.9500 Sarezzo, Italy, 45.6500, 10.2000 Qulan, Kazakhstan, 42.9100, 72.7150 Kofele, Ethiopia, 7.0000, 38.7500 Tetari, India, 25.3757, 87.0691 Berezne, Ukraine, 50.9967, 26.7394 Saktipur, India, 23.8640, 88.1987 Ayodhyapattanam, India, 11.6755, 78.2409 Ba Chuc, Vietnam, 10.5000, 104.9000 Puspokladany, Hungary, 47.3197, 21.1139 Berkeley Heights, United States, 40.6764, -74.4244 Cicuco, Colombia, 9.2667, -74.6500 Mount Vernon, United States, 38.7140, -77.1043 Las Vegas, United States, 35.6011, -105.2206 Sidmant al Jabal, Egypt, 29.0856, 30.9344 Barlinek, Poland, 53.0000, 15.2000 General Enrique Mosconi, Argentina, -22.6000, -63.8167 Nemours, France, 48.2674, 2.6970 San Vicente, Philippines, 17.5947, 120.3753 Alvorada D'Oeste, Brazil, -11.3417, -62.2861 Giporlos, Philippines, 11.1208, 125.4494 Soddy-Daisy, United States, 35.2571, -85.1739 Koregaon, India, 18.6456, 74.0592 Silago, Philippines, 10.5291, 125.1618 Maqsuda, India, 26.2410, 86.0585 Mahaboboka, Madagascar, -22.8982, 44.3430 Tubmanburg, Liberia, 6.8667, -10.8167 Altos, Paraguay, -25.2621, -57.2494 Iraci, Brazil, -8.8078, -35.9519 Wehr, Germany, 47.6297, 7.9044 Wasserburg am Inn, Germany, 48.0617, 12.2333 Betatao, Madagascar, -18.2026, 47.8886 Barhi, India, 24.3045, 85.4195 Toura, Benin, 11.2436, 2.3831 Brig-Glis, Switzerland, 46.3159, 7.9876 Quattro Castella, Italy, 44.6333, 10.4667 Miarinarivo, Madagascar, -18.9608, 46.9036 Lake Station, United States, 41.5729, -87.2599 Shitab Diara, India, 25.7563, 84.6133 Sargur, India, 11.9997, 76.3961 Bergen, Netherlands, 51.5992, 6.0336 Phalaborwa, South Africa, -23.9333, 31.1167 Kanabur, India, 13.3523, 75.4517 Kallur, India, 16.1405, 77.2081 Gland, Switzerland, 46.4200, 6.2700 Rajupalem, India, 15.1385, 79.9960 Sao Domingos, Brazil, -13.3983, -46.3183 Wantage, United Kingdom, 51.5890, -1.4270 Tirumakudal Narsipur, India, 12.2121, 76.9018 Mountain Park, United States, 33.8458, -84.1314 Pavona, Italy, 41.7167, 12.6167 Carpinteria, United States, 34.3962, -119.5118 Fyzabad, Trinidad and Tobago, 10.1833, -61.5500 Kozy, Poland, 49.8450, 19.1417 Miranda do Corvo, Portugal, 40.1000, -8.3333 Kavital, India, 16.1082, 76.7962 Medapadu, India, 17.0044, 82.1001 Mazatlan Villa de Flores, Mexico, 18.0167, -96.9167 Kirchheim bei Munchen, Germany, 48.1833, 11.7500 San Martin Zapotitlan, Guatemala, 14.6000, -91.6000 Dover, United States, 40.5304, -81.4806 Cambridge, United States, 38.5515, -76.0787 Hadamar, Germany, 50.4500, 8.0500 Kottaram, India, 8.1188, 77.5243 Wollaston, United Kingdom, 52.4619, -2.1663 Taishi, Japan, 34.5167, 135.6500 Mercedes Umana, El Salvador, 13.5667, -88.5000 Wolvega, Netherlands, 52.8755, 5.9969 Joure, Netherlands, 52.9650, 5.8000 North Palm Beach, United States, 26.8217, -80.0576 Itano, Japan, 34.1444, 134.4626 Hidrolandia, Brazil, -16.9619, -49.2289 Bocholt, Belgium, 51.1729, 5.5792 La Vega, Colombia, 4.9992, -74.3411 La Llagosta, Spain, 41.5156, 2.1928 Tonosho, Japan, 35.8333, 140.6667 Al Jumayliyah, Qatar, 25.6208, 51.0819 Kussnacht, Switzerland, 47.0828, 8.4408 San Antonio del Tequendama, Colombia, 4.6328, -74.3522 Gaurhati, India, 22.7687, 87.8084 Manching, Germany, 48.7186, 11.4972 Phra Samut Chedi, Thailand, 13.6022, 100.5721 Viera East, United States, 28.2613, -80.7149 Darlowo, Poland, 54.4208, 16.4097 Andarai, Brazil, -12.8069, -41.3308 Caldeirao Grande, Brazil, -11.0200, -40.3028 Horst, Netherlands, 51.4514, 6.0536 Gurlapeta, India, 18.1167, 83.4167 Takkolam, India, 13.0164, 79.7325 Simijaca, Colombia, 5.5019, -73.8519 Chandhaus, India, 25.2977, 84.8595 Udaipur Bithwar, India, 26.2872, 86.1578 Kamikawa, Japan, 36.2139, 139.1017 Peddavadlapudi, India, 16.4098, 80.6114 Ekwari, India, 25.2975, 84.4994 Huguan Nongchang, China, 21.2015, 110.2459 Nasiyanur, India, 11.3381, 77.6408 Hajduhadhaz, Hungary, 47.6833, 21.6667 Motobu, Japan, 26.6581, 127.8981 Gouande, Benin, 10.7828, 0.9186 Fannuj, Iran, 26.5753, 59.6403 Caykara, Turkey, 40.7475, 40.2419 Pendlebury, United Kingdom, 53.5075, -2.3154 Goodmayes, United Kingdom, 51.5631, 0.1133 Darmanesti, Romania, 46.3700, 26.4797 Grand Terrace, United States, 34.0312, -117.3132 Las Rosas, Argentina, -32.4833, -61.5833 Gorakhpur, India, 29.4467, 75.6724 Killai, India, 11.4493, 79.7668 Kalikiri, India, 13.6333, 78.8000 Pallappalaiyam, India, 10.9951, 77.0845 Cotegipe, Brazil, -12.0278, -44.2578 Jalhalli, India, 13.0333, 77.5500 Stoughton, United States, 42.9237, -89.2225 Juan de Herrera, Dominican Republic, 18.8667, -71.2333 Horodyshche, Ukraine, 49.2925, 31.4581 Wachtersbach, Germany, 50.2547, 9.2919 Adi Keyh, Eritrea, 14.8333, 39.3667 Dinbela, Mali, 11.7275, -6.3581 Ribeirao do Pinhal, Brazil, -23.4167, -50.3500 Paina, India, 25.5406, 86.9939 La Grande, United States, 45.3242, -118.0865 Balua, India, 26.3272, 87.6231 Mohgaon, India, 21.6394, 78.7364 Haskoy, Turkey, 38.6822, 41.6894 Kuruman, South Africa, -27.4500, 23.4333 Linnich, Germany, 50.9789, 6.2678 Kafr `Awan, Jordan, 32.4167, 35.6833 Woolwich, United States, 39.7400, -75.3170 Muri, Switzerland, 46.9319, 7.4872 Castlebar, Ireland, 53.8500, -9.3000 Lamacaes, Portugal, 41.5444, -8.3947 Claremont, United States, 43.3790, -72.3368 Rabot, Tajikistan, 38.6167, 68.1833 Alto Garcas, Brazil, -16.9439, -53.5278 Nidzica, Poland, 53.3583, 20.4250 Fords, United States, 40.5359, -74.3126 Dom Feliciano, Brazil, -30.7039, -52.1078 Vetlanda, Sweden, 57.4333, 15.0667 Gamboula, Central African Republic, 4.1333, 15.1500 Fonsorbes, France, 43.5369, 1.2319 Forlimpopoli, Italy, 44.1833, 12.1333 Palos Verdes Estates, United States, 33.7872, -118.3973 Monte Belo, Brazil, -21.3258, -46.3678 Kani-Bonzon, Mali, 14.1403, -3.6183 Alcacer do Sal, Portugal, 38.3725, -8.5133 Afanyangan, Togo, 6.4833, 1.6500 Danga, Mali, 16.4619, -3.1314 La Crucecita, Mexico, 15.7753, -96.1425 Linganore, United States, 39.4127, -77.3014 Turvo, Brazil, -28.9258, -49.6789 Pandireddigudem, India, 16.8000, 81.3167 Pulla, India, 16.8094, 81.3238 Anadyr, Russia, 64.7333, 177.5167 Manturovo, Russia, 58.3333, 44.7667 Fatehpur, India, 26.2813, 87.1084 Drongen, Belgium, 51.0503, 3.6628 Rasauli, India, 26.1270, 84.8378 Mettet, Belgium, 50.3211, 4.6590 Mango, United States, 27.9914, -82.3070 Charabidya, India, 22.3271, 88.7879 Dahu, Taiwan, 24.3978, 120.8486 Thompson, Canada, 55.7433, -97.8553 Turbihal, India, 15.7614, 76.5964 Palmital, Brazil, -24.8928, -52.2028 Olivar Bajo, Chile, -34.2289, -70.8799 Olivar, Chile, -34.2330, -70.8830 Hungen, Germany, 50.4667, 8.9000 D'Iberville, United States, 30.4709, -88.9011 Lowshan, Iran, 36.6278, 49.5114 Shahr-e Herat, Iran, 30.0547, 54.3717 Tezontepec, Mexico, 19.8833, -98.8167 Stjordalshalsen, Norway, 63.4667, 10.9333 Tomball, United States, 30.0951, -95.6194 Capo d'Orlando, Italy, 38.1500, 14.7333 Nova Gorica, Slovenia, 45.9558, 13.6433 Smyrna, United States, 39.2935, -75.6083 Ajas, India, 34.3316, 74.6801 Darasuram, India, 10.9515, 79.3562 Neykkarappatti, India, 11.6225, 78.1058 Blytheville, United States, 35.9321, -89.9051 Rossdorf, Germany, 49.8500, 8.7500 Catalpinar, Turkey, 40.8789, 37.4531 Missoes, Brazil, -14.8839, -44.0908 Holborn, United Kingdom, 51.5204, -0.1136 San Pietro Vernotico, Italy, 40.5116, 18.0143 Buharkent, Turkey, 37.9617, 28.7422 Dayalpur Sapha, India, 25.7122, 85.3188 Baraon, India, 25.4551, 84.2661 Mountain Home, United States, 36.3351, -92.3840 Shin, Syria, 34.7786, 36.4237 Caledon, South Africa, -34.2300, 19.4283 Bolongongo, Angola, -8.4667, 15.2500 Taichang, China, 35.4002, 107.7739 Bohmte, Germany, 52.3667, 8.3167 Scheessel, Germany, 53.1706, 9.4831 Neuri, India, 26.0076, 86.1841 Sharon, United States, 41.2340, -80.4998 Dinshaway, Egypt, 30.6000, 30.8167 Brackley, United Kingdom, 52.0320, -1.1470 Ubaporanga, Brazil, -19.6350, -42.1058 Fatehpur, India, 25.2463, 87.0380 Barah, India, 25.3885, 85.4912 Candiba, Brazil, -14.4108, -42.8669 Fuldatal, Germany, 51.3833, 9.5500 Leibnitz, Austria, 46.7831, 15.5450 Abrera, Spain, 41.5167, 1.9000 Gangoli, India, 13.6538, 74.6664 Peddakurapadu, India, 16.4833, 80.2667 Kalaiyamputtur, India, 10.4542, 77.4831 Athens, United States, 32.2041, -95.8321 Seclin, France, 50.5489, 3.0303 Belpukur, India, 21.9851, 88.2125 Ampanavoana, Madagascar, -15.6878, 50.3604 Thara, India, 26.7027, 78.2788 West Carrollton, United States, 39.6701, -84.2542 Chandauli, India, 25.8972, 85.7161 Zolote, Ukraine, 48.6928, 38.5194 Sidhwan, India, 31.2725, 75.3652 Kaji, China, 26.0285, 102.7888 Canet-en-Roussillon, France, 42.7067, 3.0078 Lawaan, Philippines, 11.1408, 125.3011 Suamico, United States, 44.6354, -88.0683 Wimauma, United States, 27.6964, -82.3034 Quzanli, Azerbaijan, 40.1591, 47.1653 Holly Hill, United States, 29.2442, -81.0465 Alaverdi, Armenia, 41.1333, 44.6500 Abaran, Spain, 38.2031, -1.4003 Galashiels, United Kingdom, 55.6194, -2.8033 Jalam, India, 20.8167, 76.5833 Ghoradongri, India, 22.1228, 78.0025 Moviya, India, 21.9153, 70.8465 Amauna, India, 25.0531, 84.5169 Dammennu, India, 16.8255, 81.7079 Kahhale, Lebanon, 33.8219, 35.5875 Ambararata, Madagascar, -15.0408, 48.5492 Marovandrika, Madagascar, -22.5191, 47.6665 Morafeno, Madagascar, -21.0974, 48.1779 Andreba, Madagascar, -14.5971, 48.1881 Marovato, Madagascar, -25.5290, 45.2769 Ampitasimo, Madagascar, -17.7833, 48.3833 Ambohimahavelona, Madagascar, -23.4456, 43.8966 Isaka-Ivondro, Madagascar, -24.7986, 46.8647 Ambodiampana, Madagascar, -14.5280, 49.8533 Andranomamy, Madagascar, -16.5357, 47.1242 Ihorombe, Madagascar, -23.0083, 47.5315 Mahatsinjo, Madagascar, -22.8125, 47.4513 Antongomena-Bevary, Madagascar, -15.9549, 45.9403 Antsirabe Afovoany, Madagascar, -15.9574, 48.9666 Sahavalanina-Antenina, Madagascar, -16.5705, 49.2493 Belemoka, Madagascar, -21.7823, 47.6060 Mavorano, Madagascar, -21.7912, 47.9456 Evato, Madagascar, -22.6000, 47.6833 Tranovaho, Madagascar, -25.3054, 44.9762 Amborompotsy, Madagascar, -24.6791, 44.9507 Ambalakindresy, Madagascar, -21.1664, 47.3352 Ambahoabe, Madagascar, -16.7828, 49.5207 Vohitrindry, Madagascar, -22.3751, 47.8362 Befandriana, Madagascar, -15.2542, 48.5425 Ampanefena, Madagascar, -13.8588, 49.9449 Ankilivalo, Madagascar, -20.2984, 44.6361 Anjiajia, Madagascar, -16.4644, 46.9572 Ambatondrakalavao, Madagascar, -19.4481, 47.5078 Kirano, Madagascar, -21.8333, 47.0500 Sakoabe, Madagascar, -22.1937, 47.8396 Maroviro, Madagascar, -21.2283, 44.7418 Ambakireny, Madagascar, -17.6232, 47.8439 Tsiately, Madagascar, -23.3309, 47.6101 Ambohitsilaozana, Madagascar, -17.6994, 48.4687 Ambazoa, Madagascar, -25.3147, 45.8960 Ambodisakoana, Madagascar, -15.4058, 47.9597 Bemanevika, Madagascar, -14.1403, 50.1244 Ambondrona, Madagascar, -21.2683, 46.9937 Ambatolampy, Madagascar, -18.9000, 46.1167 Bejofo, Madagascar, -17.8362, 48.2185 Manambolo, Madagascar, -15.2840, 49.7099 Mangindrano, Madagascar, -14.2687, 48.9592 Ankilimalinika, Madagascar, -22.9569, 43.5642 Sandrakatsy, Madagascar, -16.3397, 49.6131 Marojala, Madagascar, -14.4680, 50.0320 Ilafy, Madagascar, -17.8919, 48.4145 Morarano, Madagascar, -18.9120, 47.3032 Mandritsara, Madagascar, -19.5500, 47.0500 Befeta, Madagascar, -21.2304, 47.0495 Amboaboa, Madagascar, -15.9448, 48.7186 Manambidala, Madagascar, -22.7500, 47.2667 Andohajango, Madagascar, -15.9098, 48.4970 Harmah, Saudi Arabia, 25.9262, 45.3297 Sunne, Sweden, 59.8333, 13.1500 Kumi, Uganda, 1.4608, 33.9361 Lavello, Italy, 41.0500, 15.8000 Ayas, Turkey, 40.0167, 32.3333 Vieira do Minho, Portugal, 41.6333, -8.1333 Bocas del Toro, Panama, 9.3333, -82.2500 Manalalondo, Madagascar, -19.2544, 47.1138 Anandapuram, India, 11.0900, 76.9422 Gornalwood, United Kingdom, 52.5230, -2.1240 Lohiyar Ujain, India, 26.6284, 84.7452 Mounds View, United States, 45.1071, -93.2076 Spata, Greece, 37.9667, 23.9167 Ficarazzi, Italy, 38.0923, 13.4639 Baduriatola, India, 24.0928, 84.0895 Kottapadi, India, 10.0667, 76.6000 Kara-Kyshtak, Kyrgyzstan, 40.1187, 72.1005 Chhara, India, 28.6957, 76.7072 Chawalhati, India, 26.4841, 88.5677 Nacozari de Garcia, Mexico, 30.3833, -109.6833 Korneuburg, Austria, 48.3453, 16.3331 Auriol, France, 43.3681, 5.6361 Zandhoven, Belgium, 51.2150, 4.6608 Sai Wan Ho, Hong Kong, 22.2877, 114.1365 Steinkjer, Norway, 64.0147, 11.4942 Paso de los Toros, Uruguay, -32.8112, -56.5086 Santa Cruz Atizapan, Mexico, 19.1756, -99.4886 Kibiito, Uganda, 0.4775, 30.1925 Ivanic-Grad, Croatia, 45.7081, 16.3947 Kollipara, India, 16.2877, 80.7519 Vrbovec, Croatia, 45.8833, 16.4333 Bisee, Saint Lucia, 14.0243, -60.9744 Yiewsley, United Kingdom, 51.5130, -0.4710 Chang, India, 28.8808, 76.2427 Jianganj, India, 25.8661, 87.2612 Hoor, Sweden, 55.9333, 13.5333 Radomir, Bulgaria, 42.5457, 22.9623 San Lucas, Nicaragua, 13.4167, -86.6000 Kanel, Senegal, 15.4833, -13.1667 Satoraljaujhely, Hungary, 48.3941, 21.6561 Sidi Moussa Ben Ali, Morocco, 33.5594, -7.3817 Castellbisbal, Spain, 41.4760, 1.9830 Culaba, Philippines, 11.6578, 124.5425 Pretoria-Noord, South Africa, -25.6731, 28.1733 Sitalpur, India, 26.4050, 85.0070 Ben, Iran, 32.5447, 50.7475 Turi, Italy, 40.9167, 17.0167 Vysokovsk, Russia, 56.3167, 36.5500 Marple, United Kingdom, 53.3970, -2.0610 Barwat Pasrain, India, 26.7925, 84.5469 Phulwaria, India, 25.9395, 85.0035 Bachra, India, 23.6886, 85.0703 Senmayacho-senmaya, Japan, 38.9369, 141.3314 Wanderley, Brazil, -12.1200, -43.8878 Rovinj, Croatia, 45.0833, 13.6333 An Thanh B, Vietnam, 10.1958, 106.3314 Casinhas, Brazil, -7.7411, -35.7211 Berck-sur-Mer, France, 50.4089, 1.5933 Lingamparti, India, 17.2827, 82.1231 Chapantongo, Mexico, 20.2833, -99.4000 Itatiaiucu, Brazil, -20.1969, -44.4208 Festus, United States, 38.2194, -90.4097 Uppada, India, 17.0833, 82.3333 Lynnfield, United States, 42.5356, -71.0382 Palangarai, India, 11.1978, 77.3058 Garhi, India, 25.0447, 79.6772 Mizil, Romania, 45.0000, 26.4406 Shenley Church End, United Kingdom, 52.0220, -0.7880 Miami, United States, 36.8878, -94.8711 Bedford, United States, 41.3919, -81.5360 Montesarchio, Italy, 41.0667, 14.6333 Cardoso Moreira, Brazil, -21.4878, -41.6158 Chalette-sur-Loing, France, 48.0125, 2.7364 Somerville, United States, 40.5696, -74.6092 Shanyincun, China, 37.9151, 114.4126 Wicklow, Ireland, 52.9779, -6.0330 Kudangulam, India, 8.1901, 77.7002 Pomfret, United States, 42.4029, -79.3534 Pingtiancun, China, 25.2225, 114.6252 Jhaua, India, 25.6250, 84.5161 Montefiascone, Italy, 42.5333, 12.0333 Flint, United Kingdom, 53.2482, -3.1358 Pucioasa, Romania, 45.0742, 25.4342 Mogocha, Russia, 53.7333, 119.7667 Twistringen, Germany, 52.8000, 8.6500 Mirdaul, India, 26.2363, 87.0971 Saposoa, Peru, -6.9364, -76.7718 Villeneuve-les-Avignon, France, 43.9672, 4.7967 Ionia, United States, 42.9773, -85.0727 Mulakaluru, India, 16.2776, 80.0672 Bocsa, Romania, 45.3747, 21.7106 Libertad, Philippines, 8.5583, 124.3500 Rodental, Germany, 50.2833, 11.0667 Jaitpur, India, 25.9132, 84.5730 Tartarugalzinho, Brazil, 1.5058, -50.9119 Lakkavaram, India, 17.0628, 81.2919 Carpenedolo, Italy, 45.3654, 10.4323 Newcastle, United States, 47.5304, -122.1633 Cesky Krumlov, Czechia, 48.8111, 14.3153 Cherutana Tekku, India, 9.3230, 76.4382 Brejoes, Brazil, -13.1039, -39.7958 Shiwan, China, 37.4622, 109.3797 Camponogara, Italy, 45.3833, 12.0667 Ain Jemaa, Morocco, 34.0333, -5.8000 Elandsdoorn, South Africa, -25.2880, 29.1960 Nossa Senhora do Livramento, Brazil, -15.7750, -56.3458 Berja, Spain, 36.8453, -2.9469 Sakhmohan, India, 25.6325, 85.9859 Rochester, United States, 42.6866, -83.1198 Japoata, Brazil, -10.3467, -36.8011 Rampur Shamchand, India, 25.5664, 85.3289 Matinilla, Costa Rica, 9.9246, -84.0713 Trebaseleghe, Italy, 45.5833, 12.0500 Gomparou, Benin, 11.3000, 2.4489 Morungaba, Brazil, -22.8800, -46.7917 Avocado Heights, United States, 34.0391, -117.9970 Campo de Criptana, Spain, 39.4000, -3.1167 Ait I'yach, Morocco, 32.6667, -4.9556 Isalo, Madagascar, -19.7370, 45.4392 San Pablo, Colombia, 1.6725, -77.0139 Kachavaram, India, 16.5361, 79.7187 Pionerskiy, Russia, 54.9517, 20.2333 Wadersloh, Germany, 51.7386, 8.2514 Atmakuru, India, 14.6452, 77.3554 Song Phi Nong, Thailand, 14.2241, 100.0209 Balatonfured, Hungary, 46.9500, 17.8833 Qal`at al Madiq, Syria, 35.4147, 36.3908 Nova Londrina, Brazil, -22.7658, -52.9850 Besigheim, Germany, 48.9983, 9.1417 Saint-Hilaire-de-Riez, France, 46.7219, -1.9442 Medfield, United States, 42.1848, -71.3050 Fengdeng, China, 38.5514, 106.2464 Paranhos, Brazil, -23.8928, -55.4308 Woolton, United Kingdom, 53.3740, -2.8650 Kingsbury, United States, 43.3440, -73.5396 Sint-Gillis-bij-Dendermonde, Belgium, 51.0189, 4.1058 Amarwa Khurd, India, 26.8333, 84.2500 Tezze sul Brenta, Italy, 45.6862, 11.7042 Sugarland Run, United States, 39.0309, -77.3762 Chamical, Argentina, -30.3667, -66.3167 Valparaiso, Mexico, 22.7667, -103.5667 Buritirama, Brazil, -5.5928, -47.0178 Castiglion Fiorentino, Italy, 43.3439, 11.9189 Bujari, Brazil, -9.8308, -67.9519 Statte, Italy, 40.5667, 17.2000 Kent, United States, 41.4735, -73.7319 Schodack, United States, 42.5297, -73.6858 Vejer de la Frontera, Spain, 36.2500, -5.9667 Sant Sadurni d'Anoia, Spain, 41.4261, 1.7850 Kalanaur, India, 32.0100, 75.0900 Tonosho, Japan, 34.4833, 134.1833 Adolfo Gonzales Chaves, Argentina, -38.0333, -60.0833 Odder, Denmark, 55.9772, 10.1683 Balbalan, Philippines, 17.4436, 121.2008 Anolaima, Colombia, 4.7617, -74.4640 Schinnen, Netherlands, 50.9428, 5.8894 Greenville, United States, 44.3003, -88.5365 Leagrave, United Kingdom, 51.9030, -0.4660 Neunkirchen, Germany, 50.7997, 8.0000 Saint-Andre, France, 50.6608, 3.0450 Kingstown, Saint Vincent and the Grenadines, 13.1578, -61.2250 Nosivka, Ukraine, 50.9300, 31.5806 Waianae, United States, 21.4568, -158.1758 Bloomsburg, United States, 41.0027, -76.4561 San Mateo, Venezuela, 9.7400, -64.5531 Barra de Santa Rosa, Brazil, -6.7200, -36.0608 Tashi, China, 34.5000, 106.5333 Karahal, India, 25.4909, 77.0543 Khomam, Iran, 37.3911, 49.6597 Goonellabah, Australia, -28.8167, 153.3167 Corat, Azerbaijan, 40.5739, 49.7036 Tarnos, France, 43.5411, -1.4600 Cliftonville, United Kingdom, 51.3881, 1.4046 Kankandighi, India, 21.9744, 88.4659 Bijelo Polje, Montenegro, 43.0400, 19.7500 Amolatar, Uganda, 1.6517, 32.8250 Kapchorwa, Uganda, 1.4000, 34.4500 Jennings, United States, 38.7231, -90.2644 Trent Hills, Canada, 44.3142, -77.8514 Vellakkinar, India, 11.0736, 76.9566 Tirmaigiri, India, 17.4270, 79.4724 Loreto, Italy, 43.4403, 13.6074 Chateaudun, France, 48.0717, 1.3387 Gurgunta, India, 16.2558, 76.5628 Cho Moi, Vietnam, 10.5500, 105.4000 Sisauna, India, 26.1320, 87.6231 Bairia, India, 25.5563, 85.1835 Quierschied, Germany, 49.3167, 7.0333 Kalappalangulam, India, 9.1889, 77.5604 Monteprandone, Italy, 42.9203, 13.8355 Holiday City-Berkeley, United States, 39.9639, -74.2787 Yuza, Japan, 39.0147, 139.9089 Pelham, United States, 40.9000, -73.8063 Highlands, United States, 41.3601, -74.0084 Wommelgem, Belgium, 51.2031, 4.5227 Saghar Sultanpur, India, 26.1583, 84.7570 Petrus Steyn, South Africa, -27.6500, 28.1333 Bagewadi, India, 16.2900, 74.6000 Khunays, Tunisia, 35.7122, 10.8167 Moreira, Portugal, 41.2486, -8.6497 Esneux, Belgium, 50.5333, 5.5667 Elavanasur, India, 11.7154, 79.1796 Pentapadu Kasba, India, 16.7804, 81.5254 Misaki, Japan, 35.9981, 133.9581 Tonyrefail, United Kingdom, 51.5840, -3.4306 Barja, Lebanon, 33.6497, 35.4433 Santany, Spain, 39.3542, 3.1283 Kalavai, India, 12.7691, 79.4196 Crissiumal, Brazil, -27.5000, -54.1008 Uzwil, Switzerland, 47.4367, 9.1342 Mockern, Germany, 52.1406, 11.9525 Bronderslev, Denmark, 57.2651, 9.9599 Ambalarondra, Madagascar, -18.4686, 49.0013 Brenes, Spain, 37.5500, -5.8667 Sangao, Brazil, -28.6378, -49.1289 Kapelle, Netherlands, 51.5000, 3.9500 Severobaykalsk, Russia, 55.6500, 109.3167 El Dorado, United States, 37.8210, -96.8613 Ricaurte, Colombia, 4.2792, -74.7728 Peissenberg, Germany, 47.7950, 11.0603 Ringnod, India, 22.6113, 74.9338 Edattirutti, India, 10.3667, 76.1333 Ayutla, Mexico, 20.8167, -104.2000 Neunkirchen, Austria, 47.7333, 16.0833 Suzu, Japan, 37.4363, 137.2605 Daru, Papua New Guinea, -9.0833, 143.2000 Cidelandia, Brazil, -5.1739, -47.7819 Teror, Spain, 28.0589, -15.5475 Frutillar, Chile, -41.1228, -73.0581 Koturkolkara, India, 9.5667, 76.8833 Keisen, Japan, 33.5789, 130.6781 Nurkot, Pakistan, 32.2017, 75.1186 Feuchtwangen, Germany, 49.1667, 10.3167 Causeni, Moldova, 46.6442, 29.4139 Lontras, Brazil, -27.1658, -49.5419 Palombara Sabina, Italy, 42.0667, 12.7667 Manvel, United States, 29.4798, -95.3635 Alpen, Germany, 51.5750, 6.5125 Kuala Kurun, Indonesia, -1.1016, 113.8664 Alayaman, India, 8.8843, 76.9653 Lakeland South, United States, 47.2786, -122.2826 Colares, Brazil, -0.9369, -48.2819 Puren, Chile, -38.0319, -73.0728 Tanakkangulam, India, 9.8877, 78.0397 Agutaya, Philippines, 11.1520, 120.9396 St. Ann, United States, 38.7266, -90.3872 Chilwell, United Kingdom, 52.9160, -1.2350 Red Bank, United States, 40.3480, -74.0672 Les Ponts-de-Ce, France, 47.4253, -0.5242 Trail, Canada, 49.0950, -117.7100 Muggia, Italy, 45.6000, 13.7667 Calcinato, Italy, 45.4581, 10.4146 Lakinsk, Russia, 56.0333, 39.9667 Capdepera, Spain, 39.7000, 3.4167 Akayu, Japan, 38.0500, 140.1833 Porto Murtinho, Brazil, -21.6989, -57.8828 Perigi Dua, Indonesia, -6.2656, 106.6969 Mansapur, India, 26.5262, 86.4101 Rehti, India, 22.7378, 77.4340 Mulaikkaraippatti, India, 8.5454, 77.7679 Ganapavaram, India, 15.9232, 80.5856 Lanuvio, Italy, 41.6833, 12.7000 Neosho, United States, 36.8437, -94.3758 Galich, Russia, 58.3833, 42.3500 Larkspur, United States, 37.9393, -122.5312 Dhutauli, India, 25.5274, 86.6250 Ecublens, Switzerland, 46.5333, 6.5667 Mayenne, France, 48.3120, -0.6183 Chinnasekkadu, India, 13.1609, 80.2573 Daparkha, India, 26.1293, 86.9004 Gartringen, Germany, 48.6408, 8.9006 Sidi Kasem, Morocco, 35.5339, -5.2183 Balao, Ecuador, -2.9100, -79.8100 Nuevo Ideal, Mexico, 24.8875, -105.0728 Saunshi, India, 15.2167, 75.3000 Pasadena Hills, United States, 28.2881, -82.2380 Byram, United States, 32.1890, -90.2861 Vedappatti, India, 10.9988, 76.8960 Zhongling, China, 28.9391, 107.7073 Niandjila, Mali, 11.7975, -6.5447 Lakeside, United States, 37.6132, -77.4768 Palmares do Sul, Brazil, -30.2578, -50.5100 Argentona, Spain, 41.5500, 2.4000 Rahika, India, 26.3803, 86.0204 Spiesen-Elversberg, Germany, 49.3167, 7.1333 Bihariganj, India, 25.7341, 86.9884 Aldoar, Portugal, 41.1695, -8.6671 Acasusso, Argentina, -34.4667, -58.5167 Brodslev, Denmark, 57.2694, 9.9472 Ceuti, Spain, 38.0789, -1.2722 Sugauna, India, 26.4077, 86.2174 Sidlice, Poland, 54.3471, 18.6171 Cuers, France, 43.2383, 6.0717 Meric, Turkey, 41.1833, 26.4167 Solana Beach, United States, 32.9943, -117.2574 Dedemsvaart, Netherlands, 52.5997, 6.4583 Cavallino, Italy, 40.3102, 18.2022 Talne, Ukraine, 48.8886, 30.7042 Kallad, India, 9.9500, 76.6667 Gharbia, Morocco, 35.5153, -5.9306 Janai, India, 22.7157, 88.2426 Meddappakkam, India, 12.9166, 80.1939 West Monroe, United States, 32.5120, -92.1513 Puerto Jimenez, Costa Rica, 8.5338, -83.4610 Teulada, Spain, 38.7292, 0.1019 San Pietro in Casale, Italy, 44.7000, 11.4000 Antonio Prado, Brazil, -28.8578, -51.2828 Terrasini Favarotta, Italy, 38.1500, 13.0833 Timberlake, United States, 37.3167, -79.2481 Kadachchinallur, India, 11.3686, 77.8033 Quartucciu, Italy, 39.2529, 9.1762 Mora, Sweden, 61.0096, 14.5635 Cheney, United States, 47.4901, -117.5790 Vicente Guerrero, Mexico, 30.7264, -115.9903 Santa Fe, United States, 29.3889, -95.1003 Sattar, India, 25.9550, 86.5828 Barhauna, India, 25.6043, 85.7288 Stony Brook, United States, 40.9061, -73.1278 Encamp, Andorra, 42.5361, 1.5828 Santuario, Colombia, 5.0725, -75.9623 Kaul, India, 29.8461, 76.6608 Oxapampa, Peru, -10.5740, -75.4050 Sagay, Philippines, 9.1200, 124.7200 Forrest City, United States, 35.0135, -90.7931 San Juan Tecuaco, Guatemala, 14.0836, -90.2664 Spilamberto, Italy, 44.5333, 11.0167 Palacaguina, Nicaragua, 13.4500, -86.4000 Roudnice nad Labem, Czechia, 50.4236, 14.2539 Canelinha, Brazil, -27.2650, -48.7678 Raymond Terrace, Australia, -32.7615, 151.7441 Same, Mali, 14.4833, -11.5667 Campos Altos, Brazil, -19.6958, -46.1708 Mullassheri, India, 10.5333, 76.0833 Salempur, India, 26.4588, 84.6517 Fontanafredda, Italy, 45.9667, 12.5667 Nieuw Nickerie, Suriname, 5.9333, -56.9833 Juan L. Lacaze, Uruguay, -34.4311, -57.4483 Nova Crixas, Brazil, -14.0989, -50.3269 Frederiksvaerk, Denmark, 55.9677, 12.0215 Leopold, Australia, -38.1892, 144.4644 Gueret, France, 46.1714, 1.8692 Arakere, India, 12.4133, 76.8168 Santa Cruz Amilpas, Mexico, 17.0667, -96.6833 M'dhilla, Tunisia, 34.2500, 8.7500 Ganga, India, 30.3229, 74.9234 Spiez, Switzerland, 46.6831, 7.6664 Noyon, France, 49.5817, 2.9997 Rehoboth, United States, 41.8439, -71.2456 Qazmalar, Azerbaijan, 40.9814, 47.8458 Buenos Aires, Brazil, -7.7258, -35.3269 The Nation / La Nation, Canada, 45.3500, -75.0333 Nova Timboteua, Brazil, -1.2058, -47.3858 Ziro, India, 27.5664, 93.8314 Bolintin Vale, Romania, 44.4472, 25.7572 Lumberton, United States, 39.9569, -74.8036 Bela Simri, India, 25.5295, 86.3079 Bhagwanpur Khurd, India, 26.7500, 83.7400 Pueblo Nuevo, Mexico, 17.1500, -92.9000 Douar Oulad Youssef, Morocco, 32.4807, -6.3769 Little Lever, United Kingdom, 53.5630, -2.3690 Chiatura, Georgia, 42.2894, 43.2836 Venkatagirikota, India, 13.0012, 78.4795 Rosario del Tala, Argentina, -32.3000, -59.1333 Bazidpur, India, 26.1536, 86.1511 Cornwall, United States, 41.4195, -74.0540 Prescot, United Kingdom, 53.4286, -2.8064 Santo Tomas La Union, Guatemala, 14.6333, -91.3833 Yelmalla, India, 18.8241, 78.1609 Govindgarh, India, 24.3785, 81.2964 Ban Krang, Thailand, 16.7460, 100.2750 Bag`dod, Uzbekistan, 40.4606, 71.2214 Yozyovon, Uzbekistan, 40.6619, 71.7431 Granville, France, 48.8374, -1.5939 Salzano, Italy, 45.5333, 12.1167 Rose Belle, Mauritius, -20.4025, 57.6061 Hessisch Lichtenau, Germany, 51.2000, 9.7167 Kachchippalli, India, 11.5950, 77.9188 Florence, United States, 40.0977, -74.7886 Chinnakkampalaiyam, India, 10.7064, 77.4575 Amherst, United States, 41.4022, -82.2303 Milngavie, United Kingdom, 55.9421, -4.3137 Khuldabad, India, 20.0095, 75.1888 Arohi, India, 31.8419, 76.8645 Kalecik, Turkey, 40.0972, 33.4083 Kurwa Mathia, India, 26.8572, 84.5058 Toukoroba, Mali, 13.6083, -7.0389 Burgos, Philippines, 17.3331, 120.4944 Winterberg, Germany, 51.2000, 8.5167 Florida City, United States, 25.4418, -80.4685 Lokapur, India, 16.1656, 75.3660 Springbok, South Africa, -29.6667, 17.8833 Rio Casca, Brazil, -20.2258, -42.6508 Gaura, India, 24.9643, 86.3739 Kyotera, Uganda, -0.6317, 31.5433 Vadnais Heights, United States, 45.0570, -93.0748 Santa Maria do Suacui, Brazil, -18.1900, -42.4139 Rampurwa, India, 26.7544, 84.7114 Nkheila, Morocco, 32.9572, -7.0731 Saint-Andre-de-Cubzac, France, 44.9956, -0.4447 Mallapur, India, 16.1400, 74.8100 Mesolongi, Greece, 38.3692, 21.4278 Yavoriv, Ukraine, 49.9469, 23.3931 Fremington, United Kingdom, 51.0700, -4.1200 Santa Ana de Yacuma, Bolivia, -13.7444, -65.4269 As, Czechia, 50.2239, 12.1950 Herzberg am Harz, Germany, 51.6575, 10.3411 Straldzha, Bulgaria, 42.6000, 26.6830 Jasauli, India, 26.4996, 84.8171 Franeker, Netherlands, 53.1875, 5.5400 Oudenbosch, Netherlands, 51.5892, 4.5239 Krupka, Czechia, 50.6844, 13.8583 Kannudaiyampatti, India, 10.6377, 78.4733 Sanderstead, United Kingdom, 51.3358, -0.0818 Mudhol, India, 18.9667, 77.9167 Kanbara, Japan, 35.1159, 138.5949 Pichilemu, Chile, -34.3919, -72.0139 Ocos, Guatemala, 14.5094, -92.1933 Betton, France, 48.1833, -1.6428 Ashibetsu, Japan, 43.5167, 142.1833 Donwari, Benin, 11.1197, 2.8558 Hersbruck, Germany, 49.5081, 11.4328 Nangavalli, India, 11.7619, 77.8909 Landeh, Iran, 30.9808, 50.4214 Velilla de San Antonio, Spain, 40.3667, -3.4833 Gavere, Belgium, 50.9333, 3.6667 Lagoa Dourada, Brazil, -20.9139, -44.0778 Schongau, Germany, 47.8167, 10.9000 Chojnow, Poland, 51.2667, 15.9333 Loyish Shaharchasi, Uzbekistan, 39.8839, 66.7481 Harpur Bochaha, India, 25.5919, 85.7517 Nandyalampeta, India, 14.7218, 78.8083 Sorum, Norway, 60.0000, 11.2333 Perez, Philippines, 14.1800, 121.9300 Rayevskiy, Russia, 54.0664, 54.9358 Wietmarschen, Germany, 52.5333, 7.1333 Bad Windsheim, Germany, 49.5000, 10.4167 Magdalena Milpas Altas, Guatemala, 14.5453, -90.6753 Ouaouzgane, Morocco, 35.0167, -4.5167 Huazalingo, Mexico, 21.8156, -98.5078 Brzeg Dolny, Poland, 51.2708, 16.7208 Novo Lino, Brazil, -8.9150, -35.6467 Monovar, Spain, 38.4369, -0.8381 Chodavaram, India, 17.4380, 81.7781 Agdangan, Philippines, 13.8758, 121.9122 Tsivilsk, Russia, 55.8667, 47.4833 Woodhaven, United States, 42.1320, -83.2374 Dhubaria, Bangladesh, 24.0104, 89.8404 Sulz am Neckar, Germany, 48.3628, 8.6317 Chahatpur, India, 26.2331, 87.5816 Sedriano, Italy, 45.4833, 8.9667 Ban Tat, Thailand, 17.3081, 102.7844 Branson, United States, 36.6509, -93.2636 Vilanova del Cami, Spain, 41.5667, 1.6333 Sarahandrano, Madagascar, -14.8257, 50.0235 Rodeio, Brazil, -26.9228, -49.3658 Bariyarpur, India, 26.6347, 84.9245 Maheswa, India, 25.9718, 86.8550 Granarolo del l'Emilia, Italy, 44.5542, 11.4439 Anaikal, India, 9.6003, 76.6846 Emeryville, United States, 37.8382, -122.2932 Bad Urach, Germany, 48.4931, 9.3986 Maharajpur, India, 25.2087, 87.7458 Antanandava, Madagascar, -19.0926, 47.9593 Bayeux, France, 49.2794, -0.7028 Kaufungen, Germany, 51.2811, 9.6186 Villa San Giovanni, Italy, 38.2167, 15.6333 Kaeng Khoi, Thailand, 14.5862, 100.9976 Casteel, South Africa, -24.7247, 31.0201 Kouti, Benin, 6.5542, 2.6616 Vadasseri, India, 8.1937, 77.4343 Finchampstead, United Kingdom, 51.3610, -0.8600 Svirsk, Russia, 53.0833, 103.3333 Nawada Gobindganj, India, 26.4868, 84.6561 Barud, India, 21.7497, 75.5270 Kolappalur, India, 11.5100, 77.4500 Greenville, United States, 40.1043, -84.6209 Gonzales, United States, 30.2132, -90.9234 Serra Azul, Brazil, -21.3108, -47.5658 Kamrej, India, 21.1364, 72.9572 Maroli, India, 21.0240, 72.8890 Belev, Russia, 53.8125, 36.1333 Rokupr, Sierra Leone, 9.0109, -12.9489 Keerbergen, Belgium, 51.0031, 4.6311 Begampur, India, 22.3705, 88.4940 Beaufort, Malaysia, 5.3473, 115.7455 Ilicinia, Brazil, -20.9358, -45.8328 Dharampur Bande, India, 25.6609, 85.5742 Cavarzere, Italy, 45.1370, 12.0817 Terrabona, Nicaragua, 12.7333, -85.9667 Bahadurpur, India, 25.4522, 85.6303 Ban Sop Tia, Thailand, 18.3895, 98.6780 Majarhat, India, 25.9654, 86.8126 Chinna Gollapalem, India, 16.3701, 81.5322 Calcinaia, Italy, 43.6835, 10.6165 Kochlowice, Poland, 50.2538, 18.9015 Sandy, United States, 45.3988, -122.2697 Mahabaleshwar, India, 17.9250, 73.6575 Manorville, United States, 40.8574, -72.7915 Sebiston, Tajikistan, 38.2500, 69.2833 Malaryta, Belarus, 51.7833, 24.0833 Bandlaguda, India, 17.3543, 78.3853 San Salvador, Argentina, -31.6167, -58.5000 Velten, Germany, 52.6833, 13.1833 At Tur, Egypt, 28.2333, 33.6167 Jami, India, 18.0500, 83.2667 Highland City, United States, 27.9633, -81.8781 Sonbarsa, India, 25.7069, 86.7379 Almirante, Panama, 9.3000, -82.4000 Upper Uwchlan, United States, 40.0817, -75.7070 Sete Barras, Brazil, -24.3878, -47.9258 Koprubasi, Turkey, 38.7497, 28.4047 Duvvuru, India, 14.8333, 78.6500 Dingman, United States, 41.3226, -74.9264 Tamm, Germany, 48.9167, 9.1167 Joanopolis, Brazil, -22.9303, -46.2756 Obalapuram, India, 14.8000, 78.7830 Canilla, Guatemala, 15.1667, -90.8500 Ainsdale, United Kingdom, 53.6021, -3.0405 Ivanec, Croatia, 46.2167, 16.1167 Meadville, United States, 41.6476, -80.1468 Mar de Espanha, Brazil, -21.8669, -43.0100 Brus Laguna, Honduras, 15.7711, -84.5395 Emmiganuru, India, 15.1500, 76.9200 San Francisco de Mostazal, Chile, -33.9799, -70.7122 Alexandreia, Greece, 40.6333, 22.4500 Ialysos, Greece, 36.4167, 28.1500 Alcala, Colombia, 4.6667, -75.7500 Debbache el Hadj Douadi, Algeria, 36.2750, 6.1764 San Antonio Aguas Calientes, Guatemala, 14.5333, -90.7667 Bakhtawarpur, India, 28.8210, 77.1660 Mahtha, India, 26.5988, 86.3158 Blagodarnyy, Russia, 45.1000, 43.4500 Varzaneh, Iran, 32.4197, 52.6478 Kyotamba, Japan, 35.1667, 135.4167 Valtierrilla, Mexico, 20.0000, 31.0000 Vidauban, France, 43.4262, 6.4325 Street, United Kingdom, 51.1270, -2.7400 Pirnagar, India, 25.5982, 86.7178 Bari, India, 25.8769, 86.1918 Meze, France, 43.4278, 3.6058 San Anselmo, United States, 37.9821, -122.5699 Novi Pazar, Bulgaria, 43.3500, 27.2000 Playa Grande, Guatemala, 15.9833, -90.7667 Damarcherla, India, 16.7269, 79.6369 Chaiyo, Thailand, 14.6488, 100.4788 Oatfield, United States, 45.4125, -122.5940 Pennsville, United States, 39.6266, -75.5089 Kaspi, Georgia, 41.9244, 44.4189 El Paraiso, El Salvador, 14.0833, -89.0833 Sao Felix da Marinha, Portugal, 41.0339, -8.6233 Sivalarkulam, India, 8.8700, 77.5267 Ladenburg, Germany, 49.4667, 8.6167 Madugula, India, 17.9167, 82.8000 Ksar Lmajaz, Morocco, 35.8428, -5.5586 Buffelshoek, South Africa, -24.6308, 31.1383 Marysville, United States, 39.1518, -121.5835 Cranleigh, United Kingdom, 51.1363, -0.4784 Miranorte, Brazil, -9.5289, -48.5900 Nirakpurpali, India, 25.3244, 84.8114 Honggu, China, 36.2930, 102.9575 Serere, Uganda, 1.5000, 33.5500 Oakland, United States, 41.0313, -74.2408 Zelzate, Belgium, 51.2000, 3.8167 Umag, Croatia, 45.4336, 13.5172 Patti, Italy, 38.1389, 14.9648 Kuressaare, Estonia, 58.2500, 22.4833 Samai, India, 24.9788, 85.5861 Battulapalle, India, 14.5167, 77.7833 Kelso, United States, 46.1236, -122.8909 Puerto Ayora, Ecuador, -0.7500, -90.3167 Caio, Guinea-Bissau, 11.9278, -16.2028 Sason, Turkey, 38.3803, 41.3953 Saint-Andre-les-Vergers, France, 48.2806, 4.0547 Sante Bennur, India, 14.1697, 76.0033 Basmenj, Iran, 37.9961, 46.4722 Zelenodolsk, Ukraine, 47.5658, 33.6464 Librazhd-Qender, Albania, 41.1969, 20.3356 Newhaven, United Kingdom, 50.8000, 0.0600 Peraiyur, India, 9.7341, 77.7900 Gricignano d'Aversa, Italy, 40.9833, 14.2333 Brad, Romania, 46.1294, 22.7900 Jerome, United States, 42.7179, -114.5159 Graben-Neudorf, Germany, 49.1592, 8.4894 Chuy, Kyrgyzstan, 42.8197, 75.2823 Bamhni, India, 22.4822, 80.3716 Manakondur, India, 18.3981, 79.2250 Grover Beach, United States, 35.1204, -120.6197 Tucson Estates, United States, 32.1792, -111.1266 Alampur Gonpura, India, 25.5404, 85.0511 Nicosia, Italy, 37.7500, 14.4000 Borovsk, Russia, 55.2000, 36.5000 Sangtuda, Tajikistan, 38.0333, 69.0833 Stupava, Slovakia, 48.2833, 17.0333 Challapata, Bolivia, -18.9000, -66.7667 Dianguirde, Mali, 14.4940, -9.0150 Dianke, Mali, 15.7258, -4.6428 Mechtras, Algeria, 36.5500, 4.0000 Santiago Amoltepec, Mexico, 16.6167, -97.5000 Ap Binh Thanh, Vietnam, 10.1833, 105.2000 Edgewood, United States, 47.2309, -122.2832 Delemont, Switzerland, 47.3653, 7.3472 Maniyur, India, 11.9500, 75.4500 Itayanagi, Japan, 40.6959, 140.4572 Perehinske, Ukraine, 48.8100, 24.1900 Derventa, Bosnia and Herzegovina, 44.9800, 17.9100 Hedensted, Denmark, 55.7701, 9.6967 Daharia, India, 25.5307, 87.5947 Luchong, China, 27.2832, 109.0346 Cuisnahuat, El Salvador, 13.6333, -89.6000 Amos, Canada, 48.5667, -78.1167 Penistone, United Kingdom, 53.5250, -1.6290 Morazan, Guatemala, 14.9328, -90.1431 Olgiate Olona, Italy, 45.6333, 8.8833 Fostoria, United States, 41.1600, -83.4121 Yzeure, France, 46.5669, 3.3553 Taguai, Brazil, -23.4519, -49.4089 Sarasota Springs, United States, 27.3087, -82.4746 Mablethorpe, United Kingdom, 53.3409, 0.2610 Douar Toulal, Morocco, 33.8951, -5.6021 Venev, Russia, 54.3500, 38.2667 Robinson, United States, 31.4501, -97.1201 Diari, Ghana, 9.8452, -0.8655 Gorokhovets, Russia, 56.2000, 42.7000 Eufaula, United States, 31.9102, -85.1505 Palos de la Frontera, Spain, 37.2283, -6.8944 Shirataka, Japan, 38.1831, 140.0986 Shilka, Russia, 51.8500, 116.0333 Enumclaw, United States, 47.2018, -121.9897 Canovanas, Puerto Rico, 18.3693, -65.9009 Verde Village, United States, 34.7119, -111.9941 Herk-de-Stad, Belgium, 50.9406, 5.1672 Juterbog, Germany, 51.9933, 13.0728 Lymm, United Kingdom, 53.3834, -2.4750 Kotturu, India, 17.2958, 82.4752 Gerpinnes, Belgium, 50.3369, 4.5283 Salobrena, Spain, 36.7467, -3.5869 Puduru, India, 16.1520, 77.8273 Cairo Montenotte, Italy, 44.3979, 8.2778 North Adams, United States, 42.6844, -73.1166 Hornsey, United Kingdom, 51.5870, -0.1180 Mamakating, United States, 41.5860, -74.4951 Mugutkhan Hubli, India, 15.7900, 74.7500 Blaubeuren, Germany, 48.4119, 9.7850 Imam Sahib, Afghanistan, 37.1844, 68.9144 Santo Stino di Livenza, Italy, 45.7333, 12.6833 Kucove, Albania, 40.8039, 19.9144 Malmedy, Belgium, 50.4261, 6.0303 Bad Abbach, Germany, 48.9333, 12.0500 Balpyq Bi, Kazakhstan, 44.8947, 78.2083 Ahermoumou, Morocco, 33.8300, -4.4000 Malhador, Brazil, -10.6578, -37.3047 Nakhla, Algeria, 33.2833, 6.9500 San Biagio di Callalta, Italy, 45.6867, 12.3815 Brunsbuttel, Germany, 53.8964, 9.1386 Sheopuria, India, 28.5300, 79.7700 Manchester, United States, 35.4630, -86.0774 Ouzera, Algeria, 36.2500, 2.8500 Sinincay, Ecuador, -2.8333, -79.0000 Takamori, Japan, 35.5138, 137.8739 Sosnovoborsk, Russia, 56.1333, 93.3667 Bom Repouso, Brazil, -22.4708, -46.1450 Qiaotouba, China, 33.7537, 104.8110 Chodov, Czechia, 50.2414, 12.7439 Comines, France, 50.7616, 3.0086 Sutton on Hull, United Kingdom, 53.7806, -0.3047 Tilari, India, 25.0040, 85.2520 Los Santos, Colombia, 6.9167, -73.0833 Awantipur, India, 33.9233, 75.0128 Claiborne, United States, 32.5379, -92.1981 Bretzfeld, Germany, 49.1833, 9.4333 Market Warsop, United Kingdom, 53.2000, -1.1500 Warsop, United Kingdom, 53.2000, -1.1500 Steinheim, Germany, 51.8658, 9.0944 Ziama Mansouria, Algeria, 36.6667, 5.4833 Nangola, Mali, 12.6661, -6.6042 Isla Mujeres, Mexico, 21.2333, -86.7333 Petrovske, Ukraine, 48.2833, 38.8833 Diamond Springs, United States, 38.6920, -120.8391 Fortaleza dos Nogueiras, Brazil, -6.9639, -46.1769 Saltcoats, United Kingdom, 55.6352, -4.7896 Ponduru, India, 18.3508, 83.7567 Al Muzayrib, Syria, 32.7108, 36.0275 Tetiiv, Ukraine, 49.3708, 29.6900 Los Hidalgos, Dominican Republic, 19.7300, -71.0300 Wickliffe, United States, 41.6072, -81.4690 Groutville, South Africa, -29.3880, 31.2450 Puttanattam, India, 10.4670, 78.3687 Wilmington, United States, 39.4362, -83.8141 Kakan, India, 26.1509, 87.5674 Tenmalai, India, 9.3129, 77.4959 De Haan, Belgium, 51.2667, 3.0333 Rio Vermelho, Brazil, -18.2939, -43.0089 North Walsham, United Kingdom, 52.8214, 1.3861 Adukam, India, 9.7954, 76.8456 Kanniyambram, India, 10.7333, 76.4000 San Marco in Lamis, Italy, 41.7117, 15.6350 Sedro-Woolley, United States, 48.5112, -122.2321 Ottawa, United States, 38.5996, -95.2636 Minooka, United States, 41.4507, -88.2791 Falmouth, United States, 43.7476, -70.2827 Dores do Indaia, Brazil, -19.4628, -45.6019 Qigexingcun, China, 42.0200, 86.3031 Naduhatti, India, 11.4043, 76.8160 Ulster, United States, 41.9699, -74.0041 Blackfoot, United States, 43.1940, -112.3454 Costa Marques, Brazil, -12.4450, -64.2272 Knittelfeld, Austria, 47.2150, 14.8294 Victoria, El Salvador, 13.9500, -88.6333 Burj al `Arab, Egypt, 30.9167, 29.5333 Mongat, Spain, 41.4690, 2.2805 Kadiyampatti, India, 11.8720, 78.0961 Ap Phu Hai, Vietnam, 11.1667, 108.5667 Sirur, India, 16.0965, 75.7858 Bonito, Brazil, -1.3628, -47.3069 Castel Goffredo, Italy, 45.2981, 10.4750 Presidente Janio Quadros, Brazil, -14.6889, -41.6778 Vilsbiburg, Germany, 48.4500, 12.3500 Jalpura, India, 25.4862, 84.7370 Kalyazin, Russia, 57.2333, 37.8833 Paradise Valley, United States, 33.5434, -111.9595 Cunda dia Baze, Angola, -8.9167, 17.0667 Simri, India, 25.7523, 86.6074 Antonivka, Ukraine, 46.6808, 32.7358 Cedral, Brazil, -20.9028, -49.2678 Kauhajoki, Finland, 62.4319, 22.1794 Gurgentepe, Turkey, 40.7883, 37.6017 Motkur, India, 17.4569, 79.2592 Saddlebrooke, United States, 32.5576, -110.8740 Concepcion Las Minas, Guatemala, 14.5167, -89.4500 Daipha, India, 25.1584, 72.2444 Xalpatlahuac, Mexico, 17.3333, -98.6500 Brown Deer, United States, 43.1743, -87.9750 Andernos-les-Bains, France, 44.7433, -1.0892 Parigi, India, 13.9069, 77.4572 Summerstrand, South Africa, -33.9914, 25.6569 Apia, Colombia, 5.1000, -75.9500 Buchs, Switzerland, 47.1656, 9.4711 Isla Raton, Venezuela, 5.1311, -67.8106 St. Marys, United States, 41.4574, -78.5342 Gaffney, United States, 35.0743, -81.6552 Valverde del Camino, Spain, 37.5667, -6.7500 Saka, Japan, 34.3411, 132.5136 Fulton, United States, 38.8551, -91.9510 Santa Barbara de Pinto, Colombia, 9.4333, -74.7000 Tamsaout, Morocco, 29.5333, -8.8500 Chariyakulam, India, 9.6527, 77.1226 Toplita, Romania, 46.9236, 25.3458 Boiling Springs, United States, 35.0450, -81.9779 Riviera Beach, United States, 39.1623, -76.5257 Hirschaid, Germany, 49.8167, 10.9833 Lewisburg, United States, 35.4510, -86.7901 Ullo, Hungary, 47.3842, 19.3444 Kharak Kalan, India, 28.8070, 76.3140 Melvindale, United States, 42.2802, -83.1782 La Chapelle-Saint-Luc, France, 48.3125, 4.0453 Garh Sisai, India, 25.6253, 85.7887 Belagal, India, 15.8183, 77.6702 Muttanampalaiyam, India, 11.0845, 77.3969 Magsaysay, Philippines, 10.8700, 121.0500 Road Town, Virgin Islands, British, 18.4167, -64.6167 Goldenrod, United States, 28.6114, -81.2916 Lansdowne, United States, 39.0844, -77.4839 Tagoloan, Philippines, 8.1092, 124.4392 Altenstadt, Germany, 50.2856, 8.9450 Alat, Azerbaijan, 39.9483, 49.4067 Queluz, Brazil, -22.5372, -44.7742 Niefern-Oschelbronn, Germany, 48.9164, 8.7842 Angadikkal Tekkekara, India, 9.2063, 76.7835 Luchenza, Malawi, -16.0167, 35.3000 Galaosiyo Shahri, Uzbekistan, 39.8500, 64.4500 Eski Arab, Uzbekistan, 40.3686, 71.4231 Puerto Lopez, Ecuador, -1.5589, -80.8106 Dunkirk, United States, 42.4801, -79.3324 Hosir, India, 23.7735, 85.8132 Guymon, United States, 36.6903, -101.4774 Khagra, India, 25.3511, 87.0624 Lamphun, Thailand, 18.5864, 99.0119 Gladenbach, Germany, 50.7681, 8.5828 Wetaskiwin, Canada, 52.9694, -113.3769 Dieli, Mali, 13.0667, -5.1167 Minakshipuram, India, 9.8815, 77.2747 New Germany, South Africa, -29.8000, 30.8833 Ibiracu, Brazil, -19.8319, -40.3697 Sami, India, 23.6872, 71.7786 Berkovitsa, Bulgaria, 43.2371, 23.1251 Agua Boa, Brazil, -17.9958, -42.3889 Viota, Colombia, 4.4381, -74.5239 Cevicos, Dominican Republic, 19.0045, -69.9790 Chropaczow, Poland, 50.3131, 18.9150 Zimnicea, Romania, 43.6522, 25.3681 Hvardiiske, Ukraine, 45.1000, 34.0000 Jeppe's Reef, South Africa, -25.7200, 31.4770 Kingsburg, United States, 36.5244, -119.5602 Market Drayton, United Kingdom, 52.9044, -2.4848 Seyitgazi, Turkey, 39.4456, 30.6939 Ban Tom Klang, Thailand, 19.1990, 99.8352 Kortemark, Belgium, 51.0333, 3.0333 Mahuakheraganj, India, 29.1300, 78.9200 Koppal, India, 15.3500, 76.1500 Hayashima, Japan, 34.6006, 133.8283 General Acha, Argentina, -37.3833, -64.6000 Sangar, Iran, 37.1797, 49.6942 Gaesti, Romania, 44.7194, 25.3197 Lantana, United States, 33.0926, -97.1214 North Smithfield, United States, 41.9727, -71.5514 Wordsley, United Kingdom, 52.4830, -2.1500 Souakene, Morocco, 35.1167, -5.9500 Cloquet, United States, 46.7221, -92.4923 Chandwa, India, 23.6756, 84.7401 Lamballe, France, 48.4694, -2.5167 San Vicente, Philippines, 14.1061, 122.8733 San Rafael, Colombia, 6.2975, -75.0314 Vatra Dornei, Romania, 47.3461, 25.3594 Tuzdybastau, Kazakhstan, 43.3189, 77.0594 Wieringerwerf, Netherlands, 52.8506, 5.0228 Pago Pago, American Samoa, -14.2740, -170.7046 Richton Park, United States, 41.4816, -87.7387 Ridgefield, United States, 45.8114, -122.7051 Apricena, Italy, 41.7846, 15.4436 Dabat, Ethiopia, 12.9842, 37.7650 Karedu, India, 15.1833, 80.0667 Geneva, United States, 42.8645, -76.9826 Castle Pines, United States, 39.4625, -104.8706 Dongyuancun, China, 28.3190, 120.2321 Lindsay, United States, 36.2082, -119.0897 Osecina, Serbia, 44.3667, 19.6000 Adre, Chad, 13.4667, 22.2000 Kamalapuram, India, 11.7680, 78.0599 Appukkudal, India, 11.4684, 77.5766 Port Washington, United States, 43.3846, -87.8855 Duartina, Brazil, -22.4144, -49.4039 Gueltat Sidi Saad, Algeria, 34.3000, 1.9500 Tirukkattuppalli, India, 10.5100, 78.5700 Kanra, Japan, 36.2430, 138.9218 Vasylivka, Ukraine, 47.4431, 35.2819 Campbelltown, Australia, -34.0667, 150.8167 El Fuerte, Mexico, 26.4214, -108.6200 Borken, Germany, 51.0458, 9.2672 Rothenbach an der Pegnitz, Germany, 49.4847, 11.2475 Lipari, Italy, 38.4673, 14.9554 Levelland, United States, 33.5806, -102.3635 Parker, United States, 34.8513, -82.4512 Tartar, Azerbaijan, 40.3353, 46.9303 Quirihue, Chile, -36.2833, -72.5333 Ancuabe, Mozambique, -12.9833, 39.8500 Olen, Belgium, 51.1439, 4.8597 Lucena, Brazil, -6.9000, -34.8689 Maba, Indonesia, 0.7000, 128.3000 Prymorskyi, Ukraine, 45.1167, 35.4806 Union, United States, 38.4399, -90.9927 Sungurlare, Bulgaria, 42.7669, 26.7831 Birni, Benin, 9.9892, 1.5269 Vohimarina, Madagascar, -21.6321, 46.9045 Upper, United States, 39.2563, -74.7270 Progreso, Mexico, 32.5842, -115.5842 Poquoson, United States, 37.1318, -76.3568 Artesia, United States, 32.8497, -104.4268 Rochefort, Belgium, 50.1590, 5.2231 Mandramo, India, 24.1822, 85.8734 Zaouiat Moulay Bouchta El Khammar, Morocco, 34.4833, -5.1167 Mendota, United States, 36.7555, -120.3776 Rong Kwang, Thailand, 18.3390, 100.3174 Nohsa, India, 25.5653, 85.0558 Parasurampur, India, 14.2606, 76.8826 Spearfish, United States, 44.4909, -103.8155 Armadale, United Kingdom, 55.8978, -3.7047 Pilich, India, 25.2379, 85.3483 Marikal, India, 16.6020, 77.7294 Diamou, Mali, 14.0939, -11.2669 Calanasan, Philippines, 18.2550, 121.0436 Devapur, India, 19.0443, 79.3499 Tata, Morocco, 29.7428, -7.9725 Kastoria, Greece, 40.5167, 21.2667 Osian, India, 26.7167, 72.9167 Sankt Veit an der Glan, Austria, 46.7667, 14.3667 Epping, United Kingdom, 51.7004, 0.1087 Tizi Nisly, Morocco, 32.4667, -5.7667 Cottonwood, United States, 34.7195, -112.0016 Northlake, United States, 41.9142, -87.9054 Emstek, Germany, 52.8167, 8.1500 Pajo, Indonesia, -8.5167, 120.3333 Lakhipur, India, 24.8000, 93.0200 Sabugal, Portugal, 40.3519, -7.0894 Dysselsdorp, South Africa, -33.5667, 22.4333 North Merrick, United States, 40.6871, -73.5615 Monte Quemado, Argentina, -25.8036, -62.8303 Kwiha, Ethiopia, 13.4769, 39.5450 Conceicao do Rio Verde, Brazil, -21.8808, -45.0850 Jaromer, Czechia, 50.3503, 15.9183 Makuyu, Kenya, -0.9183, 37.2148 Ban Laem, Thailand, 13.2047, 99.9796 Apuiares, Brazil, -3.9489, -39.4319 Aubergenville, France, 48.9590, 1.8550 Khorol, Ukraine, 49.7667, 33.2667 Fokino, Russia, 53.2128, 34.4186 Wawarsing, United States, 41.7526, -74.4172 La Carlota, Argentina, -33.4333, -63.3000 Kawamata, Japan, 37.6650, 140.5983 Luderitz, Namibia, -26.6478, 15.1578 Borodyanka, Ukraine, 50.6439, 29.9339 Sarare, Venezuela, 9.7839, -69.1611 Dossenheim, Germany, 49.4500, 8.6667 Nakhtarana, India, 23.3500, 69.2633 Varazze, Italy, 44.3600, 8.5766 Avrig, Romania, 45.7081, 24.3747 Jiuduhe, China, 40.3594, 116.4539 Ulvila, Finland, 61.4325, 21.8825 Kantang, Thailand, 7.4054, 99.5156 Turki, India, 26.0294, 86.0666 Vandithavalam, India, 10.6500, 76.7583 Chiampo, Italy, 45.5500, 11.2833 Brunswick, United States, 42.7558, -73.5903 Fene, Spain, 43.4667, -8.1667 Pornichet, France, 47.2775, -2.3389 Betma, India, 22.6800, 75.6200 Mahrail, India, 26.2952, 86.2763 Bad Sassendorf, Germany, 51.5831, 8.1667 Mayamankurichchi, India, 8.8855, 77.5041 Ebersberg, Germany, 48.0833, 11.9667 Chikura, Japan, 34.9500, 139.9500 Bacalar, Mexico, 18.6769, -88.3953 Petrov Val, Russia, 50.1500, 45.2167 Hansot, India, 21.5833, 72.8000 Villa Sola de Vega, Mexico, 16.5125, -96.9806 Montegranaro, Italy, 43.2332, 13.6322 Edemissen, Germany, 52.3833, 10.2667 Tola Khadda, India, 26.7396, 84.5014 Montividiu, Brazil, -17.4439, -51.1750 Torroella de Montgri, Spain, 42.0439, 3.1286 Reggada, Morocco, 29.5205, -9.6664 Neuenburg am Rhein, Germany, 47.8147, 7.5619 Eloxochitlan, Mexico, 18.5088, -96.9227 Burnham, United Kingdom, 51.5400, -0.6600 Nekaraje, India, 12.5431, 75.0833 Santo Nino, Philippines, 11.9263, 124.4492 Champadanga, India, 22.8300, 87.9600 Kewatgawan, India, 25.8012, 86.3229 Ereymentau, Kazakhstan, 51.6167, 73.1000 West Grey, Canada, 44.1833, -80.8167 Ialoveni, Moldova, 46.9431, 28.7778 Rantoul, United States, 40.3031, -88.1549 Klobuck, Poland, 50.9167, 18.9333 Gorazde, Bosnia and Herzegovina, 43.6667, 18.9778 Waltershausen, Germany, 50.8975, 10.5558 North St. Paul, United States, 45.0137, -92.9995 Campinorte, Brazil, -14.3139, -49.1519 Borgo San Dalmazzo, Italy, 44.3333, 7.4833 Qarah, Syria, 34.1556, 36.7428 Marabella, Trinidad and Tobago, 10.3000, -61.4500 Kashasha, Tanzania, -1.7578, 31.6158 Winnetka, United States, 42.1064, -87.7421 Gumani, Ghana, 9.4500, -0.7667 Samos, Greece, 37.7475, 26.9825 Savalgi, India, 16.6710, 75.3515 Pilar, Philippines, 10.8070, 124.5650 Ridge, United States, 40.9068, -72.8816 Baraboo, United States, 43.4695, -89.7376 Pannaikkadu, India, 10.2761, 77.6272 Wolsztyn, Poland, 52.1167, 16.1167 Lake Elmo, United States, 44.9944, -92.9031 Sattegalam, India, 12.1500, 77.1000 Timezgana, Morocco, 34.5833, -4.7333 Haddonfield, United States, 39.8955, -75.0346 Campo Alegre, Brazil, -26.1928, -49.2658 Culfa, Azerbaijan, 38.9558, 45.6308 Usmanpur, India, 25.3487, 86.9669 Dhanupra, India, 25.6992, 86.4716 Miary, Madagascar, -23.3061, 43.7288 Wlodawa, Poland, 51.5500, 23.5500 Panj, Tajikistan, 37.2353, 69.0972 Anjahambe, Madagascar, -17.3798, 49.1433 Paithan Kawai, India, 26.1755, 86.0685 Xiaping, China, 33.4031, 106.0581 Rionero in Vulture, Italy, 40.9167, 15.6667 Lake Norman of Catawba, United States, 35.5995, -80.9840 Codegua, Chile, -34.0347, -70.6686 Nanzhai, China, 26.6299, 108.7645 Coringa, India, 16.8000, 82.2333 Baykalsk, Russia, 51.5167, 104.1333 Big Bear City, United States, 34.2536, -116.7903 Wolverton, United Kingdom, 52.0625, -0.8167 Zuvvaladinne, India, 14.8080, 80.0705 Gosaingaon, India, 25.3724, 87.1049 Puturge, Turkey, 38.1967, 38.8697 Vernouillet, France, 48.7217, 1.3614 Canegrate, Italy, 45.5667, 8.9333 Bauyrzhan Momyshuly, Kazakhstan, 42.6189, 70.7597 Hincesti, Moldova, 46.8258, 28.5936 Sidi Bou Othmane, Morocco, 31.9033, -7.9422 Fort Atkinson, United States, 42.9253, -88.8442 Demerval Lobao, Brazil, -5.3578, -42.6758 Cascades, United States, 39.0464, -77.3874 Aubenas, France, 44.6206, 4.3911 Devsar, India, 28.7600, 76.0870 Negotino, North Macedonia, 41.4839, 22.0892 Gold Canyon, United States, 33.3639, -111.4230 Laarne, Belgium, 51.0167, 3.8500 El Adjiba, Algeria, 36.3333, 4.1500 Saint David's, Grenada, 12.0444, -61.6806 Beaumont, Haiti, 18.4787, -73.9564 Grave, Netherlands, 51.7592, 5.7383 Neuhausen auf den Fildern, Germany, 48.6844, 9.2744 Vikasnagar, India, 30.4680, 77.7740 Alwarkurichchi, India, 8.7838, 77.3952 Xavantes, Brazil, -23.0389, -49.7094 Alto do Rodrigues, Brazil, -5.2878, -36.7619 Kotwapatti Rampur, India, 25.7153, 84.8063 Grenada, United States, 33.7816, -89.8130 Annapolis Neck, United States, 38.9409, -76.4997 Rozhyshche, Ukraine, 50.9131, 25.2700 Garden City, United States, 43.6526, -116.2743 Ingeniero Maschwitz, Argentina, -34.3667, -58.7500 'Ain el Assel, Algeria, 36.7864, 8.3825 Bang Phlat, Thailand, 13.8247, 100.4908 Amelia, United States, 39.0269, -84.2218 Domahani, India, 23.7569, 87.0256 Naysar, Iran, 35.3267, 47.0686 Ocna Mures, Romania, 46.3900, 23.8600 Thair, India, 18.3213, 76.1330 Mariental, Namibia, -24.6333, 17.9667 Chabal Kalan, India, 31.4818, 74.7927 Tiruppalai, India, 9.9825, 78.1430 Lana, Italy, 46.6160, 11.1449 Kathanian, India, 31.6373, 74.7572 Forest, United States, 37.3728, -79.2831 La Argentina, Colombia, 2.1961, -75.9800 San Miguel Panan, Guatemala, 14.5333, -91.3667 Pidigan, Philippines, 17.5700, 120.5900 Arhribs, Algeria, 36.8022, 4.3228 Gulsehir, Turkey, 38.7464, 34.6206 Kuttiyeri, India, 12.0667, 75.3500 Shahpura, India, 23.1828, 80.6997 Bheja, India, 26.1046, 86.3950 Zaladanki, India, 14.8843, 79.9125 Made, Netherlands, 51.6764, 4.7925 Raamsdonksveer, Netherlands, 51.6993, 4.8792 Ranranagudipeta, India, 12.6618, 78.5483 Lakshminarayanapuram, India, 11.7914, 79.5555 Santa Ana Maya, Mexico, 20.0000, -101.0167 Voerendaal, Netherlands, 50.8825, 5.9272 Ban Bang Non, Thailand, 10.0178, 98.6560 Matatiele, South Africa, -30.3422, 28.8061 Singerei, Moldova, 47.6333, 28.1500 Bryne, Norway, 58.7333, 5.6500 Mira, Portugal, 40.4285, -8.7363 Hacilar, Turkey, 38.6497, 35.4503 Kuhsan, Afghanistan, 34.6500, 61.1667 Celakovice, Czechia, 50.1606, 14.7500 Chaval, Brazil, -3.0339, -41.2439 Barton upon Irwell, United Kingdom, 53.4760, -2.3600 Patiram, India, 25.3167, 88.7500 Eyvanekey, Iran, 35.3444, 52.0714 Reshuijie, China, 24.4580, 114.8282 Xinyingheyan, China, 35.3222, 103.2710 eXobho, South Africa, -30.1572, 30.0647 Iferhounene, Algeria, 36.5167, 4.3833 Cetinje, Montenegro, 42.3894, 18.9247 Santana, Romania, 46.3500, 21.5000 San Bartolo, Guatemala, 15.0844, -91.4558 Putussibau, Indonesia, 0.8575, 112.9250 Guruvarajukuppam, India, 13.1125, 79.5472 Doctor Phillips, United States, 28.4474, -81.4914 Box Elder, United States, 44.1120, -103.0818 Santana do Matos, Brazil, -5.9578, -36.6558 Preussisch Oldendorf, Germany, 52.2833, 8.5000 Nakskov, Denmark, 54.8373, 11.1284 Bickenhill, United Kingdom, 52.4390, -1.7250 Ak-Dovurak, Russia, 51.1833, 90.6000 Jensen Beach, United States, 27.2437, -80.2423 Rozenburg, Netherlands, 51.9058, 4.2486 Engenheiro Beltrao, Brazil, -23.7969, -52.2689 Macara, Ecuador, -4.3833, -79.9500 Balya, Turkey, 39.7500, 27.5833 Tilbury, United Kingdom, 51.4606, 0.3582 Bandipur, Nepal, 27.9381, 84.4069 Uren, Russia, 57.4500, 45.7833 Anna Regina, Guyana, 7.2633, -58.4806 Ahirauliya, India, 26.5091, 84.7999 Laichingen, Germany, 48.4897, 9.6861 Harrai, India, 22.6143, 79.2221 Fagnano Olona, Italy, 45.6667, 8.8667 Bagnolo Mella, Italy, 45.4300, 10.1854 Zonnebeke, Belgium, 50.8667, 2.9833 Zella-Mehlis, Germany, 50.6597, 10.6669 Kobiri, Mali, 13.1192, -9.9011 Boone, United States, 42.0531, -93.8770 Gamarra, Colombia, 8.3333, -73.6667 Quimperle, France, 47.8736, -3.5486 Satao, Portugal, 40.7333, -7.7167 Wernau, Germany, 48.6886, 9.4222 'Ain el Arbaa, Algeria, 35.4075, -0.8817 Bhanas Hivre, India, 19.4858, 74.9664 Sangan, Iran, 34.3961, 60.2572 Ozatlan, El Salvador, 13.3833, -88.5000 Finspang, Sweden, 58.7167, 15.7833 Sillamae, Estonia, 59.3931, 27.7742 Hanumantanpatti, India, 9.7858, 77.3170 Kanoni, Uganda, 0.1728, 31.9058 Nelmadur, India, 9.5100, 78.3000 Villa Literno, Italy, 41.0096, 14.0741 Shichuanxiang, China, 34.5855, 104.3208 Gaimersheim, Germany, 48.8167, 11.3667 Gravatal, Brazil, -28.3308, -49.0350 Matsukawa, Japan, 35.5972, 137.9097 Liberty Lake, United States, 47.6686, -117.1036 Kankon, India, 15.0200, 74.0200 Newington Forest, United States, 38.7370, -77.2339 Goiatins, Brazil, -7.7100, -47.3139 Gohpur, India, 26.8818, 93.6156 Gogui, Mali, 15.6858, -9.3297 Viterbo, Colombia, 5.0667, -75.8833 Maglod, Hungary, 47.4439, 19.3525 Bandalli, India, 12.1640, 77.3504 Koszutka, Poland, 50.2711, 19.0211 Beausoleil, France, 43.7425, 7.4244 Overlea, United States, 39.3642, -76.5175 Balchik, Bulgaria, 43.4233, 28.1420 Kallupatti, India, 9.7167, 77.8667 Campiglia Marittima, Italy, 43.0667, 10.6167 Sint-Michiels, Belgium, 51.1886, 3.2117 Bairia, India, 26.7373, 84.4371 Dhansura, India, 23.3492, 73.2119 Tyngsborough, United States, 42.6662, -71.4290 Guatica, Colombia, 5.3167, -75.8000 Pueblo Rico, Colombia, 5.2500, -76.1667 Oshikango, Namibia, -17.4000, 15.8833 Punta del Este, Uruguay, -34.9667, -54.9500 Pont-du-Chateau, France, 45.7992, 3.2492 Titara, India, 26.2311, 84.2444 Ambatomainty, Madagascar, -20.8984, 46.4476 Ludwigslust, Germany, 53.3244, 11.4972 Jequeri, Brazil, -20.4558, -42.6658 Chachagui, Colombia, 1.3605, -77.2835 Warman, Canada, 52.3219, -106.5842 Taiynsha, Kazakhstan, 53.8478, 69.7639 Gulshan, Tajikistan, 37.5833, 69.4333 El Ayote, Nicaragua, 12.1905, -85.2874 El Ayote, Nicaragua, 12.5000, -84.8167 Mallappulasseri, India, 9.3167, 76.6833 Los Bellosos, Dominican Republic, 19.8333, -71.0167 Hersham, United Kingdom, 51.3681, -0.4008 Baswariya, India, 26.2833, 86.4667 Fortuna, United States, 40.5862, -124.1419 Vysoke Myto, Czechia, 49.9533, 16.1617 Huodoushancun, China, 40.7797, 117.2040 L'Union, France, 43.6575, 1.4853 Hizan, Turkey, 38.2256, 42.4269 Albox, Spain, 37.3833, -2.1333 Hullatti, India, 11.4771, 76.6960 Grammichele, Italy, 37.2167, 14.6333 Rushall, United Kingdom, 52.6089, -1.9592 Madiama, Mali, 13.7947, -4.3961 Aywaille, Belgium, 50.4724, 5.6734 Meerzorg, Suriname, 5.8072, -55.1469 Kadiana, Mali, 10.7500, -6.5000 Lake City, United States, 30.1901, -82.6471 Myrtle Grove, United States, 34.1230, -77.8834 Vallejuelo, Dominican Republic, 18.6500, -71.3300 Kolattur, India, 13.3295, 79.4797 Bousse, Mali, 13.5069, -5.9362 Mehnatobod, Tajikistan, 40.2000, 68.9500 Kegeyli Shahar, Uzbekistan, 42.7767, 59.6078 Las Lomitas, Argentina, -24.7072, -60.5944 Prilly, Switzerland, 46.5333, 6.6000 Maraiyur, India, 10.2762, 77.1615 Siki, Benin, 10.1833, 2.3833 Kika, Benin, 9.3000, 2.2667 Hinundayan, Philippines, 10.3500, 125.2500 Lower Pottsgrove, United States, 40.2537, -75.5975 Borger, United States, 35.6598, -101.4012 Neerijnen, Netherlands, 51.8333, 5.2833 Xinbocun, China, 42.3032, 117.7258 Talwat, Morocco, 31.2883, -7.2372 Koluszki, Poland, 51.7500, 19.8000 Titisee-Neustadt, Germany, 47.9122, 8.2147 Jork, Germany, 53.5344, 9.6817 Gisors, France, 49.2811, 1.7772 Xinchangcun, China, 26.4249, 107.5323 Estepa, Spain, 37.2917, -4.8792 Kankaanpaa, Finland, 61.8000, 22.4000 Ponnai, India, 13.1276, 79.2575 Buttayagudem, India, 17.2089, 81.3014 Trogir, Croatia, 43.5167, 16.2500 Sarableh, Iran, 33.7683, 46.5619 Arcozelo, Portugal, 41.0555, -8.6395 Ambinanynony, Madagascar, -18.5926, 49.1181 Issum, Germany, 51.5389, 6.4236 Payyanpalli, India, 11.8111, 76.0556 Calvizzano, Italy, 40.9090, 14.1751 Poco Branco, Brazil, -5.6228, -35.6628 Valbonne, France, 43.6424, 7.0095 Creutzwald, France, 49.2000, 6.6833 Kalingiyam, India, 11.4324, 77.4178 Orzinuovi, Italy, 45.4000, 9.9333 Sylacauga, United States, 33.1780, -86.2605 San Pedro Jicayan, Mexico, 16.4167, -97.9833 Triel-sur-Seine, France, 48.9817, 2.0069 Kamtaul, India, 26.3280, 85.8238 Ammavarikuppam, India, 13.1784, 79.4169 El Aouana, Algeria, 36.7667, 5.6000 Claye-Souilly, France, 48.9500, 2.7000 Tendukheda, India, 23.1708, 78.8724 Bollnas, Sweden, 61.3520, 16.3666 Bayona, Spain, 42.1178, -8.8506 Chennampatti, India, 11.7011, 77.6785 Boortmeerbeek, Belgium, 50.9817, 4.5718 Quinta de Tilcoco, Chile, -34.3547, -70.9636 Kallamalai, India, 11.0489, 76.5691 Kala Chay, Iran, 37.0789, 50.3953 Conneaut, United States, 41.9275, -80.5685 Pira, Benin, 8.5000, 1.7333 Spondon, United Kingdom, 52.9200, -1.4010 Attanur, India, 11.5006, 78.1356 Anzola dell'Emilia, Italy, 44.5472, 11.1956 Panjipara, India, 26.1369, 88.0132 Las Parejas, Argentina, -32.6833, -61.5333 Sher, India, 26.3422, 84.6210 Novhorod-Siverskyi, Ukraine, 51.9972, 33.2667 Escanaba, United States, 45.7477, -87.0900 Santiago del Teide, Spain, 28.2972, -16.8139 Zlocieniec, Poland, 53.5269, 16.0122 Saboya, Colombia, 5.7000, -73.7667 Kalajoki, Finland, 64.2667, 23.9500 Arma, India, 25.1966, 86.2468 Shamsabad, India, 23.8149, 77.4957 Santa Ana, Mexico, 30.5406, -111.1205 Justice, United States, 41.7495, -87.8345 Palmer, United States, 42.1888, -72.3112 Asfarvarin, Iran, 35.9331, 49.7469 Eureka, United States, 38.5004, -90.6491 Avigliana, Italy, 45.0779, 7.3984 Valley Falls, United States, 41.9233, -71.3924 Ilmajoki, Finland, 62.7333, 22.5833 Massena, United States, 44.9609, -74.8339 Olagadam, India, 11.5656, 77.6428 Patchogue, United States, 40.7621, -73.0185 Tehachapi, United States, 35.1276, -118.4744 Mandra, Greece, 38.0667, 23.5000 Dokkum, Netherlands, 53.3253, 5.9989 Ribeirao Claro, Brazil, -23.1939, -49.7578 San Antonio, Colombia, 10.0000, -74.6667 Seravezza, Italy, 44.0000, 10.2333 Vardenis, Armenia, 40.1800, 45.7200 Anklam, Germany, 53.8500, 13.6833 Allapalli, India, 19.4300, 80.0600 Dharhara, India, 25.2543, 86.4030 Villafranca de los Barros, Spain, 38.5667, -6.3333 Jin'an, China, 32.6394, 103.5806 Gaildorf, Germany, 49.0000, 9.7667 Lake Tapps, United States, 47.2307, -122.1695 Apen, Germany, 53.2214, 7.8097 Moka, India, 15.2380, 77.0599 Mi`rabah, Syria, 32.5447, 36.4264 Derby, United States, 41.3265, -73.0833 Forecariah, Guinea, 9.4300, -13.0980 Ichora, India, 19.4333, 78.4667 Onoto, Venezuela, 9.5958, -65.1897 Coseley, United Kingdom, 52.5500, -2.0830 Fojnica, Bosnia and Herzegovina, 43.9595, 17.9029 Porto Recanati, Italy, 43.4299, 13.6649 Higashiagatsuma, Japan, 36.5714, 138.8203 Sever do Vouga, Portugal, 40.7167, -8.3667 Ierapetra, Greece, 35.0117, 25.7414 Rezvanshahr, Iran, 37.5481, 49.1356 Piano di Sorrento, Italy, 40.6333, 14.4111 Arluno, Italy, 45.5000, 8.9333 Tup, Kyrgyzstan, 42.7276, 78.3648 Taraclia, Moldova, 45.9000, 28.6689 Biliaivka, Ukraine, 46.0000, 28.0000 Nitte, India, 13.1858, 74.9394 Logan, United States, 40.5263, -78.4234 Sydney Mines, Canada, 46.2333, -60.2167 Nobeji, Japan, 40.8644, 141.1287 Ovenden, United Kingdom, 53.7432, -1.8779 Tenambakkam, India, 12.8102, 79.7341 Drouin, Australia, -38.1333, 145.8500 Dubak, India, 18.1744, 78.6667 Sabinov, Slovakia, 49.1000, 21.1000 Kladanj, Bosnia and Herzegovina, 44.2267, 18.6927 Koskapur, India, 26.2669, 87.1465 Cobh, Ireland, 51.8510, -8.2967 Manchester, United States, 37.4902, -77.5396 Lye, United Kingdom, 52.4590, -2.1160 Payariq Shahri, Uzbekistan, 39.9892, 66.8458 Hagenow, Germany, 53.4167, 11.1833 Pont-Sainte-Maxence, France, 49.3019, 2.6044 Rinconada de Malloa, Chile, -34.4464, -70.9458 Alampur, India, 26.0251, 78.7970 San Miguel Xoxtla, Mexico, 19.1833, -98.3000 West Plains, United States, 36.7377, -91.8680 Essenbach, Germany, 48.6167, 12.2167 Mapleton, United States, 40.1188, -111.5742 Mandalgovi, Mongolia, 45.7667, 106.2708 Huai Yot, Thailand, 7.7894, 99.6347 Benaguacil, Spain, 39.5933, -0.5864 Bandwar, India, 25.5093, 86.1595 Bourem Inali, Mali, 16.6883, -2.8528 Nong Khae, Thailand, 14.3406, 100.8673 Mutoko, Zimbabwe, -17.4000, 32.2167 Rognac, France, 43.4886, 5.2331 Opuwo, Namibia, -18.0556, 13.8406 Amersfoort, South Africa, -27.0078, 29.8711 Laguna Paiva, Argentina, -31.3039, -60.6589 Foca, Bosnia and Herzegovina, 43.5000, 18.7833 Lyelchytsy, Belarus, 51.7894, 28.3214 Maqu, China, 35.9451, 106.9953 Pontecorvo, Italy, 41.4626, 13.6676 Yoko, Cameroon, 5.5924, 12.3158 Soubala, Mali, 13.8625, -3.5000 Mecatlan, Mexico, 20.2167, -97.0167 Aphaur, India, 25.8828, 84.7595 Leonforte, Italy, 37.6500, 14.4000 Bozkurt, Turkey, 37.8167, 29.6167 Brignais, France, 45.6747, 4.7550 Periyakoduveri, India, 11.4811, 77.2989 Hawsh al Bahdaliyah, Syria, 33.4361, 36.3567 Boumalne, Morocco, 31.4236, -6.0722 Dragor, Denmark, 55.5946, 12.6690 Dehqonobod, Tajikistan, 37.6333, 69.4500 Valencia, Trinidad and Tobago, 10.6500, -61.2000 Enkesen, Germany, 51.4667, 7.9667 Kibuye, Rwanda, -2.0617, 29.3483 Rio Grande, Puerto Rico, 18.3789, -65.8388 Kattukkottai, India, 11.6026, 78.6698 Desri, India, 25.6691, 85.4082 El Carmen, El Salvador, 13.3500, -88.0000 Navelim, India, 15.2564, 73.9686 Bulgan, Mongolia, 48.8125, 103.5347 Capul, Philippines, 12.4230, 124.1820 Dawson Creek, Canada, 55.7606, -120.2356 Shuangxianxiang, China, 35.3300, 105.6950 Mende, France, 44.5194, 3.5014 Baker, United States, 30.5832, -91.1582 Teotepeque, El Salvador, 13.5853, -89.5183 Jankinagar, India, 25.8955, 87.0668 Zetel, Germany, 53.4197, 7.9742 Sidney, Canada, 48.6506, -123.3986 Benisa, Spain, 38.7150, 0.0500 Cedarburg, United States, 43.2990, -87.9887 Dasraha Bhograjpur, India, 25.5691, 85.6441 Cambuquira, Brazil, -21.8583, -45.2911 Sedziszow Malopolski, Poland, 50.0694, 21.7014 Jefferson Hills, United States, 40.2926, -79.9329 Bou Arkoub, Tunisia, 36.5400, 10.5500 Kozhinjampara, India, 10.7333, 76.8500 Kotia, India, 26.2750, 86.0532 Gravenhurst, Canada, 44.9167, -79.3667 Rosdorf, Germany, 51.5000, 9.9000 Enniscorthy, Ireland, 52.5008, -6.5578 Heliopolis, Brazil, -10.6828, -38.2858 Emiliano Zapata, Mexico, 19.6500, -98.5500 Santa Luzia, Brazil, -15.4289, -39.3339 Sureshjan, Iran, 32.3167, 50.6764 Shamaldy-Say, Kyrgyzstan, 41.2006, 72.1789 Rielasingen-Worblingen, Germany, 47.7314, 8.8386 Le Chambon-Feugerolles, France, 45.3969, 4.3258 Chettipulam, India, 10.4743, 79.7546 Pandalkudi, India, 9.3947, 78.1051 Biassono, Italy, 45.6306, 9.2744 Wrentham, United States, 42.0513, -71.3552 Makeni, Sierra Leone, 8.8817, -12.0442 Obernai, France, 48.4600, 7.4800 Susa, Colombia, 5.4528, -73.8140 L'Isle-Adam, France, 49.1119, 2.2236 Hasanpur, India, 25.6330, 85.5728 Giffnock, United Kingdom, 55.8051, -4.2946 Bogorodsk, Russia, 56.1167, 43.5000 Obikiik, Tajikistan, 38.1586, 68.6722 Qorao`zak, Uzbekistan, 43.0275, 60.0125 G'oliblar Qishlog'i, Uzbekistan, 40.4953, 67.8778 Prince Rupert, Canada, 54.3122, -130.3271 Vocklabruck, Austria, 48.0086, 13.6558 Paikpar, India, 26.0966, 87.1349 Kakching Khunou, India, 24.4047, 93.8998 Sacacoyo, El Salvador, 13.7333, -89.4667 Newman, United States, 37.3156, -121.0212 Fangshan, China, 38.0433, 114.0425 Sendafa, Ethiopia, 9.1500, 39.0333 Crestwood, United States, 38.5569, -90.3783 Fairfax Station, United States, 38.7942, -77.3358 Atmakur, India, 16.3364, 77.8056 Acarlar, Turkey, 37.8244, 27.7467 Bad Freienwalde, Germany, 52.7856, 14.0325 Lavagna, Italy, 44.3122, 9.3417 Veurne, Belgium, 51.0667, 2.6500 Bom Retiro do Sul, Brazil, -29.6089, -51.9428 Huetor Vega, Spain, 37.1500, -3.5667 Nawada, India, 25.1021, 86.6902 Kot Shamir, India, 30.1096, 75.0079 Rivarolo Canavese, Italy, 45.3312, 7.7171 Arbelaez, Colombia, 4.2725, -74.4151 Sidi Makhlouf, Algeria, 34.1333, 3.0167 Charmahin, Iran, 32.3333, 51.1897 Tizgane, Morocco, 35.4136, -5.0696 Narman, Turkey, 40.3472, 41.8683 Melavayi, India, 13.9397, 77.2256 New Britain, United States, 40.3084, -75.2070 Cananeia, Brazil, -25.0150, -47.9269 Pebberu, India, 16.2167, 77.9833 Sala, Sweden, 59.9167, 16.6000 Gandorhun, Sierra Leone, 7.5550, -11.6926 Oissel, France, 49.3425, 1.0922 Lavinia, Brazil, -21.1683, -51.0397 Pola de Laviana, Spain, 43.2358, -5.5563 Syasstroy, Russia, 60.1500, 32.5833 Webster, United States, 29.5317, -95.1188 Lodhikheda, India, 21.5824, 78.8591 Eraniel, India, 8.2059, 77.3173 Kasaishi, Japan, 37.2528, 140.3434 Nanakuli, United States, 21.3892, -158.1445 Camp Verde, United States, 34.5690, -111.8560 Penal, Trinidad and Tobago, 10.1667, -61.4667 Bouca, Central African Republic, 6.5000, 18.2833 Haslev, Denmark, 55.3179, 11.9740 Thatto Heath, United Kingdom, 53.4352, -2.7481 Kewanee, United States, 41.2399, -89.9264 Hathwan, India, 25.6672, 86.3999 Upper Montclair, United States, 40.8433, -74.2006 San Marino, United States, 34.1224, -118.1132 Soklogbo, Benin, 7.6937, 2.2673 Pendencias, Brazil, -5.2600, -36.7219 Maxhutte-Haidhof, Germany, 49.2000, 12.1000 Giannouli, Greece, 39.6667, 22.4000 Erumaippatti, India, 11.1467, 78.2900 Yenkuvarigudem, India, 17.2055, 81.1598 Madison, United States, 38.7581, -85.3973 Kilkis, Greece, 40.9833, 22.8667 Tiszavasvari, Hungary, 47.9511, 21.3689 Kulattur, India, 10.7052, 78.5507 Baikunthpur, India, 24.7277, 81.4098 Kafr Ruma, Syria, 35.6366, 36.6329 Wolow, Poland, 51.3414, 16.6283 Sarrebourg, France, 48.7400, 7.0500 Polas, India, 18.8300, 78.9700 Streator, United States, 41.1245, -88.8297 Grafton, United States, 43.3204, -87.9480 Sevur, India, 12.6865, 79.2687 Dinkelsbuhl, Germany, 49.0708, 10.3194 Abaza, Russia, 52.6481, 90.0739 El Tambo, Colombia, 1.4131, -77.3981 Banos, Ecuador, -2.9000, -79.0667 Herrin, United States, 37.7983, -89.0305 Hatillo de Loba, Colombia, 8.9586, -74.0808 Harrow on the Hill, United Kingdom, 51.5655, -0.3327 Bejar, Spain, 40.3833, -5.7667 Riverview, United States, 42.1723, -83.1946 Perdigao, Brazil, -19.9528, -45.0839 Dagmara, India, 26.3953, 86.7601 Cordoba, Colombia, 9.5867, -74.8272 Pargas, Finland, 60.3000, 22.3000 Pantepec, Mexico, 17.1833, -93.0500 Jeronimo Monteiro, Brazil, -20.7894, -41.3950 Kamalnagar, India, 18.2310, 77.1791 Razua, Burma, 22.0529, 93.4086 Crossville, United States, 35.9526, -85.0295 Harnes, France, 50.4458, 2.9067 Villa Union, Argentina, -29.3000, -68.2000 Beylaqan, Azerbaijan, 39.7692, 47.6156 Burladingen, Germany, 48.2903, 9.1094 Geeste, Germany, 52.6000, 7.2667 Cicciano, Italy, 40.9667, 14.5333 Son Servera, Spain, 39.6208, 3.3600 Doi Lo, Thailand, 18.4667, 98.7833 Perth East, Canada, 43.4700, -80.9500 Tijucas do Sul, Brazil, -25.9278, -49.1989 Godohou, Benin, 7.0333, 1.7833 Tzintzuntzan, Mexico, 19.6283, -101.5789 Stanytsia Luhanska, Ukraine, 48.6706, 39.4722 Effingham, United States, 39.1205, -88.5509 Nurhak, Turkey, 37.9658, 37.4272 Teixeiras, Brazil, -20.6508, -42.8569 Anderlues, Belgium, 50.4073, 4.2698 Gandara West, Sri Lanka, 5.9333, 80.6000 Gavardo, Italy, 45.5875, 10.4389 Belen, Argentina, -27.6500, -67.0333 Ban Tap Tao, Thailand, 19.7154, 100.2906 Marumori, Japan, 37.9114, 140.7654 Juchipila, Mexico, 21.4103, -103.1175 Abu Dis, West Bank, 31.7622, 35.2617 Acala del Rio, Spain, 37.5167, -5.9667 Paiker, India, 24.4388, 87.9112 Mekra, India, 25.4705, 85.8406 Mahespur, India, 24.6954, 87.9414 Khujner, India, 23.7860, 76.6177 Chasiv Yar, Ukraine, 48.5884, 37.8359 Senjan, Iran, 34.0506, 49.6214 Eral, India, 8.6258, 78.0228 North Middleton, United States, 40.2462, -77.2168 Sao Joao do Araguaia, Brazil, -5.3578, -48.7908 Iguaraci, Brazil, -7.8350, -37.5150 Saiyan, India, 26.9433, 77.9419 Pital, Colombia, 2.9870, -75.8260 Ogulin, Croatia, 45.2669, 15.2248 Ouenou, Benin, 9.7870, 2.6375 Kallanai, India, 10.0374, 78.0829 Zaboli, Iran, 27.1283, 61.6722 Boloso, Congo (Brazzaville), 2.0333, 15.2000 Linkenheim-Hochstetten, Germany, 49.1261, 8.4100 Doddanahalli, India, 12.3892, 76.9672 Manamodu, India, 11.1965, 79.5953 Engenheiro Paulo de Frontin, Brazil, -22.5500, -43.6778 Spresiano, Italy, 45.7833, 12.2500 Porto Valter, Brazil, -8.2686, -72.7439 East Renton Highlands, United States, 47.4718, -122.0854 Selston, United Kingdom, 53.0700, -1.3000 Lila, Philippines, 9.6000, 124.1000 Carnaubeira da Penha, Brazil, -8.3219, -38.7439 Neralakaje, India, 12.5884, 75.0348 Narala, India, 12.5884, 75.0348 Ban Huai So Nuea, Thailand, 20.0536, 100.2828 Cuichapa, Mexico, 18.7600, -96.8167 Newcastle, United States, 35.2401, -97.5995 Osterhofen, Germany, 48.7019, 13.0200 Sala Consilina, Italy, 40.4000, 15.6000 Tempoal de Sanchez, Mexico, 21.5167, -98.3833 Itiquira, Brazil, -17.2089, -54.1500 Guidel, France, 47.7914, -3.4872 Maili, United States, 21.4133, -158.1701 Sidi Aoun, Algeria, 33.5422, 6.9050 North Castle, United States, 41.1331, -73.6949 North Saanich, Canada, 48.6142, -123.4200 Teningen, Germany, 48.1269, 7.8103 Ramabitsa, Lesotho, -29.7625, 27.6139 Kinrooi, Belgium, 51.1453, 5.7409 Beatrice, United States, 40.2736, -96.7455 Razlog, Bulgaria, 41.8865, 23.4680 Gopalnagar, India, 22.8289, 88.2139 Chamarru, India, 16.6500, 80.1333 Presidencia de la Plaza, Argentina, -26.9833, -59.8333 Chateaubriant, France, 47.7178, -1.3750 Morbegno, Italy, 46.1333, 9.5667 West Deer, United States, 40.6351, -79.8693 Bhachhi Asli, India, 26.0147, 86.0444 Hattem, Netherlands, 52.4744, 6.0697 Meitingen, Germany, 48.5333, 10.8333 Barentin, France, 49.5500, 0.9500 Karrapur, India, 23.9489, 78.8658 Affoltern am Albis, Switzerland, 47.2817, 8.4502 Louvres, France, 49.0447, 2.5056 Barra do Ribeiro, Brazil, -30.2908, -51.3008 Emboscada, Paraguay, -25.1241, -57.3481 Santa Cruz Michapa, El Salvador, 13.7333, -88.9667 Warwick, Australia, -28.2152, 152.0352 Mikashevichy, Belarus, 52.2203, 27.4736 Hassi Fedoul, Algeria, 35.4333, 2.2167 Ammapettai, India, 11.6197, 77.7426 Leeds, United States, 33.5436, -86.5639 Dharmastala, India, 12.9479, 75.3807 El Campo, United States, 29.2000, -96.2723 Pathra, India, 24.8804, 87.0447 Bampur, Iran, 27.1950, 60.4547 Haaren, Germany, 50.7956, 6.1269 Puduvayal, India, 10.1034, 78.8462 Chene-Bougeries, Switzerland, 46.1833, 6.1833 Havixbeck, Germany, 51.8111, 7.4167 Currimao, Philippines, 18.0203, 120.4864 Fomeque, Colombia, 4.4847, -73.8936 Hanur, India, 12.0874, 77.3021 Bom Lugar, Brazil, -4.2200, -45.0389 Arara, Brazil, -6.8278, -35.7578 Castelnaudary, France, 43.3192, 1.9544 Oftersheim, Germany, 49.3706, 8.5847 Bischwiller, France, 48.7667, 7.8575 Tsuruta, Japan, 40.7588, 140.4285 Yakoma, Congo (Kinshasa), 4.0982, 22.4432 Sollies-Pont, France, 43.1911, 6.0417 Chichli, India, 22.8336, 78.8261 Okabecho-okabe, Japan, 34.9167, 138.2833 Kumirimora, India, 22.6969, 88.2267 Ghogha, India, 21.6800, 72.2800 Anao, Philippines, 15.7304, 120.6264 Hengshan, Taiwan, 24.7100, 121.1369 Choctaw, United States, 35.4802, -97.2666 Lauriya Nandangarh, India, 26.9985, 84.4085 Rottofreno, Italy, 45.0579, 9.5489 Rosaryville, United States, 38.7672, -76.8266 Josefina, Philippines, 8.2144, 123.5439 Profondeville, Belgium, 50.3777, 4.8692 Kolanpak, India, 17.6942, 79.0348 Pouso Redondo, Brazil, -27.2578, -49.9339 Yakouren, Algeria, 36.7333, 4.4500 Monfort Heights, United States, 39.1823, -84.6075 Brejinho, Brazil, -6.1908, -35.3569 Kottagudi Muttanad, India, 10.0133, 77.0633 Montecorvino Rovella, Italy, 40.7000, 14.9833 Koriukivka, Ukraine, 51.7833, 32.2500 McComb, United States, 31.2442, -90.4716 Gig Harbor, United States, 47.3352, -122.5964 Mantenopolis, Brazil, -18.8628, -41.1228 Sabbavaram, India, 17.7900, 83.1230 Belwa, India, 26.1056, 87.4916 Karaburun, Turkey, 38.6333, 26.5167 Bella Union, Uruguay, -30.2500, -57.5833 Qiziltepa, Uzbekistan, 40.0361, 64.8503 Paxtaobod, Uzbekistan, 40.3453, 68.1925 Kuyganyor, Uzbekistan, 40.8611, 72.3111 Andijon, Uzbekistan, 40.6444, 72.3639 Yangiariq, Uzbekistan, 41.3628, 60.6075 Loberia, Argentina, -38.1333, -58.7667 Paranatama, Brazil, -8.9208, -36.6581 Sao Lourenco da Serra, Brazil, -23.8528, -46.9428 Loiyo, India, 23.7928, 85.6320 Temsamane, Morocco, 35.1167, -3.6333 Sogndal, Norway, 61.2315, 7.1027 Cristais, Brazil, -20.8758, -45.5189 Santa Leopoldina, Brazil, -20.0987, -40.5269 Midsomer Norton, United Kingdom, 51.2842, -2.4817 Rudrur, India, 18.6700, 77.9000 Concepcion Batres, El Salvador, 13.3500, -88.3667 Bukkapatnam, India, 14.2000, 77.8000 Mariyammanahalli, India, 15.1600, 76.3600 Doranda, India, 24.4710, 85.9449 Te Awamutu, New Zealand, -38.0083, 175.3250 Sable-sur-Sarthe, France, 47.8505, -0.3292 Port Victoria, Kenya, 0.0981, 33.9725 Kafr Buhum, Syria, 35.0596, 36.6991 La Magdalena Chichicaspa, Mexico, 19.4181, -99.3228 Milford, United States, 38.9091, -75.4227 Unguia, Colombia, 8.0500, -77.1000 Washington, United States, 38.6586, -87.1591 Hobro, Denmark, 56.6381, 9.7953 Turki, India, 26.0381, 85.3577 Hnivan, Ukraine, 49.0911, 28.3486 Adelaide, South Africa, -32.7078, 26.2956 Boskovice, Czechia, 49.4875, 16.6600 Namchi, India, 27.1700, 88.3500 Russi, Italy, 44.3764, 12.0334 Santiago, Costa Rica, 9.8291, -84.3044 Guisser, Morocco, 32.7667, -7.5000 Marechal Floriano, Brazil, -20.4128, -40.6828 Karimkunnum, India, 9.8500, 76.6833 Malvinas Argentinas, Argentina, -31.3697, -64.0531 Frohburg, Germany, 51.0561, 12.5550 Tholey, Germany, 49.4667, 7.0333 Saraiya, India, 25.6467, 84.6312 San Mauro Pascoli, Italy, 44.1000, 12.4167 German Flatts, United States, 42.9868, -74.9804 Vulcanesti, Moldova, 45.6842, 28.4028 Gardnerville Ranchos, United States, 38.8957, -119.7492 Ujfeherto, Hungary, 47.8000, 21.6833 'Ain Kerma, Algeria, 36.5939, 8.2011 El Aargub, Morocco, 23.6111, -15.8583 Santo Domingo, Nicaragua, 12.2500, -85.0667 Bashtanka, Ukraine, 47.4056, 32.4375 Nevele, Belgium, 51.0333, 3.5500 Kuttur, India, 10.5631, 76.1951 Caledonia, Canada, 43.0773, -79.9514 Pianiga, Italy, 45.4561, 12.0302 Pasca, Colombia, 4.3075, -74.3008 Bhaisalotan, India, 27.4500, 83.9167 Katagon, Benin, 6.6333, 2.5833 Saint-Ave, France, 47.6872, -2.7333 Uppukkottai, India, 9.9587, 77.4105 Bully-les-Mines, France, 50.4425, 2.7253 Sandy, United Kingdom, 52.1310, -0.2970 Buchach, Ukraine, 49.0833, 25.4000 Prevost, Canada, 45.8700, -74.0800 Ruti, Switzerland, 47.2614, 8.8556 Craponne, France, 45.7400, 4.7200 Ghoradal, India, 22.0519, 88.3594 Sakawa, Japan, 33.5000, 133.2833 Tomuk, Turkey, 36.6667, 34.3833 Villamartin, Spain, 36.8667, -5.6500 Felpham, United Kingdom, 50.7905, -0.6539 La Motte-Servolex, France, 45.5975, 5.8783 Olton, United Kingdom, 52.4377, -1.8058 Srinagar, India, 25.9823, 86.6662 Nemili, India, 12.9783, 79.6172 Tioribougou, Mali, 13.3808, -7.9872 Bhankarpur, India, 30.6500, 76.8200 Ballston, United States, 42.9542, -73.8794 Campos del Puerto, Spain, 39.4306, 3.0194 Castello de Ampurias, Spain, 42.2583, 3.0750 Attleborough, United Kingdom, 52.5183, 1.0192 Le Grand-Saconnex, Switzerland, 46.2333, 6.1167 Santa Elena, Honduras, 14.0942, -88.1096 Matala, India, 17.8244, 76.8591 Kayattar, India, 8.9469, 77.7714 Ait Ourir, Morocco, 31.5644, -7.6628 Puerto Nare, Colombia, 6.1917, -74.5867 Kottaya, India, 10.7646, 76.5452 Vannivedu, India, 12.9173, 79.3530 Sagon, Benin, 7.1500, 2.4167 Na Wa, Thailand, 17.4897, 104.1006 Khonobod, Tajikistan, 40.2000, 70.6000 Ebejico, Colombia, 6.3333, -75.7667 Socuellamos, Spain, 39.2933, -2.7942 Raipur, India, 26.0500, 74.0200 Kalli Pachchhim, India, 26.7167, 80.9000 Riedisheim, France, 47.7489, 7.3675 Polyarnyy, Russia, 69.2000, 33.4667 Gajhara, India, 26.5237, 86.3715 Tamalpais-Homestead Valley, United States, 37.8793, -122.5382 Blonie, Poland, 52.2000, 20.6167 Brattleboro, United States, 42.8619, -72.6145 Morab, India, 15.5833, 75.1667 Nordstemmen, Germany, 52.1667, 9.7667 Oyon, Peru, -10.6692, -76.7728 Raghopur, India, 25.3180, 87.0080 Samadh Bhai, India, 30.5985, 75.1506 Huixcolotla, Mexico, 18.9147, -97.7736 Wasilkow, Poland, 53.2050, 23.2044 Marquetalia, Colombia, 5.3333, -75.0000 Arganil, Portugal, 40.2183, -8.0542 Kesarimangalam, India, 11.5423, 77.7247 Ban Bo Luang, Thailand, 18.1505, 98.3508 Durmersheim, Germany, 48.9383, 8.2769 Cocotitlan, Mexico, 19.2167, -98.8500 Macedonia, United States, 41.3147, -81.4989 Panzgam, India, 34.4840, 74.0753 Grumo Appula, Italy, 41.0167, 16.7000 Hallbergmoos, Germany, 48.3333, 11.7500 Raismes, France, 50.3897, 3.4867 Tranent, United Kingdom, 55.9450, -2.9540 Eklahra, India, 22.2036, 78.6893 Barsaun, India, 25.6316, 84.4372 Vandamettu, India, 9.7167, 77.1500 Scotts Valley, United States, 37.0555, -122.0118 Mucuge, Brazil, -13.0050, -41.3708 Xiushuicun, China, 25.1728, 113.0007 Muthuswamipuram, India, 9.3900, 77.4887 Minabe, Japan, 33.7725, 135.3206 As Sars, Tunisia, 36.0833, 9.0167 Sainte-Adele, Canada, 45.9500, -74.1300 Sapna, Bosnia and Herzegovina, 44.4917, 19.0028 Ban Bang Sai, Thailand, 13.4005, 100.9994 Ban Noen Phoem, Thailand, 17.1167, 100.8667 Richland, United States, 40.2842, -78.8449 Sainte-Agathe-des-Monts, Canada, 46.0500, -74.2800 Justo Daract, Argentina, -33.8667, -65.1667 Mulug, India, 18.1910, 79.9430 Bomlo, Norway, 59.6000, 5.2167 Salgado de Sao Felix, Brazil, -7.3569, -35.4406 Vrchlabi, Czechia, 50.6278, 15.6103 Strzelin, Poland, 50.7833, 17.0667 Benifayo, Spain, 39.2847, -0.4281 Oulad Hamdane, Morocco, 32.3333, -6.3667 Gardere, United States, 30.3582, -91.1346 Provadia, Bulgaria, 43.1694, 27.4428 Mangarwara, India, 26.0119, 87.0854 Pachchaimalaiyankottai, India, 10.2736, 77.8794 Mandu, India, 23.7946, 85.4687 Bamber Bridge, United Kingdom, 53.7281, -2.6606 Bela Palanka, Serbia, 43.2178, 22.3067 Hagfors, Sweden, 60.0333, 13.6500 Lower Gwynedd, United States, 40.1880, -75.2373 Antri, India, 26.0581, 78.2100 Ampasimbe, Madagascar, -16.8220, 49.0029 Cherlak, Russia, 54.1605, 74.8200 Velair, India, 18.0071, 79.3272 Ishkashim, Afghanistan, 36.7092, 71.5739 Kuzhippilli, India, 10.0150, 76.2200 Bad Fallingbostel, Germany, 52.8675, 9.6967 Anatoli, Greece, 39.6333, 20.8667 Hassi el Ghella, Algeria, 35.4500, -1.0500 Kharar, India, 22.7000, 87.6800 Kok-Janggak, Kyrgyzstan, 41.0307, 73.2058 Saclepea, Liberia, 7.1167, -8.8333 Brzeziny, Poland, 51.8000, 19.7500 Kamianka-Dniprovska, Ukraine, 47.4628, 34.4061 Richmond, United States, 29.5824, -95.7563 Lewisboro, United States, 41.2697, -73.5828 Big Lake, United States, 45.3417, -93.7434 Coria, Spain, 39.9819, -6.5372 Choro, Brazil, -4.8428, -39.1408 Champahati, India, 22.4043, 88.4937 San Prisco, Italy, 41.0991, 14.2766 Olenegorsk, Russia, 68.1500, 33.2833 Quesnel, Canada, 52.9784, -122.4927 Miesbach, Germany, 47.7833, 11.8333 Citlaltepec, Mexico, 21.3297, -97.8789 Yecuatla, Mexico, 19.8667, -96.7833 Somerset, United States, 37.0834, -84.6109 Hwlffordd, United Kingdom, 51.8000, -4.9700 Gistel, Belgium, 51.1500, 2.9667 Munduri, Brazil, -8.1628, -40.6158 Mohnesee, Germany, 51.4958, 8.1306 Ladol, India, 23.6167, 72.7333 Pulakurti, India, 15.7502, 77.7091 Sonupur, India, 25.8000, 86.0253 Punnila, India, 9.0842, 76.9175 Yedtare, India, 13.9246, 74.6171 Jerico, Colombia, 5.7833, -75.7833 Bharweli, India, 21.8373, 80.2271 Kinkala, Congo (Brazzaville), -4.3567, 14.7589 Xylokastro, Greece, 38.0667, 22.6333 Tahannawt, Morocco, 31.3514, -7.9508 Datoda, India, 22.5713, 75.8823 San Bartolo Yautepec, Mexico, 16.4200, -95.9100 Taltal, Chile, -25.2833, -69.7667 El Marsa, Algeria, 36.8111, 3.2556 Montrose, United Kingdom, 56.7080, -2.4670 Manegaon, India, 23.2062, 80.0123 Waikanae, New Zealand, -40.8760, 175.0640 Glubczyce, Poland, 50.2011, 17.8247 Gulbahor, Uzbekistan, 41.0747, 69.0275 Tring, United Kingdom, 51.7962, -0.6592 Lenyenye, South Africa, -23.9720, 30.2690 Mattenhof, Switzerland, 47.5165, 8.8020 Umm ar Rizam, Libya, 32.5325, 23.0053 Benoy, Chad, 8.9908, 16.3169 Dent, United States, 39.1915, -84.6601 Munchenstein, Switzerland, 47.5186, 7.6174 Kirippatti, India, 11.5357, 78.4897 Oulad Fares, Morocco, 35.5167, -5.9333 Acandi, Colombia, 8.5333, -77.2333 Bhairapura, India, 12.2119, 76.8953 Anndevarapeta, India, 17.0937, 81.5799 Villars-sur-Glane, Switzerland, 46.7833, 7.1167 Wolgast, Germany, 54.0500, 13.7667 Pillanallur, India, 11.4322, 78.1334 Osako, Japan, 31.4292, 131.0058 Douar Ras el Ksar, Morocco, 33.9819, -3.7494 Bni Khloug, Morocco, 32.6500, -7.3833 Dire, Mali, 16.2667, -3.4000 Yeadon, United States, 39.9325, -75.2527 Steenokkerzeel, Belgium, 50.9188, 4.5114 Mostardas, Brazil, -31.1069, -50.9208 Kosjeric, Serbia, 44.0000, 19.9167 North Tidworth, United Kingdom, 51.2370, -1.6640 Narhat, India, 24.7774, 85.4237 Mettlach, Germany, 49.4942, 6.6052 Si Mustapha, Algeria, 36.7247, 3.6153 Sedgley, United Kingdom, 52.5400, -2.1230 Mmadinare, Botswana, -21.8765, 27.7518 Baozhong, Taiwan, 23.6956, 120.3117 St. Peter, United States, 44.3295, -93.9658 Holyhead, United Kingdom, 53.3090, -4.6330 Papampeta, India, 14.6855, 77.5780 Ganapatipalaiyam, India, 11.0309, 77.3367 Cherdakly, Russia, 54.3591, 48.8487 Ban Muang Ngam, Thailand, 7.3508, 100.4885 Wyndham, United States, 37.6924, -77.6123 Paal, Belgium, 51.0392, 5.1728 Ipaumirim, Brazil, -6.7900, -38.7189 Mugalivakkam, India, 13.0205, 80.1653 Kodusseri, India, 10.3431, 76.3931 Birdaban, India, 26.4012, 84.9934 Dalby, Australia, -27.1813, 151.2661 Steinheim am der Murr, Germany, 48.9667, 9.2833 Glen Rock, United States, 40.9601, -74.1250 Beaconsfield, United Kingdom, 51.6009, -0.6347 Motta Sant'Anastasia, Italy, 37.5000, 14.9667 Rampur Kudarkatti, India, 26.0672, 87.4795 Nihal Singhwala, India, 30.5919, 75.2804 Borgosesia, Italy, 45.7169, 8.2764 Minnehaha, United States, 45.6577, -122.6204 Viswanathaperi, India, 9.3359, 77.4500 Bhagwanpur Desua, India, 25.8124, 85.8382 Unebicho, Japan, 34.4806, 135.7926 Finneytown, United States, 39.2159, -84.5144 Iwate, Japan, 39.9728, 141.2122 Ibicuy, Argentina, -33.7333, -59.1833 Caimito, Colombia, 8.8333, -75.1667 Cogolin, France, 43.2526, 6.5300 Ugento, Italy, 39.9333, 18.1667 Piketberg, South Africa, -32.9000, 18.7667 Nova Laranjeiras, Brazil, -25.3069, -52.5408 La Queue-en-Brie, France, 48.7900, 2.5775 Falesti, Moldova, 47.5722, 27.7139 Paslek, Poland, 54.0500, 19.6667 Kalaidasht, Tajikistan, 38.6333, 69.5000 Kesabpur, India, 22.6196, 88.2075 North Lebanon, United States, 40.3668, -76.4215 Halasztelek, Hungary, 47.3608, 18.9878 Commerce, United States, 33.9963, -118.1519 New Kensington, United States, 40.5712, -79.7523 Saint-Pierre-du-Perray, France, 48.6123, 2.4952 Dhaula, India, 30.2856, 75.4602 Tabua, Portugal, 40.3667, -8.0333 Fenton, United Kingdom, 52.9977, -2.1578 Abasolo, Mexico, 24.0559, -98.3733 Liuba, China, 38.1833, 102.1833 Key Largo, United States, 25.1224, -80.4120 Sinalunga, Italy, 43.2167, 11.7333 Uludere, Turkey, 37.4460, 42.8520 Bolanos de Calatrava, Spain, 38.8831, -3.7167 Hasbrouck Heights, United States, 40.8618, -74.0741 Filandia, Colombia, 4.6667, -75.6333 Khanpur, India, 25.8572, 85.9330 Moss Point, United States, 30.4241, -88.5289 Poranga, Brazil, -4.7450, -40.9258 Curiti, Colombia, 6.6667, -73.0000 Sao Francisco do Maranhao, Brazil, -6.2508, -42.8569 Oiba, Colombia, 6.2667, -73.3000 Bishnah, India, 32.6106, 74.8556 Andraitx, Spain, 39.5833, 2.4167 Onet Village, France, 44.3664, 2.5942 Bharokhara, India, 25.8655, 85.6834 Pharkia, India, 25.9384, 87.4034 Hawkwell, United Kingdom, 51.5921, 0.6737 Budakalasz, Hungary, 47.6215, 19.0460 Hodatsushimizu, Japan, 36.8627, 136.7976 Ponte da Barca, Portugal, 41.8078, -8.4194 Somersworth, United States, 43.2534, -70.8856 New Baltimore, United States, 42.6904, -82.7398 Oulad Hamdane, Morocco, 35.2167, -5.9667 Rapho, United States, 40.1576, -76.4580 Arroio do Tigre, Brazil, -29.3328, -53.0928 Jacala, Mexico, 21.0053, -99.1719 Nattarampalli, India, 12.5920, 78.5116 Trimbak, India, 19.9300, 73.5300 Sassenburg, Germany, 52.5167, 10.6333 Tall Dhahab, Syria, 34.9114, 36.4928 Walton-on-the-Naze, United Kingdom, 51.8480, 1.2680 Chalgeri, India, 14.5652, 75.7166 Prairie Ridge, United States, 47.1438, -122.1408 Solofra, Italy, 40.8333, 14.8500 Eiras, Portugal, 40.2421, -8.4240 Porto, Brazil, -3.8928, -42.7100 Gundelfingen, Germany, 48.0500, 7.8667 Bangawan, India, 26.0427, 87.4202 Ban Pae, Thailand, 18.2108, 98.6164 Goner, India, 26.7795, 75.9123 Kingsteignton, United Kingdom, 50.5458, -3.5962 Bentley, United Kingdom, 53.5510, -1.1440 Gbanhi, Benin, 8.4497, 2.4737 Lajia, China, 34.6797, 100.6406 Snihurivka, Ukraine, 47.0736, 32.8000 Karagwe, Uganda, 0.6769, 30.1967 Valenii de Munte, Romania, 45.1856, 26.0397 Sarmastpur, India, 25.9490, 85.5751 Vilangurichchi, India, 11.0709, 77.0178 Khvalynsk, Russia, 52.4833, 48.1000 Mettingen, Germany, 52.3167, 7.7806 Pyrzyce, Poland, 53.1333, 14.8833 Rocca Priora, Italy, 41.7833, 12.7667 Baxiangshan, China, 23.7642, 115.9696 Manne Ekeli, India, 17.7200, 77.3600 Bagra, India, 25.2000, 72.5833 Mato Verde, Brazil, -15.3969, -42.8658 Mistelbach, Austria, 48.5667, 16.5667 Pittalavanipalem, India, 15.9686, 80.6054 Uyar, Russia, 55.8267, 94.3153 Kongsvinger, Norway, 60.1905, 11.9977 Imassogo, Burkina Faso, 12.4393, -2.3331 Heddesheim, Germany, 49.5053, 8.6033 Bonyhad, Hungary, 46.3000, 18.5300 Mettuppalaiyam, India, 11.4503, 77.5682 Karvetnagar, India, 13.4167, 79.4500 Paramanandal, India, 12.3585, 78.7664 Oak Grove, United States, 33.9780, -81.1468 Iapu, Brazil, -19.4369, -42.2178 Sabaur, India, 25.2428, 87.0446 Beydag, Turkey, 38.0833, 28.2333 Villa Berthet, Argentina, -27.2667, -60.4167 Lehre, Germany, 52.3167, 10.6667 Duverge, Dominican Republic, 18.3188, -71.5945 Edamon, India, 9.0000, 76.9667 Ronneby, Sweden, 56.2000, 15.3000 Slawno, Poland, 54.3667, 16.6833 Kameshkovo, Russia, 56.3500, 41.0000 Ocean Pines, United States, 38.3851, -75.1487 Cheadle, United Kingdom, 52.9849, -1.9865 Assomada, Cabo Verde, 15.0949, -23.6654 Perleberg, Germany, 53.0667, 11.8667 Gulni, India, 24.9309, 85.8030 Theux, Belgium, 50.5352, 5.8132 Kingsnorth, United Kingdom, 51.1178, 0.8615 Wakefield, United States, 38.8230, -77.2406 River Edge, United States, 40.9269, -74.0387 Chudamani, India, 21.1379, 86.7794 Bound Brook, United States, 40.5676, -74.5383 Portales, United States, 34.1754, -103.3565 Utehia, India, 26.4484, 81.3651 Honeygo, United States, 39.4055, -76.4282 Charlton Kings, United Kingdom, 51.8877, -2.0413 Huite, Guatemala, 14.9333, -89.7167 Kumarkhali, India, 22.3598, 88.7990 Nariman, Kyrgyzstan, 40.5972, 72.7946 Hornsby Bend, United States, 30.2388, -97.5899 Westphalia, United States, 38.8356, -76.8298 Beyne-Heusay, Belgium, 50.6167, 5.6500 Goulds, United States, 25.5614, -80.3880 Septemes-les-Vallons, France, 43.3992, 5.3667 Velivennu, India, 16.5034, 81.4116 San Jose El Idolo, Guatemala, 14.4500, -91.4167 Occhiobello, Italy, 44.9216, 11.5812 Martinsville, United States, 40.6030, -74.5751 Balha, India, 25.5468, 86.5683 Weatherford, United States, 35.5380, -98.6853 Tomar do Geru, Brazil, -11.3728, -37.8408 Sahtah, India, 25.8567, 85.2407 Shady Hills, United States, 28.4042, -82.5468 Guaitarilla, Colombia, 1.1333, -77.5564 Kulasekarapatnam, India, 8.4000, 78.0500 Les Iles-de-la-Madeleine, Canada, 47.3833, -61.8667 Monte San Giovanni Campano, Italy, 41.6333, 13.5167 Opmeer, Netherlands, 52.7000, 4.9500 Centralia, United States, 38.5224, -89.1232 Fort Bliss, United States, 31.8396, -106.3747 Carmen de Areco, Argentina, -34.3858, -59.8294 Erkner, Germany, 52.4167, 13.7500 Raffadali, Italy, 37.4047, 13.5339 Sam, Benin, 11.0333, 2.7333 Jardim Alegre, Brazil, -24.1789, -51.6919 Fuensalida, Spain, 40.0500, -4.2000 Gyomaendrod, Hungary, 46.9361, 20.8233 Singhbari, India, 25.3761, 87.9485 Viyapuram, India, 9.3167, 76.4667 San Gennaro Vesuviano, Italy, 40.8667, 14.5333 Warka, Poland, 51.7833, 21.2000 Basantpur, India, 26.1331, 87.4656 El Carmen, Colombia, 8.5128, -73.4508 Hukumati Gizab, Afghanistan, 33.3813, 66.2655 Jajce, Bosnia and Herzegovina, 44.3417, 17.2694 Karranah, Bahrain, 26.2306, 50.5108 Ngou, Cameroon, 5.2000, 10.3833 Tefam, Cameroon, 5.2667, 10.4667 Wells, United Kingdom, 51.2094, -2.6450 Madina do Boe, Guinea-Bissau, 11.7500, -14.2167 Princetown, Guyana, 5.9049, -57.1391 Petit-Goave, Haiti, 18.4314, -72.8669 Padang, Indonesia, -0.9500, 100.3531 Huvin Hippargi, India, 16.5900, 75.9600 Tarhala, India, 20.3936, 77.2959 Pinneli, India, 16.5689, 79.8334 Dahivel, India, 21.0667, 74.1667 Jai, India, 28.9833, 77.9333 Ramachandrapuram, India, 16.5689, 81.6645 Sadalgi, India, 16.4200, 74.5800 Halgar, India, 18.0958, 76.8881 Arni ka Khera, India, 24.9000, 74.3300 Khanda, India, 28.9167, 76.8833 Cecchina, Italy, 41.7016, 12.6497 Hasroun, Lebanon, 34.2419, 35.9794 El Qaa, Lebanon, 34.3436, 36.4756 Chaqra, Lebanon, 33.1917, 35.4628 Bteghrine, Lebanon, 33.9300, 35.7450 Qoubaiyat, Lebanon, 34.5683, 36.2764 Ambolomoty, Madagascar, -16.1613, 46.6990 Fanambana, Madagascar, -13.5530, 49.9890 Ivoamba, Madagascar, -21.3932, 47.1554 Ankafina Tsarafidy, Madagascar, -21.2000, 47.2500 Ambohimandroso, Madagascar, -21.8886, 46.9604 Belobaka, Madagascar, -15.6906, 46.4190 Andonabe, Madagascar, -21.4619, 47.9509 Sorombo, Madagascar, -22.1000, 47.9167 Itondy, Madagascar, -19.0625, 45.3477 Iarinarivo, Madagascar, -18.9167, 47.4000 Saharefo, Madagascar, -21.6713, 47.6888 Vohindava, Madagascar, -22.4139, 47.8634 Beandrarezona, Madagascar, -14.4847, 48.6802 Andranovao, Madagascar, -17.6180, 44.0616 Sendrisoa, Madagascar, -22.0030, 46.9529 Maromiandra, Madagascar, -21.7038, 47.5196 Ambalavero, Madagascar, -21.8115, 47.7827 Bekapaika, Madagascar, -16.7477, 47.5571 Anorombato, Madagascar, -22.0143, 47.7915 Ambaliha, Madagascar, -14.5342, 48.2196 Ambohinamboarina, Madagascar, -21.0309, 47.0501 Anjanazana, Madagascar, -15.3845, 49.7531 Andrembesoa, Madagascar, -20.1484, 46.6602 Mahazoarivo, Madagascar, -21.3732, 46.8228 Anjiamangirana I, Madagascar, -15.1669, 47.7786 Nosiarina, Madagascar, -14.2109, 50.0438 Antanamalaza, Madagascar, -19.4086, 47.6452 Andramy, Madagascar, -17.9645, 44.7851 Basibasy, Madagascar, -22.1767, 43.6595 Ampondra, Madagascar, -13.4281, 49.9666 Antaritarika, Madagascar, -25.3968, 45.7581 Befody, Madagascar, -20.7798, 47.9367 Maromby, Madagascar, -24.3531, 46.5765 San Marcos, Mexico, 16.7958, -99.3833 Omatjete, Namibia, -21.0500, 15.5000 Abdul Khel, Pakistan, 32.3997, 70.9136 Saidpur, Pakistan, 33.7421, 73.0677 Umm Badr, Sudan, 14.2333, 27.9500 Buqkoosaar, Somalia, 4.5109, 44.8165 San Pedro Nonualco, El Salvador, 13.6000, -88.9333 Keve, Togo, 6.4278, 0.9245 Keimoes, South Africa, -28.7000, 20.9667 Sokouhoue, Benin, 6.9000, 1.6667 Urakawa, Japan, 42.1667, 142.7667 Tirhassaline, Morocco, 32.7833, -5.6500 Floresti, Moldova, 47.8933, 28.3014 Arutla, India, 17.1346, 78.7574 Talen, India, 23.5695, 76.7282 Cimislia, Moldova, 46.5200, 28.7842 Barberton, South Africa, -25.7861, 31.0531 Port Wentworth, United States, 32.1951, -81.1991 Manuel Urbano, Brazil, -8.8389, -69.2600 Galvarino, Chile, -38.4000, -72.7833 Saint-Cyprien, France, 42.6189, 3.0069 East Bethel, United States, 45.3557, -93.2038 Doranala, India, 15.9000, 79.1000 Wegrow, Poland, 52.4000, 22.0167 Mugdampalli, India, 17.6167, 77.4974 Wang Saphung, Thailand, 17.3010, 101.7685 Pike Creek Valley, United States, 39.7294, -75.6989 Archdale, United States, 35.9032, -79.9591 Pokrovsk, Russia, 61.4833, 129.1500 Alajuelita, Costa Rica, 9.9035, -84.0996 Mikkelin Maalaiskunta, Finland, 61.6776, 27.2021 Martuni, Armenia, 40.1400, 45.3064 Shiotacho-matsusaki, Japan, 33.1268, 130.0589 Mazagao, Brazil, -0.1150, -51.2889 Talant, France, 47.3372, 5.0064 Husepur, India, 26.4609, 84.1699 Gladstone, United States, 45.3864, -122.5934 Tundhul, India, 23.3247, 85.2447 Msambweni, Kenya, -4.4667, 39.4667 Escazu, Costa Rica, 9.9160, -84.1459 Oberschleissheim, Germany, 48.2500, 11.5667 Kaviti, India, 19.0167, 84.6833 Yazihan, Turkey, 38.5969, 38.1878 Arth, Switzerland, 47.0644, 8.5242 Wolnzach, Germany, 48.6000, 11.6167 Iwanai, Japan, 42.9789, 140.5092 Pata Putrela, India, 17.0173, 80.7137 Marly, France, 50.3490, 3.5450 Boldaji, Iran, 31.9356, 51.0544 Klazienaveen, Netherlands, 52.7282, 7.0004 Tabocas do Brejo Velho, Brazil, -12.7058, -44.0069 Haro, Spain, 42.5833, -2.8500 Arakvaz-e Malekshahi, Iran, 33.3847, 46.5997 Welver, Germany, 51.6167, 7.9583 Siruvachchur, India, 11.6380, 78.7557 Minnal, India, 13.0744, 79.5590 Belampona, Madagascar, -14.6551, 49.5652 Woodward, United States, 36.4247, -99.4058 Kuangfu, Taiwan, 23.6351, 121.4228 East Greenwich, United States, 39.7903, -75.2396 Rasingapuram, India, 9.9448, 77.3362 Hathauri, India, 25.9593, 85.9747 Erbaocun, China, 42.9581, 93.1153 West End, United Kingdom, 50.8861, -1.3699 Marauatpur, India, 25.6165, 85.4685 Kyzyl-Kyshtak, Kyrgyzstan, 40.5382, 72.7768 Eraclea, Italy, 45.5833, 12.6833 Bankya, Bulgaria, 42.7069, 23.1472 Kasaji, Congo (Kinshasa), -10.3662, 23.4500 Froha, Algeria, 35.3000, 0.1333 Liperi, Finland, 62.5333, 29.3833 Chepstow, United Kingdom, 51.6420, -2.6750 Malthone, India, 24.3055, 78.5283 Bernalda, Italy, 40.4167, 16.6833 Nueva Era, Philippines, 17.9200, 120.6700 Southborough, United Kingdom, 51.1598, 0.2652 Tetagunta, India, 17.3140, 82.4430 Mariana, Philippines, 14.6194, 121.0347 Stidia, Algeria, 35.8333, -0.3000 Taran, India, 26.1570, 87.5430 Bissora, Guinea-Bissau, 12.2167, -15.4500 Bissora, Guinea-Bissau, 12.0400, -15.4281 Inwood, United States, 40.6219, -73.7506 Bena, Burkina Faso, 12.0804, -4.1890 Zhengdong, China, 22.4819, 101.5078 Tigzirt, Algeria, 36.9000, 4.1167 Poulsbo, United States, 47.7417, -122.6407 Saksohara, India, 25.3635, 85.7013 Niagadina, Mali, 12.1339, -8.2289 Spencer, United States, 42.2471, -71.9919 Viralippatti, India, 10.1081, 77.7257 Red Bank, United States, 35.1117, -85.2962 Awankh, India, 32.1392, 75.4611 Terranuova Bracciolini, Italy, 43.5531, 11.5894 Kountouri, Benin, 10.4050, 0.9425 Paispamba, Colombia, 2.2500, -76.5833 Unterfohring, Germany, 48.2000, 11.6500 Karaund, India, 25.9741, 86.2343 Adalaj, India, 23.1700, 72.5800 Phuoc Long, Vietnam, 9.4194, 105.3842 Ibaretama, Brazil, -4.8039, -38.7528 Oberderdingen, Germany, 49.0625, 8.8019 Pudur, India, 11.2947, 77.7467 Lanham, United States, 38.9620, -76.8421 Noria, India, 32.5210, 74.7984 Vijayapati, India, 8.1913, 77.7476 Jiajin, China, 25.6743, 108.4228 Leominster, United Kingdom, 52.2282, -2.7385 Umurlu, Turkey, 37.8500, 27.9667 Tori-Cada, Benin, 6.5833, 2.2000 Arrigorriaga, Spain, 43.2078, -2.8861 Jadayampalaiyam, India, 11.2930, 76.9495 Blaricum, Netherlands, 52.2667, 5.2500 Sondho Dullah, India, 25.9016, 85.3569 Konaje, India, 12.8162, 74.9021 Trezzo sull'Adda, Italy, 45.6089, 9.5200 Nong Bua, Thailand, 15.8646, 100.5858 Seberi, Brazil, -27.4778, -53.4028 Amarapuuram, India, 14.1333, 76.9833 Pecica, Romania, 46.1700, 21.0700 Fenton, United States, 42.7994, -83.7144 El Parral, Mexico, 16.3662, -93.0067 Avesta, Sweden, 60.1500, 16.2000 Southwater, United Kingdom, 51.0238, -0.3526 Darabani, Romania, 48.1864, 26.5892 Umri, India, 26.5106, 78.9367 Zlate Moravce, Slovakia, 48.3781, 18.3964 Joaquim Tavora, Brazil, -23.4989, -49.9050 Alijo, Portugal, 41.2764, -7.4749 Governador Dix-Sept Rosado, Brazil, -5.4589, -37.5208 Khem Karan, India, 31.1450, 74.5450 Enns, Austria, 48.2167, 14.4750 Athol, United States, 42.5841, -72.2177 Cinisi, Italy, 38.1667, 13.1000 Lienz, Austria, 46.8297, 12.7697 Valchedram, Bulgaria, 43.7000, 23.4500 Don Sak, Thailand, 9.3168, 99.6918 Lagoa do Ouro, Brazil, -9.1269, -36.4589 San Andres de Llevaneras, Spain, 41.5733, 2.4828 Rijkevorsel, Belgium, 51.3489, 4.7597 Parappukara, India, 10.4064, 76.2657 Pfaffikon, Switzerland, 47.3667, 8.7822 Backa Topola, Serbia, 45.8167, 19.6333 Little Chute, United States, 44.2906, -88.3208 Neustadt, Germany, 51.0239, 14.2167 Dhanauri, India, 29.7833, 76.1833 Tectitan, Guatemala, 15.3333, -92.0333 Andrelandia, Brazil, -21.7400, -44.3089 Sai Kung Tuk, Hong Kong, 22.3814, 114.2733 Chaital, India, 22.5106, 88.7996 Panuco de Coronado, Mexico, 24.5392, -104.3253 Totogalpa, Nicaragua, 13.5667, -86.5000 South Miami, United States, 25.7079, -80.2952 Pedda Adsarlapalli, India, 16.7086, 79.0286 Tosashimizu, Japan, 32.7833, 132.9500 Vehkalahti, Finland, 60.5756, 27.1439 Mullurkara, India, 10.7000, 76.2667 Schoonhoven, Netherlands, 51.9475, 4.8486 Patarra, Costa Rica, 9.8637, -84.0248 Uzyn, Ukraine, 49.8242, 30.4425 Stuarts Draft, United States, 38.0188, -79.0354 Sansale, Guinea, 11.1167, -14.8500 Amizmiz, Morocco, 31.2167, -8.2500 Murnau am Staffelsee, Germany, 47.6833, 11.2000 Mandasa, India, 18.8683, 84.4630 `Anadan, Syria, 36.2935, 37.0447 Bilauri, India, 25.7703, 87.5163 Hatod, India, 22.7938, 75.7393 Tache, Canada, 49.7081, -96.6736 Wellington North, Canada, 43.9000, -80.5700 Paramankurichi, India, 8.4785, 78.0465 Martinsville, United States, 39.4149, -86.4316 Show Low, United States, 34.2671, -110.0384 St. Andrews, Canada, 50.2700, -96.9747 Edattala, India, 9.8678, 76.4361 Fort Bonifacio, Philippines, 14.5311, 121.0478 Skhira, Tunisia, 34.3006, 10.0708 Middleburg, United States, 30.0502, -81.9011 Aheqi, China, 40.9365, 78.4023 Bairo, India, 26.0144, 86.5100 Grand Baie, Mauritius, -20.0131, 57.5844 Lalmatie, Mauritius, -20.0184, 57.5802 Huanian, China, 24.0664, 102.1914 Kotla, India, 32.7522, 74.7470 Arkansas City, United States, 37.0726, -97.0385 Tanakallu, India, 13.9200, 78.1800 Araure, Venezuela, 9.5667, -69.2167 Kirikera, India, 13.7690, 77.4841 Mamarappatti, India, 11.4845, 78.0374 Pulpi, Spain, 37.4019, -1.7508 Halstead, United Kingdom, 51.9451, 0.6411 Williams Lake, Canada, 52.1294, -122.1383 Chandpura, India, 25.4966, 86.2104 Ivybridge, United Kingdom, 50.3890, -3.9210 Laamarna, Morocco, 31.8944, -8.9842 Ried im Innkreis, Austria, 48.2100, 13.4894 Peiting, Germany, 47.8000, 10.9333 Zebbug, Malta, 35.8731, 14.4419 Somain, France, 50.3583, 3.2811 Ambatturai, India, 10.2603, 77.9303 Tabontabon, Philippines, 11.0300, 124.9700 Desborough, United Kingdom, 52.4398, -0.8172 Belovo, Russia, 54.4167, 86.3000 Oqqo`rg`on, Uzbekistan, 40.8764, 69.0453 Qorashina, Uzbekistan, 38.3394, 66.5619 Ajjanahalli, India, 12.0376, 77.8138 Chinna Orampadu, India, 14.0613, 79.2671 Kampenhout, Belgium, 50.9413, 4.5496 Bhansia, India, 26.0992, 87.5316 Bordentown, United States, 40.1420, -74.7098 Baohe, China, 33.2033, 106.9606 Enamadala, India, 16.2281, 80.3306 Zemamra, Morocco, 32.6215, -8.7023 Monschau, Germany, 50.5600, 6.2564 Zumbagua, Ecuador, -0.9558, -78.9017 Belur, India, 11.7075, 78.4144 Gundugolanu, India, 16.7833, 81.2333 Beryslav, Ukraine, 46.8333, 33.4167 Rossmoor, United States, 33.7887, -118.0803 Mamqan, Iran, 37.8458, 45.9719 Florange, France, 49.3222, 6.1192 Aragoiania, Brazil, -16.9119, -49.4508 Shamshernagar, India, 25.0796, 84.4540 Pakra, India, 25.3711, 87.0807 Caybasi, Turkey, 41.0175, 37.0983 Gora Kalwaria, Poland, 51.9733, 21.2144 Sao Joao, Brazil, -25.8278, -52.7250 Dudley, United States, 42.0550, -71.9352 Cousse, Benin, 6.8500, 2.1333 Rutherford, Australia, -32.7153, 151.5250 Dom Basilio, Brazil, -13.7600, -41.7708 Hemsbach, Germany, 49.5903, 8.6564 Cua Lo, Vietnam, 18.8167, 105.7167 Nagar, India, 24.0917, 87.9881 Lauria Inferiore, Italy, 40.0472, 15.8358 Kagamino, Japan, 35.0919, 133.9331 Imarui, Brazil, -28.3408, -48.8200 Mayiladi, India, 8.1550, 77.5056 San Severino Marche, Italy, 43.2289, 13.1771 Ojuelos de Jalisco, Mexico, 21.8667, -101.5833 Hattian Bala, Pakistan, 34.1691, 73.7432 Gander, Canada, 48.9569, -54.6089 Mangalampudur, India, 10.8167, 76.6500 Bernissart, Belgium, 50.4833, 3.6500 Kamlapur, India, 17.5786, 76.9887 Puliyampatti, India, 11.6653, 77.8041 Chambray-les-Tours, France, 47.3383, 0.7144 Sandridge, United Kingdom, 51.7808, -0.3038 Glyka Nera, Greece, 37.9917, 23.8483 Ban Nong Kop, Thailand, 13.8178, 99.9353 Picana, Spain, 39.4361, -0.4350 Prattipadu, India, 17.2333, 82.2000 Mount Sinai, United States, 40.9372, -73.0179 Jaltenango, Mexico, 15.8725, -92.7250 Maisaka, Japan, 34.6857, 137.6272 Badamdar, Azerbaijan, 40.3394, 49.8039 La Puebla del Rio, Spain, 37.2667, -6.0500 Comasagua, El Salvador, 13.6333, -89.3833 Saint-Gaudens, France, 43.1089, 0.7242 Mehsari, India, 25.7554, 85.8477 Mahazoarivo, Madagascar, -20.3957, 47.4101 Ifs, France, 49.1389, -0.3519 Snaresbrook, United Kingdom, 51.5870, 0.0146 Altavilla Vicentina, Italy, 45.5164, 11.4597 Iwaka, Japan, 40.6159, 140.4213 Laurel, United States, 27.1507, -82.4534 San Fernando, Mexico, 16.8717, -93.2063 Zhdanivka, Ukraine, 48.1375, 38.2608 Yuxiaguan, China, 36.0312, 113.6099 Xincheng, China, 36.0333, 113.4667 Rudrangi, India, 18.6262, 78.7022 Sant'Agata di Militello, Italy, 38.0680, 14.6333 Oulad Amrane el Mekki, Morocco, 35.2223, -5.9555 Voru, Estonia, 57.8486, 26.9928 Jamaat Shaim, Morocco, 32.3486, -8.8431 Aj Jourf, Morocco, 31.4903, -4.4014 Krykhivtsi, Ukraine, 48.9008, 24.6662 Brunn am Gebirge, Austria, 48.1000, 16.2833 Bargoed, United Kingdom, 51.6900, -3.2400 Lauffen am Neckar, Germany, 49.0833, 9.1500 Vanimo, Papua New Guinea, -2.6667, 141.2833 Yenipazar, Turkey, 37.8269, 28.1975 Olgiate Comasco, Italy, 45.7833, 8.9667 Meral, India, 24.1876, 83.7076 Burgthann, Germany, 49.3500, 11.3000 Malar, India, 26.2237, 86.6909 Dranesville, United States, 38.9955, -77.3693 Raesfeld, Germany, 51.7667, 6.8333 Robertsville, United States, 40.3395, -74.2939 Iacanga, Brazil, -21.8900, -49.0247 Possneck, Germany, 50.7000, 11.6000 Ban, Indonesia, -8.2333, 115.4833 Elizabethtown, United States, 40.1533, -76.5990 Lissegazoun, Benin, 6.6167, 2.0833 Leutenbach, Germany, 48.8883, 9.3914 Aguasay, Venezuela, 9.4249, -63.7308 Mountain Top, United States, 41.1353, -75.9045 Rankweil, Austria, 47.2667, 9.6500 Lauenburg, Germany, 53.3833, 10.5667 Nagykata, Hungary, 47.4178, 19.7414 San Juan del Rio del Centauro del Norte, Mexico, 24.7667, -104.4667 Kronshagen, Germany, 54.3333, 10.0833 Khajuri, India, 25.9144, 86.6772 Whistler, Canada, 50.1208, -122.9544 Oxted, United Kingdom, 51.2570, -0.0060 Bridgnorth, United Kingdom, 52.5350, -2.4195 Gerstetten, Germany, 48.6225, 10.0206 Hoyland Nether, United Kingdom, 53.4985, -1.4406 Chainpur, India, 25.0345, 83.5066 Monte Compatri, Italy, 41.8081, 12.7372 Sao Goncalo do Rio Abaixo, Brazil, -19.8258, -43.3619 Freeport, Trinidad and Tobago, 10.4500, -61.4167 Zriba-Village, Tunisia, 36.3333, 10.2500 Imaculada, Brazil, -7.3897, -37.5092 Avadattur, India, 11.7014, 77.8638 Recreo, Argentina, -29.2667, -65.0667 Corupa, Brazil, -26.4250, -49.2428 Gberouboue, Benin, 10.5333, 2.7333 Rangsdorf, Germany, 52.2833, 13.4333 Ciudad-Rodrigo, Spain, 40.5969, -6.5392 Pedda Vegi, India, 16.7708, 81.1039 Denduluru, India, 16.4527, 81.0951 Sant'Ambrogio di Valpolicella, Italy, 45.5209, 10.8362 Vendas Novas, Portugal, 38.6780, -8.4555 Eckington, United Kingdom, 53.3080, -1.3643 Monte di Procida, Italy, 40.8000, 14.0500 Lantana, United States, 26.5834, -80.0564 Bad Voslau, Austria, 47.9667, 16.2167 Palmilla, Chile, -34.6042, -71.3583 Dishashah, Egypt, 28.9831, 30.8492 Lapinig, Philippines, 12.3150, 125.3020 Brighton, Canada, 44.1222, -77.7642 Peonga, Benin, 10.3333, 3.2667 Vellallur, India, 8.7639, 76.8345 Pokrovskoye, Russia, 47.4164, 38.8989 Novalukoml', Belarus, 54.6569, 29.1500 Torton, United Kingdom, 52.4522, -2.1606 Bibipet, India, 18.2101, 78.5221 Lizzanello, Italy, 40.3047, 18.2228 Dolinsk, Russia, 47.3167, 142.8000 Biltine, Chad, 14.5275, 20.9267 Kalipatnam, India, 16.3904, 81.5295 Picayune, United States, 30.5322, -89.6724 Niles, United States, 41.8346, -86.2473 Lawrenceburg, United States, 38.0332, -84.9031 Bueu, Spain, 42.3167, -8.7833 Le Relecq-Kerhuon, France, 48.4092, -4.3956 Angalakurichchi, India, 10.5282, 76.9962 Trentham, United Kingdom, 52.9663, -2.1899 Chero, India, 25.2463, 85.8169 Cho Lach, Vietnam, 10.2647, 106.1300 Richland, United States, 40.6440, -79.9579 Neuenrade, Germany, 51.2839, 7.7800 Lahra Muhabbat, India, 30.2421, 75.1666 Guabari, India, 26.2262, 87.9181 Itamati, India, 20.1333, 85.1500 Sirsia Hanumanganj, India, 26.1381, 87.1133 Licinio de Almeida, Brazil, -14.6819, -42.5078 Paulista, Brazil, -6.5939, -37.6239 Locri, Italy, 38.2333, 16.2667 Bataredh, India, 26.4250, 84.6061 Spilimbergo, Italy, 46.1114, 12.9017 Bibbiena, Italy, 43.6975, 11.8144 Frecheirinha, Brazil, -3.7600, -40.8158 Ratanpur, India, 24.8996, 86.2888 Hirao, Japan, 33.9381, 132.0733 Tiddas, Morocco, 33.5665, -6.2659 Snodland, United Kingdom, 51.3280, 0.4467 Premnagar, India, 30.3331, 77.9608 La Tour-de-Peilz, Switzerland, 46.4500, 6.8667 Turin, El Salvador, 13.9667, -89.8167 Bou Merdes, Tunisia, 35.4500, 10.7333 Areal, Brazil, -22.2308, -43.1058 San Pedro La Laguna, Guatemala, 14.6940, -91.2720 Korahia, India, 26.5325, 86.1552 Oiwa, Japan, 34.5254, 135.8498 Englefield Green, United Kingdom, 51.4301, -0.5699 Palleja, Spain, 41.4242, 1.9978 Rasulpur, India, 25.9938, 85.8935 Vecchiano, Italy, 43.7833, 10.3833 Wallington, United States, 40.8536, -74.1069 Provins, France, 48.5604, 3.2990 Baranzate, Italy, 45.5167, 9.1000 Westview, United States, 25.8825, -80.2415 Ulverston, United Kingdom, 54.1930, -3.0900 Amherst, United States, 42.8706, -71.6068 Endwell, United States, 42.1184, -76.0219 Gross-Enzersdorf, Austria, 48.2000, 16.5500 Langgons, Germany, 50.5000, 8.6667 Camposampiero, Italy, 45.5667, 11.9333 Palos Heights, United States, 41.6637, -87.7958 Tapiratiba, Brazil, -21.4678, -46.7489 Chilonga, Zambia, -12.0244, 31.3364 Pace, France, 48.1477, -1.7739 Barokhar, India, 24.9167, 81.9667 Toualet, Morocco, 32.7333, -7.1833 Wargal, India, 17.7751, 78.6181 Menfi, Italy, 37.6078, 12.9686 Mountougoula, Mali, 12.5289, -7.8217 Jataizinho, Brazil, -23.2539, -50.9800 Barrafranca, Italy, 37.3667, 14.2000 Mariehamn, Finland, 60.1000, 19.9333 Tikar, India, 24.4194, 81.3776 Holalu, India, 14.8406, 75.7144 Befandefa, Madagascar, -22.1460, 43.3035 Ostrhauderfehn, Germany, 53.1167, 7.6167 Bocaina, Brazil, -22.1361, -48.5181 Dolo Bay, Ethiopia, 4.1833, 42.0833 Yakushima, Japan, 30.3900, 130.6511 Portela, Portugal, 38.7828, -9.1111 Mboro, Senegal, 15.1327, -16.8768 Middle Valley, United States, 35.1877, -85.1959 Sonosari, Indonesia, -7.8014, 110.3644 Pilis, Hungary, 47.2858, 19.5469 Richfield, United States, 43.2372, -88.2413 Chateau-Gontier, France, 47.8286, -0.7028 Salem, United States, 40.9049, -80.8492 Hartsville, United States, 36.3921, -86.1568 Virgem da Lapa, Brazil, -16.8039, -42.3428 Parsa, India, 25.7721, 86.1754 Lunenburg, United States, 42.5897, -71.7199 Oswaldtwistle, United Kingdom, 53.7430, -2.3930 Kakalur, India, 13.1394, 79.9287 Evanston, United States, 41.2602, -110.9646 Thogapalle, India, 17.1279, 80.6355 Ghabaghib, Syria, 33.1824, 36.2253 Serra do Salitre, Brazil, -19.1108, -46.6900 Bad Durrenberg, Germany, 51.2833, 12.0667 Nordestina, Brazil, -10.8228, -39.4278 Jalalaqsi, Somalia, 3.3766, 45.5996 Hobyo, Somalia, 5.3505, 48.5268 Vermillion, United States, 42.7811, -96.9256 Vedene, France, 43.9783, 4.9039 Irmo, United States, 34.1018, -81.1956 Beladi, India, 13.1464, 74.9399 Smithfield, United States, 35.5133, -78.3495 Portoferraio, Italy, 42.8167, 10.3167 Skofja Loka, Slovenia, 46.1672, 14.3030 Deerlijk, Belgium, 50.8500, 3.3500 Barapire, Mali, 14.3053, -3.0517 Oued Cheham, Algeria, 36.3833, 7.7667 Novi Marof, Croatia, 46.1667, 16.3333 Sussex, United States, 43.1346, -88.2226 Sanpetru, Romania, 45.7167, 25.6333 Ulricehamn, Sweden, 57.7917, 13.4186 Bullas, Spain, 38.0497, -1.6706 Oued Seguin, Algeria, 36.1710, 6.4200 Valga, Estonia, 57.7833, 26.0333 Susegana, Italy, 45.8500, 12.2500 Srirampuram, India, 10.4346, 77.8075 Khanaqin, Iraq, 34.3483, 45.3906 Axixa, Brazil, -2.8369, -44.0528 Billerbeck, Germany, 51.9792, 7.2950 Zao, Japan, 39.0981, 140.6587 Muping, China, 30.3692, 102.8139 Spreitenbach, Switzerland, 47.4181, 8.3661 Kete Krachi, Ghana, 7.7939, -0.0498 Tortoreto, Italy, 42.8000, 13.9167 Biknur, India, 18.2150, 78.4367 Tiny, Canada, 44.6833, -79.9500 Ryuo, Japan, 35.0667, 136.1167 Destrehan, United States, 29.9626, -90.3676 Cafayate, Argentina, -26.0833, -65.9667 Oropesa, Spain, 40.0922, 0.1339 Comalapa, Nicaragua, 12.2833, -85.5000 Aougrout, Algeria, 28.7000, 0.3167 Vegarai, India, 11.0903, 77.9679 Roda, India, 30.6820, 75.0195 Los Alamitos, United States, 33.7971, -118.0592 Epinay-sous-Senart, France, 48.6948, 2.5147 Wolmirstedt, Germany, 52.2519, 11.6297 Limburgerhof, Germany, 49.4167, 8.4000 Portomaggiore, Italy, 44.7000, 11.8000 Ronchi dei Legionari, Italy, 45.8333, 13.5000 Ngerengere, Tanzania, -6.7500, 38.1167 Kehen, Indonesia, -8.5589, 115.2869 Fiume Veneto, Italy, 45.9333, 12.7333 Bolivar, Colombia, 5.9911, -73.7739 Baitoa, Dominican Republic, 19.3200, -70.7000 Kotelva, Ukraine, 50.0000, 3.0000 Santa Ana, Honduras, 14.0643, -87.9534 Yeniciftlik, Turkey, 41.0167, 27.8500 Geisenheim, Germany, 49.9844, 7.9672 Sidi Ladjel, Algeria, 35.4333, 2.5000 Chiautla de Tapia, Mexico, 18.3015, -98.6034 Hauzenberg, Germany, 48.6500, 13.6333 Bechloul, Algeria, 36.3167, 4.0667 Sahasmal, India, 26.2461, 87.4983 Woodmere, United States, 29.8493, -90.0751 Khansahibpuram, India, 9.6304, 77.6028 Strunino, Russia, 56.3667, 38.5833 Knowsley, United Kingdom, 53.4498, -2.8501 Borgaro Torinese, Italy, 45.1521, 7.6580 Alamedin, Kyrgyzstan, 42.8900, 74.6300 Leingarten, Germany, 49.1500, 9.1167 Negele, Ethiopia, 5.3167, 39.5833 Vauvert, France, 43.6942, 4.2769 Zhatay, Russia, 62.1500, 129.8167 Shagonar, Russia, 51.5500, 92.7667 Pragatinagar, Nepal, 27.6667, 84.1833 Sao Goncalo do Para, Brazil, -19.9828, -44.8589 Oestrich-Winkel, Germany, 50.0025, 8.0175 San Pedro, Belize, 17.9214, -87.9611 Sipalakottai, India, 9.8493, 77.4517 Kotha Guru, India, 30.4419, 75.0948 Bitetto, Italy, 41.0333, 16.7500 Drolshagen, Germany, 51.0333, 7.7667 Brotas de Macaubas, Brazil, -11.9989, -42.6258 Eichenau, Germany, 48.1667, 11.3167 Kissing, Germany, 48.3000, 10.9833 Medina Sidonia, Spain, 36.4667, -5.9167 Kissane Ltouqi, Morocco, 34.6000, -5.0833 Soderhamn, Sweden, 61.3000, 17.0500 Hankey, South Africa, -33.8314, 24.8808 Walldurn, Germany, 49.5831, 9.3681 Owk, India, 15.2167, 78.1167 Batocina, Serbia, 44.1500, 21.0833 Tornquist, Argentina, -38.1000, -62.2167 Agcogon, Philippines, 12.0700, 121.9300 Jaitwar, India, 24.7320, 80.8602 Kornepadu, India, 16.2444, 80.3857 Alken, Belgium, 50.8757, 5.3079 Koszeg, Hungary, 47.3819, 16.5522 Annakattumula, India, 9.8575, 76.4009 Pastpar, India, 25.8275, 86.8327 Mios, France, 44.6058, -0.9356 Sher Muhammadpuram, India, 18.2997, 83.8331 Putnam Valley, United States, 41.3980, -73.8368 Hawkesbury, Canada, 45.6000, -74.6000 Blace, Serbia, 43.2906, 21.2847 Moncion, Dominican Republic, 19.4167, -71.1667 Elektrenai, Lithuania, 54.7886, 24.6612 Kuchinarai, Thailand, 16.5410, 104.0500 Largo, United States, 38.8800, -76.8289 Minehead, United Kingdom, 51.2040, -3.4810 Tarrytown, United States, 41.0647, -73.8672 Agadi, India, 14.8190, 75.4690 Waldniel, Germany, 51.2131, 6.2731 Rajaram, India, 18.9870, 79.0844 Tiruvadanai, India, 9.7841, 78.9172 Samalpatti, India, 12.3167, 78.5000 Jose Maria Morelos, Mexico, 19.7500, -88.7000 Padinjaremuri, India, 10.2661, 76.1461 Murukondapadu, India, 15.9174, 80.4131 Ganapavaram, India, 16.7000, 81.4667 Abhia, India, 25.3499, 87.1427 Edeia, Brazil, -17.3389, -49.9308 Waltikon, Switzerland, 47.3667, 8.5833 Chinaval, India, 21.1964, 75.9261 Francofonte, Italy, 37.2333, 14.8833 Tolcayuca, Mexico, 19.9500, -98.9167 Sandy, United States, 41.1447, -78.7295 Bajiao, China, 27.6573, 108.1937 Konand, India, 25.1729, 85.6842 View Park-Windsor Hills, United States, 33.9955, -118.3483 Miller Place, United States, 40.9374, -72.9864 Olivenza, Spain, 38.6858, -7.1008 Bershad, Ukraine, 48.3728, 29.5325 Lindenberg im Allgau, Germany, 47.6000, 9.9000 An Cabhan, Ireland, 53.9908, -7.3606 Bajestan, Iran, 34.5178, 58.1844 Serravalle Pistoiese, Italy, 43.9000, 10.8333 Muong Theng, Vietnam, 21.3869, 103.0156 The Pinery, United States, 39.4462, -104.7591 Carignan, Canada, 45.4500, -73.3000 Magdagachi, Russia, 53.4500, 125.8000 Ban Phan Don, Thailand, 17.1427, 102.9726 Chaltabaria, India, 22.2347, 88.5014 James Island, United States, 32.7353, -79.9394 Cernay, France, 47.8100, 7.1800 Vengavasal, India, 12.8991, 80.1690 Pritzwalk, Germany, 53.1500, 12.1833 Yamamoto, Japan, 37.9624, 140.8775 Gulfport, United States, 27.7463, -82.7099 Trinidad, Colombia, 5.4089, -71.6622 Hackney, United Kingdom, 51.5410, -0.0270 Chintapalle, India, 16.8936, 80.1387 San Nicolas de los Ranchos, Mexico, 19.0667, -98.4833 Rio Colorado, Argentina, -38.9908, -64.0958 Harrislee, Germany, 54.7972, 9.3764 Dinara, India, 25.2470, 84.0630 Lawrenceburg, United States, 35.2497, -87.3325 Lakeville, United States, 41.8310, -70.9594 Chaumont-Gistoux, Belgium, 50.6839, 4.6947 Zhetibay, Kazakhstan, 43.5942, 52.0789 Winfield, United States, 37.2740, -96.9500 Altstatten, Switzerland, 47.3780, 9.5488 Zaouiet Says, Morocco, 32.7931, -8.6506 College, United States, 64.8694, -147.8216 Geisenfeld, Germany, 48.6667, 11.6000 Hardiya, India, 26.9443, 84.8542 Mestrino, Italy, 45.4522, 11.7447 Sveti Nikole, North Macedonia, 41.8650, 21.9425 Ontario, United States, 44.0259, -116.9760 Emmaus, United States, 40.5352, -75.4978 Schwaigern, Germany, 49.1333, 9.0500 Mutia, Philippines, 8.4176, 123.4771 Maizieres-les-Metz, France, 49.2125, 6.1617 Manevychi, Ukraine, 51.2914, 25.5331 Marktheidenfeld, Germany, 49.8500, 9.6000 Cossimbazar, India, 24.1200, 88.2800 Ambatofisaka II, Madagascar, -20.0867, 47.8967 Dugny, France, 48.9500, 2.4167 Baghauni, India, 25.9338, 86.0594 Golub-Dobrzyn, Poland, 53.1000, 19.0500 Kruje, Albania, 41.5108, 19.7925 Deutschlandsberg, Austria, 46.8161, 15.2150 Nellipoyil, India, 11.4403, 76.0406 Appingedam, Netherlands, 53.3167, 6.8667 Guatajiagua, El Salvador, 13.6667, -88.2000 Burley, United States, 42.5379, -113.7926 Carmiano, Italy, 40.3461, 18.0461 Carmen, Philippines, 9.2289, 126.0167 Douglas, United States, 31.5065, -82.8544 Chundal, India, 10.6175, 76.0947 Soalandy, Madagascar, -18.9997, 47.4984 Aleksandrow Kujawski, Poland, 52.8767, 18.6936 Puente Nacional, Colombia, 5.8833, -73.6833 Tadley, United Kingdom, 51.3506, -1.1376 Lansing, United States, 42.5667, -76.5316 Auta, India, 25.3882, 85.9558 North Wantagh, United States, 40.6983, -73.5086 Malone, United States, 44.7956, -74.2859 Kamin-Kashyrskyi, Ukraine, 51.6200, 24.9653 Piranhas, Brazil, -16.4269, -51.8219 Alegria, El Salvador, 13.5000, -88.4833 Medulla, United States, 27.9570, -81.9866 Nandimandalam, India, 14.4052, 78.5246 Saaminki, Finland, 61.8675, 28.8786 Wetherby, United Kingdom, 53.9276, -1.3839 Marquette-les-Lille, France, 50.6764, 3.0667 Ubai, Brazil, -16.2850, -44.7778 Sindalakkundu, India, 10.3665, 77.9046 Macusani, Peru, -14.0692, -70.4311 Costa de Caparica, Portugal, 38.6446, -9.2356 Malka, Jordan, 32.6653, 35.7333 Scharbeutz, Germany, 54.0214, 10.7456 Bithan, India, 25.6954, 86.2789 Utiel, Spain, 39.5672, -1.2067 Sowerby Bridge, United Kingdom, 53.7100, -1.9100 Semri, India, 25.3404, 84.1970 Hanover, United States, 40.6668, -75.3979 Zwonitz, Germany, 50.6167, 12.8000 Pueblo Nuevo, Guatemala, 14.6500, -91.5333 Rattihalli, India, 14.4167, 75.5000 Hanover, United States, 43.7156, -72.1910 Gatumba, Burundi, -3.3333, 29.2500 Chakai, India, 26.0884, 87.6154 Nakasongola, Uganda, 1.3150, 32.4650 Azcoitia, Spain, 43.1792, -2.3106 Sengurichchi, India, 10.3756, 78.1658 Bopfingen, Germany, 48.8569, 10.3522 Ujhana, India, 29.7155, 76.1341 Chorleywood, United Kingdom, 51.6500, -0.5100 Olhanpur, India, 25.8855, 84.8186 Risca, United Kingdom, 51.6080, -3.0910 Orono, United States, 44.8867, -68.7166 Tibbar, India, 31.9697, 75.4159 Kennebunk, United States, 43.3972, -70.5707 Vellar, India, 11.8938, 77.9698 Zarach, Iran, 31.9908, 54.2319 Ibira, Brazil, -21.0800, -49.2408 Ostbevern, Germany, 52.0389, 7.8458 Nova Gradiska, Croatia, 45.2500, 17.3833 Tiszakecske, Hungary, 46.9311, 20.0950 Oued Laou, Morocco, 35.4500, -5.0833 North Union, United States, 39.9101, -79.6733 Barkagaon, India, 23.8553, 85.2150 Angel R. Cabada, Mexico, 18.5969, -95.4453 Obidos, Portugal, 39.3620, -9.1571 Iver, United Kingdom, 51.5210, -0.5070 Brejetuba, Brazil, -20.1458, -41.2900 Thiers, France, 45.8572, 3.5483 Rostam Kola, Iran, 36.6789, 53.4297 Jaco, Costa Rica, 9.6200, -84.6044 Lom Sak, Thailand, 16.7798, 101.2422 Luis Alves, Brazil, -26.7208, -48.9328 Mallikkundam, India, 11.8715, 77.9227 Malial, India, 18.7000, 78.9667 Berthoud, United States, 40.3071, -105.0426 Elma, United States, 42.8231, -78.6371 Hildburghausen, Germany, 50.4167, 10.7500 Izola, Slovenia, 45.5344, 13.6675 Hollabrunn, Austria, 48.5667, 16.1000 Topolovgrad, Bulgaria, 42.0850, 26.3370 Venkidanga, India, 10.5167, 76.0833 Tirodi, India, 21.6852, 79.7191 Torri di Quartesolo, Italy, 45.5167, 11.6167 Green River, United States, 41.5127, -109.4710 Sothgaon, India, 26.6046, 85.9473 Cornedo Vicentino, Italy, 45.6167, 11.3500 Bellmawr, United States, 39.8666, -75.0941 Kibi, Ghana, 6.1667, -0.5500 Elland, United Kingdom, 53.6830, -1.8400 Vilandai, India, 11.3267, 79.3856 Peligros, Spain, 37.2333, -3.6333 Bokakhat, India, 26.6402, 93.6005 Center, United States, 40.6483, -80.2977 Saint-Esteve, France, 42.7142, 2.8428 Bolsover, United Kingdom, 53.2304, -1.2875 Teroual, Morocco, 34.6667, -5.2667 Alahina, Mali, 15.2267, -8.7447 Friendly, United States, 38.7601, -76.9642 Oliva, Argentina, -32.0333, -63.5667 Aylesford, United Kingdom, 51.3033, 0.4796 Ponteland, United Kingdom, 55.0480, -1.7470 Talakad, India, 12.1887, 77.0289 Randaberg, Norway, 58.9994, 5.6186 Oboyan, Russia, 51.2000, 36.2833 Sao Sebastiao do Uatuma, Brazil, -2.5719, -57.8708 Kautalam, India, 15.7711, 77.1239 Fgura, Malta, 35.8725, 14.5228 Franklin, United States, 39.5538, -84.2952 Lakeland Highlands, United States, 27.9572, -81.9496 Saint-Cyr-sur-Mer, France, 43.1789, 5.7086 Nellipaka, India, 17.7679, 80.8567 Keolari, India, 22.3697, 79.9060 Karanchedu, India, 15.8823, 80.3170 Bayyanagudem, India, 17.1250, 81.3628 Befotaka, Madagascar, -17.0833, 48.9667 Elavalli, India, 10.5667, 76.0833 Chittattukara, India, 10.5667, 76.0833 Matmata, Morocco, 34.1000, -4.5500 Granbury, United States, 32.4475, -97.7702 Narasapuram, India, 17.1016, 81.0765 Terenos, Brazil, -20.4419, -54.8600 Bryn, United Kingdom, 53.4990, -2.6570 Ponte San Pietro, Italy, 45.6978, 9.5881 Davenport, United States, 28.1587, -81.6083 Lajosmizse, Hungary, 47.0264, 19.5575 Marotta, Italy, 43.7697, 13.1369 Lower Burrell, United States, 40.5818, -79.7141 Schwieberdingen, Germany, 48.8778, 9.0750 Lardero, Spain, 42.4333, -2.4667 Bagaura, India, 26.0388, 84.4624 Stokke, Norway, 59.2236, 10.3002 Villa General Belgrano, Argentina, -31.9667, -64.5667 Berlaar, Belgium, 51.1179, 4.6580 Bhainsahi, India, 26.4404, 84.5443 Allur, India, 14.6800, 80.0600 Brookhaven, United States, 31.5803, -90.4432 Pepperell, United States, 42.6713, -71.6043 Jardim do Serido, Brazil, -6.5839, -36.7739 Zofingen, Switzerland, 47.2884, 7.9475 San Pedro Ixcatlan, Mexico, 18.1500, -96.5000 Mericourt, France, 50.4031, 2.8667 Nandavaram, India, 15.8535, 77.4843 Panamaram, India, 11.7390, 76.0730 Villecresnes, France, 48.7214, 2.5342 Sukurhutu, India, 23.4433, 85.2917 Yirol, South Sudan, 6.5525, 30.4981 Hidaka, Japan, 42.4833, 142.0667 Lakri, India, 26.2323, 84.6933 Jangy-Kyshtak, Kyrgyzstan, 40.5500, 72.7306 Prudhoe, United Kingdom, 54.9610, -1.8490 Samesi, India, 26.6145, 81.1017 Lessogou, Mali, 13.8118, -3.6026 Mixtla de Altamirano, Mexico, 18.6000, -97.0000 Babayevo, Russia, 59.3833, 35.9167 Fatehabad, India, 26.0652, 84.9722 Carver, United States, 41.8739, -70.7563 Mendota Heights, United States, 44.8815, -93.1400 Hamilton Square, United States, 40.2248, -74.6526 Kattakampala, India, 10.6833, 76.0333 Isapur, India, 25.4122, 86.9893 Mitai, Japan, 32.7117, 131.3078 Isaka, Madagascar, -21.1401, 47.0172 Ansiao, Portugal, 39.9167, -8.4333 South Yarmouth, United States, 41.6692, -70.2005 Brock, Canada, 44.3167, -79.0833 Cowdenbeath, United Kingdom, 56.1100, -3.3500 Isaszeg, Hungary, 47.5333, 19.4000 Zaoqiao, Taiwan, 24.6500, 120.8667 Kizhakkanela, India, 8.6520, 76.8701 Guttenberg, United States, 40.7928, -74.0049 L'Ile-Perrot, Canada, 45.3833, -73.9500 Durbuy, Belgium, 50.3523, 5.4568 Diosd, Hungary, 47.4042, 18.9458 Dhanaura, India, 25.1905, 87.2595 Kunkalagunta, India, 16.2969, 79.8866 Kremenki, Russia, 54.8833, 37.1167 Zara, Turkey, 39.8950, 37.7531 Candelaria, Colombia, 10.4592, -74.8806 Sonada, India, 26.9620, 88.2684 Lundazi, Zambia, -12.3000, 33.1833 Alcoa, United States, 35.8076, -83.9753 Hemiksem, Belgium, 51.1500, 4.3500 Karmauli, India, 26.4502, 86.1033 Siur, India, 24.8166, 85.6728 University of California-Santa Barbara, United States, 34.4151, -119.8568 Nzeto, Angola, -7.2333, 12.8667 Guaicara, Brazil, -21.6219, -49.7986 Knin, Croatia, 44.0333, 16.1833 Elverum, Norway, 60.8833, 11.5667 Angicos, Brazil, -5.6658, -36.6008 Diao'ecun, China, 40.7000, 115.9000 La Esperanza, Honduras, 14.3081, -88.1768 Motegi, Japan, 36.5321, 140.1876 Derassi, Benin, 10.1667, 3.2667 Berwick-Upon-Tweed, United Kingdom, 55.7692, -2.0025 Tlachichilco, Mexico, 20.6217, -98.1994 Bad Nenndorf, Germany, 52.3369, 9.3786 Dammapeta, India, 17.2667, 81.0167 Egersund, Norway, 58.4500, 6.0067 Ermenek, Turkey, 36.6389, 32.8925 Seven Hills, United States, 41.3803, -81.6736 Weiz, Austria, 47.2169, 15.6331 Velke Mezirici, Czechia, 49.3553, 16.0122 Miami Shores, United States, 25.8670, -80.1779 Pongode, India, 16.9246, 79.7343 Chebrolu, India, 16.1967, 80.5250 Plano, United States, 41.6757, -88.5293 Kallakkudi, India, 10.9767, 78.9525 Porecatu, Brazil, -22.7558, -51.3789 Fderik, Mauritania, 22.6783, -12.7114 Castalla, Spain, 38.5967, -0.6708 Ichinomiya, Japan, 35.3667, 140.3667 Tepetzintla, Mexico, 19.9667, -97.8333 Nawa Nagar Nizamat, India, 26.2895, 84.9351 Canton, United States, 44.5802, -75.1978 Henley on Thames, United Kingdom, 51.5357, -0.9030 Lubaczow, Poland, 50.1667, 23.1167 Bucyrus, United States, 40.8054, -82.9719 Alum Rock, United States, 37.3694, -121.8238 Annappes, France, 50.6264, 3.1506 Bolbec, France, 49.5700, 0.4700 Lenvik, Norway, 69.3836, 17.9675 Mahta, India, 31.6647, 75.2509 Nallur, India, 14.0871, 75.8778 Tamanar, Morocco, 31.0000, -9.6667 Ban Mae Tuen, Thailand, 18.0100, 98.8809 Yorktown, United States, 40.1830, -85.5123 Balaxani, Azerbaijan, 40.4625, 49.9189 Ielmo Marinho, Brazil, -5.8239, -35.5528 Kotra, India, 22.7062, 88.5411 Summerland, Canada, 49.6006, -119.6778 Baghambarpur, India, 26.8075, 84.4059 Tuktukan, Philippines, 14.5280, 121.0718 Spring Lake, United States, 35.1843, -78.9962 Ibicuitinga, Brazil, -4.9739, -38.6389 Xexeu, Brazil, -8.8019, -35.6269 Manabo, Philippines, 17.4300, 120.7000 Pirauba, Brazil, -21.2758, -43.0258 Sinzheim, Germany, 48.7619, 8.1669 Ziyodin Shaharchasi, Uzbekistan, 40.0342, 65.6547 Veyrier, Switzerland, 46.1667, 6.1833 Betmangala, India, 13.0085, 78.3282 Rokiskis, Lithuania, 55.9667, 25.5833 Ambohimahasoa, Madagascar, -21.1063, 47.2146 Sint Anthonis, Netherlands, 51.6258, 5.8811 Payshamba Shahri, Uzbekistan, 40.0078, 66.2372 Georgetown, United States, 31.9849, -81.2260 Qasr-e Qand, Iran, 26.2356, 60.7408 Town and Country, United States, 38.6317, -90.4790 Rayavaram, India, 17.3608, 81.7530 Minden, United States, 32.6187, -93.2762 Ascot, United Kingdom, 51.4084, -0.6707 Sunninghill, United Kingdom, 51.4025, -0.6550 Bad Schwalbach, Germany, 50.1333, 8.0667 Gararu, Brazil, -9.9675, -37.0833 Sewai, India, 23.6175, 85.6783 Kolnad, India, 12.9000, 75.0300 Cruzeiro do Sul, Brazil, -29.5128, -51.9850 Tafaraoui, Algeria, 35.4833, -0.5167 Gusinoozersk, Russia, 51.2833, 106.5167 Cadale, Somalia, 2.7603, 46.3222 Ringwood, United States, 41.1065, -74.2749 Fuente de Oro, Colombia, 3.4667, -73.6167 Devipattinam, India, 9.4770, 78.8961 Shuinancun, China, 23.2995, 112.3753 Aduru, India, 12.5583, 75.1357 Gansbaai, South Africa, -34.5828, 19.3522 Santa Comba Dao, Portugal, 40.3981, -8.1303 Stelle, Germany, 53.3667, 10.1167 Renapur, India, 18.5167, 76.6000 Jiquipilas, Mexico, 16.6683, -93.6444 New Baltimore, United States, 38.7495, -77.7151 Raubling, Germany, 47.7881, 12.1047 Enghien-les-Bains, France, 48.9697, 2.3081 Guraahai, India, 33.6449, 74.2301 Lindon, United States, 40.3414, -111.7187 Chatham, Canada, 47.0443, -65.3781 Bassersdorf, Switzerland, 47.4431, 8.6283 Halsur, India, 18.0176, 77.0098 Ankli, India, 16.4200, 74.5800 Phon, Thailand, 15.8160, 102.5998 Zero Branco, Italy, 45.6000, 12.1667 Tilougguit, Morocco, 32.0333, -6.2000 Huandacareo, Mexico, 19.9906, -101.2750 La Massana, Andorra, 42.5444, 1.5144 Uberherrn, Germany, 49.2500, 6.7000 Santa Lucia, Argentina, -28.9833, -59.1000 Sablan, Philippines, 16.4967, 120.4875 Ross-Betio, Senegal, 16.2793, -16.1398 Lakeland Village, United States, 33.6480, -117.3706 Lencois, Brazil, -12.5628, -41.3900 Sakib, Jordan, 32.2854, 35.8113 St. Clements, Canada, 50.2689, -96.6742 Elgoibar, Spain, 43.2142, -2.4169 Khimlasa, India, 24.2058, 78.3639 Morur, India, 11.4221, 77.8743 Casteldaccia, Italy, 38.0500, 13.5333 Wendell, United States, 35.7819, -78.3952 Greensburg, United States, 39.3518, -85.5028 Santa Lucia, Colombia, 10.3167, -74.9500 Bruay-sur-l'Escaut, France, 50.3989, 3.5403 Vadakkumbagam, India, 10.1487, 76.4159 Gainza, Philippines, 13.6167, 123.1414 Kurabalakota, India, 13.6500, 78.4833 Novoishimskiy, Kazakhstan, 53.1981, 66.7694 Mangabe, Madagascar, -16.9202, 49.4476 Eningen unter Achalm, Germany, 48.4831, 9.2522 Yercaud, India, 11.7794, 78.2034 Santa Genoveva de Docordo, Colombia, 4.2586, -77.3675 San Josecito, Costa Rica, 10.0126, -84.1119 Sassenage, France, 45.2058, 5.6656 Wichelen, Belgium, 51.0000, 3.9667 Zeuthen, Germany, 52.3500, 13.6281 Douar Oulad Naoual, Morocco, 34.4936, -5.7108 Saint-Germain-les-Arpajon, France, 48.5946, 2.2558 Norton, United States, 41.0294, -81.6461 Ipaporanga, Brazil, -4.9000, -40.7589 View Royal, Canada, 48.4517, -123.4339 Nazareth, Belgium, 50.9667, 3.6000 Melle, Belgium, 51.0000, 3.8000 Gopalapuram, India, 17.1007, 81.5406 Naigarhi, India, 24.7869, 81.7787 Jethuli, India, 25.5378, 85.2841 Castenedolo, Italy, 45.4704, 10.2967 Bahadarpur, India, 21.2922, 76.1806 Pettaivayttalai, India, 10.9014, 78.4940 Timahdit, Morocco, 33.2369, -5.0600 Jidigunta, India, 16.9098, 81.8553 Okuizumo, Japan, 35.1975, 133.0025 Jarabulus, Syria, 36.8175, 38.0111 Ban Mae Kham Lang Wat, Thailand, 20.2225, 99.8561 Villepreux, France, 48.8308, 2.0031 Caraguatay, Paraguay, -25.2384, -56.8269 Patterson, United States, 41.4849, -73.5921 Covington, United States, 30.4810, -90.1122 Santa Cruz da Baixa Verde, Brazil, -7.8208, -38.1528 Isola della Scala, Italy, 45.2692, 11.0107 La Union, Colombia, 8.8606, -75.2806 Pampas, Peru, -12.3989, -74.8667 Nieuwpoort, Belgium, 51.1167, 2.7500 Eijsden, Netherlands, 50.7778, 5.7108 Landsmeer, Netherlands, 52.4333, 4.9167 Puerto Suarez, Bolivia, -18.9667, -57.7981 Mombris, Germany, 50.0667, 9.1667 Bou Adel, Morocco, 34.5428, -4.5075 Weeze, Germany, 51.6267, 6.1967 Ghal Kalan, India, 30.8189, 75.1063 Kushmanchi, India, 17.2263, 79.9668 Signal Hill, United States, 33.8030, -118.1681 Navarro, Argentina, -35.0167, -59.2667 Severnyy, Russia, 67.6083, 64.1233 Mossley, United Kingdom, 53.5147, -2.0387 Kopervik, Norway, 59.2833, 5.3000 Yangiqo`rg`on, Uzbekistan, 41.1872, 71.7333 Xiaoba, China, 26.6499, 106.9850 Ghinda'e, Eritrea, 15.4500, 39.0833 Silves, Brazil, -2.8389, -58.2092 Sathmalpur, India, 25.8749, 85.8567 Khandpara, India, 20.2644, 85.1767 West Point, United States, 41.1220, -112.0995 Belgrave, United Kingdom, 52.6566, -1.1262 Aracas, Brazil, -12.2200, -38.2028 Holesov, Czechia, 49.3333, 17.5783 Perches, Haiti, 19.5220, -71.9232 Gulgam, India, 34.5500, 74.2173 Norfolk, United States, 42.1163, -71.3295 Cisneros, Colombia, 6.5383, -75.0886 Esperanza, Cuba, 22.4468, -80.0971 Imouzzer Kandar, Morocco, 33.7300, -5.0100 Crowley, United States, 30.2175, -92.3752 Leama, India, 26.2140, 85.9980 Kundiawa, Papua New Guinea, -6.0230, 144.9600 Molteno, South Africa, -31.3961, 26.3631 Itainopolis, Brazil, -7.4469, -41.4783 Perumbakkam, India, 13.0133, 80.1430 Tadapurambakkam, India, 13.3205, 80.1959 Esil, Kazakhstan, 51.9556, 66.4042 Espita, Mexico, 21.0128, -88.3047 Krosuru, India, 16.5500, 80.1331 Dabrowa Tarnowska, Poland, 50.1667, 20.9833 Yvetot, France, 49.6200, 0.7500 Broome, Australia, -17.9619, 122.2361 Carmo da Cachoeira, Brazil, -21.4608, -45.2239 Amelia, Italy, 42.5535, 12.4168 Bugongi, Uganda, -0.6356, 30.2528 Patera, India, 23.9960, 79.6837 Downpatrick, United Kingdom, 54.3220, -5.7030 Ghambiraopet, India, 18.3000, 78.5833 Wells, United States, 43.3267, -70.6336 Wanstead, United Kingdom, 51.5778, 0.0286 Muroto-misakicho, Japan, 33.2900, 134.1519 Roma, United States, 26.4166, -99.0061 Chennur, India, 14.1473, 79.8477 Khorramabad, Iran, 36.7822, 50.8714 Den Chai, Thailand, 17.9837, 100.0522 Chintalavadi, India, 10.9511, 78.3158 Siran, Turkey, 40.1894, 39.1267 Labbaikkudikkadu, India, 11.3922, 79.0218 Wellington, United States, 40.7000, -105.0054 Onate, Spain, 43.0333, -2.4167 Dharmaram, India, 18.7360, 79.2194 Mangalkot, India, 23.5252, 87.9034 Kibungo, Rwanda, -2.1608, 30.5442 Porto-Vecchio, France, 41.5917, 9.2803 Port Morant, Jamaica, 17.9000, -76.3167 Beniel, Spain, 38.0464, -1.0014 Pieve di Soligo, Italy, 45.8833, 12.1667 Matca, Romania, 45.8500, 27.5333 Bytca, Slovakia, 49.2228, 18.5581 Weinfelden, Switzerland, 47.5698, 9.1120 Lamosina, Madagascar, -21.6330, 46.8056 Haradok, Belarus, 55.4667, 30.0000 Nalwar, India, 16.9436, 76.9919 Ferney-Voltaire, France, 46.2558, 6.1081 Krapina, Croatia, 46.1589, 15.8744 Kantilo, India, 20.3615, 85.1921 Mykhailivka, Ukraine, 47.2694, 35.2222 Doda, India, 30.3844, 74.6394 Saint Helena Bay, South Africa, -32.7583, 18.0278 Mit Damsis, Egypt, 30.8267, 31.2226 Fourmies, France, 50.0181, 4.0539 Sunkarevu, India, 16.3900, 81.8500 Bahagalpur, India, 24.5934, 87.9536 Ichhapur, India, 21.1551, 76.1556 Dzouz, Morocco, 31.8900, -7.3200 Moparipalaiyam, India, 11.1332, 77.1470 Maniago, Italy, 46.1667, 12.7167 Vohilava, Madagascar, -20.7011, 48.3428 Nandipeta, India, 18.9622, 78.1772 Okpo, Burma, 18.1167, 95.6667 Quatipuru, Brazil, -0.9008, -47.0058 Budha Theh, India, 31.5177, 75.3009 Golet, India, 19.2390, 79.3891 Ekero, Sweden, 59.2667, 17.7333 Nidamangalam, India, 10.7720, 79.4167 Campbellsville, United States, 37.3445, -85.3511 Sahri, India, 25.4721, 85.7277 Ingurti, India, 17.6695, 79.8003 Epazoyucan, Mexico, 20.0177, -98.6361 Ramena, Madagascar, -12.2421, 49.3453 Calheta, Portugal, 32.7333, -17.1667 Fort Morgan, United States, 40.2537, -103.7903 Doddappanayakkanur, India, 9.9810, 77.7340 Shahpur Baghauni, India, 25.8831, 85.6859 Giffoni Valle Piana, Italy, 40.7167, 14.9333 Cholpon-Ata, Kyrgyzstan, 42.6494, 77.0822 Sarbogard, Hungary, 46.8878, 18.6193 Jucati, Brazil, -8.7058, -36.4889 Gorey, Ireland, 52.6747, -6.2925 Olintla, Mexico, 20.1000, -97.6833 Kundurpi, India, 14.2833, 77.0333 Raun, India, 25.6462, 86.3869 Drawsko Pomorskie, Poland, 53.5333, 15.8000 Blundellsands, United Kingdom, 53.4800, -3.0500 Cachoeira Alta, Brazil, -18.7628, -50.9419 Desanagi, India, 16.9200, 76.2400 Mirik, India, 26.8870, 88.1870 Agareb, Tunisia, 34.4333, 10.1833 San Carlos de Guaroa, Colombia, 3.7111, -73.2425 La Cumbre, Colombia, 3.0000, 38.0000 Dolores, Philippines, 17.6500, 120.7100 Valdivia, Colombia, 7.2938, -75.3919 Al Qal`ah, Egypt, 26.0051, 32.8178 Brislington, United Kingdom, 51.4316, -2.5439 Orchha, India, 25.3500, 78.6400 Hlaingbwe, Burma, 17.1333, 97.8333 Coronel Dorrego, Argentina, -38.7000, -61.2667 Belp, Switzerland, 46.8914, 7.4972 Doukombo, Mali, 14.3511, -3.6558 Sagada, Philippines, 17.0842, 120.9008 Nova Odesa, Ukraine, 47.3097, 31.7792 Kathu, South Africa, -27.7000, 23.0500 Pakkam, India, 13.1436, 80.0280 Piprahi, India, 26.5871, 86.3773 San Lazaro, Paraguay, -22.1074, -57.9622 Dammartin-en-Goele, France, 49.0538, 2.6817 Zejtun, Malta, 35.8556, 14.5333 Cano Martin Pena, Puerto Rico, 18.4309, -66.0507 Sultanpur, India, 23.1381, 77.9340 Horodnia, Ukraine, 51.8931, 31.5947 Xuan Trung, Vietnam, 21.0500, 105.2833 Gillingham, United Kingdom, 51.0375, -2.2748 Radnevo, Bulgaria, 42.3000, 25.9330 Plan-de-Cuques, France, 43.3478, 5.4639 Arpajon, France, 48.5901, 2.2476 Slatina, Croatia, 45.7000, 17.7000 Hang Tram, Vietnam, 20.3944, 105.6222 Lincolnton, United States, 35.4748, -81.2386 La Riviera, United States, 38.5683, -121.3544 Estiva, Brazil, -22.4628, -46.0169 Villefranche-de-Rouergue, France, 44.3533, 2.0350 Gospic, Croatia, 44.5469, 15.3744 Liman, Azerbaijan, 38.8733, 48.8139 Strombeek-Bever, Belgium, 50.9100, 4.3500 Kaboua, Benin, 8.2500, 2.6833 Egelsbach, Germany, 49.9667, 8.6667 Liubashivka, Ukraine, 47.8358, 30.2642 Dang`ara, Uzbekistan, 40.5831, 70.9100 'Ain Roua, Algeria, 36.3344, 5.1806 Le Haillan, France, 44.8725, -0.6758 Taviano, Italy, 39.9833, 18.0833 Santa Isabel Cholula, Mexico, 19.0000, -98.3667 Barhi, India, 26.5714, 86.0903 Rabat, Malta, 35.8817, 14.3989 Baruari, India, 26.0305, 86.5965 Sonapur, India, 26.3716, 87.2162 Kemigawa, Japan, 35.6514, 140.0662 Kamalapuram, India, 18.2925, 80.4608 Loyalsock, United States, 41.2743, -76.9839 Kalampaka, Greece, 39.7081, 21.6284 Mercogliano, Italy, 40.9231, 14.7428 Oskaloosa, United States, 41.2922, -92.6404 Sidi Amer El Hadi, Morocco, 34.7992, -5.8394 Aginskoye, Russia, 51.1031, 114.5228 Montmagny, Canada, 46.9833, -70.5500 Guayabal, Colombia, 4.9633, -74.9056 Ihumwa, Tanzania, -6.1667, 35.8833 Four Corners, United States, 29.6705, -95.6596 Woods Cross, United States, 40.8731, -111.9170 River Forest, United States, 41.8950, -87.8194 Oxelosund, Sweden, 58.6667, 17.1000 Mount Fletcher, South Africa, -30.6920, 28.5030 Salisbury, United States, 40.0380, -75.9961 Mexico, United States, 39.1625, -91.8712 Sathiala, India, 31.5550, 75.2656 Essex, United States, 44.5196, -73.0656 Tinogasta, Argentina, -28.0667, -67.5667 San Gregorio di Catania, Italy, 37.5651, 15.1116 Moyamba, Sierra Leone, 8.1606, -12.4333 New Port Richey East, United States, 28.2605, -82.6931 Bank, India, 24.9539, 84.1928 Revuca, Slovakia, 48.6833, 20.1167 Altdorf, Germany, 48.5667, 12.1167 Pontiac, United States, 40.8894, -88.6409 Fort Campbell North, United States, 36.6631, -87.4764 Peringottukurusshi, India, 10.7536, 76.4883 Iconha, Brazil, -20.7928, -40.8108 Gaurihar Khaliqnagar, India, 25.9356, 85.4671 Fatehpur Shahbaz, India, 25.5698, 85.3437 Alto Alegre dos Parecis, Brazil, -12.1278, -61.8508 Asjen, Morocco, 34.8500, -5.6167 Leon Valley, United States, 29.4954, -98.6143 Jamsaut, India, 25.6100, 85.0148 Panapur Langa, India, 25.7230, 85.2878 Alfonsine, Italy, 44.5061, 12.0411 Palestina, Brazil, -20.3900, -49.4328 Bek-Abad, Kyrgyzstan, 40.8472, 72.9714 Raca, Serbia, 44.2333, 20.9833 Satyavedu, India, 13.4370, 79.9560 Kuriyama, Japan, 43.0500, 141.7833 North Valley, United States, 35.1736, -106.6231 Gotzis, Austria, 47.3331, 9.6333 Kavaratti, India, 10.5626, 72.6369 Lebon Regis, Brazil, -26.9289, -50.6950 Vengikkal, India, 12.2642, 79.0675 Poldasht, Iran, 39.3447, 45.0681 Valea Adanca, Romania, 47.1256, 27.5565 Farmington, United States, 42.4614, -83.3784 Kings Mountain, United States, 35.2349, -81.3501 Pirangi, Brazil, -21.0914, -48.6578 Gonubie, South Africa, -32.9430, 28.0080 Kishanganj, India, 25.6844, 86.9509 Sinkolo, Mali, 12.2056, -5.0403 Wormer, Netherlands, 52.5000, 4.8167 El Ancor, Algeria, 35.6833, -0.8667 Kari, India, 24.8368, 78.8665 Arasur, India, 11.0866, 77.1146 Rupenaguntla, India, 16.3043, 79.9991 Shanmukhasundarapuram, India, 10.0065, 77.5982 Muna, Mexico, 20.4800, -89.7200 Citrus Springs, United States, 28.9931, -82.4594 Coswig, Germany, 51.8833, 12.4333 Aydincik, Turkey, 36.1417, 33.3178 Vlasenica, Bosnia and Herzegovina, 44.1833, 18.9333 Cidade Gaucha, Brazil, -23.3800, -52.9450 Prudente de Morais, Brazil, -19.4819, -44.1550 Agame, Benin, 6.7333, 1.7667 Bhabanipur, India, 24.7153, 87.9227 Gloucester City, United States, 39.8924, -75.1172 Westerkappeln, Germany, 52.3806, 7.6000 Oak Hills, United States, 45.5405, -122.8413 Trostberg an der Alz, Germany, 48.0167, 12.5500 Dautphe, Germany, 50.8333, 8.5500 Loran, India, 33.8346, 74.3312 Ninga, India, 25.4616, 86.0757 Kalakada, India, 13.8167, 78.8000 Duruma, Saudi Arabia, 24.6173, 46.2256 Rengali, India, 21.6460, 84.0531 Kashaf, Iran, 36.3678, 59.5767 Chauny, France, 49.6164, 3.2200 Khangaon, India, 25.5146, 84.7528 Vlasim, Czechia, 49.7064, 14.8989 Maruttuvakkudi, India, 11.0153, 79.4819 Buram, India, 25.9739, 86.3196 Culcheth, United Kingdom, 53.4517, -2.5218 Schiller Park, United States, 41.9586, -87.8693 Half Moon Bay, United States, 37.4685, -122.4382 Shingbwiyang, Burma, 26.6667, 96.2167 Mogilno, Poland, 52.6500, 17.9500 Abadiania, Brazil, -16.2039, -48.7069 Steha, Morocco, 35.3646, -4.9306 Cocentaina, Spain, 38.7450, -0.4406 Gravelines, France, 50.9858, 2.1283 Chakwai, India, 25.0543, 85.6620 Ahlaf, Morocco, 33.2833, -7.2000 Moss Bluff, United States, 30.3039, -93.2051 Bellegarde-sur-Valserine, France, 46.1083, 5.8267 Hanover, United States, 41.2012, -75.9290 Cantley, Canada, 45.5667, -75.7833 Esmoriz, Portugal, 40.9620, -8.6295 Humpolec, Czechia, 49.5417, 15.3572 Chitauria, India, 25.4869, 87.5511 Florestopolis, Brazil, -22.8628, -51.3869 Ouro Branco, Brazil, -9.1667, -37.3567 Madakai, India, 12.3278, 75.1500 Lauingen, Germany, 48.5667, 10.4333 Odatturai, India, 11.4577, 77.5150 Montanhas, Brazil, -6.4858, -35.2878 Baroni Khurd, India, 25.6852, 78.3746 Ban Saeo, Thailand, 20.2158, 100.2250 Satuek, Thailand, 15.2970, 103.2919 Lovington, United States, 32.9128, -103.3276 Mack, United States, 39.1492, -84.6794 Sideradougou, Burkina Faso, 10.6876, -4.2627 Mayate, Morocco, 32.2667, -7.5167 Weston, United States, 42.3589, -71.3001 Rychnov nad Kneznou, Czechia, 50.1631, 16.2744 Grunwald, Germany, 48.0333, 11.5167 Cumanda, Ecuador, -2.2058, -79.1339 Milici, Bosnia and Herzegovina, 44.1703, 19.0919 Toropets, Russia, 56.5000, 31.6500 Sonoita, Mexico, 31.8614, -112.8544 Dhalaa, Algeria, 35.4611, 7.5472 Ajijic, Mexico, 20.3000, -103.2833 Ridgefield, United States, 40.8313, -74.0147 Erin, Canada, 43.7667, -80.0667 Saubara, Brazil, -12.7378, -38.7689 Lendinara, Italy, 45.0850, 11.6006 Varzobkala, Tajikistan, 38.7667, 68.8167 Woodbury, United States, 41.3284, -74.1004 Caetanopolis, Brazil, -19.2950, -44.4189 Ochsenfurt, Germany, 49.6500, 10.0667 Markham, United States, 41.6000, -87.6904 Puerto Rico, Colombia, 2.9383, -73.2083 Barahkurwa, India, 26.1460, 86.9237 Volosovo, Russia, 59.4333, 29.4833 Gandhari, India, 18.3932, 78.1174 Hato Corozal, Colombia, 3.1833, -73.7500 Engen, Germany, 47.8528, 8.7714 Tlacolulan, Mexico, 19.6667, -97.0000 Emet, Turkey, 39.3333, 29.2667 Er Regueb, Tunisia, 34.8667, 9.7833 Home Gardens, United States, 33.8783, -117.5116 Shahpur, India, 24.0312, 84.0543 La Libertad, Nicaragua, 12.2167, -85.1667 Winton, United States, 37.3854, -120.6173 Ramallo, Argentina, -33.3167, -60.2000 Medroussa, Algeria, 35.1667, 1.2000 Tucson Mountains, United States, 32.2822, -111.0773 Notre-Dame-de-l'Ile-Perrot, Canada, 45.3667, -73.9333 San Jose de Guaribe, Venezuela, 9.8602, -65.8131 Kumari, India, 25.6564, 87.7112 Stradella, Italy, 45.0833, 9.3000 Koori, Japan, 37.8494, 140.5164 Mogogelo, South Africa, -25.3540, 28.1380 Belgrade, United States, 45.7789, -111.1736 Kuse, Japan, 35.0759, 133.7534 Dorog, Hungary, 47.7194, 18.7292 Pallipattu, India, 13.3361, 79.4413 New Garden, United States, 39.8119, -75.7517 Lahaina, United States, 20.8848, -156.6618 Malo Crnice, Serbia, 44.5667, 21.2833 Kalmiuske, Ukraine, 47.6667, 38.0667 Cangas de Narcea, Spain, 43.1714, -6.5389 Vakhrusheve, Ukraine, 48.1667, 38.8333 Nemyriv, Ukraine, 48.9667, 28.8500 Platteville, United States, 42.7280, -90.4681 Kinattukkadavu, India, 10.8225, 77.0196 Kondhali, India, 21.1383, 78.6408 Hohenkirchen-Siegertsbrunn, Germany, 48.0167, 11.7333 Haydock, United Kingdom, 53.4678, -2.6609 Casier, Italy, 45.6436, 12.2953 Qax, Azerbaijan, 41.4194, 46.9181 Naliya, India, 23.2611, 68.8267 Sanniquellie, Liberia, 7.3622, -8.7061 Jimani, Dominican Republic, 18.4833, -71.8500 Hoenheim, France, 48.6250, 7.7553 Novy Bor, Czechia, 50.7553, 14.5536 Mahagama, India, 25.0342, 87.3187 Tourougoumbe, Mali, 15.2660, -9.2290 Hamilton, United States, 39.9432, -77.7327 Kostinbrod, Bulgaria, 42.8170, 23.2170 Guinagourou, Benin, 9.5667, 2.9500 Sales Oliveira, Brazil, -20.7719, -47.8378 Pothia, India, 25.5413, 87.2637 Senduria, India, 26.7469, 84.6754 Raibari Mahuawa, India, 27.0980, 84.2963 Toprakkale, Turkey, 37.0669, 36.1464 Shchastia, Ukraine, 48.7333, 39.2333 Florennes, Belgium, 50.2514, 4.6044 Sao Amaro das Brotas, Brazil, -10.7889, -37.0544 Cabo Verde, Brazil, -21.4719, -46.3958 Recke, Germany, 52.3700, 7.7189 Oulad Friha, Morocco, 32.6108, -7.6250 Rejiche, Tunisia, 35.4667, 11.0333 Port Lavaca, United States, 28.6181, -96.6278 Polyarnyye Zori, Russia, 67.3667, 32.5000 Borcka, Turkey, 41.3636, 41.6792 Barro Alto, Brazil, -14.9708, -48.9158 Ovidiopol, Ukraine, 46.2447, 30.4447 Lopon, India, 30.6715, 75.3438 Prataparampuram, India, 10.6741, 79.8512 Sociedad, El Salvador, 13.7000, -88.0167 Elk City, United States, 35.3862, -99.4301 Lumaco, Chile, -38.1500, -72.9167 Tegueste, Spain, 28.5167, -16.3333 Majdal Shams, Israel, 33.2667, 35.7667 Tysvaer, Norway, 59.3319, 5.4897 Rostraver, United States, 40.1690, -79.8087 Ganserndorf, Austria, 48.3406, 16.7175 Pelileo, Ecuador, -1.3306, -78.5428 San Rafael Obrajuelo, El Salvador, 13.5000, -88.9333 Scottburgh, South Africa, -30.2833, 30.7500 Wilton Manors, United States, 26.1593, -80.1395 Kirchhundem, Germany, 51.0667, 8.0833 Muscoy, United States, 34.1552, -117.3477 Touama, Morocco, 31.5339, -7.4872 Kurim, Czechia, 49.2986, 16.5314 Buzhum, Kyrgyzstan, 40.0048, 70.8352 El Menzel, Morocco, 33.8389, -4.5458 Laren, Netherlands, 52.2500, 5.2333 Sharg`un, Uzbekistan, 38.4600, 67.9669 Bath, United States, 42.3219, -77.3083 Dawley, United Kingdom, 52.6630, -2.4670 East Glenville, United States, 42.8648, -73.9256 Dobbs Ferry, United States, 41.0127, -73.8697 Gundrajukuppam, India, 13.3406, 79.5687 Suffern, United States, 41.1138, -74.1422 Wealdstone, United Kingdom, 51.5957, -0.3352 Grosse Pointe Park, United States, 42.3794, -82.9287 East Grand Rapids, United States, 42.9464, -85.6088 San Michele al Tagliamento, Italy, 45.7636, 12.9953 Spencer, United States, 43.1468, -95.1534 Enebakk, Norway, 59.7639, 11.1444 Sao Joao das Lampas, Portugal, 38.8700, -9.4211 Montegrotto Terme, Italy, 45.3333, 11.7833 Yalluru, India, 15.3063, 78.4559 Greetland, United Kingdom, 53.6869, -1.8714 Higashiizu, Japan, 34.7667, 139.0333 La Homa, United States, 26.2796, -98.3575 Kincardine, Canada, 44.1667, -81.6333 Wittingen, Germany, 52.7167, 10.7333 Diez, Germany, 50.3708, 8.0158 Simrahi, India, 26.3135, 86.8454 Norvenich, Germany, 50.8000, 6.6500 Newport, United Kingdom, 52.7691, -2.3787 Eldorado, Brazil, -23.7869, -54.2839 Pihuamo, Mexico, 18.9500, -103.1670 Guacheta, Colombia, 5.3856, -73.6856 Rothenburg ob der Tauber, Germany, 49.3833, 10.1833 Mancha Real, Spain, 37.7864, -3.6125 Falimari, India, 26.3856, 89.8233 Sidi Tabet, Tunisia, 36.9139, 10.0361 Batesville, United States, 35.7687, -91.6227 Noeux-les-Mines, France, 50.4803, 2.6656 Oregon, United States, 42.9253, -89.3892 Anjuna, India, 15.5833, 73.7333 Lakhipur, India, 26.3281, 88.3863 Hejiaji, China, 37.3569, 109.8514 Saint-Junien, France, 45.8881, 0.9019 Konakondla, India, 15.1053, 77.3640 Campobello di Mazara, Italy, 37.6333, 12.7500 Chekmagush, Russia, 55.1333, 54.6667 Lijiacha, China, 37.2475, 109.4103 Samayanallur, India, 9.9792, 78.0359 Halavagalu, India, 14.7083, 75.7753 Grafenhainichen, Germany, 51.7167, 12.4333 Kranenburg, Germany, 51.7897, 6.0072 Buckhurst Hill, United Kingdom, 51.6320, 0.0360 Baghmaria, India, 26.4400, 86.4300 Harji, India, 25.3000, 72.8500 Bind, India, 25.3035, 85.6869 Santa Fe, Brazil, -23.0378, -51.8050 Garuva, Brazil, -26.0269, -48.8550 Welzheim, Germany, 48.8747, 9.6344 Vaux-le-Penil, France, 48.5257, 2.6824 Sarjapur, India, 12.8600, 77.7860 Campo do Meio, Brazil, -21.1069, -45.8300 Salamedu, India, 11.9088, 79.4919 Pir Maker, India, 25.9622, 85.0257 Rosario de Mora, El Salvador, 13.5833, -89.2167 Staden, Belgium, 50.9833, 3.0167 Harrow Weald, United Kingdom, 51.6040, -0.3390 Sevilla, Philippines, 9.7000, 124.0500 Great Bookham, United Kingdom, 51.2780, -0.3730 Little Bookham, United Kingdom, 51.2804, -0.3897 Bansbari, India, 26.1934, 87.4498 Uchchangidurgam, India, 14.5614, 76.0537 Kochkor, Kyrgyzstan, 42.2155, 75.7566 Buuhoodle, Somalia, 8.2547, 46.3283 Musile di Piave, Italy, 45.6178, 12.5650 Bridgeton, United States, 38.7673, -90.4275 Elliot Lake, Canada, 46.3833, -82.6500 Handewitt, Germany, 54.7667, 9.3167 Pelsall, United Kingdom, 52.6310, -1.9720 Kamiita, Japan, 34.1167, 134.4000 Okmulgee, United States, 35.6134, -96.0068 Humahuaca, Argentina, -23.2000, -65.3500 Alcantaras, Brazil, -3.5889, -40.5458 Bhagwatpur, India, 25.7484, 85.7016 Biddupur, India, 25.6464, 85.3203 Waihee-Waiehu, United States, 20.9188, -156.5063 Puyehue, Chile, -40.6833, -72.6000 Harsum, Germany, 52.2000, 9.9500 Zambrano, Colombia, 9.7500, -74.8333 Eichenzell, Germany, 50.4833, 9.7000 Byerazino, Belarus, 53.8333, 28.9833 Jodar, Spain, 37.8333, -3.3500 Parora, India, 25.8022, 87.4032 Rheinau, Germany, 48.6678, 7.9347 Baghra, India, 25.5597, 85.5841 Atharga, India, 16.9875, 75.8863 San Jose del Fragua, Colombia, 1.3286, -75.9728 Lonate Pozzolo, Italy, 45.6000, 8.7500 Resende, Portugal, 41.1000, -7.9500 Arumbakkam, India, 13.5427, 80.0690 Meghraj, India, 23.5000, 73.5000 Jamhor, India, 24.8486, 84.3258 Pachahi, India, 26.1932, 86.3597 Manpaur, India, 26.5081, 85.9478 Sidi Baizid, Algeria, 35.7500, 2.3833 Carnoustie, United Kingdom, 56.5010, -2.7100 Gardone Val Trompia, Italy, 45.6833, 10.1833 Zierikzee, Netherlands, 51.6497, 3.9164 Belen, Paraguay, -23.4695, -57.2400 Phulparas, India, 26.3549, 86.4908 Manappakkam, India, 13.0108, 80.1686 Kalinagar, India, 22.4383, 88.1150 Newtown, United Kingdom, 52.5132, -3.3141 Bromont, Canada, 45.3167, -72.6500 Parvatgiri, India, 17.7417, 79.7264 Perampuzha, India, 12.1343, 75.3006 Rancho Mission Viejo, United States, 33.5140, -117.5618 Bargaon, India, 25.3455, 84.6607 Bishunpur, India, 26.1561, 87.2711 Monte Sant'Angelo, Italy, 41.7000, 15.9667 Akola, India, 27.0656, 77.8808 Talaigua Nuevo, Colombia, 9.3069, -74.5686 Bataipora, Brazil, -22.2953, -53.2711 Vitry-le-Francois, France, 48.7256, 4.5853 Downham Market, United Kingdom, 52.6000, 0.3900 Tokol, Hungary, 47.3219, 18.9619 Douar Trougout, Morocco, 35.1800, -3.7700 Charouine, Algeria, 29.0186, -0.2578 Ploufragan, France, 48.4900, -2.7940 Cardoso, Brazil, -20.0819, -49.9139 Taurisano, Italy, 39.9568, 18.2200 Vaal Reefs, South Africa, -26.9290, 26.7360 Nalambur, India, 13.0867, 80.1703 Cherlagandlapalem, India, 16.0069, 80.6117 Calatrava, Philippines, 12.6167, 122.0708 Pimenteiras, Brazil, -6.2450, -41.4189 Cocoa Beach, United States, 28.3327, -80.6274 Lyuban, Belarus, 52.7819, 28.0525 Capaci, Italy, 38.1667, 13.2333 Fulton, United States, 43.3171, -76.4167 Teniet el Abed, Algeria, 35.2469, 6.1906 Polykastro, Greece, 41.0000, 22.5667 Kurgunta, India, 17.2000, 77.3600 Domnesti, Romania, 44.4000, 25.9167 Somerville, Australia, -38.2260, 145.1770 Moglingen, Germany, 48.8883, 9.1292 Dharmaj, India, 22.4167, 72.8000 Waidhofen an der Ybbs, Austria, 47.9667, 14.7667 Machados, Brazil, -7.6858, -35.5150 Yanahuanca, Peru, -10.4914, -76.5136 Gustavsberg, Sweden, 59.3167, 18.3833 Nussloch, Germany, 49.3236, 8.6939 Kozloduy, Bulgaria, 43.7833, 23.7333 Gouvea, Brazil, -18.4560, -43.7424 Rodenbach, Germany, 50.1389, 9.0417 Natshal, India, 22.1957, 88.0272 Besalampy, Madagascar, -16.7495, 44.4833 El Quisco, Chile, -33.3913, -71.6929 Santa Rosa de Viterbo, Colombia, 5.8833, -72.9833 Papireddippatti, India, 11.9140, 78.3675 Pemmperena, Mali, 11.4222, -5.7469 Sonseca, Spain, 39.7000, -3.9500 Tiruvennanallur, India, 11.8589, 79.3664 Roessleville, United States, 42.6969, -73.7964 Mashyal, India, 17.3226, 76.2407 Langarivo, Madagascar, -14.6034, 50.0552 Mitchellville, United States, 38.9358, -76.8146 Elon, United States, 36.1016, -79.5086 Barigarh, India, 25.2325, 80.0347 Ban Bang Lamung, Thailand, 13.0470, 100.9289 Virton, Belgium, 49.5677, 5.5323 Tabapua, Brazil, -20.9639, -49.0319 Saverne, France, 48.7400, 7.3600 Timperley, United Kingdom, 53.3870, -2.3280 Catskill, United States, 42.2063, -73.9435 Mulheim-Karlich, Germany, 50.3869, 7.4953 Masinigudi, India, 11.5683, 76.6409 Powdersville, United States, 34.7826, -82.4959 Holbrook, United States, 42.1471, -71.0057 Rudersberg, Germany, 48.8856, 9.5281 Varadarajampettai, India, 11.3553, 79.4186 Capitan Bado, Paraguay, -23.2673, -55.5388 Tosagua, Ecuador, -0.7800, -80.2600 Leatherhead, United Kingdom, 51.2950, -0.3290 Ban Yang Hom, Thailand, 19.9222, 100.3056 Gracemere, Australia, -23.4391, 150.4558 Bitritto, Italy, 41.0500, 16.8333 Burslem, United Kingdom, 53.0426, -2.1879 Marasesti, Romania, 45.8800, 27.2300 Clawson, United States, 42.5367, -83.1504 Denkendorf, Germany, 48.6958, 9.3175 Cadolzburg, Germany, 49.4500, 10.8667 Worb, Switzerland, 46.9306, 7.5644 Sebt Bni Garfett, Morocco, 35.2500, -5.8333 Tenenkou, Mali, 14.4556, -4.9181 Snyder, United States, 32.7133, -100.9116 Tazhakudi, India, 8.2348, 77.4533 Norwell, United States, 42.1608, -70.8177 Hipperholme, United Kingdom, 53.7258, -1.8120 Edasseri, India, 8.6654, 76.8459 Janow Lubelski, Poland, 50.7167, 22.4167 Fountain Inn, United States, 34.6989, -82.2005 Naryn, Kyrgyzstan, 41.1328, 72.0816 Dimmbal, Mali, 14.0257, -3.6152 Zimna Voda, Ukraine, 49.8222, 23.9028 Arnprior, Canada, 45.4333, -76.3500 Tudela, Philippines, 10.6360, 124.4700 Biganos, France, 44.6450, -0.9772 Villa Purificacion, Mexico, 19.5667, -104.3833 Tournon-sur-Rhone, France, 45.0681, 4.8333 Honmachi, Japan, 43.9167, 144.6667 Selma, United States, 29.5866, -98.3132 Ikhlaspur, India, 25.0589, 83.6083 Sabana Yegua, Dominican Republic, 18.7167, -71.0167 Periya Soragai, India, 11.7394, 77.9170 Jem'at Oulad 'Abbou, Morocco, 33.1156, -7.9333 Sebba, Burkina Faso, 13.4333, 0.5333 Lafrayta, Morocco, 31.9167, -7.2500 Caldogno, Italy, 45.6118, 11.5076 Inhassoro, Mozambique, -21.5347, 35.2022 Ichinohe, Japan, 40.2129, 141.2954 Estiva Gerbi, Brazil, -22.2708, -46.9450 Gualcince, Honduras, 14.1237, -88.5428 Batemans Bay, Australia, -35.7081, 150.1744 Caotan, China, 36.2703, 105.2033 Singura, India, 24.7928, 92.9510 Commune Sidi Youssef Ben Ahmed, Morocco, 33.7861, -4.8152 Arslanbob, Kyrgyzstan, 41.3382, 72.9291 Panpuli, India, 9.0214, 77.2502 Teano, Italy, 41.2500, 14.0667 Getulina, Brazil, -21.7986, -49.9286 Willistown, United States, 40.0010, -75.4915 Ravenna, United States, 41.1612, -81.2422 Golfito, Costa Rica, 8.6526, -83.1733 Drochtersen, Germany, 53.7000, 9.3833 Tikota, India, 16.7600, 75.6200 Antsambalahy, Madagascar, -14.7709, 49.9586 Amatenango del Valle, Mexico, 16.5167, -92.4000 Ban Kat, Thailand, 18.1764, 97.9339 Stamboliyski, Bulgaria, 42.1330, 24.5330 Meru, India, 24.0097, 85.4673 Anderson, United States, 40.4497, -122.2950 Pedro de Toledo, Brazil, -24.2750, -47.2328 Limavady, United Kingdom, 55.0530, -6.9460 Stanwell, United Kingdom, 51.4570, -0.4715 Beldibi, Turkey, 36.8667, 28.2667 De Doorns, South Africa, -33.4833, 19.6833 North Dundas, Canada, 45.0833, -75.3500 Tramore, Ireland, 52.1589, -7.1464 Derdara, Morocco, 35.1103, -5.2872 Whitestown, United States, 39.9706, -86.3612 Pipariya, India, 25.2593, 86.1149 Somavarappatti, India, 10.6779, 77.2131 Storm Lake, United States, 42.6431, -95.1960 Kanhaipur, India, 25.4542, 85.8396 Biri, Philippines, 12.6700, 124.3800 Majanji, Uganda, 0.2408, 33.9914 Healdsburg, United States, 38.6224, -122.8651 Caimanera, Cuba, 19.9908, -75.1520 Bhilavadi, India, 16.8586, 74.3317 Seneffe, Belgium, 50.5167, 4.2500 Iskapalem, India, 14.5416, 79.8925 Riedlingen, Germany, 48.1553, 9.4728 Curimata, Brazil, -10.0358, -44.3058 Covenas, Colombia, 9.4167, -75.7000 Astley, United Kingdom, 53.5008, -2.4454 Fallersleben, Germany, 52.4189, 10.7169 Simeria, Romania, 45.8500, 23.0100 Riebeeckstad, South Africa, -27.9188, 26.8188 Sinor, India, 22.0000, 73.3000 Asthal Bohar, India, 28.8730, 76.6420 Chornomorske, Ukraine, 45.5019, 32.7025 Caetano, Brazil, -14.3378, -40.9100 Samahuta, India, 25.8542, 84.6614 Burtonwood, United Kingdom, 53.4302, -2.6614 Banavar, India, 13.4167, 76.1667 Trecastagni, Italy, 37.6167, 15.0833 Groton, United States, 42.6137, -71.5614 Triangle, United States, 38.5483, -77.3195 Hagen im Bremischen, Germany, 53.3667, 8.6500 Kushk, Iran, 32.6419, 51.4997 Sirpanandal, India, 11.9741, 79.0428 Prien am Chiemsee, Germany, 47.8667, 12.3333 Santa Cruz, Ecuador, -0.5333, -90.3500 Newport East, United States, 41.5159, -71.2878 Montlouis-sur-Loire, France, 47.3892, 0.8281 Bara Belun, India, 23.4007, 87.9733 Isselburg, Germany, 51.8331, 6.4667 Largs, United Kingdom, 55.7950, -4.8700 Zawyat Ahancal, Morocco, 31.8325, -6.1056 Sogne, Norway, 58.0942, 7.7725 Beclean, Romania, 47.1797, 24.1797 Ventersburg, South Africa, -28.0833, 27.1333 Ocean City, United States, 39.2681, -74.6020 Wellesley, Canada, 43.5500, -80.7167 Edd, Eritrea, 13.9333, 41.7000 Sosenskiy, Russia, 54.0500, 35.9667 Warfield, United Kingdom, 51.4420, -0.7370 Boultham, United Kingdom, 53.2239, -0.5539 Tamba, India, 17.0001, 75.9934 Datiana, India, 25.4834, 84.8628 Kovurupalli, India, 14.7772, 79.9999 Sant'Ilario d'Enza, Italy, 44.7519, 10.4714 Niasso, Mali, 13.2008, -5.0403 Oulad Rahmoun, Morocco, 32.3278, -6.5006 Korb, Germany, 48.8417, 9.3611 Jadopur Shukul, India, 26.5250, 84.4341 Fredericksburg, United States, 30.2660, -98.8751 Poko, Congo (Kinshasa), 3.1500, 26.8833 Narayanavanam, India, 13.4200, 79.5800 El Playon, Colombia, 7.4767, -73.2081 Kin, Japan, 26.4561, 127.9261 Roncador, Brazil, -24.6028, -52.2750 Bollullos de la Mitacion, Spain, 37.3333, -6.1333 Sajoszentpeter, Hungary, 48.2169, 20.7183 Deodha, India, 25.7815, 86.1346 Prachatice, Czechia, 49.0131, 13.9975 Tetyushi, Russia, 54.9333, 48.8333 Lang Suan, Thailand, 9.9500, 99.0667 Satellite Beach, United States, 28.1782, -80.6019 Pontchateau, France, 47.4300, -2.0830 Priolo Gargallo, Italy, 37.1667, 15.1833 Quebrangulo, Brazil, -9.3189, -36.4711 Klyetsk, Belarus, 53.0636, 26.6372 Bicske, Hungary, 47.4907, 18.6363 Tasova, Turkey, 40.7500, 36.3167 Farciennes, Belgium, 50.4314, 4.5475 Malkanur, India, 18.0821, 79.3628 Sao Joao do Manhuacu, Brazil, -20.3939, -42.1508 Scalea, Italy, 39.8049, 15.7969 Alburquerque, Philippines, 9.6104, 123.9549 Sahsaul, India, 25.7024, 86.7758 Waupun, United States, 43.6314, -88.7381 Las Charcas, Dominican Republic, 18.4500, -70.6200 Makhmalpur, India, 25.2870, 87.5469 Mannedorf, Switzerland, 47.2553, 8.6917 Herbolzheim, Germany, 48.2219, 7.7775 Eranapuram, India, 11.5581, 77.9893 Vasylkivka, Ukraine, 48.2083, 36.0294 Greasley, United Kingdom, 53.0200, -1.2700 Retie, Belgium, 51.2658, 5.0828 Saint-Jean, France, 43.6664, 1.5058 La Roche-sur-Foron, France, 46.0673, 6.3113 Kpandae, Ghana, 8.4688, -0.0113 Chintakunta, India, 14.6476, 78.4690 Bramhabarada, India, 20.6683, 86.0747 Bardiha Turki, India, 25.8059, 85.5441 Kariat Ben Aouda, Morocco, 34.7667, -5.9500 Nyirbator, Hungary, 47.8353, 22.1300 Attippattu, India, 13.2633, 80.2911 Gethaura, India, 25.6879, 87.7092 Kishunpur, India, 25.3272, 87.7173 Paimio, Finland, 60.4500, 22.7000 San Pablo Atlazalpan, Mexico, 19.2172, -98.9090 Sankt Johann im Pongau, Austria, 47.3500, 13.2000 Pueblo Viejo, Dominican Republic, 18.4000, -70.7667 Lavandevil, Iran, 38.3089, 48.8703 Akjoujt, Mauritania, 19.7470, -14.3910 Khera Kalan, India, 28.7781, 77.0988 Derbisek, Kazakhstan, 41.5608, 69.3378 Kourouma, Mali, 11.0503, -6.0728 Beniajan, Spain, 37.9833, -1.0667 Tentena, Indonesia, -1.7822, 120.6494 Bora, India, 23.6585, 76.8112 Betania, Brazil, -8.2767, -38.0339 Mineiros do Tiete, Brazil, -22.4089, -48.4508 Resende Costa, Brazil, -20.9219, -44.2378 Mountain Ash, United Kingdom, 51.6814, -3.3792 Inzago, Italy, 45.5333, 9.4833 Senillosa, Argentina, -39.0100, -68.4300 Pasaco, Guatemala, 13.9833, -90.2000 Moyuta, Guatemala, 14.0333, -90.0833 Monteforte Irpino, Italy, 40.8928, 14.7194 Lansing, United States, 39.2428, -94.8972 North Logan, United States, 41.7759, -111.8066 Rahiar Kunchi, India, 25.8627, 86.0924 Anenecuilco, Mexico, 18.7781, -98.9850 Crayford, United Kingdom, 51.4491, 0.1812 Pedersore, Finland, 63.6642, 22.7006 Amarchinta, India, 16.3740, 77.7729 Jagdishpur, India, 26.1526, 86.1146 Koog aan de Zaan, Netherlands, 52.4667, 4.8000 Aratuba, Brazil, -4.4178, -39.0450 Antonio Carlos, Brazil, -27.5169, -48.7678 Two Rivers, United States, 44.1565, -87.5824 Cold Springs, United States, 39.6927, -119.9775 Belauncha, India, 26.2124, 86.3554 Vahdattiyeh, Iran, 29.4842, 51.2319 Waldkirchen, Germany, 48.7305, 13.6011 Arta, Djibouti, 11.5236, 42.8472 Westwood, United States, 40.9878, -74.0308 Toliman, Mexico, 19.5333, -103.9000 Djemmorah, Algeria, 35.0667, 5.8333 Amala, India, 9.8590, 76.8112 Kassa, Mali, 14.7247, -3.0664 Bayou Blue, United States, 29.6341, -90.6733 Castle Bromwich, United Kingdom, 52.5050, -1.7856 Kaset Wisai, Thailand, 15.6556, 103.5836 Vanj, Tajikistan, 38.3731, 71.4553 Hamadanak, Iran, 35.5422, 51.1383 Tamazouzt, Morocco, 31.3833, -8.3833 Kedougou, Senegal, 12.5556, -12.1807 Miechow, Poland, 50.3578, 20.0325 Sayda, Syria, 32.6294, 36.2263 Pinheiro Machado, Brazil, -31.5778, -53.3808 Chassieu, France, 45.7450, 4.9660 Mannarai, India, 11.1172, 77.3726 Sanzana, Mali, 12.0958, -6.2053 Holic, Slovakia, 48.8122, 17.1606 Nilo Pecanha, Brazil, -13.5989, -39.1069 Dhakaich, India, 25.5835, 84.1886 Talupula, India, 14.2500, 78.2667 Hambantota, Sri Lanka, 6.1244, 81.1253 Forestville, United States, 39.0711, -84.3389 Ranti, India, 26.3519, 86.0932 Emba, Kazakhstan, 48.8267, 58.1442 Gonzalez, Mexico, 22.8281, -98.4306 Wustermark, Germany, 52.5500, 12.9500 Montechiarugolo, Italy, 44.6934, 10.4224 Nembro, Italy, 45.7439, 9.7594 Beni Ounif, Algeria, 32.0500, -1.2500 Khargram, India, 24.0343, 87.9853 Ifrane, Morocco, 33.5333, -5.1167 Morgan City, United States, 29.7041, -91.1920 Panazol, France, 45.8397, 1.3108 Tittachcheri, India, 10.8674, 79.7893 Kummarapurugupalem, India, 16.3653, 81.6192 Temamatla, Mexico, 19.2028, -98.8700 Lathasepura, India, 25.8131, 85.7180 Carbonera, Italy, 45.6833, 12.2833 Ichikai, Japan, 36.5500, 140.1000 Guilherand, France, 44.9353, 4.8756 Brooklyn, United States, 41.4349, -81.7497 Kavarna, Bulgaria, 43.4361, 28.3394 Bom Jesus, Brazil, -28.6678, -50.4169 Laukaria, India, 26.7184, 84.4242 Berriozar, Spain, 42.8361, -1.6714 Westtown, United States, 39.9417, -75.5565 Budili, India, 13.9353, 77.7355 Tagami, Japan, 37.6988, 139.0580 Lommedalen, Norway, 59.9500, 10.4667 Kuvandyk, Russia, 51.4667, 57.3667 Lowes Island, United States, 39.0471, -77.3524 Namli, India, 23.4612, 75.0604 Kalasa, India, 13.2340, 75.3553 Nelson, Canada, 49.5000, -117.2833 Lloro, Colombia, 5.5000, -76.5333 Sanjiaocheng, China, 36.8908, 100.9997 Eisenberg, Germany, 50.9681, 11.9014 Corbas, France, 45.6600, 4.9000 Canandaigua, United States, 42.8608, -77.3182 Waipio, United States, 21.4143, -157.9966 Valkeala, Finland, 60.9389, 26.7972 Sarab-e Taveh-ye `Olya, Iran, 30.5981, 51.5761 Petal, United States, 31.3477, -89.2359 Rutesheim, Germany, 48.8097, 8.9450 Borjomi, Georgia, 41.8417, 43.3828 Sirgora, India, 22.2063, 78.8832 Chamestan, Iran, 36.4792, 52.1194 Ladysmith, Canada, 48.9975, -123.8203 Werther, Germany, 52.0750, 8.4125 Chikni, India, 26.0075, 86.7032 Faxinal dos Guedes, Brazil, -26.8528, -52.2600 Bhisho, South Africa, -32.8494, 27.4381 Nafpaktos, Greece, 38.3939, 21.8306 Shahmirzad, Iran, 35.7700, 53.3336 Kazarman, Kyrgyzstan, 41.4045, 74.0283 Mpraeso, Ghana, 6.5932, -0.7346 Murska Sobota, Slovenia, 46.6586, 16.1619 Busumbala, Gambia, The, 13.3333, -16.6667 Siniscola, Italy, 40.5743, 9.6963 Agdz, Morocco, 30.6978, -6.4497 Yermolino, Russia, 55.2000, 36.6000 'Ain Tolba, Algeria, 35.2483, -1.2489 Nambour, Australia, -26.6269, 152.9591 Guntupalle, India, 16.5680, 80.5480 Damonojodi, India, 18.7632, 82.9194 Arambakkam, India, 13.5258, 80.0710 Prineville, United States, 44.2985, -120.8607 Pacoti, Brazil, -4.2250, -38.9228 Grand Rapids, United States, 47.2380, -93.5327 Linslade, United Kingdom, 51.9243, -0.6774 Collegedale, United States, 35.0526, -85.0488 Eura, Finland, 61.1333, 22.1333 Bucheya, India, 26.3421, 84.6642 Barka Gaon, India, 26.1440, 84.6598 Madala, India, 16.3715, 80.1198 Montopoli in Val d'Arno, Italy, 43.6744, 10.7503 Los Almacigos, Dominican Republic, 19.4083, -71.4417 Fortuna, Spain, 38.1789, -1.1233 Hernando, Argentina, -32.4167, -63.7333 North Branch, United States, 45.5137, -92.9601 Capilla del Monte, Argentina, -30.8500, -64.5167 Armstrong, Argentina, -32.7833, -61.6000 Parbata, India, 25.3164, 86.7200 Malkhaid, India, 17.1950, 77.1608 Salaya, Thailand, 13.8020, 100.3211 Aurelino Leal, Brazil, -14.3169, -39.3269 Hinwil, Switzerland, 47.3033, 8.8444 Pungulam, India, 12.5727, 78.7530 Harsinghpur, India, 26.0504, 86.2180 Kawadgaon, India, 17.9100, 77.5300 Baryshivka, Ukraine, 50.3539, 31.3167 Chikkarampalaiyam, India, 11.2416, 76.9854 Barbadanes, Spain, 42.3003, -7.9064 Surazh, Russia, 53.0167, 32.3833 Monmouth, United States, 44.8505, -123.2284 Moreira Sales, Brazil, -24.0619, -53.0069 Leek, Netherlands, 53.1616, 6.3847 Mhangura, Zimbabwe, -16.9000, 30.1500 Pia, France, 42.7458, 2.9217 Arvand Kenar, Iran, 29.9789, 48.5206 Arvand Kenar, Iran, 29.9786, 48.5189 Gora, Poland, 51.6667, 16.5500 Hoeilaart, Belgium, 50.7667, 4.4667 Grobbendonk, Belgium, 51.1919, 4.7386 Belzig, Germany, 52.1422, 12.5956 Seringueiras, Brazil, -11.7981, -63.0311 Kuzuculu, Turkey, 36.8833, 36.2333 Coldstream, Canada, 50.2200, -119.2481 Galbois, Algeria, 36.2000, 4.4900 Stonehaven, United Kingdom, 56.9640, -2.2110 Potukonda, India, 17.2708, 81.7540 Timberlane, United States, 29.8781, -90.0303 Romanshorn, Switzerland, 47.5635, 9.3564 Braunfels, Germany, 50.5167, 8.3833 Schoningen, Germany, 52.1333, 10.9500 Nagalapuram, India, 13.3889, 79.7967 Hormigueros, Puerto Rico, 18.1437, -67.1199 Rasaunk, India, 25.5537, 86.5117 Penne, Italy, 42.4500, 13.9167 Douar Ain Maatouf, Morocco, 34.4352, -4.5566 Palukudoddi, India, 15.8504, 77.6753 Marginea, Romania, 47.8167, 25.8333 Targu Lapus, Romania, 47.4525, 23.8631 Stansbury Park, United States, 40.6356, -112.3054 San Jose de Aerocuar, Venezuela, 10.6027, -63.3273 Wanaque, United States, 41.0440, -74.2900 Kumbadaje, India, 12.5667, 75.1000 Margherita di Savoia, Italy, 41.3667, 16.1500 Sater, Sweden, 60.3500, 15.7500 Baranivka, Ukraine, 50.3000, 27.6667 Creazzo, Italy, 45.5333, 11.4833 Vosselaar, Belgium, 51.3081, 4.8883 Capela de Santana, Brazil, -29.7000, -51.3250 Padre Burgos, Philippines, 10.0300, 125.0200 Gloucester Point, United States, 37.2767, -76.5043 Areiopolis, Brazil, -22.6681, -48.6650 Dorking, United Kingdom, 51.2325, -0.3306 Cacequi, Brazil, -29.8839, -54.8250 Bernardino de Campos, Brazil, -23.0131, -49.4742 Prymorsk, Ukraine, 46.7333, 36.3500 Honiton, United Kingdom, 50.8000, -3.1900 Sada, Mayotte, -12.8511, 45.0997 Fairview, United States, 42.0261, -80.2361 Gerasdorf bei Wien, Austria, 48.2950, 16.4675 Domazlice, Czechia, 49.4406, 12.9272 Mangalme, Chad, 12.3547, 19.6139 Urbana, United States, 40.1085, -83.7541 North Lindenhurst, United States, 40.7072, -73.3859 Tambaga, Mali, 12.9667, -9.8667 Rincon, United States, 32.2947, -81.2353 Unicov, Czechia, 49.7708, 17.1214 Aylestone, United Kingdom, 52.6040, -1.1540 Bhandarso, India, 26.1780, 86.1415 Baley, Russia, 51.6000, 116.6333 Zaragoza, Mexico, 28.4869, -100.9175 Dachne, Ukraine, 46.5775, 30.5489 Aukstieji Paneriai, Lithuania, 54.6262, 25.1810 Taylorville, United States, 39.5328, -89.2804 Somnaha, India, 25.9518, 85.7042 Hauterive, Canada, 49.1833, -68.2667 Antonio Cardoso, Brazil, -12.4350, -39.1200 Finale Ligure, Italy, 44.1691, 8.3435 Begogo, Madagascar, -23.4866, 46.7147 Planura, Brazil, -20.1378, -48.7019 Bailin, China, 33.4850, 105.0034 Mortugaba, Brazil, -15.0228, -42.3678 Sihaul, India, 25.9405, 86.5120 Sonbari, India, 24.2286, 80.7902 Progress, United States, 40.2901, -76.8394 Okhargara, India, 24.2141, 83.7856 Mayureswar, India, 23.9908, 87.7647 Cesson, France, 48.5633, 2.6053 Atru, India, 24.8100, 76.6300 Pulsano, Italy, 40.3842, 17.3547 Cerese, Italy, 45.1167, 10.7833 Dorridge, United Kingdom, 52.3720, -1.7554 Olaippatti, India, 11.7676, 77.9927 Elwood, United States, 40.8462, -73.3389 Hexham, United Kingdom, 54.9710, -2.1010 Cisternino, Italy, 40.7500, 17.4167 Lloyd, United States, 41.7286, -73.9961 Feldkirchen-Westerham, Germany, 47.9000, 11.8500 Saadatpur Aguani, India, 25.2830, 86.7412 Enfida, Tunisia, 36.1353, 10.3808 Warren, United States, 41.7282, -71.2629 Novska, Croatia, 45.3333, 16.9833 Banagi, India, 13.6100, 75.5300 Balehonnur, India, 13.3500, 75.4600 Oberwil, Switzerland, 47.5135, 7.5546 Pongalur, India, 10.9654, 77.3720 Kilkottai, India, 10.2861, 77.9160 Ecaussinnes-Lalaing, Belgium, 50.5667, 4.1833 Kanamadi, India, 16.9291, 75.3807 Udawantnagar, India, 25.5054, 84.6216 Finch'a'a, Ethiopia, 9.9000, 37.4500 Murapaka, India, 18.2282, 83.7926 Kurman, Ukraine, 45.4947, 34.2947 Evington, United Kingdom, 52.6280, -1.0740 Achankovil, India, 8.9667, 77.1431 Ambinanin'i Sakaleona, Madagascar, -20.5399, 48.5487 Sheron, India, 30.1582, 75.7178 Jamapa, Mexico, 19.0411, -96.2411 Kowdalli, India, 12.0670, 77.4438 Valmadrera, Italy, 45.8463, 9.3582 Iazizatene, Morocco, 35.2544, -3.1150 Palmerston, Ireland, 53.3628, -6.3656 Kumharsan, India, 25.6421, 86.1971 Amdel, Morocco, 31.5617, -8.8944 Fagersta, Sweden, 60.0000, 15.7833 De Panne, Belgium, 51.1000, 2.5833 Brugg, Switzerland, 47.4864, 8.2083 Quintanar de la Orden, Spain, 39.5906, -3.0428 Itanhomi, Brazil, -19.1719, -41.8650 Bannewitz, Germany, 50.9931, 13.7167 Panhar, India, 25.0936, 85.2176 Travilah, United States, 39.0570, -77.2470 Kiskunmajsa, Hungary, 46.4922, 19.7367 Svitlodarsk, Ukraine, 48.4333, 38.2167 Trofaiach, Austria, 47.4260, 15.0067 Raksaha, India, 25.4444, 83.6873 Le Luc, France, 43.3956, 6.3133 Hellesdon, United Kingdom, 52.6485, 1.2509 Sultanpur, India, 25.6214, 85.4637 Camisano Vicentino, Italy, 45.5167, 11.7167 Kriftel, Germany, 50.0833, 8.4500 Kachnar, India, 25.9699, 84.3589 Mortad, India, 18.8167, 78.4833 Congaz, Moldova, 46.1092, 28.6044 Shahrinav, Tajikistan, 38.5667, 68.3333 Gradiska, Bosnia and Herzegovina, 45.1458, 17.2539 Puerto Caicedo, Colombia, 0.6850, -76.6044 Langeloop, South Africa, -25.6840, 31.6350 Hillsborough, United States, 37.5572, -122.3586 Sao Jose do Campestre, Brazil, -6.3158, -35.7139 Nandayure, Costa Rica, 9.9014, -85.3036 Saint-Saulve, France, 50.3700, 3.5550 Nawalpur, India, 26.9366, 84.2985 Morant Bay, Jamaica, 17.8819, -76.4074 Matsuo, Japan, 35.6330, 140.4670 Candelaria, Mexico, 18.1835, -91.0463 Ait Hani, Morocco, 31.7483, -5.5735 Bol, Chad, 13.4600, 14.7400 Besiri, Turkey, 37.9210, 41.2920 Burr Ridge, United States, 41.7485, -87.9200 Iuiu, Brazil, -14.4139, -43.5539 Batonyterenye, Hungary, 47.9892, 19.8286 Ypsonas, Cyprus, 34.6894, 32.9614 Ar Rommani, Morocco, 33.5333, -6.6167 Haysville, United States, 37.5648, -97.3527 Millington, United States, 35.3350, -89.8991 Kattupputtur, India, 10.9833, 78.2333 Del Aire, United States, 33.9167, -118.3693 Phulgachhi, India, 26.3653, 87.9399 Oporapa, Colombia, 2.0500, -75.9667 Union Park, United States, 28.5657, -81.2355 Salcedo, Philippines, 17.1517, 120.5361 Alto Parnaiba, Brazil, -9.1108, -45.9300 Ikkadu, India, 13.1724, 79.9358 Peri-Mirim, Brazil, -2.5778, -44.8539 Balve, Germany, 51.3333, 7.8667 Caorle, Italy, 45.6003, 12.8876 Vila Frescainha, Portugal, 41.5385, -8.6397 Tha Chang, Thailand, 9.2642, 99.1922 An Phu, Vietnam, 10.8500, 105.0833 Marilandia, Brazil, -19.4128, -40.5417 Sorontona, Mali, 13.0678, -4.9083 Firoza, Pakistan, 28.7500, 70.8167 Canyon Lake, United States, 33.6885, -117.2621 Yamanouchi, Japan, 36.7446, 138.4127 Comarnic, Romania, 45.2511, 25.6353 East Hanover, United States, 40.8192, -74.3638 Mierlo, Netherlands, 51.4500, 5.6167 Yarovoye, Russia, 52.9333, 78.5833 Narimanov, Russia, 46.6833, 47.8500 Pleasant View, United States, 41.3249, -112.0011 'Ain Taghrout, Algeria, 36.1289, 5.0767 Ollerton, United Kingdom, 53.2000, -1.0200 Myronivka, Ukraine, 49.6500, 30.9833 Birch Bay, United States, 48.9243, -122.7519 Cha da Alegria, Brazil, -8.0008, -35.2133 Hatwans, India, 22.7683, 78.3464 Kariz, Iran, 34.8117, 60.8239 San Bernardo, Argentina, -27.2667, -60.7000 Castelvetro di Modena, Italy, 44.5067, 10.9472 Chuguyevka, Russia, 44.1667, 133.8583 Capitao de Campos, Brazil, -4.4569, -41.9439 Yemanzhelinsk, Russia, 54.7667, 61.3333 Sol'-Iletsk, Russia, 51.1667, 55.0000 Wyomissing, United States, 40.3317, -75.9703 Georgian Bluffs, Canada, 44.6500, -81.0333 Oud-Heverlee, Belgium, 50.8371, 4.6639 Bargas, Spain, 39.9400, -4.0194 Nagojanahalli, India, 12.3570, 78.2886 Parapua, Brazil, -21.7681, -50.7717 Duggirala, India, 16.3271, 80.6280 Alashankou, China, 45.1733, 82.5546 Ararenda, Brazil, -4.7528, -40.8328 Gucheng, China, 34.4545, 105.2064 Antonio Carlos, Brazil, -21.3178, -43.7469 Ksar Sbahi, Algeria, 36.0833, 7.2500 Yargatti, India, 15.9667, 75.0167 Bishunpur, India, 24.7631, 85.6820 Illintsi, Ukraine, 49.1056, 29.2089 Potosi, Nicaragua, 11.5000, -85.8833 Melsele, Belgium, 51.2209, 4.2815 Calcado, Brazil, -8.7419, -36.3339 Bhattiprolu, India, 16.1026, 80.7807 Bang Ban, Thailand, 14.3739, 100.4853 Panguipulli, Chile, -39.6444, -72.3306 Wulingshancun, China, 40.6415, 117.4996 Ban Wang Daeng, Thailand, 17.4790, 100.1247 Guebwiller, France, 47.9083, 7.2108 Terku Valliyur, India, 8.3570, 77.6087 San Luis de La Loma, Mexico, 17.2714, -100.8911 Si Wilai, Thailand, 18.1819, 103.7479 Kall, Germany, 50.5500, 6.5500 Planegg, Germany, 48.1047, 11.4306 Ceu Azul, Brazil, -25.1469, -53.8489 Cide, Turkey, 41.8922, 33.0044 El Trebol, Argentina, -32.1833, -61.7167 Divinolandia, Brazil, -21.6614, -46.7392 Gacheta, Colombia, 4.8176, -73.6360 Messstetten, Germany, 48.1806, 8.9625 Bagamanoc, Philippines, 13.9408, 124.2888 Abbeville, United States, 29.9751, -92.1265 Middle Island, United States, 40.8857, -72.9454 Juruaia, Brazil, -21.2528, -46.5769 Congonhal, Brazil, -22.1528, -46.0389 Sa'in Qal`eh, Iran, 36.3044, 49.0722 Ramanayakkanpalaiyam, India, 11.6291, 78.5624 Belen de los Andaquies, Colombia, 1.4161, -75.8725 Pata Ellamilli, India, 16.8473, 81.4884 Tadepalle, India, 16.8473, 81.4884 Moorslede, Belgium, 50.8833, 3.0667 Rackeve, Hungary, 47.1608, 18.9456 Paullo, Italy, 45.4167, 9.4000 Piazzola sul Brenta, Italy, 45.5333, 11.7667 Konnur, India, 15.8595, 75.4955 Pirapetinga, Brazil, -21.6558, -42.3458 Sturgis, United States, 41.7991, -85.4184 Erstein, France, 48.4200, 7.6600 Basaithi, India, 26.0284, 87.3329 Leicester, United States, 42.2400, -71.9120 Wen'anyi, China, 36.8658, 110.0553 Rio Cuarto, Costa Rica, 10.4076, -84.2135 Arenzano, Italy, 44.4035, 8.6827 Lalsaraia, India, 26.7388, 84.6607 Dayalpur, India, 26.0511, 84.5968 Karebilachi, India, 14.1449, 75.9032 Berane, Montenegro, 42.8400, 19.8600 Spout Springs, United States, 35.2724, -79.0331 Codigoro, Italy, 44.8333, 12.1167 Lower Saucon, United States, 40.5881, -75.3188 Nossa Senhora dos Milagres, Brazil, -12.8700, -39.8589 Kenzingen, Germany, 48.1917, 7.7683 Hebri, India, 13.4667, 74.9833 Elchuru, India, 16.0813, 79.9269 Asahi, Japan, 35.0333, 136.6667 Niemasson, Benin, 10.3078, 2.0378 Rio Novo do Sul, Brazil, -20.8628, -40.9358 El Aguila, Colombia, 4.9167, -76.0833 Yakymivka, Ukraine, 46.7000, 35.1667 Dourdan, France, 48.5289, 2.0156 Szprotawa, Poland, 51.5667, 15.5000 Great Neck, United States, 40.8029, -73.7333 Dois Riachos, Brazil, -9.3925, -37.1006 Kac, Serbia, 45.3000, 19.9500 Santa Mariana, Brazil, -23.1499, -50.5200 Barton upon Humber, United Kingdom, 53.6833, -0.4500 Cologno al Serio, Italy, 45.5833, 9.7000 Zavyalovo, Russia, 56.7922, 53.3756 Shamunpet, India, 17.9472, 79.6014 Kaniyambadi, India, 12.8118, 79.1340 Doesburg, Netherlands, 52.0167, 6.1333 Mahin, Syria, 34.2417, 37.0584 Lansdowne, United States, 39.9408, -75.2760 Fairview Shores, United States, 28.6021, -81.3958 Longtaixiang, China, 34.5988, 104.8963 Penagam, India, 10.4522, 76.0972 Columbia, United States, 38.4581, -90.2156 General Carneiro, Brazil, -26.4278, -51.3158 Red Hook, United States, 42.0188, -73.8788 La Calamine, Belgium, 50.7161, 6.0142 San Giustino, Italy, 43.5500, 12.1833 Marinette, United States, 45.0871, -87.6336 Dalippur, India, 25.4222, 84.3933 Jayaque, El Salvador, 13.6667, -89.4333 Hathidah Buzurg, India, 25.3716, 85.9857 Bangramanjeshvara, India, 12.6833, 75.0000 Susuman, Russia, 62.7833, 148.1667 Devanakavundanur, India, 11.5048, 77.8383 Caluco, El Salvador, 13.7167, -89.6500 Coshocton, United States, 40.2618, -81.8480 San Carlos Centro, Argentina, -31.7333, -61.1000 Aba, China, 32.9000, 101.7000 Shankarpalli, India, 17.4523, 78.1310 La Trinitaria, Mexico, 16.1203, -92.0408 Waterloo, United States, 38.3403, -90.1538 Gaillard, France, 46.1858, 6.2083 Chhabila, India, 26.2556, 85.9933 Kadur Sahib, India, 31.4239, 75.0977 Zira, Azerbaijan, 40.3661, 50.2920 Adendorf, Germany, 53.2833, 10.4500 Awash, Ethiopia, 8.9944, 40.1667 Mandal, Norway, 58.0333, 7.4500 Pharaha, India, 24.8522, 85.5471 Souq Sebt Says, Morocco, 32.7773, -8.6433 Nanpala, Mali, 14.1478, -5.8642 Novoazovsk, Ukraine, 47.1117, 38.0825 Thanh Xuan, Vietnam, 10.2308, 106.3253 Moita Bonita, Brazil, -10.5778, -37.3428 Wangjiabian, China, 38.2412, 110.2353 Larbert, United Kingdom, 56.0229, -3.8260 Lake Grove, United States, 40.8586, -73.1168 Fagundes, Brazil, -7.3550, -35.7750 Ruthen, Germany, 51.4933, 8.4833 Brzeszcze, Poland, 49.9819, 19.1472 Danville, United States, 39.7584, -86.5019 Barrington, United States, 42.1515, -88.1281 Stiring-Wendel, France, 49.2000, 6.9300 Ballymoney, United Kingdom, 55.0710, -6.5080 Kisara, India, 17.5233, 78.6677 Dumri, India, 25.6243, 84.1809 Madhopur, India, 26.3400, 84.4500 De Pinte, Belgium, 51.0000, 3.6500 Belle Chasse, United States, 29.8558, -90.0045 Herrsching am Ammersee, Germany, 48.0000, 11.1833 Mukasi Pidariyur, India, 11.2069, 77.5922 Andacollo, Chile, -30.2303, -71.0858 Haigerloch, Germany, 48.3647, 8.8050 Ono, Japan, 41.8835, 140.6438 Waynesboro, United States, 39.7524, -77.5822 Puliyara, India, 9.0041, 77.1889 Jacinto, Brazil, -16.1439, -40.2928 Mohlin, Switzerland, 47.5583, 7.8458 Joquicingo, Mexico, 19.0556, -99.5467 Grandview, United States, 46.2443, -119.9092 Villamarchante, Spain, 39.5689, -0.6206 Sao Sebastiao de Lagoa de Roca, Brazil, -7.0828, -35.8350 La Esperanza, Colombia, 7.6392, -73.3358 Feira, Portugal, 40.9254, -8.5428 Union City, United States, 36.4267, -89.0474 Gyangze, China, 28.9148, 89.6045 Sankhavaram, India, 17.2704, 82.3445 Sakkamapatti, India, 9.9250, 77.6039 Konen Agrahar, India, 12.9582, 77.6619 Hikawadai, Japan, 32.5825, 130.6736 Yuasa, Japan, 34.0333, 135.1833 Lindome, Sweden, 57.5667, 12.0833 Saint-Martin-Boulogne, France, 50.7267, 1.6328 Merriam, United States, 39.0186, -94.6933 Ilfracombe, United Kingdom, 51.2080, -4.1200 Athy, Ireland, 52.9900, -6.9900 Koch, India, 24.9259, 84.7724 Perali, India, 15.8860, 80.5470 Monument, United States, 39.0736, -104.8467 Aperibe, Brazil, -21.6208, -42.1028 Riorges, France, 46.0436, 4.0414 Tezoatlan de Segura y Luna, Mexico, 17.6500, -97.8167 Stollberg, Germany, 50.7083, 12.7783 Castelginest, France, 43.6947, 1.4336 Kenduadih, India, 23.7757, 86.3761 Murgod, India, 15.7800, 75.1200 Lorch, Germany, 48.7983, 9.6883 Tonse West, India, 13.3968, 74.7069 Delvada, India, 20.7759, 71.0465 Rezina, Moldova, 47.7492, 28.9622 Phanat Nikhom, Thailand, 13.4458, 101.1844 Anguera, Brazil, -12.1508, -39.2458 Donzdorf, Germany, 48.6833, 9.8167 Summerfield, United States, 36.1973, -79.8997 Chatteris, United Kingdom, 52.4560, 0.0550 Fanlu, Taiwan, 23.4494, 120.6033 Iowa Colony, United States, 29.4407, -95.4206 Holmen, United States, 43.9706, -91.2654 Sao Felix, Brazil, -12.6050, -38.9719 Tekkumbagam, India, 10.1190, 76.4180 Bertinoro, Italy, 44.1500, 12.1333 Chulym, Russia, 55.1167, 80.9667 Milicz, Poland, 51.5333, 17.2833 Botupora, Brazil, -13.3819, -42.5228 Amha, India, 26.0518, 86.6906 Greentree, United States, 39.8989, -74.9613 Qal`at an Nakhl, Egypt, 29.9107, 33.7492 Kongupatti, India, 11.8593, 78.0217 Ichikawa, Japan, 34.9833, 134.7667 Tirumayam, India, 10.2449, 78.7464 Shiloh, United States, 39.9732, -76.7920 Guthrie, United States, 35.8424, -97.4366 Burlington, United States, 42.6744, -88.2721 Rolla, India, 13.8331, 77.1000 Balingoan, Philippines, 9.0000, 124.8500 Dugulubgey, Russia, 43.6500, 43.5500 Sierra Madre, United States, 34.1687, -118.0504 Corinda, Australia, -27.4858, 153.1011 Carmo da Mata, Brazil, -20.5578, -44.8708 Brumunddal, Norway, 60.8833, 10.9333 Heartland, United States, 32.6748, -96.4515 Weyburn, Canada, 49.6611, -103.8525 Hasbergen, Germany, 52.2167, 7.9167 El Hamel, Algeria, 35.1333, 4.0833 Tavistock, United Kingdom, 50.5450, -4.1500 Allahdurg, India, 17.9667, 77.9167 Ekuvukeni, South Africa, -28.4660, 30.1570 Sant Joan de Vilatorrada, Spain, 41.7500, 1.8000 Nedelisce, Croatia, 46.3800, 16.3900 Likhoslavl, Russia, 57.1333, 35.4833 Celina, United States, 40.5550, -84.5626 Itatuba, Brazil, -7.3750, -35.6283 Bir Ghbalou, Algeria, 36.2642, 3.5836 Sannieshof, South Africa, -26.5333, 25.8000 Mawu, China, 34.4310, 104.9187 Easttown, United States, 40.0281, -75.4403 Mangalam, India, 12.3298, 79.1790 Lokhvytsya, Ukraine, 50.3598, 33.2723 Antanandava, Madagascar, -17.4536, 48.6707 Kiwoko, Uganda, 0.8442, 32.3614 La Palma, Colombia, 5.3606, -74.3897 Piedmont, United States, 37.8225, -122.2301 Burkburnett, United States, 34.0746, -98.5672 Sarauni Kalan, India, 25.7579, 86.9392 Cherry Creek, United States, 39.6094, -104.8645 Franklin Lakes, United States, 41.0086, -74.2083 Xinyaoshang, China, 26.8350, 106.8403 Vijes, Colombia, 3.7000, -76.4500 Schonaich, Germany, 48.6569, 9.0628 La Londe-les-Maures, France, 43.1381, 6.2344 Pompton Lakes, United States, 41.0024, -74.2859 Regen, Germany, 48.9667, 13.1333 Solymar, Hungary, 47.5910, 18.9290 Sun Village, United States, 34.5596, -117.9558 Damme, Belgium, 51.2500, 3.2667 Burgkirchen an der Alz, Germany, 48.1667, 12.7167 Walur, India, 19.4872, 76.5561 Patu, Brazil, -6.1100, -37.6369 Dolhasca, Romania, 47.4303, 26.6094 Gernsheim, Germany, 49.7500, 8.4833 Chinna Annaluru, India, 14.8913, 79.6761 Maromme, France, 49.4825, 1.0428 Siyana, India, 25.1170, 72.6600 Saucillo, Mexico, 28.0333, -105.2833 Neuhof, Germany, 50.4333, 9.6167 Almhult, Sweden, 56.5500, 14.1333 Chauki, India, 25.4573, 86.4018 Beachwood, United States, 39.9286, -74.2022 Chatham, United States, 40.7274, -74.4289 La Tuque, Canada, 48.0652, -74.0528 Norwich, Canada, 42.9833, -80.6000 Cerro Cora, Brazil, -6.0458, -36.3458 Zhamog, China, 29.8595, 95.7681 Pingcha, China, 26.3490, 109.3791 Chauke, India, 30.1844, 75.3364 Mahad, Iraq, 36.6478, 43.4075 Al `Amadiyah, Iraq, 37.0919, 43.4870 Santa Flavia, Italy, 38.0833, 13.5333 Abasingammedda, Sri Lanka, 7.3147, 80.6660 Morafeno, Madagascar, -19.0911, 47.0972 Ambotaka, Madagascar, -21.7520, 48.0513 Kalafotsy, Madagascar, -22.2912, 47.3149 Antsoha, Madagascar, -15.8093, 48.8245 Maroambihy, Madagascar, -14.5036, 49.8593 Voloina, Madagascar, -15.5680, 49.6059 Ambatomasina, Madagascar, -18.7167, 47.4500 Ambodiampana, Madagascar, -16.8213, 49.5617 Antsakanalabe, Madagascar, -15.4019, 48.2846 Antsahabe, Madagascar, -14.8070, 48.3812 Antakotako, Madagascar, -15.3310, 49.8014 Tsararano, Madagascar, -16.1790, 46.6763 Mahazony, Madagascar, -21.9942, 47.0146 Fotsialanana, Madagascar, -16.9218, 49.4823 Ambinanindovoka, Madagascar, -21.9167, 47.1000 Ranomafana, Madagascar, -24.5730, 46.9643 Ankavandra, Madagascar, -18.7717, 45.2935 Manambolosy, Madagascar, -16.0435, 49.6728 Marotandrano, Madagascar, -16.1795, 48.8395 Ambohidranandriana, Madagascar, -19.8983, 47.1590 Tsinjomitondraka, Madagascar, -15.6591, 47.1205 Amporoforo, Madagascar, -22.4884, 47.7925 Ambodimangavolo, Madagascar, -17.5255, 48.9641 Analamitsivalana, Madagascar, -20.3160, 44.6899 Bevata, Madagascar, -23.2833, 47.2833 Antsambahara, Madagascar, -14.5041, 49.9559 Androndrona Anava, Madagascar, -15.7632, 49.1979 Sampona, Madagascar, -25.1494, 46.3086 Marolinta, Madagascar, -25.1109, 44.6286 Andranomeva, Madagascar, -15.7987, 47.7667 Miandrarivo, Madagascar, -18.9429, 45.9852 Ambodimanary, Madagascar, -15.2334, 48.0037 Maroamalona, Madagascar, -15.3690, 48.6747 Marovantaza, Madagascar, -15.3831, 47.6534 Antanandava, Madagascar, -15.8639, 48.8282 Efatsy-Anandroza, Madagascar, -23.1146, 47.6073 Manandroy, Madagascar, -21.1333, 47.2620 Tranomaro, Madagascar, -24.5999, 46.4746 Vinaninkarena, Madagascar, -19.9534, 47.0428 Soaserana, Madagascar, -21.1035, 44.2226 Soamanova, Madagascar, -23.2833, 47.6000 Loikaw, Burma, 19.6742, 97.2092 Side, Turkey, 36.7667, 31.3889 Puerto Piritu, Venezuela, 10.0667, -65.0500 Itirucu, Brazil, -13.5319, -40.1500 Gottmadingen, Germany, 47.7356, 8.7767 Hadim, Turkey, 36.9883, 32.4569 North Bellport, United States, 40.7868, -72.9457 Edlapadu, India, 16.1007, 80.1339 Bagnan, India, 22.4700, 87.9700 Jagannathpur, India, 25.6573, 87.5886 Brandon, United States, 43.5928, -96.5799 Bolivar, United States, 37.6059, -93.4175 Elgin, United States, 30.3526, -97.3883 Sripur, India, 25.5861, 86.0803 Patori, India, 25.9665, 86.5471 Vengapalli, India, 11.6333, 76.0167 Wildau, Germany, 52.3167, 13.6333 Llandybie, United Kingdom, 51.8200, -4.0010 Farkhana, Morocco, 35.2833, -3.0167 Matino, Italy, 40.0333, 18.1333 Upanema, Brazil, -5.6419, -37.2578 Dhilwan Kalan, India, 30.5718, 74.8655 Meaford, Canada, 44.5800, -80.7300 Meliana, Spain, 39.5272, -0.3492 Ross on Wye, United Kingdom, 51.9140, -2.5870 Guspini, Italy, 39.5400, 8.6267 Komorniki, Poland, 52.3361, 16.8069 Arkadak, Russia, 51.9333, 43.5000 Ribeirao Bonito, Brazil, -22.0669, -48.1758 Brandywine, United States, 38.6963, -76.8846 Ma'ai, China, 34.5937, 102.4814 Gluckstadt, Germany, 53.7917, 9.4219 Bardipuram, India, 18.6431, 78.1584 Mansinghpur Bijrauli, India, 25.7552, 85.5099 Pinhalzinho, Brazil, -22.7800, -46.5700 Myjava, Slovakia, 48.7492, 17.5644 Byelaazyorsk, Belarus, 52.4500, 25.1667 Sabalito, Costa Rica, 8.8828, -82.8314 Gengenbach, Germany, 48.4000, 8.0167 Wambrechies, France, 50.6861, 3.0494 Dayr `Atiyah, Syria, 34.0954, 36.7679 Huntertown, United States, 41.2185, -85.1705 Altensteig, Germany, 48.5864, 8.6047 Nagar Nahusa, India, 25.3959, 85.3431 Springdale, United States, 39.2909, -84.4760 Santa Cruz Balanya, Guatemala, 14.6833, -90.9167 Honwada, India, 16.8111, 77.9199 Parauna, Brazil, -16.9478, -50.4486 Duas Barras, Brazil, -22.0508, -42.5219 Belousovo, Russia, 55.0833, 36.6667 Santa Croce Camerina, Italy, 36.8272, 14.5239 Pingtouchuanxiang, China, 35.8763, 105.3241 Northallerton, United Kingdom, 54.3378, -1.4285 Sendurai, India, 11.2530, 79.1720 Paura Madan Singh, India, 25.7917, 85.2333 Fao Rai, Thailand, 18.0179, 103.3039 Cudworth, United Kingdom, 53.5784, -1.4149 Singoli, India, 24.9667, 75.3000 Warden, South Africa, -27.8539, 28.9667 Malente, Germany, 54.1667, 10.5500 Junin, Peru, -11.1500, -75.9833 Chicureo Abajo, Chile, -33.2833, -70.6333 Oakham, United Kingdom, 52.6705, -0.7333 Yelpur, India, 18.7651, 78.3953 Sesto Calende, Italy, 45.7333, 8.6333 Adjala-Tosorontio, Canada, 44.1333, -79.9333 Ahmadli, Azerbaijan, 40.3839, 49.9475 Pirai do Norte, Brazil, -13.7619, -39.3789 Xintianfeng, China, 24.5581, 115.4647 Koronowo, Poland, 53.3167, 17.9333 Halfway, United States, 39.6162, -77.7703 Lehman, United States, 41.1518, -74.9924 Magnolia, United States, 33.2775, -93.2261 Manaira, Brazil, -7.7061, -38.1544 Victoria, United States, 44.8634, -93.6585 Punjai Turaiyampalaiyam, India, 11.5142, 77.4234 Rekovac, Serbia, 43.8667, 21.1333 Cachira, Colombia, 7.7500, -73.1667 Birpur, India, 26.5767, 86.0379 Mallagunta, India, 12.6343, 78.5194 Takha, India, 26.8200, 79.3000 Satosho, Japan, 34.5139, 133.5569 As Sabburah, Syria, 33.5149, 36.1250 Cabanillas del Campo, Spain, 40.6383, -3.2353 Bawali, India, 22.4041, 88.1852 Tixkokob, Mexico, 21.0022, -89.3936 Acanceh, Mexico, 20.8133, -89.4524 Quartz Hill, United States, 34.6527, -118.2163 Champua, India, 22.0667, 85.6658 Lovejoy, United States, 33.4426, -84.3177 Guiratinga, Brazil, -16.3489, -53.7578 Le Taillan-Medoc, France, 44.9053, -0.6686 Bhangha, India, 25.5780, 87.2782 Campagnano di Roma, Italy, 42.1333, 12.3833 Grand Haven, United States, 43.0553, -86.2201 Sarafand, Lebanon, 33.4517, 35.2908 Ongwediva, Namibia, -17.7833, 15.7667 Medog, China, 29.4833, 95.5000 Tres Cachoeiras, Brazil, -29.4558, -49.9239 Ramabhadrapuram, India, 18.5000, 83.2833 Clayton, United States, 37.9404, -121.9301 Terryville, United States, 40.9093, -73.0486 Vengur, India, 10.1413, 76.5495 Masakkavundanchettipalaiyam, India, 11.1473, 77.0756 Peschiera del Garda, Italy, 45.4386, 10.6886 Alamos, Mexico, 27.0275, -108.9400 Memunda, India, 11.6006, 75.6339 Volda, Norway, 62.1500, 6.1000 Quimili, Argentina, -27.6333, -62.4167 Dek'emhare, Eritrea, 15.0667, 39.0333 Boekel, Netherlands, 51.6011, 5.6742 Szydlowiec, Poland, 51.2333, 20.8500 Rogozno, Poland, 52.7492, 16.9997 Matias Olimpio, Brazil, -3.7158, -42.5556 Sultanhani, Turkey, 38.2500, 33.5500 Tarra, Colombia, 8.0475, -73.0836 El Tarra, Colombia, 8.5756, -73.0944 Port Salerno, United States, 27.1461, -80.1894 Punitaqui, Chile, -30.9000, -71.2667 Thouare-sur-Loire, France, 47.2683, -1.4394 Nacajuca, Mexico, 18.1692, -93.0197 Lyndon, United States, 38.2645, -85.5891 Highgate, United Kingdom, 51.5716, -0.1448 Keles, Turkey, 39.9136, 29.2294 Herxheim, Germany, 49.1469, 8.2200 Great Wyrley, United Kingdom, 52.6593, -2.0102 Tirupporur, India, 12.7259, 80.1895 Iioka, Japan, 35.7000, 140.7167 Cunha Pora, Brazil, -26.8939, -53.1678 Issoudun, France, 46.9608, 1.9944 Tortoli, Italy, 39.9333, 9.6500 Tamezmout, Morocco, 30.8075, -6.1142 Longford, Ireland, 53.7270, -7.7998 Mainvilliers, France, 48.4539, 1.4628 Bishunpur Hakimabad, India, 25.8453, 85.8432 Palsud, India, 21.8262, 74.9691 Red Bank, United States, 33.9309, -81.2322 Borsbeek, Belgium, 51.1932, 4.4879 Devgeri, India, 14.8512, 75.3705 Satai, India, 24.7220, 79.6310 Rosario, Philippines, 12.5200, 124.4200 Ibiraci, Brazil, -20.4619, -47.1219 Uttukkuli, India, 11.1689, 77.4543 Mahmuda, India, 25.0531, 85.2662 Al Ghayzah, Yemen, 16.2106, 52.1711 Volkermarkt, Austria, 46.6667, 14.6333 Nao Kothi, India, 25.5196, 86.1954 Cepagatti, Italy, 42.3658, 14.0767 Alberique, Spain, 39.1167, -0.5211 Vadamugam Vellodu, India, 11.2366, 77.6617 Pottireddippatti, India, 11.1659, 78.2708 Kamianka, Ukraine, 49.0333, 32.1000 Nallamada, India, 14.2164, 77.9944 Ruisui, Taiwan, 23.4333, 121.5000 Cassa de la Selva, Spain, 41.8892, 2.8772 Cacaopera, El Salvador, 13.7667, -88.0833 Ebreichsdorf, Austria, 47.9667, 16.4000 Hasseh, Iran, 32.7067, 51.7556 Little Ferry, United States, 40.8464, -74.0388 Hamilton Township, Canada, 44.0540, -78.2164 Kalavapudi, India, 16.4623, 81.3887 Rialma, Brazil, -15.3150, -49.5844 Lichtenau, Germany, 51.6000, 8.8833 Rokytne, Ukraine, 49.6667, 30.4833 Malvern, United States, 34.3734, -92.8205 Itamarati, Brazil, -6.4250, -68.2528 Pedappai, India, 12.8854, 80.0220 Nadendla, India, 16.1750, 80.1861 Mena, Ukraine, 51.5167, 32.2167 Semuto, Uganda, 0.6200, 32.3278 Texcatepec, Mexico, 20.5833, -98.3667 Vimmerby, Sweden, 57.6667, 15.8500 Cantagalo, Brazil, -25.3739, -52.1258 Alavus, Finland, 62.5917, 23.6167 Trets, France, 43.4475, 5.6836 Kabirpur, India, 26.2661, 84.2050 Garmeh, Iran, 36.9864, 56.2881 Mazzarino, Italy, 37.3000, 14.2000 Sangeorz-Bai, Romania, 47.3700, 24.6800 Kaniyur, India, 11.0930, 77.1560 Attard, Malta, 35.8928, 14.4383 Malden, Netherlands, 51.7808, 5.8544 Schkopau, Germany, 51.3833, 11.9667 Chaoke, India, 30.1847, 75.3362 Oued Amlil, Morocco, 34.2000, -4.2833 Orsta, Norway, 62.2000, 6.1500 Ingelmunster, Belgium, 50.9167, 3.2500 Swarna, India, 15.8542, 80.2858 Sao Pedro da Agua Branca, Brazil, -5.0850, -48.4289 Karakthal, India, 23.2001, 71.7271 Stratford, Canada, 46.2167, -63.0893 Minamiise, Japan, 34.3500, 136.7000 Abertillery, United Kingdom, 51.7300, -3.1300 Sisia, India, 25.4539, 87.4549 Hakone, Japan, 35.1894, 139.0247 Langenzenn, Germany, 49.4944, 10.7947 Sankhavaram, India, 15.0497, 78.9836 Chinnatadagam, India, 11.0816, 76.8674 Bariarpur Kandh, India, 25.9391, 85.4674 Selsey, United Kingdom, 50.7350, -0.7898 Basbiti, India, 26.0939, 86.5289 Madna, India, 26.3963, 86.3884 Hollinwood, United Kingdom, 53.5183, -2.1440 Kuttappatti, India, 11.7939, 77.9225 Pellezzano, Italy, 40.7333, 14.7667 Barberino di Mugello, Italy, 44.0000, 11.2333 Tibubeneng, Indonesia, -8.6469, 115.1503 Totowa, United States, 40.9039, -74.2214 Karlsdorf-Neuthard, Germany, 49.1364, 8.5439 Wronki, Poland, 52.7000, 16.3833 Gueoul, Senegal, 15.4833, -16.3500 Fondettes, France, 47.4050, 0.5997 Sontha, India, 26.1861, 87.7766 Santona, Spain, 43.4414, -3.4575 Tizi, Algeria, 35.3167, 0.0667 Barnoldswick, United Kingdom, 53.9147, -2.1895 Blitta, Togo, 8.3234, 0.9859 Varto, Turkey, 39.1731, 41.4558 Arniya, India, 25.7150, 85.5448 Venosa, Italy, 40.9667, 15.8167 White City, United States, 42.4316, -122.8322 Derinkuyu, Turkey, 38.3736, 34.7347 Bueno Brandao, Brazil, -22.4408, -46.3508 Lowell, United States, 41.2917, -87.4195 Groairas, Brazil, -3.9128, -40.3828 Conceicao do Castelo, Brazil, -20.3678, -41.2439 Agua Doce, Brazil, -18.5464, -40.9828 Kavaklidere, Turkey, 37.4469, 28.3633 Sedavi, Spain, 39.4250, -0.3850 Cumayeri, Turkey, 40.8736, 30.9508 Costesti, Moldova, 46.8678, 28.8022 Meulebeke, Belgium, 50.9500, 3.2833 Tifni, Morocco, 31.6281, -6.9444 Oued Sebbah, Algeria, 35.3725, -0.8114 Ogose, Japan, 35.9645, 139.2942 Krosno Odrzanskie, Poland, 52.0333, 15.1000 Yairipok, India, 24.6779, 94.0477 Koilakh, India, 26.3358, 86.2010 Roque Perez, Argentina, -35.4167, -59.3167 Fife, United States, 47.2329, -122.3518 Muswellbrook, Australia, -32.2656, 150.8886 Lincoln Park, United States, 40.9239, -74.3035 Romiley, United Kingdom, 53.4113, -2.0842 Shoo, Japan, 35.0500, 134.1167 Tayga, Russia, 56.0667, 85.6167 Khanjahanpur, India, 25.6055, 86.0927 Sangram, India, 26.3141, 86.3515 Staryya Darohi, Belarus, 53.0394, 28.2650 Karikad, India, 10.6917, 76.0722 Diamniadio, Senegal, 14.7199, -17.1842 Chiltiupan, El Salvador, 13.5833, -89.4667 West Caldwell, United States, 40.8488, -74.2971 Wantage, United States, 41.2431, -74.6258 Passa e Fica, Brazil, -6.4358, -35.6428 Tarwara, India, 26.2007, 84.4874 Minamisanriku, Japan, 38.6793, 141.4608 Summit, United States, 41.7877, -87.8146 Chevigny-Saint-Sauveur, France, 47.3025, 5.1364 Arcachon, France, 44.6500, -1.1700 Imeni Chapayeva, Kyrgyzstan, 40.2778, 72.6361 Xudat, Azerbaijan, 41.6339, 48.6772 Castel Mella, Italy, 45.5000, 10.1500 Oulad Hammou, Morocco, 33.1156, -7.9333 Nyakosoba, Lesotho, -29.5047, 27.8692 Gilbues, Brazil, -9.8319, -45.3439 Kodmial, India, 18.6333, 78.9000 Mineral de Angangueo, Mexico, 19.6167, -100.2833 Alto Rio Doce, Brazil, -21.0258, -43.4108 Kiratpur Rajaram, India, 25.8560, 85.2850 Tanant, Morocco, 31.8667, -6.9500 Great Harwood, United Kingdom, 53.7860, -2.4080 Hardia, India, 26.6184, 84.8857 Erraguntla, India, 15.2821, 78.5106 Ghanpur, India, 17.4989, 78.2225 Qasr-e Qomsheh, Iran, 29.7756, 52.4417 Soyalo, Mexico, 16.9333, -92.9833 Gornozavodsk, Russia, 58.3667, 58.3333 Bernardo de Irigoyen, Argentina, -26.2500, -53.9833 Pocono, United States, 41.0612, -75.3102 Troy, United States, 38.7268, -89.8977 Damascus, United States, 45.4233, -122.4436 Saire, Brazil, -8.3278, -35.7058 Yacopi, Colombia, 5.4667, -74.3333 Annoeullin, France, 50.5300, 2.9336 Wisla, Poland, 49.6549, 18.8595 Furth, Germany, 49.6500, 8.7833 Findikli, Turkey, 41.1333, 41.0167 Kapaa, United States, 22.0910, -159.3521 Tremonton, United States, 41.7187, -112.1890 San Roque, Argentina, -28.5667, -58.7167 Beni Abbes, Algeria, 30.0800, -2.1000 Inverurie, United Kingdom, 57.2842, -2.3747 Kandry, Russia, 54.5500, 54.1000 Gentio do Ouro, Brazil, -11.4289, -42.5058 Coroaci, Brazil, -18.6219, -42.2858 Yungay, Chile, -37.1194, -72.0189 Lavaur, France, 43.6997, 1.8197 Hambuhren, Germany, 52.6333, 9.9833 Carencro, United States, 30.3126, -92.0388 Boizenburg, Germany, 53.3667, 10.7167 Tarare, France, 45.8969, 4.4339 Roscoe, United States, 42.4256, -89.0084 Conceicao dos Ouros, Brazil, -22.4128, -45.7978 Rambilli, India, 17.4644, 82.9314 Chandur, India, 16.9800, 79.0600 Timonium, United States, 39.4459, -76.6032 Bofete, Brazil, -23.1022, -48.2578 Harri, India, 26.3238, 86.2975 Garkha, India, 25.8293, 84.8617 Petrovka, Kyrgyzstan, 42.8392, 74.0203 Wegorzewo, Poland, 54.2167, 21.7500 Mae Wang, Thailand, 18.6567, 98.6816 Sahoria Subhai, India, 25.9028, 87.0421 Khan Bebin, Iran, 37.0097, 54.9858 Serravalle, San Marino, 43.9717, 12.4817 Bedford Heights, United States, 41.4041, -81.5053 Rush, Ireland, 53.5218, -6.0891 Pallarimangalam, India, 10.0617, 77.0590 Siversk, Ukraine, 48.8631, 38.0972 Kothri Kalan, India, 23.0722, 76.8296 Douar El Mellaliyine, Morocco, 35.6264, -5.3414 Santa Rosa de Rio Primero, Argentina, -31.1500, -63.3833 Shing, Tajikistan, 39.2833, 67.8000 Hudson, United States, 28.3595, -82.6894 Stephanskirchen, Germany, 47.8500, 12.1833 Winnersh, United Kingdom, 51.4281, -0.8794 Estanzuela, Guatemala, 15.0000, -89.5667 Panetha, India, 21.9200, 73.0800 Anenii Noi, Moldova, 46.8817, 29.2308 Fox Lake, United States, 42.4239, -88.1844 Ville-d'Avray, France, 48.8261, 2.1933 Sagarejo, Georgia, 41.7369, 45.3258 Sugarmill Woods, United States, 28.7299, -82.5010 East Cocalico, United States, 40.2242, -76.1057 Churchdown, United Kingdom, 51.8800, -2.1700 Ankasakasabe, Madagascar, -16.3491, 44.8530 Manville, United States, 40.5420, -74.5892 Governador Lindenberg, Brazil, -19.2519, -40.4608 Steinbach am Taunus, Germany, 50.1667, 8.5667 Arouca, Trinidad and Tobago, 10.6333, -61.3333 Puck, Poland, 54.7000, 18.4000 Avelino Lopes, Brazil, -10.1369, -43.9489 Ramchandarpur, India, 25.2365, 86.1459 Rio dos Cedros, Brazil, -26.7378, -49.2739 Maryport, United Kingdom, 54.7128, -3.4926 Phrai Bueng, Thailand, 14.7483, 104.3626 Martin, United States, 36.3385, -88.8513 Guantingzhan, China, 40.2492, 115.5780 Bistan, India, 21.6979, 75.6657 Tanippadi, India, 12.1078, 78.8340 Amjhera, India, 22.5578, 75.1185 Mataili Khemchand, India, 25.5612, 87.1685 Canton, United States, 32.5975, -90.0317 Burrel, Albania, 41.6083, 20.0111 Etoumbi, Congo (Brazzaville), 0.0208, 14.8933 Davos, Switzerland, 46.8091, 9.8398 Rumburk, Czechia, 50.9517, 14.5572 Vikhorevka, Russia, 56.1167, 101.1667 Sanjiangkou, China, 24.7579, 104.5901 Mogotes, Colombia, 6.4833, -72.9667 Soham, United Kingdom, 52.3340, 0.3360 Whitburn, United Kingdom, 55.8621, -3.6872 Wan Tau Tong, Hong Kong, 22.4423, 114.1670 Geldermalsen, Netherlands, 51.8789, 5.2897 Oak Ridge, United States, 41.0323, -74.4971 Nirpur, India, 25.7192, 87.1507 El Ghourdane, Morocco, 32.3205, -8.7637 Maltby, United States, 47.8027, -122.1044 West Hanover, United States, 40.3635, -76.7468 Sarmiento, Argentina, -45.6000, -69.0833 Ukal, India, 21.2167, 73.5833 Shamsabad, Iran, 32.2978, 48.4283 Belmonte Mezzagno, Italy, 38.0500, 13.3833 Adda-Doueni, Comoros, -12.3000, 44.5000 Risch, Switzerland, 47.1340, 8.4662 Nauheim, Germany, 49.9506, 8.4631 Bratsigovo, Bulgaria, 42.0170, 24.3670 Lezignan-Corbieres, France, 43.2014, 2.7584 Chirak, India, 30.7206, 75.1718 Cleveland, United States, 33.7440, -90.7285 Laghzawna, Morocco, 33.1890, -7.6840 Pleasanton, United States, 28.9642, -98.4957 Lichtenstein, Germany, 50.7564, 12.6317 Amneville, France, 49.2614, 6.1425 Rainhill, United Kingdom, 53.4157, -2.7625 Mudki, India, 30.7800, 74.8811 DeForest, United States, 43.2301, -89.3431 Passy, France, 45.9244, 6.6872 Grand Gosier, Haiti, 18.1854, -71.9182 Venafro, Italy, 41.4833, 14.0500 Asahi, Japan, 36.9462, 137.5599 Onna, Japan, 26.4833, 127.8500 Pir Bakran, Iran, 32.4678, 51.5556 Estevan, Canada, 49.1392, -102.9861 Anuppampattu, India, 13.3018, 80.2258 Tiruppalaikudi, India, 9.5461, 78.9172 Gol Tappeh, Iran, 35.4867, 51.5650 Venmani Padinjara, India, 9.4735, 76.5487 Dolbeau, Canada, 48.8666, -72.2333 Palakollu, India, 16.5333, 81.7333 Maryanaj, Iran, 34.8308, 48.4603 Mouans-Sartoux, France, 43.6211, 6.9725 Boaz, United States, 34.1985, -86.1529 Martinopole, Brazil, -3.2258, -40.6969 Sucua, Ecuador, -2.4600, -78.1700 Le Pont-de-Claix, France, 45.1289, 5.6989 Aurahi, India, 25.5709, 86.9668 Brunete, Spain, 40.4000, -3.9936 Patrasaer, India, 23.1968, 87.5272 Yellayapalem, India, 14.5378, 79.9515 Armutlu, Turkey, 40.5167, 28.8333 McKee City, United States, 39.4465, -74.6445 Phibun Mangsahan, Thailand, 15.2447, 105.2291 Pattanam, India, 11.4728, 78.2109 Villa Corzo, Mexico, 16.1848, -93.2677 Wald-Michelbach, Germany, 49.5667, 8.8333 Afonso Bezerra, Brazil, -5.4978, -36.5058 Ghagga, India, 30.0198, 76.1041 Kulgo, India, 24.0154, 85.9743 Forestville, United States, 38.8518, -76.8708 Amarpur, India, 23.5300, 91.6400 Avintes, Portugal, 41.1066, -8.5515 Berkley, United States, 39.8045, -105.0281 College, United States, 40.8144, -77.8172 Vargaur, India, 11.1452, 78.3477 Raymond, United States, 43.0322, -71.1994 Orthez, France, 43.4900, -0.7700 Ngorongoro, Tanzania, -3.2496, 35.5200 Tatarbunary, Ukraine, 45.8403, 29.6125 Khlung, Thailand, 12.4547, 102.2214 Peru, United States, 40.7593, -86.0756 Urubici, Brazil, -28.0150, -49.5919 Moengo, Suriname, 5.6167, -54.4000 Bondoufle, France, 48.6145, 2.3807 Pottipuram, India, 9.9401, 77.3213 South Dundas, Canada, 44.9167, -75.2667 Roseira, Brazil, -22.8978, -45.3050 Centenario do Sul, Brazil, -22.8208, -51.5950 Dabiya, Mali, 12.6686, -11.1389 Chenango, United States, 42.1954, -75.8989 Mutluru, India, 16.1500, 80.4833 Chiyoda, Japan, 36.2178, 139.4424 Pua, Thailand, 19.1750, 100.9162 Sitio Novo de Goias, Brazil, -5.6008, -47.6378 Sao Jeronimo da Serra, Brazil, -23.7278, -50.7408 Igaratinga, Brazil, -19.9550, -44.7089 Earlestown, United Kingdom, 53.4500, -2.6500 Khattab, Syria, 35.1975, 36.6669 Buenavista, Colombia, 9.3222, -74.9772 Jitwarpur Chauth, India, 25.8499, 85.8074 Jauli, India, 29.4273, 77.8595 Reguengos de Monsaraz, Portugal, 38.4167, -7.5333 Rajghat Garail, India, 25.7618, 87.2126 Laranja da Terra, Brazil, -19.8989, -41.0567 Hammelburg, Germany, 50.1167, 9.9000 Gamharia, India, 25.8973, 86.6550 Kurwar, India, 26.3475, 81.9787 Probistip, North Macedonia, 41.9936, 22.1767 Rampur Kalan, India, 26.1649, 77.4691 Zurrieq, Malta, 35.8292, 14.4758 Sao Luis do Curu, Brazil, -3.6700, -39.2428 Banu Chhapra, India, 26.8098, 84.5201 Lake Monticello, United States, 37.9210, -78.3295 Garden City, United States, 33.5926, -79.0071 Amatura, Brazil, -3.3639, -68.1978 Serekali, Benin, 9.9186, 3.0434 Biggin Hill, United Kingdom, 51.3127, 0.0336 Kurikuppi, India, 15.0700, 76.5500 Oliveirinha, Portugal, 40.6078, -8.5914 Montgomery, United States, 39.2496, -84.3458 Cividale del Friuli, Italy, 46.0905, 13.4350 De Witt, United States, 43.0300, -76.0819 Sohwal, India, 25.9261, 83.3628 San Valentino Torio, Italy, 40.7911, 14.6033 Los Corrales de Buelna, Spain, 43.2617, -4.0653 Yuncos, Spain, 40.0833, -3.8667 Alipur, India, 18.8621, 78.8754 Hejamadi, India, 13.1062, 74.7839 Citrus, United States, 34.1160, -117.8891 Olivenca, Brazil, -9.5186, -37.1906 Taufkirchen, Germany, 48.3439, 12.1303 Al M'aziz, Morocco, 33.6667, -6.3167 Kaurihar, India, 26.9650, 84.8462 Keza, Tanzania, -2.7540, 30.6820 Tacuru, Brazil, -23.6328, -55.0158 Balupur, India, 25.2611, 87.8947 Calarasi, Moldova, 47.2500, 28.3000 Bileca, Bosnia and Herzegovina, 42.8667, 18.4333 Ugrinovci, Serbia, 44.8763, 20.1876 Chhatapur, India, 26.2197, 87.0048 Andhana, India, 25.2574, 85.4548 Tyamagondal, India, 13.2137, 77.3010 Gympie, Australia, -26.1900, 152.6655 Riverton, United States, 43.0421, -108.4144 Darmaha, India, 26.3663, 84.9312 Matomou, Mali, 13.8514, -4.9647 West Vero Corridor, United States, 27.6363, -80.4844 Eugenopolis, Brazil, -21.0989, -42.1869 Icononzo, Colombia, 4.1833, -74.5333 Kirchseeon, Germany, 48.0731, 11.8861 Palamedu, India, 10.1050, 78.1134 Mangobandar, India, 24.8162, 86.2709 Abbigeri, India, 15.5862, 75.7502 Castano Primo, Italy, 45.5500, 8.7667 El Arba Des Bir Lenni, Morocco, 34.3272, -4.2039 Bouchagroun, Algeria, 34.7217, 5.4656 Methil, United Kingdom, 56.1844, -3.0223 Bara, India, 25.9286, 86.5237 Oulad Daoud, Morocco, 34.4303, -4.7728 Divrigi, Turkey, 39.3667, 38.1167 Amuru, Uganda, 2.8186, 31.8642 Eski Yakkabog`, Uzbekistan, 38.9314, 66.8389 Tallimarjon Shahri, Uzbekistan, 38.2967, 65.5533 Kyjov, Czechia, 49.0103, 17.1225 La Puebla de Cazalla, Spain, 37.2222, -5.3125 Pelissanne, France, 43.6322, 5.1511 Terra Boa, Brazil, -12.3919, -38.6250 Papraur, India, 25.4413, 86.0378 Kara-Tash, Kyrgyzstan, 40.2165, 72.6244 Panaon, Philippines, 8.3667, 123.8333 Guaraciaba, Brazil, -26.5989, -53.5178 Pleasant Hill, United States, 41.5867, -93.4953 Barbosa Ferraz, Brazil, -24.0300, -52.0119 Capena, Italy, 42.1403, 12.5403 Scornicesti, Romania, 44.5950, 24.5469 Atchison, United States, 39.5625, -95.1367 Rio Segundo, Costa Rica, 10.0013, -84.1937 Cornate d'Adda, Italy, 45.6500, 9.4667 Chanteloup-les-Vignes, France, 48.9792, 2.0319 Muzaffarnagar, India, 29.4820, 77.7000 Wooburn, United Kingdom, 51.5810, -0.6910 Zafarabad, India, 25.7000, 82.7000 Arakawa, Japan, 38.1241, 139.4438 Binbrook, Canada, 43.1220, -79.8050 Totolapan, Mexico, 18.9869, -98.9197 Bithlo, United States, 28.5644, -81.1073 Elmira, Canada, 43.5996, -80.5604 Dingelstadt, Germany, 51.3156, 10.3194 Seonar, India, 25.4142, 85.8834 Beaumont, France, 45.7525, 3.0836 Kuppachchipalaiyam, India, 11.0273, 78.1131 Paduma, India, 26.5766, 86.2394 Telkap, India, 24.7048, 84.0093 Marreddipalli, India, 17.7767, 78.6016 Kleinblittersdorf, Germany, 49.1583, 7.0361 Flixton, United Kingdom, 53.4470, -2.3910 Ambohidanerana, Madagascar, -19.2028, 46.7785 Myers Corner, United States, 41.5864, -73.8793 Villa Nougues, Argentina, -26.8578, -65.3756 Nurmo, Finland, 62.8278, 22.9083 Shiloh, United States, 39.8159, -84.2317 Sanson, Benin, 9.2833, 2.4333 Kondakomarla, India, 14.0678, 77.9561 Ravutulapudi, India, 17.3833, 82.3833 Susice, Czechia, 49.2311, 13.5203 Miyato, Japan, 36.1772, 139.1814 Emiliano Zapata, Mexico, 16.5392, -92.8967 Ousseltia, Tunisia, 35.8400, 9.5800 Russellville, United States, 34.5055, -87.7283 Mount Kisco, United States, 41.2016, -73.7281 Anavatti, India, 14.5645, 75.1523 Tamiang Layang, Indonesia, -2.1160, 115.1691 Sitalpur, India, 25.7764, 85.0283 Bougoula, Mali, 12.3149, -7.7971 Pineville, United States, 35.0864, -80.8915 Argeles-sur-Mer, France, 42.5449, 3.0235 Parkstone, United Kingdom, 50.7100, -1.9500 Paceco, Italy, 37.9788, 12.5603 Ovada, Italy, 44.6392, 8.6464 Guaraci, Brazil, -20.4986, -48.9447 Tafalla, Spain, 42.5277, -1.6745 Nekarikallu, India, 16.3710, 79.9430 Diedorf, Germany, 48.3500, 10.7667 Cave, Italy, 41.8167, 12.9333 Chiramanangad, India, 10.6819, 76.1142 Nilavarappatti, India, 11.6081, 78.1499 Matulji, Croatia, 45.3667, 14.3167 Bhanghi, India, 26.3612, 87.1826 Nuvem, India, 15.3174, 73.9387 Naranapuram, India, 11.0254, 77.2900 Itamogi, Brazil, -21.0778, -47.0478 Dallgow-Doberitz, Germany, 52.5331, 13.0500 Nirkunnam, India, 9.3500, 76.5167 Akhnur, India, 32.8700, 74.7300 Pipalrawan, India, 23.1625, 76.4704 Bhauradah, India, 26.2520, 87.8600 Waasmunster, Belgium, 51.1097, 4.0847 Osterwieck, Germany, 51.9667, 10.7167 Errahalli, India, 12.3911, 78.2232 Punjai Kalamangalam, India, 11.2322, 77.8236 Westwood Lakes, United States, 25.7237, -80.3717 Gounarou, Benin, 10.8667, 2.8500 Ban Bang Yai, Thailand, 13.8409, 100.3708 Abergavenny, United Kingdom, 51.8240, -3.0167 Suyo, Philippines, 16.9839, 120.5139 Pompton Plains, United States, 40.9679, -74.3075 Airway Heights, United States, 47.6459, -117.5792 Mutukuru, India, 16.3829, 79.4664 Langhirano, Italy, 44.6145, 10.2662 Kendall Park, United States, 40.4135, -74.5631 Qal`eh Chan`an, Iran, 31.2403, 48.7011 Basht, Iran, 30.3611, 51.1558 Gleisdorf, Austria, 47.1039, 15.7083 Agouna, Benin, 7.5667, 1.7000 Vire, France, 48.8400, -0.8900 Sarsai Nawar, India, 26.9600, 79.2300 Vidalia, United States, 32.2125, -82.4019 Pine Hill, United States, 39.7879, -74.9857 Kuhbanan, Iran, 31.4100, 56.2825 Pedralva, Brazil, -22.2428, -45.4658 Kajhi Hridenagar, India, 25.9320, 87.2179 Jhundo, India, 24.7756, 86.2473 Gori, Mali, 15.1083, -10.7639 Niquen, Chile, -36.3000, -71.9000 Santo Domingo, Colombia, 6.4708, -75.1658 Bad Orb, Germany, 50.2167, 9.3500 Pont-Saint-Esprit, France, 44.2575, 4.6492 Burgos, Philippines, 18.5114, 120.6444 Mulsen, Germany, 50.7447, 12.5747 Kuruvambalam, India, 10.9375, 76.1639 Rudra Nagar, India, 24.3841, 87.8840 Antanandehibe, Madagascar, -19.6774, 48.3511 Otavi, Namibia, -19.6500, 17.3333 Jarjanaz, Syria, 35.6182, 36.7828 Lulhaul, India, 25.8787, 86.1386 Sambre, India, 15.8800, 74.5600 Odugattur, India, 12.7679, 78.8830 Pragadavaram, India, 17.0167, 81.0167 Kilrajakularaman, India, 9.3969, 77.6344 Alakamisy Anativato, Madagascar, -19.8788, 46.9007 Ilicakoy, Turkey, 36.8219, 31.3672 Villa Union, Mexico, 23.9667, -104.0333 Iramaia, Brazil, -13.2858, -40.9508 Laredo, Spain, 43.4144, -3.4100 Moda, India, 13.8246, 77.4421 Sunadkuppi, India, 16.1400, 74.8100 Bendougouba, Mali, 13.0575, -9.3956 Suhagi, India, 23.2206, 79.9569 Kattari, India, 11.4593, 77.7263 Ogano, Japan, 36.0171, 139.0086 Lyngdal, Norway, 58.1333, 7.0833 Doi Saket, Thailand, 18.8667, 99.1333 Manati, Puerto Rico, 18.4283, -66.4823 Rianxo, Spain, 42.6500, -8.8167 Briancon, France, 44.8964, 6.6356 Saint Ives, United Kingdom, 50.2110, -5.4800 Kuttattuppatti, India, 10.3759, 77.8972 Jaladurgam, India, 15.2840, 77.9001 Kingri, India, 25.6326, 86.6911 Kelilalina, Madagascar, -21.2843, 47.5546 Wang Sombun, Thailand, 13.3618, 102.1911 Lehigh, United States, 40.7678, -75.5394 Babhnoul, India, 25.3202, 84.2128 Komarolu, India, 15.2667, 79.0000 Jackson, United States, 43.4720, -110.7746 Lake Arrowhead, United States, 34.2531, -117.1944 Lieshout, Netherlands, 51.5219, 5.5803 Capela do Alto Alegre, Brazil, -11.6678, -39.8378 Shirebrook, United Kingdom, 53.2048, -1.2197 Goasi, India, 25.7643, 87.4155 Itacurubi de la Cordillera, Paraguay, -25.4616, -56.8533 Campo Largo, Argentina, -26.8000, -60.8333 Whitnash, United Kingdom, 52.2680, -1.5240 Na Sceiri, Ireland, 53.5828, -6.1083 Racale, Italy, 39.9667, 18.1000 Mogwase, South Africa, -25.2760, 27.2160 Jurua, Brazil, -3.4808, -66.0689 Northbrook, United States, 39.2467, -84.5796 Allonnes, France, 47.9686, 0.1606 Chantilly, France, 49.2000, 2.4667 Voisins-le-Bretonneux, France, 48.7592, 2.0517 Karuvelampatti, India, 9.8448, 78.0451 Padiyur, India, 10.4234, 78.0254 Doraville, United States, 33.9073, -84.2711 Brdovec, Croatia, 45.8703, 15.7644 Emsburen, Germany, 52.3925, 7.2914 Kumaravadi, India, 10.5264, 78.3118 Isola del Liri, Italy, 41.6833, 13.5667 Chandreru, India, 17.0980, 81.9959 Jaqma, Morocco, 33.2920, -7.4400 Newberry, United States, 34.2813, -81.6010 Bhalpatti, India, 26.1853, 86.0509 Vellavadanparappu, India, 11.1854, 77.8425 Raybag, India, 16.4800, 74.7800 Nandasmo, Nicaragua, 11.9333, -86.1167 The Hills, United States, 40.6561, -74.6215 Martinengo, Italy, 45.5704, 9.7674 Motta di Livenza, Italy, 45.7797, 12.6086 Santa Maria, El Salvador, 13.3500, -88.4333 Worth, United States, 41.6877, -87.7916 Placerville, United States, 38.7308, -120.7979 Choachi, Colombia, 4.5297, -73.9236 Cantillana, Spain, 37.6000, -5.8167 Royston, United Kingdom, 53.6100, -1.4500 Kerai, India, 25.7510, 85.8586 Scenic Oaks, United States, 29.7038, -98.6712 Saks, United States, 33.7118, -85.8536 Deh Bakri, Iran, 29.0478, 57.9119 Sonoma, United States, 38.2902, -122.4598 Uropa, Brazil, -11.1406, -62.3608 Gaohucun, China, 28.3367, 120.2178 Panamarattuppatti, India, 11.5620, 78.1649 Maniamkulam, India, 9.6410, 76.6440 Monte San Pietro, Italy, 44.4578, 11.1990 Amesbury, United Kingdom, 51.1730, -1.7800 Campton Hills, United States, 41.9498, -88.4166 Rogatica, Bosnia and Herzegovina, 43.7989, 19.0036 Leognan, France, 44.7294, -0.5997 Bazid Chak Kasturi, India, 25.6559, 85.4412 Andovoranto, Madagascar, -18.9544, 49.1094 Ankarabato, Madagascar, -16.1860, 46.1870 Tezontepec de Aldama, Mexico, 19.8833, -98.8167 Taimali, Taiwan, 22.6167, 121.0000 Milton, United States, 44.6429, -73.1538 Zwettl, Austria, 48.6033, 15.1689 Rajanagaram, India, 17.0833, 81.9000 Grezzana, Italy, 45.5167, 11.0167 Sapahi, India, 26.6517, 84.8526 Santa Barbara, Mexico, 26.8133, -105.8203 Asalem, Iran, 37.7211, 48.9583 Fujino, Japan, 35.6060, 139.1430 Zaragoza, Mexico, 17.9531, -94.6414 Sacueni, Romania, 47.3525, 22.0914 Cungus, Turkey, 38.2128, 39.2869 Essex Junction, United States, 44.4902, -73.1141 Alagappapuram, India, 8.1468, 77.5413 Otsuchi, Japan, 39.3582, 141.8994 Pebble Creek, United States, 28.1583, -82.3411 Ubala, Colombia, 4.7439, -73.5347 Gulbaar, Kyrgyzstan, 40.4874, 72.6525 Dharmavaram, India, 17.2300, 82.2280 Morro Bay, United States, 35.3682, -120.8482 Campolongo Maggiore, Italy, 45.3305, 12.0483 Novomyrhorod, Ukraine, 48.7833, 31.6500 Ormesby, United Kingdom, 54.5492, -1.1817 Imani, India, 16.3302, 80.6580 Meiwa, Japan, 36.2113, 139.5342 Villers-la-Ville, Belgium, 50.5833, 4.5333 Xiaozui, China, 35.6912, 108.0779 Parnera, India, 20.5500, 72.9500 Qaminis, Libya, 31.6572, 20.0144 Hartford, United States, 43.6644, -72.3865 Tigrana, India, 28.8620, 76.1370 Sosnivka, Ukraine, 50.2944, 24.2500 Nandiala, Burkina Faso, 12.3333, -2.1667 Thevur, India, 11.5240, 77.7539 Louvain-la-Neuve, Belgium, 50.6696, 4.6112 Candiota, Brazil, -31.5578, -53.6728 Yemva, Russia, 62.6000, 50.8667 Van Wert, United States, 40.8651, -84.5879 La Palma del Condado, Spain, 37.3842, -6.5517 Enumulapalle, India, 14.1446, 77.8166 Raeren, Belgium, 50.6833, 6.1167 Tamarana, Brazil, -23.7228, -51.0969 Aberystwyth, United Kingdom, 52.4140, -4.0810 Rewtith, India, 26.2853, 84.7155 Sidhap Kalan, India, 26.5456, 86.2346 Chittarkottal, India, 9.4276, 78.9015 Kenafif, Morocco, 30.4167, -9.0333 Indaw, Burma, 24.2214, 96.1433 Gages Lake, United States, 42.3519, -87.9828 Sesori, El Salvador, 13.7167, -88.3667 Tarboro, United States, 35.9046, -77.5563 Clermont, France, 49.3797, 2.4133 Villeneuve-Tolosane, France, 43.5247, 1.3425 Botticino Sera, Italy, 45.5333, 10.3000 Santa Catarina Ayotzingo, Mexico, 19.2647, -98.8975 Jyllinge, Denmark, 55.7584, 12.1123 Bou Khadra, Algeria, 35.7444, 8.0325 Marudur, India, 11.2341, 76.9067 Loano, Italy, 44.1290, 8.2598 Aliabad, Azerbaijan, 41.4829, 46.6348 Mara Rosa, Brazil, -14.0169, -49.1778 Schonwalde-Siedlung, Germany, 52.6500, 12.9833 Galsi, India, 23.3372, 87.6925 Shurobod, Tajikistan, 37.8403, 70.0419 Aduku, Uganda, 2.0194, 32.7200 Lwakhakha, Uganda, 0.7967, 34.3781 Bog'ot, Uzbekistan, 41.3500, 60.8167 Sangam, India, 14.5956, 79.7428 Qal`eh Tall, Iran, 31.6331, 49.8897 Borgloon, Belgium, 50.8022, 5.3433 San Felice sul Panaro, Italy, 44.8393, 11.1413 Ambohinihaonana, Madagascar, -21.1965, 47.9094 Fuller Heights, United States, 27.9227, -81.9978 Villahermosa, Colombia, 5.0000, -75.1667 Sam Ko, Thailand, 14.6074, 100.2186 Kearney, United States, 39.3550, -94.3599 Chettipalaiyam, India, 10.9125, 77.0370 Milattur, India, 10.8576, 79.2394 Sebin Karahisar, Turkey, 40.2886, 38.4233 Felida, United States, 45.7138, -122.7103 Kurdi, India, 16.0511, 77.2114 Saray, Azerbaijan, 40.5330, 49.7168 Etaples, France, 50.5186, 1.6414 Hatch End, United Kingdom, 51.6010, -0.3743 Sangalbahita, India, 25.3295, 87.3018 Trevignano, Italy, 45.7335, 12.0940 South Union, United States, 39.8705, -79.7222 Lexington, United States, 40.7779, -99.7461 Soquel, United States, 36.9978, -121.9483 Deville-les-Rouen, France, 49.4700, 1.0500 Baghuz Fawqani, Syria, 34.4610, 40.9490 Sidi Namane, Algeria, 36.7581, 3.9839 Chesterfield, United Kingdom, 53.2363, -1.4292 Lachhmipur, India, 25.5248, 87.3667 Sahuli, India, 26.1118, 84.3485 San Juan, Philippines, 17.6800, 120.7300 Morbach, Germany, 49.8167, 7.1167 Santa Ana Huista, Guatemala, 15.6833, -91.8167 Medesano, Italy, 44.7568, 10.1403 Querencia do Norte, Brazil, -23.0839, -53.4839 Darfield, United Kingdom, 53.5380, -1.3812 Gairtganj, India, 23.4102, 78.2208 Iretama, Brazil, -24.4239, -52.1058 Bottesford, United Kingdom, 53.5521, -0.6714 Jhundpura, India, 26.3473, 77.5010 Broomall, United States, 39.9688, -75.3540 Barmstedt, Germany, 53.7833, 9.7667 Peralillo, Chile, -34.4875, -71.4917 Gambettola, Italy, 44.1167, 12.3333 Matsuda-soryo, Japan, 35.3500, 139.1333 Baetov, Kyrgyzstan, 41.2667, 74.9570 Tisma, Nicaragua, 12.0826, -86.0178 Lenoir City, United States, 35.8111, -84.2818 Talsur, India, 25.3667, 87.8512 Kattipudi, India, 17.2500, 82.3333 Calimesa, United States, 33.9874, -117.0542 Yampil, Ukraine, 48.2400, 28.2783 Knowle, United Kingdom, 52.3881, -1.7318 Cerreto Guidi, Italy, 43.7617, 10.8771 Valadares, Portugal, 41.0937, -8.6392 Lake Barcroft, United States, 38.8514, -77.1579 Yorkshire, United States, 38.7882, -77.4496 Fo-Boure, Benin, 10.1167, 2.4000 Bestwig, Germany, 51.3667, 8.4000 Richmond Heights, United States, 41.5589, -81.5029 Frenstat pod Radhostem, Czechia, 49.5483, 18.2108 Mathigeri, India, 12.1500, 77.1000 Sebt Ait Ikkou, Morocco, 33.6686, -6.1372 Pine Ridge, United States, 28.9330, -82.4761 Cazzago San Martino, Italy, 45.5817, 10.0258 Iwai, Japan, 35.5833, 134.3333 Gammasa, Morocco, 31.4182, -8.3784 Aghbalou n'Kerdous, Morocco, 31.6767, -5.2976 Bela Crkva, Serbia, 44.8975, 21.4172 Gracanice, Kosovo, 42.6011, 21.1958 Sumner, United States, 47.2189, -122.2338 Pinto, Chile, -36.7036, -71.8922 Bhaur, India, 26.2751, 86.1552 Pulingom, India, 12.2833, 75.4167 Dakhram, India, 26.0542, 86.1280 Corozal, Puerto Rico, 18.3410, -66.3124 Neo Psychiko, Greece, 38.0000, 23.7833 Ardrossan, United Kingdom, 55.6432, -4.8097 Konganapuram, India, 11.5710, 77.9004 Hemavati, India, 14.0257, 76.9933 Darb-e Behesht, Iran, 29.2331, 57.3397 Lohariandava, Madagascar, -18.7844, 48.6772 Itarhi, India, 25.4832, 84.0129 Singapperumalkovil, India, 12.7595, 80.0075 Katra, India, 32.9917, 74.9319 Besagarahalli, India, 12.6333, 77.0000 Cricova, Moldova, 47.1389, 28.8614 Hosahalli, India, 15.3140, 76.3151 Douglass, United States, 40.3438, -75.5909 Sao Joao da Ocalina, Brazil, -23.9800, -51.8178 Anoviara, Madagascar, -14.7408, 49.8324 Corning, United States, 42.1470, -77.0561 Urgun, Afghanistan, 32.9006, 69.1569 Kivisto, Finland, 60.3236, 24.8453 Kankol, India, 12.1556, 75.2238 Salotgi, India, 17.1700, 75.9600 Dakhan, Iran, 35.1250, 49.5175 Cameri, Italy, 45.5000, 8.6500 Darby, United States, 39.9210, -75.2610 Capim Branco, Brazil, -19.5489, -44.1169 Tewkesbury, United Kingdom, 51.9900, -2.1600 West Haverstraw, United States, 41.2063, -73.9884 Maynard, United States, 42.4264, -71.4561 Tinqueux, France, 49.2509, 3.9918 Sao Bras de Alportel, Portugal, 37.1500, -7.8833 Krasnousol'skiy, Russia, 53.8947, 56.4686 Betsiaka, Madagascar, -13.1553, 49.2350 Monte Alegre do Piaui, Brazil, -9.7539, -45.3039 Chuqung, China, 33.3667, 97.1333 Joutseno, Finland, 61.1230, 28.5015 Chettimangurichchi, India, 11.6393, 77.8557 Ponnampatti, India, 10.5500, 78.3744 Felsberg, Germany, 51.1333, 9.4167 Oloron-Sainte-Marie, France, 43.1947, -0.6056 Al Atarib, Syria, 36.1391, 36.8250 Gurun, Turkey, 38.7225, 37.2775 Yeghvard, Armenia, 40.3217, 44.4814 Plan-les-Ouates, Switzerland, 46.1667, 6.1167 Aulla, Italy, 44.2167, 9.9667 Puranattukara, India, 10.5528, 76.1613 Kala Diara, India, 25.5092, 85.4480 Ukrainsk, Ukraine, 48.1000, 37.3833 Malapannanagudi, India, 15.2800, 76.3700 Huetor-Tajar, Spain, 37.1947, -4.0464 Leninskoe, Kyrgyzstan, 42.9706, 74.6625 Nakonde, Zambia, -9.3314, 32.7548 Bharra, India, 25.4398, 86.1624 Teus, India, 25.2493, 85.7141 Kursenai, Lithuania, 56.0000, 22.9333 Lamhadi, Morocco, 32.3000, -9.0167 Neuenhaus, Germany, 52.5000, 6.9667 Daganzo de Arriba, Spain, 40.5433, -3.4572 Clute, United States, 29.0256, -95.3975 Ponte Serrada, Brazil, -26.8719, -52.0158 Mysliborz, Poland, 52.9333, 14.8667 Bischofswerda, Germany, 51.1275, 14.1797 Antsaravibe, Madagascar, -13.0517, 49.0189 Corocoro, Bolivia, -17.1667, -68.4500 Ramareddi, India, 18.4110, 78.3674 Nowa Deba, Poland, 50.4167, 21.7667 Santo Andre, Portugal, 38.0667, -8.7833 Vel'ky Krtis, Slovakia, 48.2150, 19.3381 Cookstown, United Kingdom, 54.6470, -6.7450 Santa Terezinha de Goias, Brazil, -14.4378, -49.7058 Kadwa, India, 25.0316, 84.0924 Sant'Antioco, Italy, 39.0664, 8.4545 Filipstad, Sweden, 59.7167, 14.1667 Coite do Noia, Brazil, -9.6322, -36.5786 Gudibanda, India, 13.9753, 77.1046 Tiszafured, Hungary, 47.6190, 20.7600 Ambato, Madagascar, -18.5970, 47.4962 Isabela, Puerto Rico, 18.4991, -67.0220 Gobardhanpur Kanap, India, 25.0682, 84.5241 Karadichittur, India, 11.8289, 78.8758 Tolna, Hungary, 46.4250, 18.7750 Atlit, Israel, 32.6872, 34.9383 Amayan, India, 26.3205, 78.7581 Freeport, United States, 28.9453, -95.3601 Almoloya, Mexico, 19.7000, -98.4000 Lacarak, Serbia, 45.0022, 19.5686 Alachua, United States, 29.7779, -82.4832 St. Albans, United States, 38.3769, -81.8198 Kumbhari, India, 21.2088, 83.6467 Sirugudi, India, 10.2627, 78.3088 Maghra, India, 25.1903, 85.4921 Mount Vista, United States, 45.7373, -122.6316 Potomac Park, United States, 35.3636, -118.9650 Munhall, United States, 40.3935, -79.9005 Asfour, Algeria, 36.6667, 7.9833 Ngaputaw, Burma, 16.5378, 94.6936 Borshchiv, Ukraine, 48.8028, 26.0364 San Nicolas, Chile, -36.5033, -72.2122 Hajeb el Aioun, Tunisia, 35.3900, 9.5400 Mount Airy, United States, 36.5083, -80.6155 Lambton Shores, Canada, 43.1833, -81.9000 Great Dunmow, United Kingdom, 51.8710, 0.3640 Nueva Helvecia, Uruguay, -34.2833, -57.2000 Delareyville, South Africa, -26.6833, 25.4667 Fair Oaks Ranch, United States, 29.7467, -98.6376 Cottage Grove, United States, 43.7960, -123.0573 Burgau, Germany, 48.4322, 10.4069 Nedumpura, India, 10.3903, 76.1514 Sannicolau Mare, Romania, 46.0636, 20.6125 Svedala, Sweden, 55.5000, 13.2333 Fairview, United States, 45.5469, -122.4390 Epinay-sur-Orge, France, 48.6726, 2.3239 Lubawa, Poland, 53.5000, 19.7500 Memphis, United States, 27.5435, -82.5608 Sao Felix do Araguaia, Brazil, -11.6169, -50.6689 Chalco, United States, 41.1817, -96.1353 Jacinto Machado, Brazil, -28.9969, -49.7639 Valentigney, France, 47.4633, 6.8331 Jiwachhpur, India, 26.3120, 87.0405 Pella, United States, 41.4052, -92.9189 Winterville, United States, 35.5291, -77.4000 Veseli nad Moravou, Czechia, 48.9536, 17.3764 Chinnamandem, India, 13.9419, 78.6814 Santa Clara, United States, 44.1154, -123.1344 Adohoun, Benin, 6.6333, 1.6667 Pama, India, 25.8122, 86.8474 Crestwood, United States, 41.6454, -87.7397 Dinagat, Philippines, 9.9561, 125.5933 Kralendijk, Bonaire, Sint Eustatius, and Saba, 12.1444, -68.2656 Snovsk, Ukraine, 51.8203, 31.9508 Uzda, Belarus, 53.4661, 27.2244 Jesenik, Czechia, 50.2297, 17.2047 Ruppichteroth, Germany, 50.8439, 7.4836 Villa Jaragua, Dominican Republic, 18.4800, -71.5000 Opatija, Croatia, 45.3347, 14.3069 Groot-Brakrivier, South Africa, -34.0425, 22.2314 Shelton, United States, 47.2186, -123.1121 North Dumfries, Canada, 43.3200, -80.3800 Altamirano, Mexico, 16.7361, -92.0389 Yelm, United States, 46.9398, -122.6262 Longbenton, United Kingdom, 55.0000, -1.5700 Neo Vouprasio, Greece, 38.0333, 21.3667 Nakayama, Japan, 38.3331, 140.2831 Waggaman, United States, 29.9373, -90.2354 Kilibo, Benin, 8.5717, 2.6017 Usuppur, India, 11.3815, 79.6970 Tnine Sidi Lyamani, Morocco, 35.3700, -5.9700 Bel Air, United States, 39.5348, -76.3460 Partap Tanr, India, 25.8897, 85.2551 Kanur, India, 17.0318, 75.7022 Mittahalli, India, 12.4210, 78.1991 Hanson, United States, 42.0558, -70.8723 Bouhmama, Algeria, 35.2833, 6.7333 Avigliano, Italy, 40.7333, 15.7167 Urcos, Peru, -13.6861, -71.6228 Kraluv Dvur, Czechia, 49.9467, 14.0350 Cadelbosco di Sopra, Italy, 44.7667, 10.6000 Calcoene, Brazil, 2.4978, -50.9489 Plankstadt, Germany, 49.3933, 8.5942 Jilava, Romania, 44.3328, 26.0781 Ouedo-Agueko, Benin, 6.4963, 2.4268 Antardipa, India, 24.6442, 87.9213 Nanticoke, United States, 41.2005, -76.0003 Canapolis, Brazil, -18.7250, -49.2039 Ghattu, India, 13.6602, 78.3331 Blandford Forum, United Kingdom, 50.8560, -2.1650 Felton, United Kingdom, 51.5100, -2.5740 Sabnima, India, 25.4583, 85.5670 Munnuru, India, 12.8283, 74.8803 Khilok, Russia, 51.3500, 110.4500 Hollviken, Sweden, 55.4167, 12.9500 Pires Ferreira, Brazil, -4.2469, -40.6450 Barharia, India, 26.3191, 84.4547 San Ignacio Cohuirimpo, Mexico, 27.0500, -109.4167 Lunca Cetatuii, Romania, 47.0931, 27.5662 Lyakhavichy, Belarus, 53.0333, 26.2667 Aranda, India, 26.0850, 84.3601 Massa Lombarda, Italy, 44.4500, 11.8167 Mantasoa, Madagascar, -19.0129, 47.8342 Kucukkuyu, Turkey, 39.5500, 26.6167 Garrucha, Spain, 37.1842, -1.8214 Bajpe, India, 12.9803, 74.8832 Tubara, Colombia, 10.8667, -74.9833 Bad Wildbad, Germany, 48.7503, 8.5506 Khovaling, Tajikistan, 38.3386, 69.9728 Urucania, Brazil, -20.3508, -42.7389 Killiney, Ireland, 53.2651, -6.1137 Khokri Kalan, India, 30.8456, 75.3307 Kucuk Dalyan, Turkey, 36.2167, 36.1667 Souanke, Congo (Brazzaville), 2.0833, 14.1333 Sokhodewara, India, 24.8358, 85.8725 East Bradford, United States, 39.9590, -75.6469 Ain Legdah, Morocco, 34.1667, -4.5000 Acari, Brazil, -6.4358, -36.6389 Itarana, Brazil, -19.8739, -40.8750 Le Mars, United States, 42.7810, -96.1733 Diessen am Ammersee, Germany, 47.9500, 11.1000 Mizerov, Czechia, 49.8603, 18.5556 Urrugne, France, 43.3631, -1.6989 Akbarpur, India, 24.6351, 83.9642 Inebolu, Turkey, 41.9747, 33.7608 Bonham, United States, 33.5880, -96.1901 Peschanokopskoye, Russia, 46.1958, 41.0778 Shepton Mallet, United Kingdom, 51.1930, -2.5460 La Maddalena, Italy, 41.2142, 9.4083 Sleepy Hollow, United States, 41.0936, -73.8722 Lake Morton-Berrydale, United States, 47.3325, -122.1032 Monte Dourado, Brazil, -0.8667, -52.5167 Ghoswari, India, 25.4687, 85.4964 Miro Khan, Pakistan, 27.7597, 68.0917 Karpuzlu, Turkey, 37.5592, 27.8344 Lymanka, Ukraine, 46.3883, 30.6808 Ormesson-sur-Marne, France, 48.7858, 2.5383 Dasai, India, 22.7200, 75.1321 Kabira, India, 25.6897, 86.4852 Kurhani, India, 25.9803, 85.3374 Ninheira, Brazil, -15.3208, -41.7539 Werlte, Germany, 52.8500, 7.6833 Worcester, United States, 40.1899, -75.3522 Hondo Valle, Dominican Republic, 18.7200, -71.7000 Ranko, India, 25.5181, 86.4899 Busayra, Jordan, 30.7326, 35.6094 Hoogland, Netherlands, 52.1872, 5.3744 Bohl-Iggelheim, Germany, 49.3833, 8.3000 Murtosa, Portugal, 40.7369, -8.6386 Ironton, United States, 38.5323, -82.6779 Piratininga, Brazil, -22.4128, -49.1350 Iaciara, Brazil, -14.0958, -46.6319 Machulishchy, Belarus, 53.7814, 27.5958 Sarospatak, Hungary, 48.3189, 21.5661 Vellipalaiyam, India, 11.3314, 76.9813 North Lakes, United States, 61.6191, -149.3110 Le Pradet, France, 43.1064, 6.0239 Maida Babhangawan, India, 25.4793, 86.0669 Sonakhal, India, 22.2125, 88.7133 Alcora, Spain, 40.0667, -0.2000 San Gaspar Ixchil, Guatemala, 15.3833, -91.7167 Kombai, India, 10.6143, 78.1212 Kartal, India, 16.9859, 78.5014 Jablanica, Bosnia and Herzegovina, 43.6620, 17.7618 Croissy-sur-Seine, France, 48.8783, 2.1433 Songo, Angola, -7.3496, 14.8500 Chorrocho, Brazil, -8.9800, -39.0939 Jaguari, Brazil, -29.4969, -54.6900 Yacuanquer, Colombia, 1.1167, -77.4000 Sao Joao de Ver, Portugal, 40.9536, -8.5508 Kimpese, Congo (Kinshasa), -5.5631, 14.4458 Trofarello, Italy, 44.9771, 7.7438 Tenango del Aire, Mexico, 19.1575, -98.8581 Grijo, Portugal, 41.0306, -8.5815 Abergele, United Kingdom, 53.2800, -3.5800 Sirur Tajband, India, 18.7000, 76.9333 Pasil, Philippines, 17.3894, 121.1597 Lejanias, Colombia, 3.5268, -74.0232 Acate, Italy, 37.0253, 14.4925 Nakagawa, Japan, 33.9511, 134.6622 Pingree Grove, United States, 42.0855, -88.4358 Vienna, United States, 39.3240, -81.5383 Bad Iburg, Germany, 52.1592, 8.0472 Rocafuerte, Ecuador, -0.9236, -80.4495 Raghunathpur, India, 26.6418, 84.8938 Bodippatti, India, 10.5642, 77.2336 Pariconia, Brazil, -9.2539, -38.0058 'Ain Fekan, Algeria, 35.2250, -0.0017 Zapotitlan, Guatemala, 14.1333, -89.8333 Lagoa do Mato, Brazil, -6.0469, -43.5258 Reiskirchen, Germany, 50.6000, 8.8333 Kielczow, Poland, 51.1406, 17.1783 Kolarovo, Slovakia, 47.9153, 17.9972 Weingarten, Germany, 49.0514, 8.5306 Sawadah, Egypt, 28.0775, 30.7953 Igny, France, 48.7421, 2.2261 Shampur, India, 23.4180, 77.0867 Tekkattur, India, 10.2997, 78.7884 Jurbarkas, Lithuania, 55.0833, 22.7667 Fairview, United States, 33.1399, -96.6117 Mulungu, Brazil, -4.3058, -38.9958 Porto Firme, Brazil, -20.6728, -43.0839 Lenzburg, Switzerland, 47.3875, 8.1803 Gajiginhalu, India, 15.6969, 76.6647 Nevelsk, Russia, 46.6833, 141.8667 Monroe, United States, 42.6030, -89.6381 Daskasan, Azerbaijan, 40.5209, 46.0814 Catanduvas, Brazil, -27.0708, -51.6619 Tarazona de Aragon, Spain, 41.9044, -1.7242 Kasavanampatti, India, 10.3692, 77.8699 Monsenhor Gil, Brazil, -5.5642, -42.6078 Vouzela, Portugal, 40.7231, -8.1122 Puligunta, India, 12.4395, 78.3625 Ivankiv, Ukraine, 50.9328, 29.9047 Acushnet, United States, 41.7138, -70.9012 Corumba de Goias, Brazil, -15.9239, -48.8089 Teddington, United Kingdom, 51.4240, -0.3320 Bellefontaine Neighbors, United States, 38.7529, -90.2280 Bangshang, China, 32.2575, 108.1119 Flers-lez-Lille, France, 50.6333, 3.1333 Trabia, Italy, 38.0000, 13.6500 Flamanzi, Romania, 47.5500, 26.8667 Ban Ko, Thailand, 13.6405, 100.0400 Koppaka, India, 16.7494, 81.0311 Ambohitromby, Madagascar, -18.4333, 47.1500 Ambolotarakely, Madagascar, -18.2684, 47.4147 Ascope, Peru, -7.7138, -79.1077 Las Matas de Santa Cruz, Dominican Republic, 19.6700, -71.5000 Longuenesse, France, 50.7364, 2.2383 Al Fayd, Morocco, 30.6167, -8.2167 Kien Giang, Vietnam, 17.2250, 106.7917 Palatka, United States, 29.6493, -81.6705 Kamikawa, Japan, 35.0667, 134.7333 Kanagicho, Japan, 40.9026, 140.4620 Puente de Piedra, Costa Rica, 10.0298, -84.3332 Pachauth, India, 25.5760, 86.8083 Maryville, United States, 40.3428, -94.8702 Cachoeira de Minas, Brazil, -22.3550, -45.7789 Sawla, Ghana, 9.2729, -2.4143 Chitaga, Colombia, 7.1333, -72.6667 Loharda, India, 22.5918, 76.5957 Darauli, India, 26.0781, 84.1314 Kuiyibagecun, China, 38.1023, 77.1539 Nave, Italy, 45.5850, 10.2833 Fenglin, Taiwan, 23.7500, 121.4333 Smithville, United States, 39.3919, -94.5747 Muurame, Finland, 62.1333, 25.6750 Don Galo, Philippines, 14.5072, 120.9844 Bellmead, United States, 31.6026, -97.0897 Santa Margarita de Mombuy, Spain, 41.5756, 1.6092 Martensville, Canada, 52.2897, -106.6667 Sihma, India, 25.6992, 86.2446 `Utaybah, Syria, 33.4851, 36.6086 Linluo, Taiwan, 22.6506, 120.5271 Paddhari, India, 22.4300, 70.6000 Usmate Velate, Italy, 45.6500, 9.3500 Mancora, Peru, -4.1056, -81.0472 Ada, Serbia, 45.8000, 20.1333 Niel, Belgium, 51.1167, 4.3333 Sao Jose do Calcado, Brazil, -21.0253, -41.6544 Mathila, India, 25.4715, 84.1438 Little Canada, United States, 45.0244, -93.0863 Chervyen, Belarus, 53.7078, 28.4322 Sabaneta de Yasica, Dominican Republic, 19.6667, -70.3833 Tarabha, India, 20.7325, 83.6744 Heath, United States, 40.0241, -82.4413 Linthicum, United States, 39.2088, -76.6626 Aerzen, Germany, 52.0494, 9.2653 Phaphot, India, 25.6817, 86.0069 Kulrian, India, 29.7994, 75.6827 Secanj, Serbia, 45.3667, 20.7725 Scotchtown, United States, 41.4765, -74.3668 Yoko, Benin, 6.7000, 2.6167 Bir Ben Laabed, Algeria, 36.2175, 3.4267 Parana, Brazil, -12.6150, -47.8828 Sambalhera, India, 29.3250, 77.9194 Hrebinka, Ukraine, 50.1167, 32.4167 Bobrovytsia, Ukraine, 50.7450, 31.3869 Bischofshofen, Austria, 47.4172, 13.2194 Lasht-e Nesha, Iran, 37.3608, 49.8611 Bluffton, United States, 40.7424, -85.1730 Bogalusa, United States, 30.7812, -89.8633 Torpa, India, 22.9361, 85.0889 Madathapatti, India, 9.1321, 77.4245 Marotaolana, Madagascar, -14.0256, 48.6143 Chota Mollakhali, India, 22.2222, 88.8956 Jhonkar, India, 23.2361, 76.1814 Aravelli, India, 18.7190, 79.0262 Montalegre, Portugal, 41.8239, -7.7900 Dospat, Bulgaria, 41.6436, 24.1597 Pallattur, India, 10.1461, 78.8031 Antenetibe, Madagascar, -18.7480, 47.3261 Torotoro, Bolivia, -18.1342, -65.7633 Mario Campos, Brazil, -20.0558, -44.1878 Southwick, United Kingdom, 54.9193, -1.4062 Maevka, Kyrgyzstan, 42.9093, 74.5685 San Juanito, Mexico, 27.9700, -107.6003 Novotroitske, Ukraine, 46.3500, 34.3333 Nordkirchen, Germany, 51.7381, 7.5256 Nagambhotlapalem, India, 15.6804, 79.8151 Mfou, Cameroon, 3.9600, 11.9300 San Isidro, El Salvador, 13.8333, -88.7167 Kakhandiki, India, 16.6010, 75.6405 Weinbohla, Germany, 51.1667, 13.5667 Saint-Gely-du-Fesc, France, 43.6931, 3.8067 Tamarankottai, India, 10.4300, 79.3200 Novaya Lyalya, Russia, 59.0667, 60.6000 Rhar el Melah, Tunisia, 37.1667, 10.1833 Rabta, Algeria, 35.9167, 4.7500 Garag, India, 15.5750, 74.9297 Galena Park, United States, 29.7452, -95.2333 Mapleton, Canada, 43.7358, -80.6681 Cotacachi, Ecuador, 0.3000, -78.2667 Floresta Azul, Brazil, -14.8600, -39.6600 Hericourt, France, 47.5783, 6.7622 Skillounta, Greece, 37.6061, 21.6870 Delhi, United States, 37.4306, -120.7759 Dhilwan, India, 31.5143, 75.3457 New Albany, United States, 40.0809, -82.7848 Tulshia, India, 26.3468, 87.8411 Karukkalvadi, India, 11.6714, 78.0126 Wanderlandia, Brazil, -6.8489, -47.9628 La Virgen, Costa Rica, 10.4312, -84.0772 Simbach am Inn, Germany, 48.2667, 13.0167 Fairmount, United States, 39.7931, -105.1711 Frontera, Argentina, -31.4278, -62.0619 Benedito Novo, Brazil, -26.7828, -49.3639 Recreio, Brazil, -21.5250, -42.4692 Flawil, Switzerland, 47.4053, 9.1977 Sahuria, India, 25.8197, 86.6132 Nahargarh, India, 24.1692, 75.2342 Buttar Khurd, India, 30.7250, 75.2750 Montale, Italy, 43.9333, 11.0167 Rasebetsane, Lesotho, -29.8992, 27.6628 Parczew, Poland, 51.6333, 22.8667 Cedro, Brazil, -7.7219, -39.2389 Xambioa, Brazil, -6.4108, -48.5358 Paittur, India, 11.5356, 78.5749 Standish, United States, 43.7811, -70.5684 Raceland, United States, 29.7282, -90.6362 Tangerhutte, Germany, 52.4333, 11.8000 Simpelveld, Netherlands, 50.8339, 5.9814 Golyaka, Turkey, 40.7769, 30.9958 Malibu, United States, 34.0370, -118.7839 Pierre-Benite, France, 45.7044, 4.8250 Heris, Iran, 38.2475, 47.1164 Naganuma, Japan, 43.0167, 141.7000 Riverdale, United States, 41.6441, -87.6366 Saidia, Morocco, 35.0850, -2.2392 Perur, India, 10.9752, 76.9129 Itzer, Morocco, 32.8833, -5.0500 Shumanay, Uzbekistan, 42.6333, 58.9167 Vargem, Brazil, -22.8889, -46.4139 Caslav, Czechia, 49.9117, 15.3950 Boudouaou el Bahri, Algeria, 36.7733, 3.3872 Neuhausen am Rheinfall, Switzerland, 47.6831, 8.6167 Obuse, Japan, 36.6975, 138.3121 Al Karak, Syria, 32.6856, 36.3492 Lollar, Germany, 50.6497, 8.7044 Steinfeld, Germany, 52.6000, 8.2167 Bagrinagar, India, 25.9000, 73.8000 Okinawa Numero Uno, Bolivia, -17.2189, -62.8953 Kaufering, Germany, 48.0833, 10.8833 Monmouth, United Kingdom, 51.8100, -2.7200 Nallippalaiyam, India, 11.2388, 78.1495 Santiago Chimaltenango, Guatemala, 15.4814, -91.7261 Surinam, Mauritius, -20.5139, 57.5111 Beverly Hills, United States, 42.5220, -83.2423 San Josecito, Costa Rica, 9.8885, -84.1055 Murata, Japan, 38.1185, 140.7224 Plymouth, United States, 41.3483, -86.3187 Morsand, India, 25.9335, 85.6980 Imst, Austria, 47.2394, 10.7381 Heule, Belgium, 50.8333, 3.2333 Ertvelde, Belgium, 51.1783, 3.7447 Cristino Castro, Brazil, -8.8178, -44.2239 Andonabe Atsimo, Madagascar, -19.9240, 48.1971 Yuzhno-Sukhokumsk, Russia, 44.6667, 45.6500 Celic, Bosnia and Herzegovina, 44.7211, 18.8203 Agramonte, Cuba, 22.6768, -81.1161 Marcali, Hungary, 46.5831, 17.4064 Riesi, Italy, 37.2833, 14.0833 Tierra Colorada, Mexico, 17.1656, -99.5264 Aleksandrovsk, Russia, 59.1667, 57.6000 Excelsior Springs, United States, 39.3390, -94.2400 Jimenez, Costa Rica, 10.1797, -83.7382 Bibala, Angola, -14.7667, 13.3500 Court-Saint-Etienne, Belgium, 50.6333, 4.5667 Pocao, Brazil, -8.1858, -36.7050 Angostura, Colombia, 6.8667, -75.3333 Vembur, India, 10.5893, 78.0709 Balwa, India, 29.4060, 77.3080 Samakhiali, India, 23.3333, 70.5833 Yedappalli, India, 11.3792, 76.8108 Kamifurano, Japan, 43.4500, 142.4667 San Ricardo, Philippines, 9.9200, 125.2800 Ban Thung Khao Phuang, Thailand, 19.5483, 98.9538 Usmat Shaharchasi, Uzbekistan, 39.7386, 67.6433 Dehqonobod, Uzbekistan, 40.5314, 69.0342 Nuriston, Uzbekistan, 38.4892, 65.6464 Keila, Estonia, 59.3086, 24.4225 Rajapur, India, 16.6700, 73.5200 Rajapur, India, 16.6568, 73.5170 Paina, India, 26.2513, 83.7812 Rio do Pires, Brazil, -13.1278, -42.2919 Candelaria Loxicha, Mexico, 15.9167, -96.4833 Sadon, Burma, 25.3927, 97.8996 Buriti Alegre, Brazil, -18.1439, -49.0439 Kibichuo, Japan, 34.8633, 133.6936 Delta, Brazil, -19.9769, -47.7708 Bhopalia, India, 22.2791, 73.7104 Naini, India, 25.8320, 84.7179 Adalpur, India, 26.1910, 86.0239 Litomysl, Czechia, 49.8719, 16.3106 Devanakonda, India, 15.5333, 77.5500 Laqraqra, Morocco, 32.4333, -7.4333 La Chapelle-Saint-Mesmin, France, 47.8906, 1.8408 Cullompton, United Kingdom, 50.8550, -3.3930 Krishnamsettipalle, India, 15.3695, 78.8840 Nowe Miasto Lubawskie, Poland, 53.4256, 19.5878 Grinon, Spain, 40.2167, -3.8500 Gudlavalleru, India, 16.3500, 81.0500 Hoki, Japan, 35.3856, 133.4072 Forest Acres, United States, 34.0323, -80.9716 Soledar, Ukraine, 48.6953, 38.0675 Reading, United States, 39.2242, -84.4333 Regidor, Colombia, 8.6667, -73.8333 Likiskiai, Lithuania, 54.4000, 23.9810 Ontario, United States, 43.2408, -77.3140 Chencha, Ethiopia, 6.2500, 37.5667 Tarnok, Hungary, 47.3597, 18.8586 Duraiswamipuram, India, 9.0661, 77.4517 Begampur, India, 22.7368, 88.2518 Ingeniero White, Argentina, -38.7667, -62.2667 Rajpur Kalan, India, 25.6792, 84.1259 La Trinite, France, 43.7417, 7.3147 Milton, United States, 30.6286, -87.0522 Cheat Lake, United States, 39.6670, -79.8564 Ryhope, United Kingdom, 54.8679, -1.3698 Abadou, Morocco, 31.5797, -7.3122 Sweetwater, United States, 32.4692, -100.4092 Bastrop, United States, 30.1113, -97.3176 Presidente Vargas, Brazil, -3.4069, -44.0239 Jesenice, Czechia, 49.9683, 14.5136 Ouolodo, Mali, 13.2019, -7.9286 Wendeburg, Germany, 52.3167, 10.4000 Johvi, Estonia, 59.3575, 27.4269 Coacoatzintla, Mexico, 19.6500, -96.9333 River Grove, United States, 41.9243, -87.8379 Alfredo Wagner, Brazil, -27.7000, -49.3339 Buraan, Somalia, 10.2167, 48.7000 Ban Lueak, Thailand, 13.7062, 99.8730 White Marsh, United States, 39.3819, -76.4574 Saude, Brazil, -10.9408, -40.4178 Folomana, Mali, 13.6006, -5.1553 Las Veredas, Mexico, 23.1503, -109.7061 Ambhua, India, 24.5568, 87.8651 Akseki, Turkey, 37.0486, 31.7900 Fort Meade, United States, 39.1061, -76.7437 Tiruvalam, India, 12.9825, 79.2661 Padiham, United Kingdom, 53.7970, -2.3110 Gelves, Spain, 37.3333, -6.0167 Rokunohe, Japan, 40.6095, 141.3248 Marlton, United States, 39.9014, -74.9294 Espanola, United States, 36.0044, -106.0686 Hulshout, Belgium, 51.0750, 4.7901 Salvatierra de Mino, Spain, 42.0833, -8.5000 Taormina, Italy, 37.8518, 15.2857 Mospyne, Ukraine, 47.9000, 38.0667 Corzuela, Argentina, -26.9333, -60.9667 Budelsdorf, Germany, 54.3167, 9.6833 Balua Rampur, India, 26.7777, 84.4280 Tokigawa, Japan, 36.0086, 139.2968 La Plata, United States, 38.5352, -76.9700 Ambahy, Madagascar, -20.7730, 48.4768 Markt Indersdorf, Germany, 48.3667, 11.3667 Marck, France, 50.9486, 1.9508 Bordj Okhriss, Algeria, 36.0833, 3.9667 Kremiss, Mali, 15.3505, -10.3458 Dali, Cyprus, 35.0211, 33.4200 Al Musayfirah, Syria, 32.6326, 36.3398 Rifle, United States, 39.5362, -107.7729 Hartswater, South Africa, -27.7667, 24.8167 Gommern, Germany, 52.0667, 11.8333 Belao, India, 25.1476, 85.7377 Dighawani, India, 22.2061, 78.8135 Chestnut Ridge, United States, 41.0829, -74.0551 South Lebanon, United States, 40.3058, -76.3708 Itaipe, Brazil, -17.4019, -41.6689 Wepangandla, India, 16.1157, 78.1301 Vaddepalli, India, 15.9359, 77.8417 Santiago Tangamandapio, Mexico, 19.9500, -102.4333 Novodnistrovsk, Ukraine, 48.5778, 27.4414 Lighthouse Point, United States, 26.2785, -80.0891 Dhanwar, India, 24.4107, 85.9818 Hilter, Germany, 52.1500, 8.1500 Gemona del Friuli, Italy, 46.2741, 13.1224 Somers Point, United States, 39.3167, -74.6066 Floresta, Brazil, -23.5989, -52.0808 Holbeach, United Kingdom, 52.8037, 0.0154 Sainte-Savine, France, 48.2956, 4.0497 Vikrutamala, India, 13.6206, 79.5642 Burhia Dhanghatta, India, 25.9004, 87.2852 Little River, United States, 33.8786, -78.6393 Teotlaltzingo, Mexico, 19.2333, -98.4833 Vieux-Conde, France, 50.4603, 3.5692 Ymittos, Greece, 37.9500, 23.7333 Gokce, Turkey, 37.2070, 40.6970 Nova Vodolaha, Ukraine, 49.7192, 35.8761 Macajuba, Brazil, -12.1358, -40.3600 Palestina, Colombia, 1.7500, -76.0667 Nivala, Finland, 63.9250, 24.9750 Kopparam, India, 16.0841, 79.9874 Lakhna, India, 26.6500, 79.1500 Khurmi, Tajikistan, 39.5167, 67.5833 Vermilion, United States, 41.4103, -82.3214 Miribel, France, 45.8253, 4.9536 Valpoy, India, 15.5324, 74.1367 Phai Sali, Thailand, 15.6000, 100.6494 Schleusingen, Germany, 50.5167, 10.7500 Broughton, United Kingdom, 52.0500, -0.6940 Figuig, Morocco, 32.1167, -1.2269 Minanba, Mali, 12.3922, -4.6678 Santiago, Peru, -14.1892, -75.7126 Rockport, United States, 28.0290, -97.0722 Garrison, United States, 39.4023, -76.7514 Braine-le-Chateau, Belgium, 50.6833, 4.2667 Catanduvas, Brazil, -25.2028, -53.1569 Bakwa, India, 26.0601, 86.4124 Da, Mali, 13.1600, -4.9111 Waverly, United States, 42.7250, -92.4708 Lonkly, Benin, 7.1333, 1.6833 Fervedouro, Brazil, -20.7258, -42.2789 Cowes, United Kingdom, 50.7595, -1.3002 El Chol, Guatemala, 14.9667, -90.4833 Silverton, United States, 45.0030, -122.7808 Golden Hills, United States, 35.1409, -118.4968 Catunda, Brazil, -4.6478, -40.2008 Saidapet, India, 13.1434, 80.1912 Birzai, Lithuania, 56.2000, 24.7500 Krasnoilsk, Ukraine, 48.0147, 25.5872 Muquem de Sao Francisco, Brazil, -12.0650, -43.5489 Lamsabih, Morocco, 32.2933, -8.6889 Plaine Magnien, Mauritius, -20.4286, 57.6531 Timra, Sweden, 62.4778, 17.3069 Santa Teresinha, Brazil, -12.7719, -39.5228 Sao Sebastiao da Grama, Brazil, -21.7108, -46.8208 Scaggsville, United States, 39.1416, -76.8843 Southborough, United States, 42.3012, -71.5297 Burton Latimer, United Kingdom, 52.3650, -0.6780 Mochizuki, Japan, 36.2644, 138.3622 Minobu, Japan, 35.4675, 138.4425 Ulft, Netherlands, 51.8908, 6.3797 Thilogne, Senegal, 15.9659, -13.5916 Nova Europa, Brazil, -21.7783, -48.5608 Koth, India, 22.6360, 72.3000 Laukaha, India, 26.0336, 86.6471 Abay, Kazakhstan, 43.2092, 76.7603 Wapienica, Poland, 49.8083, 18.9839 Altenberge, Germany, 52.0458, 7.4653 Sidi Boushab, Morocco, 30.0740, -9.2790 Lowell, United States, 36.2561, -94.1532 Kamthi, India, 21.2161, 79.1973 Dumri, India, 25.5263, 86.7346 Sisai, India, 23.1794, 84.7582 Kaluvaya, India, 14.5000, 79.4167 Balia, India, 24.2433, 75.8061 Manakana, Madagascar, -19.7655, 48.3626 Warr Acres, United States, 35.5285, -97.6182 Dnestrovsc, Moldova, 46.6222, 29.9133 Yesilkoy, Turkey, 36.8667, 36.2000 Antsahadinta, Madagascar, -19.0190, 47.4481 Choyr, Mongolia, 46.3611, 108.3611 Salpazari, Turkey, 40.9422, 39.1942 Le Locle, Switzerland, 47.0532, 6.7482 Pernes-les-Fontaines, France, 43.9986, 5.0597 Eccleston, United Kingdom, 53.4539, -2.7748 Caspe, Spain, 41.2333, -0.0333 Melito di Porto Salvo, Italy, 37.9167, 15.7833 Plattekill, United States, 41.6478, -74.0718 Fatehpur, India, 24.6297, 85.2249 Venganellur, India, 10.7000, 76.3333 Crestline, United States, 34.2486, -117.2887 Altusried, Germany, 47.8000, 10.2167 El Alamo, Spain, 40.2306, -3.9944 Alexandria, United States, 38.9621, -84.3859 Ibiassuce, Brazil, -14.2589, -42.2569 Kiso, Japan, 35.9363, 137.7831 Pine Castle, United States, 28.4651, -81.3741 Klipphausen, Germany, 51.0833, 13.5333 Radyvyliv, Ukraine, 50.1286, 25.2644 Camden, United States, 33.5672, -92.8467 Floha, Germany, 50.8558, 13.0714 Estaimpuis, Belgium, 50.7000, 3.2667 Takon, Benin, 6.6500, 2.6167 Suhr, Switzerland, 47.3747, 8.0806 Labin, Croatia, 45.0833, 14.1167 Gunbarrel, United States, 40.0632, -105.1713 Vashon, United States, 47.4122, -122.4726 Fatehpur, India, 25.3032, 87.8623 Kamalapuram, India, 18.1600, 79.5406 Aulendorf, Germany, 47.9542, 9.6389 Firminopolis, Brazil, -16.5819, -50.3050 Valatt, India, 11.7833, 75.9000 Nagtala, India, 22.4667, 88.3833 Roca Sales, Brazil, -29.2839, -51.8678 Coriano, Italy, 43.9691, 12.6006 Bouderbala, Morocco, 33.8123, -5.2871 Hobart, United States, 44.4967, -88.1602 Flat Rock, United States, 42.0991, -83.2716 Jurbise, Belgium, 50.5333, 3.9333 Salo, Italy, 45.6000, 10.5333 Libanggaon, Nepal, 28.3000, 82.6333 Nahulingo, El Salvador, 13.7000, -89.7167 Garden Acres, United States, 37.9637, -121.2296 Scituate, United States, 41.7926, -71.6203 Waterford, United States, 39.7415, -74.8207 Rawdon, Canada, 46.0500, -73.7167 Bogue, Mauritania, 16.5904, -14.2700 Ciechocinek, Poland, 52.8833, 18.7833 Edwards, United States, 39.6215, -106.6184 Cabestany, France, 42.6811, 2.9433 Treillieres, France, 47.3319, -1.6256 Caudebec-les-Elbeuf, France, 49.2817, 1.0222 Chandera, India, 25.0829, 78.9784 Dona Ines, Brazil, -6.6136, -35.6267 Shenjiaba, China, 32.9383, 108.6439 Braunsbedra, Germany, 51.2833, 11.9000 El Khemis des Beni Chegdal, Morocco, 32.4441, -6.9551 Kragero, Norway, 58.8869, 9.3469 Trat, Thailand, 12.2417, 102.5125 Vetraz-Monthoux, France, 46.1742, 6.2581 Taineste, Morocco, 34.5573, -4.1360 Kalanak, Tajikistan, 39.0833, 70.5000 Prestonpans, United Kingdom, 55.9597, -2.9610 Targu Ocna, Romania, 46.2800, 26.6200 Kingston, Australia, -42.9769, 147.3083 Merzenich, Germany, 50.8333, 6.5333 Grafton, Australia, -29.6833, 152.9333 Scartho, United Kingdom, 53.5399, -0.0926 Machalpur, India, 24.1277, 76.3167 Sudogda, Russia, 55.9500, 40.8667 Waynesville, United States, 35.4854, -82.9996 Corral de Bustos, Argentina, -33.2833, -62.2000 Parempuyre, France, 44.9500, -0.6039 Dinard, France, 48.6300, -2.0600 Telsang, India, 16.7200, 75.0600 Baghin, Iran, 30.1839, 56.8075 Cunha Alta, Portugal, 40.6017, -7.6936 Urai, Brazil, -23.1978, -50.7958 Planalto, Brazil, -27.3289, -53.0589 Villeneuve-les-Maguelone, France, 43.5331, 3.8617 Bradford-on-Avon, United Kingdom, 51.3470, -2.2510 Lake Hiawatha, United States, 40.8816, -74.3826 Valley, United States, 32.8088, -85.1810 Luanco, Spain, 43.6100, -5.7900 Thorigny-sur-Marne, France, 48.8788, 2.7075 Barhi, India, 26.4629, 86.2771 San Vicente, Ecuador, -0.5910, -80.4094 Northfield, United Kingdom, 52.4080, -1.9630 Kotharpettai, India, 12.6780, 78.6243 Kiho, Japan, 33.7333, 136.0000 Prakhon Chai, Thailand, 14.6107, 103.0792 Cadillac, United States, 44.2493, -85.4164 Blackhawk, United States, 37.8159, -121.9071 Opglabbeek, Belgium, 51.0434, 5.5835 Podstrana, Croatia, 43.4800, 16.5800 London, United States, 39.8935, -83.4375 Burgstadt, Germany, 50.9167, 12.8167 Koduru, India, 13.8692, 77.7298 Koffiefontein, South Africa, -29.4081, 25.0022 Plombieres, Belgium, 50.7372, 5.9596 Pyetrykaw, Belarus, 52.1333, 28.5000 Betzdorf, Germany, 50.7856, 7.8728 Cislago, Italy, 45.6500, 8.9667 Ban Ueam, Thailand, 18.4246, 99.4434 Terra Alta, Brazil, -1.0378, -47.9078 Banta, India, 24.2323, 87.8749 Fayzobod, Tajikistan, 38.5500, 69.3167 Masindi Port, Uganda, 1.6983, 32.0778 Alhendin, Spain, 37.1167, -3.6500 Grevesmuhlen, Germany, 53.8667, 11.1667 Hachirud, Iran, 36.6856, 51.3450 Montecchio Emilia, Italy, 44.6986, 10.4486 Hithadhoo, Maldives, -0.6094, 73.0899 Madison Heights, United States, 37.4487, -79.1057 Scottdale, United States, 33.7950, -84.2634 Weilheim an der Teck, Germany, 48.6150, 9.5386 Nideggen, Germany, 50.7000, 6.4833 Anrochte, Germany, 51.5667, 8.3333 Sainkhera, India, 22.9589, 78.5782 Santiago Suchilquitongo, Mexico, 17.2500, -96.8833 Kamianka-Buzka, Ukraine, 50.1000, 24.3500 Fanja', Oman, 23.4579, 58.0986 Bobrynets, Ukraine, 48.0578, 32.1581 Madhopur, India, 25.3453, 85.3925 Velappadi, India, 12.6499, 79.3151 Eriyodu, India, 10.5172, 78.0627 Cuatro Cienegas de Carranza, Mexico, 26.9861, -102.0664 Lemmer, Netherlands, 52.8437, 5.7093 Kangaroo Flat, Australia, -36.7833, 144.2333 Uchoa, Brazil, -20.9528, -49.1750 Narkatpalli, India, 17.2030, 79.1950 Turmanin, Syria, 36.2288, 36.8156 Nieder-Olm, Germany, 49.9083, 8.2028 Jhaua, India, 25.7487, 84.9240 Newport, United States, 44.6242, -124.0513 Puerto Quijarro, Bolivia, -17.7796, -57.7700 Palestina, Ecuador, -1.6263, -79.9770 Tripurantakam, India, 16.0007, 79.4563 Suchanino, Poland, 54.3667, 18.6500 Winchendon, United States, 42.6667, -72.0487 Fair Oaks, United States, 33.9193, -84.5445 Leones, Argentina, -32.6589, -62.2967 Raunds, United Kingdom, 52.3450, -0.5370 Regedor Zavala, Mozambique, -24.6833, 34.6667 Lyons, United States, 41.8119, -87.8191 Santa Clara La Laguna, Guatemala, 14.7167, -91.3000 Ichnia, Ukraine, 50.8500, 32.4000 Jigani, India, 12.7861, 77.6385 Coronel Freitas, Brazil, -26.9089, -52.7028 Matsavaram, India, 16.6000, 79.7333 Dougba, Benin, 8.4497, 2.4737 Ickenham, United Kingdom, 51.5580, -0.4484 Gokinepalle, India, 16.9228, 79.7827 Alacati, Turkey, 38.2814, 26.3742 Constantina, Brazil, -27.7350, -52.9919 Molango, Mexico, 20.7844, -98.7175 East Setauket, United States, 40.9210, -73.0942 Morinville, Canada, 53.8022, -113.6497 Senhora dos Remedios, Brazil, -21.0278, -43.5828 Caem, Brazil, -11.1000, -40.4333 Paramoti, Brazil, -4.0969, -39.2389 Telkapalli, India, 16.4500, 78.4667 Nakasato, Japan, 40.9649, 140.4400 Flowood, United States, 32.3359, -90.0802 Gayaspur, India, 25.9217, 84.4399 Lake Hopatcong, United States, 40.9599, -74.6094 Cholchol, Chile, -38.6000, -72.8333 Versailles, United States, 38.0486, -84.7258 Faradabad, Bangladesh, 23.7445, 90.8772 Steinau an der Strasse, Germany, 50.3167, 9.4667 Jalihalli, India, 16.3650, 76.7811 Nova Dubnica, Slovakia, 48.9331, 18.1439 Valky, Ukraine, 49.8333, 35.6167 Capitolio, Brazil, -20.6150, -46.0500 Truseni, Moldova, 47.0689, 28.6797 Zdzieszowice, Poland, 50.4192, 18.1236 Akim Swedru, Ghana, 5.8938, -1.0164 Paraippatti, India, 10.3144, 77.8601 Sangrampur, India, 25.0711, 86.1871 Spa, Belgium, 50.4924, 5.8648 Belem de Maria, Brazil, -8.6139, -35.8089 Chantepie, France, 48.0892, -1.6153 Wabash, United States, 40.8034, -85.8301 Progress Village, United States, 27.8831, -82.3593 Nossen, Germany, 51.0500, 13.3000 Desuri, India, 25.2833, 73.5667 Nukan, Iran, 34.3608, 47.1725 Fasintsara, Madagascar, -20.7165, 47.6908 Spanish Fort, United States, 30.7254, -87.8597 East Bakersfield, United States, 35.3832, -118.9743 Villers-Cotterets, France, 49.2600, 3.0906 Ban Non Sombun, Thailand, 18.2983, 103.6528 Garden City, United States, 32.0867, -81.1773 Cristina, Brazil, -22.2119, -45.2639 Corfe Mullen, United Kingdom, 50.7701, -2.0175 Pilar, Philippines, 9.8639, 126.1008 Portage, United States, 43.5489, -89.4658 Merces, Brazil, -21.1939, -43.3408 Nalgora, India, 22.0346, 88.4743 Ordubad, Azerbaijan, 38.9047, 46.0231 Wildberg, Germany, 48.6239, 8.7472 Madhopur Hazari, India, 26.2623, 84.8995 Raghunathpur, India, 26.3448, 84.9211 Conceicao da Aparecida, Brazil, -21.0939, -46.2039 Sidi Brahim, Algeria, 35.2606, -0.5675 Phek, India, 25.5710, 94.3010 Douar Echbanat, Morocco, 34.2140, -5.3508 Mankur, India, 23.4353, 87.5527 Sarapui, Brazil, -23.6408, -47.8250 Portes-les-Valence, France, 44.8742, 4.8769 Brumath, France, 48.7328, 7.7092 Colwyn Bay, United Kingdom, 53.2900, -3.7000 Gharyala, India, 31.2294, 74.7352 Sarnen, Switzerland, 46.8969, 8.2469 Haikoucun, China, 28.3237, 120.0853 Puduppatti, India, 9.6171, 77.6375 Ain Beida, Morocco, 31.5850, -8.6080 Nova Olinda, Brazil, -7.6319, -48.4228 Atripalda, Italy, 40.9167, 14.8256 Lima, Paraguay, -23.8850, -56.4789 Brewster, United States, 41.7463, -70.0676 Sussen, Germany, 48.6797, 9.7575 Friedeburg, Germany, 53.4500, 7.8333 Kottapuram, India, 10.2958, 76.2431 Cori, Italy, 41.6500, 12.9167 Northampton, United States, 40.6866, -75.4904 Libante, Benin, 10.7936, 3.5828 Kalgi, India, 17.3500, 77.1500 Bommarbettu, India, 13.3390, 74.8784 Imi Mokorn, Morocco, 30.1675, -9.2322 Wittelsheim, France, 47.8058, 7.2383 Momanpet, India, 17.5175, 77.8981 Corleone, Italy, 37.8167, 13.3000 Namtsy, Russia, 62.7333, 129.6667 Ambalanur, India, 16.5900, 75.9600 Peravali, India, 15.2861, 77.4997 Ortakoy, Turkey, 37.2220, 40.7850 Itabirinha de Mantena, Brazil, -18.5658, -41.2328 Fakirtaki, India, 22.3815, 88.7901 Bassian, India, 30.6559, 75.5389 Taksimo, Russia, 56.3315, 114.8900 Galion, United States, 40.7385, -82.7792 Itri, Italy, 41.2833, 13.5333 Hirnyk, Ukraine, 48.0500, 37.3667 Dan, Benin, 7.3167, 2.0667 Jaguaribara, Brazil, -5.6578, -38.6200 Phulmalik, India, 25.4132, 86.4255 Bonate di Sopra, Italy, 45.6819, 9.5586 Sao Bento do Sapucai, Brazil, -22.6889, -45.7308 Khawaspur, India, 26.2331, 84.6388 Banga, Angola, -8.7333, 15.1667 Irupi, Brazil, -20.3450, -41.6408 Kemin, Kyrgyzstan, 42.7846, 75.6892 Millstone, United States, 40.2123, -74.4302 Villebon-sur-Yvette, France, 48.7002, 2.2277 Kelandis, Indonesia, -8.6595, 115.2270 Barah, Syria, 35.6860, 36.5424 Zhydachiv, Ukraine, 49.3850, 24.1444 Aesch, Switzerland, 47.4694, 7.5942 Blain, France, 47.4769, -1.7622 Siktiahi, India, 26.4812, 86.4023 Hisar, India, 26.5495, 85.9406 Rio do Fogo, Brazil, -5.2728, -35.3828 Neuenstadt am Kocher, Germany, 49.2333, 9.3333 Gourock, United Kingdom, 55.9538, -4.8173 Hirehadagalli, India, 14.9267, 75.8322 Rounia, India, 25.5179, 87.3999 Kiklah, Libya, 32.0683, 12.6944 Nijoni, Tajikistan, 39.9667, 68.9167 La Riche, France, 47.3900, 0.6614 Ravanusa, Italy, 37.2678, 13.9697 Harlau, Romania, 47.4278, 26.9114 Mallan, India, 30.4015, 74.7365 El Refugio, El Salvador, 13.9750, -89.7072 Inkerman, Ukraine, 44.6000, 33.6000 Fairmont, United States, 43.6441, -94.4621 Dario Meira, Brazil, -14.4358, -39.9078 Vellaturu, India, 16.1209, 79.6508 Coroneo, Mexico, 20.1333, -100.3333 Santa Maria de Itabira, Brazil, -19.4489, -43.1128 Maruteru, India, 16.6237, 81.7394 Delportshoop, South Africa, -28.4167, 24.3000 Masanasa, Spain, 39.4083, -0.3989 Srikrishnapur, India, 22.9717, 88.0351 Kiridh, Somalia, 8.9805, 46.1293 Shahrak-e Enqelab, Iran, 35.5156, 51.6867 Tipp City, United States, 39.9644, -84.1866 Maria Pinto, Chile, -33.5167, -71.1167 Brikama Ba, Gambia, The, 13.5333, -14.9333 Manikpur, India, 25.3129, 87.4388 Silea, Italy, 45.6547, 12.2967 Mokarrampur, India, 26.2176, 86.0433 Konkavaripalle, India, 13.7125, 78.4861 Canatlan, Mexico, 24.5200, -104.7800 Churapcha, Russia, 61.9928, 132.4317 Itape, Brazil, -14.8978, -39.4208 Cheruvannur, India, 11.8284, 75.7295 Salempur, India, 29.8750, 77.8580 Ganga Sagar, India, 21.6528, 88.0753 Hoek van Holland, Netherlands, 51.9763, 4.1323 Palmeiras, Brazil, -12.5289, -41.5589 Kirchlinteln, Germany, 52.9428, 9.3183 Limoux, France, 43.0578, 2.2192 Forde, Norway, 61.4519, 5.8569 Natonin, Philippines, 17.1089, 121.2797 Karabash, Russia, 55.4833, 60.2167 Sonwan, India, 25.6258, 86.2161 Atessa, Italy, 42.0667, 14.4500 Sao Luis do Paraitinga, Brazil, -23.2219, -45.3100 Tirkha, India, 26.1290, 81.0343 Farmersville, United States, 36.3050, -119.2083 Bowral, Australia, -34.4792, 150.4181 Erlenbach am Main, Germany, 49.8039, 9.1639 Sao Miguel das Matas, Brazil, -13.0478, -39.4558 New Richmond, United States, 45.1250, -92.5377 Geneseo, United States, 42.8038, -77.7783 Shasta Lake, United States, 40.6790, -122.3775 Bogen, Germany, 48.9167, 12.6833 Levanger, Norway, 63.7464, 11.2996 Dabuleni, Romania, 43.8011, 24.0919 Magas, Russia, 43.1667, 44.8167 Fort Oglethorpe, United States, 34.9318, -85.2460 Firou, Benin, 10.9192, 1.9386 Aydarken, Kyrgyzstan, 39.9333, 71.3333 Thanh Phu, Vietnam, 9.9539, 106.5069 Benalla, Australia, -36.5519, 145.9817 Ahogbeya, Benin, 7.0333, 1.9167 Matina, Brazil, -13.9089, -42.8489 Ben Nasseur, Algeria, 33.1108, 6.4411 Amurrio, Spain, 43.0528, -3.0014 Oppatavadi, India, 12.5690, 78.3992 Blumberg, Germany, 47.8392, 8.5342 Ban Dan Na Kham, Thailand, 17.7167, 100.1333 Melres, Portugal, 41.0686, -8.3983 Gagnef, Sweden, 60.5833, 15.0667 Santo Antonio do Jacinto, Brazil, -16.5339, -40.1758 Sao Domingos, Brazil, -10.7908, -37.5678 Qari Kola-ye Arateh, Iran, 36.4917, 52.9531 Osicala, El Salvador, 13.8000, -88.1500 Alvorada do Sul, Brazil, -22.7800, -51.2308 Kirchzarten, Germany, 47.9650, 7.9556 Ratnagiri, India, 13.8111, 77.1301 El Jicaral, Nicaragua, 12.7333, -86.3833 Ananas, Brazil, -6.3658, -48.0728 Pintadas, Brazil, -11.8128, -39.9089 Inhangapi, Brazil, -1.4300, -47.9169 Babhniyawan, India, 25.4943, 84.4815 Sirakoro, Mali, 13.4253, -9.1497 Meerhout, Belgium, 51.1320, 5.0773 Itaueira, Brazil, -7.6028, -43.0258 Vila Franca do Campo, Portugal, 37.7167, -25.4333 Loudoun Valley Estates, United States, 38.9770, -77.5053 Wallaceburg, Canada, 42.5984, -82.3916 Arvorezinha, Brazil, -28.8719, -52.1750 Riano, Italy, 42.0911, 12.5228 Arimalam, India, 10.2550, 78.8840 Hochst im Odenwald, Germany, 49.8000, 9.0000 Villacarrillo, Spain, 38.1000, -3.0833 Stranraer, United Kingdom, 54.9020, -5.0270 Southampton, United States, 39.9137, -74.7171 Ranchos, Argentina, -35.5333, -58.2833 Hameenkyro, Finland, 61.6333, 23.2000 Harsola, India, 22.5694, 75.8165 Dombachcheri, India, 9.9604, 77.3909 Hariana, India, 31.6351, 75.8389 Kamepalle, India, 16.5191, 79.8350 Caracol, Brazil, -9.2789, -43.3300 Karuzi, Burundi, -3.1000, 30.1667 Yadavolu, India, 17.0619, 81.4729 Azamnagar, India, 25.5456, 87.8294 Chong-Aryk, Kyrgyzstan, 42.8172, 74.5809 Teocuitatlan de Corona, Mexico, 20.0167, -103.1833 Etropole, Bulgaria, 42.8333, 24.0000 Arkadelphia, United States, 34.1253, -93.0729 Sao Romao, Brazil, -16.3689, -45.0689 Mildenhall, United Kingdom, 52.3446, 0.5089 Manhattan, United States, 41.4274, -87.9805 Wood River, United States, 38.8631, -90.0774 Blackfalds, Canada, 52.3833, -113.8000 Virginopolis, Brazil, -18.8228, -42.7039 Umbita, Colombia, 5.2167, -73.4667 Augustdorf, Germany, 51.9000, 8.7333 Agua Blanca Iturbide, Mexico, 20.3500, -98.3500 Paris, United States, 36.2933, -88.3065 Francisville, United States, 39.1068, -84.7277 General Salgado, Brazil, -20.6478, -50.3608 Ramchandrapur, India, 22.8910, 88.4730 Rotonda, United States, 26.8844, -82.2791 Solim, India, 15.6145, 73.7704 Qiushanxiang, China, 34.3558, 104.8973 Auhar Sheikh, India, 26.7216, 84.5993 Haspra, Ukraine, 44.4361, 34.1106 Chester, Canada, 44.6500, -64.3000 Riolandia, Brazil, -19.9900, -49.6808 Rodelas, Brazil, -8.8508, -38.7558 Astorga, Spain, 42.4589, -6.0633 Buriti do Tocantins, Brazil, -5.3158, -48.2289 Olbernhau, Germany, 50.6667, 13.3333 Khiram, India, 33.7320, 75.1600 Queens, Canada, 44.0333, -64.7167 Grossburgwedel, Germany, 52.4933, 9.8586 Comstock Park, United States, 43.0438, -85.6778 Moldava nad Bodvou, Slovakia, 48.6156, 20.9992 Maurilandia, Brazil, -17.9708, -50.3389 Jordania, Brazil, -15.9000, -40.1778 Mwaya, Tanzania, -9.4917, 34.0333 Lakkireddipalle, India, 14.1667, 78.7000 Kami-kawabe, Japan, 35.4866, 137.0707 Qanliko`l, Uzbekistan, 42.8333, 59.0000 Valley Center, United States, 33.2330, -117.0158 Trajano de Morais, Brazil, -22.0628, -42.0658 Caparrapi, Colombia, 5.3442, -74.4917 Bel Imour, Algeria, 35.9806, 4.8797 Santa Ines, Brazil, -13.2938, -39.8655 Kangning, China, 38.0176, 102.3520 Goldbach, Germany, 49.9889, 9.1864 Divonne-les-Bains, France, 46.3567, 6.1428 Orkelljunga, Sweden, 56.2833, 13.2833 Birsfelden, Switzerland, 47.5531, 7.6231 Rancho Arriba, Dominican Republic, 18.7147, -70.4618 Kalamula, India, 11.1417, 76.3417 Rubim, Brazil, -16.3750, -40.5378 Appenweier, Germany, 48.5397, 7.9800 Nana, India, 24.9160, 73.1330 Shahar Telpa, India, 25.1330, 84.6533 Boldesti-Scaeni, Romania, 45.0300, 26.0300 Bad Lauterberg, Germany, 51.6317, 10.4706 Apt, France, 43.8769, 5.3969 Locate di Triulzi, Italy, 45.3500, 9.2167 Bonfinopolis, Brazil, -16.6178, -48.9628 Bordj Zemoura, Algeria, 36.2667, 4.8500 Armanaz, Syria, 36.0836, 36.5031 Castelli Calepio, Italy, 45.6333, 9.9000 Lyuboml', Ukraine, 51.2236, 24.0328 Ouroeste, Brazil, -20.0008, -50.3719 Ratauli, India, 26.1861, 86.7104 Castelnovo ne' Monti, Italy, 44.4333, 10.4000 Demmin, Germany, 53.9050, 13.0439 Balaungi, India, 30.7306, 76.6937 Zawal, India, 24.9833, 72.7333 Dalgan, Iran, 27.4825, 59.4464 Vytegra, Russia, 61.0000, 36.4500 Serido, Brazil, -6.9339, -36.4019 Auterive, France, 43.3514, 1.4753 Vilkaviskis, Lithuania, 54.6667, 23.0333 Jordbro, Sweden, 59.1497, 18.1167 Berwick, United States, 41.0555, -76.2492 Guimaraes, Brazil, -2.1328, -44.6008 Santana, Sao Tome and Principe, 0.2583, 6.7417 Ma`raba, Syria, 33.5767, 36.2976 Ekinozu, Turkey, 38.0617, 37.1928 Port Townsend, United States, 48.1220, -122.7877 Lutry, Switzerland, 46.5000, 6.6833 Penarroya-Pueblonuevo, Spain, 38.3000, -5.2667 Broadstone, United Kingdom, 50.7605, -1.9950 Vylgort, Russia, 61.6275, 50.7672 Billdal, Sweden, 57.5667, 11.9333 Srisailain, India, 16.0833, 78.8667 Simarwara Durgapur, India, 25.8520, 85.4944 Miedzychod, Poland, 52.6000, 15.8833 Clay, United States, 33.6951, -86.6090 Arraias, Brazil, -12.9308, -46.9378 Lishuping, China, 33.2019, 104.8734 'Ain Tellout, Algeria, 34.9167, -0.9667 Calasparra, Spain, 38.2306, -1.7000 Mondeville, France, 49.1747, -0.3197 Spitalfields, United Kingdom, 51.5166, -0.0750 Rayen, Iran, 29.5981, 57.4383 Flowery Branch, United States, 34.1712, -83.9142 Cheam, United Kingdom, 51.3600, -0.2100 Hecelchakan, Mexico, 20.1667, -90.1333 Watervliet, United States, 42.7243, -73.7068 Bishopstoke, United Kingdom, 50.9679, -1.3278 Jankampet, India, 18.7067, 78.0233 Arlov, Sweden, 55.6333, 13.0667 Kandrawan, India, 25.8882, 81.2618 Douar Jwalla, Morocco, 31.8900, -7.4400 San Jose de Feliciano, Argentina, -30.3833, -58.7500 Sao Geraldo, Brazil, -20.9228, -42.8339 Sao Carlos, Brazil, -27.0778, -53.0039 Beilngries, Germany, 49.0333, 11.4667 Sant'Agata de' Goti, Italy, 41.0893, 14.4974 Sidi Bou Ali, Tunisia, 35.9561, 10.4722 Bandrele, Mayotte, -12.9092, 45.1944 Sidi Embarek, Algeria, 36.1039, 4.9119 Penn, United States, 40.1864, -76.3726 East Franklin, United States, 40.4933, -74.4710 Ganvie, Benin, 6.4667, 2.4167 Venecia, Colombia, 5.9167, -75.7500 Shirako, Japan, 35.4500, 140.3667 Candelaria, El Salvador, 13.7500, -88.9500 Exeter, United States, 36.2941, -119.1459 Kittery, United States, 43.0998, -70.7126 Itapitanga, Brazil, -14.4228, -39.5650 Oppeano, Italy, 45.3000, 11.1833 Zelenokumsk, Russia, 44.4167, 43.9167 Liberty, United States, 41.8132, -74.7775 San Maurizio Canavese, Italy, 45.2171, 7.6305 Ban Wisit, Thailand, 18.3480, 103.6308 Selkirk, Canada, 50.1436, -96.8839 Saint-Felicien, Canada, 48.6500, -72.4500 Mallapuram, India, 9.8280, 77.6730 Sidi Rahhal, Morocco, 31.6667, -7.4833 Woodlyn, United States, 39.8774, -75.3445 Pfastatt, France, 47.7697, 7.3025 Dora, India, 22.1858, 88.5142 Nanbu, Japan, 35.3333, 133.3333 Potiragua, Brazil, -15.5950, -39.8769 Weil im Schonbuch, Germany, 48.6214, 9.0611 Sotkamo, Finland, 64.1333, 28.3833 Mehdauli, India, 25.6561, 86.0257 Meghaul, India, 25.6561, 86.0257 Peddapuram, India, 18.0289, 79.7269 Loudonville, United States, 42.7068, -73.7665 Tello, Colombia, 3.0667, -75.1333 Aubiere, France, 45.7517, 3.1117 Jeumont, France, 50.2953, 4.1019 Bela, India, 26.4989, 86.3242 Tekkekara, India, 9.7000, 76.7833 Kilminnal, India, 12.9447, 79.2514 Gaunivaripalle, India, 13.9756, 77.8768 Gafour, Tunisia, 36.3400, 9.3200 Alpine, United States, 40.4629, -111.7724 Guadalupe, Brazil, -6.7869, -43.5689 Kauniainen, Finland, 60.2167, 24.7333 Ullur, India, 10.9706, 79.4063 Tabubil, Papua New Guinea, -5.2750, 141.2264 Yazoo City, United States, 32.8619, -90.4075 Emsworth, United Kingdom, 50.8490, -0.9380 Bhikkiwind Uttar, India, 31.3453, 74.6914 Mel Seval, India, 8.6722, 77.6147 Estreito de Camara de Lobos, Portugal, 32.6667, -16.9833 Lenguazaque, Colombia, 5.3069, -73.7061 Gerzat, France, 45.8267, 3.1456 Somireddipalle, India, 14.8365, 78.9062 Mali, India, 25.1269, 84.7084 Highland, United States, 38.7602, -89.6812 Meridianville, United States, 34.8729, -86.5722 Villa Elisa, Argentina, -32.1667, -58.4000 Saudade, Brazil, -26.9239, -53.0028 Appleton, United Kingdom, 53.3508, -2.5441 Jaltocan, Mexico, 21.1333, -98.5383 Indalvai, India, 18.5403, 78.2248 Chivhu, Zimbabwe, -19.0000, 30.9000 Tenente Ananias Gomes, Brazil, -6.4650, -38.1800 Axixa do Tocantins, Brazil, -5.6169, -47.7689 Nazaria, Brazil, -5.3608, -42.8083 Lahstedt, Germany, 52.2500, 10.2167 Morsbach, Germany, 50.8667, 7.7167 Rio Acima, Brazil, -20.0878, -43.7889 Nkurenkuru, Namibia, -17.6167, 18.6000 Oliveira de Frades, Portugal, 40.7314, -8.1767 Carroll, United States, 42.0699, -94.8646 Oignies, France, 50.4700, 2.9944 Tettuppatti, India, 10.3979, 77.8225 Ericeira, Portugal, 38.9628, -9.4153 Fronteiras, Brazil, -7.0878, -40.6158 Pola de Lena, Spain, 43.1583, -5.8292 Jaipur, India, 23.4313, 86.1493 Kut Chap, Thailand, 17.4257, 102.5669 Bolekhiv, Ukraine, 49.0669, 23.8514 Hopetown, South Africa, -29.6258, 24.0856 Westonaria, South Africa, -26.3178, 27.6506 Elkhorn, United States, 42.6713, -88.5377 Konigsbach-Stein, Germany, 48.9664, 8.6089 Chavinda, Mexico, 20.0167, -102.4500 Gohuma Bairia, India, 26.3938, 86.3976 Liminka, Finland, 64.8083, 25.4167 Sint-Lievens-Houtem, Belgium, 50.9167, 3.8667 Maxaranguape, Brazil, -5.5158, -35.2619 Steinen, Germany, 47.6453, 7.7403 Popovaca, Croatia, 45.5697, 16.6250 Shahmirpet, India, 17.5947, 78.5749 Tarar, India, 25.1821, 87.1671 Barai, India, 26.3717, 86.0134 Tawnza, Morocco, 32.0944, -6.6025 Phon Charoen, Thailand, 18.0258, 103.7094 Vernal, United States, 40.4517, -109.5378 Franklin, United States, 36.7177, -86.5595 Querfurt, Germany, 51.3833, 11.6000 Buxerolles, France, 46.5983, 0.3500 Bonito de Santa Fe, Brazil, -7.3128, -38.5150 Cukurca, Turkey, 37.2469, 43.6117 Lonquimay, Chile, -38.4333, -71.2333 Zumaia, Spain, 43.2972, -2.2569 Bougaribaya, Mali, 12.8167, -9.8500 Kulhudhuffushi, Maldives, 6.6225, 73.0703 Fenggeling, China, 34.5312, 106.4437 Puerto Santander, Colombia, 8.3636, -72.4075 Caudete, Spain, 38.7044, -0.9881 Fosses, France, 49.0989, 2.5075 Alberobello, Italy, 40.7841, 17.2375 Jaqueira, Brazil, -8.7269, -35.7928 Launceston, United Kingdom, 50.6370, -4.3600 Nayanagar, India, 25.7465, 86.1027 Murowana Goslina, Poland, 52.5667, 17.0167 Rovinari, Romania, 44.9125, 23.1622 Sao Tiago, Brazil, -20.9128, -44.5089 Baran, Belarus, 54.4833, 30.3333 Badru Khan, India, 30.2523, 75.7917 Induno Olona, Italy, 45.8500, 8.8333 Bueng Khong Long, Thailand, 17.9667, 104.0450 Santa Teresinha (2), Brazil, -7.3778, -37.4800 Vairampatti, India, 10.5515, 78.3022 San Marzano sul Sarno, Italy, 40.7697, 14.5947 Galimuyod, Philippines, 17.1800, 120.4700 Catarina, Brazil, -6.1308, -39.8778 Alcaudete, Spain, 37.5833, -4.1000 Raymondville, United States, 26.4759, -97.7769 Palmacia, Brazil, -4.1500, -38.8458 Lugovoy, Kazakhstan, 42.9472, 72.7644 Waimea, United States, 20.0124, -155.6381 Angelim, Brazil, -8.8833, -36.2833 Vila Muriqui, Brazil, -22.9228, -43.9456 Maheshram, India, 25.2874, 87.4124 Santa Isabel Ishuatan, El Salvador, 13.6167, -89.5833 Jean-Mermoz, Algeria, 35.5606, -0.0844 Khair Khan, India, 26.2727, 87.3037 Oneida, United States, 43.0769, -75.6622 Vellur, India, 12.1667, 75.3500 Sucupira do Norte, Brazil, -6.4769, -44.1919 Goldenstedt, Germany, 52.7833, 8.4167 Kiramangalam, India, 10.2859, 79.0996 Apparaopeta, India, 16.8987, 81.5684 Atoka, United States, 35.4239, -89.7861 Kennett, United States, 36.2403, -90.0481 Fuveau, France, 43.4528, 5.5619 Borgampad, India, 17.6500, 80.8667 Puvalur, India, 10.9003, 78.8308 Marawi, Sudan, 18.4833, 31.8167 Agudos do Sul, Brazil, -25.9928, -49.3350 Bernex, Switzerland, 46.1667, 6.0667 Olifantshoek, South Africa, -27.9333, 22.7333 Santa Maria Madalena, Brazil, -21.9550, -42.0078 Partibanur, India, 9.5855, 78.4545 Glogow Malopolski, Poland, 50.1667, 21.9667 Igarape Grande, Brazil, -4.5850, -44.8528 Minatitlan, Mexico, 19.3833, -104.0500 Gislaved, Sweden, 57.3000, 13.5333 North Bend, United States, 43.4075, -124.2364 Pierrelaye, France, 49.0233, 2.1508 Raibhir, India, 25.9978, 86.8781 Vigasio, Italy, 45.3167, 10.9333 Concordia Sagittaria, Italy, 45.7217, 12.8378 Samux, Azerbaijan, 40.7642, 46.4083 Tangermunde, Germany, 52.5408, 11.9689 Lieksa, Finland, 63.3167, 30.0167 Jitpur, India, 26.8149, 84.9578 Muttam, India, 9.8378, 76.7126 Isola Vicentina, Italy, 45.6333, 11.4500 Akbez, Turkey, 36.8500, 36.5167 Roberval, Canada, 48.5200, -72.2300 Villanueva de Arosa, Spain, 42.5628, -8.8278 Avranches, France, 48.6850, -1.3556 Alleroy, Russia, 43.0870, 46.3020 Potunuru, India, 16.7442, 81.2206 Monte San Juan, El Salvador, 13.7667, -88.9500 Duque Bacelar, Brazil, -4.1558, -42.9439 Luathaha, India, 26.6316, 84.9079 Ahiro, India, 24.9192, 87.1054 Marlton, United States, 38.7620, -76.7857 Benyahia Abderrahmane, Algeria, 36.2333, 6.0167 Koila Dewa, India, 26.4079, 84.1962 Robstown, United States, 27.7940, -97.6692 Sao Miguel de Touros, Brazil, -5.1250, -35.6389 Gengqing, China, 31.8081, 98.5786 Fort Madison, United States, 40.6207, -91.3509 Neo Karlovasi, Greece, 37.7833, 26.7000 Belma, India, 12.9772, 74.9969 Blackwells Mills, United States, 40.4773, -74.5976 Schalksmuhle, Germany, 51.2167, 7.5167 Tha Muang, Thailand, 13.9612, 99.6412 Esperance, Australia, -33.8611, 121.8919 Aizenay, France, 46.7400, -1.6083 Vadakku Ariyanayakipuram, India, 8.7208, 77.5450 Heath, United States, 32.8439, -96.4674 Dangriga, Belize, 16.9667, -88.2167 Algarrobo, Chile, -33.3911, -71.6928 Alella, Spain, 41.4950, 2.2960 Kowary, Poland, 50.7917, 15.8333 Columbia, United States, 40.0347, -76.4944 Safford, United States, 32.8335, -109.6964 Independent Hill, United States, 38.6404, -77.4089 Campo Redondo, Brazil, -6.2428, -36.1828 Santa Maria, Colombia, 2.9500, -75.6500 Multi, India, 22.2847, 88.4053 Nasaud, Romania, 47.2833, 24.4067 Sellersburg, United States, 38.4028, -85.7706 Tanggemu Nongchang, China, 36.0781, 100.0911 Nagasamudram, India, 15.0556, 77.5004 Divisopolis, Brazil, -15.7258, -41.0000 Lystrup, Denmark, 56.2375, 10.2378 Rainbow City, United States, 33.9336, -86.0922 Pantano Grande, Brazil, -30.1908, -52.3739 Duga Resa, Croatia, 45.4472, 15.4958 Kandulapuram, India, 15.5976, 79.1365 Minamiaso, Japan, 32.8167, 131.0333 Moimenta da Beira, Portugal, 40.9819, -7.6158 Charala, Colombia, 6.2500, -73.0833 Ramacca, Italy, 37.3833, 14.7000 Cedartown, United States, 34.0223, -85.2479 Milford, United States, 40.4291, -75.4153 Cedral, Brazil, -2.0000, -44.5358 Ostercappeln, Germany, 52.3500, 8.2333 Tlalixtac de Cabrera, Mexico, 17.0667, -96.6500 New Hyde Park, United States, 40.7323, -73.6858 Varre-Sai, Brazil, -20.9308, -41.8689 Centralina, Brazil, -18.5839, -49.1989 Lemington, United Kingdom, 54.9720, -1.7230 Rideau Lakes, Canada, 44.6667, -76.2167 Vejen, Denmark, 55.4812, 9.1379 Bonthe, Sierra Leone, 7.5264, -12.5050 Medina, Colombia, 4.5092, -73.3494 Porto Esperidiao, Brazil, -15.8528, -58.4600 Dettingen an der Erms, Germany, 48.5300, 9.3472 Alguazas, Spain, 38.0514, -1.2414 Fouesnant, France, 47.8942, -4.0108 Mosquera, Colombia, 2.4903, -78.4953 Miani, India, 31.7092, 75.5661 Ouangani, Mayotte, -12.8487, 45.1446 Hillcrest, United States, 35.3790, -118.9578 Fort Salonga, United States, 40.9068, -73.2996 Kastav, Croatia, 45.3726, 14.3490 Ramannapeta, India, 17.2833, 79.0859 Pintuyan, Philippines, 9.9500, 125.2500 Difficult Run, United States, 38.9016, -77.3471 Oudewater, Netherlands, 52.0250, 4.8681 Canta, Turkey, 41.0806, 28.0819 Birkenfeld, Germany, 48.8697, 8.6361 Munchberg, Germany, 50.2000, 11.7667 Lillers, France, 50.5644, 2.4831 Ellon, United Kingdom, 57.3660, -2.0860 Shakhunya, Russia, 57.6667, 46.6167 Nazyvayevsk, Russia, 55.5667, 71.2667 Navabad, Tajikistan, 38.5278, 68.6750 Chavkandak, Tajikistan, 39.9000, 68.9333 Kazo, Uganda, -0.0528, 30.7569 Rolesville, United States, 35.9223, -78.4656 Sechelt, Canada, 49.4742, -123.7542 Tetela del Volcan, Mexico, 18.9633, -99.2533 Cortes, Brazil, -8.4700, -35.5436 Foz, Spain, 43.5694, -7.2583 Nyazepetrovsk, Russia, 56.0500, 59.6000 Garhi, India, 24.7904, 86.0768 Bosanska Krupa, Bosnia and Herzegovina, 44.8833, 16.1500 Florania, Brazil, -6.1269, -36.8178 Biot, France, 43.6294, 7.0961 Irani, Brazil, -27.0250, -51.9019 Gemerek, Turkey, 39.1819, 36.0681 New Silksworth, United Kingdom, 54.8710, -1.3957 Kottapalem, India, 16.7000, 80.4700 Baragaon, India, 24.5682, 79.0185 Tokunoshima, Japan, 27.7267, 129.0186 Douar Mzoura, Morocco, 34.3167, -5.9333 Zakamensk, Russia, 50.3833, 103.3000 Hermantown, United States, 46.8057, -92.2407 Arataca, Brazil, -15.2628, -39.4139 Eleskirt, Turkey, 39.7981, 42.6744 Al Jazirah al Hamra', United Arab Emirates, 25.7089, 55.7972 Pescaria Brava, Brazil, -28.3833, -48.8833 Phra Pradaeng, Thailand, 13.6592, 100.5331 Narasingam, India, 9.9658, 78.1833 Barahi, India, 25.9725, 86.7452 Rehburg-Loccum, Germany, 52.4508, 9.2078 Carenage, Trinidad and Tobago, 10.6833, -61.6000 La Grange, United States, 38.3987, -85.3750 Sao Jose do Jacuipe, Brazil, -11.5048, -40.0225 Sao Jose do Jacuipe, Brazil, -11.4119, -39.8669 Mirante, Brazil, -14.2419, -40.7728 Souk et Tnine Jorf el Mellah, Morocco, 34.4833, -5.5169 San Blas, Mexico, 21.5397, -105.2856 Gudofredo Viana, Brazil, -1.4028, -45.7800 Carmo do Rio Verde, Brazil, -15.3536, -49.7075 Potosi, Colombia, 0.8081, -77.5728 Venkatapuram, India, 18.2232, 79.9516 Celano, Italy, 42.0843, 13.5478 Randazzo, Italy, 37.8774, 14.9501 Balangkayan, Philippines, 11.4728, 125.5108 Zaleze, Poland, 50.2672, 18.9892 Hazle, United States, 40.9558, -75.9998 Biandanshan, China, 26.0409, 105.6351 Poirino, Italy, 44.9208, 7.8469 Pechea, Romania, 45.6333, 27.8000 Chaungtha, Burma, 16.9667, 94.4500 Nanfang, China, 23.3568, 115.5167 Rudesheim am Rhein, Germany, 49.9833, 7.9306 Carice, Haiti, 19.3779, -71.8303 Csomor, Hungary, 47.5467, 19.2244 Amgachia, India, 22.4156, 88.3051 Jimbolia, Romania, 45.7931, 20.7375 Birao, Central African Republic, 10.2940, 22.7820 Spelle, Germany, 52.3667, 7.4667 Angwali, India, 23.7317, 85.9858 Aliganj, India, 24.9365, 85.9250 Alpena, United States, 45.0740, -83.4402 Pizarra, Spain, 36.7667, -4.7000 Kormend, Hungary, 47.0110, 16.6060 Kothi, India, 24.7526, 80.7775 Darwa, India, 25.6690, 85.6461 Toundout, Morocco, 31.2667, -6.5833 Baker City, United States, 44.7749, -117.8320 Snohomish, United States, 47.9276, -122.0969 Vera Cruz, Brazil, -22.2200, -49.8189 Shirbadgi, India, 15.9418, 75.7768 Halgur, India, 12.4249, 77.2270 Akil, Mexico, 20.2656, -89.3478 Kaynasli, Turkey, 40.7667, 31.3167 Olovo, Bosnia and Herzegovina, 44.1277, 18.5807 Fort William, United Kingdom, 56.8198, -5.1052 Bacioi, Moldova, 46.9122, 28.8839 Chikni, India, 26.0664, 87.4406 Remada, Tunisia, 32.3061, 10.3822 Sax, Spain, 38.5394, -0.8161 Cross Lanes, United States, 38.4351, -81.7707 Akabli, Algeria, 26.7086, 1.3689 Surla, India, 15.5333, 73.8333 Glenwood Springs, United States, 39.5455, -107.3347 Jhakhra, India, 25.7528, 85.7474 Panchi, India, 25.1123, 85.6321 Jandiala, India, 31.2157, 75.6218 Kulundu, Kyrgyzstan, 40.1069, 69.6431 Ajjipuram, India, 12.0457, 77.3532 Pipra Naurangia, India, 26.8591, 84.4328 Bellamkonda, India, 16.4922, 80.0089 Kranuan, Thailand, 16.7067, 103.0788 Svidnik, Slovakia, 49.3056, 21.5678 Ban Bong Tai, Thailand, 17.4080, 103.2932 Alderwood Manor, United States, 47.8146, -122.2672 Molalla, United States, 45.1502, -122.5845 Bela Vista de Minas, Brazil, -19.8300, -43.0908 Canteras, Spain, 37.6122, -1.0438 Seysses, France, 43.4989, 1.3133 Bomporto, Italy, 44.7333, 11.0333 Libertad, Uruguay, -34.6333, -56.6192 Evander, South Africa, -26.4719, 29.1100 Fanzhao, China, 26.6615, 108.3834 Labhgaon, India, 25.5062, 86.3899 Katalpur, India, 26.2255, 84.7608 Korolevo, Ukraine, 48.1500, 23.1333 Roddam, India, 14.1000, 77.4300 Ban Bang Toei, Thailand, 14.0737, 100.5079 Balikumbat, Cameroon, 5.8928, 10.3597 Crespellano, Italy, 44.5114, 11.1314 Biskupiec, Poland, 53.8500, 20.9500 Bargersville, United States, 39.5412, -86.2004 Itapiranga, Brazil, -2.7489, -58.0219 San Pablo, Chile, -40.4000, -73.0167 Astoria, United States, 46.1856, -123.8053 Zelfana, Algeria, 32.3969, 4.2261 Jadupatti, India, 26.1186, 86.3114 Mexicaltzingo, Mexico, 19.2092, -99.5858 Courrieres, France, 50.4586, 2.9481 Bordighera, Italy, 43.7789, 7.6721 Niebull, Germany, 54.7881, 8.8296 Castleton, United Kingdom, 53.5907, -2.1737 Bois-des-Filion, Canada, 45.6667, -73.7500 Rogerstone, United Kingdom, 51.5906, -3.0537 Piedimonte d'Alife, Italy, 41.3669, 14.3967 Toca, Colombia, 5.5667, -73.2000 Bobenheim-Roxheim, Germany, 49.5833, 8.3500 Ambalavao, Madagascar, -19.0980, 47.5284 Coweta, United States, 35.9683, -95.6545 Pabegou, Benin, 9.8333, 1.5492 Vochaiko, Greece, 37.9333, 22.8000 Togamalai, India, 10.7251, 78.4108 Sobral de Monte Agraco, Portugal, 39.0167, -9.1500 Mold, United Kingdom, 53.1660, -3.1330 Morlenbach, Germany, 49.5992, 8.7347 Vutukuru, India, 14.5778, 80.1423 East Rutherford, United States, 40.8179, -74.0854 Sidi Abdelaziz, Algeria, 36.8500, 6.0500 Akhaltsikhe, Georgia, 41.6389, 42.9861 Msila, Morocco, 35.2000, -5.5667 Batan, Argentina, -38.0078, -57.7097 Narot Mehra, India, 32.2673, 75.5647 Shioya, Japan, 36.7776, 139.8506 Higashikagura, Japan, 43.7000, 142.4500 Bleicherode, Germany, 51.4167, 10.5667 Valaparla, India, 15.9167, 80.0500 Ain Zohra, Morocco, 34.1000, -6.3500 Warrenton, United States, 38.7176, -77.7976 Kilkunda, India, 11.2569, 76.6697 Roslyn, United States, 40.1311, -75.1374 South Huntington, United States, 40.8225, -73.3921 Littleton, United States, 42.5350, -71.4891 Maur, Switzerland, 47.3417, 8.6703 Kaza, India, 16.3906, 80.5425 Tiruchchuli, India, 9.5348, 78.2008 Kanteru, India, 16.3906, 80.5425 Telnal, India, 23.0100, 73.0300 Arcola, Italy, 44.1146, 9.9059 Choele Choel, Argentina, -39.2667, -65.6833 Pilar, Philippines, 17.4200, 120.6000 Alkhan-Kala, Russia, 43.2586, 45.5392 El Espinar, Spain, 40.7186, -4.2478 Busca, Italy, 44.5167, 7.4667 Msoga, Tanzania, -6.5667, 38.3000 Lenggries, Germany, 47.6803, 11.5739 Cabries, France, 43.4419, 5.3803 Hackettstown, United States, 40.8540, -74.8257 Ouled Rabah, Algeria, 36.2833, 3.1333 Gakuch, Pakistan, 36.1736, 73.7667 Verkhivtseve, Ukraine, 48.4853, 34.2539 San Diego Country Estates, United States, 33.0094, -116.7874 Whitchurch, United Kingdom, 52.9690, -2.6820 Periyanegamam, India, 10.7432, 77.1030 Mungod, India, 17.0667, 79.0667 Clinton, United States, 36.0981, -84.1283 South Normanton, United Kingdom, 53.1070, -1.3430 Bibbiano, Italy, 44.6629, 10.4739 Ban Pa Hung, Thailand, 19.5672, 99.7013 Prelouc, Czechia, 50.0400, 15.5603 Villasagar, India, 18.4736, 78.9645 San Felice Circeo, Italy, 41.2353, 13.0956 Trumbull Center, United States, 41.2415, -73.1836 Montignies-le-Tilleul, Belgium, 50.3794, 4.3790 Knezha, Bulgaria, 43.4931, 24.0806 Okondja, Gabon, -0.6829, 13.7833 Rignano Flaminio, Italy, 42.2000, 12.4833 Elattur, India, 11.3866, 77.3080 Iizuna, Japan, 36.7548, 138.2355 Filippoi, Greece, 41.0167, 24.2833 Dhanur Kalyanwadi, India, 17.7700, 77.1400 Rathdrum, United States, 47.7948, -116.8944 Siswar, India, 26.4292, 86.4586 Haldipur, India, 14.3333, 74.4333 Aigle, Switzerland, 46.3167, 6.9667 San Vicente de Castellet, Spain, 41.6678, 1.8633 Rompicherla, India, 16.2100, 79.9087 Solindabad, India, 25.8463, 86.5907 Raparla, India, 16.3020, 80.9674 Hire Megalageri, India, 14.5440, 75.9776 Urlati, Romania, 44.9911, 26.2306 Qovlar, Azerbaijan, 40.9419, 45.7358 Potavaram, India, 17.0194, 81.4128 Serebryansk, Kazakhstan, 49.6819, 83.2847 Plaridel, Philippines, 13.9511, 122.0203 Scherpenzeel, Netherlands, 52.0792, 5.4894 Sarkikaraagac, Turkey, 38.0803, 31.3658 Genova, Colombia, 1.6442, -77.0194 Deulgaon Mahi, India, 20.0833, 76.1833 Serra Caiada, Brazil, -6.1058, -35.7128 Neuville-en-Ferrain, France, 50.7472, 3.1589 Bhagirathpur, India, 24.0884, 88.4947 Bilga, India, 31.0500, 75.6500 Kondalahalli, India, 14.7200, 76.7600 Auchel, France, 50.5086, 2.4744 Borim, India, 15.3604, 74.0004 Mawai, India, 24.8043, 78.9388 Doorn, Netherlands, 52.0333, 5.3500 Chernigovka, Russia, 44.3406, 132.5689 Sorsk, Russia, 54.0333, 90.2500 Mazamet, France, 43.4928, 2.3742 Manglur, India, 15.5177, 76.1476 Monaragala, Sri Lanka, 6.8714, 81.3487 San Elizario, United States, 31.5793, -106.2632 Sirigeri, India, 15.6300, 76.9000 Cajapio, Brazil, -2.9667, -44.8000 Parthenay, France, 46.6462, -0.2478 Pocklington, United Kingdom, 53.9309, -0.7781 Belagola, India, 12.3914, 76.6097 Sulagiri, India, 12.6645, 78.0134 Ankily, Madagascar, -22.3837, 46.0956 Eidsberg, Norway, 59.5000, 11.3833 Cody, United States, 44.5213, -109.0548 Novi Grad, Bosnia and Herzegovina, 45.0481, 16.3769 Oggaz, Algeria, 35.5667, -0.2667 Meymand, Iran, 28.8683, 52.7525 Altotting, Germany, 48.2267, 12.6783 Kabatas, Turkey, 40.7500, 37.4500 Binefar, Spain, 41.8500, 0.3000 Granada, Colombia, 6.1470, -75.1880 Rettanai, India, 12.1953, 79.5526 Hipparga, India, 17.4568, 76.3739 Marshall, United States, 40.6453, -80.1100 Visbek, Germany, 52.8366, 8.3098 Nathpur, India, 26.3261, 87.0916 Sedico, Italy, 46.1167, 12.1000 Aroali, India, 24.0430, 87.9443 Rasak, Iran, 26.2356, 61.4014 Ben Qarrich, Morocco, 35.5114, -5.4264 Torre Santa Susanna, Italy, 40.4667, 17.7333 Vaddadi, India, 17.8474, 82.8729 Kalakeri, India, 16.6667, 76.3000 Anandnagar, India, 27.1000, 83.2833 Ardal, Iran, 31.9986, 50.6622 Struer, Denmark, 56.4862, 8.6044 Douchy-les-Mines, France, 50.3022, 3.3939 Corcuera, Philippines, 12.8000, 122.0500 Komorowice, Poland, 49.8544, 19.0406 Gornyak, Russia, 50.9833, 81.4667 Masdi, India, 25.2441, 86.7233 Kondakindi Agraharam, India, 14.6790, 77.7401 Adigappadi, India, 12.1459, 78.0946 Garliava, Lithuania, 54.8167, 23.8667 Marondry, Madagascar, -18.4167, 47.0000 Uchtepa Qishlog'i, Uzbekistan, 40.2050, 67.9011 Bandixon, Uzbekistan, 37.8614, 67.3861 North Glengarry, Canada, 45.3333, -74.7333 Turkan, Azerbaijan, 40.3646, 50.2208 Tavriisk, Ukraine, 46.7500, 33.4167 M'Chouneche, Algeria, 34.9500, 6.0000 Raghunathpur, India, 26.0019, 84.2753 Videle, Romania, 44.2833, 25.5333 Paris, United States, 38.2016, -84.2718 Cordele, United States, 31.9563, -83.7694 Mori, Italy, 45.8513, 10.9817 Budd Lake, United States, 40.8733, -74.7375 Heubach, Germany, 48.7881, 9.9333 Zerizer, Algeria, 36.7272, 7.8947 Daruvar, Croatia, 45.6000, 17.2167 Mashhad Rizeh, Iran, 34.7947, 60.5144 Perumuchchi, India, 13.0560, 79.6755 Parnagua, Brazil, -10.2269, -44.6389 Willstatt, Germany, 48.5417, 7.8964 Pike Road, United States, 32.2939, -86.0900 Madridejos, Spain, 39.4667, -3.5333 Borgo, France, 42.5547, 9.4281 Gambissara, Gambia, The, 13.2333, -14.3167 Sycow, Poland, 51.3100, 17.7236 San Simon, El Salvador, 13.8333, -88.2333 Havanur, India, 14.8667, 75.7000 Nizza Monferrato, Italy, 44.7747, 8.3550 Cuapiaxtla de Madero, Mexico, 18.9167, -97.8167 Middleton, United States, 43.7113, -116.6157 Corte Madera, United States, 37.9238, -122.5128 Naftalan, Azerbaijan, 40.5058, 46.8192 Saint-Max, France, 48.7017, 6.2072 Forres, United Kingdom, 57.6080, -3.6200 Chauki Hasan Chauki Makhdum, India, 26.2333, 84.4964 Bou Zemou, Morocco, 32.1114, -5.5197 Nkokonjeru, Uganda, 0.2394, 32.9231 Jomasho`y, Uzbekistan, 40.8633, 71.4597 Shohimardon, Uzbekistan, 39.9833, 71.8000 Rokkasho, Japan, 40.9672, 141.3744 Robore, Bolivia, -18.3333, -59.7500 Le Beausset, France, 43.1989, 5.8033 Machchand, India, 26.3241, 79.0543 Shahpur Chaumukhi, India, 25.7683, 86.9049 Nogliki, Russia, 51.8333, 143.1667 Hull, United States, 42.2861, -70.8835 Williston, United States, 44.4345, -73.0888 Spring Valley Lake, United States, 34.4987, -117.2683 Czarnkow, Poland, 52.9000, 16.5667 Chapel en le Frith, United Kingdom, 53.3220, -1.9170 Talugai, India, 11.3752, 78.4822 Korosavada, India, 18.7256, 84.0573 La Mision, Mexico, 21.1000, -99.1333 South Huron, Canada, 43.3200, -81.5000 Eybens, France, 45.1494, 5.7508 Bardmoor, United States, 27.8574, -82.7534 Sahidganj, India, 25.6627, 87.0976 Guemoukouraba, Mali, 14.2639, -9.3208 Wood-Ridge, United States, 40.8508, -74.0878 Kendallville, United States, 41.4441, -85.2578 Marieville, Canada, 45.4333, -73.1667 Kadaladi, India, 12.4040, 78.9660 Douar Bouchfaa, Morocco, 34.1014, -4.2939 Procida, Italy, 40.7611, 14.0193 Werneck, Germany, 49.9833, 10.1000 Kirkel, Germany, 49.2833, 7.2333 Worsley, United Kingdom, 53.5093, -2.3845 Ekamba, India, 25.9689, 87.5741 Candelaria, El Salvador, 13.6833, -88.9833 Waldwick, United States, 41.0133, -74.1259 Nong Ki, Thailand, 14.6868, 102.5380 Jangalapalle, India, 14.8997, 79.8936 Advi Devalpalli, India, 16.6631, 79.5139 Independence, United States, 44.8547, -123.1952 Erutukada, India, 8.2658, 77.1358 Mellieha, Malta, 35.9564, 14.3664 Murrells Inlet, United States, 33.5560, -79.0594 Villerupt, France, 49.4697, 5.9286 Hardas Bigha, India, 25.4994, 85.3551 Karapa, India, 16.9000, 82.1667 Onan, Japan, 34.8939, 132.4378 Mihqan, Syria, 34.9780, 40.4969 Hillsdale, United States, 41.0074, -74.0440 Mikhaylov, Russia, 54.2333, 39.0333 Rosario, Uruguay, -34.3139, -57.3525 Alexandria, South Africa, -33.6533, 26.4083 Mittenwalde, Germany, 52.2667, 13.5333 Kele, Ethiopia, 6.0833, 38.0333 Padugaipattu, India, 8.3642, 77.9815 Vaals, Netherlands, 50.7694, 6.0181 Korablino, Russia, 53.9167, 40.0167 Kafr Takharim, Syria, 36.1168, 36.5152 Primeiro de Maio, Brazil, -22.8508, -51.0278 Fiuggi, Italy, 41.8000, 13.2167 Airmont, United States, 41.0992, -74.0989 Bingham, United Kingdom, 52.9520, -0.9530 Kilsyth, United Kingdom, 55.9800, -4.0600 Thikriwala, India, 30.4328, 75.5261 Zuidlaren, Netherlands, 53.0933, 6.6823 Kambarka, Russia, 56.2667, 54.2167 Sao Sebastiao do Maranhao, Brazil, -18.0839, -42.5708 Hongliuwan, China, 39.6348, 94.3386 Meuselwitz, Germany, 51.0500, 12.3000 Chichihualco, Mexico, 17.6550, -99.6740 Umarizal, Brazil, -5.9908, -37.8139 Pinczow, Poland, 50.5333, 20.5333 Mengen, Germany, 48.0497, 9.3300 Rath To, Ireland, 53.5081, -6.4625 Eumseong, Korea, South, 36.9353, 127.6897 Penetanguishene, Canada, 44.7667, -79.9333 Hozin, Benin, 6.5333, 2.5500 Saladoblanco, Colombia, 2.0167, -76.0500 Kouinine, Algeria, 33.4000, 6.8333 Santa Catarina Masahuat, El Salvador, 13.7833, -89.7667 Malinagar, India, 25.9967, 85.6863 Sapkyo, Korea, South, 36.6864, 126.7367 Bieber, Germany, 50.6000, 8.5833 Letychiv, Ukraine, 49.3833, 27.6167 Howell, United States, 42.6078, -83.9339 Naters, Switzerland, 46.3237, 7.9886 Kuroshio, Japan, 33.0167, 133.0167 Ghatawan, India, 25.0968, 83.7266 Novi di Modena, Italy, 44.8934, 10.9010 Khaira, India, 24.8727, 86.2089 Yaotsu, Japan, 35.4760, 137.1416 Roelofarendsveen, Netherlands, 52.2000, 4.6333 Sartana, Ukraine, 47.1667, 37.6833 Beccles, United Kingdom, 52.4580, 1.5630 Mesra, India, 23.4339, 85.4152 Badia Polesine, Italy, 45.0940, 11.4934 Neves, Sao Tome and Principe, 0.3592, 6.5517 Conway, United States, 44.0085, -71.0719 La Leonesa, Argentina, -27.0500, -58.7167 Goytapa, Azerbaijan, 39.1167, 48.5953 Ouedo, Benin, 6.4833, 2.4500 Porangaba, Brazil, -23.1758, -48.1250 Kasba, India, 25.5856, 88.1122 Stropkov, Slovakia, 49.2050, 21.6514 Cairo, United States, 30.8790, -84.2050 Glocester, United States, 41.8934, -71.6889 Mondai, Brazil, -27.1028, -53.4019 Bagalur, India, 12.8333, 77.8667 Antanananivo, Madagascar, -16.2831, 49.7182 Penn Forest, United States, 40.9571, -75.6313 Avelgem, Belgium, 50.7667, 3.4333 Vrnjacka Banja, Serbia, 43.6167, 20.9000 Kidira, Senegal, 14.4574, -12.2106 Swieqi, Malta, 35.9208, 14.4800 East Rockaway, United States, 40.6432, -73.6672 Kwale, Kenya, -4.1737, 39.4521 Ban Bu Sung, Thailand, 14.9613, 104.2095 Burtonsville, United States, 39.1166, -76.9356 Lysa nad Labem, Czechia, 50.2014, 14.8328 Were Ilu, Ethiopia, 10.6000, 39.4333 Sung Noen, Thailand, 14.8992, 101.8208 East Whittier, United States, 33.9244, -117.9887 Radlett, United Kingdom, 51.6850, -0.3180 Jafra, Morocco, 31.5145, -8.7555 Reedsburg, United States, 43.5348, -89.9965 Gudensberg, Germany, 51.1833, 9.3667 Clay Cross, United Kingdom, 53.1637, -1.4128 Dudhpura, India, 25.7964, 86.1189 Shahpur Undi, India, 25.6370, 85.6013 Bara Khurd, India, 25.2599, 85.4325 Chandralapadu, India, 16.7150, 80.2089 Mocharim, India, 24.6794, 84.9905 Alassio, Italy, 44.0079, 8.1730 Rupana, India, 30.4070, 74.5276 Burgum, Netherlands, 53.1922, 5.9942 Abjij, Egypt, 29.2861, 30.8152 Saint-Loubes, France, 44.9181, -0.4269 Soyaux, France, 45.6414, 0.1986 Macerata Campania, Italy, 41.0667, 14.2667 Jiji, Taiwan, 23.8300, 120.7830 Dhamua, India, 22.2875, 88.3962 Calan, Romania, 45.7319, 23.0247 Nyurba, Russia, 63.2833, 118.3333 San Ignacio de Moxo, Bolivia, -14.9961, -65.6400 'Ain Naga, Algeria, 34.6883, 6.0886 Dalawarpur, India, 26.3466, 84.9581 Begijnendijk, Belgium, 51.0191, 4.7831 Schotten, Germany, 50.5000, 9.1167 El Molar, Spain, 40.7336, -3.5814 Verucchio, Italy, 43.9833, 12.4215 Satipo, Peru, -11.2533, -74.6370 Neustadt, Germany, 50.8500, 9.1167 Wahlstedt, Germany, 53.9500, 10.2167 North Petherton, United Kingdom, 51.0910, -3.0130 Sidi Ouassay, Morocco, 30.0500, -9.6833 Shildon, United Kingdom, 54.6300, -1.6500 Rangasamudram, India, 14.9852, 78.9765 Vange, United Kingdom, 51.5601, 0.4872 Avren, Bulgaria, 43.1139, 27.6693 Takahama, Japan, 35.4879, 135.5462 Nishi, Japan, 32.2011, 130.8411 Namorona, Madagascar, -21.6427, 48.1853 Cambridge, United States, 40.0221, -81.5869 Woodburn, United States, 38.8503, -77.2322 Vilyuysk, Russia, 63.7500, 121.6333 Al Hamah, Syria, 33.5607, 36.2206 Brookdale, United States, 40.8348, -74.1798 Chapeltown, United Kingdom, 53.4620, -1.4660 Petmanhalli, India, 17.7688, 77.5056 Taiyur, India, 12.7833, 80.1833 Gauli Palasiya, India, 22.5323, 75.7275 Ciudad Tula, Mexico, 23.0000, -99.7200 Bad Frankenhausen, Germany, 51.3558, 11.1011 Alayor, Spain, 39.9339, 4.1403 Tinkoni, India, 26.8613, 84.9647 Lepakshi, India, 13.8100, 77.6000 Sakuho, Japan, 36.1610, 138.4834 Maywood, United States, 40.9025, -74.0634 Ludlow, United Kingdom, 52.3680, -2.7180 Mikuszowice, Poland, 49.7833, 19.0703 Lipova, Romania, 46.0917, 21.6917 White Horse, United States, 40.1919, -74.7023 Jouamaa, Morocco, 35.6500, -5.6833 Iliatenco, Mexico, 18.2167, -99.4833 Abaiara, Brazil, -7.3589, -39.0458 Masquefa, Spain, 41.5036, 1.8136 Lydney, United Kingdom, 51.7286, -2.5285 Moulay Driss Zerhoun, Morocco, 34.0542, -5.5272 Zaniena, Mali, 11.2708, -6.4258 Nallikodur, India, 17.5811, 79.7500 Sermoneta, Italy, 41.5500, 12.9833 Parilla, Mexico, 17.9119, -92.9175 Bou'nane, Morocco, 32.0275, -3.0400 Suntar, Russia, 62.1667, 117.6333 Vembaditalam, India, 11.5670, 78.0112 Maharajapuram, India, 9.6588, 77.6631 Baldeogarh, India, 24.7562, 79.0672 Volpago del Montello, Italy, 45.7833, 12.1167 Agourai, Morocco, 33.6333, -5.5833 Fairview, United States, 37.6758, -122.0473 Tay, Canada, 44.7167, -79.7667 Houthulst, Belgium, 50.9833, 2.9500 Suthalia, India, 23.9955, 77.1395 Puduparambubhagam, India, 9.6000, 76.7400 Olevsk, Ukraine, 51.2167, 27.6500 Sirugamani, India, 10.8975, 78.5142 Canelli, Italy, 44.7208, 8.2928 Nikaido-kaminoshocho, Japan, 34.5914, 135.7962 Massi, Benin, 9.9167, 1.4667 Gignac-la-Nerthe, France, 43.3932, 5.2356 Hajipur, India, 25.2657, 87.5019 Ganapavaram, India, 16.4314, 80.0515 Castlegar, Canada, 49.3256, -117.6661 Lauterach, Austria, 47.4772, 9.7314 Bela, India, 24.9689, 84.9740 Munagapaka, India, 17.6333, 83.0000 Goito, Italy, 45.2500, 10.6667 Tomboutou, Benin, 11.8550, 3.2892 Panrepatti, India, 25.5537, 83.9775 Lalmunia Munhara, India, 26.5741, 86.4012 Kuchesfahan, Iran, 37.2783, 49.7728 Benemerito, Mexico, 16.5172, -90.6531 Novooleksiivka, Ukraine, 46.2261, 34.6417 Bierbeek, Belgium, 50.8276, 4.7585 Steinhaus, Switzerland, 47.1969, 8.4861 Kaldenkirchen, Germany, 51.3167, 6.2833 Kirundo, Burundi, -2.5900, 30.0900 Loreto, Brazil, -7.0839, -45.1408 Kapuvar, Hungary, 47.6000, 17.0333 Kil Perambalur, India, 11.3600, 79.0980 Ertil, Russia, 51.8500, 40.8000 Dumont, Brazil, -21.2364, -47.9733 La Baneza, Spain, 42.2975, -5.9017 Snezhnogorsk, Russia, 69.2000, 33.2333 Harrison, United States, 40.6374, -79.7173 Hyrum, United States, 41.6325, -111.8445 Ploermel, France, 47.9325, -2.3961 Kingaroy, Australia, -26.5410, 151.8400 Toukoto, Mali, 13.4478, -9.8764 Mstsislaw, Belarus, 54.0167, 31.7167 Alcarraz, Spain, 41.5661, 0.5261 An Nayrab, Syria, 36.1756, 37.2280 Country Club, United States, 37.9687, -121.3408 Belpara, India, 20.5889, 82.9729 Cavan Monaghan, Canada, 44.2000, -78.4667 Valozhyn, Belarus, 54.0833, 26.5167 Ramiriqui, Colombia, 5.4000, -73.3333 Mery-sur-Oise, France, 49.0644, 2.1872 Montignoso, Italy, 44.0167, 10.1667 Huejuquilla el Alto, Mexico, 22.6256, -103.8964 San Ildefonso, El Salvador, 13.7000, -88.5667 Maxeville, France, 48.7122, 6.1639 Dhangaraha, India, 26.0204, 84.7023 Sidi Abdellah Ben Taazizt, Morocco, 34.0019, -5.3695 Pajacuaran, Mexico, 20.1178, -102.5667 San Pedro Huamelula, Mexico, 16.0167, -95.6667 Harqalah, Tunisia, 36.0333, 10.5000 North Gates, United States, 43.1718, -77.7064 Pakka Kalan, India, 30.0323, 74.8555 Silamalai, India, 9.9621, 77.3371 Manahari, Nepal, 27.5500, 84.7900 Cypress Gardens, United States, 28.0036, -81.6857 Juripiranga, Brazil, -7.3728, -35.2378 Cabanaquinta, Spain, 43.1000, -5.5833 Ware, United States, 42.2806, -72.2843 Mengibar, Spain, 37.9683, -3.8089 Couzeix, France, 45.8769, 1.2389 Piedrahita, Ecuador, -1.9167, -80.0115 Dagiapara, India, 26.4568, 91.8294 Willow Street, United States, 39.9810, -76.2706 Strasshof an der Nordbahn, Austria, 48.3194, 16.6475 Platon Sanchez, Mexico, 21.2833, -98.3667 Santa Maria de Palautordera, Spain, 41.6953, 2.4458 Sylva, Russia, 58.0333, 56.7681 Dores de Campos, Brazil, -21.1089, -44.0228 Capodrise, Italy, 41.0446, 14.3023 Tourza, Morocco, 29.4778, -10.0158 Moba, Congo (Kinshasa), -7.0398, 29.7661 Suaita, Colombia, 6.1019, -73.4406 Zaruma, Ecuador, -3.6833, -79.6000 Senanga, Zambia, -16.1167, 23.2667 La Ferte-sous-Jouarre, France, 48.9497, 3.1303 Villiersdorp, South Africa, -33.9908, 19.2894 Mount Holly, United States, 39.9950, -74.7863 Bad Ems, Germany, 50.3381, 7.7106 Marpingen, Germany, 49.4500, 7.0500 Ainring, Germany, 47.8136, 12.9428 Horbury, United Kingdom, 53.6595, -1.5324 Tiri, India, 25.8871, 86.6757 Amwa Majhar, India, 26.7362, 84.5818 Rio Vista, United States, 38.1765, -121.7025 Harrisonville, United States, 38.6530, -94.3467 Detroit Lakes, United States, 46.8060, -95.8449 Shengping, China, 28.4856, 98.9114 Aniche, France, 50.3306, 3.2519 Kolagallu, India, 15.1500, 76.9200 Soahany, Madagascar, -18.6757, 44.2131 Haider Khel, Pakistan, 32.9449, 70.2960 Krynica, Poland, 49.4117, 20.9550 Tujg, Afghanistan, 32.0686, 61.8058 Boladi, Azerbaijan, 38.8904, 48.7658 Fatikchari, Bangladesh, 22.6877, 91.7812 Puerto America, Bolivia, -11.5500, -68.0667 Mboki, Central African Republic, 5.3160, 25.9571 Gar, China, 32.1166, 80.0583 Ziketan, China, 35.5886, 99.9867 Sola, Cuba, 21.6744, -77.6806 Matagua, Cuba, 22.2369, -79.9992 Morayra, Spain, 38.6880, 0.1345 Rebola, Equatorial Guinea, 3.7192, 8.8531 Pont Sonde, Haiti, 19.1484, -72.6144 Balatonalmadi, Hungary, 47.0292, 18.0219 Haria, Indonesia, -3.5833, 128.6167 Waghai, India, 20.7667, 73.4833 Ghargaon, India, 18.6160, 74.6980 Deh, India, 27.3000, 73.9000 Medarametla, India, 15.7167, 80.0167 Lakshmipuro, India, 10.0774, 77.5198 Palanswa, India, 23.4667, 70.9333 Hanzviur, India, 34.1410, 74.5829 Amsin, India, 26.5733, 82.4357 Muttalakanpatti, India, 10.8652, 78.6492 Karumulaikkal, India, 9.3167, 76.8000 Dhalai, India, 24.5958, 92.8466 Venkatapuram, India, 18.7652, 78.3933 Budwan, India, 25.7775, 81.1681 Khanpur, India, 25.3410, 83.0740 Chhimluang, India, 24.5157, 92.8222 Siddarampuram, India, 15.5300, 76.6360 Reha Mota, India, 23.1887, 69.9034 Paravakkottai, India, 10.6005, 79.4313 Chhatarpur, India, 28.4565, 77.0032 Tharial, India, 32.3547, 75.6067 Dewal Thal, India, 29.7000, 80.2167 Lakshmipuram, India, 10.0777, 77.5212 Fatehgarh, India, 20.3000, 85.3300 Isnapuram, India, 17.5443, 78.3486 Mevani, India, 11.5000, 77.5333 Kerwada, India, 21.9000, 72.8500 Ulipuram, India, 11.4667, 78.4667 Dijmur, India, 27.6761, 94.8108 Kochhor, India, 27.6268, 75.1376 Betnoti, India, 21.7355, 86.8499 Balagam, India, 21.3694, 70.0981 Mangalam, India, 11.9256, 78.8872 Sotik, Kenya, -0.6796, 35.1200 Kargi, Kenya, 2.5068, 37.5756 Kourani, Comoros, -11.8511, 43.4261 Srifa, Lebanon, 33.2814, 35.3964 Chartoun, Lebanon, 33.7711, 35.6858 Qana, Lebanon, 33.2092, 35.2992 Amioun, Lebanon, 34.3000, 35.8000 Ras el Metn, Lebanon, 33.8500, 35.6667 Ed Damour, Lebanon, 33.7333, 35.4500 Butha-Buthe, Lesotho, -28.7833, 28.2333 Ghadamis, Libya, 30.1333, 9.5000 Belavabary, Madagascar, -18.8200, 48.0081 Mahabako, Madagascar, -21.7490, 47.7141 Boanamary, Madagascar, -15.8325, 46.3205 Morafeno, Madagascar, -21.2033, 47.2881 Esira, Madagascar, -24.3311, 46.7066 Sandravinany, Madagascar, -24.0406, 47.4416 Bedidy, Madagascar, -17.4701, 48.0232 Vohitrafeno, Madagascar, -21.6667, 47.2167 Daraina, Madagascar, -13.2048, 49.6617 Masiaboay, Madagascar, -23.9002, 44.4638 Ambatomivary, Madagascar, -23.8414, 45.5703 Ambodisikidy, Madagascar, -14.2486, 48.4804 Ambohimiarivo, Madagascar, -19.8535, 47.1574 Bekodoka, Madagascar, -16.9695, 45.1045 Maroharatra, Madagascar, -20.7306, 47.7681 Ambararatabe, Madagascar, -18.9865, 46.1909 Ambatomifanongoa, Madagascar, -20.2612, 46.9326 Ambohitrambo, Madagascar, -18.9167, 47.1833 Ebelo, Madagascar, -24.4825, 46.0284 Tsararano, Madagascar, -17.3443, 46.3513 Analalava, Madagascar, -14.6333, 47.7500 Lohafary, Madagascar, -23.2552, 47.4276 Vatana, Madagascar, -22.2323, 47.7464 Antsoantany, Madagascar, -19.7221, 47.1657 Ambovonomby, Madagascar, -14.4132, 49.0156 Isahara, Madagascar, -23.7200, 47.3554 Ambodivoara, Madagascar, -14.3394, 49.9794 Vodiriana, Madagascar, -19.1832, 48.5711 Ambohimahazo, Madagascar, -20.6878, 47.0695 Ambodimadiro, Madagascar, -14.5298, 48.0013 Andranambolava, Madagascar, -20.9082, 48.2756 Marosakoa, Madagascar, -16.1742, 46.7525 Amborompotsy, Madagascar, -20.6067, 46.2462 Soavimbahoaka, Madagascar, -18.6796, 46.1006 Erada, Madagascar, -25.2858, 45.9479 Mahabe, Madagascar, -17.0844, 45.3234 Mahabo-Mananivo, Madagascar, -23.1852, 47.6787 Miary-Taheza, Madagascar, -23.1360, 44.6272 Ankadindambo, Madagascar, -21.3767, 47.1247 Antaretra, Madagascar, -21.0792, 47.8503 Betrandraka, Madagascar, -17.0365, 47.5524 Amparihy, Madagascar, -15.6745, 47.1245 Tanamarina, Madagascar, -21.5717, 45.9365 Sahanivotry-Manandona, Madagascar, -20.1210, 47.0778 Andranomenatsa, Madagascar, -23.2500, 44.6167 Ambodimandresy, Madagascar, -14.7853, 48.0976 Anontsibe-Sakalava, Madagascar, -21.3765, 44.4679 Amparihitsokatra, Madagascar, -17.5286, 48.5728 Ambatolava, Madagascar, -23.5667, 47.3000 Ankerana, Madagascar, -21.0310, 47.1276 Sihanamaro, Madagascar, -25.1789, 45.7733 Vinanitelo, Madagascar, -21.7167, 47.2667 Vinanitelo, Madagascar, -22.0142, 47.7390 Ifarantsa, Madagascar, -24.9329, 46.8630 Miarinarivo, Madagascar, -22.0877, 47.0576 Ampasimazava, Madagascar, -17.6806, 49.1375 Vohitany, Madagascar, -24.1441, 44.7602 Vohitsaoka, Madagascar, -22.0357, 46.7262 Andranopasy, Madagascar, -21.2799, 43.7354 Beheloka, Madagascar, -23.9122, 43.6689 Ankirondro, Madagascar, -19.6453, 44.5930 Tamponala, Madagascar, -19.3042, 46.4078 Ambatolahy, Madagascar, -22.5268, 46.0083 Katsepy, Madagascar, -15.7617, 46.2442 Vondrozo, Madagascar, -22.8208, 47.3198 Tanambao-Daoud, Madagascar, -13.9862, 50.1129 Sahatona-Tamboharivo, Madagascar, -20.9623, 47.0988 Beanana, Madagascar, -17.3730, 48.4315 Soatanana, Madagascar, -21.3833, 46.9167 Ampitahana, Madagascar, -21.0452, 47.1844 Anosimparihy, Madagascar, -21.5061, 47.9925 Ambalanjanakomby, Madagascar, -16.6981, 47.0700 Zoma-Bealoka, Madagascar, -18.8523, 47.0575 Jangany, Madagascar, -22.8611, 45.7922 Ianapera, Madagascar, -23.6208, 45.1427 Ambahatrazo, Madagascar, -21.8586, 47.9047 Fanjakana, Madagascar, -21.1814, 46.8898 Mora, Mali, 14.3283, -4.6045 Putao, Burma, 27.3258, 97.4225 China, Mexico, 25.7033, -99.2365 Padang Besar, Malaysia, 6.6623, 100.3142 Zavora, Mozambique, -24.5150, 35.1997 Al Mazyunah, Oman, 17.8486, 52.6200 Surmon Chogga Grong, Pakistan, 35.1518, 76.4454 Basla, Pakistan, 33.3833, 73.3167 Bunji, Pakistan, 35.6422, 74.6336 Ghota Fatehgarh, Pakistan, 32.0900, 74.7800 Setubal, Portugal, 38.5243, -8.8926 Diabougou, Senegal, 14.5431, -12.2186 Koumpentoum, Senegal, 13.9833, -14.5667 Gadoon, Somalia, 5.6920, 46.6764 Corinto, El Salvador, 13.8167, -87.9667 Murgap, Turkmenistan, 37.4964, 61.9739 Kadama, Uganda, 1.0167, 33.8803 Bukomansimbi, Uganda, -0.1667, 31.6186 Xishrov, Uzbekistan, 39.6383, 66.8897 Oyim, Uzbekistan, 40.8242, 72.7414 Ramamangalam, India, 9.9333, 76.5000 Bishunpur, India, 25.8029, 85.9886 Kolno, Poland, 53.4106, 21.9339 Bomareddipalli, India, 18.7044, 79.1568 Fairmount, United States, 43.0414, -76.2485 Czersk Pomorski, Poland, 53.7928, 17.9739 Saint-Pierre-du-Mont, France, 43.8833, -0.5183 Rakhwari, India, 26.3603, 86.2882 Atri, Italy, 42.5833, 13.9833 Melendugno, Italy, 40.2667, 18.3333 Malaya Vishera, Russia, 58.8500, 32.2333 Struthers, United States, 41.0510, -80.5920 Kosching, Germany, 48.8167, 11.5000 Kippax, United Kingdom, 53.7669, -1.3705 Vilpatti, India, 10.2672, 77.5014 Digora, Russia, 43.1581, 44.1569 San Marcos, Costa Rica, 9.6703, -84.0092 Euxton, United Kingdom, 53.6620, -2.6740 Erraballa, India, 14.3971, 78.1744 Paikpara, India, 24.3149, 87.8503 Takad Sahel, Morocco, 30.2500, -9.5500 Birkenau, Germany, 49.5625, 8.7069 Saint-Gregoire, France, 48.1517, -1.6850 Fatehabad, India, 31.3811, 75.0996 Woodbury, United States, 39.8379, -75.1524 Cambridge, United States, 45.5612, -93.2283 Yadwad, India, 16.2400, 75.1800 Monteriggioni, Italy, 43.3670, 11.2180 Marton, United Kingdom, 54.5372, -1.2047 Ketugram, India, 23.7017, 88.0439 Alta, Sweden, 59.2667, 18.1833 Serris, France, 48.8456, 2.7878 Schlitz, Germany, 50.6667, 9.5667 Rangamati, India, 26.8076, 89.4572 Outat Oulad Al Haj, Morocco, 33.3333, -3.6833 Praia do Carvoeiro, Portugal, 37.1000, -8.4667 Stenungsund, Sweden, 58.0833, 11.8167 Salemi, Italy, 37.8167, 12.8000 Barkly East, South Africa, -30.9681, 27.5933 Kapyl, Belarus, 53.1500, 27.0917 Ben N'Choud, Algeria, 36.8622, 3.8806 Fateha, India, 25.6073, 85.8669 Kengarai, India, 11.4144, 76.9277 Pullambadi, India, 10.9667, 78.9167 Chada, India, 17.4992, 79.0756 Dilra, India, 29.0430, 78.7500 Jefferson, United States, 29.9609, -90.1554 Asagi Ayibli, Azerbaijan, 40.9347, 45.8261 Bad Bevensen, Germany, 53.0792, 10.5833 Oldenburg in Holstein, Germany, 54.3000, 10.8833 Inungur, India, 10.8507, 78.4889 Simri, India, 26.3825, 86.1705 Nohfelden, Germany, 49.5667, 7.1500 Galleh Dar, Iran, 27.6578, 52.6594 Leninskiy, Kazakhstan, 52.2528, 76.7789 Mahajjah, Syria, 32.9563, 36.2206 Winfield, United States, 41.8787, -88.1507 Gulyam, India, 15.3598, 77.0670 Hosur, India, 15.8201, 74.9301 Crikvenica, Croatia, 45.1737, 14.6924 Itikalapalle, India, 14.6013, 77.6582 Painal, India, 25.5900, 84.9304 Madhuban, India, 25.8948, 87.1093 Willoughby Hills, United States, 41.5873, -81.4333 Ribadeo, Spain, 43.5336, -7.0403 Sulecin, Poland, 52.4500, 15.1167 Yueyaquan, China, 40.1256, 94.6632 Sweet Home, United States, 44.4023, -122.7028 El Cairo, Colombia, 4.7500, -76.2500 Kanyana, India, 12.9000, 75.0300 Mahalleh-ye Shirinu, Iran, 27.6256, 52.4750 Fort Stewart, United States, 31.8811, -81.6131 Cape Canaveral, United States, 28.3933, -80.6049 Waltenhofen, Germany, 47.6667, 10.3000 Ringkobing, Denmark, 56.0864, 8.2487 Tansandra, India, 13.0554, 77.6342 Columbia City, United States, 41.1612, -85.4855 Hamilton, Australia, -37.7333, 142.0167 Bolsward, Netherlands, 53.0667, 5.5333 Valdobbiadene, Italy, 45.9163, 12.0142 Quinto di Treviso, Italy, 45.6500, 12.1667 Erenler, Turkey, 38.8197, 30.5406 Sao Tome, Brazil, -5.9728, -36.0750 Inami, Japan, 36.5602, 136.9710 Tsuno, Japan, 32.2564, 131.5597 San Nicolas Buenos Aires, Mexico, 19.1667, -97.5500 Barda, Russia, 56.9167, 55.5833 Ivancice, Czechia, 49.1014, 16.3775 Bhawanipur, India, 26.2385, 86.0995 Barano d'Ischia, Italy, 40.7167, 13.9167 Bay St. Louis, United States, 30.3281, -89.3774 Kinnelon, United States, 40.9847, -74.3862 Boundji, Congo (Brazzaville), -1.0264, 15.3478 Bananal, Brazil, -22.6839, -44.3228 Dumri, India, 25.4750, 85.0913 Mamobihat, India, 26.1466, 86.1747 Casino, Australia, -28.8667, 153.0500 Kottaipatti, India, 10.1533, 77.7315 Gaolingcun, China, 40.6003, 117.1072 Tzucacab, Mexico, 20.0708, -89.0506 West Point, United States, 33.6064, -88.6572 West Glens Falls, United States, 43.3057, -73.6964 Dujiashigou, China, 37.7667, 110.0667 Vegachi, Colombia, 6.7731, -74.7994 Great Missenden, United Kingdom, 51.7042, -0.7078 Erraguntlakota, India, 13.9622, 79.2768 Singera, Moldova, 46.9131, 28.9775 Alpu, Turkey, 39.7667, 30.9500 Tan Son, Vietnam, 21.2600, 106.2681 Cuesmes, Belgium, 50.4362, 3.9207 Trebbin, Germany, 52.2167, 13.2000 Aberaman, United Kingdom, 51.7008, -3.4267 Tokkavadi, India, 11.3702, 77.8412 Hiranai, Japan, 40.9259, 140.9559 Arapgir, Turkey, 39.0333, 38.4833 Rosstal, Germany, 49.4000, 10.8833 Kishunpur, India, 25.7947, 86.8237 Kambaliyampatti, India, 10.3671, 78.1233 Sufian, Iran, 38.2775, 45.9808 Iwashita, Japan, 32.6503, 130.8114 Anama, Brazil, -3.5800, -61.4039 Fenoughil, Algeria, 27.6028, -0.3056 Chakicherla, India, 15.1127, 80.0366 San Calixto, Colombia, 8.4000, -73.2167 Birchington, United Kingdom, 51.3770, 1.3050 Tutzing, Germany, 47.9089, 11.2814 Sagure, Ethiopia, 7.7500, 39.1500 Nairn, United Kingdom, 57.5860, -3.8690 Makale, Indonesia, -3.1000, 119.8500 Sundekuppam, India, 12.4567, 78.2125 Kapasiawan, India, 25.2783, 85.2869 Padinjarebagam, India, 10.3222, 76.1792 Khandsa, India, 28.4220, 76.9900 Bastak, Iran, 27.1953, 54.3678 Bertem, Belgium, 50.8671, 4.6361 Mahem, India, 15.5796, 73.9260 Teplodar, Ukraine, 46.5036, 30.3244 Sankt Andra, Austria, 46.7667, 14.8167 Handsworth, United Kingdom, 53.3700, -1.4000 Tympaki, Greece, 35.0667, 24.7667 Conselve, Italy, 45.2333, 11.8667 Siechnice, Poland, 51.0367, 17.1525 Grosse Pointe Farms, United States, 42.4068, -82.8993 Ettimadai, India, 10.8911, 76.9087 Khuran Milik, India, 25.6000, 86.8679 Kawara, Japan, 33.6681, 130.8472 Souama, Algeria, 36.6417, 4.3417 Saharbani, India, 25.7201, 86.4100 Zaozernyy, Russia, 55.9667, 94.7000 George Mason, United States, 38.8356, -77.3186 Fallston, United States, 39.5332, -76.4452 Vernouillet, France, 48.9728, 1.9842 Koloti, South Africa, -23.7460, 29.3070 Vettweiss, Germany, 50.7389, 6.5972 Anahuac, Mexico, 28.4800, -106.7442 DuPont, United States, 47.1079, -122.6495 Aich, Germany, 48.6228, 9.2372 Lambesc, France, 43.6547, 5.2625 Sorkheh, Iran, 35.4644, 53.2086 Hooglede, Belgium, 50.9833, 3.0833 Great Cornard, United Kingdom, 52.0245, 0.7497 Fil'akovo, Slovakia, 48.2719, 19.8286 Qufadah, Egypt, 28.5812, 30.7554 Araua, Brazil, -11.2622, -37.6197 Torrejon de la Calzada, Spain, 40.2000, -3.8000 Oulad Slim, Morocco, 32.7775, -7.7725 Boca del Rio, Mexico, 19.1056, -96.1078 Roanoke, United States, 33.0144, -97.2276 Vernon, United States, 34.1479, -99.3000 Birni Lafia, Benin, 11.9783, 3.2225 Irakleia, Greece, 41.1833, 23.2833 Puttige, India, 13.0751, 74.9597 Ennamangalam, India, 11.6449, 77.5930 Aboso, Ghana, 5.3607, -1.9486 Cuicatlan, Mexico, 17.8000, -96.9500 Heeze, Netherlands, 51.3828, 5.5715 Cedar Hills, United States, 40.4135, -111.7531 Tamzoura, Algeria, 35.4167, -0.6500 Bhado Khara, India, 24.9567, 85.5130 West Perrine, United States, 25.6061, -80.3639 Payerne, Switzerland, 46.8167, 6.9333 Ban Ngao, Thailand, 19.6736, 100.2583 San Antonio, Costa Rica, 9.9781, -84.1879 Consuegra, Spain, 39.4619, -3.6064 Kamalasai, Thailand, 16.3384, 103.5756 Thi Tran Mau A, Vietnam, 21.8781, 104.6956 Marysville, United States, 42.9084, -82.4806 Colts Neck, United States, 40.2928, -74.1680 Bellavista, Colombia, 6.5236, -76.9744 Saint-Laurent-de-la-Salanque, France, 42.7744, 2.9914 Erquelinnes, Belgium, 50.3099, 4.1214 Caraibas, Brazil, -14.6000, -41.3350 Nariar, India, 25.8875, 86.5632 Fino Mornasco, Italy, 45.7421, 9.0555 P'yongch'ang, Korea, South, 37.3675, 128.3958 Kuldiga, Latvia, 56.9667, 21.9667 Pachchampalaiyam, India, 11.5723, 77.6096 Porto Xavier, Brazil, -27.9058, -55.1378 Binfield, United Kingdom, 51.4320, -0.7920 Ocsa, Hungary, 47.2933, 19.2258 Ammanabrolu, India, 15.5802, 80.1488 Gossau, Switzerland, 47.3081, 8.7567 Padilla, Colombia, 3.2333, -76.3167 Marly, France, 49.0599, 6.1540 Green Cove Springs, United States, 29.9904, -81.6807 Balal, India, 12.3857, 75.2820 Coycoyan de las Flores, Mexico, 17.2667, -98.2667 Cilimli, Turkey, 40.9000, 31.0500 Kensington, United States, 41.6284, -72.7686 Ipupiara, Brazil, -11.8200, -42.6139 Dongou, Congo (Brazzaville), 2.0447, 18.0525 La Sierra, Colombia, 2.2500, -76.8333 Burscough, United Kingdom, 53.5960, -2.8430 Kamdoli, India, 15.2048, 75.2549 Bacliff, United States, 29.5085, -94.9888 East Brandywine, United States, 40.0364, -75.7505 Santa Maria, Brazil, -24.9333, -51.8500 Bagodar, India, 24.0803, 85.8306 Miandasht, Iran, 33.0758, 50.1631 Kraaipan, South Africa, -26.2940, 25.2970 River Vale, United States, 41.0138, -74.0080 Mulungu, Brazil, -7.0244, -35.4619 Beaumont-sur-Oise, France, 49.1431, 2.2872 Telwa, India, 26.0877, 86.5170 Locust Grove, United States, 33.3446, -84.1071 Mora, Spain, 39.6840, -3.7770 La Pointe, Haiti, 19.9500, -72.7833 Akalapura, India, 13.4852, 77.4621 Telpur, India, 27.0548, 84.3336 Kinalur, India, 11.4667, 75.8333 Hingyon, Philippines, 16.8522, 121.0989 Beneditinos, Brazil, -5.4550, -42.3600 Lalganj, India, 25.7297, 87.4799 Khapdeh, India, 26.2706, 87.1993 Bucine, Italy, 43.4775, 11.6158 Santa Clara, Portugal, 40.1908, -8.4383 Morden, Canada, 49.1919, -98.1006 Opochka, Russia, 56.7000, 28.6667 Mission, United States, 39.0270, -94.6568 Altenholz, Germany, 54.4000, 10.1333 Carmaux, France, 44.0500, 2.1589 Brentwood, United States, 40.3734, -79.9757 Karimunjawa, Indonesia, -5.8192, 110.4590 Kalimala, India, 18.0738, 81.7495 Kadrabad, India, 25.5793, 85.9475 Parwaha, India, 26.2336, 87.2197 Verkhniy Tagil, Russia, 57.3833, 59.9500 Grossos, Brazil, -4.9800, -37.1550 Talkhvoncheh, Iran, 32.2622, 51.5603 Farsund, Norway, 58.0833, 6.8000 Frydlant nad Ostravici, Czechia, 49.5928, 18.3597 Paval, India, 12.2958, 75.4056 Vedurupavaluru, India, 16.5519, 80.7309 Kargahia Purab, India, 26.7887, 84.5298 Ban Pong Yaeng Nai, Thailand, 18.8833, 98.8167 Bajwara, India, 31.5150, 75.9494 Sparta, United States, 43.9377, -90.8131 St. Augustine Shores, United States, 29.8039, -81.3086 Bee Ridge, United States, 27.2855, -82.4731 Welkenraedt, Belgium, 50.6606, 5.9714 Dongcha, China, 34.3800, 106.6623 Angalakuduru Malepalle, India, 16.2392, 80.6117 North Versailles, United States, 40.3785, -79.8084 Temiskaming Shores, Canada, 47.5167, -79.6833 Dharmavaram, India, 18.2164, 83.8856 Minnampalli, India, 11.6758, 78.2676 Setubinha, Brazil, -17.6000, -42.1589 Bekkaria, Algeria, 35.3722, 8.2422 Balderton, United Kingdom, 53.0549, -0.7727 Pavittiram, India, 11.1406, 78.3631 Honwada, India, 16.7333, 77.9333 Sant Julia de Loria, Andorra, 42.4650, 1.4911 Barni, India, 25.3484, 85.0594 Varzedo, Brazil, -12.9708, -39.3939 Crigglestone, United Kingdom, 53.6440, -1.5225 Pipraun, India, 26.5990, 85.9356 Mussomeli, Italy, 37.5794, 13.7525 Liskeard, United Kingdom, 50.4536, -4.4651 Pudimadaka, India, 17.5000, 83.0167 Strzelce Krajenskie, Poland, 52.8756, 15.5319 Mandello del Lario, Italy, 45.9167, 9.3167 Manduri, Brazil, -23.0033, -49.3219 Littleport, United Kingdom, 52.4568, 0.3046 Epanomi, Greece, 40.4333, 22.9333 Kunnur, India, 9.5882, 77.7006 Karajgi, India, 14.8641, 75.4535 Chambly, France, 49.1672, 2.2489 San Isidro, Philippines, 9.8000, 124.3000 San Bartolome Perulapia, El Salvador, 13.7658, -89.0508 Polistena, Italy, 38.4000, 16.0667 Olaine, Latvia, 56.7844, 23.9369 Ellisville, United States, 38.5897, -90.5884 Arroyohondo, Colombia, 10.1333, -75.5667 Fuente Palmera, Spain, 37.7032, -5.1041 Volodarsk, Russia, 56.2167, 43.1833 Boufatis, Algeria, 35.6833, -0.4167 Kaunra, India, 25.5231, 84.5575 Vaiano, Italy, 43.9667, 11.1167 Holsbeek, Belgium, 50.9208, 4.7569 Phak Hai, Thailand, 14.4574, 100.3699 Mayfield, United States, 36.7371, -88.6447 Nove Mesto na Morave, Czechia, 49.5614, 16.0742 Sande, Norway, 59.5936, 10.2076 El Metline, Tunisia, 37.2500, 10.0500 Pajaros, Puerto Rico, 18.3610, -66.2184 Glanmire, Ireland, 51.9158, -8.3997 Bharhopur, India, 25.9488, 84.5274 Lomazzo, Italy, 45.7000, 9.0333 Kaith, India, 25.4776, 86.2001 Muskegon Heights, United States, 43.2023, -86.2421 Latifpur, Bangladesh, 22.4067, 91.7464 La Escala, Spain, 42.1140, 3.1390 Zefyri, Greece, 38.0667, 23.7167 Tiszafoldvar, Hungary, 46.9833, 20.2500 Navinipatti, India, 10.0439, 78.3557 Maceira, Portugal, 39.6897, -8.9000 Woodfield, United States, 34.0587, -80.9309 Panjab, Afghanistan, 34.3833, 67.0167 Sursee, Switzerland, 47.1742, 8.1081 Merchweiler, Germany, 49.3500, 7.0333 Baldock, United Kingdom, 51.9900, -0.1900 Suhiya, India, 25.6482, 84.3916 Makaha, United States, 21.4739, -158.2102 Pachalum, Guatemala, 14.9269, -90.6650 Shankarampet, India, 18.0490, 77.9143 Villas, United States, 39.0157, -74.9350 Tonse East, India, 13.3963, 74.7217 San Jose Villanueva, El Salvador, 13.5833, -89.2667 Nenagh, Ireland, 52.8619, -8.1967 Wangi, India, 18.1833, 75.1500 Bilehra, India, 23.6463, 78.7311 Travis Ranch, United States, 32.8015, -96.4775 Salem, United States, 40.0539, -111.6718 Wilsele, Belgium, 50.8945, 4.6982 Huldenberg, Belgium, 50.7895, 4.5850 Dera Baba Nanak, India, 32.0321, 75.0292 Ippagudem, India, 17.7668, 79.3751 Asola, Italy, 45.2167, 10.4167 Brinkmann, Argentina, -30.8669, -62.0336 Siruvalur, India, 11.3600, 77.4575 Urgnano, Italy, 45.5972, 9.6950 Lincoln City, United States, 44.9751, -124.0072 Rodinghausen, Germany, 52.2500, 8.4667 Rochford, United Kingdom, 51.5821, 0.7065 Baghant, India, 26.1748, 86.1705 Jettihalli, India, 12.0800, 78.1193 Miadanandriana, Madagascar, -19.0361, 47.7923 Sturbridge, United States, 42.1076, -72.0904 Koflach, Austria, 47.0667, 15.0833 Worth, United Kingdom, 51.1130, -0.1470 Coello, Colombia, 4.3333, -74.9167 Friedrichsthal, Germany, 49.3256, 7.0961 Suknah, Libya, 29.0669, 15.7847 Gudgeri, India, 15.1225, 75.3653 Namakadu, India, 14.0060, 80.1194 Campi Salentina, Italy, 40.4000, 18.0167 Soulei, Mali, 13.8778, -5.2458 Muthabana, India, 24.9346, 88.0425 Bhadsara, India, 25.3696, 84.8444 Rye Brook, United States, 41.0302, -73.6864 Tutong, Brunei, 4.8067, 114.6592 Le Muy, France, 43.4736, 6.5667 Kadanganeri, India, 8.9200, 77.5500 Kaimati, India, 26.3186, 89.7843 Chintapalle, India, 17.8667, 82.3500 Gurwalia Biswas, India, 26.8372, 84.4687 Mohlanapeng, Lesotho, -29.6975, 28.6947 Hinton, Canada, 53.4114, -117.5639 Itapeva, Brazil, -22.7678, -46.2208 Petorca, Chile, -32.2514, -70.9314 Edenbridge, United Kingdom, 51.1970, 0.0650 Sultanpur, India, 29.1600, 79.0600 Saint-Sauveur, Canada, 45.9000, -74.1700 Vardenik, Armenia, 40.1350, 45.4364 Ankazotsifantatra, Madagascar, -19.9862, 48.5011 Kaiken, Argentina, -54.5062, -67.1905 Ottendorf-Okrilla, Germany, 51.1792, 13.8261 Meldola, Italy, 44.1333, 12.0667 Khrystynivka, Ukraine, 48.8000, 29.9667 Ga-Kgapane, South Africa, -23.6490, 30.2260 Avon Park, United States, 27.5898, -81.5068 Terra de Areia, Brazil, -29.5850, -50.0708 Hosahalli, India, 14.6480, 76.4672 Trancoso, Portugal, 40.7833, -7.3500 Barahra, India, 26.2356, 86.5615 Chupaca, Peru, -12.0620, -75.2872 Margarita, Colombia, 9.0833, -74.2000 Baltara, India, 25.5116, 86.7232 Loudeac, France, 48.1778, -2.7539 Tadiparti, India, 17.1769, 82.2757 Krasnyy Yar, Kazakhstan, 53.3239, 69.2525 Harvard, United States, 42.4296, -88.6211 Alfaro, Spain, 42.1783, -1.7492 Widhwidh, Somalia, 8.4541, 46.7083 Ban Pha Bong, Thailand, 19.2266, 97.9707 Kumcati, Turkey, 37.4710, 42.3170 Oelsnitz, Germany, 50.4167, 12.1667 Reddigudem, India, 16.8939, 80.6917 Nayagaon, India, 24.5622, 74.7760 Ruoqiang, China, 39.0181, 88.1681 Heerlerbaan, Netherlands, 50.8692, 6.0102 Plainville, United States, 42.0141, -71.3364 Qazigund, India, 33.5921, 75.1654 Kanjiza, Serbia, 46.0667, 20.0500 Metsamor, Armenia, 40.1428, 44.1164 Alcorta, Argentina, -33.5333, -61.1167 Ouled Brahim, Algeria, 36.2444, 2.9336 Chegur, India, 17.1758, 78.2298 Ommangi, India, 17.2597, 82.2236 Kushnarenkovo, Russia, 55.1050, 55.3478 San Miguel Siguila, Guatemala, 14.9000, -91.6167 Kisujszallas, Hungary, 47.2167, 20.7667 East Liverpool, United States, 40.6333, -80.5677 Sarkeghat, Nepal, 29.7833, 81.9333 Krzeszowice, Poland, 50.1333, 19.6333 Therwil, Switzerland, 47.4997, 7.5500 Wapakoneta, United States, 40.5664, -84.1916 Levski, Bulgaria, 43.3592, 25.1358 Lajes, Brazil, -5.7000, -36.2450 Succasunna, United States, 40.8530, -74.6568 Palepalli, India, 12.5667, 78.3071 Iwamuro-onsen, Japan, 37.7375, 138.8391 Berd, Armenia, 40.8808, 45.3917 Swan Hill, Australia, -35.3333, 143.5500 Muttattuteruvu, India, 9.4333, 76.5389 Heves, Hungary, 47.6000, 20.2833 Poggio a Caiano, Italy, 43.8155, 11.0440 Ntorosso, Mali, 13.1422, -5.0631 Peru, United States, 41.3482, -89.1371 Jesup, United States, 31.5992, -81.8895 Greencastle, United States, 39.6432, -86.8418 Laakirchen, Austria, 47.9828, 13.8242 Kummersbruck, Germany, 49.4167, 11.8833 Vettaikkaraniruppu, India, 10.5739, 79.8353 Ambodiriana, Madagascar, -17.9372, 49.2735 Ingleside, United States, 27.8703, -97.2075 Lingampet, India, 18.2383, 78.1303 Mahisanrh, India, 25.7358, 85.5818 Geylegphug, Bhutan, 26.8706, 90.4856 Bad Konig, Germany, 49.7500, 9.0167 Majhgawan, India, 23.4039, 80.2098 Tanichchiyam, India, 10.0412, 78.0127 San Carlos Yautepec, Mexico, 16.5000, -96.1000 Nueva Palmira, Uruguay, -33.8833, -58.4167 Paradarami, India, 13.0833, 78.9833 Schwaikheim, Germany, 48.8714, 9.3531 Humlebaek, Denmark, 55.9613, 12.5324 Abram, United Kingdom, 53.5080, -2.5880 Berikai, India, 12.8056, 77.9710 Philipstown, United States, 41.4189, -73.9152 Ciudad de Loreto, Argentina, -28.3000, -64.2000 Aranzazu, Colombia, 5.3000, -75.4500 Nordwalde, Germany, 52.0833, 7.4833 Pliezhausen, Germany, 48.5586, 9.2058 Roche-la-Moliere, France, 45.4347, 4.3244 Sovicille, Italy, 43.2833, 11.2333 Dandoli, Mali, 14.3953, -3.5425 Nhandeara, Brazil, -20.6939, -50.0378 Narasimharajapura, India, 13.6108, 75.5120 Plains, United States, 41.2657, -75.8131 Ilsfeld, Germany, 49.0500, 9.2500 Grigny, France, 45.6092, 4.7906 Pailon, Bolivia, -17.6594, -62.7197 Renaico, Chile, -37.6667, -72.5833 Norosi, Colombia, 8.5261, -74.0378 Fundeni, Romania, 44.4595, 26.1668 Rodynske, Ukraine, 48.3531, 37.2100 Coal, United States, 40.7873, -76.5493 Juru, Brazil, -7.5369, -37.8186 Lanskroun, Czechia, 49.9122, 16.6122 Achchippatti, India, 10.6989, 77.0150 Kadoli, India, 15.8800, 74.5600 Santo Stefano di Magra, Italy, 44.1625, 9.9151 Bisingen, Germany, 48.3119, 8.9178 Altofonte, Italy, 38.0447, 13.2986 Cuencame de Ceniceros, Mexico, 24.8667, -103.7000 Mariluz, Brazil, -24.0019, -53.1458 Tigaon, India, 21.6456, 78.4576 Alamosa, United States, 37.4752, -105.8770 Anjahamana, Madagascar, -18.3495, 48.9718 Fairfield, United States, 33.4747, -86.9194 Voreppe, France, 45.2986, 5.6375 Surir, India, 27.7718, 77.7208 Eerbeek, Netherlands, 52.1053, 6.0633 Kirkland, United States, 43.0368, -75.3865 Hochdorf, Switzerland, 47.1664, 8.2889 Tulin, India, 23.3700, 85.9000 Boriguma, India, 19.0468, 82.5532 Nanzhou, Taiwan, 22.4789, 120.5156 Katarmala, India, 25.5036, 86.2447 Mosjoen, Norway, 65.8333, 13.2000 Tha Mai, Thailand, 12.6214, 102.0048 Cavriago, Italy, 44.6956, 10.5274 Chimay, Belgium, 50.0479, 4.3173 Pluderhausen, Germany, 48.7950, 9.6011 Hansa, India, 26.0911, 87.3089 Veitshochheim, Germany, 49.8328, 9.8817 Dindanko, Mali, 14.1233, -9.5031 Nersingen, Germany, 48.4289, 10.1219 Kharial, India, 30.1056, 75.8855 Kokiladanga, India, 26.3688, 89.8335 Pedda Kotayalanka, India, 16.1567, 80.8314 Itamukkala, India, 15.3731, 80.1130 Kaimuh, India, 33.7197, 75.0811 Shahzadpur, India, 25.6541, 86.8709 Ingre, France, 47.9211, 1.8250 Manubolu, India, 14.1833, 79.8833 Partanna, Italy, 37.7289, 12.8894 Qarabalyq, Kazakhstan, 53.7506, 62.0502 Patsanda, India, 24.8580, 86.3008 Chandankiari, India, 23.5781, 86.3598 Ozieri, Italy, 40.5849, 9.0033 Karghar, India, 25.1267, 83.9274 Vigonovo, Italy, 45.3852, 12.0074 Carregal do Sal, Portugal, 40.4333, -8.0000 Touwu, Taiwan, 24.5833, 120.8500 Tekit, Mexico, 20.5322, -89.3314 Aramari, Brazil, -12.0819, -38.4989 Cachipay, Colombia, 4.7308, -74.4375 Furstenau, Germany, 52.5167, 7.6667 Osthofen, Germany, 49.7078, 8.3289 Tolmezzo, Italy, 46.4000, 13.0167 Picnic Point, United States, 47.8744, -122.3077 Parkes, Australia, -33.1333, 148.1667 Heilsbronn, Germany, 49.3167, 10.8000 Sieverne, Ukraine, 48.0858, 38.6942 Iraiyur, India, 11.7834, 79.1970 Pushpattur, India, 10.5438, 77.4100 Terku Narippaiyur, India, 9.1167, 78.4188 Birpur Barapatti Pindraun, India, 26.5475, 86.3898 Etchojoa, Mexico, 26.8667, -109.6500 Marathon, United States, 24.7263, -81.0374 Mudgee, Australia, -32.6125, 149.5872 Kodivalasa, India, 13.2547, 79.4249 Kamikita-kita, Japan, 40.7360, 140.9560 Bad Liebenzell, Germany, 48.7742, 8.7314 Mirleft, Morocco, 29.6081, -9.9698 College Place, United States, 46.0419, -118.3878 Basso, Benin, 10.5000, 3.6833 Toudja, Algeria, 36.7500, 4.9000 Gangapur Athar, India, 25.8214, 85.7123 Berilo, Brazil, -16.9519, -42.4658 Nisarpur, India, 22.1088, 74.8078 Hesarcheh-ye Pa'in, Iran, 38.1800, 56.4500 Kusugal, India, 15.3667, 75.2167 Bouabout, Morocco, 31.2667, -9.1833 Guia Lopes da Laguna, Brazil, -21.4578, -56.1142 Le Rheu, France, 48.1028, -1.7942 Jixian, China, 35.7321, 107.9731 Pithaura, India, 26.2620, 87.0983 Baragaon, India, 25.1348, 85.4320 Nodinge-Nol, Sweden, 57.9000, 12.0667 Ech Chaibat, Morocco, 31.6000, -7.8500 Erdokertes, Hungary, 47.6749, 19.3158 Amjhar, India, 25.0641, 84.5591 Nagulapadu, India, 16.0634, 80.3395 Castelletto sopra Ticino, Italy, 45.7167, 8.6333 Mogosoaia, Romania, 44.5333, 26.0000 San Vicente, Ecuador, -1.9082, -79.2486 Uniontown, United States, 39.8993, -79.7246 Chavusy, Belarus, 53.8075, 30.9714 Pillaro, Ecuador, -1.1667, -78.5333 Indurti, India, 18.2233, 79.1355 Morrovalle, Italy, 43.3146, 13.5806 Nong Wua So, Thailand, 17.1626, 102.5727 Matadepera, Spain, 41.6036, 2.0244 Caldicot, United Kingdom, 51.5910, -2.7492 Gorha, India, 26.2267, 86.9349 Oulad 'Azzouz, Morocco, 32.7030, -6.7660 Tsarevo, Bulgaria, 42.1669, 27.8500 Serafimovskiy, Russia, 54.4167, 53.7833 Capitola, United States, 36.9773, -121.9537 General Alvear, Argentina, -36.0333, -60.0167 Socota, Colombia, 6.0500, -72.6333 Selfoss, Iceland, 63.9333, -21.0000 DeRidder, United States, 30.8468, -93.2931 Apiuna, Brazil, -27.0358, -49.3900 San Juan del Puerto, Spain, 37.3167, -6.8333 Chuhal, India, 31.5950, 75.9684 Bauska, Latvia, 56.4067, 24.1875 Kouarfa, Benin, 10.4833, 1.5167 Kostrzyn, Poland, 52.3942, 17.2222 Santa Barbara, Venezuela, 9.6000, -63.6000 Frouzins, France, 43.5172, 1.3256 Aurahi, India, 26.0355, 86.7467 Basapatna, India, 15.4302, 76.4869 Pasupatikovil, India, 10.8893, 79.1795 Samabouro, Mali, 12.8586, -5.5061 Pechory, Russia, 57.8167, 27.6167 Sasaima, Colombia, 4.9650, -74.4347 Magstadt, Germany, 48.7422, 8.9650 Nurpur, India, 32.3000, 75.9000 Kalas, India, 15.0981, 75.4067 Jerissa, Tunisia, 35.8500, 8.6333 San Sebastian, Colombia, 1.8439, -76.7717 Vlist, Netherlands, 51.9867, 4.7889 Banino, Poland, 54.3933, 18.4083 London Colney, United Kingdom, 51.7260, -0.3000 Palkot, India, 22.8748, 84.6433 San Vendemiano, Italy, 45.8914, 12.3389 Grey Highlands, Canada, 44.3333, -80.5000 Lorgues, France, 43.4949, 6.3612 Dumri, India, 25.7350, 84.8762 Gangaur, India, 26.5666, 85.8821 Sorab, India, 14.3814, 75.0918 Kinhalu, India, 15.4431, 76.1397 Kalyanpur, India, 26.4802, 84.1789 Paravada, India, 17.6283, 83.0793 Ban Mae Sam Laep, Thailand, 17.9750, 97.7392 Belitsa, Bulgaria, 41.9500, 23.5667 Bernay, France, 49.0900, 0.6000 Kil Valur, India, 10.7659, 79.7419 Keshwari, India, 24.1878, 85.8411 Bergambacht, Netherlands, 51.9328, 4.7936 Honow, Germany, 52.5483, 13.6378 Devikapuram, India, 12.4744, 79.3475 Manushmuria, India, 22.2808, 86.7386 Djangoa, Madagascar, -13.7981, 48.3365 Olmos, Peru, -5.9847, -79.7453 Drezdenko, Poland, 52.8333, 15.8333 Rasht, Tajikistan, 39.0167, 70.3833 Altlandsberg, Germany, 52.5667, 13.7331 Mae O, Thailand, 19.6500, 99.8333 Portet-sur-Garonne, France, 43.5231, 1.4067 Thomaston, United States, 32.8907, -84.3272 Currumbin, Australia, -28.1575, 153.4686 Everswinkel, Germany, 51.9250, 7.8478 Velpuru, India, 16.1775, 80.7425 Imlil, Morocco, 31.7567, -7.0106 Pisac, Peru, -13.4242, -71.8578 Sukhsena, India, 25.6881, 87.1194 Boscotrecase, Italy, 40.7833, 14.4667 Resadiye, Turkey, 40.3914, 37.3383 Altmunster, Austria, 47.9014, 13.7514 Silvarpatti, India, 10.4473, 77.9086 Khathjari, India, 24.7046, 81.9891 Santa Rosa, Brazil, -29.1333, -49.7167 Dangcheng, China, 39.5034, 94.8879 Dangchengwan, China, 39.5161, 94.8728 Hawera, New Zealand, -39.5890, 174.2820 Lobez, Poland, 53.6333, 15.6167 Bukowno, Poland, 50.2681, 19.4631 Tarusa, Russia, 54.7333, 37.1833 Veppattur, India, 11.0154, 79.4344 Kominato, Japan, 40.9259, 140.9559 Pleasant Valley, United States, 41.7697, -73.8049 Ezanville, France, 49.0286, 2.3617 Trescore Balneario, Italy, 45.7000, 9.8500 Bagnolo in Piano, Italy, 44.7644, 10.6736 Aine Draham, Tunisia, 36.7833, 8.7000 Choppington, United Kingdom, 55.1450, -1.6010 Chak That, India, 25.7347, 86.0340 Bag, India, 22.3590, 74.7905 El Roble, Colombia, 9.1000, -75.2000 Kongen, Germany, 48.6819, 9.3667 Cosne sur Loire, France, 47.4122, 2.9275 Pasewalk, Germany, 53.5000, 14.0000 Bockenem, Germany, 52.0117, 10.1319 Bamora, India, 24.0554, 78.0893 Valpovo, Croatia, 45.6500, 18.4167 Ghariyah al Gharbiyah, Syria, 32.6869, 36.2253 Tottington, United Kingdom, 53.6130, -2.3390 Kotli Ablu, India, 30.3504, 74.7868 Gokceada, Turkey, 40.1608, 25.8444 Eagle Point, United States, 42.4677, -122.8016 Jhitkahiya, India, 26.7860, 84.8858 Alagarai, India, 10.9826, 78.3891 Koini, India, 26.4226, 84.5147 Kiban, Mali, 13.5767, -7.3528 Helston, United Kingdom, 50.1000, -5.2700 Ronda Alta, Brazil, -27.7669, -52.8019 Bourg-de-Peage, France, 45.0386, 5.0508 Dodworth, United Kingdom, 53.5417, -1.5214 Charne, India, 26.1185, 87.0754 Gangania, India, 25.2395, 86.6536 Sturovo, Slovakia, 47.7992, 18.7181 Frankfort Square, United States, 41.5219, -87.8031 Nueva Tolten, Chile, -39.1786, -73.1656 San Fernando, Colombia, 9.2797, -74.5339 San Fernando, Colombia, 9.2683, -74.5302 Saint-Lys, France, 43.5150, 1.1783 Bavanat, Iran, 30.4717, 53.6261 Alden, United States, 42.9114, -78.5211 Laubach, Germany, 50.5333, 8.9900 Muddanuru, India, 14.6667, 78.4000 Biei, Japan, 43.5833, 142.4667 Nallamadu, India, 16.8802, 81.3549 Ramnagar Bankat, India, 26.7595, 84.6122 Repatriacion, Paraguay, -25.5352, -55.9924 Quilombo, Brazil, -26.7258, -52.7208 Oberstdorf, Germany, 47.4167, 10.2833 Jalalpur, India, 26.0433, 84.5041 Semri, India, 25.6246, 85.7672 Derazhnia, Ukraine, 49.2667, 27.4333 Oulunsalo, Finland, 64.9333, 25.4167 Neshannock, United States, 41.0509, -80.3520 Sedona, United States, 34.8581, -111.7941 Xincun, China, 27.6718, 103.8699 Immingham, United Kingdom, 53.6139, -0.2183 Manalurpettai, India, 12.0079, 79.0918 Cittanova, Italy, 38.3500, 16.0833 Farako, Mali, 11.3583, -6.5797 Decatur, United States, 40.8286, -84.9277 Urdorf, Switzerland, 47.3867, 8.4278 Valsequillo de Gran Canaria, Spain, 28.0000, -15.4667 Pakri, India, 25.5876, 85.1580 Valantaravai, India, 9.3390, 78.8871 Tesalia, Colombia, 2.4833, -75.7333 Zuyevka, Russia, 58.4000, 51.1500 Ii, Finland, 65.3167, 25.3667 Vnukovo, Russia, 55.5997, 37.2800 Pepinster, Belgium, 50.5662, 5.8038 Bunol, Spain, 39.4194, -0.7906 Rute, Spain, 37.3167, -4.3667 Wolfersheim, Germany, 50.3975, 8.8114 Karankot, India, 17.2866, 77.5644 Perket, India, 18.7942, 78.3068 Sugbongkogon, Philippines, 8.9500, 124.7800 Puerto Tirol, Argentina, -27.3667, -59.0667 Zell am See, Austria, 47.3167, 12.8000 Montemarciano, Italy, 43.6399, 13.3104 Worpswede, Germany, 53.2222, 8.9278 Mahinathpur, India, 26.6554, 86.0674 Barracao, Brazil, -26.2539, -53.6328 Aytre, France, 46.1347, -1.1133 Agatogba, Benin, 6.4000, 1.9000 Wald, Switzerland, 47.2753, 8.9144 Kanchanpur, India, 24.6096, 84.2361 Jaisinghnagar, India, 23.6858, 81.3909 Kattagaram, India, 12.4110, 78.3153 Madera Acres, United States, 37.0123, -120.0799 Pavlikeni, Bulgaria, 43.2375, 25.3074 Figeac, France, 44.6086, 2.0317 Great Billing, United Kingdom, 52.2577, -0.8222 Salkhua, India, 25.6677, 86.6002 Ganguru, India, 16.4750, 80.7411 Pobiedziska, Poland, 52.4947, 17.2672 Ncora, South Africa, -31.7938, 27.7579 Mahomet, United States, 40.1888, -88.3901 Dassel, Germany, 51.8033, 9.6903 Erravaram, India, 17.5458, 82.8433 Kolnur, India, 18.5095, 79.4260 Aramangalam, India, 11.5843, 76.0001 Washington, United States, 35.5586, -77.0545 Guaraciaba, Brazil, -20.5708, -43.0078 Xiba, China, 40.1645, 98.7521 Shepperton, United Kingdom, 51.3900, -0.4600 Fultondale, United States, 33.6174, -86.8014 Gorom-Gorom, Burkina Faso, 14.4500, -0.2333 Dhamsain, India, 26.0938, 86.2541 Mesetas, Colombia, 3.3781, -74.0447 Twist, Germany, 52.6167, 7.0333 Sant'Egidio alla Vibrata, Italy, 42.8333, 13.7167 Fairview, United States, 35.9815, -87.1291 Sankt Johann in Tirol, Austria, 47.5225, 12.4256 Jagatpur, India, 26.3738, 86.0509 Chegurumomadi, India, 18.2361, 79.1974 Grigiskes, Lithuania, 54.6694, 25.0917 Glencoe, New Zealand, -46.1920, 168.6460 Wloszczowa, Poland, 50.8542, 19.9669 Satuluru, India, 16.2541, 80.1214 Shahganj, India, 22.8467, 77.7980 Maisenhausen, Germany, 50.0167, 9.0000 Ambinanintromby, Madagascar, -21.6729, 47.5240 Ghabrah, Syria, 34.5371, 40.9111 Dubliany, Ukraine, 49.8961, 24.0925 Keokuk, United States, 40.4095, -91.4031 Visselhovede, Germany, 52.9667, 9.5833 Giesen, Germany, 52.2000, 9.8833 Tsaramasoandro, Madagascar, -17.9606, 47.2147 Liesveld, Netherlands, 51.9156, 4.8456 Mount Airy, United States, 39.3742, -77.1534 Hacari, Colombia, 8.3167, -73.1500 La Farlede, France, 43.1686, 6.0436 Urlaha, India, 25.7440, 87.0929 Yamaguchi, Japan, 33.1833, 129.9500 Beius, Romania, 46.6500, 22.3500 Puerto Narino, Colombia, -3.7733, -70.3819 Dulce Nombre de Jesus, Costa Rica, 10.0838, -83.9810 Undavalli, India, 16.4957, 80.5800 Dhanwada, India, 16.6500, 77.6667 Hamrun, Malta, 35.8861, 14.4894 Basavilbaso, Argentina, -32.3667, -58.8833 Andrainjato, Madagascar, -21.4683, 47.1153 Fandrandava, Madagascar, -21.5210, 47.2440 Khorol, Russia, 44.4289, 132.0742 Ban Mae Chedi, Thailand, 19.1833, 99.5167 Sirdala, India, 24.6559, 85.4092 Hunasamaranhalli, India, 13.1435, 77.6200 Ribeirao do Largo, Brazil, -15.4589, -40.7389 Ciudad Cuauhtemoc, Mexico, 21.2833, -98.3667 Morrisville, United States, 40.2074, -74.7800 Cobham, United Kingdom, 51.3290, -0.4090 Redentora, Brazil, -27.6639, -53.6378 Sudlohn, Germany, 51.9436, 6.8664 Raynes Park, United Kingdom, 51.4033, -0.2321 Chausa, India, 25.5149, 83.8970 Murungattoluvu, India, 11.1651, 77.6411 Vidor, United States, 30.1291, -93.9967 Tanaina, United States, 61.6576, -149.4263 Arden Hills, United States, 45.0721, -93.1670 Ghusiya, India, 25.1832, 84.2486 Motipur, India, 25.8159, 86.0140 Birzebbuga, Malta, 35.8256, 14.5281 Novgorodskoye, Ukraine, 48.3319, 37.8364 Monett, United States, 36.9218, -93.9278 Semmarikulan, India, 8.4815, 77.9972 Quiculungo, Angola, -8.5167, 15.3167 Calca, Peru, -13.3230, -71.9560 Chadan, Russia, 51.2833, 91.5833 Tyukalinsk, Russia, 55.8667, 72.2000 Bou Nouh, Algeria, 36.5000, 3.9333 Foix, France, 42.9664, 1.6078 Kaithinia, India, 26.2317, 86.2817 Sidi Ahmed El Khadir, Morocco, 32.5167, -7.3833 Bom Jesus da Serra, Brazil, -14.3719, -40.5039 Lagos, Greece, 41.0667, 24.9833 Gambolo, Italy, 45.2586, 8.8647 Non Sung, Thailand, 15.1801, 102.2569 Merville, France, 50.6444, 2.6411 Moyogalpa, Nicaragua, 11.5333, -85.7000 Keansburg, United States, 40.4469, -74.1315 Alto Piquiri, Brazil, -24.0278, -53.4408 Feyzin, France, 45.6730, 4.8590 Rangasamudram, India, 13.7140, 78.2645 San Giorgio del Sannio, Italy, 41.0667, 14.8500 Hetane, Morocco, 32.8403, -6.8025 Middleton, United States, 42.6043, -71.0164 San Pedro, Chile, -33.8944, -71.4558 Shifnal, United Kingdom, 52.6650, -2.3730 Kusumha, India, 25.1859, 85.9234 Hadiaya, India, 30.3413, 75.5117 East St. Paul, Canada, 49.9772, -97.0103 Nova Floresta, Brazil, -6.4550, -36.2028 Sauk Village, United States, 41.4906, -87.5706 Rampur, India, 25.8864, 86.9547 Atlapadu, India, 16.8877, 81.6772 Grand-Couronne, France, 49.3583, 1.0081 Draganesti-Olt, Romania, 44.1697, 24.5300 Chiang Klang, Thailand, 19.2938, 100.8617 Seforong, Lesotho, -30.1028, 28.1864 Karattuppalaiyam, India, 11.4402, 77.3575 Elambalur, India, 11.2669, 78.8816 Zahed Shahr, Iran, 28.7461, 53.8039 Terralba, Italy, 39.7197, 8.6363 Primavera, Brazil, -0.9428, -47.1158 Oberhausen-Rheinhausen, Germany, 49.2606, 8.4850 Sniatyn, Ukraine, 48.4500, 25.5667 Sandy Hook, United States, 41.4128, -73.2440 Oudenburg, Belgium, 51.1833, 3.0000 Ledegem, Belgium, 50.8500, 3.1167 Tayakou, Benin, 10.5500, 1.2000 Bareh, India, 26.6786, 78.1887 Kakkat, India, 12.1998, 75.2024 Tivim, India, 15.6000, 73.8000 Idanha-a-Nova, Portugal, 39.9197, -7.2367 Lisbon, United States, 44.0265, -70.0900 Hartland, United States, 43.1029, -88.3396 Beverly Hills, United States, 28.9176, -82.4542 Moravska Trebova, Czechia, 49.7581, 16.6642 Mahuver, India, 21.0081, 72.8681 Aghbalou Aqourar, Morocco, 33.9341, -4.7381 Carnaubais, Brazil, -5.3408, -36.8328 Mikhaylovsk, Russia, 56.4500, 59.1333 South Amboy, United States, 40.4852, -74.2831 Tellar, India, 12.4011, 79.5530 Panganiban, Philippines, 13.9000, 124.3000 Portland, Australia, -38.3333, 141.6000 Estavayer-le-Lac, Switzerland, 46.8500, 6.8472 Qahjavarestan, Iran, 32.7044, 51.8336 Kem, Russia, 64.9500, 34.5833 New Square, United States, 41.1410, -74.0294 Wijnegem, Belgium, 51.2272, 4.5200 Rafelbunol, Spain, 39.5922, -0.3342 Leguevin, France, 43.5997, 1.2339 Haraiya, India, 27.0900, 85.0900 Aqadyr, Kazakhstan, 48.2749, 72.8599 Haraiya, Nepal, 27.0900, 85.0900 Ayvacik, Turkey, 39.6011, 26.4047 Kottampatti, India, 10.6705, 77.0194 Sundarapandiyam, India, 9.6127, 77.6738 Poggio Renatico, Italy, 44.7650, 11.4833 Zengjia Taizi, China, 32.1263, 109.4692 Zengjiaba, China, 32.1114, 109.4603 Pinos Puente, Spain, 37.2500, -3.7500 Lapanga, India, 23.6333, 85.3770 Lambertville, United States, 41.7484, -83.6244 Skidal', Belarus, 53.5833, 24.2500 Vitorino, Brazil, -26.2769, -52.7839 Wakoro, Mali, 12.5994, -6.6900 Lykovrysi, Greece, 38.0667, 23.7833 Tiruvengadam, India, 9.2586, 77.6748 Ranomafana, Madagascar, -21.2592, 47.4544 Kokologo, Burkina Faso, 12.1833, -1.8833 Periyapuliyur, India, 11.4296, 77.6309 Kannandahalli, India, 12.4164, 78.3803 Vanipenta, India, 14.7906, 78.7805 Croydon, United States, 40.0911, -74.8975 Lovendegem, Belgium, 51.1000, 3.6000 Punnavalli, India, 16.4062, 80.4010 Bararam, India, 26.1572, 84.3627 Belsara, India, 26.0152, 87.2023 Rampura, India, 14.8810, 76.7814 Sovata, Romania, 46.5961, 25.0744 Mount Evelyn, Australia, -37.7830, 145.3850 Saint-Jean-d'Illac, France, 44.8106, -0.7825 Pipra Dewas, India, 25.4636, 86.0236 Atturkuppam, India, 12.6000, 78.5423 Madhubani, India, 27.0001, 84.1040 Sturgeon Bay, United States, 44.8228, -87.3660 Purkersdorf, Austria, 48.2092, 16.1792 Eksjo, Sweden, 57.6667, 14.9500 Poloros, El Salvador, 13.5844, -87.8411 Hemau, Germany, 49.0519, 11.7828 Wadgira, India, 16.5858, 77.0980 Tungavi, India, 10.6263, 77.3294 Genemuiden, Netherlands, 52.6244, 6.0397 Huari, Peru, -9.3689, -77.2369 Cherepanovo, Russia, 54.2333, 83.3667 Ruzayevka, Russia, 54.0667, 44.9333 Chilanga, El Salvador, 13.7167, -88.1167 Sirka, Togo, 9.5719, 1.3183 McCordsville, United States, 39.8966, -85.9208 Imias, Cuba, 20.0694, -74.6314 Asuke, Japan, 35.1340, 137.1454 Zafargarh, India, 17.7686, 79.4859 Para, India, 23.5200, 86.5200 Morehead City, United States, 34.7308, -76.7388 Pai Bigha, India, 25.0511, 84.9226 Butler, United States, 41.0358, -75.9798 Kokoszki, Poland, 54.3541, 18.4915 Neu Bleckede, Germany, 53.3000, 10.7333 Celldomolk, Hungary, 47.2557, 17.1491 Latteri, India, 12.9712, 79.0685 Wittenbach, Switzerland, 47.4667, 9.3795 Belalcazar, Colombia, 5.0000, -75.8167 Saint-Amand-Montrond, France, 46.7000, 2.5100 Gorgab, Iran, 32.8661, 51.5972 Loreto, Philippines, 10.3586, 125.5816 Pakhtaobod, Tajikistan, 38.4667, 68.1333 Litovel, Czechia, 49.7011, 17.0761 Brandis, Germany, 51.3347, 12.6089 Kitee, Finland, 62.1000, 30.1333 Oostzaan, Netherlands, 52.4333, 4.8833 Sigtuna, Sweden, 59.6167, 17.7167 Tarashcha, Ukraine, 49.5500, 30.5000 Grado, Spain, 43.3881, -6.0736 Ban Bueng Kok, Thailand, 16.6833, 100.0333 Santamaguluru, India, 16.1303, 79.9486 Mohdra, India, 24.1849, 79.9577 Malhargarh, India, 24.2829, 74.9902 Velakkuttai, India, 12.6519, 78.6937 Revel, France, 43.4594, 2.0047 Raseiniai, Lithuania, 55.3797, 23.1239 Guifoes, Portugal, 41.2011, -8.6650 Aniva, Russia, 46.7167, 142.5167 Hoeselt, Belgium, 50.8500, 5.4833 Bohechio, Dominican Republic, 18.7700, -70.9800 Savja, Sweden, 59.8333, 17.6833 Kalymnos, Greece, 36.9900, 26.9850 Saint-Vith, Belgium, 50.2797, 6.1275 Jagtial, India, 18.7895, 78.9120 Santo Tomas de los Platanos, Mexico, 19.1817, -100.2589 Pueblo Viejo, Mexico, 19.1790, -100.2984 Canonsburg, United States, 40.2643, -80.1867 Stoneham-et-Tewkesbury, Canada, 47.1667, -71.4333 Ventania, Brazil, -24.2458, -50.2428 Concordia, Colombia, 10.2667, -74.8333 Fuli, Taiwan, 23.1333, 121.2833 Benkovac, Croatia, 44.0344, 15.6128 Lentvaris, Lithuania, 54.6333, 25.0500 Amritpur, Nepal, 28.1196, 81.5965 Radekhiv, Ukraine, 50.2828, 24.6375 Alfred and Plantagenet, Canada, 45.5667, -74.9167 Alberdi, Paraguay, -26.1873, -58.1426 Jennings, United States, 30.2233, -92.6582 Pulluru, India, 16.8301, 80.6226 Pondaluru, India, 14.2535, 79.2408 Perumbalam, India, 9.8500, 76.3667 Ak-Suu, Kyrgyzstan, 42.8092, 74.1001 Jibou, Romania, 47.2667, 23.2500 Makri, India, 24.3860, 83.5559 Piprai, India, 24.5097, 77.9642 Thap Khlo, Thailand, 16.1600, 100.5966 Ban Kang, Thailand, 18.5444, 98.8889 Ingichka, Uzbekistan, 39.7389, 65.9922 Lambeth, United Kingdom, 51.4900, -0.1190 Pindra, India, 24.9595, 80.7879 Crosia, Italy, 39.5667, 16.7667 Lurate Caccivio, Italy, 45.7667, 9.0000 Monki, Poland, 53.4000, 22.8000 Chuy, Uruguay, -33.6964, -53.4600 Saint-Sulpice-la-Pointe, France, 43.7750, 1.6872 Madanpur, India, 24.6554, 84.5844 Dinara, India, 25.4613, 78.3205 Ottappidaram, India, 8.9127, 78.0218 Castellamonte, Italy, 45.3820, 7.7121 Zoudjame, Benin, 6.8167, 1.8667 Tuta, Colombia, 5.7000, -73.2333 Grossrohrsdorf, Germany, 51.1444, 14.0167 Barcs, Hungary, 45.9600, 17.4600 Lindesberg, Sweden, 59.6024, 15.2130 Pathari, India, 23.9333, 78.2167 Sidi Bousber, Morocco, 34.5667, -5.3667 San Gregorio Atzompa, Mexico, 19.0224, -98.3445 Inacio Martins, Brazil, -25.5708, -51.0789 Byalynichy, Belarus, 53.9956, 29.7094 Makhar, India, 25.7693, 86.6025 Donabate, Ireland, 53.4872, -6.1519 Zumarraga, Spain, 43.0831, -2.3167 Tepetlan, Mexico, 19.6667, -96.8000 Montigny-en-Gohelle, France, 50.4286, 2.9308 Parmanpur, India, 26.1457, 87.3122 Laligam, India, 12.0500, 78.1500 Velpuru, India, 16.1496, 79.8630 Bithauli, India, 26.0219, 86.0793 Talachyn, Belarus, 54.4167, 29.7000 Klotze, Germany, 52.6263, 11.1616 Bondues, France, 50.7022, 3.0939 Manrar, India, 25.8895, 85.0643 Langar, Tajikistan, 39.4500, 69.5500 Flossmoor, United States, 41.5391, -87.6858 Huachipato, Chile, -36.7481, -73.0986 Schulzendorf, Germany, 52.3667, 13.5831 San Francisco la Union, Guatemala, 14.9167, -91.5333 Cepin, Croatia, 45.5236, 18.5633 Picture Rocks, United States, 32.3274, -111.2558 Orotina, Costa Rica, 9.9024, -84.5250 Lower Swatara, United States, 40.2188, -76.7602 Bradwell, United Kingdom, 52.0500, -0.7870 Thepaha Raja Ram, India, 26.2229, 84.2523 Reddippatti, India, 11.2100, 78.2166 Pareo, India, 25.5582, 84.8017 Alesd, Romania, 47.0572, 22.3969 Karimpur, India, 23.9700, 88.6200 Kishanpura Kalan, India, 30.9337, 75.3499 Embalse, Argentina, -32.1833, -64.4167 La Celia, Colombia, 5.0019, -76.0039 Canal Winchester, United States, 39.8437, -82.8126 Albert, France, 50.0028, 2.6528 Dundankop, India, 16.1400, 74.8100 Kadriye, Turkey, 36.8500, 31.0500 Sevilla La Nueva, Spain, 40.3475, -4.0286 Pembroke Dock, United Kingdom, 51.6930, -4.9460 Kannamangalam, India, 12.7499, 79.1518 Dahua, India, 24.7742, 87.0325 Monserrat, Spain, 39.3575, -0.6031 Talapalli, India, 18.1158, 78.5700 Salmanshahr, Iran, 36.7058, 51.1975 Hillsborough, United States, 36.0679, -79.0991 Jucurucu, Brazil, -16.8428, -40.1589 Bad Breisig, Germany, 50.5092, 7.2964 Inverell, Australia, -29.7667, 151.1167 Brewer, United States, 44.7835, -68.7352 Barahbatta, India, 25.7727, 85.7522 Darnetal, France, 49.4453, 1.1519 Dandkhora, India, 25.5729, 87.6472 Palmares Paulista, Brazil, -21.0828, -48.8008 Saint-Doulchard, France, 47.1056, 2.3575 Hardia, India, 25.8657, 86.2176 Tiruvambalapuram, India, 8.2514, 77.7752 Konidena, India, 16.0156, 80.0570 Nova Bassano, Brazil, -28.7239, -51.7050 Grimmen, Germany, 54.1100, 13.0414 Dhorgaon, India, 25.9545, 86.8933 Comala, Mexico, 19.3208, -103.7603 Sangonera la Verde, Spain, 37.9333, -1.2000 Ameskroud, Morocco, 30.5308, -9.3283 Lumina, Romania, 44.2833, 28.5667 Cervello, Spain, 41.3978, 1.9578 Tuam, Ireland, 53.5167, -8.8500 Simrol, India, 22.5387, 75.9111 Huittinen, Finland, 61.1750, 22.7000 Mont-Tremblant, Canada, 46.1167, -74.6000 Ikkarai Boluvampatti, India, 10.9669, 76.7996 Tirua, Chile, -38.3414, -73.4911 Akabira, Japan, 43.5500, 142.0500 Delcevo, North Macedonia, 41.9661, 22.7747 Topsham, United States, 43.9614, -69.9587 Glenfield, United Kingdom, 52.6491, -1.2062 Nanjundapuram, India, 11.0857, 76.8726 Kataha, India, 26.7159, 84.9424 Torihama, Japan, 35.6006, 135.9406 Sunbury, United States, 40.8616, -76.7871 Beltangadi, India, 12.9795, 75.2699 Ban Dong Mada, Thailand, 19.7237, 99.7153 Ban Lao Yao, Thailand, 18.3667, 98.7833 Segorbe, Spain, 39.8500, -0.4833 Fron, Norway, 59.9347, 10.7089 Hockley, United Kingdom, 51.6014, 0.6363 Bendrahalli, India, 12.2642, 78.3223 Piploda, India, 23.6073, 74.9420 Kathurah, India, 29.0860, 76.5820 San Lorenzo della Costa, Italy, 44.3389, 9.1866 Pereshchepyne, Ukraine, 49.0167, 35.3500 Venecia, Costa Rica, 10.3357, -84.2859 Fernan-Nunez, Spain, 37.6667, -4.7167 Adamankottai, India, 12.0742, 78.1237 Sidi El Hattab, Morocco, 32.2667, -7.2833 Burlington, United States, 48.4676, -122.3298 Hohenhameln, Germany, 52.2600, 10.0664 Bhagsar, India, 30.4417, 74.4023 Santa Ana, Venezuela, 9.3056, -64.6548 Matawan, United States, 40.4127, -74.2365 Tabernes Blanques, Spain, 39.5083, -0.3656 Broni, Italy, 45.0619, 9.2611 Argelato, Italy, 44.6425, 11.3486 Racconigi, Italy, 44.7667, 7.6833 Cerkes, Turkey, 40.8139, 32.8908 Brownsville, United States, 35.5890, -89.2578 Sallaumines, France, 50.4203, 2.8631 Aldenham, United Kingdom, 51.6723, -0.3546 Kranidi, Greece, 37.3800, 23.1590 Godhra, India, 20.9231, 70.9214 Madari Hat, India, 26.7000, 89.2833 South Strabane, United States, 40.1756, -80.1910 Filadelfia, Colombia, 5.3000, -75.6000 Huntington, United Kingdom, 53.9926, -1.0430 Vysokyi, Ukraine, 49.8875, 36.1211 Corro de Vall, Spain, 41.6278, 2.2972 Dobre Miasto, Poland, 53.9875, 20.3958 El Haouaria, Tunisia, 37.0500, 11.0167 Tiptree, United Kingdom, 51.8100, 0.7500 Bochaha, India, 25.5675, 85.7393 Banska Stiavnica, Slovakia, 48.4586, 18.8931 Lancon-Provence, France, 43.5930, 5.1286 Kudowa-Zdroj, Poland, 50.4383, 16.2397 Pinhel, Portugal, 40.7833, -7.0667 Walker Mill, United States, 38.8758, -76.8854 Wertingen, Germany, 48.5333, 10.6667 Gundi, India, 18.6237, 79.0923 Nambutalai, India, 9.7277, 79.0071 Uracoa, Venezuela, 8.9943, -62.3520 Kushijima, Japan, 32.7400, 130.7572 Boujediane, Morocco, 35.1114, -5.7823 Colonia Nicolich, Uruguay, -34.8167, -56.0167 Campo Ere, Brazil, -26.3939, -53.0778 Colmenarejo, Spain, 40.5608, -4.0169 Shyroke, Ukraine, 47.6844, 33.2728 Aweitancun, China, 47.7251, 88.0499 Miltenberg, Germany, 49.7039, 9.2644 Sigatoka, Fiji, -18.1500, 177.5000 Middletown, United States, 38.2410, -85.5214 Bala Cynwyd, United States, 40.0116, -75.2283 Narpes, Finland, 62.4667, 21.3333 Csorna, Hungary, 47.6167, 17.2500 Sabangan, Philippines, 17.0044, 120.9233 Villarrubia de los Ojos, Spain, 39.2167, -3.6000 Anantpur, India, 16.8890, 75.0146 Bilaspur, India, 30.3200, 77.3200 Masku, Finland, 60.5667, 22.1000 Tuzluca, Turkey, 40.0494, 43.6608 Port Elgin, Canada, 44.4333, -81.3833 Flexeiras, Brazil, -9.2728, -35.7150 Nowy Dwor Gdanski, Poland, 54.2167, 19.1167 Saint-Zotique, Canada, 45.2500, -74.2500 Basse-Goulaine, France, 47.2161, -1.4642 Tadhwa Nandpur, India, 26.7556, 84.4326 Babhantoli, India, 26.2520, 87.9260 Widnau, Switzerland, 47.3997, 9.6333 Neuville-les-Dieppe, France, 49.9267, 1.1014 Datori, Benin, 10.4017, 0.7828 Caernarfon, United Kingdom, 53.1400, -4.2700 Boves, Italy, 44.3333, 7.5500 Saint-Raymond, Canada, 46.9000, -71.8333 Judenburg, Austria, 47.1725, 14.6603 Caldas de Reyes, Spain, 42.6028, -8.6383 Karadka, India, 12.5333, 75.1333 Masar, India, 25.5577, 84.5767 Kfar Aabida, Lebanon, 34.2264, 35.6600 Wladyslawowo, Poland, 54.8339, 18.3156 Bowen, Australia, -20.0102, 148.2416 Rampur, India, 25.1826, 86.1465 Epalinges, Switzerland, 46.5500, 6.6667 Gandlapenta, India, 14.0500, 78.3089 Haripur, India, 26.2580, 87.2420 Mangalam, India, 11.6368, 79.2806 Douar Lehouifrat, Morocco, 32.2800, -8.3100 Muyinga, Burundi, -2.8500, 30.3333 Thogaduru, India, 12.0957, 76.8078 Kirlampudi, India, 17.1919, 82.1825 Tila, Mexico, 17.3000, -92.4333 Cuprija, Serbia, 43.9231, 21.3686 Tottenham, Canada, 44.0238, -79.8045 Mooresville, United States, 39.6022, -86.3681 Dasso, Benin, 7.0167, 2.4667 Mortagua, Portugal, 40.3947, -8.2328 Orange Cove, United States, 36.6211, -119.3188 Crosne, France, 48.7164, 2.4580 Yazikonak, Turkey, 38.6167, 39.3000 Dessel, Belgium, 51.2396, 5.1131 Sangyuan, China, 33.0453, 107.6268 Postojna, Slovenia, 45.7759, 14.2137 Sannicandro di Bari, Italy, 41.0000, 16.8000 Branquinha, Brazil, -9.2458, -36.0150 Guateque, Colombia, 5.0056, -73.4722 Bhawanandpur, India, 25.5400, 86.1030 Nakaechi, Japan, 35.5499, 139.4476 Gateway, United States, 26.5793, -81.7446 Gibsons, Canada, 49.4028, -123.5036 Eschenbach, Switzerland, 47.2398, 8.9216 Palu, Turkey, 38.7039, 39.9511 Hochberg, Germany, 49.7831, 9.8817 Hindoli, India, 25.4000, 75.8300 Fredonia, United States, 42.4407, -79.3319 Nurobod Shahri, Uzbekistan, 39.6086, 66.2867 Winchester, United States, 35.1898, -86.1075 Ogdensburg, United States, 44.7088, -75.4717 Khesht, Iran, 29.5633, 51.3350 Lititz, United States, 40.1540, -76.3044 Bethel, United States, 39.8458, -75.4891 Yalaguina, Nicaragua, 13.4833, -86.4833 Targu Frumos, Romania, 47.2097, 27.0131 Balsamo, Brazil, -20.7350, -49.5839 Petua, India, 22.4143, 88.4489 Psychiko, Greece, 38.0167, 23.7667 Dobhawan, India, 25.3987, 85.7856 Has, Syria, 35.6161, 36.5907 Xicotencatl, Mexico, 22.9958, -98.9447 Sabinanigo, Spain, 42.5144, -0.3744 Gonikoppal, India, 12.1830, 75.9294 Chavuttahalli, India, 12.4202, 78.2352 Ban Nam Dip Luang, Thailand, 18.4500, 98.8333 Ehringshausen, Germany, 50.6000, 8.3833 Chilpur, India, 18.2388, 79.4529 Trzebiatow, Poland, 54.0572, 15.2786 Ferros, Brazil, -19.2319, -43.0228 Kudayattur, India, 9.8167, 76.7833 Agoue, Benin, 6.2500, 1.6833 Soanpeta, India, 18.9586, 78.3610 Majali, India, 14.9000, 74.1000 Orange Lake, United States, 41.5369, -74.1005 Sulibele, India, 13.1667, 77.8000 Casaluce, Italy, 41.0020, 14.1983 Wiang Sa, Thailand, 8.6358, 99.3666 Greenville, United States, 40.9986, -73.8189 Henderson, Argentina, -36.2833, -61.7167 Luckau, Germany, 51.8500, 13.7167 Pachhapur, India, 16.0955, 74.6875 Banaso, India, 23.9884, 85.7866 Sarahs, Turkmenistan, 36.5333, 61.2167 Wielsbeke, Belgium, 50.9000, 3.3667 Boxley, United Kingdom, 51.3024, 0.5429 Enkakad, India, 10.6500, 76.2500 Ratnahalli, India, 12.3652, 76.5020 Ekma, India, 26.0541, 86.6121 Puduppattanam, India, 10.7626, 79.1616 Cingoli, Italy, 43.3742, 13.2164 Shiyuan, China, 35.7991, 102.8437 Rellivalasa, India, 17.9108, 83.4100 Talavadi, India, 11.7780, 77.0055 Ramree, Burma, 19.0833, 93.8667 Perumbalai, India, 11.9635, 77.9375 Pagidyala, India, 15.9333, 78.3333 Avanashipalaiyam, India, 10.9696, 77.4352 Lizzano, Italy, 40.3919, 17.4483 Aucamville, France, 43.6697, 1.4311 Vasilika, Greece, 40.4800, 23.1367 Hlinsko, Czechia, 49.7622, 15.9075 Ratne, Ukraine, 51.6500, 24.5333 Lago Ranco, Chile, -40.3167, -72.5000 Gamharia, India, 26.0561, 86.7243 Photharam, Thailand, 13.6923, 99.8497 Country Club Estates, United States, 31.2113, -81.4622 Silver City, United States, 32.7783, -108.2699 Petrolina de Goias, Brazil, -16.0950, -49.3378 Villa Aldama, Mexico, 19.6500, -97.2333 Mohelnice, Czechia, 49.7769, 16.9194 Parur, India, 11.5793, 79.2550 Cuervos, Mexico, 32.6308, -114.8569 Fauske, Norway, 67.2627, 15.3913 Ban Wiang Ka Long, Thailand, 19.2332, 99.5165 Sarmera, India, 25.2564, 85.7988 Jaisinghnagar, India, 23.6260, 78.5726 Cesa, Italy, 40.9603, 14.2301 Zorneding, Germany, 48.0833, 11.8333 Sanampudi, India, 16.0860, 79.8350 Greenwood, United States, 35.2134, -94.2408 Aire-sur-la-Lys, France, 50.6400, 2.4000 Gawan, India, 28.4300, 78.3500 Terkhed, India, 18.4450, 75.8367 Ittikelakunta, India, 16.6797, 81.7094 Ghomrassen, Tunisia, 33.0592, 10.3400 Molbergen, Germany, 52.8667, 7.9333 Aschheim, Germany, 48.1733, 11.7178 Kochgawan, India, 25.0431, 85.6279 Mae Rim, Thailand, 18.9106, 98.9480 Middletown, United States, 40.2010, -76.7289 Nandamuru, India, 16.8458, 81.6466 Karczew, Poland, 52.0833, 21.2500 Daulatpur, India, 25.3682, 87.8983 Sitebe, South Africa, -29.0890, 31.4320 North College Hill, United States, 39.2175, -84.5520 Maliano, Spain, 43.4186, -3.8350 Savignano sul Panaro, Italy, 44.4833, 11.0333 Sorbolo, Italy, 44.8463, 10.4486 Szubin, Poland, 53.0167, 17.7500 San Sebastian de la Gomera, Spain, 28.0922, -17.1100 Baretha, India, 25.5258, 87.4485 Oulad Amor, Morocco, 32.0775, -7.6122 Borogani, Moldova, 46.5028, 28.5442 Surany, Slovakia, 48.0833, 18.1833 Chansolme, Haiti, 19.8833, -72.8333 Kayyngdy, Kyrgyzstan, 42.8247, 73.6758 Browns Mills, United States, 39.9737, -74.5690 La Paz, Argentina, -33.4667, -67.5500 Xiada, China, 24.0391, 113.4543 Toging am Inn, Germany, 48.2500, 12.5667 Avalurpet, India, 12.3800, 79.3465 Adesar, India, 23.5589, 70.9833 Mianpur Dubauli, India, 26.7381, 84.4661 Nieuwleusen, Netherlands, 52.5833, 6.2833 Louisville, United States, 40.8370, -81.2643 Koranampatti, India, 11.6085, 77.9049 Traversetolo, Italy, 44.6399, 10.3818 Phangnga, Thailand, 8.4644, 98.5317 Palankottai, India, 9.1356, 77.6952 Bisaria, India, 25.9789, 87.1003 Paranacity, Brazil, -22.9300, -52.1508 Semri, India, 22.6833, 78.0833 Zymohiria, Ukraine, 48.5819, 38.9319 Vares, Bosnia and Herzegovina, 44.1644, 18.3283 Parauli, India, 26.2227, 84.7042 Virapandiyanpattanam, India, 8.5200, 78.1181 Dombarovskiy, Russia, 50.7550, 59.5331 Leers, France, 50.6825, 3.2447 Kamargani, India, 22.5475, 88.6606 Dumra, India, 25.5907, 87.0614 Vemulanarva, India, 16.9920, 80.2824 Senmanat, Spain, 41.6092, 2.1369 Saldus, Latvia, 56.6667, 22.4936 Wepener, South Africa, -29.7333, 27.0333 Herkimer, United States, 43.0610, -74.9894 Port Perry, Canada, 44.1000, -78.9333 Cacimbinhas, Brazil, -9.4000, -36.9900 Nazira, India, 22.2180, 88.2757 Ivangorod, Russia, 59.3667, 28.2167 Bladensburg, United States, 38.9424, -76.9264 Kondaparti, India, 17.9219, 79.5373 Fontoura Xavier, Brazil, -28.9828, -52.3458 Audenge, France, 44.6847, -1.0119 Ekalbehri, India, 21.8933, 78.8794 Bridge City, United States, 30.0298, -93.8406 Sirsa, India, 26.2667, 84.7403 Vardhamankota, India, 17.3775, 79.4410 Amherst, Canada, 45.8167, -64.2167 Teixeira Soares, Brazil, -25.3678, -50.4608 Burela de Cabo, Spain, 43.6500, -7.4000 Saint-Remy-de-Provence, France, 43.7900, 4.8325 Gobindpura, India, 30.2805, 75.0187 Dakpatthar, India, 30.4969, 77.7989 Kannulu, India, 12.8685, 74.9025 Sangi, India, 26.3237, 86.4481 Cape Elizabeth, United States, 43.5891, -70.2380 Salehpur, India, 25.6119, 87.2973 Atmakur, India, 18.0718, 79.7386 Arrapalli, India, 18.0718, 79.7386 Fitampito, Madagascar, -20.9626, 46.3075 Fishersville, United States, 38.1050, -78.9826 Igrim, Russia, 63.1933, 64.4194 Elizabethtown-Kitley, Canada, 44.7000, -75.8833 Cunday, Colombia, 4.0833, -74.6667 Thikri, India, 22.0634, 75.4007 Dabhaura, India, 25.1162, 81.3044 Naruar, India, 26.2388, 86.2396 Harding, South Africa, -30.5833, 29.8833 Oakland, United States, 35.2256, -89.5372 Litchfield Beach, United States, 33.4773, -79.1181 Rauco, Chile, -34.9167, -71.3167 Canoas, Costa Rica, 8.5333, -82.8333 Berchha, India, 23.2823, 76.3199 Gangadhar, India, 18.5883, 79.0110 Paso Canoas, Panama, 8.5333, -82.8333 Kadikoy, Turkey, 40.6167, 29.2333 Claymont, United States, 39.8032, -75.4607 Chita, Colombia, 6.1667, -72.4167 Bjarred, Sweden, 55.7167, 13.0167 Perols, France, 43.5658, 3.9511 Dodarasinakere, India, 12.5083, 77.0200 Conselice, Italy, 44.5167, 11.8333 Lototla, Mexico, 20.8392, -98.7178 Nieuw-Lekkerland, Netherlands, 51.8833, 4.6833 El Cacao, Dominican Republic, 18.5200, -70.3000 Lescar, France, 43.3336, -0.4347 Qorveh, Iran, 35.3089, 49.1011 Minakshipuram, India, 9.9908, 77.3709 Kanhai, India, 25.9761, 86.2898 Udburu, India, 23.0333, 85.3667 Capitan Mauricio Jose Troche, Paraguay, -25.6189, -56.2769 Esopus, United States, 41.8425, -73.9936 Listowel, Canada, 43.7351, -80.9533 Kakamas, South Africa, -28.8000, 20.6500 Sebnitz, Germany, 50.9667, 14.2833 Khundawandpur, India, 25.6689, 86.0363 Volterra, Italy, 43.4000, 10.8667 Mama Khel, Afghanistan, 34.2500, 70.0100 Padul, Spain, 37.0244, -3.6267 Newburn, United Kingdom, 54.9830, -1.7430 Navani, India, 11.3709, 78.1380 Ekhari, India, 26.5246, 86.3071 Khaspur, India, 25.6466, 84.9936 Mechanicsburg, United States, 40.2115, -77.0060 Maravilha, Brazil, -9.2358, -37.3500 Saint-Jean-le-Blanc, France, 47.8928, 1.9183 Rombas, France, 49.2503, 6.0950 Jalkaura, India, 25.5034, 86.3671 Piedras Blancas, Spain, 43.5600, -5.9760 Cervera, Spain, 41.6656, 1.2714 Barskoon, Kyrgyzstan, 42.1579, 77.6036 Chanal, Mexico, 16.6489, -92.2214 Ban Phan Chali, Thailand, 16.6300, 100.4800 Helena Valley Southeast, United States, 46.6219, -111.8973 South Abington, United States, 41.4900, -75.6891 Kaikaram, India, 16.8120, 81.3660 Vatakemuri, India, 10.4300, 76.1200 Menzel Kamel, Tunisia, 35.6333, 10.6667 Jianshi, Taiwan, 24.7053, 121.2014 Jinshui, Taiwan, 24.5761, 121.3081 Rampur Rajwa, India, 25.7057, 86.1781 Crystal Beach, Canada, 42.8661, -79.0624 Pagqen, China, 33.9686, 99.9010 Pedra Badejo, Cabo Verde, 15.1375, -23.5333 Cuellar, Spain, 41.4009, -4.3136 Somvarpet, India, 12.5970, 75.8496 Yamakita, Japan, 35.3500, 139.0667 Tounfafi, Niger, 14.0464, 5.9812 Mallampalli, India, 18.1105, 79.8494 Falam, Burma, 22.9136, 93.6778 Santa Rosa del Penon, Nicaragua, 12.8000, -86.3667 Dombasle-sur-Meurthe, France, 48.6256, 6.3506 Dar Si Aissa, Morocco, 32.4199, -8.9080 Barwadih, India, 23.8478, 84.1105 Madhopur, India, 26.7369, 85.0625 Castel Bolognese, Italy, 44.3167, 11.8000 Grinnell, United States, 41.7359, -92.7244 Santa Maria, Argentina, -31.2611, -64.4639 Arques, France, 50.7361, 2.3033 Kourimat, Morocco, 31.4500, -9.3167 Ankadimanga, Madagascar, -18.9856, 47.7568 Raun, India, 26.3431, 78.9443 Sroda Slaska, Poland, 51.1500, 16.5833 La Reina, El Salvador, 14.1833, -89.1500 Itasca, United States, 41.9772, -88.0183 Belmont, United States, 39.0622, -77.4985 Vallet, France, 47.1622, -1.2656 Cuorgne, Italy, 45.3897, 7.6498 Ivins, United States, 37.1742, -113.6809 Atari, India, 31.6008, 74.6056 Tadworth, United Kingdom, 51.2940, -0.2420 Burayevo, Russia, 55.8397, 55.4044 Byarozawka, Belarus, 53.7167, 25.5000 Manbazar, India, 23.0615, 86.6642 Valaiyampattu, India, 12.6927, 78.6347 Paharpur, India, 25.7225, 86.6203 Girard, United States, 41.1665, -80.6963 Countryside, United States, 39.0518, -77.4124 Farsala, Greece, 39.3000, 22.3833 Pryor Creek, United States, 36.2996, -95.3107 Aguia Branca, Brazil, -18.9828, -40.7400 Bad Gandersheim, Germany, 51.8719, 10.0253 Llantwit Major, United Kingdom, 51.4062, -3.4750 Nikel, Russia, 69.4139, 30.2319 Runkel, Germany, 50.4053, 8.1550 Madhura, India, 25.5418, 87.5267 Shevington, United Kingdom, 53.5720, -2.6900 Tlahualilo de Zaragoza, Mexico, 26.1083, -103.4431 Basco, Philippines, 20.4500, 121.9700 Oil City, United States, 41.4281, -79.7036 Smiths Falls, Canada, 44.9000, -76.0167 Castelfranco di Sopra, Italy, 43.6236, 11.5583 St. Anthony, United States, 45.0278, -93.2174 Janapul, India, 22.8615, 88.6868 Seybaplaya, Mexico, 19.6394, -90.6883 Sztum, Poland, 53.9217, 19.0336 Adivala, India, 13.9131, 76.6619 Byureghavan, Armenia, 40.3147, 44.5936 Sendamangalam, India, 11.7431, 79.3790 Oulad Chbana, Morocco, 33.0500, -7.3833 Salcea, Romania, 47.6500, 26.3700 Amityville, United States, 40.6696, -73.4156 Ban Nong Tong, Thailand, 18.6115, 98.9466 Anaconda, United States, 46.0608, -113.0678 Kalladai, India, 10.7272, 78.4634 Sabaoani, Romania, 47.0167, 26.8500 Bluefield, United States, 37.2608, -81.2143 Sikandarpur, India, 25.3256, 86.5051 Manchenahalli, India, 13.5007, 77.6035 Rampur Parhat, India, 25.5916, 87.1622 Oosterwolde, Netherlands, 52.9903, 6.2914 Llagostera, Spain, 41.8292, 2.8933 Khagam, India, 27.3200, 95.9000 Vandam, Azerbaijan, 40.9460, 47.9436 Trovagunta, India, 15.5509, 80.0589 Nittenau, Germany, 49.2000, 12.2667 Beauchamp, France, 49.0144, 2.1906 Vaprio d'Adda, Italy, 45.5767, 9.5297 Bougou, Benin, 9.4333, 1.6167 Kujri, India, 26.2392, 87.6366 Anjukulippatti, India, 10.2444, 78.0794 Tomah, United States, 43.9879, -90.4999 Olivares, Spain, 37.4167, -6.1500 Garlasco, Italy, 45.2000, 8.9167 Coamo, Puerto Rico, 18.0765, -66.3638 Wagner, Brazil, -12.2869, -41.1678 Dhantola, India, 26.2016, 88.1095 Arenapolis, Brazil, -14.4503, -56.8461 Onverwacht, South Africa, -23.6850, 27.6960 Pleasant Grove, United States, 33.4940, -86.9782 Lorraine, Canada, 45.6833, -73.7833 Sonsoro, Benin, 11.0875, 2.7597 Bisignano, Italy, 39.5073, 16.2811 Muh Hasan, Syria, 35.2335, 40.3166 Jingjiazhuang, China, 40.4703, 116.0869 Bagor, India, 25.3575, 74.3731 Nathana, India, 30.3155, 75.0931 Ranigaon, India, 27.1000, 74.4167 Mangrawan, India, 25.0929, 84.3912 Ngaparou, Senegal, 14.4642, -17.0562 Tambura, South Sudan, 5.6000, 27.4667 Bulisa, Uganda, 2.1217, 31.4156 Clarksville, United States, 35.4570, -93.4803 L'Isle-Jourdain, France, 43.6144, 1.0817 Habo, Sweden, 57.9066, 14.0856 Dagbe, Benin, 6.5667, 2.6833 Muddada, India, 18.2385, 83.8687 Gaada, Morocco, 35.1594, -2.9892 Fochville, South Africa, -26.4833, 27.4833 Saint-Barthelemy-d'Anjou, France, 47.4680, -0.4930 Szigetvar, Hungary, 46.0475, 17.7994 Ilami, India, 24.6776, 87.8804 Devmaudaldal, India, 24.6312, 81.1594 Aliabad, Azerbaijan, 39.2286, 45.3982 Pedro Luro, Argentina, -39.5000, -62.6833 Bom Principio, Brazil, -29.4889, -51.3528 Luchow, Germany, 52.9667, 11.1500 Sokotindji, Benin, 10.8528, 3.4297 Tixter, Algeria, 36.0500, 5.0833 Baghduma, India, 24.8223, 87.0116 Kaithwar, India, 26.1678, 86.2575 Valtoha, India, 31.2074, 74.6423 Kanchanadit, Thailand, 9.1661, 99.4701 Quincy-sous-Senart, France, 48.6714, 2.5407 Miastko, Poland, 54.0167, 16.9833 Saltsjobaden, Sweden, 59.2833, 18.3000 Madhuban Bediban, India, 26.5062, 84.9951 Karath, India, 25.2010, 84.3672 Mehdipur, India, 25.3902, 86.7324 Pokrovske, Ukraine, 47.9825, 36.2339 Springs, United States, 41.0212, -72.1584 Richmond Heights, United States, 25.6347, -80.3721 Astorp, Sweden, 56.1333, 12.9500 Ramara, Canada, 44.6333, -79.2167 Mentone, United States, 34.0609, -117.1108 Maizal, Dominican Republic, 19.6500, -71.0300 Narayanraopet, India, 18.2114, 78.7794 Hesarghatta, India, 13.1391, 77.4783 Malaudh, India, 30.6333, 75.9356 Katigang, India, 25.4157, 87.8245 Nadimpalem, India, 16.2123, 80.3097 Chevy Chase, United States, 38.9944, -77.0738 Florence, United States, 43.9916, -124.1063 Woodway, United States, 31.4988, -97.2314 Deh-e Shu, Afghanistan, 30.4344, 63.3183 Ekchari, India, 25.2093, 87.2159 Viralimalai, India, 10.6023, 78.5471 Parsons, United States, 37.3405, -95.2958 Nova Veneza, Brazil, -16.3708, -49.3228 Tamentit, Algeria, 27.7672, -0.2678 Bures-sur-Yvette, France, 48.6969, 2.1639 Eidson Road, United States, 28.6677, -100.4788 Solsona, Spain, 41.9978, 1.5208 Tepperumalnallur, India, 10.9694, 79.4254 Durgi, India, 16.4286, 79.5406 Terrace Heights, United States, 46.6045, -120.4393 Oakwood, United States, 39.7202, -84.1734 Zwenkau, Germany, 51.2175, 12.3242 Elne, France, 42.5997, 2.9710 Corella, Philippines, 9.6800, 123.9200 Periya Pattanam, India, 9.2726, 78.9023 Zhangping, China, 37.5667, 112.8667 Rochelle, United States, 41.9197, -89.0629 Ohrdruf, Germany, 50.8281, 10.7328 Gudalur, India, 10.7830, 78.4232 Bimun, India, 34.0588, 74.7539 Zawyat Sidi al Mekki, Morocco, 33.2120, -7.7170 Sabana Grande, Puerto Rico, 18.0832, -66.9645 Palamos, Spain, 41.8500, 3.1292 Molagavalli, India, 15.3567, 77.3301 Lugoff, United States, 34.2113, -80.6973 Highfields, Australia, -27.4633, 151.9458 Santa Maria Jacatepec, Mexico, 17.8500, -96.2000 Kisslegg, Germany, 47.7900, 9.8842 Berlin, United States, 44.4869, -71.2599 Rain, Germany, 48.6833, 10.9167 Brierfield, United Kingdom, 53.8240, -2.2350 Musapur, India, 25.6821, 85.7346 Malaimachchampatti, India, 10.9058, 77.0050 Israna, India, 29.2739, 76.8461 Sundarsi, India, 23.2688, 76.4399 Ban Krot, Thailand, 14.3009, 100.6002 Cekerek, Turkey, 40.0731, 35.4947 LaSalle, United States, 41.3589, -89.0737 Notre-Dame-des-Prairies, Canada, 46.0500, -73.4333 New Mills, United Kingdom, 53.3670, -2.0070 Anan'evo, Kyrgyzstan, 42.7364, 77.6738 Puszczykowo, Poland, 52.2817, 16.8542 The Village, United States, 35.5706, -97.5567 Elurpatti, India, 11.0234, 78.2844 Asahni, India, 26.0079, 84.4799 Berkine, Morocco, 33.7665, -3.8438 Marne, India, 13.3284, 75.0113 Alawalpur, India, 31.4316, 75.6561 Casca, Brazil, -28.5608, -51.9778 Savenay, France, 47.3619, -1.9406 Cherasco, Italy, 44.6500, 7.8667 Kobeliaky, Ukraine, 49.1333, 34.2000 Bull Mountain, United States, 45.4125, -122.8320 Leeds and the Thousand Islands, Canada, 44.4500, -76.0800 Uppur, India, 13.3945, 74.7657 Denyekoro, Mali, 12.3603, -6.7078 Nehoiu, Romania, 45.3531, 26.3050 Rockcreek, United States, 45.5526, -122.8760 Koufalia, Greece, 40.7783, 22.5767 Halen, Belgium, 50.9481, 5.1144 Quixabeira, Brazil, -11.4119, -40.1278 Wilkau-Hasslau, Germany, 50.6667, 12.5167 Tonneins, France, 44.3906, 0.3092 Inole, India, 17.8682, 79.5545 Brockton, Canada, 44.1667, -81.2167 Cambira, Brazil, -23.5828, -51.5778 Costesti, Romania, 44.6697, 24.8800 Syurte, Ukraine, 48.5038, 22.2267 Perg, Austria, 48.2503, 14.6336 Bitton, United Kingdom, 51.4248, -2.4600 Gangapur, India, 25.8565, 86.9496 Oakbrook, United States, 38.9996, -84.6797 Arenys de Munt, Spain, 41.6100, 2.5400 Legnaro, Italy, 45.3456, 11.9639 Jacinto City, United States, 29.7663, -95.2410 Monmouth Junction, United States, 40.3754, -74.5582 Mareno di Piave, Italy, 45.8409, 12.3520 Halls, United States, 36.0817, -83.9344 Borzna, Ukraine, 51.2531, 32.4292 Madeira, United States, 39.1856, -84.3734 Gold, India, 33.5874, 74.1445 Ban Sathan, Thailand, 18.2667, 100.7167 Kerap, India, 24.8332, 84.6140 Shahrak-e Ja`fariyeh, Iran, 35.6617, 50.9947 Dolianova, Italy, 39.3785, 9.1784 Beckett Ridge, United States, 39.3448, -84.4380 Lucon, France, 46.4556, -1.1647 West Manheim, United States, 39.7458, -76.9431 Laurentian Valley, Canada, 45.7681, -77.2239 Idumbavanam, India, 10.4224, 79.6001 Narsingi, India, 17.3876, 78.3570 Bijeraghogarh, India, 23.9955, 80.6066 Steger, United States, 41.4723, -87.6176 Nort-sur-Erdre, France, 47.4403, -1.4972 Khawad, India, 23.5443, 72.4432 Erikolam, India, 12.1333, 75.2833 Guney, Turkey, 38.1544, 29.0678 Kadanadu, India, 11.4607, 76.7182 Sidi Abdallah, Morocco, 32.5783, -7.8108 Cicevac, Serbia, 43.7167, 21.4500 Negrine, Algeria, 34.4833, 7.5167 Kommuru, India, 16.0650, 80.3596 Gonghaur, India, 26.4346, 86.2160 Tissaf, Morocco, 33.4000, -3.5833 Dachengzicun, China, 40.3919, 117.1028 Novi Banovci, Serbia, 44.9500, 20.2833 Deruta, Italy, 42.9833, 12.4167 Wau, Papua New Guinea, -7.3389, 146.7167 Jisrayn, Syria, 33.5105, 36.3887 Werneuchen, Germany, 52.6333, 13.7333 Raitar, India, 25.0577, 85.5366 Tavarede, Portugal, 40.1664, -8.8444 Bilenke, Ukraine, 48.7664, 37.6314 Jantho, Indonesia, 5.3000, 95.6333 Monnickendam, Netherlands, 52.4667, 5.0333 Rorschach, Switzerland, 47.4786, 9.4936 Hohr-Grenzhausen, Germany, 50.4350, 7.6711 Hailey, United States, 43.5141, -114.3001 Tarmount, Algeria, 35.8167, 4.2833 Dhanga, India, 26.4630, 86.0452 Kankanalapalle, India, 15.9923, 79.4848 Fairfield, United States, 41.0064, -91.9667 Ashland, United States, 39.8782, -75.0085 Grosshansdorf, Germany, 53.6667, 10.2667 Pipra, India, 26.3460, 87.2916 Ilsenburg, Germany, 51.8667, 10.6833 Assi-Ben Okba, Algeria, 35.7294, -0.4658 Had Dra, Morocco, 31.5833, -9.5333 Wasilla, United States, 61.5770, -149.4660 Villacanas, Spain, 39.6333, -3.3333 Danesfahan, Iran, 35.8117, 49.7431 Borovskoy, Kazakhstan, 53.7964, 64.1894 Ban Bang Phlap, Thailand, 13.9385, 100.4528 Villa Canas, Argentina, -34.0000, -61.6000 Wiener Neudorf, Austria, 48.0833, 16.3167 Banikane, Mali, 16.9494, -1.7481 San Juanito de Escobedo, Mexico, 20.8000, -104.0000 Chewara, India, 25.0756, 85.9277 Mizhhiria, Ukraine, 48.5286, 23.5019 Teisendorf, Germany, 47.8500, 12.8167 Newmarket, United States, 43.0691, -70.9516 Aidlingen, Germany, 48.6792, 8.8969 Celtik, Turkey, 39.0244, 31.7906 Berezivka, Ukraine, 47.2039, 30.9128 Harlakhi, India, 26.6353, 85.9842 Rasol, India, 20.6298, 85.3126 Ghosrawan, India, 25.0910, 85.5780 Saidoke, India, 30.5267, 75.2867 Sgamna, Morocco, 32.7342, -7.2025 Huinca Renanco, Argentina, -34.8400, -64.3753 Swanage, United Kingdom, 50.6080, -1.9600 Medleri, India, 14.6667, 75.7333 Abra Pampa, Argentina, -22.7167, -65.7000 Lerici, Italy, 44.0763, 9.9111 Ban San Pong, Thailand, 18.9424, 98.9439 Khanpur Khairanti, India, 26.1456, 84.3334 Bairiya, India, 26.3392, 84.8236 Soubakaniedougou, Burkina Faso, 10.4824, -5.0098 Catral, Spain, 38.1594, -0.8050 Elurupadu, India, 16.5167, 81.3500 Santa Monica, Philippines, 10.0200, 126.0380 Odobesti, Romania, 45.7667, 27.0667 Ahus, Sweden, 55.9167, 14.2833 Hertzogville, South Africa, -28.1333, 25.5000 Carneirinho, Brazil, -19.6978, -50.6878 Aurahi, India, 25.8263, 87.1365 Dibraghani, India, 25.8261, 87.0664 Vadakethara, India, 10.6583, 76.4667 Ghanipur Bejha, India, 25.9281, 85.5548 Osterburg, Germany, 52.7833, 11.7667 Bray, United Kingdom, 51.5070, -0.7000 Basni, India, 25.4435, 82.8291 Alma, United States, 43.3799, -84.6556 Mono, Canada, 44.0167, -80.0667 Ipiranga do Piaui, Brazil, -6.8278, -41.7408 Budalur, India, 10.7861, 78.9864 Anjehalli, India, 12.1395, 77.9808 Naurhiya, India, 24.2069, 82.5655 Barrington, United States, 43.2139, -71.0424 Andergrove, Australia, -21.0930, 149.1855 Braslaw, Belarus, 55.6391, 27.0318 Embrach, Switzerland, 47.5103, 8.5933 Sadiqpur Maraul, India, 25.9966, 85.5777 Bendarhalli, India, 12.1500, 77.1000 Simarbani, India, 26.1953, 87.1769 Sivamalai, India, 11.0319, 77.5384 Estrela d'Oeste, Brazil, -20.2878, -50.4008 Jawasa, India, 26.6259, 78.7418 Bobil, India, 25.6269, 86.8069 San Francisco Libre, Nicaragua, 12.5000, -86.3000 An Chau, Vietnam, 21.3333, 106.8500 Sarpamari, India, 26.3073, 89.8666 Nirna, India, 17.7700, 77.1400 Barga, Italy, 44.0750, 10.4817 Chaplynka, Ukraine, 46.3644, 33.5331 Mezobereny, Hungary, 46.8256, 21.0289 Iawar, India, 23.0094, 76.5007 Khari, India, 33.3890, 75.1514 Cavriglia, Italy, 43.5216, 11.4864 Bystrzyca Klodzka, Poland, 50.3000, 16.6500 Charter Oak, United States, 34.1025, -117.8564 Mokrisset, Morocco, 34.9100, -5.3536 Carqueiranne, France, 43.0958, 6.0742 Muhammadganj, India, 26.1506, 87.0792 Kasba Tanora, Morocco, 32.4751, -6.1498 Halacho, Mexico, 20.4764, -90.0819 Ngoc Son, Vietnam, 21.3500, 106.0000 Sa Pa, Vietnam, 22.3356, 103.8419 Dharir, India, 22.3958, 88.8628 Tha Maka, Thailand, 13.8865, 99.8010 Dunblane, United Kingdom, 56.1883, -3.9642 Kallayi, India, 12.0051, 75.5830 Mohanpur, India, 25.5507, 85.3222 Yaxley, United Kingdom, 52.5200, -0.2600 St. Stephens, United States, 35.7642, -81.2746 Benbutucun, China, 42.0253, 86.7034 San Giovanni in Marignano, Italy, 43.9393, 12.7137 Gumusova, Turkey, 40.8500, 30.9333 Bastrop, United States, 32.7748, -91.9078 Anisio de Abreu, Brazil, -9.1889, -43.0458 Obernkirchen, Germany, 52.2664, 9.1178 Kovilpatti, India, 10.0283, 77.5809 Siano, Italy, 40.8025, 14.6944 Bellinzago Novarese, Italy, 45.5507, 8.6498 Southside, United States, 33.9007, -86.0238 Chahar Borj-e Qadim, Iran, 37.1256, 45.9783 Elmas, Italy, 39.2679, 9.0500 San Juan Bautista, Guatemala, 14.4167, -91.1833 Voitsberg, Austria, 47.0333, 15.1500 Ichenhausen, Germany, 48.3667, 10.3167 Hani i Elezit, Kosovo, 42.1500, 21.2967 Danau Kandimarg, India, 33.5646, 74.9754 Ramdeora, India, 27.0100, 71.9200 Altdorf, Switzerland, 46.8806, 8.6394 Ponneri, India, 12.5972, 78.5979 Mutis, Colombia, 6.2167, -77.4000 Kandel, Germany, 49.0833, 8.2000 Thames Ditton, United Kingdom, 51.3890, -0.3310 Hayle, United Kingdom, 50.1860, -5.4190 Ehningen, Germany, 48.6589, 8.9403 Ramkali, India, 22.4322, 88.3285 Recco, Italy, 44.3621, 9.1435 Tecklenburg, Germany, 52.2194, 7.8125 Pettampalaiyam, India, 11.3499, 77.5706 Dushanove, Kosovo, 42.2317, 20.7197 Pfedelbach, Germany, 49.1833, 9.5000 Devarapalle, India, 17.9886, 82.9811 Uppalaguptam, India, 16.5667, 82.1000 Piombino Dese, Italy, 45.6067, 11.9979 Kapelle-op-den-Bos, Belgium, 51.0167, 4.3667 Makamba, Burundi, -4.1333, 29.8000 Hohenmolsen, Germany, 51.1564, 12.0981 Negrete, Chile, -37.5833, -72.5333 Umbrete, Spain, 37.3667, -6.1500 Singhana, India, 22.1902, 74.9702 Taisar, India, 22.4867, 84.1804 Hazrat Shiura, India, 25.5976, 85.6119 Rokietnica, Poland, 52.5122, 16.7456 Saint-Philbert-de-Grand-Lieu, France, 47.0358, -1.6386 Resana, Italy, 45.6333, 11.9500 Hsenwi, Burma, 23.3000, 97.9667 Novopskov, Ukraine, 49.5383, 39.1019 Schlangen, Germany, 51.8167, 8.8331 Magnago, Italy, 45.5792, 8.8025 Cetraro, Italy, 39.5000, 15.9500 Sint Willebrord, Netherlands, 51.5483, 4.5881 Makariv, Ukraine, 50.4597, 29.8147 Capriolo, Italy, 45.6373, 9.9336 Tazarka, Tunisia, 36.5500, 10.8333 North Mimms, United Kingdom, 51.7259, -0.2336 Vempatti, India, 17.4488, 79.5992 Jamunamukh, India, 26.1015, 92.7426 Ja`fariyeh, Iran, 34.7739, 50.5164 Ukwa, India, 21.9710, 80.4662 Gaurdah, India, 25.7097, 86.5570 Cutro, Italy, 39.0342, 16.9819 Kolkwitz, Germany, 51.7500, 14.2500 Horsell, United Kingdom, 51.3286, -0.5617 Verkhneyarkeyevo, Russia, 55.4458, 54.3167 Angola, United States, 41.6433, -85.0050 Sutton, United States, 42.1337, -71.7503 Adelsdorf, Germany, 49.7167, 10.9000 Kadimetla, India, 15.7376, 77.5385 Kungsangen, Sweden, 59.4833, 17.7500 Nepi, Italy, 42.2436, 12.3464 Grigoriopol, Moldova, 47.1536, 29.2964 San Lorenzo, Puerto Rico, 18.1875, -65.9680 Curepto, Chile, -35.0833, -72.0167 Rhosllanerchrugog, United Kingdom, 53.0110, -3.0520 Manchester, United States, 42.9921, -77.1897 Marvast, Iran, 30.4775, 54.2128 Karkamis, Turkey, 36.8339, 37.9969 Sao Jorge d'Oeste, Brazil, -25.7058, -52.9178 Jhabrera, India, 29.8091, 77.7734 Sarakkayhalli, India, 12.2191, 78.0480 Cermenate, Italy, 45.7000, 9.0833 Kharagbani, India, 26.4852, 86.3073 Kakarati, India, 24.5639, 80.2659 Acton, Canada, 43.6333, -80.0333 Dornstadt, Germany, 48.4692, 9.9417 San Giorgio di Piano, Italy, 44.6500, 11.3833 Dymka, Ukraine, 48.0972, 25.9753 Zhongguancun, China, 41.1789, 117.9617 Haapsalu, Estonia, 58.9394, 23.5408 Rangapuram, India, 15.4092, 78.0746 Ait Touil, Morocco, 33.7842, -6.1281 Tirubhuvane, India, 11.9281, 79.6448 Heiligenhafen, Germany, 54.3739, 10.9797 Tocina, Spain, 37.6000, -5.7333 Broadwater, United Kingdom, 50.8282, -0.3742 Pumalakkundu, India, 9.8871, 77.4498 Bakharia, India, 26.7666, 84.6619 Foum Jam'a, Morocco, 31.9600, -6.9800 Topoloveni, Romania, 44.8069, 25.0839 Ripoll, Spain, 42.2006, 2.1928 Clermont-l'Herault, France, 43.6281, 3.4331 Ukhai Purbari Patti, India, 26.2471, 84.4066 Douar Oulad Bouziane, Morocco, 34.2325, -5.0444 Pustomyty, Ukraine, 49.7139, 23.9108 Helotes, United States, 29.5687, -98.6960 Coral Hills, United States, 38.8706, -76.9215 Sierning, Austria, 48.0447, 14.3100 Madaya, Syria, 33.6903, 36.1035 Fallon, United States, 39.4737, -118.7779 Pau Brasil, Brazil, -15.4639, -39.6508 Elsenfeld, Germany, 49.8500, 9.1667 Mega, Ethiopia, 4.0167, 38.2500 Hamira, India, 31.4589, 75.4304 Barjhar, India, 22.6012, 74.2471 Zacualpan de Amilpas, Mexico, 18.7836, -98.7594 Hathaura, India, 26.1744, 84.3294 Chhapera, India, 23.8948, 76.4538 Ecatzingo, Mexico, 18.9500, -98.7500 Puig, Spain, 39.5896, -0.3031 Santa Maria de Cayon, Spain, 43.3114, -3.8525 Tivat, Montenegro, 42.4300, 18.7000 Langnau, Switzerland, 46.9433, 7.7853 Rehau, Germany, 50.2500, 12.0167 Tandarampattu, India, 12.1533, 78.9473 Baisuhalli, India, 12.2064, 78.1906 Roxborough Park, United States, 39.4492, -105.0746 Barahpur, India, 25.4192, 85.8762 Langhnaj, India, 23.4500, 72.4833 Shahr-e Majlesi, Iran, 32.1936, 51.5006 Punta Indio, Argentina, -35.2667, -57.2167 Jarville-la-Malgrange, France, 48.6700, 6.2067 Tiruvaduturai, India, 11.0379, 79.5215 Muppalla, India, 16.3198, 80.0927 Taouloukoult, Morocco, 31.2167, -9.0833 Eemnes, Netherlands, 52.2500, 5.2500 Denham Springs, United States, 30.4743, -90.9593 Sebastiao Laranjeiras, Brazil, -14.5728, -42.9400 Le Passage, France, 44.2025, 0.6042 Tadangam, India, 12.1056, 78.1226 Taouz, Morocco, 30.9069, -3.9958 Opalenica, Poland, 52.3078, 16.4136 Indianola, United States, 33.4492, -90.6447 Maraial, Brazil, -8.8028, -35.8289 Miajadas, Spain, 39.1500, -6.0667 Mirjaveh, Iran, 29.0147, 61.4503 Tassera, Algeria, 36.0369, 5.0022 Wilnecote, United Kingdom, 52.6081, -1.6677 Ubbergen, Netherlands, 51.8333, 5.9167 Bagchini, India, 26.4817, 77.8185 Mahalgaon, India, 26.0466, 87.5774 Ntchisi, Malawi, -13.3753, 34.0036 Lesquin, France, 50.5906, 3.1117 Robertson, South Africa, -33.8000, 19.8833 Bayaram, India, 18.0506, 80.7375 Kirangur, India, 12.4316, 76.6993 Awans, Belgium, 50.6669, 5.4633 Magny-les-Hameaux, France, 48.7363, 2.0877 Lutterworth, United Kingdom, 52.4560, -1.2000 Chinnampalaiyam, India, 10.6604, 77.0248 Ruffano, Italy, 39.9833, 18.2500 Finestrat, Spain, 38.5669, -0.2125 Gore, Ethiopia, 8.1490, 35.5370 Orlu, Nigeria, 5.7837, 7.0333 Queensferry, United Kingdom, 55.9900, -3.3980 Sherborne, United Kingdom, 50.9469, -2.5171 Asudapuram, India, 15.8780, 78.1320 Igarata, Brazil, -23.2044, -46.1561 Chilmil, India, 25.4563, 86.1364 Tiztoutine, Morocco, 34.9833, -3.1500 Olekminsk, Russia, 60.3667, 120.4167 Chiman, India, 30.1200, 75.6950 Palhano, Brazil, -4.7450, -37.9589 Qutubpur, India, 25.6279, 85.3684 Oravita, Romania, 45.0403, 21.6853 Modra, Slovakia, 48.3331, 17.3069 Freystadt, Germany, 49.2000, 11.3167 Muro del Alcoy, Spain, 38.7797, -0.4361 Suan, Colombia, 10.3333, -74.8833 Barpathar, India, 26.2871, 93.8884 Kalaikunda, India, 22.3424, 87.2265 Laanoussar, Morocco, 33.6833, -4.8167 Oulad Imloul, Morocco, 32.0333, -7.7167 Dubrovytsya, Ukraine, 51.5667, 26.5667 Ladhuka, India, 30.5082, 74.0905 San Agustin de las Juntas, Mexico, 17.0000, -96.7167 Yezhi, China, 27.7000, 99.0500 Polegate, United Kingdom, 50.8216, 0.2442 Chandwara, India, 24.3930, 85.4798 Bhogapuram, India, 18.0311, 83.4967 Lago Vista, United States, 30.4519, -97.9908 Sankt Valentin, Austria, 48.1667, 14.5333 Pirpirituba, Brazil, -6.7800, -35.4989 Vesele, Ukraine, 47.0158, 34.9122 Frodsham, United Kingdom, 53.2947, -2.7289 Parol, India, 32.3460, 75.4344 Doctor Arroyo, Mexico, 23.6667, -100.1667 Bolokhovo, Russia, 54.0833, 37.8333 Minano, Japan, 36.0708, 139.0988 Diamondhead, United States, 30.3791, -89.3707 Hastings, United States, 43.3215, -76.1582 Rum, Austria, 47.2872, 11.4581 Nattakkadaiyur, India, 11.0882, 77.6637 Redon, France, 47.6522, -2.0836 Katuria, India, 24.7476, 86.7205 Takkali, India, 8.2461, 77.3186 Torrinha, Brazil, -22.4258, -48.1689 Agua Branca, Brazil, -7.5119, -37.6408 Mallappadi, India, 12.5273, 78.3756 Santa Teresa di Riva, Italy, 37.9400, 15.3625 Macomer, Italy, 40.2644, 8.7751 Blachownia, Poland, 50.7833, 18.9667 Ban Khi Lek, Thailand, 19.0625, 98.9396 Sheffield, United States, 34.7570, -87.6977 Nagyatad, Hungary, 46.2294, 17.3575 Moore, United States, 40.7798, -75.4220 Havre, United States, 48.5427, -109.6804 Tres Rios, Costa Rica, 9.9072, -83.9865 San Lorenzo de Descardazar, Spain, 39.6097, 3.2839 Manteswar, India, 23.4225, 88.1075 Kesli, India, 23.4183, 78.8062 Nulivedu, India, 14.1002, 78.5548 Sainte-Julienne, Canada, 45.9700, -73.7200 Southport, United States, 42.0400, -76.8775 Chinnakkavundanur, India, 11.4559, 77.8673 Boddikurapadu, India, 15.6591, 79.7509 Jaffar Khanpet, India, 18.6875, 79.5411 Dowlatabad, Iran, 35.2842, 59.5225 Wehrheim, Germany, 50.3000, 8.5667 Molsheim, France, 48.5400, 7.4900 Harpur, India, 25.6537, 86.3288 Tarawan, India, 24.7295, 85.2529 Pelagor, India, 25.5992, 87.7214 Tleta Taghramt, Morocco, 35.7877, -5.4677 Samdrup Jongkhar, Bhutan, 26.8000, 91.5050 Sujapur, India, 25.4815, 87.4435 Vanzago, Italy, 45.5268, 8.9947 Gatteo, Italy, 44.1371, 12.4043 Chupinguaia, Brazil, -12.5522, -60.8997 Sosale, India, 12.2330, 76.9170 Kaleybar, Iran, 38.8664, 47.0406 Zafferana Etnea, Italy, 37.6833, 15.1000 Concepcion, Philippines, 8.4167, 123.6000 Moskovskiy, Russia, 55.6000, 37.3500 Bordj Mokhtar, Algeria, 21.3289, 0.9542 Lubuagan, Philippines, 17.3500, 121.1800 Pesca, Colombia, 5.5833, -73.0500 Wallerfangen, Germany, 49.3128, 6.7350 Borna, India, 25.4373, 86.6172 Hasanpura, India, 26.0751, 84.3618 Nagayalanka, India, 15.9500, 80.9167 Kopong, Botswana, -24.4686, 25.8922 Lac des Oiseaux, Algeria, 36.7833, 8.1167 Unao, India, 25.5784, 78.6006 Telkathu, India, 26.1124, 84.3733 Kalvarpatti, India, 10.6250, 77.9375 Oued Essalem, Algeria, 35.5833, 0.9167 Santa Comba, Spain, 43.0383, -8.8142 Maihma Sarja, India, 30.3110, 74.8427 Jahangirpur Salkhani, India, 25.8335, 85.4795 La'tamna, Morocco, 31.9100, -7.3400 St. Francis, United States, 42.9716, -87.8730 Peixe, Brazil, -12.0250, -48.5389 Baisa, India, 25.3552, 86.7246 Moisei, Romania, 47.6561, 24.5381 Timmapuram, India, 15.4887, 78.5744 Zawyat Sidi Ben Hamdoun, Morocco, 33.0450, -7.9290 Boali, Central African Republic, 4.8000, 18.1167 Shanhur, Egypt, 25.8604, 32.7779 Vallendar, Germany, 50.3971, 7.6220 La Victoria de Acentejo, Spain, 28.4333, -16.4667 Rudraprayag, India, 30.2800, 78.9800 Janpur, India, 25.2958, 84.8789 Mohammad Yar, Iran, 36.9819, 45.5222 San Pablo Huixtepec, Mexico, 16.8167, -96.7833 Imielin, Poland, 50.1478, 19.1814 Chianki, India, 24.0051, 84.1098 Ouled Rached, Algeria, 36.2119, 4.1106 Irthlingborough, United Kingdom, 52.3240, -0.6140 Ralla, India, 30.1200, 75.4320 Pangunattam, India, 12.1112, 78.0123 Bang Khla, Thailand, 13.7214, 101.2081 Studenka, Czechia, 49.7233, 18.0786 San Sebastian, Puerto Rico, 18.3356, -66.9948 Nor Hachn, Armenia, 40.3019, 44.5831 Welwyn, United Kingdom, 51.8310, -0.2150 Rupahi, India, 26.4110, 92.7400 Lunner, Norway, 60.2528, 10.6672 Chesapeake Ranch Estates, United States, 38.3574, -76.4147 Laurens, United States, 34.5022, -82.0207 Sadarak, Azerbaijan, 39.7143, 44.8846 Weissenthurm, Germany, 50.4144, 7.4606 Schaafheim, Germany, 49.9167, 9.0167 Choix, Mexico, 26.7086, -108.3253 Quirino, Philippines, 17.1383, 120.6764 Bohemia, United States, 40.7717, -73.1271 Eisenberg, Germany, 49.5614, 8.0725 Tiana, Spain, 41.4831, 2.2697 Nogent-le-Rotrou, France, 48.3225, 0.8225 Shimizu, Japan, 43.0167, 142.8833 Nove Mesto nad Metuji, Czechia, 50.3447, 16.1517 Hualane, Chile, -34.9765, -71.8048 Frickenhausen, Germany, 48.5928, 9.3611 Patchur, India, 12.5949, 78.4622 Mariyadau, India, 24.2762, 79.6559 Khajuri, India, 26.0630, 87.1341 Satravada, India, 13.3201, 79.5488 Qualicum Beach, Canada, 49.3500, -124.4333 Severance, United States, 40.5265, -104.8650 Sanger, United States, 33.3715, -97.1678 Ochsenhausen, Germany, 48.0722, 9.9481 Hagondange, France, 49.2550, 6.1686 Pasraha, India, 25.3973, 86.7034 Kalachinsk, Russia, 55.0500, 74.5833 Yuryevets, Russia, 57.3167, 43.1000 San Jose Guayabal, El Salvador, 13.8500, -89.1000 Leonia, United States, 40.8638, -73.9900 Elhovo, Bulgaria, 42.1720, 26.5694 Draksharama, India, 16.7928, 82.0635 Uranganpatti, India, 9.9984, 78.4297 Quakertown, United States, 40.4398, -75.3455 Conde-sur-l'Escaut, France, 50.4500, 3.5914 Mumaradikop, India, 15.9000, 75.5000 Barros Cassal, Brazil, -29.0928, -52.5828 Pica, Chile, -20.4892, -69.3294 Honganur, India, 12.6044, 77.2175 Xinpi, Taiwan, 22.4880, 120.5814 Porto de Pedras, Brazil, -9.1578, -35.2950 Rosario do Catete, Brazil, -10.6958, -37.0308 Isua, India, 25.2330, 85.8430 Magdalena, Argentina, -35.0833, -57.5167 Wunsiedel, Germany, 50.0167, 12.0167 Bo`z, Uzbekistan, 40.6833, 71.9167 Riverdale, United States, 41.1732, -112.0023 Shende, Ethiopia, 10.6333, 36.9333 Hardeeville, United States, 32.2949, -81.0321 Kanajanahalli, India, 14.1092, 76.8381 Khandaich, India, 24.8511, 86.2395 Ikeda, Japan, 36.4212, 137.8746 Jackson, United States, 40.3774, -76.3142 Bridgeport, United States, 39.3036, -80.2478 Malahide, Canada, 42.7928, -80.9361 Perwez, Belgium, 50.6241, 4.8150 Modavandisatyamangalam, India, 11.2635, 77.7285 Kharahara, India, 24.9142, 87.0006 Gassino Torinese, Italy, 45.1271, 7.8248 Titu, Romania, 44.6622, 25.5736 Poienile de sub Munte, Romania, 47.8167, 24.4333 Haiku-Pauwela, United States, 20.9156, -156.3022 Gibsonville, United States, 36.0993, -79.5415 Juprelle, Belgium, 50.7101, 5.5304 La Jigua, Honduras, 15.0427, -88.7974 Dahi, India, 22.1122, 74.5879 Milajerd, Iran, 34.6214, 49.2081 Saumalkol, Kazakhstan, 53.2914, 68.1094 Kruszwica, Poland, 52.6772, 18.3292 Betania, Colombia, 5.7500, -75.9667 Asarhi, India, 25.2892, 85.2189 Suzdal, Russia, 56.4167, 40.4500 Jandaira, Brazil, -11.5639, -37.7839 Valreas, France, 44.3850, 4.9911 Marano Vicentino, Italy, 45.7000, 11.4333 Lagunia Raghukanth, India, 25.8195, 85.7725 Kollankulam, India, 8.7964, 77.5681 Mont-Saint-Martin, France, 49.5411, 5.7800 Kunnattur, India, 11.2727, 77.4107 Uppalapadu, India, 16.3862, 79.9983 Analaroa, Madagascar, -18.4080, 47.7074 Sariz, Turkey, 38.4792, 36.5006 Mabeskraal, South Africa, -25.1960, 26.8030 Wohleiberg, Switzerland, 46.9719, 7.3569 Binisalem, Spain, 39.6886, 2.8422 Cisterniga, Spain, 41.6167, -4.6833 San Pancrazio Salentino, Italy, 40.4167, 17.8333 Ban Bo Phlap, Thailand, 13.8366, 100.0746 Ilvesheim, Germany, 49.4725, 8.5675 Salzhemmendorf, Germany, 52.0667, 9.5833 Kemberg, Germany, 51.7833, 12.6333 Bagnara Calabra, Italy, 38.2833, 15.8167 Herculandia, Brazil, -22.0036, -50.3853 Sauzal, Spain, 28.4778, -16.4361 Chicholi, India, 22.0100, 77.6600 Moldova Noua, Romania, 44.7178, 21.6639 Nakhon Thai, Thailand, 17.1006, 100.8374 East Stroudsburg, United States, 41.0023, -75.1779 Pozo Almonte, Chile, -20.2667, -69.8000 Bad Schussenried, Germany, 48.0067, 9.6586 Palomares del Rio, Spain, 37.3167, -6.0500 Villa de Guadalupe, Mexico, 23.3667, -100.7500 Blanchard, United States, 35.1524, -97.6602 Washington, United States, 40.9884, -74.0636 Tisnov, Czechia, 49.3486, 16.4244 Coleford, United Kingdom, 51.7910, -2.6162 Majhariya, India, 26.8696, 84.8771 Bhachhi, India, 26.3404, 86.0585 Altun Kawbri, Iraq, 35.7534, 44.1473 Nakoushi, Japan, 26.6825, 127.9728 Chornobaivka, Ukraine, 46.7006, 32.5478 Urbach, Germany, 48.8133, 9.5789 Gomaringen, Germany, 48.4520, 9.1000 Kiato, Greece, 38.0117, 22.7467 Thakurainia, India, 26.2098, 86.0191 Kurort Steinbach-Hallenberg, Germany, 50.7006, 10.5667 Bhadran, India, 22.3593, 72.9005 Almagro, Philippines, 11.9108, 124.2852 Warren, United States, 41.8434, -79.1444 Livron-sur-Drome, France, 44.7736, 4.8439 Kiskunlachaza, Hungary, 47.2000, 19.0167 Abuzar-e Ghaffari, Iran, 32.1806, 48.2778 Gaggiano, Italy, 45.4048, 9.0349 Nakao, Japan, 35.3333, 139.2167 Mascota, Mexico, 20.5235, -104.7886 Skwierzyna, Poland, 52.6000, 15.5000 Bruchhausen-Vilsen, Germany, 52.8333, 9.0000 Belley, France, 45.7667, 5.6833 Anandpur, India, 25.6192, 84.8673 Gainrha, India, 25.9916, 87.4648 Teplohirsk, Ukraine, 48.5967, 38.5828 Woodbury, United States, 40.8176, -73.4703 Goldach, Switzerland, 47.4831, 9.4664 Torgelow, Germany, 53.6167, 14.0000 Deokali, India, 25.9068, 86.1111 Charlotte, United States, 42.5662, -84.8304 Joghtay, Iran, 36.6383, 57.0717 Petersberg, Germany, 51.6000, 11.9667 Le Cres, France, 43.6481, 3.9397 Rajapudi, India, 17.2122, 82.0064 Punnaikkayal, India, 8.6322, 78.1119 Macedon, United States, 43.0792, -77.3095 Oppicherla, India, 16.4444, 79.6967 Guneysinir, Turkey, 37.2981, 32.7211 Delta, United States, 38.7560, -108.0772 Sene, France, 47.6206, -2.7358 Pappampatti, India, 10.4446, 77.4048 Niederhasli, Switzerland, 47.4822, 8.4861 Tlahuiltepa, Mexico, 20.9233, -98.9497 Alukkuli, India, 11.4458, 77.3574 Chilakhana, India, 26.2990, 89.5892 Padinska Skela, Serbia, 44.9429, 20.4255 Newfane, United States, 43.2818, -78.6932 Bewdley, United Kingdom, 52.3758, -2.3150 Kuvshinovo, Russia, 57.0333, 34.1833 Ouistreham, France, 49.2800, -0.2600 Piru, India, 25.1009, 84.5583 Rampur, India, 25.9256, 84.7468 Eunice, United States, 30.4904, -92.4191 Ain el Hadjar, Algeria, 36.3333, 3.8000 Douar Oulad Sidi Moussa, Morocco, 32.2726, -7.1987 Smithville, United States, 39.4929, -74.4801 Barei, Benin, 9.6833, 1.5667 Rinopolis, Brazil, -21.7258, -50.7219 Piamonte, Colombia, 1.1194, -76.3269 Killamarsh, United Kingdom, 53.3205, -1.3116 Riscani, Moldova, 47.9572, 27.5539 Walworth, United States, 43.1633, -77.3131 Empedrado, Argentina, -27.9333, -58.7833 Itiki, India, 14.9510, 76.0944 Barnaon, India, 25.4809, 84.5250 Bilozerka, Ukraine, 46.6278, 32.4431 Middlesborough, United States, 36.6127, -83.7227 Waldfeucht, Germany, 51.0714, 5.9831 Aljustrel, Portugal, 37.8775, -8.1653 Bojaca, Colombia, 4.7336, -74.3422 Paray-le-Monial, France, 46.4519, 4.1203 Pedda Tumbalam, India, 15.6328, 77.1036 Lahfayr, Morocco, 30.5700, -8.4878 Las Tablas, Panama, 7.7667, -80.2833 Risaralda, Colombia, 5.1667, -75.7500 Granada, Colombia, 4.5186, -74.3514 Bad Liebenwerda, Germany, 51.5167, 13.4000 Zavitinsk, Russia, 50.1281, 129.4433 Borgholzhausen, Germany, 52.1000, 8.3000 Elze, Germany, 52.1167, 9.7333 Towcester, United Kingdom, 52.1300, -0.9900 Pasian di Prato, Italy, 46.0500, 13.2000 Augusta, United States, 37.6955, -96.9919 Pine Lake Park, United States, 40.0017, -74.2595 Ganaram, India, 18.5275, 78.2450 Algun, India, 31.2795, 74.6517 Samalpur, India, 25.1961, 88.0419 Kudelstaart, Netherlands, 52.2339, 4.7483 Schubelbach, Switzerland, 47.1733, 8.9264 San Jose La Arada, Guatemala, 14.7167, -89.5833 Douar Ezzerarda, Morocco, 34.7667, -5.8333 San Fructuoso de Bages, Spain, 41.7520, 1.8745 Gandikunta, India, 16.1693, 80.9443 Vittuone, Italy, 45.4833, 8.9500 Manzanares el Real, Spain, 40.7272, -3.8611 Bendapudi, India, 17.2673, 82.3758 Katteragandla, India, 15.0091, 78.9584 Rensselaer, United States, 42.6465, -73.7328 Sitanagaram, India, 16.2403, 80.5817 Ratangarh, India, 24.8167, 75.1167 Matar, India, 21.7260, 73.0251 Ban Son Loi, Thailand, 13.9122, 100.4200 Capilla del Senor, Argentina, -34.2833, -59.1000 Diouna, Mali, 13.4325, -5.8194 Sandpoint, United States, 48.2822, -116.5614 Bethalto, United States, 38.9015, -90.0466 Smoline, Ukraine, 48.6017, 31.2947 Mels, Switzerland, 47.0497, 9.4167 Ahmadpur, India, 23.8365, 87.6912 Harbatpur, India, 30.4500, 77.7300 Loria, Italy, 45.7333, 11.8667 Otumba, Mexico, 19.6989, -98.7572 Chunakhali, India, 22.3010, 88.7951 Montescaglioso, Italy, 40.5500, 16.6667 Sidi Bounaga, Morocco, 30.7106, -8.3400 Madhopur, India, 26.7474, 84.7054 Talata-Angavo, Madagascar, -18.2064, 47.0977 Chala, Peru, -15.8519, -74.2500 Fatao, Mali, 14.3247, -9.5311 Barleben, Germany, 52.2000, 11.6333 Montlhery, France, 48.6392, 2.2722 Iarpur, India, 22.2998, 88.2994 Raipur Buzurg, India, 25.7118, 85.6956 Kawai, Japan, 35.2000, 138.5667 Romang, Argentina, -29.5000, -59.7667 Bandio, Niger, 13.8888, 1.0896 Gooik, Belgium, 50.8000, 4.1167 Zoubiria, Algeria, 36.0667, 2.9000 Mamidipalli, India, 17.2516, 78.4521 Aranya Kalan, India, 23.2448, 76.7435 Nutakki, India, 16.2922, 80.3324 Shawano, United States, 44.7748, -88.5843 Momchilgrad, Bulgaria, 41.5330, 25.4170 Mirante da Serra, Brazil, -11.0297, -62.6750 Tanamarina-Sakay, Madagascar, -21.4689, 46.6050 Brooksville, United States, 28.5404, -82.3903 Conshohocken, United States, 40.0772, -75.3034 Tasso, Benin, 9.6737, 3.2333 Juraqan, Iran, 34.8850, 48.5561 Palm Beach, United States, 26.6945, -80.0408 Plymouth, United States, 42.3718, -83.4680 Kahla, India, 26.3747, 84.5433 Sugar Grove, United States, 41.7759, -88.4481 Oakville, United States, 41.5893, -73.0905 Nossa Senhora Aparecida, Brazil, -10.4428, -37.4889 Sandalpur, India, 25.5639, 87.5082 Bahabad, Iran, 31.8706, 56.0253 Rethen, Germany, 52.2861, 9.8250 Giardini, Italy, 37.8333, 15.2833 Neuenkirchen, Germany, 52.5167, 8.0667 Stevenston, United Kingdom, 55.6450, -4.7580 Karsaut, India, 26.1298, 84.4825 Vallapuram, India, 11.4000, 78.8800 McFarland, United States, 43.0203, -89.2828 Brugnera, Italy, 45.9000, 12.5333 Ryki, Poland, 51.6333, 21.9333 Philippeville, Belgium, 50.1964, 4.5436 Carrillos, Costa Rica, 10.0369, -84.2740 Bowdon, United Kingdom, 53.3760, -2.3660 Kondrukota, India, 17.3477, 81.6041 Vaikuntam, India, 11.5197, 77.9398 Castelleone, Italy, 45.2958, 9.7609 Zaggota, Morocco, 34.1667, -5.5333 Stillwater, United States, 42.9701, -73.6885 San Fausto de Campcentellas, Spain, 41.5061, 2.2400 Milnrow, United Kingdom, 53.6101, -2.1111 Kaujalgi, India, 16.1400, 74.8100 Kesap, Turkey, 40.9167, 38.5167 La Bruyere, Belgium, 50.5000, 4.8000 Sao Domingos, Brazil, -26.5578, -52.5319 Fazendinha, Brazil, -0.0245, -51.0975 Bom Jesus do Norte, Brazil, -21.1139, -41.6719 Hlyboka, Ukraine, 48.0833, 25.9333 I-n-Amenas, Algeria, 28.0408, 9.5431 Baia da Traicao, Brazil, -6.6878, -34.9358 Evian-les-Bains, France, 46.3833, 6.5833 Kondayampalaiyam, India, 11.5130, 77.4371 Merrill, United States, 45.1820, -89.6994 Kalavryta, Greece, 38.0333, 22.1167 Jajireddigudem, India, 17.3278, 79.5711 Oromocto, Canada, 45.8488, -66.4788 Bude, United Kingdom, 50.8240, -4.5420 Shannon, Ireland, 52.7137, -8.8686 Lakkavaram, India, 15.6983, 79.7945 Gudimulakhandrika, India, 16.3820, 81.7335 Borja, Paraguay, -25.9514, -56.4961 Cabo Rojo, Puerto Rico, 18.0867, -67.1482 Southwick, United States, 42.0544, -72.7785 Freetown, United States, 41.7714, -71.0157 Baluntaicun, China, 42.7594, 86.3231 Gandhwani, India, 22.3400, 75.0048 Badagabettu, India, 13.3335, 74.7999 Vallahbhapuram, India, 16.3528, 80.7175 Gangaura Behra, India, 25.9541, 86.5482 Ventnor City, United States, 39.3457, -74.4860 Hooper, United States, 41.1599, -112.2871 Japaratinga, Brazil, -9.2544, -35.2578 Antonio Dias, Brazil, -19.6528, -42.8719 Mejillones, Chile, -23.1000, -70.4500 Capbreton, France, 43.6431, -1.4311 Inverigo, Italy, 45.7333, 9.2167 Park Ridge, United States, 41.0352, -74.0423 Helena-West Helena, United States, 34.5313, -90.6201 Chaponost, France, 45.7108, 4.7425 Badnor, India, 25.8355, 74.2775 Nonea, India, 26.9746, 84.8768 Saraunja, India, 25.7690, 86.5273 Kandiyankovil, India, 11.0147, 77.4695 Salisbury, United States, 42.8465, -70.8616 Launaguet, France, 43.6750, 1.4578 Ottapparai, India, 11.1936, 77.5964 Swamimalai, India, 10.9575, 79.3293 Neman, Russia, 55.0333, 22.0333 Riverside, United States, 41.0318, -73.5827 Waldheim, Germany, 51.0667, 13.0167 Le Teich, France, 44.6347, -1.0225 Ghattupal, India, 17.0725, 78.9239 Sholaqqorghan, Kazakhstan, 43.7650, 69.1758 Melgaco, Portugal, 42.1167, -8.2667 Babadag, Romania, 44.8981, 28.7419 Nong Kung Si, Thailand, 16.6559, 103.2972 Chesterfield, United States, 40.1166, -74.6459 Kharika, India, 25.7173, 85.1256 Kodakkal, India, 13.0685, 79.4149 Castrolibero, Italy, 39.3167, 16.2000 Qarqaraly, Kazakhstan, 49.4167, 75.4167 Caracuaro, Mexico, 19.0167, -101.1261 Kannavam, India, 11.8333, 75.6667 Blackstone, United States, 42.0399, -71.5313 Commerce, United States, 33.2421, -95.8992 Crozet, United States, 38.0645, -78.6961 Pudukkottai, India, 10.6118, 78.0505 Pong Nam Ron, Thailand, 12.9057, 102.2622 Bestensee, Germany, 52.2500, 13.6500 Jambukuttaippatti, India, 12.3246, 78.3443 Chokkalingapuram, India, 10.1930, 78.3973 Badanahatti, India, 15.3176, 76.8258 Ban Kham Pom, Thailand, 15.9671, 105.1729 Pohrebyshche, Ukraine, 49.4833, 29.2667 Waseca, United States, 44.0827, -93.5029 Alsbach-Hahnlein, Germany, 49.7333, 8.6000 Brandon, United Kingdom, 52.4474, 0.6242 Surak, Iran, 36.5939, 53.2086 Covasna, Romania, 45.8492, 26.1853 Chechen-Aul, Russia, 43.2033, 45.7833 Villamediana de Iregua, Spain, 42.4333, -2.4167 Dhamnod, India, 23.4421, 74.9744 Lukovit, Bulgaria, 43.2102, 24.1629 Brockworth, United Kingdom, 51.8500, -2.1500 Golbaf, Iran, 29.8828, 57.7322 Falan, Colombia, 5.1333, -74.9500 Bad Laer, Germany, 52.1031, 8.0892 Guichen, France, 47.9681, -1.7939 Belaya Glina, Russia, 46.0833, 40.8583 Arlesheim, Switzerland, 47.4922, 7.6203 Cullercoats, United Kingdom, 55.0330, -1.4330 Rutland, United States, 42.3848, -71.9673 Vadavalam, India, 10.4286, 78.8913 Irungalur, India, 10.9399, 78.7619 Had Laaounate, Morocco, 32.6128, -8.2256 Gnarrenburg, Germany, 53.3864, 9.0050 Loeches, Spain, 40.3833, -3.4000 Mudhol, India, 15.6406, 75.9531 Gothurutha, India, 10.1862, 76.2013 Ramayipatti, India, 11.4720, 78.2109 Xalqobod, Uzbekistan, 37.4597, 66.9222 Qorovulbozor, Uzbekistan, 39.5000, 64.8000 Marlboro Village, United States, 38.8307, -76.7699 Araujos, Brazil, -19.9478, -45.1658 Laheji, India, 26.0957, 84.4009 Edeleny, Hungary, 48.2967, 20.7442 Paredes de Coura, Portugal, 41.9111, -8.5597 Landivisiau, France, 48.5100, -4.0669 Damargidda, India, 16.8189, 77.5031 Une, Colombia, 4.4019, -74.0250 Ville-la-Grand, France, 46.2031, 6.2475 Jamhra, India, 25.7777, 86.7899 Susari, India, 22.1797, 74.7577 Valkurti, India, 18.7171, 79.3823 Washington Terrace, United States, 41.1683, -111.9783 La Cruz, Costa Rica, 11.0845, -85.6436 Kodigenahalli, India, 13.7214, 77.3863 Hickam Housing, United States, 21.3311, -157.9474 Whitecourt, Canada, 54.1417, -115.6833 San Lorenzo, El Salvador, 14.0333, -89.7833 Glenshaw, United States, 40.5391, -79.9735 Nowra, Australia, -34.8808, 150.6075 Tenedla, Algeria, 33.6753, 6.0339 Leichi, China, 36.3500, 110.2500 Muli, India, 22.6388, 71.4580 Vignate, Italy, 45.5000, 9.3667 Ban Chang Phuak, Thailand, 18.8032, 98.9811 Altenbeken, Germany, 51.7667, 8.9333 Stovring, Denmark, 56.8909, 9.8310 Cobanlar, Turkey, 38.7000, 30.7833 Chalkari, India, 23.7580, 85.9540 Shirguppi, India, 16.7200, 75.0600 Jogaili, India, 25.9096, 87.4061 Mamidipalli, India, 18.7772, 78.2962 Elsfleth, Germany, 53.2333, 8.4667 Tibana, Colombia, 5.3167, -73.4000 Tepe-Korgon, Kyrgyzstan, 40.5928, 72.3956 As Sidrah, Libya, 30.6704, 18.2666 Tilehurst, United Kingdom, 51.4579, -1.0406 Chikkala, India, 16.9698, 81.5922 Sewa, India, 24.8753, 86.3257 Santa Maria Ajoloapan, Mexico, 19.9692, -99.0353 Samashki, Russia, 43.2906, 45.3014 Keuruu, Finland, 62.2583, 24.7083 Aberbargoed, United Kingdom, 51.6968, -3.2240 Olds, Canada, 51.7928, -114.1067 Jagannadapuram, India, 13.2745, 80.1802 Himmatpura, India, 30.5271, 75.3627 Rajepur, India, 25.5377, 85.6228 Sukkampatti, India, 10.5267, 78.1728 Suwannaphum, Thailand, 15.6035, 103.8021 Keskin, Turkey, 39.6731, 33.6136 Roux, Belgium, 50.4412, 4.3926 Canela Baja, Chile, -31.3989, -71.4561 Laufenburg (Baden), Germany, 47.5656, 8.0647 Hirehalli, India, 14.5255, 76.6634 Cusseta, United States, 32.3470, -84.7870 Clayton, United Kingdom, 53.7820, -1.8135 Guntramsdorf, Austria, 48.0500, 16.3167 Harpur Bhindi, India, 25.7746, 85.6563 Richmond Heights, United States, 38.6309, -90.3332 Cerro Grande, Brazil, -30.6000, -51.7500 Arceburgo, Brazil, -21.3639, -46.9400 Galten, Denmark, 56.1590, 9.9169 Madepalli, India, 12.5491, 78.3400 Nelali, India, 10.9282, 77.4832 Horr-e Riahi, Iran, 32.1444, 48.3906 Kagalnik, Russia, 47.0770, 39.3236 Waterford, United States, 37.6429, -120.7553 Hacine, Algeria, 35.4569, -0.0025 Budhma, India, 25.6451, 86.8317 Nashtifan, Iran, 34.4350, 60.1811 Taghbalt, Morocco, 30.6200, -5.3500 Mound, United States, 44.9328, -93.6591 Perkasie, United States, 40.3720, -75.2920 Dorverden, Germany, 52.8500, 9.2333 Itapebi, Brazil, -15.9508, -39.5339 Ussel, France, 45.5489, 2.3100 Bryans Road, United States, 38.6145, -77.0851 Makow Mazowiecki, Poland, 52.8667, 21.1000 Murfatlar, Romania, 44.1736, 28.4083 Toccoa, United States, 34.5810, -83.3263 Gorseinon, United Kingdom, 51.6600, -4.0300 Onchan, Isle of Man, 54.1750, -4.4550 Gudalur, India, 10.7898, 78.1285 Oulad Khallouf, Morocco, 31.7900, -7.0700 Jerez de los Caballeros, Spain, 38.3203, -6.7714 Waiuku, New Zealand, -37.2500, 174.7333 Ban Wat Chan, Thailand, 16.8033, 100.2351 Seven Corners, United States, 38.8658, -77.1445 Mahopac, United States, 41.3688, -73.7414 Marale, Honduras, 14.8833, -87.1500 Bangaon, India, 26.3081, 87.8833 Matelica, Italy, 43.2566, 13.0096 Ban Yaeng, Thailand, 16.8833, 100.8000 Ecorse, United States, 42.2489, -83.1399 Verdejante, Brazil, -7.9256, -38.9717 Xiangping, China, 24.5894, 112.1148 Xiangpingcun, China, 24.5892, 112.1237 Salsitz, Germany, 54.5164, 13.6411 Zinkiv, Ukraine, 50.2103, 34.3581 Monte Rico, Argentina, -24.4514, -65.1667 Trittau, Germany, 53.6167, 10.4000 Maidencreek, United States, 40.4618, -75.8927 Cuetzala del Progreso, Mexico, 18.2833, -99.8333 Boekenhouthoek, South Africa, -25.3030, 29.0150 Dommasandra, India, 12.8781, 77.7543 Wa, Mali, 13.6933, -4.4006 Corumbaiba, Brazil, -18.1419, -48.5619 Imilchil, Morocco, 32.1550, -5.6347 Stonegate, United States, 39.5357, -104.8032 Yvoir, Belgium, 50.3264, 4.8782 Abalessa, Algeria, 22.8900, 4.8472 Les Sorinieres, France, 47.1472, -1.5286 Irshava, Ukraine, 48.3000, 23.0500 Gadabay, Azerbaijan, 40.5706, 45.8123 Reggiolo, Italy, 44.9167, 10.8167 Zabalj, Serbia, 45.3667, 20.0667 Beauraing, Belgium, 50.1101, 4.9564 Ifigha, Algeria, 36.6667, 4.4167 La Matanza de Acentejo, Spain, 28.4528, -16.4556 Op, India, 25.2092, 85.3019 Talnique, El Salvador, 13.6667, -89.4000 Domokos, Greece, 39.1333, 22.3000 Sampgaon, India, 15.7900, 74.7500 Banbhag, India, 25.7919, 87.4140 Bariariya Tola Rajpur, India, 26.4567, 84.7043 University of Virginia, United States, 38.0405, -78.5164 Entre Ijuis, Brazil, -28.3600, -54.2678 Halgeri, India, 14.5551, 75.6099 North Codorus, United States, 39.8646, -76.8189 Gualaquiza, Ecuador, -3.3800, -78.5800 Middlebury, United States, 44.0043, -73.1218 Sungal, India, 32.9392, 74.6935 Pilikodu, India, 12.1903, 75.1667 Hostivice, Czechia, 50.0814, 14.2525 Karis, Finland, 60.0708, 23.6625 Wysokie Mazowieckie, Poland, 52.9192, 22.5144 Aiea, United States, 21.3865, -157.9232 La Ravoire, France, 45.5600, 5.9600 Amfilochia, Greece, 38.8500, 21.1667 Fateh Nangal, India, 31.9453, 75.3191 Zupanja, Croatia, 45.0667, 18.7000 Imotski, Croatia, 43.4500, 17.2167 Coolum Beach, Australia, -26.5295, 153.0910 Piripa, Brazil, -14.9400, -41.7200 Grunheide, Germany, 52.4167, 13.8167 Barwell, United Kingdom, 52.5682, -1.3462 Morubagalu, India, 13.9702, 77.0411 Anjur, India, 10.5992, 76.1553 Narayanpur, India, 17.8589, 76.9733 Incline Village, United States, 39.2639, -119.9455 Cachoeira dos Indios, Brazil, -6.9269, -38.6739 Rivesaltes, France, 42.7697, 2.8747 Belakvadi, India, 12.2550, 77.1225 Elsmere, United States, 38.9948, -84.6017 Buenopolis, Brazil, -17.8742, -44.1767 Cavalcante, Brazil, -13.7978, -47.4578 Chinnayagudem, India, 17.0470, 81.4810 Felino, Italy, 44.6953, 10.2416 Lavis, Italy, 46.1390, 11.1123 Razanj, Serbia, 43.6667, 21.5500 Santiago de La Frontera, El Salvador, 14.1667, -89.6000 Old Orchard Beach, United States, 43.5239, -70.3904 Al Bardiyah, Libya, 31.7600, 25.0750 Zacapoaxtla, Mexico, 19.8833, -97.5833 Sangeorgiu de Mures, Romania, 46.5500, 24.4667 Merrydale, United States, 30.4998, -91.1081 Forestdale, United States, 33.5737, -86.9000 Fairfield Glade, United States, 36.0028, -84.8711 Grossbeeren, Germany, 52.3544, 13.3061 Sansa, India, 25.0291, 84.4597 Gondizalves, Portugal, 41.5426, -8.4553 Ust'-Nera, Russia, 64.5666, 143.2000 Sabie, South Africa, -25.0978, 30.7792 Glens Falls North, United States, 43.3350, -73.6832 Veinticinco de Diciembre, Paraguay, -24.7000, -56.5500 Jessup, United States, 39.1488, -76.7772 Mangasamudram, India, 13.2291, 79.0909 O'Hara, United States, 40.5092, -79.8949 Aliquippa, United States, 40.6155, -80.2547 Biblis, Germany, 49.7000, 8.4667 Maserada sul Piave, Italy, 45.7500, 12.3167 Hawthorn Woods, United States, 42.2313, -88.0624 Des Peres, United States, 38.5973, -90.4480 Japura, Brazil, -23.4700, -52.5528 Dielheim, Germany, 49.2825, 8.7347 Niesky, Germany, 51.3000, 14.8167 Eurajoki, Finland, 61.2000, 21.7333 Santa Lucia di Piave, Italy, 45.8500, 12.2833 Kaithahi, India, 26.3488, 86.1521 Damu, India, 26.5461, 85.9820 Sibkund, India, 25.3041, 86.3990 Nerinjippettai, India, 11.6543, 77.7586 Weare, United States, 43.0813, -71.7219 Penkridge, United Kingdom, 52.7252, -2.1164 Solita, Colombia, 0.8667, -75.6500 Cajvana, Romania, 47.7044, 25.9694 Dallas, United States, 41.3608, -75.9656 Lagbe, Benin, 6.6833, 2.6833 Pleternica, Croatia, 45.2864, 17.8019 Dihri, India, 25.3796, 85.5376 Bhargaon, India, 26.0750, 87.1483 Copceac, Moldova, 45.8500, 28.6947 Stony Brook University, United States, 40.9098, -73.1217 Willowbrook, United States, 41.7641, -87.9454 Huron East, Canada, 43.6300, -81.2800 Obukhivka, Ukraine, 48.5433, 34.8589 Pepillo Salcedo, Dominican Republic, 19.7000, -71.7500 Guano, Ecuador, -1.5833, -78.6333 Stotfold, United Kingdom, 52.0180, -0.2280 Gavirate, Italy, 45.8500, 8.7167 Ipuiuna, Brazil, -22.0989, -46.1900 Bezliudivka, Ukraine, 49.8692, 36.2697 Tecoh, Mexico, 20.7419, -89.4744 Ban Wang Krachae, Thailand, 14.2333, 98.8667 Cajobi, Brazil, -20.8800, -48.8089 Ciudad Insurgentes, Mexico, 25.2617, -111.7744 Westampton, United States, 40.0168, -74.8213 Malingaon, India, 26.3560, 87.9614 Cherniakhiv, Ukraine, 50.4550, 28.6653 Lopatcong, United States, 40.7091, -75.1551 Dazhuangzi, China, 40.2321, 99.0558 Nurmes, Finland, 63.5450, 29.1333 Haddington, United Kingdom, 55.9556, -2.7808 Govindapalle, India, 15.3525, 78.5224 Yenmangandla, India, 16.8839, 78.0332 Malalbergo, Italy, 44.7194, 11.5331 Lanta, Benin, 7.1000, 1.8667 Basudebpur, India, 21.8256, 87.6190 Mokri, India, 25.0184, 83.5633 Hampstead, United States, 34.3627, -77.7318 Chillicothe, United States, 39.7953, -93.5499 Auerbach, Germany, 49.6833, 11.6167 Boulder Hill, United States, 41.7113, -88.3353 San Manuel Chaparron, Guatemala, 14.5167, -89.7667 Masera di Padova, Italy, 45.3167, 11.8667 Jandola, Pakistan, 32.3317, 70.1228 Harrodsburg, United States, 37.7654, -84.8474 Denekamp, Netherlands, 52.3794, 7.0089 Umburetama, Brazil, -7.6958, -35.6639 Sandiacre, United Kingdom, 52.9230, -1.2890 Amatlan de los Reyes, Mexico, 18.8457, -96.9149 Raipur, India, 25.4226, 86.8498 Chitrada, India, 17.0802, 82.2469 Nandiyalam, India, 12.9237, 79.2635 Peresecina, Moldova, 47.2522, 28.7689 Olesno, Poland, 50.8750, 18.4167 Rothrist, Switzerland, 47.3028, 7.8833 Guatape, Colombia, 6.2333, -75.1667 El Molino, Colombia, 10.6533, -72.9242 Tettu, India, 13.6275, 78.4322 Pokotylivka, Ukraine, 49.9114, 36.1786 Dayton, United States, 30.0315, -94.9158 Piranguinho, Brazil, -22.4008, -45.5319 Palocabildo, Colombia, 5.1333, -75.0333 Breckerfeld, Germany, 51.2667, 7.4667 Arico el Nuevo, Spain, 28.1667, -16.4667 Shanklin, United Kingdom, 50.6333, -1.1750 Dodji-Bata, Benin, 6.6833, 2.2833 Bamaiya Harlal, India, 25.6664, 85.8802 Killimangalam, India, 10.7167, 76.3500 Groenlo, Netherlands, 52.0500, 6.6167 Hilzingen, Germany, 47.7653, 8.7844 Kongnolli, India, 16.4200, 74.5800 Pencoed, United Kingdom, 51.5228, -3.5047 Alawandi, India, 15.2303, 75.9801 Kaglipur, India, 12.8006, 77.5082 Mwaline al Oued, Morocco, 33.4467, -7.3283 Gretna, United States, 41.1314, -96.2450 Lake Mohawk, United States, 41.0149, -74.6640 Sauce, Argentina, -30.0667, -58.7667 Phagu, India, 26.9500, 88.7000 Sihali Jagir, India, 28.7997, 78.2628 Eshkanan, Iran, 27.2264, 53.6064 San Jorge, El Salvador, 13.4167, -88.3500 San Jorge, El Salvador, 13.4167, -88.3500 Kyritz, Germany, 52.9500, 12.4000 Kuduru, India, 13.1110, 77.1479 Istrana, Italy, 45.6833, 12.1000 Velykyi Bychkiv, Ukraine, 47.9667, 24.0150 Nechmeya, Algeria, 36.6114, 7.5133 Alajarvi, Finland, 63.0000, 23.8167 Dumri, India, 26.8648, 84.3767 Pattiswaram, India, 10.9253, 79.3424 Sunset Hills, United States, 38.5310, -90.4087 Mainaschaff, Germany, 49.9833, 9.0833 La Cienaga, Dominican Republic, 18.0700, -71.1000 Zeydabad, Iran, 29.6008, 55.5367 Fujisawacho-niinuma, Japan, 38.8670, 141.3500 Tunari, Romania, 44.5500, 26.1333 Montes Altos, Brazil, -5.8333, -47.0667 Ledbury, United Kingdom, 52.0339, -2.4235 Andre Fernandes, Brazil, -15.9658, -41.4978 Miryal, India, 17.5661, 78.8095 Odayarpatti, India, 11.6663, 78.2144 Tilmi, Morocco, 31.8189, -5.7718 Zarbdor Shaharchasi, Uzbekistan, 40.0747, 68.1683 Bogota, United States, 40.8751, -74.0293 Herenthout, Belgium, 51.1395, 4.7559 Carmen de Carupa, Colombia, 5.3503, -73.9053 Prabhat Pattan, India, 21.6407, 78.2722 Flemington, Australia, -33.8680, 151.0709 Mendig, Germany, 50.3744, 7.2808 Uchti, India, 25.9197, 86.2544 Satghara, India, 26.3977, 86.1678 San Zenon, Colombia, 9.2450, -74.4992 Tekpanja, India, 22.2086, 88.3122 Govindapuram, India, 16.1548, 80.1027 Rebordosa, Portugal, 41.2167, -8.4167 Steynsrus, South Africa, -27.9500, 27.5667 Grants, United States, 35.1538, -107.8335 Kod, India, 22.8850, 75.1862 Kottapalem, India, 17.4360, 82.4950 Chaukhata, India, 25.0247, 81.7375 Datian, India, 25.4379, 87.8378 Belek, Turkey, 36.8500, 31.0500 Nalbach, Germany, 49.3667, 6.7667 Oborniki Slaskie, Poland, 51.2986, 16.9017 Omutinskiy, Russia, 56.4781, 67.6678 Cresskill, United States, 40.9405, -73.9596 Governador Archer, Brazil, -5.0219, -44.2708 Usworth, United Kingdom, 54.9400, -1.5500 Gok, India, 27.1065, 88.2459 Hirske, Ukraine, 48.7519, 38.4950 Katakwi, Uganda, 1.9150, 33.9550 Ouedeme, Benin, 6.7000, 1.6833 Consaca, Colombia, 1.2000, -77.4667 Guryongpo, Korea, South, 35.9833, 129.5500 Absecon, United States, 39.4229, -74.4944 Rada Tilly, Argentina, -45.9333, -67.5333 Rincao, Brazil, -21.5869, -48.0708 Rondon, Brazil, -23.4108, -52.7608 Lamorlaye, France, 49.1556, 2.4417 Ambara, India, 22.1902, 78.6708 Crawford, United States, 41.5685, -74.3169 Chotebor, Czechia, 49.7208, 15.6703 Tineo, Spain, 43.3333, -6.4167 Douglas, United States, 42.0524, -71.7515 Futami, Japan, 34.5062, 136.7795 Sogam, India, 34.5014, 74.3823 Coatetelco, Mexico, 18.7294, -99.3256 Little Falls, United States, 45.9862, -94.3586 Rockingham, United States, 34.9386, -79.7608 Sarkad, Hungary, 46.7400, 21.3778 Kenar, India, 25.2916, 85.7416 Zeerust, South Africa, -25.5333, 26.0833 Mount Pleasant, United States, 40.9625, -91.5452 Suances, Spain, 43.4333, -4.0500 Davuluru, India, 16.2625, 80.7436 Nagaoki, Japan, 32.9781, 130.6058 Bonnievale, South Africa, -33.9275, 20.1006 Campamento, Colombia, 6.9789, -75.2964 Calamar, Colombia, 1.9206, -72.5542 Bemarivo, Madagascar, -17.8060, 44.7076 Logatec, Slovenia, 45.9167, 14.2297 Ouaregou, Burkina Faso, 11.8000, -0.7000 Portlethen, United Kingdom, 57.0610, -2.1300 Koila Belwa, India, 26.3753, 84.9986 Yeldurti, India, 17.9074, 78.3721 Greytown, South Africa, -29.0667, 30.5833 Marinka, Ukraine, 47.9419, 37.5036 Dasaut, India, 25.8997, 86.0964 Hokur Badasgom, India, 33.6503, 75.2359 Umreth, India, 22.1262, 78.7149 Haripura, India, 34.0601, 74.7125 Gadzhiyevo, Russia, 69.2500, 33.4167 Springfield, United States, 43.2907, -72.4809 Paraparaumu Beach, New Zealand, -40.8880, 174.9830 Zorbig, Germany, 51.6167, 12.1167 Bimawan, India, 25.5111, 84.4946 Kozuchow, Poland, 51.7500, 15.6000 Dorogobuzh, Russia, 54.9167, 33.3000 Mauji, India, 25.6585, 86.2313 Yui, Japan, 35.1000, 138.5667 Pawlowice, Poland, 49.9628, 18.7181 Majhaulia, India, 25.9635, 85.5738 Periyamuttur, India, 12.4630, 78.1969 Tuscumbia, United States, 34.7204, -87.7035 New Scotland, United States, 42.6047, -73.9413 Essen, Germany, 52.7211, 7.9406 Bougival, France, 48.8667, 2.1333 Hussepur, India, 26.1801, 84.9408 Daita, India, 24.3497, 87.9342 Jemaat Oulad Mhamed, Morocco, 33.0938, -7.0519 Velampatti, India, 10.2311, 78.2294 Brejao, Brazil, -9.0300, -36.5689 Bageshwar, India, 29.8380, 79.7710 Riverside, United States, 41.8310, -87.8169 Beuvry, France, 50.5206, 2.6803 Andiyappanur, India, 12.5342, 78.7024 Benahavis, Spain, 36.5190, -5.0454 Dinnington, United Kingdom, 53.3667, -1.2000 Mirzanagar, India, 25.7726, 85.3804 Banaruyeh, Iran, 28.0864, 54.0481 Kanasanapalle, India, 16.5227, 80.7772 Gurmia, India, 25.8190, 85.2295 Carignano, Italy, 44.9069, 7.6732 Jamunia, India, 25.3676, 87.0477 Ban Tha Phra, Thailand, 16.3480, 102.7983 Scionzier, France, 46.0581, 6.5503 Mendicino, Italy, 39.2628, 16.1945 Karayilan, Turkey, 36.7167, 36.2333 Pontardulais, United Kingdom, 51.7100, -4.0400 Suganwan, India, 25.1176, 85.0022 Fiumefreddo di Sicilia, Italy, 37.7915, 15.2092 Jumla, Nepal, 29.2500, 82.2167 Kirchberg, Switzerland, 47.4116, 9.0402 Mosciano Sant'Angelo, Italy, 42.7500, 13.8833 Notodden, Norway, 59.5594, 9.2585 Sibilia, Guatemala, 15.0000, -91.6167 Pedda Mupparam, India, 17.4792, 79.6817 Marai Kalan, India, 24.0211, 85.3506 Sinaia, Romania, 45.3500, 25.5514 Luis Gomes, Brazil, -6.4139, -38.3889 Hagaranahalli, India, 12.3677, 76.4173 Sergiyevsk, Russia, 53.9450, 51.1711 Mbuzini, South Africa, -25.9333, 31.9333 Tuskegee, United States, 32.4409, -85.7131 Hook, United Kingdom, 51.2773, -0.9633 Fatehpur Bala, India, 25.8338, 85.6928 Nykobing Mors, Denmark, 56.7917, 8.8499 Sarzeau, France, 47.5281, -2.7686 Viravada, India, 17.1194, 82.2110 Gidha, India, 26.0507, 86.8176 Bernalillo, United States, 35.3127, -106.5537 Ghat Borul, India, 17.7700, 77.1400 Alampur, India, 24.8721, 83.8829 East Grand Forks, United States, 47.9286, -97.0138 Chalastra, Greece, 40.6333, 22.7333 Chandpur, India, 22.4368, 88.1711 Vinhais, Portugal, 41.8167, -7.0000 Carregado, Portugal, 39.0167, -8.9667 Puttai, India, 11.8957, 78.8874 Orte, Italy, 42.4603, 12.3861 Amal, Sweden, 59.0500, 12.7000 Berndorf, Austria, 47.9428, 16.1036 Adjido, Benin, 7.0333, 1.9833 Iquira, Colombia, 2.6500, -75.6500 Kawara, Niger, 14.0706, 5.6715 West Athens, United States, 33.9235, -118.3033 Berching, Germany, 49.1000, 11.4333 Venkatadripalem, India, 16.0506, 79.2170 Oggiono, Italy, 45.7833, 9.3500 Ewo, Congo (Brazzaville), -0.8742, 14.8167 Neuotting, Germany, 48.2167, 12.6833 Campobello di Licata, Italy, 37.2594, 13.9192 Hampstead, United States, 42.8821, -71.1710 Orange Park, United States, 30.1706, -81.7041 Wenzenbach, Germany, 49.0747, 12.1944 Sarauni, India, 24.8613, 85.8712 Kings Grant, United States, 34.2664, -77.8659 Wollert, Australia, -37.5970, 145.0330 Nova Paka, Czechia, 50.4897, 15.5136 Grabels, France, 43.6486, 3.8025 Escaudain, France, 50.3350, 3.3430 Saraiya, India, 24.8012, 84.0816 Uppugunduru, India, 15.6730, 80.1670 Booneville, United States, 34.6643, -88.5684 Mendon, United States, 42.9859, -77.5479 Tarhjicht, Morocco, 29.0564, -9.4281 Strehaia, Romania, 44.6222, 23.1972 Bansko, Bulgaria, 41.8385, 23.4888 Magny-le-Hongre, France, 48.8631, 2.8133 Wadhraf, Tunisia, 33.9833, 9.9667 Almusafes, Spain, 39.2903, -0.4147 Vert-Saint-Denis, France, 48.5650, 2.6147 Joigny, France, 47.9831, 3.3978 Tala, India, 24.3735, 81.1989 Lacchiarella, Italy, 45.3250, 9.1400 Lapeer, United States, 43.0447, -83.3253 Micco, United States, 27.8683, -80.5100 Townsend, United States, 42.6671, -71.7115 Sao Francisco, Brazil, -5.1228, -47.3858 Januario Cicco, Brazil, -6.1578, -35.6008 Udarband, India, 24.8698, 92.8694 Ayanikkad, India, 10.4580, 76.1260 Bocaiuva do Sul, Brazil, -25.2058, -49.1150 Salto Grande, Brazil, -22.8928, -49.9858 Bonhill, United Kingdom, 55.9830, -4.5670 Lanark, United Kingdom, 55.6749, -3.7770 Fehrbellin, Germany, 52.7997, 12.7667 Montoro, Spain, 38.0167, -4.3833 Leppavirta, Finland, 62.5000, 27.7833 Kegen, Kazakhstan, 43.0197, 79.2203 Colac, Australia, -38.3403, 143.5847 Prados, Brazil, -21.0578, -44.0800 Intich'o, Ethiopia, 14.2667, 39.1500 Mohon, France, 49.7520, 4.7315 Manoke, India, 30.6750, 75.4560 Sanatoga, United States, 40.2497, -75.5887 La Florida, Colombia, 1.3017, -77.4106 Mamnur, India, 17.9092, 79.5926 Borgosatollo, Italy, 45.4761, 10.2400 Poiana Mare, Romania, 43.9333, 23.0833 Lynwood, United States, 41.5235, -87.5510 Clinton, United States, 38.3716, -93.7679 Khasbalanda, India, 22.5881, 88.6887 Abu Khashab, Syria, 35.9481, 40.0220 Livno, Bosnia and Herzegovina, 43.8269, 17.0081 Banire Kore, Mali, 15.2072, -9.1517 Mostyska, Ukraine, 49.7942, 23.1525 Citrus Hills, United States, 28.8870, -82.4312 Tadla, Morocco, 32.4409, -8.3708 Janhapara, India, 21.3390, 83.7310 Fossombrone, Italy, 43.6890, 12.8061 Andilana Avaratra, Madagascar, -17.3576, 48.5446 Altinova, Turkey, 40.6975, 29.5114 Economy, United States, 40.6411, -80.1841 Podenzano, Italy, 44.9500, 9.6833 Santa Sylvina, Argentina, -27.7833, -61.1500 Tomblaine, France, 48.6833, 6.2167 Leven, United Kingdom, 56.1950, -2.9942 Warkan, India, 25.0331, 72.6862 Dadrewa, India, 28.6728, 75.2328 Ban Ngio Ngam, Thailand, 17.6671, 100.1754 Newark, United States, 43.0418, -77.0930 Fuldabruck, Germany, 51.4000, 9.4667 Grenade, France, 43.7722, 1.2936 Charakunda, India, 16.6916, 78.7054 Monteroni d'Arbia, Italy, 43.2333, 11.4167 Corona de Tucson, United States, 31.9503, -110.7835 Krichim, Bulgaria, 42.0500, 24.4667 Kusterdingen, Germany, 48.5312, 9.1484 Neuried, Germany, 48.0933, 11.4658 Iijima, Japan, 35.6767, 137.9198 Yenice, Turkey, 41.2000, 32.3292 Meridiala, Mali, 12.0917, -7.2592 Beregadougou, Burkina Faso, 10.7667, -4.7500 Aadorf, Switzerland, 47.4939, 8.8975 Tajpur, India, 25.9022, 84.5055 Villa Castelli, Italy, 40.5833, 17.4833 Tiburon, United States, 37.8854, -122.4637 Roztoky, Czechia, 50.1614, 14.3869 Adami Tulu, Ethiopia, 7.8667, 38.7000 Gohi Bishunpur, India, 25.9275, 85.8626 Harleysville, United States, 40.2792, -75.3873 Ksar Belezma, Algeria, 35.6756, 5.9033 Nagykallo, Hungary, 47.8831, 21.8500 Westerland, Germany, 54.9100, 8.3075 Poisy, France, 45.9216, 6.0622 Fontaine-les-Dijon, France, 47.3433, 5.0206 Porto Tolle, Italy, 44.9500, 12.3167 Oak Grove, United States, 45.3409, -93.3264 Furtwangen im Schwarzwald, Germany, 48.0503, 8.2092 Dunbar, United Kingdom, 56.0027, -2.5169 Rice Lake, United States, 45.4864, -91.7447 Dharampur, India, 25.2417, 82.2331 Monticello Conte Otto, Italy, 45.6000, 11.5833 Nanzhuang, Taiwan, 24.5699, 121.0157 Velyki Luchky, Ukraine, 48.4200, 22.5611 Nhan Trach, Vietnam, 19.0500, 105.5500 Kurichedu, India, 15.9000, 79.5833 Kannal, India, 18.6938, 79.4288 Katsuyama, Japan, 35.0876, 133.6913 Sint-Martens-Lennik, Belgium, 50.8000, 4.1500 Rampur Khajuriya, India, 26.3923, 84.7688 Pivnichne, Ukraine, 48.3886, 37.9067 Coqueiral, Brazil, -21.1889, -45.4408 Reinfeld, Germany, 53.8333, 10.4833 Breuillet, France, 48.5658, 2.1706 Ampasimpotsy-Gara, Madagascar, -18.9618, 48.3403 Ceelbuur, Somalia, 4.6850, 46.6175 Benton Harbor, United States, 42.1159, -86.4488 Cheste, Spain, 39.4797, -0.6844 Sahapur, India, 22.5200, 88.1700 Manatuto, Timor-Leste, -8.5114, 126.0131 Craig, United States, 40.5171, -107.5554 East Nottingham, United States, 39.7621, -75.9705 Reshetylivka, Ukraine, 49.5667, 34.0667 Beckwith, Canada, 45.0833, -76.0667 Blairgowrie, United Kingdom, 56.5916, -3.3405 Cupar, United Kingdom, 56.3200, -3.0100 Nadol, India, 25.3670, 73.4500 Bockhorn, Germany, 53.4000, 8.0167 Kaniwara, India, 22.2145, 79.7366 Mali, India, 25.6549, 86.7275 Foiano della Chiana, Italy, 43.2567, 11.8164 Hohenbrunn, Germany, 48.0500, 11.7000 Moman Barodiya, India, 23.6042, 76.3364 San Francisco, Honduras, 14.1156, -88.3707 San Ignacio, Costa Rica, 9.7997, -84.1630 Mandishah, Egypt, 28.3515, 28.9317 Babai Kalan, India, 22.8313, 78.6774 Ban Wang Pradu, Thailand, 16.7600, 100.3500 Karliova, Turkey, 39.2992, 41.0142 Cape St. Claire, United States, 39.0433, -76.4471 Coronel Du Graty, Argentina, -27.6667, -60.9333 Oakengates, United Kingdom, 52.6950, -2.4510 Lakhna, India, 25.8865, 87.6001 Dhauni, India, 24.9901, 87.0011 Madhurapur, India, 25.9456, 85.9759 Aplao, Peru, -16.0713, -72.4882 Estanzuelas, El Salvador, 13.6500, -88.5000 Narsingi, India, 18.0446, 78.4254 Basdeopur, India, 25.3909, 86.6821 Hatti Mattur, India, 14.9435, 75.4239 Summit View, United States, 47.1343, -122.3467 Audubon, United States, 40.1304, -75.4280 Treia, Italy, 43.3114, 13.3131 Akat Amnuai, Thailand, 17.5964, 103.9816 Mburucuya, Argentina, -28.0500, -58.2333 Meltham, United Kingdom, 53.5920, -1.8500 Harua, India, 24.5257, 87.9898 Kaeng Khro, Thailand, 16.1086, 102.2581 Labrador City, Canada, 52.9500, -66.9167 Moranha, India, 27.1874, 94.9156 West Donegal, United States, 40.1297, -76.6226 Kasane, Botswana, -17.7983, 25.1536 Hemmoor, Germany, 53.7025, 9.1394 Caxias, Portugal, 38.7000, -9.2833 Mishrikot, India, 15.2465, 75.0567 Burgos, Philippines, 16.5250, 120.4583 Yarmouth, United States, 43.7978, -70.1719 Perondi, Albania, 40.7789, 19.9231 Lake Park, United States, 26.7998, -80.0681 Rafard, Brazil, -23.0117, -47.5269 Venturina, Italy, 43.0333, 10.6000 Omurtag, Bulgaria, 43.1069, 26.4198 Chanco, Chile, -36.2859, -72.7107 Chanco, Chile, -36.2667, -72.7167 Kambaneri Pudukkudi, India, 9.0685, 77.3795 Tha Luang, Thailand, 15.0712, 101.0980 Madhavaram, India, 16.8900, 81.5937 Crvenka, Serbia, 45.6583, 19.4556 Vuktyl, Russia, 63.7000, 57.3167 Lo Miranda, Chile, -34.1900, -70.8900 Diabugu, Gambia, The, 13.3833, -14.4000 Jangalapalli, India, 14.4818, 79.8906 Urpaar, India, 31.0537, 75.9652 Lohara, India, 29.1667, 77.2167 Ugamedi, India, 22.0010, 71.6481 Tikar, India, 23.1500, 71.1000 Ain el Mediour, Morocco, 30.4000, -8.8833 Chitcani, Moldova, 46.7856, 29.6086 Maropaika, Madagascar, -22.7088, 46.9758 Morafeno, Madagascar, -14.3695, 50.0450 Soamahamanina, Madagascar, -18.9885, 47.0163 Ambodivoanio, Madagascar, -16.1834, 49.6574 Tsimafana, Madagascar, -19.7219, 44.5841 Sahatsiho-Ambohimanjaka, Madagascar, -20.2020, 47.0907 Ranopiso, Madagascar, -25.0548, 46.6846 Ivandrika, Madagascar, -22.8738, 47.7259 Marotolana, Madagascar, -14.6086, 49.0275 Ambatoria, Madagascar, -14.4611, 48.9523 Lanivo, Madagascar, -22.2940, 47.8148 Sarasambo, Madagascar, -25.1081, 46.7884 Antambohobe, Madagascar, -22.3119, 46.7751 Ambalajia, Madagascar, -17.4965, 46.1206 Nato, Madagascar, -22.3089, 47.8296 Mahamaibe, Madagascar, -21.7551, 47.8857 Mitanty, Madagascar, -21.7284, 47.9989 Salobe, Madagascar, -23.5333, 44.7167 Ambariokorano, Madagascar, -15.8964, 48.9716 Vohilava, Madagascar, -21.7661, 47.9104 Vatananto, Madagascar, -23.7000, 47.2167 Iara, Madagascar, -23.0835, 47.4372 Ampary, Madagascar, -19.1911, 46.5895 Ambalaromba, Madagascar, -14.6731, 49.3363 Ambatoharanana, Madagascar, -16.4252, 49.5820 Befotaka, Madagascar, -20.8333, 45.6667 Soamanonga, Madagascar, -23.8786, 44.7906 Bemaharivo, Madagascar, -16.1416, 46.3934 Anteza, Madagascar, -21.6717, 47.8446 Bekopaka, Madagascar, -19.1460, 44.7931 Antaly, Madagascar, -24.3833, 44.4000 Anjialava, Madagascar, -14.0802, 49.7271 Ankarana-Miraihina, Madagascar, -23.0849, 47.6302 Tsaratanana, Madagascar, -15.6417, 47.8491 Antsaidoha-Bebao, Madagascar, -17.3620, 44.5452 Nosibe, Madagascar, -13.1577, 49.7934 Soanierana, Madagascar, -25.0049, 46.8906 Ambatolahy, Madagascar, -19.7397, 47.2847 Soanenga, Madagascar, -16.5044, 44.6111 Mahabo, Madagascar, -24.2898, 45.2230 Manampaneva, Madagascar, -16.0502, 48.6817 Manja, Madagascar, -21.4329, 44.3333 Ambinanin' Andravory, Madagascar, -13.7728, 49.7519 Belinta, Madagascar, -19.9537, 45.1167 Marovatolena, Madagascar, -15.1890, 47.6445 Morarano, Madagascar, -19.4280, 47.4873 Antsahavaribe, Madagascar, -13.8564, 49.8639 Antseza, Madagascar, -16.2142, 45.8605 Andribavontsona, Madagascar, -15.3860, 47.5011 Ankiliabo, Madagascar, -24.6843, 44.7233 Antanankambano, Madagascar, -22.0606, 47.4764 Alakamisy-Ambohimahazo, Madagascar, -20.4082, 47.3566 Benato-Toby, Madagascar, -23.0853, 45.8581 Ankirihitra, Madagascar, -16.7715, 46.4422 Antsatramidola, Madagascar, -15.6334, 48.9686 Amboronabo, Madagascar, -22.6759, 44.3880 Manevy, Madagascar, -24.3901, 46.8045 Beparasy, Madagascar, -19.1687, 48.0338 Tandrano, Madagascar, -22.0843, 44.6385 Fierenana, Madagascar, -18.4833, 48.4000 Ambarimaninga, Madagascar, -16.4941, 46.0036 Ambodimahabibo, Madagascar, -15.7320, 48.1278 's-Gravendeel, Netherlands, 51.7812, 4.6176 Tatarsk, Russia, 55.2500, 75.9833 Dhiban, Syria, 35.0150, 40.5103 Velyka Dymerka, Ukraine, 50.5928, 30.9103 Stryzhavka, Ukraine, 49.3103, 28.4808 Dahbed, Uzbekistan, 39.7636, 66.9131 Qahramon, Uzbekistan, 40.3050, 68.6017 Gisborne, Australia, -37.4900, 144.5889 Carneiros, Brazil, -9.4828, -37.3769 Marcacao, Brazil, -6.7700, -35.0150 Puerto Octay, Chile, -40.9667, -72.9000 Patut, India, 25.4658, 84.8140 Hetanpur, India, 25.5821, 85.5495 Kalicherla, India, 13.8833, 78.5333 Furth im Wald, Germany, 49.3097, 12.8400 Rarz, Tajikistan, 39.3803, 68.7442 Dholbaja, India, 26.2674, 87.2761 San Pedro Atocpan, Mexico, 19.2006, -99.0492 Mbamba Bay, Tanzania, -11.2833, 34.7717 Seneca Falls, United States, 42.9136, -76.7904 Morieres-les-Avignon, France, 43.9425, 4.9053 Hirehaluhosahalli, India, 15.0105, 76.8360 Nueva Guadalupe, El Salvador, 13.5333, -88.3500 Novyi Svit, Ukraine, 47.8058, 38.0186 Bad Lauchstadt, Germany, 51.3667, 11.8333 Rajod, India, 22.9501, 75.0640 Panasapadu, India, 17.0185, 82.2349 Druento, Italy, 45.1347, 7.5766 Meadow Lakes, United States, 61.6380, -149.6080 Hurtgenwald, Germany, 50.7100, 6.3744 Settivaripalle, India, 14.7543, 78.7649 Peddannavaripalle, India, 14.2535, 78.3384 Ixtapa Zihuatanejo, Mexico, 17.6367, -101.5514 Podu Iloaiei, Romania, 47.2167, 27.2667 Windsor, United States, 43.2405, -89.2948 Icaraima, Brazil, -23.3958, -53.6139 Devanangurichchi, India, 11.3895, 77.8547 Saffle, Sweden, 59.1333, 12.9000 Indian Harbour Beach, United States, 28.1529, -80.5976 Gacko, Bosnia and Herzegovina, 43.1667, 18.5333 Oststeinbek, Germany, 53.5442, 10.1664 Kandra, India, 22.8517, 86.0519 Kulpsville, United States, 40.2440, -75.3407 Iscuande, Colombia, 2.4444, -77.9717 Pullach im Isartal, Germany, 48.0500, 11.5167 Gudluru, India, 15.0667, 79.9000 Chundale, India, 11.5739, 76.0578 'Ain Leuh, Morocco, 33.2833, -5.3833 Apahida, Romania, 46.8078, 23.7400 Hillcrest, United States, 41.1298, -74.0350 Shelburne, Canada, 44.0833, -80.2000 Ardooie, Belgium, 50.9667, 3.1833 Santana do Manhuacu, Brazil, -20.1078, -41.9250 Liffre, France, 48.2142, -1.5067 Kanchanpalli, India, 17.7427, 79.3128 Togou, Mali, 13.5911, -5.9981 Dulce Nombre de Maria, El Salvador, 14.1500, -89.0167 Urdinarrain, Argentina, -32.6856, -58.8867 Bassenge, Belgium, 50.7583, 5.6094 Hirayama, Japan, 33.6467, 130.5000 Fairless Hills, United States, 40.1783, -74.8524 Arboledas, Colombia, 7.6667, -72.7500 Veauche, France, 45.5628, 4.2786 Telaprolu, India, 16.5860, 80.8900 Kosum Phisai, Thailand, 16.2486, 103.0674 Tiou, Burkina Faso, 11.9500, -2.2000 Seydunganallur, India, 8.6624, 77.8293 Almargem, Portugal, 38.8475, -9.2714 Puerto Lleras, Colombia, 3.2694, -73.3750 Khiriawan, India, 25.1120, 84.4017 Chilon, Mexico, 17.1167, -92.2833 Pithiviers, France, 48.1725, 2.2525 Stanley, Canada, 49.1331, -98.0656 Zschopau, Germany, 50.7500, 13.0667 Dardilly, France, 45.8064, 4.7536 Kattamuru, India, 17.0800, 82.1300 San Francisco Ixhuatan, Mexico, 16.3500, -94.4833 Acobamba, Peru, -12.8431, -74.5694 North Kensington, United States, 39.0393, -77.0723 Akpassi, Benin, 8.4500, 1.8833 Bayabas, Philippines, 8.9678, 126.2817 Zwiesel, Germany, 49.0167, 13.2333 Hosuru, India, 15.3797, 77.4598 Sanganakallu, India, 15.1847, 76.9703 Pulimakkal, India, 9.6500, 76.7167 Taber, Canada, 49.7847, -112.1508 Huasco, Chile, -28.4664, -71.2192 Pedda Pendyala, India, 17.9230, 79.4085 Kalanchak, Ukraine, 46.2522, 33.2906 Higuera de Zaragoza, Mexico, 25.9500, -109.2833 Saline, United States, 42.1740, -83.7780 Lapinlahti, Finland, 63.3667, 27.3833 Linares, Colombia, 1.3500, -77.5333 Ponnada, India, 18.2536, 83.9012 Bhirua, India, 25.8509, 86.3319 Barwan, India, 23.9379, 87.9350 Purcellville, United States, 39.1378, -77.7110 Iseo, Italy, 45.6586, 10.0536 Pena Forte, Brazil, -7.8289, -39.0769 Yekambarakuppam, India, 13.3168, 79.5678 Sidi Dahbi, Morocco, 33.0500, -7.1833 Tepechitlan, Mexico, 21.6667, -103.3333 Neustadt, Germany, 50.7333, 11.7500 Talevad, India, 17.1700, 75.9600 Lerma, Mexico, 19.8000, -90.6000 Thung Sai, Thailand, 16.3149, 99.8327 Mahamda, India, 25.8108, 84.7874 Pararia, India, 25.6492, 86.7501 Borgoricco, Italy, 45.5336, 11.9659 Valea lui Mihai, Romania, 47.5200, 22.1300 Ianca, Romania, 45.1350, 27.4747 Vrhnika, Slovenia, 45.9624, 14.2937 Tulbagh, South Africa, -33.2850, 19.1378 Aberdeen, United States, 35.1350, -79.4326 Kelso, Australia, -33.4189, 149.6058 Miradouro, Brazil, -20.8908, -42.3428 Lolokhur, India, 26.4136, 87.4012 Lincoln Village, United States, 39.9532, -83.1314 Westwood, United States, 42.3031, -85.6286 Monforte del Cid, Spain, 38.3833, -0.7167 Ashbourne, United Kingdom, 53.0160, -1.7310 Beni Oulid, Morocco, 34.5897, -4.4514 Al Yadudah, Syria, 32.6751, 36.0565 Llanharan, United Kingdom, 51.5300, -3.4300 Saint Sampson, Guernsey, 49.4819, -2.5411 Tzitzio, Mexico, 19.5856, -100.9231 Bosel, Germany, 53.0058, 7.9542 Kharsawan, India, 22.7909, 85.8310 Siachoque, Colombia, 5.5000, -73.2333 Mudgere, India, 13.1370, 75.6060 Fitzgerald, United States, 31.7134, -83.2514 Tovala, India, 8.2312, 77.5060 Aver-o-Mar, Portugal, 41.4039, -8.7690 Fredensborg, Denmark, 55.9735, 12.4039 Segni, Italy, 41.6833, 13.0167 Nuqui, Colombia, 5.7167, -77.2667 Unagatla, India, 16.9611, 81.6610 Slavgorod, Russia, 52.9833, 78.6667 Tysmenytsia, Ukraine, 48.9008, 24.8492 Perkiomen, United States, 40.2316, -75.4644 Ibitirama, Brazil, -20.5408, -41.6669 Sarenja, India, 25.4449, 83.8942 Gazulapalle, India, 15.4036, 78.6176 Orting, United States, 47.0967, -122.2112 Wetter, Germany, 50.8833, 8.7167 Sileby, United Kingdom, 52.7310, -1.1060 Hlobyne, Ukraine, 49.3903, 33.2503 Rio das Flores, Brazil, -22.1678, -43.5858 Wangdue Phodrang, Bhutan, 27.4833, 89.9000 Sanchi, India, 23.4865, 77.7378 Bir Tam Tam, Morocco, 33.9833, -4.6333 Khodoriv, Ukraine, 49.4044, 24.3122 Kennedale, United States, 32.6434, -97.2172 La Fare-les-Oliviers, France, 43.5525, 5.1950 Bayyavaram, India, 17.6638, 82.9420 Kusmaul, India, 26.1911, 87.1311 San Francisco Chimalpa, Mexico, 19.4419, -99.3419 Velden am Worthersee, Austria, 46.6000, 14.0333 Yaguara, Colombia, 2.6661, -75.5186 Al Hammamiyah, Egypt, 26.9308, 31.4877 Noventa Vicentina, Italy, 45.2833, 11.5333 Bazimini, Comoros, -12.1833, 44.4500 Tvrdosin, Slovakia, 49.3369, 19.5503 Donnacona, Canada, 46.6747, -71.7294 Sucha Beskidzka, Poland, 49.7403, 19.5886 Mnichovo Hradiste, Czechia, 50.5214, 14.9736 Cebazat, France, 45.8322, 3.1006 Karadge, India, 16.4200, 74.5800 Phulhara, India, 25.8937, 86.1300 Vanavasi, India, 11.7523, 77.8779 Morropon, Peru, -5.1867, -79.9708 Flanders, United States, 40.8412, -74.7102 Edgewater Park, United States, 40.0540, -74.9117 Gross Kreutz, Germany, 52.4000, 12.7833 Ouled Rahou, Algeria, 36.0069, 0.5919 Checy, France, 47.8942, 2.0275 Sambhu Chak, India, 26.4081, 84.9227 Bawana, India, 28.7620, 77.0630 Aviano, Italy, 46.0667, 12.5833 Kangal, Turkey, 39.2367, 37.3886 Ladue, United States, 38.6377, -90.3815 Villa Aberastain, Argentina, -31.6500, -68.5833 Angelopolis, Colombia, 6.1333, -75.7000 Steinheim am Albuch, Germany, 48.6922, 10.0642 Ben Chicao, Algeria, 36.1997, 2.8486 San Mateo, Guatemala, 14.8667, -91.5833 Baba Bakala, India, 31.5550, 75.2656 Sheffield Lake, United States, 41.4883, -82.0979 Natuba, Brazil, -7.6408, -35.5500 Bhelsi, India, 24.7866, 79.1281 Jasauli Patti, India, 26.4912, 84.8818 Dalavaypattanam, India, 10.6747, 77.4845 Attnang-Puchheim, Austria, 48.0167, 13.7197 Ramnagar, India, 32.8073, 75.3112 Acucena, Brazil, -19.0728, -42.5458 Chitvel, India, 14.1667, 79.3333 Czarna Bialostocka, Poland, 53.3000, 23.2833 Yasenivskyi, Ukraine, 48.1606, 39.2175 Nanmucun, China, 25.1647, 114.5549 Ferryhill, United Kingdom, 54.6900, -1.5500 Munagala, India, 17.0500, 79.8333 Manteno, United States, 41.2470, -87.8457 Colmeia, Brazil, -8.7289, -48.7650 Tena, Colombia, 4.6547, -74.3900 Corgao, India, 15.7096, 73.7497 Bikkatti, India, 11.3741, 76.7513 Yellanda, India, 17.7929, 79.5912 Esanai, India, 11.3004, 78.8314 Malior, India, 25.3900, 87.8473 Kotabommali, India, 18.5333, 84.1667 Colorno, Italy, 44.9300, 10.3758 Peebles, United Kingdom, 55.6519, -3.1889 Broughton Astley, United Kingdom, 52.5278, -1.2275 Buyukorhan, Turkey, 39.7500, 28.9167 Viale, Argentina, -31.8667, -60.0167 Tshabong, Botswana, -26.0200, 22.4056 Policka, Czechia, 49.7150, 16.2675 Gonfreville-l'Orcher, France, 49.5058, 0.2342 Brimington, United Kingdom, 53.2580, -1.3905 Borio, India, 25.0344, 87.5925 Nawada, India, 25.5037, 85.7325 Ramgarha, India, 25.7983, 84.9592 Almoloya del Rio, Mexico, 19.1586, -99.4886 Harahan, United States, 29.9374, -90.2031 Meadowbrook, United States, 33.3935, -86.7041 West Caln, United States, 40.0237, -75.8866 Rio del Mar, United States, 36.9607, -121.8807 Messini, Greece, 37.0500, 22.0000 Montagnana, Italy, 45.2333, 11.4658 Valley Center, United States, 37.8332, -97.3646 Pulaski, United States, 37.0528, -80.7624 Caputira, Brazil, -20.1719, -42.2708 Ban Nikhom Phatthana, Thailand, 16.7242, 99.9697 Haledon, United States, 40.9363, -74.1887 Khagaur, India, 25.1744, 86.1021 Kafr Sajnah, Syria, 35.5279, 36.5896 Boucau, France, 43.5244, -1.4853 Gouvieux, France, 49.1883, 2.4169 Chinna Kalaiyamputtur, India, 10.4714, 77.4657 Hurzuf, Ukraine, 44.5528, 34.2875 Cloverdale, United States, 38.7962, -123.0152 Glastonbury, United Kingdom, 51.1475, -2.7175 Monteforte d'Alpone, Italy, 45.4167, 11.2833 Bounaamane, Morocco, 29.5283, -9.8044 Seddouk Oufella, Algeria, 36.6061, 4.6389 Guttikonda, India, 16.4300, 79.8340 Qashyr, Kazakhstan, 53.0804, 76.0900 Thap Than, Thailand, 15.4606, 99.8917 Bni Sidel, Morocco, 35.1392, -3.1281 La Junta, Mexico, 28.4778, -107.3317 Plainedge, United States, 40.7241, -73.4770 Nunchia, Colombia, 5.6333, -72.2000 Zalishchyky, Ukraine, 48.6500, 25.7333 Chachersk, Belarus, 52.9161, 30.9161 Shahr-e Pir, Iran, 28.3122, 54.3328 Zhur, Kosovo, 42.1639, 20.6211 Juncos, Puerto Rico, 18.2256, -65.9161 Kovvali, India, 16.7333, 81.1667 Floro, Norway, 61.5986, 5.0172 Horokhiv, Ukraine, 50.4994, 24.7650 Balvadi, India, 21.4412, 75.2230 Castelnuovo Berardenga, Italy, 43.3472, 11.5042 Cholavaram, India, 13.2389, 80.1627 Kara-Bak, Kyrgyzstan, 40.1583, 70.8167 Vila Nova de Cerveira, Portugal, 41.9400, -8.7444 Wesley Chapel, United States, 34.9985, -80.6903 Libonik, Albania, 40.7500, 20.7167 Tlahuitoltepec, Mexico, 17.1000, -96.0667 Thi Tran Dong Dang, Vietnam, 21.9458, 106.6967 Ramapattanam, India, 10.7106, 76.9183 Bodaybo, Russia, 57.8667, 114.2000 Terra Nova, Brazil, -8.2300, -39.3758 Eslohe, Germany, 51.2500, 8.1667 Mangalpur Gudaria, India, 26.6513, 84.4832 Nanguneri, India, 8.4906, 77.6588 Maldah, India, 25.1740, 85.7599 Chirongui, Mayotte, -12.9344, 45.1511 Upper Leacock, United States, 40.0801, -76.1854 Plon, Germany, 54.1622, 10.4214 Khoragachhi, India, 26.3344, 87.5411 Guarani, Brazil, -21.3519, -43.0469 Vohburg an der Donau, Germany, 48.7667, 11.6167 Santa Maria del Tule, Mexico, 17.0465, -96.6363 Sai Ngam, Thailand, 16.4669, 99.8902 Filottrano, Italy, 43.4344, 13.3503 Florida, Chile, -36.8167, -72.6667 Barhagarh, India, 19.6450, 84.4079 Asolo, Italy, 45.8000, 11.9167 Borskoye, Russia, 53.0261, 51.6983 Kui Buri, Thailand, 12.0828, 99.8543 Gerstungen, Germany, 50.9625, 10.0597 Penaballi, India, 17.2103, 80.6978 Kilankundal, India, 10.7543, 77.7269 Sepolno Krajenskie, Poland, 53.4500, 17.5300 Dashouping, China, 23.6425, 111.6978 Mansfield, United States, 40.0853, -74.7149 Plymouth, United States, 43.7447, -87.9660 Santa Isabel do Ivai, Brazil, -23.0053, -53.1878 Ingenbohl, Switzerland, 47.0028, 8.6117 Argelia, Colombia, 5.7425, -75.1464 Bellheim, Germany, 49.1981, 8.2792 Dayr as Sanquriyah, Egypt, 28.4868, 30.6648 Ampthill, United Kingdom, 52.0263, -0.4906 North Londonderry, United States, 40.3227, -76.5867 Dumri, India, 25.8605, 84.5512 Periyapodu, India, 10.6099, 76.8786 Kodikkulam, India, 9.9811, 78.2121 Krasnoslobodsk, Russia, 54.4333, 43.8000 Seneca, United States, 34.6818, -82.9600 Irigny, France, 45.6740, 4.8230 Dunavarsany, Hungary, 47.2828, 19.0661 Collier, United States, 40.3991, -80.1322 Corman Park No. 344, Canada, 52.2291, -106.8002 Virginia, Brazil, -22.3328, -45.0919 Brand-Erbisdorf, Germany, 50.8689, 13.3219 Felling, United Kingdom, 54.9500, -1.5640 Segarai, India, 10.7300, 79.5111 Northwest Harborcreek, United States, 42.1494, -79.9945 Evergreen, United States, 48.2308, -114.2700 Almagro, Spain, 38.8878, -3.7122 Basaha, India, 26.1329, 86.7480 Channubanda, India, 17.0331, 80.8056 Skidaway Island, United States, 31.9372, -81.0449 Helsinge, Denmark, 56.0197, 12.1990 Montmelo, Spain, 41.5547, 2.2500 Queven, France, 47.7894, -3.4139 Ayas, India, 24.2508, 87.7784 Bhadwar, India, 25.5576, 84.7559 Perl, Germany, 49.4667, 6.3667 Belvedere Marittimo, Italy, 39.6167, 15.8667 Makhambet, Kazakhstan, 47.6667, 51.5833 Chartiers, United States, 40.2505, -80.2495 Lakhanapuram, India, 18.7504, 83.5534 Palmeira d'Oeste, Brazil, -20.4158, -50.7619 Potangal, India, 18.5661, 77.7742 North Merritt Island, United States, 28.4585, -80.7162 Poteau, United States, 35.0282, -94.6346 Florstadt, Germany, 50.3158, 8.8631 Tullukuttinayakkanur, India, 9.8149, 77.6808 Ramon Santana, Dominican Republic, 18.5500, -69.1833 Vadasikarambattu, India, 11.6446, 79.6882 Wanaka, New Zealand, -44.7081, 169.1239 Amuria, Uganda, 2.0300, 33.6431 Yangiobod, Uzbekistan, 41.1192, 70.0942 Karor, India, 25.6018, 86.0930 Bellerive-sur-Allier, France, 46.1175, 3.4044 Cortez, United States, 37.3503, -108.5768 Caldwell, United States, 40.8389, -74.2776 Quetigny, France, 47.3153, 5.1069 Greenville, United States, 43.1797, -85.2534 Oxford, United States, 36.3155, -78.5848 Ibirapua, Brazil, -17.6878, -40.1089 Punjai Lakkapuram, India, 11.3050, 77.7554 Kishtwar, India, 33.3135, 75.7673 Maddur, India, 16.8602, 77.6121 San Jose de Gracia, Mexico, 22.1500, -102.4167 Zavolzhsk, Russia, 57.4667, 42.1500 Matias Cardoso, Brazil, -14.8550, -43.9219 Wabagai, India, 24.5309, 93.9376 Eruh, Turkey, 37.7497, 42.1797 Prienai, Lithuania, 54.6333, 23.9500 Tepetitlan, Mexico, 20.1842, -99.3808 San Marzano di San Giuseppe, Italy, 40.4500, 17.5000 Kanhauli, India, 26.4815, 86.1876 Tummalacheruvu, India, 16.5249, 79.7989 Tummalacheruvu, India, 17.7706, 80.7933 Hallstadt, Germany, 49.9333, 10.8833 Entraigues-sur-la-Sorgue, France, 44.0036, 4.9272 Zunilito, Guatemala, 14.6167, -91.5167 Douar Ait Taleb, Morocco, 32.3839, -8.1856 Awfouss, Morocco, 31.6833, -4.1667 Oak Island, United States, 33.9434, -78.1366 Shoshong, Botswana, -23.0333, 26.5167 Rimbach, Germany, 49.6240, 8.7603 Le Thor, France, 43.9300, 4.9950 Allahpur, India, 26.3434, 77.8195 Barhauna, India, 25.3040, 85.4216 Tarcento, Italy, 46.2167, 13.2167 Tiachiv, Ukraine, 48.0114, 23.5722 Ap Tan Ngai, Vietnam, 10.2369, 106.2878 Titz, Germany, 51.0061, 6.4242 Holywell, United Kingdom, 53.2740, -3.2230 Melpanaikkadu, India, 10.2599, 79.1169 Bidkhun, Iran, 27.4803, 52.6681 Ladan Kara, Kyrgyzstan, 40.9185, 72.9486 Summit, United States, 47.1694, -122.3628 Beaver Falls, United States, 40.7619, -80.3226 Metsemotlhaba, Botswana, -24.5531, 25.8039 Obernburg am Main, Germany, 49.8400, 9.1414 Partick, United Kingdom, 55.8714, -4.3086 Belisce, Croatia, 45.6825, 18.4069 Tharike, India, 30.8758, 75.7756 Francisco Caballero Alvarez, Paraguay, -24.1533, -54.6672 London Grove, United States, 39.8327, -75.8155 Nangis, France, 48.5556, 3.0153 Smimou, Morocco, 31.2167, -9.7000 L'Epiphanie, Canada, 45.8483, -73.5061 Ifield, United Kingdom, 51.1234, -0.2073 Rewahi, India, 26.2698, 87.2124 San Antonio, Philippines, 12.4140, 124.2790 Bainbridge, United States, 41.3855, -81.3478 Rio Claro, Trinidad and Tobago, 10.3042, -61.1708 Carmen de Apicala, Colombia, 4.1500, -74.7333 Sucre, Colombia, 2.0383, -76.9253 Palangavangudi, India, 10.7244, 78.8108 Village St. George, United States, 30.3598, -91.0672 Halikko, Finland, 60.3972, 23.0778 Majhariya Sheikh, India, 26.7356, 84.6420 Lansdowne, United States, 39.2365, -76.6659 Oberriet, Switzerland, 47.3164, 9.5664 Kurichchi, India, 11.7276, 78.4102 Polakala, India, 13.3206, 78.7990 Liteni, Romania, 47.5200, 26.5319 Tutrakan, Bulgaria, 44.0390, 26.6194 Makaya, India, 25.2710, 87.8897 Gurmaila, India, 25.4829, 87.3490 Teruel, Colombia, 2.7500, -75.5667 Alwa Tirunagari, India, 8.6100, 77.9400 Zuchwil, Switzerland, 47.2056, 7.5597 Khem Karan Saray, India, 25.1233, 84.8117 Balumath, India, 23.8298, 84.7888 Nanan, India, 25.0905, 85.5031 Bhagatpur, India, 25.4098, 86.3076 Monistrol-sur-Loire, France, 45.2933, 4.1728 Padakanti, India, 18.6942, 78.2842 Alvarado, Colombia, 4.5667, -74.9500 Kharsod B, India, 23.2225, 75.3860 Mosrah, India, 18.6155, 77.9718 Ortenberg, Germany, 50.3558, 9.0553 Pedras de Maria da Cruz, Brazil, -15.6069, -44.3908 Khandrauli, India, 29.3888, 77.2793 Camenca, Moldova, 48.0333, 28.7000 Silleda, Spain, 42.7000, -8.2333 Bhataulia, India, 26.4771, 84.7789 Agadallanka, India, 16.7123, 81.2732 Minerbio, Italy, 44.6175, 11.4717 Warrenton, United States, 38.8187, -91.1385 Ghorbanki, India, 26.5697, 86.0484 Diamou, Mali, 12.1469, -7.2544 Tataltepec de Valdes, Mexico, 16.3064, -97.5461 East York, United States, 39.9687, -76.6755 Unterageri, Switzerland, 47.1386, 8.5844 Dobris, Czechia, 49.7811, 14.1672 Mallaram, India, 18.7540, 78.1120 Gangapatnam, India, 14.5237, 80.1521 Dara, India, 26.1546, 86.4483 Blacklick Estates, United States, 39.9049, -82.8655 Clayton, United States, 39.6627, -75.0782 Papara, Côte d’Ivoire, 10.6167, -6.2500 Angmering, United Kingdom, 50.8288, -0.4846 Kambur, India, 10.1599, 78.3264 Golakpur, India, 25.1777, 85.0728 Chiranellur, India, 10.6344, 76.1378 Hunduan, Philippines, 16.8300, 121.0000 Maipu, Argentina, -36.8667, -57.8667 Kanakpur, India, 24.4976, 88.0361 Ainapur, India, 16.4800, 74.7800 Katahra, India, 26.2235, 87.0643 Teolo, Italy, 45.3500, 11.6667 West Perth, Canada, 43.4700, -81.2000 Ratanpur, India, 26.5091, 85.1259 Ayapango, Mexico, 19.1264, -98.8028 Olney, United States, 38.7285, -88.0839 Kos, Greece, 36.8500, 27.2333 Mannamangalam, India, 10.4944, 76.3361 Muriyad, India, 10.3667, 76.2667 Lambarkiyine, Morocco, 33.2000, -7.5000 Kelle, Congo (Brazzaville), -0.0608, 14.4878 Sorisole, Italy, 45.7375, 9.6564 Ponta do Sol, Portugal, 32.6811, -17.1042 Clanton, United States, 32.8444, -86.6233 Whippany, United States, 40.8233, -74.4184 Collingdale, United States, 39.9151, -75.2776 Pullalacheruvu, India, 16.1589, 79.3986 Sirikonda, India, 17.1667, 79.7000 Jogiara, India, 26.4083, 85.7500 Gondauli, India, 27.8300, 77.8800 Viagrande, Italy, 37.6167, 15.1000 Al Abraq, Libya, 32.7899, 22.0005 Signal Mountain, United States, 35.1448, -85.3457 Larkfield-Wikiup, United States, 38.5130, -122.7536 Bee Cave, United States, 30.3084, -97.9629 Rocas de Santo Domingo, Chile, -33.6358, -71.6281 Striano, Italy, 40.8167, 14.5667 North Cornwall, United States, 40.3134, -76.4515 Yanchep, Australia, -31.5500, 115.6340 Gonzalez, Colombia, 8.4000, -73.3333 Japura, Brazil, -1.8261, -66.5989 Devnya, Bulgaria, 43.2180, 27.5580 Achacachi, Bolivia, -16.0444, -68.6850 Ak'ordat, Eritrea, 15.5500, 37.8833 Vannikkonendal, India, 8.9959, 77.6245 Pandino, Italy, 45.4000, 9.5500 Amtala, India, 26.1000, 91.3900 Sulahpet, India, 17.4014, 77.3472 Pleasant Hill, United States, 38.8059, -94.2652 Burnham on Crouch, United Kingdom, 51.6284, 0.8145 Kilchberg, Switzerland, 47.3247, 8.5492 Mandalavadi, India, 12.6073, 78.6055 Sakaddi, India, 25.5771, 84.7554 Gilgit, Pakistan, 35.9208, 74.3083 Monastyryshche, Ukraine, 48.9900, 29.8011 Harwood Heights, United States, 41.9663, -87.8057 Australia, Cuba, 22.4989, -81.1349 Keora, India, 25.4374, 85.0726 Kadiyadda, India, 16.8774, 81.5149 Khetko, India, 23.7554, 85.9122 Ait Ouaoumana, Morocco, 32.7128, -5.8042 Landquart, Switzerland, 46.9497, 9.5667 Shankarpur, India, 26.1821, 87.1552 Kressbronn am Bodensee, Germany, 47.5958, 9.6000 Saarijarvi, Finland, 62.7050, 25.2583 Cockermouth, United Kingdom, 54.6613, -3.3620 Malangam, India, 34.4383, 74.5575 Aradeo, Italy, 40.1333, 18.1333 Ait Hadi, Morocco, 31.3942, -8.7725 Jaimalpura, India, 28.9619, 75.9569 Karariya, India, 26.5249, 84.7910 Moka, Mauritius, -20.2190, 57.4960 Ban Pong Tao, Thailand, 18.8333, 99.9500 Tirumalaippatti, India, 11.0000, 21.0000 Bersenbruck, Germany, 52.5333, 7.9167 Sewari, India, 25.1000, 73.2830 Kalkuni, India, 14.6000, 74.8333 Duvvuru, India, 14.5507, 79.8331 Nimmekal, India, 17.2372, 79.6633 Casorate Primo, Italy, 45.3167, 9.0167 Marina del Rey, United States, 33.9765, -118.4486 Bansang, Gambia, The, 13.4333, -14.6500 Zoeterwoude, Netherlands, 52.1333, 4.5000 Sabanozu, Turkey, 40.4825, 33.2836 Orivesi, Finland, 61.6750, 24.3583 Nellutla, India, 17.7034, 79.1956 Pallippatti, India, 11.8722, 77.8970 Drazinda, Pakistan, 31.7069, 70.1352 Caturama, Brazil, -13.3289, -42.2908 Madnur, India, 18.5000, 77.6333 Thief River Falls, United States, 48.1108, -96.1778 Andalusia, United States, 31.3102, -86.4781 Pearsall, United States, 28.8915, -99.0975 Chak Habib, India, 25.7238, 85.8789 Pa'in Chaf, Iran, 37.2294, 50.2544 Bloomingdale, United States, 36.5793, -82.5096 Panthersville, United States, 33.7059, -84.2763 Ergoldsbach, Germany, 48.6833, 12.2000 Smizany, Slovakia, 48.9584, 20.5177 Ban Noen Kum Nueng, Thailand, 16.5500, 100.4167 Garching an der Alz, Germany, 48.1167, 12.5833 Vinjam, India, 13.2544, 79.2630 Ban Muang Kham, Thailand, 19.5008, 99.7466 Saeby, Denmark, 57.3319, 10.5225 Timmapuram, India, 17.1036, 81.0781 Madanancheri, India, 12.7034, 78.5991 Machadodorp, South Africa, -25.6667, 30.2500 Armazem, Brazil, -28.2619, -49.0178 Ospina, Colombia, 1.0581, -77.5664 Weilmunster, Germany, 50.4333, 8.3667 El Realejo, Nicaragua, 12.5333, -87.1667 Pitman, United States, 39.7335, -75.1306 Rockwood, United States, 37.4630, -77.5744 Potengi, Brazil, -7.0908, -40.0269 Urania, Brazil, -20.2458, -50.6428 Sanwas, India, 25.1795, 85.7148 Moslem Ebn-e `Aqil, Iran, 32.0561, 48.3056 Campbellton, Canada, 48.0050, -66.6731 Muhlhausen, Germany, 49.2475, 8.7239 Birpur, India, 32.6617, 74.9518 Al Buwaydah, Syria, 33.4259, 36.3205 St. Pete Beach, United States, 27.7235, -82.7387 San Juan de la Costa, Chile, -40.5167, -73.4000 Winslow, United States, 35.0243, -110.7095 Bayport, United States, 40.7461, -73.0546 Jackson, United States, 39.9057, -76.8796 Qizilhacili, Azerbaijan, 40.5772, 46.8578 Cumnock, United Kingdom, 55.4529, -4.2638 Ablu, India, 30.3391, 74.7879 Tamganj, India, 26.2478, 87.1569 Piriapolis, Uruguay, -34.9000, -55.2833 Maria Enzersdorf, Austria, 48.1000, 16.2833 Upper Makefield, United States, 40.2941, -74.9250 Pibrac, France, 43.6175, 1.2856 Hamsavaram, India, 17.2938, 82.4942 Tirano, Italy, 46.2164, 10.1689 Lienen, Germany, 52.1461, 7.9739 Muhos, Finland, 64.8000, 26.0000 Golbey, France, 48.1967, 6.4381 Velaux, France, 43.5286, 5.2564 Kai, Mali, 10.9667, -5.7000 Con Dao, Vietnam, 8.6931, 106.5767 Hucclecote, United Kingdom, 51.8500, -2.1800 Higham Ferrers, United Kingdom, 52.3057, -0.5844 Mahagaon, India, 17.5211, 76.9150 Reyes, Bolivia, -14.2958, -67.3353 Neuenhof, Switzerland, 47.4469, 8.3292 Le Portel, France, 50.7075, 1.5744 Satwar, India, 26.2163, 84.5120 Ramgarh, India, 25.2889, 83.6535 Missaglia, Italy, 45.7000, 9.3333 Bouati Mahmoud, Algeria, 36.5833, 7.3333 Roquevaire, France, 43.3500, 5.6053 Montecito, United States, 34.4384, -119.6309 Sabaudia, Brazil, -23.3178, -51.5528 Memmelsdorf, Germany, 49.9328, 10.9533 Balneario Monte Hermoso, Argentina, -38.9833, -61.3000 Jonnagiri, India, 15.2303, 77.5714 Chakla Waini, India, 25.9081, 85.6836 Kodavatipudi, India, 17.4887, 82.6046 Sekimachi, Japan, 33.0597, 130.5439 Entrerrios, Colombia, 6.5667, -75.5167 Arbaa Sahel, Morocco, 29.5993, -9.8770 Carbondale, United States, 41.5714, -75.5048 Sonsbeck, Germany, 51.6089, 6.3769 Woodmoor, United States, 39.1063, -104.8456 Valasa, India, 14.1632, 76.9469 Kukraun, India, 25.7647, 87.1847 Baciu, Romania, 46.7928, 23.5250 Basmanpur, India, 26.6433, 84.9789 Vadapalanji, India, 9.9266, 78.0096 Albinea, Italy, 44.6167, 10.6000 Hish, Syria, 35.5479, 36.6436 Adigoppula, India, 16.4402, 79.6235 Soresina, Italy, 45.2865, 9.8570 Sao Sebastiao do Curral, Brazil, -20.2758, -45.0050 Neuhaus am Rennweg, Germany, 50.5167, 11.1500 Mahela, Madagascar, -19.4944, 48.4866 Takua Pa, Thailand, 8.8705, 98.3438 Yacimiento Rio Turbio, Argentina, -51.5333, -72.3000 Rangvasa, India, 22.6435, 75.7886 Baramandougou, Mali, 13.6000, -4.6000 Ban Si Don Chai, Thailand, 20.1300, 100.3614 San Martin de Valdeiglesias, Spain, 40.3640, -4.4010 Le Teil, France, 44.5458, 4.6831 Mansong, India, 27.1628, 88.5661 Horodenka, Ukraine, 48.6675, 25.5003 Takouta, Benin, 10.3000, 1.2000 Naunhof, Germany, 51.2778, 12.5883 Hoyo de Manzanares, Spain, 40.6333, -3.8833 Parame, France, 48.6603, -1.9792 Barun, India, 24.8602, 84.2232 Sorala, India, 19.1297, 84.7506 Schuylkill, United States, 40.1086, -75.4982 Jolfa, Iran, 38.9386, 45.6253 Porto Santo Stefano, Italy, 42.4353, 11.1175 Park Forest Village, United States, 40.7996, -77.9084 Kampong Tunah Jambu, Brunei, 4.9957, 115.0019 Saint-Jean-de-Monts, France, 46.7936, -2.0587 Nagykovacsi, Hungary, 47.5800, 18.8800 Mokhotlong, Lesotho, -29.2885, 29.0656 Bolszewo, Poland, 54.6242, 18.1753 Fort Valley, United States, 32.5520, -83.8817 Hunenberg, Switzerland, 47.1761, 8.4264 Malipakar, India, 25.3567, 87.9005 Ineu, Romania, 46.4258, 21.8369 Savoy, United States, 40.0600, -88.2552 Aransas Pass, United States, 27.8876, -97.1136 Mousoulou, Benin, 7.3899, 1.9367 San Miguel, Ecuador, -1.7000, -79.0333 Lusca, Ireland, 53.5281, -6.1692 Ala, Italy, 45.7607, 11.0046 Tagapul-an, Philippines, 12.0500, 124.1500 Nartan, Russia, 43.5167, 43.7000 Baxter, United States, 46.3426, -94.2793 Rreshen, Albania, 41.7667, 19.8833 Caapiranga, Brazil, -3.3167, -61.2000 Playa de Aro, Spain, 41.8176, 3.0683 Iklod, India, 26.0222, 77.3208 Dhobipet, India, 17.4716, 78.0870 Boonton, United States, 40.9047, -74.4048 Brownfield, United States, 33.1757, -102.2730 Valley Cottage, United States, 41.1162, -73.9433 Pittsgrove, United States, 39.5404, -75.1291 Alvorada, Brazil, -12.4800, -49.1250 Akom II, Cameroon, 2.7833, 10.5667 Perigny, France, 46.1533, -1.0953 Ranjal, India, 18.7458, 77.9483 Tausa, Colombia, 5.1964, -73.8875 Tillaivilagam, India, 10.4127, 79.5547 Rabo de Peixe, Portugal, 37.8100, -25.5856 Bernolakovo, Slovakia, 48.1992, 17.3003 Beni Hassane, Tunisia, 35.5700, 10.8200 Angor, Uzbekistan, 37.4639, 67.1500 Bath, United States, 43.9346, -69.8346 Dehri, India, 25.4252, 83.8201 Taragi, Japan, 32.2642, 130.9358 Hlevakha, Ukraine, 50.2622, 30.2894 G`ozg`on, Uzbekistan, 40.5944, 65.4964 Vel'ke Kapusany, Slovakia, 48.5500, 22.0833 Madison Park, United States, 40.4454, -74.2966 Highland Park, United States, 42.4052, -83.0977 Penugolanu, India, 16.9771, 80.4369 Vanduvancheri, India, 10.4292, 79.6498 Tissint, Morocco, 29.9006, -7.3203 Ulstein, Norway, 62.3564, 5.8539 Cristuru Secuiesc, Romania, 46.2917, 25.0353 Paloma Creek South, United States, 33.2100, -96.9325 Waldenbuch, Germany, 48.6372, 9.1317 Grossenluder, Germany, 50.5833, 9.5333 San Ignacio, Honduras, 14.6574, -87.0367 Madhuban, India, 25.8838, 86.8176 Bommayapalaiyam, India, 11.9922, 79.8499 Uta, Italy, 39.2883, 8.9576 Gopalpur, India, 19.2586, 84.9052 Maisaram, India, 17.1329, 78.4367 Santa Maria Xadani, Mexico, 16.3667, -95.0167 Hernando, United States, 28.9451, -82.3781 Alfreton, United Kingdom, 53.0970, -1.3800 Gudibanda, India, 13.6700, 77.7000 Baikunthapur, India, 22.9808, 88.2058 Monmouth, United States, 40.9140, -90.6425 Whitehouse, United States, 32.2222, -95.2210 Lichtervelde, Belgium, 51.0333, 3.1333 Obertraubling, Germany, 48.9658, 12.1669 Puraini, India, 26.0607, 87.0331 Ntossoni, Mali, 12.6383, -5.5789 Strijen, Netherlands, 51.7422, 4.5514 Hateg, Romania, 45.6075, 22.9500 Chok Chai, Thailand, 14.7333, 102.1667 Chichkah, Afghanistan, 37.0706, 69.2983 Branston, United Kingdom, 52.7870, -1.6590 Hoquiam, United States, 46.9863, -123.9022 Hornsea, United Kingdom, 53.9108, -0.1676 Gudivada, India, 17.3974, 82.7908 Rautara, India, 25.6630, 87.5378 Abcoude, Netherlands, 52.2700, 4.9700 Fort Irwin, United States, 35.2477, -116.6834 Engerwitzdorf, Austria, 48.3397, 14.4256 Lontra, Brazil, -15.9073, -44.3038 La Grande Racine, Switzerland, 46.9068, 6.7633 Bridgewater, Canada, 44.3700, -64.5200 Falla, Cuba, 22.1710, -78.7872 Volkach, Germany, 49.8667, 10.2167 Miyar, India, 13.1945, 75.0484 Kukrahill, Nicaragua, 12.2500, -83.7500 Efringen-Kirchen, Germany, 47.6556, 7.5658 Schleiz, Germany, 50.5833, 11.8167 Heek, Germany, 52.1167, 7.0997 Varatanapalli, India, 12.5828, 78.3020 Gholia Kalan, India, 30.6726, 75.1800 Porcari, Italy, 43.8415, 10.6163 Treze Tilias, Brazil, -27.0019, -51.4058 El Outaya, Algeria, 35.0333, 5.6000 Longvic, France, 47.2886, 5.0644 Khanapur, India, 17.9004, 79.9277 Hope, United States, 33.6682, -93.5895 Bad Bergzabern, Germany, 49.1028, 7.9991 Sarlat-la-Caneda, France, 44.8928, 1.2153 Tlagasana, Indonesia, -7.1786, 109.5057 Soeda, Japan, 33.5719, 130.8539 Dock Junction, United States, 31.2031, -81.5155 Sowan, India, 25.5540, 84.2334 Madhubani, India, 26.3272, 87.0160 La Loggia, Italy, 44.9577, 7.6673 Toulou, Niger, 14.1688, 5.1990 Koekelare, Belgium, 51.0833, 2.9667 Dharawat, India, 25.0592, 85.0420 Ban Sai Yoi, Thailand, 16.4167, 100.6000 Costa Volpino, Italy, 45.8306, 10.0992 Cofimvaba, South Africa, -32.0025, 27.5806 La Chapelle d'Armentieres, France, 50.6736, 2.8961 Dunn Loring, United States, 38.8945, -77.2315 Belsh, Albania, 40.9833, 19.8833 Chahana, Algeria, 36.6794, 5.9572 Bhasaula Danapur, India, 25.5509, 85.0308 Garsekurti, India, 18.5083, 78.9774 Topanga, United States, 34.0965, -118.6053 Cherry Hinton, United Kingdom, 52.1849, 0.1760 Annan, United Kingdom, 54.9830, -3.2660 Nueva Ocotepeque, Honduras, 14.4355, -89.1845 Kampel, India, 22.6167, 76.0500 Bachchannapet, India, 17.7883, 79.0349 Yelandur, India, 12.0700, 77.0300 Kunimedu, India, 12.0885, 79.8940 Moe, Australia, -38.1722, 146.2678 Bundehra, India, 25.3776, 86.7376 Edgemere, United States, 39.2273, -76.4590 Maysville, United States, 38.6455, -83.7911 Brikcha, Morocco, 34.9667, -5.5833 Saint-Paul-Trois-Chateaux, France, 44.3497, 4.7690 Cowley, United Kingdom, 51.5280, -0.4810 Adiyakkamangalam, India, 10.7626, 79.6775 Komijan, Iran, 34.7181, 49.3250 Deodora, India, 22.6149, 80.3616 Lovosice, Czechia, 50.5150, 14.0511 Somarasampettai, India, 10.8125, 78.6342 Kusumbe, India, 20.9167, 74.6500 Highland Park, United States, 32.8311, -96.8012 Pereiras, Brazil, -23.0761, -47.9758 Cinderford, United Kingdom, 51.8225, -2.4989 Gessate, Italy, 45.5500, 9.4333 Mtal, Morocco, 32.4908, -8.3781 Neves Paulista, Brazil, -20.8458, -49.6300 Luzzi, Italy, 39.4500, 16.2833 Amberomanga, Madagascar, -19.2389, 46.6152 Aleksandrov Gay, Russia, 50.1333, 48.5500 Brevik, Sweden, 59.3500, 18.2000 Paratdiha, India, 24.1638, 86.3070 Guntersville, United States, 34.3671, -86.2637 Redlands, United States, 39.0886, -108.6582 South Londonderry, United States, 40.2424, -76.5432 Coaldale, Canada, 49.7333, -112.6167 Muturkha, India, 24.1044, 86.2855 La Ferte-Bernard, France, 48.1875, 0.6553 Aleksandrovsk-Sakhalinskiy, Russia, 50.9000, 142.1500 Sefaatli, Turkey, 39.5017, 34.7522 Brighton, United States, 40.7023, -80.3677 Vicentinopolis, Brazil, -17.7350, -49.8058 Kirrayach, India, 26.6322, 78.3423 Cunupia, Trinidad and Tobago, 10.5500, -61.3667 Ottobeuren, Germany, 47.9414, 10.2994 Chinna Mupparam, India, 17.6319, 79.8411 Hirni, India, 25.8323, 86.2806 Boukhralfa, Algeria, 36.6144, 5.0872 Sriramapuram, India, 16.1800, 80.2900 Hardiya, India, 25.5301, 84.4961 Aragona, Italy, 37.4074, 13.6189 Pizzo, Italy, 38.7333, 16.1667 Roetgen, Germany, 50.6500, 6.2000 Amtala, India, 22.3669, 88.2777 Marlborough, United States, 41.6337, -73.9904 Idupugallu, India, 16.4609, 80.7543 Bertrix, Belgium, 49.8555, 5.2566 Rampatti, India, 26.3333, 86.1500 Vidapanakallu, India, 15.0667, 77.1833 Ashtian, Iran, 34.5222, 50.0069 Kennett, United States, 39.8374, -75.6808 Zapatoca, Colombia, 6.8167, -73.2667 Abiramam, India, 9.4423, 78.4399 Otaki, Japan, 35.2852, 140.2454 Marrupa, Mozambique, -13.1833, 37.5000 Borgo a Buggiano, Italy, 43.8798, 10.7284 Galela, Indonesia, 1.8236, 127.8431 Zulakallu, India, 16.4442, 79.7874 Pukkulam, India, 9.2770, 78.9938 Fully, Switzerland, 46.1333, 7.1167 Kibaya, Tanzania, -5.3014, 36.5825 Rani Sawargaon, India, 18.9655, 76.7493 Pa Mok, Thailand, 14.4899, 100.4485 Graham, United States, 33.1017, -98.5779 Franklin, United States, 43.4499, -71.6691 North Haledon, United States, 40.9628, -74.1844 Riacho dos Machados, Brazil, -16.0058, -43.0489 Hombrechtikon, Switzerland, 47.2533, 8.7703 Pacuarito, Costa Rica, 10.1093, -83.4091 Shiu, India, 34.2372, 74.3423 Hiramandalam, India, 18.6708, 83.9505 San Pedro de Coche, Venezuela, 10.7772, -63.9311 Damal, India, 12.8860, 79.5922 Budamangalam, India, 12.3792, 79.2308 Natividade, Brazil, -11.7100, -47.7228 Lachen, Switzerland, 47.1911, 8.8567 Angichettippalaiyam, India, 11.7742, 79.5255 Daping, China, 24.6501, 112.1693 Banak, Iran, 27.8714, 52.0272 San Juan Ixcaquixtla, Mexico, 18.4500, -97.8167 Coffeyville, United States, 37.0519, -95.6180 Pasivedalajimma, India, 16.9952, 81.7000 Tilvalli, India, 14.6268, 75.2310 Sremski Karlovci, Serbia, 45.2000, 19.9333 Kozova, Ukraine, 49.4319, 25.1594 Altoona, United States, 44.8029, -91.4385 Buenavista, Colombia, 9.3333, -74.3000 Reddipalle, India, 14.1998, 78.0104 Sant'Angelo in Lizzola, Italy, 43.8270, 12.8025 Mozzate, Italy, 45.6806, 8.9494 Coccaglio, Italy, 45.5633, 9.9783 Shopokov, Kyrgyzstan, 42.8547, 74.3422 Sanrha, India, 25.7979, 84.7504 Castagneto Carducci, Italy, 43.1667, 10.6000 Civitella in Val di Chiana, Italy, 43.4053, 11.7706 Afumati, Romania, 44.5250, 26.2522 Benner, United States, 40.8698, -77.8153 Roccastrada, Italy, 43.0097, 11.1683 Rudewa, Tanzania, -10.1008, 34.6836 Milton, United States, 47.2524, -122.3153 Jabera, India, 23.5582, 79.6780 Ranod, India, 25.0748, 77.8761 Wervershoof, Netherlands, 52.7300, 5.1700 Tanudan, Philippines, 17.2814, 121.2303 Stary Sacz, Poland, 49.5625, 20.6364 Toppenish, United States, 46.3806, -120.3122 Leopoldo de Bulhoes, Brazil, -16.6189, -48.7439 Flieden, Germany, 50.4167, 9.5667 Hadleigh, United Kingdom, 52.0453, 0.9583 Kanavaypudur, India, 11.9282, 78.1832 Rahta, India, 25.9213, 86.9734 Pararia, India, 26.3400, 87.5896 Oulad Said, Morocco, 32.9676, -7.8133 Notre-Dame-de-Gravenchon, France, 49.4900, 0.5719 Hoshoot, Mongolia, 48.9408, 89.1383 Koror, Palau, 7.3419, 134.4792 Teranikallu, India, 15.6392, 77.5303 Dhanauli, India, 26.0026, 86.0251 Mascoutah, United States, 38.5192, -89.8045 Rio Jimenez, Costa Rica, 10.2556, -83.5629 Sawbridgeworth, United Kingdom, 51.8140, 0.1500 Olalapadi, India, 10.7979, 76.8923 Pullanvidudi, India, 10.3590, 79.0880 Vadakadu, India, 10.3418, 79.0609 Nam Som, Thailand, 17.7704, 102.1895 Comendador Levy Gasparian, Brazil, -22.0289, -43.2050 Hakka, India, 25.9163, 87.6474 Pedda Nindrakolanu, India, 16.7342, 81.3941 Parabita, Italy, 40.0500, 18.1333 Nyzhnohirskyi, Ukraine, 45.4436, 34.7406 Lichana, Algeria, 34.7247, 5.4325 Rudravaram, India, 15.2436, 78.6050 Doornkop, South Africa, -26.2328, 27.7833 Temple Hills, United States, 38.8106, -76.9495 Sanjat, India, 25.6046, 86.0199 Krompachy, Slovakia, 48.9167, 20.8744 Queimada Nova, Brazil, -8.5789, -41.4189 Le Petit-Couronne, France, 49.3864, 1.0283 Lari, Italy, 43.5689, 10.5933 Lancaster, United States, 34.7248, -80.7804 Malaimarpuram, India, 14.2096, 79.3072 Mirchpur, India, 29.3160, 76.1755 Harsova, Romania, 44.6833, 27.9519 Kargopol, Russia, 61.5000, 38.9333 Wattwil, Switzerland, 47.2957, 9.0830 Bussy, Switzerland, 46.5500, 6.5500 Aktepe, Turkey, 36.7000, 36.4833 Presque Isle, United States, 46.6868, -67.9874 Freeport, United States, 43.8556, -70.1009 Moranbah, Australia, -22.0016, 148.0533 Igana, Benin, 7.0333, 2.7000 Ranai, Indonesia, 3.9333, 108.3833 Bhui, India, 25.0894, 85.3888 Ekangar Sarai, India, 25.2234, 85.2298 Velakalnattam, India, 12.5505, 78.4429 Bharno, India, 23.2204, 84.8891 Hillview, United States, 38.0562, -85.6847 Rodeo, United States, 38.0367, -122.2526 Wingles, France, 50.4947, 2.8561 Gundumal, India, 16.8939, 77.7112 Folignano, Italy, 42.8210, 13.6329 Essey-les-Nancy, France, 48.7067, 6.2231 Karuveppampatti, India, 11.3983, 77.8746 Satgachia, India, 23.2641, 88.1600 Lowenberg, Germany, 52.8833, 13.1500 Jalalkhera, India, 21.4392, 78.7719 Hostotipaquillo, Mexico, 21.2167, -103.8500 Maiquinique, Brazil, -15.6208, -40.2658 Wietze, Germany, 52.6500, 9.8333 Majra, India, 25.7131, 87.3637 Nagaiyampatti, India, 11.4639, 78.4801 Smithfield, United States, 36.9755, -76.6152 Faro, Brazil, -2.1708, -56.7450 San Juan de Arama, Colombia, 3.3736, -73.8767 Cabras, Italy, 39.9306, 8.5303 Carlosama, Colombia, 0.8658, -77.7294 Rauenberg, Germany, 49.2678, 8.7036 Tsrar Sharif, India, 33.8632, 74.7652 Pendekallu, India, 15.3753, 77.6242 Galmaarden, Belgium, 50.7500, 3.9900 Messkirch, Germany, 47.9928, 9.1125 Narona, India, 17.5156, 76.7182 Montalto di Castro, Italy, 42.3514, 11.6078 Village Green-Green Ridge, United States, 39.8639, -75.4257 Yelsk, Belarus, 51.8167, 29.1500 Gendou, Mali, 12.8292, -6.4964 Stara Tura, Slovakia, 48.7767, 17.6961 Ragampet, India, 18.6383, 79.1441 Kamen'-Rybolov, Russia, 44.7667, 132.0167 Buved, Tajikistan, 37.5833, 71.5167 Pont-Rouge, Canada, 46.7500, -71.7000 Pillutla, India, 16.5390, 79.9044 Guneysu, Turkey, 40.9781, 40.6136 Irondale, United States, 33.4773, -84.3601 Cutrofiano, Italy, 40.1333, 18.2000 Siggiewi, Malta, 35.8542, 14.4383 Cameron, United States, 39.7444, -94.2329 Hualaihue, Chile, -42.1000, -72.4167 Junin, Colombia, 4.7903, -73.8136 Virapalle, India, 14.1556, 78.8569 Cosmorama, Brazil, -20.4778, -49.7778 Jeannette, United States, 40.3277, -79.6139 Navappatti, India, 11.7393, 77.7836 Punnappatti, India, 10.2243, 78.1982 Ponte Buggianese, Italy, 43.8408, 10.7475 Ustrzyki Dolne, Poland, 49.4297, 22.5867 Aniskino, Russia, 55.9417, 38.1500 Santanopolis, Brazil, -12.0169, -38.8669 El Golaa, Tunisia, 33.7050, 8.9650 Angallu, India, 13.6287, 78.4857 Barbana, India, 26.0719, 87.2539 Akalgarh, India, 30.8019, 75.8582 Bommagondanahalli, India, 13.8984, 77.0733 Sarbisheh, Iran, 32.5775, 59.7961 Glencoe, United States, 42.1347, -87.7641 Fort Knox, United States, 37.8915, -85.9636 Azizpur Chande, India, 25.7932, 85.5945 Inekar, Mali, 15.9594, 3.1411 Mockmuhl, Germany, 49.3167, 9.3500 Uchen, India, 27.0931, 77.4097 Tomesti, Romania, 47.1333, 27.7000 Ouando, Benin, 6.5542, 2.6616 Corella, Spain, 42.1147, -1.7867 Crest, France, 44.7292, 5.0228 Bishunpur, India, 25.5665, 87.4435 Gigmoto, Philippines, 13.7800, 124.3800 Al Quway`iyah, Saudi Arabia, 24.0737, 45.2806 Wyoming, United States, 39.2297, -84.4816 Besozzo, Italy, 45.8500, 8.6667 Millersville, United States, 40.0047, -76.3522 California, Brazil, -23.6500, -51.3550 Kolbuszowa, Poland, 50.2500, 21.7667 Sohta, India, 26.2149, 87.0826 Doiwala, India, 30.1758, 78.1242 Port Jervis, United States, 41.3783, -74.6910 Sao Jose do Cerrito, Brazil, -27.6628, -50.5800 Lillebonne, France, 49.5189, 0.5343 Silsden, United Kingdom, 53.9140, -1.9370 Gangajalghati, India, 23.4200, 87.1200 Nanzhangcheng, China, 37.9108, 114.0749 Aigues-Mortes, France, 43.5675, 4.1933 Lenox, United States, 43.1113, -75.7582 Lake Villa, United States, 42.4184, -88.0836 Gyumai, China, 33.7560, 99.6500 Bhanuvalli, India, 14.4333, 75.7667 Roccapiemonte, Italy, 40.7617, 14.6933 Ait Rami, Morocco, 29.9608, -9.4234 Paola, Malta, 35.8728, 14.5075 Shelby, United States, 40.8847, -82.6578 White Meadow Lake, United States, 40.9241, -74.5107 Champlain, Canada, 45.5333, -74.6500 Ain Zora, Morocco, 34.6600, -3.5300 Janglot, India, 32.4353, 75.5231 Lazaro Cardenas, Mexico, 28.3897, -105.6236 San Sebastian, Philippines, 11.7000, 125.0200 Hamlin, United States, 43.3213, -77.9135 Asagi Quscu, Azerbaijan, 40.9571, 45.6804 Havsa, Turkey, 41.5492, 26.8217 Iles, Colombia, 0.9667, -77.5167 Richterich, Germany, 50.8086, 6.0625 Anthony, United States, 32.0131, -106.5984 Tashir, Armenia, 41.1244, 44.2819 Margny-les-Compiegne, France, 49.4269, 2.8217 Sini, India, 22.7933, 85.9454 Bududa, Uganda, 1.0100, 34.3317 Jondor Shaharchasi, Uzbekistan, 39.7333, 64.1833 Sande, Germany, 53.4833, 8.0000 Biederitz, Germany, 52.1608, 11.7178 Pardanjan, Iran, 32.2539, 50.5975 Volodymyrets, Ukraine, 51.4208, 26.1450 Othello, United States, 46.8221, -119.1653 Audubon, United States, 39.8906, -75.0722 Millis, United States, 42.1693, -71.3626 Heikendorf, Germany, 54.3722, 10.2081 Vadacheri, India, 10.7324, 78.5261 Raia, India, 15.4969, 73.8089 Pulivalam, India, 10.7525, 79.6352 Flero, Italy, 45.4835, 10.1745 Caprino Veronese, Italy, 45.6000, 10.8000 Zawiat Moulay Brahim, Morocco, 31.2858, -7.9656 Coaticook, Canada, 45.1333, -71.8000 Untergruppenbach, Germany, 49.0833, 9.2667 Mountsorrel, United Kingdom, 52.7167, -1.1500 York, United States, 34.9967, -81.2341 Simon Bolivar, Ecuador, -2.0025, -79.4856 Tonk Khurd, India, 23.0983, 76.2155 Gonzaga, Italy, 44.9500, 10.8167 Phimai, Thailand, 15.2232, 102.4947 Coutras, France, 45.0417, -0.1272 Karadipara, India, 10.5500, 76.5833 Roverbella, Italy, 45.2667, 10.7667 Milliken, United States, 40.3115, -104.8561 Les Angles, France, 43.9553, 4.7672 Pokhraira, India, 26.0711, 85.2034 Pappakudi, India, 8.7520, 77.5026 Torre Boldone, Italy, 45.7167, 9.7000 Stauceni, Moldova, 47.0875, 28.8703 Malov, Denmark, 55.7553, 12.3233 Indurti, India, 17.0055, 78.9054 Nattarasankottai, India, 9.8690, 78.5531 Yakakent, Turkey, 41.6222, 35.5314 Cullinan, South Africa, -25.6728, 28.5208 Leisure World, United States, 39.1023, -77.0689 Stevensville, United States, 38.9745, -76.3184 Mirdoddi, India, 18.0786, 78.6770 Derby, United States, 39.8400, -104.9172 Conthey, Switzerland, 46.2167, 7.3000 Stansted Mountfitchet, United Kingdom, 51.8980, 0.1980 Zubovo, Russia, 54.6167, 55.9000 Spring Hill, United States, 38.7565, -94.8201 Sao Pedro do Ivai, Brazil, -23.8650, -51.8558 Timmendorfer Strand, Germany, 53.9944, 10.7825 Mrakovo, Russia, 52.7139, 56.6269 Dharhwa, India, 26.9104, 84.2769 Tlumach, Ukraine, 48.8667, 25.0000 Heusden, Belgium, 51.0281, 3.8000 Reichenbach an der Fils, Germany, 48.7100, 9.4661 Gadaul, India, 26.1287, 86.2375 Katridih, India, 25.0829, 85.6334 Painkulam, India, 10.7375, 76.3125 Koshanam, India, 11.3701, 77.3523 Lequile, Italy, 40.3000, 18.1333 Ellicott, United States, 42.1330, -79.2360 Limeira d'Oeste, Brazil, -19.5508, -50.5808 Pedreguer, Spain, 38.7933, 0.0342 Pokrovka, Russia, 43.9500, 131.6347 Stainz, Austria, 46.8833, 15.2667 Zanica, Italy, 45.6394, 9.6842 Msemrir, Morocco, 31.7028, -5.8125 Duchcov, Czechia, 50.6039, 13.7464 Azandarian, Iran, 34.5036, 48.6906 Kappeln, Germany, 54.6614, 9.9311 Norten-Hardenberg, Germany, 51.6167, 9.9333 Monte Escobedo, Mexico, 22.3000, -103.5667 Newstead, United States, 43.0196, -78.5223 Rock Falls, United States, 41.7724, -89.6928 Ballenstedt, Germany, 51.7200, 11.2375 L'Ile-Saint-Denis, France, 48.9333, 2.3333 Gretz-Armainvilliers, France, 48.7417, 2.7350 Murajpur, India, 25.9506, 86.4713 Gobindpur, India, 24.7820, 85.6943 Bagalvad, India, 16.0528, 76.8877 Barth, Germany, 54.3667, 12.7167 Kambhampadu, India, 16.5078, 79.4825 Kambhampadu, India, 16.9853, 80.6534 Kaldsletta, Norway, 69.6167, 18.9500 Katuete, Paraguay, -24.2483, -54.7596 Vega Alta, Puerto Rico, 18.4151, -66.3211 Arizona City, United States, 32.7506, -111.6707 Brightlingsea, United Kingdom, 51.8100, 1.0300 Narborough, United Kingdom, 52.5727, -1.2023 Pyalakurti, India, 15.7286, 77.8168 Kursaha, India, 25.5588, 85.6875 Brandizzo, Italy, 45.1766, 7.8380 Embrun, Canada, 45.2735, -75.2920 Siklos, Hungary, 45.8519, 18.2986 Suttamalli, India, 8.6987, 77.6323 Rompicherla, India, 13.7228, 79.0542 Kottur, India, 9.9038, 77.4071 Kalinagar, India, 22.4219, 88.8695 Orosi, United States, 36.5433, -119.2914 Herzberg, Germany, 51.6833, 13.2333 Chartres-de-Bretagne, France, 48.0403, -1.7028 Arbaa Ayacha, Morocco, 35.3830, -5.8333 Aratuipe, Brazil, -13.0789, -39.0019 Marilandia do Sul, Brazil, -23.7450, -51.3078 Tilaran, Costa Rica, 10.4709, -84.9674 Chetma, Algeria, 34.8500, 5.8167 La Mujer, Spain, 36.7522, -2.6839 Chakand, India, 24.8907, 84.9761 Guntapalli, India, 14.7385, 79.0400 Castellabate, Italy, 40.2789, 14.9528 Nettersheim, Germany, 50.4925, 6.6297 Glodeni, Moldova, 47.7667, 27.5167 Fort Mitchell, United States, 39.0460, -84.5562 Midland, United States, 47.1734, -122.4120 Rouvroy, France, 50.3942, 2.9044 Teotitlan, Mexico, 18.1333, -97.0833 Providence, United States, 41.7035, -111.8123 Solebury, United States, 40.3676, -75.0032 Catuipe, Brazil, -28.2500, -54.0119 Aulnoye-Aymeries, France, 50.2050, 3.8364 Kilcock, Ireland, 53.4022, -6.6708 Briceno, Colombia, 7.1111, -75.5500 Borgentreich, Germany, 51.5667, 9.2500 Chamonix-Mont-Blanc, France, 45.9231, 6.8697 Herseh Chhina, India, 31.7453, 74.7830 Gokcebey, Turkey, 41.3081, 32.1417 Bhatkhori, India, 25.9156, 86.9072 Parasbani, India, 25.8249, 87.2983 Triuggio, Italy, 45.6667, 9.2667 Perry Heights, United States, 40.7977, -81.4680 Maraveh Tappeh, Iran, 37.9031, 55.9567 Ter Apel, Netherlands, 52.8756, 7.0597 Al Qardahah, Syria, 35.4564, 36.0591 Wharton, United States, 29.3177, -96.1022 Minto, Canada, 43.9167, -80.8667 Malhada de Pedras, Brazil, -14.3878, -41.8789 Denbigh, United Kingdom, 53.1854, -3.4178 Budenheim, Germany, 50.0167, 8.1667 Saint-Chamas, France, 43.5506, 5.0347 Owani, Japan, 40.5184, 140.5678 Lehrhi, Morocco, 32.4167, -6.3167 Chelmek, Poland, 50.1167, 19.2500 Avabodji, Benin, 6.4533, 2.5275 Passo do Sertao, Brazil, -29.2228, -49.8100 Altavilla Milicia, Italy, 38.0422, 13.5503 Atherstone, United Kingdom, 52.5787, -1.5462 Amiawar, India, 25.0405, 84.3096 Park Hills, United States, 37.8211, -90.5050 Yang Talat, Thailand, 16.3998, 103.3678 Domerat, France, 46.3611, 2.5353 Mustafabad, India, 18.2787, 78.7108 Jujharpur, India, 25.7514, 87.9634 Rodeiro, Brazil, -21.2000, -42.8650 Pueblorrico, Colombia, 5.8000, -75.8500 Pathraha, India, 26.4330, 87.0743 San Sebastiano al Vesuvio, Italy, 40.8412, 14.3708 Bryan, United States, 41.4706, -84.5483 Ohata, Japan, 41.4034, 141.1620 Chocen, Czechia, 50.0017, 16.2231 Harike, India, 31.1663, 74.9418 Ait Tagalla, Morocco, 31.9167, -6.7167 Busk, Ukraine, 49.9667, 24.6333 Chintakommadinne, India, 14.4267, 78.7618 Koscielisko, Poland, 49.2908, 19.8883 Gillitts, South Africa, -29.7972, 30.7944 Foum Zguid, Morocco, 30.0833, -6.8667 South Lockport, United States, 43.1366, -78.6855 Paula Candido, Brazil, -20.8739, -42.9800 Schnaittach, Germany, 49.5592, 11.3431 Ramsey, United Kingdom, 52.4500, -0.1200 Nagdah, India, 26.2500, 86.0000 Aars, Denmark, 56.8038, 9.5158 Tumberi, India, 12.6986, 78.5856 Dilawarpur, India, 19.0908, 78.2275 Karavan, Kyrgyzstan, 40.2951, 72.1863 Tatoufet, Morocco, 35.0339, -5.7706 Abu Hardub, Syria, 34.8453, 40.6285 Najrij, Egypt, 30.9724, 30.8671 Zabok, Croatia, 46.0500, 15.9667 Belhatti, India, 15.0818, 75.6465 Belinskiy, Russia, 52.9667, 43.4333 Ballina, Australia, -28.8636, 153.5328 Tecumseh, United States, 42.0066, -83.9450 Cheviot, United States, 39.1577, -84.6139 East Donegal, United States, 40.0823, -76.5631 Zacharo, Greece, 37.4833, 21.6500 Bel Aire, United States, 37.7749, -97.2457 Campos Lindos, Brazil, -7.9939, -46.8678 Isbergues, France, 50.6242, 2.4575 Eduttavaynattam, India, 11.8057, 78.8270 Bikrampur Bande, India, 25.8415, 85.7424 Chak Pahar, India, 25.7986, 85.6218 Ankatafa, Madagascar, -13.6388, 48.3704 Deutsch-Wagram, Austria, 48.3000, 16.5667 Adjarra, Benin, 6.5333, 2.2667 Logten, Denmark, 56.2746, 10.3118 Onda, India, 25.2452, 85.6650 Seosaeng, Korea, South, 35.3536, 129.3303 Bedum, Netherlands, 53.3003, 6.6025 Farob, Tajikistan, 39.2408, 67.4700 Vodice, Croatia, 43.7506, 15.7789 Salar, India, 33.8789, 75.2485 Talsi, Latvia, 57.2444, 22.5867 Wissen, Germany, 50.7825, 7.7350 Tudela de Duero, Spain, 41.5842, -4.5800 Thathupur, India, 25.9731, 86.0296 Vanukuru, India, 16.4406, 80.7379 Kottadindulu, India, 16.3518, 81.5915 Sint-Job-in-'t-Goor, Belgium, 51.3017, 4.5691 Belvadi, India, 15.7146, 74.9167 Halawah, Jordan, 32.3828, 35.6619 Ouda-daito, Japan, 34.4789, 135.9281 Totma, Russia, 59.9667, 42.7500 Lempdes, France, 45.7719, 3.1944 Bishamagiri, India, 19.3849, 84.4715 Redlynch, Australia, -16.8894, 145.6977 Dirusumarru, India, 16.4722, 81.5295 Serramazzoni, Italy, 44.4167, 10.8000 Pa Sang, Thailand, 18.5262, 98.9394 Nandnawan, India, 25.0785, 86.0960 Bovalino Marina, Italy, 38.1500, 16.1667 Nansio, Tanzania, -2.1078, 33.0864 Solleftea, Sweden, 63.1667, 17.2667 Evergreen, United States, 39.6349, -105.3356 Laughlin, United States, 35.1401, -114.6206 San Bartolome Milpas Altas, Guatemala, 14.6072, -90.6781 Aibonito, Puerto Rico, 18.1398, -66.2659 Clarendon Hills, United States, 41.7981, -87.9568 Lint, Belgium, 51.1275, 4.4962 Vergiate, Italy, 45.7167, 8.7000 Buckie, United Kingdom, 57.6764, -2.9650 Sant'Agnello, Italy, 40.6294, 14.3996 Ajdir, Morocco, 34.7443, -3.9735 Olmsted Falls, United States, 41.3657, -81.9038 Sobhapur, India, 22.7737, 78.2638 Skowhegan, United States, 44.7554, -69.6657 Ueckermunde, Germany, 53.7389, 14.0444 Tordesillas, Spain, 41.5000, -5.0000 Kaoni, India, 30.4000, 74.6630 Mahadipur, India, 24.8566, 88.1248 Anyksciai, Lithuania, 55.5344, 25.1072 Cumberland Hill, United States, 41.9736, -71.4605 Conewago, United States, 40.0658, -76.7932 Le Poire-sur-Vie, France, 46.7682, -1.5098 Nayagaon, India, 24.8015, 80.8962 Bisaul, India, 26.6151, 85.9930 Panfilovka, Kyrgyzstan, 42.7917, 73.6778 Lourosa, Portugal, 40.9833, -8.5500 La Peche, Canada, 45.6833, -75.9833 Bouaiche, Algeria, 35.5528, 2.3586 Ras el-Barr, Egypt, 31.5250, 31.8406 Pinjranwan, India, 25.1702, 84.8203 's-Heerenberg, Netherlands, 51.8794, 6.2685 Livingston, United States, 45.6665, -110.5539 Digar, China, 42.6850, 89.7711 Maina, India, 23.1712, 76.6629 Plabennec, France, 48.5028, -4.4247 Serafimovich, Russia, 49.5833, 42.7333 Beibu, Taiwan, 24.6639, 121.0681 Zuera, Spain, 41.8667, -0.7833 Yarm, United Kingdom, 54.5000, -1.3500 Rangwasa, India, 22.6419, 75.7893 Nierstein, Germany, 49.8694, 8.3375 Thorigne-Fouillard, France, 48.1603, -1.5786 Wiang Haeng, Thailand, 19.5500, 98.6500 Staufenberg, Germany, 50.6667, 8.7167 Slateng Dua, Indonesia, -8.1324, 113.9836 Parsad, India, 26.1586, 86.3579 Maddur, India, 13.2397, 79.5653 Tokatippa, India, 16.2836, 81.5024 Aklim, Morocco, 34.9167, -2.4333 East Foothills, United States, 37.3826, -121.8138 Ortuella, Spain, 43.3103, -3.0569 Pantelho, Mexico, 17.0000, -92.4833 Chanute, United States, 37.6695, -95.4621 Meine, Germany, 52.3833, 10.5333 Haibach, Germany, 49.9675, 9.1969 Gokhulapur, India, 26.2479, 87.1137 Ulatu, India, 23.2766, 85.5012 Belo Vale, Brazil, -20.4078, -44.0239 Monte Alegre do Sul, Brazil, -22.6800, -46.6800 Kilakkurichchi, India, 10.7645, 78.7406 Kattirippulam, India, 10.4640, 79.7597 Rajhanpur, India, 25.7885, 86.4647 Sa`idi, Iran, 30.3364, 57.0994 Chop, Ukraine, 48.4333, 22.2000 Salinas, Uruguay, -34.7833, -55.8333 Cradock, South Africa, -32.1650, 25.6175 Santiponce, Spain, 37.4353, -6.0433 Midalam, India, 8.2060, 77.2160 Khandauli, India, 27.3125, 78.0289 Shahrak-e Pars, Iran, 35.6075, 51.3797 El Amim, Morocco, 32.2067, -7.2629 Perryton, United States, 36.3928, -100.7976 Montvale, United States, 41.0529, -74.0499 Garesnica, Croatia, 45.5742, 16.9408 Montrose, United States, 37.5200, -77.3772 Porto Alegre do Norte, Brazil, -10.8778, -51.6328 Artigues-pres-Bordeaux, France, 44.8628, -0.4850 Beutelsbach, Germany, 48.8000, 9.3833 Basrur, India, 13.6308, 74.7377 Mannegudam, India, 17.4601, 79.9177 Chettiyapatti, India, 10.4240, 77.8228 Rothwell, United Kingdom, 52.4254, -0.8029 Hakubacho, Japan, 36.6981, 137.8619 Ouro Verde, Brazil, -21.4894, -51.7003 Canford Cliffs, United Kingdom, 50.7000, -1.9300 Segaon, India, 21.8585, 75.3293 Martano, Italy, 40.2000, 18.3000 Glenwood, United States, 41.5410, -87.6118 Trujillo, Spain, 39.4653, -5.8789 Tarazu, India, 34.2714, 74.5009 Panjampatti, India, 10.3178, 77.9263 Hathiakan, India, 25.6060, 84.9997 Trissino, Italy, 45.5667, 11.3667 Ferreira do Zezere, Portugal, 39.7000, -8.2833 Highland Heights, United States, 41.5518, -81.4691 Janze, France, 47.9614, -1.4978 Hire Vadvatti, India, 15.2235, 75.7831 Raiparthi, India, 17.7042, 79.6081 Soverato Marina, Italy, 38.6833, 16.5500 Mikhaylovka, Russia, 43.9283, 132.0061 Caister-on-Sea, United Kingdom, 52.6510, 1.7330 Fair Lakes, United States, 38.8530, -77.3885 Rottenburg an der Laaber, Germany, 48.7019, 12.0272 Kanchanpur, India, 25.6636, 85.2703 Za'roura, Morocco, 35.2167, -5.6667 Bad Rothenfelde, Germany, 52.1117, 8.1606 Magam, India, 34.4595, 74.2306 Saidabad, India, 25.5489, 85.3087 Chanp, India, 26.1951, 84.3900 Petilia Policastro, Italy, 39.1167, 16.7833 Moribila, Mali, 12.6594, -5.0469 Arealva, Brazil, -22.0286, -48.9111 Santa Cruz do Monte Castelo, Brazil, -22.9528, -53.2969 Bremgarten, Switzerland, 47.3528, 8.3400 Manpur, India, 22.4315, 75.6211 Pirojgarh, India, 26.2769, 86.4389 Munnad, India, 12.4667, 75.1861 Covington, United States, 35.5660, -89.6482 Didymoteicho, Greece, 41.3500, 26.5000 Thirumeni, India, 12.2500, 75.4167 Vostochnyy, Kyrgyzstan, 39.9222, 69.6486 Carneys Point, United States, 39.6967, -75.4475 Ammanford, United Kingdom, 51.8000, -3.9930 Paty, Hungary, 47.5167, 18.8333 New Ross, Ireland, 52.3967, -6.9367 Antargangi, India, 17.1700, 75.9600 Ilarionove, Ukraine, 48.4092, 35.2753 Tombos, Brazil, -20.9050, -42.0228 Steti, Czechia, 50.4531, 14.3742 Aurisina, Italy, 45.7504, 13.6746 Long Hill, United States, 40.6838, -74.4878 Monachil, Spain, 37.1319, -3.5389 Pomichna, Ukraine, 48.2500, 31.4167 Templeton, United States, 35.5560, -120.7181 Harrisburg, United States, 37.7374, -88.5457 Kharod, India, 21.7500, 82.5700 Sadovoye, Kyrgyzstan, 42.8539, 74.1725 Teghra, India, 26.4929, 86.3680 Oulad Khallouf, Morocco, 34.7100, -2.5800 Achchampeta, India, 17.0941, 82.3099 Laishevo, Russia, 55.4000, 49.5667 Monona, United States, 43.0540, -89.3334 Narino, Colombia, 5.6092, -75.1764 Heiden, Germany, 51.8258, 6.9331 San Juan de Palamos, Spain, 41.8565, 3.1294 Khaur, India, 32.8229, 74.5112 Amalou, Algeria, 36.4778, 4.6333 Pasaul, India, 26.2647, 85.6756 Jainagar, India, 24.3756, 85.6443 Silaiyampatti, India, 9.8732, 77.3927 Kanavaypatti, India, 10.1857, 77.7347 Bientina, Italy, 43.7072, 10.6206 Mudichchur, India, 12.9110, 80.0693 Shyamnagar, India, 22.9700, 88.3800 Nefasit, Eritrea, 15.3333, 39.0619 Chamba, Ghana, 8.7000, -0.1333 Velim, India, 15.1644, 73.9759 Douar Sidi Msour, Morocco, 32.2725, -7.1986 Zaandijk, Netherlands, 52.4667, 4.8000 Nakaseke, Uganda, 0.7300, 32.4150 Vyetka, Belarus, 52.5667, 31.1833 Jagannathpur, India, 22.2211, 85.6392 Hata, India, 25.0460, 83.4632 Marcoussis, France, 48.6424, 2.2307 Apaneca, El Salvador, 13.8500, -89.8000 Long Hill, United States, 41.2666, -73.2283 Egg, Switzerland, 47.1987, 8.6699 Egg, Switzerland, 47.3019, 8.6906 La Belleza, Colombia, 5.8614, -73.9683 Vendin-le-Vieil, France, 50.4747, 2.8667 Balakrishnanpatti, India, 11.2511, 78.4736 Serramanna, Italy, 39.4228, 8.9217 Hamilton, United States, 40.9334, -75.2844 Le Loroux-Bottereau, France, 47.2389, -1.3478 Amingaon, India, 26.2300, 91.6700 Pariyari, India, 25.2128, 84.7829 Fort Riley, United States, 39.1064, -96.8117 Koila, India, 25.4550, 86.7710 Miyada, Japan, 35.7689, 137.9443 Vrable, Slovakia, 48.2500, 18.3167 Fern Park, United States, 28.6485, -81.3458 Dobrada, Brazil, -21.5167, -48.3939 La Huerta, Philippines, 14.4972, 120.9953 Zuromin, Poland, 53.0667, 19.9000 La Cruz, Argentina, -28.1833, -56.6500 Grossbottwar, Germany, 49.0014, 9.2931 Saint Agnes, United Kingdom, 50.3120, -5.2040 Kanyakulam, India, 8.2012, 77.4015 Amudalapalle, India, 15.9301, 80.6899 Piliv, India, 17.6788, 74.9664 Quezalguaque, Nicaragua, 12.5061, -86.9033 Jalhay, Belgium, 50.5572, 5.9642 Furstenzell, Germany, 48.5333, 13.3167 Yellareddi, India, 18.3746, 78.6543 Rayon, Mexico, 19.1481, -99.5800 Conning Towers Nautilus Park, United States, 41.3850, -72.0684 Srirangapur, India, 16.1917, 78.0507 Dobele, Latvia, 56.6258, 23.2811 Merksplas, Belgium, 51.3580, 4.8634 Anantasagaram, India, 14.5833, 79.4167 Tibro, Sweden, 58.4190, 14.1580 San Pedro Puxtla, El Salvador, 13.7667, -89.8000 Horice, Czechia, 50.3675, 15.6314 Wootton, United Kingdom, 52.2007, -0.8857 Gundur, India, 10.7339, 78.7184 Bargaon, India, 23.1795, 84.6991 Miramar Beach, United States, 30.3854, -86.3442 Pallappalaiyam, India, 11.3891, 77.6027 Adalar, Turkey, 40.8578, 29.1200 Greenville, United States, 41.8820, -71.5549 Mareeba, Australia, -16.9969, 145.4230 El Ghomri, Algeria, 35.6833, 0.2000 Mauleon, France, 46.9236, -0.7483 Roussillon, France, 45.3719, 4.8272 Vinica, North Macedonia, 41.8828, 22.5092 Alnwick, United Kingdom, 55.4134, -1.7069 Tarxien, Malta, 35.8658, 14.5119 Jagta, India, 26.1321, 87.1911 Gidan Ider, Niger, 14.0131, 5.3185 Dekanme, Benin, 7.1333, 1.9667 Buda-Kashalyova, Belarus, 52.7167, 30.5667 Karkkila, Finland, 60.5333, 24.2167 Monte Porzio Catone, Italy, 41.8167, 12.7167 Kizilcasar, Turkey, 39.8167, 32.7333 Tirschenreuth, Germany, 49.8833, 12.3333 Tamza, Algeria, 35.3167, 6.8333 Beebe, United States, 35.0713, -91.8998 Moss Vale, Australia, -34.5500, 150.3833 Tougouni, Mali, 13.2189, -7.2086 Sinimbu, Brazil, -29.5389, -52.5219 Ouled Abbes, Algeria, 36.2167, 1.4833 Vicam Pueblo, Mexico, 27.6422, -110.2897 Liubymivka, Ukraine, 48.0397, 39.4400 Nuevo Paysandu, Uruguay, -32.2667, -58.0667 Yali, Colombia, 6.6767, -74.8411 Waltham Cross, United Kingdom, 51.6860, -0.0331 Trebisacce, Italy, 39.8667, 16.5333 Kalaun, Nepal, 29.8400, 80.5400 Kennedy, United States, 40.4768, -80.1028 Ergue-Gaberic, France, 47.9969, -4.0208 Bandamurlanka, India, 16.4437, 81.9772 Sonterra, United States, 30.8079, -97.5952 West Long Branch, United States, 40.2883, -74.0185 Fallanden, Switzerland, 47.3717, 8.6400 Kaliganj, India, 23.7348, 88.2293 El Espinal, Mexico, 16.4906, -95.0444 Ahumada, Mexico, 30.6186, -106.5122 Hosuru, India, 13.7399, 77.4312 Seyyedan, Iran, 30.0019, 53.0033 Sutherlin, United States, 43.3882, -123.3242 Nunihat, India, 24.4843, 87.1323 Hale Dyamavvanahalli, India, 14.2682, 76.4904 Virapperumanallur, India, 11.7763, 79.4466 Arab, United States, 34.3309, -86.4991 Bushkill, United States, 40.7976, -75.3281 Schwarzenbruck, Germany, 49.3500, 11.2333 Bucksburn, United Kingdom, 57.1770, -2.1750 Nettadahalli, India, 12.1330, 78.0671 Rani Sagar, India, 25.6079, 84.3626 Torre de Moncorvo, Portugal, 41.2000, -7.1333 Cornebarrieu, France, 43.6500, 1.3272 Lalam, India, 9.7167, 76.7000 Kirk of Shotts, United Kingdom, 55.8230, -3.8040 Charuanwan, India, 25.1348, 85.6812 Shiddapur, India, 13.6903, 74.9149 Babhangaon, India, 25.7897, 86.9767 Bundala, India, 31.1333, 75.6500 Gamail, India, 25.7062, 86.9914 Ban Ratchakrut, Thailand, 9.7392, 98.5988 Landupdih, India, 23.1478, 85.7817 Amtar, Morocco, 35.2385, -4.7943 Locogahoue, Benin, 6.8000, 1.7830 Biberist, Switzerland, 47.1828, 7.5586 Onnaing, France, 50.3883, 3.5989 Castelnuovo di Porto, Italy, 42.1278, 12.5000 Gering, United States, 41.8275, -103.6622 Semere, Benin, 9.6268, 1.4515 Neuenburg, Germany, 48.8461, 8.5889 Reinosa, Spain, 43.0019, -4.1378 Coahuitlan, Mexico, 20.2667, -97.7167 Hollymead, United States, 38.1266, -78.4386 Murphy, United States, 38.4922, -90.4856 Obersiggenthal, Switzerland, 47.4869, 8.2921 Hirson, France, 49.9217, 4.0839 Swaffham, United Kingdom, 52.6529, 0.6843 Youghal, Ireland, 51.9517, -7.8456 Dharmajigudem, India, 16.5400, 81.0000 Castel Gandolfo, Italy, 41.7469, 12.6519 Anjahamarina, Madagascar, -18.0510, 49.2341 Kamien Pomorski, Poland, 53.9700, 14.7725 Na Yung, Thailand, 17.8975, 102.1498 Baltimore Highlands, United States, 39.2355, -76.6367 Pimenta, Brazil, -20.4811, -45.8006 Navipet, India, 18.8022, 77.9836 Vicopisano, Italy, 43.6991, 10.5831 Shediac, Canada, 46.2167, -64.5333 Loenen, Netherlands, 52.2167, 5.0167 Sompting, United Kingdom, 50.8303, -0.3395 San Pedro Ixtlahuaca, Mexico, 17.0500, -96.8167 Napoleon, United States, 41.3977, -84.1244 Tanmpegre, Benin, 10.4800, 1.4500 Piliscsaba, Hungary, 47.6336, 18.8269 Chapalamadugu, India, 16.0730, 79.3775 Outa Bouabane, Morocco, 34.2606, -4.4139 Reeuwijksebrug, Netherlands, 52.0467, 4.7239 Innsbrook, United States, 37.6552, -77.5775 Dala, India, 30.7773, 75.2494 Raonta, India, 30.5619, 75.1900 Ayotoxco de Guerrero, Mexico, 20.1000, -97.4000 Nerubaiske, Ukraine, 46.5502, 30.6311 La Cresta, United States, 35.3972, -118.9892 Vif, France, 45.0561, 5.6708 Brembate, Italy, 45.6038, 9.5555 Dougoufe, Mali, 13.3150, -6.6311 Corrales, United States, 35.2366, -106.6191 Saint-Claude, France, 46.3878, 5.8639 Harewa, India, 25.6831, 86.5909 Lohna, India, 26.2314, 86.2095 Wedgefield, United States, 28.4847, -81.0809 Polinya, Spain, 41.5580, 2.1580 Southampton, United States, 40.0249, -77.5459 Kodaimangalam, India, 10.4733, 77.5070 Yaragol, India, 16.9047, 77.0661 Modachchur, India, 11.4415, 77.4288 Takieta, Niger, 13.6806, 8.5292 Nerk'in Getashen, Armenia, 40.1458, 45.2639 Worrstadt, Germany, 49.8431, 8.1156 Staufen im Breisgau, Germany, 47.8814, 7.7314 East Leake, United Kingdom, 52.8320, -1.1770 Sakhua, India, 26.1734, 86.7624 Nesarg, India, 15.9069, 74.7740 Skiatook, United States, 36.3699, -95.9856 Sallisaw, United States, 35.4606, -94.8072 Privas, France, 44.7358, 4.5970 Vairichettipalaiyam, India, 11.2872, 78.4893 Nulvi, India, 15.2728, 75.1673 Ad Darbasiyah, Syria, 37.0728, 40.6520 Sukand, India, 26.6444, 78.4752 Troina, Italy, 37.7833, 14.6000 Monte San Savino, Italy, 43.3303, 11.7308 Uspenka, Ukraine, 48.3939, 39.1536 Ellsworth, United States, 44.5847, -68.4875 Furstenfeld, Austria, 47.0500, 16.0833 Pattanam, India, 10.9808, 77.0542 Iwaizumi, Japan, 39.8431, 141.7964 San Fernando, Nicaragua, 13.6833, -86.3167 Muzo, Colombia, 5.5313, -74.1073 Tadinada, India, 16.5470, 81.3219 Tifra, Algeria, 36.6667, 4.7000 Arkalochori, Greece, 35.1441, 25.2606 Pata Uppal, India, 18.1799, 79.4762 Sokyriany, Ukraine, 48.4500, 27.3667 Cumberland, United States, 43.7933, -70.2579 Rhymney, United Kingdom, 51.7590, -3.2830 Yamkanmardi, India, 16.1280, 74.5270 Imsida, Malta, 35.8978, 14.4894 Hadibu, Yemen, 12.6500, 54.0167 Summit Park, United States, 40.7423, -111.5872 Viechtach, Germany, 49.0792, 12.8847 Dubovskoye, Russia, 47.4092, 42.7575 Closter, United States, 40.9733, -73.9604 Aqsu, Kazakhstan, 52.4502, 71.9597 Reddiyapatti, India, 10.1581, 78.1901 Kolumalapalle, India, 15.4774, 78.1293 Colindres, Spain, 43.3967, -3.4483 Karmaskaly, Russia, 54.3694, 56.1778 Taftanaz, Syria, 35.9983, 36.7858 Socorro, United States, 34.0543, -106.9065 Zogno, Italy, 45.7939, 9.6656 Bacobampo, Mexico, 26.9889, -109.6500 Alfonso Castaneda, Philippines, 15.7933, 121.3025 Chyhyryn, Ukraine, 49.0772, 32.6492 Olivette, United States, 38.6724, -90.3786 Bifeng, China, 30.1067, 103.0133 Vidreras, Spain, 41.7903, 2.7750 Tizoual, Morocco, 31.0244, -7.8186 Tsallagundla, India, 16.3522, 79.9619 Puran Bigha, India, 24.8390, 84.8540 Kandanati, India, 15.6997, 77.4757 Clusone, Italy, 45.8833, 9.9500 Doberlug-Kirchhain, Germany, 51.6167, 13.5667 Talwandi Chaudhrian, India, 31.3000, 75.1764 Nangal Chaudhri, India, 27.8923, 76.1122 Dietmannsried, Germany, 47.8167, 10.2833 Talakulam, India, 8.1824, 77.3161 Guria, India, 26.1633, 86.9645 Chak Thathi, Pakistan, 30.3701, 73.2215 Kuppenheim, Germany, 48.8275, 8.2544 Sautron, France, 47.2644, -1.6667 Ban Charoen Mueang, Thailand, 19.6075, 99.7547 Marcolandia, Brazil, -7.4428, -40.6608 Karuppur, India, 10.4918, 78.3296 Ban Wat Phrik, Thailand, 16.7460, 100.2750 Old Forge, United States, 41.3704, -75.7409 Schierling, Germany, 48.8347, 12.1397 Bartica, Guyana, 6.4000, -58.6167 Dattapara, India, 22.8491, 88.9023 Mangala, India, 11.9998, 76.9594 Banki, India, 26.1497, 86.3626 Poninguinim, India, 14.9679, 74.0865 Hernani, Philippines, 11.3239, 125.6181 Delavan, United States, 42.6282, -88.6323 Descanso, Brazil, -26.8247, -53.5018 Chamusca, Portugal, 39.3594, -8.4808 Perryville, United States, 37.7263, -89.8759 Hollis, United States, 42.7494, -71.5834 Siegsdorf, Germany, 47.8167, 12.6500 Keregodu, India, 12.6333, 76.9167 Hongtuliang, China, 40.9986, 114.1550 Hermsdorf, Germany, 50.8981, 11.8567 Khajuri, India, 26.5216, 84.3391 Lamesa, United States, 32.7333, -101.9541 Secovce, Slovakia, 48.7000, 21.6500 Gonzales, United States, 36.5055, -121.4427 Ararica, Brazil, -29.6139, -50.9250 Nossa Senhora dos Remedios, Brazil, -3.9789, -42.6208 Kasap, India, 25.4702, 84.6087 Phopnar Kalan, India, 21.2365, 76.3268 Le Mont-sur-Lausanne, Switzerland, 46.5217, 6.6269 Kirn, Germany, 49.7881, 7.4572 Nijgaon Paranpur, India, 25.1559, 87.9732 Barntrup, Germany, 51.9831, 9.1167 Clayton le Moors, United Kingdom, 53.7750, -2.3840 Pokrovka, Kyrgyzstan, 42.7500, 71.6000 Lanco, Chile, -39.4500, -72.7833 Bessancourt, France, 49.0386, 2.2142 Nawanagar, India, 25.3861, 84.2069 Hundested, Denmark, 55.9667, 11.8667 Medikunda, India, 15.9581, 77.6095 Thandewala, India, 30.4720, 74.5898 Khutha Baijnath, India, 26.0268, 87.1170 Kandanur, India, 10.1037, 78.8254 Elektrougli, Russia, 55.7167, 38.2000 Ra's al Ma`arrah, Syria, 33.9996, 36.5581 Qoravul, Uzbekistan, 41.5569, 60.5914 Qorovul, Uzbekistan, 41.5538, 60.5823 Ahuimanu, United States, 21.4379, -157.8404 Andanappettai, India, 10.7498, 79.8226 San Isidro, Philippines, 9.9369, 126.0886 Olamze, Cameroon, 2.2167, 11.0833 Chantonnay, France, 46.6878, -1.0494 Myrina, Greece, 39.8833, 25.0667 Kond Rud, Iran, 38.0094, 46.4778 Dar El Kebdani, Morocco, 35.1203, -3.3322 Poniatowa, Poland, 51.1928, 22.0647 Sangaree, United States, 33.0327, -80.1253 Perungulam, India, 8.6413, 77.9985 Dodvad, India, 15.7900, 74.7500 Silvarpatti, India, 10.1180, 77.6241 Santa Margherita Ligure, Italy, 44.3349, 9.2101 Cedar Hills, United States, 45.5047, -122.8053 Hathapur, India, 26.5609, 86.0247 Rampatti, India, 26.0028, 86.8014 Wieruszow, Poland, 51.3000, 18.1500 Le Grau-du-Roi, France, 43.5381, 4.1372 Lycksele, Sweden, 64.6000, 18.6667 Carbonita, Brazil, -17.5269, -43.0158 Bad Feilnbach, Germany, 47.7833, 12.0167 Bedwas, United Kingdom, 51.5926, -3.2061 Sagarpur, India, 26.2306, 86.0732 Darsur, India, 25.9711, 85.9148 Dunn, United States, 35.3114, -78.6129 Akono, Cameroon, 3.4997, 11.3267 Tona, Spain, 41.8500, 2.2333 Takaharu, Japan, 31.9283, 131.0078 Hueyotlipan, Mexico, 18.9000, -97.8500 Georgetown, United States, 33.3594, -79.2958 Murillo, United States, 26.2642, -98.1233 Port-Saint-Louis-du-Rhone, France, 43.3875, 4.8040 Kuchai Kot, India, 26.5559, 84.3292 Bouhlou, Morocco, 34.1333, -4.4000 Caldas de Malavella, Spain, 41.8394, 2.8106 Diss, United Kingdom, 52.3812, 1.1079 Boshof, South Africa, -28.5500, 25.2333 Minnetrista, United States, 44.9356, -93.7107 Barton, United States, 42.0812, -76.4982 El Dovio, Colombia, 4.5167, -76.2333 Saint-Vallier, France, 46.6428, 4.3719 La Grande-Motte, France, 43.5614, 4.0858 Mandalapalle, India, 14.0209, 77.7511 Pachrukhi, India, 26.1593, 84.4087 Repala, India, 15.0044, 79.6953 Hondo, United States, 29.3531, -99.1616 Zhujiagua, China, 38.2242, 110.4032 Pedda Penki, India, 18.5853, 83.5069 Tionk Essil, Senegal, 12.7856, -16.5217 Beecher, United States, 43.0903, -83.7039 West Earl, United States, 40.1260, -76.1774 Vaucresson, France, 48.8392, 2.1578 Nottampatti, India, 9.9772, 77.7177 Orsova, Romania, 44.7253, 22.3961 Biloziria, Ukraine, 49.3053, 31.8922 Lint, Belgium, 51.1167, 4.4833 Carlton Colville, United Kingdom, 52.4540, 1.6910 Liesti, Romania, 45.6193, 27.5416 Lewistown, United States, 40.5964, -77.5730 Sredets, Bulgaria, 42.3475, 27.1789 Campogalliano, Italy, 44.6904, 10.8389 Rignano sull'Arno, Italy, 43.7237, 11.4507 Dala, Mali, 15.1058, -2.6389 Nalikkalpatti, India, 11.6021, 78.1340 Chinaur, India, 25.9467, 78.1024 Munnelli, India, 14.9200, 78.9546 Nalas, Iran, 36.2631, 45.4933 Dobanovci, Serbia, 44.8228, 20.2219 Ahrensbok, Germany, 54.0167, 10.5833 Tarichar Kalan, India, 25.4118, 78.8900 Setana, Japan, 42.4500, 139.8500 Saruu, Kyrgyzstan, 42.3207, 77.9176 Montague, United States, 42.5549, -72.5177 Rakai, Uganda, -0.7100, 31.4050 Chapaev, Kazakhstan, 50.2000, 51.1667 Basarabeasca, Moldova, 46.3336, 28.9614 Namsos, Norway, 64.4670, 11.4940 Joniskis, Lithuania, 56.2333, 23.6167 Orocue, Colombia, 4.7942, -71.3400 Zardab, Azerbaijan, 40.2199, 47.7100 As Sallum, Egypt, 31.5500, 25.1600 Gramsh, Albania, 40.8667, 20.1833 Bulaevo, Kazakhstan, 54.9056, 70.4439 Biryusinsk, Russia, 55.9667, 97.8333 Stans, Switzerland, 46.9594, 8.3667 Gadzin Han, Serbia, 43.2203, 22.0258 Gunnedah, Australia, -30.9667, 150.2500 Kaisiadorys, Lithuania, 54.8653, 24.4682 Golubac, Serbia, 44.6530, 21.6320 Kargat, Russia, 55.1956, 80.2811 Pazin, Croatia, 45.2392, 13.9386 Soro, Denmark, 55.4330, 11.5667 Cowra, Australia, -33.8339, 148.7000 Olovyannaya, Russia, 50.9500, 115.5666 Slovenska Bistrica, Slovenia, 46.3941, 15.5707 Rubirizi, Uganda, -0.2661, 30.1069 Ayr, Australia, -19.5744, 147.4066 Pampa del Infierno, Argentina, -26.5167, -61.1667 Tweed Heads, Australia, -28.1833, 153.5500 Naujoji Akmene, Lithuania, 56.3167, 22.8833 Bongaree, Australia, -27.0813, 153.1636 Kocevje, Slovenia, 45.6430, 14.8594 Nova Crnja, Serbia, 45.6667, 20.6000 Kone, New Caledonia, -21.0590, 164.8518 Gleno, Timor-Leste, -8.7239, 125.4361 Sodankyla, Finland, 67.4167, 26.5833 Putina, Peru, -15.4700, -69.4300 Aguelhok, Mali, 19.4614, 0.8589 Hammerfest, Norway, 70.6634, 23.6821 Beocin, Serbia, 45.1922, 19.7203 Qusmuryn, Kazakhstan, 52.4580, 64.6000 Osakarovka, Kazakhstan, 50.5619, 72.5681 Dimitrovgrad, Serbia, 43.0167, 22.7833 Varena, Lithuania, 54.2167, 24.5667 Charters Towers, Australia, -20.0765, 146.2614 Montpelier, United States, 44.2659, -72.5717 Gzira, Malta, 35.9050, 14.4944 Kontcha, Cameroon, 7.9667, 12.2333 Sharya, Russia, 58.3667, 45.5000 Oldeani, Tanzania, -3.3496, 35.5500 Nisporeni, Moldova, 47.0833, 28.1833 Sokobanja, Serbia, 43.6394, 21.8694 Ciudad Cortes, Costa Rica, 9.0221, -83.5751 Greymouth, New Zealand, -42.4500, 171.2075 Katoomba, Australia, -33.7100, 150.3100 Amapa, Brazil, 2.0528, -50.7928 Sharbaqty, Kazakhstan, 52.4999, 78.1499 Port Maria, Jamaica, 18.3702, -76.8903 Sparti, Greece, 37.0739, 22.4294 Alebtong, Uganda, 2.2500, 33.3150 Buba, Guinea-Bissau, 11.5900, -14.9900 San Julian, Argentina, -49.3000, -67.7167 Monaghan, Ireland, 54.2478, -6.9708 Foammulah, Maldives, -0.2932, 73.4236 Auki, Solomon Islands, -8.7678, 160.6978 Dilolo, Congo (Kinshasa), -10.4667, 22.4667 Nangan, Taiwan, 26.1500, 119.9333 Sembabule, Uganda, -0.0800, 31.4600 Paide, Estonia, 58.8833, 25.5572 Ch'osan-up, Korea, North, 40.8255, 125.8008 Bentiu, South Sudan, 9.2333, 29.8333 Falmouth, Jamaica, 18.4900, -77.6610 Ertis, Kazakhstan, 53.3337, 75.4590 Maryborough, Australia, -37.0500, 143.7350 Iqaluit, Canada, 63.7598, -68.5107 Luba, Equatorial Guinea, 3.4500, 8.5500 Oranjemund, Namibia, -28.5500, 16.4333 Kalabo, Zambia, -14.9911, 22.6789 Young, Australia, -34.3000, 148.3000 Grosuplje, Slovenia, 45.9551, 14.6562 Qazaly, Kazakhstan, 45.7667, 62.1000 Uglegorsk, Russia, 49.0667, 142.0333 Bayghanin, Kazakhstan, 48.6917, 55.8740 Lascano, Uruguay, -33.6739, -54.2075 Heyin, China, 36.0451, 101.4242 Yeghegnadzor, Armenia, 39.7667, 45.3500 Yardimli, Azerbaijan, 38.9078, 48.2406 Mtskheta, Georgia, 41.8431, 44.7194 Guadalupe, Sao Tome and Principe, 0.3800, 6.6381 Kibale, Uganda, 0.7911, 31.0750 Jacareacanga, Brazil, -6.2222, -57.7528 Bairnsdale, Australia, -37.8275, 147.6250 Omuthiya, Namibia, -18.3606, 16.5812 Odzaci, Serbia, 45.5167, 19.2667 San Pablo Villa de Mitla, Mexico, 16.9170, -96.4000 Castillos, Uruguay, -34.1989, -53.8575 Adazi, Latvia, 57.0769, 24.3236 Ludza, Latvia, 56.5439, 27.7211 Kelme, Lithuania, 55.6333, 22.9333 Sen Monorom, Cambodia, 12.4558, 107.1881 Gaoual, Guinea, 11.7540, -13.2130 Zhanibek, Kazakhstan, 49.4167, 46.8500 Siteia, Greece, 35.2000, 26.1000 Backi Petrovac, Serbia, 45.3606, 19.5917 Leova, Moldova, 46.4786, 28.2553 Leeton, Australia, -34.5667, 146.4000 Kishkenekol, Kazakhstan, 53.6394, 72.3439 Kirkwall, United Kingdom, 58.9810, -2.9600 Coracora, Peru, -15.0170, -73.7804 Belomorsk, Russia, 64.5253, 34.7658 Goranboy, Azerbaijan, 40.6100, 46.7872 Zmeinogorsk, Russia, 51.1667, 82.2000 Aiquile, Bolivia, -18.1667, -65.1667 Ravne na Koroskem, Slovenia, 46.5437, 14.9642 Luan Chau, Vietnam, 21.7400, 103.3430 Atherton, Australia, -17.2658, 145.4780 Narrabri, Australia, -30.3167, 149.7667 Aracinovo, North Macedonia, 42.0264, 21.5617 Lerik, Azerbaijan, 38.7753, 48.4153 Thames, New Zealand, -37.1384, 175.5405 Puerto Baquerizo Moreno, Ecuador, -0.9025, -89.6092 Bossembele, Central African Republic, 5.2667, 17.6500 Kicevo, North Macedonia, 41.5142, 20.9631 Mongomo, Equatorial Guinea, 1.6287, 11.3168 Slovenj Gradec, Slovenia, 46.5094, 15.0792 Tranqueras, Uruguay, -31.1833, -55.7667 Telenesti, Moldova, 47.5028, 28.3667 Debe, Trinidad and Tobago, 10.2000, -61.4500 Bestobe, Kazakhstan, 52.4997, 73.0997 Obo, Central African Republic, 5.4000, 26.5000 Mobaye, Central African Republic, 4.3254, 21.1778 Tobyl, Kazakhstan, 52.6980, 62.5749 Lapovo, Serbia, 44.1833, 21.1000 Ruyigi, Burundi, -3.4667, 30.2500 Dowa, Malawi, -13.6532, 33.9385 Novoberde, Kosovo, 42.6178, 21.4197 Donduseni, Moldova, 48.2167, 27.5833 Stefan Voda, Moldova, 46.5129, 29.6619 Zambezi, Zambia, -13.5500, 23.1167 Moree, Australia, -29.4658, 149.8339 Mae Hong Son, Thailand, 19.3011, 97.9700 Diekirch, Luxembourg, 49.8681, 6.1567 In Guezzam, Algeria, 19.5686, 5.7722 Kemijarvi, Finland, 66.7167, 27.4333 Wick, United Kingdom, 58.4540, -3.0890 Thyolo, Malawi, -16.0667, 35.1333 Rabaul, Papua New Guinea, -4.1981, 152.1681 Ararat, Australia, -37.2833, 142.9167 Oguz, Azerbaijan, 41.0708, 47.4583 Kapoeta, South Sudan, 4.7721, 33.5902 Kerikeri, New Zealand, -35.2244, 173.9514 Kieta, Papua New Guinea, -6.2058, 155.6227 Nicoadala, Mozambique, -17.6077, 36.8197 Librazhd, Albania, 41.1833, 20.3167 Santa Venera, Malta, 35.8897, 14.4778 Hola, Kenya, -1.5000, 40.0300 Victoria, Malta, 36.0436, 14.2431 Kiruhura, Uganda, -0.2100, 30.8300 Kiama, Australia, -34.6708, 150.8542 Lerwick, United Kingdom, 60.1550, -1.1450 Zholymbet, Kazakhstan, 51.7502, 71.7099 Borgo Maggiore, San Marino, 43.9450, 12.4497 Obiliq, Kosovo, 42.6869, 21.0703 Kraslava, Latvia, 55.8956, 27.1644 Aizkraukle, Latvia, 56.6008, 25.2550 Krsko, Slovenia, 45.9590, 15.4922 Brezice, Slovenia, 45.9044, 15.5925 Ajdovscina, Slovenia, 45.8861, 13.9097 Salcininkai, Lithuania, 54.3111, 25.3806 Forbes, Australia, -33.3833, 148.0167 Nata, Botswana, -20.2103, 26.1867 Khandyga, Russia, 62.6660, 135.6000 Livani, Latvia, 56.3539, 26.1761 Charagua, Bolivia, -19.7906, -63.1978 Magugpo Poblacion, Philippines, 7.3821, 125.8017 Gulbene, Latvia, 57.1750, 26.7564 Criuleni, Moldova, 47.2167, 29.1614 Litija, Slovenia, 46.0667, 14.8167 Skovorodino, Russia, 53.9833, 123.9333 Cooma, Australia, -36.2350, 149.1258 Limbazi, Latvia, 57.5147, 24.7131 Carnarvon, South Africa, -30.9667, 22.1333 Awjilah, Libya, 29.1081, 21.2869 Seymour, Australia, -37.0300, 145.1300 Port Augusta, Australia, -32.4925, 137.7658 Madona, Latvia, 56.8542, 26.2206 Mazoe, Zimbabwe, -17.5167, 30.9667 Ros Comain, Ireland, 53.6333, -8.1833 Kerema, Papua New Guinea, -7.9270, 145.8380 Northam, Australia, -31.6531, 116.6661 Cliza, Bolivia, -17.6000, -65.9333 Roma, Australia, -26.5733, 148.7869 Bogatic, Serbia, 44.8333, 19.4833 Oficina Maria Elena, Chile, -22.3451, -69.6615 Newman, Australia, -23.3539, 119.7319 Ingeniero Guillermo N. Juarez, Argentina, -23.9000, -61.8500 Port Saint John's, South Africa, -31.6288, 29.5369 Ndende, Gabon, -2.3829, 11.3833 Verkhnevilyuysk, Russia, 63.4500, 120.3000 Zouar, Chad, 20.4500, 16.5167 Deniliquin, Australia, -35.5297, 144.9569 Shar, Kazakhstan, 49.5858, 81.0478 Pasvalys, Lithuania, 56.0611, 24.4000 Melut, South Sudan, 10.4337, 32.2000 Comandante Luis Piedra Buena, Argentina, -49.9830, -68.9100 Omutninsk, Russia, 58.6667, 52.1833 Siteki, Eswatini, -26.4550, 31.9520 Medveda, Serbia, 42.8333, 21.5833 Sal Rei, Cabo Verde, 16.1760, -22.9171 San Carlos, Bolivia, -17.4044, -63.7325 Dalaba, Guinea, 10.6560, -12.2720 Yeppoon, Australia, -23.1288, 150.7444 Funafuti, Tuvalu, -8.5167, 179.2000 Lorengau, Papua New Guinea, -2.0208, 147.2667 Derzhavinsk, Kazakhstan, 51.1000, 66.3167 Omaruru, Namibia, -21.4183, 15.9539 Vanrhynsdorp, South Africa, -31.6167, 18.7333 Punakha, Bhutan, 27.5833, 89.8583 Ingeniero Jacobacci, Argentina, -41.3000, -69.5833 Jakar, Bhutan, 27.5500, 90.7333 Phalombe, Malawi, -15.8000, 35.6500 Queanbeyan, Australia, -35.3533, 149.2342 Tumut, Australia, -35.3047, 148.2228 Kavadarci, North Macedonia, 41.4328, 22.0117 Palikir, Micronesia, Federated States of, 6.9172, 158.1589 Las Lajas, Argentina, -38.6000, -70.3000 Moss, Norway, 59.4339, 10.6575 Ub, Serbia, 44.4500, 20.0667 Kupiskis, Lithuania, 55.8333, 24.9667 Aluksne, Latvia, 57.4239, 27.0503 Espargos, Cabo Verde, 16.7546, -22.9453 Gizo, Solomon Islands, -8.1056, 156.8389 Veintiocho de Noviembre, Argentina, -51.6500, -72.3000 Bella Vista, Paraguay, -22.1296, -56.5200 Umba, Russia, 66.6814, 34.3455 Menges, Slovenia, 46.1626, 14.5680 Bac, Serbia, 45.3833, 19.2333 Junik, Kosovo, 42.4758, 20.2772 Viqueque, Timor-Leste, -8.8575, 126.3647 Yamba, Australia, -29.4333, 153.3500 Kolonia, Micronesia, Federated States of, 6.9639, 158.2081 Alausi, Ecuador, -2.1900, -78.8500 Cabrayil, Azerbaijan, 39.4000, 47.0261 Dinguiraye, Guinea, 11.2990, -10.7260 San Javier, Bolivia, -16.2748, -62.5072 Schaan, Liechtenstein, 47.1667, 9.5097 Sezana, Slovenia, 45.7034, 13.8706 Zagorje, Slovenia, 46.1342, 14.9942 Chepes, Argentina, -31.3500, -66.6000 Outjo, Namibia, -20.1069, 16.1503 Lucea, Jamaica, 18.4500, -78.1833 Maltahohe, Namibia, -24.8500, 16.9833 Mitoma, Uganda, -0.6150, 30.0450 Glarus, Switzerland, 47.0333, 9.0667 Tazovskiy, Russia, 67.4833, 78.7167 Radovljica, Slovenia, 46.3425, 14.1721 Veinticinco de Mayo, Argentina, -37.7712, -67.7174 Permet, Albania, 40.2333, 20.3500 Luqa, Malta, 35.8597, 14.4892 Zarasai, Lithuania, 55.7306, 26.2472 Trakai, Lithuania, 54.6333, 24.9333 Briceni, Moldova, 48.3611, 27.0839 Soldanesti, Moldova, 47.8161, 28.7972 Echternach, Luxembourg, 49.8117, 6.4217 Mundybash, Russia, 53.2333, 87.3167 Kaitaia, New Zealand, -35.1125, 173.2628 Rutana, Burundi, -3.9236, 30.0061 Berovo, North Macedonia, 41.7078, 22.8564 Idrija, Slovenia, 46.0025, 14.0275 Preili, Latvia, 56.2942, 26.7247 Sirvintos, Lithuania, 55.0500, 24.9500 Lobamba, Eswatini, -26.4667, 31.2000 Ranillug, Kosovo, 42.4922, 21.5989 Aiyomojok, Cameroon, 5.7504, 8.9833 Moletai, Lithuania, 55.2333, 25.4167 Canillo, Andorra, 42.5667, 1.6000 Biloela, Australia, -24.4002, 150.5133 Appenzell, Switzerland, 47.3306, 9.4086 Piggs Peak, Eswatini, -25.9610, 31.2470 Stratford, New Zealand, -39.3410, 174.2840 Uncia, Bolivia, -18.4681, -66.5647 Xocavand, Azerbaijan, 39.7950, 47.1117 Marigot, Saint Martin, 18.0706, -63.0847 Tiksi, Russia, 71.6269, 128.8350 Masunga, Botswana, -20.6245, 27.4488 Makarov, Russia, 48.6333, 142.8000 Novi Knezevac, Serbia, 46.0500, 20.1000 Cacheu, Guinea-Bissau, 12.2667, -16.1667 Vaduz, Liechtenstein, 47.1406, 9.5222 Nieuw Amsterdam, Suriname, 5.8833, -55.0833 Chonchi, Chile, -42.6219, -73.7742 Stawell, Australia, -37.0500, 142.7667 Hermanus, South Africa, -34.4167, 19.2500 Babak, Azerbaijan, 39.1519, 45.4417 Vadso, Norway, 70.0733, 29.7497 Balvi, Latvia, 57.1292, 27.2667 Ulbroka, Latvia, 56.9408, 24.2861 Sisimiut, Greenland, 66.9389, -53.6722 Muisne, Ecuador, 0.6108, -80.0186 Vossevangen, Norway, 60.6300, 6.4410 Okhotsk, Russia, 59.3830, 143.2170 Fort-Shevchenko, Kazakhstan, 44.5167, 50.2667 Mwatate, Kenya, -3.5050, 38.3772 Polva, Estonia, 58.0603, 27.0694 Byron Bay, Australia, -28.6431, 153.6150 Kazlu Ruda, Lithuania, 54.7492, 23.4865 Mamushe, Kosovo, 42.3308, 20.7269 Namanga, Kenya, -2.5500, 36.7833 Bakal, Russia, 54.9333, 58.8167 Crnomelj, Slovenia, 45.0000, 34.0000 General Conesa, Argentina, -40.1000, -64.4167 San Antonio de los Cobres, Argentina, -24.2178, -66.3200 Petnjica, Montenegro, 42.9089, 19.9644 Mali, Guinea, 12.0840, -12.3010 Mali Idos, Serbia, 45.7069, 19.6644 Muramvya, Burundi, -3.2500, 29.6000 Bilibino, Russia, 68.0500, 166.4500 Tura, Russia, 64.2833, 100.2167 Sakiai, Lithuania, 54.9556, 23.0444 Goondiwindi, Australia, -28.5461, 150.3097 Ouadda, Central African Republic, 8.0667, 22.4000 San Quintin, Mexico, 30.4837, -115.9500 Wiltz, Luxembourg, 49.9661, 5.9325 Thaba-Tseka, Lesotho, -29.5333, 28.6000 Richmond, Australia, -33.6000, 150.7500 Kratovo, North Macedonia, 42.0783, 22.1750 Buguruslan, Russia, 53.6583, 52.4358 Kovacica, Serbia, 45.1117, 20.6214 Cospicua, Malta, 35.8822, 14.5222 Cobram, Australia, -35.9667, 145.6500 San Ramon, Bolivia, -13.2672, -64.6172 Witu, Kenya, -2.3796, 40.4300 Medvode, Slovenia, 46.1382, 14.4147 San Matias, Bolivia, -16.3611, -58.4053 Viligili, Maldives, 0.7569, 73.4361 Skuodas, Lithuania, 56.2667, 21.5333 Bajram Curri, Albania, 42.3583, 20.0761 Hohenau, Paraguay, -27.0796, -55.7500 Napak, Uganda, 2.1156, 34.2267 Torghay, Kazakhstan, 49.6260, 63.4990 Triesen, Liechtenstein, 47.1000, 9.5333 Albina, Suriname, 5.5000, -54.0500 Tarrafal, Cabo Verde, 16.5660, -24.3570 Thinadhoo, Maldives, 0.5302, 72.9965 Saint-Pierre, Saint Pierre and Miquelon, 46.7817, -56.1736 Mayumba, Gabon, -3.4167, 10.6500 Kalangala, Uganda, -0.3214, 32.2919 Jinzhong, China, 26.3504, 103.4167 Slovenske Konjice, Slovenia, 46.3383, 15.4233 Danilovgrad, Montenegro, 42.6100, 19.0500 Liquica, Timor-Leste, -8.5875, 125.3419 Chernyshevskiy, Russia, 63.0128, 112.4714 Rapla, Estonia, 58.9944, 24.8011 Karibib, Namibia, -21.9390, 15.8530 Smiltene, Latvia, 57.4242, 25.9064 Villa del Rosario, Paraguay, -24.4196, -57.1000 Rogaska Slatina, Slovenia, 46.2375, 15.6397 Catio, Guinea-Bissau, 11.2833, -15.2500 Roatan, Honduras, 16.3300, -86.5190 Kekava, Latvia, 56.8266, 24.2300 Punta Gorda, Belize, 16.1000, -88.8000 Bolama, Guinea-Bissau, 11.5776, -15.4742 McMinns Lagoon, Australia, -12.5329, 131.0500 Scone, Australia, -32.0833, 150.8500 Pale, Equatorial Guinea, -1.4069, 5.6322 Zalec, Slovenia, 46.2510, 15.1639 Singleton, Australia, -32.5667, 151.1697 Qasr al Farafirah, Egypt, 27.0671, 27.9666 Puerto Casado, Paraguay, -22.2896, -57.9400 Ignalina, Lithuania, 55.3406, 26.1605 Samtse, Bhutan, 27.0333, 89.0833 Grevenmacher, Luxembourg, 49.6806, 6.4417 Gevgelija, North Macedonia, 41.1392, 22.5025 Wonthaggi, Australia, -38.6056, 145.5917 Hrastnik, Slovenia, 46.1479, 15.1528 Sembe, Congo (Brazzaville), 1.6553, 14.5708 Lithgow, Australia, -33.4833, 150.1500 Valdez, Ecuador, 1.2500, -79.0000 Sentjur, Slovenia, 46.2176, 15.3960 Ust'-Kamchatsk, Russia, 56.2167, 162.5500 Bled, Slovenia, 46.3688, 14.1140 Mitzic, Gabon, 0.7833, 11.5667 Mekambo, Gabon, 1.0171, 13.9333 Xaghra, Malta, 36.0503, 14.2675 Vrapciste, North Macedonia, 41.8337, 20.8851 Ordino, Andorra, 42.5550, 1.5331 Jogeva, Estonia, 58.7469, 26.4000 Irig, Serbia, 45.1011, 19.8583 Segezha, Russia, 63.7333, 34.3167 Albury, Australia, -36.0806, 146.9158 Brownsweg, Suriname, 5.0164, -55.1669 Yegoryevsk, Russia, 55.3833, 39.0500 Tuzi, Montenegro, 42.3656, 19.3314 Carrick on Shannon, Ireland, 53.9469, -8.0900 Ponta do Sol, Cabo Verde, 17.2020, -25.0930 Ilulissat, Greenland, 69.2167, -51.1000 Halba, Lebanon, 34.5506, 36.0781 Ghaxaq, Malta, 35.8483, 14.5172 Shira, Russia, 54.4939, 89.9628 Coka, Serbia, 45.9333, 20.1500 Silale, Lithuania, 55.4833, 22.1833 Svolvaer, Norway, 68.2333, 14.5667 Komatipoort, South Africa, -25.4333, 31.9500 Swellendam, South Africa, -34.0231, 20.4400 Klaksvik, Faroe Islands, 62.2375, -6.5390 Westport, New Zealand, -41.7550, 171.5990 Finnsnes, Norway, 69.2406, 18.0086 Balzers, Liechtenstein, 47.0667, 9.5000 Sangar, Russia, 63.9241, 127.4739 Betanzos, Bolivia, -19.5533, -65.4536 Bongandanga, Congo (Kinshasa), 1.5100, 21.0500 Prevalje, Slovenia, 46.5438, 14.9119 Perito Moreno, Argentina, -46.5886, -70.9242 Outapi, Namibia, -17.5044, 14.9847 Sayanogorsk, Russia, 53.0500, 91.4500 Valka, Latvia, 57.7753, 26.0214 Opovo, Serbia, 45.0514, 20.4247 Otar, Kazakhstan, 43.5375, 75.2089 Sevnica, Slovenia, 46.0092, 15.3041 Kununurra, Australia, -15.7736, 128.7386 Nadur, Malta, 36.0381, 14.2950 Camargo, Bolivia, -20.6403, -65.2103 Fuerte Olimpo, Paraguay, -21.0696, -57.9000 Gobernador Gregores, Argentina, -48.7667, -70.2500 Pakruojis, Lithuania, 55.9833, 23.8500 Svencionys, Lithuania, 55.1333, 26.1556 Bururi, Burundi, -3.9333, 29.6167 Al Qasr, Egypt, 25.6959, 28.8837 Eschen, Liechtenstein, 47.2167, 9.5167 Victorica, Argentina, -36.2167, -65.4500 Susa, Azerbaijan, 39.7602, 46.7504 Qivraq, Azerbaijan, 39.3994, 45.1151 Mauren, Liechtenstein, 47.2167, 9.5333 Marsa, Malta, 35.8833, 14.4947 Karasburg, Namibia, -28.0172, 18.7478 Samaipata, Bolivia, -18.1794, -63.8756 Magdalena, Bolivia, -13.2606, -64.0528 Saryshaghan, Kazakhstan, 46.1167, 73.6167 Tepelene, Albania, 40.2965, 20.0186 Ingham, Australia, -18.6508, 146.1572 Ilirska Bistrica, Slovenia, 45.5679, 14.2527 Dehiba, Tunisia, 32.0167, 10.7000 Nwoya, Uganda, 2.6350, 32.0000 Bekily, Madagascar, -24.2162, 45.3166 Comandante Fontana, Argentina, -25.3333, -59.6833 Narrogin, Australia, -32.9360, 117.1780 Batagay, Russia, 67.6560, 134.6350 Black River, Jamaica, 18.0257, -77.8509 Kuala Belait, Brunei, 4.5828, 114.1918 Victor Harbor, Australia, -35.5500, 138.6167 I-n-Amguel, Algeria, 23.6936, 5.1647 Ruse, Slovenia, 46.5383, 15.5153 La Palma, Panama, 8.3982, -78.1402 Omsukchan, Russia, 62.5333, 155.8000 Novyy Uoyan, Russia, 56.1350, 111.7339 Manjimup, Australia, -34.2411, 116.1464 Calheta de Sao Miguel, Cabo Verde, 15.1875, -23.5917 Krusevo, North Macedonia, 41.3700, 21.2483 Naifaru, Maldives, 5.4444, 73.3657 Bensonville, Liberia, 6.4456, -10.6097 Berri, Australia, -34.2833, 140.6000 Pevek, Russia, 69.7000, 170.2833 Port Hedland, Australia, -20.3100, 118.6011 Wabag, Papua New Guinea, -5.4833, 143.7000 Corovode, Albania, 40.5042, 20.2272 San Marino, San Marino, 43.9346, 12.4473 Kalvarija, Lithuania, 54.4147, 23.2281 Pieta, Malta, 35.8931, 14.4936 Cerknica, Slovenia, 45.7964, 14.3581 Remich, Luxembourg, 49.5444, 6.3667 El Maiten, Argentina, -42.0500, -71.1667 Avarua, Cook Islands, -21.2070, -159.7710 Belmopan, Belize, 17.2522, -88.7639 Manica, Mozambique, -18.9344, 32.8756 Aliwal North, South Africa, -30.7000, 26.7000 Balzan, Malta, 35.8981, 14.4533 Qobustan, Azerbaijan, 40.5336, 48.9282 Robertsport, Liberia, 6.7500, -11.3667 Karmah an Nuzul, Sudan, 19.6008, 30.4097 Trebnje, Slovenia, 45.9104, 15.0086 Trzin, Slovenia, 46.1353, 14.5600 Bethanie, Namibia, -26.5006, 17.1600 Klin, Russia, 56.3333, 36.7333 Bir Mogrein, Mauritania, 25.2167, -11.6167 Lazdijai, Lithuania, 54.2347, 23.5167 Butalangu, Uganda, 0.8228, 32.2428 Neiafu, Tonga, -18.6508, -173.9831 Vitim, Russia, 59.4515, 112.5578 P'ungsan, Korea, North, 40.8175, 128.1553 Esperanza, Mexico, 27.5800, -109.9298 Kondopoga, Russia, 62.2000, 34.2833 Plandiste, Serbia, 45.2269, 21.1217 Sicasica, Bolivia, -17.3333, -67.7333 Vergara, Uruguay, -32.9500, -53.9333 Miklavz na Dravskem Polju, Slovenia, 46.5058, 15.6972 Decan, Kosovo, 42.5378, 20.2911 Piran, Slovenia, 45.5283, 13.5683 Agdam, Azerbaijan, 39.9833, 46.9167 Teseney, Eritrea, 15.1100, 36.6575 Erseke, Albania, 40.3333, 20.6833 Ulaan-Uul, Mongolia, 44.3337, 111.2333 Cherskiy, Russia, 68.7501, 161.3300 Grand Turk, Turks and Caicos Islands, 21.4590, -71.1390 Padilla, Bolivia, -19.3000, -64.3000 Lavumisa, Eswatini, -27.2962, 31.9000 Sempeter pri Gorici, Slovenia, 45.9284, 13.6378 Massenya, Chad, 11.4000, 16.1667 Palana, Russia, 59.0840, 159.9500 Trzic, Slovenia, 46.3581, 14.2930 Ziri, Slovenia, 46.0469, 14.1097 Pembroke, Malta, 35.9264, 14.4808 Makedonski Brod, North Macedonia, 41.5133, 21.2153 Katanning, Australia, -33.6908, 117.5553 Imgarr, Malta, 35.9197, 14.3664 Zyryanka, Russia, 65.7360, 150.8900 Cankuzo, Burundi, -3.2194, 30.5528 De-Kastri, Russia, 51.4666, 140.7833 Tessalit, Mali, 20.2011, 1.0125 Ribnica, Slovenia, 45.7400, 14.7308 Dingli, Malta, 35.8603, 14.3814 Puke, Albania, 42.0500, 19.9000 Sao Joao dos Angolares, Sao Tome and Principe, 0.1333, 6.6500 Mojkovac, Montenegro, 42.9600, 19.5800 Janjanbureh, Gambia, The, 13.5341, -14.7662 Usakos, Namibia, -22.0000, 15.6000 Lismore, Australia, -28.8167, 153.2833 Villa Ygatimi, Paraguay, -24.0796, -55.5000 Domagnano, San Marino, 43.9500, 12.4667 Igarka, Russia, 67.4667, 86.5833 Merimbula, Australia, -36.8981, 149.9011 Marsaxlokk, Malta, 35.8417, 14.5447 Kirkenes, Norway, 69.7271, 30.0451 Tolmin, Slovenia, 46.1857, 13.7352 Ceduna, Australia, -32.1167, 133.6667 Port Douglas, Australia, -16.4834, 145.4652 Mongar, Bhutan, 27.2750, 91.2400 Ligonha, Mozambique, -15.1757, 37.7400 Paita, Peru, -5.0911, -81.1064 Kirakira, Solomon Islands, -10.4544, 161.9205 La Paloma, Uruguay, -34.6500, -54.1667 Wallaroo, Australia, -33.9167, 137.6167 Teeli, Russia, 51.0086, 90.2092 Proserpine, Australia, -20.4016, 148.5808 Uspallata, Argentina, -32.5667, -69.3167 Alibunar, Serbia, 45.0808, 20.9658 Cantemir, Moldova, 46.2781, 28.2008 Nonthaburi, Thailand, 13.8667, 100.5167 Darregueira, Argentina, -37.6996, -63.1666 Kaberamaido, Uganda, 1.7667, 33.1522 Malisheve, Kosovo, 42.4822, 20.7458 Trancas, Argentina, -26.2172, -65.2831 Zhigansk, Russia, 66.7667, 123.3833 Bukachacha, Russia, 52.9833, 116.9166 Ugol'nyye Kopi, Russia, 64.7333, 177.7000 Lukulu, Zambia, -14.4083, 23.2667 Fish Town, Liberia, 5.1964, -7.8756 Turangi, New Zealand, -38.9890, 175.8100 Imqabba, Malta, 35.8442, 14.4669 Xewkija, Malta, 36.0331, 14.2583 Weipa, Australia, -12.6300, 141.8786 Lasko, Slovenia, 46.1563, 15.2386 Pofadder, South Africa, -29.1286, 19.3947 Lenart v Slovenskih Goricah, Slovenia, 46.5755, 15.8306 Smithton, Australia, -40.8417, 145.1250 Demir Kapija, North Macedonia, 41.4114, 22.2422 The Valley, Anguilla, 18.2208, -63.0517 Rietavas, Lithuania, 55.7167, 21.9333 Ljutomer, Slovenia, 46.5208, 16.1975 Jurado, Colombia, 7.1114, -77.7714 Metlika, Slovenia, 45.6517, 15.3200 Rorvik, Norway, 64.8680, 11.2053 Ankaran, Slovenia, 45.5793, 13.7379 Brezovica, Slovenia, 46.0207, 14.4178 Ghajnsielem, Malta, 36.0269, 14.2903 Sinnamary, French Guiana, 5.3800, -52.9600 Mezica, Slovenia, 46.5206, 14.8536 Kirs, Russia, 59.3500, 52.2500 Evinayong, Equatorial Guinea, 1.4500, 10.5667 Clare, Australia, -33.8333, 138.6000 Kardla, Estonia, 58.9981, 22.7467 Saulkrasti, Latvia, 57.2636, 24.4164 Heredia, Costa Rica, 9.9985, -84.1169 Brandfort, South Africa, -28.7014, 26.4589 Ocnita, Moldova, 48.3853, 27.4392 Fuzuli, Azerbaijan, 39.6003, 47.1431 Kudahuvadhoo, Maldives, 2.6711, 72.8935 Iklin, Malta, 35.9042, 14.4544 Colonia, Micronesia, Federated States of, 9.5167, 138.1333 Sencur, Slovenia, 46.2430, 14.4181 Srednekolymsk, Russia, 67.4667, 153.7167 Khatanga, Russia, 71.9797, 102.4728 Golubovci, Montenegro, 42.3344, 19.2253 Birstonas, Lithuania, 54.6000, 24.0333 Dravograd, Slovenia, 46.5903, 15.0236 Gornja Radgona, Slovenia, 46.6810, 15.9883 Ainaro, Timor-Leste, -8.9969, 125.5050 Lija, Malta, 35.9014, 14.4472 Aasiaat, Greenland, 68.7097, -52.8694 Zelezniki, Slovenia, 46.2182, 14.1592 Mopipi, Botswana, -21.1833, 24.8833 Ust'-Maya, Russia, 60.4566, 134.5433 Porto Ingles, Cabo Verde, 15.1375, -23.2083 Arroyos y Esteros, Paraguay, -25.0500, -57.0900 Qaqortoq, Greenland, 60.7222, -46.0403 Tearce, North Macedonia, 42.0775, 21.0519 Trashigang, Bhutan, 27.3326, 91.5528 Skofljica, Slovenia, 45.9836, 14.5761 Abai, Paraguay, -26.0296, -55.9400 Taoudenni, Mali, 22.6666, -3.9834 Kalkara, Malta, 35.8892, 14.5294 San Lorenzo, Bolivia, -21.4167, -64.7494 Lethem, Guyana, 3.3833, -59.8000 Tifariti, Morocco, 26.1580, -10.5670 Mahibadhoo, Maldives, 3.7575, 72.9686 Gudja, Malta, 35.8483, 14.5025 Bir Anzarane, Morocco, 23.8918, -14.5364 Al Jaghbub, Libya, 29.7504, 24.5166 Zebbug, Malta, 36.0708, 14.2369 Lendava, Slovenia, 46.5662, 16.4499 Bogdanci, North Macedonia, 41.2031, 22.5728 Ribeira Grande, Cabo Verde, 17.1830, -25.0650 Rogasovci, Slovenia, 46.8000, 16.0333 Sostanj, Slovenia, 46.3798, 15.0482 Zrece, Slovenia, 46.3750, 15.3853 Sowa Town, Botswana, -20.5636, 26.2244 Bopolu, Liberia, 7.0667, -10.4875 Hokitika, New Zealand, -42.7167, 170.9667 Nautla, Mexico, 20.2167, -96.7833 Tom Price, Australia, -22.6939, 117.7950 Radlje ob Dravi, Slovenia, 46.6152, 15.2264 Bordertown, Australia, -36.3118, 140.7702 Villalonga, Argentina, -39.8829, -62.5833 Mezen, Russia, 65.8439, 44.2464 Mangbwalu, Congo (Kinshasa), 1.9352, 30.0462 Sao Domingos, Cabo Verde, 15.0250, -23.5625 Groningen, Suriname, 5.8000, -55.4667 Buala, Solomon Islands, -8.1448, 159.5905 Entre Rios, Bolivia, -21.5264, -64.1733 Rio Mayo, Argentina, -45.6869, -70.2600 Cochrane, Chile, -47.2547, -72.5750 Senglea, Malta, 35.8878, 14.5169 Gharghur, Malta, 35.9241, 14.4534 Qrendi, Malta, 35.8342, 14.4589 Kerewan, Gambia, The, 13.5000, -16.0833 Hlatikulu, Eswatini, -27.0000, 31.4167 Saint-Georges, French Guiana, 3.9105, -51.8100 Longreach, Australia, -23.4422, 144.2491 Trashi Yangtse, Bhutan, 27.5833, 91.4667 Barclayville, Liberia, 4.6797, -8.2339 Kolasin, Montenegro, 42.8236, 19.5225 Vila Velha, Brazil, 3.2167, -51.2167 Urubamba, Peru, -13.3042, -72.1167 Trongsa, Bhutan, 27.4994, 90.5047 Race, Slovenia, 46.4519, 15.6814 Borovnica, Slovenia, 45.9197, 14.3572 Eydhafushi, Maldives, 5.1038, 73.0704 Triesenberg, Liechtenstein, 47.1181, 9.5433 Vittoriosa, Malta, 35.8881, 14.5225 Rodeo, Argentina, -30.2164, -69.1394 Isafjordhur, Iceland, 66.0758, -23.1267 Santo Antonio, Sao Tome and Principe, 1.6367, 7.4178 Donegal, Ireland, 54.6500, -8.1170 Saudharkrokur, Iceland, 65.7461, -19.6394 Tofol, Micronesia, Federated States of, 5.3258, 163.0086 Cestos City, Liberia, 5.4667, -9.5833 Saranpaul, Russia, 64.2600, 60.9083 Chumbicha, Argentina, -28.8667, -66.2333 Egilsstadhir, Iceland, 65.2667, -14.4000 Imtarfa, Malta, 35.8908, 14.3969 Mkokotoni, Tanzania, -5.8800, 39.2731 Mahdia, Guyana, 5.2825, -59.1500 Kllokot, Kosovo, 42.3714, 21.3744 Rosoman, North Macedonia, 41.5161, 21.9497 Charleville, Australia, -26.4016, 146.2383 Fiorentino, San Marino, 43.9106, 12.4556 Provideniya, Russia, 64.4235, -173.2258 Baltasar Brum, Uruguay, -30.7167, -57.3333 Cloncurry, Australia, -20.7047, 140.5053 Exmouth, Australia, -21.9331, 114.1281 Chokurdakh, Russia, 70.6183, 147.8946 Nauta, Peru, -4.5083, -73.5833 Mariscal Jose Felix Estigarribia, Paraguay, -22.0300, -60.6100 Capitol Hill, Northern Mariana Islands, 15.2137, 145.7546 Brokopondo, Suriname, 5.0667, -54.9667 Vojnik, Slovenia, 46.2933, 15.3052 Aigua, Uruguay, -34.2000, -54.7500 Tarabuco, Bolivia, -19.1667, -64.9167 Quime, Bolivia, -16.9817, -67.2167 Severo-Kuril'sk, Russia, 50.6667, 156.1167 Olenek, Russia, 68.5000, 112.4667 Demir Hisar, North Macedonia, 41.2208, 21.2031 Beltinci, Slovenia, 46.6060, 16.2328 Al `Alamayn, Egypt, 30.8333, 28.9500 Nizhneudinsk, Russia, 54.9333, 99.0000 Hofn, Iceland, 64.2500, -15.2167 Jaque, Panama, 7.5190, -78.1660 Nida, Lithuania, 55.3033, 21.0056 Merredin, Australia, -31.4820, 118.2790 El Dorado, Venezuela, 6.7167, -61.6167 Karungu, Kenya, -0.8496, 34.1500 Paro, Bhutan, 27.4333, 89.4167 Vevcani, North Macedonia, 41.2403, 20.5931 Polzela, Slovenia, 46.2809, 15.0740 Saskylakh, Russia, 71.9653, 114.0922 Bloemhof, South Africa, -27.6500, 25.5900 Sohano, Papua New Guinea, -5.4297, 154.6711 Zhemgang, Bhutan, 27.2134, 90.6550 Boffa, Guinea, 10.1850, -14.0430 Coroico, Bolivia, -16.1833, -67.7333 Gustavia, Saint Barthelemy, 17.8979, -62.8506 Ypejhu, Paraguay, -23.9100, -55.4600 Ruggell, Liechtenstein, 47.2433, 9.5300 Tolten, Chile, -39.2166, -73.2123 Muta, Slovenia, 46.6167, 15.1667 Sveta Ana, Slovenia, 46.6492, 15.8442 Lehututu, Botswana, -23.9169, 21.8264 Qala, Malta, 36.0353, 14.3103 Sahbuz, Azerbaijan, 39.4073, 45.5733 Store, Slovenia, 46.2219, 15.3111 Te Anau, New Zealand, -45.4150, 167.7160 Egvekinot, Russia, 66.3221, -179.1837 Ig, Slovenia, 45.9692, 14.5394 Roura, French Guiana, 4.7300, -52.3300 Maradah, Libya, 29.2337, 19.2166 Onverwacht, Suriname, 5.5931, -55.1939 Gradsko, North Macedonia, 41.5775, 21.9428 Desaguadero, Peru, -16.5667, -69.0333 Sorata, Bolivia, -15.7733, -68.6481 Mwenga, Congo (Kinshasa), -3.0382, 28.4325 El Manteco, Venezuela, 7.3504, -62.5333 Stanley, Falkland Islands (Islas Malvinas), -51.7000, -57.8500 Kaikoura, New Zealand, -42.4000, 173.6814 Floriana, Malta, 35.8933, 14.5058 Ivancna Gorica, Slovenia, 45.9374, 14.8029 Jose Batlle y Ordonez, Uruguay, -33.4667, -55.1500 Crna na Koroskem, Slovenia, 46.4697, 14.8490 Puerto Villamil, Ecuador, -0.9568, -90.9672 Kirkop, Malta, 35.8419, 14.4850 Lacin, Azerbaijan, 39.6408, 46.5469 Borgarnes, Iceland, 64.5333, -21.9167 Radenci, Slovenia, 46.6472, 16.0442 Vianden, Luxembourg, 49.9000, 6.2000 Totness, Suriname, 5.8775, -56.3292 Cidade Velha, Cabo Verde, 14.9167, -23.6042 Acquaviva, San Marino, 43.9457, 12.4185 Pozo Colorado, Paraguay, -23.4300, -58.8600 Krasnogorsk, Russia, 48.4172, 142.0869 Baures, Bolivia, -13.6556, -63.6958 Safi, Malta, 35.8333, 14.4850 Apolo, Bolivia, -14.7200, -68.5039 Sannat, Malta, 36.0244, 14.2458 Spodnje Hoce, Slovenia, 46.5000, 15.6500 Funadhoo, Maldives, 6.1482, 73.2900 Vipava, Slovenia, 45.8476, 13.9624 Same, Timor-Leste, -9.0042, 125.6486 Pivka, Slovenia, 45.6833, 14.2000 Omboue, Gabon, -1.5662, 9.2500 Mozirje, Slovenia, 46.3381, 14.9572 Manadhoo, Maldives, 5.7628, 73.4106 Evensk, Russia, 61.9500, 159.2333 Pukekohe East, New Zealand, -37.1950, 174.9481 Waitakere, New Zealand, -36.8490, 174.5430 Semic, Slovenia, 45.6546, 15.1783 Ambrolauri, Georgia, 42.5194, 43.1500 Damongo, Ghana, 9.0830, -1.8188 Konza, Kenya, -1.7496, 37.1200 Altata, Mexico, 24.6333, -107.9167 Heydarabad, Azerbaijan, 39.7229, 44.8485 Djibloho, Equatorial Guinea, 1.5889, 10.8225 Sofifi, Indonesia, 0.7244, 127.5806 Zheleznogorsk-Ilimskiy, Russia, 56.5833, 104.1333 Afega, Samoa, -13.8019, -171.8217 Radece, Slovenia, 46.0658, 15.1728 Valandovo, North Macedonia, 41.3169, 22.5611 Lovrenc na Pohorju, Slovenia, 46.5381, 15.3844 Capellen, Luxembourg, 49.6444, 5.9897 Tasiilaq, Greenland, 65.6136, -37.6311 Scottsdale, Australia, -41.1611, 147.5164 Ormoz, Slovenia, 46.4071, 16.1505 Katwe, Uganda, -0.1296, 29.9200 Straza, Slovenia, 45.7864, 15.0745 Kercem, Malta, 36.0406, 14.2297 Zabljak, Montenegro, 43.1550, 19.1208 Abuna, Brazil, -9.6954, -65.3597 Amudat, Uganda, 1.9522, 34.9444 Mount Barker, Australia, -34.6300, 117.6669 Philipsburg, Sint Maarten, 18.0237, -63.0458 Maitland, Australia, -32.7167, 151.5500 Taedong, Korea, North, 40.6171, 125.4501 Krivogastani, North Macedonia, 41.3358, 21.3331 Mislinja, Slovenia, 46.4431, 15.1931 Beringovskiy, Russia, 63.0655, 179.3067 Novyy Port, Russia, 67.6919, 72.8964 Balakan, Azerbaijan, 41.7186, 46.4165 Bagdarin, Russia, 54.4444, 113.5861 Ta' Xbiex, Malta, 35.8992, 14.4981 Naklo, Slovenia, 46.2749, 14.3176 Queenstown, Australia, -42.0806, 145.5556 Bohinjska Bistrica, Slovenia, 46.2742, 13.9524 Nokaneng, Botswana, -19.6639, 22.1917 Smarje, Slovenia, 46.2272, 15.5192 Longyearbyen, Svalbard, 78.2167, 15.6333 Nasir, South Sudan, 8.6004, 33.0666 Partesh, Kosovo, 42.4019, 21.4336 Divaca, Slovenia, 45.6820, 13.9702 Xghajra, Malta, 35.8864, 14.5472 Zeya, Russia, 53.7333, 127.2500 Cerklje na Gorenjskem, Slovenia, 46.2488, 14.4855 Vodice, Slovenia, 46.1897, 14.4944 Joao Teves, Cabo Verde, 15.0667, -23.5917 Spodnji Duplek, Slovenia, 46.5031, 15.7453 Pehcevo, North Macedonia, 41.7592, 22.8906 Ropazi, Latvia, 56.9718, 24.6318 Gusinje, Montenegro, 42.5619, 19.8339 Tabor, Slovenia, 46.2225, 15.0081 Gamprin, Liechtenstein, 47.2167, 9.5000 Varaklani, Latvia, 56.6078, 26.7550 Parun, Afghanistan, 35.4167, 70.9169 Puerto Williams, Chile, -54.9333, -67.6167 Cuevo, Bolivia, -20.4500, -63.5167 Capitan Pablo Lagerenza, Paraguay, -19.9161, -60.7833 Odranci, Slovenia, 46.5833, 16.2833 Lifford, Ireland, 54.8356, -7.4779 Prebold, Slovenia, 46.2369, 15.0919 Flying Fish Cove, Christmas Island, -10.4261, 105.6728 Zgornja Kungota, Slovenia, 46.6392, 15.6156 Xizi, Azerbaijan, 40.9111, 49.0694 Bovec, Slovenia, 46.3378, 13.5522 Plasnica, North Macedonia, 41.4667, 21.1167 Chiradzulu, Malawi, -15.6746, 35.1407 Alto Rio Senguer, Argentina, -45.0167, -70.8167 Sierra Colorada, Argentina, -40.5833, -67.8000 Rogatec, Slovenia, 46.2294, 15.7003 Gharb, Malta, 36.0611, 14.2092 Iracoubo, French Guiana, 5.4804, -53.2200 Bourke, Australia, -30.0817, 145.9511 Zrnovci, North Macedonia, 41.8542, 22.4442 Oktyabr'skiy, Russia, 52.6636, 156.2387 Kipili, Tanzania, -7.4329, 30.6000 Ungoofaaru, Maldives, 5.6681, 73.0306 Vuzenica, Slovenia, 46.5967, 15.1689 Ust'-Kuyga, Russia, 70.0171, 135.6000 Eldikan, Russia, 60.8000, 135.1833 Tumby Bay, Australia, -34.3667, 136.1000 Turnisce, Slovenia, 46.6278, 16.3203 Miren, Slovenia, 45.8962, 13.6072 Kyakhta, Russia, 50.3500, 106.4500 Alexander Bay, South Africa, -28.6083, 16.5033 Halls Creek, Australia, -18.2300, 127.6700 Tajarhi, Libya, 24.2622, 14.5603 Artemovsk, Russia, 54.3483, 93.4356 Lokwabe, Botswana, -24.0961, 21.7781 Clervaux, Luxembourg, 50.0500, 6.0333 Dragomer, Slovenia, 46.0189, 14.3820 Munxar, Malta, 36.0303, 14.2353 Kranjska Gora, Slovenia, 46.4854, 13.7871 Sentjernej, Slovenia, 45.8389, 15.3361 Peterborough, Australia, -32.9667, 138.8333 Cerkno, Slovenia, 46.1278, 13.9875 Oplotnica, Slovenia, 46.3860, 15.4458 Machinga, Malawi, -14.9667, 35.5167 Port Denison, Australia, -29.2750, 114.9194 Tsau, Botswana, -20.1650, 22.4544 Uummannaq, Greenland, 70.6747, -52.1264 Xocali, Azerbaijan, 39.9131, 46.7903 Smartno, Slovenia, 46.0441, 14.8466 Tuapse, Russia, 44.1044, 39.0772 Penola, Australia, -37.3786, 140.8362 Mirna, Slovenia, 45.9476, 15.0664 Nakhodka, Russia, 67.7206, 77.6617 Selnica ob Dravi, Slovenia, 46.5500, 15.4950 Kingston South East, Australia, -36.8167, 139.8500 Nyimba, Zambia, -14.5495, 30.8100 Veymandoo, Maldives, 2.1881, 73.0947 Lubutu, Congo (Kinshasa), -0.7431, 26.5833 Wagin, Australia, -33.3167, 117.3500 Fulacunda, Guinea-Bissau, 11.7756, -15.1822 Paamiut, Greenland, 61.9944, -49.6667 Bala Cangamba, Angola, -13.6833, 19.8667 Greytown, Nicaragua, 10.9167, -83.7000 Novaci, North Macedonia, 41.0419, 21.4561 Bosilovo, North Macedonia, 41.4406, 22.7278 Kalbarri, Australia, -27.7100, 114.1600 Safotu, Samoa, -13.4528, -172.4036 Villa Rumipal, Argentina, -32.1879, -64.4803 Dornava, Slovenia, 46.4367, 15.9536 Mogila, North Macedonia, 41.1083, 21.3786 Kidricevo, Slovenia, 46.4036, 15.7911 Katherine, Australia, -14.4667, 132.2667 Mabaruma, Guyana, 8.2000, -59.7833 Tulagi, Solomon Islands, -9.1031, 160.1506 Novo Selo, North Macedonia, 41.4128, 22.8800 Barcaldine, Australia, -23.5555, 145.2888 Villa Martin Colchak, Bolivia, -20.7406, -67.6606 Ubombo, South Africa, -27.5667, 32.0833 Regedor Quissico, Mozambique, -24.7257, 34.7660 Celeken, Turkmenistan, 39.4362, 53.1226 Isangel, Vanuatu, -19.5300, 169.2800 Buluko, Congo (Kinshasa), -0.7570, 28.5280 Kazachye, Russia, 70.7522, 136.2342 Pombas, Cabo Verde, 17.1490, -25.0150 Leulumoega, Samoa, -13.8167, -171.9167 Faetano, San Marino, 43.9256, 12.4983 Horjul, Slovenia, 46.0230, 14.2981 Agdam, Azerbaijan, 40.9053, 45.5564 Crensovci, Slovenia, 46.5744, 16.2906 Daga, Bhutan, 27.0667, 89.8833 Los Blancos, Argentina, -23.6000, -62.6000 Picos, Cabo Verde, 15.0833, -23.6333 Chiesanuova, San Marino, 43.9045, 12.4208 Kanal, Slovenia, 46.0880, 13.6347 Asau, Samoa, -13.5194, -172.6372 Gorenja Vas, Slovenia, 46.1069, 14.1451 Bikin, Russia, 46.8167, 134.2667 Puerto Acosta, Bolivia, -15.5333, -69.2500 Mirbat, Oman, 16.9924, 54.6918 Nacunday, Paraguay, -26.0200, -54.7699 Poljcane, Slovenia, 46.3119, 15.5792 Dikson, Russia, 73.5070, 80.5451 Pluzine, Montenegro, 43.1500, 18.8300 Sixaola, Costa Rica, 9.5579, -82.6698 Ljubno, Slovenia, 46.3333, 14.8333 Susques, Argentina, -23.4167, -66.4833 Upernavik, Greenland, 72.7869, -56.1472 Innisfail, Australia, -17.5238, 146.0311 Schellenberg, Liechtenstein, 47.2336, 9.5481 Klyuchi, Russia, 56.3167, 160.8333 Kobarid, Slovenia, 46.2464, 13.5780 Qasigiannguit, Greenland, 68.8201, -51.1932 Benedikt, Slovenia, 46.6086, 15.8883 Kurtamysh, Russia, 54.9167, 64.4333 Mazatan, Mexico, 29.0167, -110.1333 Hagta, Guam, 13.4745, 144.7504 Fulin, China, 29.3500, 102.7167 Andrijevica, Montenegro, 42.7300, 19.7900 Oranjestad, Bonaire, Sint Eustatius, and Saba, 17.4833, -62.9833 Mata-Utu, Wallis and Futuna, -13.2825, -176.1736 Ouyen, Australia, -35.0667, 142.3167 Gornji Grad, Slovenia, 46.2961, 14.8052 Mirna Pec, Slovenia, 45.8580, 15.0876 Hughenden, Australia, -20.8438, 144.1986 Chernogorsk, Russia, 53.8167, 91.3000 Haya, Sudan, 18.3461, 36.3969 Cowell, Australia, -33.6833, 136.9167 Yelimane, Mali, 15.1337, -10.5666 Sredisce ob Dravi, Slovenia, 46.3942, 16.2681 General Eugenio A. Garay, Paraguay, -20.5200, -62.2100 Streaky Bay, Australia, -32.7990, 134.2048 Montegiardino, San Marino, 43.9089, 12.4844 Moravce, Slovenia, 46.1356, 14.7439 Principe da Beira, Brazil, -12.4167, -64.4166 Lufilufi, Samoa, -13.8500, -171.5833 Dobrovnik, Slovenia, 46.6514, 16.3525 Daraj, Libya, 30.1500, 10.4500 Fontana, Malta, 36.0364, 14.2422 Dobrova, Slovenia, 46.0533, 14.4144 Konce, North Macedonia, 41.4958, 22.3825 Shamva, Zimbabwe, -17.3167, 31.5500 Laverton, Australia, -28.6278, 122.4031 Uad Damran, Morocco, 27.4181, -12.9842 Kirensk, Russia, 57.7833, 108.0833 Verzej, Slovenia, 46.5836, 16.1653 Komenda, Slovenia, 46.2073, 14.5390 Oblesevo, North Macedonia, 41.8833, 22.3339 Dolenjske Toplice, Slovenia, 45.7545, 15.0583 Nazarje, Slovenia, 46.3202, 14.9531 Rostusa, North Macedonia, 41.6100, 20.6000 Hoskins, Papua New Guinea, -5.4746, 150.4100 Velika Polana, Slovenia, 46.5719, 16.3469 Luanza, Congo (Kinshasa), -8.6996, 28.7000 Meningie, Australia, -35.6883, 139.3378 Vitanje, Slovenia, 46.3825, 15.2956 Winton, Australia, -22.3913, 143.0381 Gorisnica, Slovenia, 46.4147, 16.0139 Hamilton, Bermuda, 32.2942, -64.7819 Yulara, Australia, -25.2069, 130.9710 Gingin, Australia, -31.3400, 115.9100 Jegunovce, North Macedonia, 42.0731, 21.1231 Ozurgeti, Georgia, 41.9230, 42.0050 Pesnica, Slovenia, 46.6069, 15.6767 Sodrazica, Slovenia, 45.7616, 14.6363 Godhavn, Greenland, 69.2472, -53.5333 Vyazemskiy, Russia, 47.5250, 134.7572 Stari Trg, Slovenia, 45.7142, 14.4695 Preddvor, Slovenia, 46.3052, 14.4203 Vatican City, Vatican City, 41.9040, 12.4530 Charana, Bolivia, -17.5919, -69.4456 Shadrinsk, Russia, 56.1333, 63.6500 Onslow, Australia, -21.6400, 115.1100 Lavrentiya, Russia, 65.5842, -170.9889 Zgornja Hajdina, Slovenia, 46.4061, 15.8386 Yaren, Nauru, -0.5456, 166.9250 Bicheno, Australia, -41.8667, 148.2833 Vailoa, Samoa, -13.7558, -172.3064 Verkhoyansk, Russia, 67.5500, 133.3833 Muhembo, Botswana, -18.2996, 21.8000 Starse, Slovenia, 46.4658, 15.7672 Sveta Trojica v Slovenskih Goricah, Slovenia, 46.5767, 15.8769 Moravske-Toplice, Slovenia, 46.6875, 16.2256 San Lawrenz, Malta, 36.0550, 14.2042 Wyndham, Australia, -15.4825, 128.1228 Yerema, Russia, 60.3808, 107.7794 Rankovce, North Macedonia, 42.1719, 22.1167 Comallo, Argentina, -41.0333, -70.2667 Velike Lasce, Slovenia, 45.8363, 14.6377 Jamestown, Saint Helena, Ascension, and Tristan da Cunha, -15.9251, -5.7179 Hvalba, Faroe Islands, 61.6000, -6.9556 Zhilinda, Russia, 70.1333, 113.9833 Satadougou, Mali, 12.6170, -11.4066 Lakatoro, Vanuatu, -16.1069, 167.4208 Roebourne, Australia, -20.7667, 117.1500 Mokronog, Slovenia, 45.9426, 15.1490 Zhaltyr, Kazakhstan, 51.6324, 69.8328 Sopiste, North Macedonia, 41.9500, 21.4333 Kostanjevica na Krki, Slovenia, 45.8463, 15.4249 Pannawonica, Australia, -21.6333, 116.3333 Linxi, China, 43.5171, 118.0333 Ituni, Guyana, 5.5333, -58.2500 Meekatharra, Australia, -26.5936, 118.4953 Qubadli, Azerbaijan, 39.3439, 46.5797 Manily, Russia, 62.4908, 165.3298 Leonora, Australia, -28.8845, 121.3308 Gawler, Australia, -34.5981, 138.7450 Massangena, Mozambique, -21.5373, 32.9564 Qaanaaq, Greenland, 77.4667, -69.2306 Komen, Slovenia, 45.8159, 13.7507 Puerto Limon, Costa Rica, 10.0022, -83.0840 Smartno, Slovenia, 46.3297, 15.0325 Kozje, Slovenia, 46.0750, 15.5603 Puconci, Slovenia, 46.7067, 16.1564 Vasilevo, North Macedonia, 41.4758, 22.6417 Calatrava, Equatorial Guinea, 1.1164, 9.4186 Tiyerbes, Russia, 64.3728, 120.5494 Grad, Slovenia, 46.8000, 16.1000 Omolon, Russia, 65.2667, 160.4667 Tigoa, Solomon Islands, -11.5531, 160.0647 Villa O'Higgins, Chile, -48.4683, -72.5600 Kimba, Australia, -33.1396, 136.4191 Majsperk, Slovenia, 46.3517, 15.7336 Dibaya, Congo (Kinshasa), -6.5095, 22.8700 Gastre, Argentina, -42.2667, -69.2167 Panda, Mozambique, -24.0629, 34.7303 Kalbacar, Azerbaijan, 40.1098, 46.0445 Saleaula, Samoa, -13.4501, -172.3335 Alofi, Niue, -19.0560, -169.9210 Videm, Slovenia, 45.8484, 14.6944 Podcetrtek, Slovenia, 46.1569, 15.5986 Karbinci, North Macedonia, 41.8167, 22.2375 Sabaya, Bolivia, -19.0147, -68.3708 Ust'-Nyukzha, Russia, 56.5500, 121.6000 Oatlands, Australia, -42.3000, 147.3706 Zgornje Jezersko, Slovenia, 46.3951, 14.4966 Chiramba, Mozambique, -16.8921, 34.6559 Norseman, Australia, -32.1961, 121.7781 Llica, Bolivia, -19.8500, -68.2500 Lata, Solomon Islands, -10.7380, 165.8567 Obluchye, Russia, 49.0167, 131.0500 Mereeg, Somalia, 3.7666, 47.3000 Telsen, Argentina, -42.3833, -66.9500 Apace, Slovenia, 46.6972, 15.9106 Kobilje, Slovenia, 46.6847, 16.3978 Wilcannia, Australia, -31.5569, 143.3792 Dobrna, Slovenia, 46.3381, 15.2293 Zgornje Gorje, Slovenia, 46.3801, 14.0684 Calenga, Angola, -11.3196, 16.2000 Quilpie, Australia, -26.6161, 144.2675 Southern Cross, Australia, -31.2306, 119.3278 Lozovo, North Macedonia, 41.7817, 21.9025 Recica, Slovenia, 46.3247, 14.9228 Caluula, Somalia, 11.9670, 50.7500 Tournavista, Peru, -8.9322, -74.7052 Felidhoo, Maldives, 3.4717, 73.5472 Tchitado, Angola, -17.3167, 13.9167 Yakossi, Central African Republic, 5.6170, 23.3167 Tmassah, Libya, 26.3667, 15.8000 Puerto Pinasco, Paraguay, -22.6400, -57.7900 Oymyakon, Russia, 63.4608, 142.7858 Krizevci, Slovenia, 46.5683, 16.1386 Markovci, Slovenia, 46.3833, 15.9500 Staro Nagoricane, North Macedonia, 42.2000, 21.8300 Smarjeske Toplice, Slovenia, 45.8622, 15.2214 Karumba, Australia, -17.4838, 140.8397 Planken, Liechtenstein, 47.1833, 9.5333 Kempsey, Australia, -31.0833, 152.8333 Mount Magnet, Australia, -28.0600, 117.8461 Vreed-en-Hoop, Guyana, 6.8076, -58.1815 The Bottom, Bonaire, Sint Eustatius, and Saba, 17.6261, -63.2492 Richmond, Australia, -20.7305, 143.1425 Kullorsuaq, Greenland, 74.5792, -57.2181 Bangar, Brunei, 4.7086, 115.0739 Cirkulane, Slovenia, 46.3453, 15.9952 Videm pri Ptuju, Slovenia, 46.3686, 15.9064 Woomera, Australia, -31.1496, 136.8000 Brvenica, North Macedonia, 41.9672, 20.9808 Dhuusamarreeb, Somalia, 5.5375, 46.3875 Skopun, Faroe Islands, 61.9125, -6.8719 Morawa, Australia, -29.2111, 116.0089 Theodore, Australia, -24.9472, 150.0755 Lukovica, Slovenia, 46.1686, 14.6892 Crna Trava, Serbia, 42.8101, 22.2990 Kuzma, Slovenia, 46.8369, 16.0833 Eidsvold, Australia, -25.3719, 151.1230 Ghasri, Malta, 36.0583, 14.2278 Buabidi, Panama, 8.4667, -81.7000 Cankova, Slovenia, 46.7208, 16.0225 Hvannasund, Faroe Islands, 62.2833, -6.5167 Tsavo, Kenya, -2.9828, 38.4666 Sherlovaya Gora, Russia, 50.5306, 116.3006 Gornji Petrovci, Slovenia, 46.8053, 16.2225 Tisina, Slovenia, 46.6556, 16.0933 Ribnica, Slovenia, 46.5372, 15.2733 Luce, Slovenia, 46.3565, 14.7436 Tandil, Argentina, -37.3167, -59.1333 Nizhneyansk, Russia, 71.4333, 136.0666 Espungabera, Mozambique, -20.4531, 32.7725 Salovci, Slovenia, 46.8250, 16.2981 Brades, Montserrat, 16.7928, -62.2106 Jursinci, Slovenia, 46.4847, 15.9714 Toconao, Chile, -23.1903, -68.0050 Podlehnik, Slovenia, 46.3353, 15.8800 Braslovce, Slovenia, 46.2884, 15.0386 Trnovska Vas, Slovenia, 46.5167, 15.9000 Rinconada, Argentina, -22.4333, -66.1667 Savnik, Montenegro, 42.9500, 19.1000 Jurovski Dol, Slovenia, 46.6064, 15.7847 Three Springs, Australia, -29.5333, 115.7617 Centar Zupa, North Macedonia, 41.4775, 20.5578 Hrib-Loski Potok, Slovenia, 45.7015, 14.5901 Ravensthorpe, Australia, -33.5817, 120.0469 Scoresbysund, Greenland, 70.4853, -21.9667 Kingston, Norfolk Island, -29.0606, 167.9619 Vitomarci, Slovenia, 46.5275, 15.9394 Burubaytal, Kazakhstan, 44.9350, 74.0180 Dobrovo, Slovenia, 45.9989, 13.5296 Leava, Wallis and Futuna, -14.2933, -178.1583 Pine Creek, Australia, -13.8235, 131.8262 Sentrupert, Slovenia, 45.9769, 15.0897 Basse-Terre, Guadeloupe, 16.0104, -61.7055 Umm al `Abid, Libya, 27.5170, 15.0333 Dolneni, North Macedonia, 41.4264, 21.4536 Araouane, Mali, 18.9000, -3.5299 Halfmoon Bay, New Zealand, -46.8990, 168.1270 Bugrino, Russia, 68.7831, 49.3036 Amursk, Russia, 50.2167, 136.9000 Shoyna, Russia, 67.8778, 44.1547 Buur Gaabo, Somalia, -1.2192, 41.8372 Podvelka, Slovenia, 46.5864, 15.3286 Cazombo, Angola, -11.9000, 22.9000 Put' Lenina, Russia, 68.5166, 107.8000 Porkeri, Faroe Islands, 61.4814, -6.7458 Belcista, North Macedonia, 41.3028, 20.8303 Yaupi, Ecuador, -2.8379, -77.9357 Nova Vas, Slovenia, 45.7726, 14.5064 Imdina, Malta, 35.8858, 14.4031 Ikela, Congo (Kinshasa), -1.1833, 23.2667 Amderma, Russia, 69.7631, 61.6678 Hodos, Slovenia, 46.8233, 16.3342 Ust'-Kut, Russia, 56.7833, 105.6333 Dol, Slovenia, 46.0884, 14.6425 Cucer-Sandevo, North Macedonia, 42.0975, 21.3877 Zelenikovo, North Macedonia, 41.8867, 21.5869 Melekeok, Palau, 7.5006, 134.6241 Ngerulmud, Palau, 7.5006, 134.6242 Andamooka, Australia, -30.4485, 137.1651 Uelen, Russia, 66.1594, -169.8092 Tomaz pri Ormozu, Slovenia, 46.4842, 16.0836 Tasiusaq, Greenland, 73.3689, -56.0556 Adelaide River, Australia, -13.2378, 131.1047 Kulusuk, Greenland, 65.5753, -37.1833 Burketown, Australia, -17.7408, 139.5477 Bistrica ob Sotli, Slovenia, 46.0569, 15.6625 Skocjan, Slovenia, 45.9069, 15.2914 Kanyato, Tanzania, -4.4565, 30.2614 Amau, Papua New Guinea, -10.0426, 148.5650 Kairaki, New Zealand, -43.3850, 172.7030 Georgetown, Australia, -18.2922, 143.5480 Makole, Slovenia, 46.3172, 15.6672 Boulia, Australia, -22.9097, 139.9066 Turukhansk, Russia, 65.7970, 87.9680 Sveti Jurij, Slovenia, 46.5695, 16.0235 Carnarvon, Australia, -24.8672, 113.6611 Solcava, Slovenia, 46.4201, 14.6918 Waitangi, New Zealand, -43.9514, -176.5611 Thargomindah, Australia, -27.9922, 143.8197 Destrnik, Slovenia, 46.5006, 15.8750 Kraulshavn, Greenland, 74.1111, -57.0611 Tamworth, Australia, -31.0833, 150.9167 Ayan, Russia, 56.4583, 138.1681 Lusanga, Congo (Kinshasa), -5.5808, 16.5143 Port Pirie, Australia, -33.1858, 138.0169 Hurdiyo, Somalia, 10.5667, 51.1333 Androka, Madagascar, -25.0219, 44.0749 Sovetskaya Gavan', Russia, 48.9667, 140.2833 Cerkvenjak, Slovenia, 46.5706, 15.9436 Ivanhoe, Australia, -32.9164, 144.2994 Kotelnich, Russia, 58.3078, 48.3181 Al Qunaytirah, Syria, 33.1257, 35.8236 Camooweal, Australia, -19.9211, 138.1194 Nikolayevsk-na-Amure, Russia, 53.1333, 140.7333 Bafwasende, Congo (Kinshasa), 1.0103, 27.1617 Progress, Russia, 49.7504, 129.6167 Razkrizje, Slovenia, 46.5217, 16.2811 Buton, Indonesia, 4.2170, 108.2000 General Roca, Argentina, -39.0333, -67.5833 Bifoun, Gabon, -0.3329, 10.3832 Chumikan, Russia, 54.7000, 135.2833 Kangersuatsiaq, Greenland, 72.3797, -55.5500 Narsarsuaq, Greenland, 61.1458, -45.4347 Bedourie, Australia, -24.3594, 139.4691 Petrovec, North Macedonia, 41.9389, 21.6150 Mount Isa, Australia, -20.7261, 139.4939 Fort Wellington, Guyana, 6.4000, -57.6167 Dobje, Slovenia, 46.1369, 15.3945 Punta Prieta, Mexico, 28.9289, -114.1556 Birdsville, Australia, -25.8986, 139.3513 Star Dojran, North Macedonia, 41.1865, 22.7203 Zelino, North Macedonia, 41.9794, 21.0619 Windorah, Australia, -25.4205, 142.6544 Al `Uqaylah, Libya, 30.2558, 19.1994 Lemsid, Morocco, 26.5482, -13.8482 Mukhomornoye, Russia, 66.4171, 173.3333 Vorontsovo, Russia, 71.6983, 83.5642 Grytviken, South Georgia and South Sandwich Islands, -54.2806, -36.5080 Il'pyrskiy, Russia, 59.9600, 164.2000 Famjin, Faroe Islands, 61.5264, -6.8769 Osilnica, Slovenia, 45.5289, 14.6983 Enurmino, Russia, 66.9500, -171.8167 Piso Firme, Bolivia, -13.6830, -61.8666 Sovetsk, Russia, 57.5833, 48.9833 Chitre, Panama, 7.9667, -80.4333 Studenicani, North Macedonia, 41.9158, 21.5306 Pagegiai, Lithuania, 55.1333, 21.9167 Savissivik, Greenland, 76.0194, -65.1139 Adamstown, Pitcairn Islands, -25.0667, -130.0833 Samamea, Samoa, -13.9333, -171.5333 Rocafuerte, Peru, -0.9329, -75.4000 Bogovinje, North Macedonia, 41.9233, 20.9133 Cuya, Chile, -19.1597, -70.1794 Kovda, Russia, 66.6919, 32.8708 Korf, Russia, 60.3667, 166.0167 Ust'-Olenek, Russia, 72.9833, 119.8167 Vransko, Slovenia, 46.1720, 14.8217 Puerto Heath, Bolivia, -12.5022, -68.6500 Lagunas, Chile, -20.9829, -69.6833 Barnis, Egypt, 23.9460, 35.4842 Gamba, Gabon, -2.6500, 10.0000 Nord, Greenland, 81.7166, -17.8000 Timmiarmiut, Greenland, 62.5333, -42.2167 Zillah, Libya, 28.5504, 17.5834 Chegga, Mauritania, 25.3719, -5.7867 Djado, Niger, 21.0150, 12.3075 Gaigirgordub, Panama, 9.5583, -78.9483 Andoas, Peru, -2.9042, -76.4028 Puca Urco, Peru, -2.3328, -71.9167 Soldado Bartra, Peru, -2.5161, -75.7666 Gueppi, Peru, -0.1166, -75.2300 Matochkin Shar, Russia, 73.2700, 56.4497 Siglan, Russia, 59.0337, 152.4166 Omchak, Russia, 61.6333, 147.9167 Shalaurova, Russia, 73.2204, 143.1833 Khorgo, Russia, 73.4833, 113.6300 Peregrebnoye, Russia, 62.9670, 65.0859 Komsa, Russia, 61.8680, 89.2577 Gyda, Russia, 70.8814, 78.4661 Menkerya, Russia, 67.9886, 123.3505 Zvezdnyy, Russia, 70.9333, -179.6000 Pakhachi, Russia, 60.5816, 169.0500 Indiga, Russia, 67.6898, 49.0166 Starorybnoye, Russia, 72.7666, 104.8000 Laryak, Russia, 61.1012, 80.2514 Ulkan, Russia, 55.9004, 107.7833 Strelka, Russia, 61.8670, 152.2502 Chagda, Russia, 60.1000, 133.9000 Sagastyr, Russia, 73.3779, 126.5924 Zemlya Bunge, Russia, 74.8983, 142.1050 Trofimovsk, Russia, 72.5997, 127.0337 Tunguskhaya, Russia, 64.9004, 125.2500 Agapa, Russia, 71.4504, 89.2500 Podkamennaya Tunguska, Russia, 61.5995, 90.1236 Tukchi, Russia, 57.3670, 139.5000 Varnek, Russia, 69.7153, 60.0600 Numto, Russia, 63.6667, 71.3333 Bol'sheretsk, Russia, 52.4390, 156.3594 Utkholok, Russia, 57.5504, 157.2333 Yessey, Russia, 68.4652, 102.1887 Karamken, Russia, 60.2004, 151.1666 Kostel, Slovenia, 45.5088, 14.9100 Kingoonya, Australia, -30.9170, 135.3147 Sharan, Afghanistan, 33.1757, 68.7304 Nili, Afghanistan, 33.7218, 66.1302 Davaci, Azerbaijan, 41.2012, 48.9871 Sarur, Azerbaijan, 39.5544, 44.9826 Qabala, Azerbaijan, 40.9825, 47.8491 Saidpur, Bangladesh, 25.8004, 89.0000 Isale, Burundi, -3.3444, 29.4833 Dogbo, Benin, 6.8167, 1.7833 San Rafael, Bolivia, -16.7795, -60.6799 Natal, Brazil, -6.9838, -60.2699 Jaboatao, Brazil, -8.1803, -35.0014 Crato, Brazil, -7.4639, -63.0400 Iguacu, Brazil, -22.7400, -43.4700 Sarpang, Bhutan, 26.8639, 90.2674 Pemagatshel, Bhutan, 27.0375, 91.4039 Tsimasham, Bhutan, 27.0989, 89.5360 Gasa, Bhutan, 27.9167, 89.6833 Haa, Bhutan, 27.3825, 89.2850 Lhuentse, Bhutan, 27.6500, 91.1500 Tsirang, Bhutan, 27.0219, 90.1229 Loango, Congo (Brazzaville), -4.6561, 11.8114 Chuquicamata, Chile, -22.3169, -68.9301 Kaifeng Chengguanzhen, China, 34.8519, 114.3481 Shizuishan, China, 39.2333, 106.7690 Beidao, China, 34.6020, 105.9180 Panying, China, 33.0023, 112.5281 Jilin, China, 43.8519, 126.5481 Puqi, China, 29.7204, 113.8800 Xiping, China, 40.0820, 113.2981 Hangu, China, 39.2320, 117.7770 Huangyan, China, 28.6500, 121.2500 Xiangshui, China, 26.5964, 104.8314 Simao, China, 22.7807, 100.9782 Longzhou, China, 30.3200, 112.2300 Mizhou, China, 35.9900, 119.3801 Jiaojiangcun, China, 28.6804, 121.4500 Chengde, China, 40.9604, 117.9300 Nanyangcun, China, 36.0819, 114.3481 Huinan, China, 42.6229, 126.2614 Tongchuanshi, China, 35.0800, 109.0300 Igreja, Cabo Verde, 15.0339, -24.3250 Nova Sintra, Cabo Verde, 14.8710, -24.6960 Cova Figueira, Cabo Verde, 14.8900, -24.2940 Ribeira Brava, Cabo Verde, 16.6150, -24.2990 Erfurt, Germany, 50.9781, 11.0289 Sandur, Faroe Islands, 61.8344, -6.8171 Fuglafjordhur, Faroe Islands, 62.2448, -6.8150 Hov, Faroe Islands, 61.5068, -6.7599 Vagur, Faroe Islands, 61.4733, -6.8175 Saltangara, Faroe Islands, 62.1156, -6.7206 Kvivik, Faroe Islands, 62.1186, -7.0737 Sumba, Faroe Islands, 61.4055, -6.7090 Vidhareidhi, Faroe Islands, 62.3600, -6.5313 Nordhragota, Faroe Islands, 62.1990, -6.7432 Toftir, Faroe Islands, 62.0978, -6.7369 Kirkja, Faroe Islands, 62.3263, -6.3238 Eidhi, Faroe Islands, 62.2995, -7.0924 Sandavagur, Faroe Islands, 62.0537, -7.1498 Skuvoy, Faroe Islands, 61.7710, -6.8050 Skalavik, Faroe Islands, 61.8314, -6.6623 Sorvagur, Faroe Islands, 62.0717, -7.3066 Vestmanna, Faroe Islands, 62.1548, -7.1690 Strendur, Faroe Islands, 62.1096, -6.7617 Tvoroyri, Faroe Islands, 61.5544, -6.8063 Husavik, Faroe Islands, 61.8099, -6.6813 Kunoy, Faroe Islands, 62.2917, -6.6702 Oyrarbakki, Faroe Islands, 62.2079, -6.9997 Goaso, Ghana, 6.8036, -2.5172 Sekondi, Ghana, 4.9433, -1.7040 Dambai, Ghana, 8.0662, 0.1795 Sefwi Wiawso, Ghana, 6.2058, -2.4894 King Edward Point, South Georgia And South Sandwich Islands, -54.2833, -36.5000 Pinrang, Indonesia, -3.7857, 119.6522 Trim, Ireland, 53.5550, -6.7917 Jaitpura, India, 26.9231, 75.8080 Rajapalaiyam, India, 9.4204, 77.5800 Navsari, India, 20.8504, 72.9200 Tonk, India, 26.1505, 75.7900 Hubli, India, 15.3550, 75.1362 Al Kut, Iraq, 32.4907, 45.8304 Sari, Iran, 36.5633, 53.0601 Ilam, Iran, 33.6374, 46.4227 Nyamira, Kenya, -0.5633, 34.9358 Siaya, Kenya, 0.0607, 34.2881 Murang'a, Kenya, -0.7210, 37.1526 Ol Kalou, Kenya, -0.2643, 36.3788 Sotik Post, Kenya, -0.7813, 35.3416 Kapenguria, Kenya, 1.2389, 35.1119 Kabarnet, Kenya, 0.4919, 35.7430 Migori, Kenya, -1.0634, 34.4731 Pailin, Cambodia, 12.8489, 102.6093 Ta Khmau, Cambodia, 11.4833, 104.9500 Munha-dong, Korea, North, 39.3813, 127.2517 Sil-li, Korea, North, 39.4880, 125.4640 Muan, Korea, South, 34.9897, 126.4714 Hongseong, Korea, South, 36.6009, 126.6650 Anouvong, Laos, 18.8989, 103.0919 Xekong, Laos, 15.3503, 106.7286 Phon-Hong, Laos, 18.4953, 102.4153 Qacha's Nek, Lesotho, -30.1167, 28.6833 Mersch, Luxembourg, 49.7500, 6.1000 Redange-sur-Attert, Luxembourg, 49.7652, 5.8894 Idri, Libya, 27.4471, 13.0517 Cocieri, Moldova, 47.3000, 29.1167 Lipkovo, North Macedonia, 42.1553, 21.5875 Ilinden, North Macedonia, 41.9945, 21.5800 Resen, North Macedonia, 41.0893, 21.0109 Makedonska Kamenica, North Macedonia, 42.0208, 22.5876 Pakokku, Burma, 21.3320, 95.0866 Dalandzadgad, Mongolia, 43.5708, 104.4250 Tevragh Zeina, Mauritania, 18.0989, -15.9885 Plymouth, Montserrat, 16.7064, -62.2158 Santa Lucija, Malta, 36.0431, 14.2172 Rasdhoo, Maldives, 4.2631, 72.9919 Dhihdhoo, Maldives, 6.8874, 73.1140 Muli, Maldives, 2.9217, 73.5811 Fonadhoo, Maldives, 1.8342, 73.5031 Nilandhoo, Maldives, 3.0567, 72.8900 Thulusdhoo, Maldives, 4.3742, 73.6517 Balaka, Malawi, -14.9889, 34.9591 Neno, Malawi, -15.3981, 34.6534 Chikwawa, Malawi, -16.0350, 34.8010 Las Delicias, Mexico, 28.2000, -105.5000 We, New Caledonia, -20.9000, 167.2667 Abakaliki, Nigeria, 6.3249, 8.1137 Yenagoa, Nigeria, 4.9267, 6.2676 Gombe, Nigeria, 10.2904, 11.1700 Isemi-Ile, Nigeria, 7.9700, 3.5900 Jitpur, Nepal, 27.6666, 85.3333 Manukau City, New Zealand, -37.0000, 174.8850 Sur, Oman, 22.5667, 59.5289 Hayma', Oman, 19.9333, 56.3167 Suhar, Oman, 24.3420, 56.7299 `Ibri, Oman, 23.2325, 56.4973 As Suwayhirah as Sahil, Oman, 24.3620, 56.7344 Union Choco, Panama, 8.0778, -77.5583 Sieyik, Panama, 9.3833, -82.6522 Kurumul, Papua New Guinea, -5.8550, 144.6311 Buka, Papua New Guinea, -5.4219, 154.6728 Pili, Philippines, 13.7177, 123.7448 Tabuk, Philippines, 17.4084, 121.2785 San Jose, Philippines, 10.1800, 125.5683 Santa Cruz, Philippines, 14.1167, 121.2833 Koronadal, Philippines, 6.2541, 124.9922 Az Za`ayin, Qatar, 25.5669, 51.4847 Umm Salal `Ali, Qatar, 25.4697, 51.3975 Madinat ash Shamal, Qatar, 26.1167, 51.2167 Bosilegrad, Serbia, 42.5005, 22.4728 Zagubica, Serbia, 44.1979, 21.7902 Pozega, Serbia, 43.8459, 20.0368 Doljevac, Serbia, 43.1968, 21.8334 Boljevac, Serbia, 43.8247, 21.9519 Ljubovija, Serbia, 44.1869, 19.3728 Babusnica, Serbia, 43.0680, 22.4115 Presevo, Serbia, 42.3067, 21.6500 Ljig, Serbia, 44.2213, 20.2375 Mali Zvornik, Serbia, 44.3992, 19.1214 Priboj, Serbia, 43.5836, 19.5258 Bojnik, Serbia, 43.0142, 21.7180 Koceljeva, Serbia, 44.4708, 19.8070 Zabari, Serbia, 44.3562, 21.2143 Trgoviste, Serbia, 42.3514, 22.0921 Pechora, Russia, 65.1587, 57.2087 Mikhalkino, Russia, 69.4353, 161.5508 Nordvik, Russia, 73.9975, 111.4633 Logashkino, Russia, 70.8500, 153.9167 Noginsk, Russia, 64.4833, 91.2333 Ambarchik, Russia, 69.6261, 162.3039 Al Hillah, Saudi Arabia, 23.4895, 46.7564 Taro, Solomon Islands, -6.7111, 156.3972 Rabak, Sudan, 13.1880, 32.7437 Al Mijlad, Sudan, 11.0337, 27.7333 El Fula, Sudan, 11.7120, 28.3462 Edinburgh of the Seven Seas, Saint Helena, Ascension, and Tristan da Cunha, -37.0675, -12.3105 Georgetown, Saint Helena, Ascension, and Tristan da Cunha, -7.9286, -14.4119 Zetale, Slovenia, 46.2750, 15.7939 Sentilj, Slovenia, 46.6817, 15.6481 Zuzemberk, Slovenia, 45.8339, 14.9292 Zavrc, Slovenia, 46.3917, 16.0497 Sedhiou, Senegal, 12.7081, -15.5569 Ceerigaabo, Somalia, 10.6162, 47.3679 Laascaanood, Somalia, 8.4774, 47.3597 Boorama, Somalia, 9.9361, 43.1828 Dar`a, Syria, 32.6189, 36.1021 Nhlangano, Eswatini, -27.1122, 31.1983 Pala, Chad, 9.3646, 14.9073 Bardai, Chad, 21.3533, 17.0003 Kara, Togo, 9.5511, 1.1861 Ban Huai Hin, Thailand, 12.5697, 99.9443 Lospalos, Timor-Leste, -8.5217, 126.9983 Aileu, Timor-Leste, -8.7281, 125.5664 Pante Macassar, Timor-Leste, -9.2000, 124.3833 Suai, Timor-Leste, -9.3129, 125.2565 Aranguez, Trinidad and Tobago, 10.6472, -61.4461 Pingzhen, Taiwan, 24.9439, 121.2161 Yilan, Taiwan, 24.7500, 121.7500 Zhongli, Taiwan, 24.9650, 121.2168 Yangmei, Taiwan, 24.9167, 121.1500 Banqiao, Taiwan, 25.0143, 121.4672 Bade, Taiwan, 24.9575, 121.2989 Mahonda, Tanzania, -5.9897, 39.2519 Vwawa, Tanzania, -9.1081, 32.9347 Koani, Tanzania, -6.1333, 39.2833 Namutumba, Uganda, 0.8363, 33.6858 Maracha, Uganda, 3.2883, 30.9408 Namayingo, Uganda, 0.2398, 33.8849 Luuka Town, Uganda, 0.7642, 33.3319 Kasanda, Uganda, 0.5467, 31.8197 Kinoni, Uganda, -0.6583, 30.4581 Bulambuli, Uganda, 1.1600, 34.3967 Ntoroko, Uganda, 1.0500, 30.5350 Otuke, Uganda, 2.4442, 33.5028 Bupoto, Uganda, 0.9061, 34.3578 Agago, Uganda, 2.9847, 33.3306 Kitamilo, Uganda, 0.2367, 33.2700 Nsiika, Uganda, -0.2958, 30.3433 Kalaki, Uganda, 1.8160, 33.3370 Kasaali, Uganda, -0.6167, 31.5500 Busesa, Uganda, 0.6263, 33.6003 Nakapiripirit, Uganda, 1.9167, 34.7833 Pader, Uganda, 3.0500, 33.2167 Kakumiro, Uganda, 0.7811, 31.3231 Kapelebyong, Uganda, 2.2933, 33.8308 Mparo, Uganda, -1.1844, 30.0544 Lamwo, Uganda, 3.5300, 32.8000 Budaka, Uganda, 1.0173, 33.9556 Ntara, Uganda, 0.0047, 30.3661 Bukwo, Uganda, 1.2928, 34.7531 Butebo, Uganda, 1.1944, 33.9222 Binyin, Uganda, 1.4175, 34.5344 Butemba, Uganda, 1.1430, 31.6030 Kibaale, Uganda, 0.7958, 31.0792 Palenga, Uganda, 2.5764, 32.3544 Kibingo, Uganda, -0.5700, 30.4150 Leju, Uganda, 3.1859, 31.0610 Kole, Uganda, 2.4286, 32.8011 Nabilatuk, Uganda, 2.0525, 34.5734 Rubanda, Uganda, -1.1864, 29.8433 Kalungu, Uganda, -0.1681, 31.7600 Tuytepa, Uzbekistan, 41.0428, 69.3572 Thanh Pho Ba Ria, Vietnam, 10.4963, 107.1685 Kon Tum, Vietnam, 14.3545, 108.0076 Da Nang, Vietnam, 16.0748, 108.2240 Sola, Vanuatu, -13.8750, 167.5500 Saratamata, Vanuatu, -15.2875, 167.9903 Safotulafai, Samoa, -13.6817, -172.1850 Mulifanua, Samoa, -13.8333, -171.9833 Satupa`itea, Samoa, -13.7659, -172.3269 `Amran, Yemen, 15.6594, 43.9439 Al Jabin, Yemen, 14.7040, 43.5990 Nelspruit, South Africa, -25.4745, 30.9703 Gqeberha, South Africa, -33.9681, 25.5981 Lupane, Zimbabwe, -18.9315, 27.8070 Charlotte Amalie, U.S. Virgin Islands, 18.3420, -64.9331 --------------------------------------------------------- Yellowstone NP, United States, 44.429764, -110.584663 Yosemite NP, United States, 37.865101, -119.538330 Grand Canyon NP, United States, 36.266033, -112.363808 Banff NP, Canada, 51.180202, -115.565704 Kruger NP, South Africa, -25.355100, 31.889400 Serengeti NP, Tanzania, -2.333333, 34.833332 Torres del Paine NP, Chile, -50.983056, -72.966389 Iguazu Falls (Argentina side), Argentina, -25.695230, -54.436718 Plitvice Lakes NP, Croatia, 44.870750, 15.600487 Fiordland NP, New Zealand, -45.440842, 167.266693 Zhangjiajie National Forest Park, China, 29.133300, 110.483300 Great Barrier Reef Marine Park, Australia, -18.567300, 148.553200 fotocx/data/meta_picklist0000664000175000017500000000062015247006660014512 0ustar micomicoArtist Bits Per Sample City Color Space Color Temperature Copyright Country Creator Date Time Original Description Exposure Time File Modify Date File Name File Size File Type FNumber Focal Length Focal Length In 35mm Format Focus Distance FOV GPS Position Image Height Image History Image Size Image Width ISO Keywords Lens Make Megapixels Model Orientation Rating Title User Comment White Balance fotocx/data/meta_report_tags0000664000175000017500000000010415247006660015216 0ustar micomicoKeywords City Country DateTimeOriginal Description Title Make Model fotocx/data/markup/0000775000175000017500000000000015247006660013240 5ustar micomicofotocx/data/markup/raised text effect0000664000175000017500000000020415247006660016610 0ustar micomicotext string: Tromso font: FreeSans size: 36 attributes: 0.0000 255|255|255 255|255|255 94|92|100 154|153|150 86 100 0 0 2 0 0 fotocx/data/README0000664000175000017500000000063315247006660012623 0ustar micomicoREADME The Fotocx home folder contains configuration files that may be augmented by the user (e.g. keyboard shortcuts or custom menu entries). Installation of a new Fotocx release includes new default versions of these files. The old files are copied to "filename.~", so you can check for custom changes and add them back in. Before doing a copy and paste of old file, make sure the format has not changed. fotocx/data/grid_picklist0000664000175000017500000000003315247006660014507 0ustar micomico1 x 1 2 x 2 3 x 3 16 x 9 fotocx/data/KB_shortcuts0000664000175000017500000000075715247006657014315 0ustar micomicoF File View G Gallery View M Map View 2 Cycle 2 Files 3 Cycle 3 Files A Current Album T Retouch C Crop K Keyboard Shortcuts P Print Image R Rotate U Undo Shift+U Redo Ctrl+C Copy to Clipboard Shift+C Toggle Captions Ctrl+G Current File Folder Shift+G Toggle Grid Ctrl+S Save fotocx/data/custom_kernel/0000775000175000017500000000000015247006660014613 5ustar micomicofotocx/data/custom_kernel/sobel3 v+h0000664000175000017500000000026315247006660016377 0ustar micomicokernsize == 3 cell0101 == 2 cell0201 == 1 cell0301 == 0 cell0102 == 1 cell0202 == 0 cell0302 == -1 cell0103 == 0 cell0203 == -1 cell0303 == -2 fmul == 1 fadd == 0 end fotocx/data/custom_kernel/color lines 30000664000175000017500000000026415247006660017074 0ustar micomicokernsize == 3 cell0101 == -2 cell0201 == -2 cell0301 == -1 cell0102 == -1 cell0202 == 0 cell0302 == 1 cell0103 == 1 cell0203 == 2 cell0303 == 2 fmul == 2 fadd == 0 end fotocx/data/custom_kernel/brighten30000664000175000017500000000026215247006660016423 0ustar micomicokernsize == 3 cell0101 == 0 cell0201 == 0 cell0301 == 0 cell0102 == 0 cell0202 == 1 cell0302 == 0 cell0103 == 0 cell0203 == 0 cell0303 == 0 fmul == 1.2 fadd == 8 end fotocx/data/custom_kernel/denoise30000664000175000017500000000026515247006660016252 0ustar micomicokernsize == 3 cell0101 == 1 cell0201 == 2 cell0301 == 1 cell0102 == 2 cell0202 == 4 cell0302 == 2 cell0103 == 1 cell0203 == 2 cell0303 == 1 fmul == 0.0625 fadd == 0 end fotocx/data/custom_kernel/colors30000664000175000017500000000027415247006660016125 0ustar micomicokernsize == 3 cell0101 == -1 cell0201 == -1 cell0301 == -1 cell0102 == -1 cell0202 == 9 cell0302 == -1 cell0103 == -1 cell0203 == -1 cell0303 == -1 fmul == 10 fadd == -700 end fotocx/data/custom_kernel/outlines50000664000175000017500000000067115247006660016471 0ustar micomicokernsize == 5 cell0101 == -1 cell0201 == -1 cell0301 == -1 cell0401 == -1 cell0501 == -1 cell0102 == -1 cell0202 == -1 cell0302 == -1 cell0402 == -1 cell0502 == -1 cell0103 == -1 cell0203 == -1 cell0303 == 24 cell0403 == -1 cell0503 == -1 cell0104 == -1 cell0204 == -1 cell0304 == -1 cell0404 == -1 cell0504 == -1 cell0105 == -1 cell0205 == -1 cell0305 == -1 cell0405 == -1 cell0505 == -1 fmul == 1 fadd == 0 end fotocx/data/custom_kernel/sketch30000664000175000017500000000027215247006660016103 0ustar micomicokernsize == 3 cell0101 == -1 cell0201 == -1 cell0301 == -1 cell0102 == -1 cell0202 == 8 cell0302 == -1 cell0103 == -1 cell0203 == -1 cell0303 == -1 fmul == 6 fadd == 300 end fotocx/data/custom_kernel/color lines 50000664000175000017500000000064215247006660017076 0ustar micomicokernsize == 5 cell0101 == 2 cell0201 == 2 cell0301 == 2 cell0401 == 2 cell0501 == 2 cell0102 == 2 cell0202 == 2 cell0302 == 2 cell0402 == 2 cell0502 == 2 cell0103 == 2 cell0203 == 2 cell0303 == -54 cell0403 == 2 cell0503 == 2 cell0104 == 2 cell0204 == 2 cell0304 == 2 cell0404 == 2 cell0504 == 2 cell0105 == 2 cell0205 == 2 cell0305 == 2 cell0405 == 2 cell0505 == 2 fmul == 2 fadd == 0 end fotocx/data/custom_kernel/shake30000664000175000017500000000026615247006660015720 0ustar micomicokernsize == 3 cell0101 == 2 cell0201 == 2 cell0301 == 2 cell0102 == 2 cell0202 == -12 cell0302 == 2 cell0103 == 2 cell0203 == 2 cell0303 == 2 fmul == 0.333 fadd == 0 end fotocx/data/custom_kernel/sobel5 v+h0000664000175000017500000000064515247006660016405 0ustar micomicokernsize == 5 cell0101 == 2 cell0201 == 2 cell0301 == 1 cell0401 == 0 cell0501 == 0 cell0102 == 2 cell0202 == 0 cell0302 == 0 cell0402 == 0 cell0502 == 0 cell0103 == 1 cell0203 == 0 cell0303 == 0 cell0403 == 0 cell0503 == -1 cell0104 == 0 cell0204 == 0 cell0304 == 0 cell0404 == 0 cell0504 == -2 cell0105 == 0 cell0205 == 0 cell0305 == -1 cell0405 == -2 cell0505 == -2 fmul == 1 fadd == 0 end fotocx/data/custom_kernel/emboss50000664000175000017500000000064415247006660016117 0ustar micomicokernsize == 5 cell0101 == -1 cell0201 == -1 cell0301 == 0 cell0401 == 0 cell0501 == 0 cell0102 == -1 cell0202 == -1 cell0302 == 0 cell0402 == 0 cell0502 == 0 cell0103 == 0 cell0203 == 0 cell0303 == 1 cell0403 == 0 cell0503 == 0 cell0104 == 0 cell0204 == 0 cell0304 == 0 cell0404 == 1 cell0504 == 1 cell0105 == 0 cell0205 == 0 cell0305 == 0 cell0405 == 1 cell0505 == 1 fmul == 1 fadd == 0 end fotocx/data/custom_kernel/sharpen30000664000175000017500000000027515247006660016265 0ustar micomicokernsize == 3 cell0101 == -1 cell0201 == -1 cell0301 == -1 cell0102 == -1 cell0202 == 16 cell0302 == -1 cell0103 == -1 cell0203 == -1 cell0303 == -1 fmul == 0.125 fadd == 0 end fotocx/data/custom_kernel/last-used0000664000175000017500000000064415247006660016443 0ustar micomicokernsize == 5 cell0101 == -1 cell0201 == -1 cell0301 == 0 cell0401 == 0 cell0501 == 0 cell0102 == -1 cell0202 == -1 cell0302 == 0 cell0402 == 0 cell0502 == 0 cell0103 == 0 cell0203 == 0 cell0303 == 1 cell0403 == 0 cell0503 == 0 cell0104 == 0 cell0204 == 0 cell0304 == 0 cell0404 == 1 cell0504 == 1 cell0105 == 0 cell0205 == 0 cell0305 == 0 cell0405 == 1 cell0505 == 1 fmul == 1 fadd == 0 end fotocx/data/custom_kernel/emboss30000664000175000017500000000026315247006660016112 0ustar micomicokernsize == 3 cell0101 == 2 cell0201 == 1 cell0301 == 0 cell0102 == 1 cell0202 == 1 cell0302 == -1 cell0103 == 0 cell0203 == -1 cell0303 == -2 fmul == 1 fadd == 0 end fotocx/data/custom_kernel/outlines30000664000175000017500000000027015247006660016462 0ustar micomicokernsize == 3 cell0101 == -1 cell0201 == -1 cell0301 == -1 cell0102 == -1 cell0202 == 8 cell0302 == -1 cell0103 == -1 cell0203 == -1 cell0303 == -1 fmul == 1 fadd == 0 end fotocx/data/custom_kernel/darken30000664000175000017500000000026315247006660016066 0ustar micomicokernsize == 3 cell0101 == 0 cell0201 == 0 cell0301 == 0 cell0102 == 0 cell0202 == 1 cell0302 == 0 cell0103 == 0 cell0203 == 0 cell0303 == 0 fmul == 0.8 fadd == -0 end fotocx/data/custom_kernel/emboss3-B&W0000664000175000017500000000027015247006660016464 0ustar micomicokernsize == 3 cell0101 == -2 cell0201 == -2 cell0301 == -1 cell0102 == -1 cell0202 == 0 cell0302 == 1 cell0103 == 1 cell0203 == 2 cell0303 == 2 fmul == 1.5 fadd == 200 end fotocx/data/custom_kernel/sharpen50000664000175000017500000000067615247006660016274 0ustar micomicokernsize == 5 cell0101 == -1 cell0201 == -1 cell0301 == -1 cell0401 == -1 cell0501 == -1 cell0102 == -1 cell0202 == -1 cell0302 == -1 cell0402 == -1 cell0502 == -1 cell0103 == -1 cell0203 == -1 cell0303 == 40 cell0403 == -1 cell0503 == -1 cell0104 == -1 cell0204 == -1 cell0304 == -1 cell0404 == -1 cell0504 == -1 cell0105 == -1 cell0205 == -1 cell0305 == -1 cell0405 == -1 cell0505 == -1 fmul == 0.0625 fadd == 0 end fotocx/data/custom_kernel/emboss5+color0000664000175000017500000000064715247006660017234 0ustar micomicokernsize == 5 cell0101 == -1 cell0201 == -1 cell0301 == 0 cell0401 == 0 cell0501 == 0 cell0102 == -1 cell0202 == -1 cell0302 == 0 cell0402 == 0 cell0502 == 0 cell0103 == 0 cell0203 == 0 cell0303 == 1 cell0403 == 0 cell0503 == 0 cell0104 == 0 cell0204 == 0 cell0304 == 0 cell0404 == 1 cell0504 == 1 cell0105 == 0 cell0205 == 0 cell0305 == 0 cell0405 == 1 cell0505 == 1 fmul == 2 fadd == -100 end fotocx/data/custom_kernel/blur50000664000175000017500000000064515247006660015574 0ustar micomicokernsize == 5 cell0101 == 1 cell0201 == 2 cell0301 == 3 cell0401 == 2 cell0501 == 1 cell0102 == 1 cell0202 == 2 cell0302 == 4 cell0402 == 2 cell0502 == 1 cell0103 == 2 cell0203 == 3 cell0303 == 9 cell0403 == 3 cell0503 == 2 cell0104 == 1 cell0204 == 2 cell0304 == 4 cell0404 == 2 cell0504 == 1 cell0105 == 1 cell0205 == 2 cell0305 == 3 cell0405 == 2 cell0505 == 1 fmul == 0.0175 fadd == 0 end fotocx/data/widgets.css0000664000175000017500000000070315247006660014121 0ustar micomico/*** This file reduces the size of some GTK widgets by reducing unnecessary padding. You may make changes or comment-out text to restore the standard GTK widgets. Do not delete the file - it would be automatically restored. ***/ button, .button { padding: 0px 2px 0px 2px; /* top right bottom left */ } scale { /* slider control 21.41 */ min-width: 10px; padding: 0 2px 0 5px; } fotocx/data/CIE1931.jpg0000664000175000017500000012102115247006660013356 0ustar micomicoJFIFHHBExifMM*JR(iZHH02320100fotocx-24.20: Paint Image|fotocx-24.20: Rescale: width:960 height:1020|fotocx-24.20: Rescale: width:640 height:680|fotocx-24.20: Crop: width:604 height:646| http://ns.adobe.com/xap/1.0/ 0 2040 1920 0 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((\" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?R4^`Ӵv=$x^65U !Š ^i3jvZ_[ BE`@888` )v xw\MJ:U \A&ٮՕ|;wI9n}\{PI`[xZ(~%CpvLyq߼=+e+־[V_vWzؼFa{id1x>j?"mVFҎtT ;q209Yp9;H;\-(8@ZW[^ͩ-Ջvs$ޠW+hTѯ,uKue’W=F@-oO |HXɨC܎柠7.hek,QV-1J-??=YfP8[e{K#>%ѣhf9oFq" 牼'*ɢjpGȀh2 myߋ5M>;Y5}*R>*najlwׇtn,"xFyX7J寋czy.c>ڤp`tq@ ZlWsr2} 7GWúD7ڌc. P(ɋǚ|_]Y蚄I<8?a](ݤfI+YnU\">WSF"!|_|j]>N B{YX挣~FkHٵ.Q=VXpr3\6lj>_?bg8ǰ" 8 [*Yz#XEo%E~l,"d2*}w<9YCgo*Gc%ORN;I9jSӮǴmf 2&>bxTl8V1*6@Ցڲ&P}u(X`mQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@9TMTD"-Ŧ᝗,8'{6O(/.-FɸzET5_ xwǚ#֭BXs`{9KvRE2(W<ʀ-g0y'sv5 SVӮ[57)afmo _': w**3]]HT㓍@Zɮx°(W<6ĺy!4.Qu'{kVgYcOOB/#ry wSBѯbL任aq՘~MxSJ<ād#'!M+~iC.JlMkUIO#[]*DQC6XH撛?cj՝bK0)hCMlo\=đ@xu^3q.:5ރS3fޔݻ=a:pRwjw: !Mx~ֆj6ͦɥwu(W=6c?Z[Y[y9FSZ֓]6b\* ϥZSĮIw$(Ip {GzV𬍮h.D`y=T}=G>¼H($M>2RWk#a)qP#lWFG* 8"(ZJ(J( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ڔE|]dXymK\iyu($ oxwZ..jVR2<2}+—z@`uYp$RYU~P+졺rL[h)q3đc;  _]>37<^[Bqzp|ׄw,ıZEw0'*V9qYZQu8'>Ovgޕ[4ԯًƓ_J*4 >0K!7{GCnTxwLr./ʖb3\2R~iU21V ҈p>(,N\o>Uּ xrh;p&PN+t+۾+YՌ$6b85$z˥x ,O ]'$AԩA<ƾbsVT? ]A tMM]٦2A7VF*Sj"aCuJ1V"DPYI{߆4xcO? ﵶ{t}SVkx՜nr' ׅW|ֿa]#F{tmN;+2Fd+F;\;fd (9H'BsӼIwm\X[-̆;Lɀr\z|Bmt[ q]WuX~hb9 ".gkiq#y-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@TC-Ģ8#ydnXPx7MsE\MK@7ۭNqc~5Nrvyq1n>@]Wu62y0Ю͸=ZT7GK|5H]V$a~ W?,3<}Z7|]E'\+u:5Wq[v:Λ6;dx?6ϖ}CV%gNUM$ yϟ+l|O('w>!;[ -fI'ؗeV NqIk d3(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|*𵯈ZVt}ORT;L=3 qI4M?DZuReS#`yPA 9FmV=Jc|$gqZE{?a_YcCNqrvPN3^K}kæ#fV=h'9f ]ˬ۠|_F}- l~_lKFS_X+|sfRy!!pۊҚ>Keܽ_zRJ՟ ښih56(R!5 J(hc CA4Ĥ4$1Ji4"5tv}&BZIİ!^k८c7~aiORS?]WNJY[)a|?TF#YbxdJ#aoZoěI $v~%E/=D? %j7:mWIouAFAFy֧^ 7tʔQEYQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW|$1qIc$+Oúhu*sY`A*A=Ez_2iR7Q6zv@$b]4+kM7OOsgn' O:F-nYѪy1UUz֗/ʹ/ذgz{jYI].۵++=j{y)VHʰk McUp2/uG,5=;ڜ֛x%%b@;qs\} htAAmuPK^TRO+WǞ:vz]'\1N1&L{_oRU);6&&I%tQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@TIsq#I4FK18~4Zv_>WA9݉j쭠j.icBQ]c5GKJ1KIZ{RQEK:hhE RRP6SIYޛN1) -!d!qyiM=k) 4Z aS%B*dW O*ArH!|^(@&QK>06 2秷U<4ӱ?įπ@~$\.<}GQ\WowYO!S-n$EfP>Wn_hx#Ҷ$ג4j'qIK8^ғ]Q8|D1tRWySԜWs d$C `q jnɼ:`lP7Ht$ʀ8b{ ?~ ;I, DMiK hy_'/\چ9+.{8ϵqQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEONEi}iKDIɤļ>l`Z(>!мGn~OEpѼ 9HZ c=k>eoM ~aEhJ)i*RR԰(h(h4IYi)i+) CGjSIX m%;4<Ƅ4qE 4iZ a䩒Z;WWNb:b> Z3æB'nѻg#uUZO `J|nW-u\%рo8r4cGElz]eW_~ jPͩ;\?,L{=}E~攳*\޽Wch֍hO<$q; $^SS?GE]и*F]ǞfxLXq{YwDvǎ/TAjGI 4yʠ$צjzuHynr2ŽDJqcT<|J܍=YͧI|ʄʩ>6hy]kr=TR:{u_jzv9̉QQ=[b38z'jEݟbmnmYyDPAPj/ORt[u6=~aG\NwO-rmFg NyH%呤zeQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@WCo Y{($H .\eme#=;sWd<7jIVF$ A#qfd_^ix|eE\'ې;cvz;xz޷Z+?DtuՇٟq_ +fτ@ ZJ5-QE@͡Ee$1;RRw!4қڹ4NQ =))@6Z;T#Lzrdt1翇NjtJQDZ}rZMj6*`GJ^*Xʵ'OW't|-5o1ȍbDot+YK. r ?|߀4^NHw9NoG3 $]fTRJ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( _1"{d-ytR.'h>c{k-t 2Bv.VNLOռ{:kw =դPGMjO3ÂYX..Qc1ۃ)UYX-;|m2hwv"y$01_(ּexoğo/x||Dww*KmdPvm=zכ]xoG>({W]KpGM;X.'޴|esexru=0\\&3 OP}+t|SFxFckɊw`+ª<`z׊-nfuU83Zn4Vn,N2 >7oW>:W/zrynZ{')fض<~R9qI^Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@b~ńgj+P\ckfxU?8MqJ:wM#DbFO//W.ۤ1 |'Mχ|C-͵qx=Q쩟esn@P>~OQ(I-o\O *2=iQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE-z 1kPxKq%(j0\lc8~m⏅~]IC (4wX=| ǷZ\4XݼG97cbx>G4)]G8@$һ[UOf{r$R6U_^1;-";'I.U 6sqPП ,+4mfM~eX"3Fe}Z=?y[-GO>&wuoi0TuxMNp9 ת x\O]8o762%4c45ci(’6% R}ii*Z+6))hPi+ m-%a$1 !4&CM*\SWYRZF*kP*b=,IcZU֦}l9VQBEyuiiR^}JgIjf}ׇ.㩈7^NF+VE˝\K2 rF?Q_oQyVE]15 ^~Ŕfs:*p]Wc7MٞWE)4ꙅQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ӭ]jQL =kėzڶMo-a8yjޗcwCe%8f>€;+YxF}JRҰi"L$qTdy'#|+7\X^xX4k2R ƎH$sxkVպUi9$v1F![ɠ_} R<:H ěƃ\9yύ5|K[Zm{'XVރƚw63Re*8=H5]BM$/F8ހ=Ozͻ~^Qdu͍F־jo+򊾆yojɸc1?η.ϖOɧ+ERhRQR IKF*E j(͡Ju!JJZ+ !4IRTTyQFyqJ5FUa`IVi: j 'HhQj"xdkvN3Jwcm=1@_s8滠= Kol}'z>ŸbG%)׏EPEPEPEPEPEPEPEPEPEP^. о"ki۷xPT ?Ee]kFp-KNi;aݱ=oEk6tKoOvYad1Z-U7yy|W>?}űյ[,t2RTRxkZ7÷mJuiRD\/s@_z΋(mU-t$/k巶7\R +4Vzzlincv2rK϶|P{닧摥 v$>< oŶq%3+ `uw_䢼?k7?*ow?ngsYj} V]?2ƛJhmĢ+QE-RQR IKEC@!qHEC@%P*4QEc4RE=k֚z 5UּpԒ4125JD$Ei*dR'B#T)yTWH8 pWJw=*QJW JGN$faR#"jH ;CXLjTNDıqx.WfATfG/UUi?(upY(|ea: 9k剳 :oG=M+Nյ{:E '}2i#.<;xM]XbbCھp ><댠$8pOAk2RU)v>s r*q:g&`ՠou!re #0xsI:;{4q6݀U\2zp9~cM@xBnkZ] +*bCۆ5a>'xTlZ[Fq:`m3^c(/h tMKen DjlNIAz KI@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@5Vw>O'E܁`+o+~, 0_[iT͌pt#;SiH=ퟀY(B ((@%( C@%QY) -CEAQ2QRZF*cAQ &UkVkϩ0$ALLAS9DTP'ԣ8 \W,z40a!5rNSDmPL I;5\.ktN"&Xs\Ҧu cQPƢfR)j2$Ч!uڎz&AGPk01 WUU|ɭ">ZSw.sqKY(e_Cui~&Цߊtln~-فFx?ҾIRw2rZG*F_eم,}%RWcXi3zU`]BKwH0Z6P(((((((((((BrTdT4$$䓒iQEV׃7@ܒ#r~iAJf/źvixż`ۘ'5ɓar(VTܒ>?T$˾7$Vqߋ+Gg@n}s$eokm^=b>ԧٿZ &iE;bZ)XTE-%+PMTf_%fQYu4DbL54c5Q4VjKUr!^}X%֬F*("}*j G8< SY)D1Hiؤ5((=*6=iQa(FƠsRv$Nj5+sNBsR4PDnj&=ij5*GL5 j&5%˭;X]ĶZWPNW¹jcj`~fx10p_¾1^Koݥ3ЎnWWM/ l"q<4MفFx?J?]Oֽkgg%/|aJ;)cXZYM c%vEPEPEPEPEPEPEPEPEPEPEPE-%RPx7MsE^G^6ivrU^5Vx(}N qtІ/^ Ԥ %N$#]ߨ5^SGMGfUWw1Eoc4uR F)4i3KN6@.i:֊3EVmRH< Q**jxF+;@% %/Jp؞55W }#T)T+q=1 Z\Q\ӁҀi1P=QơsR1sY8F桐k'#sP9w5pDnj5#c:GLHs\Ңtҹt"3TecQ3VNTG%SMF')X60v?⹲k)U.L -GO:[RF|O!Bc95=Ηo !=lS1D؎5ڟí{Ag%|zF~U)U\x"Xݥ'/RrtM_Gk<|W<D?ٓpkV3I%v2Woĺdž] [fP$X @=2? ok+ayJ[u(bIBWgܚ\P u|ӯnmYeb1OхY3Vk,ݲ"G EhEz ^G\mCJ(l|`Q( (MQE@1@>RԴhGҔ{8QLZ;V3F$bĵkVZ=|<.MץCըpT8X ST+q=E:-A|7H0/GNyd4J\At bc|eI#޾=wCͅFgUd?_,]o<׾uL }A)~yUTt/'R[J w!TgzS+A2K]}ׄx*)|E=jWh;v`F2J ;'Ҽ- t.$m@8=Yƍ?[LE5Cn#V#P_ǽC3i,zq §a[.mxD=NJ2!/%}+(((((mdxF t TPjzh#UB1q}z7Z֟kcqwp ۆ/،yђdg<<*^5;\I%=ȑ.8xp Q^ YZZvڭnL[71b6^pz5 Y^|9oD[/9vY-E-%QEQEQEQER⒀=k7?*:ɮx°(kjY.~p++!W&^>/CZҔfɏ5J]=/R0*OPqI_RQiqIIEqM.hX^(74ff4X,:fha34G)I#qZ c8=*UF qT8#)Uc5e rN'a铡TiDh@SI%գ]һTՌz46CU5W'FH]ڝ#UwjF,P;T8p+BPt"1]]zC1ڡfڡvp7Aڡfڠvp:c]z껽Kow껽KtzkO:! ?ZcB֡:cV^/M-SsUN,!]y8{⼨7ukCySG1쪯G3{¾/$-i"8uˊf= M4G:= ~kv{}+?hO jcX<''r #u2 ⾂ER<{4e*hֽmvC4>?ڤȔ)+AϠ_Zֳr~k774c+ KL{r{fW:^}M 5d WJU 894>!gŗ0[ï=ṵƱKePGwc· _}j9ָ?B%Mu&vIҎmߛ1cX$p8 \ 𜓱ɑ9Z-O0RNukbH4i0x(kӼ_k&7vz-{m0;$mۃ Uxҫ%t?MHҬw{Hs3I,ǎI((((^X˩_Iub@j~J6iRh/2 M/w/;5-/q'܆^GvkKqm"Ʈn+?gRwsE{œ=20>WdYVo{CZQY<*cBt;F 9z_ATMx}gp3|+#fWy#=eA?΀=~˞7?*:kQug/]x{Oc\,1ǁ8ȿC^4k?t]Ͷ;mN̋xgΥah6nHbGFWw`288}_Y>yLjT<d9{泊4FGپڴ6-hfL`FióInh&f4fvz{Rq5.Nr\a4{8ZEM\(GrN'a)c5:FI<6,STӷW<{`JZ͊ajONv$jnӀzۭ,U'v59ګ՛ v]ҡDv]vLb+@HP30zޑޠwtFzޗ:a^G]0z<1=#=BG7v٩ /dojniqE/dZFiأ#(u㨖EC+`nc<7oy(=*7xngQ̨Ut7߂|K_?@"YIc~|,Um %qԎ:1W|d\Y[UZt}V^YZMI4. A=秭Ei7Z6Gy ,j Ў"( ( ( ( 🈯|1&2lhA6taHⱨZ i+ݔyUrV=9䞤&LRi4tZV;#cҹ(RKV" ѫ{v$$E{gW:wKm{N-.ڟ G9-ڣ259T8?,,7ƪ/\ILקcl-!&i,:4њiasHZM744ajM\(Pjt4;Sj3V5N:y/DjmTc5f3ҹfR.#TQ \҉ЦY KX2=e((w p= pzCW7Djafu UwT 9ޫ;y;wzkU䒗:a%Wy)IU:LޫBSGLiJR;P;Щ0zL&ٛ"S3AKh!iSp)Rᗍƙ*˝+0 !$=u:qwGaVZ?:>'ӮeՌoK.П?4 0p@Qq><:UItSM?|y1#1_5x֠h<[QZ=AEK2V:ǏԆνky< 9?#kV}ꊬfC?.O_^x[f_:T^Q;Tp|_a˷`Ini ?4M74Hv4I&XRiM&"ZuFZuW)#a OTѪmS(z3V5F#Vj> LV5L\zej5SW D-}WFhFQLzT=ޠwHU'w$jGz#@YHhiN*~:$ޫI'ZfvB$j9$%2I$I֙$ZI:Щp:I*5ߊTp=6jaj=j!&!Vh-Ch- 6SF*y7QRqE:X3\ȑB V(TvKj#;(3&KvV?}|HJ O/T59^rj@i!q\uoXقjo%UA?X/5KyE qܒy>b<Ԟd?ɿ%es)sWeH\"Wt6d\-7BUvyh(((((ɮx°(<& ( ą#$_q6}ŌWy?AH ('E9fQ8Vo'sԣa)eL98Vt(X`EPEPZ.5iYٝh,{(Y?POAxP !! .%!u}"Sb0#CV$c#\q\1<,q)grT O@+?g m&۾zVM&{ .qc|<V11_6ypc| *.\?zH>Q^ +mGFba!.%'?aIĚvړyPp"A 1RJI}} [^On4R28I[q 7h&R:ϽragiF}? ؙ}M4i4kDHRjka5F#TlԌ 7Zb< j(jezQmTՈڳ=%"mVmVQ> ObHTժ@Ц[NTNPz`ZM/PoѦNQ<IPRLUi$䓎ZIxKٞ:DK֫I-E$j-UZI}֏dv$IMy*,9ޡf#52 &sKIPXRQEf%CZ*KA n( 85IKiפPߛg#ҳŌ0(W_c\}sҳ5moO҃y1"wWw cN[%Á\׮94 m^ܗ> r?+F˻319%I4v?l{\Xe|TIɉ?܇j2CGדQypc|T\?z<??*ly^\?zˇ{G?^ ?Trdؔ{^\?z,# |?l{@:b0E6Xy R(/>):i:m9Pz θZ=_|![i7:x"x brl09tծTV]Ie&;d6'ʹ7Z-Jݭ:ԭmw9twr{zٲ:҄d+27j=k7?*:ɮx°((h>QQZ7TB>n  S-KA=@'܂q\W싮$Fln!.T]/ou, LDq i-}Qa4j65|jk51Q4Qjڢ-Z(u*eFqT'hQuzS+W<}L=<=d{t)S̤2 EV3գL/Wy %V"y%KךIG= TdI-FUwz^LJc>j6jNT`+=F4J!(+)"JɡE-C͡I%!8׫56cl?|+XSc.^O@=<_iv3V~u桪\.>Pc$QG8ֲ >-lnjּ0wm>(u@/nCj߹k W#mϏ^y9ԓo̚5H֡dQEM?܇j4QE83]*qgPPEPr?*{?TQE5fs5 QEQEQEQ[^"m4]298 z}أؠM \ 6JrT_fTn9 W.!m.Qޏ8q"ji{lw[_D=kAlد< 'f}?؀Lo uFaZs4˿QU9cb3)AKS}S}c%H֡۹r |zؠ(}>}I?SPɠbr'}أؠǙTso}Q}S?ٟ?Gٟ?@ܟ*  a1}أؠ5nYRJ=@Q@Q@Q@Q@5Vx{g[w/s޽mcFbRUңk͸0G' O#[<7^5;I\.BK>bAkrEXp'aok./neVԮml<*3uХ(6g{qm !ᑑ*We.֬Hk-R.BH?*kvp5"j.+b'Ib;T.;Uyޣ-Q; mjX OVAq^U!%8IP}6{̣̪~m_zعSLPL2Щi4U̕^-i%U2{o'ԥN%1-IЅ:Q@$PXI%hJdՌwKV7VN=3IܷL_3g߰N}YGn}Sh@TH=;t SIdԬgg^7k0 Y'l!#SWzMbJm"(*$ր=gk7?*xxg\]D[_n !ԩ9R8<kWfO6734c9V#>/ch|+>=ҁyϓr5ŞV:Z}]/$dq eBq^ei}KyhڵoOss%ߊK;[Et)3׭SӬn5%"Z{*Z2g+jha,OQQ}oEh_ǺG5lUyQOUB~Q.`/?Ə l$meڣ K X\O&ĘlnEK o$?/ףLmWLT}o /B^>;q v=,Uz@GzQI%BWL`z8zZĔ&*NStϦQmRRjy.yJ=L%U{zi/Png4OV 7fS*$w@xP(+ 1E-a$jRq@d`rzW=F.i;!)B>=k]cc;-өQǓ~uA4sF!Nxx/vϚ8 h>|[i$]'nkּaja-?[Oj<DzCi>/Ck؏v>#1ShD,MIkoi~/cj[kyBX.6ָEOi}Ge_ANbj_T8$/_?_ . Zge_AJx}joUp_2>exUnFB?xGY}@Re4}_E\j=E xzz/?ƀ ,}/?ƀ5rky E&>>e_AEOY}Ge_e_AEOY}Ge_r?*>e_AEOY}Ge_%fp%,<сR ( յ'o#TQK!%3cg#>ڔtZMSc6t=FR7PNkռ/{kH53 #4^ՃѸiZuux|עH\/\d%RymeW}h'4^4S5HUZV}k<& ( ECSA&s (.iSmO':__x?|7׃ػQRclXJJn;Q-JN)gl֜) 梼M}4vC9O r֩ knȺя=GdMIq"[۴@g>k^?D<ÁOԮ%kۇMA_5Cݠ~c+ ~}ri *SWچ;9Xʃ裊'e|'[R_.cs\V5Zv;vMKG /(*k_F7CEPNbi/րqGR\ĿQJx}i)WIu2j*>exTRR=!c4QE4r?ji?SPEPUN?A (OOo's (&55f(((+CAR7HbDpǍ́ ɮx°({ ~|ci6{ (e9q_݌ |J)vCFhX>QP)7QP>]Ѵ>#տzei&Ya?65V@F_DbqLYOև<ko8X-upe?y;Fޜۏ xM-[|Gߌ><)X<%GcJ5}vg7+vj$j&WU(h|-ZVAVVR=HEJ"LzE1jE[;`=id3T}^Gܷl劍ϟoljRǚ*biaVVF3U=FJeHC QҸ cdcCr>떻Y9%gyfnI9M|7plgX͝霼ZT&tqדN]JYMWzʌ7ؙsUϔckZMz֡}S?ecE;i4Oi?Ρ} O@} O7E1?q(m>} %:?} :5;׃ր>%x:~uh)WOU;>>exU5?iEJZ6CK_P*qP>]Ѵ5&UX ~x?6C@ E.h} Mo's[7QPm>]ѴZ3P7 5QEQEQEoKn4뙭nY{pET=FmoeƯ^ $]vp x/&}W7MsE^'@ohzQQ@RfG=}CT}ɿ ~7ꏴM=_q@g΀QtZZcFe7 dzN+$+) }]_Fr1O RBѴ:ap#pC~+kz.hi z]DN va՘ ԝ&QRVdӣ,ȥdF*F ⯄Gy9`k{']]=x`׈_Y<Ƃ QaGՄ&}XLZk 3ե9Tz,Ix)l>/Ƽ^:<դLU,4yJNIN@L&|N-~zWJ1X'YӓCcS)Ueݞ+d::-[ƚ)jH~pJU ^ysՓlV5GvMu,-"G翽Tx_α2T}oEEKu2O)!T=%y7GD慠Wh12>FsU*xohzQQ@oMkexT/&}RoCK@'#֡D[?C@ohzQQ@PG=}CT ~7ꏴM=_ ~|d'|ڡDp3](_M=_W*(VbdnT?hzNEA@ohzQQ@Gv#=MUs5 QEf{T!.$'G$r=};k|) x"͵kIXsIU'GZ<-ɯK 8;eo`?L2g%{X-tism?81^smO xVemcro߈h<& lo+N (&M Mܛ*iڌ6opf=I>שxtC£G%jqa +zq`vWφt#T $Ma"+K!?Ϣxo} knoI,e}̘v9@i~<-KY[\x_\vDHyr>a1X <7z7>Yޗs X@9RfC74ObY9b-/c=z;]xvdu.݈0d,mRj2]xx@׮%k2}Fb+ʕe@A W/᛽:BkR4:db,IöGʝ;º?37&񏈵8*{%7]@H6}&&=u_zJGʨz^[V˫*kFR<*dZ7|Ux|@#g88ȯm:d{Xlge۹'x9WO(vͧ8PΨVmIDxktze>{gWckW~=l⤴KZy1Lò+:4*ά&s§Lj 0 (x_Π@QET֠=%xZZJ*x*x(*k_#PֿF! tM~>%x:?Σ~S }|kPKIK@j_PPEPMC@Q@?*UQEOo's$QPPEPQEW| Y|=E_e,QH'%Nyj0_i[]ۣ3=C,Z|@np-Ű'K+ E/mZ;$"f 5Tthby|!O0EzvԼQj^4K&6Q?7 d$y/Lf&75M5|o>\G$7, "F <# 5x_'MGܘ#6vw뜀:m<3~uvڴlV:WW!}:YE\4.2k |gM~\H!ٙU.InGx:?DѿJ7*J٣c*Pu^SF6&k5Kh&,aN,FWqľ0U6Zt*b>b%y俴VW4n zǞw{V)`M vS|i=֠;t2r(O/9]mM4o?Uy_t|]ǧOh0aw8z35:^4 !8;ω|YZNW, 1y`:wE9$dudbNA}l!H>0]И~r8 vߏ9i_ghFk丹$,5h>o_[i[A {]n UQp}([@ +h_GX<$/[EysAP0j:zJ7*i_sFCWM²COYP]eg HG4o?Uz6VD4훝YCS )r޼#Oƕ}#`^E{@צ O[) `"2Jfdf=Ҿ;ѿTҾ;x/&kD rHI@3+Ut=Wѿ UF~K#g;sk]ր=WC4o?U'4!Λg6ogjK(ugbc4o?Uz7ύ$/u{ -n4-AWI Gyo.ٖѵ#񒛈]۳qڼX4RNʻ:ub~b=Ҿ;ѿTҾ;-7]>X ݆<\N?|/]cDY$3czO4!~g[kCKS2ypl̫9nG|J:PJ7*i_sFCW@ +h|v_>!h>4SF#^;'4/爖ivDV Y$^?ӵΙYep˴N>̧ ǽznj?ho>-% J$i_sFCWxAɊKh^[xvv$vO[i#k  R$Dy'8h4o?UOeHxk#4m"šO᧭}W_|4iof- s.H5Ҿ;l4o?U>?ON4l>R-ZIb@,%'R85_ [Mhw5v;ͻמΓY&Iq.1]^?%xd"Cr&{3XXPvO(imRMkc+]%4, 2k4ȼ1^rjM;/CsZ3xUK?_IG{y"6@$}:wxVquxnxė+Ʃ~@QȣQEXtQE-EVg_p'Z,t c&Ev>1ՠωto)bCAHހ:\xH1;fgyZ |TjX5ź<:\#̦L@< 5rþ-ӵo]Ew Y2ڀ'%K?\nXuMb[?tI8k; OaPEP^I1`A=vtУ}W)~|;ڵy*܄I| F#;IȠ2+H~Of=x#j5d}Vh֖f4K^G`Ik KHңeP>r +HYZFe:k5t.gLraL"I cB]cG:M!]F妹Cnp*j^]qtmoOK]NovUh^l MyӣxŜCeu-qѶ9\Z:|96wAG! ppF##u43<^YbrIh( I _&8 \H2htar@1ng>*;}yRmlW``qox!Zcd6"<ߴݮ`Ncٜ v23Xg,'[T4&'(ֲ{G~x@K&[kőeܬ v;E`^4h7Ik! Tc޼Liw$sXgJ?*~}o<3v~EPJ)(_/>Iop(Ms֗U_ #j_,6E{ lNx'K?-ʰ*O#Ox-[Ni0idQZyP[F0{99f+zYO*è9 k/0Οme[mQtǷ]tH$#_\}A5=HIV |[Y B+Z/{&KKTKvK5-`v $}yCUڵC,qY&ttYui3д@yc񐠬Uմc'EsyW;[ql1s¥GgF݅<&[#X0/ebO#H{9'5)I@Q@YIu &$\uYǍs%")6&1^\pkǖzkގך݄q';!hռxkm|_ԄDnX-L\֗]ZAy7'P^|bu| U y'Yx]_i1Z2LbN*@qR/,Zh'0%X2{ zo)gy6}8Ss9"aBuXw z`F$pA7]R4Hؓ8>{cᖥ u\$D{8ymh vYͩMEsu{'Xa#R0KY5Hځn,EB⊰ @"Ńߜw459PowN% :OC‚߳ip81OCQtHRڶv:lChY|w] HJyG z`2O l)I~`LZ [u`n8EENJZqge ރftML81x mW{حOeGŅn Gmx [Rh5HxzHD tlSY_;7áTz$}8P84`t׸$HcZ]KQ"'i[{iYR :yMY:b9#7dGGlEoW7 )`<_W#QԀم׿g҇PVִYr3[xPqued^U,d@Si. ^bOex .68vW.-%FHؑ|`ieNꡨ*|h)('01>m=^S#NiҺH Q)7](F䝶-悐dڻ dhF+?At?p~R1_625k>ߟbQ<`LoY5gsxC"XP_oJg)?,rA, dAgUs´#*Cu~i2Hwe 7oQb`vBq8ktÚ*HPi!†q =y54ڨ{Gןm5u@|ڬ7#!2۟ ̲ !FmWIEE.Q17K(phZ41ꕈ,"5hP =B{6Oä81%@>4:CDJI] ,Lͤ%Y"afx^(գlH +n؆^cUyXm}.؎k8eokHi3IK^,gj۰.d TT#R[V(;RtZXTe@ sW6a S!ΒYy_1:3$#[U1M.Xo=/AFbw-VG}(n,){c+_A5HDmU[m: Ƕa~?u)EǝIe K*- pG1b=>SB ?aŗEhWʧpXlޠ68E־"LiŌ>eSud60x[BD kEq)}bVn}3 J!bx(HhH)8 xX%M|Wv7c^2ᢩgSJL*=\2$]hI NTډ<16bt}#B;m9^8aE'a>#njkm:$+N5,B,mBtVS#2@]EK 3][bͽ yᜐ]Ysl9<Λilkjabol#K*l7jmEGB5y޼(M C1 iZ[ɦN=#xCrKuz$=pW=i32E76hlx83)<0%E #6ZP;9;ūxENqK"jBKU%G{aNoHm*6z\BS**gga`@ ۿRΆ6Bɷ!PtaI:%olao= Ψ:icWo^ $w*tcF(jbgI sr$~-Zbyk3IQ*x>P1TuO=cxWȾF#? &r0Un7]#H͉sۘح% RؑVj󿋘xgTrѰ7J$ n0ĒQ9*ud "9Fs&Nh `Ͱl|;y /H}q"5ۛIW;'ȱ+g וy4F`7+aJ꽪7`d:wաPi͑Pc$i m/Q`ߵ ~ -0i%2e*ꅛ#^ n":Ū4a38xyޚ#J;*d"5DygpmAbQ d& /]sö3S:xOpȌ%IOXv{틟BbJ>b'e.;|Yrx8WmMfұ]_[3;B"WEV>uRKzog NfuFNڧ61* W*y'ZGsSeK@6޽~:0~CR} /欱ƒs? Ivv.ҌV:E2/ 1 aA<5bU{4 l`IyJDSZXu[Q=QO ',/pE%v#ER ~gʻo19@Io"&bb ixΗOP;s42#"O`Oqt1W9!BCZ^oH1m<*26s$$ƞ@Ou~ A wk܃aǥb>DO+30oQN|^t:wBm˭tYȎWO̠&q}^qfB²cK8k.9c4Ұj=-~Qms@ժ^>3 6~'ODU %qd2&W죐Ed\x‹8/=+Dކ _F0 6O_۩3&2q3P^6'N$ykvYX†4[0~1Y돚 C(XK?R7iA~'^gO )/5 %<(+}W#AZO *܅_qw>eY׭x櫵🯼͚L!LS:-ؓѡҬ ].C6=~t_*1R3+%UMB톳E$"#M5eG邳R,ZISnN$2* _} C課\9ƻ ;A"60-ӾM(v텟 E"e!"VP^?65j|ʒ޻bٵkQC+"\:d#@R6=ʻW84ӝ'A"5k7fc8c1iVK؁Y"];1a؃M3d]65*!>?~>SN hW?xcO˲3Vlv@@DJӵVߜ1u-xl؏4$ae1 S3e1F(x-*,R6e "@7sK;,_ԑCY0X W@,:"+ 0({|6Ic{+φfLeG?(^4IJn=I/ҡg2RVRKDnEX47ArFȲ&ę^!iw{PCϛvU`,\MZJ2%,`<͹q DžO_uP`( ]þ3waS.!7"Gc!N-7Qƭy~.?DE45p CoƑd0<1  SZ-̹:1DrЙ|?B]5{t00j#S*7j7vksxrm7&w]࠵A Pxj.xrgO5xpZF䛫O{8`2F]RHK(;@32B$b7 }xM\>J#_P(qҥqUxOE`immb;/1 ?٧2⵲%l\n=q@"x1f7ʊټc%|&aw]c5PyxՑ#RU{m#K[SNҖա>x5)2,d]2!ΧA®ӵ &(nAkc7Zo Bc:\8a!'c\M,|տ8U,LU5ARGZ$ Wm F*.< .QKl̩*K履K-6 ۚk1QErޟm,ɍ^0Hmvߜ6!W¥b1s\%+;„B(؝rX˜&3& t\Nw:XIf@#XUsqZP IDHoē 57=۷ 1CPxTY!!.?$ ƒk~qt4O=ۥu,' 0ԫolz>X<&3FeceS,qUNhpCc"ڑϏ{G#ex]k7jt䐙$_*DH/v6xzNji߿ҏZL!MQ5~A|PJ>vp:$X;^tL"UuP-ɣBs%|1kZ-!TF' Wޔx$̬MWw1 a3sv\W}yy;&_cVpzR|ȿCuCnETqCiaƃVFLd79,M:ӹ`T7*`@Z2F¯2!GdHVĕX6NJ"D]:0RSNP !o;fdAaMbmBmQϯ|1ʓFXN\m}͓AP ,THGt=qdVᬞP__Z5텝W4RF@Qi~aW~??"D!T:wаoxufl//~[P(AI<}k+,DSiMdf W텹NiXb*Hp}|XzL#2ycAMߝ1ƣ/B{ ~`o70R,qF|imq#3e_hsH֔'T !Kf,tL{6Tk ?;[v a\Aax,Jd@Ek: 5[w2p }Eij@H&VRJAdžFg$5I Bu Tzbv˂G+n ` =j;N/kc]FhJH:یڐT=mYO}`&zg!* )u߱;aę9 VҧoQaCLG Q~ۏ t4M"ʴ57א={ՇmET(9YM}xн=%l;HUdg 9b4 ^Uo_;NRH5&;V!έSM; |m\rMzǹ!-mmPs3OWϗn ) FyD1cfff0J*n⏽9tG0A6ep>j5~WK^d-ֻkg_C`ձBqk*V+n$ &pouTyC6$}'z4642UH>`$9&퇱@%1SBRT#z8ԀZ'`x@5cm%0$-8S[z>ǒ <4F! ;~>QDƴ̱IR-$`Qo/0#Z ]*𙩂IJ( DYwL69Ū &6m _)|ou lnt*@[A$FHq+=Uf}ks}2\#ylbld3fmos 98z(%1p-I$&;?=[G"Y%T$ѣ01¾zԽ3⼎nv)Zbu+Kvp{dxJ>eV$˞@cH *RiUH" {[9# ҫKj=ۜ )l'l|/5At-X>6(3aFz`LSHW@f ,ugl%}QLf <=w9|j;H*N@|E dD1,іFɪHYNt7]83}^X6T%UV tfid ߿<8*G^C;`\WTL=JЀ=[U>!) X.x -5/Ay v[ 4H=p3LGYU5nN ajdĊF;w%u5tIU] ld#b5v _= bO;MS$ƺW搖 C")`jAx E &{U4@cmRmʄSe {U g/:ʧ1u7`F]z[U@nHOuFmzXT$@#};@2uefa-Y=ӾHZ &`낣$TXvaR m7m!Fx?j=ѿboYV}p,f9|TOv`cWʻaI] v{}8b:r!в] 9Wo\vuw}ywxBق7Num79_IL i(mZȌ} W3_xz`O-'#n#{TzS'( ;U/ i})b!{_Rhp} f4n ' fVVRp/Fo{w8YaScʒPjGPVECF&rK$q4/z7FS02ȠE?=JY>UAe 5ji0Br&.zpjp{E}z׮K W˕dW vMcYI*|N7@|Rf 4LsX'f[o{a \Vx]EvJ6*\c0u+D}mmZY[2witYr9޿QwsU,X9&[PJHG{sOzᖵ} 0/h`KԸqr2Ӥ2'_TLWsu 'Lf(azEXU -17G%"XuчQ Ou$W/bNb*9:d o·cS4 w\e~z};ȞcN9#A,/0]=p&񭸢VHRyruzeSc[bbˤt5hehP<{lWI[O\ĚXC6Bb{ICА^8hGdx 4V^:yҮPJ+q!BRI'(X54G3QN ;Ǥ\mXw](ǒ#nn2xc% [{j"c̊6[$5l/DEjդ vtefyp;n/?! ,6#ɭ<Fٖ0vv'P[~um|? ~ z9c֪nvϨl@JKi AH;oH4=~Vg0`!"<Aj=o0!޿Gez{*I0:LdemJPĥjM|.$ÔEpє;0Dl8}S,13Y!`Z^)L˗kU%]{`El 28˫Ңf^ůfGV cI26{{7-vIQ:^xzRnֈgC&r( B ^3`'=(TLM g}! Q޵먛O6ݵז.6]wu#4X^V -$,^6ܕӶ{_#Ld50@'u>xO–azk6Yꊱn9ӖPE$0 04.Ǯ <$I GNU6A- څqy'ܟdvI[*'YmǏҦ8$$O~BT`9#ʧ֏d"% .OPX|՘_t1sw.@%d`Ck%9e'E8i#3uxQƉ!F|wV0VX;cF끗-iI@h[?-Y OjJHyܐQNk+ 2BbBB ;WZOcH9Ӯ0֦HFsygZu -ae:(V$r,u\G -ýBJb~~ld^6W. 2OޡZl=,qϗ[AukM'U@b8?|zf'2j$ɸ+޹N}5MuWlb#v&M>%m3 G*GÍ'1uQv;Α vM ;V@u29X|븰AodnA]4g֕\$|O|ʊ'Quha[G._m^o|ifMƤKH:Li~)2 K :^)1!yty"pFw<ω4?-z؁smmDE`x~08u'X ~4N)):/QǠ";c1yuQk{c0>GQAʠ/$sF:wjO]">3wD ?o v{T32\C ;LE\Ͻg0Mк<\$O(҆{,4@RCX,y W뀳ڛ\,A%B $Zk 8FGzo?0H$ D kcݽ/QOŪ2uj:MUحbr-KʮtznAU|P{cb i\V8_m2tk?資I wqQ +mcj4cM$[R:w U`{ mwIGQ`@}93I$)m ڪFiX'AD|C ڕr]qDE o`?$蠌8V7Y[x;(V?ISs uڡ蹘bJu"1m~ޘfا+K6%IGƍMnwE'=I o>uEгPjAs9XI+fdGve=mk.QJeajqd2FSVt $<c'sp)I$% ŵ&uK!d~i& 5 oNJ^Y7fHQҚ}k:Jr>iA*i1k"cq@bIH3o]ӚNxkT [d2~uгPJ΄ /z5{_wN~y20aUn{N kR@u\jj ;$ICbYz Ab|)lD@L(q O1K"GfxBB0oyZQŃXwv<؛ 5s$J $F2QJQV(6SX|D#mNՅ쟸0'qnzkՊ(BHcD}9oui q݈?yw !6*wr|C\̑:5Wom=I(J˛EGdNRm<*9*$}J/x._H թoWo=4*8܁~mT*y6Y>Upu  eۉMP+e1'k1Jj\&/AC(GP#cDh? I  f.\YdGȈO~;68$Υ[KKKX+JQW̻,J*o7q"%`.x=3R_#^(,?t| jI6$Z2+4'Hzi2h7ghrʋRX|8\A6Y0ebv EH|7&ʬ,lHAGFWu#C`z_NJun!%HP7?$|5[j{0$|A#1NrMe(lCg2jq\j';|ieT $3Hlj#-} tjxwBp'I?>9-zhi32f$2FjCGJ߬r|4$%RѮ\49IJ([A_P==N&I ~VU6nw.e#(Ud.bT,rIZՔp}q+GeB,uOa *]LL5ҚҸDG6SJPAQxLڭA(fQy QEpH݇rޯ{3BB}l06 zy,,)7cX[ HMbw*wq^&9WZ]`(x=OO1S#"tjeȟ*" ^ܚNȢuR~O>HBA?Bu1hy\ȒIj( V#`V?ְ=JTG^G.X'-fkdS3kxԱ;Cu4d<"zW2f2$`iInM)G%^iIm) ^T:'Akj?ƱX+A`<> :HA|!XI3Hi.{bZ-k+~د|\W\s/_Ǝج-S8ԴTMo)ry`Z@dJ\+MY HÿF[X܀#n%@0GB 6Dn״Www#'ևH]WP3tm=c+,!*Ư>R3@4i#j(ܓȽv,%"[b>-ڲZiSqB53Ҫd51 xїDeW3 ک@$S(܄nt+zCO5;DUCF+VUE<6{wP㿮&0!/?5pƚ)0 @$>K>n7hu5%~S'Ǚ4s>:iY)!X|%#ml@uM:n}pW ߇ʾ8@[K$8U|Ej;mDG"zBmj$qK,Q2^ #f[#mȡ؜yRf40R Mfm$)ȊGR)#aLY)|wH3bD˨칲N럃D(4Ni6~1%;EJ>\7ڬ)a"$ύ뼄 C2}*@Rh1> zbm hf(N'M@#m2~Z`!`e4u}$kzr+!-3N}sy>B ^pmkVV$~°\>,miEǙ @5`آ"|f2Au ol;NaY.޾ ^tYVw #$Aʞ\.2rM<{;nnj’D".*E_1؁'8G ˨Y&q&Z QthoT4NѸ[™>Y8MYgS\K4cg{_>,m^#Z~8^0RBn޴qt SE\a+M94`p6\KN"uT}ǚu8wH(G.iuD=? 9\Lz Da2 WYT|TH]uRbY@-v>הkEOGrY$4Q׬9Xư:-4a$$5_ e'a wkk^bvI%HY%P5ہ+^Owg !coB4HGo.ޜ{Xk`k#>sH{^]sG "x2|3/@l oZ@D4xp5w~1b#K"rkH+]G.eB K$|FE $me4 B;"D z|j3HJ,5ᰰn#`EPάRCӼ02հ1_!'eݸ qBJ6qT.  8?D*J߭@6q QƨD-w6kMŽ5|OkYF]cs^1Ű!#0z/F!iT`'s־" , &`#n{sM'` ܵ_+nđ'Ĉ=Hw0ie"m`B'p8]}]vIb UCdNt̑,G[{{Ax35 v'jO ΐ3R\HXªn @~b<%$+5ZYo]4u;'c{v]s˧V,+WvKz* *)YdХ/nl#co/ Se呤c2;30 H,wھ6P#ߘB|Yb1>`G%47c|Wl8uċ4N-,2?u O½s0NDH昫1X/mO_6p(='8&5kAHrB@LUx?HY!pVc츙S_O:2eUydj3Egsϔb H5c{`cғ/H1ŽMQ}bըr" ?-#{> oX]\P".9eYCmZl}Ftl> Z FxƸT HrvPs.g0&sKrA:"n<~Ⱥ~Už سQ6Hq:IOTig>egX ڶe\fah_1/l@íP*D* l: ("J>\ﷷD>m L(9]I;mdwN@I>2 ~!(UX M!H f|b)E@;}Y48ftEV:96,K[Ab7I`[Y?$ڦc)ea m<M*MUgecIRt5'Ҿ4K*_},RQ$SlĬ.5 9oֲ l)<I{ nyMX(UFϕGgkX[}^S8Q H0oR7p0+,ˬx+k5 L@hHMk*Imޣ` צ7zHplvMkąMETړؑ*vƒT஡4pE,̙qMMpU͔yeX+WW ħt1,F8q^?`JfUL(ͥu1c쑋x:d$ԣO#K~3:1 0Xll˳LbMJv,56tۃ9/#8u$ A"Ai R~fvgHY2USk`vFz!HJAd{ygl3Ǎumx|PŅڋ#Oa|1)ՙ2H7 / iH&v4Q)yU恪;uɚU܂Fmg)ԕ-kO¯Jf:O~)O9$rW]V+5o yYn}ǮιM$^$*_@R v"Nԁj64ٰ=#:m:- _M:@i',lO Qq Rukm,")zAյ[㬱/xN;S҃%*$nHsZK\jb\N".; ۇ) jMKid^L+H؝qS\Щc1K*1,U7 lwf2Mo1 ͉{ؐc10+ŁuWʘ|2>?-2>IgYyvqLɀ~ug?ky'%%5ybE(I Zch>f<`8 0uGvqct5O!m$<1m͹ePf8O`Tp wuy/{Ʊ='S#o?"ʲ:7/c0‰Bm)-fotocx/data/patterns/canvas_blue.jpg0000664000175000017500000001032315247006660016564 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?CLbdvS؏n*^Y˧}*|٩ J|Dށm hǩi(R=I>SHO@JϒZp/<=\J~5W"ZO?a2-̅^* ē[ChY? UOw0zAi&'ץWPJOx}M泴H}1y+א~)v1hYm[*=#=^.Ңn̶Mi }q}Ɲ-x|kވ Ycؾn:zU ]. XѶ{#W?Xuh >G5xrf%48dM!,y*X%ƞ'Z9"\9?Zϖ1 έCo}'N.qެ6Ṗ6DOR]-(5»CI F^MRvxdcT}{ֽa0H[fۂ یυWPe\LC{;g_iW2FF 8BT5O ]-\jWq29>yuoH-qnaŬ-6%dbsT7RӦ{+=[fXf1ç^]j!]v`hi{w=j~1/lb]{X]#ݮ3桮[JI{O]!4[\yΕk{ZގF=Gt7NԑF$jpUWN_i6tw7zbN9F#Zojei/}N:_X5ZF({\Jek;PKM,T_$'ō >0~y_p-g~s(.ҝ#\vO|Oi6{ai&Rt2H>⋤Z a;l9F^n"yĒ.QKZ^@[bi qGW {|pˣq}p +"ZT;t߈c}ڗIYLp>l#kP;ww_p-_jS[^)V3O6_ 4Dvic+ xZ[e94m6b/&Sޝ?2F5Vn["Iy]0e؈$42DUͅgur^{zU$7?&2#_~;VmmG~T (kj^%Em=X?}^raw'e{Tu/t%碩< #?>M01Kj~o\}jӇ]YPڝ{Oj1H,kjDӷ=ٝ*Ig{UmKHLZ} \B}OPi׺EռŲJ}i;++_pŏǷIienem1:s֩OOmz0xM~,#g;/z̓UHD!Ϯ9NUMԢ"{ o-{K8>pj׃n5> u?S`v8'9M Ԟn]F1 c2}IP5eN0V6z${ Z_JW 8[ ddgjEЮ!znk׹7(;m6Iu$<$b&n::M%/5-bb>r6H99t0R_\jm&J+"D(AZ6zr#J-Kވʗ+u42붷Bc%sFZe"K&&r@ ,qUWEGXq\ᇺ Jc;dk{' TB,jgOti8<~u1 h a2fTuFXê˃"0v$uVt_|yt\⋵z[mXg8Z [m{7WRƩf_ -NL StXe%֟9gV|4]#R- l>xin0d{ڦM)m9m|Y4ΎPr0>ԍeexGN01vkfotocx/data/patterns/notes.jpg0000664000175000017500000000506515247006660015441 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?<.ʥf 9㻩,t.aK$8] qߥ'($4 !tAFd~XG,}gZmfIZqno Xy}ltQPY^G#,?M}Dϑi}87/sXǿ=kkI[M~=@B3SmǾ WwCpxI[ԙb'n၆F:EZ9FG$#;`C}8PT0EgYQңiXzZ5O>qrtc?>öz=KPae*TgrEKR7wGMT@Ze،. E`,|e ]TwlE,rDc}QET3BJET ߉nOYcHgԵ{D`;* ,z`WAiFy$$ګnGSQZJI :Ef2 + ]:#6.RǩSE0 +ͬ|URYirYuw H6 #}&Qщ;QP0+÷T;75RII7$ ݉zzi06 =9VTؽET (&Ht؍ëeK89=k;֥}.u5Xa++J#Xۖal_/q_[MQP3/Kmu]Zt`vͣc~'VwL"N3֮^+p#0 ֱ-Y{$SZڿ'_m3[(F&Cd"(,"h!u& 2y# 6doCj\GJLWV5I̮A(fDCs [S^д6=J-*fnm \4ACVRTuqc$E{/'2۽BJryŷ# Z=-Fq$V:Zqae&ܜ hd8p$\&I1-I,:(HJbweno_i2kzlX!⸴kXH[~bV\ !hV.-5;͐eh<ŶYf|Ə| >PSQ IJ,֐E S(. |Ofboek0)Eٶ$, yݷ WTqitWP"iVBXשmˍ0@|ӺF٦6! ErC qnkF v \ZkL.iAuon2űXAr]r-Z]62D( mYNwg;TA&aX*N//2IʼFSp<(,ѭc"i"m/ Z:Lba.v܆ 2 5}*։03ZZFLű*dG\ ѺQ{{>+ЬrEF!@+ho;})j\3Y2o-˕r΄[hpFcc&pp\2P`[ ; 5)/gNMZj!Crz {-J-֡ciBH3Y6ĪoQ J\f c:dF-! ͍Ags"M9VDIVYv*4n;XY#[b*8M(iXeڝm༒DA0ʢC\;)@w $({M$ƫ I'ڥbܻ0n#)rXh+eK>k÷dY|YABf ,.~M]Z@[NUf % +@ߐPfv[.YeeRdmȘڭ5QKeoz@sQYc%D)RT B_ir :eq4H#_Ȩ"E(jUg`Y3WX3{$QTc*YͫKyvֺrH5\[Ք^]Ov/Y1#QEfa@zb\%RD?:4b1J2@%2Qu{k.,ۘ7 t݁ U!*n(XQF[4cܝq(ŕE ;G0*(I$ ƌrbm,U\a- h/Z@T8i"}6 #cjj׳]P֯qk$64Cq:C); ݋3=Cu3i-`gL3!j|27RV?m[?ȭJ_pڣ H9-[^Aq=q\k=_bGPv]ʌ ֒ ʫyRmUA/ćoo]J!FdKYR#DA+ ,Vb qae, z$aGF$`H @6o@?bVgI"am?w (l6J[&Q ޏ-KR/${ryJq,TeS@K Hco/on ũcl$,{IC\HLhg<9E ue@#T?se-ދ{%7qG 6% '#*J!$num鸻8~ŵyv4qsu`( U (Pjv=6-e֩id(@09w:!u?. TqQs.[e+=KK)AK8K n ݬ*mkU. ̡v%Ԯ# 2mAvGaD$3o%TDY ؍$& 2&(J"b* 2׼+{E]\\mo |vbr€ -* F)K@t2#ck(p+j6r[HoW]B;s|>wv`@9 ܨCEKۜjL3-,AFH,P엗w6OnO&RRyq)R@!Bx|8OsMo-d&acB1|bRBJ".Yqp~sV`MX!es}s=ך=B]G2Bh%PVU8C&Y-嬟y-!MConr$~a2vl#i/d$B+$y\. ,77.]\YAwv6YYghRBA!# !d" KK)u{Ԟ[) s ,1UYJ"sLJu6|Eב+Lb$6b\QKuw$ De/EyA5dn\,Gh̞ɮv_*˕ge2q`n4>҃7%$2G_ۯQ"p7q+b22 `Ѳ_EbŎ+m#.Ғ39]s ARZzE-`Elټ(9*.4W;e`VUQyp b7`,OovejL/a_0F~ĬNH`i|^ӯnla/u$\r;DO1ҥuf|*Q%!%>v,Ja[7@RF\%U4F{+Xu kVL7n\cH~T;H> 'ѯeNy1 1eq ,+f` uAnYlwZ<6ދr)yZNT1ݕy$N2Xcky<7ZXO rX6 9iBAܸ#ozcK8'H֮Kuc<ul(*G{n @: zBԵY延Erx`PD2T (&C͐ {Ϧػ6V(䉙,ITbs6h+}>n@dP|вl)nY|Pqsk['hmk VޭcX>Hnγi6R m<Ǩk*G$#1}ΥUJ'UZ^P#Z=LWnUR $y܋9$I85K\Yb[vVi0 JQV\>֍.[gv .Ky "A,v,@R:}ig<$}gd(I"VՔqs۽J{610vݛ JN[SNun\oK4G r f#/n!m@y1^ᷕWm$Em',ekBr\(5{70b%NX4buM*ė7SI-0Ė(iSyp[ moӮ;ڵԺZ_@%bU*]Io"!Ӵ+;;Uأ aVP Lmm]:L1 K+CdTx%bƒ l[ !Ϋ}+ukYm䍆Юw|˹~77,zU͆l}SO $+ fE |21sŧLt_ͪ>k<֩G.[1V>m;0`fotocx/data/patterns/lightblue-wet.jpg0000664000175000017500000000730015247006660017057 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?u&^_?PEC,n8:O4dUO֣ؒ0$1î{`Ud s1Ӝ %cl$$vw߷c>ԬFJ F:c#4`(!F_x>}mr9tIlCCut c_\ddt44B#p*Iwae3$m@GQ hP F~iY@>Jrl 6l``r3ۥ{{,iĬk*! $rI8Omy }sp?O1M!V݂P@OφKsuj%QDY+Gy c?\ǧ,Tq{Vơ.v0XP/p7sǧ9 0 'yy`oqi`pp>zT9nrapN~zFgDIثӰxJ'<Ap8gWO'aӜ}ՙа(n@{ulq&/*ꧯ_ջ9 3ϻ*[NrWi,jow'*NN”bYI`_օm# m ϧ?N\*r4fHOedVڶiw\My5Ⱥ; 8hAr;]ۿBպ{#kO>ڔ-zIC;F`NyjmGb#G`}q6EɑI8I?4Ȫ#s~<硦3A*I]8<FiX[@7D1v3ǿnإuq㼵ǁpFO™gfm#z$ׯ^ԯ1;'21>OjF7 mS N \ވAIb`˯뜚kߟ C!p'>uF;thB2z>*}ӏn8(d9I!(#=OhGͲ3u'}~-_FO_O\4yKnr?QcZDB8ʩ=9R#K~gMgiv&MO"`8>uLe{ oL@' Ozv^xcJI]I1BTUX &#k$pc}Ηo!cs05BC~RNI'8Ayfٳ&"l#5u]F ['f МsN:(|0 }1ד1n$%j޴aBվbO۟^Ku",F#%xӭ;Y+HmpN:6:Zl"3F]f':)mRXnU^`6ɂt8')4=ns9.=1Q ʜ `tCo40r[G$Ӡ>ml%DB߹~E:>eT)kGMfotocx/data/patterns/pattern_131.jpg0000664000175000017500000005044415247006660016353 0ustar micomicoJFIF 4http://ns.adobe.com/xap/1.0/ 200 200 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?-WVmkV ½3",GLQBl@gV#IoQG{#eo4 Yᙖ2e մY^'}'S $n*(RGʆ% Rh:݀l W{YX.nl8b rJ!( R! /ˢG[}٧ˀ$ zS8d2`;{qsYkZhj'eVVGБ$wQ0ںlrF*ͽ70<uo"Xr:)AjZ @;H;K/Q4svB` ~)PV$+`=?4:`e+O(A#+P#֘,!A=Oj(C cֆ|N~P;, Xg'I9 d%?ڥ2p3H ;@~T?ޜ K`0.i ±^;ir;vV;yXvS`)P0C 3{t)S+iTPHV;JBF;wJS,8~r03ў= ZAoeg-̲U*JNsӢi> ӼE#P5I|Aq>cN&եo6.].GQkC x`[+Kb픅G<2-2GV |76!Ro'ZK{MVEE%Lp '.dG?]wAX~>5;21 R+fhf!rbFmi{T7\[m.ZiS=óJm (ezWfo?C%8GT ҥV^K.|=#h.wXʆ,!*D}LK5K7:31f0YĈXm̲|M>WUe]vߣZM4O;o-K5M&Mo 9Icl:6V 9nm%K`Maͪ2[={)K#fu+Ǭi˦j$iꒆC+bML#TlM84+CZlu:vE~Q3E1r/ܡB31UB:\YOWҴ:| 3=Ք֖0RC|*y_> X{kc%:K{Z!{ bpг!yg]A8_;1MIѓ˖J7[Nϥ' Mު|V'/5.J \-Y"UL02K1I>>cǞ"Ӥ`&.]k38WDxJpVڕ_V:v0^XX='ʼ~YıgEC eU^;zԊO^K՚.4Lmi@=ڡV!G{i2Cg[v#c#?rH]Ã9dOC.`=?š7*OvWʑF9<o!LpOy*]*2 /_O4Tv#aЩ6B@:f{($)Ld^vB_O(PV1-8ww%sim<灊r(`I݀Fvp;@^0Ky1E{k,X)tPy>_ĐũhW:7ӮJ #bH#<$W|Oxt/V6rͧjHf)nɝ+mx ^?↟qF|YZRhѢjW, )m;o3R=:m`9bɐ2RUsJn͖ X3V I."5ym/_{hbS{7Zzij<]^W P\ݽF,wƾ`7>_WL[.!_OllbK$uA+@+dR`& ʾ@-TJ#OhImn# 6Xq'Q|#k>+Q.wvU]c FϧͫO i;]_xm/i48#1y73y2S-q|kw6 8gNVc2ӯ/<00DA*ʣW/ MX(o?sw׿SaOwRDSB`\PW$Jc-$B׶ W8QYG}NC l6#mZM_J"o "Y󈝲7~ kW反g Ѵ;]$).m0aXCH$fbL1dzl!.4m2IotYZK P/ c~LjZLj[#+i#v0L"$Bߚ+&t _*$+ \^JJCiim$HY܅Vb8UbxԬ0wCn<_MJZ=SZ5C"sW 0uR  Gv?:>+9xƟ W[ Zx {Lk5Y")%y%8r||}#%k̚ċvhzu$"K .X<@2R*׵R/L9pE.n`:dd VR7B\s{%ķ.;$U0HH|aݜ籅Ξ]&dڵZֽmt_ |׵džx![I}uq\֚~$Tb)an# b1S9 JU 익<4%Njϯmqżs"d0=GiuĒrF T#(Av{{ͽ–R_T9H'Ne'3@I`[p˲{O6ú|TjUbx$3\@"$剒@a w$q`99ԻvpQ(%[j䎾qoMWZv:K]RKHL.$s!.\T=ϋS(Nik ![ ~H11+@*wQM:,NGˀ?h HnиiV<-v^M^.w H-W 5!FUw:kNMSb=-i>!!OOusC8 '!R4Y7^KƟu|uMu[_xvP24D )#E{;Y|M%S߈v_KM/ZZ\H ]"csTi]⿄υn/ SEhK%0msRgīiF+r.*54:=[ZZ͝3hW4UcDF\0fӸh\|o|dŪ!eRχ線IGXB6.OI@ǣSyTk3 kiϚkv2㐪ndaŶHSCw>0дK[=cM7RQ +3D%q"GՇi24?/ק^U6*\t 8yl]c֒h*Gִ!6Kc>J> |i9ƳjW7er3^@U)ʒ <18#9bk."81k@CF2vNF0sӟʕPI ܏>i8':TTP]ec=;!ɬK{eDYeŖ%_;e3  ʼDR#p~k<3Jp :y#'ǸA һ?ct٥X7߄N$)-,pKig5+R=:q#k6ٴ".m/%0I4r4z¿\xoK5-E &:T,@^e%JgEI(%d3Q}Xpċots dhk( 0(# F}k> W |t#le6@Ć/~6 /|com5D*N23kup*cbԪJk-UK RJ0"6o;>fV:f]YG[Y%ĐȰF{ΖleIǩ^կu^#_O#Z+Ot%HX z#xONi^ԼեXga0pi*Uw)du#+(NJW;Tn 4ac4ّ;G^(ʴt֟3J|9ƞ+e -I̒7 v[B6Bp -]}gOsuKI Yl%N" `gBWMqwxXLf&E7 /  PLhC*w#kg_ִѤK&ap.gPe; TGok"0 :Rӟu2j^w3sVĉ@#U8@_B9"om yrqWjyl8c\V}`C–$ g?{m7p8~trS : CCE N }tSh}h>YEr 8bUa\iM>imi\ŧj]i7TŸ`i4Vb e+ovo`)`b=[^_G 7Og{m0D-WUKyVDebFR2+IusRw"[A%5$/l#j-qVv3ެ)L (t`F"YxÚ:зxJ.nu*`Z4)J+_VMNO6q3%Hā$lo)l,d񦋀d3d{Wuwi񅻤X$z6$q_f,*mP+zsI;.r<0W?)`$s酲ぎ=l~=y>fݣ9sL\AC__xr8l<i$gF*Hv~iUws秽R0l{P"J|m d3cV!I\qF.Wk>*@Z"F%A4dg< c`9zhl!^y oƟOϳ9g}j6c3#!MіBGM T1>RJkVx$VDG-4+v pq|<ύCuh]nO'QTNh`8 I*A$arDrxZt{~3G ǡ9L YSM?Dom) iyMȏ!**A|ea35TMӨ޹EeC ,a9 8w8J,}3}᷀g<.o̶7a.'ui%R\\\˸ʛ?é$Lsyj3Ki* #;Buߴ [Z5.4[xsb% $̒$:r_> L6v;G^.5е<[MZeY3K}: Fh eAHULUy}u-ךƵ\*[QTdQTes;gvw;$fhȊLJn%P*+Yg tۭK:ڮAGien;Rm}ѱE˽eȖ_纳,kng4Ҕ]ec:ppy]]$GdhNu`AVV AZPL/#"YX)Ք) "?ZzAWDk)^[qGfl0FY!mC= aWc=Z_Yj.6K=/i+"/n̷a@)mf .vto/sQmxɮ>cs3_d?4Ht.wdHuע2J5M]?!|UѼsN4՗U5(n.!D o65 qfRDban0 pH'cxbJ񌶷>Ӭ;[hv%X< ʸb 4N/aY#2tebH ` AS_s wj6JqMf݁~k' Iʁ cy8W* csꦂ6#׽),9w Ӧ(~Px8RJZWi Ylg*Ǘ9*=?0. ʩ8@˴x9 8 )|eB`\o. n?OhSc%=9!nac$9YAV*7gwk?7zguKMVK TB4&{셬zWog,ڵͽͼO.;h O |n"?~Ӻ>.Iq4yrnVT(HP{y|y#a{Y5֫. t^Ia31$(e 5Cke#jv?]VS<4M#1ȆDU<=RM;|Yi⏃5[KTφŌ|兺hv;M Ԭ+y7#|+/{@,xT]\OHa Ռw8q9j*={}[ާv5A.H#̵T)H#Aa[ʀ2ieg{5Zj̺ ͙c!7 v b1%UJeWPMrj57|/G<=si#>#2ލsUQu%dw]++>Ɲ_m_7v~@'į\6lp08<'#' {+kOj&lNO]3ucq/O1Aʪ᎗ -t[Yo ̅Q yͷh14AE9ۀsҼ Z*Z[[<W8y/.$f3!frUAf8UP8 xF#Lܩc^O\>%VAy 2<2[i%`` Je%YI* gWc:i)kl!|N-+wu,J2?c־xixi'4 #eX w([NSO'=|JJE7Cz3.VϖÄw_1MWs٫ץwfoem+V*at^zNYյ+۫VO hW!#VU~'WdHD1 6~o'bWwe+Q }ukȣ(Y#6돛 ~ 4w6&ilX/c]!p #Igv4 `W=1?MlgHqs*r3ǵ zs88JN6Ns;SsMSW-Kq@2z9«j)4ˍWA&K}6hṷSg8 b,A0 e1mik:v—:ƥ* :,1Q-ÀAVy\g\wfi;mX*{&@c.ɐ2-l0S]|mŸCȴoEX4|(Þ!.ZytZnĿ<1 /`[|h*K[V}xO˦-%o.f$ĐwvXcI'kF ey9㧭dxJ];úlL$+rO7Yd,pXbǒXɭZg'c}PI6E]~j^yEf@Ѱdb:84  \~6pN"KȆ5gyQUA,KOlb2|Eqi3iWjbWcx0Ve85xw]"Zv J'-o gcudB&mG2AI2,he߼l6ƒ D#t>${.M+JNuspӼͶ6RIU淓ZBU)e}>_wߧmߕє%ZtԤ_h| 4Z;ѥ}BgZ71C4y7$ރ8[ᱎ(Q"PCE`a+>1k goS[ F-6 32I0 s򵽽pkP!Oo\SNO_<RSBV2{Kq X{H`C`7 TQ_r$n kV5pn9*pB>Z\`W*0FOH7Pʰ>ǥ vgvp3Z"x'' ׎*œ$dc83;o$l;j5ok9b7>pV>lXݯٖviV/ޡۍA JX2_5翴 h. 1Ga"jVDutêhM>+2kf=H&WFj:\-ѳ#&K)n[vpk/ G<4^){[X1Z6@ĉ)1"FL9e&-{|uZi&Kt[F4ojWi mpHI-RIJNqy_qXZP)5E-P(Zb$ 2{I[ ,4oދ_,rH"Yb dHMӭH&-wp4ҖH~,N 3ăjVOpLTq犫_rֵӟz׈oma\\q1 ,q@'T"8#<.06}jܮgZ$36r$,Jrdӧ QPD@چ9<8Ryn~e!qӯ0# w4JlRxOl_W-惐֒ ]g'$ =0 vF~R03qsjRdb<.0s$g 9#@搱 I`gw t'0R9#jI9#09j}hS@<+^]@W;Ko LŘI9$M5Wִ ;M֋C:Eqo .&w h?c~5m-+ C܍X2*d#!R~-mkM+EOmxGDB7XL[\v/;+mk$R=GZ{Wz6{#!!+t8$awT4}.Oŗ-NyǷQR!N܄`G 22:QHbn@=ݦ%s@~Z(2b ڞ60]F8Ttמ (I-F:D웂1\pt.) ?Qn<9][l֤ P4i¹Rq\P[ wH*NȼUUxQΊ)x$4$sEZ_:=)8c@cs%Նxn\/!!ZR/]DU{A7mKsi3蚎C vs:5.)}EŔyT)E1ݮM~#itofotocx/data/patterns/burlap.jpg0000664000175000017500000006112715247006660015577 0ustar micomicoJFIFExifMM*JR(iZ0230(0100Fotocxx:trim_rotate| Fotocxx:trim_rotate| http://ns.adobe.com/xap/1.0/ 8 300 400 1 1 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?n^RA'{7#^;op("2`5-yfQѧؑ~Z*lg>9]M2QtkwԢ]OQ-SRԡi~#r>]͝߼/<)Jډ >Pfצ6ІWr0ʩOu"o\_eo`L7o:[XgĒ+6Cqw:^kk{,MM_誂[6۰AEWeh֑Ũ $[nrW,l|+5mkYuV%ZC-I"8ژ(#js5vkiwp,rO%G,c#L)gCiu4ߵkv7\4vm#P@A&\V:mz5gfջEwӄLm}Q:mj6-7:0CxڑseZVIԬh/>e@t䈱%sw4B=D[R%ٴ[djn63\WWCj[A`:e /!XΙttK a~U];SE2Mv^kKBye;XFO݊@%G2葄k[pNK񼚸22nZZ,WpEΰnPN~~_m+&f3OQ4d_I,M Aݮ}-TBFB77L{3CkۛMMd5 0oWW?w~r>^"iZ[OCr܇M!Jeju{7R (%LR<˜:A67R'm_RҦy-wK H@x@*}:IF{FW-I#h5IVoYfd7%SLGۨkpG,B}ߙ0 ua&jeי,mIZt*[/c>5-dUQ[=Q./c3ILh廗?yvۖka즱kzCM3A}wgqȰiK%Ddp0fr皻ֈ^6zޯ MI/.Q0U[aVX,pWژVֺv4zDo-iqIvt_4K?u:JPc8fm>(Tȣl|Pլ+9-EAD)<@xHd;LWF.ةm9?@ȣCFHlS=(#.]px[;yƈS)SY6p֚Xi0S{%Q\,e$ڿڎfw7ohMk.6J+ *;MdeFEfkfOY{%or Le ozn޺;[D;Z`-nD-K"#.&b> VmSKmV-Ue=Ӑ'Ίy\d V9|WjSZ-lj#BF ;0c0 3z iZr{wE4l0K-սM;\bۉ>eAV*m}FZx|ލ_Ngo?y5ܦemp[UF55W[;ŵkdX[Ɨ-]v3a|.ızMeK#o'Q;h;TT;X ?It[o<]b΋"U$-m,f];/i{oiihMrvA=)RL3"onW9r{ >B,CwvB\?Ȼ>R[n6ڌM5A\jw+[O A!CF +&AnăImtH%t弆Pxv+\[W; i='7s6א[j7VZCyi*gEO5Kud?}6Ϣi: b- ZmbH&n0"5.iow{X#xĚ.6C(_>&i lKKY[H Lta_<sRI7dMQꬾHKw^8R8{Gdm񌧚۱U/[Լ[=qz\'"'L.lRsF,vwziulWg9h}#W*=%h>Z^qgxZt8Q;naބ~xvM:Gi"+ӄs[l| y#L.X_|OmC d"-lg;m˴|vZ2*XZFZh-](hQ_u!jvM֑__][j0`$:1iWfAZc KcoZݶibM"0ax7PPNrp'n,ὺ(sY_ &*%}ݿ2^]M$6..S xy-]7 +Kmtc-GrM+2o eJ6Akc[z4&lje<5ł}uIPUE\%K1h 4 3Xִk7S췞z4lk.7lW|˂Fr\U}ر .Efi_cV90ZG~*ƁmcAJAVYYIvim/lXp| ˗4׺iov: wSTk{Ǿu[˷7d6C+4UI"i~Y4-<*#XnIE}jYyv[m<ٮm ? 7wVD{|Ksr#fK-ǛeŬX-w-aRi^NӦk=wwg,r`߽ ~.ޝ+*50Cci _dsI,Lɵ QVM<=a^ڸZDh61Z[A237Հu WSC5+cYhwqOn Io&~b$2+nBMh:gKM&em' KBZ7q8cHٗr564|2LJ-$IQʹo.ϐpolKut+Omo.vmUyenT<9G 6-kr[XǣikKˤ)Y>|:zf67%P[mjSP㻶kk6,ͦ:ieSk;3+`֊*ڠO3hkwp4( ۙݞDg.l?.9˴]-n-+>P'H?,.lV֛LXipα(,HdB8wnf%w/[ Mutb쓢&>+|! IwlF~I.̶W,${큥Y!g+vK 7(>0A$^"ҭ<%E.jζcGqw/Ed_hf3EGX"M淩ǩ^+OMq(Ernl?k tҬkn_G$b]!WVfM;i2Z_475+{{=E$̽Τ;ܮd NǨg|I56g}.6o[R_Vյ|0 `'eKmPH~}&Xvэ]^.f=GUM5;O2d;O+D\^:Qk/k3PX4Vn׸ළ|ǂX^I.%ݶhJ%%٫LQcn~2\4z[`kܿ͒[YZMg-ܶڕ^Egq4:n~.€+|%oc4hll;+,4ٯaKx}Ħ\|C*mFw^6JvKS%yd>˸vBˌs_Z<7]KEW ѼMͻ{Rk4ղѴJXãm[(&0[*Hnkiv4/K}46T d(TDww-YE_g Ѥ" 4I`O;Gg%dyjXU?Zd7f-HeMWmn曒.)֩o6^<چˏE+uSvjno~mIInth/yhcRFΜKT',ֵY7:χTnqsqw/wURC|+CѴY-m}3MY&X ȿǝK%(sv%!v~:M٬s5Jfm-Ba"W0!3C_"mj <03Gl$ yΡCc!:huΟi7gRVUӦo*&S+%W1.P4;E<-*KylZDK2k)țq!'v]7W qNgkmieu66WSy¬ÝjMc6zce,"Ҧ9T]K|:q+ݰ||~V:h;FG+ >GؚTarQp'Z][J5 B6lҹ[49gISV 0[A"dZ\WԧmxSѭ涓V A r~xѬIn l۵a{KxԷz=ŋGq]J*'O{x4!xl2m]OÖOAt:ʹDYRhK6/pe*G2yn5\y:dKt5/Onw46VD-drؔ- Z͎×?h]Kb3[Q릕;2 smP V􈮥d':?6 Lpz5'%:ˆmK{UҊ;2fF[k ͻLA8 }X:W }sI->_M"wIVM^[1jEPe†;ӓk%3i};CnWp/&$ȣ; ZST4鮢ў?cGgbYH_2YLnÕ'VS~ӭ4 ܼQkh=Y,<[|ݏwJl=>IeQK>i_/Umߺ޽~j?#7'úOu麎>#jZAahi9^?"pcD|iYi"{vk"U+]#mhձAy4@r[s=ɉg{xɆU1eW  6Yf{c-c ̮*:H0Ǹgu6k"Ap!$ӾJ[|ۗcԥ\ZI%eB i*E ?z>xV/5 F[[[ZauYª+"."g 1dMB-sW{mdmڝA'Rk|6b-ֶm'TwgOA}]*l] oSkKw0M'}Fב,Fl@Hs`ۃ\5P'J_;]kf6ZjGu*ă |Ŷƥ 'DVLf$;M16-f\ŧEiO[ڦOCq$Mmci#leci]ޙݏi`540Ax{QOYMzbF Eg8R +7ėv^)[Yu9(e>co? :4TsFʱgD]J/V+XK&#<:초a%sZ>ws?RXt,ѣztul퍢 vMex&oo/.%[9x46r]k Hq03Fq.[ߜCJ<;FHҴۃ]}OU ,m* U.\hm x f쀴<1+XmöۦMt#!u) Ghۚ]a]*%M+N2Fеmw} Vjvhn]LFcp^8^1 "dLx0fZ[tSV[LRuh# ݴQ˝Ypj( mٹΏîZ5ў-|Ȉo2opT$WSkK6ڄqFu>Xs0kJ܋vO qξY-,>OhCgp]o-_zna|6;Fc֗},Q]Nt{6!_ ~\;F6wU6Vq4.%w6,0dD’Nuu}佺Xj.s$76;<_0_rIGa_OJgiw!V/u[<6K7͜-mCUӼ1k:kVSFwϣ.#Y `]PVj)&hs!?dl [C讑ŶUK4i>wrmwź[j,:Okq~L 2 fN.\3}WǍpkger6R,zVSk-CL6lQCejvX]eE%ـ[[fddBX{8FMs;Yf[55F)5_1I&#dT,cz֟ZZMe|RiIV7ݚB!o܏#|w:w#[Iaɻ]|r7%I?ղG~A]tM kxNqZ^oKo?'\ުiM6.UG=ɶmբo''^ BuM;SAq/t|2]zv|a[uW}[ƚ]Z֫i:}N-CY-QFe; &:Mk<|v&yn/f{=5R<ÿdcV`Km^]J6bd<4G;>ԞH;Z0oJZB:"?+|:jS\:\]Rnxi*C"MֽvzΥy=܈ [[:$]jF(W@(1m}YIuo0kn/]! >n7HQ]yƪ~TW^-n7U]7inaml'im~K .ߗ7{أЬ|4YZk}EԶděE*lP+Iņoܪ`b; D`UW_JM4wz\RM5_RwP>.̥{֮ڴ 7{Zwɘ\HTo)nM{[Z隊Os.>sq:yY[ ZfYڅ;mnbK 4[̹N2w]4\P\{d۹|̠5>?ƭ58(岎M`ݨ6gX@gK?ErGi4e_jC0_GgqL_?k4 ޜ[3 ۽γlld Aw>0LeG%s4.ns[=j m5z֩}#}k_P-~&{ aa mi`2vv?k갳sE\@>ڪhPɱcT|lı(rvlz#L7SiF/N-h2HݎptqY=^@/GEϷ|w*q+`㯚mFI{H/`.okuD?l?;/Þ'<'q-ֽ&godwzs$N/D2M!£2ㅦܝ[9j+o:??P_d E mVyMz[ۗYӶ;WKXg"e ߨ-gQltHnLm&~ğ2ZDP~tfV|6쫖wUUqpm f+ɯ5%7tMCI7QD#,}6o5+\Ej_gv6~eA7okww}&j"{׷E?m"y@Yv^vvku]J]VOi⼅3f3Cv͝zrǡqxmoj5{ S8thXcojxUҦH-eYAqrUc`^LJrv$,R{Qs)_=`m[T(Ϲt.[0 ,2\Y|3]\;eY\zVzN<Em{5`YUÑe[-/ \Kihqis,j2Zs1>ɻxS/~$\ֶ?sYi#X{[9W\n&YSMϏu__eB[ 3RR$0ҫXNZ?C[r;^Yɪ8['}*9N WKI_׮-S dt"]\\7+3;nUjwk_x(uncP5]:hM弻 dokld4Dy,8QO)'1m^yH'5VMFތewc6۾Zb\뚥"n8Pb ZņSݱnk$uھq%< |FXݝQo]G5$$7DJ9{I[[ьe;W醻ͳk//1,HLpGU%|7.-oxP^m&zdV!E>a>mvYkbZV[$x^tp&=|=Ummd7bek~+5eD~sHLHw|Bk/y-?㮝-|)O_}-r KX`6}+Ic8Asŋksb-ɻy]!9WqNSk=z˦ʱE<)$Y [˓r3_wwZN);M&-d[mN!mt#]pL}7 lU7,wíZ[jZ ƞD :]?Όu/C ei06=xHeԁmϩ˩c Y:> {?^8<'|K!?>۹=xnF^{s'qHd>ܬh7M9cWy%"ɻ{,xX!omѼbTmGt;giٻWtGE{{x-U,vy%=b7n+Y:+QryVa(rVQ%G(|<v2vuWm{:\ڨ0q#4lo:RmaYNEߖ ]Ns. u'&MYrY{tstine`yWYn&C*?<}z"Pkl:Z~JB۲ F +)ysmERrF#ӾgxEcBˈUd9G@x%T[4^tN,:2{7͹MsK$k 5"}6nѮW̵E|к_v.(mȺ>qw5V&menɦo!39SkW-KZkzuljʚ]6Cg\lp!2rm>fܛYCiSqw1gilo n7(jemEM>+E ?IP "Zbk9$vShVs}QI//!xll<ﶆdHŗ5yq+^]"Y5,5x(edƍqoawޯ|"M1Gn0*6߻ߕi%Fm~u{; xY[i^lxu+?~*.MMM*GwUގ.UiS :? x|.gpceZkl+n|2J`0'uMMtuMPO宑ç rC0j}Aʭl) Bt|Fv=jeKRWI/Nү7zr^jzqdC4}|$1*0v.n.5xe3@!4Hz G??2m5$ѽI{;.v!h.lWb"ߵ|MnZgm{ YH+9,mCw% gvaV|Gky"\[O>.|}ek&]Y/v?fc{=5 +F jWIoh XCuws11m'`gI'.5E0V+hKv^r*.pOgo;i_I$l`{>eM戯Pi]]G.a}Ao.ͩh):剮pQsYWS}r^×mk+0|n#O$ɑ1fP1^x9ao h( [gqy. !勳eJlmܲ \Ev ~J]A ^$b7KŎb7~Q~^H$#\QKMiJ}›tT" 7gp~iI_[%$M6ڭ[^D)`|[, =֩j -]FGmNZ̈YIWy?RϧmocWGf`O|֠Mt0c6[Ih_ʪ۳a߁*C]e՜m};}Nm840El9%Kn\&q-~%]佹۽[~MVFv'RԘのc/oezs2/.v~A I).{Hn㺋7VZj5۲+ibdڥ о;]Fx nn`a\,W7_%w ߻wͺꌊ- :FmWI3A U -so|zCa<4uK˧MsRc:]ſؾ#A\Z.a,H1x<ͦO :j hb~@P7J>\ծ5V{+[7rݶ>n٬+>3\-Ym֣ -ȍ5/')Y6|qUOELj%aa -D< ں#/URw :ݽ7A$gis3<[wo2]ԧ!KEnOXb/춡esՓ;v(5 kIdwtq2,ίN]`9Y Ij}(-KWu-e6lf0o]ݓkr59D?2mFin#[ CY7nR2k/]]^:7do'XĝW/1VXYVR$gXBa`a~]枫S[>&gk[ >'.%3'Ral;GD#a+Clt%Kb+巆 -.~͟h>Q"wA] ϛ8bi.&/-C|,{QꟺR;;WC尷mRm ',ZKح41N>Owf$5T{N\vFP? ,J jWӭsL`yh6m;Gw殲ɢܻizŧMi \"}F>B*aֵm:[O s4}al`mPĝnNI[B,s'ۅհ7[ E3$*akuUiWb3I}%<5i6l`Y1ٸGwVgAgqw"O+xG)0&ࡉ˟*ELOD2Y$/uf%I&(̩3Ef)Z " 굔>B%Ņ vwSm.&ڽ]B5bO֒^$w* mYE-ڟuw_on vkS<$t(;_!q"kWG-6k'Szjou\iSۻZٜWph[@hb㺆 "?icԥ2>cjk${6rộm(4 i>c[XC[#{jA+dqi#W}~ͣ[E²~+4}ܴCx>^xMT캄6ZL~s7ҕ+;hbԽxv{}AӵƲ㲰APoO$qM.XINV ` z6v}FU2B ukqoۑEr65C^j)h^hXuxmHm/OM }oVOl4!MSM#nYxm5o$L|~eލ66'X$Fwnxv@2Us=\[V4FZTm~ϨQvuR6mېuٵ-/LMkcu8u]b⹎ &Ei$!le)WbW ;H՜f+qkdI Ϧ!KV6{BɽX_>fHҠ8.mm1޶eTQ>empY[i "Gm52ʚ~li}nӐ(.죋VG$..=BMeyMϵܟw}߻LEwicgKi.O%ȵ衋]͎*0Ք1Cu{.rȎ-I>)3. `gs(e|&GNt*+mDEmە[[3 o5'~Y[=<:\E~8 #mS&/AreԐYkݼ&{p)~DاxH3|RkuHԢ,X-8<|q[^(me}-7'DcSt͢qF])r4*Fe$%цw3p8iu5tv",D\bO4׵B *hImwF#1${MY~ogED ]]6Ndyx.%u䯩sTy5b""K{\ElabA3 Z[HĶ\}(ב.UL.IQvɯ4f{5އs;l_lo*lQ(Ps|r|5]FM-|?:|_궰܈`Xvȝ}[KEqs%~%Օ㘜_W\{Vg٬. Zgɴx5yѲ]fn2qnIb5s~g]%ڐ/5"-c6M&Q{TIE,7J_~z5.Zj6VsCۛksmqAB^r;iJu5NF]VJWSc%̿؟p̨WlEZKyex{%ä 6.>og?yW9fq xi4Y]\-uH洛WVI+nftھ B6V3 )q~|ʂ[' crn)5;d7^V"y^!0ĬNn ūOm mcNQ֯:HPD/{3Kw, KB2Fܴ{#(:[h^)l4FĒf*b#mWrmFL}Ʒu=u [4Zm/;͊ #ٱ0x_]WR+ }Msiw#G:_Y @}3/wYK=ݵ:(9"lſw#)j> ėQy_b$;'mZ)̈́U5VўE ;6o.bZI- 6!U?ݡk;K|Kqo6ir^]GE";^KTTlu[hog:KAde`ySj'ެKϚ-J@ޟojI;q8@#X-tKu꦳t4st]cWՎHaT#HJ ;:~oͭ=&(,{do61>gٌ%qE$Bfotocx/data/patterns/wet-turquoise.jpg0000664000175000017500000000470515247006660017146 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ʨp zi 1=4+pL gWVyrm%ۂz}kʮW;4Y2$LĐXz*"VUCr,n'rw yր7Bmz JjniK*?BH@@)֌7($ {~4 VFbUA#J#B9L&YPGA ~PVA!屜lv ӡ;HV$(!As?FQ>q=y;-%Fn?gj c4aMwJ"Y7JFluoCLC A4 Aez).;HH$AOiD!N 21 = 0Xc҄Hz?>ZjI5Ñ:zP"4LlqϽJdዲ|=}i]~Ge8[ \fEprX~floC @bUDW;Ta(oJvW$ǖpUC3{}hӡdyF,<ՃIbVwDc7 m`}1@ vw7 'QH\گe!p7{U=!!_v8-H\|u 1Cȩnq`A險yq#lv@CtumAb=鐺K!r>\P̐cRe18YPKpHQ`_2ABˀ>nކ=>J",DN Q\⪾J,ql㞔FJ`sHiJl18 V<"ԯП~5sM |*2[vr==-'.\\l,\c}^otf* T BM1>Qs1ZF0ĒNv<^6u皖D4J dʌ?oZ@.O o&) a-H zPn2~v?wF;;P#@_%uF[ĕ,z4 ( Pnf.K9RUw( SD#"IxS'h@2Xa"pJ7 dq@{~=)"˜ey6.+ %.%m^VD/\ϯ*H;sQ_ZLg'->ݹ R6E'Gjm[i(Eh#aI#׊R$P$BU`P Pr Sm#$J )95G qfb b#Ir?/΀A`1d~u6[p ۀWGZF`wb!,Pqׯ@2p `0Jq NFz"a:9M 8>S֣y;e O$h;NNݵf`iH# [󥹒 [TMGB,b(oUJIJ@B1-qWK3л=3ڭ1G@6I QqCc,U2Gl|5G!enӫw 繑tik*H8 IH]Iv9|PąJ?'gFxP6g=)@eQ"*##,aT !Iޮwn2e<5@G7Z,QIfS4bKԦ%W$|͐G*FX#8;z #D*}h['W9fo=-Aw|Wu!$TbkF/EodNXEfmd1(b2yYdqb棊 mUfV9Jy f ի?巌fotocx/data/patterns/brick_wall.jpg0000664000175000017500000005716115247006660016426 0ustar micomicoJFIFHH$ExifII*  (12iZOLYMPUS DIGITAL CAMERA OLYMPUS OPTICAL CO.,LTDC5050ZHHv558-782007:05:11 12:32:35PrintIM0250  ' ''''^''''lt"'@0220|  >|PJ0100 R  2007:05:11 12:32:352007:05:11 12:32:359 Fotoxx:resize|resize| Fotoxx:trim_rotate| Fotoxx:trim_rotate|OLYMP4  ,Lddd 8ISX558[pictureInfo] Resolution=2 [Camera Info] Type=SX558OLYMPUS DIGITAL CAMERA$1' |X''*H"s'1+3=``sIa1w@[1 \YG   2 Fdz&&"&"Vd\ #ASCII(HH    ("&#0$&*+-.-"251,5(,-,  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzx! ?iȯ3(Y${Wv#&ޓJq܌7qKG\tSYQ0 g=Jl62NJv+#'dӘXybdH 7+KD-UaVlͻI+=Ǩ,2p[TSTĿi1N26:w٬ë&YVج֌f&oFeJ5!2\ZĹǝdCZ(eXҮn#o28QY'?F~$^Z7W\?JU ỺűL^=)s_b=^߿أP f qN[o:wi{݊~Ͽ,Eod(\r1~Tw6ڄS5$dF۞1ޮϱq!(4U/1K+Yc wDK#AqnF S,BL\A!,o~{Rv(k Ze#sJ=6֦y]F mn})]Z-){ m6f08^c4%B㯽Wi8[{$-Hxb$82Ld| /9qԤrAd1di7BHیw= :#GSRI&s$vwږ;م=vOګ-n sM~"X,]d  V I1Uٟ=OR9=hWPsIggwp-w;S\Be)~KO)݃'"؜MIJC2%(ůOhA{D QA})es>1lzsgwZwnۄYRk2g?pq谾[ϝbpc})]^&rD);1⠚A9F%0,sRi8>ȢM,024{$q ˱vva9O\DccTi<4J]ОWGJ4j_ {!d7{fѐy/^)!̜p)="}kAJSJN$L B4ۘ>\FTz(mY"V rIP{qԚlg+Eg6+,1.1 V.$1^x)=,))$0md0;N1P+CVY#gRW]&՜"PddoL?ȵev0 (7Iv)Slc@cqfzwѭcr33oo\dN I$W:l2\Zm"]֯_ig<m=9$ .>S ҚNh hdU,*sn㺚 n'E;x8'~*nW jʢVbHdS\{ q>޴Co YI18?*N)u/ d4cB1s$)䉥rV", jIqE.-Ly<DR2]C:qr So% 'HgO®\{RV9>] ۫ p-ޢKV%wdy{&dktr9y8Lhbe?g?/uzIcJnIonYыKHPp=QVv0Tc cӌT;A% O%3WOE{Xε۵bI>D LMI`jAn$>{ЃV^:kseHcM5ě)BU&wKlŷSNU9B =\X1O< F1A$En*YaAjjI^JIsD<|<՜q4<;]nϯ֗>]5L96W(b0@TK)P =:ª]*]PinX %9ϥR!.(&=VZdE|#Ov%R}YR`e2~;{> dZucdəjmYZԼ~P01,wtNҋ=~f5济[GԌjFWsSͨYoo oTc#~|}=}91RZ dzQg0̉ *%q’3Ǯ?JqOII)oo,drE0=⦾{{{!v@HA'~ڒz?>bK,qLLi/ "[qBM.Y4驒-8sM;J56,,\%{^>5N!`Cܳ[ba[go{{k{@%U636y6zoKtXXx"XEns1ނO.;22cgAOԟA-4p\3ƒ $uS?ٮLDi{+WOBkihc)i21;Qhڸ։skai+C&WxE 1UM/M̒S2'Q3E:K[~R\0A^z=~(TMnJ aXK[$twg` TD#$y##ғqhƢwoB{ci,}#ݿOn])]B}J[ٖH0`daSw@InűkF$َ#gҋY)Օv@W\JwiqqOY&TdI c?7}@:a$k7Ϊ_y?)'(m, ~3We=S *YL k+%@$}WVUm+t21e#OcTSIiDC @E-ŝ3c8'r3Q h#U'*yb9#K"21 `c>5q^/qЂ}:6I7WT`y*M;De[Ϝ$q(\b}Ddq9MG(]x8P5%[[̐%|"b'* RЧNk~D'NS 9Ge1?,fpf#]1,œ+Etc%;Imتgw4rF9Cǧ5mXﭒ [By)$i/hBYUW;}i))n5ř_r_[]NYФ=`'~d裡&\2'卋!e?f\m@ .8^qz9sBNڲ$bB&[,H[j1; Y8@̝2Si> k{rn-rH7 7=yN Mtor"<JesdH*Χo>>V d Ӿ»zI-.Z6<;Wy4ۗD͍Q18{Ѣ OH=;-+k,-$Yu A N6M,rOIKf\f{zWpC>i*]I0?:j*Y==;zu'ܞHGvvW~E3H[擎x<]7tX¶nW׶jղG%ʢUM>I`%9],I.o nybO"G0$}giYid k{Qt UTBoҪ.+xQHQhF0qkFQ4KD8̅xDql$IDmp_ kyy/dž&QXXd_Å`59{զV2\ Zko>Photoshop 3.08BIM 8BIM 8BIMhttp://ns.adobe.com/xap/1.0/ 1 2 3 0 5/1 False False 2 False 0 8 6 1920 2560 2 1 1 C     C   s" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? ⮻ Ō-Y]ā\A+GBu-ORn2JprA+|E%X1#_yI-!, 8FuusqRKd$xYRm +:^u ?Je} #+~kM;V|';1<{YUnI~$a*`)zkqb3(eP?J~7恠>$i-J~pX^{mcτVvZ)^qש|[O,zw4ǹY,dTUh_w3UT:m+r y Ƽ+kO_^+C=i:ȊAM q7oj\J!ܶ7 ZkZgwu ens] 5SWg=YgNP=}u\Ao2 2j5ʜ7~Ri޵]k#@b65ujW\I(*}Cμ)6z5S4V֯#;ts-JWz'\͵g r"kmmTŚ\]BAI\etvrdfHg8vqIKSU0szW⇊hVuE>T}^Q!y/<4o19WK:G 4gloO id1wek9c9*)SMNFs5gN] ~Dn5lDDc?-kĶW"nXgeJ9ͬ E7=rq޵+Nt%t-cB񥄰+冟Hv81+| ,)beXsUF0'cA>:JsxZwzO<=i4f7DvCx1^go̙mkJ#dl$`1V%:TRru#ff_dZ}i}6R,eCg kHZq͘ߺdYs ýͶ ڶiŦ]oe8ƛSku}3-`pƶȢK:'ۅߒmAq\h4hbld\Ӆ6Mi^st1FIdrHq v7;A}3]u!o_:v ץt.4 6 -MkDG%xښMa]IST~eZǂ[~ NgZqm)>cGbⵔ劑o(n{_m,]yd+,J:Z5[g伀<33{㹭_ő.wm G:@W,. /zs\!ZJJŶXmgB'wZt=. ٨%5AN 33y48>$ MI䩊R_oB-I1>uF*G^Aϰ'zbq8~Z. _3nB2 9Փzyk˩p hee?3 n ? A j"ϲH]:8pgAk*g3\F0\;Zteo-Pj"y\NjԷV7U\d׫?G abx=^a# 1hg_]Gk=BD(5E5Jfqmfm۸'-r2;~5q躌bI! jLԼ-- JM'a{$LE, |\,uxԍ%vs״>=^AՌQ񓞃sھZH8{]wq}; )Bp)e=nxMmk\$.r g!ԓV,^sɡ,sYP|CmkxwG0!T&>QPF.L+b.ECo^VĺT$2qMb&.:+扄x Vִ9mi 3W;{m.?7z :su%²c/5"Is,~" WNi޺!TpiMwrFg} |`xxȯh?:yc&"KjV-JXEŶܟrPxö@]ܿIT  Βٶ[' Ru.C/J5Uٯ"5{4ioL~L+3 w'msw]v Ci2ċ$M9{TbMpu 1dp͏αxI[YdiɵWC%FsAb/}䦺xwY4BoyS&s 12HlIs,GI=Ǩ#ܢJqg4Gҷ()>w[oC_>-tО>ej *О3T M[' CIWۏa5Z\,0 k/&UyT|ߐ]~DcK 9ut^sq{q3敚$79#=j)>4_8Sd\\ 3pĝF)}r _KX-mY#SsJi:hWoCYkvP𥶩vJwRsd2#lxxM甄%!n~VlHNyczV.wE;0 #GֺSj.[/TFf| CjtnaWߑ].xo v_yInOQGvKYݸ#Q\@a:+Wll5 jeW_irYLr^%aOx3o hG,:cXUA{2ƍ+d,_)`9ٜƒ?=k*XI>CRr^&.AMeq3#&LYgԴ Ve-qET7|*XO| ˦Zx#C 4͑V ~ Gm*h|P_<.mݻ洼h=W?㛐GFpHKvzu= QsoI x3Z_GLapnVfQ֣|GXW,P#k[_ZfHɩ]緖!ACв'Z0VRyߗu-^i'~,v;<籫V{x?V|Y88y1r_j,=F9|9{ ő }7ץAm{{vTZJAd'V/ ˸`l{jD<)rO>ecwӚ[[  U=ʸ'5Oӵji^I᰽0ry8<9"I. ;Oz' 4<5aup+M"m5o iO$ߏҹ𷍜:[a=91]W$b1:*O[#Y Ǿ*i 13{~dLj|7vB֓x.Q[evKr)ҭ'SO2c/0wesȯqFfΞqצhݖ }~%xXnn CGHԎ2N'/j)"e"R[Ǯ<]GlŅy<ݸUMD,8v'OihyaShYXecM];~xa滇ϔOd+?7^ψ>Px,`FYX ~+ּ=K=Kych[m3dfEү/s6^-ڏtyR)okGóx:[q0F?c('՘ן/n `l\1'B͆a4V9Pj6h ON\骎Kڪ¨>Ts^ T-#x` hsv6̣º2#q2>/?.W_Y m'z֢#Vx}fݾG6zq\;&LWDa}G6v8#dvw$aE>TQI*ibi'NXݹ_IV[^Gb3MLJ5[Na34p߶'{xE lW7rØ4^'d]KqH*~"G"Y+ՠ=ON4T%v/4k 9>zmWRuJN#421'_) V}E$E`jA0/ $ϾU795LMjtL;&%N1 3k %̨Xp`z |=,M 胎p1vgex$>x۟rGQ7MQw[ wo .˷mmsP}u)uivH$nⵆrrK)ԍEGEsvU pp7"~/Y6)jѬElbR8fsTO@x?]6Fm4 +9M G߬GuH?kkay>mOVdL7J&?z<<4hKO#>.ЧԼ#Z}Uy\˞$16NUm2s6v޺=#dw6;zUJ 3'G笤C|UsHN3XH[OwoJŢ6w}k⟈5OC]Ev$r8ۥyLj…5KJYc Tqq d֚`K=JC"N@+CM4{gOe^Xbq޹ICi.{#HV!pߵYեןnY$pFxJB%c\]H8K_#u>;º+*dh bfԴڤR>p ڰW6( ^z~kUѹ5FiV ~RNVݙIb1RZ]&xHɖDR q\ľ% [OT }C8W.umFt)*LÞ2-k3FFIʙ[߀N}zStl:GBn,[iNMeZu 5+X/2 &ϱNP{r'^dоc@'#ZkۍVԐ,R4$lgnJ[^8J\ZjU:aQ0YH{ug%φx.Gw}M/t{k@GhcKZV߃W랕^Ou9P9FyڶTƝ* XU֥CJ{Ѥ=/w5m"5cG:.u?WHFux: vxK糍W>DgzFs +ZVGy,p=9*=%YI;_ ͽ> A??QEypP29VVSVڟ`F {Dzh> ?{Ku!#'Xx;SxZxv^sV>>I$׭L/-#)r}Ho-zok\HcWO0+5xPGacz4_%Ms RRRj4pUyx!fv+\nAoƥ῁ '$UEcdy=k]Hcy- VkZsH"yKm'p99(+ӡF0W{>U?^7#vcEt!|{;^k{BB1 9I& <Ȋ=, ,kg9Am:PN.ufmg2wY9t B\?QXw?9*w~NF^N0aj{O~"ԛ!.Ğ~.Q AGCseʚ8fNO 6 ߮c)Oމ69c[c\tqxO;w]F6IfdL DL_8 =r;SMx#Z4Wܿ xW^!e9̛m$˻S]𦁪IqkV3!`hmMhIRD9]Q=ϭIkDMPqny\I%cԖF87aGm[>?=Ml rzp+_ n^hv; <ъ5[,>ОuG뿩 /BM-<]oz]lݔ,Ь{r"0o\EQo- ~_? "Youok6W.$H;h|11N롏 \f){h<ڕK-h[.Tg+.OC o-k{H}BǏ5e q,'VSq>% ;*-";=%bm2~O@+wkqZiR ۃEiQ4bҾ!~nv) Oj];NJ7ϋWl&q`ttQY/oX}`U O^5Kx#% 4'p~RG =Nz座v]nhJ@hQ##EEi/:uįd]j4G` =QXe_qfotocx/data/patterns/grypaws.jpg0000664000175000017500000000270115247006660015777 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Gm[fi)f8QԚkY{}" `;Z6bBRI|8,HiE*́vQ(DQ*bKy0WҀ#((( 륲v3Ͳ:,ʑ#vӻ[w U}<ȉ@" 0Jgާ[kk ʹ'qbz׼DZjF jԧ€7mat#5rVOoZM6ՠerwcQEQEQE ᵁr\>ðkZHg7ditt"(ScM_UME>0\ c TgsADu=BME'Nx亸xmuC(?Z֋ϗbikah@PO@T~[zu&M RI=* l^LM8@TQڊ)F%B2 :uMiυr"-́6^*3_0߰E=gj7em%ĭ:xBҺjJ|4`wZȳӤ^j(oS[1HTv (֩2MK-HM!#H P}EjwvV-p%#hު"o Uje2yef?4ܓ 2((Uݍ6}=@k?PvRTX8QI`Pj[QE[;evc!ʒj 2XSI@Q@Q@6HĨUuŷf^9#NiNAN(Y9{21#9eQZ(fotocx/data/patterns/geometry2.jpg0000664000175000017500000003766515247006660016241 0ustar micomicoJFIFExifMM*JR(iZ02300100Fotocxx:trim_rotate| http://ns.adobe.com/xap/1.0/ 8 240 360 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ܸ]EZvi䘪۪!޻OE" Q&Ucp#>{SW8,%q=5^ S\6V[rNI)=IS־\gS"m&jJi-.I &?Z:,nUv }^bz6z`TN[hz$bYJ7ug%A=sq5֣ mmb-]]3a'2?=X ''g/޸cmwvD !G$O\}p˲vU2N@{TEIs?|@;T^Eg$9<|k[^[my, H8vNqxl67nAKk9P67]_,9Bg9jW[e||IS5b Jۢ`Shd?;u5v8]^f) g*On3tYluO2Ibx@~p>b~}cw?obiw1T 75M",uwS:1_WEc}"_@|;8u0M^4>Gԭp 'pK|(淋NeQ|?u@>x_bY#B'ՎGZrMծoP_՗<TIyoR]?NOCL&&S_2hm ۂArzdjzeW2oZLLh+3QڸoR%Q&,y2q֟>,&TXNӦᐰYCac%òޝ1М&OWVO+6&J7Q[?jfz!I$.xe1&XXX >u \0KxR#]IԜ̕U,9?/tT-wľ"1OEh8ɬ_>Mvun;žW{O >]hm$um ]`rӟ|ylah6Ƽ<;F\$hB% 007sU+sM"q]ܜl=kF:6Id[vqnюX:aԙȶ =܎@0c^Vowg-/m{mŞY  Q[+uֵv40OgR6f˩0ƿ(,#9r͒7`ɒH V6{ə.ۥ4|zI:P6_D~4 j^#CFaTp.N[5k7(Ҥ+k#$ryֆj~:Ogs>8n^gM xTeN1H>5VDxjz[0nu UcO/ L<+t- %Pς 88ƿ ]_Ao!&{W#dLⷾ nsEAJVi50U|p`$pzI8xo\\M5p }sOh߅d'8~fӽ^jG%[$ dzݽtkY.ɺI|gj;TY-IJ.eٲ C`z gFig_kg9;cBCX./,6!:?S x05 j/{S'β8 d|#uT MGÚ_6To '˘<:jr!9.ěp;c6i:2G]#UkFR-7XjA-d?0=F1޵pq!$]W_2[T6c?J|)u8[mILIvLF3 Ztx~QV]! BxRzJ-KI޲q|f2#ҁ )'7vbx?Q=1rrqc=??EJ o4x3@`L+2tw㯉3\]\Z1nu @Xr3\6y+ S 1˝w'o㏭'.PhRjGlT oG^NvZ{仆ǖr[(HFmG.>t+L^pCHe }m%kEc"y p ½B636NKᤞkkVu ' K^I5qY'wnޭx'SxB&J`n忼H.BI:f(c13?y$g9Y. '0M2شIzwo{s*R^&$spNdƸE^i5G9L2 WϫCwq&& .B(\0'ֵQr՜c_ }RCYGe=7qkh"ȾQ~vRO+_4xGƷZB!fLq>o=$~)jS3i]2#tZD\9sá;sN=_^+ߜr\$@UKdžxt}fMecpr|6F WSJJs4KkkI6HE.$pbF>b#cy{$smeuH|:#wd^j^ȇPK,08@Z>|Cd{pKyi:Ձe9u9qFZY\igIt=G%qofQlVHgɩҼ EHgT,9?N< b]CL&y'œf"4ӦLanZ{K#]jz*j+kiL뙯bY8>bFszOim4h")K< CFH湹uw!1[2]nO^–_@.1c3?@;*VwF܂OΓmSf$NCvS7ɩ r|m A 2K`6euXP֦;lrW`+NX5sVF @ sQf٥vy V2B>|g5|tqge;YϺ*D;ee3!y+4s`qדc_V kxmBz>dLڳNʺ/ltA#?ޔ9һk;I5xP9 j63xP\sl 3v㚷>t5\+0GD :OBhx'NK6=ok*DǑT+Tnz^y+U4]S%Q.FGFI,`WD4Flmغq29g41zPîFw{Fy~I;XVl:w% ecPbӈ* zm^it8nmo5ml_#hE|gy])dW%\cq;׻|9d^NѩF?S s.EԮtoWt8%g`<~b*oYK]R$a<{)$+|k?i]RIgFA6sNBG6RUb1u`<~NMCWԖϣk3pn: b2L(98g mﴽj8 rTWPet~m3vNC ܊ieluD[glź/JWk.JO^)h1 I.s`n8qeլ8؟8vA>kuk;lo׈5h&?듂[t J7Z{@3+=j-=yPj/%;m29N0`k?Eak!ȱmA8%Ab8y; > vgd\qz=/Zy7,?mԮ!3GrɴTT4/2}/OC)"q݈W'=jloa=v!Ij2bFmQpyH26*s׻7>aeVO-'*}pPhDTihn !áOaR<0;o,F:.8ڊF}u1*V^ka C=cud/NFkq BHN(SRlxCAOj~lgff ' Ic<901^e&=09Tr88zzlZNhVm>q:rʊވǡ|=agj< 3 .оqG= <!~{۟j xA\$$In1zυiFZU ,LCMG3x3||AQ1u# X,rr7P튫Qۿ OHcp"f sTn  LnP+cqvg,y/uf>6̶֭wl20p@eRspw%v>xP;gݯ74CHk?F9=w WsjGi.cvv( dl2[ {_tua]r[㫏I*y<~ nZHԅI'+.,|{cͪbc|0$lp38!y5|Im:ځR'zv:KxJ}-mgF$v8 >"ա"Q883n4>ԼOS)8Tzo_@1Yx2lE]pr ʷ}2m߉g伈' >7CDE_GGT,ZWBzӿE2-ukE  Urx67zy,l'm6q 7ǯE8c>SiyyZݹ[`(WʑȿhkS%(l0P>i FXG"TsLt'Мר[H24,#*{d[G4iqu'z- =jSN۞Q=XރM7!{s"*yo#Yx^Dw[@\!y:~ Յ?1l>jEbVGagU umMOTGivZ0 %‘m!1 xO%峺{5dxxvq޼Hށ99Xm5*~6{nFRJϷ)wȷ1X`aqQHOU{?æ,صa5Ps2; -OB\]nC9NpI|O|BѦʐcεf$0w㎊ 8p_GrgF=1sBWw5p.9%އh \L1v,TYj֦XXh`c13x$onG%mR2Re=77OV=SA͊ i#J61\5:!qVgctzm/ 8\g`gL/>ht!"Ӵ+LLx~bĒv^+;Xuo܋jɎ)ۨ=ٮ?L>n`L}.$$'q9i'&3^U4E?x " a"(IddN!@ѾhPê(a1l@9NA,s5Zrso˒2~};ӽMƒ՘UMMaᤓ&)69nN {$.-N&HeHGL=N1][*CojC+[sd3q=+2KG4\[fI9 9koS7Zqp5u;Ԃc^xF)ʃqerIWgwʒ9ּozT%jG!#p3mcס?s%"Zrcr '78=Q7-H4淐6ߜB#' mOL}ԻYvW9AY2e\EG'gx=i܏跚Egl '8 09f[-:|mBoSԘDge`f#܎㭭od$! BQ`R`jkFBLV6`\FIS'9i<_h:RP Is!cw<.*zìzG'~$4rQ9*k:|4eOYHdYYmXݖ Mk(-ty(sqKW Tz׏m^hZ<=bI5|lfu-!V =9g+-w:o|FIt]Wu;G'zߏ$nAZw!gN+Ftܬ2&QMRJXTCaubn_딑I,~֩qG[hZhyi\Fr}3#0Ď[wewv^mNxAj __.*67fW y?Z=Zhw> I'K&N[&;=Ir7g2 8sh_Gq#g7=Jdy7Euq%ff^[Z-̏*7M_a@R)[Wbu{~U]*ѓSYͨxoZm2gTe7 #x|8*KSjv'̣qR龜Y,!Squ$,rO̽Fw20p;U⮡{vmť<ŐqzĶo 5 6ylo{rsL n/D >l|s :UEqM_w6I.IKg;c92>Qpxj-1>#`^st7R2@~"\K91#zr@:bbM&mAu[_E뻑(0*[I%㡶>_kRګzmO90[w|U_ E&Hod<]r峻jYM2[+9LVNc Œc5kP뺌[SZ7QS8O$)a_٦5>|?m:q ƍ{M[KnqsIZpEBrM! }&GR~c7*mZͲ\cW|ozCvTyVp#r瞂)oy[⻍v'A w~q־4?'YmCRHLD'~b$.3|#f5R%+bNqȅ0p{NL\id BB8eHlpI&v[){O~B.^_kV1r]O+ssAo{\3s & |׭dYk.RfF>\c{USI:8fF]ޝ;ݣ|GZ]ڵ2i\Na|W&Q!tbYQ%,s6ײ]獮?66 ݹj qۚQ-%5d/#Ef#?;+_21 Ek],aܩ-(+T]ѐ|:ujtÔ +LsmkN87s%Խw kU6:k3WP*ݿ7OJ& w|k,-e ml)=pNiu* 똩 k\)'bE瓜 ׮xXV `PXH>C W֧qj`gtbsܑzu-cq C2m퓓UKl^#7w)L o'0y0wO$~*ƭ*}8KDj6ywcu>6Bm#svKn]7UA2H/B (u`>8Ft=K R}VBiFEr v*p΀u:o~*bLA8kBC3i'A*Qd$U/oQ"BHltj/ɨ_|?+8m]!qc<cT>(]YMr rF7ңn$Lķq3P;'? 7~cfotocx/data/patterns/fluffy.jpg0000664000175000017500000001050015247006660015572 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?/.!kO$'uہP^"5clBp"!= .#vQ&}n $-Ƨ%jO?WZIEr\ ZTRgN}ς}+Nd=駸`ٿ~Ii9<Qu.lֳ (co3sզI$V%EAOAN:u\+9k`2-H ]BP[!7䫐gG}$3k7"8NcLOl{8}(ⵎ>aWHIqN.SA&Ԯ҈T@ѸLsǡ.#LEOD9cOI>SدB$q=yESMtb̙`S1 ՒL[#'=+nPl,)~-/mdwjHG2#dtkJlxU5ǎCG9sᶅt7onӀJPzNz Gu (|>_|880}V4;a{tv?GO~9}9tU$ٗH N~ꌞ99{Zvpu Z pJp3߃׭hA; $n? |9YDY%[6MPᱎ?Vo\ΐ56l9#zS4fܒwj0#]sNkH7zfYx:a"J>19<$~yǯ}gM[>lϓ989t)^%gtҮ>8>,[^'}UM8Yo fDUIt7 HVP=~2˦ؾߗkRIvI\?Slx\WjD!?xN3V" d%nD(<.>=2O>u,aSG -A 4l??zZ}8.bI$nI99ҫ bd R`Tnc UNWi^^dԯ-P$ntEgj.IQ:GjڅVSxAin8 >J֛Q.HP 19ϷcM|ciiS{tkdsgzRt܋HGu +^3'ҥUf6uxԗTx~\$ rے7*(z{\w4.|E,6PVFFH՛qֱo"kw&3Oԯ< 0Z vS<}zCd%nl;yo2y}ճ0CߛIBct"=:WsywvCہe,YdMMNT u9$) q4'R6/fاˌqߞji׎d\qB3jƥEHl͉0b}ңm-XTm\\8 v^C$ N?L7kj]D6+ rA%C44- ^Bn1I =xJ4+XD<ȱskި.UY=Ixx@کm'*)FIxvyn.]bJD]RБ}7Zf><:v}NӮ\C$*۝|;i0 mJ zNzs"4ֈ׽-=c=FxاIn.>?vCBÏG#4;pNj;[p3s=j./*zۋ(\G4-S?{ޫtЛ%: FkW>/RpH:&翼|@Fc=?^?o,shnZ36C|wp1k9bDNpLu`OOFkN 㶷I.6=z8Ԓj ,.}i¦8FovOb+ܷ6НG 9 W'noMOGU8PF1:ZzO3Us~=E%ܓiV7%VDRIpdc$ q/yyi`fv~jK; k\M@VB;=Gi 6ڕ7N}rGYF%Mč;LfmnfIpGj>tEWP%Ԯl" ;?NZ뒱L.W$* 9[tړUq;9ޥ3]Wyz4) m.9Wbug F}JIj7%[N钥\zgjԟUe; 9?4lo܁n୾AG<󥽵my%W$Է: n}HvAOl*֏CfRRg啈#*FA6Hh|^k{,Kig+ =Iǯz͸[Dzm[i5Wa2 Uu B/ Ϛ.1d^jX;q֧,g _~2;: W{ր/InRXEd^_NZ呮WhF@+sWti-PjV[,>JxwjvewC0sr{Pl:KuH8UuRZ5{}N=ٷ?9jK}nas,Wd!l4<=94ұjw-6#.3 CMsϔg8 U( |0vbZ'WR(xX3ǥEuEn\/ |3(xjEI2͵N\@wuBגʑoix-ƛ$QXHMG41) y|Aqw`t?3f :IY0`Lϸ9t⤻QrB}j뾅-edLrz`V_ \*.]$1DϷn 2otcVU.?!Z[K|hmۊ*[k4r5D|>sK&Zu.#{b3%.9:圪Ţ*ʓ4&,2V^V5ڬ*m.{1xgı9ǡ{ՙ3^"N@nsZMi; #-.dG;{UK ]Cso!ϙmϮ(Y^!PlkL#Q ^tL3 &q#8}ǭ\mN&-Tw@ivd wd׭:Xt K 0z-BQ6ztwoq-ē! ˴qi_:@p4rJHi&8^jy<=,18%Zi#w <3R܉ ,h֭6B#&4Jq'V++1heUL\{3iV8d^@Ms>DH ?IbLjqnQ ~-E붋QjV> +Xg5˻隝ʇsENԖѮ]Kt'nqj ]6fi v#9s@ c귲$[E # ޯ[zQ!4-JG#ZVgDGSXx7,1'@ =Pt 9.ɂi9gg<ր[]F4'傧;: |tʹ?2'LȢ?*<4eR2׌zry?ʀ5oDml^}9z}yW9*K56[N,d??CקjedV >TUY>4M:TeKm9{֬iz-?Q @1ǭ[rV\!*8dc}@W(0 / =s}{z}C kOoc3u, ş `oQu#KE2tv ] 5T ɷ\``x}2`QqrHY|=jɨ eCBl;Է~ 7r2@CV!!UA>X= ҶLOyQ~q cUO ̚j\.N/ (xcfG Rc'oA@5`8gUkhA{$r` 8>Z ծ#x&,.g Mn&I#nf]Bai2U }:ˏY*>"~'V.|?ogoelI @>[P𾝣*=S真~rhfotocx/data/patterns/lawn.jpg0000664000175000017500000001567115247006660015256 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?wIkNJsY`֋t/eM+R}FXŪYLY.$U]^]*I)m3_j ]NC)AЂxq/^Z^lϣӮ⸚8;'00{kIy? uy+u%k#hRΝEG^o7)Jʦ1-mnS#:{x%ضÂ<ۯkYj2W7l-ذBX !oX-KNDlp]B#b1[P8\Tp^"-tk]hm2Ɩ,&nI4S9GKk|sO Թ}Y{NYu] EԴMZy(5909 (9ekF_6uy3m,GA3_[t_fy퍄7N3mG$0G#qZ}_Uv>-h퍬i1{,YW#MmF.'m7zNRN7ާg}Ss\iٯD3l0d Ur2ErmUxX.VOi3#s=+<,56(]B{ڞ컌h>vRNCpyҡޯ5Z@pR͎QkZ5W|ʗV'k{QMG9)O2=Bb2(ye\Q)L '뺭߇-?Zo3jw{ RߔC9-e9 i>͗REK-Ŵ65R]9 Uk^㨥x^uKdKM-``sokD$#ڨ!<~I/|/ʔTWwww גX;YFՎJfve8 O+ V\yʶh tNqֱZ^ج/hַ)6Nqmje- w~z 0dpwָD'NGo@Z\!W|O_uOi(mt&.p Fh !i[$]/L.7ʄ=8bx5M MNOQn6n.UXdFw!IP Ou\ܣӹMo[g=3Ik׈Ys] I6wH k<^;ҮVIb`HX`r eH$5\#:w.cgFG՚L^&|um;is١\hl il>No߻j%mݷKߴIel VPVg4, eF95kR:u;3λ$Ripi(2dU/ +4񆅧 k Q 󝱹ffU$ gx@>C}ykKx\dA;>RTA址9j!s5gkקQJw~CO zf{Ț|ii 9,JrI+|5BIWt %Ա<>ynN]۾+KMsVgeclǩ}:GF>ґv*vp9Z55 ЭuP5kNP{p+~4ߖHW*m4,isݨzk"e=i',IWg> L F BahZӼ'mƣ6H9Ui"wS msʎzO^6|Z"V~%e{P ҮFP"wΟhҼqXv2 e*pi1UN6}펝.d~uWE>܉!c>fAb͕x?_c,N,h,`;pgxONj)nU^~XC@6aڐO/@A$FUkuK|>esiwr\EYj"DYw0@Eq 4Y|MrڄvщCg|OTOlq]ޕ-ۮgt3XPꬪ7rc˸&N8?P'ӖEynu aEZ"o\mFI1Nrp=[/᤹IS~>f[m_ (Z<żM++`*| !%݁ h>t6{JKTqEh:?{VSr,auL̛p)MWg C^)=/zsrD>i"rzըe94h}:Nd[^[zU·kuo-awtrz9{@~Y6w?KO.YT徟G^vkv66ZZ[t7p;]Im؂RvI"$a U[hϰW–;_ Z;m/)MѾA#sW5/Ou,#ĺe]FDlT y&iZmBAwݨmtX'*wEvRK nQOk+hڶ7rVMGGשYT%U,kHa,+  n*-5k;h]夓la/;vyrbw`p+ԼW,+e&=GS{TZdY]m>^GNѴm_ú`vao4'8=pI:P\_mBqgM%%߯!-އh:ݦx9#סIaa}yFSx88{ⵧ>xeƄweRU3`$Dhmǖ;Zo2/.f  x; noemXaiʙb:,^p3@/AR\#-"Jyp3d**>0|8ӯ5ory_eQ VPX= Vx9dֶZ׻4TSjǩxkO^iwB[l)up"qcY<[]JeMKOSe*S B8q1! ~$EAc Mg+nх*cm##?->NҬn`{'R]AyդAtɒ3ZppiԒc􏉺 EI.7ͦi᭧u?0Ơ(`TA\gk56K]6;Q%6IKԂ\u#8S%݄bÖ֮vi0ʙo! zǂG!S@fu򙂩@f<{x:^+ GK&]̋ Ulfr9|@kxoWԡMf+\a"d(C;Fn If{Egqj1$jzz;۹ݼ+GLi1]o{bη?fotocx/data/patterns/aqua.jpg0000664000175000017500000000756715247006660015251 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?u#Ny,cl~@@NKd䎸xw1RO5?]$rd7d^u ۅԫi{VIʎ3S"Gҵdӄkoz%HA[];VХ+'5Vpāx+E2?4+sVKb5巊 Fc9ϿP: iDpMFěV6y]MޛEou{$F$0?y&-ΠciVUWw=WvWrgd@LH+f4N-;}I9 I:ozz$t9_u{,W[c1| &L5;+.B*ۨ^*}\R D۴J0:zNѵ ҸX YuW7^.@I 8Oi:j=7osR{Hu ,c>9} FH ;]dF}?ٱŃLs_NQb(ݍųXnd }-,lw9 SKi_k?n}_Q|:m  g$懠\V\&H e<i/us`,B@83vJ 24L2G=1^A{m0]E=?k::&֕'(/q.^?̦y \^_{v vKCxwZ.<~Lw#׌=̷r$K[5P1ǠZVzݷ~p )79t Rv35٠h 8* };kt$6;_C+Dmd£Gh~צ協n]b(B03 "nQCtf75hc`kpz񞯥a}lт{1j濬xMD+s TIsj##U K·,P؂^G \vkKLRcR_X'g%ol uĖJlc)1>᧴c{1Z탔̭b4u"mO챓@\(=A^ ̗666ww d?#T<#i10đFz[zfCv% rt)6gZx)ΧcUWt^qlɂrZ+KaL?UmnSIN̻Y*Z}q6 8#5yi\ϩ~\ǗmGivnsy5J&)-PJ0#nI^9 XZȒ"p]qӞ7FǨ5!>˥}t)ɺ^\}v5h",o-laRV8fʕ',zָIK,ŏ&J0zַ5SI:{J9?,uUx&jÊ60goiɩݹ<Ʒ5\iL`|L1,gvGՂ+=X$o$P&%_~jl45>grz|ҥҭ,3y>@vOSY:ȵ|mgjfғd>^vą=1+R[oGk7[H3(q5B +7Kh LUsU=Ofotocx/data/patterns/wood.jpg0000664000175000017500000001330515247006660015255 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?K&cm$``P[ QV)3!ӭq ^34[9ʒQNAvDtk/3߅Igm!ۉ.he`־pi%*l{p@QNx_$؎R pՕn#%[ݷ$qHŹ0æOgN]jpX Ģܰ B)3XxZ/#Sm0p]N# $` 9m h9ج1Ñ >uku'K SWcIwak3i }0Bb4Wyc8KO+>Nh™ ִ':2vNARqq/6;S_^Q7קiP:]sv;A$ MM5*κ]( v0z䲞TAt3&t}F)8 31fEpM6cJ:tk?0B@=1铪>kF._mbU֣KF:]x !Ж 1rI9 o5yXX:vyP TǮvMGH,rIak1H>ܜ={n91)e(]<3p urm< n+7S^1k⓪پٯMjEu($o`FTlg&ǸCc1k8l ˓GdWXW1ݥR o"0|c*6ǑOJʓiRK,b;8;zP⺓oHʾI'H%i&3GUS~%M%0< &AaAF`=U[KK#%lhK* 2@;.Nwӂ#k6ϴʻ:[nw 9Zk2w=d-wF eX7Zv?l ăD>4 w++@Ԙ1`#~?)9 @=fUڿ47R7r +G:w;i MxwiNNR8G.. wmD˂#xֳiw6mhd]1O]Bl{Oktm :~'R 6v,@ ؒ3щ+xb `F2*6z\.R&1AA9JR*S4ta FUIze}Ŋ  @oQCl(IQ:4hGx`F䅤s:p'V<~@Y,b͡ޱmTqhquZ+ͯQ˵fI\r J Rc&֭.R4C+GԺ |J:s$eIRr^DYh֌c,l >U[] FԼDcv!Q"pD >۔RgyGg?-ŽF0{퓴I^;Kt$@2.C;eXrsytWwk! II{/d>\C Ec` MAh8VKn|') .hbYl<9;ee,XD’sryn ate `4 36p9-jUqekh55}g\MficPXDi$2Ik2?\K&I vDg?6cVQ!О, t260rQxcI95h&~>z"R;]˽s\R#X땜i̴!ͫaPFS#/PXk_2&gy* DgَЁЮm)mFdGRU9H A3*zYQK4v^u]hi)(O (,da2W*VrZYM.Y]KPꁚ0KP2J8>X*;U=Atf+6"j)K+|YlO\Mqo`4["3Uv$rjQ"/QWsbEHF.VLi#-hRA+20dtz~x,6ci ٨^^B8od`:̏ő sB8c$0&.qО{MNku[@3 шl98$qj-G_rv?šm+ wё68>Rin4|VR]H[?9 Kn0f Z?* Gn*4voUgG:ұ!ZfsN1T⣲{km{5Z%Vn#![Alnnў?7L};r4`ˌSIHM2#%Åp"0Xܞ{ľ$ɧ@G1UZV-J'9-xZ]N,~a֤e9UEc)x I$(ogH+M*#f/AUqm{X]rW%\yTg/7${XʬK!GS:MfuG4$U-uU M%YVf@ H/bj@#v:ȉn +w-8V4KB8/=c]eqXd4Gpwss^gBVB 6r˷{#6_ p8<φ_Q;nM'H7F *H (;(`\w1і/-+hZ3xH&Pwm>=x2awxr)\mmۻPxO sobш<1km mdq(: 8y;XN&ehCM$0a`?ʌ}5 3T{f3rF3, .k] #纖Yʡ1Gծ<ȣdvAK`HV+%BiUH8]+ 1I zc䊷 E@>(T2y.@m9m%>H%4 N%IН#9qȮd 2槪O dErVm+R"˨tD~ avS`5IGBHZ6?moH{#jyaɀ'%?xr.ЍW}Q]mB8O#'2L]$- >jNw:`{9{H̵8I[s6>_jAmR @ 2]0#n00z`u-\ג]HW:A*6HmP09tbbıyEԱh<sۜ)sGEi6?fotocx/data/patterns/liquid-blue.jpg0000664000175000017500000000506315247006660016523 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Iؒ2{z}s]R[bvxnIvxkjN-+ܯzXT&0sużP@e* ]V?avTUx WTiѰOIAKtTi4Zؤ'=Ei?jMVD2ϽANXduo' ٞ$ .O֓twKZ/qka#L ڵuzg}C'JI=r~.4wz9ʰ9_ZUD}Ue'dnKscJ\@jE$j "4Y7 ߚI5|NH}s>cyl풀{U|DH9 sX1kT  |M<҇Yy}Yu/u:;i*OFqJƿ+9$і,q+Hv.Œ=it)-^YLϜPj'b;FBBKk Rql24|CyveDYo NVzի]B4y9wq[8Q1zh̅h>F@1溝'ZiQ\꒔`6OzT O߯J!G2$Fٌn=܁d< c>abeʛ7$ϦFJhq$EZ{}bwj g%R d^iIf]opqZdžVC .A&tD@+bAp pk_eY$#杣xmW9'W?50yTLsQ^$Dm YqM]ϚlGLDQ}Y|NŜn-Cܬn, WRX C HnrHdq.dNFRҸ F6 -d%@oCH,PYi96Ӥ2QGm=$ia)FK֭Ma6ђísK';!#')r#l$Zl« Wf>0ni/ A>.46F7#: :\hZhe\:5V3t_>h-.YC+Mb0<*{eY$!r'}x`1j~v?fotocx/data/patterns/confetti.jpg0000664000175000017500000001515015247006660016120 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? <>kY4SSu$ɖb?9)`#$k7XnEi綌^IUW#'Jg Q]۠KGp#\k:cic Bє*Xs+\oؚ\I}?uZ4}<FkV]O7,?uP)QPhrHz>%(;ʋ5[G<[뎶Ƶr@Ĭ[",aW9/5jo{s%y+|8;TlwVn_ 9ȰF-G^i:^jZΣ!Pr0cp?!^G64fv?(aǸ>¾~eĖ~ԮCIQ_E|/.4{EN@;!2y9⸷/ BUh>h6[OKh} )\]ҫ_Tm۪>*K#O.9.aPʰ83yjG4X]F'`RXdh]pT+.?ޝ{es;=> kP`Gvċf~+yဝ/Yt3ϪaG8ؿqc24W'Ҵ{[봂d0y;km|1?p *%ƱXqקx/|SKmF{i=҂z##z =y3,#$H?kυ|1}QdP H*3ѳaFW5Wt]dfxcc=QZ|rZnzi}ϓ~)]_Wۻ]Rwަ)8⍘( ,rI'.C44mbXOE}x ~,'XȻr;`c&ֻt]bJ9GAi{dA_G}~WS8cs^Q|${9/p hA$'V`I}.&Vvp{i|316e.{$-$i"fj1O Z7|wNw\3trQF-+ƺw"\p@o ;(5KInYRG `z GH}-PIoqnH2T PX⿉XIk89OΣZb'3gFk+yw*m\{+]OY:4rsկo*|? ޚf3:OwFIg=j&s8J]1oԅl> *ZEεh+k?SQ{k`TA(G8#'8',~,M{cM.mb<^a@$VY[q֝xJ>j6tdP5-K/ž!REbna I 6{bjsϖ6t3 9{h]7{uOˮX7ͳz갫ZrmVIZ^xW]. M}ixF%G`Q)^ :ljuxvogHjq%Qn#xKIGJ:{hƬFv㷽~y_ CW}մk4 Ni4m,3̍|aن#8&ri=]M}?fVV^ɫ^)9$O—~$fkJ=d`G,̻gWK|KLW L8b1Nק|F|C,C:*> 7ҭ9I˖ZF:F]W4EX 47mY 2lG JulI r1< gq"M'+x;]k]Uݤ>g|˼Vudk/^>kIim3;>ݜkv/S/SW2--ݭ}.gOׂU9M{G̭fgmm xk34w}& WMMj/Yk".ZĮb'=KP,6[mm\q6F #1jªq{4۳|VLrYJrmk{td MAfF cϋk[jַ0[Z XO Y!w b$rZuߊG4?xf=ޡjV[,h*n e9% <9.R=j$\z߂a9d14,\no/k?^>ؙdy[)!xü#3nx#oi<9cmbsz֘@8"q?P]KOonmO+eJa_0nwjkֺn~ùNWTqWknS xVʙ>8xЊOڿ↗k<d[UݭťvN X G-_MkM6vl{T-$ >k |.&i/ .~s`5tȴ2]G[5Frw9$ӜoW4i1Ƒjez)]A?e$ێ~g<-Wza`uܴk} ӢH(q&@~&T)ׇuV+zYOe,.[I̤oklx-Οw-pIG}7SpD*m9_ Mjt0q^:KyƌLJkoFƈ[Or6is%ő!= rq`kpah:mO\wVB5*9%7[// GwawmuG0{Y؂2(s֬j ~u%>ԯrkg&pq>M}^hVk'''q}Xpgvu8$f_Vic7WJ.P-vow}w# AUmG-Zk>%k?F$X%!еrmRi<Ipe ~:76q{,~W2"\wfbs_Ṉ]?m"ڭonV#!%6}q޽LF/jʧK_Wmv6'i%E%fK_|J _mKKKE=ssy(cٰOq_.k/7^8L| Lٕ|pOgYK\,][$2#>pH;Ko-$Lr8T;Vƚlj2D3dOPӔ[imdvl䚜/eqo< Yf,Vbd_Ԟ3 H`a7RiKq+[gmүVړv:wԱeqҩVNЮo6}t8l'5-k|/n;FmxNzz׵ #k% ާu+JQ|); ue:Z[я,y'?ZκOHbӽ>֐vҋ&w]=m}Fr8DɌ$W7h'@t;5A2ܴѸʦ OZK[Ƥ]( =ZM"Y?02v9=zYcןċ%=}T_6Em~r~Hc ߠIH |H@$xLǧ^Ն`2%¹yAt:uh^ +{X2 gZ8ng_fyf`P-{m|W3*C|O7|fNJ7vM|c/"ȡQO +{j/{<ђ]X nqK5ăJ"^nqP?\Up&"̋ՋHW$6Z1/1n`F=f[,r41,jvm-qGP/p'zampCq2\w Ŷ~_U0-SqH VBy4].ig{K,x9= gnAw }1F@֙\jzwpnP2) 'LnY'a"[K1OaNKJ4].Y4]AFy.):QLyFs*oQX%yb:؛j̩47Yg @VdXJc\(Np#4è csm*B>D٨A=K+%у̖Z=$f"94$6~w-jCh7K(8AmuisI +JwqZGg]j:I7l_Pݞ-},d<Ҁ,n"?hȬ|&<$w=tQiJAingPJm.ZdKXae% aOV$pYsmkz0~i6'hlfӬQ[XZ@ll{{aY@ZYd 8 d=xu}TSvP6)z3U bZh֑0$Ow($dulsCZ|"k9ocYXpxotaԥ8 ,T>;QWӖ RF:35WYT~c\6KH#|#_2Id=1i:%$16Y6;YŽ0H3gҴ-y`I󂖚`:qzPN 0N֬K{v0I*m5\O~5PBƃIk\e M2h.1RS.$^f81GQ_ʖVrV `\zze~mbt$a";s{:o {B$$t^Z;4Y^9lXi~0no'g 7ڤEzOetɭ tM@[GuyrnaG>~TjOqXP•dC]$3[O9(J; 3F2>4JriaSPYmɩȥU *8kpt鼹f*e‚bVfGbu-L#4ƫ-Ԛ{ʲIJ_NZԟ6q.Osmomq[M:GkPGB0yZiV-6Yf_( gz/zuW:Xe`FP*ƔTG#>o J⤚H]9K3c<j}skoӥ6xau8K .GVm^R]&-"B>fk+NVHNuVb O֟ 4+ ԛY {ziPV:H$'qPi6omwHF>_lsԮeM'M[|P`m[:uƥ⋏661BMdzU+m 5‚МL?>fotocx/data/patterns/canvas2.jpg0000664000175000017500000002105515247006660015643 0ustar micomicoJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?oʛXo#|Mqt2X8jv V\%FQHYn]3+l΋7ɉV?!XYF`"U %5` P:GYnGUg1.Ѭd<0Ewi sX?_J Tؿ0{vYRNP4 vQ CB /Dkӕ\A:ԑO5'#:ӵ96#wAҖv.:+{c(O%~/_ab`T+Dɻ;O#ޅ\/ -ݺP}Q"J#n\Mx7 G E! )rr {$iɺGYu~8N$#P ӽ4Ȟ #\F]ixj|6Nj?1LiPw yhFd&%Sn%u)5sDZEb|4#go$ ?FW5k6yO"I747%l|OZUbݶ#c_oV02P:Mͼǩ\8QpsE<;.Hq\BQ09f$TL+ԧ§q{Q[W;}=ؾe0YB27}*_[t Q`ЬEʔK&YA#2Cot8S+d53X*̪03 Ȋvm̄z_rO9$~`㊘8o8G*5q+Ci.Ò2Y%x#jL l|8PnO5mdmhI2TmʑА=MD$DjM!Ws`V6OE{׊[@3 pGEr&&4PٹysL/X>XD7 ǟs_R=MJWe1Ϯ)dB8s$W'dcƄ".v&֚)FC4'$ T>| yOup/r02?N*`o:VE DE,e꿸icFZKwno9bS4ɼ*M( kw7}ǥ!N]L#䃟4@(U;.=qi[Ɓs9q}Ucsܹo zxfs[m,NIYVBHp^zg Ե$%UI#QVbehI8qsEs"҇eW x3ý `nKjhK1'0 Y.ګ'TJ_q!!|E{u>b9N{8.BS}_ʚ֩W ;&?ÁH>h82)SDdNn JѪ-jXLL_ƛ0`gKyژcgo.Y/Ax97"?IdFXثoL~aj_l;V o.sU0)v4[d*}];1HO&{?/y+ ~鋇{3呍2@򷙐=ZX(V^.hRQVNsg Qwt+>P1. ڬ(?##M!ɦEfP2\PKpv zҷf0%%14"XBGFgn|r5~ӝҿ{'?dQRN@`׌/{ 15 =ARW08ki!KҪHv/0[dI_-": |S2m\$T.|.ǡW/A'F0X(QH*1ѥ9@q74S}_x;ʸPOzPErc9'KҸNPLR8&~"8ˀzc8jolc>1\W9N0i4}vu1trTeC\󎞄R0Mĩ̇+S"Oyr*@m}*V@ >MʼnߌF_lY.Dr_ ֕8K|g9۞ߍ@-%U [,qL]jFy #7=)+^"?e$aק֚y|7U׆d$2'3S|uMJ邟r{gҕ`1A"1"Sn-8bdc!x.ddo9đxc j<9_zv壉 wy("mf[=VDoS9r;`H𸷍N1Ic ) EYl"6Iumq~yI%&Cbjgv&q^acqҩ!\4 s˃jhWY#m۸ >n>H.Krl[kqM/fTދܒIsDqE7p~hSd,{U9eFu:x#haPՋN>{SgCjF:Q@-wQvc?x70KL7HDk{_F04q8`vƒ ַ ;o_ԝDh$K E#` 'S*8PtX`i~[<6n~BHmH'͔;r0Z|S$DZ$#) n-n~aƘ҅ \Q<7x l.Q91 uW`xLN>R?L5]݃e6Rhn(F[h)m9W9)>D$}=vסuXHI䓍> w` o0 >x[n/*}F;R4o 򍬊䱘g (lisz=TX0GF"`t v7z)2Xri>)R]̐By#KAaډG pN7sN@Y\3o?g1i 7;r=)#|b^lEjѨho@C<ڼ`#. gpv#S1]7o9קe7{k@jq\(Z6;qs֯#~i{K*}Tҕ(b/U\~GASah|>xXnNqvZ1Ne62B395y2d[@sla g9 X(y;ExkkSZb}q9F#HL.]Dk1ޘ?)!/iif'ܖM#.qz OALʑ^>KCcCǻE|lO8-M`KAZZ&q˗ӚlgA߻?3yai$"v1PǀFW!(ylщ3M0*H{58MJ՗0ELodaMkekpA PtC NJ5齘1c+D j_'̌mK)]2nNDo 9ځ $-R -~ldZGS{H!KVlnDY-.7(Lv$v;16?* <6tңKЌ I]dť!>[?JhEn-NcpH[l_cw@8r2`>O#q@SpQhU?db7Htu4YF v ␀(ggぃ>nAI*YnVK82;F bdڑm3SSL?RqeV3Vb6_{dwR=1GB`'Sf,wD77)?fmn~l\ߍELF5 eLS7ICݏz?iCxZd_L;_x)U gڠW}‹rv-9 $BVo [r ҰsP4~jǡo8hfM[ɴ94R3"tojX7cM hFpHÓS(a?rB̺j/yQ7+Mam#:VVr3ӎjE >.Sf{q?^kY[kVإ;=3֔&U2N:d9k2,+@ O5VHitm0\o:#9T&%iXAn2N OZ'\(AʐMgaq9,zL鐟3Wk@I"W?#ޥhBt.rCn`MX#Hl(Xp{)%;#tJgي0 ײǓ·Y+=N+ⓤ~pǩa/R\o3J[$v?Jx eκ/y :չ#rnc>sQ"Kk=zQoC2'eN-=psTֻtq'i'is;K̏iaXn0@%RlЀkHm(Q\vQ O^ b6 0La.2f~`ehDN!|BSFs=@[-}& >|qQwd:f˦P"@7g(hiDЇd$b3<{)tc;>知X q&̀`7mfo,n|#h8CnF|#;|blvѩH>qEUa8gxǵ7a#M~NczZ*fI/!fNjA EJ˕!:Xm$wbdRC ,ݨao8ۏO]a& 4 ï>*!2&߳^(a9t[_#)Y}j* Lz:74B[h3˙8бE,oOH>%H.9LJPKߗoF4Ku䬋o¥m&C^Tc#֚VVcq~>c䏗4q]]Oٵ|Sj x9WWX<n9}|m+F:V _lsIx:C E?ws.L/yn6OJ-`v;]e۷=w[g |[:* K3a./s:0=Uo"Z(_rSIkw|̐3t[FxXYWmJh`sS[hҥhde-|~iw=o£0e[lڣrq[+LgG%23p^0nN{T˹nowjAw8۽;IKJvc|&a^t jEvN'?N>S9EGyg=sRTXctӃxnOJ2{NRr ; srK{#c Go#+yz(B>Iܣ^Ÿrv>jGURi 1bwZ锨!$cӵ_ pAo!|ĕF<r-hUu5ٌLi*yYM+h%I]]AHvKI\ړ߃x)/4!l \JdFf]ë Q^̂HC4 ƭL^O'=3T$g%;qR\,mYy s֒[Reb%J^?wܟHBbW3_,7q1gG]8ԯF'mǥ;r6rы˽̠*z9K4,` ;W'QҼ[cÎHK] f Ar*ye-a1 /p9}vݘ 9IxTV2e/nYKw54Ѣ U* ,+d~_ƢiW %|ݍǭ"]>iӟjdَȒ0oA{Sl$kS#={zNdt2\kJ;HYg`|JMQmΊx#wNzT9o<~LC~ΗNU:r=$_2)ZiE 3sҘ.5T@?0wJkKa}*~ Alhk#3>B@zlV.O=𢣎v+}#fotocx/data/patterns/marble.jpg0000664000175000017500000000646315247006660015556 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?2nB B8GeT,70%9Vޘ.Mc1;vgG99OZ@DOHYw%HppO@9vw׎jEKXd1m*9? {c<O BFƌW=s~DDbع9ӟnv '(zCn+>[rRعmmqd Y0qԐ3z=*?uۜ~ SjeM*+(>iߜ`Ҁ"M:XXkPej@0W<:g1q^muVn}+s/ 03ڥ2pHv0;A;>\{cҀ(| 2H: . Ïֳ#jʓx#ԂGL⬵1 :\@"EWrv:p9V{|W R'fYI(té]>9u0Fa!|͟Q0k/ubL׸ $I̋?\>Y;E8 F:\sRv~EH2¦=u}xM,H(9tI@!7n]cǵQ:BMI hDI)%$~W7E61f p8cg9 xPɒ 0zO94Ř0PNAc<.QpwPtm :=G+wF,x=sQPy=>44"ˑAIRq235{`fȔ].J½`** :0pA {Vҭd[A_r{r9 Sr C@F0q>jwb srytNuMVpŀ# 6Fk`"FFHӭjKw1iE>GKBx (J-vj 2NӃ=:tSW]}!#~ t3@d9^GpC%PTdzqxۙ03@mk2 %Sp?/dGKx fShA t#("-L(cOu`3zbdS;cnIIT3Oh^ դa"(E-Ս,FSv|g1PçY#+?pF߽}i!rWշ;\K4#xfQ둌t@76!2̨YaE&1M1,  N3#<hǕ/2y_r:l Ƿ@j7f{"m5 H8 }8Hj6(*3n׌}Yy2G>^8jHW; AcQqڀ '*8V ^j9@T3c<Ҹ s0GJč3ʼvzlhܠ- %7)L+^z`.kȜ :)/lJĬ̝A =VX>pz }'iKn@%\-NA$ӟ\أGGptGNqZZLjb$n #T]Nt\d̪\0~ GҴ%R|+g;AGs=? {?ی9Rݱ~8RiBDw#A`Azquk=> $SQ9a~:}1W5tKҁcjq[LUdPI\<㷽kS|!*A\vqj3 <Ӝz*vf,/c{"OnҐn\pH?tf|IQe,YG_~fX*K ҁ[5d|qpO~DC}hfotocx/data/patterns/pattern_114.jpg0000664000175000017500000002711115247006660016347 0ustar micomicoJFIF 3http://ns.adobe.com/xap/1.0/ 225 88 C     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?yM{85ηؾ)%c ̑킱0Keξbx'oGipY!bOŶ#|Wd8Ut{vƣj^_x'|Co7b#[erHTYa*/ 80_4{K15,ךsu!a[تx^X# 7W-]KyBQ|V+ur~Hjoes[yuuyE7hy;۳`">:I^Iw6=>2Ǻ"kI\d<"In3+;"9 7,?f9$^4L3GŚ5I7R+ueȢ5`xHT+I$-19 if7^kDjWɄ)gEHUd2_RO xV;˻?^Ei}g#$xX>a-pc=oxv-m|?t GһBvmͽԷ~d~':VrM+۩nXfK$nxVo, vXA*1c$09𶼭{\OY:CͦOç_t.T["v: ݆oR9xV]ږᑌZZ2];Yθ_'gu:oFP$A:?gY ۴Υk.T]JDo-~G h?gEkl7[<=xӗ?/׌k2w=okΒᤆ2b=rI`|V;k??h\ K}5T3_e+$:*MtK<ƃ~&E=׵9nd xl#ԆAߤ^Gnf۩m9I~%;yNeI.sP1N0Ӡ:΢`y}.m߶H0xz5H);OKy>8JgǍ^In5UDAmܾsE u7K'ך͵yQn,H8no0͹ɞ6‚_iaŪol %NI-:˝o ]sŞ XQN6%iI'f ~an4E~DSvIMΊ?gE~K_#e-wTL.nc91;+i&[τv]ϫjlBXY}=irkt^8kHRBE݀N2<=i;yux$k7qKy;4j*];⊻KV17V [dz~MKMmf3}:ߊ'g_n|(lI%CiiQyy*\cͫ+ƪ_|&7jf9»2:]^2}ut.~":/m.c%mњ&k';6r׌ngPew,iqmqo4i5C42(d6ee<A x RuaiXtL٤p d`J ڿgG,f8I]JISwτ~xr_[jm"X.6E%LI"aD%~<wxI [j+[FuEb<@B FQ@S3ן%w_C0^{/_Jok'?gE'0r7S\]_GueqrS/;; +Ղ" ߩ$I9$OZ:?gY~ ,,HI IBFV嗅$Y3OY:<#CMsIug!(ryG ಒ1gCV&#Q^. g?Jg\/Ÿv+4 3zZ}:2Hʪ=N IGtW5Y[[L%H@ \Xd(%v}5V3Wu'O!t_f叅?zA鷍uu,VslY8 ؟p`AaV6#DҾ<z^skGHՒc$W63 b%CFA|I3Aj(|Y:߷OƖ>u}O (r$eb)̍esc#mCMxV]ږᑌZo,?eI~xCDҼjz&X=n]:K,~ƹ<%bl/a ,%**_O>9YA7N M{sUhPI m2@ .Mz}v )_7y,9e,ʼn% =&_6PA S:$c8WwK ٗP}2O QӷOZ|׽y[*Qћ qd/ӮK?2,^\/w>o# e~qg銓μB+_+(4^E]$y QZ4?h`32[ZrcPQ]m\GS$28#~Ƿ 1tׇͭA6%jR'X^2˹Yv"gG,OU G4~,vww, Q6x'H|W| ǿVOS慣j2CjSEw6IHl;11hM:6[dzgZ69(k/σO [24ג^5RU -:3uxŖΣo.H.v g#{ey&WL,K_i6mNHP<O<Jc],|<":(ۄ_#_?xJ,|{]:~s=_K`V߲}o?vymsҾL_<^wJ&:}YfᏅP^xQJTuWYFv6 dVvKg+ڏ+m.uXdݫ(a$6후6<4MSž(ׁBEۿ9w*#2褂t%A&ZxFO,Hlo1*`ydi?I$̨ckbN*W_Ou7z-oYMt\\Npg@9f$ ,X 5sQ-*ξ/njuϱ@v (K WgD6lTէ!{V0Q\ĉG?~0K_xb[ƶ'4cfevEɄ3Pwf rHۏ1qn_ :*u_he֭GݬZtWbm9>_C1  مVr^{O<]^M%xe=Ki?oy:'L8T^:q ix^nPԾէKwOg;mF tT^p$ ?JNq4;YX>xIs{?0kS[Ӽ=օwi+oٻ+&$䐪0nA-.um9..Cv <ÁMKz"8TQ[0\Iwy[|kMwlc$`Iu<&꺒M^(j(VvIUzYRSt[rt 7Śk60ZNx6#X0 PAW:<%LJGmtIziBVqmz,5&m*pRczt׺&%ޏKeq  ^6;\2TT f|ԆkKvɩ 6 c ݷ~VŸv+\Ԏz4(Mj?gEku0tμ;Yθ_'gu:ğ?gTuMJi:nE>t wnǨ,+;h/-.5IJ  Vw$D &Y6 # + |A|NK7f$ַRRѳ*wROxš6h6èܤ<ݑ2Tgkqn;_IJŸv+p qdc'{z:em 5);NKAs8Vy$;;,+6fVQ9u'M'ϡ<)㏁|=?\ce*KaWwBm]OH|Ok 6^!>ӫ]jڌ2B8*dpIOnF\~xO:Hj[.VYoex$9П0Np}vE5xn-$1Ҭx]b6C,3(fo/,ÿfχ=-]_b)O%[bWXp:$=Nrw3lK.ZN`Av:\kOJiiyCg?JwQ' IkwJ. C3 qdƗ$^6;& uFKGN2?AzLkZxJ%+upE`(3S[4J-U] c "W:nAEwawF*ŏYӒGveݩm88ΏYך58o X8$md9xH #S\ov[m$x tγ: ק~-hl=OHmHa˧[X-q`|m~)༖9Uy6Sف]W|-A5kaqks~N$vaH EqZ'x^-oMՎb "liJebxm;JwQ+?8yW|bwF&KY-Ֆ6 gBϜ d3Ӽgcy/C]_M/1UF6 ]+w_,|5YzqmFA]DErc$'\Tߩӌ">X] l0m$gEu]ܙە$tΊ+,~+̝c],袭('Y:(:tΊ(S3ן%w_G>h?gEWv|fotocx/data/patterns/bathroom.jpg0000664000175000017500000000576715247006660016135 0ustar micomicoJFIFC     C   ]^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?3,u"Jy}upv})7+ķYdMrn+ЧVU59%' W n ֯|k0-i HY}pWv=y HBjŸ_:wW+whe\gnK"ыDXcr#xŪ6_QmOB1K}KUɾVcЖ37.T7c h\Z+]iBe,j|bqXTjQSW5BjŸeg8 i$(=EtS-=H?hqf#c.J_y_Q"5|`"Ԕv_W6< ⣀!|5'𮱢k-b{u?|=yE*iF3MXJ5cY7__Zx8o]FgݸZ௉Nr3XN+8:QvJ&K^CǃAxK[xLJ\5 Ğ;BD,biEPFU ւT3W>Kt` d%N w,k&;tFsĞ+3vkwמ)%wXI>]L ͻw)iW6.U 4ӓ}M/Epu?o^RZkRsަ?k|kM^&RyU[U!I ac;8z W#HNns6K9J\k|_}{T׮fՁn@cvq@6mGB.smDZ_ZI䍳sl]wYcޅox'xM8A ɑ$N.N1Lz8G)s")0$Ws?֩>4r{4>$J$=:e =XUq8]fo.lwCp3]Nwf?Ҳ]1쓑ֻLvE,Mv$Q!YĎ4 ?/ZEd"W;FPt0aUJH ^]k"VlAwi 5ėDc$q|c5QQtcuue/i/Rƭ~O&3[^o'ޓHlmXl_5ύӣ֍_\ǫܨ ǀNJyH4)l?ҫ$vmEs?{{s'YgwOX:W)lq]b[:oXc MaXݙۧ"MWMbs}S-p]1JCMu{!"\gƻ73=K͙ UhWnF )>W¸3}ZJ~:$K €kdWk\էmnxLaR(E u奚aN1۱LyM%I< #ƺH'f6| ֟~j-t+UuL5JR^>KZHK>$G cX$ ]G` /Nj';}k9E+/)6yI6޺o\g]k|Hƴ<%v? lOw$nU k FgFPкX*)IWzk90_~4 RI 5Ugb$W<[6¤C˱ ߉yk>+A~(k?5utM$(Q>Ḭ́hJ1zuUGfotocx/data/patterns/fuzzy-blue.jpg0000664000175000017500000001407515247006660016426 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?J ?JUkyuAqz( 䓖R!RY[$ |[,}dcMBc*K XII tZIUMrEXWqXMRc*)dI^(X8\ɱH|H6tSTUkiٺܸ@@=.c!`ɻ tMU&)HN U1l1R+4{6@Z~.ZfH*j̻IuTJ36CM{if>UiRlH:yCbd*݂)U -h?AԭwR{!ZA;y`m]vdxmFI`cT;YVF@ -8j:TZuΛCYM$&vgvB1FP1S Ep.l}2)(mч71edPR۲K{:hn.5"ºHFe"H$91l2ĬyV%R/+8v>(#ctkRtppn{+ N}4#MZ4Hclq˸+vlZ[;rWg=pH_"?0 3w1b*}^ׯf[u#o{El(QRU%[l67vs$qp"M$/u؜ɷqb6dG#}^;[ hf3Bb(ۣ "(QQAGåumэc%Wʻ[w)\`K2ǵFrU@Q!bC]I,$XI,w!2mdTx5&4ci6!㸑Q^4b+K)ʆ xYD.e4m2QUcn]T^1ۛ^t.<6:iYmI#R[nN 5=NM2f-)dg ,4'  {-lbWW;&F !Pv$t+q^](U,i!kғ1;$, ʒ9' 4۲khJ-p:M.G eLmR1 Vt6Ϫ[EIbKP$Wcpq"n[DKJk $,ލ,8*։yxJmlX^Yȳ^+G#,HϹʅG\I ݿt ooNMKk*79DrJ,s ۱:hZ[u[(m΍HU;i,'U`Kk[ M $r[n#ec`*.21E9bF9!&I-]$!2"|8- sڋV+tEJYgIQo!I0nRSK4K46JH]V3NC!*w3( o2g5VDd@w[Y[٥ƣ\,mjvr02O0cj1a96s=ơzGB$;B;ٕFH˭]}KC%oZ``}"v`5ݴ#ہ$گ֢ݣ 'y'<|uĊK "oK'U{p-.aR!`Wq 凇mr'B\* vXrHF]HcTգkyxnmwsyӬO+BGd6I^ 'kdAXuikSCoTUwe BΓb89&[[O_#@F;q j6h5ӭ?,>I]yChfb)^ɿ_,{D[o카;y.m@f%UIBFkCx)MN<-ѓD14pi;$+~Rۘt ʛڭ|mP>k+Ny \ydY%,0)E>נk2F(YҢv|aYU (v/jWWWϧYOe!dtZE/4fRۛfQtBmD٭͜IȚO2|>TGXecua{wcpc۷?29.Hid1m gJ[M9!#n;q gTinB.t'fd%%H4e{wkwocdeKU, dylLUSb5ꑀ%#ڥpQ9*$[5s;>\Q̚_^X\\VRSd~[1ffaë2a/֚t-!3ݬysrFs[-z%Ү %CYxc)47y(~aIS CqQN/,}' ^8.%u۔N3 ֙I.ZlL%-wg:I5/r3dp2Qu7`It mR*;-Xҩ 3X{{)dki#,Cp$6G+WoY6Ū)[\q(ʤP7i_;4lܷ:߸H'c]Y'v`ׂcZ46cF;X2*fuP[sgv!'lҕ;6,`׺ K<S,TP.cJU8 .k+/YG4k<3j$)RҥBN"[Zr4mH%I:pRM+}p\YEiim.㍕Ycē! e،ٔ+Tf40\Jm$I*E||40Vi/{wz%֗' hϔ70n9f.|56oEtۙ.lM Kl]o|C.qݲ]1߼u"bs 71:#<͋];̀]HN|ϺX9Jɥo>kXuƵ}BKKYgg@Hġ+ 3աj7Rl\VG ˆwFG B[RKS/UzzĈCi-im̊Kpn"$)0^)~._q|i1jMc#O{>ƖVC4ČT:jt7SBjH".Qlel+2 +X$ӫL؀Ϫ'U!cFU!I?d6Lک#)XC4rl;)U)_5Iق|`քt[\$$WhXQTR^tgZ4/jrӛGI~Pa);UHEPK%qd e{g!kҴ_;Jb FT Ow2U74wrZiдF ]ᄊ/έ͌bNO87}i>Fb"aal;B g 6`UY#7@eM2B2H]Wmfin;$Xw#p;F{'FP)m6ؕ03HobcHg(Nqm:2Lf-Q I洌lSy*Wi0eh]YaԞe3yp UN$8nrNh{%pfI  mmYv:}fM ʋ|\ a12I J3_ fotocx/data/patterns/linen-fine.jpg0000664000175000017500000001073715247006660016337 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?nl5;xUK ZepCgS1ILEqz-#I5:-ߑ$2,SD,ix9$px5rKV.dGk v\>VkygBdn%YmIaEMd`Qt$| 2qM&uZWeXẊ%19y\{S\٬xR6qO,3D+ߑx)v,L|-C0ݵw$du˸tP62k+z"16y#9,]hdcw@%@Ϋ9Ld|WS#&Ay%HFcX/ t kWJ4M:U$TL奊{C+D1K&r sKy9jwc,Rְ\nYHO}"IHREr&bѺ{m-^uin =@fb3qTlb$sw" de*Ux8*C}y4Rw|)с8U5iL˧+H; %6,wuq 4$t$>3VMvwspm_ Xb)KVYL!"(q54 .p m2ۃ{m9BK{|`Ʊ4kxKͦݯy /FaB5ILl17̮>OsҠY|@\J fº@%~SAR6/(&HUDa!K~ *-ܐIq(@݇S I-?,JC Ӭ$b۬[ѤR~\px60OMI:/ r Mk!Մf $; $0,q}Q$E%10A;[Qc6ko[/ mm-Jz `i-x/dU</^#Ăd^dYv*{m#U9ܜ#5f6nJAo M}_O15u0URXP;"d%1) ]"/ⳭlcpEo$z=hca:ի va*ҢV.A^G 4EXGw #t%` =hPfkK9 Hb۪289l:m4P% &]Ĝr2QG߷జhnq2Cmuo,qZ̬cX$La'ހ3 Y䶈8 9J[FU皚<0fNHig(d[QԌ:O҅GhQHH's*'QId/2!Fv&sӨZJLsXHͽ nAӊvF{)aݖG6 d t'x$Ƞ+f<%@Mwq%Ճ@ɍTЮ\g=x,i.VQ8420E,1S$Z8.y5/ō9c/ ER廑#S)SACJι-y@-90Ik-ĦTBzg֬y%HdL pAȪMޝq;K,Q5XǕ|A֮}UXdX 8]9f4-7j#[+0ɹHӣ9bhb,nWpiuݕַ֠r:Oei[v"{U+k1 ծĶW>1(ƟhF;8vyW/0T쎀s Z:^oxluI [rn8$shj&SnQy U9AiXiPG".BU'EWnH'fM,Z\"czm3w<c!*͕#ҧkw4rfEmf2)!TP_j&kmV{w* v?uߵUleUF1[,"`0WC GQik{؍kٷEjM˺EמJʀʢ)f"N@H\[^!BAC7NyS46[}JMլD KfЍџi @K =0Ej+9la\CG䒹qހ(ZGsmt _9GU[# 3ڠ4$aP/ʗ~ 9=*Ο-1H K>qJw!8y_`GҀ3.t=4E ^;p"vɸ |{QuEI4N[Ѣ+| S.dż{Pda @m<Kq]JE1NR fotocx/data/patterns/pattern.jpg0000664000175000017500000001664715247006660015776 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?/x [ Vɋ \[-Ŵl,A,Xȱ1wE$2+xZxsGt;m:VkM3R j:-%kx1ihIjS$ueDp.#8?ts=|.߫KcKm"s#G,.3fB2|h$i=EXY6~$x^$u3[Zgu5(A2;`TX*SfWzgl%ERԭD'sXiV O*9gAm+SP[_8hZnsI<#-擸cs+Fl|J|9xOTK}qGk[jѡMؒ?V0gJ-{.vkYok>'js.{|:KR4"(aÅecI.x "=JPw|~O7,tد⹾HatՋo=6쑿I"8eeE Eqi6&iEl^`$ qjRgd/I񽝾u>)D:^Ya")Jc1TZ'ź~զtHMj+6M%,Sk'Uυ"ntA<WFX.movG(QKXö/Ԗ V|MjIfs*5ͺ 9*mrj.}'g+ۧ"gM(ۛ* X-ۯo"VYV 7̌>TP<|9VwWzX]OP.48"T`̓\tRҴHBPC_4Bݑv+) KM4,⫭7K66-DKx Jܪ"D mޥpj}ZMT-^{hGvia ܍%l23 'i?ؚAc!kK{1:έ>h7[-«C'ChjQiֺ;V4LMc 1)iI xfG$'{AO H&h^8^C f۵4*n*]t%si)ǧɾ3DҴCS״/$6aV24C,Ti6\᜜a@+1]2-̘&IUB*Lc8mWyJhWwVw2K*Gz*a bUTgqm`Αgw/cI4f KI71eS]6\VV{IJ\˧IhVwz𷌴+B[E"F(I#%w]> iy.s|sj0Bh\`XRXmcemɵ*O. Qp@Vq 25FdH%F%F+Y-9"VUԖ21gPBU_¶De;K!u Ż5%Eo>?<9;!g:WA*EWmU%WiRx/x>:MXj)QD'K7>ц]pNmk ;9u@jӕlrqZ3: iZ7k6w2C.Kc|A@ʠP1&~iNOdV'cxZ5uۙ3UK ȲD2(^rI=t+>כTMnXzf<#F)a1M)w,>%x5m{{ɁyOs DJbrFy/'σ(.cW(3k$r\eIVr`2hg.wz~+pM_٬5?x~;Oj xTRDN \?6z=wM/X׵7k,Ʊ}mrĒmHH*A&Ư/ӵmu ]>t(^K*I伈wby XlRE4]wEyN,jIଚ'OBBmUdkHBc)KInltKOE"ijPHB8l\:AJCEKKKN "Y]Ѯ3J83q 6T t.nn[%innO FVSSwʹ߼m*/ ^5A=j d9.R(|GT6T1# U{{F֭5 Nڜ:cE-]i) BT&Q$m5Fo?o4 ;OŽ"%I""mk^j|mr3ml f|]94=>^.${M'5tB q)j_ؒjwfHmm TH$\mX8+В>&xJHWX?DqL]MgGXT 0)Ep@c7%_ s\{t*PO4MB]N^Ӥ㿍%Y%aW$*;iݪ[^t˱c)w"2#YX[#uνOz0i14\G*RDP̥xT]F\[nXR8Ġ`ulgcq3vsW]:mAhzFOjMJcɧڤbv&d9 G] Ien![n.ciuKy6;fE!XDj*GtԞ{Ԗ+ }ޯ ܷQL`̠6Bi~"~%Jk~SޜbV_7hļrI`.^TsNWk濤Am4]gs=z]X1}5MP5&UrzSƞ <}uM%[:O'XGqYO,V[S?xKӮ oV Qmtr, 1! ;k]joH𖂖L#[$[>u""G*UEe1O)SgrӶb^xAZڍޒMyŪg&w,~HARGM^=-#G(4') >X㍙k1V]~Pԟ>"hv}ꚅ3%՞gb$F%i.BƋ O!>7M̷P+XᕖUUXyh-ݵ8J3)%4|_%[O:\7q^r$Blo2+8J;ɪ?5}{zzm\~-RBfK91BÆ$.Nj)x-k|LөuǻB H@ӅEF%eMbޟJ309($FY[y./WRw'oBנu 5OEo W[%̒h]Ƣ7ڪHK]i7]-{'V}8%q9h$f&&5,8͟k qh,tgQ2$v:Hgo91-*w9|oqgB,n'~{X f8fma9qcOanNX~s|MtQnjnɢ&wZe {ۛj)b>bby.IRr#}P gMv@\3HccGKs"|T'-,R|Aqsv.Eq}<%>͕fFrřV`,~5 kSi;\R<3[G0kKxč"d2:J**Po{_U&V鱗#/v>#֖m#e"\DmIvR27Hۚ^'վxzuޑkKa0ŵ ZE<AH=A,>-in5 NFwdx.S _y4hW~vWS Z$)5_"vpXriE?urpI'm[Ğ𭮗jzgk3b4мlѻ%#A ߎ|]94K."MTD-$K1?t[i/~ H8D9H/$RFQ.,xp9c̦$ۗU˩-<=x3Mtvh^if)b5Sqr#srL%wX,MVYnyG\┴hedV ]{ h6{ }WWmHfgFxacŸ}hF].?1nyb4Hv, )yvv;~ ÙRQkYmz_|\vv1C8 8h8VQ{BR6 ?|2ծtyOy-Ksr?Y Wm6F[qe[x6Mz]͓>2[CҲWBmQmPGB$dFi_ql1>P'&FB)8{o~(M++v⿎ isi _x[d=k ̍ J;!yxwN1^ܽ[]$LLK>J(+K0Y a"hd_,a nT2Lh\%+( =.Ycon]Щ 9$տ|KQ,Sj2[Zjr]H7Mdm&hO,'4?^bslw:M Be9R0tjJo_'CmFD3IX0+^K|H,)2P|߯M+mk۹[7VzŚ5Ɵjzם-XFb0c0K6>!hw~׬gI>(ie oo(XK`>Kse >%bL|^\NO5ƂȰ:-ISݳVz.}|JEX_B"mB[&b#3:1IUd r~rRnfotocx/data/patterns/pattern_117.jpg0000664000175000017500000003165515247006660016362 0ustar micomicoJFIF 4http://ns.adobe.com/xap/1.0/ 136 136 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ??xoy;{msF{?/g-+yv|޹ݻ'g^ T_,o?|cf\ݻ;}g~&,o?|cf\ݻ;}gM?g?yzv쟽vtuo o׿ ~-ؙq5 uqvBy-?;3IϿsϵgYj~1}Ǖ_̸Uvvnj<' ??~0yoS}~b(o|7`?o#ϛ;d*Ao|7`?o#ϛ;d+Ӽ'o??-0x#>pklo?|cf\ݻ;}gM?g?yzv쟽v&v=N#W?IF[cE#q\|ȿ@Y6^.Ҵoϲ&>Qs>՝ea##WM~#2V=[Ɏ4|#{|y^]z&_Q֯o|7`?o#ϛ;d+Ӽ'o??-0x#>phoOe>g}~__9Ͽ׮s>խ T_oӯzO/?GmW?(2/>|Tb3տb{+k&c_qvݞ=ռ7 Ox{^_Ϲbg_Â~lOo?;??<;˰~9Z/POJK uqɲJ/?/J~g9j+6(MEYr:O/?GmW?(2/>|VOo?;??<;˰~9-[/򿶿k?wnmF{?/g-+yv|޹ݻ'gZ=/CVMVgP>^|Tg?7Ww_o ğh>!ſG>[7J7̋N#>|jV[Mx{$}[:?{fN#Q T_&}+O?3(s\}^+yyU?xoy;{msF{?/g-+yv|޹ݻ'g^ T_,o?|cf\ݻ;}gZRi_BVGF<~Fe۳v{QoC# KJG7wnlWOV& <={>r~W ^_٩7o/}ǒxJ>/G9|Vuy__5ˏX;go~,!/xw>%>>v"&z~3_hZVVGF<~Fe۳v{QoC# KJG7wnlRjc4?5^.Ҵoϲ&>Qs>T80Vfv{?/g-+yv|޹ݻ'gEy__5ˏX;goVGF<~Fe۳v{WOV& <={>r~W Z?i7~GwRҷg۲~qe+O?/?/Rn|3=^_٫<' ??~0yoS}~b)owZ> _o1mk3.?`ݝ۳ڍ&z~3_hZV^|Tg?7Ww_o ğh>!ſG>[7J7̋N#>|jV[Mx{$}[:?{fN#Q T_&}+O?3(s\}^+yyU?xoy;{msE{_&_Q֢?|<7 읟۟G}?׭eU(jM&z~3_hZV!ٿ =VgP>^|V&_Q֣N#W?IF[cE#q\|ȿ@Sk_ bVGF<~Fe۳v{WOV& <={>r~W Y>>\hdLr~W V4 ?aa};)i[?{8Ѳvg}})7>_sZoӯgWxÿo<)>{ ;t -[/򿶿k?wnmF{?/g-+yv|޹ݻ'gF{?/g-+yv|޹ݻ'gEy__5ˏX;go~~C=;~,'&=>|4?5x{?/g-+yv|޹ݻ'gZ6^.Ҵoϲ&>Qs>."z~!x>!/G9|Vuy__5ˏX;go~,!/xw>%>>v"&z~3_hZVVGF<~Fe۳v{QoC# KJG7wnlRjc4?5yޓ ğh>!ſG>[7J7̋e+O?/?/Rn|3=YZ> _o1mk3.?`ݝ۳ڕ迯#G7 읟۟G}?׭eU(jM&z~3_hZV/Af$SZwwgeC/z=ZEZ:^wB'!|Co폴ysR"ywM&+O9-[/򿶿k?wnm]?[$H?m&u\8'dF?@!qs3󼼻9LTĮd!_٫<' ??~0yoS}~b+lҴ>>_{ڵ2?"#$7M?g?yzv쟽vYj~1}Ǖ_̸Uvvnj*jeU(jɲJ/?/J~g9j~,'&=>|4?5F6/CWYj~1}Ǖ_̸Uvvnj^$#A~-?"JQd_O }g.?vnywa;8sT_"uo o׿ ~-ؙq5 uqLY6SZwwgeC/z=R%_ x+DE߷[l_؊4 ?aa};)i[?{8L^)ea##WM~#2V=ֿOZ> _o1mk3.?`ݝ۳ڍ&z~3_hZV{i7~GwRҷg۲~q_i7~GwRҷg۲~qg?7Ww_o _o1mk3.?`ݝ۳ڍ&z~3_hZV>\hdLpkwN#Wi7~GwRҷg۲~qe+O?/?/Rn|3=R'm'?|Cl}ȶn+Ro{+'7 읟۟G}?uy__5ˏX;goIއG?▕;>o\ݓاoEZlҴ>>_{ڠ _o1mk3.?`ݝ۳ڊ'=A[o3?wh贮uSZwwgeC/z=ZEZ:^wB'!|Co폴ysR"yw+_e?Ŗy__5ˏX;goMx{$}[:?{f|#{|y^]z&_Q֪W2_oӯgWxÿo<)>{SZwwgeC/z=ZEZKM&z~3_hZV _o1mk3.?`ݝ۳ڍ&z~3_hZV_s-[/򿶿k?wnmEki7~GwRҷg۲~qg?7Ww_o^|V&_Q֢\j[~xy__5ˏX;goMx{$}[:?{f*ѿ_꾶=N#WxOŞ#^%/`ħgQELUw".IއG?▕;>o\ݓآVGF<~Fe۳v{QE[&M?g?yzv쟽vQO? fotocx/data/patterns/rings-green.jpg0000664000175000017500000000637415247006660016535 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?,g gi|mb%}iSVMSTǥOM^ /#W6Enj1tDsxyst9>X^:V ?t?·M,? ?fK42c] lΩS{LR0&\uU⹥a,ڰ՛Ow(^Bwggzr,*ҝ 3]I+8͸=9Sn[@tKf3ZU&%ًyUץ6#_Sh|;i;t+#qn6Ƹ(R&i<l$:#R7A*/آQ ? &M7LFAF 1+VIXrdWHڔhʜF5η]$W˃R'.VѱSG<'%< p$?.]c=X?ZjFuUJ$v=TX@2h3Jm |ֺVRJ>GoJқXwg`c^\RiB ^c/WnDp1ӐzqX^Lx[tf' } ٲaUѿM_G%Fb2Q:ZT4,L [V J:j"By1 Y:3V XЪk\5\YP:d ROПkV֥YmX|$mvDϔbXcwW>zQOGhЪ80'5iyVDL7'+%$='jzGحc Gַ7xLLK rr<}* I㹻5XPM/㱳\,}j*o3Υi;-_k="T8`Г\ׄ4i.Fv~?*嬲j ,y\0O>0͸mt1Ej ;]YBvi1ȹ[9KdhpW^+3Jp\ߊVL|+na[cxW>lg8g7aiQwat~? ?/1? "𴚅ڠeY=jK}der$XԂ1}9]nm0(<ǚj::,*2s_{|y~pfOYV{²:@>ֺ(&=)vX'ZΞЮIDRky3XpKF:b)y[J5^@"iqixQUF zZ6$8%B<봗,RoP7`L?$gۡFz5E L6/U2" rk y;I9isODx ڍ5Kqrҡ.ǁַxUR詇KEY-VT>ZZk~TLC]}yIɗpqإiVgVָ'PGu`H?wꑫx2+e+H;Imx3$ԓ]lՃ7$aHqXZʹL Yg')˕-L"U54%0ÓE rK[洎yAc=k[R"|? cuISQ^gfotocx/data/patterns/purple.jpg0000664000175000017500000000657715247006660015631 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?$L"71Rt3:O֦mt-COU;ZԂ@sޞVsgpv;yNJ,Bkb>[>99Aqߜڀ'gKT|,X}?S,:VJV~Tēf!5iR cy'@ dq߭3U/qr2v<@ q[2@$sOnmsj'P bx9L_A!'s6(~+X Iw`2編\lajp1FAVN?Wj t C+3`8,m$wsI2b!J JI "DZ #zDdn6vO?J@jn#8n epE⽴bgF`IC㊂m6++Wle[\v+I"-^ -nr) R:GvRio,ɑ߸Oެ[$@BS^j{7X01@a8Fl#sSY\G#ȓ:B+Z6z}:c0s\wF Uȱ7APx먠xMͭ1F 9TUgf(Aܧ8l}h53 Iw,rI8[p@ʀ.j0 OO{%ݷ8f1뚆qk3Ey*0ʸ~M\Q, I'⣷/\$E2dn8z'6w9ҕmݺ՛IWOԭrvPlw$}XR^fn\^`VyP7nMQOِZ#+ZHmTlıd#ǯ]Gw qN6RE#le rsځ n"k|g&Mt{֍ډ'` w,`3̫Cx"$.>D-Rv20bV"ϿZkowmAzz7#:%XnO%p9ӡo8rq(ܠqFXAu Ms0J`d9i/tc #}돔kIi4V+~SFNxv Oo Hwb(HׯS~^Eiڛ%̍b)0?^J b3ܨiQ|Oƛ=M{[J'~Gtfb79&BK3=hlYId | x'.cB@AV$D?<+FUyKy<='7(p sYͅC6 $`?2u#<N-HSʐJ۴rA<ʜqAh;fxZ1D.8& N3 Fr&!č-wVn$X)@P1F:{uIHeG 5$9Sɍ`9۞߃0]@?ٮ.ڟfr%ޝqT_ڏlb-age'?zP䲋WAbky' _`|W@mޡCA߾)eg[$ 5[u[K6uH 28Tl<3(RTCiWtqR&NhK<[FRD·ߎC7n ٞEv(0).{XgKIf6W,HLjm?I|4q[ɀ9h;ѮB<<U{)qϽIucIc,fSGkQ[ҡi-f3)|)ެ==WV[yȮ€"tdU-`dR=:N=47+ q р9'C-Z.pK$j~Gs*iWn 19H - 7akWi8YgߐF+"9!S941n#`7HZ[5x-Mܢt=q9tI}gN`1䁎xAK $sDVDcV$al GUDS2c@fҷik֔$,@niEZYi&h `=E9 )Tm݌~ULDz*%1Gހ Y\b9چQqNzgoJZho)/:Ž8(dDKP@p\cڀ?fotocx/data/patterns/lawn-artificial.jpg0000664000175000017500000001637415247006660017364 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?R]RytĽn!-y:uK! [&C˶Al?:\QI$O&ߺ6)L; 7~m]ìvᢌA@hKtaؕ0"~*! 핵{&Jk~v*!fUd2t*)tg*Q_~\?K.ӭxJ6`VIvWAy*g}5 Vxʒ&륊Rh1fRNO[:ouNӭ4CO%_B8Hm$(I*rpj/mgmg}|QؽFo)"-7>eTQ\Ro{y?0k~{;4mc4L&UNJf\yioZܴb9 HQYrI\o\'ПNjfv3F@něXǐŌƳ~%sw77>ceBH720~TK_ؙ9*s󶞧M&EvzuvqŲ;[wI,>s#'ˤD5ƛc(IHo734EFR{K }?RIO#6|e.@&HۚN߇Zigu%͆I7l^Ps<F O%Keq^սmn~\rxve]2 q.XYMKeSoq $q$7̭J)1?!-#oVGIa,7 Bdڥ)qdE7:og;l՞9o! EWs w$]Y -Tu&t-Fy,-[)|&34TJ9-xGOmcwYαM>B"2*l9u1,AcOYƣ>R#Ia>kn;mY$1Őy7mP[qKO u#}MkM?Nk-tYmY{I]PmY[$եoVAu_h:-Gi㼺HPng}bP@bA$R5!.2I<6Kpųt$h,J/$y∴{KOO=)?W)#)]Iu%5}WkGeÉ'i?t!HTb`gTNY_bk+?[E̫i'tPBzqqZŲC)B4SfRFX|`{/]xZ5X.md^)lӴ`F*dFV<,3ΓMR5)n.Es5irv]w*fr*[3ʰ[ؕa8DQ"3bUapT()r3W?j3NZUl,-0^%7b"d8BTnY! íOšMƱc;gc7ub$me.{tSi֛zÍ68- EYk&scM:$f.r|EK/jZCFt[&B7y 9$/ET' I[}>3մ=_ͧ5@<fSae$)Ú4:hSEɶ,=\i BY,'ľbt6{5#yH]Gn6,6nmZ]QXzQy'a}dYc۵sk[5W֬[LM6#hIo%;V1L6W|5VS2 X]hƯ5QY$،6јuYx77=u6ș|r2ʲA{RU nyhG(rgFe2tW2q286+)[zO &]Sl 9ie2ܴkEC+K$h(bۯ ׷ axnYoM:`uY$` )=5ƳXx3b薏%Yqf-`qt+w\BMȣдo ޤk w)kMb+ X30Tbe?^?عeNK[k7KpSʄ;>B]gD#l,|^h=ӂWuXH `St=n('eC,?2\HB$㛯 ;NOx#C U9U,8sroGhQppZ-߭U<ht[RJh5ź܉!hr/FQj7:WOZr2DˁF/x[%JU]~}#E-unuI ^'ѭ1 233y"1O @4OGլc tlr:"2 \18Zzoxq][j>^=N=LTk^OY!ʉrE%0b$RM}#wZnjo46R8]і)L ll]̪UZ׈5ɷCZ,.c(PC2ΝW\=258~}u5̖sP>K|(*s<_e|J?tbt'T&lO!gHfvэzd~\K IxFrؽiT7[\4$1DV("o26UB 5(r(QQjp-zXvci.y:4+yjѩfV[eB{%,L:͎gs5Imh',q_`n- R+KU&?dĈz:4)*mDuύ>"[QƞG7hY.mr,c˨FwIGײ俯U>[^Eqߊ<@d:iv2_KڱXh8@FY }eM{&S[ii'h;oyfJ{TW6 .z.4A4SrLxjn|XLuW2\Kxc0(S7JVu*F+O=?6fV?VVZU/ W]=u{ȍ̂gQ&hvFsmEj6 onQbSr;]?-9-ψzV)-uS>"+:oܴcĤU%ʪhx|7jtZ#{ EٹG!ۊvm_OL^׶zcvxoZFv!~o͖< +42 J{.u{(WHKTI$ubpnf;K!K'4o k=%ODˏ+#3)ym 0i^l;AsOR*XRFꔹEJWJujկ5kTewnVf滛-|MeWB9ii`@6# L dq6XuA>R{5tX%eF\ *J3B6l 5߈A{ yh|i!)!H<cxY7/䊋;A'm/ݗt:~KHHjzk$V#tm"&+C s\#ڥ}xm [3ռm"$pJ<#$UV{: k) xR[+=;(GP26N]?HգKLp3HmTI%%{Ej7~_m~<^ZjP]ɋc2%̗Pv\ޠc<5xT̈]K,,H w*+9##zO|)h|#%{w n7Hۥ(f$ u;Mյ$:~s&r4qL$eK(%\H ӷE??y--=%qWroi<^ZK"9hF@$!BKM[4m BkC$FeQ!D)=a^XdxJRկG,n|t,ds_(Hު p')F[ NS9lmk]>jEX׵;IJ,~sLCYI`]:-ܗqW7e)Q#Fсl2j维F;w>G5ƚfxB$B5 ڟȳ6xN+nh."e))mۗh~ƥ>ed޿费Kz֬V6 čbHвe&UQ+ܬAt7> КWQowLmO)6r*ǻcd0;g2^wz=Zın(3I 2rA| 6ω/-6^I<#HdX>c $1Qm6_gCuiKsۤw%X/ R2HnUMی ٨R4 `6PգI+k-*YFSvܜ12wJRc8)EOؗL-BW&ޡ!Ah712n;6\uW?kYčp3u%J*%ćxx΅ZO{|:tP;h bD̶`\ \x^4-l4V7\kSsCcg\VZ^lq_mYgEDU>o,1Ǘz>Y,vFi7wXm,4 tR}3 IOw^ K#Z.j(_iԪhSFUZX|W)(_MwC*7"%-*~grHMuo-lne淝fFHVh@ZZ^;x|YCɵ^7͸}r:K{NzHjs5o[|u?fotocx/data/patterns/pebble-light.jpg0000664000175000017500000001062515247006660016645 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?4MMA"' e~z".*"c\GC,ֲ(Ge=Gzu?-ͩea \pU;sy߇ylDX.~Rb+!R1|{ןj}mm*ȁd,k=)ErúfkWvvR[ۑ*l\5K[m!KɁx`$G:xP_x+cr:e&y+KגN=+=_κtinlbslv6/^InE2i.Oh9`Z> t 5ظ2!8z/1 |!KFM3l¶v6= ͷ$XИ4]D@'oRqǥGZkT8%RQK}wc3].:%Ч?ƫytaniy<[^ o`JDۍvM[4MK6+6DxpzNR&&n%EǹSImxVN;5;p9+Kix{Xu}BA*H†6=(|fu[ޓ!E[!,i#QӥcxMW]ni w"m?N1zנ$)B|zt wc6Zٛ9R}nkrˬhzwلr[H$ 89wA6>sE1H SpNMC}KXo-ZE Rm[d<9r9 u}{wZb'iryR,k>9_]7K 0Rܒ$']`f~YiZڽΫ}w1-5>Ü A^s$P-||=A}OSдM"[;2X=gI$%$.@ݷI'\j֞JhwEfR2LbǬj]Zd @PNԥmJnGE6ʲJ3ׁ"tm"[xncs,P~DNjXnd{y#D.|A{Id )eN01U.4Oj&ot4v.唩'#ix3GMeMJ瑁A[𽥵-PA+d#&g O\HǦNg!b2 8Y v)4pnX[n;^(r$3|ym`0%Ln]ʓz5ỿ#_[hz#~@'ºL/:|6ZDr{T>:X2iZz׷4r} )uH wqgiQZqFϡ9mnI.>'үtQ2, Mv6, z}97'Qu}AɁY-AV>EqnN `@M6\ܶ|]k!P,4|۝ c=vs+L pP۟J崝6Úm!L_l;̯,I'=TSz~EDщf3ޘ'bޟ\ME$n!d*Q۹ȮbMBw pDF>n~G4%`&ҾsA\GfxRT񶼺u쑛 :plrvǾ1ޛJusg_\ΥPT9\eͥJi+/ğ1]V @c^ez|a= E2\ą31qFi+bԿmw{wE8}$'"7#GռC>}V:eV1,ehӿ^gSֵ=sIt)T6ԟc]^EW%D+1G֓fd%^ swfǭgO3MiIj(z/5s[ˀHi|s`-Zz}Al#RH =|]RK!!ʔqv(hZTK+HE귕tA Z "Zjn~[2AW$quZVoq\C*"1%rpx#޴|_ZxcWœy Jɭ{qjv+Oiiv[ot e,!GEKS]#;^SPEQ#^FI<b{mY}DK9E̋p Ԛ~.;{Y-;P![!=Ҹ7Ŗ &Z9HicA]{6 @23.. qXfΗE>OCK4 bs6{c$1Ayj:AL6q9P'nru/ ^ؐF ;W\u^J s}|Āq 1jVKDf[+1,Q0^8ֵ[LtiV.^ D2k7^Y"qp_9^ݖ#eFF$kXPE4RH7ya9Z贿 ]JŅw7]E\psj)S>ʖ#Lf+W'dYTTt~ d̻q:zWxszֵaqAldw|YG|*'&v2=N2-+БQaKw.Ѧ.Ȋ>efONEiq,L )~S_l L@yl⠴}(y=I=y4F?fotocx/data/patterns/cheese.jpg0000664000175000017500000000415415247006660015543 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?74?<~u'$L{OJpR8 Zl,*X`ICzEtPtI+Jdb~'ZWWLmY\%}y5_iZ<)3(8)G([-xj޼~/ $擕F7՞x[Ϲ[VJy漗MѦ-iqת[5RciuFjn̙Eb3SQ> ;&KhF@UNf{Pg1x/>'뺥M+.7' 5[P`cYH&{z:U[AqFąlL$Tp#lCN5 w<-}\W]ekmZmk*/O ◐@WV+Wdc\ǷmW 6Ȩ"F3ֺ Ib *z ,h>UE2KˋO@1'yQ[ tVg,H vqZ%ُMAH 溟B +;rI*j{?=9P5nڙ:5Zi6#=^穥Vk2 8H@?^eew"pHҚAjvl@ N9HƩ4@iO\Ӕ4@4nтN#Si09QyN}j\)č(R$Q/'V̋@R+)$`՛a`桢: Dx=)Q#$uHdB1Pۼ1G;\-RNG8\fW#R\I(dNdSQvc*0;-[xNK8i%|S9]keaӊ?3j>)t0MS$n8ÞV2eϭb3ˆ>v .:[_ƨpF03;}Eq>@c=+Z r;VR˭5jZXثzgXjKG@cZ (ӳGIW{*KhFEH\O,sӧjvJV?fotocx/data/patterns/mazes.jpg0000664000175000017500000001623115247006660015425 0ustar micomicoJFIFC     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ڳMzjEu>XV_.~vcޤZzMj('y Z>4UtLQа)o:Iy9 odt7x|FҀ~.jx-ӯ"I uJ$C tBu &V[#vV꒴Q$~nV+>ޜmON)3*QYk *Ǚ,?uj^]WM8SrOm]xgSV[fVbCFwn[E/X-ǒqXy*Sx^)+6{FF}r&tY|Adle.-5j7S0u޺ |ݰ'jƑ5#@ '$?]# 8֩*Em7wIR;3,QP7jm:ImoӃˑV\4[?5"{Ƥ_hiuwpPa^[4yK?Bu2c-1z7!OÚlm,m"nVt;R\Z_IzySR2GIEvZ8q拍;gvAk Ԯ%o3$sȧfJ7Jvz NB6>M^ek{.,tyY'#/kMUEV*;]I?f5ɧ>YZ-ߑlԓ57)rlQĪjD 0A^ ڤR|{6KzxmR(Cg>OV$zݯ_h#Mqt|q lVq;*UQO̬v\µ(-[zE$>|ɶnc~oW6 j ҕ~gʊ>DZmU{5xbVWn-mBN8I䓾megk kE:lvџp=TQx~M/yK"xEX6}V )Y` \w[mԭW"e; ؍T(5ky+8Mhm$n5Λˏ䈁IT]ZyE2 'i$4/Rr 0Gqn|Srm)i{v)9. Yyg] 5=?NTa":Dc<;t{i%Oc?5UUhQ=븚}nJ3ג^{mnY[~a 1G . QQi5:]>}I-,e7 12q4Mo\+6ݦD;U%^Q*9;DSot[=ᰗX7So.ӽ&eN;kdy,V4[},vWL³$:`~Bj3T:i/v˳^zb_~}^Ҙͯ? I}`]u(a `VX>cgV:‹'6gחIaܥֲI趞>k}qlHc oq _t.%լs3d󼝿rkخ*4kkԓnJӷtgII"@oi`wn}kwZ_FkHd+sa[GKR]Ʃc硋Jq~{5n8~amZ7z?5f#E.?¯hś7ZmkTݎ?)J 0U馞ohxCScd&ؤ0/ӡFI-m YIhЂ=ֹ-o컄c*h3\iM e#ocor^ 䢹l~=̜3^c'I~ ̟o*$ mi{kj_L𽘁--ypO cSn$m[] .lCT)FY}˹ 4'䴎\TrN{6zIj4+|M(?XsMuj<">4 ?yʅY6g}-+\`nxRy/z1'*[MZ0"n?U4įs$ŷrO*{c(G(}^>욽+w뫳M2h]qa& yʟM-rWh8!#N23ZՏGt.%Hûc;k3e9(FNO]{1{owMuw C4+GkvKFo_'~tjH..,mN [nA V|#>hm}+%=}|'z gcTKͼ}A_ Ѯ14N;yؼ|ҫ 5+ŧZi\j_FM]. zR {K[E-#Y;Ukqh8okaQ.~{>c.3{ JLg-nm.Vmޘck, Uw~[j>> 4b7,yAXV,),̱8ٮ:͞"iphwncsy ݬ ʿ>mzjpsi^(E"sf4=qGu.{}Ke ,ySJ$u"y,AXŬzv{.gtuRA_3iܫJ.E7>s3C?1HIȯ*xoe/V}<}[vGkX:Z:^kofiYjGtp,Lg(i'f/l"Mkx~nG]*+5u~Hfܬ~Vp}+1>ʔ6Imuh{3ݮVoM<冖Gu,=u-%Ƶct_ !`.~ρ޼#kx0Y͞z"xf8}> ,51ӽT]z1l^Qt ͍jVT7P/Eh%k=b6F_޲CI6;[v$&w0WEW][.]+FOF/'~YK,&d R9Y\U4G'?J11J;SSDﵿ22(n=jW9܍ yp~.j{{;EzS`牌}*YZD׽nŭZE.X!tF8Fb ?հ@oTY.Eғ/&lXW-Ҩie ge'$ u]cZZKǡ2ZݘG>UII6p>o^y,f;mg&ua&1;rITFڎq Lʐ\J1N}N1ӫ+IM+=5v{*dH\>U UvbB.5cr*]lf-( '$=#FZe}1btD F?SǶ^ZKCt`2jt\}xOV&eЭo| gCg,D#z-c6.qיV3j4\٫/w>ZSyeFǘp9Ɔ8?yhUn`Ol"[O'uyn([I3ԣ[ֶnm#WäiwP,fI|eeߑ$:WPNt"(h/^N+k͍ۉdL㕶FjWi7ѹ-QQ#y6ڨrj 4n~W5qg0\Kw,@XV(`cd[zCߕsoJM Э'$x꺮"ն K귳5oq!8c,O%Z֮:ml_ylfKx5k1_c=9n6bK5a9RKjRߓA-u6O3Vp&ݴƎ_McI%1>hޭ7[PC}ܙa ֳZMoZѣ#Mҥ^\z.Wo~[zy2.CMk a5K­샎7UE+3:1JI\C-\O}{ouuhCh';Ұ&&n/e`ӥ%VnI޽npe}7v:\J.`oiچhZM5n|ij7o8ҵʹq-Kó0ޠ 3P;+/P|&禶at]u-ŠFcE">s3xv%|];PU|A2(*kgaIԓRv۾[I5TQm[vI<AdM ?xu^_Zikq*qwŵ)=6_҄Mz9=Q^Ir'nǩLנ8~+sTmҺ [$Ԟ5p4lҴO6.b={UJvM9vҼ]c^~GUCb<tZ@im+Cg{p?ƸU' v⏔*}ypn7Օc{p\f,#$Pxxt 26B_?xgu}L0@#6+4kk¹PJ--_~Q?8Eˈ!lkGڧz T3Ee[OZVw8MF*zu+kr16~`2#_ϥs^(`FC/nL呔pr4 #W^[cd~[=OePIrEyliK|1YF ߆kfg{qvd|:_w#n88Zs F `NiN{^U+Ԕ)d~F7خ%K 8tGPxzSk$YrEM޶,vr;tN5Kv%EV.1,^ee&":P&(*MáAn3y$G4*sҴNM񞭧xr-1 d)'4nc)RJ Ko}\ (^@n{Kqm4s6s)8U'})KESp{GuklzrqRAq9I`,3+ ^*3S&ch(vN./pw z ҽqpzk-j]Fic}8cv ! ܐ[XqQZiOFe:uoEy^4v.-"B P׸\? .QeX) q}}*X_t)JM%E%\22{NPvk)NSR?1YҮYcgKѐ~x㚮 e; )qiH7#F]֫4pk6VWsGy*#3TwZS׷&~H̹]Fx}7PY_ v֟[\Vg*-V6:}+W$qs~%_3À&z}r:Հ>HG3AkY8@GCZRu_**OU,*p~5L =ѥKRi->ǵi>Q-=mAU*r<#P2Ks!`H=jH?>kSg0@2 Q[ӭu[R$rƪ0u' Y"KXt,-l㕡kxdc+d"au< R8`c5,UiF9jڛ2:,̶mRmϴwj#YK9%Cݘ mDr~ [ RkMlߢGkHÖB4]Kr5Q]6h Ԯqd\R83I#w$V0,Tec/٤ǖB0tѿ_16"@? z柟{үF+fotocx/data/patterns/space.jpg0000664000175000017500000000434515247006660015404 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?좊ִKجQS݋"Dc%cpl5 vm΋Y m2OIfV "Hr ERyok\H6i6~RX|_?y6:T8Z./1(C'x(~4\s[\4InifP a 9Scy*<׼cx7c/tG o%Lܜz R4e>rooa{,bREeȱ $##LΣөI)#{T5҉aE?6%]pN!psPKX-l( đQWbծ+,NGkCsr~QE4ES(p&&gaa!E2(UwʫUl%Vw$1֣p}=3cĶ:{ldDX.חp9vM)>U{\I\*H"3J:Q>C+I(+61ȋ$Nc*z2H oxVmQm!<A"gn+axQ,aX]bB°5K no]<(<  @- /fڪ %Yȓ SHvfl1fURmg+ŬDʷ2|r&FFa qL"'2ki#TPbԡ3 ܿ#Ƽ)Zާs\֮9gE I TII4+DPu_So].iSjA˓(QY?Wg: SVV$,ԭQ{=fFaΩ!Gd(Z)@';uQEYMBh-3fPT,oUčV )`J.ߠ|?|WvئxA\I`W_ߊ%6vZ^EID8>~W"䳒y$Yϙmн .MAe()c5N?fotocx/data/patterns/pool.jpg0000664000175000017500000000763015247006660015262 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?k WN_Sx 'ǷVt/ *Yܓ7s>Aej˸֧Ҵ Rrz{uIb"FY_r)URTVhsE.u10Eqj,׎]![xVTFHS5ieviNw}}xҔ}ձnlP6vdW.}URE gDUIHzrxZ\x.i-x5 `N-X$d'XqN4I=.swФ7dOնJ$a8M`\\T{vxXKo=}Ir]f.`%GaA֗0Q}?C]|1"Dۈpwg*<՟YhZӭ"Bdlsa\굤E'eR[ <3`ti5-6)*Hvq8j: @}֭ 41haɍ OUv{MoE xX%%Y%dÚTrSXwc#`FyVm.p*w?^}+nVմtļVvJ]#V{x1iT˩: RP#=jQvl(I6c suB]d'^Mb7Ӷ6@9ik(*kqެjD0%ղkDަ|?֥YT0=Q3I$0O{cṮ25&m&I_K)m.7\mӞ9=*KM]BXI@8?Q\(Ԕtߚ^ۏ7P2ĀQxm{E*8/.Jɷ9ͿM,ؓxA9Oz9a[i?i(jѽxi}ݴ62Z[ $H5c[2ϛ !,^k.4xGvc9Q13zJP7}Qqrz.+>smje;p² mFteC%@1״]dT *Oy?ixQQ[}2K%iZ`O\?j[Z*h7ڵōӬ"W"V'Z测^YZy^Fr=? qF&I0ON+cT Bxe)s2mjьg@GٴC>{:/.o \[Fuij:-r$8ą @'ùgRNd‘EX^_L`[D;S3̺vPQ}N o@~ Mz}sTPd F=+׵Iw+K[{jM=ee19A!Fq%R/܌t:-1c˔&#c*NsP_ǧiZD)o}`HC.@n'b(d`g#Yi$h%hRaN}iz-uYYNKi5T%e@~+$N/na'A G=}kDW!x:h[LD۷sNlsio\\2͑>{bOvq!&VAҠUӠ3yqY6'DkD\jhmi>7)MK#1ebɴu8R6Wz4#HEHeOΨGmB[¤6-tUcYNe8ـyzw}䨿Z/ ̎QlNpREc.xեyaW{'>|Rwf802ݕ8sDv" ٟauRO=G8ՍFJ:hf<0jN%E\ᕹ_ʻ RBY4FaPg׎9յ;Cz!\+ly@n´WXUK]N=3Q99).O~k=ʤ$g# zߔ>(qŒ[+jr7OOӭR״˯ "-Iy#޹T&8I{"ajCMI$#>fGC2sU+e6)v JZcBF˃Ųs^E9N"O2Nj%C/%NV6(tty(L0|{qϰ 1;0ˎTmf/K٠#eA+W4;VLFű1Tevs÷w%F$}im5%d<6W 'ԓTY,.e$4G.?E.e{ªK cTӼЎ[ p{TaAbЈu5)0GO>Z\Cs;,1_ZJ<ڞꚴg>Dj*cp8uڹu6vX z~ Fj^ʄ%’q07=:*Cujq54IM2a:JΗ*V hirr3؏Mҟ@\f~jQOq6rQiu/zDI8{*_iRon~AewƅZ+GFv>4C\'Jm'}#Kӡ/$kL**Tg#Ozi$ay6th"P]|\BhkO$__9fawhi$'`ƫmM{mPrNl]C[tmxjcKGTHw91ڬ\[XiH#ӕJʿ#9m48o⸕w0H<^[~\o BLԥNqUNRqVeC4$*{O_SL!LJ\@|26Rѱ I?* +JReұaSYZ]ߙsλm폚cߦ+BXhM|#^kW7r\H`L>R9*i9Ң,As4:Sqq8*jZ:ެCTdt-Llr@lt Jx#Mu Su Hc%1=Julg h"wH,9g>snBC[h4t5݂*rI2IMYz:vZk-I[q-t{y5gͳyyT6qtfotocx/data/patterns/structure_darkgreen.jpg0000664000175000017500000001300315247006660020362 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?#S7oOo:Ld+D۷aW!qOt,m;k#C7roFrHe2yl{-7[o61H R:K*6u ֖X\麶gO,# iQ#e >9C9՟)k W_adS[[[bxVLq'EVR9"H/"уϦ,a?uAvnxsm&kh4PMg18v9"z z&Gd>KܲZ&'=`$K^]KI\Y.KmF9]Dd-)Mps8$DH ` ,Pbnoxg*C0!Q3%PN4FD6n,ͥf̣-QO-Οqi43."$pncYnQ[^EQnm$Wo,y;H*rxֺ(H*ʒDI0ۺ\}$qҪ61EţE,wXzG C( IFw-[\.$ۺeA)5"ޑ=_>p.c-P҆(vʑlwŻ=!&ేGURwbm]Y0(D7RȰ>& Is 'PeZkv6!@ FR/:y #:\WrHmsX֤ӂ ,fBB c:͚m2}q{s ȈHM?vN"EUv;,3Un(ilVdoIgGg hl'r|+} ,(Mk4o$ u6EM_^ӼI%ΞQO$Mऱ: ךIm# jnuO2q*D69^ӟ=Gg]D";a@R91;*5[iPx+RޑKXͪklӥt}|N q]ZicX-a0ȲE"4FJz%ޑi."=I'99*ÎGzsz~[]I}qcuۤq淒Ll]~*piV݉-gvb".9ͤrHU#ry` Oǩڝ-&K[%hFŎuaXHl9黑RKN a;isy!IV\d[ϘHbAEm̀ʅẌfXjUw1JO11qjSwwHwd`aHin/' }alp9تo> {H3=BBO/8VMmT]Ye}u9Ho4^l'O栽`-V.ŦGFp$@OKd S%_r ZPvr_6Kj#28"E*EXӵ |@[AqkCI<.0KmFjDEX{#t&ԙT'2QqA1x`4Vb!ۨO!Y-ɑx4)_f&uaX5yyȐ͌Rn-g42ϩ<Z?+#|ʹr iQU7[1z"Y%ʸib3BYp ʲ榶h4+gkMA#oے};1R@%Jj/ԒI}ZZ*+Gi_Y2jj{ &+EP!2Z,l!%RJz6aayi"HOȒ9D=JG3[跓YjG 66U9>n7rGBW}GU{[9Fk|"XJ_@ǦḌfM5ՕӵuDc d-}*-Ᏸj6 K6 dWP<U Ω5݅ޣ:|34 VfJ}JKkf/-"kwcLFX0 "ƿ6sIln~ciAIL`98i. [H- v2k`B0AR2[o5K 2JK{610PN\x4vy--G%$, A;H>Wn sJoB 6%naݸI#Duec}>KTG* ~d}܃E0q0Mfkǚ~y]g݀zgkx+u7_ aak,ђ۠bećSJkU9X-Log,:E#>FȈ܄7m-eo"@,ܖl Ff4] Qh4*cʜ#+4kx$$ J 9B'y\In-a 4- cmlGT(88C {kav4B@QGB:mqФʺL'oң#\g@]Y]`@B9vpzw_;UCF F{c&dxV: 0_q+ʀspA[2CjF~8JS!$أ|lpBQygG)T1͕\0c2<'!{@Xnses9ɫFd_56 py0y"N 16Tz- 1EUnF\ rO| 9,I1=<u9lc;b.$&tڊ$i@F~\t0x猓 c!$yJ1,0qOթw3Hnx'EN91tmDRB2J\bx#'#E;֥٤0n p-'зNkKpbfnz\AnmQ1%"FAu'qbVΒd!a* '9H n5åmhw6I܍ 8'5T !iQ\T 9peާk`u.@ȳ$fIe$+8!8x'` pD1!P 瀧rGlqbIHF˨Ɍpy0z֮-3]#e6s׾s$C$b2U7p "0Й!d w: @ #$-=BI CI;X6z cfekgov Uyv܈"uu 1U9p|3f4.nlW u1i7' JtmZi %搄Yw9ʆTa 8 {;jV+=<10[Ƞdf):Iф],ڄ gp߼Nj' ) [njq,|˽W# oڬ$W%īR覨e-J !x&o8*ʎX0a=Ei59G )Hr+~N8 (-_j,8.bDAm@D%ն6 U MB+&TUUدIª{+ ԼB&D,nm F8GTn pWE/ CR;ȄI&ʅjc9II@KU[IQBWM]A d pTдC62% )e+ ,fYIXn'x`Ndsu$VD. 0Q)%N8ݑެtVKb'nf|aIrn 'iF p* ;_d$#XYd؄q(A)E9tTYko4۴o2H՜ K2QC0nF(#FwsKw4P4sC6wm VRc\tZVؕbni;wè$e  /h:}/t"$"y! *ʥ} pTY 2xvm:;#:[;|'ˑU,] +Q;Y2\ÄY]9`T&h̑iW6is#)8*Z]wi# 6bP1SN$ M#үbDIu [$e#*ea#h݅&4} 3JőFR\$vf,X39ReCK+(cx K 8B馳7).-.Uı012?d!r#ࣗϲ+Y{wIQ_ɽ&a3H.q ju35sڛs36h&c!ԡff8#k(dKCc, ^vi8nHh[_4@ݕqTe|=-_?I-dO%Y}9V-nۡ# ,bE\,F\ZrS Q Y-jw{iO06 nb27N'r #J4튾E\YJLLd\[Dl70JnBNή҂X`Y^<]N^x0\Y^.#X)BM/6g,w[d 43D0)N͹>dg٬L cˑ#1HO  &;J}Fሸ[y "iK0p[oDIvZ-ϺMb7ˆ0X|1=6m#{hn"[EF\ . F KjwyZ#F,Fw/ Oږx'h..9`[pN =rY[Z.-d ;.'@*CBDmn!mB UnKȭ>C\!#,o*|PUKkbm๾Crn$#i@\lJ A{Y[} +ZǪVB3XrwnZRW@-'}RK۸5{#YJH\$1cIJ"A04piJ X bG'HӥK`wIa+$#XRцK,,E2èk}*TP m=͕ad{h"IBπI/`9v$@ho}29n, @cT|d]1VẐF>r=@bKF#X#T`g5==.M4&heX`02H2V!XnNE:u!f V@3`%eu H`.@u 4 .$mly,ٸcmRѐ Io3O /%xjwXЫò !+o^j"S`gQ:K9vɃ!P 8-;Y&xk-GXڙs $dsonZ 6pu(dHg aU2e(]գ Ow\ kF|Zdos+$88&WO֓wFH`Y+9+B;k S$ ,)<Te$We?.oDWb#,m2Iey$ Οoy,r~W1JTlBVB1{um e@ ^DRv# M!3KR% n$J5呱.O@I'9wO gƶ .x!($er nł{9}:GS `%7y" g Zt J(Dwj[̳FeV)c#e%L>e~8xf&H 5RBJ~n\)#99'ޑ-APc B/0w)ml>l@Y*[#P^Rh.< ڰH爮T3n9 H'YfX٥Xoe,H- E&2Z/#9.dL[Gbc}N.m݃$s9`xmo-bNŠڅq[,4ҥuU$n!K dwKqa j2Ki=Omm޽I+bAj-tsql#1IKpȱo^B3 H2ՒT[w'W H\d|sFB3ȯݭ .$VXn|Ĉ!X1 *ӾU(+d'qS"P"A<-sl2e]1 )'ߜdPFBvtfcTQ(rW6ڽX]l%|J/flHu-{QFYu/6^N]R9Cg`JrYCwv221n6a$O ;/BSoMj$D[(UI2wT_y>V"V 2i98 %I$Su(ln!BٸH; 1 aHizvrdM3,.I,ĝCd/b ՎxѬIsLel]%c$*H!wӫG]v+,ZCwY 1E,j)5YIPk28wIz6| JsCi7i"\F, (ɇP)x^ *xJ쁂`Ȳ`xdB51tmgLkZM.(]5HGͷbt jiڥ4 ֍la3gs1 |_ZҵӃmC,Hdۀ,*:sa-G[6E1#(p1W&%{yBI欄ܱڥHITP݌D,IqɕwT6 0ӊ rXuR;F!42G[ yJ [+LXFBɋ0&WRw#[;i*(̲evMwH,1r돣wv.B\1>W r6`CVIx5[i#Del;rhA$#mKwya0yBm Gvvjk\4aP(# g(ZV=]^:j >/.nW+4/ &@FU8`Åfotocx/data/patterns/wall-grey.jpg0000664000175000017500000001057115247006660016212 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?oZ7,o x #ypQiؒ1V/#km[XHqX/U[&;𳪆y;kgSay}"HԉP\IXX|;*b=č,re~le/-x^$|kǎxC+O $w{[ r K t:`,O$Sa X5wrޓ6%j:j~ '̺z;&˩%hts6m&Xxo&gq[|P~#hXf> m3=xkT2|9UK#SHӭ.t@PoXz>|AԧV}O¡CuGq_Sr+4{"K,&NN:v$zCu M }N++* {nF һZhv oj/5i &]'#{h7wztÖKdf:#YYjv7Nmcln&(+(zx·:n{ j(̋ݷnVBc{<c˞k5gx֦6|#m'0 [2,[k7z}r1z/4vkŻky$*Akv,h65 5BUyu:Y|'۽Cx $>4 F<[wH"fKW=W9a=&2GLQbBfT `xMoh,^Q.{k eRq;WmR $2D-;t5ROxkA}U5].̫33^q {lпv +GbԎ}Ꟊ_CZR\}4|oPmmK[Yg>D;8]H+_V h$VqjgGh/`g-w z~9ֵ Y{U񷅮=F;g`6 r0{Vd |Ik5|DL𜎿Z,(Х̆H-8*FV^|M_^˨[Ki1!`"|Kb[_Ad1&%A"Wnߋ|. g#z?;ڿhc{ڰ,~$fK/v%*6gGz|dwehv[PE}Ŗž2 Uf`=zq>-oD0500 q;1t[fp-.n>i T`89Mu:?|C/\O\Om9Ro:CZ-{Y3w^98:VXk%;\p>'*.>/lXoAZѳ֑p-7&}2EwڗᇊdU[voq]p[qU5O x~">xAdqXvɵuc_BiYjDZYU u9SnE=,ufdIcxcW;7kCÖ>8Q5M$L "`Oץ-7/V$#Ztz7,MPDdr[}3Ti2sXxvh3FF=+ 4V_p#FGC0yg;\M#-Vieq%N=;Pxk_1ѵiw)ee,$v0<;7&b+#؉73=:V ':⍽͝Eh1ev{kJ)/\-._E)@ΞoL&,+pw E(LgלcLc= %ݤ_L=| *O$aGR мl5ţkzeC%s1ph:?[֒hdЇ+ Rxggghv/4q}5 `fA kVPR}9O+Oڜ7գXE0Fh?5 L q0'@OCSx|IǦ:Fͤ$r E\w muF/Arڝک +LgƑy۠a)h|u,u8B'[& J;dR88J KPm!Y\f;钾T fKC(|o knLx!D᪭׎5-Ể+, 1Cցnj4*Ax] #Ilɧܭ-I nA`yV8{?]x٧.dkk"2.8ϯ|6G#м*\Bŗ`SZm-nhkWG nyF l{-)gzSbys :<[RD#k+g6>2f7!W{SE{cS☵aZz"Y[ḑQV>?-1m,zc:Z#+x[OLp~b|Pޛ[]Oogo>c8"SYT@z!HumW&X]+7 dt?); |t%E* w$IK[xQgSUzKn6cš%&=WW0\( z >x?U=Nj܄+2`WZ>ayui^6$}T=J|Zҵt[kYTf _u K 8>'kObi-Un_~jko~{.Gu[Q";04+ǶV:d׶t 3\G9^e3)e1s@xB]x]On@e+ӿZl>xcHL[hPƏ>C[jpʁI;J/Fs5uվop^ 'Mܩ&Կ9}5xWe3 @AeK:>af lc\1d<7|JsEu=s$WaOa5/>!4AytTI#@ƅEzU5`bFx}a<s__jC{i h9T!>q^fVOlH564JxN="BIP}|У>1 ڨm돘sK-bKim`k;Aio}"Yn*~$sK_<GcA(@М(fotocx/data/patterns/gregre.jpg0000664000175000017500000000560615247006660015565 0ustar micomicoJFIFC     C   ^^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? [.5#Kg4)f}˄!88$ct+S6"#w2sI#Et3*U.ZFQ xHXA֧&9Z!I1ve.J8fFemHV?JjJ'2ZsriG 7;IoQä ~g0ޒ,6{!9d޴@DcJ񭿗֑%_Ƒ`"xeTxgCEOޤm|$y>h_%E#[ ܍+Fw<#NTѳ^qҀDJFb36_*+ߙd,a9`u4m%Ą$o=ƂRH1@7V;čO2 E9S|ZJ>80ΰb'v?1>޿zj0݋pY8*HUb'Uܸ?a*2Ito_M!<\)S:8H)lS֜e@mG*`AN]Qˬ *[9ǸJr$CmlHzuY`pT[@>csCg =Į˵}y~q{bZY>_ON8Ȃ>i`;TDA`cx%YqAa`ŝO~b}wcs k#@ eXf-Y]ģ:°FDdM;͘ \%;/jYtl}HY'.`^84˫xXqkX2W =>aX#n*D?`ҡ[ٺ#IFK.TV.o娎H\0̋ ]$Fu"FWPGjP.tڦ4`n`sc4*č9 0OπYܫae~1Y %Ƌz`v 3n gWq$,@G9#jK -$8-#FvBZw98)@HG- @ 4v6׺te)nX%OI[iONqNkԱ0lL`K2cwHnᴖ[6k-rGKst{fP[<N\Cm,@ S I= =Q͵øՋwcT p6_| y\I yRec$*ǞU;N)q%텹ʂ\#ۯo[j 4 *7.:m!p?NM:;the:v(+,QdYp UtViEie{;Rí-H c֣4.~mW=\qϽJ51.s*"y :p qH- fF9Ѝ]HlH⑾8>~4mE,rFq!|Hڬ%l \A?j5d%FHdLm%΁>fHBHE7'ƒgYU8?(#:$`U7"eF?Cۼ-"upH>kR[[Y|bQ"Go^M$qlVBzր$q3x%qlcjhf3 !Z }'J 6}^ 5 |ր!D!vPN9)yjkchnU'3+ed9}Q2~=*c%Și9FB/ӁI_HGqs =}9 tG   `ո4V#"eOd׌{ΒSWw<b[IoW^j^Y_FbIa{Ü|=jż~TK;®w zbi#D`|_9P$ $Ũ5w2+گ, Ju܌QU3B6Uq(Yb7q%.8}NyO/[ʪޝdз_gx' ulTNH=?#Kwy>| mYc۹%tD;Zmz\`\Fw(vN4ǜCs DӞ{`⇶m xw +m>9-yH'8kaV ^R9({g>Q"%zu$`*;NK&,]p 9ǹ Benutzerhandbuch - {FOTOCX-NUTZUNG} {ERSTER START} - Suchen und Indizieren von Bilddateien für schnelle Suche {BENUTZERHANDBUCH} ← ^hier klicken^ - Verwendung dieses Handbuch-Browsers {FENSTERANSICHTEN UND MENÜS} - Hauptfenster und zugehörige Menüs {DATEIANSICHT} - Dateiansicht-Fenster (Anzeige einer einzelnen Bilddatei) {GALERIEANSICHT} - Galerieansicht-Fenster (Ordner als Thumbnails anzeigen) {KARTENANSICHT} - Kartenansicht-Fenster (Karte mit Bildstandort-Markern anzeigen) {DRAG AND DROP} - Methoden für Drag and Drop von Dateien {ABLÄUFE BEARBEITEN} - Bearbeiten von Bilddateien {WORKFLOW BEARBEITEN} - alternative Bearbeitungsmethoden - einfach und komplex {MAUS-BESITZ} - Dialog-Maus-Steuerung und Interaktion {MAUS ALT-RECHTE-TASTE} - rechte Maustaste für Touchpads/Touchscreens {DIALOG-SCHALTFLÄCHEN} - Optionen zum Abschließen von Dialogen {TASTATUR-ESCAPE-TASTE} - Funktionen der Escape-Taste {NICHT-STANDARD-DIALOGELEMENTE} - Verwendung nicht standardmäßiger Dialogelemente {KURVENBEARBEITUNG} - Bearbeiten von Kurven in den Bearbeitungsfunktionen {MOUSE PAINTING} - lokales Bearbeiten eines Bildes mit der Maus {STAPELVERARBEITUNG} - Überblick über Stapelverarbeitungsfunktionen {BILDDATEIEN AUSWÄHLEN} - Verfahren zur Auswahl von Bilddateien {TASTENKÜRZEL} - Popup-Menüs, Tastenkürzel, benutzerdefiniertes Menü {MAUSFUNKTIONEN} - Mausfunktionen für Datei-/Galerie-/Kartenansicht {BEFEHLSPARAMETER} - Fotocx-Befehlszeilenparameter - {DATEI-MENÜ} {NEUE SITZUNG} - neue Fotocx-Sitzung in einem separaten Fenster starten {BILDDATEI ÖFFNEN} - eine Bilddatei zum Anzeigen oder Bearbeiten öffnen {2 DATEIEN DURCHLAUFEN} - zwischen den beiden zuletzt angesehenen Bilddateien wechseln {3 DATEIEN DURCHLAUFEN} - zwischen den drei zuletzt angesehenen Bilddateien wechseln {360°-PANORAMA ANSEHEN} - 360°-Panoramabild mit drehbarem Blickpunkt {LEERES BILD} - leeres Bild mit festgelegter Größe und Farbe erstellen {LEERES BILD} - ein neues leeres Bild erstellen {KOPIEREN/VERSCHIEBEN} - eine Bilddatei in einen anderen Ordner kopieren oder verschieben {AUF DESKTOP KOPIEREN} - eine Bilddatei auf den Desktop kopieren {IN ZWISCHENABLAGE KOPIEREN} - eine Bilddatei in die Zwischenablage kopieren {LÖSCHEN/PAPIERKORB} - eine Bilddatei löschen oder in den Papierkorb verschieben {HINTERGRUNDBILD FESTLEGEN} - Desktop-Hintergrundbild aus der aktuellen Bilddatei festlegen {BILD DRUCKEN} - eine Bilddatei drucken {KALIBRIERT DRUCKEN} - mit Farbkalibrierungsdaten drucken {DRUCKER KALIBRIEREN} - Druckerfarbe kalibrieren - Farbverschiebungen ausgleichen - {GALERIE-MENÜ} {GALERIEÜBERSICHT} {THUMB-ANSICHT} - Galerieansicht mit Thumbnails und Dateinamen {METADATA-ANSICHT} - Galerieansicht mit Thumbnail und grundlegenden Metadata {LETZTE DATEIEN} - Galerieansicht der zuletzt angesehenen Bilddateien {NEUESTE DATEIEN} - Galerieansicht der neuesten Bilddateien {GALERIESORTIERUNG} - Sortierreihenfolge einer Galerie ändern {GALERIEFILTER} - neueste, älteste, passendes Muster auswählen ... {GALERIE-START} - zum Anfang der Galerie springen {GALERIEENDE} - zum Ende der Galerie springen {AKTUELLER DATEIORDNER} - aktuelle Galerie aus dem Ordner der aktuellen Datei festlegen {LETZTE ORDNER} - Liste zuletzt angesehener Ordner anzeigen, auswählen {ORDNERBAUM} - Bildordner in einer Baumstruktur anzeigen, auswählen {DATEIEN AUSWÄHLEN} - Dateien für Stapel, Skript oder Album auswählen {LESEZEICHEN} - Liste der Lesezeichen anzeigen, zu Lesezeichen springen {LESEZEICHEN BEARBEITEN} - Lesezeichen hinzufügen, entfernen, anordnen - {MAPS MENU} {WELTKARTE} - Übersicht der Internet-Weltkarte {AUF KARTE ANZEIGEN} - aktuelle Bildposition auf der Karte anzeigen - {ALBEN-MENÜ} {ALBEN} - Bildsammlungen erstellen und anordnen {ALBUM ERSTELLEN} - ein neues Album erstellen (Galerie ausgewählter Bilder) {ALBUM UMBENENNEN} - ein vorhandenes Album umbenennen {ALBUM LÖSCHEN} - ein vorhandenes Album löschen {ALBUM WÄHLEN} - ein Album wählen und die Galerie der Bilder anzeigen {AKTUELLES ALBUM} - das aktuelle (zuletzt verwendete) Album anzeigen {GALERIE ZU ALBUM} - aktuelle Galerie als benanntes Album speichern {ALBUM BEARBEITEN} - Bilddateien in einer Album-Galerie hinzufügen, entfernen, neu anordnen {ALBEN AKTUALISIEREN} - Alben für aktualisierte Bilddateien aktualisieren (neue Versionen) {ALBUM-SAMMELAKTUALISIERUNG} Massenaktualisierung von Alben (Mitgliedsdateien hinzufügen/entfernen/ersetzen) {DIASHOW} - Diashow mit animierten Bildübergängen und Schwenk/Zoom - {BENUTZERDEFINIERTES MENÜ} - benutzerdefiniertes Menü für häufig verwendete Funktionen {SKRIPTDATEIEN} - Überblick über Skriptdateien {SKRIPT BEARBEITEN} - Bearbeitungen in einem Skript aufzeichnen, um eine benutzerdefinierte Bearbeitungsfunktion zu erstellen {SKRIPT AUSFÜHREN} - Skript auf das aktuelle Bild anwenden {SAMMELSKRIPT} - Skript auf ausgewählte Bilddateien anwenden {PLUGINS} - eine Plugin-Bearbeitungsfunktion starten, Plugin-Ausgabedatei öffnen - {ZOOM} - Bild oder Thumbnails per Maus oder Tastatur vergrößern/verkleinern - {VORHERIGE/NÄCHSTE} - mit Maus oder Tastatur zum vorherigen oder nächsten Bild springen - {DATEI SPEICHERN} - Bilddatei speichern (ersetzen, neue Version, neuer Dateiname) - {METADATA-MENÜ} {HAUPTMETADATA ANSEHEN} - wichtige Bild-Metadata auflisten {ALLE METADATA ANSEHEN} - alle Bild-Metadata auflisten {KEYWORDS-ÜBERSICHT} - Keywords zur Bildsuche {GEOTAGS OVERVIEW} - Ortsnamen und Geokoordinaten für die Suche {HAUPTMETADATA BEARBEITEN} - häufig verwendete Metadata bearbeiten {BELIEBIGE METADATA BEARBEITEN} - beliebige Metadata bearbeiten (hinzufügen, entfernen, ändern) {METADATA LÖSCHEN} - bestimmte Metadata oder alle Metadata löschen {METADATA KOPIEREN} - Metadata von einer Bilddatei in eine andere kopieren {METADATA REPARIEREN} - fehlerhafte Metadata reparieren, die die Bearbeitung von Metadata verhindern {KEYWORDS VERWALTEN} - benutzerdefinierte Keywords verwalten {BESCHRIFTUNGEN} - Dateiname, Titel, Beschreibung in der Bildecke anzeigen {ORTE/DATEN} - Bildstandorte/Daten auflisten, für Galerie klicken {ZEITLEISTE} - Bildanzahl nach Jahr/Monat anzeigen, für Galerie klicken {METADATA-TAGS} - Bildanzahl nach Tag-Wert anzeigen, für Galerie klicken {AUTOSUCHE} - skriptgesteuerte Suchfunktion zum Auffinden von Dateien {BILDER SUCHEN} - Suche anhand beliebiger Metadata oder Ordner-/Dateinamen - {AUSWAHL-MENÜ} {BEREICHSÜBERSICHT} - Bereichsauswahl - Konzepte und Verwendung {BEREICH AUSWÄHLEN} - Bildmerkmal oder Bereich für separate Bearbeitung auswählen {BEREICHSLÜCKE FINDEN} - Lücke in einer handgezeichneten Bereichsumrandung finden {BEREICH ÜBERBLENDEN} - Bearbeitungen innerhalb eines ausgewählten Bereichs per Maus überblenden {BEREICH ANZEIGEN/AUSBLENDEN} - Bereichsumrandungen anzeigen oder ausblenden {BEREICH AKTIVIEREN/DEAKTIVIEREN} - einen Bereich zur Bearbeitung aktivieren oder deaktivieren {BEREICH UMKEHREN} - einen Bereich umkehren (Außen-/Innenbereich tauschen) {BEREICH LEEREN} - einen Bereich entfernen {BEREICH KOPIEREN/EINFÜGEN} - einen Bereich kopieren oder in das aktuelle Bild einfügen {BEREICH LADEN/SPEICHERN} - einen Bereich aus einer Datei laden oder in eine Datei speichern - {RÜCKGÄNGIG/WIEDERHOLEN-TASTE} - sequenzielles Rückgängigmachen oder Wiederholen von Bearbeitungen am aktuellen Bild - {BEARBEITEN-MENÜ} {DREHEN} - ein Bild drehen oder begradigen {AUFRICHTEN} - ein gedrehtes oder gespiegeltes Bild aufrichten {ZUSCHNEIDEN} - Bildränder zuschneiden (trimmen) {RETUSCHE} - Helligkeit, Kontrast, Farbe, Sättigung bearbeiten {SKALIEREN} - die Pixelabmessungen des Bildes ändern {GETEILTER BILDSCHIRM} - Vorher/Nachher-Änderungen im geteilten Bildschirm anzeigen {UNTERSCHIEDE ANZEIGEN} - Änderungen während der Bearbeitung hervorheben (oder bei zwei beliebigen Bildern) {RÄNDER} - einem Bild Ränder in beliebiger Farbe oder Transparenz hinzufügen {MARKUP} - auf dem Bild zeichnen: Text, Linie/Pfeil, Rechteck, Oval {FARBMODUS} - in Schwarzweiß, Farbe, Negativ, Positiv umwandeln {MALBEARBEITUNGEN} - eine Bearbeitungsfunktion lokal und schrittweise per Maus anwenden {BILD BEMALEN} - mit einer Farbe, Pinselgröße und Deckkraft malen {TRANSPARENZ MALEN} - zunehmende Transparenz per Maus malen {BEREICH FÜLLEN} - ausgewählte Bereiche oder transparente Bereiche mit einer Farbe füllen {IM BILD KOPIEREN} - Pixel innerhalb eines Bildes per Maus kopieren {AUS BILD KOPIEREN} - Pixel aus einem anderen Bild per Maus kopieren {VORHERIGE BEARBEITUNG KOPIEREN} - Pixel aus vorherigen Bearbeitungen per Maus kopieren - {REPARATUR-MENÜ} {SCHÄRFEN} - ein unscharfes Bild schärfen, mehrere Methoden {WEICHZEICHNEN} - ein Bild oder einen Bildbereich weichzeichnen, mehrere Methoden {ENTRAUSCHEN} - Bildrauschen reduzieren (kleine zufällige Flecken) {ENTNEBELN} - Nebel/Dunst zu einem Bild oder ausgewählten Bereich hinzufügen oder entfernen {ROTE AUGEN} - rote Augen bei Blitzlichtaufnahmen entfernen {INTELLIGENTES LÖSCHEN} - Stromleitungen, Schilder und andere kleine Störfaktoren entfernen {HALO ENTFERNEN} - durch Schärfen und andere Funktionen entstandene Halos entfernen {JPEG-ARTEFAKTE} - Artefakte in stark komprimierten Dateien unterdrücken {KANTENGLÄTTUNG} - Pixelbildung (Treppeneffekt) entlang von Kanten unterdrücken {RGB ANPASSEN} - Bildfarben mit RGB- oder CMY-Farben anpassen {HSL ANPASSEN} - Farben mit dem HSL-Farbmodell auswählen und ändern {STAUB ENTFERNEN} - Staubflecken auf Bildern von alten Fotos entfernen {SÄUME} - periphere Farbsäume beheben (chromatische Aberration) - {VERFEINERUNG-MENÜ} {HISTOGRAMM ABFLACHEN} - Helligkeitshistogramm für bessere Detailzeichnung abflachen {LOKALER KONTRAST} - Kontrast passend zur lokalen Bildhelligkeit hinzufügen {KONTRAST VERSTÄRKEN} - vorhandenen Kontrast verstärken, um Details hervorzuheben {GLOBALER RETINEX} - RGB-Werte für einen größeren Wertebereich neu skalieren {LOKALER RETINEX} - RGB-Werte für einen größeren Wertebereich neu skalieren {SÄTTIGUNG} - Farbsättigung basierend auf der Helligkeit anpassen {WEICHZEICHNUNG} - klassischen "Weichzeichner"-Effekt auf ein Bild anwenden {HELLIGKEITSVERLAUF} - einen Helligkeits-/Farbverlauf über ein Bild legen {VIGNETTE} - Helligkeit/Farbe radial um einen gewählten Mittelpunkt ändern - {EFFEKTE-MENÜ} {UMRISSE} - ein Bild in eine Umrisszeichnung umwandeln {SKIZZE1} - ein Bild in eine simulierte Skizze umwandeln (1) {SKIZZE2} - ein Bild in eine simulierte Skizze umwandeln (2) {CARTOON} - ein Bild in eine cartoonartige Zeichnung umwandeln {PRÄGUNG} - ein Bild in eine simulierte Prägung umwandeln (3D-Effekt) {KACHELN1} - ein Bild in quadratische Kacheln mit 3D-Effekt umwandeln {KACHELN2} - ein Bild in unregelmäßige, zum Bild passende Kacheln umwandeln {MALEREI} - ein Bild in ein simuliertes Gemälde umwandeln {TEXTUR} - einem Bild oder ausgewählten Bereich Textur hinzufügen {FUSION} - feine Details unterdrücken, während die Schärfe erhalten bleibt {FARBEN ABGLEICHEN} - die Farben eines Bildes an ein anderes Bild angleichen {MUSTER} - einem Bild ein Hintergrundmuster hinzufügen {SCHRAFFUR} - in eine Skizze mit sich kreuzenden parallelen Linien umwandeln {DITHERN} - verschiedene Möglichkeiten, ein Bild zu pixeln oder zu posterisieren {GRAVUR} - ein Bild in Schwarzweiß-Linien umwandeln {GLANZ HINZUFÜGEN} - Blendlicht um helle Objekte im Bild hinzufügen {MOSAIK} - ein Bild in ein Mosaik aus Bildkacheln umwandeln {RAUSCHEN HINZUFÜGEN} - einem Bild zufälliges Rauschen hinzufügen {FARBEN FESTLEGEN} - die Anzahl der Farben reduzieren (posterisieren) {FARBEN VERSCHIEBEN} - RGB-Farben schrittweise zu GBR oder BRG verschieben {FREMDE FARBEN} - zufällige fremdartige Farben zu einem Bild hinzufügen {BENUTZERDEFINIERTER KERNEL} - einen benutzerdefinierten Faltungskernel bearbeiten und anwenden - {VERZERREN-MENÜ} {BEGRADIGEN} - Bilder mit gekrümmten Linien begradigen, besonders Panoramen {PERSPEKTIVE} - ein aus einem stumpfen Winkel fotografiertes Objekt begradigen {BEREICH VERZERREN} - einen ausgewählten Bildbereich durch Ziehen mit der Maus verzerren {WARP LINEAR1} - Bild durch Ziehen mit der Maus verzerren - lineare Verzerrung 1 {WARP LINEAR2} - Bild durch Ziehen mit der Maus verzerren - lineare Verzerrung 2 {GEKRÜMMT VERZERREN} - Bild durch Ziehen mit der Maus verzerren - geschwungene Verzerrung {AFFIN VERZERREN} - Bild durch Ziehen mit der Maus verzerren - parallele Linien bleiben erhalten {RADIAL VERZERREN} - tonnen- oder kissenförmige Verzerrung hinzufügen oder entfernen {NAHAUFNAHME ENTZERREN} - Verzerrung bei Nahaufnahmen von Gesichtern entfernen (große Nase) {WELLEN ERZEUGEN} - ein Bild mit einem Wellenmuster verzerren {VERDREHEN} - ein Bild um einen gewählten Mittelpunkt verdrehen {KUGEL} - ein Bild in eine Kugelform krümmen {INNEN NACH AUSSEN} - den Abstand jedes Pixels zur Mitte/zum Rand umkehren {TINY PLANET} - ein Panorama zu einem Kreis wickeln {ESCHER-SPIRALE} - ein Bild in eine endlose, nach innen führende Spirale verwandeln {FOTO ABFLACHEN} - ein Foto einer gekrümmten Oberfläche abflachen - {KOMBINIEREN-MENÜ} {HDR} - dunkle/helle Bilder für einen erweiterten Helligkeitsbereich kombinieren {HDF} - nah/fern fokussierte Bilder für erweiterte Schärfentiefe kombinieren {STAPEL/MALEN} - Bilder kombinieren, um vorübergehende Autos, Touristen usw. zu entfernen {STAPEL/RAUSCHEN} - Bilder kombinieren, um Rauschen durch Mittelung zu reduzieren {STAPEL/EBENEN} - Bildversionen kombinieren, Bereich/Version auswählen/malen {PANORAMA} - eine Bildserie horizontal kombinieren {CIM-DATEIEN ANZEIGEN} - Eingabedateien für das aktuelle/letzte kombinierte Bild anzeigen {MASHUP} - Bilder und formatierten Text in einem benutzerdefinierten Layout anordnen {BILDERFELD} - viele Bilder zu einem kompakten Array-Format zusammenfügen - {SAMMEL-MENÜ} {SAMMELKONVERTIERUNG} - kopieren, verschieben, skalieren, umbenennen, konvertieren, Text hinzufügen ... {SAMMEL-KOPIEREN/VERSCHIEBEN} - ausgewählte Bilddateien in einen neuen Ordner kopieren/verschieben {SAMMEL-AUFRICHTEN} - gedrehte Bilddateien suchen und aufrichten {SAMMEL-LÖSCHEN/PAPIERKORB} - ausgewählte Bilddateien löschen oder in den Papierkorb verschieben {SAMMEL-OVERLAY} - Overlay-Bild (Copyright ...) zu ausgewählten Bildern hinzufügen {SAMMEL-KEYWORDS} - Keywords für ausgewählte Bilddateien hinzufügen oder entfernen {SAMMEL-KEYWORDS UMBENENNEN} - Keywords für alle Bilddateien umbenennen oder löschen {SAMMEL-KEYWORDS ENTFERNEN} - unerwünschte Keywords aus allen Bilddateien entfernen {SAMMEL-AUFNAHMEDATUM} - Fotodaten oder -zeiten ändern oder Zeitzone verschieben {SAMMEL-METADATENÄNDERUNG} - Metadata für ausgewählte Bilddateien hinzufügen oder überarbeiten {SAMMEL-METADATENBERICHT} - Metadata für ausgewählte oder alle Bilddateien melden {SAMMEL-GEOTAGS} - Geotags für ausgewählte oder alle Bilddateien hinzufügen oder überarbeiten {DATEIEN EXPORTIEREN} - ausgewählte Dateien in einen Ordner exportieren (z. B. Web-Upload) - {WERKZEUGE-MENÜ} {DATEIEN INDIZIEREN} - einmalige Aufgabe zum Suchen und Indizieren aller Bilddateien {FOTOCX-STARTORDNER VERSCHIEBEN} - Fotocx-Home-Ordner verschieben (Benutzerdaten und Einstellungen) {EINSTELLUNGEN} - Benutzereinstellungen für den Fotocx-Betrieb {TASTENKÜRZEL} - Tastenkürzel für Menüfunktionen anzeigen und ändern {RGB-HISTOGRAMM} - Helligkeitshistogramm-Grafik für das aktuelle Bild {BILD VERGRÖSSERN} - die Maus in eine Lupe über dem Bild verwandeln {BILD MESSEN} - Pixelabstände innerhalb des Bildes messen (Mausklicks) {RGB ANZEIGEN} - RGB-Werte an der Mausposition oder für ausgewählte Punkte anzeigen {RASTEREINSTELLUNGEN} - Rasterlinien anzeigen oder entfernen, Linienzahl oder Abstand festlegen {LINIENFARBE} - Farbe für Bereichsauswahl-Umrandungen festlegen {DUNKLE/HELLE PIXEL} - Werkzeug zur Hervorhebung von Clipping {MONITORFARBE} - Monitorhelligkeit und -kontrast anpassen {DUPLIKATE FINDEN} - doppelte Bilder in einer Galerie oder allen Bildern finden {FEHLERHAFTE DATEIEN FINDEN} - unlesbare Bilddateien finden, löschen/verschieben/reparieren {RESSOURCEN ANZEIGEN} - CPU-Zeit und aktuelle Speichernutzung anzeigen {ÜBERSETZUNGEN} - GUI-Übersetzungen erstellen oder ändern - {HILFE-MENÜ} - Benutzerhandbuch, Tutorial, Änderungsprotokoll, über Fotocx, deinstallieren - {WEITERE THEMEN} {VIDEO FILES} - Videodateien, Thumbnails, Videos abspielen {DIAS UND NEGATIVE} - Erfassen von Dias und Filmnegativen {FOTOCX-EINSCHRÄNKUNGEN} - Größen- und Leistungsgrenzen {FOTOCX FÜR WINDOWS 11} - Installation von Fotocx unter Windows 11 WSL {DATENSCHUTZ} - Datenschutzrichtlinie von Fotocx {PROBLEM, QUESTION, SUGGESTION} - den Fotocx-Autor kontaktieren - - TOPIC: FOTOCX-NUTZUNG - - TOPIC: ERSTER START - ^Externe Programme Fotocx meldet erforderliche und optionale externe Programme sowie die von ihnen bereitgestellte Funktion. Falls erforderliche Programme fehlen, installieren Sie diese und starten Sie Fotocx erneut. - ^Erste Indizierung Fotocx indiziert Ihre Bilddateien. Dadurch werden die Galerieseiten (Thumbnails) schnell angezeigt, die schnelle Suche anhand indizierter Metadata ermöglicht und anklickbare Kartenmarkierungen zur Anzeige von Bildern nach Standort bereitgestellt. Sie müssen einen oder mehrere "Top"-Bildordner angeben (z. B. /home//Pictures). Unterordner werden automatisch einbezogen. Nicht-Bilddateien in diesen Ordnern werden ignoriert. Verwenden Sie die Schaltfläche [select], um Ihre Top-Bildordner zu suchen und hinzuzufügen. Ein praktisches Limit liegt bei etwa 30 Top-Ordnern. Jeder kann Hunderte von Unterordnern enthalten. - ^Thumbnails Dies ist der Ordner, in dem Thumbnail-Dateien abgelegt werden. Verwenden Sie den mitgelieferten Standardordner oder wählen Sie einen anderen Speicherort. - ^Indizierungszeit Die Indizierungsgeschwindigkeit kann je nach Art und Größe Ihrer Bilddateien und der Geschwindigkeit Ihres Computers von einigen hundert bis über 10.000 Dateien/Minute reichen. Wenn Sie neue Bilddateien zu Ihrer Sammlung hinzufügen, indiziert der nächste Fotocx-Start die neuen Dateien. Bei vielen neuen Dateien benötigt der Start entsprechend Zeit für die Indizierung. - ^Zusammenführung von Bildtitel und -beschreibung Die Fotocx-Bildindizierungsfunktion ersetzt fehlende Titel- und Beschreibungs-Metadata, falls vorhanden, durch eines der vielen alternativen Metadata-Tags: headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. Dies geschieht, damit Sie stets nur mit 'title' und 'description' anzeigen/bearbeiten/suchen können. Dieser Umwandlungsvorgang ist relativ langsam (2200 Dateien/Minute auf meinem leistungsstarken Computer). Er erfolgt, wenn neue Bilddateien zum ersten Mal indiziert werden. Es wird nichts gelöscht. - - TOPIC: BENUTZERHANDBUCH Öffnen Sie das Benutzerhandbuch über das Menü Hilfe > Benutzerhandbuch. Während der Verwendung von Fotocx können Sie F1 drücken, um das Thema des Benutzerhandbuchs für die aktuelle oder zuletzt verwendete Menüfunktion anzuzeigen. - Verwenden Sie zum Scrollen des Textes die Pfeiltasten nach oben/unten sowie die Bild-auf/ab-Tasten. Die Schaltfläche [Suchen] öffnet einen Dialog für die Textsuche. Drücken Sie erneut [Suchen] für das nächste Vorkommen. - Fett und großgeschriebener Text ist ein anklickbarer Link zu einem Thema, z. B. {DATEIEN INDIZIEREN}. Verwenden Sie die Schaltflächen [<] und [>], um zwischen zuletzt angesehenen Themen hin und her zu wechseln. Die Schaltfläche [Recent] zeigt eine anklickbare Liste zuletzt angesehener Themen an. - - TOPIC: FENSTERANSICHTEN UND MENÜS +image: fotocx-views.jpg - ^Menü-Schaltflächen Wenn ein Menü angeklickt wird, erscheint ein Popup-Untermenü. Die oberen drei Menüs (Datei, Galerie, Karten) legen den entsprechenden Ansichtsmodus fest. Die Tasten F/G/M können ebenfalls verwendet werden. - - TOPIC: DATEIANSICHT Ein Bild füllt das gesamte Fotocx-Fenster aus. Mit Linksklick/Rechtsklick der Maus vergrößern/verkleinern Sie den Zoom. Die Z-Taste wechselt zwischen Fensteranpassung und 1x-Bildgröße (1 Bildpixel = 1 Anzeigepixel). Um ein gezoomtes Bild zu verschieben, ziehen Sie die Maus bei gedrückter linker Taste über das Bild. Auch das Mausrad kann zum Vergrößern/Verkleinern des Bildes verwendet werden. Verwenden Sie die Menüschaltflächen (Bearbeiten, Reparatur usw.), um das Bild zu ändern. Verwenden Sie die Schaltfläche "Datei speichern", um eine geänderte Datei zu speichern: ersetzen, eine neue Version erstellen oder eine neue Datei (neuer Name) erstellen. - ^Tastatur Pfeiltasten links/rechts Das vorherige oder nächste Bild in der aktuellen Galerie anzeigen. - ^Pfeiltasten nach oben/unten Wie oben, jedoch werden nur die letzten Versionen angezeigt, oder das Original, falls keine Versionen vorhanden sind. - - TOPIC: GALERIEANSICHT Alle Bilddateien in der aktuellen Galerie werden als Anordnung von Thumbnails angezeigt. - ^Galerietypen • Ordner: alle Bilddateien und Unterordner in einem einzelnen Ordner (Verzeichnis) • Album: Bilddateien aus verschiedenen Ordnern, vom Benutzer angeordnet • Zuletzt verwendete Dateien: die zuletzt angesehenen oder bearbeiteten Bilddateien • Neueste Dateien: die zuletzt hinzugefügten oder geänderten Bilddateien • Suchergebnisse: durch die Suchfunktion gefundene Bilder. Ebenfalls ein Album. - ^Galeriefunktionen • Linksklick auf Bild-Thumbnail: Bild in der Dateiansicht öffnen • Rechtsklick auf Bild-Thumbnail: Popup-Menü mit häufig verwendeten Funktionen • Klick auf Ordner-Thumbnail: diesen Ordner in der Galerieansicht öffnen • TOP-Leiste der Ordnergalerie: übergeordnete Ordner - anklicken, um dorthin zu gelangen • Schaltfläche [TOP]: Liste der Top-Level-Ordner - anklicken, um dorthin zu gelangen • Bildlaufleisten: innerhalb der Galerie nach oben/unten scrollen • Pfeiltasten nach oben/unten: die Galerie um eine Zeile scrollen • Bild-auf/ab-Tasten: die Galerie um eine Seite scrollen • Pos1/Ende-Tasten: zum Anfang (oben) und Ende (unten) der Galerie springen • Mausrad: die Galerie nach oben und unten scrollen • Tasten [+] und [-]: Thumbnail-Größe erhöhen/verringern - ^Galerie-Popup-Bilder • Klicken Sie mit der mittleren Maustaste auf ein Thumbnail für ein Popup-Bild • Klicken Sie mit Umschalt + linker Maustaste auf ein Thumbnail für ein Popup-Bild • Linksklick auf Popup-Bild: Bild vergrößern (Zoom) • Rechtsklick auf Popup-Bild: Popup-Bild schließen • Mausrad: Popup-Bild vergrößern oder verkleinern (Zoom) • Taste F11: Popup-Bild im Vollbildmodus anzeigen • Escape-Taste: Popup-Bild schließen • Mehrere Popups können zum Vergleichen von Bildern verwendet werden - - TOPIC: KARTENANSICHT Zeigt Karten mit Markierungen an, die den Bildstandorten entsprechen. Klicken Sie auf eine Markierung, um eine Galerie der entsprechenden Bilder anzuzeigen. Dies setzt voraus, dass Ihre Bilddateien eingebettete Geokoordinaten (latitude, longitude) enthalten. Moderne Kameras fügen diese automatisch ein, Sie können diese Daten aber auch selbst hinzufügen. Zunächst wird eine Weltkarte angezeigt. Verwenden Sie das Mausrad, um an einer beliebigen Stelle zu zoomen. Ziehen Sie, um den Kartenmittelpunkt zu verschieben. Die gesamte Welt kann in jedem Maßstab bis auf Straßenebene angezeigt werden. - - TOPIC: DRAG AND DROP Wenn Sie zwei Fotocx-Sitzungen öffnen, können Sie Dateien von einer in die andere ziehen und ablegen. Ziehen Sie ein Galerie-Thumbnail von einem Fenster in das andere. Im Dateiansicht-Modus wird die Datei geöffnet. Im Galerieansicht-Modus hängt das Ergebnis vom Galerietyp ab. Handelt es sich bei der Galerie um einen Ordner, wird die Datei zum Ordner hinzugefügt, und die Galerie zeigt die neue Datei an ihrer sortierten Position an. Handelt es sich bei der Galerie um ein Album, wird die Datei an der Position hinzugefügt, an der sie abgelegt wird. - - TOPIC: ABLÄUFE BEARBEITEN Das Bild im Dateiansicht-Modus (das aktuelle Bild) kann mit den Bearbeitungsfunktionen in den Menüs Bearbeiten, Reparatur, Verfeinern, Effekte, Verzerren und Kombinieren geändert werden. Diese Funktionen ändern das aktuelle Bild im Speicher und im Fenster. Bei der Verwendung dieser Funktionen werden die Bearbeitungen akkumuliert. Wenn Sie mit der Bearbeitung fertig sind, verwenden Sie die Menüschaltfläche [Speichern], um das geänderte Bild in derselben Datei, als neue Version (z. B. filename.v01.jpg) oder in einer neuen Datei und/oder einem neuen Ordner zu speichern. Bildbearbeitungsdialoge enthalten Schieberegler, Schaltflächen, Drehfelder oder bearbeitbare Kurven, die das Bild sofort aktualisieren. - Klicken Sie mit der linken oder rechten Maustaste auf die Schaltfläche Rückgängig/Wiederholen, um die aktuell aktive Bearbeitungsfunktion rückgängig zu machen oder zu wiederholen. Nachdem ein Bild eine oder mehrere Bearbeitungen erhalten hat, kann mit der Rückgängig/Wiederholen-Schaltfläche zwischen allen abgeschlossenen Schritten vor- und zurückgesprungen werden, um den Bildstatus nach jedem Schritt anzuzeigen. Die mittlere Maustaste zeigt eine Popup-Liste aller am aktuellen Bild vorgenommenen Bearbeitungen an, und Sie können einen beliebigen Schritt auswählen, zu dem Sie zurückkehren möchten. Das Bild kann ab jedem vorherigen Schritt erneut bearbeitet werden. Dabei werden Bearbeitungen verworfen, die nach diesem Schritt vorgenommen wurden, da sie von diesem Schritt abgeleitet waren. Diese Rückgängig/Wiederholen-Funktion bleibt erhalten, solange das bearbeitete Bild das aktuelle Bild bleibt. Wird ein anderes Bild geöffnet, wird der Bearbeitungsverlauf verworfen. Wenn Sie die Möglichkeit behalten möchten, zum aktuellen Bildstatus zurückzukehren, speichern Sie das Bild als neue Version, bevor Sie mit einer weiteren Bearbeitung fortfahren. - - TOPIC: WORKFLOW BEARBEITEN - ^Einfacher Arbeitsablauf In den meisten Fällen können Sie einfach die JPEG-Datei bearbeiten, die aus der Kamera kommt. Verwenden Sie das folgende, komplexere Verfahren nur, wenn nach Bearbeitungen, die den Helligkeitsbereich in einigen Bildbereichen erweitert haben, Farbbänder sichtbar werden, weil die Helligkeitsstufen groß genug sind, um sie zu erkennen. - ^Komplexer Arbeitsablauf Um mit Deep Color (mehr als 8 Bit pro RGB-Farbe) zu bearbeiten, beginnen Sie mit der RAW-Datei der Kamera. Eine RAW-Datei kann wie jede andere Bilddatei bearbeitet werden. Die Bearbeitungsfunktionen von Fotocx arbeiten mit 24 Bit pro Farbe, sodass die volle Farbtiefe der RAW-Datei erhalten bleibt. Beim Öffnen einer RAW-Datei wird der gewählte RAW-Loader verwendet - siehe {EINSTELLUNGEN}. Sie können auch die Stapel-Konvertierung verwenden, um mehrere RAW-Dateien in TIFF-, PNG- oder JXL-Dateien mit 16 Bit pro Farbe umzuwandeln. - Dcraw ist der standardmäßige RAW-Dateilader. Sie können auch einen komplexeren RAW-Editor wie Rawtherapee verwenden - siehe {EINSTELLUNGEN}. Im Vergleich dazu ist Dcraw einfach und schnell. Die Bearbeitungsfunktionen eines RAW-Editors lassen sich in der Regel mit Fotocx leichter durchführen. - - TOPIC: MAUS-BESITZ Einige Bearbeitungsdialoge verwenden die Maus, um auf das Bild im Hauptfenster zu verweisen oder es zu ändern. Es können mehrere solcher Dialoge gleichzeitig aktiv sein. Die Maus wird auch zum Zoomen und Scrollen des Bildes verwendet, was möglicherweise auch bei geöffnetem Bearbeitungsdialog nötig ist. Daher ist es wichtig zu verstehen, welcher Dialog oder welches Fenster die Maus kontrolliert, und wie sich diese Zuständigkeit ändern lässt: • Wenn ein Dialog den Tastaturfokus hat, sind Mausaktionen auf dem Bild Eingaben für diesen Dialog und zoomen oder scrollen das Bild nicht. • Wenn Sie die STRG-Taste gedrückt halten, während Sie mit der Maus auf das Bild klicken oder ziehen, wird das Bild gezoomt oder verschoben/gescrollt. Geöffnete Dialoge sind davon nicht betroffen. • Das Mausrad kann an jeder beliebigen Bildposition zoomen. - - TOPIC: MAUS ALT-RECHTE-TASTE Bei Touchpads oder Touchscreens können Rechtsklicks umständlich sein. Wenn die ALT-Taste gedrückt gehalten wird, während die linke Maustaste gedrückt wird, wird dies als rechte Maustaste interpretiert. - - TOPIC: DIALOG-SCHALTFLÄCHEN Diese funktionieren meist wie folgt: • [Zurücksetzen] - aktuelle Bearbeitung rückgängig machen, Bild in den Ausgangszustand zurückversetzen • [Anwenden] - Dialogeinstellungen auf das Bild anwenden, Dialog bleibt aktiv • [OK] - wie [Anwenden], aber der Dialog wird geschlossen • [Abbrechen] - Bildänderungen verwerfen und den Dialog schließen • [Fortfahren] - mit einer länger dauernden Aufgabe basierend auf den Dialogeingaben fortfahren • [X] - Dialog ohne Aktion schließen - - TOPIC: TASTATUR-ESCAPE-TASTE Hauptfenster hat den Fokus: • wenn eine lang laufende Funktion noch läuft, wird sie beendet • wenn das Hauptfenster maximiert ist, wird die vorherige Größe wiederhergestellt • wenn die aktuelle Ansicht Galerie oder Karte ist, wird zur Dateiansicht gewechselt • falls nichts davon zutrifft: Fotocx beenden Dialogfenster hat den Fokus: Dialog beenden (wie die Schaltfläche [X]) Sonstiges: Popup-Bild schließen, 360°-Panorama-Betrachter beenden, Diashow pausieren oder beenden. - - TOPIC: NICHT-STANDARD-DIALOGELEMENTE +image: custom-widgets.png - Einige nicht standardmäßige Dialogelemente werden verwendet, um die Dialoggröße zu verringern oder die Bedienung zu erleichtern. Sie funktionieren fast wie Standard-GTK-Elemente. Das numerische Dateneingabefeld funktioniert wie eine GTK-Drehfeld-Schaltfläche: Mit dem Mausrad und den Pfeiltasten nach oben/unten auf der Tastatur kann der Wert schnell erhöht oder verringert werden. Bei Verwendung eines Touchpads tippen Sie auf das Eingabefeld, um den Cursor zu positionieren, und geben dann den Wert über die Tastatur ein, oder verwenden Sie die Pfeiltasten nach oben/unten, um schnell zu einem neuen Wert zu springen. Wird die Taste gedrückt gehalten, beschleunigt sich die Änderungsrate mit der Zeit. Mit der Umschalttaste kann die Rate um das 10-fache erhöht werden. Ein nichtlinearer Schieberegler dehnt die Skala um den neutralen Wert herum, sodass kleine Änderungen besonders bei Touchpads präziser gesteuert werden können. Einige Standard-GTK-Elemente wurden durch Entfernen von überschüssigem Padding verkleinert. Dies wird durch die Datei 'widgets.css' im Fotocx-Home-Ordner gesteuert. Sie können diese Datei bei Bedarf ändern. Sie können Einträge löschen oder als Kommentar markieren, die Datei selbst sollte jedoch nicht gelöscht werden - sie würde automatisch ersetzt. - - TOPIC: KURVENBEARBEITUNG +image: retouch.png - Einige Bildbearbeitungsfunktionen verwenden bearbeitbare Kurven. Sie können die Kurven manipulieren, um eine Bildeigenschaft in Abhängigkeit von einer anderen Eigenschaft zu ändern. Die Kurven können mit der Maus verschoben (gezogen) werden. An der Stelle, an der gezogen wird, wird ein Ankerpunkt (schwarzer Punkt) zur Kurve hinzugefügt, der fest bleibt - die Kurve verläuft weiterhin durch diesen Punkt, während andere Teile der Kurve gezogen werden. Ein Ankerpunkt kann durch Ziehen verschoben oder durch Rechtsklick gelöscht werden. - - TOPIC: MOUSE PAINTING Die Maus kann verwendet werden, um ein Bild lokal zu bearbeiten. Ein Kreis um die Mausposition umschließt einen Bildbereich, der geändert wird, während die Maus bei gedrückter linker Taste über das Bild gezogen wird. Die Quelle der Änderung kann eine Bearbeitungsfunktion, eine gewählte Farbe oder Pixel aus einem anderen Bereich desselben Bildes oder aus einem anderen Bild sein. Die Bildpixel innerhalb des Mauskreises werden so geändert, dass sie der Quelle entsprechen. Die Änderungsgeschwindigkeit kann schnell oder allmählich sein, abhängig von Leistungsfaktoren für die Mitte und den Rand des Mauskreises. Ist der Mittenfaktor hoch und der Randfaktor niedrig, wird das Bild in der Mitte der Maus schneller geändert und nimmt zum Rand hin allmählich ab. Ziehen Sie die Maus bei gedrückter linker Taste wiederholt über denselben Bildbereich, um die Änderungen zu akkumulieren, bis die Pixel vollständig der Quellfarbe oder dem Quellbild entsprechen oder die Quell-Bearbeitungsfunktion vollständig angewendet ist. Ziehen Sie bei gedrückter rechter Taste, um die Änderungen allmählich rückgängig zu machen und das Originalbild wiederherzustellen. - Beispiel: Ist die Bearbeitungsfunktion Retuschieren und die Helligkeit wird erhöht, hellt sich das Bild innerhalb des Mausbereichs auf, während die Maus bei gedrückter linker Taste gezogen wird. Verwenden Sie das Ziehen bei gedrückter rechter Taste, um das Originalbild allmählich wiederherzustellen. - Die Schaltfläche [undo-last] macht den letzten Mal- oder Löschvorgang rückgängig, und dies kann wiederholt werden, um mehrere kürzlich vorgenommene Bearbeitungen zu entfernen. Jeder neue Mausziehvorgang ist eine Arbeitseinheit, die separat rückgängig gemacht werden kann. Der Speicher für Rückgängig ist begrenzt, sodass nur die letzten Mal- und Löschschritte erhalten bleiben. [undo all] versetzt das Bild wieder in seinen Ausgangszustand. - Verwenden Sie die Schaltfläche [undo/redo], um die Änderungen während der Bearbeitung zu überprüfen. - Ist ein {BEREICH AUSWÄHLEN} aktiv, beschränkt sich das Malen auf diesen Bereich. - HINWEIS: Zoomen Sie das Bild auf 100 % oder mehr, wenn Sie einen sehr kleinen Radius verwenden (z. B. beim Zeichnen von Linien auf dem Bild). Mausbewegungsschritte erfolgen in Bildschirmpixeln. Wenn dies viele Bildpixel umfasst und ein kleiner Radius verwendet wird, können einige Pixel von der Maus übersprungen und nicht verarbeitet werden. - - TOPIC: STAPELVERARBEITUNG Im {SAMMEL-MENÜ} gibt es mehrere Stapelfunktionen, um einige häufige Aufgaben zu beschleunigen. Sie können viele Bilddateien auswählen und die Stapelfunktion für alle ausführen. Stapelfunktionen können verwendet werden, um Dateiname oder -typ zu ändern, aufzurichten, die Größe zu ändern, zu kopieren oder zu verschieben, zu löschen, sowie tags, keywords, Standort/Geokoordinaten und Fotodaten zu überarbeiten. - - TOPIC: BILDDATEIEN AUSWÄHLEN +image: select-image-files.jpg - Dieses Verfahren wird für alle Funktionen verwendet, die mit mehreren Bilddateien arbeiten. Das Verfahren wird hier erläutert, und dieses Thema ist von jeder Funktion aus verlinkt, die das Verfahren verwendet. • Linksklick auf Thumbnail: zur Auswahlliste hinzufügen • Rechtsklick: entfernen • mehrere hinzufügen: erstes Thumbnail anklicken, letztes mit Umschalt+Klick • Schaltfläche [Alle hinzufügen]: gesamte Galerie hinzufügen • Schaltfläche [Aktuelles hinzufügen]: aktuelle Datei hinzufügen • eine Datei kann mehrfach zur Liste hinzugefügt werden • zu anderen Galerien navigieren, um bei Bedarf weitere Dateien auszuwählen • Schaltfläche [Entfernen]: ausgewählte Listenposition entfernen • Schaltfläche [Leeren]: die gesamte Liste leeren • Pfeiltasten nach oben/unten: durch die Liste blättern, Thumbnails anzeigen • Pos1/Ende-Tasten: zum Anfang/Ende der Liste springen - Die Schaltfläche [Deaktivieren] deaktiviert das Klicken auf Thumbnails zur Dateiauswahl. Die Schaltfläche wird dann in [Aktivieren] umbenannt - drücken Sie sie, um das Klicken auf Thumbnails wiederherzustellen. Der Zweck besteht darin, die normalen Thumbnail-Popup-Menüs und den Linksklick zum Anzeigen einer Datei in voller Größe zu ermöglichen, was nicht möglich ist, wenn Thumbnail-Klicks zur Dateiauswahl verwendet werden. Dies kann bei der Entscheidung über die Auswahl hilfreich sein. Sie können auch im Dateiansicht-Modus bleiben und mit den Pfeiltasten durch die Bilder blättern, während Sie die Schaltfläche [Aktuelles hinzufügen] verwenden, um Dateien zur Auswahlliste hinzuzufügen. - - TOPIC: TASTENKÜRZEL Es gibt drei Kurzbefehl-Methoden für häufig verwendete Funktionen: • Rechtsklick auf das Hauptfenster oder ein Galerie-Thumbnail. Ein Popup-Menü zeigt einige häufig verwendete Funktionen. • Sie können Tastenkürzel ändern und neue Kürzel hinzufügen. Siehe {TASTENKÜRZEL}. • Sammeln Sie häufig verwendete Funktionen in einem benutzerdefinierten Menü. Siehe {BENUTZERDEFINIERTES MENÜ}. - Tastenkürzel sind für die gängigsten Funktionen verfügbar. Verwenden Sie das Menü Werkzeuge > Tastaturkürzel, um sie anzuzeigen oder zu ändern. - Die folgenden Tastenkürzel sind fest und können nicht geändert werden: • [+] [=] Taste: Bild oder Thumbnails vergrößern (Zoom) • [-] Taste: Bild oder Thumbnails verkleinern (Zoom) • Taste Z: Zoom umschalten: 1x <--> An Fenster anpassen • Taste F1: Benutzerhandbuch für aktuelle Funktion anzeigen • Taste F10: Hauptfenster zwischen Vollbild und normal umschalten • Taste F11: Wie F10, jedoch ohne Menüs, Titelleiste, oberes Panel • Escape-Taste: laufende Funktion abbrechen, aktiven Dialog schließen • Entf-Taste: Dialog zum Löschen oder Verschieben der aktuellen Datei in den Papierkorb • Pfeiltaste links/rechts: vorheriges/nächstes Bild in der Galerie anzeigen • Pfeiltaste oben/unten: wie oben, jedoch werden nur die letzten Versionen angezeigt • Bild-auf/ab: Galerieansicht: eine Seite nach oben/unten scrollen • Pos1/Ende: Galerieansicht: zur ersten/letzten Galerieseite springen - Die folgenden Tastenkürzel sind Standardeinstellungen, die vom Benutzer geändert werden können: • F: Dateiansicht - in den Dateiansicht-Modus wechseln • G: Galerieansicht - in den Galerieansicht-Modus wechseln • M: Kartenansicht - in den Kartenansicht-Modus wechseln • 2: 2 Dateien durchlaufen - abwechselnd die beiden zuletzt geöffneten Dateien anzeigen • 3: 3 Dateien durchlaufen - abwechselnd die drei zuletzt geöffneten Dateien anzeigen • A: Aktuelles Album - zuletzt angesehenes Album anzeigen • T: Retuschieren - Bearbeitungsfunktion Retuschieren starten • C: Zuschneiden - Bearbeitungsfunktion Zuschneiden starten • K: Tastaturkürzel - Dialog für Tastaturkürzel starten • P: Bild drucken - Dialog zum Drucken des Bildes öffnen • R: Drehen - Bearbeitungsfunktion Drehen starten • U: Rückgängig - aktuelle Bearbeitung oder letzte in einer Reihe rückgängig machen • Umschalt+U: Wiederholen - aktuelle Bearbeitung oder nächste in einer Reihe wiederholen • Strg+C: In die Zwischenablage kopieren - aktuelle Datei in die Zwischenablage kopieren • Umschalt+C: Beschriftungen umschalten - Beschriftungen abwechselnd anzeigen/ausblenden • Strg+G: Ordnergalerie für die aktuelle Datei anzeigen • Umschalt+G: Raster umschalten - Rasterlinien ein-/ausschalten • Strg+S: Speichern - Dialog zum Speichern der Datei starten - - TOPIC: MAUSFUNKTIONEN - ^Dateiansicht • Linksklick - Zoom-in: Bild vergrößern, zentriert an der Mausposition • Rechtsklick - wenn das Bild gezoomt ist: auf Fenstergröße zurücksetzen andernfalls Popup-Menü mit häufig verwendeten Funktionen • Mausrad - Bild vergrößern oder verkleinern (Zoom) • Bild bei gedrückter linker Taste ziehen - gezoomtes Bild verschieben • Strg + Maus - Maus wirkt auf das Bild, nicht auf den aktiven Dialog - ^Galerieansicht • Linksklick auf Thumbnail - zur Dateiansicht wechseln • Rechtsklick auf Thumbnail - Popup-Menü mit häufig verwendeten Funktionen anzeigen • Mittelklick auf Thumbnail - großes Popup-Bild anzeigen, mit Mausrad zoomen • Mausrad - die Galerieseite nach oben oder unten scrollen - ^Kartenansicht • bei gedrückter linker Taste ziehen - die Karte entsprechend der Mausbewegung verschieben • Mausrad - Karte vergrößern oder verkleinern (Zoom) • Linksklick auf eine Markierung - Galerie der Bilder an diesem Standort anzeigen • ist der Dialog zum Bearbeiten der Metadata aktiv, legt ein Linksklick die Geokoordinaten fest - - TOPIC: BEFEHLSPARAMETER Diese Parameter können verwendet werden, wenn Fotocx über ein Terminal gestartet wird. -help Benutzerhandbuch anzeigen -home /folder alternative Fotocx-Home-Position (siehe unten) -lang xx Sprache anhand des 2-stelligen Codes festlegen -recent Galerie der zuletzt verwendeten Bilddateien anzeigen -new Galerie der neuesten Bilddateien anzeigen -album albumname zu öffnendes Album (Galerie) -prev zuletzt in der vorherigen Sitzung angesehene Datei anzeigen -blank ein leeres Fenster anzeigen -dev normalerweise ausgeblendetes Entwicklermenü anzeigen -menu manuname Fotocx startet mit diesem aktiven Menü -cwp nnn name Hintergrundbild wechseln (siehe unten) -x0 -x1 -x2 Indexierungsstufe auf 0, 1 oder 2 setzen (siehe unten) - ^-x0 -x1 -x2 Parameter^ (Indexierungsstufe beim Start festlegen) Diese Parameter können verwendet werden, um den Wert in {EINSTELLUNGEN} zu überschreiben -x0 sehr schneller Start, keine Bildindizierung -x1 schneller Start, nur alte Dateien werden indiziert -x2 alte Dateien + Suche nach neuen/geänderten Dateien - ^-home^ Parameter (alternativer Fotocx-Home-Ordner) Standardmäßiger Fotocx-Home-Ordner: /home//.fotocx. Hier werden Benutzereinstellungen und der Bildindex gespeichert. Der Befehl "$ fotocx -home " verwendet den angegebenen Ordner. Dies ermöglicht die separate Verwaltung mehrerer Bildsammlungen. Siehe auch {FOTOCX-STARTORDNER VERSCHIEBEN}. - ^-cwp^ Parameter (Desktop-Hintergrundbild wechseln) Die vollständige Befehlszeile lautet: $ fotocx -cwp secs container Verwenden Sie diesen Befehl, um das Desktop-Hintergrundbild aus einer ausgewählten Menge zu wechseln. 'secs' ist das Intervall zwischen den Bildern. 'container' ist entweder ein Fotocx-Albumname oder ein Ordner mit Bilddateien. Fügen Sie diesen Befehl zu Ihrer Anmelde-Startliste hinzu, um in festgelegten Intervallen ein neues Hintergrundbild zu erhalten. Verwenden Sie ein Intervall von einem Tag oder mehr, um bei jeder Anmeldung ein neues Hintergrundbild zu erhalten. Fotocx läuft im Hintergrund ohne grafische Oberfläche. Wenn 'secs' null ist, wird eine Aktualisierung des Hintergrundbilds vorgenommen, und Fotocx wird dann beendet. Jede Linux-Distribution verwendet einen anderen Befehl. Theoretisch werden folgende unterstützt: Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: DATEI-MENÜ - - TOPIC: NEUE SITZUNG Startet eine neue Fotocx-Sitzung in einem neuen Fenster. Wird eine Bilddatei in beiden Fenstern bearbeitet, sieht keine der beiden Instanzen die Änderungen der anderen, und das Endergebnis ist die zuletzt gespeicherte Datei. - - TOPIC: BILDDATEI ÖFFNEN Wählen Sie eine Bilddatei zum Anzeigen oder Bearbeiten aus, mit einem herkömmlichen Datei-Öffnen-Dialog mit Ordnern und Dateilisten. Dies ist nützlich, wenn Dateien nicht indiziert sind und die Galerieanzeige sehr langsam ist, z. B. beim Lesen von einer Kamera-SD-Karte mit Tausenden von Bilddateien. - - TOPIC: 2 DATEIEN DURCHLAUFEN Wiederholtes Aufrufen dieses Menüs wechselt zwischen den beiden zuletzt geöffneten Dateien. Diese Funktion behält die aktuelle Zoomgröße und -position des Bildes bei, was ideal ist, um zwei bearbeitete Versionen derselben Bilddatei schnell zu vergleichen. - - TOPIC: 3 DATEIEN DURCHLAUFEN Dies funktioniert genauso wie 2 Dateien durchlaufen, wechselt jedoch zwischen den letzten 3 geöffneten Dateien. - - TOPIC: 360°-PANORAMA ANSEHEN Die aktuelle Datei wird mit einem speziellen Betrachter für 360°-Panoramadateien geöffnet. Es wird angenommen, dass die Bildbreite 360° beträgt. Verwenden Sie diese Funktion, um Google-'Photosphere'-Bilder anzuzeigen. Verschieben Sie das Bild durch Ziehen mit der Maus oder mit den Pfeiltasten links/rechts. Zoomen Sie mit Linksklick/Rechtsklick der Maus. Verwenden Sie Escape, um den speziellen Betrachter zu verlassen. - - TOPIC: UMBENENNEN Benennt die aktuelle Datei (Dateiansicht) oder die Datei eines angeklickten Thumbnails (Galerieansicht) um. Geben Sie einen neuen Namen ein und drücken Sie [anwenden]. Diese Funktion kann auch den Vorgang des Umbenennens einer Reihe von Bilddateien mithilfe eines Basisnamens und einer laufenden Nummer automatisieren. Öffnen Sie die erste Bilddatei der Reihe, geben Sie einen neuen Namen ein und drücken Sie die Schaltfläche [anwenden]. Verwenden Sie bei Bedarf die Schaltfläche [next], um zur nächsten Datei zu wechseln. Sie können denselben Namen erneut verwenden, indem Sie die Schaltfläche [vorheriger Name] drücken und dann ein Suffix oder eine laufende Nummer hinzufügen. Drücken Sie die Schaltfläche [add 1], um die laufende Nummer zu erhöhen. - - TOPIC: LEERES BILD Erstellt ein leeres Bild mit festgelegten Pixelabmessungen und Farbe. Dies kann als Hintergrund für Ausschnitte aus anderen Bildern (über {BEREICH AUSWÄHLEN}) und Anmerkungstext (über {MARKUP} Text zeichnen) verwendet werden. - - TOPIC: KOPIEREN/VERSCHIEBEN Die aktuelle Datei (Dateiansicht) oder die Datei eines angeklickten Thumbnails (Galerieansicht) wird an den angegebenen Ort kopiert. Wählen Sie die Option Kopieren, um die Datei zu kopieren und die Quelldatei an ihrem Ort zu belassen, wodurch ein Duplikat entsteht. Wählen Sie die Option Verschieben, um die Datei vom ursprünglichen Ort an den neuen Ort zu verschieben. Eine Gruppe von Dateien kann schnell verarbeitet werden, indem jedes Thumbnail angeklickt und anschließend [anwenden] gedrückt wird. Mit der Schaltfläche [Vorher] kann der zuletzt verwendete Dateiname erneut verwendet werden. Fügen Sie eine Versionsnummer oder etwas anderes hinzu, um eine doppelte Datei zu vermeiden. - - TOPIC: AUF DESKTOP KOPIEREN Die aktuelle Datei (Dateiansicht) oder die Datei eines angeklickten Thumbnails (Galerieansicht) wird in den Desktop-Ordner (/home//Desktop) kopiert. - - TOPIC: IN ZWISCHENABLAGE KOPIEREN Die aktuelle Datei (Dateiansicht) oder die Datei eines angeklickten Thumbnails (Galerieansicht) wird in die Zwischenablage kopiert, von wo aus andere Anwendungen sie einfügen können. - - TOPIC: LÖSCHEN/PAPIERKORB Die aktuelle Datei (Dateiansicht) oder die Datei eines angeklickten Thumbnails (Galerieansicht) wird gelöscht oder in den Papierkorb verschoben, je nach ausgewählter Option. Fotocx verwendet den Standardpapierkorb (~/.local/share/Trash). - - TOPIC: HINTERGRUNDBILD FESTLEGEN Das Desktop-Hintergrundbild wird aus der aktuellen Bilddatei festgelegt. - - TOPIC: BILD DRUCKEN Das Menü Bild drucken öffnet einen Standard-Seite-einrichten-Dialog, in dem Sie einen Drucker, ein Papierformat und eine Ausrichtung auswählen können. Nach Verwendung der Schaltfläche [anwenden] startet ein weiterer Dialog zur Eingabe der Papierränder und des Bildmaßstabs. - Wenn das Bild ausgewählte Bereiche hat, werden Sie gefragt, ob nur diese Bereiche gedruckt werden sollen. Diese werden mit dem kleinsten Rechteck gedruckt, das zur Umschließung der Bereiche erforderlich ist, und Bereiche außerhalb der Auswahl werden nicht gedruckt. - - TOPIC: KALIBRIERT DRUCKEN Diese Funktion funktioniert wie die oben beschriebene Funktion Bild drucken, jedoch werden Sie vor dem Drucken aufgefordert, eine Kalibrierungsdatei anzugeben, die zur Anpassung der Bildfarben vor dem Drucken verwendet wird. Der Zweck besteht darin, Farbverschiebungen auszugleichen, die durch Drucker und Papiertyp verursacht werden. - - TOPIC: DRUCKER KALIBRIEREN +image: printer-calibrate-chart.png +image: calibrate-printer.png - Dieses Dienstprogramm kann möglicherweise die Farbgenauigkeit gedruckter Bilder verbessern. - ^Funktionsweise Eine Farbtabelle wird auf dem Zieldrucker gedruckt. Einige der gedruckten Farben werden aufgrund von Druckerungenauigkeiten leicht falsch sein. Diese gedruckte Seite wird in eine Datei eingescannt, und die Farben in dieser Datei werden mit den ursprünglich gedruckten Farben verglichen. Etwaige Abweichungen sind nun bekannte Fehler (vorausgesetzt, Ihr Scanner ist genauer als Ihr Drucker - was im Allgemeinen zutrifft). Beim Drucken einer Bilddatei werden diese Fehler von den Bildfarben abgezogen, bevor gedruckt wird. Der Drucker fügt die Fehler wieder hinzu, sodass ein theoretisch korrektes Ergebnis entsteht. Mein eigener Test zeigte eine bescheidene Verbesserung, die unten beschrieben ist. - Führen Sie die folgenden Schritte in der im Dialogfenster aufgeführten Reihenfolge aus. Alle Dateien befinden sich im Ordner /printer_color. • Erzeugen und drucken Sie die Farbtabellendatei (printchart.png). Verwenden Sie ein großes Papierformat, Hochformat, keine Ränder. • Scannen Sie die gedruckte Tabelle in eine PNG-Datei. Verwenden Sie 300 dpi oder mehr. • Bearbeiten Sie das PNG-Bild, um die vom Scanner hinterlassenen Ränder zuzuschneiden. Speichern Sie die bearbeitete Bilddatei. • Verarbeiten Sie die bearbeitete Bilddatei, um eine Farbzuordnungsdatei zu erstellen. - Sie können jetzt über das Menü {KALIBRIERT DRUCKEN} drucken, das Sie nach dem Dateinamen der Farbzuordnungsdatei für den verwendeten Drucker und das Papier fragt. - Scanner können ein gescanntes Bild leicht in eine nicht rechteckige Form verzerren. Falls dies passiert, werden Sie es beim Zuschneiden der Ränder bemerken: Die dicken grünen Randlinien richten sich nicht perfekt am Zuschneiderechteck aus. Verwenden Sie in diesem Fall zuerst {PERSPEKTIVE}, um das Bild zu begradigen, und schneiden Sie dann die Ränder zu. - Achten Sie beim Bearbeiten des gescannten Tabellenbilds darauf, dass sich die dunkelste Reihe oben befindet. Schneiden Sie die Ränder um die Farbkacheln herum zu. Verwenden Sie die dicke grüne Randlinie um die Farbkacheln als Orientierung: Schneiden Sie diese Linie exakt ab, sodass nur die Kacheln übrig bleiben. Arbeiten Sie mit 2-facher Vergrößerung, während Sie das Zuschneiderechteck anpassen. Ein genauer Zuschnitt ist wichtig. Ist der Zuschnitt nicht genau, werden die berechneten Kachelpositionen verschoben, und die gemessenen Farben könnten falsch sein. Ein kleiner Fehler wird toleriert. Sie können die Pfeiltasten der Tastatur für 1-Pixel-Bewegungen im Zuschneiderechteck verwenden. Die zuletzt mit der Maus gezogene Ecke ist die Ecke, die von den Pfeiltasten bewegt wird. - Die erzeugte Farbzuordnungsdatei kann nur für die Papier- und Druckereinstellungen verwendet werden, die für die Kalibrierung genutzt wurden. Jede andere Kombination benötigt ihre eigene Kalibrierung und Farbzuordnungsdatei. - ^Ergebnisse^ (mein Canon-Drucker) +image: printer-calibrate.jpg +image: printer-cal-study.png - Die obige Tabelle ist ein Foto von drei Bildern: oben links: Druck eines Farbtabellenfotos oben rechts: kalibrierter Druck desselben Fotos unten: die Farbtabelle selbst Da alle 3 Bilder zusammen fotografiert wurden, sind die durch die Kamera verursachten Fehler gleich, wodurch die Vergleiche gültig sind. - - TOPIC: GALERIE-MENÜ - - TOPIC: GALERIEÜBERSICHT +image: image-management.jpg - Eine Galerie mit Thumbnail-Bildern kann einen Dateiordner, das Ergebnis einer Bildsuche, eine der integrierten Galerien (zuletzt verwendete Dateien, neueste Dateien) oder ein Album (eine geordnete Liste von Bilddateien mit einem bestimmten Namen) darstellen. Aus praktischen und leistungsbezogenen Gründen sollten Ordner auf einige tausend Dateien begrenzt sein, es wird jedoch kein Limit erzwungen. - ^Scrollen der Galerie Die Galerie kann mit den Pfeiltasten nach oben/unten, den Bild-auf/ab-Tasten oder den Bildlaufleisten nach oben und unten gescrollt werden. Auch die Tasten [home] und [end] können verwendet werden. Klicken Sie mit der linken Maustaste auf die Bildlaufleiste und halten Sie sie gedrückt, damit die Galerie schnell zur Klickposition scrollt. Klicken Sie mit der rechten Maustaste auf die Bildlaufleiste und halten Sie sie gedrückt, damit die Galerie langsam zur Klickposition scrollt. Halten Sie die Maustaste weiterhin gedrückt und bewegen Sie sie zur Seite, um die Scrollgeschwindigkeit zu erhöhen. - - TOPIC: THUMB-ANSICHT Bilddateien in der aktuellen Galerie werden als Anordnung von Thumbnails angezeigt. Verwenden Sie die Zoom-Menüschaltfläche oder die Tasten [+] [-], um die Thumbnail-Größe zu ändern. - - TOPIC: METADATA-ANSICHT Bilddateien in der aktuellen Galerie werden zusammen mit den von Fotocx verwendeten grundlegenden Metadata angezeigt. Wenn benutzerdefinierte indizierte Metadata-Tags definiert sind, werden diese nach den Standard-Tags angezeigt. Siehe {DATEIEN INDIZIEREN}. - - TOPIC: LETZTE DATEIEN Die 1000 zuletzt angesehenen Bilddateien werden in einer Galerie angezeigt, aus der Sie Dateien zum Anzeigen oder Bearbeiten auswählen können. - - TOPIC: NEUESTE DATEIEN Die 1000 zuletzt hinzugefügten oder geänderten Bilddateien werden in einer Galerie angezeigt, aus der Sie Dateien zum Anzeigen oder Bearbeiten auswählen können. Sie können wählen, ob das EXIF-Fotodatum oder das Dateiänderungsdatum zur Bestimmung der neuesten Bilder verwendet wird. - - TOPIC: GALERIESORTIERUNG Wählen Sie den Sortierschlüssel sowie auf- oder absteigende Reihenfolge. Das Kontrollkästchen Zurücksetzen setzt alle Galerien auf aufsteigende Sortierung nach Dateiname zurück. - Wird eine Album-Galerie sortiert, ersetzt das Ergebnis nicht das Album, sondern erstellt ein neues Album mit dem Namen -sorted. - ^Dateiname/Nummer Dies ist eine modifizierte Sortierung nach Dateiname. Wenn mehrere Dateien Namen haben, die sich nur durch eingebettete Zahlen an derselben Position unterscheiden, wird diese Dateigruppe in der Reihenfolge der eingebetteten Zahlen sortiert. Das folgende Beispiel verdeutlicht den Unterschied: alphabetische Reihenfolge: xxx1xx xxx11xx xxx123xx xxx3xx numerische Reihenfolge: xxx1xx xxx3xx xxx11xx xxx123xx - ^Metadata aus der Suchfunktion Wenn die Galerie durch die Option 'Metadata-Bericht' von {BILDER SUCHEN} erzeugt wurde und Sie dem Standardbericht optionale Metadata-Tags hinzugefügt haben, können Sie die Galerie nach diesen Metadata-Tags sortieren. Sie können die Galerie nach Kamerahersteller, Objektivinformationen, ISO-Wert, Belichtungszeit ... beliebigen verfügbaren Metadata sortieren. - - TOPIC: GALERIEFILTER Wählen Sie eine Teilmenge der aktuellen Galerie aus, um ein Album mit dem Namen "gallery_filter" zu erstellen, das die ausgewählten Bilddateien enthält. ^Auswahloptionen: • alle Dateien: alle Bilddateien auswählen • Originale: Originaldateien (keine Versionsnummer) • Versionen: versionierte Dateien (wurden bearbeitet) • letzte Versionen: letzte Versionen (oder Originale, falls keine Versionen vorhanden) • Bewertungsbereich: Dateien mit einer Bewertung innerhalb des angegebenen Bereichs • Keyword-Namen: Dateien mit einem der angegebenen Keywords (kommagetrennt) • Dateiname-Text: Dateien mit einer der angegebenen Textzeichenfolgen (kommagetrennt) - - TOPIC: GALERIE-START TOPIC: GALERIEENDE Springt zum ersten oder letzten Thumbnail in der aktuellen Galerie. - - TOPIC: AKTUELLER DATEIORDNER Legt die aktuelle Galerie anhand der aktuellen Bilddatei fest. Dies ist nützlich, wenn Sie nach einer anderen Tätigkeit zur Galerie der aktuellen Datei zurückkehren möchten. - - TOPIC: LETZTE ORDNER Legt die aktuelle Galerie anhand einer zuletzt verwendeten Galerie fest. Dies erleichtert das Hin- und Herwechseln zwischen zuletzt verwendeten Galerien. - - TOPIC: ORDNERBAUM +image: folder-tree.png - Zunächst werden alle TOP-Bildordner angezeigt. Klicken Sie auf [+], um Unterordner aufzuklappen, oder auf [-], um sie wieder einzuklappen. Sie können auf einen beliebigen Ordner klicken, um eine Galerie der Bilder in diesem Ordner zu erhalten. Lassen Sie das Fenster geöffnet, um überall in Ihrer Bildsammlung zu navigieren. Diese Funktion ist auch über die Schaltfläche [TOP] im oberen Galerie-Panel verfügbar. - - TOPIC: DATEIEN AUSWÄHLEN Bilddateien vorab auswählen, um sie als Eingabe zum Erstellen von Alben oder für Stapelfunktionen zu verwenden. Diese Funktionen verwenden standardmäßig die vorab ausgewählten Dateien, Sie können diese jedoch auch ändern oder von vorn beginnen. Siehe das Verfahren {BILDDATEIEN AUSWÄHLEN}. - - TOPIC: LESEZEICHEN Vorhandene Lesezeichen anzeigen. Lesezeichen sind ausgewählte Speicherorte (Ordner-/Dateinamen) mit benutzerdefinierten Namen. Klicken Sie auf ein Lesezeichen, um eine Galerie von Thumbnails ab diesem Speicherort anzuzeigen. Wählen Sie [Lesezeichen bearbeiten], um ein Lesezeichen hinzuzufügen, zu löschen oder umzubenennen. - - TOPIC: LESEZEICHEN BEARBEITEN Klicken Sie nach dem Start von Lesezeichen bearbeiten auf ein Galerie-Thumbnail, um diesen Speicherort zur Lesezeichenliste hinzuzufügen. Der zugewiesene Lesezeichenname ist zunächst der Dateiname des Thumbnails. Sie können den Namen bearbeiten. Wenn Sie ein vorhandenes Lesezeichen mit einem Mausklick auswählen, wird sein Name im Eingabefeld angezeigt. Sie können den Namen ändern oder [löschen] drücken, um das Lesezeichen zu entfernen. Neue Lesezeichen werden nach dem zuletzt ausgewählten Lesezeichen-Speicherort eingefügt. Um die Reihenfolge zu ändern, bearbeiten Sie die Datei "bookmarks" im Fotocx-Home-Ordner. - - TOPIC: MAPS MENU - - TOPIC: WELTKARTE +image: map-click.jpg - Dies ist eine Internet-Weltkarte, die von Straßenebene bis Kontinentebene skaliert (gezoomt) werden kann. Verwenden Sie das Mausrad, um die Karte zu vergrößern/verkleinern. Ziehen Sie die Karte, um den Mittelpunkt zu ändern. Die Karte enthält Markierungen (rote Punkte), die Bildern mit Geokoordinaten in ihren Metadata entsprechen. Klicken Sie auf eine Markierung, um eine Galerieansicht der Bilder an diesem Standort zu erhalten. Bilder, die sich innerhalb des Markierungsbereichs auf der Karte befinden, werden ausgewählt. Der effektive Markierungsbereich skaliert mit dem Kartenmaßstab. Zoomen Sie hinein, um den Maßstab zu vergrößern und möglicherweise eine Markierung in mehrere nahe beieinanderliegende Markierungen zu unterteilen. - - TOPIC: AUF KARTE ANZEIGEN Zeigt die Position der aktuellen Bilddatei auf der Weltkarte an. Wenn sich mehrere Markierungen überlappen, zoomen Sie hinein, bis eine einzelne Markierung in der Mitte steht. - - TOPIC: ALBEN-MENÜ - - TOPIC: ALBEN Ein Album ist eine beliebige Sammlung von Bildern, die manuell aus vorhandenen Bildern zusammengestellt wird. Ein Album ist eine Liste seiner zugehörigen Bilddateien. Die Bilddateien selbst werden weder kopiert noch geändert. Eine bestimmte Bilddatei kann Mitglied mehrerer Alben sein oder innerhalb eines Albums mehrfach vorkommen. Sie können Bilder in einem Album hinzufügen und entfernen oder ihre Reihenfolge ändern. Sobald ein Album erstellt wurde, können Sie es nach Namen auswählen, und es wird als Galerie angezeigt. - - TOPIC: ALBUM ERSTELLEN Geben Sie einen Namen für ein neues Album ein. Sie können ein leeres Album, ein Album mit vorab ausgewählten Bilddateien aus {DATEIEN AUSWÄHLEN}, ein Album mit Bildern aus der aktuellen Galerie erstellen, oder Sie können die ursprünglichen Bilder für das Album auswählen. - - TOPIC: ALBUM UMBENENNEN Wählen Sie ein vorhandenes Album und geben Sie einen neuen Namen ein. - - TOPIC: ALBUM LÖSCHEN Wählen Sie ein vorhandenes Album und löschen Sie es endgültig. - - TOPIC: ALBUM WÄHLEN Eine Liste der verfügbaren Alben wird angezeigt. Wählen Sie aus der Liste. - - TOPIC: AKTUELLES ALBUM Legt die Galerie anhand des aktuellen (zuletzt verwendeten) Albums fest. - - TOPIC: GALERIE ZU ALBUM Speichert die aktuelle Galerie als Album. Wählen Sie einen vorhandenen Albumnamen [Durchsuchen], oder geben Sie einen neuen Namen ein. - - TOPIC: ALBUM BEARBEITEN Klicken Sie mit der rechten Maustaste auf ein Album-Thumbnail und wählen Sie aus dem Popup-Menü: • Ausgewählte Dateien hier hinzufügen - zuvor ausgewählte Dateien werden hier hinzugefügt (klicken Sie auf die linke/rechte Seite des Thumbnails, um vor/nach dem Thumbnail hinzuzufügen). • Aktuelle Datei (Dateiansicht) hier hinzufügen - funktioniert auf dieselbe Weise. • Aus Album entfernen - die angeklickte Datei wird aus dem Album entfernt. - ^Ziehen und Ablegen Sie können Bilder in einem Album neu anordnen, indem Sie Thumbnails mit der Maus ziehen. Ziehen Sie das Thumbnail, bis sich der Mauszeiger in ein kleines Thumbnail-Bild verwandelt. Ziehen Sie dieses Bild weiter an die Position, an der es eingefügt werden soll, und lassen Sie die Maustaste los. Positionieren Sie die Maus ungefähr zwischen den Thumbnails, wo das gezogene Bild eingefügt werden soll. Nähert sich der Ziehvorgang dem oberen oder unteren Fensterrand, scrollt die Galerie, um weitere Bilder anzuzeigen. Sie können zwei Fotocx-Sitzungen verwenden, um die Auswahl oder das Verschieben vieler Bilder zu beschleunigen. Ziehen und legen Sie Bilder aus einer beliebigen Quellgalerie an einer Zielposition im Album ab. - Wenn Sie eine Datei mit Fotocx umbenennen oder verschieben, werden alle Album-Verknüpfungen aktualisiert, und die Datei bleibt in den Alben erhalten, die sie enthalten. Tun Sie dies außerhalb von Fotocx, gehen die Album-Verknüpfungen verloren, und die Datei verschwindet aus dem Album. - Wenn Bilddateien mit Stapel-Konvertierung oder Stapel Kopieren/Verschieben umbenannt oder verschoben werden, achten Sie darauf, die Option zum Ersetzen von Albumdateien auszuwählen, falls dies gewünscht ist. Andernfalls müssen Sie sie einzeln ersetzen. - Benennen Sie Ordner nicht um, wenn sie Bilder enthalten, die sich in Alben befinden. Album-Verknüpfungen gehen dabei verloren. Verwenden Sie stattdessen Stapel-Konvertierung oder Stapel Kopieren/Verschieben, um die Bilddateien in den neuen Ordner zu verschieben, und löschen Sie dann den alten Ordner, falls er leer ist. Verwenden Sie zum Löschen von Bilddateien Stapel Löschen/Papierkorb. Dadurch werden gelöschte Dateien auch aus den Alben entfernt. - - TOPIC: ALBEN AKTUALISIEREN +image: album-replace-file.png - Ersetzt angegebene Albumdateien durch angegebene Ersatzdateien, oder fügt angegebene neue Dateien nach angegebenen vorhandenen Dateien hinzu. Wählen Sie ein oder mehrere zu verarbeitende Alben aus. Klicken Sie in der Galerieansicht auf zwei Thumbnails, um im obigen Dialog 'alte Datei' und 'neue Datei' festzulegen. Wählen Sie die Option: 'neue Datei' ersetzt 'alte Datei' überall, wo sie gefunden wird, oder 'neue Datei' wird nach 'alte Datei' zu den Alben hinzugefügt. Drücken Sie [proceed], um die Alben zu verarbeiten. Nach der Verarbeitung wird der Dialog mit denselben ausgewählten Alben und derselben Option 'ersetzen oder hinzufügen' wiederholt. Sie können zwei weitere Dateien auswählen und [proceed] drücken. - - TOPIC: ALBUM-SAMMELAKTUALISIERUNG +image: album-mass-update.png - Dies ist ein Dienstprogramm für Massenaktualisierungen, das Sie möglicherweise benötigen, nachdem Sie für viele Bilddateien neue Versionen erstellt haben und ein oder mehrere Alben auf die neuen Versionen aktualisieren müssen. Dies deckt nicht jeden Bedarf ab, was wahrscheinlich unmöglich ist, wird aber hoffentlich die Notwendigkeit verringern, Dateien einzeln zu ändern. - Wählen Sie ein oder mehrere Alben aus und wählen Sie dann eine der Verarbeitungsoptionen: • Alle nur durch neueste Version ersetzen: Alben werden aktualisiert, sodass nur noch die neuesten Dateiversionen enthalten sind. • Alle Versionen durch neueste Version ersetzen: Alle Dateiversionen werden durch nur die neueste Version ersetzt. Die Originaldatei wird, falls vorhanden, NICHT ersetzt. • Neueste Versionen zu vorhandenen Versionen hinzufügen: Die neueste Version wird zu den vorhandenen Versionen hinzugefügt, falls sie fehlt. • Alle durch Original und alle Versionen ersetzen: Alle Dateien werden durch die Originaldatei und alle Versionen ersetzt. • Alle durch Originalversion und neueste Version ersetzen: Alle Dateien werden durch die Originaldatei und die neueste Version ersetzt. • Alle durch ausgewählte Versionen ersetzen (*): Alle Dateien werden nur durch die ausgewählten Versionen ersetzt. Dies schließt die Originaldatei (ohne Version) ein. • Alle Versionen durch ausgewählte Versionen ersetzen (*): Alle Dateiversionen werden nur durch die ausgewählten Versionen ersetzt. Die Originaldatei wird, falls vorhanden, NICHT ersetzt. • Ausgewählte Versionen zu vorhandenen Versionen hinzufügen (*): Die ausgewählte Version wird zu den vorhandenen Versionen hinzugefügt, falls sie fehlt. • Alle durch Original und ausgewählte Versionen ersetzen (*): Alle Dateien werden durch Originaldateien und ausgewählte Versionen ersetzt. - (*) Die vier Optionen, die ausgewählte Dateien verwenden: Die Liste der ausgewählten Dateien stammt aus der Funktion {DATEIEN AUSWÄHLEN}. Albumdateien, die keiner ausgewählten Datei entsprechen, verbleiben im Album. Nur Dateien, die einer ausgewählten Datei entsprechen, werden gemäß den obigen Regeln geändert. Die Übereinstimmung basiert auf dem Dateinamen ohne Version oder Erweiterung: 'asdfg.png' und 'asdfg.v01.jpg' stimmen überein. - Beispiel: Alle Versionen durch ausgewählte Versionen ersetzen: Wenn das Album filename.jpg und filename.v02.png enthält und die Liste der ausgewählten Dateien filename.v04.jpg enthält, lautet das Ergebnis im aktualisierten Album: filename.jpg und filename.v04.jpg - - TOPIC: DIASHOW +image: slide-show.jpg - ^Gebrochene Monitorskalierung Bei einigen Systemen verursacht die gebrochene Skalierung Leistungsprobleme bei den Diashow-Animationen von Fotocx. Deaktivieren Sie diese und verwenden Sie bei Bedarf andere Mittel, um die Schriftgröße für Anwendungen zu erhöhen. Für Fotocx befindet sich die Schriftgröße im Menü {EINSTELLUNGEN}. - Drücken Sie im Diashow-Dialog (oben links) auf [Album auswählen] und wählen Sie ein Album aus der bereitgestellten Liste. Ändern Sie die anderen Einstellungen im Dialog nach Wunsch, und drücken Sie dann die Schaltfläche [Start], um die Diashow mit dem ersten Bild im Album zu starten, oder [Fortsetzen], um eine pausierte Diashow fortzusetzen, oder ein anderes durch Anklicken seines Thumbnails ausgewähltes Bild. Verwenden Sie die Escape-Taste, um die Diashow zu beenden und zum Dialog zurückzukehren. - Hauptdialog-Steuerelemente • Beschriftungsdauer: Sekunden, in denen Titel und Beschreibung angezeigt werden. • Bilddauer: Sekunden, in denen nur das Bild angezeigt wird. • Beschneidungsgrenze %: Bilder bis zu diesem Betrag beschneiden, um Ränder zu entfernen. • Vollbild: Wenn aktiviert, werden Bilder im Vollbildmodus ohne Menü usw. angezeigt. • Automatische Wiederholung: Wenn aktiviert, beginnt die Diashow nach dem Ende erneut. • Zufällige Bildreihenfolge: Wenn aktiviert, wird eine zufällige Bildreihenfolge verwendet. Andernfalls die Albumreihenfolge. - Zur Steuerung der Diashow können Tastaturtasten verwendet werden. Drücken Sie [Tastatur], um sie anzuzeigen. - Die folgenden Tasten sind Aktionen zugewiesen und können nicht geändert werden: • Escape: Diashow unterbrechen und zum Hauptdialog zurückkehren. • Pfeiltaste links/rechts: Sie können jederzeit vor- und zurückspringen, die Diashow wird von dort fortgesetzt. - Die animierten Übergänge zwischen den Bildern sowie die Anzeigedauer und das Zoom-Verhalten einzelner Bilder können über die unten erläuterten Dialoge angepasst werden. - Drücken Sie [Übergänge], um einen Dialog zur Auswahl und Anpassung der Übergänge zwischen den Bildern zu starten. Dazu gehören viele animierte Methoden des Bildwechsels (z. B. das neue Bild dehnt sich von der Mitte aus, um das alte Bild zu ersetzen). Wählen Sie die zu verwendenden Übergänge und ob sie zufällig oder in Reihenfolge verwendet werden. Der Zeitparameter legt die Dauer des Übergangs fest. Die Präferenzparameter geben eine relative Präferenz an, die beeinflusst, wie häufig der Übergang verwendet wird, wenn eine zufällige Reihenfolge ausgewählt ist. - Mit den Schaltflächen [laden] und [speichern] können Sie Übergangseinstellungen in einer Datei speichern und später laden. Diese Dateien sind unabhängig von den Diashow-Dateien. Eine Diashow verwendet standardmäßig die zuletzt für diese Diashow (Albumname) verwendeten Übergangseinstellungen, Sie können diese jedoch jederzeit ersetzen, indem Sie mit der Schaltfläche [laden] andere Einstellungen laden oder sie im Dialog ändern. - Drücken Sie [Bilddateien], um einen Dialog für Bildeinstellungen (oben rechts) zu starten. Diese sind optional. Ein Bild wird zur Anpassung ausgewählt, indem Sie auf sein Thumbnail in der Album-/Galerieanzeige klicken. Der Dialog wird mit Standardeinstellungen oder den vorherigen Einstellungen für dieses Bild in dieser Diashow ausgefüllt. Geben Sie Änderungen ein und drücken Sie [done], oder klicken Sie auf das nächste anzupassende Bild. - Präferenz: Wenn eine zufällige Bildreihenfolge gewählt wird, gibt diese Zahl eine relative Präferenz für das Bild an. Der neutrale Wert ist 10. Geben Sie einen neuen Wert ein, um die Wahrscheinlichkeit zu erhöhen oder zu verringern, dass diese Datei in der zufälligen Bildreihenfolge ausgewählt wird, z. B. würde ein Wert von 20 die Wahrscheinlichkeit verdoppeln. Ein Wert von null würde verhindern, dass das Bild angezeigt wird. Das Bild wird außerdem für eine Anzahl von 1/3 der Bilder im Album oder 10 gesperrt, je nachdem, welcher Wert kleiner ist. - Der Dialog zeigt die anpassbaren Bildereignisse in zeitlicher Reihenfolge: • für eine festgelegte Zeit warten (kann null sein). • folgende Text-Tags parallel anzeigen: Bildname (Basisdateiname) für eine festgelegte Zeit, Bildtitel, falls vorhanden, für eine festgelegte Zeit, Bildbeschreibung, falls vorhanden, für eine festgelegte Zeit. • eine festgelegte Zeit warten, bevor ein Bild-Zoom beginnt (kann null sein). • das Bild über die festgelegte Zeit von normal auf vergrößert zoomen oder umgekehrt. Wenn keine der Optionen ausgewählt ist, erfolgt kein Zoom. • Zoom-in: bei normaler Größe beginnen, das Bild vergrößern, während der Zoom-Mittelpunkt zur festgelegten Position bewegt wird. • Zoom-out: bei vergrößerter Größe am festgelegten Zoom-Mittelpunkt beginnen, das Bild wieder auf normale Größe verkleinern. • [zoom center] - drücken Sie diese Schaltfläche und klicken Sie dann auf das Bild-Thumbnail, um den Zoom-Mittelpunkt für das Bild festzulegen. • nach dem Zoom eine festgelegte Zeit warten (kann null sein) (der Standardwert ist die Einstellung 'Bilddauer' im Hauptdialog). • Übergang zum nächsten Bild, unter Verwendung des festgelegten Übergangs oder 'next', um keine Präferenz anzugeben (zufällig ausgewählt). - - TOPIC: BENUTZERDEFINIERTES MENÜ +image: custom-menu.png - Dies ermöglicht es Ihnen, häufig verwendete Funktionen aus mehreren Menüs in einem einzigen benutzerdefinierten Menü zusammenzufassen. Sie können auch Einträge hinzufügen, um bestimmte Bilddateien oder Alben zu öffnen. Das Menü enthält außerdem Skriptfunktionen und Plugin-Funktionen (siehe unten). - Der letzte Eintrag im Menü, Menü bearbeiten, öffnet einen Texteditor zum Bearbeiten der Menüliste selbst. Die Menünamen müssen genau mit den Namen in den Fotocx-Menüs übereinstimmen, wobei Groß-/Kleinschreibung keine Rolle spielt. - Menüeinträge können folgende Formate haben: • # Kommentartext: ein Kommentar, der nichts bewirkt • menuname # Popup-Tipp: Fotocx-Menüname und optionaler Popup-Tipp • file : benannte Datei öffnen • album : benanntes Album als Galerie öffnen - Die folgenden Einträge sind standardmäßig vorhanden und sollten nicht geändert oder entfernt werden: Skript bearbeiten, Skript ausführen, Stapel-Skript, Plugins, Menü bearbeiten. Details werden unten erläutert. - - TOPIC: SKRIPTDATEIEN Menüfunktionen: • Skript bearbeiten - Eine Reihe von Bearbeitungen an einer Bilddatei durchführen, wobei alle Funktionen und Einstellungen in einer benannten Skriptdatei aufgezeichnet werden. • Skript ausführen - Eine Skriptdatei mit der aktuellen Bilddatei ausführen, wie eine Bearbeitungsfunktion. • Stapel-Skript - Eine beliebige Anzahl von Bilddateien auswählen und eine Skriptdatei im Stapelmodus auf alle anwenden. - Skriptdateien ermöglichen es Ihnen, eine Reihe von Bearbeitungen einmal festzulegen und diese später auf einzelne oder mehrere Bilddateien anzuwenden. - ^Skriptfähige Bearbeitungsfunktionen Einige Bearbeitungsfunktionen verwenden Mausziehvorgänge auf dem Bild, z. B. alle Verzerrungsfunktionen. Diese sind nicht skriptfähig, da Mausziehvorgänge nicht aufgezeichnet werden. Die Verwendung dieser Funktionen ist blockiert. - Die folgenden Funktionen sind derzeit skriptfähig: • Bearbeiten: Retuschieren, Ränder, Farbmodus, Bereich füllen • Reparatur: Schärfen, Weichzeichnen Normal, Weichzeichnen Graduiert, Rauschen reduzieren, Entnebeln, JPEG-Artefakte, Anti-Aliasing, RGB anpassen • Verfeinern: Histogramm abflachen, Lokaler Kontrast, Kontrast verstärken, Globaler Retinex, Lokaler Retinex, Lokaler Kontrast, Sättigung, Weichzeichner-Effekt, Helligkeitsverlauf • Effekte: Umrisse, Skizze, Cartoon, Prägung, Kacheln1, Kacheln2, Gemälde, Textur, Muster, Dithering, Gravieren, Farben festlegen, Farben verschieben, Benutzerdefinierter Kernel - - TOPIC: SKRIPT BEARBEITEN Drücken Sie im Dialog auf [Start]. Wählen Sie einen Dateinamen für das Skript. Beginnen Sie mit der Bearbeitung der aktuellen Bilddatei. Verwenden Sie die gewünschten Bearbeitungsfunktionen in beliebiger Reihenfolge. Jede Bearbeitung wird zusammen mit allen verwendeten Dialogeinstellungen in der Skriptdatei aufgezeichnet. Drücken Sie zum Abschluss auf [close], um die Skriptdatei zu schließen und unter dem angegebenen Dateinamen zu speichern. - - TOPIC: SKRIPT AUSFÜHREN Wählen Sie eine Ihrer gespeicherten Skriptdateien aus dem Popup-Menü. Das Skript wird mit der aktuellen Bilddatei ausgeführt, wie eine normale Bearbeitungsfunktion. - - TOPIC: SAMMELSKRIPT Drücken Sie im Dialog auf [Dateien auswählen]. Wählen Sie die zu bearbeitenden Dateien über den Standard-Dateiauswahldialog {BILDDATEIEN AUSWÄHLEN} aus. Drücken Sie anschließend auf [Skript auswählen]. Wählen Sie eine Skriptdatei aus dem Popup-Menü. Das Skript wird nun auf alle ausgewählten Dateien angewendet. Alle geänderten Bilder werden als neue Versionen gespeichert. Werden RAW-Dateien verarbeitet, sind die entsprechenden Ausgabedateien TIFF-16-Dateien. - - TOPIC: PLUGINS +image: plugins.png - Plugin-Funktionen sind eine Möglichkeit, andere Bildbearbeitungsprogramme innerhalb von Fotocx zu verwenden, z. B. Gimp. Sie können einen RAW-Bildeditor wie Rawtherapee verwenden und anschließend weitere Bearbeitungen mit Fotocx durchführen. - ^Verwendungsablauf: • Öffnen Sie die zu verarbeitende Datei in Fotocx • Starten Sie das Plugins-Menü und wählen Sie das gewünschte Programm, z. B. Gimp • Das Plugin-Programm startet und öffnet die von Fotocx übergebene Datei • Führen Sie die gewünschten Bearbeitungen mit dem Plugin-Programm durch • Speichern Sie nach Abschluss die Ausgabedatei unter demselben Namen wie die Eingabedatei. Die Dateierweiterung (.ext) kann sich ändern. • Schließen Sie das Plugin-Programm. • Fotocx öffnet die Plugin-Ausgabedatei als bearbeitete Version der aktuellen Datei. • Führen Sie weitere Bearbeitungen durch, oder speichern Sie die bearbeitete Datei als neue Version oder neue Datei. - Links sehen Sie ein Beispiel für ein Plugins-Menü. Der letzte Eintrag "Plugins bearbeiten" startet die Textbearbeitungsanwendung rechts. Verwenden Sie den Texteditor, um die Plugin-Menünamen und die Befehle zum Starten der entsprechenden Plugin-Programme festzulegen. Das Format lautet: menuname = plugin-command %s TIP = Erklärung des obigen Befehls Der 'plugin-command' ist der Shell-Befehl für die Plugin-Funktion, und '%s' ist die Stelle, an der der aktuelle Dateiname in den Befehl eingefügt wird. Setzen Sie keine Anführungszeichen um '%s', da diese automatisch hinzugefügt werden, damit Dateinamen mit Leerzeichen oder anderen Sonderzeichen verarbeitet werden können. Das oben gezeigte Beispiel ist ein Menü namens "Gimp", das den Befehl "gimp %s" startet. Der TIP-Text ist optional. Falls vorhanden, steht er in der Zeile nach dem Menünamen. Wenn Sie mit der Maus über den Menüeintrag fahren, wird dieser Text neben dem Menütext angezeigt. - Einige Befehle erwarten möglicherweise die Angabe sowohl einer Eingabe- als auch einer Ausgabedatei. Geben Sie in diesem Fall '%s' an beiden Positionen an. Lassen Sie '%s' weg, wenn der Befehl keine Bilddatei verarbeitet. - ^Bereich auswählen Wenn die Eingabedatei einen ausgewählten Bereich hat, wird nur dieser Bereich geändert. Die Plugin-Funktion bearbeitet das gesamte Bild, aber wenn das Ergebnis von Fotocx verarbeitet wird, werden nur die Änderungen im ausgewählten Bereich beibehalten. - - TOPIC: ZOOM - ^Zoom-Schaltfläche Klicken Sie mit der linken oder rechten Maustaste auf die Schaltfläche, um die Bildgröße in der {DATEIANSICHT} oder die Thumbnail-Größe in der {GALERIEANSICHT} zu erhöhen oder zu verringern. Dies gilt nur, wenn der Galerieansicht-Modus {THUMB-ANSICHT} ist. Bei {METADATA-ANSICHT} geschieht nichts. - - TOPIC: VORHERIGE/NÄCHSTE - Klicken Sie mit der linken oder rechten Maustaste auf die Schaltfläche, um die vorherige oder nächste Datei in der aktuellen Galerie zu öffnen. Sie können auch die Pfeiltasten links/rechts verwenden. - - TOPIC: DATEI SPEICHERN - +image: file-save.png - +image: file-save-as.jpg - Wählen Sie im ersten Dialog 'neue Version', 'neue Datei' oder 'Datei ersetzen'. - ^Neue Version Speichert die aktuelle Bilddatei mit einer neuen Versionsnummer. Dateinamen mit Versionsnummern haben das Format "filename.vNN.ext", wobei NN eine Zahl von 01 bis 99 ist. Wenn der Dateiname noch keine Version hat, wird die Version .v01 erstellt. Sind bereits Dateiversionen auf der Festplatte vorhanden, wird die nächsthöhere Versionsnummer verwendet. Handelt es sich um eine JPEG-Datei, wird die Standardqualität verwendet - siehe {EINSTELLUNGEN}. - ^Neue Datei Der oben gezeigte zweite Dialog öffnet sich, um das aktuelle Bild in einer ausgewählten Datei zu speichern, bei der es sich um die Originaldatei, eine andere vorhandene Datei oder eine neue Datei handeln kann. Eine Datei kann in den Formaten JPEG, PNG, JXL und TIFF gespeichert werden. - Bei JPEG können Sie einen Qualitätswert im Bereich 1-100 wählen. Niedrigere Werte ergeben kleinere Dateien und geringere Bildqualität. Werte über 70 sind kaum von 100 zu unterscheiden (höchste Qualität, größte Dateigröße). Die JPEG-Standardqualität wird verwendet, sofern Sie den Wert nicht im Dialog ändern. Der Standardwert stammt aus {EINSTELLUNGEN}. Sie werden keinen Unterschied zwischen einer mit Qualität 70 gespeicherten Datei und einer mit 100 erkennen können, aber der Unterschied im Speicherplatz ist enorm. Transparente Bereiche werden schwarz dargestellt. JPEG unterstützt keine Transparenz. - PNG- und TIFF-Dateien werden verlustfrei komprimiert und sind viel größer als JPEG. Sie können mit 8 oder 16 Bit pro Farbe gespeichert werden. - Wenn 'als aktuell festlegen' aktiviert ist, wird die gespeicherte Datei (neuer Dateiname) zur aktuellen Datei. - ^Datei ersetzen Speichert die aktuelle Bilddatei wieder in sich selbst. - Die ^Berechtigungen^ werden von der Eingabedatei übernommen. Drücken Sie die Schaltfläche [Ändern], um die Berechtigungen zu bearbeiten. - - TOPIC: METADATA-MENÜ - - Metadata sind Textdaten, die innerhalb einer Bilddatei gespeichert sind. Digitalkameras erzeugen automatisch einige Metadata, wie Datum und Uhrzeit, technische Daten zu Kamera und Fotoparametern sowie Standortdaten (falls die Kamera über einen GPS-Empfänger verfügt). Weitere Daten können vom Benutzer hinzugefügt werden, z. B. ein Titel, eine Beschreibung, eine Bewertung, keywords. Fotocx kann Ihre Bildsammlung anhand beliebiger Metadata sowie Ordner- und Dateinamen oder Teilnamen durchsuchen und dabei eine Galerie passender Bilder erzeugen. In den meisten Fällen erfolgt die Suche nahezu augenblicklich. - - TOPIC: HAUPTMETADATA ANSEHEN TOPIC: ALLE METADATA ANSEHEN +image: view-metadata.jpg - Die Funktion Haupt-Meta anzeigen zeigt häufig nützliche Metadata für die aktuelle Bilddatei an. Dazu gehören Datum und Uhrzeit eines Fotos, Verschlusszeit, Brennweite, Bildgröße, ISO usw. Digitalkameras speichern diese Daten im Bild. Metadata können außerdem vom Benutzer hinzugefügte Daten enthalten: keywords, Titel oder Beschriftung, Beschreibung, Kommentare, die vom Fotografen oder einem späteren Bearbeiter hinzugefügt wurden (manchmal in veröffentlichten Bildern zu finden). - Wird ein Bild bearbeitet, wird ein Eintrag der Bearbeitung in den Metadata gespeichert. Haupt-Meta anzeigen zeigt den Verlauf der vorgenommenen Bearbeitungen. - Alle Meta anzeigen meldet alle verfügbaren Metadata und kann über 100 Einträge enthalten, die Sie vermutlich nicht interessieren. - Die Schaltfläche [Extras] im Fenster Haupt-Meta anzeigen öffnet den rechts gezeigten Dialog, in dem Sie zusätzliche Tags zum Bericht hinzufügen können. Jeder im Bericht Alle Meta anzeigen verfügbare Tag kann zum Kurzbericht hinzugefügt werden. Klicken Sie auf einen Tag in der linken Spalte, um ihn zur rechten Spalte und zum Bericht hinzuzufügen. Klicken Sie auf einen Tag in der rechten Spalte, um ihn zu entfernen. Klicken Sie auf den Eintrag "Anderer Tag ...", um einen beliebigen, nicht in der Standardliste enthaltenen Tag-Namen einzugeben; die Standardliste ist auf die wahrscheinlich am häufigsten benötigten Tags beschränkt. - Fotocx verwendet diese Metadata-Tags zum Bearbeiten und Suchen von Bildern: • Title - kurzer Titel des Bildes • Description - Beschreibung des Bildes • Date/Time Original - Fotodatum/-uhrzeit • Rating - 0 bis 5 Sterne • Country - von der Kamera-GPS oder manuell hinzugefügt • Location - EXIF-Name ist die Stadt • Geotags - latitude/longitude • Keywords - Bildkennungen des Benutzers • Kameradaten - Hersteller, Modell, Objektiv • Belichtungsdaten - Zeit, Blendenzahl, Brennweite, ISO Diese Tags werden mit der Funktion {HAUPTMETADATA BEARBEITEN} bearbeitet. Alle anderen Tags können ebenfalls bearbeitet und durchsucht werden, wobei unten weniger komfortable Methoden erläutert werden. - Es gibt außerdem mehrere Stapelfunktionen, um Daten gleichzeitig zu vielen Bilddateien hinzuzufügen. Siehe {SAMMEL-MENÜ}. - - TOPIC: KEYWORDS-ÜBERSICHT Bilddateien können Identifikations- oder Klassifizierungs-Keywords haben. Diese können verwendet werden, um in einer großen Bildsammlung nach Bildern mit gewünschten Keywords zu suchen. Typische Keywords: Motiv, Ereignis, Standort, Personen oder Dinge usw. Keywords befinden sich innerhalb der Bild-Metadata. Keywords bestehen normalerweise aus einem Wort, es kann aber auch eine kurze Phrase mit eingebetteten Leerzeichen oder anderen Trennzeichen verwendet werden. Kommas und Semikolons werden als Trennzeichen zwischen Keywords verwendet und können daher nicht innerhalb eines Keywords verwendet werden (ein externer Standard). Ein zusammengesetztes Keyword wie "arizona scenery" ist erlaubt, aber Sie sollten stattdessen zwei Keywords verwenden, um mehr Flexibilität zu haben: Sie können nach Bildern suchen, die entweder das eine oder das andere Keyword oder beide Keywords haben. - Alle Bilder mit einem gewünschten Keyword oder gewünschten Keywords können schnell gefunden und in einem Galeriefenster angezeigt werden. Wenn Sie Ordner- und Dateinamen sinnvoll verwendet haben, können Sie auch anhand dieser Namen nach Bildern suchen. Sie können Bilder auch nach Datum, Bewertung, Standort und anderen Metadata-Tags durchsuchen. Diese müssen nicht in Keywords dupliziert werden. Siehe unten {BILDER SUCHEN}. - ^Verwaltetes Keyword-System Dies ist geeignet, wenn Sie Ihr Keyword-System planen möchten, bevor Sie Ihren Bildern Keywords hinzufügen. In diesem System erstellen Sie eine begrenzte Anzahl von Keyword-Kategorien (z. B. Personen, Orte, Dinge, Ereignisse, Kunst, Landschaft ...). Keywords können bei Bedarf erstellt und einer Kategorie zugewiesen werden, wenn Keywords Bildern zugewiesen werden. Ein Bild erhält ein Keyword durch Zeigen und Klicken auf die Liste der verfügbaren Keywords, die nach Kategorie und innerhalb der Kategorie alphabetisch geordnet ist. Wird ein neues Keyword benötigt, wird es bei der ersten Zuweisung zu einem Bild erstellt. Die Anzahl der Keywords innerhalb einer Kategorie sollte idealerweise unter etwa 200 liegen, damit das visuelle Auffinden in einer Auswahlliste angemessen schnell erfolgt. - ^Vorteile eines verwalteten Keyword-Systems • verhindert uneinheitliche Keyword-Namen (z. B. 'landscape' und 'scenery') • verhindert alternative Schreibweisen und Tippfehler (z. B. susan, susy, susna) • verhindert Keywords, die andere Keywords enthalten (z. B. scenery, lake) • die Suche ist zuverlässiger, da Keywords nicht die oben genannten Fehler aufweisen • bei der Zuweisung von Keywords haben Sie einen Überblick über verfügbare Keywords, statt Tausender chaotischer Keywords in einem unverwalteten System - Das Auswählen von Keywords aus einer großen Liste kann langsam sein. Dies wird auf 3 Arten abgemildert: • Bis zu etwa 10 zuletzt verwendete Keywords werden im Dialog zum Bearbeiten der Metadata angezeigt, wo sie leicht zu sehen und auszuwählen sind. Da eine Serie von Fotos, die zur gleichen Zeit aufgenommen wurden, wahrscheinlich viele Keywords gemeinsam hat, wird das Hinzufügen von Keywords einfacher und schneller gemacht. • Sie können einfach mit der Eingabe des gewünschten Keyword-Namens beginnen. Eine Popup-Liste passender Keywords erscheint, sobald nur noch wenige mögliche Übereinstimmungen vorhanden sind. Sie können dann auf das gewünschte Keyword klicken, um es dem Bild hinzuzufügen. Gibt es keine passenden Keywords, haben Sie die Möglichkeit, das neue Keyword zur Liste der definierten Keywords hinzuzufügen. • Sie können eine Kategorie wählen, um eine kleinere Auswahlliste anzuzeigen. - Wenn Keywords weit gefasst und in geringerer Anzahl definiert sind, werden die Suchergebnisse für Keywords umfangreicher, aber das visuelle Auffinden der gewünschten Bilder kann recht schnell erfolgen. Die physische Dateireihenfolge bleibt erhalten: Bilddateien, die zusammen in ihren Ordnern liegen, erscheinen auch zusammen in den Suchergebnissen. - Aus dem Internet heruntergeladene Bilder enthalten oft Keywords. Diese sind natürlich nicht organisiert und insgesamt chaotisch. Wenn Sie ein verwaltetes Keyword-System verwenden, ist es am besten, solche Bilder zu überprüfen und die Keywords an Ihr System anzupassen oder sie zu löschen. Alle vorhandenen neuen Keywords werden automatisch unter der Kategorie "nocatg" hinzugefügt. Wenn Sie unerwünschte Keywords in Ihrer Keyword-Liste bemerken, verwenden Sie {BILDER SUCHEN} nach Keyword, um die Bilder mit unerwünschten Keywords zu finden, damit sie korrigiert oder entfernt werden können. - ^Zufälliges Keyword-System Möglicherweise ziehen Sie es vor, Keywords nach Bedarf zu erfinden, ohne ein bestimmtes System im Sinn zu haben. Oder Sie haben bereits Tausende von Keywords, was eine Umstellung auf ein verwaltetes Keyword-System erschwert (aber nicht unmöglich macht: Fotocx kann Keyword-Namen massenhaft konvertieren). In diesem Fall können Sie einfach Keywords in Ihre Bilder eingeben und bei Bedarf neue Keywords erstellen. Es gibt weiterhin einige Möglichkeiten, Keywords organisiert zu halten: Vorhandene Keywords, die den eingegebenen Zeichen entsprechen, werden angezeigt, sobald nur noch wenige mögliche Übereinstimmungen vorhanden sind. Beispiel: Sie geben "new" ein, und eine Liste von Keywords wird angezeigt: New York, New Delhi, Newman ... Wenn eines davon Ihre Absicht ist, klicken Sie darauf, um das Keyword auszuwählen. Andernfalls tippen Sie weiter und drücken schließlich die Eingabetaste, um ein neues Keyword zu erstellen. Bei der Suche nach Bildern anhand von Keywords können Sie gewünschte Keyword-Namen eingeben oder sie aus der Liste der verfügbaren Keywords auswählen. Verfügbare Keywords, die den ersten paar eingegebenen Buchstaben entsprechen, werden angezeigt, und Sie können aus dieser Liste auswählen. Sie können kein Such-Keyword eingeben, das nicht irgendwo in Ihren Bildern vorkommt. Ein zufälliges Keyword-System führt wahrscheinlich zu Tausenden von Keywords. Dies ist möglicherweise nicht sehr nützlich. - - TOPIC: GEOTAGS OVERVIEW Moderne Kameras können den Standort jedes Fotos mithilfe eines internen GPS-Empfängers aufzeichnen. Latitude, longitude (und möglicherweise Stadt/Ort und Land) werden in den EXIF-Metadata der Bilddatei gespeichert. Die Funktion {HAUPTMETADATA BEARBEITEN} ermöglicht auch die Eingabe oder Änderung von Standortdaten. Standorte können auch durch Klicken auf eine zoombare Weltkarte festgelegt werden. Funktionen zum Auffinden von Bildern für einen bestimmten Standort oder eine Region: • {BILDER SUCHEN}: Suche nach Standortname (auch mehrere Namen, Teilübereinstimmungen). • {ORTE/DATEN}: Suche nach Land, Standort und Datumsgruppen • Bilder nach Kartenstandort: Klicken Sie auf eine Kartenmarkierung, um alle Bilder an diesem Markierungsstandort anzuzeigen. - Standortnamen (Stadt oder anderer Ortsname sowie Land) von der Kamera-GPS sind nicht standardisiert und können chaotisch sein (z. B. Munich, München, MONACO). Wie damit umzugehen ist, wird unten erläutert. - - TOPIC: HAUPTMETADATA BEARBEITEN +image: edit-meta.jpg - Die Funktion Haupt-Meta bearbeiten wird verwendet, um grundlegende Metadata zu einem Bild hinzuzufügen. Bitte lesen Sie {KEYWORDS-ÜBERSICHT} und {GEOTAGS OVERVIEW} (oben), bevor Sie Haupt-Meta bearbeiten verwenden. - Haupt-Meta bearbeiten dient zum Bearbeiten der am häufigsten verwendeten Metadata: Bilddatum und -uhrzeit, Bewertung, Titel, Beschreibung, Standortdaten und keywords. Der Dialog zeigt zunächst die Daten für das aktuelle Bild an. Drücken Sie nach dem Hinzufügen oder Ändern auf [Anwenden], um die Bilddatei zu aktualisieren. Für Metadata-Änderungen gibt es keine automatische Dateiversionierung, Sie können jedoch bei Bedarf Datei speichern > Neue Version verwenden. - Der Dialog zeigt die Metadata für das aktuelle Bild in der Dateiansicht oder für ein angeklicktes Thumbnail in der Galerieansicht an. Der Bearbeitungsdialog aktualisiert sich selbst, wenn ein neues Bild geöffnet oder ein neues Thumbnail angeklickt wird. - Das Datum des Bildes wird, falls verfügbar, als Bilddatum angezeigt. Dies kann eingegeben werden, falls es fehlt, oder geändert werden. Sie können ein vollständiges Datum im Format yyyy:mm:dd oder ein kürzeres Format yyyy oder yyyy:mm eingeben. Ein fehlender Monat/Tag entspricht logisch 01:01, wenn mit einer unteren Suchgrenze verglichen wird, oder 12:31, wenn mit einer oberen Grenze verglichen wird. Die Schaltfläche [Vorher] füllt das Datum aus den zuvor eingegebenen Daten aus. Dies soll die einfache Datierung einer Bilderserie ermöglichen. Falls die Uhrzeit wichtig ist, können Sie eine Uhrzeit im Format hh:mm[.ss] hinzufügen. Das vollständige Eingabeformat lautet: yyyy:mm:dd hh:mm:ss - Sie können einen Titel, eine Beschreibung und eine Bewertung (0-5 Sterne) für das Bild eingeben. Um den Titel oder die Beschreibung zu bearbeiten, drücken Sie die entsprechende Schaltfläche [bearbeiten]. Dadurch öffnet sich ein Texteditor mit einem großzügigen Limit für die Textlänge. Sie können die [enter]-Taste für einen bewussten Zeilenumbruch verwenden. In Fotocx funktionieren diese Zeilenumbrüche; in anderen Bildbetrachtern werden sie möglicherweise durch Punkte ersetzt. - Vorhandene Keywords werden unter Bild-Keywords angezeigt. Verfügbare Keywords werden im Fenster Definierte Keywords darunter angezeigt. Eines dieser Keywords kann durch Anklicken zum Bild hinzugefügt werden. Ein Keyword kann durch Anklicken in Bild-Keywords aus dem Bild gelöscht werden. Kürzlich hinzugefügte Keywords werden unter Zuletzt verwendete Keywords angezeigt. Dies erleichtert das Hinzufügen von Keywords zu einer neuen Bildergruppe, da viele derselben Keywords erneut verwendet werden. Zeigen und klicken Sie auf dieselbe Weise. - Ist die Liste der definierten Keywords lang, kann es einfacher sein, das gewünschte Keyword in Keyword eingeben einzugeben. Vorhandene Keywords, die dem bisher Eingegebenen entsprechen, erscheinen unter Passende Keywords, und Sie können auf eines davon klicken, um das Keyword zum Bild hinzuzufügen. Ist das eingegebene Keyword neu (es wird kein passendes Keyword angezeigt), drücken Sie [neues keyword hinzufügen], sobald das Keyword vollständig ist. Es wird dem Bild und der Liste der definierten Keywords mit der Kategorie "nocatg" hinzugefügt. - Wenn Sie Keyword-Kategorien verwenden, können Sie eine Kategorie auswählen, sodass nur diese Keywords in der Liste der definierten Keywords angezeigt werden. - Die Schaltfläche [Anwenden] schreibt die Daten in die Bilddatei und in die Metadata-Indexdatei, die zum Suchen von Bildern verwendet wird. - Die Schaltfläche [Vorher] (am unteren Rand des Dialogs) kann verwendet werden, um alle verfügbaren Daten aus dem zuvor angesehenen oder bearbeiteten Bild zu laden. Dies kann die Verarbeitung einer Gruppe von Bildern beschleunigen, die weitgehend dieselben Daten gemeinsam haben. - ^Geotags hinzufügen Es gibt mehrere Möglichkeiten, Standortnamen und Geokoordinaten im Dialog {HAUPTMETADATA BEARBEITEN} hinzuzufügen. - Kamera-GPS Ihr Kamera-GPS-Sensor hat möglicherweise Standortnamen und Geokoordinaten eingefügt. Die Sprache entspricht möglicherweise nicht der gewünschten, oder es werden durchgehend Großbuchstaben verwendet, oder es liegt sonstiges Durcheinander vor. Verwenden Sie die Schaltfläche [clear], um von vorn zu beginnen, und geben Sie den neuen Text ein. - Schaltfläche [Suchen] Sucht nach einem Standort, der irgendwo in Ihren Bilddateien oder in einer umfangreichen Liste bekannter Standorte (worldcities.txt) vorhanden ist. Geben Sie ein paar Anfangszeichen in Location ein und drücken Sie [Suchen]. Wird eine Auswahlliste passender Standorte angezeigt, wählen Sie einen aus. Wird nichts angezeigt, verwenden Sie [Karte], um auf einen Kartenstandort zu klicken. Überarbeiten Sie bei Bedarf die Standort- und Ländernamen. Dieser Standort ist nun bekannt und zur Auswahl verfügbar. - Schaltfläche [Vorherige] Wenn das bearbeitete Bild dieselben Standortdaten wie das zuvor bearbeitete Bild hat, drücken Sie [Vorherige], um die zuvor verwendeten Standortdaten einzufügen. - Sie können {SAMMEL-GEOTAGS} verwenden, um Standortdaten gleichzeitig zu vielen Bilddateien hinzuzufügen. - - TOPIC: BELIEBIGE METADATA BEARBEITEN +image: edit-any-metadata.png - Dies ist ein Dialog zum Bearbeiten beliebiger Metadata für die aktuelle Bilddatei. Die gebräuchlichsten Tags zum Bearbeiten sind links aufgelistet. Drücken Sie die Schaltfläche [Vollständige Liste], um eine Liste aller verfügbaren Tags für die aktuelle Bilddatei zu erhalten (es können Hunderte sein). Drücken Sie [Kurze Liste], um zur Liste der gebräuchlichen Tags zurückzukehren. Klicken Sie auf einen Tag in der Liste, um den aktuellen Tag-Wert abzurufen. Ändern Sie den Wert bei Bedarf und drücken Sie [aktualisieren]. Um einen nicht in der Liste enthaltenen Tag-Namen zu bearbeiten, geben Sie den Tag-Namen ein und drücken Sie [abrufen], um den aktuellen Wert, falls vorhanden, abzurufen. Geben Sie dann den Wert ein oder ändern Sie ihn und drücken Sie [aktualisieren]. Um einen Tag zu löschen, drücken Sie [löschen]. Sie können den Tag-Namen in Kleinbuchstaben und mit oder ohne Leerzeichen eingeben, z. B. funktionieren sowohl "Subject Distance" als auch "subjectdistance". Einige Tags können nicht geändert werden, z. B. ist 'image width' die Bildpixelbreite, die nur durch Ändern der Bildpixelbreite geändert werden kann. Die Quelle für die Kurzliste ist die Textdatei /meta_picklist. Sie können Tags aus dieser Liste hinzufügen oder entfernen. - - TOPIC: METADATA LÖSCHEN Geben Sie den zu löschenden Tag-Namen an, oder wählen Sie Alle. Die Metadata werden gelöscht. Verwenden Sie Alle, um ein Bild von möglicherweise vorhandenen identifizierenden Informationen zu bereinigen. Einige Tags können nicht gelöscht werden, z. B. File Name. - - TOPIC: METADATA KOPIEREN Mit Fotocx erstellte kombinierte Bilder (HDR, Panorama, Mashup ...) enthalten standardmäßig keine Metadata. Verwenden Sie diese Funktion, um Metadata aus einem der Eingabebilder oder einem beliebigen anderen Bild zu kopieren. Verwenden Sie die Schaltflächen [Durchsuchen], um eine Datei als Quelle der Metadata und eine Datei zum Empfangen der Metadata ("Zieldatei" im Dialog) auszuwählen. - - TOPIC: METADATA REPARIEREN Verwenden Sie diese Funktion, wenn eine Bilddatei beim Versuch, die Metadata zu bearbeiten, eine Fehlermeldung erzeugt. Dabei werden fehlerhafte Metadata gelöscht und der Rest beibehalten. - - TOPIC: KEYWORDS VERWALTEN +image: manage-keywords.png - Erstellen Sie Keywords und gruppieren Sie sie optional in Kategorien. Sie können Keywords Kategorien zuweisen, um sie zu organisieren und beim Hinzufügen von Keywords zu Bildern schneller aufzufinden. Sie sind optional und spielen bei der Keyword-Suche keine Rolle: Im Bild wird nur das Keyword gespeichert, nicht seine Kategorie. Typische Kategorien sind Personen, Orte, Dinge, Ereignisse, Landschaft, Gebäude, Kunst usw. Um ein neues Keyword mit einer neuen Kategorie hinzuzufügen, geben Sie die Kategorie und das Keyword ein und klicken Sie dann auf [create]. Ist die Kategorie leer, wird das Keyword "nocatg" zugewiesen. Um ein Keyword einer anderen Kategorie zuzuweisen, klicken Sie auf eine Kategorie (fett dargestellter Text) oder geben Sie eine neue ein, klicken Sie auf das Keyword und drücken Sie [create]. Das Keyword wird von der alten in die neue Kategorie verschoben. Um ein Keyword zu löschen, klicken Sie auf das Keyword und drücken Sie [löschen]. Keywords, die in Bildern verwendet, aber keiner Kategorie zugewiesen sind, erscheinen unter "nocatg". Eine Kategorie ohne zugewiesene Keywords kann gelöscht werden - klicken Sie auf die Kategorie, löschen Sie den Keyword-Namen, falls vorhanden, und drücken Sie [löschen]. - Hinweis: Ein neu erstelltes Keyword wird an das Ende der Keyword-Liste seiner Kategorie angehängt. Beim nächsten Start von Fotocx werden alle Kategorien und ihre Keyword-Listen alphabetisch sortiert, außer dass "nocatg" immer an letzter Stelle steht. - - TOPIC: BESCHRIFTUNGEN +image: choose-captions.png - ^Menü Beschriftungen wählen Wählen Sie, welche Metadata-Tags für Textbeschriftungen verwendet werden sollen, die in der oberen linken Ecke des Bildes im Dateiansicht-Modus angezeigt werden. - ^Menü Beschriftungen umschalten Schaltet die Anzeige von Beschriftungen EIN oder AUS. Weisen Sie ein Tastenkürzel zu, um die Beschriftungsanzeige schnell zu aktivieren oder zu deaktivieren. - ^Hinweis:^ Wenn Sie die Maus in die obere linke Ecke eines Bildes in der Dateiansicht bewegen, werden Titel und Beschreibung in einem Popup-Bild angezeigt. Das Bild verschwindet, wenn die Maus wegbewegt wird. - - TOPIC: ORTE/DATEN +image: image-locations.jpg - Dies ist eine schnelle Möglichkeit, alle Fotos zu finden, die an einem bestimmten Standort oder in einem Standort- und Datumsbereich aufgenommen wurden. Wählen Sie im Dialog zwischen den beiden Optionen: alle Bilder in den Bericht einbeziehen, oder nur Bilder einbeziehen, die von der vorherigen Suchfunktion gefunden wurden. Wählen Sie dann die gewünschte Gruppierungsebene: Land Land und Standort Land und Datum Land und Standort und Datum Datum und Land Datum und Land und Standort - Wenn Datum einbezogen ist, wählen Sie einen Tagesbereich zur Zusammenfassung: Fotos mit Daten innerhalb dieses Bereichs werden unter dem ersten Datum gruppiert. Drücken Sie [proceed], um einen Bericht zu erhalten, der die Anzahl der Bilder in jeder Gruppe zeigt: nach Land, Land und Standort usw. Dies ist auch die Sortierreihenfolge. Im obigen Beispiel stammen 28 Fotos aus Neuseeland vom 02.11.2004. Klicken Sie auf eine Zeile im Bericht, um eine Thumbnail-Galerie dieser Bilder zu erhalten. - - TOPIC: ZEITLEISTE +image: timeline-report.jpg - Dieser Bericht erstellt eine Zeitleiste der Bildanzahl nach Monat. Wählen Sie zwischen den beiden Optionen: alle Bilder in den Bericht einbeziehen, oder nur Bilder einbeziehen, die von der vorherigen Suchfunktion gefunden wurden. Klicken Sie im resultierenden Bericht auf ein Jahr und einen Monat, um eine Thumbnail-Galerie aller Bilder mit einem Fotodatum (EXIF) im ausgewählten Monat zu erhalten. Das obige Beispiel zeigt 208 Bilder für Okt. 2017. Das Jahr 'null' steht für Bilder ohne Fotodatum. - - TOPIC: METADATA-TAGS Diese Funktion findet alle Bilddateien, die einen angegebenen Metadata-Tag und -Wert verwenden. Wählen Sie einen Tag aus der Popup-Liste: rating, keywords, title, description, camera, zusätzliche indizierte Metadata - siehe {DATEIEN INDIZIEREN}. Es wird eine Liste der verfügbaren Tag-Werte zusammen mit der Anzahl der Bilddateien angezeigt, die diesen Tag-Wert verwenden. Bei 'title' und 'description' werden nur die ersten 60 Zeichen angezeigt, und es werden alle Dateien gemeldet, die Tag-Werte verwenden, die diesen ersten 60 Zeichen entsprechen. Bei 'camera' ist der Übereinstimmungswert eine Kombination aus Hersteller, Modell und Objektiv. - - TOPIC: AUTOSUCHE Diese Funktion kann von Shell-Skriptdateien verwendet werden, um Bilddateien zu extrahieren, die eines der bei der Verwendung der Funktion Bilder suchen verfügbaren Auswahlkriterien erfüllen (siehe unten). Verwenden Sie zunächst die Funktion Bilder suchen, um die gewünschten Auswahlkriterien festzulegen (z. B. Ordner-/Dateinamen, Daten, Keywords oder andere Metadata). Verwenden Sie die Schaltfläche [speichern], um die Kriterien in einer Einstellungsdatei zu speichern. Verwenden Sie den folgenden Befehl, um Fotocx zu starten und die Suche durchzuführen: $ fotocx -m autosearch . Die Ausgabe erfolgt in /search_results. - - TOPIC: BILDER SUCHEN Verwenden Sie die Funktion Bilder suchen, um Bilder mit beliebigen gewünschten Metadata zu finden (Datum, Keywords, Standort ...). Zur Suche wird eine Metadata-Indexdatei verwendet, wodurch Tausende von Bildern pro Sekunde durchsucht werden können. - Es gibt zwei Berichtsformate: eine Galerie von Thumbnails, die alle Bilder zeigt, die den Suchkriterien entsprechen, oder einen Metadata-Bericht, der Thumbnails mit Metadata-Text kombiniert. Hier ist ein Beispiel für das Metadata-Berichtsformat: +image: search-images-metadata.jpg - ^Suchdialog +image: search-images.jpg - Wählen Sie im Dialog, welche Bilder durchsucht werden sollen: entweder alle (alle Bilder) oder die aktuelle Menge, d. h. die Bilder in der aktuellen Galerie, bei der es sich um einen Ordner, ein Album oder die Ergebnisse einer vorherigen Bildsuche handeln kann. - Wählen Sie anschließend, was mit den gefundenen passenden Bildern geschehen soll: 'new set' bedeutet, die aktuelle Menge durch die gefundenen Bilder zu ersetzen, 'add' bedeutet, sie zur aktuellen Menge (Galerie) hinzuzufügen, und 'remove' bedeutet, sie aus der aktuellen Menge zu entfernen. Um Bilder zu entfernen, müssen Sie die aktuelle Menge durchsuchen. - Für Dateien, die den Auswahlkriterien entsprechen, können Sie zusätzlich festlegen, welche Versionen ausgewählt werden: original, letzte Version oder alle Versionen. 'original' bedeutet das Original oder unveränderte Bild (oder die erste Version, falls das Original nicht gespeichert wurde). 'letzte Version' bedeutet die neueste oder zuletzt bearbeitete verfügbare Version. 'alle Versionen' bedeutet, dass das Original und alle Versionen abgerufen werden. - Wählen Sie den gewünschten Berichtstyp. Der Galeriebericht ist eine Seite mit Thumbnail-Bildern, so lang wie nötig, um alle Bilder aufzunehmen, die den Suchkriterien entsprechen. Der Metadata-Bericht enthält sowohl Thumbnail-Bilder als auch eine Liste von Metadata-Tags neben jedem Thumbnail. Dazu gehören die Standard-Tags (date, rating, keywords, geotags, title, description) sowie alle anderen Metadata-Tags, die Sie in der Tag-Auswahlliste hinzugefügt haben (siehe unten). - Geben Sie Ihre Suchkriterien ein. Wählen Sie gewünschte Keywords, Daten, Sternebewertungen, in Text enthaltene Wörter (Bildtitel oder -beschreibung), Datei- oder Ordnernamen sowie Standortnamen. Weitere Details finden Sie unten. - Verfügbare Keywords werden unter Definierte Keywords angezeigt und können durch Zeigen und Klicken ausgewählt werden. Ist die Liste der definierten Keywords lang, kann es einfacher sein, mit der Eingabe eines Keywords in 'enter keyword' zu beginnen. Vorhandene Keywords, die dem bisher Eingegebenen entsprechen, erscheinen in der Liste 'matches', und Sie können auf eines davon klicken, um das Keyword zur Suchliste hinzuzufügen. - Wenn Sie Keyword-Kategorien verwenden, können Sie eine Kategorie auswählen, sodass nur diese Keywords in der Liste der definierten Keywords angezeigt werden. - Ein Datumsbereich kann eingegeben werden, um die Suche auf Bilder innerhalb dieses Bereichs zu beschränken. Wählen Sie Fotodatum (von der Kamera) oder Dateidatum (Erstellungs- oder letztes Änderungsdatum). Das Format ist yyyy:mm:dd. Es werden Bilder ausgewählt, deren Datum am oder nach dem ersten Datum liegt, falls angegeben, und am oder vor dem zweiten Datum, falls angegeben. Fehlender Monat/Tag wird standardmäßig auf 01/01 für die untere Datumsgrenze und auf 12/31 für die obere Grenze gesetzt. Uhrzeiten können optional im Format yyyy:mm:dd hh:mm angegeben werden. Fehlende Uhrzeiten werden standardmäßig auf 00:00 und 23:59 gesetzt. - Um nach Bildern ohne EXIF-Fotodatum zu suchen (z. B. gescannte Bilder), verwenden Sie "null" in der ersten Datumseingabe. - Ein Paar von Sternebewertungen kann eingegeben werden, um die Ergebnisse auf Bilder mit einer Bewertung innerhalb des angegebenen Bereichs zu beschränken. Ein fehlender unterer Wert bedeutet 0 Sterne, und ein fehlender oberer Wert bedeutet die höchste Bewertung, 5 Sterne. - Ordner- und Dateinamen können durchsucht werden. Geben Sie im Feld search file names eine beliebige Anzahl von Namen ein, die für Ihre Bildordner und Dateinamen verwendet werden, durch Kommas getrennt. Eine Eingabe von "egypt cairo" würde alle Bildordner- oder Dateinamen finden, die eine dieser Zeichenfolgen enthalten. Auch Teilzeichenfolgen werden gefunden. Groß-/Kleinschreibung spielt keine Rolle. - Bildtitel und -beschreibung können durchsucht werden. Geben Sie die zu suchenden Wörter im Feld search title/desc ein, durch Kommas getrennt. Diese werden mit jedem Wort im Titel und in der Beschreibung aller Bilder abgeglichen, und passende Bilder werden ausgewählt. Groß-/Kleinschreibung spielt keine Rolle. - Um nach Standorten zu suchen, geben Sie einen oder mehrere Stadt-/Standort- oder Ländernamen im Feld search locations ein, durch Kommas getrennt. Es werden nur Bilddateien ausgewählt, deren geotags mit einem der eingegebenen Standorte übereinstimmen. Ein Standort kann eine Stadt, ein Park oder ein anderer geografischer Name sein (was auch immer in den metadata-Feldern 'City' und 'Country' gespeichert ist). Groß-/Kleinschreibung spielt keine Rolle. - Die Optionsfelder 'all' und 'any' gelten für keywords, Text, Dateinamen und Standorte. Sie können Bilder auswählen, die ALLE eingegebenen Zeichenfolgen enthalten, oder JEDE der eingegebenen Zeichenfolgen. Beispiel: Wenn das Standort-Suchfeld "new york" lautet und "any" ausgewählt ist, würden Bilder aus New Zealand und York, England einbezogen. Ist "all" ausgewählt, würden nur Bilder aus New York einbezogen. - Wenn Sie Bilder mit fehlenden Daten finden möchten, können Sie "null" als Übereinstimmungswert eingeben. - ^Zusätzliche Metadata durchsuchen Mit den Dialogeingaben 'tagname', 'condition' und 'match values' können Sie zusätzliche Metadata-Tags als Auswahlkriterien angeben, oder sie zur Berichtsausgabe hinzufügen, wenn der Berichtstyp "metadata" gewählt wird. Die für eine bestimmte Bilddatei verfügbaren Tags können mit {ALLE METADATA ANSEHEN} angezeigt werden. Diese umfassen viele Tags, die im Hauptdialog nicht vorhanden sind. Die Auswahlliste stammt aus der Textdatei /meta_picklist. Sie können dieser Datei bei Bedarf Tags hinzufügen. Sie können auch Tags verwenden, die auch im Hauptdialog vorhanden sind. Der Vorteil hierbei ist, dass eine flexiblere Abgleichlogik verwendet werden kann. - Die Abgleichlogik kann für jeden Metadata-Tag ausgewählt werden. ^Abgleichmethode Übereinstimmungswert für die Auswahl • report beliebiger Wert, auch fehlend • reportx Wert nicht fehlend • matches kommagetrennte Textwerte • contains dasselbe, mit Teilzeichenfolgen-Abgleich • number = gleiche Werte • number => gleiche oder größere Werte • number <= gleiche oder kleinere Werte - Die Schaltflächen [X] auf der rechten Seite können verwendet werden, um einzelne Metadata-Suchtags zu löschen. - ^Dialog-Schaltflächen [Laden] und [Speichern] können verwendet werden, um Suchkriterien aus einer Datei zu laden oder darin zu speichern. [Leeren] löscht alle Daten im Dialog. [Fortfahren] startet den Suchvorgang. - Drücken Sie die Schaltfläche [proceed], um die Suche durchzuführen. Die Ausgabe ist eine Standardgalerie mit Thumbnails oder das oben gezeigte Metadata-Berichtsformat. Sie können die gefundenen Bilder als dauerhaftes Album speichern - siehe {ALBEN}. - ^Leistung Die Suche und der Bericht indizierter Metadata erfolgen nahezu augenblicklich. Die Geschwindigkeit für nicht indizierte Metadata hängt von der Computer- und Festplattengeschwindigkeit ab. Ein leistungsstarker Computer mit SSD kann über 100.000 Dateien pro Minute durchsuchen. - ^search_results^ (Album) Die Ausgabe von Bilder suchen wird im Album "search_results" gespeichert. Benennen Sie dieses Album um, wenn eine spätere Suche es nicht ersetzen soll. - Einschränkung: Die Suchfunktion ist auf 40.000 Ergebnisse begrenzt (gefundene Bilder, die die Suchkriterien erfüllen). Wird dieses Limit überschritten, werden Sie benachrichtigt, und die Suche wird abgeschnitten. Dieses Limit besteht, weil die Größe eines gescrollten Fensters in GTK begrenzt ist und der Versuch, ein größeres Fenster zu erstellen, zu einem Absturz oder Einfrieren führen kann. - - TOPIC: AUSWAHL-MENÜ - - TOPIC: BEREICHSÜBERSICHT Bearbeitungsfunktionen wirken normalerweise auf das gesamte Bild, es ist jedoch möglich, einen Teil eines Bildes (einen "Bereich") zu bearbeiten und den Rest unverändert zu lassen. Wurde ein Bildbereich ausgewählt, wirken die meisten Bearbeitungsfunktionen nur innerhalb dieses Bereichs. Einige Funktionen (z. B. Größe ändern) ignorieren einen ausgewählten Bereich. Ein Bereich kann vor dem Start einer Bearbeitungsfunktion oder während der Verwendung einer Bearbeitungsfunktion ausgewählt werden. Der ausgewählte Bereich wird sofort aktiv, vorherige Bearbeitungen bleiben erhalten, und künftige Bearbeitungen wirken nur innerhalb des Bereichs. Wird eine weitere Bearbeitung gestartet, bleibt der ausgewählte Bereich aktiv, sodass eine Reihe von Bearbeitungen innerhalb eines Bereichs durchgeführt werden kann. Ein Bereich kann auch aus mehreren nicht verbundenen Bereichen im Bild bestehen. - Fotocx verwendet 'Bereiche' anstelle von 'Ebenen'. Statt etwas im Bild auszuwählen, aus der Auswahl eine separate Ebene zu erstellen, die Ebene zu bearbeiten und die Ebene schließlich zusammenzuführen, wählen Sie etwas im Bild aus, führen Bearbeitungsfunktionen auf der Auswahl aus und sehen das Endergebnis sofort. Bereiche können außerdem gespeichert, in ein anderes Bild eingefügt, verschoben und in der Größe geändert sowie weiter bearbeitet werden. - +image: edit-selection.jpg - Das Bearbeiten eines ausgewählten Bereichs kann manchmal zu sichtbaren Grenzen an den Rändern des Bereichs führen (manchmal entsprechen diese Merkmalskanten im Bild und sind daher kein Problem). Sie können Ränder mit {BEREICH ÜBERBLENDEN} überblenden: Bearbeitungen können vom Bereichsrand nach innen schrittweise angewendet werden, und Sie können auswählen, welche Ränder überblendet werden. - - TOPIC: BEREICH AUSWÄHLEN +image: select-area.jpg - Der Dialog Bereich auswählen wird über das Menü Auswahl > Bereich auswählen gestartet. Wählen Sie eine der unten erläuterten Methoden. Jede Methode wählt Bildbereiche auf unterschiedliche Weise aus. Sie können die Methode jederzeit wechseln, und die ausgewählten Bereiche werden akkumuliert. Ein Umriss der ausgewählten Bildbereiche wird angezeigt, während Sie Bereiche zur Auswahl hinzufügen oder daraus entfernen. Die Schaltfläche [Fertigstellen] wird verwendet, um die Bildpixel innerhalb der Bereichsumrisse zu erfassen und für die anschließende Anwendung von Bearbeitungsfunktionen vorzubereiten. Die Schaltfläche [Ausblenden] blendet den Bereichsumriss aus, damit Sie Bearbeitungen und mögliche Randeffekte besser sehen können. Verwenden Sie die Schaltfläche [Anzeigen], um den Bereichsumriss anzuzeigen. Die Schaltfläche [Leeren] entfernt alle Bereichsauswahlen. Der Dialog Bereich auswählen kann abgebrochen und später erneut gestartet werden, um vorhandene Bereiche zu ändern oder neue hinzuzufügen. - ^Methoden Die folgenden Methoden werden verwendet, um einen oder mehrere Bildräume zu umschließen, die zum endgültigen Bereich gehören. Diese Methoden können in beliebiger Reihenfolge verwendet werden, um Räume zu definieren, die entweder verbunden oder getrennt sind. • Rechteck - ziehen, um einen rechteckigen Bereich zu umranden • Ellipse - ziehen, um einen kreisförmigen oder elliptischen Bereich zu umranden • Freihandzeichnen - einen Bereich durch Zeichnen mit der Maus umranden • Kante folgen - Umriss durch Verfolgen von Bildmerkmalskanten • Bereich um Maus auswählen - ziehen, um Pixel innerhalb eines Kreises um den Mauszeiger auszuwählen. • Eine Farbe um Maus auswählen - nur Pixel auswählen, die einer bestimmten Farbe entsprechen, 0-100% Übereinstimmung. • Alle Farben um Maus auswählen - alle Pixel innerhalb der Maus auswählen, die Auswahl auf angrenzende Bereiche mit Farben ausdehnen, die den Farben innerhalb der Maus entsprechen (manchmal 'flood' genannt). - Die folgenden Absätze erläutern die Details jeder Methode. - ^Rechteck Ziehen Sie die Maus von einer Ecke zur gegenüberliegenden Ecke eines rechteckigen Bereichs, um ihn auszuwählen. Ein Rechteck wird gezeichnet, um den Bereich zu umschließen. Klicken Sie mit der rechten Maustaste, um zu löschen und von vorn zu beginnen. Wiederholen Sie den Vorgang, um weitere rechteckige Bereiche auszuwählen. - ^Ellipse Dies funktioniert genauso wie die Rechteckauswahl, außer dass der umschlossene Bereich ein Kreis oder eine Ellipse ist. Die Startposition des Ziehvorgangs ist der Mittelpunkt der resultierenden Ellipse. Der Winkel des Ziehvorgangs bestimmt die Form der Ellipse. - ^Freihandzeichnen Ziehen Sie die Maus (linke Taste gedrückt), um eine Freihandlinie zu zeichnen, oder klicken Sie mit der linken Taste, um eine gerade Linie vom zuletzt gezeichneten Punkt zum angeklickten Punkt zu verbinden. Fahren Sie um den Zielbereich fort, bis er von verbundenen Kurven und Linien umschlossen ist. Klicken Sie mit der rechten Maustaste, um vorherige Linien zu entfernen (Fehler). Ein Rechtsklick entfernt die zuletzt angeklickte oder gezogene Linie, bis zu 50 Pixel. Klicken Sie wiederholt mit der rechten Maustaste, um mehr zu entfernen. Eine neu angeklickte Linie verbindet sich immer mit dem Ende der vorherigen Linie. Eine neu gezogene Linie verbindet sich mit der vorherigen Linie, wenn sie in der Nähe des Endes dieser Linie beginnt. Beginnt sie an einer anderen Stelle, wird eine unverbundene Linie gezeichnet. Sie können einen neuen Ziehvorgang von weit entfernt starten und zurückzeichnen, um die vorherige Linie zu treffen. Verbindet sich eine angeklickte Linie mit einem unerwünschten Punkt (d. h. Sie möchten sie nicht mit der zuletzt gezeichneten Linie verbinden), klicken Sie mit der rechten Maustaste, um sie zu löschen, und verwenden Sie dann Ziehen, um eine neue Liniensequenz zu beginnen. Ein Ziehvorgang mit der rechten Taste kann verwendet werden, um Liniensegmente zu löschen: Ziehen Sie mit der rechten Taste eng entlang einer Linie, um sie zu löschen, und ziehen Sie dann mit der linken Taste, um die Linie neu zu zeichnen. Am Ende muss ein Bereich vollständig umschlossen sein, ohne Lücken. Linien, die sich an den Enden leicht überlappen, sind OK. Lücken können schwer zu finden und zu korrigieren sein, arbeiten Sie daher bei 100% Bildgröße oder größer und seien Sie vorsichtig. Eine Reihe von Linien, die automatisch durch Linksklicks verbunden werden, hinterlässt keine Lücken, aber Abweichungen von dieser Abfolge erzeugen wahrscheinlich Lücken. Um die Möglichkeit von Lücken zu verringern, verwenden Sie beim manuellen Verbinden von Linien bewusste Überlappungen. Es gibt ein unten beschriebenes Lückenerkennungs-Werkzeug - {BEREICHSLÜCKE FINDEN}. Wenn ein Bereichsrand auch ein Bildrand ist, müssen Sie diesen Teil des Bereichs nicht zeichnen. Zeichnen Sie die Linie über den Bildrand hinaus und wieder zurück auf das Bild an einer anderen Position entlang des Bildrands. - ^Kante folgen Kontrastreiche Pixel (wahrscheinlich Bildmerkmalskanten) zwischen dem zuletzt gezeichneten Punkt und einer neu angeklickten Position werden gefunden und verbunden. Dies ist effektiv für klare Kanten, die nicht zu unregelmäßig sind. Unscharfe und zerklüftete Kanten funktionieren möglicherweise nicht gut, und Freihandzeichnen ist erforderlich, wenn hohe Präzision nötig ist. Die Regeln zum Verbinden von Linien sind dieselben wie oben erläutert. Das Ziehen der Maus statt des Klickens funktioniert wie Freihandzeichnen, jedoch mit der Tendenz, Merkmalskanten aus einer Position etwas hinter der Maus zu folgen. Bei sehr unregelmäßigen Kanten (Haare, Laub) siehe 'deselect color' unten. - ^Mausradius und Farbübereinstimmungsgrad Diese beiden Steuerelemente gelten nur für die unten beschriebenen 'select within mouse'-Methoden. Mausradius legt die Größe eines Kreises um den Mauszeiger fest. Pixel innerhalb des Kreises werden ausgewählt, oder sie liefern eine Reihe von Farben zum Abgleichen und Auswählen von Pixeln vom Mauskreis nach außen. Übereinstimmungsgrad legt einen erforderlichen Übereinstimmungsgrad (0-100%) zur Auswahl von Pixeln anhand ihrer Farbe und Helligkeit fest. '0' bedeutet, dass alles übereinstimmt, und '100' bedeutet, dass eine perfekte Übereinstimmung erforderlich ist. - ^Bereich um Maus auswählen Linksklick oder Ziehen wählt die vom Mauskreis umschlossenen Pixel aus. Ein Rechtsklick hebt die letzte Auswahl auf (wiederholen, um mehr aufzuheben). Ein Ziehen mit der rechten Taste hebt die Auswahl der umschlossenen Pixel auf. - ^Eine Farbe um Maus auswählen Klicken Sie auf das Bild, um eine Farbe auszuwählen. Die Farbe wird auf der Farbschaltfläche angezeigt. Sie können die Schaltfläche auch verwenden, um eine Farbe direkt festzulegen. Ziehen Sie mit der linken/rechten Taste, um Pixel innerhalb des Mauskreises auszuwählen/abzuwählen, die der ausgewählten Farbe innerhalb des Übereinstimmungsgrads entsprechen. Passen Sie den Übereinstimmungsgrad nach unten oder oben an, um einen größeren oder kleineren Farbbereich abzugleichen. Klicken Sie bei Bedarf auf das Bild, um die abzugleichende Farbe zu ändern. - ^Optionale Abwahlfarbe Dies gilt nur für 'select one color' oben. Klicken Sie mit der linken Maustaste auf das Bild, um eine Abwahlfarbe festzulegen. Ist das Kästchen aktiviert, ist die Abwahlfarbe aktiv. Stimmt ein Pixel besser mit der Abwahlfarbe als mit der Auswahlfarbe überein, wird das Pixel abgewählt. Beim Auswählen entlang einer Merkmalskante mit geringem Farbkontrast im Vergleich zu einem angrenzenden Bereich, der unausgewählt bleiben soll, legen Sie die Abwahlfarbe aus dem angrenzenden Bereich fest. Dies ist hilfreich für die genaue Auswahl einer komplexen Kante, wie Haare oder Laub. - ^Alle Farben um Maus auswählen Dies wird in einigen Bildbearbeitungsprogrammen 'flood' genannt. Ziehen Sie mit der linken/rechten Taste, um Pixel innerhalb des Mauskreises auszuwählen/abzuwählen. Pixel außerhalb des Mauskreises werden ebenfalls einbezogen, wenn sie diese beiden Bedingungen erfüllen: 1) ihre Farbe stimmt innerhalb des aktuellen Übereinstimmungsgrads mit einer beliebigen Farbe innerhalb des Mauskreises überein. 2) sie liegen innerhalb der Suchreichweite des Mauszeigers. Dies ist ein Faktor des Mausradius, z. B. wenn der Mausradius 20 und die Suchreichweite 3 beträgt, dann beträgt die Suchreichweite 60 Pixel vom Mauszeiger. Ziehen Sie die Maus über neue Bereiche, die Sie einbeziehen möchten. Beobachten Sie, wie sich der ausgewählte Bereich in Bereiche mit Farben ausdehnt, die denen innerhalb des Mauskreises entsprechen. Gehen Sie zu weit, klicken Sie mit der rechten Maustaste, um die letzte Auswahl zu entfernen. Wiederholen Sie dies bei Bedarf, um weitere vorherige Auswahlen zu entfernen. Verringern Sie den Radius oder erhöhen Sie den Übereinstimmungsgrad, um eine feinere Kontrolle zu erhalten - die Auswahl dehnt sich langsamer aus und bleibt näher am Mauskreis. Ein kleiner Radius und ein hoher Übereinstimmungsgrad können verwendet werden, um einer Bildmerkmalskante zu folgen und Pixel bis zur Kante mit guter Präzision auszuwählen. Nach Abschluss der Kantenarbeit verwenden Sie die Methode Bereich um Maus auswählen, um den Rest auszuwählen. Ziehen mit der rechten Taste wirkt als Abwahl: Pixel innerhalb des Mauskreises und passende Pixel innerhalb der Suchreichweite werden abgewählt. Geht eine Auswahl zu weit, ist es oft einfacher, dies durch Abwählen von außerhalb des ausgewählten Bereichs statt durch Auswählen von innen zu korrigieren. Möglicherweise benötigen Sie etwas Übung, um ein Gefühl dafür zu bekommen und effizient arbeiten zu können. - ^Alle Farben um Maus auswählen - Zusammenfassung • Ziehen mit linker Taste - Pixel in der Maus und passende Pixel in Reichweite auswählen • Rechtsklick - vorherige Auswahl rückgängig machen, wiederholen, um mehr abzuwählen • Ziehen mit rechter Taste - Pixel in der Maus und passende Pixel in Reichweite abwählen - ^Randverschiebung Ein fertiggestellter Bereich (siehe unten) kann in 1-Pixel-Schritten erweitert oder verkleinert werden. Dies kann hilfreich sein, um Randeffekte zu verringern, wenn ein durch Farbabgleich ausgewählter Bereich so bearbeitet wird, dass sich seine Helligkeit ändert. Die Auswahl nach Farbe kann entlang einer Kante, an der die Merkmalsfarbe in den Hintergrund übergeht, ein schmales Band unter- oder überausgewählter Pixel hinterlassen. Das Erweitern oder Verkleinern des Bereichs um 1-2 Pixel kann eine sauberer aussehende Kante erzeugen. Der Bereich bleibt nach der Randverschiebung fertiggestellt (siehe unten). - ^Farbe des Bereichsumrisses Die für den Mausauswahlkreis und den Bereichsumriss verwendete Farbe kann jederzeit durch Klicken auf eine der Farbschaltflächen geändert werden. Dies ermöglicht eine gute Sichtbarkeit vor verschiedenen Bildfarben. - ^Anzeigen/Ausblenden Verwenden Sie [Ausblenden], um die Bereichsumrisse auszublenden. Dies ist nützlich, um die Auswirkungen der Bereichsbearbeitungen besser zu sehen, ohne dass der Bereichsumriss stört. Verwenden Sie [Anzeigen], um die Umrisse anzuzeigen und die Bearbeitung des Bereichs fortzusetzen. - ^Fertigstellen +image: select-area-finish.png - Ein Bereich ist für Bearbeitungen erst wirksam, wenn er erfolgreich fertiggestellt wurde. Fertigstellen validiert gezeichnete Umrisse und färbt die umschlossenen Pixel zur visuellen Überprüfung ein. Wenn Sie mit dem Umranden von Bereichen fertig sind, verwenden Sie die Schaltfläche [Fertigstellen], um den Vorgang abzuschließen. Der oben gezeigte Popup-Dialog fasst zwei Methoden zusammen, die Sie zum Fertigstellen verwenden können. - Methode 1: Klicken Sie mit der linken Maustaste innerhalb von Bereichen, die von Hand umrandet wurden. Die umschlossenen Bereiche werden vorübergehend eingefärbt, damit Sie überprüfen können, ob das Endergebnis Ihrer Absicht entspricht. Jeder umschlossene Bereich kann ausgewählt werden, auch solche, die nicht ausdrücklich umrandet wurden: Bei einem Donut mit einem Loch können Sie den Donut, das Loch oder beides auswählen. Drücken Sie [keep], wenn alle Bereiche angeklickt und korrekt eingefärbt wurden. Hat der Umriss eines handgezeichneten Bereichs eine Lücke, "läuft" der Einfärbungsvorgang aus, und Bereiche außerhalb der Umschließung werden eingefärbt. Drücken Sie in diesem Fall im Fertigstellen-Dialog auf [Rückgängig], wodurch der ursprüngliche Bereichsumriss wiederhergestellt wird. Finden Sie die Lücke im Umriss und schließen Sie sie, versuchen Sie dann erneut [Fertigstellen]. Eine 1-Pixel-Lücke in einem großen Bereich kann schwer zu finden sein. Zoomen Sie hinein, um besser zu sehen. Siehe die Funktion {BEREICHSLÜCKE FINDEN} unten für eine schnelle Methode, um winzige Lücken zu finden. - Methode 2: Klicken Sie mit der rechten Maustaste irgendwo außerhalb aller umschlossenen Bereiche. Alle umschlossenen Bereiche werden zur visuellen Überprüfung eingefärbt. Gibt es eine Lücke, sind das Ergebnis und die Korrektur dieselben wie in Methode 1 beschrieben. Diese Methode ist sinnvoll, wenn Sie viele von Hand umrandete Bereiche haben und diese nicht einzeln mit Methode 1 überprüfen möchten. - Mit den 'select within mouse'-Methoden ausgewählte Bereiche werden automatisch fertiggestellt. Diese Bereiche werden während des Auswahlvorgangs erfasst, während Bereiche, die mit Rechteck, Ellipse oder einer der Linienzeichenmethoden ausgewählt wurden, erst erfasst werden, wenn Sie hineinklicken. Wenn Sie ausschließlich die 'select in mouse'-Methoden verwenden, können Sie [keep] drücken, ohne auf einen der ausgewählten Bereiche zu klicken. - Wenn Sie eine Linie von einer Bildseite zur anderen zeichnen, können Sie auf eine der beiden Seiten der Linie klicken, um einen Bereich aus allen Pixeln auf dieser Seite der Linie zu erstellen. Beispiel: Zeichnen Sie eine horizontale Linie an der Grenze zwischen Himmel und Land. Klicken Sie oberhalb der Linie, um den Himmel auszuwählen, unterhalb der Linie, um das Land auszuwählen. Die gezeichneten Linien müssen die Bildränder vollständig erreichen. - ^Entfernen Verwirft den aktuellen Bereich dauerhaft. - - TOPIC: BEREICHSLÜCKE FINDEN Wurde ein Bereichsumriss durch Freihandzeichnen mit mehreren Strichen erstellt, lassen sich leicht kleine Lücken im Umriss hinterlassen, die unterhalb von 4-facher Vergrößerung nicht sichtbar sind. Ein Versuch, einen solchen Bereich fertigzustellen, schlägt fehl, da die Erfassung der inneren Pixel durch die Lücke ausläuft und Bereiche außerhalb des vorgesehenen Bereichs abdeckt. Schlägt die Funktion Fertigstellen fehl, kann diese Funktion die Lücke finden. Klicken Sie irgendwo auf den Umriss des fehlgeschlagenen Bereichs. Der Umriss wird von der angeklickten Position aus langsam in eine Richtung neu gezeichnet, bis ein "Endpixel" gefunden wird. Dort befindet sich die Lücke. Der Umriss wird dann in die entgegengesetzte Richtung gezeichnet, bis die Lücke (oder eine andere) angetroffen wird. Die Lücke befindet sich dort, wo das Zeichnen gestoppt hat. Zoomen Sie auf die Lücke und schließen Sie sie mit Freihandzeichnen, testen Sie dann erneut, ob der vollständige Umriss ohne Unterbrechung gezeichnet werden kann. Diese Funktion kann parallel zur Funktion Bereich auswählen verwendet werden - beide Dialoge können aktiv sein. - - TOPIC: BEREICH ÜBERBLENDEN +image: area-blend.jpg - In diesem Werkzeug sind zwei Funktionen vorhanden: Bereich überblenden und Bereichsrand überblenden. Beide Funktionen können eine innerhalb eines ausgewählten Bereichs vorgenommene Bearbeitung schrittweise 'rückgängig machen', indem eine vorherige Bearbeitung oder das Originalbild eingemischt wird. Im obigen Beispiel wurden die vier Männer im Hintergrund aufgehellt, ohne dass eine Grenze zwischen aufgehellten und unveränderten Pixeln erkennbar ist. - ^Bereich überblenden Jeder Teil eines bearbeiteten ausgewählten Bereichs kann mit dem Originalbild überblendet werden. Verwenden Sie Ziehvorgänge mit der linken Maustaste über die zu überblendenden Regionen. Jeder Mausziehvorgang innerhalb des Bereichs blendet das ausgewählte vorherige Bild schrittweise ein und verringert oder entfernt damit effektiv die im Bereich vorgenommene Bearbeitung. Die Überblendungsrate wird durch 'blend rate' bestimmt, die separat für die Mitte und den Rand des Mauskreises festgelegt werden kann. Legen Sie den Mausradius und die Überblendungsraten fest (z. B. 50/0 für Mausmitte/-rand). Ziehen Sie die Maus über die zu überblendenden Bereichsregionen. Verwenden Sie Ziehen mit der linken Taste zum Überblenden, Ziehen mit der rechten Taste zum Rückgängigmachen der Überblendung oder Wiederherstellen. Sie können diese Methode verwenden, um Bereichsränder selektiv zu überblenden: Verwenden Sie einen kleinen Radius und ziehen Sie die Mitte der Maus über die zu überblendenden Ränder. Dies führt zu einer abgestuften Überblendung vom Rand nach innen. - ^Bereichsrand überblenden Manchmal hat ein bearbeiteter Bereich unnatürlich aussehende Ränder, wegen einer scharfen Grenze zwischen dem bearbeiteten Bereich und dem umgebenden Bild (insbesondere wenn der Bereich aufgehellt wurde). Dies kann wirksam unsichtbar gemacht werden, indem die Bereichsbearbeitung entlang der Ränder für einen Streifen schrittweise ausgeblendet wird. Die Bereichsbearbeitung kann am Bereichsrand zu 100% entfernt werden und nach innen auf 0% über die Breite des Streifens abnehmen. Es gibt zwei Möglichkeiten, Bereichsränder zu überblenden: 'blend' und 'blur'. Blend mischt den Randstreifen mit der gewählten vorherigen Bearbeitung oder dem Originalbild. Blur mischt den Streifen mit benachbarten Pixeln außerhalb des Streifens. Legen Sie die Breite der Überblendung mit der Eingabe 'blend width' oder 'blur width' fest. - Bereichsrand 'Blend' und 'Blur' erfordern eine Randabstandsberechnung: den Abstand von jedem Bereichspixel zum nächstgelegenen Bereichsrand. Dieser Abstand wird verwendet, um die relative Überblendung für das Pixel zu berechnen: 100% am Bereichsrand und 0% für Pixel jenseits von 'blend width' vom Rand. Bei einem großen Bereich mit komplexem Rand kann dies einige Zeit dauern. Eine Fortschrittsanzeige wird im oberen Panel angezeigt. - - TOPIC: BEREICH ANZEIGEN/AUSBLENDEN Zeigt oder verbirgt den Umriss des aktuellen Bereichs. Das Ausblenden des Bereichs ist nützlich, wenn der Bereich mit einer Bearbeitungsfunktion geändert wird. Dies erleichtert die Beurteilung der Auswirkungen der Bearbeitung. Diese sind auch als Schaltflächen im Dialog Bereich auswählen verfügbar. - - TOPIC: BEREICH AKTIVIEREN/DEAKTIVIEREN Deaktiviert den aktuellen Bereich und behält die Daten bei, sodass er später wieder aktiviert werden kann (Menü Aktivieren). Dies ermöglicht es Ihnen, zwischen Bearbeitungen innerhalb eines ausgewählten Bereichs und Bearbeitungen des gesamten Bildes zu wechseln. - - TOPIC: BEREICH UMKEHREN Kehrt einen vorhandenen Bereich um: Das gesamte Bild wird ausgewählt, mit Ausnahme des vorhandenen Bereichs. Die zweimalige Verwendung der Funktion stellt den ursprünglich ausgewählten Bereich wieder her. Das Umkehren eines ausgewählten Bereichs macht die Randberechnung ungültig, die wiederholt werden muss, wenn eine Bereichsrand-Überblendung gewünscht wird. - - TOPIC: BEREICH LEEREN Verwirft den aktuellen Bereich dauerhaft. Dies ist auch als Schaltfläche im Dialog Bereich auswählen verfügbar. - - TOPIC: BEREICH KOPIEREN/EINFÜGEN Ein ausgewählter Bereich kann über das Menü Bereiche > Kopieren in einer Cache-Datei gespeichert werden. Dieser Bereich kann mit Bereiche > Einfügen in dasselbe oder ein anderes Bild eingefügt werden. Klicken und ziehen Sie, um den eingefügten Bereich zu positionieren. Mit den Dialogsteuerelementen können der eingefügte Bereich skaliert und gedreht werden. - - TOPIC: BEREICH LADEN/SPEICHERN Ein ausgewählter Bereich kann über das Menü Bereiche > Speichern in einer Datei gespeichert werden. Sie werden aufgefordert, einen Dateinamen anzugeben. Eine PNG-Datei wird erstellt. Die PNG-Datei verfügt über einen Alphakanal für Transparenzinformationen. Das Bild ist ein Rechteck, das den ausgewählten Bereich umschließt. Ausgewählte Pixel sind opak, andere transparent. - Diese Dateien befinden sich standardmäßig in /saved_areas, Sie können sie jedoch überall speichern. Verwenden Sie das Menü Bereiche > Laden, um einen gespeicherten Bereich aus einer Datei zu laden und in die aktuelle Bilddatei einzufügen. Das Hintergrundbild scheint durch die transparenten Teile des eingefügten Bereichs hindurch. Klicken und ziehen Sie, um den Bereich zu positionieren. Mit den Dialogsteuerelementen können der eingefügte Bereich skaliert und gedreht werden. - - TOPIC: RÜCKGÄNGIG/WIEDERHOLEN-TASTE Wenn eine Bearbeitungsfunktion aktiv ist und das Bild geändert wurde: • Linksklick macht die aktuelle Bearbeitung rückgängig • Rechtsklick wiederholt die Bearbeitung Dies ermöglicht es Ihnen, die "Vorher"- und "Nachher"-Bilder für die aktuelle Bearbeitungsfunktion schnell zu vergleichen. - Wenn KEINE Bearbeitungsfunktion aktiv ist, aber einige Bearbeitungen am aktuellen Bild vorgenommen wurden: • Linksklick macht pro Klick einen Bearbeitungsschritt rückgängig • Rechtsklick wiederholt pro Klick einen Bearbeitungsschritt • Mittelklick öffnet eine Popup-Liste aller Bearbeitungsschritte. Sie können zu jedem Bearbeitungsschritt oder zum Originalbild zurückkehren - Wenn Sie eine andere Datei öffnen, werden die gespeicherten Bearbeitungsschritte für die aktuelle Datei verworfen. - - TOPIC: BEARBEITEN-MENÜ - - TOPIC: DREHEN Um ein schiefes Bild zu begradigen, ziehen Sie mit der Maus die rechte oder linke Seite des Bildes nach oben oder unten, bis das Bild gerade aussieht. Ein Linksklick auf das Bild fügt vertikale und horizontale Hilfslinien hinzu, um beim Begradigen zu helfen. Verwenden Sie einen Rechtsklick, um sie zu entfernen. - Die Schaltfläche [Automatischer Abgleich] kann das Bild automatisch begradigen, wenn die Kamera 'roll angle' in den EXIF-Metadata aufgezeichnet hat. Die Schaltfläche [Auto Upright] kann ein mit um 90º gedrehter Kamera aufgenommenes Bild automatisch aufrichten, sofern 'orientation' in den EXIF-Metadata vorhanden ist. - - TOPIC: AUFRICHTEN Dies ist eine 1-Klick-Korrektur für ein Bild, das um 90/180 Grad gedreht oder invertiert (gespiegelt) ist. Es gibt keinen Auflösungsverlust, da die Pixel 1:1 in das neue Bildlayout kopiert werden. Siehe auch die Funktion {SAMMEL-AUFRICHTEN}. - - TOPIC: ZUSCHNEIDEN +image: crop-image.jpg +image: crop-buttons.jpg - Schneidet unerwünschte Bereiche von den Bildrändern ab. Beim Öffnen des Dialogs wird ein Auswahlrechteck über das Bild gelegt. Bereiche außerhalb dieses Rechtecks werden abgedunkelt und stellen die Teile des Bildes dar, die entfernt werden. Ziehen Sie eine beliebige Seite oder Ecke des Rechtecks, um diese Seite oder Ecke zu verschieben. Das Dialogfeld zeigt das aktuelle Breiten-/Höhenverhältnis des Auswahlrechtecks an. Ist "Lock" aktiviert, bewirkt das Verschieben einer Seite oder Ecke, dass sich eine andere Seite oder Ecke mitbewegt, sodass das feste Breiten-/Höhenverhältnis beibehalten wird. Ziehen Sie von der Mitte aus (markiert durch einen kleinen Kreis), um das gesamte Rechteck zu verschieben, ohne die Abmessungen zu ändern. Verwenden Sie die Dreh-Schaltflächen für Breite und Höhe, um die Bildpixelabmessungen direkt anzupassen, oder geben Sie die gewünschten Werte ein. Das Auswahlrechteck passt sich diesen Werten an. - Verwenden Sie die Pfeiltasten der Tastatur, um das Auswahlrechteck in 1-Pixel-Schritten zu verschieben. Die zuletzt mit der Maus bewegte Seite oder Ecke ist diejenige, die mit den Pfeiltasten bewegt wird. - Die Schaltfläche [Max.] setzt das Zuschneiderechteck auf die volle Bildgröße zurück. Hat eine vorherige Bearbeitung (Drehen, Verzerren ...) transparente Ränder um das Bild hinterlassen, spiegelt das Zuschneiderechteck die maximale Größe wider, die innerhalb dieser Ränder passt. - Die Schaltfläche [Vorher] ruft eine Liste zuvor verwendeter Breiten- und Höhenwerte ab. Wählen Sie aus der Liste, um einen davon zu verwenden. - Die fünf Verhältnis-Schaltflächen ermöglichen die Auswahl eines voreingestellten Breiten-/Höhenverhältnisses. Die Schaltfläche [invert] kehrt das aktuelle Breiten-/Höhenverhältnis um. - Sie können die Verhältnis-Schaltflächen mit der Schaltfläche [customize] ändern, die einen neuen, rechts gezeigten Dialog startet. Klicken Sie auf eine Schaltfläche, um sie zu bearbeiten. Geben Sie das gewünschte Breiten-Höhen-Verhältnis im Format "ww:hh" wie im gezeigten Beispiel ein. - - TOPIC: RETUSCHE +image: retouch.png - Passt Bildhelligkeit und -farbe an. • Auto-Schwarzpunkt - Schwarzpunkt anhand von % der dunkelsten Pixel festlegen • Auto-Weißabgleich - Weißpunkt anhand von % der hellsten Pixel festlegen • Grauen Punkt für Weißabgleich anklicken - grauen Punkt im Bild anklicken • Dunklen Punkt für Schwarzpunkt anklicken - dunklen Punkt im Bild anklicken • Klicken für Popup-Diagramm der RGB-Histogramme • Helligkeit - verschiebt die 'all'-Kurve nach oben oder unten (alle Farben ändern sich) • Kontrast - ändert die Steigung der 'all'-Kurve • Farbsättigung - Schwarz/Weiß <--> intensive Farben • Farbtemperatur - Beleuchtungsausgleich (warm <--> kühl) - Nachdem Sie erste Anpassungen mit den Schiebereglern vorgenommen haben, können Sie Helligkeit und Kontrast feinabstimmen, indem Sie die Kurven mit der Maus bearbeiten, um festzulegen, welche Bildbereiche mehr oder weniger geändert werden. Die ALL-Kurve passt alle Farben an, und die 3 RGB-Kurven passen einzelne Farben an. Verwenden Sie zuerst ALL, und nehmen Sie dann Anpassungen mit RGB vor. - ^Schaltflächen Zurücksetzen - setzt alle Steuerelemente auf eine neutrale Position zurück - das Bild wird ebenfalls zurückgesetzt Zurück - setzt alle Steuerelemente auf die für das vorherige Bild verwendeten Werte Fertig - Bearbeitung abschließen, Dialog schließen, Steuerelementeinstellungen speichern Abbrechen - Bearbeitung abbrechen, Bild zurücksetzen, Dialog schließen - Verwenden Sie die Schaltfläche [Vorher], wenn Sie mehrere Bilder verarbeiten, die ähnliche Anpassungen benötigen. - - TOPIC: SKALIEREN +image: rescale.png - Diese Funktion ändert die Größe des Bildes auf eine neue Pixelbreite und -höhe. Sie können die neuen Abmessungen direkt eingeben oder eine prozentuale Änderung wählen. Es gibt Schaltflächen, um die neue Größe auf ein einfaches Verhältnis der Originalgröße festzulegen. Die Verwendung einer davon minimiert den Auflösungsverlust. Die Schaltfläche [Vorherige] ruft die vorherige Größe ab, praktisch, wenn mehrere Bilder auf dieselbe Größe eingestellt werden. Ist das Kästchen Verhältnis sperren aktiviert, bleibt das aktuelle Breiten-/Höhenverhältnis erhalten, wenn entweder die Breite oder die Höhe geändert wird. - - TOPIC: GETEILTER BILDSCHIRM +image: split-screen1.jpg +image: split-screen2.png - Betrachten Sie während einer Bearbeitungsfunktion die Vorher- und Nachher-Bilder mit der Methode des geteilten Bildschirms. Ziehen Sie die Grenzlinie mit der Maus. Wenn Sie Geteilter Bildschirm verlassen, können Sie die Bearbeitungsfunktion normal fortsetzen. - Ist keine Bearbeitungsfunktion aktiv, wählen Sie zwei Bilder aus, die mit geteiltem Bildschirm angezeigt werden sollen. Sie müssen dieselben Pixelabmessungen haben. - - TOPIC: UNTERSCHIEDE ANZEIGEN Heben Sie während einer Bearbeitungsfunktion die Änderungen hervor, indem unveränderte Bereiche abgedunkelt werden. Verwenden Sie den Schieberegler, um die Dunkelheit der unveränderten Bereiche anzupassen. Wenn Sie Unterschiede anzeigen verlassen, können Sie die Bearbeitungsfunktion normal fortsetzen. - Ist keine Bearbeitungsfunktion aktiv, wählen Sie zwei Bilder aus, um deren Unterschiede hervorzuheben. Sie müssen dieselbe Pixelabmessung haben. - - TOPIC: RÄNDER +image: margins.png - Verwenden Sie diese Funktion, um Ränder um ein Bild hinzuzufügen. Sie können für die Ränder eine beliebige Farbe und Alpha-(Transparenz-)Einstellung verwenden. Legen Sie jeden Rand einzeln fest, oder verwenden Sie die Steuerelemente 'All±1' und 'All±10', um alle Ränder um denselben Betrag, 1 oder 10 Pixel, nach oben oder unten anzupassen. Verwenden Sie das Mausrad oder die Pfeiltasten nach oben/unten für mehr Geschwindigkeit. - Sie können diese Funktion verwenden, um Ränder um Bilder hinzuzufügen, die Sie verzerren möchten, damit keine Bereiche über die Kanten hinausfallen. - - TOPIC: MARKUP +image: markup.jpg - Dies ist ein Menü mit den Bildmarkierungsfunktionen: Text zeichnen, Linie/Pfeil zeichnen, Rechteck zeichnen, Oval zeichnen Alle diese Funktionen verfügen über eine Schaltfläche [commit], mit der die aktuelle Bearbeitung übernommen wird und Sie eine neue (neuer Text/neue Linie/neues Rechteck/neues Oval) innerhalb desselben Bearbeitungsdialogs beginnen können. - ^Text zeichnen Diese Funktion zeichnet Text direkt auf das Bild. Geben Sie den Text in den Dialog ein. Mehrere Zeilen können verwendet werden. Klicken Sie nach der Texteingabe mit der linken Maustaste dorthin, wo der Text auf dem Bild erscheinen soll. Ziehen Sie, um den Text an eine andere Stelle zu verschieben. Klicken Sie mit der rechten Maustaste, um den Text zu entfernen. Verwenden Sie die Schaltfläche [Schriftart], um eine andere Schriftart auszuwählen. Verwenden Sie das Steuerelement [Größe], um die Textgröße zu erhöhen oder zu verringern. Verwenden Sie das Steuerelement [Winkel], um den Neigungswinkel des Textes zu ändern. Die anderen Steuerelemente ermöglichen es Ihnen, eine Hintergrundfarbe um den Text, eine Textumrissfarbe und einen Schatteneffekt festzulegen. Sie können für alle diese die Farbe und Transparenz auswählen. Das Breiten-Steuerelement passt die Breite von Umrissen und Schatten an. Das Schattenwinkel-Steuerelement legt den Winkel des Schattens fest. Verwenden Sie die Prägungs-Steuerelemente, um dem Text ein 3D-Aussehen zu verleihen. - Sie können den Text aus beliebigen verfügbaren Metadata in der Bilddatei initialisieren. Geben Sie den Metadata-Tag ein (z. B. "user comments") und drücken Sie [Abrufen]. Sie können Tag-Namen abkürzen, z. B. "usercomments" statt "User Comments". - Die Schaltflächen [Öffnen] und [Speichern] starten einen Dateiauswahldialog, mit dem Sie alle Textdaten aus einer Datei laden oder in eine Datei speichern können. Alle Elemente im Dialog werden geladen oder gespeichert, sodass Sie eine Sammlung häufig verwendeter Textzeichenfolgen und Einstellungen aufbewahren können. - Die Schaltflächen am unteren Rand funktionieren wie folgt: • Leeren - leert die Text- und Metadata-Felder • Ersetzen - das Bild mit hinzugefügtem Text ersetzt das aktuelle Bild • +Version - das Bild mit hinzugefügtem Text wird als neue Version gespeichert • Weiter - öffnet die nächste Datei, setzt denselben Text an dieselbe Position • Anwenden - übernimmt die aktuelle Bearbeitung und setzt für eine neue Texteingabe zurück • Fertig - schließt die aktuelle Bearbeitung ab - das Bild ist speicherbereit • Abbrechen - verwirft die aktuelle Bearbeitung - Um denselben Text zu einer Bilderserie hinzuzufügen: Bereiten Sie den Text vor und positionieren Sie ihn, drücken Sie [Ersetzen] oder [+Version], dann [Weiter], dann [Ersetzen] oder [+Version], dann [Weiter] ... - Ein Wasserzeichen erstellen: Verwenden Sie eine Texttransparenz von 70% oder mehr und eine Hintergrundtransparenz von 100%. Der Text sollte schwach lesbar sein. Verwenden Sie die Prägungs-Steuerelemente, damit der Text wie in das Bild eingelassen aussieht. - ^Linie zeichnen Diese Funktion zeichnet Linien oder Pfeile direkt auf das Bild. Geben Sie eine Linienlänge und -breite in den Dialog ein und wählen Sie bei Bedarf eine Pfeilspitze. Klicken Sie mit der linken Maustaste dorthin, wo Sie sie auf dem Bild platzieren möchten. Ziehen Sie die Enden der Linie/des Pfeils, um sie auf dem Bild zu positionieren. Klicken Sie mit der rechten Maustaste, um sie zu entfernen. Ziehen Sie von der Mitte der Linie aus, um sie zu verschieben, ohne Winkel oder Länge zu ändern. Die Dialogsteuerelemente ermöglichen es Ihnen, eine Hintergrundfarbe, eine Umrissfarbe und einen Schatteneffekt festzulegen. Sie können für alle diese Farbe und Transparenz auswählen. Das Breiten-Steuerelement passt die Breite von Umrissen und Schatten an. Das Schattenwinkel-Steuerelement legt den Neigungswinkel des Schattens fest. Um eine gezeichnete Linie zu behalten und eine neue zu beginnen, drücken Sie [anwenden]. - ^Rechteck zeichnen Wählen Sie eine Farbe und Breite für den Rechteckumriss. Platzieren Sie den Cursor an der Position, an der Sie eine Ecke des Rechtecks wünschen, und ziehen Sie, um das Rechteck in die gewünschte Richtung zu öffnen. Um das Rechteck zu ersetzen, ziehen Sie erneut. Um das Rechteck zu verschieben, halten Sie die Umschalttaste gedrückt und ziehen Sie das Rechteck von der Mitte aus. Um eine der Kanten zu verschieben, halten Sie die Umschalttaste gedrückt und ziehen Sie die Kante. Um ein gezeichnetes Rechteck zu behalten und ein neues zu beginnen, drücken Sie [anwenden]. - ^Oval zeichnen Wählen Sie entweder das Kontrollkästchen Oval (Ellipse) oder Kreis. Wählen Sie eine Farbe und Breite für den Umriss. Platzieren Sie den Cursor am gewünschten Mittelpunkt. Ziehen Sie, um das Oval/den Kreis zu zeichnen. Der Ziehwinkel bestimmt die Form des Ovals, vom Kreis bis zur extremen Ellipse, breit oder hoch. Um das Oval/den Kreis zu ersetzen, ziehen Sie erneut. Um das Oval/den Kreis zu verschieben, halten Sie die Umschalttaste gedrückt und ziehen Sie von der Mitte aus. Um Größe oder Form zu ändern, halten Sie die Umschalttaste gedrückt und ziehen Sie von der unteren rechten Kante aus. Um ein gezeichnetes Oval/einen Kreis zu behalten und ein neues zu beginnen, drücken Sie [anwenden]. Bei einem Oval können Sie einen Winkel von 0-90 Grad für geneigte Achsen eingeben, wie im Beispiel. - - TOPIC: FARBMODUS +image: color-mode.png +image: color-mode2.jpg - Verwenden Sie diese Funktion, um ein Schwarzweiß- oder Farbnegativ zu erstellen, ein Negativbild in ein Positivbild umzuwandeln oder in Sepia-Färbung umzuwandeln (für einen gealterten Fotoeffekt). Der Schieberegler kann verwendet werden, um den Effekt schrittweise anzuwenden, von 0% bis 100%. - - TOPIC: MALBEARBEITUNGEN Verwenden Sie diese Funktion in Kombination mit einer anderen Bearbeitungsfunktion. Starten Sie eine Bearbeitungsfunktion und lassen Sie die Steuerelemente in neutraler Position. Starten Sie dann Bearbeitungen malen. Malen Sie die Bearbeitungsfunktion mit der Maus dort auf, wo gewünscht. Siehe {MOUSE PAINTING} für die lokale Anwendung von Bearbeitungen mit der Maus. - Diese Methode zum schrittweisen "Malen" von Bearbeitungen kann ausgewählte Bereiche eines Bildes schnell und einfach verbessern. Sie funktioniert mit den folgenden Bearbeitungsfunktionen: • Bearbeiten > Retuschieren, Farbmodus • Reparatur > Schärfen, Weichzeichnen, Rauschen reduzieren, Entnebeln, RGB anpassen, HSL anpassen • Verfeinern > Histogramm abflachen, Lokaler Kontrast, Kontrast verstärken, Lokaler Retinex, Sättigung, Weichzeichner-Effekt • Effekte > Umrisse, Skizze2, Prägung, Textur, Blendlicht hinzufügen, Farben festlegen, Farben verschieben, Benutzerdefinierter Kernel - - TOPIC: BILD BEMALEN +image: paint-image.jpg - Diese Funktion übermalt das Bild mit ausgewählten Farben unter Verwendung der Maus. Siehe {MOUSE PAINTING} für die lokale Anwendung von Bearbeitungen mit der Maus. - Die Schaltfläche Malfarbe zeigt die aktuelle Farbe an. Klicken Sie auf diese Schaltfläche, um eine Farbe über den Standard-Gnome-Farbauswahldialog zu wählen. Sie können auch Umschalt + Linksklick auf das Bild verwenden, um eine Farbe aus dem Bild zu wählen. - Die Palette-Schaltfläche öffnet den in der Mitte gezeigten Dialog. Klicken Sie auf das Bild, um die Farbe an dieser Position auszuwählen. Die gewählte Farbe wird in der Farbschaltfläche des Hauptdialogs widergespiegelt. Das oben gezeigte Bild ist die Standardeinstellung. Sie können jedes beliebige Bild als Farbquelle verwenden. Drücken Sie die Schaltfläche [durchsuchen] und wählen Sie ein Bild, in dem Sie Farben zum Abrufen gespeichert haben. Diese Wahl bleibt gültig, bis sie geändert wird. - Die HSL-Schaltfläche öffnet einen rechts gezeigten HSL-Farbwähler. Dieser Dialog kann jede mögliche Farbe darstellen. Bewegen Sie die Schieberegler, um die gewünschte Farbe zu erhalten. Die gewählte Farbe wird in der Farbschaltfläche des Hauptdialogs widergespiegelt. - Ist über transparente Bereiche malen ausgewählt, verringert oder beseitigt das Malen über transparente Bereiche die Transparenz, abhängig von den Deckkraft-Steuerelementen. Ist diese Option nicht ausgewählt, werden nur opake Bereiche des Bildes bemalt. - ^Wacom-Tablet-Bedienung Mit Bild malen können Sie statt einer Maus ein Wacom-Tablet verwenden. Das Ziehen des Stifts in Kontakt mit der Tablet-Oberfläche malt wie oben beschrieben. Wird beim Ziehen eine der Stifttasten gedrückt gehalten, wird statt gemalt gelöscht. Sie können den Mal- oder Löschmodus auch über die Optionsfelder im Dialog festlegen. Das Gedrückthalten einer Stifttaste ist umständlich, weshalb es die Optionsfelder gibt. Zusätzlicher Druck auf den Stift erhöht die Deckkraft, sodass Sie hellere und dunklere Striche machen können, ohne die Deckkraft-Steuerelemente anzupassen. - - TOPIC: TRANSPARENZ MALEN +image: paint-transp.png +image: paint-transp2.jpg - Malen Sie transparente oder halbtransparente Bereiche auf ein Bild. Siehe {MOUSE PAINTING} für die lokale Anwendung von Bearbeitungen mit der Maus. - - TOPIC: BEREICH FÜLLEN Füllt alle ausgewählten Bereiche oder alle transparenten Bereiche mit einer gewählten Overlay-Farbe. Ist ein Bereich teilweise transparent, ersetzt die Overlay-Farbe den transparenten Anteil des Bildes. Der Schieberegler 'Blend' kann verwendet werden, um eine beliebige Mischung aus Originalbild und Overlay-Farbe auszuwählen. - - TOPIC: IM BILD KOPIEREN Übermalt Bildbereiche, indem von einer anderen Stelle im selben Bild kopiert wird. Diese Methode kann verwendet werden, um Objekte innerhalb eines Bildes zu duplizieren oder ein unerwünschtes Objekt zu entfernen, indem es durch Hintergrund von anderer Stelle ersetzt wird. Klicken Sie mit der linken Maustaste auf das Bild, um eine Quellposition auszuwählen, dann mit der rechten Maustaste, um das entsprechende Ziel auszuwählen. Siehe {MOUSE PAINTING} für die lokale Anwendung von Bearbeitungen mit der Maus. - Ist über transparente Bereiche malen ausgewählt, verringert oder beseitigt das Malen über transparente Bereiche die Transparenz. Ist diese Option nicht ausgewählt, werden nur opake Bereiche des Bildes bemalt. - - TOPIC: AUS BILD KOPIEREN Übermalt Bildbereiche, indem von einem anderen Bild kopiert wird. Das Zielbild wird 'bemalt', indem die Maus über den zu ändernden Bereich gezogen wird. Eine zuvor ausgewählte Position im Quellbild wird auf das Zielbild kopiert. Sowohl der kopierte als auch der bemalte Bereich sind in Kreisen eingeschlossen, die sich mit der Maus bewegen. Im obigen Beispiel wurde das Boot im rechten Bild in das linke Bild kopiert. - Öffnen Sie zunächst das Zielbild. Wählen Sie das Menü 'Aus Bild kopieren'. Eine 2. Fotocx-Sitzung wird gestartet, die dasselbe Bild zeigt. Navigieren Sie in dieser 2. Sitzung zum Quellbild und öffnen Sie es. Ordnen Sie die beiden Fenster so an, dass Sie beide im Blick behalten können (zumindest die zu kopierenden Bereiche). Umschalt + Linksklick auf das Quellbild, um eine Quellposition festzulegen. Umschalt + Linksklick auf das Zielbild an der Zielposition. - Ziehen Sie die Maus bei gedrückter linker Taste über den Zielbildbereich. Pixel aus dem Quellbild werden in das Zielbild kopiert. Zoomen Sie die Bilder auf maximale Größe, wenn hohe Präzision für die Referenzpositionen erforderlich ist. Die anfängliche Referenzposition ist (0,0) (NW-Ecke) für beide Bilder. Siehe {MOUSE PAINTING} für die lokale Anwendung von Bearbeitungen mit der Maus. - Der Skalierungswert des Quellbildes wird verwendet, um das Quellbild an das Zielbild anzupassen. Beginnen Sie mit einer Testkopie, um die Skalierung zu überprüfen. Ist sie zu groß oder zu klein, verwenden Sie [undo all], um den Test zu löschen, ändern Sie den Skalierungswert und versuchen Sie es erneut. - Ist über transparente Bereiche malen ausgewählt, verringert oder beseitigt das Malen über transparente Bereiche die Transparenz, abhängig von den Maus-Deckkraft-Steuerelementen. Ist diese Option nicht ausgewählt, werden nur opake Bereiche des Bildes bemalt. - - TOPIC: VORHERIGE BEARBEITUNG KOPIEREN Das Bild aus einem vorherigen Bearbeitungsschritt kann lokal und schrittweise durch "Malen" mit der Maus auf das aktuelle Bild angewendet werden. Die vorherige Bearbeitung muss eine der Bearbeitungen sein, die am aktuellen Bild vorgenommen wurden, während es noch geöffnet ist - nicht gespeicherte Bearbeitungen gehen verloren, wenn ein neues Bild geöffnet wird. Sie können jede vorherige Bearbeitung auf jeden Bereich des aktuell bearbeiteten Bildes anwenden, solange das Bild als aktuelles Bild geöffnet bleibt. Wählen Sie eine vorherige Bearbeitung über die Dropdown-Liste, die alle vorherigen Bearbeitungsschritte am aktuellen Bild in Reihenfolge anzeigt, identifiziert durch die verwendete Bearbeitungsfunktion. Siehe {MOUSE PAINTING} für die lokale Anwendung von Bearbeitungen mit der Maus. - - TOPIC: REPARATUR-MENÜ - - TOPIC: SCHÄRFEN +image: sharpen.png - Diese Funktion verfügt über fünf Methoden zum Schärfen eines unscharfen Bildes sowie eine Methode zum Schärfen von Bewegungsunschärfe durch Kamera- oder Motivbewegung während der Belichtung. - Wählen Sie die Methode, legen Sie die Parameter fest, drücken Sie [anwenden] und warten Sie einige Sekunden, um das Ergebnis zu sehen. Nehmen Sie Änderungen vor und wiederholen Sie den Vorgang, bis Sie zufrieden sind. Verwenden Sie {BEREICH AUSWÄHLEN}, um verschiedene Teile eines Bildes mit unterschiedlichen Methoden und Parametern zu bearbeiten. - Wählen Sie bei allen Methoden einen kleinen Radius für leicht unscharfe Bilder und größere Werte für schlechtere Bilder. Amount steuert die Stärke der Änderung. Threshold unterdrückt Änderungen an kontrastarmen Pixeln: Ein höherer Wert verringert die Verstärkung geringfügiger Unregelmäßigkeiten (Bildrauschen, ungleichmäßige Hauttöne usw.). - Unsharp mask: eine klassische Methode, die in den meisten Bildbearbeitungsprogrammen zu finden ist. Eine technische Beschreibung lässt sich über eine Internetsuche finden. Diese Methode kann sichtbare 'Halos' um kontrastreiche Kanten erzeugen. - Amplify Contrast: verstärkt vorhandenen Kontrast. Die Wirksamkeit ist mit Unsharp mask vergleichbar, jedoch werden 'Halos' reduziert. - Kuwahara: kleine Nachbarschaften um jedes Pixel werden miteinander verglichen. Dem Pixel wird die mittlere Farbe der Nachbarschaft mit der geringsten Abweichung zugewiesen. Dies zwingt Pixel an einer unscharfen Kante dazu, sich der einen oder anderen Seite der Kante anzupassen. Kanten werden sehr scharf gemacht. Das Bild kann 'blockig' wirken, wenn ein großer Radius verwendet wird. Feine Details können verloren gehen. - Median diff: Die Pixelhelligkeit wird mit dem Median der Pixel innerhalb des Radius verglichen. Die Helligkeit wird für Pixel erhöht oder verringert, die heller bzw. dunkler als der Nachbarschaftsmittelwert sind. Die Wirksamkeit ist mit Unsharp mask vergleichbar, jedoch werden 'Halos' stark reduziert. Dies ist die einzige Methode, die jede RGB-Farbe separat bearbeitet. Sie kann einen Farbübergang schärfen, selbst wenn nur wenig Helligkeitsänderung vorliegt. - Richardson-Lucy: das Bild wird mit der Richardson-Lucy-Entfaltungsmethode geschärft. Diese Methode liefert möglicherweise die besten Ergebnisse, ist aber auch recht langsam. Um den Vorgang zu beschleunigen, wählen Sie zunächst mit {BEREICH AUSWÄHLEN} einen kleinen, aber detailreichen Bereich des Bildes aus. Suchen Sie mit diesem kleinen Bereich nach dem optimalen Radius und der optimalen Iterationsanzahl. Verwenden Sie dann dieselben Einstellungen für das gesamte Bild. Rauschen im Bild beeinträchtigt die Wirksamkeit. Verwenden Sie in diesem Fall zuvor {ENTRAUSCHEN}. - Ein Bild, das genau um das 2-fache hochskaliert wurde, kann mit Richardson-Lucy geschärft werden, wobei ein Radius von 2,0 und 4 oder mehr Iterationen verwendet werden. Die Ergebnisse sind bemerkenswert gut. - ^Bewegungsunschärfe korrigieren +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - Optimieren Sie Bilder mit geringfügiger Unschärfe durch Kamera- oder Objektbewegung manuell. Unschärfe durch ein sich bewegendes Objekt in einem ansonsten scharfen Bild kann mit {BEREICH AUSWÄHLEN} bearbeitet werden, um das Objekt zu isolieren. Es wird angenommen, dass die Unschärfe linear und mit konstanter Geschwindigkeit ist. Die Eingaben sind 'blur span' in Pixeln und 'blur angle' in Grad. Die anfängliche Winkelschätzung kann durch Umschalt + Mausziehen über das Bild in Unschärferichtung festgelegt werden (kann gleich oder entgegengesetzt zur tatsächlichen Bewegung sein). Geben Sie eine Schätzung der Unschärfespanne ein, indem Sie Werkzeuge > RGB anzeigen verwenden, um die Breite der Unschärfe entlang einer hellen Bildmerkmalskante zu messen. Passen Sie die Eingaben an, drücken Sie [anwenden], und überprüfen Sie das Bild, um optimale Einstellungen zu finden. Die Reaktionszeit kann bei einem großen Bild langsam sein. Sie können den Vorgang beschleunigen, indem Sie mit {BEREICH AUSWÄHLEN} einen kleinen unscharfen Bereich auswählen, um Spanne und Winkel zu optimieren, und dann den Bereich löschen, um das gesamte Bild mit denselben Einstellungen zu verarbeiten. Der Algorithmus kann "Ringing"-Rauschen erzeugen, das mit der Eingabe 'suppress ringing' unterdrückt werden kann. Am besten belassen Sie den Unterdrückungswert niedrig, um die optimale Spanne und den optimalen Winkel zu finden, und fügen dann bei Bedarf Unterdrückung hinzu, um Ringing zu verringern. Die Richardson-Lucy-Entfaltungsmethode wird in einer Dimension verwendet. - ^Bewegungsunschärfe bei Digitalkameras Nicht alle unscharfen Fotos haben die Unschärfe mit konstanter Geschwindigkeit, die für diese Methode am besten geeignet ist. Das Bild kann eine Überlagerung mehrerer kürzerer Belichtungen sein. Möglicherweise wird nicht das gesamte Bild gleichzeitig belichtet und weist dieselbe Unschärfe auf (mechanischer oder elektronischer bewegter Verschluss). Diese Methode kann dennoch bessere Ergebnisse liefern als Schärfungswerkzeuge, die in zwei Dimensionen arbeiten. Sie sollte bei alten Fotos, die mit Filmkameras aufgenommen wurden, besser funktionieren, da die Bewegungsunschärfe dort näher an konstanter Geschwindigkeit liegt. - - TOPIC: WEICHZEICHNEN +image: blur.jpg - Wählen Sie eine Methode über das entsprechende Kontrollkästchen, geben Sie die erforderlichen Parameter ein, drücken Sie [anwenden]. Ist {BEREICH AUSWÄHLEN} aktiv, sind nur die ausgewählten Bereiche betroffen. - ^Normale Weichzeichnung Mischt jedes Pixel mit umliegenden Pixeln innerhalb des Radius. Nähere Pixel haben ein höheres Gewicht. Sie können den Radius auf 1 setzen und wiederholt [anwenden] drücken, um die Weichzeichnung langsam zu erhöhen, während Sie das Bildergebnis beobachten. - Sie können optional in horizontaler und vertikaler Richtung unterschiedlich stark weichzeichnen, indem Sie separate horizontale und vertikale Werte eingeben. Die Eingabe [Radius] erzwingt dieselben Werte für beide. - ^Radiale Weichzeichnung Mischt jedes Pixel mit Pixeln entlang einer Linie von einem gewählten Mittelpunkt aus. Radius legt einen zentralen Bereich fest, der nicht weichgezeichnet wird. Length legt den Bereich der Weichzeichnungslinie fest: 0 bis Length, von der Mitte bis zum Rand. Wählen Sie den Mittelpunkt durch Klicken auf das Bild. - ^Gerichtete Weichzeichnung Ziehen Sie mit der Maus eine Position auf dem Bild. Der Bereich um die Maus wird in dieser Richtung weichgezeichnet. Span bestimmt die Größe des weichgezeichneten Bereichs. Intensity bestimmt die Stärke der Weichzeichnung. - ^Abgestufte Weichzeichnung Nur Pixel mit weniger Kontrast als der angegebenen Kontrastgrenze werden weichgezeichnet, und der Weichzeichnungsradius reicht von 1 bis zum angegebenen Wert für Pixel mit einem entsprechenden Kontrast, der von der angegebenen Grenze bis null reicht. Kurz gesagt: kontrastarme Pixel werden stärker weichgezeichnet als kontrastreiche Pixel. Dies kann verwendet werden, um Hauttöne zu glätten, ohne Haare weichzuzeichnen oder das Funkeln in den Augen zu verringern. Auf die Spitze getrieben, erzeugt dies einen "Cartoon"-Effekt. - ^Hintergrund-Weichzeichnung (Bokeh) Zeichnet Hintergrundbildbereiche weich, während der Vordergrund scharf bleibt. Wählen Sie einen oder mehrere Bereiche aus, die scharf bleiben sollen {BEREICH AUSWÄHLEN}. Kehren Sie nach der Auswahl der Vordergrundbereiche die Auswahl um, sodass nun der Hintergrund ausgewählt ist {BEREICH UMKEHREN}. Dies ist der Bereich, der weichgezeichnet wird. Es stehen zwei Weichzeichnungsmethoden zur Verfügung: Konstante Weichzeichnung: Für alle weichgezeichneten Bereiche wird ein konstanter Weichzeichnungsradius verwendet. Weichzeichnung mit der Entfernung erhöhen: Verwendet den minimalen Weichzeichnungsradius für Pixel neben dem Vordergrund und den maximalen Weichzeichnungsradius für Pixel in maximaler Entfernung vom Vordergrund. Dies erfordert die Berechnung des Randabstands für alle Hintergrundpixel, was erhebliche Zeit in Anspruch nehmen kann. Der Weichzeichnungsradius kann geändert werden, ohne die Randabstände neu zu berechnen. - - TOPIC: ENTRAUSCHEN +image: denoise.jpg - Reduziert das Rauschen in Fotos, die bei schwachem Licht (hoher ISO-Wert) aufgenommen wurden und bei denen gleichmäßige Flächen gesprenkelt wirken. Es werden zwei Methoden bereitgestellt, Median und Smooth. Die beste Methode variiert je nach Rauschen und Bildcharakteristik. Das Mischen von Methoden (erst die eine, dann die andere verwenden) kann hilfreich sein. Der Radius-Wert legt die Pixelnachbarschaft fest, die zum Vergleichen und Anpassen eines bestimmten Pixels verwendet wird. Ein großer Wert (Radius > 2) reduziert das Rauschen wirksamer, kann aber auch zu Detailverlust führen. Der Grenzwert bewirkt, dass Pixel mit RGB-Helligkeitswerten, die um mehr als diesen Betrag vom Nachbarschaftsmedian abweichen, ignoriert werden. Dies ist bei manchen Bildern notwendig, um zu verhindern, dass winzige helle Details als Rauschen behandelt werden - z. B. bei astronomischen Fotos. - Legen Sie einen Radius-Wert fest und drücken Sie eine der Methodenschaltflächen. Jede Iteration verwendet das vorherige Bild als Ausgangspunkt, sodass mehrere Iterationen das Rauschen schrittweise unterdrücken und möglicherweise einige Details weichzeichnen. Verwenden Sie [zurücksetzen], um von vorn zu beginnen. Median mit Radius 1, gefolgt von Median mit Radius 2, ist ein guter Kompromiss zwischen Rauschunterdrückung und Detailerhalt. - Der Schieberegler Areas kann verwendet werden, um die Verarbeitung auf dunkle Bereiche zu beschränken oder auf einen breiteren Bereich auszudehnen. Dunkle Bereiche neigen eher zu Rauschproblemen als helle Bereiche. - Wenn Sie einige winzige, anhaltende Rauschsprenkel sehen, erhöhen Sie den Grenzwert, verwenden Sie die Schaltfläche [zurücksetzen] und fahren Sie mit [Median] oder [glätten] fort. - Sie können unterschiedliche Verarbeitungen in verschiedenen Bereichen des Bildes anwenden - siehe {BEREICH AUSWÄHLEN}, und Sie können das Bild mit unterschiedlicher Verarbeitung in verschiedenen Bereichen "bemalen" - siehe {MALBEARBEITUNGEN}. - Jede RGB-Farbe wird unabhängig verarbeitet. Es gibt keine separate Verarbeitung von Chroma oder Helligkeit. - Die Schaltfläche [measure] startet den Dialog auf der rechten Seite, um den tatsächlichen Bildrauschpegel zu messen. Bewegen Sie die Maus über das Bild, um die RGB-Rauschpegel innerhalb des Mauskreises anzuzeigen (Radius 10, etwa 300 Pixel). Dies muss ein merkmalsloser Bereich sein, damit Rauschen die einzige vorhandene Variation ist. Prüfen Sie das Bild bei 4-facher Größe, um sicherzustellen, dass Sie Rauschen und keine Textur sehen. Die Punkte zeigen einzelne Pixel-RGB-Werte relativ zum Mittelwert der umgebenden 5x5 Pixel, dargestellt durch die zentrale durchgezogene Linie. Die Zahlen unten zeigen die mittlere RGB-Helligkeit und die Rauschpegel auf der Skala 0-255. Die Diagrammskala reicht von -10 bis +10, und die gepunkteten Linien liegen bei -5 und +5, relativ zu einem Gesamtbereich von 0-255. Rauschen im 9. oder 10. RGB-Bit entspricht 0,5 oder 0,25 auf dieser Skala. - ^RAW-Bildrauschen Um das Sensorrauschen der Kamera zu messen, verwenden Sie ein RAW-Bild. JPEG-Bilder werden in der Kamera verarbeitet, um Rauschen zu reduzieren. Sie werden möglicherweise über die typischerweise hohen Rauschpegel in RAW-Bildern überrascht sein. Selbst teure Kameras mit großen Sensoren können weniger als 8 Bit rauscharmer Farbe aufweisen. Wenn Sie Rauschen aus einem RAW-Bild filtern, konkurrieren Sie mit der Elektronik und Software, die das Kamera-JPEG erzeugen. Es könnte eine Herausforderung sein, es besser zu machen. - - TOPIC: ENTNEBELN +image: defog.png +image: defog2.jpg - Entfernt Nebel/Dunst in einem Bild oder ausgewählten Bereich. Es gibt andere Werkzeuge hierfür (Histogramm abflachen, Lokaler Kontrast, Kontrast verstärken, Retinex, Sättigung), aber die Nebel-/Dunstentfernung ist bei diesen der primären Funktion nachgeordnet. Diese Funktion geht Nebel/Dunst direkt an: Sie entfernt gleiche Mengen an R/G/B-Farbe (verringert die Helligkeit und erhöht die Sättigung) und fügt optional die verlorene Helligkeit wieder hinzu. Sie kann außerdem Blau reduzieren, falls dieses zu dominant wird, wie es bei entferntem Dunst oft der Fall ist. Möglicherweise müssen Sie {BEREICH AUSWÄHLEN} oder {MALBEARBEITUNGEN} verwenden, um die gewünschten Bereiche präzise anzuvisieren und zu optimieren. Das obige Beispiel verwendete zwei Bereiche, die Vordergrundhügel und den Hintergrundberg. - - TOPIC: ROTE AUGEN +image: red-eyes1.png +image: red-eyes2.png - Reduziert den Rote-Augen-Effekt bei Blitzlichtaufnahmen. Es werden zwei Methoden bereitgestellt. Die erste ist schneller, kommt aber möglicherweise mit schwierigen Fällen nicht zurecht. Die zweite Methode ist robuster, benötigt aber auch mehr Zeit und Sorgfalt. Um die erste Funktion zu verwenden, klicken Sie mit der linken Maustaste ein- oder mehrmals auf ein rotes Auge, bis Sie zufrieden sind. Ist der abgedunkelte Bereich zu klein oder außermittig, klicken Sie mit der rechten Maustaste, um die Änderung rückgängig zu machen, und klicken Sie dann präziser auf die Mitte des roten Auges. Kann ein rotes Auge nicht korrekt behoben werden, klicken Sie mit der rechten Maustaste, um die Änderung rückgängig zu machen, und verwenden Sie dann die zweite Methode. Die zweite Methode kommt besser mit schwierigeren Fällen zurecht, in denen das rote Auge nur leicht rot ist und der Farbunterschied zu den Augenlidern zu gering ist, als dass der automatische Algorithmus ihn unterscheiden könnte. Platzieren Sie den Cursor über der Mitte des roten Auges. Halten Sie die linke Maustaste gedrückt und ziehen Sie den Cursor nach unten rechts. Eine gepunktete Ellipse erscheint, die das rote Auge umschließt. Wiederholen Sie dies bei Bedarf, um das rote Auge (grob) in der Ellipse zu zentrieren. Beachten Sie, dass die Form der Ellipse von der Richtung des Ziehvorgangs abhängt, was eine präzisere Umschließung nur des roten Auges ermöglichen kann. Klicken Sie wiederholt mit der linken Maustaste innerhalb der Ellipse, während Sie beobachten, wie sich das rote Auge verdunkelt, und stoppen Sie, wenn es dunkel genug ist. Gehen Sie zu weit, können sich die Augenlider zu verdunkeln beginnen. Klicken Sie mit der rechten Maustaste, um rückgängig zu machen, und wiederholen Sie bei Bedarf. - - TOPIC: INTELLIGENTES LÖSCHEN +image: smart-erase.png +image: smart-erase2.jpg - Entfernt kleine Objekte, die ein gutes Foto beeinträchtigen können, wie Stromleitungen, Müll auf dem Boden, ein Schild usw. Das unerwünschte Objekt wird durch Pixel aus dem umgebenden Bereich ersetzt. Dies ist manchmal sehr effektiv (Nebeneffekte fast unsichtbar) und manchmal nicht. Es funktioniert am besten bei kleinen oder schmalen Objekten im Foto. Radius steuert die Größe eines Kreises um den Mauszeiger, der den auszuwählenden und zu entfernenden Bereich festlegt. Ziehen Sie die Maus, um das zu entfernende Objekt zu umschließen. Ziehen mit der linken Taste wählt aus, Ziehen mit der rechten Taste hebt die Auswahl auf. Drücken Sie [Löschen], um den ausgewählten Bereich zu entfernen, wobei die Pixel durch die nächstgelegenen Pixel außerhalb der Auswahl ersetzt werden. War die Auswahl nicht präzise genug, verwenden Sie [Rückgängig], passen Sie den ausgewählten Bereich an und drücken Sie erneut [Löschen]. Wiederholte Auswahlen und Entfernungen werden akkumuliert, bis Sie [New_Area] verwenden, um eine neue Auswahl zu beginnen. Die zuvor entfernten Bereiche sind nun fest, und [Rückgängig] funktioniert nur noch für nachfolgende Auswahlen. Am besten arbeiten Sie mit einem auf 200% oder mehr gezoomten Bild. Das Steuerelement Blur fügt den Ersatzpixeln Unschärfe hinzu. Dies kann sichtbare Nebeneffekte verringern, da die Ersatzpixel schärfer als die Umgebung sein können. Ändern Sie die Blur-Einstellung und drücken Sie erneut die Schaltfläche [Löschen]. Die Schaltflächen [show] und [hide] können verwendet werden, um den Umriss der aktuellen Auswahl anzuzeigen oder auszublenden, um die Ergebnisse nach dem Entfernen besser beurteilen zu können. - Bei langen, dünnen Objekten (z. B. Stromleitungen) können Sie auf zwei Positionen klicken, und alles dazwischen wird ausgewählt. Die Auswahl erfolgt in gerader Linie, sodass Sie bei gekrümmten Objekten in Abständen klicken müssen, um der Kurve zu folgen. - - TOPIC: HALO ENTFERNEN +image: remove-halo.png +image: remove-halo2.png - Entfernt Halos, die durch einige Bearbeitungsfunktionen entstanden sind. Wählen Sie die Art des Halos: hell (am häufigsten) oder dunkel. Ziehen Sie die Maus bei gedrückter linker Taste über den Halobereich, um die Pixel innerhalb der Maus zu ändern, wie im Beispiel gezeigt. Bei einem hellen Halo verdunkeln sich die hellsten Pixel, während die Maus darübergezogen wird. Bei einem dunklen Halo hellen sich die dunkelsten Pixel auf. Verwenden Sie einen Mausradius, der größer als die Breite des Halos ist, wie im Beispiel gezeigt. Ziehen Sie die Maus bei gedrückter rechter Taste, um die ursprünglichen Pixel wiederherzustellen. - - TOPIC: JPEG-ARTEFAKTE +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - JPEG-Bilder, die stark komprimiert wurden (mit einer niedrigen Qualitätseinstellung), können Komprimierungsartefakte in Form kleiner rechteckiger Blöcke aufweisen. Wurde bei einigen Bereichen eines Fotos der Helligkeitsbereich erweitert, können solche Blöcke sichtbarer werden, da die Helligkeitsstufen größer sind (z. B. RGB-Werte von 11/12/13, 5-fach aufgehellt auf 55/60/65). Diese Funktion zeichnet die Grenzen zwischen den Blöcken weich, um sie weniger sichtbar zu machen. - 'Match Limit' bestimmt, wann benachbarte Pixel als Mitglieder desselben Pixelblocks behandelt werden. Match Limit kann auf einen niedrigeren Wert gesetzt werden, um solche Blöcke vollständiger zu erfassen. 'Contrast Limit' dient dazu, das Überblenden von Kanten mit hohem Kontrast zu verhindern, was zu Detailverlust führen würde. Ändern Sie die beiden Einstellungen und drücken Sie [anwenden]. Betrachten Sie das resultierende Bild bei >2-facher Größe und probieren Sie verschiedene Einstellungen aus, wenn Optimierung wichtig ist. Diese Funktion ist bei einem Bild, dessen Größe geändert wurde, weniger wirksam. Verwenden Sie {BEREICH AUSWÄHLEN}, um Problembereiche selektiv zu bearbeiten. - - TOPIC: KANTENGLÄTTUNG +image: anti-alias.jpg - Manchmal zeigen Fotos entlang einiger kontrastreicher Merkmalskanten Pixelbildung ('jaggies'). Im obigen Beispiel ist dies um das Auge des Vogels zu sehen. Das Anti-Aliasing-Werkzeug kann dies verringern. Der Effekt ist bei den meisten Fotos gering, da die Verarbeitung in der Kamera das Problem möglicherweise bereits behoben hat. Ein sekundärer Effekt ist, dass jpeg-Artefakte in stark komprimierten Bildern etwas geglättet werden. Bilder, deren Größe vergrößert wurde, weisen ausgeprägtere Pixelbildung auf. Diesen kann geholfen werden, besonders bei einer 2-fachen Hochskalierung. - Verwenden Sie die Schaltfläche [anwenden], um die Pixel zu unterdrücken, mehrmals, falls dies zu helfen scheint. 'Threshold' kann verwendet werden, um kontrastarme Pixel von der Verarbeitung auszuschließen. Ein Wert von 0,1 oder weniger ist meist am besten. - Fotocx verwendet den Scale3x-Algorithmus, modifiziert, um "ähnliche" und "unterschiedliche" Farbtöne anstelle von "gleich" und "ungleich" zu verwenden. - - TOPIC: RGB ANPASSEN +image: adjust-RGB.png - Ändert die Gesamthelligkeit und den Gesamtkontrast oder die von ausgewählten Farben. • Brightness - Gesamthelligkeit des Bildes erhöhen oder verringern • +Red -Cyan usw. - ändert die Farbhelligkeit und ändert die Komplementärfarbe in die entgegengesetzte Richtung • Contrast All - Gesamtbildkontrast erhöhen oder verringern • Contrast Red Green Blue - einzelne RGB-Farben bearbeiten - - TOPIC: HSL ANPASSEN +image: adjust-HSL.png - Ändert einen ausgewählten Farbbereich in einem Bild mithilfe von HSL (Hue, Saturation, Lightness). Diese Funktion kann verwendet werden, um einen Farbstich zu beheben oder eine Farbe in eine andere umzuwandeln (z. B. einen überbelichteten, zu weißen Himmel). Wenn Sie mit dem HSL-Farbmodell nicht vertraut sind, lesen Sie den entsprechenden Wikipedia-Artikel. - Beginnen Sie damit, mit Umschalt + Linksklick auf das Bild eine Zielbildfarbe zum Abgleichen und Anpassen auszuwählen. Diese Farbe wird der Mittelpunkt eines Farbbereichs, der zur Anpassung ausgewählt wird. Wählen Sie mit den Kontrollkästchen für Hue, Saturation und Lightness aus, welche Farbattribute abgeglichen werden. Jedes davon schränkt den Bereich der ausgewählten Farben ein. Ist keines aktiviert, werden alle Farben ausgewählt. Match Level kann verwendet werden, um den Bereich der ausgewählten Farben weiter zu erweitern. 100% bedeutet, dass nur eng übereinstimmende Farben ausgewählt werden. - Die Output Color-Steuerelemente (Hue, Saturation, Lightness) werden verwendet, um die neue Ausgabefarbe festzulegen, die die ausgewählten Eingabefarben ersetzt oder mit ihnen mischt. Sie können diese Farbe auch aus dem Bild festlegen, mit Umschalt + Rechtsklick. Die resultierende Farbe ist eine Mischung aus der ursprünglichen Farbe und der neuen Farbe. Der Anteil der neuen Farbe wird durch den Adjustment-Schieberegler festgelegt, der von 0 bis 100% eingestellt werden kann. Verwenden Sie die HSL-Kontrollkästchen, um festzulegen, welche HSL-Komponenten der Eingabefarbe durch die entsprechenden HSL-Komponenten der Ausgabefarbe ersetzt werden. Verwenden Sie die Schieberegler für die Ausgabefarbe HSL, um die neue Farbe anzupassen. Die Ausgabefarbe wird im kleineren Feld links angezeigt, das aktualisiert wird, während Sie die Schieberegler bewegen. - Bewegen Sie die Schieberegler und beobachten Sie die Live-Aktualisierungen des Bildes, um das Ergebnis zu optimieren. Dies ist nicht sehr intuitiv, und Übung hilft. Hinweis: Beginnen Sie damit, nach Hue und Saturation abzugleichen und nur Hue zu ersetzen - das bedeutet, dass Saturation und Lightness der Ausgabefarbe aus den ursprünglichen Bildfarben übernommen werden und nur der Farbton (Hue) ersetzt wird. - - TOPIC: STAUB ENTFERNEN +image: remove-dust.png +image: remove-dust2.jpg - Bilder von staubigen gescannten Dias können viele kleine dunkle Flecken aufweisen - Schatten des Staubs auf den Dias. Historische Fotos aus dem Internet haben oft ein ähnliches Problem. Diese Funktion kann die Mehrzahl solcher Flecken entfernen. Bewegen Sie die drei Schieberegler, bis die maximale Anzahl von Staubflecken rot eingefärbt ist, und drücken Sie dann die Schaltfläche [löschen], um sie zu entfernen. Drücken Sie [red], um die rote Ansicht wiederherzustellen, dann können Sie die Schieberegler erneut anpassen und [löschen] drücken. Der Schieberegler "spot size limit" begrenzt die Größe der zu entfernenden Flecken. Der Schieberegler "max. brightness" legt einen Schwellenwert fest, um Flecken zu ignorieren, die nicht dunkel genug sind. Der Schieberegler "min. contrast" filtert Flecken mit geringem Kontrast zu ihrer Umgebung heraus. Dieser Vorgang ist meist ein Kompromiss. Sind die Einstellungen nicht optimal, können kleine Merkmale wie Baumblätter entfernt werden, oder große Flecken bleiben zurück. Verschiedene Bildbereiche benötigen möglicherweise unterschiedliche Einstellungen, z. B. kann Himmel aggressiver behandelt werden als eine Gebäudewand. Sie können Erase Dust einfach mehrmals mit unterschiedlichen Einstellungen anwenden, um alle Staubflecken zu erfassen. Oder Sie verwenden {BEREICH AUSWÄHLEN}, um das Bild abschnittsweise zu bearbeiten. Wenn manche Flecken hartnäckig bleiben, können Sie sie manuell mit {INTELLIGENTES LÖSCHEN} behandeln. Legen Sie einen kleinen Mausradius fest und klicken Sie auf jeden Fleck, um ihn zu entfernen. Flecken von Fasern (lang und dünn) werden meist nicht automatisch entfernt, aber Intelligentes Entfernen kann hier wirksam sein. Ist der Staub hell, wie im obigen Beispiel, verwenden Sie {FARBMODUS}, um ein Farbnegativ zu erstellen, bearbeiten Sie den Staub und wiederholen Sie dann Farbnegativ, um das normale Bild wiederherzustellen. - - TOPIC: SÄUME +image: fringes.png +image: fringesA.jpg - Behebt periphere Farbsäume (laterale chromatische Aberration) - bei denen Farbsäume hauptsächlich in äußeren Bildbereichen auftreten. - Das linke Bild oben ist ein vergrößerter Ausschnitt der oberen linken Ecke eines Fotos mit lateraler chromatischer Aberration. Diese wurde im bearbeiteten Bild rechts größtenteils beseitigt. Farbsäume können entlang kontrastreicher Kanten auftreten, besonders in den äußeren Bildbereichen, wo Objektivverzerrungen meist am größten sind. Um sie zu beseitigen, zoomen Sie das Bild auf maximale Größe und zentrieren Sie auf einen Bereich mit Farbsäumen. Drücken Sie die Schaltfläche [search]. Die rote und blaue Farbebene werden neu skaliert, um sie besser an die grüne Ebene anzugleichen, und die verwendeten Faktoren werden in das Dialogfeld eingetragen. Möglicherweise können Sie das Ergebnis verbessern, indem Sie die Faktoren direkt im Dialog überarbeiten: Ändern Sie die Faktoren, während Sie die Farbsäume im Bild beobachten. - Diese Funktion ist weniger wirksam, wenn das Bild so zugeschnitten wurde, dass die Bildmitte nicht mehr mit der Mitte des ursprünglichen Fotos übereinstimmt. - - TOPIC: VERFEINERUNG-MENÜ - - TOPIC: HISTOGRAMM ABFLACHEN +image: flatten1.jpg +image: flatten2.jpg - Erhöht sichtbare Details in Bereichen mit schlechtem Kontrast. Die Pixelhelligkeit wird nach oben oder unten angepasst, um die Helligkeitsverteilung (Histogramm) für den Bereich um das Pixel gleichmäßiger zu machen. Ein kleinerer Radius (kleinerer Bereich) verstärkt den Effekt. Es gibt 5 Helligkeitszonen von der dunkelsten (1) bis zur hellsten (5). Bewegen Sie einen Schieberegler, um den Effekt für die entsprechende Zone zu erhöhen. Verwenden Sie den Schieberegler Zone A, um alle 5 Schieberegler zusammen zu bewegen und schnell ein erstes Ergebnis festzulegen. Verwenden Sie dann die anderen Schieberegler einzeln, um das Bild feinabzustimmen. - - TOPIC: LOKALER KONTRAST +image: localcon1.jpg +image: localcon2.jpg - Erhöht den Kontrast in jedem Bereich eines Bildes. Die Helligkeit jedes Pixels wird mit der durchschnittlichen Helligkeit des umgebenden Bereichs verglichen. Die Pixelhelligkeit wird angepasst, um diesen Unterschied zu erhöhen. Diese Funktion implementiert eine weit verbreitete Lehrbuchmethode. Radius bestimmt die Größe des Bereichs um jedes Pixel, der für die durchschnittliche Helligkeit verwendet wird. Power bestimmt das Ausmaß der Helligkeitsänderung. Color wird verwendet, um die Farbsättigung zu erhöhen. Sie können die bearbeitbare Kurve verwenden, um das Ausgabebild für ausgewählte Helligkeitsstufen aufzuhellen. Das Beispiel zeigt die Aufhellung der dunkleren Bereiche des Bildes. - Lokaler Kontrast kann unter bestimmten Umständen "Halos" erzeugen: +image: localcon3.jpg - Das Originalbild ist links. Auf das mittlere Bild wurde Lokaler Kontrast mit maximaler Power angewendet. Entlang der Grenze zwischen den dunklen Hügeln und dem helleren Himmel ist ein Halo zu sehen. Dies lässt sich mit einem einfachen Trick beheben (rechtes Bild). Wählen Sie die Himmelsbereiche separat mit {BEREICH AUSWÄHLEN} aus. Wenden Sie Lokaler Kontrast auf diesen Bereich an. Kehren Sie die Auswahl um und wenden Sie Lokaler Kontrast auf den Rest des Bildes an. - - TOPIC: KONTRAST VERSTÄRKEN +image: amplify-contrast.png +image: amplify-contrast2.jpg - Erhöht den scheinbaren Helligkeitsbereich eines Bildes durch Erhöhung des lokalen Kontrasts. Dies kann kontrastarme Bereiche verstärken, ohne kontrastreiche Bereiche zu ändern. Sie können auch die Bearbeitungskurve verwenden, um die Kontrastverstärkung je nach anfänglichem Kontrastbetrag zu variieren. - Der Schieberegler Amplify unter der Kurve regelt die Berechnung, von keiner Kontrastverstärkung bis zu voller Verstärkung. Wird er zu weit nach rechts bewegt, kann das Bild unschöne Artefakte zeigen, schieben Sie ihn also zurück, bis diese verschwinden. Werden gleichmäßige Bereiche (z. B. Himmel) fleckig, ziehen Sie das linke Ende der Kurve nach unten, um die Verstärkung für kontrastarme Bereiche zu verringern. In manchen Fällen ist es am besten, verschiedene Bereiche des Bildes separat auszuwählen und zu bearbeiten, z. B. zurückhaltend beim Himmel, aggressiver bei strukturierten Oberflächen wie Steinmauern. - - TOPIC: GLOBALER RETINEX +image: global-retx.png +image: global-retx2.jpg - Verbessert Farbe und Kontrast bei Bildern mit extremem Nebel/Dunst oder Farbstich (z. B. ein 100 Jahre altes Foto). Probieren Sie zuerst die Schaltfläche [Auto]. Das Bild wird durchsucht, um die hellsten und dunkelsten vorhandenen RGB-Farben zu finden. Die dunkelsten RGB-Werte werden von allen Pixeln subtrahiert, und die resultierenden RGB-Werte werden so hochskaliert, dass die maximalen RGB-Werte nahe bei 255 liegen. Dies ist natürlich anfänglich möglicherweise nicht optimal. Die Drehfelder werden auf die gefundenen dunklen und hellen RGB-Grenzwerte eingestellt, und Sie können diese ändern, um das resultierende Bild zu optimieren. Sie können Ihre eigenen dunklen und hellen Punkte wählen, indem Sie die entsprechende Option im Dialog auswählen und auf das Bild klicken. Die Multiplikator-Drehfelder sind standardmäßig auf 1,0 eingestellt, und Sie können diese Werte ändern, um die relative Helligkeit jeder RGB-Farbe anzupassen. Im obigen Beispiel ist das 1. Bild das Original, das 2. Bild wurde mit der Schaltfläche [Auto] erstellt. Die rechte Spalte der Drehfelder passt alle Schaltflächen in derselben Zeile gemeinsam an - verwenden Sie das Mausrad oder die Pfeiltasten nach oben/unten auf der Tastatur. - Der Schieberegler blend wird verwendet, um das Eingabebild und das Retinex-Bild in einem beliebigen Verhältnis zu mischen. Der Schieberegler reduce bright wird verwendet, um den Effekt für hellere Bildbereiche abzuschwächen, besonders den Himmel, wo Retinex seltsam aussehende Ergebnisse erzeugen kann. - Der Algorithmus wurde aus Konzepten abgeleitet, die erstmals in den 1970er Jahren von Edwin Land veröffentlicht wurden. Suchen Sie im Internet nach 'retinex' für weitere Informationen. - - TOPIC: LOKALER RETINEX +image: local-retx.png +image: local-retx2.jpg - Erhöht sichtbare Details in dunklen Bildbereichen und anderen Bereichen mit geringem Kontrast. Der Helligkeitsbereich einer Zone um jedes Pixel wird verwendet, um die Pixelhelligkeit so neu zu skalieren, als würde die gesamte Zone auf den gesamten Helligkeitsbereich 0-255 neu skaliert. Lokaler Retinex kann dramatische Ergebnisse erzielen, wo Globaler Retinex schwach ist. - Die Eingabe radius bestimmt die ungefähre Zonengröße um jedes Pixel. Der Schieberegler blend wird verwendet, um das Eingabebild und das Retinex-Bild in einem beliebigen Verhältnis zu mischen. Der Schieberegler reduce bright wird verwendet, um den Effekt für hellere Bildbereiche abzuschwächen, besonders den Himmel, wo Retinex seltsame Ergebnisse erzeugen kann. Der Schieberegler reduce dark tut dasselbe für dunklere Bildbereiche. Das obige Beispiel besteht aus etwa 60% Originalbild + 40% Retinex. - - TOPIC: SÄTTIGUNG +image: saturation.png - Passt die Farbsättigung basierend auf der Pixelhelligkeit an. Die Y-Achse der Bearbeitungskurve ist die Farbsättigung, von Nullfarbe (alle RGB-Werte gleich) bis maximaler Farbe (niedrigster RGB-Wert ist null). Die X-Achse der Kurve ist die Pixelhelligkeit, von dunkel bis maximaler Helligkeit. Die neutrale Position (keine Farbänderung) ist der mittlere Wert, der auch der Anfangswert ist. Beispiel: Um die Farbintensität dunkler Bereiche im Bild zu erhöhen, heben Sie das linke Ende der Kurve an. Der Schieberegler Saturation bewegt die gesamte Kurve nach oben oder unten, ohne ihre Form zu ändern. - - TOPIC: WEICHZEICHNUNG +image: soft-focus2.jpg +image: soft-focus.png - Wendet den klassischen "Weichzeichner"-Effekt auf ein Foto an. Dies ist eine Mischung aus einem scharfen und einem leicht weichgezeichneten Bild. Die Einstellung radius bestimmt das Ausmaß der Weichzeichnung (Pixelspanne), und die Einstellung mix legt den Anteil des weichgezeichneten Bildes im gemischten Ausgabebild fest, von 0 bis 100 Prozent. Sie können {MALBEARBEITUNGEN} mit dieser Funktion verwenden, um den Effekt für verschiedene Bereiche des Bildes zu variieren. - - TOPIC: HELLIGKEITSVERLAUF +image: brite-ramp1.png +image: brite-ramp2.png - Variiert Helligkeit oder Farbe über ein Bild hinweg. Sie können dies verwenden, um ungleichmäßige Beleuchtung oder einen Farbstich auszugleichen, der über das Bild variiert. Die Änderungsrichtung wird durch Zeichnen einer Linie auf dem Bild festgelegt. Erstellen Sie die Linie durch Klicken auf das Bild, ziehen Sie dann an einem der Enden, um die gewünschte Richtung festzulegen. Im obigen Beispiel wurde Grün in Richtung der Linie erhöht. Bearbeiten Sie zuerst die All-Kurve, um die Gesamthelligkeit anzupassen (alle Farben), und passen Sie dann bei Bedarf die einzelnen RGB-Farbkurven an. - - TOPIC: VIGNETTE +image: vignette.png +image: vignette2.jpg - Korrigiert die manchmal in den Ecken eines Fotos sichtbare Abdunkelung. Sie kann auch verwendet werden, um ein Objekt oder einen Bereich innerhalb eines Bildes hervorzuheben oder einzufärben. - Klicken oder ziehen Sie mit der Maus auf das Bild, um den Vignettenmittelpunkt zu ändern, der sich anfänglich in der Mitte des Bildes befindet. - Wählen Sie 'Brightness', um die Helligkeit des Bildes in einem radialen Muster zu ändern: Passen Sie das linke oder rechte Ende der Kurve an, um die Helligkeit der Mitte bzw. der Ränder des Bildes zu ändern. Sie können einem Porträtgesicht eine dunkle Umgebung geben oder ein Bild mit abgedunkelten Ecken korrigieren. Die mittlere Kurvenebene entspricht keiner Änderung. Verwenden Sie niedrigere Werte zum Abdunkeln und höhere Werte zum Aufhellen. Das obige Beispiel dunkelt den Bildrand allmählich ab, während ein breiter zentraler Bereich unverändert bleibt. - Wählen Sie 'Color', um dem Bild eine gewählte Farbe in einem radialen Muster hinzuzufügen. Kurvenwerte von null bedeuten keine Änderung, höhere Werte fügen dem Bild die gewählte Farbe hinzu. Der höchste Wert entspricht 100% Farbe. Verwenden Sie diese Funktion, um einem Bild eine Farbumgebung hinzuzufügen, z. B. ein Gesicht mit einer allmählich zunehmenden Farbe zu umgeben. - - TOPIC: EFFEKTE-MENÜ - - TOPIC: UMRISSE +image: outlines1.png +image: outlines2.jpg - Wandelt ein Foto in eine Umrisszeichnung um. Kontrastreiche Pixel werden verstärkt und kontrastarme Pixel unterdrückt. Die Einstellung threshold legt die Kontrastschwellenwerte fest. Linien unterhalb des Minimums werden nicht angezeigt, und solche oberhalb des Maximums erhalten maximale Helligkeit. Das Kontrollkästchen 'black/white' wandelt farbige Linien in Schwarz auf Weiß oder Weiß auf Schwarz um, je nach Kontrollkästchen 'negative'. Verwenden Sie 'Low Amplify', um bei Bedarf verblasste Linien aufzuhellen. 'Mode B' führt im Vergleich zu 'Mode A' zu einer gleichmäßigeren Linienhelligkeit. - - TOPIC: SKIZZE1 +image: sketch1.jpg - Wandelt ein Foto in etwas wie eine Skizze um. Dunkle Pixel werden zu weniger Pixeln zusammengefasst, wodurch freigewordene Bereiche heller wirken. Contrast kann auch als Ersatz für dunkle Pixel verwendet werden. Threshold kann verwendet werden, um das Eingabebild nach Helligkeit zu filtern. Clip Level wird verwendet, um die Ausgabe zu filtern und isolierte oder geringfügig dunkle Pixel weiter zu reduzieren. Wählen Sie Farben für Vordergrund und Hintergrund. Das Verkleinern des Eingabebildes kann interessante Ergebnisse liefern. Wirkt das Ergebnis "unsauber", verwenden Sie {ENTRAUSCHEN} oder {FUSION}, um das Bild vor der weiteren Bearbeitung hier zu glätten. - - TOPIC: SKIZZE2 +image: sketch2.png +image: sketch2b.jpg - Wandelt ein Foto in etwas wie eine Skizze um. Es wird eine andere Methode verwendet: Pixel mit niedrigem ... hohem Kontrast werden entsprechend in helle ... dunkle Pixel umgewandelt. Die Kurve kann verwendet werden, um die Stärke der Kontrastumwandlung zu erhöhen oder zu verringern. Die X-Achsen-Skala ist der Pixelkontrast, von niedrig bis hoch, und der Y-Wert bestimmt die Stärke der Umwandlung. Das Beispiel zeigt, wie kontrastarme Pixel unterdrückt (aufgehellt) werden. Das Eingabebild kann in einem beliebigen Verhältnis eingemischt werden. Wirkt das Ergebnis "unsauber", verwenden Sie {ENTRAUSCHEN} oder {FUSION}, um das Bild vor der weiteren Bearbeitung hier zu glätten. - - TOPIC: CARTOON +image: cartoon.jpg - Wandelt ein Foto in eine cartoonartige Zeichnung um. Schwarze Linien werden über Merkmalskanten im Bild gezeichnet, überall dort, wo sich Helligkeit oder Farbe abrupt ändern. Line Threshold legt die Empfindlichkeit für die Kantenerkennung und das Zeichnen von Linien fest und bewirkt, dass weniger oder mehr Linien gezeichnet werden. Line Width macht die Linien dicker oder dünner. Kuwahara Depth steuert eine Schärfungsfunktion, die Merkmalskanten innerhalb des Bildes verstärken kann. - - TOPIC: PRÄGUNG +image: emboss2.jpg +image: emboss.png - Wandelt ein Bild in ein simuliertes Relief- oder Prägebild um (ein 3D-Effekt). Merkmalskanten werden auf einer Seite heller und auf der gegenüberliegenden dunkler gemacht, als wären sie angehoben und von der Seite beleuchtet. Die Einstellung radius bestimmt die Breite des Effekts, und die Einstellung depth bestimmt die Intensität. Die Einstellung Light Source bestimmt den Winkel, aus dem die scheinbare Beleuchtung kommt. Dies kann variiert werden, um den Effekt für Merkmalskanten zu maximieren, die am stärksten senkrecht zu diesem Winkel stehen. - - TOPIC: KACHELN1 Wandelt ein Bild in eine Anordnung einfarbiger Kacheln um. Sie können die Kachelgröße und die Dicke des Zwischenraums zwischen den Kacheln steuern. Dies wird auch 'pixelate' genannt. Verwenden Sie Bereich auswählen, um die Umwandlung auf einen begrenzten Bereich zu beschränken, z. B. ein Gesicht. - - TOPIC: KACHELN2 +image: tiles2a.png +image: tiles2b.png - Wandelt ein Bild in unregelmäßige Kacheln um, die sich grob an die Farben und Konturen des Bildes anpassen. ^base size:^ Die Kachel-Basisgröße, die Einheit-Kachelgröße, die zum Erstellen größerer Kacheln verwendet wird. ^color depth:^ Anzahl der zu verwendenden Farben: 1 = 8 Farben, 2 = 64 Farben ... 8 = 16 Millionen Farben. ^tile area goal^: Die Obergrenze der Kachelgröße (Fläche in Pixeln). ^req. color match^: Legt die minimal erforderliche Farbübereinstimmung fest, damit ein kleinerer Bereich in einen angrenzenden größeren Bereich zusammengeführt wird: 0 = beliebig (maximale Zusammenführung), 100 = perfekte Übereinstimmung erforderlich (minimale Zusammenführung). - - TOPIC: MALEREI +image: painting1.png +image: painting2.png - Wandelt ein Bild in etwas Ähnliches wie ein Gemälde um. Dabei wird die Anzahl der Farben reduziert, jeder zusammenhängende Pixelbereich mit derselben Farbe erfasst und anschließend kleinere Bereiche in angrenzende größere Bereiche mit der besten Farbübereinstimmung zusammengeführt. - ^blur radius^: Zeichnet das Bild vor der Bearbeitung weich. Dies führt zu glatteren Grenzen. ^color depth^: Anzahl der zu verwendenden Farben: 1 = 8 Farben, 2 = 64 Farben ... 8 = 16 Millionen Farben. ^patch area goal^: Legt eine Untergrenze für Bereiche fest, die eine eigene Farbe erhalten: Bereiche, die kleiner als diese Pixelanzahl sind, werden in einen angrenzenden Bereich mit der nächstliegenden Farbübereinstimmung aufgenommen. ^required color match^: Legt die minimal erforderliche Farbübereinstimmung fest, damit ein kleinerer Bereich in einen angrenzenden größeren Bereich zusammengeführt wird: 0 = beliebig (maximale Zusammenführung), 100 = perfekte Übereinstimmung erforderlich (minimale Zusammenführung). ^borders^: Legt fest, ob die farbigen Bereiche mit einem dünnen schwarzen Rand abgegrenzt werden, wie unregelmäßige Kacheln in einem Mosaik. Nach Verwendung dieser Funktion kann {PRÄGUNG} interessante Textur zum Bild hinzufügen. - - TOPIC: TEXTUR +image: texture2.jpg +image: texture.png - Fügt einem Bild oder ausgewählten Bereichen innerhalb eines Bildes eine strukturierte Oberfläche hinzu. Radius bestimmt die Größe des Texturmusters. Strength bestimmt die Intensität des Musters, von fast unsichtbar bis dominant. - - TOPIC: FUSION +image: fusion.png +image: fusion2.jpg - Unterdrückt kleine, kontrastarme Details in einem Bild, während die Schärfe größerer Bildmerkmale erhalten bleibt. Drücken Sie [Start] und beobachten Sie das Bild genau. Der Vorgang läuft fortlaufend, bis er mit der Schaltfläche [stopp] beendet wird. Kleine Details verblassen langsam. Die Beschriftung 'count' im Dialogfeld zeigt die Iterationsanzahl an. Sie können den Vorgang mit [stopp] anhalten, um das Bild zu prüfen, und dann mit [Start] fortsetzen. Verwenden Sie die Rückgängig/Wiederholen-Schaltfläche, um den Vorher-/Nachher-Bildstatus zu vergleichen. Setzen Sie die Bearbeitung mit [Start] fort. Die Schaltfläche [Schritt] kann verwendet werden, um jeweils einen Schritt zu bearbeiten. - - TOPIC: FARBEN ABGLEICHEN +image: match-colors.png - Gleicht die Farben eines Bildes an die eines anderen an. Ein kleiner, durch Mausklick ausgewählter Punkt wird aus jedem Bild entnommen. Der Punkt im 2. Bild wird so angepasst, dass er dieselbe durchschnittliche Farbe (RGB-Werte) wie der Punkt aus dem 1. Bild hat. Die zum Angleichen der RGB-Werte verwendeten Faktoren werden dann auf alle Pixel im 2. Bild angewendet. Eine übliche Anwendung ist das Entfernen eines Farbstichs aus einem Bild, indem ein Punkt im Bild markiert wird, der einer Farbe aus einem anderen Bild entsprechen soll. - Vorgehensweise: Der Dialog listet 5 nacheinander auszuführende Schritte auf. • Legen Sie einen Radius für den Probenbereich fest. Der resultierende Mauskreis ist der zu erfassende Probenbereich. • Öffnen Sie das 1. Bild, indem Sie die Schaltfläche [open] drücken. • Klicken Sie auf das Bild, um eine Farbprobe zu entnehmen. • Öffnen Sie das 2. Bild, indem Sie die Schaltfläche [open] drücken. • Klicken Sie an der Stelle im Bild, die dem 1. Bild angeglichen werden soll. Die Bildfarben ändern sich innerhalb von ein bis zwei Sekunden. - - TOPIC: MUSTER +image: pattern2.jpg +image: pattern1.png - Fügt einem Bild ein Hintergrundmuster hinzu. Eine kleine Bilddatei (Musterdatei) wird verwendet, um das aktuelle Bild durch Duplizieren der Datei zu bedecken, wie eine gekachelte Wand. Diese Datei kann ein echtes Muster sein (z. B. ein Bild von Leinwandstoff, einer Ziegelwand, einer sich wiederholenden Geometrie ...) oder jede andere Art von Bild. Das Muster wird halbtransparent gemacht, sodass das Basisbild über dem Muster gedruckt zu sein scheint, oder das Muster über dem Bild. Viele Musterdateien lassen sich mit einer Websuche nach "pattern image" finden. Laden Sie einige davon herunter und schneiden Sie sie bei Bedarf auf eine Größe von etwa 200-500 Pixel zu. Fügen Sie diese der Einfachheit halber zu den mitgelieferten Musterdateien in ~/.fotocx/patterns hinzu. - Verwenden Sie die Schaltfläche [Durchsuchen], um eine Musterdatei auszuwählen. Das gewählte Muster wird gekachelt, um das Basisbild zu bedecken. Das Muster ist teilweise transparent, sodass das Basisbild durchscheint. Verwenden Sie Zoom, um die Mustergröße zu vergrößern oder zu verkleinern. Es gibt zwei Methoden, um das Muster mit dem Basisbild zu mischen. Die Musterdeckkraft kann auf 0-100% eingestellt werden. Das Basisbild wird verwendet, um die ungenutzte Deckkraft zu füllen. Contrast wird verwendet, um die Helligkeit des Basisbildes anhand der Musterhelligkeit als Vorlage zu ändern. Die beiden Parameter können in einem beliebigen Verhältnis gemischt werden. - Enthält die Musterdatei ein Bild, das sich in festen Abständen sowohl horizontal als auch vertikal wiederholt, kann die Schaltfläche [Berechnen] verwendet werden, um Breite und Höhe so festzulegen, dass ein durchgehendes Muster ohne sichtbare Nähte entsteht. - Ist das Muster unregelmäßig und Nähte sind sichtbar, können Sie dies möglicherweise verbessern. Die beiden Overlap-Werte bestimmen, wie stark sich die duplizierten Muster an den Rändern überlappen, horizontal und vertikal. Fügen Sie etwas Überlappung hinzu, um Randeffekte zu kaschieren. - Bereich auswählen kann verwendet werden, um ein Muster auf einen Teil eines Bildes anzuwenden, oder verschiedene Muster auf verschiedene Teile. Nach dem Anwenden eines Musters auf ein Bild könnte es interessant sein, {PRÄGUNG} zu verwenden, um dem Muster einen 3D-Effekt zu verleihen. - Das Kontrollkästchen "Grayscale" wandelt ein Farbmuster in Graustufen um. - - TOPIC: SCHRAFFUR +image: crosshatch2.jpg +image: crosshatch1.png - Wandelt ein Bild in eine Zeichnung mit sich kreuzenden parallelen Linien um. Geben Sie eine Rastergröße ein und drücken Sie [anwenden]. - - TOPIC: DITHERN +image: dither1.png - +image: dither2.jpg - Diese Funktion bietet mehrere Möglichkeiten, ein Bild zu dithern - in Punkte umzuwandeln. 0 - farbige Punkte im Stil von Roy Lichtenstein 1 - reines R/G/B oder Schwarzweiß mit zufälliger oder optimierter räumlicher Verteilung 2 - RGB-Mischung mit einer gegebenen Bittiefe 3 - klassisches Dithering mit einer benutzerdefinierten Farbpalette 4 - Bild zu Blobs mit der mittleren Farbe der zusammengefassten Pixel verdichten - Die klassischen Dithering-Methoden verwenden die Floyd-Steinberg-Methode zur Kompensation von Farbfehlern: Abweichung zwischen einer Eingabebildfarbe und der nächstgelegenen Farbe aus der Palette. Punkte mit ähnlichen Farben werden bei Bedarf eingemischt, sodass der Durchschnitt über einen Bereich der Eingabefarbe genauer entspricht. Die Fehlerkompensation kann bei Bedarf deaktiviert werden, um deutliche Farbbänder oder Konturen zu erhalten. - Blobs: Bildpixel durchlaufen eine Art "gravitativen Kollaps" und ballen sich um lokale Massenzentren zusammen. 'Mass' ist definiert als Pixelhelligkeit. Das Steuerelement 'radius' legt grob die Anziehungsreichweite fest. Drücken Sie [Start], um den Kollaps zu beginnen. Beobachten Sie, wie sich das Bild langsam in Blobs verwandelt, die ungefähr die Größe der Eingabe 'radius' haben. Wenn die Blobs schön rund sind und sich kaum noch ändern, drücken Sie [stopp], um den Vorgang zu beenden. - - TOPIC: GRAVUR +image: engrave.png +image: engrave2.png - Wandelt ein Bild in Schwarzweiß-Linien um. Die Eingabe Size bestimmt die Linienstärke und wie viele vertikale Bildpixel für jede vertikale Pixelspalte in den Ausgabelinien verwendet werden. Die Linienpixelspalten werden in schwarze und weiße Teile aufgeteilt, deren Anteil grob der mittleren Helligkeit der Eingabepixel entspricht. Die Eingabe Bias kann verwendet werden, um die Gesamthelligkeit zu optimieren. Negative/positive Werte machen das Bild dunkler/heller. Die Eingabe Color (0-100%) kann verwendet werden, um den weißen Teilen Farbe hinzuzufügen. - - TOPIC: GLANZ HINZUFÜGEN +image: addglare.png +image: addglare2.jpg - Fügt von hellen Stellen in einem Bild ausstrahlendes Blendlicht hinzu. Power: bestimmt die relative Helligkeit des Blendlichts Limit: Schwellenwert-Pixelhelligkeit, ab der Blendlicht ausgestrahlt wird Range: Pixelreichweite des Blendlichts von den ausstrahlenden Pixeln Pixel mit einer Helligkeit über dem Limit (200-255) strahlen Blendlicht aus. Helligkeit bedeutet hier die Helligkeit der hellsten RGB-Farbe in einem Pixel. Das ausgestrahlte Blendlicht hat die Farbe des ausstrahlenden Pixels. Range wird in Pixeleinheiten angegeben. Das Blendlicht ist am ausstrahlenden Pixel maximal und nimmt zur Reichweitengrenze hin auf null ab. - - TOPIC: MOSAIK +image: mosaic1.png +image: mosaic2.jpg - Erstellt ein Mosaikbild aus Kacheln, die aus all Ihren Bildern erstellt werden. - Geben Sie die Kachelgröße in Pixeln an (z. B. 36 x 24) und drücken Sie [Kacheln]. Kacheln werden aus all Ihren Bildern erstellt (tatsächlich werden aus Geschwindigkeitsgründen die Thumbnail-Bilder verwendet). Ändern Sie die Kachelabmessungen, drücken Sie erneut [Kacheln], um die Kacheln neu zu erzeugen. Nachdem die Kacheln erstellt wurden, drücken Sie [Bild], um das aktuelle Bild mit diesen Kacheln in ein Mosaik umzuwandeln. Kacheln werden ausgewählt, indem die durchschnittliche Kachelfarbe mit der durchschnittlichen Bildfarbe an der Kachelposition abgeglichen wird. Sind Tausende von Bildern verfügbar und ist die Farbpalette gut genug, wird das Mosaik recht gut ausfallen. Zoomen Sie in einen beliebigen Teil des Bildes, um die Kachelbilder zu sehen. - Der Schieberegler Tile blending bewirkt, dass das Bild mit den Kacheln überblendet wird, wodurch es besser aussieht, wenn die Kacheln farblich schlecht passen. Liegt die Überblendung unter etwa 50%, bleiben die Kacheln fast so klar wie zuvor, da das Auge den falschen Farbton ausgleicht. - Nachdem ein Mosaik erstellt wurde, können Sie auf eine beliebige Kachel klicken, um ein größeres Popup-Bild zu erhalten. Wird ein gespeichertes Mosaik geöffnet, funktioniert das Klicken auf die Kacheln für ein größeres Bild nicht. Das Neuerzeugen des Mosaiks geht recht schnell, tun Sie dies also, wenn die Popups funktionieren sollen. - - TOPIC: RAUSCHEN HINZUFÜGEN +image: add-noise.png - Fügt einem Bild zufälliges Farbrauschen hinzu. Legen Sie eine Ziel-Fleckengröße von 1-10 und einen Rauschpegel von 0-100% fest. Bei 100% wird jedem RGB-Wert jedes Pixels zufälliges Rauschen im Bereich -127 bis +127 hinzugefügt. Der Mittelwert ist null. Überläufe außerhalb des Bereichs 0-255 werden abgeschnitten. Die durchschnittliche Farbe über einen großen Bereich bleibt erhalten, wobei das Rauschen überlagert wird. Sie können Rauschen hinzufügen mit Bereich auswählen oder Bearbeitungen malen verwenden, um Rauschen zu ausgewählten Bereichen hinzuzufügen. - ^Unterdrückung von 'Banding' In Bildbereichen, in denen die Helligkeitsverteilung 'gestreckt' wurde, kann in Bereichen mit nahezu gleichmäßiger Helligkeit und Farbe sichtbares 'Banding' auftreten. Sie können dieses Problem verringern, indem Sie betroffenen Bereichen Rauschen (oder Weichzeichnung) hinzufügen. - - TOPIC: FARBEN FESTLEGEN +image: set-colors1.jpg +image: set-colors2.jpg - Sie können die Anzahl der im Bild verwendeten Farben reduzieren, um einen Poster-Effekt zu erzeugen. Legen Sie jede RGB-Farbe einzeln fest, oder passen Sie die Gesamtfarbanzahl an. Farbbittiefe wird hierfür nicht verwendet. Einige Funktionen in Fotocx verwenden Bittiefe, wodurch verfügbare Farben auf 2, 4, 8 ... pro RGB-Farbe begrenzt werden. Diese Funktion ist in dieser Hinsicht nicht begrenzt. Das obige Beispiel verwendet 8 Rot-, 5 Grün- und 3 Blaufarben. - - TOPIC: FARBEN VERSCHIEBEN +image: shift-colors.png - Diese Funktion kann verwendet werden, um Farben zu korrigieren oder ein Bild in Falschfarben umzuwandeln. Wählen Sie eine der drei RGB-Farben und bewegen Sie den Schieberegler von der Mitte aus nach links oder rechts. Eine der beiden anderen Farben wird schrittweise ersetzt. Sie können beispielsweise Rot allmählich durch Grün oder Blau ersetzen. Der Schieberegler All verschiebt alle Farben gemeinsam. Tun Sie dies zuerst, um ein erstes Optimum zu finden, und verschieben Sie dann die RGB-Farben einzeln. - - TOPIC: FREMDE FARBEN +image: alien-colors2.jpg +image: alien-colors1.png - Bemalt ein Bild oder einen ausgewählten Bereich mit zufälligen fremdartigen Farben neu. Sie können die grobe Mustergröße und die Intensität steuern (von kaum sichtbar bis dominant). Drücken Sie [Anwenden], um eine neue Farbverteilung zu erhalten. - - TOPIC: BENUTZERDEFINIERTER KERNEL +image: custom-kernel.png - Wendet einen benutzerdefinierten Faltungskernel auf ein Bild an. Die zugrunde liegende Technologie wird auf Wikipedia erklärt. Geben Sie eine Kernelgröße, einen Multiplikationsfaktor, einen Additionsfaktor ein und füllen Sie die Tabellenwerte aus. [Anwenden] wendet den Kernel auf das Bild an. [Zurücksetzen] stellt den ursprünglichen Bildstatus wieder her. Die Werte können in einer Datei gespeichert und später über die Schaltflächen [Speichern] und [Laden] abgerufen werden. Anfänglich sind mehrere Kernel-Beispieldateien verfügbar. Sie können diese ändern und unter einem benutzerdefinierten Namen speichern. - Mathematik: Die Helligkeitswerte für jeden N-mal-N-Block von Pixeln im Bild werden mit den entsprechenden Werten in der Kernel-Matrix multipliziert und addiert. Diese Zahl wird mit dem Multiplikationsfaktor multipliziert, und der Additionsfaktor wird hinzugefügt. Dieser Endwert wird zur neuen Helligkeitsstufe für das Bildpixel in der Mitte des N x N-Blocks. - - TOPIC: VERZERREN-MENÜ - - TOPIC: BEGRADIGEN +image: unbend1.png +image: unbend2.jpg - Panoramen von nahen Motiven (typischerweise Gebäude oder Innenräume) können gekrümmte gerade Linien oder geneigte Gebäude zeigen. Das Verzerren der Bilder war im Panorama-Prozess notwendig, damit die Bilder zusammenpassen. Die Funktion Begradigen kann anschließend verwendet werden, um das Panoramabild bei Bedarf zu begradigen. Vertikale und horizontale gepunktete Linien werden über das Bild gezeichnet und zeigen die Begradigungsachsen. Klicken oder ziehen Sie mit der Maus nahe dem Ende einer Linie, um sie zu verschieben. Werden Werte in den vier Eingabesteuerelementen geändert, wird das Bild in der durch die entsprechenden vier Bilder angezeigten Weise verzerrt. Erhöhen oder verringern Sie die Werte und wiederholen Sie dies, bis Sie zufrieden sind. Verschieben Sie die Achsen, um die Verzerrungsmittelpunkte zu ändern. - Siehe auch {BILD VERZERREN} für eine weitere Methode zur Korrektur von Bildkrümmung und Perspektive. - - TOPIC: PERSPEKTIVE +image: perspective2.jpg +image: perspective1.png - Diese Funktion kann verwendet werden, um ein aus einem versetzten Winkel aufgenommenes Foto zu begradigen. Das linke Bild ist das Originalfoto, aufgenommen rechts von der Mitte, um Reflexionen zu vermeiden. Das rechte Bild ist die begradigte Version. Diese Funktion kann auch verwendet werden, um ein hohes Gebäude zu begradigen, das von der Straßenebene oder von der Seite aus fotografiert wurde. - Klicken Sie auf die vier Ecken des Tetraeders, das Sie in ein Rechteck umwandeln möchten (im obigen Fall die vier Ecken des Gemäldes oder Rahmens), und wählen Sie dann [Anwenden]. Die angeklickten Ecken werden mit kleinen weißen Kästchen markiert, die "A, B, C, D" enthalten. Die obere linke Ecke jedes Kästchens markiert präzise die Bildposition. Klicken in der Nähe eines Kästchens verschiebt es an die neue Position. Sie können die Pfeiltasten der Tastatur verwenden, um die Eckmarkierungen in 1-Pixel-Schritten zu verschieben. Die Pfeiltasten wirken auf die zuletzt angeklickte oder verschobene Ecke. - - TOPIC: BILD VERZERREN +image: warps4.jpg - - TOPIC: BEREICH VERZERREN Diese Funktion kann verwendet werden, um Verzerrungen innerhalb eines Bildes zu erzeugen. Sie können einen Bildbereich auswählen und mit der Maus ziehen, um diesen Bereich im Verhältnis zum Rest des Bildes zu dehnen. Das Bild verhält sich wie Gummi. Beginnt der Mausziehvorgang innerhalb des ausgewählten Bereichs, wird der Bereich innerhalb seiner aktuellen Grenzen verzerrt - die Bewegung ist am Mauszeiger maximal und nimmt zu den Bereichsrändern hin auf null ab. Beginnt der Mausziehvorgang außerhalb des ausgewählten Bereichs, können die Bereichsränder in der Nähe der Maus über die ursprüngliche Bereichsgrenze hinaus gezogen werden. Viele Mausziehvorgänge unterschiedlicher Länge und Richtung können kombiniert werden, um die gewünschten Ergebnisse zu erzielen. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - Diese Funktion ist nützlich, um Perspektivprobleme zu korrigieren. Ziehen Sie das Bild mit der Maus von einer Stelle nahe einer Ecke. Das Bild wird elastisch von dieser Ecke aus gezogen, während die anderen Ecken fest bleiben. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - Diese Funktion ist nützlich, um Perspektivprobleme zu korrigieren. Ziehen Sie das Bild mit der Maus vom Inneren aus. Das Bildinnere wird elastisch gezogen, während die Ränder fest bleiben. - - TOPIC: GEKRÜMMT VERZERREN Diese Funktion ist nützlich, um Perspektivprobleme zu korrigieren (siehe auch {BEGRADIGEN}). Ziehen Sie das Bild mit der Maus von einer beliebigen Position aus. Das gesamte Bild wird in Richtung der Maus gezogen oder geschoben, wobei Bereiche in der Nähe der Maus stärker bewegt werden als weiter entfernte Bereiche. Sie können gekrümmte Linien begradigen oder das Bild absichtlich krümmen. Das Steuerelement 'warp span' bestimmt den Verzerrungsradius um die Maus. 1,0 bedeutet, dass das gesamte Bild verzerrt wird, und kleinere Werte beschränken die Verzerrung auf kleinere Bereiche um die Maus. - - TOPIC: AFFIN VERZERREN Diese Funktion kann verwendet werden, um ein Bild auf interessante Weise zu verzerren. Ziehen Sie das Bild mit der Maus von einer Ecke oder einem Rand aus. Die Änderungen sind rein linear, sodass gerade Linien gerade bleiben. Diese Transformation wird "affin" genannt. Details lassen sich über eine Websuche finden. - - TOPIC: RADIAL VERZERREN +image: warp_radial.png - Fügt tonnen- oder kissenförmige Verzerrung hinzu oder entfernt sie. Tonnenförmige Verzerrung ist häufig in RAW-Bildern zu sehen, die nicht zur Entfernung dieser Verzerrung verarbeitet wurden. Klicken Sie mit der linken Maustaste, um einen Mittelpunkt zu wählen, um den herum Änderungen zentriert werden - normalerweise die Bildmitte. Dies ist die Standardeinstellung. Bewegen Sie den Schieberegler 'stretch', um das Bild zu krümmen. - - TOPIC: NAHAUFNAHME ENTZERREN +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - Nahaufnahmen von Gesichtern sind oft verzerrt, da Bereiche näher an der Kamera im Foto größer erscheinen als weiter entfernte Bereiche. Diese Funktion kann verwendet werden, um die Verzerrung umzukehren. Verwenden Sie zuerst {BEREICH AUSWÄHLEN}, um das Gesicht auszuwählen (muss nicht genau sein). Klicken Sie auf das Bild in der Nähe der Verzerrungsmitte (obiges Beispiel: rechte Wange). Bewegen Sie den Schieberegler zur Optimierung. - - TOPIC: WELLEN ERZEUGEN +image: make-waves2.jpg +image: make-waves1.png - Diese Funktion verzerrt ein Bild in ein Wellenmuster, als würde es durch aufgewühltes Wasser betrachtet. Der Dialog ermöglicht es Ihnen, die mittlere horizontale und vertikale Wellenlänge, Amplitude und Varianz zu ändern. Die Eingabe "perspective" ermöglicht es, dass die Wellenlängen von oben nach unten allmählich zunehmen. - - TOPIC: VERDREHEN +image: twist1.png +image: twist2.png - Diese Funktion verdreht das Bild um einen mit Mausklick oder -zug gewählten Punkt. Klicken Sie auf die gewünschte Position und bewegen Sie den Schieberegler Twist um den gewünschten Betrag. Sie können die Maus auch um das Bild ziehen, um den Verdrehungsmittelpunkt zu ändern. Der Schieberegler Center hebt die Verdrehung des zentralen Bereichs relativ zum Rest auf. Der Schieberegler Angle dreht das Bild. - - TOPIC: KUGEL +image: sphere2.jpg +image: sphere.png - Erstellt eine sphärische Projektion eines Bildes. Ziehen Sie die Maus auf dem Bild, um den Mittelpunkt der Projektion zu ändern (standardmäßig der Mittelpunkt). Das Steuerelement flatten verändert die Projektion schrittweise von einer Kugel (rechts) zu einem flachen Bild (links). Der Schieberegler magnify vergrößert das resultierende Bild bis zum 2-fachen. - - TOPIC: INNEN NACH AUSSEN +image: inside-out2.jpg +image: inside-out1.png - Diese Funktion kehrt die Mitte-Rand-Abstände jedes Pixels um. Sie können mit der Maus klicken oder ziehen, um den Mittelpunkt zu variieren. - - TOPIC: TINY PLANET +image: tiny-planet.jpg - Wickelt ein Bild um einen Kreis. Handelt es sich beim Bild um ein 360-Grad-Panorama, ist keine sichtbare Naht vorhanden. • Center Hole: das Bild wird um ein zentrales Loch gewickelt. • Cut Top: einen oberen Rand vom Eingabebild entfernen. • Cut Bottom: einen unteren Rand vom Eingabebild entfernen. • Reverse R: das Eingabebild vertikal spiegeln. • Reverse Theta: das Eingabebild horizontal spiegeln. • Rotate: das Ausgabebild um die Mitte drehen. - - TOPIC: ESCHER-SPIRALE +image: escher-spiral.png +image: escher-spiralA.png - Wandelt ein Bild in eine endlose, nach innen führende Spirale um, wie die berühmte Uhr von M.C. Escher. Width bestimmt die Anfangsbreite der äußersten Schicht. Rim bestimmt die Anfangsbreite des Randes, der die Schichten trennt, und Color bestimmt dessen Farbe. Der Standardmittelpunkt ist die Bildmitte. Klicken Sie auf das Bild, um einen neuen Mittelpunkt festzulegen. - - TOPIC: FOTO ABFLACHEN +image: flatten-photo1.png +image: flatten-photo2.jpg - ^Buchseite oder andere gekrümmte Oberfläche Flacht ein Foto eines Bildes auf einer gekrümmten Oberfläche ab, z. B. um eine Säule herum, oder eine Seite aus einem aufgeschlagenen dicken Buch, bei dem sich die Seiten zur Mittelbindung hin nach innen krümmen. Die Krümmung der oberen und unteren Ränder der Oberfläche liefert Informationen über das Ausmaß der Krümmung und der Dehnung, die nötig ist, um flach zu erscheinen. Das obige Beispiel ist ein dickes Buch. Andere gerundete Oberflächen können korrigiert werden, z. B. ein Poster auf einer runden Säule. - Wählen Sie die Option upper trace, um den oberen Rand der gekrümmten Seite nachzuzeichnen. Klicken Sie mit der Maus entlang des Randes, wodurch an jedem angeklickten Punkt ein Markierungspunkt entsteht. Sobald 4 Punkte vorhanden sind, wird eine gekrümmte Linie durch die Punkte gezeichnet. Fügen Sie weitere Punkte hinzu und ziehen Sie die Punkte bei Bedarf, damit die Linie der Bildkrümmung genau folgt. Wählen Sie die Option lower trace und zeichnen Sie den unteren Rand auf dieselbe Weise nach. Sind beide fertig, drücken Sie [flatten], um die Seite abzuflachen. Die Ränder sollten nun gerade sein (oder gerade genug). Verwenden Sie den Schieberegler [stretch], um die Seiten des Bildes bei Bedarf zu dehnen und die durch die Krümmung verursachte seitliche Stauchung auszugleichen. Verwenden Sie das Steuerelement Widen, um das Bild bei Bedarf zu verbreitern und das korrekte Breiten-/Höhenverhältnis wiederherzustellen. Die Schaltfläche [undo] stellt das unveränderte Bild wieder her und behält die Markierungspunkte bei, die dann für einen erneuten Versuch angepasst werden können. - +image: flatten-photo3.jpg - ^Gekrümmter Horizont Ein breites Panorama oder ein Foto mit einem Weitwinkelobjektiv kann einen Horizont haben, der nicht gerade oder horizontal ist. Das Bild kann begradigt (oder anderweitig verschoben) werden, indem eine Kurve durch den Horizont oder andere Bereiche gezogen wird, die entlang einer geraden Linie ausgerichtet werden müssen. Wählen Sie je nachdem, ob der Horizont (oder ein anderer Bildteil) hauptsächlich oberhalb oder unterhalb der Bildmitte liegt, entweder die Option upper trace oder lower trace. Das Bild wird verzerrt, um diese Kurve gerade zu machen. Eine Kurve genügt. Die andere Kurve wird automatisch am gegenüberliegenden Rand (oben oder unten) des Bildes hinzugefügt. Ist das Ergebnis nicht zufriedenstellend, verwenden Sie die Schaltfläche [undo], passen Sie die Markierungen auf einer der Kurven an und versuchen Sie es erneut. Sie können das Bild auch speichern und die Funktion ein zweites Mal anwenden, wobei das gespeicherte Bild als Ausgangspunkt dient. - - TOPIC: KOMBINIEREN-MENÜ Dies sind Funktionen, die mehrere Bilddateien kombinieren. Bei überlappenden Bildern werden entsprechende Merkmale in jedem Bild pixelgenau zur Deckung gebracht. Die Ausrichtungszeit beträgt typischerweise 10-30 Sekunden pro Bild. Läuft dieser Ausrichtungsvorgang schief, können Sie mit der Escape-Taste den Vorgang beenden. - - TOPIC: HDR ^High Dynamic Range +image: HDR.jpg +image: HDR-adjust.png - Kombiniert (überlagert) mehrere Bilder desselben Motivs mit unterschiedlichen Belichtungsstufen. Das kombinierte Bild kann eine verbesserte Sichtbarkeit von Details sowohl in den dunkleren als auch in den helleren Bereichen zeigen, wobei effektiv Pixel aus den helleren Bildern für die dunkleren Bereiche und aus den dunkleren Bildern für die helleren Bereiche verwendet werden. Wird die Kamera manuell zwischen den Aufnahmen angepasst, achten Sie darauf, sie gerade zu halten und auf denselben entfernten Punkt zu richten. Eine gewisse Fehlausrichtung der Eingabebilder ist tolerierbar. Bewegen sich Personen oder Objekte zwischen den Aufnahmen, lassen sich Geisterbilder nicht vermeiden. - Wählen Sie die HDR-Menüfunktion und wählen Sie bis zu 9 Bilder ({BILDDATEIEN AUSWÄHLEN}) aus, die alle nahezu dieselben Pixelabmessungen haben müssen. Die Bilder werden automatisch ausgerichtet und kombiniert. Danach wird das kombinierte Bild zusammen mit einem Dialog für Anpassungen angezeigt. Die Beiträge der Eingabebilder werden als eine Reihe bearbeitbarer Kurven dargestellt. Die horizontale Skala repräsentiert die Pixelhelligkeit, von dunkel bis hell. Jede Kurve repräsentiert ein Bild, das zu den Ausgabepixeln beiträgt. Der Bildbeitrag bei einer gegebenen Helligkeitsstufe ist proportional zur Höhe seiner Kurve an dieser Stelle. Die anfängliche Kurve für das hellste Bild ist links hoch und rechts niedrig, was einen hohen Beitrag zu dunklen Pixeln und einen niedrigen Beitrag zu hellen Pixeln bedeutet. Das dunkelste Bild ist links niedrig und rechts hoch, die übrigen Bilder liegen dazwischen. Die Kurven können durch Ziehen mit der Maus bearbeitet werden. Die entsprechenden Bildbeiträge ändern sich entsprechend, und Sie können die Ergebnisse in Echtzeit im Ausgabebild sehen. Das obige Bild zeigt zwei Eingabebilder und ihr Ausgabebild. Der Beispieldialog zeigt drei Kurven, die zur Optimierung von drei Eingabebildern angepasst wurden. - - TOPIC: HDF ^High Depth of Field Kombiniert (überlagert) mehrere Fotos desselben Motivs mit unterschiedlichen Fokuseinstellungen von nah bis fern. In jedem Bild sind unterschiedliche Teile des Motivs scharf fokussiert. Kombiniert die Bilder so, dass alle Teile des Motivs scharf sind. - Die Fotos aufnehmen: Wählen Sie einen Punkt für die Bildmitte. Richten Sie die Kamera auf ein nahes Objekt und drücken Sie den Auslöser halb durch, um den Fokus auf dieses Objekt zu legen. Halten Sie den Auslöser in der Halb-Position, richten Sie die Kamera auf die gewählte Mitte und lösen Sie aus. Wählen Sie nun ein weiter entferntes Objekt und wiederholen Sie den Vorgang. Wiederholen Sie dies mit zunehmender Fokusentfernung. Hoffentlich ist jeder Teil des Motivs in mindestens einem Foto scharf. Die Kameraposition sollte bei allen Fotos nahezu gleich sein, was eine Herausforderung sein kann, wenn das Motiv sehr nah ist. Kamerabewegung kann zu Skalierungs- und Parallaxproblemen führen (nahe Objekte gegenüber entfernten Objekten verschoben). Solche Probleme lassen sich möglicherweise später in Fotocx beheben, was jedoch erheblichen Zeitaufwand erfordern kann. Es ist besser, die Probleme zu vermeiden. - +image: HDF-paint.png - Die Fotos verarbeiten: Wählen Sie die HDF-Menüfunktion und wählen Sie bis zu 9 Bilder ({BILDDATEIEN AUSWÄHLEN}) aus. Die Bilder werden nun bestmöglich ausgerichtet. Das Ausgabebild ist eine gleichmäßige Mischung der ausgerichteten Eingabebilder. Eine geringe Kamerabewegung zwischen den Fotos wird ausgeglichen, dies ist jedoch begrenzt, und Parallaxverschiebungen werden überhaupt nicht ausgeglichen. Nach Abschluss der Ausrichtung öffnet sich ein Dialog. Sie können ein beliebiges Eingabebild auswählen und es mit der Maus auf einen beliebigen Bereich des Ausgabebildes "malen". Dadurch wird die ursprüngliche Bildmischung für den bemalten Bereich auf das einzelne ausgewählte Bild umgestellt. Wählen Sie für jeden Bereich oder jedes Objekt im Bild ein Eingabebild, das in diesem Bereich scharf ist. Der Radius des Pinsels kann größer oder kleiner eingestellt werden, sodass Sie große Bereiche schnell bemalen und bei Bedarf feine Details kontrollieren können. Bei überlappenden nahen und fernen Objekten sind Zeit und Geduld nötig, um alle scharf zu machen. Fehlausrichtungen können korrigiert werden, indem Sie die Warp-Option im Dialog auswählen. Die zugrunde liegenden Bilder können dann mit der Maus gezogen und verzerrt werden, und das kombinierte Ausgabebild ändert sich entsprechend. Die Verzerrung ist auf den Bereich um die Maus beschränkt. Wird ein bemalter Bereich gezogen, wird das entsprechende Eingabebild automatisch ausgewählt und gezogen, während mit anderen Bildern bemalte Bereiche fest bleiben. Nicht bemalte Bereiche können nicht gezogen werden. Bewegen Sie sich zu verschiedenen Bereichen und nehmen Sie schrittweise Ziehvorgänge vor, bis alle ausgerichtet sind. - Empfohlener Arbeitsablauf: Wählen Sie im Malmodus jedes Bild nacheinander aus und bemalen Sie alle Bereiche, die in diesem Bild scharf aussehen. Nicht gut ausgerichtete Grenzen zeigen sich deutlich als Verschiebungen an den Kanten von Bildmerkmalen. Einige davon lassen sich unwichtig machen, indem das für das Malen verwendete Bild gewechselt wird (falls mehr als ein Bild scharf genug ist). Nehmen Sie im Warp-Modus bei Bedarf Feinanpassungen vor, um sichtbare Verschiebungen zu beseitigen. - - TOPIC: STAPEL/MALEN +image: stack-paint.png - +image: stack-paint2.jpg - Stapelt (überlagert) mehrere Fotos desselben Motivs, die zu unterschiedlichen Zeiten aufgenommen wurden. Entfernt Touristen und Autos, die zwischen den Aufnahmen kommen und gehen. - Die Fotos aufnehmen: Richten Sie die Kamera auf denselben entfernten Punkt und machen Sie mehrere Fotos, während sich Touristen oder Autos vor dem Motiv bewegen. Versuchen Sie, für jeden Bereich des Motivs, der nicht durch die vorübergehenden Objekte verdeckt ist, zwei oder mehr Fotos zu erhalten. Halten Sie die Kamera ruhig und auf denselben Punkt gerichtet, damit sich die Bilder genau ausrichten lassen. - Die Fotos verarbeiten: Wählen Sie die Menüfunktion Stapeln/Malen und wählen Sie bis zu 9 Bilder ({BILDDATEIEN AUSWÄHLEN}) aus. Die Bilder werden nun bestmöglich ausgerichtet. Das Ausgabebild (unten links) ist eine gleichmäßige Mischung der ausgerichteten Eingabebilder (obere Reihe). Nach Abschluss der Ausrichtung startet der oben gezeigte Dialog. Sie können ein beliebiges Eingabebild auswählen und mit der Maus auf einen beliebigen Bereich des Ausgabebildes "malen". Das einzelne ausgewählte Bild wird für den bemalten Bereich verwendet. Wählen Sie für jeden Bereich im Bild ein Eingabebild, das frei von den vorübergehenden Objekten ist. Der Radius des Pinsels kann größer oder kleiner eingestellt werden, sodass Sie große Bereiche schnell bemalen und bei Bedarf feine Details kontrollieren können. - Automatischer Betrieb: Drücken Sie die Schaltfläche [Ausblenden], um zu sehen, ob vorübergehende Objekte automatisch entfernt werden können. Dies funktioniert für Bildbereiche, in denen mehrere Fotos des unverdeckten Hintergrunds verfügbar sind (mittleres Bild unten). Um alle vorübergehenden Objekte anzuzeigen, drücken Sie die Schaltfläche [Anzeigen] (rechtes Bild unten). Dies funktioniert im Allgemeinen, aber nicht perfekt. Geringfügige Bildfehlausrichtungen oder Beleuchtungsunterschiede (besonders wandernde Schatten) können dazu führen, dass der Algorithmus Hintergrundpixel statt Vordergrundpixel auswählt. Sie können die oben beschriebene Malmethode verwenden, um die Fehler manuell zu beheben. - - TOPIC: STAPEL/RAUSCHEN +image: stack-noise2.jpg +image: stack-noise.png - Diese Funktion kombiniert 2-9 Fotos desselben Motivs. Die Fotos sollten nahezu identisch sein, abgesehen von kleinen Verschiebungen durch eine handgehaltene Kamera. Wurden die Fotos mit einer sehr hohen ISO-Einstellung (schwaches Licht) aufgenommen, weisen die Pixel erhebliches Rauschen auf. Durch das Aufnehmen vieler Fotos und deren Mittelung lässt sich das Rauschen größtenteils beseitigen. - Die Fotos verarbeiten: Wählen Sie die Funktion Stapeln/Rauschen und wählen Sie bis zu 9 Bilder ({BILDDATEIEN AUSWÄHLEN}) aus. Sie werden automatisch kombiniert und angezeigt, und ein Dialog öffnet sich. Das anfängliche Ausgabebild ist eine Kombination aller ausgewählten Eingabebilder, gemittelt. Das bedeutet, dass die RGB-Werte für jedes Ausgabepixel der Durchschnitt der RGB-Werte der entsprechenden Eingabepixel sind. Die Schaltfläche median ändert die Ausgabepixel auf den Median der Eingabepixel (1-3 mittlere RGB-Werte werden gemittelt, je nach Anzahl der Bilder). Dies kann besser sein oder auch nicht, wechseln Sie also hin und her, um zu vergleichen. Die Kontrollkästchen omit low pixel und omit high pixel bewirken, dass die niedrigsten und höchsten RGB-Eingabewerte vor der Mittelung verworfen werden. Dadurch können Rauschspitzen aus der Mischung entfernt werden. Dies hat keine Wirkung, wenn die Median-Methode ausgewählt ist. - - TOPIC: STAPEL/EBENEN +image: stack-layers.png - Verwenden Sie diese Funktion, um verschiedene bearbeitete Versionen eines Bildes zu kombinieren, wobei Sie festlegen können, welche Version in ausgewählten Bildbereichen angezeigt wird. Es können beliebige Bilder mit denselben Pixelabmessungen kombiniert werden. - Wählen Sie bis zu 9 Bilder gleicher Größe aus. Das anfängliche Ausgabebild ist eine gleichmäßige Mischung aller Eingabebilder. Image Ratios sind die relativen Gewichtungen der gemischten Bilder. Diese können angepasst werden, um die Gewichtung jedes Bildes zu variieren. Beispiel: Werden 3 Bilder mit relativen Gewichtungen von 3, 5, 7 kombiniert, besteht das kombinierte Bild zu 3/15 aus Bild Nr. 1, zu 5/15 aus Nr. 2 und zu 7/15 aus Nr. 3. Ist die Option "Paint entire image" ausgewählt, können die Gewichtungen angepasst werden, und das Ausgabebild reagiert sofort. Ist die Option "Paint within mouse" ausgewählt, kann die Maus gezogen werden, und nur der Bereich innerhalb des Mauskreises wird unter Verwendung der aktuell aktiven Bildverhältnisse bemalt. Die Malgeschwindigkeit wird durch die Power-Einstellungen für die Mitte und den Rand der Maus gesteuert. Verwenden Sie niedrige Werte, um schrittweise zu malen. - - TOPIC: PANORAMA +image: pano-align1.jpg +image: pano-align2.jpg - Diese Funktion fügt 2-6 Bilder zu einem Weitwinkelbild oder Panorama zusammen. Die Bilder müssen sich um 10% oder mehr überlappen, damit das Programm erkennen kann, wo sie übereinstimmen, und sie zusammenfügen kann. Beginnen Sie mit der Auswahl von 2-6 Bilddateien ({BILDDATEIEN AUSWÄHLEN}). Es ist hilfreich, die Bilder in der Reihenfolge von links nach rechts auszuwählen, um die anfängliche grobe Ausrichtung zu erleichtern. Die Bilder werden zunächst zusammengefügt und mit einer kleinen transparenten Überlappung angezeigt. Ein Vorausrichtungsdialog (oben) fordert Sie auf, die Bilder grob auszurichten, indem Sie sie ziehen. Ziehen Sie die Bilder in die richtige Reihenfolge von links nach rechts. Das zu ziehende Bild kann andere Bilder überlappen. Um eindeutig zu erkennen, welches Bild gezogen wird, ziehen Sie von nahe der Bildmitte aus. Nachdem die Bilder in der richtigen Reihenfolge sind, richten Sie jedes Bild an seinem linken Nachbarn aus. Es funktioniert am besten, von links nach rechts vorzugehen. Bewegen Sie ein Bild horizontal und vertikal in grobe Ausrichtung mit seinem linken Nachbarn, drehen Sie das Bild dann bei Bedarf, indem Sie den unteren Rand nach links oder rechts ziehen - das Bild dreht sich um den Mittelpunkt seiner Überlappung mit dem Bild links. Die schnellste Methode besteht darin, zuerst die mittlere Überlappungsregion auszurichten und dann bei Bedarf das rechte Bild zu drehen, um die oberen und unteren Überlappungsregionen zur Ausrichtung zu bringen. Extreme Genauigkeit ist NICHT erforderlich. Die Bilder sollten korrekt gekrümmt sein und gut zusammenpassen. Ist dies nicht der Fall, muss 'lens mm' (Brennweite, 35mm-Äquivalent) angepasst werden. Die Bildkrümmung ändert sich, wenn lens mm angepasst wird. Der Anfangswert wird, falls verfügbar, aus den EXIF-Metadata bezogen, und dies ist normalerweise ausreichend. Haben die Bilder keine Krümmung (z. B. gescannte Bilder), verwenden Sie das Kontrollkästchen 'no curve', um 'lens mm' effektiv auf unendlich zu setzen. - Wurde eines der Bilder zugeschnitten, funktioniert die von der EXIF-Brennweite abhängige Berechnung nicht. Möglicherweise können Sie dies ausgleichen, indem Sie die Brennweite in 'lens_mm' erhöhen. - Das Kontrollkästchen 'manual align' verwendet die manuelle Vorausrichtung als endgültige Ausrichtung. Dies ist für Bilder gedacht, die keine eindeutigen Merkmale zur Ausrichtung der Bilder aufweisen. Diese Option erlaubt es den Bildern außerdem, keine Überlappung zu haben. - Drücken Sie [proceed], wenn die Vorausrichtung abgeschlossen ist, und das Programm führt die Feinausrichtung durch und fügt die Bilder zusammen. Intern werden die Bilder verschoben und gedreht, und der Grad der Übereinstimmung wird bewertet. Dies geschieht mit zunehmender Bildgröße, bis die beste Ausrichtung gefunden ist. Dies kann eine Minute oder länger dauern, abhängig von CPU-Geschwindigkeit und Bildgröße. Sie können den Vorgang erheblich beschleunigen, wenn Sie die Eingabebilder auf 2/3 oder 1/2 Größe reduzieren. Tun Sie dies auch, wenn der Vorgang aus Speichermangel fehlschlägt. - +image: pano-adjust.jpg - Nach Abschluss der Feinausrichtung wird das kombinierte Bild angezeigt. Der obige Dialog wird für die Feinabstimmung der Helligkeit gestartet. Möglicherweise sehen Sie eine Grenze zwischen Bildern, wenn diese nicht dieselbe Helligkeit haben. Wählen Sie ein Bild über die Optionsfelder oben aus. Verwenden Sie die Schaltfläche [Autofarbe] wiederholt, um die Helligkeits-/Farbübereinstimmung der Bilder automatisch zu verbessern. Das Basisbild ist das aktuell ausgewählte. Probieren Sie verschiedene Basisbilder aus, um zu sehen, welches am besten funktioniert. Sind die Bilder in der Helligkeit stark unpassend, wählen Sie den größten Ausreißer und verwenden Sie das Helligkeits-Steuerelement, um die Helligkeit an die anderen anzupassen, gefolgt von [Autofarbe]. Die Übereinstimmung muss nicht sehr gut sein, da 'Blend Width' (als Nächstes) verbleibende Unterschiede kaschiert. Verwenden Sie die Schaltfläche 'File Color', um die Helligkeitsstufen aus den Eingabebilddateien zurückzusetzen. - Das Steuerelement 'Blend Width' bestimmt, wie die Bilder zusammen überblendet werden: An den Bildüberlappungen wird die Helligkeit über diese Anzahl von Pixeln geändert, um nicht vollständig korrigierbare Ungleichgewichte zu kaschieren. Der Standardwert ist 1 Pixel, wodurch jeder Helligkeitsunterschied deutlich sichtbar wird. - Richten sich die Bilder nicht perfekt aus, können Sie die Ausrichtung möglicherweise verbessern, indem Sie die Bilder mit der Maus in Ausrichtung schieben. Wählen Sie 'Mouse Warp' und wählen Sie eines der Bilder über die Optionsfelder. Ziehen Sie dann die Maus entlang des Bildrandes, an dem er sich mit seinem Nachbarn ausrichten soll, und bewegen Sie das Bild in Ausrichtung. Das Bild wird lokal um die Maus herum bewegt, während weiter entfernte Teile fest bleiben. Bilder mit Parallaxverschiebung erfordern einen Kompromiss, da es unmöglich ist, sowohl Vordergrund als auch Hintergrund in Ausrichtung zu halten. - Das Steuerelement flatten image kann verwendet werden, um das Bild zu "entbiegen", wodurch gekrümmte Linien begradigt werden (z. B. gekrümmte Gebäude). Ein Wert von null hat keine Wirkung, und ein Wert von 1,0 flacht das Bild vollständig ab. - Verwenden Sie danach {BEGRADIGEN}, {BILD VERZERREN}, {ZUSCHNEIDEN} usw. für letzte Anpassungen. - ^Gescannte Bilder Gescannte Bilder können kombiniert werden, wenn genügend Überlappung vorhanden ist. Aktivieren Sie 'no curve', da keine Krümmung vorliegt. - ^Automatische Verzerrung Die Bilder werden während der Ausrichtung leicht in verschiedene Richtungen verzerrt, um die beste Übereinstimmung zu finden. Dies dient dazu, Verschiebungen des Kamerahorizonts oder der Drehung auszugleichen, die Bildverzerrungen verursachen und die Passgenauigkeit verringern. Enthält der Überlappungsbereich zweier Bilder ein großes Objekt, das sich zwischen den beiden Fotos bewegt hat, kann der Ausrichtungsvorgang beim Versuch, die Bilder anzupassen, verrückt spielen, was zu einer sehr schlechten Ausrichtung führt. Durch Auswahl von 'no auto warp' können Sie möglicherweise erreichen, dass die Ausrichtung gelingt oder einen kleineren Fehler aufweist. Eine weitere Option ist die Auswahl von manual align. - ^Panoramen kombinieren Sie können in einem Durchgang ein Panorama aus bis zu 6 Bildern erstellen. Sie können auch Panoramen kombinieren, die seitlich zusammenpassen, z. B. ein 4-Bild-Panorama mit einem weiteren 4-Bild-Panorama zu einem 8-Bild-Panorama kombinieren. Sie müssen die normale Bildkrümmung stoppen, wenn Sie Panoramen kombinieren, da die Panoramabilder bereits gekrümmt sind (vorausgesetzt, Sie haben die Option 'flatten' im letzten Panorama-Dialog nicht verwendet). Stoppen Sie die Bildkrümmung, indem Sie das Kontrollkästchen 'no curve' im Vorausrichtungsdialog aktivieren. - ^Panorama-Einschränkungen Panoramen mit nahen Objekten können knifflig sein: Achten Sie beim Aufnehmen der Fotos darauf, die Kamera um eine Achse durch das Objektiv zu drehen, mit minimaler seitlicher Bewegung, da sich die Bilder sonst möglicherweise schlecht ausrichten, weil Vordergrundobjekte gegenüber dem Hintergrund verschoben sind (Parallaxe). Dies ist kein Problem, wenn das Motiv 50+ Meter entfernt ist, da eine kleine seitliche Bewegung wenig Einfluss auf das Bild hat. Halten Sie die Kamera gerade, um eine große vertikale Verschiebung (Horizontverschiebung) zu vermeiden, die Bildverzerrungen verursachen kann, die möglicherweise nicht vollständig korrigiert werden können. Vermeiden Sie aus demselben Grund das Drehen der Kamera. - ^Vertikales Panorama Dies kann durch Drehen der Eingabebilder um 90° erreicht werden. Wählen Sie in Panorama die Bilder in der Reihenfolge von oben nach unten, sodass das oberste Bild links und das unterste rechts steht. Erstellen Sie das Panorama normal. Drehen Sie das Ausgabebild so, dass links zu oben wird. - - TOPIC: CIM-DATEIEN ANZEIGEN Zeigt die Eingabedateien für das aktuelle oder zuletzt kombinierte Bild in einem Popup-Fenster an. Nur die aktuelle oder zuletzt verwendete Menge wird gespeichert. - - TOPIC: MASHUP +image: mashup.jpg - Ordnet mehrere Bilder und Text in einem Layout an. Bilder können hinzugefügt, in der Größe geändert, gedreht und durch Ziehen mit der Maus verschoben werden. Bilder können in ausgewählten Bereichen ganz oder teilweise transparent gemacht werden. Text kann hinzugefügt, verschoben, in der Größe geändert und gedreht werden. Textattribute können festgelegt werden: Schriftart, Größe, Farbe, Umriss, Schatten, Transparenz. Linien und Pfeile können hinzugefügt werden. Das Beispiel hier zeigt einige der Möglichkeiten. - +image: mashup1.png - Wählen Sie im ersten Mashup-Dialog ein Hintergrund- oder Layoutbild, auf dem andere Bilder platziert werden. Wählen Sie ein vorhandenes Bild, oder erstellen Sie ein neues einfarbiges Bild mit einer festgelegten Größe und Farbe. Sie können auch ein zuvor gespeichertes Mashup-Projekt öffnen und die Bearbeitung fortsetzen. - +image: mashup2.png - Der 2. Mashup-Dialog bietet eine Auswahl: Bilder bearbeiten, Text bearbeiten, Linien und Pfeile bearbeiten, auf eine größere Größe skalieren, das fertige kombinierte Bild speichern (Fertig) oder das Bild verwerfen (Abbrechen). Die ersten drei Optionen führen zu Dialogen für die jeweiligen Bearbeitungen. Jede davon kehrt nach Abschluss zu diesem Dialog zurück, sodass Sie Bilder, Text und Linien/Pfeile in beliebiger Reihenfolge hinzufügen oder ändern können. Rescale wird unten erläutert. - +image: mashup3.jpg - Verwenden Sie diesen Dialog, um Bilder im Layout auszuwählen und zu platzieren und ihr Erscheinungsbild zu überarbeiten: Größe, Drehung, Position, Transparenz. Ein Bild kann teilweise oder vollständig transparent sein, insgesamt oder innerhalb festgelegter Bereiche. Das bedeutet, dass das Hintergrundbild oder ein überlapptes Bild durch transparente Bereiche durchscheinen kann. Die Schaltfläche Bild hinzufügen führt zu einem Galerie-Dateiauswahldialog ({BILDDATEIEN AUSWÄHLEN}). Ausgewählte Bilder werden im Layout platziert. Nachdem die Bilder hinzugefügt wurden, klicken Sie auf ein beliebiges Bild, um es zur Änderung auszuwählen. Ziehen Sie das Bild von der Mitte aus, um es im Layout zu positionieren. Ziehen Sie die untere rechte Ecke, um die Größe des Bildes zu ändern. Verwenden Sie die Dialogsteuerelemente, um das Bild anzupassen. Die Dialogsteuerelemente wirken auf das zuletzt hinzugefügte, angeklickte oder gezogene Bild. Die Schaltflächen 'Zurück' und 'Weiter' durchlaufen die Bilder nacheinander und lassen das ausgewählte Bild blinken. Dies kann verwendet werden, wenn überlappende Bilder es schwierig machen, das gewünschte Bild durch Anklicken auszuwählen. Scale skaliert das Bild neu. Angle dreht das Bild. Die Stapelreihenfolge-Schaltflächen heben oder senken ein Bild relativ zu anderen Bildern - dies bestimmt, welches überlappende Bild oben liegt. Base Transparency wird verwendet, um ein gesamtes Bild teilweise transparent zu machen. Die Schaltfläche [malen] wird verwendet, um einen beliebigen Teil eines Bildes teilweise oder vollständig transparent zu machen, mithilfe des unten gezeigten Mal-Dialogs. Die Schaltfläche [verzerren] wird verwendet, um ein Bild zu biegen oder zu verzerren, mithilfe des unten gezeigten Verzerren-Dialogs. Das Kontrollkästchen 'black margins' kann verwendet werden, um schwarze Ränder zu entfernen, die von anderen Bearbeitungsfunktionen hinterlassen wurden, z. B. Verzerren. Diese werden transparent gemacht. Die Schaltfläche 'Image is fixed' verhindert, dass das Bild mit der Maus oder Tastatur verschoben wird. Dies ist hilfreich, wenn Bilder feinausgerichtet werden und versehentliche Bewegungen verhindert werden sollen. Die Margins-Steuerelemente können verwendet werden, um Bildränder transparent zu machen. Hard margins schneiden Bildränder ab. Blend margins machen die Ränder teilweise transparent, um sie in den Hintergrund oder andere überlappende Bilder einzublenden. - +image: mashup4.png - "Malen" Sie mehr oder weniger Transparenz für ausgewählte Bildbereiche. Klicken Sie auf ein Bild, um es auszuwählen. Der Mauszeiger ist ein Kreis, der den Wirkungsbereich zeigt. Verwenden Sie radius, um die Größe anzupassen. Ziehen Sie die Maus bei gedrückter linker Taste über das Bild, um es in den vom Kreis abgedeckten Bereichen transparent zu machen. Ziehen Sie mit der rechten Taste, um es opak zu machen. Ist Gradual aktiviert, erfolgen Transparenzänderungen langsam, während die Maus gezogen wird. Geben Sie einen Power-Wert für die Mitte und die Ränder der Maus an, um die Änderungsrate zu regeln. - +image: mashup5.png - Der Verzerren-Dialog wird verwendet, um ein Bild zu verzerren. Klicken Sie auf ein Bild, um es auszuwählen. Ziehen Sie das Bild mit der Maus - das Bild wird lokal in Richtung der Maus verzerrt oder gedehnt (wie Gummifolie). Der Verzerrungsbereich wird grob durch warp span angegeben, das ein Bruchteil der Bildgröße ist. Jeder Ziehvorgang ist ein Schritt, der sich zu vorherigen Schritten addiert. Kürzliche Schritte können mit [undo last] rückgängig gemacht werden, und das unverbogene Bild kann mit [undo all] wiederhergestellt werden. - +image: mashup6.png - Der Dialog Text bearbeiten wird verwendet, um Text im Layout zu platzieren. Geben Sie etwas Text ein und drücken Sie [Anwenden]. Sie werden aufgefordert, auf das Layout zu klicken, wo der Text hinzugefügt werden soll. Ziehen Sie ihn in Position und verwenden Sie dann die Dialogsteuerelemente, um Schriftart, Größe, Farbe, Winkel, Hintergrundfarbe, Umrissgröße und -farbe, Schattengröße und -farbe sowie Transparenzen für jedes davon festzulegen. Ziehen Sie den Text jederzeit an eine neue Position. Klicken Sie auf einen vorhandenen Text, um seine Eigenschaften im Dialog anzuzeigen und zu überarbeiten. Klicken Sie auf einen Text und drücken Sie Entf, um ihn zu entfernen. Drücken Sie nach Abschluss der Bearbeitung auf [OK], um zum 2. Mashup-Dialog zurückzukehren. - +image: mashup7.png - Der Dialog Linie/Pfeil bearbeiten wird verwendet, um Linien oder Pfeile im Layout zu platzieren. Er funktioniert sehr ähnlich wie das Hinzufügen von Text. Geben Sie eine Länge und Breite ein und drücken Sie [Hinzufügen]. Sie werden aufgefordert, auf das Layout zu klicken, wo die Linie hinzugefügt werden soll. Eine Linie wird im Layout platziert, oder ein Pfeil, wenn eine der Pfeilspitzen-Optionen aktiviert ist. Ziehen Sie die Linie/den Pfeil an die gewünschte Position. Passen Sie Länge, Breite, Winkel und Attribute (Hintergrund, Umriss, Schatten) über den Dialog an. Sie können auch eines der Enden der Linie/des Pfeils ziehen, um die Position dieses Endes festzulegen, während das andere Ende fest bleibt. - Sie können die Maus verwenden, um Objekte im Layout zu verschieben und in der Größe zu ändern: • klicken Sie auf das Objekt, um es auszuwählen - es blinkt zur Bestätigung der Auswahl. • ziehen Sie von der ungefähren Mitte aus, um das Objekt zu positionieren. • ziehen Sie die untere rechte Ecke, um die Größe des Objekts zu ändern. • bei einer Linie/einem Pfeil ziehen Sie eines der Enden, um nur dieses Ende zu verschieben. - Die Pfeiltasten der Tastatur können ebenfalls verwendet werden, um das aktuell ausgewählte Objekt in 1-Pixel-Schritten zu verschieben. - Sie können durch {BEREICH AUSWÄHLEN} gespeicherte Bilder hinzufügen. Drücken Sie im Dialog Bilder bearbeiten auf [Hinzufügen], um den Dateiauswahldialog zu starten. Verwenden Sie die Schaltfläche [Oben] im Galeriefenster, wählen Sie 'saved_areas'. Öffnen Sie eines der dort gefundenen .png-Bilder. Der ursprüngliche Bereichsumriss wird verwendet, und die Bereichsüberblendung arbeitet von diesen Rändern aus. - ^Mashup-Projektdateien Sie können ein Projekt speichern und es später öffnen, um die Bearbeitung fortzusetzen. Das Mashup-Projekt wird anhand dieser Bilder und einiger in der Projektdatei gespeicherter Daten neu aufgebaut: Bild- und Textpositionen, Skalierungen, Transparenz usw. - ^Mashup-Neuskalierung Die Arbeit mit einem sehr großen Layout (über 20 Megapixel) kann recht langsam sein. Das Ziehen eines großen Overlay-Bildes kann langsam und ruckelig sein. Sie können viel schneller arbeiten, wenn Sie ein kleineres Layout verwenden, um das Projekt zu erstellen, und es dann vergrößern, nachdem Sie fertig sind. Im endgültigen Bild geht keine Auflösung verloren, da die Overlay-Bilder und der Text aus den Eingaben neu erzeugt werden. Die Schaltfläche Rescale ermöglicht es Ihnen, das Projekt um das 2-, 3- oder 4-fache zu vergrößern. Es gibt auch eine Zurücksetzen-Option, um die ursprüngliche kleinere Projektgröße wiederherzustellen. Mit dieser Methode können Sie mit einem 10-Megapixel-Layout arbeiten und es am Ende auf bis zu 160 Megapixel skalieren. Am größeren Layout kann anschließend weiterhin direkt gearbeitet werden, dies wird jedoch langsamer sein. - - TOPIC: BILDERFELD +image: image-array.jpg - Wählen Sie viele Bilder aus und fügen Sie sie innerhalb eines farbigen Rahmens zu einem kompakten Array-Format zusammen. - Der erste Dialog wird oben links angezeigt. Background Color ist die Farbe des Umrissrahmens und der Zwischenräume zwischen den enthaltenen Bildern. Array Width ist die Gesamtbreite des Ausgabe-Arrays, und Margin ist die Breite des äußeren Randes um alle Bilder. Die Array-Höhe wird durch die Anzahl der ausgewählten Bilddateien und den zu ihrer Unterbringung im Rahmen benötigten Platz bestimmt. Image Columns legt die Anzahl der Bildspalten fest (6 im obigen Beispiel). Die Anzahl der Zeilen hängt von der Anzahl der ausgewählten Bilddateien ab. Die Separation-Werte legen den horizontalen und vertikalen Abstand zwischen den enthaltenen Bildern fest. - Wählen Sie die Bilddateien aus ({BILDDATEIEN AUSWÄHLEN}), und drücken Sie dann [Fortfahren], wenn Sie fertig sind. Das resultierende Bild wird innerhalb weniger Sekunden erstellt (oder Minuten bei Hunderten von Bildern). Dieses Bild hat typischerweise einen sehr unebenen unteren Rand, wie im oberen rechten Bild oben gezeigt. Die Reihenfolge der Bilder im Array wird durch die Auswahlreihenfolge bestimmt. Die obere Reihe wird zuerst gefüllt, von links nach rechts, dann die 2. Reihe usw. - Der Optimize-Dialog startet automatisch. Er kann die Bilder neu anordnen, damit der untere Rand gleichmäßiger wird. Drücken Sie [Start] und warten Sie, bis das Bild optimiert ist. Sie können den Fortschritt beobachten. Die Funktion wird beendet, wenn ein Optimum gefunden wird, das den unteren Rand auf 2 Pixel genau gleichmäßig macht. Sie kann unbegrenzt weitersuchen, wenn dieses Ziel nicht erreicht wird. Drücken Sie [Stopp], um die Optimize-Funktion zu zwingen, mit der bisher besten gefundenen Lösung zu enden. Ist die Optimierung erfolgreich, erhalten Sie gleichmäßige Spalten, wie im unteren rechten Bild gezeigt. Ist der untere Rand nach der Optimierung noch immer uneben, werden Sie gefragt, ob Sie einigen Bildern Ränder hinzufügen möchten, um den unteren Rand gleichmäßig zu machen. Dies führt zu einem gleichmäßigen unteren Rand, aber die vertikalen Abstände sind dann nicht mehr gleich. - TIPP: Die Optimierung funktioniert am besten, wenn die Anzahl der Bilder pro Spalte mindestens vier beträgt (besser mehr). Dies gibt dem Optimierer genug Flexibilität, um eine Lösung mit gleichmäßigem unterem Rand zu finden. - Der letzte Dialog erscheint, unten links gezeigt. Sie müssen nun Ihrem Array einen Dateinamen zuweisen. Ein Dialog zum Speichern der Datei wird gestartet, und Sie können die neue Array-Datei überall speichern. Wird die Option copy metadata gewählt, werden Metadata von der gewählten Eingabedatei in die Ausgabedatei kopiert. Dies ist nützlich, wenn die Bilder bearbeitete Versionen sind und das Array den Bearbeitungsverlauf für die letzte Version (oder eine beliebige Version) enthalten soll. - - TOPIC: SAMMEL-MENÜ Dies sind Funktionen, die mehrere ausgewählte Bilddateien verarbeiten, wenige oder Tausende. Diese Funktionen können mitten im Vorgang mit der Escape-Taste abgebrochen werden, wodurch jedoch einige Dateien verarbeitet und andere nicht verarbeitet bleiben. Ein Popup-Bericht zeigt die Dateinamen während der Verarbeitung an. - - TOPIC: SAMMELKONVERTIERUNG +image: batch-convert.jpg - Diese Funktion wird verwendet, um mehrere Bilddateien umzubenennen, zu konvertieren, in der Größe zu ändern und zu verschieben. RAW-Dateien können ebenfalls in Bilddateien umgewandelt werden. Die Funktion läuft für maximale Geschwindigkeit in mehreren parallelen Threads. - ^Dialogeingaben • Select Files - zu konvertierende Dateien ({BILDDATEIEN AUSWÄHLEN}). • Replace Text - Text in Dateinamen ersetzen (siehe unten). • New Name - optionaler neuer Name, eingefügter Text (siehe unten). • Sequence Numbers - Basisnummer und Zähler für Ausgabedateinamen. • New Location - optionaler neuer Ordnerspeicherort für Ausgabedateien. • New Type - Dateityp für Ausgabedateien, oder "no change". • Color Depth - 8 oder 16 Bit für tif- oder png-Ausgabe festlegen. • Max. Width, Height - optionale Grenzwerte für Ausgabedateien (nur verwendet, wenn downsize oder upsize aktiviert ist) • Rescale - optionaler Skalierungsfaktor für Ausgabedateien • Delete Originals - Eingabedateien nach erfolgreicher Konvertierung löschen. • Copy Metadata - alle Metadata in die Ausgabedateien kopieren. • Update Albums - Albumdateien durch konvertierte Ausgabedateien ersetzen - ^Replace Text Wird hier Text eingegeben, werden Dateinamen nach diesem Text durchsucht, und falls gefunden, wird der angegebene Ersatztext eingesetzt. Der Ersatztext kann eine andere Länge haben und auch leer sein, wodurch der Text aus dem Dateinamen entfernt wird. - ^New Name und Plugins Der neue Dateiname kann eingefügten Text enthalten: ein Fotodatum (aus EXIF-Metadata), eine laufende Nummer oder den ursprünglichen Dateinamen. Legen Sie wie folgt fest, was und wo eingefügt werden soll: • $oldname - hier wird der ursprüngliche Dateiname eingefügt • $sss - hier wird eine laufende Nummer eingefügt. Siehe unten. • $yyyy $mm $dd - das Fotodatum wird an diesen Stellen eingefügt. - Beispiel: San Francisco $yyyy:$mm:$dd $oldname $sss Die Eingabedatei "Golden Gate Bridge.jpg" mit einem Fotodatum vom 12. Mai 2014 würde in den Ausgabedateinamen "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg" umgewandelt. - Legen Sie für "$sss" die Feldlänge mit der Anzahl der 's'-Zeichen fest, z. B. reicht "$ss" für laufende Nummern bis 99 aus. Bei laufenden Nummern mit weniger Stellen werden führende Nullen hinzugefügt. Laufende Nummern, die nicht in die angegebene Länge passen, werden so lang gemacht wie nötig. Beachten Sie, dass die Sortierreihenfolge der Dateinamen in den Galerien strikt der ASCII-Reihenfolge folgt, sodass die Zahlenfolge 1, 2 ... 9, 10 als 1, 10, 2 ... 9 sortiert wird. Sie können die numerische Reihenfolge beibehalten, indem Sie eine Feldlänge von 2 ($ss) festlegen, was zur Folge 01, 02 ... 09, 10 führt. - Entweder "$oldname" oder "$sss" muss vorhanden sein, um eindeutige Ausgabedateinamen sicherzustellen. Fehlt New Location oder ist unverändert, wird delete originals ignoriert. Existiert bereits eine Ausgabedatei, wird die Eingabedatei nicht konvertiert. - ^Max. Width und Height Ist downsize und/oder upsize aktiviert, werden die Ausgabedateien innerhalb dieser Grenzwerte in der Größe geändert, wobei das ursprüngliche Breiten-/Höhenverhältnis erhalten bleibt. Ist downsize aktiviert, werden Dateien, die größer als diese Grenzwerte sind, verkleinert, um innerhalb der Grenzwerte zu bleiben. Ist upsize aktiviert, werden Dateien, die kleiner als diese Grenzwerte sind, vergrößert, sodass entweder Breite oder Höhe dem entsprechenden Grenzwert entspricht. Dies kann nicht zusammen mit der Rescale-Option verwendet werden. - ^Rescale Ist eine der Schaltflächen aktiviert, werden Ausgabedateien um den gewählten Faktor skaliert. Dies kann nicht zusammen mit der Option Max. Width and Height verwendet werden. - ^Delete Originals Ist dies aktiviert, werden Eingabedateien gelöscht, jedoch erst, nachdem die Ausgabedatei erfolgreich erstellt wurde. - ^Copy Metadata Alle Metadata werden von der Eingabedatei in die Ausgabedatei kopiert. Lassen Sie diese Option weg, um Metadata zu entfernen. - ^Update Albums Ist dies aktiviert, werden alle Alben, die eine der Eingabedateien enthalten, auf die konvertierten Ausgabedateien aktualisiert. - ^Dateireihenfolge beibehalten Wenn Sie eine führende laufende Nummer ($sss) angeben, bleibt die Auswahlreihenfolge der Eingabedateien am Ausgabeort erhalten. So können Sie Bilddateien in einer gewünschten Reihenfolge auswählen, oder aus einem Album mit geordneten Bildern auswählen, und diese Reihenfolge in der Ausgabe beibehalten. - - TOPIC: SAMMEL-KOPIEREN/VERSCHIEBEN Kopiert oder verschiebt ausgewählte Bilddateien an einen neuen Speicherort. Wählen Sie die Eingabedateien ({BILDDATEIEN AUSWÄHLEN}) aus beliebigen Fotocx bekannten Ordnern aus. Ist "Delete Originals" ausgewählt, werden die Eingabedateien gelöscht, nachdem sie erfolgreich in den neuen Ordner verschoben wurden. In diesem Fall werden alle Alben, die auf die nun gelöschten Eingabedateien verweisen, mit den neuen Dateispeicherorten aktualisiert. - - TOPIC: SAMMEL-AUFRICHTEN Diese Funktion richtet gedrehte oder gespiegelte Bilddateien auf. Sie ist auf EXIF-Daten angewiesen, um zu wissen, ob eine Datei gedreht/gespiegelt ist und in welche Richtung. Sie ist wesentlich schneller als Stapel-Konvertierung. Sie können einfach alle infrage kommenden Dateien auswählen und die Funktion die finden lassen, die eine Korrektur benötigen. Die Suchgeschwindigkeit beträgt etwa 3000 Bilddateien pro Minute auf einem leistungsstarken Computer. Es gibt zwei Optionen zur Angabe der zu durchsuchenden Dateien. Die Schaltfläche [Dateien auswählen] führt zu einem Galerie-Dateiauswahldialog ({BILDDATEIEN AUSWÄHLEN}). Ist 'Survey all files' aktiviert, werden alle Bilddateien unter Ihren Top-Ordnern durchsucht. - - TOPIC: SAMMEL-LÖSCHEN/PAPIERKORB Wählen Sie die Dateien aus ({BILDDATEIEN AUSWÄHLEN}). Wählen Sie die Option: löschen oder in den Papierkorb verschieben. [Fortfahren]. Dateien werden in einem Popup-Bericht aufgelistet, während sie gelöscht oder in den Papierkorb verschoben werden. Nachdem alle Dateien gelöscht/in den Papierkorb verschoben wurden, werden die Alben durchsucht und gelöschte Dateien entfernt. - - TOPIC: SAMMEL-OVERLAY +image: batch-overlay.png - Ein kleines Overlay-Bild kann an einer gewählten Position auf den ausgewählten Eingabebildern hinzugefügt werden. Dies kann verwendet werden, um eine Bildnachweiszeile, ein Copyright usw. über den Bildern hinzuzufügen. - Bereiten Sie das Overlay-Bild wie folgt vor: Verwenden Sie Leeres Bild, um ein Basisbild zum Aufnehmen des Textes zu erstellen. Der Maßstab spielt keine Rolle, machen Sie es also größer als nötig. Verwenden Sie Transparenz malen, um das gesamte Basisbild transparent zu malen. Verwenden Sie {MARKUP} > Text zeichnen, um den gewünschten Text mit Schriftart, Farbe und anderen gewünschten Attributen auf das Basisbild zu setzen. Skalieren Sie den Text so, dass er den größten Teil des Basisbildes ausfüllt. Das Basisbild (Hintergrund) ist transparent. Entfernen Sie bei Bedarf überschüssige Ränder mit {ZUSCHNEIDEN}. Speichern Sie das endgültige Bild. Ein praktischer Speicherort ist /saved_areas, es kann aber jeder beliebige Ordner verwendet werden. Dieses Bild kann nun als Overlay-Bild für Stapel-Overlay verwendet werden. - Verwenden Sie die Schaltfläche ^Select host image files^, um die Host-Bilddateien auszuwählen, die das Overlay-Bild erhalten sollen. Verwenden Sie die Schaltfläche ^Select overlay file^, um die Overlay-Bilddatei auszuwählen. - Die beiden Eingaben ^Overlay position^ bestimmen, wo das Overlay-Bild auf dem Host-Bild positioniert wird, von 1-99% des Abstands von oben nach unten und 1-99% des Abstands von links nach rechts. 0/0 bedeutet die obere linke Ecke, 99/99 bedeutet die untere rechte Ecke. Das Overlay-Bild wird so positioniert, dass es nicht über die Ränder des Host-Bildes hinausragt. - Geben Sie ^Overlay width^ als Prozentsatz der Host-Bildbreite an. Die Höhe wird so eingestellt, dass das Breiten-/Höhenverhältnis erhalten bleibt. Ist ^Make width constant for window size^ aktiviert, wird die visuelle Größe des Overlay-Bildes für die unten angegebene Fenstergröße konstant gehalten. Ohne dies hätte ein "hohes" Bild, das mit großen linken und rechten Rändern angezeigt wird, ein visuell kleineres Overlay-Bild. Die anfängliche Fenstergröße ist das aktuelle Fenster. Sie können jede beliebige Größe eingeben. Drücken Sie ^refresh^, um das aktuelle Fenster festzulegen, falls sich dieses geändert hat. - Ist ^Replace host files^ ausgewählt, werden die Eingabe-Host-Dateien durch die überlagerten Ausgabe-Host-Dateien ersetzt. Ist ^Make new versions^ ausgewählt, werden neue Versionen der Eingabe-Host-Dateien erstellt. - - TOPIC: SAMMEL-KEYWORDS +image: batch-keywords.jpg - Fügt Keywords für eine große Anzahl von Bilddateien gleichzeitig hinzu, entfernt sie oder ändert sie. - Verwenden Sie die Schaltfläche [select files], um die Bilddateien auszuwählen ({BILDDATEIEN AUSWÄHLEN}). - Der Dialog zeigt zwei Listen von Keywords: die, die zu den ausgewählten Dateien hinzugefügt werden sollen, und die, die entfernt werden sollen. Verfügbare Keywords werden im Fenster Defined Keywords darunter angezeigt. Eines davon kann durch Anklicken zur aktuell ausgewählten Keyword-Liste (hinzufügen oder entfernen) hinzugefügt werden. Ein Keyword kann durch Anklicken aus einer der beiden Keyword-Listen gelöscht werden. Um Keywords zu ersetzen, geben Sie die neuen Keywords in die Liste add keywords und die alten Keywords in die Liste remove keywords ein. - Ist die Liste der definierten Keywords lang, kann es einfacher sein, das gewünschte Keyword in Enter New Keyword einzugeben. Vorhandene Keywords, die dem bisher Eingegebenen entsprechen, erscheinen unter Matching Keywords, und Sie können eines davon durch Zeigen und Klicken zum Bild hinzufügen. Ist das eingegebene Keyword neu (es wird kein passendes Keyword angezeigt), drücken Sie [Hinzufügen], sobald das Keyword vollständig ist. Es wird zur ausgewählten Keyword-Liste und zur Liste der definierten Keywords unter der Kategorie "nocatg" hinzugefügt. - Wenn Sie Keyword-Kategorien verwenden, können Sie eine Kategorie auswählen, sodass nur diese Keywords in der Liste der definierten Keywords angezeigt werden. Ist Ihre Keyword-Liste riesig, kann dies die Liste auf eine überschaubare Größe zum Zeigen und Klicken reduzieren. - Um eine Liste von Bildern mit bestimmten Keywords zu erhalten, die Sie entfernen oder ersetzen möchten, verwenden Sie {BILDER SUCHEN}, um die Bilder zu finden, starten Sie dann diese Funktion und verwenden Sie [select files], um alle soeben gefundenen Bilddateien hinzuzufügen, oder wählen Sie eine beliebige Teilmenge aus. - - TOPIC: SAMMEL-KEYWORDS UMBENENNEN +image: batch-rename-keywords.png - Benennt eine beliebige Anzahl von Keywords um und wendet diese Änderungen auf Ihre gesamte Bildsammlung an. Klicken Sie auf ein umzubenennendes Keyword aus der Liste der definierten Keywords, geben Sie einen neuen Namen in das Feld Rename to ein, klicken Sie dann auf die Pfeilschaltfläche, um dieses Namenspaar zur Liste auf der rechten Seite hinzuzufügen. Wiederholen Sie dies für jedes umzubenennende Keyword. Klicken Sie auf das Namenspaar in der Liste, um es zu entfernen. Drücken Sie [Fortfahren], wenn Sie fertig sind. Möchten Sie ein Keyword löschen, ohne es umzubenennen, verwenden Sie 'delete' als neuen Namen. - Ein Popup-Fenster zeigt die Anzahl der Bilddateien mit den betroffenen Keyword-Namen an. Drücken Sie [Ja], um fortzufahren. Die Aktualisierungsrate liegt bei etwa 500/Minute auf einem leistungsstarken Computer. Beim nächsten Start von Fotocx aktualisiert die Dateiindizierungsfunktion alle Thumbnails für dieselben Bilder, da sich das Dateiänderungsdatum geändert hat. - - TOPIC: SAMMEL-KEYWORDS ENTFERNEN +image: batch-purge-keywords.jpg - Bereinigt (löscht) unerwünschte Keywords aus allen Bilddateien. Dies ist besonders nützlich, um unerwünschte Keywords loszuwerden, die aus heruntergeladenen Bilddateien hinzugefügt wurden. Klicken Sie auf unerwünschte Keywords auf der linken Seite des Dialogs, um sie zur purge-Liste auf der rechten Seite des Dialogs hinzuzufügen. Drücken Sie [proceed], wenn Sie fertig sind. - - TOPIC: SAMMEL-AUFNAHMEDATUM +image: batch-photo-date1.png +image: batch-photo-date2.png - Korrigiert schnell eine Reihe von Fotos, die kein Fotodatum/-uhrzeit oder ein falsches haben. Verwenden Sie die Schaltfläche [select files], um ein Galeriefenster zu öffnen, in dem Sie die zu bearbeitenden Bilddateien auswählen können ({BILDDATEIEN AUSWÄHLEN}). - Es gibt zwei Möglichkeiten, Fotodatum/-uhrzeit zu ändern: • Neues Datum/Uhrzeit festlegen (rechtes Bild oben): Geben Sie nur ein neues Jahr ein (yyyy) - nur das Jahr wird in den Dateien ersetzt. Geben Sie nur ein Datum ein (yyyy:mm:dd) - das Datum wird ersetzt, aber nicht die Uhrzeit. Geben Sie ein vollständiges Datum/Uhrzeit ein (yyyy:mm:dd hh:mm:ss) - beide werden ersetzt. • Vorhandenes Datum/Uhrzeit verschieben (linkes Bild): Geben Sie +- oder --Werte in eines der 6 Felder ein: Jahre, Monate, Tage, Stunden, Minuten, Sekunden. Daten/Uhrzeiten werden um die eingegebenen Werte verschoben. - Verschobene Datums-/Uhrzeitwerte übertragen sich bei Bedarf auf den nächsthöheren Wert: Uhrzeit 08:30 um -50 Minuten verschoben ergibt 07:40 Datum 2016-10-20 um +6 Monate und -30 Tage verschoben ergibt 2017-03-21 (März hat 31 Tage). - Ist das Kontrollkästchen 'test' aktiviert, wird zur Überprüfung ein Bericht der alten und neuen Datums-/Uhrzeitwerte für die ausgewählten Dateien erstellt. Es werden keine Änderungen an den Dateien vorgenommen. Sind Sie überzeugt, dass die Ergebnisse korrekt sind, entfernen Sie das Kontrollkästchen und führen Sie den Vorgang erneut aus, um die Dateien zu aktualisieren. - - TOPIC: SAMMEL-METADATENÄNDERUNG +image: batch-change-meta.png - Überarbeitet Metadata für mehrere Bilddateien. Sie können neue Metadata hinzufügen, vorhandene überarbeiten und löschen. Verwenden Sie die Schaltfläche [select files], um ein Galeriefenster zu öffnen, aus dem Sie die zu bearbeitenden Dateien auswählen {BILDDATEIEN AUSWÄHLEN}. Geben Sie die zuzuweisenden Metadata-Tag-Namen und -Werte ein, oder lassen Sie den Wert leer, um den Tag zu löschen. Drücken Sie [anwenden]. Sie erhalten eine Bestätigungsmeldung und können zu diesem Zeitpunkt fortfahren oder abbrechen. Links wird eine Liste häufig verwendeter Tag-Namen bereitgestellt. Klicken Sie auf einen davon, um ihn in das erste leere Tag-Namen-Feld im Dialog einzufügen. Diese Liste stammt aus der Datei /metadata_picklist, die Sie bearbeiten können, um weitere Tags zur Liste hinzuzufügen. Die Schaltfläche [Vollständige Liste] liefert Informationen dazu, wie Sie eine Liste aller verfügbaren Tag-Namen erhalten. - - TOPIC: SAMMEL-METADATENBERICHT +image: add-meta-tags.png +image: batch-report-meta.png - Meldet beliebige Metadata für eine beliebige Anzahl von Bildern. Die Ausgabe ist eine Textdatei, die im Standard-Texteditor Ihres Systems angezeigt wird. Sie können die Suchfunktionen des Texteditors verwenden, um Bilder mit gewünschten Metadata zu finden, oder die Textdatei als Eingabe für andere Programme verwenden. Verwenden Sie die Schaltfläche [select files], um ein Galeriefenster zur Auswahl der zu bearbeitenden Dateien zu öffnen ({BILDDATEIEN AUSWÄHLEN}). Die Schaltfläche [bearbeiten] öffnet einen neuen Dialog (rechts), in dem Sie die zu meldenden Metadata-Tags auswählen können. Klicken Sie auf einen Tag in der linken Spalte, um ihn zur rechten Spalte und zum Bericht hinzuzufügen. Klicken Sie auf einen Tag in der rechten Spalte, um ihn zu entfernen. Klicken Sie auf den letzten Tag in der linken Spalte, "Other tag ...", um einen beliebigen, nicht in der Liste enthaltenen Tag-Namen einzugeben; die Liste enthält nur die wahrscheinlich am häufigsten benötigten Tags. - - TOPIC: SAMMEL-GEOTAGS +image: batch-geotags.png - Wählen Sie viele Bilder aus und fügen Sie ihnen allen dieselben Standortdaten hinzu. Verwenden Sie die Schaltfläche [select files], um die Bilddateien aus einem Galeriefenster auszuwählen ({BILDDATEIEN AUSWÄHLEN}). Ermitteln Sie dann die Standortdaten wie in {HAUPTMETADATA BEARBEITEN} beschrieben, mit der Schaltfläche [Suchen] oder durch Klicken auf eine Kartenmarkierung. Verwenden Sie diese Funktion auch, um Unstimmigkeiten in der Standort-Schreibweise oder bei latitude/longitude-Daten zu beheben. Bleiben location und/oder country leer, werden sie nicht aktualisiert. Um location oder country zu löschen, geben Sie den Namen "null" ein. Bleiben latitude und longitude leer, werden sie nicht aktualisiert. Um latitude und longitude zu löschen, geben Sie für beide Werte "0" ein. Sie können nur location/country, nur latitude/longitude oder beides aktualisieren. In der Praxis werden Sie möglicherweise feststellen, dass die Kamera-GPS latitude und longitude ohne location und country einfügt, oder eine unerwünschte Sprache verwendet, oder durchgehend Großbuchstaben, oder einen anderen reparaturbedürftigen Wert. - - TOPIC: DATEIEN EXPORTIEREN Kopiert ausgewählte Bilddateien in einen anderen Ordner. Der vorgesehene Zweck ist das Kopieren von Dateien zur Weitergabe an andere, z. B. das Hochladen von Dateien auf eine Website. Die Ausgabedateien sind JPEG. Sie können die Bilder optional verkleinern. Wählen Sie Bilddateien durch Klicken auf Galerie-Thumbnails aus ({BILDDATEIEN AUSWÄHLEN}). Wählen Sie einen Ordner, in den die Bilddateien kopiert werden. Ist 'export metadata' ausgewählt, wird auch eine begrenzte Auswahl an Metadata kopiert. Diese sind: Fotodatum, keywords, Copyright, Titel, Beschreibung. - - TOPIC: WERKZEUGE-MENÜ - - TOPIC: DATEIEN INDIZIEREN +image: index-files1.png - Fotocx muss alle Ihre Bildordner- und Dateinamen sowie eingebettete Metadata kennen (dates, tags, geotags, titles, descriptions, ratings). Diese Daten werden zur schnellen Suche indiziert. Fotocx erstellt außerdem Thumbnail-Bilder, damit die Galeriefenster (Thumbnail-Seiten) schnell angezeigt werden. Fotocx verändert oder kopiert Ihre Bilddateien nicht. Der benötigte Speicherplatz beträgt typischerweise 2% Ihres Bilddateienspeicherplatzes. - Die Funktion Dateien indizieren läuft bei jedem Start von Fotocx. Diese Funktion erstellt fehlende Thumbnails, ersetzt veraltete und aktualisiert den Metadata-Index anhand aktueller Daten aus Ihren Bilddateien. Dies kann erhebliche Zeit in Anspruch nehmen, wenn Sie viele Tausend neue Dateien haben. - Bilddateien, die innerhalb von Fotocx geändert oder verschoben werden, werden automatisch berücksichtigt. Die Indizierungsfunktion wird nur für neue Bilddateien verwendet, die außerhalb von Fotocx erstellt wurden (z. B. wurde eine neue Reihe von Fotos hinzugefügt), sowie für Dateien, die außerhalb von Fotocx geändert oder verschoben wurden. - Geben Sie Ihre Top-Bildordner ein (z. B. /home//Pictures). Verwenden Sie die Schaltfläche [durchsuchen], um Ordner zu suchen und hinzuzufügen. Diese Ordner und alle enthaltenen Unterordner werden verarbeitet. Es spielt keine Rolle, ob andere Dateien mit den Bildern vermischt sind. Löschen Sie einen Eintrag durch Klicken auf das entsprechende 'X'. - Geben Sie den Thumbnails-Ordner ein, in dem Thumbnail-Dateien gespeichert werden. Verwenden Sie den mitgelieferten Standardordner oder legen Sie einen eigenen Speicherort fest. - Haben Sie Ordner- oder Dateinamen zur Klassifizierung Ihrer Bilder verwendet, können Sie diese sofort in der Funktion {BILDER SUCHEN} nutzen. Haben Sie dates, keywords, geotags, titles oder ratings in Ihren Bild-Metadata gespeichert, sind diese ebenfalls durchsuchbar. Nach der Indizierung der Bilder erfolgt die Suche nach einem dieser Kriterien nahezu augenblicklich. - ^Metadata-Tags Die folgenden Metadata sind standardmäßig im Bildindex enthalten: • Ordner- und Dateinamen • Fotodatum/-uhrzeit • Dateiänderungsdatum/-uhrzeit • title und description (exif-Metadata) • rating (0-5 Sterne) • keywords (Benutzerkennzeichnungen) • geotags (Länder- und Ortsnamen sowie latitude/longitude) • Kamera: Hersteller, Modell, Objektiv • Belichtung: Zeit, Blendenzahl, Brennweite, ISO - ^Zusätzliche Metadata-Tags +image: index-files2.png - Sie können bis zu 20 weitere Metadata-Tags zum Bilddateienindex hinzufügen. Metadata in dieser Liste können ebenso schnell durchsucht werden wie die Standard-Tags. Möglicherweise benötigen Sie dies nicht, aber wenn Sie manchmal nicht standardmäßige Metadata-Tags durchsuchen müssen, können Sie sie hier hinzufügen, und die Suchgeschwindigkeit wird nahezu augenblicklich sein. Drücken Sie die Schaltfläche [select] für "extra metadata", um den obigen Dialog zu erhalten. Klicken Sie auf Tags in der linken Liste, um sie zur rechten Liste hinzuzufügen - die Tags, die zum Index hinzugefügt werden. Klicken Sie auf einen Tag in der rechten Liste, um ihn zu entfernen. Drücken Sie [done], um die Änderungen zu übernehmen. Ihre gesamte Bildsammlung wird erneut indiziert. Dies geschieht schneller als die anfängliche Indizierung, da Thumbnails nicht neu erstellt werden. - ^Zugriff auf nicht indizierte Dateien und Ordner Eine nicht indizierte Bilddatei oder ein nicht indizierter Ordner ist eine Datei/ein Ordner, die/der nicht in Ihren deklarierten Top-Bildordnern enthalten ist (Unterordner Ihrer deklarierten Bildordner sind immer enthalten). Sie können zu einem solchen Ordner navigieren und die Thumbnails normal anzeigen, und Sie können solche Dateien normal ansehen und bearbeiten. Es gibt Einschränkungen, die Sie verstehen sollten: • Diese Dateien fehlen in allen Suchergebnissen und Kartenansichten. • Thumbnails werden zum Zeitpunkt der Anzeige erstellt - Galerien werden langsam sein. Wenn Sie auf ein tragbares (langsames) Speichergerät zugreifen (z. B. eine Kamera-SD-Karte), werden Sie die stockende Leistung bemerken. Thumbnails werden bei Bedarf erstellt und bleiben erhalten, nachdem das Gerät entfernt wurde. Vorschlag: Kopieren Sie die Dateien in einen deklarierten Fotocx-Ordner und führen Sie dann die benötigte Verarbeitung von diesem Speicherort aus durch. Die Leistung wird viel besser sein. - ^Wechseldatenträger (USB-Laufwerk) Enthalten Ihre Top-Bildordner Ordner auf einem Wechseldatenträger und Sie führen Fotocx aus, ohne dass das Laufwerk eingebunden ist, bleiben die Indexdaten und Thumbnails dennoch erhalten, auch wenn die Wechseldateien verschwunden sind. Wird der Wechseldatenträger wieder eingebunden und Fotocx gestartet, wird der letzte Status wiederhergestellt. Wurden in der Zwischenzeit Dateien hinzugefügt oder geändert, werden Indexdaten und Thumbnails aktualisiert. - - TOPIC: FOTOCX-STARTORDNER VERSCHIEBEN Der Fotocx-Home-Ordner enthält alle Benutzereinstellungen und -daten, einschließlich einiger Dateien aus dem Fotocx-Paket, die vom Benutzer angepasst werden können. Standardspeicherort: /home//.fotocx. Sind mehrere Versionen oder Releases von Linux installiert, kann es wünschenswert sein, einen gemeinsam genutzten Fotocx-Home-Ordner zu haben, statt für jedes Release einen eigenen. Dasselbe kann gelten, wenn mehrere Benutzer auf dieselbe Fotocx-Instanz zugreifen müssen. - Verwenden Sie diese Funktion, um den Fotocx-Home-Ordner an einen anderen Ort zu verschieben. Der ausgewählte Ordner sollte "fotocx" im Pfadnamen enthalten, andernfalls wird "/fotocx" angehängt. - Siehe {BEFEHLSPARAMETER} -home Parameter, wenn Sie mehrere, separat verwaltete Fotocx-Bildsammlungen wünschen. - - TOPIC: EINSTELLUNGEN +image: settings.jpg - Verschiedene Benutzereinstellungen werden gesammelt und in der Datei /parameters gespeichert. Die meisten Änderungen werden sofort wirksam. Einige führen zu einem Neustart von Fotocx. - • Wählen Sie den gewünschten 2-stelligen Sprachcode. Fotocx startet in der gewählten Sprache neu. • Startup View - anfängliche Anzeige beim Start von Fotocx. Recent Files: die zuletzt angesehenen Bilddateien Newest Files: zuletzt hinzugefügte/geänderte Dateien Specific Gallery: die angegebene Ordnergalerie Album Gallery: die angegebene Albumgalerie Previous Gallery: zuletzt in der vorherigen Sitzung verwendete Galerie Previous File: zuletzt in der vorherigen Sitzung angesehene Datei Specific File: die angegebene Bilddatei Browse-Schaltfläche: einen Ordner, ein Album oder eine Bilddatei auswählen • Background - Hintergrundfarben für Dateiansicht- und Galerieansicht-Fenster • Menu Style - Menü-Anzeigestil: Symbole, Text oder beides • Menu Colors - Menütextfarbe und Hintergrundfarbe • Dialog Font - Schriftart für Menüs und Dialoge • Show Hidden - falls ausgewählt, versteckte Dateien und Ordner anzeigen • Zoom Speed - 1-8 Klicks oder [+]-Tastendrücke pro 2-facher Bildvergrößerung wählen • JPEG files - Qualitätsstufe, Standard 90, verwenden Sie 70+ für gute Qualität • Curve Node - Mindestabstand der Knoten für Bearbeitungskurven, % der Skala. Der Standardwert ist 5% der Skala. Verwenden Sie einen höheren Wert für Touchpads. • Image Position - Bild ist links/mittig/rechts innerhalb eines breiteren Fensters • Confirm Exit - Popup-Dialog-Option: möchten Sie wirklich beenden? • Index Level - siehe unten • RAW Loader - siehe unten • RAW Options - siehe unten • RAW Files - Liste der verwendeten RAW-Dateitypen • Video Files - Liste der verwendeten Videodateitypen • Video App - siehe unten - ^Dateiqualität und Komprimierung JPEG-Dateiqualitätsstufe: Verwenden Sie 70 oder höher für gute Bildqualität (Standard 90). Die TIFF-Komprimierungsmethode ist DEFLATE (am besten für Farbbilder). Die PNG-Komprimierungsstufe ist '1'. Höhere Werte scheinen nichts zu bewirken, außer die Speicherzeit der Datei zu erhöhen (libpng). - ^Image Position Ist das Fenster breiter als das Bild (d. h. Fenster-Breiten-/Höhenverhältnis > Bild), kann das Bild nach links, mittig oder nach rechts verschoben werden. Bei links oder rechts wird der ungenutzte Rand maximiert, was für die Positionierung von Dialogfeldern praktischer sein kann. - ^Bildindexstufe Diese beiden Parameter regeln einen Kompromiss zwischen Startzeit und Vollständigkeit des Bildindex. • $ fotocx: Gilt, wenn fotocx über einen Shell-Befehl, ein Systemmenü oder ein Systemsymbol/Launcher gestartet wird. Der empfohlene Wert '2' bedeutet vollständige Indizierung: die alte Indexdatei laden, nach neuen (noch nicht indizierten) Dateien suchen und die fotocx-Indexdatei aktualisieren. • $ fotocx : Gilt, wenn fotocx durch Klicken auf einen Dateinamen in einer Dateimanager-Liste gestartet wird. Der empfohlene Wert '1' bedeutet, die alte Indexdatei zu laden, aber nicht nach neuen Dateien zu suchen, um den Index zu aktualisieren. Der Start ist mäßig schnell. Bildsuche und Kartenfunktionen funktionieren normal, aber neue (noch nicht indizierte) Bilddateien sind nicht enthalten. • Alternative: '0' bedeutet keine Indizierung. Der Start ist sehr schnell. Die spätere Verwendung einer Bildsuch- oder Kartenfunktion startet die Dateiindizierungsfunktion nur für alte Dateien (keine Suche nach neuen/geänderten Dateien). Verwenden Sie diese Option, wenn Ihre Bildsammlung riesig ist und die Startzeit mehr als ein paar Sekunden beträgt. Sie können die Indizierungsfunktion bei Bedarf später starten. - ^RAW Loader Der RAW Loader ist der Befehl, der zum Lesen einer RAW-Datei und deren Umwandlung in TIFF mit 16-Bit-Farbtiefe verwendet wird. Er wird verwendet, wenn eine RAW-Datei angezeigt wird. Sie können die Bearbeitungsfunktionen von Fotocx verwenden, um die Datei zu bearbeiten und zu optimieren. Der standardmäßige RAW Loader ist dcraw unter Verwendung des sRGB-Farbraums. Einige weitere Optionen mit dcraw oder rawtherapee sind in der Auswahlliste enthalten. Diese Befehle werden in der Datei 'raw_commands_*' im Fotocx-Home-Ordner aufbewahrt. Bearbeiten Sie diese Datei, um Optionen zu ändern oder neue hinzuzufügen (siehe unten). Möglicherweise möchten Sie mehrere Befehle für mehrere Kameras oder mehrere Verarbeitungsoptionen vorbereiten. Wenn Sie lieber interaktiv einen RAW-Editor verwenden möchten, erstellen Sie dafür einen Plugin-Befehl - siehe {PLUGINS}. - ^RAW Options • edit commands: drücken Sie die Schaltfläche, um die Liste der RAW-Loader-Befehle zu bearbeiten. Ein Texteditor startet in einem neuen Fenster mit der aktuellen Befehlsliste. • match embedded image color: verwendet das in der RAW-Datei eingebettete Bild als Vorlage, um die RAW-Bildfarben dem konvertierten TIFF-Bild zuzuordnen. Dies ist die Interpretation der RAW-Daten durch den Kamerahersteller - ein guter Ausgangspunkt, wenn die RAW-Datei weiter bearbeitet werden soll. Das eingebettete Bild ist meist identisch mit der JPEG-Datei der Kamera. - ^Video App Geben Sie einen Shell-Befehl ein, um eine Video-Wiedergabe-App zu starten. Verwenden Sie '%s', um zu markieren, wo der Videodateiname in die Befehlszeile eingefügt wird. Hier einige Beispiele: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: TASTENKÜRZEL +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - Zeigt benutzerdefinierte Tastenkürzel an oder ändert sie. Aktuell zugewiesene Tastenkürzel werden im ersten Fenster angezeigt. Wenn Sie die Schaltfläche [Bearbeiten] drücken, wird der zweite Dialog angezeigt, in dem Sie Tastenkürzel hinzufügen und ändern können. Geben Sie ein neues Tastenkürzel über die Tastatur ein. Sie können die Tasten A-Z, 0-9, F2-F9 und die meisten Symbole (% $ & * < usw.) verwenden. Sie können eine Taste mit einer von Strg/Alt/Umschalt kombinieren: Halten Sie EINE von Strg/Alt/Umschalt gedrückt, drücken Sie dann die Taste, und lassen Sie dann beide los. Wählen Sie eine der verfügbaren Menüzuweisungen aus der Liste rechts aus, drücken Sie dann [Hinzufügen] und [OK]. Entfernen Sie ein Tastenkürzel, indem Sie es auswählen und [Löschen] drücken. - - TOPIC: RGB-HISTOGRAMM +image: RGB-hist.png - Ein kleines Fenster zeigt ein Helligkeitshistogramm-Diagramm des aktuellen Bildes in der Dateiansicht oder des aktuell ausgewählten Bildbereichs. Dieses Diagramm wird synchron aktualisiert, während Bearbeitungsfunktionen das Bild ändern. Verwenden Sie die Schaltflächen [Alle] [Rot] [Grün] [Blau], um anzuzeigende Farben auszuwählen. - - TOPIC: BILD VERGRÖSSERN +image: magnify-image.jpg - Vergrößert das Bild in einem Bereich um den Mauszeiger. Ziehen Sie die Maus bei gedrückter linker Taste über das Bild, um verschiedene Bereiche zu vergrößern, ähnlich wie beim Betrachten eines gedruckten Bildes mit einer Lupe. Verwenden Sie den Dialog, um den Radius des Bereichs und den Vergrößerungsgrad anzupassen. - - TOPIC: BILD MESSEN Klicken Sie auf zwei beliebige Positionen innerhalb eines Bildes, um den Pixelabstand zwischen den Punkten zu messen. Die angeklickten Positionen werden im Bild mit A und B beschriftet. Diese Beschriftungen zeigen immer die zuletzt angeklickten zwei Punkte. Der Dialog wird mit den Abständen zwischen diesen beiden Punkten aktualisiert: X-distance (horizontaler Abstand) Y-distance (vertikaler Abstand) H-distance (Gesamtabstand) - - TOPIC: RGB ANZEIGEN +image: show-RGB.png - Wird ein Punkt im Bild angeklickt, werden die RGB-Werte in einem Dialogfenster angezeigt. Die letzten 9 angeklickten Punkte werden angezeigt. Die Werte haben das Format xxx.dd, wobei xxx die oberen 8 Bit des Farbwerts und .dd die unteren 8 Bit sind. Der Bereich reicht von 0.00 bis 255.99. Die unteren 8 Bit sind null, sofern das Bild nicht bearbeitet wird oder über 8 Bit Farbtiefe hinausgeht. Die Ausgaben werden in Echtzeit aktualisiert, wenn das Bild bearbeitet wird. Ist "labels" aktiviert, werden die Punkte im Bild mit Buchstaben beschriftet, die den Buchstaben im Dialogfenster entsprechen. Ist "delta" aktiviert und das Bild wird bearbeitet, werden RGB-Änderungen statt der absoluten Werte angezeigt. - Öffnen Sie ein anderes Bild (z. B. zum Vergleich mit dem vorherigen Bild), bleiben die Positionen erhalten und werden aktualisiert, falls sie innerhalb der Grenzen des neuen Bildes liegen. Dies erleichtert den Vergleich von Bildern auf Ebene der Pixel-RGB-Werte. - - TOPIC: RASTEREINSTELLUNGEN +image: grid-settings.jpg - Es gibt zwei Rasterlinien-Funktionen: Raster-Einstellungen legt alle Rasterparameter fest. Raster umschalten schaltet die Rasterlinien ein oder aus. Rasterlinien sind horizontale und vertikale Linien in regelmäßigen Abständen über das Bild. Diese Linien können als nützliche Ausrichtungshilfen dienen, wenn ein Bild begradigt oder verzerrt wird, um Wände oder andere Objekte im Bild gerade zu machen. Verwenden Sie die Eingaben x-count und y-count, um die Anzahl der vertikalen bzw. horizontalen Linien festzulegen. Die Steuerelemente x-offset und y-offset können verwendet werden, um die Rasterlinien so zu verschieben, dass sie eine gewünschte Position im Bild schneiden. Ein Tastenkürzel (Standard Umschalt+G) kann Raster umschalten zugewiesen werden, sodass die Rasterlinien mit einem Tastendruck ein- oder ausgeschaltet werden können. - - TOPIC: LINIENFARBE Einige Funktionen zeichnen Linien über das Bild (Zuschneiden, Bereich auswählen, andere). Sie können die Farbe dieser Linien ändern, um den Kontrast zum Hintergrundbild zu maximieren. Der kleine Dialog kann während der Bearbeitung geöffnet bleiben, um bequem zwischen verfügbaren Farben (Schwarz, Weiß, Rot, Grün) zu wechseln. - - TOPIC: DUNKLE/HELLE PIXEL Hebt die dunkelsten und hellsten Pixel in einem Bild hervor. Passen Sie die beiden Drehfelder an, um die Helligkeitsschwellenwerte festzulegen, die anfänglich 0 für dunkle Pixel und 255 für helle Pixel betragen. Pixel mit einer Helligkeit unter dem dunklen Schwellenwert oder über dem hellen Schwellenwert werden "geblinkt", um sie hervorzuheben. Verwenden Sie diese Funktion, um Clipping nach dem Bearbeiten von Helligkeit oder Farbe zu erkennen. - - TOPIC: MONITORFARBE +image: moncolor-small.png - Acht Farbbänder werden mit einer Helligkeit von null (Schwarz) bis 100% über den Bildschirm gezeichnet. Sie können dies verwenden, um Helligkeit und Kontrast Ihres Monitors anzupassen. An keinem der beiden Enden der Bänder sollte es unveränderliche Bereiche geben. - - TOPIC: DUPLIKATE FINDEN +image: find-dups.png - Findet doppelte Bilddateien überall in Ihrer Bilddatenbank. Eine doppelte Datei kann eine Datei sein, die eine andere Datei exakt oder "fast" dupliziert. Aus Geschwindigkeitsgründen werden Thumbnail-Bilder im Speicher verglichen. Es ist möglich, dass übereinstimmende Thumbnails für Hauptbilder mit geringfügigen, in den Thumbnails nicht widergespiegelten Unterschieden gefunden werden. Eine in der Größe verkleinerte Bildkopie wird wahrscheinlich als Duplikat eingestuft. Die Thumbnail-Größe kann von 32 bis 512 Pixel eingestellt werden. Eine größere Größe verringert die Wahrscheinlichkeit von Fehlalarmen. Die Thumbnail-Größe beeinflusst den benötigten Hauptspeicher erheblich - z. B. benötigt bei 100.000 Bildern die Größe 64 etwa 880 MB, während die Größe 256 etwa 14 GB benötigt. Drücken Sie die Schaltfläche [calculate], um die größte Thumbnail-Größe zu berechnen, die innerhalb des verfügbaren freien Speichers passt. - Zwei Parameter werden verwendet, um die Empfindlichkeit für die Erkennung identischer oder nahezu identischer Bilder festzulegen: pixel difference ist die RGB-Wertdifferenz, unterhalb derer Pixel als gleich gelten. Pixel count ist die Anzahl unterschiedlicher Pixel, unterhalb derer zwei Bilder als Duplikate eingestuft werden. Beispiel: Bei pixel difference = 2 und pixel count = 10 werden Bilder als Duplikate eingestuft, wenn weniger als 10 Pixel um 2 oder weniger abweichen. - Die Ausgabe ist eine Galerie, die jede Gruppe doppelter Bilder zeigt. Die Ausgabegalerie wird als Album "Duplicate Images" gespeichert. Sie können Stapel Löschen/Papierkorb zusammen mit diesem Album verwenden, um auszuwählen, welche Duplikate gelöscht werden sollen. - - TOPIC: FEHLERHAFTE DATEIEN FINDEN Alle Bilddateien innerhalb Ihrer deklarierten Top-Ordner werden gelesen. Für jede Datei, die nicht gelesen werden kann, haben Sie drei Optionen: • die Datei löschen • einen falschen Dateityp korrigieren (siehe unten) • die Datei an eine Stelle außerhalb Ihrer Top-Bildordner verschieben Ich habe oft .png-Dateien mit der Erweiterung .jpg gesehen. Webbrowser und einige andere Apps behandeln dies stillschweigend. Hier wird der korrekte Dateityp gemeldet, und Sie können die Erweiterung in die richtige ändern. - - TOPIC: RESSOURCEN ANZEIGEN Meldet die von Fotocx verwendeten Computerressourcen: • CPU time: Nutzung seit dem Start von Fotocx oder seit der letzten Messung • Real memory: der derzeit genutzte reale Speicher (ohne Swap) • Maps cache: MB an Festplattenspeicher für zwischengespeicherte Kartenkacheln • Clear cache: alle zwischengespeicherten Kartenkacheln löschen • Schaltfläche [Sample]: eine neue Messung vornehmen und die Daten melden - Die Schaltfläche [Sample] setzt die CPU-Zeit zurück. Die nächste Messung zeigt nur die neu angesammelte CPU-Zeit. Die CPU-Zeit ist die Summe für alle Prozess-Threads. - - TOPIC: ÜBERSETZUNGEN Übersetzungen für mehrere Sprachen sind im Fotocx-Paket enthalten. Diese KI-Übersetzungen sind nicht perfekt. Übersetzungsfehler können durch Bearbeiten der Übersetzungsdateien korrigiert werden. - ^Ändern der GUI-Sprache Das Menü {EINSTELLUNGEN} kann verwendet werden, um die Sprache zu ändern. Die Sprache kann auch beim Start von Fotocx festgelegt werden: $ fotocx -lang xx # Sprache xx (de fr zh usw.) $ fotocx -lang en # Englisch - ^Eine GUI-Übersetzung ändern Bearbeiten Sie die Datei /translations/gui_xx Die Textzeilenpaare haben führende 4-stellige Nummern, die übereinstimmen müssen. Die erste Zeile ist Englisch, die 2. Zeile ist Sprache xx. Ändern Sie nur die xx-Zeile, niemals die englische Zeile. Die Sonderzeichen zum Einfügen von Parametern in den Text müssen in derselben Reihenfolge bleiben. Diese sind '%d' (Ganzzahlparameter), '%f' (Dezimalzahl), '%s' (Text). - ^Eine Benutzerhandbuch-Übersetzung ändern Bearbeiten Sie die Datei /translations/ug_xx Bearbeiten Sie ug_xx, um die Übersetzung zu korrigieren. Fügen Sie keine Textzeilen hinzu, entfernen Sie keine, und ändern Sie nicht die Reihenfolge. Die Textzeilen müssen 1:1 dem englischen Benutzerhandbuch ug_en entsprechen. - Senden Sie überarbeitete Dateien zur Aufnahme in die nächste Fotocx-Version an: mkornelix@gmail.com - - TOPIC: HILFE-MENÜ • Benutzerhandbuch - Inhaltsverzeichnis anzeigen • Video-Tutorial - ein Fotocx-Video-Tutorial auf YouTube anzeigen • Externe Programme - externe Programme und ihre Funktionen auflisten • Protokolldatei anzeigen - protokollierte Informationen und Fehlermeldungen anzeigen • Befehlsparameter - verfügbare Befehlszeilenparameter anzeigen • Änderungsprotokoll - Neuerungen und Fehlerbehebungen in den letzten Versionen anzeigen • Copyright - für Fotocx relevante Urheberrechte und Lizenzen anzeigen • Datenschutz - die Datenschutzrichtlinie (Regeln) für Fotocx anzeigen • Über - Versionsnummer, Speicherort der ausführbaren Datei, Kontakt anzeigen • Startseite - die Fotocx-Startseite auf kornelix.net anzeigen • Deinstallieren - wie Fotocx deinstalliert wird - - TOPIC: WEITERE THEMEN Die folgenden Themen sind nicht mit Fotocx-Menüs verknüpft. - - TOPIC: VIDEO FILES Videodateien (.mpeg, .mp4 usw.) können mit Ihren Bilddateien vermischt sein. Sie werden sowohl in der Dateiansicht als auch in der Galerieansicht als Bilddateien angezeigt. Die Taste 'P' startet, pausiert und setzt das Video fort, oder wiederholt ein beendetes Video. Die Taste 'Q' beendet das Video. Verwenden Sie das Menü {EINSTELLUNGEN}, um die Anwendung zum Abspielen von Videodateien auszuwählen. - - TOPIC: DIAS UND NEGATIVE +image: color-negative.jpg - Sie können eine Kamera mit Nahaufnahmefähigkeit verwenden, um Dias oder Filmnegative zu erfassen. Verwenden Sie einen Leuchtkasten zur Beleuchtung, oder verwenden Sie den Himmel (Beispiel oben). Um ein Farbnegativ zu bearbeiten, erstellen Sie zunächst ein Positiv - siehe {FARBMODUS}. Ist das Bild dunstig, wählen Sie nur den Bildbereich aus, ohne die Filmränder, und verwenden Sie dann {GLOBALER RETINEX}, um den Dunst zu beseitigen. Legen Sie bei Bedarf die Weiß- und Schwarzpunkte durch Klicken auf das Bild fest, um den Dunst weiter zu reduzieren. - - TOPIC: FOTOCX-EINSCHRÄNKUNGEN • Es gibt eine feste Grenze von einer Million Dateien. • Bildversionen - bis zu 99 Versionen für Rückgängig/Wiederholen und Versionsbenennung. • Bild-Keywords - insgesamt 10.000 Keywords. 1000 Zeichen pro Bild. • Galerien sind auf 40.000 Bilddateien begrenzt. • max. Bildabmessungen sind 40.000 x 20.000 Pixel. - - TOPIC: FOTOCX FÜR WINDOWS 11 Fotocx kann unter Windows 11 verwendet werden, indem Windows Subsystem for Linux 2 (WSL2) installiert wird. Im Internet gibt es ausreichend Dokumentation dazu, wie dies zu tun ist. - Befinden sich Ihre Bilddateien im Windows-Dateisystem (NTFS), ist Fotocx sehr langsam. Verschieben Sie Ihre Bilddateien daher in das Linux-Dateisystem. Sie können weiterhin mit dem Windows-Explorer und anderen Windows-Apps darauf zugreifen, sodass nichts verloren geht. Microsoft empfiehlt ebenfalls das Linux-Dateisystem für eine bessere Leistung. Verwenden Sie das Symbol 'Linux' im Explorer, um auf Ihren Home-Ordner im Linux-Dateisystem zuzugreifen. Fügen Sie bei Bedarf einen Pictures-Ordner hinzu und verschieben Sie Ihre Bilddateien dorthin. - Falls ein Fotocx-Paket verfügbar ist, installieren Sie es. Andernfalls gehen Sie wie folgt vor: Laden Sie die Fotocx-Binärpaketdatei von ^https://kornelix.net herunter. Im Linux-Terminal: $ cd /mnt/c/Users//Downloads # zum Windows-Downloads-Ordner wechseln $ tar -xzf fotocx-xxx-bin.tar.gz # Paket in den Ordner fotocx entpacken $ cd fotocx # zum Ordner fotocx wechseln $ chmod u+x install.sh # Installationsskript ausführbar machen $ ./install.sh # Skript ausführen, fotocx installieren $ fotocx # Fotocx starten Möglicherweise müssen Sie das Linux-Fenster neu starten, damit der letzte Schritt funktioniert. - Lesen Sie die einleitenden Teile dieses Benutzerhandbuchs. Fotocx verfügt über umfangreiche Funktionen. Erwarten Sie nicht, Fotocx in wenigen Minuten zu beherrschen. - - TOPIC: DATENSCHUTZ Fotocx speichert keine Benutzerdaten außer Bilddateien und deren Metadata. Metadata sollten aus Bilddateien entfernt werden, bevor sie ins Internet hochgeladen werden, und Fotocx bietet dafür eine einfache Methode. - - TOPIC: PROBLEM, QUESTION, SUGGESTION Senden Sie eine E-Mail an mkornelix@gmail.com. Falls ein Absturzbericht (zappcrash-Datei) vorliegt, senden Sie diesen ebenfalls. - fotocx/data/translations/ug_zh0000664000175000017500000070655615247006657015552 0ustar micomico- ^FOTOCX 用户指南^ v.26.8 通过 Fotocx 菜单 帮助 > 用户指南 查看 - {Fotocx 用法} {首次启动} - 定位并索引图像文件以实现快速搜索 {用户指南} ← ^点击此处^ - 如何使用本用户指南浏览器 {窗口视图与菜单} - 顶层窗口及相关菜单 {文件视图} - 文件视图窗口(查看单张图像文件) {图库视图} - 图库视图窗口(以缩略图形式查看文件夹) {地图视图} - 地图视图窗口(查看带图像位置标记的地图) {拖放} - 文件拖放方法 {编辑流程} - 如何编辑图像文件 {编辑工作流} - 备选编辑方法——简单与复杂 {鼠标所有权} - 对话框-鼠标控制与交互 {鼠标 Alt+右键} - 触摸板/触摸屏的鼠标右键 {对话框按钮} - 对话框完成选项 {键盘 Esc 键} - Esc 键的功能 {非标准对话框控件} - 如何使用非标准对话框控件 {曲线编辑} - 如何操作编辑功能中使用的曲线 {MOUSE PAINTING} - 使用鼠标局部编辑图像 {批量处理} - 批量处理功能概览 {选择图像文件} - 图像文件选择流程 {快捷键} - 弹出菜单、键盘快捷键、自定义用户菜单 {鼠标功能} - 用于文件/图库/地图视图的鼠标功能 {命令参数} - Fotocx 命令行参数 - {文件菜单} {新建会话} - 在单独窗口中启动新的 Fotocx 会话 {打开图像文件} - 打开图像文件以查看或编辑 {循环 2 个文件} - 在最近查看的两个图像文件之间循环 {循环 3 个文件} - 在最近查看的三个图像文件之间循环 {查看 360° 全景} - 可旋转视角的 360° 全景图像 {空白图像} - 创建指定大小和颜色的空白图像 {空白图像} - 创建新的空白图像 {复制/移动} - 将图像文件复制或移动到另一个文件夹 {复制到桌面} - 将图像文件复制到桌面 {复制到剪贴板} - 将图像文件复制到剪贴板 {删除/回收} - 删除或回收图像文件 {设置壁纸} - 使用当前图像文件设置桌面壁纸 {打印图像} - 打印图像文件 {校准打印} - 使用颜色校准数据打印 {校准打印机} - 校准打印机颜色——补偿色偏 - {图库菜单} {图库概览} {缩略图视图} - 带缩略图和文件名的图库视图 {metadata 视图} - 带缩略图和基本 metadata 的图库视图 {最近文件} - 最近查看的图像文件的图库视图 {最新文件} - 最新图像文件的图库视图 {图库排序} - 更改图库的排序方式 {图库过滤器} - 选择最新、最旧、匹配模式…… {图库首页} - 跳转到图库开头 {图库结束} - 跳转到图库末尾 {当前文件文件夹} - 从当前文件所在文件夹设置当前图库 {最近文件夹} - 查看最近使用的文件夹列表并选择 {文件夹树} - 以树状结构查看图像文件文件夹并选择 {选择文件} - 选择文件作为批量处理、脚本或相册的输入 {书签} - 查看书签列表,跳转到书签 {编辑书签} - 添加、移除、排列书签 - {MAPS MENU} {世界地图} - 互联网世界地图概览 {在地图上显示} - 在地图上显示当前图像位置 - {相册菜单} {相册} - 创建并整理图像集合 {创建相册} - 创建新相册(所选图像的图库) {重命名相册} - 重命名现有相册 {删除相册} - 删除现有相册 {选择相册} - 选择相册并显示图像图库 {当前相册} - 显示当前(最近使用的)相册 {图库转相册} - 将当前图库保存为命名相册 {编辑相册} - 在相册图库中添加、移除、重新排列图像文件 {更新相册} - 为更新后的图像文件更新相册(新版本) {相册批量更新} 批量更新相册(成员文件的添加/移除/替换) {幻灯片放映} - 带动画过渡和平移/zoom 效果的幻灯片放映 - {自定义菜单} - 用于常用功能的自定义用户菜单 {脚本文件} - 脚本文件概览 {编辑脚本} - 将编辑操作记录为脚本,制作自定义编辑功能 {运行脚本} - 对当前图像执行脚本 {批量脚本} - 对选定图像文件执行脚本 {插件} - 启动插件编辑功能,打开插件输出文件 - {ZOOM} - 通过鼠标或键盘对图像或缩略图进行 zoom 放大/缩小 - {上一个/下一个} - 通过鼠标或键盘索引到上一张或下一张图像 - {文件保存} - 保存图像文件(替换、新版本、新文件名) - {metadata 菜单} {查看主 metadata} - 列出主要图像 metadata {查看所有 metadata} - 列出所有图像 metadata {keywords 概览} - 用于图像搜索的 keywords {GEOTAGS OVERVIEW} - 用于搜索的位置名称和地理坐标 {编辑主 metadata} - 编辑常用 metadata {编辑任意 metadata} - 编辑任意 metadata(添加、移除、更改) {删除 metadata} - 删除指定 metadata 或全部 metadata {复制 metadata} - 将 metadata 从一个图像文件复制到另一个 {修复 metadata} - 修复妨碍 metadata 编辑的损坏 metadata {管理keywords} - 管理用户定义的 keywords {说明文字} - 在图像角落显示文件名、标题、描述 {位置/日期} - 列出图像位置/日期,点击可查看图库 {时间线} - 按年/月显示图像数量,点击可查看图库 {metadata 标签} - 按标签值显示图像数量,点击可查看图库 {自动搜索} - 用于查找文件的脚本化搜索功能 {搜索图像} - 使用任意 metadata 或文件夹/文件名进行搜索 - {选择菜单} {区域概览} - 选择区域——概念与用法 {选择区域} - 选择图像特征或区域以便单独编辑 {查找区域间隙} - 查找手绘区域轮廓中的间隙 {区域混合} - 用鼠标混合在选定区域内所做的编辑 {显示/隐藏区域} - 显示或隐藏区域轮廓 {启用/禁用区域} - 启用或禁用某区域的编辑 {反转区域} - 反转区域(交换区域内外) {清除区域} - 移除区域 {复制/粘贴区域} - 复制区域或将区域粘贴到当前图像中 {加载/保存区域} - 从文件加载区域或保存到文件 - {撤销/重做按钮} - 对当前图像进行连续的撤销或重做编辑 - {编辑菜单} {旋转} - 旋转或校平图像 {校正} - 校正旋转或镜像的图像 {裁剪} - 裁剪(修剪)图像边距 {修饰} - 编辑亮度、对比度、颜色、饱和度 {缩放} - 更改图像像素尺寸 {分屏} - 使用分屏查看更改前后的对比 {显示差异} - 突出显示编辑过程中的更改(或任意两张图像) {边距} - 为图像添加边距,任意颜色或透明度 {标注} - 在图像上绘制:文本、线条/箭头、方框、椭圆 {颜色模式} - 转换为黑白、彩色、负片、正片 {绘制编辑} - 使用鼠标局部逐渐绘制某项编辑功能 {绘制图像} - 使用鼠标以指定颜色、画笔大小和不透明度绘制 {绘制透明度} - 使用鼠标绘制逐渐增加的透明度 {区域填充} - 用颜色填充选定区域或透明区域 {图像内复制} - 使用鼠标在图像内复制像素 {从图像复制} - 使用鼠标从另一图像复制像素 {复制之前的编辑} - 使用鼠标从之前的编辑中复制像素 - {修复菜单} {锐化} - 锐化模糊的图像,多种方法 {模糊} - 模糊图像或图像区域,多种方法 {降噪} - 减少图像噪点(小的随机斑点) {去雾} - 为图像或选定区域添加或移除雾/霾 {红眼} - 移除闪光拍照造成的红眼 {智能擦除} - 移除电线、标志牌及其他小型干扰物 {移除光晕} - 移除锐化及其他功能留下的光晕 {JPEG 伪影} - 抑制高压缩文件中的伪影 {抗锯齿} - 抑制特征边缘的像素化(锯齿) {调整 RGB} - 使用 RGB 或 CMY 颜色调整图像颜色 {调整 HSL} - 使用 HSL 颜色模型选择并更改颜色 {移除灰尘} - 移除老照片图像上的灰尘斑点 {色边} - 修正周边色边(色差) - {优化菜单} {展平直方图} - 展平亮度直方图以获得更好细节 {局部对比度} - 添加适应局部区域亮度的对比度 {增强对比度} - 增强现有对比度以突出细节 {全局 Retinex} - 缩放 RGB 值以获得更大范围 {局部 Retinex} - 缩放 RGB 值以获得更大范围 {饱和度} - 根据亮度调整颜色饱和度 {柔焦} - 为图像应用经典的“柔焦”效果 {亮度渐变} - 在图像上添加亮度/颜色渐变 {晕影} - 围绕所选中心径向更改亮度/颜色 - {效果菜单} {轮廓} - 将图像转换为轮廓画 {素描1} - 将图像转换为模拟素描(1) {素描2} - 将图像转换为模拟素描(2) {卡通} - 将图像转换为卡通式绘画 {浮雕} - 将图像转换为模拟浮雕(3D 效果) {瓷砖1} - 将图像转换为带 3D 效果的方形瓷砖 {瓷砖2} - 将图像转换为符合图像特征的不规则瓷砖 {绘画} - 将图像转换为模拟油画 {纹理} - 为图像或选定区域添加纹理 {融合} - 抑制细节的同时保留锐度 {匹配颜色} - 将一张图像的颜色匹配到另一张图像 {图案} - 为图像添加背景图案 {交叉排线} - 使用交叉平行线转换为素描 {抖动} - 以不同方式将图像像素化或色调分离 {雕刻} - 将图像转换为黑白线条 {添加眩光} - 在图像中明亮物体周围添加眩光 {马赛克拼图} - 使用由图像制成的瓷砖将图像转换为马赛克拼图 {添加噪点} - 为图像添加随机噪点 {设置颜色} - 减少颜色数量(色调分离) {移色} - 将 RGB 颜色逐渐移位为 GBR 或 BRG {异色变换} - 为图像添加随机的奇异颜色 {自定义卷积核} - 编辑并应用自定义卷积核 - {扭曲菜单} {展平弯曲} - 拉直有弯曲线条的图像,尤其是全景图 {透视} - 拉直以钝角拍摄的物体 {区域扭曲} - 用鼠标拖拉扭曲选定的图像区域 {WARP LINEAR1} - 用鼠标拖动扭曲图像——线性1扭曲 {WARP LINEAR2} - 用鼠标拖动扭曲图像——线性2扭曲 {弯曲扭曲} - 用鼠标拖动扭曲图像——弯曲扭曲 {仿射扭曲} - 用鼠标拖动扭曲图像——保持平行线 {径向扭曲} - 添加或移除桶形或枕形畸变 {展开特写} - 消除近距离人脸照片的畸变(大鼻子) {制造波浪} - 用波浪图案扭曲图像 {扭曲} - 围绕所选中心点扭转图像 {球体} - 将图像弯曲为球体形状 {内外翻转} - 反转每个像素的中心-边缘距离 {微缩星球} - 将全景图像包裹成一个圆形 {埃舍尔螺旋} - 将图像转换为无尽的内向螺旋 {展平照片} - 展平弯曲表面的照片 - {合成菜单} {HDR} - 合成明暗图像以扩展亮度范围 {HDF} - 合成近/远对焦图像以扩展景深 {堆叠/绘画} - 合成图像以移除路过的车辆、游客等 {堆叠/噪点} - 通过平均合成图像以降低噪点 {堆叠/图层} - 合成图像版本,选择/绘制区域/版本 {全景图} - 将一系列图像水平合成 {显示 CIM 文件} - 显示当前/最新合成图像所用的输入文件 {Mashup} - 在自定义版面中排列图像和格式化文本 {图像阵列} - 将多张图像拼接为紧凑的阵列格式 - {批量菜单} {批量转换} - 复制、移动、缩放、重命名、转换、添加文本…… {批量复制/移动} - 将选定图像文件复制/移动到新文件夹 {批量校正} - 扫描已旋转的图像文件并将其校正 {批量删除/回收} - 删除或回收选定图像文件 {批量叠加} - 为选定图像添加叠加图像(版权信息……) {批量keywords} - 为选定图像文件添加或移除 keywords {批量重命名keywords} - 为所有图像文件重命名或删除 keywords {批量清除keywords} - 从所有图像文件中清除不需要的 keywords {批量拍摄日期} - 更改拍摄日期或时间,或调整时区 {批量更改 metadata} - 为选定图像文件添加或修订 metadata {批量报告 metadata} - 报告选定或所有图像文件的 metadata {批量地理标记} - 为选定或所有图像文件添加或修订 geotags {导出文件} - 将选定文件导出到某个文件夹(例如网络上传) - {工具菜单} {索引文件} - 一次性任务,用于查找并索引所有图像文件 {移动 Fotocx 主文件夹} - 移动 Fotocx 主文件夹(用户数据和设置) {设置} - Fotocx 运行的用户首选项和设置 {键盘快捷键} - 显示并修订菜单功能的键盘快捷键 {RGB 直方图} - 当前图像的亮度直方图图表 {放大图像} - 将鼠标变为图像上的放大镜 {测量图像} - 测量图像内的像素距离(鼠标点击) {显示 RGB} - 显示鼠标位置或所选点的 RGB 值 {网格设置} - 显示或移除网格线,设置线数或间距 {线条颜色} - 设置选择区域轮廓的颜色 {暗/亮像素} - 用于突出显示裁剪(溢出)的工具 {显示器颜色} - 调整显示器亮度和对比度 {查找重复项} - 在某个图库或所有图像中查找重复图像 {查找损坏文件} - 查找无法读取的图像文件,删除/移动/修复 {显示资源} - 显示 CPU 时间和当前内存使用情况 {翻译} - 创建或修改 GUI 翻译 - {帮助菜单} - 用户指南、教程、更新日志、关于 Fotocx、卸载 - {其他主题} {VIDEO FILES} - 视频文件、缩略图、播放视频 {幻灯片与底片} - 如何采集幻灯片和胶片底片 {Fotocx 限制} - 大小和性能限制 {适用于 Windows 11 的 Fotocx} - 在 Windows 11 WSL 上安装 Fotocx {隐私} - Fotocx 隐私和数据保护政策 {PROBLEM, QUESTION, SUGGESTION} - 联系 Fotocx 作者 - - TOPIC: Fotocx 用法 - - TOPIC: 首次启动 - ^外部程序 Fotocx 会报告所需和可选的外部程序及每个程序提供的功能。如果缺少任何必需的程序,请先安装它们,然后重新启动 Fotocx。 - ^首次索引 Fotocx 将对您的图像文件进行索引。这样可以使图库页面(缩略图)快速显示,支持基于已索引 metadata 的快速搜索,并支持通过点击地图标记按位置查看图像。您必须输入一个或多个“顶层”图像文件夹(例如 /home//Pictures)。子文件夹会自动包含在内。这些文件夹中的非图像文件将被忽略。使用[select]按钮定位并添加您的顶层图像文件夹。实际限制约为 30 个顶层文件夹。每个文件夹可以有数百个子文件夹。 - ^缩略图 这是缩略图文件的存放文件夹。可使用提供的默认位置,也可选择其他位置。 - ^索引时间 索引速度可能从每分钟几百个文件到超过一万个文件不等,具体取决于图像文件的类型和大小以及您计算机的速度。当您向收藏中添加新图像文件后,下次启动 Fotocx 时会对新文件进行索引。如果新文件很多,启动过程可能需要一些时间来完成索引。 - ^图像标题和描述的整合 如果缺少标题和描述 metadata,Fotocx 的图像索引功能会使用许多备用 metadata 标签之一进行替代(如果存在的话):headline、event、abstract、imagedescription、caption-abstract、subject、comment、usercomment、caption。这样做是为了让您始终只需使用“标题”和“描述”即可查看/编辑/搜索。此转换过程相对较慢(在我性能较强的电脑上约为每分钟 2200 个文件)。此操作会在新图像文件首次被索引时进行。不会删除任何内容。 - - TOPIC: 用户指南 从菜单 帮助 > 用户指南 打开用户指南。使用 Fotocx 时,您可以按 F1 查看当前或最近使用的菜单功能对应的用户指南主题。 - 要滚动文本,请使用方向上/下键和翻页上/下键。[查找]按钮会打开一个文本搜索对话框。再次按[查找]可查找下一处匹配。 - 加粗的大写文本是指向某个主题的可点击链接,例如 {索引文件}。使用[<]和[>]按钮可在最近浏览过的主题之间前后切换。[Recent]按钮会显示一个可点击的最近浏览主题列表。 - - TOPIC: 窗口视图与菜单 +image: fotocx-views.jpg - ^菜单按钮 点击某个菜单时,会出现一个弹出子菜单。前三个菜单(文件、图库、地图)用于设置相应的视图模式。也可以使用 F/G/M 键。 - - TOPIC: 文件视图 一张图像会填满整个 Fotocx 窗口。用鼠标左/右键点击可放大/缩小。Z 键可在适应窗口和 1x 图像大小(1 个图像像素 = 1 个显示像素)之间切换。要平移已放大的图像,请用鼠标左键在图像上拖动。鼠标滚轮也可以对图像进行放大或缩小。使用菜单按钮(编辑、修复等)来修改图像。使用“文件保存”按钮保存修改后的文件:替换、创建新版本,或创建新文件(新名称)。 - ^键盘左/右方向键 查看当前图库中的上一张或下一张图像文件。 - ^上/下方向键 同上,但仅显示最新版本,如果没有版本则显示原始文件。 - - TOPIC: 图库视图 当前图库中的所有图像文件都会以缩略图阵列的形式显示。 - ^图库类型 • 文件夹:单个文件夹(目录)中的所有图像文件和子文件夹 • 相册:来自不同文件夹、由用户排列的图像文件 • 最近文件:最近查看或编辑过的图像文件 • 最新文件:最近添加或修改的图像文件 • 搜索结果:由搜索功能找到的图像。也是一种相册。 - ^图库功能 • 左键点击图像缩略图:以文件视图模式打开图像 • 右键点击图像缩略图:弹出常用功能菜单 • 点击文件夹缩略图:以图库模式打开该文件夹 • 文件夹图库顶部栏:上级文件夹——点击可前往 • [TOP]按钮:顶层文件夹列表——点击可前往 • 滚动条:在图库中向上/向下滚动 • 方向上/下键:滚动图库一行 • 翻页上/下键:滚动图库一页 • home/end 键:转到图库的开头(顶部)和结尾(底部) • 鼠标滚轮:向上和向下滚动图库 • [+] 和 [-] 键:增大/减小缩略图大小 - ^图库弹出图像 • 用鼠标中键点击缩略图以弹出图像 • 按住 shift 并用鼠标左键点击缩略图以弹出图像 • 左键点击弹出图像:放大图像 • 右键点击弹出图像:关闭弹出图像 • 鼠标滚轮:放大或缩小弹出图像 • F11 键:将弹出图像设为全屏 • Esc 键:关闭弹出图像 • 可同时使用多个弹出窗口以比较图像 - - TOPIC: 地图视图 查看包含对应图像位置标记的地图。点击某个标记可查看相应图像的图库。这取决于您的图像文件是否嵌入了地理坐标(latitude、longitude)。现代相机会自动插入此数据,您也可以自行添加这些数据。初始会显示一张世界地图。使用鼠标滚轮可在任意位置进行 zoom 放大/缩小。拖动可移动地图中心。可以在任意比例下查看整个世界,直至街道级别。 - - TOPIC: 拖放 如果您打开了两个 Fotocx 会话,可以在两者之间拖放文件。将一个窗口中的图库缩略图拖动到另一个窗口。如果目标是文件视图,则会打开该文件。如果目标是图库视图,结果取决于图库的类型。如果该图库是一个文件夹,文件将被添加到该文件夹中,图库会在其排序位置显示新文件。如果该图库是一个相册,文件将被添加到放置的相应位置。 - - TOPIC: 编辑流程 文件视图模式下的图像(当前图像)可以使用“编辑”“修复”“优化”“效果”“扭曲”和“合成”菜单中的编辑功能进行修改。这些功能会在内存和窗口中修改当前图像。在使用这些功能时,编辑会不断累积。完成编辑后,使用[保存]菜单按钮将修改后的图像保存回同一文件、保存为新版本(例如 filename.v01.jpg),或保存为新文件和/或新文件夹。图像编辑对话框带有滑块、按钮、微调按钮或可编辑曲线,这些控件会立即更新图像。 - 用鼠标左键或右键点击“撤销/重做”按钮可撤销或重做当前激活的编辑功能。图像应用一次或多次编辑后,可使用撤销/重做按钮前后移动,查看每一步完成后的图像状态。鼠标中键会显示对当前图像所做的所有编辑的弹出列表,您可以选择任意一步返回。图像可以从任意先前步骤重新开始编辑。这会丢弃在该步骤之后所做的编辑,因为它们是从该步骤衍生出来的。只要该已编辑图像仍是当前图像,这种撤销/重做能力就会保留。如果打开了另一张图像,编辑历史将被丢弃。如果您希望保留返回当前图像状态的可能性,请在继续进行另一项编辑之前,将图像保存为新版本。 - - TOPIC: 编辑工作流 - ^简单工作流 大多数情况下,您可以直接编辑相机输出的 JPEG 文件。仅当您在编辑后(这些编辑扩大了某些图像区域的亮度范围)看到色带,使亮度台阶变得明显可见时,才需要使用以下更复杂的流程。 - ^复杂工作流 要以深色彩(每个 RGB 颜色超过 8 位)进行编辑,请从相机的 RAW 文件开始。RAW 文件可以像其他图像文件一样进行编辑。Fotocx 的编辑功能以每个颜色 24 位进行处理,因此可以保留 RAW 文件的完整色深。当您打开 RAW 文件时,会使用所选的 RAW 加载器——参见 {设置}。您也可以使用“批量转换”将多个 RAW 文件转换为每个颜色 16 位的 TIFF、PNG 或 JXL 文件。 - Dcraw 是默认的 RAW 文件加载器。您也可以使用更复杂的 RAW 编辑器,例如 Rawtherapee——参见 {设置}。相比之下,Dcraw 更简单快捷。RAW 编辑器中的编辑功能通常可以用 Fotocx 更轻松地完成。 - - TOPIC: 鼠标所有权 某些编辑对话框会使用鼠标来引用或更改主窗口中的图像。同一时间可能有多个此类对话框处于激活状态。鼠标也用于对图像进行 zoom 和滚动,您可能需要在使用编辑对话框的同时进行这些操作。因此,理解哪个对话框或窗口拥有鼠标控制权,以及如何更改这种控制权,是很重要的: • 如果某个对话框拥有键盘焦点,鼠标在图像上的操作将作为该对话框的输入,不会使图像进行 zoom 或滚动。 • 如果您在图像上点击或拖动鼠标时按住 CTRL 键,图像将进行 zoom 或平移/滚动。已打开的对话框不受影响。 • 鼠标滚轮可以在任意图像位置进行 zoom 放大/缩小。 - - TOPIC: 鼠标 Alt+右键 对于触摸板或触摸屏,鼠标右键点击可能不太方便。如果在按下鼠标左键的同时按住 ALT 键,将被解释为鼠标右键点击。 - - TOPIC: 对话框按钮 这些按钮大多按以下方式工作: • [重置] - 撤销当前编辑,将图像恢复到初始状态 • [应用] - 将对话框设置应用到图像,保持对话框打开 • [OK] - 与[应用]相同,但会关闭对话框 • [取消] - 放弃图像更改并关闭对话框 • [继续] - 根据对话框输入内容继续执行耗时任务 • [X] - 关闭对话框,不执行任何操作 - - TOPIC: 键盘 Esc 键 主窗口拥有焦点时: • 如果某个长时间运行的功能仍在运行,则终止它 • 如果主窗口已最大化,则恢复之前的大小 • 如果当前视图为图库或地图,则切换为文件视图 • 以上均不适用:退出 Fotocx 对话框窗口拥有焦点时:关闭该对话框(与 [X] 按钮相同) 其他情况:取消弹出图像、退出 360 全景查看器、暂停或退出幻灯片放映。 - - TOPIC: 非标准对话框控件 +image: custom-widgets.png - 使用了一些非标准控件,以减小对话框尺寸或提升易用性。它们的工作方式与标准 GTK 控件几乎相同。数字数据控件的工作方式类似 GTK 的微调按钮:可以使用鼠标滚轮和键盘的上/下方向键快速增大或减小数值。如果使用触摸板,先点击输入框以定位光标,然后使用键盘输入数值,或使用键盘上/下方向键快速调整到新数值。如果按住该键不放,变化速率会随时间加快。使用 shift 键可将速率提高 10 倍。非线性滑块会在中性值附近扩展刻度,以便更精确地控制微小变化,尤其是在使用触摸板时。少数标准 GTK 控件通过去除多余的内边距而缩小了尺寸。这由 Fotocx 主文件夹中的文件“widgets.css”控制。如果需要,您可以修改此文件。您可以删除其中的项目或将其标记为注释,但不要删除该文件本身——它会被自动重新生成。 - - TOPIC: 曲线编辑 +image: retouch.png - 一些图像编辑功能使用可编辑曲线。您可以操作这些曲线,以根据某种其他属性来更改图像的某个属性。曲线可以用鼠标移动(拖拉)。无论在曲线的哪个位置拖拉,都会在该处添加一个锚点(黑点),这个点会保持固定——当曲线的其他部分被拖拉时,曲线仍会经过这个点。锚点可以通过拖动来移动,也可以通过右键点击来删除。 - - TOPIC: MOUSE PAINTING 可以使用鼠标对图像进行局部编辑。鼠标位置周围的一个圆圈框定了一个图像区域,当鼠标在图像上按住左键拖动时,该区域会被修改。修改的来源可以是某个编辑功能、所选颜色,或来自同一图像其他位置或另一张图像的像素。鼠标圆圈内的图像像素会被修改以匹配该来源。变化速率可以是快速或渐进的,具体取决于鼠标中心和边缘的强度系数。如果中心系数高而边缘系数低,图像在鼠标中心处的修改速度更快,从中心到边缘逐渐减弱。反复用鼠标左键在同一图像区域拖动,可累积这些更改,直到像素完全匹配源颜色或源图像,或源编辑功能被完全应用。用鼠标右键拖动可逐渐撤销更改,恢复原始图像。 - 示例:如果编辑功能是“修饰”,并且提高了亮度,那么当鼠标左键拖动时,鼠标区域内的图像会变亮。使用右键拖动可逐渐恢复原始图像。 - [undo-last]按钮会撤销上一次绘制或擦除操作,可重复此操作以移除多次最近的编辑。每一次新的鼠标拖动操作都是一个可单独撤销的工作单元。用于撤销的内存是有限的,因此只会保留最近的绘制和擦除步骤。[undo all]会将图像恢复到初始状态。 - 使用[undo/redo]按钮来核查编辑过程中的更改。 - 如果某个{选择区域}处于激活状态,绘制操作将被限制在该区域内。 - 注意:使用非常小的半径时(例如在图像上绘制线条时),请将图像 zoom 到 100% 或更大。鼠标移动的步长以屏幕像素为单位。如果这跨越了许多图像像素,且使用的半径很小,鼠标可能会跳过某些像素,导致它们未被处理。 - - TOPIC: 批量处理 {批量菜单}中提供了若干批量功能,用于加快一些常见任务。您可以选择多个图像文件,然后对全部文件执行批量功能。批量功能可用于更改文件名或文件类型、校正、缩放、复制或移动、删除、修订标签、keywords、位置/地理坐标、拍摄日期等。 - - TOPIC: 选择图像文件 +image: select-image-files.jpg - 此流程用于所有需要处理多个图像文件的功能。此处对该流程进行说明,并且每个使用此流程的功能都会链接到本主题。 • 左键点击缩略图:添加到选择列表 • 右键点击:移除 • 添加多个:点击第一个缩略图,然后按住 shift 点击最后一个 • [全部添加]按钮:添加整个图库 • [添加当前]按钮:添加当前文件 • 同一文件可以被多次添加到列表中 • 如有需要,可导航到其他图库以选择更多文件 • [移除]按钮:移除所选列表位置 • [清除]按钮:清空整个列表 • 方向上/下键:逐条浏览列表,查看缩略图 • home/end 键:转到列表的开头/结尾 - [禁用]按钮会禁用点击缩略图以选择文件的功能。此后该按钮会更名为[启用]——按下即可恢复缩略图点击功能。这样做的目的是启用正常的缩略图弹出菜单以及左键点击以全尺寸查看文件,而如果缩略图点击正被用于文件选择,这些操作将无法进行。您在判断选择内容时可能需要这一功能。您也可以停留在文件视图模式,用方向键逐张浏览图像,同时使用[添加当前]按钮将文件添加到选择列表中。 - - TOPIC: 快捷键 对于常用功能,有三种快捷方式: • 右键点击主窗口或图库缩略图。 会弹出一个显示部分常用功能的菜单。 • 您可以更改快捷键并添加新的快捷键。 参见 {键盘快捷键}。 • 将常用功能收集到一个自定义菜单中。 参见 {自定义菜单}。 - 最常用的功能都提供了键盘快捷键。使用菜单 工具 > 键盘快捷键 可查看或更改它们。 - 以下键盘快捷键是固定的,无法更改: • [+] [=] 键:放大图像或缩略图(zoom) • [-] 键:缩小图像或缩略图(zoom) • Z 键:切换 zoom:1x <--> 适应窗口 • F1 键:显示当前功能的用户指南 • F10 键:切换主窗口全屏与还原 • F11 键:与 F10 类似,但不显示菜单、标题栏、顶部面板 • Esc 键:终止正在运行的功能,退出激活的对话框 • Delete 键:弹出对话框以删除或回收当前文件 • 左/右方向键:显示图库中的上一张/下一张图像 • 上/下方向键:同上,但仅显示最新版本 • 翻页上/下键:图库视图:向上/向下滚动一页 • home/end 键:图库视图:转到图库的第一页/最后一页 - 以下键盘快捷键为默认设置,用户可以更改: • F:文件视图 - 切换到文件视图模式 • G:图库视图 - 切换到图库视图模式 • M:地图视图 - 切换到地图视图模式 • 2:循环 2 个文件 - 交替显示最近的两个文件 • 3:循环 3 个文件 - 交替显示最近的三个文件 • A:当前相册 - 显示最近查看的相册 • T:修饰 - 启动“修饰”编辑功能 • C:裁剪 - 启动“裁剪”编辑功能 • K:键盘快捷键 - 启动键盘快捷键对话框 • P:打印图像 - 打开打印图像对话框 • R:旋转 - 启动“旋转”编辑功能 • U:撤销 - 撤销当前编辑或一系列编辑中的最后一步 • Shift+U:重做 - 重做当前编辑或一系列编辑中的下一步 • Ctrl+C:复制到剪贴板 - 将当前文件复制到剪贴板 • Shift+C:切换说明文字 - 交替显示/隐藏说明文字 • Ctrl+G:显示当前文件所在文件夹的图库 • Shift+G:切换网格 - 打开/关闭网格线 • Ctrl+S:保存 - 启动文件保存对话框 - - TOPIC: 鼠标功能 - ^文件视图 • 左键点击 - 放大(Zoom-in):以鼠标位置为中心放大图像 • 右键点击 - 如果图像已放大:恢复为窗口大小 如果未放大:弹出常用功能菜单 • 鼠标滚轮 - 放大或缩小图像 • 左键拖动图像 - 平移已放大的图像 • Ctrl + 鼠标 - 鼠标作用于图像,而非当前激活的对话框 - ^图库视图 • 左键点击缩略图 - 切换到文件视图 • 右键点击缩略图 - 显示常用功能弹出菜单 • 中键点击缩略图 - 弹出大图,用鼠标滚轮 zoom • 鼠标滚轮 - 向上或向下滚动图库页面 - ^地图视图 • 左键拖动 - 拖动地图,跟随鼠标移动 • 鼠标滚轮 - 放大或缩小地图 • 左键点击标记 - 显示该位置的图像图库 • 如果编辑 metadata 对话框处于激活状态,左键点击将设置地理坐标 - - TOPIC: 命令参数 如果从终端启动 Fotocx,可以使用以下参数。 -help 显示用户指南 -home /folder 备用 Fotocx 主文件夹位置(见下文) -lang xx 根据 2 字符代码设置语言 -recent 显示最近图像文件的图库 -new 显示最新图像文件的图库 -album albumname 要打开的相册(图库) -prev 显示上一次会话中最后查看的文件 -blank 显示空白窗口 -dev 显示通常隐藏的开发者菜单 -menu manuname Fotocx 启动时将激活此菜单 -cwp nnn name 循环壁纸(见下文) -x0 -x1 -x2 将索引级别设置为 0、1 或 2(见下文) - ^-x0 -x1 -x2 参数^ (启动时设置索引级别) 这些参数可用于覆盖 {设置} 中的值 -x0 启动非常快,不建立图像索引 -x1 启动较快,仅索引旧文件 -x2 旧文件 + 搜索新增/已修改的文件 - ^-home^ 参数 (备用 Fotocx 主文件夹) 默认的 Fotocx 主文件夹为:/home//.fotocx。 用户设置和图像索引都保存在此处。 命令 "$ fotocx -home " 使用指定的文件夹。 这样可以分别管理多个图像收藏。 另见 {移动 Fotocx 主文件夹}。 - ^-cwp^ 参数 (循环桌面壁纸) 完整命令行为:$ fotocx -cwp secs container 使用此命令可以从选定的集合中循环切换桌面图像。“secs”是图像之间的时间间隔。“container”可以是 Fotocx 相册名称,也可以是包含图像文件的文件夹。将此命令添加到您的登录启动列表中,即可按指定间隔获得新的壁纸。使用一天或更长的间隔,可在每次登录时获得新的壁纸图像。Fotocx 会在后台运行,没有图形界面。如果“secs”为零,则只会进行一次壁纸更新,然后 Fotocx 退出。每种 Linux 发行版的命令都不同。理论上,以下桌面环境均已覆盖:Gnome、KDE、XFCE、Mate、LXDE。 - - TOPIC: 文件菜单 - - TOPIC: 新建会话 在新窗口中启动新的 Fotocx 会话。如果同一图像文件在两个窗口中都被编辑,任一实例都不会看到另一实例所做的更改,最终结果以最后保存的文件为准。 - - TOPIC: 打开图像文件 使用带有文件夹和文件列表的常规文件打开对话框,选择要查看或编辑的图像文件。这在文件未被索引、图库显示非常缓慢的情况下很有用,例如从包含数千个图像文件的相机 SD 卡读取时。 - - TOPIC: 循环 2 个文件 重复使用此菜单会在最近打开的两个文件之间交替切换。此功能会保留当前图像的 zoom 大小和位置,非常适合快速比较同一图像文件的两个编辑版本。 - - TOPIC: 循环 3 个文件 此功能的工作方式与“循环 2 个文件”相同,但会在最近打开的 3 个文件之间交替切换。 - - TOPIC: 查看 360° 全景 当前文件会用专门的查看器打开,以显示 360° 全景文件。图像宽度被假定为 360°。使用此功能可以查看 Google“全景球”图像。用鼠标拖动或左/右方向键平移图像。用鼠标左/右键点击进行 zoom。使用 Esc 退出该专用查看器。 - - TOPIC: 重命名 重命名当前文件(文件视图),或所点击缩略图对应的文件(图库视图)。输入新名称并按[应用]。此功能还可以自动化处理,使用根名称和序号为一系列图像文件重命名。打开该系列中的第一个图像文件,输入新名称,然后按[应用]按钮。如果需要,可使用[next]按钮移动到下一个文件。您可以按[旧名称]按钮再次使用相同名称,然后添加后缀或序号。按[add 1]按钮以递增序号。 - - TOPIC: 空白图像 创建具有指定像素尺寸和颜色的空白图像。此功能可用作从其他图像中截取的内容(通过{选择区域})以及标注文本(通过{标注}绘制文本)的背景。 - - TOPIC: 复制/移动 当前文件(文件视图)或所点击缩略图对应的文件(图库视图)会被复制到指定位置。选择复制选项可复制文件并保留源文件,从而生成一个副本。选择移动选项可将文件从原位置移动到新位置。可以通过依次点击每个缩略图后按[应用]来快速处理一组文件。[上一个]按钮可用于复制之前使用过的文件名。为避免出现重复文件,请添加版本号或其他标识。 - - TOPIC: 复制到桌面 当前文件(文件视图)或所点击缩略图对应的文件(图库视图)会被复制到桌面文件夹(/home//Desktop)。 - - TOPIC: 复制到剪贴板 当前文件(文件视图)或所点击缩略图对应的文件(图库视图)会被复制到剪贴板,其他应用程序可从中粘贴。 - - TOPIC: 删除/回收 当前文件(文件视图)或所点击缩略图对应的文件(图库视图)会根据所选选项被删除或移至回收站。Fotocx 使用标准的回收站位置(~/.local/share/Trash)。 - - TOPIC: 设置壁纸 使用当前图像文件设置桌面壁纸。 - - TOPIC: 打印图像 “打印图像”菜单会弹出一个标准的页面设置对话框,您可以在其中选择打印机、纸张大小和方向。按[应用]按钮后,会出现另一个对话框,用于输入纸张边距和图像比例。 - 如果图像有选定区域,系统会询问是否只打印这些区域。这些区域将以能够包住它们的最小矩形进行打印,选区之外的部分不会被打印。 - - TOPIC: 校准打印 此功能的工作方式与上文所述的“打印图像文件”相同,但在打印之前,系统会要求您提供一个校准文件,用于在打印前调整图像颜色。其目的是补偿由打印机和纸张类型造成的色偏。 - - TOPIC: 校准打印机 +image: printer-calibrate-chart.png +image: calibrate-printer.png - 此工具可能有助于提高打印图像的色彩准确度。 - ^工作原理 在目标打印机上打印一张色卡。由于打印机本身的不完美,部分打印出来的颜色会略有偏差。将这张打印页扫描为文件,并将该文件中的颜色与最初打印的原始颜色进行比较。所有差异即为现已得知的误差(假设您的扫描仪比打印机更准确——这通常是成立的)。当打印一个图像文件时,会在打印前从图像颜色中减去这些误差。打印机会把这些误差重新加回去,理论上得到正确的结果。我自己的测试显示有一定程度的改善,详见下文。 - 请按照对话框窗口中列出的顺序依次执行以下步骤。所有文件都位于 /printer_color 文件夹中。 • 生成并打印色卡文件(printchart.png)。 使用大尺寸纸张、纵向方向、不留边距。 • 将打印出的色卡扫描为 PNG 文件。使用 300 dpi 或更高。 • 编辑该 PNG 图像,裁去扫描仪留下的边距。 保存编辑后的图像文件。 • 处理编辑后的图像文件以创建一个颜色映射文件。 - 现在您可以使用菜单 {校准打印} 进行打印,该功能会要求您提供当前所用打印机和纸张对应的颜色映射文件名称。 - 扫描仪可能会使扫描出的图像略微偏离矩形形状。如果发生这种情况,您会在裁剪边距时注意到:那条粗绿色边距线不会与裁剪矩形完全对齐。如果出现这种情况,请先使用 {透视} 将图像校正为方正,然后再裁剪边距。 - 在编辑扫描的色卡图像时,请确保最暗的一行位于顶部。裁剪掉色块周围的边距。以色块周围的粗绿色边距线作为参照:精确地裁掉这条线,只保留色块。在调整裁剪矩形时,请使用 2 倍放大。裁剪的精确度很重要。如果裁剪不准确,计算出的色块位置会出现偏移,测得的颜色可能会有误。可以容忍较小的误差。您可以使用键盘方向键以 1 像素为单位移动裁剪矩形。方向键移动的角是最后一次用鼠标拖动过的那个角。 - 输出的颜色映射文件只能用于校准时所使用的那种纸张和打印机设置。任何其他组合都需要单独进行校准并生成各自的颜色映射文件。 - ^结果^(我的佳能打印机) +image: printer-calibrate.jpg +image: printer-cal-study.png - 上方的图表是三张图像的合照: 左上:一张色卡照片的打印件 右上:同一张照片的校准打印件 底部:色卡本身 由于这三张图像是一起拍摄的,相机造成的误差是相同的,因此这种比较是有效的。 - - TOPIC: 图库菜单 - - TOPIC: 图库概览 +image: image-management.jpg - 一个缩略图图库可以代表一个文件文件夹、图像搜索的结果、某个内置图库(最近文件、最新文件),或一个相册(具有指定名称的有序图像文件列表)。出于实用性和性能考虑,文件夹中的文件数量应限制在几千个以内,但系统并未强制设定上限。 - ^滚动图库 可以使用键盘的上/下方向键、翻页上/下键或滚动条来上下滚动图库。也可以使用[home]和[end]键。用鼠标左键点击并按住滚动条,图库会快速滚动到点击的位置。用鼠标右键点击并按住滚动条,图库会缓慢滚动到点击的位置。持续按住鼠标按键并向侧边移动,可以提高滚动速度。 - - TOPIC: 缩略图视图 当前图库中的图像文件会以缩略图阵列的形式显示。使用“ZOOM”菜单按钮或 [+] [-] 键可更改缩略图大小。 - - TOPIC: metadata 视图 当前图库中的图像文件会与 Fotocx 使用的基本 metadata 一起显示。如果定义了自定义的已索引 metadata 标签,这些标签会显示在标准标签之后。参见 {索引文件}。 - - TOPIC: 最近文件 图库中会显示最近查看过的 1000 个图像文件,您可以从中选择要查看或编辑的文件。 - - TOPIC: 最新文件 图库中会显示最近添加或修改过的 1000 个图像文件,您可以从中选择要查看或编辑的文件。您可以选择使用 EXIF 拍摄日期或文件修改日期来确定哪些是最新图像。 - - TOPIC: 图库排序 选择排序依据以及升序或降序。“重置”复选框会将所有图库重置为按文件名升序排列。 - 如果对某个相册图库进行排序,输出结果不会替换原相册,而是会创建一个名为 -sorted 的新相册。 - ^文件名/编号 这是一种改进的按文件名排序方式。如果多个文件的名称仅在相同位置嵌入的数字上有所不同,这组文件将按嵌入数字的顺序排序。下面的示例说明了两者的区别: 按字母顺序:xxx1xx xxx11xx xxx123xx xxx3xx 按数字顺序:xxx1xx xxx3xx xxx11xx xxx123xx - ^来自搜索功能的 METADATA 如果该图库是通过 {搜索图像} 的“metadata 报告”选项生成的,并且您在标准报告中添加了可选的 metadata 标签,则可以按这些 metadata 标签对图库进行排序。您可以按相机品牌、镜头信息、ISO 等级、曝光时间……任何可用的 metadata 进行排序。 - - TOPIC: 图库过滤器 从当前图库中选择一个子集,创建一个名为“gallery_filter”的相册,其中包含所选的图像文件。 ^筛选选项: • 所有文件:选择所有图像文件 • 原始文件:原始文件(无版本号) • 版本文件:已有版本的文件(已被编辑过) • 最新版本:最新版本(若无版本则为原始文件) • 评分范围:评分在指定范围内的文件 • keyword 名称:具有指定 keywords 中任意一个的文件(以逗号分隔) • 文件名文本:包含指定文本字符串中任意一个的文件(以逗号分隔) - - TOPIC: 图库首页 TOPIC: 图库结束 跳转到当前图库中的第一个或最后一个缩略图。 - - TOPIC: 当前文件文件夹 从当前图像文件设置当前图库。如果您在做了其他操作后想返回当前文件所在的图库,这个功能会很方便。 - - TOPIC: 最近文件夹 从最近使用过的图库中设置当前图库。这样您可以更方便地在最近使用过的图库之间来回切换。 - - TOPIC: 文件夹树 +image: folder-tree.png - 最初会显示所有顶层图像文件夹。点击 [+] 展开子文件夹,点击 [-] 将其重新折叠。您可以点击任意文件夹以获取该文件夹中图像的图库。保持窗口打开即可在您的图像收藏中随意导航。此功能也可以通过图库顶部面板中的 [TOP] 按钮使用。 - - TOPIC: 选择文件 预先选择图像文件,用作创建相册或批量功能的输入。这些功能默认会使用预先选定的文件,但您也可以修改这些选择或重新开始。参见流程 {选择图像文件}。 - - TOPIC: 书签 查看现有书签。书签是带有用户指定名称的已选位置(文件夹/文件名)。点击某个书签可显示从该位置开始的缩略图图库。选择 [编辑书签] 可添加、删除或重命名书签。 - - TOPIC: 编辑书签 启动“编辑书签”后,点击某个图库缩略图即可将该位置添加到书签列表中。分配的书签名称最初为该缩略图的文件名。您可以编辑该名称。如果您用鼠标点击选择一个现有书签,其名称会显示在输入框中。您可以更改名称,或按 [删除] 移除该书签。新书签会插入在最后选择的书签位置之后。若要更改顺序,请编辑 Fotocx 主文件夹中的 “bookmarks” 文件。 - - TOPIC: MAPS MENU - - TOPIC: 世界地图 +image: map-click.jpg - 这是一张互联网世界地图,可以从街道级别到大陆级别进行缩放(zoom 放大/缩小)。使用鼠标滚轮对地图进行 zoom 放大/缩小。拖动地图可更改中心位置。地图上有标记(红点),对应 metadata 中含有地理坐标的图像。点击某个标记即可获得该位置图像的图库视图。位于地图上标记区域内的图像会被选中。有效标记区域会随地图比例而缩放。放大(zoom-in)可扩大比例,可能会将一个标记拆分为多个相邻的标记。 - - TOPIC: 在地图上显示 在世界地图上显示当前图像文件的位置。如果多个标记重叠,请放大(zoom-in)直到某个标记单独位于中心。 - - TOPIC: 相册菜单 - - TOPIC: 相册 相册是从现有图像中手动组建而成的任意图像集合。相册是其成员图像文件的一个列表。图像文件本身不会被复制或更改。一个给定的图像文件可以是多个相册的成员,也可以在同一个相册中出现多次。您可以在相册中添加、移除图像,或重新排列它们的顺序。相册创建完成后,您可以按名称选择它,并以图库形式显示。 - - TOPIC: 创建相册 输入新相册的名称。您可以创建一个空相册、一个包含来自 {选择文件} 预选图像文件的相册、一个包含当前图库中图像的相册,也可以选择相册的初始图像。 - - TOPIC: 重命名相册 选择一个现有相册并输入新名称。 - - TOPIC: 删除相册 选择一个现有相册并将其永久删除。 - - TOPIC: 选择相册 系统会显示可用相册的列表。从列表中选择。 - - TOPIC: 当前相册 从当前(最近使用的)相册设置图库。 - - TOPIC: 图库转相册 将当前图库保存为相册。选择一个现有相册名称 [浏览],或输入一个新名称。 - - TOPIC: 编辑相册 右键点击某个相册缩略图,并从弹出菜单中选择: • 在此添加选定的文件——之前选定的文件会被添加到此处 (点击缩略图左侧/右侧以在该缩略图前/后添加)。 • 在此添加当前文件(文件视图)——工作方式相同。 • 从相册中移除——所点击的文件将从相册中移除。 - ^拖放 您可以通过用鼠标拖动缩略图来重新排列相册中的图像。拖动缩略图,直到鼠标光标变为一个小的缩略图图像。继续将该图像拖动到应插入的位置,然后释放鼠标按键。将鼠标大致定位在要插入拖动图像的两个缩略图之间。如果拖动接近窗口的顶部或底部边缘,图库会自动滚动以显示更多图像。您可以使用两个 Fotocx 会话来加快许多图像的选择或移动操作。可以将图像从任意来源图库拖放到目标相册中的某个位置。 - 如果您使用 Fotocx 重命名或移动某个文件,所有相册链接都会更新,该文件仍会保留在包含它的相册中。如果您在 Fotocx 之外进行此操作,相册链接会丢失,该文件也会从相册中消失。 - 如果使用“批量转换”或“批量复制/移动”重命名或移动图像文件,请务必在需要时选择“替换相册文件”选项。否则您将不得不逐个替换它们。 - 如果文件夹中包含相册里的图像,请不要重命名这些文件夹。相册链接将会丢失。请改为使用“批量转换”或“批量复制/移动”将图像文件移动到新文件夹,然后在旧文件夹为空时将其删除。要删除图像文件,请使用“批量删除/回收”。这也会同时清除相册中已删除的文件。 - - TOPIC: 更新相册 +image: album-replace-file.png - 将指定的相册文件替换为指定的替换文件,或在指定的现有文件之后添加指定的新文件。选择一个或多个要处理的相册。在图库视图中,点击两个缩略图以在上方对话框中分别指定“旧文件”和“新文件”。选择选项:让“新文件”替换所有找到的“旧文件”,或将“新文件”添加到相册中“旧文件”之后。按 [proceed] 处理相册。处理完成后,会重复出现该对话框,并保持相同的相册选择和相同的“替换或添加”选项。您可以再选择两个文件并按 [proceed]。 - - TOPIC: 相册批量更新 +image: album-mass-update.png - 这是一个用于批量更新的工具,当您为许多图像文件创建了新版本,并需要将一个或多个相册更新到新版本时,可能会用到它。它并不能涵盖所有需求(这几乎是不可能做到的),但希望能减少您逐个更改文件的需要。 - 选择一个或多个相册,然后选择以下处理选项之一: • 仅用最新版本替换全部:相册将更新为只包含最新的文件版本。 • 用最新版本替换所有版本:所有文件版本都会被替换为仅保留最新版本。如果存在原始文件,则不会被替换。 • 将最新版本添加到现有版本:如果缺少最新版本,则将其添加到现有版本中。 • 用原始版本和所有版本替换全部:所有文件都会被替换为原始文件和全部版本。 • 用原始版本和最新版本替换全部:所有文件都会被替换为原始文件和最新版本。 • 用选定版本替换全部 (*):所有文件都只会被替换为选定的版本。这包括原始(无版本号)文件。 • 用选定版本替换所有版本 (*):所有文件版本都只会被替换为选定的版本。如果存在原始文件,则不会被替换。 • 将选定版本添加到现有版本 (*):如果缺少选定版本,则将其添加到现有版本中。 • 用原始文件和选定版本替换全部 (*):所有文件都会被替换为原始文件和选定的版本。 - (*) 使用选定文件的四个选项:所选文件列表来自 {选择文件} 功能。与任何所选文件都不匹配的相册文件将保留在相册中。只有与某个所选文件匹配的文件才会按照上述规则进行更改。匹配依据是不含版本号或扩展名的文件名:例如 “asdfg.png” 和 “asdfg.v01.jpg” 视为匹配。 - 示例:用选定版本替换所有版本:如果相册中有 filename.jpg 和 filename.v02.png,而所选文件列表中包含 filename.v04.jpg,则更新后的相册结果将是:filename.jpg 和 filename.v04.jpg - - TOPIC: 幻灯片放映 +image: slide-show.jpg - ^显示器小数缩放 在某些系统上,小数缩放会导致 Fotocx 幻灯片放映动画出现性能问题。如有需要,请禁用此功能,改用其他方式增大应用程序的字体大小。对于 Fotocx,字体大小设置在菜单 {设置} 中。 - 在幻灯片放映对话框(左上)中,按 [选择相册] 并从提供的列表中选择一个相册。根据需要更改对话框中的其他设置,然后按 [开始] 按钮以从相册中的第一张图像开始放映,或按 [恢复] 以恢复已暂停的放映,或点击某个缩略图以选择其他图像开始。使用 Esc 键退出幻灯片放映并返回对话框。 - 主对话框控件 • 说明文字时间:显示标题和描述的秒数。 • 图像时间:仅显示图像本身的秒数。 • 剪切限制 %:按此比例裁切图像以消除边距。 • 全屏:勾选后,图像将以全屏方式显示,不带菜单等。 • 自动回放:勾选后,幻灯片放映到结尾会重新开始。 • 随机图像:勾选后,使用随机图像顺序;否则按相册顺序。 - 可以使用键盘按键控制幻灯片放映。按 [键盘] 查看。 - 以下键盘按键已分配了动作,无法更改: • Esc:中断幻灯片放映并返回主对话框。 • 左/右方向键:您可以随时前进或后退,幻灯片放映会从该处继续。 - 图像之间的动画过渡效果,以及各图像的显示时间和 zoom 行为,都可以通过下文说明的对话框进行自定义。 - 按 [过渡效果] 启动一个对话框,用于选择和自定义图像之间的过渡效果。其中包括多种动画式的图像替换方法(例如新图像从中心展开以替换旧图像)。选择要使用的过渡效果,以及它们是随机使用还是按顺序使用。时间参数设置过渡效果的持续时间。偏好参数指定一个相对偏好值,当选择随机顺序时,它会影响该过渡效果被使用的频率。 - [加载] 和 [保存] 按钮可让您将过渡设置保存到文件中,并在以后加载它们。这些文件与幻灯片放映文件是相互独立的。幻灯片放映默认会使用该放映(相册名称)上一次使用的过渡设置,但您始终可以使用 [加载] 按钮加载其他设置,或在对话框中更改它们,来替换这些设置。 - 按 [图像文件] 启动“图像首选项”对话框(右上)。这些设置是可选的。通过点击相册/图库显示中的缩略图来选择要自定义的图像。对话框会填入默认设置,或该图像在本次幻灯片放映中之前使用过的设置。输入修改内容后按 [done],或点击下一张要自定义的图像。 - 偏好值:如果选择了随机图像顺序,此数字表示该图像的相对偏好值。中性值为 10。输入新值可增大或减小该文件在随机图像序列中被选中的概率,例如输入 20 会使概率提高 2 倍。输入 0 则会阻止该图像被显示。该图像在被显示后,还会在接下来数量为相册图像总数的 1/3 或 10(取较小者)张图像内被屏蔽。 - 该对话框按时间顺序显示可自定义的图像事件: • 等待指定的时间(可以为零)。 • 并行显示以下文字标签:图像名称(文件基本名)显示指定时间,图像标题(如有)显示指定时间,图像描述(如有)显示指定时间。 • 在开始图像 zoom 之前等待指定时间(可以为零)。 • 在指定时间内将图像从正常大小 zoom 为放大状态,或反向进行。如果两个选项都未选择,则不进行 zoom。 • zoom-in(放大):从正常大小开始,在放大图像的同时将 zoom 中心移动到指定位置。 • zoom-out(缩小):从指定 zoom 中心处的放大状态开始,将图像缩小回正常大小。 • [zoom center] - 按此按钮,然后点击图像缩略图以为该图像指定 zoom 中心。 • 在 zoom 结束后等待指定时间(可以为零)(默认值为主对话框中的“图像时间”设置)。 • 使用指定的过渡效果,或使用“下一个”表示不指定偏好(随机选择),过渡到下一张图像。 - - TOPIC: 自定义菜单 +image: custom-menu.png - 此功能可让您将多个菜单中常用的功能收集到一个自定义菜单中。您还可以添加条目以打开特定的图像文件或相册。该菜单还包括脚本功能和插件功能(见下文)。 - 菜单中的最后一个条目“编辑菜单”会打开一个文本编辑器,用于编辑菜单列表本身。菜单名称必须与 Fotocx 菜单中的名称完全一致,但大小写不区分。 - 菜单条目可以使用以下格式: • # 注释文字:不执行任何操作的注释 • menuname # 弹出提示:Fotocx 菜单名称及可选的弹出提示 • file <文件名>:打开指定文件 • album <相册名>:以图库形式打开指定相册 - 以下条目默认存在,您不应更改或删除它们:编辑脚本、运行脚本、批量脚本、插件、编辑菜单。详情如下所述。 - - TOPIC: 脚本文件 菜单功能: • 编辑脚本 - 对一个图像文件执行一组编辑操作,并将所有功能和设置记录到一个命名的脚本文件中。 • 运行脚本 - 像执行一个编辑功能一样,对当前图像文件运行一个脚本文件。 • 批量脚本 - 选择任意数量的图像文件,并以批量模式对所有文件运行一个脚本文件。 - 脚本文件让您可以一次性定义一组编辑操作,并在以后对单个或多个图像文件重复执行这些操作。 - ^可脚本化的编辑功能 一些编辑功能会在图像上使用鼠标拖动,例如所有的扭曲功能。这些功能无法脚本化,因为鼠标拖动不会被记录。使用这些功能会被阻止。 - 以下功能目前可以脚本化: • 编辑:修饰、边距、颜色模式、区域填充 • 修复:锐化、普通模糊、渐变模糊、降噪、去雾、JPEG 伪影、抗锯齿、调整 RGB • 优化:展平直方图、局部对比度、增强对比度、全局 Retinex、局部 Retinex、局部对比度、饱和度、柔焦、亮度渐变 • 效果:轮廓、素描、卡通、浮雕、瓷砖1、瓷砖2、绘画、纹理、图案、抖动、雕刻、设置颜色、移色、自定义卷积核 - - TOPIC: 编辑脚本 在对话框中按 [开始]。为脚本选择一个文件名。开始编辑当前图像文件。可按任意顺序使用所需的编辑功能。每一次编辑及其所用的全部对话框设置都会被记录到脚本文件中。完成后,按 [close] 关闭脚本文件,并以给定的文件名保存它。 - - TOPIC: 运行脚本 从弹出菜单中选择一个已保存的脚本文件。该脚本会像普通编辑功能一样在当前图像文件上执行。 - - TOPIC: 批量脚本 在对话框中按 [选择文件]。使用标准文件选择对话框 {选择图像文件} 选择要编辑的文件。完成后,按 [选择脚本]。从弹出菜单中选择一个脚本文件。此脚本现在会在所有选定的文件上执行。所有修改后的图像都会被保存为新版本。如果处理的是 RAW 文件,相应的输出文件将是 TIFF-16 文件。 - - TOPIC: 插件 +image: plugins.png - 插件功能是一种在 Fotocx 中使用其他图像编辑器的方式,例如 Gimp。您可以使用像 Rawtherapee 这样的 RAW 图像编辑器,然后再使用 Fotocx 执行额外的编辑。 - ^使用流程: • 在 Fotocx 中打开要处理的文件 • 启动插件菜单并选择所需的程序,例如 Gimp • 该插件程序启动,并打开从 Fotocx 传递过来的文件 • 使用该插件程序执行所需的编辑 • 完成后,将输出文件以与输入文件相同的名称保存。文件扩展名可以更改。 • 关闭该插件程序。 • Fotocx 会将插件输出文件作为当前文件的一个已编辑版本打开。 • 执行其他编辑,或将编辑后的文件保存为新版本或新文件。 - 左侧是一个插件菜单示例。最后一个条目“编辑插件”会启动右侧的文本编辑应用程序。使用该文本编辑器定义插件菜单名称,以及启动相应插件程序的命令。格式如下: menuname = plugin-command %s TIP = 以上命令的说明 其中“plugin-command”是该插件功能对应的 shell 命令,“%s”是当前文件名插入命令中的位置。不要在“%s”周围加引号,因为这会被自动添加,从而允许处理带有空格或其他特殊字符的文件名。上方所示的示例是一个名为“Gimp”的菜单,会启动命令 “gimp %s”。TIP 文字是可选的。如果存在,它位于菜单名称所在行的下一行。将鼠标悬停在菜单条目上时,会在菜单文字旁边显示这段文字。 - 有些命令可能要求同时指定输入文件和输出文件。在这种情况下,请在两个位置都提供“%s”。如果该命令不处理图像文件,则省略“%s”。 - ^选择区域 如果输入文件有选定区域,则只会修改该区域。插件功能会编辑整张图像,但当结果由 Fotocx 处理时,只会保留选定区域内的更改。 - - TOPIC: ZOOM - ^ZOOM 按钮 用鼠标左键或右键点击该按钮,可增大或减小 {文件视图} 中的图像大小,或 {图库视图} 中的缩略图大小。这仅在图库视图模式为 {缩略图视图} 时适用。如果是 {metadata 视图},则不会执行任何操作。 - - TOPIC: 上一个/下一个 - 用鼠标左键或右键点击该按钮,可打开当前图库中的上一个或下一个文件。您也可以使用左/右方向键。 - - TOPIC: 文件保存 - +image: file-save.png - +image: file-save-as.jpg - 在第一个对话框中,选择“新版本”“新文件”或“替换文件”。 - ^新版本 将当前图像文件保存为带有新版本号的文件。带版本号的文件名格式为 “filename.vNN.ext”,其中 NN 是 01 到 99 之间的数字。如果文件名尚无版本号,将创建 .v01 版本。如果磁盘上已存在文件版本,则会使用下一个更高的版本号。如果文件是 JPEG 文件,将使用默认质量——参见 {设置}。 - ^新文件 上方所示的第二个对话框会打开,用于将当前图像保存为选定的文件,该文件可以是原始文件、其他现有文件,或一个新文件。文件可以保存为 JPEG、PNG、JXL 和 TIFF 格式。 - 对于 JPEG,您可以选择 1 到 100 范围内的质量值。较低的值会生成较小的文件,但图像质量较差。70 以上的值与 100(最高质量、最大文件体积)几乎难以区分。除非您在对话框中更改数值,否则将使用默认的 JPEG 质量。默认值来自 {设置}。质量为 70 和质量为 100 保存的文件之间,您几乎看不出区别,但文件体积的差异会很大。透明区域会显示为黑色。JPEG 不支持透明度。 - PNG 和 TIFF 文件是无损压缩的,体积比 JPEG 大得多。它们可以以每种颜色 8 位或 16 位保存。 - 如果勾选了“设为当前”,保存的文件(新文件名)将成为当前文件。 - ^替换文件 将当前图像文件保存回其自身。 - ^权限^是从输入文件复制而来的。按 [更改] 按钮可编辑权限。 - - TOPIC: metadata 菜单 - - Metadata 是存储在图像文件内部的文本数据。数码相机会自动生成一些 metadata,例如日期和时间、有关相机和拍摄参数的技术数据,以及位置数据(如果相机配有 GPS 接收器)。用户也可以添加其他数据,例如标题、描述、评分、keywords。Fotocx 可以使用任意 metadata,连同文件夹和文件名或部分名称,搜索您的图像收藏,生成匹配图像的图库。在大多数情况下,搜索几乎是瞬间完成的。 - - TOPIC: 查看主 metadata TOPIC: 查看所有 metadata +image: view-metadata.jpg - “查看主 META”功能会显示当前图像文件的常用 metadata。这包括照片的日期和时间、快门速度、焦距、图像大小、ISO 等。数码相机会将这些数据存储在图像中。Metadata 也可能包含用户添加的数据:keywords、标题或说明文字、描述、摄影师或后期编辑者添加的评论(有时可在已发布的图像中找到)。 - 如果对图像进行了编辑,编辑记录会保存在 metadata 中。“查看主 META”会显示所做编辑的历史记录。 - “查看所有 META”会报告所有可用的 metadata,其中可能包含 100 多项您可能并不关心的内容。 - “查看主 META”窗口上的 [Extras] 按钮会打开右侧所示的对话框,您可以在其中为报告添加额外的标签。“查看所有 META”报告中包含的任何标签都可以添加到简要报告中。点击左侧栏中的某个标签,即可将其添加到右侧栏和报告中。点击右侧栏中的标签即可将其移除。点击 “其他标签……” 条目,可以输入任何未包含在默认列表中的标签名称,该默认列表仅限于最可能用到的标签。 - Fotocx 使用以下 metadata 标签进行图像编辑和搜索: • 标题 - 图像的简短标题 • 描述 - 图像的描述 • 拍摄日期/时间 - 拍摄日期/时间 • 评分 - 0 到 5 星 • 国家 - 来自相机 GPS 或手动添加 • 位置 - EXIF 名称为城市 • Geotags - latitude/longitude(纬度/经度) • Keywords - 用户添加的图像标识符 • 相机数据 - 品牌、型号、镜头 • 曝光数据 - 时间、光圈值、焦距、ISO 这些标签可通过 {编辑主 metadata} 功能进行编辑。其他任何标签也可以进行编辑和搜索,具体方法不太方便,说明如下。 - 此外还有若干批量功能,可一次性为多个图像文件添加数据。参见 {批量菜单}。 - - TOPIC: keywords 概览 图像文件可以拥有用于标识或分类的 keywords。这些 keywords 可用于在大型图像收藏中搜索具有所需 keywords 的图像。常见的 keywords 包括:主题、事件、位置、人物或物品等。Keywords 存储在图像 metadata 内部。Keywords 通常是一个单词,但也可以使用带有空格或其他分隔符的短语。逗号和分号被用作 keywords 之间的分隔符,因此不能在 keyword 内部使用(这是一个外部标准)。像 “arizona scenery” 这样的复合 keyword 是允许的,但为了更灵活,建议改用两个 keywords:这样您可以搜索具有其中任意一个或同时具有两个 keywords 的图像。 - 所有具有所需 keyword 或 keywords 的图像都可以被快速找到,并显示在图库窗口中。如果您以有意义的方式使用了文件夹和文件名,也可以使用这些名称搜索图像。您还可以按日期、评分、位置及其他 metadata 标签搜索图像。这些内容不必在 keywords 中重复。参见下文的 {搜索图像}。 - ^受管理的 KEYWORD 系统 如果您希望在向图像添加 keywords 之前先规划好您的 keyword 体系,这种方式就很合适。在这种体系中,您需要创建有限数量的 keyword 类别(例如人物、地点、物品、事件、艺术、风景……)。在为图像分配 keywords 时,可以根据需要创建 keyword 并将其分配到某个类别。为图像分配 keyword 的方式是在可用 keyword 列表中指向并点击,该列表按类别组织,并在每个类别内按字母顺序排列。如果需要新的 keyword,会在首次分配给某张图像时创建。理想情况下,每个类别内的 keyword 数量应少于约 200 个,以便从选择列表中直观定位所需 keyword 的速度较快。 - ^受管理 KEYWORD 系统的优点 • 防止 keyword 名称不一致(例如 “landscape” 和 “scenery”) • 防止出现拼写变体和打字错误(例如 susan、susy、susna) • 防止某个 keyword 中包含另一个 keyword(例如 scenery、lake) • 由于 keywords 不存在上述问题,搜索更加可靠 • 在分配 keywords 时,您可以纵览所有可用的 keywords,而不是像未受管理的系统那样面对成千上万个混乱的 keywords - 从一个庞大的列表中挑选 keywords 可能会比较慢。可以通过以下 3 种方式缓解这个问题: • 编辑 metadata 对话框中会显示最近使用的大约 10 个 keywords,方便您轻松查看并选择。由于同一时间拍摄的一系列照片很可能会共享许多 keywords,这使添加 keywords 变得更容易、更快捷。 • 您可以直接开始输入所需的 keyword 名称。一旦匹配项只有少数几个,就会弹出一个匹配 keywords 的列表。然后您可以点击所需的 keyword,将其添加到图像中。如果没有匹配的 keywords,您可以选择将该新 keyword 添加到已定义 keywords 的列表中。 • 您可以选择一个类别以显示更小的选择列表。 - 如果 keywords 定义得较为宽泛且数量较少,keyword 的搜索结果会更多,但通过视觉方式找到所需图像的速度可能相当快。物理文件顺序会得到保留:位于同一文件夹中的图像文件在搜索结果中也会出现在一起。 - 从互联网下载的图像通常包含 keywords。这些 keywords 当然没有任何组织,整体上是混乱的。如果您使用受管理的 keyword 系统,最好检查此类图像并整理 keywords 使其符合您的体系,或者将其删除。任何新出现的 keywords 都会被自动添加到 “nocatg” 类别下。如果您发现自己的 keyword 列表中出现了不需要的 keywords,可使用 {搜索图像} 按 keyword 搜索,找到含有不需要 keywords 的图像,以便修正或移除它们。 - ^随意 KEYWORD 系统 您也可以不考虑特定体系,按需随意创建 keywords。或者您可能已经拥有成千上万个 keywords,使转换为受管理的 keyword 系统变得困难(但并非不可能:Fotocx 可以批量转换 keyword 名称)。在这种情况下,您可以直接在图像中输入 keywords,按需创建新的 keywords。系统仍然具备一定的组织能力:一旦匹配项只剩下少数几个,与您所输入字符相匹配的现有 keywords 就会显示出来。例如:您输入 “new”,会显示一个 keyword 列表:New York、New Delhi、Newman……如果其中之一正是您想要的,点击它即可选中该 keyword。如果都不是,您可以继续输入,最终按 Enter 键创建一个新的 keyword。在按 keyword 搜索图像时,您可以输入所需的 keyword 名称,或从可用 keywords 列表中选取。系统会显示与您输入的前几个字母匹配的可用 keywords,您可以从中选择。您无法输入一个在您的图像中完全不存在的搜索 keyword。随意的 keyword 系统很可能会产生成千上万个 keywords。这可能不太实用。 - - TOPIC: GEOTAGS OVERVIEW 现代相机可以借助内置 GPS 接收器记录每张照片的拍摄位置。Latitude、longitude(以及可能的城市/地点和国家)会被记录在图像文件的 EXIF metadata 中。{编辑主 metadata} 功能也支持输入或修订位置数据。也可以通过点击可缩放的世界地图来指定位置。 用于查找指定位置或区域图像的功能: • {搜索图像}:按位置名称搜索(也支持多个名称、部分匹配)。 • {位置/日期}:按国家、位置和日期分组搜索 • 按地图位置查看图像:点击地图标记以显示该标记位置的所有图像。 - 来自相机 GPS 的位置名称(城市或其他地名,以及国家)并未标准化,可能会比较混乱(例如 Munich、München、MONACO)。如何处理这一问题将在下文讨论。 - - TOPIC: 编辑主 metadata +image: edit-meta.jpg - “编辑主 META” 功能用于为图像添加基本 metadata。使用“编辑主 META”之前,请先阅读上文的 {keywords 概览} 和 {GEOTAGS OVERVIEW}。 - “编辑主 META” 用于编辑最常用的 metadata:图像日期和时间、评分、标题、描述、位置数据以及 keywords。该对话框最初显示当前图像的数据。完成添加或更改后,按 [应用] 以更新图像文件。metadata 更改不会自动生成文件版本,但如有需要,您可以使用“文件保存 > 新版本”。 - 该对话框显示文件视图中当前图像的 metadata,或图库视图中所点击缩略图的 metadata。当打开新图像或点击新缩略图时,编辑对话框会自动更新。 - 如果图像有日期信息,会显示为“图像日期”。如果缺失,可以在此输入;如果已有,也可以更改。您可以输入完整日期,格式为 yyyy:mm:dd,也可以使用较短的格式 yyyy 或 yyyy:mm。在与搜索的下限比较时,缺失的月/日在逻辑上等同于 01:01;在与上限比较时,则等同于 12:31。[上一个]按钮会填入上一次输入的数据中的日期。这是为了方便对一系列图像进行日期标注。如果时间信息很重要,您可以使用 hh:mm[.ss] 格式添加时间。完整的输入格式为:yyyy:mm:dd hh:mm:ss - 您可以为图像输入标题、描述和评分(0-5 星)。要编辑标题或描述,请按相应的 [编辑] 按钮。这会弹出一个文本编辑器,文本长度限制很大。您可以使用 [enter] 键有意换行。在 Fotocx 中,这些换行符可以正常显示;在其他图像查看器中,它们可能会被替换为句点。 - 现有的 keywords 会显示在“图像 Keywords”中。可用的 keywords 显示在下方的“已定义 Keywords”窗口中。点击其中一个 keyword 即可将其添加到图像中。在“图像 Keywords”中点击某个 keyword 即可将其从图像中删除。最近添加的 keywords 会显示在“最近 Keywords”中。这样在为一批新图像添加 keywords 时会更方便,因为许多相同的 keywords 会被重复使用。点击方式相同。 - 如果已定义 keywords 的列表很长,直接在“输入 Keyword”中键入所需的 keyword 可能更方便。与您目前输入内容相匹配的现有 keywords 会显示在“匹配 Keywords”中,您可以点击其中之一将该 keyword 添加到图像中。如果输入的 keyword 是新的(没有显示匹配的 keyword),在输入完成后按 [添加新keyword]。它会被添加到图像中,并加入类别为 “nocatg” 的已定义 keyword 列表中。 - 如果您正在使用 keyword 类别,可以选择一个类别,这样已定义 keywords 列表中就只会显示该类别下的 keywords。 - [应用] 按钮会将数据写入图像文件以及用于搜索图像的 metadata 索引文件。 - 对话框底部的 [上一个] 按钮可用于加载上一次查看或编辑的图像的全部可用数据。这可用于加快处理一组共享大量相同数据的图像。 - ^添加 GEOTAGS 在 {编辑主 metadata} 对话框中,有多种方式可以添加位置名称和地理坐标。 - 相机 GPS 您相机的 GPS 传感器可能已插入了位置名称和地理坐标。语言可能不是您想要的,或者可能全部使用大写字母,或存在其他混乱情况。使用 [clear] 按钮重新开始,并输入新的文本。 - [查找] 按钮 在您的图像文件中,或在一个庞大的已知位置列表(worldcities.txt)中搜索某个位置。在“位置”中输入几个开头字符,然后按 [查找]。如果显示了匹配位置的选择列表,请选择其中之一。如果没有显示任何内容,请使用 [地图] 在地图位置上点击。如有需要,修订位置和国家名称。此位置现在已被系统识别,并可供选择使用。 - [上一个] 按钮 如果正在编辑的图像与之前编辑的图像具有相同的位置数据,按 [上一个] 即可填入之前使用过的位置数据。 - 您可以使用 {批量地理标记} 一次性为多个图像文件添加位置数据。 - - TOPIC: 编辑任意 metadata +image: edit-any-metadata.png - 这是一个用于编辑当前图像文件任意 metadata 的对话框。最常用于编辑的标签列在左侧。按 [完整列表] 按钮可获取当前图像文件所有可用标签的列表(可能有数百个)。按 [简要列表] 可返回常用标签列表。点击列表中的某个标签即可获取当前标签值。如有需要可更改该值,然后按 [更新]。要编辑不在列表中的标签名称,请输入标签名称,然后按 [获取] 以检索现有值(如果有的话)。然后输入或更改该值,并按 [更新]。要删除某个标签,请按 [删除]。您可以使用小写字母输入标签名称,可带空格也可不带空格,例如 “Subject Distance” 和 “subjectdistance” 都可以使用。有些标签无法更改,例如 “image width” 是图像的像素宽度,只能通过更改图像像素宽度来改变。简要列表的来源是文本文件 /meta_picklist。您可以从该文件中添加或移除标签。 - - TOPIC: 删除 metadata 指定要删除的标签名称,或选择“全部”。相应的 metadata 会被删除。使用“全部”可清除图像中可能存在的任何身份识别信息。有些标签无法删除,例如“文件名”。 - - TOPIC: 复制 metadata 使用 Fotocx 创建的合成图像(HDR、全景图、Mashup……)默认不包含 metadata。使用此功能可以从某个输入图像或任意其他图像复制 metadata。使用 [浏览] 按钮选择一个作为 metadata 来源的文件,以及一个用于接收 metadata 的文件(对话框中的“目标文件”)。 - - TOPIC: 修复 metadata 如果您有一个在尝试编辑 metadata 时会产生错误信息的图像文件,请使用此功能。它会删除格式错误的 metadata,并保留其余部分。 - - TOPIC: 管理keywords +image: manage-keywords.png - 创建 keywords,并可选择将它们分组到不同类别中。您可以为 keywords 指定类别,以帮助整理它们,并在向图像添加 keywords 时更快地找到它们。类别是可选的,且在 keyword 搜索中不起任何作用:图像中只会存储 keyword 本身,不会存储其类别。常见的类别有人物、地点、物品、事件、风景、建筑、艺术等。要添加一个带有新类别的新 keyword,请输入类别和 keyword,然后点击 [create]。如果类别留空,该 keyword 将被分配到 “nocatg”。要将某个 keyword 分配到不同的类别,请点击某个类别(粗体文字)或输入一个新类别,再点击该 keyword,然后按 [create]。该 keyword 将从旧类别移动到新类别。要删除某个 keyword,请点击该 keyword 并按 [删除]。图像中使用过但未分配类别的 keywords 将显示在 “nocatg” 下。没有分配任何 keyword 的类别可以被删除——点击该类别,清空 keyword 名称(如果有的话),然后按 [删除]。 - 注意:新创建的 keyword 会被追加到其所属类别 keyword 列表的末尾。下次启动 Fotocx 时,所有类别及其 keyword 列表都会按字母顺序重新排序,但 “nocatg” 始终排在最后。 - - TOPIC: 说明文字 +image: choose-captions.png - ^选择说明文字菜单 选择在文件视图模式下,图像左上角用于显示文字说明的 metadata 标签。 - ^切换说明文字菜单 打开或关闭说明文字的显示。可以为快速启用或禁用说明文字显示分配一个键盘快捷键。 - ^注意:^在文件视图中,将鼠标移动到图像左上角,会在弹出的图像中显示标题和描述。当鼠标移开后,该图像会消失。 - - TOPIC: 位置/日期 +image: image-locations.jpg - 这是一种快速查找在指定位置,或指定位置和日期范围内拍摄的所有照片的方法。在对话框中,从两个选项中选择:报告中包含所有图像,或仅包含此前“搜索”功能找到的图像。然后选择所需的分组级别: 国家 国家和位置 国家和日期 国家、位置和日期 日期和国家 日期、国家和位置 - 如果包含日期,请选择用于合并的天数范围:日期在该范围内的照片将被归并在第一个日期下面。按 [proceed] 可获得一份报告,显示每个分组(按国家、国家和位置等)中的图像数量。这也是排序方式。在上面的示例中,有 28 张照片来自新西兰,日期为 2004.11.02。点击报告中的某一行即可获得这些图像的缩略图图库。 - - TOPIC: 时间线 +image: timeline-report.jpg - 此报告会生成一个按月份统计的图像数量时间线。可从两个选项中选择:报告中包含所有图像,或仅包含此前“搜索”功能找到的图像。在结果报告中点击某一年和某月,即可获得该月份中所有具有拍摄日期(EXIF)的图像的缩略图图库。上面的示例显示 2017 年 10 月共有 208 张图像。年份为 “null” 表示没有拍摄日期的图像。 - - TOPIC: metadata 标签 此功能可查找使用指定 metadata 标签和值的所有图像文件。从弹出列表中选择一个标签:评分、keywords、标题、描述、相机、额外索引的 metadata——参见 {索引文件}。系统会显示可用标签值的列表,以及使用该标签值的图像文件数量。对于“标题”和“描述”,仅显示前 60 个字符,并且会报告所有使用与这前 60 个字符匹配的标签值的文件。对于“相机”,匹配值是品牌、型号和镜头的组合。 - - TOPIC: 自动搜索 此功能可供 shell 脚本文件使用,用于提取满足“搜索图像”功能中可用任意筛选条件的图像文件(见下文)。首先,使用“搜索图像”功能设置所需的筛选条件(例如文件夹/文件名、日期、keywords 或其他 metadata)。使用 [保存] 按钮将这些条件保存到设置文件中。使用以下命令启动 Fotocx 并执行搜索: $ fotocx -m autosearch 。 输出会保存到 /search_results 中。 - - TOPIC: 搜索图像 使用“搜索图像”功能可查找具有任意所需 metadata(日期、keywords、位置……)的图像。搜索使用的是 metadata 索引文件,这使得每秒搜索数千张图像成为可能。 - 有两种报告格式:一种是显示所有符合搜索条件的图像的缩略图图库;另一种是将缩略图与 metadata 文本结合在一起的 metadata 报告。以下是 metadata 报告格式的示例: +image: search-images-metadata.jpg - ^搜索对话框 +image: search-images.jpg - 在对话框中,选择要搜索的图像范围:全部(所有图像)或当前集合,即当前图库中的图像,该图库可以是一个文件夹、一个相册,或此前一次图像搜索的结果。 - 接下来,选择要如何处理找到的匹配图像:“新建集合”表示用找到的图像替换当前集合,“添加”表示将它们添加到当前集合(图库)中,“移除”表示将它们从当前集合中移除。若要移除图像,您必须搜索当前集合。 - 对于符合筛选条件的文件,您还可以额外指定选择哪些版本:原始版本、最新版本或全部版本。“原始版本”指原始或未修改的图像(如果原始文件未保存,则为第一个版本)。“最新版本”指现有的最新或最后编辑的版本。“全部版本”指原始文件及全部版本都将被检索。 - 选择所需的报告类型。图库报告是一页缩略图图像,其长度足以容纳所有符合搜索条件的图像。metadata 报告则在每个缩略图旁同时显示缩略图图像和一份 metadata 标签列表。这些标签包括标准标签(日期、评分、keywords、geotags、标题、描述),以及您在标签选择列表中添加的任何其他 metadata 标签(见下文)。 - 输入您的搜索条件。选择所需的 keywords、日期、星级评分、文本中包含的词语(图像标题或描述)、文件或文件夹名称,以及位置名称。更多细节见下文。 - 可用的 keywords 显示在“已定义 Keywords”中,可通过点选来选择。如果已定义 keywords 的列表很长,直接在“输入 keyword”中开始键入某个 keyword 可能更方便。与目前已输入内容相匹配的现有 keywords 会出现在“匹配”列表中,您可以点击其中之一,将该 keyword 添加到搜索列表中。 - 如果您正在使用 keyword 类别,可以选择一个类别,这样已定义 keywords 列表中就只会显示该类别下的 keywords。 - 可以输入一个日期范围,将搜索限制在该日期范围内的图像。可选择拍摄日期(来自相机)或文件日期(创建或最后修改日期)。格式为 yyyy:mm:dd。如果指定了第一个日期,则会选择日期在该日期及之后的图像;如果指定了第二个日期,则会选择日期在该日期及之前的图像。缺失的月/日,对于下限默认取 01/01,对于上限默认取 12/31。也可以选择使用 yyyy:mm:dd hh:mm 格式指定时间。缺失的时间默认取 00:00 和 23:59。 - 若要搜索没有 EXIF 拍摄日期的图像(例如扫描图像),请在第一个日期输入框中输入 “null”。 - 可以输入一对星级评分,将结果限制为评分在给定范围内的图像。缺失下限值默认为 0 星,缺失上限值默认为最高评分 5 星。 - 可以搜索文件夹和文件名。在“搜索文件名”字段中,输入您图像文件夹和文件名中使用的任意数量的名称,以逗号分隔。输入 “egypt cairo” 将匹配所有图像文件夹或文件名中包含这两个字符串之一的项。子字符串也会匹配。大小写不影响匹配。 - 可以搜索图像标题和描述。在“搜索标题/描述”字段中输入要搜索的词语,以逗号分隔。这些词语会与所有图像标题和描述中的每个词进行匹配,匹配的图像会被选中。大小写不影响匹配。 - 要搜索位置,请在“搜索位置”字段中输入一个或多个城市/地点或国家名称,以逗号分隔。只有 geotags 与所输入位置之一匹配的图像文件才会被选中。位置可以是城市、公园或其他地理名称(即存储在 metadata 的 “City” 和 “Country” 字段中的内容)。大小写不影响匹配。 - 单选按钮 “全部” 和 “任一” 适用于 keywords、文本、文件名和位置。您可以选择包含所有输入字符串的图像,或包含任一输入字符串的图像。示例:如果位置搜索字段为 “new york” 且选择了“任一”,那么来自新西兰(New Zealand)和英格兰约克(York)的图像都会被包含在内。如果选择了“全部”,则只会包含位于纽约(New York)的图像。 - 如果您想查找缺失数据的图像,可以输入 “null” 作为匹配值。 - ^搜索额外 METADATA 使用对话框中的“标签名称”“条件”和“匹配值”输入项,您可以指定额外的 metadata 标签作为筛选条件,或在选择了“metadata”报告类型时将其添加到报告输出中。可以使用 {查看所有 metadata} 查看某个图像文件可用的标签。其中包含许多主对话框中没有的标签。选择列表来自文本文件 /meta_picklist。如有需要,您可以向该文件添加标签。您也可以使用同时存在于主对话框中的标签。这样做的好处是可以使用更灵活的匹配逻辑。 - 每个 metadata 标签都可以选择匹配逻辑。 ^匹配方式 用于筛选的匹配值 • report 任意值,包括缺失值 • reportx 值不缺失 • matches 以逗号分隔的文本值 • contains 同上,但采用子字符串匹配 • number = 数值相等 • number => 数值大于等于 • number <= 数值小于等于 - 右侧的 [X] 按钮可用于清除单个 metadata 搜索标签。 - ^对话框按钮 [加载] 和 [保存] 可用于从文件加载或保存搜索条件。[清除] 会清空对话框中的所有数据。[继续] 会启动搜索过程。 - 按 [proceed] 按钮以执行搜索。输出结果为标准的缩略图图库,或如上所示的 metadata 报告格式。您可以将搜索到的图像保存为一个永久相册——参见 {相册}。 - ^性能 已索引 metadata 的搜索和报告几乎是瞬间完成的。未索引 metadata 的搜索速度取决于计算机和磁盘速度。配备 SSD 硬盘的高性能计算机每分钟可搜索超过 10 万个文件。 - ^search_results^(相册) “搜索图像”的输出结果会保存在名为 “search_results” 的相册中。如果您希望以后的搜索不要替换掉此相册,请为其重命名。 - 限制:搜索功能最多支持 40,000 条结果(符合搜索条件找到的图像)。如果超出此限制,系统会通知您,并截断搜索结果。之所以存在此限制,是因为 GTK 中可滚动窗口的大小是有限的,尝试创建更大的窗口可能会导致崩溃或死锁。 - - TOPIC: 选择菜单 - - TOPIC: 区域概览 编辑功能通常应用于整张图像,但也可以只编辑图像的一部分(一个“区域”),而保持其余部分不变。如果已选定图像的某个区域,那么大多数编辑功能将仅在该区域内起作用。有些功能(例如“缩放”)会忽略选定区域。可以在开始编辑功能之前选择一个区域,也可以在使用编辑功能的过程中选择。所选区域会立即生效,之前的编辑会被保留,后续的编辑将只应用于该区域内。如果开始另一项编辑,所选区域仍保持激活状态,因此可以在一个区域内连续进行一系列编辑。一个区域也可以是图像中多个互不相连的区域。 - Fotocx 使用“区域”而不是“图层”。您无需从图像中选取内容、从选区创建单独图层、编辑该图层、最后再合并图层,而是直接在图像中选取内容,对选区执行编辑功能,并立即看到最终结果。区域也可以被保存、粘贴到另一张图像中、移动位置和缩放,并进一步编辑。 - +image: edit-selection.jpg - 编辑选定区域有时会在区域边缘留下可见的边界(有时这些边界对应于图像中的特征边缘,因此不算问题)。您可以使用 {区域混合} 混合边缘:编辑效果可以从区域边缘向内逐渐应用,并且您可以选择要混合哪些边缘。 - - TOPIC: 选择区域 +image: select-area.jpg - “选择区域”对话框通过菜单 选择 > 选择区域 启动。请选择下文说明的其中一种方法。每种方法都以不同方式选择图像区域。您可以随时更改方法,所选区域会不断累积。在您添加或移除选区时,系统会显示所选图像区域的轮廓。[完成] 按钮用于映射区域轮廓内的图像像素,使其可以应用后续的编辑功能。[隐藏] 按钮会隐藏区域轮廓,使您能更清楚地查看编辑效果以及可能出现的区域边缘效应。使用 [显示] 按钮显示区域轮廓。[清除] 按钮会移除所有区域选择。“选择区域”对话框可以取消,以后再重新启动以修改现有区域或添加新区域。 - ^方法 以下方法用于圈定一个或多个最终将属于该区域的图像空间。这些方法可以按任意顺序使用,以定义相连或分离的空间。 • 矩形 - 拖动以勾勒出一个矩形区域 • 椭圆 - 拖动以勾勒出一个圆形或椭圆形区域 • 手绘 - 用鼠标手绘勾勒区域轮廓 • 沿边缘 - 沿图像特征边缘进行勾勒 • 选择鼠标范围内的区域 - 拖动以选择鼠标指针周围一个圆圈内的像素。 • 选择鼠标范围内的一种颜色 - 仅选择与给定颜色匹配的像素,匹配度 0-100%。 • 选择鼠标范围内的所有颜色 - 选择鼠标范围内的所有像素,并将选区扩展到颜色与鼠标范围内颜色匹配的相邻区域(有时称为“泛选”)。 - 以下各段将详细说明每种方法。 - ^矩形 从矩形区域的一角向对角拖动鼠标以进行选择。系统会绘制一个矩形以圈住该区域。右键点击可删除并重新开始。重复此过程可选择更多矩形区域。 - ^椭圆 其工作方式与矩形选择相同,只是所圈定的区域为圆形或椭圆形。拖动起始位置为所生成椭圆的中心。拖动的角度决定椭圆的形状。 - ^手绘 按住鼠标左键拖动以绘制一条手绘线,或用左键点击以将上一次绘制的点与当前点击的位置以直线连接。持续沿目标区域进行操作,直到区域被连续的曲线和直线完全包围。右键点击可移除之前绘制的线条(用于纠正错误)。一次右键点击将移除最近一次点击或拖动生成的线条,最多可移除 50 像素。反复右键点击可移除更多内容。新点击生成的线条总是会连接到上一条线的末端。如果新拖动的线条起点靠近上一条线的末端,则会与之相连;如果起点在其他位置,则会绘制一条不相连的线条。您可以从远处开始新的拖动,然后绘制回去与之前的线条相接。如果某条点击生成的线连接到了不希望的点上(即您不想连接到最后绘制的那条线),可右键点击擦除它,然后使用拖动开始一段新的线条序列。使用鼠标右键拖动可用于擦除线段:沿着某条线紧贴地进行右键拖动即可将其擦除,然后使用左键拖动重新绘制该线条。最终,区域必须完全闭合,不能有间隙。两端稍有重叠是可以接受的。间隙可能很难被发现和修正,因此请在 100% 或更大的图像尺寸下仔细操作。通过左键点击自动连接生成的一系列线条不会留下间隙,但如果偏离这种方式,很可能会产生间隙。为减少出现间隙的可能性,在手动连接线条时应故意留出一些重叠。下文将介绍一个间隙检测工具——{查找区域间隙}。如果某段区域边缘同时也是图像边缘,则无需绘制这部分区域。将线条画出图像边缘之外,然后在图像边缘上的另一位置将其画回图像内。 - ^沿边缘 系统会在上一个绘制点与新点击位置之间查找并连接高对比度像素(可能是图像特征边缘)。这种方法对不太不规则的清晰边缘效果很好。模糊和参差不齐的边缘可能效果不佳,如需高精度则需要使用手绘方式。连接线条的规则与上文所述相同。用鼠标拖动而非点击的效果类似于手绘,但会倾向于沿着略微落后于鼠标位置的图像特征边缘进行跟随。对于非常不规则的边缘(如毛发、树叶),请参见下文的“取消选择颜色”。 - ^鼠标半径和颜色匹配级别 这两个控件仅适用于下文所述的“鼠标范围内选择”方法。鼠标半径定义了鼠标指针周围圆圈的大小。圆圈内的像素会被选中,或者它们会提供一组颜色,用于从鼠标圆圈向外匹配并选择像素。匹配级别定义了根据颜色和亮度选择像素所需的匹配程度(0-100%)。“0” 表示任何颜色都算匹配,“100” 表示要求完全匹配。 - ^选择鼠标范围内的区域 用鼠标左键点击或拖动将选择鼠标圆圈内包含的像素。右键点击将取消最近一次的选择(重复点击可取消更多)。右键拖动将取消所圈定像素的选择。 - ^选择鼠标范围内的一种颜色 点击图像以选择一种颜色。该颜色会显示在颜色按钮上。您也可以使用该按钮直接设置颜色。左/右键拖动可在鼠标圆圈内选择/取消选择与所选颜色在匹配级别内相符的像素。向下或向上调整匹配级别,以匹配更大或更小范围的颜色。根据需要在图像上点击以更改要匹配的颜色。 - ^可选的取消选择颜色 此选项仅适用于上文的“选择一种颜色”。用鼠标左键点击图像以设置一个取消选择颜色。勾选此框后,取消选择颜色即生效。如果某像素与取消选择颜色的匹配程度高于与所选颜色的匹配程度,该像素将被取消选择。当沿着某个特征边缘进行选择,而该边缘与应保持未选中的相邻区域对比度较低时,可从相邻区域设置取消选择颜色。这有助于对复杂边缘(如毛发或树叶)进行精确选择。下面的示例对于有经验的用户来说是一个 5-10 分钟即可完成的项目。下文的“区域混合”功能也被使用了。 - +image: select-hairy.jpg - ^选择鼠标范围内的所有颜色 在某些编辑器中,这被称为“泛选”。左/右键拖动可选择/取消选择鼠标圆圈内的像素。如果超出鼠标圆圈的像素满足以下两个条件,也会被包含在内:1)它们的颜色在当前匹配级别内与鼠标圆圈内的任意颜色相匹配;2)它们位于鼠标指针的搜索范围内。这是鼠标半径的一个倍数,例如,如果鼠标半径为 20,搜索范围为 3,则搜索范围为距鼠标指针 60 像素。将鼠标拖动到您想要包含的新区域上方。观察所选区域向颜色与鼠标圆圈内颜色相匹配的区域扩展。如果扩展过头,右键点击可移除最近一次的选择。如有需要可重复此操作以移除更多之前的选择。减小半径或提高匹配级别可获得更精细的控制——选区扩展速度会变慢,并更贴近鼠标圆圈。较小的半径和较高的匹配级别可用于沿图像特征边缘进行跟随,并较为精确地选中直到边缘的像素。边缘处理完成后,使用“鼠标范围内选择区域”方法选择其余部分。右键拖动的作用相当于取消选择:鼠标圆圈内以及搜索范围内匹配的像素都会被取消选择。如果选区扩展过头,通常从已选区域外部取消选择,比从内部重新选择更容易修正。您可能需要一些练习才能掌握这种感觉,从而高效地工作。 - ^选择鼠标范围内的所有颜色 - 摘要 • 左键拖动 - 选择鼠标范围内的像素及范围内匹配的像素 • 右键点击 - 撤销上一次选择,重复点击可取消更多选择 • 右键拖动 - 取消选择鼠标范围内的像素及范围内匹配的像素 - ^边缘蔓延 已完成的区域(见下文)可以按 1 像素为单位进行扩展或收缩。当通过颜色匹配选定的区域被以改变其亮度的方式编辑时,这有助于减少边缘效应。按颜色选择可能会在特征颜色过渡到背景的边缘处留下一条较窄的欠选或过选像素带。将区域扩展或收缩 1-2 像素可以获得更干净的边缘效果。蔓延之后,该区域仍保持“已完成”状态(见下文)。 - ^区域轮廓颜色 用于鼠标选择圆圈和区域轮廓的颜色可以随时通过点击其中一个颜色按钮来更改。这样可以在各种图像颜色背景下都保持良好的可见度。 - ^显示/隐藏 使用 [隐藏] 隐藏区域轮廓。这有助于更好地查看区域编辑效果,而不受区域轮廓的干扰。使用 [显示] 显示轮廓并继续编辑该区域。 - ^完成 +image: select-area-finish.png - 一个区域在成功“完成”之前对编辑不起作用。“完成”会验证已绘制的轮廓,并为封闭的像素上色以便直观检查。当您完成区域轮廓的绘制后,使用 [完成] 按钮完成该过程。上方显示的弹出对话框总结了两种可用于完成的方法。 - 方法1:在手动勾勒出的区域内部用鼠标左键点击。被圈住的区域会被临时上色,以便您核实最终结果是否符合预期。任何被圈住的区域都可以被选中,即使是那些没有明确勾勒出轮廓的区域也可以:如果您有一个带孔的甜甜圈形状,您可以选择甜甜圈本体、孔洞,或两者都选。当所有区域都已点击并正确上色后,按 [keep]。如果手绘区域的轮廓存在间隙,上色过程会“泄漏”出去,圈定范围之外的区域也会被上色。在这种情况下,请在“完成”对话框中按 [撤销],这会恢复原始的区域轮廓。找到轮廓中的间隙并将其封闭,然后再次尝试 [完成]。在一个较大区域中,1 像素的间隙可能很难找到。放大(zoom-in)可以看得更清楚。参见下文的 {查找区域间隙} 功能,以快速找到微小的间隙。 - 方法2:在所有圈定区域之外的某处用鼠标右键点击。所有圈定的区域都会被上色以便直观核实。如果存在间隙,其结果和修复方法与方法1中所述相同。如果您有很多手绘的区域,不想使用方法1逐一检查,那么这种方法比较合适。 - 使用“鼠标范围内选择”方法选定的区域会自动完成。这些区域在选择过程中就已被映射,而使用矩形、椭圆或某种画线方法选定的区域,只有在您点击其内部时才会被映射。如果您只使用“鼠标范围内选择”方法,则无需点击任何选定区域即可按 [keep]。 - 如果您绘制了一条从图像一侧到另一侧的线,可以点击该线的任意一侧,以将该侧的所有像素组成一个区域。示例:在天空和陆地的交界处绘制一条水平线。在线上方点击可选择天空,在线下方点击可选择陆地。所绘制的线条必须完全到达图像边缘。 - ^清除 永久放弃当前区域。 - - TOPIC: 查找区域间隙 如果某个区域的轮廓是通过多笔手绘完成的,很容易在轮廓中留下一些在 4 倍 zoom 以下不易察觉的小间隙。尝试完成这样的区域会失败,因为内部像素的映射会通过间隙“泄漏”出去,覆盖到目标区域之外的部分。如果“完成”功能失败,可以使用此功能查找间隙。在失败区域的轮廓上某处点击。系统会从点击位置开始沿一个方向缓慢重新绘制轮廓,直到找到一个“终止像素”。这里就是间隙所在的位置。然后系统会沿相反方向绘制轮廓,直到遇到该间隙(或另一个间隙)。绘制停止的位置就是间隙所在处。放大(zoom-in)间隙位置,用手绘方式将其封闭,然后再次测试,看是否可以不间断地绘制出完整轮廓。此功能可以与“选择区域”功能并行使用——两个对话框可以同时处于激活状态。 - - TOPIC: 区域混合 +image: area-blend.jpg - 此工具中包含两个功能:区域混合和区域边缘混合。这两个功能都可以通过混合之前的编辑或原始图像,逐渐“撤销”在选定区域内所做的编辑。在上方示例中,背景中的四个人被提亮,却看不到提亮区域与未改变像素之间存在任何边界。 - ^区域混合 已编辑选区的任意部分都可以与原始图像混合。在要混合的区域上使用鼠标左键拖动。区域内的每一次鼠标拖动都会逐渐混入所选的先前图像,从而有效地减少或移除该区域内所做的编辑。混合速率由“混合比例”决定,该比例可分别针对鼠标圆圈的中心和边缘单独设置。设置鼠标半径和混合比例(例如鼠标中心/边缘为 50/0)。在要混合的区域上拖动鼠标。左键拖动进行混合,右键拖动取消混合或恢复。您可以使用此方法有选择地混合区域边缘:使用较小的半径,将鼠标中心拖过要混合的边缘。这将产生一种从边缘向内的渐变式混合效果。 - ^区域边缘混合 有时,由于已编辑区域与周围图像之间存在明显的边界(尤其是当该区域被提亮时),已编辑区域可能会呈现出不自然的边缘效果。可以通过对边缘一条带状区域内的区域编辑效果进行渐变式混合移除,使其变得几乎不可见。区域编辑效果可以在区域边缘处完全移除(100%),并沿该条带的宽度向内逐渐减弱至 0%。混合区域边缘有两种方式:“混合”和“模糊”。“混合”会将边缘条带与所选的先前编辑或原始图像混合。“模糊”会将该条带与条带之外的相邻像素混合。可通过“混合宽度”或“模糊宽度”输入项设置混合的宽度。 - 区域边缘“混合”和“模糊”需要进行边缘距离计算:即每个区域像素到最近区域边缘的距离。此距离用于计算该像素的相对混合比例:在区域边缘为 100%,超出边缘“混合宽度”的像素为 0%。对于边缘复杂的大区域,这可能需要一些时间。顶部面板会显示进度指示。 - - TOPIC: 显示/隐藏区域 显示或隐藏当前区域的轮廓。在使用编辑功能修改区域时,隐藏该区域会很有用,这样能更容易判断编辑效果。这些功能在“选择区域”对话框中也以按钮形式提供。 - - TOPIC: 启用/禁用区域 禁用当前区域并保留其数据,以便日后重新激活(“启用”菜单)。这样您可以在选定区域内的编辑和整张图像的编辑之间交替进行。 - - TOPIC: 反转区域 反转现有区域:除现有区域外,整张图像都会被选中。再次使用此功能会恢复原来选定的区域。反转选定区域会使边缘计算失效,如果需要区域边缘混合,必须重新计算。 - - TOPIC: 清除区域 永久放弃当前区域。此功能在“选择区域”对话框中也以按钮形式提供。 - - TOPIC: 复制/粘贴区域 可以使用菜单 区域 > 复制 将选定区域保存到缓存文件中。使用 区域 > 粘贴 可将该区域粘贴到同一图像或另一图像中。点击并拖动以定位粘贴的区域。对话框控件可用于缩放和旋转粘贴的区域。 - - TOPIC: 加载/保存区域 可以使用菜单 区域 > 保存 将选定区域保存到文件中。系统会要求您提供文件名。将创建一个 PNG 文件。该 PNG 文件带有用于透明度信息的 alpha 通道。图像是一个包住选定区域的矩形。选中的像素为不透明,其余为透明。 - 这些文件默认位于 /saved_areas 中,但您可以将它们保存在任意位置。使用菜单 区域 > 加载 可从文件中加载已保存的区域,并将其粘贴到当前图像文件中。粘贴区域的透明部分会透出背景图像。点击并拖动以定位该区域。对话框控件可用于缩放和旋转粘贴的区域。 - - TOPIC: 撤销/重做按钮 如果某个编辑功能处于激活状态,且图像已被更改: • 鼠标左键点击将撤销当前编辑 • 鼠标右键点击将重做该编辑 这样您可以快速比较当前编辑功能的“之前”和“之后”图像。 - 如果没有任何编辑功能处于激活状态,但当前图像已进行过一些编辑: • 鼠标左键点击每次撤销一个编辑步骤 • 鼠标右键点击每次重做一个编辑步骤 • 鼠标中键点击会弹出所有编辑步骤的列表。您可以返回到任意一个编辑步骤,或返回原始图像 - 如果您打开了另一个文件,当前文件已保存的编辑步骤将被丢弃。 - - TOPIC: 编辑菜单 - - TOPIC: 旋转 要校平一张倾斜的图像,请用鼠标拖动图像的左侧或右侧向上或向下移动,直到图像看起来水平。在图像上左键点击会添加垂直和水平引导线,帮助您校平图像。右键点击可移除这些引导线。 - 如果相机在 EXIF metadata 中记录了“横滚角”,[自动色阶] 按钮可以自动校平图像。如果 EXIF metadata 中存在“方向”信息,[Auto Upright] 按钮可以自动校正相机旋转 90 度拍摄的图像。 - - TOPIC: 校正 这是一个一键修复功能,用于校正旋转了 90/180 度或已翻转(镜像)的图像。由于像素是按 1:1 复制到新的图像布局中的,因此不会损失分辨率。另见功能 {批量校正}。 - - TOPIC: 裁剪 +image: crop-image.jpg +image: crop-buttons.jpg - 从图像边缘裁去不需要的区域。对话框打开时,图像上会出现一个选择矩形。该矩形之外的区域会被变暗,表示图像中将被移除的部分。拖动矩形的任意边或角以移动该边或角。对话框会显示选择矩形当前的宽/高比例。如果勾选了“锁定”,移动某条边或某个角时,另一条边或角也会随之移动,以保持固定的宽/高比例。从中间(用一个小圆圈标记)拖动可在不改变尺寸的情况下移动整个矩形。使用宽度和高度微调按钮可直接调整图像的像素尺寸,或输入所需数值。选择矩形会根据这些数值进行调整。 - 使用键盘方向键可以 1 像素为单位移动选择矩形。最后一次用鼠标移动的那条边或角,就是方向键将要移动的对象。 - [最大] 按钮会将裁剪矩形重置为整张图像大小。如果之前的编辑(旋转、扭曲……)在图像周围留下了透明边距,裁剪矩形将反映在这些边距范围内可容纳的最大尺寸。 - [上一个] 按钮会调出之前使用过的宽度和高度数值列表。可从列表中选择使用其中之一。 - 五个比例按钮可让您选择预设的宽/高比例。[invert] 按钮会反转当前的宽/高比例。 - 您可以使用 [customize] 按钮更改比例按钮,这会启动右侧所示的新对话框。点击某个按钮以编辑它。按照示例中所示的 “ww:hh” 格式输入所需的宽高比。 - - TOPIC: 修饰 +image: retouch.png - 调整图像的亮度和颜色。 • 自动黑场 - 使用百分比最暗像素设置黑点 • 自动白平衡 - 使用百分比最亮像素设置白点 • 点击灰点以进行白平衡 - 在图像上点击灰色的点 • 点击暗点以设置黑场 - 在图像上点击较暗的点 • 点击以弹出 RGB 直方图图表 • 亮度 - 使“全部”曲线上移或下移(所有颜色都会改变) • 对比度 - 改变“全部”曲线的斜率 • 颜色饱和度 - 黑白 <--> 鲜艳色彩 • 色温 - 光照平衡(暖色 <--> 冷色) - 使用滑块进行初步调整后,您可以用鼠标编辑曲线来微调亮度和对比度,以改变图像中哪些部分变化更多或更少。“全部”曲线会调整所有颜色,而 3 条 RGB 曲线分别调整各个颜色。请先使用“全部”,然后再用 RGB 进行修订。 - ^按钮 重置 - 将所有控件恢复到中性位置——图像也会被重置 之前 - 将所有控件设置为上一张图像所使用的数值 完成 - 完成编辑,关闭对话框,保存控件设置 取消 - 取消编辑,重置图像,关闭对话框 - 在处理多张需要相似调整的图像时,使用 [上一个] 按钮。 - - TOPIC: 缩放 +image: rescale.png - 此功能会将图像缩放为新的像素宽度和高度。您可以直接输入新的尺寸,或选择一个百分比变化值。系统提供了一些按钮,用于将新尺寸设置为原始尺寸的简单比例。使用其中之一可以最大限度地减少分辨率损失。[上一个] 按钮会调出之前使用的尺寸,如果要将多张图像设置为相同尺寸,这会很方便。如果勾选了“锁定比例”框,在更改宽度或高度其中之一时,会保持当前的宽/高比例。 - - TOPIC: 分屏 +image: split-screen1.jpg +image: split-screen2.png - 在编辑功能进行过程中,可以使用分屏方式查看编辑前后的图像。用鼠标拖动分界线。退出分屏后,您可以正常继续该编辑功能。 - 如果没有任何编辑功能处于激活状态,可选择两张图像以分屏方式显示。它们必须具有相同的像素尺寸。 - - TOPIC: 显示差异 在编辑功能进行过程中,通过使未改变的区域变暗来突出显示更改之处。使用滑块调整未改变区域的暗度。退出“显示差异”后,您可以正常继续该编辑功能。 - 如果没有任何编辑功能处于激活状态,可选择两张图像以突出显示它们之间的差异。它们必须具有相同的像素尺寸。 - - TOPIC: 边距 +image: margins.png - 使用此功能在图像周围添加边距。您可以为边距设置任意颜色和 alpha(透明度)值。可以分别设置每条边距,也可以使用“全部±1”和“全部±10”控件将所有边距同时增加或减少相同的量(1 或 10 像素)。使用鼠标滚轮或上/下方向键可加快调整速度。 - 您可以使用此功能,为计划要进行扭曲的图像周围添加边距,以防止某些区域超出边缘丢失。 - - TOPIC: 标注 +image: markup.jpg - 这是一个包含图像标注功能的菜单: 绘制文本、绘制线条/箭头、绘制方框、绘制椭圆 所有这些功能都有一个 [commit] 按钮,用于提交当前编辑,并让您在同一编辑对话框中开始一个新的编辑(新的文本/线条/方框/椭圆)。 - ^绘制文本 此功能可直接在图像上绘制文本。在对话框中输入文本,可以使用多行。输入文本后,用鼠标左键点击图像上想要放置文本的位置。拖动可将文本移动到其他位置。右键点击可移除该文本。使用 [字体] 按钮选择不同的字体。使用 [大小] 控件增大或减小文本大小。使用 [角度] 控件更改文本的倾斜角度。其他控件可为文本设置背景颜色、文本轮廓颜色以及阴影效果。您可以为所有这些设置颜色和透明度。宽度控件用于调整轮廓和阴影的宽度。阴影角度控件用于设置阴影的角度。使用浮雕控件可让文本呈现 3D 效果。 - 您可以从图像文件中任意可用的 metadata 初始化文本内容。输入 metadata 标签(例如 “user comments”)并按 [获取]。您可以使用标签名称的缩写形式,例如用 “usercomments” 代替 “User Comments”。 - [打开] 和 [保存] 按钮会启动一个文件选择对话框,您可以借此从文件加载或保存所有文本数据。对话框中的所有条目都会被加载或保存,因此您可以保留一组常用的文本字符串和设置。 - 底部的按钮功能如下: • 清除 - 清空文本和 metadata 字段 • 替换 - 用添加了文本的图像替换当前图像 • +版本 - 将添加了文本的图像保存为新版本 • 下一个 - 打开下一个文件,在相同位置放置相同的文本 • 应用 - 提交当前编辑,并重置以输入新文本 • 完成 - 完成当前编辑——图像已准备好保存 • 取消 - 放弃当前编辑 - 要为一系列图像添加相同的文本:先准备并定位文本,按 [替换] 或 [+Version],然后按 [下一个],再按 [替换] 或 [+Version],再按 [下一个]…… - 制作水印:将文本透明度设为 70% 或更高,背景透明度设为 100%。文本应模糊可辨。使用浮雕控件可使文本看起来像是嵌入到图像中一样。 - ^绘制线条 此功能可直接在图像上绘制线条或箭头。在对话框中输入线条长度和宽度,如有需要可选择箭头样式。用鼠标左键点击图像上想要放置的位置。拖动线条/箭头的端点以调整其在图像上的位置。右键点击可将其移除。从线条中间拖动可在不改变角度或长度的情况下移动它。对话框控件可为其设置背景颜色、轮廓颜色和阴影效果。您可以为所有这些设置颜色和透明度。宽度控件用于调整轮廓和阴影的宽度。阴影角度控件用于设置阴影的倾斜角度。要保留已绘制的线条并开始绘制另一条,请按 [应用]。 - ^绘制方框 为方框轮廓选择颜色和宽度。将光标放在想要作为方框某个角的位置,然后向所需方向拖动以打开方框。要替换该方框,请再次拖动。要移动方框,请按住 shift 键并从中心拖动方框。要移动某条边,请按住 shift 键并拖动该边。要保留已绘制的方框并开始绘制另一个,请按 [应用]。 - ^绘制椭圆 选择椭圆或圆形复选框。为轮廓选择颜色和宽度。将光标放在所需的中心位置。拖动以绘制椭圆/圆形。拖动的角度决定椭圆的形状,从圆形到极端的椭圆,可宽可高。要替换该椭圆/圆形,请再次拖动。要移动该椭圆/圆形,请按住 shift 键并从中心拖动。要更改大小或形状,请按住 shift 键并从右下边缘拖动。要保留已绘制的椭圆/圆形并开始绘制另一个,请按 [应用]。对于椭圆,您可以输入 0-90 度的角度以使坐标轴倾斜,如示例所示。 - - TOPIC: 颜色模式 +image: color-mode.png +image: color-mode2.jpg - 使用此功能可制作黑白或彩色负片,或将负片图像转换为正片图像,或转换为褐色调(用于老照片效果)。滑块可用于逐渐应用该效果,从 0% 到 100%。 - - TOPIC: 绘制编辑 将此功能与其他某个编辑功能结合使用。先启动一个编辑功能,并将控件保持在中性位置。然后启动“绘制编辑”。用鼠标在需要的位置绘制该编辑功能的效果。有关如何使用鼠标进行局部编辑的方法,请参见 {MOUSE PAINTING}。 - 这种“绘制”式的渐进编辑方法可以快速、轻松地改善图像的选定区域。它适用于以下编辑功能: • 编辑 > 修饰、颜色模式 • 修复 > 锐化、模糊、降噪、去雾、调整 RGB、调整 HSL • 优化 > 展平直方图、局部对比度、增强对比度、局部 Retinex、饱和度、柔焦 • 效果 > 轮廓、素描2、浮雕、纹理、添加眩光、设置颜色、移色、自定义卷积核 - - TOPIC: 绘制图像 +image: paint-image.jpg - 此功能使用鼠标在图像上用选定颜色进行绘制。有关如何使用鼠标进行局部编辑的方法,请参见 {MOUSE PAINTING}。 - “绘制颜色”按钮显示当前颜色。点击此按钮可使用标准的 Gnome 颜色选择对话框来选择颜色。您也可以在图像上按住 shift 并用鼠标左键点击,从图像中选取颜色。 - 调色板按钮会打开中间所示的对话框。点击图像可选取该位置的颜色。所选颜色会反映在主对话框的颜色按钮上。上方所示的图像是默认图像。您可以使用任何图像作为颜色来源。按 [浏览] 按钮,选择一张您保存了颜色以便调用的图像。此选择会一直生效,直到被更改为止。 - HSL 按钮会打开右侧所示的 HSL 颜色选择器。此对话框可以表示任何可能的颜色。移动滑块以获取您想要的颜色。所选颜色会反映在主对话框的颜色按钮上。 - 如果选中了“在透明区域上绘制”,在透明区域上绘制将根据不透明度控件的设置减少或消除透明度。如果未选中此选项,则只会对图像的不透明区域进行绘制。 - ^Wacom 数位板操作 使用“绘制图像”时,您可以使用 Wacom 数位板代替鼠标。将笔尖与数位板表面接触并拖动,即可像上文所述那样进行绘制。如果在拖动时按住其中一个笔身按钮,操作将变为擦除而非绘制。您也可以使用对话框中的单选按钮设置绘制或擦除模式。按住笔身按钮比较不方便,这就是设置这些单选按钮的原因。加大笔尖压力会增加不透明度,因此您无需调整不透明度控件即可绘制出深浅不同的笔触。 - - TOPIC: 绘制透明度 +image: paint-transp.png +image: paint-transp2.jpg - 在图像上绘制透明或半透明区域。有关如何使用鼠标进行局部编辑的方法,请参见 {MOUSE PAINTING}。 - - TOPIC: 区域填充 用所选的叠加颜色填充所有选定区域或所有透明区域。如果某个区域部分透明,叠加颜色将替代图像中透明的部分。“混合”滑块可用于选择原始图像与叠加颜色之间的任意混合比例。 - - TOPIC: 图像内复制 通过从同一图像的其他位置复制内容,来对图像区域进行绘制覆盖。此方法可用于在图像内复制物体,或通过用其他位置取来的背景替换不需要的物体来将其擦除。用鼠标左键点击图像以选择源位置,然后用右键点击以选择对应的目标位置。有关如何使用鼠标进行局部编辑的方法,请参见 {MOUSE PAINTING}。 - 如果选中了“在透明区域上绘制”,在透明区域上绘制将减少或消除透明度。如果未选中此选项,则只会对图像的不透明区域进行绘制。 - - TOPIC: 从图像复制 通过从另一张图像复制内容,来对图像区域进行绘制覆盖。用鼠标在要修改的区域上拖动即可“绘制”目标图像。源图像中之前选定的位置会被复制到目标图像上。正在被复制的区域和正在被绘制的区域都用会随鼠标移动的圆圈圈住。在上方示例中,右侧图像中的船被复制到了左侧图像中。 - 首先打开目标图像。选择菜单“从图像复制”。系统会启动第二个 Fotocx 会话,显示相同的图像。在这个第二个会话中,导航到源图像并打开它。排列这两个窗口,以便您可以同时看到它们(至少要能看到要复制的区域)。在源图像上按住 shift 并用鼠标左键点击,以确定源位置。在目标图像的目标位置上按住 shift 并用鼠标左键点击。 - 用鼠标左键在目标图像区域上拖动。源图像中的像素会被复制到目标图像上。如果参考位置需要高精度,请将图像 zoom 到最大尺寸。两张图像的初始参考位置均为 (0,0)(西北角)。有关如何使用鼠标进行局部编辑的方法,请参见 {MOUSE PAINTING}。 - “源图像比例”值用于将源图像缩放至目标图像。首先进行一次试复制以检查比例是否合适。如果太大或太小,使用 [undo all] 清除该试复制内容,更改比例值,然后再次尝试。 - 如果选中了“在透明区域上绘制”,在透明区域上绘制将根据鼠标不透明度控件的设置减少或消除透明度。如果未选中此选项,则只会对图像的不透明区域进行绘制。 - - TOPIC: 复制之前的编辑 可以通过用鼠标“绘制”的方式,将之前某个编辑步骤的图像效果局部、渐进地应用到当前图像上。此处所指的“之前的编辑”,必须是在当前图像仍处于打开状态时所做的编辑之一——如果打开了新图像,未保存的编辑将会丢失。只要当前图像仍作为当前打开的图像存在,您就可以将任意之前的编辑应用到正在编辑的当前图像的任意区域。使用下拉列表选择之前的某个编辑,该列表会按顺序显示对当前图像所做的所有之前的编辑步骤,并以所使用的编辑功能进行标注。有关如何使用鼠标进行局部编辑的方法,请参见 {MOUSE PAINTING}。 - - TOPIC: 修复菜单 - - TOPIC: 锐化 +image: sharpen.png - 此功能提供五种方法来锐化模糊图像,还有一种方法用于锐化因相机或拍摄对象在曝光期间移动而产生的运动模糊。 - 选择方法,设置参数,按 [应用],等待几秒钟以查看结果。进行更改并重复此过程,直到满意为止。使用 {选择区域} 可对图像的不同部分使用不同的方法和参数。 - 对于所有方法,对于轻微模糊的图像应选择较小的半径,对于质量较差的图像应选择较大的值。“数量”控制修改的强度。“阈值”会抑制对低对比度像素的更改:较高的值可减少对轻微不规则(图像噪点、不均匀肤色等)的放大。 - 反锐化蒙版(Unsharp mask):这是大多数图像编辑器中都有的经典方法。可以通过互联网搜索找到相关的技术说明。此方法可能会在高对比度边缘周围产生可见的“光晕”。 - 增强对比度:增强已有的对比度。效果与反锐化蒙版相当,但“光晕”会有所减少。 - Kuwahara:将每个像素周围的小邻域相互比较。该像素会被赋予差异最小的那个邻域的平均颜色。这会使模糊边缘上的像素强制归属于边缘的某一侧。边缘会变得非常锐利。如果使用较大半径,图像可能会显得“块状”。细微的细节可能会丢失。 - 中值差(Median diff):将像素亮度与半径范围内像素的中值进行比较。对于比邻域平均值更亮或更暗的像素,亮度会相应地增加或减少。效果与反锐化蒙版相当,但“光晕”会大幅减少。这是唯一一种分别对每种 RGB 颜色单独处理的方法。即使亮度变化很小,它也能锐化颜色过渡。 - Richardson-Lucy:使用 Richardson-Lucy 反卷积方法对图像进行锐化。此方法可能产生最佳效果,但速度也相当慢。为了加快速度,可先使用 {选择区域} 选取图像中一个较小但内容丰富的区域。在这个小区域内寻找最佳半径和迭代次数。然后对整张图像使用相同的设置。图像中的噪点会影响效果。如果是这样,请先使用 {降噪}。 - 放大恰好 2 倍的图像可以使用 Richardson-Lucy 方法锐化,半径设为 2.0,迭代 4 次或更多。效果非常好。 - ^修正运动模糊 +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - 手动优化因相机或物体运动而产生轻微模糊的图像。如果一张原本清晰的图像中有某个移动物体产生的模糊,可以使用 {选择区域} 将该物体单独隔离出来处理。系统假定模糊是线性且匀速的。输入项为以像素为单位的“模糊跨度”和以度为单位的“模糊角度”。初始角度估计可以通过按住 shift 并用鼠标沿图像上的模糊方向拖动来指定(可以与实际运动方向相同或相反)。可以使用 工具 > 显示 RGB,沿某个明亮的图像特征边缘测量模糊宽度,以此输入模糊跨度的估计值。调整输入值,按 [应用],检查图像以找到最佳设置。对于较大的图像,响应时间可能较慢。您可以先使用 {选择区域} 选取一小块模糊区域来优化跨度和角度,然后清除该区域,用相同设置处理整张图像,从而加快处理速度。该算法可能会产生“振铃”噪点,可使用“抑制振铃”输入项来抑制。最好先将抑制值保持较低以找到最佳跨度和角度,然后再根据需要增加抑制以减少振铃。此处沿一维方向使用了 Richardson-Lucy 反卷积方法。 - ^数码相机运动模糊 并非所有模糊照片都具有最适合此方法的匀速模糊。图像可能是多次较短曝光的叠加。整张图像可能并非同时曝光,因此各部分的模糊程度也不同(机械或电子式移动快门)。即便如此,此方法产生的效果可能仍优于在二维方向上工作的锐化工具。它在处理使用胶片相机拍摄的老照片时效果会更好,因为这类照片中的运动模糊更接近匀速模糊。 - - TOPIC: 模糊 +image: blur.jpg - 用相应的复选框选择一种方法,输入所需参数,按 [应用]。如果 {选择区域} 处于激活状态,则只有选定区域会受到影响。 - ^普通模糊 将每个像素与半径范围内的周围像素进行混合。距离越近的像素权重越高。您可以将半径设为 1,反复按 [应用] 以缓慢增加模糊程度,同时观察图像结果。 - 如果分别输入水平和垂直方向的数值,您还可以选择在水平和垂直方向上使用不同程度的模糊。[半径] 输入项会强制水平和垂直方向使用相同的值。 - ^径向模糊 将每个像素与从所选中心出发的一条线上的像素进行混合。“半径”定义了一个不被模糊处理的中心区域。“长度”设置模糊线的范围:从中心到边缘为 0 到该长度。通过点击图像来选择中心。 - ^定向模糊 用鼠标在图像上拖拉出一个位置。鼠标周围的区域将沿此方向进行模糊处理。“跨度”决定被模糊区域的大小。“强度”决定模糊的程度。 - ^渐变模糊 只有对比度低于给定对比度限制的像素才会被模糊,模糊半径的范围为 1 到给定值,相应地,像素的对比度范围为给定限制到零。简而言之:低对比度像素会比高对比度像素被更多地模糊。这可用于柔化肤色,同时不模糊头发或减少眼睛的光彩。做到极致时,会产生一种“卡通”效果。 - ^背景模糊(散景) 对背景图像区域进行模糊处理,同时保持前景清晰。选择一个或多个应保持清晰的区域 {选择区域}。选定前景区域后,反转选区,使背景现在被选中 {反转区域}。这就是将被模糊处理的区域。系统提供两种模糊方法:恒定模糊:所有被模糊的区域使用相同的模糊半径。随距离增加模糊:靠近前景的像素使用最小模糊半径,距前景最远的像素使用最大模糊半径。这需要计算所有背景像素的边缘距离,可能会花费较长时间。可以在不重新计算边缘距离的情况下更改模糊半径。 - - TOPIC: 降噪 +image: denoise.jpg - 减少在弱光条件(高 ISO)下拍摄照片中的噪点,这类噪点会使原本均匀的表面呈现斑驳感。系统提供两种方法:中值和平滑。最佳方法因噪点和图像特性而异。混合使用多种方法(先用一种,再用另一种)可能会有所帮助。“半径”值定义了用于比较和调整某个像素的邻域范围。较大的值(半径 > 2)能更有效地减少噪点,但也可能导致细节丢失。“限制”值会使 RGB 亮度值与邻域中值相差超过该数值的像素被忽略。对于某些图像,这是必要的,以防止微小的明亮细节被当作噪点处理——例如天文照片。 - 设置一个“半径”值,然后按其中一个方法按钮。每次迭代都会以上一次的图像为起点,因此多次迭代会逐渐抑制噪点,也可能使某些细节变模糊。使用 [重置] 可重新开始。先用半径 1 的“中值”,再用半径 2 的“中值”,是在抑制噪点和保留细节之间的一个不错的折中方案。 - “区域”滑块可用于将处理限制在暗部区域,或扩大到更广的区域范围。相比明亮区域,暗部区域往往噪点问题更严重。 - 如果您发现仍有一些细微的噪点斑点持续存在,可增大限制值,使用 [重置] 按钮,然后继续使用 [中值] 或 [平滑]。 - 您可以在图像的不同区域应用不同的处理——参见 {选择区域};也可以对图像的不同区域使用不同处理方式进行“绘制”——参见 {绘制编辑}。 - 每种 RGB 颜色都是独立处理的。不会对色度或亮度进行单独处理。 - [measure] 按钮会启动右侧的对话框,用于测量实际的图像噪点水平。将鼠标移到图像上方,即可显示鼠标圆圈(半径 10,约 300 像素)内的 RGB 噪点水平。该区域必须是没有特征的区域,以确保噪点是唯一存在的变化。请以 4 倍尺寸查看图像,确认您看到的是噪点而非纹理。这些点表示各个像素的 RGB 值相对于周围 5x5 像素平均值(用中间的实线表示)的偏差。底部的数字显示了 RGB 平均亮度和噪点水平,范围为 0-255。图表刻度范围为 -10 到 +10,虚线位于 -5 和 +5 处,相对于 0-255 的总范围而言。第 9 位或第 10 位 RGB 比特上的噪点,在此刻度上分别为 0.5 或 0.25。 - ^RAW 图像噪点 要测量相机传感器的噪点,请使用 RAW 图像。JPEG 图像会在相机内部经过处理以降低噪点。您可能会惊讶地发现,RAW 图像中的噪点水平通常很高。即使是配备大型传感器的昂贵相机,其低噪点的色彩位深也可能不到 8 位。当您对 RAW 图像进行降噪处理时,实际上是在与生成相机 JPEG 的电子元件和软件相竞争。要做得更好可能是一项挑战。 - - TOPIC: 去雾 +image: defog.png +image: defog2.jpg - 消除图像或选定区域中的雾/霾。虽然还有其他工具可以做到这一点(展平直方图、局部对比度、增强对比度、retinex、饱和度),但去除雾/霾只是它们的次要功能。此功能直接针对雾/霾进行处理:它会等量减少 R/G/B 颜色(降低亮度并提高饱和度),并可选择性地补回损失的亮度。如果蓝色变得过于突出(远处雾霾常见的情况),它也可以降低蓝色。您可能需要使用 {选择区域} 或 {绘制编辑} 来精确定位并优化所需的区域。上方的示例使用了两个区域:前景的山丘和背景的山脉。 - - TOPIC: 红眼 +image: red-eyes1.png +image: red-eyes2.png - 减少闪光拍照产生的红眼效果。系统提供两种方法。第一种速度较快,但可能无法处理较复杂的情况。第二种方法更为稳健,但也需要更多时间和细心操作。要使用第一种功能,请用鼠标左键点击红眼一次或多次,直到满意为止。如果变暗的区域太小或偏离中心,请右键点击撤销该更改,然后更精确地左键点击红眼的中心。如果某个红眼无法正确修复,请右键点击撤销更改,然后使用第二种方法。第二种方法可以更好地处理更困难的情况,例如红眼只有轻微的红色,与眼睑之间的颜色差异太小,自动算法难以区分。将光标放在红眼中心上方。按住鼠标左键,将光标向右下方拖动。会出现一个虚线椭圆,将红眼圈住。如有需要可重复此操作,使红眼大致位于椭圆中心。请注意,椭圆的形状取决于拖动的方向,这样可以更精确地只圈住红眼部分。反复在椭圆内左键点击,同时观察红眼变暗,当足够暗时停止操作。如果操作过度,眼睑可能会开始变暗。此时可右键点击撤销并根据需要重复操作。 - - TOPIC: 智能擦除 +image: smart-erase.png +image: smart-erase2.jpg - 擦除可能破坏一张好照片的小物体,例如电线、地面上的垃圾、标志牌等。不需要的物体会被替换为取自周围区域的像素。这种方法有时效果非常好(副作用几乎不可见),有时则不然。它最适合处理照片中较小或较细的物体。“半径”控制鼠标指针周围圆圈的大小,用于定义要选择并擦除的区域。用鼠标拖动以圈住要移除的物体。左键拖动为选择,右键拖动为取消选择。按 [擦除] 擦除选定区域,将像素替换为选区之外最近的像素。如果选择不够精确,可使用 [撤销],调整选定区域,再次按 [擦除]。反复选择和擦除会不断累积,直到您使用 [New_Area] 开始新的选择。之前已擦除的区域现已固定,[撤销] 只对之后的选择起作用。最好在图像放大到 200% 或更高比例的情况下进行操作。“模糊”控件会为替换像素添加模糊效果,这可以减少可见的副作用,因为替换像素可能比周围区域更清晰。更改“模糊”设置并再次按 [擦除] 按钮。[show] 和 [hide] 按钮可用于显示当前选区的轮廓,或将其隐藏以便更好地判断擦除后的效果。 - 对于细长的物体(例如电线),您可以点击两个位置,两点之间的所有内容都会被选中。选择是按直线进行的,因此对于弯曲的物体,您需要按一定间隔多次点击以沿曲线选择。 - - TOPIC: 移除光晕 +image: remove-halo.png +image: remove-halo2.png - 移除某些编辑功能留下的光晕。选择光晕的类型:亮光晕(最常见)或暗光晕。用鼠标左键在光晕区域上拖动,以改变鼠标范围内的像素,如示例所示。对于亮光晕,随着鼠标拖过,最亮的像素会变暗。对于暗光晕,最暗的像素会变亮。请使用比光晕宽度更大的鼠标半径,如示例所示。用鼠标右键拖动可恢复原始像素。 - - TOPIC: JPEG 伪影 +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - 经过高度压缩(使用较低质量设置)的 JPEG 图像,可能会出现以小矩形块形式呈现的压缩伪影。如果照片中某些区域的亮度范围被扩展过,这些块状伪影可能会变得更明显,因为亮度台阶变大了(例如 RGB 值 11/12/13 被提亮 5 倍变为 55/60/65)。此功能会模糊这些块之间的边界,使其不那么明显。 - “匹配限制”决定相邻像素何时被视为属于同一个像素块。可将“匹配限制”设为较低的值,以更完整地映射这些块。“对比度限制”用于防止对比度较高的边缘被混合,从而避免细节丢失。更改这两项设置并按 [应用]。以大于 2 倍的尺寸查看结果图像,如果优化效果很重要,可尝试不同的设置。此功能对已经缩放过的图像效果会较差。使用 {选择区域} 可对有问题的区域进行选择性处理。 - - TOPIC: 抗锯齿 +image: anti-alias.jpg - 有时照片在一些高对比度特征边缘上会出现像素化(“锯齿”)现象。在上方示例中,您可以在鸟的眼睛周围看到这种情况。抗锯齿工具可以减少这种现象。这种效果在大多数照片上并不明显,因为相机内部处理可能已经解决了这个问题。一个附带效果是,高度压缩图像中的 JPEG 伪影会得到一定程度的平滑。放大过尺寸的图像会出现更明显的像素化现象,这种情况尤其能从此功能中受益,特别是在 2 倍放大的情况下。 - 使用 [应用] 按钮以抑制这些像素,如果有帮助,可多次应用。“阈值”可用于将低对比度像素排除在处理之外。通常 0.1 或更低的值效果最好。 - Fotocx 使用 Scale3x 算法,并进行了修改,用“相似”和“不同”色调代替“相等”和“不相等”。 - - TOPIC: 调整 RGB +image: adjust-RGB.png - 更改整体亮度和对比度,或更改选定颜色的亮度和对比度。 • 亮度 - 增大或减小整体图像亮度 • +红 -青 等 - 更改该颜色的亮度,并使其互补色朝相反方向变化 • 全部对比度 - 增大或减小整体图像对比度 • 红/绿/蓝对比度 - 分别处理各个 RGB 颜色 - - TOPIC: 调整 HSL +image: adjust-HSL.png - 使用 HSL(色相、饱和度、亮度)更改图像中选定范围的颜色。此功能可用于修正偏色,或将一种颜色更改为另一种颜色(例如过曝的天空——太白了)。如果您不熟悉 HSL 颜色模型,请阅读维基百科上关于该主题的文章。 - 首先,在图像上按住 shift 并用鼠标左键点击,选择一个目标图像颜色作为匹配和调整的对象。此颜色将作为将被选中进行调整的颜色范围的中心。使用色相、饱和度和亮度的复选框来选择要匹配哪些颜色属性。勾选的属性越多,所选颜色的范围就越窄。如果都不勾选,则会选中所有颜色。“匹配级别”可用于进一步扩大所选颜色的范围。100% 表示只选择非常接近的颜色。 - “输出颜色”控件(色相、饱和度、亮度)用于设置新的输出颜色,该颜色将替换或与所选输入颜色混合。您也可以在图像上按住 shift 并用鼠标右键点击,从图像中设置此颜色。最终颜色将是原始颜色与新颜色的混合。新颜色所占比例由“调整”滑块设置,范围为 0 到 100%。使用 HSL 复选框来确定输入颜色的哪些 HSL 分量将被输出颜色的相应 HSL 分量替换。使用输出颜色 HSL 的滑块来调整新颜色。输出颜色会显示在左侧较小的方框中,并随着您移动滑块而更新。 - 移动滑块并观察图像的实时更新,以优化结果。这不是很直观,多加练习会有所帮助。提示:先在色相和饱和度上进行匹配,只替换色相——这意味着输出颜色的饱和度和亮度将沿用原始图像的颜色,只有色相会被替换。 - - TOPIC: 移除灰尘 +image: remove-dust.png +image: remove-dust2.jpg - 从布满灰尘的幻灯片扫描而成的图像,可能会有许多小的暗点——这是幻灯片上灰尘的阴影。来自互联网的历史照片也常有类似问题。此功能可以消除大部分此类斑点。移动三个滑块,直到尽可能多的灰尘斑点被标记为红色,然后按 [擦除] 按钮将其擦除。按 [red] 可恢复红色视图,然后您可以再次调整滑块并按 [擦除]。“光斑大小限制”滑块用于限制将被擦除的斑点大小。“最大亮度”滑块设置一个阈值,用于忽略不够暗的斑点。“最小对比度”滑块用于过滤掉与周围环境对比度较低的斑点。这个过程通常需要折中考虑。如果设置不理想,可能会擦除树叶等小特征,或者遗留一些较大的斑点。图像的不同部分可能需要不同的设置,例如天空可以比建筑物墙面更激进地处理。您可以根据需要多次使用“擦除灰尘”,采用不同设置以清除所有灰尘斑点。或者也可以使用 {选择区域} 分段处理图像。如果有些斑点顽固存在,您可以使用 {智能擦除} 手动处理它们。设置一个较小的鼠标半径,点击每个斑点即可将其移除。来自纤维(细长形状)的斑点通常无法自动移除,但“智能擦除”在这种情况下可能会很有效。如果灰尘是明亮的,如上方示例所示,可使用 {颜色模式} 制作彩色负片,处理灰尘,然后再次转为彩色负片以恢复正常图像。 - - TOPIC: 色边 +image: fringes.png +image: fringesA.jpg - 修正周边色边(横向色差)——即主要出现在图像外围区域的色边。 - 上方左侧图像是一张具有横向色差的照片左上角的放大截图。经过处理后,右侧图像中的这一问题已基本消除。色边可能出现在高对比度边缘沿线,尤其是在镜头畸变通常最严重的图像外围区域。要消除色边,请将图像放大到最大尺寸,并将视图中心对准有色边的区域。按 [search] 按钮。红色和蓝色色彩平面会被重新缩放,以更好地与绿色平面对齐,所使用的系数会被填入对话框中。您可以尝试直接在对话框中修改这些系数以改善结果:一边观察图像上的色边,一边更改系数。 - 如果图像已被裁剪,导致图像中心不再与原始照片的中心一致,此功能的效果会有所下降。 - - TOPIC: 优化菜单 - - TOPIC: 展平直方图 +image: flatten1.jpg +image: flatten2.jpg - 增加对比度较差区域的可见细节。系统会向上或向下调整像素亮度,使该像素周围区域的亮度分布(直方图)更加均匀。较小的半径(较小的区域)会强化此效果。共有 5 个亮度区间,从最暗(1)到最亮(5)。移动某个滑块可增强对应区间的效果。使用“区间 A”滑块可同时移动全部 5 个滑块,快速设置一个初始效果。然后再分别使用其他滑块微调图像。 - - TOPIC: 局部对比度 +image: localcon1.jpg +image: localcon2.jpg - 增强图像每个区域的对比度。将每个像素的亮度与其周围区域的平均亮度进行比较。系统会调整像素亮度以增大这种差异。此功能实现了一种被广泛使用的经典教科书方法。“半径”决定用于计算平均亮度的每个像素周围区域的大小。“强度”决定亮度变化的幅度。“颜色”用于增加颜色饱和度。您可以使用可编辑曲线,为选定的亮度水平提亮输出图像。示例显示的是对图像中较暗区域进行了提亮。 - 在某些情况下,局部对比度可能会产生“光晕”: +image: localcon3.jpg - 左侧是原始图像。中间的图像以最大强度应用了“局部对比度”。可以看到在较暗的山丘与较亮的天空之间的边界上出现了光晕。可以用一个简单的技巧来修正这一点(右侧图像):使用 {选择区域} 单独选择天空区域,对该区域应用“局部对比度”,然后反转选区,对图像的其余部分应用“局部对比度”。 - - TOPIC: 增强对比度 +image: amplify-contrast.png +image: amplify-contrast2.jpg - 通过增强局部对比度来增大图像的表观亮度范围。它可以增强低对比度区域,同时不改变高对比度区域。您也可以使用编辑曲线,根据初始对比度大小来改变对比度增强的程度。 - 曲线下方的“增强”滑块用于调节计算强度,从不增强对比度到完全增强。如果向右移动过多,图像可能会出现难看的伪影,此时应向左调回,直到伪影消失。如果均匀区域(例如天空)出现斑驳感,可将曲线左端向下拉,以减少对低对比度区域的增强。在某些情况下,最好分别选择图像的不同区域进行处理,例如对天空保守处理,对石墙等有纹理的表面则更激进地处理。 - - TOPIC: 全局 Retinex +image: global-retx.png +image: global-retx2.jpg - 改善具有严重雾/霾或偏色(例如一张有 100 年历史的照片)图像的颜色和对比度。请先尝试 [Auto] 按钮。系统会在图像中查找存在的最亮和最暗 RGB 颜色。将所有像素减去最暗的 RGB 值,然后按比例放大结果,使最大 RGB 值接近 255。当然,这个初始结果未必是最优的。微调按钮会被设置为查找到的暗部和白色 RGB 限值,您可以更改这些值以优化最终图像效果。您也可以通过在对话框中选择相应选项,并在图像上点击,来自行选择暗点和亮点。倍增系数微调按钮默认设为 1.0,您可以更改这些值来调整每种 RGB 颜色的相对亮度。在上方示例中,第一张图像是原图,第二张图像是使用 [Auto] 按钮制作而成的。右侧最右一列的微调按钮可用于同步调整同一行中的所有按钮——使用鼠标滚轮或键盘上/下方向键。 - “混合”滑块用于按任意比例混合输入图像与 retinex 处理后的图像。“减少亮部”滑块用于减弱较亮图像区域(尤其是天空,Retinex 在此处可能产生奇怪的结果)的效果。 - 该算法源自 Edwin Land 在 1970 年代首次提出的概念。可在互联网上搜索 “retinex” 以获取更多信息。 - - TOPIC: 局部 Retinex +image: local-retx.png +image: local-retx2.jpg - 增强暗部图像区域及其他低对比度区域的可见细节。系统会使用每个像素周围区域的亮度范围来重新缩放该像素的亮度,就好像整个区域被重新缩放以覆盖整个 0-255 亮度范围一样。在“全局 Retinex”效果较弱的情况下,“局部 Retinex”可以产生显著的效果。 - 半径输入项决定了每个像素周围区域的大致大小。“混合”滑块用于按任意比例混合输入图像与 retinex 处理后的图像。“减少亮部”滑块用于减弱较亮图像区域(尤其是天空,Retinex 在此处可能产生奇怪的结果)的效果。“减少暗部”滑块对较暗图像区域执行相同的操作。上方示例大约是 60% 原始图像 + 40% retinex 效果。 - - TOPIC: 饱和度 +image: saturation.png - 根据像素亮度调整颜色饱和度。编辑曲线的 Y 轴表示颜色饱和度,从零色彩(所有 RGB 值相等)到最大色彩(最低 RGB 值为零)。曲线的 X 轴表示像素亮度,从暗到最大亮度。中性位置(无颜色变化)是中间值,也是初始值。示例:要增强图像暗部区域的颜色强度,请提高曲线左端的位置。“饱和度”滑块可整体上移或下移曲线,而不改变其形状。 - - TOPIC: 柔焦 +image: soft-focus2.jpg +image: soft-focus.png - 为照片应用经典的“柔焦”效果。这是清晰图像与轻微模糊图像的混合。“半径”设置决定模糊的范围(像素跨度),“混合”设置决定模糊图像在最终输出图像中所占的比例,范围为 0 到 100%。您可以将 {绘制编辑} 与此功能配合使用,为图像的不同区域调整效果强弱。 - - TOPIC: 亮度渐变 +image: brite-ramp1.png +image: brite-ramp2.png - 使图像中的亮度或颜色发生渐变。您可以使用此功能来补偿不均匀的光照,或在图像各处发生变化的偏色。变化的方向由在图像上绘制的一条线决定。通过在图像上点击来创建这条线,然后拖动任意一端以设置所需方向。在上方示例中,绿色沿着这条线的方向逐渐增强。请先编辑“全部”曲线以调整整体亮度(所有颜色),然后再根据需要调整各个 RGB 颜色曲线。 - - TOPIC: 晕影 +image: vignette.png +image: vignette2.jpg - 修正照片四角有时出现的变暗现象。它也可用于突出显示或为图像中的某个物体或区域上色。 - 在图像上点击或拖动鼠标,可更改晕影的中心,该中心最初位于图像正中央。 - 选择“亮度”可以径向图案的方式更改图像的亮度:分别调整曲线的左端或右端,以改变图像中心和边缘的亮度。您可以为人像面部添加暗色环绕效果,也可以修复四角变暗的图像。曲线的中间水平对应无变化。使用较低的值可使图像变暗,较高的值可使图像变亮。上方示例逐渐使图像边缘变暗,同时保留一个较大的中央区域不受影响。 - 选择“颜色”可以径向图案的方式为图像添加所选颜色。曲线值为零表示无变化,值越高,添加到图像中的所选颜色就越多。最高值对应 100% 的颜色。可使用此功能为图像添加彩色环绕效果,例如为人脸周围添加逐渐增强的颜色。 - - TOPIC: 效果菜单 - - TOPIC: 轮廓 +image: outlines1.png +image: outlines2.jpg - 将照片转换为轮廓画。高对比度像素会被强化,低对比度像素会被抑制。“阈值”设置决定对比度的分界点。低于最小值的线条不会显示,高于最大值的线条则会以最大亮度显示。“黑白”复选框会根据“负片”复选框的状态,将彩色线条转换为白底黑线或黑底白线。如有需要,可使用“低增强”来提亮变淡的线条。相比“模式 A”,“模式 B” 得到的线条亮度更为均匀。 - - TOPIC: 素描1 +image: sketch1.jpg - 将照片转换为类似素描的效果。暗像素会被聚合为更少的像素,使空出的区域变得更亮。对比度也可以作为暗像素的替代判断依据。“阈值”可用于按亮度过滤输入图像。“剪切限制”用于过滤输出结果,以进一步减少孤立或轻微暗的像素。为前景和背景选择颜色。缩小输入图像的尺寸可能会产生有趣的效果。如果效果看起来“脏”,可先使用 {降噪} 或 {融合} 使图像平滑,再进行此处的处理。 - - TOPIC: 素描2 +image: sketch2.png +image: sketch2b.jpg - 将照片转换为类似素描的效果。它使用了不同的方法:低……高对比度像素分别被转换为浅……深像素。可使用曲线来增大或减小对比度转换的强度。X 轴刻度为像素对比度,从低到高,Y 值决定转换的强度。示例显示的是低对比度像素被抑制(变浅)。输入图像可以按任意比例混入。如果效果看起来“脏”,可先使用 {降噪} 或 {融合} 使图像平滑,再进行此处的处理。 - - TOPIC: 卡通 +image: cartoon.jpg - 将照片转换为类似卡通的画作。系统会在图像中亮度或颜色发生突变的特征边缘上绘制黑色线条。“线条阈值”设置边缘检测和绘线的灵敏度,从而决定绘制的线条更少或更多。“线条宽度”可使线条变粗或变细。“Kuwahara 深度”控制一个锐化功能,可增强图像内的特征边缘。 - - TOPIC: 浮雕 +image: emboss2.jpg +image: emboss.png - 将图像转换为模拟浮雕效果(3D 效果)。特征边缘的一侧会变亮,另一侧会变暗,就像被从侧面照亮并凸起一样。“半径”设置决定效果的宽度,“深度”设置决定效果的强度。“光源”设置决定表观光照的入射角度。可以调整此角度,以使与该角度最垂直的特征边缘获得最大效果。 - - TOPIC: 瓷砖1 将图像转换为一组单色瓷砖阵列。您可以控制瓷砖大小以及瓷砖之间缝隙的粗细。这也被称为“像素化”。可使用“选择区域”将此变换限制在特定区域内,例如一张脸。 - - TOPIC: 瓷砖2 +image: tiles2a.png +image: tiles2b.png - 将图像转换为大致符合图像颜色和轮廓的不规则瓷砖。 ^基础大小:^瓷砖的基础尺寸,即用于制作更大瓷砖的单位瓷砖大小。 ^颜色深度:^使用的颜色数量:1 = 8 种颜色,2 = 64 种颜色……8 = 1600 万种颜色。 ^瓷砖区域目标^:瓷砖大小(以像素面积计)的上限。 ^所需颜色匹配度^:设置将较小区域合并到相邻较大区域所需的最小颜色匹配度:0 = 不限制(最大程度合并),100 = 要求完全匹配(最小程度合并)。 - - TOPIC: 绘画 +image: painting1.png +image: painting2.png - 将图像转换为类似油画的效果。它会减少颜色数量,将每个具有相同颜色的连续像素区域进行映射,然后将较小的区域合并到颜色最匹配的相邻较大区域中。 - ^模糊半径^:在处理前先对图像进行模糊处理,这样可以使边界更平滑。 ^颜色深度^:使用的颜色数量:1 = 8 种颜色,2 = 64 种颜色……8 = 1600 万种颜色。 ^拼块区域目标^:为拥有独立颜色的区域设置一个下限:小于此像素数的区域将被并入颜色最接近的相邻区域中。 ^所需颜色匹配度^:设置将较小区域合并到相邻较大区域所需的最小颜色匹配度:0 = 不限制(最大程度合并),100 = 要求完全匹配(最小程度合并)。 ^边框^:决定各色块区域是否用细黑边勾勒,就像马赛克拼图中的不规则瓷砖一样。使用此功能后,再使用 {浮雕} 可以为图像增添有趣的纹理效果。 - - TOPIC: 纹理 +image: texture2.jpg +image: texture.png - 为图像或图像中选定的区域添加带纹理的表面。“半径”决定纹理图案的大小。“强度”决定图案的强弱,从几乎不可见到十分显著。 - - TOPIC: 融合 +image: fusion.png +image: fusion2.jpg - 抑制图像中细小的低对比度细节,同时保留较大图像特征的清晰度。按 [开始] 并仔细观察图像。该过程会持续运行,直到按下 [停止] 按钮为止。细小的细节会逐渐淡化消失。对话框中的“计数”标签会显示迭代次数。您可以按 [停止] 检查图像,然后按 [开始] 恢复处理。使用“撤销/重做”按钮比较处理前后的图像状态。按 [开始] 继续处理。[步骤] 按钮可用于每次仅处理一步。 - - TOPIC: 匹配颜色 +image: match-colors.png - 将一张图像的颜色匹配到另一张图像。系统会从每张图像中通过鼠标点击选取一个小的样本点。第二张图像上的样本点会被调整为与第一张图像样本点具有相同的平均颜色(RGB 值)。用于使 RGB 值一致的系数随后会被应用到第二张图像的所有像素上。一种常见用法是通过在图像上标记一个点,使其与另一张图像中的颜色匹配,从而消除图像的偏色。 - 操作流程:对话框列出了需要依次执行的 5 个步骤。 • 为样本区域设置一个半径。生成的鼠标圆圈即为将要采样的样本区域。 • 按 [open] 按钮打开第一张图像。 • 在图像上点击以获取颜色样本。 • 按 [open] 按钮打开第二张图像。 • 在图像上您希望与第一张图像匹配的位置点击。 图像颜色会在一两秒内发生变化。 - - TOPIC: 图案 +image: pattern2.jpg +image: pattern1.png - 为图像添加背景图案。系统会使用一个小的图像文件(图案文件),通过重复该文件来覆盖当前图像,就像铺贴瓷砖的墙壁一样。这个文件可以是真实的图案(例如帆布的图像、砖墙、重复的几何图形……),也可以是任何其他类型的图像。该图案会被设为半透明,因此看起来就像基础图像印在图案之上,或图案叠加在图像之上。可以通过在网上搜索 “pattern image” 找到许多图案文件。下载其中一些,如有需要将其裁剪为约 200-500 像素的大小。为方便起见,可将这些文件添加到 ~/.fotocx/patterns 中已提供的图案文件里。 - 使用 [浏览] 按钮选择一个图案文件。所选图案将以平铺方式覆盖基础图像。图案是部分透明的,因此基础图像会透出来。使用 Zoom 可放大或缩小图案尺寸。有两种方法可以将图案与基础图像混合。图案的不透明度可设置为 0-100%。基础图像会用于填充未使用的不透明度部分。“对比度”用于以图案亮度为模板来修改基础图像的亮度。这两个参数可以按任意比例混合。 - 如果图案文件中的图像在水平和垂直方向上都以固定间隔重复出现,可使用 [计算] 按钮来设置宽度和高度,以生成没有明显接缝的连续图案。 - 如果图案不规则、接缝明显,您也许可以改善这一点。两个“重叠”值分别决定重复图案在水平和垂直方向的边缘重叠量。适当增加重叠量可以掩盖边缘效应。 - 可使用“选择区域”将图案应用于图像的一部分,或为不同部分应用不同的图案。为图像应用图案后,使用 {浮雕} 为图案增添 3D 效果可能会很有趣。 - “灰度”复选框会将彩色图案转换为灰度图案。 - - TOPIC: 交叉排线 +image: crosshatch2.jpg +image: crosshatch1.png - 使用交叉平行线将图像转换为一幅绘画。 输入网格大小并按 [应用]。 - - TOPIC: 抖动 +image: dither1.png - +image: dither2.jpg - 此功能提供多种将图像抖动化——转换为点阵——的方式。 0 - 罗伊·利希滕斯坦风格的彩色圆点 1 - 采用随机或优化空间分布的纯 R/G/B 或黑白点 2 - 使用指定位深度的 RGB 混合 3 - 使用自定义调色板的经典抖动 4 - 将图像压缩为具有压缩像素平均颜色的色块 - 经典抖动方法使用 Floyd-Steinberg 方法来补偿颜色误差:即输入图像颜色与调色板中最接近颜色之间的差异。会根据需要混入邻近颜色的点,使某个区域的平均颜色更接近输入颜色。如有需要,可以关闭误差补偿,以获得清晰分明的色带或轮廓。 - 色块:图像像素会经历一种“引力坍缩”,向局部质心汇聚成团块。“质量”被定义为像素亮度。“半径”控件大致决定了吸引的范围。按 [开始] 开始坍缩过程。观察图像逐渐变化为大致与“半径”输入值相当大小的色块。当色块变得圆润且几乎不再变化时,按 [停止] 结束该过程。 - - TOPIC: 雕刻 +image: engrave.png +image: engrave2.png - 将图像转换为黑白线条。“大小”输入决定线条粗细,以及输出线条中每一竖列所对应的输入图像竖向像素数量。每条线条像素列会被分成黑白两部分,其比例大致与输入像素的平均亮度相匹配。“偏移量”输入可用于优化整体亮度。负值/正值会使图像变暗/变亮。“颜色”输入(0-100%)可用于为白色部分添加颜色。 - - TOPIC: 添加眩光 +image: addglare.png +image: addglare2.jpg - 为图像中明亮的光斑添加向外辐射的眩光。 强度:决定眩光的相对亮度 限制:发出眩光所需的像素亮度阈值 范围:眩光从发光像素扩散的像素范围 亮度高于限制值(200-255)的像素将发出眩光。此处的亮度指像素中最亮 RGB 颜色的亮度。发出的眩光颜色与发光像素的颜色相同。“范围”以像素为单位。眩光在发光像素处最强,并逐渐减弱至范围极限处为零。 - - TOPIC: 马赛克拼图 +image: mosaic1.png +image: mosaic2.jpg - 使用您所有图像制成的瓷砖来创建一幅马赛克拼图图像。 - 以像素为单位指定瓷砖尺寸(例如 36 x 24),然后按 [瓷砖]。系统会用您所有的图像(实际上为了提高速度使用的是缩略图)生成瓷砖。如果更改了瓷砖尺寸,请再次按 [瓷砖] 以重新生成瓷砖。瓷砖生成后,按 [图像] 即可使用这些瓷砖将当前图像转换为马赛克拼图。系统会通过将瓷砖的平均颜色与图像中该瓷砖位置的平均颜色进行匹配来选择瓷砖。如果可用图像有数千张,且颜色范围足够丰富,最终的马赛克拼图效果会相当好。放大图像的任意部分即可看到具体的瓷砖图像。 - “瓷砖混合”滑块会使图像与瓷砖混合,如果瓷砖颜色匹配欠佳,这样可以让效果看起来更好。如果混合比例低于大约 50%,瓷砖看起来几乎仍和之前一样清晰,因为人眼会补偿这种虚假的色调。 - 马赛克拼图生成后,您可以点击任意一块瓷砖以获取更大的弹出图像。如果打开的是已保存的马赛克拼图,点击瓷砖以查看更大图像的功能将不起作用。重新生成马赛克拼图的速度相当快,因此如果您希望弹出功能可用,请重新生成一次。 - - TOPIC: 添加噪点 +image: add-noise.png - 为图像添加随机彩色噪点。设置目标光斑大小 1-10 和噪点水平 0-100%。在 100% 时,会为每个像素的每个 RGB 值添加范围在 -127 到 +127 之间的随机噪点。平均值为零。超出 0-255 范围的溢出值会被截断。较大区域上的平均颜色会保持不变,噪点则叠加其上。您可以将“添加噪点”与“选择区域”或“绘制编辑”结合使用,为选定区域添加噪点。 - ^抑制“色带”现象 在亮度分布被“拉伸”的图像区域中,亮度和颜色接近均匀的区域可能会出现可见的“色带”现象。您可以通过为受影响区域添加噪点(或模糊)来减少这一问题。 - - TOPIC: 设置颜色 +image: set-colors1.jpg +image: set-colors2.jpg - 您可以减少图像中使用的颜色数量,以产生海报般的效果。可以分别设置每种 RGB 颜色,或调整颜色总数。此功能不使用颜色位深度。Fotocx 中的一些功能会使用位深度,将每种 RGB 颜色的可用颜色数限制为 2、4、8……而此功能在这方面不受限制。上方示例使用了 8 种红色、5 种绿色和 3 种蓝色。 - - TOPIC: 移色 +image: shift-colors.png - 此功能可用于校正颜色,或将图像转换为虚幻色彩。选择三种 RGB 颜色中的任意一种,并将滑块从中心向左或向右移动。另外两种颜色中的一种会以渐变方式替代该颜色。例如,您可以逐渐用绿色或蓝色替代红色。“全部”滑块会同时移动所有颜色。请先使用它找到一个初步的最佳效果,然后再分别调整各个 RGB 颜色。 - - TOPIC: 异色变换 +image: alien-colors2.jpg +image: alien-colors1.png - 用随机的异色重新绘制图像或选定区域。您可以控制大致的图案大小以及强度(从几乎不可见到十分显著)。按 [应用] 以获得新的颜色分布。 - - TOPIC: 自定义卷积核 +image: custom-kernel.png - 对图像应用自定义卷积核。其底层技术原理可参见维基百科的说明。输入卷积核大小、乘法系数和加法系数,并填写表格数值。[应用] 会将卷积核应用到图像上。[重置] 会恢复图像的原始状态。这些数值可以保存到文件中,以后通过 [保存] 和 [加载] 按钮再次调用。系统最初提供了几个卷积核示例文件。您可以修改这些文件,并以自定义名称保存。 - 数学原理:图像中每个 N×N 像素块的亮度值会与卷积核矩阵中对应的数值相乘并相加。将这个结果乘以乘法系数,再加上加法系数。最终得到的值将成为该 N×N 像素块中心处图像像素的新亮度水平。 - - TOPIC: 扭曲菜单 - - TOPIC: 展平弯曲 +image: unbend1.png +image: unbend2.jpg - 拍摄近处主体(通常是建筑物或室内房间)的全景图,可能会出现原本笔直的线条呈现弯曲,或建筑物看起来倾斜的情况。在全景图制作过程中,为了使各图像拼接在一起,必须对图像进行扭曲处理。之后如有需要,可使用“展平弯曲”功能来拉直全景图像。图像上会绘制垂直和水平的虚线,表示展平的坐标轴。在某条线末端附近点击或拖动鼠标即可移动该线。如果更改四个输入控件中的数值,图像会按相应四张示意图所示的方式进行扭曲。增大或减小数值并重复操作,直到满意为止。移动坐标轴可改变扭曲的中心位置。 - 另请参见 {图像扭曲},了解另一种校正图像弯曲和透视的方法。 - - TOPIC: 透视 +image: perspective2.jpg +image: perspective1.png - 此功能可用于拉直从偏移角度拍摄的照片。左侧图像是原始照片,为避免反光而从中心偏右处拍摄。右侧图像是拉直后的版本。此功能也可用于拉直从街道高度或侧面拍摄的高层建筑照片。 - 点击您想要变成矩形的四边形的四个角(在上述示例中,即画作或画框的四个角),然后选择 [应用]。所点击的角会用标有 “A、B、C、D” 的小白框标出。每个方框的左上角精确标记出图像位置。点击某个方框附近可将其移动到新位置。您可以使用键盘方向键以 1 像素为单位移动角标记。方向键作用于最后一次点击或移动的角。 - - TOPIC: 图像扭曲 +image: warps4.jpg - - TOPIC: 区域扭曲 此功能可用于在图像内部制造扭曲效果。您可以选择一个图像区域,并用鼠标拖动,使该区域相对于图像其余部分被拉伸。图像就像橡胶一样。如果鼠标拖动是从选定区域内部开始的,则该区域会在其当前边界内被扭曲——移动幅度在鼠标指针处最大,向区域边缘逐渐减小为零。如果鼠标拖动是从选定区域外部开始的,鼠标附近的区域边缘可以被拉出超过原来的区域边界。可以组合使用多次不同长度和方向的鼠标拖动,以达到所需效果。 - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - 此功能可用于校正透视问题。用鼠标从图像某个角附近拖动。图像会像弹性材料一样从这个角被拉伸,而其他角保持固定。 - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - 此功能可用于校正透视问题。用鼠标从图像内部拖动。图像内部会像弹性材料一样被拉伸,而边框保持固定。 - - TOPIC: 弯曲扭曲 此功能可用于校正透视问题(另见 {展平弯曲})。用鼠标从图像的任意位置拖动。整张图像都会朝鼠标方向被拉动或推动,但靠近鼠标的区域移动幅度会比较远的区域更大。您可以拉直弯曲的线条,也可以故意使图像弯曲。“扭曲跨度”控件决定了鼠标周围扭曲的半径。1.0 表示整张图像都会被扭曲,较小的值会将扭曲限制在鼠标周围更小的区域内。 - - TOPIC: 仿射扭曲 此功能可用于以有趣的方式扭曲图像。用鼠标从某个角或边拖动图像。这种变化是纯线性的,因此直线仍保持为直线。此变换被称为“仿射”变换。详情可通过网络搜索查阅。 - - TOPIC: 径向扭曲 +image: warp_radial.png - 添加或移除桶形或枕形畸变。桶形畸变常见于未经处理以消除此畸变的 RAW 图像中。用鼠标左键点击选择一个中心点,变化将以此为中心——通常是图像的中心,这也是默认设置。移动“拉伸”滑块以弯曲图像。 - - TOPIC: 展开特写 +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - 特写人脸照片经常会出现畸变,因为距相机更近的区域在照片中会显得比距离更远的区域更大。此功能可用于逆转这种畸变。请先使用 {选择区域} 选择人脸(无需精确)。在畸变中心附近点击图像(上方示例中为右脸颊)。移动滑块进行优化。 - - TOPIC: 制造波浪 +image: make-waves2.jpg +image: make-waves1.png - 此功能会将图像扭曲成波浪图案,仿佛透过湍急的水面观看一样。对话框允许您更改平均水平和垂直波长、振幅和方差。“透视”输入项可使波长从上到下逐渐变长。 - - TOPIC: 扭曲 +image: twist1.png +image: twist2.png - 此功能会围绕通过鼠标点击或拖动选定的某个点扭转图像。点击所需位置,并按所需程度移动“扭转”滑块。您也可以在图像上拖动鼠标来更改扭转的中心。“中心”滑块可使中心区域相对于其余部分反向扭转。“角度”滑块用于旋转图像。 - - TOPIC: 球体 +image: sphere2.jpg +image: sphere.png - 制作图像的球形投影。在图像上拖动鼠标可更改投影的中心(默认为中点)。“展平”控件可使投影效果从球形(右)逐渐过渡到平面图像(左)。“放大”滑块可将结果图像放大最多 2 倍。 - - TOPIC: 内外翻转 +image: inside-out2.jpg +image: inside-out1.png - 此功能会反转每个像素的中心-边缘距离。您可以点击或拖动鼠标来改变中心点。 - - TOPIC: 微缩星球 +image: tiny-planet.jpg - 将图像包裹成一个圆形。 如果图像是 360 度全景图,则不会有明显接缝。 • 中心孔:图像围绕一个中心孔进行包裹。 • 顶部裁切:从输入图像中移除顶部边距。 • 底部裁切:从输入图像中移除底部边距。 • 反转 R:垂直镜像输入图像。 • 反转 Theta:水平镜像输入图像。 • 旋转:围绕中心旋转输出图像。 - - TOPIC: 埃舍尔螺旋 +image: escher-spiral.png +image: escher-spiralA.png - 将图像转换为类似 M.C.埃舍尔那幅著名时钟画作中的无尽内向螺旋。“宽度”决定最外层的初始宽度。“边缘”决定分隔各层边框的初始宽度,“颜色”决定该边框的颜色。默认中心为图像的中心。点击图像可设置新的中心。 - - TOPIC: 展平照片 +image: flatten-photo1.png +image: flatten-photo2.jpg - ^书页或其他弯曲表面 展平拍摄在弯曲表面(例如圆柱形物体,或一本厚书打开后页面在书脊中间处向内弯曲)上的图像照片。曲面顶部和底部边缘的弯曲程度提供了所需弯曲量和拉伸量的信息,以使其看起来平坦。上方示例是一本厚书。其他圆形表面也可以进行校正,例如圆柱形物体上的海报。 - 选择“上边缘描摹”选项以描摹弯曲页面的上边缘。沿边缘用鼠标点击,每次点击处会生成一个标记点。当有 4 个点后,系统会通过这些点绘制一条曲线。可根据需要添加更多点并拖动这些点,使曲线更贴合图像中的弯曲边缘。选择“下边缘描摹”选项,用同样的方式描摹底部边缘。两条边缘都完成后,按 [flatten] 以展平页面。此时边缘应变得笔直(或足够笔直)。使用 [stretch] 滑块根据需要拉伸图像两侧,以补偿因弯曲造成的横向压缩。使用“加宽”控件根据需要加宽图像,以恢复正确的宽/高比例。[undo] 按钮会恢复未修改的图像,同时保留标记点,以便进行调整后重新尝试。 - +image: flatten-photo3.jpg - ^弯曲的地平线 广角全景图,或使用广角镜头拍摄的照片,地平线可能不笔直或不水平。可以通过沿地平线或其他需要对齐成一条直线的区域描摹一条曲线,来拉直(或以其他方式调整)图像。根据地平线(或图像的其他部分)主要位于图像中线上方还是下方,选择“上边缘描摹”或“下边缘描摹”选项。图像会被扭曲,使这条曲线变直。绘制一条曲线即可。另一条曲线会自动添加到图像相对的边缘(顶部或底部)。如果结果不理想,可使用 [undo] 按钮,调整任意一条曲线上的标记点,然后重试。您也可以先保存图像,再以该图像为起点第二次应用此功能。 - - TOPIC: 合成菜单 这些功能用于合成多个图像文件。在图像存在重叠的情况下,每张图像中相应的特征会被以单像素精度对齐重合。对齐时间通常为每张图像 10-30 秒。如果发现对齐过程出现问题,可以使用 Esc 键终止该过程。 - - TOPIC: HDR ^高动态范围 +image: HDR.jpg +image: HDR-adjust.png - 合成(叠加)同一主体、不同曝光级别的多张图像。合成后的图像可以在暗部和亮部区域都呈现出更好的细节可见度,实际上是在暗部区域使用较亮图像中的像素,在亮部区域使用较暗图像中的像素。如果在拍摄间隙手动调整相机,请注意保持相机水平并瞄准同一远处点。输入图像之间存在一定的对齐偏差是可以容忍的。如果人物或物体在拍摄间隙发生移动,重影是无法避免的。 - 选择 HDR 菜单功能,并选择最多 9 张图像({选择图像文件}),这些图像的像素尺寸必须几乎相同。图像会被自动对齐并合成。完成后,会显示合成图像以及一个用于调整的对话框。各输入图像的贡献度以一系列可编辑曲线显示。水平刻度代表像素亮度,从暗到亮。每条曲线代表一张对输出像素有贡献的图像。某一亮度水平下的图像贡献度,与该曲线在该水平处的高度成正比。最亮图像的初始曲线左侧高、右侧低,意味着对暗像素贡献大,对亮像素贡献小。最暗的图像则左侧低、右侧高,其余图像介于两者之间。可以用鼠标拖动曲线进行编辑。相应的图像贡献度也会随之改变,您可以在输出图像中实时看到结果。上方图像展示了两张输入图像及其输出图像。示例对话框展示了为优化三张输入图像而调整的三条曲线。 - - TOPIC: HDF ^高景深 合成(叠加)同一主体、对焦距离从近到远各不相同的多张照片。主体的不同部分会分别在各张图像中呈现清晰对焦。将这些图像合成,使主体的所有部分都清晰。 - 拍摄方法:为图像选定一个中心点。将相机对准一个近处物体,半按快门按钮以对该物体进行对焦。保持快门处于半按状态,将相机对准所选中心,然后拍照。接下来选择一个更远的物体,重复同样操作。以逐渐增大的对焦距离重复此过程。理想情况下,主体的每个部分至少会在一张照片中是清晰的。所有照片的相机位置应尽可能保持一致,如果主体距离很近,这可能会有一定难度。相机移动可能导致缩放和视差问题(近处物体相对远处物体发生偏移)。这类问题也许可以在之后用 Fotocx 修复,但可能需要花费不少时间。最好从一开始就避免这些问题。 - +image: HDF-paint.png - 处理照片:选择 HDF 菜单功能,并选择最多 9 张图像({选择图像文件})。系统会尽可能地将这些图像进行对齐。输出图像是各已对齐输入图像的均匀混合。系统会补偿拍摄间隙中少量的相机移动,但补偿能力有限,且完全不会补偿视差偏移。对齐完成后,会打开一个对话框。您可以选择任意一张输入图像,并用鼠标在输出图像的任意区域上“绘制”该图像。这会将正在绘制的区域从原始混合图像转换为单一选定的图像。对于图像中的每个区域或物体,请选择在该区域清晰的输入图像。画笔半径可以设置得更大或更小,以便您快速绘制大面积区域,并在需要时精细控制细节。如果存在重叠的近处和远处物体,需要花费时间和耐心才能使它们都变清晰。可以通过在对话框中选择“扭曲”选项来修正对齐偏差。此时可用鼠标拖动和扭曲底层图像,合成后的输出图像会相应发生变化。扭曲效果仅限于鼠标周围区域。当拖动一个已绘制的区域时,相应的输入图像会自动被选中并拖动,而用其他图像绘制的区域保持不变。尚未被绘制过的区域无法被拖动。在不同区域间移动,逐步拖动,直到所有部分都对齐为止。 - 建议工作流程:使用绘制模式,依次选择每张图像,并绘制该图像中看起来清晰的所有区域。任何未对齐良好的边界都会明显表现为图像特征边缘处的错位。其中一些错位可以通过更换用于绘制的图像来变得不那么重要(如果有多张图像在该处都足够清晰)。使用扭曲模式,根据需要进行微调,以消除可见的错位。 - - TOPIC: 堆叠/绘画 +image: stack-paint.png - +image: stack-paint2.jpg - 堆叠(叠加)同一主体在不同时间拍摄的多张照片。移除拍摄间隙中出现又离开的游客和车辆。 - 拍摄方法:将相机对准同一个远处的点,在游客或车辆经过主体前方时拍摄多张照片。尽量为主体中未被临时物体遮挡的每个区域获取两张或更多照片。保持相机稳定并瞄准同一点,以便图像能够精确对齐。 - 处理照片:选择“堆叠/绘画”菜单功能,并选择最多 9 张图像({选择图像文件})。系统会尽可能地将这些图像进行对齐。输出图像(左下方)是各已对齐输入图像(顶部一行)的均匀混合。对齐完成后,会启动上方所示的对话框。您可以选择任意一张输入图像,并用鼠标在输出图像的任意区域上“绘制”。所选择的单张图像将用于正在绘制的区域。对于图像中的每个区域,请选择一张没有临时物体的输入图像。画笔半径可以设置得更大或更小,以便您快速绘制大面积区域,并在需要时精细控制细节。 - 自动操作:按 [隐藏] 按钮,查看是否可以自动移除临时物体。这适用于图像中存在多张未被遮挡背景照片的区域(左下中间图像)。要显示所有临时物体,请按 [显示] 按钮(右下方图像)。此功能通常有效,但并不完美。轻微的图像错位或光照差异(尤其是移动的阴影)可能导致算法选中前景像素而非背景像素。您可以使用上文所述的绘制方法手动修正这些错误。 - - TOPIC: 堆叠/噪点 +image: stack-noise2.jpg +image: stack-noise.png - 此功能会合成同一主体的 2-9 张照片。这些照片应该几乎相同,只是由于手持相机而产生的微小偏移。如果照片是在非常高的 ISO 设置(弱光条件)下拍摄的,像素会有相当明显的噪点。通过拍摄多张照片并对其取平均值,可以基本消除噪点。 - 处理照片:选择“堆叠/噪点”功能,并选择最多 9 张图像({选择图像文件})。系统会自动将它们合成并显示,并打开一个对话框。初始输出图像是所有选定输入图像的合成,取平均值。这意味着每个输出像素的 RGB 值是对应输入像素 RGB 值的平均值。“中值”按钮会将输出像素改为输入像素的中值(根据图像数量的不同,会取 1-3 个居中的 RGB 值求平均)。这种方法可能更好,也可能不然,请来回切换以进行比较。“忽略低值像素”和“忽略高值像素”复选框会在取平均值之前,丢弃最低和最高的 RGB 输入值。这有助于从混合结果中去除噪点尖峰。如果选择了中值方法,此选项不起作用。 - - TOPIC: 堆叠/图层 +image: stack-layers.png - 使用此功能可以合成一张图像的不同已编辑版本,您可以决定在选定的图像区域中显示哪个版本。可以合成任意具有相同像素尺寸的图像。 - 选择最多 9 张尺寸相同的图像。初始输出图像是所有输入图像的等比例混合。“图像比例”是各混合图像的相对权重。可以调整这些值来改变每张图像的权重。示例:如果 3 张图像以 3、5、7 的相对权重合成,那么合成图像中 3/15 来自图像 #1,5/15 来自图像 #2,7/15 来自图像 #3。如果选择了“绘制整个图像”选项,可以调整权重,输出图像会立即响应。如果选择了“在鼠标范围内绘制”选项,则可以拖动鼠标,此时只有鼠标圆圈内的区域会使用当前生效的图像比例进行绘制。绘制速度由鼠标中心和边缘的“强度”设置控制。使用较小的数值可实现渐进式绘制。 - - TOPIC: 全景图 +image: pano-align1.jpg +image: pano-align2.jpg - 此功能可将 2-6 张图像拼接在一起,制作成一张广角图像或全景图。图像之间必须重叠 10% 以上,程序才能找到它们的匹配区域并将它们拼接在一起。首先选择 2-6 个图像文件({选择图像文件})。建议按从左到右的顺序选择图像,以便更容易进行初步的粗略对齐。图像最初会被拼接在一起并显示,带有一个小的透明重叠区域。系统会弹出一个预对齐对话框(如上),要求您将图像拖动到大致对齐的位置。将图像拖动到正确的从左到右的顺序。被拖动的图像可能会与其他图像重叠。为了明确知道正在拖动的是哪张图像,请从图像中心附近开始拖动。图像顺序正确后,将每张图像与其左侧相邻图像对齐。最好按从左到右的顺序进行。先水平和垂直移动某张图像,使其与左侧相邻图像大致对齐,然后如有需要,通过向左或向右拖动图像底边来旋转图像——图像会围绕其与左侧图像重叠区域的中点旋转。最快的方法是先对齐重叠区域的中间部分,然后如有需要旋转右侧图像,使重叠区域的上部和下部也对齐。不需要极高的精确度。图像的弯曲程度应正确,且应能较好地拼合在一起。如果不能,则需要调整“镜头 mm”(焦距,35mm 等效值)。图像的弯曲程度会随焦距的调整而变化。初始值会根据 EXIF metadata(如果可用)获取,通常已经足够准确。如果图像没有弯曲(例如扫描图像),请勾选“无弯曲”复选框,将“镜头 mm”实际上设置为无穷大。 - 如果任意一张图像被裁剪过,依赖 EXIF 焦距的计算就无法正常工作。您可以尝试通过增大“lens_mm”中的焦距值来进行补偿。 - “手动对齐”复选框会将手动预对齐结果作为最终对齐结果。这适用于没有明显特征可用于对齐图像的情况。此选项也允许图像之间零重叠。 - 预对齐完成后按 [proceed],程序将进行精细对齐并拼接图像。在内部,程序会对图像进行平移和旋转,并评估匹配程度。这个过程会以逐渐增大的图像尺寸进行,直到找到最佳对齐效果。根据 CPU 速度和图像大小的不同,这可能需要一分钟或更长时间。如果将输入图像缩小到 2/3 或 1/2 大小,可以大幅加快处理速度。如果因内存不足导致处理失败,也应这样做。 - +image: pano-adjust.jpg - 精细对齐完成后,会显示合成图像。系统会启动上方所示的对话框,用于精细调整亮度。如果各图像亮度不一致,您可能会看到图像之间存在边界。使用顶部的单选按钮选择一张图像。反复按 [自动颜色] 按钮,可自动改善各图像的亮度/颜色匹配。基准图像是当前选中的那一张。请尝试不同的基准图像,看看哪一个效果最好。如果图像亮度差异很大,请选择差异最大的那张图像,使用亮度控件将其亮度调整为与其他图像匹配,然后再按 [自动颜色]。匹配效果不需要非常精确,因为“混合宽度”(见下文)会掩盖剩余的差异。使用“文件颜色”按钮可将亮度水平从输入图像文件重置。 - “混合宽度”控件决定图像之间的混合方式:在图像重叠处,亮度会在这么多像素范围内发生变化,以掩盖无法完全修正的不平衡。默认值为 1 像素,这会使任何亮度差异都变得明显。 - 如果图像未能完美对齐,您也许可以用鼠标将图像推向对齐位置,从而改善对齐效果。选择“鼠标扭曲”,并用单选按钮选择其中一张图像。然后沿该图像应与相邻图像对齐的边缘拖动鼠标,将图像移动到对齐位置。图像会在鼠标周围局部移动,而较远的部分保持固定。存在视差偏移的图像需要做出一定折中,因为不可能同时使前景和背景都保持对齐。 - “展平图像”控件可用于“展平弯曲”图像,从而拉直弯曲的线条(例如弯曲的建筑物)。值为零表示无效果,值为 1.0 表示完全展平图像。 - 完成后,可使用 {展平弯曲}、{图像扭曲}、{裁剪} 等功能进行最终调整。 - ^扫描图像 如果重叠部分足够,可以合成扫描图像。由于没有弯曲,请勾选“无弯曲”。 - ^自动扭曲 在对齐过程中,图像会朝各个方向进行轻微扭曲,以找到最佳匹配。这是为了补偿相机地平线偏移或旋转所导致的图像畸变,这些畸变会降低拼合质量。如果两张图像的重叠区域中包含一个在两次拍摄之间移动过的大物体,对齐过程可能会为了匹配图像而出现异常,导致对齐效果很差。通过选择“无自动扭曲”,您也许能使对齐成功,或减小误差。另一个选项是选择手动对齐。 - ^合成全景图 您可以一次性制作最多包含 6 张图像的全景图。您也可以合成两侧能够拼接在一起的全景图,例如将一张 4 图全景图与另一张 4 图全景图合成为一张 8 图全景图。合成全景图时,必须停止常规的图像弯曲处理,因为全景图像已经是弯曲的(假设您在最终的全景对话框中没有使用“展平”选项)。可通过在预对齐对话框中勾选“无弯曲”来停止图像弯曲。 - ^全景图的局限性 包含近处物体的全景图可能会比较棘手:拍摄照片时,请注意围绕穿过镜头的轴线转动相机,尽量减少横向移动,否则由于前景物体相对背景发生偏移(视差),图像可能无法很好地对齐。当主体距离在 50 米以上时,这不是问题,因为微小的横向移动对图像影响很小。保持相机水平,以避免出现较大的垂直偏移(地平线偏移),这可能导致无法完全修正的图像畸变。出于同样的原因,也应避免旋转相机。 - ^垂直全景图 可以通过将输入图像旋转 90° 来实现。在“全景图”中,按从上到下的顺序选择图像,使顶部图像位于左侧,底部图像位于右侧。正常制作全景图。然后旋转输出图像,使左侧变为顶部。 - - TOPIC: 显示 CIM 文件 在弹出窗口中显示当前或最新合成图像所使用的输入文件。系统只会记住当前或最新的一组文件。 - - TOPIC: Mashup +image: mashup.jpg - 在一个版面中排列多张图像和文本。可以通过用鼠标拖动来添加、调整大小、旋转和移动图像。图像可以整体或在选定区域内变为完全或部分透明。可以添加、移动、调整大小和旋转文本。可以指定文本属性:字体、大小、颜色、轮廓、阴影、透明度。可以添加线条和箭头。此处的示例展示了部分可能的效果。 - +image: mashup1.png - 在第一个 Mashup 对话框中,选择一个背景或版面图像,其他图像将被放置在其上。可以选择一张现有图像,或创建一张具有指定大小和颜色的新单色图像。您也可以打开之前保存的 Mashup 项目并继续编辑。 - +image: mashup2.png - 第二个 Mashup 对话框提供以下选择:编辑图像、编辑文本、编辑线条和箭头、放大到更大尺寸、保存已完成的合成图像(完成),或放弃该图像(取消)。前三个选项会分别进入相应的编辑对话框。完成后,这些对话框都会返回到此对话框,因此您可以按任意顺序添加或修改图像、文本以及线条/箭头。“放大”功能在下文说明。 - +image: mashup3.jpg - 使用此对话框在版面中选择并放置图像,并修改它们的外观:大小、旋转、位置、透明度。一张图像可以整体或在指定区域内部分或完全透明。这意味着背景图像或被叠加的图像可以透过透明区域显示出来。“添加图像”按钮会进入一个图库文件选择对话框({选择图像文件})。选定的图像会被放置在版面中。添加图像后,点击任意图像即可将其选中以进行修改。从图像中间拖动可在版面中调整该图像的位置。拖动右下角可调整图像大小。使用对话框控件来调整图像。对话框控件作用于最后添加、点击或拖动的图像。“上一个”和“下一个”按钮可依次循环切换各图像,并使所选图像闪烁提示。当图像相互重叠、难以通过点击选中所需图像时,可以使用此功能。“缩放比例”用于缩放图像。“角度”用于旋转图像。“堆叠顺序”按钮可将某张图像相对于其他图像升高或降低层级——这决定了在重叠部分哪张图像位于上方。“基础透明度”用于使整张图像部分透明。[绘画] 按钮用于借助下方所示的“绘制”对话框,使图像的任意部分部分或完全透明。[扭曲] 按钮用于借助下方所示的“扭曲”对话框,弯曲或扭曲图像。“黑色边距”复选框可用于移除其他编辑功能(例如扭曲)留下的黑色边距,这些边距会被设为透明。“图像已固定”按钮可防止图像被鼠标或键盘移动,这在对图像进行精细对齐、需要防止意外移动时很有帮助。“边距”控件可用于使图像边缘变透明。“硬边距”会直接切掉图像边缘。“混合边距”会使边缘部分透明,以便将其与背景或其他重叠图像混合。 - +image: mashup4.png - 为选定的图像区域“绘制”更多或更少的透明度。点击某张图像以选中它。鼠标指针是一个圆圈,表示作用范围。使用“半径”调整其大小。用鼠标左键在图像上拖动,可使圆圈覆盖的区域变透明。用右键拖动可使其变为不透明。如果勾选了“渐进”,透明度会随鼠标拖动缓慢变化。为鼠标中心和边缘指定一个强度值,以调节变化速率。 - +image: mashup5.png - “扭曲”对话框用于扭曲图像。点击某张图像以选中它。用鼠标拖动图像——图像会朝鼠标方向局部弯曲或拉伸(就像一张橡胶片)。扭曲区域的大致范围由“扭曲跨度”给出,这是图像大小的一个分数值。每次拖动都是在之前步骤基础上叠加的一个步骤。最近的步骤可以用 [undo last] 撤销,而未弯曲的图像可以用 [undo all] 恢复。 - +image: mashup6.png - “编辑文本”对话框用于在版面上放置文本。输入一些文字并按 [应用]。系统会要求您点击版面中要添加文本的位置。将其拖动到合适位置,然后使用对话框控件设置字体、大小、颜色、角度、背景颜色、轮廓大小和颜色、阴影大小和颜色,以及以上各项各自的透明度。您可以随时将文本拖动到新位置。点击任意已有文本,即可在对话框中显示其属性并进行修改。点击某段文本并按 Delete 可将其移除。编辑完成后,按 [OK] 返回第二个 Mashup 对话框。 - +image: mashup7.png - “编辑线条/箭头”对话框用于在版面上放置线条或箭头。其操作方式与添加文本非常相似。输入长度和宽度,然后按 [添加]。系统会要求您点击版面中要添加线条的位置。系统会在版面上放置一条线,如果勾选了某个箭头样式选项,则会放置一个箭头。将该线条/箭头拖动到所需位置。使用对话框调整长度、宽度、角度和属性(背景、轮廓、阴影)。您也可以拖动线条/箭头的任意一端,以设置该端的位置,而保持另一端不变。 - 您可以使用鼠标在版面中移动和调整对象大小: • 点击对象以选中它——它会闪烁以确认已被选中。 • 从大致中心处拖动以定位该对象。 • 拖动右下角以调整对象大小。 • 对于线条/箭头,拖动任意一端可只移动该端。 - 也可以使用键盘方向键,以 1 像素为单位移动当前选中的对象。 - 您可以添加由 {选择区域} 保存的图像。在“编辑图像”对话框中,按 [添加] 启动文件选择对话框。使用图库窗口中的 [顶部] 按钮,选择 “saved_areas”。打开其中任意 .png 图像。系统会使用原始的区域轮廓,区域混合功能也会基于这些边缘进行。 - ^Mashup 项目文件 您可以保存一个项目,稍后打开继续编辑。Mashup 项目会使用这些图像以及保存在项目文件中的一些数据(图像和文本位置、缩放比例、透明度等)重新构建。 - ^Mashup 缩放 处理非常大的版面(超过 2000 万像素)可能会相当缓慢。拖动一张较大的叠加图像可能会显得缓慢且不流畅。如果您使用较小的版面来构建项目,完成后再将其放大,工作速度会快得多。最终图像不会损失分辨率,因为叠加图像和文本都是根据输入内容重新生成的。“缩放”按钮可让您将项目放大 2 倍、3 倍或 4 倍。系统还提供一个重置选项,用于恢复原始的较小项目尺寸。使用这种方法,您可以先使用 1000 万像素的版面进行工作,完成后再将其放大到 1.6 亿像素。放大后的版面之后仍可直接继续编辑,但速度会较慢。 - - TOPIC: 图像阵列 +image: image-array.jpg - 选择多张图像,将它们拼接成一个带彩色边框的紧凑阵列格式。 - 第一个对话框显示在左上方。“背景颜色”是外框及所含图像之间间隔的颜色。“阵列宽度”是输出阵列的总宽度,“边距”是围绕所有图像的外边距宽度。阵列的高度取决于所选图像文件的数量以及将它们放入框架所需的空间。“图像列数”指定图像的列数(上方示例中为 6)。行数取决于所选图像文件的数量。“间距”值设置所含图像之间的水平和垂直间距。 - 选择图像文件({选择图像文件}),完成后按 [继续]。生成结果图像只需几秒钟(对于数百张图像可能需要几分钟)。如上方右上图所示,这张图像通常底部边距会很不均匀。阵列中图像的排列顺序由选择顺序决定。首先从左到右填满顶部一行,然后是第二行,依此类推。 - “优化”对话框会自动启动。它可以重新排列图像,使底部边距更加均匀。按 [开始] 并等待图像完成优化。您可以观察进度。如果找到一个能使底部边距误差在 2 像素以内的最佳方案,该功能会自动退出。如果未能达到此目标,它可能会无限期地继续搜索。按 [停止] 可强制优化功能退出并采用目前找到的最佳方案。如果优化成功,您将得到如右下图所示的均匀列。如果优化后底部边缘仍然不均匀,系统会询问您是否要为部分图像添加边距,以使底部边缘变得均匀。这样做会使底部边缘变得均匀,但垂直间距将不再相等。 - 提示:如果每列至少有 4 张图像(越多越好),优化效果会最好。这样可以给优化算法足够的灵活性,找到底部边缘均匀的解决方案。 - 最后会出现左下方所示的对话框。此时您必须为您的阵列指定一个文件名。系统会启动一个文件保存对话框,您可以将新的阵列文件保存到任意位置。如果选择了“复制 metadata”选项,metadata 会从所选输入文件复制到输出文件。如果这些图像是已编辑的版本,而您希望阵列中包含最后一个版本(或任意版本)的编辑历史,这会很有用。 - - TOPIC: 批量菜单 这些功能用于处理多个选定的图像文件,可以是少量几个,也可以是成千上万个。可以在处理过程中使用 Esc 键取消这些功能,但这会导致部分文件已处理、部分未处理。弹出报告会在处理过程中显示各文件名。 - - TOPIC: 批量转换 +image: batch-convert.jpg - 此功能用于对多个图像文件进行重命名、转换、缩放和移动。RAW 文件也可以转换为图像文件。此功能以多个并行线程运行,以获得最快速度。 - ^对话框输入项 • 选择文件 - 要转换的文件({选择图像文件})。 • 替换文本 - 替换文件名中的文本(见下文)。 • 新名称 - 可选的新名称,插入文本(见下文)。 • 序列号 - 输出文件名的基础编号和增量。 • 新位置 - 输出文件的可选新文件夹位置。 • 新类型 - 输出文件的文件类型,或“不更改”。 • 颜色深度 - 为 tif 或 png 输出指定 8 位或 16 位。 • 最大宽度、高度 - 输出文件的可选限制 (仅在勾选了缩小或放大时使用) • 缩放 - 输出文件的可选缩放系数 • 删除原始文件 - 转换成功后删除输入文件。 • 复制 METADATA - 将所有 metadata 复制到输出文件。 • 更新相册 - 用转换后的输出文件替换相册中的文件 - ^替换文本 如果在此处输入了文本,系统会在文件名中搜索该文本,如果找到,则会用指定的替换文本进行替代。替换文本的长度可以不同,也可以为空,此时该文本会从文件名中被移除。 - ^新名称与插件 新文件名中可以插入文本:拍摄日期(来自 EXIF metadata)、序列号,或原始文件名。按以下方式指定插入内容及位置: • $oldname - 在此处插入原始文件名 • $sss - 在此处插入一个递增的序列号。见下文。 • $yyyy $mm $dd - 在这些位置插入拍摄日期。 - 示例:San Francisco $yyyy:$mm:$dd $oldname $sss 输入文件 "Golden Gate Bridge.jpg",拍摄日期为 2014 年 5 月 12 日,将转换为输出文件名 "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg"。 - 对于 “$sss”,请使用 “s” 字符的数量来指定该字段的长度,例如 “$ss” 足以表示最大为 99 的序列号。位数不足的序列号前面会补零。如果序列号超出指定长度,则会按需要的长度显示。请注意,图库中的文件名排序严格按照 ASCII 顺序排列,因此数字序列 1、2……9、10 会按 1、10、2……9 的顺序排序。您可以通过指定字段长度为 2($ss)来保持数字顺序,得到序列 01、02……09、10。 - 必须存在 “$oldname” 或 “$sss” 中的至少一个,以确保输出文件名是唯一的。如果未指定或未更改“新位置”,“删除原始文件”选项将被忽略。如果输出文件已存在,则不会转换该输入文件。 - ^最大宽度和高度 如果勾选了“缩小”和/或“放大”,输出文件将在保持原始宽/高比例的情况下,被调整到这些限制范围内。如果勾选了“缩小”,超过这些限制的文件将被缩小以符合限制。如果勾选了“放大”,小于这些限制的文件将被放大,使宽度或高度之一达到相应的限制值。此选项不能与“缩放”选项同时使用。 - ^缩放 如果勾选了其中一个按钮,输出文件将按所选系数进行缩放。此选项不能与“最大宽度和高度”选项同时使用。 - ^删除原始文件 如果勾选,输入文件将被删除,但仅在输出文件成功创建之后才会删除。 - ^复制 METADATA 所有 metadata 都会从输入文件复制到输出文件。取消勾选此选项可移除 metadata。 - ^更新相册 如果勾选,所有包含任意输入文件的相册都会更新为转换后的输出文件。 - ^保留文件顺序 如果您指定了前导序列号($sss),输入文件的选择顺序将在输出位置中得到保留。因此,您可以按所需顺序选择图像文件,或从图像已排序的相册中进行选择,并在输出中保留这一顺序。 - - TOPIC: 批量复制/移动 将选定图像文件复制或移动到新位置。从 Fotocx 已知的任意文件夹中选择输入文件({选择图像文件})。如果选择了“删除原始文件”,输入文件在成功移动到新文件夹后将被删除。在这种情况下,任何引用了这些(现已删除)输入文件的相册都会更新为新的文件位置。 - - TOPIC: 批量校正 此功能用于校正已旋转或翻转(镜像)的图像文件。它依赖 EXIF 数据来判断文件是否旋转/翻转以及方向如何。它比“批量转换”快得多。您可以直接选择所有候选文件,让系统自行找出需要修正的文件。在性能较强的计算机上,搜索速度约为每分钟 3000 个图像文件。有两种方式可以指定要搜索的文件。[选择文件] 按钮会进入图库文件选择对话框({选择图像文件})。如果勾选了“检查所有文件”,将搜索您顶层文件夹下的所有图像文件。 - - TOPIC: 批量删除/回收 选择文件({选择图像文件})。选择选项:删除或移至回收站。[继续]。文件在被删除或移至回收站时,会在弹出报告中列出。所有文件删除/回收完成后,系统会扫描相册并移除已删除的文件。 - - TOPIC: 批量叠加 +image: batch-overlay.png - 可以在选定的输入图像上的指定位置添加一张小型叠加图像。这可用于在图像上方添加署名、版权信息等。 - 按以下方式准备叠加图像:使用“空白图像”创建一张用于承载文字的基础图像。缩放比例无关紧要,因此可以制作得比实际需要的更大。使用“绘制透明度”将整张基础图像绘制为透明。使用 {标注} > 绘制文本,在基础图像上添加所需文字,并按需设置字体、颜色及其他属性。将文字缩放到占据基础图像的大部分区域。基础图像(背景)是透明的。如有需要,使用 {裁剪} 移除多余的边距。保存最终图像。一个便利的存放位置是 /saved_areas,但也可以使用任意文件夹。此图像现在可用作“批量叠加”的叠加图像。 - 使用 ^选择主图像文件^ 按钮选择要接收叠加图像的主图像文件。使用 ^选择叠加文件^ 按钮选择叠加图像文件。 - 两个 ^叠加位置^ 输入项决定叠加图像在主图像上的放置位置,分别为从上到下距离的 1-99%,以及从左到右距离的 1-99%。0/0 表示左上角,99/99 表示右下角。系统会确保叠加图像的位置不会超出主图像的边缘。 - 以主图像宽度的百分比形式指定 ^叠加宽度^。高度会自动设置以保持宽/高比例。如果勾选了 ^使宽度与窗口大小一致^,叠加图像的视觉大小将针对下方指定的窗口大小保持恒定。如果不勾选此项,一张“高”图像在显示时左右会有较大边距,其叠加图像在视觉上会显得更小。初始窗口大小为当前窗口。您可以输入任意大小。如果窗口大小已发生变化,按 ^刷新^ 以设置为当前窗口大小。 - 如果选择了 ^替换主文件^,输入的主文件将被替换为已添加叠加图像的输出主文件。如果选择了 ^制作新版本^,则会为输入的主文件创建新版本。 - - TOPIC: 批量keywords +image: batch-keywords.jpg - 一次性为大量图像文件添加、移除或更改 keywords。 - 使用 [select files] 按钮选择图像文件({选择图像文件})。 - 该对话框显示两个 keyword 列表:要添加到选定文件的 keywords,以及要移除的 keywords。可用的 keywords 显示在下方的“已定义 Keywords”窗口中。点击其中之一,即可将其添加到当前选中的 keyword 列表(添加或移除)中。点击某个 keyword 列表中的某个词,即可将其从该列表中删除。要替换 keywords,请在“添加 keywords”列表中指定新的 keywords,并在“移除 keywords”列表中指定旧的 keywords。 - 如果已定义 keywords 的列表很长,直接在“输入新 keyword”中键入所需的 keyword 可能更方便。与您目前输入内容相匹配的现有 keywords 会显示在“匹配 keywords”中,您可以点选其中之一,将该 keyword 添加到图像中。如果输入的 keyword 是新的(没有显示匹配的 keyword),在输入完成后按 [添加]。它会被添加到所选 keyword 列表中,并加入类别为 “nocatg” 的已定义 keyword 列表中。 - 如果您正在使用 keyword 类别,可以选择一个类别,这样已定义 keywords 列表中就只会显示该类别下的 keywords。如果您的 keywords 列表非常庞大,这可以将列表缩减到便于点选的规模。 - 要获取包含您想要移除或替换的特定 keywords 的图像列表,请使用 {搜索图像} 查找这些图像,然后启动此功能,使用 [select files] 添加您刚找到的所有图像文件,或选择其中的任意子集。 - - TOPIC: 批量重命名keywords +image: batch-rename-keywords.png - 重命名任意数量的 keywords,并将这些更改应用到您的整个图像收藏。从已定义 keywords 列表中点击要重命名的 keyword,在“重命名为”框中输入新名称,然后点击箭头按钮,将这对名称添加到右侧的列表中。对每个要重命名的 keyword 重复此操作。点击列表中的名称对可将其移除。完成后按 [继续]。如果您想删除某个 keyword 而不重命名它,请将新名称设为 “delete”。 - 弹出窗口会显示受影响 keyword 名称所涉及的图像文件数量。按 [是] 继续。在性能较强的计算机上,更新速度约为每分钟 500 个。下次启动 Fotocx 时,索引文件功能会为这些相同的图像更新所有缩略图,因为文件修改日期已发生变化。 - - TOPIC: 批量清除keywords +image: batch-purge-keywords.jpg - 从所有图像文件中清除(删除)不需要的 keywords。这对于清除从下载的图像文件中带入的不需要的 keywords 特别有用。点击对话框左侧不需要的 keywords,将它们添加到对话框右侧的清除列表中。完成后按 [proceed]。 - - TOPIC: 批量拍摄日期 +image: batch-photo-date1.png +image: batch-photo-date2.png - 快速修正一批没有拍摄日期/时间,或日期/时间不正确的照片。使用 [select files] 按钮打开图库窗口,选择要处理的图像文件({选择图像文件})。 - 有两种方式可以更改拍摄日期/时间: • 设置新的日期/时间(上方右侧图像):仅输入年份(yyyy)——文件中只有年份会被替换。仅输入日期(yyyy:mm:dd)——日期会被替换,但时间不变。输入完整的日期/时间(yyyy:mm:dd hh:mm:ss)——两者都会被替换。 • 调整现有的日期/时间(左侧图像):在 6 个字段(年、月、日、时、分、秒)中的任意一个输入 + 或 - 数值。日期/时间将按输入的数值进行调整。 - 调整后的日期/时间数值在必要时会向上一级进位: 时间 08:30 调整 -50 分钟,结果为 07:40 日期 2016-10-20 调整 +6 个月 -30 天,结果为 2017-03-21 (3 月有 31 天)。 - 如果勾选了“测试”复选框,系统会生成一份报告,显示所选文件调整前后的日期/时间,供检查之用。不会对文件做任何实际更改。如果您确认结果正确,请取消勾选该复选框并再次运行,以更新文件。 - - TOPIC: 批量更改 metadata +image: batch-change-meta.png - 修订多个图像文件的 metadata。您可以添加新的 metadata、修订现有 metadata,以及删除 metadata。使用 [select files] 按钮打开图库窗口,从中选择要处理的文件({选择图像文件})。输入要指定的 metadata 标签名称和值,或将值留空以删除该标签。按 [应用]。系统会显示一条确认信息,此时您可以选择继续或取消。左侧提供了一份常用标签名称列表。点击其中之一,即可将其插入对话框中第一个空的标签名称字段。此列表来自文件 /metadata_picklist,您可以编辑该文件以向列表中添加其他标签。[完整列表] 按钮提供了获取所有可用标签名称列表的方法。 - - TOPIC: 批量报告 metadata +image: add-meta-tags.png +image: batch-report-meta.png - 报告任意数量图像的任意 metadata。输出为一个文本文件,会在您系统的默认文本编辑器中显示。您可以使用文本编辑器的搜索功能查找具有所需 metadata 的图像,也可以将该文本文件作为其他程序的输入。使用 [select files] 按钮打开图库窗口,选择要处理的文件({选择图像文件})。[编辑] 按钮会打开一个新对话框(右侧),您可以在其中选择要报告的 metadata 标签。点击左侧栏中的标签可将其添加到右侧栏和报告中。点击右侧栏中的标签可将其移除。点击左侧栏中的最后一个标签 “其他标签……”,可输入任何未出现在列表中的标签名称,该列表仅包含最可能需要的标签。 - - TOPIC: 批量地理标记 +image: batch-geotags.png - 选择多张图像,为它们全部添加相同的位置数据。使用 [select files] 按钮从图库窗口中选择图像文件({选择图像文件})。然后按照 {编辑主 metadata} 中所述的方法获取位置数据,使用 [查找] 按钮或点击地图标记。此功能也可用于修正位置拼写或 latitude/longitude 数据的不一致之处。如果位置和/或国家留空,它们将不会被更新。要清除位置或国家,请输入名称 “null”。如果 latitude 和 longitude 留空,它们将不会被更新。要清除 latitude 和 longitude,请将两个值都输入为 “0”。您可以只更新位置/国家,只更新 latitude/longitude,或者两者都更新。实际操作中,您可能会发现相机 GPS 插入了 latitude 和 longitude,却没有位置和国家,或者使用了不需要的语言,或全部使用大写字母,或存在其他需要修复的值。 - - TOPIC: 导出文件 将选定的图像文件复制到另一个文件夹。此功能的设计用途是复制文件以便与他人共享,例如上传文件到网站。输出文件为 JPEG 格式。您可以选择缩小图像尺寸。通过点击图库缩略图来选择图像文件({选择图像文件})。选择一个文件夹,图像文件将被复制到该文件夹中。如果选择了“导出 metadata”,还会复制一组有限的 metadata。这些包括:拍摄日期、keywords、版权、标题、描述。 - - TOPIC: 工具菜单 - - TOPIC: 索引文件 +image: index-files1.png - Fotocx 需要了解您所有图像文件所在的文件夹和文件名,以及内嵌的 metadata(日期、标签、geotags、标题、描述、评分)。这些数据会被索引以实现快速搜索。Fotocx 还会创建缩略图,以便图库窗口(缩略图页面)能够快速显示。Fotocx 不会修改或复制您的图像文件。所需空间通常为您图像文件空间的 2%。 - 每次启动 Fotocx 时都会运行“索引文件”功能。此功能会创建缺失的缩略图,替换过时的缩略图,并使用图像文件中的最新数据刷新 metadata 索引。如果您有成千上万个新文件,这可能需要相当长的时间。 - 在 Fotocx 内部修改或移动的图像文件会被自动处理。“索引”功能仅用于处理从 Fotocx 外部新建的图像文件(例如新添加了一批照片),以及从 Fotocx 外部修改或移动过的文件。 - 输入您的顶层图像文件夹(例如 /home//Pictures)。使用 [浏览] 按钮定位并添加文件夹。这些文件夹及其包含的所有子文件夹都会被处理。即使其中混有其他非图像文件也没有关系。点击对应的 “X” 可删除某个条目。 - 输入将用于存放缩略图文件的缩略图文件夹。可使用提供的默认位置,或设置您自己的位置。 - 如果您使用文件夹或文件名对图像进行了分类,可以立即在 {搜索图像} 功能中利用这些信息。如果您在图像 metadata 中保存了日期、keywords、geotags、标题或评分,这些也都可以被搜索。图像索引完成后,按以上任意方式搜索几乎都是瞬间完成的。 - ^METADATA 标签 默认情况下,图像索引中会包含以下 metadata: • 文件夹和文件名 • 拍摄日期/时间 • 文件修改日期/时间 • 标题和描述(EXIF metadata) • 评分(0-5 星) • keywords(用户标签) • geotags(国家和位置名称以及 latitude/longitude) • 相机:品牌、型号、镜头 • 曝光:时间、光圈值、焦距、ISO - ^额外的 METADATA 标签 +image: index-files2.png - 您最多可以向图像文件索引中添加 20 个其他 metadata 标签。此列表中的 metadata 可以像标准标签一样快速搜索。您可能不需要这个功能,但如果您有时需要搜索非标准的 metadata 标签,可以在此处添加它们,搜索速度将几乎是瞬间完成的。按“额外 metadata”的 [select] 按钮以打开上方对话框。点击左侧列表中的标签,将它们添加到右侧列表——即要添加到索引中的标签。点击右侧列表中的标签可将其移除。按 [done] 提交更改。您的整个图像收藏将被重新索引。由于缩略图不会被重新创建,这个过程会比初次索引更快。 - ^访问未索引的文件和文件夹 未索引的图像文件或文件夹,是指未包含在您所声明的顶层图像文件夹之内的文件或文件夹(您所声明的图像文件夹的子文件夹始终会被包含在内)。您可以导航到这样的文件夹并正常查看缩略图,也可以正常查看和编辑这些文件。但您应了解以下限制: • 这些文件不会出现在任何搜索结果和地图视图中。 • 缩略图会在查看时才创建——图库显示会较慢。 如果您访问的是便携式(速度较慢)存储设备(例如相机 SD 卡),您会注意到性能不佳。缩略图会按需创建,即使设备被移除后仍会保留。建议:将文件复制到已声明的 Fotocx 文件夹中,然后从该位置进行所需的任何处理。这样性能会好得多。 - ^可移动存储设备(USB 驱动器) 如果您的顶层图像文件夹包含可移动驱动器上的文件夹,而您在未挂载该驱动器的情况下运行 Fotocx,索引数据和缩略图仍会被保留,即使可移动设备上的文件已经消失。当可移动驱动器再次被挂载并启动 Fotocx 时,会恢复上一次的状态。如果在此期间有文件被添加或修改,索引数据和缩略图会被更新。 - - TOPIC: 移动 Fotocx 主文件夹 Fotocx 主文件夹包含所有用户设置和数据,其中也包括一些来自 Fotocx 软件包、可供用户自定义的文件。 默认位置:/home//.fotocx。 如果系统中安装了多个版本或发行版的 Linux,可能希望使用一个共享的 Fotocx 主文件夹,而不是每个发行版各自一个。如果多个用户需要访问同一个 Fotocx 实例,情况也是类似的。 - 使用此功能可将 Fotocx 主文件夹移动到其他位置。所选文件夹的路径名中应包含 “fotocx”,如果不包含,系统会自动追加 “/fotocx”。 - 如果您希望分别管理多个 Fotocx 图像收藏,请参见 {命令参数} 中的 -home 参数。 - - TOPIC: 设置 +image: settings.jpg - 各种用户首选项和设置会被收集并保存在文件 /parameters 中。大多数更改会立即生效。有些更改会导致 Fotocx 重启。 - • 选择所需的 2 字符语言代码。 Fotocx 将以所选语言重新启动。 • 启动视图 - Fotocx 启动时的初始显示内容。 最近文件:最近查看过的图像文件 最新文件:最近添加/修改的文件 指定图库:指定的文件夹图库 相册图库:指定的相册图库 上一个图库:上次会话中最后使用的图库 上一个文件:上次会话中最后查看的文件 指定文件:指定的图像文件 浏览按钮:选择一个文件夹、相册或图像文件 • 背景 - 文件视图和图库视图窗口的背景颜色 • 菜单样式 - 菜单显示样式:图标、文字或两者都显示 • 菜单颜色 - 菜单文字颜色和背景颜色 • 对话框字体 - 菜单和对话框使用的字体 • 显示隐藏项 - 若勾选,则显示隐藏的文件和文件夹 • ZOOM 速度 - 选择每 2 倍图像放大所需的点击次数 1-8 次或 [+] 键 • JPEG 文件 - 质量级别,默认 90,使用 70 以上可获得良好质量 • 曲线节点 - 编辑曲线的最小节点间距,占比例的百分比。 默认值为比例的 5%。对于触摸板可使用更高的值。 • 图像位置 - 图像在较宽窗口内的左侧/居中/右侧位置 • 确认退出 - 弹出对话框选项:确定要退出吗? • 索引级别 - 见下文 • RAW 加载器 - 见下文 • RAW 选项 - 见下文 • RAW 文件 - 使用的 RAW 文件类型列表 • 视频文件 - 使用的视频文件类型列表 • 视频应用 - 见下文 - ^文件质量与压缩 JPEG 文件质量级别:使用 70 或更高可获得良好图像质量(默认为 90)。TIFF 文件压缩方法为 DEFLATE(最适合彩色图像)。PNG 文件压缩级别为 “1”。更高的值似乎除了增加文件保存时间外没有其他作用(libpng)。 - ^图像位置 如果窗口比图像更宽(即窗口宽/高比例 > 图像比例),图像可以被移到左侧、居中,或移到右侧。如果选择左侧或右侧,未使用的边距会最大化,这可能更便于放置对话框。 - ^图像索引级别 这两个参数用于权衡启动时间和图像索引的完整性。 • $ fotocx:适用于通过 shell 命令、系统菜单或系统图标/启动器启动 fotocx 的情况。推荐值 “2” 表示完整索引:加载旧的索引文件,搜索新文件(尚未被索引的),并更新 fotocx 索引文件。 • $ fotocx :适用于通过在文件管理器列表中点击文件名启动 fotocx 的情况。推荐值 “1” 表示加载旧的索引文件,但不搜索新文件来更新索引。启动速度适中偏快。图像搜索和地图功能正常工作,但任何新的(尚未索引的)图像文件不会被包含在内。 • 备选项:“0” 表示不进行索引。启动速度非常快。之后使用图像搜索或地图功能时,会启动仅针对旧文件的文件索引功能(不搜索新增/已修改的文件)。如果您的图像收藏非常庞大,启动时间超过几秒钟,可使用此选项。如有需要,您可以稍后再启动索引功能。 - ^RAW 加载器 RAW 加载器是用于读取 RAW 文件并将其转换为 16 位色深 TIFF 文件的命令。查看 RAW 文件时会使用它。您可以使用 Fotocx 的编辑功能来编辑和优化该文件。默认的 RAW 加载器是使用 sRGB 色彩空间的 dcraw。选择列表中还提供了几个使用 dcraw 或 rawtherapee 的其他选项。这些命令保存在 Fotocx 主文件夹中的 'raw_commands_*' 文件里。编辑此文件可更改或添加新选项(见下文)。您可能希望为不同的相机或不同的处理选项准备多条命令。如果您更喜欢以交互方式使用某个 RAW 编辑器,可以为此创建一个插件命令——参见 {插件}。 - ^RAW 选项 • 编辑命令:按此按钮编辑 RAW 加载器命令列表。系统会在新窗口中启动文本编辑器,显示当前的命令列表。 • 匹配嵌入图像颜色:使用 RAW 文件中嵌入的图像作为参考,将 RAW 图像颜色映射到转换后的 TIFF 图像。这是相机制造商对 RAW 数据的解读——如果 RAW 文件还需要进一步编辑,这是一个不错的起点。嵌入图像通常与相机生成的 JPEG 文件相同。 - ^视频应用 输入用于启动视频播放应用的 shell 命令。使用 “%s” 标记命令行中插入视频文件名的位置。以下是一些示例: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: 键盘快捷键 +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - 查看或更改自定义键盘快捷键。第一个窗口显示当前已分配的快捷键。如果按 [编辑] 按钮,会显示第二个对话框,您可以在其中添加和更改键盘快捷键。使用键盘输入一个新的快捷键。您可以使用 A-Z、0-9、F2-F9 键,以及大多数符号(% $ & * < 等)。您可以将某个按键与 Ctrl/Alt/Shift 中的一个组合使用:按住 Ctrl/Alt/Shift 中的一个不放,然后按下该键,再同时释放两者。从右侧列表中选择一个可用的菜单分配项,然后按 [添加] 和 [OK]。要移除某个快捷键,请选中它并按 [删除]。 - - TOPIC: RGB 直方图 +image: RGB-hist.png - 一个小窗口会显示文件视图中当前图像,或图像中当前选定区域的亮度直方图图表。此图表会随编辑功能更改图像而同步更新。使用 [全部] [红色] [绿色] [蓝色] 按钮来选择要显示的颜色。 - - TOPIC: 放大图像 +image: magnify-image.jpg - 放大鼠标指针周围区域的图像。用鼠标左键在图像上拖动,可放大不同的区域,类似于用放大镜查看印刷图像。使用对话框调整区域半径和放大倍数。 - - TOPIC: 测量图像 在图像中点击任意两个位置,以测量这两点之间的像素距离。所点击的位置会在图像上标记为 A 和 B。这些标签始终显示最近点击的两个点。对话框会更新显示这两点之间的距离: X 距离(水平距离) Y 距离(垂直距离) H 距离(总距离) - - TOPIC: 显示 RGB +image: show-RGB.png - 点击图像上的某个点时,RGB 值会显示在一个对话框窗口中。系统会显示最近点击的 9 个点。数值格式为 xxx.dd,其中 xxx 是颜色值的高 8 位,.dd 是低 8 位。范围为 0.00 到 255.99。除非图像正在被编辑或色深超过 8 位,否则低 8 位始终为零。如果图像正在被编辑,输出会实时更新。如果勾选了“标签”,图像上的点会用与对话框窗口中相对应的字母进行标注。如果勾选了“差值”且图像正在被编辑,则会显示 RGB 变化量,而不是绝对值。 - 如果您打开另一张图像(例如与之前的图像进行比较),这些位置会被保留,并且只要在新图像的边界范围内,就会相应更新。这有助于在像素 RGB 值层面对图像进行比较。 - - TOPIC: 网格设置 +image: grid-settings.jpg - 有两个网格线功能:“网格设置”用于设置所有网格参数,“切换网格”用于打开或关闭网格线。网格线是横跨图像、按固定间隔排列的水平和垂直线条。当图像被展平弯曲或扭曲以拉直图像中的墙壁或其他物体时,这些线条可以作为有用的对齐参考。使用 x 计数和 y 计数输入项,分别设置垂直和水平线条的数量。x 偏移和 y 偏移控件可用于移动网格线,使其与图像中所需的位置相交。可以为“切换网格”指定一个键盘快捷键(默认为 shift+G),这样就可以用一次按键打开或关闭网格线。 - - TOPIC: 线条颜色 有些功能会在图像上绘制线条(裁剪、选择区域等)。您可以更改这些线条的颜色,以便与背景图像形成最大对比度。在编辑过程中可以让这个小对话框保持打开状态,以便在可用颜色(黑、白、红、绿)之间方便地切换。 - - TOPIC: 暗/亮像素 突出显示图像中最暗和最亮的像素。调整两个微调控件以设置亮度阈值,初始值分别为暗像素 0 和亮像素 255。亮度低于暗阈值或高于亮阈值的像素会被“闪烁”显示,使其更加醒目。可使用此功能在调整亮度或颜色后检测溢出(裁剪)情况。 - - TOPIC: 显示器颜色 +image: moncolor-small.png - 屏幕上会显示 8 条颜色带,亮度从零(黑色)到 100%。您可以用它来调整显示器的亮度和对比度。色带两端都不应出现无变化的区域。 - - TOPIC: 查找重复项 +image: find-dups.png - 在您的图像数据库中查找任何位置的重复图像文件。重复文件可以是与另一个文件完全相同或“几乎”相同的文件。为了提高速度,比较是在内存中对缩略图进行的。有可能出现这样的情况:缩略图匹配,但主图像之间存在缩略图未能体现的细微差异。缩小尺寸后的图像副本很可能会被归类为重复项。缩略图大小可设置为 32 到 512 像素。较大的尺寸可降低误判的概率。缩略图大小会显著影响所需的主内存量——例如,对于 10 万张图像,尺寸 64 大约需要 880 MB,而尺寸 256 大约需要 14 GB。按 [calculate] 按钮可计算出在现有可用内存范围内可采用的最大缩略图尺寸。 - 有两个参数用于设置检测相同或几乎相同图像的灵敏度:“像素差异”是判定像素相等所允许的 RGB 值差异上限。“像素数”是判定两张图像为重复项所允许的不同像素数量上限。示例:如果像素差异 = 2,像素数 = 10,那么当不同像素少于 10 个、且差异不超过 2 时,图像会被归类为重复项。 - 输出结果是一个图库,显示每组重复图像。输出图库会保存为名为 “Duplicate Images” 的相册。您可以将“批量删除/回收”与此相册配合使用,选择要删除的重复项。 - - TOPIC: 查找损坏文件 系统会读取您声明的所有顶层文件夹中的图像文件。 对于每个无法读取的文件,您有三个选项: • 删除该文件 • 修正不正确的文件类型(见下文) • 将文件移动到您顶层图像文件夹之外的某个位置 我经常见到扩展名为 .jpg 实际却是 .png 格式的文件。网页浏览器和其他一些应用程序会默默地处理这种情况。在这里,系统会报告正确的文件类型,您可以将扩展名更改为正确的类型。 - - TOPIC: 显示资源 报告 Fotocx 所使用的计算机资源: • CPU 时间:自 Fotocx 启动以来或自上次采样以来的使用量 • 实际内存:当前正在使用的实际内存(不含交换分区) • 地图缓存:用于缓存地图瓦片所占用的磁盘存储空间(MB) • 清除缓存:删除所有已缓存的地图瓦片 • [Sample] 按钮:进行新的一次采样并报告数据 - [Sample] 按钮会重置 CPU 时间。下一次采样将只显示新累积的 CPU 时间。CPU 时间是所有进程线程的总和。 - - TOPIC: 翻译 Fotocx 软件包中包含了多种语言的翻译。这些 AI 翻译并不完美。翻译错误可以通过编辑翻译文件来修正。 - ^更改 GUI 语言 可以使用 {设置} 菜单来更改语言。 也可以在启动 Fotocx 时设置语言: $ fotocx -lang xx # 语言 xx(de fr zh 等) $ fotocx -lang en # 英语 - ^修改 GUI 翻译 编辑文件 /translations/gui_xx 成对的文本行前面带有必须匹配的 4 位数字。第一行是英文,第二行是语言 xx 的译文。只能修改 xx 那一行,绝不要修改英文那一行。用于在文本中插入参数的特殊字符必须保持相同的顺序。这些字符是 '%d'(整数参数)、'%f'(小数)、'%s'(文本)。 - ^修改用户指南翻译 编辑文件 /translations/ug_xx 编辑 ug_xx 以修正翻译。不要添加或删除任何文本行,也不要更改顺序。文本行必须与英文用户指南 ug_en 一一对应。 - 将修订后的文件发送以纳入 Fotocx 的下一个版本:mkornelix@gmail.com - - TOPIC: 帮助菜单 • 用户指南 - 显示目录 • 视频教程 - 显示 YouTube 上的 Fotocx 视频教程 • 外部程序 - 列出外部程序及其功能 • 显示日志文件 - 显示记录的信息和错误消息 • 命令参数 - 显示可用的命令行参数 • 更新日志 - 显示近期版本中的新增内容和错误修复 • 版权 - 显示与 Fotocx 相关的版权和许可信息 • 隐私 - 显示 Fotocx 的隐私政策(规则) • 关于 - 显示版本号、可执行文件位置、联系方式 • 主页 - 显示 kornelix.net 上的 Fotocx 主页 • 卸载 - 如何卸载 Fotocx - - TOPIC: 其他主题 以下主题与 Fotocx 菜单无关。 - - TOPIC: VIDEO FILES 视频文件(.mpeg、.mp4 等)可能会与您的图像文件混杂在一起。它们会在文件视图和图库视图中都显示为图像文件。“P” 键可以启动、暂停和恢复视频播放,或重新播放已结束的视频。“Q” 键可退出视频。使用 {设置} 菜单选择用于播放视频文件的应用程序。 - - TOPIC: 幻灯片与底片 +image: color-negative.jpg - 您可以使用具有微距功能的相机来拍摄幻灯片或胶片底片。可使用灯箱进行照明,或利用天空作为光源(如上方示例)。要处理彩色负片,请先制作正片——参见 {颜色模式}。如果图像有雾感,请只选择图像区域(不包括胶片边缘),然后使用 {全局 Retinex} 消除雾感。如有需要,可通过在图像上点击来设置白点和黑点,以进一步减少雾感。 - - TOPIC: Fotocx 限制 • 文件数量存在一个硬性上限:一百万个。 • 图像版本 - 撤销/重做和版本命名最多支持 99 个版本。 • 图像 keywords - 总计 10K 个 keywords。单张图像最多 1000 个字符。 • 图库最多支持 40K 个图像文件。 • 最大图像尺寸为 40K x 20K 像素。 - - TOPIC: 适用于 Windows 11 的 Fotocx 通过安装 Windows Subsystem for Linux 2(即 WSL2),可以在 Windows 11 中使用 Fotocx。互联网上有大量关于如何操作的文档。 - 如果您的图像文件位于 Windows 文件系统(NTFS)中,Fotocx 的运行速度会非常慢。因此请将您的图像文件移动到 Linux 文件系统中。您仍然可以使用 Windows 文件资源管理器和其他 Windows 应用程序访问这些文件,因此不会有任何损失。微软官方也建议使用 Linux 文件系统以提升性能。使用文件资源管理器中的“Linux”图标访问 Linux 文件系统中的主文件夹。如有需要,添加一个 Pictures 文件夹,并将您的图像文件移动到那里。 - 如果已有可用的 Fotocx 软件包,请直接安装。 否则,请执行以下步骤: 从 ^https://kornelix.net 下载 Fotocx 二进制软件包文件。 在 Linux 终端中: $ cd /mnt/c/Users//Downloads # 转到 Windows 下载文件夹 $ tar -xzf fotocx-xxx-bin.tar.gz # 将软件包解压到 fotocx 文件夹 $ cd fotocx # 进入 fotocx 文件夹 $ chmod u+x install.sh # 使安装脚本可执行 $ ./install.sh # 运行脚本,安装 fotocx $ fotocx # 启动 Fotocx 最后一步可能需要重启 Linux 窗口才能生效。 - 请阅读本用户指南的开头部分。Fotocx 拥有丰富深入的功能。不要指望在短短几分钟内就能完全掌握 Fotocx。 - - TOPIC: 隐私 除图像文件及其 metadata 外,Fotocx 不会保留任何用户数据。在将图像文件上传到互联网之前,应先移除其中的 metadata,Fotocx 提供了一种简便的方法来做到这一点。 - - TOPIC: PROBLEM, QUESTION, SUGGESTION 请发送电子邮件至 mkornelix@gmail.com。如果有崩溃转储文件(zappcrash 文件),也请一并发送。 - fotocx/data/translations/gui_pt0000664000175000017500000037502015247006657015711 0ustar micomico0000 + Zoom-in \n 0000 + Zoom-in \n 0001 - Zoom-out \n 0001 - Zoom-out \n 0002 = Zoom-in \n 0002 = Zoom-in \n 0003 Arrow keys Previous/Next file \n 0003 Arrow keys Arquivo anterior/próximo \n 0004 Delete Delete/Trash file \n 0004 Delete Excluir/Descartar arquivo \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Escape Sair da caixa de diálogo / Sair do Fotocx \n 0006 F1 User Guide, Context Help \n 0006 F1 Guia do Usuário, Ajuda Contextual \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 Tela cheia / sem menus \n 0008 Home/End Gallery start/end \n 0008 Home/End Início/fim da galeria \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 A indexação leva um tempo que depende do número, tipo e tamanho \n dos seus arquivos de imagem e da velocidade do seu computador. Isso pode \n variar de algumas centenas a mais de 10 mil por minuto. \n Você pode alterar as opções de indexação depois, usando estes menus: \n Ferramentas > Índice, Ferramentas > Configurações. \n 0010 Page keys Gallery page up/down \n 0010 Page keys Página da galeria para cima/baixo \n 0011 Z 1x <--> fit to window \n 0011 Z 1x <--> ajustar à janela \n 0012 $s plugin needs base and adder 0012 $s plugin precisa de base e adder 0013 % from left: 0013 % da esquerda: 0014 % from top: 0014 % do topo: 0015 %d albums selected 0015 %d álbuns selecionados 0016 %d image files selected 0016 %d arquivos de imagem selecionados 0017 %d images 0017 %d imagens 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 %d keywords a serem removidas \nem %d arquivos de imagem. \nContinuar? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 %d keywords a serem renomeadas \nem %d arquivos de imagem. \nContinuar? 0020 %d max images exceeded 0020 %d limite máximo de imagens excedido 0021 %d red-eye limit reached 0021 %d limite de olhos vermelhos atingido 0022 %s %s %d folders %d files 0022 %s %s %d pastas %d arquivos 0023 %s *** date/time conversion failed \n 0023 %s *** falha na conversão de data/hora \n 0024 %s ALBUM %s %d files 0024 %s ÁLBUM %s %d arquivos 0025 %s NEWEST FILES 0025 %s ARQUIVOS MAIS NOVOS 0026 %s RECENT FILES 0026 %s ARQUIVOS RECENTES 0027 %s SEARCH RESULTS %d files 0027 %s RESULTADOS DA BUSCA %d arquivos 0028 %s UNKNOWN 0028 %s DESCONHECIDO 0029 %s added to script 0029 %s adicionado ao script 0030 %s is already indexed 0030 %s já está indexado 0031 %s renamed: %s 0031 %s renomeado: %s 0032 %s: metadata update failed 0032 %s: falha ao atualizar metadata 0033 %s: no write permission 0033 %s: sem permissão de escrita 0034 %s: reserved, cannot be used 0034 %s: reservado, não pode ser usado 0035 %s: too many keywords 0035 %s: excesso de keywords 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\nData da Foto: %s Data do Arquivo: %s \nAvaliação: %s Tamanho: %s %.2fmb \nLocalização: %s %s %s \nKeywords: %s \nTítulo: %s \nDescrição: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\nData da Foto: %s Data do Arquivo: %s \nAvaliação: %s Tamanho: %s %.2fmb \nLocalização: %s %s %s \nKeywords: %s \nTítulo: %s \nDescrição: %s \n----------------------- \n%s 0038 (click below) 0038 (clique abaixo) 0039 (no selection) 0039 (nenhuma seleção) 0040 (pixels) 0040 (pixels) 0041 (press key) 0041 (pressione a tecla) 0042 (select function) 0042 (selecione a função) 0043 *** bad utf8 detected *** \n 0043 *** utf8 inválido detectado *** \n 0044 *** cannot create new file \n 0044 *** não é possível criar novo arquivo \n 0045 *** cannot get real path of input file \n 0045 *** não é possível obter o caminho real do arquivo de entrada \n 0046 *** cannot load input file \n 0046 *** não é possível carregar o arquivo de entrada \n 0047 *** cannot make new version of input file \n 0047 *** não é possível criar nova versão do arquivo de entrada \n 0048 *** cannot open input file 0048 *** não é possível abrir o arquivo de entrada 0049 *** cannot read input file 0049 *** não é possível ler o arquivo de entrada 0050 *** cannot save output file \n 0050 *** não é possível salvar o arquivo de saída \n 0051 *** completed \n 0051 *** concluído \n 0052 *** file date/time invalid \n 0052 *** data/hora do arquivo inválida \n 0053 *** file type not supported \n 0053 *** tipo de arquivo não suportado \n 0054 *** invalid file \n 0054 *** arquivo inválido \n 0055 *** metadata update error \n 0055 *** erro ao atualizar metadata \n 0056 *** no date/time available \n 0056 *** nenhuma data/hora disponível \n 0057 + bright 0057 + brilho 0058 +Blue -Yellow 0058 +Azul -Amarelo 0059 +Brightness 0059 +Brilho 0060 +Green -Magenta 0060 +Verde -Magenta 0061 +Red -Cyan 0061 +Vermelho -Ciano 0062 - blue 0062 - azul 0063 - fog/haze 0063 - névoa/neblina 0064 .heic/.avif files not supported (install heif_convert) 0064 arquivos .heic/.avif não suportados (instale heif_convert) 0065 .jp2 files not supported (install opj_decompress) 0065 arquivos .jp2 não suportados (instale opj_decompress) 0066 .webp files not supported (install dwebp) 0066 arquivos .webp não suportados (instale dwebp) 0067 0 albums selected 0067 0 álbuns selecionados 0068 0 duplicates 0068 0 duplicatas 0069 0-5 stars 0069 0-5 estrelas 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = sem índice de imagem, apenas índice antigo, antigo + atualizar novo/modificado 0071 2-character code 0071 código de 2 caracteres 0072 3D depth 0072 profundidade 3D 0073 <2 images 0073 <2 imagens 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 Uma nova versão do Fotocx está sendo instalada. \nVocê pode precisar restaurar as configurações personalizadas. 0075 ADD GLARE 0075 ADICIONAR BRILHO INTENSO 0076 ADD NOISE 0076 ADICIONAR RUÍDO 0077 ADJUST HSL 0077 AJUSTAR HSL 0078 ADJUST RGB 0078 AJUSTAR RGB 0079 ALBUM MASS UPDATE 0079 ATUALIZAÇÃO EM MASSA DE ÁLBUM 0080 ALBUMS 0080 ÁLBUNS 0081 ALBUMS MENU 0081 MENU DE ÁLBUNS 0082 ALIEN COLORS 0082 CORES ALIENÍGENAS 0083 AMPLIFY CONTRAST 0083 AMPLIFICAR CONTRASTE 0084 ANTI-ALIAS 0084 ANTI-SERRILHADO 0085 AREA BLEND 0085 MESCLAR ÁREA 0086 AREA FILL 0086 PREENCHER ÁREA 0087 AREA OVERVIEW 0087 VISÃO GERAL DA ÁREA 0088 AUTOSEARCH 0088 BUSCA AUTOMÁTICA 0089 About 0089 Sobre 0090 Action 0090 Ação 0091 Add 0091 Adicionar 0092 Add 1 0092 Adicionar 1 0093 Add All 0093 Adicionar Tudo 0094 Add Current 0094 Adicionar Atual 0095 Add Current File Here 0095 Adicionar Arquivo Atual Aqui 0096 Add Glare 0096 Adicionar Brilho Intenso 0097 Add Image 0097 Adicionar Imagem 0098 Add Line 0098 Adicionar Linha 0099 Add Margins 0099 Adicionar Margens 0100 Add Noise 0100 Adicionar Ruído 0101 Add Random Noise 0101 Adicionar Ruído Aleatório 0102 Add Selected Files Here 0102 Adicionar Arquivos Selecionados Aqui 0103 Add Texture 0103 Adicionar Textura 0104 Add a brightness/color ramp across an image 0104 Adicionar uma gradação de brilho/cor pela imagem 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 Adicionar marcador: clique em uma thumbnail da galeria. \nRenomear marcador: clique nela e pressione [Renomear] 0106 Add glare around bright objects 0106 Adicionar brilho intenso ao redor de objetos claros 0107 Add margins around an image 0107 Adicionar margens ao redor de uma imagem 0108 Add newest version to existing versions 0108 Adicionar versão mais recente às versões existentes 0109 Add overlay image (e.g. copyright) to selected images 0109 Adicionar imagem sobreposta (ex.: direitos autorais) às imagens selecionadas 0110 Add random noise to an image 0110 Adicionar ruído aleatório a uma imagem 0111 Add selected versions to existing versions 0111 Adicionar versões selecionadas às versões existentes 0112 Add texture to an image 0112 Adicionar textura a uma imagem 0113 Add to Selection 0113 Adicionar à Seleção 0114 Add/change/delete metadata for selected image files 0114 Adicionar/alterar/excluir metadata dos arquivos de imagem selecionados 0115 Add/remove barrel/pincushion distortion 0115 Adicionar/remover distorção de barril/almofada 0116 Add/remove brightness/color radially from chosen center 0116 Adicionar/remover brilho/cor radialmente a partir do centro escolhido 0117 Add/remove keywords for selected image files 0117 Adicionar/remover keywords dos arquivos de imagem selecionados 0118 Add/revise location/geocoordinates for selected image files 0118 Adicionar/revisar localização/geocoordenadas dos arquivos de imagem selecionados 0119 Adjust HSL 0119 Ajustar HSL 0120 Adjust Image Contributions 0120 Ajustar Contribuições da Imagem 0121 Adjust Pixel Composition 0121 Ajustar Composição de Pixels 0122 Adjust RGB 0122 Ajustar RGB 0123 Adjust brightness, contrast, color 0123 Ajustar brilho, contraste, cor 0124 Adjust color saturation based on brightness 0124 Ajustar saturação de cor com base no brilho 0125 Adjust color using HSL color model 0125 Ajustar cor usando o modelo de cor HSL 0126 Adjust color using RGB or CMY colors 0126 Ajustar cor usando cores RGB ou CMY 0127 Adjustment 0127 Ajuste 0128 Album Mass Update 0128 Atualização em Massa de Álbum 0129 Album Name 0129 Nome do Álbum 0130 Albums 0130 Álbuns 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 Álbuns: galeria de imagens escolhidas, organize por arrastar e soltar 0132 Algorithm Iterations 0132 Iterações do Algoritmo 0133 Alien Colors 0133 Cores Alienígenas 0134 All 0134 Tudo 0135 All Areas 0135 Todas as Áreas 0136 All files 0136 Todos os arquivos 0137 All image files will be re-indexed. \nContinue? 0137 Todos os arquivos de imagem serão reindexados. \nContinuar? 0138 All±1 0138 Tudo±1 0139 All±10 0139 Tudo±10 0140 Alpha 0140 Alfa 0141 Amount 0141 Quantidade 0142 Amplify 0142 Amplificar 0143 Amplify Contrast 0143 Amplificar Contraste 0144 Amplify area contrast to enhance visibility of details 0144 Amplificar o contraste da área para melhorar a visibilidade de detalhes 0145 Angle 0145 Ângulo 0146 Anti-Alias 0146 Anti-Serrilhado 0147 Apply 0147 Aplicar 0148 Apply a soft focus effect to an image 0148 Aplicar um efeito de foco suave a uma imagem 0149 Apply repeatedly while watching the image. 0149 Aplique repetidamente enquanto observa a imagem. 0150 Area Blend 0150 Mesclar Área 0151 Area Edge Blend 0151 Mesclar Borda de Área 0152 Area Fill 0152 Preencher Área 0153 Arrange images and text in a layout (photo-montage) 0153 Organizar imagens e texto em um layout (fotomontagem) 0154 Array Complete 0154 Array Completo 0155 Array Width 0155 Largura do Array 0156 Arrow head 0156 Ponta da seta 0157 Auto Level 0157 Nivelamento Automático 0158 Auto black level 0158 Nível de preto automático 0159 Auto crop: 0159 Corte automático: 0160 Auto white balance 0160 Balanço de branco automático 0161 Auto-replay 0161 Reprodução automática 0162 BATCH CHANGE META 0162 ALTERAÇÃO EM LOTE DE META 0163 BATCH CONVERT 0163 CONVERSÃO EM LOTE 0164 BATCH COPY/MOVE 0164 CÓPIA/MOVIMENTAÇÃO EM LOTE 0165 BATCH DELETE/TRASH 0165 EXCLUSÃO/LIXEIRA EM LOTE 0166 BATCH GEOTAGS 0166 GEOTAGS EM LOTE 0167 BATCH KEYWORDS 0167 KEYWORDS EM LOTE 0168 BATCH MENU 0168 MENU DE LOTE 0169 BATCH OVERLAY 0169 SOBREPOSIÇÃO EM LOTE 0170 BATCH PHOTO DATE 0170 DATA DA FOTO EM LOTE 0171 BATCH PROCESSING 0171 PROCESSAMENTO EM LOTE 0172 BATCH PURGE KEYWORDS 0172 REMOÇÃO EM LOTE DE KEYWORDS 0173 BATCH RENAME KEYWORDS 0173 RENOMEAÇÃO EM LOTE DE KEYWORDS 0174 BATCH REPORT META 0174 RELATÓRIO DE META EM LOTE 0175 BATCH SCRIPT 0175 SCRIPT EM LOTE 0176 BATCH UPRIGHT 0176 ENDIREITAMENTO EM LOTE 0177 BLANK IMAGE 0177 IMAGEM EM BRANCO 0178 BLUR 0178 DESFOQUE 0179 BOOKMARKS 0179 MARCADORES 0180 BRIGHTNESS RAMP 0180 GRADAÇÃO DE BRILHO 0181 Background 0181 Plano de Fundo 0182 Background Blur - blur relative to distance from foreground 0182 Desfoque de Fundo - desfoque relativo à distância do primeiro plano 0183 Background Color 0183 Cor de Fundo 0184 Background Pattern 0184 Padrão de Fundo 0185 Base Transparency 0185 Transparência Base 0186 Batch 0186 Lote 0187 Batch Add/Change Metadata 0187 Adicionar/Alterar Metadata em Lote 0188 Batch Add/Remove Keywords 0188 Adicionar/Remover Keywords em Lote 0189 Batch Change Meta 0189 Alteração de Meta em Lote 0190 Batch Convert 0190 Conversão em Lote 0191 Batch Copy/Move 0191 Cópia/Movimentação em Lote 0192 Batch Delete/Trash 0192 Exclusão/Lixeira em Lote 0193 Batch Geotags 0193 Geotags em Lote 0194 Batch Keywords 0194 Keywords em Lote 0195 Batch Metadata 0195 Metadata em Lote 0196 Batch Overlay 0196 Sobreposição em Lote 0197 Batch Photo Date 0197 Data da Foto em Lote 0198 Batch Photo Date/Time 0198 Data/Hora da Foto em Lote 0199 Batch Purge Keywords 0199 Remoção em Lote de Keywords 0200 Batch Rename Keywords 0200 Renomeação em Lote de Keywords 0201 Batch Report Meta 0201 Relatório de Meta em Lote 0202 Batch Report Metadata 0202 Relatório de Metadata em Lote 0203 Batch Set Geotags 0203 Definir Geotags em Lote 0204 Batch Upright 0204 Endireitamento em Lote 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 Lote: copiar, mover, converter, converter RAW, adicionar/alterar metadata 0206 Bend and fine-align 0206 Curvar e alinhar com precisão 0207 Bias 0207 Viés 0208 Black 0208 Preto 0209 Blank Image 0209 Imagem em Branco 0210 Blend 0210 Mesclar 0211 Blend 0% 0211 Mesclar 0% 0212 Blend Width 0212 Largura da Mesclagem 0213 Blend area edits/edges using the mouse 0213 Mesclar edições/bordas de área usando o mouse 0214 Blend: 0% 0214 Mesclar: 0% 0215 Blue 0215 Azul 0216 Blue Factors 0216 Fatores de Azul 0217 Blur 0217 Desfoque 0218 Blur Angle (degrees) 0218 Ângulo do Desfoque (graus) 0219 Blur Background 0219 Desfocar Fundo 0220 Blur Image 0220 Desfocar Imagem 0221 Blur Mix 0221 Mistura de Desfoque 0222 Blur Normal 0222 Desfoque Normal 0223 Blur Radius 0223 Raio do Desfoque 0224 Blur Span 0224 Extensão do Desfoque 0225 Blur Span (pixels) 0225 Extensão do Desfoque (pixels) 0226 Blur the image (various methods) 0226 Desfocar a imagem (vários métodos) 0227 Bookmarks 0227 Marcadores 0228 Both 0228 Ambos 0229 Bottom 0229 Inferior 0230 Bright Limit 0230 Limite de Brilho 0231 Bright Point 0231 Ponto de Brilho 0232 Brightness 0232 Brilho 0233 Brightness Histogram 0233 Histograma de Brilho 0234 Brightness Ramp 0234 Gradação de Brilho 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 O brilho deve mostrar uma gradação suave \nse estendendo até as bordas. 0236 Browse 0236 Procurar 0237 CALIBRATE PRINTER 0237 CALIBRAR IMPRESSORA 0238 CAPTIONS 0238 LEGENDAS 0239 CARTOON 0239 DESENHO ANIMADO 0240 CHOOSE ALBUM 0240 ESCOLHER ÁLBUM 0241 CLEAR AREA 0241 LIMPAR ÁREA 0242 CLOSE 0242 FECHAR 0243 COLOR MODE 0243 MODO DE COR 0244 COMBINE MENU 0244 MENU DE COMBINAÇÃO 0245 COMMAND PARAMETERS 0245 PARÂMETROS DE COMANDO 0246 COMPLETED 0246 CONCLUÍDO 0247 COPY FROM IMAGE 0247 COPIAR DA IMAGEM 0248 COPY IN IMAGE 0248 COPIAR NA IMAGEM 0249 COPY META 0249 COPIAR META 0250 COPY PRIOR EDIT 0250 COPIAR EDIÇÃO ANTERIOR 0251 COPY TO CLIPBOARD 0251 COPIAR PARA A ÁREA DE TRANSFERÊNCIA 0252 COPY TO DESKTOP 0252 COPIAR PARA A ÁREA DE TRABALHO 0253 COPY/MOVE 0253 COPIAR/MOVER 0254 COPY/PASTE AREA 0254 COPIAR/COLAR ÁREA 0255 CREATE ALBUM 0255 CRIAR ÁLBUM 0256 CROP 0256 CORTAR 0257 CROSSHATCH 0257 CRUZAMENTO DE LINHAS 0258 CURRENT ALBUM 0258 ÁLBUM ATUAL 0259 CURRENT FILE FOLDER 0259 PASTA DO ARQUIVO ATUAL 0260 CURVE EDITING 0260 EDIÇÃO DE CURVA 0261 CUSTOM KERNEL 0261 KERNEL PERSONALIZADO 0262 CUSTOM MENU 0262 MENU PERSONALIZADO 0263 CYCLE 2 FILES 0263 CICLAR 2 ARQUIVOS 0264 CYCLE 3 FILES 0264 CICLAR 3 ARQUIVOS 0265 Calculate 0265 Calcular 0266 Calculate Geometry 0266 Calcular Geometria 0267 Calibrate Printer 0267 Calibrar Impressora 0268 Cancel 0268 Cancelar 0269 Cartoon 0269 Desenho Animado 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 Cuidado: Use a função Editar Metadata Principal \npara alterar as tags disponíveis lá, para garantir \nque as atualizações relacionadas sejam feitas. 0271 Center 0271 Centro 0272 Center Hole 0272 Furo Central 0273 Change 0273 Alterar 0274 Change Log 0274 Registro de Alterações 0275 Change file name 0275 Alterar nome do arquivo 0276 Change gallery sort order 0276 Alterar ordem de classificação da galeria 0277 Change image colors using an algorithm 0277 Alterar cores da imagem usando um algoritmo 0278 Change image pixel dimensions 0278 Alterar dimensões de pixel da imagem 0279 Chart to adjust monitor color 0279 Tabela para ajustar a cor do monitor 0280 Choose 0280 Escolher 0281 Choose Album 0281 Escolher Álbum 0282 Choose Albums 0282 Escolher Álbuns 0283 Choose Captions 0283 Escolher Legendas 0284 Choose an album and show as gallery of images 0284 Escolher um álbum e mostrar como galeria de imagens 0285 Choose metadata shown on image captions 0285 Escolher metadata exibida nas legendas da imagem 0286 Choose new Fotocx home folder 0286 Escolher nova pasta home do Fotocx 0287 Choose thumbnail folder 0287 Escolher pasta de thumbnails 0288 Choose top image folders 0288 Escolher pastas de imagens principais 0289 Clear 0289 Limpar 0290 Clear All 0290 Limpar Tudo 0291 Click dark spot for black level 0291 Clique no ponto escuro para nível de preto 0292 Click for RGB histogram 0292 Clique para histograma RGB 0293 Click gray spot for white balance 0293 Clique no ponto cinza para balanço de branco 0294 Click image to select pixels 0294 Clique na imagem para selecionar pixels 0295 Click image to select, drag image to move. 0295 Clique na imagem para selecionar, arraste a imagem para mover. 0296 Click mouse to change center 0296 Clique com o mouse para alterar o centro 0297 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0297 Clique perto de qualquer posição no contorno da área. \nPossíveis lacunas no contorno serão encontradas. \nPressione F1 para ajuda 0298 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0298 Clique nos quatro cantos de uma área tetragonal. Pressione [aplicar]. \nA imagem é distorcida para transformar o tetrágono em um retângulo. 0299 Click thumbnail to select file 0299 Clique na thumbnail para selecionar o arquivo 0300 Clip Level 0300 Nível de Corte 0301 Clip Limit % 0301 Limite de Corte % 0302 Color 0302 Cor 0303 Color Chooser 0303 Seletor de Cor 0304 Color Depth: 0304 Profundidade de Cor: 0305 Color Fringes 0305 Franjas de Cor 0306 Color Hue 0306 Matiz de Cor 0307 Color Map File 0307 Arquivo de Mapa de Cores 0308 Color Match Images 0308 Combinar Cores das Imagens 0309 Color Mode 0309 Modo de Cor 0310 Color calibration tool for printer and paper type 0310 Ferramenta de calibração de cor para impressora e tipo de papel 0311 Color map file to use 0311 Arquivo de mapa de cores a ser usado 0312 Combine 0312 Combinar 0313 Combine 2-6 images into a wide panorama image 0313 Combinar de 2 a 6 imagens em um panorama amplo 0314 Combine many images into an array of images 0314 Combinar várias imagens em um array de imagens 0315 Combine multiple images in layers, select and expose layers 0315 Combinar várias imagens em camadas, selecione e exponha camadas 0316 Combine multiple noisy photos into a low-noise image 0316 Combinar várias fotos com ruído em uma imagem de baixo ruído 0317 Combine multiple photos to erase passing people, etc. 0317 Combinar várias fotos para apagar pessoas passando, etc. 0318 Combine within 0318 Combinar dentro 0319 Combine: HDR, HDF, stack, panorama, mashup, image array 0319 Combinar: HDR, HDF, empilhamento, panorama, mashup, array de imagens 0320 Command Params 0320 Parâmetros de Comando 0321 Commit 0321 Confirmar 0322 Confirm Exit 0322 Confirmar Saída 0323 Contrast 0323 Contraste 0324 Contrast All 0324 Contraste Total 0325 Contrast Blue 0325 Contraste Azul 0326 Contrast Green 0326 Contraste Verde 0327 Contrast Limit 0327 Limite de Contraste 0328 Contrast Red 0328 Contraste Vermelho 0329 Convert %d image files 0329 Converter %d arquivos de imagem 0330 Convert an image into a Tiny Planet image 0330 Converter uma imagem em uma imagem Tiny Planet 0331 Convert image into a cartoon drawing 0331 Converter imagem em um desenho de desenho animado 0332 Convert image into a crosshatch sketch 0332 Converter imagem em um esboço de linhas cruzadas 0333 Convert image into a line drawing 0333 Converter imagem em um desenho de linhas 0334 Convert image into a simulated painting 0334 Converter imagem em uma pintura simulada 0335 Convert image into a simulated sketch (1) 0335 Converter imagem em um esboço simulado (1) 0336 Convert image into a simulated sketch (2) 0336 Converter imagem em um esboço simulado (2) 0337 Convert image into black/white lines 0337 Converter imagem em linhas preto/branco 0338 Convert image into dithered dots 0338 Converter imagem em pontos com dithering 0339 Convert image into square tiles with 3D effect 0339 Converter imagem em ladrilhos quadrados com efeito 3D 0340 Convert image into tiles matching feature contours 0340 Converter imagem em ladrilhos seguindo os contornos das características 0341 Copy 0341 Copiar 0342 Copy %d image files 0342 Copiar %d arquivos de imagem 0343 Copy From Image 0343 Copiar da Imagem 0344 Copy Meta 0344 Copiar Meta 0345 Copy Metadata 0345 Copiar Metadata 0346 Copy Prior Edit 0346 Copiar Edição Anterior 0347 Copy Within Image 0347 Copiar Dentro da Imagem 0348 Copy area for later pasting into image 0348 Copiar área para colar depois na imagem 0349 Copy areas from another image using the mouse 0349 Copiar áreas de outra imagem usando o mouse 0350 Copy areas from prior edits using the mouse 0350 Copiar áreas de edições anteriores usando o mouse 0351 Copy areas within an image using the mouse 0351 Copiar áreas dentro de uma imagem usando o mouse 0352 Copy image file to the clipboard 0352 Copiar arquivo de imagem para a área de transferência 0353 Copy image file to the desktop 0353 Copiar arquivo de imagem para a área de trabalho 0354 Copy in Image 0354 Copiar na Imagem 0355 Copy metadata from one image to another 0355 Copiar metadata de uma imagem para outra 0356 Copy or Move Image File 0356 Copiar ou Mover Arquivo de Imagem 0357 Copy or Move image file to new location 0357 Copiar ou mover arquivo de imagem para novo local 0358 Copy to Clipboard 0358 Copiar para a Área de Transferência 0359 Copy to Desktop 0359 Copiar para a Área de Trabalho 0360 Copy without unsaved changes? 0360 Copiar sem as alterações não salvas? 0361 Copy/Move 0361 Copiar/Mover 0362 Copy/move selected image files to a new folder 0362 Copiar/mover arquivos de imagem selecionados para uma nova pasta 0363 Copyright 0363 Direitos Autorais 0364 Create 0364 Criar 0365 Create Album 0365 Criar Álbum 0366 Create Blank Image 0366 Criar Imagem em Branco 0367 Create Mosaic 0367 Criar Mosaico 0368 Create a blank image 0368 Criar uma imagem em branco 0369 Create a mosaic with tiles made from all images 0369 Criar um mosaico com ladrilhos feitos de todas as imagens 0370 Create a new album (ordered set of image files) 0370 Criar um novo álbum (conjunto ordenado de arquivos de imagem) 0371 Create an embossed or 3D appearance 0371 Criar uma aparência em relevo ou 3D 0372 Create or replace an album 0372 Criar ou substituir um álbum 0373 Crop 0373 Cortar 0374 Crop (trim) image margins 0374 Cortar (aparar) margens da imagem 0375 Crop Buttons 0375 Botões de Corte 0376 Crop Image 0376 Cortar Imagem 0377 Crosshatch 0377 Cruzamento de Linhas 0378 Crosshatch Sketch 0378 Esboço de Cruzamento de Linhas 0379 Current Album 0379 Álbum Atual 0380 Current File Folder 0380 Pasta do Arquivo Atual 0381 Current gallery 0381 Galeria atual 0382 Current image: 0382 Imagem atual: 0383 Curve Node 0383 Nó da Curva 0384 Curve lines need at least 4 points 0384 As linhas de curva precisam de pelo menos 4 pontos 0385 Custom 0385 Personalizado 0386 Custom Kernel 0386 Kernel Personalizado 0387 Custom Shortcuts \n 0387 Atalhos Personalizados \n 0388 Custom menu: favorite/frequent functions, scripts, plugins 0388 Menu personalizado: funções favoritas/frequentes, scripts, plugins 0389 Customize 0389 Personalizar 0390 Customize: 0390 Personalizar: 0391 Cut Bottom 0391 Cortar Inferior 0392 Cut Top 0392 Cortar Superior 0393 Cycle 2 Files 0393 Ciclar 2 Arquivos 0394 Cycle 2 Prior Files 0394 Ciclar 2 Arquivos Anteriores 0395 Cycle 3 Files 0395 Ciclar 3 Arquivos 0396 Cycle 3 Prior Files 0396 Ciclar 3 Arquivos Anteriores 0397 Cycle through images: 0397 Ciclar pelas imagens: 0398 DARK/BRIGHT PIXELS 0398 PIXELS ESCUROS/CLAROS 0399 DEFOG 0399 REMOVER NÉVOA 0400 DELETE ALBUM 0400 EXCLUIR ÁLBUM 0401 DELETE META 0401 EXCLUIR META 0402 DELETE/TRASH 0402 EXCLUIR/LIXEIRA 0403 DENOISE 0403 REDUZIR RUÍDO 0404 DIALOG BUTTONS 0404 BOTÕES DE DIÁLOGO 0405 DITHER 0405 DITHERING 0406 DRAG AND DROP 0406 ARRASTAR E SOLTAR 0407 Dark Areas 0407 Áreas Escuras 0408 Dark Limit 0408 Limite Escuro 0409 Dark Point 0409 Ponto Escuro 0410 Dark/Bright Pixels 0410 Pixels Escuros/Claros 0411 Data file 0411 Arquivo de dados 0412 Define keywords used for searching images 0412 Definir keywords usadas para buscar imagens 0413 Defined Keywords: 0413 Keywords Definidas: 0414 Defog 0414 Remover Névoa 0415 Delete 0415 Excluir 0416 Delete Album 0416 Excluir Álbum 0417 Delete Meta 0417 Excluir Meta 0418 Delete Metadata 0418 Excluir Metadata 0419 Delete Originals 0419 Excluir Originais 0420 Delete an album 0420 Excluir um álbum 0421 Delete or Trash selected image files 0421 Excluir ou mover para a lixeira os arquivos de imagem selecionados 0422 Delete or trash an image file 0422 Excluir ou mover um arquivo de imagem para a lixeira 0423 Delete read-only file? 0423 Excluir arquivo somente leitura? 0424 Delete/Trash 0424 Excluir/Lixeira 0425 Denoise 0425 Reduzir Ruído 0426 Depth 0426 Profundidade 0427 Desc. 0427 Desc. 0428 Description: %s\n 0428 Descrição: %s\n 0429 Desktop 0429 Área de Trabalho 0430 Dialog Font 0430 Fonte do Diálogo 0431 Diffs 0431 Diferenças 0432 Directed Blur 0432 Desfoque Direcionado 0433 Directed Blur - blur locally in direction of mouse drag 0433 Desfoque Direcionado - desfoque localmente na direção do arraste do mouse 0434 Disable 0434 Desativar 0435 Disable areas for editing 0435 Desativar áreas para edição 0436 Discard unsaved changes? 0436 Descartar alterações não salvas? 0437 Discard unsaved edits? 0437 Descartar edições não salvas? 0438 Distort image areas using the mouse 0438 Distorcer áreas da imagem usando o mouse 0439 Dither 0439 Dithering 0440 Dither Image 0440 Aplicar Dithering na Imagem 0441 Dither0 0441 Dithering0 0442 Dither1 0442 Dithering1 0443 Dither2 0443 Dithering2 0444 Dither3 0444 Dithering3 0445 Dither4 0445 Dithering4 0446 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0446 Arraste as imagens para um alinhamento aproximado.\nPara girar, arraste a partir da borda inferior. 0447 Drag margin box middle or edges 0447 Arraste o meio ou as bordas da caixa de margem 0448 Drag mouse on image. \nLeft click to cancel. 0448 Arraste o mouse na imagem. \nClique com o botão esquerdo para cancelar. 0449 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0449 Arraste o mouse para selecionar. Apague. Repita. \nClique: estender seleção até o mouse. 0450 Drag mouse to set center 0450 Arraste o mouse para definir o centro 0451 Drag near an image corner using the mouse 0451 Arraste perto de um canto da imagem usando o mouse 0452 Drag on image to level image.\nClick on image for level lines. 0452 Arraste na imagem para nivelar a imagem.\nClique na imagem para linhas de nível. 0453 Drag within image using the mouse 0453 Arraste dentro da imagem usando o mouse 0454 Draw a line across the image in \ndirection of brightness change. 0454 Desenhe uma linha pela imagem na \ndireção da mudança de brilho. 0455 Draw box on image 0455 Desenhe uma caixa na imagem 0456 Draw line or arrow on image 0456 Desenhe uma linha ou seta na imagem 0457 Draw on image: text, line/arrow, box, circle, ellipse 0457 Desenhe na imagem: texto, linha/seta, caixa, círculo, elipse 0458 Draw oval on image 0458 Desenhe uma oval na imagem 0459 Draw text on image 0459 Desenhe texto na imagem 0460 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0460 Pastas duplicadas ou aninhadas: \n %s \n %s \nPor favor, remova. 0461 Duplicates: 0461 Duplicatas: 0462 EDIT ALBUM 0462 EDITAR ÁLBUM 0463 EDIT ANY META 0463 EDITAR QUALQUER META 0464 EDIT BOOKMARKS 0464 EDITAR MARCADORES 0465 EDIT MAIN META 0465 EDITAR META PRINCIPAL 0466 EDIT MENU 0466 MENU DE EDIÇÃO 0467 EDIT PROCEDURES 0467 EDITAR PROCEDIMENTOS 0468 EDIT SCRIPT 0468 EDITAR SCRIPT 0469 EDIT WORKFLOW 0469 EDITAR FLUXO DE TRABALHO 0470 EFFECTS MENU 0470 MENU DE EFEITOS 0471 EMBOSS 0471 RELEVO 0472 ENABLE/DISABLE AREA 0472 ATIVAR/DESATIVAR ÁREA 0473 ENGRAVE 0473 GRAVURA 0474 ESCHER SPIRAL 0474 ESPIRAL DE ESCHER 0475 EXPORT FILES 0475 EXPORTAR ARQUIVOS 0476 Edge 0476 Borda 0477 Edit 0477 Editar 0478 Edit Any Meta 0478 Editar Qualquer Meta 0479 Edit Any Metadata 0479 Editar Qualquer Metadata 0480 Edit Bookmarks 0480 Editar Marcadores 0481 Edit Images 0481 Editar Imagens 0482 Edit Keyboard Shortcuts 0482 Editar Atalhos de Teclado 0483 Edit Line 0483 Editar Linha 0484 Edit Line/Arrow 0484 Editar Linha/Seta 0485 Edit Main Meta 0485 Editar Meta Principal 0486 Edit Main Metadata 0486 Editar Metadata Principal 0487 Edit Menu 0487 Menu de Edição 0488 Edit Metadata 0488 Editar Metadata 0489 Edit Plugins 0489 Editar Plugins 0490 Edit Text 0490 Editar Texto 0491 Edit any metadata tag 0491 Editar qualquer tag de metadata 0492 Edit function can not use Paint Edits 0492 A função de edição não pode usar Pintar Edições 0493 Edit function must be active 0493 A função de edição precisa estar ativa 0494 Edit key metadata: keywords/geotags/description/rating ... 0494 Editar metadata principal: keywords/geotags/descrição/avaliação ... 0495 Edit plugins menu 0495 Editar menu de plugins 0496 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0496 Editar: cortar, girar, retocar, redimensionar, marcação, pintar edições, copiar áreas 0497 Effects 0497 Efeitos 0498 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0498 Efeitos: desenho animado, esboço, pintura, relevo, dithering, textura, cores, convolução personalizada 0499 Emboss 0499 Relevo 0500 Enable 0500 Ativar 0501 Enable areas for editing 0501 Ativar áreas para edição 0502 End of gallery 0502 Fim da galeria 0503 Engrave 0503 Gravura 0504 Enter Keyword 0504 Digite a Keyword 0505 Enter New Keyword 0505 Digite Nova Keyword 0506 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0506 Digite propriedades da linha ou seta na caixa de diálogo, \nclique/arraste na imagem, clique com o botão direito para remover 0507 Enter text, [Add] to layout, edit properties. 0507 Digite o texto, [Adicionar] ao layout, editar. 0508 Enter text, click/drag on image, right click to remove 0508 Digite o texto, clique/arraste na imagem, clique com o botão direito para remover 0509 Erase 0509 Apagar 0510 Erase existing areas 0510 Apagar áreas existentes 0511 Escher Spiral 0511 Espiral de Escher 0512 Exceed 50 anchor points 0512 Excede 50 pontos de ancoragem 0513 Export Files 0513 Exportar Arquivos 0514 Export selected image files to another folder 0514 Exportar arquivos de imagem selecionados para outra pasta 0515 FILE MENU 0515 MENU DE ARQUIVO 0516 FILE SAVE 0516 SALVAR ARQUIVO 0517 FILE VIEW 0517 VISUALIZAÇÃO DE ARQUIVO 0518 FIND AREA GAP 0518 ENCONTRAR LACUNA NA ÁREA 0519 FIND BAD FILES 0519 ENCONTRAR ARQUIVOS COM DEFEITO 0520 FIND DUPLICATES 0520 ENCONTRAR DUPLICATAS 0521 FIRST INDEX 0521 PRIMEIRA INDEXAÇÃO 0522 FIRST STARTUP 0522 PRIMEIRA INICIALIZAÇÃO 0523 FIX META 0523 CORRIGIR META 0524 FLATTEN HISTOGRAM 0524 ACHATAR HISTOGRAMA 0525 FLATTEN PHOTO 0525 ACHATAR FOTO 0526 FOLDER TREE 0526 ÁRVORE DE PASTAS 0527 FOTOCX FOR WINDOWS 11 0527 FOTOCX PARA WINDOWS 11 0528 FOTOCX LIMITATIONS 0528 LIMITAÇÕES DO FOTOCX 0529 FOTOCX USAGE 0529 USO DO FOTOCX 0530 FRINGES 0530 FRANJAS 0531 FUSION 0531 FUSÃO 0532 Fetch 0532 Buscar 0533 File 0533 Arquivo 0534 File Mod Date/Time 0534 Data/Hora de Modificação do Arquivo 0535 File Name 0535 Nome do Arquivo 0536 File Name/Number 0536 Nome/Número do Arquivo 0537 File Name: %s \n 0537 Nome do Arquivo: %s \n 0538 File Size (bytes) 0538 Tamanho do Arquivo (bytes) 0539 File View 0539 Visualização de Arquivo 0540 File count: 0540 Contagem de arquivos: 0541 File type cannot be edited 0541 O tipo de arquivo não pode ser editado 0542 File1 0542 Arquivo1 0543 File2 0543 Arquivo2 0544 File: 0544 Arquivo: 0545 File: new session, open, rename, copy/move, delete, print 0545 Arquivo: nova sessão, abrir, renomear, copiar/mover, excluir, imprimir 0546 Fill selected areas or transparent areas with a color 0546 Preencher áreas selecionadas ou áreas transparentes com uma cor 0547 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0547 Preencher áreas selecionadas com cor para verificação visual. \nMétodo 1: clique com o botão esquerdo em cada área selecionada ainda não preenchida. \nMétodo 2: clique com o botão direito FORA de todas as áreas selecionadas. \nPressione o botão [ajuda] para esclarecimentos 0548 Find 0548 Buscar 0549 Find Bad Files 0549 Encontrar Arquivos com Defeito 0550 Find Duplicate Images 0550 Encontrar Imagens Duplicadas 0551 Find Duplicates 0551 Encontrar Duplicatas 0552 Find Gap 0552 Encontrar Lacuna 0553 Find a gap in an area outline 0553 Encontrar uma lacuna no contorno de uma área 0554 Find all images for a location [date range] 0554 Encontrar todas as imagens de um local [intervalo de datas] 0555 Find all images for a selected tag name and value 0555 Encontrar todas as imagens de um nome e valor de tag selecionados 0556 Find images meeting multiple search criteria 0556 Encontrar imagens que atendam a vários critérios de busca 0557 Find optimum factors: 0557 Encontrar fatores ótimos: 0558 Finish 0558 Concluir 0559 Finish Area 0559 Concluir Área 0560 Fix Bad File 0560 Corrigir Arquivo com Defeito 0561 Fix Broken Metadata 0561 Corrigir Metadata Corrompida 0562 Fix Meta 0562 Corrigir Meta 0563 Fix Motion Blur 0563 Corrigir Desfoque de Movimento 0564 Fix Perspective 0564 Corrigir Perspectiva 0565 Fix color fringes (chromatic aberration) 0565 Corrigir franjas de cor (aberração cromática) 0566 Fix perspective for object photographed from an angle 0566 Corrigir perspectiva de objeto fotografado de um ângulo 0567 Fix red-eyes from flash photo 0567 Corrigir olhos vermelhos de foto com flash 0568 Flatten 0568 Achatar 0569 Flatten Histogram 0569 Achatar Histograma 0570 Flatten Pano 0570 Achatar Panorama 0571 Flatten Photo 0571 Achatar Foto 0572 Flatten brightness histogram to enhance details 0572 Achatar histograma de brilho para realçar detalhes 0573 Flatten curved surface. 0573 Achatar superfície curva. 0574 Flatten photo of a curved image (e.g. poster on round column 0574 Achatar foto de uma imagem curva (ex.: pôster em uma coluna redonda) 0575 Flip 0575 Espelhar 0576 Folder Tree 0576 Árvore de Pastas 0577 Folders 0577 Pastas 0578 Folders for image files (subfolders included automatically) 0578 Pastas para arquivos de imagem (subpastas incluídas automaticamente) 0579 Font 0579 Fonte 0580 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0580 Para sequência aleatória de imagens, este valor é \na frequência relativa para mostrar a imagem. \nValor base é 10. 20 --> mostrar 2x mais vezes. 0581 Foreground 0581 Primeiro Plano 0582 Fotocx copyright notice 0582 Aviso de direitos autorais do Fotocx 0583 Fotocx home 0583 Página inicial do Fotocx 0584 Fotocx privacy policy 0584 Política de privacidade do Fotocx 0585 Fotocx video tutorial on YouTube 0585 Tutorial em vídeo do Fotocx no YouTube 0586 Fotocx web site (information and downloads) 0586 Site do Fotocx (informações e downloads) 0587 FreeSans 0587 FreeSans 0588 Full List 0588 Lista Completa 0589 Full Screen 0589 Tela Cheia 0590 Fusion 0590 Fusão 0591 GALLERY END 0591 FIM DA GALERIA 0592 GALLERY FILTER 0592 FILTRO DA GALERIA 0593 GALLERY HOME 0593 INÍCIO DA GALERIA 0594 GALLERY MENU 0594 MENU DA GALERIA 0595 GALLERY OVERVIEW 0595 VISÃO GERAL DA GALERIA 0596 GALLERY SORT 0596 CLASSIFICAÇÃO DA GALERIA 0597 GALLERY TO ALBUM 0597 GALERIA PARA ÁLBUM 0598 GALLERY VIEW 0598 VISUALIZAÇÃO DA GALERIA 0599 GDK pixbuf: cannot save file 0599 GDK pixbuf: não é possível salvar o arquivo 0600 GLOBAL RETINEX 0600 RETINEX GLOBAL 0601 GRID SETTINGS 0601 CONFIGURAÇÕES DE GRADE 0602 Gallery 0602 Galeria 0603 Gallery End 0603 Fim da Galeria 0604 Gallery Filter 0604 Filtro da Galeria 0605 Gallery Home 0605 Início da Galeria 0606 Gallery Sort 0606 Classificação da Galeria 0607 Gallery View 0607 Visualização da Galeria 0608 Gallery of newest image files 0608 Galeria dos arquivos de imagem mais novos 0609 Gallery of recently viewed image files 0609 Galeria dos arquivos de imagem vistos recentemente 0610 Gallery to Album 0610 Galeria para Álbum 0611 Gallery view with thumbnails and basic metadata 0611 Visualização de galeria com thumbnails e metadata básica 0612 Gallery view with thumbnails and file data 0612 Visualização de galeria com thumbnails e dados do arquivo 0613 Gallery: thumbnails, new/recent, sort, select, bookmarks 0613 Galeria: thumbnails, novo/recente, classificar, selecionar, marcadores 0614 Generate an inward spiraling repeating image 0614 Gerar uma imagem repetitiva em espiral para dentro 0615 Global Retinex 0615 Retinex Global 0616 Gradual 0616 Gradual 0617 Graduated Blur 0617 Desfoque Gradual 0618 Graduated Blur - blur relative to pixel contrast 0618 Desfoque Gradual - desfoque relativo ao contraste do pixel 0619 Grayscale 0619 Escala de Cinza 0620 Green 0620 Verde 0621 Grid Settings 0621 Configurações de Grade 0622 Group by country 0622 Agrupar por país 0623 Group by country/date 0623 Agrupar por país/data 0624 Group by country/location 0624 Agrupar por país/local 0625 Group by country/location/date 0625 Agrupar por país/local/data 0626 Group by date/country 0626 Agrupar por data/país 0627 Group by date/country/location 0627 Agrupar por data/país/local 0628 HDF 0628 HDF 0629 HDR 0629 HDR 0630 HELP MENU 0630 MENU DE AJUDA 0631 Hard 0631 Forte 0632 Height 0632 Altura 0633 Height: 0633 Altura: 0634 Help 0634 Ajuda 0635 Help: user guide, tutorial, change log, licenses, privacy, about 0635 Ajuda: guia do usuário, tutorial, registro de alterações, licenças, privacidade, sobre 0636 Hide 0636 Ocultar 0637 Hide selected areas 0637 Ocultar áreas selecionadas 0638 High 0638 Alto 0639 High Depth of Field - combine near/far focus images for deeper focus 0639 Alta Profundidade de Campo - combina imagens com foco próximo/distante para foco mais profundo 0640 High Dynamic Range - combine bright/dark images for better detail 0640 Alta Faixa Dinâmica - combina imagens claras/escuras para melhor detalhe 0641 Highlight darkest and brightest pixels 0641 Realçar pixels mais escuros e mais claros 0642 Home Folder 0642 Pasta Home 0643 Home Page 0643 Página Inicial 0644 Horz 0644 Horiz. 0645 How to remove Fotocx application and user files 0645 Como remover o aplicativo Fotocx e os arquivos do usuário 0646 Hue 0646 Matiz 0647 IMAGE ARRAY 0647 ARRAY DE IMAGENS 0648 INDEX FILES 0648 INDEXAR ARQUIVOS 0649 INSIDE-OUT 0649 DE DENTRO PARA FORA 0650 INVERT AREA 0650 INVERTER ÁREA 0651 Icon size 0651 Tamanho do ícone 0652 Icons 0652 Ícones 0653 Image 0653 Imagem 0654 Image Array 0654 Array de Imagens 0655 Image Columns 0655 Colunas da Imagem 0656 Image Differences 0656 Diferenças de Imagem 0657 Image File 0657 Arquivo de Imagem 0658 Image File: 0658 Arquivo de Imagem: 0659 Image Keywords 0659 Keywords da Imagem 0660 Image Locations 0660 Locais da Imagem 0661 Image Markup 0661 Marcação da Imagem 0662 Image Position 0662 Posição da Imagem 0663 Image Preferences 0663 Preferências da Imagem 0664 Image Ratios 0664 Proporções da Imagem 0665 Image Size (pixels) 0665 Tamanho da Imagem (pixels) 0666 Image Time 0666 Hora da Imagem 0667 Image Timeline 0667 Linha do Tempo da Imagem 0668 Image colors are converted for printing. 0668 As cores da imagem são convertidas para impressão. 0669 Image dimensions have changed \nCopy Prior Edit cannot be used 0669 As dimensões da imagem foram alteradas \nCopiar Edição Anterior não pode ser usado 0670 Image dimensions have changed, \nArea Blend cannot be used 0670 As dimensões da imagem foram alteradas, \nMesclar Área não pode ser usado 0671 Image dimensions have changed, \nthis prior image cannot be used 0671 As dimensões da imagem foram alteradas, \nesta imagem anterior não pode ser usada 0672 Image is fixed, unmovable 0672 A imagem está fixa, não pode ser movida 0673 Images sizes are not compatible 0673 Os tamanhos das imagens não são compatíveis 0674 Include: 0674 Incluir: 0675 Index Files 0675 Indexar Arquivos 0676 Index Level 0676 Nível de Índice 0677 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0677 A função de indexação foi encerrada. \nA indexação é necessária para as funções de busca e mapa \ne para que as páginas de galeria de thumbnails sejam exibidas rapidamente. 0678 Index new image files and make thumbnails 0678 Indexar novos arquivos de imagem e criar thumbnails 0679 Input color to match and adjust: 0679 Cor de entrada para combinar e ajustar: 0680 Inside-out 0680 De Dentro para Fora 0681 Install following programs using your package manager: \n 0681 Instale os seguintes programas usando seu gerenciador de pacotes: \n 0682 Intensity 0682 Intensidade 0683 Invert 0683 Inverter 0684 Invert selected areas (selected ↔ not selected) 0684 Inverter áreas selecionadas (selecionada ↔ não selecionada) 0685 Irregular Tiles 0685 Ladrilhos Irregulares 0686 Iterations 0686 Iterações 0687 JPEG ARTIFACTS 0687 ARTEFATOS JPEG 0688 JPEG Artifacts 0688 Artefatos JPEG 0689 JPEG files 0689 arquivos JPEG 0690 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0690 Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez 0691 Jump to gallery beginning [home] 0691 Ir para o início da galeria [home] 0692 Jump to gallery end [end] 0692 Ir para o fim da galeria [end] 0693 KEYBOARD ESCAPE KEY 0693 TECLA ESC DO TECLADO 0694 KEYBOARD SHORTCUTS 0694 ATALHOS DE TECLADO 0695 KEYWORDS OVERVIEW 0695 VISÃO GERAL DE KEYWORDS 0696 Keep 0696 Manter 0697 Kernel size 0697 Tamanho do kernel 0698 Keyboard Shortcuts 0698 Atalhos de Teclado 0699 Keywords Category 0699 Categoria de Keywords 0700 Kill active dialog? 0700 Encerrar caixa de diálogo ativa? 0701 Kill busy function? 0701 Encerrar função em execução? 0702 Kuwahara 0702 Kuwahara 0703 Kuwahara Depth 0703 Profundidade Kuwahara 0704 LINE COLOR 0704 COR DA LINHA 0705 LOAD/SAVE AREA 0705 CARREGAR/SALVAR ÁREA 0706 LOCAL CONTRAST 0706 CONTRASTE LOCAL 0707 LOCAL RETINEX 0707 RETINEX LOCAL 0708 Language 0708 Idioma 0709 Layout and background image 0709 Layout e imagem de fundo 0710 Left 0710 Esquerda 0711 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0711 Arraste com o botão esquerdo dentro da área \npara desfazer gradualmente as edições da área. \nArraste com o botão direito para restaurar as edições. \nArraste ao longo da borda da área para mesclar a borda. 0712 Left/right click: previous/next image (also arrow keys) 0712 Clique esquerdo/direito: imagem anterior/próxima (também teclas de seta) 0713 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0713 Clique esquerdo/direito: desfazer/refazer uma etapa de edição \nClique do meio: voltar para a etapa de edição selecionada 0714 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0714 Clique esquerdo/direito: zoom da imagem/thumbnail para dentro/fora (também teclas +/-) 0715 Length 0715 Comprimento 0716 Level 0716 Nível 0717 Licenses 0717 Licenças 0718 Light Source 0718 Fonte de Luz 0719 Lightness 0719 Luminosidade 0720 Limit 0720 Limite 0721 Line Color 0721 Cor da Linha 0722 Line Threshold 0722 Limite de Linha 0723 Line Width 0723 Largura da Linha 0724 Line length 0724 Comprimento da linha 0725 List Fotocx command line parameters 0725 Listar parâmetros de linha de comando do Fotocx 0726 List all metadata for current image or clicked thumbnail 0726 Listar toda a metadata da imagem atual ou da thumbnail clicada 0727 List outboard programs and functions 0727 Listar programas e funções externas 0728 Load 0728 Carregar 0729 Load settings from file 0729 Carregar configurações do arquivo 0730 Local Contrast 0730 Contraste Local 0731 Local Retinex 0731 Retinex Local 0732 Location 0732 Localização 0733 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0733 A localização e o país substituirão os valores atuais.\nOs dados de GPS só são substituídos se houver um novo valor. 0734 Lock 0734 Bloquear 0735 Low Amplify 0735 Amplificação Baixa 0736 MAGNIFY IMAGE 0736 AMPLIAR IMAGEM 0737 MAKE WAVES 0737 CRIAR ONDAS 0738 MANAGE KEYWORDS 0738 GERENCIAR KEYWORDS 0739 MAP MENU 0739 MENU DE MAPA 0740 MAP VIEW 0740 VISUALIZAÇÃO DE MAPA 0741 MARGINS 0741 MARGENS 0742 MARKUP 0742 MARCAÇÃO 0743 MASHUP 0743 MASHUP 0744 MATCH COLORS 0744 COMBINAR CORES 0745 MEASURE IMAGE 0745 MEDIR IMAGEM 0746 MENU SHORTCUTS 0746 ATALHOS DE MENU 0747 METADATA MENU 0747 MENU DE METADATA 0748 METADATA TAGS 0748 TAGS DE METADATA 0749 METADATA VIEW 0749 VISUALIZAÇÃO DE METADATA 0750 MONITOR COLOR 0750 COR DO MONITOR 0751 MOSAIC 0751 MOSAICO 0752 MOUSE ALT-RIGHT-BUTTON 0752 MOUSE ALT+BOTÃO DIREITO 0753 MOUSE FUNCTIONS 0753 FUNÇÕES DO MOUSE 0754 MOUSE OWNERSHIP 0754 PROPRIEDADE DO MOUSE 0755 MOVE FOTOCX HOME 0755 MOVER PASTA HOME DO FOTOCX 0756 Magnify 0756 Ampliar 0757 Magnify Image 0757 Ampliar Imagem 0758 Magnify image around the mouse position 0758 Ampliar imagem ao redor da posição do mouse 0759 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0759 A memória principal é insuficiente para executar o Fotocx. \nVocê pode tentar mesmo assim, se desejar. \n Continuar? 0760 Make Layout Image 0760 Criar Imagem de Layout 0761 Make Square Tiles 0761 Criar Ladrilhos Quadrados 0762 Make Waves 0762 Criar Ondas 0763 Make a spherical projection of an image 0763 Criar uma projeção esférica de uma imagem 0764 Make black margins transparent 0764 Tornar margens pretas transparentes 0765 Make new versions 0765 Criar novas versões 0766 Make width constant for window size 0766 Manter a largura constante para o tamanho da janela 0767 Manage Keywords 0767 Gerenciar Keywords 0768 Map 0768 Mapa 0769 Map View 0769 Visualização de Mapa 0770 Maps 0770 Mapas 0771 Maps: view images by map location 0771 Mapas: veja as imagens por localização no mapa 0772 Margin 0772 Margem 0773 Margins 0773 Margens 0774 Markup 0774 Marcação 0775 Mashup 0775 Mashup 0776 Mass update album files 0776 Atualizar em massa os arquivos do álbum 0777 Match Brightness 0777 Combinar Brilho 0778 Match Colors 0778 Combinar Cores 0779 Match Level 0779 Nível de Combinação 0780 Match Limit 0780 Limite de Combinação 0781 Match image colors to colors of another image 0781 Combinar as cores da imagem com as cores de outra imagem 0782 Match using: 0782 Combinar usando: 0783 Matching Keywords 0783 Keywords Correspondentes 0784 Max 0784 Máx. 0785 Max. Width 0785 Largura Máx. 0786 Measure Image 0786 Medir Imagem 0787 Measure Noise 0787 Medir Ruído 0788 Measure pixel distances within an image 0788 Medir distâncias de pixel dentro de uma imagem 0789 Menu Colors 0789 Cores do Menu 0790 Menu Style 0790 Estilo do Menu 0791 Metadata 0791 Metadata 0792 Metadata Tags 0792 Tags de Metadata 0793 Metadata View 0793 Visualização de Metadata 0794 Metadata from Search Function 0794 Metadata da Função de Busca 0795 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0795 Método 1:\nClique com o botão esquerdo no olho vermelho para escurecer.\nMétodo 2:\nArraste para baixo e para a direita para envolver o olho vermelho.\nClique com o botão esquerdo no olho vermelho para escurecer.\nDesfazer olho vermelho:\nClique com o botão direito no olho vermelho. 0796 Mirror: 0796 Espelho: 0797 Mode: 0797 Modo: 0798 Monitor Color 0798 Cor do Monitor 0799 Mosaic 0799 Mosaico 0800 Mouse Radius 0800 Raio do Mouse 0801 Mouse Warp (drag image) 0801 Distorção com Mouse (arrastar imagem) 0802 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0802 Arraste o mouse: gire a imagem 360° \nClique com botão esq./dir. do mouse: zoom para dentro/fora \nEscape: sair da visualização de panorama 0803 Move %d image files 0803 Mover %d arquivos de imagem 0804 Move Fotocx Home 0804 Mover Pasta Home do Fotocx 0805 Move Fotocx Home Folder 0805 Mover Pasta Home do Fotocx 0806 Move Fotocx home folder to chosen folder 0806 Mover a pasta home do Fotocx para a pasta escolhida 0807 Move mouse in a monotone image area. 0807 Mova o mouse em uma área monótona da imagem. 0808 Multiplier 0808 Multiplicador 0809 NEW SESSION 0809 NOVA SESSÃO 0810 NEWEST FILES 0810 ARQUIVOS MAIS NOVOS 0811 NEWLINE CHARACTERS IN METADATA 0811 CARACTERES DE NOVA LINHA NA METADATA 0812 NON-STANDARD DIALOG WIDGETS 0812 WIDGETS DE DIÁLOGO NÃO PADRÃO 0813 New Area 0813 Nova Área 0814 New File Name: 0814 Novo Nome de Arquivo: 0815 New Location 0815 Novo Local 0816 New Location: 0816 Novo Local: 0817 New Name 0817 Novo Nome 0818 New Session 0818 Nova Sessão 0819 New Type: 0819 Novo Tipo: 0820 New Version 0820 Nova Versão 0821 Newest 0821 Mais Novo 0822 Newest Files 0822 Arquivos Mais Novos 0823 Next 0823 Próximo 0824 Next gallery 0824 Próxima galeria 0825 No 0825 Não 0826 No curve lines found 0826 Nenhuma linha de curva encontrada 0827 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0827 Nenhum índice de arquivo de imagem foi encontrado.\nUm índice de arquivo de imagem será criado.\nSeus arquivos de imagem não serão alterados.\nIsso pode levar bastante tempo se você \ntiver muitos milhares de arquivos de imagem. 0828 No images found 0828 Nenhuma imagem encontrada 0829 Noise Reduction 0829 Redução de Ruído 0830 Noise Size 0830 Tamanho do Ruído 0831 None 0831 Nenhum 0832 Normal Blur 0832 Desfoque Normal 0833 Normal Blur - mix pixels with all neighbor pixels 0833 Desfoque Normal - mistura pixels com todos os pixels vizinhos 0834 OPEN IMAGE FILE 0834 ABRIR ARQUIVO DE IMAGEM 0835 OTHER TOPICS 0835 OUTROS TÓPICOS 0836 OUTLINES 0836 CONTORNOS 0837 Old Name 0837 Nome Antigo 0838 One Tag: 0838 Uma Tag: 0839 Opacity 0839 Opacidade 0840 Open 0840 Abrir 0841 Open Image File 0841 Abrir Arquivo de Imagem 0842 Open a file and paste as selected area into an image 0842 Abrir um arquivo e colar como área selecionada em uma imagem 0843 Open a parallel Fotocx session 0843 Abrir uma sessão paralela do Fotocx 0844 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0844 Abrir e editar o arquivo da tabela de cores escaneada. \nRemova qualquer inclinação ou rotação da digitalização. \n(Use a função Corrigir Perspectiva para isso). \nCorte a fina margem verde COM PRECISÃO. \nSalve (substitua) o arquivo da tabela de cores. 0845 Open the trimmed color chart file 0845 Abrir o arquivo da tabela de cores aparada 0846 Optimize 0846 Otimizar 0847 Other Tag ... 0847 Outra Tag ... 0848 Outboard Programs 0848 Programas Externos 0849 Outline Drawing 0849 Desenho de Contornos 0850 Outlines 0850 Contornos 0851 Output Color 0851 Cor de Saída 0852 Overlap 0852 Sobreposição 0853 Overlay position in host image: 0853 Posição da sobreposição na imagem hospedeira: 0854 Overlay width, % host image width: 0854 Largura da sobreposição, % da largura da imagem hospedeira: 0855 Overwrite file? \n%s 0855 Substituir arquivo? \n%s 0856 PAINT EDITS 0856 PINTAR EDIÇÕES 0857 PAINT IMAGE 0857 PINTAR IMAGEM 0858 PAINT TRANSPARENCY 0858 PINTAR TRANSPARÊNCIA 0859 PAINTING 0859 PINTURA 0860 PANORAMA 0860 PANORAMA 0861 PATTERN 0861 PADRÃO 0862 PERSPECTIVE 0862 PERSPECTIVA 0863 PLACES/DATES 0863 LOCAIS/DATAS 0864 PLUGINS 0864 PLUGINS 0865 PREV/NEXT 0865 ANTERIOR/PRÓXIMO 0866 PRINT CALIBRATED 0866 IMPRIMIR CALIBRADO 0867 PRINT IMAGE 0867 IMPRIMIR IMAGEM 0868 PRIVACY 0868 PRIVACIDADE 0869 PROBLEM FILES 0869 ARQUIVOS COM PROBLEMA 0870 PROBLEM REPORTING 0870 RELATO DE PROBLEMAS 0871 Paint Edits 0871 Pintar Edições 0872 Paint Edits already active 0872 Pintar Edições já está ativo 0873 Paint Image 0873 Pintar Imagem 0874 Paint Image Transparencies 0874 Pintar Transparências da Imagem 0875 Paint Radius 0875 Raio de Pintura 0876 Paint Transparency 0876 Pintar Transparência 0877 Paint and Warp Image 0877 Pintar e Distorcer Imagem 0878 Paint current edit function gradually using the mouse 0878 Pintar a função de edição atual gradualmente usando o mouse 0879 Paint entire image 0879 Pintar a imagem inteira 0880 Paint image transparency using the mouse 0880 Pintar transparência da imagem usando o mouse 0881 Paint on Image 0881 Pintar na Imagem 0882 Paint on image using the mouse 0882 Pintar na imagem usando o mouse 0883 Paint transparency 0883 Pintar transparência 0884 Paint within mouse 0884 Pintar dentro do mouse 0885 Painting 0885 Pintura 0886 Panorama 0886 Panorama 0887 Paste 0887 Colar 0888 Paste Image 0888 Colar Imagem 0889 Paste previously copied area into image 0889 Colar área copiada anteriormente na imagem 0890 Pattern 0890 Padrão 0891 Pattern File: 0891 Arquivo de Padrão: 0892 Pattern Width 0892 Largura do Padrão 0893 Percent 0893 Porcentagem 0894 Permissions 0894 Permissões 0895 Perspective 0895 Perspectiva 0896 Photo Date 0896 Data da Foto 0897 Photo Date/Time 0897 Data/Hora da Foto 0898 Photo Date/Time (metadata) 0898 Data/Hora da Foto (metadata) 0899 Photo Date: %s File Date: %s \n 0899 Data da Foto: %s Data do Arquivo: %s \n 0900 Pixel count 0900 Contagem de pixels 0901 Pixel difference 0901 Diferença de pixels 0902 Pixels 0902 Pixels 0903 Places/Dates 0903 Locais/Datas 0904 Plugin working ... 0904 Plugin em execução ... 0905 Popup Image 0905 Imagem Popup 0906 Power 0906 Potência 0907 Power Center 0907 Centro de Potência 0908 Power: Center 0908 Potência: Centro 0909 Pre-align Images 0909 Pré-alinhar Imagens 0910 Preference: 0910 Preferência: 0911 Press F1 for help 0911 Pressione F1 para ajuda 0912 Prev 0912 Anterior 0913 Prev/Next 0913 Anterior/Próximo 0914 Previous 0914 Anterior 0915 Previous gallery 0915 Galeria anterior 0916 Print Calibrated 0916 Imprimir Calibrado 0917 Print Image 0917 Imprimir Imagem 0918 Print chart in vertical orientation without margins. 0918 Imprima a tabela em orientação vertical sem margens. 0919 Print current image file with calibrated colors 0919 Imprimir arquivo de imagem atual com cores calibradas 0920 Print the current image file 0920 Imprimir o arquivo de imagem atual 0921 Privacy 0921 Privacidade 0922 Proceed 0922 Continuar 0923 Proceed? 0923 Continuar? 0924 Process album files matching selected files: 0924 Processar arquivos de álbum que correspondem aos arquivos selecionados: 0925 Process an image using a custom convolution kernel 0925 Processar uma imagem usando um kernel de convolução personalizado 0926 Process selected album files: 0926 Processar arquivos de álbum selecionados: 0927 Processing files 0927 Processando arquivos 0928 Project name 0928 Nome do projeto 0929 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0929 Puxe uma posição da imagem usando o mouse. \nFaça vários puxões com o mouse até ficar satisfeito. \nQuando terminar, pressione [OK]. 0930 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0930 Puxe um canto da imagem usando o mouse. \nFaça vários puxões com o mouse até ficar satisfeito. \nQuando terminar, pressione [OK]. 0931 Pull on the image with the mouse. 0931 Puxe a imagem com o mouse. 0932 Purge unwanted keywords from all image files 0932 Remover keywords indesejadas de todos os arquivos de imagem 0933 QUESTIONS, SUGGESTIONS 0933 PERGUNTAS, SUGESTÕES 0934 Quit 0934 Sair 0935 Quit Fotocx 0935 Sair do Fotocx 0936 Quit Fotocx? 0936 Sair do Fotocx? 0937 RAW Files 0937 Arquivos RAW 0938 RAW Options 0938 Opções RAW 0939 RAW conversion failed: %s %s 0939 Falha na conversão RAW: %s %s 0940 RAW loader 0940 Carregador RAW 0941 RECENT FILES 0941 ARQUIVOS RECENTES 0942 RECENT FOLDERS 0942 PASTAS RECENTES 0943 RED EYES 0943 OLHOS VERMELHOS 0944 REFINE MENU 0944 MENU DE REFINAMENTO 0945 REMOVE DUST 0945 REMOVER POEIRA 0946 REMOVE HALO 0946 REMOVER HALO 0947 RENAME 0947 RENOMEAR 0948 RENAME ALBUM 0948 RENOMEAR ÁLBUM 0949 REPAIR MENU 0949 MENU DE REPARO 0950 RESCALE 0950 REDIMENSIONAR 0951 RETOUCH 0951 RETOCAR 0952 RGB -> BRG 0952 RGB -> BRG 0953 RGB -> GBR 0953 RGB -> GBR 0954 RGB HISTOGRAM 0954 HISTOGRAMA RGB 0955 RGB Histogram 0955 Histograma RGB 0956 RGB brightness histogram graph 0956 Gráfico do histograma de brilho RGB 0957 RGB color 0957 cor RGB 0958 RGB mix with given bit-depth 0958 Mistura RGB com profundidade de bits definida 0959 ROTATE 0959 GIRAR 0960 RUN SCRIPT 0960 EXECUTAR SCRIPT 0961 Radial Blur 0961 Desfoque Radial 0962 Radial Blur - mix pixels in radial lines from chosen center 0962 Desfoque Radial - mistura pixels em linhas radiais a partir do centro escolhido 0963 Radius 0963 Raio 0964 Random Image 0964 Imagem Aleatória 0965 Range 0965 Intervalo 0966 Rating: 0966 Avaliação: 0967 Rating: %s Size: %s %.2fmb \n 0967 Avaliação: %s Tamanho: %s %.2fmb \n 0968 Read or search the user guide 0968 Ler ou pesquisar o guia do usuário 0969 Recent Files 0969 Arquivos Recentes 0970 Recent Folders 0970 Pastas Recentes 0971 Recent Keywords 0971 Keywords Recentes 0972 Rectify closeup face photo (balloon face) 0972 Corrigir foto de rosto em close-up (efeito rosto de balão) 0973 Red 0973 Vermelho 0974 Red Eye Reduction 0974 Redução de Olhos Vermelhos 0975 Red Eyes 0975 Olhos Vermelhos 0976 Red Factors 0976 Fatores de Vermelho 0977 Redo 0977 Refazer 0978 Reduce Fog/Haze 0978 Reduzir Névoa/Neblina 0979 Reduce fog/haze in an image or selected areas 0979 Reduzir névoa/neblina em uma imagem ou áreas selecionadas 0980 Refine 0980 Refinar 0981 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0981 Refinar: achatar histograma, contraste local, amplificar contraste, retinex, saturação 0982 Remove 0982 Remover 0983 Remove Dust 0983 Remover Poeira 0984 Remove Halo 0984 Remover Halo 0985 Remove dust spots from old scanned photos 0985 Remover manchas de poeira de fotos antigas escaneadas 0986 Remove from Album 0986 Remover do Álbum 0987 Remove halos left by some edit functions 0987 Remover halos deixados por algumas funções de edição 0988 Remove image curvature, especially in panoramas 0988 Remover curvatura da imagem, especialmente em panoramas 0989 Remove jaggies on hard image feature edges 0989 Remover serrilhado em bordas de características rígidas da imagem 0990 Remove selected image metadata 0990 Remover metadata selecionada da imagem 0991 Remove unwanted objects in an image 0991 Remover objetos indesejados de uma imagem 0992 Rename 0992 Renomear 0993 Rename Album 0993 Renomear Álbum 0994 Rename Image File 0994 Renomear Arquivo de Imagem 0995 Rename an existing album 0995 Renomear um álbum existente 0996 Rename or delete keywords for all image files 0996 Renomear ou excluir keywords de todos os arquivos de imagem 0997 Rename to 0997 Renomear para 0998 Rename/convert/rescale/move selected image or RAW files 0998 Renomear/converter/redimensionar/mover arquivos de imagem ou RAW selecionados 0999 Repair 0999 Reparar 1000 Repair malformed metadata preventing metadata edits 1000 Reparar metadata malformada que impede edições de metadata 1001 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 1001 Reparo: nitidez, desfoque, redução de ruído, remoção de névoa, olhos vermelhos, apagar inteligente, ajuste de cor 1002 Replace 1002 Substituir 1003 Replace Text 1003 Substituir Texto 1004 Replace all versions with newest version 1004 Substituir todas as versões pela versão mais recente 1005 Replace all versions with selected versions 1005 Substituir todas as versões pelas versões selecionadas 1006 Replace all with newest version only 1006 Substituir tudo apenas pela versão mais recente 1007 Replace all with original + newest version 1007 Substituir tudo pelo original + versão mais recente 1008 Replace all with original + selected versions 1008 Substituir tudo pelo original + versões selecionadas 1009 Replace all with original and all versions 1009 Substituir tudo pelo original e todas as versões 1010 Replace all with selected versions 1010 Substituir tudo pelas versões selecionadas 1011 Replace host files 1011 Substituir arquivos hospedeiros 1012 Report Image Places/Dates 1012 Relatar Locais/Datas da Imagem 1013 Report selected metadata for selected image files 1013 Relatar metadata selecionada dos arquivos de imagem selecionados 1014 Required programs are installed. \n 1014 Os programas necessários estão instalados. \n 1015 Rescale 1015 Redimensionar 1016 Rescale Image 1016 Redimensionar Imagem 1017 Rescale RGB levels to reduce color caste and fog/haze 1017 Redimensionar níveis RGB para reduzir tom de cor e névoa/neblina 1018 Rescale brightness levels to increase local contrast 1018 Redimensionar níveis de brilho para aumentar o contraste local 1019 Rescale: 1019 Redimensionar: 1020 Reserved Shortcuts \n 1020 Atalhos Reservados \n 1021 Reserved shortcut ignored: %s 1021 Atalho reservado ignorado: %s 1022 Reset 1022 Redefinir 1023 Reset all galleries to file name ascending 1023 Redefinir todas as galerias para ordem crescente de nome de arquivo 1024 Resolution 1024 Resolução 1025 Resources 1025 Recursos 1026 Resume 1026 Retomar 1027 Retouch 1027 Retocar 1028 Reverse R 1028 Inverter R 1029 Richardson-Lucy 1029 Richardson-Lucy 1030 Right 1030 Direita 1031 Rim % 1031 Borda % 1032 Rotate 1032 Girar 1033 Rotate Image 1033 Girar Imagem 1034 Rotate or level an image 1034 Girar ou nivelar uma imagem 1035 Rotate: 1035 Girar: 1036 Roy Lichtenstein effect 1036 Efeito Roy Lichtenstein 1037 SATURATION 1037 SATURAÇÃO 1038 SCRIPT FILES 1038 ARQUIVOS DE SCRIPT 1039 SEARCH IMAGES 1039 BUSCAR IMAGENS 1040 SELECT AREA 1040 SELECIONAR ÁREA 1041 SELECT FILES 1041 SELECIONAR ARQUIVOS 1042 SELECT IMAGE FILES 1042 SELECIONAR ARQUIVOS DE IMAGEM 1043 SELECT MENU 1043 MENU DE SELEÇÃO 1044 SET COLORS 1044 DEFINIR CORES 1045 SET WALLPAPER 1045 DEFINIR PAPEL DE PAREDE 1046 SETTINGS 1046 CONFIGURAÇÕES 1047 SHARPEN 1047 NITIDEZ 1048 SHIFT COLORS 1048 DESLOCAR CORES 1049 SHORTCUTS 1049 ATALHOS 1050 SHOW CIM FILES 1050 MOSTRAR ARQUIVOS CIM 1051 SHOW DIFFS 1051 MOSTRAR DIFERENÇAS 1052 SHOW ON MAP 1052 MOSTRAR NO MAPA 1053 SHOW RESOURCES 1053 MOSTRAR RECURSOS 1054 SHOW RGB 1054 MOSTRAR RGB 1055 SHOW/HIDE AREA 1055 MOSTRAR/OCULTAR ÁREA 1056 SKETCH1 1056 ESBOÇO1 1057 SKETCH2 1057 ESBOÇO2 1058 SLIDE SHOW 1058 APRESENTAÇÃO DE SLIDES 1059 SLIDES AND NEGATIVES 1059 SLIDES E NEGATIVOS 1060 SLIDESHOW END 1060 FIM DA APRESENTAÇÃO DE SLIDES 1061 SMART ERASE 1061 APAGAR INTELIGENTE 1062 SOFT FOCUS 1062 FOCO SUAVE 1063 SPHERE 1063 ESFERA 1064 SPLIT-SCREEN 1064 TELA DIVIDIDA 1065 STACK/LAYERS 1065 EMPILHAMENTO/CAMADAS 1066 STACK/NOISE 1066 EMPILHAMENTO/RUÍDO 1067 STACK/PAINT 1067 EMPILHAMENTO/PINTURA 1068 Saturation 1068 Saturação 1069 Save 1069 Salvar 1070 Save Gallery as Album 1070 Salvar Galeria como Álbum 1071 Save Image File 1071 Salvar Arquivo de Imagem 1072 Save as new file name or type 1072 Salvar como novo nome ou tipo de arquivo 1073 Save current gallery as album 1073 Salvar galeria atual como álbum 1074 Save modified image as new file or new file version 1074 Salvar imagem modificada como novo arquivo ou nova versão de arquivo 1075 Save selected area to a file with transparency 1075 Salvar área selecionada em um arquivo com transparência 1076 Saved Areas 1076 Áreas Salvas 1077 Scale 1077 Escala 1078 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1078 Escaneie a tabela de cores impressa, com a linha mais escura no topo. \nSalve como arquivo .png usando os nomes de impressora e papel \n(ex.: %s/Epson_glossy.png). \n 1079 Search 1079 Buscar 1080 Search Images 1080 Buscar Imagens 1081 Search Results 1081 Resultados da Busca 1082 Search all image files and report duplicates 1082 Buscar todos os arquivos de imagem e relatar duplicatas 1083 Searching - use ESC key to terminate 1083 Buscando - use a tecla ESC para encerrar 1084 Seconds 1084 Segundos 1085 Select 1085 Selecionar 1086 Select %d to %d files 1086 Selecionar de %d a %d arquivos 1087 Select Album 1087 Selecionar Álbum 1088 Select Albums 1088 Selecionar Álbuns 1089 Select Area 1089 Selecionar Área 1090 Select Area for Edits 1090 Selecionar Área para Edições 1091 Select Area not supported \nby this edit function 1091 Selecionar Área não suportado \npor esta função de edição 1092 Select Files 1092 Selecionar Arquivos 1093 Select Image 1093 Selecionar Imagem 1094 Select Image Files 1094 Selecionar Arquivos de Imagem 1095 Select Metadata tags 1095 Selecionar tags de Metadata 1096 Select Script 1096 Selecionar Script 1097 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1097 Selecione uma área para distorcer usando a função selecionar área. \nPressione [iniciar distorção] e puxe a área com o mouse. \nFaça vários puxões com o mouse até ficar satisfeito. \nQuando terminar, selecione outra área ou pressione [OK]. 1098 Select and Paint Image 1098 Selecionar e Pintar Imagem 1099 Select and view an image file 1099 Selecionar e visualizar um arquivo de imagem 1100 Select area cannot be kept.\nContinue? 1100 A área selecionada não pode ser mantida.\nContinuar? 1101 Select area disabled, Continue? 1101 Área selecionada desativada, Continuar? 1102 Select area not finished, Continue? 1102 Área selecionada não finalizada, Continuar? 1103 Select area will be ignored. \nContinue? 1103 A área selecionada será ignorada. \nContinuar? 1104 Select folder 1104 Selecionar pasta 1105 Select host image files 1105 Selecionar arquivos de imagem hospedeiros 1106 Select image areas to edit separately, copy/paste selections 1106 Selecionar áreas da imagem para editar separadamente, copiar/colar seleções 1107 Select image objects or areas for separate editing 1107 Selecionar objetos ou áreas da imagem para edição separada 1108 Select input files for subsequent function 1108 Selecionar arquivos de entrada para a próxima função 1109 Select overlay file 1109 Selecionar arquivo de sobreposição 1110 Select startup album 1110 Selecionar álbum de inicialização 1111 Select startup folder 1111 Selecionar pasta de inicialização 1112 Select startup image file 1112 Selecionar arquivo de imagem de inicialização 1113 Select the image file to print. 1113 Selecione o arquivo de imagem a imprimir. 1114 Select to add, click on X to delete. 1114 Selecione para adicionar, clique no X para excluir. 1115 Select two files 1115 Selecione dois arquivos 1116 Select versions, ratings, keywords, filename text 1116 Selecionar versões, avaliações, keywords, texto do nome do arquivo 1117 Separation Horz 1117 Separação Horiz. 1118 Sequence Numbers 1118 Números de Sequência 1119 Set Colors 1119 Definir Cores 1120 Set No. of Colors 1120 Definir Núm. de Cores 1121 Set Ratio: 1121 Definir Proporção: 1122 Set Wallpaper 1122 Definir Papel de Parede 1123 Set Width: 1123 Definir Largura: 1124 Set and view bookmarks, select for gallery view 1124 Definir e visualizar marcadores, selecionar para visualização em galeria 1125 Set black-white/color, negative/positive, sepia 1125 Definir preto-branco/cor, negativo/positivo, sépia 1126 Set foreground line color (crop, grid, select, warp) 1126 Definir cor da linha de primeiro plano (corte, grade, seleção, distorção) 1127 Set gallery from latest search results 1127 Definir galeria a partir dos resultados de busca mais recentes 1128 Set gallery from recent folders list 1128 Definir galeria a partir da lista de pastas recentes 1129 Set gallery to folder of current file 1129 Definir galeria para a pasta do arquivo atual 1130 Set horizontal/vertical grid line counts 1130 Definir contagens de linhas de grade horizontal/vertical 1131 Set image file as desktop wallpaper 1131 Definir arquivo de imagem como papel de parede da área de trabalho 1132 Set line properties, [Add] to layout, edit. 1132 Definir propriedades da linha, [Adicionar] ao layout, editar. 1133 Set number of colors for each R/G/B or total 1133 Definir número de cores para cada R/G/B ou total 1134 Set or shift photo date/time for selected image files 1134 Definir ou deslocar data/hora da foto dos arquivos de imagem selecionados 1135 Set the name for the output calibration file \n[your calibration name].dat 1135 Definir o nome do arquivo de calibração de saída \n[seu nome de calibração].dat 1136 Settings 1136 Configurações 1137 Sharpen 1137 Nitidez 1138 Sharpen the image (various methods) 1138 Aplicar nitidez na imagem (vários métodos) 1139 Shift + drag mouse across image \nto indicate blur direction 1139 Pressione Shift + arraste o mouse pela imagem \npara indicar a direção do desfoque 1140 Shift Colors 1140 Deslocar Cores 1141 Shift/convert image colors into other colors 1141 Deslocar/converter cores da imagem em outras cores 1142 Short List 1142 Lista Curta 1143 Show 1143 Mostrar 1144 Show (outline) selected areas 1144 Mostrar (contorno) áreas selecionadas 1145 Show CIM Files 1145 Mostrar Arquivos CIM 1146 Show Diffs 1146 Mostrar Diferenças 1147 Show Fotocx installed version and author contact 1147 Mostrar versão instalada do Fotocx e contato do autor 1148 Show Fotocx updates for recent releases 1148 Mostrar atualizações do Fotocx para versões recentes 1149 Show Hidden 1149 Mostrar Ocultos 1150 Show Log File 1150 Mostrar Arquivo de Registro 1151 Show RGB 1151 Mostrar RGB 1152 Show RGB levels at mouse position 1152 Mostrar níveis RGB na posição do mouse 1153 Show Resources 1153 Mostrar Recursos 1154 Show folder hierarchy, click folder for gallery view 1154 Mostrar hierarquia de pastas, clique na pasta para visualização em galeria 1155 Show image counts in year/month table, select, report 1155 Mostrar contagens de imagens em tabela de ano/mês, selecionar, relatar 1156 Show image description (overlap) 1156 Mostrar descrição da imagem (sobreposta) 1157 Show image differences on the image 1157 Mostrar diferenças de imagem na imagem 1158 Show image file name (overlap) 1158 Mostrar nome do arquivo de imagem (sobreposto) 1159 Show image title (overlap) 1159 Mostrar título da imagem (sobreposto) 1160 Show input files used in combine function 1160 Mostrar arquivos de entrada usados na função de combinação 1161 Show key metadata for current image or clicked thumbnail 1161 Mostrar metadata principal da imagem atual ou da thumbnail clicada 1162 Show map position of the current image file 1162 Mostrar posição no mapa do arquivo de imagem atual 1163 Show memory and CPU resources used 1163 Mostrar recursos de memória e CPU usados 1164 Show on Map 1164 Mostrar no Mapa 1165 Show or make Keyboard Shortcuts 1165 Mostrar ou criar Atalhos de Teclado 1166 Show the current (last used) album 1166 Mostrar o álbum atual (usado por último) 1167 Show the current log file 1167 Mostrar o arquivo de registro atual 1168 Size 1168 Tamanho 1169 Sketch1 1169 Esboço1 1170 Sketch2 1170 Esboço2 1171 Slide Show 1171 Apresentação de Slides 1172 Smart Erase 1172 Apagar Inteligente 1173 Soft Focus 1173 Foco Suave 1174 Sphere 1174 Esfera 1175 Spherical Projection 1175 Projeção Esférica 1176 Split-Screen 1176 Tela Dividida 1177 Stack/Layers 1177 Empilhamento/Camadas 1178 Stack/Noise 1178 Empilhamento/Ruído 1179 Stack/Paint 1179 Empilhamento/Pintura 1180 Stacking Order 1180 Ordem de Empilhamento 1181 Start 1181 Iniciar 1182 Start a slide show 1182 Iniciar uma apresentação de slides 1183 Start of gallery 1183 Início da galeria 1184 Startup View 1184 Visualização Inicial 1185 Stop 1185 Parar 1186 Stretch 1186 Esticar 1187 Stretch: 1187 Esticar: 1188 Suppress JPEG compression artifacts 1188 Suprimir artefatos de compressão JPEG 1189 Suppress Ringing 1189 Suprimir Anelamento 1190 Suppress fine details while retaining sharpness 1190 Suprimir detalhes finos mantendo a nitidez 1191 Suppress noise from low-light photos 1191 Suprimir ruído de fotos tiradas com pouca luz 1192 Survey all files 1192 Pesquisar todos os arquivos 1193 TEXTURE 1193 TEXTURA 1194 THUMB VIEW 1194 VISUALIZAÇÃO EM THUMBNAILS 1195 TILES1 1195 LADRILHOS1 1196 TILES2 1196 LADRILHOS2 1197 TIMELINE 1197 LINHA DO TEMPO 1198 TINY PLANET 1198 PLANETA MINÚSCULO 1199 TOOLS MENU 1199 MENU DE FERRAMENTAS 1200 TRANSLATIONS 1200 TRADUÇÕES 1201 TWIST 1201 TORCER 1202 Temperature 1202 Temperatura 1203 Text 1203 Texto 1204 Text File: 1204 Arquivo de Texto: 1205 Texture 1205 Textura 1206 Threshold 1206 Limite 1207 Threshold: Low 1207 Limite: Baixo 1208 Thumbnail View 1208 Visualização em Thumbnails 1209 Thumbnail size 1209 Tamanho da thumbnail 1210 Thumbnails folder 1210 Pasta de thumbnails 1211 Thumbnails folder: %s \nPlease remove. 1211 Pasta de thumbnails: %s \nPor favor, remova. 1212 Thumbnails folder: \n %s \nmust be named .../thumbnails 1212 Pasta de thumbnails: \n %s \ndeve ser chamada .../thumbnails 1213 Thumbnails: 1213 Thumbnails: 1214 Tile 1214 Ladrilho 1215 Tile blending 1215 Mesclagem de ladrilhos 1216 Tile image with a repeating pattern 1216 Preencher imagem com um padrão repetitivo 1217 Tiles 1217 Ladrilhos 1218 Tiles1 1218 Ladrilhos1 1219 Tiles2 1219 Ladrilhos2 1220 Timeline 1220 Linha do Tempo 1221 Tiny Planet 1221 Planeta Minúsculo 1222 Title 1222 Título 1223 Title: %s\n 1223 Título: %s\n 1224 To Location 1224 Para o Local 1225 Toggle Captions 1225 Alternar Legendas 1226 Toggle Grid 1226 Alternar Grade 1227 Toggle grid lines on and off 1227 Alternar linhas de grade ligado e desligado 1228 Toggle image metadata display ON/OFF 1228 Alternar exibição de metadata da imagem ATIVADO/DESATIVADO 1229 Too little overlap, cannot align 1229 Sobreposição insuficiente, não é possível alinhar 1230 Too many edits, please save image 1230 Excesso de edições, salve a imagem 1231 Tools 1231 Ferramentas 1232 Tools: image index, settings, shortcuts, grid, find duplicates 1232 Ferramentas: índice de imagens, configurações, atalhos, grade, encontrar duplicatas 1233 Top 1233 Topo 1234 Total Colors 1234 Total de Cores 1235 Trace 1235 Traçar 1236 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1236 Trace as curvas superior e inferior com \ncliques do mouse, depois [achatar]. 1237 Transient Objects 1237 Objetos Transitórios 1238 Transition Preferences 1238 Preferências de Transição 1239 Transition to next image 1239 Transição para a próxima imagem 1240 Transitions File 1240 Arquivo de Transições 1241 Transp. 1241 Transp. 1242 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1242 O mapa de transparência será perdido \n(salve como TIFF|PNG|JXL para preservar) \nSalvar mesmo assim? 1243 Trash 1243 Lixeira 1244 Trash read-only file? 1244 Descartar arquivo somente leitura? 1245 Turn an image inside-out 1245 Transformar uma imagem de dentro para fora 1246 Twist 1246 Torcer 1247 Twist image centered at mouse position 1247 Torcer imagem centralizada na posição do mouse 1248 UNBEND 1248 DESCURVAR 1249 UNDO/REDO BUTTON 1249 BOTÃO DESFAZER/REFAZER 1250 UNWARP CLOSEUP 1250 DESFAZER DISTORÇÃO DE CLOSE-UP 1251 UPDATE ALBUMS 1251 ATUALIZAR ÁLBUNS 1252 UPRIGHT 1252 ENDIREITAR 1253 USER GUIDE 1253 GUIA DO USUÁRIO 1254 Unable to copy metadata 1254 Não foi possível copiar metadata 1255 Unbend 1255 Descurvar 1256 Undo 1256 Desfazer 1257 Undo All 1257 Desfazer Tudo 1258 Undo Last 1258 Desfazer Último 1259 Undo/Redo 1259 Desfazer/Refazer 1260 Uninstall 1260 Desinstalar 1261 Unwarp Closeup 1261 Desfazer Distorção de Close-up 1262 Update Albums 1262 Atualizar Álbuns 1263 Update albums for new file versions 1263 Atualizar álbuns para novas versões de arquivo 1264 Upright 1264 Endireitar 1265 Upright Image 1265 Endireitar Imagem 1266 Upright or mirror-flip an image 1266 Endireitar ou inverter (espelhar) uma imagem 1267 Upright rotated image files, selected set or ALL 1267 Endireitar arquivos de imagem girados, conjunto selecionado ou TODOS 1268 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1268 Use Selecionar Área para selecionar um rosto. \nClique no centro da distorção. \nMova o controle deslizante. \n 1269 Use [Select] to add files to an empty album 1269 Use [Selecionar] para adicionar arquivos a um álbum vazio 1270 Use metadata photo date or file modification date? 1270 Usar data da foto da metadata ou data de modificação do arquivo? 1271 Use metadata tag 1271 Usar tag de metadata 1272 Use settings file 1272 Usar arquivo de configurações 1273 User Guide 1273 Guia do Usuário 1274 User preferences and settings 1274 Preferências e configurações do usuário 1275 VIDEO press P to play 1275 VÍDEO pressione P para reproduzir 1276 VIEW 360° PANO 1276 VER PANORAMA 360° 1277 VIEW ALL META 1277 VER TODA A META 1278 VIEW MAIN META 1278 VER META PRINCIPAL 1279 VIGNETTE 1279 VINHETA 1280 Var. Transparency 1280 Transparência Var. 1281 Vert 1281 Vert. 1282 Video Files 1282 Arquivos de Vídeo 1283 Video Tutorial 1283 Tutorial em Vídeo 1284 Video command 1284 Comando de Vídeo 1285 View 360 degree panorama image 1285 Ver imagem de panorama de 360 graus 1286 View 360° Pano 1286 Ver Panorama 360° 1287 View All Meta 1287 Ver Toda a Meta 1288 View All Metadata 1288 Ver Toda a Metadata 1289 View Main Meta 1289 Ver Meta Principal 1290 View Main Metadata 1290 Ver Metadata Principal 1291 View before/after images using split-screen 1291 Ver imagens antes/depois usando tela dividida 1292 View/edit metadata, image report and search functions 1292 Ver/editar metadata, funções de relatório e busca de imagens 1293 Vignette 1293 Vinheta 1294 W/H Ratio: 1294 Proporção L/A: 1295 WARP AFFINE 1295 DISTORÇÃO AFIM 1296 WARP AREA 1296 DISTORCER ÁREA 1297 WARP CURVED 1297 DISTORÇÃO CURVA 1298 WARP IMAGE 1298 DISTORCER IMAGEM 1299 WARP MENU 1299 MENU DE DISTORÇÃO 1300 WARP RADIAL 1300 DISTORÇÃO RADIAL 1301 WINDOW VIEWS AND MENUS 1301 VISUALIZAÇÕES DE JANELA E MENUS 1302 WORLD MAP 1302 MAPA MUNDIAL 1303 Wait after zoom 1303 Espera após o zoom 1304 Wait before filename/title/description 1304 Espera antes do nome do arquivo/título/descrição 1305 Wait before zoom 1305 Espera antes do zoom 1306 Warp 1306 Distorcer 1307 Warp Affine 1307 Distorção Afim 1308 Warp Area 1308 Distorcer Área 1309 Warp Curved 1309 Distorção Curva 1310 Warp Image 1310 Distorcer Imagem 1311 Warp Linear1 1311 Distorção Linear1 1312 Warp Linear2 1312 Distorção Linear2 1313 Warp Radial 1313 Distorção Radial 1314 Warp an image with a wave pattern 1314 Distorcer uma imagem com um padrão de ondas 1315 Warp image (affine) using the mouse 1315 Distorcer imagem (afim) usando o mouse 1316 Warp image (curved) using the mouse 1316 Distorcer imagem (curva) usando o mouse 1317 Warp image (linear 1) using the mouse 1317 Distorcer imagem (linear 1) usando o mouse 1318 Warp image (linear 2) using the mouse 1318 Distorcer imagem (linear 2) usando o mouse 1319 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1319 Distorção: desencurvar, corrigir perspectiva, distorcer, desfazer distorção de close-up, achatar, transformações de imagem 1320 White 1320 Branco 1321 Widen: 1321 Alargar: 1322 Width 1322 Largura 1323 Width % 1323 Largura % 1324 X-size 1324 Tamanho X 1325 Yes 1325 Sim 1326 ZOOM 1326 ZOOM 1327 Zoom 1327 Zoom 1328 Zoom Center 1328 Centro do Zoom 1329 Zoom Speed 1329 Velocidade do Zoom 1330 Zoom-in 1330 Zoom-in 1331 Zoom-out 1331 Zoom-out 1332 \n %d-bits/color 1332 \n %d-bits/cor 1333 \n *** CANCELED \n 1333 \n *** CANCELADO \n 1334 \n *** COMPLETED \n 1334 \n *** CONCLUÍDO \n 1335 \n *** Delete Originals *** 1335 \n *** Excluir Originais *** 1336 \n *** Keep Originals *** 1336 \n *** Manter Originais *** 1337 \n *** Replace Originals *** 1337 \n *** Substituir Originais *** 1338 \n Convert to %s 1338 \n Converter para %s 1339 \n Copy Metadata 1339 \n Copiar Metadata 1340 \n Downsize within %dx%d 1340 \n Reduzir dentro de %dx%d 1341 \n New Location: %s 1341 \n Novo Local: %s 1342 \n Output to %s 1342 \n Saída para %s 1343 \n PROCEED? 1343 \n CONTINUAR? 1344 \n Rename to %s 1344 \n Renomear para %s 1345 \n Replace text: %s --> %s 1345 \n Substituir texto: %s --> %s 1346 \n Rescale to %sx 1346 \n Redimensionar para %sx 1347 \n Update Albums 1347 \n Atualizar Álbuns 1348 \n Upsize within %dx%d 1348 \n Aumentar dentro de %dx%d 1349 \n*** CANCELED \n 1349 \n*** CANCELADO \n 1350 \n*** COMPLETED \n 1350 \n*** CONCLUÍDO \n 1351 \n\nPROCEED? 1351 \n\nCONTINUAR? 1352 add 1352 adicionar 1353 add after old 1353 adicionar após o antigo 1354 add all gallery files to list 1354 adicionar todos os arquivos da galeria à lista 1355 add current file to list 1355 adicionar arquivo atual à lista 1356 add entered text to layout 1356 adicionar texto digitado ao layout 1357 add images to layout 1357 adicionar imagens ao layout 1358 add line/arrow to layout 1358 adicionar linha/seta ao layout 1359 add new keyword 1359 adicionar nova keyword 1360 add or edit images 1360 adicionar ou editar imagens 1361 add or edit lines/arrows 1361 adicionar ou editar linhas/setas 1362 add or edit text 1362 adicionar ou editar texto 1363 add to set 1363 adicionar ao conjunto 1364 adder 1364 adder 1365 adjust brightness of selected image 1365 ajustar brilho da imagem selecionada 1366 after removal of missing files: %d \n 1366 após remoção de arquivos ausentes: %d \n 1367 album %s: deleted 1367 álbum %s: excluído 1368 album already exists: %s 1368 álbum já existe: %s 1369 album mass update 1369 atualização em massa de álbum 1370 albums folder missing 1370 pasta de álbuns ausente 1371 align and trim color chart 1371 alinhar e aparar tabela de cores 1372 all files 1372 todos os arquivos 1373 all image files, including unmounted folders: %d \n 1373 todos os arquivos de imagem, incluindo pastas não montadas: %d \n 1374 all images 1374 todas as imagens 1375 all versions 1375 todas as versões 1376 amplify contrast 1376 amplificar contraste 1377 amplitude 1377 amplitude 1378 angle 1378 ângulo 1379 apply 1379 aplicar 1380 area edge creep 1380 deslocamento da borda da área 1381 area is not finished 1381 área não finalizada 1382 area outline color: 1382 cor do contorno da área: 1383 array width is too large: %d x %d 1383 largura do array excede o limite: %d x %d 1384 ascending 1384 crescente 1385 auto color 1385 cor automática 1386 background colors for file and gallery view windows 1386 cores de fundo para janelas de visualização de arquivo e galeria 1387 backing 1387 apoio 1388 bad category name 1388 nome de categoria inválido 1389 bad keyword name 1389 nome de keyword inválido 1390 bad pattern file: %s 1390 arquivo de padrão inválido: %s 1391 base 1391 base 1392 base and adder need $s plugin 1392 base e adder precisam do plugin $s 1393 base size 1393 tamanho base 1394 begin making a script file 1394 iniciar criação de arquivo de script 1395 black/white 1395 preto/branco 1396 black/white negative 1396 negativo preto/branco 1397 black/white positive 1397 positivo preto/branco 1398 blend 1398 mesclar 1399 blend edges: blend width: 1399 mesclar bordas: largura da mesclagem: 1400 blend image overlaps over pixel width 1400 mesclar sobreposições de imagem em largura de pixel 1401 blend rate: center: 1401 taxa de mesclagem: centro: 1402 blocking function: %s 1402 função de bloqueio: %s 1403 blocksize 1403 tamanho do bloco 1404 blur edges: blur width: 1404 desfocar bordas: largura do desfoque: 1405 blur radius 1405 raio do desfoque 1406 borders 1406 bordas 1407 both 'All Files' and specific files were selected 1407 tanto 'Todos os Arquivos' quanto arquivos específicos foram selecionados 1408 bright halo 1408 halo claro 1409 brightness rescale 1409 redimensionamento de brilho 1410 browse 1410 procurar 1411 brush size 1411 tamanho do pincel 1412 build index, old files only 1412 criar índice, apenas arquivos antigos 1413 cancel project 1413 cancelar projeto 1414 cancel project? 1414 cancelar projeto? 1415 cannot allocate %d MB memory 1415 não é possível alocar %d MB de memória 1416 cannot be determined 1416 não é possível determinar 1417 cannot copy a file to itself 1417 não é possível copiar um arquivo para ele mesmo 1418 cannot copy current file 1418 não é possível copiar o arquivo atual 1419 cannot create output file 1419 não é possível criar arquivo de saída 1420 cannot create pixbuf 1420 não é possível criar pixbuf 1421 cannot find area outline 1421 não é possível encontrar o contorno da área 1422 cannot find output file 1422 não é possível encontrar o arquivo de saída 1423 cannot load input file 1423 não é possível carregar o arquivo de entrada 1424 cannot open file %s 1424 não é possível abrir o arquivo %s 1425 cannot parse current file 1425 não é possível analisar o arquivo atual 1426 cannot parse file 1426 não é possível analisar o arquivo 1427 cannot read pluging output file 1427 não é possível ler o arquivo de saída do plugin 1428 cannot replace %s file 1428 não é possível substituir o arquivo %s 1429 cannot save as RAW type 1429 não é possível salvar como tipo RAW 1430 cannot save layout file: %s 1430 não é possível salvar o arquivo de layout: %s 1431 cannot write image folders file: %s 1431 não é possível gravar o arquivo de pastas de imagem: %s 1432 category %s has too many keywords 1432 categoria %s tem keywords em excesso 1433 category %s is too big 1433 categoria %s é muito grande 1434 center 1434 centro 1435 change project scale 1435 alterar escala do projeto 1436 choose 1-8 clicks or [+] keys for 2x image zoom 1436 escolha de 1 a 8 cliques ou tecla [+] para zoom 2x da imagem 1437 choose a better spot 1437 escolha um ponto melhor 1438 choose an image file 1438 escolha um arquivo de imagem 1439 choose file 1439 escolher arquivo 1440 choose files 1440 escolher arquivos 1441 choose folder 1441 escolher pasta 1442 choose folders 1442 escolher pastas 1443 choose location 1443 escolher localização 1444 circle 1444 círculo 1445 clear area selections 1445 limpar seleções de área 1446 clear entered text 1446 limpar texto digitado 1447 clear inputs 1447 limpar entradas 1448 clear text 1448 limpar texto 1449 click a defined keyword (below) to add a search keyword 1449 clique em uma keyword definida (abaixo) para adicionar uma keyword de busca 1450 click bright point 1450 clique no ponto claro 1451 click dark point 1451 clique no ponto escuro 1452 click on desired color 1452 clique na cor desejada 1453 click on image to get source color 1453 clique na imagem para obter a cor de origem 1454 click on image to set matching color 1454 clique na imagem para definir a cor correspondente 1455 click on thumbnail to set zoom center 1455 clique na thumbnail para definir o centro do zoom 1456 click position to add line 1456 clique na posição para adicionar linha 1457 click position to add text 1457 clique na posição para adicionar texto 1458 click to select 1458 clique para selecionar 1459 click to unselect 1459 clique para desmarcar 1460 clicks per 2x image increase 1460 cliques por aumento de imagem em 2x 1461 color 1461 cor 1462 color depth 1462 profundidade de cor 1463 color depth: 1463 profundidade de cor: 1464 color match level % 1464 nível de combinação de cor % 1465 color negative 1465 negativo de cor 1466 column difference: %d pixels 1466 diferença de coluna: %d pixels 1467 column difference: %d pixels \nMake columns even? 1467 diferença de coluna: %d pixels \nNivelar colunas? 1468 combined image files 1468 arquivos de imagem combinados 1469 command: 1469 comando: 1470 commit all changes, close dialog 1470 confirmar todas as alterações, fechar caixa de diálogo 1471 complete file selection first 1471 complete a seleção de arquivo primeiro 1472 completed 1472 concluído 1473 condense into color blobs 1473 condensar em manchas de cor 1474 condition 1474 condição 1475 confirm Fotocx exit 1475 confirmar saída do Fotocx 1476 constant blur 1476 desfoque constante 1477 continue? 1477 continuar? 1478 converting colors... 1478 convertendo cores... 1479 converting files 1479 convertendo arquivos 1480 copy (duplicate file) 1480 copiar (duplicar arquivo) 1481 copy and paste commands 1481 comandos de copiar e colar 1482 copy files to %s 1482 copiar arquivos para %s 1483 copy metadata from Nth file: 1483 copiar metadata do enésimo arquivo: 1484 copy to Desktop failed: %s 1484 falha ao copiar para a Área de Trabalho: %s 1485 count: 0 1485 contagem: 0 1486 create folder 1486 criar pasta 1487 create folder %s 1487 criar pasta %s 1488 current gallery 1488 galeria atual 1489 current image files found: %d \n 1489 arquivos de imagem atuais encontrados: %d \n 1490 current set only 1490 apenas conjunto atual 1491 current set: 1491 conjunto atual: 1492 curve file is invalid 1492 arquivo de curva inválido 1493 custom command to play video files 1493 comando personalizado para reproduzir arquivos de vídeo 1494 dark 1494 escuro 1495 dark halo 1495 halo escuro 1496 dark pixels 1496 pixels escuros 1497 data is incomplete, proceed? 1497 dados incompletos, continuar? 1498 date format is yyyy:mm:dd [hh:mm:ss] 1498 formato de data é yyyy:mm:dd [hh:mm:ss] 1499 date range 1499 intervalo de datas 1500 days 1500 dias 1501 delete 1501 excluir 1502 delete %s \n%s 1502 excluir %s \n%s 1503 delete Mashup project files? 1503 excluir arquivos do projeto Mashup? 1504 delete failed: \n%s 1504 falha ao excluir: \n%s 1505 delete originals specified but no new name given 1505 exclusão de originais especificada, mas nenhum novo nome fornecido 1506 delete selected text from layout 1506 excluir texto selecionado do layout 1507 deleting orphan thumbnails ... \n 1507 excluindo thumbnails órfãs ... \n 1508 depth 1508 profundidade 1509 descending 1509 decrescente 1510 direction of light and shadows 1510 direção da luz e sombras 1511 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1511 desativar seleção de thumbnail para ativar menus popup etc. \nuse [Ativar] para retomar a seleção de thumbnail 1512 discard changes? 1512 descartar alterações? 1513 do not warp images during auto-alignment 1513 não distorcer imagens durante o alinhamento automático 1514 do nothing 1514 não fazer nada 1515 dot size 1515 tamanho do ponto 1516 downsize 1516 reduzir tamanho 1517 drag image 1517 arrastar imagem 1518 drag mouse along an edge to follow the edge 1518 arraste o mouse ao longo de uma borda para seguir a borda 1519 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1519 arraste o mouse para baixo/direita para desenhar oval \nshift + arraste o centro para mover a oval \nshift + arraste a borda inferior direita para alterar 1520 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1520 arraste o mouse para desenhar caixa \nshift + arraste o centro para mover a caixa \nshift + arraste a borda para mover a borda 1521 drag mouse to outline an area 1521 arraste o mouse para contornar uma área 1522 drag mouse to select circular or elliptical area 1522 arraste o mouse para selecionar área circular ou elíptica 1523 drag mouse to select rectangular area 1523 arraste o mouse para selecionar área retangular 1524 drag mouse to show selected image 1524 arraste o mouse para mostrar a imagem selecionada 1525 duplicate keyword 1525 keyword duplicada 1526 edge distance calculation 1526 cálculo de distância de borda 1527 edge: 1527 borda: 1528 edit 1528 editar 1529 edit commands 1529 editar comandos 1530 edit custom shell commands, match colors to embedded jpeg image 1530 editar comandos shell personalizados, combinar cores com imagem jpeg incorporada 1531 edit this menu 1531 editar este menu 1532 ellipse 1532 elipse 1533 embedded numbers will sort by value 1533 números incorporados serão classificados por valor 1534 emboss 1534 relevo 1535 enter 2-character language code: en, de, fr ... 1535 digite o código de idioma de 2 caracteres: en, de, fr ... 1536 enter a project name 1536 digite um nome de projeto 1537 enter an album name 1537 digite um nome de álbum 1538 enter cities/locations, countries 1538 digite cidades/locais, países 1539 enter project name 1539 digite o nome do projeto 1540 enter tag name 1540 digite o nome da tag 1541 enter tag names 1541 digite os nomes das tags 1542 erase 1542 apagar 1543 error compensation 1543 compensação de erro 1544 exceed %d edits 1544 excede %d edições 1545 exceed %d images 1545 excede %d imagens 1546 exceed %d max files, cannot continue 1546 excede %d arquivos no máximo, não é possível continuar 1547 exceed %d rows 1547 excede %d linhas 1548 exceed %d selected files 1548 excede %d arquivos selecionados 1549 exceed %d shortcuts 1549 excede %d atalhos 1550 exceeded %d line entries 1550 excedeu %d entradas de linha 1551 exceeded %d text entries 1551 excedeu %d entradas de texto 1552 exceeded max. images: %d 1552 excedeu o máx. de imagens: %d 1553 exceeded max. tiles: %d 1553 excedeu o máx. de ladrilhos: %d 1554 exit split-screen 1554 sair da tela dividida 1555 expand to these limits if smaller 1555 expandir até estes limites se for menor 1556 exporting files 1556 exportando arquivos 1557 extra indexed metadata tags > %d 1557 tags de metadata extras indexadas > %d 1558 extra metadata tags to include in index 1558 tags de metadata extras para incluir no índice 1559 extra metadata tags: \n 1559 tags de metadata extras: \n 1560 fetch 1560 buscar 1561 file 1561 arquivo 1562 file .ext names to recognize RAW files 1562 extensões de arquivo para reconhecer arquivos RAW 1563 file .ext names to recognize video files 1563 extensões de arquivo para reconhecer arquivos de vídeo 1564 file close error 1564 erro ao fechar arquivo 1565 file color 1565 cor do arquivo 1566 file error: %s 1566 erro de arquivo: %s 1567 file format error 1567 erro de formato de arquivo 1568 file format error: %s 1568 erro de formato de arquivo: %s 1569 file included: %s \n 1569 arquivo incluído: %s \n 1570 file metadata update failed 1570 falha ao atualizar metadata do arquivo 1571 file name 1571 nome do arquivo 1572 file names 1572 nomes dos arquivos 1573 file not found 1573 arquivo não encontrado 1574 file not found \n 1574 arquivo não encontrado \n 1575 file not found: %s 1575 arquivo não encontrado: %s 1576 file not found: %s %s 1576 arquivo não encontrado: %s %s 1577 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1577 tipos de arquivo: .jp2 .heic .avif .webp \nse tornarão: .jpg - CONTINUAR? 1578 file: %s \nexceed 99 versions 1578 arquivo: %s \nexcede 99 versões 1579 filename text 1579 texto do nome do arquivo 1580 files in %s can be deleted 1580 arquivos em %s podem ser excluídos 1581 fill from current gallery 1581 preencher a partir da galeria atual 1582 fill from selected files 1582 preencher a partir dos arquivos selecionados 1583 fill selected areas 1583 preencher áreas selecionadas 1584 fill transparent areas 1584 preencher áreas transparentes 1585 find all image files ...\n 1585 buscando todos os arquivos de imagem ...\n 1586 find and report all unreadable image files 1586 encontrar e relatar todos os arquivos de imagem ilegíveis 1587 find outline gap 1587 encontrar lacuna no contorno 1588 find via table lookup 1588 encontrar via tabela de consulta 1589 find_imagefiles() failure \n 1589 falha em find_imagefiles() \n 1590 find_imagefiles() failure: %s \n 1590 falha em find_imagefiles(): %s \n 1591 finish current edit first 1591 termine a edição atual primeiro 1592 finish making a script file 1592 finalizar criação de arquivo de script 1593 finish or cancel pending edit 1593 finalize ou cancele a edição pendente 1594 fix box in layout and start new box 1594 fixar caixa no layout e iniciar nova caixa 1595 fix line in layout and start new line 1595 fixar linha no layout e iniciar nova linha 1596 fix motion blur 1596 corrigir desfoque de movimento 1597 fix oval in layout and start new oval 1597 fixar oval no layout e iniciar nova oval 1598 follow edge 1598 seguir borda 1599 font name and size for menus and dilogs 1599 nome e tamanho da fonte para menus e caixas de diálogo 1600 force a full re-index of all image files 1600 forçar uma reindexação completa de todos os arquivos de imagem 1601 format: yyyy:mm:dd [hh:mm:ss] 1601 formato: yyyy:mm:dd [hh:mm:ss] 1602 fotocx will exit 1602 o fotocx será encerrado 1603 found %d pixels 1603 %d pixels encontrados 1604 free disk space: %d GB \n 1604 espaço livre em disco: %d GB \n 1605 freehand draw 1605 desenho à mão livre 1606 ftruncate() failure: %s 1606 falha em ftruncate(): %s 1607 full image index: reports will be complete \n 1607 índice de imagem completo: relatórios estarão completos \n 1608 function canceled 1608 função cancelada 1609 gallery 1609 galeria 1610 gallery is empty 1610 a galeria está vazia 1611 gallery truncated to %d images 1611 galeria truncada para %d imagens 1612 get images having text in filename (comma separated) 1612 obter imagens com texto no nome do arquivo (separado por vírgula) 1613 get images with matching keywords (comma separated) 1613 obter imagens com keywords correspondentes (separado por vírgula) 1614 get images within rating range 1614 obter imagens dentro do intervalo de avaliação 1615 gradual paint 1615 pintura gradual 1616 grid counts not 0-100: %s 1616 contagens de grade fora de 0-100: %s 1617 grid picklist file error: %s 1617 erro no arquivo de lista da grade: %s 1618 grid size 1618 tamanho da grade 1619 group 1619 grupo 1620 height 1620 altura 1621 hide area outlines 1621 ocultar contornos de área 1622 hide transient objects 1622 ocultar objetos transitórios 1623 high 1623 alto 1624 home folder was not changed 1624 a pasta home não foi alterada 1625 horizontal 1625 horizontal 1626 hours 1626 horas 1627 icons only, text only, or both 1627 apenas ícones, apenas texto, ou ambos 1628 if image < window, center or shift left or right 1628 se a imagem < janela, centralizar ou deslocar para esquerda ou direita 1629 ignore differences above limit 1629 ignorar diferenças acima do limite 1630 image blend 1630 mesclagem de imagem 1631 image files 1631 arquivos de imagem 1632 image for source color 1632 imagem para cor de origem 1633 image index records found: %d \n 1633 registros de índice de imagem encontrados: %d \n 1634 image index required 1634 índice de imagem necessário 1635 image index write error: %s 1635 erro de gravação do índice de imagem: %s 1636 image is too large to edit: %d x %d 1636 imagem grande demais para editar: %d x %d 1637 image is too large: %dx%d, %lld megapix 1637 imagem grande demais: %dx%d, %lld megapixels 1638 image is too small to edit: %d x %d 1638 imagem pequena demais para editar: %d x %d 1639 image scale 1639 escala da imagem 1640 image to set matching color 1640 imagem para definir cor correspondente 1641 image width must be greater than height 1641 a largura da imagem deve ser maior que a altura 1642 images to report 1642 imagens a relatar 1643 include all files 1643 incluir todos os arquivos 1644 include edited versions 1644 incluir versões editadas 1645 include last versions only 1645 incluir apenas as últimas versões 1646 include original files 1646 incluir arquivos originais 1647 include transparent areas 1647 incluir áreas transparentes 1648 include: 1648 incluir: 1649 increase blur with distance 1649 aumentar desfoque com a distância 1650 index completed, %.1f seconds \n 1650 indexação concluída, %.1f segundos \n 1651 index config file error: %s 1651 erro no arquivo de configuração do índice: %s 1652 index updates needed: %d thumbnails: %d \n 1652 atualizações de índice necessárias: %d thumbnails: %d \n 1653 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1653 atualizações de índice: %d atualizações de título/desc: %d \natualizações de thumbnail: %d, exclusões: %d \n 1654 input 1654 entrada 1655 input file: %s \n 1655 arquivo de entrada: %s \n 1656 insufficient memory, cannot proceed 1656 memória insuficiente, não é possível continuar 1657 insufficient overlap for color matching 1657 sobreposição insuficiente para combinação de cores 1658 invalid GPS data 1658 dados de GPS inválidos 1659 invalid GPS data: %s 1659 dados de GPS inválidos: %s 1660 invalid album 1660 álbum inválido 1661 invalid date range: %s %s 1661 intervalo de datas inválido: %s %s 1662 invalid date/time format 1662 formato de data/hora inválido 1663 invalid file 1663 arquivo inválido 1664 invalid plugin: %s 1664 plugin inválido: %s 1665 invalid rating range 1665 intervalo de avaliação inválido 1666 invalid source file: %s 1666 arquivo de origem inválido: %s 1667 invert area 1667 inverter área 1668 jpeg quality level - 70+ for good image quality 1668 nível de qualidade jpeg - 70+ para boa qualidade de imagem 1669 keyboard 1669 teclado 1670 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1670 controles de teclado: \nEsc: sair da apresentação de slides em execução \nteclas de seta: imagem anterior/próxima \nB: escurecer / reverter janela \nN: transição para próxima imagem \nP: pausar / retomar \nX: ampliar na posição do mouse 1671 keyword names 1671 nomes de keywords 1672 keywords to add 1672 keywords a adicionar 1673 keywords to remove 1673 keywords a remover 1674 keywords_defined file error: %s 1674 erro no arquivo keywords_defined: %s 1675 last search 1675 última busca 1676 last version 1676 última versão 1677 last versions 1677 últimas versões 1678 layout exceeds 4 gigabytes 1678 layout excede 4 gigabytes 1679 layout file missing: %s 1679 arquivo de layout ausente: %s 1680 left 1680 esquerda 1681 left click on image for selected color 1681 clique com o botão esquerdo na imagem para a cor selecionada 1682 left click: set image source location \nright click: set corresponding destination 1682 clique esquerdo: definir local de origem da imagem \nclique direito: definir destino correspondente 1683 left drag: add transparency \nright drag: add opacity 1683 arraste com o botão esquerdo: adicionar transparência \narraste com o botão direito: adicionar opacidade 1684 left drag: copy image to mouse position \nright drag: restore original image 1684 arraste com o botão esquerdo: copiar imagem para a posição do mouse \narraste com o botão direito: restaurar imagem original 1685 left drag: reduce halo, right drag: undo 1685 arraste com o botão esquerdo: reduzir halo, arraste com o botão direito: desfazer 1686 lens mm 1686 mm da lente 1687 level based on EXIF roll angle 1687 nivelar com base no ângulo de rotação EXIF 1688 light 1688 claro 1689 light pixels 1689 pixels claros 1690 line 1690 linha 1691 line color 1691 cor da linha 1692 line width 1692 largura da linha 1693 load 1693 carregar 1694 load text data from a file 1694 carregar dados de texto de um arquivo 1695 load widgets failed: %s 1695 falha ao carregar widgets: %s 1696 loading palette ... 1696 carregando paleta ... 1697 location is not a folder 1697 o local não é uma pasta 1698 locations 1698 locais 1699 lock width/height ratio 1699 travar proporção de largura/altura 1700 log file is in a terminal 1700 o arquivo de registro está em um terminal 1701 low 1701 baixo 1702 low contrast 1702 baixo contraste 1703 lower 1703 inferior 1704 make an initially empty album 1704 criar um álbum inicialmente vazio 1705 make new version 1705 criar nova versão 1706 manual align 1706 alinhamento manual 1707 map marker (red dot) diameter, pixels 1707 diâmetro do marcador do mapa (ponto vermelho), pixels 1708 map selected areas and verify 1708 mapear áreas selecionadas e verificar 1709 mashup project 1709 projeto mashup 1710 match embedded image color 1710 combinar com a cor da imagem incorporada 1711 match image color to base image (repeat) 1711 combinar cor da imagem com a imagem base (repetir) 1712 match values 1712 valores correspondentes 1713 matches 1713 correspondências 1714 max keywords exceeded 1714 máximo de keywords excedido 1715 max. Width 1715 largura máx. 1716 max. album count exceeded: %d 1716 contagem máx. de álbuns excedida: %d 1717 max. album files reached, results truncated 1717 número máx. de arquivos do álbum atingido, resultados truncados 1718 max. album size exceeded: %d 1718 tamanho máx. do álbum excedido: %d 1719 max. blur radius 1719 raio máx. de desfoque 1720 max. brightness 1720 brilho máx. 1721 max. image limit reached: %d 1721 limite máx. de imagens atingido: %d 1722 max. width or height is not reasonable 1722 largura ou altura máx. não é razoável 1723 maximum clip allowed to fit window 1723 corte máximo permitido para ajustar à janela 1724 mean RGB: %5.0f %5.0f %5.0f 1724 RGB médio: %5.0f %5.0f %5.0f 1725 mean noise: %5.2f %5.2f %5.2f 1725 ruído médio: %5.2f %5.2f %5.2f 1726 median 1726 mediana 1727 median diff 1727 diferença mediana 1728 menu text and background colors 1728 cores de texto e fundo do menu 1729 metadata 1729 metadata 1730 metadata copy failed 1730 falha ao copiar metadata 1731 metadata from Search Function, metadata report 1731 metadata da Função de Busca, relatório de metadata 1732 metadata picklist file not found %s 1732 arquivo de lista de metadata não encontrado %s 1733 metadata tags to report 1733 tags de metadata a relatar 1734 metadata update error 1734 erro ao atualizar metadata 1735 metadata update error \n 1735 erro ao atualizar metadata \n 1736 metadata update error: %s 1736 erro ao atualizar metadata: %s 1737 metadata update failed \n 1737 falha ao atualizar metadata \n 1738 min. blur radius 1738 raio mín. de desfoque 1739 min. contrast 1739 contraste mín. 1740 min. edit curve node separation, % of scale length 1740 separação mín. de nó de curva de edição, % do comprimento da escala 1741 min. separation, %c of scale 1741 separação mín., %c da escala 1742 minutes 1742 minutos 1743 mmap() failure: %s 1743 falha em mmap(): %s 1744 months 1744 meses 1745 more than %d categories 1745 mais de %d categorias 1746 more than 20 matches 1746 mais de 20 correspondências 1747 mouse radius 1747 raio do mouse 1748 mouse radius for color sample 1748 raio do mouse para amostra de cor 1749 mouse radius: 1749 raio do mouse: 1750 move (delete original) 1750 mover (excluir original) 1751 move area boundary in/out in 1-pixel steps 1751 mover limite da área para dentro/fora em passos de 1 pixel 1752 move to next input file 1752 mover para o próximo arquivo de entrada 1753 move to trash failed \n 1753 falha ao mover para a lixeira \n 1754 move to trash failed: %s 1754 falha ao mover para a lixeira: %s 1755 multiply 1755 multiplicar 1756 must have 4 corners 1756 precisa ter 4 cantos 1757 need numeric match value: %s 1757 valor de correspondência numérico necessário: %s 1758 negative 1758 negativo 1759 new album created 1759 novo álbum criado 1760 new album name 1760 novo nome de álbum 1761 new file 1761 novo arquivo 1762 new file ... 1762 novo arquivo ... 1763 new file name is invalid 1763 o novo nome do arquivo é inválido 1764 new file type 1764 novo tipo de arquivo 1765 new home folder contains a blank 1765 a nova pasta home contém um espaço em branco 1766 new location 1766 novo local 1767 new location is not a folder 1767 o novo local não é uma pasta 1768 new version 1768 nova versão 1769 newest files 1769 arquivos mais novos 1770 no EXIF orientation data 1770 sem dados de orientação EXIF 1771 no active Select Area 1771 nenhuma Área de Seleção ativa 1772 no albums selected 1772 nenhum álbum selecionado 1773 no auto warp 1773 sem distorção automática 1774 no change 1774 sem alteração 1775 no current album 1775 nenhum álbum atual 1776 no current edit image 1776 nenhuma imagem de edição atual 1777 no current file 1777 nenhum arquivo atual 1778 no curve (scanned image) 1778 sem curva (imagem escaneada) 1779 no description 1779 sem descrição 1780 no file selected 1780 nenhum arquivo selecionado 1781 no files found 1781 nenhum arquivo encontrado 1782 no files selected 1782 nenhum arquivo selecionado 1783 no host files selected 1783 nenhum arquivo hospedeiro selecionado 1784 no image index: reports disabled \n 1784 sem índice de imagem: relatórios desativados \n 1785 no images 1785 sem imagens 1786 no images found 1786 nenhuma imagem encontrada 1787 no input files available 1787 nenhum arquivo de entrada disponível 1788 no matching files found 1788 nenhum arquivo correspondente encontrado 1789 no matching locations 1789 nenhum local correspondente 1790 no metadata level data 1790 sem dados de nível de metadata 1791 no metadata tags to report 1791 nenhuma tag de metadata a relatar 1792 no option selected 1792 nenhuma opção selecionada 1793 no overlay file selected 1793 nenhum arquivo de sobreposição selecionado 1794 no photo date, skipped 1794 sem data da foto, ignorado 1795 no plugin output file found 1795 nenhum arquivo de saída do plugin encontrado 1796 no prior edit 1796 nenhuma edição anterior 1797 no prior edit image 1797 nenhuma imagem de edição anterior 1798 no saved folders 1798 nenhuma pasta salva 1799 no script file was started 1799 nenhum arquivo de script foi iniciado 1800 no script files found 1800 nenhum arquivo de script encontrado 1801 no select area 1801 nenhuma área selecionada 1802 no selection 1802 nenhuma seleção 1803 no title 1803 sem título 1804 no write permission 1804 sem permissão de escrita 1805 no write permission \n 1805 sem permissão de escrita \n 1806 no write permission: %s 1806 sem permissão de escrita: %s 1807 none 1807 nenhum 1808 not a known image file 1808 não é um arquivo de imagem conhecido 1809 not an image file 1809 não é um arquivo de imagem 1810 not an indexed image file \n 1810 não é um arquivo de imagem indexado \n 1811 nothing found 1811 nada encontrado 1812 nothing left, no change made 1812 nada restante, nenhuma alteração feita 1813 old file 1813 arquivo antigo 1814 old image index: reports will omit new files \n 1814 índice de imagem antigo: relatórios omitirão novos arquivos \n 1815 old keyword name >> new keyword name 1815 nome antigo da keyword >> novo nome da keyword 1816 omit high pixel 1816 omitir pixel alto 1817 omit low pixel 1817 omitir pixel baixo 1818 only %d tile images found 1818 apenas %d imagens de ladrilho encontradas 1819 opacity center 1819 opacidade central 1820 opacity edge 1820 opacidade da borda 1821 open album 1821 abrir álbum 1822 open and process color chart 1822 abrir e processar tabela de cores 1823 open as new current file 1823 abrir como novo arquivo atual 1824 optional deselect color 1824 cor de deseleção opcional 1825 original 1825 original 1826 originals 1826 originais 1827 other 1827 outro 1828 out of space for temp files \nsave your edits and quit Fotocx 1828 sem espaço para arquivos temporários \nsalve suas edições e saia do Fotocx 1829 outline 1829 contorno 1830 output file exists 1830 o arquivo de saída já existe 1831 output file exists, overwrite? 1831 o arquivo de saída já existe, substituir? 1832 output file size change, cannot use select area 1832 alteração no tamanho do arquivo de saída, não é possível usar selecionar área 1833 output file: 1833 arquivo de saída: 1834 output file: %s \n 1834 arquivo de saída: %s \n 1835 oval 1835 oval 1836 overlay file missing: %s 1836 arquivo de sobreposição ausente: %s 1837 owner 1837 proprietário 1838 paint 1838 pintar 1839 paint color 1839 cor de pintura 1840 paint edits cannot be used for this method 1840 pintar edições não pode ser usado para este método 1841 paint over transparent areas 1841 pintar sobre áreas transparentes 1842 paint radius 1842 raio de pintura 1843 palette 1843 paleta 1844 palette exceeds %d color limit 1844 paleta excede o limite de %d cores 1845 palette file 1845 arquivo de paleta 1846 palette has %d colors 1846 paleta tem %d cores 1847 palette loaded, %d colors 1847 paleta carregada, %d cores 1848 palette: 1848 paleta: 1849 patch area goal 1849 meta da área de correção 1850 percent 1850 porcentagem 1851 perform edits to include in the script file 1851 realizar edições para incluir no arquivo de script 1852 permissions: 1852 permissões: 1853 perspective 1853 perspectiva 1854 photo 1854 foto 1855 picklist file not found: %s 1855 arquivo de lista não encontrado: %s 1856 pixel = mean of best match neighbors 1856 pixel = média dos vizinhos com melhor correspondência 1857 pixel = median of all neighbors 1857 pixel = mediana de todos os vizinhos 1858 please make a choice 1858 por favor, faça uma escolha 1859 plugin command failed 1859 falha no comando do plugin 1860 plugin menu not found %s 1860 menu de plugin não encontrado %s 1861 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1861 plugins: (ano mês dia nome-antigo sequência) $yyyy $mm $dd $oldname $s 1862 popup_choose: empty list 1862 popup_choose: lista vazia 1863 position with mouse click/drag 1863 posição com clique/arraste do mouse 1864 position: 50 50 1864 posição: 50 50 1865 position: x=%02d y=%02d 1865 posição: x=%02d y=%02d 1866 power 1866 potência 1867 power center 1867 centro de potência 1868 power edge 1868 borda de potência 1869 power: center 1869 potência: centro 1870 pref 1870 pref. 1871 previous file 1871 arquivo anterior 1872 previous name 1872 nome anterior 1873 print color chart 1873 imprimir tabela de cores 1874 print select area(s) only? 1874 imprimir apenas área(s) selecionada(s)? 1875 prior edit step 1875 etapa de edição anterior 1876 project complete 1876 projeto concluído 1877 project file is defective 1877 arquivo de projeto está corrompido 1878 project name cannot have quote characters 1878 nome do projeto não pode ter aspas 1879 pure RGB or black/white dots 1879 pontos RGB puro ou preto/branco 1880 quality 1880 qualidade 1881 quality level (70+) 1881 nível de qualidade (70+) 1882 radius 1882 raio 1883 radius: 1883 raio: 1884 random 1884 aleatório 1885 random position 1885 posição aleatória 1886 rating range 1886 intervalo de avaliação 1887 reading image index file ...\n 1887 lendo arquivo de índice de imagem ...\n 1888 recent files 1888 arquivos recentes 1889 reduce bright 1889 reduzir claro 1890 reduce dark 1890 reduzir escuro 1891 reduce to these limits if larger 1891 reduzir a estes limites se for maior 1892 refresh 1892 atualizar 1893 remove %d duplicates? 1893 remover %d duplicatas? 1894 remove all files in list 1894 remover todos os arquivos da lista 1895 remove duplicate 1895 remover duplicata 1896 remove from set 1896 remover do conjunto 1897 remove panorama image curving 1897 remover curvatura da imagem do panorama 1898 remove selected file from list 1898 remover arquivo selecionado da lista 1899 rename keywords 1899 renomear keywords 1900 repair metadata for %s 1900 reparar metadata de %s 1901 replace 1901 substituir 1902 replace album %s ? 1902 substituir álbum %s ? 1903 replace file 1903 substituir arquivo 1904 replace old 1904 substituir antigo 1905 replace old file (OVERWRITE) 1905 substituir arquivo antigo (SOBRESCREVER) 1906 replace substring within file name 1906 substituir substring dentro do nome do arquivo 1907 report type: 1907 tipo de relatório: 1908 req. color match 1908 combinação de cor solicitada 1909 reset 1909 redefinir 1910 resolution 1910 resolução 1911 resume from current image 1911 retomar a partir da imagem atual 1912 right 1912 direita 1913 right click on image for deselected color 1913 clique com o botão direito na imagem para cor desmarcada 1914 sample % 1914 amostra % 1915 save 1915 salvar 1916 save Mashup output file 1916 salvar arquivo de saída do Mashup 1917 save Mashup project? 1917 salvar projeto Mashup? 1918 save area as a PNG file 1918 salvar área como um arquivo PNG 1919 save as new file name or type 1919 salvar como novo nome ou tipo de arquivo 1920 save as new file version 1920 salvar como nova versão de arquivo 1921 save edit, start new text 1921 salvar edição, iniciar novo texto 1922 save metadata to image file 1922 salvar metadata no arquivo de imagem 1923 save text data to a file 1923 salvar dados de texto em um arquivo 1924 save to .heic/.avif file not supported 1924 salvar em arquivo .heic/.avif não suportado 1925 save to .jp2 file not supported 1925 salvar em arquivo .jp2 não suportado 1926 save to .webp file not supported 1926 salvar em arquivo .webp não suportado 1927 scan and save color chart 1927 escanear e salvar tabela de cores 1928 scanned color chart file 1928 arquivo de tabela de cores escaneada 1929 scope of neighbor pixels 1929 alcance dos pixels vizinhos 1930 script already started 1930 script já iniciado 1931 script complete 1931 script concluído 1932 script error: %s, %s 1932 erro de script: %s, %s 1933 script file closed 1933 arquivo de script fechado 1934 script file error 1934 erro no arquivo de script 1935 script file format error: %s 1935 erro de formato do arquivo de script: %s 1936 script file name too big 1936 nome do arquivo de script grande demais 1937 script file to run 1937 arquivo de script a executar 1938 search for names in image location metadata 1938 buscar nomes na metadata de localização da imagem 1939 search for text within file folders or file name 1939 buscar texto dentro de pastas de arquivo ou nome de arquivo 1940 search for text within image title or description 1940 buscar texto dentro do título ou descrição da imagem 1941 search known locations 1941 buscar locais conhecidos 1942 search range 1942 intervalo de busca 1943 search: 1943 buscar: 1944 seconds 1944 segundos 1945 seconds to show with text 1945 segundos para mostrar com texto 1946 seconds to show without text 1946 segundos para mostrar sem texto 1947 select all 1947 selecionar tudo 1948 select all colors within mouse (flood) 1948 selecionar todas as cores dentro do mouse (preenchimento) 1949 select area missing or not finished 1949 área de seleção ausente ou não finalizada 1950 select area within mouse 1950 selecionar área dentro do mouse 1951 select area within mouse circle 1951 selecionar área dentro do círculo do mouse 1952 select base image for color matching 1952 selecionar imagem base para combinação de cores 1953 select by color, required match level 1953 selecionar por cor, nível de correspondência necessário 1954 select by color, search range 1954 selecionar por cor, intervalo de busca 1955 select font 1955 selecionar fonte 1956 select image to show with mouse paint 1956 selecionar imagem para mostrar com pintura do mouse 1957 select images randomly 1957 selecionar imagens aleatoriamente 1958 select initial files 1958 selecionar arquivos iniciais 1959 select line color 1959 selecionar cor da linha 1960 select one color within mouse 1960 selecionar uma cor dentro do mouse 1961 select rectangle 1961 selecionar retângulo 1962 select source image color first 1962 selecionar cor da imagem de origem primeiro 1963 select surrounding areas matching colors in mouse 1963 selecionar áreas ao redor com cores correspondentes no mouse 1964 selection exceeds %d tags 1964 seleção excede %d tags 1965 sepia 1965 sépia 1966 set a new date/time: 1966 definir uma nova data/hora: 1967 set all 1967 definir tudo 1968 set current window size 1968 definir tamanho atual da janela 1969 set image color from input files 1969 definir cor da imagem a partir dos arquivos de entrada 1970 set location from world map 1970 definir localização a partir do mapa mundial 1971 set maximum crop 1971 definir corte máximo 1972 shadow 1972 sombra 1973 shell command used for converting RAW files to RGB 1973 comando shell usado para converter arquivos RAW para RGB 1974 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1974 shift + clique esquerdo: escolher cor da imagem \narraste com botão esquerdo: pintar cor na imagem \narraste com botão direito: restaurar imagem original 1975 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1975 shift + clique esquerdo: sincronizar posição de cópia \narraste com botão esquerdo: copiar imagem de origem para o mouse \narraste com botão direito: restaurar imagem original 1976 shift existing date/time (+/–): 1976 deslocar data/hora existente (+/–): 1977 shift+click on image to select color 1977 shift+clique na imagem para selecionar cor 1978 shortcut function not found: %s 1978 função de atalho não encontrada: %s 1979 shortcut key: 1979 tecla de atalho: 1980 shortcut not found: %s 1980 atalho não encontrado: %s 1981 show area outlines 1981 mostrar contornos de área 1982 show hidden files and folders 1982 mostrar arquivos e pastas ocultos 1983 show transient objects 1983 mostrar objetos transitórios 1984 size of mouse selection circle 1984 tamanho do círculo de seleção do mouse 1985 smooth 1985 suave 1986 source file: 1986 arquivo de origem: 1987 source image failure (scale too big?) 1987 falha na imagem de origem (escala grande demais?) 1988 source image scale 1988 escala da imagem de origem 1989 specify a thumbnail folder 1989 especifique uma pasta de thumbnails 1990 specify at least 1 top image folder 1990 especifique ao menos 1 pasta de imagens principal 1991 specify background size and color 1991 especifique tamanho e cor do fundo 1992 specify files and keywords 1992 especifique arquivos e keywords 1993 spot size limit 1993 limite do tamanho da mancha 1994 start 1994 iniciar 1995 start a new script file 1995 iniciar um novo arquivo de script 1996 start album 1996 iniciar álbum 1997 start blob condensation process 1997 iniciar processo de condensação de manchas 1998 start file 1998 arquivo inicial 1999 start folder 1999 pasta inicial 2000 start from first image in album 2000 iniciar a partir da primeira imagem do álbum 2001 start fusion process 2001 iniciar processo de fusão 2002 start over at end of album 2002 recomeçar no fim do álbum 2003 start warp 2003 iniciar distorção 2004 start with previous image file, gallery of recent files, etc. 2004 iniciar com o arquivo de imagem anterior, galeria de arquivos recentes, etc. 2005 startup album is invalid 2005 álbum de inicialização é inválido 2006 startup file is invalid 2006 arquivo de inicialização é inválido 2007 startup folder is invalid 2007 pasta de inicialização é inválida 2008 status: %s \n 2008 status: %s \n 2009 status: completed \n 2009 status: concluído \n 2010 stay open 2010 permanecer aberto 2011 step 2011 etapa 2012 stop 2012 parar 2013 stop blob condensation process 2013 parar processo de condensação de manchas 2014 stop fusion process 2014 parar processo de fusão 2015 supply a file name 2015 forneça um nome de arquivo 2016 tag name 2016 nome da tag 2017 tag name %s not in xmeta tag list 2017 nome da tag %s não está na lista de tags xmeta 2018 tag value 2018 valor da tag 2019 target file: 2019 arquivo de destino: 2020 template 2020 modelo 2021 test: show changes, do not update files 2021 teste: mostrar alterações, não atualizar arquivos 2022 text 2022 texto 2023 text file is defective 2023 arquivo de texto está corrompido 2024 text time 2024 hora do texto 2025 this function cannot be scripted 2025 esta função não pode ser roteirizada 2026 thumbnail file 2026 arquivo de thumbnail 2027 thumbnails deleted: %d \n 2027 thumbnails excluídas: %d \n 2028 thumbnails folder: %s \n 2028 pasta de thumbnails: %s \n 2029 tile area goal 2029 meta da área do ladrilho 2030 tile gap 2030 espaço entre ladrilhos 2031 tile size 2031 tamanho do ladrilho 2032 time 2032 hora 2033 title/desc. 2033 título/desc. 2034 to add images to current set, \nsearch all images 2034 para adicionar imagens ao conjunto atual, \nbusque todas as imagens 2035 to remove images from current set, \nsearch current set 2035 para remover imagens do conjunto atual, \nbusque o conjunto atual 2036 too many categories 2036 categorias em excesso 2037 too many files, cannot continue 2037 arquivos em excesso, não é possível continuar 2038 too many keywords in a category 2038 keywords em excesso em uma categoria 2039 top image folders: \n 2039 pastas de imagens principais: \n 2040 transition 2040 transição 2041 transitions 2041 transições 2042 trash 2042 lixeira 2043 trimmed color chart file 2043 arquivo de tabela de cores aparada 2044 unable to save bookmarks file 2044 não é possível salvar o arquivo de marcadores 2045 unknown edit function: %s 2045 função de edição desconhecida: %s 2046 unknown file type 2046 tipo de arquivo desconhecido 2047 unknown or empty album: %s 2047 álbum desconhecido ou vazio: %s 2048 unsharp mask 2048 máscara de nitidez 2049 update 2049 atualizar 2050 updating albums ...\n 2050 atualizando álbuns ...\n 2051 upper 2051 superior 2052 upsize 2052 aumentar tamanho 2053 use 2053 usar 2054 use a saved Mashup project 2054 usar um projeto Mashup salvo 2055 use average 2055 usar média 2056 use custom color palette 2056 usar paleta de cores personalizada 2057 use median 2057 usar mediana 2058 use option to stop accidental quit 2058 usar opção para evitar saída acidental 2059 use previous input 2059 usar entrada anterior 2060 use previous location 2060 usar local anterior 2061 use prior edit step: 2061 usar etapa de edição anterior: 2062 use the current image file 2062 usar o arquivo de imagem atual 2063 variance 2063 variância 2064 versions 2064 versões 2065 vertical 2065 vertical 2066 video files not supported (install ffmpeg) 2066 arquivos de vídeo não suportados (instale ffmpeg) 2067 view album 2067 ver álbum 2068 waiting 2068 aguardando 2069 warp 2069 distorcer 2070 warp and align selected image with mouse drags 2070 distorcer e alinhar imagem selecionada com arrastos do mouse 2071 warp and fine-align selected image with neighbor 2071 distorcer e alinhar com precisão a imagem selecionada com o vizinho 2072 warp span 2072 extensão da distorção 2073 wavelength 2073 comprimento de onda 2074 width 2074 largura 2075 writing updated image index file \n 2075 gravando arquivo de índice de imagem atualizado \n 2076 x-count 2076 contagem-x 2077 x-offset 2077 deslocamento-x 2078 y-count 2078 contagem-y 2079 y-offset 2079 deslocamento-y 2080 years 2080 anos 2081 you can close this window now \n 2081 você já pode fechar esta janela \n 2082 you cannot use new name and replace text together 2082 você não pode usar novo nome e substituir texto ao mesmo tempo 2083 you must use either $s or $oldname 2083 você deve usar $s ou $oldname 2084 zoom image 2084 zoom na imagem 2085 zoom via mouse wheel or Keys +/=/-/↑/↓ 2085 zoom pela roda do mouse ou teclas +/=/-/↑/↓ 2086 zoom-in 2086 zoom-in 2087 zoom-out 2087 zoom-out fotocx/data/translations/gui_el0000664000175000017500000053711715247006657015675 0ustar micomico0000 + Zoom-in \n 0000 + Zoom-in \n 0001 - Zoom-out \n 0001 - Zoom-out \n 0002 = Zoom-in \n 0002 = Zoom-in \n 0003 Arrow keys Previous/Next file \n 0003 Arrow keys Προηγούμενο/Επόμενο αρχείο \n 0004 Delete Delete/Trash file \n 0004 Delete Διαγραφή/Απόρριψη αρχείου \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Escape Έξοδος από παράθυρο διαλόγου / Έξοδος από το Fotocx \n 0006 F1 User Guide, Context Help \n 0006 F1 Οδηγός Χρήσης, Βοήθεια Περιεχομένου \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 Πλήρης Οθόνη / χωρίς μενού \n 0008 Home/End Gallery start/end \n 0008 Home/End Αρχή/Τέλος γκαλερί \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 Ο χρόνος ευρετηρίασης εξαρτάται από τον αριθμό, τον τύπο και το μέγεθος \n των αρχείων εικόνας σας και την ταχύτητα του υπολογιστή σας. Αυτό μπορεί \n να κυμαίνεται από μερικές εκατοντάδες έως πάνω από 10 χιλιάδες ανά λεπτό. \n Μπορείτε να αλλάξετε τις επιλογές ευρετηρίου αργότερα, χρησιμοποιώντας αυτά τα μενού: \n Εργαλεία > Ευρετήριο, Εργαλεία > Ρυθμίσεις. \n 0010 Page keys Gallery page up/down \n 0010 Page keys Σελίδα γκαλερί πάνω/κάτω \n 0011 Z 1x <--> fit to window \n 0011 Z 1x <--> προσαρμογή στο παράθυρο \n 0012 $s plugin needs base and adder 0012 Το plugin $s χρειάζεται base και adder 0013 % from left: 0013 % από αριστερά: 0014 % from top: 0014 % από πάνω: 0015 %d albums selected 0015 %d άλμπουμ επιλεγμένα 0016 %d image files selected 0016 %d αρχεία εικόνας επιλεγμένα 0017 %d images 0017 %d εικόνες 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 %d keywords προς εκκαθάριση \nσε %d αρχεία εικόνας. \nΣυνέχεια; 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 %d keywords προς μετονομασία \nσε %d αρχεία εικόνας. \nΣυνέχεια; 0020 %d max images exceeded 0020 Υπέρβαση μέγιστου αριθμού %d εικόνων 0021 %d red-eye limit reached 0021 Συμπληρώθηκε το όριο %d κόκκινων ματιών 0022 %s %s %d folders %d files 0022 %s %s %d φάκελοι %d αρχεία 0023 %s *** date/time conversion failed \n 0023 %s *** αποτυχία μετατροπής ημερομηνίας/ώρας \n 0024 %s ALBUM %s %d files 0024 %s ΑΛΜΠΟΥΜ %s %d αρχεία 0025 %s NEWEST FILES 0025 %s ΠΙΟ ΠΡΟΣΦΑΤΑ ΑΡΧΕΙΑ 0026 %s RECENT FILES 0026 %s ΠΡΟΣΦΑΤΑ ΑΡΧΕΙΑ 0027 %s SEARCH RESULTS %d files 0027 %s ΑΠΟΤΕΛΕΣΜΑΤΑ ΑΝΑΖΗΤΗΣΗΣ %d αρχεία 0028 %s UNKNOWN 0028 %s ΑΓΝΩΣΤΟ 0029 %s added to script 0029 %s προστέθηκε στο σενάριο 0030 %s is already indexed 0030 %s είναι ήδη ευρετηριασμένο 0031 %s renamed: %s 0031 %s μετονομάστηκε: %s 0032 %s: metadata update failed 0032 %s: αποτυχία ενημέρωσης metadata 0033 %s: no write permission 0033 %s: δεν υπάρχει δικαίωμα εγγραφής 0034 %s: reserved, cannot be used 0034 %s: δεσμευμένο, δεν μπορεί να χρησιμοποιηθεί 0035 %s: too many keywords 0035 %s: πάρα πολλά keywords 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\nΗμερομηνία Φωτογραφίας: %s Ημερομηνία Αρχείου: %s \nΒαθμολογία: %s Μέγεθος: %s %.2fmb \nΤοποθεσία: %s %s %s \nKeywords: %s \nΤίτλος: %s \nΠεριγραφή: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\nΗμερομηνία Φωτογραφίας: %s Ημερομηνία Αρχείου: %s \nΒαθμολογία: %s Μέγεθος: %s %.2fmb \nΤοποθεσία: %s %s %s \nKeywords: %s \nΤίτλος: %s \nΠεριγραφή: %s \n----------------------- \n%s 0038 (click below) 0038 (κάντε κλικ παρακάτω) 0039 (no selection) 0039 (καμία επιλογή) 0040 (pixels) 0040 (pixel) 0041 (press key) 0041 (πατήστε πλήκτρο) 0042 (select function) 0042 (επιλέξτε λειτουργία) 0043 *** bad utf8 detected *** \n 0043 *** εντοπίστηκε εσφαλμένο utf8 *** \n 0044 *** cannot create new file \n 0044 *** δεν είναι δυνατή η δημιουργία νέου αρχείου \n 0045 *** cannot get real path of input file \n 0045 *** δεν είναι δυνατή η ανάκτηση της πραγματικής διαδρομής του αρχείου εισόδου \n 0046 *** cannot load input file \n 0046 *** δεν είναι δυνατή η φόρτωση του αρχείου εισόδου \n 0047 *** cannot make new version of input file \n 0047 *** δεν είναι δυνατή η δημιουργία νέας έκδοσης του αρχείου εισόδου \n 0048 *** cannot open input file 0048 *** δεν είναι δυνατό το άνοιγμα του αρχείου εισόδου 0049 *** cannot read input file 0049 *** δεν είναι δυνατή η ανάγνωση του αρχείου εισόδου 0050 *** cannot save output file \n 0050 *** δεν είναι δυνατή η αποθήκευση του αρχείου εξόδου \n 0051 *** completed \n 0051 *** ολοκληρώθηκε \n 0052 *** file date/time invalid \n 0052 *** μη έγκυρη ημερομηνία/ώρα αρχείου \n 0053 *** file type not supported \n 0053 *** ο τύπος αρχείου δεν υποστηρίζεται \n 0054 *** invalid file \n 0054 *** μη έγκυρο αρχείο \n 0055 *** metadata update error \n 0055 *** σφάλμα ενημέρωσης metadata \n 0056 *** no date/time available \n 0056 *** δεν υπάρχει διαθέσιμη ημερομηνία/ώρα \n 0057 + bright 0057 + φωτεινό 0058 +Blue -Yellow 0058 +Μπλε -Κίτρινο 0059 +Brightness 0059 +Φωτεινότητα 0060 +Green -Magenta 0060 +Πράσινο -Ματζέντα 0061 +Red -Cyan 0061 +Κόκκινο -Κυανό 0062 - blue 0062 - μπλε 0063 - fog/haze 0063 - ομίχλη/καταχνιά 0064 .heic/.avif files not supported (install heif_convert) 0064 Τα αρχεία .heic/.avif δεν υποστηρίζονται (εγκαταστήστε το heif_convert) 0065 .jp2 files not supported (install opj_decompress) 0065 Τα αρχεία .jp2 δεν υποστηρίζονται (εγκαταστήστε το opj_decompress) 0066 .webp files not supported (install dwebp) 0066 Τα αρχεία .webp δεν υποστηρίζονται (εγκαταστήστε το dwebp) 0067 0 albums selected 0067 0 άλμπουμ επιλεγμένα 0068 0 duplicates 0068 0 διπλότυπα 0069 0-5 stars 0069 0-5 αστέρια 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = χωρίς ευρετήριο εικόνων, μόνο παλιό ευρετήριο, παλιό + ενημέρωση νέων/τροποποιημένων 0071 2-character code 0071 κωδικός 2 χαρακτήρων 0072 3D depth 0072 Βάθος 3D 0073 <2 images 0073 <2 εικόνες 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 Εγκαθίσταται μια νέα έκδοση του Fotocx. \nΊσως χρειαστεί να επαναφέρετε τις προσαρμοσμένες ρυθμίσεις. 0075 ADD GLARE 0075 ΠΡΟΣΘΗΚΗ ΛΑΜΨΗΣ 0076 ADD NOISE 0076 ΠΡΟΣΘΗΚΗ ΘΟΡΥΒΟΥ 0077 ADJUST HSL 0077 ΠΡΟΣΑΡΜΟΓΗ HSL 0078 ADJUST RGB 0078 ΠΡΟΣΑΡΜΟΓΗ RGB 0079 ALBUM MASS UPDATE 0079 ΜΑΖΙΚΗ ΕΝΗΜΕΡΩΣΗ ΑΛΜΠΟΥΜ 0080 ALBUMS 0080 ΑΛΜΠΟΥΜ 0081 ALBUMS MENU 0081 ΜΕΝΟΥ ΑΛΜΠΟΥΜ 0082 ALIEN COLORS 0082 ΠΕΡΙΕΡΓΑ ΧΡΩΜΑΤΑ 0083 AMPLIFY CONTRAST 0083 ΕΝΙΣΧΥΣΗ ΑΝΤΙΘΕΣΗΣ 0084 ANTI-ALIAS 0084 ΕΞΟΜΑΛΥΝΣΗ ΑΚΜΩΝ 0085 AREA BLEND 0085 ΑΝΑΜΕΙΞΗ ΠΕΡΙΟΧΗΣ 0086 AREA FILL 0086 ΓΕΜΙΣΜΑ ΠΕΡΙΟΧΗΣ 0087 AREA OVERVIEW 0087 ΕΠΙΣΚΟΠΗΣΗ ΠΕΡΙΟΧΗΣ 0088 AUTOSEARCH 0088 ΑΥΤΟΜΑΤΗ ΑΝΑΖΗΤΗΣΗ 0089 About 0089 Σχετικά 0090 Action 0090 Ενέργεια 0091 Add 0091 Προσθήκη 0092 Add 1 0092 Προσθήκη 1 0093 Add All 0093 Προσθήκη Όλων 0094 Add Current 0094 Προσθήκη Τρέχοντος 0095 Add Current File Here 0095 Προσθήκη Τρέχοντος Αρχείου Εδώ 0096 Add Glare 0096 Προσθήκη Λάμψης 0097 Add Image 0097 Προσθήκη Εικόνας 0098 Add Line 0098 Προσθήκη Γραμμής 0099 Add Margins 0099 Προσθήκη Περιθωρίων 0100 Add Noise 0100 Προσθήκη Θορύβου 0101 Add Random Noise 0101 Προσθήκη Τυχαίου Θορύβου 0102 Add Selected Files Here 0102 Προσθήκη Επιλεγμένων Αρχείων Εδώ 0103 Add Texture 0103 Προσθήκη Υφής 0104 Add a brightness/color ramp across an image 0104 Προσθήκη διαβάθμισης φωτεινότητας/χρώματος σε όλη την εικόνα 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 Προσθήκη σελιδοδείκτη: κάντε κλικ σε ένα thumbnail της γκαλερί. \nΜετονομασία σελιδοδείκτη: κάντε κλικ σε αυτόν και πατήστε [Μετονομασία] 0106 Add glare around bright objects 0106 Προσθήκη λάμψης γύρω από φωτεινά αντικείμενα 0107 Add margins around an image 0107 Προσθήκη περιθωρίων γύρω από μια εικόνα 0108 Add newest version to existing versions 0108 Προσθήκη πιο πρόσφατης έκδοσης στις υπάρχουσες εκδόσεις 0109 Add overlay image (e.g. copyright) to selected images 0109 Προσθήκη εικόνας επικάλυψης (π.χ. πνευματικά δικαιώματα) στις επιλεγμένες εικόνες 0110 Add random noise to an image 0110 Προσθήκη τυχαίου θορύβου σε μια εικόνα 0111 Add selected versions to existing versions 0111 Προσθήκη επιλεγμένων εκδόσεων στις υπάρχουσες εκδόσεις 0112 Add texture to an image 0112 Προσθήκη υφής σε μια εικόνα 0113 Add to Selection 0113 Προσθήκη στην Επιλογή 0114 Add/change/delete metadata for selected image files 0114 Προσθήκη/αλλαγή/διαγραφή metadata για τα επιλεγμένα αρχεία εικόνας 0115 Add/remove barrel/pincushion distortion 0115 Προσθήκη/αφαίρεση παραμόρφωσης βαρελιού/μαξιλαριού 0116 Add/remove brightness/color radially from chosen center 0116 Προσθήκη/αφαίρεση φωτεινότητας/χρώματος ακτινικά από επιλεγμένο κέντρο 0117 Add/remove keywords for selected image files 0117 Προσθήκη/αφαίρεση keywords για τα επιλεγμένα αρχεία εικόνας 0118 Add/revise location/geocoordinates for selected image files 0118 Προσθήκη/αναθεώρηση τοποθεσίας/γεωσυντεταγμένων για τα επιλεγμένα αρχεία εικόνας 0119 Adjust HSL 0119 Προσαρμογή HSL 0120 Adjust Image Contributions 0120 Προσαρμογή Συνεισφορών Εικόνας 0121 Adjust Pixel Composition 0121 Προσαρμογή Σύνθεσης Pixel 0122 Adjust RGB 0122 Προσαρμογή RGB 0123 Adjust brightness, contrast, color 0123 Προσαρμογή φωτεινότητας, αντίθεσης, χρώματος 0124 Adjust color saturation based on brightness 0124 Προσαρμογή κορεσμού χρώματος με βάση τη φωτεινότητα 0125 Adjust color using HSL color model 0125 Προσαρμογή χρώματος με χρήση του μοντέλου χρώματος HSL 0126 Adjust color using RGB or CMY colors 0126 Προσαρμογή χρώματος με χρήση χρωμάτων RGB ή CMY 0127 Adjustment 0127 Προσαρμογή 0128 Album Mass Update 0128 Μαζική Ενημέρωση Άλμπουμ 0129 Album Name 0129 Όνομα Άλμπουμ 0130 Albums 0130 Άλμπουμ 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 Άλμπουμ: γκαλερί επιλεγμένων εικόνων, διάταξη με μεταφορά & απόθεση 0132 Algorithm Iterations 0132 Επαναλήψεις Αλγορίθμου 0133 Alien Colors 0133 Περίεργα Χρώματα 0134 All 0134 Όλα 0135 All Areas 0135 Όλες οι Περιοχές 0136 All files 0136 Όλα τα αρχεία 0137 All image files will be re-indexed. \nContinue? 0137 Όλα τα αρχεία εικόνας θα επανευρετηριαστούν. \nΣυνέχεια; 0138 All±1 0138 Όλα±1 0139 All±10 0139 Όλα±10 0140 Alpha 0140 Άλφα 0141 Amount 0141 Ποσότητα 0142 Amplify 0142 Ενίσχυση 0143 Amplify Contrast 0143 Ενίσχυση Αντίθεσης 0144 Amplify area contrast to enhance visibility of details 0144 Ενίσχυση αντίθεσης περιοχής για καλύτερη ορατότητα λεπτομερειών 0145 Angle 0145 Γωνία 0146 Anti-Alias 0146 Εξομάλυνση Ακμών 0147 Apply 0147 Εφαρμογή 0148 Apply a soft focus effect to an image 0148 Εφαρμογή εφέ ήπιας εστίασης σε μια εικόνα 0149 Apply repeatedly while watching the image. 0149 Εφαρμόστε επανειλημμένα ενώ παρακολουθείτε την εικόνα. 0150 Area Blend 0150 Ανάμειξη Περιοχής 0151 Area Edge Blend 0151 Ανάμειξη Άκρων Περιοχής 0152 Area Fill 0152 Γέμισμα Περιοχής 0153 Arrange images and text in a layout (photo-montage) 0153 Διάταξη εικόνων και κειμένου σε μια σελίδα (φωτομοντάζ) 0154 Array Complete 0154 Ολοκλήρωση Πίνακα 0155 Array Width 0155 Πλάτος Πίνακα 0156 Arrow head 0156 Κεφαλή Βέλους 0157 Auto Level 0157 Αυτόματο Επίπεδο 0158 Auto black level 0158 Αυτόματο επίπεδο μαύρου 0159 Auto crop: 0159 Αυτόματη περικοπή: 0160 Auto white balance 0160 Αυτόματη ισορροπία λευκού 0161 Auto-replay 0161 Αυτόματη επανάληψη 0162 BATCH CHANGE META 0162 ΜΑΖΙΚΗ ΑΛΛΑΓΗ META 0163 BATCH CONVERT 0163 ΜΑΖΙΚΗ ΜΕΤΑΤΡΟΠΗ 0164 BATCH COPY/MOVE 0164 ΜΑΖΙΚΗ ΑΝΤΙΓΡΑΦΗ/ΜΕΤΑΚΙΝΗΣΗ 0165 BATCH DELETE/TRASH 0165 ΜΑΖΙΚΗ ΔΙΑΓΡΑΦΗ/ΑΠΟΡΡΙΨΗ 0166 BATCH GEOTAGS 0166 ΜΑΖΙΚΑ GEOTAGS 0167 BATCH KEYWORDS 0167 ΜΑΖΙΚΑ KEYWORDS 0168 BATCH MENU 0168 ΜΕΝΟΥ ΜΑΖΙΚΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ 0169 BATCH OVERLAY 0169 ΜΑΖΙΚΗ ΕΠΙΚΑΛΥΨΗ 0170 BATCH PHOTO DATE 0170 ΜΑΖΙΚΗ ΗΜΕΡΟΜΗΝΙΑ ΦΩΤΟΓΡΑΦΙΑΣ 0171 BATCH PROCESSING 0171 ΜΑΖΙΚΗ ΕΠΕΞΕΡΓΑΣΙΑ 0172 BATCH PURGE KEYWORDS 0172 ΜΑΖΙΚΗ ΕΚΚΑΘΑΡΙΣΗ KEYWORDS 0173 BATCH RENAME KEYWORDS 0173 ΜΑΖΙΚΗ ΜΕΤΟΝΟΜΑΣΙΑ KEYWORDS 0174 BATCH REPORT META 0174 ΜΑΖΙΚΗ ΑΝΑΦΟΡΑ META 0175 BATCH SCRIPT 0175 ΣΕΝΑΡΙΟ ΜΑΖΙΚΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ 0176 BATCH UPRIGHT 0176 ΜΑΖΙΚΗ ΙΣΙΩΣΗ 0177 BLANK IMAGE 0177 ΚΕΝΗ ΕΙΚΟΝΑ 0178 BLUR 0178 ΘΟΛΩΜΑ 0179 BOOKMARKS 0179 ΣΕΛΙΔΟΔΕΙΚΤΕΣ 0180 BRIGHTNESS RAMP 0180 ΔΙΑΒΑΘΜΙΣΗ ΦΩΤΕΙΝΟΤΗΤΑΣ 0181 Background 0181 Φόντο 0182 Background Blur - blur relative to distance from foreground 0182 Θόλωμα Φόντου - θόλωμα ανάλογα με την απόσταση από το προσκήνιο 0183 Background Color 0183 Χρώμα Φόντου 0184 Background Pattern 0184 Μοτίβο Φόντου 0185 Base Transparency 0185 Βασική Διαφάνεια 0186 Batch 0186 Μαζική Επεξεργασία 0187 Batch Add/Change Metadata 0187 Μαζική Προσθήκη/Αλλαγή Metadata 0188 Batch Add/Remove Keywords 0188 Μαζική Προσθήκη/Αφαίρεση Keywords 0189 Batch Change Meta 0189 Μαζική Αλλαγή Meta 0190 Batch Convert 0190 Μαζική Μετατροπή 0191 Batch Copy/Move 0191 Μαζική Αντιγραφή/Μετακίνηση 0192 Batch Delete/Trash 0192 Μαζική Διαγραφή/Απόρριψη 0193 Batch Geotags 0193 Μαζικά Geotags 0194 Batch Keywords 0194 Μαζικά Keywords 0195 Batch Metadata 0195 Μαζικά Metadata 0196 Batch Overlay 0196 Μαζική Επικάλυψη 0197 Batch Photo Date 0197 Μαζική Ημερομηνία Φωτογραφίας 0198 Batch Photo Date/Time 0198 Μαζική Ημερομηνία/Ώρα Φωτογραφίας 0199 Batch Purge Keywords 0199 Μαζική Εκκαθάριση Keywords 0200 Batch Rename Keywords 0200 Μαζική Μετονομασία Keywords 0201 Batch Report Meta 0201 Μαζική Αναφορά Meta 0202 Batch Report Metadata 0202 Μαζική Αναφορά Metadata 0203 Batch Set Geotags 0203 Μαζικός Ορισμός Geotags 0204 Batch Upright 0204 Μαζική Ίσιωση 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 Μαζική επεξεργασία: αντιγραφή, μετακίνηση, μετατροπή, μετατροπή RAW, προσθήκη/αλλαγή metadata 0206 Bend and fine-align 0206 Κάμψη και ακριβής ευθυγράμμιση 0207 Bias 0207 Απόκλιση 0208 Black 0208 Μαύρο 0209 Blank Image 0209 Κενή Εικόνα 0210 Blend 0210 Ανάμειξη 0211 Blend 0% 0211 Ανάμειξη 0% 0212 Blend Width 0212 Πλάτος Ανάμειξης 0213 Blend area edits/edges using the mouse 0213 Ανάμειξη επεξεργασιών/άκρων περιοχής με το ποντίκι 0214 Blend: 0% 0214 Ανάμειξη: 0% 0215 Blue 0215 Μπλε 0216 Blue Factors 0216 Συντελεστές Μπλε 0217 Blur 0217 Θόλωμα 0218 Blur Angle (degrees) 0218 Γωνία Θολώματος (μοίρες) 0219 Blur Background 0219 Θόλωμα Φόντου 0220 Blur Image 0220 Θόλωμα Εικόνας 0221 Blur Mix 0221 Ανάμειξη Θολώματος 0222 Blur Normal 0222 Κανονικό Θόλωμα 0223 Blur Radius 0223 Ακτίνα Θολώματος 0224 Blur Span 0224 Εύρος Θολώματος 0225 Blur Span (pixels) 0225 Εύρος Θολώματος (pixel) 0226 Blur the image (various methods) 0226 Θόλωμα της εικόνας (διάφορες μέθοδοι) 0227 Bookmarks 0227 Σελιδοδείκτες 0228 Both 0228 Και τα δύο 0229 Bottom 0229 Κάτω 0230 Bright Limit 0230 Όριο Φωτεινότητας 0231 Bright Point 0231 Σημείο Φωτεινότητας 0232 Brightness 0232 Φωτεινότητα 0233 Brightness Histogram 0233 Ιστόγραμμα Φωτεινότητας 0234 Brightness Ramp 0234 Διαβάθμιση Φωτεινότητας 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 Η φωτεινότητα πρέπει να παρουσιάζει μια ομαλή διαβάθμιση \nπου εκτείνεται μέχρι τις άκρες. 0236 Browse 0236 Περιήγηση 0237 CALIBRATE PRINTER 0237 ΒΑΘΜΟΝΟΜΗΣΗ ΕΚΤΥΠΩΤΗ 0238 CAPTIONS 0238 ΛΕΖΑΝΤΕΣ 0239 CARTOON 0239 ΚΙΝΟΥΜΕΝΟ ΣΧΕΔΙΟ 0240 CHOOSE ALBUM 0240 ΕΠΙΛΟΓΗ ΑΛΜΠΟΥΜ 0241 CLEAR AREA 0241 ΕΚΚΑΘΑΡΙΣΗ ΠΕΡΙΟΧΗΣ 0242 CLOSE 0242 ΚΛΕΙΣΙΜΟ 0243 COLOR MODE 0243 ΛΕΙΤΟΥΡΓΙΑ ΧΡΩΜΑΤΟΣ 0244 COMBINE MENU 0244 ΜΕΝΟΥ ΣΥΝΔΥΑΣΜΟΥ 0245 COMMAND PARAMETERS 0245 ΠΑΡΑΜΕΤΡΟΙ ΕΝΤΟΛΩΝ 0246 COMPLETED 0246 ΟΛΟΚΛΗΡΩΘΗΚΕ 0247 COPY FROM IMAGE 0247 ΑΝΤΙΓΡΑΦΗ ΑΠΟ ΕΙΚΟΝΑ 0248 COPY IN IMAGE 0248 ΑΝΤΙΓΡΑΦΗ ΜΕΣΑ ΣΤΗΝ ΕΙΚΟΝΑ 0249 COPY META 0249 ΑΝΤΙΓΡΑΦΗ META 0250 COPY PRIOR EDIT 0250 ΑΝΤΙΓΡΑΦΗ ΠΡΟΗΓΟΥΜΕΝΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ 0251 COPY TO CLIPBOARD 0251 ΑΝΤΙΓΡΑΦΗ ΣΤΟ ΠΡΟΧΕΙΡΟ 0252 COPY TO DESKTOP 0252 ΑΝΤΙΓΡΑΦΗ ΣΤΗΝ ΕΠΙΦΑΝΕΙΑ ΕΡΓΑΣΙΑΣ 0253 COPY/MOVE 0253 ΑΝΤΙΓΡΑΦΗ/ΜΕΤΑΚΙΝΗΣΗ 0254 COPY/PASTE AREA 0254 ΑΝΤΙΓΡΑΦΗ/ΕΠΙΚΟΛΛΗΣΗ ΠΕΡΙΟΧΗΣ 0255 CREATE ALBUM 0255 ΔΗΜΙΟΥΡΓΙΑ ΑΛΜΠΟΥΜ 0256 CROP 0256 ΠΕΡΙΚΟΠΗ 0257 CROSSHATCH 0257 ΔΙΧΤΥΩΤΗ ΣΚΙΑΣΗ 0258 CURRENT ALBUM 0258 ΤΡΕΧΟΝ ΑΛΜΠΟΥΜ 0259 CURRENT FILE FOLDER 0259 ΦΑΚΕΛΟΣ ΤΡΕΧΟΝΤΟΣ ΑΡΧΕΙΟΥ 0260 CURVE EDITING 0260 ΕΠΕΞΕΡΓΑΣΙΑ ΚΑΜΠΥΛΗΣ 0261 CUSTOM KERNEL 0261 ΠΡΟΣΑΡΜΟΣΜΕΝΟΣ ΠΥΡΗΝΑΣ 0262 CUSTOM MENU 0262 ΠΡΟΣΑΡΜΟΣΜΕΝΟ ΜΕΝΟΥ 0263 CYCLE 2 FILES 0263 ΕΝΑΛΛΑΓΗ 2 ΑΡΧΕΙΩΝ 0264 CYCLE 3 FILES 0264 ΕΝΑΛΛΑΓΗ 3 ΑΡΧΕΙΩΝ 0265 Calculate 0265 Υπολογισμός 0266 Calculate Geometry 0266 Υπολογισμός Γεωμετρίας 0267 Calibrate Printer 0267 Βαθμονόμηση Εκτυπωτή 0268 Cancel 0268 Ακύρωση 0269 Cartoon 0269 Κινούμενο Σχέδιο 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 Προσοχή: Χρησιμοποιήστε τη λειτουργία Επεξεργασία Κύριων Metadata \nγια να αλλάξετε τα διαθέσιμα εκεί tags, ώστε να διασφαλιστεί \nη ενημέρωση των σχετικών στοιχείων. 0271 Center 0271 Κέντρο 0272 Center Hole 0272 Κεντρική Οπή 0273 Change 0273 Αλλαγή 0274 Change Log 0274 Ιστορικό Αλλαγών 0275 Change file name 0275 Αλλαγή ονόματος αρχείου 0276 Change gallery sort order 0276 Αλλαγή σειράς ταξινόμησης γκαλερί 0277 Change image colors using an algorithm 0277 Αλλαγή χρωμάτων εικόνας με χρήση αλγορίθμου 0278 Change image pixel dimensions 0278 Αλλαγή διαστάσεων εικόνας σε pixel 0279 Chart to adjust monitor color 0279 Πίνακας για προσαρμογή χρώματος οθόνης 0280 Choose 0280 Επιλογή 0281 Choose Album 0281 Επιλογή Άλμπουμ 0282 Choose Albums 0282 Επιλογή Άλμπουμ 0283 Choose Captions 0283 Επιλογή Λεζαντών 0284 Choose an album and show as gallery of images 0284 Επιλέξτε ένα άλμπουμ και εμφανίστε το ως γκαλερί εικόνων 0285 Choose metadata shown on image captions 0285 Επιλέξτε τα metadata που εμφανίζονται στις λεζάντες εικόνων 0286 Choose new Fotocx home folder 0286 Επιλέξτε νέο κύριο φάκελο του Fotocx 0287 Choose thumbnail folder 0287 Επιλέξτε φάκελο thumbnail 0288 Choose top image folders 0288 Επιλέξτε κύριους φακέλους εικόνων 0289 Clear 0289 Εκκαθάριση 0290 Click dark spot for black level 0290 Κάντε κλικ σε σκοτεινό σημείο για επίπεδο μαύρου 0291 Click for RGB histogram 0291 Κάντε κλικ για ιστόγραμμα RGB 0292 Click gray spot for white balance 0292 Κάντε κλικ σε γκρι σημείο για ισορροπία λευκού 0293 Click image to select pixels 0293 Κάντε κλικ στην εικόνα για επιλογή pixel 0294 Click image to select, drag image to move. 0294 Κάντε κλικ στην εικόνα για επιλογή, σύρετε την εικόνα για μετακίνηση. 0295 Click mouse to change center 0295 Κάντε κλικ με το ποντίκι για αλλαγή κέντρου 0296 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0296 Κάντε κλικ κοντά σε οποιοδήποτε σημείο του περιγράμματος της περιοχής. \nΠιθανά κενά στο περίγραμμα θα εντοπιστούν. \nΠατήστε F1 για βοήθεια 0297 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0297 Κάντε κλικ στις τέσσερις γωνίες μιας τετράπλευρης περιοχής. Πατήστε [εφαρμογή]. \nΗ εικόνα παραμορφώνεται ώστε το τετράπλευρο να γίνει ορθογώνιο. 0298 Click thumbnail to select file 0298 Κάντε κλικ σε ένα thumbnail για επιλογή αρχείου 0299 Clip Level 0299 Επίπεδο Αποκοπής 0300 Clip Limit % 0300 Όριο Αποκοπής % 0301 Color 0301 Χρώμα 0302 Color Chooser 0302 Επιλογέας Χρώματος 0303 Color Depth: 0303 Βάθος Χρώματος: 0304 Color Fringes 0304 Χρωματικές Παρυφές 0305 Color Hue 0305 Απόχρωση Χρώματος 0306 Color Map File 0306 Αρχείο Χάρτη Χρωμάτων 0307 Color Match Images 0307 Ταίριασμα Χρωμάτων Εικόνων 0308 Color Mode 0308 Λειτουργία Χρώματος 0309 Color calibration tool for printer and paper type 0309 Εργαλείο βαθμονόμησης χρώματος για εκτυπωτή και τύπο χαρτιού 0310 Color map file to use 0310 Αρχείο χάρτη χρωμάτων προς χρήση 0311 Combine 0311 Συνδυασμός 0312 Combine 2-6 images into a wide panorama image 0312 Συνδυασμός 2-6 εικόνων σε ένα ευρύ πανοραμικό 0313 Combine many images into an array of images 0313 Συνδυασμός πολλών εικόνων σε πίνακα εικόνων 0314 Combine multiple images in layers, select and expose layers 0314 Συνδυασμός πολλών εικόνων σε επίπεδα, επιλογή και εμφάνιση επιπέδων 0315 Combine multiple noisy photos into a low-noise image 0315 Συνδυασμός πολλών θορυβωδών φωτογραφιών σε μία εικόνα χαμηλού θορύβου 0316 Combine multiple photos to erase passing people, etc. 0316 Συνδυασμός πολλών φωτογραφιών για διαγραφή διερχόμενων ανθρώπων κ.λπ. 0317 Combine within 0317 Συνδυασμός εντός 0318 Combine: HDR, HDF, stack, panorama, mashup, image array 0318 Συνδυασμός: HDR, HDF, στοίβαξη, πανόραμα, mashup, πίνακας εικόνων 0319 Command Params 0319 Παράμετροι Εντολών 0320 Commit 0320 Υποβολή 0321 Confirm Exit 0321 Επιβεβαίωση Εξόδου 0322 Contrast 0322 Αντίθεση 0323 Contrast All 0323 Αντίθεση Όλων 0324 Contrast Blue 0324 Αντίθεση Μπλε 0325 Contrast Green 0325 Αντίθεση Πράσινου 0326 Contrast Limit 0326 Όριο Αντίθεσης 0327 Contrast Red 0327 Αντίθεση Κόκκινου 0328 Convert %d image files 0328 Μετατροπή %d αρχείων εικόνας 0329 Convert an image into a Tiny Planet image 0329 Μετατροπή εικόνας σε εικόνα Μικρού Πλανήτη 0330 Convert image into a cartoon drawing 0330 Μετατροπή εικόνας σε σχέδιο κινουμένων σχεδίων 0331 Convert image into a crosshatch sketch 0331 Μετατροπή εικόνας σε σκίτσο με διχτυωτή σκίαση 0332 Convert image into a line drawing 0332 Μετατροπή εικόνας σε σχέδιο με γραμμές 0333 Convert image into a simulated painting 0333 Μετατροπή εικόνας σε προσομοιωμένο πίνακα ζωγραφικής 0334 Convert image into a simulated sketch (1) 0334 Μετατροπή εικόνας σε προσομοιωμένο σκίτσο (1) 0335 Convert image into a simulated sketch (2) 0335 Μετατροπή εικόνας σε προσομοιωμένο σκίτσο (2) 0336 Convert image into black/white lines 0336 Μετατροπή εικόνας σε ασπρόμαυρες γραμμές 0337 Convert image into dithered dots 0337 Μετατροπή εικόνας σε κουκκίδες dither 0338 Convert image into square tiles with 3D effect 0338 Μετατροπή εικόνας σε τετράγωνα πλακίδια με εφέ 3D 0339 Convert image into tiles matching feature contours 0339 Μετατροπή εικόνας σε πλακίδια που ακολουθούν τα περιγράμματα των στοιχείων 0340 Copy 0340 Αντιγραφή 0341 Copy %d image files 0341 Αντιγραφή %d αρχείων εικόνας 0342 Copy From Image 0342 Αντιγραφή Από Εικόνα 0343 Copy Meta 0343 Αντιγραφή Meta 0344 Copy Metadata 0344 Αντιγραφή Metadata 0345 Copy Prior Edit 0345 Αντιγραφή Προηγούμενης Επεξεργασίας 0346 Copy Within Image 0346 Αντιγραφή Μέσα στην Εικόνα 0347 Copy area for later pasting into image 0347 Αντιγραφή περιοχής για μετέπειτα επικόλληση σε εικόνα 0348 Copy areas from another image using the mouse 0348 Αντιγραφή περιοχών από άλλη εικόνα με το ποντίκι 0349 Copy areas from prior edits using the mouse 0349 Αντιγραφή περιοχών από προηγούμενες επεξεργασίες με το ποντίκι 0350 Copy areas within an image using the mouse 0350 Αντιγραφή περιοχών μέσα σε μια εικόνα με το ποντίκι 0351 Copy image file to the clipboard 0351 Αντιγραφή αρχείου εικόνας στο πρόχειρο 0352 Copy image file to the desktop 0352 Αντιγραφή αρχείου εικόνας στην επιφάνεια εργασίας 0353 Copy in Image 0353 Αντιγραφή στην Εικόνα 0354 Copy metadata from one image to another 0354 Αντιγραφή metadata από μια εικόνα σε άλλη 0355 Copy or Move Image File 0355 Αντιγραφή ή Μετακίνηση Αρχείου Εικόνας 0356 Copy or Move image file to new location 0356 Αντιγραφή ή μετακίνηση αρχείου εικόνας σε νέα τοποθεσία 0357 Copy to Clipboard 0357 Αντιγραφή στο Πρόχειρο 0358 Copy to Desktop 0358 Αντιγραφή στην Επιφάνεια Εργασίας 0359 Copy without unsaved changes? 0359 Αντιγραφή χωρίς τις μη αποθηκευμένες αλλαγές; 0360 Copy/Move 0360 Αντιγραφή/Μετακίνηση 0361 Copy/move selected image files to a new folder 0361 Αντιγραφή/μετακίνηση επιλεγμένων αρχείων εικόνας σε νέο φάκελο 0362 Copyright 0362 Πνευματικά Δικαιώματα 0363 Create 0363 Δημιουργία 0364 Create Album 0364 Δημιουργία Άλμπουμ 0365 Create Blank Image 0365 Δημιουργία Κενής Εικόνας 0366 Create Mosaic 0366 Δημιουργία Ψηφιδωτού 0367 Create a blank image 0367 Δημιουργία κενής εικόνας 0368 Create a mosaic with tiles made from all images 0368 Δημιουργία ψηφιδωτού με πλακίδια από όλες τις εικόνες 0369 Create a new album (ordered set of image files) 0369 Δημιουργία νέου άλμπουμ (διατεταγμένο σύνολο αρχείων εικόνας) 0370 Create an embossed or 3D appearance 0370 Δημιουργία ανάγλυφης ή τρισδιάστατης εμφάνισης 0371 Create or replace an album 0371 Δημιουργία ή αντικατάσταση άλμπουμ 0372 Crop 0372 Περικοπή 0373 Crop (trim) image margins 0373 Περικοπή περιθωρίων εικόνας 0374 Crop Buttons 0374 Κουμπιά Περικοπής 0375 Crop Image 0375 Περικοπή Εικόνας 0376 Crosshatch 0376 Διχτυωτή Σκίαση 0377 Crosshatch Sketch 0377 Σκίτσο Διχτυωτής Σκίασης 0378 Current Album 0378 Τρέχον Άλμπουμ 0379 Current File Folder 0379 Φάκελος Τρέχοντος Αρχείου 0380 Current gallery 0380 Τρέχουσα γκαλερί 0381 Current image: 0381 Τρέχουσα εικόνα: 0382 Curve Node 0382 Κόμβος Καμπύλης 0383 Curve lines need at least 4 points 0383 Οι γραμμές καμπύλης χρειάζονται τουλάχιστον 4 σημεία 0384 Custom 0384 Προσαρμοσμένο 0385 Custom Kernel 0385 Προσαρμοσμένος Πυρήνας 0386 Custom Shortcuts \n 0386 Προσαρμοσμένες Συντομεύσεις \n 0387 Custom menu: favorite/frequent functions, scripts, plugins 0387 Προσαρμοσμένο μενού: αγαπημένες/συχνές λειτουργίες, σενάρια, plugins 0388 Customize 0388 Προσαρμογή 0389 Customize: 0389 Προσαρμογή: 0390 Cut Bottom 0390 Κόψιμο Κάτω 0391 Cut Top 0391 Κόψιμο Πάνω 0392 Cycle 2 Files 0392 Εναλλαγή 2 Αρχείων 0393 Cycle 2 Prior Files 0393 Εναλλαγή 2 Προηγούμενων Αρχείων 0394 Cycle 3 Files 0394 Εναλλαγή 3 Αρχείων 0395 Cycle 3 Prior Files 0395 Εναλλαγή 3 Προηγούμενων Αρχείων 0396 Cycle through images: 0396 Εναλλαγή εικόνων: 0397 DARK/BRIGHT PIXELS 0397 ΣΚΟΤΕΙΝΑ/ΦΩΤΕΙΝΑ PIXEL 0398 DEFOG 0398 ΑΦΑΙΡΕΣΗ ΟΜΙΧΛΗΣ 0399 DELETE ALBUM 0399 ΔΙΑΓΡΑΦΗ ΑΛΜΠΟΥΜ 0400 DELETE META 0400 ΔΙΑΓΡΑΦΗ META 0401 DELETE/TRASH 0401 ΔΙΑΓΡΑΦΗ/ΑΠΟΡΡΙΨΗ 0402 DENOISE 0402 ΑΦΑΙΡΕΣΗ ΘΟΡΥΒΟΥ 0403 DIALOG BUTTONS 0403 ΚΟΥΜΠΙΑ ΠΑΡΑΘΥΡΟΥ ΔΙΑΛΟΓΟΥ 0404 DITHER 0404 DITHER 0405 DRAG AND DROP 0405 ΜΕΤΑΦΟΡΑ ΚΑΙ ΑΠΟΘΕΣΗ 0406 Dark Areas 0406 Σκοτεινές Περιοχές 0407 Dark Limit 0407 Όριο Σκότους 0408 Dark Point 0408 Σημείο Σκότους 0409 Dark/Bright Pixels 0409 Σκοτεινά/Φωτεινά Pixel 0410 Data file 0410 Αρχείο δεδομένων 0411 Define keywords used for searching images 0411 Ορισμός keywords για χρήση στην αναζήτηση εικόνων 0412 Defined Keywords: 0412 Ορισμένα Keywords: 0413 Defog 0413 Αφαίρεση Ομίχλης 0414 Delete 0414 Διαγραφή 0415 Delete Album 0415 Διαγραφή Άλμπουμ 0416 Delete Meta 0416 Διαγραφή Meta 0417 Delete Metadata 0417 Διαγραφή Metadata 0418 Delete Originals 0418 Διαγραφή Πρωτοτύπων 0419 Delete an album 0419 Διαγραφή ενός άλμπουμ 0420 Delete or Trash selected image files 0420 Διαγραφή ή Απόρριψη επιλεγμένων αρχείων εικόνας 0421 Delete or trash an image file 0421 Διαγραφή ή απόρριψη ενός αρχείου εικόνας 0422 Delete read-only file? 0422 Διαγραφή αρχείου μόνο για ανάγνωση; 0423 Delete/Trash 0423 Διαγραφή/Απόρριψη 0424 Denoise 0424 Αφαίρεση Θορύβου 0425 Depth 0425 Βάθος 0426 Description: %s\n 0426 Περιγραφή: %s\n 0427 Desktop 0427 Επιφάνεια Εργασίας 0428 Dialog Font 0428 Γραμματοσειρά Παραθύρου Διαλόγου 0429 Diffs 0429 Διαφορές 0430 Directed Blur 0430 Κατευθυνόμενο Θόλωμα 0431 Directed Blur - blur locally in direction of mouse drag 0431 Κατευθυνόμενο Θόλωμα - τοπικό θόλωμα στην κατεύθυνση συρσίματος του ποντικιού 0432 Disable 0432 Απενεργοποίηση 0433 Disable areas for editing 0433 Απενεργοποίηση περιοχών για επεξεργασία 0434 Discard unsaved changes? 0434 Απόρριψη μη αποθηκευμένων αλλαγών; 0435 Discard unsaved edits? 0435 Απόρριψη μη αποθηκευμένων επεξεργασιών; 0436 Distort image areas using the mouse 0436 Παραμόρφωση περιοχών εικόνας με το ποντίκι 0437 Dither 0437 Dither 0438 Dither Image 0438 Dither Εικόνας 0439 Dither0 0439 Dither0 0440 Dither1 0440 Dither1 0441 Dither2 0441 Dither2 0442 Dither3 0442 Dither3 0443 Dither4 0443 Dither4 0444 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0444 Σύρετε τις εικόνες σε χονδρική ευθυγράμμιση.\nΓια περιστροφή, σύρετε από την κάτω άκρη. 0445 Drag margin box middle or edges 0445 Σύρετε το κέντρο ή τις άκρες του πλαισίου περιθωρίου 0446 Drag mouse on image. \nLeft click to cancel. 0446 Σύρετε το ποντίκι πάνω στην εικόνα. \nΑριστερό κλικ για ακύρωση. 0447 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0447 Σύρετε το ποντίκι για επιλογή. Διαγραφή. Επανάληψη. \nΚλικ: επέκταση επιλογής στο ποντίκι. 0448 Drag mouse to set center 0448 Σύρετε το ποντίκι για ορισμό κέντρου 0449 Drag near an image corner using the mouse 0449 Σύρετε κοντά σε μια γωνία της εικόνας με το ποντίκι 0450 Drag on image to level image.\nClick on image for level lines. 0450 Σύρετε πάνω στην εικόνα για ισοστάθμιση.\nΚάντε κλικ στην εικόνα για γραμμές οριζοντίωσης. 0451 Drag within image using the mouse 0451 Σύρετε μέσα στην εικόνα με το ποντίκι 0452 Draw a line across the image in \ndirection of brightness change. 0452 Σχεδιάστε μια γραμμή στην εικόνα προς \nτην κατεύθυνση αλλαγής φωτεινότητας. 0453 Draw box on image 0453 Σχεδιάστε πλαίσιο στην εικόνα 0454 Draw line or arrow on image 0454 Σχεδιάστε γραμμή ή βέλος στην εικόνα 0455 Draw on image: text, line/arrow, box, circle, ellipse 0455 Σχεδιάστε στην εικόνα: κείμενο, γραμμή/βέλος, πλαίσιο, κύκλο, έλλειψη 0456 Draw oval on image 0456 Σχεδιάστε οβάλ στην εικόνα 0457 Draw text on image 0457 Σχεδιάστε κείμενο στην εικόνα 0458 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0458 Διπλότυποι ή ένθετοι φάκελοι: \n %s \n %s \nΠαρακαλώ αφαιρέστε τους. 0459 Duplicates: 0459 Διπλότυπα: 0460 EDIT ALBUM 0460 ΕΠΕΞΕΡΓΑΣΙΑ ΑΛΜΠΟΥΜ 0461 EDIT ANY META 0461 ΕΠΕΞΕΡΓΑΣΙΑ ΟΠΟΙΟΥΔΗΠΟΤΕ META 0462 EDIT BOOKMARKS 0462 ΕΠΕΞΕΡΓΑΣΙΑ ΣΕΛΙΔΟΔΕΙΚΤΩΝ 0463 EDIT MAIN META 0463 ΕΠΕΞΕΡΓΑΣΙΑ ΚΥΡΙΩΝ META 0464 EDIT MENU 0464 ΜΕΝΟΥ ΕΠΕΞΕΡΓΑΣΙΑΣ 0465 EDIT PROCEDURES 0465 ΕΠΕΞΕΡΓΑΣΙΑ ΔΙΑΔΙΚΑΣΙΩΝ 0466 EDIT SCRIPT 0466 ΕΠΕΞΕΡΓΑΣΙΑ ΣΕΝΑΡΙΟΥ 0467 EDIT WORKFLOW 0467 ΕΠΕΞΕΡΓΑΣΙΑ ΡΟΗΣ ΕΡΓΑΣΙΑΣ 0468 EFFECTS MENU 0468 ΜΕΝΟΥ ΕΦΕ 0469 EMBOSS 0469 ΑΝΑΓΛΥΦΟ 0470 ENABLE/DISABLE AREA 0470 ΕΝΕΡΓΟΠΟΙΗΣΗ/ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ ΠΕΡΙΟΧΗΣ 0471 ENGRAVE 0471 ΧΑΡΑΚΤΙΚΗ 0472 ESCHER SPIRAL 0472 ΣΠΕΙΡΑ ESCHER 0473 EXPORT FILES 0473 ΕΞΑΓΩΓΗ ΑΡΧΕΙΩΝ 0474 Edge 0474 Άκρη 0475 Edit 0475 Επεξεργασία 0476 Edit Any Meta 0476 Επεξεργασία Οποιουδήποτε Meta 0477 Edit Any Metadata 0477 Επεξεργασία Οποιωνδήποτε Metadata 0478 Edit Bookmarks 0478 Επεξεργασία Σελιδοδεικτών 0479 Edit Images 0479 Επεξεργασία Εικόνων 0480 Edit Line 0480 Επεξεργασία Γραμμής 0481 Edit Line/Arrow 0481 Επεξεργασία Γραμμής/Βέλους 0482 Edit Main Meta 0482 Επεξεργασία Κύριων Meta 0483 Edit Main Metadata 0483 Επεξεργασία Κύριων Metadata 0484 Edit Menu 0484 Μενού Επεξεργασίας 0485 Edit Metadata 0485 Επεξεργασία Metadata 0486 Edit Text 0486 Επεξεργασία Κειμένου 0487 Edit any metadata tag 0487 Επεξεργασία οποιουδήποτε tag metadata 0488 Edit function can not use Paint Edits 0488 Η λειτουργία επεξεργασίας δεν μπορεί να χρησιμοποιήσει τη Ζωγραφική Επεξεργασιών 0489 Edit function must be active 0489 Η λειτουργία επεξεργασίας πρέπει να είναι ενεργή 0490 Edit key metadata: keywords/geotags/description/rating ... 0490 Επεξεργασία βασικών metadata: keywords/geotags/περιγραφή/βαθμολογία ... 0491 Edit plugins menu 0491 Επεξεργασία μενού plugins 0492 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0492 Επεξεργασία: περικοπή, περιστροφή, ρετούς, αλλαγή κλίμακας, σήμανση, ζωγραφική επεξεργασιών, αντιγραφή περιοχών 0493 Effects 0493 Εφέ 0494 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0494 Εφέ: κινούμενο σχέδιο, σκίτσο, ζωγραφική, ανάγλυφο, dither, υφή, χρώματα, προσαρμοσμένη συνέλιξη 0495 Emboss 0495 Ανάγλυφο 0496 Enable 0496 Ενεργοποίηση 0497 Enable areas for editing 0497 Ενεργοποίηση περιοχών για επεξεργασία 0498 End of gallery 0498 Τέλος γκαλερί 0499 Engrave 0499 Χαρακτική 0500 Enter Keyword 0500 Εισαγωγή Keyword 0501 Enter New Keyword 0501 Εισαγωγή Νέου Keyword 0502 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0502 Εισάγετε ιδιότητες γραμμής ή βέλους στο παράθυρο διαλόγου, \nκάντε κλικ/σύρετε στην εικόνα, δεξί κλικ για αφαίρεση 0503 Enter text, [Add] to layout, edit properties. 0503 Εισάγετε κείμενο, [Προσθήκη] στη διάταξη, επεξεργαστείτε τις ιδιότητες. 0504 Enter text, click/drag on image, right click to remove 0504 Εισάγετε κείμενο, κάντε κλικ/σύρετε στην εικόνα, δεξί κλικ για αφαίρεση 0505 Erase 0505 Διαγραφή 0506 Erase existing areas 0506 Διαγραφή υπαρχουσών περιοχών 0507 Escher Spiral 0507 Σπείρα Escher 0508 Exceed 50 anchor points 0508 Υπέρβαση 50 σημείων αγκύρωσης 0509 Export Files 0509 Εξαγωγή Αρχείων 0510 Export selected image files to another folder 0510 Εξαγωγή επιλεγμένων αρχείων εικόνας σε άλλο φάκελο 0511 FILE MENU 0511 ΜΕΝΟΥ ΑΡΧΕΙΟΥ 0512 FILE SAVE 0512 ΑΠΟΘΗΚΕΥΣΗ ΑΡΧΕΙΟΥ 0513 FILE VIEW 0513 ΠΡΟΒΟΛΗ ΑΡΧΕΙΟΥ 0514 FIND AREA GAP 0514 ΕΥΡΕΣΗ ΚΕΝΟΥ ΠΕΡΙΟΧΗΣ 0515 FIND BAD FILES 0515 ΕΥΡΕΣΗ ΕΣΦΑΛΜΕΝΩΝ ΑΡΧΕΙΩΝ 0516 FIND DUPLICATES 0516 ΕΥΡΕΣΗ ΔΙΠΛΟΤΥΠΩΝ 0517 FIRST INDEX 0517 ΠΡΩΤΟ ΕΥΡΕΤΗΡΙΟ 0518 FIRST STARTUP 0518 ΠΡΩΤΗ ΕΚΚΙΝΗΣΗ 0519 FIX META 0519 ΔΙΟΡΘΩΣΗ META 0520 FLATTEN HISTOGRAM 0520 ΕΞΟΜΑΛΥΝΣΗ ΙΣΤΟΓΡΑΜΜΑΤΟΣ 0521 FLATTEN PHOTO 0521 ΕΞΟΜΑΛΥΝΣΗ ΦΩΤΟΓΡΑΦΙΑΣ 0522 FOLDER TREE 0522 ΔΕΝΤΡΟ ΦΑΚΕΛΩΝ 0523 FOTOCX FOR WINDOWS 11 0523 FOTOCX ΓΙΑ WINDOWS 11 0524 FOTOCX LIMITATIONS 0524 ΠΕΡΙΟΡΙΣΜΟΙ ΤΟΥ FOTOCX 0525 FOTOCX USAGE 0525 ΧΡΗΣΗ ΤΟΥ FOTOCX 0526 FRINGES 0526 ΠΑΡΥΦΕΣ 0527 FUSION 0527 ΣΥΝΤΗΞΗ 0528 Fetch 0528 Ανάκτηση 0529 File 0529 Αρχείο 0530 File Mod Date/Time 0530 Ημερομηνία/Ώρα Τροποποίησης Αρχείου 0531 File Name 0531 Όνομα Αρχείου 0532 File Name/Number 0532 Όνομα/Αριθμός Αρχείου 0533 File Name: %s \n 0533 Όνομα Αρχείου: %s \n 0534 File Size (bytes) 0534 Μέγεθος Αρχείου (bytes) 0535 File View 0535 Προβολή Αρχείου 0536 File count: 0536 Αριθμός αρχείων: 0537 File type cannot be edited 0537 Ο τύπος αρχείου δεν μπορεί να επεξεργαστεί 0538 File1 0538 Αρχείο1 0539 File2 0539 Αρχείο2 0540 File: 0540 Αρχείο: 0541 File: new session, open, rename, copy/move, delete, print 0541 Αρχείο: νέα συνεδρία, άνοιγμα, μετονομασία, αντιγραφή/μετακίνηση, διαγραφή, εκτύπωση 0542 Fill selected areas or transparent areas with a color 0542 Γέμισμα επιλεγμένων περιοχών ή διαφανών περιοχών με χρώμα 0543 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0543 Γεμίστε τις επιλεγμένες περιοχές με χρώμα για οπτική επαλήθευση. \nΜέθοδος 1: αριστερό κλικ σε κάθε επιλεγμένη περιοχή που δεν έχει ήδη γεμίσει. \nΜέθοδος 2: δεξί κλικ ΕΞΩ από όλες τις επιλεγμένες περιοχές. \nΠατήστε το κουμπί [βοήθεια] για διευκρίνιση 0544 Find 0544 Εύρεση 0545 Find Bad Files 0545 Εύρεση Εσφαλμένων Αρχείων 0546 Find Duplicate Images 0546 Εύρεση Διπλότυπων Εικόνων 0547 Find Duplicates 0547 Εύρεση Διπλότυπων 0548 Find Gap 0548 Εύρεση Κενού 0549 Find a gap in an area outline 0549 Εύρεση κενού σε περίγραμμα περιοχής 0550 Find all images for a location [date range] 0550 Εύρεση όλων των εικόνων για μια τοποθεσία [εύρος ημερομηνιών] 0551 Find all images for a selected tag name and value 0551 Εύρεση όλων των εικόνων για ένα επιλεγμένο όνομα και τιμή tag 0552 Find images meeting multiple search criteria 0552 Εύρεση εικόνων που πληρούν πολλαπλά κριτήρια αναζήτησης 0553 Find optimum factors: 0553 Εύρεση βέλτιστων συντελεστών: 0554 Finish 0554 Ολοκλήρωση 0555 Finish Area 0555 Ολοκλήρωση Περιοχής 0556 Fix Bad File 0556 Διόρθωση Εσφαλμένου Αρχείου 0557 Fix Broken Metadata 0557 Διόρθωση Κατεστραμμένων Metadata 0558 Fix Meta 0558 Διόρθωση Meta 0559 Fix Motion Blur 0559 Διόρθωση Θολώματος Κίνησης 0560 Fix Perspective 0560 Διόρθωση Προοπτικής 0561 Fix color fringes (chromatic aberration) 0561 Διόρθωση χρωματικών παρυφών (χρωματική εκτροπή) 0562 Fix perspective for object photographed from an angle 0562 Διόρθωση προοπτικής για αντικείμενο φωτογραφημένο υπό γωνία 0563 Fix red-eyes from flash photo 0563 Διόρθωση κόκκινων ματιών από φωτογραφία με φλας 0564 Flatten 0564 Εξομάλυνση 0565 Flatten Histogram 0565 Εξομάλυνση Ιστογράμματος 0566 Flatten Pano 0566 Εξομάλυνση Πανοράματος 0567 Flatten Photo 0567 Εξομάλυνση Φωτογραφίας 0568 Flatten brightness histogram to enhance details 0568 Εξομάλυνση ιστογράμματος φωτεινότητας για ανάδειξη λεπτομερειών 0569 Flatten curved surface. 0569 Εξομάλυνση καμπύλης επιφάνειας. 0570 Flatten photo of a curved image (e.g. poster on round column 0570 Εξομάλυνση φωτογραφίας καμπύλης εικόνας (π.χ. αφίσα σε στρογγυλή κολόνα 0571 Flip 0571 Αναστροφή 0572 Folder Tree 0572 Δέντρο Φακέλων 0573 Folders 0573 Φάκελοι 0574 Folders for image files (subfolders included automatically) 0574 Φάκελοι για αρχεία εικόνας (οι υποφάκελοι περιλαμβάνονται αυτόματα) 0575 Font 0575 Γραμματοσειρά 0576 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0576 Για τυχαία ακολουθία εικόνων, αυτή η τιμή είναι \nη σχετική συχνότητα εμφάνισης της εικόνας. \nΗ βασική τιμή είναι 10. Το 20 --> εμφάνιση 2x πιο συχνά. 0577 Foreground 0577 Προσκήνιο 0578 Fotocx copyright notice 0578 Σημείωση πνευματικών δικαιωμάτων του Fotocx 0579 Fotocx home 0579 Κύριος φάκελος του Fotocx 0580 Fotocx privacy policy 0580 Πολιτική απορρήτου του Fotocx 0581 Fotocx video tutorial on YouTube 0581 Βίντεο εκμάθησης του Fotocx στο YouTube 0582 Fotocx web site (information and downloads) 0582 Ιστότοπος του Fotocx (πληροφορίες και λήψεις) 0583 FreeSans 0583 FreeSans 0584 Full List 0584 Πλήρης Λίστα 0585 Full Screen 0585 Πλήρης Οθόνη 0586 Fusion 0586 Σύντηξη 0587 GALLERY END 0587 ΤΕΛΟΣ ΓΚΑΛΕΡΙ 0588 GALLERY FILTER 0588 ΦΙΛΤΡΟ ΓΚΑΛΕΡΙ 0589 GALLERY HOME 0589 ΑΡΧΗ ΓΚΑΛΕΡΙ 0590 GALLERY MENU 0590 ΜΕΝΟΥ ΓΚΑΛΕΡΙ 0591 GALLERY OVERVIEW 0591 ΕΠΙΣΚΟΠΗΣΗ ΓΚΑΛΕΡΙ 0592 GALLERY SORT 0592 ΤΑΞΙΝΟΜΗΣΗ ΓΚΑΛΕΡΙ 0593 GALLERY TO ALBUM 0593 ΓΚΑΛΕΡΙ ΣΕ ΑΛΜΠΟΥΜ 0594 GALLERY VIEW 0594 ΠΡΟΒΟΛΗ ΓΚΑΛΕΡΙ 0595 GDK pixbuf: cannot save file 0595 GDK pixbuf: δεν είναι δυνατή η αποθήκευση αρχείου 0596 GLOBAL RETINEX 0596 ΚΑΘΟΛΙΚΟ RETINEX 0597 GRID SETTINGS 0597 ΡΥΘΜΙΣΕΙΣ ΠΛΕΓΜΑΤΟΣ 0598 Gallery 0598 Γκαλερί 0599 Gallery End 0599 Τέλος Γκαλερί 0600 Gallery Filter 0600 Φίλτρο Γκαλερί 0601 Gallery Home 0601 Αρχή Γκαλερί 0602 Gallery Sort 0602 Ταξινόμηση Γκαλερί 0603 Gallery View 0603 Προβολή Γκαλερί 0604 Gallery of newest image files 0604 Γκαλερί με τα πιο πρόσφατα αρχεία εικόνας 0605 Gallery of recently viewed image files 0605 Γκαλερί με τα πρόσφατα προβεβλημένα αρχεία εικόνας 0606 Gallery to Album 0606 Γκαλερί σε Άλμπουμ 0607 Gallery view with thumbnails and basic metadata 0607 Προβολή γκαλερί με thumbnail και βασικά metadata 0608 Gallery view with thumbnails and file data 0608 Προβολή γκαλερί με thumbnail και δεδομένα αρχείου 0609 Gallery: thumbnails, new/recent, sort, select, bookmarks 0609 Γκαλερί: thumbnail, νέα/πρόσφατα, ταξινόμηση, επιλογή, σελιδοδείκτες 0610 Generate an inward spiraling repeating image 0610 Δημιουργία εικόνας με επαναλαμβανόμενη εσωστρεφή σπείρα 0611 Global Retinex 0611 Καθολικό Retinex 0612 Gradual 0612 Σταδιακό 0613 Graduated Blur 0613 Διαβαθμισμένο Θόλωμα 0614 Graduated Blur - blur relative to pixel contrast 0614 Διαβαθμισμένο Θόλωμα - θόλωμα ανάλογα με την αντίθεση pixel 0615 Grayscale 0615 Κλίμακα του Γκρι 0616 Green 0616 Πράσινο 0617 Grid Settings 0617 Ρυθμίσεις Πλέγματος 0618 Group by country 0618 Ομαδοποίηση κατά χώρα 0619 Group by country/date 0619 Ομαδοποίηση κατά χώρα/ημερομηνία 0620 Group by country/location 0620 Ομαδοποίηση κατά χώρα/τοποθεσία 0621 Group by country/location/date 0621 Ομαδοποίηση κατά χώρα/τοποθεσία/ημερομηνία 0622 Group by date/country 0622 Ομαδοποίηση κατά ημερομηνία/χώρα 0623 Group by date/country/location 0623 Ομαδοποίηση κατά ημερομηνία/χώρα/τοποθεσία 0624 HDF 0624 HDF 0625 HDR 0625 HDR 0626 HELP MENU 0626 ΜΕΝΟΥ ΒΟΗΘΕΙΑΣ 0627 Hard 0627 Έντονο 0628 Height 0628 Ύψος 0629 Height: 0629 Ύψος: 0630 Help 0630 Βοήθεια 0631 Help: user guide, tutorial, change log, licenses, privacy, about 0631 Βοήθεια: οδηγός χρήσης, εκμάθηση, ιστορικό αλλαγών, άδειες χρήσης, απόρρητο, σχετικά 0632 Hide 0632 Απόκρυψη 0633 Hide selected areas 0633 Απόκρυψη επιλεγμένων περιοχών 0634 High 0634 Υψηλό 0635 High Depth of Field - combine near/far focus images for deeper focus 0635 Υψηλό Βάθος Πεδίου - συνδυασμός εικόνων κοντινής/μακρινής εστίασης για μεγαλύτερο βάθος εστίασης 0636 High Dynamic Range - combine bright/dark images for better detail 0636 Υψηλό Δυναμικό Εύρος - συνδυασμός φωτεινών/σκοτεινών εικόνων για καλύτερη λεπτομέρεια 0637 Highlight darkest and brightest pixels 0637 Επισήμανση των πιο σκοτεινών και πιο φωτεινών pixel 0638 Home Folder 0638 Κύριος Φάκελος 0639 Home Page 0639 Αρχική Σελίδα 0640 Horz 0640 Οριζ. 0641 How to remove Fotocx application and user files 0641 Πώς να αφαιρέσετε την εφαρμογή Fotocx και τα αρχεία χρήστη 0642 Hue 0642 Απόχρωση 0643 IMAGE ARRAY 0643 ΠΙΝΑΚΑΣ ΕΙΚΟΝΩΝ 0644 INDEX FILES 0644 ΕΥΡΕΤΗΡΙΑΣΗ ΑΡΧΕΙΩΝ 0645 INSIDE-OUT 0645 ΑΠΟ ΜΕΣΑ ΠΡΟΣ ΤΑ ΕΞΩ 0646 INVERT AREA 0646 ΑΝΤΙΣΤΡΟΦΗ ΠΕΡΙΟΧΗΣ 0647 Icon size 0647 Μέγεθος εικονιδίων 0648 Icons 0648 Εικονίδια 0649 Image 0649 Εικόνα 0650 Image Array 0650 Πίνακας Εικόνων 0651 Image Columns 0651 Στήλες Εικόνας 0652 Image Differences 0652 Διαφορές Εικόνας 0653 Image File 0653 Αρχείο Εικόνας 0654 Image File: 0654 Αρχείο Εικόνας: 0655 Image Keywords 0655 Keywords Εικόνας 0656 Image Locations 0656 Τοποθεσίες Εικόνας 0657 Image Markup 0657 Σήμανση Εικόνας 0658 Image Position 0658 Θέση Εικόνας 0659 Image Preferences 0659 Προτιμήσεις Εικόνας 0660 Image Ratios 0660 Αναλογίες Εικόνας 0661 Image Size (pixels) 0661 Μέγεθος Εικόνας (pixel) 0662 Image Time 0662 Ώρα Εικόνας 0663 Image Timeline 0663 Χρονογραμμή Εικόνας 0664 Image colors are converted for printing. 0664 Τα χρώματα της εικόνας μετατρέπονται για εκτύπωση. 0665 Image dimensions have changed \nCopy Prior Edit cannot be used 0665 Οι διαστάσεις της εικόνας έχουν αλλάξει \nΗ Αντιγραφή Προηγούμενης Επεξεργασίας δεν μπορεί να χρησιμοποιηθεί 0666 Image dimensions have changed, \nArea Blend cannot be used 0666 Οι διαστάσεις της εικόνας έχουν αλλάξει, \nΗ Ανάμειξη Περιοχής δεν μπορεί να χρησιμοποιηθεί 0667 Image dimensions have changed, \nthis prior image cannot be used 0667 Οι διαστάσεις της εικόνας έχουν αλλάξει, \nαυτή η προηγούμενη εικόνα δεν μπορεί να χρησιμοποιηθεί 0668 Image is fixed, unmovable 0668 Η εικόνα είναι σταθερή, δεν μετακινείται 0669 Images sizes are not compatible 0669 Τα μεγέθη των εικόνων δεν είναι συμβατά 0670 Include: 0670 Συμπερίληψη: 0671 Index Files 0671 Ευρετηρίαση Αρχείων 0672 Index Level 0672 Επίπεδο Ευρετηρίου 0673 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0673 Η λειτουργία ευρετηρίασης τερματίστηκε. \nΗ ευρετηρίαση απαιτείται για τις λειτουργίες αναζήτησης και χάρτη \nκαι για γρήγορη εμφάνιση των σελίδων γκαλερί με thumbnail. 0674 Index new image files and make thumbnails 0674 Ευρετηρίαση νέων αρχείων εικόνας και δημιουργία thumbnail 0675 Input color to match and adjust: 0675 Χρώμα εισόδου για ταίριασμα και προσαρμογή: 0676 Inside-out 0676 Από μέσα προς τα έξω 0677 Intensity 0677 Ένταση 0678 Invert 0678 Αντιστροφή 0679 Invert selected areas (selected ↔ not selected) 0679 Αντιστροφή επιλεγμένων περιοχών (επιλεγμένο ↔ μη επιλεγμένο) 0680 Irregular Tiles 0680 Ακανόνιστα Πλακίδια 0681 Iterations 0681 Επαναλήψεις 0682 JPEG ARTIFACTS 0682 ΑΡΤΙΦΑΚΤ JPEG 0683 JPEG Artifacts 0683 Αρτιφάκτ JPEG 0684 JPEG files 0684 Αρχεία JPEG 0685 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0685 Ιαν Φεβ Μαρ Απρ Μαϊ Ιουν Ιουλ Αυγ Σεπ Οκτ Νοε Δεκ 0686 Jump to gallery beginning [home] 0686 Μετάβαση στην αρχή της γκαλερί [home] 0687 Jump to gallery end [end] 0687 Μετάβαση στο τέλος της γκαλερί [end] 0688 KEYBOARD ESCAPE KEY 0688 ΠΛΗΚΤΡΟ ESCAPE 0689 KEYBOARD SHORTCUTS 0689 ΣΥΝΤΟΜΕΥΣΕΙΣ ΠΛΗΚΤΡΟΛΟΓΙΟΥ 0690 KEYWORDS OVERVIEW 0690 ΕΠΙΣΚΟΠΗΣΗ KEYWORDS 0691 Keep 0691 Διατήρηση 0692 Kernel size 0692 Μέγεθος πυρήνα 0693 Keyboard Shortcuts 0693 Συντομεύσεις Πληκτρολογίου 0694 Keywords Category 0694 Κατηγορία Keywords 0695 Kill active dialog? 0695 Τερματισμός ενεργού παραθύρου διαλόγου; 0696 Kill busy function? 0696 Τερματισμός απασχολημένης λειτουργίας; 0697 Kuwahara 0697 Kuwahara 0698 Kuwahara Depth 0698 Βάθος Kuwahara 0699 LINE COLOR 0699 ΧΡΩΜΑ ΓΡΑΜΜΗΣ 0700 LOAD/SAVE AREA 0700 ΦΟΡΤΩΣΗ/ΑΠΟΘΗΚΕΥΣΗ ΠΕΡΙΟΧΗΣ 0701 LOCAL CONTRAST 0701 ΤΟΠΙΚΗ ΑΝΤΙΘΕΣΗ 0702 LOCAL RETINEX 0702 ΤΟΠΙΚΟ RETINEX 0703 Language 0703 Γλώσσα 0704 Layout and background image 0704 Διάταξη και εικόνα φόντου 0705 Left 0705 Αριστερά 0706 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0706 Σύρετε με αριστερό κλικ μέσα στην περιοχή \nγια σταδιακή αναίρεση των επεξεργασιών περιοχής. \nΣύρετε με δεξί κλικ για επαναφορά των επεξεργασιών. \nΣύρετε κατά μήκος της άκρης της περιοχής για ανάμειξη άκρης. 0707 Left/right click: previous/next image (also arrow keys) 0707 Αριστερό/δεξί κλικ: προηγούμενη/επόμενη εικόνα (επίσης πλήκτρα βέλους) 0708 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0708 Αριστερό/δεξί κλικ: αναίρεση/επανάληψη ενός βήματος επεξεργασίας \nΜεσαίο κλικ: επιστροφή στο επιλεγμένο βήμα επεξεργασίας 0709 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0709 Αριστερό/δεξί κλικ: zoom εικόνας/thumbnail μέσα/έξω (επίσης πλήκτρα +/-) 0710 Length 0710 Μήκος 0711 Level 0711 Επίπεδο 0712 Licenses 0712 Άδειες Χρήσης 0713 Light Source 0713 Πηγή Φωτός 0714 Lightness 0714 Φωτεινότητα (Lightness) 0715 Limit 0715 Όριο 0716 Line Color 0716 Χρώμα Γραμμής 0717 Line Threshold 0717 Κατώφλι Γραμμής 0718 Line Width 0718 Πλάτος Γραμμής 0719 Line length 0719 Μήκος γραμμής 0720 List Fotocx command line parameters 0720 Λίστα παραμέτρων γραμμής εντολών του Fotocx 0721 List all metadata for current image or clicked thumbnail 0721 Λίστα όλων των metadata για την τρέχουσα εικόνα ή το thumbnail που πατήθηκε 0722 List outboard programs and functions 0722 Λίστα εξωτερικών προγραμμάτων και λειτουργιών 0723 Load 0723 Φόρτωση 0724 Load settings from file 0724 Φόρτωση ρυθμίσεων από αρχείο 0725 Local Contrast 0725 Τοπική Αντίθεση 0726 Local Retinex 0726 Τοπικό Retinex 0727 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0727 Η τοποθεσία και η χώρα θα αντικαταστήσουν τις τρέχουσες τιμές.\nΤα δεδομένα GPS αντικαθίστανται μόνο αν υπάρχει νέα τιμή. 0728 Lock 0728 Κλείδωμα 0729 Low Amplify 0729 Χαμηλή Ενίσχυση 0730 MAGNIFY IMAGE 0730 ΜΕΓΕΘΥΝΣΗ ΕΙΚΟΝΑΣ 0731 MAKE WAVES 0731 ΔΗΜΙΟΥΡΓΙΑ ΚΥΜΑΤΩΝ 0732 MANAGE KEYWORDS 0732 ΔΙΑΧΕΙΡΙΣΗ KEYWORDS 0733 MAP MENU 0733 ΜΕΝΟΥ ΧΑΡΤΗ 0734 MAP VIEW 0734 ΠΡΟΒΟΛΗ ΧΑΡΤΗ 0735 MARGINS 0735 ΠΕΡΙΘΩΡΙΑ 0736 MARKUP 0736 ΣΗΜΑΝΣΗ 0737 MASHUP 0737 MASHUP 0738 MATCH COLORS 0738 ΤΑΙΡΙΑΣΜΑ ΧΡΩΜΑΤΩΝ 0739 MEASURE IMAGE 0739 ΜΕΤΡΗΣΗ ΕΙΚΟΝΑΣ 0740 MENU SHORTCUTS 0740 ΣΥΝΤΟΜΕΥΣΕΙΣ ΜΕΝΟΥ 0741 METADATA MENU 0741 ΜΕΝΟΥ METADATA 0742 METADATA TAGS 0742 TAGS METADATA 0743 METADATA VIEW 0743 ΠΡΟΒΟΛΗ METADATA 0744 MONITOR COLOR 0744 ΧΡΩΜΑ ΟΘΟΝΗΣ 0745 MOSAIC 0745 ΨΗΦΙΔΩΤΟ 0746 MOUSE ALT-RIGHT-BUTTON 0746 ALT + ΔΕΞΙ ΚΟΥΜΠΙ ΠΟΝΤΙΚΙΟΥ 0747 MOUSE FUNCTIONS 0747 ΛΕΙΤΟΥΡΓΙΕΣ ΠΟΝΤΙΚΙΟΥ 0748 MOUSE OWNERSHIP 0748 ΚΥΡΙΟΤΗΤΑ ΠΟΝΤΙΚΙΟΥ 0749 MOVE FOTOCX HOME 0749 ΜΕΤΑΚΙΝΗΣΗ ΚΥΡΙΟΥ ΦΑΚΕΛΟΥ FOTOCX 0750 Magnify 0750 Μεγέθυνση 0751 Magnify Image 0751 Μεγέθυνση Εικόνας 0752 Magnify image around the mouse position 0752 Μεγέθυνση εικόνας γύρω από τη θέση του ποντικιού 0753 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0753 Η κύρια μνήμη είναι πολύ μικρή για την εκτέλεση του Fotocx. \nΜπορείτε να δοκιμάσετε ούτως ή άλλως αν το επιθυμείτε. \n Συνέχεια; 0754 Make Layout Image 0754 Δημιουργία Εικόνας Διάταξης 0755 Make Square Tiles 0755 Δημιουργία Τετράγωνων Πλακιδίων 0756 Make Waves 0756 Δημιουργία Κυμάτων 0757 Make a spherical projection of an image 0757 Δημιουργία σφαιρικής προβολής μιας εικόνας 0758 Make black margins transparent 0758 Καθιστά τα μαύρα περιθώρια διαφανή 0759 Make new versions 0759 Δημιουργία νέων εκδόσεων 0760 Make width constant for window size 0760 Διατήρηση σταθερού πλάτους για το μέγεθος του παραθύρου 0761 Manage Keywords 0761 Διαχείριση Keywords 0762 Map 0762 Χάρτης 0763 Map View 0763 Προβολή Χάρτη 0764 Maps 0764 Χάρτες 0765 Maps: view images by map location 0765 Χάρτες: προβολή εικόνων ανά τοποθεσία στο χάρτη 0766 Margin 0766 Περιθώριο 0767 Margins 0767 Περιθώρια 0768 Markup 0768 Σήμανση 0769 Mashup 0769 Mashup 0770 Mass update album files 0770 Μαζική ενημέρωση αρχείων άλμπουμ 0771 Match Brightness 0771 Ταίριασμα Φωτεινότητας 0772 Match Colors 0772 Ταίριασμα Χρωμάτων 0773 Match Level 0773 Επίπεδο Ταιριάσματος 0774 Match Limit 0774 Όριο Ταιριάσματος 0775 Match image colors to colors of another image 0775 Ταίριασμα χρωμάτων εικόνας με τα χρώματα άλλης εικόνας 0776 Match using: 0776 Ταίριασμα με χρήση: 0777 Matching Keywords 0777 Ταιριαστά Keywords 0778 Max 0778 Μεγ. 0779 Max. Width 0779 Μέγ. Πλάτος 0780 Measure Image 0780 Μέτρηση Εικόνας 0781 Measure Noise 0781 Μέτρηση Θορύβου 0782 Measure pixel distances within an image 0782 Μέτρηση αποστάσεων pixel μέσα σε μια εικόνα 0783 Menu Colors 0783 Χρώματα Μενού 0784 Menu Style 0784 Στυλ Μενού 0785 Metadata 0785 Metadata 0786 Metadata Tags 0786 Tags Metadata 0787 Metadata View 0787 Προβολή Metadata 0788 Metadata from Search Function 0788 Metadata από τη Λειτουργία Αναζήτησης 0789 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0789 Μέθοδος 1:\nΑριστερό κλικ στο κόκκινο μάτι για σκούρεμα.\nΜέθοδος 2:\nΣύρετε κάτω και δεξιά για να περικλείσετε το κόκκινο μάτι.\nΑριστερό κλικ στο κόκκινο μάτι για σκούρεμα.\nΑναίρεση κόκκινου ματιού:\nΔεξί κλικ στο κόκκινο μάτι. 0790 Mirror: 0790 Καθρέφτισμα: 0791 Mode: 0791 Λειτουργία: 0792 Monitor Color 0792 Χρώμα Οθόνης 0793 Mosaic 0793 Ψηφιδωτό 0794 Mouse Radius 0794 Ακτίνα Ποντικιού 0795 Mouse Warp (drag image) 0795 Παραμόρφωση με Ποντίκι (σύρσιμο εικόνας) 0796 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0796 Σύρσιμο ποντικιού: μετατόπιση εικόνας 360° \nΑριστερό/δεξί κλικ ποντικιού: zoom μέσα/έξω \nEscape: έξοδος από προβολή πανοράματος 0797 Move %d image files 0797 Μετακίνηση %d αρχείων εικόνας 0798 Move Fotocx Home 0798 Μετακίνηση Κύριου Φακέλου Fotocx 0799 Move Fotocx Home Folder 0799 Μετακίνηση Κύριου Φακέλου Fotocx 0800 Move Fotocx home folder to chosen folder 0800 Μετακίνηση του κύριου φακέλου Fotocx στον επιλεγμένο φάκελο 0801 Move mouse in a monotone image area. 0801 Μετακινήστε το ποντίκι σε μια μονότονη περιοχή της εικόνας. 0802 Multiplier 0802 Πολλαπλασιαστής 0803 NEW SESSION 0803 ΝΕΑ ΣΥΝΕΔΡΙΑ 0804 NEWEST FILES 0804 ΠΙΟ ΠΡΟΣΦΑΤΑ ΑΡΧΕΙΑ 0805 NEWLINE CHARACTERS IN METADATA 0805 ΧΑΡΑΚΤΗΡΕΣ ΝΕΑΣ ΓΡΑΜΜΗΣ ΣΤΑ METADATA 0806 NON-STANDARD DIALOG WIDGETS 0806 ΜΗ ΤΥΠΙΚΑ ΣΤΟΙΧΕΙΑ ΠΑΡΑΘΥΡΟΥ ΔΙΑΛΟΓΟΥ 0807 New Area 0807 Νέα Περιοχή 0808 New File Name: 0808 Νέο Όνομα Αρχείου: 0809 New Location 0809 Νέα Τοποθεσία 0810 New Location: 0810 Νέα Τοποθεσία: 0811 New Name 0811 Νέο Όνομα 0812 New Session 0812 Νέα Συνεδρία 0813 New Type: 0813 Νέος Τύπος: 0814 New Version 0814 Νέα Έκδοση 0815 Newest 0815 Πιο Πρόσφατο 0816 Newest Files 0816 Πιο Πρόσφατα Αρχεία 0817 Next 0817 Επόμενο 0818 Next gallery 0818 Επόμενη γκαλερί 0819 No 0819 Όχι 0820 No curve lines found 0820 Δεν βρέθηκαν γραμμές καμπύλης 0821 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0821 Δεν βρέθηκε ευρετήριο αρχείων εικόνας.\nΘα δημιουργηθεί ένα ευρετήριο αρχείων εικόνας.\nΤα αρχεία εικόνας σας δεν θα αλλάξουν.\nΑυτό μπορεί να χρειαστεί σημαντικό χρόνο αν \nέχετε πολλές χιλιάδες αρχεία εικόνας. 0822 No images found 0822 Δεν βρέθηκαν εικόνες 0823 Noise Reduction 0823 Μείωση Θορύβου 0824 Noise Size 0824 Μέγεθος Θορύβου 0825 None 0825 Κανένα 0826 Normal Blur 0826 Κανονικό Θόλωμα 0827 Normal Blur - mix pixels with all neighbor pixels 0827 Κανονικό Θόλωμα - ανάμειξη pixel με όλα τα γειτονικά pixel 0828 OPEN IMAGE FILE 0828 ΑΝΟΙΓΜΑ ΑΡΧΕΙΟΥ ΕΙΚΟΝΑΣ 0829 OTHER TOPICS 0829 ΑΛΛΑ ΘΕΜΑΤΑ 0830 OUTLINES 0830 ΠΕΡΙΓΡΑΜΜΑΤΑ 0831 Old Name 0831 Παλιό Όνομα 0832 One Tag: 0832 Ένα Tag: 0833 Opacity 0833 Αδιαφάνεια 0834 Open 0834 Άνοιγμα 0835 Open Image File 0835 Άνοιγμα Αρχείου Εικόνας 0836 Open a file and paste as selected area into an image 0836 Ανοίξτε ένα αρχείο και επικολλήστε το ως επιλεγμένη περιοχή σε μια εικόνα 0837 Open a parallel Fotocx session 0837 Άνοιγμα παράλληλης συνεδρίας Fotocx 0838 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0838 Ανοίξτε και επεξεργαστείτε το σαρωμένο αρχείο χρωματικού πίνακα. \nΑφαιρέστε τυχόν κλίση ή περιστροφή από τη σάρωση. \n(Χρησιμοποιήστε τη λειτουργία Διόρθωση Προοπτικής για αυτό). \nΚόψτε ΑΚΡΙΒΩΣ το λεπτό πράσινο περιθώριο. \nΑποθηκεύστε (αντικαταστήστε) το αρχείο χρωματικού πίνακα. 0839 Open the trimmed color chart file 0839 Ανοίξτε το κομμένο αρχείο χρωματικού πίνακα 0840 Optimize 0840 Βελτιστοποίηση 0841 Other Tag ... 0841 Άλλο Tag ... 0842 Outboard Programs 0842 Εξωτερικά Προγράμματα 0843 Outline Drawing 0843 Σχέδιο Περιγράμματος 0844 Outlines 0844 Περιγράμματα 0845 Output Color 0845 Χρώμα Εξόδου 0846 Overlap 0846 Επικάλυψη 0847 Overlay position in host image: 0847 Θέση επικάλυψης στην κύρια εικόνα: 0848 Overlay width, % host image width: 0848 Πλάτος επικάλυψης, % του πλάτους της κύριας εικόνας: 0849 Overwrite file? \n%s 0849 Αντικατάσταση αρχείου; \n%s 0850 PAINT EDITS 0850 ΖΩΓΡΑΦΙΚΗ ΕΠΕΞΕΡΓΑΣΙΩΝ 0851 PAINT IMAGE 0851 ΖΩΓΡΑΦΙΚΗ ΕΙΚΟΝΑΣ 0852 PAINT TRANSPARENCY 0852 ΖΩΓΡΑΦΙΚΗ ΔΙΑΦΑΝΕΙΑΣ 0853 PAINTING 0853 ΖΩΓΡΑΦΙΚΗ 0854 PANORAMA 0854 ΠΑΝΟΡΑΜΑ 0855 PATTERN 0855 ΜΟΤΙΒΟ 0856 PERSPECTIVE 0856 ΠΡΟΟΠΤΙΚΗ 0857 PLACES/DATES 0857 ΤΟΠΟΘΕΣΙΕΣ/ΗΜΕΡΟΜΗΝΙΕΣ 0858 PLUGINS 0858 PLUGINS 0859 PREV/NEXT 0859 ΠΡΟΗΓΟΥΜΕΝΟ/ΕΠΟΜΕΝΟ 0860 PRINT CALIBRATED 0860 ΒΑΘΜΟΝΟΜΗΜΕΝΗ ΕΚΤΥΠΩΣΗ 0861 PRINT IMAGE 0861 ΕΚΤΥΠΩΣΗ ΕΙΚΟΝΑΣ 0862 PRIVACY 0862 ΑΠΟΡΡΗΤΟ 0863 PROBLEM FILES 0863 ΠΡΟΒΛΗΜΑΤΙΚΑ ΑΡΧΕΙΑ 0864 PROBLEM REPORTING 0864 ΑΝΑΦΟΡΑ ΠΡΟΒΛΗΜΑΤΩΝ 0865 Paint Edits 0865 Ζωγραφική Επεξεργασιών 0866 Paint Edits already active 0866 Η Ζωγραφική Επεξεργασιών είναι ήδη ενεργή 0867 Paint Image 0867 Ζωγραφική Εικόνας 0868 Paint Image Transparencies 0868 Ζωγραφική Διαφανειών Εικόνας 0869 Paint Radius 0869 Ακτίνα Ζωγραφικής 0870 Paint Transparency 0870 Ζωγραφική Διαφάνειας 0871 Paint and Warp Image 0871 Ζωγραφική και Παραμόρφωση Εικόνας 0872 Paint current edit function gradually using the mouse 0872 Εφαρμόστε σταδιακά την τρέχουσα λειτουργία επεξεργασίας με το ποντίκι 0873 Paint entire image 0873 Ζωγραφική ολόκληρης της εικόνας 0874 Paint image transparency using the mouse 0874 Ζωγραφική διαφάνειας εικόνας με το ποντίκι 0875 Paint on Image 0875 Ζωγραφική στην Εικόνα 0876 Paint on image using the mouse 0876 Ζωγραφική στην εικόνα με το ποντίκι 0877 Paint transparency 0877 Ζωγραφική διαφάνειας 0878 Paint within mouse 0878 Ζωγραφική εντός εμβέλειας ποντικιού 0879 Painting 0879 Ζωγραφική 0880 Panorama 0880 Πανόραμα 0881 Paste 0881 Επικόλληση 0882 Paste Image 0882 Επικόλληση Εικόνας 0883 Paste previously copied area into image 0883 Επικόλληση προηγουμένως αντιγραμμένης περιοχής στην εικόνα 0884 Pattern 0884 Μοτίβο 0885 Pattern File: 0885 Αρχείο Μοτίβου: 0886 Pattern Width 0886 Πλάτος Μοτίβου 0887 Percent 0887 Ποσοστό 0888 Permissions 0888 Δικαιώματα 0889 Perspective 0889 Προοπτική 0890 Photo Date/Time 0890 Ημερομηνία/Ώρα Φωτογραφίας 0891 Photo Date/Time (metadata) 0891 Ημερομηνία/Ώρα Φωτογραφίας (metadata) 0892 Photo Date: %s File Date: %s \n 0892 Ημερομηνία Φωτογραφίας: %s Ημερομηνία Αρχείου: %s \n 0893 Pixel count 0893 Αριθμός pixel 0894 Pixel difference 0894 Διαφορά pixel 0895 Pixels 0895 Pixel 0896 Places/Dates 0896 Τοποθεσίες/Ημερομηνίες 0897 Plugin working ... 0897 Το plugin λειτουργεί ... 0898 Popup Image 0898 Αναδυόμενη Εικόνα 0899 Power 0899 Ισχύς 0900 Power Center 0900 Κέντρο Ισχύος 0901 Power: Center 0901 Ισχύς: Κέντρο 0902 Pre-align Images 0902 Προευθυγράμμιση Εικόνων 0903 Preference: 0903 Προτίμηση: 0904 Press F1 for help 0904 Πατήστε F1 για βοήθεια 0905 Prev 0905 Προηγ. 0906 Prev/Next 0906 Προηγούμενο/Επόμενο 0907 Previous 0907 Προηγούμενο 0908 Previous gallery 0908 Προηγούμενη γκαλερί 0909 Print Calibrated 0909 Βαθμονομημένη Εκτύπωση 0910 Print Image 0910 Εκτύπωση Εικόνας 0911 Print chart in vertical orientation without margins. 0911 Εκτυπώστε τον πίνακα σε κατακόρυφο προσανατολισμό χωρίς περιθώρια. 0912 Print current image file with calibrated colors 0912 Εκτύπωση τρέχοντος αρχείου εικόνας με βαθμονομημένα χρώματα 0913 Print the current image file 0913 Εκτύπωση του τρέχοντος αρχείου εικόνας 0914 Privacy 0914 Απόρρητο 0915 Proceed 0915 Συνέχεια 0916 Proceed? 0916 Συνέχεια; 0917 Process album files matching selected files: 0917 Επεξεργασία αρχείων άλμπουμ που ταιριάζουν με τα επιλεγμένα αρχεία: 0918 Process an image using a custom convolution kernel 0918 Επεξεργασία εικόνας με χρήση προσαρμοσμένου πυρήνα συνέλιξης 0919 Process selected album files: 0919 Επεξεργασία επιλεγμένων αρχείων άλμπουμ: 0920 Processing files 0920 Επεξεργασία αρχείων 0921 Project name 0921 Όνομα έργου 0922 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0922 Τραβήξτε μια θέση της εικόνας με το ποντίκι. \nΚάντε πολλαπλά τραβήγματα με το ποντίκι μέχρι να είστε ικανοποιημένοι. \nΌταν τελειώσετε, πατήστε [OK]. 0923 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0923 Τραβήξτε μια γωνία της εικόνας με το ποντίκι. \nΚάντε πολλαπλά τραβήγματα με το ποντίκι μέχρι να είστε ικανοποιημένοι. \nΌταν τελειώσετε, πατήστε [OK]. 0924 Pull on the image with the mouse. 0924 Τραβήξτε την εικόνα με το ποντίκι. 0925 Purge unwanted keywords from all image files 0925 Εκκαθάριση ανεπιθύμητων keywords από όλα τα αρχεία εικόνας 0926 QUESTIONS, SUGGESTIONS 0926 ΕΡΩΤΗΣΕΙΣ, ΠΡΟΤΑΣΕΙΣ 0927 Quit 0927 Έξοδος 0928 Quit Fotocx 0928 Έξοδος από το Fotocx 0929 Quit Fotocx? 0929 Έξοδος από το Fotocx; 0930 RAW Files 0930 Αρχεία RAW 0931 RAW Options 0931 Επιλογές RAW 0932 RAW conversion failed: %s %s 0932 Η μετατροπή RAW απέτυχε: %s %s 0933 RAW loader 0933 Πρόγραμμα φόρτωσης RAW 0934 RECENT FILES 0934 ΠΡΟΣΦΑΤΑ ΑΡΧΕΙΑ 0935 RECENT FOLDERS 0935 ΠΡΟΣΦΑΤΟΙ ΦΑΚΕΛΟΙ 0936 RED EYES 0936 ΚΟΚΚΙΝΑ ΜΑΤΙΑ 0937 REFINE MENU 0937 ΜΕΝΟΥ ΒΕΛΤΙΩΣΗΣ 0938 REMOVE DUST 0938 ΑΦΑΙΡΕΣΗ ΣΚΟΝΗΣ 0939 REMOVE HALO 0939 ΑΦΑΙΡΕΣΗ ΦΩΤΟΣΤΕΦΑΝΟΥ 0940 RENAME 0940 ΜΕΤΟΝΟΜΑΣΙΑ 0941 RENAME ALBUM 0941 ΜΕΤΟΝΟΜΑΣΙΑ ΑΛΜΠΟΥΜ 0942 REPAIR MENU 0942 ΜΕΝΟΥ ΕΠΙΔΙΟΡΘΩΣΗΣ 0943 RESCALE 0943 ΑΛΛΑΓΗ ΚΛΙΜΑΚΑΣ 0944 RETOUCH 0944 ΡΕΤΟΥΣ 0945 RGB -> BRG 0945 RGB -> BRG 0946 RGB -> GBR 0946 RGB -> GBR 0947 RGB HISTOGRAM 0947 ΙΣΤΟΓΡΑΜΜΑ RGB 0948 RGB Histogram 0948 Ιστόγραμμα RGB 0949 RGB brightness histogram graph 0949 Γράφημα ιστογράμματος φωτεινότητας RGB 0950 RGB color 0950 Χρώμα RGB 0951 RGB mix with given bit-depth 0951 Ανάμειξη RGB με δεδομένο βάθος bit 0952 ROTATE 0952 ΠΕΡΙΣΤΡΟΦΗ 0953 RUN SCRIPT 0953 ΕΚΤΕΛΕΣΗ ΣΕΝΑΡΙΟΥ 0954 Radial Blur 0954 Ακτινικό Θόλωμα 0955 Radial Blur - mix pixels in radial lines from chosen center 0955 Ακτινικό Θόλωμα - ανάμειξη pixel σε ακτινικές γραμμές από επιλεγμένο κέντρο 0956 Radius 0956 Ακτίνα 0957 Random Image 0957 Τυχαία Εικόνα 0958 Range 0958 Εύρος 0959 Rating: %s Size: %s %.2fmb \n 0959 Βαθμολογία: %s Μέγεθος: %s %.2fmb \n 0960 Read or search the user guide 0960 Διαβάστε ή αναζητήστε στον οδηγό χρήσης 0961 Recent Files 0961 Πρόσφατα Αρχεία 0962 Recent Folders 0962 Πρόσφατοι Φάκελοι 0963 Recent Keywords 0963 Πρόσφατα Keywords 0964 Rectify closeup face photo (balloon face) 0964 Διόρθωση κοντινής φωτογραφίας προσώπου (φούσκωμα προσώπου) 0965 Red 0965 Κόκκινο 0966 Red Eye Reduction 0966 Μείωση Κόκκινων Ματιών 0967 Red Eyes 0967 Κόκκινα Μάτια 0968 Red Factors 0968 Συντελεστές Κόκκινου 0969 Redo 0969 Επανάληψη 0970 Reduce Fog/Haze 0970 Μείωση Ομίχλης/Καταχνιάς 0971 Reduce fog/haze in an image or selected areas 0971 Μείωση ομίχλης/καταχνιάς σε μια εικόνα ή επιλεγμένες περιοχές 0972 Refine 0972 Βελτίωση 0973 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0973 Βελτίωση: εξομάλυνση ιστογράμματος, τοπική αντίθεση, ενίσχυση αντίθεσης, retinex, κορεσμός 0974 Remove 0974 Αφαίρεση 0975 Remove Dust 0975 Αφαίρεση Σκόνης 0976 Remove Halo 0976 Αφαίρεση Φωτοστέφανου 0977 Remove dust spots from old scanned photos 0977 Αφαίρεση κηλίδων σκόνης από παλιές σαρωμένες φωτογραφίες 0978 Remove from Album 0978 Αφαίρεση από το Άλμπουμ 0979 Remove halos left by some edit functions 0979 Αφαίρεση φωτοστεφάνων που αφήνουν ορισμένες λειτουργίες επεξεργασίας 0980 Remove image curvature, especially in panoramas 0980 Αφαίρεση καμπυλότητας εικόνας, ειδικά σε πανοράματα 0981 Remove jaggies on hard image feature edges 0981 Αφαίρεση οδοντωτών άκρων σε έντονα στοιχεία της εικόνας 0982 Remove selected image metadata 0982 Αφαίρεση επιλεγμένων metadata εικόνας 0983 Remove unwanted objects in an image 0983 Αφαίρεση ανεπιθύμητων αντικειμένων από μια εικόνα 0984 Rename 0984 Μετονομασία 0985 Rename Album 0985 Μετονομασία Άλμπουμ 0986 Rename Image File 0986 Μετονομασία Αρχείου Εικόνας 0987 Rename an existing album 0987 Μετονομασία υπάρχοντος άλμπουμ 0988 Rename or delete keywords for all image files 0988 Μετονομασία ή διαγραφή keywords για όλα τα αρχεία εικόνας 0989 Rename to 0989 Μετονομασία σε 0990 Rename/convert/rescale/move selected image or RAW files 0990 Μετονομασία/μετατροπή/αλλαγή κλίμακας/μετακίνηση επιλεγμένων αρχείων εικόνας ή RAW 0991 Repair 0991 Επιδιόρθωση 0992 Repair malformed metadata preventing metadata edits 0992 Επιδιόρθωση κακοδιατυπωμένων metadata που εμποδίζουν την επεξεργασία metadata 0993 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 0993 Επιδιόρθωση: όξυνση, θόλωμα, αφαίρεση θορύβου, αφαίρεση ομίχλης, κόκκινα μάτια, έξυπνη διαγραφή, προσαρμογή χρώματος 0994 Replace 0994 Αντικατάσταση 0995 Replace Text 0995 Αντικατάσταση Κειμένου 0996 Replace all versions with newest version 0996 Αντικατάσταση όλων των εκδόσεων με την πιο πρόσφατη έκδοση 0997 Replace all versions with selected versions 0997 Αντικατάσταση όλων των εκδόσεων με τις επιλεγμένες εκδόσεις 0998 Replace all with newest version only 0998 Αντικατάσταση όλων μόνο με την πιο πρόσφατη έκδοση 0999 Replace all with original + newest version 0999 Αντικατάσταση όλων με το πρωτότυπο + την πιο πρόσφατη έκδοση 1000 Replace all with original + selected versions 1000 Αντικατάσταση όλων με το πρωτότυπο + τις επιλεγμένες εκδόσεις 1001 Replace all with original and all versions 1001 Αντικατάσταση όλων με το πρωτότυπο και όλες τις εκδόσεις 1002 Replace all with selected versions 1002 Αντικατάσταση όλων με τις επιλεγμένες εκδόσεις 1003 Replace host files 1003 Αντικατάσταση κύριων αρχείων 1004 Report Image Places/Dates 1004 Αναφορά Τοποθεσιών/Ημερομηνιών Εικόνας 1005 Report selected metadata for selected image files 1005 Αναφορά επιλεγμένων metadata για τα επιλεγμένα αρχεία εικόνας 1006 Rescale 1006 Αλλαγή Κλίμακας 1007 Rescale Image 1007 Αλλαγή Κλίμακας Εικόνας 1008 Rescale RGB levels to reduce color caste and fog/haze 1008 Αλλαγή κλίμακας επιπέδων RGB για μείωση χρωματικής απόχρωσης και ομίχλης/καταχνιάς 1009 Rescale brightness levels to increase local contrast 1009 Αλλαγή κλίμακας επιπέδων φωτεινότητας για αύξηση τοπικής αντίθεσης 1010 Rescale: 1010 Αλλαγή Κλίμακας: 1011 Reserved Shortcuts \n 1011 Δεσμευμένες Συντομεύσεις \n 1012 Reserved shortcut ignored: %s 1012 Δεσμευμένη συντόμευση αγνοήθηκε: %s 1013 Reset 1013 Επαναφορά 1014 Reset all galleries to file name ascending 1014 Επαναφορά όλων των γκαλερί σε αύξουσα σειρά ονόματος αρχείου 1015 Resolution 1015 Ανάλυση 1016 Resources 1016 Πόροι 1017 Resume 1017 Συνέχιση 1018 Retouch 1018 Ρετούς 1019 Reverse R 1019 Αντιστροφή R 1020 Richardson-Lucy 1020 Richardson-Lucy 1021 Right 1021 Δεξιά 1022 Rim % 1022 Περιθώριο % 1023 Rotate 1023 Περιστροφή 1024 Rotate Image 1024 Περιστροφή Εικόνας 1025 Rotate or level an image 1025 Περιστροφή ή οριζοντίωση μιας εικόνας 1026 Rotate: 1026 Περιστροφή: 1027 Roy Lichtenstein effect 1027 Εφέ Roy Lichtenstein 1028 SATURATION 1028 ΚΟΡΕΣΜΟΣ 1029 SCRIPT FILES 1029 ΑΡΧΕΙΑ ΣΕΝΑΡΙΟΥ 1030 SEARCH IMAGES 1030 ΑΝΑΖΗΤΗΣΗ ΕΙΚΟΝΩΝ 1031 SELECT AREA 1031 ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ 1032 SELECT FILES 1032 ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ 1033 SELECT IMAGE FILES 1033 ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ 1034 SELECT MENU 1034 ΜΕΝΟΥ ΕΠΙΛΟΓΗΣ 1035 SET COLORS 1035 ΟΡΙΣΜΟΣ ΧΡΩΜΑΤΩΝ 1036 SET WALLPAPER 1036 ΟΡΙΣΜΟΣ ΤΑΠΕΤΣΑΡΙΑΣ 1037 SETTINGS 1037 ΡΥΘΜΙΣΕΙΣ 1038 SHARPEN 1038 ΟΞΥΝΣΗ 1039 SHIFT COLORS 1039 ΜΕΤΑΤΟΠΙΣΗ ΧΡΩΜΑΤΩΝ 1040 SHORTCUTS 1040 ΣΥΝΤΟΜΕΥΣΕΙΣ 1041 SHOW CIM FILES 1041 ΕΜΦΑΝΙΣΗ ΑΡΧΕΙΩΝ CIM 1042 SHOW DIFFS 1042 ΕΜΦΑΝΙΣΗ ΔΙΑΦΟΡΩΝ 1043 SHOW ON MAP 1043 ΕΜΦΑΝΙΣΗ ΣΤΟ ΧΑΡΤΗ 1044 SHOW RESOURCES 1044 ΕΜΦΑΝΙΣΗ ΠΟΡΩΝ 1045 SHOW RGB 1045 ΕΜΦΑΝΙΣΗ RGB 1046 SHOW/HIDE AREA 1046 ΕΜΦΑΝΙΣΗ/ΑΠΟΚΡΥΨΗ ΠΕΡΙΟΧΗΣ 1047 SKETCH1 1047 ΣΚΙΤΣΟ1 1048 SKETCH2 1048 ΣΚΙΤΣΟ2 1049 SLIDE SHOW 1049 ΠΡΟΒΟΛΗ ΔΙΑΦΑΝΕΙΩΝ 1050 SLIDES AND NEGATIVES 1050 ΔΙΑΦΑΝΕΙΕΣ ΚΑΙ ΑΡΝΗΤΙΚΑ 1051 SLIDESHOW END 1051 ΤΕΛΟΣ ΠΡΟΒΟΛΗΣ ΔΙΑΦΑΝΕΙΩΝ 1052 SMART ERASE 1052 ΕΞΥΠΝΗ ΔΙΑΓΡΑΦΗ 1053 SOFT FOCUS 1053 ΗΠΙΑ ΕΣΤΙΑΣΗ 1054 SPHERE 1054 ΣΦΑΙΡΑ 1055 SPLIT-SCREEN 1055 ΔΙΧΑΣΜΕΝΗ ΟΘΟΝΗ 1056 STACK/LAYERS 1056 ΣΤΟΙΒΑΞΗ/ΕΠΙΠΕΔΑ 1057 STACK/NOISE 1057 ΣΤΟΙΒΑΞΗ/ΘΟΡΥΒΟΣ 1058 STACK/PAINT 1058 ΣΤΟΙΒΑΞΗ/ΖΩΓΡΑΦΙΚΗ 1059 Saturation 1059 Κορεσμός 1060 Save 1060 Αποθήκευση 1061 Save Gallery as Album 1061 Αποθήκευση Γκαλερί ως Άλμπουμ 1062 Save Image File 1062 Αποθήκευση Αρχείου Εικόνας 1063 Save as new file name or type 1063 Αποθήκευση με νέο όνομα ή τύπο αρχείου 1064 Save current gallery as album 1064 Αποθήκευση τρέχουσας γκαλερί ως άλμπουμ 1065 Save modified image as new file or new file version 1065 Αποθήκευση τροποποιημένης εικόνας ως νέο αρχείο ή νέα έκδοση αρχείου 1066 Save selected area to a file with transparency 1066 Αποθήκευση επιλεγμένης περιοχής σε αρχείο με διαφάνεια 1067 Saved Areas 1067 Αποθηκευμένες Περιοχές 1068 Scale 1068 Κλίμακα 1069 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1069 Σαρώστε τον εκτυπωμένο χρωματικό πίνακα, με την πιο σκούρα σειρά στην κορυφή. \nΑποθηκεύστε ως αρχείο .png χρησιμοποιώντας τα ονόματα εκτυπωτή και χαρτιού \n(π.χ. %s/Epson_glossy.png). \n 1070 Search 1070 Αναζήτηση 1071 Search Images 1071 Αναζήτηση Εικόνων 1072 Search Results 1072 Αποτελέσματα Αναζήτησης 1073 Search all image files and report duplicates 1073 Αναζήτηση σε όλα τα αρχεία εικόνας και αναφορά διπλότυπων 1074 Searching - use ESC key to terminate 1074 Αναζήτηση σε εξέλιξη - χρησιμοποιήστε το πλήκτρο ESC για τερματισμό 1075 Seconds 1075 Δευτερόλεπτα 1076 Select 1076 Επιλογή 1077 Select %d to %d files 1077 Επιλέξτε από %d έως %d αρχεία 1078 Select Album 1078 Επιλογή Άλμπουμ 1079 Select Albums 1079 Επιλογή Άλμπουμ 1080 Select Area 1080 Επιλογή Περιοχής 1081 Select Area for Edits 1081 Επιλογή Περιοχής για Επεξεργασίες 1082 Select Area not supported \nby this edit function 1082 Η Επιλογή Περιοχής δεν υποστηρίζεται \nαπό αυτή τη λειτουργία επεξεργασίας 1083 Select Files 1083 Επιλογή Αρχείων 1084 Select Image 1084 Επιλογή Εικόνας 1085 Select Image Files 1085 Επιλογή Αρχείων Εικόνας 1086 Select Metadata tags 1086 Επιλογή tags Metadata 1087 Select Script 1087 Επιλογή Σεναρίου 1088 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1088 Επιλέξτε μια περιοχή προς παραμόρφωση χρησιμοποιώντας τη λειτουργία επιλογής περιοχής. \nΠατήστε [έναρξη παραμόρφωσης] και τραβήξτε την περιοχή με το ποντίκι. \nΚάντε πολλαπλά τραβήγματα μέχρι να είστε ικανοποιημένοι. \nΌταν τελειώσετε, επιλέξτε άλλη περιοχή ή πατήστε [OK]. 1089 Select and Paint Image 1089 Επιλογή και Ζωγραφική Εικόνας 1090 Select and view an image file 1090 Επιλέξτε και προβάλετε ένα αρχείο εικόνας 1091 Select area cannot be kept.\nContinue? 1091 Η επιλεγμένη περιοχή δεν μπορεί να διατηρηθεί.\nΣυνέχεια; 1092 Select area disabled, Continue? 1092 Η επιλογή περιοχής είναι απενεργοποιημένη, Συνέχεια; 1093 Select area not finished, Continue? 1093 Η επιλογή περιοχής δεν έχει ολοκληρωθεί, Συνέχεια; 1094 Select area will be ignored. \nContinue? 1094 Η επιλεγμένη περιοχή θα αγνοηθεί. \nΣυνέχεια; 1095 Select folder 1095 Επιλογή φακέλου 1096 Select host image files 1096 Επιλογή κύριων αρχείων εικόνας 1097 Select image areas to edit separately, copy/paste selections 1097 Επιλέξτε περιοχές εικόνας για ξεχωριστή επεξεργασία, αντιγραφή/επικόλληση επιλογών 1098 Select image objects or areas for separate editing 1098 Επιλέξτε αντικείμενα ή περιοχές εικόνας για ξεχωριστή επεξεργασία 1099 Select input files for subsequent function 1099 Επιλέξτε αρχεία εισόδου για την επόμενη λειτουργία 1100 Select overlay file 1100 Επιλογή αρχείου επικάλυψης 1101 Select startup album 1101 Επιλογή άλμπουμ εκκίνησης 1102 Select startup folder 1102 Επιλογή φακέλου εκκίνησης 1103 Select startup image file 1103 Επιλογή αρχείου εικόνας εκκίνησης 1104 Select the image file to print. 1104 Επιλέξτε το αρχείο εικόνας προς εκτύπωση. 1105 Select to add, click on X to delete. 1105 Επιλέξτε για προσθήκη, κάντε κλικ στο X για διαγραφή. 1106 Select two files 1106 Επιλέξτε δύο αρχεία 1107 Select versions, ratings, keywords, filename text 1107 Επιλέξτε εκδόσεις, βαθμολογίες, keywords, κείμενο ονόματος αρχείου 1108 Separation Horz 1108 Οριζόντιος Διαχωρισμός 1109 Sequence Numbers 1109 Αριθμοί Ακολουθίας 1110 Set Colors 1110 Ορισμός Χρωμάτων 1111 Set No. of Colors 1111 Ορισμός Αριθμού Χρωμάτων 1112 Set Ratio: 1112 Ορισμός Αναλογίας: 1113 Set Wallpaper 1113 Ορισμός Ταπετσαρίας 1114 Set Width: 1114 Ορισμός Πλάτους: 1115 Set and view bookmarks, select for gallery view 1115 Ορισμός και προβολή σελιδοδεικτών, επιλογή για προβολή γκαλερί 1116 Set black-white/color, negative/positive, sepia 1116 Ορισμός ασπρόμαυρου/χρώματος, αρνητικού/θετικού, σέπια 1117 Set foreground line color (crop, grid, select, warp) 1117 Ορισμός χρώματος γραμμής προσκηνίου (περικοπή, πλέγμα, επιλογή, παραμόρφωση) 1118 Set gallery from latest search results 1118 Ορισμός γκαλερί από τα πιο πρόσφατα αποτελέσματα αναζήτησης 1119 Set gallery from recent folders list 1119 Ορισμός γκαλερί από τη λίστα πρόσφατων φακέλων 1120 Set gallery to folder of current file 1120 Ορισμός γκαλερί στο φάκελο του τρέχοντος αρχείου 1121 Set horizontal/vertical grid line counts 1121 Ορισμός αριθμού οριζόντιων/κάθετων γραμμών πλέγματος 1122 Set image file as desktop wallpaper 1122 Ορισμός αρχείου εικόνας ως ταπετσαρία επιφάνειας εργασίας 1123 Set line properties, [Add] to layout, edit. 1123 Ορίστε τις ιδιότητες γραμμής, [Προσθήκη] στη διάταξη, επεξεργασία. 1124 Set number of colors for each R/G/B or total 1124 Ορισμός αριθμού χρωμάτων για κάθε R/G/B ή σύνολο 1125 Set or shift photo date/time for selected image files 1125 Ορισμός ή μετατόπιση ημερομηνίας/ώρας φωτογραφίας για τα επιλεγμένα αρχεία εικόνας 1126 Set the name for the output calibration file \n[your calibration name].dat 1126 Ορίστε το όνομα για το αρχείο βαθμονόμησης εξόδου \n[όνομα βαθμονόμησής σας].dat 1127 Settings 1127 Ρυθμίσεις 1128 Sharpen 1128 Όξυνση 1129 Sharpen the image (various methods) 1129 Όξυνση της εικόνας (διάφορες μέθοδοι) 1130 Shift + drag mouse across image \nto indicate blur direction 1130 Shift + σύρετε το ποντίκι πάνω στην εικόνα \nγια να υποδείξετε την κατεύθυνση θολώματος 1131 Shift Colors 1131 Μετατόπιση Χρωμάτων 1132 Shift/convert image colors into other colors 1132 Μετατόπιση/μετατροπή χρωμάτων εικόνας σε άλλα χρώματα 1133 Short List 1133 Σύντομη Λίστα 1134 Show 1134 Εμφάνιση 1135 Show (outline) selected areas 1135 Εμφάνιση (περιγράμματος) επιλεγμένων περιοχών 1136 Show CIM Files 1136 Εμφάνιση Αρχείων CIM 1137 Show Diffs 1137 Εμφάνιση Διαφορών 1138 Show Fotocx installed version and author contact 1138 Εμφάνιση εγκατεστημένης έκδοσης Fotocx και στοιχείων επικοινωνίας συγγραφέα 1139 Show Fotocx updates for recent releases 1139 Εμφάνιση ενημερώσεων Fotocx για πρόσφατες εκδόσεις 1140 Show Hidden 1140 Εμφάνιση Κρυφών 1141 Show Log File 1141 Εμφάνιση Αρχείου Καταγραφής 1142 Show RGB 1142 Εμφάνιση RGB 1143 Show RGB levels at mouse position 1143 Εμφάνιση επιπέδων RGB στη θέση του ποντικιού 1144 Show Resources 1144 Εμφάνιση Πόρων 1145 Show folder hierarchy, click folder for gallery view 1145 Εμφάνιση ιεραρχίας φακέλων, κάντε κλικ σε φάκελο για προβολή γκαλερί 1146 Show image counts in year/month table, select, report 1146 Εμφάνιση αριθμού εικόνων σε πίνακα έτους/μήνα, επιλογή, αναφορά 1147 Show image description (overlap) 1147 Εμφάνιση περιγραφής εικόνας (επικάλυψη) 1148 Show image differences on the image 1148 Εμφάνιση διαφορών εικόνας πάνω στην εικόνα 1149 Show image file name (overlap) 1149 Εμφάνιση ονόματος αρχείου εικόνας (επικάλυψη) 1150 Show image title (overlap) 1150 Εμφάνιση τίτλου εικόνας (επικάλυψη) 1151 Show input files used in combine function 1151 Εμφάνιση αρχείων εισόδου που χρησιμοποιούνται στη λειτουργία συνδυασμού 1152 Show key metadata for current image or clicked thumbnail 1152 Εμφάνιση βασικών metadata για την τρέχουσα εικόνα ή το thumbnail που πατήθηκε 1153 Show map position of the current image file 1153 Εμφάνιση θέσης στο χάρτη του τρέχοντος αρχείου εικόνας 1154 Show memory and CPU resources used 1154 Εμφάνιση χρησιμοποιούμενων πόρων μνήμης και CPU 1155 Show on Map 1155 Εμφάνιση στο Χάρτη 1156 Show or make Keyboard Shortcuts 1156 Εμφάνιση ή δημιουργία Συντομεύσεων Πληκτρολογίου 1157 Show the current (last used) album 1157 Εμφάνιση του τρέχοντος (τελευταία χρησιμοποιημένου) άλμπουμ 1158 Show the current log file 1158 Εμφάνιση του τρέχοντος αρχείου καταγραφής 1159 Size 1159 Μέγεθος 1160 Sketch1 1160 Σκίτσο1 1161 Sketch2 1161 Σκίτσο2 1162 Slide Show 1162 Προβολή Διαφανειών 1163 Smart Erase 1163 Έξυπνη Διαγραφή 1164 Soft Focus 1164 Ήπια Εστίαση 1165 Sphere 1165 Σφαίρα 1166 Spherical Projection 1166 Σφαιρική Προβολή 1167 Split-Screen 1167 Διχασμένη Οθόνη 1168 Stack/Layers 1168 Στοίβαξη/Επίπεδα 1169 Stack/Noise 1169 Στοίβαξη/Θόρυβος 1170 Stack/Paint 1170 Στοίβαξη/Ζωγραφική 1171 Stacking Order 1171 Σειρά Στοίβαξης 1172 Start 1172 Έναρξη 1173 Start a slide show 1173 Έναρξη προβολής διαφανειών 1174 Start of gallery 1174 Αρχή γκαλερί 1175 Startup View 1175 Προβολή Εκκίνησης 1176 Stop 1176 Διακοπή 1177 Stretch 1177 Τέντωμα 1178 Stretch: 1178 Τέντωμα: 1179 Suppress JPEG compression artifacts 1179 Καταστολή αρτιφάκτ συμπίεσης JPEG 1180 Suppress Ringing 1180 Καταστολή Κυματισμού 1181 Suppress fine details while retaining sharpness 1181 Καταστολή λεπτών λεπτομερειών διατηρώντας την οξύτητα 1182 Suppress noise from low-light photos 1182 Καταστολή θορύβου από φωτογραφίες χαμηλού φωτισμού 1183 Survey all files 1183 Επισκόπηση όλων των αρχείων 1184 TEXTURE 1184 ΥΦΗ 1185 THUMB VIEW 1185 ΠΡΟΒΟΛΗ THUMBNAIL 1186 TILES1 1186 ΠΛΑΚΙΔΙΑ1 1187 TILES2 1187 ΠΛΑΚΙΔΙΑ2 1188 TIMELINE 1188 ΧΡΟΝΟΓΡΑΜΜΗ 1189 TINY PLANET 1189 ΜΙΚΡΟΣ ΠΛΑΝΗΤΗΣ 1190 TOOLS MENU 1190 ΜΕΝΟΥ ΕΡΓΑΛΕΙΩΝ 1191 TRANSLATIONS 1191 ΜΕΤΑΦΡΑΣΕΙΣ 1192 TWIST 1192 ΣΤΡΙΨΙΜΟ 1193 Temperature 1193 Θερμοκρασία 1194 Text 1194 Κείμενο 1195 Text File: 1195 Αρχείο Κειμένου: 1196 Texture 1196 Υφή 1197 Threshold 1197 Κατώφλι 1198 Threshold: Low 1198 Κατώφλι: Χαμηλό 1199 Thumbnail View 1199 Προβολή Thumbnail 1200 Thumbnail size 1200 Μέγεθος thumbnail 1201 Thumbnails folder 1201 Φάκελος thumbnails 1202 Thumbnails folder: %s \nPlease remove. 1202 Φάκελος thumbnails: %s \nΠαρακαλώ αφαιρέστε τον. 1203 Thumbnails folder: \n %s \nmust be named .../thumbnails 1203 Ο φάκελος thumbnails: \n %s \nπρέπει να ονομάζεται .../thumbnails 1204 Thumbnails: 1204 Thumbnails: 1205 Tile 1205 Πλακίδιο 1206 Tile blending 1206 Ανάμειξη πλακιδίων 1207 Tile image with a repeating pattern 1207 Δημιουργία εικόνας με πλακίδια σε επαναλαμβανόμενο μοτίβο 1208 Tiles 1208 Πλακίδια 1209 Tiles1 1209 Πλακίδια1 1210 Tiles2 1210 Πλακίδια2 1211 Timeline 1211 Χρονογραμμή 1212 Tiny Planet 1212 Μικρός Πλανήτης 1213 Title: %s\n 1213 Τίτλος: %s\n 1214 To Location 1214 Σε Τοποθεσία 1215 Toggle Captions 1215 Εναλλαγή Λεζαντών 1216 Toggle Grid 1216 Εναλλαγή Πλέγματος 1217 Toggle grid lines on and off 1217 Ενεργοποίηση/απενεργοποίηση γραμμών πλέγματος 1218 Toggle image metadata display ON/OFF 1218 Ενεργοποίηση/Απενεργοποίηση εμφάνισης metadata εικόνας 1219 Too little overlap, cannot align 1219 Πολύ μικρή επικάλυψη, δεν είναι δυνατή η ευθυγράμμιση 1220 Too many edits, please save image 1220 Πάρα πολλές επεξεργασίες, παρακαλώ αποθηκεύστε την εικόνα 1221 Tools 1221 Εργαλεία 1222 Tools: image index, settings, shortcuts, grid, find duplicates 1222 Εργαλεία: ευρετήριο εικόνων, ρυθμίσεις, συντομεύσεις, πλέγμα, εύρεση διπλότυπων 1223 Top 1223 Πάνω 1224 Total Colors 1224 Συνολικά Χρώματα 1225 Trace 1225 Ιχνηλάτηση 1226 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1226 Ιχνηλατήστε την άνω και κάτω καμπύλη με \nκλικ ποντικιού, στη συνέχεια [εξομάλυνση]. 1227 Transient Objects 1227 Παροδικά Αντικείμενα 1228 Transition Preferences 1228 Προτιμήσεις Μετάβασης 1229 Transition to next image 1229 Μετάβαση στην επόμενη εικόνα 1230 Transitions File 1230 Αρχείο Μεταβάσεων 1231 Transp. 1231 Διαφ. 1232 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1232 Ο χάρτης διαφάνειας θα χαθεί \n(αποθηκεύστε ως TIFF|PNG|JXL για διατήρηση) \nΑποθήκευση ούτως ή άλλως; 1233 Trash 1233 Απόρριψη 1234 Trash read-only file? 1234 Απόρριψη αρχείου μόνο για ανάγνωση; 1235 Turn an image inside-out 1235 Αναστροφή εικόνας από μέσα προς τα έξω 1236 Twist 1236 Στρίψιμο 1237 Twist image centered at mouse position 1237 Στρίψιμο εικόνας με κέντρο τη θέση του ποντικιού 1238 UNBEND 1238 ΙΣΙΩΜΑ 1239 UNDO/REDO BUTTON 1239 ΚΟΥΜΠΙ ΑΝΑΙΡΕΣΗΣ/ΕΠΑΝΑΛΗΨΗΣ 1240 UNWARP CLOSEUP 1240 ΑΠΟ-ΠΑΡΑΜΟΡΦΩΣΗ ΚΟΝΤΙΝΟΥ ΠΛΑΝΟΥ 1241 UPDATE ALBUMS 1241 ΕΝΗΜΕΡΩΣΗ ΑΛΜΠΟΥΜ 1242 UPRIGHT 1242 ΙΣΙΩΜΑ ΚΑΤΑΚΟΡΥΦΗΣ 1243 USER GUIDE 1243 ΟΔΗΓΟΣ ΧΡΗΣΗΣ 1244 Unable to copy metadata 1244 Δεν είναι δυνατή η αντιγραφή metadata 1245 Unbend 1245 Ίσιωμα 1246 Undo 1246 Αναίρεση 1247 Undo All 1247 Αναίρεση Όλων 1248 Undo Last 1248 Αναίρεση Τελευταίας 1249 Undo/Redo 1249 Αναίρεση/Επανάληψη 1250 Uninstall 1250 Απεγκατάσταση 1251 Unwarp Closeup 1251 Απο-παραμόρφωση Κοντινού Πλάνου 1252 Update Albums 1252 Ενημέρωση Άλμπουμ 1253 Update albums for new file versions 1253 Ενημέρωση άλμπουμ για νέες εκδόσεις αρχείων 1254 Upright 1254 Ίσιωμα 1255 Upright Image 1255 Ίσιωμα Εικόνας 1256 Upright or mirror-flip an image 1256 Ίσιωμα ή κατοπτρική αναστροφή μιας εικόνας 1257 Upright rotated image files, selected set or ALL 1257 Ίσιωμα περιστραμμένων αρχείων εικόνας, επιλεγμένο σύνολο ή ΟΛΑ 1258 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1258 Χρησιμοποιήστε την Επιλογή Περιοχής για να επιλέξετε ένα πρόσωπο. \nΚάντε κλικ στο κέντρο της παραμόρφωσης. \nΜετακινήστε τον ολισθητή. \n 1259 Use [Select] to add files to an empty album 1259 Χρησιμοποιήστε [Επιλογή] για να προσθέσετε αρχεία σε ένα κενό άλμπουμ 1260 Use metadata photo date or file modification date? 1260 Χρήση της ημερομηνίας φωτογραφίας από τα metadata ή της ημερομηνίας τροποποίησης αρχείου; 1261 Use metadata tag 1261 Χρήση tag metadata 1262 Use settings file 1262 Χρήση αρχείου ρυθμίσεων 1263 User Guide 1263 Οδηγός Χρήσης 1264 User preferences and settings 1264 Προτιμήσεις και ρυθμίσεις χρήστη 1265 VIDEO press P to play 1265 ΒΙΝΤΕΟ πατήστε P για αναπαραγωγή 1266 VIEW 360° PANO 1266 ΠΡΟΒΟΛΗ ΠΑΝΟΡΑΜΑΤΟΣ 360° 1267 VIEW ALL META 1267 ΠΡΟΒΟΛΗ ΟΛΩΝ ΤΩΝ META 1268 VIEW MAIN META 1268 ΠΡΟΒΟΛΗ ΚΥΡΙΩΝ META 1269 VIGNETTE 1269 ΣΚΟΤΕΙΝΙΑΣΜΑ ΑΚΡΩΝ 1270 Var. Transparency 1270 Μεταβλ. Διαφάνεια 1271 Vert 1271 Κάθ. 1272 Video Files 1272 Αρχεία Βίντεο 1273 Video Tutorial 1273 Βίντεο Εκμάθησης 1274 Video command 1274 Εντολή Βίντεο 1275 View 360 degree panorama image 1275 Προβολή πανοραμικής εικόνας 360 μοιρών 1276 View 360° Pano 1276 Προβολή Πανοράματος 360° 1277 View All Meta 1277 Προβολή Όλων των Meta 1278 View All Metadata 1278 Προβολή Όλων των Metadata 1279 View Main Meta 1279 Προβολή Κύριων Meta 1280 View Main Metadata 1280 Προβολή Κύριων Metadata 1281 View before/after images using split-screen 1281 Προβολή εικόνων πριν/μετά με διχασμένη οθόνη 1282 View/edit metadata, image report and search functions 1282 Προβολή/επεξεργασία metadata, αναφορά εικόνας και λειτουργίες αναζήτησης 1283 Vignette 1283 Σκοτείνιασμα Άκρων 1284 W/H Ratio: 1284 Αναλογία Π/Υ: 1285 WARP AFFINE 1285 ΣΥΓΓΡΑΜΙΚΗ ΠΑΡΑΜΟΡΦΩΣΗ 1286 WARP AREA 1286 ΠΑΡΑΜΟΡΦΩΣΗ ΠΕΡΙΟΧΗΣ 1287 WARP CURVED 1287 ΚΑΜΠΥΛΗ ΠΑΡΑΜΟΡΦΩΣΗ 1288 WARP IMAGE 1288 ΠΑΡΑΜΟΡΦΩΣΗ ΕΙΚΟΝΑΣ 1289 WARP MENU 1289 ΜΕΝΟΥ ΠΑΡΑΜΟΡΦΩΣΗΣ 1290 WARP RADIAL 1290 ΑΚΤΙΝΙΚΗ ΠΑΡΑΜΟΡΦΩΣΗ 1291 WINDOW VIEWS AND MENUS 1291 ΠΡΟΒΟΛΕΣ ΚΑΙ ΜΕΝΟΥ ΠΑΡΑΘΥΡΟΥ 1292 WORLD MAP 1292 ΠΑΓΚΟΣΜΙΟΣ ΧΑΡΤΗΣ 1293 Wait after zoom 1293 Αναμονή μετά το zoom 1294 Wait before filename/title/description 1294 Αναμονή πριν το όνομα αρχείου/τίτλο/περιγραφή 1295 Wait before zoom 1295 Αναμονή πριν το zoom 1296 Warp 1296 Παραμόρφωση 1297 Warp Affine 1297 Συγγραμική Παραμόρφωση 1298 Warp Area 1298 Παραμόρφωση Περιοχής 1299 Warp Curved 1299 Καμπύλη Παραμόρφωση 1300 Warp Image 1300 Παραμόρφωση Εικόνας 1301 Warp Linear1 1301 Γραμμική Παραμόρφωση1 1302 Warp Linear2 1302 Γραμμική Παραμόρφωση2 1303 Warp Radial 1303 Ακτινική Παραμόρφωση 1304 Warp an image with a wave pattern 1304 Παραμόρφωση εικόνας με κυματοειδές μοτίβο 1305 Warp image (affine) using the mouse 1305 Παραμόρφωση εικόνας (συγγραμική) με το ποντίκι 1306 Warp image (curved) using the mouse 1306 Παραμόρφωση εικόνας (καμπύλη) με το ποντίκι 1307 Warp image (linear 1) using the mouse 1307 Παραμόρφωση εικόνας (γραμμική 1) με το ποντίκι 1308 Warp image (linear 2) using the mouse 1308 Παραμόρφωση εικόνας (γραμμική 2) με το ποντίκι 1309 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1309 Παραμόρφωση: ίσιωμα, διόρθωση προοπτικής, παραμόρφωση, από-παραμόρφωση κοντινού πλάνου, εξομάλυνση, μετασχηματισμοί εικόνας 1310 White 1310 Λευκό 1311 Widen: 1311 Διεύρυνση: 1312 Width 1312 Πλάτος 1313 Width % 1313 Πλάτος % 1314 X-size 1314 Μέγεθος X 1315 Yes 1315 Ναι 1316 ZOOM 1316 ZOOM 1317 Zoom 1317 Zoom 1318 Zoom Center 1318 Κέντρο Zoom 1319 Zoom Speed 1319 Ταχύτητα Zoom 1320 Zoom-in 1320 Zoom-in 1321 Zoom-out 1321 Zoom-out 1322 \n %d-bits/color 1322 \n %d-bit/χρώμα 1323 \n *** CANCELED \n 1323 \n *** ΑΚΥΡΩΘΗΚΕ \n 1324 \n *** COMPLETED \n 1324 \n *** ΟΛΟΚΛΗΡΩΘΗΚΕ \n 1325 \n *** Delete Originals *** 1325 \n *** Διαγραφή Πρωτοτύπων *** 1326 \n *** Keep Originals *** 1326 \n *** Διατήρηση Πρωτοτύπων *** 1327 \n *** Replace Originals *** 1327 \n *** Αντικατάσταση Πρωτοτύπων *** 1328 \n Convert to %s 1328 \n Μετατροπή σε %s 1329 \n Copy Metadata 1329 \n Αντιγραφή Metadata 1330 \n Downsize within %dx%d 1330 \n Σμίκρυνση εντός %dx%d 1331 \n New Location: %s 1331 \n Νέα Τοποθεσία: %s 1332 \n Output to %s 1332 \n Έξοδος σε %s 1333 \n PROCEED? 1333 \n ΣΥΝΕΧΕΙΑ; 1334 \n Rename to %s 1334 \n Μετονομασία σε %s 1335 \n Replace text: %s --> %s 1335 \n Αντικατάσταση κειμένου: %s --> %s 1336 \n Rescale to %sx 1336 \n Αλλαγή κλίμακας σε %sx 1337 \n Update Albums 1337 \n Ενημέρωση Άλμπουμ 1338 \n Upsize within %dx%d 1338 \n Μεγέθυνση εντός %dx%d 1339 \n*** CANCELED \n 1339 \n*** ΑΚΥΡΩΘΗΚΕ \n 1340 \n*** COMPLETED \n 1340 \n*** ΟΛΟΚΛΗΡΩΘΗΚΕ \n 1341 \n\nPROCEED? 1341 \n\nΣΥΝΕΧΕΙΑ; 1342 add 1342 προσθήκη 1343 add after old 1343 προσθήκη μετά το παλιό 1344 add all gallery files to list 1344 προσθήκη όλων των αρχείων γκαλερί στη λίστα 1345 add current file to list 1345 προσθήκη τρέχοντος αρχείου στη λίστα 1346 add entered text to layout 1346 προσθήκη εισαγμένου κειμένου στη διάταξη 1347 add images to layout 1347 προσθήκη εικόνων στη διάταξη 1348 add line/arrow to layout 1348 προσθήκη γραμμής/βέλους στη διάταξη 1349 add new keyword 1349 προσθήκη νέου keyword 1350 add or edit images 1350 προσθήκη ή επεξεργασία εικόνων 1351 add or edit lines/arrows 1351 προσθήκη ή επεξεργασία γραμμών/βελών 1352 add or edit text 1352 προσθήκη ή επεξεργασία κειμένου 1353 add to set 1353 προσθήκη στο σύνολο 1354 adder 1354 adder 1355 adjust brightness of selected image 1355 προσαρμογή φωτεινότητας επιλεγμένης εικόνας 1356 after removal of missing files: %d \n 1356 μετά την αφαίρεση αρχείων που λείπουν: %d \n 1357 album %s: deleted 1357 άλμπουμ %s: διαγράφηκε 1358 album already exists: %s 1358 το άλμπουμ υπάρχει ήδη: %s 1359 album mass update 1359 μαζική ενημέρωση άλμπουμ 1360 albums folder missing 1360 λείπει ο φάκελος άλμπουμ 1361 align and trim color chart 1361 ευθυγράμμιση και περικοπή χρωματικού πίνακα 1362 all files 1362 όλα τα αρχεία 1363 all image files, including unmounted folders: %d \n 1363 όλα τα αρχεία εικόνας, συμπεριλαμβανομένων μη προσαρτημένων φακέλων: %d \n 1364 all images 1364 όλες οι εικόνες 1365 all versions 1365 όλες οι εκδόσεις 1366 amplify contrast 1366 ενίσχυση αντίθεσης 1367 amplitude 1367 πλάτος κύματος 1368 angle 1368 γωνία 1369 apply 1369 εφαρμογή 1370 area edge creep 1370 ερπυσμός άκρης περιοχής 1371 area is not finished 1371 η περιοχή δεν έχει ολοκληρωθεί 1372 area outline color: 1372 χρώμα περιγράμματος περιοχής: 1373 array width is too large: %d x %d 1373 το πλάτος του πίνακα είναι πολύ μεγάλο: %d x %d 1374 ascending 1374 αύξουσα 1375 auto color 1375 αυτόματο χρώμα 1376 background colors for file and gallery view windows 1376 χρώματα φόντου για παράθυρα προβολής αρχείου και γκαλερί 1377 backing 1377 υπόστρωμα 1378 bad category name 1378 εσφαλμένο όνομα κατηγορίας 1379 bad keyword name 1379 εσφαλμένο όνομα keyword 1380 bad pattern file: %s 1380 εσφαλμένο αρχείο μοτίβου: %s 1381 base 1381 base 1382 base and adder need $s plugin 1382 τα base και adder χρειάζονται το plugin $s 1383 base size 1383 βασικό μέγεθος 1384 begin making a script file 1384 έναρξη δημιουργίας αρχείου σεναρίου 1385 black/white 1385 ασπρόμαυρο 1386 black/white negative 1386 ασπρόμαυρο αρνητικό 1387 black/white positive 1387 ασπρόμαυρο θετικό 1388 blend 1388 ανάμειξη 1389 blend edges: blend width: 1389 ανάμειξη άκρων: πλάτος ανάμειξης: 1390 blend image overlaps over pixel width 1390 ανάμειξη επικαλύψεων εικόνας σε πλάτος pixel 1391 blend rate: center: 1391 ρυθμός ανάμειξης: κέντρο: 1392 blocking function: %s 1392 λειτουργία αποκλεισμού: %s 1393 blocksize 1393 μέγεθος μπλοκ 1394 blur edges: blur width: 1394 θόλωμα άκρων: πλάτος θολώματος: 1395 blur radius 1395 ακτίνα θολώματος 1396 borders 1396 περιθώρια 1397 both 'All Files' and specific files were selected 1397 επιλέχθηκαν και το 'Όλα τα Αρχεία' και συγκεκριμένα αρχεία 1398 bright halo 1398 φωτεινό φωτοστέφανο 1399 brightness rescale 1399 αλλαγή κλίμακας φωτεινότητας 1400 browse 1400 περιήγηση 1401 brush size 1401 μέγεθος πινέλου 1402 build index, old files only 1402 δημιουργία ευρετηρίου, μόνο παλιά αρχεία 1403 cancel project 1403 ακύρωση έργου 1404 cancel project? 1404 ακύρωση έργου; 1405 cannot allocate %d MB memory 1405 δεν είναι δυνατή η δέσμευση %d MB μνήμης 1406 cannot be determined 1406 δεν είναι δυνατός ο προσδιορισμός 1407 cannot copy a file to itself 1407 δεν είναι δυνατή η αντιγραφή ενός αρχείου στον εαυτό του 1408 cannot copy current file 1408 δεν είναι δυνατή η αντιγραφή του τρέχοντος αρχείου 1409 cannot create output file 1409 δεν είναι δυνατή η δημιουργία αρχείου εξόδου 1410 cannot create pixbuf 1410 δεν είναι δυνατή η δημιουργία pixbuf 1411 cannot find area outline 1411 δεν είναι δυνατή η εύρεση περιγράμματος περιοχής 1412 cannot find output file 1412 δεν είναι δυνατή η εύρεση αρχείου εξόδου 1413 cannot load input file 1413 δεν είναι δυνατή η φόρτωση αρχείου εισόδου 1414 cannot open file %s 1414 δεν είναι δυνατό το άνοιγμα του αρχείου %s 1415 cannot parse current file 1415 δεν είναι δυνατή η ανάλυση του τρέχοντος αρχείου 1416 cannot parse file 1416 δεν είναι δυνατή η ανάλυση του αρχείου 1417 cannot read pluging output file 1417 δεν είναι δυνατή η ανάγνωση του αρχείου εξόδου του plugin 1418 cannot replace %s file 1418 δεν είναι δυνατή η αντικατάσταση του αρχείου %s 1419 cannot save as RAW type 1419 δεν είναι δυνατή η αποθήκευση ως τύπος RAW 1420 cannot save layout file: %s 1420 δεν είναι δυνατή η αποθήκευση αρχείου διάταξης: %s 1421 cannot write image folders file: %s 1421 δεν είναι δυνατή η εγγραφή αρχείου φακέλων εικόνας: %s 1422 category %s has too many keywords 1422 η κατηγορία %s έχει πάρα πολλά keywords 1423 category %s is too big 1423 η κατηγορία %s είναι πολύ μεγάλη 1424 center 1424 κέντρο 1425 change project scale 1425 αλλαγή κλίμακας έργου 1426 choose 1-8 clicks or [+] keys for 2x image zoom 1426 επιλέξτε 1-8 κλικ ή πλήκτρα [+] για 2x zoom εικόνας 1427 choose a better spot 1427 επιλέξτε καλύτερο σημείο 1428 choose an image file 1428 επιλέξτε ένα αρχείο εικόνας 1429 choose file 1429 επιλέξτε αρχείο 1430 choose files 1430 επιλέξτε αρχεία 1431 choose folder 1431 επιλέξτε φάκελο 1432 choose folders 1432 επιλέξτε φακέλους 1433 choose location 1433 επιλέξτε τοποθεσία 1434 circle 1434 κύκλος 1435 clear area selections 1435 εκκαθάριση επιλογών περιοχής 1436 clear entered text 1436 εκκαθάριση εισαγμένου κειμένου 1437 clear inputs 1437 εκκαθάριση εισόδων 1438 clear text 1438 εκκαθάριση κειμένου 1439 click a defined keyword (below) to add a search keyword 1439 κάντε κλικ σε ένα ορισμένο keyword (παρακάτω) για να προσθέσετε ένα keyword αναζήτησης 1440 click bright point 1440 κάντε κλικ σε φωτεινό σημείο 1441 click dark point 1441 κάντε κλικ σε σκοτεινό σημείο 1442 click on desired color 1442 κάντε κλικ στο επιθυμητό χρώμα 1443 click on image to get source color 1443 κάντε κλικ στην εικόνα για λήψη χρώματος πηγής 1444 click on image to set matching color 1444 κάντε κλικ στην εικόνα για ορισμό χρώματος ταιριάσματος 1445 click on thumbnail to set zoom center 1445 κάντε κλικ στο thumbnail για ορισμό κέντρου zoom 1446 click position to add line 1446 κάντε κλικ σε θέση για προσθήκη γραμμής 1447 click position to add text 1447 κάντε κλικ σε θέση για προσθήκη κειμένου 1448 click to select 1448 κάντε κλικ για επιλογή 1449 click to unselect 1449 κάντε κλικ για αποεπιλογή 1450 clicks per 2x image increase 1450 κλικ ανά 2x αύξηση εικόνας 1451 color 1451 χρώμα 1452 color depth 1452 βάθος χρώματος 1453 color depth: 1453 βάθος χρώματος: 1454 color match level % 1454 επίπεδο ταιριάσματος χρώματος % 1455 color negative 1455 αρνητικό χρώμα 1456 column difference: %d pixels 1456 διαφορά στήλης: %d pixel 1457 column difference: %d pixels \nMake columns even? 1457 διαφορά στήλης: %d pixel \nΝα γίνουν οι στήλες ζυγές; 1458 combined image files 1458 συνδυασμένα αρχεία εικόνας 1459 command: 1459 εντολή: 1460 commit all changes, close dialog 1460 υποβολή όλων των αλλαγών, κλείσιμο παραθύρου διαλόγου 1461 complete file selection first 1461 ολοκληρώστε πρώτα την επιλογή αρχείου 1462 completed 1462 ολοκληρώθηκε 1463 condense into color blobs 1463 συμπύκνωση σε χρωματικές κηλίδες 1464 condition 1464 συνθήκη 1465 confirm Fotocx exit 1465 επιβεβαίωση εξόδου από το Fotocx 1466 constant blur 1466 σταθερό θόλωμα 1467 continue? 1467 συνέχεια; 1468 converting colors... 1468 μετατροπή χρωμάτων... 1469 converting files 1469 μετατροπή αρχείων 1470 copy (duplicate file) 1470 αντιγραφή (διπλότυπο αρχείο) 1471 copy and paste commands 1471 εντολές αντιγραφής και επικόλλησης 1472 copy files to %s 1472 αντιγραφή αρχείων σε %s 1473 copy metadata from Nth file: 1473 αντιγραφή metadata από το N-οστό αρχείο: 1474 copy to Desktop failed: %s 1474 η αντιγραφή στην Επιφάνεια Εργασίας απέτυχε: %s 1475 count: 0 1475 αριθμός: 0 1476 create folder 1476 δημιουργία φακέλου 1477 create folder %s 1477 δημιουργία φακέλου %s 1478 current gallery 1478 τρέχουσα γκαλερί 1479 current image files found: %d \n 1479 βρέθηκαν τρέχοντα αρχεία εικόνας: %d \n 1480 current set only 1480 μόνο τρέχον σύνολο 1481 current set: 1481 τρέχον σύνολο: 1482 curve file is invalid 1482 το αρχείο καμπύλης δεν είναι έγκυρο 1483 custom command to play video files 1483 προσαρμοσμένη εντολή για αναπαραγωγή αρχείων βίντεο 1484 dark 1484 σκοτεινό 1485 dark halo 1485 σκοτεινό φωτοστέφανο 1486 dark pixels 1486 σκοτεινά pixel 1487 data is incomplete, proceed? 1487 τα δεδομένα είναι ελλιπή, συνέχεια; 1488 date format is yyyy:mm:dd [hh:mm:ss] 1488 η μορφή ημερομηνίας είναι yyyy:mm:dd [hh:mm:ss] 1489 date range 1489 εύρος ημερομηνιών 1490 days 1490 ημέρες 1491 delete 1491 διαγραφή 1492 delete %s \n%s 1492 διαγραφή %s \n%s 1493 delete Mashup project files? 1493 διαγραφή αρχείων έργου Mashup; 1494 delete failed: \n%s 1494 η διαγραφή απέτυχε: \n%s 1495 delete originals specified but no new name given 1495 ζητήθηκε διαγραφή πρωτοτύπων αλλά δεν δόθηκε νέο όνομα 1496 delete selected text from layout 1496 διαγραφή επιλεγμένου κειμένου από τη διάταξη 1497 deleting orphan thumbnails ... \n 1497 διαγραφή ορφανών thumbnails ... \n 1498 depth 1498 βάθος 1499 descending 1499 φθίνουσα 1500 direction of light and shadows 1500 κατεύθυνση φωτός και σκιών 1501 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1501 απενεργοποιήστε την επιλογή thumbnail για να ενεργοποιήσετε αναδυόμενα μενού κ.λπ. \nχρησιμοποιήστε [Ενεργοποίηση] για να συνεχίσετε την επιλογή thumbnail 1502 discard changes? 1502 απόρριψη αλλαγών; 1503 do not warp images during auto-alignment 1503 να μην παραμορφώνονται οι εικόνες κατά την αυτόματη ευθυγράμμιση 1504 do nothing 1504 να μη γίνει τίποτα 1505 dot size 1505 μέγεθος κουκκίδας 1506 downsize 1506 σμίκρυνση 1507 drag image 1507 σύρετε την εικόνα 1508 drag mouse along an edge to follow the edge 1508 σύρετε το ποντίκι κατά μήκος μιας άκρης για να ακολουθήσετε την άκρη 1509 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1509 σύρετε το ποντίκι κάτω/δεξιά για να σχεδιάσετε οβάλ \nshift + σύρσιμο κέντρου για μετακίνηση του οβάλ \nshift + σύρσιμο κάτω δεξιάς άκρης για αλλαγή 1510 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1510 σύρετε το ποντίκι για να σχεδιάσετε πλαίσιο \nshift + σύρσιμο κέντρου για μετακίνηση του πλαισίου \nshift + σύρσιμο άκρης για μετακίνηση της άκρης 1511 drag mouse to outline an area 1511 σύρετε το ποντίκι για να περιγράψετε μια περιοχή 1512 drag mouse to select circular or elliptical area 1512 σύρετε το ποντίκι για να επιλέξετε κυκλική ή ελλειπτική περιοχή 1513 drag mouse to select rectangular area 1513 σύρετε το ποντίκι για να επιλέξετε ορθογώνια περιοχή 1514 drag mouse to show selected image 1514 σύρετε το ποντίκι για να εμφανίσετε την επιλεγμένη εικόνα 1515 duplicate keyword 1515 διπλότυπο keyword 1516 edge distance calculation 1516 υπολογισμός απόστασης άκρης 1517 edge: 1517 άκρη: 1518 edit 1518 επεξεργασία 1519 edit commands 1519 επεξεργασία εντολών 1520 edit custom shell commands, match colors to embedded jpeg image 1520 επεξεργασία προσαρμοσμένων εντολών κελύφους, ταίριασμα χρωμάτων με ενσωματωμένη εικόνα jpeg 1521 edit this menu 1521 επεξεργασία αυτού του μενού 1522 ellipse 1522 έλλειψη 1523 embedded numbers will sort by value 1523 οι ενσωματωμένοι αριθμοί θα ταξινομηθούν κατά τιμή 1524 emboss 1524 ανάγλυφο 1525 enter 2-character language code: en, de, fr ... 1525 εισάγετε κωδικό γλώσσας 2 χαρακτήρων: en, de, fr ... 1526 enter a project name 1526 εισάγετε ένα όνομα έργου 1527 enter an album name 1527 εισάγετε ένα όνομα άλμπουμ 1528 enter cities/locations, countries 1528 εισάγετε πόλεις/τοποθεσίες, χώρες 1529 enter project name 1529 εισάγετε όνομα έργου 1530 enter tag name 1530 εισάγετε όνομα tag 1531 enter tag names 1531 εισάγετε ονόματα tag 1532 erase 1532 διαγραφή 1533 error compensation 1533 αντιστάθμιση σφάλματος 1534 exceed %d edits 1534 υπέρβαση %d επεξεργασιών 1535 exceed %d images 1535 υπέρβαση %d εικόνων 1536 exceed %d max files, cannot continue 1536 υπέρβαση %d μέγιστων αρχείων, δεν είναι δυνατή η συνέχεια 1537 exceed %d rows 1537 υπέρβαση %d γραμμών 1538 exceed %d selected files 1538 υπέρβαση %d επιλεγμένων αρχείων 1539 exceed %d shortcuts 1539 υπέρβαση %d συντομεύσεων 1540 exceeded %d line entries 1540 υπέρβαση %d καταχωρίσεων γραμμής 1541 exceeded %d text entries 1541 υπέρβαση %d καταχωρίσεων κειμένου 1542 exceeded max. images: %d 1542 υπέρβαση μέγ. εικόνων: %d 1543 exceeded max. tiles: %d 1543 υπέρβαση μέγ. πλακιδίων: %d 1544 exit split-screen 1544 έξοδος από διχασμένη οθόνη 1545 expand to these limits if smaller 1545 επέκταση σε αυτά τα όρια αν είναι μικρότερο 1546 exporting files 1546 εξαγωγή αρχείων 1547 extra indexed metadata tags > %d 1547 επιπλέον ευρετηριασμένα tags metadata > %d 1548 extra metadata tags to include in index 1548 επιπλέον tags metadata προς συμπερίληψη στο ευρετήριο 1549 extra metadata tags: \n 1549 επιπλέον tags metadata: \n 1550 fetch 1550 ανάκτηση 1551 file 1551 αρχείο 1552 file .ext names to recognize RAW files 1552 επεκτάσεις αρχείων .ext για αναγνώριση αρχείων RAW 1553 file .ext names to recognize video files 1553 επεκτάσεις αρχείων .ext για αναγνώριση αρχείων βίντεο 1554 file close error 1554 σφάλμα κλεισίματος αρχείου 1555 file color 1555 χρώμα αρχείου 1556 file error: %s 1556 σφάλμα αρχείου: %s 1557 file format error 1557 σφάλμα μορφής αρχείου 1558 file format error: %s 1558 σφάλμα μορφής αρχείου: %s 1559 file included: %s \n 1559 αρχείο συμπεριλήφθηκε: %s \n 1560 file metadata update failed 1560 η ενημέρωση metadata αρχείου απέτυχε 1561 file name 1561 όνομα αρχείου 1562 file names 1562 ονόματα αρχείων 1563 file not found 1563 το αρχείο δεν βρέθηκε 1564 file not found \n 1564 το αρχείο δεν βρέθηκε \n 1565 file not found: %s 1565 το αρχείο δεν βρέθηκε: %s 1566 file not found: %s %s 1566 το αρχείο δεν βρέθηκε: %s %s 1567 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1567 τύποι αρχείων: .jp2 .heic .avif .webp \nθα γίνουν: .jpg - ΣΥΝΕΧΕΙΑ; 1568 file: %s \nexceed 99 versions 1568 αρχείο: %s \nυπέρβαση 99 εκδόσεων 1569 filename text 1569 κείμενο ονόματος αρχείου 1570 files in %s can be deleted 1570 τα αρχεία στο %s μπορούν να διαγραφούν 1571 fill from current gallery 1571 γέμισμα από την τρέχουσα γκαλερί 1572 fill from selected files 1572 γέμισμα από τα επιλεγμένα αρχεία 1573 fill selected areas 1573 γέμισμα επιλεγμένων περιοχών 1574 fill transparent areas 1574 γέμισμα διαφανών περιοχών 1575 find all image files ...\n 1575 εύρεση όλων των αρχείων εικόνας ...\n 1576 find and report all unreadable image files 1576 εύρεση και αναφορά όλων των μη αναγνώσιμων αρχείων εικόνας 1577 find outline gap 1577 εύρεση κενού περιγράμματος 1578 find via table lookup 1578 εύρεση μέσω αναζήτησης πίνακα 1579 find_imagefiles() failure \n 1579 αποτυχία find_imagefiles() \n 1580 find_imagefiles() failure: %s \n 1580 αποτυχία find_imagefiles(): %s \n 1581 finish current edit first 1581 ολοκληρώστε πρώτα την τρέχουσα επεξεργασία 1582 finish making a script file 1582 ολοκλήρωση δημιουργίας αρχείου σεναρίου 1583 finish or cancel pending edit 1583 ολοκληρώστε ή ακυρώστε την εκκρεμή επεξεργασία 1584 fix box in layout and start new box 1584 σταθεροποιήστε το πλαίσιο στη διάταξη και ξεκινήστε νέο πλαίσιο 1585 fix line in layout and start new line 1585 σταθεροποιήστε τη γραμμή στη διάταξη και ξεκινήστε νέα γραμμή 1586 fix motion blur 1586 διόρθωση θολώματος κίνησης 1587 fix oval in layout and start new oval 1587 σταθεροποιήστε το οβάλ στη διάταξη και ξεκινήστε νέο οβάλ 1588 follow edge 1588 ακολουθήστε την άκρη 1589 font name and size for menus and dilogs 1589 όνομα και μέγεθος γραμματοσειράς για μενού και παράθυρα διαλόγου 1590 force a full re-index of all image files 1590 εξαναγκασμός πλήρους επανευρετηρίασης όλων των αρχείων εικόνας 1591 format: yyyy:mm:dd [hh:mm:ss] 1591 μορφή: yyyy:mm:dd [hh:mm:ss] 1592 fotocx will exit 1592 το Fotocx θα τερματιστεί 1593 found %d pixels 1593 βρέθηκαν %d pixel 1594 free disk space: %d GB \n 1594 ελεύθερος χώρος δίσκου: %d GB \n 1595 freehand draw 1595 ελεύθερο σχέδιο 1596 ftruncate() failure: %s 1596 αποτυχία ftruncate(): %s 1597 full image index: reports will be complete \n 1597 πλήρες ευρετήριο εικόνων: οι αναφορές θα είναι πλήρεις \n 1598 function canceled 1598 η λειτουργία ακυρώθηκε 1599 gallery 1599 γκαλερί 1600 gallery is empty 1600 η γκαλερί είναι κενή 1601 gallery truncated to %d images 1601 η γκαλερί περικόπηκε σε %d εικόνες 1602 get images having text in filename (comma separated) 1602 λήψη εικόνων με κείμενο στο όνομα αρχείου (διαχωρισμένα με κόμμα) 1603 get images with matching keywords (comma separated) 1603 λήψη εικόνων με αντίστοιχα keywords (διαχωρισμένα με κόμμα) 1604 get images within rating range 1604 λήψη εικόνων εντός εύρους βαθμολογίας 1605 gradual paint 1605 σταδιακή ζωγραφική 1606 grid counts not 0-100: %s 1606 οι αριθμοί πλέγματος δεν είναι 0-100: %s 1607 grid picklist file error: %s 1607 σφάλμα αρχείου λίστας επιλογής πλέγματος: %s 1608 grid size 1608 μέγεθος πλέγματος 1609 group 1609 ομάδα 1610 height 1610 ύψος 1611 hide area outlines 1611 απόκρυψη περιγραμμάτων περιοχής 1612 hide transient objects 1612 απόκρυψη παροδικών αντικειμένων 1613 high 1613 υψηλό 1614 home folder was not changed 1614 ο κύριος φάκελος δεν άλλαξε 1615 horizontal 1615 οριζόντιο 1616 hours 1616 ώρες 1617 icons only, text only, or both 1617 μόνο εικονίδια, μόνο κείμενο, ή και τα δύο 1618 if image < window, center or shift left or right 1618 αν η εικόνα < παράθυρο, κεντράρισμα ή μετατόπιση αριστερά ή δεξιά 1619 ignore differences above limit 1619 αγνόηση διαφορών πάνω από το όριο 1620 image blend 1620 ανάμειξη εικόνας 1621 image files 1621 αρχεία εικόνας 1622 image for source color 1622 εικόνα για χρώμα πηγής 1623 image index records found: %d \n 1623 βρέθηκαν εγγραφές ευρετηρίου εικόνων: %d \n 1624 image index required 1624 απαιτείται ευρετήριο εικόνων 1625 image index write error: %s 1625 σφάλμα εγγραφής ευρετηρίου εικόνων: %s 1626 image is too large to edit: %d x %d 1626 η εικόνα είναι πολύ μεγάλη για επεξεργασία: %d x %d 1627 image is too large: %dx%d, %lld megapix 1627 η εικόνα είναι πολύ μεγάλη: %dx%d, %lld megapixel 1628 image is too small to edit: %d x %d 1628 η εικόνα είναι πολύ μικρή για επεξεργασία: %d x %d 1629 image scale 1629 κλίμακα εικόνας 1630 image to set matching color 1630 εικόνα για ορισμό χρώματος ταιριάσματος 1631 image width must be greater than height 1631 το πλάτος της εικόνας πρέπει να είναι μεγαλύτερο από το ύψος 1632 images to report 1632 εικόνες προς αναφορά 1633 include all files 1633 συμπερίληψη όλων των αρχείων 1634 include edited versions 1634 συμπερίληψη επεξεργασμένων εκδόσεων 1635 include last versions only 1635 συμπερίληψη μόνο τελευταίων εκδόσεων 1636 include original files 1636 συμπερίληψη πρωτότυπων αρχείων 1637 include transparent areas 1637 συμπερίληψη διαφανών περιοχών 1638 include: 1638 συμπερίληψη: 1639 increase blur with distance 1639 αύξηση θολώματος με την απόσταση 1640 index completed, %.1f seconds \n 1640 ευρετηρίαση ολοκληρώθηκε, %.1f δευτερόλεπτα \n 1641 index config file error: %s 1641 σφάλμα αρχείου ρυθμίσεων ευρετηρίου: %s 1642 index updates needed: %d thumbnails: %d \n 1642 απαιτούμενες ενημερώσεις ευρετηρίου: %d thumbnails: %d \n 1643 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1643 ενημερώσεις ευρετηρίου: %d ενημερώσεις τίτλου/περιγραφής: %d \nενημερώσεις thumbnail: %d, διαγραφές: %d \n 1644 input 1644 είσοδος 1645 input file: %s \n 1645 αρχείο εισόδου: %s \n 1646 insufficient memory, cannot proceed 1646 ανεπαρκής μνήμη, δεν είναι δυνατή η συνέχεια 1647 insufficient overlap for color matching 1647 ανεπαρκής επικάλυψη για ταίριασμα χρωμάτων 1648 invalid GPS data 1648 μη έγκυρα δεδομένα GPS 1649 invalid GPS data: %s 1649 μη έγκυρα δεδομένα GPS: %s 1650 invalid album 1650 μη έγκυρο άλμπουμ 1651 invalid date range: %s %s 1651 μη έγκυρο εύρος ημερομηνιών: %s %s 1652 invalid date/time format 1652 μη έγκυρη μορφή ημερομηνίας/ώρας 1653 invalid file 1653 μη έγκυρο αρχείο 1654 invalid plugin: %s 1654 μη έγκυρο plugin: %s 1655 invalid rating range 1655 μη έγκυρο εύρος βαθμολογίας 1656 invalid source file: %s 1656 μη έγκυρο αρχείο πηγής: %s 1657 invert area 1657 αντιστροφή περιοχής 1658 jpeg quality level - 70+ for good image quality 1658 επίπεδο ποιότητας jpeg - 70+ για καλή ποιότητα εικόνας 1659 keyboard 1659 πληκτρολόγιο 1660 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1660 χειριστήρια πληκτρολογίου: \nEsc: έξοδος από την προβολή διαφανειών \nπλήκτρα βέλους: προηγούμενη/επόμενη εικόνα \nB: κενό / ακύρωση κενού παραθύρου \nN: μετάβαση στην επόμενη εικόνα \nP: παύση / συνέχιση \nX: μεγέθυνση στη θέση του ποντικιού 1661 keyword names 1661 ονόματα keyword 1662 keywords to add 1662 keywords προς προσθήκη 1663 keywords to remove 1663 keywords προς αφαίρεση 1664 keywords_defined file error: %s 1664 σφάλμα αρχείου keywords_defined: %s 1665 last search 1665 τελευταία αναζήτηση 1666 last version 1666 τελευταία έκδοση 1667 last versions 1667 τελευταίες εκδόσεις 1668 layout exceeds 4 gigabytes 1668 η διάταξη υπερβαίνει τα 4 gigabyte 1669 layout file missing: %s 1669 λείπει το αρχείο διάταξης: %s 1670 left 1670 αριστερά 1671 left click on image for selected color 1671 αριστερό κλικ στην εικόνα για επιλεγμένο χρώμα 1672 left click: set image source location \nright click: set corresponding destination 1672 αριστερό κλικ: ορισμός τοποθεσίας πηγής εικόνας \nδεξί κλικ: ορισμός αντίστοιχου προορισμού 1673 left drag: add transparency \nright drag: add opacity 1673 αριστερό σύρσιμο: προσθήκη διαφάνειας \nδεξί σύρσιμο: προσθήκη αδιαφάνειας 1674 left drag: copy image to mouse position \nright drag: restore original image 1674 αριστερό σύρσιμο: αντιγραφή εικόνας στη θέση του ποντικιού \nδεξί σύρσιμο: επαναφορά αρχικής εικόνας 1675 left drag: reduce halo, right drag: undo 1675 αριστερό σύρσιμο: μείωση φωτοστέφανου, δεξί σύρσιμο: αναίρεση 1676 lens mm 1676 φακός mm 1677 level based on EXIF roll angle 1677 οριζοντίωση με βάση τη γωνία roll των EXIF 1678 light 1678 φωτεινό 1679 light pixels 1679 φωτεινά pixel 1680 line 1680 γραμμή 1681 line color 1681 χρώμα γραμμής 1682 line width 1682 πλάτος γραμμής 1683 load 1683 φόρτωση 1684 load text data from a file 1684 φόρτωση δεδομένων κειμένου από αρχείο 1685 load widgets failed: %s 1685 η φόρτωση στοιχείων απέτυχε: %s 1686 loading palette ... 1686 φόρτωση παλέτας ... 1687 location is not a folder 1687 η τοποθεσία δεν είναι φάκελος 1688 locations 1688 τοποθεσίες 1689 lock width/height ratio 1689 κλείδωμα αναλογίας πλάτους/ύψους 1690 log file is in a terminal 1690 το αρχείο καταγραφής βρίσκεται σε τερματικό 1691 low 1691 χαμηλό 1692 low contrast 1692 χαμηλή αντίθεση 1693 lower 1693 κατώτερο 1694 make an initially empty album 1694 δημιουργία αρχικά κενού άλμπουμ 1695 make new version 1695 δημιουργία νέας έκδοσης 1696 manual align 1696 χειροκίνητη ευθυγράμμιση 1697 map marker (red dot) diameter, pixels 1697 διάμετρος δείκτη χάρτη (κόκκινη κουκκίδα), pixel 1698 map selected areas and verify 1698 χαρτογράφηση επιλεγμένων περιοχών και επαλήθευση 1699 mashup project 1699 έργο mashup 1700 match embedded image color 1700 ταίριασμα χρώματος ενσωματωμένης εικόνας 1701 match image color to base image (repeat) 1701 ταίριασμα χρώματος εικόνας με τη βασική εικόνα (επανάληψη) 1702 match values 1702 ταίριασμα τιμών 1703 matches 1703 αντιστοιχίες 1704 max keywords exceeded 1704 υπέρβαση μέγιστων keywords 1705 max. Width 1705 μέγ. Πλάτος 1706 max. album count exceeded: %d 1706 υπέρβαση μέγιστου αριθμού άλμπουμ: %d 1707 max. album files reached, results truncated 1707 επιτεύχθηκε το μέγιστο αρχείων άλμπουμ, τα αποτελέσματα περικόπηκαν 1708 max. album size exceeded: %d 1708 υπέρβαση μέγιστου μεγέθους άλμπουμ: %d 1709 max. blur radius 1709 μέγ. ακτίνα θολώματος 1710 max. brightness 1710 μέγ. φωτεινότητα 1711 max. image limit reached: %d 1711 επιτεύχθηκε το μέγιστο όριο εικόνων: %d 1712 max. width or height is not reasonable 1712 το μέγ. πλάτος ή ύψος δεν είναι λογικό 1713 maximum clip allowed to fit window 1713 μέγιστη επιτρεπόμενη αποκοπή για προσαρμογή στο παράθυρο 1714 mean RGB: %5.0f %5.0f %5.0f 1714 μέση τιμή RGB: %5.0f %5.0f %5.0f 1715 mean noise: %5.2f %5.2f %5.2f 1715 μέσος θόρυβος: %5.2f %5.2f %5.2f 1716 median 1716 διάμεσος 1717 median diff 1717 διαφορά διαμέσου 1718 menu text and background colors 1718 χρώματα κειμένου και φόντου μενού 1719 metadata 1719 metadata 1720 metadata copy failed 1720 η αντιγραφή metadata απέτυχε 1721 metadata from Search Function, metadata report 1721 metadata από τη Λειτουργία Αναζήτησης, αναφορά metadata 1722 metadata picklist file not found %s 1722 δεν βρέθηκε το αρχείο λίστας επιλογής metadata %s 1723 metadata tags to report 1723 tags metadata προς αναφορά 1724 metadata update error 1724 σφάλμα ενημέρωσης metadata 1725 metadata update error \n 1725 σφάλμα ενημέρωσης metadata \n 1726 metadata update error: %s 1726 σφάλμα ενημέρωσης metadata: %s 1727 metadata update failed \n 1727 η ενημέρωση metadata απέτυχε \n 1728 min. blur radius 1728 ελάχ. ακτίνα θολώματος 1729 min. contrast 1729 ελάχ. αντίθεση 1730 min. edit curve node separation, % of scale length 1730 ελάχ. απόσταση κόμβων καμπύλης επεξεργασίας, % του μήκους κλίμακας 1731 min. separation, %c of scale 1731 ελάχ. απόσταση, %c της κλίμακας 1732 minutes 1732 λεπτά 1733 mmap() failure: %s 1733 αποτυχία mmap(): %s 1734 months 1734 μήνες 1735 more than %d categories 1735 περισσότερες από %d κατηγορίες 1736 more than 20 matches 1736 περισσότερες από 20 αντιστοιχίες 1737 mouse radius 1737 ακτίνα ποντικιού 1738 mouse radius for color sample 1738 ακτίνα ποντικιού για δείγμα χρώματος 1739 mouse radius: 1739 ακτίνα ποντικιού: 1740 move (delete original) 1740 μετακίνηση (διαγραφή πρωτοτύπου) 1741 move area boundary in/out in 1-pixel steps 1741 μετακίνηση ορίου περιοχής μέσα/έξω σε βήματα 1 pixel 1742 move to next input file 1742 μετάβαση στο επόμενο αρχείο εισόδου 1743 move to trash failed \n 1743 η μετακίνηση στα απορρίμματα απέτυχε \n 1744 move to trash failed: %s 1744 η μετακίνηση στα απορρίμματα απέτυχε: %s 1745 multiply 1745 πολλαπλασιασμός 1746 must have 4 corners 1746 πρέπει να έχει 4 γωνίες 1747 need numeric match value: %s 1747 απαιτείται αριθμητική τιμή ταιριάσματος: %s 1748 negative 1748 αρνητικό 1749 new album created 1749 δημιουργήθηκε νέο άλμπουμ 1750 new album name 1750 νέο όνομα άλμπουμ 1751 new file 1751 νέο αρχείο 1752 new file ... 1752 νέο αρχείο ... 1753 new file name is invalid 1753 το νέο όνομα αρχείου δεν είναι έγκυρο 1754 new file type 1754 νέος τύπος αρχείου 1755 new home folder contains a blank 1755 ο νέος κύριος φάκελος περιέχει κενό 1756 new location 1756 νέα τοποθεσία 1757 new location is not a folder 1757 η νέα τοποθεσία δεν είναι φάκελος 1758 new version 1758 νέα έκδοση 1759 newest files 1759 πιο πρόσφατα αρχεία 1760 no EXIF orientation data 1760 δεν υπάρχουν δεδομένα προσανατολισμού EXIF 1761 no active Select Area 1761 καμία ενεργή Επιλογή Περιοχής 1762 no albums selected 1762 κανένα άλμπουμ δεν επιλέχθηκε 1763 no auto warp 1763 χωρίς αυτόματη παραμόρφωση 1764 no change 1764 καμία αλλαγή 1765 no current album 1765 κανένα τρέχον άλμπουμ 1766 no current edit image 1766 καμία τρέχουσα εικόνα επεξεργασίας 1767 no current file 1767 κανένα τρέχον αρχείο 1768 no curve (scanned image) 1768 χωρίς καμπύλη (σαρωμένη εικόνα) 1769 no description 1769 καμία περιγραφή 1770 no file selected 1770 κανένα αρχείο δεν επιλέχθηκε 1771 no files found 1771 δεν βρέθηκαν αρχεία 1772 no files selected 1772 κανένα αρχείο δεν επιλέχθηκε 1773 no host files selected 1773 κανένα κύριο αρχείο δεν επιλέχθηκε 1774 no image index: reports disabled \n 1774 χωρίς ευρετήριο εικόνων: οι αναφορές είναι απενεργοποιημένες \n 1775 no images 1775 καμία εικόνα 1776 no images found 1776 δεν βρέθηκαν εικόνες 1777 no input files available 1777 δεν υπάρχουν διαθέσιμα αρχεία εισόδου 1778 no matching files found 1778 δεν βρέθηκαν αρχεία που να ταιριάζουν 1779 no matching locations 1779 καμία αντίστοιχη τοποθεσία 1780 no metadata level data 1780 δεν υπάρχουν δεδομένα επιπέδου metadata 1781 no metadata tags to report 1781 κανένα tag metadata προς αναφορά 1782 no option selected 1782 καμία επιλογή δεν επιλέχθηκε 1783 no overlay file selected 1783 κανένα αρχείο επικάλυψης δεν επιλέχθηκε 1784 no photo date, skipped 1784 καμία ημερομηνία φωτογραφίας, παραλείφθηκε 1785 no plugin output file found 1785 δεν βρέθηκε αρχείο εξόδου plugin 1786 no prior edit 1786 καμία προηγούμενη επεξεργασία 1787 no prior edit image 1787 καμία προηγούμενη εικόνα επεξεργασίας 1788 no saved folders 1788 κανένας αποθηκευμένος φάκελος 1789 no script file was started 1789 δεν ξεκίνησε κανένα αρχείο σεναρίου 1790 no script files found 1790 δεν βρέθηκαν αρχεία σεναρίου 1791 no select area 1791 καμία επιλογή περιοχής 1792 no selection 1792 καμία επιλογή 1793 no title 1793 κανένας τίτλος 1794 no write permission 1794 δεν υπάρχει δικαίωμα εγγραφής 1795 no write permission \n 1795 δεν υπάρχει δικαίωμα εγγραφής \n 1796 no write permission: %s 1796 δεν υπάρχει δικαίωμα εγγραφής: %s 1797 none 1797 κανένα 1798 not a known image file 1798 δεν είναι γνωστό αρχείο εικόνας 1799 not an image file 1799 δεν είναι αρχείο εικόνας 1800 not an indexed image file \n 1800 δεν είναι ευρετηριασμένο αρχείο εικόνας \n 1801 nothing found 1801 δεν βρέθηκε τίποτα 1802 nothing left, no change made 1802 δεν απέμεινε τίποτα, δεν έγινε καμία αλλαγή 1803 old file 1803 παλιό αρχείο 1804 old image index: reports will omit new files \n 1804 παλιό ευρετήριο εικόνων: οι αναφορές θα παραλείπουν νέα αρχεία \n 1805 old keyword name >> new keyword name 1805 παλιό όνομα keyword >> νέο όνομα keyword 1806 omit high pixel 1806 παράλειψη υψηλού pixel 1807 omit low pixel 1807 παράλειψη χαμηλού pixel 1808 only %d tile images found 1808 βρέθηκαν μόνο %d εικόνες πλακιδίων 1809 opacity center 1809 αδιαφάνεια κέντρου 1810 opacity edge 1810 αδιαφάνεια άκρης 1811 open album 1811 άνοιγμα άλμπουμ 1812 open and process color chart 1812 άνοιγμα και επεξεργασία χρωματικού πίνακα 1813 open as new current file 1813 άνοιγμα ως νέο τρέχον αρχείο 1814 optional deselect color 1814 προαιρετική αποεπιλογή χρώματος 1815 original 1815 πρωτότυπο 1816 originals 1816 πρωτότυπα 1817 other 1817 άλλο 1818 out of space for temp files \nsave your edits and quit Fotocx 1818 δεν υπάρχει χώρος για προσωρινά αρχεία \nαποθηκεύστε τις επεξεργασίες σας και τερματίστε το Fotocx 1819 outline 1819 περίγραμμα 1820 output file exists 1820 το αρχείο εξόδου υπάρχει 1821 output file exists, overwrite? 1821 το αρχείο εξόδου υπάρχει, αντικατάσταση; 1822 output file size change, cannot use select area 1822 αλλαγή μεγέθους αρχείου εξόδου, δεν είναι δυνατή η χρήση επιλογής περιοχής 1823 output file: 1823 αρχείο εξόδου: 1824 output file: %s \n 1824 αρχείο εξόδου: %s \n 1825 oval 1825 οβάλ 1826 overlay file missing: %s 1826 λείπει το αρχείο επικάλυψης: %s 1827 owner 1827 ιδιοκτήτης 1828 paint 1828 ζωγραφική 1829 paint color 1829 χρώμα ζωγραφικής 1830 paint edits cannot be used for this method 1830 η ζωγραφική επεξεργασιών δεν μπορεί να χρησιμοποιηθεί για αυτή τη μέθοδο 1831 paint over transparent areas 1831 ζωγραφική πάνω από διαφανείς περιοχές 1832 paint radius 1832 ακτίνα ζωγραφικής 1833 palette 1833 παλέτα 1834 palette exceeds %d color limit 1834 η παλέτα υπερβαίνει το όριο %d χρωμάτων 1835 palette file 1835 αρχείο παλέτας 1836 palette has %d colors 1836 η παλέτα έχει %d χρώματα 1837 palette loaded, %d colors 1837 η παλέτα φορτώθηκε, %d χρώματα 1838 palette: 1838 παλέτα: 1839 patch area goal 1839 στόχος περιοχής επιδιόρθωσης 1840 percent 1840 ποσοστό 1841 perform edits to include in the script file 1841 εκτελέστε επεξεργασίες προς συμπερίληψη στο αρχείο σεναρίου 1842 permissions: 1842 δικαιώματα: 1843 perspective 1843 προοπτική 1844 photo 1844 φωτογραφία 1845 picklist file not found: %s 1845 δεν βρέθηκε το αρχείο λίστας επιλογής: %s 1846 pixel = mean of best match neighbors 1846 pixel = μέσος όρος καλύτερων γειτονικών ταιριασμάτων 1847 pixel = median of all neighbors 1847 pixel = διάμεσος όλων των γειτόνων 1848 please make a choice 1848 παρακαλώ κάντε μια επιλογή 1849 plugin command failed 1849 η εντολή plugin απέτυχε 1850 plugin menu not found %s 1850 δεν βρέθηκε το μενού plugin %s 1851 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1851 plugins: (έτος μήνας ημέρα παλιό-όνομα ακολουθία) $yyyy $mm $dd $oldname $s 1852 popup_choose: empty list 1852 popup_choose: κενή λίστα 1853 position with mouse click/drag 1853 θέση με κλικ/σύρσιμο ποντικιού 1854 position: 50 50 1854 θέση: 50 50 1855 position: x=%02d y=%02d 1855 θέση: x=%02d y=%02d 1856 power 1856 ισχύς 1857 power center 1857 κέντρο ισχύος 1858 power edge 1858 άκρη ισχύος 1859 power: center 1859 ισχύς: κέντρο 1860 pref 1860 προτίμ. 1861 previous file 1861 προηγούμενο αρχείο 1862 previous name 1862 προηγούμενο όνομα 1863 print color chart 1863 εκτύπωση χρωματικού πίνακα 1864 print select area(s) only? 1864 εκτύπωση μόνο επιλεγμένης(ων) περιοχής(ών); 1865 prior edit step 1865 προηγούμενο βήμα επεξεργασίας 1866 project complete 1866 το έργο ολοκληρώθηκε 1867 project file is defective 1867 το αρχείο έργου είναι ελαττωματικό 1868 project name cannot have quote characters 1868 το όνομα έργου δεν μπορεί να έχει χαρακτήρες εισαγωγικών 1869 pure RGB or black/white dots 1869 καθαρές κουκκίδες RGB ή ασπρόμαυρες 1870 quality 1870 ποιότητα 1871 quality level (70+) 1871 επίπεδο ποιότητας (70+) 1872 radius 1872 ακτίνα 1873 radius: 1873 ακτίνα: 1874 random 1874 τυχαίο 1875 random position 1875 τυχαία θέση 1876 rating range 1876 εύρος βαθμολογίας 1877 reading image index file ...\n 1877 ανάγνωση αρχείου ευρετηρίου εικόνων ...\n 1878 recent files 1878 πρόσφατα αρχεία 1879 reduce bright 1879 μείωση φωτεινού 1880 reduce dark 1880 μείωση σκοτεινού 1881 reduce to these limits if larger 1881 μείωση σε αυτά τα όρια αν είναι μεγαλύτερο 1882 refresh 1882 ανανέωση 1883 remove %d duplicates? 1883 αφαίρεση %d διπλότυπων; 1884 remove all files in list 1884 αφαίρεση όλων των αρχείων από τη λίστα 1885 remove duplicate 1885 αφαίρεση διπλότυπου 1886 remove from set 1886 αφαίρεση από το σύνολο 1887 remove panorama image curving 1887 αφαίρεση καμπυλότητας πανοραμικής εικόνας 1888 remove selected file from list 1888 αφαίρεση επιλεγμένου αρχείου από τη λίστα 1889 rename keywords 1889 μετονομασία keywords 1890 repair metadata for %s 1890 επιδιόρθωση metadata για %s 1891 replace 1891 αντικατάσταση 1892 replace album %s ? 1892 αντικατάσταση άλμπουμ %s ; 1893 replace file 1893 αντικατάσταση αρχείου 1894 replace old 1894 αντικατάσταση παλιού 1895 replace old file (OVERWRITE) 1895 αντικατάσταση παλιού αρχείου (ΑΝΤΙΚΑΤΑΣΤΑΣΗ) 1896 replace substring within file name 1896 αντικατάσταση υποσυμβολοσειράς μέσα στο όνομα αρχείου 1897 report type: 1897 τύπος αναφοράς: 1898 req. color match 1898 απαιτ. ταίριασμα χρώματος 1899 reset 1899 επαναφορά 1900 resolution 1900 ανάλυση 1901 resume from current image 1901 συνέχιση από την τρέχουσα εικόνα 1902 right 1902 δεξιά 1903 right click on image for deselected color 1903 δεξί κλικ στην εικόνα για αποεπιλεγμένο χρώμα 1904 sample % 1904 δείγμα % 1905 save 1905 αποθήκευση 1906 save Mashup output file 1906 αποθήκευση αρχείου εξόδου Mashup 1907 save Mashup project? 1907 αποθήκευση έργου Mashup; 1908 save area as a PNG file 1908 αποθήκευση περιοχής ως αρχείο PNG 1909 save as new file name or type 1909 αποθήκευση με νέο όνομα ή τύπο αρχείου 1910 save as new file version 1910 αποθήκευση ως νέα έκδοση αρχείου 1911 save edit, start new text 1911 αποθήκευση επεξεργασίας, έναρξη νέου κειμένου 1912 save metadata to image file 1912 αποθήκευση metadata στο αρχείο εικόνας 1913 save text data to a file 1913 αποθήκευση δεδομένων κειμένου σε αρχείο 1914 save to .heic/.avif file not supported 1914 η αποθήκευση σε αρχείο .heic/.avif δεν υποστηρίζεται 1915 save to .jp2 file not supported 1915 η αποθήκευση σε αρχείο .jp2 δεν υποστηρίζεται 1916 save to .webp file not supported 1916 η αποθήκευση σε αρχείο .webp δεν υποστηρίζεται 1917 scan and save color chart 1917 σάρωση και αποθήκευση χρωματικού πίνακα 1918 scanned color chart file 1918 αρχείο σαρωμένου χρωματικού πίνακα 1919 scope of neighbor pixels 1919 εύρος γειτονικών pixel 1920 script already started 1920 το σενάριο έχει ήδη ξεκινήσει 1921 script complete 1921 το σενάριο ολοκληρώθηκε 1922 script error: %s, %s 1922 σφάλμα σεναρίου: %s, %s 1923 script file closed 1923 το αρχείο σεναρίου έκλεισε 1924 script file error 1924 σφάλμα αρχείου σεναρίου 1925 script file format error: %s 1925 σφάλμα μορφής αρχείου σεναρίου: %s 1926 script file name too big 1926 το όνομα αρχείου σεναρίου είναι πολύ μεγάλο 1927 script file to run 1927 αρχείο σεναρίου προς εκτέλεση 1928 search for names in image location metadata 1928 αναζήτηση ονομάτων στα metadata τοποθεσίας εικόνας 1929 search for text within file folders or file name 1929 αναζήτηση κειμένου μέσα σε φακέλους αρχείων ή όνομα αρχείου 1930 search for text within image title or description 1930 αναζήτηση κειμένου μέσα στον τίτλο ή την περιγραφή εικόνας 1931 search known locations 1931 αναζήτηση γνωστών τοποθεσιών 1932 search range 1932 εύρος αναζήτησης 1933 search: 1933 αναζήτηση: 1934 seconds 1934 δευτερόλεπτα 1935 seconds to show with text 1935 δευτερόλεπτα εμφάνισης με κείμενο 1936 seconds to show without text 1936 δευτερόλεπτα εμφάνισης χωρίς κείμενο 1937 select all 1937 επιλογή όλων 1938 select all colors within mouse (flood) 1938 επιλογή όλων των χρωμάτων εντός ποντικιού (πλημμύρα) 1939 select area missing or not finished 1939 λείπει η επιλογή περιοχής ή δεν έχει ολοκληρωθεί 1940 select area within mouse 1940 επιλογή περιοχής εντός ποντικιού 1941 select area within mouse circle 1941 επιλογή περιοχής εντός κύκλου ποντικιού 1942 select base image for color matching 1942 επιλογή βασικής εικόνας για ταίριασμα χρώματος 1943 select by color, required match level 1943 επιλογή κατά χρώμα, απαιτούμενο επίπεδο ταιριάσματος 1944 select by color, search range 1944 επιλογή κατά χρώμα, εύρος αναζήτησης 1945 select font 1945 επιλογή γραμματοσειράς 1946 select image to show with mouse paint 1946 επιλογή εικόνας για εμφάνιση με ζωγραφική ποντικιού 1947 select images randomly 1947 τυχαία επιλογή εικόνων 1948 select initial files 1948 επιλογή αρχικών αρχείων 1949 select line color 1949 επιλογή χρώματος γραμμής 1950 select one color within mouse 1950 επιλογή ενός χρώματος εντός ποντικιού 1951 select rectangle 1951 επιλογή ορθογωνίου 1952 select source image color first 1952 επιλέξτε πρώτα χρώμα εικόνας πηγής 1953 select surrounding areas matching colors in mouse 1953 επιλογή γύρω περιοχών που ταιριάζουν με χρώματα στο ποντίκι 1954 selection exceeds %d tags 1954 η επιλογή υπερβαίνει τα %d tags 1955 sepia 1955 σέπια 1956 set a new date/time: 1956 ορισμός νέας ημερομηνίας/ώρας: 1957 set all 1957 ορισμός όλων 1958 set current window size 1958 ορισμός τρέχοντος μεγέθους παραθύρου 1959 set image color from input files 1959 ορισμός χρώματος εικόνας από αρχεία εισόδου 1960 set location from world map 1960 ορισμός τοποθεσίας από παγκόσμιο χάρτη 1961 set maximum crop 1961 ορισμός μέγιστης περικοπής 1962 shadow 1962 σκιά 1963 shell command used for converting RAW files to RGB 1963 εντολή κελύφους που χρησιμοποιείται για μετατροπή αρχείων RAW σε RGB 1964 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1964 shift + αριστερό κλικ: επιλογή χρώματος από την εικόνα \nαριστερό σύρσιμο: ζωγραφική χρώματος στην εικόνα \nδεξί σύρσιμο: επαναφορά αρχικής εικόνας 1965 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1965 shift + αριστερό κλικ: συγχρονισμός θέσης αντιγραφής \nαριστερό σύρσιμο: αντιγραφή εικόνας πηγής στο ποντίκι \nδεξί σύρσιμο: επαναφορά αρχικής εικόνας 1966 shift existing date/time (+/–): 1966 μετατόπιση υπάρχουσας ημερομηνίας/ώρας (+/–): 1967 shift+click on image to select color 1967 shift+κλικ στην εικόνα για επιλογή χρώματος 1968 shortcut function not found: %s 1968 δεν βρέθηκε η λειτουργία συντόμευσης: %s 1969 shortcut key: 1969 πλήκτρο συντόμευσης: 1970 shortcut not found: %s 1970 δεν βρέθηκε η συντόμευση: %s 1971 show area outlines 1971 εμφάνιση περιγραμμάτων περιοχής 1972 show hidden files and folders 1972 εμφάνιση κρυφών αρχείων και φακέλων 1973 show transient objects 1973 εμφάνιση παροδικών αντικειμένων 1974 size of mouse selection circle 1974 μέγεθος κύκλου επιλογής ποντικιού 1975 smooth 1975 ομαλό 1976 source file: 1976 αρχείο πηγής: 1977 source image failure (scale too big?) 1977 αποτυχία εικόνας πηγής (πολύ μεγάλη κλίμακα;) 1978 source image scale 1978 κλίμακα εικόνας πηγής 1979 specify a thumbnail folder 1979 καθορίστε φάκελο thumbnail 1980 specify at least 1 top image folder 1980 καθορίστε τουλάχιστον 1 κύριο φάκελο εικόνων 1981 specify background size and color 1981 καθορίστε μέγεθος και χρώμα φόντου 1982 specify files and keywords 1982 καθορίστε αρχεία και keywords 1983 spot size limit 1983 όριο μεγέθους σημείου 1984 start 1984 έναρξη 1985 start a new script file 1985 έναρξη νέου αρχείου σεναρίου 1986 start album 1986 έναρξη άλμπουμ 1987 start blob condensation process 1987 έναρξη διαδικασίας συμπύκνωσης κηλίδων 1988 start file 1988 αρχείο έναρξης 1989 start folder 1989 φάκελος έναρξης 1990 start from first image in album 1990 έναρξη από την πρώτη εικόνα στο άλμπουμ 1991 start fusion process 1991 έναρξη διαδικασίας σύντηξης 1992 start over at end of album 1992 επανεκκίνηση στο τέλος του άλμπουμ 1993 start warp 1993 έναρξη παραμόρφωσης 1994 start with previous image file, gallery of recent files, etc. 1994 έναρξη με το προηγούμενο αρχείο εικόνας, γκαλερί πρόσφατων αρχείων, κ.λπ. 1995 startup album is invalid 1995 το άλμπουμ εκκίνησης δεν είναι έγκυρο 1996 startup file is invalid 1996 το αρχείο εκκίνησης δεν είναι έγκυρο 1997 startup folder is invalid 1997 ο φάκελος εκκίνησης δεν είναι έγκυρος 1998 status: %s \n 1998 κατάσταση: %s \n 1999 status: completed \n 1999 κατάσταση: ολοκληρώθηκε \n 2000 stay open 2000 παραμονή ανοιχτό 2001 step 2001 βήμα 2002 stop 2002 διακοπή 2003 stop blob condensation process 2003 διακοπή διαδικασίας συμπύκνωσης κηλίδων 2004 stop fusion process 2004 διακοπή διαδικασίας σύντηξης 2005 supply a file name 2005 δώστε ένα όνομα αρχείου 2006 tag name 2006 όνομα tag 2007 tag name %s not in xmeta tag list 2007 το όνομα tag %s δεν βρίσκεται στη λίστα tag xmeta 2008 tag value 2008 τιμή tag 2009 target file: 2009 αρχείο προορισμού: 2010 template 2010 πρότυπο 2011 test: show changes, do not update files 2011 δοκιμή: εμφάνιση αλλαγών, χωρίς ενημέρωση αρχείων 2012 text 2012 κείμενο 2013 text file is defective 2013 το αρχείο κειμένου είναι ελαττωματικό 2014 text time 2014 ώρα κειμένου 2015 this function cannot be scripted 2015 αυτή η λειτουργία δεν μπορεί να συμπεριληφθεί σε σενάριο 2016 thumbnail file 2016 αρχείο thumbnail 2017 thumbnails deleted: %d \n 2017 thumbnails διαγράφηκαν: %d \n 2018 thumbnails folder: %s \n 2018 φάκελος thumbnails: %s \n 2019 tile area goal 2019 στόχος περιοχής πλακιδίου 2020 tile gap 2020 κενό πλακιδίου 2021 tile size 2021 μέγεθος πλακιδίου 2022 time 2022 ώρα 2023 title/desc. 2023 τίτλος/περιγρ. 2024 to add images to current set, \nsearch all images 2024 για προσθήκη εικόνων στο τρέχον σύνολο, \nαναζητήστε όλες τις εικόνες 2025 to remove images from current set, \nsearch current set 2025 για αφαίρεση εικόνων από το τρέχον σύνολο, \nαναζητήστε στο τρέχον σύνολο 2026 too many categories 2026 πάρα πολλές κατηγορίες 2027 too many files, cannot continue 2027 πάρα πολλά αρχεία, δεν είναι δυνατή η συνέχεια 2028 too many keywords in a category 2028 πάρα πολλά keywords σε μία κατηγορία 2029 top image folders: \n 2029 κύριοι φάκελοι εικόνων: \n 2030 transition 2030 μετάβαση 2031 transitions 2031 μεταβάσεις 2032 trash 2032 απόρριψη 2033 trimmed color chart file 2033 κομμένο αρχείο χρωματικού πίνακα 2034 unable to save bookmarks file 2034 δεν είναι δυνατή η αποθήκευση του αρχείου σελιδοδεικτών 2035 unknown edit function: %s 2035 άγνωστη λειτουργία επεξεργασίας: %s 2036 unknown file type 2036 άγνωστος τύπος αρχείου 2037 unknown or empty album: %s 2037 άγνωστο ή κενό άλμπουμ: %s 2038 unsharp mask 2038 μάσκα όξυνσης 2039 update 2039 ενημέρωση 2040 updating albums ...\n 2040 ενημέρωση άλμπουμ ...\n 2041 upper 2041 ανώτερο 2042 upsize 2042 μεγέθυνση 2043 use 2043 χρήση 2044 use a saved Mashup project 2044 χρήση αποθηκευμένου έργου Mashup 2045 use average 2045 χρήση μέσου όρου 2046 use custom color palette 2046 χρήση προσαρμοσμένης παλέτας χρωμάτων 2047 use median 2047 χρήση διαμέσου 2048 use option to stop accidental quit 2048 χρησιμοποιήστε την επιλογή για αποφυγή τυχαίας εξόδου 2049 use previous input 2049 χρήση προηγούμενης εισόδου 2050 use previous location 2050 χρήση προηγούμενης τοποθεσίας 2051 use prior edit step: 2051 χρήση προηγούμενου βήματος επεξεργασίας: 2052 use the current image file 2052 χρήση του τρέχοντος αρχείου εικόνας 2053 variance 2053 διακύμανση 2054 versions 2054 εκδόσεις 2055 vertical 2055 κάθετο 2056 video files not supported (install ffmpeg) 2056 τα αρχεία βίντεο δεν υποστηρίζονται (εγκαταστήστε το ffmpeg) 2057 view album 2057 προβολή άλμπουμ 2058 waiting 2058 αναμονή 2059 warp 2059 παραμόρφωση 2060 warp and align selected image with mouse drags 2060 παραμόρφωση και ευθυγράμμιση επιλεγμένης εικόνας με σύρσιμο ποντικιού 2061 warp and fine-align selected image with neighbor 2061 παραμόρφωση και ακριβής ευθυγράμμιση επιλεγμένης εικόνας με γείτονα 2062 warp span 2062 εύρος παραμόρφωσης 2063 wavelength 2063 μήκος κύματος 2064 width 2064 πλάτος 2065 writing updated image index file \n 2065 εγγραφή ενημερωμένου αρχείου ευρετηρίου εικόνων \n 2066 x-count 2066 αριθμός-x 2067 x-offset 2067 μετατόπιση-x 2068 y-count 2068 αριθμός-y 2069 y-offset 2069 μετατόπιση-y 2070 years 2070 έτη 2071 you can close this window now \n 2071 μπορείτε να κλείσετε αυτό το παράθυρο τώρα \n 2072 you cannot use new name and replace text together 2072 δεν μπορείτε να χρησιμοποιήσετε νέο όνομα και αντικατάσταση κειμένου μαζί 2073 you must use either $s or $oldname 2073 πρέπει να χρησιμοποιήσετε είτε $s είτε $oldname 2074 zoom image 2074 zoom εικόνας 2075 zoom via mouse wheel or Keys +/=/-/↑/↓ 2075 zoom μέσω ροδέλας ποντικιού ή πλήκτρων +/=/-/↑/↓ 2076 zoom-in 2076 zoom-in 2077 zoom-out 2077 zoom-out fotocx/data/translations/ug_ja0000664000175000017500000117317015247006657015512 0ustar micomico- ^FOTOCX ユーザーガイド^ v.26.8 Fotocx のメニュー ヘルプ > ユーザーガイド から表示 - {Fotocx の使い方} {初回起動} - 高速検索のための画像ファイルの検出とインデックス作成 {ユーザーガイド} ← ^ここをクリック^ - このユーザーガイドブラウザーの使い方 {ウィンドウ表示とメニュー} - トップレベルのウィンドウと関連メニュー {ファイル表示} - ファイル表示ウィンドウ(単一の画像ファイルを表示) {ギャラリー表示} - ギャラリー表示ウィンドウ(フォルダーを thumbnails として表示) {マップ表示} - マップ表示ウィンドウ(画像の位置マーカー付きの地図を表示) {ドラッグ&ドロップ} - ファイルのドラッグ&ドロップ方法 {手順を編集} - 画像ファイルの編集方法 {ワークフローを編集} - 代替の編集方法 - シンプルと複雑 {マウスの所有権} - ダイアログとマウスの制御・連携 {マウス Alt+右ボタン} - タッチパッド/タッチスクリーン用のマウス右ボタン {ダイアログボタン} - ダイアログの完了オプション {キーボードの Escape キー} - Escape キーの機能 {非標準のダイアログウィジェット} - 非標準のダイアログウィジェットの使い方 {カーブ編集} - 編集機能で使うカーブの操作方法 {MOUSE PAINTING} - マウスを使った画像の局所的な編集 {一括処理} - 一括処理機能の概要 {画像ファイルを選択} - 画像ファイルの選択手順 {ショートカット} - ポップアップメニュー、キーボードショートカット、カスタムユーザーメニュー {マウス操作} - ファイル/ギャラリー/マップ表示でのマウス操作 {コマンドパラメーター} - Fotocx のコマンドラインパラメーター - {ファイルメニュー} {新規セッション} - 別ウィンドウで新しい Fotocx セッションを開始 {画像ファイルを開く} - 表示または編集する画像ファイルを開く {2ファイルを切り替え} - 直近に見た2つの画像ファイルを切り替え表示 {3ファイルを切り替え} - 直近に見た3つの画像ファイルを切り替え表示 {360° パノラマを表示} - 視点を回転できる360°パノラマ画像 {空白画像} - 指定したサイズと色で空白画像を作成 {空白画像} - 新しい空白画像を作成 {コピー/移動} - 画像ファイルを別のフォルダーへコピーまたは移動 {デスクトップにコピー} - 画像ファイルをデスクトップにコピー {クリップボードにコピー} - 画像ファイルをクリップボードにコピー {削除/ゴミ箱へ} - 画像ファイルを削除またはゴミ箱へ {壁紙に設定} - 現在の画像ファイルからデスクトップの壁紙を設定 {画像を印刷} - 画像ファイルを印刷 {キャリブレーション印刷} - 色キャリブレーションデータを使って印刷 {プリンターのキャリブレーション} - プリンターの色を調整 - 色ずれを補正 - {ギャラリーメニュー} {ギャラリー概要} {thumbnail 表示} - thumbnails とファイル名によるギャラリー表示 {metadata 表示} - thumbnail と基本 metadata によるギャラリー表示 {最近使用したファイル} - 直近に見た画像ファイルのギャラリー表示 {最新ファイル} - 最新の画像ファイルのギャラリー表示 {ギャラリーの並び替え} - ギャラリーの並び順を変更 {ギャラリーフィルター} - 最新、最古、パターン一致などを選択... {ギャラリーホーム} - ギャラリーの先頭へ移動 {ギャラリーの末尾} - ギャラリーの末尾へ移動 {現在のファイルのフォルダー} - 現在のファイルのフォルダーから現在のギャラリーを設定 {最近使用したフォルダー} - 最近見たフォルダーのリストを表示、選択 {フォルダーツリー} - 画像ファイルのフォルダーをツリー構造で表示、選択 {ファイルを選択} - 一括処理、スクリプト、アルバムへの入力用にファイルを選択 {ブックマーク} - ブックマークのリストを表示、ブックマークへ移動 {ブックマークを編集} - ブックマークの追加、削除、並べ替え - {MAPS MENU} {世界地図} - インターネット世界地図の概要 {マップで表示} - 現在の画像の位置をマップで表示 - {アルバムメニュー} {アルバム} - 画像コレクションを作成・整理 {アルバムを作成} - 新しいアルバムを作成(選んだ画像のギャラリー) {アルバム名を変更} - 既存のアルバムの名前を変更 {アルバムを削除} - 既存のアルバムを削除 {アルバムを選択} - アルバムを選んで画像のギャラリーを表示 {現在のアルバム} - 現在(最後に使用した)アルバムを表示 {ギャラリーからアルバムへ} - 現在のギャラリーを名前付きアルバムとして保存 {アルバムを編集} - アルバムギャラリー内の画像ファイルの追加、削除、並べ替え {アルバムを更新} - 更新された画像ファイル(新しいバージョン)用にアルバムを更新 {アルバム一括更新} アルバムの一括更新(構成ファイルの追加/削除/置換) {スライドショー} - アニメーションによる画像遷移とパン/ズームを伴うスライドショー - {カスタムメニュー} - よく使う機能のためのカスタムユーザーメニュー {スクリプトファイル} - スクリプトファイルの概要 {スクリプトを編集} - カスタム編集機能を作成するため編集をスクリプトに記録 {スクリプトを実行} - 現在の画像に対してスクリプトを実行 {一括スクリプト} - 選択した画像ファイルに対してスクリプトを実行 {プラグイン} - プラグインの編集機能を開始、プラグインの出力ファイルを開く - {ズーム} - マウスまたはキーボードで画像や thumbnails をズームイン/アウト - {前/次} - マウスまたはキーボードで前または次の画像へ移動 - {ファイル保存} - 画像ファイルを保存(置換、新しいバージョン、新しいファイル名) - {metadata メニュー} {主要な metadata を表示} - 主要な画像 metadata を一覧表示 {すべての metadata を表示} - すべての画像 metadata を一覧表示 {keywords 概要} - 画像検索に使う keywords {GEOTAGS OVERVIEW} - 検索用の場所名と geocoordinates {メイン metadata を編集} - よく使う metadata を編集 {任意の metadata を編集} - 任意の metadata を編集(追加、削除、変更) {metadata を削除} - 指定した metadata またはすべての metadata を削除 {metadata をコピー} - ある画像ファイルから別の画像ファイルへ metadata をコピー {metadata を修復} - metadata の編集を妨げる不正な metadata を修復 {keywords を管理} - ユーザー定義の keywords を管理 {キャプション} - 画像の隅にファイル名、タイトル、説明を表示 {場所/日付} - 画像の場所/日付を一覧表示、クリックでギャラリー {タイムライン} - 年/月別の画像数を表示、クリックでギャラリー {metadata tags} - tag の値別の画像数を表示、クリックでギャラリー {自動検索} - ファイルを見つけるスクリプト化された検索機能 {画像を検索} - あらゆる metadata またはフォルダー/ファイル名で検索 - {選択メニュー} {エリア概要} - エリア選択 - 概念と使い方 {エリアを選択} - 別々に編集する画像の被写体やエリアを選択 {エリアの隙間を検索} - 手描きのエリア輪郭の隙間を検索 {エリアブレンド} - 選択したエリア内で行った編集をマウスでブレンド {エリアを表示/非表示} - エリアの輪郭を表示または非表示 {エリアの有効化/無効化} - エリアを編集用に有効化または無効化 {エリアを反転} - エリアを反転(外側/内側を入れ替え) {エリアをクリア} - エリアを削除 {エリアのコピー/貼り付け} - エリアをコピー、または現在の画像にエリアを貼り付け {エリアの読込/保存} - エリアをファイルから読み込む、またはファイルに保存 - {元に戻す/やり直すボタン} - 現在の画像への編集を順番に元に戻す/やり直す - {編集メニュー} {回転} - 画像を回転または水平/垂直に補正 {upright 補正} - 回転またはミラー反転した画像を upright 補正 {クロップ} - 画像の余白をクロップ(トリミング) {レタッチ} - 明るさ、コントラスト、色、彩度を編集 {リスケール} - 画像のピクセルサイズを変更 {分割画面} - 分割画面で変更前後を表示 {差分を表示} - 編集中の変更(または任意の2枚の画像)をハイライト表示 {余白} - 画像に任意の色や透明度で余白を追加 {マークアップ} - 画像に描画:テキスト、線/矢印、四角形、楕円 {カラーモード} - 白黒、カラー、ネガ、ポジに変換 {ペイント編集} - 編集機能をマウスで局所的かつ段階的にペイント {画像をペイント} - 色、ブラシサイズ、不透明度でマウスペイント {透明度をペイント} - マウスで透明度を段階的に増やしてペイント {エリア塗りつぶし} - 選択したエリアまたは透明なエリアを色で塗りつぶす {画像内でコピー} - マウスで画像内のピクセルをコピー {画像からコピー} - マウスで別の画像からピクセルをコピー {前回の編集をコピー} - マウスで前回の編集からピクセルをコピー - {修復メニュー} {シャープ化} - ぼけた画像をシャープ化、複数の方式 {ぼかし} - 画像または画像エリアをぼかす、複数の方式 {ノイズ除去} - 画像ノイズ(小さなランダムな斑点)を軽減 {霧除去} - 画像または選択エリアの霧/かすみを追加または除去 {赤目} - フラッシュ撮影による赤目を除去 {スマート消去} - 電線、標識、その他の小さな邪魔者を除去 {ハローを除去} - シャープ化などの機能で残るハローを除去 {JPEG アーティファクト} - 高圧縮ファイルのアーティファクトを抑制 {アンチエイリアス} - 被写体エッジのピクセル化(ジャギー)を抑制 {RGB を調整} - RGB または CMY カラーで画像の色を調整 {HSL を調整} - HSL カラーモデルで色を選択・変更 {ほこりを除去} - 古い写真から画像上のほこりを除去 {色収差} - 周辺の色収差(色にじみ)を補正 - {リファインメニュー} {ヒストグラムをフラット化} - 明るさヒストグラムをフラット化して細部を強調 {局所コントラスト} - 局所的な明るさに応じたコントラストを追加 {コントラストを強調} - 既存のコントラストを強調して細部を際立たせる {グローバルレティネックス} - より広い範囲になるよう RGB 値をリスケール {局所レティネックス} - より広い範囲になるよう RGB 値をリスケール {彩度} - 明るさに基づいて色の彩度を調整 {ソフトフォーカス} - 古典的な「ソフトフォーカス」効果を画像に適用 {明るさグラデーション} - 画像全体に明るさ/色のグラデーションを追加 {ビネット} - 選んだ中心から放射状に明るさ/色を変更 - {効果メニュー} {輪郭線} - 画像を輪郭線の絵に変換 {スケッチ1} - 画像を模擬スケッチ(1)に変換 {スケッチ2} - 画像を模擬スケッチ(2)に変換 {カートゥーン} - 画像をカートゥーン風の絵に変換 {エンボス} - 画像を模擬エンボス(3D効果)に変換 {タイル1} - 画像を3D効果のある正方形タイルに変換 {タイル2} - 画像を画像に合わせた不規則なタイルに変換 {絵画風} - 画像を模擬絵画風に変換 {テクスチャ} - 画像または選択エリアにテクスチャを追加 {フュージョン} - シャープさを保ちながら細部を抑制 {色を合わせる} - ある画像の色を別の画像に合わせる {パターン} - 画像に背景パターンを追加 {クロスハッチ} - 交差する平行線を使ったスケッチに変換 {ディザ} - 画像をピクセル化またはポスタリゼーションする様々な方法 {彫刻風} - 画像を白黒の線に変換 {グレアを追加} - 画像内の明るい被写体の周りにグレアを追加 {モザイク} - 画像から作ったタイルでモザイクに変換 {ノイズを追加} - 画像にランダムノイズを追加 {色を設定} - 色数を減らす(ポスタリゼーション) {色をシフト} - RGB の色を GBR や BRG に徐々にシフト {エイリアンカラー} - 画像にランダムな奇妙な色を追加 {カスタムカーネル} - カスタム畳み込みカーネルを編集・適用 - {ゆがみ補正メニュー} {曲げ補正} - 特にパノラマなど、湾曲した線を持つ画像をまっすぐにする {パースペクティブ} - 鈍角から撮影した被写体をまっすぐにする {エリアのゆがみ補正} - マウスで引っ張って選択した画像エリアをゆがみ補正 {WARP LINEAR1} - マウスドラッグによる画像のゆがみ補正 - 線形1ゆがみ {WARP LINEAR2} - マウスドラッグによる画像のゆがみ補正 - 線形2ゆがみ {曲面ゆがみ補正} - マウスドラッグによる画像のゆがみ補正 - 曲線ゆがみ {アフィンゆがみ補正} - マウスドラッグによる画像のゆがみ補正 - 平行線を維持 {放射状ゆがみ補正} - 樽型または糸巻き型のゆがみを追加または除去 {クローズアップのゆがみ補正} - クローズアップ顔写真のゆがみ(鼻の膨張など)を除去 {波を作成} - 画像を波状パターンでゆがみ補正 {ツイスト} - 選んだ中心点を軸に画像をツイスト {球体} - 画像を球状にカーブさせる {内側と外側を反転} - 各ピクセルの中心からの距離を反転 {タイニープラネット} - パノラマ画像を円に巻き付ける {エッシャー螺旋} - 画像を無限に内側へ渦巻く螺旋に変換 {写真をフラット化} - 湾曲した面の写真をフラット化 - {結合メニュー} {HDR} - 暗い/明るい画像を結合して明るさの幅を拡張 {HDF} - 近景/遠景にピントの合った画像を結合して被写界深度を拡張 {スタック/ペイント} - 通行中の車や観光客などを消すために画像を結合 {スタック/ノイズ} - 平均化によりノイズを軽減するために画像を結合 {スタック/レイヤー} - 画像バージョンを結合、エリア/バージョンを選択・ペイント {パノラマ} - 一連の画像を水平方向に結合 {CIM ファイルを表示} - 現在/最新の結合画像の入力ファイルを表示 {マッシュアップ} - 画像と書式付きテキストをカスタムレイアウトに配置 {画像配列} - 多数の画像をコンパクトな配列形式に結合 - {一括処理メニュー} {一括変換} - コピー、移動、リスケール、名前変更、変換、テキスト追加... {一括コピー/移動} - 選択した画像ファイルを新しいフォルダーにコピー/移動 {upright の一括処理} - 回転した画像ファイルを検出して upright 補正 {一括削除/ゴミ箱へ} - 選択した画像ファイルを削除またはゴミ箱へ {オーバーレイの一括適用} - 選択した画像にオーバーレイ画像(著作権など)を追加 {keywords の一括設定} - 選択した画像ファイルの keywords を追加または削除 {keywords の一括名前変更} - すべての画像ファイルの keywords を名前変更または削除 {keywords の一括削除} - すべての画像ファイルから不要な keywords を削除 {撮影日の一括設定} - 撮影日や時刻を変更、またはタイムゾーンをシフト {metadata の一括変更} - 選択した画像ファイルの metadata を追加または修正 {metadata の一括レポート} - 選択またはすべての画像ファイルの metadata をレポート {geotags の一括設定} - 選択またはすべての画像ファイルの geotags を追加または修正 {ファイルをエクスポート} - 選択したファイルをフォルダーにエクスポート(例:ウェブアップロード) - {ツールメニュー} {ファイルをインデックス} - すべての画像ファイルを検出・インデックス化する1回限りの作業 {Fotocx ホームを移動} - Fotocx ホームフォルダー(ユーザーデータと設定)を移動 {設定} - Fotocx の動作に関するユーザー設定と環境設定 {キーボードショートカット} - メニュー機能のキーボードショートカットを表示・変更 {RGB ヒストグラム} - 現在の画像の明るさヒストグラムグラフ {画像を拡大表示} - マウスを画像上の拡大鏡にする {画像を計測} - 画像内のピクセル間距離を計測(マウスクリック) {RGB を表示} - マウス位置または選択した点の RGB 値を表示 {グリッド設定} - グリッド線を表示または削除、本数や間隔を設定 {線の色} - 選択エリアの輪郭の色を設定 {暗部/明部のピクセル} - 白飛び・黒つぶれをハイライト表示するツール {モニターの色} - モニターの明るさとコントラストを調整 {重複を検索} - ギャラリーまたはすべての画像内の重複画像を検索 {不正なファイルを検索} - 読み取れない画像ファイルを検索、削除/移動/修復 {リソースを表示} - CPU 時間と現在のメモリ使用量を表示 {翻訳} - GUI 翻訳を作成または修正 - {ヘルプメニュー} - ユーザーガイド、チュートリアル、変更履歴、Fotocx について、アンインストール - {その他のトピック} {VIDEO FILES} - 動画ファイル、thumbnails、動画の再生 {スライドとネガ} - スライドやフィルムネガの取り込み方法 {Fotocx の制限事項} - サイズとパフォーマンスの制限 {Windows 11 版 Fotocx} - Windows 11 WSL への Fotocx のインストール {プライバシー} - Fotocx のプライバシーとデータ保護ポリシー {PROBLEM, QUESTION, SUGGESTION} - Fotocx の作者への連絡 - - TOPIC: Fotocx の使い方 - - TOPIC: 初回起動 - ^外部プログラム Fotocx は必要なプログラムとオプションの外部プログラム、およびそれぞれが提供する機能をレポートします。必要なプログラムが不足している場合はインストールし、Fotocx を再起動してください。 - ^初回インデックス Fotocx は画像ファイルをインデックス化します。これによりギャラリーページ(thumbnails)の表示が高速になり、インデックス化された metadata に基づく高速検索が可能になり、クリック可能なマップマーカーで場所ごとに画像を表示できるようになります。1つ以上の「トップ」画像フォルダー(例:/home//Pictures)を入力する必要があります。サブフォルダーは自動的に含まれます。これらのフォルダー内の画像以外のファイルは無視されます。トップ画像フォルダーを探して追加するには[select]ボタンを使用してください。実用上の上限は約30個のトップフォルダーです。それぞれに数百のサブフォルダーを持たせることができます。 - ^thumbnails thumbnail ファイルが配置されるフォルダーです。標準の既定値を使用するか、別の場所を選択してください。 - ^インデックス作成時間 インデックス作成の速度は、画像ファイルの種類やサイズ、コンピューターの速度によって、数百ファイル/分から1万ファイル/分以上まで幅があります。コレクションに新しい画像ファイルを追加すると、次回の Fotocx 起動時にその新しいファイルがインデックス化されます。新しいファイルが多い場合、起動時にインデックス作成の時間が必要になります。 - ^画像のタイトルと説明の統合 Fotocx の画像インデックス機能は、タイトルと説明の metadata が欠落している場合、利用可能な他の多くの代替 metadata tags(headline、event、abstract、imagedescription、caption-abstract、subject、comment、usercomment、caption)のいずれかで置き換えます。これにより、常に「タイトル」と「説明」のみを使って表示/編集/検索できるようになります。この変換処理は比較的低速です(私の高性能コンピューターで2200ファイル/分)。これは新しい画像ファイルが初めてインデックス化される際に行われます。何も削除されません。 - - TOPIC: ユーザーガイド ユーザーガイドはメニューの ヘルプ > ユーザーガイド から開きます。Fotocx の使用中に F1 を押すと、現在または直近のメニュー機能のユーザーガイドのトピックが表示されます。 - テキストをスクロールするには、上下矢印キーとページアップ/ダウンキーを使用してください。[検索]ボタンでテキスト検索のダイアログが開きます。次の該当箇所を探すには再度[検索]を押してください。 - 太字の大文字テキストはトピックへのクリック可能なリンクです(例:{ファイルをインデックス})。[<]と[>]ボタンを使って、最近見たトピック間を前後に移動できます。[Recent]ボタンで最近見たトピックのクリック可能な一覧が表示されます。 - - TOPIC: ウィンドウ表示とメニュー +image: fotocx-views.jpg - ^メニューボタン メニューをクリックすると、ポップアップサブメニューが表示されます。上部の3つのメニュー(File、Gallery、Maps)は対応する表示モードを設定します。キー F/G/M も使用できます。 - - TOPIC: ファイル表示 1枚の画像が Fotocx ウィンドウ全体を占めます。左/右クリックでズームイン/アウトします。Z キーでウィンドウに合わせる表示と等倍表示(画像の1ピクセル=表示の1ピクセル)を切り替えます。ズームした画像をパンするには、画像上でマウスを左ドラッグしてください。マウスホイールでも画像をズームイン/アウトできます。画像を変更するにはメニューボタン(Edit、Repair など)を使用してください。変更したファイルを保存するには File Save ボタンを使用します:置換、新しいバージョンの作成、または新しいファイル(新しい名前)の作成。 - ^キーボードの左/右矢印キー 現在のギャラリー内で前または次の画像ファイルを表示します。 - ^上/下矢印キー 上記と同様ですが、最新バージョンのみが表示されます(バージョンがない場合はオリジナル)。 - - TOPIC: ギャラリー表示 現在のギャラリー内のすべての画像ファイルが thumbnails の配列として表示されます。 - ^ギャラリーの種類 • フォルダー:単一のフォルダー(ディレクトリ)内のすべての画像ファイルとサブフォルダー • アルバム:様々なフォルダーからの画像ファイルで、ユーザーが並べたもの • 最近使用したファイル:直近に見た、または編集した画像ファイル • 最新ファイル:直近に追加または変更された画像ファイル • 検索結果:検索機能で見つかった画像。これもアルバムの一種です。 - ^ギャラリー機能 • 画像 thumbnail を左クリック:ファイル表示モードで画像を開く • 画像 thumbnail を右クリック:よく使う機能のポップアップメニュー • フォルダー thumbnail をクリック:そのフォルダーをギャラリーモードで開く • フォルダーギャラリーの TOP バー:親フォルダー - クリックで移動 • [TOP]ボタン:トップレベルフォルダーの一覧 - クリックで移動 • スクロールバー:ギャラリー内を上下にスクロール • 上/下矢印キー:ギャラリーを1行スクロール • ページアップ/ダウンキー:ギャラリーを1ページスクロール • home/end キー:ギャラリーの先頭(上)と末尾(下)へ移動 • マウスホイール:ギャラリーを上下にスクロール • [+]と[-]キー:thumbnail サイズを拡大/縮小 - ^ギャラリーのポップアップ画像 • thumbnail を中クリックでポップアップ画像を表示 • thumbnail を Shift+左クリックでポップアップ画像を表示 • ポップアップ画像を左クリック:画像を拡大 • ポップアップ画像を右クリック:ポップアップ画像を閉じる • マウススクロールホイール:ポップアップ画像を拡大/縮小 • F11 キー:ポップアップ画像を全画面表示にする • Escape キー:ポップアップ画像を閉じる • 複数のポップアップを使って画像を比較できます - - TOPIC: マップ表示 画像の位置に対応するマーカーを含む地図を表示します。マーカーをクリックすると、対応する画像のギャラリーが表示されます。これは画像ファイルに埋め込まれた geocoordinates(latitude、longitude)に依存します。最近のカメラはこれを自動的に挿入しますが、自分でこのデータを追加することもできます。最初は世界地図が表示されます。マウスホイールで任意の場所を拡大/縮小できます。ドラッグして地図の中心を移動します。世界全体を、街レベルまでのあらゆる縮尺で表示できます。 - - TOPIC: ドラッグ&ドロップ 2つの Fotocx セッションを開いている場合、一方から他方へファイルをドラッグ&ドロップできます。あるウィンドウからもう一方へギャラリー thumbnail をドラッグしてください。ファイル表示の場合、そのファイルが開かれます。ギャラリー表示の場合、結果はギャラリーの種類によって異なります。ギャラリーがフォルダーの場合、そのファイルはフォルダーに追加され、ギャラリーは並び順に応じた位置に新しいファイルを表示します。ギャラリーがアルバムの場合、そのファイルはドロップされた位置にアルバムへ追加されます。 - - TOPIC: 手順を編集 ファイル表示モードの画像(現在の画像)は、Edit、Repair、Refine、Effects、Warp、Combine の各メニューにある編集機能で変更できます。これらの機能はメモリ内とウィンドウ内の現在の画像を変更します。これらの機能を使用するにつれて、編集内容が積み重なります。編集が終わったら、[保存]メニューボタンを使って、変更した画像を同じファイルに、新しいバージョン(例:filename.v01.jpg)に、または新しいファイルやフォルダーに保存します。画像編集ダイアログには、画像を即座に更新するスライダー、ボタン、スピンボタン、または編集可能なカーブがあります。 - Undo/Redo ボタンを左または右クリックすると、現在有効な編集機能を元に戻す/やり直すことができます。画像に1つ以上の編集が適用された後、undo/redo ボタンを使って完了したすべてのステップを前後にたどり、各ステップ後の画像状態を確認できます。マウスの中央ボタンで現在の画像に行われたすべての編集のポップアップリストが表示され、任意のステップを選んで戻ることができます。任意の前のステップから画像を再編集できます。これはそのステップより後に行われた編集を破棄します。それらはそのステップから派生したものだからです。この undo/redo 機能は、編集した画像が現在の画像である限り維持されます。別の画像を開くと、編集履歴は破棄されます。現在の画像の状態に戻れる可能性を保持したい場合は、別の編集を続ける前に画像を新しいバージョンとして保存してください。 - - TOPIC: ワークフローを編集 - ^シンプルなワークフロー ほとんどの場合、カメラから出力された JPEG ファイルをそのまま編集できます。以下のより複雑な手順は、編集後に一部の画像エリアで明るさの範囲が拡張され、明るさの段差が目に見えるほど大きくなり、色帯(バンディング)が見える場合にのみ使用してください。 - ^複雑なワークフロー 深い色(RGB 各色8ビット以上)で編集するには、カメラの RAW ファイルから始めます。RAW ファイルは他の画像ファイルと同様に編集できます。Fotocx の編集機能は色ごとに24ビットで動作するため、RAW ファイルの完全な色深度が保たれます。RAW ファイルを開くと、選択した RAW ローダーが使用されます - {設定}を参照してください。複数の RAW ファイルを、色ごとに16ビットの TIFF、PNG、または JXL ファイルに変換するには Batch Convert も使用できます。 - Dcraw が既定の RAW ファイルローダーです。Rawtherapee のようなより複雑な RAW エディターも使用できます - {設定}を参照してください。Dcraw はそれに比べてシンプルで高速です。RAW エディターの編集機能は、通常 Fotocx の方が簡単に行えます。 - - TOPIC: マウスの所有権 一部の編集ダイアログは、メインウィンドウ内の画像を参照または変更するためにマウスを使用します。このようなダイアログが同時に複数アクティブな場合があります。マウスは画像のズームやスクロールにも使用されるため、編集ダイアログを使用しながらこれを行う必要がある場合があります。したがって、どのダイアログまたはウィンドウがマウスを所有しているか、また所有権をどう切り替えるかを理解することが重要です: • ダイアログがキーボードフォーカスを持っている場合、画像上のマウス操作はこのダイアログへの入力となり、画像のズームやスクロールは行われません。 • CTRL キーを押しながら画像上でマウスをクリックまたはドラッグすると、画像がズームまたはパン/スクロールします。開いているダイアログには影響しません。 • マウスホイールは、どの画像位置でもズームイン/アウトできます。 - - TOPIC: マウス Alt+右ボタン タッチパッドやタッチスクリーンでは、右クリックが扱いにくい場合があります。ALT キーを押しながら左マウスボタンを押すと、右マウスボタンとして解釈されます。 - - TOPIC: ダイアログボタン これらは主に次のように動作します: • [リセット] - 現在の編集を元に戻し、画像を初期状態に戻す • [適用] - ダイアログの設定を画像に適用し、ダイアログは開いたままにする • [OK] - [適用]と同じですが、ダイアログが閉じます • [キャンセル] - 画像の変更を破棄してダイアログを閉じる • [続行] - ダイアログの入力に基づいて時間のかかる処理を続行する • [X] - 何もせずダイアログを閉じる - - TOPIC: キーボードの Escape キー メインウィンドウにフォーカスがある場合: • 長時間実行中の機能があれば、それを終了する • メインウィンドウが最大化されている場合、元のサイズに戻す • 現在のビューがギャラリーまたはマップの場合、ファイル表示に切り替える • 上記のいずれでもない場合:Fotocx を終了する ダイアログウィンドウにフォーカスがある場合:ダイアログを終了する([X]ボタンと同じ) その他:ポップアップ画像をキャンセル、360パノラマビューアーを終了、スライドショーを一時停止または終了。 - - TOPIC: 非標準のダイアログウィジェット +image: custom-widgets.png - ダイアログのサイズを縮小したり使いやすさを向上させたりするために、一部の非標準ウィジェットが使用されています。これらはほぼ標準の GTK ウィジェットのように動作します。数値データウィジェットは GTK のスピンボタンのように動作します:マウスホイールとキーボードの上下矢印キーを使って値を素早く増減できます。タッチパッドを使用している場合、入力欄をタップしてカーソルを配置し、キーボードで値を入力するか、キーボードの上下矢印キーを使って新しい値へ素早く移動してください。キーを押し続けると、変化の速度が時間とともに加速します。Shift キーを使うと速度を10倍にできます。非線形スライダーは中立値の周辺で目盛りを拡大するため、特にタッチパッドで小さな変化をより精密に制御できます。いくつかの標準 GTK ウィジェットは、余分なパディングを取り除くことでサイズが縮小されています。これは Fotocx ホームフォルダー内の 'widgets.css' ファイルで制御されています。必要に応じてこのファイルを変更できます。項目を削除したりコメントとしてマークしたりできますが、ファイル自体は削除しないでください - 自動的に置き換えられてしまいます。 - - TOPIC: カーブ編集 +image: retouch.png - 一部の画像編集機能では編集可能なカーブを使用します。カーブを操作して、他の何らかの特性に応じて画像のある特性を変更できます。カーブはマウスで移動(引っ張る)できます。カーブを引っ張った場所にアンカーポイント(黒い点)が追加され、この点は固定されたままになります - カーブの他の部分が引っ張られても、この点を通過し続けます。アンカーポイントはドラッグで移動、右クリックで削除できます。 - - TOPIC: MOUSE PAINTING マウスを使って画像を局所的に編集できます。マウス位置の周りの円が、マウスを画像上で左ドラッグするにつれて変更される画像エリアを囲みます。変更の元となるものは、編集機能、選んだ色、または同じ画像内や別の画像の別の場所のピクセルです。マウスの円内の画像ピクセルは、その元に合わせて変更されます。変化の速さは、マウス中心とエッジのパワー係数に応じて、速くも緩やかにもできます。中心の係数が高くエッジの係数が低い場合、画像はマウス中心で速く変化し、中心からエッジに向かって徐々に変化が少なくなります。同じ画像エリアの上でマウスを繰り返し左ドラッグして変化を積み重ね、ピクセルが元の色や画像に完全に一致するまで、または元の編集機能が完全に適用されるまで続けます。右ドラッグで変化を徐々に元に戻し、元の画像を復元します。 - 例:編集機能が Retouch で明るさを上げる場合、マウスを左ドラッグするとマウスのエリア内で画像が明るくなります。右ドラッグで元の画像へ徐々に戻してください。 - [undo-last]ボタンは直前のペイントまたは消去操作を元に戻し、これを繰り返すことで最近の多くの編集を取り消せます。マウスをドラッグする各操作が、個別に元に戻せる作業単位です。undo 用のメモリには限りがあるため、直近のペイントと消去のステップのみが保持されます。[undo all]は画像を初期状態に戻します。 - [undo/redo]ボタンを使って、編集中の変更を確認できます。 - {エリアを選択}が有効な場合、ペイントはエリア内に限定されます。 - 注意:非常に小さい半径を使用する場合(例えば画像上に線を描く場合)は、画像を100%以上にズームしてください。マウスの移動幅は画面ピクセル単位です。これが多くの画像ピクセルにまたがり、かつ小さい半径を使用している場合、マウスが一部のピクセルを飛ばしてしまい、処理されないことがあります。 - - TOPIC: 一括処理 {一括処理メニュー}にはいくつかの一括機能があり、よくある作業を高速化します。多数の画像ファイルを選択して、それらすべてに一括機能を実行できます。一括機能を使うと、ファイル名や種類の変更、upright 補正、リスケール、コピーまたは移動、削除、tags・keywords・場所/geocoordinates・撮影日の修正ができます。 - - TOPIC: 画像ファイルを選択 +image: select-image-files.jpg - この手順は、複数の画像ファイルを対象に動作するすべての機能で使用されます。手順はここで説明され、このトピックはこの手順を使用するすべての機能からリンクされています。 • thumbnail を左クリック:選択リストに追加 • 右クリック:削除 • 複数追加:最初の thumbnail をクリックし、最後を Shift+クリック • [すべて追加]ボタン:ギャラリー全体を追加 • [現在の項目を追加]ボタン:現在のファイルを追加 • 1つのファイルをリストに複数回追加できます • 必要に応じて他のギャラリーへ移動してさらにファイルを選択できます • [削除]ボタン:選択したリスト位置を削除 • [クリア]ボタン:リスト全体をクリア • 上/下矢印キー:リストをステップ移動、thumbnail を表示 • home/end キー:リストの先頭/末尾へ移動 - [無効化]ボタンは thumbnail のクリックによるファイル選択を無効化します。ボタンは[有効化]という名前に変わります - 押すと thumbnail クリックが元に戻ります。これは、thumbnail クリックがファイル選択に使われている場合には使用できない、通常の thumbnail ポップアップメニューや左クリックによるフルサイズでのファイル表示を有効にするためのものです。選択内容を決める際にこれが必要になることがあります。ファイル表示モードのまま矢印キーで画像をステップ移動しながら、[現在の項目を追加]ボタンでファイルを選択リストに追加することもできます。 - - TOPIC: ショートカット よく使う機能には3つのショートカット方法があります: • メインウィンドウまたはギャラリー thumbnail を右クリックしてください。 よく使う機能のポップアップメニューが表示されます。 • ショートカットキーを変更したり、新しいショートカットを追加したりできます。 {キーボードショートカット}を参照してください。 • よく使う機能をカスタムメニューに集めてください。 {カスタムメニュー}を参照してください。 - 最もよく使う機能にはキーボードショートカットが用意されています。メニューの ツール > キーボードショートカット から表示・変更できます。 - 以下のキーボードショートカットは固定されており、変更できません: • [+][=]キー:画像や thumbnails を拡大 • [-]キー:画像や thumbnails を縮小 • Z キー:ズームの切り替え:等倍 <--> ウィンドウに合わせる • F1 キー:現在の機能のユーザーガイドを表示 • F10 キー:メインウィンドウの全画面表示を切り替え • F11 キー:F10 と同様ですが、メニュー、タイトルバー、上部パネルなし • Escape キー:実行中の機能を終了、有効なダイアログを終了 • Delete キー:現在のファイルを削除またはゴミ箱へ移動するダイアログ • 矢印左/右:ギャラリー内の前/次の画像を表示 • 矢印上/下:同様ですが、最新バージョンのみ表示 • ページアップ/ダウン:ギャラリー表示:1ページ上/下にスクロール • Home/End:ギャラリー表示:ギャラリーの最初/最後のページへ移動 - 以下のキーボードショートカットは既定値で、ユーザーが変更できます: • F:File View - ファイル表示モードに切り替え • G:Gallery View - ギャラリー表示モードに切り替え • M:Map View - マップ表示モードに切り替え • 2:Cycle 2 Files - 直近2ファイルを交互に表示 • 3:Cycle 3 Files - 直近3ファイルを交互に表示 • A:Current Album - 最近見たアルバムを表示 • T:Retouch - Retouch 編集機能を開始 • C:Crop - Crop 編集機能を開始 • K:Keyboard Shortcuts - キーボードショートカットダイアログを開始 • P:Print Image - 画像印刷ダイアログを開く • R:Rotate - Rotate 編集機能を開始 • U:Undo - 現在の編集または一連の操作の最後を元に戻す • Shift+U:Redo - 現在の編集または一連の操作の次をやり直す • Ctrl+C:Copy to Clipboard - 現在のファイルをクリップボードにコピー • Shift+C:Toggle Captions - キャプションの表示/非表示を切り替え • Ctrl+G:現在のファイルのフォルダーギャラリーを表示 • Shift+G:Toggle Grid - グリッド線の表示/非表示を切り替え • Ctrl+S:Save - ファイル保存ダイアログを開始 - - TOPIC: マウス操作 - ^ファイル表示 • 左クリック - ズームイン:マウス位置を中心に画像を拡大 • 右クリック - 画像がズームされている場合:ウィンドウサイズに戻す そうでない場合:よく使う機能のポップアップメニュー • マウスホイール - 画像をズームイン/アウト • 画像を左ドラッグ - ズームした画像をパン • Ctrl+マウス - マウスは有効なダイアログではなく画像に作用する - ^ギャラリー表示 • thumbnail を左クリック - ファイル表示に切り替え • thumbnail を右クリック - よく使う機能のポップアップメニューを表示 • thumbnail を中クリック - 大きな画像をポップアップ表示、マウスホイールでズーム • マウスホイール - ギャラリーページを上下にスクロール - ^マップ表示 • 左ドラッグ - マウスに追従して地図をドラッグ • マウスホイール - 地図を拡大/縮小 • マーカーを左クリック - その場所の画像のギャラリーを表示 • metadata 編集ダイアログが有効な場合、左クリックで geocoordinates を設定 - - TOPIC: コマンドパラメーター Fotocx をターミナルから起動する場合、これらのパラメーターを使用できます。 -help ユーザーガイドを表示 -home /folder 代替の Fotocx ホームの場所(下記参照) -lang xx 2文字コードで言語を設定 -recent 最近使用した画像ファイルのギャラリーを表示 -new 最新の画像ファイルのギャラリーを表示 -album albumname 開くアルバム(ギャラリー) -prev 前回のセッションで最後に表示したファイルを表示 -blank 空白のウィンドウを表示 -dev 通常は非表示の開発者メニューを表示 -menu manuname Fotocx はこのメニューを有効な状態で起動する -cwp nnn name 壁紙を切り替える(下記参照) -x0 -x1 -x2 インデックスレベルを 0、1、または 2 に設定(下記参照) - ^-x0 -x1 -x2 パラメーター^ (起動時のインデックスレベルを設定) これらのパラメーターは、{設定}の値を上書きするために使用できます -x0 非常に高速な起動、画像インデックスなし -x1 高速な起動、古いファイルのみインデックス -x2 古いファイル+新規/変更ファイルを検索 - ^-home^ パラメーター(代替の Fotocx ホームフォルダー) 既定の Fotocx ホームフォルダー:/home//.fotocx。 ここにユーザー設定と画像インデックスが保存されます。 コマンド "$ fotocx -home " は指定したフォルダーを使用します。 これにより、複数の画像コレクションを別々に管理できるようになります。 {Fotocx ホームを移動}も参照してください。 - ^-cwp^ パラメーター(デスクトップの壁紙を切り替え) 完全なコマンドラインは次のとおりです:$ fotocx -cwp secs container このコマンドを使うと、選んだセットからデスクトップ画像を切り替えられます。'secs' は画像間の間隔です。'container' は Fotocx のアルバム名、または画像ファイルを含むフォルダーです。ログイン起動リストにこのコマンドを追加すると、指定した間隔で新しい壁紙になります。ログインごとに新しい壁紙画像にするには、1日以上の間隔を使用してください。Fotocx は GUI なしでバックグラウンドで動作します。'secs' がゼロの場合、壁紙の更新が1回行われた後 Fotocx は終了します。Linux のディストリビューションごとにコマンドは異なります。理論上、次のものに対応しています:Gnome、KDE、XFCE、Mate、LXDE。 - - TOPIC: ファイルメニュー - - TOPIC: 新規セッション 新しいウィンドウで新しい Fotocx セッションを開始します。両方のウィンドウで同じ画像ファイルが編集された場合、どちらのインスタンスも相手が行った変更を認識せず、最終結果は最後に保存されたファイルになります。 - - TOPIC: 画像ファイルを開く フォルダーとファイル一覧を持つ従来のファイルオープンダイアログを使って、表示または編集する画像ファイルを選択します。これは、ファイルがインデックス化されておらずギャラリー表示が非常に遅い場合(例えば数千枚の画像ファイルを含むカメラの SD カードから読み込む場合)に便利です。 - - TOPIC: 2ファイルを切り替え このメニューを繰り返し使うと、直近に開いた2つのファイルが交互に表示されます。この機能は現在の画像のズームサイズと位置を保持するため、同じ画像ファイルの2つの編集バージョンを素早く比較するのに最適です。 - - TOPIC: 3ファイルを切り替え これは2ファイルを切り替えと同じ動作をしますが、直近に開いた3つのファイルを交互に表示します。 - - TOPIC: 360° パノラマを表示 現在のファイルが360°パノラマファイル用の特別なビューアーで開かれます。画像の幅は360°であると想定されます。この機能を使って Google の「フォトスフィア」画像を表示できます。マウスドラッグまたは左/右矢印キーで画像をパンします。左/右クリックでズームします。特別なビューアーを終了するには Escape を使用してください。 - - TOPIC: 名前変更 現在のファイル(ファイル表示)、またはクリックした thumbnail のファイル(ギャラリー表示)の名前を変更します。新しい名前を入力して[適用]を押してください。この機能では、ルート名と連番を使って一連の画像ファイルの名前変更を自動化することもできます。連続する画像ファイルの最初のものを開き、新しい名前を入力して[適用]ボタンを押してください。必要であれば[next]ボタンで次のファイルへ移動してください。[以前の名前]ボタンを押すと同じ名前を再度使用し、その後に接尾辞や連番を追加できます。[add 1]ボタンを押すと連番が1つ増えます。 - - TOPIC: 空白画像 指定したピクセルサイズと色で空白画像を作成します。これは、({エリアを選択}で)他の画像から切り取った部分や、({マークアップ}のテキスト描画による)注釈テキストの背景として使用できます。 - - TOPIC: コピー/移動 現在のファイル(ファイル表示)、またはクリックした thumbnail のファイル(ギャラリー表示)が指定した場所にコピーされます。コピーオプションを選ぶと、ファイルをコピーし元のファイルはそのまま残して複製を作成します。移動オプションを選ぶと、ファイルは元の場所から新しい場所へ移動します。各 thumbnail をクリックしてから[適用]を押すことで、複数のファイルを素早く処理できます。[前へ]ボタンで直前に使用したファイル名をコピーできます。重複ファイルを避けるため、バージョン番号などを追加してください。 - - TOPIC: デスクトップにコピー 現在のファイル(ファイル表示)、またはクリックした thumbnail のファイル(ギャラリー表示)がデスクトップフォルダー(/home//Desktop)にコピーされます。 - - TOPIC: クリップボードにコピー 現在のファイル(ファイル表示)、またはクリックした thumbnail のファイル(ギャラリー表示)がクリップボードにコピーされ、他のアプリケーションで貼り付けることができます。 - - TOPIC: 削除/ゴミ箱へ 現在のファイル(ファイル表示)、またはクリックした thumbnail のファイル(ギャラリー表示)が、選択したオプションに応じて削除またはゴミ箱に移動されます。Fotocx はゴミ箱の標準(~/.local/share/Trash)を前提としています。 - - TOPIC: 壁紙に設定 現在の画像ファイルからデスクトップの壁紙が設定されます。 - - TOPIC: 画像を印刷 画像印刷メニューでは、プリンター、用紙サイズ、向きを選択できる標準のページ設定ダイアログが表示されます。[適用]ボタンを使用すると、用紙の余白と画像の縮尺を入力する別のダイアログが開始されます。 - 画像に選択エリアがある場合、そのエリアのみを印刷するかどうかを尋ねられます。これらは各エリアを囲む最小の四角形を使って印刷され、選択範囲の外側は印刷されません。 - - TOPIC: キャリブレーション印刷 この機能は上で説明した Print Image File と同様に動作しますが、印刷前に、印刷前に画像の色を調整するために使用するキャリブレーションファイルの指定を求められます。目的は、プリンターと用紙の種類によって生じる色ずれを補正することです。 - - TOPIC: プリンターのキャリブレーション +image: printer-calibrate-chart.png +image: calibrate-printer.png - このユーティリティは、印刷画像の色精度を改善できる場合があります。 - ^仕組み 対象のプリンターで色のチャートを印刷します。プリンターの不完全さにより、印刷された色の一部はわずかに不正確になります。この印刷ページはファイルにスキャンされ、このファイル内の色が、元々印刷された色と比較されます。あらゆる差はこれで既知の誤差となります(お使いのスキャナーがプリンターより正確であると仮定した場合 - 一般的にはそうです)。画像ファイルを印刷する際、これらの誤差は印刷前に画像の色から差し引かれます。プリンターはその誤差を再び加えるため、結果は理論上正しくなります。私自身のテストではわずかな改善が見られました。詳細は下記のとおりです。 - ダイアログウィンドウに記載されている順に、以下の手順を実行してください。すべてのファイルはフォルダー /printer_color 内にあります。 • カラーチャートファイル(printchart.png)を生成して印刷してください。 大きい用紙サイズ、縦向き、余白なしを使用してください。 • 印刷したチャートを PNG ファイルにスキャンしてください。300dpi 以上を使用してください。 • スキャナーによってできた余白をクロップするため PNG 画像を編集してください。 編集した画像ファイルを保存してください。 • 編集した画像ファイルを処理してカラーマップファイルを作成してください。 - これで{キャリブレーション印刷}メニューを使って印刷でき、使用しているプリンターと用紙用のカラーマップファイルの名前を求められます。 - スキャナーはスキャンした画像をわずかに非長方形の形に歪ませることがあります。この場合、余白をクロップしようとしたときに気づくでしょう:太い緑色の余白線がクロップ用の四角形と完全には一致しません。この場合は、まず{パースペクティブ}を使って画像を正方形にしてから余白をクロップしてください。 - スキャンしたチャート画像を編集する際は、最も暗い行が一番上にあることを確認してください。カラータイルを囲む余白をクロップしてください。カラータイルを囲む太い緑色の余白線をガイドとして使用してください:この線を正確に切り取り、タイルのみを残してください。クロップの四角形を調整する際は2倍拡大で作業してください。正確なクロップが重要です。クロップが正確でないと、計算されるタイルの位置がずれ、計測された色が間違っている可能性があります。小さな誤差は許容されます。クロップの四角形を1ピクセル単位で動かすにはキーボードの矢印キーを使用できます。矢印キーが動かすのは、マウスで最後に引っ張った角です。 - 出力されたカラーマップファイルは、キャリブレーションに使用した用紙とプリンターの設定でのみ使用できます。他の組み合わせにはそれぞれ独自のキャリブレーションとカラーマップファイルが必要です。 - ^結果^(私の Canon プリンター) +image: printer-calibrate.jpg +image: printer-cal-study.png - 上のチャートは3枚の画像の写真です: 左上:カラーチャート写真の印刷 右上:同じ写真のキャリブレーション後の印刷 下:カラーチャート自体 3枚とも一緒に撮影されているため、カメラによる誤差はすべての画像で等しく、比較は妥当なものになります。 - - TOPIC: ギャラリーメニュー - - TOPIC: ギャラリー概要 +image: image-management.jpg - thumbnail 画像のギャラリーは、ファイルフォルダー、画像検索の出力、組み込みのギャラリー(最近使用したファイル、最新ファイル)、またはアルバム(指定した名前を持つ画像ファイルの順序付きリスト)のいずれかを表すことができます。実用性とパフォーマンスの理由から、フォルダーは数千ファイル程度に抑えることを推奨しますが、上限は強制されていません。 - ^ギャラリーのスクロール ギャラリーは、キーボードの上下矢印キー、ページアップ/ダウンキー、またはスクロールバーを使って上下にスクロールできます。[home]と[end]キーも使用できます。スクロールバーを左クリックして押し続けると、ギャラリーはクリック位置まで素早くスクロールします。スクロールバーを右クリックして押し続けると、ギャラリーはクリック位置までゆっくりスクロールします。マウスボタンを押し続けたまま横に動かすと、スクロール速度が上がります。 - - TOPIC: thumbnail 表示 現在のギャラリー内の画像ファイルが thumbnails の配列として表示されます。thumbnail のサイズを変更するには Zoom メニューボタンまたは[+][-]キーを使用してください。 - - TOPIC: metadata 表示 現在のギャラリー内の画像ファイルが、Fotocx が使用する基本 metadata とともに表示されます。カスタムのインデックス済み metadata tags が定義されている場合、これらは標準の tags に続けて表示されます。{ファイルをインデックス}を参照してください。 - - TOPIC: 最近使用したファイル 直近に見た1000件の画像ファイルがギャラリーに表示され、そこから表示または編集するファイルを選択できます。 - - TOPIC: 最新ファイル 直近に追加または変更された1000件の画像ファイルがギャラリーに表示され、そこから表示または編集するファイルを選択できます。最新の画像を判定するために、EXIF の撮影日を使うかファイルの更新日を使うか選択できます。 - - TOPIC: ギャラリーの並び替え 並び替えのキーと昇順/降順を選択します。Reset チェックボックスは、すべてのギャラリーをファイル名昇順にリセットします。 - アルバムギャラリーを並び替えた場合、出力はそのアルバムを置き換えるのではなく、-sorted という名前の新しいアルバムを作成します。 - ^ファイル名/番号 これはファイル名によるソートを変更したものです。複数のファイルが同じ位置に埋め込まれた数値だけが異なる名前を持つ場合、このグループのファイルは埋め込まれた数値の順にソートされます。ここでの例は違いを示しています: アルファベット順: xxx1xx xxx11xx xxx123xx xxx3xx 数値順: xxx1xx xxx3xx xxx11xx xxx123xx - ^検索機能からの metadata ギャラリーが{画像を検索}の「metadata レポート」オプションで生成され、標準レポートにオプションの metadata tags を追加していた場合、これらの metadata tags でギャラリーを並び替えることができます。カメラのメーカー、レンズ情報、ISO レベル、露出時間など、利用可能な metadata で並び替えることができます。 - - TOPIC: ギャラリーフィルター 現在のギャラリーの一部を選択して、選択した画像ファイルを含む "gallery_filter" という名前のアルバムを作成します。 ^選択オプション: • すべてのファイル:すべての画像ファイルを選択 • オリジナル:オリジナルファイル(バージョン番号なし) • バージョン:バージョン管理されたファイル(編集済み) • 最新バージョン:最新バージョン(バージョンがない場合はオリジナル) • 評価範囲:指定した範囲内の評価のファイル • keyword 名:指定した keywords のいずれかを持つファイル(カンマ区切り) • ファイル名テキスト:指定したテキスト文字列のいずれかを含むファイル(カンマ区切り) - - TOPIC: ギャラリーホーム TOPIC: ギャラリーの末尾 現在のギャラリー内の最初または最後の thumbnail へ移動します。 - - TOPIC: 現在のファイルのフォルダー 現在の画像ファイルから現在のギャラリーを設定します。他の作業をした後に現在のファイルのギャラリーに戻りたい場合に便利です。 - - TOPIC: 最近使用したフォルダー 最近使用したギャラリーから現在のギャラリーを設定します。これにより、最近のギャラリー間をより簡単に行き来できます。 - - TOPIC: フォルダーツリー +image: folder-tree.png - 最初はすべてのトップ画像フォルダーが表示されます。[+]をクリックするとサブフォルダーが展開され、[-]をクリックすると折りたたまれます。任意のフォルダーをクリックすると、そのフォルダー内の画像のギャラリーが表示されます。画像コレクション内のどこへでも移動できるよう、このウィンドウを開いたままにしておいてください。この機能はギャラリー上部パネルの[TOP]ボタンからも利用できます。 - - TOPIC: ファイルを選択 アルバムの作成や一括処理機能への入力として使う画像ファイルを事前に選択します。これらの機能は既定でこの事前選択されたファイルを使用しますが、これらを変更したり最初からやり直したりすることもできます。手順{画像ファイルを選択}を参照してください。 - - TOPIC: ブックマーク 既存のブックマークを表示します。ブックマークは、ユーザーが名前を付けた選んだ場所(フォルダー/ファイル名)です。ブックマークをクリックすると、その場所から始まる thumbnails のギャラリーが表示されます。ブックマークの追加、削除、名前変更を行うには[ブックマークを編集]を選択してください。 - - TOPIC: ブックマークを編集 ブックマークを編集を開始した後、ギャラリー thumbnail をクリックしてこの場所をブックマークリストに追加します。割り当てられるブックマーク名は、最初は thumbnail のファイル名になります。名前は編集できます。既存のブックマークをマウスクリックで選択すると、その名前が入力欄に表示されます。名前を変更するか、[削除]を押してブックマークを削除できます。新しいブックマークは、最後に選択したブックマークの場所の後に挿入されます。順序を変更するには、Fotocx ホームフォルダー内の "bookmarks" ファイルを編集してください。 - - TOPIC: MAPS MENU - - TOPIC: 世界地図 +image: map-click.jpg - これは、街レベルから大陸レベルまで拡大縮小(ズーム)できるインターネット世界地図です。マウスホイールで地図を拡大/縮小してください。地図をドラッグして中心を変更してください。地図には、metadata に geocoordinates を持つ画像に対応するマーカー(赤い点)があります。マーカーをクリックすると、その場所にある画像のギャラリー表示が得られます。地図上のマーカーエリア内にある画像が選択されます。有効なマーカーエリアは地図の縮尺に応じて変化します。拡大すると縮尺が広がり、1つのマーカーが近接する複数のマーカーに分かれることがあります。 - - TOPIC: マップで表示 現在の画像ファイルの位置を世界地図上に表示します。複数のマーカーが重なっている場合は、1つのマーカーが中心になるまで拡大してください。 - - TOPIC: アルバムメニュー - - TOPIC: アルバム アルバムとは、既存の画像から手動で組み立てられた任意の画像セットです。アルバムはそのメンバー画像ファイルのリストです。画像ファイル自体はコピーも変更もされません。1つの画像ファイルは複数のアルバムのメンバーになったり、1つのアルバム内に複数回存在したりすることができます。アルバム内の画像の追加、削除、並べ替えができます。アルバムを作成すると、名前で選択でき、ギャラリーとして表示されます。 - - TOPIC: アルバムを作成 新しいアルバムの名前を入力します。空のアルバムを作成することも、{ファイルを選択}で事前選択した画像ファイルを含むアルバムを作成することも、現在のギャラリーの画像を含むアルバムを作成することも、アルバムの初期画像を自分で選択することもできます。 - - TOPIC: アルバム名を変更 既存のアルバムを選び、新しい名前を入力します。 - - TOPIC: アルバムを削除 既存のアルバムを選び、完全に削除します。 - - TOPIC: アルバムを選択 利用可能なアルバムの一覧が表示されます。一覧から選択してください。 - - TOPIC: 現在のアルバム 現在(最後に使用した)アルバムからギャラリーを設定します。 - - TOPIC: ギャラリーからアルバムへ 現在のギャラリーをアルバムとして保存します。既存のアルバム名を選択([参照])するか、新しい名前を入力してください。 - - TOPIC: アルバムを編集 アルバムの thumbnail を右クリックし、ポップアップメニューから選択してください: • Add selected files here - 事前に選択したファイルがここに追加されます (thumbnail の左側/右側をクリックすると、その thumbnail の前/後に追加されます)。 • Add the current file (File View) here - 同様に動作します。 • Remove from album - クリックしたファイルがアルバムから削除されます。 - ^ドラッグ&ドロップ マウスで thumbnail をドラッグすることで、アルバム内の画像を並べ替えられます。マウスカーソルが小さな thumbnail 画像に変わるまで thumbnail をドラッグしてください。その画像を挿入したい位置までドラッグを続け、マウスボタンを離してください。ドラッグした画像を挿入したい thumbnails の間あたりにマウスを配置してください。ドラッグがウィンドウの上端または下端に近づくと、ギャラリーはスクロールしてさらに多くの画像を表示します。2つの Fotocx セッションを使うと、多数の画像の選択や移動をより速く行えます。任意の元のギャラリーから対象のアルバムの位置へ画像をドラッグ&ドロップできます。 - Fotocx を使ってファイルの名前を変更または移動した場合、アルバムのリンクは更新され、そのファイルはそれを含むアルバムに残ります。Fotocx の外でこれを行った場合、アルバムのリンクは失われ、そのファイルはアルバムから消えてしまいます。 - Batch Convert や Batch Copy/Move を使って画像ファイルの名前を変更または移動する場合、必要であればアルバムファイルを置き換えるオプションを選択してください。そうしないと、1つずつ置き換える必要があります。 - アルバム内の画像を含むフォルダーの名前は変更しないでください。アルバムのリンクが失われます。代わりに Batch Convert や Batch Copy/Move を使って画像ファイルを新しいフォルダーへ移動し、古いフォルダーが空になったら削除してください。画像ファイルを削除するには Batch Delete/Trash を使用してください。これにより、削除されたファイルもアルバムからパージされます。 - - TOPIC: アルバムを更新 +image: album-replace-file.png - 指定したアルバムファイルを指定した置換ファイルで置き換えるか、指定した既存ファイルの後に指定した新しいファイルを追加します。処理する1つ以上のアルバムを選択してください。ギャラリー表示で2つの thumbnails をクリックして、上記ダイアログの「old file」と「new file」を指定します。オプションを選択します:「new file」が見つかったすべての場所で「old file」を置き換える、または「new file」が「old file」の後にアルバムへ追加される。[proceed]を押してアルバムを処理してください。処理後、同じアルバムが選択され同じ「replace or add」オプションのままダイアログが繰り返されます。さらに2つのファイルを選択して[proceed]を押すことができます。 - - TOPIC: アルバム一括更新 +image: album-mass-update.png - これは、多数の画像ファイルの新しいバージョンを作成した後、1つ以上のアルバムを新しいバージョンに更新する必要がある場合に使う一括更新用のユーティリティです。すべてのニーズをカバーするわけではありません(それはおそらく不可能です)が、1つずつファイルを変更する手間を減らせることを期待しています。 - 1つ以上のアルバムを選択し、次の処理オプションのいずれかを選択してください: • Replace all with newest version only:アルバムが最新のファイルバージョンのみを持つよう更新されます。 • Replace all versions with newest version:すべてのファイルバージョンが最新バージョンのみに置き換えられます。オリジナルファイルが存在する場合、それは置き換えられません。 • Add newest versions to existing versions:既存のバージョンに最新バージョンがなければ追加されます。 • Replace all with original and all versions:すべてのファイルがオリジナルファイルとすべてのバージョンに置き換えられます。 • Replace all with original version and newest version:すべてのファイルがオリジナルファイルと最新バージョンに置き換えられます。 • Replace all with selected versions (*):すべてのファイルが選択したバージョンのみに置き換えられます。これにはオリジナル(バージョンなし)ファイルも含まれます。 • Replace all versions with selected versions (*):すべてのファイルバージョンが選択したバージョンのみに置き換えられます。オリジナルファイルが存在する場合、それは置き換えられません。 • Add selected versions to existing versions (*):既存のバージョンに選択したバージョンがなければ追加されます。 • Replace all with original and selected versions (*):すべてのファイルがオリジナルファイルと選択したバージョンに置き換えられます。 - (*) 選択したファイルを使う4つのオプション:選択したファイルのリストは{ファイルを選択}機能によるものです。選択したファイルのいずれとも一致しないアルバムファイルはアルバムにそのまま残ります。選択したファイルと一致するファイルのみが上記の規則に従って変更されます。一致の判定は、バージョンや拡張子を除いたファイル名に基づきます:'asdfg.png' と 'asdfg.v01.jpg' は一致とみなされます。 - 例:Replace all versions with selected versions:アルバムに filename.jpg と filename.v02.png があり、選択したファイルのリストに filename.v04.jpg が含まれている場合、更新後のアルバムの結果は次のようになります:filename.jpg と filename.v04.jpg - - TOPIC: スライドショー +image: slide-show.jpg - ^モニターの分数スケーリング 一部のシステムでは、分数スケーリングによって Fotocx のスライドショーアニメーションのパフォーマンスに問題が生じます。必要であれば、これを無効にして他の方法でアプリケーションのフォントサイズを大きくしてください。Fotocx のフォントサイズは{設定}メニューにあります。 - スライドショーダイアログ(左上)で[アルバムを選択]を押し、一覧からアルバムを選択してください。必要に応じてダイアログの他の設定を変更した後、[開始]ボタンを押すとアルバム内の最初の画像からスライドショーが始まります。一時停止したスライドショーを再開するには[再開]を、または thumbnail をクリックして選んだ別の画像から開始できます。スライドショーを終了してダイアログに戻るには Escape キーを使用してください。 - メインダイアログのコントロール • Caption Time:タイトルと説明を表示する秒数。 • Image Time:画像のみを表示する秒数。 • Clip Limit %:余白を取り除くため画像をこの量までクリップします。 • Full Screen:チェックすると、メニューなしで画像を全画面表示します。 • Auto-replay:チェックすると、終了後にスライドショーが最初から再開します。 • Random Image:チェックすると、画像の順序がランダムになります。それ以外はアルバムの順序です。 - キーボードのキーでスライドショーを操作できます。表示するには[キーボード]を押してください。 - 以下のキーボードキーは操作に割り当てられており、変更できません: • Escape:スライドショーを中断してメインダイアログに戻ります。 • 左/右矢印キー:いつでも前後に移動でき、スライドショーはそこから続行されます。 - 画像間のアニメーション遷移、および個々の画像の表示時間とズームの動作は、以下で説明するダイアログを使ってカスタマイズできます。 - [遷移]を押すと、画像間の遷移を選択・カスタマイズするダイアログが開始されます。これには、多くのアニメーション化された画像置き換え方法が含まれます(例えば、新しい画像が中心から拡大して古い画像を置き換えるなど)。使用する遷移と、それらをランダムに使うか順番に使うかを選択してください。time パラメーターは遷移の長さを設定します。preference パラメーターは相対的な優先度を指定し、ランダムシーケンスが選択された場合にその遷移がどのくらいの頻度で使われるかに影響します。 - [読み込み]と[保存]ボタンを使うと、遷移設定をファイルに保存して後で読み込むことができます。これらのファイルはスライドショーファイルとは独立しています。スライドショーは既定でそのスライドショー(アルバム名)に対して最後に使用した遷移設定を使いますが、[読み込み]ボタンで別の設定を読み込んだり、ダイアログで変更したりして、これらをいつでも置き換えることができます。 - [画像ファイル]を押すと Image Preferences ダイアログ(右上)が開始されます。これは任意です。アルバム/ギャラリー表示で thumbnail をクリックすることで、カスタマイズする画像を選択します。ダイアログには既定の設定、またはこのスライドショーでこの画像に対する前回の設定が入力されます。変更を入力して[done]を押すか、次にカスタマイズする画像をクリックしてください。 - Preference:ランダム画像順序が選択されている場合、この数値はその画像の相対的な優先度を示します。中立値は10です。新しい値を入力すると、画像のランダムシーケンス内でこのファイルが選ばれる確率を増減できます。例えば値20は確率を2倍にします。値0はこの画像を表示しないようにします。この画像は、アルバム内の画像数の1/3または10のうち小さい方の回数だけブロックされます。 - ダイアログには、カスタマイズ可能な画像イベントが時系列で表示されます: • 指定した時間待機します(ゼロでも可)。 • 以下のテキストタグを並行して表示します:画像名(ファイルのベース名)を指定した時間、画像タイトル(あれば)を指定した時間、画像の説明(あれば)を指定した時間。 • 画像のズームを開始する前に指定した時間待機します(ゼロでも可)。 • 指定した時間をかけて画像を通常サイズから拡大、またはその逆にズームします。どちらのオプションも選択されていない場合、ズームは行われません。 • zoom-in:通常サイズから開始し、ズームの中心を指定した位置へ移動させながら画像を拡大します。 • zoom-out:指定したズームの中心で拡大サイズから開始し、画像を通常サイズに縮小します。 • [zoom center] - このボタンを押してから、画像 thumbnail をクリックして画像のズームの中心を指定してください。 • ズーム後に指定した時間待機します(ゼロでも可)(既定値はメインダイアログの「image time」設定です)。 • 指定した遷移、または優先しないことを示す「next」(ランダムに選択されます)を使って次の画像へ遷移します。 - - TOPIC: カスタムメニュー +image: custom-menu.png - これにより、複数のメニューからよく使う機能を集めて1つのカスタムメニューにまとめることができます。特定の画像ファイルやアルバムを開くエントリを追加することもできます。このメニューにはスクリプト機能とプラグイン機能も含まれます(下記参照)。 - メニューの最後のエントリ「Edit Menu」は、メニュー一覧自体を編集するためのテキストエディターを開きます。メニュー名は Fotocx のメニュー名と正確に一致する必要がありますが、大文字小文字は区別されません。 - メニューエントリは以下の形式を使用できます: • # コメントテキスト:何もしないコメント • メニュー名 # ポップアップチップ:Fotocx のメニュー名と任意のポップアップチップ • file :指定したファイルを開く • album :指定したアルバムをギャラリーとして開く - 以下のエントリは既定で存在しており、変更・削除しないでください:Edit Script、Run Script、Batch Script、Plugins、Edit Menu。詳細は以下で説明します。 - - TOPIC: スクリプトファイル メニュー機能: • Edit Script - 1つの画像ファイルに対して一連の編集を行い、すべての機能と設定を名前付きのスクリプトファイルに記録します。 • Run Script - 編集機能と同様に、現在の画像ファイルに対してスクリプトファイルを実行します。 • Batch Script - 任意の数の画像ファイルを選択し、一括モードですべてに対してスクリプトファイルを実行します。 - スクリプトファイルを使うと、一連の編集を一度定義し、後で単一または複数の画像ファイルに対して繰り返すことができます。 - ^スクリプト化可能な編集機能 一部の編集機能は画像上でのマウスドラッグを使用します(例えばすべてのゆがみ補正機能)。マウスドラッグは記録されないため、これらはスクリプト化できません。これらの機能の使用はブロックされます。 - 現在スクリプト化できる機能は次のとおりです: • Edit: Retouch、Margins、Color Mode、Area Fill • Repair: Sharpen、Blur Normal、Blur Graduated、Denoise、Defog、JPEG Artifacts、Anti-Alias、Adjust RGB • Refine: Flatten Histogram、Local Contrast、Amplify Contrast、Global Retinex、Local Retinex、Local Contrast、Saturation、Soft Focus、Brightness Ramp • Effects: Outlines、Sketch、Cartoon、Emboss、Tiles1、Tiles2、Painting、Texture、Pattern、Dither、Engrave、Set Colors、Shift Colors、Custom Kernel - - TOPIC: スクリプトを編集 ダイアログで[開始]を押してください。スクリプトのファイル名を選択してください。現在の画像ファイルの編集を開始してください。任意の順序で希望の編集機能を使用してください。各編集は、使用したすべてのダイアログ設定とともにスクリプトファイルに記録されます。完了したら[close]を押してスクリプトファイルを閉じ、指定したファイル名で保存してください。 - - TOPIC: スクリプトを実行 ポップアップメニューから保存したスクリプトファイルの1つを選択してください。通常の編集機能と同様に、現在の画像ファイルに対してスクリプトが実行されます。 - - TOPIC: 一括スクリプト ダイアログで[ファイルを選択]を押してください。標準のファイル選択ダイアログ{画像ファイルを選択}を使って編集するファイルを選択してください。完了したら[スクリプトを選択]を押してください。ポップアップメニューからスクリプトファイルを選択してください。選択したすべてのファイルに対してスクリプトが実行されます。変更されたすべての画像は新しいバージョンとして保存されます。RAW ファイルを処理する場合、対応する出力は TIFF-16 ファイルになります。 - - TOPIC: プラグイン +image: plugins.png - プラグイン機能は、Fotocx 内で他の画像エディター(例えば Gimp)を使用する方法です。Rawtherapee のような RAW 画像エディターを使用し、その後 Fotocx で追加の編集を行うことができます。 - ^使用手順: • Fotocx で処理するファイルを開く • プラグインメニューを開始し、希望のプログラム(例えば Gimp)を選択する • プラグインプログラムが起動し、Fotocx から渡されたファイルを開く • プラグインプログラムを使って希望の編集を行う • 完了したら、入力ファイルと同じ名前で出力ファイルを保存する。ファイルの拡張子は変わってもかまいません。 • プラグインプログラムを閉じる。 • Fotocx はプラグインの出力ファイルを現在のファイルの編集済みバージョンとして開く。 • 追加の編集を行うか、編集したファイルを新しいバージョンまたは新しいファイルとして保存する。 - 左側にプラグインメニューの例があります。最後のエントリ「Edit Plugins」は、右側のテキスト編集アプリケーションを起動します。テキストエディターを使って、プラグインメニュー名と対応するプラグインプログラムを起動するコマンドを定義してください。書式は次のとおりです: menuname = plugin-command %s TIP = 上記コマンドの説明 「plugin-command」はプラグイン機能のシェルコマンドで、「%s」は現在のファイル名がコマンドに挿入される位置です。「%s」の周りに引用符を付けないでください。これは自動的に追加され、空白やその他の特殊文字を含むファイル名を処理できるようにします。上に示した例は「Gimp」という名前のメニューで、コマンド "gimp %s" を実行します。TIP テキストは任意です。指定した場合、メニュー名の次の行に記載します。メニューエントリの上にマウスを重ねると、このテキストがメニューテキストの横に表示されます。 - 入力ファイルと出力ファイルの両方を指定する必要があるコマンドもあります。この場合、両方の位置に '%s' を指定してください。コマンドが画像ファイルを処理しない場合は '%s' を省略してください。 - ^エリアを選択 入力ファイルに選択エリアがある場合、このエリアのみが変更されます。プラグイン機能は画像全体を編集しますが、その結果が Fotocx によって処理される際、選択エリア内の変更のみが保持されます。 - - TOPIC: ズーム - ^Zoom ボタン このボタンを左または右クリックすると、{ファイル表示}の画像サイズ、または{ギャラリー表示}の thumbnail サイズが増減します。これはギャラリー表示モードが{thumbnail 表示}の場合にのみ適用されます。{metadata 表示}の場合は何も行われません。 - - TOPIC: 前/次 - このボタンを左または右クリックすると、現在のギャラリー内の前または次のファイルが開きます。左/右矢印キーも使用できます。 - - TOPIC: ファイル保存 - +image: file-save.png - +image: file-save-as.jpg - 最初のダイアログで「new version」、「new file」、「replace file」のいずれかを選択してください。 - ^新しいバージョン 現在の画像ファイルを新しいバージョン番号で保存します。バージョン番号付きのファイル名は "filename.vNN.ext" の形式で、NN は01から99までの番号です。ファイル名にバージョンがない場合、バージョン .v01 が作成されます。ディスク上に既にファイルバージョンが存在する場合、次に高いバージョン番号が使用されます。JPEG ファイルの場合、既定の品質が使用されます - {設定}を参照してください。 - ^新しいファイル 上記の2番目のダイアログが開き、現在の画像を選択したファイルに保存します。これは元のファイル、他の既存ファイル、または新しいファイルのいずれかにできます。ファイルは JPEG、PNG、JXL、TIFF の形式で保存できます。 - JPEG の場合、1~100の範囲で品質値を選択できます。値が低いほどファイルは小さくなり画質は低下します。70以上の値は100(最高品質、最大ファイルサイズ)と区別が難しくなります。ダイアログで値を変更しない限り既定の JPEG 品質が使用されます。既定値は{設定}から取得されます。品質70で保存したファイルと100で保存したファイルの違いを見分けることはできませんが、ファイルサイズの差は非常に大きくなります。透明なエリアは黒くなります。JPEG は透明度に対応していません。 - PNG ファイルと TIFF ファイルは、画質を損なうことなく圧縮され、JPEG よりはるかに大きくなります。色ごとに8ビットまたは16ビットで保存できます。 - 「make current」がチェックされている場合、保存されたファイル(新しいファイル名)が現在のファイルになります。 - ^ファイルを置換 現在の画像ファイルを自身に上書き保存します。 - ^権限^ は入力ファイルからコピーされます。権限を編集するには[変更]ボタンを押してください。 - - TOPIC: metadata メニュー - - metadata は画像ファイル内に保存されているテキストデータです。デジタルカメラは、日時、カメラや撮影パラメーターに関する技術データ、位置データ(カメラに GPS 受信機がある場合)など、一部の metadata を自動的に作成します。その他のデータはユーザーが追加できます。例えば、タイトル、説明、評価、keywords です。Fotocx は、フォルダー名やファイル名(部分名を含む)とともに、あらゆる metadata を使って画像コレクションを検索でき、一致する画像のギャラリーを生成します。ほとんどの場合、検索はほぼ瞬時に行われます。 - - TOPIC: 主要な metadata を表示 TOPIC: すべての metadata を表示 +image: view-metadata.jpg - View Main Meta 機能は、現在の画像ファイルのよく使われる metadata を表示します。これには、写真の日時、シャッター速度、焦点距離、画像サイズ、ISO などが含まれます。デジタルカメラはこのデータを画像に保存します。metadata には、ユーザーが追加したデータ(keywords、タイトルまたはキャプション、説明、撮影者や後の編集者が追加したコメント(公開された画像で見つかることがあります))も含まれることがあります。 - 画像が編集されると、その編集の記録が metadata に保存されます。View Main Meta には、行われた編集の履歴が表示されます。 - View All Meta はすべての利用可能な metadata をレポートし、おそらく気にする必要のない100項目以上を含むことがあります。 - View Main Meta ウィンドウの[Extras]ボタンをクリックすると、右に示すダイアログが開き、レポートに追加の tags を加えることができます。View All Meta レポートで利用可能な tag はどれでも簡易レポートに追加できます。左の列の tag をクリックすると右の列とレポートに追加されます。右の列の tag をクリックすると削除されます。「Other Tag ...」という項目をクリックすると、既定リスト(最もよく必要とされる tags に限定されています)に含まれない任意の tag 名を入力できます。 - Fotocx は画像の編集と検索に次の metadata tags を使用します: • Title - 画像の短いタイトル • Description - 画像の説明 • Date/Time Original - 撮影日時 • Rating - 0~5つ星 • Country - カメラの GPS または手動で追加 • Location - EXIF 名は都市名 • Geotags - latitude/longitude • Keywords - ユーザーによる画像の識別子 • Camera data - メーカー、モデル、レンズ • Exposure data - 時間、F値、焦点距離、ISO これらの tags は{メイン metadata を編集}機能で編集します。他の tags も、以下で説明する多少手間のかかる方法で編集・検索できます。 - 一度に多くの画像ファイルへデータを追加するための一括機能もいくつかあります。{一括処理メニュー}を参照してください。 - - TOPIC: keywords 概要 画像ファイルには識別または分類用の keywords を持たせることができます。これらを使って、大きな画像コレクションから望みの keywords を持つ画像を検索できます。典型的な keywords:被写体、出来事、場所、人物や物など。keywords は画像 metadata 内に保存されます。keywords は通常1語ですが、空白やその他の区切り文字を含む短いフレーズも使用できます。カンマとセミコロンは keywords 間の区切り文字として使われるため、keyword 内では使用できません(外部標準による制約です)。"arizona scenery" のような複合 keyword も使用できますが、柔軟性を高めるため代わりに2つの keywords を使うことをお勧めします:どちらか一方またはその両方の keyword を持つ画像を検索できるようになります。 - 希望の keyword または keywords を持つすべての画像を素早く見つけ、ギャラリーウィンドウに表示できます。フォルダー名やファイル名を意味のある形で使用している場合、これらの名前を使って画像を検索することもできます。日付、評価、場所、その他の metadata tags でも画像を検索できます。これらを keywords に重複させる必要はありません。下記の{画像を検索}を参照してください。 - ^管理された keyword システム これは、画像に keywords を追加する前に keyword システムを計画したい場合に適しています。このシステムでは、限られた数の keyword カテゴリー(例えば、人物、場所、物、出来事、芸術、風景など)を作成します。keywords は、画像に割り当てる際に必要に応じて作成しカテゴリーに割り当てることができます。画像に keyword を付けるには、利用可能な keywords の一覧(カテゴリー別に整理され、カテゴリー内はアルファベット順)をポイントしてクリックします。新しい keyword が必要な場合、それが画像に最初に割り当てられたときに作成されます。ピックリストからの視覚的な位置特定が十分速く行えるよう、1つのカテゴリー内の keywords の数は理想的には200程度未満にすべきです。 - ^管理された keyword システムの利点 • 一貫性のない keyword 名を防ぐ(例:'landscape' と 'scenery') • 別のスペルやタイプミスを防ぐ(例:susan、susy、susna) • 他の keyword を含む keyword を防ぐ(例:scenery、lake) • keywords に上記のような誤りがないため、検索がより信頼できるものになる • keywords を割り当てる際に、管理されていないシステムでの何千もの混沌とした keywords ではなく、利用可能な keywords の概要を把握できる - 大きなリストから keywords を選ぶのは遅くなることがあります。これは次の3つの方法で緩和されています: • 直近に使用した約10個までの keywords が metadata 編集ダイアログに表示され、簡単に確認・選択できます。同じ時に撮影された一連の写真は多くの keywords を共有する可能性が高いため、keywords の追加がより簡単かつ迅速になります。 • 希望の keyword 名を入力し始めるだけでも構いません。一致する候補が少数になった時点で、一致する keywords のポップアップリストが表示されます。その後、希望の keyword をクリックして画像に追加できます。一致する keyword がない場合、新しい keyword を定義済み keywords のリストに追加するオプションがあります。 • カテゴリーを選んで、より小さなピックリストを表示することもできます。 - keywords が広く定義され数が少ない場合、keywords による検索結果は大きくなりますが、目的の画像を目視で見つけるのはかなり速くなります。物理的なファイルの順序は保たれます:フォルダー内で一緒に配置されている画像ファイルは、検索結果でも一緒に表示されます。 - インターネットからダウンロードした画像には、しばしば keywords が含まれています。これらは当然整理されておらず、まとまりなく混沌としています。管理された keyword システムを使用している場合、そのような画像を確認し、keywords をシステムに合わせて整理するか削除するのが最善です。存在する新しい keywords は自動的にカテゴリー "nocatg" の下に追加されます。keyword 一覧に不要な keywords が見られる場合は、keyword による{画像を検索}を使って不要な keywords を持つ画像を見つけ、修正または削除してください。 - ^ランダムな keyword システム 特定のシステムを想定せず、必要に応じて keywords を作りたい場合もあるでしょう。あるいは既に数千の keywords があり、管理された keyword システムへの変換が難しい場合もあります(ただし不可能ではありません:Fotocx は keyword 名を一括変換できます)。この場合、単純に画像に keywords を入力し、必要に応じて新しい keywords を作成できます。それでも keywords をある程度整理された状態に保つ機能はあります:入力した文字に一致する既存の keywords は、候補が少数になった時点で表示されます。例:「new」と入力すると、New York、New Delhi、Newman などの keywords の一覧が表示されます。これらのいずれかが目的のものであれば、クリックしてその keyword を選択します。そうでなければ入力を続け、最終的に Enter を押して新しい keyword を作成します。keywords で画像を検索する際、希望の keyword 名を入力するか、利用可能な keywords の一覧から選ぶことができます。入力した最初の数文字に一致する利用可能な keywords が表示され、その一覧から選ぶことができます。画像内のどこにも存在しない検索 keyword は入力できません。ランダムな keyword システムは、おそらく数千の keywords になるでしょう。これはあまり実用的ではないかもしれません。 - - TOPIC: GEOTAGS OVERVIEW 最近のカメラは、内蔵の GPS 受信機を使って各写真の位置を記録できます。latitude、longitude(および場合によっては都市/場所名と国名)が画像ファイルの EXIF metadata に記録されます。{メイン metadata を編集}機能でも位置データを入力または修正できます。位置は、拡大縮小可能な世界地図をクリックして指定することもできます。 指定した位置や地域の画像を見つける機能: • {画像を検索}:場所名で検索(複数の名前、部分一致にも対応)。 • {場所/日付}:国、場所、日付のグループで検索 • マップの場所で見る画像:マップマーカーをクリックすると、そのマーカーの場所にあるすべての画像が表示されます。 - カメラの GPS による場所名(都市名やその他の地名、国名)は標準化されておらず、混乱していることがあります(例:Munich、München、MONACO)。これへの対処方法は以下で説明します。 - - TOPIC: メイン metadata を編集 +image: edit-meta.jpg - Edit Main Meta 機能は、画像に基本的な metadata を追加するために使用します。Edit Main Meta を使用する前に、{keywords 概要}と{GEOTAGS OVERVIEW}(上記)をお読みください。 - Edit Main Meta は、最もよく使われる metadata(画像の日時、評価、タイトル、説明、位置データ、keywords)を編集するために使用します。ダイアログは最初、現在の画像のデータを表示します。追加または変更を行った後、[適用]を押して画像ファイルを更新してください。metadata の変更に対する自動的なファイルバージョン管理はありませんが、必要であれば File Save > New Version を使用できます。 - このダイアログは、ファイル表示では現在の画像の、ギャラリー表示ではクリックした thumbnail の metadata を表示します。編集ダイアログは、新しい画像が開かれるか新しい thumbnail がクリックされると自動的に更新されます。 - 画像の日付は、利用可能であれば Image Date として表示されます。欠落している場合は入力でき、変更も可能です。yyyy:mm:dd 形式で完全な日付を入力するか、yyyy または yyyy:mm というより短い形式を入力できます。月/日が欠落している場合、検索の下限と比較する際は論理的に01:01と、上限と比較する際は12:31と等価になります。[前へ]ボタンは、前回入力したデータから日付を埋めます。これは一連の画像への日付入力を簡単にするためのものです。時刻が重要な場合、hh:mm[.ss]という形式で時刻を追加できます。入力全体の形式は次のとおりです:yyyy:mm:dd hh:mm:ss - 画像のタイトル、説明、評価(0~5つ星)を入力できます。タイトルまたは説明を編集するには、対応する[編集]ボタンを押してください。これにより、大きな文字数制限を持つテキストエディターがポップアップします。意図的な改行には[enter]キーを使用できます。Fotocx ではこの改行が有効に機能しますが、他の画像ビューアーではピリオドに置き換えられることがあります。 - 既存の keywords は Image Keywords に表示されます。利用可能な keywords は下部の Defined Keywords ウィンドウに表示されます。これらの keywords の1つをクリックすると画像に追加できます。keyword は Image Keywords でクリックすると画像から削除できます。最近追加した keywords は Recent Keywords に表示されます。これは、新しいバッチの画像に keywords を追加しやすくするための便利な機能です。同じ keywords が再び使われることが多いためです。同じようにポイントしてクリックしてください。 - 定義済み keywords の一覧が長い場合、希望の keyword を Enter Keyword に入力する方が簡単な場合があります。ここまで入力した内容に一致する既存の keywords が Matching Keywords に表示され、これらのいずれかをクリックすると画像に keyword を追加できます。入力した keyword が新しい場合(一致する keyword が表示されない場合)、keyword の入力が完了したら[新しい keyword を追加]を押してください。それが画像とカテゴリー "nocatg" を持つ定義済み keywords の一覧に追加されます。 - keyword カテゴリーを使用している場合、カテゴリーを選択すると、定義済み keywords の一覧にはそのカテゴリーの keywords のみが表示されます。 - [適用]ボタンは、データを画像ファイルと、画像検索に使用される metadata インデックスファイルに書き込みます。 - (ダイアログ下部の)[前へ]ボタンを使うと、直前に表示または編集した画像から利用可能なすべてのデータを読み込むことができます。これは、多くの同じデータを共有する一連の画像の処理を高速化するために使用できます。 - ^geotags の追加 {メイン metadata を編集}ダイアログで場所名と geocoordinates を追加する方法はいくつかあります。 - カメラの GPS カメラの GPS センサーが場所名と geocoordinates を挿入している場合があります。言語が希望のものでなかったり、すべて大文字だったり、その他の乱れがあることがあります。[clear]ボタンで最初からやり直し、新しいテキストを入力してください。 - [検索] ボタン 画像ファイルのどこか、または既知の場所の膨大なリスト(worldcities.txt)から場所を検索します。Location にいくつかの先頭文字を入力して[検索]を押してください。一致する場所のピックリストが表示されたら、その中から選んでください。何も表示されない場合は、[マップ]を使って地図上の場所をクリックしてください。必要に応じて場所名と国名を修正してください。この場所は既知となり、以降選択できるようになります。 - [前へ] ボタン 編集中の画像が直前に編集した画像と同じ場所データを持つ場合、[前へ]を押すと以前に使用した場所データが入力されます。 - {geotags の一括設定}を使うと、多数の画像ファイルに一度に位置データを追加できます。 - - TOPIC: 任意の metadata を編集 +image: edit-any-metadata.png - これは、現在の画像ファイルの任意の metadata を編集するダイアログです。編集で最もよく使われる tags が左側に一覧表示されます。[全リスト]ボタンを押すと、現在の画像ファイルで利用可能なすべての tags の一覧(数百に及ぶこともあります)が表示されます。[簡易リスト]を押すとよく使われる tags の一覧に戻ります。一覧内の tag をクリックすると、現在の tag の値が取得されます。必要であれば値を変更し、[更新]を押してください。一覧にない tag 名を編集するには、tag 名を入力して[取得]を押し、現在の値があれば取得してください。その後、値を入力または変更して[更新]を押してください。tag を削除するには[削除]を押してください。tag 名は小文字で、空白の有無に関わらず入力できます。例えば "Subject Distance" と "subjectdistance" のどちらでも機能します。一部の tags は変更できません。例えば「image width」は画像のピクセル幅であり、画像のピクセル幅を変更することによってのみ変更できます。簡易リストの元データはテキストファイル /meta_picklist です。このリストへの tags の追加や削除ができます。 - - TOPIC: metadata を削除 削除する tag 名を指定するか、All を選択してください。metadata が削除されます。All を使用すると、存在する可能性のある識別情報を画像から一掃できます。一部の tags(例:File Name)は削除できません。 - - TOPIC: metadata をコピー Fotocx で作成された結合画像(HDR、パノラマ、マッシュアップなど)には、既定では metadata が含まれません。この機能を使って、入力画像のいずれか、または他の任意の画像から metadata をコピーしてください。metadata のコピー元ファイルとコピー先ファイル(ダイアログの「target file」)を選ぶには[参照]ボタンを使用してください。 - - TOPIC: metadata を修復 metadata を編集しようとするとエラーメッセージが表示される画像ファイルがある場合、この機能を使用してください。不正な metadata を削除し、残りは保持します。 - - TOPIC: keywords を管理 +image: manage-keywords.png - keywords を作成し、必要に応じてカテゴリーにグループ化します。keywords にカテゴリーを割り当てることで、整理しやすくなり、画像に keywords を追加する際により素早く見つけられるようになります。これは任意であり、keyword 検索には何の役割も果たしません:画像には keyword のみが保存され、そのカテゴリーは保存されません。典型的なカテゴリーは、人物、場所、物、出来事、風景、建物、芸術などです。新しいカテゴリーで新しい keyword を追加するには、カテゴリーと keyword を入力し、[create]をクリックしてください。カテゴリーが空欄の場合、keyword は "nocatg" に割り当てられます。keyword を別のカテゴリーに割り当てるには、カテゴリー(太字テキスト)をクリックするか新しいカテゴリーを入力し、keyword をクリックして[create]を押してください。keyword は古いカテゴリーから新しいカテゴリーへ移動します。keyword を削除するには、keyword をクリックして[削除]を押してください。画像で使用されているがカテゴリーが割り当てられていない keywords は "nocatg" の下に表示されます。keywords が割り当てられていないカテゴリーは削除できます - カテゴリーをクリックし、keyword 名があればクリアして、[削除]を押してください。 - 注:新しく作成された keyword は、そのカテゴリーの keyword 一覧の末尾に追加されます。次回 Fotocx を起動すると、すべてのカテゴリーとその keyword 一覧はアルファベット順にソートされますが、"nocatg" は常に最後になります。 - - TOPIC: キャプション +image: choose-captions.png - ^Choose Captions メニュー ファイル表示モードで画像の左上に表示するテキストキャプションに、どの metadata tags を使用するかを選択します。 - ^Toggle Captions メニュー キャプションの表示を ON または OFF に切り替えます。キャプション表示を素早く有効/無効にするキーボードショートカットを割り当てられます。 - ^注:^ ファイル表示で画像の左上隅にマウスを移動すると、ポップアップ画像にタイトルと説明が表示されます。マウスを離すとこの画像は消えます。 - - TOPIC: 場所/日付 +image: image-locations.jpg - これは、指定した場所、または場所と日付の範囲で撮影されたすべての写真を素早く見つける方法です。ダイアログで2つのオプションから選んでください:レポートにすべての画像を含める、または直前の Search 機能で見つかった画像のみを含める。次に、希望のグループ化レベルを選択してください: 国 国と場所 国と日付 国と場所と日付 日付と国 日付と国と場所 - 日付を含める場合、統合する日数の範囲を選択してください:範囲内の日付を持つ写真は最初の日付の下にまとめてグループ化されます。[proceed]を押すと、各グループ(国別、国と場所別など)の画像数を示すレポートが表示されます。これは並び順でもあります。上の例では、2004年11月2日にニュージーランドで撮影された写真が28枚あります。レポート内の行をクリックすると、それらの画像の thumbnail ギャラリーが表示されます。 - - TOPIC: タイムライン +image: timeline-report.jpg - このレポートは、月別の画像数のタイムラインを作成します。2つのオプションから選んでください:レポートにすべての画像を含める、または直前の Search 機能で見つかった画像のみを含める。結果のレポートで年と月をクリックすると、選択した月に撮影日(EXIF)を持つすべての画像の thumbnail ギャラリーが表示されます。上の例は2017年10月の208枚の画像を示しています。年「null」は撮影日のない画像を表します。 - - TOPIC: metadata tags この機能は、指定した metadata tag と値を使用するすべての画像ファイルを見つけます。ポップアップリストから tag を選択してください:評価、keywords、タイトル、説明、カメラ、追加でインデックスされた metadata - {ファイルをインデックス}を参照してください。利用可能な tag の値の一覧が、その tag の値を使用する画像ファイルの数とともに表示されます。「タイトル」と「説明」については、最初の60文字のみが表示され、この最初の60文字に一致する tag の値を使用するすべてのファイルがレポートされます。「カメラ」については、一致する値はメーカー、モデル、レンズの組み合わせです。 - - TOPIC: 自動検索 この機能は、Search Images 機能を使用する際に利用可能な選択条件のいずれかを満たす画像ファイルを抽出するために、シェルスクリプトファイルから使用できます(下記参照)。まず、Search Images 機能を使って希望の選択条件(例えばフォルダー/ファイル名、日付、keywords、その他の metadata)を設定してください。[保存]ボタンを使って、その条件を設定ファイルに保存してください。次のコマンドを使って Fotocx を起動し検索を実行してください: $ fotocx -m autosearch . 出力は /search_results に入ります。 - - TOPIC: 画像を検索 Search Images 機能を使うと、希望する任意の metadata(日付、keywords、場所など)を持つ画像を見つけられます。検索には metadata インデックスファイルが使用され、1秒間に数千枚の画像を検索できます。 - レポート形式は2種類あります:検索条件に一致するすべての画像を示す thumbnails のギャラリー、または thumbnails と metadata テキストを組み合わせた metadata レポートです。以下は metadata レポート形式の例です: +image: search-images-metadata.jpg - ^検索ダイアログ +image: search-images.jpg - ダイアログで、検索する画像を選択してください。all(すべての画像)または current set(現在のギャラリー内の画像、フォルダー・アルバム・以前の画像検索の結果のいずれか)のどちらかです。 - 次に、見つかった一致画像に対して行う操作を選んでください:「new set」は現在のセットを見つかった画像で置き換え、「add」はそれらを現在のセット(ギャラリー)に追加し、「remove」は現在のセットからそれらを削除します。画像を削除するには、現在のセットを検索する必要があります。 - 検索条件に一致するファイルについて、さらにどのバージョンを選択するかを指定できます:original、last version、または all versions です。「original」はオリジナルまたは未変更の画像(オリジナルが保存されていない場合は最初のバージョン)を意味します。「last version」は利用可能な最新または最後に編集されたバージョンを意味します。「all versions」はオリジナルとすべてのバージョンが取得されることを意味します。 - 希望のレポート種類を選択してください。ギャラリーレポートは、検索条件に一致するすべての画像を保持するのに必要なだけの thumbnail 画像のページです。metadata レポートには、各 thumbnail の横に thumbnail 画像と metadata tags の一覧の両方があります。これには標準の tags(日付、評価、keywords、geotags、タイトル、説明)と、tag 選択リスト(下記参照)で追加した他の metadata tags が含まれます。 - 検索条件を入力してください。希望の keywords、日付、星評価、テキスト(画像タイトルまたは説明)に含まれる単語、ファイルまたはフォルダー名、場所名を選択してください。詳細は以下を参照してください。 - 利用可能な keywords は Defined Keywords に表示され、ポイントしてクリックすることで選べます。定義済み keywords の一覧が長い場合、'enter keyword' に keyword の入力を始める方が簡単な場合があります。ここまで入力した内容に一致する既存の keywords が 'matches' リストに表示され、これらのいずれかをクリックすると検索リストに keyword を追加できます。 - keyword カテゴリーを使用している場合、カテゴリーを選択すると、定義済み keywords の一覧にはそのカテゴリーの keywords のみが表示されます。 - 日付範囲を入力して、検索をその範囲内の画像に絞ることができます。撮影日(カメラから)またはファイル日付(作成日または最終更新日)を選択してください。形式は yyyy:mm:dd です。最初の日付以降(指定されている場合)かつ2番目の日付以前(指定されている場合)の日付を持つ画像が選択されます。月/日が欠落している場合、下限日付では01/01、上限では12/31が既定値になります。時刻は任意で yyyy:mm:dd hh:mm という形式で指定できます。時刻が欠落している場合、00:00と23:59が既定値になります。 - EXIF 撮影日のない画像(例:スキャンした画像)を検索するには、最初の日付入力に "null" を使用してください。 - 指定した範囲内の評価を持つ画像に結果を絞り込むため、星評価の組を入力できます。下限値が欠落している場合は0つ星、上限値が欠落している場合は最高評価の5つ星を意味します。 - フォルダー名とファイル名を検索できます。search file names の欄に、画像フォルダー名やファイル名に使われている任意の数の名前をカンマ区切りで入力してください。「egypt cairo」という入力は、これらのいずれかの文字列を含むすべての画像フォルダー名またはファイル名に一致します。部分文字列も一致します。大文字小文字は区別されません。 - 画像のタイトルと説明を検索できます。search title/desc の欄に検索したい単語をカンマ区切りで入力してください。これらはすべての画像のタイトルと説明の各単語と照合され、一致する画像が選択されます。大文字小文字は区別されません。 - 場所を検索するには、search locations の欄に1つ以上の都市/場所名または国名をカンマ区切りで入力してください。入力した場所のいずれかに一致する geotags を持つ画像ファイルのみが選択されます。場所には都市、公園、その他の地名(metadata の「City」および「Country」フィールドに保存されているもの)を使用できます。大文字小文字は区別されません。 - ラジオボタン「all」と「any」は、keywords、テキスト、ファイル名、場所に適用されます。入力したすべての文字列を持つ画像、または入力したいずれかの文字列を持つ画像を選択できます。例:場所検索欄が「new york」で「any」が選択されている場合、New Zealand と York, England の画像も含まれます。「all」が選択されている場合、New York にある画像のみが含まれます。 - 求めていないデータを持つ画像を見つけたい場合、一致する値として "null" を入力できます。 - ^追加の metadata を検索 ダイアログの入力欄「tagname」、「condition」、「match values」を使って、選択条件として使用する追加の metadata tags を指定するか、「metadata」レポートタイプが選択されている場合はレポート出力に追加できます。指定した画像ファイルで利用可能な tags は{すべての metadata を表示}で確認できます。これにはメインダイアログにない多くの tags が含まれます。ピックリストの元データはテキストファイル /meta_picklist です。必要であればこのファイルに tags を追加できます。メインダイアログにも存在する tags を使用できます。この場合の利点は、より柔軟な一致ロジックを使用できることです。 - 一致ロジックは、各 metadata tag ごとに選択できます。 ^一致方法 選択のための一致値 • report 任意の値(欠落含む) • reportx 値が欠落していない • matches カンマ区切りのテキスト値 • contains 同上、部分文字列一致 • number = 等しい値 • number => 等しいか、それ以上の値 • number <= 等しいか、それ以下の値 - 右側の[X]ボタンで、個々の metadata 検索 tag をクリアできます。 - ^ダイアログボタン [読み込み]と[保存]を使うと、検索条件をファイルから読み込んだり保存したりできます。[クリア]はダイアログのすべてのデータをクリアします。[続行]は検索処理を開始します。 - 検索を実行するには[proceed]ボタンを押してください。出力は標準の thumbnails のギャラリー、または上記の metadata レポート形式です。検索した画像は永続的なアルバムとして保存できます - {アルバム}を参照してください。 - ^パフォーマンス インデックス化された metadata の検索とレポートはほぼ瞬時です。インデックス化されていない metadata の速度は、コンピューターとディスクの速度に依存します。SSD を搭載した高性能なコンピューターは、1分間に10万ファイル以上を検索できます。 - ^search_results^(アルバム) Search Images の出力は "search_results" というアルバムに保存されます。後の検索でこれが置き換えられないようにしたい場合は、このアルバムの名前を変更してください。 - 制限事項:検索機能は40,000件の結果(検索条件に一致した画像)に制限されています。この制限を超えると通知され、検索は打ち切られます。この制限が存在するのは、GTK のスクロールウィンドウのサイズに制限があり、より大きなウィンドウを作成しようとするとクラッシュやフリーズが発生する可能性があるためです。 - - TOPIC: 選択メニュー - - TOPIC: エリア概要 編集機能は通常、画像全体に適用されますが、画像の一部(「エリア」)のみを編集し、残りを変更しないままにすることもできます。画像エリアが選択されている場合、ほとんどの編集機能はこのエリア内でのみ動作します。一部の機能(例:Rescale)は選択エリアを無視します。エリアは編集機能を開始する前、または編集機能の使用中に選択できます。選択されたエリアは即座に有効になり、それまでの編集は保持され、以降の編集はエリア内にのみ適用されます。別の編集が開始されても選択エリアは有効なままなので、エリア内で一連の編集を行うことができます。エリアは、画像内の複数の分離した領域から構成されることもあります。 - Fotocx は「レイヤー」の代わりに「エリア」を使用します。画像から何かを選択し、その選択から別のレイヤーを作り、レイヤーを編集して最後にレイヤーを統合するのではなく、画像内で何かを選択し、その選択範囲に対して編集機能を実行すると、最終結果がすぐに見えます。エリアは保存したり、別の画像に貼り付けたり、移動・リスケールしたり、さらに編集したりすることもできます。 - +image: edit-selection.jpg - 選択したエリアを編集すると、エリアの端に目に見える境界ができることがあります(画像内の被写体のエッジと一致し、問題にならない場合もあります)。{エリアブレンド}を使ってエッジをブレンドできます:エリアの端から内側へ向かって徐々に編集を適用でき、どのエッジをブレンドするか選択できます。 - - TOPIC: エリアを選択 +image: select-area.jpg - Select Area ダイアログは、メニューの Select > Select Area から開始されます。以下で説明する方法のいずれかを選択してください。各方法は異なる方法で画像エリアを選択します。いつでも方法を切り替えられ、選択したエリアは積み重なります。選択に対してエリアを追加または削除するにつれて、選択された画像エリアの輪郭が表示されます。[完了]ボタンは、エリア輪郭内の画像ピクセルをマッピングし、後続の編集機能を適用できる状態にします。[非表示]ボタンはエリアの輪郭を非表示にし、編集内容やエリアの端の影響をより見やすくします。[表示]ボタンを使うとエリアの輪郭が表示されます。[クリア]ボタンはすべてのエリア選択を削除します。Select Area ダイアログはキャンセルして後で再開し、既存のエリアを修正したり新しいエリアを追加したりできます。 - ^方法 以下の方法は、最終的なエリアに属する1つ以上の画像空間を囲むために使用されます。これらの方法は、結合または分離した空間を定義するために任意の順序で使用できます。 • Rectangle - ドラッグして四角形のエリアの輪郭を描く • Ellipse - ドラッグして円形または楕円形のエリアの輪郭を描く • Freehand Draw - マウスで描画してエリアの輪郭を描く • Follow Edge - 画像の被写体のエッジに沿って輪郭を描く • Select area within mouse - マウスポインターを中心とした円内のピクセルを選択するためドラッグする。 • Select one color within mouse - 指定した色に一致するピクセルのみを選択、0~100%の一致。 • Select all colors within mouse - マウス内のすべてのピクセルを選択し、マウス内の色に一致する色を持つ隣接エリアへ選択範囲を拡張する(「flood」と呼ばれることもあります)。 - 以下の段落では、各方法の詳細を説明します。 - ^Rectangle 四角形のエリアの一方の角から反対側の角までマウスをドラッグして選択してください。エリアを囲む四角形が描かれます。右クリックで削除してやり直せます。この処理を繰り返して、さらに四角形のエリアを選択してください。 - ^Ellipse 円形または楕円形のエリアを囲む点を除き、Rectangle の選択と同様に動作します。ドラッグを開始した位置が、できあがる楕円の中心になります。ドラッグの角度によって楕円の形が決まります。 - ^Freehand Draw マウスをドラッグ(左ボタンを押したまま)してフリーハンドの線を描くか、左クリックして最後に描いた点からクリックした点までを直線でつなぎます。対象のエリアが接続された曲線と直線で囲まれるまで、周囲を続けてください。右クリックで直前の線(間違い)を削除できます。右クリックすると、直前にクリックまたはドラッグした線が最大50ピクセルまで削除されます。さらに削除するには右クリックを繰り返してください。新しくクリックした線は、常に直前の線の終点につながります。新しくドラッグした線は、その終点近くから開始された場合、直前の線につながります。別の場所から開始された場合、分離した線が描かれます。遠くから新しいドラッグを開始し、直前の線に合流するよう描き戻すこともできます。クリックした線が望まない点に接続された場合(つまり、最後に描いた線に接続したくない場合)、右クリックで削除し、ドラッグを使って新しい一連の線を開始してください。右ボタンのドラッグは線分の消去に使用できます:線に沿って密接に右ドラッグすると消去され、その後左ドラッグで線を再描画できます。最終的に、エリアは隙間なく完全に囲まれている必要があります。端が少し重なる線は問題ありません。隙間は見つけて修正するのが難しいことがあるため、画像を100%以上のサイズで慎重に作業してください。左クリックで自動的に接続された一連の線は隙間を残しませんが、この手順からの逸脱は隙間を生む可能性があります。隙間の可能性を減らすには、手動で線をつなぐ際に意図的に重ねてください。以下で説明する隙間検出ユーティリティ - {エリアの隙間を検索} - もあります。エリアの端が画像の端でもある場合、この部分の輪郭を描く必要はありません。画像の端の外側へ線を引き、画像の端に沿った別の位置で画像内に線を引き戻してください。 - ^Follow Edge 最後に描いた点と新しくクリックした位置の間で、高コントラストのピクセル(おそらく画像の被写体のエッジ)が見つけられ接続されます。これは、あまり不規則でない明確なエッジに効果的です。ぼやけたりギザギザしたエッジではうまく機能しないことがあり、高い精度が必要な場合は Freehand Draw が必要になります。線を接続する規則は上記と同じです。クリックの代わりにマウスをドラッグすると Freehand Draw のように動作しますが、マウスよりわずかに後ろの位置から被写体のエッジに沿う傾向があります。非常に不規則なエッジ(髪の毛、葉など)については、下記の「deselect color」を参照してください。 - ^マウス半径と色の一致レベル これら2つのコントロールは、以下で説明する「select within mouse」方式にのみ適用されます。マウス半径は、マウスポインターの周りの円のサイズを定義します。円内のピクセルが選択されるか、マウスの円から外側へ向かって一致・選択するピクセルのための色のセットを提供します。一致レベルは、色と明るさに基づいてピクセルを選択するために必要な一致レベル(0~100%)を定義します。「0」はどんな色でも一致することを意味し、「100」は完全な一致が必要であることを意味します。 - ^マウス範囲内でエリアを選択 左クリックまたはドラッグすると、マウスの円内のピクセルが選択されます。右クリックすると直前の選択が解除されます(さらに解除するには繰り返してください)。右ドラッグすると、円内のピクセルの選択が解除されます。 - ^マウス範囲内で1色を選択 画像をクリックして色を選択します。その色はカラーボタンに表示されます。ボタンを使って直接色を設定することもできます。左/右ドラッグで、一致レベル内で選択した色に一致するマウスの円内のピクセルを選択/選択解除します。一致レベルを上げ下げして、より広い、またはより狭い範囲の色に一致させてください。一致させる色を変更するには、必要に応じて画像をクリックしてください。 - ^選択解除する色(任意) これは上記の「select one color」にのみ適用されます。画像を左クリックして選択解除する色を設定します。チェックボックスがオンの場合、選択解除色が有効になります。ピクセルが選択色よりも選択解除色によく一致する場合、そのピクセルは選択解除されます。選択されないままにしたい隣接エリアとの色コントラストが低い被写体のエッジに沿って選択する場合、その隣接エリアから選択解除色を設定してください。これは、髪の毛や葉など複雑なエッジを正確に選択するのに役立ちます。 - ^マウス範囲内のすべての色を選択 一部のエディターでは「flood」と呼ばれます。左/右ドラッグでマウスの円内のピクセルを選択/選択解除します。マウスの円の外側のピクセルも、次の2つの条件を満たす場合は含まれます:1)現在の一致レベル内でマウスの円内の任意の色と一致する。2)マウスポインターの検索範囲内にある。これはマウス半径の倍数です。例えばマウス半径が20で検索範囲が3の場合、検索範囲はマウスポインターから60ピクセルになります。含めたい新しいエリアの上でマウスをドラッグしてください。マウスの円内の色に一致する色を持つエリアへ選択範囲が広がる様子を確認してください。行き過ぎた場合は、右クリックで直前の選択を削除してください。必要であれば繰り返して、さらに以前の選択を削除してください。半径を小さくするか一致レベルを上げると、より細かい制御が可能になります - 選択範囲はより緩やかに広がり、マウスの円の近くにとどまります。小さい半径と高い一致レベルを使うと、画像の被写体のエッジに沿って追従し、良好な精度でエッジまでのピクセルを選択できます。エッジの作業が完了したら、「select area within mouse」の方法を使って残りを選択してください。右ドラッグは選択解除として機能します:マウスの円内のピクセルと検索範囲内の一致するピクセルが選択解除されます。選択範囲が広がりすぎた場合、多くの場合、内側から選択するよりも、選択されたエリアの外側から選択解除する方が修正しやすいです。この感覚をつかんで効率よく作業できるようになるには、多少の練習が必要かもしれません。 - ^マウス範囲内のすべての色を選択 - まとめ • 左ドラッグ - マウス内と範囲内で一致するピクセルを選択 • 右クリック - 直前の選択を元に戻す、繰り返してさらに選択解除 • 右ドラッグ - マウス内と範囲内で一致するピクセルを選択解除 - ^エッジのずれ 完了した(下記参照)エリアは、1ピクセル単位で拡張または縮小できます。これは、色の一致で選択されたエリアが明るさを変えるように編集された場合の、エッジの影響を軽減するのに役立ちます。色による選択では、被写体の色が背景に移り変わるエッジに沿って、選択不足または選択過多の細い帯が残ることがあります。エリアを1~2ピクセル拡張または縮小すると、よりきれいに見えるエッジになります。ずれの後もエリアは完了した状態(下記参照)のままです。 - ^エリアの輪郭の色 マウス選択円とエリアの輪郭に使われる色は、カラーボタンのいずれかをクリックすることでいつでも変更できます。これにより、様々な画像の色に対して見やすくできます。 - ^表示/非表示 [非表示]を使うとエリアの輪郭が非表示になります。これは、エリアの輪郭に邪魔されずにエリア編集の効果をよりよく確認するのに役立ちます。[表示]を使うと輪郭が表示され、エリアの編集を再開できます。 - ^完了 +image: select-area-finish.png - エリアは、正常に完了するまで編集に対して有効になりません。Finish は描かれた輪郭と色を検証し、視覚的な確認のために囲まれたピクセルに色を付けます。エリアの輪郭付けが終わったら、[完了]ボタンを使って処理を完了してください。上に示したポップアップダイアログは、完了に使用できる2つの方法をまとめています。 - 方法1:手で輪郭を描いたエリアの内側をマウスで左クリックしてください。囲まれたエリアは一時的に色付けされ、最終結果が意図したものかどうかを確認できます。明示的に輪郭を描いていないエリアも含め、囲まれた任意のエリアを選択できます:穴のあるドーナツがある場合、ドーナツ、穴、またはその両方を選択できます。すべてのエリアがクリックされ正しく色付けされたら[keep]を押してください。手描きのエリアの輪郭に隙間がある場合、色付け処理は「漏れ出て」しまい、囲みの外側のエリアも色付けされてしまいます。この場合、Finish ダイアログで[元に戻す]を押すと、元のエリアの輪郭に戻ります。輪郭の隙間を見つけて閉じ、再度[完了]を試してください。大きなエリア内の1ピクセルの隙間は見つけにくいことがあります。よく見えるように拡大してください。小さな隙間を素早く見つける方法については、下記の{エリアの隙間を検索}機能を参照してください。 - 方法2:囲まれたすべてのエリアの外側のどこかを右クリックしてください。囲まれたすべてのエリアが視覚的な確認のために色付けされます。隙間がある場合、結果と修正方法は方法1と同じです。この方法は、多くの手描きのエリアがあり、方法1で1つずつ確認したくない場合に適しています。 - 「select within mouse」方式を使って選択したエリアは自動的に完了します。これらのエリアは選択処理中にマッピングされますが、四角形、楕円、またはいずれかの線描画方式で選択したエリアは、その内側をクリックしたときにのみマッピングされます。「select in mouse」方式のみを使用する場合、選択したエリアをクリックせずに[keep]を押すことができます。 - 画像の一方の端からもう一方の端まで線を描くと、線のどちら側かをクリックすることで、その側のすべてのピクセルからなるエリアを作成できます。例:空と陸の境界に水平線を描きます。線の上をクリックすると空を選択し、線の下をクリックすると陸を選択します。描いた線は画像の端まで完全に届いている必要があります。 - ^クリア 現在のエリアを完全に破棄します。 - - TOPIC: エリアの隙間を検索 複数のストロークを使ったフリーハンド描画でエリアの輪郭を作成した場合、4倍ズーム未満では見えない小さな隙間が輪郭に残ってしまうことがよくあります。そのようなエリアを完了しようとすると、内部ピクセルのマッピングが隙間から漏れ出し、意図したエリアの外側を覆ってしまうため失敗します。Finish 機能が失敗した場合、この機能で隙間を見つけられます。失敗したエリアの輪郭のどこかをクリックしてください。クリックした位置から一方向に輪郭がゆっくりと再描画され、「終端ピクセル」が見つかるまで続きます。そこが隙間の場所です。次に、隙間(または別の隙間)に遭遇するまで反対方向に輪郭が描かれます。描画が止まった場所が隙間です。隙間を拡大し、フリーハンド描画で閉じてから、輪郭全体が止まることなく描けるかどうか再度テストしてください。この機能は Select Area 機能と並行して使用できます - 両方のダイアログを有効にできます。 - - TOPIC: エリアブレンド +image: area-blend.jpg - このツールには2つの機能があります:Area Blend と Area Edge Blend です。どちらの機能も、選択エリア内で行った編集を、前の編集または元の画像と混ぜ合わせることで徐々に「元に戻す」ことができます。上の例では、背景の4人の男性が、明るくした部分と変更していない部分の境界の痕跡なく明るくされています。 - ^Area Blend 編集した選択エリアの任意の部分を、元の画像とブレンドできます。ブレンドしたい領域の上で左マウスドラッグを使用してください。エリア内でのマウスドラッグごとに、選択した前の画像が徐々にブレンドされ、そのエリア内で行われた編集が実質的に軽減または除去されます。ブレンドの速度は「blend rate」によって決まり、マウスの円の中心とエッジで別々に設定できます。マウス半径とブレンド率(例えばマウス中心/エッジで50/0)を設定してください。ブレンドしたいエリアの領域の上でマウスをドラッグしてください。左ドラッグでブレンド、右ドラッグでブレンドの解除または復元を行ってください。この方法を使ってエリアのエッジを選択的にブレンドすることもできます:小さい半径を使い、ブレンドしたいエッジの上でマウスの中心をドラッグしてください。これにより、エッジから内側に向かって徐々に薄くなるブレンドになります。 - ^Area Edge Blend 編集したエリアと周囲の画像との境界が急であるために、編集後のエリアが不自然に見えることがあります(特にエリアを明るくした場合)。これは、エッジに沿った帯状の部分でエリアの編集を徐々にブレンドして消すことで、効果的に目立たなくできます。エリアの編集は、エリアのエッジで100%除去され、帯の幅の分だけ内側に向かって0%まで薄れていきます。エリアのエッジをブレンドする方法には「blend」と「blur」の2種類があります。Blend は、エッジの帯を選んだ前の編集または元の画像と混ぜ合わせます。Blur は、帯を帯の外側の隣接ピクセルと混ぜ合わせます。ブレンドの幅は「blend width」または「blur width」の入力で設定してください。 - エリアのエッジの「Blend」と「Blur」には、エッジ距離の計算が必要です:各エリアピクセルから最も近いエリアのエッジまでの距離です。この距離は、そのピクセルの相対的なブレンド量を計算するために使用されます:エリアのエッジで100%、エッジから「blend width」を超えたピクセルで0%です。複雑なエッジを持つ大きなエリアの場合、これには時間がかかることがあります。上部パネルに進捗メーターが表示されます。 - - TOPIC: エリアを表示/非表示 現在のエリアの輪郭を表示または非表示にします。エリアが編集機能で変更されている際にエリアを非表示にすると便利です。これにより編集の効果を判断しやすくなります。これらは Select Area ダイアログのボタンとしても利用できます。 - - TOPIC: エリアの有効化/無効化 現在のエリアを無効化し、後で再度有効化できるようデータを保持します(Enable メニュー)。これにより、選択したエリア内の編集と画像全体の編集を切り替えられます。 - - TOPIC: エリアを反転 既存のエリアを反転します:既存のエリアを除く画像全体が選択されます。この機能を2回使用すると、元の選択エリアに戻ります。選択したエリアを反転すると、エッジ計算は無効になり、エリアのエッジブレンドを行いたい場合は再計算が必要です。 - - TOPIC: エリアをクリア 現在のエリアを完全に破棄します。これは Select Area ダイアログのボタンとしても利用できます。 - - TOPIC: エリアのコピー/貼り付け 選択したエリアは、メニューの Areas > Copy を使ってキャッシュファイルに保存できます。このエリアは、Areas > Paste を使って同じ画像または別の画像に貼り付けることができます。クリックしてドラッグすることで、貼り付けたエリアの位置を調整できます。ダイアログのコントロールを使って、貼り付けたエリアのリスケールと回転ができます。 - - TOPIC: エリアの読込/保存 選択したエリアは、メニューの Areas > Save を使ってファイルに保存できます。ファイル名の入力を求められます。PNG ファイルが作成されます。この PNG ファイルには、透明度情報用のアルファチャンネルがあります。画像は選択エリアを囲む四角形です。選択されたピクセルは不透明で、それ以外は透明です。 - これらのファイルは既定では /saved_areas に保存されますが、どこにでも保存できます。メニューの Areas > Load を使って、保存されたエリアをファイルから読み込み、現在の画像ファイルに貼り付けてください。背景画像は、貼り付けたエリアの透明な部分を通して見えます。クリックしてドラッグすることでエリアの位置を調整できます。ダイアログのコントロールを使って、貼り付けたエリアのリスケールと回転ができます。 - - TOPIC: 元に戻す/やり直すボタン 編集機能が有効で、画像が変更されている場合: • 左マウスクリックで現在の編集を元に戻す • 右マウスクリックで編集をやり直す これにより、現在の編集機能の「前」と「後」の画像を素早く比較できます。 - 編集機能が有効ではないが、現在の画像に何らかの編集が行われている場合: • 左マウスクリックでクリックごとに1つの編集ステップを元に戻す • 右マウスクリックでクリックごとに1つの編集ステップをやり直す • マウスの中央クリックで、すべての編集ステップの一覧がポップアップ表示されます。任意の編集ステップまたは元の画像に戻れます - 別のファイルを開くと、現在のファイルの保存された編集ステップは破棄されます。 - - TOPIC: 編集メニュー - - TOPIC: 回転 傾いた画像を水平にするには、マウスで画像の右側または左側をドラッグして上下に動かし、画像が水平に見えるまで調整してください。画像を左クリックすると、水平にするのに役立つ縦横のガイド線が追加されます。右クリックで削除できます。 - [オートレベル]ボタンは、カメラが EXIF metadata に「roll angle」を記録している場合、画像を自動的に水平にできます。[Auto Upright]ボタンは、EXIF metadata に「orientation」が存在する場合、カメラを90°回転させて撮影した画像を自動的に upright 補正できます。 - - TOPIC: upright 補正 これは、90/180度回転した、または反転(ミラー)した画像のための1ボタンの修正機能です。ピクセルは新しい画像レイアウトへ1対1でコピーされるため、解像度の損失はありません。{upright の一括処理}機能も参照してください。 - - TOPIC: クロップ +image: crop-image.jpg +image: crop-buttons.jpg - 画像の端から不要なエリアを切り取ります。ダイアログが開くと、選択用の四角形が画像の上に配置されます。この四角形の外側のエリアは暗くなり、削除される画像の部分を表します。四角形の辺または角をドラッグすると、その辺または角を動かせます。ダイアログボックスには、選択用四角形の現在の幅/高さの比率が表示されます。「Lock」がチェックされている場合、辺や角を動かすと別の辺や角も動き、固定された幅/高さの比率が維持されます。(小さな円で示された)中央からドラッグすると、サイズを変えずに四角形全体を移動できます。幅と高さのスピンボタンを使って画像のピクセルサイズを直接調整するか、希望の値を入力してください。選択用四角形はこれらの値に合わせて調整されます。 - キーボードの矢印キーを使うと、選択用四角形を1ピクセル単位で移動できます。矢印キーが動かすのは、マウスで最後に動かした辺または角です。 - [最大]ボタンは、クロップ用四角形を画像全体のサイズにリセットします。以前の編集(Rotate、Warp など)によって画像の周りに透明な余白が残っている場合、クロップ用四角形はこれらの余白内に収まる最大サイズを反映します。 - [前へ]ボタンは、以前使用した幅と高さの値の一覧を取得します。一覧から選んで使用してください。 - 5つの比率ボタンで、あらかじめ設定された幅/高さの比率を選択できます。[invert]ボタンは現在の幅/高さの比率を反転します。 - [customize]ボタンで比率ボタンを変更できます。これを押すと右側に表示される新しいダイアログが開始されます。ボタンをクリックして編集してください。表示されている例のように "ww:hh" という形式で希望の幅と高さの比率を入力してください。 - - TOPIC: レタッチ +image: retouch.png - 画像の明るさと色を調整します。 • auto black level - 最も暗いピクセルの%を使って黒点を設定 • auto white balance - 最も明るいピクセルの%を使って白点を設定 • click gray spot for white balance - ホワイトバランスのため画像上のグレーの点をクリック • click dark spot for black level - 黒レベルのため画像上の暗い点をクリック • click for popup graph of RGB histograms - クリックで RGB ヒストグラムのポップアップグラフを表示 • brightness - 「all」カーブを上下に移動(すべての色が変化) • contrast - 「all」カーブの傾きを変更 • color saturation - 白黒 <--> 鮮やかな色 • color temperature - 照明のバランス(暖色 <--> 寒色) - スライダーで初期調整を行った後、マウスでカーブを編集して細かく明るさとコントラストを調整し、画像のどの部分をより大きく、またはより小さく変化させるかを指定できます。ALL カーブはすべての色を調整し、3つの RGB カーブは個々の色を調整します。まず ALL を使い、その後 RGB で修正してください。 - ^ボタン Reset - すべてのコントロールを中立の位置に戻す - 画像もリセットされます Prev - すべてのコントロールを前の画像で使用した値に設定 Done - 編集を完了し、ダイアログを閉じ、コントロールの設定を保存 Cancel - 編集をキャンセルし、画像をリセットしてダイアログを閉じる - 似た調整が必要な複数の画像を処理する場合は[前へ]ボタンを使用してください。 - - TOPIC: リスケール +image: rescale.png - この機能は、画像を新しいピクセル幅と高さにリスケールします。新しいサイズを直接入力するか、変化率(パーセント)を選択できます。元のサイズに対する単純な比率に新しいサイズを設定するためのボタンがあります。これらのいずれかを使用すると、解像度の損失を最小限に抑えられます。[前へ]ボタンは以前のサイズを呼び出します。複数の画像を同じサイズに設定する場合に便利です。lock ratio ボックスがチェックされている場合、幅または高さのどちらかが変更されると、現在の幅/高さの比率が維持されます。 - - TOPIC: 分割画面 +image: split-screen1.jpg +image: split-screen2.png - 編集機能の実行中に、分割画面方式で変更前後の画像を表示します。マウスで境界線をドラッグしてください。分割画面を終了すると、通常どおり編集機能を続行できます。 - 編集機能が有効でない場合、分割画面で表示する2枚の画像を選んでください。これらは同じピクセルサイズである必要があります。 - - TOPIC: 差分を表示 編集機能の実行中に、変更していないエリアを暗くすることで変更箇所をハイライト表示します。スライダーを使って、変更していないエリアの暗さを調整してください。Show Diffs を終了すると、通常どおり編集機能を続行できます。 - 編集機能が有効でない場合、差分をハイライト表示する2枚の画像を選んでください。これらは同じピクセルサイズである必要があります。 - - TOPIC: 余白 +image: margins.png - この機能を使って画像の周囲に余白を追加します。余白には任意の色とアルファ(透明度)の設定を使用できます。各余白を個別に設定するか、コントロール「All±1」と「All±10」を使ってすべての余白を1ピクゼルまたは10ピクセルずつ増減してください。マウスホイールまたは上下矢印キーを使うと素早く調整できます。 - この機能を使うと、ゆがみ補正を予定している画像の周囲に余白を追加し、一部のエリアが端からはみ出るのを防げます。 - - TOPIC: マークアップ +image: markup.jpg - これは画像マークアップ機能を含むメニューです: テキストを描画、線/矢印を描画、四角形を描画、楕円を描画 これらの機能はすべて[commit]ボタンを持ち、現在の編集を確定して、同じ編集ダイアログ内で新しい編集(新しいテキスト/線/四角形/楕円)を開始できます。 - ^テキストを描画 この機能は画像上に直接テキストを描画します。ダイアログにテキストを入力してください。複数行を使用できます。テキストを入力したら、画像上でテキストを配置したい場所を左クリックしてください。ドラッグすると別の場所に移動できます。右クリックでテキストを削除できます。[フォント]ボタンで別のフォントを選択できます。[サイズ]コントロールでテキストのサイズを増減できます。[角度]コントロールでテキストの傾き角度を変更できます。他のコントロールでは、テキストの周りの背景色、テキストの輪郭色、影の効果を指定できます。これらすべてで色と透明度を選択できます。幅のコントロールは輪郭と影の太さを調整します。影の角度コントロールは影の角度を設定します。エンボスコントロールを使うとテキストに3D風の見た目を与えられます。 - テキストは、画像ファイル内の利用可能な任意の metadata から初期化できます。metadata tag(例:"user comments")を入力して[取得]を押してください。tag 名は省略できます。例えば "User Comments" の代わりに "usercomments" と入力できます。 - [開く]と[保存]ボタンはファイル選択ダイアログを開始し、すべてのテキストデータをファイルから読み込んだりファイルに保存したりできます。ダイアログ内のすべての項目が読み込まれるか保存されるため、よく使うテキスト文字列と設定のコレクションを保持できます。 - 下部のボタンは次のように動作します: • Clear - テキストと metadata の欄を空にする • Replace - テキストを追加した画像で現在の画像を置き換える • +Version - テキストを追加した画像を新しいバージョンとして保存 • Next - 次のファイルを開き、同じテキストを同じ位置に配置 • Apply - 現在の編集を確定し、新しいテキスト入力用にリセット • Done - 現在の編集を完了 - 画像は保存の準備ができる • Cancel - 現在の編集を中止 - 一連の画像に同じテキストを追加するには:テキストを準備して配置し、[置換]または[+Version]を押し、次に[次へ]、そして[置換]または[+Version]、また[次へ] ... - 透かしを作成する:70%以上のテキスト透明度と100%の背景透明度を使用してください。テキストはかすかに読める程度にしてください。エンボスコントロールを使うと、テキストが画像に埋め込まれているように見せられます。 - ^線を描画 この機能は画像上に直接線または矢印を描画します。ダイアログに線の長さと太さを入力し、必要であれば矢印の先端を選択してください。画像上に配置したい場所を左クリックしてください。線/矢印の端をドラッグして画像上での位置を調整してください。右クリックで削除できます。線の中央からドラッグすると、角度や長さを変えずに移動できます。ダイアログのコントロールでは、背景色、輪郭色、影の効果を指定できます。これらすべてで色と透明度を選択できます。幅のコントロールは輪郭と影の太さを調整します。影の角度コントロールは影の傾き角度を設定します。描いた線を保持して別の線を開始するには[適用]を押してください。 - ^四角形を描画 四角形の輪郭の色と太さを選んでください。四角形の角にしたい位置にカーソルを置き、希望の方向にドラッグして四角形を開いてください。四角形を置き換えるには、再度ドラッグしてください。四角形を移動するには、Shift キーを押しながら中央からドラッグしてください。1つの辺を動かすには、Shift キーを押しながらその辺をドラッグしてください。描いた四角形を保持して別の四角形を開始するには[適用]を押してください。 - ^楕円を描画 oval(楕円)または circle のチェックボックスのいずれかを選んでください。輪郭の色と太さを選んでください。希望の中心にカーソルを置いてください。ドラッグして楕円/円を描いてください。ドラッグの角度によって、円から極端な楕円まで、横長または縦長の形が決まります。楕円/円を置き換えるには、再度ドラッグしてください。楕円/円を移動するには、Shift キーを押しながら中央からドラッグしてください。サイズや形を変更するには、Shift キーを押しながら右下の端をドラッグしてください。描いた楕円/円を保持して別のものを開始するには[適用]を押してください。楕円の場合、例のように傾いた軸のため0~90度の角度を入力できます。 - - TOPIC: カラーモード +image: color-mode.png +image: color-mode2.jpg - この機能を使って、白黒またはカラーのネガを作成したり、ネガ画像をポジ画像に変換したり、(古い写真風の効果のため)セピア色に変換したりできます。スライダーを使って0%から100%まで段階的に効果を適用できます。 - - TOPIC: ペイント編集 この機能は、他の編集機能と組み合わせて使用してください。編集機能を開始し、コントロールを中立の位置のままにしておいてください。その後 Paint Edits を開始してください。マウスを使って希望の場所に編集機能をペイントしてください。マウスを使って局所的に編集を適用する方法については{MOUSE PAINTING}を参照してください。 - このように編集を段階的に「ペイント」する方法を使うと、画像の選択したエリアを素早く簡単に改善できます。次の編集機能で動作します: • Edit > Retouch、Color Mode • Repair > Sharpen、Blur、Denoise、Defog、Adjust RGB、Adjust HSL • Refine > Flatten Histogram、Local Contrast、Amplify Contrast、Local Retinex、Saturation、Soft Focus • Effects > Outlines、Sketch2、Emboss、Texture、Add Glare、Set Colors、Shift Colors、Custom Kernel - - TOPIC: 画像をペイント +image: paint-image.jpg - この機能は、マウスを使って選択した色で画像の上をペイントします。マウスを使って局所的に編集を適用する方法については{MOUSE PAINTING}を参照してください。 - Paint Color ボタンには現在の色が表示されます。このボタンをクリックすると、標準の Gnome カラーチューザーダイアログで色を選択できます。Shift+左クリックで画像から色を選ぶこともできます。 - パレットボタンは中央に表示されているダイアログを開きます。画像をクリックすると、その位置の色が選択されます。選択した色はメインダイアログのカラーボタンに反映されます。上に表示されている画像が既定のものです。任意の画像を色のソースとして使用できます。[参照]ボタンを押して、色を保存しておいた画像を選んでください。この選択は変更するまで有効です。 - HSL ボタンは、右側に表示される HSL カラーチューザーを開きます。このダイアログはあらゆる色を表現できます。スライダーを動かして希望の色にしてください。選択した色はメインダイアログのカラーボタンに反映されます。 - paint over transparent areas が選択されている場合、透明なエリアの上をペイントすると、不透明度のコントロールに応じて透明度が減少または除去されます。このオプションが選択されていない場合、画像の不透明なエリアのみがペイントされます。 - ^Wacom タブレットの操作 Paint Image では、マウスの代わりに Wacom タブレットを使用できます。タブレットの表面に触れたままスタイラスをドラッグすると、上記のようにペイントされます。ドラッグ中にスタイラスのボタンの1つを押し続けると、操作はペイントの代わりに消去になります。ダイアログのラジオボタンでペイントまたは消去モードを設定することもできます。スタイラスのボタンを押し続けるのは面倒なため、ラジオボタンが用意されています。スタイラスに圧力を加えると不透明度が上がるため、不透明度のコントロールを調整せずに、より薄い、または濃いストロークを描けます。 - - TOPIC: 透明度をペイント +image: paint-transp.png +image: paint-transp2.jpg - 画像上の透明または半透明のエリアをペイントします。マウスを使って局所的に編集を適用する方法については{MOUSE PAINTING}を参照してください。 - - TOPIC: エリア塗りつぶし 選択したすべてのエリア、またはすべての透明なエリアを、選んだオーバーレイの色で塗りつぶします。エリアが部分的に透明な場合、オーバーレイの色は画像の透明部分を置き換えます。「Blend」スライダーを使って、元の画像とオーバーレイの色の任意の混合を選択できます。 - - TOPIC: 画像内でコピー 同じ画像内の別の場所からコピーして画像エリアの上をペイントします。この方法は、画像内の被写体を複製したり、他の場所から取った背景で置き換えることで不要な被写体を消去したりするのに使用できます。画像を左クリックしてソースの位置を選択し、次に右クリックして対応する目的の位置を選択してください。マウスを使って局所的に編集を適用する方法については{MOUSE PAINTING}を参照してください。 - paint over transparent areas が選択されている場合、透明なエリアの上をペイントすると透明度が減少または除去されます。このオプションが選択されていない場合、画像の不透明なエリアのみがペイントされます。 - - TOPIC: 画像からコピー 別の画像からコピーして画像エリアの上をペイントします。対象の画像は、変更したいエリアの上でマウスをドラッグすることで「ペイント」されます。ソース画像内で事前に選択した位置が対象の画像にコピーされます。コピーされるエリアとペイントされるエリアはどちらも、マウスとともに動く円で囲まれます。上の例では、右側の画像のボートが左側の画像にコピーされました。 - まず対象の画像を開いてください。メニューの「Copy From Image」を選択してください。同じ画像を表示する2つ目の Fotocx セッションが開始されます。この2つ目のセッションで、ソース画像へ移動して開いてください。両方のウィンドウ(少なくともコピーする部分)が見えるように配置してください。ソース画像を Shift+左クリックしてソース位置を設定してください。対象画像の目的の位置を Shift+左クリックしてください。 - 対象画像のエリアの上でマウスを左ドラッグしてください。ソース画像のピクセルが対象画像にコピーされます。参照位置に高い精度が必要な場合は、画像を最大サイズまでズームしてください。初期の参照位置は両方の画像で(0,0)(北西の角)です。マウスを使って局所的に編集を適用する方法については{MOUSE PAINTING}を参照してください。 - ソース画像のスケール値は、ソース画像を対象画像に合わせてスケールするために使用されます。まず試しにコピーしてスケールを確認してください。大きすぎるか小さすぎる場合、[undo all]で試したものを消去し、スケール値を変更して再度試してください。 - paint over transparent areas が選択されている場合、透明なエリアの上をペイントすると、マウスの不透明度コントロールに応じて透明度が減少または除去されます。このオプションが選択されていない場合、画像の不透明なエリアのみがペイントされます。 - - TOPIC: 前回の編集をコピー 以前の編集ステップの画像を、マウスで「ペイント」することにより、現在の画像に局所的かつ段階的に適用できます。以前の編集は、現在の画像がまだ開かれている間にその画像に対して行われた編集の1つでなければなりません - 未保存の編集は新しい画像を開くと失われます。現在の画像が現在の画像として開かれたままである限り、任意の以前の編集を現在編集中の画像の任意のエリアに適用できます。ドロップダウンリストから以前の編集を選択してください。このリストには、現在の画像に対して行われたすべての以前の編集ステップが、使用された編集機能とともに順番に表示されます。マウスを使って局所的に編集を適用する方法については{MOUSE PAINTING}を参照してください。 - - TOPIC: 修復メニュー - - TOPIC: シャープ化 +image: sharpen.png - この機能には、ぼけた画像をシャープ化する5つの方法と、撮影中のカメラや被写体の動きによるモーションブラーをシャープ化する方法があります。 - 方法を選び、パラメーターを設定し、[適用]を押して数秒待つと結果が表示されます。満足いくまで変更を加えて処理を繰り返してください。{エリアを選択}を使うと、画像の異なる部分に異なる方法とパラメーターで処理を行えます。 - すべての方法において、わずかにぼけた画像には小さい半径を、より状態の悪い画像には大きい値を選んでください。Amount は変更の強さを制御します。Threshold は低コントラストのピクセルへの変更を抑制します:値を高くすると、低レベルの不規則性(画像ノイズ、不均一な肌の色調など)の増幅が軽減されます。 - Unsharp mask:ほとんどの画像エディターに見られる古典的な方法です。技術的な説明はインターネット検索で見つけられます。この方法は、高コントラストのエッジの周りに目に見える「ハロー」を作ることがあります。 - Amplify Contrast:既存のコントラストを強調します。効果は unsharp mask に匹敵しますが、「ハロー」は軽減されます。 - Kuwahara:各ピクセルの周りの小さな近傍同士が比較されます。ピクセルには、差が最も小さい近傍の平均色が与えられます。これにより、ぼけたエッジ上のピクセルはエッジのどちらか一方に強制的に一致させられます。エッジは非常にシャープになります。大きい半径を使用すると画像が「ブロック状」に見えることがあります。微妙な細部が失われることがあります。 - Median diff:ピクセルの明るさが半径内のピクセルの中央値と比較されます。近傍の平均より明るい、または暗いピクセルは、それぞれ明るさが増減されます。効果は unsharp mask に匹敵しますが、「ハロー」は大幅に軽減されます。これは、各 RGB 色を個別に処理する唯一の方法です。明るさの変化がほとんどない場合でも、色の変化をシャープにできます。 - Richardson-Lucy:画像は Richardson-Lucy デコンボリューション法を使ってシャープ化されます。この方法は最良の結果を生む可能性がありますが、かなり低速です。処理を速くするには、まず{エリアを選択}を使って画像の小さく複雑なエリアを選択してください。この小さいエリアを使って最適な半径と反復回数を探ってください。その後、同じ設定を画像全体に使用してください。画像内のノイズは効果を妨げます。その場合は事前に{ノイズ除去}を使用してください。 - 正確に2倍にアップスケールした画像は、半径2.0と4回以上の反復を使った Richardson-Lucy でシャープ化できます。結果は非常に良好です。 - ^モーションブラーを補正 +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - カメラまたは被写体の動きによるわずかなブラーがある画像を手動で最適化します。それ以外はシャープな画像の中で動く被写体によるブラーは、{エリアを選択}を使ってその被写体を分離して処理できます。ブラーは線形かつ一定速度であると想定されます。入力は、ピクセル単位の「blur span」と度単位の「blur angle」です。初期の角度推定は、ブラーの方向に沿って画像上を Shift+マウスドラッグすることで指定できます(実際の動きと同じ方向でも逆方向でもかまいません)。Tools > Show RGB を使って、明るい画像の被写体のエッジに沿ったブラーの幅を測定することで、blur span の推定値を入力してください。入力を調整し、[適用]を押して、画像を確認して最適な設定を見つけてください。大きい画像では応答時間が遅くなることがあります。{エリアを選択}を使ってブラーのかかった小さいエリアを選択し span と angle を最適化した後、エリアをクリアして同じ設定で画像全体を処理することで、処理を速くできます。このアルゴリズムは「リンギング」ノイズを生むことがあり、これは入力「suppress ringing」で抑制できます。まず suppress の値を低く保って最適な span と angle を見つけ、その後必要に応じて抑制を加えてリンギングを減らすのが最も効果的です。Richardson-Lucy デコンボリューション法が1次元で使用されます。 - ^デジタルカメラのモーションブラー すべてのブレた写真がこの方法に最適な一定速度のブラーを持っているわけではありません。画像は複数のより短い露光の重ね合わせである場合があります。画像全体が同時に露光されず、同じブラーを持たない場合もあります(機械的または電子的な移動シャッター)。それでもこの方法は、2次元で動作するシャープ化ツールよりも良い結果を生むことがあります。フィルムカメラで撮影された古い写真では、モーションブラーが一定速度に近いため、より効果的に機能するはずです。 - - TOPIC: ぼかし +image: blur.jpg - 対応するチェックボックスで方法を選び、必要なパラメーターを入力して[適用]を押してください。{エリアを選択}が有効な場合、選択したエリアのみが影響を受けます。 - ^標準ぼかし 各ピクセルを半径内の周囲のピクセルと混合します。近いピクセルほど重みが大きくなります。半径を1に設定して[適用]を繰り返し押すと、画像の結果を確認しながらゆっくりとぼかしを強めていけます。 - 水平方向と垂直方向に別々の値を入力することで、任意でそれぞれ異なる量のぼかしを適用できます。[半径]入力は両方に同じ値を強制します。 - ^放射状ぼかし 選んだ中心から線に沿って各ピクセルを混合します。Radius はぼかされない中心のエリアを定義します。Length はぼかしの範囲を設定します:中心からエッジまで0からlengthまで。画像をクリックして中心を選んでください。 - ^方向指定ぼかし マウスで画像上の位置を引っ張ってください。マウスの周りのエリアがこの方向にぼかされます。Span はぼかされるエリアのサイズを決定します。Intensity はぼかしの強さを決定します。 - ^グラデーションぼかし 指定したコントラスト上限より低いコントラストを持つピクセルのみがぼかされ、ぼかしの半径は、指定した上限からゼロまでの対応するコントラストを持つピクセルに対して1から指定した値までの範囲になります。要するに:低コントラストのピクセルは高コントラストのピクセルよりも強くぼかされます。これは、髪をぼかしたり目の輝きを損なったりすることなく肌の色調を滑らかにするために使用できます。極端にすると「カートゥーン」効果を生みます。 - ^背景をぼかす(ボケ) 背景の画像エリアをぼかしながら、前景はシャープなままにします。シャープなままにしたい1つ以上のエリアを選択してください{エリアを選択}。前景のエリアを選択したら、選択を反転して背景を選択してください{エリアを反転}。これがぼかされるエリアです。利用可能なぼかし方法は2種類あります:Constant blur:ぼかされるすべてのエリアに一定のぼかし半径を使用します。Increase blur with distance:前景に隣接するピクセルには最小のぼかし半径を、前景から最大距離にあるピクセルには最大のぼかし半径を使用します。これには、すべての背景ピクセルのエッジ距離を計算する必要があり、かなりの時間がかかることがあります。エッジ距離を再計算せずにぼかし半径を変更できます。 - - TOPIC: ノイズ除去 +image: denoise.jpg - 低照度条件(高 ISO)で撮影された写真のノイズを軽減し、均一な表面が斑点状に見えるのを防ぎます。Median と Smooth の2つの方法が用意されています。最適な方法はノイズと画像の特性によって異なります。方法を組み合わせる(一方を使い、次にもう一方を使う)と役立つことがあります。Radius の値は、あるピクセルを比較・調整するために使用されるピクセルの近傍を定義します。大きい値(Radius > 2)はノイズをより効果的に軽減しますが、細部の損失を招くこともあります。limit 値は、近傍の中央値からこの量を超えて異なる RGB 明るさの値を持つピクセルを無視させます。これは、天体写真のような一部の画像で、小さな明るい詳細がノイズとして扱われるのを防ぐために必要です。 - Radius の値を設定し、いずれかの方法ボタンを押してください。各反復は前の画像を開始点として使用するため、複数回の反復により徐々にノイズが抑制され、一部の細部がぼける可能性があります。[リセット]で最初からやり直してください。半径1の Median の後に半径2の Median を行うのは、ノイズの抑制と細部の保持のバランスがよい方法です。 - Areas スライダーを使うと、処理を暗いエリアのみに制限したり、より広い範囲のエリアに制限したりできます。暗いエリアは明るいエリアよりもノイズの問題を抱えやすい傾向があります。 - 残る小さなノイズの斑点が見える場合は、limit 値を上げ、[リセット]ボタンを使い、[中央値]または[なめらか]を続けてください。 - 画像の異なるエリアに異なる処理を適用できます - {エリアを選択}を参照してください。また、画像の異なるエリアに異なる処理を使って画像を「ペイント」することもできます - {ペイント編集}を参照してください。 - 各 RGB 色は個別に処理されます。彩度や明度の個別処理はありません。 - [measure]ボタンは、実際の画像ノイズレベルを測定するための右側のダイアログを開始します。マウスを画像上で動かすと、マウスの円内(半径10、約300ピクセル)の RGB ノイズレベルが表示されます。これは、ノイズのみが存在するよう、特徴のないエリアである必要があります。テクスチャではなくノイズを見ていることを確認するため、4倍サイズで画像を確認してください。ドットは、周囲5x5ピクセルの平均(中央の実線で示される)に対する個々のピクセルの RGB 値を示します。下部の数字は、0~255のスケールでの平均 RGB 明るさとノイズレベルを示します。グラフのスケールは-10から+10で、点線は0~255の全範囲に対して-5と+5の位置にあります。9ビット目または10ビット目の RGB ノイズは、このスケールで0.5または0.25です。 - ^RAW 画像のノイズ カメラセンサーのノイズを測定するには、RAW 画像を使用してください。JPEG 画像はカメラ内でノイズを軽減するよう処理されています。RAW 画像の一般的に高いノイズレベルに驚くかもしれません。大きなセンサーを搭載した高価なカメラでも、低ノイズの色は8ビット未満のことがあります。RAW 画像からノイズをフィルタリングする際、カメラの JPEG を生成する電子回路とソフトウェアと競争していることになります。これより優れた結果を出すのは難しいかもしれません。 - - TOPIC: 霧除去 +image: defog.png +image: defog2.jpg - 画像または選択エリアの霧/かすみを除去します。これには他のツール(ヒストグラムをフラット化、局所コントラスト、コントラストを強調、レティネックス、彩度)もありますが、霧/かすみの除去はそれらの主な機能に対して副次的なものです。この機能は霧/かすみに直接作用します:R/G/Bの色を均等に取り除き(明るさを下げ彩度を上げます)、任意で失われた明るさを補います。遠方のかすみでよくあるように、青が支配的になりすぎている場合はそれを軽減することもできます。希望のエリアを正確に対象にして最適化するには、{エリアを選択}や{ペイント編集}が必要な場合があります。上の例では、前景の丘と背景の山という2つのエリアを使用しました。 - - TOPIC: 赤目 +image: red-eyes1.png +image: red-eyes2.png - フラッシュ撮影による赤目効果を軽減します。2つの方法が用意されています。1つ目はより速いですが、難しいケースには対応できないことがあります。2つ目の方法はより堅牢ですが、より多くの時間と注意が必要です。1つ目の機能を使うには、満足いくまで赤目を1回以上左クリックしてください。暗くなったエリアが小さすぎたり中心がずれていたりする場合は、右クリックで変更を元に戻し、赤目の中心をより正確に左クリックしてください。赤目が正しく修正できない場合は、右クリックで変更を元に戻して2つ目の方法を使用してください。2つ目の方法は、赤目がわずかにしか赤くなく、まぶたとの色の差が自動アルゴリズムでは区別できないほど小さい、より難しいケースをよりよく扱えます。カーソルを赤目の中心に置いてください。左マウスボタンを押したまま、カーソルを右下にドラッグしてください。赤目を囲む点線の楕円が表示されます。赤目が楕円のおおよそ中心に来るよう、必要であれば繰り返してください。楕円の形はドラッグの方向によって決まるため、赤目のみをより正確に囲むことができることに注意してください。楕円の内側を繰り返し左クリックしながら赤目が暗くなる様子を確認し、十分暗くなったら止めてください。行き過ぎるとまぶたが暗くなり始めることがあります。右クリックで元に戻して必要であれば繰り返してください。 - - TOPIC: スマート消去 +image: smart-erase.png +image: smart-erase2.jpg - 電線、地面のゴミ、標識など、良い写真を台無しにする可能性のある小さな被写体を消去します。不要な被写体は周囲のエリアから取られたピクセルで置き換えられます。これは非常に効果的な場合もあれば(副作用がほぼ見えない)、そうでない場合もあります。写真内の小さい、または細い被写体に最も効果的です。Radius はマウスポインターの周りの円のサイズを制御し、選択・消去するエリアを定義します。マウスをドラッグして削除したい被写体を囲んでください。左ドラッグで選択、右ドラッグで選択解除します。[消去]を押すと選択したエリアが消去され、選択範囲外の最も近いピクセルでピクセルが置き換えられます。選択が十分正確でなかった場合は、[元に戻す]を使って選択エリアを調整し、再度[消去]を押してください。選択と消去を繰り返すと、[New_Area]を使って新しい選択を開始するまで積み重なります。以前の消去されたエリアは固定され、[元に戻す]は以降の選択に対してのみ機能します。画像を200%以上にズームして作業するのが最善です。Blur コントロールは置換されるピクセルにぼかしを加えます。これは、置換されるピクセルが周囲よりシャープな場合に目立つ副作用を軽減できます。Blur の設定を変更して[消去]ボタンを繰り返してください。[show]と[hide]ボタンを使って、現在の選択の輪郭を表示したり、消去後の結果をより判断しやすいよう非表示にしたりできます。 - 細長い被写体(電線など)の場合、2つの位置をクリックすると、その間のすべてが選択されます。選択は直線で機能するため、曲がった被写体の場合は間隔を空けてクリックして曲線に沿う必要があります。 - - TOPIC: ハローを除去 +image: remove-halo.png +image: remove-halo2.png - 一部の編集機能で残るハローを除去します。ハローの種類を選択してください:bright(最も一般的)または dark。例に示すように、ハローのエリアの上でマウスを左ドラッグしてマウス内のピクセルを変更してください。bright ハローの場合、マウスをドラッグした上を通過すると最も明るいピクセルが暗くなります。dark ハローの場合、最も暗いピクセルが明るくなります。例に示すように、ハローの幅より大きいマウス半径を使用してください。マウスを右ドラッグすると元のピクセルに戻ります。 - - TOPIC: JPEG アーティファクト +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - 強く圧縮された(品質設定が低い)JPEG 画像には、小さな長方形のブロックの形で圧縮アーティファクトが見えることがあります。写真の一部エリアで明るさの範囲が拡張されている場合、明るさの段差が大きくなるため(例えばRGB値の11/12/13が5倍の55/60/65に明るくされた場合)、このようなブロックがより目立つことがあります。この機能はブロック間の境界をぼかして、目立たなくします。 - 「Match Limit」は、隣接するピクセルが同じピクセルブロックのメンバーとして扱われるタイミングを決定します。Match Limit を低い値に設定すると、このようなブロックをより完全にマッピングできます。「Contrast Limit」は、コントラストが高いエッジのブレンドを防ぎ、細部の損失を防ぐ役割を果たします。2つの設定を変更して[適用]を押してください。最適化が重要な場合は、結果の画像を2倍以上のサイズで確認し、異なる設定を試してください。この機能は、リスケールされた画像に対しては効果が薄くなります。問題のあるエリアを選択的に処理するには{エリアを選択}を使用してください。 - - TOPIC: アンチエイリアス +image: anti-alias.jpg - 写真によっては、コントラストの高い被写体のエッジに沿ってピクセル化(「ジャギー」)が見られることがあります。上の例では、鳥の目の周りにこれが見えます。アンチエイリアスツールはこれを軽減できます。カメラ内処理で既に対処されている場合が多いため、ほとんどの写真では効果は小さいです。副次的な効果として、高圧縮画像の JPEG アーティファクトがやや滑らかになります。サイズを拡大した画像は、より目立つピクセル化を持ちます。これらは、特に2倍拡大の場合に改善できます。 - [適用]ボタンを使ってピクセルを抑制してください。効果があると感じたら複数回使用してください。「Threshold」を使うと、低コントラストのピクセルを処理から除外できます。通常0.1以下の値が最適です。 - Fotocx は Scale3x アルゴリズムを使用しており、「等しい」と「等しくない」の代わりに「似ている」と「異なる」色調を使うよう変更されています。 - - TOPIC: RGB を調整 +image: adjust-RGB.png - 全体の明るさとコントラスト、または選択した色のそれらを変更します。 • Brightness - 画像全体の明るさを増減 • +Red -Cyan など - その色の明るさを変更し、補色を反対方向に変更 • Contrast All - 画像全体のコントラストを増減 • Contrast Red Green Blue - 個々の RGB 色を処理 - - TOPIC: HSL を調整 +image: adjust-HSL.png - HSL(色相、彩度、明度)を使って画像内の選択した色の範囲を変更します。この機能は、色かぶりを修正したり、ある色を別の色に変える(例えば、白っぽくなりすぎた露出過多の空)のに使用できます。HSL カラーモデルに馴染みがない場合は、Wikipedia の記事を読んでください。 - まず、Shift+左クリックで画像上の一致・調整したい対象の色を選択してください。この色が、調整のために選択される色範囲の中心になります。色相、彩度、明度のチェックボックスを使って、どの色属性を一致させるかを選択してください。これらのそれぞれが、選択される色の範囲を狭めます。何もチェックしない場合、すべての色が選択されます。Match Level を使うと、選択される色の範囲をさらに広げられます。100%は近い一致の色のみが選択されることを意味します。 - Output Color コントロール(色相、彩度、明度)は、選択された入力色を置き換える、またはブレンドする新しい出力色を設定するために使用します。Shift+右クリックで画像からこの色を設定することもできます。結果の色は、元の色と新しい色の混合になります。新しい色の割合は Adjustment スライダーで設定され、0~100%の範囲で設定できます。HSL チェックボックスを使って、入力色のどの HSL 成分を出力色の対応する HSL 成分で置き換えるかを決定してください。出力色の HSL のスライダーを使って新しい色を調整してください。出力色は左側の小さいボックスに表示され、スライダーを動かすたびに更新されます。 - スライダーを動かし、ライブで更新される画像を見ながら結果を最適化してください。これはあまり直感的ではないため、練習が役立ちます。ヒント:まず色相と彩度で一致させ、色相のみを置き換えることから始めてください - これは、出力色の彩度と明度は元の画像の色からコピーされ、色相のみが置き換えられることを意味します。 - - TOPIC: ほこりを除去 +image: remove-dust.png +image: remove-dust2.jpg - ほこりの付いたスライドをスキャンして作られた画像には、多くの小さな暗い斑点(スライド上のほこりの影)が現れることがあります。インターネット上の古い写真にも同様の問題がよく見られます。この機能は、そのような斑点の大部分を除去できます。3つのスライダーを動かして、できるだけ多くのほこりの斑点が赤く塗られるようにし、[消去]ボタンを押して消去してください。[red]を押すと赤い表示に戻り、再びスライダーを調整して[消去]を押せます。「spot size limit」スライダーは、消去される斑点のサイズを制限します。「max. brightness」スライダーは、十分暗くない斑点を無視するためのしきい値を設定します。「min. contrast」スライダーは、周囲とのコントラストが低い斑点を除外します。この処理は通常、妥協が必要です。設定が最適でない場合、木の葉のような小さな特徴が消去されたり、大きな斑点が残ったりすることがあります。画像の異なる部分には異なる設定が必要な場合があります。例えば、空は建物の壁よりも積極的に処理できます。必要に応じて、Erase Dust を異なる設定で複数回使用し、すべてのほこりの斑点を取り除くこともできます。または、{エリアを選択}を使って画像を区分ごとに処理することもできます。しつこく残る斑点がある場合は、{スマート消去}で手動で処理できます。小さいマウス半径を設定し、各斑点をクリックして除去してください。繊維(長くて細い)によるほこりは通常自動では除去されませんが、Smart Erase はここで効果的です。上の例のようにほこりが明るい場合は、{カラーモード}を使ってカラーネガを作成し、ほこりを処理してから再びカラーネガに戻して通常の画像に戻してください。 - - TOPIC: 色収差 +image: fringes.png +image: fringesA.jpg - 周辺の色収差(横方向の色収差)を補正します - 色にじみが主に画像の外側のエリアに現れる場合です。 - 上の左の画像は、横方向の色収差がある写真の左上隅を拡大した切り抜きです。これは、右側の処理後の画像でほぼ解消されています。色にじみは、特にレンズの歪みが通常最も大きい画像の外側のエリアで、高コントラストのエッジに沿って現れることがあります。これを取り除くには、画像を最大サイズにズームし、色にじみのあるエリアを中心に配置してください。[search]ボタンを押してください。赤と青のカラープレーンが緑のプレーンによりよく合うようリスケールされ、使用された係数がダイアログボックスに反映されます。ダイアログ内の係数を直接修正することで結果を改善できる場合があります:画像上の色にじみを見ながら係数を変更してください。 - 画像がクロップされていて、画像の中心が元の写真の中心と一致しなくなっている場合、この機能の効果は薄れます。 - - TOPIC: リファインメニュー - - TOPIC: ヒストグラムをフラット化 +image: flatten1.jpg +image: flatten2.jpg - コントラストの悪いエリアで見える細部を増やします。ピクセルの明るさは、そのピクセル周辺のエリアの明るさの分布(ヒストグラム)がより均一になるよう上下に調整されます。半径を小さく(エリアを小さく)すると効果が強まります。最も暗い(1)から最も明るい(5)まで、5つの明るさゾーンがあります。スライダーを動かすと、対応するゾーンの効果が強まります。zone A スライダーを使うと5つのスライダーをまとめて動かし、素早く初期結果を設定できます。その後、他のスライダーを個別に使って画像を微調整してください。 - - TOPIC: 局所コントラスト +image: localcon1.jpg +image: localcon2.jpg - 画像のあらゆるエリアのコントラストを高めます。各ピクセルの明るさは、周囲のエリアの平均的な明るさと比較されます。この差を大きくするようピクセルの明るさが調整されます。この機能は、広く使われている教科書的な方法を実装したものです。Radius は、平均的な明るさの計算に使われる各ピクセル周辺のエリアのサイズを決定します。Power は明るさの変化量を決定します。Color は色の彩度を高めるために使用します。編集可能なカーブを使って、選択した明るさレベルの出力画像を明るくできます。この例は、画像の暗いエリアを明るくする様子を示しています。 - Local Contrast は、状況によっては「ハロー」を作ることがあります: +image: localcon3.jpg - 元の画像は左側です。中央の画像は Local Contrast を最大パワーで適用したものです。暗い丘とより明るい空の境界に沿ってハローが見えます。これは簡単な工夫(右の画像)で修正できます。{エリアを選択}を使って空のエリアを別々に選択してください。このエリアに Local Contrast を適用してください。選択を反転し、画像の残りの部分に Local Contrast を適用してください。 - - TOPIC: コントラストを強調 +image: amplify-contrast.png +image: amplify-contrast2.jpg - 局所コントラストを高めることで、画像の見かけの明るさの範囲を広げます。低コントラストのエリアを高めつつ、高コントラストのエリアは変更しないようにできます。編集用カーブを使って、コントラストの強調を初期のコントラスト量に応じて変化させることもできます。 - カーブの下にある Amplify スライダーは、コントラスト強調なしから完全な強調まで計算を調整します。右に動かしすぎると、画像に見苦しいアーティファクトが現れることがあるため、これらが消えるまで戻してください。均一なエリア(空など)がまだら模様になる場合は、カーブの左端を下げて低コントラストエリアの強調を減らしてください。場合によっては、画像の異なるエリアを選択して別々に処理するのが最良です。例えば空は控えめに、石壁のような質感のある表面はより積極的に。 - - TOPIC: グローバルレティネックス +image: global-retx.png +image: global-retx2.jpg - 極端な霧/かすみや色かぶりのある画像(例えば100年前の写真)の色とコントラストを改善します。まず[Auto]ボタンを試してください。画像内に存在する最も明るいRGB色と最も暗いRGB色が検索されます。最も暗いRGB値がすべてのピクセルから差し引かれ、結果のRGB値は最大RGB値が255付近になるようスケールアップされます。もちろんこれが最初から最適とは限りません。スピンボタンは見つかった暗点と白点の限界に設定され、これらを変更して結果の画像を最適化できます。ダイアログの対応するオプションを選択して画像をクリックすることで、独自の暗点と明点を選ぶこともできます。乗数のスピンボタンは既定で1.0に設定されており、これらの値を変更して各RGB色の相対的な明るさを調整できます。上の例では、1枚目の画像がオリジナル、2枚目の画像は[Auto]ボタンで作成されたものです。右端の列のスピンボタンは、同じ行のすべてのボタンをまとめて調整します - マウスホイールまたはキーボードの上下矢印キーを使用してください。 - blend スライダーは、入力画像とレティネックス画像を任意の比率で混合するために使用します。reduce bright スライダーは、レティネックスが奇妙な結果を生むことがある、より明るい画像エリア(特に空)の効果を弱めるために使用します。 - このアルゴリズムは、1970年代に Edwin Land が最初に発表した概念から派生したものです。詳細はインターネットで「retinex」を検索してください。 - - TOPIC: 局所レティネックス +image: local-retx.png +image: local-retx2.jpg - 暗い画像エリアやその他の低コントラストのエリアで見える細部を増やします。各ピクセル周辺のゾーンの明るさの範囲は、そのゾーン全体が0~255の明るさ範囲全体をカバーするようにリスケールされたかのように、ピクセルの明るさをリスケールするために使用されます。Local Retinex は、Global Retinex が弱い場合に劇的な結果を生むことがあります。 - radius 入力は、各ピクセル周辺のおおよそのゾーンサイズを決定します。blend スライダーは、入力画像とレティネックス画像を任意の比率で混合するために使用します。reduce bright スライダーは、レティネックスが奇妙な結果を生むことがある、より明るい画像エリア(特に空)の効果を弱めるために使用します。reduce dark スライダーは、より暗い画像エリアに対して同じことを行います。上の例は、おおよそ元の画像60%+レティネックス40%です。 - - TOPIC: 彩度 +image: saturation.png - ピクセルの明るさに基づいて色の彩度を調整します。編集用カーブのY軸は色の彩度で、色なし(すべてのRGB値が等しい)から最大の色(最も低いRGB値がゼロ)までです。カーブのX軸はピクセルの明るさで、暗いから最大の明るさまでです。中立の位置(色の変化なし)は中間値で、これは初期値でもあります。例:画像の暗いエリアの色の強度を高めるには、カーブの左端を上げてください。Saturation スライダーは、形を変えずにカーブ全体を上下に動かします。 - - TOPIC: ソフトフォーカス +image: soft-focus2.jpg +image: soft-focus.png - 写真に古典的な「ソフトフォーカス」効果を適用します。これはシャープな画像とわずかにぼかした画像の混合です。radius の設定はぼかしの範囲(ピクセル幅)を決定し、mix の設定は混合された出力画像内のぼかした画像の割合を0~100パーセントで設定します。この機能では{ペイント編集}を使って、画像の異なるエリアで効果を変化させることができます。 - - TOPIC: 明るさグラデーション +image: brite-ramp1.png +image: brite-ramp2.png - 画像全体で明るさや色を変化させます。これは、不均一な照明や画像全体で変化する色かぶりを補正するために使用できます。変化の方向は、画像に線を描くことで決まります。画像をクリックして線を作成し、いずれかの端をドラッグして希望の方向を設定してください。上の例では、線の方向に緑が増加しています。まず All カーブを編集して全体の明るさ(すべての色)を調整し、必要であれば個々のRGBカラーカーブを調整してください。 - - TOPIC: ビネット +image: vignette.png +image: vignette2.jpg - 写真の隅に見られる暗さを補正します。画像内の被写体やエリアをハイライトしたり色付けしたりするためにも使用できます。 - 画像上でクリックまたはドラッグすると、ビネットの中心(最初は画像の中心)を変更できます。 - 「Brightness」を選ぶと、放射状のパターンで画像の明るさを変更できます:カーブの左端または右端を調整して、それぞれ画像の中心とエッジの明るさを変更してください。人物写真の背景を暗くしたり、隅が暗くなった画像を修正したりできます。カーブの中間レベルは変化なしに対応します。低い値で暗く、高い値で明るくしてください。上の例では、広い中心エリアはそのままに、画像の周辺部を徐々に暗くしています。 - 「Color」を選ぶと、放射状のパターンで選んだ色を画像に追加できます。カーブの値がゼロの場合は変化なしを表し、値が高いほど選んだ色が画像に多く追加されます。最高値は100%の色に対応します。この機能を使うと、画像に色の縁取りを追加できます。例えば、徐々に強くなる色で顔を縁取ることができます。 - - TOPIC: 効果メニュー - - TOPIC: 輪郭線 +image: outlines1.png +image: outlines2.jpg - 写真を輪郭線の絵に変換します。高コントラストのピクセルは強調され、低コントラストのピクセルは抑制されます。threshold の設定はコントラストのしきい値を設定します。最小値未満の線は表示されず、最大値より高い線は最大の明るさになります。「black/white」チェックボックスは、「negative」チェックボックスに応じて、色付きの線を白地に黒、または黒地に白に変換します。褪せた線を明るくしたい場合は「Low Amplify」を使用してください。「Mode B」は「Mode A」に比べてより均一な線の明るさになります。 - - TOPIC: スケッチ1 +image: sketch1.jpg - 写真をスケッチのようなものに変換します。暗いピクセルはより少ないピクセルに集約され、空いたエリアは明るくなります。コントラストも暗いピクセルの代用として使用できます。Threshold を使って明るさで入力画像をフィルタリングできます。Clip Level は、出力から孤立した、またはわずかに暗いピクセルをさらに減らすために使用します。前景と背景の色を選んでください。入力画像のサイズを縮小すると興味深い結果が得られることがあります。結果が「汚く」見える場合は、ここで処理する前に{ノイズ除去}や{フュージョン}を使って画像を滑らかにしてください。 - - TOPIC: スケッチ2 +image: sketch2.png +image: sketch2b.jpg - 写真をスケッチのようなものに変換します。これは別の方法を使用します:低い...高いコントラストのピクセルはそれぞれ明るい...暗いピクセルに変換されます。カーブを使ってコントラスト変換の強さを増減できます。X軸のスケールはピクセルのコントラストで、低いから高いまで、Y値は変換の強さを決定します。この例は、低コントラストのピクセルが抑制されて(明るくされて)いる様子を示しています。入力画像は任意の比率でブレンドできます。結果が「汚く」見える場合は、ここで処理する前に{ノイズ除去}や{フュージョン}を使って画像を滑らかにしてください。 - - TOPIC: カートゥーン +image: cartoon.jpg - 写真をカートゥーン風の絵に変換します。明るさや色が急激に変化する画像の被写体のエッジに黒い線が描かれます。Line Threshold はエッジ検出と線描画の感度を設定し、描かれる線を増減させます。Line Width は線を太くまたは細くします。Kuwahara Depth は、画像内の被写体のエッジを強調できるシャープ化機能を制御します。 - - TOPIC: エンボス +image: emboss2.jpg +image: emboss.png - 画像を模擬レリーフまたはエンボス画像(3D効果)に変換します。被写体のエッジは一方が明るく、反対側が暗くなり、まるで浮き上がって横から照らされているように見えます。radius の設定は効果の幅を決定し、depth の設定は強度を決定します。Light Source の設定は、見かけの照明がどの角度から来ているかを決定します。これは、この角度に最も垂直な被写体のエッジに対して効果を最大化するために変化させることができます。 - - TOPIC: タイル1 単色タイルの配列に画像を変換します。タイルのサイズとタイル間の隙間の太さを制御できます。これは「pixelate」とも呼ばれます。Select Area を使うと、変換を限られたエリア(例えば顔)に限定できます。 - - TOPIC: タイル2 +image: tiles2a.png +image: tiles2b.png - 画像の色と輪郭におおよそ一致する不規則なタイルに変換します。 ^base size:^ タイルの基本サイズで、より大きいタイルを作る際に使われる単位タイルサイズです。 ^color depth:^ 使用する色数:1 = 8色、2 = 64色 ... 8 = 1600万色。 ^tile area goal^: タイルサイズの上限(ピクセル単位の面積)。 ^req. color match^: より小さいエリアを隣接するより大きいエリアに統合するために必要な最小の色の一致度を設定します:0 = 気にしない(最大の統合)、100 = 完全な一致が必要(最小の統合)。 - - TOPIC: 絵画風 +image: painting1.png +image: painting2.png - 画像を絵画に似たものに変換します。色数を減らし、同じ色を持つ連続したピクセルエリアをそれぞれマッピングし、その後、色の一致が最も良い隣接するより大きなエリアに小さいエリアを統合します。 - ^blur radius^: 処理前に画像をぼかします。これにより境界がより滑らかになります。 ^color depth^: 使用する色数:1 = 8色、2 = 64色 ... 8 = 1600万色。 ^patch area goal^: 独自の色を持つエリアの下限を設定します:この数値より小さいピクセル数のエリアは、最も近い色の一致を持つ隣接エリアに吸収されます。 ^required color match^: より小さいエリアを隣接するより大きいエリアに統合するために必要な最小の色の一致度を設定します:0 = 気にしない(最大の統合)、100 = 完全な一致が必要(最小の統合)。 ^borders^: 色付けされたエリアを、モザイクの不規則なタイルのように細い黒い境界線で区切るかどうかを決定します。この機能を使った後、{エンボス}を使うと画像に興味深いテクスチャを追加できます。 - - TOPIC: テクスチャ +image: texture2.jpg +image: texture.png - 画像または画像内の選択エリアにテクスチャのある表面を追加します。Radius はテクスチャのパターンサイズを決定します。Strength はパターンの強さを、ほぼ見えない状態から支配的な状態まで決定します。 - - TOPIC: フュージョン +image: fusion.png +image: fusion2.jpg - 画像内の大きな被写体のシャープさを保ちながら、小さく低コントラストな細部を抑制します。[開始]を押して画像をよく観察してください。処理は[停止]ボタンで停止するまで継続的に実行されます。小さな細部が徐々に薄れていきます。ダイアログボックスの「count」ラベルは反復回数を示します。処理を[停止]して画像を確認し、[開始]で処理を再開できます。Undo/Redoボタンを使って変更前後の画像の状態を比較してください。[開始]で処理を再開してください。[ステップ]ボタンを使うと1ステップずつ処理できます。 - - TOPIC: 色を合わせる +image: match-colors.png - ある画像の色を別の画像の色に合わせます。マウスクリックで選んだ小さなスポットが、各画像からサンプリングされます。2枚目の画像のスポットは、1枚目の画像のスポットと同じ平均色(RGB値)になるよう変更されます。RGB値を同じにするために使用された係数は、その後2枚目の画像のすべてのピクセルに適用されます。一般的な使用法は、別の画像の色に合わせるスポットを画像上に指定することで、画像から色かぶりを取り除くことです。 - 手順:ダイアログには順に実行する5つのステップが記載されています。 • スポットサンプルエリアの半径を設定してください。結果のマウスの円がサンプリングされるスポットエリアです。 • [open]ボタンを押して1枚目の画像を開いてください。 • 画像をクリックして色をサンプリングしてください。 • [open]ボタンを押して2枚目の画像を開いてください。 • 1枚目の画像に合わせたいスポットを画像上でクリックしてください。 画像の色は1~2秒で変化します。 - - TOPIC: パターン +image: pattern2.jpg +image: pattern1.png - 画像に背景パターンを追加します。小さな画像ファイル(パターンファイル)が、タイル張りの壁のようにそのファイルを複製することで現在の画像を覆うために使用されます。このファイルは、実際のパターン(例えば布地の画像、レンガの壁、繰り返しの幾何学模様など)でも、他の種類の画像でもかまいません。パターンは半透明にされるため、基本画像がパターンの上に印刷されているように、あるいはパターンが画像の上に重なっているように見えます。「pattern image」でウェブ検索すると多くのパターンファイルが見つかります。これらのいくつかをダウンロードし、必要であれば200~500ピクセル程度のサイズにクロップしてください。便宜上、これらを ~/.fotocx/patterns に用意されているパターンファイルに追加してください。 - [参照]ボタンを使ってパターンファイルを選択してください。選択したパターンはタイル状に並べられ、基本画像を覆います。パターンは部分的に透明であるため、基本画像が透けて見えます。Zoom を使ってパターンのサイズを拡大・縮小してください。パターンと基本画像を混合する方法は2つあります。パターンの不透明度は0~100%で設定できます。基本画像は使用されていない不透明度部分を埋めるために使用されます。Contrast は、パターンの明るさをテンプレートとして基本画像の明るさを変更するために使用します。この2つのパラメーターは任意の比率で混合できます。 - パターンファイルに、水平方向・垂直方向の両方で一定間隔で繰り返される画像が含まれている場合、[計算]ボタンを使うと、目に見える継ぎ目のない連続したパターンになるよう幅と高さを設定できます。 - パターンが不規則で継ぎ目が目立つ場合、これを改善できることがあります。2つの Overlap の値は、複製されたパターンが水平方向・垂直方向のエッジでどれだけ重なるかを決定します。継ぎ目の影響を隠すために少し重なりを加えてください。 - Select Area を使うと、画像の一部にパターンを適用したり、部分ごとに異なるパターンを適用したりできます。画像にパターンを適用した後、{エンボス}を使ってパターンに3D効果を追加すると面白いかもしれません。 - 「Grayscale」チェックボックスは、カラーパターンをグレースケールに変換します。 - - TOPIC: クロスハッチ +image: crosshatch2.jpg +image: crosshatch1.png - 交差する平行線を使った絵に画像を変換します。 グリッドサイズを入力して[適用]を押してください。 - - TOPIC: ディザ +image: dither1.png - +image: dither2.jpg - この機能は、画像をディザ(ドットに変換)するいくつかの方法を提供します。 0 - ロイ・リキテンスタイン風の色付きドット 1 - ランダムまたは最適化された空間分布を持つ純粋なR/G/Bまたは白黒 2 - 指定したビット深度を使ったRGBミックス 3 - カスタムカラーパレットを使った古典的なディザ 4 - 統合されたピクセルの平均色を持つ塊に画像を凝縮 - 古典的なディザは、色の誤差(入力画像の色とパレット内の最も近い色との不一致)を補正する Floyd-Steinberg 法を使用します。近いエリア全体の平均が入力色により近く一致するよう、必要に応じて近い色のドットが混ぜ込まれます。誤差補正は、明確な色の帯や輪郭を得たい場合はオフにできます。 - 塊:画像のピクセルは一種の「重力崩壊」を起こし、局所的な重心の周りに集まって塊になります。「質量」はピクセルの明るさとして定義されます。「radius」コントロールは、おおよその引力の範囲を定義します。[開始]を押して崩壊を開始してください。画像が「radius」入力とおおよそ同じサイズの塊にゆっくり変化していく様子を見てください。塊がきれいに丸くなり、ほとんど変化しなくなったら、[停止]を押して処理を終了してください。 - - TOPIC: 彫刻風 +image: engrave.png +image: engrave2.png - 画像を白黒の線に変換します。Size 入力は線の太さと、出力の各縦のピクセル列に使われる元画像の縦方向のピクセル数を決定します。線のピクセル列は黒と白の部分に分割され、その割合は入力ピクセルの平均的な明るさにおおよそ一致します。Bias 入力を使うと全体の明るさを最適化できます。負/正の値で画像は暗く/明るくなります。Color 入力(0~100%)を使うと白い部分に色を追加できます。 - - TOPIC: グレアを追加 +image: addglare.png +image: addglare2.jpg - 画像内の明るいスポットから放射状に広がるグレアを追加します。 Power:グレアの相対的な明るさを決定 Limit:グレアを発するしきい値のピクセルの明るさ Range:発光するピクセルからのグレアのピクセル範囲 明るさが Limit(200~255)を超えるピクセルはグレアを発します。ここでの明るさとは、ピクセル内の最も明るいRGB色の明るさを意味します。発せられるグレアは、発光するピクセルの色になります。Range はピクセル単位です。グレアは発光するピクセルで最大になり、Range の限界でゼロまで薄れていきます。 - - TOPIC: モザイク +image: mosaic1.png +image: mosaic2.jpg - すべての画像から作ったタイルを使ってモザイク画像を作成します。 - タイルのサイズをピクセル単位(例:36 x 24)で指定し、[タイル]を押してください。すべての画像(実際には速度のため thumbnail 画像が使用されます)からタイルが作成されます。タイルのサイズを変更した場合、再度[タイル]を押してタイルを再生成してください。タイルが作成されたら、[画像]を押して、これらのタイルを使い現在の画像をモザイクに変換してください。タイルは、タイルの位置における画像の平均色にタイルの平均色を一致させることで選ばれます。数千枚の画像が利用可能で、色の幅が十分に良ければ、モザイクはかなり良い出来になります。画像の任意の部分を拡大すると、タイルの画像が見えます。 - Tile blending スライダーを使うと、画像をタイルとブレンドさせられます。これにより、タイルの色の一致が悪い場合により良く見えるようになります。ブレンドが約50%未満の場合、目が誤った色調を補正するため、タイルはほぼ以前と同じくらい鮮明なままです。 - モザイクを作成した後、任意のタイルをクリックすると、より大きなポップアップ画像が表示されます。保存されたモザイクを開いた場合、タイルをクリックしても大きな画像は表示されません。モザイクの再生成はかなり高速なので、ポップアップを機能させたい場合はこれを行ってください。 - - TOPIC: ノイズを追加 +image: add-noise.png - 画像にランダムな色ノイズを追加します。目標のスポットサイズ1~10とノイズレベル0~100%を設定してください。100%では、各ピクセルの各RGB値に-127から+127の範囲のランダムノイズが追加されます。平均値はゼロです。0~255の範囲を超えたオーバーフローは切り捨てられます。広いエリアにわたる平均色は保たれ、ノイズが重ね合わされます。Add Noise を Select Area や Paint Edits と組み合わせて使うと、選択したエリアにノイズを追加できます。 - ^「バンディング」の抑制 明るさの分布が「引き伸ばされた」画像エリアでは、ほぼ均一な明るさと色のエリアで目に見える「バンディング」が発生することがあります。影響を受けたエリアにノイズ(またはぼかし)を追加することで、この問題を軽減できます。 - - TOPIC: 色を設定 +image: set-colors1.jpg +image: set-colors2.jpg - 画像で使用される色数を減らして、ポスター効果を作成できます。各RGB色を個別に設定するか、合計色数を調整してください。これには色のビット深度は使用されません。Fotocx の一部の機能はビット深度を使用し、各RGB色で利用可能な色を2、4、8...に制限します。この機能はこの点で制限されません。上の例では、赤8色、緑5色、青3色を使用しています。 - - TOPIC: 色をシフト +image: shift-colors.png - この機能は、色を補正したり、画像を偽色に変換したりするために使用できます。3つのRGB色のいずれかを選び、スライダーを中心から左右に動かしてください。他の2色のうち1色が段階的に置き換えられます。例えば、赤の色を緑または青に徐々に置き換えることができます。All スライダーはすべての色を一緒にシフトします。まずこれを行って最初の最適点を見つけ、その後個々のRGB色をシフトしてください。 - - TOPIC: エイリアンカラー +image: alien-colors2.jpg +image: alien-colors1.png - 画像または選択エリアをランダムなエイリアンカラーで塗り直します。おおよそのパターンサイズと強度(ほとんど見えない状態から支配的な状態まで)を制御できます。[適用]を押すと新しい色の分布になります。 - - TOPIC: カスタムカーネル +image: custom-kernel.png - カスタム畳み込みカーネルを画像に適用します。基礎となる技術は Wikipedia で説明されています。カーネルサイズ、乗算係数、加算係数を入力し、テーブルの値を入力してください。[適用]はカーネルを画像に適用します。[リセット]は元の画像の状態に戻します。値はファイルに保存し、[保存]と[読み込み]ボタンで後で取得できます。いくつかのカーネルの例ファイルが最初から利用可能です。これらを変更し、カスタム名で保存できます。 - 数学的には:画像内の各NxNブロックのピクセルの明るさの値が、カーネル行列内の対応する値と掛け合わされて合計されます。この数値に乗算係数が掛けられ、加算係数が加えられます。この最終値が、NxNブロックの中心にある画像ピクセルの新しい明るさレベルになります。 - - TOPIC: ゆがみ補正メニュー - - TOPIC: 曲げ補正 +image: unbend1.png +image: unbend2.jpg - 近くの被写体(通常は建物や室内)のパノラマでは、まっすぐな線が曲がって見えたり、建物が傾いて見えたりすることがあります。パノラマ処理では、画像同士がうまく合うようにするため画像のゆがみ補正が必要でした。Unbend 機能は、必要であればその後にパノラマ画像をまっすぐにするために使用できます。ゆがみ補正の軸を示す縦横の点線が画像の上に描かれます。線の端付近をクリックまたはドラッグすると動かせます。4つの入力コントロールの値を変更すると、対応する4つの画像で示された方法で画像がゆがみ補正されます。満足いくまで値を増減して繰り返してください。軸を動かすとゆがみ補正の中心を変更できます。 - 画像の湾曲やパースを補正する別の方法については{画像のゆがみ補正}も参照してください。 - - TOPIC: パースペクティブ +image: perspective2.jpg +image: perspective1.png - この機能は、斜めの角度から撮影された写真をまっすぐにするために使用できます。左の画像は元の写真で、反射を避けるため中心よりも右から撮影されたものです。右の画像はまっすぐにされたバージョンです。この機能は、地上や横から撮影された高い建物の写真をまっすぐにするためにも使用できます。 - 長方形にしたい四辺形(上の例では絵画や額縁の4つの角)の4つの角をクリックし、[適用]を選択してください。クリックした角には「A、B、C、D」という文字の入った小さな白いボックスが付けられます。各ボックスの左上の角が正確に画像の位置を示します。ボックスの近くをクリックすると、新しい位置に移動します。キーボードの矢印キーを使って角のマーカーを1ピクセル単位で動かせます。矢印キーが動かすのは、最後にクリックまたは移動した角です。 - - TOPIC: 画像のゆがみ補正 +image: warps4.jpg - - TOPIC: エリアのゆがみ補正 この機能は、画像内でゆがみを作るために使用できます。画像エリアを選択し、マウスをドラッグして画像の残りの部分に対してこのエリアを引き伸ばすことができます。画像はまるでゴムのようです。マウスドラッグが選択したエリア内で始まる場合、そのエリアは現在の境界内でゆがみます - 動きはマウスポインターで最大になり、エリアの端でゼロになります。マウスドラッグが選択したエリアの外側で始まる場合、マウスに近いエリアの端は元のエリア境界を越えて引き出されることがあります。異なる長さと方向の多くのマウスドラッグを組み合わせて、希望の結果を得ることができます。 - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - この機能は、パースの問題を補正するのに役立ちます。マウスを使って画像を角の近くからドラッグしてください。他の角は固定されたまま、この角から画像が弾性的に引っ張られます。 - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - この機能は、パースの問題を補正するのに役立ちます。マウスを使って画像を内部からドラッグしてください。境界は固定されたまま、画像の内部が弾性的に引っ張られます。 - - TOPIC: 曲面ゆがみ補正 この機能は、パースの問題を補正するのに役立ちます({曲げ補正}も参照)。マウスを使って画像の任意の位置からドラッグしてください。画像全体がマウスの方向に引っ張られる、または押されますが、マウスに近いエリアはより遠いエリアより大きく動きます。曲がった線をまっすぐにしたり、意図的に画像を曲げたりできます。「warp span」コントロールは、マウスの周りのゆがみの半径を決定します。1.0は画像全体がゆがみ補正されることを意味し、より小さい値はマウス周辺のより小さいエリアにゆがみを限定します。 - - TOPIC: アフィンゆがみ補正 この機能は、興味深い方法で画像をゆがませるために使用できます。マウスを使って角または端から画像をドラッグしてください。変化は純粋に線形であるため、直線は直線のままです。この変換は「アフィン」と呼ばれます。詳細はウェブ検索で見つけられます。 - - TOPIC: 放射状ゆがみ補正 +image: warp_radial.png - 樽型または糸巻き型のゆがみを追加または除去します。樽型のゆがみは、この歪みを除去する処理がされていない RAW 画像でよく見られます。左クリックで、変化の中心となる点を選んでください - 通常は画像の中心です。これが既定値です。「stretch」スライダーを動かして画像を曲げてください。 - - TOPIC: クローズアップのゆがみ補正 +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - クローズアップの顔写真は、カメラに近いエリアが遠いエリアよりも写真の中で大きくなるため、しばしば歪んで見えます。この機能は、その歪みを反転させるために使用できます。{エリアを選択}を使ってまず顔を選択してください(正確である必要はありません)。歪みの中心付近(上の例では右頬)をクリックしてください。スライダーを動かして最適化してください。 - - TOPIC: 波を作成 +image: make-waves2.jpg +image: make-waves1.png - この機能は、乱れた水を通して見ているかのように、画像を波状のパターンに歪ませます。ダイアログでは、平均的な水平・垂直の波長、振幅、分散を変更できます。「perspective」入力を使うと、波長を上から下に向かって徐々に長くできます。 - - TOPIC: ツイスト +image: twist1.png +image: twist2.png - この機能は、マウスのクリックまたはドラッグで選んだ点を中心に画像をツイストします。希望の位置をクリックし、Twist スライダーを希望の量だけ動かしてください。マウスを画像の周りでドラッグしてツイストの中心を変更することもできます。Center スライダーは、中心エリアを残りの部分に対してツイスト解除します。Angle スライダーは画像を回転します。 - - TOPIC: 球体 +image: sphere2.jpg +image: sphere.png - 画像の球面投影を作成します。マウスを画像上でドラッグして投影の中心(既定は中間点)を変更してください。flatten コントロールは、投影を球(右)から平面画像(左)へ段階的に変更します。magnify スライダーは結果の画像を最大2倍まで拡大します。 - - TOPIC: 内側と外側を反転 +image: inside-out2.jpg +image: inside-out1.png - この機能は、各ピクセルの中心からの距離とエッジからの距離を反転します。マウスをクリックまたはドラッグして中心点を変更できます。 - - TOPIC: タイニープラネット +image: tiny-planet.jpg - 画像を円の周りに巻き付けます。 画像が360度パノラマの場合、目に見える継ぎ目はありません。 • Center Hole:画像が中心の穴の周りに巻き付けられます。 • Cut Top:入力画像から上部の余白を除去します。 • Cut Bottom:入力画像から下部の余白を除去します。 • Reverse R:入力画像を垂直方向にミラー反転します。 • Reverse Theta:入力画像を水平方向にミラー反転します。 • Rotate:出力画像を中心の周りに回転します。 - - TOPIC: エッシャー螺旋 +image: escher-spiral.png +image: escher-spiralA.png - M.C.エッシャーの有名な時計のように、画像を無限に内側へ渦巻く螺旋に変換します。Width は最も外側の層の初期の幅を決定します。Rim は層を区切る境界の初期の幅を決定し、Color はその色を決定します。既定の中心は画像の中心です。画像をクリックすると新しい中心を設定できます。 - - TOPIC: 写真をフラット化 +image: flatten-photo1.png +image: flatten-photo2.jpg - ^本のページやその他の湾曲した面 円柱の周りなど湾曲した面、または開いた分厚い本のページ(中央の綴じ部分に向かってページが内側に湾曲している場合)にある画像の写真をフラット化します。面の上端と下端の湾曲は、湾曲の程度と、平らに見せるために必要な引き伸ばしの程度についての情報を提供します。上の例は分厚い本です。円柱状のポスターなど、他の丸みを帯びた面も補正できます。 - 上側のトレースオプションを選択して、湾曲したページの上端をトレースしてください。マウスでエッジに沿ってクリックし、クリックした各点にマーカーの点を作成してください。4つの点が揃うと、それらの点を通る曲線が描かれます。線が画像の湾曲に近く一致するよう、必要に応じて点を追加したり点をドラッグしたりしてください。下側のトレースオプションを選択し、同様の方法で下端をトレースしてください。両方が完了したら[flatten]を押してページをフラット化してください。エッジがまっすぐに(または十分にまっすぐに)なるはずです。[stretch]スライダーを使って、湾曲による横方向の圧縮を補正するため必要に応じて画像の両側を引き伸ばしてください。Widen コントロールを使って、正しい幅/高さの比率に戻すため必要に応じて画像を広げてください。[undo]ボタンは未修正の画像を復元しますが、マーカーの点は保持されるため、修正した試みのために調整できます。 - +image: flatten-photo3.jpg - ^湾曲した水平線 広いパノラマや広角レンズで撮影した写真では、水平線がまっすぐでなかったり水平でなかったりすることがあります。水平線やまっすぐな線に沿わせたいその他のエリアに曲線をトレースすることで、画像をまっすぐに(またはその他の方法で)調整できます。水平線(または画像の他の部分)が画像中央の上側または下側のどちらに主にあるかに応じて、上側または下側のトレースオプションを選択してください。この曲線をまっすぐにするよう画像がゆがみ補正されます。曲線は1つで十分です。もう一方の曲線は、画像の反対側の端(上または下)に自動的に追加されます。結果が満足いくものでない場合は、[undo]ボタンを使い、どちらかの曲線のマーカーを調整して再度試してください。画像を保存し、その保存した画像を出発点としてこの機能を2回目に適用することもできます。 - - TOPIC: 結合メニュー これらは複数の画像ファイルを結合する機能です。画像が重なっている場合、各画像内の対応する被写体が1ピクセルの精度で一致するよう位置合わせされます。位置合わせにかかる時間は通常、1画像あたり10~30秒です。この位置合わせ処理がうまくいっていないと感じた場合は、Escape キーを使って処理を中止できます。 - - TOPIC: HDR ^ハイダイナミックレンジ +image: HDR.jpg +image: HDR-adjust.png - 同じ被写体を異なる露出レベルで撮影した複数の画像を結合(重ね合わせ)します。結合された画像は、暗いエリアと明るいエリアの両方で細部の見え方が改善されます。実質的に、暗いエリアにはより明るい画像のピクセルを、明るいエリアにはより暗い画像のピクセルを使用します。撮影の合間にカメラを手動で調整する場合は、水平を保ち、同じ遠くの点を狙うよう注意してください。入力画像の多少の位置ずれは許容されます。撮影の間に人や物が動く場合、ゴーストは避けられません。 - HDR メニュー機能を選択し、最大9枚の画像を選択してください({画像ファイルを選択})。これらはすべてほぼ同じピクセルサイズである必要があります。画像は自動的に位置合わせされ結合されます。完了すると、結合された画像が調整用のダイアログとともに表示されます。入力画像の寄与度は、一連の編集可能なカーブとして表示されます。横軸はピクセルの明るさを表し、暗いから明るいまでです。各カーブは出力ピクセルに寄与する1枚の画像を表します。ある明るさレベルでの画像の寄与度は、そのレベルでのカーブの高さに比例します。最も明るい画像の初期カーブは左側が高く右側が低くなり、これは暗いピクセルへの寄与度が高く明るいピクセルへの寄与度が低いことを意味します。最も暗い画像は左側が低く右側が高くなり、残りの画像はその間になります。カーブはマウスでドラッグすることで編集できます。対応する画像の寄与度がそれに応じて変化し、その結果を出力画像でリアルタイムに確認できます。上の画像は2枚の入力画像とその出力画像を示しています。ダイアログの例は、3枚の入力画像を最適化するために調整された3つのカーブを示しています。 - - TOPIC: HDF ^被写界深度合成 複数の焦点設定(近くから遠くまで)で撮影した同じ被写体の複数の写真を結合(重ね合わせ)します。被写体の異なる部分が、それぞれの画像で鮮明にピントが合っています。被写体のすべての部分が鮮明になるよう画像を結合します。 - 写真の撮影:画像の中心にする点を選んでください。カメラを近くの被写体に向け、シャッターボタンを半分まで押してこの被写体にピントを合わせてください。ボタンを半押しの位置に保ったまま、選んだ中心にカメラを向けて撮影してください。今度はより遠くの被写体を選び、同じことを行ってください。ピント距離を伸ばしながら繰り返してください。被写体の各部分が少なくとも1枚の写真で鮮明になっていることを願います。カメラの位置はすべての写真でほぼ同じである必要があり、被写体が非常に近い場合は難しいことがあります。カメラの動きは、スケーリングや視差の問題(近い被写体が遠い被写体に対してずれる)を引き起こすことがあります。このような問題は後で Fotocx で修正できる場合がありますが、かなりの時間がかかることがあります。問題を避ける方が良いでしょう。 - +image: HDF-paint.png - 写真の処理:HDF メニュー機能を選択し、最大9枚の画像を選択してください({画像ファイルを選択})。画像は可能な限り位置合わせされます。出力画像は、位置合わせされた入力画像の均等な混合です。写真間の少量のカメラの動きは補正されますが、これには限りがあり、視差のずれはまったく補正されません。位置合わせが完了すると、ダイアログが開きます。任意の入力画像を選択し、マウスで出力画像の任意のエリアに「ペイント」できます。これにより、ペイントされたエリアの元の画像の混合が、選択した単一の画像に変換されます。画像内の各エリアや被写体について、そのエリアで鮮明な入力画像を選んでください。ペイントブラシの半径は大きく、または小さく設定できるため、広いエリアを素早くペイントしたり、必要であれば細部を制御したりできます。近くと遠くの被写体が重なっている場合、それらすべてを鮮明にするには時間と忍耐が必要です。ダイアログで warp オプションを選択すると位置ずれを修正できます。すると元の画像をマウスでドラッグしてゆがみ補正でき、それに応じて結合された出力画像が変化します。ゆがみ補正はマウス周辺のエリアに限定されます。ペイントされたエリアをドラッグすると、対応する入力画像が自動的に選択されドラッグされ、他の画像でペイントされたエリアは固定されたままです。ペイントされていないエリアはドラッグできません。異なるエリアを動き回り、すべてが位置合わせされるまで少しずつドラッグしてください。 - 推奨ワークフロー:ペイントモードを使って、各画像を順番に選び、その画像で鮮明に見えるすべてのエリアをペイントしてください。うまく位置合わせされていない境界は、画像の被写体のエッジのずれとしてはっきり現れます。これらの一部は、ペイントに使用する画像を変更することで(十分鮮明な画像が複数ある場合)目立たなくできます。warp モードを使って、見えるずれをなくすため必要に応じて微調整してください。 - - TOPIC: スタック/ペイント +image: stack-paint.png - +image: stack-paint2.jpg - 異なる時間に撮影した同じ被写体の複数の写真をスタック(重ね合わせ)します。撮影の合間に出入りする観光客や車を除去します。 - 写真の撮影:同じ遠くの点にカメラを向け、観光客や車が被写体の前を通過する間に複数の写真を撮影してください。一時的な被写体に遮られていない被写体の各エリアについて、2枚以上の写真を得るようにしてください。画像が正確に位置合わせされるよう、カメラを安定させ同じ点に向けてください。 - 写真の処理:Stack/Paint メニュー機能を選択し、最大9枚の画像を選択してください({画像ファイルを選択})。画像は可能な限り位置合わせされます。出力画像(左下)は、位置合わせされた入力画像(上の行)の均等な混合です。位置合わせが完了すると、上に示したダイアログが開始されます。任意の入力画像を選択し、マウスで出力画像の任意のエリアに「ペイント」できます。ペイントされたエリアには、選択した1枚の画像が使用されます。画像内の各エリアについて、一時的な被写体が写っていない入力画像を選んでください。ペイントブラシの半径は大きく、または小さく設定できるため、広いエリアを素早くペイントしたり、必要であれば細部を制御したりできます。 - 自動処理:[非表示]ボタンを押すと、一時的な被写体が自動的に除去できるかどうかを確認できます。これは、遮られていない背景の複数の写真が利用可能な画像内のエリア(下中央の画像)で機能します。すべての一時的な被写体を表示するには、[表示]ボタンを押してください(右下の画像)。これは一般的にうまく機能しますが、完璧ではありません。わずかな画像の位置ずれや照明の違い(特に動く影)により、アルゴリズムが前景ピクセルの代わりに背景ピクセルを選択してしまうことがあります。上記のペイント方法を使って手動でエラーを修正できます。 - - TOPIC: スタック/ノイズ +image: stack-noise2.jpg +image: stack-noise.png - この機能は、同じ被写体の2~9枚の写真を結合します。写真は、手持ちのカメラによる小さなずれを除けば、ほぼ同じである必要があります。非常に高い ISO 設定(低照度条件)で撮影された写真の場合、ピクセルにはかなりのノイズがあります。多くの写真を撮影して平均化することで、ノイズをほぼ除去できます。 - 写真の処理:Stack/Noise 機能を選択し、最大9枚の画像を選択してください({画像ファイルを選択})。これらは自動的に結合されて表示され、ダイアログが開きます。初期の出力画像は、選択したすべての入力画像を平均化した組み合わせです。これは、各出力ピクセルのRGB値が、対応する入力ピクセルのRGB値の平均であることを意味します。median ボタンは、出力ピクセルを入力ピクセルの中央値に変更します(画像数に応じて、中央の1~3個のRGB値が平均化されます)。これが良い場合も悪い場合もあるため、切り替えて比較してください。omit low pixel と omit high pixel のチェックボックスは、平均化前に最も低い値と最も高い入力RGB値を破棄させます。これにより、混合からノイズのスパイクが除去されることがあります。median 方式が選択されている場合、これは効果がありません。 - - TOPIC: スタック/レイヤー +image: stack-layers.png - この機能を使うと、画像の異なる編集バージョンを結合し、選択した画像エリアでどのバージョンを表示するかを決定できます。同じピクセルサイズを持つ任意の画像を結合できます。 - 同じサイズの画像を最大9枚選択してください。初期の出力画像は、すべての入力画像を均等にブレンドしたものです。Image Ratios はブレンドされる画像の相対的な重みです。これらを調整して各画像の重みを変えられます。例:3、5、7の相対的な重みで3枚の画像を結合した場合、結合された画像は画像#1から3/15、#2から5/15、#3から7/15になります。「Paint entire image」オプションが選択されている場合、重みを調整すると出力画像は即座に反応します。「Paint within mouse」オプションが選択されている場合、マウスをドラッグでき、現在有効な image ratios を使って、マウスの円内のエリアのみがペイントされます。ペイントの速度は、マウスの中心とエッジの Power 設定で制御されます。徐々にペイントするには小さい数値を使用してください。 - - TOPIC: パノラマ +image: pano-align1.jpg +image: pano-align2.jpg - この機能は、2~6枚の画像をつなぎ合わせてワイドアングル画像やパノラマを作成します。プログラムが一致箇所を見つけて結合できるよう、画像は10%以上重なっている必要があります。まず2~6枚の画像ファイルを選択してください({画像ファイルを選択})。最初のおおまかな位置合わせを簡単にするため、左から右の順に画像を選択すると便利です。画像は最初、小さな透明な重なりとともに結合され表示されます。プリアラインダイアログ(上図)は、画像をおおまかに位置合わせするためドラッグするよう求めます。画像を正しい左から右の順序にドラッグしてください。ドラッグする画像は他の画像と重なることがあります。どの画像がドラッグされているかを明確にするため、画像の中心付近からドラッグしてください。画像が正しい順序になったら、各画像をその左隣に位置合わせしてください。左から右へ進めるのが最も効果的です。画像を水平・垂直に動かして左隣とおおまかに位置合わせし、必要であれば下端を左右にドラッグして画像を回転させてください - 画像は左の画像との重なりの中点を軸に回転します。最も速い方法は、まず重なりの中央部分を位置合わせし、その後必要であれば上下の重なり部分を合わせるため右の画像を回転させることです。極端な精度は必要ありません。画像は正しく湾曲し、うまく合わさるはずです。もしそうでない場合は、「lens mm」(焦点距離、35mm換算)の調整が必要です。lens mm を調整すると画像の湾曲が変化します。初期値は、利用可能であれば EXIF metadata から取得され、通常はこれで十分です。画像に湾曲がない場合(例:スキャンした画像)は、「no curve」チェックボックスを使って「lens mm」を事実上無限大に設定してください。 - 画像のいずれかがクロップされている場合、EXIF の焦点距離に依存する計算はうまく機能しません。「lens_mm」の焦点距離を増やすことで補正できる場合があります。 - 「manual align」チェックボックスは、手動での事前位置合わせを最終的な位置合わせとして使用します。これは、画像の位置合わせに必要な明確な特徴がない画像向けです。このオプションでは、画像の重なりをゼロにすることもできます。 - 事前位置合わせが終わったら[proceed]を押してください。プログラムは細かい位置合わせを行い画像を結合します。内部的には、画像がシフト・回転され、一致度が評価されます。これは、最良の位置合わせが見つかるまで画像サイズを大きくしながら行われます。CPU の速度と画像サイズによっては、1分以上かかることがあります。入力画像を2/3または1/2サイズに縮小すると、処理を大幅に高速化できます。メモリ不足で処理が失敗する場合もこれを行ってください。 - +image: pano-adjust.jpg - 細かい位置合わせが完了すると、結合された画像が表示されます。上のダイアログが明るさの微調整のために開始されます。画像の明るさが同じでない場合、画像間に境界線が見えることがあります。上部のラジオボタンを使って画像を選択してください。[自動カラー]ボタンを繰り返し押すと、画像の明るさ/色の一致を自動的に改善できます。基準画像は現在選択されているものです。どれが最もうまく機能するか、異なる基準画像を試してください。画像の明るさが大きくずれている場合は、最も外れている画像を選択し、明るさコントロールを使って他の画像に合わせて明るさを変更し、その後[自動カラー]を使用してください。この一致はあまり良くなくてもかまいません。後述の「Blend Width」が残った差を隠すためです。「File Color」ボタンを使うと、入力画像ファイルから明るさレベルをリセットできます。 - 「Blend Width」コントロールは、画像がどのように結合されるかを制御します:画像の重なり部分で、完全には補正できない不均衡を隠すため、この数のピクセルにわたって明るさが変化させられます。既定値は1ピクセルで、これは明るさの違いを明白にします。 - 画像が完全に位置合わせされない場合、マウスを使って画像を押し込むことで位置合わせを改善できることがあります。「Mouse Warp」を選択し、ラジオボタンでいずれかの画像を選んでください。その後、隣の画像と位置合わせすべき画像のエッジに沿ってマウスをドラッグし、画像を位置合わせしてください。画像はマウスの周りで局所的に動き、より遠い部分は固定されたままです。視差のずれがある画像では、前景と背景の両方を位置合わせすることは不可能なため、妥協が必要になります。 - flatten image コントロールを使うと、画像を「曲げ補正」でき、曲がった線(例えば湾曲した建物)をまっすぐにできます。値0は効果がなく、値1.0は画像を完全にフラット化します。 - 完了したら、最終調整のため{曲げ補正}、{画像のゆがみ補正}、{クロップ}などを使用してください。 - ^スキャンした画像 十分な重なりがあれば、スキャンした画像も結合できます。湾曲がないため「no curve」をチェックしてください。 - ^自動ゆがみ補正 最良の一致を見つけるため、位置合わせ中に画像は様々な方向にわずかにゆがみ補正されます。これは、カメラの水平線や回転のずれを補正するためのもので、これらは一致の質を下げる画像の歪みを引き起こします。2枚の画像の重なりエリアに、2枚の写真の間で動いた大きな被写体が含まれている場合、位置合わせ処理が画像の一致を求めて暴走し、位置合わせが非常に悪くなることがあります。「no auto warp」を選択すると、位置合わせを成功させたり、誤差を小さくしたりできる場合があります。もう1つの選択肢は manual align を選ぶことです。 - ^パノラマの結合 1回の処理で最大6枚の画像のパノラマを作成できます。側面で合わさるパノラマ同士を結合することもできます。例えば、4枚画像のパノラマを別の4枚画像のパノラマと結合して8枚画像のパノラマを作ることができます。パノラマ画像は既に湾曲しているため(最終パノラマダイアログで「flatten」オプションを使用していないと仮定)、パノラマを結合する際は通常の画像の湾曲を停止する必要があります。プリアラインダイアログで「no curve」ボックスをチェックして画像の湾曲を停止してください。 - ^パノラマの制限事項 近くの被写体を含むパノラマは扱いが難しい場合があります:写真を撮る際は、レンズを通る軸を中心にカメラを回転させ、横方向の動きを最小限にするよう注意してください。そうしないと、前景の被写体が背景に対してずれる(視差)ため、画像がうまく位置合わせされないことがあります。被写体が50メートル以上離れている場合、小さな横方向の動きは画像にほとんど影響しないため、これは問題になりません。大きな垂直方向のずれ(水平線のずれ)を避けるため、カメラを水平に保ってください。これは、完全には補正できない画像の歪みを引き起こす可能性があります。同じ理由で、カメラを回転させないようにしてください。 - ^垂直パノラマ これは、入力画像を90°回転させることで行えます。Panorama では、上の画像が左に、下の画像が右になるよう、上から下の順に画像を選んでください。通常どおりパノラマを実行してください。左が上になるよう出力画像を回転させてください。 - - TOPIC: CIM ファイルを表示 現在または最新の結合画像の入力ファイルを、ポップアップウィンドウに表示します。現在または最新のセットのみが記憶されます。 - - TOPIC: マッシュアップ +image: mashup.jpg - 複数の画像とテキストをレイアウトに配置します。画像はマウスでドラッグして追加、リサイズ、回転、移動できます。画像は選択したエリアで完全または部分的に透明にできます。テキストは追加、移動、リサイズ、回転できます。テキストの属性(フォント、サイズ、色、輪郭、影、透明度)を指定できます。線や矢印を追加できます。ここでの例はいくつかの可能性を示しています。 - +image: mashup1.png - 最初の Mashup ダイアログでは、他の画像を配置する背景またはレイアウト画像を選びます。既存の画像を選ぶか、指定したサイズと色で新しい単色画像を作成してください。以前保存した mashup プロジェクトを開いて編集を続けることもできます。 - +image: mashup2.png - 2つ目の Mashup ダイアログは選択肢です:画像を編集、テキストを編集、線や矢印を編集、より大きいサイズにリスケール、完成した結合画像を保存(Done)、または画像を破棄(Cancel)。最初の3つの選択肢は、それぞれの編集を行うダイアログにつながります。これらはそれぞれ完了後にこのダイアログに戻るため、画像、テキスト、線/矢印を任意の順序で追加または変更できます。Rescale は以下で説明します。 - +image: mashup3.jpg - このダイアログを使って、レイアウトに画像を選択・配置し、サイズ、回転、位置、透明度など見た目を修正してください。画像は、全体的に、または指定したエリア内で、部分的または完全に透明にできます。これは、背景画像や重なった画像が透明なエリアを通して見えることを意味します。Add Image ボタンはギャラリーファイル選択ダイアログ({画像ファイルを選択})につながります。選択した画像がレイアウトに配置されます。画像を追加したら、任意の画像をクリックして修正対象として選択してください。画像を中央からドラッグしてレイアウト内の位置を調整してください。右下の角をドラッグして画像のサイズを変更してください。ダイアログのコントロールを使って画像を調整してください。ダイアログのコントロールは、最後に追加、クリック、またはドラッグした画像に作用します。「Prev」と「Next」ボタンは、選択した画像を点滅させながら画像を1つずつ切り替えます。これは、重なった画像をクリックして目的の画像を選ぶのが難しい場合に使用できます。Scale は画像をリスケールします。Angle は画像を回転させます。Stacking Order ボタンは、他の画像に対して画像を上げ下げします - これにより、重なっている画像のどちらが上になるかが決まります。Base Transparency は画像全体を部分的に透明にするために使用します。[ペイント]ボタンは、以下に示す Paint ダイアログを使って、画像の任意の部分を部分的または完全に透明にするために使用します。[ゆがみ補正]ボタンは、以下に示す Warp ダイアログを使って画像を曲げたりゆがませたりするために使用します。「black margins」チェックボックスは、warp などの他の編集機能によって残った黒い余白を除去するために使用でき、これらは透明にされます。「Image is fixed」ボタンは、マウスやキーボードによる画像の移動を防ぎます。画像を微調整している際に誤って動かしてしまうのを防ぐのに役立ちます。Margins コントロールは、画像のエッジを透明にするために使用します。Hard margins は画像のエッジを切り取ります。Blend margins はエッジを部分的に透明にして背景や他の重なった画像に溶け込ませます。 - +image: mashup4.png - 選択した画像エリアの透明度を多少「ペイント」します。画像をクリックして選択してください。マウスポインターは、動作範囲を示す円です。radius を使ってサイズを調整してください。円で覆われたエリアを透明にするには、画像上でマウスを左ドラッグしてください。不透明にするには右ドラッグしてください。Gradual がチェックされている場合、マウスをドラッグするにつれて透明度の変化がゆっくり行われます。変化の速度を調整するため、マウスの中心とエッジの power 値を指定してください。 - +image: mashup5.png - warp ダイアログは画像をゆがみ補正するために使用します。画像をクリックして選択してください。マウスで画像をドラッグしてください - 画像はマウスの方向に局所的にゆがみ、または引き伸ばされます(ゴムのシートのように)。ゆがみ補正のエリアは、画像サイズの割合である warp span でおおよそ決まります。各ドラッグは、以前のステップに追加される1ステップです。最近のステップは[undo last]で元に戻すことができ、曲がっていない画像は[undo all]で復元できます。 - +image: mashup6.png - Edit Text ダイアログは、レイアウトにテキストを配置するために使用します。テキストを入力して[適用]を押してください。テキストを追加する位置をレイアウト上でクリックするよう求められます。位置にドラッグし、その後ダイアログのコントロールを使ってフォント、サイズ、色、角度、背景色、輪郭のサイズと色、影のサイズと色、およびこれらそれぞれの透明度を設定してください。いつでもテキストを新しい位置にドラッグできます。既存のテキストをクリックすると、そのプロパティがダイアログに表示され修正できます。テキストをクリックして Delete を押すと削除されます。編集が終わったら[OK]を押して2つ目の Mashup ダイアログに戻ってください。 - +image: mashup7.png - Edit Line/Arrow ダイアログは、レイアウトに線や矢印を配置するために使用します。テキストの追加とよく似た動作をします。長さと太さを入力して[追加]を押してください。線を追加する位置をレイアウト上でクリックするよう求められます。線がレイアウトに配置されます。矢印の先端のオプションのいずれかがチェックされている場合は矢印になります。線/矢印を希望の位置にドラッグしてください。ダイアログを使って長さ、太さ、角度、属性(背景、輪郭、影)を調整してください。線/矢印のどちらかの端をドラッグして、もう一方の端は固定したままその端の位置を設定することもできます。 - マウスを使ってレイアウト内の被写体を移動・リサイズできます: • 被写体をクリックして選択してください - 選択の確認のため点滅します。 • だいたい中央からドラッグして被写体を配置してください。 • 右下の角をドラッグして被写体のサイズを変更してください。 • 線/矢印の場合、いずれかの端をドラッグするとその端のみが動きます。 - キーボードの矢印キーを使っても、現在選択されている被写体を1ピクセル単位で移動できます。 - {エリアを選択}で保存した画像を追加できます。Edit Images ダイアログで[追加]を押してファイル選択ダイアログを開始してください。ギャラリーウィンドウの[上]ボタンを使って「saved_areas」を選択してください。そこにある .png 画像のいずれかを開いてください。元のエリアの輪郭が使用され、これらのエッジからエリアのブレンドが機能します。 - ^Mashup プロジェクトファイル プロジェクトを保存し、後で開いて編集を続けることができます。Mashup プロジェクトは、これらの画像とプロジェクトファイルに保存された一部のデータ(画像とテキストの位置、スケール、透明度など)を使って再構築されます。 - ^Mashup のリスケール 非常に大きなレイアウト(2000万ピクセル以上)での作業は、かなり遅くなることがあります。大きなオーバーレイ画像をドラッグすると、動きがぎこちなく遅くなることがあります。プロジェクトの構築に小さいレイアウトを使い、完成後に大きくすることで、はるかに速く作業できます。オーバーレイ画像とテキストは入力から再生成されるため、最終画像で解像度の損失はありません。Rescale ボタンを使うと、プロジェクトを2倍、3倍、4倍に拡大できます。元の小さいプロジェクトサイズに戻すリセットオプションもあります。この方法を使うと、1000万ピクセルのレイアウトで作業し、完成後に最大1億6000万ピクセルまでリスケールできます。より大きいレイアウトはその後も直接作業を続けられますが、より遅くなります。 - - TOPIC: 画像配列 +image: image-array.jpg - 多くの画像を選択し、色付きの枠内でコンパクトな配列形式に結合します。 - 最初のダイアログは左上に表示されます。Background Color は、枠の輪郭と含まれる画像間のスペースの色です。Array Width は出力配列全体の幅で、Margin はすべての画像を囲む外側の余白の幅です。配列の高さは、選択した画像ファイルの数と、それらを枠に収めるために必要なスペースによって決まります。Image Columns は画像の列数を指定します(上の例では6)。行数は選択した画像ファイルの数によって決まります。Separation の値は、含まれる画像間の水平・垂直方向のスペースを設定します。 - 画像ファイルを選択し({画像ファイルを選択})、完了したら[続行]を押してください。結果の画像は数秒(数百枚の画像では数分)で作成されます。この画像は通常、上の右上の画像に示すように、下部の余白が非常に不均一になります。配列内の画像の順序は選択順によって決まります。上の行から左から右に埋められ、次に2行目というように続きます。 - Optimize ダイアログが自動的に開始されます。これは、下部の余白がより均一になるよう画像を並べ替えられます。[開始]を押して画像が最適化されるのを待ってください。進捗を確認できます。下部の余白が2ピクセル以内で均一になる最適解が見つかると、この機能は終了します。この目標に達しない場合、無期限に検索を続けることがあります。[停止]を押すと、その時点までに見つかった最良の解で最適化機能を強制終了できます。最適化が成功すると、右下の画像に示すように均等な列が得られます。最適化後も下端が不均一な場合、下端を均一にするため一部の画像に余白を追加するかどうか尋ねられます。これにより下端は均一になりますが、垂直方向の間隔はもはや均等ではなくなります。 - ヒント:最適化は、1列あたりの画像数が少なくとも4枚(できればそれ以上)ある場合に最もうまく機能します。これにより、均一な下端を持つ解を見つけるための十分な柔軟性がオプティマイザーに与えられます。 - 最後のダイアログが左下に表示されます。ここで配列にファイル名を割り当てる必要があります。ファイル保存ダイアログが開始され、新しい配列ファイルをどこにでも保存できます。copy metadata オプションが選択されている場合、選んだ入力ファイルから出力ファイルに metadata がコピーされます。画像が編集済みバージョンで、配列に最後のバージョン(または任意のバージョン)の編集履歴を含めたい場合に便利です。 - - TOPIC: 一括処理メニュー これらは、数個から数千個まで、複数の選択した画像ファイルを処理する機能です。これらの機能は処理中に Escape キーでキャンセルできますが、その場合一部のファイルは処理済み、一部は未処理のまま残ります。ポップアップレポートは、処理されるファイル名を表示します。 - - TOPIC: 一括変換 +image: batch-convert.jpg - この機能は、複数の画像ファイルの名前変更、変換、リスケール、移動に使用します。RAW ファイルも画像ファイルに変換できます。この機能は最大速度のため複数の並列スレッドで実行されます。 - ^ダイアログの入力項目 • Select Files - 変換するファイル({画像ファイルを選択})。 • Replace Text - ファイル名内のテキストを置換(下記参照)。 • New Name - 任意の新しい名前、挿入するテキスト(下記参照)。 • Sequence Numbers - 出力ファイル名の基準番号と加算値。 • New Location - 出力ファイルの任意の新しいフォルダーの場所。 • New Type - 出力ファイルのファイル形式、または「no change」。 • Color Depth - tif または png 出力の8ビットまたは16ビットを指定。 • Max. Width, Height - 出力ファイルの任意の制限 (downsize または upsize がチェックされている場合のみ使用) • Rescale - 出力ファイルの任意のリスケール係数 • Delete Originals - 変換成功後に入力ファイルを削除。 • Copy Metadata - すべての metadata を出力ファイルにコピー。 • Update Albums - アルバムファイルを変換後の出力ファイルに置き換え - ^テキストを置換 ここにテキストが入力されている場合、ファイル名がこのテキストについて検索され、見つかった場合は指定した置換テキストに置き換えられます。置換テキストは異なる長さでもよく、空にすることもできます。その場合、そのテキストはファイル名から削除されます。 - ^新しい名前とプラグイン 新しいファイル名には、テキストを挿入できます:撮影日(EXIF metadata から)、連番、または元のファイル名。何をどこに挿入するかは以下のように指定します: • $oldname - ここに元のファイル名が挿入されます • $sss - ここに連番が挿入されます。下記参照。 • $yyyy $mm $dd - これらの位置に撮影日が挿入されます。 - 例:San Francisco $yyyy:$mm:$dd $oldname $sss 入力ファイル "Golden Gate Bridge.jpg"(撮影日2014年5月12日)は、出力ファイル名 "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg" に変換されます。 - "$sss" については、's' 文字の数でフィールドの長さを指定してください。例えば "$ss" は99までの連番に十分です。桁数が少ない連番には先頭にゼロが追加されます。指定した長さに収まらない連番は、必要なだけ長くなります。ギャラリー内のファイル名の並び順は厳密に ASCII 順であることに注意してください。1、2 ... 9、10という数列は1、10、2 ... 9のように並び替えられてしまいます。フィールド長を2($ss)に指定すると、01、02 ... 09、10という並びを維持できます。 - 出力ファイル名が一意になることを保証するため、"$oldname" または "$sss" のいずれかが必要です。New Location が指定されていない、または変更されていない場合、delete originals は無視されます。出力ファイルが既に存在する場合、入力ファイルは変換されません。 - ^最大幅と高さ downsize および/または upsize がチェックされている場合、出力ファイルは元の幅/高さの比率を保ったまま、これらの制限内にリサイズされます。downsize がチェックされている場合、これらの制限より大きいファイルは制限内に収まるよう縮小されます。upsize がチェックされている場合、これらの制限より小さいファイルは、幅または高さのどちらかが対応する制限になるよう拡大されます。これは Rescale オプションとは併用できません。 - ^リスケール いずれかのボタンがチェックされている場合、出力ファイルは選んだ係数でリスケールされます。これは Max. Width and Height オプションとは併用できません。 - ^オリジナルを削除 チェックされている場合、入力ファイルは削除されますが、これは出力ファイルが正常に作成された後にのみ行われます。 - ^metadata をコピー すべての metadata が入力から出力ファイルにコピーされます。metadata を削除するにはこのオプションを外してください。 - ^アルバムを更新 チェックされている場合、入力ファイルのいずれかを含むすべてのアルバムが、変換後の出力ファイルに更新されます。 - ^ファイルの順序の保持 先頭に連番($sss)を指定した場合、入力ファイルの選択順が出力の場所でも保持されます。そのため、希望の順序で画像ファイルを選択したり、順序付けられた画像を持つアルバムから選択したりすることで、この順序を出力にも保持できます。 - - TOPIC: 一括コピー/移動 選択した画像ファイルを新しい場所にコピーまたは移動します。Fotocx が認識している任意のフォルダーから入力ファイル({画像ファイルを選択})を選んでください。「Delete Originals」が選択されている場合、入力ファイルは新しいフォルダーへの移動が成功した後に削除されます。この場合、今削除された入力ファイルを参照していたアルバムはすべて新しいファイルの場所に更新されます。 - - TOPIC: upright の一括処理 この機能は、回転または反転(ミラー)した画像ファイルを upright 補正します。ファイルが回転/反転しているかどうか、どの方向かを知るために EXIF データに依存します。これは Batch Convert よりはるかに高速です。単に候補となるすべてのファイルを選択すれば、修正が必要なものを見つけてくれます。検索速度は、高性能なコンピューターで1分あたり約3000画像ファイルです。検索するファイルを指定する方法は2つあります。[ファイルを選択]ボタンはギャラリーファイル選択ダイアログ({画像ファイルを選択})につながります。「Survey all files」がチェックされている場合、トップフォルダー以下のすべての画像ファイルが検索されます。 - - TOPIC: 一括削除/ゴミ箱へ ファイルを選択してください({画像ファイルを選択})。オプションを選択してください:delete または move to trash。[続行]。ファイルは削除またはゴミ箱へ移動される際にポップアップレポートに一覧表示されます。すべてのファイルが削除/ゴミ箱へ移動された後、アルバムがスキャンされ、削除されたファイルが取り除かれます。 - - TOPIC: オーバーレイの一括適用 +image: batch-overlay.png - 選択した入力画像上の選んだ位置に、小さなオーバーレイ画像を追加できます。これは、画像の上にクレジット表示や著作権表示などを追加するために使用できます。 - オーバーレイ画像を次のように準備してください:Blank Image を使って、テキストを保持する基本画像を作成してください。スケールは重要ではないため、必要以上に大きく作ってください。Paint Transparency を使って基本画像全体を透明にペイントしてください。{マークアップ} > draw text を使って、希望のフォント、色、その他の属性で、希望のテキストを基本画像に配置してください。テキストが基本画像のほとんどを埋めるようスケールしてください。基本画像(背景)は透明です。必要であれば{クロップ}で余分な余白を除去してください。最終画像を保存してください。便利な場所は /saved_areas ですが、任意のフォルダーを使用できます。この画像は、Batch Overlay のオーバーレイ画像として使用できます。 - ^ホスト画像ファイルを選択^ ボタンを使って、オーバーレイ画像を受け取るホスト画像ファイルを選択してください。^オーバーレイファイルを選択^ ボタンを使ってオーバーレイ画像ファイルを選択してください。 - 2つの^オーバーレイ位置^の入力は、オーバーレイ画像がホスト画像上のどこに配置されるかを、上から下までの距離の1~99%、左から右までの距離の1~99%で決定します。0/0は左上の角を、99/99は右下の角を意味します。オーバーレイ画像は、ホスト画像のエッジを超えて広がらないよう配置されます。 - ^オーバーレイ幅^を、ホスト画像の幅に対するパーセントで指定してください。高さは幅/高さの比率を保つよう設定されます。^ウィンドウサイズに合わせて幅を一定にする^がチェックされている場合、オーバーレイ画像の見た目のサイズは、下記で指定されたウィンドウサイズに対して一定になります。これがない場合、左右に大きな余白のある「縦長」の画像は、見た目上より小さなオーバーレイ画像になってしまいます。初期のウィンドウサイズは現在のウィンドウです。任意のサイズを入力できます。これが変更された場合は現在のウィンドウに設定するため^refresh^を押してください。 - ^ホストファイルを置換^が選択されている場合、入力ホストファイルはオーバーレイされた出力ホストファイルに置き換えられます。^新しいバージョンを作成^が選択されている場合、入力ホストファイルの新しいバージョンが作成されます。 - - TOPIC: keywords の一括設定 +image: batch-keywords.jpg - 多数の画像ファイルの keywords を一度に追加、削除、または変更します。 - [select files]ボタンを使って画像ファイルを選択してください({画像ファイルを選択})。 - ダイアログには2つの keywords のリストが表示されます:選択したファイルに追加するものと、削除するものです。利用可能な keywords は下部の Defined Keywords ウィンドウに表示されます。これらのいずれかをクリックすると、現在選択されている keyword リスト(add または remove)に追加できます。keyword はいずれかの keyword リストでクリックすると削除できます。keywords を置き換えるには、add keywords リストに新しい keywords を、remove keywords リストに古い keywords を指定してください。 - 定義済み keywords の一覧が長い場合、希望の keyword を Enter New Keyword に入力する方が簡単な場合があります。ここまで入力した内容に一致する既存の keywords が Matching Keywords に表示され、これらのいずれかをポイントしてクリックすると画像に keyword を追加できます。入力した keyword が新しい場合(一致する keyword が表示されない場合)、keyword の入力が完了したら[追加]を押してください。それが選択した keyword リストと、カテゴリー "nocatg" の定義済み keywords の一覧に追加されます。 - keyword カテゴリーを使用している場合、カテゴリーを選択すると、定義済み keywords の一覧にはそのカテゴリーの keywords のみが表示されます。keywords の一覧が膨大な場合、これによりポイントしてクリックするのに扱いやすいサイズに絞り込めます。 - 削除または置換したい特定の keywords を持つ画像の一覧を取得するには、{画像を検索}を使って画像を見つけ、この機能を開始して[select files]を使って、たった今見つけたすべての画像ファイルを追加するか、任意のサブセットを選択してください。 - - TOPIC: keywords の一括名前変更 +image: batch-rename-keywords.png - 任意の数の keywords を名前変更し、これらの変更を画像コレクション全体に適用します。定義済み keywords の一覧から名前変更する keyword をクリックし、Rename to ボックスに新しい名前を入力し、矢印ボタンをクリックしてこの名前の組を右側の一覧に追加してください。名前変更する keyword ごとに繰り返してください。一覧内の名前の組をクリックすると削除できます。完了したら[続行]を押してください。名前を変更せずに keyword を削除したい場合は、新しい名前として 'delete' を使用してください。 - 影響を受ける keyword 名を含む画像ファイルの数がポップアップウィンドウに表示されます。[はい]を押すと続行します。更新速度は、高性能なコンピューターで1分あたり約500件です。次に Fotocx を起動すると、ファイルの更新日が変更されているため、インデックスファイル機能が同じ画像のすべての thumbnails を更新します。 - - TOPIC: keywords の一括削除 +image: batch-purge-keywords.jpg - すべての画像ファイルから不要な keywords を削除します。これは、ダウンロードした画像ファイルから追加された不要な keywords を取り除くのに特に役立ちます。ダイアログの左側にある不要な keywords をクリックすると、ダイアログの右側にある削除リストに追加されます。完了したら[proceed]を押してください。 - - TOPIC: 撮影日の一括設定 +image: batch-photo-date1.png +image: batch-photo-date2.png - 撮影日/時刻がない、または誤っている一連の写真を素早く修正します。[select files]ボタンを使ってギャラリーウィンドウを開き、処理する画像ファイルを選択してください({画像ファイルを選択})。 - 撮影日/時刻を変更する方法は2つあります: • 新しい日付/時刻を設定(上の右の画像):年のみ(yyyy)を入力すると、ファイル内の年のみが置き換えられます。日付のみ(yyyy:mm:dd)を入力すると、日付は置き換えられますが時刻は置き換えられません。完全な日付/時刻(yyyy:mm:dd hh:mm:ss)を入力すると、両方とも置き換えられます。 • 既存の日付/時刻をシフト(左の画像):6つのフィールド(年、月、日、時、分、秒)のいずれかに+または-の値を入力してください。日付/時刻は入力した値だけシフトされます。 - シフトされた日付/時刻の値は、必要に応じて次の上位の値に繰り上がります: 時刻08:30を-50分シフトすると07:40になります 日付2016-10-20を+6か月-30日シフトすると2017-03-21になります (3月は31日あります)。 - 「test」チェックボックスが選択されている場合、確認のため選択したファイルの古い日付/時刻と新しい日付/時刻のレポートが作成されます。ファイルへの変更は行われません。結果が正しいことを確認できたら、チェックボックスを外して再度実行し、ファイルを更新してください。 - - TOPIC: metadata の一括変更 +image: batch-change-meta.png - 複数の画像ファイルの metadata を修正します。新しい metadata を追加したり、既存の metadata を修正したり、metadata を削除したりできます。[select files]ボタンを使ってギャラリーウィンドウを開き、処理するファイルを選択してください{画像ファイルを選択}。割り当てる metadata の tag 名と値を入力するか、tag を削除する場合は値を空欄にしてください。[適用]を押してください。確認メッセージが表示され、この時点で続行またはキャンセルできます。よく使われる tag 名の一覧が左側に表示されます。これらのいずれかをクリックすると、ダイアログ内の最初の空の tag 名欄に挿入されます。この一覧はファイル /metadata_picklist から取得されており、他の tags を一覧に追加するため編集できます。[全リスト]ボタンで、利用可能なすべての tag 名の一覧を取得する方法についての情報が得られます。 - - TOPIC: metadata の一括レポート +image: add-meta-tags.png +image: batch-report-meta.png - 任意の数の画像に対して任意の metadata をレポートします。出力は、システムの既定のテキストエディターで表示されるテキストファイルです。テキストエディターの検索機能を使って希望の metadata に一致する画像を見つけたり、テキストファイルを他のプログラムへの入力として使用したりできます。[select files]ボタンを使ってギャラリーウィンドウを開き、処理するファイルを選択してください({画像ファイルを選択})。[編集]ボタンで、レポートする metadata tags を選択できる新しいダイアログ(右)が開きます。左の列の tag をクリックすると右の列とレポートに追加されます。右の列の tag をクリックすると削除されます。左の列の最後の tag「Other tag ...」をクリックすると、最もよく必要とされる tags のみを含む一覧にない任意の tag 名を入力できます。 - - TOPIC: geotags の一括設定 +image: batch-geotags.png - 多数の画像を選択し、それらすべてに同じ位置データを追加します。[select files]ボタンを使ってギャラリーウィンドウから画像ファイルを選択してください({画像ファイルを選択})。その後、{メイン metadata を編集}で説明したように、[検索]ボタンまたはマップマーカーのクリックで位置データを取得してください。この機能は、場所の表記や latitude/longitude データの不整合を修正するためにも使用できます。location や country が空欄のままの場合、それらは更新されません。location や country を消去するには、名前として "null" を入力してください。latitude と longitude が空欄のままの場合、それらは更新されません。latitude と longitude を消去するには、両方の値に "0" を入力してください。location/country のみ、latitude/longitude のみ、またはその両方を更新できます。実際には、カメラの GPS が location と country なしで latitude と longitude を挿入していたり、望まない言語を使用していたり、すべて大文字だったり、修正が必要な他の値になっていたりすることに気づくかもしれません。 - - TOPIC: ファイルをエクスポート 選択した画像ファイルを別のフォルダーにコピーします。想定される用途は、他の人と共有するためにファイルをコピーすること、例えばウェブサイトへのアップロードです。出力ファイルは JPEG です。任意で画像を縮小できます。ギャラリー thumbnails をクリックして画像ファイルを選択してください({画像ファイルを選択})。画像ファイルのコピー先フォルダーを選択してください。「export metadata」が選択されている場合、限定された metadata のセットもコピーされます。これらは:撮影日、keywords、著作権、タイトル、説明です。 - - TOPIC: ツールメニュー - - TOPIC: ファイルをインデックス +image: index-files1.png - Fotocx は、あなたのすべての画像ファイルのフォルダー名・ファイル名と、埋め込まれた metadata(日付、tags、geotags、タイトル、説明、評価)を知る必要があります。このデータは高速検索のためにインデックス化されます。Fotocx はまた、ギャラリーウィンドウ(thumbnail ページ)が高速に表示されるよう thumbnail 画像を作成します。Fotocx は画像ファイルを変更したりコピーしたりしません。必要な容量は通常、画像ファイル容量の2%程度です。 - Index Files 機能は、Fotocx が起動するたびに実行されます。この機能は、不足している thumbnails を作成し、古いものを置き換え、画像ファイルの現在のデータを使って metadata インデックスを更新します。新しいファイルが数千個ある場合、かなりの時間が必要になることがあります。 - Fotocx 内で変更または移動された画像ファイルは自動的に処理されます。Index 機能が使用されるのは、Fotocx の外部で作成された新しい画像ファイル(例えば新しいバッチの写真が追加された場合)と、Fotocx の外部で変更または移動されたファイルの場合のみです。 - トップ画像フォルダー(例:/home//Pictures)を入力してください。[参照]ボタンを使ってフォルダーを探して追加してください。これらのフォルダーと含まれるすべてのサブフォルダーが処理されます。他のファイルが画像と混ざっていてもかまいません。対応する「X」をクリックすると項目を削除できます。 - thumbnail ファイルが保存される thumbnails フォルダーを入力してください。標準の既定値を使用するか、独自の場所を設定してください。 - フォルダー名やファイル名を使って画像を分類している場合、{画像を検索}機能ですぐにこれらを利用できます。日付、keywords、geotags、タイトル、評価を画像 metadata に保存している場合、これらも検索可能になります。画像がインデックス化された後は、これらのいずれによる検索もほぼ瞬時です。 - ^metadata tags 既定では、以下の metadata が画像インデックスに含まれます: • フォルダー名とファイル名 • 撮影日時 • ファイル更新日時 • タイトルと説明(exif metadata) • 評価(0~5つ星) • keywords(ユーザーによるラベル) • geotags(国名、場所名、latitude/longitude) • カメラ:メーカー、モデル、レンズ • 露出:時間、F値、焦点距離、ISO - ^追加の metadata tags +image: index-files2.png - 画像ファイルのインデックスに、最大20個の他の metadata tags を追加できます。この一覧内の metadata は、標準の tags と同じくらい高速に検索できます。これは必要ないかもしれませんが、時々非標準の metadata tags を検索する必要がある場合、ここに追加すればほぼ瞬時の検索速度になります。「extra metadata」の[select]ボタンを押すと上のダイアログが表示されます。左の一覧の tags をクリックすると右の一覧(インデックスに追加される tags)に追加されます。右の一覧の tag をクリックすると削除されます。[done]を押して変更を確定してください。画像コレクション全体が再度インデックス化されます。thumbnails は再作成されないため、これは最初のインデックス作成より速く進みます。 - ^インデックス化されていないファイルとフォルダーへのアクセス インデックス化されていない画像ファイルやフォルダーとは、宣言されたトップ画像フォルダーに含まれていないものです(宣言された画像フォルダーのサブフォルダーは常に含まれます)。そのようなフォルダーへ移動して thumbnails を通常どおり表示でき、そのようなファイルも通常どおり表示・編集できます。理解しておくべき制限事項があります: • これらのファイルは、検索結果やマップ表示から欠落します。 • thumbnails は表示時に作成されるため、ギャラリーは遅くなります。 ポータブル(低速)ストレージデバイス(例:カメラの SD カード)にアクセスする場合、動作がぎこちないことに気づくでしょう。thumbnails は必要に応じて作成され、デバイスが取り外された後も残ります。提案:ファイルを宣言済みの Fotocx フォルダーにコピーし、この場所から必要な処理を行ってください。パフォーマンスが大幅に向上します。 - ^リムーバブルストレージ(USBドライブ) トップ画像フォルダーにリムーバブルドライブ上のフォルダーが含まれており、そのドライブをマウントせずに Fotocx を実行した場合でも、リムーバブルのファイルが消えているにも関わらず、インデックスデータと thumbnails は保持されます。リムーバブルドライブが再びマウントされ Fotocx が起動されると、最後の状態が復元されます。その間にファイルが追加または変更されていた場合、インデックスデータと thumbnails は更新されます。 - - TOPIC: Fotocx ホームを移動 Fotocx ホームフォルダーには、ユーザーがカスタマイズできる Fotocx パッケージの一部のファイルを含む、すべてのユーザー設定とデータが含まれています。 既定の場所:/home//.fotocx。 複数のバージョンやリリースの Linux がインストールされている場合、リリースごとに1つずつではなく、1つの共有 Fotocx ホームフォルダーを持つことが望ましい場合があります。複数のユーザーが同じ Fotocx インスタンスにアクセスする必要がある場合も同様です。 - この機能を使って Fotocx ホームフォルダーを別の場所へ移動してください。選択したフォルダーのパス名には "fotocx" を含めるべきです。含まれていない場合は "/fotocx" が追加されます。 - 複数の Fotocx 画像コレクションを別々に管理したい場合は、{コマンドパラメーター}の -home パラメーターを参照してください。 - - TOPIC: 設定 +image: settings.jpg - 様々なユーザー設定と環境設定が収集され、ファイル /parameters に保存されます。ほとんどの変更は即座に反映されます。一部は Fotocx の再起動を必要とします。 - • 希望の2文字言語コードを選択してください。 選択した言語で Fotocx が再起動します。 • Startup View - Fotocx 起動時の初期表示。 Recent Files:直近に見た画像ファイル Newest Files:直近に追加/変更されたファイル Specific Gallery:指定したフォルダーギャラリー Album Gallery:指定したアルバムギャラリー Previous Gallery:前回のセッションで最後に使用したギャラリー Previous File:前回のセッションで最後に表示したファイル Specific File:指定した画像ファイル Browse ボタン:フォルダー、アルバム、または画像ファイルを選択 • Background - ファイル表示とギャラリー表示ウィンドウの背景色 • Menu Style - メニュー表示スタイル:アイコン、テキスト、または両方 • Menu Colors - メニューのテキスト色と背景色 • Dialog Font - メニューとダイアログのフォント • Show Hidden - 選択すると、隠しファイルとフォルダーを表示 • Zoom Speed - 2倍ズームあたり1~8クリックまたは[+]キーを選択 • JPEG files - 品質レベル、既定90、良好な品質には70以上を使用 • Curve Node - 編集用カーブの最小ノード間隔、スケールに対する%。 既定はスケールの5%です。タッチパッドではより高い値を使用してください。 • Image Position - より広いウィンドウ内で画像を左/中央/右に配置 • Confirm Exit - ポップアップダイアログのオプション:本当に終了しますか? • Index Level - 下記参照 • RAW Loader - 下記参照 • RAW Options - 下記参照 • RAW Files - 使用する RAW ファイル形式の一覧 • Video Files - 使用する動画ファイル形式の一覧 • Video App - 下記参照 - ^ファイルの品質と圧縮 JPEG ファイルの品質レベル:良好な画質には70以上を使用してください(既定90)。TIFF ファイルの圧縮方式は DEFLATE です(カラー画像に最適)。PNG ファイルの圧縮レベルは「1」です。より高い値は、ファイル保存時間を増やす以外に効果がないようです(libpng)。 - ^画像の位置 ウィンドウが画像より広い場合(つまりウィンドウの幅/高さの比率が画像より大きい場合)、画像を左側、中央、または右側にシフトできます。左または右の場合、未使用の余白は最大化され、ダイアログボックスの配置により便利な場合があります。 - ^画像インデックスレベル これら2つのパラメーターは、起動時間と画像インデックスの完全性の間のトレードオフを制御します。 • $ fotocx:シェルコマンド、システムメニュー、またはシステムアイコン/ランチャーを使って fotocx が起動された場合に適用されます。推奨値「2」は完全なインデックス作成を意味します:古いインデックスファイルを読み込み、新しいファイル(まだインデックス化されていない)を検索し、fotocx のインデックスファイルを更新します。 • $ fotocx :ファイルマネージャーの一覧でファイル名をクリックして fotocx が起動された場合に適用されます。推奨値「1」は、古いインデックスファイルを読み込むが、インデックスを更新する新しいファイルは検索しないことを意味します。起動はまずまず速くなります。画像検索やマップ機能は正常に動作しますが、新しい(まだインデックス化されていない)画像ファイルは含まれません。 • 代替:「0」はインデックス作成なしを意味します。起動は非常に高速です。後で画像検索やマップ機能を使用すると、古いファイルのみのファイルインデックス機能が開始されます(新規/変更ファイルの検索は行われません)。画像コレクションが巨大で起動時間が数秒を超える場合はこのオプションを使用してください。必要であれば後でインデックス機能を開始できます。 - ^RAW ローダー RAW ローダーは、RAW ファイルを読み込み、16ビットの色深度で TIFF に変換するために使用されるコマンドです。これは RAW ファイルが表示される際に使用されます。Fotocx の編集機能を使ってファイルを編集・最適化できます。既定の RAW ローダーは、sRGB カラースペースを使用する dcraw です。dcraw または rawtherapee を使ういくつかの他のオプションがピックリストに用意されています。これらのコマンドは、Fotocx ホームフォルダー内のファイル 'raw_commands_*' に保存されています。新しいオプションを変更または追加するにはこのファイルを編集してください(下記参照)。複数のカメラや複数の処理オプションのため、複数のコマンドを用意したい場合があります。RAW エディターを対話的に使用したい場合は、これ用のプラグインコマンドを作成してください - {プラグイン}を参照してください。 - ^RAW オプション • edit commands:ボタンを押すと RAW ローダーコマンドの一覧を編集できます。現在のコマンド一覧とともに、新しいウィンドウでテキストエディターが起動します。 • match embedded image color:RAW ファイルに埋め込まれた画像を、RAW 画像の色を変換後の TIFF 画像にマッピングするためのガイドとして使用します。これはカメラメーカーによる RAW データの解釈であり、RAW ファイルにさらに編集が必要な場合の良い出発点です。埋め込まれた画像は通常、カメラからの JPEG ファイルと同じです。 - ^動画アプリ 動画再生アプリを起動するシェルコマンドを入力してください。動画ファイル名がコマンドラインに挿入される位置を示すには '%s' を使用してください。以下はいくつかの例です: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: キーボードショートカット +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - カスタムキーボードショートカットを表示または変更します。現在割り当てられているショートカットが最初のウィンドウに表示されます。[編集]ボタンを押すと、キーボードショートカットを追加・変更できる2つ目のダイアログが表示されます。キーボードを使って新しいショートカットを入力してください。A-Z、0-9、F2-F9、およびほとんどの記号(% $ & * < など)を使用できます。Ctrl/Alt/Shift のいずれか1つとキーを組み合わせられます:Ctrl/Alt/Shift のいずれか1つを押したまま、キーを押し、両方を離してください。右側の一覧から利用可能なメニュー割り当ての1つを選択し、[追加]と[OK]を押してください。ショートカットを選択して[削除]を押すと削除できます。 - - TOPIC: RGB ヒストグラム +image: RGB-hist.png - 小さなウィンドウに、ファイル表示中の現在の画像、または現在選択されている画像エリアの明るさヒストグラムグラフが表示されます。このグラフは、編集機能が画像を変更するのと同期して更新されます。[すべて][赤][緑][青]ボタンを使って表示する色を選択してください。 - - TOPIC: 画像を拡大表示 +image: magnify-image.jpg - マウスポインター周辺のエリアの画像を拡大表示します。マウスを画像上でドラッグして異なるエリアを拡大表示できます。これは、印刷された画像をルーペで見るのに似ています。ダイアログを使ってエリアの半径と拡大量を調整してください。 - - TOPIC: 画像を計測 画像内の任意の2つの位置をクリックして、その点の間のピクセル距離を計測します。クリックした位置には画像上で A と B のラベルが付きます。これらのラベルは常に最後にクリックした2つの点を示します。ダイアログには、この2点間の距離が更新されます: X距離(水平方向の距離) Y距離(垂直方向の距離) H距離(合計距離) - - TOPIC: RGB を表示 +image: show-RGB.png - 画像上の点をクリックすると、RGB 値がダイアログウィンドウに表示されます。最後にクリックした9つの点が表示されます。値は xxx.dd という形式で、xxx は色の値の上位8ビット、.dd は下位8ビットです。範囲は0.00~255.99です。下位8ビットは、画像が編集されているか8ビットを超える色深度を持っていない限りゼロです。画像が編集されている場合、出力はリアルタイムに更新されます。「labels」がチェックされている場合、点にはダイアログウィンドウ内の文字に対応する文字で画像上にラベルが付けられます。「delta」がチェックされ画像が編集されている場合、絶対値の代わりに RGB の変化が表示されます。 - 別の画像を開いた場合(例えば前の画像と比較するため)、位置は保持され、新しい画像の境界内であれば更新されます。これにより、ピクセルの RGB 値レベルでの画像の比較が容易になります。 - - TOPIC: グリッド設定 +image: grid-settings.jpg - グリッド線の機能は2つあります:Grid Settings はすべてのグリッドパラメーターを設定します。Toggle Grid はグリッド線のオン/オフを設定します。グリッド線は、画像全体に一定間隔で引かれる水平線と垂直線です。これらの線は、画像内の壁やその他の被写体をまっすぐにするため画像の曲げ補正やゆがみ補正を行う際の、便利な位置合わせガイドになります。x-count と y-count の入力を使って、それぞれ垂直線と水平線の本数を設定してください。x-offset と y-offset のコントロールを使って、画像内の希望の位置と交差するようグリッド線をシフトできます。Toggle Grid にキーボードショートカット(既定は Shift+G)を割り当てられるため、1つのキー操作でグリッド線をオン/オフできます。 - - TOPIC: 線の色 一部の機能は画像の上に線を描きます(Crop、Select Area、その他)。背景画像に対するコントラストを最大化するため、これらの線の色を変更できます。この小さいダイアログは編集中に開いたままにでき、利用可能な色(黒、白、赤、緑)の間を便利に切り替えられます。 - - TOPIC: 暗部/明部のピクセル 画像内の最も暗いピクセルと最も明るいピクセルをハイライト表示します。2つのスピンコントロールを調整して明るさのしきい値を設定してください。初期値は暗いピクセルで0、明るいピクセルで255です。暗いしきい値未満、または明るいしきい値を超える明るさを持つピクセルは、目立つよう「点滅」します。明るさや色を編集した後にクリッピングを検出するにはこの機能を使用してください。 - - TOPIC: モニターの色 +image: moncolor-small.png - 明るさがゼロ(黒)から100%までの8色の帯が画面全体に表示されます。これを使ってモニターの明るさとコントラストを調整できます。帯のどちらの端にも変化のない領域があってはいけません。 - - TOPIC: 重複を検索 +image: find-dups.png - 画像データベース内のどこにあっても重複した画像ファイルを見つけます。重複ファイルとは、別のファイルと完全に、または「ほぼ」重複するファイルです。速度のため、thumbnail 画像がメモリ内で比較されます。thumbnails には反映されないわずかな違いを持つメイン画像に対して、一致する thumbnails が見つかる可能性があります。サイズを縮小した画像のコピーは、重複として分類される可能性が高いです。thumbnail サイズは32から512ピクセルまで設定できます。サイズを大きくすると誤検出の可能性が減ります。thumbnail サイズは必要なメインメモリの量に大きく影響します - 例えば10万枚の画像の場合、サイズ64では約880MBが必要ですが、サイズ256では約14GBが必要です。[calculate]ボタンを押すと、利用可能な空きメモリ内に収まる最大の thumbnail サイズを計算できます。 - 同一または非常に似た画像を検出する感度を設定するために、2つのパラメーターが使用されます:pixel difference は、これ未満であればピクセルが等しいとみなされる RGB 値の差です。pixel count は、これ未満であれば2枚の画像が重複と分類される異なるピクセルの数です。例:pixel difference = 2、pixel count = 10の場合、2以下の差を持つピクセルが10未満であれば、画像は重複として分類されます。 - 出力は、重複画像の各セットを示すギャラリーです。出力ギャラリーは "Duplicate Images" というアルバムとして保存されます。このアルバムと一緒に Batch Delete/Trash を使用すると、どの重複を削除するかを選べます。 - - TOPIC: 不正なファイルを検索 宣言済みのトップフォルダー内のすべての画像ファイルが読み込まれます。 読み込めない各ファイルについて、3つのオプションがあります: • ファイルを削除する • 不正なファイル形式を修正する(下記参照) • ファイルをトップ画像フォルダーの外のどこかに移動する .jpg 拡張子の .png ファイルをよく見かけます。ウェブブラウザや一部の他のアプリはこれを黙って処理します。ここでは正しいファイル形式がレポートされ、拡張子を正しいものに変更できます。 - - TOPIC: リソースを表示 Fotocx が使用しているコンピューターリソースをレポートします: • CPU time:Fotocx 起動時または前回のサンプル以降の使用量 • Real memory:現在使用中の実メモリ(スワップを除く) • Maps cache:キャッシュされたマップタイルに使用されているディスク容量(MB) • Clear cache:キャッシュされたすべてのマップタイルを削除 • [Sample]ボタン:新しいサンプルを取得してデータをレポート - [Sample]ボタンは CPU 時間をリセットします。次のサンプルには、新たに蓄積された CPU 時間のみが表示されます。CPU 時間は、すべてのプロセススレッドの合計です。 - - TOPIC: 翻訳 複数言語の翻訳が Fotocx パッケージに含まれています。これらの AI 翻訳は完璧ではありません。翻訳ファイルを編集することで翻訳の誤りを修正できます。 - ^GUI 言語の変更 {設定}メニューを使って言語を変更できます。 言語は Fotocx の起動時にも設定できます: $ fotocx -lang xx # 言語 xx(de fr zh など) $ fotocx -lang en # 英語 - ^GUI 翻訳を修正 ファイル /translations/gui_xx を編集してください テキスト行の組には、一致していなければならない先頭の4桁の番号があります。1行目は英語、2行目は言語 xx です。xx の行のみを修正し、英語の行は絶対に修正しないでください。テキストにパラメーターを挿入するための特殊文字は、同じ順序のまま残す必要があります。これらは '%d'(整数パラメーター)、'%f'(小数)、'%s'(テキスト)です。 - ^ユーザーガイド翻訳を修正 ファイル /translations/ug_xx を編集してください 翻訳を修正するため ug_xx を編集してください。テキスト行を追加・削除したり、順序を変更したりしないでください。テキスト行は、英語のユーザーガイド ug_en と1対1で対応している必要があります。 - 修正したファイルを、次の Fotocx リリースに含めるため送信してください:mkornelix@gmail.com - - TOPIC: ヘルプメニュー • User Guide - 目次を表示 • Video Tutorial - YouTube の Fotocx 動画チュートリアルを表示 • Outboard Programs - 外部プログラムとその機能を一覧表示 • Show Log File - 記録された情報とエラーメッセージを表示 • Command Parameters - 利用可能なコマンドラインパラメーターを表示 • Change Log - 最近のリリースでの追加とバグ修正を表示 • Copyright - Fotocx に関連する著作権とライセンスを表示 • Privacy - Fotocx のプライバシーポリシー(規約)を表示 • About - リリース番号、実行ファイルの場所、連絡先を表示 • Home Page - kornelix.net の Fotocx ホームページを表示 • Uninstall - Fotocx のアンインストール方法 - - TOPIC: その他のトピック 以下のトピックは Fotocx のメニューには関連付けられていません。 - - TOPIC: VIDEO FILES 動画ファイル(.mpeg、.mp4など)は画像ファイルと混在させることができます。これらはファイル表示とギャラリー表示の両方で画像ファイルとして表示されます。「P」キーで動画を開始、一時停止、再開したり、終了した動画を再生したりできます。「Q」キーで動画を終了します。動画ファイルを再生するアプリケーションを選択するには{設定}メニューを使用してください。 - - TOPIC: スライドとネガ +image: color-negative.jpg - 接写機能のあるカメラを使ってスライドやフィルムネガを撮影できます。照明にはライトボックスを使用するか、空を使用してください(上の例)。カラーネガを処理するには、まずポジを作成してください - {カラーモード}を参照してください。画像が霧っぽい場合は、フィルムの端を除いて画像エリアのみを選択し、{グローバルレティネックス}を使って霧を除去してください。さらに霧を軽減する必要がある場合は、画像をクリックして白点と黒点を設定してください。 - - TOPIC: Fotocx の制限事項 • ファイル数の上限は100万件です。 • 画像バージョン - undo/redo とバージョン命名のため最大99バージョン。 • 画像 keywords - 合計1万個の keywords。1枚の画像につき1000文字。 • ギャラリーは4万枚の画像ファイルに制限されます。 • 画像の最大サイズは4万x2万ピクセルです。 - - TOPIC: Windows 11 版 Fotocx Fotocx は、Windows Subsystem for Linux 2(WSL2)をインストールすることで Windows 11 で使用できます。この方法についてはインターネットに豊富な資料があります。 - 画像ファイルが Windows のファイルシステム(NTFS)にある場合、Fotocx は非常に遅くなります。そのため、画像ファイルを Linux のファイルシステムに移動してください。それでも Windows File Explorer や他の Windows アプリからアクセスできるため、何も失われません。Microsoft も、パフォーマンス向上のため Linux ファイルシステムを推奨しています。File Explorer の「Linux」アイコンを使って、Linux ファイルシステム内のホームフォルダーにアクセスしてください。必要であれば Pictures フォルダーを追加し、画像ファイルをそこに移動してください。 - Fotocx パッケージが利用可能であれば、それをインストールしてください。 そうでない場合は、以下を行ってください: ^https://kornelix.net から Fotocx のバイナリパッケージファイルをダウンロードしてください。 Linux ターミナルで: $ cd /mnt/c/Users//Downloads # Windows のダウンロードフォルダーへ移動 $ tar -xzf fotocx-xxx-bin.tar.gz # パッケージを fotocx フォルダーへ展開 $ cd fotocx # fotocx フォルダーへ移動 $ chmod u+x install.sh # インストールスクリプトを実行可能にする $ ./install.sh # スクリプトを実行、fotocx をインストール $ fotocx # Fotocx を起動 最後のステップを機能させるため、Linux ウィンドウを再起動する必要がある場合があります。 - このユーザーガイドの導入部分をお読みください。Fotocx には深い機能があります。数分で Fotocx を使いこなせるとは思わないでください。 - - TOPIC: プライバシー Fotocx は、画像ファイルとその metadata 以外のユーザーデータを一切保持しません。metadata はインターネットにアップロードする前に画像ファイルから削除すべきであり、Fotocx はこれを行うための簡単な方法を提供します。 - - TOPIC: PROBLEM, QUESTION, SUGGESTION mkornelix@gmail.com にメールを送信してください。クラッシュダンプ(zappcrash ファイル)がある場合は、それも送信してください。 - fotocx/data/translations/gui_fr0000664000175000017500000040634715247006657015704 0ustar micomico0000 + Zoom-in \n 0000 + Zoom avant \n 0001 - Zoom-out \n 0001 - Zoom arrière \n 0002 = Zoom-in \n 0002 = Zoom avant \n 0003 Arrow keys Previous/Next file \n 0003 Touches fléchées Fichier précédent/suivant \n 0004 Delete Delete/Trash file \n 0004 Suppr Supprimer/Mettre à la corbeille \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Échap Fermer la boîte de dialogue / Quitter Fotocx \n 0006 F1 User Guide, Context Help \n 0006 F1 Guide utilisateur, aide contextuelle \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 Plein écran / sans menus \n 0008 Home/End Gallery start/end \n 0008 Origine/Fin Début/fin de la galerie \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 L'indexation dépend du nombre, du type et de la taille de \n vos fichiers image ainsi que de la vitesse de votre ordinateur. Ceci peut \n varier de quelques centaines à plus de 10 000 par minute. \n Vous pouvez modifier les options d'index plus tard, via ces menus : \n Outils > Index, Outils > Paramètres. \n 0010 Page keys Gallery page up/down \n 0010 Touches Page Page précédente/suivante de la galerie \n 0011 Z 1x <--> fit to window \n 0011 Z 1x <--> ajuster à la fenêtre \n 0012 $s plugin needs base and adder 0012 $s plugin needs base and adder 0013 % from left: 0013 % depuis la gauche : 0014 % from top: 0014 % depuis le haut : 0015 %d albums selected 0015 %d albums sélectionnés 0016 %d image files selected 0016 %d fichiers image sélectionnés 0017 %d images 0017 %d images 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 %d mots-clés à purger \ndans %d fichiers image. \nContinuer ? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 %d mots-clés à renommer \ndans %d fichiers image. \nContinuer ? 0020 %d max images exceeded 0020 %d images maximum dépassé 0021 %d red-eye limit reached 0021 %d limite d'yeux rouges atteinte 0022 %s %s %d folders %d files 0022 %s %s %d dossiers %d fichiers 0023 %s *** date/time conversion failed \n 0023 %s *** échec de la conversion date/heure \n 0024 %s ALBUM %s %d files 0024 %s ALBUM %s %d fichiers 0025 %s NEWEST FILES 0025 %s FICHIERS LES PLUS RÉCENTS 0026 %s RECENT FILES 0026 %s FICHIERS RÉCENTS 0027 %s SEARCH RESULTS %d files 0027 %s RÉSULTATS DE RECHERCHE %d fichiers 0028 %s UNKNOWN 0028 %s INCONNU 0029 %s added to script 0029 %s ajouté au script 0030 %s is already indexed 0030 %s est déjà indexé 0031 %s renamed: %s 0031 %s renommé : %s 0032 %s: metadata update failed 0032 %s : échec de la mise à jour des métadonnées 0033 %s: no write permission 0033 %s : pas d'autorisation d'écriture 0034 %s: reserved, cannot be used 0034 %s : réservé, ne peut pas être utilisé 0035 %s: too many keywords 0035 %s : trop de mots-clés 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\nDate de la photo : %s Date du fichier : %s \nÉvaluation : %s Taille : %s %.2fmb \nLieu : %s %s %s \nMots-clés : %s \nTitre : %s \nDescription : %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\nDate de la photo : %s Date du fichier : %s \nÉvaluation : %s Taille : %s %.2fmb \nLieu : %s %s %s \nMots-clés : %s \nTitre : %s \nDescription : %s \n----------------------- \n%s 0038 (click below) 0038 (cliquer ci-dessous) 0039 (no selection) 0039 (aucune sélection) 0040 (pixels) 0040 (pixels) 0041 (press key) 0041 (appuyer sur une touche) 0042 (select function) 0042 (sélectionner une fonction) 0043 *** bad utf8 detected *** \n 0043 *** utf8 incorrect détecté *** \n 0044 *** cannot create new file \n 0044 *** impossible de créer un nouveau fichier \n 0045 *** cannot get real path of input file \n 0045 *** impossible d'obtenir le chemin réel du fichier d'entrée \n 0046 *** cannot load input file \n 0046 *** impossible de charger le fichier d'entrée \n 0047 *** cannot make new version of input file \n 0047 *** impossible de créer une nouvelle version du fichier d'entrée \n 0048 *** cannot open input file 0048 *** impossible d'ouvrir le fichier d'entrée 0049 *** cannot read input file 0049 *** impossible de lire le fichier d'entrée 0050 *** cannot save output file \n 0050 *** impossible d'enregistrer le fichier de sortie \n 0051 *** completed \n 0051 *** terminé \n 0052 *** file date/time invalid \n 0052 *** date/heure du fichier invalide \n 0053 *** file type not supported \n 0053 *** type de fichier non pris en charge \n 0054 *** invalid file \n 0054 *** fichier invalide \n 0055 *** metadata update error \n 0055 *** erreur de mise à jour des métadonnées \n 0056 *** no date/time available \n 0056 *** aucune date/heure disponible \n 0057 + bright 0057 + lumineux 0058 +Blue -Yellow 0058 +Bleu -Jaune 0059 +Brightness 0059 +Luminosité 0060 +Green -Magenta 0060 +Vert -Magenta 0061 +Red -Cyan 0061 +Rouge -Cyan 0062 - blue 0062 - bleu 0063 - fog/haze 0063 - brume/voile 0064 .heic/.avif files not supported (install heif_convert) 0064 Fichiers .heic/.avif non pris en charge (installer heif_convert) 0065 .jp2 files not supported (install opj_decompress) 0065 Fichiers .jp2 non pris en charge (installer opj_decompress) 0066 .webp files not supported (install dwebp) 0066 Fichiers .webp non pris en charge (installer dwebp) 0067 0 albums selected 0067 0 albums sélectionnés 0068 0 duplicates 0068 0 doublons 0069 0-5 stars 0069 0-5 étoiles 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = pas d'index image, ancien index seulement, ancien + mise à jour nouveau/modifié 0071 2-character code 0071 code à 2 caractères 0072 3D depth 0072 profondeur 3D 0073 <2 images 0073 <2 images 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 Une nouvelle version de Fotocx est en cours d'installation. \nVous devrez peut-être restaurer les paramètres personnalisés. 0075 ADD GLARE 0075 AJOUTER UN ÉBLOUISSEMENT 0076 ADD NOISE 0076 AJOUTER DU BRUIT 0077 ADJUST HSL 0077 AJUSTER TSL 0078 ADJUST RGB 0078 AJUSTER RVB 0079 ALBUM MASS UPDATE 0079 MISE À JOUR MASSIVE D'ALBUM 0080 ALBUMS 0080 ALBUMS 0081 ALBUMS MENU 0081 MENU ALBUMS 0082 ALIEN COLORS 0082 COULEURS ALIEN 0083 AMPLIFY CONTRAST 0083 AMPLIFIER LE CONTRASTE 0084 ANTI-ALIAS 0084 ANTI-ALIASING 0085 AREA BLEND 0085 FUSION DE ZONE 0086 AREA FILL 0086 REMPLISSAGE DE ZONE 0087 AREA OVERVIEW 0087 APERÇU DE ZONE 0088 AUTOSEARCH 0088 RECHERCHE AUTOMATIQUE 0089 About 0089 À propos 0090 Action 0090 Action 0091 Add 0091 Ajouter 0092 Add 1 0092 Ajouter 1 0093 Add All 0093 Tout ajouter 0094 Add Current 0094 Ajouter l'actuel 0095 Add Current File Here 0095 Ajouter le fichier actuel ici 0096 Add Glare 0096 Ajouter un éblouissement 0097 Add Image 0097 Ajouter une image 0098 Add Line 0098 Ajouter une ligne 0099 Add Margins 0099 Ajouter des marges 0100 Add Noise 0100 Ajouter du bruit 0101 Add Random Noise 0101 Ajouter du bruit aléatoire 0102 Add Selected Files Here 0102 Ajouter les fichiers sélectionnés ici 0103 Add Texture 0103 Ajouter une texture 0104 Add a brightness/color ramp across an image 0104 Ajouter un dégradé de luminosité/couleur sur une image 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 Ajouter un signet : cliquer sur une vignette de la galerie. \nRenommer un signet : cliquer dessus et appuyer sur [Renommer] 0106 Add glare around bright objects 0106 Ajouter un éblouissement autour des objets lumineux 0107 Add margins around an image 0107 Ajouter des marges autour d'une image 0108 Add newest version to existing versions 0108 Ajouter la version la plus récente aux versions existantes 0109 Add overlay image (e.g. copyright) to selected images 0109 Ajouter une image de superposition (ex. copyright) aux images sélectionnées 0110 Add random noise to an image 0110 Ajouter du bruit aléatoire à une image 0111 Add selected versions to existing versions 0111 Ajouter les versions sélectionnées aux versions existantes 0112 Add texture to an image 0112 Ajouter une texture à une image 0113 Add to Selection 0113 Ajouter à la sélection 0114 Add/change/delete metadata for selected image files 0114 Ajouter/modifier/supprimer les métadonnées des fichiers image sélectionnés 0115 Add/remove barrel/pincushion distortion 0115 Ajouter/supprimer une distorsion en barillet/coussinet 0116 Add/remove brightness/color radially from chosen center 0116 Ajouter/supprimer la luminosité/couleur radialement depuis un centre choisi 0117 Add/remove keywords for selected image files 0117 Ajouter/supprimer des mots-clés pour les fichiers image sélectionnés 0118 Add/revise location/geocoordinates for selected image files 0118 Ajouter/modifier le lieu/les géocoordonnées des fichiers image sélectionnés 0119 Adjust HSL 0119 Ajuster TSL 0120 Adjust Image Contributions 0120 Ajuster les contributions de l'image 0121 Adjust Pixel Composition 0121 Ajuster la composition des pixels 0122 Adjust RGB 0122 Ajuster RVB 0123 Adjust brightness, contrast, color 0123 Ajuster la luminosité, le contraste, la couleur 0124 Adjust color saturation based on brightness 0124 Ajuster la saturation des couleurs selon la luminosité 0125 Adjust color using HSL color model 0125 Ajuster la couleur avec le modèle colorimétrique TSL 0126 Adjust color using RGB or CMY colors 0126 Ajuster la couleur avec les couleurs RVB ou CMJ 0127 Adjustment 0127 Ajustement 0128 Album Mass Update 0128 Mise à jour massive d'album 0129 Album Name 0129 Nom de l'album 0130 Albums 0130 Albums 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 Albums : galerie d'images choisies, organiser par glisser-déposer 0132 Algorithm Iterations 0132 Itérations de l'algorithme 0133 Alien Colors 0133 Couleurs alien 0134 All 0134 Tout 0135 All Areas 0135 Toutes les zones 0136 All files 0136 Tous les fichiers 0137 All image files will be re-indexed. \nContinue? 0137 Tous les fichiers image seront réindexés. \nContinuer ? 0138 All±1 0138 Tout±1 0139 All±10 0139 Tout±10 0140 Alpha 0140 Alpha 0141 Amount 0141 Quantité 0142 Amplify 0142 Amplifier 0143 Amplify Contrast 0143 Amplifier le contraste 0144 Amplify area contrast to enhance visibility of details 0144 Amplifier le contraste local pour améliorer la visibilité des détails 0145 Angle 0145 Angle 0146 Anti-Alias 0146 Anti-crénelage 0147 Apply 0147 Appliquer 0148 Apply a soft focus effect to an image 0148 Appliquer un effet de flou artistique à une image 0149 Apply repeatedly while watching the image. 0149 Appliquer de manière répétée en observant l'image. 0150 Area Blend 0150 Fusion de zone 0151 Area Edge Blend 0151 Fusion des bords de zone 0152 Area Fill 0152 Remplissage de zone 0153 Arrange images and text in a layout (photo-montage) 0153 Disposer des images et du texte en une mise en page (photomontage) 0154 Array Complete 0154 Réseau terminé 0155 Array Width 0155 Largeur du réseau 0156 Arrow head 0156 Pointe de flèche 0157 Auto Level 0157 Niveau automatique 0158 Auto black level 0158 Niveau de noir automatique 0159 Auto crop: 0159 Recadrage automatique : 0160 Auto white balance 0160 Balance des blancs automatique 0161 Auto-replay 0161 Lecture automatique 0162 BATCH CHANGE META 0162 MODIFICATION MASSIVE DES MÉTADONNÉES 0163 BATCH CONVERT 0163 CONVERSION MASSIVE 0164 BATCH COPY/MOVE 0164 COPIE/DÉPLACEMENT MASSIF 0165 BATCH DELETE/TRASH 0165 SUPPRESSION/CORBEILLE MASSIVE 0166 BATCH GEOTAGS 0166 GÉOMARQUAGE MASSIF 0167 BATCH KEYWORDS 0167 MOTS-CLÉS MASSIFS 0168 BATCH MENU 0168 MENU TRAITEMENT MASSIF 0169 BATCH OVERLAY 0169 SUPERPOSITION MASSIVE 0170 BATCH PHOTO DATE 0170 DATE PHOTO MASSIVE 0171 BATCH PROCESSING 0171 TRAITEMENT MASSIF 0172 BATCH PURGE KEYWORDS 0172 PURGE MASSIVE DES MOTS-CLÉS 0173 BATCH RENAME KEYWORDS 0173 RENOMMAGE MASSIF DES MOTS-CLÉS 0174 BATCH REPORT META 0174 RAPPORT MASSIF DES MÉTADONNÉES 0175 BATCH SCRIPT 0175 SCRIPT MASSIF 0176 BATCH UPRIGHT 0176 REDRESSEMENT MASSIF 0177 BLANK IMAGE 0177 IMAGE VIERGE 0178 BLUR 0178 FLOU 0179 BOOKMARKS 0179 SIGNETS 0180 BRIGHTNESS RAMP 0180 DÉGRADÉ DE LUMINOSITÉ 0181 Background 0181 Arrière-plan 0182 Background Blur - blur relative to distance from foreground 0182 Flou d'arrière-plan - flou relatif à la distance au premier plan 0183 Background Color 0183 Couleur d'arrière-plan 0184 Background Pattern 0184 Motif d'arrière-plan 0185 Base Transparency 0185 Transparence de base 0186 Batch 0186 Traitement massif 0187 Batch Add/Change Metadata 0187 Ajout/modification massive des métadonnées 0188 Batch Add/Remove Keywords 0188 Ajout/suppression massive de mots-clés 0189 Batch Change Meta 0189 Modification massive des métadonnées 0190 Batch Convert 0190 Conversion massive 0191 Batch Copy/Move 0191 Copie/déplacement massif 0192 Batch Delete/Trash 0192 Suppression/corbeille massive 0193 Batch Geotags 0193 Géomarquage massif 0194 Batch Keywords 0194 Mots-clés massifs 0195 Batch Metadata 0195 Métadonnées massives 0196 Batch Overlay 0196 Superposition massive 0197 Batch Photo Date 0197 Date photo massive 0198 Batch Photo Date/Time 0198 Date/heure de la photo massive 0199 Batch Purge Keywords 0199 Purge massive des mots-clés 0200 Batch Rename Keywords 0200 Renommage massif des mots-clés 0201 Batch Report Meta 0201 Rapport massif des métadonnées 0202 Batch Report Metadata 0202 Rapport massif des métadonnées 0203 Batch Set Geotags 0203 Définition massive des géomarquages 0204 Batch Upright 0204 Redressement massif 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 Traitement massif : copier, déplacer, convertir, convertir RAW, ajouter/modifier les métadonnées 0206 Bend and fine-align 0206 Courber et aligner finement 0207 Bias 0207 Décalage 0208 Black 0208 Noir 0209 Blank Image 0209 Image vierge 0210 Blend 0210 Fondu 0211 Blend 0% 0211 Fondu 0 % 0212 Blend Width 0212 Largeur du fondu 0213 Blend area edits/edges using the mouse 0213 Fondre les modifications/bords de zone avec la souris 0214 Blend: 0% 0214 Fondu : 0 % 0215 Blue 0215 Bleu 0216 Blue Factors 0216 Facteurs de bleu 0217 Blur 0217 Flou 0218 Blur Angle (degrees) 0218 Angle de flou (degrés) 0219 Blur Background 0219 Flou d'arrière-plan 0220 Blur Image 0220 Flouter l'image 0221 Blur Mix 0221 Mélange de flou 0222 Blur Normal 0222 Flou normal 0223 Blur Radius 0223 Rayon de flou 0224 Blur Span 0224 Étendue du flou 0225 Blur Span (pixels) 0225 Étendue du flou (pixels) 0226 Blur the image (various methods) 0226 Flouter l'image (différentes méthodes) 0227 Bookmarks 0227 Signets 0228 Both 0228 Les deux 0229 Bottom 0229 Bas 0230 Bright Limit 0230 Limite claire 0231 Bright Point 0231 Point clair 0232 Brightness 0232 Luminosité 0233 Brightness Histogram 0233 Histogramme de luminosité 0234 Brightness Ramp 0234 Dégradé de luminosité 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 La luminosité doit présenter un dégradé progressif \ns'étendant jusqu'aux bords. 0236 Browse 0236 Parcourir 0237 CALIBRATE PRINTER 0237 CALIBRER L'IMPRIMANTE 0238 CAPTIONS 0238 LÉGENDES 0239 CARTOON 0239 DESSIN ANIMÉ 0240 CHOOSE ALBUM 0240 CHOISIR UN ALBUM 0241 CLEAR AREA 0241 EFFACER LA ZONE 0242 CLOSE 0242 FERMER 0243 COLOR MODE 0243 MODE COULEUR 0244 COMBINE MENU 0244 MENU COMBINER 0245 COMMAND PARAMETERS 0245 PARAMÈTRES DE COMMANDE 0246 COMPLETED 0246 TERMINÉ 0247 COPY FROM IMAGE 0247 COPIER DEPUIS L'IMAGE 0248 COPY IN IMAGE 0248 COPIER DANS L'IMAGE 0249 COPY META 0249 COPIER LES MÉTADONNÉES 0250 COPY PRIOR EDIT 0250 COPIER LA MODIFICATION PRÉCÉDENTE 0251 COPY TO CLIPBOARD 0251 COPIER DANS LE PRESSE-PAPIERS 0252 COPY TO DESKTOP 0252 COPIER SUR LE BUREAU 0253 COPY/MOVE 0253 COPIER/DÉPLACER 0254 COPY/PASTE AREA 0254 COPIER/COLLER UNE ZONE 0255 CREATE ALBUM 0255 CRÉER UN ALBUM 0256 CROP 0256 RECADRER 0257 CROSSHATCH 0257 HACHURES CROISÉES 0258 CURRENT ALBUM 0258 ALBUM ACTUEL 0259 CURRENT FILE FOLDER 0259 DOSSIER DU FICHIER ACTUEL 0260 CURVE EDITING 0260 ÉDITION DE COURBES 0261 CUSTOM KERNEL 0261 NOYAU PERSONNALISÉ 0262 CUSTOM MENU 0262 MENU PERSONNALISÉ 0263 CYCLE 2 FILES 0263 CYCLE 2 FICHIERS 0264 CYCLE 3 FILES 0264 CYCLE 3 FICHIERS 0265 Calculate 0265 Calculer 0266 Calculate Geometry 0266 Calculer la géométrie 0267 Calibrate Printer 0267 Calibrer l'imprimante 0268 Cancel 0268 Annuler 0269 Cartoon 0269 Dessin animé 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 Attention : utilisez la fonction Modifier les métadonnées principales \npour modifier les balises disponibles à cet endroit, afin de garantir \nque les mises à jour associées sont effectuées. 0271 Center 0271 Centre 0272 Center Hole 0272 Trou central 0273 Change 0273 Modifier 0274 Change Log 0274 Journal des modifications 0275 Change file name 0275 Modifier le nom du fichier 0276 Change gallery sort order 0276 Modifier l'ordre de tri de la galerie 0277 Change image colors using an algorithm 0277 Modifier les couleurs de l'image avec un algorithme 0278 Change image pixel dimensions 0278 Modifier les dimensions en pixels de l'image 0279 Chart to adjust monitor color 0279 Graphique pour ajuster la couleur du moniteur 0280 Choose 0280 Choisir 0281 Choose Album 0281 Choisir un album 0282 Choose Albums 0282 Choisir des albums 0283 Choose Captions 0283 Choisir les légendes 0284 Choose an album and show as gallery of images 0284 Choisir un album et l'afficher en galerie d'images 0285 Choose metadata shown on image captions 0285 Choisir les métadonnées affichées dans les légendes des images 0286 Choose new Fotocx home folder 0286 Choisir le nouveau dossier d'accueil de Fotocx 0287 Choose thumbnail folder 0287 Choisir le dossier des vignettes 0288 Choose top image folders 0288 Choisir les dossiers d'images principaux 0289 Clear 0289 Effacer 0290 Click dark spot for black level 0290 Cliquer sur un point sombre pour le niveau de noir 0291 Click for RGB histogram 0291 Cliquer pour l'histogramme RVB 0292 Click gray spot for white balance 0292 Cliquer sur un point gris pour la balance des blancs 0293 Click image to select pixels 0293 Cliquer sur l'image pour sélectionner des pixels 0294 Click image to select, drag image to move. 0294 Cliquer sur l'image pour sélectionner, faire glisser l'image pour la déplacer. 0295 Click mouse to change center 0295 Cliquer avec la souris pour changer le centre 0296 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0296 Cliquer près d'un point du contour de la zone. \nLes éventuels espaces dans le contour seront détectés. \nAppuyer sur F1 pour l'aide 0297 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0297 Cliquer sur les quatre coins d'une zone tétragonale. Appuyer sur [appliquer]. \nL'image est déformée pour transformer le tétragone en rectangle. 0298 Click thumbnail to select file 0298 Cliquer sur la vignette pour sélectionner le fichier 0299 Clip Level 0299 Niveau d'écrêtage 0300 Clip Limit % 0300 Limite d'écrêtage % 0301 Color 0301 Couleur 0302 Color Chooser 0302 Sélecteur de couleur 0303 Color Depth: 0303 Profondeur de couleur : 0304 Color Fringes 0304 Franges colorées 0305 Color Hue 0305 Teinte 0306 Color Map File 0306 Fichier de carte des couleurs 0307 Color Match Images 0307 Correspondance des couleurs des images 0308 Color Mode 0308 Mode couleur 0309 Color calibration tool for printer and paper type 0309 Outil de calibration des couleurs pour imprimante et type de papier 0310 Color map file to use 0310 Fichier de carte des couleurs à utiliser 0311 Combine 0311 Combiner 0312 Combine 2-6 images into a wide panorama image 0312 Combiner 2 à 6 images en un large panorama 0313 Combine many images into an array of images 0313 Combiner plusieurs images en un réseau d'images 0314 Combine multiple images in layers, select and expose layers 0314 Combiner plusieurs images en calques, sélectionner et exposer les calques 0315 Combine multiple noisy photos into a low-noise image 0315 Combiner plusieurs photos bruitées en une image à faible bruit 0316 Combine multiple photos to erase passing people, etc. 0316 Combiner plusieurs photos pour effacer les passants, etc. 0317 Combine within 0317 Combiner à l'intérieur de 0318 Combine: HDR, HDF, stack, panorama, mashup, image array 0318 Combiner : HDR, HDF, empilement, panorama, mashup, réseau d'images 0319 Command Params 0319 Paramètres de commande 0320 Commit 0320 Valider 0321 Confirm Exit 0321 Confirmer la sortie 0322 Contrast 0322 Contraste 0323 Contrast All 0323 Contraste global 0324 Contrast Blue 0324 Contraste bleu 0325 Contrast Green 0325 Contraste vert 0326 Contrast Limit 0326 Limite de contraste 0327 Contrast Red 0327 Contraste rouge 0328 Convert %d image files 0328 Convertir %d fichiers image 0329 Convert an image into a Tiny Planet image 0329 Convertir une image en image Tiny Planet 0330 Convert image into a cartoon drawing 0330 Convertir l'image en dessin animé 0331 Convert image into a crosshatch sketch 0331 Convertir l'image en croquis à hachures croisées 0332 Convert image into a line drawing 0332 Convertir l'image en dessin au trait 0333 Convert image into a simulated painting 0333 Convertir l'image en peinture simulée 0334 Convert image into a simulated sketch (1) 0334 Convertir l'image en croquis simulé (1) 0335 Convert image into a simulated sketch (2) 0335 Convertir l'image en croquis simulé (2) 0336 Convert image into black/white lines 0336 Convertir l'image en lignes noir/blanc 0337 Convert image into dithered dots 0337 Convertir l'image en points tramés 0338 Convert image into square tiles with 3D effect 0338 Convertir l'image en tuiles carrées avec effet 3D 0339 Convert image into tiles matching feature contours 0339 Convertir l'image en tuiles suivant les contours 0340 Copy 0340 Copier 0341 Copy %d image files 0341 Copier %d fichiers image 0342 Copy From Image 0342 Copier depuis l'image 0343 Copy Meta 0343 Copier les métadonnées 0344 Copy Metadata 0344 Copier les métadonnées 0345 Copy Prior Edit 0345 Copier la modification précédente 0346 Copy Within Image 0346 Copier dans l'image 0347 Copy area for later pasting into image 0347 Copier une zone pour la coller plus tard dans une image 0348 Copy areas from another image using the mouse 0348 Copier des zones depuis une autre image avec la souris 0349 Copy areas from prior edits using the mouse 0349 Copier des zones à partir de modifications précédentes avec la souris 0350 Copy areas within an image using the mouse 0350 Copier des zones à l'intérieur d'une image avec la souris 0351 Copy image file to the clipboard 0351 Copier le fichier image dans le presse-papiers 0352 Copy image file to the desktop 0352 Copier le fichier image sur le bureau 0353 Copy in Image 0353 Copier dans l'image 0354 Copy metadata from one image to another 0354 Copier les métadonnées d'une image vers une autre 0355 Copy or Move Image File 0355 Copier ou déplacer le fichier image 0356 Copy or Move image file to new location 0356 Copier ou déplacer le fichier image vers un nouvel emplacement 0357 Copy to Clipboard 0357 Copier dans le presse-papiers 0358 Copy to Desktop 0358 Copier sur le bureau 0359 Copy without unsaved changes? 0359 Copier sans les modifications non enregistrées ? 0360 Copy/Move 0360 Copier/Déplacer 0361 Copy/move selected image files to a new folder 0361 Copier/déplacer les fichiers image sélectionnés vers un nouveau dossier 0362 Copyright 0362 Copyright 0363 Create 0363 Créer 0364 Create Album 0364 Créer un album 0365 Create Blank Image 0365 Créer une image vierge 0366 Create Mosaic 0366 Créer une mosaïque 0367 Create a blank image 0367 Créer une image vierge 0368 Create a mosaic with tiles made from all images 0368 Créer une mosaïque avec des tuiles faites de toutes les images 0369 Create a new album (ordered set of image files) 0369 Créer un nouvel album (ensemble ordonné de fichiers image) 0370 Create an embossed or 3D appearance 0370 Créer un effet de relief ou 3D 0371 Create or replace an album 0371 Créer ou remplacer un album 0372 Crop 0372 Recadrer 0373 Crop (trim) image margins 0373 Recadrer (rogner) les marges de l'image 0374 Crop Buttons 0374 Boutons de recadrage 0375 Crop Image 0375 Recadrer l'image 0376 Crosshatch 0376 Hachures croisées 0377 Crosshatch Sketch 0377 Croquis à hachures croisées 0378 Current Album 0378 Album actuel 0379 Current File Folder 0379 Dossier du fichier actuel 0380 Current gallery 0380 Galerie actuelle 0381 Current image: 0381 Image actuelle : 0382 Curve Node 0382 Nœud de courbe 0383 Curve lines need at least 4 points 0383 Les lignes de courbe nécessitent au moins 4 points 0384 Custom 0384 Personnalisé 0385 Custom Kernel 0385 Noyau personnalisé 0386 Custom Shortcuts \n 0386 Raccourcis personnalisés \n 0387 Custom menu: favorite/frequent functions, scripts, plugins 0387 Menu personnalisé : fonctions favorites/fréquentes, scripts, plugins 0388 Customize 0388 Personnaliser 0389 Customize: 0389 Personnaliser : 0390 Cut Bottom 0390 Couper le bas 0391 Cut Top 0391 Couper le haut 0392 Cycle 2 Files 0392 Cycle 2 fichiers 0393 Cycle 2 Prior Files 0393 Cycle 2 fichiers précédents 0394 Cycle 3 Files 0394 Cycle 3 fichiers 0395 Cycle 3 Prior Files 0395 Cycle 3 fichiers précédents 0396 Cycle through images: 0396 Parcourir les images : 0397 DARK/BRIGHT PIXELS 0397 PIXELS SOMBRES/CLAIRS 0398 DEFOG 0398 ANTI-BRUME 0399 DELETE ALBUM 0399 SUPPRIMER L'ALBUM 0400 DELETE META 0400 SUPPRIMER LES MÉTADONNÉES 0401 DELETE/TRASH 0401 SUPPRIMER/CORBEILLE 0402 DENOISE 0402 RÉDUCTION DU BRUIT 0403 DIALOG BUTTONS 0403 BOUTONS DE DIALOGUE 0404 DITHER 0404 TRAMAGE 0405 DRAG AND DROP 0405 GLISSER-DÉPOSER 0406 Dark Areas 0406 Zones sombres 0407 Dark Limit 0407 Limite sombre 0408 Dark Point 0408 Point sombre 0409 Dark/Bright Pixels 0409 Pixels sombres/clairs 0410 Data file 0410 Fichier de données 0411 Define keywords used for searching images 0411 Définir les mots-clés utilisés pour rechercher les images 0412 Defined Keywords: 0412 Mots-clés définis : 0413 Defog 0413 Anti-brume 0414 Delete 0414 Supprimer 0415 Delete Album 0415 Supprimer l'album 0416 Delete Meta 0416 Supprimer les métadonnées 0417 Delete Metadata 0417 Supprimer les métadonnées 0418 Delete Originals 0418 Supprimer les originaux 0419 Delete an album 0419 Supprimer un album 0420 Delete or Trash selected image files 0420 Supprimer ou mettre à la corbeille les fichiers image sélectionnés 0421 Delete or trash an image file 0421 Supprimer ou mettre à la corbeille un fichier image 0422 Delete read-only file? 0422 Supprimer le fichier en lecture seule ? 0423 Delete/Trash 0423 Supprimer/Corbeille 0424 Denoise 0424 Réduction du bruit 0425 Depth 0425 Profondeur 0426 Description: %s\n 0426 Description : %s\n 0427 Desktop 0427 Bureau 0428 Dialog Font 0428 Police de la boîte de dialogue 0429 Diffs 0429 Différences 0430 Directed Blur 0430 Flou dirigé 0431 Directed Blur - blur locally in direction of mouse drag 0431 Flou dirigé - flou local dans la direction du glissement de la souris 0432 Disable 0432 Désactiver 0433 Disable areas for editing 0433 Désactiver les zones pour l'édition 0434 Discard unsaved changes? 0434 Abandonner les modifications non enregistrées ? 0435 Discard unsaved edits? 0435 Abandonner les modifications non enregistrées ? 0436 Distort image areas using the mouse 0436 Déformer des zones d'image avec la souris 0437 Dither 0437 Tramage 0438 Dither Image 0438 Tramer l'image 0439 Dither0 0439 Tramage0 0440 Dither1 0440 Tramage1 0441 Dither2 0441 Tramage2 0442 Dither3 0442 Tramage3 0443 Dither4 0443 Tramage4 0444 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0444 Faire glisser les images pour un alignement approximatif.\nPour pivoter, glisser depuis le bord inférieur. 0445 Drag margin box middle or edges 0445 Faire glisser le milieu ou les bords du cadre de marge 0446 Drag mouse on image. \nLeft click to cancel. 0446 Faire glisser la souris sur l'image. \nClic gauche pour annuler. 0447 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0447 Faire glisser la souris pour sélectionner. Effacer. Répéter. \nClic : étendre la sélection jusqu'à la souris. 0448 Drag mouse to set center 0448 Faire glisser la souris pour définir le centre 0449 Drag near an image corner using the mouse 0449 Faire glisser près d'un coin de l'image avec la souris 0450 Drag on image to level image.\nClick on image for level lines. 0450 Faire glisser sur l'image pour la mettre à niveau.\nCliquer sur l'image pour les lignes de niveau. 0451 Drag within image using the mouse 0451 Faire glisser à l'intérieur de l'image avec la souris 0452 Draw a line across the image in \ndirection of brightness change. 0452 Tracer une ligne sur l'image dans la \ndirection du changement de luminosité. 0453 Draw box on image 0453 Dessiner un rectangle sur l'image 0454 Draw line or arrow on image 0454 Dessiner une ligne ou une flèche sur l'image 0455 Draw on image: text, line/arrow, box, circle, ellipse 0455 Dessiner sur l'image : texte, ligne/flèche, rectangle, cercle, ellipse 0456 Draw oval on image 0456 Dessiner un ovale sur l'image 0457 Draw text on image 0457 Dessiner du texte sur l'image 0458 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0458 Dossiers dupliqués ou imbriqués : \n %s \n %s \nVeuillez les supprimer. 0459 Duplicates: 0459 Doublons : 0460 EDIT ALBUM 0460 MODIFIER L'ALBUM 0461 EDIT ANY META 0461 MODIFIER TOUTES LES MÉTADONNÉES 0462 EDIT BOOKMARKS 0462 MODIFIER LES SIGNETS 0463 EDIT MAIN META 0463 MODIFIER LES MÉTADONNÉES PRINCIPALES 0464 EDIT MENU 0464 MENU ÉDITION 0465 EDIT PROCEDURES 0465 MODIFIER LES PROCÉDURES 0466 EDIT SCRIPT 0466 MODIFIER LE SCRIPT 0467 EDIT WORKFLOW 0467 MODIFIER LE FLUX DE TRAVAIL 0468 EFFECTS MENU 0468 MENU EFFETS 0469 EMBOSS 0469 RELIEF 0470 ENABLE/DISABLE AREA 0470 ACTIVER/DÉSACTIVER LA ZONE 0471 ENGRAVE 0471 GRAVURE 0472 ESCHER SPIRAL 0472 SPIRALE D'ESCHER 0473 EXPORT FILES 0473 EXPORTER LES FICHIERS 0474 Edge 0474 Bord 0475 Edit 0475 Modifier 0476 Edit Any Meta 0476 Modifier toutes les métadonnées 0477 Edit Any Metadata 0477 Modifier toutes les métadonnées 0478 Edit Bookmarks 0478 Modifier les signets 0479 Edit Images 0479 Modifier les images 0480 Edit Line 0480 Modifier la ligne 0481 Edit Line/Arrow 0481 Modifier la ligne/flèche 0482 Edit Main Meta 0482 Modifier les métadonnées principales 0483 Edit Main Metadata 0483 Modifier les métadonnées principales 0484 Edit Menu 0484 Menu édition 0485 Edit Metadata 0485 Modifier les métadonnées 0486 Edit Text 0486 Modifier le texte 0487 Edit any metadata tag 0487 Modifier n'importe quelle balise de métadonnées 0488 Edit function can not use Paint Edits 0488 La fonction de modification ne peut pas utiliser les modifications peintes 0489 Edit function must be active 0489 La fonction de modification doit être active 0490 Edit key metadata: keywords/geotags/description/rating ... 0490 Modifier les métadonnées clés : mots-clés/géomarquages/description/évaluation... 0491 Edit plugins menu 0491 Modifier le menu des plugins 0492 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0492 Modifier : recadrer, pivoter, retoucher, redimensionner, annoter, peindre les modifications, copier des zones 0493 Effects 0493 Effets 0494 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0494 Effets : dessin animé, croquis, peinture, relief, tramage, texture, couleurs, convolution personnalisée 0495 Emboss 0495 Relief 0496 Enable 0496 Activer 0497 Enable areas for editing 0497 Activer les zones pour l'édition 0498 End of gallery 0498 Fin de la galerie 0499 Engrave 0499 Gravure 0500 Enter Keyword 0500 Entrer un mot-clé 0501 Enter New Keyword 0501 Entrer un nouveau mot-clé 0502 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0502 Entrer les propriétés de la ligne ou de la flèche dans la boîte de dialogue, \ncliquer/glisser sur l'image, clic droit pour supprimer 0503 Enter text, [Add] to layout, edit properties. 0503 Entrer le texte, [Ajouter] à la mise en page, modifier les propriétés. 0504 Enter text, click/drag on image, right click to remove 0504 Entrer le texte, cliquer/glisser sur l'image, clic droit pour supprimer 0505 Erase 0505 Effacer 0506 Erase existing areas 0506 Effacer les zones existantes 0507 Escher Spiral 0507 Spirale d'Escher 0508 Exceed 50 anchor points 0508 Dépassement de 50 points d'ancrage 0509 Export Files 0509 Exporter les fichiers 0510 Export selected image files to another folder 0510 Exporter les fichiers image sélectionnés vers un autre dossier 0511 FILE MENU 0511 MENU FICHIER 0512 FILE SAVE 0512 ENREGISTRER LE FICHIER 0513 FILE VIEW 0513 AFFICHAGE DU FICHIER 0514 FIND AREA GAP 0514 TROUVER UN ESPACE DANS LA ZONE 0515 FIND BAD FILES 0515 TROUVER LES FICHIERS DÉFECTUEUX 0516 FIND DUPLICATES 0516 TROUVER LES DOUBLONS 0517 FIRST INDEX 0517 PREMIER INDEX 0518 FIRST STARTUP 0518 PREMIER DÉMARRAGE 0519 FIX META 0519 CORRIGER LES MÉTADONNÉES 0520 FLATTEN HISTOGRAM 0520 APLATIR L'HISTOGRAMME 0521 FLATTEN PHOTO 0521 APLATIR LA PHOTO 0522 FOLDER TREE 0522 ARBORESCENCE DES DOSSIERS 0523 FOTOCX FOR WINDOWS 11 0523 FOTOCX POUR WINDOWS 11 0524 FOTOCX LIMITATIONS 0524 LIMITATIONS DE FOTOCX 0525 FOTOCX USAGE 0525 UTILISATION DE FOTOCX 0526 FRINGES 0526 FRANGES 0527 FUSION 0527 FUSION 0528 Fetch 0528 Récupérer 0529 File 0529 Fichier 0530 File Mod Date/Time 0530 Date/heure de modification du fichier 0531 File Name 0531 Nom du fichier 0532 File Name/Number 0532 Nom/numéro du fichier 0533 File Name: %s \n 0533 Nom du fichier : %s \n 0534 File Size (bytes) 0534 Taille du fichier (octets) 0535 File View 0535 Affichage du fichier 0536 File count: 0536 Nombre de fichiers : 0537 File type cannot be edited 0537 Le type de fichier ne peut pas être modifié 0538 File1 0538 Fichier1 0539 File2 0539 Fichier2 0540 File: 0540 Fichier : 0541 File: new session, open, rename, copy/move, delete, print 0541 Fichier : nouvelle session, ouvrir, renommer, copier/déplacer, supprimer, imprimer 0542 Fill selected areas or transparent areas with a color 0542 Remplir les zones sélectionnées ou les zones transparentes avec une couleur 0543 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0543 Remplir les zones sélectionnées avec une couleur pour vérification visuelle. \nMéthode 1 : clic gauche dans chaque zone sélectionnée non encore remplie. \nMéthode 2 : clic droit EN DEHORS de toutes les zones sélectionnées. \nAppuyer sur le bouton [aide] pour plus de précisions 0544 Find 0544 Rechercher 0545 Find Bad Files 0545 Trouver les fichiers défectueux 0546 Find Duplicate Images 0546 Trouver les images en double 0547 Find Duplicates 0547 Trouver les doublons 0548 Find Gap 0548 Trouver l'espace 0549 Find a gap in an area outline 0549 Trouver un espace dans le contour d'une zone 0550 Find all images for a location [date range] 0550 Trouver toutes les images pour un lieu [plage de dates] 0551 Find all images for a selected tag name and value 0551 Trouver toutes les images pour un nom et une valeur de balise sélectionnés 0552 Find images meeting multiple search criteria 0552 Trouver les images répondant à plusieurs critères de recherche 0553 Find optimum factors: 0553 Trouver les facteurs optimaux : 0554 Finish 0554 Terminer 0555 Finish Area 0555 Terminer la zone 0556 Fix Bad File 0556 Corriger un fichier défectueux 0557 Fix Broken Metadata 0557 Corriger des métadonnées corrompues 0558 Fix Meta 0558 Corriger les métadonnées 0559 Fix Motion Blur 0559 Corriger le flou de mouvement 0560 Fix Perspective 0560 Corriger la perspective 0561 Fix color fringes (chromatic aberration) 0561 Corriger les franges colorées (aberration chromatique) 0562 Fix perspective for object photographed from an angle 0562 Corriger la perspective d'un objet photographié sous un angle 0563 Fix red-eyes from flash photo 0563 Corriger les yeux rouges dus au flash 0564 Flatten 0564 Aplatir 0565 Flatten Histogram 0565 Aplatir l'histogramme 0566 Flatten Pano 0566 Aplatir le panorama 0567 Flatten Photo 0567 Aplatir la photo 0568 Flatten brightness histogram to enhance details 0568 Aplatir l'histogramme de luminosité pour améliorer les détails 0569 Flatten curved surface. 0569 Aplatir une surface courbe. 0570 Flatten photo of a curved image (e.g. poster on round column 0570 Aplatir la photo d'une image courbe (ex. affiche sur une colonne ronde) 0571 Flip 0571 Retourner 0572 Folder Tree 0572 Arborescence des dossiers 0573 Folders 0573 Dossiers 0574 Folders for image files (subfolders included automatically) 0574 Dossiers pour les fichiers image (sous-dossiers inclus automatiquement) 0575 Font 0575 Police 0576 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0576 Pour une séquence d'images aléatoire, cette valeur est \nla fréquence relative d'affichage de l'image. \nLa valeur de base est 10. 20 --> affichée 2x plus souvent. 0577 Foreground 0577 Premier plan 0578 Fotocx copyright notice 0578 Avis de copyright de Fotocx 0579 Fotocx home 0579 Accueil Fotocx 0580 Fotocx privacy policy 0580 Politique de confidentialité de Fotocx 0581 Fotocx video tutorial on YouTube 0581 Tutoriel vidéo Fotocx sur YouTube 0582 Fotocx web site (information and downloads) 0582 Site web de Fotocx (informations et téléchargements) 0583 FreeSans 0583 FreeSans 0584 Full List 0584 Liste complète 0585 Full Screen 0585 Plein écran 0586 Fusion 0586 Fusion 0587 GALLERY END 0587 FIN DE GALERIE 0588 GALLERY FILTER 0588 FILTRE DE GALERIE 0589 GALLERY HOME 0589 ACCUEIL DE LA GALERIE 0590 GALLERY MENU 0590 MENU GALERIE 0591 GALLERY OVERVIEW 0591 APERÇU DE LA GALERIE 0592 GALLERY SORT 0592 TRI DE LA GALERIE 0593 GALLERY TO ALBUM 0593 GALERIE VERS ALBUM 0594 GALLERY VIEW 0594 AFFICHAGE DE LA GALERIE 0595 GDK pixbuf: cannot save file 0595 GDK pixbuf : impossible d'enregistrer le fichier 0596 GLOBAL RETINEX 0596 RETINEX GLOBAL 0597 GRID SETTINGS 0597 PARAMÈTRES DE LA GRILLE 0598 Gallery 0598 Galerie 0599 Gallery End 0599 Fin de la galerie 0600 Gallery Filter 0600 Filtre de la galerie 0601 Gallery Home 0601 Accueil de la galerie 0602 Gallery Sort 0602 Tri de la galerie 0603 Gallery View 0603 Affichage de la galerie 0604 Gallery of newest image files 0604 Galerie des fichiers image les plus récents 0605 Gallery of recently viewed image files 0605 Galerie des fichiers image récemment consultés 0606 Gallery to Album 0606 Galerie vers album 0607 Gallery view with thumbnails and basic metadata 0607 Vue galerie avec vignettes et métadonnées de base 0608 Gallery view with thumbnails and file data 0608 Vue galerie avec vignettes et données de fichier 0609 Gallery: thumbnails, new/recent, sort, select, bookmarks 0609 Galerie : vignettes, nouveau/récent, tri, sélection, signets 0610 Generate an inward spiraling repeating image 0610 Générer une image répétitive en spirale vers l'intérieur 0611 Global Retinex 0611 Retinex global 0612 Gradual 0612 Progressif 0613 Graduated Blur 0613 Flou progressif 0614 Graduated Blur - blur relative to pixel contrast 0614 Flou progressif - flou relatif au contraste des pixels 0615 Grayscale 0615 Niveaux de gris 0616 Green 0616 Vert 0617 Grid Settings 0617 Paramètres de la grille 0618 Group by country 0618 Grouper par pays 0619 Group by country/date 0619 Grouper par pays/date 0620 Group by country/location 0620 Grouper par pays/lieu 0621 Group by country/location/date 0621 Grouper par pays/lieu/date 0622 Group by date/country 0622 Grouper par date/pays 0623 Group by date/country/location 0623 Grouper par date/pays/lieu 0624 HDF 0624 HDF 0625 HDR 0625 HDR 0626 HELP MENU 0626 MENU AIDE 0627 Hard 0627 Dur 0628 Height 0628 Hauteur 0629 Height: 0629 Hauteur : 0630 Help 0630 Aide 0631 Help: user guide, tutorial, change log, licenses, privacy, about 0631 Aide : guide utilisateur, tutoriel, journal des modifications, licences, confidentialité, à propos 0632 Hide 0632 Masquer 0633 Hide selected areas 0633 Masquer les zones sélectionnées 0634 High 0634 Élevé 0635 High Depth of Field - combine near/far focus images for deeper focus 0635 Profondeur de champ élevée - combine des images à mise au point proche/lointaine pour une profondeur accrue 0636 High Dynamic Range - combine bright/dark images for better detail 0636 Plage dynamique élevée - combine des images claires/sombres pour plus de détails 0637 Highlight darkest and brightest pixels 0637 Mettre en évidence les pixels les plus sombres et les plus clairs 0638 Home Folder 0638 Dossier d'accueil 0639 Home Page 0639 Page d'accueil 0640 Horz 0640 Horz 0641 How to remove Fotocx application and user files 0641 Comment supprimer l'application Fotocx et les fichiers utilisateur 0642 Hue 0642 Teinte 0643 IMAGE ARRAY 0643 RÉSEAU D'IMAGES 0644 INDEX FILES 0644 INDEXER LES FICHIERS 0645 INSIDE-OUT 0645 INTÉRIEUR-EXTÉRIEUR 0646 INVERT AREA 0646 INVERSER LA ZONE 0647 Icon size 0647 Taille des icônes 0648 Icons 0648 Icônes 0649 Image 0649 Image 0650 Image Array 0650 Réseau d'images 0651 Image Columns 0651 Colonnes d'images 0652 Image Differences 0652 Différences d'images 0653 Image File 0653 Fichier image 0654 Image File: 0654 Fichier image : 0655 Image Keywords 0655 Mots-clés de l'image 0656 Image Locations 0656 Lieux des images 0657 Image Markup 0657 Annotation d'image 0658 Image Position 0658 Position de l'image 0659 Image Preferences 0659 Préférences de l'image 0660 Image Ratios 0660 Ratios d'image 0661 Image Size (pixels) 0661 Taille de l'image (pixels) 0662 Image Time 0662 Heure de l'image 0663 Image Timeline 0663 Chronologie des images 0664 Image colors are converted for printing. 0664 Les couleurs de l'image sont converties pour l'impression. 0665 Image dimensions have changed \nCopy Prior Edit cannot be used 0665 Les dimensions de l'image ont changé \nCopier la modification précédente ne peut pas être utilisée 0666 Image dimensions have changed, \nArea Blend cannot be used 0666 Les dimensions de l'image ont changé, \nla fusion de zone ne peut pas être utilisée 0667 Image dimensions have changed, \nthis prior image cannot be used 0667 Les dimensions de l'image ont changé, \ncette image précédente ne peut pas être utilisée 0668 Image is fixed, unmovable 0668 L'image est fixe, non déplaçable 0669 Images sizes are not compatible 0669 Les tailles des images ne sont pas compatibles 0670 Include: 0670 Inclure : 0671 Index Files 0671 Indexer les fichiers 0672 Index Level 0672 Niveau d'index 0673 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0673 La fonction d'index a été interrompue. \nL'indexation est nécessaire pour les fonctions de recherche et de carte \net pour que les pages de galerie de vignettes s'affichent rapidement. 0674 Index new image files and make thumbnails 0674 Indexer les nouveaux fichiers image et créer les vignettes 0675 Input color to match and adjust: 0675 Couleur d'entrée à faire correspondre et ajuster : 0676 Inside-out 0676 Intérieur-extérieur 0677 Intensity 0677 Intensité 0678 Invert 0678 Inverser 0679 Invert selected areas (selected ↔ not selected) 0679 Inverser les zones sélectionnées (sélectionné ↔ non sélectionné) 0680 Irregular Tiles 0680 Tuiles irrégulières 0681 Iterations 0681 Itérations 0682 JPEG ARTIFACTS 0682 ARTEFACTS JPEG 0683 JPEG Artifacts 0683 Artefacts JPEG 0684 JPEG files 0684 Fichiers JPEG 0685 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0685 Jan Fév Mar Avr Mai Jun Jul Aoû Sep Oct Nov Déc 0686 Jump to gallery beginning [home] 0686 Aller au début de la galerie [origine] 0687 Jump to gallery end [end] 0687 Aller à la fin de la galerie [fin] 0688 KEYBOARD ESCAPE KEY 0688 TOUCHE ÉCHAP DU CLAVIER 0689 KEYBOARD SHORTCUTS 0689 RACCOURCIS CLAVIER 0690 KEYWORDS OVERVIEW 0690 APERÇU DES MOTS-CLÉS 0691 Keep 0691 Conserver 0692 Kernel size 0692 Taille du noyau 0693 Keyboard Shortcuts 0693 Raccourcis clavier 0694 Keywords Category 0694 Catégorie de mots-clés 0695 Kill active dialog? 0695 Fermer la boîte de dialogue active ? 0696 Kill busy function? 0696 Arrêter la fonction en cours ? 0697 Kuwahara 0697 Kuwahara 0698 Kuwahara Depth 0698 Profondeur Kuwahara 0699 LINE COLOR 0699 COULEUR DE LIGNE 0700 LOAD/SAVE AREA 0700 CHARGER/ENREGISTRER LA ZONE 0701 LOCAL CONTRAST 0701 CONTRASTE LOCAL 0702 LOCAL RETINEX 0702 RETINEX LOCAL 0703 Language 0703 Langue 0704 Layout and background image 0704 Mise en page et image d'arrière-plan 0705 Left 0705 Gauche 0706 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0706 Glisser avec le clic gauche dans la zone \npour annuler progressivement les modifications de la zone. \nGlisser avec le clic droit pour restaurer les modifications. \nGlisser le long du bord de la zone pour fondre le bord. 0707 Left/right click: previous/next image (also arrow keys) 0707 Clic gauche/droit : image précédente/suivante (aussi touches fléchées) 0708 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0708 Clic gauche/droit : annuler/rétablir une étape de modification \nClic du milieu : revenir à l'étape de modification sélectionnée 0709 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0709 Clic gauche/droit : zoom avant/arrière sur l'image/vignette (aussi touches +/-) 0710 Length 0710 Longueur 0711 Level 0711 Niveau 0712 Licenses 0712 Licences 0713 Light Source 0713 Source de lumière 0714 Lightness 0714 Luminosité 0715 Limit 0715 Limite 0716 Line Color 0716 Couleur de ligne 0717 Line Threshold 0717 Seuil de ligne 0718 Line Width 0718 Largeur de ligne 0719 Line length 0719 Longueur de ligne 0720 List Fotocx command line parameters 0720 Lister les paramètres de ligne de commande de Fotocx 0721 List all metadata for current image or clicked thumbnail 0721 Lister toutes les métadonnées de l'image actuelle ou de la vignette cliquée 0722 List outboard programs and functions 0722 Lister les programmes et fonctions externes 0723 Load 0723 Charger 0724 Load settings from file 0724 Charger les paramètres depuis un fichier 0725 Local Contrast 0725 Contraste local 0726 Local Retinex 0726 Retinex local 0727 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0727 Le lieu et le pays remplaceront les valeurs actuelles.\nLes données GPS ne sont remplacées que si une nouvelle valeur est présente. 0728 Lock 0728 Verrouiller 0729 Low Amplify 0729 Faible amplification 0730 MAGNIFY IMAGE 0730 AGRANDIR L'IMAGE 0731 MAKE WAVES 0731 CRÉER DES VAGUES 0732 MANAGE KEYWORDS 0732 GÉRER LES MOTS-CLÉS 0733 MAP MENU 0733 MENU CARTE 0734 MAP VIEW 0734 AFFICHAGE DE LA CARTE 0735 MARGINS 0735 MARGES 0736 MARKUP 0736 ANNOTATION 0737 MASHUP 0737 MASHUP 0738 MATCH COLORS 0738 FAIRE CORRESPONDRE LES COULEURS 0739 MEASURE IMAGE 0739 MESURER L'IMAGE 0740 MENU SHORTCUTS 0740 RACCOURCIS DE MENU 0741 METADATA MENU 0741 MENU MÉTADONNÉES 0742 METADATA TAGS 0742 BALISES DE MÉTADONNÉES 0743 METADATA VIEW 0743 AFFICHAGE DES MÉTADONNÉES 0744 MONITOR COLOR 0744 COULEUR DU MONITEUR 0745 MOSAIC 0745 MOSAÏQUE 0746 MOUSE ALT-RIGHT-BUTTON 0746 SOURIS ALT-CLIC DROIT 0747 MOUSE FUNCTIONS 0747 FONCTIONS DE LA SOURIS 0748 MOUSE OWNERSHIP 0748 PROPRIÉTÉ DE LA SOURIS 0749 MOVE FOTOCX HOME 0749 DÉPLACER L'ACCUEIL DE FOTOCX 0750 Magnify 0750 Agrandir 0751 Magnify Image 0751 Agrandir l'image 0752 Magnify image around the mouse position 0752 Agrandir l'image autour de la position de la souris 0753 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0753 La mémoire principale est trop petite pour exécuter Fotocx. \nVous pouvez essayer quand même si vous le souhaitez. \n Continuer ? 0754 Make Layout Image 0754 Créer une image de mise en page 0755 Make Square Tiles 0755 Créer des tuiles carrées 0756 Make Waves 0756 Créer des vagues 0757 Make a spherical projection of an image 0757 Créer une projection sphérique d'une image 0758 Make black margins transparent 0758 Rendre les marges noires transparentes 0759 Make new versions 0759 Créer de nouvelles versions 0760 Make width constant for window size 0760 Rendre la largeur constante pour la taille de la fenêtre 0761 Manage Keywords 0761 Gérer les mots-clés 0762 Map 0762 Carte 0763 Map View 0763 Affichage de la carte 0764 Maps 0764 Cartes 0765 Maps: view images by map location 0765 Cartes : afficher les images par emplacement sur la carte 0766 Margin 0766 Marge 0767 Margins 0767 Marges 0768 Markup 0768 Annotation 0769 Mashup 0769 Mashup 0770 Mass update album files 0770 Mise à jour massive des fichiers d'album 0771 Match Brightness 0771 Correspondance de luminosité 0772 Match Colors 0772 Correspondance des couleurs 0773 Match Level 0773 Niveau de correspondance 0774 Match Limit 0774 Limite de correspondance 0775 Match image colors to colors of another image 0775 Faire correspondre les couleurs de l'image à celles d'une autre image 0776 Match using: 0776 Correspondance selon : 0777 Matching Keywords 0777 Mots-clés correspondants 0778 Max 0778 Max 0779 Max. Width 0779 Largeur max. 0780 Measure Image 0780 Mesurer l'image 0781 Measure Noise 0781 Mesurer le bruit 0782 Measure pixel distances within an image 0782 Mesurer les distances entre pixels dans une image 0783 Menu Colors 0783 Couleurs du menu 0784 Menu Style 0784 Style du menu 0785 Metadata 0785 Métadonnées 0786 Metadata Tags 0786 Balises de métadonnées 0787 Metadata View 0787 Affichage des métadonnées 0788 Metadata from Search Function 0788 Métadonnées de la fonction de recherche 0789 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0789 Méthode 1 :\nClic gauche sur l'œil rouge pour l'assombrir.\nMéthode 2 :\nGlisser vers le bas et la droite pour entourer l'œil rouge.\nClic gauche sur l'œil rouge pour l'assombrir.\nAnnuler l'œil rouge :\nClic droit sur l'œil rouge. 0790 Mirror: 0790 Miroir : 0791 Mode: 0791 Mode : 0792 Monitor Color 0792 Couleur du moniteur 0793 Mosaic 0793 Mosaïque 0794 Mouse Radius 0794 Rayon de la souris 0795 Mouse Warp (drag image) 0795 Déformation à la souris (glisser l'image) 0796 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0796 Glisser la souris : faire pivoter l'image à 360° \nClic souris G/D : zoom avant/arrière \nÉchap : quitter la vue panorama 0797 Move %d image files 0797 Déplacer %d fichiers image 0798 Move Fotocx Home 0798 Déplacer l'accueil de Fotocx 0799 Move Fotocx Home Folder 0799 Déplacer le dossier d'accueil de Fotocx 0800 Move Fotocx home folder to chosen folder 0800 Déplacer le dossier d'accueil de Fotocx vers le dossier choisi 0801 Move mouse in a monotone image area. 0801 Déplacer la souris dans une zone d'image monotone. 0802 Multiplier 0802 Multiplicateur 0803 NEW SESSION 0803 NOUVELLE SESSION 0804 NEWEST FILES 0804 FICHIERS LES PLUS RÉCENTS 0805 NEWLINE CHARACTERS IN METADATA 0805 CARACTÈRES DE RETOUR À LA LIGNE DANS LES MÉTADONNÉES 0806 NON-STANDARD DIALOG WIDGETS 0806 WIDGETS DE DIALOGUE NON STANDARD 0807 New Area 0807 Nouvelle zone 0808 New File Name: 0808 Nouveau nom de fichier : 0809 New Location 0809 Nouveau lieu 0810 New Location: 0810 Nouveau lieu : 0811 New Name 0811 Nouveau nom 0812 New Session 0812 Nouvelle session 0813 New Type: 0813 Nouveau type : 0814 New Version 0814 Nouvelle version 0815 Newest 0815 Plus récent 0816 Newest Files 0816 Fichiers les plus récents 0817 Next 0817 Suivant 0818 Next gallery 0818 Galerie suivante 0819 No 0819 Non 0820 No curve lines found 0820 Aucune ligne de courbe trouvée 0821 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0821 Aucun index de fichiers image n'a été trouvé.\nUn index de fichiers image va être créé.\nVos fichiers image ne seront pas modifiés.\nCela peut prendre beaucoup de temps si vous \navez plusieurs milliers de fichiers image. 0822 No images found 0822 Aucune image trouvée 0823 Noise Reduction 0823 Réduction du bruit 0824 Noise Size 0824 Taille du bruit 0825 None 0825 Aucun 0826 Normal Blur 0826 Flou normal 0827 Normal Blur - mix pixels with all neighbor pixels 0827 Flou normal - mélange les pixels avec tous les pixels voisins 0828 OPEN IMAGE FILE 0828 OUVRIR UN FICHIER IMAGE 0829 OTHER TOPICS 0829 AUTRES SUJETS 0830 OUTLINES 0830 CONTOURS 0831 Old Name 0831 Ancien nom 0832 One Tag: 0832 Une balise : 0833 Opacity 0833 Opacité 0834 Open 0834 Ouvrir 0835 Open Image File 0835 Ouvrir un fichier image 0836 Open a file and paste as selected area into an image 0836 Ouvrir un fichier et le coller comme zone sélectionnée dans une image 0837 Open a parallel Fotocx session 0837 Ouvrir une session Fotocx parallèle 0838 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0838 Ouvrir et modifier le fichier de la charte de couleurs numérisée. \nSupprimer toute inclinaison ou rotation due à la numérisation. \n(Utiliser la fonction Corriger la perspective pour cela). \nCouper précisément la fine marge verte. \nEnregistrer (remplacer) le fichier de la charte de couleurs. 0839 Open the trimmed color chart file 0839 Ouvrir le fichier de la charte de couleurs rogné 0840 Optimize 0840 Optimiser 0841 Other Tag ... 0841 Autre balise ... 0842 Outboard Programs 0842 Programmes externes 0843 Outline Drawing 0843 Dessin au trait 0844 Outlines 0844 Contours 0845 Output Color 0845 Couleur de sortie 0846 Overlap 0846 Chevauchement 0847 Overlay position in host image: 0847 Position de la superposition dans l'image hôte : 0848 Overlay width, % host image width: 0848 Largeur de la superposition, % de la largeur de l'image hôte : 0849 Overwrite file? \n%s 0849 Remplacer le fichier ? \n%s 0850 PAINT EDITS 0850 PEINDRE LES MODIFICATIONS 0851 PAINT IMAGE 0851 PEINDRE L'IMAGE 0852 PAINT TRANSPARENCY 0852 PEINDRE LA TRANSPARENCE 0853 PAINTING 0853 PEINTURE 0854 PANORAMA 0854 PANORAMA 0855 PATTERN 0855 MOTIF 0856 PERSPECTIVE 0856 PERSPECTIVE 0857 PLACES/DATES 0857 LIEUX/DATES 0858 PLUGINS 0858 PLUGINS 0859 PREV/NEXT 0859 PRÉC/SUIV 0860 PRINT CALIBRATED 0860 IMPRESSION CALIBRÉE 0861 PRINT IMAGE 0861 IMPRIMER L'IMAGE 0862 PRIVACY 0862 CONFIDENTIALITÉ 0863 PROBLEM FILES 0863 FICHIERS PROBLÉMATIQUES 0864 PROBLEM REPORTING 0864 SIGNALEMENT DE PROBLÈME 0865 Paint Edits 0865 Peindre les modifications 0866 Paint Edits already active 0866 Peindre les modifications déjà actif 0867 Paint Image 0867 Peindre l'image 0868 Paint Image Transparencies 0868 Peindre les transparences de l'image 0869 Paint Radius 0869 Rayon de peinture 0870 Paint Transparency 0870 Peindre la transparence 0871 Paint and Warp Image 0871 Peindre et déformer l'image 0872 Paint current edit function gradually using the mouse 0872 Peindre progressivement la fonction de modification actuelle avec la souris 0873 Paint entire image 0873 Peindre l'image entière 0874 Paint image transparency using the mouse 0874 Peindre la transparence de l'image avec la souris 0875 Paint on Image 0875 Peindre sur l'image 0876 Paint on image using the mouse 0876 Peindre sur l'image avec la souris 0877 Paint transparency 0877 Peindre la transparence 0878 Paint within mouse 0878 Peindre autour de la souris 0879 Painting 0879 Peinture 0880 Panorama 0880 Panorama 0881 Paste 0881 Coller 0882 Paste Image 0882 Coller l'image 0883 Paste previously copied area into image 0883 Coller la zone précédemment copiée dans l'image 0884 Pattern 0884 Motif 0885 Pattern File: 0885 Fichier de motif : 0886 Pattern Width 0886 Largeur du motif 0887 Percent 0887 Pourcentage 0888 Permissions 0888 Autorisations 0889 Perspective 0889 Perspective 0890 Photo Date/Time 0890 Date/heure de la photo 0891 Photo Date/Time (metadata) 0891 Date/heure de la photo (métadonnées) 0892 Photo Date: %s File Date: %s \n 0892 Date de la photo : %s Date du fichier : %s \n 0893 Pixel count 0893 Nombre de pixels 0894 Pixel difference 0894 Différence de pixels 0895 Pixels 0895 Pixels 0896 Places/Dates 0896 Lieux/Dates 0897 Plugin working ... 0897 Plugin en cours d'exécution ... 0898 Popup Image 0898 Image en fenêtre popup 0899 Power 0899 Puissance 0900 Power Center 0900 Centre de puissance 0901 Power: Center 0901 Puissance : Centre 0902 Pre-align Images 0902 Pré-aligner les images 0903 Preference: 0903 Préférence : 0904 Press F1 for help 0904 Appuyer sur F1 pour l'aide 0905 Prev 0905 Préc 0906 Prev/Next 0906 Préc/Suiv 0907 Previous 0907 Précédent 0908 Previous gallery 0908 Galerie précédente 0909 Print Calibrated 0909 Impression calibrée 0910 Print Image 0910 Imprimer l'image 0911 Print chart in vertical orientation without margins. 0911 Imprimer la charte en orientation verticale sans marges. 0912 Print current image file with calibrated colors 0912 Imprimer le fichier image actuel avec des couleurs calibrées 0913 Print the current image file 0913 Imprimer le fichier image actuel 0914 Privacy 0914 Confidentialité 0915 Proceed 0915 Continuer 0916 Proceed? 0916 Continuer ? 0917 Process album files matching selected files: 0917 Traiter les fichiers d'album correspondant aux fichiers sélectionnés : 0918 Process an image using a custom convolution kernel 0918 Traiter une image avec un noyau de convolution personnalisé 0919 Process selected album files: 0919 Traiter les fichiers d'album sélectionnés : 0920 Processing files 0920 Traitement des fichiers en cours 0921 Project name 0921 Nom du projet 0922 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0922 Tirer une position de l'image avec la souris. \nEffectuer plusieurs tirages à la souris jusqu'à satisfaction. \nUne fois terminé, appuyer sur [OK]. 0923 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0923 Tirer sur un coin de l'image avec la souris. \nEffectuer plusieurs tirages à la souris jusqu'à satisfaction. \nUne fois terminé, appuyer sur [OK]. 0924 Pull on the image with the mouse. 0924 Tirer sur l'image avec la souris. 0925 Purge unwanted keywords from all image files 0925 Purger les mots-clés indésirables de tous les fichiers image 0926 QUESTIONS, SUGGESTIONS 0926 QUESTIONS, SUGGESTIONS 0927 Quit 0927 Quitter 0928 Quit Fotocx 0928 Quitter Fotocx 0929 Quit Fotocx? 0929 Quitter Fotocx ? 0930 RAW Files 0930 Fichiers RAW 0931 RAW Options 0931 Options RAW 0932 RAW conversion failed: %s %s 0932 Échec de la conversion RAW : %s %s 0933 RAW loader 0933 Chargeur RAW 0934 RECENT FILES 0934 FICHIERS RÉCENTS 0935 RECENT FOLDERS 0935 DOSSIERS RÉCENTS 0936 RED EYES 0936 YEUX ROUGES 0937 REFINE MENU 0937 MENU CORRECTION 0938 REMOVE DUST 0938 SUPPRIMER LA POUSSIÈRE 0939 REMOVE HALO 0939 SUPPRIMER LE HALO 0940 RENAME 0940 RENOMMER 0941 RENAME ALBUM 0941 RENOMMER L'ALBUM 0942 REPAIR MENU 0942 MENU RÉPARATION 0943 RESCALE 0943 REDIMENSIONNER 0944 RETOUCH 0944 RETOUCHER 0945 RGB -> BRG 0945 RVB -> BRV 0946 RGB -> GBR 0946 RVB -> VBR 0947 RGB HISTOGRAM 0947 HISTOGRAMME RVB 0948 RGB Histogram 0948 Histogramme RVB 0949 RGB brightness histogram graph 0949 Graphique de l'histogramme de luminosité RVB 0950 RGB color 0950 Couleur RVB 0951 RGB mix with given bit-depth 0951 Mélange RVB avec profondeur de bits donnée 0952 ROTATE 0952 PIVOTER 0953 RUN SCRIPT 0953 EXÉCUTER LE SCRIPT 0954 Radial Blur 0954 Flou radial 0955 Radial Blur - mix pixels in radial lines from chosen center 0955 Flou radial - mélange les pixels en lignes radiales depuis un centre choisi 0956 Radius 0956 Rayon 0957 Random Image 0957 Image aléatoire 0958 Range 0958 Plage 0959 Rating: %s Size: %s %.2fmb \n 0959 Évaluation : %s Taille : %s %.2fmb \n 0960 Read or search the user guide 0960 Lire ou rechercher dans le guide utilisateur 0961 Recent Files 0961 Fichiers récents 0962 Recent Folders 0962 Dossiers récents 0963 Recent Keywords 0963 Mots-clés récents 0964 Rectify closeup face photo (balloon face) 0964 Rectifier une photo de visage en gros plan (effet ballon) 0965 Red 0965 Rouge 0966 Red Eye Reduction 0966 Réduction des yeux rouges 0967 Red Eyes 0967 Yeux rouges 0968 Red Factors 0968 Facteurs de rouge 0969 Redo 0969 Rétablir 0970 Reduce Fog/Haze 0970 Réduire la brume/le voile 0971 Reduce fog/haze in an image or selected areas 0971 Réduire la brume/le voile dans une image ou des zones sélectionnées 0972 Refine 0972 Corriger 0973 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0973 Corriger : aplatir l'histogramme, contraste local, amplifier le contraste, retinex, saturation 0974 Remove 0974 Supprimer 0975 Remove Dust 0975 Supprimer la poussière 0976 Remove Halo 0976 Supprimer le halo 0977 Remove dust spots from old scanned photos 0977 Supprimer les taches de poussière des anciennes photos numérisées 0978 Remove from Album 0978 Retirer de l'album 0979 Remove halos left by some edit functions 0979 Supprimer les halos laissés par certaines fonctions de modification 0980 Remove image curvature, especially in panoramas 0980 Supprimer la courbure de l'image, notamment dans les panoramas 0981 Remove jaggies on hard image feature edges 0981 Supprimer les crénelages sur les bords nets de l'image 0982 Remove selected image metadata 0982 Supprimer les métadonnées sélectionnées de l'image 0983 Remove unwanted objects in an image 0983 Supprimer les objets indésirables d'une image 0984 Rename 0984 Renommer 0985 Rename Album 0985 Renommer l'album 0986 Rename Image File 0986 Renommer le fichier image 0987 Rename an existing album 0987 Renommer un album existant 0988 Rename or delete keywords for all image files 0988 Renommer ou supprimer des mots-clés pour tous les fichiers image 0989 Rename to 0989 Renommer en 0990 Rename/convert/rescale/move selected image or RAW files 0990 Renommer/convertir/redimensionner/déplacer les fichiers image ou RAW sélectionnés 0991 Repair 0991 Réparer 0992 Repair malformed metadata preventing metadata edits 0992 Réparer des métadonnées mal formées empêchant leur modification 0993 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 0993 Réparer : netteté, flou, réduction du bruit, anti-brume, yeux rouges, effacement intelligent, ajustement des couleurs 0994 Replace 0994 Remplacer 0995 Replace Text 0995 Remplacer le texte 0996 Replace all versions with newest version 0996 Remplacer toutes les versions par la plus récente 0997 Replace all versions with selected versions 0997 Remplacer toutes les versions par les versions sélectionnées 0998 Replace all with newest version only 0998 Remplacer tout par la version la plus récente uniquement 0999 Replace all with original + newest version 0999 Remplacer tout par l'original + la version la plus récente 1000 Replace all with original + selected versions 1000 Remplacer tout par l'original + les versions sélectionnées 1001 Replace all with original and all versions 1001 Remplacer tout par l'original et toutes les versions 1002 Replace all with selected versions 1002 Remplacer tout par les versions sélectionnées 1003 Replace host files 1003 Remplacer les fichiers hôtes 1004 Report Image Places/Dates 1004 Rapport des lieux/dates des images 1005 Report selected metadata for selected image files 1005 Rapporter les métadonnées sélectionnées des fichiers image sélectionnés 1006 Rescale 1006 Redimensionner 1007 Rescale Image 1007 Redimensionner l'image 1008 Rescale RGB levels to reduce color caste and fog/haze 1008 Redimensionner les niveaux RVB pour réduire la dominante de couleur et la brume 1009 Rescale brightness levels to increase local contrast 1009 Redimensionner les niveaux de luminosité pour augmenter le contraste local 1010 Rescale: 1010 Redimensionner : 1011 Reserved Shortcuts \n 1011 Raccourcis réservés \n 1012 Reserved shortcut ignored: %s 1012 Raccourci réservé ignoré : %s 1013 Reset 1013 Réinitialiser 1014 Reset all galleries to file name ascending 1014 Réinitialiser toutes les galeries par nom de fichier croissant 1015 Resolution 1015 Résolution 1016 Resources 1016 Ressources 1017 Resume 1017 Reprendre 1018 Retouch 1018 Retoucher 1019 Reverse R 1019 Inverser R 1020 Richardson-Lucy 1020 Richardson-Lucy 1021 Right 1021 Droite 1022 Rim % 1022 Contour % 1023 Rotate 1023 Pivoter 1024 Rotate Image 1024 Pivoter l'image 1025 Rotate or level an image 1025 Pivoter ou mettre à niveau une image 1026 Rotate: 1026 Pivoter : 1027 Roy Lichtenstein effect 1027 Effet Roy Lichtenstein 1028 SATURATION 1028 SATURATION 1029 SCRIPT FILES 1029 FICHIERS DE SCRIPT 1030 SEARCH IMAGES 1030 RECHERCHER DES IMAGES 1031 SELECT AREA 1031 SÉLECTIONNER UNE ZONE 1032 SELECT FILES 1032 SÉLECTIONNER DES FICHIERS 1033 SELECT IMAGE FILES 1033 SÉLECTIONNER DES FICHIERS IMAGE 1034 SELECT MENU 1034 MENU SÉLECTION 1035 SET COLORS 1035 DÉFINIR LES COULEURS 1036 SET WALLPAPER 1036 DÉFINIR LE FOND D'ÉCRAN 1037 SETTINGS 1037 PARAMÈTRES 1038 SHARPEN 1038 NETTETÉ 1039 SHIFT COLORS 1039 DÉCALER LES COULEURS 1040 SHORTCUTS 1040 RACCOURCIS 1041 SHOW CIM FILES 1041 AFFICHER LES FICHIERS CIM 1042 SHOW DIFFS 1042 AFFICHER LES DIFFÉRENCES 1043 SHOW ON MAP 1043 AFFICHER SUR LA CARTE 1044 SHOW RESOURCES 1044 AFFICHER LES RESSOURCES 1045 SHOW RGB 1045 AFFICHER RVB 1046 SHOW/HIDE AREA 1046 AFFICHER/MASQUER LA ZONE 1047 SKETCH1 1047 CROQUIS1 1048 SKETCH2 1048 CROQUIS2 1049 SLIDE SHOW 1049 DIAPORAMA 1050 SLIDES AND NEGATIVES 1050 DIAPOSITIVES ET NÉGATIFS 1051 SLIDESHOW END 1051 FIN DU DIAPORAMA 1052 SMART ERASE 1052 EFFACEMENT INTELLIGENT 1053 SOFT FOCUS 1053 FLOU ARTISTIQUE 1054 SPHERE 1054 SPHÈRE 1055 SPLIT-SCREEN 1055 ÉCRAN PARTAGÉ 1056 STACK/LAYERS 1056 EMPILEMENT/CALQUES 1057 STACK/NOISE 1057 EMPILEMENT/BRUIT 1058 STACK/PAINT 1058 EMPILEMENT/PEINTURE 1059 Saturation 1059 Saturation 1060 Save 1060 Enregistrer 1061 Save Gallery as Album 1061 Enregistrer la galerie comme album 1062 Save Image File 1062 Enregistrer le fichier image 1063 Save as new file name or type 1063 Enregistrer sous un nouveau nom ou type de fichier 1064 Save current gallery as album 1064 Enregistrer la galerie actuelle comme album 1065 Save modified image as new file or new file version 1065 Enregistrer l'image modifiée comme nouveau fichier ou nouvelle version 1066 Save selected area to a file with transparency 1066 Enregistrer la zone sélectionnée dans un fichier avec transparence 1067 Saved Areas 1067 Zones enregistrées 1068 Scale 1068 Échelle 1069 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1069 Numériser la charte de couleurs imprimée, rangée la plus sombre en haut. \nEnregistrer en fichier .png avec les noms d'imprimante et de papier \n(ex. %s/Epson_glossy.png). \n 1070 Search 1070 Rechercher 1071 Search Images 1071 Rechercher des images 1072 Search Results 1072 Résultats de recherche 1073 Search all image files and report duplicates 1073 Rechercher tous les fichiers image et signaler les doublons 1074 Searching - use ESC key to terminate 1074 Recherche en cours - utiliser la touche Échap pour arrêter 1075 Seconds 1075 Secondes 1076 Select 1076 Sélectionner 1077 Select %d to %d files 1077 Sélectionner de %d à %d fichiers 1078 Select Album 1078 Sélectionner un album 1079 Select Albums 1079 Sélectionner des albums 1080 Select Area 1080 Sélectionner une zone 1081 Select Area for Edits 1081 Sélectionner une zone pour les modifications 1082 Select Area not supported \nby this edit function 1082 Sélection de zone non prise en charge \npar cette fonction de modification 1083 Select Files 1083 Sélectionner des fichiers 1084 Select Image 1084 Sélectionner une image 1085 Select Image Files 1085 Sélectionner des fichiers image 1086 Select Metadata tags 1086 Sélectionner les balises de métadonnées 1087 Select Script 1087 Sélectionner un script 1088 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1088 Sélectionner une zone à déformer avec la fonction de sélection de zone. \nAppuyer sur [démarrer la déformation] et tirer la zone avec la souris. \nEffectuer plusieurs tirages à la souris jusqu'à satisfaction. \nUne fois terminé, sélectionner une autre zone ou appuyer sur [OK]. 1089 Select and Paint Image 1089 Sélectionner et peindre l'image 1090 Select and view an image file 1090 Sélectionner et afficher un fichier image 1091 Select area cannot be kept.\nContinue? 1091 La zone sélectionnée ne peut pas être conservée.\nContinuer ? 1092 Select area disabled, Continue? 1092 Zone sélectionnée désactivée, continuer ? 1093 Select area not finished, Continue? 1093 Sélection de zone non terminée, continuer ? 1094 Select area will be ignored. \nContinue? 1094 La zone sélectionnée sera ignorée. \nContinuer ? 1095 Select folder 1095 Sélectionner un dossier 1096 Select host image files 1096 Sélectionner les fichiers image hôtes 1097 Select image areas to edit separately, copy/paste selections 1097 Sélectionner des zones d'image à modifier séparément, copier/coller des sélections 1098 Select image objects or areas for separate editing 1098 Sélectionner des objets ou zones d'image pour une édition séparée 1099 Select input files for subsequent function 1099 Sélectionner les fichiers d'entrée pour la fonction suivante 1100 Select overlay file 1100 Sélectionner le fichier de superposition 1101 Select startup album 1101 Sélectionner l'album de démarrage 1102 Select startup folder 1102 Sélectionner le dossier de démarrage 1103 Select startup image file 1103 Sélectionner le fichier image de démarrage 1104 Select the image file to print. 1104 Sélectionner le fichier image à imprimer. 1105 Select to add, click on X to delete. 1105 Sélectionner pour ajouter, cliquer sur X pour supprimer. 1106 Select two files 1106 Sélectionner deux fichiers 1107 Select versions, ratings, keywords, filename text 1107 Sélectionner versions, évaluations, mots-clés, texte du nom de fichier 1108 Separation Horz 1108 Séparation horizontale 1109 Sequence Numbers 1109 Numéros de séquence 1110 Set Colors 1110 Définir les couleurs 1111 Set No. of Colors 1111 Définir le nombre de couleurs 1112 Set Ratio: 1112 Définir le ratio : 1113 Set Wallpaper 1113 Définir le fond d'écran 1114 Set Width: 1114 Définir la largeur : 1115 Set and view bookmarks, select for gallery view 1115 Définir et afficher les signets, sélectionner pour la vue galerie 1116 Set black-white/color, negative/positive, sepia 1116 Définir noir-blanc/couleur, négatif/positif, sépia 1117 Set foreground line color (crop, grid, select, warp) 1117 Définir la couleur de ligne du premier plan (recadrage, grille, sélection, déformation) 1118 Set gallery from latest search results 1118 Définir la galerie à partir des derniers résultats de recherche 1119 Set gallery from recent folders list 1119 Définir la galerie à partir de la liste des dossiers récents 1120 Set gallery to folder of current file 1120 Définir la galerie sur le dossier du fichier actuel 1121 Set horizontal/vertical grid line counts 1121 Définir le nombre de lignes de grille horizontales/verticales 1122 Set image file as desktop wallpaper 1122 Définir le fichier image comme fond d'écran du bureau 1123 Set line properties, [Add] to layout, edit. 1123 Définir les propriétés de la ligne, [Ajouter] à la mise en page, modifier. 1124 Set number of colors for each R/G/B or total 1124 Définir le nombre de couleurs pour chaque canal R/V/B ou au total 1125 Set or shift photo date/time for selected image files 1125 Définir ou décaler la date/heure de la photo pour les fichiers image sélectionnés 1126 Set the name for the output calibration file \n[your calibration name].dat 1126 Définir le nom du fichier de calibration de sortie \n[votre nom de calibration].dat 1127 Settings 1127 Paramètres 1128 Sharpen 1128 Netteté 1129 Sharpen the image (various methods) 1129 Rendre l'image plus nette (différentes méthodes) 1130 Shift + drag mouse across image \nto indicate blur direction 1130 Maj + glisser la souris sur l'image \npour indiquer la direction du flou 1131 Shift Colors 1131 Décaler les couleurs 1132 Shift/convert image colors into other colors 1132 Décaler/convertir les couleurs de l'image en d'autres couleurs 1133 Short List 1133 Liste courte 1134 Show 1134 Afficher 1135 Show (outline) selected areas 1135 Afficher (contour) les zones sélectionnées 1136 Show CIM Files 1136 Afficher les fichiers CIM 1137 Show Diffs 1137 Afficher les différences 1138 Show Fotocx installed version and author contact 1138 Afficher la version installée de Fotocx et le contact de l'auteur 1139 Show Fotocx updates for recent releases 1139 Afficher les mises à jour de Fotocx pour les versions récentes 1140 Show Hidden 1140 Afficher les fichiers masqués 1141 Show Log File 1141 Afficher le fichier journal 1142 Show RGB 1142 Afficher RVB 1143 Show RGB levels at mouse position 1143 Afficher les niveaux RVB à la position de la souris 1144 Show Resources 1144 Afficher les ressources 1145 Show folder hierarchy, click folder for gallery view 1145 Afficher la hiérarchie des dossiers, cliquer sur un dossier pour la vue galerie 1146 Show image counts in year/month table, select, report 1146 Afficher le nombre d'images dans un tableau année/mois, sélectionner, rapporter 1147 Show image description (overlap) 1147 Afficher la description de l'image (superposée) 1148 Show image differences on the image 1148 Afficher les différences d'image sur l'image 1149 Show image file name (overlap) 1149 Afficher le nom du fichier image (superposé) 1150 Show image title (overlap) 1150 Afficher le titre de l'image (superposé) 1151 Show input files used in combine function 1151 Afficher les fichiers d'entrée utilisés dans la fonction combiner 1152 Show key metadata for current image or clicked thumbnail 1152 Afficher les métadonnées clés de l'image actuelle ou de la vignette cliquée 1153 Show map position of the current image file 1153 Afficher la position sur la carte du fichier image actuel 1154 Show memory and CPU resources used 1154 Afficher la mémoire et les ressources CPU utilisées 1155 Show on Map 1155 Afficher sur la carte 1156 Show or make Keyboard Shortcuts 1156 Afficher ou créer les raccourcis clavier 1157 Show the current (last used) album 1157 Afficher l'album actuel (le plus récemment utilisé) 1158 Show the current log file 1158 Afficher le fichier journal actuel 1159 Size 1159 Taille 1160 Sketch1 1160 Croquis1 1161 Sketch2 1161 Croquis2 1162 Slide Show 1162 Diaporama 1163 Smart Erase 1163 Effacement intelligent 1164 Soft Focus 1164 Flou artistique 1165 Sphere 1165 Sphère 1166 Spherical Projection 1166 Projection sphérique 1167 Split-Screen 1167 Écran partagé 1168 Stack/Layers 1168 Empilement/Calques 1169 Stack/Noise 1169 Empilement/Bruit 1170 Stack/Paint 1170 Empilement/Peinture 1171 Stacking Order 1171 Ordre d'empilement 1172 Start 1172 Démarrer 1173 Start a slide show 1173 Démarrer un diaporama 1174 Start of gallery 1174 Début de la galerie 1175 Startup View 1175 Vue de démarrage 1176 Stop 1176 Arrêter 1177 Stretch 1177 Étirer 1178 Stretch: 1178 Étirer : 1179 Suppress JPEG compression artifacts 1179 Supprimer les artefacts de compression JPEG 1180 Suppress Ringing 1180 Supprimer les effets de bord (ringing) 1181 Suppress fine details while retaining sharpness 1181 Supprimer les détails fins tout en conservant la netteté 1182 Suppress noise from low-light photos 1182 Supprimer le bruit des photos en faible luminosité 1183 Survey all files 1183 Examiner tous les fichiers 1184 TEXTURE 1184 TEXTURE 1185 THUMB VIEW 1185 VUE VIGNETTES 1186 TILES1 1186 TUILES1 1187 TILES2 1187 TUILES2 1188 TIMELINE 1188 CHRONOLOGIE 1189 TINY PLANET 1189 TINY PLANET 1190 TOOLS MENU 1190 MENU OUTILS 1191 TRANSLATIONS 1191 TRADUCTIONS 1192 TWIST 1192 TORSION 1193 Temperature 1193 Température 1194 Text 1194 Texte 1195 Text File: 1195 Fichier texte : 1196 Texture 1196 Texture 1197 Threshold 1197 Seuil 1198 Threshold: Low 1198 Seuil : bas 1199 Thumbnail View 1199 Vue vignettes 1200 Thumbnail size 1200 Taille des vignettes 1201 Thumbnails folder 1201 Dossier des vignettes 1202 Thumbnails folder: %s \nPlease remove. 1202 Dossier des vignettes : %s \nVeuillez le supprimer. 1203 Thumbnails folder: \n %s \nmust be named .../thumbnails 1203 Dossier des vignettes : \n %s \ndoit être nommé .../thumbnails 1204 Thumbnails: 1204 Vignettes : 1205 Tile 1205 Tuile 1206 Tile blending 1206 Fondu des tuiles 1207 Tile image with a repeating pattern 1207 Paver l'image avec un motif répétitif 1208 Tiles 1208 Tuiles 1209 Tiles1 1209 Tuiles1 1210 Tiles2 1210 Tuiles2 1211 Timeline 1211 Chronologie 1212 Tiny Planet 1212 Tiny Planet 1213 Title: %s\n 1213 Titre : %s\n 1214 To Location 1214 Vers le lieu 1215 Toggle Captions 1215 Activer/désactiver les légendes 1216 Toggle Grid 1216 Activer/désactiver la grille 1217 Toggle grid lines on and off 1217 Activer/désactiver les lignes de grille 1218 Toggle image metadata display ON/OFF 1218 Activer/désactiver l'affichage des métadonnées de l'image 1219 Too little overlap, cannot align 1219 Chevauchement insuffisant, alignement impossible 1220 Too many edits, please save image 1220 Trop de modifications, veuillez enregistrer l'image 1221 Tools 1221 Outils 1222 Tools: image index, settings, shortcuts, grid, find duplicates 1222 Outils : index d'images, paramètres, raccourcis, grille, recherche de doublons 1223 Top 1223 Haut 1224 Total Colors 1224 Total des couleurs 1225 Trace 1225 Tracer 1226 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1226 Tracer les courbes supérieure et inférieure avec des \nclics de souris, puis [aplatir]. 1227 Transient Objects 1227 Objets transitoires 1228 Transition Preferences 1228 Préférences de transition 1229 Transition to next image 1229 Transition vers l'image suivante 1230 Transitions File 1230 Fichier de transitions 1231 Transp. 1231 Transp. 1232 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1232 La carte de transparence sera perdue \n(enregistrer en TIFF|PNG|JXL pour la conserver) \nEnregistrer quand même ? 1233 Trash 1233 Corbeille 1234 Trash read-only file? 1234 Mettre à la corbeille le fichier en lecture seule ? 1235 Turn an image inside-out 1235 Retourner une image comme un gant (intérieur-extérieur) 1236 Twist 1236 Torsion 1237 Twist image centered at mouse position 1237 Tordre l'image centrée sur la position de la souris 1238 UNBEND 1238 REDRESSER 1239 UNDO/REDO BUTTON 1239 BOUTON ANNULER/RÉTABLIR 1240 UNWARP CLOSEUP 1240 DÉFORMER UN GROS PLAN 1241 UPDATE ALBUMS 1241 METTRE À JOUR LES ALBUMS 1242 UPRIGHT 1242 REDRESSEMENT 1243 USER GUIDE 1243 GUIDE UTILISATEUR 1244 Unable to copy metadata 1244 Impossible de copier les métadonnées 1245 Unbend 1245 Redresser 1246 Undo 1246 Annuler 1247 Undo All 1247 Tout annuler 1248 Undo Last 1248 Annuler la dernière action 1249 Undo/Redo 1249 Annuler/Rétablir 1250 Uninstall 1250 Désinstaller 1251 Unwarp Closeup 1251 Déformer un gros plan 1252 Update Albums 1252 Mettre à jour les albums 1253 Update albums for new file versions 1253 Mettre à jour les albums pour les nouvelles versions de fichiers 1254 Upright 1254 Redressement 1255 Upright Image 1255 Redresser l'image 1256 Upright or mirror-flip an image 1256 Redresser ou retourner une image en miroir 1257 Upright rotated image files, selected set or ALL 1257 Redresser les fichiers image pivotés, ensemble sélectionné ou TOUS 1258 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1258 Utiliser Sélectionner une zone pour sélectionner un visage. \nCliquer sur le centre de la distorsion. \nDéplacer le curseur. \n 1259 Use [Select] to add files to an empty album 1259 Utiliser [Sélectionner] pour ajouter des fichiers à un album vide 1260 Use metadata photo date or file modification date? 1260 Utiliser la date de la photo des métadonnées ou la date de modification du fichier ? 1261 Use metadata tag 1261 Utiliser une balise de métadonnées 1262 Use settings file 1262 Utiliser le fichier de paramètres 1263 User Guide 1263 Guide utilisateur 1264 User preferences and settings 1264 Préférences et paramètres utilisateur 1265 VIDEO press P to play 1265 VIDEO appuyer sur P pour lire 1266 VIEW 360° PANO 1266 AFFICHER PANO 360° 1267 VIEW ALL META 1267 AFFICHER TOUTES LES MÉTADONNÉES 1268 VIEW MAIN META 1268 AFFICHER LES MÉTADONNÉES PRINCIPALES 1269 VIGNETTE 1269 VIGNETTE 1270 Var. Transparency 1270 Transparence var. 1271 Vert 1271 Vert 1272 Video Files 1272 Fichiers vidéo 1273 Video Tutorial 1273 Tutoriel vidéo 1274 Video command 1274 Commande vidéo 1275 View 360 degree panorama image 1275 Afficher une image panoramique à 360 degrés 1276 View 360° Pano 1276 Afficher Pano 360° 1277 View All Meta 1277 Afficher toutes les métadonnées 1278 View All Metadata 1278 Afficher toutes les métadonnées 1279 View Main Meta 1279 Afficher les métadonnées principales 1280 View Main Metadata 1280 Afficher les métadonnées principales 1281 View before/after images using split-screen 1281 Afficher les images avant/après avec écran partagé 1282 View/edit metadata, image report and search functions 1282 Afficher/modifier les métadonnées, rapport d'image et fonctions de recherche 1283 Vignette 1283 Vignette 1284 W/H Ratio: 1284 Ratio L/H : 1285 WARP AFFINE 1285 DÉFORMATION AFFINE 1286 WARP AREA 1286 DÉFORMATION DE ZONE 1287 WARP CURVED 1287 DÉFORMATION COURBE 1288 WARP IMAGE 1288 DÉFORMER L'IMAGE 1289 WARP MENU 1289 MENU DÉFORMATION 1290 WARP RADIAL 1290 DÉFORMATION RADIALE 1291 WINDOW VIEWS AND MENUS 1291 VUES ET MENUS DE LA FENÊTRE 1292 WORLD MAP 1292 CARTE DU MONDE 1293 Wait after zoom 1293 Attendre après le zoom 1294 Wait before filename/title/description 1294 Attendre avant nom de fichier/titre/description 1295 Wait before zoom 1295 Attendre avant le zoom 1296 Warp 1296 Déformer 1297 Warp Affine 1297 Déformation affine 1298 Warp Area 1298 Déformation de zone 1299 Warp Curved 1299 Déformation courbe 1300 Warp Image 1300 Déformer l'image 1301 Warp Linear1 1301 Déformation linéaire 1 1302 Warp Linear2 1302 Déformation linéaire 2 1303 Warp Radial 1303 Déformation radiale 1304 Warp an image with a wave pattern 1304 Déformer une image avec un motif de vagues 1305 Warp image (affine) using the mouse 1305 Déformer l'image (affine) avec la souris 1306 Warp image (curved) using the mouse 1306 Déformer l'image (courbe) avec la souris 1307 Warp image (linear 1) using the mouse 1307 Déformer l'image (linéaire 1) avec la souris 1308 Warp image (linear 2) using the mouse 1308 Déformer l'image (linéaire 2) avec la souris 1309 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1309 Déformation : redresser, corriger la perspective, déformer, déformer un gros plan, aplatir, transformations d'image 1310 White 1310 Blanc 1311 Widen: 1311 Élargir : 1312 Width 1312 Largeur 1313 Width % 1313 Largeur % 1314 X-size 1314 Taille X 1315 Yes 1315 Oui 1316 ZOOM 1316 ZOOM 1317 Zoom 1317 Zoom 1318 Zoom Center 1318 Centre du zoom 1319 Zoom Speed 1319 Vitesse du zoom 1320 Zoom-in 1320 Zoom avant 1321 Zoom-out 1321 Zoom arrière 1322 \n %d-bits/color 1322 \n %d-bits/couleur 1323 \n *** CANCELED \n 1323 \n *** ANNULÉ \n 1324 \n *** COMPLETED \n 1324 \n *** TERMINÉ \n 1325 \n *** Delete Originals *** 1325 \n *** Supprimer les originaux *** 1326 \n *** Keep Originals *** 1326 \n *** Conserver les originaux *** 1327 \n *** Replace Originals *** 1327 \n *** Remplacer les originaux *** 1328 \n Convert to %s 1328 \n Convertir en %s 1329 \n Copy Metadata 1329 \n Copier les métadonnées 1330 \n Downsize within %dx%d 1330 \n Réduire dans %dx%d 1331 \n New Location: %s 1331 \n Nouveau lieu : %s 1332 \n Output to %s 1332 \n Sortie vers %s 1333 \n PROCEED? 1333 \n CONTINUER ? 1334 \n Rename to %s 1334 \n Renommer en %s 1335 \n Replace text: %s --> %s 1335 \n Remplacer le texte : %s --> %s 1336 \n Rescale to %sx 1336 \n Redimensionner à %sx 1337 \n Update Albums 1337 \n Mettre à jour les albums 1338 \n Upsize within %dx%d 1338 \n Agrandir dans %dx%d 1339 \n*** CANCELED \n 1339 \n*** ANNULÉ \n 1340 \n*** COMPLETED \n 1340 \n*** TERMINÉ \n 1341 \n\nPROCEED? 1341 \n\nCONTINUER ? 1342 add 1342 ajouter 1343 add after old 1343 ajouter après ancien 1344 add all gallery files to list 1344 ajouter tous les fichiers de la galerie à la liste 1345 add current file to list 1345 ajouter le fichier actuel à la liste 1346 add entered text to layout 1346 ajouter le texte saisi à la mise en page 1347 add images to layout 1347 ajouter des images à la mise en page 1348 add line/arrow to layout 1348 ajouter une ligne/flèche à la mise en page 1349 add new keyword 1349 ajouter un nouveau mot-clé 1350 add or edit images 1350 ajouter ou modifier des images 1351 add or edit lines/arrows 1351 ajouter ou modifier des lignes/flèches 1352 add or edit text 1352 ajouter ou modifier du texte 1353 add to set 1353 ajouter à l'ensemble 1354 adder 1354 additionneur 1355 adjust brightness of selected image 1355 ajuster la luminosité de l'image sélectionnée 1356 after removal of missing files: %d \n 1356 après suppression des fichiers manquants : %d \n 1357 album %s: deleted 1357 album %s : supprimé 1358 album already exists: %s 1358 l'album existe déjà : %s 1359 album mass update 1359 mise à jour massive de l'album 1360 albums folder missing 1360 dossier des albums manquant 1361 align and trim color chart 1361 aligner et rogner la charte de couleurs 1362 all files 1362 tous les fichiers 1363 all image files, including unmounted folders: %d \n 1363 tous les fichiers image, y compris les dossiers non montés : %d \n 1364 all images 1364 toutes les images 1365 all versions 1365 toutes les versions 1366 amplify contrast 1366 amplifier le contraste 1367 amplitude 1367 amplitude 1368 angle 1368 angle 1369 apply 1369 appliquer 1370 area edge creep 1370 fluage du bord de zone 1371 area is not finished 1371 la zone n'est pas terminée 1372 area outline color: 1372 couleur du contour de la zone : 1373 array width is too large: %d x %d 1373 largeur du réseau trop grande : %d x %d 1374 ascending 1374 croissant 1375 auto color 1375 couleur automatique 1376 background colors for file and gallery view windows 1376 couleurs d'arrière-plan pour les fenêtres de fichiers et de galerie 1377 backing 1377 support 1378 bad category name 1378 nom de catégorie incorrect 1379 bad keyword name 1379 nom de mot-clé incorrect 1380 bad pattern file: %s 1380 fichier de motif incorrect : %s 1381 base 1381 base 1382 base and adder need $s plugin 1382 la base et l'additionneur nécessitent le plugin $s 1383 base size 1383 taille de base 1384 begin making a script file 1384 commencer à créer un fichier de script 1385 black/white 1385 noir/blanc 1386 black/white negative 1386 négatif noir/blanc 1387 black/white positive 1387 positif noir/blanc 1388 blend 1388 fondu 1389 blend edges: blend width: 1389 fondre les bords : largeur du fondu : 1390 blend image overlaps over pixel width 1390 largeur de recouvrement des images en pixels lors du fondu 1391 blend rate: center: 1391 taux de fondu : centre : 1392 blocking function: %s 1392 fonction de blocage : %s 1393 blocksize 1393 taille de bloc 1394 blur edges: blur width: 1394 flouter les bords : largeur du flou : 1395 blur radius 1395 rayon de flou 1396 borders 1396 bordures 1397 both 'All Files' and specific files were selected 1397 'Tous les fichiers' et des fichiers spécifiques ont tous deux été sélectionnés 1398 bright halo 1398 halo clair 1399 brightness rescale 1399 redimensionnement de la luminosité 1400 browse 1400 parcourir 1401 brush size 1401 taille du pinceau 1402 build index, old files only 1402 créer l'index, anciens fichiers uniquement 1403 cancel project 1403 annuler le projet 1404 cancel project? 1404 annuler le projet ? 1405 cannot allocate %d MB memory 1405 impossible d'allouer %d Mo de mémoire 1406 cannot be determined 1406 ne peut pas être déterminé 1407 cannot copy a file to itself 1407 impossible de copier un fichier sur lui-même 1408 cannot copy current file 1408 impossible de copier le fichier actuel 1409 cannot create output file 1409 impossible de créer le fichier de sortie 1410 cannot create pixbuf 1410 impossible de créer le pixbuf 1411 cannot find area outline 1411 impossible de trouver le contour de la zone 1412 cannot find output file 1412 impossible de trouver le fichier de sortie 1413 cannot load input file 1413 impossible de charger le fichier d'entrée 1414 cannot open file %s 1414 impossible d'ouvrir le fichier %s 1415 cannot parse current file 1415 impossible d'analyser le fichier actuel 1416 cannot parse file 1416 impossible d'analyser le fichier 1417 cannot read pluging output file 1417 impossible de lire le fichier de sortie du plugin 1418 cannot replace %s file 1418 impossible de remplacer le fichier %s 1419 cannot save as RAW type 1419 impossible d'enregistrer au format RAW 1420 cannot save layout file: %s 1420 impossible d'enregistrer le fichier de mise en page : %s 1421 cannot write image folders file: %s 1421 impossible d'écrire le fichier des dossiers d'images : %s 1422 category %s has too many keywords 1422 la catégorie %s a trop de mots-clés 1423 category %s is too big 1423 la catégorie %s est trop grande 1424 center 1424 centre 1425 change project scale 1425 modifier l'échelle du projet 1426 choose 1-8 clicks or [+] keys for 2x image zoom 1426 choisir 1-8 clics ou les touches [+] pour un zoom image 2x 1427 choose a better spot 1427 choisir un meilleur emplacement 1428 choose an image file 1428 choisir un fichier image 1429 choose file 1429 choisir un fichier 1430 choose files 1430 choisir des fichiers 1431 choose folder 1431 choisir un dossier 1432 choose folders 1432 choisir des dossiers 1433 choose location 1433 choisir un lieu 1434 circle 1434 cercle 1435 clear area selections 1435 effacer les sélections de zone 1436 clear entered text 1436 effacer le texte saisi 1437 clear inputs 1437 effacer les entrées 1438 clear text 1438 effacer le texte 1439 click a defined keyword (below) to add a search keyword 1439 cliquer sur un mot-clé défini (ci-dessous) pour ajouter un mot-clé de recherche 1440 click bright point 1440 cliquer sur le point clair 1441 click dark point 1441 cliquer sur le point sombre 1442 click on desired color 1442 cliquer sur la couleur souhaitée 1443 click on image to get source color 1443 cliquer sur l'image pour obtenir la couleur source 1444 click on image to set matching color 1444 cliquer sur l'image pour définir la couleur correspondante 1445 click on thumbnail to set zoom center 1445 cliquer sur la vignette pour définir le centre du zoom 1446 click position to add line 1446 cliquer à la position pour ajouter une ligne 1447 click position to add text 1447 cliquer à la position pour ajouter du texte 1448 click to select 1448 cliquer pour sélectionner 1449 click to unselect 1449 cliquer pour désélectionner 1450 clicks per 2x image increase 1450 clics par augmentation d'image 2x 1451 color 1451 couleur 1452 color depth 1452 profondeur de couleur 1453 color depth: 1453 profondeur de couleur : 1454 color match level % 1454 niveau de correspondance des couleurs % 1455 color negative 1455 négatif couleur 1456 column difference: %d pixels 1456 différence de colonnes : %d pixels 1457 column difference: %d pixels \nMake columns even? 1457 différence de colonnes : %d pixels \nÉgaliser les colonnes ? 1458 combined image files 1458 fichiers image combinés 1459 command: 1459 commande : 1460 commit all changes, close dialog 1460 valider toutes les modifications, fermer la boîte de dialogue 1461 complete file selection first 1461 terminer d'abord la sélection de fichiers 1462 completed 1462 terminé 1463 condense into color blobs 1463 condenser en taches de couleur 1464 condition 1464 condition 1465 confirm Fotocx exit 1465 confirmer la sortie de Fotocx 1466 constant blur 1466 flou constant 1467 continue? 1467 continuer ? 1468 converting colors... 1468 conversion des couleurs... 1469 converting files 1469 conversion des fichiers 1470 copy (duplicate file) 1470 copier (dupliquer le fichier) 1471 copy and paste commands 1471 commandes copier-coller 1472 copy files to %s 1472 copier les fichiers vers %s 1473 copy metadata from Nth file: 1473 copier les métadonnées à partir du Nième fichier : 1474 copy to Desktop failed: %s 1474 échec de la copie vers le bureau : %s 1475 count: 0 1475 nombre : 0 1476 create folder 1476 créer un dossier 1477 create folder %s 1477 créer le dossier %s 1478 current gallery 1478 galerie actuelle 1479 current image files found: %d \n 1479 fichiers image actuels trouvés : %d \n 1480 current set only 1480 ensemble actuel uniquement 1481 current set: 1481 ensemble actuel : 1482 curve file is invalid 1482 le fichier de courbe est invalide 1483 custom command to play video files 1483 commande personnalisée pour lire les fichiers vidéo 1484 dark 1484 sombre 1485 dark halo 1485 halo sombre 1486 dark pixels 1486 pixels sombres 1487 data is incomplete, proceed? 1487 les données sont incomplètes, continuer ? 1488 date format is yyyy:mm:dd [hh:mm:ss] 1488 le format de date est aaaa:mm:jj [hh:mm:ss] 1489 date range 1489 plage de dates 1490 days 1490 jours 1491 delete 1491 supprimer 1492 delete %s \n%s 1492 supprimer %s \n%s 1493 delete Mashup project files? 1493 supprimer les fichiers du projet Mashup ? 1494 delete failed: \n%s 1494 échec de la suppression : \n%s 1495 delete originals specified but no new name given 1495 suppression des originaux spécifiée mais aucun nouveau nom fourni 1496 delete selected text from layout 1496 supprimer le texte sélectionné de la mise en page 1497 deleting orphan thumbnails ... \n 1497 suppression des vignettes orphelines ... \n 1498 depth 1498 profondeur 1499 descending 1499 décroissant 1500 direction of light and shadows 1500 direction de la lumière et des ombres 1501 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1501 désactiver la sélection de vignettes pour activer les menus contextuels, etc. \nutiliser [Activer] pour reprendre la sélection de vignettes 1502 discard changes? 1502 abandonner les modifications ? 1503 do not warp images during auto-alignment 1503 ne pas déformer les images pendant l'alignement automatique 1504 do nothing 1504 ne rien faire 1505 dot size 1505 taille du point 1506 downsize 1506 réduire 1507 drag image 1507 faire glisser l'image 1508 drag mouse along an edge to follow the edge 1508 faire glisser la souris le long d'un bord pour suivre le bord 1509 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1509 faire glisser la souris vers le bas/la droite pour dessiner un ovale \nmaj + glisser le centre pour déplacer l'ovale \nmaj + glisser le bord inférieur droit pour le modifier 1510 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1510 faire glisser la souris pour dessiner un rectangle \nmaj + glisser le centre pour déplacer le rectangle \nmaj + glisser le bord pour déplacer le bord 1511 drag mouse to outline an area 1511 faire glisser la souris pour délimiter une zone 1512 drag mouse to select circular or elliptical area 1512 faire glisser la souris pour sélectionner une zone circulaire ou elliptique 1513 drag mouse to select rectangular area 1513 faire glisser la souris pour sélectionner une zone rectangulaire 1514 drag mouse to show selected image 1514 faire glisser la souris pour afficher l'image sélectionnée 1515 duplicate keyword 1515 mot-clé en double 1516 edge distance calculation 1516 calcul de la distance au bord 1517 edge: 1517 bord : 1518 edit 1518 modifier 1519 edit commands 1519 modifier les commandes 1520 edit custom shell commands, match colors to embedded jpeg image 1520 modifier les commandes shell personnalisées, faire correspondre les couleurs à l'image jpeg intégrée 1521 edit this menu 1521 modifier ce menu 1522 ellipse 1522 ellipse 1523 embedded numbers will sort by value 1523 les nombres intégrés seront triés par valeur 1524 emboss 1524 relief 1525 enter 2-character language code: en, de, fr ... 1525 entrer le code de langue à 2 caractères : en, de, fr ... 1526 enter a project name 1526 entrer un nom de projet 1527 enter an album name 1527 entrer un nom d'album 1528 enter cities/locations, countries 1528 entrer villes/lieux, pays 1529 enter project name 1529 entrer le nom du projet 1530 enter tag name 1530 entrer le nom de la balise 1531 enter tag names 1531 entrer les noms de balises 1532 erase 1532 effacer 1533 error compensation 1533 compensation d'erreur 1534 exceed %d edits 1534 dépassement de %d modifications 1535 exceed %d images 1535 dépassement de %d images 1536 exceed %d max files, cannot continue 1536 dépassement de %d fichiers maximum, impossible de continuer 1537 exceed %d rows 1537 dépassement de %d lignes 1538 exceed %d selected files 1538 dépassement de %d fichiers sélectionnés 1539 exceed %d shortcuts 1539 dépassement de %d raccourcis 1540 exceeded %d line entries 1540 dépassement de %d entrées de ligne 1541 exceeded %d text entries 1541 dépassement de %d entrées de texte 1542 exceeded max. images: %d 1542 dépassement du maximum d'images : %d 1543 exceeded max. tiles: %d 1543 dépassement du maximum de tuiles : %d 1544 exit split-screen 1544 quitter l'écran partagé 1545 expand to these limits if smaller 1545 étendre à ces limites si plus petit 1546 exporting files 1546 exportation des fichiers 1547 extra indexed metadata tags > %d 1547 balises de métadonnées indexées supplémentaires > %d 1548 extra metadata tags to include in index 1548 balises de métadonnées supplémentaires à inclure dans l'index 1549 extra metadata tags: \n 1549 balises de métadonnées supplémentaires : \n 1550 fetch 1550 récupérer 1551 file 1551 fichier 1552 file .ext names to recognize RAW files 1552 extensions de fichier .ext pour reconnaître les fichiers RAW 1553 file .ext names to recognize video files 1553 extensions de fichier .ext pour reconnaître les fichiers vidéo 1554 file close error 1554 erreur de fermeture de fichier 1555 file color 1555 couleur du fichier 1556 file error: %s 1556 erreur de fichier : %s 1557 file format error 1557 erreur de format de fichier 1558 file format error: %s 1558 erreur de format de fichier : %s 1559 file included: %s \n 1559 fichier inclus : %s \n 1560 file metadata update failed 1560 échec de la mise à jour des métadonnées du fichier 1561 file name 1561 nom de fichier 1562 file names 1562 noms de fichiers 1563 file not found 1563 fichier introuvable 1564 file not found \n 1564 fichier introuvable \n 1565 file not found: %s 1565 fichier introuvable : %s 1566 file not found: %s %s 1566 fichier introuvable : %s %s 1567 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1567 types de fichiers : .jp2 .heic .avif .webp \ndeviendront : .jpg - CONTINUER ? 1568 file: %s \nexceed 99 versions 1568 fichier : %s \ndépasse 99 versions 1569 filename text 1569 texte du nom de fichier 1570 files in %s can be deleted 1570 les fichiers dans %s peuvent être supprimés 1571 fill from current gallery 1571 remplir à partir de la galerie actuelle 1572 fill from selected files 1572 remplir à partir des fichiers sélectionnés 1573 fill selected areas 1573 remplir les zones sélectionnées 1574 fill transparent areas 1574 remplir les zones transparentes 1575 find all image files ...\n 1575 recherche de tous les fichiers image ...\n 1576 find and report all unreadable image files 1576 trouver et signaler tous les fichiers image illisibles 1577 find outline gap 1577 trouver un espace dans le contour 1578 find via table lookup 1578 trouver par recherche dans une table 1579 find_imagefiles() failure \n 1579 échec de find_imagefiles() \n 1580 find_imagefiles() failure: %s \n 1580 échec de find_imagefiles() : %s \n 1581 finish current edit first 1581 terminer d'abord la modification en cours 1582 finish making a script file 1582 terminer la création d'un fichier de script 1583 finish or cancel pending edit 1583 terminer ou annuler la modification en attente 1584 fix box in layout and start new box 1584 corriger le rectangle dans la mise en page et en commencer un nouveau 1585 fix line in layout and start new line 1585 corriger la ligne dans la mise en page et en commencer une nouvelle 1586 fix motion blur 1586 corriger le flou de mouvement 1587 fix oval in layout and start new oval 1587 corriger l'ovale dans la mise en page et en commencer un nouveau 1588 follow edge 1588 suivre le bord 1589 font name and size for menus and dilogs 1589 nom et taille de police pour les menus et boîtes de dialogue 1590 force a full re-index of all image files 1590 forcer une réindexation complète de tous les fichiers image 1591 format: yyyy:mm:dd [hh:mm:ss] 1591 format : aaaa:mm:jj [hh:mm:ss] 1592 fotocx will exit 1592 fotocx va se fermer 1593 found %d pixels 1593 %d pixels trouvés 1594 free disk space: %d GB \n 1594 espace disque libre : %d Go \n 1595 freehand draw 1595 dessin à main levée 1596 ftruncate() failure: %s 1596 échec de ftruncate() : %s 1597 full image index: reports will be complete \n 1597 index d'image complet : les rapports seront complets \n 1598 function canceled 1598 fonction annulée 1599 gallery 1599 galerie 1600 gallery is empty 1600 la galerie est vide 1601 gallery truncated to %d images 1601 galerie tronquée à %d images 1602 get images having text in filename (comma separated) 1602 obtenir les images ayant du texte dans le nom de fichier (séparés par des virgules) 1603 get images with matching keywords (comma separated) 1603 obtenir les images avec des mots-clés correspondants (séparés par des virgules) 1604 get images within rating range 1604 obtenir les images dans la plage d'évaluation 1605 gradual paint 1605 peinture progressive 1606 grid counts not 0-100: %s 1606 nombres de grille hors 0-100 : %s 1607 grid picklist file error: %s 1607 erreur du fichier de liste de la grille : %s 1608 grid size 1608 taille de la grille 1609 group 1609 groupe 1610 height 1610 hauteur 1611 hide area outlines 1611 masquer les contours de zone 1612 hide transient objects 1612 masquer les objets transitoires 1613 high 1613 élevé 1614 home folder was not changed 1614 le dossier d'accueil n'a pas été modifié 1615 horizontal 1615 horizontal 1616 hours 1616 heures 1617 icons only, text only, or both 1617 icônes seulement, texte seulement, ou les deux 1618 if image < window, center or shift left or right 1618 si image < fenêtre, centrer ou décaler à gauche ou à droite 1619 ignore differences above limit 1619 ignorer les différences au-dessus de la limite 1620 image blend 1620 fondu d'image 1621 image files 1621 fichiers image 1622 image for source color 1622 image pour la couleur source 1623 image index records found: %d \n 1623 enregistrements d'index d'image trouvés : %d \n 1624 image index required 1624 index d'image requis 1625 image index write error: %s 1625 erreur d'écriture de l'index d'image : %s 1626 image is too large to edit: %d x %d 1626 image trop grande à modifier : %d x %d 1627 image is too large: %dx%d, %lld megapix 1627 image trop grande : %dx%d, %lld mégapixels 1628 image is too small to edit: %d x %d 1628 image trop petite à modifier : %d x %d 1629 image scale 1629 échelle de l'image 1630 image to set matching color 1630 image pour définir la couleur correspondante 1631 image width must be greater than height 1631 la largeur de l'image doit être supérieure à la hauteur 1632 images to report 1632 images à rapporter 1633 include all files 1633 inclure tous les fichiers 1634 include edited versions 1634 inclure les versions modifiées 1635 include last versions only 1635 inclure seulement les dernières versions 1636 include original files 1636 inclure les fichiers originaux 1637 include transparent areas 1637 inclure les zones transparentes 1638 include: 1638 inclure : 1639 increase blur with distance 1639 augmenter le flou avec la distance 1640 index completed, %.1f seconds \n 1640 index terminé, %.1f secondes \n 1641 index config file error: %s 1641 erreur du fichier de configuration d'index : %s 1642 index updates needed: %d thumbnails: %d \n 1642 mises à jour d'index nécessaires : %d vignettes : %d \n 1643 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1643 mises à jour d'index : %d mises à jour titre/desc : %d \nmises à jour de vignettes : %d, suppressions : %d \n 1644 input 1644 entrée 1645 input file: %s \n 1645 fichier d'entrée : %s \n 1646 insufficient memory, cannot proceed 1646 mémoire insuffisante, impossible de continuer 1647 insufficient overlap for color matching 1647 chevauchement insuffisant pour la correspondance des couleurs 1648 invalid GPS data 1648 données GPS invalides 1649 invalid GPS data: %s 1649 données GPS invalides : %s 1650 invalid album 1650 album invalide 1651 invalid date range: %s %s 1651 plage de dates invalide : %s %s 1652 invalid date/time format 1652 format de date/heure invalide 1653 invalid file 1653 fichier invalide 1654 invalid plugin: %s 1654 plugin invalide : %s 1655 invalid rating range 1655 plage d'évaluation invalide 1656 invalid source file: %s 1656 fichier source invalide : %s 1657 invert area 1657 inverser la zone 1658 jpeg quality level - 70+ for good image quality 1658 niveau de qualité jpeg - 70+ pour une bonne qualité d'image 1659 keyboard 1659 clavier 1660 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1660 commandes clavier : \nÉchap : quitter le diaporama en cours \ntouches fléchées : image précédente/suivante \nB : écran noir / rétablir l'écran \nN : transition vers l'image suivante \nP : pause / reprendre \nX : agrandir à la position de la souris 1661 keyword names 1661 noms de mots-clés 1662 keywords to add 1662 mots-clés à ajouter 1663 keywords to remove 1663 mots-clés à supprimer 1664 keywords_defined file error: %s 1664 erreur du fichier keywords_defined : %s 1665 last search 1665 dernière recherche 1666 last version 1666 dernière version 1667 last versions 1667 dernières versions 1668 layout exceeds 4 gigabytes 1668 la mise en page dépasse 4 gigaoctets 1669 layout file missing: %s 1669 fichier de mise en page manquant : %s 1670 left 1670 gauche 1671 left click on image for selected color 1671 clic gauche sur l'image pour la couleur sélectionnée 1672 left click: set image source location \nright click: set corresponding destination 1672 clic gauche : définir le lieu source de l'image \nclic droit : définir la destination correspondante 1673 left drag: add transparency \nright drag: add opacity 1673 glisser gauche : ajouter de la transparence \nglisser droit : ajouter de l'opacité 1674 left drag: copy image to mouse position \nright drag: restore original image 1674 glisser gauche : copier l'image à la position de la souris \nglisser droit : restaurer l'image originale 1675 left drag: reduce halo, right drag: undo 1675 glisser gauche : réduire le halo, glisser droit : annuler 1676 lens mm 1676 objectif mm 1677 level based on EXIF roll angle 1677 mettre à niveau selon l'angle de roulis EXIF 1678 light 1678 clair 1679 light pixels 1679 pixels clairs 1680 line 1680 ligne 1681 line color 1681 couleur de ligne 1682 line width 1682 largeur de ligne 1683 load 1683 charger 1684 load text data from a file 1684 charger les données texte depuis un fichier 1685 load widgets failed: %s 1685 échec du chargement des widgets : %s 1686 loading palette ... 1686 chargement de la palette ... 1687 location is not a folder 1687 le lieu n'est pas un dossier 1688 locations 1688 lieux 1689 lock width/height ratio 1689 verrouiller le ratio largeur/hauteur 1690 log file is in a terminal 1690 le fichier journal est dans un terminal 1691 low 1691 faible 1692 low contrast 1692 faible contraste 1693 lower 1693 inférieur 1694 make an initially empty album 1694 créer un album initialement vide 1695 make new version 1695 créer une nouvelle version 1696 manual align 1696 alignement manuel 1697 map marker (red dot) diameter, pixels 1697 diamètre du marqueur de carte (point rouge), pixels 1698 map selected areas and verify 1698 cartographier les zones sélectionnées et vérifier 1699 mashup project 1699 projet mashup 1700 match embedded image color 1700 faire correspondre la couleur de l'image intégrée 1701 match image color to base image (repeat) 1701 faire correspondre la couleur de l'image avec l'image de base (répéter) 1702 match values 1702 valeurs correspondantes 1703 matches 1703 correspondances 1704 max keywords exceeded 1704 nombre maximum de mots-clés dépassé 1705 max. Width 1705 largeur max. 1706 max. album count exceeded: %d 1706 nombre maximum d'albums dépassé : %d 1707 max. album files reached, results truncated 1707 nombre maximum de fichiers d'album atteint, résultats tronqués 1708 max. album size exceeded: %d 1708 taille maximale d'album dépassée : %d 1709 max. blur radius 1709 rayon de flou max. 1710 max. brightness 1710 luminosité max. 1711 max. image limit reached: %d 1711 limite maximale d'images atteinte : %d 1712 max. width or height is not reasonable 1712 la largeur ou la hauteur maximale n'est pas raisonnable 1713 maximum clip allowed to fit window 1713 recadrage maximum autorisé pour ajuster à la fenêtre 1714 mean RGB: %5.0f %5.0f %5.0f 1714 RVB moyen : %5.0f %5.0f %5.0f 1715 mean noise: %5.2f %5.2f %5.2f 1715 bruit moyen : %5.2f %5.2f %5.2f 1716 median 1716 médiane 1717 median diff 1717 différence médiane 1718 menu text and background colors 1718 couleurs du texte et de l'arrière-plan du menu 1719 metadata 1719 métadonnées 1720 metadata copy failed 1720 échec de la copie des métadonnées 1721 metadata from Search Function, metadata report 1721 métadonnées de la fonction de recherche, rapport de métadonnées 1722 metadata picklist file not found %s 1722 fichier de liste de métadonnées introuvable %s 1723 metadata tags to report 1723 balises de métadonnées à rapporter 1724 metadata update error 1724 erreur de mise à jour des métadonnées 1725 metadata update error \n 1725 erreur de mise à jour des métadonnées \n 1726 metadata update error: %s 1726 erreur de mise à jour des métadonnées : %s 1727 metadata update failed \n 1727 échec de la mise à jour des métadonnées \n 1728 min. blur radius 1728 rayon de flou min. 1729 min. contrast 1729 contraste min. 1730 min. edit curve node separation, % of scale length 1730 séparation min. des nœuds de courbe, % de la longueur de l'échelle 1731 min. separation, %c of scale 1731 séparation min., %c de l'échelle 1732 minutes 1732 minutes 1733 mmap() failure: %s 1733 échec de mmap() : %s 1734 months 1734 mois 1735 more than %d categories 1735 plus de %d catégories 1736 more than 20 matches 1736 plus de 20 correspondances 1737 mouse radius 1737 rayon de la souris 1738 mouse radius for color sample 1738 rayon de la souris pour l'échantillon de couleur 1739 mouse radius: 1739 rayon de la souris : 1740 move (delete original) 1740 déplacer (supprimer l'original) 1741 move area boundary in/out in 1-pixel steps 1741 déplacer la limite de la zone vers l'intérieur/extérieur par pas de 1 pixel 1742 move to next input file 1742 passer au fichier d'entrée suivant 1743 move to trash failed \n 1743 échec de la mise à la corbeille \n 1744 move to trash failed: %s 1744 échec de la mise à la corbeille : %s 1745 multiply 1745 multiplier 1746 must have 4 corners 1746 doit avoir 4 coins 1747 need numeric match value: %s 1747 valeur de correspondance numérique requise : %s 1748 negative 1748 négatif 1749 new album created 1749 nouvel album créé 1750 new album name 1750 nouveau nom d'album 1751 new file 1751 nouveau fichier 1752 new file ... 1752 nouveau fichier ... 1753 new file name is invalid 1753 le nouveau nom de fichier est invalide 1754 new file type 1754 nouveau type de fichier 1755 new home folder contains a blank 1755 le nouveau dossier d'accueil contient un espace 1756 new location 1756 nouveau lieu 1757 new location is not a folder 1757 le nouveau lieu n'est pas un dossier 1758 new version 1758 nouvelle version 1759 newest files 1759 fichiers les plus récents 1760 no EXIF orientation data 1760 aucune donnée d'orientation EXIF 1761 no active Select Area 1761 aucune zone de sélection active 1762 no albums selected 1762 aucun album sélectionné 1763 no auto warp 1763 pas de déformation automatique 1764 no change 1764 aucun changement 1765 no current album 1765 aucun album actuel 1766 no current edit image 1766 aucune image de modification actuelle 1767 no current file 1767 aucun fichier actuel 1768 no curve (scanned image) 1768 pas de courbe (image numérisée) 1769 no description 1769 aucune description 1770 no file selected 1770 aucun fichier sélectionné 1771 no files found 1771 aucun fichier trouvé 1772 no files selected 1772 aucun fichier sélectionné 1773 no host files selected 1773 aucun fichier hôte sélectionné 1774 no image index: reports disabled \n 1774 aucun index d'image : rapports désactivés \n 1775 no images 1775 aucune image 1776 no images found 1776 aucune image trouvée 1777 no input files available 1777 aucun fichier d'entrée disponible 1778 no matching files found 1778 aucun fichier correspondant trouvé 1779 no matching locations 1779 aucun lieu correspondant 1780 no metadata level data 1780 aucune donnée de niveau de métadonnées 1781 no metadata tags to report 1781 aucune balise de métadonnées à rapporter 1782 no option selected 1782 aucune option sélectionnée 1783 no overlay file selected 1783 aucun fichier de superposition sélectionné 1784 no photo date, skipped 1784 aucune date de photo, ignoré 1785 no plugin output file found 1785 aucun fichier de sortie de plugin trouvé 1786 no prior edit 1786 aucune modification précédente 1787 no prior edit image 1787 aucune image de modification précédente 1788 no saved folders 1788 aucun dossier enregistré 1789 no script file was started 1789 aucun fichier de script n'a été démarré 1790 no script files found 1790 aucun fichier de script trouvé 1791 no select area 1791 aucune zone de sélection 1792 no selection 1792 aucune sélection 1793 no title 1793 aucun titre 1794 no write permission 1794 aucune autorisation d'écriture 1795 no write permission \n 1795 aucune autorisation d'écriture \n 1796 no write permission: %s 1796 aucune autorisation d'écriture : %s 1797 none 1797 aucun 1798 not a known image file 1798 ce n'est pas un fichier image connu 1799 not an image file 1799 ce n'est pas un fichier image 1800 not an indexed image file \n 1800 ce n'est pas un fichier image indexé \n 1801 nothing found 1801 rien trouvé 1802 nothing left, no change made 1802 il ne reste rien, aucun changement effectué 1803 old file 1803 ancien fichier 1804 old image index: reports will omit new files \n 1804 ancien index d'image : les rapports omettront les nouveaux fichiers \n 1805 old keyword name >> new keyword name 1805 ancien nom de mot-clé >> nouveau nom de mot-clé 1806 omit high pixel 1806 omettre les pixels hauts 1807 omit low pixel 1807 omettre les pixels bas 1808 only %d tile images found 1808 seulement %d images de tuiles trouvées 1809 opacity center 1809 centre d'opacité 1810 opacity edge 1810 bord d'opacité 1811 open album 1811 ouvrir un album 1812 open and process color chart 1812 ouvrir et traiter la charte de couleurs 1813 open as new current file 1813 ouvrir comme nouveau fichier actuel 1814 optional deselect color 1814 couleur de désélection optionnelle 1815 original 1815 original 1816 originals 1816 originaux 1817 other 1817 autre 1818 out of space for temp files \nsave your edits and quit Fotocx 1818 plus d'espace pour les fichiers temporaires \nenregistrez vos modifications et quittez Fotocx 1819 outline 1819 contour 1820 output file exists 1820 le fichier de sortie existe 1821 output file exists, overwrite? 1821 le fichier de sortie existe, remplacer ? 1822 output file size change, cannot use select area 1822 changement de taille du fichier de sortie, impossible d'utiliser la sélection de zone 1823 output file: 1823 fichier de sortie : 1824 output file: %s \n 1824 fichier de sortie : %s \n 1825 oval 1825 ovale 1826 overlay file missing: %s 1826 fichier de superposition manquant : %s 1827 owner 1827 propriétaire 1828 paint 1828 peindre 1829 paint color 1829 couleur de peinture 1830 paint edits cannot be used for this method 1830 les modifications peintes ne peuvent pas être utilisées pour cette méthode 1831 paint over transparent areas 1831 peindre sur les zones transparentes 1832 paint radius 1832 rayon de peinture 1833 palette 1833 palette 1834 palette exceeds %d color limit 1834 la palette dépasse la limite de %d couleurs 1835 palette file 1835 fichier de palette 1836 palette has %d colors 1836 la palette a %d couleurs 1837 palette loaded, %d colors 1837 palette chargée, %d couleurs 1838 palette: 1838 palette : 1839 patch area goal 1839 objectif de la zone de correction 1840 percent 1840 pourcentage 1841 perform edits to include in the script file 1841 effectuer les modifications à inclure dans le fichier de script 1842 permissions: 1842 autorisations : 1843 perspective 1843 perspective 1844 photo 1844 photo 1845 picklist file not found: %s 1845 fichier de liste introuvable : %s 1846 pixel = mean of best match neighbors 1846 pixel = moyenne des voisins les plus proches 1847 pixel = median of all neighbors 1847 pixel = médiane de tous les voisins 1848 please make a choice 1848 veuillez faire un choix 1849 plugin command failed 1849 échec de la commande du plugin 1850 plugin menu not found %s 1850 menu du plugin introuvable %s 1851 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1851 plugins : (année mois jour ancien-nom séquence) $yyyy $mm $dd $oldname $s 1852 popup_choose: empty list 1852 popup_choose : liste vide 1853 position with mouse click/drag 1853 position par clic/glissement de la souris 1854 position: 50 50 1854 position : 50 50 1855 position: x=%02d y=%02d 1855 position : x=%02d y=%02d 1856 power 1856 puissance 1857 power center 1857 centre de puissance 1858 power edge 1858 bord de puissance 1859 power: center 1859 puissance : centre 1860 pref 1860 préf 1861 previous file 1861 fichier précédent 1862 previous name 1862 nom précédent 1863 print color chart 1863 imprimer la charte de couleurs 1864 print select area(s) only? 1864 imprimer uniquement la ou les zones sélectionnées ? 1865 prior edit step 1865 étape de modification précédente 1866 project complete 1866 projet terminé 1867 project file is defective 1867 le fichier projet est défectueux 1868 project name cannot have quote characters 1868 le nom du projet ne peut pas contenir de guillemets 1869 pure RGB or black/white dots 1869 points purs RVB ou noir/blanc 1870 quality 1870 qualité 1871 quality level (70+) 1871 niveau de qualité (70+) 1872 radius 1872 rayon 1873 radius: 1873 rayon : 1874 random 1874 aléatoire 1875 random position 1875 position aléatoire 1876 rating range 1876 plage d'évaluation 1877 reading image index file ...\n 1877 lecture du fichier d'index d'image ...\n 1878 recent files 1878 fichiers récents 1879 reduce bright 1879 réduire les zones claires 1880 reduce dark 1880 réduire les zones sombres 1881 reduce to these limits if larger 1881 réduire à ces limites si plus grand 1882 refresh 1882 actualiser 1883 remove %d duplicates? 1883 supprimer %d doublons ? 1884 remove all files in list 1884 supprimer tous les fichiers de la liste 1885 remove duplicate 1885 supprimer le doublon 1886 remove from set 1886 retirer de l'ensemble 1887 remove panorama image curving 1887 supprimer la courbure de l'image panoramique 1888 remove selected file from list 1888 retirer le fichier sélectionné de la liste 1889 rename keywords 1889 renommer les mots-clés 1890 repair metadata for %s 1890 réparer les métadonnées pour %s 1891 replace 1891 remplacer 1892 replace album %s ? 1892 remplacer l'album %s ? 1893 replace file 1893 remplacer le fichier 1894 replace old 1894 remplacer l'ancien 1895 replace old file (OVERWRITE) 1895 remplacer l'ancien fichier (ÉCRASER) 1896 replace substring within file name 1896 remplacer une sous-chaîne dans le nom de fichier 1897 report type: 1897 type de rapport : 1898 req. color match 1898 correspondance de couleur requise 1899 reset 1899 réinitialiser 1900 resolution 1900 résolution 1901 resume from current image 1901 reprendre à partir de l'image actuelle 1902 right 1902 droite 1903 right click on image for deselected color 1903 clic droit sur l'image pour la couleur désélectionnée 1904 sample % 1904 échantillon % 1905 save 1905 enregistrer 1906 save Mashup output file 1906 enregistrer le fichier de sortie Mashup 1907 save Mashup project? 1907 enregistrer le projet Mashup ? 1908 save area as a PNG file 1908 enregistrer la zone comme fichier PNG 1909 save as new file name or type 1909 enregistrer sous un nouveau nom ou type de fichier 1910 save as new file version 1910 enregistrer comme nouvelle version de fichier 1911 save edit, start new text 1911 enregistrer la modification, commencer un nouveau texte 1912 save metadata to image file 1912 enregistrer les métadonnées dans le fichier image 1913 save text data to a file 1913 enregistrer les données texte dans un fichier 1914 save to .heic/.avif file not supported 1914 enregistrement en .heic/.avif non pris en charge 1915 save to .jp2 file not supported 1915 enregistrement en .jp2 non pris en charge 1916 save to .webp file not supported 1916 enregistrement en .webp non pris en charge 1917 scan and save color chart 1917 numériser et enregistrer la charte de couleurs 1918 scanned color chart file 1918 fichier de charte de couleurs numérisée 1919 scope of neighbor pixels 1919 portée des pixels voisins 1920 script already started 1920 script déjà démarré 1921 script complete 1921 script terminé 1922 script error: %s, %s 1922 erreur de script : %s, %s 1923 script file closed 1923 fichier de script fermé 1924 script file error 1924 erreur de fichier de script 1925 script file format error: %s 1925 erreur de format du fichier de script : %s 1926 script file name too big 1926 nom de fichier de script trop long 1927 script file to run 1927 fichier de script à exécuter 1928 search for names in image location metadata 1928 rechercher des noms dans les métadonnées de lieu de l'image 1929 search for text within file folders or file name 1929 rechercher du texte dans les dossiers de fichiers ou le nom de fichier 1930 search for text within image title or description 1930 rechercher du texte dans le titre ou la description de l'image 1931 search known locations 1931 rechercher les lieux connus 1932 search range 1932 plage de recherche 1933 search: 1933 rechercher : 1934 seconds 1934 secondes 1935 seconds to show with text 1935 secondes d'affichage avec texte 1936 seconds to show without text 1936 secondes d'affichage sans texte 1937 select all 1937 tout sélectionner 1938 select all colors within mouse (flood) 1938 sélectionner toutes les couleurs autour de la souris (remplissage) 1939 select area missing or not finished 1939 zone de sélection manquante ou non terminée 1940 select area within mouse 1940 sélectionner une zone autour de la souris 1941 select area within mouse circle 1941 sélectionner une zone dans le cercle de la souris 1942 select base image for color matching 1942 sélectionner l'image de base pour la correspondance des couleurs 1943 select by color, required match level 1943 sélectionner par couleur, niveau de correspondance requis 1944 select by color, search range 1944 sélectionner par couleur, plage de recherche 1945 select font 1945 sélectionner la police 1946 select image to show with mouse paint 1946 sélectionner l'image à afficher avec la peinture à la souris 1947 select images randomly 1947 sélectionner des images au hasard 1948 select initial files 1948 sélectionner les fichiers initiaux 1949 select line color 1949 sélectionner la couleur de ligne 1950 select one color within mouse 1950 sélectionner une couleur autour de la souris 1951 select rectangle 1951 sélectionner un rectangle 1952 select source image color first 1952 sélectionner d'abord la couleur de l'image source 1953 select surrounding areas matching colors in mouse 1953 sélectionner les zones environnantes correspondant aux couleurs autour de la souris 1954 selection exceeds %d tags 1954 la sélection dépasse %d balises 1955 sepia 1955 sépia 1956 set a new date/time: 1956 définir une nouvelle date/heure : 1957 set all 1957 tout définir 1958 set current window size 1958 définir la taille actuelle de la fenêtre 1959 set image color from input files 1959 définir la couleur de l'image à partir des fichiers d'entrée 1960 set location from world map 1960 définir le lieu à partir de la carte du monde 1961 set maximum crop 1961 définir le recadrage maximum 1962 shadow 1962 ombre 1963 shell command used for converting RAW files to RGB 1963 commande shell utilisée pour convertir les fichiers RAW en RVB 1964 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1964 maj + clic gauche : prélever la couleur de l'image \nglisser gauche : peindre la couleur sur l'image \nglisser droit : restaurer l'image originale 1965 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1965 maj + clic gauche : synchroniser la position de copie \nglisser gauche : copier l'image source vers la souris \nglisser droit : restaurer l'image originale 1966 shift existing date/time (+/–): 1966 décaler la date/heure existante (+/–) : 1967 shift+click on image to select color 1967 maj+clic sur l'image pour sélectionner la couleur 1968 shortcut function not found: %s 1968 fonction de raccourci introuvable : %s 1969 shortcut key: 1969 touche de raccourci : 1970 shortcut not found: %s 1970 raccourci introuvable : %s 1971 show area outlines 1971 afficher les contours de zone 1972 show hidden files and folders 1972 afficher les fichiers et dossiers masqués 1973 show transient objects 1973 afficher les objets transitoires 1974 size of mouse selection circle 1974 taille du cercle de sélection de la souris 1975 smooth 1975 lisse 1976 source file: 1976 fichier source : 1977 source image failure (scale too big?) 1977 échec de l'image source (échelle trop grande ?) 1978 source image scale 1978 échelle de l'image source 1979 specify a thumbnail folder 1979 spécifier un dossier de vignettes 1980 specify at least 1 top image folder 1980 spécifier au moins 1 dossier d'images principal 1981 specify background size and color 1981 spécifier la taille et la couleur de l'arrière-plan 1982 specify files and keywords 1982 spécifier les fichiers et mots-clés 1983 spot size limit 1983 limite de taille des points 1984 start 1984 démarrer 1985 start a new script file 1985 démarrer un nouveau fichier de script 1986 start album 1986 démarrer l'album 1987 start blob condensation process 1987 démarrer le processus de condensation en taches 1988 start file 1988 fichier de départ 1989 start folder 1989 dossier de départ 1990 start from first image in album 1990 démarrer depuis la première image de l'album 1991 start fusion process 1991 démarrer le processus de fusion 1992 start over at end of album 1992 recommencer à la fin de l'album 1993 start warp 1993 démarrer la déformation 1994 start with previous image file, gallery of recent files, etc. 1994 démarrer avec le fichier image précédent, galerie des fichiers récents, etc. 1995 startup album is invalid 1995 l'album de démarrage est invalide 1996 startup file is invalid 1996 le fichier de démarrage est invalide 1997 startup folder is invalid 1997 le dossier de démarrage est invalide 1998 status: %s \n 1998 statut : %s \n 1999 status: completed \n 1999 statut : terminé \n 2000 stay open 2000 rester ouvert 2001 step 2001 étape 2002 stop 2002 arrêter 2003 stop blob condensation process 2003 arrêter le processus de condensation en taches 2004 stop fusion process 2004 arrêter le processus de fusion 2005 supply a file name 2005 fournir un nom de fichier 2006 tag name 2006 nom de balise 2007 tag name %s not in xmeta tag list 2007 le nom de balise %s n'est pas dans la liste des balises xmeta 2008 tag value 2008 valeur de balise 2009 target file: 2009 fichier cible : 2010 template 2010 modèle 2011 test: show changes, do not update files 2011 test : afficher les changements, ne pas mettre à jour les fichiers 2012 text 2012 texte 2013 text file is defective 2013 le fichier texte est défectueux 2014 text time 2014 heure du texte 2015 this function cannot be scripted 2015 cette fonction ne peut pas être scriptée 2016 thumbnail file 2016 fichier de vignette 2017 thumbnails deleted: %d \n 2017 vignettes supprimées : %d \n 2018 thumbnails folder: %s \n 2018 dossier des vignettes : %s \n 2019 tile area goal 2019 objectif de la zone de tuile 2020 tile gap 2020 espace entre les tuiles 2021 tile size 2021 taille des tuiles 2022 time 2022 heure 2023 title/desc. 2023 titre/desc. 2024 to add images to current set, \nsearch all images 2024 pour ajouter des images à l'ensemble actuel, \nrechercher dans toutes les images 2025 to remove images from current set, \nsearch current set 2025 pour retirer des images de l'ensemble actuel, \nrechercher dans l'ensemble actuel 2026 too many categories 2026 trop de catégories 2027 too many files, cannot continue 2027 trop de fichiers, impossible de continuer 2028 too many keywords in a category 2028 trop de mots-clés dans une catégorie 2029 top image folders: \n 2029 dossiers d'images principaux : \n 2030 transition 2030 transition 2031 transitions 2031 transitions 2032 trash 2032 corbeille 2033 trimmed color chart file 2033 fichier de charte de couleurs rogné 2034 unable to save bookmarks file 2034 impossible d'enregistrer le fichier de signets 2035 unknown edit function: %s 2035 fonction de modification inconnue : %s 2036 unknown file type 2036 type de fichier inconnu 2037 unknown or empty album: %s 2037 album inconnu ou vide : %s 2038 unsharp mask 2038 masque de netteté 2039 update 2039 mettre à jour 2040 updating albums ...\n 2040 mise à jour des albums ...\n 2041 upper 2041 supérieur 2042 upsize 2042 agrandir 2043 use 2043 utiliser 2044 use a saved Mashup project 2044 utiliser un projet Mashup enregistré 2045 use average 2045 utiliser la moyenne 2046 use custom color palette 2046 utiliser une palette de couleurs personnalisée 2047 use median 2047 utiliser la médiane 2048 use option to stop accidental quit 2048 utiliser une option pour éviter une fermeture accidentelle 2049 use previous input 2049 utiliser l'entrée précédente 2050 use previous location 2050 utiliser le lieu précédent 2051 use prior edit step: 2051 utiliser l'étape de modification précédente : 2052 use the current image file 2052 utiliser le fichier image actuel 2053 variance 2053 variance 2054 versions 2054 versions 2055 vertical 2055 vertical 2056 video files not supported (install ffmpeg) 2056 fichiers vidéo non pris en charge (installer ffmpeg) 2057 view album 2057 afficher l'album 2058 waiting 2058 en attente 2059 warp 2059 déformer 2060 warp and align selected image with mouse drags 2060 déformer et aligner l'image sélectionnée avec la souris 2061 warp and fine-align selected image with neighbor 2061 déformer et aligner finement l'image sélectionnée avec le voisin 2062 warp span 2062 étendue de la déformation 2063 wavelength 2063 longueur d'onde 2064 width 2064 largeur 2065 writing updated image index file \n 2065 écriture du fichier d'index d'image mis à jour \n 2066 x-count 2066 nombre-x 2067 x-offset 2067 décalage-x 2068 y-count 2068 nombre-y 2069 y-offset 2069 décalage-y 2070 years 2070 années 2071 you can close this window now \n 2071 vous pouvez fermer cette fenêtre maintenant \n 2072 you cannot use new name and replace text together 2072 vous ne pouvez pas utiliser un nouveau nom et remplacer du texte en même temps 2073 you must use either $s or $oldname 2073 vous devez utiliser soit $s soit $oldname 2074 zoom image 2074 zoomer l'image 2075 zoom via mouse wheel or Keys +/=/-/↑/↓ 2075 zoom via la molette de la souris ou les touches +/=/-/↑/↓ 2076 zoom-in 2076 zoom avant 2077 zoom-out 2077 zoom arrière fotocx/data/translations/ug_ko0000664000175000017500000107066215247006657015533 0ustar micomico- ^Fotocx 사용자 안내서^ v.26.8 Fotocx 메뉴의 도움말 > 사용자 안내서에서 확인하세요 - {Fotocx 사용법} {최초 시작} - 빠른 검색을 위한 이미지 파일 찾기 및 색인 {사용자 안내서} ← ^여기를 클릭^ - 이 사용자 안내서 브라우저 사용법 {창 보기 및 메뉴} - 최상위 창과 관련 메뉴 {파일 보기} - 파일 보기 창 (단일 이미지 파일 보기) {갤러리 보기} - 갤러리 보기 창 (폴더를 thumbnails로 보기) {지도 보기} - 지도 보기 창 (이미지 위치 마커가 있는 지도 보기) {드래그 앤 드롭} - 파일 드래그 앤 드롭 방법 {절차 편집} - 이미지 파일 편집 방법 {워크플로 편집} - 대체 편집 방법 - 간단한 방법과 복잡한 방법 {마우스 소유권} - 대화 상자-마우스 제어 및 상호작용 {마우스 Alt+오른쪽 버튼} - 터치패드/화면용 마우스 오른쪽 버튼 {대화 상자 버튼} - 대화 상자 완료 옵션 {키보드 Escape 키} - Escape 키의 기능 {비표준 대화 상자 위젯} - 비표준 대화 상자 위젯 사용법 {곡선 편집} - 편집 기능에 사용되는 곡선 조작 방법 {MOUSE PAINTING} - 마우스를 사용해 이미지를 부분적으로 편집 {일괄 처리} - 일괄 처리 기능 개요 {이미지 파일 선택} - 이미지 파일 선택 절차 {단축키} - 팝업 메뉴, 키보드 단축키, 사용자 지정 메뉴 {마우스 기능} - 파일/갤러리/지도 보기용 마우스 기능 {명령줄 매개변수} - Fotocx 명령줄 매개변수 - {파일 메뉴} {새 세션} - 별도의 창에서 새 Fotocx 세션 시작 {이미지 파일 열기} - 보기 또는 편집할 이미지 파일 열기 {파일 2개 순환} - 가장 최근에 본 두 이미지 파일 순환 {파일 3개 순환} - 가장 최근에 본 세 이미지 파일 순환 {360° 파노라마 보기} - 회전하는 시점의 360° 파노라마 이미지 {빈 이미지} - 지정한 크기와 색상으로 빈 이미지 만들기 {빈 이미지} - 새 빈 이미지 만들기 {복사/이동} - 이미지 파일을 다른 폴더로 복사 또는 이동 {데스크톱에 복사} - 이미지 파일을 데스크톱에 복사 {클립보드에 복사} - 이미지 파일을 클립보드에 복사 {삭제/휴지통} - 이미지 파일 삭제 또는 휴지통으로 이동 {배경화면 설정} - 현재 이미지 파일로 데스크톱 배경화면 설정 {이미지 인쇄} - 이미지 파일 인쇄 {보정된 색상으로 인쇄} - 색상 보정 데이터를 사용해 인쇄 {프린터 보정} - 프린터 색상 보정 - 색상 편차 보정 - {갤러리 메뉴} {갤러리 개요} {Thumb 보기} - thumbnails과 파일 이름이 있는 갤러리 보기 {metadata 보기} - thumbnail과 기본 metadata가 있는 갤러리 보기 {최근 파일} - 가장 최근에 본 이미지 파일의 갤러리 보기 {최신 파일} - 최신 이미지 파일의 갤러리 보기 {갤러리 정렬} - 갤러리의 정렬 순서 변경 {갤러리 필터} - 최신순, 오래된순, 패턴 일치 등 선택 {갤러리 홈} - 갤러리 시작으로 이동 {갤러리 끝} - 갤러리 끝으로 이동 {현재 파일 폴더} - 현재 파일의 폴더로 현재 갤러리 설정 {최근 폴더} - 최근에 본 폴더 목록 보기, 선택 {폴더 트리} - 이미지 파일 폴더를 트리 구조로 보기, 선택 {파일 선택} - 일괄, 스크립트, 앨범에 입력할 파일 선택 {북마크} - 북마크 목록 보기, 북마크로 이동 {북마크 편집} - 북마크 추가, 제거, 정렬 - {MAPS MENU} {세계 지도} - 인터넷 세계 지도 개요 {지도에 표시} - 현재 이미지 위치를 지도에 표시 - {앨범 메뉴} {앨범} - 이미지 컬렉션 만들기 및 정렬 {앨범 만들기} - 새 앨범 만들기 (선택한 이미지의 갤러리) {앨범 이름 바꾸기} - 기존 앨범 이름 바꾸기 {앨범 삭제} - 기존 앨범 삭제 {앨범 선택} - 앨범을 선택해 이미지 갤러리 표시 {현재 앨범} - 현재(마지막으로 사용한) 앨범 표시 {갤러리를 앨범으로} - 현재 갤러리를 이름 있는 앨범으로 저장 {앨범 편집} - 앨범 갤러리 내 이미지 파일 추가, 제거, 재정렬 {앨범 업데이트} - 업데이트된 이미지 파일(새 버전)에 맞춰 앨범 업데이트 {앨범 일괄 업데이트} 앨범 일괄 업데이트 (구성원 파일 추가/제거/대체) {슬라이드 쇼} - 애니메이션 이미지 전환과 팬/zoom이 있는 슬라이드 쇼 - {사용자 지정 메뉴} - 자주 사용하는 기능을 위한 사용자 지정 메뉴 {스크립트 파일} - 스크립트 파일 개요 {스크립트 편집} - 사용자 지정 편집 기능을 만들기 위해 스크립트에 편집 내용 기록 {스크립트 실행} - 현재 이미지에서 스크립트 실행 {일괄 스크립트} - 선택한 이미지 파일에서 스크립트 실행 {플러그인} - 플러그인 편집 기능 시작, 플러그인 출력 파일 열기 - {ZOOM} - 마우스 또는 키보드로 이미지나 thumbnails 확대/축소 - {이전/다음} - 마우스 또는 키보드로 이전 또는 다음 이미지로 이동 - {파일 저장} - 이미지 파일 저장 (대체, 새 버전, 새 파일 이름) - {metadata 메뉴} {주 metadata 보기} - 주요 이미지 metadata 나열 {모든 metadata 보기} - 모든 이미지 metadata 나열 {Keywords 개요} - 이미지 검색에 사용되는 keywords {GEOTAGS OVERVIEW} - 검색용 위치 이름 및 geotag 좌표 {주 metadata 편집} - 자주 사용하는 metadata 편집 {모든 metadata 편집} - 모든 metadata 편집 (추가, 제거, 변경) {metadata 삭제} - 지정한 metadata 또는 모든 metadata 삭제 {metadata 복사} - 한 이미지 파일에서 다른 파일로 metadata 복사 {metadata 복구} - metadata 편집을 막는 손상된 metadata 복구 {Keywords 관리} - 사용자 정의 keywords 관리 {캡션} - 이미지 모서리에 파일 이름, 제목, 설명 표시 {장소/날짜} - 이미지 위치/날짜 나열, 클릭해 갤러리 보기 {타임라인} - 연/월별 이미지 개수 표시, 클릭해 갤러리 보기 {metadata tags} - tag 값별 이미지 개수 표시, 클릭해 갤러리 보기 {자동 검색} - 파일을 찾는 스크립트형 검색 기능 {이미지 검색} - 모든 metadata 또는 폴더/파일 이름을 사용해 검색 - {선택 메뉴} {영역 개요} - 영역 선택 - 개념과 사용법 {영역 선택} - 별도로 편집할 이미지 특징 또는 영역 선택 {영역 빈틈 찾기} - 손으로 그린 영역 윤곽선의 빈틈 찾기 {영역 블렌드} - 선택한 영역 내에서 이루어진 편집을 마우스로 블렌드 {영역 표시/숨기기} - 영역 윤곽선 표시 또는 숨기기 {영역 사용/사용 안 함} - 편집용 영역 사용 또는 사용 안 함 {영역 반전} - 영역 반전 (바깥쪽/안쪽 영역 교환) {영역 지우기} - 영역 제거 {영역 복사/붙여넣기} - 영역 복사 또는 현재 이미지에 영역 붙여넣기 {영역 불러오기/저장} - 파일에서 영역 불러오기 또는 파일로 저장 - {실행 취소/다시 실행 버튼} - 현재 이미지에 대한 편집을 순차적으로 실행 취소 또는 다시 실행 - {편집 메뉴} {회전} - 이미지 회전 또는 수평 맞추기 {업라이트} - 회전되거나 뒤집힌 이미지 바로 세우기 {자르기} - 이미지 여백 자르기 {리터치} - 밝기, 대비, 색상, 채도 편집 {크기 조정} - 이미지 픽셀 크기 변경 {분할 화면} - 분할 화면으로 전/후 변경 사항 보기 {차이점 표시} - 편집 중(또는 아무 두 이미지 간) 변경 사항 강조 {여백} - 이미지에 여백 추가, 원하는 색상 또는 투명도 {마크업} - 이미지에 그리기: 텍스트, 선/화살표, 상자, 타원 {색상 모드} - 흑백, 컬러, 네거티브, 포지티브로 변환 {페인트 편집} - 편집 기능을 마우스로 부분적, 점진적으로 페인트 {이미지 페인트} - 색상, 브러시 크기, 불투명도로 마우스 페인트 {투명도 페인트} - 마우스로 투명도를 점점 늘려가며 페인트 {영역 채우기} - 선택한 영역이나 투명한 영역을 색으로 채우기 {이미지 내 복사} - 마우스로 이미지 내 픽셀 복사 {이미지에서 복사} - 마우스로 다른 이미지에서 픽셀 복사 {이전 편집 복사} - 마우스로 이전 편집에서 픽셀 복사 - {복구 메뉴} {선명하게} - 흐릿한 이미지 선명하게, 다양한 방법 {블러} - 이미지 또는 이미지 영역에 블러 적용, 다양한 방법 {노이즈 제거} - 이미지 노이즈(작은 무작위 점) 감소 {안개 제거} - 이미지 또는 선택 영역의 안개/뿌옇게 추가 또는 제거 {적목 현상} - 플래시 사진의 적목 현상 제거 {스마트 지우기} - 전선, 표지판 등 작은 방해 요소 제거 {헤일로 제거} - 선명하게 등 다른 기능으로 생긴 헤일로 제거 {JPEG 아티팩트} - 고압축 파일의 아티팩트 억제 {안티앨리어스} - 특징 가장자리의 계단 현상(픽셀화) 억제 {RGB 조정} - RGB 또는 CMY 색상을 사용해 이미지 색상 조정 {HSL 조정} - HSL 색상 모델을 사용해 색상 선택 및 변경 {먼지 제거} - 오래된 사진의 이미지 먼지 자국 제거 {색 번짐} - 주변부 색 번짐(색수차) 보정 - {보정 메뉴} {히스토그램 평탄화} - 세부 사항 개선을 위해 밝기 히스토그램 평탄화 {로컬 대비} - 국소 영역 밝기에 맞춘 대비 추가 {대비 증폭} - 기존 대비를 증폭해 세부 사항 강조 {전역 레티넥스} - 더 넓은 범위로 RGB 값 재조정 {로컬 레티넥스} - 더 넓은 범위로 RGB 값 재조정 {채도} - 밝기에 따라 색 채도 조정 {소프트 포커스} - 이미지에 고전적인 "소프트 포커스" 효과 적용 {밝기 그라데이션} - 이미지 전체에 밝기/색상 그라데이션 추가 {비네트} - 선택한 중심을 기준으로 방사형으로 밝기/색상 변경 - {효과 메뉴} {윤곽선} - 이미지를 윤곽선 그림으로 변환 {스케치1} - 이미지를 모의 스케치(1)로 변환 {스케치2} - 이미지를 모의 스케치(2)로 변환 {카툰} - 이미지를 카툰풍 그림으로 변환 {엠보싱} - 이미지를 모의 엠보싱(3D 효과)으로 변환 {타일1} - 이미지를 3D 효과가 있는 정사각형 타일로 변환 {타일2} - 이미지를 이미지에 맞춘 불규칙 타일로 변환 {페인팅} - 이미지를 모의 회화로 변환 {텍스처} - 이미지 또는 선택 영역에 텍스처 추가 {퓨전} - 선명도를 유지하면서 미세한 세부 사항 억제 {색상 맞추기} - 한 이미지의 색상을 다른 이미지에 맞추기 {패턴} - 이미지에 배경 패턴 추가 {크로스해치} - 교차하는 평행선을 사용한 스케치로 변환 {디더} - 이미지를 픽셀화하거나 색상 수를 줄이는 다양한 방법 {판화 효과} - 이미지를 흑백 선으로 변환 {눈부심 효과 추가} - 이미지 내 밝은 물체 주위에 눈부심 효과 추가 {모자이크} - 이미지로 만든 타일을 사용해 이미지를 모자이크로 변환 {노이즈 추가} - 이미지에 무작위 노이즈 추가 {색상 설정} - 색상 수 줄이기 (포스터화) {색상 전환} - RGB 색상을 GBR 또는 BRG로 점차 전환 {에일리언 컬러} - 이미지에 무작위로 이상한 색상 추가 {사용자 지정 커널} - 사용자 지정 컨볼루션 커널 편집 및 적용 - {왜곡 메뉴} {펴기} - 곡선이 있는 이미지(특히 파노라마) 바로잡기 {원근} - 둔각으로 촬영된 물체 바로잡기 {영역 왜곡} - 마우스로 끌어당겨 선택한 이미지 영역 왜곡 {WARP LINEAR1} - 마우스 드래그로 이미지 왜곡 - 선형 1 왜곡 {WARP LINEAR2} - 마우스 드래그로 이미지 왜곡 - 선형 2 왜곡 {곡선 왜곡} - 마우스 드래그로 이미지 왜곡 - 곡선 왜곡 {어파인 왜곡} - 마우스 드래그로 이미지 왜곡 - 평행선 유지 {방사형 왜곡} - 배럴 또는 핀쿠션 왜곡 추가 또는 제거 {클로즈업 왜곡 펴기} - 클로즈업 얼굴 사진 왜곡(큰 코) 제거 {물결 효과 만들기} - 물결 패턴으로 이미지 왜곡 {트위스트} - 선택한 중심점을 기준으로 이미지 트위스트 {구} - 이미지를 구형으로 곡면화 {인사이드아웃} - 각 픽셀의 중심-가장자리 거리 반전 {타이니 플래닛} - 파노라마 이미지를 원으로 감싸기 {에셔 나선} - 이미지를 끝없이 안쪽으로 향하는 나선으로 변환 {사진 평탄화} - 곡면을 촬영한 사진 평탄화 - {결합 메뉴} {HDR} - 어두운/밝은 이미지를 결합해 밝기 범위 확장 {HDF} - 근거리/원거리 초점 이미지를 결합해 심도 확장 {스택/페인트} - 이미지를 결합해 지나가는 차량, 관광객 등 제거 {스택/노이즈} - 이미지를 결합해 평균화로 노이즈 감소 {스택/레이어} - 이미지 버전을 결합, 영역/버전 선택/페인트 {파노라마} - 여러 이미지를 가로로 결합 {CIM 파일 표시} - 현재/최신 결합 이미지의 입력 파일 표시 {매시업} - 사용자 지정 레이아웃에 이미지와 서식 있는 텍스트 배치 {이미지 배열} - 여러 이미지를 압축된 배열 형식으로 결합 - {일괄 메뉴} {일괄 변환} - 복사, 이동, 크기 조정, 이름 바꾸기, 변환, 텍스트 추가 등 {일괄 복사/이동} - 선택한 이미지 파일을 새 폴더로 복사/이동 {업라이트 일괄 적용} - 회전된 이미지 파일을 찾아 바로 세우기 {일괄 삭제/휴지통} - 선택한 이미지 파일 삭제 또는 휴지통으로 이동 {오버레이 일괄 적용} - 선택한 이미지에 오버레이 이미지(저작권 등) 추가 {keyword 일괄 처리} - 선택한 이미지 파일의 keyword 추가 또는 제거 {keyword 일괄 이름 변경} - 모든 이미지 파일의 keyword 이름 변경 또는 삭제 {keyword 일괄 삭제} - 모든 이미지 파일에서 불필요한 keyword 삭제 {촬영 날짜 일괄 설정} - 촬영 날짜/시간 변경 또는 시간대 이동 {metadata 일괄 변경} - 선택한 이미지 파일의 metadata 추가 또는 수정 {metadata 일괄 보고} - 선택하거나 모든 이미지 파일의 metadata 보고 {geotag 일괄 설정} - 선택하거나 모든 이미지 파일의 geotag 추가 또는 수정 {파일 내보내기} - 선택한 파일을 폴더로 내보내기 (예: 웹 업로드) - {도구 메뉴} {파일 색인} - 모든 이미지 파일을 찾아 색인하는 일회성 작업 {Fotocx 홈 이동} - Fotocx 홈 폴더(사용자 데이터 및 설정) 이동 {설정} - Fotocx 작동을 위한 사용자 환경설정 및 설정 {키보드 단축키} - 메뉴 기능의 키보드 단축키 표시 및 수정 {RGB 히스토그램} - 현재 이미지의 밝기 히스토그램 그래프 {이미지 확대} - 이미지 위에서 마우스를 돋보기로 전환 {이미지 측정} - 이미지 내 픽셀 거리 측정 (마우스 클릭) {RGB 표시} - 마우스 위치 또는 선택한 지점의 RGB 값 표시 {격자 설정} - 격자선 표시 또는 제거, 선 개수나 간격 설정 {선 색상} - 영역 선택 윤곽선 색상 설정 {어둡거나 밝은 픽셀} - 클리핑을 강조하는 도구 {모니터 색상} - 모니터 밝기 및 대비 조정 {중복 항목 찾기} - 갤러리 또는 모든 이미지에서 중복 이미지 찾기 {손상된 파일 찾기} - 읽을 수 없는 이미지 파일 찾기, 삭제/이동/복구 {리소스 표시} - CPU 시간 및 현재 메모리 사용량 표시 {번역} - GUI 번역 만들기 또는 수정 - {도움말 메뉴} - 사용자 안내서, 튜토리얼, 변경 내역, Fotocx 정보, 제거 - {기타 주제} {VIDEO FILES} - 비디오 파일, thumbnails, 비디오 재생 {슬라이드 및 필름} - 슬라이드와 필름 네거티브 촬영 방법 {Fotocx 제한 사항} - 크기 및 성능 한계 {Windows 11용 Fotocx} - Windows 11 WSL에 Fotocx 설치 {개인정보} - Fotocx 개인정보 및 데이터 보호 정책 {PROBLEM, QUESTION, SUGGESTION} - Fotocx 작성자에게 문의 - - TOPIC: Fotocx 사용법 - - TOPIC: 최초 시작 - ^외부 프로그램 Fotocx는 필요한 외부 프로그램과 선택적 외부 프로그램, 그리고 각 프로그램이 제공하는 기능을 보고합니다. 필요한 프로그램이 없다면 설치한 후 Fotocx를 다시 시작하세요. - ^최초 색인 Fotocx가 이미지 파일을 색인합니다. 이를 통해 갤러리 페이지(thumbnails)가 빠르게 표시되고, 색인된 metadata를 기반으로 빠른 검색이 가능해지며, 클릭 가능한 지도 마커로 위치별 이미지를 볼 수 있습니다. 하나 이상의 '최상위' 이미지 폴더(예: /home//Pictures)를 입력해야 합니다. 하위 폴더는 자동으로 포함됩니다. 이 폴더 내 이미지가 아닌 파일은 무시됩니다. [select] 버튼을 사용해 최상위 이미지 폴더를 찾아 추가하세요. 실질적인 한계는 약 30개의 최상위 폴더입니다. 각 폴더는 수백 개의 하위 폴더를 가질 수 있습니다. - ^Thumbnails thumbnail 파일이 저장될 폴더입니다. 제공된 기본값을 사용하거나 다른 위치를 선택하세요. - ^색인 시간 색인 속도는 이미지 파일의 종류와 크기, 컴퓨터 속도에 따라 분당 수백 개에서 만 개 이상까지 다양할 수 있습니다. 컬렉션에 새 이미지 파일을 추가하면 다음 Fotocx 시작 시 새 파일이 색인됩니다. 새 파일이 많다면 색인하는 데 시간이 걸립니다. - ^이미지 제목 및 설명 통합 Fotocx 이미지 색인 기능은 누락된 제목 및 설명 metadata를, 사용 가능한 경우 다음과 같은 여러 대체 metadata tags 중 하나로 대체합니다: headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. 이는 항상 '제목'과 '설명'만으로 보기/편집/검색할 수 있도록 하기 위한 것입니다. 이 변환 과정은 비교적 느립니다(제 고성능 컴퓨터 기준 분당 2200개 파일). 이는 새 이미지 파일이 처음 색인될 때 수행됩니다. 아무것도 삭제되지 않습니다. - - TOPIC: 사용자 안내서 메뉴의 도움말 > 사용자 안내서에서 사용자 안내서를 여세요. Fotocx를 사용하는 동안 F1을 눌러 현재 또는 가장 최근 메뉴 기능에 대한 사용자 안내서 주제를 볼 수 있습니다. - 텍스트를 스크롤하려면 위/아래 화살표 키와 페이지 업/다운 키를 사용하세요. [찾기] 버튼을 누르면 텍스트 검색 대화 상자가 열립니다. 다음 항목을 찾으려면 [찾기]를 다시 누르세요. - 굵은 대문자 텍스트는 주제로 연결되는 클릭 가능한 링크입니다. 예: {파일 색인}. [<]와 [>] 버튼을 사용해 최근에 본 주제 사이를 앞뒤로 이동할 수 있습니다. [Recent] 버튼은 최근에 본 주제의 클릭 가능한 목록을 보여줍니다. - - TOPIC: 창 보기 및 메뉴 +image: fotocx-views.jpg - ^메뉴 버튼 메뉴를 클릭하면 팝업 하위 메뉴가 나타납니다. 상위 세 메뉴(파일, 갤러리, 지도)는 해당 보기 모드를 설정합니다. F/G/M 키도 사용할 수 있습니다. - - TOPIC: 파일 보기 하나의 이미지가 Fotocx 창 전체를 채웁니다. 왼쪽/오른쪽 마우스 클릭으로 확대/축소합니다. Z 키는 창에 맞춤과 1배 이미지 크기(이미지 픽셀 1개 = 화면 픽셀 1개) 사이를 전환합니다. 확대된 이미지를 이동하려면 이미지를 마우스로 왼쪽 드래그하세요. 마우스 휠로도 이미지를 확대/축소할 수 있습니다. 메뉴 버튼(편집, 복구 등)을 사용해 이미지를 수정하세요. 수정된 파일을 저장하려면 파일 저장 버튼을 사용하세요: 대체, 새 버전 만들기, 또는 새 파일(새 이름) 만들기. - ^키보드 왼쪽/오른쪽 화살표 키 현재 갤러리에서 이전 또는 다음 이미지 파일을 봅니다. - ^위/아래 화살표 키 위와 같지만, 마지막 버전만 표시되며, 버전이 없으면 원본이 표시됩니다. - - TOPIC: 갤러리 보기 현재 갤러리의 모든 이미지 파일이 thumbnails 배열로 표시됩니다. - ^갤러리 유형 • 폴더: 단일 폴더(디렉터리) 내 모든 이미지 파일과 하위 폴더 • 앨범: 사용자가 정렬한 다양한 폴더의 이미지 파일 • 최근 파일: 가장 최근에 보거나 편집한 이미지 파일 • 최신 파일: 가장 최근에 추가되거나 수정된 이미지 파일 • 검색 결과: 검색 기능으로 찾은 이미지. 이것도 앨범입니다. - ^갤러리 기능 • 이미지 thumbnail 왼쪽 클릭: 파일 보기 모드로 이미지 열기 • 이미지 thumbnail 오른쪽 클릭: 일반 기능의 팝업 메뉴 • 폴더 thumbnail 클릭: 갤러리 모드로 해당 폴더 열기 • 폴더 갤러리의 TOP 바: 상위 폴더 - 클릭해 이동 • [TOP] 버튼: 최상위 폴더 목록 - 클릭해 이동 • 스크롤 바: 갤러리 내에서 위/아래로 스크롤 • 위/아래 화살표 키: 갤러리를 한 행씩 스크롤 • 페이지 업/다운 키: 갤러리를 한 페이지씩 스크롤 • home/end 키: 갤러리의 시작(맨 위)과 끝(맨 아래)으로 이동 • 마우스 휠: 갤러리를 위아래로 스크롤 • [+] 및 [-] 키: thumbnail 크기 늘리기/줄이기 - ^갤러리 팝업 이미지 • 마우스 가운데 버튼으로 thumbnail을 클릭하면 팝업 이미지 표시 • Shift + 왼쪽 마우스로 thumbnail을 클릭하면 팝업 이미지 표시 • 팝업 이미지 왼쪽 클릭: 이미지를 더 크게 확대 • 팝업 이미지 오른쪽 클릭: 팝업 이미지 닫기 • 마우스 스크롤 휠: 팝업 이미지 확대/축소 • F11 키: 팝업 이미지를 전체 화면으로 표시 • Escape 키: 팝업 이미지 닫기 • 여러 개의 팝업을 사용해 이미지를 비교할 수 있습니다 - - TOPIC: 지도 보기 이미지 위치에 해당하는 마커가 있는 지도를 봅니다. 마커를 클릭하면 해당하는 이미지의 갤러리가 표시됩니다. 이는 이미지 파일에 geotag 좌표(latitude, longitude)가 내장되어 있어야 가능합니다. 최신 카메라는 이를 자동으로 삽입하며, 직접 이 데이터를 추가할 수도 있습니다. 처음에는 세계 지도가 표시됩니다. 마우스 휠을 사용해 원하는 위치에서 확대/축소하세요. 드래그하면 지도 중심이 이동합니다. 전 세계를 거리 수준까지 어떤 배율로도 볼 수 있습니다. - - TOPIC: 드래그 앤 드롭 두 개의 Fotocx 세션을 열면 한 세션에서 다른 세션으로 파일을 드래그 앤 드롭할 수 있습니다. 한 창에서 다른 창으로 갤러리 thumbnail을 드래그하세요. 파일 보기라면 파일이 열립니다. 갤러리 보기라면 결과는 갤러리 유형에 따라 다릅니다. 갤러리가 폴더라면 파일이 그 폴더에 추가되고, 갤러리는 정렬된 위치에 새 파일을 표시합니다. 갤러리가 앨범이라면 파일이 놓인 위치에 앨범에 추가됩니다. - - TOPIC: 절차 편집 파일 보기 모드의 이미지(현재 이미지)는 편집, 복구, 보정, 효과, 왜곡, 결합 메뉴의 편집 기능으로 수정할 수 있습니다. 이러한 기능은 메모리와 창에서 현재 이미지를 수정합니다. 이러한 기능을 사용함에 따라 편집 내용이 누적됩니다. 편집을 마쳤다면 [저장] 메뉴 버튼을 사용해 수정된 이미지를 같은 파일로, 새 버전(예: filename.v01.jpg)으로, 또는 새 파일 및/또는 폴더로 저장하세요. 이미지 편집 대화 상자에는 슬라이더, 버튼, 스핀 버튼, 또는 즉시 이미지를 업데이트하는 편집 가능한 곡선이 있습니다. - 실행 취소/다시 실행 버튼을 왼쪽 또는 오른쪽 클릭해 현재 활성화된 편집 기능을 실행 취소하거나 다시 실행합니다. 이미지에 하나 이상의 편집이 적용된 후, 실행 취소/다시 실행 버튼을 사용해 완료된 모든 단계를 앞뒤로 오가며 각 단계 후의 이미지 상태를 볼 수 있습니다. 마우스 가운데 버튼을 누르면 현재 이미지에 적용된 모든 편집의 팝업 목록이 표시되며, 원하는 단계를 선택해 돌아갈 수 있습니다. 이미지는 이전의 어떤 단계에서든 다시 편집할 수 있습니다. 이렇게 하면 그 단계 이후에 이루어진 편집은 그 단계에서 파생된 것이므로 삭제됩니다. 이 실행 취소/다시 실행 기능은 편집된 이미지가 현재 이미지로 남아 있는 한 유지됩니다. 다른 이미지를 열면 편집 기록이 삭제됩니다. 현재 이미지 상태로 돌아갈 가능성을 유지하고 싶다면, 다른 편집을 계속하기 전에 이미지를 새 버전으로 저장하세요. - - TOPIC: 워크플로 편집 - ^간단한 워크플로 대부분의 경우 카메라에서 나온 JPEG 파일을 그대로 편집하면 됩니다. 다음의 더 복잡한 절차는 일부 이미지 영역에서 밝기 범위를 확장한 편집 후 색상 띠가 보여, 밝기 단계가 눈에 띄게 커진 경우에만 사용하세요. - ^복잡한 워크플로 딥 컬러(RGB 색상당 8비트 이상)로 편집하려면 카메라 RAW 파일부터 시작하세요. RAW 파일은 다른 이미지 파일과 마찬가지로 편집할 수 있습니다. Fotocx 편집 기능은 색상당 24비트로 작동하므로 RAW 파일의 전체 색상 심도가 유지됩니다. RAW 파일을 열면 선택한 RAW 로더가 사용됩니다 - {설정}을 참고하세요. 여러 RAW 파일을 색상당 16비트의 TIFF, PNG, JXL 파일로 변환하려면 일괄 변환을 사용할 수도 있습니다. - Dcraw는 기본 RAW 파일 로더입니다. Rawtherapee와 같은 더 복잡한 RAW 편집기를 사용할 수도 있습니다 - {설정}을 참고하세요. Dcraw는 이에 비해 간단하고 빠릅니다. RAW 편집기의 편집 기능은 보통 Fotocx로 더 쉽게 수행할 수 있습니다. - - TOPIC: 마우스 소유권 일부 편집 대화 상자는 마우스를 사용해 메인 창의 이미지를 참조하거나 변경합니다. 이러한 대화 상자가 동시에 여러 개 활성화되어 있을 수 있습니다. 마우스는 이미지를 확대/축소하고 스크롤하는 데도 사용되며, 편집 대화 상자를 사용하는 동안 이 작업이 필요할 수 있습니다. 따라서 어떤 대화 상자나 창이 마우스를 소유하고 있는지, 그리고 소유권을 변경하는 방법을 이해하는 것이 중요합니다: • 대화 상자가 키보드 포커스를 가지고 있으면, 이미지에 대한 마우스 동작은 이 대화 상자에 대한 입력이며 이미지를 확대/축소하거나 스크롤하지 않습니다. • 이미지를 클릭하거나 드래그하는 동안 CTRL 키를 누르고 있으면 이미지가 확대/축소되거나 이동/스크롤됩니다. 열려 있는 대화 상자에는 영향을 주지 않습니다. • 마우스 휠은 어떤 이미지 위치에서든 확대/축소할 수 있습니다. - - TOPIC: 마우스 Alt+오른쪽 버튼 터치패드나 터치스크린에서는 마우스 오른쪽 클릭이 다루기 어려울 수 있습니다. 왼쪽 마우스 버튼을 누르는 동안 ALT 키를 누르고 있으면 오른쪽 마우스 버튼으로 해석됩니다. - - TOPIC: 대화 상자 버튼 대부분 다음과 같이 작동합니다: • [재설정] - 현재 편집을 실행 취소하고 이미지를 초기 상태로 되돌립니다 • [적용] - 대화 상자 설정을 이미지에 적용하고 대화 상자는 계속 활성 상태로 둡니다 • [OK] - [적용]과 같지만 대화 상자가 닫힙니다 • [취소] - 이미지 변경 사항을 버리고 대화 상자를 닫습니다 • [계속] - 대화 상자 입력을 바탕으로 시간이 걸리는 작업을 진행합니다 • [X] - 아무 동작 없이 대화 상자를 닫습니다 - - TOPIC: 키보드 Escape 키 메인 창이 포커스를 가지고 있는 경우: • 오래 실행 중인 기능이 아직 실행 중이면 종료합니다 • 메인 창이 최대화되어 있으면 이전 크기로 되돌립니다 • 현재 보기가 갤러리 또는 지도라면 파일 보기로 전환합니다 • 위 어느 것도 아니면: Fotocx를 종료합니다 대화 상자 창이 포커스를 가지고 있는 경우: 대화 상자를 닫습니다 ([X] 버튼과 동일) 기타: 팝업 이미지 취소, 360 파노라마 뷰어 종료, 슬라이드 쇼 일시 정지 또는 종료. - - TOPIC: 비표준 대화 상자 위젯 +image: custom-widgets.png - 대화 상자 크기를 줄이거나 사용 편의성을 높이기 위해 일부 비표준 위젯이 사용됩니다. 이들은 표준 GTK 위젯과 거의 비슷하게 작동합니다. 숫자 데이터 위젯은 GTK 스핀 버튼처럼 작동합니다: 마우스 휠과 키보드 위/아래 화살표 키를 사용해 값을 빠르게 올리거나 내릴 수 있습니다. 터치패드를 사용하는 경우, 입력란을 탭해 커서를 위치시킨 후 키보드로 값을 입력하거나, 키보드 위/아래 화살표 키를 사용해 새 값으로 빠르게 이동하세요. 키를 누르고 있으면 변경 속도가 시간이 지남에 따라 가속됩니다. Shift 키를 사용하면 속도를 10배 높일 수 있습니다. 비선형 슬라이더는 중립 값 주변의 배율을 확장하여, 특히 터치패드에서 작은 변화를 더 정밀하게 제어할 수 있게 합니다. 일부 표준 GTK 위젯은 불필요한 여백을 제거해 크기를 줄였습니다. 이는 Fotocx 홈 폴더의 'widgets.css' 파일로 제어됩니다. 원한다면 이 파일을 수정할 수 있습니다. 항목을 삭제하거나 주석으로 표시할 수 있지만, 파일 자체는 삭제하지 마세요 - 자동으로 교체됩니다. - - TOPIC: 곡선 편집 +image: retouch.png - 일부 이미지 편집 기능은 편집 가능한 곡선을 사용합니다. 곡선을 조작해 다른 속성에 따라 이미지의 특정 속성을 변경할 수 있습니다. 곡선은 마우스로 이동(끌어당기기)할 수 있습니다. 곡선을 끌어당긴 위치마다 앵커 포인트(검은 점)가 추가되며, 이 지점은 고정된 상태로 유지됩니다 - 곡선의 다른 부분을 끌어당겨도 곡선은 계속 이 지점을 지나갑니다. 앵커 포인트는 드래그로 이동하거나, 오른쪽 클릭으로 삭제할 수 있습니다. - - TOPIC: MOUSE PAINTING 마우스를 사용해 이미지를 부분적으로 편집할 수 있습니다. 마우스 위치 주위의 원이 이미지 영역을 둘러싸며, 마우스를 이미지 위에서 왼쪽으로 드래그하면 이 영역이 수정됩니다. 수정의 원본은 편집 기능, 선택한 색상, 또는 같은 이미지의 다른 부분이나 다른 이미지의 픽셀이 될 수 있습니다. 마우스 원 안의 이미지 픽셀은 원본과 일치하도록 수정됩니다. 변경 속도는 마우스 중심과 가장자리의 파워 계수에 따라 빠르거나 점진적일 수 있습니다. 중심 계수가 높고 가장자리 계수가 낮으면, 이미지는 마우스 중심에서 더 빠르게 수정되고 중심에서 가장자리로 갈수록 점차 덜 수정됩니다. 픽셀이 원본 색상이나 이미지와 완전히 일치하거나 원본 편집 기능이 완전히 적용될 때까지, 같은 이미지 영역 위에서 마우스를 왼쪽으로 반복해서 드래그해 변경 사항을 누적하세요. 오른쪽으로 드래그하면 변경 사항을 점차 실행 취소해 원본 이미지를 복원합니다. - 예: 편집 기능이 리터치이고 밝기를 높인 경우, 마우스를 왼쪽으로 드래그하면 마우스 영역 내에서 이미지가 밝아집니다. 오른쪽으로 드래그하면 원본 이미지가 점차 복원됩니다. - [undo-last] 버튼은 마지막 페인트 또는 지우기 작업을 되돌리며, 이를 반복해 최근 편집 내용을 여러 개 제거할 수 있습니다. 새로운 마우스 드래그 작업 하나하나가 별도로 되돌릴 수 있는 작업 단위입니다. 실행 취소를 위한 메모리는 제한되어 있으므로 최근 페인트 및 지우기 단계만 유지됩니다. [undo all]를 누르면 이미지가 초기 상태로 돌아갑니다. - [undo/redo] 버튼을 사용해 편집 중 변경 사항을 검토하세요. - {영역 선택}이 활성화되어 있으면 페인트는 그 영역 내로 제한됩니다. - 참고: 매우 작은 반경을 사용할 때(예: 이미지에 선을 그릴 때)는 이미지를 100% 이상으로 zoom 하세요. 마우스 이동 단계는 화면 픽셀 단위입니다. 이것이 많은 이미지 픽셀에 걸쳐 있고 작은 반경이 사용되고 있다면, 일부 픽셀은 마우스에 의해 건너뛰어져 처리되지 않을 수 있습니다. - - TOPIC: 일괄 처리 일부 공통 작업을 빠르게 처리하기 위해 {일괄 메뉴}에 여러 일괄 기능이 있습니다. 여러 이미지 파일을 선택하고 이들 전체에 대해 일괄 기능을 실행할 수 있습니다. 일괄 기능은 파일 이름이나 형식 변경, 업라이트, 크기 조정, 복사 또는 이동, 삭제, tags, keywords, 위치/geotag 좌표, 촬영 날짜 수정에 사용할 수 있습니다. - - TOPIC: 이미지 파일 선택 +image: select-image-files.jpg - 이 절차는 여러 이미지 파일에 대해 작동하는 모든 기능에 사용됩니다. 이 절차는 여기서 설명하며, 이 주제는 이 절차를 사용하는 모든 기능에서 링크되어 있습니다. • thumbnail 왼쪽 클릭: 선택 목록에 추가 • 오른쪽 클릭: 제거 • 여러 개 추가: 첫 번째 thumbnail을 클릭한 후 마지막 것을 shift 클릭 • [모두 추가] 버튼: 전체 갤러리 추가 • [현재 항목 추가] 버튼: 현재 파일 추가 • 파일은 목록에 여러 번 추가될 수 있습니다 • 필요에 따라 다른 갤러리로 이동해 더 많은 파일을 선택하세요 • [제거] 버튼: 선택한 목록 위치 제거 • [지우기] 버튼: 전체 목록 지우기 • 위/아래 화살표 키: 목록을 이동하며 thumbnail 보기 • home/end 키: 목록의 시작/끝으로 이동 - [사용 안 함] 버튼은 파일을 선택하기 위한 thumbnail 클릭을 비활성화합니다. 그러면 버튼 이름이 [사용]으로 바뀝니다 - 다시 눌러 thumbnail 클릭을 복원하세요. 이는 일반적인 thumbnail 팝업 메뉴와 왼쪽 클릭으로 파일을 원본 크기로 보는 기능을 사용할 수 있게 하기 위한 것이며, thumbnail 클릭이 파일 선택에 사용되고 있는 동안에는 이것이 불가능합니다. 선택 내용을 결정할 때 이 기능이 필요할 수 있습니다. 파일 보기 모드에 머무르면서 화살표 키로 이미지를 이동하는 동시에 [현재 항목 추가] 버튼을 사용해 선택 목록에 파일을 추가할 수도 있습니다. - - TOPIC: 단축키 자주 사용하는 기능을 위한 세 가지 단축 방법이 있습니다: • 메인 창이나 갤러리 thumbnail을 오른쪽 클릭하세요. 자주 사용하는 일부 기능이 팝업 메뉴에 표시됩니다. • 단축키를 변경하고 새 단축키를 추가할 수 있습니다. {키보드 단축키}를 참고하세요. • 자주 사용하는 기능을 사용자 지정 메뉴에 모으세요. {사용자 지정 메뉴}를 참고하세요. - 가장 일반적인 기능에는 키보드 단축키를 사용할 수 있습니다. 도구 > 키보드 단축키 메뉴를 사용해 확인하거나 변경하세요. - 다음 키보드 단축키는 고정되어 있으며 변경할 수 없습니다: • [+] [=] 키: 이미지나 thumbnails를 더 크게 zoom • [-] 키: 이미지나 thumbnails를 더 작게 zoom • Z 키: zoom 전환: 1배 <--> 창에 맞춤 • F1 키: 현재 기능의 사용자 안내서 표시 • F10 키: 메인 창 전체 화면 전환 및 복귀 • F11 키: F10과 비슷하지만 메뉴, 제목 표시줄, 상단 패널 없음 • Escape 키: 실행 중인 기능 중단, 활성 대화 상자 종료 • Delete 키: 현재 파일을 삭제하거나 휴지통으로 보내는 대화 상자 • 왼쪽/오른쪽 화살표: 갤러리에서 이전/다음 이미지 표시 • 위/아래 화살표: 같지만 마지막 버전만 표시 • Page Up/Down: 갤러리 보기: 한 페이지씩 위/아래로 스크롤 • Home/End: 갤러리 보기: 첫/마지막 갤러리 페이지로 이동 - 다음 키보드 단축키는 기본값이며 사용자가 변경할 수 있습니다: • F: 파일 보기 - 파일 보기 모드로 전환 • G: 갤러리 보기 - 갤러리 보기 모드로 전환 • M: 지도 보기 - 지도 보기 모드로 전환 • 2: 파일 2개 순환 - 가장 최근 두 파일을 번갈아 표시 • 3: 파일 3개 순환 - 가장 최근 세 파일을 번갈아 표시 • A: 현재 앨범 - 가장 최근에 본 앨범 표시 • T: 리터치 - 리터치 편집 기능 시작 • C: 자르기 - 자르기 편집 기능 시작 • K: 키보드 단축키 - 키보드 단축키 대화 상자 시작 • P: 이미지 인쇄 - 이미지 인쇄 대화 상자 열기 • R: 회전 - 회전 편집 기능 시작 • U: 실행 취소 - 현재 편집 또는 일련의 편집 중 마지막을 실행 취소 • Shift+U: 다시 실행 - 현재 편집 또는 일련의 편집 중 다음을 다시 실행 • Ctrl+C: 클립보드에 복사 - 현재 파일을 클립보드에 복사 • Shift+C: 캡션 전환 - 캡션 표시/숨기기 전환 • Ctrl+G: 현재 파일의 폴더 갤러리 표시 • Shift+G: 격자 전환 - 격자선 켜기/끄기 • Ctrl+S: 저장 - 파일 저장 대화 상자 시작 - - TOPIC: 마우스 기능 - ^파일 보기 • 왼쪽 클릭 - 확대(Zoom-in): 마우스를 중심으로 이미지 확대 • 오른쪽 클릭 - 이미지가 확대되어 있으면: 창 크기로 복원 아니면 일반 기능의 팝업 메뉴 • 마우스 휠 - 이미지 확대 또는 축소 • 이미지를 왼쪽 드래그 - 확대된 이미지 이동 • Ctrl + 마우스 - 마우스가 활성 대화 상자가 아닌 이미지에 작동 - ^갤러리 보기 • thumbnail 왼쪽 클릭 - 파일 보기로 전환 • thumbnail 오른쪽 클릭 - 일반 기능의 팝업 메뉴 표시 • thumbnail 가운데 클릭 - 큰 이미지 팝업, 마우스 휠로 확대/축소 • 마우스 휠 - 갤러리 페이지를 위 또는 아래로 스크롤 - ^지도 보기 • 왼쪽 드래그 - 마우스를 따라 지도 드래그 • 마우스 휠 - 지도를 더 크게 또는 작게 zoom • 마커 왼쪽 클릭 - 해당 위치의 이미지 갤러리 표시 • metadata 편집 대화 상자가 활성화되어 있으면, 왼쪽 클릭으로 geotag 좌표 설정 - - TOPIC: 명령줄 매개변수 Fotocx를 터미널에서 시작한 경우 다음 매개변수를 사용할 수 있습니다. -help 사용자 안내서 표시 -home /folder 대체 Fotocx 홈 위치 (아래 참고) -lang xx 2자리 코드로 언어 설정 -recent 최근 이미지 파일 갤러리 표시 -new 최신 이미지 파일 갤러리 표시 -album albumname 열 앨범(갤러리) -prev 이전 세션에서 마지막으로 본 파일 표시 -blank 빈 창 표시 -dev 일반적으로 숨겨진 개발자 메뉴 표시 -menu manuname Fotocx가 이 메뉴를 활성화한 상태로 시작 -cwp nnn name 배경화면 순환 (아래 참고) -x0 -x1 -x2 색인 수준을 0, 1, 2 중 하나로 설정 (아래 참고) - ^-x0 -x1 -x2 매개변수^ (시작 시 색인 수준 설정) 이 매개변수는 {설정} 값을 재정의하는 데 사용할 수 있습니다 -x0 매우 빠른 시작, 이미지 색인 없음 -x1 빠른 시작, 이전 파일만 색인 -x2 이전 파일 + 새/수정된 파일 검색 - ^-home^ 매개변수 (대체 Fotocx 홈 폴더) 기본 Fotocx 홈 폴더: /home//.fotocx. 여기에 사용자 설정과 이미지 색인이 저장됩니다. "$ fotocx -home " 명령은 지정된 폴더를 사용합니다. 이를 통해 여러 이미지 컬렉션을 별도로 관리할 수 있습니다. {Fotocx 홈 이동}도 참고하세요. - ^-cwp^ 매개변수 (데스크톱 배경화면 순환) 전체 명령줄은 다음과 같습니다: $ fotocx -cwp secs container 이 명령을 사용해 선택한 세트에서 데스크톱 이미지를 순환하세요. 'secs'는 이미지 간의 간격입니다. 'container'는 Fotocx 앨범 이름이거나 이미지 파일이 있는 폴더입니다. 지정한 간격으로 새 배경화면을 얻으려면 이 명령을 로그인 시작 목록에 추가하세요. 로그인할 때마다 새 배경화면 이미지를 얻으려면 하루 이상의 간격을 사용하세요. Fotocx는 GUI 없이 백그라운드에서 실행됩니다. 'secs'가 0이면 배경화면이 한 번만 업데이트되고 Fotocx가 종료됩니다. 모든 Linux 종류마다 명령이 다릅니다. 이론적으로 다음이 지원됩니다: Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: 파일 메뉴 - - TOPIC: 새 세션 새 창에서 새 Fotocx 세션을 시작합니다. 두 창에서 같은 이미지 파일을 편집하는 경우, 어느 쪽 인스턴스도 다른 쪽에서 이루어진 변경 사항을 보지 못하며, 최종 결과는 마지막에 저장된 파일이 됩니다. - - TOPIC: 이미지 파일 열기 폴더와 파일 목록이 있는 일반적인 파일 열기 대화 상자를 사용해 보거나 편집할 이미지 파일을 선택합니다. 이는 파일이 색인되지 않아 갤러리 표시가 매우 느린 경우(예: 수천 개의 이미지 파일이 있는 카메라 SD 카드에서 읽는 경우)에 유용합니다. - - TOPIC: 파일 2개 순환 이 메뉴를 반복하면 가장 최근에 연 두 파일 사이를 번갈아 표시합니다. 이 기능은 현재 이미지의 zoom 크기와 위치를 유지하므로, 같은 이미지 파일의 편집된 두 버전을 빠르게 비교하는 데 이상적입니다. - - TOPIC: 파일 3개 순환 파일 2개 순환과 같은 방식으로 작동하지만, 가장 최근에 연 3개의 파일을 번갈아 표시합니다. - - TOPIC: 360° 파노라마 보기 현재 파일이 360° 파노라마 파일용 특수 뷰어로 열립니다. 이미지 너비는 360°로 가정됩니다. 이 기능을 사용해 Google '포토스피어' 이미지를 볼 수 있습니다. 마우스 드래그나 왼쪽/오른쪽 화살표 키로 이미지를 이동하세요. 왼쪽/오른쪽 마우스 클릭으로 확대/축소하세요. Escape를 사용해 특수 뷰어를 종료하세요. - - TOPIC: 이름 바꾸기 현재 파일(파일 보기)이나 클릭한 thumbnail의 파일(갤러리 보기) 이름을 바꿉니다. 새 이름을 입력하고 [적용]을 누르세요. 이 기능은 루트 이름과 순서 번호를 사용해 일련의 이미지 파일 이름을 바꾸는 과정을 자동화할 수도 있습니다. 시리즈의 첫 번째 이미지 파일을 열고, 새 이름을 입력한 후 [적용] 버튼을 누르세요. 원한다면 [next] 버튼을 사용해 다음 파일로 이동하세요. [이전 이름] 버튼을 눌러 같은 이름을 다시 사용한 후 접미사나 순서 번호를 추가할 수 있습니다. [add 1] 버튼을 눌러 순서 번호를 증가시키세요. - - TOPIC: 빈 이미지 지정한 픽셀 크기와 색상으로 빈 이미지를 만듭니다. 다른 이미지에서 잘라낸 부분({영역 선택} 사용)과 주석 텍스트({마크업} 텍스트 그리기 사용)의 배경으로 사용할 수 있습니다. - - TOPIC: 복사/이동 현재 파일(파일 보기)이나 클릭한 thumbnail의 파일(갤러리 보기)이 지정한 위치로 복사됩니다. 파일을 복사하고 원본 파일은 그대로 두어 복제본을 만들려면 복사 옵션을 선택하세요. 파일을 원래 위치에서 새 위치로 이동하려면 이동 옵션을 선택하세요. 각 thumbnail을 클릭한 후 [적용]을 눌러 여러 파일을 빠르게 처리할 수 있습니다. [이전] 버튼을 사용해 이전에 사용한 파일 이름을 복사할 수 있습니다. 중복 파일을 피하려면 버전 번호나 다른 것을 추가하세요. - - TOPIC: 데스크톱에 복사 현재 파일(파일 보기)이나 클릭한 thumbnail의 파일(갤러리 보기)이 데스크톱 폴더(/home//Desktop)에 복사됩니다. - - TOPIC: 클립보드에 복사 현재 파일(파일 보기)이나 클릭한 thumbnail의 파일(갤러리 보기)이 클립보드에 복사되며, 다른 애플리케이션에서 붙여넣을 수 있습니다. - - TOPIC: 삭제/휴지통 현재 파일(파일 보기)이나 클릭한 thumbnail의 파일(갤러리 보기)이 선택한 옵션에 따라 삭제되거나 휴지통으로 이동합니다. Fotocx는 표준 휴지통 위치(~/.local/share/Trash)를 사용합니다. - - TOPIC: 배경화면 설정 현재 이미지 파일로 데스크톱 배경화면이 설정됩니다. - - TOPIC: 이미지 인쇄 이미지 인쇄 메뉴는 프린터, 용지 크기, 방향을 선택할 수 있는 표준 페이지 설정 대화 상자를 엽니다. [적용] 버튼을 사용한 후, 용지 여백과 이미지 배율을 입력하는 다른 대화 상자가 시작됩니다. - 이미지에 선택된 영역이 있으면, 해당 영역만 인쇄할지 묻습니다. 이 경우 영역을 감싸는 데 필요한 최소 직사각형으로 인쇄되며, 선택 영역 바깥은 인쇄되지 않습니다. - - TOPIC: 보정된 색상으로 인쇄 이 기능은 위에서 설명한 이미지 파일 인쇄와 비슷하게 작동하지만, 인쇄 전에 인쇄에 앞서 이미지 색상을 조정하는 데 사용되는 보정 파일을 제공하라는 요청을 받습니다. 목적은 프린터와 용지 종류로 인한 색상 편차를 보정하는 것입니다. - - TOPIC: 프린터 보정 +image: printer-calibrate-chart.png +image: calibrate-printer.png - 이 유틸리티는 인쇄된 이미지의 색상 정확도를 개선할 수 있습니다. - ^작동 방식 대상 프린터로 색상 차트가 인쇄됩니다. 프린터의 불완전함으로 인해 인쇄된 일부 색상이 약간 잘못될 수 있습니다. 이 인쇄된 페이지는 스캔되어 파일로 저장되며, 이 파일의 색상과 원래 인쇄된 색상이 비교됩니다. 차이가 있다면 이는 이제 알려진 오차입니다(스캐너가 프린터보다 더 정확하다고 가정 - 일반적으로 사실). 이미지 파일이 인쇄될 때, 이 오차는 인쇄 전에 이미지 색상에서 차감됩니다. 프린터는 그 오차를 다시 더해, 이론적으로 정확한 결과를 남깁니다. 제 자체 테스트에서는 아래에 자세히 설명된 것처럼 약간의 개선이 나타났습니다. - 대화 상자 창에 나열된 순서대로 다음 단계를 수행하세요. 모든 파일은 /printer_color 폴더에 있습니다. • 색상 차트 파일(printchart.png)을 생성하고 인쇄하세요. 큰 용지 크기, 세로 방향, 여백 없음을 사용하세요. • 인쇄된 차트를 PNG 파일로 스캔하세요. 300dpi 이상을 사용하세요. • PNG 이미지를 편집해 스캐너로 인해 생긴 여백을 자르세요. 편집한 이미지 파일을 저장하세요. • 편집한 이미지 파일을 처리해 색상 맵 파일을 만드세요. - 이제 {보정된 색상으로 인쇄} 메뉴를 사용해 인쇄할 수 있으며, 사용 중인 프린터와 용지에 해당하는 색상 맵 파일의 이름을 요청받습니다. - 스캐너는 스캔한 이미지를 약간 직사각형이 아닌 형태로 왜곡시킬 수 있습니다. 이런 일이 발생하면 여백을 자를 때 알아차리게 됩니다: 굵은 초록색 여백선이 자르기 사각형과 완벽하게 맞지 않습니다. 이런 일이 발생하면, 먼저 {원근}을 사용해 이미지를 반듯하게 한 후 여백을 자르세요. - 스캔한 차트 이미지를 편집할 때는 가장 어두운 행이 맨 위에 오도록 하세요. 색상 타일을 둘러싼 여백을 자르세요. 색상 타일을 둘러싼 굵은 초록색 여백선을 가이드로 사용하세요: 이 선을 정확히 잘라내어 타일만 남기세요. 자르기 사각형을 조정하는 동안 2배 확대로 작업하세요. 정확한 자르기가 중요합니다. 자르기가 정확하지 않으면 계산된 타일 위치가 어긋나며 측정된 색상이 잘못될 수 있습니다. 작은 오차는 허용됩니다. 자르기 사각형에서 1픽셀 단위로 이동하려면 키보드 화살표 키를 사용할 수 있습니다. 화살표 키는 마우스로 마지막으로 끌어당긴 모서리를 이동시킵니다. - 출력된 색상 맵 파일은 보정에 사용된 용지 및 프린터 설정에만 사용할 수 있습니다. 다른 조합에는 각각의 보정과 색상 맵 파일이 필요합니다. - ^결과^ (제 Canon 프린터) +image: printer-calibrate.jpg +image: printer-cal-study.png - 위 차트는 세 이미지의 사진입니다: 왼쪽 위: 색상 차트 사진의 인쇄물 오른쪽 위: 같은 사진의 보정된 인쇄물 아래: 색상 차트 자체 세 이미지 모두 함께 촬영되었으므로 카메라로 인한 오차가 동일해 비교가 유효합니다. - - TOPIC: 갤러리 메뉴 - - TOPIC: 갤러리 개요 +image: image-management.jpg - thumbnail 이미지의 갤러리는 파일 폴더, 이미지 검색 결과, 내장 갤러리(최근 파일, 최신 파일) 중 하나, 또는 앨범(지정한 이름을 가진 이미지 파일의 정렬된 목록)을 나타낼 수 있습니다. 실질적인 이유와 성능상의 이유로 폴더는 수천 개 파일로 제한하는 것이 좋지만, 강제되는 제한은 없습니다. - ^갤러리 스크롤 갤러리는 키보드 위/아래 화살표 키, 페이지 업/다운 키, 또는 스크롤 바를 사용해 위아래로 스크롤할 수 있습니다. [home] 및 [end] 키도 사용할 수 있습니다. 스크롤 바를 왼쪽 클릭한 채로 있으면 갤러리가 클릭 위치까지 빠르게 스크롤됩니다. 스크롤 바를 오른쪽 클릭한 채로 있으면 갤러리가 클릭 위치까지 천천히 스크롤됩니다. 마우스 버튼을 계속 누른 채로 옆으로 이동하면 스크롤 속도가 증가합니다. - - TOPIC: Thumb 보기 현재 갤러리의 이미지 파일이 thumbnails 배열로 표시됩니다. Zoom 메뉴 버튼이나 [+] [-] 키를 사용해 thumbnail 크기를 변경하세요. - - TOPIC: metadata 보기 현재 갤러리의 이미지 파일이 Fotocx가 사용하는 기본 metadata와 함께 표시됩니다. 사용자 지정 색인 metadata tags가 정의되어 있으면 표준 tags 뒤에 표시됩니다. {파일 색인}을 참고하세요. - - TOPIC: 최근 파일 가장 최근에 본 이미지 파일 1000개가 갤러리에 표시되며, 여기서 보거나 편집할 파일을 선택할 수 있습니다. - - TOPIC: 최신 파일 가장 최근에 추가되거나 수정된 이미지 파일 1000개가 갤러리에 표시되며, 여기서 보거나 편집할 파일을 선택할 수 있습니다. 최신 이미지를 판단할 때 EXIF 촬영 날짜를 사용할지 파일 수정 날짜를 사용할지 선택할 수 있습니다. - - TOPIC: 갤러리 정렬 정렬 키와 오름차순 또는 내림차순을 선택하세요. 재설정 체크박스는 모든 갤러리를 파일 이름 오름차순으로 재설정합니다. - 앨범 갤러리를 정렬하면 출력은 앨범을 대체하지 않고 -sorted라는 새 앨범을 만듭니다. - ^파일 이름/번호 이는 파일 이름을 기준으로 하는 수정된 정렬입니다. 여러 파일의 이름이 같은 위치에 있는 내장된 숫자만 다르다면, 이 파일 그룹은 내장된 숫자 순서로 정렬됩니다. 다음 예시는 그 차이를 보여줍니다: 알파벳순: xxx1xx xxx11xx xxx123xx xxx3xx 숫자순: xxx1xx xxx3xx xxx11xx xxx123xx - ^검색 기능의 Metadata 갤러리가 {이미지 검색}의 'metadata 보고서' 옵션으로 생성되었고, 표준 보고서에 선택적 metadata tags를 추가했다면, 이 metadata tags로 갤러리를 정렬할 수 있습니다. 카메라 제조사, 렌즈 정보, ISO 수준, 노출 시간 등 사용 가능한 metadata로 갤러리를 정렬할 수 있습니다. - - TOPIC: 갤러리 필터 현재 갤러리의 부분집합을 선택해 선택한 이미지 파일을 포함하는 "gallery_filter"라는 앨범을 만드세요. ^선택 옵션: • 모든 파일: 모든 이미지 파일 선택 • 원본: 원본 파일 (버전 번호 없음) • 버전: 버전이 있는 파일 (편집됨) • 마지막 버전: 마지막 버전 (버전이 없으면 원본) • 평점 범위: 지정한 범위 내 평점의 파일 • keyword 이름: 지정한 keywords 중 하나라도 있는 파일 (쉼표로 구분) • 파일 이름 텍스트: 지정한 텍스트 문자열 중 하나라도 있는 파일 (쉼표로 구분) - - TOPIC: 갤러리 홈 TOPIC: 갤러리 끝 현재 갤러리의 첫 번째 또는 마지막 thumbnail로 이동합니다. - - TOPIC: 현재 파일 폴더 현재 이미지 파일로부터 현재 갤러리를 설정합니다. 다른 작업을 한 후 현재 파일의 갤러리로 돌아가고 싶을 때 유용합니다. - - TOPIC: 최근 폴더 최근에 사용한 갤러리로부터 현재 갤러리를 설정합니다. 최근 갤러리 사이를 더 쉽게 오갈 수 있게 해줍니다. - - TOPIC: 폴더 트리 +image: folder-tree.png - 처음에는 모든 최상위 이미지 폴더가 표시됩니다. [+]를 클릭해 하위 폴더를 펼치거나 [-]를 클릭해 다시 접으세요. 어떤 폴더든 클릭해 그 폴더의 이미지 갤러리를 볼 수 있습니다. 이미지 컬렉션 어디로든 이동하려면 창을 열어 두세요. 이 기능은 갤러리 상단 패널의 [TOP] 버튼으로도 사용할 수 있습니다. - - TOPIC: 파일 선택 앨범을 만들거나 일괄 기능의 입력으로 사용할 이미지 파일을 미리 선택합니다. 이 기능들은 기본적으로 미리 선택한 파일을 사용하지만, 이를 수정하거나 처음부터 다시 시작할 수도 있습니다. {이미지 파일 선택} 절차를 참고하세요. - - TOPIC: 북마크 기존 북마크를 봅니다. 북마크는 사용자가 지정한 이름이 붙은 선택된 위치(폴더/파일 이름)입니다. 북마크를 클릭하면 그 위치부터 시작하는 thumbnail 갤러리가 표시됩니다. 북마크를 추가, 삭제, 또는 이름 변경하려면 [북마크 편집]을 선택하세요. - - TOPIC: 북마크 편집 북마크 편집을 시작한 후, 갤러리 thumbnail을 클릭해 이 위치를 북마크 목록에 추가하세요. 지정된 북마크 이름은 처음에는 thumbnail의 파일 이름입니다. 이름을 편집할 수 있습니다. 마우스 클릭으로 기존 북마크를 선택하면 입력란에 그 이름이 표시됩니다. 이름을 변경하거나 [삭제]를 눌러 북마크를 제거할 수 있습니다. 새 북마크는 마지막으로 선택한 북마크 위치 뒤에 삽입됩니다. 순서를 변경하려면 Fotocx 홈 폴더의 "bookmarks" 파일을 편집하세요. - - TOPIC: MAPS MENU - - TOPIC: 세계 지도 +image: map-click.jpg - 이것은 거리 수준부터 대륙 수준까지 배율을 조정(확대/축소)할 수 있는 인터넷 세계 지도입니다. 마우스 휠을 사용해 지도를 확대/축소하세요. 지도를 드래그해 중심을 변경하세요. 지도에는 metadata에 geotag 좌표가 있는 이미지에 해당하는 마커(빨간 점)가 있습니다. 마커를 클릭하면 이 위치의 이미지에 대한 갤러리 보기가 표시됩니다. 지도에서 마커 영역 내에 위치한 이미지가 선택됩니다. 유효 마커 영역은 지도 배율에 따라 조정됩니다. 배율을 확대하면 하나의 마커가 인접한 여러 마커로 나뉠 수 있습니다. - - TOPIC: 지도에 표시 현재 이미지 파일의 위치를 세계 지도에 표시합니다. 여러 마커가 겹쳐 있다면, 하나의 마커가 중앙에 올 때까지 확대하세요. - - TOPIC: 앨범 메뉴 - - TOPIC: 앨범 앨범은 기존 이미지에서 수동으로 모은 임의의 이미지 집합입니다. 앨범은 구성원 이미지 파일의 목록입니다. 이미지 파일 자체는 복사되거나 변경되지 않습니다. 특정 이미지 파일은 여러 앨범의 구성원이 될 수 있으며, 한 앨범 내에 두 번 이상 존재할 수도 있습니다. 앨범 내 이미지를 추가하거나 제거하거나 순서를 재정렬할 수 있습니다. 앨범을 만들고 나면 이름으로 선택할 수 있으며 갤러리로 표시됩니다. - - TOPIC: 앨범 만들기 새 앨범의 이름을 입력하세요. 빈 앨범, {파일 선택}에서 미리 선택한 이미지 파일이 있는 앨범, 현재 갤러리의 이미지가 있는 앨범을 만들 수 있으며, 앨범의 초기 이미지를 직접 선택할 수도 있습니다. - - TOPIC: 앨범 이름 바꾸기 기존 앨범을 선택하고 새 이름을 입력하세요. - - TOPIC: 앨범 삭제 기존 앨범을 선택해 영구적으로 삭제하세요. - - TOPIC: 앨범 선택 사용 가능한 앨범 목록이 표시됩니다. 목록에서 선택하세요. - - TOPIC: 현재 앨범 현재(마지막으로 사용한) 앨범으로부터 갤러리를 설정합니다. - - TOPIC: 갤러리를 앨범으로 현재 갤러리를 앨범으로 저장합니다. 기존 앨범 이름을 선택([찾아보기])하거나 새 이름을 입력하세요. - - TOPIC: 앨범 편집 앨범 thumbnail을 오른쪽 클릭하고 팝업 메뉴에서 선택하세요: • 여기에 선택한 파일 추가 - 이전에 선택한 파일이 여기에 추가됩니다 (thumbnail의 왼쪽/오른쪽을 클릭해 thumbnail 앞/뒤에 추가). • 여기에 현재 파일(파일 보기) 추가 - 같은 방식으로 작동합니다. • 앨범에서 제거 - 클릭한 파일이 앨범에서 제거됩니다. - ^드래그 앤 드롭 마우스로 thumbnail을 드래그해 앨범 내 이미지 순서를 재정렬할 수 있습니다. 마우스 커서가 작은 thumbnail 이미지로 바뀔 때까지 thumbnail을 드래그하세요. 삽입할 위치까지 이 이미지를 계속 드래그한 후 마우스 버튼을 놓으세요. 드래그한 이미지가 삽입될 thumbnail 사이 대략적인 위치에 마우스를 놓으세요. 드래그가 창의 위쪽이나 아래쪽 가장자리에 가까워지면, 갤러리가 스크롤되어 더 많은 이미지가 보이게 됩니다. 두 개의 Fotocx 세션을 사용하면 많은 이미지의 선택이나 이동을 더 빠르게 할 수 있습니다. 어떤 원본 갤러리에서든 이미지를 대상 앨범 위치로 드래그 앤 드롭할 수 있습니다. - Fotocx를 사용해 파일 이름을 바꾸거나 이동하면, 앨범 링크가 업데이트되어 파일이 포함된 앨범에 그대로 남아 있습니다. Fotocx 밖에서 이 작업을 하면 앨범 링크가 손실되어 파일이 앨범에서 사라집니다. - 일괄 변환이나 일괄 복사/이동을 사용해 이미지 파일의 이름을 바꾸거나 이동하는 경우, 원한다면 반드시 앨범 파일을 대체하는 옵션을 선택하세요. 그렇지 않으면 파일을 하나씩 대체해야 합니다. - 앨범에 포함된 이미지가 있는 폴더의 이름은 바꾸지 마세요. 앨범 링크가 손실됩니다. 대신 일괄 변환이나 일괄 복사/이동을 사용해 이미지 파일을 새 폴더로 이동한 후, 비어 있으면 이전 폴더를 삭제하세요. 이미지 파일을 삭제하려면 일괄 삭제/휴지통을 사용하세요. 이렇게 하면 삭제된 파일이 앨범에서도 제거됩니다. - - TOPIC: 앨범 업데이트 +image: album-replace-file.png - 지정한 앨범 파일을 지정한 대체 파일로 바꾸거나, 지정한 기존 파일 뒤에 지정한 새 파일을 추가합니다. 처리할 앨범을 하나 이상 선택하세요. 갤러리 보기에서 두 thumbnail을 클릭해 위 대화 상자에서 '이전 파일'과 '새 파일'을 지정하세요. 옵션을 선택하세요: '새 파일'이 발견되는 모든 곳에서 '이전 파일'을 대체하거나, '새 파일'이 '이전 파일' 뒤에 앨범에 추가됩니다. [proceed]을 눌러 앨범을 처리하세요. 처리 후, 같은 앨범이 선택되고 같은 '대체 또는 추가' 옵션이 적용된 상태로 대화 상자가 반복됩니다. 파일 두 개를 더 선택하고 [proceed]을 누를 수 있습니다. - - TOPIC: 앨범 일괄 업데이트 +image: album-mass-update.png - 이는 많은 이미지 파일에 대해 새 버전을 만든 후 하나 이상의 앨범을 새 버전으로 업데이트해야 할 때 필요할 수 있는 일괄 업데이트용 유틸리티입니다. 모든 요구를 다루지는 못하며(사실상 불가능한 일이지만), 파일을 하나씩 변경해야 할 필요를 줄여 줄 것입니다. - 앨범을 하나 이상 선택한 후 다음 처리 옵션 중 하나를 선택하세요: • 최신 버전으로만 모두 바꾸기: 앨범이 최신 파일 버전만 갖도록 업데이트됩니다. • 모든 버전을 최신 버전으로 바꾸기: 모든 파일 버전이 최신 버전으로만 대체됩니다. 원본 파일이 있다면 대체되지 않습니다. • 최신 버전을 기존 버전에 추가: 최신 버전이 없는 경우 기존 버전에 추가됩니다. • 모두 원본과 모든 버전으로 바꾸기: 모든 파일이 원본 파일과 모든 버전으로 대체됩니다. • 모두 원본 버전과 최신 버전으로 바꾸기: 모든 파일이 원본 파일과 최신 버전으로 대체됩니다. • 모두 선택한 버전으로 바꾸기(*): 모든 파일이 선택한 버전으로만 대체됩니다. 여기에는 원본(버전 없음) 파일이 포함됩니다. • 모든 버전을 선택한 버전으로 바꾸기(*): 모든 파일 버전이 선택한 버전으로만 대체됩니다. 원본 파일이 있다면 대체되지 않습니다. • 선택한 버전을 기존 버전에 추가(*): 선택한 버전이 없는 경우 기존 버전에 추가됩니다. • 모두 원본과 선택한 버전으로 바꾸기(*): 모든 파일이 원본 파일과 선택한 버전으로 대체됩니다. - (*) 선택한 파일을 사용하는 네 가지 옵션: 선택한 파일 목록은 {파일 선택} 기능에서 가져옵니다. 선택한 파일과 일치하지 않는 앨범 파일은 앨범에 그대로 남습니다. 선택한 파일과 일치하는 파일만 위 규칙에 따라 변경됩니다. 일치 여부는 버전이나 확장자를 제외한 파일 이름을 기준으로 합니다: 'asdfg.png'와 'asdfg.v01.jpg'는 일치합니다. - 예: 모든 버전을 선택한 버전으로 바꾸기: 앨범에 filename.jpg와 filename.v02.png가 있고, 선택한 파일 목록에 filename.v04.jpg가 있다면, 업데이트된 앨범의 결과는 다음과 같습니다: filename.jpg와 filename.v04.jpg - - TOPIC: 슬라이드 쇼 +image: slide-show.jpg - ^모니터 소수점 배율(Fractional Scaling) 일부 시스템에서는 소수점 배율로 인해 Fotocx 슬라이드 쇼 애니메이션에 성능 문제가 발생합니다. 필요하다면 이를 비활성화하고 다른 방법으로 애플리케이션의 글꼴 크기를 늘리세요. Fotocx의 경우 글꼴 크기는 {설정} 메뉴에 있습니다. - 슬라이드 쇼 대화 상자(왼쪽 위)에서 [앨범 선택]을 누르고 제공된 목록에서 앨범을 선택하세요. 원하는 대로 대화 상자의 다른 설정을 변경한 후, [시작] 버튼을 눌러 앨범의 첫 이미지부터 슬라이드 쇼를 시작하거나, [재개]를 눌러 일시 정지된 슬라이드 쇼를 재개하거나, thumbnail을 클릭해 다른 이미지를 선택하세요. Escape 키를 사용해 슬라이드 쇼를 종료하고 대화 상자로 돌아가세요. - 메인 대화 상자 컨트롤 • 캡션 시간: 제목과 설명을 표시할 시간(초). • 이미지 시간: 이미지만 표시할 시간(초). • 클립 한계 %: 여백을 없애기 위해 이 정도까지 이미지를 클립합니다. • 전체 화면: 체크하면 이미지가 메뉴 등 없이 전체 화면으로 표시됩니다. • 자동 재생: 체크하면 슬라이드 쇼가 끝난 후 다시 시작됩니다. • 무작위 이미지: 체크하면 무작위 이미지 순서를 사용합니다. 그렇지 않으면 앨범 순서를 사용합니다. - 키보드 키로 슬라이드 쇼를 제어할 수 있습니다. 보려면 [키보드]를 누르세요. - 다음 키보드 키는 동작에 지정되어 있으며 변경할 수 없습니다: • Escape: 슬라이드 쇼를 중단하고 메인 대화 상자로 돌아갑니다. • 왼쪽/오른쪽 화살표 키: 언제든지 앞뒤로 이동할 수 있으며 슬라이드 쇼는 그 지점부터 계속됩니다. - 이미지 간의 애니메이션 전환, 개별 이미지의 표시 시간과 zoom 동작은 아래 설명된 대화 상자를 사용해 사용자 지정할 수 있습니다. - [전환]를 눌러 이미지 간 전환을 선택하고 사용자 지정하는 대화 상자를 시작하세요. 여기에는 이미지를 교체하는 다양한 애니메이션 방법이 포함됩니다(예: 새 이미지가 중심에서부터 확장되어 이전 이미지를 대체). 사용할 전환을 선택하고 무작위로 사용할지 순서대로 사용할지 선택하세요. 시간 매개변수는 전환 지속 시간을 설정합니다. 환경설정 매개변수는 상대적 선호도를 지정하며, 무작위 순서가 선택되었을 때 그 전환이 얼마나 자주 사용될지에 영향을 줍니다. - [불러오기]와 [저장] 버튼을 사용하면 전환 설정을 파일에 저장했다가 나중에 불러올 수 있습니다. 이 파일들은 슬라이드 쇼 파일과는 독립적입니다. 슬라이드 쇼는 기본적으로 그 슬라이드 쇼(앨범 이름)에서 마지막으로 사용한 전환 설정을 사용하지만, [불러오기] 버튼으로 다른 설정을 불러오거나 대화 상자에서 직접 변경해 언제든 이를 바꿀 수 있습니다. - [이미지 파일]를 눌러 이미지 환경설정(오른쪽 위) 대화 상자를 시작하세요. 이는 선택 사항입니다. 앨범/갤러리 화면에서 thumbnail을 클릭해 사용자 지정할 이미지를 선택합니다. 대화 상자에는 기본 설정이나 이 슬라이드 쇼에서 이 이미지에 대한 이전 설정이 채워집니다. 수정 내용을 입력하고 [done]를 누르거나, 사용자 지정할 다음 이미지를 클릭하세요. - 환경설정: 무작위 이미지 순서가 선택된 경우, 이 숫자는 이미지의 상대적 선호도를 나타냅니다. 중립 값은 10입니다. 새 값을 입력해 무작위 이미지 순서에서 이 파일이 선택될 확률을 높이거나 낮추세요. 예를 들어 20이라는 값은 확률을 2배로 만듭니다. 0이라는 값은 이미지가 표시되지 않도록 합니다. 이미지는 또한 앨범 내 이미지 수의 1/3 또는 10 중 더 작은 수만큼 차단됩니다. - 대화 상자는 사용자 지정 가능한 이미지 이벤트를 시간 순서대로 보여줍니다: • 지정한 시간만큼 대기 (0일 수 있음). • 다음 텍스트 tags를 동시에 표시: 지정한 시간 동안 이미지 이름(파일 기본 이름), 있는 경우 지정한 시간 동안 이미지 제목, 있는 경우 지정한 시간 동안 이미지 설명. • 이미지 zoom을 시작하기 전에 지정한 시간만큼 대기 (0일 수 있음). • 지정한 시간에 걸쳐 이미지를 일반 크기에서 확대하거나 그 반대로 zoom. 둘 다 선택하지 않으면 zoom이 없습니다. • 확대(zoom-in): 일반 크기에서 시작해, zoom 중심을 지정한 위치로 이동하면서 이미지를 확대합니다. • 축소(zoom-out): 지정한 zoom 중심에서 확대된 크기로 시작해, 이미지를 원래 크기로 축소합니다. • [zoom center] - 이 버튼을 누른 후, 이미지 thumbnail을 클릭해 이미지의 zoom 중심을 지정하세요. • zoom 후 지정한 시간만큼 대기 (0일 수 있음) (기본값은 메인 대화 상자의 '이미지 시간' 설정입니다). • 지정한 전환을 사용하거나, 선호도가 없음을 나타내는 'next'(무작위 선택)를 사용해 다음 이미지로 전환. - - TOPIC: 사용자 지정 메뉴 +image: custom-menu.png - 이를 통해 여러 메뉴의 자주 사용하는 기능을 하나의 사용자 지정 메뉴에 모을 수 있습니다. 특정 이미지 파일이나 앨범을 여는 항목을 추가할 수도 있습니다. 이 메뉴에는 스크립트 기능과 플러그인 기능도 포함됩니다 (아래 참고). - 메뉴의 마지막 항목인 메뉴 편집은 메뉴 목록 자체를 편집하는 텍스트 편집기를 엽니다. 메뉴 이름은 Fotocx 메뉴의 이름과 정확히 일치해야 하지만, 대소문자는 구분하지 않습니다. - 메뉴 항목은 다음 형식을 가질 수 있습니다: • # 주석 텍스트: 아무 동작도 하지 않는 주석 • menuname # 팝업 팁: Fotocx 메뉴 이름과 선택적 팝업 팁 • file : 지정한 파일 열기 • album : 지정한 앨범을 갤러리로 열기 - 다음 항목은 기본적으로 존재하며 변경하거나 제거하지 말아야 합니다: 스크립트 편집, 스크립트 실행, 일괄 스크립트, 플러그인, 메뉴 편집. 자세한 내용은 아래에서 설명합니다. - - TOPIC: 스크립트 파일 메뉴 기능: • 스크립트 편집 - 하나의 이미지 파일에 일련의 편집을 수행하며, 모든 기능과 설정을 지정한 스크립트 파일에 기록합니다. • 스크립트 실행 - 편집 기능처럼 현재 이미지 파일을 사용해 스크립트 파일을 실행합니다. • 일괄 스크립트 - 여러 이미지 파일을 선택해 일괄 모드로 모두에 스크립트 파일을 실행합니다. - 스크립트 파일을 사용하면 편집 내용을 한 번 정의한 후, 나중에 단일 또는 여러 이미지 파일에 반복 적용할 수 있습니다. - ^스크립트로 만들 수 있는 편집 기능 일부 편집 기능은 이미지 위에서 마우스 드래그를 사용합니다(예: 모든 왜곡 기능). 마우스 드래그는 기록되지 않으므로 이는 스크립트로 만들 수 없습니다. 이러한 기능의 사용은 차단됩니다. - 현재 다음 기능은 스크립트로 만들 수 있습니다: • 편집: 리터치, 여백, 색상 모드, 영역 채우기 • 복구: 선명하게, 일반 블러, 그라데이션 블러, 노이즈 제거, 안개 제거, JPEG 아티팩트, 안티앨리어스, RGB 조정 • 보정: 히스토그램 평탄화, 로컬 대비, 대비 증폭, 전역 레티넥스, 로컬 레티넥스, 로컬 대비, 채도, 소프트 포커스, 밝기 그라데이션 • 효과: 윤곽선, 스케치, 카툰, 엠보싱, 타일1, 타일2, 페인팅, 텍스처, 패턴, 디더, 판화 효과, 색상 설정, 색상 전환, 사용자 지정 커널 - - TOPIC: 스크립트 편집 대화 상자에서 [시작]을 누르세요. 스크립트의 파일 이름을 선택하세요. 현재 이미지 파일 편집을 시작하세요. 원하는 편집 기능을 원하는 순서로 사용하세요. 각 편집은 사용된 모든 대화 상자 설정과 함께 스크립트 파일에 기록됩니다. 완료되면 [close]를 눌러 스크립트 파일을 닫고 지정한 파일 이름으로 저장하세요. - - TOPIC: 스크립트 실행 팝업 메뉴에서 저장된 스크립트 파일 중 하나를 선택하세요. 일반 편집 기능처럼 현재 이미지 파일을 사용해 스크립트가 실행됩니다. - - TOPIC: 일괄 스크립트 대화 상자에서 [파일 선택]을 누르세요. 표준 파일 선택 대화 상자({이미지 파일 선택})를 사용해 편집할 파일을 선택하세요. 완료되면 [스크립트 선택]을 누르세요. 팝업 메뉴에서 스크립트 파일을 선택하세요. 이제 선택한 모든 파일에 스크립트가 실행됩니다. 수정된 모든 이미지는 새 버전으로 저장됩니다. RAW 파일이 처리되면 해당 출력은 TIFF-16 파일이 됩니다. - - TOPIC: 플러그인 +image: plugins.png - 플러그인 기능은 Fotocx 내에서 Gimp와 같은 다른 이미지 편집기를 사용하는 방법입니다. Rawtherapee와 같은 RAW 이미지 편집기를 사용한 후 Fotocx로 추가 편집을 수행할 수 있습니다. - ^사용 절차: • Fotocx에서 처리할 파일을 여세요 • 플러그인 메뉴를 시작하고 원하는 프로그램(예: Gimp)을 선택하세요 • 플러그인 프로그램이 시작되어 Fotocx에서 전달된 파일을 엽니다 • 플러그인 프로그램을 사용해 원하는 편집을 수행하세요 • 완료되면 입력 파일과 같은 이름으로 출력 파일을 저장하세요. 파일 확장자는 변경될 수 있습니다. • 플러그인 프로그램을 닫으세요. • Fotocx는 플러그인 출력 파일을 현재 파일의 편집된 버전으로 엽니다. • 추가 편집을 수행하거나, 편집된 파일을 새 버전이나 새 파일로 저장하세요. - 예시 플러그인 메뉴가 왼쪽에 있습니다. 마지막 항목 "플러그인 편집"은 오른쪽의 텍스트 편집 애플리케이션을 시작합니다. 텍스트 편집기를 사용해 플러그인 메뉴 이름과 해당 플러그인 프로그램을 시작하는 명령을 정의하세요. 형식은 다음과 같습니다: menuname = plugin-command %s TIP = 위 명령에 대한 설명 'plugin-command'는 플러그인 기능을 위한 셸 명령이며, '%s'는 현재 파일 이름이 명령에 삽입되는 위치입니다. '%s' 주위에 따옴표를 넣지 마세요. 이는 자동으로 추가되며, 공백이나 다른 특수 문자가 있는 파일 이름도 처리할 수 있게 해줍니다. 위에 표시된 예시는 "gimp %s" 명령을 시작하는 "Gimp"라는 메뉴입니다. TIP 텍스트는 선택 사항입니다. 있는 경우 메뉴 이름 다음 줄에 위치합니다. 메뉴 항목 위에 마우스를 올리면 이 텍스트가 메뉴 텍스트 옆에 표시됩니다. - 일부 명령은 입력 파일과 출력 파일을 모두 지정하기를 기대할 수 있습니다. 이 경우 두 위치 모두에 '%s'를 넣으세요. 명령이 이미지 파일을 처리하지 않는다면 '%s'를 생략하세요. - ^영역 선택 입력 파일에 선택된 영역이 있으면, 이 영역만 수정됩니다. 플러그인 기능은 전체 이미지를 편집하지만, 결과가 Fotocx에서 처리될 때는 선택된 영역의 변경 사항만 유지됩니다. - - TOPIC: ZOOM - ^Zoom 버튼 버튼을 왼쪽 또는 오른쪽 클릭해 {파일 보기}의 이미지 크기나 {갤러리 보기}의 thumbnail 크기를 늘리거나 줄이세요. 이는 갤러리 보기 모드가 {Thumb 보기}일 때만 적용됩니다. {metadata 보기}라면 아무 동작도 하지 않습니다. - - TOPIC: 이전/다음 - 버튼을 왼쪽 또는 오른쪽 클릭해 현재 갤러리의 이전 또는 다음 파일을 여세요. 왼쪽/오른쪽 화살표 키도 사용할 수 있습니다. - - TOPIC: 파일 저장 - +image: file-save.png - +image: file-save-as.jpg - 첫 번째 대화 상자에서 '새 버전', '새 파일', 또는 '파일 대체'를 선택하세요. - ^새 버전 새 버전 번호로 현재 이미지 파일을 저장합니다. 버전 번호가 있는 파일 이름은 "filename.vNN.ext" 형식이며, NN은 01부터 99까지의 숫자입니다. 파일 이름에 버전이 없으면 .v01 버전이 생성됩니다. 디스크에 이미 파일 버전이 있다면 다음으로 높은 버전 번호가 사용됩니다. 파일이 JPEG 파일이라면 기본 품질이 사용됩니다 - {설정}을 참고하세요. - ^새 파일 위에 표시된 두 번째 대화 상자가 열려 현재 이미지를 선택한 파일(원본 파일, 다른 기존 파일, 또는 새 파일)로 저장합니다. 파일은 JPEG, PNG, JXL, TIFF 형식으로 저장할 수 있습니다. - JPEG의 경우 1~100 범위의 품질 값을 선택할 수 있습니다. 값이 낮을수록 파일이 작아지고 이미지 품질이 낮아집니다. 70 이상의 값은 100(최고 품질, 최대 파일 크기)과 구분하기 어렵습니다. 대화 상자에서 값을 변경하지 않으면 기본 JPEG 품질이 사용됩니다. 기본값은 {설정}에서 가져옵니다. 품질 70으로 저장한 파일과 100으로 저장한 파일 사이의 차이는 눈으로 알아보기 어렵지만, 파일 용량 차이는 매우 큽니다. 투명한 영역은 검은색이 됩니다. JPEG는 투명도를 지원하지 않습니다. - PNG와 TIFF 파일은 품질 손실 없이 압축되며 JPEG보다 훨씬 큽니다. 색상당 8비트 또는 16비트로 저장할 수 있습니다. - '현재 파일로 설정'을 체크하면, 저장된 파일(새 파일 이름)이 현재 파일이 됩니다. - ^파일 대체 현재 이미지 파일을 자기 자신에게 다시 저장합니다. - ^권한^은 입력 파일에서 복사됩니다. 권한을 편집하려면 [변경] 버튼을 누르세요. - - TOPIC: metadata 메뉴 - - Metadata는 이미지 파일 내부에 저장되는 텍스트 데이터입니다. 디지털 카메라는 날짜와 시간, 카메라와 촬영 매개변수에 대한 기술 데이터, (카메라에 GPS 수신기가 있다면) 위치 데이터와 같은 일부 metadata를 자동으로 생성합니다. 다른 데이터는 사용자가 추가할 수 있습니다(예: 제목, 설명, 평점, keywords). Fotocx는 폴더 및 파일 이름이나 부분 이름과 함께 어떤 metadata든 사용해 이미지 컬렉션을 검색하여 일치하는 이미지의 갤러리를 만들 수 있습니다. 대부분의 경우 검색은 거의 즉각적입니다. - - TOPIC: 주 metadata 보기 TOPIC: 모든 metadata 보기 +image: view-metadata.jpg - 주 metadata 보기 기능은 현재 이미지 파일에 대해 일반적으로 유용한 metadata를 표시합니다. 여기에는 사진의 날짜와 시간, 셔터 속도, 초점 거리, 이미지 크기, ISO 등이 포함됩니다. 디지털 카메라는 이 데이터를 이미지에 저장합니다. Metadata에는 사용자가 추가한 데이터도 포함될 수 있습니다: keywords, 제목 또는 캡션, 설명, 촬영자나 이후 편집자가 추가한 코멘트(공개된 이미지에서 종종 발견됨). - 이미지가 편집되면 편집 기록이 metadata에 저장됩니다. 주 metadata 보기는 이루어진 편집의 기록을 보여줍니다. - 모든 metadata 보기는 사용 가능한 모든 metadata를 보고하며, 관심 없을 만한 100개가 넘는 항목이 포함될 수 있습니다. - 주 metadata 보기 창의 [Extras] 버튼을 누르면 오른쪽에 표시된 대화 상자가 열리며, 여기서 보고서에 추가 tags를 넣을 수 있습니다. 모든 metadata 보기 보고서에서 사용 가능한 모든 tag를 간단한 보고서에 추가할 수 있습니다. 왼쪽 열의 tag를 클릭하면 오른쪽 열과 보고서에 추가됩니다. 오른쪽 열의 tag를 클릭하면 제거됩니다. "다른 Tag ..." 항목을 클릭하면, 가장 필요할 만한 tags로 제한된 기본 목록에 없는 tag 이름을 직접 입력할 수 있습니다. - Fotocx는 이미지 편집과 검색에 다음 metadata tags를 사용합니다: • 제목 - 이미지의 짧은 제목 • 설명 - 이미지에 대한 설명 • 촬영 날짜/시간(Date/Time Original) - 사진의 날짜/시간 • 평점 - 0~5점 • 국가 - 카메라 GPS에서 가져오거나 수동으로 추가 • 위치 - EXIF 이름은 도시입니다 • Geotags - latitude/longitude • Keywords - 사용자가 지정한 이미지 식별자 • 카메라 데이터 - 제조사, 모델, 렌즈 • 노출 데이터 - 시간, F값, 초점 거리, ISO 이 tags는 {주 metadata 편집} 기능을 사용해 편집합니다. 다른 tags도 아래에서 설명하는 덜 편리한 방법으로 편집하고 검색할 수 있습니다. - 한 번에 여러 이미지 파일에 데이터를 추가하는 여러 일괄 기능도 있습니다. {일괄 메뉴}를 참고하세요. - - TOPIC: Keywords 개요 이미지 파일에는 식별 또는 분류용 keywords를 지정할 수 있습니다. 이를 사용해 대규모 이미지 컬렉션에서 원하는 keywords가 있는 이미지를 검색할 수 있습니다. 일반적인 keywords: 주제, 이벤트, 위치, 인물이나 사물 등. Keywords는 이미지 metadata 내부에 저장됩니다. Keywords는 보통 한 단어이지만, 공백이나 다른 구분자가 포함된 짧은 구문도 사용할 수 있습니다. 쉼표와 세미콜론은 keywords 사이의 구분자로 사용되므로 keyword 안에는 사용할 수 없습니다(외부 표준). "arizona scenery"와 같은 복합 keyword도 허용되지만, 더 유연하게 사용하려면 두 개의 keyword를 대신 사용해야 합니다: 그러면 둘 중 하나의 keyword가 있는 이미지나 둘 다 있는 이미지를 검색할 수 있습니다. - 원하는 keyword나 keywords가 있는 모든 이미지를 빠르게 찾아 갤러리 창에 표시할 수 있습니다. 폴더와 파일 이름을 의미 있게 사용했다면, 이 이름들을 사용해 이미지를 검색할 수도 있습니다. 날짜, 평점, 위치, 기타 metadata tags로도 이미지를 검색할 수 있습니다. 이는 keywords에 중복해서 넣을 필요가 없습니다. 아래의 {이미지 검색}을 참고하세요. - ^관리형 Keyword 시스템 이는 이미지에 keywords를 추가하기 전에 keyword 시스템을 계획하고 싶을 때 적합합니다. 이 시스템에서는 제한된 수의 keyword 카테고리(예: 인물, 장소, 사물, 이벤트, 예술, 풍경 등)를 만듭니다. Keywords는 이미지에 할당될 때 필요에 따라 생성되어 카테고리에 배정될 수 있습니다. 이미지에는 사용 가능한 keywords 목록을 가리키고 클릭해 keyword를 지정하며, 이 목록은 카테고리별로, 카테고리 내에서는 알파벳순으로 정리되어 있습니다. 새 keyword가 필요하면 이미지에 처음 지정될 때 생성됩니다. 선택 목록에서 시각적으로 빠르게 찾을 수 있도록, 카테고리 내 keywords 수는 이상적으로 약 200개 미만이어야 합니다. - ^관리형 keyword 시스템의 장점 • 일관성 없는 keyword 이름 방지 (예: 'landscape'와 'scenery') • 다른 철자와 오타 방지 (예: susan, susy, susna) • 다른 keyword를 포함하는 keyword 방지 (예: scenery, lake) • keywords에 위와 같은 오류가 없으므로 검색이 더 신뢰할 수 있습니다 • keywords를 지정할 때, 관리되지 않는 시스템의 수천 개의 무질서한 keywords 대신 사용 가능한 keywords의 개요를 볼 수 있습니다 - 큰 목록에서 keywords를 선택하는 것은 느릴 수 있습니다. 이는 세 가지 방법으로 완화됩니다: • 최근에 사용한 최대 약 10개의 keywords가 metadata 편집 대화 상자에 표시되어 쉽게 보고 선택할 수 있습니다. 같은 시기에 찍은 일련의 사진은 많은 keywords를 공유할 가능성이 높으므로, keywords 추가가 더 쉽고 빨라집니다. • 원하는 keyword 이름을 입력하기 시작하면 됩니다. 가능한 일치 항목이 몇 개로 줄어들면 즉시 일치하는 keywords의 팝업 목록이 나타납니다. 그런 다음 원하는 keyword를 클릭해 이미지에 추가할 수 있습니다. 일치하는 keyword가 없다면 새 keyword를 정의된 keywords 목록에 추가하는 옵션이 있습니다. • 더 작은 선택 목록을 표시하려면 카테고리를 선택할 수 있습니다. - keywords가 폭넓게 정의되어 개수가 적다면, keywords에 대한 검색 결과는 더 많아지지만 원하는 이미지를 시각적으로 찾는 것은 꽤 빠를 수 있습니다. 실제 파일 순서가 유지됩니다: 폴더에서 함께 위치한 이미지 파일은 검색 결과에서도 함께 나타납니다. - 인터넷에서 다운로드한 이미지에는 종종 keywords가 포함되어 있습니다. 이들은 당연히 체계가 없고 전체적으로 무질서합니다. 관리형 keyword 시스템을 사용한다면, 이러한 이미지를 검토해 keywords를 시스템에 맞게 정리하거나 삭제하는 것이 가장 좋습니다. 새로 추가되는 keywords는 무엇이든 자동으로 "nocatg" 카테고리 아래에 추가됩니다. keyword 목록에서 원치 않는 keywords가 보인다면, {이미지 검색}을 keyword로 사용해 원치 않는 keywords가 있는 이미지를 찾아 수정하거나 제거하세요. - ^무작위 Keyword 시스템 특별한 시스템 없이 필요할 때마다 keywords를 만드는 것을 선호할 수도 있습니다. 또는 이미 수천 개의 keywords가 있어 관리형 keyword 시스템으로 전환하기 어려울 수도 있습니다(하지만 불가능하지는 않습니다: Fotocx는 keyword 이름을 대량으로 변환할 수 있습니다). 이 경우, 필요할 때마다 새 keywords를 만들면서 이미지에 keywords를 그냥 입력하면 됩니다. keywords를 정리된 상태로 유지할 수 있는 방법이 여전히 있습니다: 입력한 문자와 일치하는 기존 keywords가 가능한 일치 항목이 몇 개로 줄어들자마자 표시됩니다. 예: "new"를 입력하면 New York, New Delhi, Newman 등의 keywords 목록이 표시됩니다. 이 중 하나가 의도한 것이라면 클릭해 keyword를 선택하세요. 그렇지 않다면 계속 입력한 후 마침내 Enter를 눌러 새 keyword를 만드세요. keywords로 이미지를 검색할 때, 원하는 keyword 이름을 입력하거나 사용 가능한 keywords 목록에서 선택할 수 있습니다. 입력한 처음 몇 글자와 일치하는 사용 가능한 keywords가 표시되며, 이 목록에서 선택할 수 있습니다. 이미지 어딘가에 존재하지 않는 검색 keyword는 입력할 수 없습니다. 무작위 keyword 시스템은 결국 수천 개의 keywords로 이어질 가능성이 높습니다. 이는 그다지 유용하지 않을 수 있습니다. - - TOPIC: GEOTAGS OVERVIEW 최신 카메라는 내장 GPS 수신기를 사용해 각 사진의 위치를 기록할 수 있습니다. Latitude, longitude(그리고 가능하면 도시/위치와 국가)가 이미지 파일의 EXIF metadata에 기록됩니다. {주 metadata 편집} 기능으로도 위치 데이터를 입력하거나 수정할 수 있습니다. 확대 가능한 세계 지도를 클릭해 위치를 지정할 수도 있습니다. 지정한 위치나 지역의 이미지를 찾는 기능: • {이미지 검색}: 위치 이름으로 검색 (여러 이름, 부분 일치도 가능) • {장소/날짜}: 국가, 위치, 날짜 그룹으로 검색 • 지도 위치별 이미지: 지도 마커를 클릭해 마커 위치의 모든 이미지 표시 - 카메라 GPS에서 가져온 위치 이름(도시나 다른 장소 이름, 국가)은 표준화되어 있지 않아 무질서할 수 있습니다(예: Munich, München, MONACO). 이를 처리하는 방법은 아래에서 설명합니다. - - TOPIC: 주 metadata 편집 +image: edit-meta.jpg - 주 metadata 편집 기능은 이미지에 기본 metadata를 추가하는 데 사용됩니다. 주 metadata 편집을 사용하기 전에 위의 {Keywords 개요}와 {GEOTAGS OVERVIEW}를 읽어 보세요. - 주 metadata 편집은 가장 자주 사용되는 metadata인 이미지 날짜와 시간, 평점, 제목, 설명, 위치 데이터, keywords를 편집하는 데 사용됩니다. 대화 상자에는 처음에 현재 이미지의 데이터가 표시됩니다. 추가나 변경 후 [적용]을 눌러 이미지 파일을 업데이트하세요. metadata 변경에는 자동 파일 버전 관리가 없지만, 원한다면 파일 저장 > 새 버전을 사용할 수 있습니다. - 대화 상자에는 파일 보기의 현재 이미지나 갤러리 보기에서 클릭한 thumbnail의 metadata가 표시됩니다. 새 이미지를 열거나 새 thumbnail을 클릭하면 편집 대화 상자가 자동으로 업데이트됩니다. - 이미지의 날짜는 사용 가능한 경우 이미지 날짜로 표시됩니다. 없으면 입력하거나 변경할 수 있습니다. 전체 날짜를 yyyy:mm:dd 형식이나 더 짧은 yyyy 또는 yyyy:mm 형식으로 입력할 수 있습니다. 누락된 월/일은 검색용 하한과 비교할 때는 01:01과, 상한과 비교할 때는 12:31과 논리적으로 동일합니다. [이전] 버튼은 이전에 입력한 데이터로부터 날짜를 채워 넣습니다. 이는 일련의 이미지에 쉽게 날짜를 지정할 수 있게 해줍니다. 시간이 중요하다면 hh:mm[.ss] 형식으로 시간을 추가할 수 있습니다. 전체 입력 형식은: yyyy:mm:dd hh:mm:ss - 이미지에 대한 제목, 설명, 평점(0~5점)을 입력할 수 있습니다. 제목이나 설명을 편집하려면 해당 [편집] 버튼을 누르세요. 그러면 텍스트 크기 제한이 매우 큰 텍스트 편집기가 팝업으로 나타납니다. 의도적으로 줄바꿈하려면 [enter] 키를 사용할 수 있습니다. Fotocx에서는 이러한 줄바꿈이 작동하지만, 다른 이미지 뷰어에서는 마침표로 대체될 수 있습니다. - 기존 keywords는 이미지 Keywords에 표시됩니다. 사용 가능한 keywords는 아래의 정의된 Keywords 창에 표시됩니다. 이 keywords 중 하나를 클릭하면 이미지에 추가됩니다. 이미지 Keywords에서 keyword를 클릭하면 이미지에서 삭제됩니다. 최근에 추가된 keywords는 최근 Keywords에 표시됩니다. 이는 같은 keywords가 다시 많이 사용될 것이므로 새로운 이미지 배치에 keywords를 더 쉽게 추가할 수 있도록 하기 위한 편의 기능입니다. 같은 방식으로 가리키고 클릭하세요. - 정의된 keywords 목록이 길다면, Keyword 입력에 원하는 keyword를 입력하는 것이 더 쉬울 수 있습니다. 지금까지 입력한 내용과 일치하는 기존 keywords가 일치하는 Keywords에 나타나며, 이 중 하나를 클릭해 keyword를 이미지에 추가할 수 있습니다. 입력한 keyword가 새로운 것이라면(일치하는 keyword가 표시되지 않음), keyword를 완성한 후 [새 keyword 추가]를 누르세요. 이미지와 "nocatg" 카테고리의 정의된 keywords 목록에 추가됩니다. - keyword 카테고리를 사용 중이라면 카테고리를 선택할 수 있으며, 정의된 keywords 목록에는 그 카테고리의 keywords만 표시됩니다. - [적용] 버튼은 데이터를 이미지 파일과 이미지 검색에 사용되는 metadata 색인 파일에 씁니다. - [이전] 버튼(대화 상자 하단)을 사용하면 이전에 보거나 편집한 이미지의 모든 사용 가능한 데이터를 불러올 수 있습니다. 이는 같은 데이터를 많이 공유하는 이미지 그룹의 처리 속도를 높이는 데 사용할 수 있습니다. - ^Geotag 추가 {주 metadata 편집} 대화 상자에서 위치 이름과 geotag 좌표를 추가하는 방법은 여러 가지가 있습니다. - 카메라 GPS 카메라 GPS 센서가 위치 이름과 geotag 좌표를 삽입했을 수 있습니다. 원하는 언어가 아니거나, 모두 대문자로 되어 있거나, 다른 방식으로 무질서할 수 있습니다. [clear] 버튼을 사용해 처음부터 다시 시작하고 새 텍스트를 입력하세요. - [찾기] 버튼 이미지 파일 어딘가에 있거나 알려진 위치의 대규모 목록(worldcities.txt)에 있는 위치를 검색합니다. 위치에 처음 몇 글자를 입력하고 [찾기]를 누르세요. 일치하는 위치의 선택 목록이 표시되면 하나를 선택하세요. 아무것도 표시되지 않으면 [지도]를 사용해 지도 위치를 클릭하세요. 필요하다면 위치와 국가 이름을 수정하세요. 이제 이 위치는 알려진 위치가 되어 선택할 수 있습니다. - [이전] 버튼 편집 중인 이미지가 이전에 편집한 이미지와 같은 위치 데이터를 가지고 있다면, [이전]을 눌러 이전에 사용한 위치 데이터를 채우세요. - {geotag 일괄 설정}을 사용해 한 번에 여러 이미지 파일에 위치 데이터를 추가할 수 있습니다. - - TOPIC: 모든 metadata 편집 +image: edit-any-metadata.png - 이 대화 상자는 현재 이미지 파일의 모든 metadata를 편집하는 데 사용됩니다. 가장 일반적인 편집용 tags가 왼쪽에 나열됩니다. [전체 목록] 버튼을 눌러 현재 이미지 파일에 사용 가능한 모든 tags 목록을 확인하세요(수백 개가 될 수 있습니다). [간단 목록]을 눌러 일반 tags 목록으로 돌아가세요. 목록에서 tag를 클릭해 현재 tag 값을 가져오세요. 원한다면 값을 변경하고 [업데이트]를 누르세요. 목록에 없는 tag 이름을 편집하려면 tag 이름을 입력하고 [가져오기]를 눌러 현재 값(있는 경우)을 가져오세요. 그런 다음 값을 입력하거나 변경하고 [업데이트]를 누르세요. tag를 삭제하려면 [삭제]를 누르세요. tag 이름은 소문자로, 공백이 있거나 없이 입력할 수 있습니다. 예를 들어 "Subject Distance"와 "subjectdistance" 모두 작동합니다. 일부 tags는 변경할 수 없습니다. 예를 들어 'image width'는 이미지 픽셀 너비이며, 이미지 픽셀 너비를 변경해야만 바꿀 수 있습니다. 간단 목록의 출처는 텍스트 파일 /meta_picklist입니다. 이 목록에서 tags를 추가하거나 제거할 수 있습니다. - - TOPIC: metadata 삭제 삭제할 tag 이름을 지정하거나 All을 선택하세요. metadata가 삭제됩니다. All을 사용하면 이미지에 있을 수 있는 모든 식별 정보를 지울 수 있습니다. 일부 tags는 삭제할 수 없습니다. 예: 파일 이름. - - TOPIC: metadata 복사 Fotocx로 만든 결합 이미지(HDR, 파노라마, 매시업 등)는 기본적으로 metadata를 포함하지 않습니다. 이 기능을 사용해 입력 이미지 중 하나나 다른 이미지에서 metadata를 복사하세요. [찾아보기] 버튼을 사용해 metadata의 출처가 될 파일과 metadata를 받을 파일(대화 상자의 "대상 파일")을 선택하세요. - - TOPIC: metadata 복구 metadata를 편집하려고 할 때 오류 메시지가 나타나는 이미지 파일이 있다면 이 기능을 사용하세요. 손상된 metadata를 삭제하고 나머지는 유지합니다. - - TOPIC: Keywords 관리 +image: manage-keywords.png - keywords를 만들고 선택적으로 카테고리로 그룹화하세요. keywords에 카테고리를 지정하면 정리하고, 이미지에 keywords를 추가할 때 더 빨리 찾는 데 도움이 됩니다. 카테고리는 선택 사항이며 keyword 검색에는 아무 역할을 하지 않습니다: 이미지에는 keyword만 저장되며 카테고리는 저장되지 않습니다. 일반적인 카테고리는 인물, 장소, 사물, 이벤트, 풍경, 건물, 예술 등입니다. 새 카테고리로 새 keyword를 추가하려면 카테고리와 keyword를 입력한 후 [create]를 클릭하세요. 카테고리가 비어 있으면 keyword는 "nocatg"에 배정됩니다. keyword를 다른 카테고리로 배정하려면, 카테고리(굵은 텍스트)를 클릭하거나 새 카테고리를 입력하고, keyword를 클릭한 후 [create]를 누르세요. keyword가 이전 카테고리에서 새 카테고리로 이동합니다. keyword를 삭제하려면 keyword를 클릭하고 [삭제]를 누르세요. 이미지에 사용되었지만 카테고리에 배정되지 않은 keywords는 "nocatg" 아래에 나타납니다. keyword가 배정되지 않은 카테고리는 삭제할 수 있습니다 - 카테고리를 클릭하고, 있다면 keyword 이름을 지운 후 [삭제]를 누르세요. - 참고: 새로 만든 keyword는 해당 카테고리의 keyword 목록 끝에 추가됩니다. 다음에 Fotocx를 시작하면 모든 카테고리와 그 keyword 목록이 알파벳순으로 정렬되며, "nocatg"는 항상 마지막에 위치합니다. - - TOPIC: 캡션 +image: choose-captions.png - ^캡션 선택 메뉴 파일 보기 모드에서 이미지 왼쪽 위 모서리에 표시되는 텍스트 캡션에 사용할 metadata tags를 선택하세요. - ^캡션 전환 메뉴 캡션 표시를 켜거나 끕니다. 캡션 표시를 빠르게 사용하거나 사용 안 함으로 설정하려면 키보드 단축키를 지정하세요. - ^참고:^ 파일 보기에서 이미지의 왼쪽 위 모서리로 마우스를 이동하면 팝업 이미지에 제목과 설명이 표시됩니다. 마우스를 다른 곳으로 이동하면 이미지가 사라집니다. - - TOPIC: 장소/날짜 +image: image-locations.jpg - 이는 특정 위치나 위치와 날짜 범위에서 촬영된 모든 사진을 빠르게 찾는 방법입니다. 대화 상자에서 두 옵션 중 하나를 선택하세요: 보고서에 모든 이미지 포함, 또는 이전 검색 기능으로 찾은 이미지만 포함. 그런 다음 원하는 그룹화 수준을 선택하세요: 국가 국가 및 위치 국가 및 날짜 국가, 위치, 날짜 날짜 및 국가 날짜, 국가, 위치 - 날짜가 포함된다면, 통합할 날짜 범위를 선택하세요: 범위 내 날짜의 사진들은 첫 날짜 아래로 함께 그룹화됩니다. [proceed]를 눌러 각 그룹(국가별, 국가 및 위치별 등)의 이미지 개수를 보여주는 보고서를 확인하세요. 이는 정렬 순서이기도 합니다. 위 예시에서는 뉴질랜드에서 2004.11.02에 촬영된 사진이 28장입니다. 보고서의 한 줄을 클릭하면 해당 이미지의 thumbnail 갤러리가 표시됩니다. - - TOPIC: 타임라인 +image: timeline-report.jpg - 이 보고서는 월별 이미지 개수의 타임라인을 생성합니다. 두 옵션 중 하나를 선택하세요: 보고서에 모든 이미지 포함, 또는 이전 검색 기능으로 찾은 이미지만 포함. 결과 보고서에서 연도와 월을 클릭하면 선택한 월의 촬영 날짜(EXIF)를 가진 모든 이미지의 thumbnail 갤러리가 표시됩니다. 위 예시는 2017년 10월의 이미지 208장을 보여줍니다. 연도 'null'은 촬영 날짜가 없는 이미지를 나타냅니다. - - TOPIC: metadata tags 이 기능은 지정한 metadata tag와 값을 사용하는 모든 이미지 파일을 찾습니다. 팝업 목록에서 tag를 선택하세요: 평점, keywords, 제목, 설명, 카메라, 추가 색인된 metadata - {파일 색인}을 참고하세요. 사용 가능한 tag 값의 목록이 이 tag 값을 사용하는 이미지 파일 수와 함께 표시됩니다. '제목'과 '설명'의 경우 처음 60자만 표시되며, 이 처음 60자와 일치하는 tag 값을 사용하는 모든 파일이 보고됩니다. '카메라'의 경우 일치 값은 제조사, 모델, 렌즈의 조합입니다. - - TOPIC: 자동 검색 이 기능은 셸 스크립트 파일에서 이미지 검색 기능(아래 참고)을 사용할 때 이용 가능한 선택 기준을 만족하는 이미지 파일을 추출하는 데 사용할 수 있습니다. 먼저 이미지 검색 기능을 사용해 원하는 선택 기준(예: 폴더/파일 이름, 날짜, keywords, 기타 metadata)을 설정하세요. [저장] 버튼을 사용해 기준을 설정 파일에 저장하세요. 다음 명령을 사용해 Fotocx를 시작하고 검색을 수행하세요: $ fotocx -m autosearch . 출력은 /search_results에 저장됩니다. - - TOPIC: 이미지 검색 이미지 검색 기능을 사용해 원하는 metadata(날짜, keywords, 위치 등)를 가진 이미지를 찾으세요. 검색에는 metadata 색인 파일이 사용되며, 이를 통해 초당 수천 개의 이미지를 검색할 수 있습니다. - 두 가지 보고서 형식이 있습니다: 검색 기준과 일치하는 모든 이미지를 보여주는 thumbnail 갤러리, 또는 thumbnails와 metadata 텍스트를 결합한 metadata 보고서. 다음은 metadata 보고서 형식의 예입니다: +image: search-images-metadata.jpg - ^검색 대화 상자 +image: search-images.jpg - 대화 상자에서 검색할 이미지를 선택하세요: 전체(모든 이미지) 또는 현재 세트(현재 갤러리의 이미지로, 폴더, 앨범, 또는 이전 이미지 검색 결과일 수 있음) 중 하나입니다. - 다음으로, 찾은 일치하는 이미지로 무엇을 할지 선택하세요: '새 세트'는 찾은 이미지로 현재 세트를 대체하고, '추가'는 현재 세트(갤러리)에 추가하며, '제거'는 현재 세트에서 제거합니다. 이미지를 제거하려면 현재 세트를 검색해야 합니다. - 선택 기준과 일치하는 파일에 대해, 어떤 버전을 선택할지 추가로 지정할 수 있습니다: 원본, 마지막 버전, 또는 모든 버전. '원본'은 원본 또는 수정되지 않은 이미지(또는 원본이 저장되지 않았다면 첫 번째 버전)를 의미합니다. '마지막 버전'은 사용 가능한 최신 또는 마지막으로 편집된 버전을 의미합니다. '모든 버전'은 원본과 모든 버전을 가져온다는 의미입니다. - 원하는 보고서 유형을 선택하세요. 갤러리 보고서는 검색 기준과 일치하는 모든 이미지를 담기에 필요한 만큼 긴 thumbnail 이미지 페이지입니다. Metadata 보고서는 thumbnail 이미지와 각 thumbnail 옆의 metadata tags 목록을 모두 가지고 있습니다. 여기에는 표준 tags(날짜, 평점, keywords, geotags, 제목, 설명)와 tag 선택 목록(아래 참고)에서 추가한 다른 metadata tags가 포함됩니다. - 검색 기준을 입력하세요. 원하는 keywords, 날짜, 별점, 텍스트에 포함된 단어(이미지 제목이나 설명), 파일 또는 폴더 이름, 위치 이름을 선택하세요. 자세한 내용은 아래를 참고하세요. - 사용 가능한 keywords는 정의된 Keywords에 표시되며 가리키고 클릭해 선택할 수 있습니다. 정의된 keywords 목록이 길다면 'enter keyword'에 keyword를 입력하기 시작하는 것이 더 쉬울 수 있습니다. 지금까지 입력한 내용과 일치하는 기존 keywords가 'matches' 목록에 나타나며, 이 중 하나를 클릭해 keyword를 검색 목록에 추가할 수 있습니다. - keyword 카테고리를 사용 중이라면 카테고리를 선택할 수 있으며, 정의된 keywords 목록에는 그 카테고리의 keywords만 표시됩니다. - 날짜 범위 내 이미지로 검색을 제한하기 위해 날짜 범위를 입력할 수 있습니다. 촬영 날짜(카메라에서)나 파일 날짜(생성 또는 마지막 수정 날짜)를 선택하세요. 형식은 yyyy:mm:dd입니다. 첫 날짜가 있으면 그 날짜 이후, 두 번째 날짜가 있으면 그 날짜 이전의 이미지가 선택됩니다. 누락된 월/일은 하한에는 01/01, 상한에는 12/31이 기본값으로 사용됩니다. 시간은 선택적으로 yyyy:mm:dd hh:mm 형식으로 지정할 수 있습니다. 누락된 시간은 00:00과 23:59가 기본값입니다. - EXIF 촬영 날짜가 없는 이미지(예: 스캔한 이미지)를 검색하려면, 첫 번째 날짜 입력란에 "null"을 사용하세요. - 지정한 범위 내 평점을 가진 이미지로 결과를 제한하기 위해 한 쌍의 별점을 입력할 수 있습니다. 낮은 값이 없으면 0점을 의미하고, 높은 값이 없으면 최고 평점인 5점을 의미합니다. - 폴더와 파일 이름을 검색할 수 있습니다. 파일 이름 검색 필드에, 이미지 폴더와 파일 이름에 사용된 이름을 쉼표로 구분해 원하는 만큼 입력하세요. "egypt cairo"를 입력하면 이 문자열 중 하나라도 포함하는 모든 이미지 폴더나 파일 이름이 일치합니다. 부분 문자열도 일치합니다. 대소문자는 구분하지 않습니다. - 이미지 제목과 설명을 검색할 수 있습니다. 제목/설명 검색 필드에 검색할 단어를 쉼표로 구분해 입력하세요. 이는 모든 이미지의 제목과 설명에 있는 모든 단어와 비교되며, 일치하는 이미지가 선택됩니다. 대소문자는 구분하지 않습니다. - 위치를 검색하려면 위치 검색 필드에 하나 이상의 도시/위치 또는 국가 이름을 쉼표로 구분해 입력하세요. 입력한 위치 중 하나와 일치하는 geotags를 가진 이미지 파일만 선택됩니다. 위치는 도시, 공원, 또는 다른 지리적 이름(metadata 'City'와 'Country' 필드에 저장된 것)일 수 있습니다. 대소문자는 구분하지 않습니다. - 라디오 버튼 'all'과 'any'는 keywords, 텍스트, 파일 이름, 위치에 적용됩니다. 입력한 문자열을 모두 가진 이미지를 선택하거나, 입력한 문자열 중 아무거나 가진 이미지를 선택할 수 있습니다. 예: 위치 검색 필드가 "new york"이고 "any"가 선택되어 있다면, New Zealand와 England의 York에서 찍은 이미지도 포함됩니다. "all"이 선택되어 있다면, New York에 위치한 이미지만 포함됩니다. - 데이터가 누락된 이미지를 찾고 싶다면, 일치 값으로 "null"을 입력할 수 있습니다. - ^추가 Metadata 검색 대화 상자 입력란 'tagname', 'condition', 'match values'를 사용해 선택 기준으로 사용하거나, "metadata" 보고서 유형이 선택된 경우 보고서 출력에 추가할 추가 metadata tags를 지정할 수 있습니다. 특정 이미지 파일에 사용 가능한 tags는 {모든 metadata 보기}로 확인할 수 있습니다. 여기에는 메인 대화 상자에 없는 많은 tags가 포함됩니다. 선택 목록은 텍스트 파일 /meta_picklist에서 가져옵니다. 원한다면 이 파일에 tags를 추가할 수 있습니다. 메인 대화 상자에도 있는 tags를 사용할 수 있습니다. 여기서의 장점은 더 유연한 일치 로직을 사용할 수 있다는 것입니다. - 각 metadata tag에 대해 일치 로직을 선택할 수 있습니다. ^일치 방법 선택을 위한 일치 값 • report 어떤 값이든, 누락도 포함 • reportx 값이 누락되지 않음 • matches 쉼표로 구분된 텍스트 값 • contains 같지만 부분 문자열 일치 • number = 같은 값 • number => 같거나 더 큰 값 • number <= 같거나 더 작은 값 - 오른쪽의 [X] 버튼을 사용해 개별 metadata 검색 tags를 지울 수 있습니다. - ^대화 상자 버튼 [불러오기]와 [저장]을 사용해 파일에서 검색 기준을 불러오거나 저장할 수 있습니다. [지우기]는 대화 상자의 모든 데이터를 지웁니다. [계속]은 검색 과정을 시작합니다. - [proceed] 버튼을 눌러 검색을 수행하세요. 출력은 표준 thumbnail 갤러리나 위에 표시된 metadata 보고서 형식입니다. 검색된 이미지를 영구 앨범으로 저장할 수 있습니다 - {앨범}을 참고하세요. - ^성능 색인된 metadata의 검색과 보고는 거의 즉각적입니다. 색인되지 않은 metadata의 속도는 컴퓨터와 디스크 속도에 따라 다릅니다. SSD 디스크를 갖춘 고성능 컴퓨터는 분당 10만 개 이상의 파일을 검색할 수 있습니다. - ^search_results^ (앨범) 이미지 검색의 출력은 "search_results" 앨범에 저장됩니다. 나중에 검색이 이를 대체하지 않도록 하려면 이 앨범의 이름을 바꾸세요. - 제한 사항: 검색 기능은 결과(검색 기준에 맞는 찾은 이미지) 40,000개로 제한됩니다. 이 한계를 초과하면 알림을 받고 검색이 잘립니다. 이 제한은 GTK의 스크롤 창 크기가 제한되어 있어, 더 큰 창을 만들려고 하면 충돌이나 멈춤이 발생할 수 있기 때문에 존재합니다. - - TOPIC: 선택 메뉴 - - TOPIC: 영역 개요 편집 기능은 보통 전체 이미지에 적용되지만, 이미지의 일부("영역")만 편집하고 나머지는 그대로 둘 수 있습니다. 이미지 영역이 선택되어 있으면, 대부분의 편집 기능은 이 영역 내에서만 작동합니다. 일부 기능(예: 크기 조정)은 선택된 영역을 무시합니다. 영역은 편집 기능을 시작하기 전이나 편집 기능을 사용하는 동안 선택할 수 있습니다. 선택된 영역은 즉시 활성화되며, 이전 편집은 유지되고, 이후 편집은 그 영역 내에만 적용됩니다. 다른 편집이 시작되어도 선택된 영역은 계속 활성 상태로 유지되므로, 한 영역 내에서 일련의 편집을 수행할 수 있습니다. 영역은 이미지 내에서 서로 연결되지 않은 여러 영역일 수도 있습니다. - Fotocx는 '레이어' 대신 '영역'을 사용합니다. 이미지에서 무언가를 선택하고, 그 선택으로 별도의 레이어를 만들고, 레이어를 편집한 후 마지막에 레이어를 병합하는 대신, 이미지에서 무언가를 선택하고 그 선택 항목에 편집 기능을 수행하면 최종 결과를 즉시 볼 수 있습니다. 영역은 저장하고, 다른 이미지에 붙여넣고, 이리저리 옮기고 크기를 조정하고, 추가로 편집할 수도 있습니다. - +image: edit-selection.jpg - 선택한 영역을 편집하면 때때로 영역 가장자리에 눈에 보이는 경계가 생길 수 있습니다(이는 때때로 이미지의 특징 가장자리와 일치해 문제가 되지 않기도 합니다). {영역 블렌드}를 사용해 가장자리를 블렌드할 수 있습니다: 영역 가장자리에서 안쪽으로 점진적으로 편집을 적용할 수 있으며, 어떤 가장자리를 블렌드할지 선택할 수 있습니다. - - TOPIC: 영역 선택 +image: select-area.jpg - 영역 선택 대화 상자는 선택 > 영역 선택 메뉴로 시작합니다. 아래에 설명된 방법 중 하나를 선택하세요. 각 방법은 서로 다른 방식으로 이미지 영역을 선택합니다. 언제든지 방법을 변경할 수 있으며, 선택한 영역은 누적됩니다. 선택 항목에 영역을 추가하거나 제거함에 따라 선택된 이미지 영역의 윤곽선이 표시됩니다. [완료] 버튼은 영역 윤곽선 내의 이미지 픽셀을 매핑해 이후 편집 기능을 적용할 준비를 합니다. [숨기기] 버튼은 영역 윤곽선을 숨겨 편집 내용과 가능한 영역 가장자리 효과를 더 잘 볼 수 있게 합니다. [표시] 버튼을 사용해 영역 윤곽선을 표시하세요. [지우기] 버튼은 모든 영역 선택을 제거합니다. 영역 선택 대화 상자는 취소했다가 나중에 다시 시작해 기존 영역을 수정하거나 새 영역을 추가할 수 있습니다. - ^방법 다음 방법들은 최종 영역에 속할 하나 이상의 이미지 공간을 둘러싸는 데 사용됩니다. 이 방법들은 연결되거나 분리된 공간을 정의하기 위해 어떤 순서로든 사용할 수 있습니다. • 직사각형 - 드래그해 직사각형 영역 윤곽 그리기 • 타원 - 드래그해 원형 또는 타원형 영역 윤곽 그리기 • 자유형 그리기 - 마우스로 그려서 영역 윤곽 그리기 • 가장자리 따라가기 - 이미지 특징 가장자리를 따라 윤곽 그리기 • 마우스 내 영역 선택 - 드래그해 마우스 포인터 주위의 원 안 픽셀 선택 • 마우스 내 색상 하나 선택 - 주어진 색상과 일치하는 픽셀만 선택, 0~100% 일치 • 마우스 내 모든 색상 선택 - 마우스 내 모든 픽셀 선택, 마우스 내 색상과 일치하는 색상을 가진 인접 영역으로 선택 확장 (때때로 'flood'라고 함) - 다음 단락은 각 방법의 세부 사항을 설명합니다. - ^직사각형 선택할 직사각형 영역의 한 모서리에서 반대쪽 모서리까지 마우스를 드래그하세요. 영역을 둘러싸는 직사각형이 그려집니다. 오른쪽 클릭으로 삭제하고 다시 시작하세요. 더 많은 직사각형 영역을 선택하려면 이 과정을 반복하세요. - ^타원 이는 직사각형 선택과 같은 방식으로 작동하지만, 둘러싸인 영역이 원이나 타원이라는 점이 다릅니다. 드래그 시작 위치가 결과 타원의 중심이 됩니다. 드래그의 각도가 타원의 모양을 결정합니다. - ^자유형 그리기 마우스를 드래그(왼쪽 버튼을 누른 채)해 자유형 선을 그리거나, 왼쪽 클릭으로 마지막으로 그린 점부터 클릭한 점까지 직선으로 연결하세요. 대상 영역이 연결된 곡선과 직선으로 둘러싸일 때까지 주위를 계속 그리세요. 오른쪽 클릭으로 이전 선(실수)을 제거하세요. 오른쪽 클릭은 이전에 클릭하거나 드래그한 선을 최대 50픽셀까지 제거합니다. 더 제거하려면 오른쪽 클릭을 반복하세요. 새로 클릭한 선은 항상 이전 선의 끝에 연결됩니다. 새로 드래그한 선은 이전 선의 끝 근처에서 시작되면 이전 선에 연결됩니다. 다른 곳에서 시작하면 연결되지 않은 선이 그려집니다. 멀리서 새 드래그를 시작해 이전 선을 만날 때까지 그릴 수 있습니다. 클릭한 선이 원치 않는 지점에 연결된다면(즉, 마지막으로 그린 선에 연결하고 싶지 않다면), 오른쪽 클릭으로 지운 후 드래그를 사용해 새로운 선 시퀀스를 시작하세요. 오른쪽 버튼 드래그는 선분을 지우는 데 사용할 수 있습니다: 선을 따라 가까이 오른쪽 드래그하면 지워지고, 왼쪽 드래그하면 선이 다시 그려집니다. 마지막에는 영역이 빈틈없이 완전히 둘러싸여야 합니다. 끝부분에서 약간 겹치는 선은 괜찮습니다. 빈틈은 찾아서 수정하기 어려울 수 있으므로, 이미지 크기 100% 이상에서 작업하며 주의하세요. 왼쪽 클릭으로 자동 연결된 일련의 선은 빈틈을 남기지 않지만, 이 순서에서 벗어나면 빈틈이 생길 가능성이 높습니다. 빈틈의 가능성을 줄이려면, 선을 수동으로 연결할 때 의도적으로 겹치게 하세요. 아래 설명된 빈틈 감지 유틸리티가 있습니다 - {영역 빈틈 찾기}. 영역 가장자리가 이미지 가장자리이기도 하다면, 영역의 이 부분은 그릴 필요가 없습니다. 이미지 가장자리 밖으로 선을 그은 후, 이미지 가장자리를 따라 다른 위치에서 다시 이미지 안으로 그리세요. - ^가장자리 따라가기 마지막으로 그린 점과 새로 클릭한 위치 사이의 고대비 픽셀(이미지 특징 가장자리일 가능성이 높음)이 발견되어 연결됩니다. 이는 너무 불규칙하지 않은 선명한 가장자리에 효과적입니다. 흐릿하고 들쭉날쭉한 가장자리는 잘 작동하지 않을 수 있으며, 높은 정밀도가 필요하다면 자유형 그리기가 필요합니다. 선을 연결하는 규칙은 위에서 설명한 것과 같습니다. 클릭 대신 마우스를 드래그하면 자유형 그리기처럼 작동하지만, 마우스보다 약간 뒤처진 위치에서 특징 가장자리를 따라가는 경향이 있습니다. 매우 불규칙한 가장자리(머리카락, 나뭇잎)의 경우, 아래의 '선택 해제 색상'을 참고하세요. - ^마우스 반경과 색상 일치 수준 이 두 컨트롤은 아래 설명된 '마우스 내 선택' 방법에만 적용됩니다. 마우스 반경은 마우스 포인터 주위 원의 크기를 정의합니다. 원 안의 픽셀이 선택되거나, 마우스 원에서 바깥쪽으로 픽셀을 일치시키고 선택하기 위한 색상 세트를 제공합니다. 일치 수준은 색상과 밝기를 기준으로 픽셀을 선택하는 데 필요한 일치 수준(0~100%)을 정의합니다. '0'은 무엇이든 일치함을, '100'은 완벽한 일치가 필요함을 의미합니다. - ^마우스 내 영역 선택 왼쪽 클릭이나 드래그는 마우스 원에 둘러싸인 픽셀을 선택합니다. 오른쪽 클릭은 마지막 선택을 선택 해제합니다(더 해제하려면 반복하세요). 오른쪽 드래그는 둘러싸인 픽셀을 선택 해제합니다. - ^마우스 내 색상 하나 선택 이미지를 클릭해 색상을 선택하세요. 색상은 색상 버튼에 표시됩니다. 버튼을 사용해 색상을 직접 설정할 수도 있습니다. 왼쪽/오른쪽 드래그로 일치 수준 내에서 선택한 색상과 일치하는 마우스 원 안의 픽셀을 선택/선택 해제하세요. 일치 수준을 낮추거나 높여서 더 넓거나 좁은 색상 범위를 일치시키세요. 필요에 따라 이미지를 클릭해 일치시킬 색상을 변경하세요. - ^선택적 선택 해제 색상 이는 위의 '색상 하나 선택'에만 적용됩니다. 이미지를 왼쪽 클릭해 선택 해제 색상을 설정하세요. 체크박스가 체크되면 선택 해제 색상이 활성화됩니다. 픽셀이 선택 색상보다 선택 해제 색상에 더 잘 맞으면, 그 픽셀은 선택 해제됩니다. 선택되지 않은 상태로 유지해야 하는 인접 영역과 색상 대비가 낮은 특징 가장자리를 따라 선택할 때는, 인접 영역에서 선택 해제 색상을 설정하세요. 이는 머리카락이나 나뭇잎처럼 복잡한 가장자리를 정확하게 선택하는 데 도움이 됩니다. - ^마우스 내 모든 색상 선택 이는 일부 편집기에서 'flood'라고 불립니다. 왼쪽/오른쪽 드래그로 마우스 원 안의 픽셀을 선택/선택 해제하세요. 마우스 원 바깥의 픽셀도 다음 두 조건을 만족하면 포함됩니다: 1) 현재 일치 수준 내에서 마우스 원 안의 어떤 색상과든 일치한다. 2) 마우스 포인터의 검색 범위 내에 있다. 이는 마우스 반경의 배수입니다. 예를 들어 마우스 반경이 20이고 검색 범위가 3이면, 검색 범위는 마우스 포인터로부터 60픽셀입니다. 포함하고 싶은 새 영역 위로 마우스를 드래그하세요. 선택된 영역이 마우스 원 안의 색상과 일치하는 영역으로 확장되는 것을 확인하세요. 너무 멀리 갔다면 오른쪽 클릭으로 마지막 선택을 제거하세요. 이전 선택을 더 제거해야 한다면 반복하세요. 더 세밀한 제어를 원한다면 반경을 줄이거나 일치 수준을 높이세요 - 선택 영역이 더 천천히 확장되고 마우스 원에 더 가깝게 유지됩니다. 작은 반경과 높은 일치 수준을 사용하면 이미지 특징 가장자리를 따라가며 가장자리까지 정밀하게 픽셀을 선택할 수 있습니다. 가장자리 작업이 끝나면 마우스 내 영역 선택 방법을 사용해 나머지를 선택하세요. 오른쪽 드래그는 선택 해제로 작동합니다: 마우스 원 안의 픽셀과 검색 범위 내에서 일치하는 픽셀이 선택 해제됩니다. 선택이 너무 멀리 갔다면, 안쪽에서 선택하는 대신 선택된 영역 바깥에서 선택 해제하는 것이 더 쉬운 경우가 많습니다. 이에 익숙해지고 효율적으로 작업하려면 약간의 연습이 필요할 수 있습니다. - ^마우스 내 모든 색상 선택 - 요약 • 왼쪽 드래그 - 마우스 내 픽셀과 범위 내 일치하는 픽셀 선택 • 오른쪽 클릭 - 이전 선택 실행 취소, 더 해제하려면 반복 • 오른쪽 드래그 - 마우스 내 픽셀과 범위 내 일치하는 픽셀 선택 해제 - ^가장자리 밀림 완료된(아래 참고) 영역은 1픽셀 단위로 확장하거나 축소할 수 있습니다. 색상 일치로 선택된 영역이 밝기를 변경하는 방식으로 편집될 때 가장자리 효과를 줄이는 데 도움이 될 수 있습니다. 색상으로 선택하면 특징 색상이 배경으로 전환되는 가장자리를 따라 선택이 부족하거나 과도한 픽셀의 좁은 띠가 남을 수 있습니다. 영역을 1~2픽셀 확장하거나 축소하면 더 깔끔해 보이는 가장자리를 만들 수 있습니다. 밀림 후에도 영역은 완료된 상태(아래 참고)로 유지됩니다. - ^영역 윤곽선 색상 마우스 선택 원과 영역 윤곽선에 사용되는 색상은 색상 버튼 중 하나를 클릭해 언제든지 변경할 수 있습니다. 이를 통해 다양한 이미지 색상에 대해 잘 보이도록 할 수 있습니다. - ^표시/숨기기 [숨기기]를 사용해 영역 윤곽선을 숨기세요. 이는 영역 윤곽선의 방해 없이 영역 편집 효과를 더 잘 볼 때 유용합니다. [표시]를 사용해 윤곽선을 표시하고 영역 편집을 재개하세요. - ^완료 +image: select-area-finish.png - 영역은 성공적으로 완료되기 전까지는 편집에 효과가 없습니다. 완료는 그려진 윤곽선을 검증하고 시각적 확인을 위해 둘러싸인 픽셀에 색을 입힙니다. 영역 윤곽 그리기를 마쳤다면 [완료] 버튼을 사용해 과정을 마무리하세요. 위에 표시된 팝업 대화 상자는 완료에 사용할 수 있는 두 가지 방법을 요약합니다. - 방법 1: 손으로 윤곽을 그린 영역 안쪽을 마우스로 왼쪽 클릭하세요. 둘러싸인 영역이 일시적으로 색이 입혀져 최종 결과가 의도한 대로인지 확인할 수 있습니다. 명시적으로 윤곽이 그려지지 않은 영역이라도 둘러싸인 영역이라면 선택할 수 있습니다: 구멍이 있는 도넛이 있다면, 도넛, 구멍, 또는 둘 다 선택할 수 있습니다. 모든 영역을 클릭해 올바르게 색이 입혀졌다면 [keep]을 누르세요. 손으로 그린 영역의 윤곽선에 빈틈이 있다면, 색칠 과정이 "새어 나가" 둘러싸인 영역 바깥에도 색이 입혀집니다. 이 경우, 완료 대화 상자에서 [실행 취소]를 눌러 원래 영역 윤곽선을 복원하세요. 윤곽선의 빈틈을 찾아 닫은 후 [완료]를 다시 시도하세요. 넓은 영역의 1픽셀 빈틈은 찾기 어려울 수 있습니다. 더 잘 보려면 확대하세요. 작은 빈틈을 빠르게 찾는 방법은 아래의 {영역 빈틈 찾기} 기능을 참고하세요. - 방법 2: 둘러싸인 모든 영역 바깥의 한 지점을 오른쪽 클릭하세요. 시각적 확인을 위해 둘러싸인 모든 영역에 색이 입혀집니다. 빈틈이 있다면 결과와 수정 방법은 방법 1에서 설명한 것과 같습니다. 이 방법은 손으로 윤곽을 그린 영역이 많고 방법 1을 사용해 하나씩 확인하고 싶지 않을 때 적합합니다. - '마우스 내 선택' 방법으로 선택한 영역은 자동으로 완료됩니다. 이러한 영역은 선택 과정 중에 매핑되는 반면, 직사각형, 타원, 또는 선 그리기 방법 중 하나로 선택한 영역은 안쪽을 클릭할 때만 매핑됩니다. '마우스 내 선택' 방법만 사용한다면, 선택한 영역을 클릭하지 않고도 [keep]을 누를 수 있습니다. - 이미지의 한쪽에서 다른 쪽으로 선을 그으면, 선의 어느 쪽이든 클릭해 그 쪽의 모든 픽셀로 이루어진 영역을 만들 수 있습니다. 예: 하늘과 땅의 경계에 수평선을 그으세요. 선 위를 클릭하면 하늘이 선택되고, 선 아래를 클릭하면 땅이 선택됩니다. 그려진 선은 이미지 가장자리까지 완전히 도달해야 합니다. - ^지우기 현재 영역을 영구적으로 버립니다. - - TOPIC: 영역 빈틈 찾기 영역 윤곽선이 여러 번의 스트로크로 자유형 그리기를 사용해 만들어졌다면, 4배 확대 이하에서는 보이지 않는 작은 빈틈이 윤곽선에 쉽게 남을 수 있습니다. 이러한 영역을 완료하려는 시도는 실패합니다. 내부 픽셀의 매핑이 빈틈을 통해 새어 나가 의도한 영역 바깥을 덮기 때문입니다. 완료 기능이 실패하면, 이 기능으로 빈틈을 찾을 수 있습니다. 실패한 영역의 윤곽선 어딘가를 클릭하세요. 클릭한 위치에서 한 방향으로 "끝 픽셀"이 발견될 때까지 윤곽선이 천천히 다시 그려집니다. 이곳이 빈틈이 있는 곳입니다. 그런 다음 빈틈(또는 다른 빈틈)을 만날 때까지 반대 방향으로 윤곽선이 그려집니다. 그리기가 멈춘 곳이 빈틈입니다. 빈틈을 확대해 자유형 그리기로 닫은 후, 전체 윤곽선을 멈춤 없이 그릴 수 있는지 다시 테스트하세요. 이 기능은 영역 선택 기능과 함께 사용할 수 있습니다 - 두 대화 상자를 모두 활성화할 수 있습니다. - - TOPIC: 영역 블렌드 +image: area-blend.jpg - 이 도구에는 두 가지 기능이 있습니다: 영역 블렌드와 영역 경계 블렌드. 두 기능 모두 이전 편집이나 원본 이미지를 혼합하여, 선택 영역 내에서 이루어진 편집을 점진적으로 '실행 취소'할 수 있습니다. 위 예시에서는 배경의 네 남자가 밝아진 픽셀과 변경되지 않은 픽셀 사이의 경계를 전혀 알아볼 수 없게 밝아졌습니다. - ^영역 블렌드 편집된 선택 영역의 어떤 부분이든 원본 이미지와 블렌드할 수 있습니다. 블렌드할 영역 위에서 마우스 왼쪽 드래그를 사용하세요. 영역 내에서 마우스를 드래그할 때마다 선택한 이전 이미지가 점차 블렌드되어, 영역 내에서 이루어진 편집을 효과적으로 줄이거나 제거합니다. 블렌드 속도는 '블렌드 비율'로 결정되며, 마우스 원의 중심과 가장자리에 대해 별도로 설정할 수 있습니다. 마우스 반경과 블렌드 비율(예: 마우스 중심/가장자리에 50/0)을 설정하세요. 블렌드할 영역 위로 마우스를 드래그하세요. 블렌드하려면 왼쪽 드래그, 블렌드 취소나 복원을 하려면 오른쪽 드래그를 사용하세요. 이 방법을 사용해 영역 가장자리를 선택적으로 블렌드할 수 있습니다: 작은 반경을 사용하고 블렌드할 가장자리 위로 마우스 중심을 드래그하세요. 그러면 가장자리에서 안쪽으로 점차 약해지는 블렌드가 만들어집니다. - ^영역 경계 블렌드 때때로 편집된 영역은 편집된 영역과 주변 이미지 사이의 뚜렷한 경계로 인해 부자연스러워 보이는 가장자리를 가질 수 있습니다(특히 영역이 밝아진 경우). 가장자리를 따라 좁은 띠 부분의 영역 편집을 점차 블렌드해 없앰으로써 이를 효과적으로 보이지 않게 할 수 있습니다. 영역 편집은 영역 가장자리에서 100% 제거되고, 그 띠의 너비만큼 안쪽으로 갈수록 0%까지 줄어들 수 있습니다. 영역 가장자리를 블렌드하는 방법은 두 가지입니다: '블렌드'와 '블러'. 블렌드는 가장자리 띠를 선택한 이전 편집이나 원본 이미지와 혼합합니다. 블러는 그 띠를 띠 바깥의 인접 픽셀과 혼합합니다. 입력란 '블렌드 너비'나 '블러 너비'로 블렌드의 너비를 설정하세요. - 영역 가장자리 '블렌드'와 '블러'는 가장자리 거리 계산이 필요합니다: 각 영역 픽셀에서 가장 가까운 영역 가장자리까지의 거리입니다. 이 거리는 픽셀의 상대적 블렌드를 계산하는 데 사용됩니다: 영역 가장자리에서는 100%, 가장자리로부터 '블렌드 너비'를 넘어선 픽셀에서는 0%입니다. 가장자리가 복잡한 넓은 영역의 경우 시간이 걸릴 수 있습니다. 상단 패널에 진행률 표시가 나타납니다. - - TOPIC: 영역 표시/숨기기 현재 영역의 윤곽선을 표시하거나 숨깁니다. 편집 기능으로 영역을 수정하는 동안에는 영역을 숨기는 것이 유용합니다. 이렇게 하면 편집 효과를 더 쉽게 판단할 수 있습니다. 이는 영역 선택 대화 상자의 버튼으로도 사용할 수 있습니다. - - TOPIC: 영역 사용/사용 안 함 현재 영역을 사용 안 함으로 설정하되 데이터는 유지해 나중에 다시 활성화할 수 있게 합니다(사용 메뉴). 이를 통해 선택한 영역 내 편집과 전체 이미지 편집을 번갈아 할 수 있습니다. - - TOPIC: 영역 반전 기존 영역을 반전합니다: 기존 영역을 제외한 전체 이미지가 선택됩니다. 이 기능을 두 번 사용하면 원래 선택된 영역으로 돌아갑니다. 선택한 영역을 반전하면 가장자리 계산이 무효화되며, 영역 가장자리 블렌드를 원한다면 다시 계산해야 합니다. - - TOPIC: 영역 지우기 현재 영역을 영구적으로 버립니다. 이는 영역 선택 대화 상자의 버튼으로도 사용할 수 있습니다. - - TOPIC: 영역 복사/붙여넣기 선택한 영역은 영역 > 복사 메뉴를 사용해 캐시 파일로 저장할 수 있습니다. 이 영역은 영역 > 붙여넣기를 사용해 같은 이미지나 다른 이미지에 붙여넣을 수 있습니다. 클릭하고 드래그해 붙여넣은 영역의 위치를 정하세요. 대화 상자 컨트롤을 사용해 붙여넣은 영역의 크기를 조정하고 회전할 수 있습니다. - - TOPIC: 영역 불러오기/저장 선택한 영역은 영역 > 저장 메뉴를 사용해 파일로 저장할 수 있습니다. 파일 이름을 입력하라는 요청을 받습니다. PNG 파일이 생성됩니다. PNG 파일에는 투명도 정보를 위한 알파 채널이 있습니다. 이미지는 선택한 영역을 둘러싸는 직사각형입니다. 선택된 픽셀은 불투명하고, 나머지는 투명합니다. - 이 파일들은 기본적으로 /saved_areas에 저장되지만, 원하는 곳에 저장할 수 있습니다. 영역 > 불러오기 메뉴를 사용해 파일에서 저장된 영역을 불러와 현재 이미지 파일에 붙여넣으세요. 배경 이미지가 붙여넣은 영역의 투명한 부분을 통해 보입니다. 클릭하고 드래그해 영역의 위치를 정하세요. 대화 상자 컨트롤을 사용해 붙여넣은 영역의 크기를 조정하고 회전할 수 있습니다. - - TOPIC: 실행 취소/다시 실행 버튼 편집 기능이 활성화되어 있고 이미지가 변경된 경우: • 마우스 왼쪽 클릭은 현재 편집을 실행 취소합니다 • 마우스 오른쪽 클릭은 편집을 다시 실행합니다 이를 통해 현재 편집 기능의 "이전"과 "이후" 이미지를 빠르게 비교할 수 있습니다. - 편집 기능이 활성화되어 있지 않지만 현재 이미지에 일부 편집이 이루어진 경우: • 마우스 왼쪽 클릭은 클릭당 편집 단계 하나를 실행 취소합니다 • 마우스 오른쪽 클릭은 클릭당 편집 단계 하나를 다시 실행합니다 • 마우스 가운데 클릭은 모든 편집 단계의 목록을 팝업으로 표시합니다. 어떤 편집 단계로든, 또는 원본 이미지로 돌아갈 수 있습니다 - 다른 파일을 열면 현재 파일에 저장된 편집 단계가 삭제됩니다. - - TOPIC: 편집 메뉴 - - TOPIC: 회전 기울어진 이미지를 수평으로 맞추려면, 이미지가 수평으로 보일 때까지 마우스로 이미지의 오른쪽이나 왼쪽 면을 위아래로 드래그하세요. 이미지를 왼쪽 클릭하면 수평 맞추기를 돕는 세로/가로 가이드선이 추가됩니다. 오른쪽 클릭으로 제거하세요. - [자동 레벨] 버튼은 카메라가 EXIF metadata에 '롤 각도'를 기록했다면 이미지를 자동으로 수평으로 맞출 수 있습니다. [Auto Upright] 버튼은 EXIF metadata에 '방향' 정보가 있다면 카메라를 90도 돌려 촬영한 이미지를 자동으로 바로 세울 수 있습니다. - - TOPIC: 업라이트 이는 90/180도 회전되었거나 반전(미러링)된 이미지를 버튼 하나로 수정하는 기능입니다. 픽셀이 새 이미지 레이아웃으로 1:1 복사되므로 해상도 손실이 없습니다. {업라이트 일괄 적용} 기능도 참고하세요. - - TOPIC: 자르기 +image: crop-image.jpg +image: crop-buttons.jpg - 이미지 가장자리에서 원치 않는 영역을 잘라냅니다. 대화 상자가 열리면 이미지 위에 선택 사각형이 배치됩니다. 이 사각형 바깥 영역은 어둡게 표시되며 제거될 이미지 부분을 나타냅니다. 사각형의 어느 변이나 모서리든 드래그해 그 변이나 모서리를 이동하세요. 대화 상자는 선택 사각형의 현재 너비/높이 비율을 보여줍니다. "Lock"이 체크되어 있으면, 한 변이나 모서리를 이동할 때 다른 변이나 모서리도 함께 이동해 고정된 너비/높이 비율이 유지됩니다. 크기를 바꾸지 않고 사각형 전체를 이동하려면 (작은 원으로 표시된) 중앙에서 드래그하세요. 너비와 높이 스핀 버튼을 사용해 이미지 픽셀 크기를 직접 조정하거나 원하는 값을 입력하세요. 선택 사각형이 이 값에 맞춰 조정됩니다. - 키보드 화살표 키를 사용해 선택 사각형을 1픽셀 단위로 이동하세요. 화살표 키는 마우스로 마지막으로 이동한 변이나 모서리를 이동시킵니다. - [최대] 버튼은 자르기 사각형을 전체 이미지 크기로 재설정합니다. 이전 편집(회전, 왜곡 등)으로 이미지 주위에 투명한 여백이 남았다면, 자르기 사각형은 이 여백 내에 맞는 최대 크기를 반영합니다. - [이전] 버튼은 이전에 사용한 너비와 높이 값의 목록을 가져옵니다. 목록에서 선택해 이 값 중 하나를 사용하세요. - 다섯 개의 비율 버튼으로 미리 설정된 너비/높이 비율을 선택할 수 있습니다. [invert] 버튼은 현재 너비/높이 비율을 반전합니다. - [customize] 버튼으로 비율 버튼을 변경할 수 있으며, 이는 오른쪽에 표시된 새 대화 상자를 시작합니다. 버튼을 클릭해 편집하세요. 표시된 예시처럼 "ww:hh" 형식을 사용해 원하는 너비 대 높이 비율을 입력하세요. - - TOPIC: 리터치 +image: retouch.png - 이미지 밝기와 색상을 조정합니다. • 자동 블랙 레벨 - 가장 어두운 픽셀의 %를 사용해 블랙 포인트 설정 • 자동 화이트 밸런스 - 가장 밝은 픽셀의 %를 사용해 화이트 포인트 설정 • 화이트 밸런스용 회색 지점 클릭 - 이미지의 회색 지점 클릭 • 블랙 레벨용 어두운 지점 클릭 - 이미지의 어두운 지점 클릭 • 클릭하면 RGB 히스토그램 팝업 그래프 표시 • 밝기 - 'all' 곡선을 위나 아래로 이동 (모든 색상이 변경됨) • 대비 - 'all' 곡선의 기울기를 변경 • 색 채도 - 흑백 <--> 강렬한 색상 • 색온도 - 조명 균형 (따뜻함 <--> 차가움) - 슬라이더로 초기 조정을 한 후, 마우스로 곡선을 편집해 이미지의 어느 부분이 더 많이 또는 적게 변하는지 조정함으로써 밝기와 대비를 미세하게 조정할 수 있습니다. ALL 곡선은 모든 색상을 조정하고, 3개의 RGB 곡선은 개별 색상을 조정합니다. 먼저 ALL을 사용한 후 RGB로 수정하세요. - ^버튼 Reset - 모든 컨트롤을 중립 위치로 되돌림 - 이미지도 재설정됨 Prev - 모든 컨트롤을 이전 이미지에 사용된 값으로 설정 Done - 편집 완료, 대화 상자 닫기, 컨트롤 설정 저장 Cancel - 편집 취소, 이미지 재설정, 대화 상자 닫기 - 비슷한 조정이 필요한 여러 이미지를 처리할 때 [이전] 버튼을 사용하세요. - - TOPIC: 크기 조정 +image: rescale.png - 이 기능은 이미지를 새 픽셀 너비와 높이로 크기 조정합니다. 새 크기를 직접 입력하거나 퍼센트 변경을 선택할 수 있습니다. 새 크기를 원본 크기의 단순 비율로 설정하는 버튼이 있습니다. 이 중 하나를 사용하면 해상도 손실을 최소화합니다. [이전] 버튼은 이전 크기를 불러오며, 여러 이미지를 같은 크기로 설정할 때 편리합니다. 비율 고정 체크박스가 체크되어 있으면, 너비나 높이 중 하나를 변경할 때 현재 너비/높이 비율이 유지됩니다. - - TOPIC: 분할 화면 +image: split-screen1.jpg +image: split-screen2.png - 편집 기능 중에 분할 화면 방법을 사용해 이전과 이후 이미지를 볼 수 있습니다. 마우스로 경계선을 드래그하세요. 분할 화면을 종료하면 편집 기능을 정상적으로 계속할 수 있습니다. - 활성화된 편집 기능이 없다면, 분할 화면으로 보여줄 두 이미지를 선택하세요. 두 이미지는 같은 픽셀 크기를 가져야 합니다. - - TOPIC: 차이점 표시 편집 기능 중에 변경되지 않은 영역을 어둡게 하여 변경 사항을 강조합니다. 슬라이더를 사용해 변경되지 않은 영역의 어두운 정도를 조정하세요. 차이점 표시를 종료하면 편집 기능을 정상적으로 계속할 수 있습니다. - 활성화된 편집 기능이 없다면, 차이점을 강조할 두 이미지를 선택하세요. 두 이미지는 같은 픽셀 크기를 가져야 합니다. - - TOPIC: 여백 +image: margins.png - 이 기능을 사용해 이미지 주위에 여백을 추가하세요. 여백에는 어떤 색상과 알파(투명도) 설정도 사용할 수 있습니다. 각 여백을 개별적으로 설정하거나, 'All±1'과 'All±10' 컨트롤을 사용해 모든 여백을 같은 양(1픽셀 또는 10픽셀)만큼 늘리거나 줄이세요. 속도를 높이려면 마우스 휠이나 위/아래 화살표 키를 사용하세요. - 왜곡할 계획인 이미지 주위에 여백을 추가해, 일부 영역이 가장자리 밖으로 벗어나는 것을 막는 데 이 기능을 사용할 수 있습니다. - - TOPIC: 마크업 +image: markup.jpg - 이는 이미지 마크업 기능을 포함하는 메뉴입니다: 텍스트 그리기, 선/화살표 그리기, 상자 그리기, 타원 그리기 이 모든 기능에는 [commit] 버튼이 있으며, 현재 편집을 커밋하고 같은 편집 대화 상자 내에서 새 편집(새 텍스트/선/상자/타원)을 시작할 수 있게 합니다. - ^텍스트 그리기 이 기능은 이미지에 텍스트를 직접 그립니다. 대화 상자에 텍스트를 입력하세요. 여러 줄을 사용할 수 있습니다. 텍스트를 입력한 후, 이미지에서 텍스트를 놓고 싶은 곳을 마우스로 왼쪽 클릭하세요. 드래그해 텍스트를 다른 곳으로 이동하세요. 오른쪽 클릭으로 텍스트를 제거하세요. [글꼴] 버튼을 사용해 다른 글꼴을 선택하세요. [크기] 컨트롤을 사용해 텍스트 크기를 늘리거나 줄이세요. [각도] 컨트롤을 사용해 텍스트의 기울기 각도를 변경하세요. 다른 컨트롤로 텍스트 주위 배경색, 텍스트 윤곽선 색상, 그림자 효과를 지정할 수 있습니다. 이 모두에 대해 색상과 투명도를 선택할 수 있습니다. 너비 컨트롤은 윤곽선과 그림자의 너비를 조정합니다. 그림자 각도 컨트롤은 그림자의 각도를 설정합니다. 엠보싱 컨트롤을 사용해 텍스트에 3D 느낌을 주세요. - 이미지 파일의 사용 가능한 metadata로 텍스트를 초기화할 수 있습니다. metadata tag(예: "user comments")를 입력하고 [가져오기]를 누르세요. tag 이름을 축약할 수 있습니다. 예: "User Comments" 대신 "usercomments". - [열기]과 [저장] 버튼은 파일에서 모든 텍스트 데이터를 불러오거나 저장할 수 있는 파일 선택 대화 상자를 시작합니다. 대화 상자의 모든 항목이 불러와지거나 저장되므로, 자주 사용하는 텍스트 문자열과 설정 모음을 유지할 수 있습니다. - 하단의 버튼은 다음과 같이 작동합니다: • Clear - 텍스트와 metadata 필드를 비움 • Replace - 텍스트가 추가된 이미지가 현재 이미지를 대체함 • +Version - 텍스트가 추가된 이미지가 새 버전으로 저장됨 • Next - 다음 파일을 열고, 같은 텍스트를 같은 위치에 배치 • Apply - 현재 편집을 커밋하고 새 텍스트 입력을 위해 재설정 • Done - 현재 편집 완료 - 이미지 저장 준비 완료 • Cancel - 현재 편집 포기 - 일련의 이미지에 같은 텍스트를 추가하려면: 텍스트를 준비하고 위치를 정한 후, [바꾸기]나 [+Version]을 누르고, [다음]를 누른 후, 다시 [바꾸기]나 [+Version]을 누르고, [다음]를 누르는 과정을 반복하세요... - 워터마크 만들기: 텍스트 투명도를 70% 이상, 배경 투명도를 100%로 사용하세요. 텍스트가 희미하게 읽힐 정도여야 합니다. 엠보싱 컨트롤을 사용해 텍스트가 이미지 안으로 파인 것처럼 보이게 하세요. - ^선 그리기 이 기능은 이미지에 선이나 화살표를 직접 그립니다. 대화 상자에 선의 길이와 너비를 입력하고, 원한다면 화살촉을 선택하세요. 이미지에서 배치하고 싶은 곳을 마우스로 왼쪽 클릭하세요. 선/화살표의 끝을 드래그해 이미지 위에 배치하세요. 오른쪽 클릭으로 제거하세요. 각도나 길이를 바꾸지 않고 이동하려면 선의 중간에서 드래그하세요. 대화 상자 컨트롤로 배경색, 윤곽선 색상, 그림자 효과를 지정할 수 있습니다. 이 모두에 대해 색상과 투명도를 선택할 수 있습니다. 너비 컨트롤은 윤곽선과 그림자의 너비를 조정합니다. 그림자 각도 컨트롤은 그림자의 기울기 각도를 설정합니다. 그린 선을 유지하고 새로운 선을 시작하려면 [적용]를 누르세요. - ^상자 그리기 상자 윤곽선의 색상과 너비를 선택하세요. 상자 모서리를 원하는 위치에 커서를 놓고, 원하는 방향으로 드래그해 상자를 여세요. 상자를 다시 그리려면 다시 드래그하세요. 상자를 이동하려면 shift 키를 누른 채 중앙에서 상자를 드래그하세요. 가장자리 중 하나를 이동하려면 shift 키를 누른 채 가장자리를 드래그하세요. 그린 상자를 유지하고 새로운 상자를 시작하려면 [적용]를 누르세요. - ^타원 그리기 타원(oval) 또는 원 체크박스를 선택하세요. 윤곽선의 색상과 너비를 선택하세요. 원하는 중심에 커서를 놓으세요. 드래그해 타원/원을 그리세요. 드래그 각도가 원에서 극단적인 타원(넓거나 길쭉한)까지 타원의 모양을 결정합니다. 타원/원을 다시 그리려면 다시 드래그하세요. 타원/원을 이동하려면 shift 키를 누른 채 중심에서 드래그하세요. 크기나 모양을 변경하려면 shift 키를 누른 채 오른쪽 아래 가장자리에서 드래그하세요. 그린 타원/원을 유지하고 새로운 것을 시작하려면 [적용]를 누르세요. 타원의 경우, 예시처럼 기울어진 축을 위해 0~90도의 각도를 입력할 수 있습니다. - - TOPIC: 색상 모드 +image: color-mode.png +image: color-mode2.jpg - 이 기능을 사용해 흑백이나 컬러 네거티브를 만들거나, 네거티브 이미지를 포지티브 이미지로 변환하거나, 세피아 색조(오래된 사진 효과)로 변환하세요. 슬라이더를 사용해 0%에서 100%까지 효과를 점진적으로 적용할 수 있습니다. - - TOPIC: 페인트 편집 이 기능은 다른 편집 기능과 함께 사용하세요. 편집 기능을 시작하고 컨트롤을 중립 위치에 두세요. 그런 다음 페인트 편집을 시작하세요. 마우스를 사용해 원하는 곳에 편집 기능을 페인트하세요. 마우스로 편집을 부분적으로 적용하는 방법은 {MOUSE PAINTING}을 참고하세요. - 편집을 점진적으로 "페인트"하는 이 방법은 이미지의 선택한 영역을 빠르고 쉽게 개선할 수 있습니다. 다음 편집 기능과 함께 작동합니다: • 편집 > 리터치, 색상 모드 • 복구 > 선명하게, 블러, 노이즈 제거, 안개 제거, RGB 조정, HSL 조정 • 보정 > 히스토그램 평탄화, 로컬 대비, 대비 증폭, 로컬 레티넥스, 채도, 소프트 포커스 • 효과 > 윤곽선, 스케치2, 엠보싱, 텍스처, 눈부심 효과 추가, 색상 설정, 색상 전환, 사용자 지정 커널 - - TOPIC: 이미지 페인트 +image: paint-image.jpg - 이 기능은 마우스를 사용해 선택한 색상으로 이미지를 페인트합니다. 마우스로 편집을 부분적으로 적용하는 방법은 {MOUSE PAINTING}을 참고하세요. - 페인트 색상 버튼은 현재 색상을 보여줍니다. 이 버튼을 클릭해 표준 Gnome 색상 선택 대화 상자를 사용해 색상을 선택하세요. Shift + 왼쪽 클릭으로 이미지에서 색상을 선택할 수도 있습니다. - 팔레트 버튼은 가운데에 표시된 대화 상자를 엽니다. 이미지를 클릭해 그 위치의 색상을 선택하세요. 선택한 색상은 메인 대화 상자의 색상 버튼에 반영됩니다. 위에 표시된 이미지는 기본값입니다. 어떤 이미지든 색상 출처로 사용할 수 있습니다. [찾아보기] 버튼을 눌러 나중에 다시 사용할 색상을 저장해 둔 이미지를 선택하세요. 이 선택은 변경할 때까지 유지됩니다. - HSL 버튼은 오른쪽에 표시된 HSL 색상 선택기를 엽니다. 이 대화 상자는 가능한 모든 색상을 표현할 수 있습니다. 슬라이더를 움직여 원하는 색상을 얻으세요. 선택한 색상은 메인 대화 상자의 색상 버튼에 반영됩니다. - 투명한 영역 위에 페인트가 선택되어 있으면, 투명한 영역 위에 페인트할 때 불투명도 컨트롤에 따라 투명도가 줄어들거나 없어집니다. 이 옵션이 선택되어 있지 않으면 이미지의 불투명한 영역만 페인트됩니다. - ^Wacom 태블릿 작동 이미지 페인트에서는 마우스 대신 Wacom 태블릿을 사용할 수 있습니다. 태블릿 표면에 닿은 스타일러스를 드래그하면 위에서 설명한 대로 페인트됩니다. 드래그하는 동안 스타일러스 버튼 중 하나를 누르고 있으면, 동작이 페인트 대신 지우기가 됩니다. 대화 상자의 라디오 버튼을 사용해 페인트 또는 지우기 모드를 설정할 수도 있습니다. 스타일러스 버튼을 누르고 있는 것은 번거로우므로 라디오 버튼이 있습니다. 스타일러스에 압력을 가하면 불투명도가 증가하므로, 불투명도 컨트롤을 조정하지 않고도 더 옅거나 진한 스트로크를 만들 수 있습니다. - - TOPIC: 투명도 페인트 +image: paint-transp.png +image: paint-transp2.jpg - 이미지에 투명하거나 반투명한 영역을 페인트합니다. 마우스로 편집을 부분적으로 적용하는 방법은 {MOUSE PAINTING}을 참고하세요. - - TOPIC: 영역 채우기 선택한 모든 영역이나 모든 투명한 영역을 선택한 오버레이 색상으로 채우세요. 영역이 부분적으로 투명하다면, 오버레이 색상이 이미지의 투명한 부분을 대체합니다. '블렌드' 슬라이더를 사용해 원본 이미지와 오버레이 색상의 혼합 비율을 선택할 수 있습니다. - - TOPIC: 이미지 내 복사 같은 이미지의 다른 곳에서 복사해 이미지 영역 위에 페인트합니다. 이 방법을 사용해 이미지 내 물체를 복제하거나, 다른 곳에서 가져온 배경으로 대체해 원치 않는 물체를 지울 수 있습니다. 이미지를 왼쪽 클릭해 원본 위치를 선택한 후, 오른쪽 클릭으로 해당 대상 위치를 선택하세요. 마우스로 편집을 부분적으로 적용하는 방법은 {MOUSE PAINTING}을 참고하세요. - 투명한 영역 위에 페인트가 선택되어 있으면, 투명한 영역 위에 페인트할 때 투명도가 줄어들거나 없어집니다. 이 옵션이 선택되어 있지 않으면 이미지의 불투명한 영역만 페인트됩니다. - - TOPIC: 이미지에서 복사 다른 이미지에서 복사해 이미지 영역 위에 페인트합니다. 대상 이미지는 수정할 영역 위로 마우스를 드래그해 '페인트'됩니다. 원본 이미지에서 미리 선택한 위치가 대상 이미지에 복사됩니다. 복사되는 영역과 페인트되는 영역은 모두 마우스와 함께 움직이는 원으로 둘러싸여 있습니다. 위 예시에서는 오른쪽 이미지의 배가 왼쪽 이미지로 복사되었습니다. - 먼저 대상 이미지를 여세요. '이미지에서 복사' 메뉴를 선택하세요. 같은 이미지를 보여주는 두 번째 Fotocx 세션이 시작됩니다. 이 두 번째 세션에서 원본 이미지로 이동해 여세요. 두 창을 모두(적어도 복사할 영역을) 볼 수 있도록 배치하세요. 원본 이미지를 Shift + 왼쪽 클릭해 원본 위치를 설정하세요. 대상 위치에서 대상 이미지를 Shift + 왼쪽 클릭하세요. - 대상 이미지 영역 위에서 마우스를 왼쪽 드래그하세요. 원본 이미지의 픽셀이 대상 이미지로 복사됩니다. 참조 위치에 높은 정밀도가 필요하다면 이미지를 최대 크기로 zoom하세요. 두 이미지의 초기 참조 위치는 (0,0)(북서쪽 모서리)입니다. 마우스로 편집을 부분적으로 적용하는 방법은 {MOUSE PAINTING}을 참고하세요. - 원본 이미지 배율 값은 원본 이미지를 대상 이미지에 맞춰 배율 조정하는 데 사용됩니다. 먼저 시험 삼아 복사해서 배율을 확인하세요. 너무 크거나 작다면 [undo all]를 사용해 시험 복사를 지우고, 배율 값을 변경한 후 다시 시도하세요. - 투명한 영역 위에 페인트가 선택되어 있으면, 투명한 영역 위에 페인트할 때 마우스 불투명도 컨트롤에 따라 투명도가 줄어들거나 없어집니다. 이 옵션이 선택되어 있지 않으면 이미지의 불투명한 영역만 페인트됩니다. - - TOPIC: 이전 편집 복사 이전 편집 단계의 이미지를 마우스로 "페인트"해 현재 이미지에 부분적이고 점진적으로 적용할 수 있습니다. 이전 편집은 현재 이미지가 아직 열려 있는 동안 이루어진 편집 중 하나여야 합니다 - 저장하지 않은 편집은 새 이미지를 열면 사라집니다. 이미지가 현재 이미지로 계속 열려 있는 한, 이전의 어떤 편집이든 편집 중인 현재 이미지의 어떤 영역에도 적용할 수 있습니다. 현재 이미지에서 이루어진 모든 이전 편집 단계를 순서대로, 사용된 편집 기능으로 식별해 보여주는 드롭다운 목록을 사용해 이전 편집을 선택하세요. 마우스로 편집을 부분적으로 적용하는 방법은 {MOUSE PAINTING}을 참고하세요. - - TOPIC: 복구 메뉴 - - TOPIC: 선명하게 +image: sharpen.png - 이 기능에는 흐릿한 이미지를 선명하게 하는 다섯 가지 방법과, 노출 중 카메라나 피사체의 움직임으로 인한 모션 블러를 선명하게 하는 방법이 있습니다. - 방법을 선택하고, 매개변수를 설정하고, [적용]를 누른 후 몇 초 기다려 결과를 확인하세요. 만족할 때까지 변경하고 과정을 반복하세요. {영역 선택}을 사용해 이미지의 다른 부분에 서로 다른 방법과 매개변수를 적용하세요. - 모든 방법에서, 약간 흐릿한 이미지에는 작은 반경을, 더 심하게 흐릿한 이미지에는 더 큰 값을 선택하세요. Amount는 수정의 강도를 제어합니다. Threshold는 낮은 대비 픽셀의 변경을 억제합니다: 값이 높을수록 낮은 수준의 불규칙성(이미지 노이즈, 고르지 않은 피부톤 등)의 증폭이 줄어듭니다. - Unsharp mask: 대부분의 이미지 편집기에서 볼 수 있는 고전적인 방법입니다. 기술적인 설명은 인터넷 검색으로 찾을 수 있습니다. 이 방법은 고대비 가장자리 주위에 눈에 보이는 '헤일로'를 만들 수 있습니다. - 대비 증폭: 기존 대비를 증폭합니다. 효과는 unsharp mask와 비슷하지만, '헤일로'는 줄어듭니다. - 구와하라: 각 픽셀 주위의 작은 인접 영역들이 서로 비교됩니다. 픽셀에는 차이가 가장 작은 인접 영역의 평균 색상이 부여됩니다. 이는 흐릿한 가장자리 위의 픽셀이 가장자리의 한쪽이나 다른 쪽에 맞춰지도록 강제합니다. 가장자리가 매우 선명해집니다. 큰 반경을 사용하면 이미지가 '블록처럼' 보일 수 있습니다. 미묘한 세부 사항이 손실될 수 있습니다. - 중앙값 차이: 픽셀 밝기가 반경 내 픽셀의 중앙값과 비교됩니다. 인접 영역 평균보다 각각 더 밝거나 어두운 픽셀은 밝기가 증가하거나 감소합니다. 효과는 unsharp mask와 비슷하지만, '헤일로'는 크게 줄어듭니다. 이는 각 RGB 색상에 대해 개별적으로 작동하는 유일한 방법입니다. 밝기 변화가 거의 없어도 색상 전환을 선명하게 할 수 있습니다. - 리처드슨-루시: 이미지는 리처드슨-루시 디컨볼루션 방법을 사용해 선명하게 됩니다. 이 방법은 최상의 결과를 낼 수 있지만 상당히 느리기도 합니다. 속도를 높이려면, {영역 선택}을 사용해 이미지의 작지만 복잡한 영역을 먼저 선택하세요. 이 작은 영역을 사용해 최적의 반경과 반복 횟수를 찾으세요. 그런 다음 같은 설정을 전체 이미지에 사용하세요. 이미지의 노이즈는 효과를 저해합니다. 그렇다면 미리 {노이즈 제거}를 사용하세요. - 정확히 2배 확대된 이미지는 반경 2.0과 4회 이상의 반복으로 리처드슨-루시를 사용해 선명하게 할 수 있습니다. 결과가 매우 좋습니다. - ^모션 블러 보정 +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - 카메라나 물체의 움직임으로 인한 약간의 블러가 있는 이미지를 수동으로 최적화합니다. 그렇지 않으면 선명한 이미지에서 움직이는 물체로 인한 블러는 {영역 선택}을 사용해 물체를 분리해 처리할 수 있습니다. 블러는 선형이며 등속이라고 가정합니다. 입력값은 픽셀 단위의 '블러 범위'와 도(degree) 단위의 '블러 각도'입니다. 초기 각도 추정은 블러 방향으로 이미지를 가로질러 Shift + 마우스 드래그로 지정할 수 있습니다(실제 움직임과 같거나 반대일 수 있음). 도구 > RGB 표시를 사용해 밝은 이미지 특징 가장자리를 따라 블러의 너비를 측정함으로써 블러 범위의 추정값을 입력하세요. 입력값을 조정하고 [적용]를 누른 후, 이미지를 검사해 최적의 설정을 찾으세요. 큰 이미지에서는 응답 시간이 느릴 수 있습니다. {영역 선택}을 사용해 범위와 각도를 최적화할 작은 블러 영역을 선택한 후, 영역을 지우고 같은 설정으로 전체 이미지를 처리하면 과정을 빠르게 할 수 있습니다. 알고리즘은 "링잉" 노이즈를 만들 수 있으며, 입력란 '링잉 억제'로 억제할 수 있습니다. 최적의 범위와 각도를 찾을 때는 억제 값을 낮게 두었다가, 필요에 따라 억제를 추가해 링잉을 줄이는 것이 가장 효과적입니다. 리처드슨-루시 디컨볼루션 방법이 1차원으로 사용됩니다. - ^디지털 카메라 모션 블러 흐릿한 모든 사진이 이 방법에 가장 적합한 등속 블러를 가지고 있는 것은 아닙니다. 이미지는 여러 개의 더 짧은 노출이 중첩된 것일 수 있습니다. 전체 이미지가 동시에 노출되어 같은 블러를 갖지 않을 수도 있습니다(기계식 또는 전자식 이동 셔터). 그럼에도 이 방법은 2차원으로 작동하는 선명하게 하기 도구보다 더 나은 결과를 낼 수 있습니다. 모션 블러가 등속에 더 가까운, 필름 카메라로 촬영한 오래된 사진에서 더 잘 작동할 것입니다. - - TOPIC: 블러 +image: blur.jpg - 해당 체크박스로 방법을 선택하고, 필요한 매개변수를 입력한 후, [적용]를 누르세요. {영역 선택}이 활성화되어 있으면 선택한 영역만 영향을 받습니다. - ^일반 블러 각 픽셀을 반경 내의 주변 픽셀과 혼합합니다. 더 가까운 픽셀이 더 높은 가중치를 갖습니다. 반경을 1로 설정하고 [적용]를 반복해서 눌러 이미지 결과를 지켜보면서 블러를 천천히 늘릴 수 있습니다. - 가로와 세로 값을 따로 입력하면 선택적으로 가로와 세로 방향으로 서로 다른 양만큼 블러를 적용할 수 있습니다. [반경] 입력은 둘 다 같은 값을 강제합니다. - ^방사형 블러 각 픽셀을 선택한 중심에서 뻗어 나온 선을 따라 있는 픽셀과 혼합합니다. Radius는 블러가 적용되지 않는 중앙 영역을 정의합니다. Length는 블러 선의 범위를 설정합니다: 중심에서 가장자리까지 0부터 length까지입니다. 이미지를 클릭해 중심을 선택하세요. - ^방향 블러 마우스를 사용해 이미지의 한 위치를 끌어당기세요. 마우스 주위 영역이 이 방향으로 블러 처리됩니다. Span은 블러 처리되는 영역의 크기를 결정합니다. Intensity는 블러의 강도를 결정합니다. - ^그라데이션 블러 지정한 대비 한계보다 대비가 낮은 픽셀만 블러 처리되며, 블러 반경은 대비가 지정한 한계에서 0까지인 픽셀에 대해 1부터 지정한 값까지 범위를 갖습니다. 간단히 말해: 낮은 대비 픽셀이 높은 대비 픽셀보다 더 많이 블러 처리됩니다. 이는 머리카락을 흐리게 하거나 눈의 반짝임을 줄이지 않으면서 피부톤을 부드럽게 하는 데 사용할 수 있습니다. 극단적으로 사용하면 "카툰" 효과를 만듭니다. - ^배경 블러 (보케) 전경은 선명하게 유지하면서 배경 이미지 영역을 블러 처리합니다. 선명하게 유지할 하나 이상의 영역을 선택하세요 {영역 선택}. 전경 영역을 선택한 후, 선택을 반전해 이제 배경이 선택되도록 하세요 {영역 반전}. 이것이 블러 처리될 영역입니다. 두 가지 블러 방법을 사용할 수 있습니다: 일정한 블러: 블러 처리되는 모든 영역에 일정한 블러 반경이 사용됩니다. 거리에 따라 블러 증가: 전경에 인접한 픽셀에는 최소 블러 반경을, 전경으로부터 최대 거리에 있는 픽셀에는 최대 블러 반경을 사용합니다. 이를 위해서는 모든 배경 픽셀의 가장자리 거리를 계산해야 하며, 상당한 시간이 걸릴 수 있습니다. 가장자리 거리를 다시 계산하지 않고도 블러 반경을 변경할 수 있습니다. - - TOPIC: 노이즈 제거 +image: denoise.jpg - 저조도(고ISO)에서 촬영한 사진의 노이즈를 줄여, 균일한 표면이 얼룩덜룩하게 보이지 않게 합니다. 중앙값과 매끄럽게라는 두 가지 방법이 제공됩니다. 최적의 방법은 노이즈와 이미지 특성에 따라 다릅니다. 방법을 혼합해서 사용하는 것(하나를 사용한 후 다른 것을 사용)이 도움이 될 수 있습니다. Radius 값은 주어진 픽셀을 비교하고 조정하는 데 사용될 픽셀 인접 영역을 정의합니다. 큰 값(Radius > 2)은 노이즈를 더 효과적으로 줄이지만 세부 사항 손실을 일으킬 수도 있습니다. limit 값은 인접 영역 중앙값과 이 값보다 많이 차이 나는 RGB 밝기 값을 가진 픽셀을 무시하게 합니다. 이는 일부 이미지(예: 천체 사진)에서 작고 밝은 세부 사항이 노이즈로 처리되는 것을 막기 위해 필요합니다. - Radius 값을 설정하고 방법 버튼 중 하나를 누르세요. 각 반복은 이전 이미지를 시작점으로 사용하므로, 여러 번 반복하면 노이즈가 점차 억제되고 일부 세부 사항이 흐려질 수도 있습니다. [재설정]을 사용해 처음부터 다시 시작하세요. Radius 1의 중앙값에 이어 Radius 2의 중앙값을 사용하는 것은 노이즈 억제와 세부 사항 보존 사이의 좋은 타협점입니다. - Areas 슬라이더를 사용해 처리를 어두운 영역으로만 제한하거나 더 넓은 범위의 영역으로 제한할 수 있습니다. 어두운 영역은 밝은 영역보다 노이즈 문제가 더 많은 경향이 있습니다. - 작은 노이즈 얼룩이 계속 남아 있다면, limit 값을 늘리고, [재설정] 버튼을 사용한 후, [중앙값]이나 [매끄럽게]를 계속 사용하세요. - 이미지의 다른 영역에 서로 다른 처리를 적용할 수 있습니다 - {영역 선택}을 참고하세요. 또한 다른 영역에 서로 다른 처리를 사용해 이미지를 "페인트"할 수 있습니다 - {페인트 편집}을 참고하세요. - 각 RGB 색상은 독립적으로 처리됩니다. 색도나 명도의 별도 처리는 없습니다. - [measure] 버튼은 실제 이미지 노이즈 수준을 측정하는 오른쪽 대화 상자를 시작합니다. 이미지 위에서 마우스를 움직여 마우스 원(반경 10, 약 300픽셀) 내의 RGB 노이즈 수준을 표시하세요. 노이즈만이 유일한 변화가 되도록 이는 특징이 없는 영역이어야 합니다. 텍스처가 아닌 노이즈를 보고 있는지 확인하려면 이미지를 4배 크기로 검사하세요. 점들은 중앙 실선으로 표시되는 주변 5x5 픽셀의 평균에 대한 개별 픽셀 RGB 값을 보여줍니다. 아래쪽 숫자는 0~255 척도에서 평균 RGB 밝기와 노이즈 수준을 보여줍니다. 그래프 척도는 -10에서 +10이며, 점선은 전체 범위 0~255에 대해 -5와 +5에 있습니다. 9번째나 10번째 RGB 비트의 노이즈는 이 척도에서 0.5나 0.25입니다. - ^RAW 이미지 노이즈 카메라 센서 노이즈를 측정하려면 RAW 이미지를 사용하세요. JPEG 이미지는 노이즈를 줄이기 위해 카메라 내부에서 처리됩니다. RAW 이미지의 일반적으로 높은 노이즈 수준에 놀랄 수도 있습니다. 큰 센서를 가진 값비싼 카메라조차 저노이즈 색상이 8비트 미만일 수 있습니다. RAW 이미지에서 노이즈를 걸러낼 때는, 카메라 JPEG를 만드는 전자 장치 및 소프트웨어와 경쟁하는 것입니다. 이보다 더 잘하는 것은 어려운 도전일 수 있습니다. - - TOPIC: 안개 제거 +image: defog.png +image: defog2.jpg - 이미지나 선택한 영역의 안개/뿌옇게를 제거합니다. 이를 위한 다른 도구들이 있지만(히스토그램 평탄화, 로컬 대비, 대비 증폭, 레티넥스, 채도), 안개/뿌옇게 제거는 이들의 주된 기능에 부차적입니다. 이 기능은 안개/뿌옇게를 직접 공격합니다: R/G/B 색상을 동일한 양만큼 제거하고(밝기를 줄이고 채도를 높임), 선택적으로 손실된 밝기를 다시 더합니다. 먼 안개에서 흔히 발생하는 것처럼 파란색이 너무 지배적이 되면 이를 줄일 수도 있습니다. 원하는 영역을 정밀하게 타겟팅하고 최적화하려면 {영역 선택}이나 {페인트 편집}을 사용해야 할 수 있습니다. 위 예시에서는 전경의 언덕과 배경의 산이라는 두 영역을 사용했습니다. - - TOPIC: 적목 현상 +image: red-eyes1.png +image: red-eyes2.png - 플래시 사진의 적목 현상을 줄입니다. 두 가지 방법이 제공됩니다. 첫 번째는 더 빠르지만 어려운 경우를 처리하지 못할 수 있습니다. 두 번째 방법은 더 견고하지만 시간과 주의도 더 필요합니다. 첫 번째 기능을 사용하려면, 만족할 때까지 적목 부위를 한 번 이상 왼쪽 클릭하세요. 어두워진 영역이 너무 작거나 중심을 벗어났다면, 오른쪽 클릭으로 변경을 취소한 후 적목 중심을 더 정확하게 왼쪽 클릭하세요. 적목 현상을 올바르게 고칠 수 없다면, 오른쪽 클릭으로 변경을 취소한 후 두 번째 방법을 사용하세요. 두 번째 방법은 적목이 약간만 빨갛고 눈꺼풀과의 색상 차이가 자동 알고리즘이 구별하기에 너무 적은 더 어려운 경우를 더 잘 처리할 수 있습니다. 커서를 적목 중심 위에 놓으세요. 마우스 왼쪽 버튼을 누른 채 커서를 아래오른쪽으로 드래그하세요. 적목을 둘러싸는 점선 타원이 나타납니다. 필요하다면 반복해서 적목이 타원 중심에 (대략) 오도록 하세요. 타원의 모양은 드래그 방향에 따라 달라지며, 이를 통해 적목만 더 정밀하게 둘러쌀 수 있습니다. 적목이 어두워지는 것을 지켜보면서 타원 안쪽을 반복해서 왼쪽 클릭하고, 충분히 어두워지면 멈추세요. 너무 지나치면 눈꺼풀이 어두워지기 시작할 수 있습니다. 오른쪽 클릭으로 취소하고 필요하다면 반복하세요. - - TOPIC: 스마트 지우기 +image: smart-erase.png +image: smart-erase2.jpg - 전선, 땅에 떨어진 쓰레기, 표지판 등 좋은 사진을 망칠 수 있는 작은 물체를 지웁니다. 원치 않는 물체는 주변 영역에서 가져온 픽셀로 대체됩니다. 이는 때때로 매우 효과적이며(부작용이 거의 보이지 않음), 때때로 그렇지 않습니다. 사진 속 작거나 좁은 물체에 가장 잘 작동합니다. Radius는 마우스 포인터 주위 원의 크기를 제어해 선택하고 지울 영역을 정의합니다. 마우스를 드래그해 제거할 물체를 둘러싸세요. 왼쪽 드래그는 선택하고 오른쪽 드래그는 선택 해제합니다. [지우기]를 눌러 선택한 영역을 지우고, 선택 영역 바깥에서 가장 가까운 픽셀로 픽셀을 대체하세요. 선택이 충분히 정밀하지 않았다면, [실행 취소]를 사용하고, 선택 영역을 조정한 후 [지우기]를 다시 누르세요. 반복된 선택과 지우기는 [New_Area]를 사용해 새 선택을 시작할 때까지 누적됩니다. 이전에 지운 영역은 이제 고정되며 [실행 취소]는 이후 선택에만 작동합니다. 이미지를 200% 이상으로 확대해 작업하는 것이 가장 좋습니다. Blur 컨트롤은 대체 픽셀에 블러를 추가합니다. 대체 픽셀이 주변보다 더 선명할 수 있으므로, 이는 눈에 보이는 부작용을 줄일 수 있습니다. Blur 설정을 변경하고 [지우기] 버튼을 반복하세요. [show]와 [hide] 버튼을 사용해 현재 선택의 윤곽선을 표시하거나, 지운 후 결과를 더 잘 판단하기 위해 숨길 수 있습니다. - 길고 가는 물체(예: 전선)의 경우, 두 위치를 클릭하면 그 사이의 모든 것이 선택됩니다. 선택은 직선으로 작동하므로, 곡선 물체의 경우 곡선을 따라가려면 간격을 두고 클릭해야 합니다. - - TOPIC: 헤일로 제거 +image: remove-halo.png +image: remove-halo2.png - 일부 편집 기능으로 생긴 헤일로를 제거합니다. 헤일로 유형을 선택하세요: 밝음(가장 흔함) 또는 어두움. 예시에 나온 것처럼, 헤일로 영역 위에서 마우스를 왼쪽 드래그해 마우스 안의 픽셀을 변경하세요. 밝은 헤일로의 경우, 마우스가 드래그되면서 가장 밝은 픽셀이 어두워집니다. 어두운 헤일로의 경우, 가장 어두운 픽셀이 밝아집니다. 예시에서처럼 헤일로 너비보다 큰 마우스 반경을 사용하세요. 원본 픽셀을 복원하려면 마우스를 오른쪽 드래그하세요. - - TOPIC: JPEG 아티팩트 +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - 고압축된(낮은 품질 설정으로) JPEG 이미지는 작은 직사각형 블록 형태의 압축 아티팩트를 보일 수 있습니다. 사진의 일부 영역에서 밝기 범위가 확장되었다면, 밝기 단계가 더 커지기 때문에 이러한 블록이 더 눈에 띌 수 있습니다(예: RGB 값 11/12/13이 5배 밝아져 55/60/65가 됨). 이 기능은 블록 사이의 경계를 블러 처리해 덜 눈에 띄게 합니다. - 'Match Limit'은 인접한 픽셀을 같은 픽셀 블록의 구성원으로 취급할지 결정합니다. 이러한 블록을 더 완전하게 매핑하려면 Match Limit을 더 낮은 값으로 설정할 수 있습니다. 'Contrast Limit'은 대비가 높은 가장자리가 블렌드되어 세부 사항이 손실되는 것을 막는 역할을 합니다. 두 설정을 변경하고 [적용]를 누르세요. 최적화가 중요하다면 결과 이미지를 2배 이상 크기로 보고 다른 설정을 시도하세요. 이 기능은 크기가 조정된 이미지에서는 효과가 떨어집니다. {영역 선택}을 사용해 문제 영역을 선택적으로 처리하세요. - - TOPIC: 안티앨리어스 +image: anti-alias.jpg - 때때로 사진은 일부 고대비 특징 가장자리를 따라 픽셀화('계단 현상')를 보입니다. 위 예시에서는 새의 눈 주위에서 이를 볼 수 있습니다. 안티앨리어스 도구는 이를 줄일 수 있습니다. 대부분의 사진에서는 효과가 미미한데, 카메라 내부 처리가 이미 문제를 해결했을 수 있기 때문입니다. 부차적인 효과로는 고압축 이미지의 jpeg 아티팩트가 다소 매끄러워진다는 것입니다. 크기가 확대된 이미지는 더 두드러진 픽셀화를 갖습니다. 특히 2배 확대의 경우 이를 개선할 수 있습니다. - [적용] 버튼을 사용해 픽셀을 억제하세요. 도움이 되는 것 같다면 여러 번 사용하세요. 'Threshold'를 사용해 낮은 대비 픽셀을 처리에서 제외할 수 있습니다. 보통 0.1 이하의 값이 가장 좋습니다. - Fotocx는 Scale3x 알고리즘을 사용하며, "같음"과 "다름" 대신 "비슷한"과 "다른" 색조를 사용하도록 수정되었습니다. - - TOPIC: RGB 조정 +image: adjust-RGB.png - 전체 밝기와 대비, 또는 선택한 색상의 밝기와 대비를 변경합니다. • Brightness - 전체 이미지 밝기 증가 또는 감소 • +Red -Cyan 등 - 색상 밝기를 변경하고 보색을 반대 방향으로 변경 • Contrast All - 전체 이미지 대비 증가 또는 감소 • Contrast Red Green Blue - 개별 RGB 색상 처리 - - TOPIC: HSL 조정 +image: adjust-HSL.png - HSL(색조, 채도, 명도)을 사용해 이미지에서 선택한 색상 범위를 변경합니다. 이 기능은 색 편향을 고치거나 한 색상을 다른 색상으로 바꾸는 데 사용할 수 있습니다(예: 과다 노출된 하늘 - 너무 흼). HSL 색상 모델에 익숙하지 않다면 이에 대한 Wikipedia 문서를 읽어 보세요. - 먼저 Shift + 왼쪽 클릭으로 이미지에서 맞추고 조정할 대상 색상을 선택하세요. 이 색상이 조정을 위해 선택될 색상 범위의 중심이 됩니다. 색조, 채도, 명도 체크박스를 사용해 어떤 색상 속성을 일치시킬지 선택하세요. 이들 각각은 선택된 색상 범위를 좁힙니다. 아무것도 체크하지 않으면 모든 색상이 선택됩니다. Match Level을 사용해 선택된 색상 범위를 더 넓힐 수 있습니다. 100%는 밀접하게 일치하는 색상만 선택됨을 의미합니다. - Output Color 컨트롤(색조, 채도, 명도)은 선택한 입력 색상을 대체하거나 혼합할 새 출력 색상을 설정하는 데 사용됩니다. Shift + 오른쪽 클릭으로 이미지에서 이 색상을 설정할 수도 있습니다. 결과 색상은 원본 색상과 새 색상의 혼합이 됩니다. 새 색상의 비율은 0에서 100%로 설정할 수 있는 Adjustment 슬라이더로 설정됩니다. HSL 체크박스를 사용해 입력 색상의 어떤 HSL 구성 요소가 출력 색상의 해당 HSL 구성 요소로 대체될지 결정하세요. 출력 색상 HSL 슬라이더를 사용해 새 색상을 조정하세요. 출력 색상은 왼쪽의 더 작은 상자에 표시되며, 슬라이더를 움직이면 업데이트됩니다. - 슬라이더를 움직이면서 실시간 이미지 업데이트를 지켜보며 결과를 최적화하세요. 이는 그리 직관적이지 않으므로 연습이 도움이 됩니다. 힌트: 먼저 색조와 채도로 일치시키고 색조만 대체하는 것으로 시작하세요 - 이는 출력 색상의 채도와 명도는 원본 이미지 색상에서 복사되고 색조만 대체됨을 의미합니다. - - TOPIC: 먼지 제거 +image: remove-dust.png +image: remove-dust2.jpg - 먼지가 낀 슬라이드를 스캔해 만든 이미지에는 작고 어두운 반점(슬라이드 위 먼지의 그림자)이 많을 수 있습니다. 인터넷의 오래된 사진에도 비슷한 문제가 흔히 있습니다. 이 기능으로 이러한 반점의 대부분을 제거할 수 있습니다. 최대한 많은 먼지 반점이 빨갛게 표시될 때까지 세 개의 슬라이더를 움직인 후, [지우기] 버튼을 눌러 지우세요. [red]를 눌러 빨간 보기로 돌아간 후, 슬라이더를 다시 조정하고 [지우기]를 누를 수 있습니다. "spot size limit" 슬라이더는 지워질 반점의 크기를 제한합니다. "max. brightness" 슬라이더는 충분히 어둡지 않은 반점을 무시하는 임계값을 설정합니다. "min. contrast" 슬라이더는 주변과의 대비가 낮은 반점을 걸러냅니다. 이 과정은 보통 타협이 필요합니다. 설정이 최적이 아니면, 나뭇잎 같은 작은 특징이 지워지거나, 큰 반점이 그대로 남을 수 있습니다. 이미지의 다른 부분에는 다른 설정이 필요할 수 있습니다. 예를 들어 하늘은 건물 벽보다 더 적극적으로 처리할 수 있습니다. 필요에 따라 다른 설정으로 먼지 지우기를 여러 번 사용해 모든 먼지 반점을 제거할 수 있습니다. 또는 {영역 선택}을 사용해 이미지를 구역별로 처리할 수 있습니다. 일부 반점이 계속 남아 있다면, {스마트 지우기}로 수동으로 처리할 수 있습니다. 작은 마우스 반경을 설정하고 각 반점을 클릭해 제거하세요. 섬유(길고 가는)로 인한 반점은 보통 자동으로 제거되지 않지만, 스마트 지우기가 여기서 효과적일 수 있습니다. 위 예시처럼 먼지가 밝다면, {색상 모드}를 사용해 컬러 네거티브를 만들고, 먼지를 처리한 후, 컬러 네거티브를 다시 적용해 정상 이미지를 복원하세요. - - TOPIC: 색 번짐 +image: fringes.png +image: fringesA.jpg - 주변부 색 번짐(측면 색수차)을 보정합니다 - 색 번짐이 주로 이미지 바깥쪽 영역에 나타나는 경우입니다. - 위 왼쪽 이미지는 측면 색수차가 있는 사진의 왼쪽 위 모서리를 확대한 부분입니다. 이는 오른쪽의 처리된 이미지에서 대부분 제거되었습니다. 색 번짐은 고대비 가장자리를 따라, 특히 렌즈 왜곡이 보통 가장 심한 이미지 바깥쪽 영역에서 나타날 수 있습니다. 이를 없애려면, 이미지를 최대 크기로 확대하고 색 번짐이 있는 영역을 중심에 놓으세요. [search] 버튼을 누르세요. 빨강과 파랑 색상 평면이 초록 평면에 더 잘 맞도록 재조정되며, 사용된 계수는 대화 상자에 채워집니다. 대화 상자에서 계수를 직접 수정해 결과를 개선할 수 있을 것입니다: 이미지의 색 번짐을 지켜보면서 계수를 변경하세요. - 이미지가 잘려서 이미지 중심이 더 이상 원본 사진의 중심과 같지 않다면 이 기능의 효과가 떨어집니다. - - TOPIC: 보정 메뉴 - - TOPIC: 히스토그램 평탄화 +image: flatten1.jpg +image: flatten2.jpg - 대비가 낮은 영역에서 보이는 세부 사항을 늘립니다. 픽셀 주위 영역의 밝기 분포(히스토그램)를 더 균일하게 만들기 위해 픽셀 밝기가 위나 아래로 조정됩니다. 더 작은 반경(더 작은 영역)은 효과를 강화합니다. 가장 어두운(1)부터 가장 밝은(5)까지 5개의 밝기 구역이 있습니다. 슬라이더를 움직여 해당 구역의 효과를 늘리세요. zone A 슬라이더를 사용해 5개의 슬라이더를 함께 움직여 초기 결과를 빠르게 설정하세요. 그런 다음 다른 슬라이더를 개별적으로 사용해 이미지를 미세 조정하세요. - - TOPIC: 로컬 대비 +image: localcon1.jpg +image: localcon2.jpg - 이미지의 모든 영역에서 대비를 늘립니다. 각 픽셀의 밝기가 주변 영역의 평균 밝기와 비교됩니다. 이 차이를 늘리기 위해 픽셀 밝기가 조정됩니다. 이 기능은 널리 사용되는 교과서적 방법을 구현합니다. Radius는 평균 밝기 계산에 사용되는 각 픽셀 주위 영역의 크기를 결정합니다. Power는 밝기 변화의 양을 결정합니다. Color는 색 채도를 늘리는 데 사용됩니다. 편집 가능한 곡선을 사용해 선택한 밝기 수준에 대해 출력 이미지를 밝게 할 수 있습니다. 예시는 이미지의 더 어두운 영역이 밝아지는 것을 보여줍니다. - 로컬 대비는 상황에 따라 "헤일로"를 만들 수 있습니다: +image: localcon3.jpg - 원본 이미지는 왼쪽에 있습니다. 가운데 이미지는 최대 파워로 로컬 대비를 적용한 것입니다. 어두운 언덕과 밝은 하늘의 경계를 따라 헤일로가 보입니다. 이는 간단한 트릭으로 고칠 수 있습니다(오른쪽 이미지). {영역 선택}을 사용해 하늘 영역을 따로 선택하세요. 이 영역에 로컬 대비를 적용하세요. 선택을 반전하고 나머지 이미지에 로컬 대비를 적용하세요. - - TOPIC: 대비 증폭 +image: amplify-contrast.png +image: amplify-contrast2.jpg - 로컬 대비를 늘려 이미지의 겉보기 밝기 범위를 늘립니다. 대비가 높은 영역은 변경하지 않으면서 대비가 낮은 영역을 늘릴 수 있습니다. 편집 곡선을 사용해 초기 대비량에 따라 대비 증폭을 조정할 수도 있습니다. - 곡선 아래의 Amplify 슬라이더는 대비 증폭 없음부터 전체 증폭까지 계산을 조절합니다. 너무 오른쪽으로 이동하면 이미지에 보기 싫은 아티팩트가 나타날 수 있으므로, 이것이 사라질 때까지 다시 되돌리세요. 균일한 영역(예: 하늘)이 얼룩덜룩해지면, 곡선의 왼쪽 끝을 아래로 당겨 대비가 낮은 영역의 증폭을 줄이세요. 어떤 경우에는 이미지의 다른 영역을 선택해 따로 처리하는 것이 가장 좋습니다. 예를 들어 하늘은 보수적으로, 돌담 같은 질감 있는 표면은 더 적극적으로 처리하세요. - - TOPIC: 전역 레티넥스 +image: global-retx.png +image: global-retx2.jpg - 극심한 안개/뿌옇게나 색 편향이 있는 이미지(예: 100년 된 사진)의 색상과 대비를 개선합니다. 먼저 [Auto] 버튼을 시도해 보세요. 이미지를 검색해 존재하는 가장 밝고 가장 어두운 RGB 색상을 찾습니다. 가장 어두운 RGB 값이 모든 픽셀에서 차감되고, 결과 RGB 값은 최대 RGB 값이 255에 가까워지도록 확대됩니다. 물론 이것이 처음부터 최적이 아닐 수 있습니다. 스핀 버튼은 찾은 어둠/밝음 RGB 한계로 설정되며, 결과 이미지를 최적화하기 위해 이를 변경할 수 있습니다. 대화 상자에서 해당 옵션을 선택하고 이미지를 클릭해 직접 어둠/밝음 지점을 선택할 수 있습니다. 배수 스핀 버튼은 기본적으로 1.0으로 설정되며, 각 RGB 색상의 상대적 밝기를 조정하기 위해 이 값을 변경할 수 있습니다. 위 예시에서, 첫 번째 이미지는 원본이고, 두 번째 이미지는 [Auto] 버튼을 사용해 만들어졌습니다. 스핀 버튼의 가장 오른쪽 열은 같은 행의 모든 버튼을 함께 조정합니다 - 마우스 휠이나 키보드 위/아래 화살표 키를 사용하세요. - blend 슬라이더는 입력 이미지와 레티넥스 이미지를 원하는 비율로 혼합하는 데 사용됩니다. reduce bright 슬라이더는 레티넥스가 이상한 결과를 낼 수 있는 더 밝은 이미지 영역, 특히 하늘에서 효과를 약화시키는 데 사용됩니다. - 이 알고리즘은 1970년대에 Edwin Land가 처음 발표한 개념에서 파생되었습니다. 자세한 내용은 인터넷에서 'retinex'를 검색해 보세요. - - TOPIC: 로컬 레티넥스 +image: local-retx.png +image: local-retx2.jpg - 어두운 이미지 영역과 대비가 낮은 다른 영역에서 보이는 세부 사항을 늘립니다. 각 픽셀 주위 구역의 밝기 범위는 그 구역 전체가 0~255 밝기 범위 전체를 커버하도록 재조정된 것처럼 픽셀 밝기를 재조정하는 데 사용됩니다. 로컬 레티넥스는 전역 레티넥스가 약한 곳에서 극적인 결과를 낼 수 있습니다. - radius 입력은 각 픽셀 주위 구역의 대략적인 크기를 결정합니다. blend 슬라이더는 입력 이미지와 레티넥스 이미지를 원하는 비율로 혼합하는 데 사용됩니다. reduce bright 슬라이더는 레티넥스가 이상한 결과를 낼 수 있는 더 밝은 이미지 영역, 특히 하늘에서 효과를 약화시키는 데 사용됩니다. reduce dark 슬라이더는 더 어두운 이미지 영역에 대해 같은 역할을 합니다. 위 예시는 약 원본 이미지 60% + 레티넥스 40%입니다. - - TOPIC: 채도 +image: saturation.png - 픽셀 밝기에 따라 색 채도를 조정합니다. 편집 곡선의 Y축은 색 채도이며, 무색(모든 RGB 값이 같음)에서 최대 색상(가장 낮은 RGB 값이 0)까지입니다. 곡선의 X축은 픽셀 밝기이며, 어두움에서 최대 밝기까지입니다. 중립 위치(색상 변화 없음)는 중간값이며, 이는 초기값이기도 합니다. 예: 이미지의 어두운 영역의 색 강도를 늘리려면, 곡선의 왼쪽 끝을 올리세요. Saturation 슬라이더는 모양을 바꾸지 않고 곡선 전체를 위나 아래로 이동합니다. - - TOPIC: 소프트 포커스 +image: soft-focus2.jpg +image: soft-focus.png - 사진에 고전적인 "소프트 포커스" 효과를 적용합니다. 이는 선명한 이미지와 약간 흐릿한 이미지의 혼합입니다. radius 설정은 블러의 범위(픽셀 폭)를 결정하고, mix 설정은 혼합된 출력 이미지에서 흐릿한 이미지의 비율을 0에서 100퍼센트까지 설정합니다. 이미지의 다른 영역에 효과를 다르게 적용하려면 이 기능과 함께 {페인트 편집}을 사용할 수 있습니다. - - TOPIC: 밝기 그라데이션 +image: brite-ramp1.png +image: brite-ramp2.png - 이미지 전체에 걸쳐 밝기나 색상을 변화시킵니다. 이를 사용해 고르지 않은 조명이나 이미지 전체에 걸쳐 변하는 색 편향을 보정할 수 있습니다. 변화 방향은 이미지에 선을 그려 결정됩니다. 이미지를 클릭해 선을 만든 후, 양 끝을 드래그해 원하는 방향을 설정하세요. 위 예시에서는 선의 방향으로 초록색이 증가했습니다. 먼저 All 곡선을 편집해 전체 밝기(모든 색상)를 조정한 후, 필요하다면 개별 RGB 색상 곡선을 조정하세요. - - TOPIC: 비네트 +image: vignette.png +image: vignette2.jpg - 사진 모서리에서 때때로 보이는 어두워짐을 보정합니다. 이미지 내 물체나 영역을 강조하거나 색을 입히는 데도 사용할 수 있습니다. - 이미지를 클릭하거나 드래그해 비네트 중심을 변경하세요. 처음에는 이미지의 중심에 있습니다. - 이미지의 밝기를 방사형 패턴으로 변경하려면 'Brightness'를 선택하세요: 곡선의 왼쪽이나 오른쪽 끝을 조정해 각각 이미지의 중심과 가장자리의 밝기를 변경하세요. 인물 사진의 얼굴에 어두운 배경을 줄 수도 있고, 모서리가 어두워진 이미지를 고칠 수도 있습니다. 곡선의 중간 수준은 변화 없음에 해당합니다. 어둡게 하려면 더 낮은 값을, 밝게 하려면 더 높은 값을 사용하세요. 위 예시는 넓은 중앙 영역은 그대로 두면서 이미지 주변부를 점차 어둡게 합니다. - 이미지에 방사형 패턴으로 선택한 색상을 추가하려면 'Color'를 선택하세요. 곡선 값이 0이면 변화가 없으며, 값이 높을수록 이미지에 선택한 색상이 더해집니다. 최댓값은 100% 색상에 해당합니다. 이 기능을 사용해 이미지에 색상 배경을 추가하세요. 예: 점차 강해지는 색상으로 얼굴을 둘러싸기. - - TOPIC: 효과 메뉴 - - TOPIC: 윤곽선 +image: outlines1.png +image: outlines2.jpg - 사진을 윤곽선 그림으로 변환합니다. 고대비 픽셀은 강화되고 저대비 픽셀은 억제됩니다. threshold 설정은 대비 임계값을 설정합니다. 최솟값보다 낮은 선은 표시되지 않고, 최댓값보다 높은 선은 최대 밝기를 갖습니다. 'black/white' 체크박스는 'negative' 체크박스에 따라 색상 선을 흰 바탕 위 검정이나 검정 바탕 위 흰색으로 변환합니다. 원한다면 'Low Amplify'를 사용해 흐릿한 선을 밝게 하세요. 'Mode B'는 'Mode A'에 비해 더 균일한 선 밝기를 만듭니다. - - TOPIC: 스케치1 +image: sketch1.jpg - 사진을 스케치와 비슷한 것으로 변환합니다. 어두운 픽셀은 더 적은 픽셀로 모여, 비워진 영역이 더 밝아집니다. 대비도 어두운 픽셀의 대용으로 사용할 수 있습니다. Threshold는 밝기로 입력 이미지를 걸러내는 데 사용할 수 있습니다. Clip Level은 고립되거나 아주 약간 어두운 픽셀을 더 줄이기 위해 출력을 걸러내는 데 사용됩니다. 전경과 배경의 색상을 선택하세요. 입력 이미지의 크기를 줄이면 흥미로운 결과를 얻을 수 있습니다. 결과가 "지저분해" 보인다면, 여기서 처리하기 전에 {노이즈 제거}나 {퓨전}을 사용해 이미지를 매끄럽게 하세요. - - TOPIC: 스케치2 +image: sketch2.png +image: sketch2b.jpg - 사진을 스케치와 비슷한 것으로 변환합니다. 다른 방법을 사용합니다: 낮은 대비 ... 높은 대비 픽셀이 각각 밝은 ... 어두운 픽셀로 변환됩니다. 곡선을 사용해 대비 변환의 강도를 늘리거나 줄일 수 있습니다. X축 척도는 픽셀 대비로 낮음에서 높음까지이며, y값은 변환의 강도를 결정합니다. 예시는 낮은 대비 픽셀이 억제(더 밝아짐)되는 것을 보여줍니다. 입력 이미지는 원하는 비율로 블렌드될 수 있습니다. 결과가 "지저분해" 보인다면, 여기서 처리하기 전에 {노이즈 제거}나 {퓨전}을 사용해 이미지를 매끄럽게 하세요. - - TOPIC: 카툰 +image: cartoon.jpg - 사진을 카툰풍 그림으로 변환합니다. 밝기나 색상이 갑자기 변하는 이미지 내 특징 가장자리 위에 검은 선이 그려집니다. Line Threshold는 가장자리 감지와 선 그리기의 민감도를 설정해 더 적거나 더 많은 선이 그려지게 합니다. Line Width는 선을 더 두껍거나 얇게 만듭니다. Kuwahara Depth는 이미지 내 특징 가장자리를 강화할 수 있는 선명하게 하기 기능을 제어합니다. - - TOPIC: 엠보싱 +image: emboss2.jpg +image: emboss.png - 이미지를 모의 부조나 엠보싱 이미지(3D 효과)로 변환합니다. 특징 가장자리는 마치 옆에서 들어올려져 빛을 받은 것처럼 한쪽은 더 밝게, 반대쪽은 더 어둡게 만들어집니다. radius 설정은 효과의 너비를 결정하고, depth 설정은 강도를 결정합니다. Light Source 설정은 겉보기 조명이 오는 각도를 결정합니다. 이 각도와 가장 수직인 특징 가장자리의 효과를 최대화하기 위해 이를 변경할 수 있습니다. - - TOPIC: 타일1 이미지를 단색 타일 배열로 변환합니다. 타일 크기와 타일 사이 간격의 두께를 조절할 수 있습니다. 이는 '픽셀화'라고도 합니다. 영역 선택을 사용해 변환을 얼굴 등 제한된 영역으로 한정하세요. - - TOPIC: 타일2 +image: tiles2a.png +image: tiles2b.png - 이미지를 이미지의 색상과 윤곽에 대략적으로 맞춘 불규칙 타일로 변환합니다. ^base size:^ 더 큰 타일을 만드는 데 사용되는 단위 타일 크기인 타일 기본 크기. ^color depth:^ 사용할 색상 수: 1 = 8색, 2 = 64색 ... 8 = 1600만 색. ^tile area goal^: 타일 크기의 상한(픽셀 면적). ^req. color match^: 더 작은 영역이 인접한 더 큰 영역에 통합되는 데 필요한 최소 색상 일치를 설정하세요: 0 = 상관없음(최대 통합), 100 = 완벽한 일치 필요(최소 통합). - - TOPIC: 페인팅 +image: painting1.png +image: painting2.png - 이미지를 회화와 비슷한 것으로 변환합니다. 색상 수를 줄이고, 같은 색상을 가진 각 연속 픽셀 영역을 매핑한 후, 더 작은 영역을 가장 잘 맞는 색상을 가진 인접한 더 큰 영역에 통합합니다. - ^blur radius^: 처리 전에 이미지를 블러 처리합니다. 이는 더 매끄러운 경계를 만듭니다. ^color depth^: 사용할 색상 수: 1 = 8색, 2 = 64색 ... 8 = 1600만 색. ^patch area goal^: 자체 색상을 가질 영역의 하한을 설정하세요: 이 픽셀 수보다 작은 영역은 가장 가깝게 일치하는 색상을 가진 인접 영역으로 흡수됩니다. ^required color match^: 더 작은 영역이 인접한 더 큰 영역에 통합되는 데 필요한 최소 색상 일치를 설정하세요: 0 = 상관없음(최대 통합), 100 = 완벽한 일치 필요(최소 통합). ^borders^: 모자이크 속 불규칙 타일처럼 색이 입혀진 영역을 얇은 검은 테두리로 구분할지 결정합니다. 이 기능을 사용한 후 {엠보싱}을 사용하면 이미지에 흥미로운 텍스처를 더할 수 있습니다. - - TOPIC: 텍스처 +image: texture2.jpg +image: texture.png - 이미지나 이미지 내 선택 영역에 질감이 있는 표면을 추가합니다. Radius는 텍스처 패턴 크기를 결정합니다. Strength는 거의 보이지 않는 것부터 지배적인 것까지 패턴의 강도를 결정합니다. - - TOPIC: 퓨전 +image: fusion.png +image: fusion2.jpg - 더 큰 이미지 특징의 선명도는 유지하면서 이미지의 작고 낮은 대비의 세부 사항을 억제합니다. [시작]를 누르고 이미지를 자세히 지켜보세요. 이 과정은 [중지] 버튼으로 멈출 때까지 계속 실행됩니다. 작은 세부 사항이 서서히 사라집니다. 대화 상자의 'count' 레이블은 반복 횟수를 보여줍니다. [중지]으로 과정을 멈추고 이미지를 검사한 후 [시작]로 처리를 재개할 수 있습니다. 실행 취소/다시 실행 버튼을 사용해 전/후 이미지 상태를 비교하세요. [시작]로 처리를 재개하세요. [단계] 버튼을 사용해 한 번에 한 단계씩 처리할 수 있습니다. - - TOPIC: 색상 맞추기 +image: match-colors.png - 한 이미지의 색상을 다른 이미지의 색상에 맞춥니다. 마우스 클릭으로 선택한 작은 지점이 각 이미지에서 샘플링됩니다. 두 번째 이미지의 지점은 첫 번째 이미지 지점과 같은 평균 색상(RGB 값)을 갖도록 만들어집니다. RGB 값을 같게 만드는 데 사용된 계수는 두 번째 이미지의 모든 픽셀에 적용됩니다. 일반적인 사용법은 다른 이미지의 색상과 맞출 지점을 이미지에 표시해 색 편향을 제거하는 것입니다. - 절차: 대화 상자는 순서대로 수행할 5단계를 나열합니다. • 지점 샘플 영역의 반경을 설정하세요. 결과 마우스 원이 샘플링될 지점 영역입니다. • [open] 버튼을 눌러 첫 번째 이미지를 여세요. • 이미지를 클릭해 색상 샘플을 채취하세요. • [open] 버튼을 눌러 두 번째 이미지를 여세요. • 첫 번째 이미지와 맞추고 싶은 지점에서 이미지를 클릭하세요. 이미지 색상은 1~2초 내에 변경됩니다. - - TOPIC: 패턴 +image: pattern2.jpg +image: pattern1.png - 이미지에 배경 패턴을 추가합니다. 작은 이미지 파일(패턴 파일)이 타일 벽처럼 파일을 반복해 현재 이미지를 덮는 데 사용됩니다. 이 파일은 실제 패턴(예: 캔버스 천, 벽돌 벽, 반복되는 기하학 무늬 등의 이미지)이거나 다른 종류의 이미지일 수 있습니다. 패턴은 반투명하게 만들어져, 기본 이미지가 패턴 위에 인쇄된 것처럼, 또는 패턴이 이미지 위에 있는 것처럼 보입니다. "pattern image"로 웹 검색하면 많은 패턴 파일을 찾을 수 있습니다. 이들을 다운로드하고 필요하다면 200~500픽셀 정도 크기로 자르세요. 편의를 위해 이들을 ~/.fotocx/patterns의 제공된 패턴 파일에 추가하세요. - [찾아보기] 버튼을 사용해 패턴 파일을 선택하세요. 선택한 패턴은 기본 이미지를 덮도록 타일 처리됩니다. 패턴은 부분적으로 투명해 기본 이미지가 비쳐 보입니다. Zoom을 사용해 패턴 크기를 늘리거나 줄이세요. 패턴을 기본 이미지와 혼합하는 방법은 두 가지입니다. 패턴 불투명도는 0~100%로 설정할 수 있습니다. 사용되지 않은 불투명도는 기본 이미지로 채워집니다. Contrast는 패턴 밝기를 템플릿으로 사용해 기본 이미지 밝기를 수정하는 데 사용됩니다. 두 매개변수는 원하는 비율로 혼합할 수 있습니다. - 패턴 파일에 가로와 세로 모두 일정한 간격으로 반복되는 이미지가 포함되어 있다면, [계산] 버튼을 사용해 눈에 보이는 이음매 없이 연속된 패턴을 만들도록 너비와 높이를 설정할 수 있습니다. - 패턴이 불규칙하고 이음매가 눈에 띈다면, 이를 개선할 수 있을 것입니다. 두 개의 Overlap 값은 반복된 패턴이 가장자리에서 가로와 세로로 얼마나 겹치는지를 결정합니다. 겹침을 추가해 가장자리 효과를 가리세요. - 영역 선택을 사용해 이미지의 일부에 패턴을 적용하거나, 다른 부분에 다른 패턴을 적용할 수 있습니다. 이미지에 패턴을 적용한 후, {엠보싱}을 사용해 패턴에 3D 효과를 더하면 흥미로울 수 있습니다. - "Grayscale" 체크박스는 컬러 패턴을 그레이스케일로 변환합니다. - - TOPIC: 크로스해치 +image: crosshatch2.jpg +image: crosshatch1.png - 이미지를 교차하는 평행선을 사용한 그림으로 변환합니다. 격자 크기를 입력하고 [적용]를 누르세요. - - TOPIC: 디더 +image: dither1.png - +image: dither2.jpg - 이 기능은 이미지를 디더링하는(점으로 변환하는) 여러 방법을 제공합니다. 0 - 로이 리히텐슈타인 스타일의 색 점 1 - 무작위 또는 최적화된 공간 분포를 가진 순수 R/G/B 또는 흑백 2 - 지정된 비트 심도를 사용한 RGB 혼합 3 - 사용자 지정 색상 팔레트를 사용한 고전적 디더 4 - 압축된 픽셀의 평균 색상으로 이미지를 덩어리로 압축 - 고전적인 디더는 색상 오차를 보정하는 Floyd-Steinberg 방법을 사용합니다: 입력 이미지 색상과 팔레트에서 가장 가까운 색상 사이의 불일치입니다. 영역의 평균이 입력 색상과 더 가깝게 맞도록 필요에 따라 인접한 색상의 점이 섞입니다. 뚜렷한 색상 띠나 윤곽을 얻고 싶다면 원할 경우 오차 보정을 끌 수 있습니다. - Blobs: 이미지 픽셀은 일종의 "중력 붕괴"를 겪으며, 국소 질량 중심 주위로 덩어리처럼 모입니다. 'Mass'는 픽셀 밝기로 정의됩니다. 'radius' 컨트롤은 끌어당김의 범위를 대략적으로 정의합니다. [시작]를 눌러 붕괴를 시작하세요. 이미지가 서서히 'radius' 입력값 정도 크기의 덩어리로 변하는 것을 지켜보세요. 덩어리가 보기 좋게 둥글어지고 거의 변하지 않으면, [중지]을 눌러 과정을 마치세요. - - TOPIC: 판화 효과 +image: engrave.png +image: engrave2.png - 이미지를 흑백 선으로 변환합니다. Size 입력은 선의 두께와 출력 선의 각 세로 픽셀 열에 몇 개의 세로 이미지 픽셀이 사용되는지를 결정합니다. 선 픽셀 열은 입력 픽셀의 평균 밝기와 대략 일치하는 비율로 검은 부분과 흰 부분으로 나뉩니다. Bias 입력은 전체 밝기를 최적화하는 데 사용할 수 있습니다. 음수/양수 값은 이미지를 더 어둡게/밝게 만듭니다. Color 입력(0~100%)을 사용해 흰 부분에 색을 더할 수 있습니다. - - TOPIC: 눈부심 효과 추가 +image: addglare.png +image: addglare2.jpg - 이미지의 밝은 지점에서 방사되는 눈부심 효과를 추가합니다. Power: 눈부심의 상대적 밝기를 결정 Limit: 눈부심을 방출하는 픽셀 밝기 임계값 Range: 방출 픽셀로부터의 눈부심 픽셀 범위 밝기가 limit(200~255)보다 높은 픽셀은 눈부심을 방출합니다. 여기서 밝기는 픽셀 내 가장 밝은 RGB 색상의 밝기를 의미합니다. 방출된 눈부심은 방출하는 픽셀의 색상을 갖습니다. Range는 픽셀 단위입니다. 눈부심은 방출 픽셀에서 최대이며 range 한계에서 0으로 점차 줄어듭니다. - - TOPIC: 모자이크 +image: mosaic1.png +image: mosaic2.jpg - 모든 이미지로 만든 타일을 사용해 모자이크 이미지를 만듭니다. - 픽셀 단위로 타일 크기(예: 36 x 24)를 지정하고 [타일]를 누르세요. 모든 이미지로부터 타일이 생성됩니다(속도를 위해 실제로는 thumbnail 이미지가 사용됩니다). 타일 크기를 변경했다면 [타일]를 다시 눌러 타일을 재생성하세요. 타일이 생성되면 [이미지]를 눌러 이 타일을 사용해 현재 이미지를 모자이크로 변환하세요. 타일은 타일 위치에서 평균 타일 색상을 평균 이미지 색상에 맞춰 선택됩니다. 수천 개의 이미지를 사용할 수 있고 색상 범위가 충분히 좋다면, 모자이크는 꽤 잘 나올 것입니다. 이미지의 어느 부분이든 확대해 타일 이미지를 보세요. - Tile blending 슬라이더는 이미지를 타일과 블렌드해, 타일의 색상이 잘 맞지 않을 때 더 좋아 보이게 합니다. 블렌드가 약 50% 미만이면, 눈이 잘못된 색조를 보정하기 때문에 타일은 이전과 거의 같이 선명하게 유지됩니다. - 모자이크가 만들어진 후, 어떤 타일이든 클릭해 더 큰 팝업 이미지를 볼 수 있습니다. 저장된 모자이크를 열었다면, 더 큰 이미지를 위해 타일을 클릭하는 것은 작동하지 않습니다. 모자이크 재생성은 꽤 빠르므로, 팝업이 작동하기를 원한다면 이를 수행하세요. - - TOPIC: 노이즈 추가 +image: add-noise.png - 이미지에 무작위 색상 노이즈를 추가합니다. 목표 반점 크기 1~10과 노이즈 수준 0~100%를 설정하세요. 100%에서는, -127에서 +127 범위의 무작위 노이즈가 각 픽셀의 각 RGB 값에 추가됩니다. 평균값은 0입니다. 0~255 범위를 벗어난 값은 잘립니다. 넓은 영역의 평균 색상은 노이즈가 중첩된 채로 보존됩니다. 영역 선택이나 페인트 편집과 함께 노이즈 추가를 사용해 선택한 영역에 노이즈를 추가할 수 있습니다. - ^'밴딩' 억제 밝기 분포가 '늘어난' 이미지 영역에서는, 거의 균일한 밝기와 색상을 가진 영역에서 눈에 보이는 '밴딩'이 발생할 수 있습니다. 영향을 받은 영역에 노이즈(또는 블러)를 추가해 이 문제를 줄일 수 있습니다. - - TOPIC: 색상 설정 +image: set-colors1.jpg +image: set-colors2.jpg - 포스터 효과를 만들기 위해 이미지에 사용된 색상 수를 줄일 수 있습니다. 각 RGB 색상을 개별적으로 설정하거나 전체 색상 개수를 조정하세요. 이를 위해 색상 비트 심도는 사용되지 않습니다. Fotocx의 일부 기능은 비트 심도를 사용해 각 RGB 색상에 사용 가능한 색상을 2, 4, 8 등으로 제한합니다. 이 기능은 이 점에서 제한되지 않습니다. 위 예시는 빨강 8개, 초록 5개, 파랑 3개의 색상을 사용합니다. - - TOPIC: 색상 전환 +image: shift-colors.png - 이 기능은 색상을 보정하거나 이미지를 의사 색상으로 변환하는 데 사용할 수 있습니다. 세 RGB 색상 중 아무거나 선택하고 슬라이더를 중심에서 왼쪽이나 오른쪽으로 움직이세요. 다른 두 색상 중 하나가 점진적으로 대체됩니다. 예를 들어, 빨강을 초록이나 파랑으로 점차 대체할 수 있습니다. All 슬라이더는 모든 색상을 함께 전환합니다. 먼저 이를 수행해 첫 번째 최적값을 찾은 후, RGB 색상을 개별적으로 전환하세요. - - TOPIC: 에일리언 컬러 +image: alien-colors2.jpg +image: alien-colors1.png - 이미지나 선택 영역을 무작위 에일리언 컬러로 다시 칠합니다. 대략적인 패턴 크기와 강도(거의 안 보이는 것부터 지배적인 것까지)를 조절할 수 있습니다. [적용]를 눌러 새로운 색상 분포를 얻으세요. - - TOPIC: 사용자 지정 커널 +image: custom-kernel.png - 이미지에 사용자 지정 컨볼루션 커널을 적용합니다. 기본 기술은 Wikipedia에 설명되어 있습니다. 커널 크기, 곱셈 계수, 덧셈 계수를 입력하고 표 값을 채우세요. [적용]는 커널을 이미지에 적용합니다. [재설정]은 원본 이미지 상태를 복원합니다. 값은 파일로 저장한 후 [저장]와 [불러오기] 버튼을 사용해 나중에 다시 가져올 수 있습니다. 처음에는 여러 커널 예시 파일을 사용할 수 있습니다. 이들을 수정하고 사용자 지정 이름으로 저장할 수 있습니다. - 수학: 이미지 내 각 N x N 픽셀 블록의 밝기 값은 커널 행렬의 해당 값과 곱해진 후 모두 더해집니다. 이 숫자는 곱셈 계수와 곱해지고, 덧셈 계수가 더해집니다. 이 최종 값이 N x N 블록 중심의 이미지 픽셀에 대한 새 밝기 수준이 됩니다. - - TOPIC: 왜곡 메뉴 - - TOPIC: 펴기 +image: unbend1.png +image: unbend2.jpg - 가까운 피사체(보통 건물이나 실내 공간)의 파노라마는 직선이 곡선으로 보이거나 건물이 기울어져 보일 수 있습니다. 이미지들이 서로 맞아 들어가도록 파노라마 과정에서 이미지 왜곡이 필요했습니다. 필요하다면 펴기 기능을 나중에 사용해 파노라마 이미지를 바로잡을 수 있습니다. 이미지 위에 세로/가로 점선이 그려져 펴기 축을 보여줍니다. 선의 끝 근처를 클릭하거나 드래그해 이동하세요. 네 개의 입력 컨트롤 값을 변경하면, 이미지는 해당하는 네 개의 이미지가 나타내는 방식으로 왜곡됩니다. 만족할 때까지 값을 늘리거나 줄이며 반복하세요. 축을 움직여 왜곡의 중심을 변경하세요. - 이미지 곡률과 원근을 보정하는 다른 방법은 {이미지 왜곡}도 참고하세요. - - TOPIC: 원근 +image: perspective2.jpg +image: perspective1.png - 이 기능은 비스듬한 각도에서 촬영된 사진을 바로잡는 데 사용할 수 있습니다. 왼쪽 이미지는 반사를 피하기 위해 중심에서 오른쪽으로 치우쳐 촬영한 원본 사진입니다. 오른쪽 이미지는 바로잡힌 버전입니다. 이 기능은 거리 수준이나 옆에서 촬영한 높은 건물을 바로잡는 데도 사용할 수 있습니다. - 직사각형으로 만들고 싶은 사각 영역의 네 모서리(위의 경우, 그림이나 액자의 네 모서리)를 클릭한 후 [적용]를 선택하세요. 클릭한 모서리는 "A, B, C, D"가 적힌 작은 흰 상자로 표시됩니다. 각 상자의 왼쪽 위 모서리가 정확한 이미지 위치를 나타냅니다. 상자 근처를 클릭하면 새 위치로 이동합니다. 키보드 화살표 키를 사용해 모서리 마커를 1픽셀 단위로 이동할 수 있습니다. 화살표 키는 마지막으로 클릭하거나 이동한 모서리에 작동합니다. - - TOPIC: 이미지 왜곡 +image: warps4.jpg - - TOPIC: 영역 왜곡 이 기능은 이미지 내에 왜곡을 만드는 데 사용할 수 있습니다. 이미지 영역을 선택하고 마우스를 드래그해 나머지 이미지에 대해 이 영역을 늘릴 수 있습니다. 이미지는 고무와 같습니다. 마우스 드래그가 선택한 영역 내에서 시작되면, 영역은 현재 경계 내에서 왜곡됩니다 - 움직임은 마우스 포인터에서 최대이며 영역 가장자리에서 0으로 줄어듭니다. 마우스 드래그가 선택한 영역 바깥에서 시작되면, 마우스 근처의 영역 가장자리가 원래 영역 경계 밖으로 끌려 나올 수 있습니다. 원하는 결과를 얻기 위해 서로 다른 길이와 방향의 여러 마우스 드래그를 결합할 수 있습니다. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - 이 기능은 원근 문제를 보정하는 데 유용합니다. 마우스를 사용해 모서리 근처에서 이미지를 드래그하세요. 다른 모서리는 고정된 채로 이 모서리에서 이미지가 탄력적으로 당겨집니다. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - 이 기능은 원근 문제를 보정하는 데 유용합니다. 마우스를 사용해 내부에서 이미지를 드래그하세요. 테두리는 고정된 채로 이미지 내부가 탄력적으로 당겨집니다. - - TOPIC: 곡선 왜곡 이 기능은 원근 문제를 보정하는 데 유용합니다({펴기}도 참고하세요). 마우스를 사용해 어느 위치에서든 이미지를 드래그하세요. 전체 이미지가 마우스 방향으로 당겨지거나 밀리지만, 마우스에 가까운 영역이 더 먼 영역보다 더 많이 움직입니다. 곡선을 곧게 펴거나 의도적으로 이미지를 곡선으로 만들 수 있습니다. 'warp span' 컨트롤은 마우스 주위 왜곡의 반경을 결정합니다. 1.0은 전체 이미지가 왜곡됨을 의미하며, 더 작은 값은 왜곡을 마우스 주위의 더 작은 영역으로 한정합니다. - - TOPIC: 어파인 왜곡 이 기능은 흥미로운 방식으로 이미지를 왜곡하는 데 사용할 수 있습니다. 마우스를 사용해 모서리나 가장자리에서 이미지를 드래그하세요. 변화가 순전히 선형이므로 직선은 직선으로 유지됩니다. 이 변환은 "어파인"이라고 불립니다. 자세한 내용은 웹 검색으로 찾을 수 있습니다. - - TOPIC: 방사형 왜곡 +image: warp_radial.png - 배럴 또는 핀쿠션 왜곡을 추가하거나 제거합니다. 배럴 왜곡은 이 왜곡을 제거하도록 처리되지 않은 RAW 이미지에서 흔히 보입니다. 왼쪽 클릭으로 변화가 중심이 될 중심점을 선택하세요 - 보통 이미지의 중심입니다. 이것이 기본값입니다. 'stretch' 슬라이더를 움직여 이미지를 구부리세요. - - TOPIC: 클로즈업 왜곡 펴기 +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - 클로즈업 얼굴 사진은 카메라에 더 가까운 영역이 사진에서 더 멀리 있는 영역보다 더 크게 나오기 때문에 종종 왜곡됩니다. 이 기능을 사용해 왜곡을 되돌릴 수 있습니다. 먼저 {영역 선택}을 사용해 얼굴을 선택하세요(정확할 필요는 없습니다). 왜곡 중심 근처(위 예시: 오른쪽 뺨)에서 이미지를 클릭하세요. 슬라이더를 움직여 최적화하세요. - - TOPIC: 물결 효과 만들기 +image: make-waves2.jpg +image: make-waves1.png - 이 기능은 마치 흔들리는 물을 통해 보는 것처럼 이미지를 물결 패턴으로 왜곡합니다. 대화 상자에서 평균 가로/세로 파장, 진폭, 분산을 변경할 수 있습니다. "perspective" 입력은 파장이 위에서 아래로 점차 길어지게 합니다. - - TOPIC: 트위스트 +image: twist1.png +image: twist2.png - 이 기능은 마우스 클릭이나 드래그로 선택한 점을 중심으로 이미지를 트위스트합니다. 원하는 위치를 클릭하고 Twist 슬라이더를 원하는 만큼 움직이세요. 마우스를 이미지 주위로 드래그해 트위스트 중심을 변경할 수도 있습니다. Center 슬라이더는 나머지에 대해 중앙 영역의 트위스트를 풉니다. Angle 슬라이더는 이미지를 회전합니다. - - TOPIC: 구 +image: sphere2.jpg +image: sphere.png - 이미지의 구형 투영을 만듭니다. 이미지에서 마우스를 드래그해 투영의 중심을 변경하세요(기본값은 중간점). flatten 컨트롤은 투영을 구(오른쪽)에서 평면 이미지(왼쪽)로 점진적으로 수정합니다. magnify 슬라이더는 결과 이미지를 최대 2배까지 확대합니다. - - TOPIC: 인사이드아웃 +image: inside-out2.jpg +image: inside-out1.png - 이 기능은 각 픽셀의 중심-가장자리 거리를 반전합니다. 마우스를 클릭하거나 드래그해 중심점을 바꿀 수 있습니다. - - TOPIC: 타이니 플래닛 +image: tiny-planet.jpg - 이미지를 원으로 감쌉니다. 이미지가 360도 파노라마라면 눈에 보이는 이음매가 없습니다. • Center Hole: 이미지가 중앙 구멍 주위로 감싸집니다. • Cut Top: 입력 이미지에서 위쪽 여백을 제거합니다. • Cut Bottom: 입력 이미지에서 아래쪽 여백을 제거합니다. • Reverse R: 입력 이미지를 세로로 반전합니다. • Reverse Theta: 입력 이미지를 가로로 반전합니다. • Rotate: 출력 이미지를 중심을 기준으로 돌립니다. - - TOPIC: 에셔 나선 +image: escher-spiral.png +image: escher-spiralA.png - 이미지를 M.C.에셔의 유명한 시계처럼 끝없이 안쪽으로 향하는 나선으로 변환합니다. Width는 가장 바깥쪽 레이어의 시작 너비를 결정합니다. Rim은 레이어를 구분하는 경계의 시작 너비를 결정하고, Color는 그 색상을 결정합니다. 기본 중심은 이미지의 중심입니다. 이미지를 클릭해 새 중심을 설정하세요. - - TOPIC: 사진 평탄화 +image: flatten-photo1.png +image: flatten-photo2.jpg - ^책 페이지 또는 기타 곡면 원기둥 주위나, 중앙 제본 부분에서 페이지가 안쪽으로 휘어진 두꺼운 책의 펼쳐진 페이지처럼 곡면 위에 있는 이미지 사진을 평탄화합니다. 표면의 위쪽과 아래쪽 가장자리의 곡률은 곡률의 양과 평평하게 보이기 위해 필요한 늘림의 양에 대한 정보를 제공합니다. 위 예시는 두꺼운 책입니다. 원기둥 위의 포스터처럼 다른 둥근 표면도 보정할 수 있습니다. - upper trace 옵션을 선택해 곡면 페이지의 위쪽 가장자리를 추적하세요. 가장자리를 따라 마우스를 클릭해 클릭한 각 지점에 마커 점을 만드세요. 4개의 점을 사용할 수 있게 되면, 점들을 지나는 곡선이 그려집니다. 필요에 따라 점을 더 추가하고 드래그해 선이 이미지 곡선에 가깝게 맞도록 하세요. lower trace 옵션을 선택하고 같은 방식으로 아래쪽 가장자리를 추적하세요. 둘 다 완료되면 [flatten]을 눌러 페이지를 평탄화하세요. 이제 가장자리는 곧아야(또는 충분히 곧아야) 합니다. [stretch] 슬라이더를 사용해 곡률로 인한 측면 압축을 보정하기 위해 필요에 따라 이미지의 측면을 늘리세요. Widen 컨트롤을 사용해 올바른 너비/높이 비율을 복원하기 위해 필요에 따라 이미지를 넓히세요. [undo] 버튼은 마커 점을 유지한 채 수정되지 않은 이미지를 복원하며, 그런 다음 다시 시도하기 위해 조정할 수 있습니다. - +image: flatten-photo3.jpg - ^휘어진 수평선 넓은 파노라마나 광각 렌즈로 찍은 사진은 수평선이 곧거나 수평이 아닐 수 있습니다. 수평선이나 직선을 따라 정렬되어야 하는 다른 영역을 통해 곡선을 추적해 이미지를 바로잡을(또는 다른 방식으로 이동할) 수 있습니다. 수평선(또는 다른 이미지 부분)이 대부분 이미지 중간의 위나 아래에 있는지에 따라 upper trace나 lower trace 옵션을 선택하세요. 이 곡선을 곧게 만들기 위해 이미지가 왜곡됩니다. 곡선 하나면 충분합니다. 다른 곡선은 이미지의 반대쪽 가장자리(위나 아래)에 자동으로 추가됩니다. 결과가 만족스럽지 않다면, [undo] 버튼을 사용하고 어느 쪽 곡선의 마커든 조정한 후 다시 시도하세요. 이미지를 저장하고 그 저장된 이미지를 시작점으로 사용해 이 기능을 다시 적용할 수도 있습니다. - - TOPIC: 결합 메뉴 이는 여러 이미지 파일을 결합하는 기능입니다. 이미지가 겹치는 경우, 각 이미지의 해당 특징이 픽셀 단위 정확도로 일치하도록 정렬됩니다. 정렬 시간은 보통 이미지당 10~30초입니다. 이 정렬 과정이 잘못되고 있다면 Escape 키를 사용해 과정을 중단할 수 있습니다. - - TOPIC: HDR ^High Dynamic Range +image: HDR.jpg +image: HDR-adjust.png - 노출 수준이 다른 같은 피사체의 여러 이미지를 결합(오버레이)합니다. 결합된 이미지는 어두운 영역과 밝은 영역 모두에서 세부 사항의 가시성이 개선되어 보일 수 있습니다. 실제로는 어두운 영역에 더 밝은 이미지의 픽셀을, 밝은 영역에 더 어두운 이미지의 픽셀을 사용합니다. 촬영 사이에 카메라를 수동으로 조정한다면, 수평을 유지하고 같은 먼 지점을 겨냥하도록 주의하세요. 입력 이미지의 약간의 정렬 불일치는 허용됩니다. 촬영 사이에 사람이나 물체가 움직이면 고스트 현상을 피할 수 없습니다. - HDR 메뉴 기능을 선택하고 최대 9개의 이미지({이미지 파일 선택})를 선택하세요. 모두 거의 같은 픽셀 크기여야 합니다. 이미지는 자동으로 정렬되고 결합됩니다. 완료되면 조정용 대화 상자와 함께 결합된 이미지가 표시됩니다. 입력 이미지의 기여도는 일련의 편집 가능한 곡선으로 표시됩니다. 가로 축은 어두움에서 밝음까지 픽셀 밝기를 나타냅니다. 각 곡선은 출력 픽셀에 기여하는 하나의 이미지를 나타냅니다. 특정 밝기 수준에서의 이미지 기여도는 그 수준에서 곡선의 높이에 비례합니다. 가장 밝은 이미지의 초기 곡선은 왼쪽이 높고 오른쪽이 낮으며, 이는 어두운 픽셀에 대한 기여도는 높고 밝은 픽셀에 대한 기여도는 낮음을 의미합니다. 가장 어두운 이미지는 왼쪽이 낮고 오른쪽이 높으며, 나머지 이미지는 그 사이에 있습니다. 곡선은 마우스로 드래그해 편집할 수 있습니다. 이에 따라 해당하는 이미지 기여도가 변경되며, 출력 이미지에서 실시간으로 결과를 볼 수 있습니다. 위 이미지는 두 개의 입력 이미지와 그 출력 이미지를 보여줍니다. 예시 대화 상자는 세 개의 입력 이미지를 최적화하도록 조정된 세 개의 곡선을 보여줍니다. - - TOPIC: HDF ^High Depth of Field 가까운 곳에서 먼 곳까지 서로 다른 초점 설정으로 촬영한 같은 피사체의 여러 사진을 결합(오버레이)합니다. 각 이미지에서는 피사체의 다른 부분이 선명하게 초점이 맞습니다. 피사체의 모든 부분이 선명해지도록 이미지를 결합합니다. - 사진 촬영: 이미지 중심으로 삼을 지점을 선택하세요. 가까운 물체를 향해 카메라를 겨냥하고 셔터 버튼을 절반까지 눌러 이 물체에 초점을 맞추세요. 버튼을 절반 위치에서 누른 채로, 선택한 중심을 향해 카메라를 겨냥하고 사진을 찍으세요. 이제 더 먼 물체를 선택해 같은 과정을 반복하세요. 초점 거리를 늘려가며 반복하세요. 바라건대 피사체의 각 부분이 적어도 한 장의 사진에서는 선명할 것입니다. 카메라 위치는 모든 사진에서 거의 같아야 하며, 피사체가 매우 가까울 때는 이것이 어려울 수 있습니다. 카메라 움직임은 배율과 시차 문제(가까운 물체가 먼 물체에 대해 어긋남)를 일으킬 수 있습니다. 이러한 문제는 나중에 Fotocx에서 고칠 수 있지만 상당한 시간이 걸릴 수 있습니다. 문제를 피하는 것이 더 낫습니다. - +image: HDF-paint.png - 사진 처리: HDF 메뉴 기능을 선택하고 최대 9개의 이미지({이미지 파일 선택})를 선택하세요. 이제 이미지가 최대한 정렬됩니다. 출력 이미지는 정렬된 입력 이미지의 균등한 혼합입니다. 사진 사이의 약간의 카메라 움직임은 보정되지만, 이는 제한적이며, 시차 이동은 전혀 보정되지 않습니다. 정렬이 완료되면 대화 상자가 열립니다. 어떤 입력 이미지든 선택해 마우스로 출력 이미지의 어느 영역에나 "페인트"할 수 있습니다. 이렇게 하면 페인트되는 영역에 대해 원본 이미지 혼합이 선택한 단일 이미지로 변환됩니다. 이미지 내 각 영역이나 물체에 대해, 그 영역에서 선명한 입력 이미지를 선택하세요. 페인트브러시의 반경은 더 크거나 작게 설정할 수 있으므로, 넓은 영역을 빠르게 페인트하거나 필요할 때 세밀한 부분을 제어할 수 있습니다. 가깝고 먼 물체가 겹쳐 있다면, 모두 선명하게 만드는 데 시간과 인내가 필요합니다. 대화 상자에서 왜곡 옵션을 선택해 정렬 불일치를 수정할 수 있습니다. 그런 다음 기본 이미지를 마우스로 드래그하고 왜곡할 수 있으며, 이에 따라 결합된 출력 이미지가 변경됩니다. 왜곡은 마우스 주위 영역으로 제한됩니다. 페인트된 영역을 드래그하면, 다른 이미지로 페인트된 영역은 고정된 채로, 해당하는 입력 이미지가 자동으로 선택되어 드래그됩니다. 페인트되지 않은 영역은 드래그할 수 없습니다. 여러 영역으로 이동하며 모두 정렬될 때까지 점진적으로 드래그하세요. - 권장 워크플로: 페인트 모드를 사용해, 각 이미지를 순서대로 선택하고 그 이미지에서 선명해 보이는 모든 영역을 페인트하세요. 잘 정렬되지 않은 경계는 이미지 특징 가장자리의 어긋남으로 뚜렷하게 나타납니다. 페인트에 사용하는 이미지를 바꿔서(하나 이상의 이미지가 충분히 선명하다면) 이 중 일부를 중요하지 않게 만들 수 있습니다. 왜곡 모드를 사용해, 눈에 보이는 어긋남을 없애기 위해 필요에 따라 미세하게 조정하세요. - - TOPIC: 스택/페인트 +image: stack-paint.png - +image: stack-paint2.jpg - 다른 시간에 촬영한 같은 피사체의 여러 사진을 스택(오버레이)합니다. 촬영 사이에 오가는 관광객과 차량을 제거합니다. - 사진 촬영: 카메라를 같은 먼 지점을 향해 겨냥하고, 관광객이나 차량이 피사체 앞을 지나가는 동안 여러 장을 촬영하세요. 일시적 물체에 가려지지 않은 피사체의 각 영역에 대해 두 장 이상의 사진을 얻으려고 하세요. 이미지가 정확하게 정렬되도록 카메라를 흔들리지 않게 잡고 같은 지점을 겨냥하세요. - 사진 처리: 스택/페인트 메뉴 기능을 선택하고 최대 9개의 이미지({이미지 파일 선택})를 선택하세요. 이제 이미지가 최대한 정렬됩니다. 출력 이미지(왼쪽 아래)는 정렬된 입력 이미지(맨 위 행)의 균등한 혼합입니다. 정렬이 완료되면 위에 표시된 대화 상자가 시작됩니다. 어떤 입력 이미지든 선택해 마우스로 출력 이미지의 어느 영역에나 "페인트"할 수 있습니다. 페인트되는 영역에는 선택한 단일 이미지가 사용됩니다. 이미지 내 각 영역에 대해, 일시적 물체가 없는 입력 이미지를 선택하세요. 페인트브러시의 반경은 더 크거나 작게 설정할 수 있으므로, 넓은 영역을 빠르게 페인트하거나 필요할 때 세밀한 부분을 제어할 수 있습니다. - 자동 작동: [숨기기] 버튼을 눌러 일시적 물체가 자동으로 제거될 수 있는지 확인하세요. 이는 가려지지 않은 배경의 여러 사진을 사용할 수 있는 이미지 내 영역에서 작동합니다(가운데 아래 이미지). 모든 일시적 물체를 표시하려면 [표시] 버튼을 누르세요(오른쪽 아래 이미지). 이는 대체로 작동하지만 완벽하지는 않습니다. 약간의 이미지 정렬 불일치나 조명 차이(특히 움직이는 그림자)는 알고리즘이 전경 픽셀 대신 배경 픽셀을 선택하게 할 수 있습니다. 위에서 설명한 페인트 방법을 사용해 오류를 수동으로 고칠 수 있습니다. - - TOPIC: 스택/노이즈 +image: stack-noise2.jpg +image: stack-noise.png - 이 기능은 같은 피사체의 사진 2~9장을 결합합니다. 손으로 든 카메라로 인한 약간의 어긋남을 제외하면 사진은 거의 같아야 합니다. 매우 높은 ISO 설정(저조도 상황)으로 사진을 찍었다면, 픽셀에는 상당한 노이즈가 있을 것입니다. 여러 장을 촬영해 평균을 내면 노이즈를 대부분 제거할 수 있습니다. - 사진 처리: 스택/노이즈 기능을 선택하고 최대 9개의 이미지({이미지 파일 선택})를 선택하세요. 자동으로 결합되어 표시되며, 대화 상자가 열립니다. 초기 출력 이미지는 선택한 모든 입력 이미지를 평균한 결합입니다. 이는 각 출력 픽셀의 RGB 값이 해당 입력 픽셀의 RGB 값의 평균임을 의미합니다. median 버튼은 출력 픽셀을 입력 픽셀의 중앙값으로 변경합니다(이미지 개수에 따라 중간 RGB 값 1~3개가 평균됩니다). 이것이 더 나을 수도, 그렇지 않을 수도 있으므로 오가며 비교하세요. omit low pixel과 omit high pixel 체크박스는 평균을 내기 전에 가장 낮고 가장 높은 RGB 입력 값을 버리게 합니다. 이는 혼합에서 노이즈 스파이크를 제거할 수 있습니다. median 방법이 선택되어 있으면 이는 아무 효과가 없습니다. - - TOPIC: 스택/레이어 +image: stack-layers.png - 이 기능을 사용해 이미지의 서로 다른 편집 버전을 결합하고, 선택한 이미지 영역에 어떤 버전이 표시될지 결정할 수 있습니다. 같은 픽셀 크기를 가진 이미지라면 어떤 것이든 결합할 수 있습니다. - 같은 크기의 이미지를 최대 9개까지 선택하세요. 초기 출력 이미지는 모든 입력 이미지의 균등한 블렌드입니다. Image Ratios는 블렌드된 이미지의 상대적 가중치입니다. 각 이미지의 가중치를 다르게 하려면 이를 조정할 수 있습니다. 예: 이미지 3개를 상대 가중치 3, 5, 7로 결합하면, 결합된 이미지는 이미지 #1에서 3/15, #2에서 5/15, #3에서 7/15가 됩니다. "Paint entire image" 옵션이 선택되어 있으면, 가중치를 조정할 수 있고 출력 이미지가 즉시 반응합니다. "Paint within mouse" 옵션이 선택되어 있으면, 마우스를 드래그할 수 있으며 현재 활성화된 이미지 비율을 사용해 마우스 원 내의 영역만 페인트됩니다. 페인트 속도는 마우스 중심과 가장자리의 Power 설정으로 제어됩니다. 낮은 숫자를 사용하면 점진적으로 페인트됩니다. - - TOPIC: 파노라마 +image: pano-align1.jpg +image: pano-align2.jpg - 이 기능은 광각 이미지나 파노라마를 만들기 위해 2~6개의 이미지를 이어붙입니다. 프로그램이 이미지가 일치하는 곳을 찾아 이어붙일 수 있도록 이미지는 10% 이상 겹쳐야 합니다. 먼저 2~6개의 이미지 파일({이미지 파일 선택})을 선택하세요. 초기 대략적인 정렬을 쉽게 하려면 이미지를 왼쪽에서 오른쪽 순서로 선택하는 것이 도움이 됩니다. 이미지는 처음에 연결되어 작은 투명한 겹침과 함께 표시됩니다. 사전 정렬 대화 상자(위)는 이미지를 대략적으로 정렬하도록 드래그하라고 요청합니다. 이미지를 올바른 왼쪽에서 오른쪽 순서로 드래그하세요. 드래그할 이미지가 다른 이미지와 겹칠 수 있습니다. 어떤 이미지가 드래그되고 있는지 명확히 하려면 이미지 중심 근처에서 드래그하세요. 이미지가 올바른 순서에 있으면, 각 이미지를 왼쪽 이웃에 정렬하세요. 왼쪽에서 오른쪽으로 진행하는 것이 가장 잘 작동합니다. 이미지를 가로/세로로 움직여 왼쪽 이웃과 대략적으로 정렬한 후, 필요하다면 아래쪽 가장자리를 왼쪽이나 오른쪽으로 드래그해 이미지를 회전하세요 - 이미지는 왼쪽 이미지와의 겹침 중간점을 축으로 회전합니다. 가장 빠른 방법은 먼저 겹침 중간 영역을 정렬한 후, 필요하다면 위쪽과 아래쪽 겹침 영역이 정렬되도록 오른쪽 이미지를 회전하는 것입니다. 극도의 정확도는 필요하지 않습니다. 이미지는 올바르게 곡면화되어 잘 맞아야 합니다. 그렇지 않다면 'lens mm'(초점 거리, 35mm 환산)을 조정해야 합니다. lens mm을 조정하면 이미지 곡률이 변합니다. 사용 가능하다면 초기값은 EXIF metadata에서 가져오며, 보통 이것으로 충분합니다. 이미지에 곡률이 없다면(예: 스캔된 이미지), 'no curve' 체크박스를 사용해 'lens mm'을 사실상 무한대로 설정하세요. - 이미지 중 어느 것이든 잘렸다면, EXIF 초점 거리에 의존하는 계산이 작동하지 않습니다. 'lens_mm'의 초점 거리를 늘려 보정할 수 있을 것입니다. - 'manual align' 체크박스는 수동 사전 정렬을 최종 정렬로 사용합니다. 이는 이미지를 정렬하는 데 필요한 뚜렷한 특징이 없는 이미지를 위한 것입니다. 이 옵션은 이미지가 겹침이 전혀 없어도 되도록 허용합니다. - 사전 정렬이 끝나면 [proceed]를 누르세요. 프로그램은 정밀 정렬을 수행하고 이미지를 이어붙입니다. 내부적으로 이미지는 이동되고 회전되며 일치 정도가 평가됩니다. 이는 최적의 정렬을 찾을 때까지 이미지 크기를 늘려가며 수행됩니다. CPU 속도와 이미지 크기에 따라 1분 이상 걸릴 수 있습니다. 입력 이미지를 2/3나 1/2 크기로 줄이면 과정을 크게 빠르게 할 수 있습니다. 메모리 부족으로 과정이 실패한다면 이렇게 하세요. - +image: pano-adjust.jpg - 정밀 정렬이 완료되면 결합된 이미지가 표시됩니다. 위 대화 상자는 밝기를 미세 조정하기 위해 시작됩니다. 밝기가 같지 않다면 이미지 사이에 경계가 보일 수 있습니다. 위쪽의 라디오 버튼을 사용해 이미지를 선택하세요. [자동 색상] 버튼을 반복해서 눌러 이미지의 밝기/색상 일치를 자동으로 개선하세요. 기준 이미지는 현재 선택된 이미지입니다. 어떤 것이 가장 잘 작동하는지 다른 기준 이미지를 시도해 보세요. 이미지의 밝기가 심하게 어긋나 있다면, 가장 크게 벗어난 이미지를 선택하고 밝기 컨트롤을 사용해 다른 이미지와 맞도록 밝기를 변경한 후 [자동 색상]를 누르세요. 나머지 차이는 (다음의) 'Blend Width'가 가려주므로 일치가 아주 좋을 필요는 없습니다. 'File Color' 버튼을 사용해 입력 이미지 파일의 밝기 수준을 재설정하세요. - 'Blend Width' 컨트롤은 이미지가 함께 블렌드되는 방식을 결정합니다: 이미지 겹침 부분에서, 완전히 보정할 수 없는 불균형을 가리기 위해 이만큼의 픽셀에 걸쳐 밝기가 변경됩니다. 기본값은 1픽셀이며, 이는 어떤 밝기 차이든 뚜렷하게 만듭니다. - 이미지가 완벽하게 정렬되지 않는다면, 마우스를 사용해 이미지를 밀어 정렬을 개선할 수 있을 것입니다. 'Mouse Warp'를 선택하고 라디오 버튼으로 이미지 중 하나를 선택하세요. 그런 다음 이웃 이미지와 정렬되어야 하는 이미지 가장자리를 따라 마우스를 드래그해 이미지를 정렬시키세요. 더 먼 부분은 고정된 채로 마우스 주위에서 이미지가 국소적으로 움직입니다. 시차 이동이 있는 이미지는 전경과 배경을 모두 정렬 상태로 유지하는 것이 불가능하므로 타협이 필요합니다. - flatten image 컨트롤을 사용해 이미지를 "펴서" 곡선(예: 휘어진 건물)을 곧게 할 수 있습니다. 값이 0이면 효과가 없고 1.0이면 이미지가 완전히 평탄화됩니다. - 완료되면 최종 조정을 위해 {펴기}, {이미지 왜곡}, {자르기} 등을 사용하세요. - ^스캔된 이미지 충분히 겹친다면 스캔된 이미지를 결합할 수 있습니다. 곡률이 없으므로 'no curve'를 체크하세요. - ^자동 왜곡 최적의 일치를 찾기 위해 정렬 중에 이미지가 여러 방향으로 약간 왜곡됩니다. 이는 카메라 수평선의 이동이나 회전을 보정하기 위한 것이며, 이는 맞춤 품질을 낮추는 이미지 왜곡을 일으킵니다. 두 이미지의 겹침 영역에 두 사진 사이에 움직인 큰 물체가 포함되어 있다면, 정렬 과정이 이미지를 일치시키려다 이상하게 작동해 정렬이 매우 나빠질 수 있습니다. 'no auto warp'를 선택하면 정렬을 성공시키거나 오차를 줄일 수 있을 것입니다. 다른 옵션은 manual align을 선택하는 것입니다. - ^파노라마 결합 한 번에 최대 6개의 이미지로 파노라마를 만들 수 있습니다. 옆으로 맞는 파노라마도 결합할 수 있습니다. 예를 들어 4장짜리 파노라마 두 개를 결합해 8장짜리 파노라마를 만들 수 있습니다. 파노라마 이미지는 이미 곡면화되어 있으므로(최종 파노라마 대화 상자에서 'flatten' 옵션을 사용하지 않았다고 가정), 파노라마를 결합할 때는 일반적인 이미지 곡면화를 중단해야 합니다. 사전 정렬 대화 상자에서 'no curve' 상자를 체크해 이미지 곡면화를 중단하세요. - ^파노라마 제한 사항 가까운 물체를 포함하는 파노라마는 까다로울 수 있습니다: 사진을 찍을 때, 측면 움직임을 최소화하면서 렌즈를 지나는 축을 중심으로 카메라를 돌리도록 주의하세요. 그렇지 않으면 전경 물체가 배경에 대해 어긋나(시차) 이미지 정렬이 나빠질 수 있습니다. 피사체가 50미터 이상 떨어져 있다면 작은 측면 움직임이 이미지에 거의 영향을 주지 않으므로 문제가 되지 않습니다. 완전히 보정되지 않을 수 있는 이미지 왜곡을 일으킬 수 있는 큰 수직 이동(수평선 이동)을 피하려면 카메라를 수평으로 유지하세요. 같은 이유로 카메라 회전을 피하세요. - ^세로 파노라마 이는 입력 이미지를 90° 회전해 수행할 수 있습니다. 파노라마에서, 위쪽 이미지가 왼쪽에, 아래쪽 이미지가 오른쪽에 오도록 위에서 아래 순서로 이미지를 선택하세요. 평소대로 파노라마를 진행하세요. 왼쪽이 위쪽이 되도록 출력 이미지를 회전하세요. - - TOPIC: CIM 파일 표시 현재나 최신 결합 이미지의 입력 파일을 팝업 창에 표시합니다. 현재나 최신 세트만 기억됩니다. - - TOPIC: 매시업 +image: mashup.jpg - 여러 이미지와 텍스트를 레이아웃에 배치합니다. 이미지는 마우스로 드래그해 추가, 크기 조정, 회전, 이동할 수 있습니다. 이미지는 선택한 영역에서 전체 또는 부분적으로 투명하게 만들 수 있습니다. 텍스트는 추가, 이동, 크기 조정, 회전할 수 있습니다. 텍스트 속성을 지정할 수 있습니다: 글꼴, 크기, 색상, 윤곽선, 그림자, 투명도. 선과 화살표를 추가할 수 있습니다. 여기 예시는 가능한 몇 가지를 보여줍니다. - +image: mashup1.png - 첫 번째 매시업 대화 상자에서, 다른 이미지가 배치될 배경이나 레이아웃 이미지를 선택하세요. 기존 이미지를 선택하거나 지정한 크기와 색상으로 새 단색 이미지를 만드세요. 이전에 저장한 매시업 프로젝트를 열어 편집을 계속할 수도 있습니다. - +image: mashup2.png - 두 번째 매시업 대화 상자는 선택입니다: 이미지 편집, 텍스트 편집, 선과 화살표 편집, 더 큰 크기로 재조정, 완성된 결합 이미지 저장(Done), 또는 이미지 포기(Cancel). 처음 세 선택은 각각의 편집을 수행하는 대화 상자로 이어집니다. 이들 각각은 완료되면 이 대화 상자로 돌아오므로, 어떤 순서로든 이미지, 텍스트, 선/화살표를 추가하거나 수정할 수 있습니다. Rescale은 아래에서 설명합니다. - +image: mashup3.jpg - 이 대화 상자를 사용해 레이아웃에 이미지를 선택하고 배치한 후 크기, 회전, 위치, 투명도 등 모양을 수정하세요. 이미지는 전체적으로나 지정한 영역 내에서 부분적으로 또는 완전히 투명하게 만들 수 있습니다. 이는 배경 이미지나 겹쳐진 이미지가 투명한 영역을 통해 보일 수 있음을 의미합니다. Add Image 버튼은 갤러리 파일 선택 대화 상자({이미지 파일 선택})로 이어집니다. 선택한 이미지가 레이아웃에 배치됩니다. 이미지가 추가된 후, 수정을 위해 선택하려면 어떤 이미지든 클릭하세요. 이미지를 중앙에서 드래그해 레이아웃 내 위치를 정하세요. 오른쪽 아래 모서리를 드래그해 이미지 크기를 조정하세요. 대화 상자 컨트롤을 사용해 이미지를 조정하세요. 대화 상자 컨트롤은 마지막으로 추가되거나 클릭되거나 드래그된 이미지에 작동합니다. 'Prev'와 'Next' 버튼은 선택된 이미지를 깜박이며 한 번에 하나씩 이미지를 순환합니다. 겹쳐진 이미지 때문에 클릭으로 원하는 이미지를 선택하기 어려울 때 이를 사용할 수 있습니다. Scale은 이미지의 배율을 조정합니다. Angle은 이미지를 회전합니다. Stacking Order 버튼은 다른 이미지에 상대적으로 이미지를 올리거나 내립니다 - 이는 겹치는 이미지 중 어느 것이 위에 올지 결정합니다. Base Transparency는 전체 이미지를 부분적으로 투명하게 만드는 데 사용됩니다. [페인트] 버튼은 아래에 표시된 Paint 대화 상자를 사용해 이미지의 어떤 부분이든 부분적으로나 완전히 투명하게 만드는 데 사용됩니다. [왜곡] 버튼은 아래에 표시된 Warp 대화 상자를 사용해 이미지를 구부리거나 왜곡하는 데 사용됩니다. 'black margins' 체크박스는 왜곡 등 다른 편집 기능으로 생긴 검은 여백을 제거하는 데 사용할 수 있습니다. 이는 투명하게 만들어집니다. 'Image is fixed' 버튼은 마우스나 키보드로 이미지가 이동되는 것을 막습니다. 이미지가 정밀하게 정렬되고 있어 실수로 인한 이동을 막아야 할 때 유용합니다. Margins 컨트롤은 이미지 가장자리를 투명하게 만드는 데 사용할 수 있습니다. Hard margins는 이미지 가장자리를 잘라냅니다. Blend margins는 배경이나 다른 겹쳐진 이미지에 블렌드되도록 가장자리를 부분적으로 투명하게 만듭니다. - +image: mashup4.png - 선택한 이미지 영역에 대해 투명도를 늘리거나 줄이며 "페인트"합니다. 이미지를 클릭해 선택하세요. 마우스 포인터는 작동 범위를 보여주는 원입니다. Radius를 사용해 크기를 조정하세요. 이미지 위에서 마우스를 왼쪽 드래그하면 원이 덮은 영역이 투명해집니다. 오른쪽 드래그하면 불투명해집니다. Gradual이 체크되어 있으면, 마우스를 드래그하는 동안 투명도가 천천히 변합니다. 변화 속도를 조절하려면 마우스 중심과 가장자리의 power 값을 지정하세요. - +image: mashup5.png - Warp 대화 상자는 이미지를 왜곡하는 데 사용됩니다. 이미지를 클릭해 선택하세요. 마우스로 이미지를 드래그하세요 - 이미지가 마우스 방향으로 국소적으로 왜곡되거나 늘어납니다(고무 시트처럼). 왜곡 영역은 이미지 크기의 일부인 warp span으로 대략 정해집니다. 각 드래그는 이전 단계에 더해지는 하나의 단계입니다. 최근 단계는 [undo last]로 되돌릴 수 있으며, [undo all]로 펴지지 않은 원본 이미지를 복원할 수 있습니다. - +image: mashup6.png - Edit Text 대화 상자는 레이아웃에 텍스트를 배치하는 데 사용됩니다. 텍스트를 입력하고 [적용]를 누르세요. 텍스트가 추가될 레이아웃 위치를 클릭하라는 요청을 받습니다. 위치로 드래그한 후, 대화 상자 컨트롤을 사용해 글꼴, 크기, 색상, 각도, 배경색, 윤곽선 크기와 색상, 그림자 크기와 색상, 그리고 이들 각각의 투명도를 설정하세요. 언제든지 텍스트를 새 위치로 드래그하세요. 기존 텍스트를 클릭하면 대화 상자에 그 속성이 표시되어 수정할 수 있습니다. 텍스트를 클릭하고 Delete를 눌러 제거하세요. 편집을 마쳤다면 [OK]를 눌러 두 번째 매시업 대화 상자로 돌아가세요. - +image: mashup7.png - Edit Line/Arrow 대화 상자는 레이아웃에 선이나 화살표를 배치하는 데 사용됩니다. 텍스트 추가와 매우 비슷하게 작동합니다. 길이와 너비를 입력하고 [추가]를 누르세요. 선이 추가될 레이아웃 위치를 클릭하라는 요청을 받습니다. 레이아웃에 선이 배치되거나, Arrow head 옵션 중 하나가 체크되어 있으면 화살표가 배치됩니다. 선/화살표를 원하는 위치로 드래그하세요. 대화 상자를 사용해 길이, 너비, 각도, 속성(배경, 윤곽선, 그림자)을 조정하세요. 선/화살표의 어느 끝이든 드래그해 다른 끝은 고정한 채로 그 끝의 위치를 정할 수도 있습니다. - 마우스를 사용해 레이아웃 내 물체를 이동하고 크기를 조정할 수 있습니다: • 물체를 클릭해 선택하세요 - 선택을 확인하기 위해 깜박입니다. • 대략적인 중심에서 드래그해 물체의 위치를 정하세요. • 오른쪽 아래 모서리를 드래그해 물체의 크기를 조정하세요. • 선/화살표의 경우, 어느 끝이든 드래그해 그 끝만 이동하세요. - 키보드 화살표 키를 사용해 현재 선택된 물체를 1픽셀 단위로 이동할 수도 있습니다. - {영역 선택}으로 저장한 이미지를 추가할 수 있습니다. Edit Images 대화 상자에서 [추가]를 눌러 파일 선택 대화 상자를 시작하세요. 갤러리 창의 [위쪽] 버튼을 사용해 'saved_areas'를 선택하세요. 거기서 찾은 .png 이미지 중 아무거나 여세요. 원본 영역 윤곽선이 사용되며, 영역 블렌드는 이 가장자리에서부터 작동합니다. - ^매시업 프로젝트 파일 프로젝트를 저장한 후 나중에 열어 편집을 계속할 수 있습니다. 매시업 프로젝트는 이 이미지들과, 프로젝트 파일에 저장된 이미지와 텍스트 위치, 배율, 투명도 등의 데이터를 사용해 재구성됩니다. - ^매시업 크기 조정 매우 큰 레이아웃(20메가픽셀 이상)으로 작업하면 꽤 느릴 수 있습니다. 큰 오버레이 이미지를 드래그하면 느리고 뚝뚝 끊길 수 있습니다. 더 작은 레이아웃으로 프로젝트를 만든 후 완료 후에 크게 만들면 훨씬 빠르게 작업할 수 있습니다. 오버레이 이미지와 텍스트는 입력으로부터 재생성되므로, 최종 이미지에는 해상도 손실이 없습니다. Rescale 버튼을 사용하면 프로젝트를 2배, 3배, 4배로 확대할 수 있습니다. 원래의 더 작은 프로젝트 크기로 되돌리는 재설정 옵션도 있습니다. 이 방법을 사용하면 10메가픽셀 레이아웃으로 작업한 후 완료되면 최대 160메가픽셀까지 크기를 조정할 수 있습니다. 더 큰 레이아웃도 이후 직접 작업할 수 있지만 더 느릴 것입니다. - - TOPIC: 이미지 배열 +image: image-array.jpg - 여러 이미지를 선택해 색이 있는 프레임 안에 압축된 배열 형식으로 결합합니다. - 첫 번째 대화 상자는 왼쪽 위에 표시됩니다. Background Color는 윤곽 프레임과 포함된 이미지 사이 공간의 색상입니다. Array Width는 출력 배열의 전체 너비이고, Margin은 모든 이미지를 둘러싼 바깥 여백의 너비입니다. Array height는 선택한 이미지 파일 수와 이들을 프레임에 맞추는 데 필요한 공간에 따라 결정됩니다. Image Columns는 이미지 열의 개수를 지정합니다(위 예시에서는 6). 행의 개수는 선택한 이미지 파일 수에 따라 달라집니다. Separation 값은 포함된 이미지 사이의 가로/세로 간격을 설정합니다. - 이미지 파일({이미지 파일 선택})을 선택한 후 완료되면 [계속]를 누르세요. 결과 이미지는 몇 초 안에(수백 개의 이미지라면 몇 분 안에) 만들어집니다. 이 이미지는 보통 위 오른쪽 위 이미지에서 보이는 것처럼 매우 고르지 않은 아래쪽 여백을 갖습니다. 배열 내 이미지의 순서는 선택 순서에 따라 결정됩니다. 위쪽 행이 왼쪽에서 오른쪽으로 먼저 채워진 후 두 번째 행 등이 채워집니다. - Optimize 대화 상자가 자동으로 시작됩니다. 아래쪽 여백이 더 고르게 되도록 이미지를 재배열할 수 있습니다. [시작]를 누르고 이미지가 최적화되기를 기다리세요. 진행 상황을 지켜볼 수 있습니다. 아래쪽 여백을 2픽셀 이내로 고르게 만드는 최적값을 찾으면 기능이 종료됩니다. 이 목표에 도달하지 못하면 무기한 계속 검색할 수 있습니다. [중지]을 눌러 지금까지 찾은 최선의 해결책으로 최적화 기능을 강제로 종료하세요. 최적화가 성공하면, 오른쪽 아래 이미지에서 보이는 것처럼 고른 열을 얻습니다. 최적화 후에도 아래쪽 가장자리가 여전히 고르지 않다면, 아래쪽 가장자리를 고르게 하기 위해 일부 이미지에 여백을 추가할지 묻습니다. 이렇게 하면 아래쪽 가장자리는 고르게 되지만 세로 간격은 더 이상 같지 않게 됩니다. - TIP: 최적화는 열당 이미지 개수가 최소 4개(더 많으면 더 좋음)일 때 가장 잘 작동합니다. 이는 최적화기가 고른 아래쪽 가장자리를 가진 해결책을 찾을 수 있는 충분한 유연성을 제공합니다. - 왼쪽 아래에 표시된 마지막 대화 상자가 나타납니다. 이제 배열에 파일 이름을 지정해야 합니다. 파일 저장 대화 상자가 시작되며, 새 배열 파일을 원하는 곳에 저장할 수 있습니다. copy metadata 옵션을 선택하면, 선택한 입력 파일에서 출력 파일로 metadata가 복사됩니다. 이미지가 편집된 버전이고 배열에 마지막 버전(또는 어떤 버전이든)의 편집 기록을 담고 싶다면 유용합니다. - - TOPIC: 일괄 메뉴 이는 몇 개에서 수천 개까지 선택한 여러 이미지 파일을 처리하는 기능입니다. 이 기능은 Escape 키를 사용해 처리 중간에 취소할 수 있지만, 그러면 일부 파일은 처리되고 일부는 처리되지 않은 상태로 남습니다. 팝업 보고서는 파일이 처리됨에 따라 파일 이름을 보여줍니다. - - TOPIC: 일괄 변환 +image: batch-convert.jpg - 이 기능은 여러 이미지 파일의 이름을 바꾸고, 변환하고, 크기를 조정하고, 이동하는 데 사용됩니다. RAW 파일도 이미지 파일로 변환할 수 있습니다. 이 기능은 최대 속도를 위해 여러 병렬 스레드로 실행됩니다. - ^대화 상자 입력 • Select Files - 변환할 파일 ({이미지 파일 선택}). • Replace Text - 파일 이름 내 텍스트 바꾸기 (아래 참고). • New Name - 선택적 새 이름, 삽입된 텍스트 (아래 참고). • Sequence Numbers - 출력 파일 이름을 위한 기본 번호와 증가값. • New Location - 출력 파일을 위한 선택적 새 폴더 위치. • New Type - 출력 파일의 파일 형식, 또는 "변경 없음". • Color Depth - tif나 png 출력에 대해 8비트 또는 16비트를 지정합니다. • Max. Width, Height - 출력 파일의 선택적 한계 (downsize나 upsize가 체크된 경우에만 사용됨) • Rescale - 출력 파일의 선택적 크기 조정 배수 • Delete Originals - 변환 성공 후 입력 파일 삭제. • Copy Metadata - 모든 metadata를 출력 파일에 복사. • Update Albums - 앨범 파일을 변환된 출력 파일로 대체 - ^텍스트 바꾸기 여기에 텍스트를 입력하면, 파일 이름에서 이 텍스트를 검색해 찾으면 지정한 대체 텍스트로 바꿉니다. 대체 텍스트는 길이가 다를 수 있으며 비어 있을 수도 있으며, 이 경우 파일 이름에서 텍스트가 제거됩니다. - ^새 이름 및 플러그인 새 파일 이름에는 텍스트를 삽입할 수 있습니다: 촬영 날짜(EXIF metadata에서), 순서 번호, 또는 원본 파일 이름. 무엇을 어디에 삽입할지 다음과 같이 지정하세요: • $oldname - 여기에 원본 파일 이름이 삽입됩니다 • $sss - 여기에 연속 순서 번호가 삽입됩니다. 아래를 참고하세요. • $yyyy $mm $dd - 이 위치에 촬영 날짜가 삽입됩니다. - 예: San Francisco $yyyy:$mm:$dd $oldname $sss 촬영 날짜가 2014년 5월 12일인 입력 파일 "Golden Gate Bridge.jpg"는 출력 파일 이름 "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg"로 변환됩니다. - "$sss"의 경우, 's' 문자의 개수로 필드의 길이를 지정하세요. 예를 들어 "$ss"는 99까지의 순서 번호에 적합합니다. 자릿수가 더 적은 순서 번호에는 앞에 0이 추가됩니다. 지정한 길이에 맞지 않는 순서 번호는 필요한 만큼 길게 만들어집니다. 갤러리의 파일 이름 정렬 순서는 엄격하게 아스키 순서이므로, 숫자 1, 2 ... 9, 10의 순서는 1, 10, 2 ... 9로 정렬됨을 유념하세요. 필드 길이를 2($ss)로 지정하면 숫자 순서를 유지할 수 있으며, 그 결과 순서는 01, 02 ... 09, 10이 됩니다. - 출력 파일 이름이 고유하도록 하려면 "$oldname"이나 "$sss" 중 하나가 있어야 합니다. New Location이 없거나 변경되지 않았다면 delete originals는 무시됩니다. 출력 파일이 이미 존재한다면 입력 파일은 변환되지 않습니다. - ^최대 너비 및 높이 downsize와/또는 upsize가 체크되어 있으면, 출력 파일은 원본 너비/높이 비율을 유지하면서 이 한계 내로 크기가 조정됩니다. downsize가 체크되어 있으면, 이 한계보다 큰 파일은 한계 내에 머물도록 축소됩니다. upsize가 체크되어 있으면, 이 한계보다 작은 파일은 너비나 높이 중 하나가 해당 한계에 오도록 확대됩니다. 이는 Rescale 옵션과 함께 사용할 수 없습니다. - ^크기 조정 버튼 중 하나가 체크되어 있으면, 출력 파일은 선택한 배수로 크기가 조정됩니다. 이는 최대 너비 및 높이 옵션과 함께 사용할 수 없습니다. - ^원본 삭제 체크되어 있으면, 출력 파일이 성공적으로 만들어진 후에만 입력 파일이 삭제됩니다. - ^Metadata 복사 모든 metadata가 입력 파일에서 출력 파일로 복사됩니다. metadata를 제거하려면 이 옵션을 생략하세요. - ^앨범 업데이트 체크되어 있으면, 입력 파일 중 어느 것이든 포함하는 모든 앨범이 변환된 출력 파일로 업데이트됩니다. - ^파일 순서 유지 앞에 순서 번호($sss)를 지정하면, 입력 파일 선택 순서가 출력 위치에서 유지됩니다. 따라서 원하는 순서로 이미지 파일을 선택하거나, 정렬된 이미지가 있는 앨범에서 선택해 이 순서를 출력에서 유지할 수 있습니다. - - TOPIC: 일괄 복사/이동 선택한 이미지 파일을 새 위치로 복사하거나 이동합니다. Fotocx가 알고 있는 모든 폴더에서 입력 파일({이미지 파일 선택})을 선택하세요. "Delete Originals"가 선택되어 있으면, 새 폴더로 성공적으로 이동한 후 입력 파일이 삭제됩니다. 이 경우, 이제 삭제된 입력 파일을 참조하는 모든 앨범이 새 파일 위치로 업데이트됩니다. - - TOPIC: 업라이트 일괄 적용 이 기능은 회전되거나 뒤집힌(미러링된) 이미지 파일을 바로 세웁니다. 파일이 회전/뒤집혔는지와 어느 방향인지 알기 위해 EXIF 데이터에 의존합니다. 일괄 변환보다 훨씬 빠릅니다. 모든 후보 파일을 선택하기만 하면 수정이 필요한 파일을 찾아줍니다. 검색 속도는 고성능 컴퓨터에서 분당 약 3000개의 이미지 파일입니다. 검색할 파일을 지정하는 두 가지 옵션이 있습니다. [파일 선택] 버튼은 갤러리 파일 선택 대화 상자({이미지 파일 선택})로 이어집니다. 'Survey all files'가 체크되어 있으면, 최상위 폴더 아래의 모든 이미지 파일이 검색됩니다. - - TOPIC: 일괄 삭제/휴지통 파일을 선택하세요({이미지 파일 선택}). 옵션을 선택하세요: 삭제 또는 휴지통으로 이동. [계속]. 파일이 삭제되거나 휴지통으로 이동함에 따라 팝업 보고서에 나열됩니다. 모든 파일이 삭제/휴지통으로 이동된 후, 앨범을 검사해 삭제된 파일을 제거합니다. - - TOPIC: 오버레이 일괄 적용 +image: batch-overlay.png - 선택한 입력 이미지의 선택한 위치에 작은 오버레이 이미지를 추가할 수 있습니다. 이는 이미지 위에 크레딧 문구, 저작권 등을 추가하는 데 사용할 수 있습니다. - 다음과 같이 오버레이 이미지를 준비하세요: 빈 이미지를 사용해 텍스트를 담을 기본 이미지를 만드세요. 배율은 중요하지 않으므로 필요한 것보다 크게 만드세요. 투명도 페인트를 사용해 기본 이미지 전체를 투명하게 페인트하세요. {마크업} > 텍스트 그리기를 사용해 원하는 글꼴, 색상, 기타 속성으로 기본 이미지에 원하는 텍스트를 넣으세요. 텍스트를 기본 이미지의 대부분을 채우도록 조정하세요. 기본 이미지(배경)는 투명합니다. 필요하다면 {자르기}로 과도한 여백을 제거하세요. 최종 이미지를 저장하세요. 편리한 위치는 /saved_areas이지만 어떤 폴더든 사용할 수 있습니다. 이제 이 이미지는 오버레이 일괄 적용의 오버레이 이미지로 사용할 수 있습니다. - ^호스트 이미지 파일 선택^ 버튼을 사용해 오버레이 이미지를 받을 호스트 이미지 파일을 선택하세요. ^오버레이 파일 선택^ 버튼을 사용해 오버레이 이미지 파일을 선택하세요. - 두 개의 ^오버레이 위치^ 입력은 위에서 아래까지 거리의 1~99%와 왼쪽에서 오른쪽까지 거리의 1~99%로, 호스트 이미지 위에서 오버레이 이미지의 위치를 결정합니다. 0/0은 왼쪽 위 모서리를, 99/99는 오른쪽 아래 모서리를 의미합니다. 오버레이 이미지는 호스트 이미지 가장자리를 넘지 않도록 위치가 정해집니다. - ^오버레이 너비^를 호스트 이미지 너비의 퍼센트로 지정하세요. 높이는 너비/높이 비율을 유지하도록 설정됩니다. ^창 크기에 맞춰 너비 고정^이 체크되어 있으면, 오버레이 이미지의 시각적 크기가 아래에 지정된 창 크기에 대해 일정하게 유지됩니다. 이것이 없으면, 왼쪽과 오른쪽에 큰 여백을 두고 표시되는 "세로로 긴" 이미지는 시각적으로 더 작은 오버레이 이미지를 갖게 됩니다. 초기 창 크기는 현재 창입니다. 원하는 크기를 입력할 수 있습니다. 변경되었다면 ^refresh^를 눌러 현재 창으로 설정하세요. - ^호스트 파일 바꾸기^가 선택되어 있으면, 입력 호스트 파일이 오버레이가 적용된 출력 호스트 파일로 대체됩니다. ^새 버전 만들기^가 선택되어 있으면, 입력 호스트 파일의 새 버전이 만들어집니다. - - TOPIC: keyword 일괄 처리 +image: batch-keywords.jpg - 한 번에 많은 이미지 파일의 keywords를 추가, 제거, 또는 변경합니다. - [select files] 버튼을 사용해 이미지 파일을 선택하세요({이미지 파일 선택}). - 대화 상자에는 두 개의 keywords 목록이 표시됩니다: 선택한 파일에 추가할 것과 제거할 것. 사용 가능한 keywords는 아래의 정의된 Keywords 창에 표시됩니다. 이 중 하나를 클릭하면 현재 선택된 keyword 목록(추가 또는 제거)에 추가됩니다. 어느 keyword 목록에서든 클릭해 keyword를 삭제할 수 있습니다. keywords를 대체하려면, 추가할 keywords 목록에 새 keywords를, 제거할 keywords 목록에 이전 keywords를 지정하세요. - 정의된 keywords 목록이 길다면, 새 Keyword 입력에 원하는 keyword를 입력하는 것이 더 쉬울 수 있습니다. 지금까지 입력한 내용과 일치하는 기존 keywords가 일치하는 Keywords에 나타나며, 이 중 하나를 가리키고 클릭해 keyword를 이미지에 추가할 수 있습니다. 입력한 keyword가 새로운 것이라면(일치하는 keyword가 표시되지 않음), keyword를 완성한 후 [추가]를 누르세요. 선택된 keyword 목록과 "nocatg" 카테고리 아래의 정의된 keywords 목록에 추가됩니다. - keyword 카테고리를 사용 중이라면 카테고리를 선택할 수 있으며, 정의된 keywords 목록에는 그 카테고리의 keywords만 표시됩니다. keywords 목록이 방대하다면, 이를 통해 가리키고 클릭하기에 적당한 크기로 목록을 줄일 수 있습니다. - 제거하거나 바꾸고 싶은 특정 keywords가 있는 이미지 목록을 얻으려면, {이미지 검색}을 사용해 이미지를 찾은 후, 이 기능을 시작하고 [select files]를 사용해 방금 찾은 모든 이미지 파일을 추가하거나 원하는 부분집합을 선택하세요. - - TOPIC: keyword 일괄 이름 변경 +image: batch-rename-keywords.png - 원하는 개수만큼 keywords의 이름을 바꾸고 이 변경 사항을 전체 이미지 컬렉션에 적용하세요. 정의된 keywords 목록에서 이름을 바꿀 keyword를 클릭하고, Rename to 상자에 새 이름을 입력한 후, 화살표 버튼을 클릭해 이 이름 쌍을 오른쪽 목록에 추가하세요. 이름을 바꿀 각 keyword에 대해 반복하세요. 목록에서 이름 쌍을 클릭해 제거하세요. 완료되면 [계속]를 누르세요. keyword를 이름을 바꾸지 않고 삭제하고 싶다면, 새 이름으로 'delete'를 사용하세요. - 팝업 창에 영향을 받는 keyword 이름이 포함된 이미지 파일의 개수가 표시됩니다. [예]를 눌러 계속하세요. 업데이트 속도는 고성능 컴퓨터에서 분당 약 500개입니다. 다음에 Fotocx를 시작하면, 파일 수정 날짜가 변경되었으므로 색인 파일 기능이 같은 이미지의 모든 thumbnails를 업데이트합니다. - - TOPIC: keyword 일괄 삭제 +image: batch-purge-keywords.jpg - 모든 이미지 파일에서 원치 않는 keywords를 삭제합니다. 다운로드한 이미지 파일에서 추가된 원치 않는 keywords를 없애는 데 특히 유용합니다. 대화 상자 왼쪽의 원치 않는 keywords를 클릭해 대화 상자 오른쪽의 삭제 목록에 추가하세요. 완료되면 [proceed]를 누르세요. - - TOPIC: 촬영 날짜 일괄 설정 +image: batch-photo-date1.png +image: batch-photo-date2.png - 촬영 날짜/시간이 없거나 잘못된 여러 사진을 빠르게 고치세요. [select files] 버튼을 사용해 갤러리 창을 열고 처리할 이미지 파일을 선택하세요({이미지 파일 선택}). - 촬영 날짜/시간을 변경하는 방법은 두 가지입니다: • 새 날짜/시간 설정(위 오른쪽 이미지): 연도만(yyyy) 입력하세요 - 파일에서 연도만 대체됩니다. 날짜만(yyyy:mm:dd) 입력하세요 - 날짜는 대체되지만 시간은 대체되지 않습니다. 전체 날짜/시간(yyyy:mm:dd hh:mm:ss)을 입력하세요 - 둘 다 대체됩니다. • 기존 날짜/시간 이동(왼쪽 이미지): 연, 월, 일, 시, 분, 초의 6개 필드 중 원하는 곳에 + 또는 - 값을 입력하세요. 날짜/시간은 입력한 값만큼 이동합니다. - 이동된 날짜/시간 값은 필요할 때 다음 상위 값으로 넘어갑니다: 시간 08:30을 -50분 이동하면 07:40이 됩니다 날짜 2016-10-20을 +6개월, -30일 이동하면 2017-03-21이 됩니다 (3월은 31일입니다). - 'test' 체크박스가 선택되어 있으면, 검토를 위해 선택한 파일의 이전 및 새 날짜/시간 보고서가 생성됩니다. 파일에는 아무 변경도 이루어지지 않습니다. 결과가 올바르다고 확신하면, 체크박스를 해제하고 다시 실행해 파일을 업데이트하세요. - - TOPIC: metadata 일괄 변경 +image: batch-change-meta.png - 여러 이미지 파일의 metadata를 수정하세요. 새 metadata를 추가하고, 기존 metadata를 수정하고, metadata를 삭제할 수 있습니다. [select files] 버튼을 사용해 갤러리 창을 열고 처리할 파일을 선택하세요 {이미지 파일 선택}. 지정할 metadata tag 이름과 값을 입력하거나, tag를 삭제하려면 값을 비워 두세요. [적용]를 누르세요. 확인 메시지가 나타나며 이 시점에서 계속하거나 취소할 수 있습니다. 자주 사용하는 tag 이름 목록이 왼쪽에 제공됩니다. 이 중 하나를 클릭하면 대화 상자의 첫 번째 빈 tag 이름 필드에 삽입됩니다. 이 목록은 파일 /metadata_picklist에서 가져오며, 목록에 다른 tags를 추가하려면 이 파일을 편집하면 됩니다. [전체 목록] 버튼은 사용 가능한 모든 tag 이름 목록을 얻는 방법에 대한 정보를 제공합니다. - - TOPIC: metadata 일괄 보고 +image: add-meta-tags.png +image: batch-report-meta.png - 원하는 개수의 이미지에 대해 어떤 metadata든 보고합니다. 출력은 시스템의 기본 텍스트 편집기로 표시되는 텍스트 파일입니다. 텍스트 편집기의 검색 기능을 사용해 원하는 metadata와 일치하는 이미지를 찾거나, 이 텍스트 파일을 다른 프로그램의 입력으로 사용할 수 있습니다. [select files] 버튼을 사용해 갤러리 창을 열고 처리할 파일을 선택하세요({이미지 파일 선택}). [편집] 버튼은 보고할 metadata tags를 선택할 수 있는 새 대화 상자(오른쪽)를 엽니다. 왼쪽 열의 tag를 클릭하면 오른쪽 열과 보고서에 추가됩니다. 오른쪽 열의 tag를 클릭하면 제거됩니다. 왼쪽 열의 마지막 tag인 "Other tag ..."를 클릭하면, 가장 필요할 만한 tags만 포함된 목록에 없는 tag 이름을 직접 입력할 수 있습니다. - - TOPIC: geotag 일괄 설정 +image: batch-geotags.png - 여러 이미지를 선택해 모두에게 같은 위치 데이터를 추가합니다. [select files] 버튼을 사용해 갤러리 창에서 이미지 파일을 선택하세요({이미지 파일 선택}). 그런 다음 {주 metadata 편집}에서 설명한 대로 [찾기] 버튼을 사용하거나 지도 마커를 클릭해 위치 데이터를 가져오세요. 위치 철자나 latitude/longitude 데이터의 불일치를 고치는 데도 이 기능을 사용하세요. location과/또는 country를 비워 두면 업데이트되지 않습니다. location이나 country를 지우려면 이름으로 "null"을 입력하세요. latitude와 longitude를 비워 두면 업데이트되지 않습니다. latitude와 longitude를 지우려면 두 값 모두 "0"을 입력하세요. location/country만, latitude/longitude만, 또는 둘 다 업데이트할 수 있습니다. 실제로는 카메라 GPS가 location과 country 없이 latitude와 longitude만 삽입하거나, 원치 않는 언어를 사용하거나, 모두 대문자이거나, 수정이 필요한 다른 값을 사용하는 것을 발견할 수 있습니다. - - TOPIC: 파일 내보내기 선택한 이미지 파일을 다른 폴더로 복사합니다. 다른 사람과 공유하기 위해 파일을 복사하는 용도(예: 웹사이트에 파일 업로드)로 사용하도록 만들어졌습니다. 출력 파일은 JPEG입니다. 선택적으로 이미지 크기를 줄일 수 있습니다. 갤러리 thumbnails를 클릭해 이미지 파일을 선택하세요({이미지 파일 선택}). 이미지 파일이 복사될 폴더를 선택하세요. 'export metadata'가 선택되어 있으면, 제한된 metadata 세트도 복사됩니다. 이는 다음과 같습니다: 촬영 날짜, keywords, 저작권, 제목, 설명. - - TOPIC: 도구 메뉴 - - TOPIC: 파일 색인 +image: index-files1.png - Fotocx는 모든 이미지 파일의 폴더 및 파일 이름과 내장된 metadata(날짜, tags, geotags, 제목, 설명, 평점)를 알아야 합니다. 이 데이터는 빠른 검색을 위해 색인됩니다. Fotocx는 갤러리 창(thumbnail 페이지)이 빠르게 표시되도록 thumbnail 이미지도 만듭니다. Fotocx는 이미지 파일을 수정하거나 복사하지 않습니다. 필요한 공간은 보통 이미지 파일 공간의 2%입니다. - 파일 색인 기능은 Fotocx가 시작될 때마다 실행됩니다. 이 기능은 누락된 thumbnails를 만들고, 오래된 것을 대체하며, 이미지 파일의 현재 데이터를 사용해 metadata 색인을 새로 고칩니다. 새 파일이 수천 개 이상이라면 상당한 시간이 필요할 수 있습니다. - Fotocx 내에서 수정되거나 이동된 이미지 파일은 자동으로 처리됩니다. 색인 기능은 Fotocx 바깥에서 만들어진 새 이미지 파일(예: 새로운 사진 묶음이 추가됨)과, Fotocx 바깥에서 수정되거나 이동된 파일에만 사용됩니다. - 최상위 이미지 폴더(예: /home//Pictures)를 입력하세요. [찾아보기] 버튼을 사용해 폴더를 찾아 추가하세요. 이 폴더와 그 안에 포함된 모든 하위 폴더가 처리됩니다. 다른 파일이 이미지와 섞여 있어도 상관없습니다. 해당하는 'X'를 클릭해 항목을 삭제하세요. - thumbnail 파일이 저장될 thumbnails 폴더를 입력하세요. 제공된 기본값을 사용하거나 원하는 위치를 설정하세요. - 이미지를 분류하는 데 폴더나 파일 이름을 사용했다면, {이미지 검색} 기능에서 즉시 이를 사용할 수 있습니다. 이미지 metadata에 날짜, keywords, geotags, 제목, 또는 평점을 저장했다면, 이들도 검색할 수 있습니다. 이미지가 색인된 후에는 이들 중 무엇으로 검색하든 거의 즉각적입니다. - ^Metadata Tags 다음 metadata는 기본적으로 이미지 색인에 포함됩니다: • 폴더 및 파일 이름 • 촬영 날짜/시간 • 파일 수정 날짜/시간 • 제목 및 설명 (exif metadata) • 평점 (0~5점) • keywords (사용자 라벨) • geotags (국가와 위치 이름, latitude/longitude) • 카메라: 제조사, 모델, 렌즈 • 노출: 시간, F값, 초점 거리, ISO - ^추가 Metadata tags +image: index-files2.png - 이미지 파일 색인에 최대 20개의 다른 metadata tags를 추가할 수 있습니다. 이 목록의 metadata는 표준 tags만큼 빠르게 검색할 수 있습니다. 이것이 필요하지 않을 수도 있지만, 때때로 비표준 metadata tags를 검색해야 한다면 여기에 추가할 수 있으며 검색 속도는 거의 즉각적일 것입니다. "extra metadata"의 [select] 버튼을 눌러 위 대화 상자를 여세요. 왼쪽 목록의 tags를 클릭해 오른쪽 목록(색인에 추가될 tags)에 추가하세요. 오른쪽 목록의 tag를 클릭해 제거하세요. [done]을 눌러 변경 사항을 커밋하세요. 전체 이미지 컬렉션이 다시 색인됩니다. thumbnails가 재생성되지 않으므로 초기 색인보다 빠르게 진행됩니다. - ^색인되지 않은 파일 및 폴더 접근 색인되지 않은 이미지 파일이나 폴더는 선언한 최상위 이미지 폴더에 포함되지 않은 것입니다(선언한 이미지 폴더의 하위 폴더는 항상 포함됩니다). 이러한 폴더로 이동해 정상적으로 thumbnails를 볼 수 있으며, 이러한 파일을 정상적으로 보고 편집할 수 있습니다. 이해해야 할 제한 사항이 있습니다: • 이 파일들은 검색 결과와 지도 보기에서 누락됩니다. • Thumbnails는 보는 시점에 생성됩니다 - 갤러리가 느릴 것입니다. 휴대용(느린) 저장 장치(예: 카메라 SD 카드)에 접근하면 성능이 뻣뻣함을 알아차릴 것입니다. Thumbnails는 필요에 따라 생성되며, 장치가 제거된 후에도 남아 있습니다. 제안: 파일을 선언된 Fotocx 폴더로 복사한 후, 이 위치에서 필요한 처리를 하세요. 성능이 훨씬 좋아질 것입니다. - ^이동식 저장 장치 (USB 드라이브) 최상위 이미지 폴더에 이동식 드라이브의 폴더가 포함되어 있고, 드라이브가 마운트되지 않은 채로 Fotocx를 실행하면, 이동식 파일이 사라졌더라도 색인 데이터와 thumbnails는 그대로 유지됩니다. 이동식 드라이브가 다시 마운트되고 Fotocx가 시작되면, 마지막 상태가 복원됩니다. 그 사이에 파일이 추가되거나 수정되었다면, 색인 데이터와 thumbnails가 업데이트됩니다. - - TOPIC: Fotocx 홈 이동 Fotocx 홈 폴더에는 모든 사용자 설정과 데이터가 있으며, 사용자가 사용자 지정할 수 있는 Fotocx 패키지의 일부 파일도 포함됩니다. 기본 위치: /home//.fotocx. 여러 버전이나 릴리스의 Linux가 설치되어 있다면, 각 릴리스마다 하나씩 두는 대신 공유된 하나의 Fotocx 홈 폴더를 두는 것이 바람직할 수 있습니다. 여러 사용자가 같은 Fotocx 인스턴스에 접근해야 한다면 마찬가지일 수 있습니다. - 이 기능을 사용해 Fotocx 홈 폴더를 다른 곳으로 이동하세요. 선택한 폴더의 경로 이름에는 "fotocx"가 포함되어야 하며, 그렇지 않으면 "/fotocx"가 추가됩니다. - 여러 Fotocx 이미지 컬렉션을 별도로 관리하고 싶다면 {명령줄 매개변수}의 -home 매개변수를 참고하세요. - - TOPIC: 설정 +image: settings.jpg - 다양한 사용자 환경설정과 설정이 /parameters 파일에 모여 저장됩니다. 대부분의 변경 사항은 즉시 적용됩니다. 일부는 Fotocx를 다시 시작하게 합니다. - • 원하는 2자리 언어 코드를 선택하세요. Fotocx가 선택한 언어로 다시 시작됩니다. • Startup View - Fotocx가 시작될 때 초기 화면. Recent Files: 가장 최근에 본 이미지 파일 Newest Files: 가장 최근에 추가/수정된 파일 Specific Gallery: 지정한 폴더 갤러리 Album Gallery: 지정한 앨범 갤러리 Previous Gallery: 이전 세션에서 마지막으로 사용한 갤러리 Previous File: 이전 세션에서 마지막으로 본 파일 Specific File: 지정한 이미지 파일 Browse button: 폴더, 앨범, 또는 이미지 파일 선택 • Background - 파일 보기 및 갤러리 보기 창의 배경 색상 • Menu Style - 메뉴 표시 스타일: 아이콘, 텍스트, 또는 둘 다 • Menu Colors - 메뉴 텍스트 색상과 배경 색상 • Dialog Font - 메뉴 및 대화 상자의 글꼴 • Show Hidden - 선택하면 숨김 파일과 폴더 표시 • Zoom Speed - 이미지를 2배로 늘리는 데 필요한 클릭 수나 [+] 키 입력 수를 1~8로 선택 • JPEG files - 품질 수준, 기본값 90, 좋은 품질을 위해 70 이상 사용 • Curve Node - 편집 곡선의 최소 노드 간격, 배율의 %. 기본값은 배율의 5%입니다. 터치패드에는 더 높은 값을 사용하세요. • Image Position - 더 넓은 창 내에서 이미지가 왼쪽/중앙/오른쪽에 위치 • Confirm Exit - 팝업 대화 상자 옵션: 정말 종료하시겠습니까? • Index Level - 아래 참고 • RAW Loader - 아래 참고 • RAW Options - 아래 참고 • RAW Files - 사용되는 RAW 파일 형식 목록 • Video Files - 사용되는 비디오 파일 형식 목록 • Video App - 아래 참고 - ^파일 품질 및 압축 JPEG 파일 품질 수준: 좋은 이미지 품질을 위해 70 이상을 사용하세요(기본값 90). TIFF 파일 압축 방법은 DEFLATE입니다(컬러 이미지에 가장 적합). PNG 파일 압축 수준은 '1'입니다. 더 높은 값은 파일 저장 시간을 늘리는 것 외에는 별다른 효과가 없어 보입니다(libpng). - ^이미지 위치 창이 이미지보다 넓다면(즉, 창의 너비/높이 비율 > 이미지), 이미지를 왼쪽으로, 중앙으로, 또는 오른쪽으로 이동할 수 있습니다. 왼쪽이나 오른쪽이면, 사용되지 않는 여백이 최대화되어 대화 상자를 배치하는 데 더 편리할 수 있습니다. - ^이미지 색인 수준 이 두 매개변수는 시작 시간과 이미지 색인 완전성 사이의 타협을 제어합니다. • $ fotocx: 셸 명령, 시스템 메뉴, 또는 시스템 아이콘/런처를 사용해 fotocx를 시작할 때 적용됩니다. 권장 값 '2'는 전체 색인을 의미합니다: 이전 색인 파일을 불러오고, (아직 색인되지 않은) 새 파일을 검색해 fotocx 색인 파일을 업데이트합니다. • $ fotocx : 파일 관리자 목록에서 파일 이름을 클릭해 fotocx를 시작할 때 적용됩니다. 권장 값 '1'은 이전 색인 파일을 불러오지만 색인을 업데이트할 새 파일은 검색하지 않음을 의미합니다. 시작은 적당히 빠릅니다. 이미지 검색과 지도 기능은 정상적으로 작동하지만, 새로운(아직 색인되지 않은) 이미지 파일은 포함되지 않습니다. • 대안: '0'은 색인 없음을 의미합니다. 시작이 매우 빠릅니다. 나중에 이미지 검색이나 지도 기능을 사용하면 이전 파일에 대해서만 파일 색인 기능이 시작됩니다(새/수정된 파일 검색 없음). 이미지 컬렉션이 방대해 시작 시간이 몇 초를 넘는다면 이 옵션을 사용하세요. 필요하다면 나중에 색인 기능을 시작할 수 있습니다. - ^RAW 로더 RAW 로더는 RAW 파일을 읽어 16비트 색상 심도의 TIFF로 변환하는 데 사용되는 명령입니다. RAW 파일을 볼 때 사용됩니다. Fotocx 편집 기능을 사용해 파일을 편집하고 최적화할 수 있습니다. 기본 RAW 로더는 sRGB 색공간을 사용하는 dcraw입니다. dcraw나 rawtherapee를 사용하는 몇 가지 다른 옵션이 선택 목록에 제공됩니다. 이 명령들은 Fotocx 홈 폴더의 'raw_commands_*' 파일에 보관됩니다. 이 파일을 편집해 옵션을 변경하거나 새로 추가하세요(아래 참고). 여러 카메라나 여러 처리 옵션을 위해 여러 명령을 준비하고 싶을 수 있습니다. RAW 편집기를 대화형으로 사용하고 싶다면, 이를 위한 플러그인 명령을 만드세요 - {플러그인}을 참고하세요. - ^RAW 옵션 • edit commands: 버튼을 눌러 RAW 로더 명령 목록을 편집하세요. 새 창에서 현재 명령 목록과 함께 텍스트 편집기가 시작됩니다. • match embedded image color: RAW 파일에 내장된 이미지를 가이드로 사용해 RAW 이미지 색상을 변환된 TIFF 이미지에 매핑하세요. 이는 카메라 제조사의 RAW 데이터 해석이며, RAW 파일을 더 편집해야 한다면 좋은 출발점입니다. 내장된 이미지는 보통 카메라의 JPEG 파일과 같습니다. - ^비디오 앱 비디오 재생 앱을 시작하는 셸 명령을 입력하세요. 명령줄에서 비디오 파일 이름이 삽입될 위치를 표시하려면 '%s'를 사용하세요. 다음은 몇 가지 예시입니다: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: 키보드 단축키 +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - 사용자 지정 키보드 단축키를 보거나 변경합니다. 현재 지정된 단축키가 첫 번째 창에 표시됩니다. [편집] 버튼을 누르면, 키보드 단축키를 추가하고 변경할 수 있는 두 번째 대화 상자가 표시됩니다. 키보드를 사용해 새 단축키를 입력하세요. A-Z, 0-9, F2-F9 키와 대부분의 기호(% $ & * < 등)를 사용할 수 있습니다. 키를 Ctrl/Alt/Shift 중 하나와 조합할 수 있습니다: Ctrl/Alt/Shift 중 하나를 누른 채로, 키를 누른 후, 둘 다 놓으세요. 오른쪽 목록에서 사용 가능한 메뉴 지정 중 하나를 선택한 후 [추가]와 [OK]를 누르세요. 단축키를 선택하고 [삭제]를 눌러 제거하세요. - - TOPIC: RGB 히스토그램 +image: RGB-hist.png - 작은 창에 파일 보기의 현재 이미지나 현재 선택된 이미지 영역의 밝기 히스토그램 그래프가 표시됩니다. 이 그래프는 편집 기능이 이미지를 변경함에 따라 동기적으로 업데이트됩니다. [전체] [빨강] [초록] [파랑] 버튼을 사용해 표시할 색상을 선택하세요. - - TOPIC: 이미지 확대 +image: magnify-image.jpg - 마우스 포인터 주위 영역의 이미지를 확대합니다. 이미지 주위에서 마우스를 왼쪽 드래그해 서로 다른 영역을 확대하세요. 인화된 이미지를 루페로 보는 것과 비슷합니다. 대화 상자를 사용해 영역의 반경과 확대량을 조정하세요. - - TOPIC: 이미지 측정 이미지 내 아무 두 위치를 클릭해 두 점 사이의 픽셀 거리를 측정하세요. 클릭한 위치는 이미지에서 A와 B로 표시됩니다. 이 라벨은 항상 마지막으로 클릭한 두 점을 보여줍니다. 대화 상자는 이 두 점을 나누는 거리로 업데이트됩니다: X-distance (가로 거리) Y-distance (세로 거리) H-distance (전체 거리) - - TOPIC: RGB 표시 +image: show-RGB.png - 이미지의 한 점을 클릭하면, RGB 값이 대화 상자 창에 표시됩니다. 마지막으로 클릭한 9개의 점이 표시됩니다. 값은 xxx.dd 형식이며, xxx는 색상 값의 상위 8비트, .dd는 하위 8비트입니다. 범위는 0.00에서 255.99까지입니다. 이미지가 편집 중이거나 8비트 이상의 색상 심도를 갖지 않는 한 하위 8비트는 0입니다. 이미지가 편집 중이면 출력이 실시간으로 업데이트됩니다. "labels"가 체크되어 있으면, 대화 상자 창의 문자와 대응하는 문자로 이미지에 점이 표시됩니다. "delta"가 체크되어 있고 이미지가 편집 중이면, 절댓값 대신 RGB 변화가 표시됩니다. - 다른 이미지를 열면(예: 이전 이미지와 비교하기 위해), 위치가 새 이미지 경계 내에 있다면 유지되고 업데이트됩니다. 이는 픽셀 RGB 값 수준에서 이미지를 비교하는 것을 쉽게 해줍니다. - - TOPIC: 격자 설정 +image: grid-settings.jpg - 두 가지 격자선 기능이 있습니다: 격자 설정은 모든 격자 매개변수를 설정합니다. 격자 전환은 격자선을 켜거나 끕니다. 격자선은 이미지 전체에 일정한 간격으로 있는 가로/세로 선입니다. 이러한 선은 이미지를 펴거나 왜곡해 벽이나 다른 물체를 곧게 할 때 유용한 정렬 가이드가 될 수 있습니다. x-count와 y-count 입력을 사용해 각각 세로선과 가로선의 개수를 설정하세요. x-offset과 y-offset 컨트롤을 사용해 격자선을 이동시켜 이미지 내 원하는 위치와 교차하게 할 수 있습니다. 격자 전환에 키보드 단축키(기본값 shift+G)를 지정할 수 있어, 키 하나로 격자선을 켜거나 끌 수 있습니다. - - TOPIC: 선 색상 일부 기능(자르기, 영역 선택 등)은 이미지 위에 선을 그립니다. 배경 이미지와의 대비를 최대화하기 위해 이 선의 색상을 변경할 수 있습니다. 작은 대화 상자를 편집 중에 열어 두어, 사용 가능한 색상(검정, 흰색, 빨강, 초록) 사이를 편리하게 전환할 수 있습니다. - - TOPIC: 어둡거나 밝은 픽셀 이미지에서 가장 어둡고 가장 밝은 픽셀을 강조합니다. 두 개의 스핀 컨트롤을 조정해 밝기 임계값을 설정하세요. 초기값은 어두운 픽셀은 0, 밝은 픽셀은 255입니다. 어둠 임계값보다 밝기가 낮거나 밝음 임계값보다 밝기가 높은 픽셀은 눈에 띄도록 "깜박입니다". 밝기나 색상을 편집한 후 클리핑을 감지하는 데 이 기능을 사용하세요. - - TOPIC: 모니터 색상 +image: moncolor-small.png - 화면 전체에 밝기 0(검정)부터 100%까지의 여덟 개 색상 띠가 그려집니다. 이를 사용해 모니터의 밝기와 대비를 조정할 수 있습니다. 띠의 양 끝에 변화 없는 영역이 없어야 합니다. - - TOPIC: 중복 항목 찾기 +image: find-dups.png - 이미지 데이터베이스 내 어디에서든 중복된 이미지 파일을 찾습니다. 중복 파일은 다른 파일과 정확히 또는 "거의" 중복되는 파일일 수 있습니다. 속도를 위해 thumbnail 이미지는 메모리에서 비교됩니다. thumbnails에 반영되지 않은 미세한 차이가 있는 메인 이미지에 대해 일치하는 thumbnails가 발견될 수 있습니다. 크기가 줄어든 이미지 복사본은 중복으로 분류될 가능성이 높습니다. Thumbnail 크기는 32에서 512픽셀로 설정할 수 있습니다. 크기가 클수록 오탐 가능성이 줄어듭니다. Thumbnail 크기는 필요한 메인 메모리 양에 큰 영향을 줍니다 - 예를 들어 이미지 10만 개에 대해, 크기 64는 약 880MB가 필요한 반면 크기 256은 약 14GB가 필요합니다. [calculate] 버튼을 눌러 사용 가능한 여유 메모리 내에 맞출 수 있는 가장 큰 thumbnail 크기를 계산하세요. - 동일하거나 거의 동일한 이미지를 감지하는 민감도를 설정하는 데 두 개의 매개변수가 사용됩니다: pixel difference는 이보다 낮으면 픽셀이 같다고 간주되는 RGB 값 차이입니다. Pixel count는 이보다 적으면 두 이미지가 중복으로 분류되는 다른 픽셀의 개수입니다. 예: pixel difference = 2이고 pixel count = 10이면, 2 이하로 차이 나는 픽셀이 10개 미만이면 이미지는 중복으로 분류됩니다. - 출력은 각 중복 이미지 세트를 보여주는 갤러리입니다. 출력 갤러리는 "Duplicate Images" 앨범으로 저장됩니다. 이 앨범과 함께 일괄 삭제/휴지통을 사용해 삭제할 중복 항목을 선택할 수 있습니다. - - TOPIC: 손상된 파일 찾기 선언한 최상위 폴더 내의 모든 이미지 파일을 읽습니다. 읽을 수 없는 각 파일에 대해 세 가지 옵션이 있습니다: • 파일 삭제 • 잘못된 파일 형식 수정 (아래 참고) • 최상위 이미지 폴더 바깥의 어딘가로 파일 이동 .jpg 확장자를 가진 .png 파일을 종종 봤습니다. 웹 브라우저와 일부 다른 앱은 이를 조용히 처리합니다. 여기서는 올바른 파일 형식이 보고되며 확장자를 올바른 것으로 변경할 수 있습니다. - - TOPIC: 리소스 표시 Fotocx가 사용하는 컴퓨터 리소스를 보고합니다: • CPU time: Fotocx 시작 이후 또는 마지막 샘플 이후의 사용량 • Real memory: 현재 사용 중인 실제 메모리 (스왑 제외) • Maps cache: 캐시된 지도 타일에 사용된 디스크 저장 공간(MB) • Clear cache: 캐시된 모든 지도 타일 삭제 • [Sample] 버튼: 새 샘플을 채취해 데이터 보고 - [Sample] 버튼은 CPU 시간을 재설정합니다. 다음 샘플은 새로 누적된 CPU 시간만 보여줍니다. CPU 시간은 모든 프로세스 스레드의 합계입니다. - - TOPIC: 번역 Fotocx 패키지에는 여러 언어의 번역이 포함되어 있습니다. 이 AI 번역은 완벽하지 않습니다. 번역 파일을 편집해 번역 오류를 고칠 수 있습니다. - ^GUI 언어 변경 {설정} 메뉴를 사용해 언어를 변경할 수 있습니다. Fotocx를 시작할 때 언어를 설정할 수도 있습니다: $ fotocx -lang xx # 언어 xx (de fr zh 등) $ fotocx -lang en # 영어 - ^GUI 번역 수정 /translations/gui_xx 파일을 편집하세요 텍스트 줄 쌍은 서로 일치해야 하는 4자리 번호로 시작합니다. 첫 번째 줄은 영어이고, 두 번째 줄은 xx 언어입니다. xx 줄만 수정하고 영어 줄은 절대 수정하지 마세요. 텍스트에 매개변수를 삽입하는 특수 문자는 같은 순서로 유지되어야 합니다. 이는 '%d'(정수 매개변수), '%f'(소수), '%s'(텍스트)입니다. - ^사용자 안내서 번역 수정 /translations/ug_xx 파일을 편집하세요 번역을 고치려면 ug_xx를 편집하세요. 텍스트 줄을 추가하거나 제거하거나 순서를 바꾸지 마세요. 텍스트 줄은 영어 사용자 안내서(ug_en)와 1:1로 대응해야 합니다. - 수정된 파일을 다음 Fotocx 릴리스에 포함하려면 보내주세요: mkornelix@gmail.com - - TOPIC: 도움말 메뉴 • User Guide - 목차 표시 • Video Tutorial - YouTube에서 Fotocx 동영상 튜토리얼 표시 • Outboard Programs - 외부 프로그램과 그 기능 나열 • Show Log File - 기록된 정보와 오류 메시지 표시 • Command Parameters - 사용 가능한 명령줄 매개변수 표시 • Change Log - 최근 릴리스의 추가 사항과 버그 수정 표시 • Copyright - Fotocx와 관련된 저작권 및 라이선스 표시 • Privacy - Fotocx의 개인정보 처리방침(규칙) 표시 • About - 릴리스 번호, 실행 파일 위치, 연락처 표시 • Home Page - kornelix.net의 Fotocx 홈페이지 표시 • Uninstall - Fotocx 제거 방법 - - TOPIC: 기타 주제 다음 주제는 Fotocx 메뉴와 연결되어 있지 않습니다. - - TOPIC: VIDEO FILES 비디오 파일(.mpeg, .mp4 등)이 이미지 파일과 섞여 있을 수 있습니다. 파일 보기와 갤러리 보기 모두에서 이미지 파일처럼 표시됩니다. 'P' 키로 비디오를 시작, 일시 정지, 재개하거나 끝난 비디오를 다시 재생할 수 있습니다. 'Q' 키로 비디오를 종료합니다. 비디오 파일 재생 애플리케이션을 선택하려면 {설정} 메뉴를 사용하세요. - - TOPIC: 슬라이드 및 필름 +image: color-negative.jpg - 클로즈업 기능이 있는 카메라를 사용해 슬라이드나 필름 네거티브를 촬영할 수 있습니다. 조명을 위해 라이트 박스를 사용하거나 하늘을 사용하세요(위 예시). 컬러 네거티브를 처리하려면, 먼저 포지티브로 만드세요 - {색상 모드}를 참고하세요. 이미지가 뿌옇다면, 필름 가장자리를 제외한 이미지 영역만 선택한 후 {전역 레티넥스}를 사용해 안개를 제거하세요. 안개를 더 줄여야 한다면 이미지를 클릭해 화이트와 블랙 포인트를 설정하세요. - - TOPIC: Fotocx 제한 사항 • 파일 100만 개의 엄격한 한계가 있습니다. • 이미지 버전 - 실행 취소/다시 실행 및 버전 이름 지정에 최대 99개 버전. • 이미지 keywords - 전체 keywords 1만 개. 이미지 하나당 1000자. • 갤러리는 이미지 파일 4만 개로 제한됩니다. • 최대 이미지 크기는 40000 x 20000픽셀입니다. - - TOPIC: Windows 11용 Fotocx Windows Subsystem for Linux 2(WSL2)를 설치하면 Windows 11에서 Fotocx를 사용할 수 있습니다. 이를 수행하는 방법에 대한 충분한 문서가 인터넷에 있습니다. - 이미지 파일이 Windows 파일 시스템(NTFS)에 있다면 Fotocx가 매우 느려집니다. 따라서 이미지 파일을 Linux 파일 시스템으로 이동하세요. Windows 파일 탐색기와 다른 Windows 앱을 사용해 여전히 접근할 수 있으므로 아무것도 손실되지 않습니다. Microsoft도 성능 향상을 위해 Linux 파일 시스템을 권장합니다. 파일 탐색기의 'Linux' 아이콘을 사용해 Linux 파일 시스템의 홈 폴더에 접근하세요. 필요하다면 Pictures 폴더를 추가하고 이미지 파일을 그곳으로 이동하세요. - Fotocx 패키지를 사용할 수 있다면 설치하세요. 그렇지 않다면 다음을 수행하세요: ^https://kornelix.net^에서 Fotocx 바이너리 패키지 파일을 다운로드하세요. Linux 터미널에서: $ cd /mnt/c/Users//Downloads # Windows 다운로드 폴더로 이동 $ tar -xzf fotocx-xxx-bin.tar.gz # 패키지를 fotocx 폴더로 압축 해제 $ cd fotocx # fotocx 폴더로 이동 $ chmod u+x install.sh # 설치 스크립트를 실행 가능하게 만들기 $ ./install.sh # 스크립트 실행, fotocx 설치 $ fotocx # Fotocx 시작 마지막 단계가 작동하려면 Linux 창을 다시 시작해야 할 수 있습니다. - 이 사용자 안내서의 소개 부분을 읽으세요. Fotocx는 깊이 있는 기능을 가지고 있습니다. 몇 분 안에 Fotocx를 완전히 익힐 것이라고 기대하지 마세요. - - TOPIC: 개인정보 Fotocx는 이미지 파일과 그 metadata 외에는 어떤 사용자 데이터도 보관하지 않습니다. 인터넷에 업로드하기 전에 이미지 파일에서 metadata를 제거해야 하며, Fotocx는 이를 위한 간단한 방법을 제공합니다. - - TOPIC: PROBLEM, QUESTION, SUGGESTION mkornelix@gmail.com으로 이메일을 보내세요. 크래시 덤프(zappcrash 파일)가 있다면 이것도 함께 보내주세요. - fotocx/data/translations/ug_el0000664000175000017500000176416615247006657015533 0ustar micomico- ^ΟΔΗΓΟΣ ΧΡΗΣΗΣ FOTOCX^ v.26.8 Προβολή μέσω του μενού Fotocx Βοήθεια > Οδηγός Χρήσης - {ΧΡΗΣΗ ΤΟΥ FOTOCX} {ΠΡΩΤΗ ΕΚΚΙΝΗΣΗ} - εντοπισμός και ευρετηρίαση αρχείων εικόνας για γρήγορη αναζήτηση {ΟΔΗΓΟΣ ΧΡΗΣΗΣ} ← ^κάντε κλικ εδώ^ - πώς να χρησιμοποιήσετε αυτόν τον περιηγητή του οδηγού χρήσης {ΠΡΟΒΟΛΕΣ ΚΑΙ ΜΕΝΟΥ ΠΑΡΑΘΥΡΟΥ} - παράθυρα ανώτατου επιπέδου και τα σχετικά μενού {ΠΡΟΒΟΛΗ ΑΡΧΕΙΟΥ} - παράθυρο Προβολής Αρχείου (προβολή μεμονωμένου αρχείου εικόνας) {ΠΡΟΒΟΛΗ ΓΚΑΛΕΡΙ} - παράθυρο Προβολής Γκαλερί (προβολή φακέλου ως thumbnails) {ΠΡΟΒΟΛΗ ΧΑΡΤΗ} - παράθυρο προβολής χάρτη (προβολή χάρτη με δείκτες θέσης εικόνων) {ΜΕΤΑΦΟΡΑ ΚΑΙ ΑΠΟΘΕΣΗ} - μέθοδοι μεταφοράς και απόθεσης αρχείων {ΕΠΕΞΕΡΓΑΣΙΑ ΔΙΑΔΙΚΑΣΙΩΝ} - πώς να επεξεργάζεστε αρχεία εικόνας {ΕΠΕΞΕΡΓΑΣΙΑ ΡΟΗΣ ΕΡΓΑΣΙΑΣ} - εναλλακτικές μέθοδοι επεξεργασίας - απλές και σύνθετες {ΚΥΡΙΟΤΗΤΑ ΠΟΝΤΙΚΙΟΥ} - έλεγχος και αλληλεπίδραση ποντικιού με τα παράθυρα διαλόγου {ALT + ΔΕΞΙ ΚΟΥΜΠΙ ΠΟΝΤΙΚΙΟΥ} - δεξί κουμπί ποντικιού για touchpad/οθόνες {ΚΟΥΜΠΙΑ ΠΑΡΑΘΥΡΟΥ ΔΙΑΛΟΓΟΥ} - επιλογές ολοκλήρωσης διαλόγου {ΠΛΗΚΤΡΟ ESCAPE} - λειτουργίες του πλήκτρου Escape {ΜΗ ΤΥΠΙΚΑ ΣΤΟΙΧΕΙΑ ΠΑΡΑΘΥΡΟΥ ΔΙΑΛΟΓΟΥ} - πώς να χρησιμοποιείτε τα μη τυπικά widgets διαλόγου {ΕΠΕΞΕΡΓΑΣΙΑ ΚΑΜΠΥΛΗΣ} - πώς να χειρίζεστε τις καμπύλες που χρησιμοποιούνται στις λειτουργίες επεξεργασίας {MOUSE PAINTING} - τοπική επεξεργασία εικόνας με χρήση του ποντικιού {ΜΑΖΙΚΗ ΕΠΕΞΕΡΓΑΣΙΑ} - επισκόπηση λειτουργιών ομαδικής επεξεργασίας {ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ} - διαδικασία επιλογής αρχείων εικόνας {ΣΥΝΤΟΜΕΥΣΕΙΣ} - αναδυόμενα μενού, συντομεύσεις πληκτρολογίου, προσαρμοσμένο μενού χρήστη {ΛΕΙΤΟΥΡΓΙΕΣ ΠΟΝΤΙΚΙΟΥ} - λειτουργίες ποντικιού για τις προβολές αρχείου/γκαλερί/χάρτη {ΠΑΡΑΜΕΤΡΟΙ ΕΝΤΟΛΩΝ} - παράμετροι γραμμής εντολών του Fotocx - {ΜΕΝΟΥ ΑΡΧΕΙΟΥ} {ΝΕΑ ΣΥΝΕΔΡΙΑ} - έναρξη νέας συνεδρίας Fotocx σε ξεχωριστό παράθυρο {ΑΝΟΙΓΜΑ ΑΡΧΕΙΟΥ ΕΙΚΟΝΑΣ} - άνοιγμα αρχείου εικόνας για προβολή ή επεξεργασία {ΕΝΑΛΛΑΓΗ 2 ΑΡΧΕΙΩΝ} - εναλλαγή μεταξύ των δύο πιο πρόσφατα προβεβλημένων αρχείων εικόνας {ΕΝΑΛΛΑΓΗ 3 ΑΡΧΕΙΩΝ} - εναλλαγή μεταξύ των τριών πιο πρόσφατα προβεβλημένων αρχείων εικόνας {ΠΡΟΒΟΛΗ ΠΑΝΟΡΑΜΑΤΟΣ 360°} - πανοραμική εικόνα 360° με περιστρεφόμενη οπτική γωνία {ΚΕΝΗ ΕΙΚΟΝΑ} - δημιουργία κενής εικόνας με καθορισμένο μέγεθος και χρώμα {ΚΕΝΗ ΕΙΚΟΝΑ} - δημιουργία νέας κενής εικόνας {ΑΝΤΙΓΡΑΦΗ/ΜΕΤΑΚΙΝΗΣΗ} - αντιγραφή ή μετακίνηση αρχείου εικόνας σε άλλο φάκελο {ΑΝΤΙΓΡΑΦΗ ΣΤΗΝ ΕΠΙΦΑΝΕΙΑ ΕΡΓΑΣΙΑΣ} - αντιγραφή αρχείου εικόνας στην επιφάνεια εργασίας {ΑΝΤΙΓΡΑΦΗ ΣΤΟ ΠΡΟΧΕΙΡΟ} - αντιγραφή αρχείου εικόνας στο πρόχειρο {ΔΙΑΓΡΑΦΗ/ΑΠΟΡΡΙΨΗ} - διαγραφή αρχείου εικόνας ή μετακίνηση στα απορρίμματα {ΟΡΙΣΜΟΣ ΤΑΠΕΤΣΑΡΙΑΣ} - ορισμός ταπετσαρίας επιφάνειας εργασίας από το τρέχον αρχείο εικόνας {ΕΚΤΥΠΩΣΗ ΕΙΚΟΝΑΣ} - εκτύπωση αρχείου εικόνας {ΒΑΘΜΟΝΟΜΗΜΕΝΗ ΕΚΤΥΠΩΣΗ} - εκτύπωση με χρήση δεδομένων βαθμονόμησης χρώματος {ΒΑΘΜΟΝΟΜΗΣΗ ΕΚΤΥΠΩΤΗ} - βαθμονόμηση χρώματος εκτυπωτή - αντιστάθμιση αποκλίσεων χρώματος - {ΜΕΝΟΥ ΓΚΑΛΕΡΙ} {ΕΠΙΣΚΟΠΗΣΗ ΓΚΑΛΕΡΙ} {ΠΡΟΒΟΛΗ THUMBNAIL} - Προβολή Γκαλερί με thumbnails και ονόματα αρχείων {ΠΡΟΒΟΛΗ METADATA} - Προβολή Γκαλερί με thumbnail και βασικά metadata {ΠΡΟΣΦΑΤΑ ΑΡΧΕΙΑ} - Προβολή Γκαλερί των πιο πρόσφατα προβεβλημένων αρχείων εικόνας {ΠΙΟ ΠΡΟΣΦΑΤΑ ΑΡΧΕΙΑ} - Προβολή Γκαλερί των νεότερων αρχείων εικόνας {ΤΑΞΙΝΟΜΗΣΗ ΓΚΑΛΕΡΙ} - αλλαγή της σειράς ταξινόμησης μιας γκαλερί {ΦΙΛΤΡΟ ΓΚΑΛΕΡΙ} - επιλογή νεότερων, παλαιότερων, αρχείων που ταιριάζουν με μοτίβο ... {ΑΡΧΗ ΓΚΑΛΕΡΙ} - μετάβαση στην αρχή της γκαλερί {ΤΕΛΟΣ ΓΚΑΛΕΡΙ} - μετάβαση στο τέλος της γκαλερί {ΦΑΚΕΛΟΣ ΤΡΕΧΟΝΤΟΣ ΑΡΧΕΙΟΥ} - ορισμός τρέχουσας γκαλερί από τον φάκελο του τρέχοντος αρχείου {ΠΡΟΣΦΑΤΟΙ ΦΑΚΕΛΟΙ} - προβολή λίστας πρόσφατα προβεβλημένων φακέλων, επιλογή {ΔΕΝΤΡΟ ΦΑΚΕΛΩΝ} - προβολή φακέλων αρχείων εικόνας σε δομή δέντρου, επιλογή {ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ} - επιλογή αρχείων για είσοδο σε ομαδική επεξεργασία, script ή άλμπουμ {ΣΕΛΙΔΟΔΕΙΚΤΕΣ} - προβολή λίστας σελιδοδεικτών, μετάβαση σε σελιδοδείκτη {ΕΠΕΞΕΡΓΑΣΙΑ ΣΕΛΙΔΟΔΕΙΚΤΩΝ} - προσθήκη, αφαίρεση, διευθέτηση σελιδοδεικτών - {MAPS MENU} {ΠΑΓΚΟΣΜΙΟΣ ΧΑΡΤΗΣ} - επισκόπηση παγκόσμιου χάρτη μέσω internet {ΕΜΦΑΝΙΣΗ ΣΤΟ ΧΑΡΤΗ} - εμφάνιση της θέσης της τρέχουσας εικόνας στον χάρτη - {ΜΕΝΟΥ ΑΛΜΠΟΥΜ} {ΑΛΜΠΟΥΜ} - δημιουργία και διευθέτηση συλλογών εικόνων {ΔΗΜΙΟΥΡΓΙΑ ΑΛΜΠΟΥΜ} - δημιουργία νέου άλμπουμ (γκαλερί επιλεγμένων εικόνων) {ΜΕΤΟΝΟΜΑΣΙΑ ΑΛΜΠΟΥΜ} - μετονομασία υπάρχοντος άλμπουμ {ΔΙΑΓΡΑΦΗ ΑΛΜΠΟΥΜ} - διαγραφή υπάρχοντος άλμπουμ {ΕΠΙΛΟΓΗ ΑΛΜΠΟΥΜ} - επιλογή άλμπουμ και εμφάνιση γκαλερί εικόνων {ΤΡΕΧΟΝ ΑΛΜΠΟΥΜ} - εμφάνιση του τρέχοντος (τελευταίου χρησιμοποιημένου) άλμπουμ {ΓΚΑΛΕΡΙ ΣΕ ΑΛΜΠΟΥΜ} - αποθήκευση τρέχουσας γκαλερί ως ονομασμένο άλμπουμ {ΕΠΕΞΕΡΓΑΣΙΑ ΑΛΜΠΟΥΜ} - προσθήκη, αφαίρεση, αναδιάταξη αρχείων εικόνας σε γκαλερί άλμπουμ {ΕΝΗΜΕΡΩΣΗ ΑΛΜΠΟΥΜ} - ενημέρωση άλμπουμ για ενημερωμένα αρχεία εικόνας (νέες εκδόσεις) {ΜΑΖΙΚΗ ΕΝΗΜΕΡΩΣΗ ΑΛΜΠΟΥΜ} μαζική ενημέρωση άλμπουμ (προσθήκη/αφαίρεση/αντικατάσταση αρχείων μελών) {ΠΡΟΒΟΛΗ ΔΙΑΦΑΝΕΙΩΝ} - προβολή σλάιντ με κινούμενες μεταβάσεις εικόνων και pan/zoom - {ΠΡΟΣΑΡΜΟΣΜΕΝΟ ΜΕΝΟΥ} - προσαρμοσμένο μενού χρήστη για συχνά χρησιμοποιούμενες λειτουργίες {ΑΡΧΕΙΑ ΣΕΝΑΡΙΟΥ} - επισκόπηση αρχείων script {ΕΠΕΞΕΡΓΑΣΙΑ ΣΕΝΑΡΙΟΥ} - καταγραφή επεξεργασιών σε script για δημιουργία προσαρμοσμένης λειτουργίας επεξεργασίας {ΕΚΤΕΛΕΣΗ ΣΕΝΑΡΙΟΥ} - εκτέλεση script στην τρέχουσα εικόνα {ΣΕΝΑΡΙΟ ΜΑΖΙΚΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ} - εκτέλεση script σε επιλεγμένα αρχεία εικόνας {PLUGINS} - εκκίνηση λειτουργίας επεξεργασίας plugin, άνοιγμα αρχείου εξόδου plugin - {ZOOM} - zoom εικόνας ή thumbnails (μεγέθυνση/σμίκρυνση) μέσω ποντικιού ή πληκτρολογίου - {ΠΡΟΗΓΟΥΜΕΝΟ/ΕΠΟΜΕΝΟ} - μετάβαση στην προηγούμενη ή επόμενη εικόνα μέσω ποντικιού ή πληκτρολογίου - {ΑΠΟΘΗΚΕΥΣΗ ΑΡΧΕΙΟΥ} - αποθήκευση αρχείου εικόνας (αντικατάσταση, νέα έκδοση, νέο όνομα αρχείου) - {ΜΕΝΟΥ METADATA} {ΠΡΟΒΟΛΗ ΚΥΡΙΩΝ META} - λίστα βασικών metadata εικόνας {ΠΡΟΒΟΛΗ ΟΛΩΝ ΤΩΝ META} - λίστα όλων των metadata εικόνας {ΕΠΙΣΚΟΠΗΣΗ KEYWORDS} - keywords που χρησιμοποιούνται για αναζήτηση εικόνων {GEOTAGS OVERVIEW} - ονόματα τοποθεσιών και γεωσυντεταγμένες για αναζήτηση {ΕΠΕΞΕΡΓΑΣΙΑ ΚΥΡΙΩΝ META} - επεξεργασία συνήθως χρησιμοποιούμενων metadata {ΕΠΕΞΕΡΓΑΣΙΑ ΟΠΟΙΟΥΔΗΠΟΤΕ META} - επεξεργασία οποιωνδήποτε metadata (προσθήκη, αφαίρεση, αλλαγή) {ΔΙΑΓΡΑΦΗ META} - διαγραφή καθορισμένων metadata ή όλων των metadata {ΑΝΤΙΓΡΑΦΗ META} - αντιγραφή metadata από ένα αρχείο εικόνας σε άλλο {ΔΙΟΡΘΩΣΗ META} - επιδιόρθωση κακοδιατυπωμένων metadata που εμποδίζουν την επεξεργασία metadata {ΔΙΑΧΕΙΡΙΣΗ KEYWORDS} - διαχείριση keywords ορισμένων από τον χρήστη {ΛΕΖΑΝΤΕΣ} - εμφάνιση ονόματος αρχείου, τίτλου, περιγραφής στη γωνία της εικόνας {ΤΟΠΟΘΕΣΙΕΣ/ΗΜΕΡΟΜΗΝΙΕΣ} - λίστα τοποθεσιών/ημερομηνιών εικόνων, κλικ για γκαλερί {ΧΡΟΝΟΓΡΑΜΜΗ} - εμφάνιση πλήθους εικόνων ανά έτος/μήνα, κλικ για γκαλερί {TAGS METADATA} - εμφάνιση πλήθους εικόνων ανά τιμή tag, κλικ για γκαλερί {ΑΥΤΟΜΑΤΗ ΑΝΑΖΗΤΗΣΗ} - λειτουργία Αναζήτησης με script για εύρεση αρχείων {ΑΝΑΖΗΤΗΣΗ ΕΙΚΟΝΩΝ} - αναζήτηση με χρήση οποιωνδήποτε metadata ή ονομάτων φακέλων/αρχείων - {ΜΕΝΟΥ ΕΠΙΛΟΓΗΣ} {ΕΠΙΣΚΟΠΗΣΗ ΠΕΡΙΟΧΗΣ} - επιλογή περιοχής - έννοιες και χρήση {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ} - επιλογή χαρακτηριστικού ή περιοχής εικόνας για ξεχωριστή επεξεργασία {ΕΥΡΕΣΗ ΚΕΝΟΥ ΠΕΡΙΟΧΗΣ} - εύρεση κενού στο χειροσχέδιο περίγραμμα περιοχής {ΑΝΑΜΕΙΞΗ ΠΕΡΙΟΧΗΣ} - ανάμειξη με το ποντίκι επεξεργασιών που έγιναν εντός επιλεγμένης περιοχής {ΕΜΦΑΝΙΣΗ/ΑΠΟΚΡΥΨΗ ΠΕΡΙΟΧΗΣ} - εμφάνιση ή απόκρυψη περιγραμμάτων περιοχής {ΕΝΕΡΓΟΠΟΙΗΣΗ/ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ ΠΕΡΙΟΧΗΣ} - ενεργοποίηση ή απενεργοποίηση περιοχής για επεξεργασία {ΑΝΤΙΣΤΡΟΦΗ ΠΕΡΙΟΧΗΣ} - αντιστροφή περιοχής (εναλλαγή εξωτερικής/εσωτερικής περιοχής) {ΕΚΚΑΘΑΡΙΣΗ ΠΕΡΙΟΧΗΣ} - αφαίρεση περιοχής {ΑΝΤΙΓΡΑΦΗ/ΕΠΙΚΟΛΛΗΣΗ ΠΕΡΙΟΧΗΣ} - αντιγραφή περιοχής ή επικόλληση περιοχής στην τρέχουσα εικόνα {ΦΟΡΤΩΣΗ/ΑΠΟΘΗΚΕΥΣΗ ΠΕΡΙΟΧΗΣ} - φόρτωση περιοχής από αρχείο ή αποθήκευση σε αρχείο - {ΚΟΥΜΠΙ ΑΝΑΙΡΕΣΗΣ/ΕΠΑΝΑΛΗΨΗΣ} - διαδοχική αναίρεση ή επανάληψη επεξεργασιών στην τρέχουσα εικόνα - {ΜΕΝΟΥ ΕΠΕΞΕΡΓΑΣΙΑΣ} {ΠΕΡΙΣΤΡΟΦΗ} - περιστροφή ή ευθυγράμμιση εικόνας {ΙΣΙΩΜΑ ΚΑΤΑΚΟΡΥΦΗΣ} - ανόρθωση περιστραμμένης ή κατοπτρισμένης εικόνας {ΠΕΡΙΚΟΠΗ} - περικοπή (κόψιμο) περιθωρίων εικόνας {ΡΕΤΟΥΣ} - επεξεργασία φωτεινότητας, αντίθεσης, χρώματος, κορεσμού {ΑΛΛΑΓΗ ΚΛΙΜΑΚΑΣ} - αλλαγή των διαστάσεων της εικόνας σε pixel {ΔΙΧΑΣΜΕΝΗ ΟΘΟΝΗ} - προβολή αλλαγών πριν/μετά με διχασμένη οθόνη {ΕΜΦΑΝΙΣΗ ΔΙΑΦΟΡΩΝ} - επισήμανση αλλαγών κατά την επεξεργασία (ή μεταξύ δύο εικόνων) {ΠΕΡΙΘΩΡΙΑ} - προσθήκη περιθωρίων σε εικόνα, οποιοδήποτε χρώμα ή διαφάνεια {ΣΗΜΑΝΣΗ} - σχεδίαση πάνω στην εικόνα: κείμενο, γραμμή/βέλος, πλαίσιο, οβάλ {ΛΕΙΤΟΥΡΓΙΑ ΧΡΩΜΑΤΟΣ} - μετατροπή σε ασπρόμαυρο, έγχρωμο, αρνητικό, θετικό {ΖΩΓΡΑΦΙΚΗ ΕΠΕΞΕΡΓΑΣΙΩΝ} - τοπική και σταδιακή εφαρμογή λειτουργίας επεξεργασίας με ζωγραφική ποντικιού {ΖΩΓΡΑΦΙΚΗ ΕΙΚΟΝΑΣ} - ζωγραφική με ποντίκι χρησιμοποιώντας χρώμα, μέγεθος πινέλου και αδιαφάνεια {ΖΩΓΡΑΦΙΚΗ ΔΙΑΦΑΝΕΙΑΣ} - ζωγραφική αυξανόμενης διαφάνειας με χρήση του ποντικιού {ΓΕΜΙΣΜΑ ΠΕΡΙΟΧΗΣ} - γέμισμα επιλεγμένων ή διαφανών περιοχών με χρώμα {ΑΝΤΙΓΡΑΦΗ ΜΕΣΑ ΣΤΗΝ ΕΙΚΟΝΑ} - αντιγραφή pixel εντός της εικόνας με χρήση του ποντικιού {ΑΝΤΙΓΡΑΦΗ ΑΠΟ ΕΙΚΟΝΑ} - αντιγραφή pixel από άλλη εικόνα με χρήση του ποντικιού {ΑΝΤΙΓΡΑΦΗ ΠΡΟΗΓΟΥΜΕΝΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ} - αντιγραφή pixel από προηγούμενες επεξεργασίες με χρήση του ποντικιού - {ΜΕΝΟΥ ΕΠΙΔΙΟΡΘΩΣΗΣ} {ΟΞΥΝΣΗ} - αύξηση ευκρίνειας θολής εικόνας, πολλαπλές μέθοδοι {ΘΟΛΩΜΑ} - θόλωμα εικόνας ή περιοχής εικόνας, πολλαπλές μέθοδοι {ΑΦΑΙΡΕΣΗ ΘΟΡΥΒΟΥ} - μείωση θορύβου εικόνας (μικρές τυχαίες κηλίδες) {ΑΦΑΙΡΕΣΗ ΟΜΙΧΛΗΣ} - προσθήκη ή αφαίρεση ομίχλης/καταχνιάς από εικόνα ή επιλεγμένη περιοχή {ΚΟΚΚΙΝΑ ΜΑΤΙΑ} - αφαίρεση κόκκινων ματιών από φωτογραφίες με φλας {ΕΞΥΠΝΗ ΔΙΑΓΡΑΦΗ} - αφαίρεση καλωδίων ρεύματος, πινακίδων και άλλων μικρών ενοχλητικών στοιχείων {ΑΦΑΙΡΕΣΗ ΦΩΤΟΣΤΕΦΑΝΟΥ} - αφαίρεση φωτοστεφάνων που αφήνει η αύξηση ευκρίνειας και άλλες λειτουργίες {ΑΡΤΙΦΑΚΤ JPEG} - καταστολή τεχνουργημάτων σε ιδιαίτερα συμπιεσμένα αρχεία {ΕΞΟΜΑΛΥΝΣΗ ΑΚΜΩΝ} - καταστολή pixelation (πριονωτές άκρες) κατά μήκος των άκρων χαρακτηριστικών {ΠΡΟΣΑΡΜΟΓΗ RGB} - ρύθμιση χρωμάτων εικόνας με χρήση χρωμάτων RGB ή CMY {ΠΡΟΣΑΡΜΟΓΗ HSL} - επιλογή και αλλαγή χρωμάτων με χρήση του μοντέλου χρώματος HSL {ΑΦΑΙΡΕΣΗ ΣΚΟΝΗΣ} - αφαίρεση κηλίδων σκόνης σε εικόνες από παλιές φωτογραφίες {ΠΑΡΥΦΕΣ} - διόρθωση περιφερειακών χρωματικών αποχρώσεων (χρωματική εκτροπή) - {ΜΕΝΟΥ ΒΕΛΤΙΩΣΗΣ} {ΕΞΟΜΑΛΥΝΣΗ ΙΣΤΟΓΡΑΜΜΑΤΟΣ} - εξομάλυνση ιστογράμματος φωτεινότητας για καλύτερη λεπτομέρεια {ΤΟΠΙΚΗ ΑΝΤΙΘΕΣΗ} - προσθήκη αντίθεσης προσαρμοσμένης στη φωτεινότητα της τοπικής περιοχής {ΕΝΙΣΧΥΣΗ ΑΝΤΙΘΕΣΗΣ} - ενίσχυση υπάρχουσας αντίθεσης για ανάδειξη λεπτομερειών {ΚΑΘΟΛΙΚΟ RETINEX} - αναπροσαρμογή τιμών RGB για μεγαλύτερο εύρος {ΤΟΠΙΚΟ RETINEX} - αναπροσαρμογή τιμών RGB για μεγαλύτερο εύρος {ΚΟΡΕΣΜΟΣ} - ρύθμιση κορεσμού χρώματος με βάση τη φωτεινότητα {ΗΠΙΑ ΕΣΤΙΑΣΗ} - εφαρμογή του κλασικού εφέ "απαλής εστίασης" σε μια εικόνα {ΔΙΑΒΑΘΜΙΣΗ ΦΩΤΕΙΝΟΤΗΤΑΣ} - προσθήκη κλίσης φωτεινότητας/χρώματος κατά μήκος μιας εικόνας {ΣΚΟΤΕΙΝΙΑΣΜΑ ΑΚΡΩΝ} - αλλαγή φωτεινότητας/χρώματος ακτινικά γύρω από επιλεγμένο κέντρο - {ΜΕΝΟΥ ΕΦΕ} {ΠΕΡΙΓΡΑΜΜΑΤΑ} - μετατροπή εικόνας σε σχέδιο περιγράμματος {ΣΚΙΤΣΟ1} - μετατροπή εικόνας σε προσομοιωμένο σκίτσο (1) {ΣΚΙΤΣΟ2} - μετατροπή εικόνας σε προσομοιωμένο σκίτσο (2) {ΚΙΝΟΥΜΕΝΟ ΣΧΕΔΙΟ} - μετατροπή εικόνας σε σχέδιο τύπου κόμικ {ΑΝΑΓΛΥΦΟ} - μετατροπή εικόνας σε προσομοιωμένο ανάγλυφο (εφέ 3D) {ΠΛΑΚΙΔΙΑ1} - μετατροπή εικόνας σε τετράγωνα πλακίδια με εφέ 3D {ΠΛΑΚΙΔΙΑ2} - μετατροπή εικόνας σε ακανόνιστα πλακίδια που ταιριάζουν με την εικόνα {ΖΩΓΡΑΦΙΚΗ} - μετατροπή εικόνας σε προσομοιωμένο ζωγραφικό πίνακα {ΥΦΗ} - προσθήκη υφής σε εικόνα ή επιλεγμένη περιοχή {ΣΥΝΤΗΞΗ} - καταστολή λεπτών λεπτομερειών με διατήρηση της ευκρίνειας {ΤΑΙΡΙΑΣΜΑ ΧΡΩΜΑΤΩΝ} - αντιστοίχιση των χρωμάτων μιας εικόνας με μια άλλη εικόνα {ΜΟΤΙΒΟ} - προσθήκη μοτίβου φόντου σε μια εικόνα {ΔΙΧΤΥΩΤΗ ΣΚΙΑΣΗ} - μετατροπή σε σκίτσο με χρήση διασταυρούμενων παράλληλων γραμμών {DITHER} - διαφορετικοί τρόποι ψηφιδοποίησης (pixelize) ή μείωσης χρωμάτων (posterize) μιας εικόνας {ΧΑΡΑΚΤΙΚΗ} - μετατροπή εικόνας σε ασπρόμαυρες γραμμές {ΠΡΟΣΘΗΚΗ ΛΑΜΨΗΣ} - προσθήκη λάμψης γύρω από φωτεινά αντικείμενα στην εικόνα {ΨΗΦΙΔΩΤΟ} - μετατροπή εικόνας σε ψηφιδωτό χρησιμοποιώντας πλακίδια φτιαγμένα από εικόνες {ΠΡΟΣΘΗΚΗ ΘΟΡΥΒΟΥ} - προσθήκη τυχαίου θορύβου σε μια εικόνα {ΟΡΙΣΜΟΣ ΧΡΩΜΑΤΩΝ} - μείωση του αριθμού των χρωμάτων (posterize) {ΜΕΤΑΤΟΠΙΣΗ ΧΡΩΜΑΤΩΝ} - σταδιακή μετατόπιση χρωμάτων RGB σε GBR ή BRG {ΠΕΡΙΕΡΓΑ ΧΡΩΜΑΤΑ} - προσθήκη τυχαίων περίεργων χρωμάτων σε μια εικόνα {ΠΡΟΣΑΡΜΟΣΜΕΝΟΣ ΠΥΡΗΝΑΣ} - επεξεργασία και εφαρμογή προσαρμοσμένου πυρήνα συνέλιξης - {ΜΕΝΟΥ ΠΑΡΑΜΟΡΦΩΣΗΣ} {ΙΣΙΩΜΑ} - ευθυγράμμιση εικόνων με καμπύλες γραμμές, ειδικά πανοραμάτων {ΠΡΟΟΠΤΙΚΗ} - ευθυγράμμιση αντικειμένου που φωτογραφήθηκε από αμβλεία γωνία {ΠΑΡΑΜΟΡΦΩΣΗ ΠΕΡΙΟΧΗΣ} - παραμόρφωση επιλεγμένης περιοχής εικόνας τραβώντας με το ποντίκι {WARP LINEAR1} - παραμόρφωση εικόνας με σύρσιμο ποντικιού - γραμμική παραμόρφωση 1 {WARP LINEAR2} - παραμόρφωση εικόνας με σύρσιμο ποντικιού - γραμμική παραμόρφωση 2 {ΚΑΜΠΥΛΗ ΠΑΡΑΜΟΡΦΩΣΗ} - παραμόρφωση εικόνας με σύρσιμο ποντικιού - καμπυλωτή παραμόρφωση {ΣΥΓΓΡΑΜΙΚΗ ΠΑΡΑΜΟΡΦΩΣΗ} - παραμόρφωση εικόνας με σύρσιμο ποντικιού - διατήρηση παράλληλων γραμμών {ΑΚΤΙΝΙΚΗ ΠΑΡΑΜΟΡΦΩΣΗ} - προσθήκη ή αφαίρεση παραμόρφωσης βαρελιού ή μαξιλαριού {ΑΠΟ-ΠΑΡΑΜΟΡΦΩΣΗ ΚΟΝΤΙΝΟΥ ΠΛΑΝΟΥ} - αφαίρεση παραμόρφωσης φωτογραφίας προσώπου από κοντινή απόσταση (μεγάλη μύτη) {ΔΗΜΙΟΥΡΓΙΑ ΚΥΜΑΤΩΝ} - παραμόρφωση εικόνας με μοτίβο κύματος {ΣΤΡΙΨΙΜΟ} - στρίψιμο εικόνας γύρω από επιλεγμένο κεντρικό σημείο {ΣΦΑΙΡΑ} - καμπύλωση εικόνας σε σφαιροειδές σχήμα {ΑΠΟ ΜΕΣΑ ΠΡΟΣ ΤΑ ΕΞΩ} - αντιστροφή της απόστασης κέντρου-άκρου κάθε pixel {ΜΙΚΡΟΣ ΠΛΑΝΗΤΗΣ} - τύλιγμα πανοραμικής εικόνας γύρω από κύκλο {ΣΠΕΙΡΑ ESCHER} - μετασχηματισμός εικόνας σε ατέλειωτη εσωστρεφή σπείρα {ΕΞΟΜΑΛΥΝΣΗ ΦΩΤΟΓΡΑΦΙΑΣ} - επιπεδοποίηση φωτογραφίας καμπύλης επιφάνειας - {ΜΕΝΟΥ ΣΥΝΔΥΑΣΜΟΥ} {HDR} - συνδυασμός σκοτεινών/φωτεινών εικόνων για εκτεταμένο εύρος φωτεινότητας {HDF} - συνδυασμός εικόνων εστιασμένων σε κοντινή/μακρινή απόσταση για εκτεταμένο βάθος πεδίου {ΣΤΟΙΒΑΞΗ/ΖΩΓΡΑΦΙΚΗ} - συνδυασμός εικόνων για αφαίρεση παροδικών αυτοκινήτων, τουριστών κ.λπ. {ΣΤΟΙΒΑΞΗ/ΘΟΡΥΒΟΣ} - συνδυασμός εικόνων για μείωση θορύβου μέσω μέσου όρου {ΣΤΟΙΒΑΞΗ/ΕΠΙΠΕΔΑ} - συνδυασμός εκδόσεων εικόνας, επιλογή/ζωγραφική περιοχής/έκδοσης {ΠΑΝΟΡΑΜΑ} - συνδυασμός μιας σειράς εικόνων οριζόντια {ΕΜΦΑΝΙΣΗ ΑΡΧΕΙΩΝ CIM} - εμφάνιση αρχείων εισόδου για την τρέχουσα/τελευταία συνδυασμένη εικόνα {MASHUP} - διευθέτηση εικόνων και μορφοποιημένου κειμένου σε προσαρμοσμένη διάταξη {ΠΙΝΑΚΑΣ ΕΙΚΟΝΩΝ} - ένωση πολλών εικόνων σε συμπαγή μορφή πίνακα - {ΜΕΝΟΥ ΜΑΖΙΚΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ} {ΜΑΖΙΚΗ ΜΕΤΑΤΡΟΠΗ} - αντιγραφή, μετακίνηση, αλλαγή κλίμακας, μετονομασία, μετατροπή, προσθήκη κειμένου ... {ΜΑΖΙΚΗ ΑΝΤΙΓΡΑΦΗ/ΜΕΤΑΚΙΝΗΣΗ} - αντιγραφή/μετακίνηση επιλεγμένων αρχείων εικόνας σε νέο φάκελο {ΜΑΖΙΚΗ ΙΣΙΩΣΗ} - σάρωση για περιστραμμένα αρχεία εικόνας και ανόρθωσή τους {ΜΑΖΙΚΗ ΔΙΑΓΡΑΦΗ/ΑΠΟΡΡΙΨΗ} - διαγραφή ή μετακίνηση στα απορρίμματα επιλεγμένων αρχείων εικόνας {ΜΑΖΙΚΗ ΕΠΙΚΑΛΥΨΗ} - προσθήκη εικόνας επικάλυψης (πνευματικά δικαιώματα ...) σε επιλεγμένες εικόνες {ΜΑΖΙΚΑ KEYWORDS} - προσθήκη ή αφαίρεση keywords για επιλεγμένα αρχεία εικόνας {ΜΑΖΙΚΗ ΜΕΤΟΝΟΜΑΣΙΑ KEYWORDS} - μετονομασία ή διαγραφή keywords για όλα τα αρχεία εικόνας {ΜΑΖΙΚΗ ΕΚΚΑΘΑΡΙΣΗ KEYWORDS} - εκκαθάριση ανεπιθύμητων keywords από όλα τα αρχεία εικόνας {ΜΑΖΙΚΗ ΗΜΕΡΟΜΗΝΙΑ ΦΩΤΟΓΡΑΦΙΑΣ} - αλλαγή ημερομηνιών ή ωρών φωτογραφιών, ή μετατόπιση ζώνης ώρας {ΜΑΖΙΚΗ ΑΛΛΑΓΗ META} - προσθήκη ή αναθεώρηση metadata για επιλεγμένα αρχεία εικόνας {ΜΑΖΙΚΗ ΑΝΑΦΟΡΑ META} - αναφορά metadata για επιλεγμένα ή όλα τα αρχεία εικόνας {ΜΑΖΙΚΑ GEOTAGS} - προσθήκη ή αναθεώρηση geotags για επιλεγμένα ή όλα τα αρχεία εικόνας {ΕΞΑΓΩΓΗ ΑΡΧΕΙΩΝ} - εξαγωγή επιλεγμένων αρχείων σε φάκελο (π.χ. μεταφόρτωση στο web) - {ΜΕΝΟΥ ΕΡΓΑΛΕΙΩΝ} {ΕΥΡΕΤΗΡΙΑΣΗ ΑΡΧΕΙΩΝ} - εργασία μίας φοράς για εύρεση και ευρετηρίαση όλων των αρχείων εικόνας {ΜΕΤΑΚΙΝΗΣΗ ΚΥΡΙΟΥ ΦΑΚΕΛΟΥ FOTOCX} - μετακίνηση του αρχικού φακέλου του Fotocx (δεδομένα χρήστη και ρυθμίσεις) {ΡΥΘΜΙΣΕΙΣ} - προτιμήσεις χρήστη και ρυθμίσεις για τη λειτουργία του Fotocx {ΣΥΝΤΟΜΕΥΣΕΙΣ ΠΛΗΚΤΡΟΛΟΓΙΟΥ} - εμφάνιση και αναθεώρηση συντομεύσεων πληκτρολογίου για λειτουργίες μενού {ΙΣΤΟΓΡΑΜΜΑ RGB} - γράφημα ιστογράμματος φωτεινότητας για την τρέχουσα εικόνα {ΜΕΓΕΘΥΝΣΗ ΕΙΚΟΝΑΣ} - μετατροπή του ποντικιού σε μεγεθυντικό φακό πάνω από την εικόνα {ΜΕΤΡΗΣΗ ΕΙΚΟΝΑΣ} - μέτρηση αποστάσεων σε pixel εντός της εικόνας (κλικ ποντικιού) {ΕΜΦΑΝΙΣΗ RGB} - εμφάνιση τιμών RGB στη θέση του ποντικιού ή για επιλεγμένα σημεία {ΡΥΘΜΙΣΕΙΣ ΠΛΕΓΜΑΤΟΣ} - εμφάνιση ή αφαίρεση γραμμών πλέγματος, ορισμός πλήθους ή απόστασης γραμμών {ΧΡΩΜΑ ΓΡΑΜΜΗΣ} - ορισμός χρώματος για περιγράμματα επιλεγμένης περιοχής {ΣΚΟΤΕΙΝΑ/ΦΩΤΕΙΝΑ PIXEL} - εργαλείο επισήμανσης αποκοπής (clipping) {ΧΡΩΜΑ ΟΘΟΝΗΣ} - ρύθμιση φωτεινότητας και αντίθεσης οθόνης {ΕΥΡΕΣΗ ΔΙΠΛΟΤΥΠΩΝ} - εύρεση διπλότυπων εικόνων σε γκαλερί ή σε όλες τις εικόνες {ΕΥΡΕΣΗ ΕΣΦΑΛΜΕΝΩΝ ΑΡΧΕΙΩΝ} - εύρεση μη αναγνώσιμων αρχείων εικόνας, διαγραφή/μετακίνηση/διόρθωση {ΕΜΦΑΝΙΣΗ ΠΟΡΩΝ} - εμφάνιση χρόνου CPU και τρέχουσας χρήσης μνήμης {ΜΕΤΑΦΡΑΣΕΙΣ} - δημιουργία ή τροποποίηση μεταφράσεων GUI - {ΜΕΝΟΥ ΒΟΗΘΕΙΑΣ} - οδηγός χρήσης, εκμάθηση, ιστορικό αλλαγών, σχετικά με το Fotocx, απεγκατάσταση - {ΑΛΛΑ ΘΕΜΑΤΑ} {VIDEO FILES} - αρχεία βίντεο, thumbnails, αναπαραγωγή βίντεο {ΔΙΑΦΑΝΕΙΕΣ ΚΑΙ ΑΡΝΗΤΙΚΑ} - πώς να ψηφιοποιείτε σλάιντ και αρνητικά φιλμ {ΠΕΡΙΟΡΙΣΜΟΙ ΤΟΥ FOTOCX} - όρια μεγέθους και απόδοσης {FOTOCX ΓΙΑ WINDOWS 11} - εγκατάσταση του Fotocx σε Windows 11 WSL {ΑΠΟΡΡΗΤΟ} - πολιτική ιδιωτικότητας και προστασίας δεδομένων του Fotocx {PROBLEM, QUESTION, SUGGESTION} - επικοινωνία με τον δημιουργό του Fotocx - - TOPIC: ΧΡΗΣΗ ΤΟΥ FOTOCX - - TOPIC: ΠΡΩΤΗ ΕΚΚΙΝΗΣΗ - ^Εξωτερικά Προγράμματα Το Fotocx αναφέρει τα απαιτούμενα και προαιρετικά εξωτερικά προγράμματα και τη λειτουργία που παρέχει το καθένα. Εάν λείπουν κάποια απαιτούμενα προγράμματα, εγκαταστήστε τα και ξεκινήστε ξανά το Fotocx. - ^Πρώτη Ευρετηρίαση Το Fotocx θα ευρετηριάσει τα αρχεία εικόνας σας. Αυτό κάνει τις σελίδες γκαλερί (thumbnails) να εμφανίζονται γρήγορα, επιτρέπει τη γρήγορη αναζήτηση με βάση τα ευρετηριασμένα metadata, και επιτρέπει τη χρήση κάνοντας κλικ σε δείκτες χάρτη για προβολή εικόνων ανά τοποθεσία. Πρέπει να εισαγάγετε έναν ή περισσότερους 'κύριους' φακέλους εικόνων (π.χ. /home//Pictures). Οι υποφάκελοι συμπεριλαμβάνονται αυτόματα. Τα αρχεία που δεν είναι εικόνες σε αυτούς τους φακέλους αγνοούνται. Χρησιμοποιήστε το κουμπί [select] για να εντοπίσετε και να προσθέσετε τους κύριους φακέλους εικόνων σας. Ένα πρακτικό όριο είναι περίπου 30 κύριοι φάκελοι. Ο καθένας μπορεί να έχει εκατοντάδες υποφακέλους. - ^Thumbnails Αυτός είναι ο φάκελος όπου θα τοποθετούνται τα αρχεία thumbnail. Χρησιμοποιήστε την προεπιλογή που παρέχεται ή επιλέξτε άλλη τοποθεσία. - ^Χρόνος Ευρετηρίασης Η ταχύτητα ευρετηρίασης μπορεί να κυμαίνεται από μερικές εκατοντάδες έως >10K αρχεία/λεπτό, ανάλογα με τον τύπο και το μέγεθος των αρχείων εικόνας σας και την ταχύτητα του υπολογιστή σας. Όταν προσθέτετε νέα αρχεία εικόνας στη συλλογή σας, η επόμενη εκκίνηση του Fotocx θα ευρετηριάσει τα νέα αρχεία. Εάν υπάρχουν πολλά νέα αρχεία, η εκκίνηση θα χρειαστεί χρόνο για να τα ευρετηριάσει. - ^Ενοποίηση τίτλου και περιγραφής εικόνας Η λειτουργία ευρετηρίασης εικόνων του Fotocx αντικαθιστά τα metadata τίτλου και περιγραφής που λείπουν με ένα από τα πολλά εναλλακτικά tags metadata, εφόσον είναι διαθέσιμα: headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. Αυτό γίνεται ώστε να μπορείτε πάντα να προβάλλετε/επεξεργάζεστε/αναζητάτε χρησιμοποιώντας μόνο τα 'title' και 'description'. Αυτή η διαδικασία μετατροπής είναι σχετικά αργή (2200 αρχεία/λεπτό στον ισχυρό υπολογιστή μου). Αυτό γίνεται όταν νέα αρχεία εικόνας ευρετηριάζονται για πρώτη φορά. Τίποτα δεν διαγράφεται. - - TOPIC: ΟΔΗΓΟΣ ΧΡΗΣΗΣ Ανοίξτε τον οδηγό χρήσης από το μενού Βοήθεια > Οδηγός Χρήσης. Ενώ χρησιμοποιείτε το Fotocx, μπορείτε να πατήσετε F1 για να δείτε το θέμα του Οδηγού Χρήσης για την τρέχουσα ή την πιο πρόσφατη λειτουργία μενού. - Για κύλιση του κειμένου, χρησιμοποιήστε τα πλήκτρα βέλος πάνω/κάτω και page-up/down. Το κουμπί [Εύρεση] ανοίγει έναν διάλογο για αναζήτηση κειμένου. Πατήστε [Εύρεση] ξανά για την επόμενη εμφάνιση. - Το έντονο κεφαλαίο κείμενο είναι σύνδεσμος με δυνατότητα κλικ προς ένα θέμα, π.χ. {ΕΥΡΕΤΗΡΙΑΣΗ ΑΡΧΕΙΩΝ}. Χρησιμοποιήστε τα κουμπιά [<] και [>] για μετάβαση εμπρός και πίσω μεταξύ των πρόσφατα προβεβλημένων θεμάτων. Το κουμπί [Recent] εμφανίζει μια λίστα με δυνατότητα κλικ των πρόσφατα προβεβλημένων θεμάτων. - - TOPIC: ΠΡΟΒΟΛΕΣ ΚΑΙ ΜΕΝΟΥ ΠΑΡΑΘΥΡΟΥ +image: fotocx-views.jpg - ^Κουμπιά Μενού Όταν γίνεται κλικ σε ένα μενού, εμφανίζεται ένα αναδυόμενο υπο-μενού. Τα τρία πρώτα μενού (Αρχείο, Γκαλερί, Χάρτες) ορίζουν την αντίστοιχη λειτουργία προβολής. Μπορούν επίσης να χρησιμοποιηθούν τα πλήκτρα F/G/M. - - TOPIC: ΠΡΟΒΟΛΗ ΑΡΧΕΙΟΥ Μία εικόνα γεμίζει ολόκληρο το παράθυρο του Fotocx. Κάντε zoom μεγέθυνση/σμίκρυνση με αριστερό/δεξί κλικ ποντικιού. Το πλήκτρο Z εναλλάσσει μεταξύ προσαρμογής στο παράθυρο και μεγέθους 1x (1 pixel εικόνας = 1 pixel οθόνης). Για κύλιση μιας μεγεθυμένης εικόνας, σύρετε με το αριστερό κουμπί του ποντικιού πάνω στην εικόνα. Το ροδάκι του ποντικιού μπορεί επίσης να κάνει zoom μεγέθυνση ή σμίκρυνση μιας εικόνας. Χρησιμοποιήστε τα κουμπιά μενού (Επεξεργασία, Επιδιόρθωση, κ.λπ.) για να τροποποιήσετε την εικόνα. Χρησιμοποιήστε το κουμπί Αποθήκευση Αρχείου για να αποθηκεύσετε ένα τροποποιημένο αρχείο: αντικατάσταση, δημιουργία νέας έκδοσης, ή δημιουργία νέου αρχείου (νέο όνομα). - ^Πλήκτρα βέλος αριστερά/δεξιά του πληκτρολογίου Προβολή του προηγούμενου ή του επόμενου αρχείου εικόνας στην τρέχουσα γκαλερί. - ^πλήκτρα βέλος πάνω/κάτω Όπως παραπάνω, αλλά εμφανίζονται μόνο οι τελευταίες εκδόσεις, ή το πρωτότυπο εάν δεν υπάρχουν εκδόσεις. - - TOPIC: ΠΡΟΒΟΛΗ ΓΚΑΛΕΡΙ Όλα τα αρχεία εικόνας στην τρέχουσα γκαλερί εμφανίζονται ως πίνακας thumbnails. - ^Τύποι Γκαλερί • Φάκελος: όλα τα αρχεία εικόνας και οι υποφάκελοι σε έναν μόνο φάκελο (κατάλογο) • Άλμπουμ: αρχεία εικόνας από διάφορους φακέλους, διευθετημένα από τον χρήστη • Πρόσφατα Αρχεία: τα πιο πρόσφατα προβεβλημένα ή επεξεργασμένα αρχεία εικόνας • Νεότερα Αρχεία: αρχεία εικόνας που προστέθηκαν ή τροποποιήθηκαν πιο πρόσφατα • Αποτελέσματα Αναζήτησης: εικόνες που βρέθηκαν από τη λειτουργία Αναζήτησης. Επίσης άλμπουμ. - ^Λειτουργίες Γκαλερί • αριστερό κλικ σε thumbnail εικόνας: άνοιγμα εικόνας σε λειτουργία Προβολής Αρχείου • δεξί κλικ σε thumbnail εικόνας: αναδυόμενο μενού συνηθισμένων λειτουργιών • κλικ σε thumbnail φακέλου: άνοιγμα αυτού του φακέλου σε λειτουργία Γκαλερί • γραμμή TOP της γκαλερί φακέλου: γονικοί φάκελοι - κλικ για μετάβαση εκεί • κουμπί [TOP]: λίστα φακέλων ανώτατου επιπέδου - κλικ για μετάβαση εκεί • μπάρες κύλισης: κύλιση πάνω/κάτω εντός της γκαλερί • πλήκτρα βέλος πάνω/κάτω: κύλιση της γκαλερί κατά μία σειρά • πλήκτρα page up/down: κύλιση της γκαλερί κατά μία σελίδα • πλήκτρα home/end: μετάβαση στην αρχή (πάνω) και στο τέλος (κάτω) της γκαλερί • ροδάκι ποντικιού: κύλιση της γκαλερί πάνω και κάτω • πλήκτρα [+] και [-]: αύξηση/μείωση μεγέθους thumbnail - ^Αναδυόμενες Εικόνες Γκαλερί • Κάντε κλικ σε thumbnail με το μεσαίο κουμπί του ποντικιού για αναδυόμενη εικόνα • Κάντε κλικ σε thumbnail με shift + αριστερό κουμπί ποντικιού για αναδυόμενη εικόνα • Αριστερό κλικ στην αναδυόμενη εικόνα: zoom μεγέθυνση της εικόνας • Δεξί κλικ στην αναδυόμενη εικόνα: κλείσιμο της αναδυόμενης εικόνας • Ροδάκι κύλισης ποντικιού: zoom μεγέθυνση ή σμίκρυνση της αναδυόμενης εικόνας • Πλήκτρο F11: προβολή της αναδυόμενης εικόνας σε πλήρη οθόνη • Πλήκτρο Escape: κλείσιμο της αναδυόμενης εικόνας • Μπορούν να χρησιμοποιηθούν πολλαπλά αναδυόμενα παράθυρα για σύγκριση εικόνων - - TOPIC: ΠΡΟΒΟΛΗ ΧΑΡΤΗ Προβάλετε χάρτες που περιέχουν δείκτες αντιστοιχισμένους στις τοποθεσίες των εικόνων. Κάντε κλικ σε έναν δείκτη για γκαλερί των αντίστοιχων εικόνων. Αυτό εξαρτάται από το εάν τα αρχεία εικόνας σας έχουν ενσωματωμένες γεωσυντεταγμένες (latitude, longitude). Οι σύγχρονες κάμερες τις εισάγουν αυτόματα, αλλά μπορείτε επίσης να προσθέσετε αυτά τα δεδομένα εσείς οι ίδιοι. Αρχικά εμφανίζεται ένας παγκόσμιος χάρτης. Χρησιμοποιήστε το ροδάκι του ποντικιού για zoom μεγέθυνση/σμίκρυνση σε οποιαδήποτε τοποθεσία. Σύρετε για μετατόπιση του κέντρου του χάρτη. Ολόκληρος ο κόσμος μπορεί να προβληθεί σε οποιαδήποτε κλίμακα, μέχρι το επίπεδο του δρόμου. - - TOPIC: ΜΕΤΑΦΟΡΑ ΚΑΙ ΑΠΟΘΕΣΗ Εάν ανοίξετε δύο συνεδρίες Fotocx, μπορείτε να μεταφέρετε και να αποθέσετε αρχεία από τη μία στην άλλη. Σύρετε ένα thumbnail γκαλερί από το ένα παράθυρο στο άλλο. Εάν πρόκειται για Προβολή Αρχείου, το αρχείο ανοίγει. Εάν πρόκειται για Προβολή Γκαλερί, το αποτέλεσμα εξαρτάται από τον τύπο της γκαλερί. Εάν η γκαλερί είναι φάκελος, το αρχείο προστίθεται στον φάκελο και η γκαλερί θα εμφανίσει το νέο αρχείο στην ταξινομημένη του θέση. Εάν η γκαλερί είναι άλμπουμ, το αρχείο προστίθεται στο άλμπουμ στη θέση όπου αποτίθεται. - - TOPIC: ΕΠΕΞΕΡΓΑΣΙΑ ΔΙΑΔΙΚΑΣΙΩΝ Η εικόνα σε λειτουργία Προβολής Αρχείου (η τρέχουσα εικόνα) μπορεί να τροποποιηθεί με τις λειτουργίες επεξεργασίας στα μενού Επεξεργασία, Επιδιόρθωση, Βελτίωση, Εφέ, Παραμόρφωση και Συνδυασμός. Αυτές οι λειτουργίες τροποποιούν την τρέχουσα εικόνα στη μνήμη και στο παράθυρο. Καθώς χρησιμοποιείτε αυτές τις λειτουργίες, οι επεξεργασίες συσσωρεύονται. Όταν τελειώσετε την επεξεργασία, χρησιμοποιήστε το κουμπί μενού [Αποθήκευση] για να αποθηκεύσετε την τροποποιημένη εικόνα πίσω στο ίδιο αρχείο, σε μια νέα έκδοση (π.χ. filename.v01.jpg), ή σε νέο αρχείο ή/και φάκελο. Οι διάλογοι επεξεργασίας εικόνας διαθέτουν sliders, κουμπιά, spin buttons, ή επεξεργάσιμες καμπύλες που ενημερώνουν άμεσα την εικόνα. - Κάντε αριστερό ή δεξί κλικ στο κουμπί Αναίρεσης/Επανάληψης για αναίρεση ή επανάληψη της τρέχουσας ενεργής λειτουργίας επεξεργασίας. Αφού μια εικόνα έχει υποστεί μία ή περισσότερες επεξεργασίες, το κουμπί αναίρεσης/επανάληψης μπορεί να χρησιμοποιηθεί για μετάβαση εμπρός και πίσω μέσα από όλα τα ολοκληρωμένα βήματα, ώστε να δείτε την κατάσταση της εικόνας μετά από κάθε βήμα. Το μεσαίο κουμπί του ποντικιού εμφανίζει μια αναδυόμενη λίστα με όλες τις επεξεργασίες που έγιναν στην τρέχουσα εικόνα, και μπορείτε να επιλέξετε οποιοδήποτε βήμα για επιστροφή σε αυτό. Η εικόνα μπορεί να επανεπεξεργαστεί από οποιοδήποτε προηγούμενο βήμα. Αυτό θα απορρίψει τις επεξεργασίες που έγιναν μετά από αυτό το βήμα, καθώς προέκυψαν από αυτό. Αυτή η δυνατότητα αναίρεσης/επανάληψης παραμένει όσο η επεξεργασμένη εικόνα παραμένει η τρέχουσα εικόνα. Εάν ανοιχτεί άλλη εικόνα, το ιστορικό επεξεργασίας απορρίπτεται. Εάν θέλετε να διατηρήσετε τη δυνατότητα επιστροφής στην τρέχουσα κατάσταση της εικόνας, τότε αποθηκεύστε την εικόνα ως νέα έκδοση πριν συνεχίσετε με άλλη επεξεργασία. - - TOPIC: ΕΠΕΞΕΡΓΑΣΙΑ ΡΟΗΣ ΕΡΓΑΣΙΑΣ - ^Απλή Ροή Εργασίας Τις περισσότερες φορές μπορείτε απλά να επεξεργαστείτε το αρχείο JPEG που βγαίνει από την κάμερα. Χρησιμοποιήστε την ακόλουθη πιο σύνθετη διαδικασία μόνο εάν παρατηρήσετε ζώνες χρώματος μετά από επεξεργασίες που έχουν επεκτείνει το εύρος φωτεινότητας σε ορισμένες περιοχές της εικόνας, κάνοντας τα βήματα φωτεινότητας αρκετά μεγάλα ώστε να είναι ορατά. - ^Σύνθετη Ροή Εργασίας Για επεξεργασία με βαθύ χρώμα (πάνω από 8 bit ανά χρώμα RGB), ξεκινήστε με το αρχείο RAW της κάμερας. Ένα αρχείο RAW μπορεί να επεξεργαστεί όπως κάθε άλλο αρχείο εικόνας. Οι λειτουργίες επεξεργασίας του Fotocx λειτουργούν με 24 bit ανά χρώμα, οπότε διατηρείται το πλήρες βάθος χρώματος του αρχείου RAW. Όταν ανοίγετε ένα αρχείο RAW, χρησιμοποιείται ο επιλεγμένος φορτωτής RAW - δείτε {ΡΥΘΜΙΣΕΙΣ}. Μπορείτε επίσης να χρησιμοποιήσετε την Ομαδική Μετατροπή για να μετατρέψετε πολλαπλά αρχεία RAW σε αρχεία TIFF, PNG, ή JXL με 16 bit ανά χρώμα. - Το Dcraw είναι ο προεπιλεγμένος φορτωτής αρχείων RAW. Μπορείτε επίσης να χρησιμοποιήσετε έναν πιο σύνθετο επεξεργαστή RAW όπως το Rawtherapee - δείτε {ΡΥΘΜΙΣΕΙΣ}. Το Dcraw είναι απλό και γρήγορο σε σύγκριση. Οι λειτουργίες επεξεργασίας σε έναν επεξεργαστή RAW μπορούν συνήθως να γίνουν πιο εύκολα με το Fotocx. - - TOPIC: ΚΥΡΙΟΤΗΤΑ ΠΟΝΤΙΚΙΟΥ Ορισμένοι διάλογοι επεξεργασίας χρησιμοποιούν το ποντίκι για αναφορά ή τροποποίηση της εικόνας στο κύριο παράθυρο. Μπορεί να υπάρχει περισσότερος από ένας τέτοιος ενεργός διάλογος ταυτόχρονα. Το ποντίκι χρησιμοποιείται επίσης για zoom και κύλιση της εικόνας, και μπορεί να χρειαστεί να το κάνετε αυτό ενώ χρησιμοποιείτε έναν διάλογο επεξεργασίας. Επομένως είναι σημαντικό να καταλάβετε ποιος διάλογος ή παράθυρο έχει την κυριότητα του ποντικιού, και πώς να αλλάξετε αυτή την κυριότητα: • Εάν ένας διάλογος έχει εστίαση πληκτρολογίου, οι ενέργειες του ποντικιού πάνω στην εικόνα αποτελούν είσοδο για αυτόν τον διάλογο και δεν κάνουν zoom ή κύλιση της εικόνας. • Εάν κρατήσετε πατημένο το πλήκτρο CTRL ενώ κάνετε κλικ ή σύρετε το ποντίκι πάνω στην εικόνα, η εικόνα θα κάνει zoom ή pan/κύλιση. Οι ανοιχτοί διάλογοι δεν επηρεάζονται. • Το ροδάκι του ποντικιού μπορεί να κάνει zoom μεγέθυνση/σμίκρυνση σε οποιαδήποτε θέση της εικόνας. - - TOPIC: ALT + ΔΕΞΙ ΚΟΥΜΠΙ ΠΟΝΤΙΚΙΟΥ Για touchpad ή touchscreen, τα δεξιά κλικ ποντικιού μπορεί να είναι δύσχρηστα. Εάν το πλήκτρο ALT κρατηθεί πατημένο ενώ πατάτε το αριστερό κουμπί του ποντικιού, αυτό ερμηνεύεται ως το δεξί κουμπί του ποντικιού. - - TOPIC: ΚΟΥΜΠΙΑ ΠΑΡΑΘΥΡΟΥ ΔΙΑΛΟΓΟΥ Αυτά λειτουργούν ως επί το πλείστον ως εξής: • [Επαναφορά] - αναίρεση τρέχουσας επεξεργασίας, επαναφορά της εικόνας στην αρχική κατάσταση • [Εφαρμογή] - εφαρμογή των ρυθμίσεων του διαλόγου στην εικόνα, ο διάλογος παραμένει ενεργός • [OK] - το ίδιο με το [Εφαρμογή], αλλά ο διάλογος κλείνει • [Ακύρωση] - απόρριψη των αλλαγών της εικόνας και κλείσιμο του διαλόγου • [Συνέχεια] - συνέχιση μιας χρονοβόρας εργασίας με βάση τις εισόδους του διαλόγου • [X] - κλείσιμο του διαλόγου χωρίς καμία ενέργεια - - TOPIC: ΠΛΗΚΤΡΟ ESCAPE Το κύριο παράθυρο έχει εστίαση: • εάν μια χρονοβόρα λειτουργία εξακολουθεί να εκτελείται, τερματίστε την • εάν το κύριο παράθυρο είναι μεγιστοποιημένο, επαναφορά στο προηγούμενο μέγεθος • εάν η τρέχουσα προβολή είναι γκαλερί ή χάρτης, αλλαγή σε προβολή αρχείου • κανένα από τα παραπάνω: έξοδος από το Fotocx Το παράθυρο διαλόγου έχει εστίαση: τερματισμός του διαλόγου (ίδιο με το κουμπί [X]) Άλλα: ακύρωση αναδυόμενης εικόνας, έξοδος από τον προβολέα πανοράματος 360, παύση ή έξοδος από την Προβολή Σλάιντ. - - TOPIC: ΜΗ ΤΥΠΙΚΑ ΣΤΟΙΧΕΙΑ ΠΑΡΑΘΥΡΟΥ ΔΙΑΛΟΓΟΥ +image: custom-widgets.png - Ορισμένα μη τυπικά widgets χρησιμοποιούνται για τη μείωση του μεγέθους του διαλόγου ή τη βελτίωση της ευκολίας χρήσης. Λειτουργούν σχεδόν όπως τα τυπικά widgets του GTK. Το widget αριθμητικών δεδομένων λειτουργεί όπως ένα spin-button του GTK: το ροδάκι του ποντικιού και τα πλήκτρα βέλος πάνω/κάτω του πληκτρολογίου μπορούν να χρησιμοποιηθούν για γρήγορη αύξηση ή μείωση της τιμής. Εάν χρησιμοποιείτε touchpad, πατήστε ελαφρά στο πεδίο εισαγωγής για να τοποθετήσετε τον δρομέα, στη συνέχεια χρησιμοποιήστε το πληκτρολόγιο για εισαγωγή τιμής, ή χρησιμοποιήστε τα πλήκτρα βέλος πάνω/κάτω για γρήγορη μετάβαση σε νέα τιμή. Εάν το πλήκτρο κρατηθεί πατημένο, ο ρυθμός αλλαγής επιταχύνεται με τον χρόνο. Το πλήκτρο shift μπορεί να χρησιμοποιηθεί για αύξηση του ρυθμού κατά 10x. Ένας μη γραμμικός slider επεκτείνει την κλίμακα γύρω από την ουδέτερη τιμή, ώστε οι μικρές αλλαγές να μπορούν να ελεγχθούν πιο ακριβώς, ειδικά με touchpad. Μερικά τυπικά widgets του GTK έχουν μειωθεί σε μέγεθος αφαιρώντας την περιττή επένδυση (padding). Αυτό ελέγχεται από το αρχείο 'widgets.css' στον αρχικό φάκελο του Fotocx. Μπορείτε να τροποποιήσετε αυτό το αρχείο εάν το επιθυμείτε. Μπορείτε να διαγράψετε στοιχεία ή να τα επισημάνετε ως σχόλια, αλλά μην διαγράψετε το αρχείο - θα αντικατασταθεί αυτόματα. - - TOPIC: ΕΠΕΞΕΡΓΑΣΙΑ ΚΑΜΠΥΛΗΣ +image: retouch.png - Ορισμένες λειτουργίες επεξεργασίας εικόνας χρησιμοποιούν επεξεργάσιμες καμπύλες. Μπορείτε να χειριστείτε τις καμπύλες για να αλλάξετε κάποια ιδιότητα της εικόνας ανάλογα με κάποια άλλη ιδιότητα. Οι καμπύλες μπορούν να μετακινηθούν (τραβηχτούν) με το ποντίκι. Ένα σημείο αγκύρωσης (μαύρη κουκκίδα) προστίθεται στην καμπύλη όπου και αν τραβηχτεί, και αυτό το σημείο παραμένει σταθερό - η καμπύλη θα συνεχίσει να περνά από αυτό το σημείο καθώς τραβιούνται άλλα μέρη της καμπύλης. Ένα σημείο αγκύρωσης μπορεί να μετακινηθεί με σύρσιμο, ή να διαγραφεί με δεξί κλικ. - - TOPIC: MOUSE PAINTING Το ποντίκι μπορεί να χρησιμοποιηθεί για τοπική επεξεργασία μιας εικόνας. Ένας κύκλος γύρω από τη θέση του ποντικιού περικλείει μια περιοχή της εικόνας που τροποποιείται καθώς το ποντίκι σύρεται με το αριστερό κουμπί πάνω στην εικόνα. Η πηγή της τροποποίησης μπορεί να είναι μια λειτουργία επεξεργασίας, ένα επιλεγμένο χρώμα, ή pixel από αλλού στην ίδια εικόνα ή από άλλη εικόνα. Τα pixel της εικόνας μέσα στον κύκλο του ποντικιού τροποποιούνται ώστε να ταιριάζουν με την πηγή. Ο ρυθμός αλλαγής μπορεί να είναι γρήγορος ή σταδιακός, ανάλογα με τους συντελεστές ισχύος για το κέντρο και την άκρη του ποντικιού. Εάν ο συντελεστής κέντρου είναι υψηλός και ο συντελεστής άκρης χαμηλός, η εικόνα τροποποιείται πιο γρήγορα στο κέντρο του ποντικιού και σταδιακά λιγότερο προς την άκρη. Σύρετε το ποντίκι επανειλημμένα με το αριστερό κουμπί πάνω από την ίδια περιοχή της εικόνας για να συσσωρευτούν οι αλλαγές, μέχρι τα pixel να ταιριάξουν πλήρως με το χρώμα ή την εικόνα πηγή, ή η λειτουργία επεξεργασίας πηγής να εφαρμοστεί πλήρως. Σύρετε με το δεξί κουμπί για σταδιακή αναίρεση των αλλαγών, επαναφέροντας την αρχική εικόνα. - Παράδειγμα: εάν η λειτουργία επεξεργασίας είναι το Ρετούς, και η φωτεινότητα αυξάνεται, τότε η εικόνα θα φωτίζεται εντός της περιοχής του ποντικιού καθώς αυτό σύρεται με το αριστερό κουμπί. Χρησιμοποιήστε σύρσιμο με το δεξί κουμπί για σταδιακή επαναφορά της αρχικής εικόνας. - Το κουμπί [undo-last] αναιρεί την τελευταία ενέργεια ζωγραφικής ή διαγραφής, και αυτό μπορεί να επαναληφθεί για την αφαίρεση πολλών πρόσφατων επεξεργασιών. Κάθε νέα ενέργεια συρσίματος του ποντικιού είναι μια μονάδα εργασίας που μπορεί να αναιρεθεί ξεχωριστά. Η μνήμη για αναίρεση είναι περιορισμένη, οπότε διατηρούνται μόνο τα πρόσφατα βήματα ζωγραφικής και διαγραφής. Το [undo all] θα επαναφέρει την εικόνα στην αρχική της κατάσταση. - Χρησιμοποιήστε το κουμπί [undo/redo] για να ελέγξετε τις αλλαγές κατά τη διάρκεια των επεξεργασιών. - Εάν είναι ενεργή μια {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ}, η ζωγραφική περιορίζεται εντός της περιοχής. - ΣΗΜΕΙΩΣΗ: Κάντε zoom στην εικόνα στο 100% ή περισσότερο όταν χρησιμοποιείτε πολύ μικρή ακτίνα (π.χ. όταν σχεδιάζετε γραμμές πάνω στην εικόνα). Τα βήματα κίνησης του ποντικιού είναι σε pixel οθόνης. Εάν αυτό καλύπτει πολλά pixel της εικόνας και χρησιμοποιείται μικρή ακτίνα, ορισμένα pixel μπορεί να παραλειφθούν από το ποντίκι και να μην υποστούν επεξεργασία. - - TOPIC: ΜΑΖΙΚΗ ΕΠΕΞΕΡΓΑΣΙΑ Υπάρχουν διάφορες λειτουργίες ομαδικής επεξεργασίας στο {ΜΕΝΟΥ ΜΑΖΙΚΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ} για την επιτάχυνση ορισμένων συνηθισμένων εργασιών. Μπορείτε να επιλέξετε πολλά αρχεία εικόνας και να εκτελέσετε τη λειτουργία ομαδικής επεξεργασίας για όλα αυτά. Οι λειτουργίες ομαδικής επεξεργασίας μπορούν να χρησιμοποιηθούν για αλλαγή ονόματος ή τύπου αρχείου, ανόρθωση, αλλαγή κλίμακας, αντιγραφή ή μετακίνηση, διαγραφή, αναθεώρηση tags, keywords, τοποθεσίας/γεωσυντεταγμένων, ημερομηνιών φωτογραφιών. - - TOPIC: ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ +image: select-image-files.jpg - Αυτή η διαδικασία χρησιμοποιείται για όλες τις λειτουργίες που λειτουργούν σε πολλαπλά αρχεία εικόνας. Η διαδικασία εξηγείται εδώ, και αυτό το θέμα συνδέεται από κάθε λειτουργία που χρησιμοποιεί τη διαδικασία. • αριστερό κλικ σε thumbnail: προσθήκη στη λίστα επιλογής • δεξί κλικ: αφαίρεση • προσθήκη πολλαπλών: κλικ στο πρώτο thumbnail, shift-κλικ στο τελευταίο • κουμπί [Προσθήκη Όλων]: προσθήκη ολόκληρης της γκαλερί • κουμπί [Προσθήκη Τρέχοντος]: προσθήκη του τρέχοντος αρχείου • ένα αρχείο μπορεί να προστεθεί πολλές φορές στη λίστα • πλοηγηθείτε σε άλλες γκαλερί για να επιλέξετε περισσότερα αρχεία όπως χρειάζεται • κουμπί [Αφαίρεση]: αφαίρεση επιλεγμένης θέσης της λίστας • κουμπί [Εκκαθάριση]: εκκαθάριση ολόκληρης της λίστας • πλήκτρα βέλος πάνω/κάτω: μετάβαση μέσα στη λίστα, προβολή thumbnails • πλήκτρα home/end: μετάβαση στην αρχή/τέλος της λίστας - Το κουμπί [Απενεργοποίηση] θα απενεργοποιήσει το κλικ σε thumbnail για επιλογή αρχείων. Το κουμπί μετονομάζεται τότε σε [Ενεργοποίηση] - πατήστε το για να επαναφέρετε το κλικ σε thumbnail. Ο σκοπός αυτού είναι να ενεργοποιηθούν τα κανονικά αναδυόμενα μενού thumbnail και το αριστερό κλικ για προβολή ενός αρχείου σε πλήρες μέγεθος, κάτι που δεν είναι δυνατό εάν τα κλικ σε thumbnails χρησιμοποιούνται για επιλογή αρχείων. Μπορεί να το χρειαστείτε αυτό για να αποφασίσετε τις επιλογές σας. Μπορείτε επίσης να παραμείνετε σε λειτουργία προβολής αρχείου και να μεταβαίνετε μεταξύ εικόνων χρησιμοποιώντας τα πλήκτρα βέλους, ενώ χρησιμοποιείτε το κουμπί [Προσθήκη Τρέχοντος] για να προσθέτετε αρχεία στη λίστα επιλογής. - - TOPIC: ΣΥΝΤΟΜΕΥΣΕΙΣ Υπάρχουν τρεις μέθοδοι συντόμευσης για συχνά χρησιμοποιούμενες λειτουργίες: • Δεξί κλικ στο κύριο παράθυρο ή σε thumbnail γκαλερί. Ένα αναδυόμενο μενού εμφανίζει ορισμένες συνήθως χρησιμοποιούμενες λειτουργίες. • Μπορείτε να αλλάξετε τα πλήκτρα συντόμευσης και να προσθέσετε νέες συντομεύσεις. Δείτε {ΣΥΝΤΟΜΕΥΣΕΙΣ ΠΛΗΚΤΡΟΛΟΓΙΟΥ}. • Συγκεντρώστε συχνά χρησιμοποιούμενες λειτουργίες σε ένα προσαρμοσμένο μενού. Δείτε {ΠΡΟΣΑΡΜΟΣΜΕΝΟ ΜΕΝΟΥ}. - Οι συντομεύσεις πληκτρολογίου είναι διαθέσιμες για τις πιο συνηθισμένες λειτουργίες. Χρησιμοποιήστε το μενού Εργαλεία > Συντομεύσεις Πληκτρολογίου για να τις δείτε ή να τις αλλάξετε. - Οι ακόλουθες συντομεύσεις πληκτρολογίου είναι σταθερές και δεν μπορούν να αλλαχθούν: • Πλήκτρο [+] [=]: Zoom μεγέθυνση εικόνας ή thumbnails • Πλήκτρο [-]: Zoom σμίκρυνση εικόνας ή thumbnails • Πλήκτρο Z: Εναλλαγή zoom: 1x <--> προσαρμογή στο παράθυρο • Πλήκτρο F1: Εμφάνιση οδηγού χρήσης για την τρέχουσα λειτουργία • Πλήκτρο F10: Εναλλαγή του κύριου παραθύρου σε πλήρη οθόνη και πίσω • Πλήκτρο F11: Όπως το F10, χωρίς μενού, γραμμή τίτλου, επάνω πίνακα • Πλήκτρο Escape: Τερματισμός εκτελούμενης λειτουργίας, Έξοδος από ενεργό διάλογο • Πλήκτρο Delete: Διάλογος για διαγραφή ή μετακίνηση στα απορρίμματα του τρέχοντος αρχείου • Βέλος Αριστερά/Δεξιά: Εμφάνιση προηγούμενης/επόμενης εικόνας στη γκαλερί • Βέλος Πάνω/Κάτω: Το ίδιο, αλλά εμφάνιση μόνο των τελευταίων εκδόσεων • Page Up/Down: Προβολή Γκαλερί: κύλιση μιας σελίδας πάνω/κάτω • Home/End: Προβολή Γκαλερί: μετάβαση στην πρώτη/τελευταία σελίδα της γκαλερί - Οι ακόλουθες συντομεύσεις πληκτρολογίου είναι προεπιλογές που μπορούν να αλλαχθούν από τον χρήστη: • F: Προβολή Αρχείου - αλλαγή σε λειτουργία προβολής αρχείου • G: Προβολή Γκαλερί - αλλαγή σε λειτουργία προβολής γκαλερί • M: Προβολή Χάρτη - αλλαγή σε λειτουργία προβολής χάρτη • 2: Εναλλαγή 2 Αρχείων - εναλλάξ εμφάνιση των δύο πιο πρόσφατων αρχείων • 3: Εναλλαγή 3 Αρχείων - εναλλάξ εμφάνιση των τριών πιο πρόσφατων αρχείων • A: Τρέχον Άλμπουμ - εμφάνιση του πιο πρόσφατα προβεβλημένου άλμπουμ • T: Ρετούς - εκκίνηση της λειτουργίας επεξεργασίας Ρετούς • C: Περικοπή - εκκίνηση της λειτουργίας επεξεργασίας Περικοπή • K: Συντομεύσεις Πληκτρολογίου - εκκίνηση του διαλόγου συντομεύσεων πληκτρολογίου • P: Εκτύπωση Εικόνας - άνοιγμα του διαλόγου εκτύπωσης εικόνας • R: Περιστροφή - εκκίνηση της λειτουργίας επεξεργασίας Περιστροφή • U: Αναίρεση - αναίρεση της τρέχουσας επεξεργασίας ή της τελευταίας σε μια σειρά • Shift+U: Επανάληψη - επανάληψη της τρέχουσας επεξεργασίας ή της επόμενης σε μια σειρά • Ctrl+C: Αντιγραφή στο Πρόχειρο - αντιγραφή του τρέχοντος αρχείου στο πρόχειρο • Shift+C: Εναλλαγή Λεζαντών - εναλλάξ εμφάνιση / απόκρυψη λεζαντών • Ctrl+G: Εμφάνιση της γκαλερί φακέλου για το τρέχον αρχείο • Shift+G: Εναλλαγή Πλέγματος - ενεργοποίηση/απενεργοποίηση των γραμμών πλέγματος • Ctrl+S: Αποθήκευση - εκκίνηση του διαλόγου αποθήκευσης αρχείου - - TOPIC: ΛΕΙΤΟΥΡΓΙΕΣ ΠΟΝΤΙΚΙΟΥ - ^Προβολή Αρχείου • αριστερό κλικ - Zoom μεγέθυνση: μεγέθυνση εικόνας, με κέντρο στο ποντίκι • δεξί κλικ - Εάν η εικόνα είναι μεγεθυμένη: επαναφορά στο μέγεθος του παραθύρου Εάν όχι, αναδυόμενο μενού με συνηθισμένες λειτουργίες • ροδάκι ποντικιού - Zoom μεγέθυνση ή σμίκρυνση εικόνας • σύρσιμο εικόνας με αριστερό κουμπί - Κύλιση μεγεθυμένης εικόνας • Ctrl + ποντίκι - Το ποντίκι ενεργεί πάνω στην εικόνα, όχι στον ενεργό διάλογο - ^Προβολή Γκαλερί • αριστερό κλικ σε thumbnail - Αλλαγή σε Προβολή Αρχείου • δεξί κλικ σε thumbnail - Εμφάνιση αναδυόμενου μενού με συνηθισμένες λειτουργίες • μεσαίο κλικ σε thumbnail - Αναδυόμενη μεγάλη εικόνα, zoom με το ροδάκι του ποντικιού • ροδάκι ποντικιού - Κύλιση της σελίδας γκαλερί πάνω ή κάτω - ^Προβολή Χάρτη • σύρσιμο με αριστερό κουμπί - Μετακίνηση του χάρτη, ακολουθώντας το ποντίκι • ροδάκι ποντικιού - Zoom μεγέθυνση ή σμίκρυνση του χάρτη • αριστερό κλικ σε δείκτη - Εμφάνιση γκαλερί εικόνων στην τοποθεσία • εάν είναι ενεργός ο διάλογος επεξεργασίας metadata, ένα αριστερό κλικ ορίζει τις γεωσυντεταγμένες - - TOPIC: ΠΑΡΑΜΕΤΡΟΙ ΕΝΤΟΛΩΝ Αυτές οι παράμετροι μπορούν να χρησιμοποιηθούν εάν το Fotocx εκκινηθεί από ένα τερματικό. -help εμφάνιση οδηγού χρήσης -home /folder εναλλακτική τοποθεσία αρχικού φακέλου Fotocx (δείτε παρακάτω) -lang xx ορισμός γλώσσας από κωδικό 2 χαρακτήρων -recent εμφάνιση γκαλερί πρόσφατων αρχείων εικόνας -new εμφάνιση γκαλερί νεότερων αρχείων εικόνας -album albumname άλμπουμ (γκαλερί) προς άνοιγμα -prev εμφάνιση του τελευταίου αρχείου που προβλήθηκε στην προηγούμενη συνεδρία -blank εμφάνιση κενού παραθύρου -dev εμφάνιση του κανονικά κρυμμένου μενού προγραμματιστή -menu manuname το Fotocx θα ξεκινήσει με αυτό το μενού ενεργό -cwp nnn name εναλλαγή ταπετσαρίας (δείτε παρακάτω) -x0 -x1 -x2 ορισμός επιπέδου ευρετηρίασης σε 0, 1, ή 2 (δείτε παρακάτω) - ^-x0 -x1 -x2 παράμετρος^ (ορισμός επιπέδου ευρετηρίασης κατά την εκκίνηση) Αυτές οι παράμετροι μπορούν να χρησιμοποιηθούν για να παρακάμψουν την τιμή των {ΡΥΘΜΙΣΕΙΣ} -x0 πολύ γρήγορη εκκίνηση, χωρίς ευρετήριο εικόνων -x1 γρήγορη εκκίνηση, ευρετηρίαση μόνο παλιών αρχείων -x2 παλιά αρχεία + αναζήτηση για νέα/τροποποιημένα αρχεία - ^-home^ παράμετρος (εναλλακτικός αρχικός φάκελος Fotocx) Προεπιλεγμένος αρχικός φάκελος Fotocx: /home//.fotocx. Εδώ αποθηκεύονται οι ρυθμίσεις χρήστη και το ευρετήριο εικόνων. Η εντολή "$ fotocx -home " χρησιμοποιεί τον καθορισμένο φάκελο. Αυτό επιτρέπει τη διαχείριση πολλαπλών συλλογών εικόνων ξεχωριστά. Δείτε επίσης {ΜΕΤΑΚΙΝΗΣΗ ΚΥΡΙΟΥ ΦΑΚΕΛΟΥ FOTOCX}. - ^-cwp^ παράμετρος (εναλλαγή ταπετσαρίας επιφάνειας εργασίας) Η πλήρης γραμμή εντολής είναι: $ fotocx -cwp secs container Χρησιμοποιήστε αυτήν την εντολή για να εναλλάσσετε την εικόνα της επιφάνειας εργασίας από ένα επιλεγμένο σύνολο. Το 'secs' είναι το χρονικό διάστημα μεταξύ των εικόνων. Το 'container' είναι είτε ένα όνομα άλμπουμ Fotocx είτε ένας φάκελος που περιέχει αρχεία εικόνας. Προσθέστε αυτήν την εντολή στη λίστα εκκίνησης σύνδεσής σας για να λαμβάνετε νέα ταπετσαρία σε καθορισμένα διαστήματα. Χρησιμοποιήστε ένα διάστημα μιας ημέρας ή περισσότερο για να λαμβάνετε νέα εικόνα ταπετσαρίας με κάθε σύνδεση. Το Fotocx εκτελείται στο παρασκήνιο χωρίς γραφικό περιβάλλον (GUI). Εάν το 'secs' είναι μηδέν, θα γίνει μία ενημέρωση ταπετσαρίας και στη συνέχεια το Fotocx θα τερματιστεί. Κάθε παραλλαγή Linux έχει διαφορετική εντολή. Θεωρητικά, καλύπτονται τα εξής: Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: ΜΕΝΟΥ ΑΡΧΕΙΟΥ - - TOPIC: ΝΕΑ ΣΥΝΕΔΡΙΑ Ξεκινήστε μια νέα συνεδρία Fotocx σε νέο παράθυρο. Εάν ένα αρχείο εικόνας επεξεργαστεί και στα δύο παράθυρα, καμία από τις δύο περιπτώσεις δεν θα δει τις αλλαγές που έγιναν από την άλλη, και το τελικό αποτέλεσμα θα είναι το τελευταίο αρχείο που αποθηκεύτηκε. - - TOPIC: ΑΝΟΙΓΜΑ ΑΡΧΕΙΟΥ ΕΙΚΟΝΑΣ Επιλέξτε ένα αρχείο εικόνας για προβολή ή επεξεργασία, χρησιμοποιώντας έναν συμβατικό διάλογο ανοίγματος αρχείου με φακέλους και λίστες αρχείων. Αυτό είναι χρήσιμο για την περίπτωση όπου τα αρχεία δεν είναι ευρετηριασμένα και η εμφάνιση της γκαλερί είναι πολύ αργή, π.χ. ανάγνωση από κάρτα SD κάμερας που περιέχει χιλιάδες αρχεία εικόνας. - - TOPIC: ΕΝΑΛΛΑΓΗ 2 ΑΡΧΕΙΩΝ Η επανάληψη αυτού του μενού θα εναλλάσσει μεταξύ των δύο πιο πρόσφατα ανοιγμένων αρχείων. Αυτή η λειτουργία διατηρεί το τρέχον μέγεθος και τη θέση του zoom της εικόνας, κάτι που είναι ιδανικό για τη γρήγορη σύγκριση δύο επεξεργασμένων εκδόσεων του ίδιου αρχείου εικόνας. - - TOPIC: ΕΝΑΛΛΑΓΗ 3 ΑΡΧΕΙΩΝ Αυτό λειτουργεί με τον ίδιο τρόπο όπως η Εναλλαγή 2 Αρχείων, αλλά εναλλάσσει τα τελευταία 3 ανοιγμένα αρχεία. - - TOPIC: ΠΡΟΒΟΛΗ ΠΑΝΟΡΑΜΑΤΟΣ 360° Το τρέχον αρχείο ανοίγει με έναν ειδικό προβολέα για αρχεία πανοράματος 360°. Το πλάτος της εικόνας θεωρείται ότι είναι 360°. Χρησιμοποιήστε αυτήν τη λειτουργία για να προβάλετε εικόνες Google 'photosphere'. Μετακινήστε την εικόνα με σύρσιμο του ποντικιού ή με τα πλήκτρα βέλους αριστερά/δεξιά. Κάντε zoom με αριστερό/δεξί κλικ ποντικιού. Χρησιμοποιήστε το Escape για έξοδο από τον ειδικό προβολέα. - - TOPIC: ΜΕΤΟΝΟΜΑΣΙΑ Μετονομάστε το τρέχον αρχείο (Προβολή Αρχείου), ή το αρχείο ενός thumbnail στο οποίο κάνατε κλικ (Προβολή Γκαλερί). Εισαγάγετε ένα νέο όνομα και πατήστε [εφαρμογή]. Αυτή η λειτουργία μπορεί επίσης να αυτοματοποιήσει τη διαδικασία μετονομασίας μιας σειράς αρχείων εικόνας χρησιμοποιώντας ένα βασικό όνομα και έναν αριθμό ακολουθίας. Ανοίξτε το πρώτο αρχείο εικόνας της σειράς, εισαγάγετε ένα νέο όνομα, και πατήστε το κουμπί [εφαρμογή]. Χρησιμοποιήστε το κουμπί [next] για μετάβαση στο επόμενο αρχείο εάν το θέλετε. Μπορείτε να χρησιμοποιήσετε ξανά το ίδιο όνομα πατώντας το κουμπί [προηγούμενο όνομα] και στη συνέχεια να προσθέσετε ένα επίθημα ή αριθμό ακολουθίας. Πατήστε το κουμπί [add 1] για να αυξήσετε τον αριθμό ακολουθίας. - - TOPIC: ΚΕΝΗ ΕΙΚΟΝΑ Δημιουργήστε μια κενή εικόνα με καθορισμένες διαστάσεις σε pixel και χρώμα. Αυτό μπορεί να χρησιμοποιηθεί ως φόντο για αποκόμματα που λαμβάνονται από άλλες εικόνες (μέσω {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ}) και κείμενο σημειώσεων (μέσω {ΣΗΜΑΝΣΗ} σχεδίαση κειμένου). - - TOPIC: ΑΝΤΙΓΡΑΦΗ/ΜΕΤΑΚΙΝΗΣΗ Το τρέχον αρχείο (Προβολή Αρχείου) ή το αρχείο ενός thumbnail στο οποίο κάνατε κλικ (Προβολή Γκαλερί) αντιγράφεται στη δεδομένη τοποθεσία. Επιλέξτε την επιλογή αντιγραφής για να αντιγράψετε το αρχείο και να αφήσετε το αρχείο πηγής στη θέση του, δημιουργώντας ένα αντίγραφο. Επιλέξτε την επιλογή μετακίνησης για να μετακινήσετε το αρχείο από την αρχική τοποθεσία στη νέα τοποθεσία. Μια ομάδα αρχείων μπορεί να επεξεργαστεί γρήγορα κάνοντας κλικ σε κάθε thumbnail ακολουθούμενο από [εφαρμογή]. Το κουμπί [Προηγ.] μπορεί να χρησιμοποιηθεί για την αντιγραφή του προηγουμένως χρησιμοποιημένου ονόματος αρχείου. Προσθέστε έναν αριθμό έκδοσης ή κάτι άλλο για να αποφύγετε ένα διπλότυπο αρχείο. - - TOPIC: ΑΝΤΙΓΡΑΦΗ ΣΤΗΝ ΕΠΙΦΑΝΕΙΑ ΕΡΓΑΣΙΑΣ Το τρέχον αρχείο (Προβολή Αρχείου) ή το αρχείο ενός thumbnail στο οποίο κάνατε κλικ (Προβολή Γκαλερί) αντιγράφεται στον φάκελο επιφάνειας εργασίας (/home//Desktop). - - TOPIC: ΑΝΤΙΓΡΑΦΗ ΣΤΟ ΠΡΟΧΕΙΡΟ Το τρέχον αρχείο (Προβολή Αρχείου) ή το αρχείο ενός thumbnail στο οποίο κάνατε κλικ (Προβολή Γκαλερί) αντιγράφεται στο πρόχειρο, από όπου άλλες εφαρμογές μπορούν να το επικολλήσουν. - - TOPIC: ΔΙΑΓΡΑΦΗ/ΑΠΟΡΡΙΨΗ Το τρέχον αρχείο (Προβολή Αρχείου) ή το αρχείο ενός thumbnail στο οποίο κάνατε κλικ (Προβολή Γκαλερί) διαγράφεται ή μετακινείται στα απορρίμματα, ανάλογα με την επιλογή που έγινε. Το Fotocx ακολουθεί το πρότυπο για τα απορρίμματα (~/.local/share/Trash). - - TOPIC: ΟΡΙΣΜΟΣ ΤΑΠΕΤΣΑΡΙΑΣ Η ταπετσαρία της επιφάνειας εργασίας ορίζεται από το τρέχον αρχείο εικόνας. - - TOPIC: ΕΚΤΥΠΩΣΗ ΕΙΚΟΝΑΣ Το μενού εκτύπωσης εικόνας εμφανίζει έναν τυπικό διάλογο Διαμόρφωσης Σελίδας όπου μπορείτε να επιλέξετε έναν εκτυπωτή, ένα μέγεθος χαρτιού, και προσανατολισμό. Μετά τη χρήση του κουμπιού [εφαρμογή], ξεκινά ένας άλλος διάλογος για την εισαγωγή περιθωρίων χαρτιού και κλίμακας εικόνας. - Εάν η εικόνα έχει επιλεγμένη(ες) περιοχή(ές), σας ζητείται εάν πρέπει να εκτυπωθούν μόνο οι περιοχές. Αυτές θα εκτυπωθούν χρησιμοποιώντας το ελάχιστο ορθογώνιο που απαιτείται για να περικλείσει τις περιοχές, και οι περιοχές εκτός των επιλογών δεν εκτυπώνονται. - - TOPIC: ΒΑΘΜΟΝΟΜΗΜΕΝΗ ΕΚΤΥΠΩΣΗ Αυτή η λειτουργία λειτουργεί όπως η Εκτύπωση Αρχείου Εικόνας που περιγράφηκε παραπάνω, αλλά πριν την εκτύπωση σας ζητείται να παρέχετε ένα αρχείο βαθμονόμησης που χρησιμοποιείται για τη ρύθμιση των χρωμάτων της εικόνας πριν από την εκτύπωση. Ο σκοπός είναι η αντιστάθμιση των αποκλίσεων χρώματος που προκαλούνται από τον εκτυπωτή και τον τύπο χαρτιού. - - TOPIC: ΒΑΘΜΟΝΟΜΗΣΗ ΕΚΤΥΠΩΤΗ +image: printer-calibrate-chart.png +image: calibrate-printer.png - Αυτό το βοηθητικό εργαλείο μπορεί να βελτιώσει τη χρωματική ακρίβεια των εκτυπωμένων εικόνων. - ^Πώς Λειτουργεί Ένας πίνακας χρωμάτων εκτυπώνεται στον εκτυπωτή-στόχο. Ορισμένα από τα εκτυπωμένα χρώματα θα είναι ελαφρώς λανθασμένα λόγω ατελειών του εκτυπωτή. Αυτή η εκτυπωμένη σελίδα σαρώνεται σε ένα αρχείο, και τα χρώματα σε αυτό το αρχείο συγκρίνονται με τα αρχικά χρώματα που εκτυπώθηκαν. Οι όποιες διαφορές είναι σφάλματα που είναι πλέον γνωστά (υποθέτοντας ότι ο σαρωτής σας είναι πιο ακριβής από τον εκτυπωτή σας - γενικά αληθές). Όταν εκτυπώνεται ένα αρχείο εικόνας, αυτά τα σφάλματα αφαιρούνται από τα χρώματα της εικόνας πριν την εκτύπωση. Ο εκτυπωτής προσθέτει ξανά τα σφάλματα, αφήνοντας ένα αποτέλεσμα που είναι θεωρητικά σωστό. Η δική μου δοκιμή έδειξε μια μέτρια βελτίωση, όπως περιγράφεται παρακάτω. - Εκτελέστε τα ακόλουθα βήματα με τη σειρά, όπως αναφέρονται στο παράθυρο διαλόγου. Όλα τα αρχεία βρίσκονται στον φάκελο /printer_color. • Δημιουργήστε και εκτυπώστε το αρχείο πίνακα χρωμάτων (printchart.png). Χρησιμοποιήστε μεγάλο μέγεθος χαρτιού, κάθετο προσανατολισμό, χωρίς περιθώρια. • Σαρώστε τον εκτυπωμένο πίνακα σε αρχείο PNG. Χρησιμοποιήστε 300 dpi ή περισσότερο. • Επεξεργαστείτε την εικόνα PNG για να περικόψετε τα περιθώρια που αφήνει ο σαρωτής. Αποθηκεύστε το επεξεργασμένο αρχείο εικόνας. • Επεξεργαστείτε το επεξεργασμένο αρχείο εικόνας για να δημιουργήσετε ένα αρχείο χρωματικού χάρτη. - Μπορείτε τώρα να εκτυπώσετε χρησιμοποιώντας το μενού {ΒΑΘΜΟΝΟΜΗΜΕΝΗ ΕΚΤΥΠΩΣΗ}, το οποίο θα ζητήσει το όνομα του αρχείου χρωματικού χάρτη για τον εκτυπωτή και το χαρτί που χρησιμοποιείτε. - Οι σαρωτές μπορούν να παραμορφώσουν μια σαρωμένη εικόνα σε μια ελαφρώς μη ορθογώνια μορφή. Εάν συμβεί αυτό, θα το παρατηρήσετε όταν προσπαθείτε να περικόψετε τα περιθώρια: οι χοντρές πράσινες γραμμές περιθωρίου δεν θα ευθυγραμμίζονται τέλεια με το ορθογώνιο περικοπής. Εάν συμβεί αυτό, χρησιμοποιήστε την {ΠΡΟΟΠΤΙΚΗ} για να τετραγωνίσετε πρώτα την εικόνα, και στη συνέχεια περικόψτε τα περιθώρια. - Κατά την επεξεργασία της σαρωμένης εικόνας πίνακα, βεβαιωθείτε ότι η πιο σκοτεινή σειρά βρίσκεται στην κορυφή. Περικόψτε τα περιθώρια γύρω από τα πλακίδια χρωμάτων. Χρησιμοποιήστε τη χοντρή πράσινη γραμμή περιθωρίου γύρω από τα πλακίδια χρωμάτων ως οδηγό: κόψτε αυτή τη γραμμή ακριβώς, αφήνοντας μόνο τα πλακίδια. Εργαστείτε με 2x μεγέθυνση ενώ ρυθμίζετε το ορθογώνιο περικοπής. Η ακριβής περικοπή είναι σημαντική. Εάν η περικοπή δεν είναι ακριβής, οι υπολογισμένες θέσεις των πλακιδίων θα μετατοπιστούν, και τα μετρημένα χρώματα μπορεί να είναι λανθασμένα. Ένα μικρό σφάλμα είναι ανεκτό. Μπορείτε να χρησιμοποιήσετε τα πλήκτρα βέλους του πληκτρολογίου για μετακινήσεις 1 pixel στο ορθογώνιο περικοπής. Η τελευταία γωνία που τραβήχτηκε με το ποντίκι είναι η γωνία που θα μετακινούν τα πλήκτρα βέλους. - Το αρχείο χρωματικού χάρτη εξόδου μπορεί να χρησιμοποιηθεί μόνο για τις ρυθμίσεις χαρτιού και εκτυπωτή που χρησιμοποιήθηκαν για τη βαθμονόμηση. Οποιοσδήποτε άλλος συνδυασμός χρειάζεται τη δική του βαθμονόμηση και αρχείο χρωματικού χάρτη. - ^Αποτελέσματα^ (ο εκτυπωτής μου Canon) +image: printer-calibrate.jpg +image: printer-cal-study.png - Ο παραπάνω πίνακας είναι φωτογραφία τριών εικόνων: πάνω αριστερά: εκτύπωση φωτογραφίας πίνακα χρωμάτων πάνω δεξιά: βαθμονομημένη εκτύπωση της ίδιας φωτογραφίας κάτω: ο ίδιος ο πίνακας χρωμάτων Δεδομένου ότι και οι 3 εικόνες φωτογραφήθηκαν μαζί, τα σφάλματα από την κάμερα είναι ίσα, καθιστώντας τις συγκρίσεις έγκυρες. - - TOPIC: ΜΕΝΟΥ ΓΚΑΛΕΡΙ - - TOPIC: ΕΠΙΣΚΟΠΗΣΗ ΓΚΑΛΕΡΙ +image: image-management.jpg - Μια γκαλερί εικόνων thumbnail μπορεί να αντιπροσωπεύει έναν φάκελο αρχείων, το αποτέλεσμα μιας αναζήτησης εικόνων, μία από τις ενσωματωμένες γκαλερί (πρόσφατα αρχεία, νεότερα αρχεία), ή ένα άλμπουμ (μια ταξινομημένη λίστα αρχείων εικόνας με ένα δεδομένο όνομα). Οι φάκελοι θα πρέπει να περιορίζονται σε λίγες χιλιάδες αρχεία για πρακτικούς λόγους και λόγους απόδοσης, αλλά δεν επιβάλλεται κανένα όριο. - ^Κύλιση της Γκαλερί Η γκαλερί μπορεί να κυλήσει πάνω και κάτω χρησιμοποιώντας τα πλήκτρα βέλους πάνω και κάτω του πληκτρολογίου, τα πλήκτρα page-up και page-down, ή τις μπάρες κύλισης. Μπορούν επίσης να χρησιμοποιηθούν τα πλήκτρα [home] και [end]. Κάντε αριστερό κλικ και κρατήστε πατημένο στη μπάρα κύλισης, και η γκαλερί θα κυλήσει γρήγορα στη θέση του κλικ. Κάντε δεξί κλικ και κρατήστε πατημένο στη μπάρα κύλισης για να κάνετε τη γκαλερί να κυλήσει αργά στη θέση του κλικ. Συνεχίστε να κρατάτε πατημένο το κουμπί του ποντικιού και μετακινηθείτε προς το πλάι για να αυξήσετε την ταχύτητα κύλισης. - - TOPIC: ΠΡΟΒΟΛΗ THUMBNAIL Τα αρχεία εικόνας στην τρέχουσα γκαλερί εμφανίζονται ως πίνακας thumbnails. Χρησιμοποιήστε το κουμπί μενού Zoom ή τα πλήκτρα [+] [-] για να αλλάξετε το μέγεθος των thumbnails. - - TOPIC: ΠΡΟΒΟΛΗ METADATA Τα αρχεία εικόνας στην τρέχουσα γκαλερί εμφανίζονται μαζί με τα βασικά metadata που χρησιμοποιεί το Fotocx. Εάν έχουν οριστεί προσαρμοσμένα ευρετηριασμένα tags metadata, αυτά εμφανίζονται μετά τα τυπικά tags. Δείτε {ΕΥΡΕΤΗΡΙΑΣΗ ΑΡΧΕΙΩΝ}. - - TOPIC: ΠΡΟΣΦΑΤΑ ΑΡΧΕΙΑ Τα 1000 πιο πρόσφατα προβεβλημένα αρχεία εικόνας εμφανίζονται σε μια γκαλερί, από την οποία μπορείτε να επιλέξετε αρχεία για προβολή ή επεξεργασία. - - TOPIC: ΠΙΟ ΠΡΟΣΦΑΤΑ ΑΡΧΕΙΑ Τα 1000 πιο πρόσφατα προστεθέντα ή τροποποιημένα αρχεία εικόνας εμφανίζονται σε μια γκαλερί, από την οποία μπορείτε να επιλέξετε αρχεία για προβολή ή επεξεργασία. Σας δίνεται η επιλογή να χρησιμοποιήσετε την ημερομηνία φωτογραφίας EXIF ή την ημερομηνία τροποποίησης του αρχείου για τον προσδιορισμό των νεότερων εικόνων. - - TOPIC: ΤΑΞΙΝΟΜΗΣΗ ΓΚΑΛΕΡΙ Επιλέξτε το κλειδί ταξινόμησης και αύξουσα ή φθίνουσα σειρά. Το πλαίσιο ελέγχου Reset επαναφέρει όλες τις γκαλερί σε αύξουσα σειρά ονόματος αρχείου. - Εάν ταξινομηθεί μια γκαλερί Άλμπουμ, το αποτέλεσμα δεν αντικαθιστά το άλμπουμ αλλά δημιουργεί ένα νέο άλμπουμ με όνομα -sorted. - ^Όνομα/Αριθμός Αρχείου Αυτή είναι μια τροποποιημένη ταξινόμηση κατά όνομα αρχείου. Εάν πολλαπλά αρχεία έχουν ονόματα που διαφέρουν μόνο σε ενσωματωμένους αριθμούς στην ίδια θέση, αυτή η ομάδα αρχείων θα ταξινομηθεί με τη σειρά των ενσωματωμένων αριθμών. Το παράδειγμα εδώ απεικονίζει τη διαφορά: αλφαβητική σειρά: xxx1xx xxx11xx xxx123xx xxx3xx αριθμητική σειρά: xxx1xx xxx3xx xxx11xx xxx123xx - ^Metadata από τη Λειτουργία Αναζήτησης Εάν η γκαλερί δημιουργήθηκε από την επιλογή 'αναφορά metadata' της {ΑΝΑΖΗΤΗΣΗ ΕΙΚΟΝΩΝ}, και εάν προσθέσατε προαιρετικά tags metadata στην τυπική αναφορά, μπορείτε να ταξινομήσετε τη γκαλερί κατά αυτά τα tags metadata. Μπορείτε να ταξινομήσετε τη γκαλερί κατά κατασκευαστή κάμερας, πληροφορίες φακού, επίπεδο ISO, χρόνο έκθεσης ... οποιοδήποτε διαθέσιμο metadata. - - TOPIC: ΦΙΛΤΡΟ ΓΚΑΛΕΡΙ Επιλέξτε ένα υποσύνολο της τρέχουσας γκαλερί για να δημιουργήσετε ένα άλμπουμ με όνομα "gallery_filter" που περιέχει τα επιλεγμένα αρχεία εικόνας. ^Επιλογές επιλογής: • όλα τα αρχεία: επιλογή όλων των αρχείων εικόνας • πρωτότυπα: πρωτότυπα αρχεία (χωρίς αριθμό έκδοσης) • εκδόσεις: αρχεία με έκδοση (έχουν επεξεργαστεί) • τελευταίες εκδόσεις: τελευταίες εκδόσεις (ή πρωτότυπα εάν δεν υπάρχουν εκδόσεις) • εύρος βαθμολογίας: αρχεία με βαθμολογία εντός του δεδομένου εύρους • ονόματα keyword: αρχεία που έχουν οποιοδήποτε από τα δεδομένα keywords (διαχωρισμένα με κόμμα) • κείμενο ονόματος αρχείου: αρχεία με οποιαδήποτε από τις δεδομένες συμβολοσειρές κειμένου (διαχωρισμένες με κόμμα) - - TOPIC: ΑΡΧΗ ΓΚΑΛΕΡΙ TOPIC: ΤΕΛΟΣ ΓΚΑΛΕΡΙ Μετάβαση στο πρώτο ή στο τελευταίο thumbnail της τρέχουσας γκαλερί. - - TOPIC: ΦΑΚΕΛΟΣ ΤΡΕΧΟΝΤΟΣ ΑΡΧΕΙΟΥ Ορίστε την τρέχουσα γκαλερί από το τρέχον αρχείο εικόνας. Αυτό είναι χρήσιμο εάν θέλετε να επιστρέψετε στη γκαλερί του τρέχοντος αρχείου αφού κάνετε κάτι άλλο. - - TOPIC: ΠΡΟΣΦΑΤΟΙ ΦΑΚΕΛΟΙ Ορίστε την τρέχουσα γκαλερί από μια πρόσφατα χρησιμοποιημένη γκαλερί. Αυτό σας επιτρέπει να μετακινείστε πιο εύκολα εμπρός και πίσω μεταξύ πρόσφατων γκαλερί. - - TOPIC: ΔΕΝΤΡΟ ΦΑΚΕΛΩΝ +image: folder-tree.png - Όλοι οι κύριοι (TOP) φάκελοι εικόνων εμφανίζονται αρχικά. Κάντε κλικ στο [+] για να ξεδιπλώσετε τους υποφακέλους, ή στο [-] για να τους διπλώσετε ξανά. Μπορείτε να κάνετε κλικ σε οποιονδήποτε φάκελο για να λάβετε μια γκαλερί των εικόνων σε αυτόν τον φάκελο. Κρατήστε το παράθυρο ανοιχτό για να πλοηγηθείτε οπουδήποτε στη συλλογή εικόνων σας. Αυτή η λειτουργία είναι επίσης διαθέσιμη χρησιμοποιώντας το κουμπί [TOP] στον επάνω πίνακα της γκαλερί. - - TOPIC: ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ Προεπιλέξτε αρχεία εικόνας για χρήση ως είσοδοι για τη δημιουργία άλμπουμ ή για λειτουργίες ομαδικής επεξεργασίας. Αυτές οι λειτουργίες θα χρησιμοποιήσουν τα προεπιλεγμένα αρχεία από προεπιλογή, αλλά μπορείτε επίσης να τα τροποποιήσετε ή να ξεκινήσετε από την αρχή. Δείτε τη διαδικασία {ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}. - - TOPIC: ΣΕΛΙΔΟΔΕΙΚΤΕΣ Προβάλετε τους υπάρχοντες σελιδοδείκτες. Οι σελιδοδείκτες είναι επιλεγμένες τοποθεσίες (ονόματα φακέλων/αρχείων) με ονόματα που έχουν οριστεί από τον χρήστη. Κάντε κλικ σε έναν σελιδοδείκτη για να εμφανίσετε μια γκαλερί thumbnails ξεκινώντας από αυτή την τοποθεσία. Επιλέξτε [Επεξεργασία Σελιδοδεικτών] για να προσθέσετε, διαγράψετε, ή μετονομάσετε έναν σελιδοδείκτη. - - TOPIC: ΕΠΕΞΕΡΓΑΣΙΑ ΣΕΛΙΔΟΔΕΙΚΤΩΝ Αφού ξεκινήσετε την Επεξεργασία Σελιδοδεικτών, κάντε κλικ σε ένα thumbnail γκαλερί για να προσθέσετε αυτή την τοποθεσία στη λίστα σελιδοδεικτών. Το όνομα σελιδοδείκτη που θα ανατεθεί θα είναι αρχικά το όνομα αρχείου του thumbnail. Μπορείτε να επεξεργαστείτε το όνομα. Εάν επιλέξετε έναν υπάρχοντα σελιδοδείκτη με κλικ ποντικιού, το όνομά του εμφανίζεται στο πεδίο εισαγωγής. Μπορείτε να αλλάξετε το όνομα ή να πατήσετε [διαγραφή] για να αφαιρέσετε τον σελιδοδείκτη. Νέοι σελιδοδείκτες εισάγονται μετά την τελευταία επιλεγμένη τοποθεσία σελιδοδείκτη. Για να αλλάξετε τη σειρά, επεξεργαστείτε το αρχείο "bookmarks" στον αρχικό φάκελο του Fotocx. - - TOPIC: MAPS MENU - - TOPIC: ΠΑΓΚΟΣΜΙΟΣ ΧΑΡΤΗΣ +image: map-click.jpg - Αυτός είναι ένας παγκόσμιος χάρτης μέσω internet που μπορεί να κλιμακωθεί (μεγέθυνση και σμίκρυνση) από το επίπεδο του δρόμου έως το επίπεδο ηπείρου. Χρησιμοποιήστε το ροδάκι του ποντικιού για zoom μεγέθυνση/σμίκρυνση του χάρτη. Σύρετε τον χάρτη για να αλλάξετε το κέντρο. Ο χάρτης έχει δείκτες (κόκκινες κουκκίδες) που αντιστοιχούν σε εικόνες που έχουν γεωσυντεταγμένες στα metadata τους. Κάντε κλικ σε έναν δείκτη για να λάβετε μια Προβολή Γκαλερί των εικόνων σε αυτή την τοποθεσία. Επιλέγονται οι εικόνες που βρίσκονται εντός της περιοχής του δείκτη στον χάρτη. Η ενεργή περιοχή του δείκτη κλιμακώνεται με την κλίμακα του χάρτη. Κάντε zoom μεγέθυνση για να επεκτείνετε την κλίμακα και πιθανώς να διαχωρίσετε έναν δείκτη σε πολλαπλούς κοντινούς δείκτες. - - TOPIC: ΕΜΦΑΝΙΣΗ ΣΤΟ ΧΑΡΤΗ Εμφανίστε τη θέση του τρέχοντος αρχείου εικόνας στον παγκόσμιο χάρτη. Εάν πολλαπλοί δείκτες επικαλύπτονται, κάντε zoom μεγέθυνση μέχρι ένας μόνο δείκτης να βρίσκεται στο κέντρο. - - TOPIC: ΜΕΝΟΥ ΑΛΜΠΟΥΜ - - TOPIC: ΑΛΜΠΟΥΜ Ένα άλμπουμ είναι ένα αυθαίρετο σύνολο εικόνων που συναρμολογείται χειροκίνητα από υπάρχουσες εικόνες. Ένα άλμπουμ είναι μια λίστα των αρχείων εικόνας μελών του. Τα ίδια τα αρχεία εικόνας δεν αντιγράφονται ή αλλάζουν. Ένα δεδομένο αρχείο εικόνας μπορεί να είναι μέλος πολλαπλών άλμπουμ, ή μπορεί να υπάρχει περισσότερες από μία φορές μέσα σε ένα άλμπουμ. Μπορείτε να προσθέσετε και να αφαιρέσετε εικόνες σε ένα άλμπουμ ή να αναδιατάξετε τη σειρά τους. Μόλις δημιουργηθεί ένα άλμπουμ, μπορείτε να το επιλέξετε με όνομα και εμφανίζεται ως γκαλερί. - - TOPIC: ΔΗΜΙΟΥΡΓΙΑ ΑΛΜΠΟΥΜ Εισαγάγετε ένα όνομα για ένα νέο άλμπουμ. Μπορείτε να δημιουργήσετε ένα κενό άλμπουμ, ένα άλμπουμ με προεπιλεγμένα αρχεία εικόνας από την {ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ}, ένα άλμπουμ με εικόνες από την τρέχουσα γκαλερί, ή μπορείτε να επιλέξετε τις αρχικές εικόνες για το άλμπουμ. - - TOPIC: ΜΕΤΟΝΟΜΑΣΙΑ ΑΛΜΠΟΥΜ Επιλέξτε ένα υπάρχον άλμπουμ και εισαγάγετε ένα νέο όνομα. - - TOPIC: ΔΙΑΓΡΑΦΗ ΑΛΜΠΟΥΜ Επιλέξτε ένα υπάρχον άλμπουμ και διαγράψτε το οριστικά. - - TOPIC: ΕΠΙΛΟΓΗ ΑΛΜΠΟΥΜ Εμφανίζεται μια λίστα διαθέσιμων άλμπουμ. Επιλέξτε από τη λίστα. - - TOPIC: ΤΡΕΧΟΝ ΑΛΜΠΟΥΜ Ορίστε τη γκαλερί από το τρέχον (τελευταίο χρησιμοποιημένο) άλμπουμ. - - TOPIC: ΓΚΑΛΕΡΙ ΣΕ ΑΛΜΠΟΥΜ Αποθηκεύστε την τρέχουσα γκαλερί ως άλμπουμ. Επιλέξτε ένα υπάρχον όνομα άλμπουμ [Περιήγηση], ή εισαγάγετε ένα νέο όνομα. - - TOPIC: ΕΠΕΞΕΡΓΑΣΙΑ ΑΛΜΠΟΥΜ Κάντε δεξί κλικ σε ένα thumbnail άλμπουμ και επιλέξτε από το αναδυόμενο μενού: • Προσθήκη επιλεγμένων αρχείων εδώ - τα προηγουμένως επιλεγμένα αρχεία προστίθενται εδώ (κάντε κλικ στην αριστερή/δεξιά πλευρά του thumbnail για προσθήκη πριν/μετά το thumbnail). • Προσθήκη του τρέχοντος αρχείου (Προβολή Αρχείου) εδώ - λειτουργεί με τον ίδιο τρόπο. • Αφαίρεση από το άλμπουμ - το αρχείο στο οποίο έγινε κλικ αφαιρείται από το άλμπουμ. - ^Μεταφορά και Απόθεση Μπορείτε να αναδιατάξετε τις εικόνες σε ένα άλμπουμ σύροντας τα thumbnails με το ποντίκι. Σύρετε το thumbnail μέχρι ο δρομέας του ποντικιού να αλλάξει σε μια μικρή εικόνα thumbnail. Συνεχίστε να σύρετε αυτή την εικόνα στη θέση όπου πρέπει να εισαχθεί, και αφήστε το κουμπί του ποντικιού. Τοποθετήστε το ποντίκι περίπου ανάμεσα στα thumbnails όπου πρόκειται να εισαχθεί η συρόμενη εικόνα. Εάν το σύρσιμο πλησιάσει την πάνω ή κάτω άκρη του παραθύρου, η γκαλερί θα κυλήσει για να φέρει περισσότερες εικόνες σε προβολή. Μπορείτε να χρησιμοποιήσετε δύο συνεδρίες Fotocx για να κάνετε την επιλογή ή τη μετακίνηση πολλών εικόνων πιο γρήγορη. Μεταφέρετε και αποθέστε εικόνες από οποιαδήποτε γκαλερί πηγή σε μια θέση-στόχο άλμπουμ. - Εάν μετονομάσετε ή μετακινήσετε ένα αρχείο χρησιμοποιώντας το Fotocx, οι σύνδεσμοι άλμπουμ ενημερώνονται και το αρχείο παραμένει στα άλμπουμ που το περιέχουν. Εάν το κάνετε αυτό εκτός του Fotocx, οι σύνδεσμοι άλμπουμ χάνονται και το αρχείο εξαφανίζεται από το άλμπουμ. - Εάν αρχεία εικόνας μετονομάζονται ή μετακινούνται χρησιμοποιώντας την Ομαδική Μετατροπή ή την Ομαδική Αντιγραφή/Μετακίνηση, βεβαιωθείτε ότι επιλέγετε την επιλογή αντικατάστασης αρχείων άλμπουμ εάν αυτό είναι επιθυμητό. Διαφορετικά θα πρέπει να τα αντικαταστήσετε ένα-ένα. - Μην μετονομάζετε φακέλους εάν περιέχουν εικόνες σε άλμπουμ. Οι σύνδεσμοι άλμπουμ θα χαθούν. Αντίθετα, χρησιμοποιήστε την Ομαδική Μετατροπή ή την Ομαδική Αντιγραφή/Μετακίνηση για να μετακινήσετε τα αρχεία εικόνας στον νέο φάκελο, και στη συνέχεια διαγράψτε τον παλιό φάκελο εάν είναι κενός. Για να διαγράψετε αρχεία εικόνας, χρησιμοποιήστε την Ομαδική Διαγραφή/Καλάθι. Αυτό θα εκκαθαρίσει επίσης τα διαγραμμένα αρχεία από τα άλμπουμ. - - TOPIC: ΕΝΗΜΕΡΩΣΗ ΑΛΜΠΟΥΜ +image: album-replace-file.png - Αντικαταστήστε καθορισμένα αρχεία άλμπουμ με καθορισμένα αντικαταστάτες, ή προσθέστε καθορισμένα νέα αρχεία μετά από καθορισμένα υπάρχοντα αρχεία. Επιλέξτε ένα ή περισσότερα άλμπουμ προς επεξεργασία. Στην προβολή γκαλερί, κάντε κλικ σε δύο thumbnails για να καθορίσετε το 'παλιό αρχείο' και το 'νέο αρχείο' στον παραπάνω διάλογο. Επιλέξτε την επιλογή: το 'νέο αρχείο' αντικαθιστά το 'παλιό αρχείο' όπου βρεθεί, ή το 'νέο αρχείο' προστίθεται στα άλμπουμ μετά το 'παλιό αρχείο'. Πατήστε [proceed] για να επεξεργαστείτε τα άλμπουμ. Μετά την επεξεργασία, ο διάλογος επαναλαμβάνεται με τα ίδια επιλεγμένα άλμπουμ και την ίδια επιλογή 'αντικατάσταση ή προσθήκη'. Μπορείτε να επιλέξετε δύο ακόμη αρχεία και να πατήσετε [proceed]. - - TOPIC: ΜΑΖΙΚΗ ΕΝΗΜΕΡΩΣΗ ΑΛΜΠΟΥΜ +image: album-mass-update.png - Αυτό είναι ένα βοηθητικό εργαλείο για μαζικές ενημερώσεις που μπορεί να χρειαστείτε αφού δημιουργήσετε νέες εκδόσεις για πολλά αρχεία εικόνας και χρειάζεται να ενημερώσετε ένα ή περισσότερα άλμπουμ στις νέες εκδόσεις. Αυτό δεν καλύπτει κάθε ανάγκη, κάτι που είναι μάλλον αδύνατο, αλλά ελπίζουμε ότι θα μειώσει την ανάγκη αλλαγής ενός αρχείου τη φορά. - Επιλέξτε ένα ή περισσότερα άλμπουμ και στη συνέχεια επιλέξτε μία από τις επιλογές επεξεργασίας: • Αντικατάσταση όλων μόνο με τη νεότερη έκδοση: Τα άλμπουμ ενημερώνονται ώστε να έχουν μόνο τις νεότερες εκδόσεις αρχείων. • Αντικατάσταση όλων των εκδόσεων με τη νεότερη έκδοση: Όλες οι εκδόσεις αρχείων αντικαθίστανται μόνο με τη νεότερη έκδοση. Το πρωτότυπο αρχείο, εάν υπάρχει, ΔΕΝ αντικαθίσταται. • Προσθήκη νεότερων εκδόσεων στις υπάρχουσες εκδόσεις: Η νεότερη έκδοση προστίθεται στις υπάρχουσες εκδόσεις, εάν λείπει. • Αντικατάσταση όλων με το πρωτότυπο και όλες τις εκδόσεις: Όλα τα αρχεία αντικαθίστανται με το πρωτότυπο αρχείο και όλες τις εκδόσεις. • Αντικατάσταση όλων με την πρωτότυπη έκδοση και τη νεότερη έκδοση: Όλα τα αρχεία αντικαθίστανται με το πρωτότυπο αρχείο και τη νεότερη έκδοση. • Αντικατάσταση όλων με τις επιλεγμένες εκδόσεις (*): Όλα τα αρχεία αντικαθίστανται μόνο με τις επιλεγμένες εκδόσεις. Αυτό περιλαμβάνει το πρωτότυπο (χωρίς έκδοση) αρχείο. • Αντικατάσταση όλων των εκδόσεων με τις επιλεγμένες εκδόσεις (*): Όλες οι εκδόσεις αρχείων αντικαθίστανται μόνο με τις επιλεγμένες εκδόσεις. Το πρωτότυπο αρχείο, εάν υπάρχει, ΔΕΝ αντικαθίσταται. • Προσθήκη επιλεγμένων εκδόσεων στις υπάρχουσες εκδόσεις (*): Η επιλεγμένη έκδοση προστίθεται στις υπάρχουσες εκδόσεις, εάν λείπει. • Αντικατάσταση όλων με το πρωτότυπο και τις επιλεγμένες εκδόσεις (*): Όλα τα αρχεία αντικαθίστανται με τα πρωτότυπα αρχεία και τις επιλεγμένες εκδόσεις. - (*) Οι τέσσερις επιλογές που χρησιμοποιούν επιλεγμένα αρχεία: η λίστα επιλεγμένων αρχείων προέρχεται από τη λειτουργία {ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ}. Τα αρχεία άλμπουμ που δεν αντιστοιχούν σε κανένα επιλεγμένο αρχείο παραμένουν στο άλμπουμ. Μόνο τα αρχεία που αντιστοιχούν σε ένα επιλεγμένο αρχείο αλλάζουν σύμφωνα με τους παραπάνω κανόνες. Η αντιστοίχιση βασίζεται στο όνομα αρχείου χωρίς έκδοση ή επέκταση: το 'asdfg.png' και το 'asdfg.v01.jpg' ταιριάζουν. - Παράδειγμα: Αντικατάσταση όλων των εκδόσεων με τις επιλεγμένες εκδόσεις: Εάν το άλμπουμ έχει τα filename.jpg και filename.v02.png, και η λίστα επιλεγμένων αρχείων περιέχει το filename.v04.jpg, το αποτέλεσμα στο ενημερωμένο άλμπουμ θα είναι: filename.jpg και filename.v04.jpg - - TOPIC: ΠΡΟΒΟΛΗ ΔΙΑΦΑΝΕΙΩΝ +image: slide-show.jpg - ^Κλασματική Κλιμάκωση Οθόνης Για ορισμένα συστήματα, η κλασματική κλιμάκωση προκαλεί προβλήματα απόδοσης στα κινούμενα σχέδια της προβολής σλάιντ του Fotocx. Απενεργοποιήστε την και χρησιμοποιήστε άλλα μέσα για να αυξήσετε το μέγεθος γραμματοσειράς για τις εφαρμογές, εάν χρειάζεται. Για το Fotocx, το μέγεθος γραμματοσειράς βρίσκεται στο μενού {ΡΥΘΜΙΣΕΙΣ}. - Στον διάλογο προβολής σλάιντ (πάνω αριστερά), πατήστε [Επιλογή Άλμπουμ] και επιλέξτε ένα άλμπουμ από τη λίστα που παρέχεται. Αλλάξτε τις άλλες ρυθμίσεις στον διάλογο όπως επιθυμείτε, στη συνέχεια πατήστε το κουμπί [Έναρξη] για να ξεκινήσετε την προβολή σλάιντ με την πρώτη εικόνα στο άλμπουμ, ή [Συνέχιση] για να συνεχίσετε μια παυμένη προβολή σλάιντ, ή μια άλλη εικόνα επιλεγμένη κάνοντας κλικ στο thumbnail της. Χρησιμοποιήστε το πλήκτρο escape για έξοδο από την προβολή σλάιντ και επιστροφή στον διάλογο. - Κύρια Στοιχεία Ελέγχου Διαλόγου • Caption Time: δευτερόλεπτα εμφάνισης τίτλου και περιγραφής. • Image Time: δευτερόλεπτα εμφάνισης μόνο της εικόνας. • Clip Limit %: περικοπή εικόνων έως αυτό το ποσοστό για την εξάλειψη περιθωρίων. • Full Screen: Εάν είναι επιλεγμένο, οι εικόνες εμφανίζονται σε πλήρη οθόνη χωρίς μενού κ.λπ. • Auto-replay: Εάν είναι επιλεγμένο, η προβολή σλάιντ θα ξεκινήσει ξανά μετά το τέλος. • Random Image: Εάν είναι επιλεγμένο, χρήση τυχαίας σειράς εικόνων. Διαφορετικά, σειρά άλμπουμ. - Τα πλήκτρα του πληκτρολογίου μπορούν να χρησιμοποιηθούν για τον έλεγχο της προβολής σλάιντ. Πατήστε [πληκτρολόγιο] για προβολή. - Τα ακόλουθα πλήκτρα του πληκτρολογίου έχουν αντιστοιχιστεί σε ενέργειες και δεν μπορούν να αλλαχθούν: • Escape: διακοπή της προβολής σλάιντ και επιστροφή στον κύριο διάλογο. • Πλήκτρα βέλους αριστερά/δεξιά: Μπορείτε να μετακινηθείτε πίσω και εμπρός οποιαδήποτε στιγμή και η προβολή σλάιντ θα συνεχίσει από εκεί. - Οι κινούμενες μεταβάσεις μεταξύ των εικόνων, καθώς και οι χρόνοι εμφάνισης και η συμπεριφορά zoom των μεμονωμένων εικόνων, μπορούν να προσαρμοστούν χρησιμοποιώντας τους διαλόγους που εξηγούνται παρακάτω. - Πατήστε [μεταβάσεις] για να ξεκινήσετε έναν διάλογο για να επιλέξετε και να προσαρμόσετε τις μεταβάσεις μεταξύ των εικόνων. Αυτές περιλαμβάνουν πολλές κινούμενες μεθόδους αντικατάστασης εικόνας (π.χ. η νέα εικόνα επεκτείνεται από το κέντρο για να αντικαταστήσει την παλιά εικόνα). Επιλέξτε τις μεταβάσεις που θα χρησιμοποιηθούν και εάν χρησιμοποιούνται τυχαία ή με τη σειρά. Η παράμετρος χρόνου ορίζει τη διάρκεια της μετάβασης. Οι παράμετροι προτίμησης καθορίζουν μια σχετική προτίμηση που θα επηρεάσει πόσο συχνά χρησιμοποιείται η μετάβαση όταν επιλέγεται τυχαία σειρά. - Τα κουμπιά [φόρτωση] και [αποθήκευση] σας επιτρέπουν να αποθηκεύσετε τις ρυθμίσεις μετάβασης σε ένα αρχείο και να τις φορτώσετε αργότερα. Αυτά τα αρχεία είναι ανεξάρτητα από τα αρχεία προβολής σλάιντ. Μια προβολή σλάιντ θα χρησιμοποιεί από προεπιλογή τις ρυθμίσεις μετάβασης που χρησιμοποιήθηκαν τελευταία για αυτή την προβολή σλάιντ (όνομα άλμπουμ), αλλά μπορείτε πάντα να τις αντικαταστήσετε χρησιμοποιώντας το κουμπί [φόρτωση] για να φορτώσετε κάποιες άλλες ρυθμίσεις, ή αλλάζοντάς τες στον διάλογο. - Πατήστε [αρχεία εικόνας] για να ξεκινήσετε έναν διάλογο για Προτιμήσεις Εικόνας (πάνω δεξιά). Αυτές είναι προαιρετικές. Μια εικόνα επιλέγεται για προσαρμογή κάνοντας κλικ στο thumbnail της στην προβολή άλμπουμ/γκαλερί. Ο διάλογος συμπληρώνεται με προεπιλεγμένες ρυθμίσεις ή τις προηγούμενες ρυθμίσεις για αυτή την εικόνα σε αυτή την προβολή σλάιντ. Εισαγάγετε αναθεωρήσεις και πατήστε [done], ή κάντε κλικ στην επόμενη εικόνα προς προσαρμογή. - Preference: Εάν επιλεγεί τυχαία σειρά εικόνων, αυτός ο αριθμός δίνει μια σχετική προτίμηση για την εικόνα. Η ουδέτερη τιμή είναι 10. Εισαγάγετε μια νέα τιμή για να αυξήσετε ή να μειώσετε την πιθανότητα αυτό το αρχείο να επιλεγεί στην τυχαία σειρά εικόνων, π.χ. μια τιμή 20 θα έκανε την πιθανότητα 2x μεγαλύτερη. Μια τιμή μηδέν θα εμπόδιζε την εμφάνιση της εικόνας. Η εικόνα αποκλείεται επίσης για ένα πλήθος 1/3 των εικόνων στο άλμπουμ, ή 10, όποιο είναι μικρότερο. - Ο διάλογος εμφανίζει τα προσαρμόσιμα συμβάντα εικόνας με χρονική σειρά: • αναμονή για καθορισμένο χρόνο (μπορεί να είναι μηδέν). • εμφάνιση των ακόλουθων tags κειμένου παράλληλα: όνομα εικόνας (βασικό όνομα αρχείου) για καθορισμένο χρόνο, τίτλος εικόνας, εάν υπάρχει, για καθορισμένο χρόνο, περιγραφή εικόνας, εάν υπάρχει, για καθορισμένο χρόνο. • αναμονή καθορισμένου χρόνου πριν την έναρξη ενός zoom εικόνας (μπορεί να είναι μηδέν). • zoom της εικόνας από κανονική σε μεγεθυμένη ή αντίστροφα, στον καθορισμένο χρόνο. Εάν καμία επιλογή δεν έχει επιλεγεί, δεν υπάρχει zoom. • zoom-in: έναρξη σε κανονικό μέγεθος, μεγέθυνση της εικόνας ενώ μετακινείται το κέντρο του zoom στην καθορισμένη θέση. • zoom-out: έναρξη σε μεγεθυμένο μέγεθος στο καθορισμένο κέντρο zoom, σμίκρυνση της εικόνας πίσω στο κανονικό μέγεθος. • [zoom center] - πατήστε αυτό το κουμπί, στη συνέχεια κάντε κλικ στο thumbnail της εικόνας για να καθορίσετε το κέντρο zoom για την εικόνα. • αναμονή για καθορισμένο χρόνο μετά το zoom (μπορεί να είναι μηδέν) (η προεπιλεγμένη τιμή είναι η ρύθμιση 'image time' του κύριου διαλόγου). • μετάβαση στην επόμενη εικόνα, χρησιμοποιώντας την καθορισμένη μετάβαση ή 'next' για να υποδείξετε καμία προτίμηση (τυχαία επιλογή). - - TOPIC: ΠΡΟΣΑΡΜΟΣΜΕΝΟ ΜΕΝΟΥ +image: custom-menu.png - Αυτό σας επιτρέπει να συγκεντρώσετε συχνά χρησιμοποιούμενες λειτουργίες από πολλαπλά μενού σε ένα ενιαίο προσαρμοσμένο μενού. Μπορείτε επίσης να προσθέσετε καταχωρήσεις για να ανοίγετε συγκεκριμένα αρχεία εικόνας ή άλμπουμ. Το μενού περιλαμβάνει επίσης λειτουργίες script και λειτουργίες plugin (δείτε παρακάτω). - Η τελευταία καταχώρηση στο μενού, Edit Menu, ανοίγει έναν επεξεργαστή κειμένου για την επεξεργασία της ίδιας της λίστας μενού. Τα ονόματα μενού πρέπει να ταιριάζουν ακριβώς με τα ονόματα στα μενού του Fotocx, αλλά τα πεζά/κεφαλαία δεν έχουν σημασία. - Οι καταχωρήσεις μενού μπορούν να έχουν τις ακόλουθες μορφές: • # κείμενο σχολίου: ένα σχόλιο που δεν κάνει τίποτα • menuname # popup tip: όνομα μενού Fotocx και προαιρετική συμβουλή popup • file : άνοιγμα του ονομασμένου αρχείου • album : άνοιγμα του ονομασμένου άλμπουμ ως γκαλερί - Οι ακόλουθες καταχωρήσεις υπάρχουν από προεπιλογή και δεν θα πρέπει να τις αλλάξετε ή να τις αφαιρέσετε: Edit Script, Run Script, Batch Script, Plugins, Edit Menu. Οι λεπτομέρειες εξηγούνται παρακάτω. - - TOPIC: ΑΡΧΕΙΑ ΣΕΝΑΡΙΟΥ Λειτουργίες Μενού: • Edit Script - Εκτελέστε ένα σύνολο επεξεργασιών σε ένα αρχείο εικόνας, καταγράφοντας όλες τις λειτουργίες και τις ρυθμίσεις σε ένα ονομασμένο αρχείο script. • Run Script - Εκτελέστε ένα αρχείο script χρησιμοποιώντας το τρέχον αρχείο εικόνας, όπως μια λειτουργία επεξεργασίας. • Batch Script - Επιλέξτε οποιονδήποτε αριθμό αρχείων εικόνας και εκτελέστε ένα αρχείο script σε όλα αυτά, σε λειτουργία ομαδικής επεξεργασίας. - Τα αρχεία script σας επιτρέπουν να ορίσετε ένα σύνολο επεξεργασιών μία φορά, και να τις επαναλάβετε σε ένα ή πολλαπλά αρχεία εικόνας αργότερα. - ^Λειτουργίες Επεξεργασίας με Δυνατότητα Script Ορισμένες λειτουργίες επεξεργασίας χρησιμοποιούν σύρσιμο ποντικιού πάνω στην εικόνα, π.χ. όλες οι λειτουργίες παραμόρφωσης. Αυτές δεν υποστηρίζουν script επειδή το σύρσιμο του ποντικιού δεν καταγράφεται. Η χρήση αυτών των λειτουργιών είναι αποκλεισμένη. - Οι ακόλουθες λειτουργίες υποστηρίζουν επί του παρόντος script: • Επεξεργασία: Ρετούς, Περιθώρια, Λειτουργία Χρώματος, Γέμισμα Περιοχής • Επιδιόρθωση: Ευκρίνεια, Κανονικό Θόλωμα, Διαβαθμισμένο Θόλωμα, Αφαίρεση Θορύβου, Αφαίρεση Ομίχλης, Τεχνουργήματα JPEG, Anti-Alias, Ρύθμιση RGB • Βελτίωση: Εξομάλυνση Ιστογράμματος, Τοπική Αντίθεση, Ενίσχυση Αντίθεσης, Καθολικό Retinex, Τοπικό Retinex, Τοπική Αντίθεση, Κορεσμός, Απαλή Εστίαση, Κλίση Φωτεινότητας • Εφέ: Περιγράμματα, Σκίτσο, Καρτούν, Ανάγλυφο, Tiles1, Tiles2, Ζωγραφικός Πίνακας, Υφή, Μοτίβο, Dither, Χαρακτική, Ορισμός Χρωμάτων, Μετατόπιση Χρωμάτων, Προσαρμοσμένος Πυρήνας - - TOPIC: ΕΠΕΞΕΡΓΑΣΙΑ ΣΕΝΑΡΙΟΥ Στον διάλογο, πατήστε [έναρξη]. Επιλέξτε ένα όνομα αρχείου για το script. Ξεκινήστε την επεξεργασία του τρέχοντος αρχείου εικόνας. Χρησιμοποιήστε τις επιθυμητές λειτουργίες επεξεργασίας με οποιαδήποτε σειρά. Κάθε επεξεργασία καταγράφεται στο αρχείο script μαζί με όλες τις ρυθμίσεις διαλόγου που χρησιμοποιήθηκαν. Όταν τελειώσετε, πατήστε [close] για να κλείσετε το αρχείο script και να το αποθηκεύσετε με το δεδομένο όνομα αρχείου. - - TOPIC: ΕΚΤΕΛΕΣΗ ΣΕΝΑΡΙΟΥ Επιλέξτε ένα από τα αποθηκευμένα αρχεία script σας από το αναδυόμενο μενού. Το script εκτελείται χρησιμοποιώντας το τρέχον αρχείο εικόνας, όπως μια κανονική λειτουργία επεξεργασίας. - - TOPIC: ΣΕΝΑΡΙΟ ΜΑΖΙΚΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ Στον διάλογο, πατήστε [Επιλογή Αρχείων]. Επιλέξτε τα αρχεία προς επεξεργασία χρησιμοποιώντας τον τυπικό διάλογο επιλογής αρχείων {ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}. Όταν τελειώσετε, πατήστε [Επιλογή Σεναρίου]. Επιλέξτε ένα αρχείο script από το αναδυόμενο μενού. Το script εκτελείται τώρα σε όλα τα επιλεγμένα αρχεία. Όλες οι τροποποιημένες εικόνες αποθηκεύονται ως νέες εκδόσεις. Εάν επεξεργάζονται αρχεία RAW, τα αντίστοιχα αποτελέσματα είναι αρχεία TIFF-16. - - TOPIC: PLUGINS +image: plugins.png - Οι λειτουργίες plugin είναι ένας τρόπος χρήσης άλλων επεξεργαστών εικόνας μέσα στο Fotocx, π.χ. το Gimp. Μπορείτε να χρησιμοποιήσετε έναν επεξεργαστή εικόνων RAW όπως το Rawtherapee και στη συνέχεια να κάνετε επιπλέον επεξεργασίες χρησιμοποιώντας το Fotocx. - ^Διαδικασία χρήσης: • Ανοίξτε το αρχείο προς επεξεργασία στο Fotocx • Ξεκινήστε το μενού plugins και επιλέξτε το επιθυμητό πρόγραμμα, π.χ. το Gimp • Το πρόγραμμα plugin ξεκινά και ανοίγει το αρχείο που μεταβιβάστηκε από το Fotocx • Εκτελέστε τις επιθυμητές επεξεργασίες χρησιμοποιώντας το πρόγραμμα plugin • Όταν τελειώσετε, αποθηκεύστε το αρχείο εξόδου με το ίδιο όνομα με το αρχείο εισόδου. Η επέκταση .ext του αρχείου μπορεί να αλλάξει. • Κλείστε το πρόγραμμα plugin. • Το Fotocx ανοίγει το αρχείο εξόδου του plugin ως επεξεργασμένη έκδοση του τρέχοντος αρχείου. • Κάντε επιπλέον επεξεργασίες, ή αποθηκεύστε το επεξεργασμένο αρχείο ως νέα έκδοση ή νέο αρχείο. - Ένα παράδειγμα μενού Plugins βρίσκεται στα αριστερά. Η τελευταία καταχώρηση "Edit Plugins" ξεκινά την εφαρμογή επεξεργασίας κειμένου στα δεξιά. Χρησιμοποιήστε τον επεξεργαστή κειμένου για να ορίσετε τα ονόματα μενού plugin και τις εντολές για την εκκίνηση των αντίστοιχων προγραμμάτων plugin. Η μορφή είναι: menuname = plugin-command %s TIP = επεξήγηση της παραπάνω εντολής Η 'plugin-command' είναι η εντολή shell για τη λειτουργία plugin, και το '%s' είναι το σημείο όπου εισάγεται το τρέχον όνομα αρχείου μέσα στην εντολή. Μην βάζετε εισαγωγικά γύρω από το '%s' επειδή αυτό προστίθεται αυτόματα, επιτρέποντας την επεξεργασία ονομάτων αρχείων με κενά ή άλλους ειδικούς χαρακτήρες. Το παραπάνω παράδειγμα που φαίνεται είναι ένα μενού με όνομα "Gimp" που ξεκινά την εντολή "gimp %s". Το κείμενο TIP είναι προαιρετικό. Εάν υπάρχει, βρίσκεται στη γραμμή που ακολουθεί το όνομα του μενού. Το πέρασμα του ποντικιού πάνω από την καταχώρηση μενού θα εμφανίσει αυτό το κείμενο δίπλα στο κείμενο του μενού. - Ορισμένες εντολές μπορεί να απαιτούν τον καθορισμό τόσο αρχείων εισόδου όσο και εξόδου. Σε αυτή την περίπτωση, δώστε '%s' και στις δύο θέσεις. Παραλείψτε το '%s' εάν η εντολή δεν επεξεργάζεται αρχείο εικόνας. - ^Επιλογή Περιοχής Εάν το αρχείο εισόδου έχει μια επιλεγμένη περιοχή, μόνο αυτή η περιοχή θα τροποποιηθεί. Η λειτουργία plugin επεξεργάζεται ολόκληρη την εικόνα, αλλά όταν το αποτέλεσμα επεξεργάζεται από το Fotocx, διατηρούνται μόνο οι αλλαγές στην επιλεγμένη περιοχή. - - TOPIC: ZOOM - ^Κουμπί Zoom Κάντε αριστερό ή δεξί κλικ στο κουμπί για να αυξήσετε ή να μειώσετε το μέγεθος της εικόνας στην {ΠΡΟΒΟΛΗ ΑΡΧΕΙΟΥ} ή το μέγεθος των thumbnails στην {ΠΡΟΒΟΛΗ ΓΚΑΛΕΡΙ}. Αυτό ισχύει μόνο εάν η λειτουργία προβολής γκαλερί είναι {ΠΡΟΒΟΛΗ THUMBNAIL}. Εάν είναι {ΠΡΟΒΟΛΗ METADATA}, δεν γίνεται τίποτα. - - TOPIC: ΠΡΟΗΓΟΥΜΕΝΟ/ΕΠΟΜΕΝΟ - Κάντε αριστερό ή δεξί κλικ στο κουμπί για να ανοίξετε το προηγούμενο ή το επόμενο αρχείο στην τρέχουσα γκαλερί. Μπορείτε επίσης να χρησιμοποιήσετε τα πλήκτρα βέλους αριστερά/δεξιά. - - TOPIC: ΑΠΟΘΗΚΕΥΣΗ ΑΡΧΕΙΟΥ - +image: file-save.png - +image: file-save-as.jpg - Στον πρώτο διάλογο, επιλέξτε 'new version', 'new file', ή 'replace file'. - ^Νέα Έκδοση Αποθηκεύστε το τρέχον αρχείο εικόνας με έναν νέο αριθμό έκδοσης. Τα ονόματα αρχείων με αριθμούς έκδοσης έχουν τη μορφή "filename.vNN.ext" όπου το NN είναι ένας αριθμός από 01 έως 99. Εάν το όνομα αρχείου δεν έχει εκδόσεις, θα δημιουργηθεί η έκδοση .v01. Εάν υπάρχουν ήδη εκδόσεις αρχείου στον δίσκο, τότε χρησιμοποιείται ο επόμενος υψηλότερος αριθμός έκδοσης. Εάν το αρχείο είναι αρχείο JPEG, χρησιμοποιείται η προεπιλεγμένη ποιότητα - δείτε {ΡΥΘΜΙΣΕΙΣ}. - ^Νέο Αρχείο Ο 2ος διάλογος που φαίνεται παραπάνω θα ανοίξει για να αποθηκεύσετε την τρέχουσα εικόνα σε ένα επιλεγμένο αρχείο, το οποίο μπορεί να είναι το πρωτότυπο αρχείο, ένα άλλο υπάρχον αρχείο, ή ένα νέο αρχείο. Ένα αρχείο μπορεί να αποθηκευτεί σε μορφές JPEG, PNG, JXL και TIFF. - Για JPEG, μπορείτε να επιλέξετε μια τιμή ποιότητας στο εύρος 1-100. Χαμηλότερες τιμές δίνουν μικρότερα αρχεία και μικρότερη ποιότητα εικόνας. Τιμές πάνω από 70 είναι δύσκολο να διακριθούν από το 100 (υψηλότερη ποιότητα, μεγαλύτερο μέγεθος αρχείου). Χρησιμοποιείται η προεπιλεγμένη ποιότητα JPEG εκτός εάν αλλάξετε την τιμή στον διάλογο. Η προεπιλογή προέρχεται από τις {ΡΥΘΜΙΣΕΙΣ}. Δεν θα μπορείτε να δείτε διαφορά μεταξύ ενός αρχείου αποθηκευμένου με ποιότητα 70 και ενός με 100, αλλά η διαφορά στον χώρο αρχείου είναι τεράστια. Οι διαφανείς περιοχές θα είναι μαύρες. Το JPEG δεν υποστηρίζει διαφάνεια. - Τα αρχεία PNG και TIFF συμπιέζονται χωρίς απώλεια ποιότητας και είναι πολύ μεγαλύτερα από τα JPEG. Μπορούν να αποθηκευτούν με 8 ή 16 bit ανά χρώμα. - Εάν είναι επιλεγμένο το 'make current', το αποθηκευμένο αρχείο (νέο όνομα αρχείου) θα γίνει το τρέχον αρχείο. - ^Αντικατάσταση Αρχείου Αποθηκεύστε το τρέχον αρχείο εικόνας πίσω στον εαυτό του. - Τα ^δικαιώματα^ αντιγράφονται από το αρχείο εισόδου. Πατήστε το κουμπί [Αλλαγή] για να επεξεργαστείτε τα δικαιώματα. - - TOPIC: ΜΕΝΟΥ METADATA - - Τα metadata είναι δεδομένα κειμένου που αποθηκεύονται μέσα σε ένα αρχείο εικόνας. Οι ψηφιακές κάμερες δημιουργούν αυτόματα ορισμένα metadata, όπως ημερομηνία και ώρα, τεχνικά δεδομένα σχετικά με την κάμερα και τις παραμέτρους της φωτογραφίας, και δεδομένα τοποθεσίας (εάν η κάμερα διαθέτει δέκτη GPS). Άλλα δεδομένα μπορούν να προστεθούν από τον χρήστη, π.χ. τίτλος, περιγραφή, βαθμολογία, keywords. Το Fotocx μπορεί να αναζητήσει στη συλλογή εικόνων σας χρησιμοποιώντας οποιαδήποτε metadata, μαζί με ονόματα φακέλων και αρχείων ή μερικά ονόματα, παράγοντας μια γκαλερί εικόνων που ταιριάζουν. Στις περισσότερες περιπτώσεις, η αναζήτηση είναι σχεδόν ακαριαία. - - TOPIC: ΠΡΟΒΟΛΗ ΚΥΡΙΩΝ META TOPIC: ΠΡΟΒΟΛΗ ΟΛΩΝ ΤΩΝ META +image: view-metadata.jpg - Η λειτουργία Προβολή Βασικών Meta εμφανίζει τα συνήθως χρήσιμα metadata για το τρέχον αρχείο εικόνας. Αυτό περιλαμβάνει την ημερομηνία και ώρα μιας φωτογραφίας, την ταχύτητα κλείστρου, την εστιακή απόσταση, το μέγεθος εικόνας, το ISO, κ.λπ. Οι ψηφιακές κάμερες αποθηκεύουν αυτά τα δεδομένα στην εικόνα. Τα metadata μπορεί επίσης να περιέχουν δεδομένα που προστέθηκαν από τον χρήστη: keywords, τίτλο ή λεζάντα, περιγραφή, σχόλια που προστέθηκαν από τον φωτογράφο ή μεταγενέστερο επεξεργαστή (μερικές φορές βρίσκονται σε δημοσιευμένες εικόνες). - Εάν μια εικόνα επεξεργαστεί, μια καταγραφή της επεξεργασίας αποθηκεύεται στα metadata. Η Προβολή Βασικών Meta εμφανίζει το ιστορικό των επεξεργασιών που έγιναν. - Η Προβολή Όλων των Meta αναφέρει όλα τα διαθέσιμα metadata, και μπορεί να περιλαμβάνει πάνω από 100 στοιχεία που πιθανώς δεν σας ενδιαφέρουν. - Το κουμπί [Extras] στο παράθυρο Προβολή Βασικών Meta ανοίγει τον διάλογο που φαίνεται στα δεξιά, όπου μπορείτε να προσθέσετε επιπλέον tags στην αναφορά. Οποιοδήποτε tag διαθέσιμο στην αναφορά Προβολή Όλων των Meta μπορεί να προστεθεί στη σύντομη αναφορά. Κάντε κλικ σε ένα tag στην αριστερή στήλη για να το προσθέσετε στη δεξιά στήλη και στην αναφορά. Κάντε κλικ σε ένα tag στη δεξιά στήλη για να το αφαιρέσετε. Κάντε κλικ στην καταχώρηση "Other Tag ..." για να πληκτρολογήσετε οποιοδήποτε όνομα tag δεν περιέχεται στην προεπιλεγμένη λίστα, η οποία περιορίζεται στα πιο πιθανά απαραίτητα tags. - Το Fotocx χρησιμοποιεί αυτά τα tags metadata για επεξεργασία και αναζήτηση εικόνων: • Title - σύντομος τίτλος της εικόνας • Description - περιγραφή της εικόνας • Date/Time Original - ημερομηνία/ώρα φωτογραφίας • Rating - 0 έως 5 αστέρια • Country - από το GPS της κάμερας ή προστίθεται χειροκίνητα • Location - το όνομα EXIF είναι η πόλη • Geotags - latitude/longitude • Keywords - αναγνωριστικά εικόνας από τον χρήστη • Camera data - κατασκευαστής, μοντέλο, φακός • Exposure data - χρόνος, αριθμός F, εστιακή απόσταση, ISO Αυτά τα tags επεξεργάζονται χρησιμοποιώντας τη λειτουργία {ΕΠΕΞΕΡΓΑΣΙΑ ΚΥΡΙΩΝ META}. Οποιαδήποτε άλλα tags μπορούν επίσης να επεξεργαστούν και να αναζητηθούν, χρησιμοποιώντας λιγότερο βολικές μεθόδους που εξηγούνται παρακάτω. - Υπάρχουν επίσης διάφορες λειτουργίες ομαδικής επεξεργασίας για την προσθήκη δεδομένων σε πολλά αρχεία εικόνας ταυτόχρονα. Δείτε {ΜΕΝΟΥ ΜΑΖΙΚΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ}. - - TOPIC: ΕΠΙΣΚΟΠΗΣΗ KEYWORDS Τα αρχεία εικόνας μπορούν να έχουν keywords αναγνώρισης ή ταξινόμησης. Αυτά μπορούν να χρησιμοποιηθούν για την αναζήτηση σε μια μεγάλη συλλογή εικόνων για εικόνες που έχουν τα επιθυμητά keywords. Τυπικά keywords: θέμα, γεγονός, τοποθεσία, πρόσωπα ή αντικείμενα, κ.λπ. Τα keywords βρίσκονται μέσα στα metadata της εικόνας. Τα keywords είναι κανονικά μία λέξη, αλλά μπορεί να χρησιμοποιηθεί μια σύντομη φράση με ενσωματωμένα κενά ή άλλους διαχωριστές. Τα κόμματα και τα ερωτηματικά χρησιμοποιούνται ως διαχωριστές μεταξύ keywords, και επομένως δεν μπορούν να χρησιμοποιηθούν μέσα σε ένα keyword (ένα εξωτερικό πρότυπο). Ένα σύνθετο keyword όπως "arizona scenery" επιτρέπεται, αλλά θα πρέπει να χρησιμοποιήσετε δύο keywords αντ' αυτού για μεγαλύτερη ευελιξία: μπορείτε να αναζητήσετε εικόνες που έχουν το ένα ή και τα δύο keywords. - Όλες οι εικόνες που έχουν ένα επιθυμητό keyword ή keywords μπορούν να βρεθούν γρήγορα και να εμφανιστούν σε ένα παράθυρο γκαλερί. Εάν έχετε χρησιμοποιήσει ονόματα φακέλων και αρχείων με ουσιαστικό τρόπο, μπορείτε επίσης να αναζητήσετε εικόνες χρησιμοποιώντας αυτά τα ονόματα. Μπορείτε επίσης να αναζητήσετε εικόνες κατά ημερομηνία, βαθμολογία, τοποθεσία, και άλλα tags metadata. Αυτά δεν χρειάζεται να επαναλαμβάνονται στα keywords. Δείτε {ΑΝΑΖΗΤΗΣΗ ΕΙΚΟΝΩΝ} παρακάτω. - ^Διαχειριζόμενο Σύστημα Keywords Αυτό είναι κατάλληλο εάν θέλετε να σχεδιάσετε το σύστημα keywords σας πριν προσθέσετε keywords στις εικόνες σας. Σε αυτό το σύστημα, δημιουργείτε έναν περιορισμένο αριθμό κατηγοριών keywords (π.χ. άνθρωποι, τοποθεσίες, αντικείμενα, γεγονότα, τέχνη, τοπία ...). Τα keywords μπορούν να δημιουργηθούν και να ανατεθούν σε μια κατηγορία όπως χρειάζεται όταν τα keywords ανατίθενται σε εικόνες. Σε μια εικόνα δίνεται ένα keyword με το να δείξετε και να κάνετε κλικ στη λίστα διαθέσιμων keywords, η οποία είναι οργανωμένη κατά κατηγορία και αλφαβητικά μέσα σε κάθε κατηγορία. Εάν χρειάζεται ένα νέο keyword, δημιουργείται όταν ανατεθεί για πρώτη φορά σε μια εικόνα. Ο αριθμός των keywords μέσα σε μια κατηγορία θα πρέπει ιδανικά να είναι μικρότερος από περίπου 200, ώστε ο οπτικός εντοπισμός από μια λίστα επιλογής να είναι αρκετά γρήγορος. - ^Πλεονεκτήματα διαχειριζόμενου συστήματος keywords • αποτρέπει ασυνεπή ονόματα keywords (π.χ. 'landscape' και 'scenery') • αποτρέπει εναλλακτικές ορθογραφίες και τυπογραφικά λάθη (π.χ. susan, susy, susna) • αποτρέπει keywords που περιλαμβάνουν άλλα keywords (π.χ. scenery, lake) • η αναζήτηση είναι πιο αξιόπιστη επειδή τα keywords δεν έχουν τα παραπάνω σφάλματα • κατά την ανάθεση keywords, έχετε μια επισκόπηση των διαθέσιμων keywords, αντί για χιλιάδες χαοτικά keywords σε ένα μη διαχειριζόμενο σύστημα - Η επιλογή keywords από μια μεγάλη λίστα μπορεί να είναι αργή. Αυτό μετριάζεται με 3 τρόπους: • Έως και περίπου 10 πιο πρόσφατα χρησιμοποιημένα keywords εμφανίζονται στον διάλογο επεξεργασίας metadata, όπου μπορούν εύκολα να φανούν και να επιλεγούν. Δεδομένου ότι μια σειρά φωτογραφιών που τραβήχτηκαν την ίδια στιγμή θα μοιράζονται πιθανώς πολλά keywords, η προσθήκη keywords γίνεται πιο εύκολη και γρηγορότερη. • Μπορείτε απλά να αρχίσετε να πληκτρολογείτε το επιθυμητό όνομα keyword. Μια αναδυόμενη λίστα με keywords που ταιριάζουν εμφανίζεται μόλις υπάρχουν μόνο λίγες πιθανές αντιστοιχίες. Μπορείτε στη συνέχεια να κάνετε κλικ στο επιθυμητό keyword για να το προσθέσετε στην εικόνα. Εάν δεν υπάρχουν keywords που να ταιριάζουν, έχετε την επιλογή να προσθέσετε το νέο keyword στη λίστα ορισμένων keywords. • Μπορείτε να επιλέξετε μια κατηγορία για να εμφανιστεί μια μικρότερη λίστα επιλογής. - Εάν τα keywords είναι ευρέως ορισμένα και λιγότερα σε αριθμό, τα αποτελέσματα αναζήτησης για keywords θα είναι μεγαλύτερα, αλλά η εύρεση των επιθυμητών εικόνων οπτικά μπορεί να είναι αρκετά γρήγορη. Η φυσική σειρά αρχείων διατηρείται: αρχεία εικόνας που βρίσκονται μαζί στους φακέλους τους θα εμφανίζονται επίσης μαζί στα αποτελέσματα αναζήτησης. - Οι εικόνες που κατεβάζονται από το internet συχνά περιέχουν keywords. Αυτά φυσικά δεν έχουν καμία οργάνωση και είναι συλλογικά χαοτικά. Εάν χρησιμοποιείτε ένα διαχειριζόμενο σύστημα keywords, είναι καλύτερο να ελέγξετε τέτοιες εικόνες και να καθαρίσετε τα keywords ώστε να συμμορφώνονται με το σύστημά σας, ή να τα διαγράψετε. Όποια νέα keywords υπάρχουν θα προστεθούν αυτόματα στην κατηγορία "nocatg". Εάν παρατηρήσετε ανεπιθύμητα keywords στη λίστα keywords σας, χρησιμοποιήστε την {ΑΝΑΖΗΤΗΣΗ ΕΙΚΟΝΩΝ} κατά keyword για να βρείτε τις εικόνες με ανεπιθύμητα keywords ώστε να μπορούν να διορθωθούν ή να αφαιρεθούν. - ^Τυχαίο Σύστημα Keywords Μπορεί να προτιμάτε να επινοείτε keywords όπως χρειάζεται χωρίς κάποιο συγκεκριμένο σύστημα κατά νου. Ή μπορεί ήδη να έχετε χιλιάδες keywords, καθιστώντας δύσκολη τη μετατροπή σε ένα διαχειριζόμενο σύστημα keywords (αλλά όχι αδύνατη: το Fotocx μπορεί να μετατρέψει μαζικά ονόματα keywords). Σε αυτή την περίπτωση, μπορείτε απλά να πληκτρολογήσετε keywords στις εικόνες σας, δημιουργώντας νέα keywords όπως χρειάζεται. Υπάρχει ακόμα κάποια δυνατότητα διατήρησης της οργάνωσης των keywords: τα υπάρχοντα keywords που ταιριάζουν με τους χαρακτήρες που εισάγετε εμφανίζονται μόλις υπάρχουν μόνο λίγες πιθανές αντιστοιχίες. Παράδειγμα: πληκτρολογείτε "new" και εμφανίζεται μια λίστα keywords: New York, New Delhi, Newman ... Εάν ένα από αυτά είναι η πρόθεσή σας, κάντε κλικ πάνω του για να επιλέξετε το keyword. Εάν όχι, συνεχίζετε να πληκτρολογείτε και τελικά πατάτε Enter για να δημιουργήσετε ένα νέο keyword. Κατά την αναζήτηση εικόνων για keywords, μπορείτε να πληκτρολογήσετε τα επιθυμητά ονόματα keywords ή να τα επιλέξετε από τη λίστα διαθέσιμων keywords. Εμφανίζονται τα διαθέσιμα keywords που ταιριάζουν με τα πρώτα λίγα γράμματα που πληκτρολογείτε, και μπορείτε να επιλέξετε από αυτή τη λίστα. Δεν μπορείτε να εισαγάγετε ένα keyword αναζήτησης που δεν υπάρχει πουθενά στις εικόνες σας. Ένα τυχαίο σύστημα keywords θα οδηγήσει πιθανώς σε χιλιάδες keywords. Αυτό μπορεί να μην είναι πολύ χρήσιμο. - - TOPIC: GEOTAGS OVERVIEW Οι σύγχρονες κάμερες μπορούν να καταγράψουν την τοποθεσία κάθε φωτογραφίας, χρησιμοποιώντας έναν εσωτερικό δέκτη GPS. Το latitude, longitude (και πιθανώς η πόλη/τοποθεσία και η χώρα) καταγράφονται στα metadata EXIF του αρχείου εικόνας. Η λειτουργία {ΕΠΕΞΕΡΓΑΣΙΑ ΚΥΡΙΩΝ META} επιτρέπει επίσης την εισαγωγή ή αναθεώρηση δεδομένων τοποθεσίας. Οι τοποθεσίες μπορούν επίσης να καθοριστούν κάνοντας κλικ σε έναν παγκόσμιο χάρτη με δυνατότητα zoom. Λειτουργίες για την εύρεση εικόνων για μια καθορισμένη τοποθεσία ή περιοχή: • {ΑΝΑΖΗΤΗΣΗ ΕΙΚΟΝΩΝ}: Αναζήτηση κατά όνομα τοποθεσίας (επίσης πολλαπλά ονόματα, μερικές αντιστοιχίες). • {ΤΟΠΟΘΕΣΙΕΣ/ΗΜΕΡΟΜΗΝΙΕΣ}: Αναζήτηση κατά ομάδες χώρας, τοποθεσίας, και ημερομηνίας • Εικόνες κατά Τοποθεσία Χάρτη: Κάντε κλικ σε έναν δείκτη χάρτη για να εμφανίσετε όλες τις εικόνες στην τοποθεσία του δείκτη. - Τα ονόματα τοποθεσιών (πόλη ή άλλο όνομα τόπου, και χώρα) από το GPS της κάμερας δεν είναι τυποποιημένα και μπορεί να είναι χαοτικά (π.χ. Munich, München, MONACO). Πώς να αντιμετωπίσετε αυτό συζητείται παρακάτω. - - TOPIC: ΕΠΕΞΕΡΓΑΣΙΑ ΚΥΡΙΩΝ META +image: edit-meta.jpg - Η λειτουργία Επεξεργασία Βασικών Meta χρησιμοποιείται για την προσθήκη βασικών metadata σε μια εικόνα. Παρακαλούμε διαβάστε την {ΕΠΙΣΚΟΠΗΣΗ KEYWORDS} και την {GEOTAGS OVERVIEW} (παραπάνω) πριν χρησιμοποιήσετε την Επεξεργασία Βασικών Meta. - Η Επεξεργασία Βασικών Meta χρησιμοποιείται για την επεξεργασία των πιο συχνά χρησιμοποιούμενων metadata: ημερομηνία και ώρα εικόνας, βαθμολογία, τίτλος, περιγραφή, δεδομένα τοποθεσίας, και keywords. Ο διάλογος εμφανίζει αρχικά δεδομένα για την τρέχουσα εικόνα. Αφού κάνετε προσθήκες ή αλλαγές, πατήστε [Εφαρμογή] για να ενημερώσετε το αρχείο εικόνας. Δεν υπάρχει αυτόματη δημιουργία εκδόσεων αρχείου για αλλαγές metadata, αλλά μπορείτε να χρησιμοποιήσετε την Αποθήκευση Αρχείου > Νέα Έκδοση εάν το θέλετε. - Ο διάλογος εμφανίζει τα metadata για την τρέχουσα εικόνα στην Προβολή Αρχείου, ή για ένα thumbnail στο οποίο έγινε κλικ στην Προβολή Γκαλερί. Ο διάλογος επεξεργασίας ενημερώνεται αυτόματα όταν ανοίγεται μια νέα εικόνα ή γίνεται κλικ σε νέο thumbnail. - Η ημερομηνία της εικόνας, εάν είναι διαθέσιμη, εμφανίζεται ως Image Date. Αυτή μπορεί να εισαχθεί εάν λείπει, ή να αλλαχθεί. Μπορείτε να εισαγάγετε μια πλήρη ημερομηνία στη μορφή yyyy:mm:dd ή μια συντομότερη μορφή yyyy ή yyyy:mm. Ένας μήνας/ημέρα που λείπει είναι λογικά ισοδύναμος με 01:01 όταν συγκρίνεται με ένα κατώτερο όριο για αναζήτηση, ή 12:31 όταν συγκρίνεται με ένα ανώτερο όριο. Το κουμπί [Προηγ.] συμπληρώνει την ημερομηνία από τα προηγούμενα δεδομένα που εισήχθησαν. Αυτό επιτρέπει την εύκολη χρονολόγηση μιας σειράς εικόνων. Εάν η ώρα είναι σημαντική, μπορείτε να προσθέσετε μια ώρα χρησιμοποιώντας τη μορφή hh:mm[.ss]. Η πλήρης μορφή καταχώρησης είναι: yyyy:mm:dd hh:mm:ss - Μπορείτε να εισαγάγετε έναν τίτλο, περιγραφή, και μια βαθμολογία (0-5 αστέρια) για την εικόνα. Για να επεξεργαστείτε τον τίτλο ή την περιγραφή, πατήστε το αντίστοιχο κουμπί [επεξεργασία]. Αυτό θα εμφανίσει έναν επεξεργαστή κειμένου με ένα μεγάλο όριο στο μέγεθος του κειμένου. Μπορείτε να χρησιμοποιήσετε το πλήκτρο [enter] για μια σκόπιμη αλλαγή γραμμής. Στο Fotocx, αυτές οι αλλαγές γραμμής θα λειτουργήσουν· σε άλλους προβολείς εικόνων, μπορεί να αντικατασταθούν με τελείες. - Τα υπάρχοντα keywords εμφανίζονται στο Image Keywords. Τα διαθέσιμα keywords εμφανίζονται στο παράθυρο Defined Keywords παρακάτω. Ένα από αυτά τα keywords μπορεί να προστεθεί στην εικόνα κάνοντας κλικ πάνω του. Ένα keyword μπορεί να διαγραφεί από την εικόνα κάνοντας κλικ πάνω του στο Image Keywords. Τα πρόσφατα προστεθέντα keywords εμφανίζονται στο Recent Keywords. Αυτό είναι μια διευκόλυνση για να γίνει ευκολότερη η προσθήκη keywords σε μια νέα ομάδα εικόνων, αφού πολλά από τα ίδια keywords θα χρησιμοποιηθούν ξανά. Δείξτε και κάντε κλικ με τον ίδιο τρόπο. - Εάν η λίστα ορισμένων keywords είναι μεγάλη, μπορεί να είναι ευκολότερο να πληκτρολογήσετε το επιθυμητό keyword στο Enter Keyword. Τα υπάρχοντα keywords που ταιριάζουν με ό,τι έχετε πληκτρολογήσει μέχρι στιγμής εμφανίζονται στο Matching Keywords, και μπορείτε να κάνετε κλικ σε ένα από αυτά για να προσθέσετε το keyword στην εικόνα. Εάν το keyword εισόδου είναι νέο (δεν εμφανίζεται κανένα ταιριαστό keyword), πατήστε [προσθήκη νέου keyword] όταν το keyword είναι πλήρες. Θα προστεθεί στην εικόνα και στη λίστα ορισμένων keywords με κατηγορία "nocatg". - Εάν χρησιμοποιείτε κατηγορίες keywords, μπορείτε να επιλέξετε μια κατηγορία, και μόνο εκείνα τα keywords θα εμφανιστούν στη λίστα ορισμένων keywords. - Το κουμπί [Εφαρμογή] γράφει τα δεδομένα στο αρχείο εικόνας και στο αρχείο ευρετηρίου metadata που χρησιμοποιείται για την αναζήτηση εικόνων. - Το κουμπί [Προηγ.] (στο κάτω μέρος του διαλόγου) μπορεί να χρησιμοποιηθεί για να φορτώσετε όλα τα διαθέσιμα δεδομένα από την προηγούμενη εικόνα που προβλήθηκε ή επεξεργάστηκε. Αυτό μπορεί να χρησιμοποιηθεί για να επιταχύνει την επεξεργασία μιας ομάδας εικόνων που μοιράζονται πολλά από τα ίδια δεδομένα. - ^Προσθήκη Geotags Υπάρχουν διάφοροι τρόποι προσθήκης ονομάτων τοποθεσιών και γεωσυντεταγμένων στον διάλογο {ΕΠΕΞΕΡΓΑΣΙΑ ΚΥΡΙΩΝ META}. - GPS Κάμερας Ο αισθητήρας GPS της κάμεράς σας μπορεί να έχει εισαγάγει ονόματα τοποθεσιών και γεωσυντεταγμένες. Η γλώσσα μπορεί να μην είναι αυτή που θέλετε, ή μπορεί να χρησιμοποιούνται όλα κεφαλαία γράμματα, ή κάποιο άλλο χάος. Χρησιμοποιήστε το κουμπί [clear] για να ξεκινήσετε από την αρχή, και εισαγάγετε το νέο κείμενο. - Κουμπί [Εύρεση] Αναζητήστε μια τοποθεσία που υπάρχει οπουδήποτε στα αρχεία εικόνας σας ή σε μια τεράστια λίστα γνωστών τοποθεσιών (worldcities.txt). Εισαγάγετε μερικούς αρχικούς χαρακτήρες στο Location και πατήστε [Εύρεση]. Εάν εμφανιστεί μια λίστα επιλογής με ταιριαστές τοποθεσίες, επιλέξτε μία. Εάν δεν εμφανιστεί τίποτα, χρησιμοποιήστε το [Χάρτης] για να κάνετε κλικ σε μια τοποθεσία στον χάρτη. Αναθεωρήστε τα ονόματα τοποθεσίας και χώρας εάν χρειάζεται. Αυτή η τοποθεσία είναι πλέον γνωστή και διαθέσιμη για επιλογή. - Κουμπί [Προηγούμενο] Εάν η εικόνα που επεξεργάζεστε έχει τα ίδια δεδομένα τοποθεσίας με την προηγουμένως επεξεργασμένη εικόνα, πατήστε [Προηγούμενο] για να συμπληρώσετε τα δεδομένα τοποθεσίας που χρησιμοποιήθηκαν πριν. - Μπορείτε να χρησιμοποιήσετε τα {ΜΑΖΙΚΑ GEOTAGS} για να προσθέσετε δεδομένα τοποθεσίας σε πολλά αρχεία εικόνας ταυτόχρονα. - - TOPIC: ΕΠΕΞΕΡΓΑΣΙΑ ΟΠΟΙΟΥΔΗΠΟΤΕ META +image: edit-any-metadata.png - Αυτός είναι ένας διάλογος για την επεξεργασία οποιωνδήποτε metadata για το τρέχον αρχείο εικόνας. Τα πιο συνηθισμένα tags προς επεξεργασία αναφέρονται στα αριστερά. Πατήστε το κουμπί [Πλήρης Λίστα] για να λάβετε μια λίστα με όλα τα διαθέσιμα tags για το τρέχον αρχείο εικόνας (μπορεί να υπάρχουν εκατοντάδες από αυτά). Πατήστε [Σύντομη Λίστα] για να επιστρέψετε στη λίστα κοινών tags. Κάντε κλικ σε ένα tag στη λίστα για να ανακτήσετε την τρέχουσα τιμή του tag. Αλλάξτε την τιμή εάν το θέλετε και πατήστε [ενημέρωση]. Για να επεξεργαστείτε ένα όνομα tag που δεν βρίσκεται στη λίστα, εισαγάγετε το όνομα του tag και πατήστε [ανάκτηση] για να ανακτήσετε την τρέχουσα τιμή, εάν υπάρχει. Στη συνέχεια εισαγάγετε ή αλλάξτε την τιμή και πατήστε [ενημέρωση]. Για να διαγράψετε ένα tag, πατήστε [διαγραφή]. Μπορείτε να εισαγάγετε το όνομα του tag με πεζά γράμματα και με ή χωρίς κενά, π.χ. "Subject Distance" και "subjectdistance" θα λειτουργήσουν και τα δύο. Ορισμένα tags δεν μπορούν να αλλαχθούν, π.χ. το 'image width' είναι το πλάτος της εικόνας σε pixel, το οποίο μπορεί να αλλαχθεί μόνο αλλάζοντας το πλάτος της εικόνας σε pixel. Η πηγή για τη σύντομη λίστα είναι το αρχείο κειμένου /meta_picklist. Μπορείτε να προσθέσετε ή να αφαιρέσετε tags από αυτή τη λίστα. - - TOPIC: ΔΙΑΓΡΑΦΗ META Καθορίστε το όνομα του tag προς διαγραφή, ή επιλέξτε All. Τα metadata διαγράφονται. Χρησιμοποιήστε το All για να καθαρίσετε μια εικόνα από οποιαδήποτε αναγνωριστική πληροφορία που μπορεί να υπάρχει. Ορισμένα tags δεν είναι διαγράψιμα, π.χ. το File Name. - - TOPIC: ΑΝΤΙΓΡΑΦΗ META Οι συνδυασμένες εικόνες που δημιουργούνται με το Fotocx (HDR, πανόραμα, mashup ...) δεν θα περιέχουν metadata από προεπιλογή. Χρησιμοποιήστε αυτή τη λειτουργία για να αντιγράψετε metadata από μία από τις εικόνες εισόδου, ή από οποιαδήποτε άλλη εικόνα. Χρησιμοποιήστε τα κουμπιά [Περιήγηση] για να επιλέξετε ένα αρχείο ως πηγή των metadata και ένα αρχείο που θα λάβει τα metadata ("target file" στον διάλογο). - - TOPIC: ΔΙΟΡΘΩΣΗ META Χρησιμοποιήστε αυτή τη λειτουργία εάν έχετε ένα αρχείο εικόνας που παράγει ένα μήνυμα σφάλματος όταν προσπαθείτε να επεξεργαστείτε τα metadata. Θα διαγράψει τα κακοδιατυπωμένα metadata και θα διατηρήσει τα υπόλοιπα. - - TOPIC: ΔΙΑΧΕΙΡΙΣΗ KEYWORDS +image: manage-keywords.png - Δημιουργήστε keywords και προαιρετικά ομαδοποιήστε τα σε κατηγορίες. Μπορείτε να αναθέσετε κατηγορίες σε keywords για να βοηθήσετε στην οργάνωσή τους και τον γρηγορότερο εντοπισμό τους κατά την προσθήκη keywords σε εικόνες. Είναι προαιρετικές και δεν παίζουν κανέναν ρόλο στην αναζήτηση keywords: μόνο το keyword αποθηκεύεται σε μια εικόνα, όχι η κατηγορία του. Τυπικές κατηγορίες είναι άνθρωποι, τοποθεσίες, αντικείμενα, γεγονότα, τοπία, κτίρια, τέχνη, κ.λπ. Για να προσθέσετε ένα νέο keyword με μια νέα κατηγορία, εισαγάγετε την κατηγορία και το keyword, στη συνέχεια κάντε κλικ στο [create]. Εάν η κατηγορία είναι κενή, το keyword θα ανατεθεί στο "nocatg". Για να αναθέσετε ένα keyword σε διαφορετική κατηγορία, κάντε κλικ σε μια κατηγορία (έντονο κείμενο) ή εισαγάγετε μια νέα, κάντε κλικ στο keyword, και πατήστε [create]. Το keyword θα μετακινηθεί από την παλιά στη νέα κατηγορία. Για να διαγράψετε ένα keyword, κάντε κλικ στο keyword και πατήστε [διαγραφή]. Τα keywords που χρησιμοποιούνται σε εικόνες αλλά δεν έχουν ανατεθεί σε κατηγορία θα εμφανίζονται κάτω από το "nocatg". Μια Κατηγορία χωρίς ανατεθειμένα keywords μπορεί να διαγραφεί - κάντε κλικ στην κατηγορία, καθαρίστε το όνομα του keyword εάν υπάρχει, πατήστε [διαγραφή]. - Σημείωση: ένα νεοδημιουργημένο keyword προστίθεται στο τέλος της λίστας keywords για την κατηγορία του. Την επόμενη φορά που θα εκκινηθεί το Fotocx, όλες οι κατηγορίες και οι λίστες keywords τους ταξινομούνται αλφαβητικά, εκτός από το ότι το "nocatg" είναι πάντα τελευταίο. - - TOPIC: ΛΕΖΑΝΤΕΣ +image: choose-captions.png - ^Μενού Choose Captions Επιλέξτε ποια tags metadata θα χρησιμοποιηθούν για τις λεζάντες κειμένου που εμφανίζονται στην πάνω αριστερή γωνία της εικόνας σε λειτουργία προβολής αρχείου. - ^Μενού Toggle Captions Εναλλάξτε την εμφάνιση των λεζαντών ON ή OFF. Αναθέστε μια συντόμευση πληκτρολογίου για γρήγορη ενεργοποίηση ή απενεργοποίηση της εμφάνισης λεζαντών. - ^Σημείωση:^ η μετακίνηση του ποντικιού στην πάνω αριστερή γωνία μιας εικόνας σε προβολή αρχείου θα εμφανίσει τον τίτλο και την περιγραφή σε μια αναδυόμενη εικόνα. Η εικόνα εξαφανίζεται όταν το ποντίκι απομακρυνθεί. - - TOPIC: ΤΟΠΟΘΕΣΙΕΣ/ΗΜΕΡΟΜΗΝΙΕΣ +image: image-locations.jpg - Αυτός είναι ένας γρήγορος τρόπος εύρεσης όλων των φωτογραφιών που τραβήχτηκαν σε μια δεδομένη τοποθεσία ή τοποθεσία και εύρος ημερομηνιών. Στον διάλογο, επιλέξτε από τις δύο επιλογές: συμπερίληψη όλων των εικόνων στην αναφορά, ή συμπερίληψη μόνο των εικόνων που βρέθηκαν από την προηγούμενη λειτουργία Αναζήτησης. Στη συνέχεια επιλέξτε το επιθυμητό επίπεδο ομαδοποίησης: χώρα χώρα και τοποθεσία χώρα και ημερομηνία χώρα και τοποθεσία και ημερομηνία ημερομηνία και χώρα ημερομηνία και χώρα και τοποθεσία - Εάν συμπεριλαμβάνεται ημερομηνία, επιλέξτε ένα εύρος ημερών για ενοποίηση: φωτογραφίες με ημερομηνίες εντός του εύρους θα ομαδοποιηθούν κάτω από την πρώτη ημερομηνία. Πατήστε [proceed] για να λάβετε μια αναφορά που δείχνει το πλήθος των εικόνων σε κάθε ομάδα: κατά χώρα, χώρα και τοποθεσία, κ.λπ. Αυτή είναι επίσης η σειρά ταξινόμησης. Στο παραπάνω παράδειγμα, 28 φωτογραφίες είναι από τη Νέα Ζηλανδία στις 2004.11.02. Κάντε κλικ σε μια γραμμή της αναφοράς για να λάβετε μια γκαλερί thumbnails αυτών των εικόνων. - - TOPIC: ΧΡΟΝΟΓΡΑΜΜΗ +image: timeline-report.jpg - Αυτή η αναφορά παράγει μια χρονογραμμή του πλήθους εικόνων ανά μήνα. Επιλέξτε από τις δύο επιλογές: συμπερίληψη όλων των εικόνων στην αναφορά, ή συμπερίληψη μόνο των εικόνων που βρέθηκαν από την προηγούμενη λειτουργία Αναζήτησης. Κάντε κλικ σε ένα έτος και μήνα στην προκύπτουσα αναφορά για να λάβετε μια γκαλερί thumbnails όλων των εικόνων με ημερομηνία φωτογραφίας (EXIF) στον επιλεγμένο μήνα. Το παραπάνω παράδειγμα δείχνει 208 εικόνες για τον Οκτ. 2017. Το έτος 'null' είναι για εικόνες χωρίς ημερομηνία φωτογραφίας. - - TOPIC: TAGS METADATA Αυτή η λειτουργία βρίσκει όλα τα αρχεία εικόνας που χρησιμοποιούν ένα καθορισμένο tag metadata και τιμή. Επιλέξτε ένα tag από την αναδυόμενη λίστα: rating, keywords, title, description, camera, επιπλέον ευρετηριασμένα metadata - δείτε {ΕΥΡΕΤΗΡΙΑΣΗ ΑΡΧΕΙΩΝ}. Εμφανίζεται μια λίστα διαθέσιμων τιμών tag, μαζί με τον αριθμό των αρχείων εικόνας που χρησιμοποιούν αυτή την τιμή tag. Για τα 'title' και 'description', εμφανίζονται μόνο οι πρώτοι 60 χαρακτήρες, και αναφέρονται όλα τα αρχεία που χρησιμοποιούν τιμές tag που ταιριάζουν με αυτούς τους αρχικούς 60 χαρακτήρες. Για το 'camera' η τιμή αντιστοίχισης είναι ένας συνδυασμός κατασκευαστή, μοντέλου, και φακού. - - TOPIC: ΑΥΤΟΜΑΤΗ ΑΝΑΖΗΤΗΣΗ Αυτή η λειτουργία μπορεί να χρησιμοποιηθεί από αρχεία shell script για την εξαγωγή αρχείων εικόνας που πληρούν οποιοδήποτε από τα κριτήρια επιλογής διαθέσιμα κατά τη χρήση της λειτουργίας Αναζήτηση Εικόνων (δείτε παρακάτω). Πρώτα, χρησιμοποιήστε τη λειτουργία Αναζήτηση Εικόνων για να ορίσετε τα επιθυμητά κριτήρια επιλογής (π.χ. ονόματα φακέλων/αρχείων, ημερομηνίες, keywords, ή άλλα metadata). Χρησιμοποιήστε το κουμπί [αποθήκευση] για να αποθηκεύσετε τα κριτήρια σε ένα αρχείο ρυθμίσεων. Χρησιμοποιήστε την ακόλουθη εντολή για να εκκινήσετε το Fotocx και να εκτελέσετε την αναζήτηση: $ fotocx -m autosearch . Η έξοδος πηγαίνει στο /search_results. - - TOPIC: ΑΝΑΖΗΤΗΣΗ ΕΙΚΟΝΩΝ Χρησιμοποιήστε τη λειτουργία Αναζήτηση Εικόνων για να βρείτε εικόνες που έχουν οποιαδήποτε επιθυμητά metadata (ημερομηνία, keywords, τοποθεσία ...). Ένα αρχείο ευρετηρίου metadata χρησιμοποιείται για την αναζήτηση, το οποίο καθιστά δυνατή την αναζήτηση χιλιάδων εικόνων ανά δευτερόλεπτο. - Υπάρχουν δύο μορφές αναφοράς: μια γκαλερί thumbnails που δείχνει όλες τις εικόνες που ταιριάζουν με τα κριτήρια αναζήτησης, ή μια αναφορά metadata που συνδυάζει thumbnails με κείμενο metadata. Εδώ είναι ένα παράδειγμα της μορφής αναφοράς metadata: +image: search-images-metadata.jpg - ^Διάλογος Αναζήτησης +image: search-images.jpg - Στον διάλογο, επιλέξτε ποιες εικόνες θα αναζητηθούν, είτε όλες (all images) είτε το τρέχον σύνολο, δηλαδή τις εικόνες στην τρέχουσα γκαλερί, η οποία μπορεί να είναι φάκελος, άλμπουμ, ή τα αποτελέσματα μιας προηγούμενης αναζήτησης εικόνων. - Στη συνέχεια, επιλέξτε τι να κάνετε με τις εικόνες που ταιριάζουν και βρέθηκαν: το 'new set' σημαίνει αντικατάσταση του τρέχοντος συνόλου με τις εικόνες που βρέθηκαν, το 'add' σημαίνει προσθήκη τους στο τρέχον σύνολο (γκαλερί), και το 'remove' σημαίνει αφαίρεσή τους από το τρέχον σύνολο. Για να αφαιρέσετε εικόνες, πρέπει να αναζητήσετε το τρέχον σύνολο. - Για αρχεία που ταιριάζουν με τα κριτήρια επιλογής, μπορείτε επιπλέον να καθορίσετε ποιες εκδόσεις επιλέγονται: original, last version, ή all versions. Το 'original' σημαίνει την πρωτότυπη ή μη τροποποιημένη εικόνα (ή την πρώτη έκδοση εάν το πρωτότυπο δεν αποθηκεύτηκε). Το 'last version' σημαίνει τη νεότερη ή τελευταία επεξεργασμένη διαθέσιμη έκδοση. Το 'all versions' σημαίνει ότι θα ανακτηθούν το πρωτότυπο και όλες οι εκδόσεις. - Επιλέξτε τον επιθυμητό τύπο αναφοράς. Η αναφορά γκαλερί είναι μια σελίδα εικόνων thumbnail, όσο μεγάλη χρειάζεται για να χωρέσει όλες τις εικόνες που ταιριάζουν με τα κριτήρια αναζήτησης. Η αναφορά metadata έχει τόσο εικόνες thumbnail όσο και μια λίστα από tags metadata δίπλα σε κάθε thumbnail. Αυτά περιλαμβάνουν τα τυπικά tags (ημερομηνία, βαθμολογία, keywords, geotags, τίτλος, περιγραφή) και οποιαδήποτε άλλα tags metadata προσθέσατε στη λίστα επιλογής tags (δείτε παρακάτω). - Εισαγάγετε τα κριτήρια αναζήτησής σας. Επιλέξτε τα επιθυμητά keywords, ημερομηνίες, βαθμολογίες αστεριών, λέξεις που περιέχονται σε κείμενο (τίτλος ή περιγραφή εικόνας), ονόματα αρχείων ή φακέλων, και ονόματα τοποθεσιών. Δείτε περισσότερες λεπτομέρειες παρακάτω. - Τα διαθέσιμα keywords εμφανίζονται στο Defined Keywords και μπορούν να επιλεγούν με το να δείξετε και να κάνετε κλικ. Εάν η λίστα ορισμένων keywords είναι μεγάλη, μπορεί να είναι ευκολότερο να αρχίσετε να πληκτρολογείτε ένα keyword στο 'enter keyword'. Τα υπάρχοντα keywords που ταιριάζουν με ό,τι πληκτρολογήθηκε μέχρι στιγμής θα εμφανιστούν στη λίστα 'matches', και μπορείτε να κάνετε κλικ σε ένα από αυτά για να προσθέσετε το keyword στη λίστα αναζήτησης. - Εάν χρησιμοποιείτε κατηγορίες keywords, μπορείτε να επιλέξετε μια κατηγορία, και μόνο εκείνα τα keywords θα εμφανιστούν στη λίστα ορισμένων keywords. - Μπορεί να εισαχθεί ένα εύρος ημερομηνιών για να περιοριστεί η αναζήτηση σε εικόνες εντός του εύρους ημερομηνιών. Επιλέξτε ημερομηνία φωτογραφίας (από την κάμερα) ή ημερομηνία αρχείου (ημερομηνία δημιουργίας ή τελευταίας τροποποίησης). Η μορφή είναι yyyy:mm:dd. Επιλέγονται εικόνες που έχουν ημερομηνία ίση ή μεταγενέστερη της πρώτης ημερομηνίας, εάν υπάρχει, και ίση ή προγενέστερη της δεύτερης ημερομηνίας, εάν υπάρχει. Ο μήνας/ημέρα που λείπει έχει προεπιλογή 01/01 για το κατώτερο όριο ημερομηνίας και 12/31 για το ανώτερο όριο. Οι ώρες μπορούν προαιρετικά να καθοριστούν χρησιμοποιώντας τη μορφή yyyy:mm:dd hh:mm. Οι ώρες που λείπουν έχουν προεπιλογή 00:00 και 23:59. - Για να αναζητήσετε εικόνες χωρίς ημερομηνία φωτογραφίας EXIF (π.χ. σαρωμένες εικόνες), χρησιμοποιήστε "null" στην πρώτη είσοδο ημερομηνίας. - Μπορεί να εισαχθεί ένα ζεύγος βαθμολογιών αστεριών για να περιοριστούν τα αποτελέσματα σε εικόνες με βαθμολογία εντός του δεδομένου εύρους. Μια χαμηλή τιμή που λείπει υπονοεί 0 αστέρια, και μια υψηλή τιμή που λείπει σημαίνει την υψηλότερη βαθμολογία, 5 αστέρια. - Μπορούν να αναζητηθούν ονόματα φακέλων και αρχείων. Στο πεδίο search file names, εισαγάγετε οποιονδήποτε αριθμό ονομάτων που χρησιμοποιούνται για τους φακέλους εικόνων και τα ονόματα αρχείων σας, διαχωρισμένα με κόμματα. Μια είσοδος "egypt cairo" θα ταιριάξει με όλα τα ονόματα φακέλων ή αρχείων εικόνας που περιέχουν οποιαδήποτε από αυτές τις συμβολοσειρές. Θα ταιριάξουν επίσης υποσυμβολοσειρές. Τα πεζά/κεφαλαία δεν έχουν σημασία. - Μπορούν να αναζητηθούν ο τίτλος και η περιγραφή εικόνας. Εισαγάγετε τις λέξεις προς αναζήτηση στο πεδίο search title/desc, διαχωρισμένες με κόμματα. Αυτές θα αντιστοιχιστούν με κάθε λέξη στον τίτλο και την περιγραφή όλων των εικόνων, και επιλέγονται οι εικόνες που ταιριάζουν. Τα πεζά/κεφαλαία δεν έχουν σημασία. - Για να αναζητήσετε τοποθεσίες, εισαγάγετε ένα ή περισσότερα ονόματα πόλης/τοποθεσίας ή χώρας στο πεδίο search locations, διαχωρισμένα με κόμματα. Θα επιλεγούν μόνο τα αρχεία εικόνας με geotags που ταιριάζουν με μία από τις εισαγμένες τοποθεσίες. Μια τοποθεσία μπορεί να είναι πόλη, πάρκο ή άλλο γεωγραφικό όνομα (ό,τι αποθηκεύεται στα πεδία metadata 'City' και 'Country'). Τα πεζά/κεφαλαία δεν έχουν σημασία. - Τα κουμπιά επιλογής 'all' και 'any' εφαρμόζονται σε keywords, κείμενο, ονόματα αρχείων, και τοποθεσίες. Μπορείτε να επιλέξετε εικόνες που έχουν ΟΛΕΣ τις εισαγμένες συμβολοσειρές, ή ΟΠΟΙΑΔΗΠΟΤΕ από τις εισαγμένες συμβολοσειρές. Παράδειγμα: εάν το πεδίο αναζήτησης τοποθεσίας είναι "new york" και είναι επιλεγμένο το "any", θα συμπεριληφθούν εικόνες από τη Νέα Ζηλανδία και το York της Αγγλίας. Εάν είναι επιλεγμένο το "all", θα συμπεριληφθούν μόνο εικόνες που βρίσκονται στη Νέα Υόρκη. - Εάν θέλετε να βρείτε εικόνες με δεδομένα που λείπουν, μπορείτε να εισαγάγετε "null" ως τιμή αντιστοίχισης. - ^Αναζήτηση Επιπλέον Metadata Χρησιμοποιώντας τις εισόδους του διαλόγου 'tagname', 'condition', και 'match values' μπορείτε να καθορίσετε επιπλέον tags metadata για χρήση ως κριτήρια επιλογής, ή για προσθήκη στην έξοδο της αναφοράς εάν επιλεγεί ο τύπος αναφοράς "metadata". Τα διαθέσιμα tags για ένα δεδομένο αρχείο εικόνας μπορούν να εμφανιστούν με την {ΠΡΟΒΟΛΗ ΟΛΩΝ ΤΩΝ META}. Αυτά περιλαμβάνουν πολλά tags που δεν υπάρχουν στον κύριο διάλογο. Η λίστα επιλογής προέρχεται από το αρχείο κειμένου /meta_picklist. Μπορείτε να προσθέσετε tags σε αυτό το αρχείο εάν το θέλετε. Μπορείτε να χρησιμοποιήσετε tags που υπάρχουν επίσης στον κύριο διάλογο. Το πλεονέκτημα εδώ είναι ότι μπορεί να χρησιμοποιηθεί πιο ευέλικτη λογική αντιστοίχισης. - Η λογική αντιστοίχισης μπορεί να επιλεγεί για κάθε tag metadata. ^μέθοδος αντιστοίχισης τιμή αντιστοίχισης για επιλογή • report οποιαδήποτε τιμή, επίσης απούσα • reportx τιμή που δεν λείπει • matches τιμές κειμένου διαχωρισμένες με κόμμα • contains ίδιο, με αντιστοίχιση υποσυμβολοσειράς • number = ίσες τιμές • number => ίσες ή μεγαλύτερες τιμές • number <= ίσες ή μικρότερες τιμές - Τα κουμπιά [X] στη δεξιά πλευρά μπορούν να χρησιμοποιηθούν για την εκκαθάριση μεμονωμένων tags αναζήτησης metadata. - ^Κουμπιά Διαλόγου Τα [Φόρτωση] και [Αποθήκευση] μπορούν να χρησιμοποιηθούν για τη φόρτωση ή αποθήκευση κριτηρίων αναζήτησης από ένα αρχείο. Το [Εκκαθάριση] θα εκκαθαρίσει όλα τα δεδομένα στον διάλογο. Το [Συνέχεια] θα ξεκινήσει τη διαδικασία αναζήτησης. - Πατήστε το κουμπί [proceed] για να εκτελέσετε την αναζήτηση. Η έξοδος είναι μια τυπική γκαλερί thumbnails, ή η μορφή αναφοράς metadata που φαίνεται παραπάνω. Μπορείτε να αποθηκεύσετε τις εικόνες που αναζητήθηκαν ως μόνιμο άλμπουμ - δείτε {ΑΛΜΠΟΥΜ}. - ^Απόδοση Η αναζήτηση και η αναφορά ευρετηριασμένων metadata είναι σχεδόν ακαριαία. Η ταχύτητα για μη ευρετηριασμένα metadata εξαρτάται από την ταχύτητα του υπολογιστή και του δίσκου. Ένας ισχυρός υπολογιστής με δίσκο SSD μπορεί να αναζητήσει πάνω από 100K αρχεία ανά λεπτό. - ^search_results^ (άλμπουμ) Η έξοδος της Αναζήτησης Εικόνων αποθηκεύεται στο άλμπουμ "search_results". Μετονομάστε αυτό το άλμπουμ εάν θέλετε να αποτρέψετε μια μεταγενέστερη αναζήτηση από το να το αντικαταστήσει. - Περιορισμός: Η λειτουργία αναζήτησης περιορίζεται σε 40.000 αποτελέσματα (εικόνες που βρέθηκαν και πληρούν τα κριτήρια αναζήτησης). Εάν αυτό το όριο ξεπεραστεί, ειδοποιείστε και η αναζήτηση περικόπτεται. Αυτό το όριο υπάρχει επειδή το μέγεθος ενός παραθύρου με κύλιση στο GTK είναι περιορισμένο, και μια προσπάθεια δημιουργίας μεγαλύτερου παραθύρου μπορεί να προκαλέσει κατάρρευση ή πάγωμα. - - TOPIC: ΜΕΝΟΥ ΕΠΙΛΟΓΗΣ - - TOPIC: ΕΠΙΣΚΟΠΗΣΗ ΠΕΡΙΟΧΗΣ Οι λειτουργίες επεξεργασίας εφαρμόζονται κανονικά σε ολόκληρη την εικόνα, αλλά είναι δυνατό να επεξεργαστείτε μέρος μιας εικόνας (μια "περιοχή") και να αφήσετε το υπόλοιπο αμετάβλητο. Εάν έχει επιλεγεί μια περιοχή εικόνας, τότε οι περισσότερες λειτουργίες επεξεργασίας θα λειτουργήσουν μόνο εντός αυτής της περιοχής. Ορισμένες λειτουργίες (π.χ. η Αλλαγή Κλίμακας) αγνοούν μια επιλεγμένη περιοχή. Μια περιοχή μπορεί να επιλεγεί πριν την έναρξη μιας λειτουργίας επεξεργασίας, ή ενώ χρησιμοποιείται μια λειτουργία επεξεργασίας. Η επιλεγμένη περιοχή είναι αμέσως ενεργή, οι προηγούμενες επεξεργασίες διατηρούνται, και οι μελλοντικές επεξεργασίες θα εφαρμοστούν μόνο εντός της περιοχής. Εάν ξεκινήσει μια άλλη επεξεργασία, η επιλεγμένη περιοχή παραμένει ενεργή, οπότε είναι δυνατή η εκτέλεση μιας σειράς επεξεργασιών εντός μιας περιοχής. Μια περιοχή μπορεί επίσης να αποτελείται από πολλαπλές μη συνδεδεμένες περιοχές στην εικόνα. - Το Fotocx χρησιμοποιεί 'περιοχές' αντί για 'επίπεδα' (layers). Αντί να επιλέγετε κάτι από την εικόνα, να δημιουργείτε ένα ξεχωριστό επίπεδο από την επιλογή, να επεξεργάζεστε το επίπεδο και τελικά να συγχωνεύετε το επίπεδο, επιλέγετε κάτι στην εικόνα, εκτελείτε λειτουργίες επεξεργασίας στην επιλογή, και βλέπετε το τελικό αποτέλεσμα αμέσως. Οι περιοχές μπορούν επίσης να αποθηκευτούν, να επικολληθούν σε άλλη εικόνα, να μετακινηθούν και να αλλάξουν κλίμακα, και να επεξεργαστούν περαιτέρω. - +image: edit-selection.jpg - Η επεξεργασία μιας επιλεγμένης περιοχής μπορεί μερικές φορές να έχει ως αποτέλεσμα ορατά όρια στις άκρες της περιοχής (μερικές φορές αυτά αντιστοιχούν σε άκρες χαρακτηριστικών στην εικόνα, και επομένως δεν αποτελούν πρόβλημα). Μπορείτε να αναμείξετε τις άκρες χρησιμοποιώντας την {ΑΝΑΜΕΙΞΗ ΠΕΡΙΟΧΗΣ}: οι επεξεργασίες μπορούν να εφαρμοστούν σταδιακά από την άκρη της περιοχής προς τα μέσα, και μπορείτε να επιλέξετε ποιες άκρες αναμειγνύονται. - - TOPIC: ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ +image: select-area.jpg - Ο διάλογος Επιλογή Περιοχής ξεκινά με το μενού Select > Select Area. Επιλέξτε μία από τις μεθόδους που εξηγούνται παρακάτω. Κάθε μέθοδος επιλέγει περιοχές εικόνας με διαφορετικό τρόπο. Μπορείτε να αλλάξετε μεθόδους οποιαδήποτε στιγμή, και οι επιλεγμένες περιοχές συσσωρεύονται. Ένα περίγραμμα των επιλεγμένων περιοχών εικόνας εμφανίζεται καθώς προσθέτετε ή αφαιρείτε περιοχές από την επιλογή. Το κουμπί [Ολοκλήρωση] χρησιμοποιείται για την αντιστοίχιση των pixel της εικόνας εντός των περιγραμμάτων περιοχής, καθιστώντας τα έτοιμα για την εφαρμογή επόμενων λειτουργιών επεξεργασίας. Το κουμπί [Απόκρυψη] κρύβει το περίγραμμα της περιοχής, δίνοντάς σας καλύτερη ορατότητα των επεξεργασιών και πιθανών εφέ στις άκρες της περιοχής. Χρησιμοποιήστε το κουμπί [Εμφάνιση] για να εμφανίσετε το περίγραμμα της περιοχής. Το κουμπί [Εκκαθάριση] αφαιρεί όλες τις επιλογές περιοχής. Ο διάλογος επιλογής περιοχής μπορεί να ακυρωθεί και να ξεκινήσει ξανά αργότερα για την τροποποίηση υπαρχουσών περιοχών ή την προσθήκη νέων. - ^Μέθοδοι Οι ακόλουθες μέθοδοι χρησιμοποιούνται για να περικλείσουν έναν ή περισσότερους χώρους εικόνας που θα ανήκουν στην τελική περιοχή. Αυτές οι μέθοδοι μπορούν να χρησιμοποιηθούν με οποιαδήποτε σειρά για να οριστούν χώροι που είτε ενώνονται είτε αποσπώνται. • Rectangle - σύρετε για να περιγράψετε μια ορθογώνια περιοχή • Ellipse - σύρετε για να περιγράψετε μια κυκλική ή ελλειπτική περιοχή • Freehand Draw - περιγράψτε μια περιοχή σχεδιάζοντας με το ποντίκι • Follow Edge - περίγραμμα ακολουθώντας τις άκρες χαρακτηριστικών της εικόνας • Select area within mouse - σύρετε για να επιλέξετε pixel εντός ενός κύκλου γύρω από τον δείκτη του ποντικιού. • Select one color within mouse - επιλέξτε μόνο pixel που ταιριάζουν με ένα δεδομένο χρώμα, αντιστοίχιση 0-100%. • Select all colors within mouse - επιλέξτε όλα τα pixel εντός του ποντικιού, επεκτείνετε την επιλογή σε γειτονικές περιοχές με χρώματα που ταιριάζουν με τα χρώματα εντός του ποντικιού (μερικές φορές ονομάζεται 'flood'). - Οι ακόλουθες παράγραφοι εξηγούν τις λεπτομέρειες κάθε μεθόδου. - ^Rectangle Σύρετε το ποντίκι από τη μία γωνία στην απέναντι γωνία μιας ορθογώνιας περιοχής προς επιλογή. Σχεδιάζεται ένα ορθογώνιο που περικλείει την περιοχή. Κάντε δεξί κλικ για διαγραφή και επανεκκίνηση. Επαναλάβετε τη διαδικασία για να επιλέξετε περισσότερες ορθογώνιες περιοχές. - ^Ellipse Αυτό λειτουργεί όπως η επιλογή ορθογωνίου, με τη διαφορά ότι η περιοχή που περικλείεται είναι κύκλος ή έλλειψη. Η θέση έναρξης του σύρσιματος είναι το κέντρο της προκύπτουσας έλλειψης. Η γωνία του σύρσιματος καθορίζει το σχήμα της έλλειψης. - ^Freehand Draw Σύρετε το ποντίκι (με το αριστερό κουμπί πατημένο) για να σχεδιάσετε μια ελεύθερη γραμμή, ή κάντε αριστερό κλικ για να συνδέσετε μια ευθεία γραμμή από το τελευταίο σημείο που σχεδιάστηκε στο σημείο όπου έγινε κλικ. Συνεχίστε γύρω από την περιοχή-στόχο μέχρι να περιβληθεί από συνδεδεμένες καμπύλες και γραμμές. Κάντε δεξί κλικ για να αφαιρέσετε προηγούμενες γραμμές (λάθη). Ένα δεξί κλικ θα αφαιρέσει την προηγούμενη γραμμή στην οποία έγινε κλικ ή σύρσιμο, έως 50 pixel. Κάντε επανειλημμένα δεξί κλικ για να αφαιρέσετε περισσότερα. Μια νέα γραμμή στην οποία έγινε κλικ θα συνδέεται πάντα με το τέλος της προηγούμενης γραμμής. Μια νέα συρόμενη γραμμή θα συνδεθεί με την προηγούμενη γραμμή εάν ξεκινήσει κοντά στο τέλος αυτής της γραμμής. Εάν ξεκινήσει αλλού, θα σχεδιαστεί μια αποσυνδεδεμένη γραμμή. Μπορείτε να ξεκινήσετε ένα νέο σύρσιμο από μακριά και να σχεδιάσετε προς τα πίσω για να συναντήσετε την προηγούμενη γραμμή. Εάν μια γραμμή στην οποία έγινε κλικ συνδέεται σε ένα ανεπιθύμητο σημείο (δηλ. δεν θέλετε να συνδεθεί με την τελευταία γραμμή που σχεδιάστηκε), κάντε δεξί κλικ για να τη διαγράψετε και στη συνέχεια χρησιμοποιήστε σύρσιμο για να ξεκινήσετε μια νέα ακολουθία γραμμών. Ένα σύρσιμο με το δεξί κουμπί μπορεί να χρησιμοποιηθεί για τη διαγραφή τμημάτων γραμμής: σύρετε με το δεξί κουμπί κοντά κατά μήκος μιας γραμμής για να τη διαγράψετε, στη συνέχεια σύρετε με το αριστερό κουμπί για να ξανασχεδιάσετε τη γραμμή. Στο τέλος, μια περιοχή πρέπει να είναι πλήρως περικλεισμένη, χωρίς κενά. Γραμμές που επικαλύπτονται λίγο στα άκρα είναι εντάξει (OK). Τα κενά μπορεί να είναι δύσκολο να βρεθούν και να διορθωθούν, γι' αυτό εργαστείτε σε μέγεθος εικόνας 100% ή μεγαλύτερο και προσέξτε. Μια σειρά γραμμών που συνδέονται αυτόματα με αριστερά κλικ δεν θα αφήσει κενά, αλλά η απόκλιση από αυτή τη σειρά είναι πιθανό να δημιουργήσει κενά. Για να μειώσετε την πιθανότητα κενών, χρησιμοποιήστε σκόπιμες επικαλύψεις κατά τη χειροκίνητη σύνδεση γραμμών. Υπάρχει ένα βοηθητικό εργαλείο ανίχνευσης κενών που περιγράφεται παρακάτω - {ΕΥΡΕΣΗ ΚΕΝΟΥ ΠΕΡΙΟΧΗΣ}. Εάν η άκρη μιας περιοχής είναι επίσης άκρη της εικόνας, δεν χρειάζεται να σχεδιάσετε αυτό το τμήμα της περιοχής. Σχεδιάστε τη γραμμή έξω από την άκρη της εικόνας, και σχεδιάστε την πίσω στην εικόνα σε άλλη θέση κατά μήκος της άκρης της εικόνας. - ^Follow Edge Τα pixel υψηλής αντίθεσης (πιθανές άκρες χαρακτηριστικών εικόνας) μεταξύ του τελευταίου σημείου που σχεδιάστηκε και μιας νέας θέσης όπου έγινε κλικ βρίσκονται και συνδέονται. Αυτό είναι αποτελεσματικό για καθαρές άκρες που δεν είναι πολύ ακανόνιστες. Θολές και ακανόνιστες άκρες μπορεί να μη λειτουργήσουν καλά και θα χρειαστεί το freehand draw εάν απαιτείται υψηλή ακρίβεια. Οι κανόνες για τη σύνδεση γραμμών είναι οι ίδιοι όπως εξηγήθηκαν παραπάνω. Το σύρσιμο του ποντικιού αντί για κλικ λειτουργεί όπως το freehand draw, αλλά με μια τάση να ακολουθεί τις άκρες χαρακτηριστικών από μια θέση ελαφρώς πίσω από το ποντίκι. Για πολύ ακανόνιστες άκρες (μαλλιά, φύλλωμα), δείτε το 'deselect color', παρακάτω. - ^Ακτίνα Ποντικιού και Επίπεδο Αντιστοίχισης Χρώματος Αυτά τα δύο στοιχεία ελέγχου εφαρμόζονται μόνο στις μεθόδους 'select within mouse' που περιγράφονται παρακάτω. Η ακτίνα ποντικιού καθορίζει το μέγεθος ενός κύκλου γύρω από τον δείκτη του ποντικιού. Τα pixel εντός του κύκλου επιλέγονται, ή παρέχουν ένα σύνολο χρωμάτων για αντιστοίχιση και επιλογή pixel από τον κύκλο του ποντικιού προς τα έξω. Το επίπεδο αντιστοίχισης καθορίζει ένα απαιτούμενο επίπεδο αντιστοίχισης (0-100%) για την επιλογή pixel με βάση το χρώμα και τη φωτεινότητά τους. Το '0' σημαίνει ότι οτιδήποτε ταιριάζει, και το '100' σημαίνει ότι απαιτείται τέλεια αντιστοίχιση. - ^Select area within mouse Αριστερό κλικ ή σύρσιμο θα επιλέξει τα pixel που περικλείονται από τον κύκλο του ποντικιού. Ένα δεξί κλικ θα αποεπιλέξει την τελευταία επιλογή (επαναλάβετε για να αποεπιλέξετε περισσότερα). Ένα σύρσιμο με το δεξί κουμπί θα αποεπιλέξει τα περικλειόμενα pixel. - ^Select one color within mouse Κάντε κλικ στην εικόνα για να επιλέξετε ένα χρώμα. Το χρώμα εμφανίζεται στο κουμπί χρώματος. Μπορείτε επίσης να χρησιμοποιήσετε το κουμπί για να ορίσετε απευθείας ένα χρώμα. Σύρσιμο με αριστερό/δεξί κουμπί για επιλογή/αποεπιλογή pixel εντός του κύκλου του ποντικιού που ταιριάζουν με το επιλεγμένο χρώμα εντός του επιπέδου αντιστοίχισης. Ρυθμίστε το επίπεδο αντιστοίχισης προς τα κάτω ή πάνω για να ταιριάξετε ένα μεγαλύτερο ή μικρότερο εύρος χρωμάτων. Κάντε κλικ όσο χρειάζεται στην εικόνα για να αλλάξετε το χρώμα προς αντιστοίχιση. - ^Προαιρετικό χρώμα αποεπιλογής Αυτό ισχύει μόνο για το 'select one color' παραπάνω. Κάντε αριστερό κλικ στην εικόνα για να ορίσετε ένα χρώμα αποεπιλογής. Όταν το πλαίσιο είναι επιλεγμένο, το χρώμα αποεπιλογής είναι ενεργό. Εάν ένα pixel ταιριάζει καλύτερα με το χρώμα αποεπιλογής παρά με το χρώμα επιλογής, το pixel αποεπιλέγεται. Κατά την επιλογή κατά μήκος μιας άκρης χαρακτηριστικού με χαμηλή αντίθεση χρώματος σε σύγκριση με μια γειτονική περιοχή που θα πρέπει να παραμείνει μη επιλεγμένη, ορίστε το χρώμα αποεπιλογής από τη γειτονική περιοχή. Αυτό είναι χρήσιμο για ακριβή επιλογή μιας σύνθετης άκρης, όπως μαλλιά ή φύλλωμα. - ^Select all colors within mouse Αυτό ονομάζεται 'flood' σε ορισμένους επεξεργαστές. Σύρσιμο με αριστερό/δεξί κουμπί για επιλογή/αποεπιλογή pixel εντός του κύκλου του ποντικιού. Τα pixel πέρα από τον κύκλο του ποντικιού περιλαμβάνονται επίσης εάν πληρούν αυτές τις δύο προϋποθέσεις: 1) το χρώμα τους ταιριάζει με οποιοδήποτε χρώμα εντός του κύκλου του ποντικιού, εντός του τρέχοντος επιπέδου αντιστοίχισης. 2) βρίσκονται εντός του εύρους αναζήτησης του δείκτη του ποντικιού. Αυτό είναι ένας παράγοντας της ακτίνας ποντικιού, π.χ. εάν η ακτίνα ποντικιού είναι 20 και το εύρος αναζήτησης είναι 3, τότε το εύρος αναζήτησης είναι 60 pixel από τον δείκτη του ποντικιού. Σύρετε το ποντίκι πάνω από νέες περιοχές που θέλετε να συμπεριλάβετε. Παρατηρήστε την επιλεγμένη περιοχή να επεκτείνεται σε περιοχές με χρώματα που ταιριάζουν με αυτά εντός του κύκλου του ποντικιού. Εάν προχωρήσετε πολύ, κάντε δεξί κλικ για να αφαιρέσετε την τελευταία επιλογή. Επαναλάβετε εάν χρειάζεται για να αφαιρέσετε περισσότερες προηγούμενες επιλογές. Μειώστε την ακτίνα ή αυξήστε το επίπεδο αντιστοίχισης για να αποκτήσετε πιο λεπτομερή έλεγχο - η επιλογή θα επεκταθεί πιο αργά και θα παραμείνει πιο κοντά στον κύκλο του ποντικιού. Μια μικρή ακτίνα και υψηλό επίπεδο αντιστοίχισης μπορούν να χρησιμοποιηθούν για να ακολουθήσετε μια άκρη χαρακτηριστικού εικόνας και να επιλέξετε pixel μέχρι την άκρη με καλή ακρίβεια. Αφού ολοκληρωθεί η εργασία στην άκρη, χρησιμοποιήστε τη μέθοδο select area within mouse για να επιλέξετε τα υπόλοιπα. Το σύρσιμο με το δεξί κουμπί λειτουργεί ως αποεπιλογή: τα pixel εντός του κύκλου του ποντικιού και τα ταιριαστά pixel εντός του εύρους αναζήτησης αποεπιλέγονται. Εάν μια επιλογή προχωρήσει πολύ, είναι συχνά ευκολότερο να το διορθώσετε αποεπιλέγοντας από έξω από την επιλεγμένη περιοχή αντί να επιλέγετε από μέσα. Μπορεί να χρειαστείτε λίγη εξάσκηση για να αποκτήσετε την αίσθηση αυτού και να μπορείτε να εργάζεστε αποτελεσματικά. - ^Select all colors within mouse - περίληψη • σύρσιμο με αριστερό κουμπί - επιλογή pixel στο ποντίκι και ταιριαστών pixel στο εύρος • δεξί κλικ - αναίρεση προηγούμενης επιλογής, επανάληψη για αποεπιλογή περισσότερων • σύρσιμο με δεξί κουμπί - αποεπιλογή pixel στο ποντίκι και ταιριαστών pixel στο εύρος - ^Ερπυσμός Άκρης Μια περιοχή που έχει ολοκληρωθεί (δείτε παρακάτω) μπορεί να επεκταθεί ή να συρρικνωθεί σε βήματα του 1 pixel. Αυτό μπορεί να είναι χρήσιμο για τη μείωση εφέ στις άκρες όταν μια περιοχή που επιλέχθηκε με αντιστοίχιση χρωμάτων επεξεργάζεται με τρόπο που αλλάζει τη φωτεινότητά της. Η επιλογή κατά χρώμα μπορεί να αφήσει μια στενή λωρίδα από ανεπαρκώς ή υπερβολικά επιλεγμένα pixel κατά μήκος μιας άκρης όπου το χρώμα του χαρακτηριστικού μεταβαίνει στο φόντο. Η επέκταση ή συρρίκνωση της περιοχής κατά 1-2 pixel μπορεί να παράγει μια πιο καθαρή εμφάνιση της άκρης. Η περιοχή παραμένει ολοκληρωμένη (δείτε παρακάτω) μετά τον ερπυσμό. - ^Χρώμα περιγράμματος περιοχής Το χρώμα που χρησιμοποιείται για τον κύκλο επιλογής ποντικιού και το περίγραμμα της περιοχής μπορεί να αλλαχθεί οποιαδήποτε στιγμή κάνοντας κλικ σε ένα από τα κουμπιά χρώματος. Αυτό επιτρέπει καλή ορατότητα σε σχέση με διάφορα χρώματα εικόνας. - ^Εμφάνιση/Απόκρυψη Χρησιμοποιήστε το [Απόκρυψη] για να κρύψετε τα περιγράμματα της περιοχής. Αυτό είναι χρήσιμο για να δείτε καλύτερα τα εφέ των επεξεργασιών της περιοχής χωρίς παρεμβολή από το περίγραμμα της περιοχής. Χρησιμοποιήστε το [Εμφάνιση] για να εμφανίσετε τα περιγράμματα και να συνεχίσετε την επεξεργασία της περιοχής. - ^Finish +image: select-area-finish.png - Μια περιοχή δεν είναι ενεργή για επεξεργασίες μέχρι να ολοκληρωθεί επιτυχώς. Το Finish επικυρώνει τα σχεδιασμένα περιγράμματα και χρωματίζει τα περικλειόμενα pixel για οπτικό έλεγχο. Όταν τελειώσετε με το περίγραμμα των περιοχών, χρησιμοποιήστε το κουμπί [Ολοκλήρωση] για να ολοκληρώσετε τη διαδικασία. Ο αναδυόμενος διάλογος που φαίνεται παραπάνω συνοψίζει δύο μεθόδους που μπορείτε να χρησιμοποιήσετε για να ολοκληρώσετε. - Μέθοδος 1: Κάντε αριστερό κλικ με το ποντίκι μέσα σε περιοχές που περιγράφηκαν με το χέρι. Οι περικλειόμενες περιοχές χρωματίζονται προσωρινά ώστε να επαληθεύσετε ότι το τελικό αποτέλεσμα είναι αυτό που σκοπεύατε. Οποιαδήποτε περικλειόμενη περιοχή μπορεί να επιλεγεί, ακόμα και αυτές που δεν περιγράφηκαν ρητά: εάν έχετε ένα ντόνατ με μια τρύπα, μπορείτε να επιλέξετε το ντόνατ, την τρύπα, ή και τα δύο. Πατήστε [keep] όταν όλες οι περιοχές έχουν κλικαριστεί και χρωματιστεί σωστά. Εάν το περίγραμμα μιας χειροσχεδιασμένης περιοχής έχει ένα κενό, η διαδικασία χρωματισμού θα "διαρρεύσει" και περιοχές έξω από το περίβλημα θα χρωματιστούν. Σε αυτή την περίπτωση, πατήστε [Αναίρεση] στον διάλογο Finish, το οποίο επαναφέρει το αρχικό περίγραμμα περιοχής. Βρείτε το κενό στο περίγραμμα και κλείστε το, στη συνέχεια δοκιμάστε ξανά το [Ολοκλήρωση]. Ένα κενό 1 pixel σε μια μεγάλη περιοχή μπορεί να είναι δύσκολο να βρεθεί. Κάντε zoom μεγέθυνση για καλύτερη προβολή. Δείτε τη λειτουργία {ΕΥΡΕΣΗ ΚΕΝΟΥ ΠΕΡΙΟΧΗΣ} παρακάτω για μια γρήγορη μέθοδο εύρεσης μικροσκοπικών κενών. - Μέθοδος 2: Κάντε δεξί κλικ κάπου έξω από όλες τις περικλειόμενες περιοχές. Όλες οι περικλειόμενες περιοχές θα χρωματιστούν για οπτική επαλήθευση. Εάν υπάρχει κενό, τα αποτελέσματα και η διόρθωση είναι τα ίδια όπως περιγράφηκαν στη μέθοδο 1. Αυτή η μέθοδος έχει νόημα εάν έχετε πολλές χειροσχεδιασμένες περιοχές και δεν θέλετε να τις ελέγξετε μία-μία χρησιμοποιώντας τη μέθοδο 1. - Οι περιοχές που επιλέγονται με τις μεθόδους 'select within mouse' ολοκληρώνονται αυτόματα. Αυτές οι περιοχές αντιστοιχίζονται κατά τη διάρκεια της διαδικασίας επιλογής, ενώ οι περιοχές που επιλέγονται με rectangle, ellipse, ή μία από τις μεθόδους σχεδίασης γραμμής αντιστοιχίζονται μόνο όταν κάνετε κλικ μέσα τους. Εάν χρησιμοποιείτε μόνο τις μεθόδους 'select in mouse', μπορείτε να πατήσετε [keep] χωρίς να κάνετε κλικ σε καμία από τις επιλεγμένες περιοχές. - Εάν σχεδιάσετε μια γραμμή από τη μία πλευρά της εικόνας στην άλλη, μπορείτε να κάνετε κλικ σε οποιαδήποτε πλευρά της γραμμής για να δημιουργήσετε μια περιοχή από όλα τα pixel σε αυτή την πλευρά της γραμμής. Παράδειγμα: σχεδιάστε μια οριζόντια γραμμή στο όριο μεταξύ ουρανού και γης. Κάντε κλικ πάνω από τη γραμμή για να επιλέξετε τον ουρανό, κάτω από τη γραμμή για να επιλέξετε τη γη. Οι σχεδιασμένες γραμμές πρέπει να φτάνουν πλήρως στις άκρες της εικόνας. - ^Clear Απορρίψτε την τρέχουσα περιοχή οριστικά. - - TOPIC: ΕΥΡΕΣΗ ΚΕΝΟΥ ΠΕΡΙΟΧΗΣ Εάν ένα περίγραμμα περιοχής δημιουργήθηκε με ελεύθερη σχεδίαση χρησιμοποιώντας πολλαπλές πινελιές, είναι εύκολο να αφήσετε μικρά κενά στο περίγραμμα που δεν είναι ορατά κάτω από 4x zoom. Μια προσπάθεια ολοκλήρωσης μιας τέτοιας περιοχής θα αποτύχει επειδή η αντιστοίχιση των εσωτερικών pixel θα διαρρεύσει μέσα από το κενό και θα καλύψει περιοχές έξω από την προβλεπόμενη περιοχή. Εάν η λειτουργία Finish αποτύχει, αυτή η λειτουργία μπορεί να βρει το κενό. Κάντε κλικ κάπου στο περίγραμμα της αποτυχημένης περιοχής. Το περίγραμμα θα ξανασχεδιαστεί αργά προς μία κατεύθυνση από τη θέση όπου έγινε κλικ, μέχρι να βρεθεί ένα "τελικό pixel". Εκεί βρίσκεται το κενό. Το περίγραμμα σχεδιάζεται στη συνέχεια προς την αντίθετη κατεύθυνση μέχρι να συναντηθεί το κενό (ή κάποιο άλλο). Το κενό είναι εκεί όπου σταμάτησε η σχεδίαση. Κάντε zoom μεγέθυνση στο κενό και κλείστε το χρησιμοποιώντας freehand draw, στη συνέχεια δοκιμάστε ξανά για να δείτε εάν το πλήρες περίγραμμα μπορεί να σχεδιαστεί χωρίς να σταματήσει. Αυτή η λειτουργία μπορεί να χρησιμοποιηθεί παράλληλα με τη λειτουργία Επιλογή Περιοχής - και οι δύο διάλογοι μπορούν να είναι ενεργοί. - - TOPIC: ΑΝΑΜΕΙΞΗ ΠΕΡΙΟΧΗΣ +image: area-blend.jpg - Δύο λειτουργίες υπάρχουν σε αυτό το εργαλείο: Area Blend και Area Edge Blend. Και οι δύο λειτουργίες μπορούν να 'αναιρέσουν' σταδιακά μια επεξεργασία που έγινε εντός μιας επιλεγμένης περιοχής, αναμειγνύοντας μια προηγούμενη επεξεργασία ή την πρωτότυπη εικόνα. Στο παραπάνω παράδειγμα, οι τέσσερις άνδρες στο φόντο φωτίστηκαν χωρίς καμία ένδειξη ορίου μεταξύ φωτισμένων και αμετάβλητων pixel. - ^Area Blend Οποιοδήποτε τμήμα μιας επεξεργασμένης επιλεγμένης περιοχής μπορεί να αναμειχθεί με την πρωτότυπη εικόνα. Χρησιμοποιήστε σύρσιμο με το αριστερό κουμπί του ποντικιού πάνω από περιοχές προς ανάμειξη. Κάθε σύρσιμο ποντικιού εντός της περιοχής θα αναμείξει σταδιακά την επιλεγμένη προηγούμενη εικόνα, μειώνοντας ή αφαιρώντας αποτελεσματικά την επεξεργασία που έγινε εντός της περιοχής. Ο ρυθμός ανάμειξης καθορίζεται από το 'blend rate', το οποίο μπορεί να οριστεί ξεχωριστά για το κέντρο και την άκρη του κύκλου του ποντικιού. Ορίστε την ακτίνα ποντικιού και τους ρυθμούς ανάμειξης (π.χ. 50/0 για κέντρο/άκρη ποντικιού). Σύρετε το ποντίκι πάνω από τις περιοχές προς ανάμειξη. Χρησιμοποιήστε σύρσιμο με το αριστερό κουμπί για ανάμειξη, σύρσιμο με το δεξί κουμπί για αναίρεση της ανάμειξης ή επαναφορά. Μπορείτε να χρησιμοποιήσετε αυτή τη μέθοδο για να αναμείξετε επιλεκτικά τις άκρες της περιοχής: χρησιμοποιήστε μικρή ακτίνα και σύρετε το κέντρο του ποντικιού πάνω από τις άκρες προς ανάμειξη. Αυτό θα έχει ως αποτέλεσμα μια διαβαθμισμένη ανάμειξη από την άκρη προς τα μέσα. - ^Area Edge Blend Μερικές φορές μια επεξεργασμένη περιοχή θα έχει άκρες με μη φυσική εμφάνιση, λόγω ενός απότομου ορίου μεταξύ της επεξεργασμένης περιοχής και της γύρω εικόνας (ειδικά εάν η περιοχή φωτίστηκε). Αυτό μπορεί να γίνει αποτελεσματικά αόρατο αναμειγνύοντας σταδιακά την επεξεργασία της περιοχής προς τα έξω για μια λωρίδα κατά μήκος των άκρων. Η επεξεργασία της περιοχής μπορεί να αφαιρεθεί 100% από την άκρη της περιοχής, μειούμενη στο 0% προς τα μέσα για το πλάτος της λωρίδας. Υπάρχουν δύο τρόποι ανάμειξης άκρων περιοχής, 'blend' και 'blur'. Το Blend αναμειγνύει τη λωρίδα άκρης με την επιλεγμένη προηγούμενη επεξεργασία ή την πρωτότυπη εικόνα. Το Blur αναμειγνύει τη λωρίδα με γειτονικά pixel από έξω από τη λωρίδα. Ορίστε το πλάτος της ανάμειξης με την είσοδο 'blend width' ή 'blur width'. - Τα 'Blend' και 'Blur' άκρης περιοχής απαιτούν έναν υπολογισμό απόστασης-άκρης: την απόσταση από κάθε pixel της περιοχής μέχρι την πλησιέστερη άκρη της περιοχής. Αυτή η απόσταση χρησιμοποιείται για τον υπολογισμό της σχετικής ανάμειξης για το pixel: 100% στην άκρη της περιοχής και 0% για pixel πέρα από το 'blend width' από την άκρη. Για μια μεγάλη περιοχή με σύνθετη άκρη, αυτό μπορεί να χρειαστεί λίγο χρόνο. Ένας μετρητής προόδου εμφανίζεται στον επάνω πίνακα. - - TOPIC: ΕΜΦΑΝΙΣΗ/ΑΠΟΚΡΥΨΗ ΠΕΡΙΟΧΗΣ Εμφανίστε ή κρύψτε το περίγραμμα της τρέχουσας περιοχής. Η απόκρυψη της περιοχής είναι χρήσιμη όταν η περιοχή τροποποιείται με λειτουργίες επεξεργασίας. Αυτό κάνει ευκολότερη την αξιολόγηση των εφέ της επεξεργασίας. Αυτά είναι επίσης διαθέσιμα ως κουμπιά στον διάλογο Επιλογή Περιοχής. - - TOPIC: ΕΝΕΡΓΟΠΟΙΗΣΗ/ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ ΠΕΡΙΟΧΗΣ Απενεργοποιήστε την τρέχουσα περιοχή και διατηρήστε τα δεδομένα ώστε να μπορεί να επανενεργοποιηθεί αργότερα (μενού Enable). Αυτό σας επιτρέπει να εναλλάσσετε επεξεργασίες εντός μιας επιλεγμένης περιοχής και επεξεργασίες για ολόκληρη την εικόνα. - - TOPIC: ΑΝΤΙΣΤΡΟΦΗ ΠΕΡΙΟΧΗΣ Αντιστρέψτε μια υπάρχουσα περιοχή: επιλέγεται ολόκληρη η εικόνα εκτός από την υπάρχουσα περιοχή. Η χρήση της λειτουργίας δύο φορές επαναφέρει την αρχική επιλεγμένη περιοχή. Η αντιστροφή μιας επιλεγμένης περιοχής ακυρώνει τον υπολογισμό άκρης ο οποίος πρέπει να επαναληφθεί εάν επιθυμείται ανάμειξη άκρης περιοχής. - - TOPIC: ΕΚΚΑΘΑΡΙΣΗ ΠΕΡΙΟΧΗΣ Απορρίψτε οριστικά την τρέχουσα περιοχή. Αυτό είναι επίσης διαθέσιμο ως κουμπί στον διάλογο Επιλογή Περιοχής. - - TOPIC: ΑΝΤΙΓΡΑΦΗ/ΕΠΙΚΟΛΛΗΣΗ ΠΕΡΙΟΧΗΣ Μια επιλεγμένη περιοχή μπορεί να αποθηκευτεί σε ένα αρχείο cache χρησιμοποιώντας το μενού Areas > Copy. Αυτή η περιοχή μπορεί να επικολληθεί στην ίδια ή σε άλλη εικόνα χρησιμοποιώντας το Areas > Paste. Κάντε κλικ και σύρετε για να τοποθετήσετε την επικολλημένη περιοχή. Τα στοιχεία ελέγχου του διαλόγου μπορούν να χρησιμοποιηθούν για την αλλαγή κλίμακας και την περιστροφή της επικολλημένης περιοχής. - - TOPIC: ΦΟΡΤΩΣΗ/ΑΠΟΘΗΚΕΥΣΗ ΠΕΡΙΟΧΗΣ Μια επιλεγμένη περιοχή μπορεί να αποθηκευτεί σε ένα αρχείο χρησιμοποιώντας το μενού Areas > Save. Σας ζητείται να παρέχετε ένα όνομα αρχείου. Δημιουργείται ένα αρχείο PNG. Το αρχείο PNG έχει ένα κανάλι alpha για πληροφορίες διαφάνειας. Η εικόνα είναι ένα ορθογώνιο που περικλείει την επιλεγμένη περιοχή. Τα επιλεγμένα pixel είναι αδιαφανή, και τα υπόλοιπα είναι διαφανή. - Αυτά τα αρχεία βρίσκονται στο /saved_areas από προεπιλογή, αλλά μπορείτε να τα αποθηκεύσετε οπουδήποτε. Χρησιμοποιήστε το μενού Areas > Load για να φορτώσετε μια αποθηκευμένη περιοχή από ένα αρχείο και να την επικολλήσετε στο τρέχον αρχείο εικόνας. Η εικόνα φόντου θα φαίνεται μέσα από τα διαφανή τμήματα της επικολλημένης περιοχής. Κάντε κλικ και σύρετε για να τοποθετήσετε την περιοχή. Τα στοιχεία ελέγχου του διαλόγου μπορούν να χρησιμοποιηθούν για την αλλαγή κλίμακας και την περιστροφή της επικολλημένης περιοχής. - - TOPIC: ΚΟΥΜΠΙ ΑΝΑΙΡΕΣΗΣ/ΕΠΑΝΑΛΗΨΗΣ Εάν μια λειτουργία επεξεργασίας είναι ενεργή και η εικόνα έχει αλλάξει: • αριστερό κλικ ποντικιού θα αναιρέσει την τρέχουσα επεξεργασία • δεξί κλικ ποντικιού θα επαναλάβει την επεξεργασία Αυτό σας επιτρέπει να συγκρίνετε γρήγορα τις εικόνες "πριν" και "μετά" για την τρέχουσα λειτουργία επεξεργασίας. - Εάν ΚΑΜΙΑ λειτουργία επεξεργασίας δεν είναι ενεργή, αλλά έγιναν κάποιες επεξεργασίες στην τρέχουσα εικόνα: • αριστερό κλικ ποντικιού θα αναιρεί ένα βήμα επεξεργασίας ανά κλικ • δεξί κλικ ποντικιού θα επαναλαμβάνει ένα βήμα επεξεργασίας ανά κλικ • μεσαίο κλικ ποντικιού εμφανίζει μια λίστα με όλα τα βήματα επεξεργασίας. Μπορείτε να επιστρέψετε σε οποιοδήποτε βήμα επεξεργασίας ή στην πρωτότυπη εικόνα - Εάν ανοίξετε άλλο αρχείο, τα αποθηκευμένα βήματα επεξεργασίας για το τρέχον αρχείο απορρίπτονται. - - TOPIC: ΜΕΝΟΥ ΕΠΕΞΕΡΓΑΣΙΑΣ - - TOPIC: ΠΕΡΙΣΤΡΟΦΗ Για να ευθυγραμμίσετε μια λοξή εικόνα, χρησιμοποιήστε το ποντίκι για να σύρετε τη δεξιά ή αριστερή πλευρά της εικόνας πάνω ή κάτω μέχρι η εικόνα να φαίνεται ευθυγραμμισμένη. Ένα αριστερό κλικ στην εικόνα θα προσθέσει κατακόρυφες και οριζόντιες βοηθητικές γραμμές για να βοηθήσουν στην ευθυγράμμιση της εικόνας. Χρησιμοποιήστε δεξί κλικ για να τις αφαιρέσετε. - Το κουμπί [Αυτόματο Επίπεδο] μπορεί να ευθυγραμμίσει αυτόματα την εικόνα εάν η κάμερα έχει καταγράψει τη 'γωνία κύλισης' (roll angle) στα metadata EXIF. Το κουμπί [Auto Upright] μπορεί να ανορθώσει αυτόματα μια εικόνα που τραβήχτηκε με την κάμερα γυρισμένη 90º, εάν υπάρχει το 'orientation' στα metadata EXIF. - - TOPIC: ΙΣΙΩΜΑ ΚΑΤΑΚΟΡΥΦΗΣ Αυτή είναι μια διόρθωση με 1 κουμπί για μια εικόνα που είναι περιστραμμένη κατά 90/180 μοίρες ή αντεστραμμένη (κατοπτρισμένη). Δεν υπάρχει απώλεια ανάλυσης αφού τα pixel αντιγράφονται 1:1 στη νέα διάταξη της εικόνας. Δείτε επίσης τη λειτουργία {ΜΑΖΙΚΗ ΙΣΙΩΣΗ}. - - TOPIC: ΠΕΡΙΚΟΠΗ +image: crop-image.jpg +image: crop-buttons.jpg - Κόψτε ανεπιθύμητες περιοχές από τις άκρες της εικόνας. Όταν ανοίγει ο διάλογος, ένα ορθογώνιο επιλογής τοποθετείται πάνω στην εικόνα. Οι περιοχές έξω από αυτό το ορθογώνιο σκουραίνουν και αντιπροσωπεύουν τα τμήματα της εικόνας που θα αφαιρεθούν. Σύρετε οποιαδήποτε πλευρά ή γωνία του ορθογωνίου για να μετακινήσετε αυτή την πλευρά ή γωνία. Το πλαίσιο διαλόγου δείχνει την τρέχουσα αναλογία πλάτους/ύψους του ορθογωνίου επιλογής. Εάν είναι επιλεγμένο το "Lock", τότε η μετακίνηση μιας πλευράς ή γωνίας θα προκαλέσει τη μετακίνηση μιας άλλης πλευράς ή γωνίας, ώστε να διατηρείται η σταθερή αναλογία πλάτους/ύψους. Σύρετε από τη μέση (σημειωμένη με έναν μικρό κύκλο) για να μετατοπίσετε ολόκληρο το ορθογώνιο χωρίς να αλλάξετε τις διαστάσεις. Χρησιμοποιήστε τα spin buttons πλάτους και ύψους για να ρυθμίσετε απευθείας τις διαστάσεις της εικόνας σε pixel, ή εισαγάγετε τις επιθυμητές τιμές. Το ορθογώνιο επιλογής θα προσαρμοστεί σε αυτές τις τιμές. - Χρησιμοποιήστε τα πλήκτρα βέλους του πληκτρολογίου για να μετακινήσετε το ορθογώνιο επιλογής σε βήματα του 1 pixel. Η τελευταία πλευρά ή γωνία που μετακινήθηκε με το ποντίκι είναι αυτή που μετακινείται με τα πλήκτρα βέλους. - Το κουμπί [Μεγ.] επαναφέρει το ορθογώνιο περικοπής στο πλήρες μέγεθος της εικόνας. Εάν μια προηγούμενη επεξεργασία (Περιστροφή, Παραμόρφωση ...) έχει αφήσει διαφανή περιθώρια γύρω από την εικόνα, το ορθογώνιο περικοπής θα αντικατοπτρίζει το μέγιστο μέγεθος που χωράει εντός αυτών των περιθωρίων. - Το κουμπί [Προηγ.] ανακτά μια λίστα προηγουμένως χρησιμοποιημένων τιμών πλάτους και ύψους. Επιλέξτε από τη λίστα για να χρησιμοποιήσετε μία από αυτές. - Τα πέντε κουμπιά αναλογίας σας επιτρέπουν να επιλέξετε μια προκαθορισμένη αναλογία πλάτους/ύψους. Το κουμπί [invert] αντιστρέφει την τρέχουσα αναλογία πλάτους/ύψους. - Μπορείτε να αλλάξετε τα κουμπιά αναλογίας με το κουμπί [customize], το οποίο ξεκινά έναν νέο διάλογο που φαίνεται στα δεξιά. Κάντε κλικ σε ένα κουμπί για να το επεξεργαστείτε. Εισαγάγετε την επιθυμητή αναλογία πλάτους προς ύψος χρησιμοποιώντας τη μορφή "ww:hh" όπως στο παράδειγμα που φαίνεται. - - TOPIC: ΡΕΤΟΥΣ +image: retouch.png - Ρυθμίστε τη φωτεινότητα και το χρώμα της εικόνας. • auto black level - ορισμός του μαύρου σημείου χρησιμοποιώντας % των πιο σκοτεινών pixel • auto white balance - ορισμός του λευκού σημείου χρησιμοποιώντας % των πιο φωτεινών pixel • click gray spot for white balance - κάντε κλικ σε γκρι σημείο στην εικόνα • click dark spot for black level - κάντε κλικ σε σκοτεινό σημείο στην εικόνα • κάντε κλικ για αναδυόμενο γράφημα ιστογραμμάτων RGB • brightness - μετακινεί την καμπύλη 'all' πάνω ή κάτω (αλλάζουν όλα τα χρώματα) • contrast - αλλάζει την κλίση της καμπύλης 'all' • color saturation - ασπρόμαυρο <--> έντονα χρώματα • color temperature - ισορροπία φωτισμού (θερμό <--> ψυχρό) - Αφού κάνετε τις αρχικές ρυθμίσεις χρησιμοποιώντας τα sliders, μπορείτε να ρυθμίσετε με ακρίβεια τη φωτεινότητα και την αντίθεση επεξεργαζόμενοι τις καμπύλες με το ποντίκι για να αλλάξετε ποια μέρη της εικόνας αλλάζουν περισσότερο ή λιγότερο. Η καμπύλη ALL ρυθμίζει όλα τα χρώματα, και οι 3 καμπύλες RGB ρυθμίζουν μεμονωμένα χρώματα. Χρησιμοποιήστε πρώτα το ALL, στη συνέχεια κάντε αναθεωρήσεις χρησιμοποιώντας το RGB. - ^Κουμπιά Reset - επαναφορά όλων των στοιχείων ελέγχου σε ουδέτερη θέση - επαναφέρεται επίσης η εικόνα Prev - ορισμός όλων των στοιχείων ελέγχου στις τιμές που χρησιμοποιήθηκαν για την προηγούμενη εικόνα Done - ολοκλήρωση της επεξεργασίας, κλείσιμο του διαλόγου, αποθήκευση των ρυθμίσεων ελέγχου Cancel - ακύρωση της επεξεργασίας, επαναφορά της εικόνας, κλείσιμο του διαλόγου - Χρησιμοποιήστε το κουμπί [Προηγ.] κατά την επεξεργασία πολλαπλών εικόνων που χρειάζονται παρόμοιες ρυθμίσεις. - - TOPIC: ΑΛΛΑΓΗ ΚΛΙΜΑΚΑΣ +image: rescale.png - Αυτή η λειτουργία αλλάζει την κλίμακα της εικόνας σε νέο πλάτος και ύψος σε pixel. Μπορείτε να εισαγάγετε απευθείας τις νέες διαστάσεις ή να επιλέξετε μια ποσοστιαία αλλαγή. Υπάρχουν κουμπιά για τον ορισμό του νέου μεγέθους σε μια απλή αναλογία του αρχικού μεγέθους. Η χρήση ενός από αυτά θα ελαχιστοποιήσει την απώλεια ανάλυσης. Το κουμπί [Προηγούμενο] ανακαλεί το προηγούμενο μέγεθος, μια διευκόλυνση εάν πολλαπλές εικόνες ρυθμίζονται στο ίδιο μέγεθος. Εάν είναι επιλεγμένο το πλαίσιο κλειδώματος αναλογίας, η τρέχουσα αναλογία πλάτους/ύψους θα διατηρηθεί εάν αλλάξει είτε το πλάτος είτε το ύψος. - - TOPIC: ΔΙΧΑΣΜΕΝΗ ΟΘΟΝΗ +image: split-screen1.jpg +image: split-screen2.png - Κατά τη διάρκεια μιας λειτουργίας επεξεργασίας, προβάλετε τις εικόνες πριν και μετά χρησιμοποιώντας τη μέθοδο διχασμένης οθόνης. Σύρετε τη γραμμή ορίου χρησιμοποιώντας το ποντίκι. Όταν βγείτε από τη Διχασμένη Οθόνη, μπορείτε να συνεχίσετε κανονικά τη λειτουργία επεξεργασίας. - Εάν καμία λειτουργία επεξεργασίας δεν είναι ενεργή, επιλέξτε δύο εικόνες για εμφάνιση χρησιμοποιώντας διχασμένη οθόνη. Πρέπει να έχουν τις ίδιες διαστάσεις σε pixel. - - TOPIC: ΕΜΦΑΝΙΣΗ ΔΙΑΦΟΡΩΝ Κατά τη διάρκεια μιας λειτουργίας επεξεργασίας, επισημάνετε τις αλλαγές σκουραίνοντας τις αμετάβλητες περιοχές. Χρησιμοποιήστε το slider για να ρυθμίσετε τη σκουρότητα των αμετάβλητων περιοχών. Όταν βγείτε από την Εμφάνιση Διαφορών, μπορείτε να συνεχίσετε κανονικά τη λειτουργία επεξεργασίας. - Εάν καμία λειτουργία επεξεργασίας δεν είναι ενεργή, επιλέξτε δύο εικόνες για να επισημάνετε τις διαφορές τους. Πρέπει να έχουν τις ίδιες διαστάσεις σε pixel. - - TOPIC: ΠΕΡΙΘΩΡΙΑ +image: margins.png - Χρησιμοποιήστε αυτή τη λειτουργία για να προσθέσετε περιθώρια γύρω από μια εικόνα. Μπορείτε να χρησιμοποιήσετε οποιοδήποτε χρώμα και ρυθμίσεις alpha (διαφάνειας) για τα περιθώρια. Ορίστε κάθε περιθώριο ξεχωριστά, ή χρησιμοποιήστε τα στοιχεία ελέγχου 'All±1' και 'All±10' για να ρυθμίσετε όλα τα περιθώρια πάνω ή κάτω κατά την ίδια ποσότητα, 1 ή 10 pixel. Χρησιμοποιήστε το ροδάκι του ποντικιού ή τα πλήκτρα βέλους πάνω/κάτω για ταχύτητα. - Μπορείτε να χρησιμοποιήσετε αυτή τη λειτουργία για να προσθέσετε περιθώρια γύρω από εικόνες που σκοπεύετε να παραμορφώσετε, ώστε να αποτρέψετε ορισμένες περιοχές από το να πέσουν έξω από τις άκρες. - - TOPIC: ΣΗΜΑΝΣΗ +image: markup.jpg - Αυτό είναι ένα μενού που περιέχει τις λειτουργίες σημειώσεων εικόνας: σχεδίαση κειμένου, σχεδίαση γραμμής/βέλους, σχεδίαση πλαισίου, σχεδίαση οβάλ Όλες αυτές οι λειτουργίες διαθέτουν ένα κουμπί [commit] το οποίο οριστικοποιεί την τρέχουσα επεξεργασία και σας επιτρέπει να ξεκινήσετε μια νέα (νέο κείμενο/γραμμή/πλαίσιο/οβάλ) εντός του ίδιου διαλόγου επεξεργασίας. - ^Σχεδίαση Κειμένου Αυτή η λειτουργία σχεδιάζει κείμενο απευθείας πάνω στην εικόνα. Εισαγάγετε το κείμενο στον διάλογο. Μπορούν να χρησιμοποιηθούν πολλαπλές γραμμές. Αφού εισαγάγετε το κείμενο, κάντε αριστερό κλικ με το ποντίκι εκεί όπου θέλετε το κείμενο στην εικόνα. Σύρετε για να μετακινήσετε το κείμενο αλλού. Κάντε δεξί κλικ για να αφαιρέσετε το κείμενο. Χρησιμοποιήστε το κουμπί [Γραμματοσειρά] για να επιλέξετε διαφορετική γραμματοσειρά. Χρησιμοποιήστε το στοιχείο ελέγχου [Μέγεθος] για να αυξήσετε ή να μειώσετε το μέγεθος του κειμένου. Χρησιμοποιήστε το στοιχείο ελέγχου [Γωνία] για να αλλάξετε τη γωνία κλίσης του κειμένου. Τα άλλα στοιχεία ελέγχου σας επιτρέπουν να ορίσετε ένα χρώμα φόντου γύρω από το κείμενο, ένα χρώμα περιγράμματος κειμένου, και ένα εφέ σκιάς. Μπορείτε να επιλέξετε το χρώμα και τη διαφάνεια για όλα αυτά. Το στοιχείο ελέγχου πλάτους ρυθμίζει το πλάτος των περιγραμμάτων και των σκιών. Το στοιχείο ελέγχου γωνίας σκιάς ορίζει τη γωνία της σκιάς. Χρησιμοποιήστε τα στοιχεία ελέγχου ανάγλυφου για να δώσετε στο κείμενο μια εμφάνιση 3D. - Μπορείτε να αρχικοποιήσετε το κείμενο από οποιαδήποτε διαθέσιμα metadata στο αρχείο εικόνας. Εισαγάγετε το tag metadata (π.χ. "user comments") και πατήστε [Ανάκτηση]. Μπορείτε να συντομεύσετε τα ονόματα tags, π.χ. "usercomments" αντί για "User Comments". - Τα κουμπιά [Άνοιγμα] και [Αποθήκευση] ξεκινούν έναν διάλογο επιλογής αρχείου με τον οποίο μπορείτε να φορτώσετε ή να αποθηκεύσετε όλα τα δεδομένα κειμένου από ή σε ένα αρχείο. Όλα τα στοιχεία στον διάλογο φορτώνονται ή αποθηκεύονται, οπότε μπορείτε να διατηρήσετε μια συλλογή από συχνά χρησιμοποιούμενες συμβολοσειρές κειμένου και ρυθμίσεις. - Τα κουμπιά στο κάτω μέρος λειτουργούν ως εξής: • Clear - εκκαθάριση των πεδίων κειμένου και metadata σε κενά • Replace - η εικόνα με το προστιθέμενο κείμενο αντικαθιστά την τρέχουσα εικόνα • +Version - η εικόνα με το προστιθέμενο κείμενο αποθηκεύεται ως νέα έκδοση • Next - άνοιγμα του επόμενου αρχείου, τοποθέτηση του ίδιου κειμένου στην ίδια θέση • Apply - οριστικοποίηση της τρέχουσας επεξεργασίας και επαναφορά για νέα εισαγωγή κειμένου • Done - ολοκλήρωση της τρέχουσας επεξεργασίας - η εικόνα είναι έτοιμη για αποθήκευση • Cancel - εγκατάλειψη της τρέχουσας επεξεργασίας - Για να προσθέσετε το ίδιο κείμενο σε μια σειρά εικόνων: προετοιμάστε και τοποθετήστε το κείμενο, πατήστε [Αντικατάσταση] ή [+Version], στη συνέχεια [Επόμενο], στη συνέχεια [Αντικατάσταση] ή [+Version], στη συνέχεια [Επόμενο] ... - Δημιουργήστε ένα υδατογράφημα: Χρησιμοποιήστε διαφάνεια κειμένου 70% ή περισσότερο και διαφάνεια φόντου 100%. Το κείμενο θα πρέπει να είναι ελαφρώς αναγνώσιμο. Χρησιμοποιήστε τα στοιχεία ελέγχου ανάγλυφου για να κάνετε το κείμενο να φαίνεται σαν να είναι βυθισμένο μέσα στην εικόνα. - ^Σχεδίαση Γραμμής Αυτή η λειτουργία σχεδιάζει γραμμές ή βέλη απευθείας πάνω στην εικόνα. Εισαγάγετε ένα μήκος και πλάτος γραμμής στον διάλογο, και επιλέξτε μια κεφαλή βέλους εάν το θέλετε. Κάντε αριστερό κλικ με το ποντίκι εκεί όπου θέλετε να το τοποθετήσετε στην εικόνα. Σύρετε τα άκρα της γραμμής/βέλους για να το τοποθετήσετε στην εικόνα. Κάντε δεξί κλικ για να το αφαιρέσετε. Σύρετε από τη μέση της γραμμής για να τη μετακινήσετε χωρίς να αλλάξετε τη γωνία ή το μήκος. Τα στοιχεία ελέγχου του διαλόγου σας επιτρέπουν να ορίσετε ένα χρώμα φόντου, ένα χρώμα περιγράμματος, και ένα εφέ σκιάς. Μπορείτε να επιλέξετε χρώμα και διαφάνεια για όλα αυτά. Το στοιχείο ελέγχου πλάτους ρυθμίζει το πλάτος των περιγραμμάτων και των σκιών. Το στοιχείο ελέγχου γωνίας σκιάς ορίζει τη γωνία κλίσης της σκιάς. Για να διατηρήσετε μια σχεδιασμένη γραμμή και να ξεκινήσετε μια άλλη, πατήστε [εφαρμογή]. - ^Σχεδίαση Πλαισίου Επιλέξτε χρώμα και πλάτος για το περίγραμμα του πλαισίου. Τοποθετήστε τον δρομέα στη θέση όπου θέλετε μια γωνία του πλαισίου, και σύρετε για να ανοίξετε το πλαίσιο προς την επιθυμητή κατεύθυνση. Για να αντικαταστήσετε το πλαίσιο, σύρετε ξανά. Για να μετακινήσετε το πλαίσιο, κρατήστε πατημένο το πλήκτρο shift και σύρετε το πλαίσιο από το κέντρο. Για να μετακινήσετε μία από τις άκρες, κρατήστε πατημένο το πλήκτρο shift και σύρετε την άκρη. Για να διατηρήσετε ένα σχεδιασμένο πλαίσιο και να ξεκινήσετε ένα άλλο, πατήστε [εφαρμογή]. - ^Σχεδίαση Οβάλ Επιλέξτε είτε το πλαίσιο ελέγχου οβάλ (έλλειψη) είτε κύκλος. Επιλέξτε χρώμα και πλάτος για το περίγραμμα. Τοποθετήστε τον δρομέα στο επιθυμητό κέντρο. Σύρετε για να σχεδιάσετε το οβάλ/κύκλο. Η γωνία σύρσιματος καθορίζει το σχήμα του οβάλ, από κύκλο έως ακραία έλλειψη, πλατιά ή ψηλή. Για να αντικαταστήσετε το οβάλ/κύκλο, σύρετε ξανά. Για να μετακινήσετε το οβάλ/κύκλο, κρατήστε πατημένο το πλήκτρο shift και σύρετε από το κέντρο. Για να αλλάξετε το μέγεθος ή το σχήμα, κρατήστε πατημένο το πλήκτρο shift και σύρετε από την κάτω δεξιά άκρη. Για να διατηρήσετε ένα σχεδιασμένο οβάλ/κύκλο και να ξεκινήσετε ένα άλλο, πατήστε [εφαρμογή]. Για ένα οβάλ, μπορείτε να εισαγάγετε μια γωνία 0-90 μοιρών για λοξούς άξονες, όπως στο παράδειγμα. - - TOPIC: ΛΕΙΤΟΥΡΓΙΑ ΧΡΩΜΑΤΟΣ +image: color-mode.png +image: color-mode2.jpg - Χρησιμοποιήστε αυτή τη λειτουργία για να δημιουργήσετε ένα ασπρόμαυρο ή έγχρωμο αρνητικό, ή να μετατρέψετε μια αρνητική εικόνα σε θετική εικόνα, ή να μετατρέψετε σε χρώμα σέπια (για εφέ παλαιωμένης φωτογραφίας). Το slider μπορεί να χρησιμοποιηθεί για την εφαρμογή του εφέ σταδιακά, από 0% έως 100%. - - TOPIC: ΖΩΓΡΑΦΙΚΗ ΕΠΕΞΕΡΓΑΣΙΩΝ Χρησιμοποιήστε αυτή τη λειτουργία σε συνδυασμό με κάποια άλλη λειτουργία επεξεργασίας. Ξεκινήστε μια λειτουργία επεξεργασίας και αφήστε τα στοιχεία ελέγχου σε ουδέτερη θέση. Στη συνέχεια ξεκινήστε το Ζωγραφική Επεξεργασιών. Ζωγραφίστε τη λειτουργία επεξεργασίας όπου το επιθυμείτε χρησιμοποιώντας το ποντίκι. Δείτε την {MOUSE PAINTING} για το πώς να εφαρμόζετε επεξεργασίες τοπικά χρησιμοποιώντας το ποντίκι. - Αυτή η μέθοδος "ζωγραφικής" σταδιακών επεξεργασιών μπορεί να βελτιώσει επιλεγμένες περιοχές μιας εικόνας γρήγορα και εύκολα. Λειτουργεί με τις ακόλουθες λειτουργίες επεξεργασίας: • Επεξεργασία > Ρετούς, Λειτουργία Χρώματος • Επιδιόρθωση > Ευκρίνεια, Θόλωμα, Αφαίρεση Θορύβου, Αφαίρεση Ομίχλης, Ρύθμιση RGB, Ρύθμιση HSL • Βελτίωση > Εξομάλυνση Ιστογράμματος, Τοπική Αντίθεση, Ενίσχυση Αντίθεσης, Τοπικό Retinex, Κορεσμός, Απαλή Εστίαση • Εφέ > Περιγράμματα, Sketch2, Ανάγλυφο, Υφή, Προσθήκη Λάμψης, Ορισμός Χρωμάτων, Μετατόπιση Χρωμάτων, Προσαρμοσμένος Πυρήνας - - TOPIC: ΖΩΓΡΑΦΙΚΗ ΕΙΚΟΝΑΣ +image: paint-image.jpg - Αυτή η λειτουργία ζωγραφίζει πάνω στην εικόνα με επιλεγμένα χρώματα, χρησιμοποιώντας το ποντίκι. Δείτε την {MOUSE PAINTING} για το πώς να εφαρμόζετε επεξεργασίες τοπικά χρησιμοποιώντας το ποντίκι. - Το κουμπί Paint Color εμφανίζει το τρέχον χρώμα. Κάντε κλικ σε αυτό το κουμπί για να επιλέξετε ένα χρώμα χρησιμοποιώντας τον τυπικό διάλογο επιλογής χρώματος του Gnome. Μπορείτε επίσης να κάνετε shift + αριστερό κλικ στην εικόνα για να επιλέξετε ένα χρώμα από την εικόνα. - Το κουμπί palette ανοίγει τον διάλογο που φαίνεται στη μέση. Κάντε κλικ στην εικόνα για να επιλέξετε το χρώμα σε αυτή τη θέση. Το επιλεγμένο χρώμα αντικατοπτρίζεται στο κουμπί χρώματος του κύριου διαλόγου. Η εικόνα που φαίνεται παραπάνω είναι η προεπιλεγμένη. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε εικόνα ως πηγή χρώματος. Πατήστε το κουμπί [περιήγηση] και επιλέξτε μια εικόνα όπου έχετε αποθηκεύσει χρώματα για ανάκληση. Αυτή η επιλογή παραμένει σε ισχύ μέχρι να αλλαχθεί. - Το κουμπί HSL ανοίγει έναν επιλογέα χρώματος HSL που φαίνεται στα δεξιά. Αυτός ο διάλογος μπορεί να αναπαραστήσει οποιοδήποτε πιθανό χρώμα. Μετακινήστε τα sliders για να αποκτήσετε το χρώμα που θέλετε. Το επιλεγμένο χρώμα αντικατοπτρίζεται στο κουμπί χρώματος του κύριου διαλόγου. - Εάν είναι επιλεγμένο το paint over transparent areas, η ζωγραφική πάνω σε διαφανείς περιοχές θα μειώσει ή θα εξαλείψει τη διαφάνεια, ανάλογα με τα στοιχεία ελέγχου αδιαφάνειας. Εάν αυτή η επιλογή δεν είναι επιλεγμένη, ζωγραφίζονται μόνο οι αδιαφανείς περιοχές της εικόνας. - ^Λειτουργία Tablet Wacom Με το Ζωγραφική Εικόνας, μπορείτε να χρησιμοποιήσετε ένα tablet Wacom αντί για ποντίκι. Το σύρσιμο της γραφίδας σε επαφή με την επιφάνεια του tablet θα ζωγραφίζει όπως περιγράφηκε παραπάνω. Εάν ένα από τα κουμπιά της γραφίδας κρατηθεί πατημένο κατά τη διάρκεια του σύρσιματος, η λειτουργία θα είναι διαγραφή αντί για ζωγραφική. Μπορείτε επίσης να ορίσετε λειτουργία ζωγραφικής ή διαγραφής χρησιμοποιώντας τα κουμπιά επιλογής στον διάλογο. Το να κρατάτε πατημένο ένα κουμπί της γραφίδας είναι δυσχερές, γι' αυτό υπάρχουν τα κουμπιά επιλογής. Η προσθήκη πίεσης στη γραφίδα θα αυξήσει την αδιαφάνεια, ώστε να μπορείτε να κάνετε πιο ανοιχτόχρωμες και πιο σκουρόχρωμες πινελιές χωρίς να ρυθμίζετε τα στοιχεία ελέγχου αδιαφάνειας. - - TOPIC: ΖΩΓΡΑΦΙΚΗ ΔΙΑΦΑΝΕΙΑΣ +image: paint-transp.png +image: paint-transp2.jpg - Ζωγραφίστε διαφανείς ή ημιδιαφανείς περιοχές σε μια εικόνα. Δείτε την {MOUSE PAINTING} για το πώς να εφαρμόζετε επεξεργασίες τοπικά χρησιμοποιώντας το ποντίκι. - - TOPIC: ΓΕΜΙΣΜΑ ΠΕΡΙΟΧΗΣ Γεμίστε όλες τις επιλεγμένες περιοχές ή όλες τις διαφανείς περιοχές με ένα επιλεγμένο χρώμα επικάλυψης. Εάν μια περιοχή είναι εν μέρει διαφανής, το χρώμα επικάλυψης θα αντικαταστήσει το διαφανές τμήμα της εικόνας. Το slider 'Blend' μπορεί να χρησιμοποιηθεί για την επιλογή οποιουδήποτε μείγματος της πρωτότυπης εικόνας και του χρώματος επικάλυψης. - - TOPIC: ΑΝΤΙΓΡΑΦΗ ΜΕΣΑ ΣΤΗΝ ΕΙΚΟΝΑ Ζωγραφίστε πάνω σε περιοχές της εικόνας αντιγράφοντας από αλλού στην ίδια εικόνα. Αυτή η μέθοδος μπορεί να χρησιμοποιηθεί για την αναπαραγωγή αντικειμένων εντός μιας εικόνας, ή για τη διαγραφή ενός ανεπιθύμητου αντικειμένου αντικαθιστώντας το με φόντο που λαμβάνεται από αλλού. Κάντε αριστερό κλικ στην εικόνα για να επιλέξετε μια θέση πηγής, στη συνέχεια κάντε δεξί κλικ για να επιλέξετε τον αντίστοιχο προορισμό. Δείτε την {MOUSE PAINTING} για το πώς να εφαρμόζετε επεξεργασίες τοπικά χρησιμοποιώντας το ποντίκι. - Εάν είναι επιλεγμένο το paint over transparent areas, η ζωγραφική πάνω σε διαφανείς περιοχές θα μειώσει ή θα εξαλείψει τη διαφάνεια. Εάν αυτή η επιλογή δεν είναι επιλεγμένη, ζωγραφίζονται μόνο οι αδιαφανείς περιοχές της εικόνας. - - TOPIC: ΑΝΤΙΓΡΑΦΗ ΑΠΟ ΕΙΚΟΝΑ Ζωγραφίστε πάνω σε περιοχές της εικόνας αντιγράφοντας από άλλη εικόνα. Η εικόνα-στόχος 'ζωγραφίζεται' σύροντας το ποντίκι πάνω από την περιοχή προς τροποποίηση. Μια προηγουμένως επιλεγμένη θέση στην εικόνα πηγή αντιγράφεται στην εικόνα-στόχο. Η περιοχή που αντιγράφεται και η περιοχή που ζωγραφίζεται περικλείονται και οι δύο σε κύκλους που μετακινούνται με το ποντίκι. Στο παραπάνω παράδειγμα, η βάρκα στη δεξιά εικόνα αντιγράφηκε στην αριστερή εικόνα. - Ξεκινήστε ανοίγοντας την εικόνα-στόχο. Επιλέξτε το μενού 'Copy From Image'. Ξεκινά μια 2η συνεδρία Fotocx που εμφανίζει την ίδια εικόνα. Σε αυτή τη 2η συνεδρία, πλοηγηθείτε στην εικόνα πηγή και ανοίξτε τη. Διευθετήστε τα δύο παράθυρα έτσι ώστε να μπορείτε να τα κρατάτε και τα δύο σε προβολή (τουλάχιστον τις περιοχές προς αντιγραφή). Κάντε shift + αριστερό κλικ στην εικόνα πηγή για να ορίσετε μια θέση πηγής. Κάντε shift + αριστερό κλικ στην εικόνα-στόχο στη θέση προορισμού. - Σύρετε το ποντίκι με το αριστερό κουμπί πάνω από την περιοχή της εικόνας-στόχου. Τα pixel από την εικόνα πηγή αντιγράφονται στην εικόνα-στόχο. Κάντε zoom μεγέθυνση στις εικόνες στο μέγιστο μέγεθος εάν χρειάζεται υψηλή ακρίβεια για τις θέσεις αναφοράς. Η αρχική θέση αναφοράς είναι (0,0) (γωνία NW) και για τις δύο εικόνες. Δείτε την {MOUSE PAINTING} για το πώς να εφαρμόζετε επεξεργασίες τοπικά χρησιμοποιώντας το ποντίκι. - Η τιμή κλίμακας της εικόνας πηγής χρησιμοποιείται για την προσαρμογή της κλίμακας της εικόνας πηγής στην εικόνα-στόχο. Ξεκινήστε κάνοντας μια δοκιμαστική αντιγραφή για να ελέγξετε την κλίμακα. Εάν είναι πολύ μεγάλη ή πολύ μικρή, χρησιμοποιήστε το [undo all] για να διαγράψετε τη δοκιμή, αλλάξτε την τιμή κλίμακας, και δοκιμάστε ξανά. - Εάν είναι επιλεγμένο το paint over transparent areas, η ζωγραφική πάνω σε διαφανείς περιοχές θα μειώσει ή θα εξαλείψει τη διαφάνεια, ανάλογα με τα στοιχεία ελέγχου αδιαφάνειας του ποντικιού. Εάν αυτή η επιλογή δεν είναι επιλεγμένη, ζωγραφίζονται μόνο οι αδιαφανείς περιοχές της εικόνας. - - TOPIC: ΑΝΤΙΓΡΑΦΗ ΠΡΟΗΓΟΥΜΕΝΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ Η εικόνα από ένα προηγούμενο βήμα επεξεργασίας μπορεί να εφαρμοστεί στην τρέχουσα εικόνα τοπικά και σταδιακά, "ζωγραφίζοντας" με το ποντίκι. Η προηγούμενη επεξεργασία πρέπει να είναι μία από τις επεξεργασίες που έγιναν στην τρέχουσα εικόνα ενώ αυτή είναι ακόμα ανοιχτή - μη αποθηκευμένες επεξεργασίες χάνονται όταν ανοίγει μια νέα εικόνα. Μπορείτε να εφαρμόσετε οποιαδήποτε προηγούμενη επεξεργασία σε οποιαδήποτε περιοχή της τρέχουσας εικόνας που επεξεργάζεστε, όσο η εικόνα παραμένει ανοιχτή ως η τρέχουσα εικόνα. Επιλέξτε μια προηγούμενη επεξεργασία χρησιμοποιώντας την αναπτυσσόμενη λίστα η οποία δείχνει όλα τα προηγούμενα βήματα επεξεργασίας που έγιναν στην τρέχουσα εικόνα, με τη σειρά, και προσδιορίζονται από τη λειτουργία επεξεργασίας που χρησιμοποιήθηκε. Δείτε την {MOUSE PAINTING} για το πώς να εφαρμόζετε επεξεργασίες τοπικά χρησιμοποιώντας το ποντίκι. - - TOPIC: ΜΕΝΟΥ ΕΠΙΔΙΟΡΘΩΣΗΣ - - TOPIC: ΟΞΥΝΣΗ +image: sharpen.png - Αυτή η λειτουργία διαθέτει πέντε μεθόδους για την αύξηση της ευκρίνειας μιας θολής εικόνας, και μία μέθοδο για την αύξηση ευκρίνειας θολώματος κίνησης από την κάμερα ή την κίνηση του θέματος κατά την έκθεση. - Επιλέξτε τη μέθοδο, ορίστε τις παραμέτρους, πατήστε [εφαρμογή] και περιμένετε λίγα δευτερόλεπτα για να δείτε το αποτέλεσμα. Κάντε αλλαγές και επαναλάβετε τη διαδικασία μέχρι να μείνετε ικανοποιημένοι. Χρησιμοποιήστε την {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ} για να λειτουργήσετε σε διαφορετικά μέρη μιας εικόνας με διαφορετικές μεθόδους και παραμέτρους. - Για όλες τις μεθόδους, επιλέξτε μικρή ακτίνα για εικόνες που είναι ελαφρώς θολές και μεγαλύτερες τιμές για χειρότερες εικόνες. Το Amount ελέγχει την ισχύ της τροποποίησης. Το Threshold καταστέλλει τις αλλαγές σε pixel χαμηλής αντίθεσης: μια υψηλότερη τιμή μειώνει την ενίσχυση των ανωμαλιών χαμηλού επιπέδου (θόρυβος εικόνας, ανομοιόμορφοι τόνοι δέρματος, κ.λπ.). - Unsharp mask: μια κλασική μέθοδος που βρίσκεται στους περισσότερους επεξεργαστές εικόνας. Μια τεχνική περιγραφή μπορεί να βρεθεί με αναζήτηση στο internet. Αυτή η μέθοδος μπορεί να δημιουργήσει ορατά 'φωτοστέφανα' γύρω από άκρες υψηλής αντίθεσης. - Amplify Contrast: ενίσχυση της υπάρχουσας αντίθεσης. Η αποτελεσματικότητα είναι συγκρίσιμη με το unsharp mask, αλλά τα 'φωτοστέφανα' μειώνονται. - Kuwahara: μικρές γειτονιές γύρω από κάθε pixel συγκρίνονται μεταξύ τους. Στο pixel δίνεται το μέσο χρώμα της γειτονιάς με τη μικρότερη διαφορά. Αυτό αναγκάζει τα pixel σε μια θολή άκρη να ταιριάξουν με τη μία ή την άλλη πλευρά της άκρης. Οι άκρες γίνονται πολύ ευκρινείς. Η εικόνα μπορεί να φαίνεται 'τεμαχισμένη' εάν χρησιμοποιηθεί μεγάλη ακτίνα. Λεπτές λεπτομέρειες μπορεί να χαθούν. - Median diff: η φωτεινότητα του pixel συγκρίνεται με τη διάμεσο των pixel εντός της ακτίνας. Η φωτεινότητα αυξάνεται ή μειώνεται για pixel αντίστοιχα φωτεινότερα ή σκοτεινότερα από τον μέσο όρο της γειτονιάς. Η αποτελεσματικότητα είναι συγκρίσιμη με το unsharp mask, αλλά τα 'φωτοστέφανα' μειώνονται σημαντικά. Αυτή είναι η μόνη μέθοδος που λειτουργεί σε κάθε χρώμα RGB ξεχωριστά. Μπορεί να αυξήσει την ευκρίνεια μιας μετάβασης χρώματος ακόμα και εάν υπάρχει μικρή αλλαγή φωτεινότητας. - Richardson-Lucy: η εικόνα αποκτά ευκρίνεια χρησιμοποιώντας τη μέθοδο αποσυνέλιξης Richardson-Lucy. Αυτή η μέθοδος μπορεί να παράγει τα καλύτερα αποτελέσματα, αλλά είναι επίσης αρκετά αργή. Για να επιταχύνετε τη διαδικασία, ξεκινήστε επιλέγοντας μια μικρή αλλά πολυσύχναστη περιοχή της εικόνας χρησιμοποιώντας την {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ}. Αναζητήστε τη βέλτιστη ακτίνα και τον αριθμό επαναλήψεων χρησιμοποιώντας αυτή τη μικρή περιοχή. Στη συνέχεια χρησιμοποιήστε τις ίδιες ρυθμίσεις για την πλήρη εικόνα. Ο θόρυβος στην εικόνα θα εμποδίσει την αποτελεσματικότητα. Εάν συμβαίνει αυτό, χρησιμοποιήστε την {ΑΦΑΙΡΕΣΗ ΘΟΡΥΒΟΥ} πρώτα. - Μια εικόνα που έχει μεγεθυνθεί ακριβώς 2x μπορεί να αποκτήσει ευκρίνεια με το Richardson-Lucy, χρησιμοποιώντας ακτίνα 2.0 και 4 ή περισσότερες επαναλήψεις. Τα αποτελέσματα είναι αξιοσημείωτα καλά. - ^Διόρθωση Θολώματος Κίνησης +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - Βελτιστοποιήστε χειροκίνητα εικόνες με μικρό θόλωμα από κίνηση κάμερας ή αντικειμένου. Το θόλωμα από ένα κινούμενο αντικείμενο σε μια κατά τα άλλα ευκρινή εικόνα μπορεί να επεξεργαστεί χρησιμοποιώντας την {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ} για την απομόνωση του αντικειμένου. Το θόλωμα θεωρείται γραμμικό και σταθερής ταχύτητας. Οι είσοδοι είναι το 'blur span' σε pixel και η 'blur angle' σε μοίρες. Η αρχική εκτίμηση γωνίας μπορεί να καθοριστεί με shift + σύρσιμο ποντικιού κατά μήκος της εικόνας προς την κατεύθυνση του θολώματος (μπορεί να είναι η ίδια ή αντίθετη με την πραγματική κίνηση). Εισαγάγετε μια εκτίμηση του blur span χρησιμοποιώντας το Tools > Show RGB για να μετρήσετε το πλάτος του θολώματος κατά μήκος κάποιας φωτεινής άκρης χαρακτηριστικού εικόνας. Ρυθμίστε τις εισόδους, πατήστε [εφαρμογή], και επιθεωρήστε την εικόνα για να βρείτε τις βέλτιστες ρυθμίσεις. Ο χρόνος απόκρισης μπορεί να είναι αργός για μια μεγάλη εικόνα. Μπορείτε να επιταχύνετε τη διαδικασία εάν χρησιμοποιήσετε την {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ} για να επιλέξετε μια μικρή θολή περιοχή για βελτιστοποίηση του span και της γωνίας, στη συνέχεια εκκαθαρίστε την περιοχή για να επεξεργαστείτε ολόκληρη την εικόνα χρησιμοποιώντας τις ίδιες ρυθμίσεις. Ο αλγόριθμος μπορεί να παράγει θόρυβο "κυματισμού" (ringing), ο οποίος μπορεί να καταπιεστεί χρησιμοποιώντας την είσοδο 'suppress ringing'. Λειτουργεί καλύτερα να αφήνετε την τιμή καταστολής χαμηλή για να βρείτε το βέλτιστο span και γωνία, και στη συνέχεια να προσθέτετε καταστολή όπως χρειάζεται για τη μείωση του κυματισμού. Η μέθοδος αποσυνέλιξης Richardson-Lucy χρησιμοποιείται σε μία διάσταση. - ^Θόλωμα Κίνησης Ψηφιακής Κάμερας Δεν έχουν όλες οι θολές φωτογραφίες το θόλωμα σταθερής ταχύτητας που ταιριάζει καλύτερα σε αυτή τη μέθοδο. Η εικόνα μπορεί να είναι μια υπέρθεση πολλαπλών μικρότερων εκθέσεων. Ολόκληρη η εικόνα μπορεί να μην έχει εκτεθεί την ίδια στιγμή και να έχει το ίδιο θόλωμα (μηχανικό ή ηλεκτρονικό κινούμενο κλείστρο). Αυτή η μέθοδος μπορεί ακόμα να παράγει καλύτερα αποτελέσματα από εργαλεία αύξησης ευκρίνειας που λειτουργούν σε δύο διαστάσεις. Θα πρέπει να λειτουργεί καλύτερα σε παλιές φωτογραφίες που τραβήχτηκαν με κάμερες φιλμ, όπου το θόλωμα κίνησης είναι πιο κοντά σε σταθερή ταχύτητα. - - TOPIC: ΘΟΛΩΜΑ +image: blur.jpg - Επιλέξτε μια μέθοδο με το αντίστοιχο πλαίσιο ελέγχου, εισαγάγετε τις απαιτούμενες παραμέτρους, πατήστε [εφαρμογή]. Εάν η {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ} είναι ενεργή, επηρεάζονται μόνο οι επιλεγμένες περιοχές. - ^Κανονικό Θόλωμα Αναμείξτε κάθε pixel με τα γειτονικά pixel εντός της ακτίνας. Τα πιο κοντινά pixel έχουν μεγαλύτερο βάρος. Μπορείτε να ορίσετε την ακτίνα σε 1 και να πατάτε επανειλημμένα το [εφαρμογή] για να αυξήσετε αργά το θόλωμα ενώ παρακολουθείτε το αποτέλεσμα στην εικόνα. - Μπορείτε προαιρετικά να θολώσετε κατά διαφορετικές ποσότητες στην οριζόντια και κάθετη κατεύθυνση εάν εισαγάγετε ξεχωριστές οριζόντιες και κάθετες τιμές. Η είσοδος [ακτίνα] θα επιβάλει τις ίδιες τιμές και για τις δύο. - ^Ακτινικό Θόλωμα Αναμείξτε κάθε pixel με pixel κατά μήκος μιας γραμμής από ένα επιλεγμένο κέντρο. Το Radius καθορίζει μια κεντρική περιοχή που δεν θολώνεται. Το Length ορίζει το εύρος της γραμμής θολώματος: 0 έως length, από το κέντρο προς την άκρη. Επιλέξτε το κέντρο κάνοντας κλικ στην εικόνα. - ^Κατευθυνόμενο Θόλωμα Τραβήξτε μια θέση στην εικόνα χρησιμοποιώντας το ποντίκι. Η περιοχή γύρω από το ποντίκι θα θολωθεί προς αυτή την κατεύθυνση. Το Span καθορίζει το μέγεθος της περιοχής που θολώνεται. Το Intensity καθορίζει την ισχύ του θολώματος. - ^Διαβαθμισμένο Θόλωμα Θολώνονται μόνο τα pixel με λιγότερη αντίθεση από το δεδομένο όριο αντίθεσης, και η ακτίνα θολώματος κυμαίνεται από 1 έως τη δεδομένη τιμή για pixel με αντίστοιχη αντίθεση που κυμαίνεται από το δεδομένο όριο έως το μηδέν. Με λίγα λόγια: τα pixel χαμηλής αντίθεσης θολώνονται περισσότερο από τα pixel υψηλής αντίθεσης. Αυτό μπορεί να χρησιμοποιηθεί για την εξομάλυνση των τόνων δέρματος χωρίς να θολώνονται τα μαλλιά ή να μειώνεται η λάμψη στα μάτια. Στα άκρα, παράγει ένα εφέ "κόμικ". - ^Θόλωμα Φόντου (Bokeh) Θολώστε τις περιοχές του φόντου της εικόνας διατηρώντας ευκρινές το προσκήνιο. Επιλέξτε μία ή περισσότερες περιοχές που πρέπει να παραμείνουν ευκρινείς {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ}. Αφού επιλέξετε τις περιοχές προσκηνίου, αντιστρέψτε την επιλογή ώστε να επιλεγεί τώρα το φόντο {ΑΝΤΙΣΤΡΟΦΗ ΠΕΡΙΟΧΗΣ}. Αυτή είναι η περιοχή που θα θολωθεί. Υπάρχουν δύο διαθέσιμες μέθοδοι θολώματος: Constant blur: μια σταθερή ακτίνα θολώματος χρησιμοποιείται για όλες τις περιοχές που θολώνονται. Increase blur with distance: χρησιμοποιήστε την ελάχιστη ακτίνα θολώματος για pixel γειτονικά στο προσκήνιο και τη μέγιστη ακτίνα θολώματος για pixel στη μέγιστη απόσταση από το προσκήνιο. Αυτό απαιτεί τον υπολογισμό της απόστασης άκρης για όλα τα pixel του φόντου, κάτι που μπορεί να χρειαστεί σημαντικό χρόνο. Η ακτίνα θολώματος μπορεί να ποικίλλει χωρίς επανυπολογισμό των αποστάσεων άκρης. - - TOPIC: ΑΦΑΙΡΕΣΗ ΘΟΡΥΒΟΥ +image: denoise.jpg - Μειώστε τον θόρυβο σε φωτογραφίες που τραβήχτηκαν σε συνθήκες χαμηλού φωτισμού (υψηλό ISO), κάνοντας ομοιόμορφες επιφάνειες να φαίνονται διάστικτες. Παρέχονται δύο μέθοδοι, Median και Smooth. Η καλύτερη μέθοδος ποικίλλει ανάλογα με τον θόρυβο και τα χαρακτηριστικά της εικόνας. Η ανάμειξη μεθόδων (χρήση μιας και μετά μιας άλλης) μπορεί να είναι χρήσιμη. Η τιμή Radius καθορίζει τη γειτονιά pixel που θα χρησιμοποιηθεί για τη σύγκριση και ρύθμιση ενός δεδομένου pixel. Μια μεγάλη τιμή (Radius > 2) θα μειώσει τον θόρυβο πιο αποτελεσματικά αλλά μπορεί επίσης να προκαλέσει απώλεια λεπτομέρειας. Η τιμή limit θα προκαλέσει την αγνόηση pixel με τιμές φωτεινότητας RGB που διαφέρουν από τη διάμεσο της γειτονιάς περισσότερο από αυτή την ποσότητα. Αυτό είναι απαραίτητο για ορισμένες εικόνες ώστε να αποτραπεί η μεταχείριση μικροσκοπικών φωτεινών λεπτομερειών ως θόρυβο - π.χ. αστρονομικές φωτογραφίες. - Ορίστε μια τιμή Radius και πατήστε ένα από τα κουμπιά μεθόδου. Κάθε επανάληψη χρησιμοποιεί την προηγούμενη εικόνα ως σημείο εκκίνησης, οπότε πολλαπλές επαναλήψεις θα καταστείλουν σταδιακά τον θόρυβο και πιθανώς θα θολώσουν κάποιες λεπτομέρειες. Χρησιμοποιήστε το [επαναφορά] για να ξεκινήσετε από την αρχή. Το Median με Radius 1, ακολουθούμενο από Median με Radius 2, είναι ένας καλός συμβιβασμός μεταξύ καταστολής θορύβου και διατήρησης λεπτομέρειας. - Το slider Areas μπορεί να χρησιμοποιηθεί για τον περιορισμό της επεξεργασίας μόνο σε σκοτεινές περιοχές, ή σε ένα ευρύτερο φάσμα περιοχών. Οι σκοτεινές περιοχές τείνουν να έχουν πρόβλημα θορύβου περισσότερο από τις φωτεινές περιοχές. - Εάν βλέπετε κάποιες μικροσκοπικές κηλίδες θορύβου που επιμένουν, αυξήστε την τιμή limit, χρησιμοποιήστε το κουμπί [επαναφορά], και συνεχίστε με [διάμεσος] ή [ομαλό]. - Μπορείτε να εφαρμόσετε διαφορετική επεξεργασία σε διαφορετικές περιοχές της εικόνας - δείτε την {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ}, και μπορείτε να "ζωγραφίσετε" την εικόνα χρησιμοποιώντας διαφορετική επεξεργασία σε διαφορετικές περιοχές - δείτε την {ΖΩΓΡΑΦΙΚΗ ΕΠΕΞΕΡΓΑΣΙΩΝ}. - Κάθε χρώμα RGB επεξεργάζεται ανεξάρτητα. Δεν υπάρχει ξεχωριστή επεξεργασία χρωματικότητας ή φωτεινότητας. - Το κουμπί [measure] ξεκινά τον διάλογο στη δεξιά πλευρά για τη μέτρηση του πραγματικού επιπέδου θορύβου της εικόνας. Μετακινήστε το ποντίκι πάνω από την εικόνα για να εμφανίσετε τα επίπεδα θορύβου RGB εντός του κύκλου του ποντικιού (ακτίνα 10, περίπου 300 pixel). Αυτή πρέπει να είναι μια περιοχή χωρίς χαρακτηριστικά ώστε ο θόρυβος να είναι η μόνη παρούσα διακύμανση. Επιθεωρήστε την εικόνα σε μέγεθος 4X για να βεβαιωθείτε ότι βλέπετε θόρυβο και όχι υφή. Οι κουκκίδες δείχνουν μεμονωμένες τιμές RGB pixel σε σχέση με τον μέσο όρο των γύρω 5x5 pixel, που αναπαρίσταται από την κεντρική συνεχή γραμμή. Οι αριθμοί στο κάτω μέρος δείχνουν τη μέση φωτεινότητα RGB και τα επίπεδα θορύβου στην κλίμακα 0-255. Η κλίμακα του γραφήματος είναι -10 έως +10 και οι διακεκομμένες γραμμές είναι στο -5 και +5, σε σχέση με ένα συνολικό εύρος 0-255. Ο θόρυβος στο 9ο ή 10ο bit RGB είναι 0.5 ή 0.25 σε αυτή την κλίμακα. - ^Θόρυβος εικόνας RAW Για να μετρήσετε τον θόρυβο του αισθητήρα της κάμερας, χρησιμοποιήστε μια εικόνα RAW. Οι εικόνες JPEG επεξεργάζονται μέσα στην κάμερα για τη μείωση του θορύβου. Μπορεί να εκπλαγείτε από τα συνήθως υψηλά επίπεδα θορύβου στις εικόνες RAW. Ακόμα και ακριβές κάμερες με μεγάλους αισθητήρες μπορεί να έχουν λιγότερα από 8 bit χρώματος χαμηλού θορύβου. Όταν φιλτράρετε τον θόρυβο από μια εικόνα RAW, ανταγωνίζεστε τα ηλεκτρονικά και το λογισμικό που παράγουν το JPEG της κάμερας. Μπορεί να είναι πρόκληση να τα καταφέρετε καλύτερα. - - TOPIC: ΑΦΑΙΡΕΣΗ ΟΜΙΧΛΗΣ +image: defog.png +image: defog2.jpg - Αφαιρέστε την ομίχλη/καταχνιά σε μια εικόνα ή επιλεγμένη περιοχή. Υπάρχουν άλλα εργαλεία για αυτό (εξομάλυνση ιστογράμματος, τοπική αντίθεση, ενίσχυση αντίθεσης, retinex, κορεσμός), αλλά η αφαίρεση ομίχλης/καταχνιάς είναι δευτερεύουσα ως προς την κύρια λειτουργία τους. Αυτή η λειτουργία επιτίθεται απευθείας στην ομίχλη/καταχνιά: αφαιρεί ίσες ποσότητες χρώματος R/G/B (μειώνοντας τη φωτεινότητα και αυξάνοντας τον κορεσμό), και προαιρετικά προσθέτει πίσω τη χαμένη φωτεινότητα. Μπορεί επίσης να μειώσει το μπλε εάν αυτό γίνει υπερβολικά κυρίαρχο, όπως συχνά συμβαίνει με μακρινή καταχνιά. Μπορεί να χρειαστεί να χρησιμοποιήσετε την {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ} ή τη {ΖΩΓΡΑΦΙΚΗ ΕΠΕΞΕΡΓΑΣΙΩΝ} για να στοχεύσετε με ακρίβεια και να βελτιστοποιήσετε τις επιθυμητές περιοχές. Το παραπάνω παράδειγμα χρησιμοποίησε δύο περιοχές, τους λόφους στο προσκήνιο και το βουνό στο φόντο. - - TOPIC: ΚΟΚΚΙΝΑ ΜΑΤΙΑ +image: red-eyes1.png +image: red-eyes2.png - Μειώστε το εφέ κόκκινων ματιών από φωτογραφίες με φλας. Παρέχονται δύο μέθοδοι. Η πρώτη είναι πιο γρήγορη αλλά μπορεί να μη χειριστεί δύσκολες περιπτώσεις. Η δεύτερη μέθοδος είναι πιο αξιόπιστη αλλά χρειάζεται επίσης περισσότερο χρόνο και προσοχή. Για να χρησιμοποιήσετε την πρώτη λειτουργία, κάντε αριστερό κλικ σε ένα κόκκινο μάτι μία ή περισσότερες φορές μέχρι να μείνετε ικανοποιημένοι. Εάν η σκουρόχρωμη περιοχή είναι πολύ μικρή ή εκτός κέντρου, κάντε δεξί κλικ για να αναιρέσετε την αλλαγή και στη συνέχεια κάντε αριστερό κλικ πιο ακριβώς στο κέντρο του κόκκινου ματιού. Εάν ένα κόκκινο μάτι δεν μπορεί να διορθωθεί σωστά, κάντε δεξί κλικ για να αναιρέσετε την αλλαγή και στη συνέχεια χρησιμοποιήστε τη δεύτερη μέθοδο. Η δεύτερη μέθοδος μπορεί να χειριστεί καλύτερα πιο δύσκολες περιπτώσεις όπου το κόκκινο μάτι είναι μόνο ελαφρώς κόκκινο και η διαφορά χρώματος με τα βλέφαρα είναι πολύ μικρή για να τη διακρίνει ο αυτόματος αλγόριθμος. Τοποθετήστε τον δρομέα πάνω από το κέντρο του κόκκινου ματιού. Κρατήστε πατημένο το αριστερό κουμπί του ποντικιού και σύρετε τον δρομέα κάτω και δεξιά. Θα εμφανιστεί μια διακεκομμένη έλλειψη που περικλείει το κόκκινο μάτι. Επαναλάβετε εάν χρειάζεται για να κεντράρετε (περίπου) το κόκκινο μάτι στην έλλειψη. Σημειώστε ότι το σχήμα της έλλειψης εξαρτάται από την κατεύθυνση του σύρσιματος, κάτι που μπορεί να επιτρέψει πιο ακριβή περίκλειση μόνο του κόκκινου ματιού. Κάντε αριστερό κλικ μέσα στην έλλειψη επανειλημμένα ενώ παρακολουθείτε το κόκκινο μάτι να σκουραίνει, και σταματήστε όταν είναι αρκετά σκούρο. Εάν προχωρήσετε πολύ, τα βλέφαρα μπορεί να αρχίσουν να σκουραίνουν. Κάντε δεξί κλικ για αναίρεση και επαναλάβετε εάν χρειάζεται. - - TOPIC: ΕΞΥΠΝΗ ΔΙΑΓΡΑΦΗ +image: smart-erase.png +image: smart-erase2.jpg - Διαγράψτε μικρά αντικείμενα που μπορούν να χαλάσουν μια καλή φωτογραφία, όπως καλώδια ρεύματος, σκουπίδια στο έδαφος, μια πινακίδα, κ.λπ. Το ανεπιθύμητο αντικείμενο αντικαθίσταται με pixel που λαμβάνονται από τη γύρω περιοχή. Αυτό είναι μερικές φορές πολύ αποτελεσματικό (οι παρενέργειες σχεδόν αόρατες), και μερικές φορές όχι. Λειτουργεί καλύτερα για μικρά ή στενά αντικείμενα στη φωτογραφία. Το Radius ελέγχει το μέγεθος ενός κύκλου γύρω από τον δείκτη του ποντικιού, καθορίζοντας την περιοχή προς επιλογή και διαγραφή. Σύρετε το ποντίκι για να περικλείσετε το αντικείμενο προς αφαίρεση. Το σύρσιμο με το αριστερό κουμπί επιλέγει και το σύρσιμο με το δεξί κουμπί αποεπιλέγει. Πατήστε [Διαγραφή] για να διαγράψετε την επιλεγμένη περιοχή, αντικαθιστώντας τα pixel με τα πλησιέστερα pixel από έξω από την επιλογή. Εάν η επιλογή δεν ήταν αρκετά ακριβής, χρησιμοποιήστε το [Αναίρεση], ρυθμίστε την επιλεγμένη περιοχή, και [Διαγραφή] ξανά. Επαναλαμβανόμενες επιλογές και διαγραφές θα συσσωρεύονται μέχρι να χρησιμοποιήσετε το [New_Area] για να ξεκινήσετε μια νέα επιλογή. Οι προηγούμενες διαγραμμένες περιοχές είναι πλέον σταθερές και το [Αναίρεση] θα λειτουργήσει μόνο για τις επόμενες επιλογές. Είναι καλύτερο να εργάζεστε με μια εικόνα μεγεθυμένη στο 200% ή περισσότερο. Το στοιχείο ελέγχου Blur προσθέτει θόλωμα στα pixel αντικατάστασης. Αυτό μπορεί να μειώσει ορατές παρενέργειες, καθώς τα pixel αντικατάστασης μπορεί να είναι πιο ευκρινή από το περιβάλλον. Αλλάξτε τη ρύθμιση Blur και επαναλάβετε το κουμπί [Διαγραφή]. Τα κουμπιά [show] και [hide] μπορούν να χρησιμοποιηθούν για να εμφανίσετε το περίγραμμα της τρέχουσας επιλογής ή να το κρύψετε για να κρίνετε καλύτερα τα αποτελέσματα μετά τη διαγραφή. - Για μακριά λεπτά αντικείμενα (π.χ. καλώδια ρεύματος), μπορείτε να κάνετε κλικ σε δύο θέσεις και όλα τα ενδιάμεσα θα επιλεγούν. Η επιλογή λειτουργεί σε ευθεία γραμμή, οπότε για καμπυλωτά αντικείμενα θα χρειαστεί να κάνετε κλικ σε διαστήματα για να ακολουθήσετε την καμπύλη. - - TOPIC: ΑΦΑΙΡΕΣΗ ΦΩΤΟΣΤΕΦΑΝΟΥ +image: remove-halo.png +image: remove-halo2.png - Αφαιρέστε φωτοστέφανα που αφήνουν ορισμένες λειτουργίες επεξεργασίας. Επιλέξτε τον τύπο του φωτοστεφάνου: φωτεινό (το πιο συνηθισμένο) ή σκοτεινό. Σύρετε το ποντίκι με το αριστερό κουμπί πάνω από την περιοχή του φωτοστεφάνου για να τροποποιήσετε τα pixel μέσα στο ποντίκι, όπως φαίνεται στο παράδειγμα. Για ένα φωτεινό φωτοστέφανο, τα πιο φωτεινά pixel θα σκουρύνουν καθώς το ποντίκι σύρεται πάνω τους. Για ένα σκοτεινό φωτοστέφανο, τα πιο σκοτεινά pixel θα φωτίζουν. Χρησιμοποιήστε ακτίνα ποντικιού μεγαλύτερη από το πλάτος του φωτοστεφάνου, όπως φαίνεται στο παράδειγμα. Σύρετε το ποντίκι με το δεξί κουμπί για να επαναφέρετε τα αρχικά pixel. - - TOPIC: ΑΡΤΙΦΑΚΤ JPEG +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - Οι εικόνες JPEG που έχουν συμπιεστεί ιδιαίτερα (με χαμηλή ρύθμιση ποιότητας) μπορούν να εμφανίσουν τεχνουργήματα συμπίεσης με τη μορφή μικρών ορθογώνιων μπλοκ. Εάν ορισμένες περιοχές μιας φωτογραφίας έχουν επεκταθεί στο εύρος φωτεινότητάς τους, τέτοια μπλοκ μπορεί να γίνουν πιο ορατά επειδή τα βήματα φωτεινότητας είναι μεγαλύτερα (π.χ. τιμές RGB 11/12/13 φωτισμένες 5x σε 55/60/65). Αυτή η λειτουργία θολώνει τα όρια μεταξύ των μπλοκ για να τα κάνει λιγότερο ορατά. - Το 'Match Limit' καθορίζει πότε γειτονικά pixel αντιμετωπίζονται ως μέλη του ίδιου μπλοκ pixel. Το Match Limit μπορεί να οριστεί σε χαμηλότερη τιμή για να αντιστοιχιστούν πιο πλήρως τέτοια μπλοκ. Το 'Contrast Limit' χρησιμεύει στην αποτροπή ανάμειξης άκρων όπου η αντίθεση είναι υψηλή, προκαλώντας απώλεια λεπτομέρειας. Αλλάξτε τις δύο ρυθμίσεις και πατήστε [εφαρμογή]. Προβάλετε την προκύπτουσα εικόνα σε μέγεθος >2x και δοκιμάστε διαφορετικές ρυθμίσεις εάν η βελτιστοποίηση είναι σημαντική. Αυτή η λειτουργία θα είναι λιγότερο αποτελεσματική σε μια εικόνα που έχει αλλάξει κλίμακα. Χρησιμοποιήστε την {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ} για να επεξεργαστείτε επιλεκτικά προβληματικές περιοχές. - - TOPIC: ΕΞΟΜΑΛΥΝΣΗ ΑΚΜΩΝ +image: anti-alias.jpg - Μερικές φορές οι φωτογραφίες εμφανίζουν pixelation ('πριονωτές άκρες') κατά μήκος ορισμένων άκρων χαρακτηριστικών υψηλής αντίθεσης. Στο παραπάνω παράδειγμα, μπορείτε να το δείτε αυτό γύρω από το μάτι του πουλιού. Το εργαλείο anti-alias μπορεί να το μειώσει αυτό. Το εφέ είναι μικρό στις περισσότερες φωτογραφίες, όπου η επεξεργασία εντός της κάμερας μπορεί να έχει ήδη φροντίσει το πρόβλημα. Ένα δευτερεύον εφέ είναι ότι τα τεχνουργήματα jpeg σε ιδιαίτερα συμπιεσμένες εικόνες εξομαλύνονται κάπως. Εικόνες που έχουν μεγεθυνθεί σε μέγεθος θα έχουν πιο έντονα pixelation. Αυτά μπορούν να βοηθηθούν, ειδικά στην περίπτωση μεγέθυνσης 2x. - Χρησιμοποιήστε το κουμπί [εφαρμογή] για να καταστείλετε τα pixel, πολλές φορές εάν αυτό φαίνεται να βοηθά. Το 'Threshold' μπορεί να χρησιμοποιηθεί για την εξαίρεση pixel χαμηλής αντίθεσης από την επεξεργασία. Μια τιμή 0.1 ή λιγότερο είναι συνήθως η καλύτερη. - Το Fotocx χρησιμοποιεί τον αλγόριθμο Scale3x, τροποποιημένο ώστε να χρησιμοποιεί "παρόμοιους" και "διαφορετικούς" χρωματικούς τόνους αντί για "ίσο" και "όχι ίσο". - - TOPIC: ΠΡΟΣΑΡΜΟΓΗ RGB +image: adjust-RGB.png - Αλλάξτε τη συνολική φωτεινότητα και αντίθεση, ή αυτή των επιλεγμένων χρωμάτων. • Brightness - αύξηση ή μείωση της συνολικής φωτεινότητας της εικόνας • +Red -Cyan κ.λπ. - αλλαγή της φωτεινότητας του χρώματος και αλλαγή του συμπληρωματικού χρώματος προς την αντίθετη κατεύθυνση • Contrast All - αύξηση ή μείωση της συνολικής αντίθεσης της εικόνας • Contrast Red Green Blue - επεξεργασία μεμονωμένων χρωμάτων RGB - - TOPIC: ΠΡΟΣΑΡΜΟΓΗ HSL +image: adjust-HSL.png - Αλλάξτε ένα επιλεγμένο εύρος χρωμάτων σε μια εικόνα χρησιμοποιώντας HSL (Απόχρωση, Κορεσμός, Φωτεινότητα). Αυτή η λειτουργία μπορεί να χρησιμοποιηθεί για να διορθώσετε μια χρωματική επικράτηση ή να αλλάξετε ένα χρώμα σε άλλο (π.χ. έναν υπερεκτεθειμένο ουρανό - πολύ λευκό). Εάν δεν είστε εξοικειωμένοι με το μοντέλο χρώματος HSL, διαβάστε το άρθρο της Wikipedia σχετικά με αυτό. - Ξεκινήστε επιλέγοντας ένα χρώμα-στόχο της εικόνας για αντιστοίχιση και ρύθμιση, χρησιμοποιώντας shift + αριστερό κλικ στην εικόνα. Αυτό το χρώμα θα είναι το κέντρο ενός εύρους χρωμάτων που θα επιλεγούν για ρύθμιση. Επιλέξτε ποια χαρακτηριστικά χρώματος θα αντιστοιχιστούν χρησιμοποιώντας τα πλαίσια ελέγχου για απόχρωση, κορεσμό, και φωτεινότητα. Καθένα από αυτά θα στενέψει το εύρος των επιλεγμένων χρωμάτων. Εάν κανένα δεν είναι επιλεγμένο, επιλέγονται όλα τα χρώματα. Το Match Level μπορεί να χρησιμοποιηθεί για την περαιτέρω διεύρυνση του εύρους των επιλεγμένων χρωμάτων. 100% σημαίνει ότι επιλέγονται μόνο χρώματα που ταιριάζουν στενά. - Τα στοιχεία ελέγχου Output Color (απόχρωση, κορεσμός, φωτεινότητα) χρησιμοποιούνται για τον ορισμό του νέου χρώματος εξόδου το οποίο θα αντικαταστήσει ή θα αναμειχθεί με τα επιλεγμένα χρώματα εισόδου. Μπορείτε επίσης να ορίσετε αυτό το χρώμα από την εικόνα, χρησιμοποιώντας shift + δεξί κλικ. Το προκύπτον χρώμα θα είναι ένα μείγμα του αρχικού χρώματος και του νέου χρώματος. Το κλάσμα του νέου χρώματος ορίζεται από το slider Adjustment, το οποίο μπορεί να οριστεί από 0 έως 100%. Χρησιμοποιήστε τα πλαίσια ελέγχου HSL για να καθορίσετε ποια στοιχεία HSL του χρώματος εισόδου αντικαθίστανται με τα αντίστοιχα στοιχεία HSL του χρώματος εξόδου. Χρησιμοποιήστε τα sliders για το HSL του χρώματος εξόδου για να ρυθμίσετε το νέο χρώμα. Το χρώμα εξόδου εμφανίζεται στο μικρότερο πλαίσιο στα αριστερά, το οποίο ενημερώνεται καθώς μετακινείτε τα sliders. - Μετακινήστε τα sliders και παρακολουθήστε τις ζωντανές ενημερώσεις της εικόνας για να βελτιστοποιήσετε το αποτέλεσμα. Αυτό δεν είναι πολύ διαισθητικό, και η εξάσκηση θα βοηθήσει. Συμβουλή: ξεκινήστε αντιστοιχίζοντας απόχρωση και κορεσμό, και αντικαθιστώντας μόνο την απόχρωση - αυτό σημαίνει ότι ο κορεσμός και η φωτεινότητα του χρώματος εξόδου θα αντιγραφούν από τα αρχικά χρώματα της εικόνας, και θα αντικατασταθεί μόνο η απόχρωση. - - TOPIC: ΑΦΑΙΡΕΣΗ ΣΚΟΝΗΣ +image: remove-dust.png +image: remove-dust2.jpg - Εικόνες που προέρχονται από σκονισμένα σαρωμένα σλάιντ μπορεί να έχουν πολλές μικρές σκούρες κηλίδες - σκιές της σκόνης πάνω στα σλάιντ. Ιστορικές φωτογραφίες από το internet συχνά έχουν παρόμοιο πρόβλημα. Αυτή η λειτουργία μπορεί να αφαιρέσει την πλειονότητα τέτοιων κηλίδων. Μετακινήστε τα τρία sliders μέχρι να χρωματιστεί κόκκινος ο μέγιστος αριθμός κηλίδων σκόνης, στη συνέχεια πατήστε το κουμπί [διαγραφή] για να τις διαγράψετε. Πατήστε [red] για να επαναφέρετε την κόκκινη προβολή, στη συνέχεια μπορείτε να ρυθμίσετε ξανά τα sliders και να πατήσετε [διαγραφή]. Το slider "spot size limit" περιορίζει το μέγεθος των κηλίδων που θα διαγραφούν. Το slider "max. brightness" ορίζει ένα όριο για την αγνόηση κηλίδων που δεν είναι αρκετά σκούρες. Το slider "min. contrast" φιλτράρει κηλίδες με χαμηλή αντίθεση σε σχέση με το περιβάλλον τους. Αυτή η διαδικασία είναι συνήθως ένας συμβιβασμός. Εάν οι ρυθμίσεις δεν είναι βέλτιστες, μικρά χαρακτηριστικά όπως φύλλα δέντρων μπορεί να διαγραφούν, ή μεγάλες κηλίδες μπορεί να παραμείνουν στη θέση τους. Διαφορετικά μέρη της εικόνας μπορεί να χρειάζονται διαφορετικές ρυθμίσεις, π.χ. ο ουρανός μπορεί να αντιμετωπιστεί πιο επιθετικά από έναν τοίχο κτιρίου. Μπορείτε απλά να χρησιμοποιήσετε το Erase Dust πολλές φορές με διαφορετικές ρυθμίσεις όπως χρειάζεται για να λάβετε όλες τις κηλίδες σκόνης. Ή μπορείτε να χρησιμοποιήσετε την {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ} για να επεξεργαστείτε την εικόνα σε τμήματα. Εάν ορισμένες κηλίδες επιμένουν, μπορείτε να τις αντιμετωπίσετε χειροκίνητα με την {ΕΞΥΠΝΗ ΔΙΑΓΡΑΦΗ}. Ορίστε μικρή ακτίνα ποντικιού και κάντε κλικ σε κάθε κηλίδα για να την αφαιρέσετε. Κηλίδες από ίνες (μακριές και λεπτές) συνήθως δεν αφαιρούνται αυτόματα, αλλά η Έξυπνη Διαγραφή μπορεί να είναι αποτελεσματική εδώ. Εάν η σκόνη είναι φωτεινή, όπως στο παραπάνω παράδειγμα, χρησιμοποιήστε τη {ΛΕΙΤΟΥΡΓΙΑ ΧΡΩΜΑΤΟΣ} για να δημιουργήσετε ένα αρνητικό χρώματος, επεξεργαστείτε τη σκόνη, και στη συνέχεια επαναλάβετε το αρνητικό χρώματος για να επαναφέρετε την κανονική εικόνα. - - TOPIC: ΠΑΡΥΦΕΣ +image: fringes.png +image: fringesA.jpg - Διορθώστε περιφερειακές χρωματικές αποχρώσεις (πλευρική χρωματική εκτροπή) - όπου χρωματικές αποχρώσεις εμφανίζονται κυρίως στις εξωτερικές περιοχές της εικόνας. - Η αριστερή εικόνα παραπάνω είναι ένα μεγεθυμένο απόκομμα της πάνω αριστερής γωνίας μιας φωτογραφίας με πλευρική χρωματική εκτροπή. Αυτό εξαλείφθηκε ως επί το πλείστον στην επεξεργασμένη εικόνα στα δεξιά. Χρωματικές αποχρώσεις μπορούν να εμφανιστούν κατά μήκος άκρων υψηλής αντίθεσης, ειδικά στις εξωτερικές περιοχές της εικόνας όπου οι παραμορφώσεις του φακού είναι συνήθως μεγαλύτερες. Για να απαλλαγείτε από αυτές, κάντε zoom μεγέθυνση στην εικόνα σε μέγιστο μέγεθος και κεντράρετε σε μια περιοχή με χρωματικές αποχρώσεις. Πατήστε το κουμπί [search]. Τα επίπεδα κόκκινου και μπλε χρώματος αναπροσαρμόζονται ώστε να ευθυγραμμιστούν καλύτερα με το πράσινο επίπεδο, και οι παράγοντες που χρησιμοποιήθηκαν τοποθετούνται στο πλαίσιο διαλόγου. Μπορεί να μπορέσετε να βελτιώσετε το αποτέλεσμα αναθεωρώντας τους παράγοντες απευθείας στον διάλογο: αλλάξτε τους παράγοντες ενώ παρακολουθείτε τις χρωματικές αποχρώσεις στην εικόνα. - Αυτή η λειτουργία θα είναι λιγότερο αποτελεσματική εάν η εικόνα έχει περικοπεί έτσι ώστε το κέντρο της εικόνας να μην είναι πλέον το ίδιο με το κέντρο της αρχικής φωτογραφίας. - - TOPIC: ΜΕΝΟΥ ΒΕΛΤΙΩΣΗΣ - - TOPIC: ΕΞΟΜΑΛΥΝΣΗ ΙΣΤΟΓΡΑΜΜΑΤΟΣ +image: flatten1.jpg +image: flatten2.jpg - Αυξήστε την ορατή λεπτομέρεια σε περιοχές με κακή αντίθεση. Η φωτεινότητα του pixel ρυθμίζεται πάνω ή κάτω ώστε η κατανομή φωτεινότητας (ιστόγραμμα) για την περιοχή γύρω από το pixel να γίνει πιο ομοιόμορφη. Μια μικρότερη ακτίνα (μικρότερη περιοχή) θα εντείνει το εφέ. Υπάρχουν 5 ζώνες φωτεινότητας από την πιο σκοτεινή (1) έως την πιο φωτεινή (5). Μετακινήστε ένα slider για να αυξήσετε το εφέ για την αντίστοιχη ζώνη. Χρησιμοποιήστε το slider της ζώνης A για να μετακινήσετε και τα 5 sliders μαζί και να ορίσετε γρήγορα ένα αρχικό αποτέλεσμα. Στη συνέχεια χρησιμοποιήστε τα άλλα sliders ξεχωριστά για να ρυθμίσετε με ακρίβεια την εικόνα. - - TOPIC: ΤΟΠΙΚΗ ΑΝΤΙΘΕΣΗ +image: localcon1.jpg +image: localcon2.jpg - Αυξήστε την αντίθεση σε κάθε περιοχή μιας εικόνας. Η φωτεινότητα κάθε pixel συγκρίνεται με τη μέση φωτεινότητα της γύρω περιοχής. Η φωτεινότητα του pixel ρυθμίζεται για να αυξηθεί αυτή η διαφορά. Αυτή η λειτουργία υλοποιεί μια ευρέως χρησιμοποιούμενη μέθοδο εγχειριδίων. Το Radius καθορίζει το μέγεθος της περιοχής γύρω από κάθε pixel που χρησιμοποιείται για τη μέση φωτεινότητα. Το Power καθορίζει την ποσότητα αλλαγής φωτεινότητας. Το Color χρησιμοποιείται για την αύξηση του κορεσμού χρώματος. Μπορείτε να χρησιμοποιήσετε την επεξεργάσιμη καμπύλη για να φωτίσετε την εικόνα εξόδου για επιλεγμένα επίπεδα φωτεινότητας. Το παράδειγμα δείχνει φωτισμό των πιο σκοτεινών περιοχών της εικόνας. - Η Τοπική Αντίθεση μπορεί να δημιουργήσει "φωτοστέφανα" υπό ορισμένες συνθήκες: +image: localcon3.jpg - Η πρωτότυπη εικόνα είναι στα αριστερά. Στη μεσαία εικόνα εφαρμόστηκε η Τοπική Αντίθεση σε μέγιστη ισχύ. Ένα φωτοστέφανο μπορεί να φανεί κατά μήκος του ορίου μεταξύ των σκοτεινών λόφων και του πιο φωτεινού ουρανού. Αυτό μπορεί να διορθωθεί με ένα απλό κόλπο (δεξιά εικόνα). Επιλέξτε τις περιοχές του ουρανού ξεχωριστά, χρησιμοποιώντας την {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ}. Εφαρμόστε την Τοπική Αντίθεση σε αυτή την περιοχή. Αντιστρέψτε την επιλογή και εφαρμόστε την Τοπική Αντίθεση στο υπόλοιπο της εικόνας. - - TOPIC: ΕΝΙΣΧΥΣΗ ΑΝΤΙΘΕΣΗΣ +image: amplify-contrast.png +image: amplify-contrast2.jpg - Αυξήστε το φαινομενικό εύρος φωτεινότητας μιας εικόνας αυξάνοντας την τοπική αντίθεση. Μπορεί να αυξήσει περιοχές χαμηλής αντίθεσης χωρίς να αλλάξει περιοχές υψηλής αντίθεσης. Μπορείτε επίσης να χρησιμοποιήσετε την καμπύλη επεξεργασίας για να ποικίλλετε την ενίσχυση αντίθεσης ανάλογα με το αρχικό ποσό αντίθεσης. - Το slider Amplify κάτω από την καμπύλη ρυθμίζει τον υπολογισμό, από καθόλου ενίσχυση αντίθεσης έως πλήρη ενίσχυση. Εάν μετακινηθεί πολύ προς τα δεξιά, η εικόνα μπορεί να εμφανίσει άσχημα τεχνουργήματα, γι' αυτό επαναφέρετέ το μέχρι αυτά να εξαφανιστούν. Εάν ομοιόμορφες περιοχές (π.χ. ουρανός) γίνουν διάστικτες, τραβήξτε το αριστερό άκρο της καμπύλης προς τα κάτω για να μειώσετε την ενίσχυση για περιοχές χαμηλής αντίθεσης. Σε ορισμένες περιπτώσεις θα είναι καλύτερο να επιλέξετε διαφορετικές περιοχές της εικόνας και να τις επεξεργαστείτε ξεχωριστά, π.χ. συντηρητικά για τον ουρανό, πιο επιθετικά για επιφάνειες με υφή όπως πέτρινοι τοίχοι. - - TOPIC: ΚΑΘΟΛΙΚΟ RETINEX +image: global-retx.png +image: global-retx2.jpg - Βελτιώστε το χρώμα και την αντίθεση για εικόνες με έντονη ομίχλη/καταχνιά ή χρωματική επικράτηση (π.χ. μια φωτογραφία 100 ετών). Δοκιμάστε πρώτα το κουμπί [Auto]. Η εικόνα αναζητείται για να βρεθούν τα πιο φωτεινά και πιο σκοτεινά χρώματα RGB που υπάρχουν. Οι πιο σκοτεινές τιμές RGB αφαιρούνται από όλα τα pixel και οι προκύπτουσες τιμές RGB κλιμακώνονται προς τα πάνω ώστε οι μέγιστες τιμές RGB να είναι κοντά στο 255. Φυσικά αυτό μπορεί να μην είναι αρχικά βέλτιστο. Τα spin buttons ορίζονται στα σκοτεινά και λευκά όρια RGB που βρέθηκαν, και μπορείτε να αλλάξετε αυτά για να βελτιστοποιήσετε την προκύπτουσα εικόνα. Μπορείτε να επιλέξετε τα δικά σας σκοτεινά και φωτεινά σημεία επιλέγοντας την αντίστοιχη επιλογή στον διάλογο και κάνοντας κλικ στην εικόνα. Τα spin buttons πολλαπλασιαστή ορίζονται στο 1.0 από προεπιλογή, και μπορείτε να αλλάξετε αυτές τις τιμές για να ρυθμίσετε τη σχετική φωτεινότητα κάθε χρώματος RGB. Στο παραπάνω παράδειγμα, η 1η εικόνα είναι η πρωτότυπη, η 2η εικόνα δημιουργήθηκε χρησιμοποιώντας το κουμπί [Auto]. Η δεξιότερη στήλη των spin buttons θα ρυθμίσει όλα τα κουμπιά στην ίδια σειρά μαζί - χρησιμοποιήστε το ροδάκι του ποντικιού ή τα πλήκτρα βέλους πάνω/κάτω του πληκτρολογίου. - Το slider blend χρησιμοποιείται για την ανάμειξη της εικόνας εισόδου και της εικόνας retinex σε οποιαδήποτε αναλογία. Το slider reduce bright χρησιμοποιείται για την εξασθένιση του εφέ για πιο φωτεινές περιοχές της εικόνας, ειδικά τον ουρανό, όπου το Retinex μπορεί να παράγει περίεργα αποτελέσματα. - Ο αλγόριθμος προήλθε από έννοιες που δημοσιεύτηκαν για πρώτη φορά από τον Edwin Land τη δεκαετία του 1970. Αναζητήστε στο internet το 'retinex' για περισσότερες πληροφορίες. - - TOPIC: ΤΟΠΙΚΟ RETINEX +image: local-retx.png +image: local-retx2.jpg - Αυξήστε τις ορατές λεπτομέρειες σε σκοτεινές περιοχές της εικόνας και άλλες περιοχές με χαμηλή αντίθεση. Το εύρος φωτεινότητας μιας ζώνης γύρω από κάθε pixel χρησιμοποιείται για την αναπροσαρμογή της φωτεινότητας του pixel σαν να είχε αναπροσαρμοστεί ολόκληρη η ζώνη ώστε να καλύπτει ολόκληρο το εύρος φωτεινότητας 0-255. Το Τοπικό Retinex μπορεί να παράγει εντυπωσιακά αποτελέσματα εκεί όπου το Καθολικό Retinex είναι αδύναμο. - Η είσοδος radius καθορίζει το κατά προσέγγιση μέγεθος ζώνης γύρω από κάθε pixel. Το slider blend χρησιμοποιείται για την ανάμειξη της εικόνας εισόδου και της εικόνας retinex σε οποιαδήποτε αναλογία. Το slider reduce bright χρησιμοποιείται για την εξασθένιση του εφέ για πιο φωτεινές περιοχές της εικόνας, ειδικά τον ουρανό, όπου το Retinex μπορεί να παράγει περίεργα αποτελέσματα. Το slider reduce dark κάνει το ίδιο για πιο σκοτεινές περιοχές της εικόνας. Το παραπάνω παράδειγμα είναι περίπου 60% πρωτότυπη εικόνα + 40% retinex. - - TOPIC: ΚΟΡΕΣΜΟΣ +image: saturation.png - Ρυθμίστε τον κορεσμό χρώματος με βάση τη φωτεινότητα του pixel. Ο άξονας Y της καμπύλης επεξεργασίας είναι ο κορεσμός χρώματος, από μηδενικό χρώμα (όλες οι τιμές RGB ίσες) έως μέγιστο χρώμα (η χαμηλότερη τιμή RGB είναι μηδέν). Ο άξονας X της καμπύλης είναι η φωτεινότητα του pixel, από σκοτεινό έως μέγιστη φωτεινότητα. Η ουδέτερη θέση (χωρίς αλλαγή χρώματος) είναι η μεσαία τιμή, η οποία είναι επίσης η αρχική τιμή. Παράδειγμα: για να αυξήσετε την ένταση χρώματος των σκοτεινών περιοχών στην εικόνα, ανεβάστε το αριστερό άκρο της καμπύλης. Το slider Saturation μετακινεί ολόκληρη την καμπύλη πάνω ή κάτω χωρίς να αλλάζει το σχήμα της. - - TOPIC: ΗΠΙΑ ΕΣΤΙΑΣΗ +image: soft-focus2.jpg +image: soft-focus.png - Εφαρμόστε το κλασικό εφέ "απαλής εστίασης" σε μια φωτογραφία. Αυτό είναι ένα μείγμα μιας ευκρινούς εικόνας και μιας ελαφρώς θολής εικόνας. Η ρύθμιση radius καθορίζει την έκταση του θολώματος (εύρος pixel), και η ρύθμιση mix ορίζει το ποσοστό της θολής εικόνας στην τελική εικόνα εξόδου, από 0 έως 100 τοις εκατό. Μπορείτε να χρησιμοποιήσετε τη {ΖΩΓΡΑΦΙΚΗ ΕΠΕΞΕΡΓΑΣΙΩΝ} με αυτή τη λειτουργία, για να ποικίλλετε το εφέ για διαφορετικές περιοχές της εικόνας. - - TOPIC: ΔΙΑΒΑΘΜΙΣΗ ΦΩΤΕΙΝΟΤΗΤΑΣ +image: brite-ramp1.png +image: brite-ramp2.png - Ποικίλετε τη φωτεινότητα ή το χρώμα κατά μήκος μιας εικόνας. Μπορείτε να το χρησιμοποιήσετε αυτό για να αντισταθμίσετε ανομοιόμορφο φωτισμό ή μια χρωματική επικράτηση που ποικίλλει κατά μήκος της εικόνας. Η κατεύθυνση της αλλαγής καθορίζεται σχεδιάζοντας μια γραμμή στην εικόνα. Δημιουργήστε τη γραμμή κάνοντας κλικ στην εικόνα, στη συνέχεια σύρετε οποιοδήποτε άκρο για να ορίσετε την επιθυμητή κατεύθυνση. Στο παραπάνω παράδειγμα, το πράσινο αυξήθηκε προς την κατεύθυνση της γραμμής. Επεξεργαστείτε πρώτα την καμπύλη All για να ρυθμίσετε τη συνολική φωτεινότητα (όλα τα χρώματα), στη συνέχεια ρυθμίστε τις μεμονωμένες καμπύλες χρώματος RGB εάν χρειάζεται. - - TOPIC: ΣΚΟΤΕΙΝΙΑΣΜΑ ΑΚΡΩΝ +image: vignette.png +image: vignette2.jpg - Διορθώστε το σκοτείνιασμα που εμφανίζεται μερικές φορές στις γωνίες μιας φωτογραφίας. Μπορεί επίσης να χρησιμοποιηθεί για να αναδείξετε ή να χρωματίσετε ένα αντικείμενο ή περιοχή μέσα σε μια εικόνα. - Κάντε κλικ ή σύρετε το ποντίκι στην εικόνα για να αλλάξετε το κέντρο του σκοτεινιάσματος, το οποίο βρίσκεται αρχικά στο κέντρο της εικόνας. - Επιλέξτε 'Brightness' για να αλλάξετε τη φωτεινότητα της εικόνας σε ακτινικό μοτίβο: Ρυθμίστε το αριστερό ή δεξί άκρο της καμπύλης για να αλλάξετε τη φωτεινότητα του κέντρου και των άκρων της εικόνας αντίστοιχα. Μπορείτε να δώσετε ένα σκοτεινό περιθώριο γύρω από ένα πρόσωπο πορτραίτου, ή μπορείτε να διορθώσετε μια εικόνα με σκοτεινές γωνίες. Το μεσαίο επίπεδο της καμπύλης αντιστοιχεί σε καμία αλλαγή. Χρησιμοποιήστε χαμηλότερες τιμές για σκοτείνιασμα και υψηλότερες τιμές για φωτισμό. Το παραπάνω παράδειγμα σκοτεινιάζει σταδιακά την περιφέρεια της εικόνας αφήνοντας μια ευρεία κεντρική περιοχή αμετάβλητη. - Επιλέξτε 'Color' για να προσθέσετε ένα επιλεγμένο χρώμα στην εικόνα σε ακτινικό μοτίβο. Τιμές καμπύλης μηδέν αντιπροσωπεύουν καμία αλλαγή, και υψηλότερες τιμές προσθέτουν το επιλεγμένο χρώμα στην εικόνα. Η υψηλότερη τιμή αντιστοιχεί σε 100% χρώμα. Χρησιμοποιήστε αυτή τη λειτουργία για να προσθέσετε ένα χρωματικό περιθώριο σε μια εικόνα, π.χ. περιβάλλετε ένα πρόσωπο με ένα σταδιακά αυξανόμενο χρώμα. - - TOPIC: ΜΕΝΟΥ ΕΦΕ - - TOPIC: ΠΕΡΙΓΡΑΜΜΑΤΑ +image: outlines1.png +image: outlines2.jpg - Μετατρέψτε μια φωτογραφία σε σχέδιο περιγράμματος. Τα pixel υψηλής αντίθεσης εντείνονται και τα pixel χαμηλής αντίθεσης καταστέλλονται. Η ρύθμιση threshold ορίζει τα όρια αντίθεσης. Γραμμές κάτω από το ελάχιστο δεν εμφανίζονται, και αυτές πάνω από το μέγιστο θα έχουν μέγιστη φωτεινότητα. Το πλαίσιο ελέγχου 'black/white' μετατρέπει τις έγχρωμες γραμμές σε μαύρο πάνω σε λευκό ή λευκό πάνω σε μαύρο, ανάλογα με το πλαίσιο ελέγχου 'negative'. Χρησιμοποιήστε το 'Low Amplify' για να φωτίσετε ξεθωριασμένες γραμμές εάν το θέλετε. Το 'Mode B' έχει ως αποτέλεσμα πιο ομοιόμορφη φωτεινότητα γραμμής σε σύγκριση με το 'Mode A'. - - TOPIC: ΣΚΙΤΣΟ1 +image: sketch1.jpg - Μετατρέψτε μια φωτογραφία σε κάτι σαν σκίτσο. Τα σκοτεινά pixel συγκεντρώνονται σε λιγότερα pixel, αφήνοντας τις εκκενωμένες περιοχές πιο φωτεινές. Η αντίθεση μπορεί επίσης να χρησιμοποιηθεί ως υποκατάστατο για σκοτεινά pixel. Το Threshold μπορεί να χρησιμοποιηθεί για το φιλτράρισμα της εικόνας εισόδου κατά φωτεινότητα. Το Clip Level χρησιμοποιείται για το φιλτράρισμα της εξόδου ώστε να μειωθούν περαιτέρω απομονωμένα ή οριακά σκοτεινά pixel. Επιλέξτε χρώματα για προσκήνιο και φόντο. Η μείωση του μεγέθους της εικόνας εισόδου μπορεί να δώσει ενδιαφέροντα αποτελέσματα. Εάν το αποτέλεσμα φαίνεται "βρώμικο", χρησιμοποιήστε την {ΑΦΑΙΡΕΣΗ ΘΟΡΥΒΟΥ} ή τη {ΣΥΝΤΗΞΗ} για να εξομαλύνετε την εικόνα πριν την επεξεργαστείτε εδώ. - - TOPIC: ΣΚΙΤΣΟ2 +image: sketch2.png +image: sketch2b.jpg - Μετατρέψτε μια φωτογραφία σε κάτι σαν σκίτσο. Χρησιμοποιεί διαφορετική μέθοδο: pixel χαμηλής ... υψηλής αντίθεσης μετατρέπονται αντίστοιχα σε ανοιχτόχρωμα ... σκουρόχρωμα pixel. Η καμπύλη μπορεί να χρησιμοποιηθεί για την αύξηση ή μείωση της ισχύος της μετατροπής αντίθεσης. Η κλίμακα του άξονα x είναι η αντίθεση pixel, από χαμηλή έως υψηλή, και η τιμή y καθορίζει την ισχύ της μετατροπής. Το παράδειγμα δείχνει pixel χαμηλής αντίθεσης να καταστέλλονται (να γίνονται πιο ανοιχτόχρωμα). Η εικόνα εισόδου μπορεί να αναμειχθεί σε οποιαδήποτε αναλογία. Εάν το αποτέλεσμα φαίνεται "βρώμικο", χρησιμοποιήστε την {ΑΦΑΙΡΕΣΗ ΘΟΡΥΒΟΥ} ή τη {ΣΥΝΤΗΞΗ} για να εξομαλύνετε την εικόνα πριν την επεξεργαστείτε εδώ. - - TOPIC: ΚΙΝΟΥΜΕΝΟ ΣΧΕΔΙΟ +image: cartoon.jpg - Μετατρέψτε μια φωτογραφία σε σχέδιο τύπου κόμικ. Μαύρες γραμμές σχεδιάζονται πάνω σε άκρες χαρακτηριστικών στην εικόνα, όπου η φωτεινότητα ή το χρώμα αλλάζει απότομα. Το Line Threshold ορίζει την ευαισθησία για την ανίχνευση άκρων και τη σχεδίαση γραμμών, προκαλώντας τη σχεδίαση λιγότερων ή περισσότερων γραμμών. Το Line Width κάνει τις γραμμές πιο χοντρές ή πιο λεπτές. Το Kuwahara Depth ελέγχει μια λειτουργία αύξησης ευκρίνειας η οποία μπορεί να ενισχύσει τις άκρες χαρακτηριστικών μέσα στην εικόνα. - - TOPIC: ΑΝΑΓΛΥΦΟ +image: emboss2.jpg +image: emboss.png - Μετατρέψτε μια εικόνα σε προσομοιωμένο ανάγλυφο (εφέ 3D). Οι άκρες χαρακτηριστικών γίνονται πιο φωτεινές στη μία πλευρά και πιο σκοτεινές στην απέναντι, σαν να έχουν ανασηκωθεί και φωτιστεί από το πλάι. Η ρύθμιση radius καθορίζει το πλάτος του εφέ, και η ρύθμιση depth καθορίζει την ένταση. Η ρύθμιση Light Source καθορίζει τη γωνία από την οποία προέρχεται ο φαινομενικός φωτισμός. Αυτό μπορεί να ποικίλλει για να μεγιστοποιηθεί το εφέ για άκρες χαρακτηριστικών πιο κάθετες σε αυτή τη γωνία. - - TOPIC: ΠΛΑΚΙΔΙΑ1 Μετατρέψτε μια εικόνα σε πίνακα μονόχρωμων πλακιδίων. Μπορείτε να ελέγξετε το μέγεθος των πλακιδίων και το πάχος του κενού μεταξύ τους. Αυτό ονομάζεται επίσης 'pixelate'. Χρησιμοποιήστε το Select Area για να περιορίσετε τον μετασχηματισμό σε μια περιορισμένη περιοχή, π.χ. ένα πρόσωπο. - - TOPIC: ΠΛΑΚΙΔΙΑ2 +image: tiles2a.png +image: tiles2b.png - Μετατρέψτε μια εικόνα σε ακανόνιστα πλακίδια που ταιριάζουν κατά προσέγγιση με τα χρώματα και τα περιγράμματα της εικόνας. ^base size:^ Το βασικό μέγεθος πλακιδίου, το οποίο είναι το μέγεθος μονάδας πλακιδίου που χρησιμοποιείται για τη δημιουργία μεγαλύτερων πλακιδίων. ^color depth:^ Αριθμός χρωμάτων προς χρήση: 1 = 8 χρώματα, 2 = 64 χρώματα ... 8 = 16 εκατομμύρια χρώματα. ^tile area goal^: Το ανώτατο όριο μεγέθους πλακιδίου (περιοχή σε pixel). ^req. color match^: Ορίστε την ελάχιστη απαιτούμενη αντιστοίχιση χρώματος για μια μικρότερη περιοχή να ενσωματωθεί σε μια γειτονική μεγαλύτερη περιοχή: 0 = δεν έχει σημασία (μέγιστη ενσωμάτωση), 100 = απαιτείται τέλεια αντιστοίχιση (ελάχιστη ενσωμάτωση). - - TOPIC: ΖΩΓΡΑΦΙΚΗ +image: painting1.png +image: painting2.png - Μετατρέψτε μια εικόνα σε κάτι παρόμοιο με έναν ζωγραφικό πίνακα. Μειώνει τον αριθμό των χρωμάτων, αντιστοιχίζει κάθε συνεχόμενη περιοχή pixel με το ίδιο χρώμα, και στη συνέχεια ενσωματώνει μικρότερες περιοχές σε γειτονικές μεγαλύτερες περιοχές με την καλύτερη αντιστοίχιση χρώματος. - ^blur radius^: Θολώστε την εικόνα πριν την επεξεργασία. Αυτό έχει ως αποτέλεσμα πιο ομαλά όρια. ^color depth^: Αριθμός χρωμάτων προς χρήση: 1 = 8 χρώματα, 2 = 64 χρώματα ... 8 = 16 εκατομμύρια χρώματα. ^patch area goal^: Ορίστε ένα κατώτατο όριο για περιοχές που θα έχουν το δικό τους χρώμα: περιοχές μικρότερες από αυτόν τον αριθμό pixel θα απορροφηθούν σε μια γειτονική περιοχή με την πλησιέστερη αντιστοίχιση χρώματος. ^required color match^: Ορίστε την ελάχιστη απαιτούμενη αντιστοίχιση χρώματος για μια μικρότερη περιοχή να ενσωματωθεί σε μια γειτονική μεγαλύτερη περιοχή: 0 = δεν έχει σημασία (μέγιστη ενσωμάτωση), 100 = απαιτείται τέλεια αντιστοίχιση (ελάχιστη ενσωμάτωση). ^borders^: Καθορίζει εάν οι έγχρωμες περιοχές θα οριοθετούνται με ένα λεπτό μαύρο περίγραμμα, όπως ακανόνιστα πλακίδια σε ένα ψηφιδωτό. Μετά τη χρήση αυτής της λειτουργίας, η χρήση του {ΑΝΑΓΛΥΦΟ} μπορεί να προσθέσει ενδιαφέρουσα υφή στην εικόνα. - - TOPIC: ΥΦΗ +image: texture2.jpg +image: texture.png - Προσθέστε μια επιφάνεια με υφή σε μια εικόνα ή σε επιλεγμένες περιοχές μέσα σε μια εικόνα. Το Radius καθορίζει το μέγεθος του μοτίβου υφής. Το Strength καθορίζει την ένταση του μοτίβου, από σχεδόν αόρατη έως κυρίαρχη. - - TOPIC: ΣΥΝΤΗΞΗ +image: fusion.png +image: fusion2.jpg - Καταστείλτε μικρές λεπτομέρειες χαμηλής αντίθεσης σε μια εικόνα διατηρώντας παράλληλα την ευκρίνεια για μεγαλύτερα χαρακτηριστικά της εικόνας. Πατήστε [έναρξη] και παρακολουθήστε την εικόνα προσεκτικά. Η διαδικασία εκτελείται συνεχώς μέχρι να σταματήσει με το κουμπί [διακοπή]. Μικρές λεπτομέρειες θα εξασθενίσουν σιγά-σιγά. Η ετικέτα 'count' στο πλαίσιο διαλόγου δείχνει τον αριθμό επαναλήψεων. Μπορείτε να [διακοπή] τη διαδικασία για να επιθεωρήσετε την εικόνα και στη συνέχεια να συνεχίσετε την επεξεργασία με [έναρξη]. Χρησιμοποιήστε το κουμπί Undo/Redo για να συγκρίνετε την κατάσταση της εικόνας πριν/μετά. Συνεχίστε την επεξεργασία με [έναρξη]. Το κουμπί [βήμα] μπορεί να χρησιμοποιηθεί για την επεξεργασία ενός βήματος τη φορά. - - TOPIC: ΤΑΙΡΙΑΣΜΑ ΧΡΩΜΑΤΩΝ +image: match-colors.png - Αντιστοιχίστε τα χρώματα σε μια εικόνα με αυτά σε μια άλλη. Ένα μικρό σημείο, επιλεγμένο με κλικ ποντικιού, δειγματοληπτείται από κάθε εικόνα. Το σημείο στη 2η εικόνα θα γίνει να έχει το ίδιο μέσο χρώμα (τιμές RGB) με το σημείο από την 1η εικόνα. Οι παράγοντες που χρησιμοποιούνται για να γίνουν οι τιμές RGB ίδιες εφαρμόζονται στη συνέχεια σε όλα τα pixel της 2ης εικόνας. Μια συνηθισμένη χρήση είναι η αφαίρεση μιας χρωματικής επικράτησης από μια εικόνα σημειώνοντας ένα σημείο στην εικόνα που θα ταιριάξει με ένα χρώμα από άλλη εικόνα. - Διαδικασία: Ο διάλογος αναφέρει 5 βήματα προς εκτέλεση με τη σειρά. • Ορίστε μια ακτίνα για την περιοχή δείγματος σημείου. Ο προκύπτων κύκλος ποντικιού είναι η περιοχή σημείου προς δειγματοληψία. • Ανοίξτε την 1η εικόνα πατώντας το κουμπί [open]. • Κάντε κλικ στην εικόνα για να λάβετε ένα δείγμα χρώματος. • Ανοίξτε τη 2η εικόνα πατώντας το κουμπί [open]. • Κάντε κλικ στην εικόνα στο σημείο που θέλετε να ταιριάξετε με την 1η εικόνα. Τα χρώματα της εικόνας θα αλλάξουν μέσα σε ένα ή δύο δευτερόλεπτα. - - TOPIC: ΜΟΤΙΒΟ +image: pattern2.jpg +image: pattern1.png - Προσθέστε ένα μοτίβο φόντου σε μια εικόνα. Ένα μικρό αρχείο εικόνας (αρχείο μοτίβου) χρησιμοποιείται για την κάλυψη της τρέχουσας εικόνας διπλασιάζοντας το αρχείο, όπως ένας πλακοστρωμένος τοίχος. Αυτό το αρχείο μπορεί να είναι ένα πραγματικό μοτίβο (π.χ. μια εικόνα υφάσματος καμβά, έναν τοίχο από τούβλα, μια επαναλαμβανόμενη γεωμετρία ...), ή οποιοδήποτε άλλο είδος εικόνας. Το μοτίβο γίνεται ημιδιαφανές, ώστε η βασική εικόνα να φαίνεται σαν να είναι τυπωμένη πάνω στο μοτίβο, ή το μοτίβο πάνω στην εικόνα. Πολλά αρχεία μοτίβων μπορούν να βρεθούν χρησιμοποιώντας αναζήτηση στο web για "pattern image". Κατεβάστε μερικά από αυτά και περικόψτε τα εάν χρειάζεται σε μέγεθος γύρω στα 200-500 pixel. Για ευκολία, προσθέστε αυτά στα παρεχόμενα αρχεία μοτίβων στο ~/.fotocx/patterns. - Χρησιμοποιήστε το κουμπί [Περιήγηση] για να επιλέξετε ένα αρχείο μοτίβου. Το επιλεγμένο μοτίβο θα παρατεθεί σε πλακίδια για να καλύψει τη βασική εικόνα. Το μοτίβο είναι εν μέρει διαφανές ώστε η βασική εικόνα να φαίνεται μέσα από αυτό. Χρησιμοποιήστε το Zoom για να μεγαλώσετε ή να μικρύνετε το μέγεθος του μοτίβου. Υπάρχουν δύο μέθοδοι για την ανάμειξη του μοτίβου με τη βασική εικόνα. Η αδιαφάνεια του μοτίβου μπορεί να οριστεί 0-100%. Η βασική εικόνα χρησιμοποιείται για τη συμπλήρωση της μη χρησιμοποιημένης αδιαφάνειας. Το Contrast χρησιμοποιείται για την τροποποίηση της φωτεινότητας της βασικής εικόνας χρησιμοποιώντας τη φωτεινότητα του μοτίβου ως πρότυπο. Οι δύο παράμετροι μπορούν να αναμειχθούν σε οποιαδήποτε αναλογία. - Εάν το αρχείο μοτίβου περιέχει μια εικόνα που επαναλαμβάνεται σε σταθερά διαστήματα τόσο οριζόντια όσο και κάθετα, το κουμπί [Υπολογισμός] μπορεί να χρησιμοποιηθεί για να ορίσετε πλάτος και ύψος ώστε να δημιουργηθεί ένα συνεχές μοτίβο χωρίς ορατές ραφές. - Εάν το μοτίβο είναι ακανόνιστο και οι ραφές είναι εμφανείς, μπορεί να μπορέσετε να το βελτιώσετε αυτό. Οι δύο τιμές Overlap καθορίζουν πόσο επικαλύπτονται τα διπλασιασμένα μοτίβα στις άκρες, οριζόντια και κάθετα. Προσθέστε κάποια επικάλυψη για να καλύψετε τα εφέ στις άκρες. - Το Select Area μπορεί να χρησιμοποιηθεί για την εφαρμογή ενός μοτίβου σε μέρος μιας εικόνας, ή διαφορετικών μοτίβων σε διαφορετικά μέρη. Μετά την εφαρμογή ενός μοτίβου σε μια εικόνα, μπορεί να είναι ενδιαφέρον να χρησιμοποιήσετε το {ΑΝΑΓΛΥΦΟ} για να προσθέσετε ένα εφέ 3-D στο μοτίβο. - Το πλαίσιο ελέγχου "Grayscale" θα μετατρέψει ένα έγχρωμο μοτίβο σε κλίμακα του γκρι. - - TOPIC: ΔΙΧΤΥΩΤΗ ΣΚΙΑΣΗ +image: crosshatch2.jpg +image: crosshatch1.png - Μετατρέψτε μια εικόνα σε σχέδιο χρησιμοποιώντας διασταυρούμενες παράλληλες γραμμές. Εισαγάγετε ένα μέγεθος πλέγματος και πατήστε [εφαρμογή]. - - TOPIC: DITHER +image: dither1.png - +image: dither2.jpg - Αυτή η λειτουργία παρέχει διάφορους τρόπους dither μιας εικόνας - μετατροπή σε κουκκίδες. 0 - έγχρωμες κουκκίδες στο στυλ του Roy Lichtenstein 1 - καθαρό R/G/B ή μαύρο/λευκό με τυχαία ή βελτιστοποιημένη χωρική κατανομή 2 - μείγμα RGB χρησιμοποιώντας ένα δεδομένο βάθος bit 3 - κλασικό dither χρησιμοποιώντας μια προσαρμοσμένη παλέτα χρωμάτων 4 - συμπύκνωση εικόνας σε blobs με μέσο χρώμα των συμπυκνωμένων pixel - Τα κλασικά dithers χρησιμοποιούν τη μέθοδο Floyd-Steinberg αντιστάθμισης χρωματικών σφαλμάτων: αναντιστοιχία μεταξύ ενός χρώματος εικόνας εισόδου και του πλησιέστερου χρώματος από την παλέτα. Κουκκίδες με κοντινά χρώματα αναμειγνύονται όπως χρειάζεται ώστε ο μέσος όρος σε μια περιοχή να ταιριάζει πιο στενά με το χρώμα εισόδου. Η αντιστάθμιση σφαλμάτων μπορεί να απενεργοποιηθεί εάν το θέλετε, για να λάβετε ευδιάκριτες ζώνες χρώματος ή περιγράμματα. - Blobs: Τα pixel της εικόνας υφίστανται ένα είδος "βαρυτικής κατάρρευσης", συγκλίνοντας σε συστάδες γύρω από τοπικά κέντρα μάζας. Η 'Mass' ορίζεται ως η φωτεινότητα του pixel. Το στοιχείο ελέγχου 'radius' καθορίζει κατά προσέγγιση το εύρος έλξης. Πατήστε [έναρξη] για να ξεκινήσει η κατάρρευση. Παρακολουθήστε την εικόνα να αλλάζει σιγά-σιγά σε blobs περίπου στο μέγεθος της εισόδου 'radius'. Όταν τα blobs είναι ωραία και στρογγυλά και αλλάζουν πολύ λίγο, πατήστε [διακοπή] για να ολοκληρώσετε τη διαδικασία. - - TOPIC: ΧΑΡΑΚΤΙΚΗ +image: engrave.png +image: engrave2.png - Μετατρέψτε μια εικόνα σε ασπρόμαυρες γραμμές. Η είσοδος Size καθορίζει το πάχος γραμμής και πόσα κάθετα pixel εικόνας χρησιμοποιούνται για κάθε κάθετη στήλη pixel στις γραμμές εξόδου. Οι στήλες pixel γραμμής διαχωρίζονται σε μαύρα και λευκά τμήματα με την αναλογία τους να ταιριάζει κατά προσέγγιση με τη μέση φωτεινότητα των pixel εισόδου. Η είσοδος Bias μπορεί να χρησιμοποιηθεί για τη βελτιστοποίηση της συνολικής φωτεινότητας. Αρνητικές/θετικές τιμές κάνουν την εικόνα πιο σκοτεινή/φωτεινή. Η είσοδος Color (0-100%) μπορεί να χρησιμοποιηθεί για την προσθήκη χρώματος στα λευκά τμήματα. - - TOPIC: ΠΡΟΣΘΗΚΗ ΛΑΜΨΗΣ +image: addglare.png +image: addglare2.jpg - Προσθέστε λάμψη που ακτινοβολεί προς τα έξω από φωτεινά σημεία σε μια εικόνα. Power: καθορίζει τη σχετική φωτεινότητα της λάμψης Limit: όριο φωτεινότητας pixel για την εκπομπή λάμψης Range: εύρος σε pixel της λάμψης από τα εκπέμποντα pixel Τα pixel με φωτεινότητα πάνω από το όριο (200-255) θα εκπέμπουν λάμψη. Φωτεινότητα εδώ σημαίνει τη φωτεινότητα του πιο φωτεινού χρώματος RGB σε ένα pixel. Η εκπεμπόμενη λάμψη είναι στο χρώμα του εκπέμποντος pixel. Το Range είναι σε μονάδες pixel. Η λάμψη θα είναι μέγιστη στο εκπέμπον pixel και θα μειώνεται σταδιακά στο μηδέν στο όριο του range. - - TOPIC: ΨΗΦΙΔΩΤΟ +image: mosaic1.png +image: mosaic2.jpg - Δημιουργήστε μια εικόνα ψηφιδωτού χρησιμοποιώντας πλακίδια φτιαγμένα από όλες τις εικόνες σας. - Καθορίστε το μέγεθος πλακιδίου σε pixel (π.χ. 36 x 24) και πατήστε [Πλακίδια]. Θα δημιουργηθούν πλακίδια από όλες τις εικόνες σας (στην πραγματικότητα χρησιμοποιούνται οι εικόνες thumbnail, για ταχύτητα). Εάν αλλάξετε τις διαστάσεις πλακιδίου, πατήστε ξανά [Πλακίδια] για να αναδημιουργήσετε τα πλακίδια. Αφού δημιουργηθούν τα πλακίδια, πατήστε [Εικόνα] για να μετατρέψετε την τρέχουσα εικόνα σε ψηφιδωτό χρησιμοποιώντας αυτά τα πλακίδια. Τα πλακίδια επιλέγονται αντιστοιχίζοντας το μέσο χρώμα πλακιδίου με το μέσο χρώμα εικόνας στη θέση του πλακιδίου. Εάν είναι διαθέσιμες χιλιάδες εικόνες και εάν το εύρος των χρωμάτων είναι αρκετά καλό, το ψηφιδωτό θα αποβεί αρκετά καλό. Κάντε zoom μεγέθυνση σε οποιοδήποτε μέρος της εικόνας για να δείτε τις εικόνες πλακιδίων. - Το slider Tile blending θα κάνει την εικόνα να αναμειχθεί με τα πλακίδια, κάνοντάς την να φαίνεται καλύτερη εάν τα πλακίδια δεν ταιριάζουν καλά σε χρώμα. Εάν η ανάμειξη είναι λιγότερη από περίπου 50%, τα πλακίδια παραμένουν σχεδόν τόσο καθαρά όσο πριν, επειδή το μάτι αντισταθμίζει τη λανθασμένη απόχρωση. - Αφού δημιουργηθεί ένα ψηφιδωτό, μπορείτε να κάνετε κλικ σε οποιοδήποτε πλακίδιο για να λάβετε μια μεγαλύτερη αναδυόμενη εικόνα. Εάν ανοιχτεί ένα αποθηκευμένο ψηφιδωτό, το κλικ στα πλακίδια για μεγαλύτερη εικόνα δεν θα λειτουργήσει. Η αναδημιουργία του ψηφιδωτού είναι αρκετά γρήγορη, γι' αυτό κάντε το εάν θέλετε να λειτουργήσουν οι αναδυόμενες εικόνες. - - TOPIC: ΠΡΟΣΘΗΚΗ ΘΟΡΥΒΟΥ +image: add-noise.png - Προσθέστε τυχαίο χρωματικό θόρυβο σε μια εικόνα. Ορίστε ένα μέγεθος σημείου-στόχου 1-10 και επίπεδο θορύβου 0-100%. Στο 100%, προστίθεται τυχαίος θόρυβος στο εύρος -127 έως +127 σε κάθε τιμή RGB κάθε pixel. Η μέση τιμή είναι μηδέν. Υπερχειλίσεις εκτός του εύρους 0-255 περικόπτονται. Το μέσο χρώμα σε μια μεγάλη περιοχή διατηρείται, με τον θόρυβο να επικάθεται. Μπορείτε να χρησιμοποιήσετε το Add Noise με το Select Area ή το Paint Edits για να προσθέσετε θόρυβο σε επιλεγμένες περιοχές. - ^Καταστολή του 'banding' Σε περιοχές εικόνας όπου η κατανομή φωτεινότητας έχει 'τεντωθεί', μπορεί να εμφανιστεί ορατό 'banding' σε περιοχές σχεδόν ομοιόμορφης φωτεινότητας και χρώματος. Μπορείτε να μειώσετε αυτό το πρόβλημα προσθέτοντας θόρυβο (ή θόλωμα) στις επηρεαζόμενες περιοχές. - - TOPIC: ΟΡΙΣΜΟΣ ΧΡΩΜΑΤΩΝ +image: set-colors1.jpg +image: set-colors2.jpg - Μπορείτε να μειώσετε τον αριθμό των χρωμάτων που χρησιμοποιούνται στην εικόνα για να δημιουργήσετε ένα εφέ αφίσας. Ορίστε κάθε χρώμα RGB ξεχωριστά, ή ρυθμίστε το συνολικό πλήθος χρωμάτων. Το βάθος bit χρώματος δεν χρησιμοποιείται για αυτό. Ορισμένες λειτουργίες στο Fotocx χρησιμοποιούν βάθος bit, περιορίζοντας τα διαθέσιμα χρώματα σε 2, 4, 8 ... για κάθε χρώμα RGB. Αυτή η λειτουργία δεν περιορίζεται ως προς αυτό. Το παραπάνω παράδειγμα χρησιμοποιεί 8 κόκκινα, 5 πράσινα, και 3 μπλε χρώματα. - - TOPIC: ΜΕΤΑΤΟΠΙΣΗ ΧΡΩΜΑΤΩΝ +image: shift-colors.png - Αυτή η λειτουργία μπορεί να χρησιμοποιηθεί για τη διόρθωση χρωμάτων ή τη μετατροπή μιας εικόνας σε ψευδή χρώματα. Επιλέξτε οποιοδήποτε από τα τρία χρώματα RGB και μετακινήστε το slider αριστερά ή δεξιά από το κέντρο. Ένα από τα άλλα δύο χρώματα θα αντικατασταθεί σταδιακά. Για παράδειγμα, μπορείτε να αντικαταστήσετε σταδιακά το πράσινο ή το μπλε με το κόκκινο χρώμα. Το slider All μετατοπίζει όλα τα χρώματα μαζί. Κάντε αυτό πρώτα για να βρείτε ένα πρώτο βέλτιστο, στη συνέχεια μετατοπίστε τα χρώματα RGB ξεχωριστά. - - TOPIC: ΠΕΡΙΕΡΓΑ ΧΡΩΜΑΤΑ +image: alien-colors2.jpg +image: alien-colors1.png - Επαναζωγραφίστε μια εικόνα ή επιλεγμένη περιοχή με τυχαία περίεργα χρώματα. Μπορείτε να ελέγξετε το κατά προσέγγιση μέγεθος μοτίβου και την ένταση (από ελάχιστα ορατή έως κυρίαρχη). Πατήστε [Εφαρμογή] για να λάβετε μια νέα κατανομή χρωμάτων. - - TOPIC: ΠΡΟΣΑΡΜΟΣΜΕΝΟΣ ΠΥΡΗΝΑΣ +image: custom-kernel.png - Εφαρμόστε έναν προσαρμοσμένο πυρήνα συνέλιξης σε μια εικόνα. Η υποκείμενη τεχνολογία εξηγείται στη Wikipedia. Εισαγάγετε ένα μέγεθος πυρήνα, έναν παράγοντα πολλαπλασιασμού, έναν παράγοντα πρόσθεσης, και συμπληρώστε τις τιμές του πίνακα. Το [Εφαρμογή] εφαρμόζει τον πυρήνα στην εικόνα. Το [Επαναφορά] επαναφέρει την αρχική κατάσταση της εικόνας. Οι τιμές μπορούν να αποθηκευτούν σε ένα αρχείο και να ανακτηθούν αργότερα χρησιμοποιώντας τα κουμπιά [Αποθήκευση] και [Φόρτωση]. Αρκετά αρχεία παραδειγμάτων πυρήνα είναι διαθέσιμα αρχικά. Μπορείτε να τα τροποποιήσετε και να τα αποθηκεύσετε με προσαρμοσμένο όνομα. - Math: οι τιμές φωτεινότητας για κάθε μπλοκ N-επί-N pixel στην εικόνα πολλαπλασιάζονται με τις αντίστοιχες τιμές στον πίνακα πυρήνα και προστίθενται μαζί. Αυτός ο αριθμός πολλαπλασιάζεται με τον παράγοντα πολλαπλασιασμού, και ο παράγοντας πρόσθεσης προστίθεται σε αυτόν. Αυτή η τελική τιμή γίνεται το νέο επίπεδο φωτεινότητας για το pixel εικόνας στο κέντρο του μπλοκ N x N. - - TOPIC: ΜΕΝΟΥ ΠΑΡΑΜΟΡΦΩΣΗΣ - - TOPIC: ΙΣΙΩΜΑ +image: unbend1.png +image: unbend2.jpg - Πανοράματα κοντινών θεμάτων (συνήθως κτίρια ή εσωτερικοί χώροι) μπορεί να δείχνουν ευθείες γραμμές που είναι καμπυλωμένες, ή κτίρια που είναι λοξά. Η παραμόρφωση των εικόνων ήταν απαραίτητη στη διαδικασία πανοράματος ώστε οι εικόνες να ταιριάξουν μεταξύ τους. Η λειτουργία Unbend μπορεί να χρησιμοποιηθεί στη συνέχεια για να ισιώσει την εικόνα πανοράματος εάν χρειάζεται. Κατακόρυφες και οριζόντιες διακεκομμένες γραμμές σχεδιάζονται πάνω στην εικόνα, δείχνοντας τους άξονες ισιώματος. Κάντε κλικ ή σύρετε το ποντίκι κοντά στο τέλος μιας γραμμής για να τη μετακινήσετε. Εάν αλλάξουν οι τιμές στα τέσσερα στοιχεία ελέγχου εισόδου, η εικόνα παραμορφώνεται με τον τρόπο που υποδεικνύεται από τις αντίστοιχες τέσσερις εικόνες. Αυξήστε ή μειώστε τις τιμές και επαναλάβετε μέχρι να μείνετε ικανοποιημένοι. Μετακινήστε τους άξονες για να αλλάξετε τα κέντρα παραμόρφωσης. - Δείτε επίσης {ΠΑΡΑΜΟΡΦΩΣΗ ΕΙΚΟΝΑΣ} για μια άλλη μέθοδο διόρθωσης της καμπύλωσης εικόνας και της προοπτικής. - - TOPIC: ΠΡΟΟΠΤΙΚΗ +image: perspective2.jpg +image: perspective1.png - Αυτή η λειτουργία μπορεί να χρησιμοποιηθεί για την ευθυγράμμιση μιας φωτογραφίας που τραβήχτηκε από λοξή γωνία. Η εικόνα στα αριστερά είναι η αρχική φωτογραφία, τραβηγμένη από τα δεξιά του κέντρου για να αποφευχθούν οι αντανακλάσεις. Η εικόνα στα δεξιά είναι η ευθυγραμμισμένη έκδοση. Αυτή η λειτουργία μπορεί επίσης να χρησιμοποιηθεί για την ευθυγράμμιση ενός ψηλού κτιρίου που φωτογραφήθηκε από το επίπεδο του δρόμου ή από το πλάι. - Κάντε κλικ στις τέσσερις γωνίες του τετραέδρου που θέλετε να μετατρέψετε σε ορθογώνιο (στην παραπάνω περίπτωση, οι τέσσερις γωνίες του πίνακα ή του πλαισίου), στη συνέχεια επιλέξτε [Εφαρμογή]. Οι γωνίες στις οποίες έγινε κλικ επισημαίνονται με μικρά λευκά πλαίσια που περιέχουν "A, B, C, D". Η πάνω αριστερή γωνία κάθε πλαισίου σηματοδοτεί ακριβώς τη θέση στην εικόνα. Το κλικ κοντά σε ένα πλαίσιο θα το μετακινήσει στη νέα θέση. Μπορείτε να χρησιμοποιήσετε τα πλήκτρα βέλους του πληκτρολογίου για να μετακινήσετε τους δείκτες γωνιών σε βήματα του 1 pixel. Τα πλήκτρα βέλους λειτουργούν στην τελευταία γωνία στην οποία έγινε κλικ ή μετακινήθηκε. - - TOPIC: ΠΑΡΑΜΟΡΦΩΣΗ ΕΙΚΟΝΑΣ +image: warps4.jpg - - TOPIC: ΠΑΡΑΜΟΡΦΩΣΗ ΠΕΡΙΟΧΗΣ Αυτή η λειτουργία μπορεί να χρησιμοποιηθεί για τη δημιουργία παραμορφώσεων μέσα σε μια εικόνα. Μπορείτε να επιλέξετε μια περιοχή εικόνας και να σύρετε το ποντίκι για να τεντώσετε αυτή την περιοχή σε σχέση με το υπόλοιπο της εικόνας. Η εικόνα είναι σαν λάστιχο. Εάν το σύρσιμο του ποντικιού ξεκινήσει εντός της επιλεγμένης περιοχής, τότε η περιοχή παραμορφώνεται εντός των τρεχόντων ορίων της - η κίνηση είναι μέγιστη στον δείκτη του ποντικιού και μειώνεται στο μηδέν στις άκρες της περιοχής. Εάν το σύρσιμο του ποντικιού ξεκινήσει έξω από την επιλεγμένη περιοχή, οι άκρες της περιοχής κοντά στο ποντίκι μπορούν να τραβηχτούν πέρα από το αρχικό όριο της περιοχής. Πολλά σύρσιμα ποντικιού διαφορετικού μήκους και κατεύθυνσης μπορούν να συνδυαστούν για την επίτευξη των επιθυμητών αποτελεσμάτων. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - Αυτή η λειτουργία είναι χρήσιμη για τη διόρθωση προβλημάτων προοπτικής. Σύρετε την εικόνα από κοντά σε μια γωνία, χρησιμοποιώντας το ποντίκι. Η εικόνα τραβιέται ελαστικά από αυτή τη γωνία ενώ οι άλλες γωνίες παραμένουν σταθερές. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - Αυτή η λειτουργία είναι χρήσιμη για τη διόρθωση προβλημάτων προοπτικής. Σύρετε την εικόνα από το εσωτερικό, χρησιμοποιώντας το ποντίκι. Το εσωτερικό της εικόνας τραβιέται ελαστικά ενώ τα όρια παραμένουν σταθερά. - - TOPIC: ΚΑΜΠΥΛΗ ΠΑΡΑΜΟΡΦΩΣΗ Αυτή η λειτουργία είναι χρήσιμη για τη διόρθωση προβλημάτων προοπτικής (δείτε επίσης {ΙΣΙΩΜΑ}). Σύρετε την εικόνα από οποιαδήποτε θέση, χρησιμοποιώντας το ποντίκι. Ολόκληρη η εικόνα θα τραβηχτεί ή θα σπρωχτεί προς την κατεύθυνση του ποντικιού, αλλά περιοχές κοντά στο ποντίκι μετακινούνται περισσότερο από πιο απομακρυσμένες περιοχές. Μπορείτε να ισιώσετε καμπύλες γραμμές ή να καμπυλώσετε σκόπιμα την εικόνα. Το στοιχείο ελέγχου 'warp span' καθορίζει την ακτίνα παραμόρφωσης γύρω από το ποντίκι. Το 1.0 σημαίνει ότι παραμορφώνεται ολόκληρη η εικόνα, και μικρότερες τιμές περιορίζουν την παραμόρφωση σε μικρότερες περιοχές γύρω από το ποντίκι. - - TOPIC: ΣΥΓΓΡΑΜΙΚΗ ΠΑΡΑΜΟΡΦΩΣΗ Αυτή η λειτουργία μπορεί να χρησιμοποιηθεί για την παραμόρφωση μιας εικόνας με ενδιαφέροντες τρόπους. Σύρετε την εικόνα από μια γωνία ή άκρη χρησιμοποιώντας το ποντίκι. Οι αλλαγές είναι καθαρά γραμμικές οπότε οι ευθείες γραμμές παραμένουν ευθείες. Αυτός ο μετασχηματισμός ονομάζεται "affine". Λεπτομέρειες μπορούν να βρεθούν με αναζήτηση στο web. - - TOPIC: ΑΚΤΙΝΙΚΗ ΠΑΡΑΜΟΡΦΩΣΗ +image: warp_radial.png - Προσθέστε ή αφαιρέστε παραμόρφωση βαρελιού ή μαξιλαριού. Η παραμόρφωση βαρελιού εμφανίζεται συχνά σε εικόνες RAW που δεν έχουν επεξεργαστεί για την αφαίρεση αυτής της παραμόρφωσης. Κάντε αριστερό κλικ για να επιλέξετε ένα κεντρικό σημείο όπου θα κεντραριστούν οι αλλαγές - κανονικά το κέντρο της εικόνας. Αυτή είναι η προεπιλογή. Μετακινήστε το slider 'stretch' για να λυγίσετε την εικόνα. - - TOPIC: ΑΠΟ-ΠΑΡΑΜΟΡΦΩΣΗ ΚΟΝΤΙΝΟΥ ΠΛΑΝΟΥ +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - Οι κοντινές φωτογραφίες προσώπου συχνά παραμορφώνονται, επειδή οι περιοχές πιο κοντά στην κάμερα είναι μεγαλύτερες στη φωτογραφία από τις περιοχές πιο μακριά. Αυτή η λειτουργία μπορεί να χρησιμοποιηθεί για την αντιστροφή της παραμόρφωσης. Χρησιμοποιήστε την {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ} για να επιλέξετε πρώτα το πρόσωπο (δεν χρειάζεται να είναι ακριβές). Κάντε κλικ στην εικόνα κοντά στο κέντρο της παραμόρφωσης (παραπάνω παράδειγμα: δεξί μάγουλο). Μετακινήστε το slider για βελτιστοποίηση. - - TOPIC: ΔΗΜΙΟΥΡΓΙΑ ΚΥΜΑΤΩΝ +image: make-waves2.jpg +image: make-waves1.png - Αυτή η λειτουργία παραμορφώνει μια εικόνα σε μοτίβο κύματος, σαν να προβάλλεται μέσα από ταραγμένο νερό. Ο διάλογος σας επιτρέπει να αλλάξετε το μέσο οριζόντιο και κάθετο μήκος κύματος, το πλάτος και τη διακύμανση. Η είσοδος "perspective" επιτρέπει στα μήκη κύματος να επιμηκύνονται σταδιακά από πάνω προς τα κάτω. - - TOPIC: ΣΤΡΙΨΙΜΟ +image: twist1.png +image: twist2.png - Αυτή η λειτουργία στρίβει την εικόνα γύρω από ένα σημείο που επιλέγεται με κλικ ή σύρσιμο ποντικιού. Κάντε κλικ στην επιθυμητή θέση και μετακινήστε το slider Twist όσο θέλετε. Μπορείτε επίσης να σύρετε το ποντίκι γύρω από την εικόνα για να αλλάξετε το κέντρο στριψίματος. Το slider Center ξεστρίβει την κεντρική περιοχή σε σχέση με το υπόλοιπο. Το slider Angle περιστρέφει την εικόνα. - - TOPIC: ΣΦΑΙΡΑ +image: sphere2.jpg +image: sphere.png - Δημιουργήστε μια σφαιρική προβολή μιας εικόνας. Σύρετε το ποντίκι στην εικόνα για να αλλάξετε το κέντρο της προβολής (προεπιλογή στο μέσο). Το στοιχείο ελέγχου flatten τροποποιεί σταδιακά την προβολή από μια σφαίρα (δεξιά) σε μια επίπεδη εικόνα (αριστερά). Το slider magnify μεγεθύνει την προκύπτουσα εικόνα έως 2x. - - TOPIC: ΑΠΟ ΜΕΣΑ ΠΡΟΣ ΤΑ ΕΞΩ +image: inside-out2.jpg +image: inside-out1.png - Αυτή η λειτουργία αντιστρέφει τις αποστάσεις κέντρου-άκρου κάθε pixel. Μπορείτε να κάνετε κλικ ή να σύρετε το ποντίκι για να ποικίλλετε το κεντρικό σημείο. - - TOPIC: ΜΙΚΡΟΣ ΠΛΑΝΗΤΗΣ +image: tiny-planet.jpg - Τυλίξτε μια εικόνα γύρω από έναν κύκλο. Εάν η εικόνα είναι ένα πανόραμα 360 μοιρών, δεν θα υπάρχει ορατή ραφή. • Center Hole: η εικόνα τυλίγεται γύρω από μια κεντρική τρύπα. • Cut Top: αφαίρεση ενός πάνω περιθωρίου από την εικόνα εισόδου. • Cut Bottom: αφαίρεση ενός κάτω περιθωρίου από την εικόνα εισόδου. • Reverse R: κατοπτρισμός της εικόνας εισόδου κάθετα. • Reverse Theta: κατοπτρισμός της εικόνας εισόδου οριζόντια. • Rotate: περιστροφή της εικόνας εξόδου γύρω από το κέντρο. - - TOPIC: ΣΠΕΙΡΑ ESCHER +image: escher-spiral.png +image: escher-spiralA.png - Μετατρέψτε μια εικόνα σε ατέλειωτη εσωστρεφή σπείρα όπως το διάσημο ρολόι του M.C.Escher. Το Width καθορίζει το αρχικό πλάτος του εξωτερικότερου επιπέδου. Το Rim καθορίζει το αρχικό πλάτος του περιγράμματος που διαχωρίζει τα επίπεδα, και το Color καθορίζει το χρώμα του. Το προεπιλεγμένο κέντρο είναι το κέντρο της εικόνας. Κάντε κλικ στην εικόνα για να ορίσετε ένα νέο κέντρο. - - TOPIC: ΕΞΟΜΑΛΥΝΣΗ ΦΩΤΟΓΡΑΦΙΑΣ +image: flatten-photo1.png +image: flatten-photo2.jpg - ^Σελίδα βιβλίου ή άλλη καμπύλη επιφάνεια Επιπεδοποιήστε μια φωτογραφία μιας εικόνας πάνω σε μια επιφάνεια που είναι καμπύλη, π.χ. γύρω από μια κολώνα, ή μια σελίδα από ένα ανοιχτό χοντρό βιβλίο, όπου οι σελίδες καμπυλώνουν προς τα μέσα στην κεντρική βιβλιοδεσία. Η καμπυλότητα των πάνω και κάτω άκρων της επιφάνειας παρέχει πληροφορίες σχετικά με την ποσότητα καμπυλότητας και την ποσότητα τεντώματος που χρειάζεται για να φαίνεται επίπεδη. Το παραπάνω παράδειγμα είναι ένα χοντρό βιβλίο. Άλλες στρογγυλεμένες επιφάνειες μπορούν να διορθωθούν, π.χ. μια αφίσα σε μια στρογγυλή κολώνα. - Επιλέξτε την επιλογή upper trace για να ιχνηλατήσετε την πάνω άκρη της καμπύλης σελίδας. Κάντε κλικ με το ποντίκι κατά μήκος της άκρης, δημιουργώντας μια κουκκίδα δείκτη σε κάθε σημείο όπου έγινε κλικ. Αφού είναι διαθέσιμα 4 σημεία, σχεδιάζεται μια καμπύλη γραμμή μέσα από τα σημεία. Προσθέστε περισσότερα σημεία και σύρετε τα σημεία όπως χρειάζεται ώστε η γραμμή να ταιριάζει στενά με την καμπύλη της εικόνας. Επιλέξτε την επιλογή lower trace και ιχνηλατήστε την κάτω άκρη με τον ίδιο τρόπο. Όταν και τα δύο ολοκληρωθούν, πατήστε [flatten] για να επιπεδοποιήσετε τη σελίδα. Οι άκρες θα πρέπει τώρα να είναι ευθείες (ή αρκετά ευθείες). Χρησιμοποιήστε το slider [stretch] για να τεντώσετε τις πλευρές της εικόνας όπως χρειάζεται, για να αντισταθμίσετε την πλευρική συμπίεση που προκαλείται από την καμπυλότητα. Χρησιμοποιήστε το στοιχείο ελέγχου Widen για να πλατύνετε την εικόνα όπως χρειάζεται ώστε να αποκατασταθεί η σωστή αναλογία πλάτους/ύψους. Το κουμπί [undo] επαναφέρει την ατροποποίητη εικόνα, διατηρώντας τις κουκκίδες δείκτη, οι οποίες μπορούν στη συνέχεια να ρυθμιστούν για μια αναθεωρημένη προσπάθεια. - +image: flatten-photo3.jpg - ^Καμπύλος ορίζοντας Ένα ευρύ πανόραμα, ή μια φωτογραφία από φακό ευρείας γωνίας, μπορεί να έχει έναν ορίζοντα που δεν είναι ευθύς ή οριζόντιος. Η εικόνα μπορεί να ευθυγραμμιστεί (ή διαφορετικά να μετακινηθεί) ιχνηλατώντας μια καμπύλη κατά μήκος του ορίζοντα ή άλλων περιοχών που χρειάζεται να ευθυγραμμιστούν κατά μήκος μιας ευθείας γραμμής. Επιλέξτε είτε την επιλογή upper trace είτε lower trace, ανάλογα με το εάν ο ορίζοντας (ή άλλο μέρος της εικόνας) βρίσκεται κυρίως πάνω ή κάτω από το μέσο της εικόνας. Η εικόνα θα παραμορφωθεί για να γίνει αυτή η καμπύλη ευθεία. Μια καμπύλη είναι αρκετή. Η άλλη καμπύλη προστίθεται αυτόματα στην αντίθετη άκρη (πάνω ή κάτω) της εικόνας. Εάν το αποτέλεσμα δεν είναι ικανοποιητικό, χρησιμοποιήστε το κουμπί [undo], ρυθμίστε τους δείκτες σε οποιαδήποτε καμπύλη, και δοκιμάστε ξανά. Μπορείτε επίσης να αποθηκεύσετε την εικόνα και να εφαρμόσετε τη λειτουργία μια δεύτερη φορά, χρησιμοποιώντας την αποθηκευμένη εικόνα ως σημείο εκκίνησης. - - TOPIC: ΜΕΝΟΥ ΣΥΝΔΥΑΣΜΟΥ Αυτές είναι λειτουργίες που συνδυάζουν πολλαπλά αρχεία εικόνας. Στην περίπτωση εικόνων που επικαλύπτονται, τα αντίστοιχα χαρακτηριστικά σε κάθε εικόνα ευθυγραμμίζονται ώστε να συμπίπτουν, με ακρίβεια ενός pixel. Ο χρόνος ευθυγράμμισης είναι συνήθως 10-30 δευτερόλεπτα ανά εικόνα. Εάν δείτε αυτή τη διαδικασία ευθυγράμμισης να πηγαίνει στραβά, μπορείτε να χρησιμοποιήσετε το πλήκτρο Escape για να τερματίσετε τη διαδικασία. - - TOPIC: HDR ^Υψηλό Δυναμικό Εύρος +image: HDR.jpg +image: HDR-adjust.png - Συνδυάστε (επικαλύψτε) πολλαπλές εικόνες του ίδιου θέματος με διαφορετικά επίπεδα έκθεσης. Η συνδυασμένη εικόνα μπορεί να δείξει βελτιωμένη ορατότητα λεπτομέρειας τόσο στις πιο σκοτεινές όσο και στις πιο φωτεινές περιοχές, χρησιμοποιώντας ουσιαστικά pixel από τις πιο φωτεινές εικόνες για τις σκοτεινές περιοχές, και από τις πιο σκοτεινές εικόνες για τις φωτεινές περιοχές. Εάν η κάμερα ρυθμίζεται χειροκίνητα μεταξύ των λήψεων, φροντίστε να την κρατάτε επίπεδη και να στοχεύετε στο ίδιο μακρινό σημείο. Κάποια αναντιστοιχία των εικόνων εισόδου είναι ανεκτή. Εάν άνθρωποι ή αντικείμενα κινούνται μεταξύ των λήψεων, το φάντασμα (ghosting) δεν μπορεί να αποφευχθεί. - Επιλέξτε τη λειτουργία μενού HDR και επιλέξτε έως 9 εικόνες ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}), οι οποίες πρέπει όλες να έχουν σχεδόν τις ίδιες διαστάσεις σε pixel. Οι εικόνες ευθυγραμμίζονται και συνδυάζονται αυτόματα. Όταν ολοκληρωθεί, εμφανίζεται η συνδυασμένη εικόνα, μαζί με έναν διάλογο για ρυθμίσεις. Οι συνεισφορές από τις εικόνες εισόδου εμφανίζονται ως μια σειρά επεξεργάσιμων καμπυλών. Η οριζόντια κλίμακα αντιπροσωπεύει τη φωτεινότητα pixel, από σκοτεινό έως φωτεινό. Κάθε καμπύλη αντιπροσωπεύει μια εικόνα που συνεισφέρει στα pixel εξόδου. Η συνεισφορά της εικόνας σε ένα δεδομένο επίπεδο φωτεινότητας είναι ανάλογη με το ύψος της καμπύλης της σε αυτό το επίπεδο. Η αρχική καμπύλη για την πιο φωτεινή εικόνα θα είναι υψηλή στα αριστερά και χαμηλή στα δεξιά, που σημαίνει υψηλή συνεισφορά σε σκοτεινά pixel και χαμηλή συνεισφορά σε φωτεινά pixel. Η πιο σκοτεινή εικόνα θα είναι χαμηλή στα αριστερά και υψηλή στα δεξιά, και οι υπόλοιπες εικόνες ενδιάμεσα. Οι καμπύλες μπορούν να επεξεργαστούν σύροντάς τες με το ποντίκι. Οι αντίστοιχες συνεισφορές εικόνας αλλάζουν ανάλογα, και μπορείτε να δείτε τα αποτελέσματα σε πραγματικό χρόνο στην εικόνα εξόδου. Η παραπάνω εικόνα δείχνει δύο εικόνες εισόδου και την εικόνα εξόδου τους. Ο διάλογος παραδείγματος δείχνει τρεις καμπύλες ρυθμισμένες για τη βελτιστοποίηση τριών εικόνων εισόδου. - - TOPIC: HDF ^Υψηλό Βάθος Πεδίου Συνδυάστε (επικαλύψτε) πολλαπλές φωτογραφίες του ίδιου θέματος με διαφορετικές ρυθμίσεις εστίασης από κοντινή έως μακρινή. Διαφορετικά μέρη του θέματος είναι σε ευκρινή εστίαση σε κάθε εικόνα. Συνδυάστε τις εικόνες ώστε όλα τα μέρη του θέματος να είναι ευκρινή. - Λήψη των φωτογραφιών: Επιλέξτε ένα σημείο για το κέντρο της εικόνας. Στοχεύστε την κάμερα σε ένα κοντινό αντικείμενο και πατήστε το κουμπί κλείστρου μέχρι τη μέση για να ορίσετε την εστίαση σε αυτό το αντικείμενο. Κρατήστε το κουμπί στη μέση θέση, στοχεύστε την κάμερα στο επιλεγμένο κέντρο, και τραβήξτε τη φωτογραφία. Τώρα επιλέξτε ένα πιο μακρινό αντικείμενο και κάντε το ίδιο. Επαναλάβετε με αυξανόμενη απόσταση εστίασης. Ελπίζουμε ότι κάθε μέρος του θέματος είναι ευκρινές σε τουλάχιστον μία φωτογραφία. Η θέση της κάμερας θα πρέπει να είναι σχεδόν η ίδια για όλες τις φωτογραφίες, κάτι που μπορεί να είναι πρόκληση εάν το θέμα είναι πολύ κοντά. Η κίνηση της κάμερας μπορεί να προκαλέσει προβλήματα κλιμάκωσης και παράλλαξης (κοντινά αντικείμενα μετατοπισμένα σε σχέση με μακρινά αντικείμενα). Τέτοια προβλήματα μπορεί να διορθωθούν αργότερα στο Fotocx, αλλά αυτό μπορεί να απαιτήσει σημαντικό χρόνο. Είναι καλύτερο να αποφεύγονται τα προβλήματα. - +image: HDF-paint.png - Επεξεργασία των φωτογραφιών: Επιλέξτε τη λειτουργία μενού HDF και επιλέξτε έως 9 εικόνες ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). Οι εικόνες θα ευθυγραμμιστούν τώρα όσο το δυνατόν καλύτερα. Η εικόνα εξόδου είναι ένα ομοιόμορφο μείγμα των ευθυγραμμισμένων εικόνων εισόδου. Αντισταθμίζεται μια μικρή ποσότητα κίνησης κάμερας μεταξύ των φωτογραφιών, αλλά αυτό είναι περιορισμένο, και οι μετατοπίσεις παράλλαξης δεν αντισταθμίζονται καθόλου. Όταν η ευθυγράμμιση ολοκληρωθεί, ανοίγει ένας διάλογος. Μπορείτε να επιλέξετε οποιαδήποτε εικόνα εισόδου και να τη "ζωγραφίσετε" με το ποντίκι σε οποιαδήποτε περιοχή της εικόνας εξόδου. Αυτό μετατρέπει το αρχικό μείγμα εικόνας στη μοναδική επιλεγμένη εικόνα για την περιοχή που ζωγραφίζεται. Για κάθε περιοχή ή αντικείμενο στην εικόνα, επιλέξτε μια εικόνα εισόδου που είναι ευκρινής σε αυτή την περιοχή. Η ακτίνα του πινέλου μπορεί να οριστεί μεγαλύτερη ή μικρότερη, ώστε να μπορείτε να ζωγραφίζετε μεγάλες περιοχές γρήγορα και να ελέγχετε λεπτές λεπτομέρειες όταν χρειάζεται. Εάν έχετε επικαλυπτόμενα κοντινά και μακρινά αντικείμενα, θα χρειαστεί χρόνος και υπομονή για να τα κάνετε όλα ευκρινή. Οι αναντιστοιχίες μπορούν να διορθωθούν επιλέγοντας την επιλογή warp στον διάλογο. Οι υποκείμενες εικόνες μπορούν στη συνέχεια να συρθούν και να παραμορφωθούν με το ποντίκι, και η συνδυασμένη εικόνα εξόδου αλλάζει ανάλογα. Η παραμόρφωση περιορίζεται στην περιοχή γύρω από το ποντίκι. Όταν σύρεται μια ζωγραφισμένη περιοχή, η αντίστοιχη εικόνα εισόδου επιλέγεται αυτόματα και σύρεται, ενώ οι περιοχές που ζωγραφίστηκαν με άλλες εικόνες παραμένουν σταθερές. Περιοχές που δεν έχουν ζωγραφιστεί δεν μπορούν να συρθούν. Μετακινηθείτε σε διαφορετικές περιοχές και κάντε σταδιακά σύρσιμα μέχρι όλα να ευθυγραμμιστούν. - Προτεινόμενη Ροή Εργασίας: Χρησιμοποιώντας τη λειτουργία paint, επιλέξτε κάθε εικόνα με τη σειρά και ζωγραφίστε όλες τις περιοχές που φαίνονται ευκρινείς σε αυτή την εικόνα. Τυχόν όρια που δεν είναι καλά ευθυγραμμισμένα θα εμφανιστούν καθαρά ως μετατοπίσεις στις άκρες των χαρακτηριστικών της εικόνας. Μερικά από αυτά μπορούν να γίνουν ασήμαντα αλλάζοντας την εικόνα που χρησιμοποιείται για ζωγραφική (εάν περισσότερες από μία εικόνες είναι αρκετά ευκρινείς). Χρησιμοποιώντας τη λειτουργία warp, κάντε λεπτές ρυθμίσεις όπως χρειάζεται για να εξαλείψετε ορατές μετατοπίσεις. - - TOPIC: ΣΤΟΙΒΑΞΗ/ΖΩΓΡΑΦΙΚΗ +image: stack-paint.png - +image: stack-paint2.jpg - Στοιβάξτε (επικαλύψτε) πολλαπλές φωτογραφίες του ίδιου θέματος που τραβήχτηκαν σε διαφορετικές στιγμές. Αφαιρέστε τουρίστες και αυτοκίνητα που έρχονται και φεύγουν μεταξύ των λήψεων. - Λήψη των φωτογραφιών: Στοχεύστε την κάμερα στο ίδιο μακρινό σημείο και τραβήξτε πολλαπλές φωτογραφίες καθώς τουρίστες ή αυτοκίνητα κινούνται μπροστά από το θέμα. Προσπαθήστε να λάβετε δύο ή περισσότερες φωτογραφίες για κάθε περιοχή του θέματος που δεν εμποδίζεται από τα παροδικά αντικείμενα. Κρατήστε την κάμερα σταθερή και στοχεύστε στο ίδιο σημείο, ώστε οι εικόνες να ευθυγραμμιστούν με ακρίβεια. - Επεξεργασία των φωτογραφιών: Επιλέξτε τη λειτουργία μενού Stack/Paint και επιλέξτε έως 9 εικόνες ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). Οι εικόνες θα ευθυγραμμιστούν τώρα όσο το δυνατόν καλύτερα. Η εικόνα εξόδου (κάτω αριστερά) είναι ένα ομοιόμορφο μείγμα των ευθυγραμμισμένων εικόνων εισόδου (πάνω σειρά). Όταν η ευθυγράμμιση ολοκληρωθεί, ξεκινά ο διάλογος που φαίνεται παραπάνω. Μπορείτε να επιλέξετε οποιαδήποτε εικόνα εισόδου και να "ζωγραφίσετε" με το ποντίκι σε οποιαδήποτε περιοχή της εικόνας εξόδου. Η μοναδική επιλεγμένη εικόνα χρησιμοποιείται για την περιοχή που ζωγραφίζεται. Για κάθε περιοχή στην εικόνα, επιλέξτε μια εικόνα εισόδου που είναι απαλλαγμένη από τα παροδικά αντικείμενα. Η ακτίνα του πινέλου μπορεί να οριστεί μεγαλύτερη ή μικρότερη, ώστε να μπορείτε να ζωγραφίζετε μεγάλες περιοχές γρήγορα και να ελέγχετε λεπτές λεπτομέρειες όταν χρειάζεται. - Αυτόματη λειτουργία: πατήστε το κουμπί [Απόκρυψη] για να δείτε εάν τα παροδικά αντικείμενα μπορούν να αφαιρεθούν αυτόματα. Αυτό θα λειτουργήσει για περιοχές στην εικόνα όπου είναι διαθέσιμες πολλαπλές φωτογραφίες του απαρεμπόδιστου φόντου (κάτω μεσαία εικόνα). Για να εμφανίσετε όλα τα παροδικά αντικείμενα, πατήστε το κουμπί [Εμφάνιση] (κάτω δεξιά εικόνα). Αυτό γενικά λειτουργεί, αλλά όχι τέλεια. Ελαφρές αναντιστοιχίες εικόνας ή διαφορές φωτισμού (ειδικά κινούμενες σκιές) μπορεί να προκαλέσουν στον αλγόριθμο να επιλέξει pixel φόντου αντί για pixel προσκηνίου. Μπορείτε να χρησιμοποιήσετε τη μέθοδο ζωγραφικής που περιγράφηκε παραπάνω για να διορθώσετε χειροκίνητα τα σφάλματα. - - TOPIC: ΣΤΟΙΒΑΞΗ/ΘΟΡΥΒΟΣ +image: stack-noise2.jpg +image: stack-noise.png - Αυτή η λειτουργία συνδυάζει 2-9 φωτογραφίες του ίδιου θέματος. Οι φωτογραφίες θα πρέπει να είναι σχεδόν ίδιες, εκτός από μικρές μετατοπίσεις που προκαλούνται από κάμερα στο χέρι. Εάν οι φωτογραφίες τραβήχτηκαν με πολύ υψηλή ρύθμιση ISO (συνθήκες χαμηλού φωτισμού), τα pixel θα έχουν σημαντικό θόρυβο. Τραβώντας πολλές φωτογραφίες και υπολογίζοντας τον μέσο όρο τους, ο θόρυβος μπορεί να εξαλειφθεί ως επί το πλείστον. - Επεξεργασία των φωτογραφιών: Επιλέξτε τη λειτουργία Stack/Noise και επιλέξτε έως 9 εικόνες ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). Θα συνδυαστούν αυτόματα και θα εμφανιστούν, και θα ανοίξει ένας διάλογος. Η αρχική εικόνα εξόδου είναι ένας συνδυασμός όλων των επιλεγμένων εικόνων εισόδου, με μέσο όρο μεταξύ τους. Αυτό σημαίνει ότι οι τιμές RGB για κάθε pixel εξόδου είναι ο μέσος όρος των τιμών RGB για τα αντίστοιχα pixel εισόδου. Το κουμπί median θα αλλάξει τα pixel εξόδου στη διάμεσο των pixel εισόδου (υπολογίζεται ο μέσος όρος 1-3 μεσαίων τιμών RGB, ανάλογα με τον αριθμό των εικόνων). Αυτό μπορεί ή όχι να είναι καλύτερο, οπότε εναλλάξτε για να συγκρίνετε. Τα πλαίσια ελέγχου omit low pixel και omit high pixel θα προκαλέσουν την απόρριψη των χαμηλότερων και υψηλότερων τιμών εισόδου RGB πριν τον υπολογισμό μέσου όρου. Αυτό μπορεί να αφαιρέσει αιχμές θορύβου από το μείγμα. Αυτό δεν έχει καμία επίδραση εάν έχει επιλεγεί η μέθοδος median. - - TOPIC: ΣΤΟΙΒΑΞΗ/ΕΠΙΠΕΔΑ +image: stack-layers.png - Χρησιμοποιήστε αυτή τη λειτουργία για να συνδυάσετε διαφορετικές επεξεργασμένες εκδόσεις μιας εικόνας, όπου μπορείτε να καθορίσετε ποια έκδοση εμφανίζεται σε επιλεγμένες περιοχές της εικόνας. Μπορούν να συνδυαστούν οποιεσδήποτε εικόνες που έχουν τις ίδιες διαστάσεις σε pixel. - Επιλέξτε έως 9 εικόνες πανομοιότυπου μεγέθους. Η αρχική εικόνα εξόδου είναι μια ίση ανάμειξη όλων των εικόνων εισόδου. Τα Image Ratios είναι τα σχετικά βάρη των αναμεμειγμένων εικόνων. Αυτά μπορούν να ρυθμιστούν για να ποικίλλει το βάρος κάθε εικόνας. Παράδειγμα: εάν 3 εικόνες συνδυάζονται με σχετικά βάρη 3, 5, 7, τότε η συνδυασμένη εικόνα είναι 3/15 από την εικόνα #1, 5/15 από την #2, και 7/15 από την #3. Εάν είναι επιλεγμένη η επιλογή "Paint entire image", τα βάρη μπορούν να ρυθμιστούν και η εικόνα εξόδου ανταποκρίνεται άμεσα. Εάν είναι επιλεγμένη η επιλογή "Paint within mouse", τότε το ποντίκι μπορεί να συρθεί και ζωγραφίζεται μόνο η περιοχή εντός του κύκλου του ποντικιού, χρησιμοποιώντας τις τρέχουσες ενεργές αναλογίες εικόνας. Η ταχύτητα ζωγραφικής ελέγχεται από τις ρυθμίσεις Power για το κέντρο και την άκρη του ποντικιού. Χρησιμοποιήστε χαμηλούς αριθμούς για σταδιακή ζωγραφική. - - TOPIC: ΠΑΝΟΡΑΜΑ +image: pano-align1.jpg +image: pano-align2.jpg - Αυτή η λειτουργία ενώνει 2-6 εικόνες μαζί για τη δημιουργία μιας εικόνας ευρείας γωνίας ή πανοράματος. Οι εικόνες πρέπει να επικαλύπτονται κατά 10% ή περισσότερο, ώστε το πρόγραμμα να μπορεί να βρει πού ταιριάζουν και να τις ενώσει μαζί. Ξεκινήστε επιλέγοντας 2-6 αρχεία εικόνας ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). Είναι χρήσιμο να επιλέξετε τις εικόνες με σειρά από αριστερά προς τα δεξιά, για να διευκολυνθεί η αρχική χονδρική ευθυγράμμιση. Οι εικόνες ενώνονται αρχικά και εμφανίζονται με μια μικρή διαφανή επικάλυψη. Ένας διάλογος pre-align (παραπάνω) σας ζητά να σύρετε τις εικόνες σε χονδρική ευθυγράμμιση. Σύρετε τις εικόνες στη σωστή σειρά από αριστερά προς τα δεξιά. Η εικόνα προς σύρσιμο μπορεί να επικαλύπτει άλλες εικόνες. Για να είναι σαφές ποια εικόνα σύρεται, σύρετε από κοντά στο κέντρο της εικόνας. Αφού οι εικόνες βρίσκονται στη σωστή σειρά, ευθυγραμμίστε κάθε εικόνα με τη γειτονική της στα αριστερά. Λειτουργεί καλύτερα να προχωράτε από αριστερά προς τα δεξιά. Μετακινήστε μια εικόνα οριζόντια και κάθετα σε χονδρική ευθυγράμμιση με τη γειτονική της στα αριστερά, στη συνέχεια περιστρέψτε την εικόνα εάν χρειάζεται σύροντας την κάτω άκρη αριστερά ή δεξιά - η εικόνα περιστρέφεται γύρω από το μέσο σημείο της επικάλυψής της με την εικόνα στα αριστερά. Η γρηγορότερη μέθοδος είναι να ευθυγραμμίσετε πρώτα τη μεσαία περιοχή επικάλυψης, στη συνέχεια να περιστρέψετε τη δεξιά εικόνα εάν χρειάζεται για να φέρετε τις πάνω και κάτω περιοχές επικάλυψης σε ευθυγράμμιση. Η ακρίβεια ΔΕΝ χρειάζεται να είναι υπερβολική. Οι εικόνες θα πρέπει να είναι σωστά καμπυλωμένες και να ταιριάζουν καλά μεταξύ τους. Εάν δεν ταιριάζουν, τότε το 'lens mm' (εστιακή απόσταση, ισοδύναμο 35mm) χρειάζεται ρύθμιση. Η καμπυλότητα της εικόνας αλλάζει καθώς ρυθμίζεται το lens mm. Η αρχική τιμή λαμβάνεται από τα metadata EXIF εάν είναι διαθέσιμα, και αυτό είναι συνήθως αρκετά καλό. Εάν οι εικόνες δεν έχουν καμπυλότητα (π.χ. σαρωμένες εικόνες), χρησιμοποιήστε το πλαίσιο ελέγχου 'no curve' για να ορίσετε το 'lens mm' ουσιαστικά στο άπειρο. - Εάν κάποια από τις εικόνες έχει περικοπεί, τα μαθηματικά που εξαρτώνται από την εστιακή απόσταση EXIF δεν λειτουργούν. Μπορεί να μπορέσετε να αντισταθμίσετε αυξάνοντας την εστιακή απόσταση στο 'lens_mm'. - Το πλαίσιο ελέγχου 'manual align' θα χρησιμοποιήσει τη χειροκίνητη προ-ευθυγράμμιση ως τελική ευθυγράμμιση. Αυτό είναι για εικόνες που δεν έχουν σαφή χαρακτηριστικά απαραίτητα για την ευθυγράμμιση των εικόνων. Αυτή η επιλογή επιτρέπει επίσης στις εικόνες να έχουν μηδενική επικάλυψη. - Πατήστε [proceed] όταν ολοκληρωθεί η προ-ευθυγράμμιση, και το πρόγραμμα θα κάνει λεπτομερή ευθυγράμμιση και θα ενώσει τις εικόνες. Εσωτερικά, οι εικόνες μετατοπίζονται και περιστρέφονται και αξιολογείται ο βαθμός αντιστοίχισης. Αυτό γίνεται με αυξανόμενα μεγέθη εικόνας μέχρι να βρεθεί η καλύτερη ευθυγράμμιση. Αυτό μπορεί να χρειαστεί ένα λεπτό ή περισσότερο, ανάλογα με την ταχύτητα CPU και το μέγεθος της εικόνας. Μπορείτε να επιταχύνετε σημαντικά τη διαδικασία εάν μειώσετε τις εικόνες εισόδου σε μέγεθος 2/3 ή 1/2. Κάντε το ίδιο εάν η διαδικασία αποτύχει λόγω έλλειψης μνήμης. - +image: pano-adjust.jpg - Όταν ολοκληρωθεί η λεπτομερής ευθυγράμμιση, εμφανίζεται η συνδυασμένη εικόνα. Ο παραπάνω διάλογος ξεκινά για λεπτομερείς ρυθμίσεις φωτεινότητας. Μπορεί να δείτε ένα όριο μεταξύ των εικόνων εάν δεν έχουν την ίδια φωτεινότητα. Επιλέξτε μια εικόνα χρησιμοποιώντας τα κουμπιά επιλογής στην κορυφή. Χρησιμοποιήστε το κουμπί [αυτόματο χρώμα] επανειλημμένα για να βελτιώσετε αυτόματα την αντιστοίχιση φωτεινότητας/χρώματος των εικόνων. Η βασική εικόνα είναι η τρέχουσα επιλεγμένη. Δοκιμάστε διαφορετικές βασικές εικόνες για να δείτε ποια λειτουργεί καλύτερα. Εάν οι εικόνες ταιριάζουν άσχημα σε φωτεινότητα, επιλέξτε τη μεγαλύτερη ακραία τιμή και χρησιμοποιήστε το στοιχείο ελέγχου φωτεινότητας για να αλλάξετε τη φωτεινότητα ώστε να ταιριάζει με τις άλλες, ακολουθούμενο από [αυτόματο χρώμα]. Η αντιστοίχιση δεν χρειάζεται να είναι πολύ καλή, αφού το 'Blend Width' (επόμενο) θα καλύψει τις υπόλοιπες διαφορές. Χρησιμοποιήστε το κουμπί 'File Color' για να επαναφέρετε τα επίπεδα φωτεινότητας από τα αρχεία εικόνας εισόδου. - Το στοιχείο ελέγχου 'Blend Width' διέπει τον τρόπο με τον οποίο οι εικόνες αναμειγνύονται μεταξύ τους: στις επικαλύψεις εικόνων, η φωτεινότητα αλλάζει σε αυτόν τον αριθμό pixel, για να καλύψει ανισορροπίες που δεν μπορούν να διορθωθούν πλήρως. Η προεπιλογή είναι 1 pixel, το οποίο κάνει οποιαδήποτε διαφορά φωτεινότητας εμφανή. - Εάν οι εικόνες δεν ευθυγραμμίζονται τέλεια, μπορεί να μπορέσετε να βελτιώσετε την ευθυγράμμιση χρησιμοποιώντας το ποντίκι για να σπρώξετε τις εικόνες σε ευθυγράμμιση. Επιλέξτε 'Mouse Warp' και επιλέξτε μία από τις εικόνες με τα κουμπιά επιλογής. Στη συνέχεια σύρετε το ποντίκι κατά μήκος της άκρης της εικόνας όπου θα πρέπει να ευθυγραμμιστεί με τη γειτονική της, μετακινώντας την εικόνα σε ευθυγράμμιση. Η εικόνα μετακινείται τοπικά γύρω από το ποντίκι ενώ τα πιο απομακρυσμένα μέρη παραμένουν σταθερά. Εικόνες με μετατόπιση παράλλαξης θα απαιτήσουν έναν συμβιβασμό, αφού είναι αδύνατο να διατηρηθούν και το προσκήνιο και το φόντο σε ευθυγράμμιση. - Το στοιχείο ελέγχου flatten image μπορεί να χρησιμοποιηθεί για το "ίσιωμα" της εικόνας, το οποίο θα ισιώσει καμπύλες γραμμές (π.χ. καμπυλωμένα κτίρια). Μια τιμή μηδέν δεν έχει καμία επίδραση και μια τιμή 1.0 θα επιπεδοποιήσει πλήρως την εικόνα. - Όταν τελειώσετε, χρησιμοποιήστε {ΙΣΙΩΜΑ}, {ΠΑΡΑΜΟΡΦΩΣΗ ΕΙΚΟΝΑΣ}, {ΠΕΡΙΚΟΠΗ} κ.λπ. για τελικές ρυθμίσεις. - ^Σαρωμένες εικόνες Σαρωμένες εικόνες μπορούν να συνδυαστούν εάν υπάρχει αρκετή επικάλυψη. Επιλέξτε το 'no curve' αφού δεν υπάρχει καμπυλότητα. - ^Αυτόματη Παραμόρφωση Οι εικόνες παραμορφώνονται ελαφρώς προς διάφορες κατευθύνσεις κατά την ευθυγράμμιση για να βρεθεί η καλύτερη αντιστοίχιση. Αυτό γίνεται για την αντιστάθμιση μετατοπίσεων στον ορίζοντα ή την περιστροφή της κάμερας, που προκαλούν παραμορφώσεις εικόνας οι οποίες μειώνουν την ποιότητα προσαρμογής. Εάν η περιοχή επικάλυψης δύο εικόνων περιλαμβάνει ένα μεγάλο αντικείμενο που κινήθηκε μεταξύ των δύο φωτογραφιών, η διαδικασία ευθυγράμμισης μπορεί να τρελαθεί προσπαθώντας να αντιστοιχίσει τις εικόνες, κάνοντας την ευθυγράμμιση πολύ κακή. Επιλέγοντας 'no auto warp' μπορεί να μπορέσετε να κάνετε την ευθυγράμμιση να πετύχει ή να έχει μικρότερο σφάλμα. Μια άλλη επιλογή είναι να επιλέξετε manual align. - ^Συνδυασμός Πανοραμάτων Μπορείτε να δημιουργήσετε ένα πανόραμα έως 6 εικόνων σε ένα πέρασμα. Μπορείτε επίσης να συνδυάσετε πανοράματα που ταιριάζουν μεταξύ τους στις πλευρές, π.χ. συνδυάστε ένα πανόραμα 4 εικόνων με άλλο πανόραμα 4 εικόνων για να δημιουργήσετε ένα πανόραμα 8 εικόνων. Πρέπει να σταματήσετε την κανονική καμπύλωση εικόνας όταν συνδυάζετε πανοράματα, αφού οι εικόνες πανοράματος είναι ήδη καμπυλωμένες (υποθέτοντας ότι δεν έχετε χρησιμοποιήσει την επιλογή 'flatten' στον τελικό διάλογο πανοράματος). Σταματήστε την καμπύλωση εικόνας επιλέγοντας το πλαίσιο 'no curve' στον διάλογο pre-align. - ^Περιορισμοί Πανοράματος Πανοράματα που περιλαμβάνουν κοντινά αντικείμενα μπορεί να είναι δύσκολα: κατά τη λήψη των φωτογραφιών, προσέξτε να περιστρέφετε την κάμερα σε έναν άξονα μέσω του φακού, με ελάχιστη πλευρική κίνηση, διαφορετικά οι εικόνες μπορεί να ευθυγραμμιστούν κακώς επειδή αντικείμενα προσκηνίου μετατοπίζονται σε σχέση με το φόντο (παράλλαξη). Αυτό δεν αποτελεί πρόβλημα όταν το θέμα βρίσκεται 50+ μέτρα μακριά, αφού μια μικρή πλευρική κίνηση έχει μικρή επίδραση στην εικόνα. Κρατήστε την κάμερα επίπεδη για να αποφύγετε μια μεγάλη κάθετη μετατόπιση (μετατόπιση ορίζοντα), η οποία μπορεί να προκαλέσει παραμορφώσεις εικόνας που μπορεί να μην διορθωθούν πλήρως. Αποφύγετε την περιστροφή της κάμερας για τον ίδιο λόγο. - ^Κάθετο Πανόραμα Αυτό μπορεί να γίνει περιστρέφοντας τις εικόνες εισόδου κατά 90°. Στο Πανόραμα, επιλέξτε τις εικόνες με σειρά από πάνω προς τα κάτω, ώστε η πάνω εικόνα να είναι στα αριστερά και η κάτω στα δεξιά. Κάντε το πανόραμα κανονικά. Περιστρέψτε την εικόνα εξόδου ώστε το αριστερό να γίνει πάνω. - - TOPIC: ΕΜΦΑΝΙΣΗ ΑΡΧΕΙΩΝ CIM Εμφανίστε τα αρχεία εισόδου για την τρέχουσα ή την τελευταία συνδυασμένη εικόνα, σε ένα αναδυόμενο παράθυρο. Απομνημονεύεται μόνο το τρέχον ή το τελευταίο σύνολο. - - TOPIC: MASHUP +image: mashup.jpg - Διευθετήστε πολλαπλές εικόνες και κείμενο σε μια διάταξη. Οι εικόνες μπορούν να προστεθούν, να αλλάξουν μέγεθος, να περιστραφούν και να μετακινηθούν σύροντάς τις με το ποντίκι. Οι εικόνες μπορούν να γίνουν εντελώς ή εν μέρει διαφανείς σε επιλεγμένες περιοχές. Το κείμενο μπορεί να προστεθεί, να μετακινηθεί, να αλλάξει μέγεθος και να περιστραφεί. Μπορούν να καθοριστούν χαρακτηριστικά κειμένου: γραμματοσειρά, μέγεθος, χρώμα, περίγραμμα, σκιά, διαφάνεια. Μπορούν να προστεθούν γραμμές και βέλη. Το παράδειγμα εδώ δείχνει μερικές από τις δυνατότητες. - +image: mashup1.png - Στον πρώτο διάλογο Mashup, επιλέξτε μια εικόνα φόντου ή διάταξης όπου θα τοποθετηθούν άλλες εικόνες. Επιλέξτε μια υπάρχουσα εικόνα ή δημιουργήστε μια νέα μονόχρωμη εικόνα με καθορισμένο μέγεθος και χρώμα. Μπορείτε επίσης να ανοίξετε ένα προηγουμένως αποθηκευμένο έργο mashup και να συνεχίσετε την επεξεργασία. - +image: mashup2.png - Ο 2ος διάλογος Mashup είναι μια επιλογή: επεξεργασία εικόνων, επεξεργασία κειμένου, επεξεργασία γραμμών και βελών, αλλαγή κλίμακας σε μεγαλύτερο μέγεθος, αποθήκευση της ολοκληρωμένης συνδυασμένης εικόνας (Done) ή εγκατάλειψη της εικόνας (Cancel). Οι πρώτες τρεις επιλογές οδηγούν σε διαλόγους για την εκτέλεση των αντίστοιχων επεξεργασιών. Καθεμία από αυτές επιστρέφει σε αυτόν τον διάλογο όταν ολοκληρωθεί, ώστε να μπορείτε να προσθέσετε ή να τροποποιήσετε εικόνες, κείμενο, και γραμμές/βέλη με οποιαδήποτε σειρά. Το Rescale εξηγείται παρακάτω. - +image: mashup3.jpg - Χρησιμοποιήστε αυτόν τον διάλογο για να επιλέξετε και να τοποθετήσετε εικόνες στη διάταξη και να αναθεωρήσετε την εμφάνισή τους: μέγεθος, περιστροφή, θέση, διαφάνεια. Μια εικόνα μπορεί να είναι εν μέρει ή εξ ολοκλήρου διαφανής, συνολικά ή εντός καθορισμένων περιοχών. Αυτό σημαίνει ότι η εικόνα φόντου ή η επικαλυπτόμενη εικόνα μπορεί να φαίνεται μέσα από διαφανείς περιοχές. Το κουμπί Add Image οδηγεί σε έναν διάλογο επιλογής αρχείων γκαλερί ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). Οι επιλεγμένες εικόνες τοποθετούνται στη διάταξη. Αφού προστεθούν οι εικόνες, κάντε κλικ σε οποιαδήποτε εικόνα για να την επιλέξετε για τροποποιήσεις. Σύρετε την εικόνα από τη μέση για να την τοποθετήσετε στη διάταξη. Σύρετε την κάτω δεξιά γωνία για να αλλάξετε το μέγεθος της εικόνας. Χρησιμοποιήστε τα στοιχεία ελέγχου του διαλόγου για να ρυθμίσετε την εικόνα. Τα στοιχεία ελέγχου του διαλόγου λειτουργούν στην τελευταία εικόνα που προστέθηκε, στην οποία έγινε κλικ ή σύρσιμο. Τα κουμπιά 'Prev' και 'Next' εναλλάσσονται μεταξύ των εικόνων μία-μία, αναβοσβήνοντας την επιλεγμένη εικόνα. Αυτό μπορεί να χρησιμοποιηθεί όταν επικαλυπτόμενες εικόνες κάνουν δύσκολη την επιλογή της επιθυμητής εικόνας κάνοντας κλικ πάνω της. Το Scale αλλάζει την κλίμακα της εικόνας. Το Angle περιστρέφει την εικόνα. Τα κουμπιά Stacking Order ανεβάζουν ή κατεβάζουν μια εικόνα σε σχέση με άλλες εικόνες - αυτό καθορίζει ποια επικαλυπτόμενη εικόνα θα είναι από πάνω. Το Base Transparency χρησιμοποιείται για να κάνει μια ολόκληρη εικόνα εν μέρει διαφανή. Το κουμπί [ζωγραφική] χρησιμοποιείται για να κάνει οποιοδήποτε μέρος μιας εικόνας εν μέρει ή πλήρως διαφανές, χρησιμοποιώντας τον διάλογο Paint που φαίνεται παρακάτω. Το κουμπί [παραμόρφωση] χρησιμοποιείται για να λυγίσετε ή να παραμορφώσετε μια εικόνα, χρησιμοποιώντας τον διάλογο Warp που φαίνεται παρακάτω. Το πλαίσιο ελέγχου 'black margins' μπορεί να χρησιμοποιηθεί για την αφαίρεση μαύρων περιθωρίων που αφήνουν άλλες λειτουργίες επεξεργασίας, π.χ. warp. Αυτά θα γίνουν διαφανή. Το κουμπί 'Image is fixed' θα αποτρέψει τη μετακίνηση της εικόνας με το ποντίκι ή το πληκτρολόγιο. Αυτό είναι χρήσιμο όταν οι εικόνες υφίστανται λεπτομερή ευθυγράμμιση και πρέπει να αποτραπεί η τυχαία μετακίνηση. Τα στοιχεία ελέγχου Margins μπορούν να χρησιμοποιηθούν για να κάνουν τις άκρες της εικόνας διαφανείς. Τα Hard margins κόβουν τις άκρες της εικόνας. Τα Blend margins κάνουν τις άκρες εν μέρει διαφανείς για να τις αναμείξουν στο φόντο ή σε άλλες επικαλυπτόμενες εικόνες. - +image: mashup4.png - "Ζωγραφίστε" περισσότερη ή λιγότερη διαφάνεια για επιλεγμένες περιοχές εικόνας. Κάντε κλικ σε μια εικόνα για να την επιλέξετε. Ο δείκτης του ποντικιού είναι ένας κύκλος που δείχνει το εύρος δράσης. Χρησιμοποιήστε το radius για να ρυθμίσετε το μέγεθος. Σύρετε το ποντίκι με το αριστερό κουμπί πάνω από την εικόνα για να την κάνετε διαφανή στις περιοχές που καλύπτονται από τον κύκλο. Σύρετε με το δεξί κουμπί για να την κάνετε αδιαφανή. Εάν είναι επιλεγμένο το Gradual, οι αλλαγές διαφάνειας γίνονται αργά καθώς σύρεται το ποντίκι. Καθορίστε μια τιμή power για το κέντρο και τις άκρες του ποντικιού για να ρυθμίσετε τον ρυθμό αλλαγής. - +image: mashup5.png - Ο διάλογος warp χρησιμοποιείται για την παραμόρφωση μιας εικόνας. Κάντε κλικ σε μια εικόνα για να την επιλέξετε. Σύρετε την εικόνα με το ποντίκι - η εικόνα θα παραμορφωθεί ή θα τεντωθεί τοπικά προς την κατεύθυνση του ποντικιού (σαν φύλλο λάστιχου). Η περιοχή παραμόρφωσης δίνεται κατά προσέγγιση από το warp span, το οποίο είναι ένα κλάσμα του μεγέθους της εικόνας. Κάθε σύρσιμο είναι ένα βήμα που προστίθεται στα προηγούμενα βήματα. Πρόσφατα βήματα μπορούν να αναιρεθούν με το [undo last], και η μη λυγισμένη εικόνα μπορεί να επαναφερθεί με το [undo all]. - +image: mashup6.png - Ο διάλογος Edit Text χρησιμοποιείται για την τοποθέτηση κειμένου στη διάταξη. Εισαγάγετε κάποιο κείμενο και πατήστε [Εφαρμογή]. Σας ζητείται να κάνετε κλικ στη διάταξη όπου θα προστεθεί το κείμενο. Σύρετέ το στη θέση του, στη συνέχεια χρησιμοποιήστε τα στοιχεία ελέγχου του διαλόγου για να ορίσετε γραμματοσειρά, μέγεθος, χρώμα, γωνία, χρώμα φόντου, μέγεθος και χρώμα περιγράμματος, μέγεθος και χρώμα σκιάς, και διαφάνειες για καθένα από αυτά. Σύρετε το κείμενο σε νέα θέση οποιαδήποτε στιγμή. Κάντε κλικ σε οποιοδήποτε υπάρχον κείμενο για να εμφανίσετε τις ιδιότητές του στον διάλογο και να τις αναθεωρήσετε. Κάντε κλικ σε ένα κείμενο και πατήστε Delete για να το αφαιρέσετε. Όταν τελειώσετε την επεξεργασία, πατήστε [OK] για να επιστρέψετε στον 2ο διάλογο Mashup. - +image: mashup7.png - Ο διάλογος Edit Line/Arrow χρησιμοποιείται για την τοποθέτηση γραμμών ή βελών στη διάταξη. Λειτουργεί σχεδόν όπως η προσθήκη κειμένου. Εισαγάγετε ένα μήκος και πλάτος και πατήστε [Προσθήκη]. Σας ζητείται να κάνετε κλικ στη διάταξη όπου θα προστεθεί η γραμμή. Μια γραμμή τοποθετείται στη διάταξη, ή ένα βέλος εάν είναι επιλεγμένη μία από τις επιλογές Arrow head. Σύρετε τη γραμμή/βέλος στην επιθυμητή θέση. Ρυθμίστε το μήκος, το πλάτος, τη γωνία και τα χαρακτηριστικά (φόντο, περίγραμμα, σκιά) χρησιμοποιώντας τον διάλογο. Μπορείτε επίσης να σύρετε οποιοδήποτε άκρο της γραμμής/βέλους για να ορίσετε τη θέση αυτού του άκρου, αφήνοντας το άλλο άκρο σταθερό. - Μπορείτε να χρησιμοποιήσετε το ποντίκι για να μετακινήσετε και να αλλάξετε το μέγεθος αντικειμένων στη διάταξη: • κάντε κλικ στο αντικείμενο για να το επιλέξετε - αναβοσβήνει για να επιβεβαιώσει την επιλογή. • σύρετε από το κατά προσέγγιση κέντρο για να τοποθετήσετε το αντικείμενο. • σύρετε την κάτω δεξιά γωνία για να αλλάξετε το μέγεθος του αντικειμένου. • για γραμμή/βέλος, σύρετε οποιοδήποτε άκρο για να μετακινήσετε μόνο αυτό το άκρο. - Τα πλήκτρα βέλους του πληκτρολογίου μπορούν επίσης να χρησιμοποιηθούν για τη μετακίνηση του τρέχοντος επιλεγμένου αντικειμένου σε βήματα του 1 pixel. - Μπορείτε να προσθέσετε εικόνες που αποθηκεύτηκαν από την {ΕΠΙΛΟΓΗ ΠΕΡΙΟΧΗΣ}. Στον διάλογο Edit Images, πατήστε [Προσθήκη] για να ξεκινήσει ο διάλογος επιλογής αρχείων. Χρησιμοποιήστε το κουμπί [Πάνω] στο παράθυρο γκαλερί, επιλέξτε 'saved_areas'. Ανοίξτε οποιαδήποτε από τις εικόνες .png που βρίσκονται εκεί. Χρησιμοποιείται το αρχικό περίγραμμα περιοχής, και η ανάμειξη περιοχής λειτουργεί από αυτές τις άκρες. - ^Αρχεία έργου Mashup Μπορείτε να αποθηκεύσετε ένα έργο και να το ανοίξετε αργότερα για να συνεχίσετε την επεξεργασία. Το έργο Mashup ανακατασκευάζεται χρησιμοποιώντας αυτές τις εικόνες και ορισμένα δεδομένα αποθηκευμένα στο αρχείο έργου: θέσεις εικόνων και κειμένου, κλίμακες, διαφάνεια, κ.λπ. - ^Αλλαγή Κλίμακας Mashup Η εργασία με μια πολύ μεγάλη διάταξη (πάνω από 20 megapixel) μπορεί να είναι αρκετά αργή. Το σύρσιμο μιας μεγάλης εικόνας επικάλυψης μπορεί να είναι αργό και τσαλακωτό. Μπορείτε να εργαστείτε πολύ πιο γρήγορα εάν χρησιμοποιήσετε μια μικρότερη διάταξη για να χτίσετε το έργο, και στη συνέχεια να την μεγαλώσετε αφού τελειώσετε. Δεν υπάρχει απώλεια ανάλυσης στην τελική εικόνα, αφού οι εικόνες επικάλυψης και το κείμενο αναδημιουργούνται από τις εισόδους. Το κουμπί Rescale σας επιτρέπει να μεγεθύνετε το έργο κατά 2x, 3x ή 4x. Υπάρχει επίσης μια επιλογή reset για την επαναφορά του αρχικού μικρότερου μεγέθους έργου. Με αυτή τη μέθοδο, μπορείτε να εργαστείτε με μια διάταξη 10 megapixel και να αλλάξετε την κλίμακά της έως 160 megapixel όταν τελειώσετε. Η μεγαλύτερη διάταξη μπορεί ακόμα να επεξεργαστεί απευθείας μετά, αλλά θα είναι πιο αργή. - - TOPIC: ΠΙΝΑΚΑΣ ΕΙΚΟΝΩΝ +image: image-array.jpg - Επιλέξτε πολλές εικόνες και ενώστε τις σε μια συμπαγή μορφή πίνακα μέσα σε ένα έγχρωμο πλαίσιο. - Ο πρώτος διάλογος φαίνεται πάνω αριστερά. Το Background Color είναι το χρώμα του περιγράμματος του πλαισίου και των διαστημάτων μεταξύ των περιεχόμενων εικόνων. Το Array Width είναι το συνολικό πλάτος του πίνακα εξόδου, και το Margin είναι το πλάτος του εξωτερικού περιθωρίου που περιβάλλει όλες τις εικόνες. Το ύψος του πίνακα καθορίζεται από τον αριθμό των επιλεγμένων αρχείων εικόνας και τον χώρο που απαιτείται για να χωρέσουν στο πλαίσιο. Το Image Columns καθορίζει τον αριθμό των στηλών εικόνων (6 στο παραπάνω παράδειγμα). Ο αριθμός των γραμμών εξαρτάται από τον αριθμό των επιλεγμένων αρχείων εικόνας. Οι τιμές Separation ορίζουν τον οριζόντιο και κάθετο χώρο μεταξύ των περιεχόμενων εικόνων. - Επιλέξτε τα αρχεία εικόνας ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}), στη συνέχεια πατήστε [Συνέχεια] όταν τελειώσετε. Η προκύπτουσα εικόνα θα δημιουργηθεί σε λίγα δευτερόλεπτα (ή λεπτά για εκατοντάδες εικόνες). Αυτή η εικόνα θα έχει συνήθως πολύ ανομοιόμορφο κάτω περιθώριο, όπως φαίνεται στην πάνω δεξιά εικόνα παραπάνω. Η σειρά των εικόνων στον πίνακα καθορίζεται από τη σειρά επιλογής. Η πάνω σειρά γεμίζει πρώτη, από αριστερά προς τα δεξιά, στη συνέχεια η 2η σειρά, κ.λπ. - Ο διάλογος Optimize ξεκινά αυτόματα. Μπορεί να αναδιατάξει τις εικόνες ώστε το κάτω περιθώριο να είναι πιο ομοιόμορφο. Πατήστε [Έναρξη] και περιμένετε να βελτιστοποιηθεί η εικόνα. Μπορείτε να παρακολουθήσετε την πρόοδο. Η λειτουργία θα τερματιστεί εάν βρεθεί ένα βέλτιστο που κάνει το κάτω περιθώριο ομοιόμορφο εντός 2 pixel. Μπορεί να συνεχίσει να αναζητά επ' αόριστον εάν αυτός ο στόχος δεν επιτευχθεί. Πατήστε [Διακοπή] για να αναγκάσετε τη λειτουργία optimize να τερματιστεί με την καλύτερη λύση που βρέθηκε μέχρι στιγμής. Εάν η βελτιστοποίηση είναι επιτυχής, θα λάβετε ομοιόμορφες στήλες όπως φαίνεται στην κάτω δεξιά εικόνα. Εάν η κάτω άκρη είναι ακόμα ανομοιόμορφη μετά τη βελτιστοποίηση, σας ζητείται εάν θέλετε να προσθέσετε περιθώρια σε ορισμένες από τις εικόνες για να κάνετε την κάτω άκρη ομοιόμορφη. Αυτό θα έχει ως αποτέλεσμα μια ομοιόμορφη κάτω άκρη, αλλά τα κάθετα διαστήματα δεν θα είναι πλέον ίσα. - ΣΥΜΒΟΥΛΗ: Η βελτιστοποίηση λειτουργεί καλύτερα εάν ο αριθμός των εικόνων ανά στήλη είναι τουλάχιστον τέσσερις (καλύτερα περισσότερες). Αυτό δίνει στον βελτιστοποιητή αρκετή ευελιξία για να βρει μια λύση με ομοιόμορφη κάτω άκρη. - Εμφανίζεται ο τελευταίος διάλογος, που φαίνεται κάτω αριστερά. Πρέπει τώρα να αναθέσετε ένα όνομα αρχείου στον πίνακά σας. Ξεκινά ένας διάλογος αποθήκευσης αρχείου, και μπορείτε να αποθηκεύσετε το νέο αρχείο πίνακα οπουδήποτε. Εάν επιλεγεί η επιλογή copy metadata, τα metadata αντιγράφονται από το επιλεγμένο αρχείο εισόδου στο αρχείο εξόδου. Αυτό είναι χρήσιμο εάν οι εικόνες είναι επεξεργασμένες εκδόσεις και θέλετε ο πίνακας να περιέχει το ιστορικό επεξεργασίας για την τελευταία έκδοση (ή οποιαδήποτε έκδοση). - - TOPIC: ΜΕΝΟΥ ΜΑΖΙΚΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ Αυτές είναι λειτουργίες που επεξεργάζονται πολλαπλά επιλεγμένα αρχεία εικόνας, λίγα ή χιλιάδες. Αυτές οι λειτουργίες μπορούν να ακυρωθούν στη μέση της διαδικασίας χρησιμοποιώντας το πλήκτρο Escape, αλλά αυτό θα αφήσει ορισμένα αρχεία επεξεργασμένα και άλλα όχι. Μια αναδυόμενη αναφορά δείχνει τα ονόματα αρχείων καθώς επεξεργάζονται. - - TOPIC: ΜΑΖΙΚΗ ΜΕΤΑΤΡΟΠΗ +image: batch-convert.jpg - Αυτή η λειτουργία χρησιμοποιείται για τη μετονομασία, μετατροπή, αλλαγή κλίμακας και μετακίνηση πολλαπλών αρχείων εικόνας. Αρχεία RAW μπορούν επίσης να μετατραπούν σε αρχεία εικόνας. Η λειτουργία εκτελείται σε πολλαπλά παράλληλα threads για μέγιστη ταχύτητα. - ^Είσοδοι Διαλόγου • Select Files - αρχεία προς μετατροπή ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). • Replace Text - αντικατάσταση κειμένου σε ονόματα αρχείων (δείτε παρακάτω). • New Name - προαιρετικό νέο όνομα, ενσωματωμένο κείμενο (δείτε παρακάτω). • Sequence Numbers - βασικός αριθμός και αθροιστής για τα ονόματα αρχείων εξόδου. • New Location - προαιρετική νέα τοποθεσία φακέλου για τα αρχεία εξόδου. • New Type - τύπος αρχείου για τα αρχεία εξόδου, ή "no change". • Color Depth - καθορίστε 8 ή 16 bit για έξοδο tif ή png. • Max. Width, Height - προαιρετικά όρια για τα αρχεία εξόδου (χρησιμοποιείται μόνο εάν είναι επιλεγμένο το downsize ή upsize) • Rescale - προαιρετικός παράγοντας αλλαγής κλίμακας για τα αρχεία εξόδου • Delete Originals - Διαγραφή αρχείων εισόδου μετά την επιτυχή μετατροπή. • Copy Metadata - Αντιγραφή όλων των metadata στα αρχεία εξόδου. • Update Albums - αντικατάσταση αρχείων άλμπουμ με τα μετατραπέντα αρχεία εξόδου - ^Replace Text Εάν εισαχθεί κείμενο εδώ, τα ονόματα αρχείων σαρώνονται για αυτό το κείμενο, και εάν βρεθεί, αντικαθίσταται με το δεδομένο κείμενο αντικατάστασης. Το κείμενο αντικατάστασης μπορεί να έχει διαφορετικό μήκος και μπορεί επίσης να είναι κενό, οπότε το κείμενο αφαιρείται από το όνομα αρχείου. - ^New Name και Plugins Το νέο όνομα αρχείου μπορεί να έχει ενσωματωμένο κείμενο: μια ημερομηνία φωτογραφίας (από τα metadata EXIF), έναν αριθμό ακολουθίας, ή το αρχικό όνομα αρχείου. Καθορίστε τι και πού να εισαχθεί ως εξής: • $oldname - Το αρχικό όνομα αρχείου εισάγεται εδώ • $sss - Ένας τρέχων αριθμός ακολουθίας εισάγεται εδώ. Δείτε παρακάτω. • $yyyy $mm $dd - Η ημερομηνία φωτογραφίας εισάγεται σε αυτές τις θέσεις. - Παράδειγμα: San Francisco $yyyy:$mm:$dd $oldname $sss Το αρχείο εισόδου "Golden Gate Bridge.jpg", με ημερομηνία φωτογραφίας 12 Μαΐου 2014, θα μετατρεπόταν στο όνομα αρχείου εξόδου "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg". - Για το "$sss", καθορίστε το μήκος του πεδίου με τον αριθμό των χαρακτήρων 's', π.χ. το "$ss" θα είναι επαρκές για αριθμούς ακολουθίας έως 99. Προστίθενται μηδενικά στην αρχή για αριθμούς ακολουθίας με λιγότερα ψηφία. Αριθμοί ακολουθίας που δεν χωρούν στο καθορισμένο μήκος γίνονται όσο μεγάλοι χρειάζεται. Έχετε υπόψη ότι η σειρά ταξινόμησης ονομάτων αρχείων στις γκαλερί είναι αυστηρά σειρά ascii, οπότε η ακολουθία αριθμών 1, 2 ... 9, 10 θα ταξινομηθεί ως 1, 10, 2 ... 9. Μπορείτε να διατηρήσετε την αριθμητική σειρά καθορίζοντας μήκος πεδίου 2 ($ss), με αποτέλεσμα την ακολουθία 01, 02 ... 09, 10. - Είτε το "$oldname" είτε το "$sss" πρέπει να υπάρχει για να διασφαλιστεί ότι τα ονόματα αρχείων εξόδου είναι μοναδικά. Εάν το New Location λείπει ή δεν έχει αλλάξει, το delete originals αγνοείται. Εάν υπάρχει ήδη ένα αρχείο εξόδου, το αρχείο εισόδου δεν μετατρέπεται. - ^Max. Width and Height Εάν είναι επιλεγμένο το downsize και/ή upsize, τότε το μέγεθος των αρχείων εξόδου θα αλλάξει εντός αυτών των ορίων, διατηρώντας την αρχική αναλογία πλάτους/ύψους. Εάν είναι επιλεγμένο το downsize, αρχεία μεγαλύτερα από αυτά τα όρια σμικρύνονται ώστε να παραμείνουν εντός των ορίων. Εάν είναι επιλεγμένο το upsize, αρχεία μικρότερα από αυτά τα όρια μεγεθύνονται ώστε είτε το πλάτος είτε το ύψος να είναι στο αντίστοιχο όριο. Αυτό δεν μπορεί να χρησιμοποιηθεί με την επιλογή Rescale. - ^Rescale Εάν είναι επιλεγμένο ένα από τα κουμπιά, τα αρχεία εξόδου αλλάζουν κλίμακα κατά τον επιλεγμένο παράγοντα. Αυτό δεν μπορεί να χρησιμοποιηθεί με την επιλογή Max. Width and Height. - ^Delete Originals Εάν είναι επιλεγμένο, τα αρχεία εισόδου διαγράφονται, αλλά μόνο αφού δημιουργηθεί επιτυχώς το αρχείο εξόδου. - ^Copy Metadata Όλα τα metadata αντιγράφονται από το αρχείο εισόδου στο αρχείο εξόδου. Παραλείψτε αυτή την επιλογή για να αφαιρέσετε τα metadata. - ^Update Albums Εάν είναι επιλεγμένο, όλα τα άλμπουμ που περιέχουν οποιοδήποτε από τα αρχεία εισόδου ενημερώνονται με τα μετατραπέντα αρχεία εξόδου. - ^Διατήρηση Σειράς Αρχείων Εάν καθορίσετε έναν αριθμό ακολουθίας στην αρχή ($sss), η σειρά επιλογής αρχείων εισόδου θα διατηρηθεί στην τοποθεσία εξόδου. Έτσι μπορείτε να επιλέξετε αρχεία εικόνας με μια επιθυμητή σειρά, ή να επιλέξετε από ένα άλμπουμ με ταξινομημένες εικόνες, και να διατηρήσετε αυτή τη σειρά στην έξοδο. - - TOPIC: ΜΑΖΙΚΗ ΑΝΤΙΓΡΑΦΗ/ΜΕΤΑΚΙΝΗΣΗ Αντιγράψτε ή μετακινήστε επιλεγμένα αρχεία εικόνας σε νέα τοποθεσία. Επιλέξτε τα αρχεία εισόδου ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}) από οποιουσδήποτε φακέλους γνωστούς στο Fotocx. Εάν είναι επιλεγμένο το "Delete Originals", τότε τα αρχεία εισόδου θα διαγραφούν αφού μετακινηθούν επιτυχώς στον νέο φάκελο. Σε αυτή την περίπτωση, οποιαδήποτε άλμπουμ που αναφέρονται στα πλέον διαγραμμένα αρχεία εισόδου ενημερώνονται με τις νέες τοποθεσίες αρχείων. - - TOPIC: ΜΑΖΙΚΗ ΙΣΙΩΣΗ Αυτή η λειτουργία ανορθώνει αρχεία εικόνας που είναι περιστραμμένα ή αναστραμμένα (κατοπτρισμένα). Εξαρτάται από δεδομένα EXIF για να γνωρίζει εάν ένα αρχείο είναι περιστραμμένο/αναστραμμένο και προς ποια κατεύθυνση. Είναι πολύ πιο γρήγορη από την Ομαδική Μετατροπή. Μπορείτε απλά να επιλέξετε όλα τα υποψήφια αρχεία και να την αφήσετε να βρει αυτά που χρειάζονται διόρθωση. Η ταχύτητα αναζήτησης είναι περίπου 3000 αρχεία εικόνας ανά λεπτό σε έναν ισχυρό υπολογιστή. Υπάρχουν δύο επιλογές για τον καθορισμό των αρχείων προς αναζήτηση. Το κουμπί [Επιλογή Αρχείων] οδηγεί σε έναν διάλογο επιλογής αρχείων γκαλερί ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). Εάν είναι επιλεγμένο το 'Survey all files', θα αναζητηθούν όλα τα αρχεία εικόνας κάτω από τους κύριους φακέλους σας. - - TOPIC: ΜΑΖΙΚΗ ΔΙΑΓΡΑΦΗ/ΑΠΟΡΡΙΨΗ Επιλέξτε τα αρχεία ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). Επιλέξτε την επιλογή: διαγραφή ή μετακίνηση στα απορρίμματα. [Συνέχεια]. Τα αρχεία αναφέρονται σε μια αναδυόμενη αναφορά καθώς διαγράφονται ή μετακινούνται στα απορρίμματα. Αφού όλα τα αρχεία διαγραφούν/μετακινηθούν στα απορρίμματα, τα άλμπουμ σαρώνονται και τα διαγραμμένα αρχεία αφαιρούνται. - - TOPIC: ΜΑΖΙΚΗ ΕΠΙΚΑΛΥΨΗ +image: batch-overlay.png - Μια μικρή εικόνα επικάλυψης μπορεί να προστεθεί σε μια επιλεγμένη θέση στις επιλεγμένες εικόνες εισόδου. Αυτό μπορεί να χρησιμοποιηθεί για την προσθήκη μιας γραμμής πιστωτικού, πνευματικών δικαιωμάτων, κ.λπ. πάνω στις εικόνες. - Προετοιμάστε την εικόνα επικάλυψης ως εξής: Χρησιμοποιήστε το Κενή Εικόνα για να δημιουργήσετε μια βασική εικόνα που θα φιλοξενήσει το κείμενο. Η κλίμακα δεν έχει σημασία, γι' αυτό κάντε την μεγαλύτερη από ό,τι χρειάζεται. Χρησιμοποιήστε το Ζωγραφική Διαφάνειας για να κάνετε ολόκληρη τη βασική εικόνα διαφανή. Χρησιμοποιήστε την {ΣΗΜΑΝΣΗ} > σχεδίαση κειμένου για να τοποθετήσετε το επιθυμητό κείμενο στη βασική εικόνα, χρησιμοποιώντας γραμματοσειρά, χρώμα, και άλλα χαρακτηριστικά όπως επιθυμείτε. Αλλάξτε την κλίμακα του κειμένου ώστε να γεμίζει το μεγαλύτερο μέρος της βασικής εικόνας. Η βασική εικόνα (φόντο) είναι διαφανής. Αφαιρέστε περιττά περιθώρια με την {ΠΕΡΙΚΟΠΗ} εάν χρειάζεται. Αποθηκεύστε την τελική εικόνα. Μια βολική τοποθεσία είναι το /saved_areas, αλλά μπορεί να χρησιμοποιηθεί οποιοσδήποτε φάκελος. Αυτή η εικόνα μπορεί τώρα να χρησιμοποιηθεί ως εικόνα επικάλυψης για την Ομαδική Επικάλυψη. - Χρησιμοποιήστε το κουμπί ^Select host image files^ για να επιλέξετε τα αρχεία εικόνας υποδοχής που θα λάβουν την εικόνα επικάλυψης. Χρησιμοποιήστε το κουμπί ^Select overlay file^ για να επιλέξετε το αρχείο εικόνας επικάλυψης. - Οι δύο είσοδοι ^Overlay position^ καθορίζουν πού τοποθετείται η εικόνα επικάλυψης στην εικόνα υποδοχής, από 1-99% της απόστασης από πάνω προς τα κάτω, και 1-99% της απόστασης από αριστερά προς τα δεξιά. 0/0 σημαίνει την πάνω αριστερή γωνία, 99/99 σημαίνει την κάτω δεξιά γωνία. Η εικόνα επικάλυψης θα τοποθετηθεί ώστε να μην επεκτείνεται πέρα από τις άκρες της εικόνας υποδοχής. - Καθορίστε το ^Overlay width^ ως ποσοστό του πλάτους της εικόνας υποδοχής. Το ύψος θα οριστεί ώστε να διατηρηθεί η αναλογία πλάτους/ύψους. Εάν είναι επιλεγμένο το ^Make width constant for window size^, το οπτικό μέγεθος της εικόνας επικάλυψης θα γίνει σταθερό για το μέγεθος παραθύρου που καθορίζεται παρακάτω. Χωρίς αυτό, μια "ψηλή" εικόνα που εμφανίζεται με μεγάλα αριστερά και δεξιά περιθώρια θα είχε οπτικά μικρότερη εικόνα επικάλυψης. Το αρχικό μέγεθος παραθύρου είναι το τρέχον παράθυρο. Μπορείτε να εισαγάγετε οποιοδήποτε μέγεθος. Πατήστε ^refresh^ για να ορίσετε το τρέχον παράθυρο εάν αυτό έχει αλλάξει. - Εάν είναι επιλεγμένο το ^Replace host files^, τα αρχεία υποδοχής εισόδου αντικαθίστανται με τα αρχεία υποδοχής εξόδου με την επικάλυψη. Εάν είναι επιλεγμένο το ^Make new versions^, δημιουργούνται νέες εκδόσεις των αρχείων υποδοχής εισόδου. - - TOPIC: ΜΑΖΙΚΑ KEYWORDS +image: batch-keywords.jpg - Προσθέστε, αφαιρέστε, ή αλλάξτε τα keywords για έναν μεγάλο αριθμό αρχείων εικόνας ταυτόχρονα. - Χρησιμοποιήστε το κουμπί [select files] για να επιλέξετε τα αρχεία εικόνας ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). - Ο διάλογος εμφανίζει δύο λίστες keywords: αυτά προς προσθήκη στα επιλεγμένα αρχεία, και αυτά προς αφαίρεση. Τα διαθέσιμα keywords εμφανίζονται στο παράθυρο Defined Keywords παρακάτω. Ένα από αυτά μπορεί να προστεθεί στην τρέχουσα επιλεγμένη λίστα keyword (add ή remove) κάνοντας κλικ πάνω του. Ένα keyword μπορεί να διαγραφεί από οποιαδήποτε λίστα keyword κάνοντας κλικ πάνω του. Για να αντικαταστήσετε keywords, καθορίστε τα νέα keywords στη λίστα add keywords και τα παλιά keywords στη λίστα remove keywords. - Εάν η λίστα ορισμένων keywords είναι μεγάλη, μπορεί να είναι ευκολότερο να πληκτρολογήσετε το επιθυμητό keyword στο Enter New Keyword. Τα υπάρχοντα keywords που ταιριάζουν με ό,τι έχετε πληκτρολογήσει μέχρι στιγμής θα εμφανιστούν στο Matching Keywords, και μπορείτε να δείξετε και να κάνετε κλικ σε ένα από αυτά για να προσθέσετε το keyword στην εικόνα. Εάν το keyword εισόδου είναι νέο (δεν εμφανίζεται κανένα ταιριαστό keyword), πατήστε [Προσθήκη] όταν το keyword είναι πλήρες. Θα προστεθεί στην επιλεγμένη λίστα keyword και στη λίστα ορισμένων keywords κάτω από την κατηγορία "nocatg". - Εάν χρησιμοποιείτε κατηγορίες keywords, μπορείτε να επιλέξετε μια κατηγορία, και μόνο εκείνα τα keywords θα εμφανιστούν στη λίστα ορισμένων keywords. Εάν η λίστα keywords σας είναι τεράστια, αυτό μπορεί να μειώσει τη λίστα σε ένα διαχειρίσιμο μέγεθος για να δείχνετε και να κάνετε κλικ. - Για να λάβετε μια λίστα εικόνων με συγκεκριμένα keywords που θέλετε να αφαιρέσετε ή να αντικαταστήσετε, χρησιμοποιήστε την {ΑΝΑΖΗΤΗΣΗ ΕΙΚΟΝΩΝ} για να βρείτε τις εικόνες, στη συνέχεια ξεκινήστε αυτή τη λειτουργία και χρησιμοποιήστε το [select files] για να προσθέσετε όλα τα αρχεία εικόνας που μόλις βρήκατε, ή επιλέξτε οποιοδήποτε υποσύνολο. - - TOPIC: ΜΑΖΙΚΗ ΜΕΤΟΝΟΜΑΣΙΑ KEYWORDS +image: batch-rename-keywords.png - Μετονομάστε οποιονδήποτε αριθμό keywords και εφαρμόστε αυτές τις αλλαγές σε ολόκληρη τη συλλογή εικόνων σας. Κάντε κλικ σε ένα keyword προς μετονομασία από τη λίστα ορισμένων keywords, εισαγάγετε ένα νέο όνομα στο πλαίσιο Rename to, στη συνέχεια κάντε κλικ στο κουμπί βέλους για να προσθέσετε αυτό το ζεύγος ονομάτων στη λίστα στη δεξιά πλευρά. Επαναλάβετε για κάθε keyword προς μετονομασία. Κάντε κλικ στο ζεύγος ονομάτων στη λίστα για να τα αφαιρέσετε. Πατήστε [Συνέχεια] όταν τελειώσετε. Εάν θέλετε να διαγράψετε ένα keyword χωρίς να το μετονομάσετε, χρησιμοποιήστε 'delete' ως το νέο όνομα. - Ένα αναδυόμενο παράθυρο δείχνει τον αριθμό των αρχείων εικόνας που περιέχουν τα επηρεαζόμενα ονόματα keywords. Πατήστε [Ναι] για να συνεχίσετε. Ο ρυθμός ενημέρωσης είναι περίπου 500/λεπτό σε έναν ισχυρό υπολογιστή. Την επόμενη φορά που θα εκκινηθεί το Fotocx, η λειτουργία ευρετηρίασης αρχείων θα ενημερώσει όλα τα thumbnails για τις ίδιες εικόνες, επειδή η ημερομηνία τροποποίησης του αρχείου έχει αλλάξει. - - TOPIC: ΜΑΖΙΚΗ ΕΚΚΑΘΑΡΙΣΗ KEYWORDS +image: batch-purge-keywords.jpg - Εκκαθαρίστε (διαγράψτε) ανεπιθύμητα keywords από όλα τα αρχεία εικόνας. Αυτό είναι ιδιαίτερα χρήσιμο για να απαλλαγείτε από ανεπιθύμητα keywords που προστέθηκαν από κατεβασμένα αρχεία εικόνας. Κάντε κλικ σε ανεπιθύμητα keywords στην αριστερή πλευρά του διαλόγου για να τα προσθέσετε στη λίστα purge στη δεξιά πλευρά του διαλόγου. Πατήστε [proceed] όταν τελειώσετε. - - TOPIC: ΜΑΖΙΚΗ ΗΜΕΡΟΜΗΝΙΑ ΦΩΤΟΓΡΑΦΙΑΣ +image: batch-photo-date1.png +image: batch-photo-date2.png - Διορθώστε γρήγορα μια ομάδα φωτογραφιών που δεν έχουν ημερομηνία/ώρα φωτογραφίας ή έχουν λανθασμένη. Χρησιμοποιήστε το κουμπί [select files] για να ανοίξετε ένα παράθυρο γκαλερί όπου μπορείτε να επιλέξετε τα αρχεία εικόνας προς επεξεργασία ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). - Υπάρχουν δύο τρόποι για την αλλαγή ημερομηνιών/ωρών φωτογραφίας: • Ορισμός νέας ημερομηνίας/ώρας (δεξιά εικόνα παραπάνω): Εισαγάγετε μόνο ένα νέο έτος (yyyy) - αντικαθίσταται μόνο το έτος στα αρχεία. Εισαγάγετε μόνο μια ημερομηνία (yyyy:mm:dd) - η ημερομηνία αντικαθίσταται αλλά όχι η ώρα. Εισαγάγετε πλήρη ημερομηνία/ώρα (yyyy:mm:dd hh:mm:ss) - αντικαθίστανται και τα δύο. • Μετατόπιση υπάρχουσας ημερομηνίας/ώρας (αριστερή εικόνα): Εισαγάγετε τιμές + ή - σε οποιοδήποτε από τα 6 πεδία: έτη, μήνες, ημέρες, ώρες, λεπτά, δευτερόλεπτα. Οι ημερομηνίες/ώρες θα μετατοπιστούν κατά τις εισαγμένες τιμές. - Οι μετατοπισμένες τιμές ημερομηνίας/ώρας μεταφέρονται στην επόμενη υψηλότερη τιμή όταν χρειάζεται: Η ώρα 08:30 μετατοπισμένη κατά -50 λεπτά δίνει 07:40 Η ημερομηνία 2016-10-20 μετατοπισμένη κατά +6 μήνες και -30 ημέρες δίνει 2017-03-21 (Ο Μάρτιος έχει 31 ημέρες). - Εάν είναι επιλεγμένο το πλαίσιο ελέγχου 'test', παράγεται μια αναφορά των παλιών και νέων ημερομηνιών/ωρών για τα επιλεγμένα αρχεία προς επιθεώρηση. Δεν γίνονται αλλαγές στα αρχεία. Εάν είστε ικανοποιημένοι ότι τα αποτελέσματα είναι σωστά, αφαιρέστε το πλαίσιο ελέγχου και εκτελέστε ξανά για να ενημερώσετε τα αρχεία. - - TOPIC: ΜΑΖΙΚΗ ΑΛΛΑΓΗ META +image: batch-change-meta.png - Αναθεωρήστε metadata για πολλαπλά αρχεία εικόνας. Μπορείτε να προσθέσετε νέα metadata, να αναθεωρήσετε υπάρχοντα metadata, και να διαγράψετε metadata. Χρησιμοποιήστε το κουμπί [select files] για να ανοίξετε ένα παράθυρο γκαλερί από το οποίο επιλέγετε αρχεία προς επεξεργασία {ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}. Εισαγάγετε ονόματα και τιμές tags metadata προς ανάθεση, ή αφήστε την τιμή κενή για να διαγράψετε το tag. Πατήστε [εφαρμογή]. Θα λάβετε ένα μήνυμα επιβεβαίωσης και μπορείτε να συνεχίσετε ή να ακυρώσετε αυτή τη στιγμή. Στα αριστερά παρέχεται μια λίστα συνήθως χρησιμοποιούμενων ονομάτων tag. Κάντε κλικ σε ένα από αυτά για να το εισαγάγετε στο πρώτο κενό πεδίο ονόματος tag στον διάλογο. Αυτή η λίστα προέρχεται από το αρχείο /metadata_picklist, το οποίο μπορείτε να επεξεργαστείτε για να προσθέσετε άλλα tags στη λίστα. Το κουμπί [Πλήρης Λίστα] παρέχει πληροφορίες σχετικά με τον τρόπο λήψης μιας λίστας όλων των διαθέσιμων ονομάτων tag. - - TOPIC: ΜΑΖΙΚΗ ΑΝΑΦΟΡΑ META +image: add-meta-tags.png +image: batch-report-meta.png - Αναφέρετε οποιαδήποτε metadata για οποιονδήποτε αριθμό εικόνων. Η έξοδος είναι ένα αρχείο κειμένου το οποίο εμφανίζεται στον προεπιλεγμένο επεξεργαστή κειμένου του συστήματός σας. Μπορείτε να χρησιμοποιήσετε τα χαρακτηριστικά αναζήτησης του επεξεργαστή κειμένου για να βρείτε εικόνες που ταιριάζουν με επιθυμητά metadata, ή μπορείτε να χρησιμοποιήσετε το αρχείο κειμένου ως είσοδο σε άλλα προγράμματα. Χρησιμοποιήστε το κουμπί [select files] για να ανοίξετε ένα παράθυρο γκαλερί για να επιλέξετε τα αρχεία προς επεξεργασία ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). Το κουμπί [επεξεργασία] ανοίγει έναν νέο διάλογο (δεξιά) όπου μπορείτε να επιλέξετε τα tags metadata προς αναφορά. Κάντε κλικ σε ένα tag στην αριστερή στήλη για να το προσθέσετε στη δεξιά στήλη και στην αναφορά. Κάντε κλικ σε ένα tag στη δεξιά στήλη για να το αφαιρέσετε. Κάντε κλικ στο τελευταίο tag στην αριστερή στήλη, "Other tag ...", για να πληκτρολογήσετε οποιοδήποτε όνομα tag που δεν εμφανίζεται στη λίστα, η οποία περιέχει μόνο τα πιο πιθανά απαραίτητα tags. - - TOPIC: ΜΑΖΙΚΑ GEOTAGS +image: batch-geotags.png - Επιλέξτε πολλές εικόνες και προσθέστε τα ίδια δεδομένα τοποθεσίας σε όλες. Χρησιμοποιήστε το κουμπί [select files] για να επιλέξετε τα αρχεία εικόνας από ένα παράθυρο γκαλερί ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). Στη συνέχεια λάβετε τα δεδομένα τοποθεσίας όπως περιγράφεται στην {ΕΠΕΞΕΡΓΑΣΙΑ ΚΥΡΙΩΝ META}, χρησιμοποιώντας το κουμπί [Εύρεση] ή κάνοντας κλικ σε έναν δείκτη χάρτη. Χρησιμοποιήστε αυτή τη λειτουργία επίσης για να διορθώσετε ασυνέπειες στην ορθογραφία τοποθεσίας ή δεδομένα latitude/longitude. Εάν το location και/ή country αφεθούν κενά, δεν ενημερώνονται. Για να διαγράψετε το location ή country, εισαγάγετε το όνομα "null". Εάν το latitude και longitude αφεθούν κενά, δεν ενημερώνονται. Για να διαγράψετε το latitude και longitude, εισαγάγετε "0" και για τις δύο τιμές. Μπορείτε να ενημερώσετε μόνο location/country, μόνο latitude/longitude, ή και τα δύο. Στην πράξη, μπορεί να διαπιστώσετε ότι το GPS της κάμερας εισάγει latitude και longitude χωρίς location και country, ή χρησιμοποιεί μια ανεπιθύμητη γλώσσα, ή όλα κεφαλαία γράμματα, ή κάποια άλλη τιμή που χρειάζεται επιδιόρθωση. - - TOPIC: ΕΞΑΓΩΓΗ ΑΡΧΕΙΩΝ Αντιγράψτε επιλεγμένα αρχεία εικόνας σε άλλο φάκελο. Η προβλεπόμενη χρήση είναι για την αντιγραφή αρχείων προς κοινή χρήση με άλλους, π.χ. τη μεταφόρτωση αρχείων σε έναν ιστότοπο. Τα αρχεία εξόδου είναι JPEG. Μπορείτε προαιρετικά να σμικρύνετε τις εικόνες. Επιλέξτε αρχεία εικόνας κάνοντας κλικ σε thumbnails γκαλερί ({ΕΠΙΛΟΓΗ ΑΡΧΕΙΩΝ ΕΙΚΟΝΑΣ}). Επιλέξτε έναν φάκελο όπου θα αντιγραφούν τα αρχεία εικόνας. Εάν είναι επιλεγμένο το 'export metadata', αντιγράφεται επίσης ένα περιορισμένο σύνολο metadata. Αυτά είναι: ημερομηνία φωτογραφίας, keywords, πνευματικά δικαιώματα, τίτλος, περιγραφή. - - TOPIC: ΜΕΝΟΥ ΕΡΓΑΛΕΙΩΝ - - TOPIC: ΕΥΡΕΤΗΡΙΑΣΗ ΑΡΧΕΙΩΝ +image: index-files1.png - Το Fotocx χρειάζεται να γνωρίζει όλα τα ονόματα φακέλων και αρχείων εικόνας σας και τα ενσωματωμένα metadata (ημερομηνίες, tags, geotags, τίτλους, περιγραφές, βαθμολογίες). Αυτά τα δεδομένα ευρετηριάζονται για γρήγορη αναζήτηση. Το Fotocx δημιουργεί επίσης εικόνες thumbnail ώστε τα παράθυρα γκαλερί (σελίδες thumbnail) να εμφανίζονται γρήγορα. Το Fotocx δεν τροποποιεί ή αντιγράφει τα αρχεία εικόνας σας. Ο απαιτούμενος χώρος είναι συνήθως 2% του χώρου των αρχείων εικόνας σας. - Η λειτουργία Ευρετηρίαση Αρχείων εκτελείται κάθε φορά που εκκινείται το Fotocx. Αυτή η λειτουργία θα δημιουργήσει τα thumbnails που λείπουν, θα αντικαταστήσει τα ξεπερασμένα, και θα ανανεώσει το ευρετήριο metadata χρησιμοποιώντας τρέχοντα δεδομένα από τα αρχεία εικόνας σας. Αυτό μπορεί να χρειαστεί σημαντικό χρόνο εάν έχετε πολλές χιλιάδες νέα αρχεία. - Τα αρχεία εικόνας που τροποποιούνται ή μετακινούνται εντός του Fotocx αντιμετωπίζονται αυτόματα. Η λειτουργία Ευρετηρίασης χρησιμοποιείται μόνο για νέα αρχεία εικόνας που δημιουργήθηκαν εκτός του Fotocx (π.χ. προστέθηκε μια νέα ομάδα φωτογραφιών), και για αρχεία που τροποποιήθηκαν ή μετακινήθηκαν εκτός του Fotocx. - Εισαγάγετε τους κύριους φακέλους εικόνων σας (π.χ. /home//Pictures). Χρησιμοποιήστε το κουμπί [περιήγηση] για να εντοπίσετε και να προσθέσετε φακέλους. Αυτοί οι φάκελοι και οποιοιδήποτε περιεχόμενοι υποφάκελοι θα επεξεργαστούν. Δεν έχει σημασία εάν άλλα αρχεία αναμειγνύονται με τις εικόνες. Διαγράψτε μια καταχώρηση κάνοντας κλικ στο αντίστοιχο 'X'. - Εισαγάγετε τον φάκελο thumbnails όπου θα αποθηκεύονται τα αρχεία thumbnail. Χρησιμοποιήστε την παρεχόμενη προεπιλογή ή ορίστε τη δική σας τοποθεσία. - Εάν έχετε χρησιμοποιήσει ονόματα φακέλων ή αρχείων για την ταξινόμηση των εικόνων σας, μπορείτε να τα χρησιμοποιήσετε άμεσα στη λειτουργία {ΑΝΑΖΗΤΗΣΗ ΕΙΚΟΝΩΝ}. Εάν έχετε αποθηκεύσει ημερομηνίες, keywords, geotags, τίτλους, ή βαθμολογίες στα metadata των εικόνων σας, αυτά θα είναι επίσης αναζητήσιμα. Αφού ευρετηριαστούν οι εικόνες, η αναζήτηση με βάση οποιοδήποτε από αυτά είναι σχεδόν ακαριαία. - ^Tags Metadata Τα ακόλουθα metadata περιλαμβάνονται στο ευρετήριο εικόνων από προεπιλογή: • ονόματα φακέλων και αρχείων • ημερομηνία/ώρα φωτογραφίας • ημερομηνία/ώρα τροποποίησης αρχείου • τίτλος και περιγραφή (metadata exif) • βαθμολογία (0-5 αστέρια) • keywords (ετικέτες χρήστη) • geotags (ονόματα χώρας και τοποθεσίας και latitude/longitude) • κάμερα: κατασκευαστής, μοντέλο, φακός • έκθεση: χρόνος, αριθμός f, εστιακή απόσταση, ISO - ^Επιπλέον tags Metadata +image: index-files2.png - Μπορείτε να προσθέσετε έως 20 άλλα tags metadata στο ευρετήριο αρχείων εικόνας. Τα metadata σε αυτή τη λίστα μπορούν να αναζητηθούν εξίσου γρήγορα με τα τυπικά tags. Μπορεί να μην το χρειάζεστε αυτό, αλλά εάν μερικές φορές χρειάζεται να αναζητήσετε μη τυπικά tags metadata, μπορείτε να τα προσθέσετε εδώ και η ταχύτητα αναζήτησης θα είναι σχεδόν ακαριαία. Πατήστε το κουμπί [select] για το "extra metadata" για να λάβετε τον παραπάνω διάλογο. Κάντε κλικ σε tags στην αριστερή λίστα για να τα προσθέσετε στη δεξιά λίστα - τα tags που θα προστεθούν στο ευρετήριο. Κάντε κλικ σε ένα tag στη δεξιά λίστα για να το αφαιρέσετε. Πατήστε [done] για να οριστικοποιήσετε τις αλλαγές. Ολόκληρη η συλλογή εικόνων σας θα ευρετηριαστεί ξανά. Αυτό θα προχωρήσει πιο γρήγορα από την αρχική ευρετηρίαση επειδή δεν δημιουργούνται ξανά τα thumbnails. - ^Πρόσβαση σε μη ευρετηριασμένα Αρχεία και Φακέλους Ένα μη ευρετηριασμένο αρχείο εικόνας ή φάκελος είναι αυτό που δεν περιλαμβάνεται μέσα στους δηλωμένους κύριους φακέλους εικόνων σας (οι υποφάκελοι των δηλωμένων φακέλων εικόνων σας περιλαμβάνονται πάντα). Μπορείτε να πλοηγηθείτε σε έναν τέτοιο φάκελο και να προβάλετε τα thumbnails κανονικά, και μπορείτε να προβάλετε και να επεξεργαστείτε τέτοια αρχεία κανονικά. Υπάρχουν περιορισμοί που θα πρέπει να κατανοήσετε: • Αυτά τα αρχεία θα λείπουν από οποιαδήποτε αποτελέσματα αναζήτησης και προβολές χάρτη. • Τα thumbnails δημιουργούνται τη στιγμή της προβολής - οι γκαλερί θα είναι αργές. Εάν αποκτήσετε πρόσβαση σε μια φορητή (αργή) συσκευή αποθήκευσης (π.χ. κάρτα SD κάμερας), θα παρατηρήσετε τη δύσκαμπτη απόδοση. Τα thumbnails θα δημιουργηθούν όπως χρειάζεται, και θα παραμείνουν αφού αφαιρεθεί η συσκευή. Πρόταση: αντιγράψτε τα αρχεία σε έναν δηλωμένο φάκελο Fotocx, στη συνέχεια κάντε όποια επεξεργασία χρειάζεστε από αυτή την τοποθεσία. Η απόδοση θα είναι πολύ καλύτερη. - ^Αφαιρούμενη Αποθήκευση (μονάδα USB) Εάν οι κύριοι φάκελοι εικόνων σας περιλαμβάνουν φακέλους σε μια αφαιρούμενη μονάδα, και εκτελείτε το Fotocx χωρίς την προσάρτηση της μονάδας, τα δεδομένα ευρετηρίου και τα thumbnails εξακολουθούν να διατηρούνται, ακόμα κι αν τα αφαιρούμενα αρχεία έχουν εξαφανιστεί. Όταν η αφαιρούμενη μονάδα προσαρτηθεί ξανά, και εκκινηθεί το Fotocx, επαναφέρεται η τελευταία κατάσταση. Εάν προστέθηκαν ή τροποποιήθηκαν αρχεία στο ενδιάμεσο διάστημα, τα δεδομένα ευρετηρίου και τα thumbnails ενημερώνονται. - - TOPIC: ΜΕΤΑΚΙΝΗΣΗ ΚΥΡΙΟΥ ΦΑΚΕΛΟΥ FOTOCX Ο αρχικός φάκελος του Fotocx περιέχει όλες τις ρυθμίσεις και τα δεδομένα χρήστη, συμπεριλαμβανομένων ορισμένων αρχείων από το πακέτο Fotocx που μπορούν να προσαρμοστούν από τον χρήστη. Προεπιλεγμένη τοποθεσία: /home//.fotocx. Εάν είναι εγκατεστημένες πολλαπλές εκδόσεις ή διανομές Linux, μπορεί να είναι επιθυμητό να υπάρχει ένας κοινός αρχικός φάκελος Fotocx αντί για έναν για κάθε διανομή. Το ίδιο θα μπορούσε να ισχύει εάν πολλοί χρήστες χρειάζεται να έχουν πρόσβαση στην ίδια περίπτωση Fotocx. - Χρησιμοποιήστε αυτή τη λειτουργία για να μετακινήσετε τον αρχικό φάκελο του Fotocx κάπου αλλού. Ο επιλεγμένος φάκελος θα πρέπει να περιλαμβάνει το "fotocx" μέσα στο όνομα διαδρομής, διαφορετικά θα προστεθεί το "/fotocx". - Δείτε την παράμετρο -home στις {ΠΑΡΑΜΕΤΡΟΙ ΕΝΤΟΛΩΝ} εάν θέλετε πολλαπλές συλλογές εικόνων Fotocx, διαχειριζόμενες ξεχωριστά. - - TOPIC: ΡΥΘΜΙΣΕΙΣ +image: settings.jpg - Διάφορες προτιμήσεις και ρυθμίσεις χρήστη συλλέγονται και αποθηκεύονται στο αρχείο /parameters. Οι περισσότερες αλλαγές γίνονται άμεσα. Ορισμένες θα προκαλέσουν επανεκκίνηση του Fotocx. - • Επιλέξτε τον επιθυμητό κωδικό γλώσσας 2 χαρακτήρων. Το Fotocx θα επανεκκινηθεί στην επιλεγμένη γλώσσα. • Startup View - αρχική εμφάνιση κατά την εκκίνηση του Fotocx. Recent Files: τα πιο πρόσφατα προβεβλημένα αρχεία εικόνας Newest Files: αρχεία που προστέθηκαν/τροποποιήθηκαν πιο πρόσφατα Specific Gallery: η καθορισμένη γκαλερί φακέλου Album Gallery: η καθορισμένη γκαλερί άλμπουμ Previous Gallery: γκαλερί που χρησιμοποιήθηκε τελευταία στην προηγούμενη συνεδρία Previous File: αρχείο που προβλήθηκε τελευταία στην προηγούμενη συνεδρία Specific File: το καθορισμένο αρχείο εικόνας κουμπί Browse: επιλογή φακέλου, άλμπουμ, ή αρχείου εικόνας • Background - χρώματα φόντου για τα παράθυρα Προβολή Αρχείου και Προβολή Γκαλερί • Menu Style - στυλ εμφάνισης μενού: εικονίδια, κείμενο, ή και τα δύο • Menu Colors - χρώμα κειμένου μενού και χρώμα φόντου • Dialog Font - γραμματοσειρά για μενού και διαλόγους • Show Hidden - εάν είναι επιλεγμένο, εμφάνιση κρυφών αρχείων και φακέλων • Zoom Speed - Επιλέξτε 1-8 κλικ ή πλήκτρα [+] ανά αύξηση εικόνας 2x • JPEG files - επίπεδο ποιότητας, προεπιλογή 90, χρησιμοποιήστε 70+ για καλή ποιότητα • Curve Node - ελάχιστη απόσταση κόμβων για τις καμπύλες επεξεργασίας, % της κλίμακας. Η προεπιλογή είναι 5% της κλίμακας. Χρησιμοποιήστε υψηλότερη τιμή για touchpad. • Image Position - η εικόνα είναι αριστερά/κέντρο/δεξιά μέσα σε ένα ευρύτερο παράθυρο • Confirm Exit - επιλογή αναδυόμενου διαλόγου: θέλετε πραγματικά να τερματίσετε; • Index Level - δείτε παρακάτω • RAW Loader - δείτε παρακάτω • RAW Options - δείτε παρακάτω • RAW Files - λίστα τύπων αρχείων RAW που χρησιμοποιούνται • Video Files - λίστα τύπων αρχείων βίντεο που χρησιμοποιούνται • Video App - δείτε παρακάτω - ^Ποιότητα και Συμπίεση Αρχείου Επίπεδο ποιότητας αρχείου JPEG: χρησιμοποιήστε 70 ή υψηλότερο για καλή ποιότητα εικόνας (προεπιλογή 90). Η μέθοδος συμπίεσης αρχείου TIFF είναι DEFLATE (καλύτερη για έγχρωμες εικόνες). Το επίπεδο συμπίεσης αρχείου PNG είναι '1'. Υψηλότερες τιμές φαίνεται να μην κάνουν τίποτα εκτός από την αύξηση του χρόνου αποθήκευσης αρχείου (libpng). - ^Θέση Εικόνας Εάν το παράθυρο είναι πλατύτερο από την εικόνα (δηλ. η αναλογία πλάτους/ύψους του παραθύρου > εικόνα), η εικόνα μπορεί να μετατοπιστεί στην αριστερή πλευρά, να κεντραριστεί, ή να μετατοπιστεί στη δεξιά πλευρά. Εάν αριστερά ή δεξιά, το μη χρησιμοποιούμενο περιθώριο μεγιστοποιείται, κάτι που μπορεί να είναι πιο βολικό για την τοποθέτηση πλαισίων διαλόγου. - ^Επίπεδο Ευρετηρίασης Εικόνων Αυτές οι δύο παράμετροι διέπουν έναν συμβιβασμό μεταξύ χρόνου εκκίνησης και πληρότητας του ευρετηρίου εικόνων. • $ fotocx: Ισχύει όταν το fotocx εκκινείται χρησιμοποιώντας μια εντολή shell, μενού συστήματος, ή εικονίδιο/εκκινητή συστήματος. Η προτεινόμενη τιμή '2' σημαίνει πλήρη ευρετηρίαση: φόρτωση του παλιού αρχείου ευρετηρίου, αναζήτηση νέων αρχείων (μη ευρετηριασμένων ακόμα) και ενημέρωση του αρχείου ευρετηρίου fotocx. • $ fotocx : Ισχύει όταν το fotocx εκκινείται κάνοντας κλικ σε ένα όνομα αρχείου σε μια λίστα διαχειριστή αρχείων. Η προτεινόμενη τιμή '1' σημαίνει φόρτωση του παλιού αρχείου ευρετηρίου αλλά χωρίς αναζήτηση νέων αρχείων για ενημέρωση του ευρετηρίου. Η εκκίνηση είναι μέτρια γρήγορη. Οι λειτουργίες αναζήτησης εικόνων και χάρτη λειτουργούν κανονικά, αλλά οποιαδήποτε νέα (μη ευρετηριασμένα ακόμα) αρχεία εικόνας δεν περιλαμβάνονται. • Εναλλακτικά: '0' σημαίνει καμία ευρετηρίαση. Η εκκίνηση είναι πολύ γρήγορη. Μια μεταγενέστερη χρήση μιας λειτουργίας αναζήτησης εικόνων ή χάρτη θα ξεκινήσει τη λειτουργία ευρετηρίασης αρχείων μόνο για παλιά αρχεία (καμία αναζήτηση για νέα/τροποποιημένα αρχεία). Χρησιμοποιήστε αυτή την επιλογή εάν η συλλογή εικόνων σας είναι γιγαντιαία και ο χρόνος εκκίνησης ξεπερνά μερικά δευτερόλεπτα. Μπορείτε να ξεκινήσετε τη λειτουργία ευρετηρίασης αργότερα εάν χρειάζεται. - ^RAW Loader Ο RAW loader είναι η εντολή που χρησιμοποιείται για την ανάγνωση ενός αρχείου RAW και τη μετατροπή του σε TIFF με βάθος χρώματος 16-bit. Χρησιμοποιείται όταν προβάλλεται ένα αρχείο RAW. Μπορείτε να χρησιμοποιήσετε τις λειτουργίες επεξεργασίας του Fotocx για να επεξεργαστείτε και να βελτιστοποιήσετε το αρχείο. Ο προεπιλεγμένος RAW loader είναι το dcraw χρησιμοποιώντας τον χρωματικό χώρο sRGB. Μερικές άλλες επιλογές χρησιμοποιώντας dcraw ή rawtherapee παρέχονται στη λίστα επιλογής. Αυτές οι εντολές διατηρούνται στο αρχείο 'raw_commands_*' στον αρχικό φάκελο του Fotocx. Επεξεργαστείτε αυτό το αρχείο για να αλλάξετε ή να προσθέσετε νέες επιλογές (δείτε παρακάτω). Μπορεί να θέλετε να προετοιμάσετε πολλαπλές εντολές για πολλαπλές κάμερες ή πολλαπλές επιλογές επεξεργασίας. Εάν προτιμάτε να χρησιμοποιήσετε έναν επεξεργαστή RAW διαδραστικά, δημιουργήστε μια εντολή plugin για αυτό - δείτε {PLUGINS}. - ^RAW Options • edit commands: πατήστε το κουμπί για να επεξεργαστείτε τη λίστα εντολών RAW loader. Ένας επεξεργαστής κειμένου θα ξεκινήσει σε νέο παράθυρο, με την τρέχουσα λίστα εντολών. • match embedded image color: χρησιμοποιήστε την ενσωματωμένη εικόνα του αρχείου RAW ως οδηγό για την αντιστοίχιση των χρωμάτων της εικόνας RAW στη μετατραπείσα εικόνα TIFF. Αυτή είναι η ερμηνεία του κατασκευαστή της κάμερας για τα δεδομένα RAW - ένα καλό σημείο εκκίνησης εάν το αρχείο RAW χρειάζεται περαιτέρω επεξεργασία. Η ενσωματωμένη εικόνα είναι συνήθως ίδια με το αρχείο JPEG από την κάμερα. - ^Video App Εισαγάγετε μια εντολή shell για να ξεκινήσετε μια εφαρμογή αναπαραγωγής βίντεο. Χρησιμοποιήστε το '%s' για να σημειώσετε πού εισάγεται το όνομα του αρχείου βίντεο στη γραμμή εντολών. Εδώ είναι μερικά παραδείγματα: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: ΣΥΝΤΟΜΕΥΣΕΙΣ ΠΛΗΚΤΡΟΛΟΓΙΟΥ +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - Προβάλετε ή αλλάξτε προσαρμοσμένες συντομεύσεις πληκτρολογίου. Οι τρέχουσες ανατεθειμένες συντομεύσεις εμφανίζονται στο πρώτο παράθυρο. Εάν πατήσετε το κουμπί [Επεξεργασία], εμφανίζεται ο δεύτερος διάλογος, όπου μπορείτε να προσθέσετε και να αλλάξετε συντομεύσεις πληκτρολογίου. Εισαγάγετε μια νέα συντόμευση χρησιμοποιώντας το πληκτρολόγιο. Μπορείτε να χρησιμοποιήσετε τα πλήκτρα A-Z, 0-9, F2-F9, και τα περισσότερα σύμβολα (% $ & * < κ.λπ.). Μπορείτε να συνδυάσετε ένα πλήκτρο με ένα από τα Ctrl/Alt/Shift: Πατήστε και κρατήστε ΕΝΑ από τα Ctrl/Alt/Shift, στη συνέχεια πατήστε το πλήκτρο, στη συνέχεια αφήστε και τα δύο. Επιλέξτε μία από τις διαθέσιμες αναθέσεις μενού από τη λίστα στα δεξιά, στη συνέχεια πατήστε [Προσθήκη] και [OK]. Αφαιρέστε μια συντόμευση επιλέγοντάς την και πατώντας [Διαγραφή]. - - TOPIC: ΙΣΤΟΓΡΑΜΜΑ RGB +image: RGB-hist.png - Ένα μικρό παράθυρο εμφανίζει ένα γράφημα ιστογράμματος φωτεινότητας της τρέχουσας εικόνας σε Προβολή Αρχείου, ή της τρέχουσας επιλεγμένης περιοχής της εικόνας. Αυτό το γράφημα ενημερώνεται σύγχρονα καθώς οι λειτουργίες επεξεργασίας αλλάζουν την εικόνα. Χρησιμοποιήστε τα κουμπιά [Όλα] [Κόκκινο] [Πράσινο] [Μπλε] για να επιλέξετε ποια χρώματα θα εμφανίζονται. - - TOPIC: ΜΕΓΕΘΥΝΣΗ ΕΙΚΟΝΑΣ +image: magnify-image.jpg - Μεγεθύνετε την εικόνα σε μια περιοχή γύρω από τον δείκτη του ποντικιού. Σύρετε το ποντίκι με το αριστερό κουμπί γύρω από την εικόνα για να μεγεθύνετε διαφορετικές περιοχές, ανάλογα με την προβολή μιας εκτυπωμένης εικόνας με μεγεθυντικό φακό. Χρησιμοποιήστε τον διάλογο για να ρυθμίσετε την ακτίνα της περιοχής και την ποσότητα μεγέθυνσης. - - TOPIC: ΜΕΤΡΗΣΗ ΕΙΚΟΝΑΣ Κάντε κλικ σε οποιεσδήποτε δύο θέσεις μέσα σε μια εικόνα για να μετρήσετε την απόσταση σε pixel μεταξύ των σημείων. Οι θέσεις όπου έγινε κλικ επισημαίνονται με A και B στην εικόνα. Αυτές οι ετικέτες δείχνουν πάντα τα δύο τελευταία σημεία στα οποία έγινε κλικ. Ο διάλογος ενημερώνεται με τις αποστάσεις που χωρίζουν αυτά τα δύο σημεία: X-distance (οριζόντια απόσταση) Y-distance (κάθετη απόσταση) H-distance (συνολική απόσταση) - - TOPIC: ΕΜΦΑΝΙΣΗ RGB +image: show-RGB.png - Όταν γίνεται κλικ σε ένα σημείο της εικόνας, οι τιμές RGB εμφανίζονται σε ένα παράθυρο διαλόγου. Εμφανίζονται τα τελευταία 9 σημεία στα οποία έγινε κλικ. Οι τιμές έχουν τη μορφή xxx.dd, όπου το xxx είναι τα ανώτερα 8 bit της τιμής χρώματος και το .dd είναι τα κατώτερα 8 bit. Το εύρος είναι 0.00 έως 255.99. Τα κατώτερα 8 bit είναι μηδέν εκτός εάν η εικόνα επεξεργάζεται ή έχει πάνω από 8 bit βάθος χρώματος. Οι έξοδοι ενημερώνονται σε πραγματικό χρόνο εάν η εικόνα επεξεργάζεται. Εάν είναι επιλεγμένο το "labels", τα σημεία επισημαίνονται στην εικόνα με γράμματα που αντιστοιχούν στα γράμματα στο παράθυρο διαλόγου. Εάν είναι επιλεγμένο το "delta" και η εικόνα επεξεργάζεται, τότε εμφανίζονται οι αλλαγές RGB αντί για τις απόλυτες τιμές. - Εάν ανοίξετε άλλη εικόνα (π.χ. για σύγκριση με την προηγούμενη εικόνα), οι θέσεις διατηρούνται και ενημερώνονται εάν βρίσκονται εντός των ορίων της νέας εικόνας. Αυτό διευκολύνει τη σύγκριση εικόνων στο επίπεδο των τιμών RGB pixel. - - TOPIC: ΡΥΘΜΙΣΕΙΣ ΠΛΕΓΜΑΤΟΣ +image: grid-settings.jpg - Υπάρχουν δύο λειτουργίες γραμμών πλέγματος: Το Grid Settings ορίζει όλες τις παραμέτρους πλέγματος. Το Toggle Grid ενεργοποιεί ή απενεργοποιεί τις γραμμές πλέγματος. Οι γραμμές πλέγματος είναι οριζόντιες και κάθετες γραμμές σε τακτά διαστήματα κατά μήκος της εικόνας. Αυτές οι γραμμές μπορούν να είναι χρήσιμοι οδηγοί ευθυγράμμισης όταν μια εικόνα ισιώνεται ή παραμορφώνεται για να ευθυγραμμιστούν τοίχοι ή άλλα αντικείμενα στην εικόνα. Χρησιμοποιήστε τις εισόδους x-count και y-count για να ορίσετε τον αριθμό των κάθετων και οριζόντιων γραμμών αντίστοιχα. Τα στοιχεία ελέγχου x- και y-offset μπορούν να χρησιμοποιηθούν για τη μετατόπιση των γραμμών πλέγματος ώστε να διασταυρώνονται σε μια επιθυμητή θέση στην εικόνα. Μια συντόμευση πληκτρολογίου (προεπιλογή shift+G) μπορεί να ανατεθεί στο Toggle Grid, ώστε οι γραμμές πλέγματος να μπορούν να ενεργοποιηθούν ή να απενεργοποιηθούν με ένα πάτημα πλήκτρου. - - TOPIC: ΧΡΩΜΑ ΓΡΑΜΜΗΣ Ορισμένες λειτουργίες σχεδιάζουν γραμμές πάνω στην εικόνα (Crop, Select Area, άλλες). Μπορείτε να αλλάξετε το χρώμα αυτών των γραμμών για να μεγιστοποιήσετε την αντίθεση σε σχέση με την εικόνα φόντου. Ο μικρός διάλογος μπορεί να παραμείνει ανοιχτός κατά την επεξεργασία, για βολική εναλλαγή μεταξύ διαθέσιμων χρωμάτων (μαύρο, λευκό, κόκκινο, πράσινο). - - TOPIC: ΣΚΟΤΕΙΝΑ/ΦΩΤΕΙΝΑ PIXEL Επισημάνετε τα πιο σκοτεινά και τα πιο φωτεινά pixel σε μια εικόνα. Ρυθμίστε τα δύο spin controls για να ορίσετε τα όρια φωτεινότητας, τα οποία αρχικά είναι 0 για σκοτεινά pixel και 255 για φωτεινά pixel. Pixel με φωτεινότητα μικρότερη από το σκοτεινό όριο ή μεγαλύτερη από το φωτεινό όριο "αναβοσβήνουν" για να ξεχωρίζουν. Χρησιμοποιήστε αυτή τη λειτουργία για την ανίχνευση αποκοπής (clipping) μετά την επεξεργασία φωτεινότητας ή χρώματος. - - TOPIC: ΧΡΩΜΑ ΟΘΟΝΗΣ +image: moncolor-small.png - Οκτώ ζώνες χρώματος εγγράφονται κατά μήκος της οθόνης με φωτεινότητα από μηδέν (μαύρο) έως 100%. Μπορείτε να το χρησιμοποιήσετε αυτό για να ρυθμίσετε τη φωτεινότητα και την αντίθεση της οθόνης σας. Δεν θα πρέπει να υπάρχουν αμετάβλητες περιοχές σε κανένα από τα δύο άκρα των ζωνών. - - TOPIC: ΕΥΡΕΣΗ ΔΙΠΛΟΤΥΠΩΝ +image: find-dups.png - Βρείτε διπλότυπα αρχεία εικόνας οπουδήποτε μέσα στη βάση δεδομένων εικόνων σας. Ένα διπλότυπο αρχείο μπορεί να είναι ένα αρχείο που είναι ακριβώς ίδιο ή "σχεδόν" ίδιο με ένα άλλο αρχείο. Για χάρη ταχύτητας, οι εικόνες thumbnail συγκρίνονται στη μνήμη. Είναι πιθανό να βρεθούν ταιριαστά thumbnails για κύριες εικόνες που έχουν μικρές διαφορές που δεν αντικατοπτρίζονται στα thumbnails. Ένα αντίγραφο εικόνας που μειώθηκε σε μέγεθος είναι πιθανό να ταξινομηθεί ως διπλότυπο. Το μέγεθος thumbnail μπορεί να οριστεί από 32 έως 512 pixel. Ένα μεγαλύτερο μέγεθος μειώνει την πιθανότητα ψευδώς θετικών αποτελεσμάτων. Το μέγεθος thumbnail επηρεάζει σημαντικά την ποσότητα κύριας μνήμης που απαιτείται - π.χ. για 100K εικόνες, το μέγεθος 64 χρειάζεται περίπου 880 MB, ενώ το μέγεθος 256 χρειάζεται περίπου 14 GB. Πατήστε το κουμπί [calculate] για να υπολογίσετε το μεγαλύτερο μέγεθος thumbnail που μπορεί να χωρέσει εντός της διαθέσιμης ελεύθερης μνήμης. - Χρησιμοποιούνται δύο παράμετροι για τον ορισμό της ευαισθησίας ανίχνευσης πανομοιότυπων ή σχεδόν πανομοιότυπων εικόνων: η pixel difference είναι η διαφορά τιμής RGB κάτω από την οποία τα pixel θεωρούνται ίσα. Το pixel count είναι ο αριθμός διαφορετικών pixel κάτω από τον οποίο δύο εικόνες ταξινομούνται ως διπλότυπα. Παράδειγμα: εάν το pixel difference = 2 και το pixel count = 10, τότε οι εικόνες ταξινομούνται ως διπλότυπα εάν λιγότερα από 10 pixel διαφέρουν κατά 2 ή λιγότερο. - Η έξοδος είναι μια γκαλερί που δείχνει κάθε σύνολο διπλότυπων εικόνων. Η γκαλερί εξόδου αποθηκεύεται ως άλμπουμ "Duplicate Images". Μπορείτε να χρησιμοποιήσετε την Ομαδική Διαγραφή/Καλάθι μαζί με αυτό το άλμπουμ για να επιλέξετε ποια διπλότυπα θα διαγράψετε. - - TOPIC: ΕΥΡΕΣΗ ΕΣΦΑΛΜΕΝΩΝ ΑΡΧΕΙΩΝ Όλα τα αρχεία εικόνας μέσα στους δηλωμένους κύριους φακέλους σας διαβάζονται. Για κάθε αρχείο που δεν μπορεί να αναγνωστεί, έχετε τρεις επιλογές: • διαγραφή του αρχείου • διόρθωση λανθασμένου τύπου αρχείου (δείτε παρακάτω) • μετακίνηση του αρχείου κάπου έξω από τους κύριους φακέλους εικόνων σας Έχω δει συχνά αρχεία .png με επέκταση .jpg. Οι browsers και ορισμένες άλλες εφαρμογές το αντιμετωπίζουν αυτό σιωπηλά. Εδώ, αναφέρεται ο σωστός τύπος αρχείου και μπορείτε να αλλάξετε την επέκταση στη σωστή. - - TOPIC: ΕΜΦΑΝΙΣΗ ΠΟΡΩΝ Αναφέρετε τους πόρους υπολογιστή που χρησιμοποιεί το Fotocx: • CPU time: χρήση από την εκκίνηση του Fotocx ή από το τελευταίο δείγμα • Real memory: η πραγματική μνήμη που χρησιμοποιείται αυτή τη στιγμή (εξαιρουμένου του swap) • Maps cache: MB αποθηκευτικού χώρου δίσκου που χρησιμοποιούνται για cached πλακίδια χάρτη • Clear cache: διαγραφή όλων των cached πλακιδίων χάρτη • κουμπί [Sample]: λήψη νέου δείγματος και αναφορά των δεδομένων - Το κουμπί [Sample] επαναφέρει τον χρόνο CPU. Το επόμενο δείγμα θα δείξει μόνο τον νέο συσσωρευμένο χρόνο CPU. Ο χρόνος CPU είναι το άθροισμα για όλα τα threads διεργασίας. - - TOPIC: ΜΕΤΑΦΡΑΣΕΙΣ Μεταφράσεις για αρκετές γλώσσες περιλαμβάνονται στο πακέτο Fotocx. Αυτές οι μεταφράσεις AI δεν είναι τέλειες. Τα σφάλματα μετάφρασης μπορούν να διορθωθούν επεξεργαζόμενοι τα αρχεία μετάφρασης. - ^Αλλαγή της γλώσσας GUI Το μενού {ΡΥΘΜΙΣΕΙΣ} μπορεί να χρησιμοποιηθεί για την αλλαγή της γλώσσας. Η γλώσσα μπορεί επίσης να οριστεί όταν εκκινείται το Fotocx: $ fotocx -lang xx # γλώσσα xx (de fr zh κ.λπ.) $ fotocx -lang en # Αγγλικά - ^Τροποποίηση μιας μετάφρασης GUI Επεξεργαστείτε το αρχείο /translations/gui_xx Τα ζεύγη γραμμών κειμένου έχουν στην αρχή 4ψήφιους αριθμούς που πρέπει να ταιριάζουν. Η πρώτη γραμμή είναι στα Αγγλικά, η 2η γραμμή είναι στη γλώσσα xx. Τροποποιήστε μόνο τη γραμμή xx, ποτέ την Αγγλική γραμμή. Οι ειδικοί χαρακτήρες για την εισαγωγή παραμέτρων στο κείμενο πρέπει να παραμείνουν στην ίδια σειρά. Αυτοί είναι οι '%d' (ακέραια παράμετρος), '%f' (δεκαδικός), '%s' (κείμενο). - ^Τροποποίηση μιας μετάφρασης του οδηγού χρήσης Επεξεργαστείτε το αρχείο /translations/ug_xx Επεξεργαστείτε το ug_xx για να διορθώσετε τη μετάφραση. Μην προσθέτετε ή αφαιρείτε γραμμές κειμένου ούτε να αλλάζετε τη σειρά. Οι γραμμές κειμένου πρέπει να αντιστοιχούν 1:1 με τον αγγλικό οδηγό χρήσης, ug_en. - Στείλτε αναθεωρημένα αρχεία για συμπερίληψη στην επόμενη έκδοση του Fotocx: mkornelix@gmail.com - - TOPIC: ΜΕΝΟΥ ΒΟΗΘΕΙΑΣ • User Guide - Εμφάνιση πίνακα περιεχομένων • Video Tutorial - Εμφάνιση βίντεο εκμάθησης Fotocx στο YouTube • Outboard Programs - Λίστα εξωτερικών προγραμμάτων και των λειτουργιών τους • Show Log File - Εμφάνιση καταγεγραμμένων πληροφοριών και μηνυμάτων σφάλματος • Command Parameters - Εμφάνιση διαθέσιμων παραμέτρων γραμμής εντολών • Change Log - Εμφάνιση προσθηκών και διορθώσεων σφαλμάτων σε πρόσφατες εκδόσεις • Copyright - Εμφάνιση πνευματικών δικαιωμάτων και αδειών σχετικών με το Fotocx • Privacy - Εμφάνιση της πολιτικής ιδιωτικότητας (κανόνων) για το Fotocx • About - Εμφάνιση αριθμού έκδοσης, τοποθεσίας εκτελέσιμου, επικοινωνίας • Home Page - Εμφάνιση της αρχικής σελίδας του Fotocx στο kornelix.net • Uninstall - Πώς να απεγκαταστήσετε το Fotocx - - TOPIC: ΑΛΛΑ ΘΕΜΑΤΑ Τα ακόλουθα θέματα δεν συνδέονται με τα μενού του Fotocx. - - TOPIC: VIDEO FILES Αρχεία βίντεο (.mpeg, .mp4, κ.λπ.) μπορεί να αναμειγνύονται με τα αρχεία εικόνας σας. Θα εμφανίζονται ως αρχεία εικόνας τόσο στην Προβολή Αρχείου όσο και στην Προβολή Γκαλερί. Το πλήκτρο 'P' θα ξεκινήσει, θα παύσει, και θα συνεχίσει το βίντεο, ή θα επαναλάβει ένα βίντεο που έχει τελειώσει. Το πλήκτρο 'Q' θα τερματίσει το βίντεο. Χρησιμοποιήστε το μενού {ΡΥΘΜΙΣΕΙΣ} για να επιλέξετε την εφαρμογή αναπαραγωγής αρχείων βίντεο. - - TOPIC: ΔΙΑΦΑΝΕΙΕΣ ΚΑΙ ΑΡΝΗΤΙΚΑ +image: color-negative.jpg - Μπορείτε να χρησιμοποιήσετε μια κάμερα με δυνατότητα κοντινής λήψης για να φωτογραφίσετε σλάιντ ή αρνητικά φιλμ. Χρησιμοποιήστε ένα light box για φωτισμό, ή χρησιμοποιήστε τον ουρανό (παράδειγμα παραπάνω). Για να επεξεργαστείτε ένα χρωματικό αρνητικό, δημιουργήστε πρώτα ένα θετικό - δείτε {ΛΕΙΤΟΥΡΓΙΑ ΧΡΩΜΑΤΟΣ}. Εάν η εικόνα είναι θολή από ομίχλη, επιλέξτε μόνο την περιοχή της εικόνας, εξαιρώντας τις άκρες του φιλμ, και στη συνέχεια χρησιμοποιήστε το {ΚΑΘΟΛΙΚΟ RETINEX} για να εξαλείψετε την ομίχλη. Ορίστε τα λευκά και μαύρα σημεία κάνοντας κλικ στην εικόνα εάν χρειάζεται για περαιτέρω μείωση της ομίχλης. - - TOPIC: ΠΕΡΙΟΡΙΣΜΟΙ ΤΟΥ FOTOCX • Υπάρχει ένα αυστηρό όριο ενός εκατομμυρίου αρχείων. • εκδόσεις εικόνας - έως 99 εκδόσεις για undo/redo και ονομασία έκδοσης. • keywords εικόνας - 10K συνολικά keywords. 1000 χαρακτήρες για μία εικόνα. • Οι γκαλερί περιορίζονται σε 40K αρχεία εικόνας. • οι μέγιστες διαστάσεις εικόνας είναι 40K x 20K pixel. - - TOPIC: FOTOCX ΓΙΑ WINDOWS 11 Το Fotocx μπορεί να χρησιμοποιηθεί στα Windows 11 εγκαθιστώντας το Windows Subsystem for Linux 2, ή WSL2. Υπάρχει άφθονη τεκμηρίωση στο internet σχετικά με το πώς να το κάνετε αυτό. - Εάν τα αρχεία εικόνας σας βρίσκονται στο σύστημα αρχείων των Windows (NTFS), το Fotocx θα είναι πολύ αργό. Επομένως μετακινήστε τα αρχεία εικόνας σας στο σύστημα αρχείων Linux. Μπορείτε να τα προσπελάσετε ακόμα χρησιμοποιώντας τον Windows File Explorer και άλλες εφαρμογές Windows, οπότε τίποτα δεν χάνεται. Η Microsoft συνιστά επίσης το σύστημα αρχείων Linux για βελτιωμένη απόδοση. Χρησιμοποιήστε το εικονίδιο 'Linux' στον File Explorer για πρόσβαση στον αρχικό φάκελό σας στο σύστημα αρχείων Linux. Προσθέστε έναν φάκελο Pictures εάν χρειάζεται, και μετακινήστε εκεί τα αρχεία εικόνας σας. - Εάν είναι διαθέσιμο ένα πακέτο Fotocx, εγκαταστήστε το. Διαφορετικά, κάντε τα εξής: Κατεβάστε το αρχείο πακέτου δυαδικού κώδικα (binary) του Fotocx από το ^https://kornelix.net. Στο τερματικό Linux: $ cd /mnt/c/Users//Downloads # μετάβαση στον φάκελο λήψεων των Windows $ tar -xzf fotocx-xxx-bin.tar.gz # αποσυμπίεση του πακέτου στον φάκελο fotocx $ cd fotocx # μετάβαση στον φάκελο fotocx $ chmod u+x install.sh # να γίνει εκτελέσιμο το script εγκατάστασης $ ./install.sh # εκτέλεση του script, εγκατάσταση του fotocx $ fotocx # εκκίνηση του Fotocx Μπορεί να χρειαστεί να επανεκκινήσετε το παράθυρο Linux για να λειτουργήσει το τελευταίο βήμα. - Διαβάστε τα εισαγωγικά μέρη αυτού του οδηγού χρήσης. Το Fotocx διαθέτει βαθιά λειτουργικότητα. Μην περιμένετε να κατακτήσετε το Fotocx σε λίγα λεπτά. - - TOPIC: ΑΠΟΡΡΗΤΟ Το Fotocx δεν διατηρεί κανένα δεδομένο χρήστη εκτός από τα αρχεία εικόνας και τα metadata τους. Τα metadata θα πρέπει να αφαιρούνται από τα αρχεία εικόνας πριν από τη μεταφόρτωση στο internet, και το Fotocx παρέχει μια απλή μέθοδο για να το κάνετε αυτό. - - TOPIC: PROBLEM, QUESTION, SUGGESTION Στείλτε e-mail στο mkornelix@gmail.com. Εάν υπάρχει ένα crash dump (αρχείο zappcrash) στείλτε και αυτό. - fotocx/data/translations/ug_ru0000664000175000017500000164632215247006657015552 0ustar micomico- ^ РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ FOTOCX^ v.26.8 Смотрите через меню Fotocx Справка > Руководство пользователя - {ИСПОЛЬЗОВАНИЕ FOTOCX} {ПЕРВЫЙ ЗАПУСК} - поиск и индексирование файлов изображений для быстрого поиска {РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ} ← ^click here^ - как пользоваться браузером этого руководства {ВИД ОКОН И МЕНЮ} - окна верхнего уровня и связанные с ними меню {ПРОСМОТР ФАЙЛА} - окно просмотра файла (просмотр одного файла изображения) {ПРОСМОТР ГАЛЕРЕИ} - окно просмотра галереи (просмотр папки в виде миниатюр) {ПРОСМОТР КАРТЫ} - окно просмотра карты (карта с маркерами местоположения изображений) {ПЕРЕТАСКИВАНИЕ} - способы перетаскивания файлов {РЕДАКТИРОВАТЬ ПРОЦЕДУРЫ} - как редактировать файлы изображений {РЕДАКТИРОВАТЬ РАБОЧИЙ ПРОЦЕСС} - альтернативные методы редактирования - простые и сложные {ВЛАДЕНИЕ МЫШЬЮ} - управление диалогом и мышью, их взаимодействие {МЫШЬ ALT+ПРАВАЯ КНОПКА} - правая кнопка мыши для тачпадов/сенсорных экранов {КНОПКИ ДИАЛОГА} - варианты завершения диалога {КЛАВИША ESCAPE} - функции клавиши Escape {НЕСТАНДАРТНЫЕ ЭЛЕМЕНТЫ ДИАЛОГА} - как использовать нестандартные элементы диалога {РЕДАКТИРОВАНИЕ КРИВОЙ} - как работать с кривыми, используемыми в функциях редактирования {MOUSE PAINTING} - локальное редактирование изображения с помощью мыши {МАССОВАЯ ОБРАБОТКА} - обзор функций массовой обработки {ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ} - процедура выбора файлов изображений {СОЧЕТАНИЯ КЛАВИШ} - всплывающие меню, сочетания клавиш, пользовательское меню {ФУНКЦИИ МЫШИ} - функции мыши для просмотра файлов/галереи/карты {ПАРАМЕТРЫ КОМАНДЫ} - параметры командной строки Fotocx - {МЕНЮ ФАЙЛА} {НОВЫЙ СЕАНС} - начать новый сеанс Fotocx в отдельном окне {ОТКРЫТЬ ФАЙЛ ИЗОБРАЖЕНИЯ} - открыть файл изображения для просмотра или редактирования {ЦИКЛ 2 ФАЙЛА} - циклически переключаться между двумя последними просмотренными файлами изображений {ЦИКЛ 3 ФАЙЛА} - циклически переключаться между тремя последними просмотренными файлами изображений {ПРОСМОТР 360° ПАНОРАМЫ} - панорамное изображение 360° с вращающейся точкой обзора {ПУСТОЕ ИЗОБРАЖЕНИЕ} - создать пустое изображение заданного размера и цвета {ПУСТОЕ ИЗОБРАЖЕНИЕ} - создать новое пустое изображение {КОПИРОВАНИЕ/ПЕРЕМЕЩЕНИЕ} - скопировать или переместить файл изображения в другую папку {КОПИРОВАТЬ НА РАБОЧИЙ СТОЛ} - скопировать файл изображения на рабочий стол {КОПИРОВАТЬ В БУФЕР ОБМЕНА} - скопировать файл изображения в буфер обмена {УДАЛИТЬ/В КОРЗИНУ} - удалить или переместить в корзину файл изображения {УСТАНОВИТЬ ОБОИ} - установить обои рабочего стола из текущего файла изображения {ПЕЧАТЬ ИЗОБРАЖЕНИЯ} - напечатать файл изображения {ПЕЧАТЬ С КАЛИБРОВКОЙ} - печать с использованием данных цветовой калибровки {КАЛИБРОВКА ПРИНТЕРА} - калибровка цвета принтера - компенсация цветовых сдвигов - {МЕНЮ ГАЛЕРЕИ} {ОБЗОР ГАЛЕРЕИ} {ТЕКСТУРА} - просмотр галереи с миниатюрами и именами файлов {ПРОСМОТР METADATA} - просмотр галереи с миниатюрой и базовыми metadata {НЕДАВНИЕ ФАЙЛЫ} - просмотр галереи из недавно просмотренных файлов изображений {НОВЕЙШИЕ ФАЙЛЫ} - просмотр галереи из новейших файлов изображений {СОРТИРОВКА ГАЛЕРЕИ} - изменить порядок сортировки галереи {ФИЛЬТР ГАЛЕРЕИ} - выбрать новейшие, старейшие, соответствующие шаблону ... {ГЛАВНАЯ ГАЛЕРЕЯ} - перейти к началу галереи {КОНЕЦ ГАЛЕРЕИ} - перейти к концу галереи {ПАПКА ТЕКУЩЕГО ФАЙЛА} - задать текущую галерею из папки текущего файла {НЕДАВНИЕ ПАПКИ} - просмотреть список недавних папок, выбрать {ДЕРЕВО ПАПОК} - просмотреть папки файлов изображений в виде дерева, выбрать {ВЫБОР ФАЙЛОВ} - выбрать файлы для ввода в массовую операцию, сценарий или альбом {ЗАКЛАДКИ} - просмотреть список закладок, перейти к закладке {РЕДАКТИРОВАТЬ ЗАКЛАДКИ} - добавить, удалить, упорядочить закладки - {MAPS MENU} {КАРТА МИРА} - обзор карты мира из интернета {ПОКАЗАТЬ НА КАРТЕ} - показать положение текущего изображения на карте - {МЕНЮ АЛЬБОМОВ} {АЛЬБОМЫ} - создание и упорядочивание коллекций изображений {СОЗДАТЬ АЛЬБОМ} - создать новый альбом (галерею выбранных изображений) {ПЕРЕИМЕНОВАТЬ АЛЬБОМ} - переименовать существующий альбом {УДАЛИТЬ АЛЬБОМ} - удалить существующий альбом {ВЫБОР АЛЬБОМА} - выбрать альбом и отобразить галерею изображений {ТЕКУЩИЙ АЛЬБОМ} - показать текущий (последний использованный) альбом {ГАЛЕРЕЯ В АЛЬБОМ} - сохранить текущую галерею как именованный альбом {ИЗМЕНИТЬ АЛЬБОМ} - добавить, удалить, переставить файлы изображений в галерее альбома {ОБНОВИТЬ АЛЬБОМЫ} - обновить альбомы для обновлённых файлов изображений (новых версий) {МАССОВОЕ ОБНОВЛЕНИЕ АЛЬБОМА} массовое обновление альбомов (добавление/удаление/замена файлов-участников) {СЛАЙД-ШОУ} - слайд-шоу с анимированными переходами изображений и панорамированием/zoom - {ПОЛЬЗОВАТЕЛЬСКОЕ МЕНЮ} - пользовательское меню для часто используемых функций {ФАЙЛЫ СЦЕНАРИЯ} - обзор файлов сценариев {РЕДАКТИРОВАТЬ СЦЕНАРИЙ} - записать правки в сценарий для создания пользовательской функции редактирования {ЗАПУСТИТЬ СЦЕНАРИЙ} - выполнить сценарий для текущего изображения {МАССОВЫЙ СЦЕНАРИЙ} - выполнить сценарий для выбранных файлов изображений {ПЛАГИНЫ} - запустить функцию редактирования плагином, открыть выходной файл плагина - {ZOOM} - увеличение/уменьшение изображения или миниатюр с помощью мыши или клавиатуры - {ПРЕДЫД./СЛЕД.} - переход к предыдущему или следующему изображению с помощью мыши или клавиатуры - {СОХРАНЕНИЕ ФАЙЛА} - сохранить файл изображения (заменить, новая версия, новое имя файла) - {МЕНЮ METADATA} {ПРОСМОТР ОСНОВНЫХ META} - показать список основных metadata изображения {ПРОСМОТР ВСЕХ META} - показать список всех metadata изображения {ОБЗОР KEYWORDS} - keywords, используемые для поиска изображений {GEOTAGS OVERVIEW} - названия местоположений и геокоординаты для поиска {РЕДАКТИРОВАТЬ ОСНОВНЫЕ META} - редактировать часто используемые metadata {РЕДАКТИРОВАТЬ ЛЮБЫЕ META} - редактировать любые metadata (добавить, удалить, изменить) {УДАЛИТЬ META} - удалить указанные metadata или все metadata {КОПИРОВАТЬ META} - скопировать metadata из одного файла изображения в другой {ИСПРАВИТЬ META} - исправить повреждённые metadata, мешающие их редактированию {УПРАВЛЕНИЕ KEYWORDS} - управление keywords, определёнными пользователем {ПОДПИСИ} - показать имя файла, заголовок, описание в углу изображения {МЕСТА/ДАТЫ} - список местоположений/дат изображений, щелчок для галереи {ПЛИТКИ2} - показать количество изображений по годам/месяцам, щелчок для галереи {TAGS METADATA} - показать количество изображений по значению tag, щелчок для галереи {АВТОПОИСК} - сценарная функция поиска для нахождения файлов {ПОИСК ИЗОБРАЖЕНИЙ} - поиск по любым metadata или именам папок/файлов - {МЕНЮ ВЫБОРА} {ОБЗОР ОБЛАСТИ} - выбор области - концепции и использование {ВЫБОР ОБЛАСТИ} - выбрать элемент или область изображения для раздельного редактирования {НАЙТИ РАЗРЫВ ОБЛАСТИ} - найти разрыв в контуре области, нарисованном вручную {СМЕШИВАНИЕ ОБЛАСТИ} - смешивание правок, сделанных в выбранной области, с помощью мыши {ПОКАЗАТЬ/СКРЫТЬ ОБЛАСТЬ} - показать или скрыть контуры областей {ВКЛЮЧИТЬ/ОТКЛЮЧИТЬ ОБЛАСТЬ} - включить или отключить область для редактирования {ИНВЕРТИРОВАТЬ ОБЛАСТЬ} - инвертировать область (поменять местами внешнюю и внутреннюю области) {ОЧИСТИТЬ ОБЛАСТЬ} - удалить область {КОПИРОВАТЬ/ВСТАВИТЬ ОБЛАСТЬ} - скопировать область или вставить область в текущее изображение {ЗАГРУЗИТЬ/СОХРАНИТЬ ОБЛАСТЬ} - загрузить область из файла или сохранить в файл - {КНОПКА ОТМЕНИТЬ/ПОВТОРИТЬ} - последовательная отмена или повтор правок текущего изображения - {МЕНЮ РЕДАКТИРОВАНИЯ} {ПОВОРОТ} - повернуть или выровнять изображение {ВЫПРЯМЛЕНИЕ} - выпрямить повёрнутое или отражённое изображение {ОБРЕЗКА} - обрезать (подрезать) поля изображения {РЕТУШЬ} - редактировать яркость, контраст, цвет, насыщенность {ИЗМЕНЕНИЕ МАСШТАБА} - изменить размеры изображения в пикселях {РАЗДЕЛЁННЫЙ ЭКРАН} - просмотр изменений до/после в режиме разделённого экрана {ПОКАЗАТЬ РАЗЛИЧИЯ} - выделить изменения во время редактирования (или любых двух изображений) {ПОЛЯ} - добавить поля к изображению любого цвета или прозрачности {РАЗМЕТКА} - рисовать на изображении: текст, линия/стрелка, прямоугольник, овал {ЦВЕТОВОЙ РЕЖИМ} - преобразовать в чёрно-белое, цветное, негатив, позитив {ПРАВКИ КИСТЬЮ} - постепенное локальное нанесение функции правки с помощью мыши {РИСОВАНИЕ ПО ИЗОБРАЖЕНИЮ} - рисование мышью цветом с заданным размером кисти и непрозрачностью {РИСОВАНИЕ ПРОЗРАЧНОСТИ} - рисование возрастающей прозрачности с помощью мыши {ЗАЛИВКА ОБЛАСТИ} - заполнить выбранные или прозрачные области цветом {КОПИРОВАТЬ ВНУТРИ ИЗОБРАЖЕНИЯ} - скопировать пиксели внутри изображения с помощью мыши {КОПИРОВАТЬ ИЗ ИЗОБРАЖЕНИЯ} - скопировать пиксели из другого изображения с помощью мыши {КОПИРОВАТЬ ПРЕДЫДУЩУЮ ПРАВКУ} - скопировать пиксели из предыдущих правок с помощью мыши - {МЕНЮ ВОССТАНОВЛЕНИЯ} {РЕЗКОСТЬ} - повысить резкость размытого изображения, несколько методов {РАЗМЫТИЕ} - размыть изображение или область изображения, несколько методов {ШУМОПОДАВЛЕНИЕ} - уменьшить шум изображения (мелкие случайные крапинки) {УДАЛЕНИЕ ДЫМКИ} - добавить или удалить дымку/туман из изображения или выбранной области {КРАСНЫЕ ГЛАЗА} - устранить красные глаза на фото со вспышкой {УМНОЕ УДАЛЕНИЕ} - удалить провода, знаки и другие мелкие помехи {УДАЛИТЬ ОРЕОЛ} - удалить ореолы, оставленные резкостью и другими функциями {АРТЕФАКТЫ JPEG} - подавить артефакты в сильно сжатых файлах {СГЛАЖИВАНИЕ} - подавить пикселизацию (зазубрины) по краям элементов {НАСТРОЙКА RGB} - настроить цвета изображения с использованием цветов RGB или CMY {НАСТРОЙКА HSL} - выбрать и изменить цвета с использованием цветовой модели HSL {УДАЛИТЬ ПЫЛЬ} - удалить пятна пыли на изображениях со старых фото {ОКАНТОВКИ} - исправить периферийные цветовые окантовки (хроматическую аберрацию) - {МЕНЮ УЛУЧШЕНИЯ} {ВЫРОВНЯТЬ ГИСТОГРАММУ} - выровнять гистограмму яркости для лучшей детализации {ЛОКАЛЬНЫЙ КОНТРАСТ} - добавить контраст с учётом яркости локальной области {УСИЛЕНИЕ КОНТРАСТА} - усилить существующий контраст для улучшения деталей {ГЛОБАЛЬНЫЙ RETINEX} - изменить масштаб значений RGB для большего диапазона {ЛОКАЛЬНЫЙ RETINEX} - изменить масштаб значений RGB для большего диапазона {НАСЫЩЕННОСТЬ} - настроить насыщенность цвета в зависимости от яркости {МЯГКИЙ ФОКУС} - применить классический эффект «мягкого фокуса» к изображению {ГРАДИЕНТ ЯРКОСТИ} - добавить градиент яркости/цвета по изображению {ВИНЬЕТКА} - изменить яркость/цвет радиально вокруг выбранного центра - {МЕНЮ ЭФФЕКТОВ} {КОНТУРЫ} - преобразовать изображение в контурный рисунок {НАБРОСОК1} - преобразовать изображение в имитацию наброска (1) {НАБРОСОК2} - преобразовать изображение в имитацию наброска (2) {МУЛЬТФИЛЬМ} - преобразовать изображение в мультипликационный рисунок {ТИСНЕНИЕ} - преобразовать изображение в имитацию тиснения (эффект 3D) {ПРОСМОТР МИНИАТЮР} - преобразовать изображение в квадратные плитки с 3D-эффектом {ПЛИТКИ1} - преобразовать изображение в неправильные плитки, соответствующие изображению {ЖИВОПИСЬ} - преобразовать изображение в имитацию живописи {Обследовать все файлы} - добавить текстуру к изображению или выбранной области {СЛИЯНИЕ} - подавить мелкие детали, сохраняя резкость {СОПОСТАВЛЕНИЕ ЦВЕТОВ} - сопоставить цвета одного изображения с другим изображением {УЗОР} - добавить фоновый узор к изображению {ШТРИХОВКА} - преобразовать в набросок с помощью пересекающихся параллельных линий {ДИЗЕРИНГ} - разные способы пикселизации или постеризации изображения {ГРАВИРОВКА} - преобразовать изображение в чёрно-белые линии {ДОБАВИТЬ БЛИКИ} - добавить блики вокруг ярких объектов на изображении {МОЗАИКА} - преобразовать изображение в мозаику из плиток, составленных из изображений {ДОБАВИТЬ ШУМ} - добавить случайный шум к изображению {УСТАНОВИТЬ ЦВЕТА} - уменьшить количество цветов (постеризация) {СМЕЩЕНИЕ ЦВЕТОВ} - постепенно сдвигать цвета RGB в GBR или BRG {ЧУЖЕРОДНЫЕ ЦВЕТА} - добавить случайные необычные цвета к изображению {ПОЛЬЗОВАТЕЛЬСКОЕ ЯДРО} - редактировать и применить пользовательское ядро свёртки - {МЕНЮ ИСКАЖЕНИЯ} {ВЫПРЯМИТЬ} - выпрямить изображения с изогнутыми линиями, особенно панорамы {ПЕРСПЕКТИВА} - выпрямить объект, снятый под тупым углом {ИСКАЖЕНИЕ ОБЛАСТИ} - исказить выбранную область изображения, вытягивая мышью {WARP LINEAR1} - исказить изображение перетаскиванием мыши - линейное искажение 1 {WARP LINEAR2} - исказить изображение перетаскиванием мыши - линейное искажение 2 {ИСКРИВЛЁННОЕ ИСКАЖЕНИЕ} - исказить изображение перетаскиванием мыши - изогнутое искажение {ИСКАЖЕНИЕ АФФИННОЕ} - исказить изображение перетаскиванием мыши - параллельные линии сохраняются {РАДИАЛЬНОЕ ИСКАЖЕНИЕ} - добавить или удалить бочкообразную или подушкообразную дисторсию {РАСКРУТИТЬ КРУПНЫЙ ПЛАН} - убрать искажение фото крупного плана лица (большой нос) {СОЗДАТЬ ВОЛНЫ} - исказить изображение волновым узором {ЗАКРУЧИВАНИЕ} - закрутить изображение вокруг выбранной центральной точки {СФЕРА} - изогнуть изображение в форму сферы {НАИЗНАНКУ} - инвертировать расстояние от центра до края для каждого пикселя {ХРОНОЛОГИЯ} - обернуть панорамное изображение вокруг круга {СПИРАЛЬ ЭШЕРА} - преобразовать изображение в бесконечную спираль, закручивающуюся внутрь {ВЫРОВНЯТЬ ФОТО} - выровнять фото изогнутой поверхности - {МЕНЮ ОБЪЕДИНЕНИЯ} {HDR} - объединить тёмные/светлые изображения для расширенного диапазона яркости {HDF} - объединить изображения с близким/дальним фокусом для увеличенной глубины резкости {СТЕК/ЖИВОПИСЬ} - объединить изображения, чтобы удалить проезжающие машины, туристов и т. д. {СТЕК/ШУМ} - объединить изображения для уменьшения шума путём усреднения {СТЕК/СЛОИ} - объединить версии изображения, выбор/рисование области/версии {ПАНОРАМА} - объединить серию изображений по горизонтали {ПОКАЗАТЬ ФАЙЛЫ CIM} - показать входные файлы для текущего/последнего объединённого изображения {МОНТАЖ} - расположить изображения и форматированный текст в пользовательском макете {МАССИВ ИЗОБРАЖЕНИЙ} - объединить множество изображений в компактный формат массива - {МЕНЮ МАССОВЫХ ОПЕРАЦИЙ} {МАССОВОЕ ПРЕОБРАЗОВАНИЕ} - копирование, перемещение, изменение масштаба, переименование, преобразование, добавление текста ... {МАССОВОЕ КОПИРОВАНИЕ/ПЕРЕМЕЩЕНИЕ} - копировать/переместить выбранные файлы изображений в новую папку {МАССОВОЕ ВЫПРЯМЛЕНИЕ} - найти повёрнутые файлы изображений и выпрямить их {МАССОВОЕ УДАЛЕНИЕ/КОРЗИНА} - удалить или переместить в корзину выбранные файлы изображений {МАССОВОЕ НАЛОЖЕНИЕ} - добавить накладываемое изображение (копирайт ...) на выбранные изображения {МАССОВЫЕ KEYWORDS} - добавить или удалить keywords для выбранных файлов изображений {МАССОВОЕ ПЕРЕИМЕНОВАНИЕ KEYWORDS} - переименовать или удалить keywords для всех файлов изображений {МАССОВАЯ ОЧИСТКА KEYWORDS} - удалить ненужные keywords из всех файлов изображений {МАССОВАЯ ДАТА СЪЁМКИ} - изменить дату или время съёмки, или сдвинуть часовой пояс {МАССОВОЕ ИЗМЕНЕНИЕ META} - добавить или изменить metadata для выбранных файлов изображений {МАССОВЫЙ ОТЧЁТ META} - отчёт по metadata для выбранных или всех файлов изображений {МАССОВЫЕ GEOTAGS} - добавить или изменить geotags для выбранных или всех файлов изображений {ЭКСПОРТ ФАЙЛОВ} - экспортировать выбранные файлы в папку (например, для загрузки в интернет) - {КРОШЕЧНАЯ ПЛАНЕТА} {ИНДЕКСИРОВАНИЕ ФАЙЛОВ} - разовая задача поиска и индексирования всех файлов изображений {ПЕРЕНОС ДОМАШНЕЙ ПАПКИ FOTOCX} - перенести домашнюю папку Fotocx (пользовательские данные и настройки) {НАСТРОЙКИ} - пользовательские предпочтения и настройки работы Fotocx {СОЧЕТАНИЯ КЛАВИШ} - показать и изменить сочетания клавиш для функций меню {ГИСТОГРАММА RGB} - график гистограммы яркости для текущего изображения {УВЕЛИЧЕНИЕ ИЗОБРАЖЕНИЯ} - превратить мышь в увеличительное стекло над изображением {ИЗМЕРЕНИЕ ИЗОБРАЖЕНИЯ} - измерить расстояния между пикселями внутри изображения (щелчки мыши) {ПОКАЗАТЬ RGB} - показать значения RGB в положении мыши или для выбранных точек {НАСТРОЙКИ СЕТКИ} - показать или убрать линии сетки, задать количество или интервал линий {ЦВЕТ ЛИНИИ} - задать цвет для контуров выбранных областей {ТЁМНЫЕ/ЯРКИЕ ПИКСЕЛИ} - инструмент для выделения клиппинга {ЦВЕТ МОНИТОРА} - настроить яркость и контраст монитора {НАЙТИ ДУБЛИКАТЫ} - найти повторяющиеся изображения в галерее или среди всех изображений {НАЙТИ ПОВРЕЖДЁННЫЕ ФАЙЛЫ} - найти нечитаемые файлы изображений, удалить/переместить/исправить {ПОКАЗАТЬ РЕСУРСЫ} - показать время процессора и текущее использование памяти {МЕНЮ ИНСТРУМЕНТОВ} - создать или изменить переводы GUI - {МЕНЮ СПРАВКИ} - руководство пользователя, обучение, журнал изменений, о Fotocx, удаление программы - {ДРУГИЕ ТЕМЫ} {VIDEO FILES} - видеофайлы, миниатюры, воспроизведение видео {СЛАЙДЫ И НЕГАТИВЫ} - как оцифровывать слайды и фотоплёнку {ОГРАНИЧЕНИЯ FOTOCX} - ограничения по размеру и производительности {FOTOCX ДЛЯ WINDOWS 11} - установка Fotocx на Windows 11 WSL {КОНФИДЕНЦИАЛЬНОСТЬ} - политика конфиденциальности и защиты данных Fotocx {PROBLEM, QUESTION, SUGGESTION} - связаться с автором Fotocx - - TOPIC: ИСПОЛЬЗОВАНИЕ FOTOCX - - TOPIC: ПЕРВЫЙ ЗАПУСК - ^Внешние программы Fotocx сообщает об обязательных и дополнительных внешних программах и функции, обеспечиваемой каждой из них. Если каких-либо обязательных программ не хватает, установите их и запустите Fotocx снова. - ^Первое индексирование Fotocx проиндексирует ваши файлы изображений. Это ускоряет отображение страниц галереи (миниатюр), обеспечивает быстрый поиск на основе проиндексированных metadata и позволяет использовать кликабельные маркеры карты для просмотра изображений по местоположению. Вам нужно указать одну или несколько «верхних» папок изображений (например, /home//Pictures). Подпапки включаются автоматически. Файлы, не являющиеся изображениями, в этих папках игнорируются. Используйте кнопку [select], чтобы найти и добавить ваши верхние папки изображений. Практический предел - около 30 верхних папок. Каждая может содержать сотни подпапок. - ^Миниатюры Это папка, в которой будут размещены файлы миниатюр. Используйте предлагаемое по умолчанию местоположение или выберите другое. - ^Время индексирования Скорость индексирования может составлять от нескольких сотен до более 10 тысяч файлов в минуту, в зависимости от типа и размера ваших файлов изображений и скорости вашего компьютера. Когда вы добавляете новые файлы изображений в свою коллекцию, при следующем запуске Fotocx проиндексирует новые файлы. Если новых файлов много, запуску потребуется время на их индексирование. - ^Объединение заголовка и описания изображения Функция индексирования изображений Fotocx заменяет отсутствующие metadata заголовка и описания одним из многих альтернативных tags metadata, если они доступны: headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. Это делается для того, чтобы вы всегда могли просматривать/редактировать/искать, используя только «заголовок» и «описание». Этот процесс преобразования происходит относительно медленно (2200 файлов в минуту на моём мощном компьютере). Это выполняется при первом индексировании новых файлов изображений. Ничего не удаляется. - - TOPIC: РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ Откройте руководство пользователя через меню Справка > Руководство пользователя. Во время работы с Fotocx вы можете нажать F1, чтобы просмотреть раздел руководства пользователя для текущей или последней использованной функции меню. - Для прокрутки текста используйте клавиши стрелка вверх/вниз и page up/down. Кнопка [Найти] открывает диалог текстового поиска. Нажмите [Найти] снова для перехода к следующему совпадению. - Жирный текст прописными буквами - это кликабельная ссылка на раздел, например {ИНДЕКСИРОВАНИЕ ФАЙЛОВ}. Используйте кнопки [<] и [>], чтобы перемещаться вперёд и назад между недавно просмотренными разделами. Кнопка [Recent] показывает кликабельный список недавно просмотренных разделов. - - TOPIC: ВИД ОКОН И МЕНЮ +image: fotocx-views.jpg - ^Кнопки меню При щелчке по меню появляется всплывающее подменю. Три верхних меню (Файл, Галерея, Карты) задают соответствующий режим просмотра. Также можно использовать клавиши F/G/M. - - TOPIC: ПРОСМОТР ФАЙЛА Одно изображение заполняет всё окно Fotocx. Увеличение/уменьшение - щелчком левой/правой кнопкой мыши. Клавиша Z переключает между режимом «по размеру окна» и размером 1x (1 пиксель изображения = 1 пиксель экрана). Чтобы панорамировать увеличенное изображение, перетаскивайте мышь по изображению левой кнопкой. Колесо мыши также может увеличивать или уменьшать изображение. Используйте кнопки меню (Правка, Восстановление и т. д.), чтобы изменить изображение. Используйте кнопку «Сохранить файл», чтобы сохранить изменённый файл: заменить, создать новую версию или создать новый файл (новое имя). - ^Клавиши стрелка влево/вправо на клавиатуре Просмотр предыдущего или следующего файла изображения в текущей галерее. - ^клавиши стрелка вверх/вниз Как выше, но показываются только последние версии, либо оригинал, если версий не существует. - - TOPIC: ПРОСМОТР ГАЛЕРЕИ Все файлы изображений в текущей галерее показаны в виде массива миниатюр. - ^Типы галерей • Папка: все файлы изображений и подпапки в одной папке (каталоге) • Альбом: файлы изображений из различных папок, упорядоченные пользователем • Недавние файлы: самые недавно просмотренные или отредактированные файлы изображений • Новейшие файлы: файлы изображений, добавленные или изменённые последними • Результаты поиска: изображения, найденные функцией поиска. Также является альбомом. - ^Функции галереи • щелчок левой кнопкой по миниатюре изображения: открыть изображение в режиме просмотра файла • щелчок правой кнопкой по миниатюре изображения: всплывающее меню часто используемых функций • щелчок по миниатюре папки: открыть эту папку в режиме галереи • верхняя панель галереи папки: родительские папки - щелчок для перехода туда • кнопка [TOP]: список папок верхнего уровня - щелчок для перехода туда • полосы прокрутки: прокрутка галереи вверх/вниз • клавиши стрелка вверх/вниз: прокрутка галереи на одну строку • клавиши page up/down: прокрутка галереи на одну страницу • клавиши home/end: переход к началу (верху) и концу (низу) галереи • колесо мыши: прокрутка галереи вверх и вниз • клавиши [+] и [-]: увеличение/уменьшение размера миниатюр - ^Всплывающие изображения галереи • Щёлкните миниатюру средней кнопкой мыши для всплывающего изображения • Щёлкните миниатюру с shift + левой кнопкой мыши для всплывающего изображения • Щелчок левой кнопкой по всплывающему изображению: увеличить изображение • Щелчок правой кнопкой по всплывающему изображению: закрыть всплывающее изображение • Колесо прокрутки мыши: увеличить или уменьшить всплывающее изображение • Клавиша F11: сделать всплывающее изображение полноэкранным • Клавиша Escape: закрыть всплывающее изображение • Можно использовать несколько всплывающих окон для сравнения изображений - - TOPIC: ПРОСМОТР КАРТЫ Просмотр карт с маркерами, соответствующими местоположениям изображений. Щёлкните по маркеру, чтобы открыть галерею соответствующих изображений. Это зависит от наличия в ваших файлах изображений встроенных геокоординат (latitude, longitude). Современные камеры добавляют эти данные автоматически, и вы также можете добавить их самостоятельно. Изначально отображается карта мира. Используйте колесо мыши для увеличения/уменьшения в любом месте. Перетащите, чтобы сдвинуть центр карты. Весь мир можно просматривать в любом масштабе, вплоть до уровня улиц. - - TOPIC: ПЕРЕТАСКИВАНИЕ Если вы откроете два сеанса Fotocx, вы можете перетаскивать файлы из одного в другой. Перетащите миниатюру галереи из одного окна в другое. Если это режим просмотра файла, файл открывается. Если это режим галереи, результат зависит от типа галереи. Если галерея является папкой, файл добавляется в папку, и галерея покажет новый файл в отсортированной позиции. Если галерея является альбомом, файл добавляется в альбом в том месте, куда он был перетащен. - - TOPIC: РЕДАКТИРОВАТЬ ПРОЦЕДУРЫ Изображение в режиме просмотра файла (текущее изображение) можно изменить с помощью функций редактирования в меню Правка, Восстановление, Улучшение, Эффекты, Искажение и Объединение. Эти функции изменяют текущее изображение в памяти и в окне. По мере использования этих функций правки накапливаются. Когда вы закончите редактирование, используйте кнопку меню [Сохранить], чтобы сохранить изменённое изображение обратно в тот же файл, в новую версию (например, filename.v01.jpg) или в новый файл и/или папку. Диалоги редактирования изображений содержат ползунки, кнопки, кнопки-счётчики или редактируемые кривые, которые немедленно обновляют изображение. - Щёлкните левой или правой кнопкой по кнопке «Отменить/Повторить», чтобы отменить или повторить текущую активную функцию правки. После того, как к изображению применена одна или несколько правок, кнопка «отменить/повторить» позволяет перемещаться назад и вперёд по всем выполненным шагам, чтобы увидеть состояние изображения после каждого шага. Средняя кнопка мыши показывает всплывающий список всех правок, сделанных для текущего изображения, и вы можете выбрать любой шаг, чтобы вернуться к нему. Изображение можно повторно отредактировать с любого предыдущего шага. При этом будут отброшены правки, сделанные после этого шага, поскольку они были получены из него. Эта возможность отмены/повтора сохраняется, пока отредактированное изображение остаётся текущим. Если открывается другое изображение, история правок отбрасывается. Если вы хотите сохранить возможность вернуться к текущему состоянию изображения, сохраните изображение как новую версию, прежде чем продолжить с другой правкой. - - TOPIC: РЕДАКТИРОВАТЬ РАБОЧИЙ ПРОЦЕСС - ^Простой рабочий процесс В большинстве случаев вы можете просто редактировать JPEG-файл, полученный с камеры. Используйте следующую более сложную процедуру только в случае, если вы видите цветные полосы после правок, расширивших диапазон яркости в некоторых областях изображения настолько, что шаги яркости становятся заметны. - ^Сложный рабочий процесс Чтобы редактировать с расширенной глубиной цвета (более 8 бит на цвет RGB), начните с RAW-файла камеры. Файл RAW можно редактировать так же, как любой другой файл изображения. Функции редактирования Fotocx работают с 24 битами на цвет, поэтому полная глубина цвета RAW-файла сохраняется. При открытии файла RAW используется выбранный загрузчик RAW - см. {НАСТРОЙКИ}. Вы также можете использовать функцию массового преобразования, чтобы преобразовать несколько файлов RAW в файлы TIFF, PNG или JXL с 16 битами на цвет. - Dcraw - загрузчик RAW-файлов по умолчанию. Вы также можете использовать более сложный редактор RAW, например Rawtherapee - см. {НАСТРОЙКИ}. Dcraw прост и быстр по сравнению с ним. Функции редактирования в редакторе RAW обычно можно выполнить проще в Fotocx. - - TOPIC: ВЛАДЕНИЕ МЫШЬЮ Некоторые диалоги правки используют мышь для ссылки на изображение в главном окне или его изменения. Одновременно может быть активно более одного такого диалога. Мышь также используется для увеличения и прокрутки изображения, и вам может понадобиться делать это во время работы с диалогом правки. Поэтому важно понимать, какой диалог или окно владеет мышью, и как изменить это владение: • Если диалог имеет фокус клавиатуры, действия мыши на изображении являются вводом для этого диалога и не увеличивают и не прокручивают изображение. • Если вы удерживаете клавишу CTRL при щелчке или перетаскивании мыши по изображению, изображение будет увеличиваться или панорамироваться/прокручиваться. Открытые диалоги при этом не затрагиваются. • Колесо мыши может увеличивать/уменьшать в любом месте изображения. - - TOPIC: МЫШЬ ALT+ПРАВАЯ КНОПКА Для тачпадов или сенсорных экранов щелчки правой кнопкой мыши могут быть неудобны. Если удерживать клавишу ALT при нажатии левой кнопки мыши, это интерпретируется как правая кнопка мыши. - - TOPIC: КНОПКИ ДИАЛОГА В основном они работают следующим образом: • [Сброс] - отменить текущую правку, вернуть изображение в исходное состояние • [Применить] - применить настройки диалога к изображению, оставить диалог активным • [OK] - то же, что [Применить], но диалог закрывается • [Отмена] - отменить изменения изображения и закрыть диалог • [Продолжить] - продолжить длительную задачу на основе введённых в диалоге данных • [X] - закрыть диалог без действия - - TOPIC: КЛАВИША ESCAPE Если фокус на главном окне: • если ещё выполняется длительная функция, прервать её • если главное окно развёрнуто на весь экран, восстановить прежний размер • если текущий вид - галерея или карта, переключиться на просмотр файла • если ничего из вышеперечисленного не применимо: выйти из Fotocx Если фокус на окне диалога: закрыть диалог (аналогично кнопке [X]) Прочее: отменить всплывающее изображение, выйти из просмотра панорамы 360°, приостановить или выйти из слайд-шоу. - - TOPIC: НЕСТАНДАРТНЫЕ ЭЛЕМЕНТЫ ДИАЛОГА +image: custom-widgets.png - Некоторые нестандартные виджеты используются для уменьшения размера диалога или удобства использования. Они работают почти как стандартные виджеты GTK. Виджет числовых данных работает как стандартная кнопка-счётчик GTK: колесо мыши и клавиши стрелка вверх/вниз на клавиатуре можно использовать для быстрого увеличения или уменьшения значения. При использовании тачпада коснитесь поля ввода, чтобы установить курсор, затем используйте клавиатуру для ввода значения или клавиши стрелка вверх/вниз для быстрого перехода к новому значению. Если клавишу удерживать нажатой, скорость изменения со временем увеличивается. Клавиша Shift позволяет увеличить скорость в 10 раз. Нелинейный ползунок расширяет шкалу вокруг нейтрального значения, чтобы небольшие изменения можно было контролировать точнее, особенно с тачпадом. Некоторые стандартные виджеты GTK уменьшены в размере за счёт удаления лишних отступов. Это управляется файлом 'widgets.css' в домашней папке Fotocx. При желании вы можете изменить этот файл. Вы можете удалять элементы или помечать их как комментарии, но не удаляйте сам файл - он будет автоматически заменён. - - TOPIC: РЕДАКТИРОВАНИЕ КРИВОЙ +image: retouch.png - Некоторые функции редактирования изображений используют редактируемые кривые. Вы можете манипулировать кривыми, чтобы изменить некоторое свойство изображения в зависимости от другого свойства. Кривые можно перемещать (тянуть) мышью. В том месте, где кривая тянется, к ней добавляется опорная точка (чёрная точка), и эта точка остаётся зафиксированной - кривая будет продолжать проходить через эту точку при перетягивании других её частей. Опорную точку можно переместить перетаскиванием или удалить щелчком правой кнопкой. - - TOPIC: MOUSE PAINTING Мышь можно использовать для локального редактирования изображения. Круг вокруг положения мыши охватывает область изображения, которая изменяется при перетаскивании мыши левой кнопкой по изображению. Источником изменения может быть функция правки, выбранный цвет или пиксели из другого места того же изображения или из другого изображения. Пиксели изображения внутри круга мыши изменяются так, чтобы соответствовать источнику. Скорость изменения может быть быстрой или постепенной, в зависимости от коэффициентов мощности для центра и края круга мыши. Если коэффициент центра высок, а коэффициент края низок, изображение изменяется быстрее в центре мыши и постепенно медленнее от центра к краю. Перетаскивайте мышь левой кнопкой многократно по одной и той же области изображения, чтобы накопить изменения, пока пиксели полностью не совпадут с исходным цветом или изображением, либо пока исходная функция правки не будет полностью применена. Перетаскивайте правой кнопкой, чтобы постепенно отменить изменения, восстанавливая исходное изображение. - Пример: если функция правки - «Ретушь», и яркость увеличена, то изображение будет светлеть в области мыши при перетаскивании левой кнопкой. Используйте перетаскивание правой кнопкой, чтобы постепенно восстановить исходное изображение. - Кнопка [undo-last] отменяет последнюю операцию рисования или стирания, и это можно повторять, чтобы убрать много недавних правок. Каждая новая операция перетаскивания мышью - это единица работы, которую можно отменить отдельно. Память для отмены ограничена, поэтому сохраняются только недавние шаги рисования и стирания. [undo all] вернёт изображение в исходное состояние. - Используйте кнопку [undo/redo] для проверки изменений во время правок. - Если активна {ВЫБОР ОБЛАСТИ}, рисование ограничивается этой областью. - ПРИМЕЧАНИЕ: Увеличьте изображение до 100% или более при использовании очень малого радиуса (например, при рисовании линий на изображении). Шаги перемещения мыши измеряются в экранных пикселях. Если это охватывает много пикселей изображения при использовании малого радиуса, некоторые пиксели могут быть пропущены мышью и не обработаны. - - TOPIC: МАССОВАЯ ОБРАБОТКА В {МЕНЮ МАССОВЫХ ОПЕРАЦИЙ} есть несколько функций массовой обработки для ускорения некоторых распространённых задач. Вы можете выбрать много файлов изображений и выполнить функцию массовой обработки для всех них. Функции массовой обработки можно использовать для изменения имени или типа файла, выпрямления, изменения масштаба, копирования или перемещения, удаления, изменения tags, keywords, местоположения/геокоординат, дат съёмки. - - TOPIC: ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ +image: select-image-files.jpg - Эта процедура используется для всех функций, работающих с несколькими файлами изображений. Процедура описана здесь, и этот раздел связан ссылкой из каждой функции, использующей эту процедуру. • щелчок левой кнопкой по миниатюре: добавить в список выбора • щелчок правой кнопкой: удалить • добавить несколько: щёлкните первую миниатюру, затем shift-щелчок по последней • кнопка [Добавить все]: добавить всю галерею • кнопка [Добавить текущий]: добавить текущий файл • файл может быть добавлен в список несколько раз • переходите в другие галереи, чтобы при необходимости выбрать больше файлов • кнопка [Удалить]: удалить выбранную позицию списка • кнопка [Очистить]: очистить весь список • клавиши стрелка вверх/вниз: перемещение по списку, просмотр миниатюр • клавиши home/end: переход к началу/концу списка - Кнопка [Отключить] отключит выбор файлов щелчком по миниатюре. После этого кнопка переименовывается в [Включить] - нажмите, чтобы восстановить выбор щелчком по миниатюре. Цель этого - включить обычные всплывающие меню миниатюр и просмотр файла в полном размере щелчком левой кнопкой, что невозможно, если щелчки по миниатюрам используются для выбора файлов. Это может понадобиться при принятии решения о выборе. Вы также можете оставаться в режиме просмотра файла и перемещаться по изображениям с помощью клавиш стрелок, используя кнопку [Добавить текущий] для добавления файлов в список выбора. - - TOPIC: СОЧЕТАНИЯ КЛАВИШ Существует три способа быстрого доступа к часто используемым функциям: • Щёлкните правой кнопкой по главному окну или миниатюре галереи. Всплывающее меню покажет некоторые часто используемые функции. • Вы можете изменять сочетания клавиш и добавлять новые. См. {СОЧЕТАНИЯ КЛАВИШ}. • Соберите часто используемые функции в пользовательском меню. См. {ПОЛЬЗОВАТЕЛЬСКОЕ МЕНЮ}. - Сочетания клавиш доступны для наиболее распространённых функций. Используйте меню Инструменты > Сочетания клавиш, чтобы просмотреть или изменить их. - Следующие сочетания клавиш фиксированы и не могут быть изменены: • клавиша [+] [=]: увеличить изображение или миниатюры • клавиша [-]: уменьшить изображение или миниатюры • клавиша Z: переключить zoom: 1x <--> по размеру окна • клавиша F1: показать руководство пользователя для текущей функции • клавиша F10: переключить главное окно в полноэкранный режим и обратно • клавиша F11: как F10, но без меню, заголовка окна, верхней панели • клавиша Escape: прервать выполняющуюся функцию, закрыть активный диалог • клавиша Delete: диалог удаления или перемещения в корзину текущего файла • стрелка влево/вправо: показать предыдущее/следующее изображение в галерее • стрелка вверх/вниз: то же самое, но показывать только последние версии • Page Up/Down: режим галереи: прокрутка на одну страницу вверх/вниз • Home/End: режим галереи: переход к первой/последней странице галереи - Следующие сочетания клавиш заданы по умолчанию и могут быть изменены пользователем: • F: просмотр файла - переключиться в режим просмотра файла • G: просмотр галереи - переключиться в режим просмотра галереи • M: просмотр карты - переключиться в режим просмотра карты • 2: цикл 2 файла - поочерёдно показывать два последних файла • 3: цикл 3 файла - поочерёдно показывать три последних файла • A: текущий альбом - показать последний просмотренный альбом • T: ретушь - запустить функцию правки «Ретушь» • C: обрезка - запустить функцию правки «Обрезка» • K: сочетания клавиш - открыть диалог сочетаний клавиш • P: печать изображения - открыть диалог печати изображения • R: поворот - запустить функцию правки «Поворот» • U: отменить - отменить текущую правку или последнюю в серии • Shift+U: повторить - повторить текущую правку или следующую в серии • Ctrl+C: копировать в буфер обмена - скопировать текущий файл в буфер обмена • Shift+C: переключить подписи - поочерёдно показать/скрыть подписи • Ctrl+G: показать галерею папки для текущего файла • Shift+G: переключить сетку - включить/выключить линии сетки • Ctrl+S: сохранить - открыть диалог сохранения файла - - TOPIC: ФУНКЦИИ МЫШИ - ^Просмотр файла • щелчок левой кнопкой - увеличение: увеличить изображение с центром в положении мыши • щелчок правой кнопкой - если изображение увеличено: восстановить размер окна если нет, всплывающее меню часто используемых функций • колесо мыши - увеличить или уменьшить изображение • перетаскивание изображения левой кнопкой - панорамировать увеличенное изображение • Ctrl + мышь - мышь действует на изображение, а не на активный диалог - ^Просмотр галереи • щелчок левой кнопкой по миниатюре - переключиться в режим просмотра файла • щелчок правой кнопкой по миниатюре - показать всплывающее меню часто используемых функций • щелчок средней кнопкой по миниатюре - всплывающее большое изображение, увеличение колесом мыши • колесо мыши - прокрутка страницы галереи вверх или вниз - ^Просмотр карты • перетаскивание левой кнопкой - перетащить карту, следуя за мышью • колесо мыши - увеличить или уменьшить карту • щелчок левой кнопкой по маркеру - показать галерею изображений в этом месте • если активен диалог редактирования metadata, щелчок левой кнопкой задаёт геокоординаты - - TOPIC: ПАРАМЕТРЫ КОМАНДЫ Эти параметры можно использовать, если Fotocx запускается из терминала. -help показать руководство пользователя -home /folder альтернативное расположение домашней папки Fotocx (см. ниже) -lang xx задать язык по 2-символьному коду -recent показать галерею недавних файлов изображений -new показать галерею новейших файлов изображений -album albumname альбом (галерея) для открытия -prev показать последний просмотренный файл из предыдущего сеанса -blank показать пустое окно -dev показать обычно скрытое меню разработчика -menu manuname Fotocx запустится с этим активным меню -cwp nnn name циклическая смена обоев (см. ниже) -x0 -x1 -x2 задать уровень индексирования 0, 1 или 2 (см. ниже) - ^-x0 -x1 -x2 parameter^ (задать уровень индексирования при запуске) Эти параметры можно использовать, чтобы переопределить значение из {НАСТРОЙКИ} -x0 очень быстрый запуск, без индекса изображений -x1 быстрый запуск, индексирование только старых файлов -x2 старые файлы + поиск новых/изменённых файлов - ^-home^ parameter (альтернативная домашняя папка Fotocx) Домашняя папка Fotocx по умолчанию: /home//.fotocx. Здесь хранятся пользовательские настройки и индекс изображений. Команда "$ fotocx -home " использует указанную папку. Это позволяет управлять несколькими коллекциями изображений отдельно друг от друга. См. также {ПЕРЕНОС ДОМАШНЕЙ ПАПКИ FOTOCX}. - ^-cwp^ parameter (циклическая смена обоев рабочего стола) Полная командная строка: $ fotocx -cwp secs container Используйте эту команду для циклической смены изображения рабочего стола из выбранного набора. 'secs' - интервал между изображениями. 'container' - это либо название альбома Fotocx, либо папка, содержащая файлы изображений. Добавьте эту команду в список автозапуска при входе в систему, чтобы получать новые обои через заданные интервалы. Используйте интервал в один день или более, чтобы получать новые обои при каждом входе в систему. Fotocx работает в фоновом режиме без графического интерфейса. Если 'secs' равно нулю, будет выполнено одно обновление обоев, после чего Fotocx завершит работу. У каждой разновидности Linux своя команда. Теоретически поддерживаются: Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: МЕНЮ ФАЙЛА - - TOPIC: НОВЫЙ СЕАНС Запустить новый сеанс Fotocx в новом окне. Если файл изображения редактируется в обоих окнах, ни один экземпляр не увидит изменений, сделанных другим, и итоговым результатом будет последний сохранённый файл. - - TOPIC: ОТКРЫТЬ ФАЙЛ ИЗОБРАЖЕНИЯ Выбрать файл изображения для просмотра или редактирования с помощью обычного диалога открытия файла с папками и списками файлов. Это полезно в случае, когда файлы не проиндексированы и отображение галереи очень медленное, например, при чтении с SD-карты камеры, содержащей тысячи файлов изображений. - - TOPIC: ЦИКЛ 2 ФАЙЛА Повторное использование этого пункта меню будет поочерёдно переключать между двумя последними открытыми файлами. Эта функция сохраняет текущий размер и положение zoom изображения, что идеально подходит для быстрого сравнения двух отредактированных версий одного и того же файла изображения. - - TOPIC: ЦИКЛ 3 ФАЙЛА Работает так же, как «Цикл 2 файла», но поочерёдно переключает последние 3 открытых файла. - - TOPIC: ПРОСМОТР 360° ПАНОРАМЫ Текущий файл открывается в специальном просмотрщике для файлов панорамы 360°. Предполагается, что ширина изображения соответствует 360°. Используйте эту функцию для просмотра изображений Google «photosphere». Панорамируйте изображение перетаскиванием мыши или клавишами стрелка влево/вправо. Увеличивайте/уменьшайте щелчком левой/правой кнопкой мыши. Используйте Escape для выхода из специального просмотрщика. - - TOPIC: ПЕРЕИМЕНОВАТЬ Переименовать текущий файл (режим просмотра файла) или файл выбранной миниатюры (режим просмотра галереи). Введите новое имя и нажмите [применить]. Эта функция также может автоматизировать процесс переименования серии файлов изображений с использованием базового имени и порядкового номера. Откройте первый файл изображения в серии, введите новое имя и нажмите кнопку [применить]. Используйте кнопку [next], чтобы перейти к следующему файлу при необходимости. Вы можете использовать то же имя снова, нажав кнопку [предыдущее имя], а затем добавить суффикс или порядковый номер. Нажмите кнопку [add 1], чтобы увеличить порядковый номер. - - TOPIC: ПУСТОЕ ИЗОБРАЖЕНИЕ Создать пустое изображение с заданными размерами в пикселях и цветом. Его можно использовать как фон для вырезок из других изображений (через {ВЫБОР ОБЛАСТИ}) и текста аннотаций (через рисование текста в {РАЗМЕТКА}). - - TOPIC: КОПИРОВАНИЕ/ПЕРЕМЕЩЕНИЕ Текущий файл (режим просмотра файла) или файл выбранной миниатюры (режим просмотра галереи) копируется в указанное место. Выберите опцию копирования, чтобы скопировать файл, оставив исходный файл на месте, создав дубликат. Выберите опцию перемещения, чтобы переместить файл из исходного места в новое. Группу файлов можно быстро обработать, щёлкая по каждой миниатюре и затем нажимая [применить]. Кнопка [Пред.] может использоваться для копирования ранее использованного имени файла. Добавьте номер версии или что-то ещё, чтобы избежать дублирования файла. - - TOPIC: КОПИРОВАТЬ НА РАБОЧИЙ СТОЛ Текущий файл (режим просмотра файла) или файл выбранной миниатюры (режим просмотра галереи) копируется в папку рабочего стола (/home//Desktop). - - TOPIC: КОПИРОВАТЬ В БУФЕР ОБМЕНА Текущий файл (режим просмотра файла) или файл выбранной миниатюры (режим просмотра галереи) копируется в буфер обмена, откуда его могут вставить другие приложения. - - TOPIC: УДАЛИТЬ/В КОРЗИНУ Текущий файл (режим просмотра файла) или файл выбранной миниатюры (режим просмотра галереи) удаляется или перемещается в корзину, в зависимости от выбранной опции. Fotocx использует стандартное расположение корзины (~/.local/share/Trash). - - TOPIC: УСТАНОВИТЬ ОБОИ Обои рабочего стола устанавливаются из текущего файла изображения. - - TOPIC: ПЕЧАТЬ ИЗОБРАЖЕНИЯ Меню печати изображения открывает стандартный диалог настройки страницы, где вы можете выбрать принтер, размер бумаги и ориентацию. После нажатия кнопки [применить] открывается ещё один диалог для ввода полей страницы и масштаба изображения. - Если у изображения есть выбранные области, вас спросят, следует ли печатать только эти области. Они будут напечатаны с использованием минимального прямоугольника, необходимого для охвата областей, а области вне выделений напечатаны не будут. - - TOPIC: ПЕЧАТЬ С КАЛИБРОВКОЙ Эта функция работает так же, как описанная выше печать файла изображения, но перед печатью вас попросят указать файл калибровки, который используется для настройки цветов изображения перед печатью. Цель - компенсировать цветовые сдвиги, вызванные принтером и типом бумаги. - - TOPIC: КАЛИБРОВКА ПРИНТЕРА +image: printer-calibrate-chart.png +image: calibrate-printer.png - Эта утилита может помочь улучшить точность цветопередачи печатаемых изображений. - ^Как это работает На целевом принтере печатается цветовая таблица. Некоторые из напечатанных цветов будут слегка неточными из-за несовершенства принтера. Эта напечатанная страница сканируется в файл, и цвета в этом файле сравниваются с исходными цветами, которые были напечатаны. Любые различия - это теперь известные ошибки (при условии, что ваш сканер точнее вашего принтера - как правило, это так). При печати файла изображения эти ошибки вычитаются из цветов изображения перед печатью. Принтер добавляет ошибки обратно, оставляя результат, который теоретически верен. Мой собственный тест показал скромное улучшение, подробности ниже. - Выполните следующие шаги по порядку, как указано в диалоговом окне. Все файлы находятся в папке /printer_color. • Создайте и напечатайте файл цветовой таблицы (printchart.png). Используйте бумагу большого размера, вертикальную ориентацию, без полей. • Отсканируйте напечатанную таблицу в файл PNG. Используйте разрешение 300 dpi или выше. • Отредактируйте изображение PNG, чтобы обрезать поля, оставленные сканером. Сохраните отредактированный файл изображения. • Обработайте отредактированный файл изображения, чтобы создать файл цветовой карты. - Теперь вы можете печатать, используя меню {ПЕЧАТЬ С КАЛИБРОВКОЙ}, которое запросит имя файла цветовой карты для используемого принтера и бумаги. - Сканеры могут слегка исказить отсканированное изображение в неправильную, не прямоугольную форму. Если это произойдёт, вы заметите это при попытке обрезать поля: толстые зелёные линии полей не будут точно совпадать с прямоугольником обрезки. Если это произошло, сначала используйте {ПЕРСПЕКТИВА}, чтобы выровнять изображение, а затем обрежьте поля. - При редактировании отсканированного изображения таблицы убедитесь, что самый тёмный ряд находится сверху. Обрежьте поля вокруг цветовых плиток. Используйте толстую зелёную линию поля, окружающую цветовые плитки, в качестве ориентира: обрежьте точно по этой линии, оставив только плитки. Работайте с 2-кратным увеличением при настройке прямоугольника обрезки. Точность обрезки важна. Если обрезка неточная, вычисленные позиции плиток сместятся, и измеренные цвета могут оказаться неверными. Небольшая погрешность допустима. Вы можете использовать клавиши стрелок на клавиатуре для перемещений на 1 пиксель в прямоугольнике обрезки. Клавиши стрелок будут перемещать тот угол, который последним был перетащен мышью. - Выходной файл цветовой карты можно использовать только для того сочетания бумаги и принтера, которое использовалось при калибровке. Для любого другого сочетания требуется собственная калибровка и файл цветовой карты. - ^Результаты^ (мой принтер Canon) +image: printer-calibrate.jpg +image: printer-cal-study.png - Таблица выше - это фото трёх изображений: вверху слева: печать фото цветовой таблицы вверху справа: калиброванная печать того же фото внизу: сама цветовая таблица Поскольку все 3 изображения были сфотографированы вместе, ошибки от камеры одинаковы, что делает сравнение достоверным. - - TOPIC: МЕНЮ ГАЛЕРЕИ - - TOPIC: ОБЗОР ГАЛЕРЕИ +image: image-management.jpg - Галерея миниатюр может представлять папку файлов, результат поиска изображений, одну из встроенных галерей (недавние файлы, новейшие файлы) или альбом (упорядоченный список файлов изображений с заданным именем). Из практических соображений и соображений производительности папки должны быть ограничены несколькими тысячами файлов, но ограничение принудительно не устанавливается. - ^Прокрутка галереи Галерею можно прокручивать вверх и вниз с помощью клавиш стрелка вверх и вниз на клавиатуре, клавиш page-up и page-down, или с помощью полос прокрутки. Также можно использовать клавиши [home] и [end]. Щёлкните левой кнопкой и удерживайте на полосе прокрутки, и галерея быстро прокрутится к позиции щелчка. Щёлкните правой кнопкой и удерживайте на полосе прокрутки, чтобы галерея медленно прокручивалась к позиции щелчка. Продолжайте удерживать кнопку мыши и двигайтесь в сторону, чтобы увеличить скорость прокрутки. - - TOPIC: ТЕКСТУРА Файлы изображений в текущей галерее показаны в виде массива миниатюр. Используйте кнопку меню Zoom или клавиши [+] [-], чтобы изменить размер миниатюр. - - TOPIC: ПРОСМОТР METADATA Файлы изображений в текущей галерее показаны вместе с основными metadata, используемыми Fotocx. Если определены пользовательские индексируемые tags metadata, они показываются после стандартных tags. См. {ИНДЕКСИРОВАНИЕ ФАЙЛОВ}. - - TOPIC: НЕДАВНИЕ ФАЙЛЫ 1000 последних просмотренных файлов изображений показаны в галерее, из которой вы можете выбрать файлы для просмотра или редактирования. - - TOPIC: НОВЕЙШИЕ ФАЙЛЫ 1000 последних добавленных или изменённых файлов изображений показаны в галерее, из которой вы можете выбрать файлы для просмотра или редактирования. Вам предлагается выбор: использовать дату съёмки EXIF или дату изменения файла для определения новейших изображений. - - TOPIC: СОРТИРОВКА ГАЛЕРЕИ Выберите ключ сортировки и порядок по возрастанию или убыванию. Флажок «Сброс» сбрасывает все галереи к сортировке по имени файла по возрастанию. - Если сортируется галерея альбома, результат не заменяет альбом, а создаёт новый альбом с именем -sorted. - ^Имя/номер файла Это изменённая сортировка по имени файла. Если у нескольких файлов имена отличаются только встроенными числами в одной и той же позиции, эта группа файлов будет отсортирована в порядке встроенных чисел. Пример ниже иллюстрирует разницу: алфавитный порядок: xxx1xx xxx11xx xxx123xx xxx3xx числовой порядок: xxx1xx xxx3xx xxx11xx xxx123xx - ^Metadata из функции поиска Если галерея была создана с помощью опции «отчёт по metadata» функции {ПОИСК ИЗОБРАЖЕНИЙ}, и если вы добавили дополнительные tags metadata в стандартный отчёт, вы можете сортировать галерею по этим tags metadata. Вы можете сортировать галерею по производителю камеры, информации об объективе, значению ISO ... по любым доступным metadata. - - TOPIC: ФИЛЬТР ГАЛЕРЕИ Выберите подмножество текущей галереи, чтобы создать альбом с именем «gallery_filter», содержащий выбранные файлы изображений. ^Варианты выбора: • все файлы: выбрать все файлы изображений • оригиналы: исходные файлы (без номера версии) • версии: файлы с версиями (были отредактированы) • последние версии: последние версии (или оригиналы, если версий нет) • диапазон рейтинга: файлы с рейтингом в заданном диапазоне • имена keywords: файлы, имеющие любые из указанных keywords (через запятую) • текст имени файла: файлы с любыми из указанных текстовых строк (через запятую) - - TOPIC: ГЛАВНАЯ ГАЛЕРЕЯ TOPIC: КОНЕЦ ГАЛЕРЕИ Перейти к первой или последней миниатюре в текущей галерее. - - TOPIC: ПАПКА ТЕКУЩЕГО ФАЙЛА Задать текущую галерею из текущего файла изображения. Это удобно, если вы хотите вернуться к галерее текущего файла после других действий. - - TOPIC: НЕДАВНИЕ ПАПКИ Задать текущую галерею из недавно использованной галереи. Это позволяет легче переключаться между недавними галереями. - - TOPIC: ДЕРЕВО ПАПОК +image: folder-tree.png - Изначально показаны все ВЕРХНИЕ папки изображений. Щёлкните [+], чтобы развернуть подпапки, или [-], чтобы свернуть их обратно. Вы можете щёлкнуть по любой папке, чтобы получить галерею изображений в этой папке. Держите окно открытым, чтобы перемещаться в любое место вашей коллекции изображений. Эта функция также доступна с помощью кнопки [TOP] на верхней панели галереи. - - TOPIC: ВЫБОР ФАЙЛОВ Заранее выбрать файлы изображений для использования в качестве входных данных при создании альбомов или для функций массовой обработки. Эти функции будут использовать заранее выбранные файлы по умолчанию, но вы также можете изменить их или начать заново. См. процедуру {ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}. - - TOPIC: ЗАКЛАДКИ Просмотр существующих закладок. Закладки - это выбранные местоположения (имена папок/файлов) с именами, заданными пользователем. Щёлкните по закладке, чтобы показать галерею миниатюр, начиная с этого местоположения. Выберите [Редактировать закладки], чтобы добавить, удалить или переименовать закладку. - - TOPIC: РЕДАКТИРОВАТЬ ЗАКЛАДКИ После запуска «Редактировать закладки» щёлкните по миниатюре галереи, чтобы добавить это местоположение в список закладок. Присвоенным именем закладки изначально будет имя файла миниатюры. Вы можете отредактировать имя. Если вы выберете существующую закладку щелчком мыши, её имя отобразится в поле ввода. Вы можете изменить имя или нажать [удалить], чтобы удалить закладку. Новые закладки вставляются после последнего выбранного местоположения закладки. Чтобы изменить порядок, отредактируйте файл «bookmarks» в домашней папке Fotocx. - - TOPIC: MAPS MENU - - TOPIC: КАРТА МИРА +image: map-click.jpg - Это интернет-карта мира, масштаб которой можно менять (увеличивать и уменьшать) от уровня улиц до уровня континента. Используйте колесо мыши для увеличения/уменьшения карты. Перетаскивайте карту, чтобы изменить центр. На карте есть маркеры (красные точки), соответствующие изображениям, имеющим геокоординаты в своих metadata. Щёлкните по маркеру, чтобы получить просмотр галереи изображений в этом местоположении. Выбираются изображения, расположенные в области маркера на карте. Эффективная область маркера масштабируется вместе с масштабом карты. Увеличьте масштаб, чтобы расширить область и, возможно, разделить один маркер на несколько близко расположенных маркеров. - - TOPIC: ПОКАЗАТЬ НА КАРТЕ Показать положение текущего файла изображения на карте мира. Если несколько маркеров перекрываются, увеличьте масштаб, пока в центре не окажется единственный маркер. - - TOPIC: МЕНЮ АЛЬБОМОВ - - TOPIC: АЛЬБОМЫ Альбом - это произвольный набор изображений, собранный вручную из существующих изображений. Альбом - это список входящих в него файлов изображений. Сами файлы изображений не копируются и не изменяются. Один и тот же файл изображения может быть членом нескольких альбомов или присутствовать в альбоме более одного раза. Вы можете добавлять и удалять изображения в альбоме или изменять их порядок. После создания альбома вы можете выбрать его по имени, и он отобразится в виде галереи. - - TOPIC: СОЗДАТЬ АЛЬБОМ Введите имя для нового альбома. Вы можете создать пустой альбом, альбом с заранее выбранными файлами изображений из {ВЫБОР ФАЙЛОВ}, альбом с изображениями из текущей галереи, либо выбрать начальные изображения для альбома. - - TOPIC: ПЕРЕИМЕНОВАТЬ АЛЬБОМ Выберите существующий альбом и введите новое имя. - - TOPIC: УДАЛИТЬ АЛЬБОМ Выберите существующий альбом и удалите его безвозвратно. - - TOPIC: ВЫБОР АЛЬБОМА Отображается список доступных альбомов. Выберите из списка. - - TOPIC: ТЕКУЩИЙ АЛЬБОМ Задать галерею из текущего (последнего использованного) альбома. - - TOPIC: ГАЛЕРЕЯ В АЛЬБОМ Сохранить текущую галерею как альбом. Выберите имя существующего альбома [Обзор] или введите новое имя. - - TOPIC: ИЗМЕНИТЬ АЛЬБОМ Щёлкните правой кнопкой по миниатюре альбома и выберите из всплывающего меню: • Добавить выбранные файлы сюда - ранее выбранные файлы добавляются сюда (щёлкните по левой/правой стороне миниатюры, чтобы добавить до/после миниатюры). • Добавить текущий файл (режим просмотра файла) сюда - работает так же. • Удалить из альбома - выбранный файл удаляется из альбома. - ^Перетаскивание Вы можете изменить порядок изображений в альбоме, перетаскивая миниатюры мышью. Перетаскивайте миниатюру, пока курсор мыши не изменится на маленькое изображение миниатюры. Продолжайте перетаскивать это изображение к позиции, куда его нужно вставить, и отпустите кнопку мыши. Расположите мышь примерно между миниатюрами, куда должно быть вставлено перетаскиваемое изображение. Если перетаскивание приближается к верхнему или нижнему краю окна, галерея прокрутится, чтобы показать больше изображений. Вы можете использовать два сеанса Fotocx, чтобы ускорить выбор или перемещение множества изображений. Перетаскивайте изображения из любой исходной галереи на целевую позицию в альбоме. - Если вы переименуете или переместите файл с помощью Fotocx, все ссылки альбомов обновляются, и файл остаётся в альбомах, содержащих его. Если вы сделаете это вне Fotocx, ссылки альбома теряются, и файл исчезает из альбома. - Если файлы изображений переименовываются или перемещаются с помощью «Массового преобразования» или «Массового копирования/перемещения», обязательно выберите опцию замены файлов альбома, если это нужно. Иначе вам придётся заменять их по одному. - Не переименовывайте папки, если они содержат изображения, входящие в альбомы. Ссылки альбома будут потеряны. Вместо этого используйте «Массовое преобразование» или «Массовое копирование/перемещение», чтобы переместить файлы изображений в новую папку, затем удалите старую папку, если она пуста. Чтобы удалить файлы изображений, используйте «Массовое удаление/в корзину». Это также удалит удалённые файлы из альбомов. - - TOPIC: ОБНОВИТЬ АЛЬБОМЫ +image: album-replace-file.png - Заменить указанные файлы альбома указанными заменами или добавить указанные новые файлы после указанных существующих файлов. Выберите один или несколько альбомов для обработки. В режиме просмотра галереи щёлкните по двум миниатюрам, чтобы указать «старый файл» и «новый файл» в диалоге выше. Выберите опцию: «новый файл» заменяет «старый файл» везде, где он найден, либо «новый файл» добавляется в альбомы после «старого файла». Нажмите [proceed], чтобы обработать альбомы. После обработки диалог повторяется с теми же выбранными альбомами и той же опцией «заменить или добавить». Вы можете выбрать ещё два файла и нажать [proceed]. - - TOPIC: МАССОВОЕ ОБНОВЛЕНИЕ АЛЬБОМА +image: album-mass-update.png - Это утилита для массовых обновлений, которая может понадобиться после создания новых версий для многих файлов изображений и необходимости обновить один или несколько альбомов до новых версий. Она не покрывает все случаи, что, вероятно, невозможно, но, надеюсь, уменьшит необходимость изменять файлы по одному. - Выберите один или несколько альбомов, затем выберите один из вариантов обработки: • Заменить всё только новейшей версией: альбомы обновляются так, чтобы содержать только новейшие версии файлов. • Заменить все версии новейшей версией: все версии файлов заменяются только новейшей версией. Исходный файл, если он присутствует, НЕ заменяется. • Добавить новейшие версии к существующим версиям: новейшая версия добавляется к существующим версиям, если она отсутствует. • Заменить всё оригиналом и всеми версиями: все файлы заменяются исходным файлом и всеми версиями. • Заменить всё оригиналом и новейшей версией: все файлы заменяются исходным файлом и новейшей версией. • Заменить всё выбранными версиями (*): все файлы заменяются только выбранными версиями. Это включает исходный файл (без версии). • Заменить все версии выбранными версиями (*): все версии файлов заменяются только выбранными версиями. Исходный файл, если он присутствует, НЕ заменяется. • Добавить выбранные версии к существующим версиям (*): выбранная версия добавляется к существующим версиям, если она отсутствует. • Заменить всё оригиналом и выбранными версиями (*): все файлы заменяются исходными файлами и выбранными версиями. - (*) Четыре опции, использующие выбранные файлы: список выбранных файлов берётся из функции {ВЫБОР ФАЙЛОВ}. Файлы альбома, не соответствующие ни одному из выбранных файлов, остаются в альбоме без изменений. Изменяются только файлы, соответствующие выбранному файлу, согласно указанным выше правилам. Соответствие определяется по имени файла без версии или расширения: 'asdfg.png' и 'asdfg.v01.jpg' считаются совпадением. - Пример: «Заменить все версии выбранными версиями»: если в альбоме есть filename.jpg и filename.v02.png, а в списке выбранных файлов есть filename.v04.jpg, результатом в обновлённом альбоме будет: filename.jpg и filename.v04.jpg - - TOPIC: СЛАЙД-ШОУ +image: slide-show.jpg - ^Дробное масштабирование монитора На некоторых системах дробное масштабирование вызывает проблемы с производительностью анимации слайд-шоу Fotocx. Отключите это и используйте другие способы увеличения размера шрифта для приложений, если нужно. Для Fotocx размер шрифта задаётся в меню {НАСТРОЙКИ}. - В диалоге слайд-шоу (вверху слева) нажмите [Выбрать альбом] и выберите альбом из предложенного списка. Измените остальные настройки в диалоге по желанию, затем нажмите кнопку [Порядок наложения], чтобы начать слайд-шоу с первого изображения в альбоме, или [Продолжить], чтобы возобновить приостановленное слайд-шоу, либо выберите другое изображение, щёлкнув по его миниатюре. Используйте клавишу Escape, чтобы выйти из слайд-шоу и вернуться в диалог. - Основные элементы управления диалога • Время подписи: секунды показа заголовка и описания. • Время изображения: секунды показа только изображения. • Предел отсечения %: обрезать изображения на эту величину, чтобы убрать поля. • Полный экран: если отмечено, изображения показываются на весь экран без меню и т. д. • Автовоспроизведение: если отмечено, слайд-шоу начнётся заново после окончания. • Случайное изображение: если отмечено, использовать случайный порядок изображений. Иначе - порядок альбома. - Для управления слайд-шоу можно использовать клавиши клавиатуры. Нажмите [клавиатура] для просмотра. - Следующие клавиши закреплены за действиями и не могут быть изменены: • Escape: прервать слайд-шоу и вернуться в основной диалог. • Клавиши стрелка влево/вправо: вы можете в любой момент перемещаться назад и вперёд, и слайд-шоу продолжится оттуда. - Анимированные переходы между изображениями, а также время показа и поведение zoom отдельных изображений можно настроить с помощью диалогов, описанных ниже. - Нажмите [переходы], чтобы открыть диалог выбора и настройки переходов между изображениями. Они включают множество анимированных способов замены изображения (например, новое изображение расширяется из центра, заменяя старое). Выберите переходы для использования и то, используются ли они случайно или по порядку. Параметр времени задаёт длительность перехода. Параметры предпочтения задают относительное предпочтение, которое будет влиять на то, как часто переход используется при выборе случайного порядка. - Кнопки [загрузить] и [сохранить] позволяют сохранить настройки переходов в файл и позже загрузить их. Эти файлы не зависят от файлов слайд-шоу. Слайд-шоу по умолчанию будет использовать настройки переходов, последними использованные для этого слайд-шоу (имени альбома), но вы всегда можете заменить их, используя кнопку [загрузить] для загрузки других настроек, или изменить их в диалоге. - Нажмите [файлы изображений], чтобы открыть диалог настроек изображений (вверху справа). Они необязательны. Изображение выбирается для настройки щелчком по его миниатюре в отображении альбома/галереи. Диалог заполняется настройками по умолчанию или предыдущими настройками для этого изображения в этом слайд-шоу. Внесите изменения и нажмите [done], либо щёлкните по следующему изображению для настройки. - Настройка: если выбрана случайная последовательность изображений, это число задаёт относительное предпочтение для изображения. Нейтральное значение - 10. Введите новое значение, чтобы увеличить или уменьшить вероятность выбора этого файла в случайной последовательности изображений, например значение 20 сделает вероятность в 2 раза выше. Значение ноль предотвратит показ изображения. Изображение также блокируется на количество показов, равное 1/3 от числа изображений в альбоме, или 10, в зависимости от того, что меньше. - Диалог показывает настраиваемые события изображения в порядке времени: • подождать указанное время (может быть ноль). • показать следующие текстовые tags параллельно: имя изображения (базовое имя файла) на указанное время, заголовок изображения, если есть, на указанное время, описание изображения, если есть, на указанное время. • подождать указанное время перед началом zoom изображения (может быть ноль). • увеличить изображение от обычного размера до увеличенного или наоборот, за указанное время. Если не выбрана ни одна из опций, zoom не выполняется. • увеличение: начать с обычного размера, увеличивать изображение, перемещая центр zoom к указанной позиции. • уменьшение: начать с увеличенного размера при указанном центре zoom, уменьшать изображение обратно до обычного размера. • [zoom center] - нажмите эту кнопку, затем щёлкните по миниатюре изображения, чтобы указать центр zoom для изображения. • подождать указанное время после zoom (может быть ноль) (значение по умолчанию - настройка «время изображения» основного диалога). • переход к следующему изображению с использованием указанного перехода или значения 'next' для отсутствия предпочтения (выбирается случайно). - - TOPIC: ПОЛЬЗОВАТЕЛЬСКОЕ МЕНЮ +image: custom-menu.png - Это позволяет вам собрать часто используемые функции из нескольких меню в одно пользовательское меню. Вы также можете добавить пункты для открытия конкретных файлов изображений или альбомов. Меню также включает функции сценариев и плагинов (см. ниже). - Последний пункт меню, «Редактировать меню», открывает текстовый редактор для редактирования самого списка меню. Названия меню должны точно совпадать с названиями в меню Fotocx, но регистр не имеет значения. - Пункты меню могут иметь следующие форматы: • # текст комментария: комментарий, который ничего не делает • menuname # popup tip: название меню Fotocx и необязательная всплывающая подсказка • file : открыть указанный файл • album : открыть указанный альбом как галерею - Следующие пункты присутствуют по умолчанию, и их не следует изменять или удалять: «Редактировать сценарий», «Запустить сценарий», «Массовый сценарий», «Плагины», «Редактировать меню». Подробности объясняются ниже. - - TOPIC: ФАЙЛЫ СЦЕНАРИЯ Функции меню: • Редактировать сценарий - выполнить набор правок над одним файлом изображения, записывая все функции и настройки в именованный файл сценария. • Запустить сценарий - выполнить файл сценария на текущем файле изображения, как функцию правки. • Массовый сценарий - выбрать любое количество файлов изображений и выполнить файл сценария на всех них в режиме массовой обработки. - Файлы сценариев позволяют вам один раз определить набор правок и повторять их для одного или нескольких файлов изображений позже. - ^Функции правки, доступные для сценариев Некоторые функции правки используют перетаскивание мышью по изображению, например все функции искажения. Они не поддерживают сценарии, поскольку перетаскивания мышью не записываются. Использование этих функций заблокировано. - В настоящее время доступны для сценариев следующие функции: • Правка: ретушь, поля, цветовой режим, заливка области • Восстановление: резкость, обычное размытие, плавное размытие, шумоподавление, удаление дымки, артефакты JPEG, сглаживание, настройка RGB • Улучшение: выравнивание гистограммы, локальный контраст, усиление контраста, глобальный retinex, локальный retinex, локальный контраст, насыщенность, мягкий фокус, градиент яркости • Эффекты: контуры, набросок, мультфильм, тиснение, плитки1, плитки2, живопись, текстура, узор, дизеринг, гравировка, установить цвета, сдвинуть цвета, пользовательское ядро - - TOPIC: РЕДАКТИРОВАТЬ СЦЕНАРИЙ В диалоге нажмите [начать]. Выберите имя файла для сценария. Начните редактировать текущий файл изображения. Используйте нужные функции правки в любом порядке. Каждая правка записывается в файл сценария вместе со всеми использованными настройками диалога. По завершении нажмите [close], чтобы закрыть файл сценария и сохранить его под указанным именем. - - TOPIC: ЗАПУСТИТЬ СЦЕНАРИЙ Выберите один из ваших сохранённых файлов сценариев из всплывающего меню. Сценарий выполняется с использованием текущего файла изображения, как обычная функция правки. - - TOPIC: МАССОВЫЙ СЦЕНАРИЙ В диалоге нажмите [Выбрать файлы]. Выберите файлы для редактирования с помощью стандартного диалога выбора файлов {ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}. По завершении нажмите [Выбрать сценарий]. Выберите файл сценария из всплывающего меню. Теперь сценарий выполняется на всех выбранных файлах. Все изменённые изображения сохраняются как новые версии. Если обрабатываются файлы RAW, соответствующие выходные файлы - это TIFF-16. - - TOPIC: ПЛАГИНЫ +image: plugins.png - Функции плагинов - это способ использовать другие редакторы изображений внутри Fotocx, например Gimp. Вы можете использовать редактор RAW-изображений, например Rawtherapee, а затем выполнить дополнительные правки с помощью Fotocx. - ^Порядок использования: • Откройте файл для обработки в Fotocx • Запустите меню плагинов и выберите нужную программу, например Gimp • Программа плагина запускается и открывает файл, переданный из Fotocx • Выполните нужные правки с помощью программы плагина • По завершении сохраните выходной файл с тем же именем, что и входной файл. Расширение файла .ext может измениться. • Закройте программу плагина. • Fotocx открывает выходной файл плагина как отредактированную версию текущего файла. • Выполните дополнительные правки или сохраните отредактированный файл как новую версию или новый файл. - Пример меню плагинов показан слева. Последний пункт «Редактировать плагины» запускает приложение редактирования текста справа. Используйте текстовый редактор, чтобы задать названия пунктов меню плагинов и команды для запуска соответствующих программ плагинов. Формат следующий: menuname = plugin-command %s TIP = explanation of above command 'plugin-command' - это команда оболочки для функции плагина, а '%s' - это место, куда подставляется имя текущего файла. Не ставьте кавычки вокруг '%s', поскольку они добавляются автоматически, что позволяет обрабатывать имена файлов с пробелами или другими специальными символами. Показанный выше пример - это меню с именем "Gimp", которое запускает команду "gimp %s". Текст TIP необязателен. Если он присутствует, он находится на строке после названия меню. При наведении мыши на пункт меню этот текст будет показан рядом с текстом меню. - Некоторые команды могут ожидать указания как входного, так и выходного файла. В этом случае укажите '%s' в обеих позициях. Опустите '%s', если команда не обрабатывает файл изображения. - ^Выбор области Если у входного файла есть выбранная область, будет изменена только эта область. Функция плагина редактирует всё изображение, но при обработке результата в Fotocx сохраняются только изменения в выбранной области. - - TOPIC: ZOOM - ^Кнопка Zoom Щёлкните левой или правой кнопкой по кнопке, чтобы увеличить или уменьшить размер изображения в {ПРОСМОТР ФАЙЛА} или размер миниатюр в {ПРОСМОТР ГАЛЕРЕИ}. Это применимо, только если режим просмотра галереи - {ТЕКСТУРА}. При {ПРОСМОТР METADATA} ничего не происходит. - - TOPIC: ПРЕДЫД./СЛЕД. - Щёлкните левой или правой кнопкой по кнопке, чтобы открыть предыдущий или следующий файл в текущей галерее. Вы также можете использовать клавиши стрелка влево/вправо. - - TOPIC: СОХРАНЕНИЕ ФАЙЛА - +image: file-save.png - +image: file-save-as.jpg - В первом диалоге выберите «новая версия», «новый файл» или «заменить файл». - ^Новая версия Сохранить текущий файл изображения с новым номером версии. Имена файлов с номерами версий имеют формат "filename.vNN.ext", где NN - число от 01 до 99. Если у файла нет версий, будет создана версия .v01. Если версии файла уже присутствуют на диске, используется следующий больший номер версии. Если файл - JPEG, используется качество по умолчанию - см. {НАСТРОЙКИ}. - ^Новый файл Откроется второй показанный выше диалог для сохранения текущего изображения в выбранный файл, которым может быть исходный файл, другой существующий файл или новый файл. Файл можно сохранить в форматах JPEG, PNG, JXL и TIFF. - Для JPEG вы можете выбрать значение качества в диапазоне 1-100. Более низкие значения дают меньшие файлы и худшее качество изображения. Значения выше 70 трудно отличить от 100 (наивысшее качество, наибольший размер файла). Используется качество JPEG по умолчанию, если вы не измените значение в диалоге. Значение по умолчанию берётся из {НАСТРОЙКИ}. Вы не сможете увидеть разницу между файлом, сохранённым с качеством 70, и файлом с качеством 100, но разница в размере файла огромна. Прозрачные области будут чёрными. JPEG не поддерживает прозрачность. - Файлы PNG и TIFF сжимаются без потери качества и намного больше, чем JPEG. Их можно сохранять с глубиной 8 или 16 бит на цвет. - Если отмечено «сделать текущим», сохранённый файл (с новым именем файла) станет текущим файлом. - ^Заменить файл Сохранить текущий файл изображения обратно в него самого. - ^Права доступа^ копируются из входного файла. Нажмите кнопку [Изменить], чтобы отредактировать права доступа. - - TOPIC: МЕНЮ METADATA - - Metadata - это текстовые данные, хранящиеся внутри файла изображения. Цифровые камеры автоматически создают некоторые metadata, такие как дата и время, технические данные о камере и параметрах съёмки, а также данные о местоположении (если камера оснащена приёмником GPS). Другие данные могут быть добавлены пользователем, например заголовок, описание, рейтинг, keywords. Fotocx может искать в вашей коллекции изображений по любым metadata, а также по именам папок и файлов или их частям, создавая галерею соответствующих изображений. В большинстве случаев поиск выполняется практически мгновенно. - - TOPIC: ПРОСМОТР ОСНОВНЫХ META TOPIC: ПРОСМОТР ВСЕХ META +image: view-metadata.jpg - Функция «Просмотр основных Meta» отображает часто используемые metadata текущего файла изображения. Это включает дату и время съёмки, выдержку, фокусное расстояние, размер изображения, ISO и т. д. Цифровые камеры сохраняют эти данные в изображении. Metadata также могут содержать данные, добавленные пользователем: keywords, заголовок или подпись, описание, комментарии, добавленные фотографом или позднейшим редактором (иногда встречаются в опубликованных изображениях). - Если изображение отредактировано, запись о правке сохраняется в metadata. «Просмотр основных Meta» показывает историю выполненных правок. - «Просмотр всех Meta» показывает все доступные metadata и может включать более 100 пунктов, которые вам, скорее всего, не важны. - Кнопка [Extras] в окне «Просмотр основных Meta» открывает диалог, показанный справа, где вы можете добавить дополнительные tags в отчёт. Любой tag, доступный в отчёте «Просмотр всех Meta», можно добавить в краткий отчёт. Щёлкните по tag в левом столбце, чтобы добавить его в правый столбец и в отчёт. Щёлкните по tag в правом столбце, чтобы удалить его. Щёлкните по пункту "Other Tag ...", чтобы ввести имя любого tag, не входящего в список по умолчанию, который ограничен наиболее вероятно нужными tags. - Fotocx использует следующие tags metadata для редактирования и поиска изображений: • Заголовок - краткий заголовок изображения • Описание - описание изображения • Дата/время съёмки - дата/время фотографии • Рейтинг - от 0 до 5 звёзд • Страна - из GPS камеры или добавлена вручную • Местоположение - в EXIF называется city (город) • Geotags - latitude/longitude • Keywords - идентификаторы изображения от пользователя • Данные камеры - производитель, модель, объектив • Данные экспозиции - время, диафрагма (F-число), фокусное расстояние, ISO Эти tags редактируются с помощью функции {РЕДАКТИРОВАТЬ ОСНОВНЫЕ META}. Любые другие tags также можно редактировать и искать по ним, используя менее удобные методы, описанные ниже. - Также есть несколько функций массовой обработки для добавления данных сразу во многие файлы изображений. См. {МЕНЮ МАССОВЫХ ОПЕРАЦИЙ}. - - TOPIC: ОБЗОР KEYWORDS Файлы изображений могут иметь идентификационные или классификационные keywords. Их можно использовать для поиска в большой коллекции изображений тех, которые имеют нужные keywords. Типичные keywords: тема, событие, местоположение, люди или предметы и т. д. Keywords хранятся внутри metadata изображения. Обычно keyword - это одно слово, но можно использовать и короткую фразу со встроенными пробелами или другими разделителями. Запятые и точки с запятой используются как разделители между keywords, и поэтому не могут использоваться внутри keyword (это внешний стандарт). Составной keyword, например "arizona scenery", допустим, но для большей гибкости лучше использовать два отдельных keyword: тогда вы сможете искать изображения, имеющие любой из этих keyword или оба сразу. - Все изображения с нужным keyword или keywords можно быстро найти и отобразить в окне галереи. Если вы осмысленно использовали имена папок и файлов, вы также можете искать изображения по этим именам. Вы также можете искать изображения по дате, рейтингу, местоположению и другим tags metadata. Их не обязательно дублировать в keywords. См. {ПОИСК ИЗОБРАЖЕНИЙ} ниже. - ^Система управляемых keywords Это подходит, если вы хотите спланировать свою систему keywords перед добавлением keywords к изображениям. В этой системе вы создаёте ограниченное количество категорий keywords (например, люди, места, предметы, события, искусство, пейзажи ...). Keywords можно создавать и назначать категории по мере необходимости при присвоении keywords изображениям. Изображению присваивается keyword путём указания и щелчка по списку доступных keywords, который организован по категориям и в алфавитном порядке внутри категории. Если нужен новый keyword, он создаётся при первом присвоении изображению. Количество keywords внутри категории в идеале должно быть меньше примерно 200, чтобы визуальный поиск в списке выбора был достаточно быстрым. - ^Преимущества системы управляемых keywords • предотвращает несогласованные имена keywords (например, 'landscape' и 'scenery') • предотвращает альтернативные написания и опечатки (например, susan, susy, susna) • предотвращает keywords, включающие другие keywords (например, scenery, lake) • поиск более надёжен, поскольку keywords не содержат указанных выше ошибок • при назначении keywords у вас есть обзор доступных keywords, а не тысячи хаотичных keywords в неуправляемой системе - Выбор keywords из большого списка может быть медленным. Это смягчается тремя способами: • До примерно 10 последних использованных keywords показываются в диалоге редактирования metadata, где их легко увидеть и выбрать. Поскольку серия фото, сделанных в одно время, вероятно, будет иметь много общих keywords, добавление keywords становится легче и быстрее. • Вы можете просто начать вводить нужное имя keyword. Всплывающий список подходящих keywords появляется, как только остаётся всего несколько возможных совпадений. Затем вы можете щёлкнуть по нужному keyword, чтобы добавить его к изображению. Если подходящих keywords нет, у вас есть возможность добавить новый keyword в список определённых keywords. • Вы можете выбрать категорию, чтобы отобразить меньший список выбора. - Если keywords определены широко и их меньше по количеству, результаты поиска по keywords будут больше, но визуально найти нужные изображения можно довольно быстро. Физический порядок файлов сохраняется: файлы изображений, расположенные вместе в своих папках, также будут показаны вместе в результатах поиска. - Изображения, загруженные из интернета, часто содержат keywords. У них, конечно, нет никакой организации, и в совокупности они хаотичны. Если вы используете систему управляемых keywords, лучше всего просматривать такие изображения и приводить keywords в соответствие с вашей системой или удалять их. Любые новые keywords будут автоматически добавлены в категорию "nocatg". Если вы заметите нежелательные keywords в своём списке keywords, используйте {ПОИСК ИЗОБРАЖЕНИЙ} по keyword, чтобы найти изображения с нежелательными keywords и исправить или удалить их. - ^Случайная система keywords Вы можете предпочесть придумывать keywords по мере необходимости без какой-либо конкретной системы. Или у вас уже может быть тысячи keywords, что затрудняет переход на систему управляемых keywords (но не делает его невозможным: Fotocx может выполнить массовое преобразование имён keywords). В этом случае вы можете просто вводить keywords в свои изображения, создавая новые keywords по мере необходимости. Некоторая возможность поддерживать порядок в keywords всё же остаётся: существующие keywords, соответствующие введённым вами символам, показываются, как только остаётся всего несколько возможных совпадений. Пример: вы вводите "new" и показывается список keywords: New York, New Delhi, Newman ... Если один из них соответствует вашему намерению, щёлкните по нему, чтобы выбрать keyword. Если нет, продолжайте вводить и в конце концов нажмите Enter, чтобы создать новый keyword. При поиске изображений по keywords вы можете вводить нужные имена keywords или выбирать их из списка доступных keywords. Показываются доступные keywords, соответствующие первым нескольким введённым буквам, и вы можете выбрать из этого списка. Вы не можете ввести поисковый keyword, которого нигде нет в ваших изображениях. Случайная система keywords, скорее всего, приведёт к появлению тысяч keywords. Это может оказаться не очень полезным. - - TOPIC: GEOTAGS OVERVIEW Современные камеры могут записывать местоположение каждого фото с помощью встроенного приёмника GPS. Latitude, longitude (а также, возможно, город/местоположение и страна) записываются в metadata EXIF файла изображения. Функция {РЕДАКТИРОВАТЬ ОСНОВНЫЕ META} также позволяет вводить или изменять данные о местоположении. Местоположения также можно указывать, щёлкая по масштабируемой карте мира. Функции для поиска изображений по указанному местоположению или региону: • {ПОИСК ИЗОБРАЖЕНИЙ}: поиск по названию местоположения (также несколько названий, частичные совпадения). • {МЕСТА/ДАТЫ}: поиск по группам страна, местоположение и дата • «Изображения по местоположению на карте»: щёлкните по маркеру карты, чтобы показать все изображения в этом месте. - Названия местоположений (город или другое название места, и страна) из GPS камеры не стандартизированы и могут быть хаотичными (например, Munich, München, MONACO). Как с этим справиться, рассказано ниже. - - TOPIC: РЕДАКТИРОВАТЬ ОСНОВНЫЕ META +image: edit-meta.jpg - Функция «Редактировать основные Meta» используется для добавления основных metadata к изображению. Пожалуйста, прочитайте {ОБЗОР KEYWORDS} и {GEOTAGS OVERVIEW} (выше) перед использованием «Редактировать основные Meta». - «Редактировать основные Meta» используется для редактирования наиболее часто используемых metadata: даты и времени изображения, рейтинга, заголовка, описания, данных о местоположении и keywords. Диалог изначально показывает данные для текущего изображения. После внесения добавлений или изменений нажмите [Применить], чтобы обновить файл изображения. Автоматическое создание версий файла для изменений metadata не выполняется, но при желании вы можете использовать «Сохранить файл» > «Новая версия». - Диалог показывает metadata для текущего изображения в режиме просмотра файла, либо для выбранной миниатюры в режиме просмотра галереи. Диалог редактирования обновляется при открытии нового изображения или щелчке по новой миниатюре. - Дата изображения, если доступна, показывается как «Дата изображения». Её можно ввести, если она отсутствует, или изменить. Вы можете ввести полную дату в формате yyyy:mm:dd или более короткий формат yyyy или yyyy:mm. Отсутствующий месяц/день логически эквивалентен 01:01 при сравнении с нижней границей поиска, или 12:31 при сравнении с верхней границей. Кнопка [Пред.] заполняет дату из ранее введённых данных. Это позволяет легко датировать серию изображений. Если важно время, вы можете добавить время в формате hh:mm[.ss]. Полный формат записи: yyyy:mm:dd hh:mm:ss - Вы можете ввести заголовок, описание и рейтинг (0-5 звёзд) для изображения. Чтобы отредактировать заголовок или описание, нажмите соответствующую кнопку [правка]. Откроется всплывающий текстовый редактор с большим лимитом размера текста. Вы можете использовать клавишу [enter] для намеренного разрыва строки. В Fotocx эти разрывы строк будут работать; в других просмотрщиках изображений они могут быть заменены точками. - Существующие keywords показаны в «Keywords изображения». Доступные keywords показаны в окне «Определённые Keywords» ниже. Один из этих keywords можно добавить к изображению, щёлкнув по нему. Keyword можно удалить из изображения, щёлкнув по нему в «Keywords изображения». Недавно добавленные keywords показаны в «Недавних Keywords». Это удобство облегчает добавление keywords к новой партии изображений, поскольку многие из тех же keywords будут использоваться снова. Указывайте и щёлкайте таким же образом. - Если список определённых keywords длинный, может быть проще ввести нужный keyword в «Введите keyword». Существующие keywords, соответствующие введённому на данный момент, появляются в «Соответствующих Keywords», и вы можете щёлкнуть по одному из них, чтобы добавить keyword к изображению. Если введённый keyword новый (не показано ни одного соответствующего keyword), нажмите [добавить новый keyword], когда keyword будет полностью введён. Он будет добавлен к изображению и в список определённых keywords с категорией "nocatg". - Если вы используете категории keywords, вы можете выбрать категорию, и в списке определённых keywords будут показаны только keywords этой категории. - Кнопка [Применить] записывает данные в файл изображения и в файл индекса metadata, используемый для поиска изображений. - Кнопка [Пред.] (внизу диалога) может использоваться для загрузки всех доступных данных из предыдущего просмотренного или отредактированного изображения. Это можно использовать для ускорения обработки группы изображений, имеющих много общих данных. - ^Добавление Geotags Есть несколько способов добавить названия местоположений и геокоординаты в диалоге {РЕДАКТИРОВАТЬ ОСНОВНЫЕ META}. - GPS камеры Датчик GPS вашей камеры мог вставить названия местоположений и геокоординаты. Язык может быть не тем, который вам нужен, либо могут использоваться заглавные буквы, либо какой-то другой хаос. Используйте кнопку [clear], чтобы начать заново, и введите новый текст. - Кнопка [Найти] Поиск местоположения, присутствующего где-либо в ваших файлах изображений или в огромном списке известных местоположений (worldcities.txt). Введите несколько первых символов в «Местоположение» и нажмите [Найти]. Если показан список выбора подходящих местоположений, выберите одно из них. Если ничего не показано, используйте [Карта], чтобы щёлкнуть по местоположению на карте. При необходимости измените названия местоположения и страны. Теперь это местоположение известно и доступно для выбора. - Кнопка [Предыдущий] Если у редактируемого изображения те же данные о местоположении, что и у предыдущего отредактированного изображения, нажмите [Предыдущий], чтобы заполнить ранее использованные данные о местоположении. - Вы можете использовать {МАССОВЫЕ GEOTAGS}, чтобы добавить данные о местоположении сразу во многие файлы изображений. - - TOPIC: РЕДАКТИРОВАТЬ ЛЮБЫЕ META +image: edit-any-metadata.png - Это диалог для редактирования любых metadata текущего файла изображения. Наиболее распространённые tags для редактирования перечислены слева. Нажмите кнопку [Полный список], чтобы получить список всех доступных tags для текущего файла изображения (их может быть несколько сотен). Нажмите [Сдвинуть/преобразовать цвета изображения в другие цвета], чтобы вернуться к списку распространённых tags. Щёлкните по tag в списке, чтобы получить текущее значение tag. При желании измените значение и нажмите [обновить]. Чтобы отредактировать имя tag, не входящее в список, введите имя tag и нажмите [получить], чтобы получить текущее значение, если оно есть. Затем введите или измените значение и нажмите [обновить]. Чтобы удалить tag, нажмите [удалить]. Вы можете вводить имя tag в нижнем регистре, с пробелами или без них, например "Subject Distance" и "subjectdistance" будут работать одинаково. Некоторые tags нельзя изменить, например 'image width' - это ширина изображения в пикселях, которую можно изменить только изменив ширину изображения в пикселях. Источником краткого списка является текстовый файл /meta_picklist. Вы можете добавлять или удалять tags из этого списка. - - TOPIC: УДАЛИТЬ META Укажите имя tag для удаления или выберите «Все». Metadata удаляются. Используйте «Все», чтобы очистить изображение от любой идентифицирующей информации, которая может присутствовать. Некоторые tags нельзя удалить, например «Имя файла». - - TOPIC: КОПИРОВАТЬ META Объединённые изображения, созданные с помощью Fotocx (HDR, панорама, монтаж ...), по умолчанию не будут содержать metadata. Используйте эту функцию, чтобы скопировать metadata из одного из исходных изображений или любого другого изображения. Используйте кнопки [Обзор], чтобы выбрать файл-источник metadata и файл-получатель metadata («целевой файл» в диалоге). - - TOPIC: ИСПРАВИТЬ META Используйте эту функцию, если у вас есть файл изображения, который выдаёт сообщение об ошибке при попытке отредактировать metadata. Она удалит повреждённые metadata и сохранит остальные. - - TOPIC: УПРАВЛЕНИЕ KEYWORDS +image: manage-keywords.png - Создавайте keywords и при желании группируйте их по категориям. Вы можете назначать категории keywords, чтобы помочь их организовать и быстрее находить при добавлении keywords к изображениям. Они необязательны и не играют роли при поиске по keywords: в изображении хранится только сам keyword, а не его категория. Типичные категории: люди, места, предметы, события, пейзажи, здания, искусство и т. д. Чтобы добавить новый keyword с новой категорией, введите категорию и keyword, затем щёлкните [create]. Если категория пуста, keyword будет назначен в "nocatg". Чтобы назначить keyword в другую категорию, щёлкните по категории (жирный текст) или введите новую, щёлкните по keyword и нажмите [create]. Keyword переместится из старой категории в новую. Чтобы удалить keyword, щёлкните по нему и нажмите [удалить]. Keywords, используемые в изображениях, но не назначенные в категорию, будут отображаться под "nocatg". Категорию без назначенных keywords можно удалить - щёлкните по категории, очистите имя keyword, если оно есть, нажмите [удалить]. - Примечание: недавно созданный keyword добавляется в конец списка keywords его категории. При следующем запуске Fotocx все категории и их списки keywords сортируются по алфавиту, за исключением того, что "nocatg" всегда идёт последней. - - TOPIC: ПОДПИСИ +image: choose-captions.png - ^Меню «Выбрать подписи» Выберите, какие tags metadata использовать для текстовых подписей, отображаемых в верхнем левом углу изображения в режиме просмотра файла. - ^Меню «Переключить подписи» Включить или выключить отображение подписей. Назначьте сочетание клавиш для быстрого включения или отключения отображения подписей. - ^Примечание:^ перемещение мыши в верхний левый угол изображения в режиме просмотра файла покажет заголовок и описание во всплывающем изображении. Изображение исчезает, когда мышь убирают. - - TOPIC: МЕСТА/ДАТЫ +image: image-locations.jpg - Это быстрый способ найти все фото, сделанные в заданном местоположении или в заданном местоположении и диапазоне дат. В диалоге выберите один из двух вариантов: включить все изображения в отчёт, либо включить только изображения, найденные предыдущей функцией поиска. Затем выберите нужный уровень группировки: страна страна и местоположение страна и дата страна, местоположение и дата дата и страна дата, страна и местоположение - Если включена дата, выберите диапазон дней для объединения: фото с датами в пределах диапазона будут сгруппированы вместе под первой датой. Нажмите [proceed], чтобы получить отчёт, показывающий количество изображений в каждой группе: по стране, по стране и местоположению и т. д. Это также порядок сортировки. В приведённом выше примере 28 фото сделаны в Новой Зеландии 02.11.2004. Щёлкните по строке в отчёте, чтобы получить галерею миниатюр этих изображений. - - TOPIC: ПЛИТКИ2 +image: timeline-report.jpg - Этот отчёт формирует хронологию количества изображений по месяцам. Выберите один из двух вариантов: включить все изображения в отчёт, либо включить только изображения, найденные предыдущей функцией поиска. Щёлкните по году и месяцу в получившемся отчёте, чтобы получить галерею миниатюр всех изображений с датой съёмки (EXIF) в выбранном месяце. В приведённом выше примере показано 208 изображений за октябрь 2017. Год 'null' предназначен для изображений без даты съёмки. - - TOPIC: TAGS METADATA Эта функция находит все файлы изображений, использующие указанный tag metadata и значение. Выберите tag из всплывающего списка: рейтинг, keywords, заголовок, описание, камера, дополнительные индексируемые metadata - см. {ИНДЕКСИРОВАНИЕ ФАЙЛОВ}. Показывается список доступных значений tag вместе с количеством файлов изображений, использующих это значение tag. Для 'title' и 'description' показываются только первые 60 символов, и указываются все файлы, использующие значения tag, соответствующие этим первым 60 символам. Для 'camera' сопоставляемое значение - это комбинация производителя, модели и объектива. - - TOPIC: АВТОПОИСК Эту функцию можно использовать в файлах сценариев оболочки для извлечения файлов изображений, соответствующих любым критериям выбора, доступным при использовании функции «Поиск изображений» (см. ниже). Сначала используйте функцию «Поиск изображений», чтобы задать нужные критерии выбора (например, имена папок/файлов, даты, keywords или другие metadata). Используйте кнопку [сохранить], чтобы сохранить критерии в файле настроек. Используйте следующую команду, чтобы запустить Fotocx и выполнить поиск: $ fotocx -m autosearch . Результат выводится в /search_results. - - TOPIC: ПОИСК ИЗОБРАЖЕНИЙ Используйте функцию «Поиск изображений», чтобы найти изображения с любыми нужными metadata (дата, keywords, местоположение ...). Для поиска используется файл индекса metadata, что позволяет искать среди тысяч изображений в секунду. - Есть два формата отчёта: галерея миниатюр, показывающая все изображения, соответствующие критериям поиска, или отчёт по metadata, который объединяет миниатюры с текстом metadata. Вот пример формата отчёта по metadata: +image: search-images-metadata.jpg - ^Диалог поиска +image: search-images.jpg - В диалоге выберите, какие изображения искать: либо все (все изображения), либо текущий набор, то есть изображения в текущей галерее, которой может быть папка, альбом или результаты предыдущего поиска изображений. - Далее выберите, что делать с найденными подходящими изображениями: «новый набор» означает заменить текущий набор найденными изображениями, «добавить» означает добавить их в текущий набор (галерею), а «удалить» означает удалить их из текущего набора. Чтобы удалить изображения, вы должны искать в текущем наборе. - Для файлов, соответствующих критериям выбора, вы можете дополнительно указать, какие версии выбираются: оригинал, последняя версия или все версии. 'оригинал' означает исходное или неизменённое изображение (или первую версию, если оригинал не был сохранён). 'последняя версия' означает новейшую или последнюю отредактированную доступную версию. 'все версии' означает, что будут получены оригинал и все версии. - Выберите нужный тип отчёта. Отчёт-галерея - это страница миниатюр изображений, столько, сколько нужно, чтобы вместить все изображения, соответствующие критериям поиска. Отчёт по metadata содержит и миниатюры изображений, и список tags metadata рядом с каждой миниатюрой. Они включают стандартные tags (дата, рейтинг, keywords, geotags, заголовок, описание) и любые другие tags metadata, которые вы добавили в список выбора tags (см. ниже). - Введите ваши критерии поиска. Выберите нужные keywords, даты, рейтинги в звёздах, слова, содержащиеся в тексте (заголовок или описание изображения), имена файлов или папок и названия местоположений. Подробнее см. ниже. - Доступные keywords показаны в «Определённых Keywords» и могут быть выбраны указанием и щелчком. Если список определённых keywords длинный, может быть проще начать вводить keyword в «введите keyword». Существующие keywords, соответствующие введённому на данный момент, появятся в списке «совпадения», и вы можете щёлкнуть по одному из них, чтобы добавить keyword в список поиска. - Если вы используете категории keywords, вы можете выбрать категорию, и в списке определённых keywords будут показаны только keywords этой категории. - Можно ввести диапазон дат, чтобы ограничить поиск изображениями в пределах этого диапазона дат. Выберите дату съёмки (с камеры) или дату файла (дата создания или последнего изменения). Формат: yyyy:mm:dd. Выбираются изображения с датой на или после первой даты, если она указана, и на или до второй даты, если она указана. Отсутствующий месяц/день по умолчанию принимается как 01/01 для нижней границы даты и как 12/31 для верхней границы. При желании можно указать время в формате yyyy:mm:dd hh:mm. Отсутствующее время по умолчанию принимается как 00:00 и 23:59. - Чтобы найти изображения без даты съёмки EXIF (например, сканированные изображения), введите "null" в поле первой даты. - Можно ввести пару рейтингов в звёздах, чтобы ограничить результаты изображениями с рейтингом в заданном диапазоне. Отсутствующее нижнее значение подразумевает 0 звёзд, а отсутствующее верхнее значение означает наивысший рейтинг, 5 звёзд. - Могут быть найдены папки и имена файлов. В поле поиска имён файлов введите любое количество названий, используемых для ваших папок изображений и имён файлов, через запятую. Ввод "egypt cairo" будет соответствовать всем папкам изображений или именам файлов, содержащим любую из этих строк. Подстроки также будут учтены. Регистр не имеет значения. - Можно искать по заголовку и описанию изображения. Введите слова для поиска в поле поиска заголовка/описания, через запятую. Они будут сопоставлены с каждым словом в заголовке и описании всех изображений, и подходящие изображения будут выбраны. Регистр не имеет значения. - Чтобы искать местоположения, введите одно или несколько названий города/местоположения или страны в поле поиска местоположений, через запятую. Будут выбраны только файлы изображений с geotags, соответствующими одному из введённых местоположений. Местоположением может быть город, парк или другое географическое название (то, что хранится в полях metadata 'City' и 'Country'). Регистр не имеет значения. - Переключатели 'все' и 'любой' применяются к keywords, тексту, именам файлов и местоположениям. Вы можете выбрать изображения, имеющие ВСЕ введённые строки, или ЛЮБУЮ из введённых строк. Пример: если в поле поиска местоположения указано "new york" и выбрано "любой", будут включены изображения из Нью-Зеландии (New York) и Йорка, Англия. Если выбрано "все", будут включены только изображения, расположенные в Нью-Йорке. - Если вы хотите найти изображения с отсутствующими данными, вы можете ввести "null" в качестве значения для сопоставления. - ^Поиск дополнительных Metadata С помощью полей диалога 'имя tag', 'условие' и 'значения сопоставления' вы можете указать дополнительные tags metadata для использования в качестве критериев выбора или для добавления в отчёт, если выбран тип отчёта "metadata". Tags, доступные для данного файла изображения, можно посмотреть с помощью {ПРОСМОТР ВСЕХ META}. Они включают множество tags, отсутствующих в основном диалоге. Список выбора берётся из текстового файла /meta_picklist. При желании вы можете добавить tags в этот файл. Вы можете использовать tags, которые также присутствуют в основном диалоге. Преимущество здесь в том, что можно использовать более гибкую логику сопоставления. - Логику сопоставления можно выбрать для каждого tag metadata. ^метод сопоставления значение сопоставления для выбора • report любое значение, включая отсутствующее • reportx значение не отсутствует • matches текстовые значения через запятую • contains то же самое, с сопоставлением подстрок • number = равные значения • number => равные или большие значения • number <= равные или меньшие значения - Кнопки [X] справа можно использовать, чтобы очистить отдельные поля поиска metadata. - ^Кнопки диалога [Загрузить] и [Сохранить] можно использовать для загрузки или сохранения критериев поиска из файла. [Очистить] очистит все данные в диалоге. [Продолжить] запустит процесс поиска. - Нажмите кнопку [proceed], чтобы выполнить поиск. Результатом является стандартная галерея миниатюр или формат отчёта по metadata, показанный выше. Вы можете сохранить найденные изображения как постоянный альбом - см. {АЛЬБОМЫ}. - ^Производительность Поиск и составление отчёта по проиндексированным metadata выполняются почти мгновенно. Скорость для непроиндексированных metadata зависит от скорости компьютера и диска. Мощный компьютер с SSD-диском может искать более 100 тысяч файлов в минуту. - ^search_results^ (альбом) Результат «Поиска изображений» сохраняется в альбоме "search_results". Переименуйте этот альбом, если хотите сохранить его от замены при более позднем поиске. - Ограничение: функция поиска ограничена 40 000 результатами (найденных изображений, соответствующих критериям поиска). Если это ограничение превышено, вы получите уведомление, и поиск будет усечён. Это ограничение существует из-за того, что размер прокручиваемого окна в GTK ограничен, и попытка создать окно большего размера может привести к сбою или зависанию. - - TOPIC: МЕНЮ ВЫБОРА - - TOPIC: ОБЗОР ОБЛАСТИ Функции правки обычно применяются ко всему изображению, но можно отредактировать часть изображения («область»), оставив остальное без изменений. Если область изображения выбрана, большинство функций правки будут работать только в пределах этой области. Некоторые функции (например, «Изменение масштаба») игнорируют выбранную область. Область можно выбрать перед началом функции правки или во время использования функции правки. Выбранная область активна немедленно, предыдущие правки сохраняются, и будущие правки будут применяться только в пределах области. Если запускается другая правка, выбранная область остаётся активной, поэтому можно выполнить серию правок в пределах области. Область также может состоять из нескольких несвязанных областей на изображении. - Fotocx использует «области» вместо «слоёв». Вместо того чтобы выбирать что-то на изображении, создавать отдельный слой из выделения, редактировать слой и, наконец, объединять слой, вы выбираете что-то на изображении, выполняете функции правки над выделением и сразу видите конечный результат. Области также можно сохранять, вставлять в другое изображение, перемещать и изменять масштаб, а также дополнительно редактировать. - +image: edit-selection.jpg - Редактирование выбранной области иногда может привести к видимым границам по краям области (иногда они совпадают с краями элементов изображения и поэтому не являются проблемой). Вы можете смешать края с помощью {СМЕШИВАНИЕ ОБЛАСТИ}: правки можно применять постепенно от края области внутрь, и вы можете выбрать, какие края смешивать. - - TOPIC: ВЫБОР ОБЛАСТИ +image: select-area.jpg - Диалог «Выбор области» запускается через меню Выбор > Выбор области. Выберите один из методов, описанных ниже. Каждый метод выбирает области изображения по-своему. Вы можете менять методы в любое время, и выбранные области накапливаются. По мере добавления или удаления областей из выделения показывается контур выбранной области (областей) изображения. Кнопка [Завершить] используется для отображения пикселей изображения в пределах контуров области, подготавливая их к применению последующих функций правки. Кнопка [Скрыть] скрывает контур области, обеспечивая лучшую видимость правок и возможных краевых эффектов области. Используйте кнопку [Краткий список], чтобы показать контур области. Кнопка [Очистить] удаляет все выделения области. Диалог выбора области можно отменить и перезапустить позже, чтобы изменить существующие области или добавить новые. - ^Методы Следующие методы используются для охвата одного или нескольких участков изображения, которые будут принадлежать конечной области. Эти методы можно использовать в любой последовательности для определения участков, которые объединены или разделены. • Прямоугольник - перетащите, чтобы обвести прямоугольную область • Овал - перетащите, чтобы обвести круглую или эллиптическую область • Рисование от руки - обведите область, рисуя мышью • Следовать по краю - обведите, следуя по краям элементов изображения • Выбрать область в пределах мыши - перетащите, чтобы выбрать пиксели в пределах круга вокруг указателя мыши. • Выбрать один цвет в пределах мыши - выбрать только пиксели, соответствующие заданному цвету, с совпадением 0-100%. • Выбрать все цвета в пределах мыши - выбрать все пиксели в пределах мыши, расширить выделение на соседние области с цветами, соответствующими цветам в пределах мыши (иногда называется 'заливкой'). - Следующие абзацы объясняют детали каждого метода. - ^Прямоугольник Перетащите мышь от одного угла к противоположному углу прямоугольной области для выбора. Рисуется прямоугольник, охватывающий область. Щёлкните правой кнопкой, чтобы удалить и начать заново. Повторите процесс, чтобы выбрать больше прямоугольных областей. - ^Овал Работает так же, как выбор прямоугольника, за исключением того, что охватываемая область - это круг или эллипс. Начальная точка перетаскивания - это центр получившегося эллипса. Угол перетаскивания определяет форму эллипса. - ^Рисование от руки Перетащите мышь (с нажатой левой кнопкой), чтобы нарисовать линию от руки, или щёлкните левой кнопкой, чтобы соединить прямую линию от последней нарисованной точки до точки щелчка. Продолжайте обводить целевую область, пока она не будет полностью окружена соединёнными кривыми и линиями. Щёлкните правой кнопкой, чтобы удалить предыдущие линии (ошибки). Щелчок правой кнопкой удалит предыдущую линию, нарисованную щелчком или перетаскиванием, до 50 пикселей. Щёлкайте правой кнопкой многократно, чтобы удалить больше. Новая линия, нарисованная щелчком, всегда будет соединяться с концом предыдущей линии. Новая линия, нарисованная перетаскиванием, соединится с предыдущей линией, если она начата близко к концу этой линии. Если она начата в другом месте, будет нарисована несвязанная линия. Вы можете начать новое перетаскивание издалека и нарисовать линию обратно к предыдущей линии, чтобы соединить их. Если линия, нарисованная щелчком, соединяется с нежелательной точкой (то есть вы не хотите соединяться с последней нарисованной линией), щёлкните правой кнопкой, чтобы стереть её, а затем используйте перетаскивание, чтобы начать новую последовательность линий. Перетаскивание правой кнопкой можно использовать для стирания сегментов линии: перетащите правой кнопкой близко вдоль линии, чтобы стереть её, затем перетащите левой кнопкой, чтобы перерисовать линию. В конце область должна быть полностью замкнута, без разрывов. Линии, слегка перекрывающиеся на концах, допустимы. Разрывы могут быть трудны для нахождения и исправления, поэтому работайте при 100% размере изображения или больше и будьте внимательны. Серия линий, автоматически соединённых щелчками левой кнопкой, не оставит разрывов, но отклонение от этой последовательности может создать разрывы. Чтобы уменьшить вероятность разрывов, используйте намеренные перекрытия при ручном соединении линий. Ниже описана утилита обнаружения разрывов - {НАЙТИ РАЗРЫВ ОБЛАСТИ}. Если край области также является краем изображения, вам не нужно рисовать эту часть области. Проведите линию за край изображения и снова проведите её на изображение в другой позиции вдоль края изображения. - ^Следовать по краю Между последней нарисованной точкой и новой точкой щелчка находятся и соединяются пиксели с высоким контрастом (вероятно, края элементов изображения). Это эффективно для чётких краёв, не слишком неровных. Размытые и неровные края могут работать не очень хорошо, и если требуется высокая точность, понадобится рисование от руки. Правила соединения линий такие же, как описано выше. Перетаскивание мыши вместо щелчков работает как рисование от руки, но с тенденцией следовать за краями элементов из позиции чуть позади мыши. Для очень неровных краёв (волосы, листва) см. 'снятие выбора по цвету' ниже. - ^Радиус мыши и уровень соответствия цвета Эти два элемента управления применяются только к методам «выбор в пределах мыши», описанным ниже. Радиус мыши определяет размер круга вокруг указателя мыши. Пиксели в пределах круга выбираются, либо они предоставляют набор цветов для сопоставления и выбора пикселей от круга мыши наружу. Уровень соответствия определяет требуемый уровень соответствия (0-100%) для выбора пикселей на основе их цвета и яркости. '0' означает, что подходит что угодно, а '100' означает, что требуется идеальное совпадение. - ^Выбрать область в пределах мыши Щелчок левой кнопкой или перетаскивание выберет пиксели, охваченные кругом мыши. Щелчок правой кнопкой отменит выбор последнего выделения (повторите, чтобы отменить выбор большего). Перетаскивание правой кнопкой отменит выбор охваченных пикселей. - ^Выбрать один цвет в пределах мыши Щёлкните по изображению, чтобы выбрать цвет. Цвет показывается на кнопке цвета. Вы также можете использовать эту кнопку, чтобы задать цвет напрямую. Перетащите левой/правой кнопкой, чтобы выбрать/отменить выбор пикселей в пределах круга мыши, соответствующих выбранному цвету в пределах уровня соответствия. Уменьшите или увеличьте уровень соответствия, чтобы соответствовать большему или меньшему диапазону цветов. Щёлкайте по изображению по мере необходимости, чтобы изменить сопоставляемый цвет. - ^Необязательный цвет снятия выбора Это применяется только к 'выбору одного цвета' выше. Щёлкните левой кнопкой по изображению, чтобы задать цвет снятия выбора. Когда флажок отмечен, цвет снятия выбора активен. Если пиксель соответствует цвету снятия выбора лучше, чем выбранному цвету, с пикселя снимается выбор. При выборе вдоль края элемента с низким цветовым контрастом по сравнению с соседней областью, которая должна оставаться невыбранной, задайте цвет снятия выбора из соседней области. Это полезно для точного выбора сложного края, например волос или листвы. Приведённый ниже пример - это проект на 5-10 минут для опытного пользователя. Также использовалось «Смешивание области» (ниже). - +image: select-hairy.jpg - ^Выбрать все цвета в пределах мыши В некоторых редакторах это называется 'заливкой'. Перетащите левой/правой кнопкой, чтобы выбрать/отменить выбор пикселей внутри круга мыши. Пиксели за пределами круга мыши также включаются, если они соответствуют двум условиям: 1) их цвет соответствует любому цвету внутри круга мыши в пределах текущего уровня соответствия. 2) они находятся в пределах диапазона поиска от указателя мыши. Это коэффициент от радиуса мыши, например, если радиус мыши равен 20, а диапазон поиска равен 3, то диапазон поиска составляет 60 пикселей от указателя мыши. Перетащите мышь по новым областям, которые вы хотите включить. Наблюдайте, как выбранная область расширяется в области с цветами, соответствующими цветам внутри круга мыши. Если вы зайдёте слишком далеко, щёлкните правой кнопкой, чтобы удалить последнее выделение. Повторите при необходимости, чтобы удалить больше предыдущих выделений. Уменьшите радиус или увеличьте уровень соответствия для более точного контроля - выделение будет расширяться медленнее и оставаться ближе к кругу мыши. Небольшой радиус и высокий уровень соответствия можно использовать, чтобы следовать вдоль края элемента изображения и выбирать пиксели вплоть до края с хорошей точностью. После завершения работы с краем используйте метод «выбор области в пределах мыши», чтобы выбрать остальное. Перетаскивание правой кнопкой действует как снятие выбора: с пикселей внутри круга мыши и соответствующих пикселей в пределах диапазона поиска снимается выбор. Если выделение зашло слишком далеко, часто проще исправить это, снимая выбор снаружи выделенной области, а не выбирая изнутри. Возможно, вам понадобится некоторая практика, чтобы почувствовать это и научиться работать эффективно. - ^Выбрать все цвета в пределах мыши - краткое описание • перетаскивание левой кнопкой - выбрать пиксели в пределах мыши и соответствующие пиксели в диапазоне • щелчок правой кнопкой - отменить предыдущее выделение, повторить для отмены выбора большего • перетаскивание правой кнопкой - снять выбор пикселей в пределах мыши и соответствующих пикселей в диапазоне - ^Смещение края Завершённую область (см. ниже) можно расширять или сужать шагами по 1 пикселю. Это может быть полезно для уменьшения краевых эффектов, когда область, выбранная по совпадению цветов, редактируется способом, изменяющим её яркость. Выбор по цвету может оставить узкую полосу недостаточно или избыточно выбранных пикселей вдоль края, где цвет элемента переходит в фон. Расширение или сужение области на 1-2 пикселя может дать более чистый вид края. Область остаётся завершённой (см. ниже) после смещения. - ^Цвет контура области Цвет, используемый для круга выбора мыши и контура области, можно изменить в любой момент, щёлкнув по одной из кнопок цвета. Это обеспечивает хорошую видимость на фоне различных цветов изображения. - ^Показать/скрыть Используйте [Скрыть], чтобы скрыть контуры области. Это полезно, чтобы лучше видеть эффекты правок области без помех от контура области. Используйте [Краткий список], чтобы показать контуры и возобновить редактирование области. - ^Завершить +image: select-area-finish.png - Область не действует для правок, пока не будет успешно завершена. «Завершить» проверяет нарисованные контуры и окрашивает охваченные пиксели для визуальной проверки. Когда вы закончили обводить области, используйте кнопку [Завершить], чтобы завершить процесс. Показанный выше всплывающий диалог обобщает два метода, которые можно использовать для завершения. - Способ 1: щёлкните левой кнопкой мыши внутри областей, обведённых вручную. Охваченные области временно окрашиваются, чтобы вы могли убедиться, что итоговый результат - именно то, что вы хотели. Можно выбрать любую охваченную область, даже те, что не были явно обведены: если у вас есть пончик с дыркой, вы можете выбрать пончик, дырку или оба. Нажмите [keep], когда все области щёлкнуты и правильно окрашены. Если в контуре области, нарисованной от руки, есть разрыв, процесс окрашивания «просочится» наружу, и области за пределами контура будут окрашены. В этом случае нажмите [Отменить] в диалоге «Завершить», что восстановит исходный контур области. Найдите разрыв в контуре и закройте его, затем попробуйте [Завершить] снова. Разрыв в 1 пиксель в большой области может быть трудно найти. Увеличьте масштаб для лучшего просмотра. См. функцию {НАЙТИ РАЗРЫВ ОБЛАСТИ} ниже для быстрого метода поиска крошечных разрывов. - Способ 2: щёлкните правой кнопкой где-нибудь за пределами всех охваченных областей. Все охваченные области будут окрашены для визуальной проверки. Если есть разрыв, результаты и исправление такие же, как описано в способе 1. Этот метод имеет смысл, если у вас много областей, обведённых вручную, и вы не хотите проверять их по одной с помощью способа 1. - Области, выбранные с помощью методов «выбор в пределах мыши», завершаются автоматически. Эти области отображаются в процессе выбора, тогда как области, выбранные прямоугольником, овалом или одним из методов рисования линий, отображаются только когда вы щёлкаете внутри них. Если вы используете только методы «выбор в пределах мыши», вы можете нажать [keep], не щёлкая ни по одной из выбранных областей. - Если вы проведёте линию от одной стороны изображения до другой, вы можете щёлкнуть по любой стороне линии, чтобы создать область из всех пикселей на этой стороне линии. Пример: нарисуйте горизонтальную линию по границе между небом и землёй. Щёлкните выше линии, чтобы выбрать небо, ниже линии, чтобы выбрать землю. Нарисованные линии должны полностью доходить до краёв изображения. - ^Очистить Безвозвратно удалить текущую область. - - TOPIC: НАЙТИ РАЗРЫВ ОБЛАСТИ Если контур области был создан рисованием от руки несколькими штрихами, легко оставить небольшие разрывы в контуре, которые не видны при увеличении менее 4x. Попытка завершить такую область завершится неудачей, потому что отображение внутренних пикселей «просочится» через разрыв и охватит области за пределами предполагаемой области. Если функция «Завершить» не удалась, эта функция может найти разрыв. Щёлкните где-нибудь по контуру неудавшейся области. Контур будет медленно перерисован в одном направлении от точки щелчка, пока не будет найден «конечный пиксель». Это и есть место разрыва. Затем контур рисуется в противоположном направлении, пока не встретится разрыв (или другой). Разрыв находится там, где рисование остановилось. Увеличьте масштаб на разрыве и закройте его с помощью рисования от руки, затем проверьте снова, можно ли нарисовать полный контур без остановки. Эту функцию можно использовать параллельно с функцией «Выбор области» - оба диалога могут быть активны. - - TOPIC: СМЕШИВАНИЕ ОБЛАСТИ +image: area-blend.jpg - В этом инструменте присутствуют две функции: «Смешивание области» и «Смешивание края области». Обе функции могут постепенно «отменять» правку, сделанную в выбранной области, путём подмешивания предыдущей правки или исходного изображения. В приведённом выше примере четверо мужчин на заднем плане были осветлены без каких-либо признаков границы между осветлёнными и неизменёнными пикселями. - ^Смешивание области Любую часть отредактированной выбранной области можно смешать с исходным изображением. Используйте перетаскивание левой кнопкой мыши по областям для смешивания. Каждое перетаскивание мышью в пределах области будет постепенно подмешивать выбранное предыдущее изображение, эффективно уменьшая или устраняя правку, сделанную в пределах области. Скорость смешивания определяется 'степенью смешения', которую можно задать отдельно для центра и края круга мыши. Задайте радиус мыши и степень смешения (например, 50/0 для центра/края мыши). Перетащите мышь по участкам области, которые нужно смешать. Используйте перетаскивание левой кнопкой для смешивания, правой кнопкой - для отмены смешивания или восстановления. Вы можете использовать этот метод для выборочного смешивания краёв области: используйте небольшой радиус и перетаскивайте центр мыши по краям, которые нужно смешать. Это приведёт к постепенному смешению от края внутрь. - ^Смешивание края области Иногда отредактированная область имеет неестественно выглядящие края из-за резкой границы между отредактированной областью и окружающим изображением (особенно если область была осветлена). Это можно эффективно сделать невидимым, постепенно смешивая («убирая») правку области для полосы вдоль краёв. Правку области можно на 100% убрать от края области, уменьшая до 0% внутрь на ширину полосы. Есть два способа смешивания краёв области: 'смешение' и 'размытие'. Смешение подмешивает полосу края с выбранной предыдущей правкой или исходным изображением. Размытие подмешивает полосу с соседними пикселями снаружи полосы. Задайте ширину смешения с помощью ввода 'ширина смешения' или 'ширина размытия'. - 'Смешение' и 'Размытие' края области требуют вычисления расстояния до края: расстояния от каждого пикселя области до ближайшего края области. Это расстояние используется для вычисления относительной степени смешения для пикселя: 100% на краю области и 0% для пикселей на расстоянии больше 'ширины смешения' от края. Для большой области со сложным краем это может занять некоторое время. На верхней панели показывается индикатор выполнения. - - TOPIC: ПОКАЗАТЬ/СКРЫТЬ ОБЛАСТЬ Показать или скрыть контур текущей области. Скрытие области полезно, когда область изменяется функцией правки. Это облегчает оценку эффектов правки. Они также доступны в виде кнопок в диалоге «Выбор области». - - TOPIC: ВКЛЮЧИТЬ/ОТКЛЮЧИТЬ ОБЛАСТЬ Отключить текущую область, сохранив данные, чтобы её можно было снова активировать позже (меню «Включить»). Это позволяет чередовать правки в пределах выбранной области и правки для всего изображения. - - TOPIC: ИНВЕРТИРОВАТЬ ОБЛАСТЬ Инвертировать существующую область: выбирается всё изображение, кроме существующей области. Повторное применение функции возвращает исходную выбранную область. Инвертирование выбранной области делает недействительным вычисление края, которое нужно будет повторить, если требуется смешивание края области. - - TOPIC: ОЧИСТИТЬ ОБЛАСТЬ Безвозвратно удалить текущую область. Также доступно как кнопка в диалоге «Выбор области». - - TOPIC: КОПИРОВАТЬ/ВСТАВИТЬ ОБЛАСТЬ Выбранную область можно сохранить в кэш-файл с помощью меню Области > Копировать. Эту область можно вставить в то же самое или другое изображение с помощью Области > Вставить. Щёлкните и перетащите, чтобы расположить вставленную область. Элементы управления диалога можно использовать, чтобы изменить масштаб и повернуть вставленную область. - - TOPIC: ЗАГРУЗИТЬ/СОХРАНИТЬ ОБЛАСТЬ Выбранную область можно сохранить в файл с помощью меню Области > Сохранить. Вас попросят указать имя файла. Создаётся файл PNG. Файл PNG имеет альфа-канал для информации о прозрачности. Изображение представляет собой прямоугольник, охватывающий выбранную область. Выбранные пиксели непрозрачны, остальные - прозрачны. - По умолчанию эти файлы находятся в /saved_areas, но вы можете сохранить их где угодно. Используйте меню Области > Загрузить, чтобы загрузить сохранённую область из файла и вставить её в текущий файл изображения. Фоновое изображение будет видно через прозрачные части вставленной области. Щёлкните и перетащите, чтобы расположить область. Элементы управления диалога можно использовать, чтобы изменить масштаб и повернуть вставленную область. - - TOPIC: КНОПКА ОТМЕНИТЬ/ПОВТОРИТЬ Если функция правки активна, и изображение было изменено: • щелчок левой кнопкой мыши отменит текущую правку • щелчок правой кнопкой мыши повторит правку Это позволяет быстро сравнивать изображения «до» и «после» для текущей функции правки. - Если НИ ОДНА функция правки не активна, но некоторые правки были сделаны к текущему изображению: • щелчок левой кнопкой мыши отменяет один шаг правки за щелчок • щелчок правой кнопкой мыши повторяет один шаг правки за щелчок • щелчок средней кнопкой мыши показывает всплывающий список всех шагов правки. Вы можете вернуться к любому шагу правки или к исходному изображению - Если вы откроете другой файл, сохранённые шаги правки для текущего файла будут отброшены. - - TOPIC: МЕНЮ РЕДАКТИРОВАНИЯ - - TOPIC: ПОВОРОТ Чтобы выровнять наклонённое изображение, используйте мышь, чтобы перетащить правую или левую сторону изображения вверх или вниз, пока изображение не будет выглядеть ровным. Щелчок левой кнопкой по изображению добавит вертикальные и горизонтальные направляющие линии, помогающие с выравниванием изображения. Щёлкните правой кнопкой, чтобы удалить их. - Кнопка [Автоуровень] может автоматически выровнять изображение, если камера записала 'угол крена' в metadata EXIF. Кнопка [Auto Upright] может автоматически выпрямить изображение, снятое с поворотом камеры на 90º, если в metadata EXIF присутствует 'ориентация'. - - TOPIC: ВЫПРЯМЛЕНИЕ Это исправление в одну кнопку для изображения, повёрнутого на 90/180 градусов или инвертированного (отражённого). Потери разрешения не происходит, поскольку пиксели копируются 1:1 в новую компоновку изображения. См. также функцию {МАССОВОЕ ВЫПРЯМЛЕНИЕ}. - - TOPIC: ОБРЕЗКА +image: crop-image.jpg +image: crop-buttons.jpg - Обрезать нежелательные области по краям изображения. При открытии диалога поверх изображения размещается прямоугольник выделения. Области за пределами этого прямоугольника затемняются и представляют собой части изображения, которые будут удалены. Перетащите любую сторону или угол прямоугольника, чтобы переместить эту сторону или угол. Диалоговое окно показывает текущее соотношение ширины/высоты прямоугольника выделения. Если отмечено «Зафиксировать», перемещение стороны или угла вызовет перемещение другой стороны или угла, чтобы сохранить фиксированное соотношение ширины/высоты. Перетащите от середины (отмеченной маленьким кружком), чтобы сдвинуть весь прямоугольник, не меняя размеров. Используйте кнопки-счётчики ширины и высоты, чтобы напрямую изменить размеры изображения в пикселях, либо введите нужные значения. Прямоугольник выделения подстроится под эти значения. - Используйте клавиши стрелок на клавиатуре, чтобы перемещать прямоугольник выделения шагами по 1 пикселю. Клавиши стрелок будут перемещать ту сторону или угол, которые последними были перемещены мышью. - Кнопка [Макс.] сбрасывает прямоугольник обрезки до полного размера изображения. Если предыдущая правка (Поворот, Искажение ...) оставила прозрачные поля вокруг изображения, прямоугольник обрезки отразит максимальный размер, помещающийся в пределах этих полей. - Кнопка [Пред.] извлекает список ранее использованных значений ширины и высоты. Выберите из списка, чтобы использовать одно из них. - Пять кнопок соотношения позволяют выбрать заданное соотношение ширины/высоты. Кнопка [invert] инвертирует текущее соотношение ширины/высоты. - Вы можете изменить кнопки соотношения с помощью кнопки [customize], которая запускает новый диалог, показанный справа. Щёлкните по кнопке, чтобы отредактировать её. Введите нужное соотношение ширины к высоте, используя формат "ww:hh", как в показанном примере. - - TOPIC: РЕТУШЬ +image: retouch.png - Настройка яркости и цвета изображения. • автоуровень чёрного - задать точку чёрного по % самых тёмных пикселей • автобаланс белого - задать точку белого по % самых ярких пикселей • щёлкнуть по серой точке для баланса белого - щёлкнуть по серой точке на изображении • щёлкнуть по тёмной точке для уровня чёрного - щёлкнуть по тёмной точке на изображении • щёлкнуть для всплывающего графика гистограмм RGB • яркость - перемещает кривую 'все' вверх или вниз (изменяются все цвета) • контраст - изменяет наклон кривой 'все' • насыщенность цвета - чёрно-белое <--> насыщенные цвета • цветовая температура - баланс освещения (тёплый <--> холодный) - После внесения начальных изменений с помощью ползунков вы можете точно настроить яркость и контраст, редактируя кривые мышью, чтобы изменить, какие части изображения меняются больше или меньше. Кривая ALL настраивает все цвета, а 3 кривые RGB настраивают отдельные цвета. Сначала используйте ALL, затем вносите изменения с помощью RGB. - ^Кнопки Сброс - вернуть все элементы управления в нейтральное положение - изображение также сбрасывается Пред. - установить все элементы управления в значения, использованные для предыдущего изображения Готово - завершить правку, закрыть диалог, сохранить настройки элементов управления Отмена - отменить правку, сбросить изображение, закрыть диалог - Используйте кнопку [Пред.] при обработке нескольких изображений, требующих похожих настроек. - - TOPIC: ИЗМЕНЕНИЕ МАСШТАБА +image: rescale.png - Эта функция изменяет масштаб изображения до новой ширины и высоты в пикселях. Вы можете ввести новые размеры напрямую или выбрать процентное изменение. Есть кнопки для установки нового размера в простом соотношении к исходному размеру. Использование одной из них минимизирует потерю разрешения. Кнопка [Предыдущий] вспоминает предыдущий размер, что удобно, если нескольким изображениям задаётся один и тот же размер. Если отмечен флажок фиксации соотношения, текущее соотношение ширины/высоты будет сохранено при изменении ширины или высоты. - - TOPIC: РАЗДЕЛЁННЫЙ ЭКРАН +image: split-screen1.jpg +image: split-screen2.png - Во время функции правки просматривайте изображения до и после с помощью метода разделённого экрана. Перетащите разделительную линию мышью. При выходе из режима разделённого экрана вы можете продолжить функцию правки в обычном режиме. - Если ни одна функция правки не активна, выберите два изображения для показа с помощью разделённого экрана. Они должны иметь одинаковые размеры в пикселях. - - TOPIC: ПОКАЗАТЬ РАЗЛИЧИЯ Во время функции правки выделяйте изменения, затемняя неизменённые области. Используйте ползунок, чтобы настроить затемнение неизменённых областей. При выходе из режима «Показать различия» вы можете продолжить функцию правки в обычном режиме. - Если ни одна функция правки не активна, выберите два изображения, чтобы выделить их различия. Они должны иметь одинаковые размеры в пикселях. - - TOPIC: ПОЛЯ +image: margins.png - Используйте эту функцию, чтобы добавить поля вокруг изображения. Вы можете использовать любой цвет и настройки альфа (прозрачности) для полей. Задайте каждое поле отдельно, либо используйте элементы управления 'Все±1' и 'Все±10', чтобы изменить все поля вверх или вниз на одну и ту же величину, 1 или 10 пикселей. Используйте колесо мыши или клавиши стрелка вверх/вниз для скорости. - Вы можете использовать эту функцию, чтобы добавить поля вокруг изображений, которые вы планируете искажать, чтобы предотвратить выход некоторых областей за края. - - TOPIC: РАЗМЕТКА +image: markup.jpg - Это меню, содержащее функции разметки изображения: рисовать текст, рисовать линию/стрелку, рисовать прямоугольник, рисовать овал Все эти функции имеют кнопку [commit], которая фиксирует текущую правку и позволяет начать новую (новый текст/линию/прямоугольник/овал) в том же диалоге правки. - ^Рисовать текст Эта функция рисует текст непосредственно на изображении. Введите текст в диалог. Можно использовать несколько строк. После ввода текста щёлкните левой кнопкой мыши там, где вы хотите разместить текст на изображении. Перетащите, чтобы переместить текст в другое место. Щёлкните правой кнопкой, чтобы удалить текст. Используйте кнопку [Шрифт], чтобы выбрать другой шрифт. Используйте элемент управления [Показать текущий файл журнала], чтобы увеличить или уменьшить размер текста. Используйте элемент управления [Угол], чтобы изменить угол наклона текста. Другие элементы управления позволяют задать цвет фона вокруг текста, цвет контура текста и эффект тени. Вы можете выбрать цвет и прозрачность для всех этих параметров. Элемент управления шириной регулирует ширину контуров и теней. Элемент управления углом тени задаёт угол тени. Используйте элементы управления тиснением, чтобы придать тексту 3D-вид. - Вы можете инициализировать текст из любых доступных metadata в файле изображения. Введите tag metadata (например, "user comments") и нажмите [Получить]. Вы можете сокращать имена tags, например "usercomments" вместо "User Comments". - Кнопки [Открыть] и [Сохранить] запускают диалог выбора файла, с помощью которого вы можете загрузить или сохранить все текстовые данные из файла или в файл. Загружаются или сохраняются все элементы диалога, так что вы можете хранить набор часто используемых текстовых строк и настроек. - Кнопки внизу работают следующим образом: • Очистить - очистить поля текста и metadata до пустых • Заменить - изображение с добавленным текстом заменяет текущее изображение • +Версия - изображение с добавленным текстом сохраняется как новая версия • Далее - открыть следующий файл, поместить тот же текст в ту же позицию • Применить - зафиксировать текущую правку и сбросить для ввода нового текста • Готово - завершить текущую правку - изображение готово к сохранению • Отмена - отказаться от текущей правки - Чтобы добавить один и тот же текст к серии изображений: подготовьте и расположите текст, нажмите [Заменить] или [+Version], затем [Далее], затем [Заменить] или [+Version], затем [Далее] ... - Создать водяной знак: используйте прозрачность текста 70% или более и прозрачность фона 100%. Текст должен быть еле различим. Используйте элементы управления тиснением, чтобы текст выглядел вдавленным в изображение. - ^Рисовать линию Эта функция рисует линии или стрелки непосредственно на изображении. Введите длину и ширину линии в диалог и при желании выберите наконечник стрелки. Щёлкните левой кнопкой мыши там, где вы хотите разместить её на изображении. Перетащите концы линии/стрелки, чтобы расположить её на изображении. Щёлкните правой кнопкой, чтобы удалить её. Перетащите из середины линии, чтобы переместить её, не меняя угол или длину. Элементы управления диалога позволяют задать цвет фона, цвет контура и эффект тени. Вы можете выбрать цвет и прозрачность для всех этих параметров. Элемент управления шириной регулирует ширину контуров и теней. Элемент управления углом тени задаёт угол наклона тени. Чтобы сохранить нарисованную линию и начать новую, нажмите [применить]. - ^Рисовать прямоугольник Выберите цвет и ширину для контура прямоугольника. Поместите курсор в позицию, где вы хотите разместить угол прямоугольника, и перетащите, чтобы раскрыть прямоугольник в нужном направлении. Чтобы заменить прямоугольник, перетащите снова. Чтобы переместить прямоугольник, удерживайте клавишу Shift и перетащите прямоугольник от центра. Чтобы переместить один из краёв, удерживайте клавишу Shift и перетащите край. Чтобы сохранить нарисованный прямоугольник и начать новый, нажмите [применить]. - ^Рисовать овал Выберите флажок овала (эллипса) или круга. Выберите цвет и ширину для контура. Поместите курсор в нужный центр. Перетащите, чтобы нарисовать овал/круг. Угол перетаскивания определяет форму овала, от круга до вытянутого эллипса, широкого или высокого. Чтобы заменить овал/круг, перетащите снова. Чтобы переместить овал/круг, удерживайте клавишу Shift и перетащите от центра. Чтобы изменить размер или форму, удерживайте клавишу Shift и перетащите от нижнего правого края. Чтобы сохранить нарисованный овал/круг и начать новый, нажмите [применить]. Для овала вы можете ввести угол 0-90 градусов для наклонных осей, как в примере. - - TOPIC: ЦВЕТОВОЙ РЕЖИМ +image: color-mode.png +image: color-mode2.jpg - Используйте эту функцию, чтобы сделать чёрно-белый или цветной негатив, преобразовать негативное изображение в позитивное, или преобразовать в сепию (для эффекта состаренного фото). Ползунок можно использовать, чтобы применять эффект постепенно, от 0% до 100%. - - TOPIC: ПРАВКИ КИСТЬЮ Используйте эту функцию в сочетании с какой-либо другой функцией правки. Запустите функцию правки и оставьте элементы управления в нейтральном положении. Затем запустите «Правки кистью». Нанесите функцию правки там, где нужно, с помощью мыши. См. {MOUSE PAINTING} о том, как применять правки локально с помощью мыши. - Этот способ постепенного нанесения правок «кистью» может быстро и легко улучшить выбранные области изображения. Он работает со следующими функциями правки: • Правка > Ретушь, Цветовой режим • Восстановление > Резкость, Размытие, Шумоподавление, Удаление дымки, Настройка RGB, Настройка HSL • Улучшение > Выравнивание гистограммы, Локальный контраст, Усиление контраста, Локальный Retinex, Насыщенность, Мягкий фокус • Эффекты > Контуры, Набросок2, Тиснение, Текстура, Добавить блики, Установить цвета, Сдвинуть цвета, Пользовательское ядро - - TOPIC: РИСОВАНИЕ ПО ИЗОБРАЖЕНИЮ +image: paint-image.jpg - Эта функция закрашивает изображение выбранными цветами с помощью мыши. См. {MOUSE PAINTING} о том, как применять правки локально с помощью мыши. - Кнопка цвета рисования показывает текущий цвет. Щёлкните по этой кнопке, чтобы выбрать цвет с помощью стандартного диалога выбора цвета Gnome. Вы также можете зажать shift и щёлкнуть левой кнопкой по изображению, чтобы выбрать цвет с изображения. - Кнопка палитры открывает диалог, показанный в центре. Щёлкните по изображению, чтобы выбрать цвет в этой позиции. Выбранный цвет отражается в кнопке цвета основного диалога. Показанное выше изображение используется по умолчанию. Вы можете использовать любое изображение как источник цвета. Нажмите кнопку [обзор] и выберите изображение, где вы сохранили цвета для использования. Этот выбор остаётся в силе до изменения. - Кнопка HSL открывает выбор цвета HSL, показанный справа. Этот диалог может представить любой возможный цвет. Двигайте ползунки, чтобы получить нужный цвет. Выбранный цвет отражается в кнопке цвета основного диалога. - Если выбрана опция рисования поверх прозрачных областей, рисование поверх прозрачных областей уменьшит или устранит прозрачность, в зависимости от элементов управления непрозрачностью. Если эта опция не выбрана, закрашиваются только непрозрачные области изображения. - ^Работа с планшетом Wacom С «Рисованием по изображению» вы можете использовать планшет Wacom вместо мыши. Перетаскивание пера в контакте с поверхностью планшета будет рисовать, как описано выше. Если одна из кнопок пера удерживается нажатой во время перетаскивания, операция будет стиранием вместо рисования. Вы также можете задать режим рисования или стирания с помощью переключателей в диалоге. Удерживать кнопку пера неудобно, поэтому и предусмотрены переключатели. Увеличение давления на перо увеличит непрозрачность, так что вы можете делать более светлые и более тёмные штрихи без настройки элементов управления непрозрачностью. - - TOPIC: РИСОВАНИЕ ПРОЗРАЧНОСТИ +image: paint-transp.png +image: paint-transp2.jpg - Рисовать прозрачные или полупрозрачные области на изображении. См. {MOUSE PAINTING} о том, как применять правки локально с помощью мыши. - - TOPIC: ЗАЛИВКА ОБЛАСТИ Заполнить все выбранные области или все прозрачные области выбранным накладываемым цветом. Если область частично прозрачна, накладываемый цвет заменит прозрачную часть изображения. Ползунок 'Смешение' можно использовать, чтобы выбрать любую степень смешения исходного изображения и накладываемого цвета. - - TOPIC: КОПИРОВАТЬ ВНУТРИ ИЗОБРАЖЕНИЯ Закрашивайте области изображения, копируя из другого места того же изображения. Этот метод можно использовать, чтобы продублировать объекты внутри изображения, либо удалить нежелательный объект, заменив его фоном, взятым из другого места. Щёлкните левой кнопкой по изображению, чтобы выбрать исходное местоположение, затем щёлкните правой кнопкой, чтобы выбрать соответствующее место назначения. См. {MOUSE PAINTING} о том, как применять правки локально с помощью мыши. - Если выбрана опция рисования поверх прозрачных областей, рисование поверх прозрачных областей уменьшит или устранит прозрачность. Если эта опция не выбрана, закрашиваются только непрозрачные области изображения. - - TOPIC: КОПИРОВАТЬ ИЗ ИЗОБРАЖЕНИЯ Закрашивайте области изображения, копируя из другого изображения. Целевое изображение «закрашивается» перетаскиванием мыши по области, которую нужно изменить. Ранее выбранная позиция в исходном изображении копируется на целевое изображение. Копируемая область и закрашиваемая область обе охвачены кругами, которые перемещаются вместе с мышью. В приведённом выше примере лодка на правом изображении была скопирована на левое изображение. - Начните с открытия целевого изображения. Выберите меню «Копировать из изображения». Запускается второй сеанс Fotocx, показывающий то же изображение. В этом втором сеансе перейдите к исходному изображению и откройте его. Расположите два окна так, чтобы держать оба в поле зрения (по крайней мере области, которые нужно скопировать). Зажмите shift и щёлкните левой кнопкой по исходному изображению, чтобы задать исходную позицию. Зажмите shift и щёлкните левой кнопкой по целевому изображению в позиции назначения. - Перетащите мышь левой кнопкой по области целевого изображения. Пиксели из исходного изображения копируются на целевое изображение. Увеличьте изображения до максимального размера, если требуется высокая точность для опорных позиций. Начальная опорная позиция для обоих изображений - (0,0) (северо-западный угол). См. {MOUSE PAINTING} о том, как применять правки локально с помощью мыши. - Значение масштаба исходного изображения используется для масштабирования исходного изображения к целевому изображению. Начните с пробного копирования, чтобы проверить масштаб. Если слишком большое или слишком маленькое, используйте [undo all], чтобы стереть пробу, измените значение масштаба и попробуйте снова. - Если выбрана опция рисования поверх прозрачных областей, рисование поверх прозрачных областей уменьшит или устранит прозрачность, в зависимости от элементов управления непрозрачностью мыши. Если эта опция не выбрана, закрашиваются только непрозрачные области изображения. - - TOPIC: КОПИРОВАТЬ ПРЕДЫДУЩУЮ ПРАВКУ Изображение из предыдущего шага правки можно применить к текущему изображению локально и постепенно, «рисуя» мышью. Предыдущая правка должна быть одной из правок, сделанных к текущему изображению, пока оно ещё открыто - несохранённые правки теряются при открытии нового изображения. Вы можете применить любую предыдущую правку к любой области редактируемого текущего изображения, пока оно остаётся открытым как текущее изображение. Выберите предыдущую правку из выпадающего списка, который показывает все предыдущие шаги правки, сделанные для текущего изображения, по порядку, обозначенные используемой функцией правки. См. {MOUSE PAINTING} о том, как применять правки локально с помощью мыши. - - TOPIC: МЕНЮ ВОССТАНОВЛЕНИЯ - - TOPIC: РЕЗКОСТЬ +image: sharpen.png - Эта функция имеет пять методов повышения резкости размытого изображения и метод для устранения смазанности от движения камеры или объекта во время экспозиции. - Выберите метод, задайте параметры, нажмите [применить] и подождите несколько секунд, чтобы увидеть результат. Вносите изменения и повторяйте процесс до получения удовлетворительного результата. Используйте {ВЫБОР ОБЛАСТИ}, чтобы обрабатывать разные части изображения разными методами и параметрами. - Для всех методов выбирайте небольшой радиус для слегка размытых изображений и большие значения для изображений худшего качества. «Величина» управляет силой изменения. «Порог» подавляет изменения для пикселей с низким контрастом: более высокие значения снижают усиление мелких неоднородностей (шум изображения, неровные тона кожи и т. д.). - Нерезкое маскирование: классический метод, встречающийся в большинстве редакторов изображений. Техническое описание можно найти в интернете. Этот метод может создавать заметные «ореолы» вокруг краёв с высоким контрастом. - Усиление контраста: усиливает существующий контраст. Эффективность сравнима с нерезким маскированием, но «ореолы» уменьшены. - Кувахара: небольшие окрестности вокруг каждого пикселя сравниваются друг с другом. Пикселю присваивается средний цвет окрестности с наименьшей разницей. Это заставляет пиксели на размытом крае соответствовать одной или другой стороне края. Края становятся очень резкими. Изображение может выглядеть «блочным» при использовании большого радиуса. Тонкие детали могут быть потеряны. - Разница медианы: яркость пикселя сравнивается с медианой пикселей в пределах радиуса. Яркость увеличивается или уменьшается для пикселей, соответственно более ярких или более тёмных, чем среднее окрестности. Эффективность сравнима с нерезким маскированием, но «ореолы» значительно уменьшены. Это единственный метод, который обрабатывает каждый цвет RGB отдельно. Он может повысить резкость цветового перехода даже при небольшом изменении яркости. - Ричардсон-Люси: изображение приобретает резкость с помощью метода деконволюции Ричардсона-Люси. Этот метод может давать лучшие результаты, но также довольно медленный. Чтобы ускорить процесс, начните с выбора небольшой, но насыщенной деталями области изображения с помощью {ВЫБОР ОБЛАСТИ}. Подберите оптимальный радиус и количество итераций на этой небольшой области. Затем используйте те же настройки для всего изображения. Шум на изображении будет снижать эффективность. Если это так, используйте {ШУМОПОДАВЛЕНИЕ} заранее. - Изображение, увеличенное ровно в 2 раза, можно резче сделать с помощью Ричардсона-Люси, используя радиус 2.0 и 4 или более итераций. Результаты на удивление хороши. - ^Исправление смазанности движения +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - Вручную оптимизируйте изображения с небольшой смазанностью от движения камеры или объекта. Смазанность от движущегося объекта на в остальном резком изображении можно обработать с помощью {ВЫБОР ОБЛАСТИ}, чтобы изолировать объект. Предполагается, что смазанность линейна и имеет постоянную скорость. Входные данные - это 'протяжённость смазанности' в пикселях и 'угол смазанности' в градусах. Начальную оценку угла можно задать, зажав shift и перетащив мышь по изображению в направлении смазанности (может совпадать или быть противоположным фактическому движению). Введите оценку протяжённости смазанности, используя Инструменты > Показать RGB, чтобы измерить ширину смазанности вдоль какого-либо яркого края элемента изображения. Настройте входные данные, нажмите [применить] и осмотрите изображение, чтобы найти оптимальные настройки. Время отклика может быть медленным для большого изображения. Вы можете ускорить процесс, используя {ВЫБОР ОБЛАСТИ}, чтобы выбрать небольшую размытую область для оптимизации протяжённости и угла, затем очистить область, чтобы обработать всё изображение с теми же настройками. Алгоритм может создавать шум «звона», который можно подавить с помощью ввода 'подавление звона'. Лучше всего сначала оставить значение подавления низким, чтобы найти оптимальную протяжённость и угол, а затем добавить подавление по мере необходимости, чтобы уменьшить звон. Используется одномерный метод деконволюции Ричардсона-Люси. - ^Смазанность движения цифровой камеры Не все размытые фото имеют смазанность с постоянной скоростью, наиболее подходящую для этого метода. Изображение может быть суперпозицией нескольких более коротких экспозиций. Всё изображение может быть экспонировано не одновременно и иметь одинаковую смазанность (механический или электронный движущийся затвор). Этот метод всё же может давать лучшие результаты, чем инструменты повышения резкости, работающие в двух измерениях. Он должен работать лучше на старых фото, сделанных плёночными камерами, где смазанность от движения ближе к постоянной скорости. - - TOPIC: РАЗМЫТИЕ +image: blur.jpg - Выберите метод с соответствующим флажком, введите нужные параметры, нажмите [применить]. Если активен {ВЫБОР ОБЛАСТИ}, затрагиваются только выбранные области. - ^Обычное размытие Смешивает каждый пиксель с окружающими пикселями в пределах радиуса. Более близкие пиксели имеют больший вес. Вы можете задать радиус равным 1 и нажимать [применить] многократно, чтобы медленно увеличивать размытие, наблюдая за результатом на изображении. - Вы можете при желании размывать на разную величину по горизонтали и вертикали, если введёте отдельные горизонтальные и вертикальные значения. Ввод [радиус] задаст одинаковые значения для обоих направлений. - ^Радиальное размытие Смешивает каждый пиксель с пикселями вдоль линии от выбранного центра. Радиус определяет центральную область, которая не размывается. Длина задаёт диапазон линии размытия: от 0 до длины, от центра к краю. Выберите центр, щёлкнув по изображению. - ^Направленное размытие Потяните позицию на изображении с помощью мыши. Область вокруг мыши будет размыта в этом направлении. Протяжённость определяет размер размываемой области. Интенсивность определяет силу размытия. - ^Плавное размытие Размываются только пиксели с меньшим контрастом, чем заданный предел контраста, и радиус размытия варьируется от 1 до заданного значения для пикселей с соответствующим контрастом, варьирующимся от заданного предела до нуля. Короче говоря: пиксели с низким контрастом размываются больше, чем пиксели с высоким контрастом. Это можно использовать, чтобы сгладить тона кожи, не размывая волосы и не уменьшая блеск в глазах. В крайнем случае это создаёт эффект «мультфильма». - ^Размытие фона (боке) Размыть области фона изображения, оставив передний план резким. Выберите одну или несколько областей, которые должны остаться резкими {ВЫБОР ОБЛАСТИ}. После выбора областей переднего плана инвертируйте выделение, чтобы теперь был выбран фон {ИНВЕРТИРОВАТЬ ОБЛАСТЬ}. Это область, которая будет размыта. Доступны два метода размытия: постоянное размытие: для всех размываемых областей используется постоянный радиус размытия. Увеличение размытия с расстоянием: используется минимальный радиус размытия для пикселей, соседствующих с передним планом, и максимальный радиус размытия для пикселей на максимальном расстоянии от переднего плана. Для этого требуется вычислить расстояние до края для всех пикселей фона, что может занять значительное время. Радиус размытия можно менять без пересчёта расстояний до края. - - TOPIC: ШУМОПОДАВЛЕНИЕ +image: denoise.jpg - Уменьшить шум на фото, снятых в условиях слабого освещения (высокое ISO), из-за которого однородные поверхности выглядят зернистыми. Предусмотрено два метода: «Медиана» и «Сглаживание». Лучший метод зависит от шума и характеристик изображения. Смешивание методов (использование сначала одного, затем другого) может быть полезным. Значение «Радиус» определяет окрестность пикселей, которая будет использоваться для сравнения и коррекции данного пикселя. Большое значение (радиус > 2) более эффективно уменьшит шум, но также может привести к потере деталей. Значение предела приведёт к тому, что пиксели со значениями яркости RGB, отличающимися от медианы окрестности более чем на эту величину, будут игнорироваться. Это необходимо для некоторых изображений, чтобы предотвратить восприятие крошечных ярких деталей как шума - например, астрономических фото. - Задайте значение «Радиус» и нажмите одну из кнопок метода. Каждая итерация использует предыдущее изображение как отправную точку, поэтому несколько итераций постепенно подавят шум и, возможно, немного размоют некоторые детали. Используйте [сброс], чтобы начать заново. «Медиана» с радиусом 1, за которой следует «Медиана» с радиусом 2, - хороший компромисс между подавлением шума и сохранением деталей. - Ползунок «Области» можно использовать, чтобы ограничить обработку только тёмными областями или более широким диапазоном областей. Тёмные области, как правило, больше подвержены проблеме шума, чем светлые. - Если вы видите, что некоторые крошечные крапинки шума сохраняются, увеличьте значение предела, используйте кнопку [сброс] и продолжите с [медиана] или [сглаживание]. - Вы можете применять разную обработку в разных областях изображения - см. {ВЫБОР ОБЛАСТИ}, а также можете «закрашивать» изображение, используя разную обработку в разных областях - см. {ПРАВКИ КИСТЬЮ}. - Каждый цвет RGB обрабатывается независимо. Отдельной обработки цветности или светлоты не выполняется. - Кнопка [measure] запускает диалог справа для измерения фактического уровня шума изображения. Проведите мышью по изображению, чтобы увидеть уровни шума RGB в пределах круга мыши (радиус 10, около 300 пикселей). Это должна быть однородная область без текстуры, чтобы единственным изменением был шум. Осмотрите изображение при 4-кратном размере, чтобы убедиться, что вы видите шум, а не текстуру. Точки показывают отдельные значения RGB пикселей относительно среднего значения окружающих 5x5 пикселей, представленного центральной сплошной линией. Числа внизу показывают среднюю яркость RGB и уровни шума по шкале 0-255. Шкала графика от -10 до +10, а пунктирные линии на -5 и +5, относительно общего диапазона 0-255. Шум в 9-м или 10-м бите RGB составляет 0,5 или 0,25 по этой шкале. - ^Шум изображения RAW Чтобы измерить шум сенсора камеры, используйте изображение RAW. Изображения JPEG обрабатываются внутри камеры для уменьшения шума. Вы можете быть удивлены типично высокими уровнями шума в изображениях RAW. Даже дорогие камеры с большими сенсорами могут иметь менее 8 бит малошумного цвета. Когда вы фильтруете шум из изображения RAW, вы соревнуетесь с электроникой и программным обеспечением, создающими JPEG камеры. Превзойти их может быть непросто. - - TOPIC: УДАЛЕНИЕ ДЫМКИ +image: defog.png +image: defog2.jpg - Удалить дымку/туман на изображении или в выбранной области. Есть и другие инструменты для этого (выравнивание гистограммы, локальный контраст, усиление контраста, retinex, насыщенность), но удаление дымки/тумана - вторичная функция по отношению к их основному назначению. Эта функция атакует дымку/туман напрямую: она удаляет равные количества цвета R/G/B (снижая яркость и увеличивая насыщенность) и при необходимости возвращает потерянную яркость. Она также может уменьшить синий цвет, если он становится слишком доминирующим, что часто происходит с далёкой дымкой. Возможно, вам понадобится использовать {ВЫБОР ОБЛАСТИ} или {ПРАВКИ КИСТЬЮ}, чтобы точно нацелиться и оптимизировать нужные области. В примере выше использовались две области: холмы переднего плана и гора на заднем плане. - - TOPIC: КРАСНЫЕ ГЛАЗА +image: red-eyes1.png +image: red-eyes2.png - Уменьшить эффект красных глаз от фото со вспышкой. Предусмотрено два метода. Первый быстрее, но может не справиться со сложными случаями. Второй метод более надёжен, но также требует больше времени и внимания. Чтобы использовать первую функцию, щёлкните левой кнопкой по красному глазу один или несколько раз, пока результат не устроит вас. Если затемнённая область слишком мала или смещена от центра, щёлкните правой кнопкой, чтобы отменить изменение, а затем щёлкните левой кнопкой более точно по центру красного глаза. Если красный глаз не удаётся исправить правильно, щёлкните правой кнопкой, чтобы отменить изменение, а затем используйте второй метод. Второй метод может лучше справляться с более сложными случаями, где красный глаз лишь слегка красный, а разница в цвете с веками слишком мала, чтобы автоматический алгоритм мог её различить. Поместите курсор в центр красного глаза. Удерживайте левую кнопку мыши и перетащите курсор вниз и вправо. Появится пунктирный эллипс, охватывающий красный глаз. При необходимости повторите, чтобы (примерно) центрировать красный глаз в эллипсе. Обратите внимание, что форма эллипса зависит от направления перетаскивания, что позволяет более точно охватить только красный глаз. Щёлкайте левой кнопкой внутри эллипса многократно, наблюдая, как красный глаз темнеет, и остановитесь, когда он станет достаточно тёмным. Если вы зайдёте слишком далеко, веки могут начать темнеть. Щёлкните правой кнопкой, чтобы отменить, и повторите при необходимости. - - TOPIC: УМНОЕ УДАЛЕНИЕ +image: smart-erase.png +image: smart-erase2.jpg - Стирайте небольшие объекты, которые могут испортить хорошее фото, такие как провода, мусор на земле, знак и т. д. Нежелательный объект заменяется пикселями, взятыми из окружающей области. Это иногда очень эффективно (побочные эффекты почти незаметны), а иногда нет. Лучше всего работает для небольших или узких объектов на фото. «Радиус» управляет размером круга вокруг указателя мыши, определяя область для выбора и стирания. Перетащите мышь, чтобы охватить объект, который нужно удалить. Перетаскивание левой кнопкой выбирает, правой кнопкой - снимает выбор. Нажмите [Стереть], чтобы стереть выбранную область, заменив пиксели ближайшими пикселями снаружи выделения. Если выделение было недостаточно точным, используйте [Отменить], скорректируйте выбранную область и снова нажмите [Стереть]. Повторные выделения и стирания будут накапливаться, пока вы не используете [New_Area], чтобы начать новое выделение. Предыдущие стёртые области теперь зафиксированы, и [Отменить] будет работать только для последующих выделений. Лучше всего работать с изображением, увеличенным до 200% или более. Элемент управления «Размытие» добавляет размытие к заменяющим пикселям. Это может уменьшить видимые побочные эффекты, поскольку заменяющие пиксели могут быть резче окружения. Измените настройку «Размытие» и повторите нажатие кнопки [Стереть]. Кнопки [show] и [hide] можно использовать, чтобы показать контур текущего выделения или скрыть его для лучшей оценки результатов после стирания. - Для длинных тонких объектов (например, проводов) вы можете щёлкнуть в двух позициях, и всё между ними будет выбрано. Выделение работает по прямой линии, поэтому для изогнутых объектов вам нужно будет щёлкать через интервалы, чтобы следовать по кривой. - - TOPIC: УДАЛИТЬ ОРЕОЛ +image: remove-halo.png +image: remove-halo2.png - Удалить ореолы, оставленные некоторыми функциями правки. Выберите тип ореола: яркий (наиболее распространённый) или тёмный. Перетащите мышь левой кнопкой по области ореола, чтобы изменить пиксели внутри мыши, как показано в примере. Для яркого ореола самые яркие пиксели будут темнеть по мере перетаскивания мыши по ним. Для тёмного ореола самые тёмные пиксели будут светлеть. Используйте радиус мыши больше, чем ширина ореола, как показано в примере. Перетащите мышь правой кнопкой, чтобы восстановить исходные пиксели. - - TOPIC: АРТЕФАКТЫ JPEG +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - Изображения JPEG, которые были сильно сжаты (с низким качеством), могут показывать артефакты сжатия в виде небольших прямоугольных блоков. Если в некоторых областях фото диапазон яркости был расширен, такие блоки могут стать более заметными, поскольку шаги яркости становятся больше (например, значения RGB 11/12/13, увеличенные в 5 раз до 55/60/65). Эта функция размывает границы между блоками, чтобы сделать их менее заметными. - 'Предел соответствия' определяет, когда соседние пиксели считаются членами одного и того же пиксельного блока. «Предел соответствия» можно задать более низким значением, чтобы такие блоки были определены более полно. «Предел контраста» служит для предотвращения смешивания краёв с высоким контрастом, вызывающего потерю деталей. Измените обе настройки и нажмите [применить]. Просмотрите получившееся изображение при увеличении >2x и попробуйте разные настройки, если важна оптимизация. Эта функция будет менее эффективной на изображении, которое было масштабировано. Используйте {ВЫБОР ОБЛАСТИ}, чтобы выборочно обработать проблемные области. - - TOPIC: СГЛАЖИВАНИЕ +image: anti-alias.jpg - Иногда на фото видна пикселизация («зазубрины») вдоль некоторых краёв элементов с высоким контрастом. В примере выше это видно вокруг глаза птицы. Инструмент сглаживания может уменьшить это. Эффект незначителен на большинстве фото, где обработка внутри камеры уже могла решить проблему. Побочный эффект в том, что артефакты jpeg на сильно сжатых изображениях несколько сглаживаются. Изображения, увеличенные в размере, будут иметь более выраженную пикселизацию. Это можно исправить, особенно в случае 2-кратного увеличения. - Используйте кнопку [применить], чтобы подавить пиксели, при необходимости несколько раз, если это помогает. «Порог» можно использовать, чтобы исключить пиксели с низким контрастом из обработки. Обычно лучше всего значение 0,1 или меньше. - Fotocx использует алгоритм Scale3x, изменённый для использования «похожих» и «различных» цветовых тонов вместо «равных» и «неравных». - - TOPIC: НАСТРОЙКА RGB +image: adjust-RGB.png - Изменить общую яркость и контраст, либо яркость и контраст выбранных цветов. • Яркость - увеличить или уменьшить общую яркость изображения • +Красный -Голубой и т. д. - изменить яркость цвета и изменить дополнительный цвет в противоположном направлении • Контраст (все) - увеличить или уменьшить общий контраст изображения • Контраст красного, зелёного, синего - обработать отдельные цвета RGB - - TOPIC: НАСТРОЙКА HSL +image: adjust-HSL.png - Изменить выбранный диапазон цветов на изображении с помощью HSL (тон, насыщенность, светлота). Эту функцию можно использовать, чтобы исправить цветовой оттенок или изменить один цвет на другой (например, пересвеченное небо - слишком белое). Если вы незнакомы с цветовой моделью HSL, прочитайте статью в Википедии об этом. - Начните с выбора целевого цвета изображения для сопоставления и настройки, зажав shift и щёлкнув левой кнопкой по изображению. Этот цвет будет центром диапазона цветов, который будет выбран для настройки. Выберите, какие атрибуты цвета будут сопоставляться, с помощью флажков тона, насыщенности и светлоты. Каждый из них сузит диапазон выбранных цветов. Если ни один не отмечен, выбираются все цвета. Уровень соответствия можно использовать, чтобы дополнительно расширить диапазон выбранных цветов. 100% означает, что выбираются только близко совпадающие цвета. - Элементы управления «Выходной цвет» (тон, насыщенность, светлота) используются, чтобы задать новый выходной цвет, который заменит или смешается с выбранными входными цветами. Вы также можете задать этот цвет с изображения, зажав shift и щёлкнув правой кнопкой. Получившийся цвет будет смесью исходного цвета и нового цвета. Доля нового цвета задаётся ползунком «Настройка», который можно установить от 0 до 100%. Используйте флажки HSL, чтобы определить, какие компоненты HSL входного цвета заменяются соответствующими компонентами HSL выходного цвета. Используйте ползунки для HSL выходного цвета, чтобы настроить новый цвет. Выходной цвет показан в меньшем поле слева, которое обновляется по мере перемещения ползунков. - Двигайте ползунки и наблюдайте за живым обновлением изображения, чтобы оптимизировать результат. Это не очень интуитивно, и практика поможет. Подсказка: начните с сопоставления по тону и насыщенности, заменяя только тон - это означает, что насыщенность и светлота выходного цвета будут скопированы из исходных цветов изображения, и заменён будет только тон. - - TOPIC: УДАЛИТЬ ПЫЛЬ +image: remove-dust.png +image: remove-dust2.jpg - Изображения, полученные из запылённых сканированных слайдов, могут иметь много мелких тёмных точек - теней от пыли на слайдах. Исторические фото из интернета часто имеют похожую проблему. Эта функция может удалить большинство таких точек. Двигайте три ползунка, пока максимальное количество пылевых точек не будет окрашено красным, затем нажмите кнопку [стереть], чтобы стереть их. Нажмите [red], чтобы вернуть красный вид, затем вы можете снова настроить ползунки и нажать [стереть]. Ползунок «предел размера пятна» ограничивает размер точек, которые будут стёрты. Ползунок «макс. яркость» задаёт порог для игнорирования точек, недостаточно тёмных. Ползунок «мин. контраст» отфильтровывает точки с низким контрастом относительно окружения. Этот процесс обычно является компромиссом. Если настройки не оптимальны, могут быть стёрты мелкие детали, такие как листья деревьев, либо крупные точки могут остаться на месте. Разным частям изображения может потребоваться разная настройка, например небо можно обрабатывать более агрессивно, чем стену здания. Вы можете просто использовать «Удалить пыль» несколько раз с разными настройками по мере необходимости, чтобы убрать все пылевые точки. Или вы можете использовать {ВЫБОР ОБЛАСТИ}, чтобы обработать изображение по частям. Если некоторые точки не поддаются, вы можете обработать их вручную с помощью {УМНОЕ УДАЛЕНИЕ}. Задайте небольшой радиус мыши и щёлкайте по каждой точке, чтобы удалить её. Точки от волокон (длинные и тонкие) обычно не удаляются автоматически, но «Умное удаление» может быть здесь эффективным. Если пыль светлая, как в примере выше, используйте {ЦВЕТОВОЙ РЕЖИМ}, чтобы сделать цветной негатив, обработайте пыль, а затем повторите цветной негатив, чтобы восстановить нормальное изображение. - - TOPIC: ОКАНТОВКИ +image: fringes.png +image: fringesA.jpg - Исправить периферийные цветовые окантовки (боковую хроматическую аберрацию) - когда цветовые окантовки появляются в основном по внешним краям изображения. - Левое изображение выше - это увеличенная вырезка верхнего левого угла фото с боковой хроматической аберрацией. Она была в основном устранена на обработанном изображении справа. Цветовые окантовки могут появляться вдоль краёв с высоким контрастом, особенно во внешних областях изображения, где искажения объектива обычно наибольшие. Чтобы избавиться от них, увеличьте изображение до максимального размера и отцентрируйтесь на области с цветовыми окантовками. Нажмите кнопку [search]. Красная и синяя цветовые плоскости масштабируются заново, чтобы лучше совпасть с зелёной плоскостью, и используемые коэффициенты вносятся в диалоговое окно. Вы можете улучшить результат, изменяя коэффициенты напрямую в диалоге: меняйте коэффициенты, наблюдая за цветовыми окантовками на изображении. - Эта функция будет менее эффективной, если изображение было обрезано так, что центр изображения больше не совпадает с центром исходного фото. - - TOPIC: МЕНЮ УЛУЧШЕНИЯ - - TOPIC: ВЫРОВНЯТЬ ГИСТОГРАММУ +image: flatten1.jpg +image: flatten2.jpg - Увеличить видимую детализацию в областях с плохим контрастом. Яркость пикселя настраивается вверх или вниз, чтобы сделать распределение яркости (гистограмму) для области вокруг пикселя более равномерным. Меньший радиус (меньшая область) усилит эффект. Есть 5 зон яркости от самой тёмной (1) до самой яркой (5). Двигайте ползунок, чтобы усилить эффект для соответствующей зоны. Используйте ползунок зоны A, чтобы двигать все 5 ползунков вместе и быстро задать начальный результат. Затем используйте остальные ползунки по отдельности, чтобы точно настроить изображение. - - TOPIC: ЛОКАЛЬНЫЙ КОНТРАСТ +image: localcon1.jpg +image: localcon2.jpg - Увеличить контраст в каждой области изображения. Яркость каждого пикселя сравнивается со средней яркостью окружающей области. Яркость пикселя настраивается, чтобы увеличить эту разницу. Эта функция реализует широко используемый учебниковый метод. Радиус определяет размер области вокруг каждого пикселя, используемой для средней яркости. Мощность определяет величину изменения яркости. Цвет используется для увеличения насыщенности цвета. Вы можете использовать редактируемую кривую, чтобы осветлить выходное изображение для выбранных уровней яркости. Пример показывает осветление более тёмных областей изображения. - «Локальный контраст» может создавать «ореолы» при некоторых обстоятельствах: +image: localcon3.jpg - Исходное изображение слева. К среднему изображению «Локальный контраст» применён на максимальной мощности. Ореол виден вдоль границы между тёмными холмами и более светлым небом. Это можно исправить простым приёмом (правое изображение). Выберите область неба отдельно, используя {ВЫБОР ОБЛАСТИ}. Примените «Локальный контраст» к этой области. Инвертируйте выделение и примените «Локальный контраст» к остальной части изображения. - - TOPIC: УСИЛЕНИЕ КОНТРАСТА +image: amplify-contrast.png +image: amplify-contrast2.jpg - Увеличить видимый диапазон яркости изображения, увеличивая локальный контраст. Это может увеличить области с низким контрастом, не меняя области с высоким контрастом. Вы также можете использовать редактируемую кривую, чтобы изменять усиление контраста в зависимости от исходной величины контраста. - Ползунок «Усилить» под кривой регулирует вычисление, от отсутствия усиления контраста до полного усиления. Если сдвинуть слишком далеко вправо, изображение может показать неприятные артефакты, поэтому сдвиньте обратно, пока они не исчезнут. Если однородные области (например, небо) становятся пятнистыми, потяните левый конец кривой вниз, чтобы уменьшить усиление для областей с низким контрастом. В некоторых случаях лучше всего выбрать разные области изображения и обработать их отдельно, например консервативно для неба, более агрессивно для текстурированных поверхностей вроде каменных стен. - - TOPIC: ГЛОБАЛЬНЫЙ RETINEX +image: global-retx.png +image: global-retx2.jpg - Улучшить цвет и контраст для изображений с сильной дымкой/туманом или цветовым оттенком (например, 100-летнее фото). Сначала попробуйте кнопку [Auto]. Изображение сканируется, чтобы найти самые яркие и самые тёмные присутствующие цвета RGB. Самые тёмные значения RGB вычитаются из всех пикселей, и получившиеся значения RGB масштабируются вверх так, чтобы максимальные значения RGB были около 255. Конечно, это может быть не оптимально изначально. Кнопки-счётчики устанавливаются на найденные пределы тёмного и белого RGB, и вы можете изменить их, чтобы оптимизировать получившееся изображение. Вы можете выбрать свои собственные тёмную и яркую точки, выбрав соответствующую опцию в диалоге и щёлкнув по изображению. Кнопки-счётчики множителя по умолчанию установлены на 1.0, и вы можете изменить эти значения, чтобы настроить относительную яркость каждого цвета RGB. В примере выше 1-е изображение - исходное, 2-е изображение сделано с помощью кнопки [Auto]. Крайний правый столбец кнопок-счётчиков будет настраивать все кнопки в той же строке вместе - используйте колесо мыши или клавиши стрелка вверх/вниз на клавиатуре. - Ползунок смешения используется, чтобы смешать входное изображение и изображение retinex в любом соотношении. Ползунок «уменьшить яркие участки» используется, чтобы ослабить эффект для более ярких областей изображения, особенно неба, где Retinex может давать странные на вид результаты. - Алгоритм был выведен из концепций, впервые опубликованных Эдвином Лэндом в 1970-х годах. Найдите в интернете 'retinex' для получения дополнительной информации. - - TOPIC: ЛОКАЛЬНЫЙ RETINEX +image: local-retx.png +image: local-retx2.jpg - Увеличить видимые детали в тёмных областях изображения и других областях с низким контрастом. Диапазон яркости зоны вокруг каждого пикселя используется, чтобы изменить масштаб яркости пикселя, как будто вся зона была масштабирована так, чтобы охватить весь диапазон яркости 0-255. «Локальный Retinex» может давать впечатляющие результаты там, где «Глобальный Retinex» слаб. - Ввод радиуса определяет примерный размер зоны вокруг каждого пикселя. Ползунок смешения используется, чтобы смешать входное изображение и изображение retinex в любом соотношении. Ползунок «уменьшить яркие участки» используется, чтобы ослабить эффект для более ярких областей изображения, особенно неба, где Retinex может давать странные результаты. Ползунок «уменьшить тёмные участки» делает то же самое для более тёмных областей изображения. Пример выше - это примерно 60% исходного изображения + 40% retinex. - - TOPIC: НАСЫЩЕННОСТЬ +image: saturation.png - Настройка насыщенности цвета в зависимости от яркости пикселя. Ось Y редактируемой кривой - насыщенность цвета, от отсутствия цвета (все значения RGB равны) до максимального цвета (наименьшее значение RGB равно нулю). Ось X кривой - яркость пикселя, от тёмного до максимальной яркости. Нейтральное положение (без изменения цвета) - это среднее значение, которое также является начальным значением. Пример: чтобы увеличить интенсивность цвета в тёмных областях изображения, поднимите левый конец кривой. Ползунок «Насыщенность» перемещает всю кривую вверх или вниз, не меняя её форму. - - TOPIC: МЯГКИЙ ФОКУС +image: soft-focus2.jpg +image: soft-focus.png - Применить классический эффект «мягкого фокуса» к фото. Это смесь резкого изображения и слегка размытого изображения. Настройка радиуса определяет степень размытия (протяжённость в пикселях), а настройка смешения задаёт долю размытого изображения в смешанном выходном изображении, от 0 до 100 процентов. Вы можете использовать {ПРАВКИ КИСТЬЮ} с этой функцией, чтобы варьировать эффект для разных областей изображения. - - TOPIC: ГРАДИЕНТ ЯРКОСТИ +image: brite-ramp1.png +image: brite-ramp2.png - Изменять яркость или цвет по изображению. Это можно использовать, чтобы компенсировать неравномерное освещение или цветовой оттенок, меняющийся по изображению. Направление изменения определяется рисованием линии на изображении. Создайте линию, щёлкнув по изображению, затем перетащите любой конец, чтобы задать нужное направление. В примере выше зелёный был увеличен в направлении линии. Сначала отредактируйте кривую «Все», чтобы настроить общую яркость (все цвета), затем при необходимости настройте отдельные кривые цветов RGB. - - TOPIC: ВИНЬЕТКА +image: vignette.png +image: vignette2.jpg - Исправить затемнение, иногда видимое в углах фото. Это также можно использовать, чтобы выделить или окрасить объект или область внутри изображения. - Щёлкните или перетащите мышь по изображению, чтобы изменить центр виньетки, изначально находящийся в центре изображения. - Выберите «Яркость», чтобы изменить яркость изображения радиальным образом: настройте левый или правый конец кривой, чтобы изменить яркость соответственно центра и краёв изображения. Вы можете сделать тёмное окружение для лица портрета, либо исправить изображение с затемнёнными углами. Средний уровень кривой соответствует отсутствию изменений. Используйте более низкие значения для затемнения и более высокие для осветления. Пример выше постепенно затемняет периферию изображения, оставляя широкую центральную область без изменений. - Выберите «Цвет», чтобы добавить выбранный цвет к изображению радиальным образом. Значения кривой, равные нулю, означают отсутствие изменений, а более высокие значения добавляют выбранный цвет к изображению. Наивысшее значение соответствует 100% цвета. Используйте эту функцию, чтобы добавить цветное окружение к изображению, например окружить лицо постепенно усиливающимся цветом. - - TOPIC: МЕНЮ ЭФФЕКТОВ - - TOPIC: КОНТУРЫ +image: outlines1.png +image: outlines2.jpg - Преобразовать фото в контурный рисунок. Пиксели с высоким контрастом усиливаются, а пиксели с низким контрастом подавляются. Настройка порога задаёт пороги контраста. Линии ниже минимума не показываются, а линии выше максимума будут иметь максимальную яркость. Флажок «чёрно-белое» преобразует цветные линии в чёрные на белом или белые на чёрном, в зависимости от флажка «негатив». Используйте «Слабое усиление», чтобы при желании осветлить выцветшие линии. «Режим B» даёт более равномерную яркость линий по сравнению с «Режим A». - - TOPIC: НАБРОСОК1 +image: sketch1.jpg - Преобразовать фото в нечто похожее на набросок. Тёмные пиксели объединяются в меньшее количество пикселей, оставляя освободившиеся области более светлыми. Контраст также может использоваться как замена тёмным пикселям. Порог можно использовать, чтобы отфильтровать входное изображение по яркости. Уровень отсечения используется, чтобы отфильтровать выход и дополнительно уменьшить изолированные или незначительно тёмные пиксели. Выберите цвета для переднего плана и фона. Уменьшение размера входного изображения может дать интересные результаты. Если результат выглядит «грязным», используйте {ШУМОПОДАВЛЕНИЕ} или {СЛИЯНИЕ}, чтобы сгладить изображение перед обработкой здесь. - - TOPIC: НАБРОСОК2 +image: sketch2.png +image: sketch2b.jpg - Преобразовать фото в нечто похожее на набросок. Используется другой метод: пиксели с низким ... высоким контрастом преобразуются соответственно в светлые ... тёмные пиксели. Кривую можно использовать, чтобы увеличить или уменьшить силу преобразования контраста. Шкала оси X - это контраст пикселя, от низкого до высокого, а значение по оси Y определяет силу преобразования. Пример показывает подавление пикселей с низким контрастом (осветление). Входное изображение можно подмешать в любом соотношении. Если результат выглядит «грязным», используйте {ШУМОПОДАВЛЕНИЕ} или {СЛИЯНИЕ}, чтобы сгладить изображение перед обработкой здесь. - - TOPIC: МУЛЬТФИЛЬМ +image: cartoon.jpg - Преобразовать фото в мультипликационный рисунок. Чёрные линии рисуются поверх краёв элементов изображения, везде, где яркость или цвет резко меняются. «Порог линии» задаёт чувствительность обнаружения краёв и рисования линий, вызывая рисование меньшего или большего числа линий. «Ширина линии» делает линии толще или тоньше. «Глубина Кувахара» управляет функцией повышения резкости, которая может усилить края элементов внутри изображения. - - TOPIC: ТИСНЕНИЕ +image: emboss2.jpg +image: emboss.png - Преобразовать изображение в имитацию рельефа или тиснения (эффект 3D). Края элементов делаются светлее с одной стороны и темнее с противоположной, как будто приподняты и освещены сбоку. Настройка радиуса определяет ширину эффекта, а настройка глубины определяет интенсивность. Настройка «Источник света» определяет угол, с которого исходит видимое освещение. Его можно менять, чтобы максимизировать эффект для краёв элементов, наиболее перпендикулярных этому углу. - - TOPIC: ПРОСМОТР МИНИАТЮР Преобразовать изображение в массив одноцветных плиток. Вы можете управлять размером плитки и толщиной зазора между плитками. Это также называется «пикселизация». Используйте «Выбор области», чтобы ограничить преобразование ограниченной областью, например лицом. - - TOPIC: ПЛИТКИ1 +image: tiles2a.png +image: tiles2b.png - Преобразовать изображение в неправильные плитки, примерно соответствующие цветам и контурам изображения. ^базовый размер:^ Базовый размер плитки, то есть размер единичной плитки, используемый для создания более крупных плиток. ^глубина цвета:^ Количество используемых цветов: 1 = 8 цветов, 2 = 64 цвета ... 8 = 16 миллионов цветов. ^цель области плитки^: Верхний предел размера плитки (площадь в пикселях). ^требуемое соответствие цвета^: Задайте минимальное соответствие цвета, требуемое для объединения меньшей области с соседней более крупной областью: 0 = неважно (максимальное объединение), 100 = требуется идеальное совпадение (минимальное объединение). - - TOPIC: ЖИВОПИСЬ +image: painting1.png +image: painting2.png - Преобразовать изображение в нечто похожее на живопись. Уменьшается количество цветов, отображается каждая смежная область пикселей одного цвета, а затем меньшие области объединяются с соседними более крупными областями с наилучшим совпадением цвета. - ^радиус размытия^: Размыть изображение перед обработкой. Это даёт более плавные границы. ^глубина цвета^: Количество используемых цветов: 1 = 8 цветов, 2 = 64 цвета ... 8 = 16 миллионов цветов. ^цель области заплатки^: Задайте нижний предел для областей, которые будут иметь собственный цвет: области меньше этого количества пикселей будут поглощены соседней областью с ближайшим совпадением цвета. ^требуемое соответствие цвета^: Задайте минимальное соответствие цвета, требуемое для объединения меньшей области с соседней более крупной областью: 0 = неважно (максимальное объединение), 100 = требуется идеальное совпадение (минимальное объединение). ^границы^: Определяет, будут ли цветные области очерчены тонкой чёрной границей, как неправильные плитки в мозаике. После использования этой функции применение {ТИСНЕНИЕ} может добавить интересную текстуру изображению. - - TOPIC: Обследовать все файлы +image: texture2.jpg +image: texture.png - Добавить текстурированную поверхность к изображению или выбранным областям внутри изображения. Радиус определяет размер узора текстуры. Сила определяет интенсивность узора, от почти невидимого до доминирующего. - - TOPIC: СЛИЯНИЕ +image: fusion.png +image: fusion2.jpg - Подавить мелкие детали с низким контрастом на изображении, сохраняя резкость более крупных элементов изображения. Нажмите [начать] и внимательно наблюдайте за изображением. Процесс выполняется непрерывно, пока не будет остановлен кнопкой [стоп]. Мелкие детали будут медленно исчезать. Метка «количество» в диалоговом окне показывает счётчик итераций. Вы можете [стоп] процесс, чтобы осмотреть изображение, а затем возобновить обработку с помощью [начать]. Используйте кнопку «Отменить/Повторить», чтобы сравнить состояние изображения до/после. Возобновите обработку с помощью [начать]. Кнопку [шаг] можно использовать, чтобы обрабатывать по одному шагу за раз. - - TOPIC: СОПОСТАВЛЕНИЕ ЦВЕТОВ +image: match-colors.png - Сопоставить цвета одного изображения с цветами другого. Небольшое пятно, выбранное щелчком мыши, берётся из каждого изображения в качестве образца. Пятно на 2-м изображении будет приведено к тому же среднему цвету (значения RGB), что и пятно с 1-го изображения. Коэффициенты, использованные для приведения значений RGB к одинаковым, затем применяются ко всем пикселям 2-го изображения. Типичное применение - удалить цветовой оттенок с изображения, отметив пятно на изображении, которое должно совпасть по цвету с другим изображением. - Процедура: диалог перечисляет 5 шагов, которые нужно выполнить по порядку. • Задайте радиус для области выборки пятна. Получившийся круг мыши - это область пятна, которая будет использована для выборки. • Откройте 1-е изображение, нажав кнопку [open]. • Щёлкните по изображению, чтобы взять образец цвета. • Откройте 2-е изображение, нажав кнопку [open]. • Щёлкните по изображению в том месте, которое вы хотите сопоставить с 1-м изображением. Цвета изображения изменятся в течение секунды-двух. - - TOPIC: УЗОР +image: pattern2.jpg +image: pattern1.png - Добавить фоновый узор к изображению. Небольшой файл изображения (файл узора) используется, чтобы покрыть текущее изображение, дублируя файл, как облицованную плиткой стену. Этот файл может быть настоящим узором (например, изображением ткани холста, кирпичной стены, повторяющейся геометрии ...) или любым другим видом изображения. Узор делается полупрозрачным, так что базовое изображение выглядит напечатанным поверх узора, либо узор поверх изображения. Многие файлы узоров можно найти, выполнив поиск в интернете "pattern image". Загрузите некоторые из них и при необходимости обрежьте их до размера около 200-500 пикселей. Для удобства добавьте их к прилагаемым файлам узоров в ~/.fotocx/patterns. - Используйте кнопку [Обзор], чтобы выбрать файл узора. Выбранный узор будет замощён, чтобы покрыть базовое изображение. Узор частично прозрачен, так что базовое изображение просвечивает. Используйте Zoom, чтобы увеличить или уменьшить размер узора. Есть два метода смешивания узора с базовым изображением. Непрозрачность узора можно задать от 0 до 100%. Базовое изображение используется, чтобы заполнить неиспользуемую непрозрачность. Контраст используется, чтобы изменить яркость базового изображения, используя яркость узора как шаблон. Оба параметра можно смешивать в любом соотношении. - Если файл узора содержит изображение, повторяющееся с фиксированными интервалами и по горизонтали, и по вертикали, кнопку [Вычислить] можно использовать, чтобы задать ширину и высоту для получения непрерывного узора без видимых швов. - Если узор неправильный и швы заметны, вы можете это улучшить. Два значения «Перекрытие» определяют, насколько дублированные узоры перекрываются по краям, по горизонтали и по вертикали. Добавьте немного перекрытия, чтобы замаскировать краевые эффекты. - «Выбор области» можно использовать, чтобы применить узор к части изображения, либо разные узоры к разным частям. После применения узора к изображению может быть интересно использовать {ТИСНЕНИЕ}, чтобы добавить 3D-эффект узору. - Флажок «Оттенки серого» преобразует цветной узор в оттенки серого. - - TOPIC: ШТРИХОВКА +image: crosshatch2.jpg +image: crosshatch1.png - Преобразовать изображение в рисунок с помощью пересекающихся параллельных линий. Введите размер сетки и нажмите [применить]. - - TOPIC: ДИЗЕРИНГ +image: dither1.png - +image: dither2.jpg - Эта функция предоставляет несколько способов дизеринга изображения - преобразования в точки. 0 - цветные точки в стиле Роя Лихтенштейна 1 - чистые R/G/B или чёрно-белые со случайным или оптимизированным пространственным распределением 2 - смешение RGB с заданной битовой глубиной 3 - классический дизеринг с использованием пользовательской цветовой палитры 4 - объединить изображение в пятна со средним цветом объединённых пикселей - Классические методы дизеринга используют метод Флойда-Стейнберга для компенсации цветовых ошибок: несовпадение между цветом входного изображения и ближайшим цветом из палитры. Точки с близкими цветами подмешиваются по мере необходимости, чтобы среднее значение по области более точно соответствовало входному цвету. Компенсацию ошибок можно отключить при желании, чтобы получить чёткие цветовые полосы или контуры. - Пятна: пиксели изображения претерпевают своего рода «гравитационный коллапс», сходясь в комки вокруг локальных центров массы. «Масса» определяется как яркость пикселя. Элемент управления «радиус» примерно определяет диапазон притяжения. Нажмите [начать], чтобы начать коллапс. Наблюдайте, как изображение медленно превращается в пятна примерно того размера, что задан вводом «радиус». Когда пятна становятся красивыми и круглыми и меняются очень мало, нажмите [стоп], чтобы завершить процесс. - - TOPIC: ГРАВИРОВКА +image: engrave.png +image: engrave2.png - Преобразовать изображение в чёрно-белые линии. Ввод «Размер» определяет толщину линий и то, сколько вертикальных пикселей изображения используется для каждого вертикального столбца пикселей в выходных линиях. Столбцы пикселей линий разделяются на чёрные и белые части, пропорция которых примерно соответствует средней яркости входных пикселей. Ввод «Смещение» можно использовать, чтобы оптимизировать общую яркость. Отрицательные/положительные значения делают изображение темнее/светлее. Ввод «Цвет» (0-100%) можно использовать, чтобы добавить цвет к белым частям. - - TOPIC: ДОБАВИТЬ БЛИКИ +image: addglare.png +image: addglare2.jpg - Добавить блики, расходящиеся от ярких точек на изображении. Мощность: определяет относительную яркость бликов Предел: пороговая яркость пикселя для излучения бликов Диапазон: диапазон пикселей для бликов от излучающих пикселей Пиксели с яркостью выше предела (200-255) будут излучать блики. Яркость здесь означает яркость самого яркого цвета RGB в пикселе. Излучаемый блик имеет цвет излучающего пикселя. Диапазон указан в пиксельных единицах. Блик будет максимальным на излучающем пикселе и постепенно спадёт до нуля на границе диапазона. - - TOPIC: МОЗАИКА +image: mosaic1.png +image: mosaic2.jpg - Создать изображение-мозаику, используя плитки, составленные из всех ваших изображений. - Укажите размер плитки в пикселях (например, 36 x 24) и нажмите [Плитки]. Плитки будут созданы из всех ваших изображений (на самом деле для скорости используются миниатюры). Если вы измените размеры плитки, нажмите [Плитки] снова, чтобы заново создать плитки. После создания плиток нажмите [Изображение], чтобы преобразовать текущее изображение в мозаику с использованием этих плиток. Плитки выбираются путём сопоставления среднего цвета плитки со средним цветом изображения в позиции плитки. Если доступны тысячи изображений и если диапазон цветов достаточно хорош, мозаика получится довольно хорошей. Увеличьте любую часть изображения, чтобы увидеть плиточные изображения. - Ползунок «Смешение плиток» приведёт к смешиванию изображения с плитками, что улучшит вид, если плитки плохо совпадают по цвету. Если смешение меньше примерно 50%, плитки остаются почти такими же чёткими, как раньше, поскольку глаз компенсирует ложный оттенок. - После создания мозаики вы можете щёлкнуть по любой плитке, чтобы получить увеличенное всплывающее изображение. Если открыта сохранённая мозаика, щелчок по плиткам для увеличенного изображения работать не будет. Повторное создание мозаики выполняется довольно быстро, так что сделайте это, если хотите, чтобы всплывающие окна работали. - - TOPIC: ДОБАВИТЬ ШУМ +image: add-noise.png - Добавить случайный цветовой шум к изображению. Задайте целевой размер пятна 1-10 и уровень шума 0-100%. При 100% случайный шум в диапазоне от -127 до +127 добавляется к каждому значению RGB каждого пикселя. Среднее значение равно нулю. Переполнения за пределами диапазона 0-255 усекаются. Средний цвет по большой области сохраняется, с наложенным шумом. Вы можете использовать «Добавить шум» вместе с «Выбором области» или «Правками кистью», чтобы добавить шум к выбранным областям. - ^Подавление «полосатости» В областях изображения, где распределение яркости было «растянуто», может возникать видимая «полосатость» в областях почти однородной яркости и цвета. Вы можете уменьшить эту проблему, добавив шум (или размытие) к затронутым областям. - - TOPIC: УСТАНОВИТЬ ЦВЕТА +image: set-colors1.jpg +image: set-colors2.jpg - Вы можете уменьшить количество цветов, используемых в изображении, чтобы создать эффект постера. Задайте каждый цвет RGB отдельно или настройте общее количество цветов. Битовая глубина цвета для этого не используется. Некоторые функции в Fotocx используют битовую глубину, ограничивая доступные цвета до 2, 4, 8 ... для каждого цвета RGB. Эта функция в этом отношении не ограничена. В примере выше используется 8 красных, 5 зелёных и 3 синих цвета. - - TOPIC: СМЕЩЕНИЕ ЦВЕТОВ +image: shift-colors.png - Эту функцию можно использовать, чтобы исправить цвета или преобразовать изображение в чужеродные цвета. Выберите любой из трёх цветов RGB и передвиньте ползунок влево или вправо от центра. Один из двух других цветов будет постепенно замещать выбранный. Например, вы можете постепенно заменить красный цвет зелёным или синим. Ползунок «Все» сдвигает все цвета вместе. Сделайте это сначала, чтобы найти первичный оптимум, затем сдвигайте цвета RGB по отдельности. - - TOPIC: ЧУЖЕРОДНЫЕ ЦВЕТА +image: alien-colors2.jpg +image: alien-colors1.png - Перекрасить изображение или выбранную область случайными чужеродными цветами. Вы можете управлять примерным размером узора и интенсивностью (от едва заметного до доминирующего). Нажмите [Применить], чтобы получить новое распределение цветов. - - TOPIC: ПОЛЬЗОВАТЕЛЬСКОЕ ЯДРО +image: custom-kernel.png - Применить пользовательское ядро свёртки к изображению. Лежащая в основе технология объясняется в Википедии. Введите размер ядра, коэффициент умножения, коэффициент сложения и заполните значения таблицы. [Применить] применяет ядро к изображению. [Сброс] восстанавливает исходное состояние изображения. Значения можно сохранить в файл и позже загрузить с помощью кнопок [Сохранить] и [Загрузить]. Изначально доступно несколько примеров файлов ядра. Вы можете изменить их и сохранить под пользовательским именем. - Математика: значения яркости для каждого блока пикселей N на N в изображении умножаются на соответствующие значения в матрице ядра и складываются вместе. Это число умножается на коэффициент умножения, и к нему добавляется коэффициент сложения. Это итоговое значение становится новым уровнем яркости для пикселя изображения в центре блока N x N. - - TOPIC: МЕНЮ ИСКАЖЕНИЯ - - TOPIC: ВЫПРЯМИТЬ +image: unbend1.png +image: unbend2.jpg - Панорамы близких объектов (обычно зданий или интерьеров помещений) могут показывать прямые линии, которые изогнуты, или здания, которые наклонены. Искажение изображений было необходимо в процессе создания панорамы, чтобы изображения совместились друг с другом. Функцию «Выпрямить» можно использовать впоследствии, чтобы выпрямить панорамное изображение при необходимости. Вертикальные и горизонтальные пунктирные линии рисуются поверх изображения, показывая оси выпрямления. Щёлкните или перетащите мышь около конца линии, чтобы переместить её. Если значения в четырёх элементах ввода изменены, изображение искажается способом, показанным соответствующими четырьмя изображениями. Увеличивайте или уменьшайте значения и повторяйте, пока не будете удовлетворены. Перемещайте оси, чтобы изменить центры искажения. - См. также {ИСКАЖЕНИЕ ИЗОБРАЖЕНИЯ} для другого метода исправления искривления изображения и перспективы. - - TOPIC: ПЕРСПЕКТИВА +image: perspective2.jpg +image: perspective1.png - Эту функцию можно использовать, чтобы выпрямить фото, снятое под смещённым углом. Изображение слева - это исходное фото, снятое справа от центра, чтобы избежать отражений. Изображение справа - выпрямленная версия. Эту функцию также можно использовать, чтобы выпрямить фото высокого здания, снятое с уровня улицы или сбоку. - Щёлкните по четырём углам тетраэдра, который вы хотите превратить в прямоугольник (в данном случае, четыре угла картины или рамы), затем выберите [Применить]. Щёлкнутые углы отмечены маленькими белыми прямоугольниками, содержащими "A, B, C, D". Верхний левый угол каждого прямоугольника точно отмечает позицию на изображении. Щелчок рядом с прямоугольником переместит его в новую позицию. Вы можете использовать клавиши стрелок на клавиатуре, чтобы перемещать маркеры углов шагами по 1 пикселю. Клавиши стрелок работают с последним углом, по которому щёлкнули или который переместили. - - TOPIC: ИСКАЖЕНИЕ ИЗОБРАЖЕНИЯ +image: warps4.jpg - - TOPIC: ИСКАЖЕНИЕ ОБЛАСТИ Эту функцию можно использовать, чтобы создавать искажения внутри изображения. Вы можете выбрать область изображения и перетащить мышь, чтобы растянуть эту область относительно остальной части изображения. Изображение подобно резине. Если перетаскивание мыши начинается внутри выбранной области, область искажается в пределах своих текущих границ - перемещение максимально в точке указателя мыши и уменьшается до нуля на краях области. Если перетаскивание мыши начинается за пределами выбранной области, края области рядом с мышью могут быть вытянуты за исходную границу области. Можно объединить много перетаскиваний мыши разной длины и направления, чтобы достичь нужного результата. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - Эта функция полезна для исправления проблем с перспективой. Перетащите изображение около угла с помощью мыши. Изображение эластично вытягивается от этого угла, в то время как остальные углы остаются неподвижными. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - Эта функция полезна для исправления проблем с перспективой. Перетащите изображение изнутри с помощью мыши. Внутренняя часть изображения эластично вытягивается, в то время как границы остаются неподвижными. - - TOPIC: ИСКРИВЛЁННОЕ ИСКАЖЕНИЕ Эта функция полезна для исправления проблем с перспективой (см. также {ВЫПРЯМИТЬ}). Перетащите изображение из любой позиции с помощью мыши. Всё изображение будет вытянуто или сжато в направлении мыши, но области рядом с мышью перемещаются больше, чем более удалённые области. Вы можете выпрямить изогнутые линии или намеренно изогнуть изображение. Элемент управления «диапазон искажения» определяет радиус искажения вокруг мыши. 1.0 означает, что искажается всё изображение, а меньшие значения ограничивают искажение меньшими областями вокруг мыши. - - TOPIC: ИСКАЖЕНИЕ АФФИННОЕ Эту функцию можно использовать, чтобы искажать изображение интересными способами. Перетащите изображение от угла или края с помощью мыши. Изменения чисто линейны, поэтому прямые линии остаются прямыми. Это преобразование называется «аффинным». Подробности можно найти при поиске в интернете. - - TOPIC: РАДИАЛЬНОЕ ИСКАЖЕНИЕ +image: warp_radial.png - Добавить или убрать бочкообразную или подушкообразную дисторсию. Бочкообразная дисторсия часто встречается в изображениях RAW, которые не были обработаны для устранения этого искажения. Щёлкните левой кнопкой, чтобы выбрать центральную точку, вокруг которой будут центрированы изменения - обычно центр изображения. Это значение по умолчанию. Передвиньте ползунок «растяжение», чтобы изогнуть изображение. - - TOPIC: РАСКРУТИТЬ КРУПНЫЙ ПЛАН +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - Фото крупного плана лица часто искажены, потому что области ближе к камере получаются на фото крупнее, чем более удалённые области. Эту функцию можно использовать, чтобы обратить искажение. Сначала используйте {ВЫБОР ОБЛАСТИ}, чтобы выбрать лицо (точность не требуется). Щёлкните по изображению около центра искажения (в примере выше: правая щека). Передвиньте ползунок для оптимизации. - - TOPIC: СОЗДАТЬ ВОЛНЫ +image: make-waves2.jpg +image: make-waves1.png - Эта функция искажает изображение в волновой узор, как будто рассматриваемый через бурную воду. Диалог позволяет изменить среднюю длину волны по горизонтали и вертикали, амплитуду и дисперсию. Ввод «перспектива» позволяет длинам волн постепенно увеличиваться сверху вниз. - - TOPIC: ЗАКРУЧИВАНИЕ +image: twist1.png +image: twist2.png - Эта функция закручивает изображение вокруг точки, выбранной щелчком или перетаскиванием мыши. Щёлкните по нужной позиции и передвиньте ползунок «Закручивание» на нужную величину. Вы также можете перетаскивать мышь по изображению, чтобы изменить центр закручивания. Ползунок «Центр» раскручивает центральную область относительно остальной части. Ползунок «Угол» поворачивает изображение. - - TOPIC: СФЕРА +image: sphere2.jpg +image: sphere.png - Сделать сферическую проекцию изображения. Перетащите мышь по изображению, чтобы изменить центр проекции (по умолчанию - средняя точка). Элемент управления «выровнять» постепенно изменяет проекцию от сферы (справа) до плоского изображения (слева). Ползунок «увеличение» увеличивает получившееся изображение до 2x. - - TOPIC: НАИЗНАНКУ +image: inside-out2.jpg +image: inside-out1.png - Эта функция инвертирует расстояния от центра до края для каждого пикселя. Вы можете щёлкнуть или перетащить мышь, чтобы изменить центральную точку. - - TOPIC: ХРОНОЛОГИЯ +image: tiny-planet.jpg - Обернуть изображение вокруг круга. Если изображение - это панорама на 360 градусов, видимого шва не будет. • Центральное отверстие: изображение оборачивается вокруг центрального отверстия. • Обрезать сверху: удалить верхнее поле из входного изображения. • Обрезать снизу: удалить нижнее поле из входного изображения. • Обратный R: отразить входное изображение по вертикали. • Обратная Тета: отразить входное изображение по горизонтали. • Повернуть: повернуть выходное изображение вокруг центра. - - TOPIC: СПИРАЛЬ ЭШЕРА +image: escher-spiral.png +image: escher-spiralA.png - Преобразовать изображение в бесконечную спираль, закручивающуюся внутрь, как знаменитые часы М. К. Эшера. «Ширина» определяет начальную ширину самого внешнего слоя. «Кайма» определяет начальную ширину границы, разделяющей слои, а «Цвет» определяет её цвет. Центр по умолчанию - это центр изображения. Щёлкните по изображению, чтобы задать новый центр. - - TOPIC: ВЫРОВНЯТЬ ФОТО +image: flatten-photo1.png +image: flatten-photo2.jpg - ^Страница книги или другая изогнутая поверхность Выровнять фото изображения на изогнутой поверхности, например вокруг колонны, или страницы из открытой толстой книги, где страницы изгибаются внутрь у центрального переплёта. Кривизна верхнего и нижнего краёв поверхности предоставляет информацию о величине кривизны и величине растяжения, необходимого, чтобы изображение выглядело плоским. Пример выше - толстая книга. Другие округлые поверхности можно исправить, например плакат на круглой колонне. - Выберите опцию верхней трассировки, чтобы обвести верхний край изогнутой страницы. Щёлкайте мышью вдоль края, создавая точку-маркер в каждой щёлкнутой точке. После того как доступны 4 точки, через них проводится изогнутая линия. Добавляйте больше точек и перетаскивайте точки по мере необходимости, чтобы линия точно соответствовала кривой изображения. Выберите опцию нижней трассировки и обведите нижний край таким же образом. Когда оба готовы, нажмите [flatten], чтобы выровнять страницу. Края теперь должны быть прямыми (или достаточно прямыми). Используйте ползунок [stretch], чтобы растянуть стороны изображения по мере необходимости, компенсируя боковое сжатие, вызванное кривизной. Используйте элемент управления «Расширить», чтобы расширить изображение по мере необходимости, восстанавливая правильное соотношение ширины/высоты. Кнопка [undo] восстанавливает неизменённое изображение, сохраняя точки-маркеры, которые затем можно скорректировать для повторной попытки. - +image: flatten-photo3.jpg - ^Изогнутый горизонт На широкой панораме или фото с широкоугольного объектива горизонт может оказаться не прямым или не горизонтальным. Изображение можно выпрямить (или иначе переместить), обведя кривую через горизонт или другие области, которые нужно выровнять по прямой линии. Выберите опцию верхней или нижней трассировки, в зависимости от того, находится ли горизонт (или другая часть изображения) в основном выше или ниже середины изображения. Изображение будет искажено так, чтобы сделать эту кривую прямой. Одной кривой достаточно. Вторая кривая добавляется автоматически к противоположному краю (верхнему или нижнему) изображения. Если результат неудовлетворителен, используйте кнопку [undo], скорректируйте маркеры на любой из кривых и попробуйте снова. Вы также можете сохранить изображение и применить функцию во второй раз, используя сохранённое изображение как отправную точку. - - TOPIC: МЕНЮ ОБЪЕДИНЕНИЯ Это функции, которые объединяют несколько файлов изображений. В случае перекрывающихся изображений соответствующие элементы каждого изображения выравниваются для совпадения с точностью до пикселя. Время выравнивания обычно составляет 10-30 секунд на изображение. Если вы видите, что процесс выравнивания идёт не так, вы можете использовать клавишу Escape, чтобы прервать процесс. - - TOPIC: HDR ^Высокий динамический диапазон +image: HDR.jpg +image: HDR-adjust.png - Объединить (наложить) несколько изображений одного и того же объекта с разными уровнями экспозиции. Объединённое изображение может показывать улучшенную видимость деталей как в более тёмных, так и в более светлых областях, фактически используя пиксели из более светлых изображений для тёмных областей, а из более тёмных изображений - для светлых областей. Если камера настраивается вручную между кадрами, старайтесь держать её ровно и направлять на одну и ту же удалённую точку. Некоторое несовпадение входных изображений допустимо. Если люди или предметы двигаются между кадрами, призрачных контуров не избежать. - Выберите функцию меню HDR и выберите до 9 изображений ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}), которые должны иметь почти одинаковые размеры в пикселях. Изображения выравниваются и объединяются автоматически. По завершении показывается объединённое изображение вместе с диалогом настроек. Вклад входных изображений показан в виде серии редактируемых кривых. Горизонтальная шкала представляет яркость пикселя, от тёмного до светлого. Каждая кривая представляет изображение, которое вносит вклад в выходные пиксели. Вклад изображения при заданном уровне яркости пропорционален высоте его кривой на этом уровне. Начальная кривая для самого светлого изображения будет высокой слева и низкой справа, что означает высокий вклад в тёмные пиксели и низкий вклад в светлые пиксели. Самое тёмное изображение будет низким слева и высоким справа, а остальные изображения - между ними. Кривые можно редактировать, перетаскивая их мышью. Соответствующий вклад изображений изменяется соответственно, и вы можете видеть результаты в реальном времени в выходном изображении. Изображение выше показывает два входных изображения и их выходное изображение. Пример диалога показывает три кривые, настроенные для оптимизации трёх входных изображений. - - TOPIC: HDF ^Высокая глубина резкости Объединить (наложить) несколько фото одного и того же объекта с разными настройками фокуса от ближнего до дальнего. Разные части объекта находятся в резком фокусе на каждом изображении. Объедините изображения так, чтобы все части объекта были резкими. - Съёмка фото: выберите точку для центра изображения. Наведите камеру на близкий объект и нажмите кнопку затвора наполовину, чтобы установить фокус на этом объекте. Удерживайте кнопку в положении наполовину, наведите камеру на выбранный центр и сделайте снимок. Теперь выберите более дальний объект и сделайте то же самое. Повторяйте с увеличивающимся расстоянием фокуса. Надеемся, каждая часть объекта резкая хотя бы на одном фото. Положение камеры должно быть почти одинаковым для всех фото, что может быть сложно, если объект очень близко. Движение камеры может вызвать проблемы с масштабированием и параллаксом (близкие объекты смещаются относительно дальних объектов). Такие проблемы можно позже исправить в Fotocx, но это может потребовать значительного времени. Лучше избегать этих проблем. - +image: HDF-paint.png - Обработка фото: выберите функцию меню HDF и выберите до 9 изображений ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). Изображения теперь будут выровнены максимально возможным образом. Выходное изображение - это равномерная смесь выровненных входных изображений. Небольшое движение камеры между фото компенсируется, но это ограничено, а сдвиги параллакса не компенсируются вовсе. Когда выравнивание завершено, открывается диалог. Вы можете выбрать любое входное изображение и «закрасить» им с помощью мыши любую область выходного изображения. Это преобразует исходную смесь изображений в единственное выбранное изображение для закрашиваемой области. Для каждой области или объекта на изображении выберите входное изображение, которое резкое в этой области. Радиус кисти можно задать больше или меньше, так что вы можете быстро закрашивать большие области и контролировать мелкие детали при необходимости. Если у вас есть перекрывающиеся близкие и дальние объекты, потребуется время и терпение, чтобы сделать их все резкими. Несовпадения можно исправить, выбрав опцию искажения в диалоге. Исходные изображения можно затем перетаскивать и искажать мышью, и объединённое выходное изображение изменяется соответственно. Искажение ограничено областью вокруг мыши. Когда закрашенная область перетаскивается, соответствующее входное изображение автоматически выбирается и перетаскивается, в то время как области, закрашенные другими изображениями, остаются неподвижными. Незакрашенные области нельзя перетаскивать. Перемещайтесь по разным областям и делайте постепенные перетаскивания, пока все не будут выровнены. - Предлагаемый порядок работы: в режиме закрашивания выбирайте каждое изображение по очереди и закрашивайте все области, которые выглядят резкими на этом изображении. Любые границы, которые плохо выровнены, будут явно видны как смещения на краях элементов изображения. Некоторые из них можно сделать неважными, изменив используемое для закрашивания изображение (если резким достаточно является больше одного изображения). В режиме искажения вносите точные корректировки по мере необходимости, чтобы устранить видимые смещения. - - TOPIC: СТЕК/ЖИВОПИСЬ +image: stack-paint.png - +image: stack-paint2.jpg - Наложить (совместить) несколько фото одного и того же объекта, снятых в разное время. Удалить туристов и машины, которые появляются и исчезают между кадрами. - Съёмка фото: наведите камеру на одну и ту же удалённую точку и сделайте несколько фото, пока туристы или машины перемещаются перед объектом. Постарайтесь получить два или более фото для каждой области объекта, не закрытой временными объектами. Держите камеру устойчиво и наводите на одну и ту же точку, чтобы изображения выровнялись точно. - Обработка фото: выберите функцию меню «Стек/живопись» и выберите до 9 изображений ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). Изображения теперь будут выровнены максимально возможным образом. Выходное изображение (внизу слева) - это равномерная смесь выровненных входных изображений (верхний ряд). Когда выравнивание завершено, открывается показанный выше диалог. Вы можете выбрать любое входное изображение и «закрасить» им с помощью мыши любую область выходного изображения. Единственное выбранное изображение используется для закрашиваемой области. Для каждой области на изображении выберите входное изображение, свободное от временных объектов. Радиус кисти можно задать больше или меньше, так что вы можете быстро закрашивать большие области и контролировать мелкие детали при необходимости. - Автоматическая работа: нажмите кнопку [Скрыть], чтобы посмотреть, можно ли автоматически удалить временные объекты. Это будет работать для областей изображения, где доступно несколько фото незакрытого фона (нижнее среднее изображение). Чтобы показать все временные объекты, нажмите кнопку [Краткий список] (нижнее правое изображение). Обычно это работает, но не идеально. Небольшие несовпадения изображений или различия в освещении (особенно движущиеся тени) могут заставить алгоритм выбрать пиксели фона вместо пикселей переднего плана. Вы можете использовать описанный выше метод закрашивания, чтобы вручную исправить ошибки. - - TOPIC: СТЕК/ШУМ +image: stack-noise2.jpg +image: stack-noise.png - Эта функция объединяет 2-9 фото одного и того же объекта. Фото должны быть почти одинаковыми, за исключением небольших смещений, вызванных съёмкой с рук. Если фото были сделаны с очень высоким значением ISO (условия слабого освещения), пиксели будут иметь значительный шум. Сделав много фото и усреднив их, можно в основном устранить шум. - Обработка фото: выберите функцию «Стек/шум» и выберите до 9 изображений ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). Они будут автоматически объединены и показаны, и откроется диалог. Начальное выходное изображение - это комбинация всех выбранных входных изображений, усреднённых вместе. Это означает, что значения RGB для каждого выходного пикселя - это среднее значений RGB соответствующих входных пикселей. Кнопка «медиана» изменит выходные пиксели на медиану входных пикселей (усредняются 1-3 средних значения RGB, в зависимости от количества изображений). Это может быть лучше или хуже, так что переключайтесь туда-сюда для сравнения. Флажки «отсечь нижний пиксель» и «отсечь верхний пиксель» приведут к тому, что самые низкие и самые высокие входные значения RGB будут отброшены перед усреднением. Это может убрать выбросы шума из смеси. Это не имеет эффекта, если выбран метод медианы. - - TOPIC: СТЕК/СЛОИ +image: stack-layers.png - Используйте эту функцию, чтобы объединить разные отредактированные версии изображения, где вы можете определить, какая версия показывается в выбранных областях изображения. Можно объединить любые изображения, имеющие одинаковые размеры в пикселях. - Выберите до 9 изображений одинакового размера. Начальное выходное изображение - это равное смешение всех входных изображений. Соотношения изображений - это относительные веса смешиваемых изображений. Их можно настроить, чтобы изменить вес каждого изображения. Пример: если 3 изображения объединяются с относительными весами 3, 5, 7, то объединённое изображение состоит из 3/15 от изображения №1, 5/15 от №2 и 7/15 от №3. Если выбрана опция «Закрасить всё изображение», веса можно настраивать, и выходное изображение реагирует немедленно. Если выбрана опция «Закрасить в пределах мыши», то мышь можно перетаскивать, и закрашивается только область в пределах круга мыши, используя текущие активные соотношения изображений. Скорость закрашивания управляется настройками «Мощность» для центра и края мыши. Используйте низкие значения, чтобы закрашивать постепенно. - - TOPIC: ПАНОРАМА +image: pano-align1.jpg +image: pano-align2.jpg - Эта функция сшивает 2-6 изображений вместе, чтобы создать широкоугольное изображение или панораму. Изображения должны перекрываться на 10% или более, чтобы программа могла найти, где они совпадают, и соединить их. Начните с выбора 2-6 файлов изображений ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). Полезно выбирать изображения в порядке слева направо, чтобы облегчить начальное грубое выравнивание. Изображения изначально соединяются и показываются с небольшим прозрачным перекрытием. Диалог предварительного выравнивания (выше) просит вас перетащить изображения в примерное соответствие. Перетащите изображения в правильный порядок слева направо. Перетаскиваемое изображение может перекрывать другие изображения. Чтобы было ясно, какое изображение перетаскивается, перетаскивайте его около центра изображения. После того как изображения расположены в правильном порядке, выровняйте каждое изображение с его левым соседом. Лучше всего действовать слева направо. Переместите изображение по горизонтали и вертикали в примерное соответствие с его левым соседом, затем при необходимости поверните изображение, перетащив нижний край влево или вправо - изображение поворачивается вокруг средней точки его перекрытия с изображением слева. Самый быстрый метод - сначала выровнять среднюю область перекрытия, затем при необходимости повернуть правое изображение, чтобы выровнять верхнюю и нижнюю области перекрытия. Крайняя точность НЕ обязательна. Изображения должны быть правильно изогнуты и хорошо соединяться. Если это не так, тогда 'lens mm' (фокусное расстояние, эквивалент 35мм) требует настройки. Кривизна изображения меняется при настройке lens mm. Начальное значение берётся из metadata EXIF, если доступно, и обычно этого достаточно. Если изображения не имеют кривизны (например, сканированные изображения), используйте флажок 'no curve', чтобы фактически установить 'lens mm' на бесконечность. - Если какие-либо из изображений были обрезаны, математика, зависящая от фокусного расстояния EXIF, не работает. Возможно, вы сможете это компенсировать, увеличив фокусное расстояние в 'lens_mm'. - Флажок 'manual align' будет использовать ручное предварительное выравнивание как окончательное выравнивание. Это для изображений, не имеющих чётких элементов, нужных для выравнивания изображений. Эта опция также позволяет изображениям иметь нулевое перекрытие. - Нажмите [proceed], когда предварительное выравнивание завершено, и программа выполнит точное выравнивание и соединит изображения. Внутри изображения сдвигаются и поворачиваются, и оценивается степень совпадения. Это делается с увеличивающимися размерами изображения, пока не будет найдено лучшее выравнивание. Это может занять минуту или больше, в зависимости от скорости процессора и размера изображения. Вы можете значительно ускорить процесс, если уменьшите входные изображения до 2/3 или 1/2 размера. Сделайте это также, если процесс не удаётся из-за нехватки памяти. - +image: pano-adjust.jpg - Когда точное выравнивание завершено, отображается объединённое изображение. Показанный выше диалог запускается для точной настройки яркости. Вы можете увидеть границу между изображениями, если они имеют разную яркость. Выберите изображение с помощью переключателей вверху. Используйте кнопку [автоцвет] многократно, чтобы автоматически улучшить соответствие яркости/цвета изображений. Базовым изображением является текущее выбранное. Попробуйте разные базовые изображения, чтобы увидеть, какое работает лучше всего. Если изображения сильно не совпадают по яркости, выберите наибольший выброс и используйте элемент управления яркостью, чтобы изменить яркость в соответствие с остальными, а затем [автоцвет]. Совпадение не обязательно должно быть очень хорошим, поскольку 'Ширина смешения' (далее) замаскирует оставшиеся различия. Используйте кнопку «Цвет файла», чтобы сбросить уровни яркости из входных файлов изображений. - Элемент управления 'Ширина смешения' определяет, как изображения смешиваются вместе: на перекрытиях изображений яркость изменяется на этом количестве пикселей, чтобы замаскировать дисбалансы, которые нельзя полностью исправить. Значение по умолчанию - 1 пиксель, что делает любую разницу в яркости очевидной. - Если изображения не выравниваются идеально, вы можете улучшить выравнивание, используя мышь, чтобы подтолкнуть изображения к выравниванию. Выберите 'Искажение мышью' и выберите одно из изображений переключателями. Затем перетащите мышь вдоль края изображения, где оно должно выровняться со своим соседом, перемещая изображение в соответствие. Изображение перемещается локально вокруг мыши, в то время как более удалённые части остаются неподвижными. Изображения со сдвигом параллакса потребуют компромисса, поскольку невозможно удержать выровненными одновременно и передний план, и фон. - Элемент управления «выровнять изображение» можно использовать, чтобы «выпрямить» изображение, что выпрямит изогнутые линии (например, изогнутые здания). Значение ноль не даёт эффекта, а значение 1.0 полностью выпрямит изображение. - По завершении используйте {ВЫПРЯМИТЬ}, {ИСКАЖЕНИЕ ИЗОБРАЖЕНИЯ}, {ОБРЕЗКА} и т. д. для окончательных корректировок. - ^Сканированные изображения Сканированные изображения можно объединить, если перекрытия достаточно. Отметьте 'no curve', поскольку кривизны нет. - ^Автоискажение Изображения слегка искажаются в различных направлениях во время выравнивания, чтобы найти наилучшее совпадение. Это делается, чтобы компенсировать сдвиги в горизонте камеры или повороте, вызывающие искажения изображения, снижающие качество совпадения. Если область перекрытия двух изображений включает крупный объект, который переместился между двумя фото, процесс выравнивания может «сойти с ума», пытаясь совместить изображения, делая выравнивание очень плохим. Выбрав 'no auto warp', вы можете добиться успешного выравнивания или меньшей ошибки. Другой вариант - выбрать ручное выравнивание. - ^Объединение панорам Вы можете создать панораму из до 6 изображений за один проход. Вы также можете объединять панорамы, которые совпадают по бокам, например объединить 4-изображенную панораму с другой 4-изображенной панорамой, чтобы получить 8-изображенную панораму. Вы должны отключить обычное искривление изображения при объединении панорам, поскольку панорамные изображения уже изогнуты (при условии, что вы не использовали опцию 'flatten' в финальном диалоге панорамы). Отключите искривление изображения, отметив флажок 'no curve' в диалоге предварительного выравнивания. - ^Ограничения панорамы Панорамы, включающие близкие объекты, могут быть сложными: при съёмке фото будьте осторожны, поворачивая камеру вокруг оси через объектив, с минимальным боковым движением, иначе изображения могут плохо выровняться, поскольку объекты переднего плана смещаются относительно фона (параллакс). Это не проблема, если объект находится на расстоянии 50+ метров, поскольку небольшое боковое движение мало влияет на изображение. Держите камеру ровно, чтобы избежать большого вертикального сдвига (сдвига горизонта), который может вызвать искажения изображения, которые могут быть исправлены не полностью. Избегайте поворота камеры по той же причине. - ^Вертикальная панорама Это можно сделать, повернув входные изображения на 90°. В «Панораме» выбирайте изображения по порядку сверху вниз, так чтобы верхнее изображение было слева, а нижнее - справа. Выполните панораму обычным образом. Поверните выходное изображение так, чтобы левое стало верхним. - - TOPIC: ПОКАЗАТЬ ФАЙЛЫ CIM Показать входные файлы для текущего или последнего объединённого изображения во всплывающем окне. Запоминается только текущий или последний набор. - - TOPIC: МОНТАЖ +image: mashup.jpg - Расположить несколько изображений и текст в макете. Изображения можно добавлять, изменять размер, поворачивать и перемещать, перетаскивая мышью. Изображения можно сделать полностью или частично прозрачными в выбранных областях. Можно добавлять текст, перемещать, изменять размер и поворачивать. Можно задать атрибуты текста: шрифт, размер, цвет, контур, тень, прозрачность. Можно добавлять линии и стрелки. Пример здесь показывает некоторые из возможностей. - +image: mashup1.png - В первом диалоге «Монтаж» выберите фоновое изображение или изображение макета, на котором будут размещены другие изображения. Выберите существующее изображение или создайте новое одноцветное изображение заданного размера и цвета. Вы также можете открыть ранее сохранённый проект монтажа и продолжить редактирование. - +image: mashup2.png - Второй диалог «Монтаж» - это выбор: редактировать изображения, редактировать текст, редактировать линии и стрелки, изменить масштаб до большего размера, сохранить готовое объединённое изображение (Готово) или отказаться от изображения (Отмена). Первые три варианта ведут к диалогам для выполнения соответствующих правок. Каждый из них возвращается к этому диалогу по завершении, так что вы можете добавлять или изменять изображения, текст и линии/стрелки в любой последовательности. «Изменить масштаб» объясняется ниже. - +image: mashup3.jpg - Используйте этот диалог, чтобы выбрать и разместить изображения в макете и изменить их внешний вид: размер, поворот, положение, прозрачность. Изображение может быть частично или полностью прозрачным, целиком или в указанных областях. Это означает, что фоновое изображение или перекрывающееся изображение может просвечивать через прозрачные области. Кнопка «Добавить изображение» ведёт к диалогу выбора файлов из галереи ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). Выбранные изображения размещаются в макете. После добавления изображений щёлкните по любому изображению, чтобы выбрать его для изменений. Перетащите изображение из середины, чтобы расположить его в макете. Перетащите нижний правый угол, чтобы изменить размер изображения. Используйте элементы управления диалога, чтобы настроить изображение. Элементы управления диалога работают с последним добавленным, щёлкнутым или перетащенным изображением. Кнопки «Пред.» и «Далее» циклически переключают изображения по одному, мигая выбранным изображением. Это можно использовать, когда перекрывающиеся изображения затрудняют выбор нужного изображения щелчком. «Масштаб» изменяет масштаб изображения. «Угол» поворачивает изображение. Кнопки «Порядок наложения» поднимают или опускают изображение относительно других изображений - это определяет, какое перекрывающееся изображение будет сверху. «Базовая прозрачность» используется, чтобы сделать всё изображение частично прозрачным. Кнопка [рисовать] используется, чтобы сделать любую часть изображения частично или полностью прозрачной, используя показанный ниже диалог рисования. Кнопка [искажение] используется, чтобы согнуть или исказить изображение, используя показанный ниже диалог искажения. Флажок «чёрные поля» можно использовать, чтобы удалить чёрные поля, оставленные другими функциями правки, например искажением. Они станут прозрачными. Кнопка «Изображение зафиксировано» предотвратит перемещение изображения мышью или клавиатурой. Это полезно, когда изображения точно выравниваются и нужно предотвратить случайное перемещение. Элементы управления «Поля» можно использовать, чтобы сделать края изображения прозрачными. «Жёсткие поля» обрезают края изображения. «Смешанные поля» делают края частично прозрачными, чтобы смешать их с фоном или другими перекрывающимися изображениями. - +image: mashup4.png - «Рисовать» больше или меньше прозрачности для выбранных областей изображения. Щёлкните по изображению, чтобы выбрать его. Указатель мыши - это круг, показывающий диапазон действия. Используйте радиус, чтобы настроить размер. Перетащите мышь левой кнопкой по изображению, чтобы сделать его прозрачным в областях, охваченных кругом. Перетащите правой кнопкой, чтобы сделать непрозрачным. Если отмечено «Плавно», изменения прозрачности вносятся медленно по мере перетаскивания мыши. Укажите значение мощности для центра и краёв мыши, чтобы регулировать скорость изменения. - +image: mashup5.png - Диалог искажения используется, чтобы исказить изображение. Щёлкните по изображению, чтобы выбрать его. Перетащите изображение мышью - изображение будет искажаться или растягиваться локально в направлении мыши (как листовая резина). Область искажения примерно определяется диапазоном искажения, который является долей размера изображения. Каждое перетаскивание - это шаг, добавляемый к предыдущим шагам. Недавние шаги можно отменить с помощью [undo last], а невыпрямленное изображение можно восстановить с помощью [undo all]. - +image: mashup6.png - Диалог «Редактировать текст» используется для размещения текста в макете. Введите текст и нажмите [Применить]. Вас попросят щёлкнуть по макету там, где будет добавлен текст. Перетащите его в нужную позицию, затем используйте элементы управления диалога, чтобы задать шрифт, размер, цвет, угол, цвет фона, размер и цвет контура, размер и цвет тени, а также прозрачность для каждого из них. Перетащите текст в новую позицию в любое время. Щёлкните по любому существующему тексту, чтобы показать его свойства в диалоге и изменить их. Щёлкните по тексту и нажмите Delete, чтобы удалить его. По завершении редактирования нажмите [OK], чтобы вернуться ко второму диалогу «Монтаж». - +image: mashup7.png - Диалог «Редактировать линию/стрелку» используется для размещения линий или стрелок в макете. Он работает почти так же, как добавление текста. Введите длину и ширину и нажмите [Добавить]. Вас попросят щёлкнуть по макету там, где будет добавлена линия. Линия размещается в макете, либо стрелка, если отмечена одна из опций наконечника стрелки. Перетащите линию/стрелку в нужную позицию. Настройте длину, ширину, угол и атрибуты (фон, контур, тень) с помощью диалога. Вы также можете перетащить любой конец линии/стрелки, чтобы задать позицию этого конца, оставив другой конец неподвижным. - Вы можете использовать мышь, чтобы перемещать и изменять размер объектов в макете: • щёлкните по объекту, чтобы выбрать его - он мигает, подтверждая выбор. • перетащите примерно от центра, чтобы расположить объект. • перетащите нижний правый угол, чтобы изменить размер объекта. • для линии/стрелки перетащите любой конец, чтобы переместить только этот конец. - Клавиши стрелок на клавиатуре также можно использовать, чтобы перемещать выбранный объект шагами по 1 пикселю. - Вы можете добавлять изображения, сохранённые с помощью {ВЫБОР ОБЛАСТИ}. В диалоге «Редактировать изображения» нажмите [Добавить], чтобы запустить диалог выбора файла. Используйте кнопку [Сверху] в окне галереи, выберите 'saved_areas'. Откройте любое из найденных там изображений .png. Используется исходный контур области, и смешивание области работает от этих краёв. - ^Файлы проекта монтажа Вы можете сохранить проект и открыть его позже, чтобы продолжить редактирование. Проект монтажа восстанавливается с использованием этих изображений и некоторых данных, сохранённых в файле проекта: положения изображений и текста, масштабы, прозрачность и т. д. - ^Изменение масштаба монтажа Работа с очень большим макетом (более 20 мегапикселей) может быть довольно медленной. Перетаскивание большого накладываемого изображения может быть медленным и дёрганым. Вы можете работать намного быстрее, если используете меньший макет для построения проекта, а затем увеличиваете его после завершения. Потери разрешения в финальном изображении не происходит, поскольку накладываемые изображения и текст восстанавливаются из исходных данных. Кнопка «Изменить масштаб» позволяет увеличить проект в 2, 3 или 4 раза. Также есть опция сброса, чтобы восстановить исходный меньший размер проекта. С помощью этого метода вы можете работать с макетом на 10 мегапикселей и по завершении увеличить его масштаб до 160 мегапикселей. С увеличенным макетом можно продолжать работать напрямую и после этого, но это будет медленнее. - - TOPIC: МАССИВ ИЗОБРАЖЕНИЙ +image: image-array.jpg - Выберите много изображений и объедините их в компактный формат массива внутри цветной рамки. - Первый диалог показан вверху слева. «Цвет фона» - это цвет рамки контура и промежутков между содержащимися изображениями. «Ширина массива» - это общая ширина выходного массива, а «Поле» - ширина внешнего поля, окружающего все изображения. Высота массива определяется количеством выбранных файлов изображений и пространством, необходимым, чтобы уместить их в рамке. «Столбцы изображений» задаёт количество столбцов изображений (6 в примере выше). Количество строк зависит от количества выбранных файлов изображений. Значения «Разделение» задают горизонтальное и вертикальное пространство между содержащимися изображениями. - Выберите файлы изображений ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}), затем нажмите [Продолжить] по завершении. Получившееся изображение будет создано за несколько секунд (или минут для сотен изображений). Это изображение обычно будет иметь очень неровное нижнее поле, как показано на верхнем правом изображении выше. Последовательность изображений в массиве определяется порядком выбора. Верхний ряд заполняется первым, слева направо, затем 2-й ряд и т. д. - Диалог «Оптимизировать» начинается автоматически. Он может переставить изображения так, чтобы нижнее поле было более ровным. Нажмите [Порядок наложения] и подождите, пока изображение оптимизируется. Вы можете наблюдать за ходом процесса. Функция завершится, если найден оптимум, делающий нижнее поле ровным в пределах 2 пикселей. Она может продолжать поиск бесконечно, если эта цель не достигнута. Нажмите [Начальный вид], чтобы принудительно завершить функцию оптимизации с лучшим найденным на данный момент решением. Если оптимизация успешна, вы получите ровные столбцы, как показано на нижнем правом изображении. Если нижний край всё ещё неровный после оптимизации, вас спросят, хотите ли вы добавить поля к некоторым изображениям, чтобы сделать нижний край ровным. Это приведёт к ровному нижнему краю, но вертикальные интервалы больше не будут равными. - СОВЕТ: оптимизация работает лучше всего, если количество изображений на столбец составляет не менее четырёх (лучше больше). Это даёт оптимизатору достаточно гибкости, чтобы найти решение с ровным нижним краем. - Появляется последний диалог, показанный внизу слева. Теперь вам нужно присвоить имя файла вашему массиву. Запускается диалог сохранения файла, и вы можете сохранить новый файл массива где угодно. Если выбрана опция копирования metadata, metadata копируются из выбранного входного файла в выходной файл. Это полезно, если изображения являются отредактированными версиями, и вы хотите, чтобы массив содержал историю правок для последней версии (или любой версии). - - TOPIC: МЕНЮ МАССОВЫХ ОПЕРАЦИЙ Это функции, которые обрабатывают несколько выбранных файлов изображений, от нескольких до тысяч. Эти функции можно отменить в процессе выполнения с помощью клавиши Escape, но это оставит некоторые файлы обработанными, а некоторые нет. Всплывающий отчёт показывает имена файлов по мере их обработки. - - TOPIC: МАССОВОЕ ПРЕОБРАЗОВАНИЕ +image: batch-convert.jpg - Эта функция используется для переименования, преобразования, изменения масштаба и перемещения нескольких файлов изображений. Файлы RAW также можно преобразовать в файлы изображений. Функция выполняется в несколько параллельных потоков для максимальной скорости. - ^Ввод диалога • Выбрать файлы - файлы для преобразования ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). • Заменить текст - заменить текст в именах файлов (см. ниже). • Новое имя - необязательное новое имя, вставленный текст (см. ниже). • Порядковые номера - базовое число и приращение для выходных имён файлов. • Новое местоположение - необязательная новая папка для выходных файлов. • Новый тип - тип файла для выходных файлов, или «без изменений». • Глубина цвета - укажите 8 или 16 бит для выходных файлов tif или png. • Макс. ширина, высота - необязательные пределы для выходных файлов (используются, только если отмечено уменьшение или увеличение) • Изменить масштаб - необязательный коэффициент изменения масштаба для выходных файлов • Удалить оригиналы - удалить входные файлы после успешного преобразования. • Копировать Metadata - скопировать все metadata в выходные файлы. • Обновить альбомы - заменить файлы альбома преобразованными выходными файлами - ^Заменить текст Если здесь введён текст, имена файлов сканируются на наличие этого текста, и если он найден, подставляется указанный текст замены. Текст замены может иметь другую длину, а также может быть пустым, в этом случае текст удаляется из имени файла. - ^Новое имя и плагины Новое имя файла может содержать вставленный текст: дату съёмки (из metadata EXIF), порядковый номер или исходное имя файла. Укажите, что и куда вставить, следующим образом: • $oldname - здесь вставляется исходное имя файла • $sss - здесь вставляется текущий порядковый номер. См. ниже. • $yyyy $mm $dd - дата съёмки вставляется в этих позициях. - Пример: San Francisco $yyyy:$mm:$dd $oldname $sss Входной файл "Golden Gate Bridge.jpg" с датой съёмки 12 мая 2014 года будет преобразован в выходное имя файла "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg". - Для "$sss" укажите длину поля количеством символов 's', например "$ss" будет достаточно для порядковых номеров до 99. Для порядковых номеров с меньшим количеством цифр добавляются ведущие нули. Порядковые номера, не помещающиеся в указанную длину, делаются такой длины, какая нужна. Имейте в виду, что порядок сортировки имён файлов в галереях строго ascii-порядок, так что последовательность чисел 1, 2 ... 9, 10 отсортируется как 1, 10, 2 ... 9. Вы можете сохранить числовой порядок, указав длину поля 2 ($ss), что даст последовательность 01, 02 ... 09, 10. - Должно присутствовать либо "$oldname", либо "$sss", чтобы обеспечить уникальность выходных имён файлов. Если «Новое местоположение» отсутствует или не изменено, «удалить оригиналы» игнорируется. Если выходной файл уже существует, входной файл не преобразуется. - ^Макс. ширина и высота Если отмечено уменьшение и/или увеличение, выходные файлы будут изменены в пределах этих ограничений с сохранением исходного соотношения ширины/высоты. Если отмечено уменьшение, файлы больше этих пределов уменьшаются, чтобы оставаться в пределах ограничений. Если отмечено увеличение, файлы меньше этих пределов увеличиваются так, чтобы либо ширина, либо высота была на соответствующем пределе. Это нельзя использовать вместе с опцией «Изменить масштаб». - ^Изменить масштаб Если отмечена одна из кнопок, выходные файлы масштабируются на выбранный коэффициент. Это нельзя использовать вместе с опцией «Макс. ширина и высота». - ^Удалить оригиналы Если отмечено, входные файлы удаляются, но только после успешного создания выходного файла. - ^Копировать Metadata Все metadata копируются из входного файла в выходной. Не отмечайте эту опцию, чтобы удалить metadata. - ^Обновить альбомы Если отмечено, все альбомы, содержащие любой из входных файлов, обновляются до преобразованных выходных файлов. - ^Сохранение последовательности файлов Если вы укажете начальный порядковый номер ($sss), последовательность выбора входных файлов будет сохранена в выходном расположении. Таким образом, вы можете выбрать файлы изображений в нужном порядке, либо выбрать из альбома с упорядоченными изображениями, и сохранить эту последовательность в выходных данных. - - TOPIC: МАССОВОЕ КОПИРОВАНИЕ/ПЕРЕМЕЩЕНИЕ Скопировать или переместить выбранный файл изображения в новое местоположение. Выберите входные файлы ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}) из любых папок, известных Fotocx. Если выбрано «Удалить оригиналы», входные файлы будут удалены после успешного перемещения их в новую папку. В этом случае все альбомы, ссылающиеся на теперь удалённые входные файлы, обновляются с новыми местоположениями файлов. - - TOPIC: МАССОВОЕ ВЫПРЯМЛЕНИЕ Эта функция выпрямляет файлы изображений, повёрнутые или отражённые. Она полагается на данные EXIF, чтобы узнать, повёрнут ли файл/отражён и в каком направлении. Она намного быстрее, чем «Массовое преобразование». Вы можете просто выбрать все файлы-кандидаты и позволить ей найти те, которым нужно исправление. Скорость поиска - около 3000 файлов изображений в минуту на мощном компьютере. Есть два варианта указания файлов для поиска. Кнопка [Выбрать файлы] ведёт к диалогу выбора файлов из галереи ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). Если отмечено «Обследовать все файлы», будут искаться все файлы изображений в ваших верхних папках. - - TOPIC: МАССОВОЕ УДАЛЕНИЕ/КОРЗИНА Выберите файлы ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). Выберите опцию: удалить или переместить в корзину. [Продолжить]. Файлы перечисляются во всплывающем отчёте по мере удаления или перемещения в корзину. После того как все файлы удалены/перемещены в корзину, альбомы сканируются, и удалённые файлы убираются из них. - - TOPIC: МАССОВОЕ НАЛОЖЕНИЕ +image: batch-overlay.png - Небольшое накладываемое изображение можно добавить в выбранной позиции на выбранных входных изображениях. Это можно использовать, чтобы добавить строку с указанием авторства, копирайт и т. д. поверх изображений. - Подготовьте накладываемое изображение следующим образом: используйте «Пустое изображение», чтобы создать базовое изображение для размещения текста. Масштаб не важен, так что сделайте его больше, чем нужно. Используйте «Рисование прозрачности», чтобы сделать всё базовое изображение прозрачным. Используйте {РАЗМЕТКА} > рисовать текст, чтобы разместить нужный текст на базовом изображении, используя нужный шрифт, цвет и другие атрибуты. Масштабируйте текст, чтобы заполнить большую часть базового изображения. Базовое изображение (фон) прозрачно. При необходимости удалите лишние поля с помощью {ОБРЕЗКА}. Сохраните финальное изображение. Удобное расположение - /saved_areas, но можно использовать любую папку. Это изображение теперь можно использовать как накладываемое изображение для «Массового наложения». - Используйте кнопку ^Выбрать основные файлы изображений^, чтобы выбрать основные файлы изображений, которые получат накладываемое изображение. Используйте кнопку ^Выбрать файл наложения^, чтобы выбрать файл накладываемого изображения. - Два ввода ^Положение накладываемого изображения^ определяют, где накладываемое изображение размещается на основном изображении, от 1-99% расстояния сверху вниз и 1-99% расстояния слева направо. 0/0 означает верхний левый угол, 99/99 означает нижний правый угол. Накладываемое изображение будет расположено так, чтобы не выходить за края основного изображения. - Укажите ^Ширину накладываемого изображения^ как процент от ширины основного изображения. Высота будет задана так, чтобы сохранить соотношение ширины/высоты. Если отмечено ^Сделать ширину постоянной для размера окна^, визуальный размер накладываемого изображения будет постоянным для размера окна, указанного ниже. Без этого «высокое» изображение, отображаемое с большими левыми и правыми полями, имело бы визуально меньшее накладываемое изображение. Начальный размер окна - это текущее окно. Вы можете ввести любой размер. Нажмите ^обновить^, чтобы задать текущее окно, если оно изменилось. - Если выбрано ^Заменить основные файлы^, входные основные файлы заменяются выходными основными файлами с наложением. Если выбрано ^Создать новые версии^, создаются новые версии входных основных файлов. - - TOPIC: МАССОВЫЕ KEYWORDS +image: batch-keywords.jpg - Добавить, удалить или изменить keywords сразу для большого количества файлов изображений. - Используйте кнопку [select files], чтобы выбрать файлы изображений ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). - Диалог показывает два списка keywords: те, что нужно добавить к выбранным файлам, и те, что нужно удалить. Доступные keywords показаны в окне «Определённые Keywords» ниже. Один из них можно добавить в текущий выбранный список keywords (добавить или удалить), щёлкнув по нему. Keyword можно удалить из любого списка keywords, щёлкнув по нему. Чтобы заменить keywords, укажите новые keywords в списке добавления и старые keywords в списке удаления. - Если список определённых keywords длинный, может быть проще ввести нужный keyword в «Введите новый keyword». Существующие keywords, соответствующие введённому на данный момент, появятся в «Соответствующих Keywords», и вы можете указать и щёлкнуть по одному из них, чтобы добавить keyword к изображению. Если введённый keyword новый (не показано ни одного соответствующего keyword), нажмите [Добавить], когда keyword будет полностью введён. Он будет добавлен в выбранный список keywords и в список определённых keywords под категорией "nocatg". - Если вы используете категории keywords, вы можете выбрать категорию, и в списке определённых keywords будут показаны только keywords этой категории. Если ваш список keywords огромен, это может сократить список до удобного для просмотра размера. - Чтобы получить список изображений с определёнными keywords, которые вы хотите удалить или заменить, используйте {ПОИСК ИЗОБРАЖЕНИЙ}, чтобы найти изображения, затем запустите эту функцию и используйте [select files], чтобы добавить все только что найденные файлы изображений, либо выберите любое их подмножество. - - TOPIC: МАССОВОЕ ПЕРЕИМЕНОВАНИЕ KEYWORDS +image: batch-rename-keywords.png - Переименуйте любое количество keywords и примените эти изменения ко всей вашей коллекции изображений. Щёлкните по keyword для переименования из списка определённых keywords, введите новое имя в поле «Переименовать в», затем щёлкните по кнопке со стрелкой, чтобы добавить эту пару имён в список справа. Повторите для каждого keyword для переименования. Щёлкните по паре имён в списке, чтобы удалить их. Нажмите [Продолжить] по завершении. Если вы хотите удалить keyword без переименования, используйте 'delete' в качестве нового имени. - Всплывающее окно показывает количество файлов изображений, содержащих затронутые имена keywords. Нажмите [Да], чтобы продолжить. Скорость обновления - около 500/минуту на мощном компьютере. При следующем запуске Fotocx функция индексирования обновит все миниатюры для тех же изображений, поскольку дата изменения файла изменилась. - - TOPIC: МАССОВАЯ ОЧИСТКА KEYWORDS +image: batch-purge-keywords.jpg - Очистить (удалить) ненужные keywords из всех файлов изображений. Это особенно полезно, чтобы избавиться от ненужных keywords, добавленных из загруженных файлов изображений. Щёлкайте по ненужным keywords слева в диалоге, чтобы добавить их в список очистки справа в диалоге. Нажмите [proceed] по завершении. - - TOPIC: МАССОВАЯ ДАТА СЪЁМКИ +image: batch-photo-date1.png +image: batch-photo-date2.png - Быстро исправьте партию фото, у которых нет даты/времени съёмки или она неверна. Используйте кнопку [select files], чтобы открыть окно галереи, где вы можете выбрать файлы изображений для обработки ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). - Есть два способа изменить дату/время съёмки: • Задать новую дату/время (правое изображение выше): введите только год (yyyy) - в файлах будет заменён только год. Введите только дату (yyyy:mm:dd) - дата заменяется, но не время. Введите полную дату/время (yyyy:mm:dd hh:mm:ss) - заменяется и то, и другое. • Сдвинуть существующую дату/время (левое изображение): введите значения + или - в любое из 6 полей: годы, месяцы, дни, часы, минуты, секунды. Даты/время будут сдвинуты на введённые значения. - Значения сдвинутых даты/времени при необходимости переносятся на следующее старшее значение: Время 08:30, сдвинутое на -50 минут, даёт 07:40 Дата 2016-10-20, сдвинутая на +6 месяцев и -30 дней, даёт 2017-03-21 (в марте 31 день). - Если отмечен флажок 'test', создаётся отчёт со старыми и новыми датами/временем для выбранных файлов для проверки. Изменения в файлы не вносятся. Если вы убедились, что результаты верны, снимите флажок и запустите снова, чтобы обновить файлы. - - TOPIC: МАССОВОЕ ИЗМЕНЕНИЕ META +image: batch-change-meta.png - Изменить metadata для нескольких файлов изображений. Вы можете добавлять новые metadata, изменять существующие metadata и удалять metadata. Используйте кнопку [select files], чтобы открыть окно галереи, из которого вы выбираете файлы для обработки {ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}. Введите имена tags metadata и значения, которые нужно назначить, либо оставьте значение пустым, чтобы удалить tag. Нажмите [применить]. Вы получите сообщение с подтверждением, и в этот момент можете продолжить или отменить. Слева предоставлен список часто используемых имён tags. Щёлкните по одному из них, чтобы вставить его в первое пустое поле имени tag в диалоге. Этот список берётся из файла /metadata_picklist, который вы можете отредактировать, чтобы добавить в список другие tags. Кнопка [Полный список] предоставляет информацию о том, как получить список всех доступных имён tags. - - TOPIC: МАССОВЫЙ ОТЧЁТ META +image: add-meta-tags.png +image: batch-report-meta.png - Составить отчёт по любым metadata для любого количества изображений. Результат - это текстовый файл, который отображается в текстовом редакторе по умолчанию для вашей системы. Вы можете использовать функции поиска текстового редактора, чтобы найти изображения, соответствующие нужным metadata, либо использовать текстовый файл как ввод для других программ. Используйте кнопку [select files], чтобы открыть окно галереи для выбора файлов для обработки ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). Кнопка [правка] открывает новый диалог (справа), где вы можете выбрать tags metadata для включения в отчёт. Щёлкните по tag в левом столбце, чтобы добавить его в правый столбец и в отчёт. Щёлкните по tag в правом столбце, чтобы удалить его. Щёлкните по последнему tag в левом столбце, "Other tag ...", чтобы ввести любое имя tag, отсутствующее в списке, который содержит только наиболее вероятно нужные tags. - - TOPIC: МАССОВЫЕ GEOTAGS +image: batch-geotags.png - Выберите много изображений и добавьте одни и те же данные о местоположении ко всем им. Используйте кнопку [select files], чтобы выбрать файлы изображений из окна галереи ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). Затем получите данные о местоположении, как описано в {РЕДАКТИРОВАТЬ ОСНОВНЫЕ META}, используя кнопку [Найти] или щёлкая по маркеру карты. Используйте эту функцию также, чтобы исправить несоответствия в написании местоположения или данных latitude/longitude. Если местоположение и/или страна оставлены пустыми, они не обновляются. Чтобы стереть местоположение или страну, введите имя "null". Если latitude и longitude оставлены пустыми, они не обновляются. Чтобы стереть latitude и longitude, введите "0" для обоих значений. Вы можете обновить только местоположение/страну, только latitude/longitude, или и то, и другое. На практике вы можете обнаружить, что GPS камеры вставляет latitude и longitude без местоположения и страны, либо использует нежелательный язык, либо все заглавные буквы, либо какое-то другое значение, требующее исправления. - - TOPIC: ЭКСПОРТ ФАЙЛОВ Скопировать выбранные файлы изображений в другую папку. Предполагаемое использование - копирование файлов для совместного доступа с другими, например загрузка файлов на веб-сайт. Выходные файлы - JPEG. При желании вы можете уменьшить размер изображений. Выберите файлы изображений, щёлкая по миниатюрам галереи ({ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ}). Выберите папку, куда будут скопированы файлы изображений. Если выбрано «экспортировать metadata», также копируется ограниченный набор metadata. Это: дата съёмки, keywords, копирайт, заголовок, описание. - - TOPIC: КРОШЕЧНАЯ ПЛАНЕТА - - TOPIC: ИНДЕКСИРОВАНИЕ ФАЙЛОВ +image: index-files1.png - Fotocx нужно знать все имена ваших папок файлов изображений и файлов, а также встроенные metadata (даты, tags, geotags, заголовки, описания, рейтинги). Эти данные индексируются для быстрого поиска. Fotocx также создаёт миниатюры, чтобы окна галереи (страницы миниатюр) отображались быстро. Fotocx не изменяет и не копирует ваши файлы изображений. Требуемое пространство обычно составляет 2% от пространства ваших файлов изображений. - Функция индексирования файлов запускается при каждом старте Fotocx. Эта функция создаст отсутствующие миниатюры, заменит устаревшие и обновит индекс metadata, используя текущие данные из ваших файлов изображений. Это может потребовать значительного времени, если у вас много тысяч новых файлов. - Файлы изображений, изменённые или перемещённые внутри Fotocx, обрабатываются автоматически. Функция индексирования используется только для новых файлов изображений, созданных вне Fotocx (например, была добавлена новая партия фото), и для файлов, изменённых или перемещённых вне Fotocx. - Введите ваши верхние папки изображений (например, /home//Pictures). Используйте кнопку [обзор], чтобы найти и добавить папки. Эти папки и любые содержащиеся в них подпапки будут обработаны. Не имеет значения, если с изображениями смешаны другие файлы. Удалите запись, щёлкнув по соответствующему 'X'. - Введите папку миниатюр, где будут храниться файлы миниатюр. Используйте предлагаемое по умолчанию местоположение или задайте своё собственное. - Если вы использовали имена папок или файлов, чтобы классифицировать ваши изображения, вы можете сразу же использовать их в функции {ПОИСК ИЗОБРАЖЕНИЙ}. Если вы сохранили даты, keywords, geotags, заголовки или рейтинги в metadata ваших изображений, они также будут доступны для поиска. После индексирования изображений поиск по любому из этих параметров выполняется почти мгновенно. - ^Tags Metadata По умолчанию в индекс изображений включаются следующие metadata: • имена папок и файлов • дата/время съёмки • дата/время изменения файла • заголовок и описание (metadata exif) • рейтинг (0-5 звёзд) • keywords (пользовательские метки) • geotags (названия страны и местоположения и latitude/longitude) • камера: производитель, модель, объектив • экспозиция: время, диафрагма (F-число), фокусное расстояние, ISO - ^Дополнительные tags Metadata +image: index-files2.png - Вы можете добавить до 20 других tags metadata в индекс файлов изображений. Metadata из этого списка можно искать так же быстро, как и стандартные tags. Возможно, вам это не нужно, но если вам иногда нужно искать по нестандартным tags metadata, вы можете добавить их здесь, и скорость поиска будет почти мгновенной. Нажмите кнопку [select] для "дополнительных metadata", чтобы открыть показанный выше диалог. Щёлкайте по tags в левом списке, чтобы добавить их в правый список - tags, которые будут добавлены в индекс. Щёлкните по tag в правом списке, чтобы удалить его. Нажмите [done], чтобы применить изменения. Вся ваша коллекция изображений будет проиндексирована заново. Это пройдёт быстрее, чем первоначальное индексирование, поскольку миниатюры не создаются заново. - ^Доступ к непроиндексированным файлам и папкам Непроиндексированный файл изображения или папка - это тот, что не входит в ваши объявленные верхние папки изображений (подпапки ваших объявленных папок изображений всегда включены). Вы можете перейти в такую папку и просмотреть миниатюры в обычном режиме, а также просматривать и редактировать такие файлы в обычном режиме. Есть ограничения, которые вам следует понимать: • Эти файлы будут отсутствовать в любых результатах поиска и на карте. • Миниатюры создаются в момент просмотра - галереи будут медленными. Если вы обращаетесь к переносному (медленному) устройству хранения (например, SD-карте камеры), вы заметите заторможенную работу. Миниатюры будут создаваться по мере необходимости и останутся после извлечения устройства. Предложение: скопируйте файлы в объявленную папку Fotocx, затем выполните всю нужную обработку из этого места. Производительность будет намного лучше. - ^Съёмное хранилище (USB-накопитель) Если ваши верхние папки изображений включают папки на съёмном диске, и вы запускаете Fotocx без подключённого диска, данные индекса и миниатюры всё равно сохраняются, даже если съёмные файлы исчезли. Когда съёмный диск снова подключён, и Fotocx запущен, восстанавливается последнее состояние. Если в промежутке были добавлены или изменены какие-либо файлы, данные индекса и миниатюры обновляются. - - TOPIC: ПЕРЕНОС ДОМАШНЕЙ ПАПКИ FOTOCX Домашняя папка Fotocx содержит все пользовательские настройки и данные, включая некоторые файлы из пакета Fotocx, которые могут быть настроены пользователем. Расположение по умолчанию: /home//.fotocx. Если установлено несколько версий или выпусков Linux, может быть желательно иметь одну общую домашнюю папку Fotocx вместо отдельной для каждого выпуска. То же самое может быть верно, если нескольким пользователям нужен доступ к одному и тому же экземпляру Fotocx. - Используйте эту функцию, чтобы перенести домашнюю папку Fotocx в другое место. Выбранная папка должна содержать "fotocx" в имени пути, иначе "/fotocx" будет добавлено автоматически. - См. параметр -home в {ПАРАМЕТРЫ КОМАНДЫ}, если вам нужно несколько коллекций изображений Fotocx, управляемых отдельно. - - TOPIC: НАСТРОЙКИ +image: settings.jpg - Различные пользовательские предпочтения и настройки собираются и сохраняются в файле /parameters. Большинство изменений применяются немедленно. Некоторые вызовут перезапуск Fotocx. - • Выберите нужный 2-символьный код языка. Fotocx перезапустится на выбранном языке. • Начальный вид - начальное отображение при запуске Fotocx. Недавние файлы: последние просмотренные файлы изображений Новейшие файлы: файлы, добавленные/изменённые последними Определённая галерея: указанная галерея папки Галерея альбома: указанная галерея альбома Предыдущая галерея: галерея, использованная последней в предыдущем сеансе Предыдущий файл: файл, просмотренный последним в предыдущем сеансе Определённый файл: указанный файл изображения Кнопка «Обзор»: выбрать папку, альбом или файл изображения • Фон - цвета фона для окон просмотра файла и галереи • Стиль меню - стиль отображения меню: значки, текст или оба • Цвета меню - цвет текста меню и цвет фона • Шрифт диалога - шрифт для меню и диалогов • Показать скрытые - если отмечено, показывать скрытые файлы и папки • Скорость zoom - выберите 1-8 щелчков или клавиш [+] на 2-кратное увеличение изображения • Файлы JPEG - уровень качества, по умолчанию 90, используйте 70+ для хорошего качества • Узел кривой - минимальное расстояние между узлами для кривых правки, % шкалы. По умолчанию 5% шкалы. Используйте более высокое значение для тачпадов. • Позиция изображения - изображение слева/по центру/справа в более широком окне • Подтвердить выход - опция всплывающего диалога: вы действительно хотите выйти? • Уровень индексирования - см. ниже • Загрузчик RAW - см. ниже • Параметры RAW - см. ниже • Файлы RAW - список используемых типов файлов RAW • Видеофайлы - список используемых типов видеофайлов • Видеоприложение - см. ниже - ^Качество файлов и сжатие Уровень качества файла JPEG: используйте 70 или выше для хорошего качества изображения (по умолчанию 90). Метод сжатия файлов TIFF - DEFLATE (лучше всего для цветных изображений). Уровень сжатия файлов PNG - '1'. Более высокие значения, похоже, ничего не делают, кроме увеличения времени сохранения файла (libpng). - ^Позиция изображения Если окно шире изображения (то есть соотношение ширины/высоты окна > изображения), изображение можно сдвинуть влево, отцентровать или сдвинуть вправо. Если влево или вправо, неиспользуемое поле максимизируется, что может быть удобнее для размещения диалоговых окон. - ^Уровень индекса изображений Эти два параметра управляют компромиссом между временем запуска и полнотой индекса изображений. • $ fotocx: применяется, когда fotocx запускается с помощью команды оболочки, системного меню или системного значка/лаунчера. Рекомендуемое значение '2' означает полное индексирование: загрузить старый файл индекса, найти новые файлы (ещё не проиндексированные) и обновить файл индекса fotocx. • $ fotocx : применяется, когда fotocx запускается щелчком по имени файла в списке файлового менеджера. Рекомендуемое значение '1' означает загрузить старый файл индекса, но не искать новые файлы для обновления индекса. Запуск умеренно быстрый. Функции поиска изображений и карты работают нормально, но любые новые (ещё не проиндексированные) файлы изображений не включаются. • Альтернатива: '0' означает отсутствие индексирования. Запуск очень быстрый. Последующее использование функции поиска изображений или карты запустит функцию индексирования файлов только для старых файлов (без поиска новых/изменённых файлов). Используйте эту опцию, если ваша коллекция изображений огромна, и время запуска превышает несколько секунд. Вы можете запустить функцию индексирования позже при необходимости. - ^Загрузчик RAW Загрузчик RAW - это команда, используемая для чтения файла RAW и преобразования его в TIFF с 16-битной глубиной цвета. Она используется при просмотре файла RAW. Вы можете использовать функции редактирования Fotocx, чтобы отредактировать и оптимизировать файл. Загрузчик RAW по умолчанию - dcraw, использующий цветовое пространство sRGB. В списке выбора предоставлены несколько других опций, использующих dcraw или rawtherapee. Эти команды хранятся в файле 'raw_commands_*' в домашней папке Fotocx. Отредактируйте этот файл, чтобы изменить или добавить новые опции (см. ниже). Возможно, вам захочется подготовить несколько команд для нескольких камер или нескольких вариантов обработки. Если вы предпочитаете использовать редактор RAW в интерактивном режиме, создайте для этого команду плагина - см. {ПЛАГИНЫ}. - ^Параметры RAW • редактировать команды: нажмите кнопку, чтобы отредактировать список команд загрузчика RAW. Текстовый редактор запустится в новом окне с текущим списком команд. • сопоставить цвет встроенного изображения: использовать встроенное в файл RAW изображение как ориентир для сопоставления цветов изображения RAW с преобразованным изображением TIFF. Это интерпретация данных RAW производителем камеры - хорошая отправная точка, если файл RAW нуждается в дальнейшем редактировании. Встроенное изображение обычно совпадает с файлом JPEG с камеры. - ^Видеоприложение Введите команду оболочки для запуска приложения воспроизведения видео. Используйте '%s', чтобы отметить, куда вставляется имя видеофайла в командной строке. Вот несколько примеров: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: СОЧЕТАНИЯ КЛАВИШ +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - Просмотр или изменение пользовательских сочетаний клавиш. Текущие назначенные сочетания показаны в первом окне. Если вы нажмёте кнопку [Правка], откроется второй диалог, где вы можете добавлять и изменять сочетания клавиш. Введите новое сочетание с помощью клавиатуры. Вы можете использовать клавиши A-Z, 0-9, F2-F9 и большинство символов (% $ & * < и т. д.). Вы можете сочетать клавишу с одной из Ctrl/Alt/Shift: нажмите и удерживайте ОДНУ из Ctrl/Alt/Shift, затем нажмите клавишу, затем отпустите обе. Выберите одно из доступных назначений меню из списка справа, затем нажмите [Добавить] и [OK]. Удалите сочетание, выбрав его и нажав [Удалить]. - - TOPIC: ГИСТОГРАММА RGB +image: RGB-hist.png - Небольшое окно показывает график гистограммы яркости текущего изображения в режиме просмотра файла, либо текущей выбранной области изображения. Этот график обновляется синхронно по мере того, как функции правки изменяют изображение. Используйте кнопки [Все] [Красный] [Зелёный] [Синий], чтобы выбрать цвета для показа. - - TOPIC: УВЕЛИЧЕНИЕ ИЗОБРАЖЕНИЯ +image: magnify-image.jpg - Увеличить изображение в области вокруг указателя мыши. Перетаскивайте мышь левой кнопкой по изображению, чтобы увеличивать разные области, подобно просмотру напечатанного изображения через лупу. Используйте диалог, чтобы настроить радиус области и степень увеличения. - - TOPIC: ИЗМЕРЕНИЕ ИЗОБРАЖЕНИЯ Щёлкните по любым двум позициям внутри изображения, чтобы измерить расстояние между точками в пикселях. Щёлкнутые позиции отмечены на изображении буквами A и B. Эти метки всегда показывают последние две щёлкнутые точки. Диалог обновляется расстояниями, разделяющими эти две точки: X-расстояние (горизонтальное расстояние) Y-расстояние (вертикальное расстояние) H-расстояние (общее расстояние) - - TOPIC: ПОКАЗАТЬ RGB +image: show-RGB.png - При щелчке по точке на изображении значения RGB показываются в диалоговом окне. Отображаются последние 9 щёлкнутых точек. Значения имеют формат xxx.dd, где xxx - старшие 8 бит значения цвета, а .dd - младшие 8 бит. Диапазон от 0.00 до 255.99. Младшие 8 бит равны нулю, если изображение не редактируется или не имеет глубины цвета более 8 бит. Выходные значения обновляются в реальном времени, если изображение редактируется. Если отмечено «метки», точки отмечаются на изображении буквами, соответствующими буквам в диалоговом окне. Если отмечено «дельта» и изображение редактируется, тогда показываются изменения RGB вместо абсолютных значений. - Если вы откроете другое изображение (например, для сравнения с предыдущим изображением), позиции сохраняются и обновляются, если они находятся в границах нового изображения. Это облегчает сравнение изображений на уровне значений RGB пикселей. - - TOPIC: НАСТРОЙКИ СЕТКИ +image: grid-settings.jpg - Есть две функции линий сетки: «Настройки сетки» задаёт все параметры сетки. «Переключить сетку» включает или выключает линии сетки. Линии сетки - это горизонтальные и вертикальные линии через равные интервалы по изображению. Эти линии могут быть полезными ориентирами выравнивания, когда изображение выпрямляется или искажается, чтобы выровнять стены или другие объекты на изображении. Используйте вводы «количество по X» и «количество по Y», чтобы задать количество вертикальных и горизонтальных линий соответственно. Элементы управления «смещение по X» и «смещение по Y» можно использовать, чтобы сдвинуть линии сетки, чтобы они пересекали нужную позицию на изображении. Сочетание клавиш (по умолчанию shift+G) можно назначить для «Переключить сетку», так что линии сетки можно включать или выключать одним нажатием клавиши. - - TOPIC: ЦВЕТ ЛИНИИ Некоторые функции рисуют линии поверх изображения (Обрезка, Выбор области и другие). Вы можете изменить цвет этих линий, чтобы максимизировать контраст относительно фонового изображения. Небольшой диалог можно оставить открытым во время редактирования, чтобы удобно переключаться между доступными цветами (чёрный, белый, красный, зелёный). - - TOPIC: ТЁМНЫЕ/ЯРКИЕ ПИКСЕЛИ Выделить самые тёмные и самые яркие пиксели на изображении. Настройте два элемента управления-счётчика, чтобы задать пороги яркости, изначально равные 0 для тёмных пикселей и 255 для ярких пикселей. Пиксели с яркостью меньше тёмного порога или больше яркого порога «мигают», чтобы выделиться. Используйте эту функцию, чтобы обнаружить клиппинг после редактирования яркости или цвета. - - TOPIC: ЦВЕТ МОНИТОРА +image: moncolor-small.png - Восемь цветовых полос выводятся на экран с яркостью от нуля (чёрный) до 100%. Вы можете использовать это, чтобы настроить яркость и контраст вашего монитора. На обоих концах полос не должно быть неизменяющихся областей. - - TOPIC: НАЙТИ ДУБЛИКАТЫ +image: find-dups.png - Найти дублирующиеся файлы изображений в любом месте вашей базы данных изображений. Дублирующий файл может быть файлом, который точно или «почти» дублирует другой файл. Ради скорости миниатюры сравниваются в памяти. Возможно, что совпадающие миниатюры находятся для основных изображений, имеющих небольшие различия, не отражённые в миниатюрах. Копия изображения, уменьшенная в размере, вероятно, будет классифицирована как дубликат. Размер миниатюры можно задать от 32 до 512 пикселей. Больший размер снижает вероятность ложных срабатываний. Размер миниатюры сильно влияет на объём требуемой оперативной памяти - например, для 100 тыс. изображений размер 64 требует около 880 МБ, тогда как размер 256 требует около 14 ГБ. Нажмите кнопку [calculate], чтобы вычислить наибольший размер миниатюры, который поместится в доступную свободную память. - Два параметра используются, чтобы задать чувствительность обнаружения идентичных или почти идентичных изображений: разница пикселей - это разница значений RGB, ниже которой пиксели считаются равными. Количество пикселей - это количество отличающихся пикселей, ниже которого два изображения классифицируются как дубликаты. Пример: если разница пикселей = 2, а количество пикселей = 10, то изображения классифицируются как дубликаты, если менее 10 пикселей отличаются на 2 или менее. - Результат - это галерея, показывающая каждый набор дублирующихся изображений. Выходная галерея сохраняется как альбом "Duplicate Images". Вы можете использовать «Массовое удаление/в корзину» вместе с этим альбомом, чтобы выбрать, какие дубликаты удалить. - - TOPIC: НАЙТИ ПОВРЕЖДЁННЫЕ ФАЙЛЫ Читаются все файлы изображений в ваших объявленных верхних папках. Для каждого файла, который не удаётся прочитать, у вас есть три варианта: • удалить файл • исправить неверный тип файла (см. ниже) • переместить файл куда-нибудь за пределы ваших верхних папок изображений Я часто видел файлы .png с расширением .jpg. Веб-браузеры и некоторые другие приложения обрабатывают это без проблем. Здесь сообщается правильный тип файла, и вы можете изменить расширение на правильное. - - TOPIC: ПОКАЗАТЬ РЕСУРСЫ Отчёт по компьютерным ресурсам, используемым Fotocx: • Время CPU: использование с момента запуска Fotocx или с последнего измерения • Реальная память: реальная память, используемая в данный момент (без учёта подкачки) • Кэш карт: МБ дискового пространства, используемого для кэшированных плиток карты • Очистить кэш: удалить все кэшированные плитки карты • Кнопка [Sample]: сделать новое измерение и вывести данные - Кнопка [Sample] сбрасывает время CPU. Следующее измерение покажет только новое накопленное время CPU. Время CPU - это сумма для всех потоков процесса. - - TOPIC: МЕНЮ ИНСТРУМЕНТОВ Переводы для нескольких языков включены в пакет Fotocx. Эти переводы, выполненные ИИ, не идеальны. Ошибки перевода можно исправить, отредактировав файлы перевода. - ^Изменение языка GUI Меню {НАСТРОЙКИ} можно использовать, чтобы изменить язык. Язык также можно задать при запуске Fotocx: $ fotocx -lang xx # язык xx (de fr zh и т. д.) $ fotocx -lang en # английский - ^Изменить перевод GUI Отредактируйте файл /translations/gui_xx Пары текстовых строк имеют ведущие 4-значные номера, которые должны совпадать. Первая строка - английская, 2-я строка - на языке xx. Изменяйте только строку xx, никогда не английскую строку. Специальные символы для вставки параметров в текст должны оставаться в той же последовательности. Это '%d' (целочисленный параметр), '%f' (десятичный), '%s' (текст). - ^Изменить перевод руководства пользователя Отредактируйте файл /translations/ug_xx Отредактируйте ug_xx, чтобы исправить перевод. Не добавляйте и не удаляйте текстовые строки и не меняйте их последовательность. Текстовые строки должны соответствовать 1:1 английскому руководству пользователя, ug_en. - Отправьте исправленные файлы для включения в следующий выпуск Fotocx: mkornelix@gmail.com - - TOPIC: МЕНЮ СПРАВКИ • Руководство пользователя - показать оглавление • Видеоурок - показать видеоурок Fotocx на YouTube • Внешние программы - список внешних программ и их функций • Показать файл журнала - отобразить журналируемую информацию и сообщения об ошибках • Параметры команды - показать доступные параметры командной строки • Журнал изменений - показать дополнения и исправления ошибок в последних выпусках • Копирайт - показать авторские права и лицензии, относящиеся к Fotocx • Конфиденциальность - показать политику конфиденциальности (правила) для Fotocx • О программе - показать номер выпуска, расположение исполняемого файла, контакты • Домашняя страница - показать домашнюю страницу Fotocx на kornelix.net • Удалить программу - как удалить Fotocx - - TOPIC: ДРУГИЕ ТЕМЫ Следующие темы не связаны с меню Fotocx. - - TOPIC: VIDEO FILES Видеофайлы (.mpeg, .mp4 и т. д.) могут быть смешаны с вашими файлами изображений. Они будут показаны как файлы изображений и в режиме просмотра файла, и в режиме просмотра галереи. Клавиша 'P' запустит, приостановит и возобновит видео, либо повторит воспроизведение закончившегося видео. Клавиша 'Q' завершит видео. Используйте меню {НАСТРОЙКИ}, чтобы выбрать приложение для воспроизведения видеофайлов. - - TOPIC: СЛАЙДЫ И НЕГАТИВЫ +image: color-negative.jpg - Вы можете использовать камеру с возможностью макросъёмки, чтобы захватить слайды или плёночные негативы. Используйте световой короб для освещения, либо используйте небо (пример выше). Чтобы обработать цветной негатив, сначала сделайте позитив - см. {ЦВЕТОВОЙ РЕЖИМ}. Если изображение туманное, выберите только область изображения, исключая края плёнки, а затем используйте {ГЛОБАЛЬНЫЙ RETINEX}, чтобы устранить туман. При необходимости задайте точки белого и чёрного, щёлкнув по изображению, чтобы дополнительно уменьшить туман. - - TOPIC: ОГРАНИЧЕНИЯ FOTOCX • Существует жёсткое ограничение в один миллион файлов. • версии изображения - до 99 версий для отмены/повтора и именования версий. • keywords изображений - всего 10 тыс. keywords. 1000 символов для одного изображения. • Галереи ограничены 40 тыс. файлов изображений. • макс. размеры изображения - 40 тыс. x 20 тыс. пикселей. - - TOPIC: FOTOCX ДЛЯ WINDOWS 11 Fotocx можно использовать в Windows 11, установив подсистему Windows для Linux 2, или WSL2. В интернете есть обширная документация о том, как это сделать. - Если ваши файлы изображений находятся в файловой системе Windows (NTFS), Fotocx будет работать очень медленно. Поэтому переместите ваши файлы изображений в файловую систему Linux. Вы всё ещё сможете получать к ним доступ с помощью Проводника Windows и других приложений Windows, так что ничего не потеряется. Microsoft также рекомендует файловую систему Linux для улучшенной производительности. Используйте значок «Linux» в Проводнике, чтобы получить доступ к вашей домашней папке в файловой системе Linux. При необходимости добавьте папку Pictures и переместите туда ваши файлы изображений. - Если доступен пакет Fotocx, установите его. Иначе выполните следующее: Загрузите файл бинарного пакета Fotocx с ^https://kornelix.net. В терминале Linux: $ cd /mnt/c/Users//Downloads # перейти в папку загрузок Windows $ tar -xzf fotocx-xxx-bin.tar.gz # распаковать пакет в папку fotocx $ cd fotocx # перейти в папку fotocx $ chmod u+x install.sh # сделать установочный скрипт исполняемым $ ./install.sh # запустить скрипт, установить fotocx $ fotocx # запустить Fotocx Возможно, вам потребуется перезапустить окно Linux, чтобы последний шаг сработал. - Прочитайте вводные разделы этого руководства пользователя. Fotocx обладает глубокой функциональностью. Не ожидайте освоить Fotocx за несколько минут. - - TOPIC: КОНФИДЕНЦИАЛЬНОСТЬ Fotocx не сохраняет никаких пользовательских данных, кроме файлов изображений и их metadata. Metadata следует удалять из файлов изображений перед загрузкой в интернет, и Fotocx предоставляет простой способ сделать это. - - TOPIC: PROBLEM, QUESTION, SUGGESTION Отправьте письмо на mkornelix@gmail.com. Если есть дамп сбоя (файл zappcrash), отправьте его тоже. - fotocx/data/translations/gui_it0000664000175000017500000037077515247006657015716 0ustar micomico0000 + Zoom-in \n 0000 + Zoom avanti \n 0001 - Zoom-out \n 0001 - Zoom indietro \n 0002 = Zoom-in \n 0002 = Zoom avanti \n 0003 Arrow keys Previous/Next file \n 0003 Arrow keys File precedente/successivo \n 0004 Delete Delete/Trash file \n 0004 Delete Elimina/Cestina file \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Escape Chiudi finestra di dialogo / Esci da Fotocx \n 0006 F1 User Guide, Context Help \n 0006 F1 Guida utente, Aiuto contestuale \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 Schermo intero / nessun menu \n 0008 Home/End Gallery start/end \n 0008 Home/End Inizio/fine galleria \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 Il tempo di indicizzazione dipende dal numero, tipo e dimensione \n dei file immagine e dalla velocità del computer. Può variare \n da poche centinaia a oltre 10 mila file al minuto. \n È possibile modificare le opzioni di indicizzazione in seguito, tramite questi menu: \n Strumenti > Indice, Strumenti > Impostazioni. \n 0010 Page keys Gallery page up/down \n 0010 Page keys Pagina galleria su/giù \n 0011 Z 1x <--> fit to window \n 0011 Z 1x <--> adatta alla finestra \n 0012 $s plugin needs base and adder 0012 $s plugin necessita di base e adder 0013 % from left: 0013 % da sinistra: 0014 % from top: 0014 % dall'alto: 0015 %d albums selected 0015 %d album selezionati 0016 %d image files selected 0016 %d file immagine selezionati 0017 %d images 0017 %d immagini 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 %d keywords da eliminare \nin %d file immagine. \nProcedere? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 %d keywords da rinominare \nin %d file immagine. \nProcedere? 0020 %d max images exceeded 0020 %d numero massimo di immagini superato 0021 %d red-eye limit reached 0021 %d limite occhi rossi raggiunto 0022 %s %s %d folders %d files 0022 %s %s %d cartelle %d file 0023 %s *** date/time conversion failed \n 0023 %s *** conversione data/ora non riuscita \n 0024 %s ALBUM %s %d files 0024 %s ALBUM %s %d file 0025 %s NEWEST FILES 0025 %s FILE PIÙ RECENTI 0026 %s RECENT FILES 0026 %s FILE RECENTI 0027 %s SEARCH RESULTS %d files 0027 %s RISULTATI RICERCA %d file 0028 %s UNKNOWN 0028 %s SCONOSCIUTO 0029 %s added to script 0029 %s aggiunto allo script 0030 %s is already indexed 0030 %s già indicizzato 0031 %s renamed: %s 0031 %s rinominato: %s 0032 %s: metadata update failed 0032 %s: aggiornamento metadata non riuscito 0033 %s: no write permission 0033 %s: nessun permesso di scrittura 0034 %s: reserved, cannot be used 0034 %s: riservato, non utilizzabile 0035 %s: too many keywords 0035 %s: troppi keywords 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\nData foto: %s Data file: %s \nValutazione: %s Dimensione: %s %.2fmb \nPosizione: %s %s %s \nKeywords: %s \nTitolo: %s \nDescrizione: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\nData foto: %s Data file: %s \nValutazione: %s Dimensione: %s %.2fmb \nPosizione: %s %s %s \nKeywords: %s \nTitolo: %s \nDescrizione: %s \n----------------------- \n%s 0038 (click below) 0038 (clicca qui sotto) 0039 (no selection) 0039 (nessuna selezione) 0040 (pixels) 0040 (pixel) 0041 (press key) 0041 (premi tasto) 0042 (select function) 0042 (seleziona funzione) 0043 *** bad utf8 detected *** \n 0043 *** utf8 non valido rilevato *** \n 0044 *** cannot create new file \n 0044 *** impossibile creare nuovo file \n 0045 *** cannot get real path of input file \n 0045 *** impossibile ottenere il percorso reale del file di input \n 0046 *** cannot load input file \n 0046 *** impossibile caricare il file di input \n 0047 *** cannot make new version of input file \n 0047 *** impossibile creare nuova versione del file di input \n 0048 *** cannot open input file 0048 *** impossibile aprire il file di input 0049 *** cannot read input file 0049 *** impossibile leggere il file di input 0050 *** cannot save output file \n 0050 *** impossibile salvare il file di output \n 0051 *** completed \n 0051 *** completato \n 0052 *** file date/time invalid \n 0052 *** data/ora del file non valida \n 0053 *** file type not supported \n 0053 *** tipo di file non supportato \n 0054 *** invalid file \n 0054 *** file non valido \n 0055 *** metadata update error \n 0055 *** errore aggiornamento metadata \n 0056 *** no date/time available \n 0056 *** nessuna data/ora disponibile \n 0057 + bright 0057 + luminosità 0058 +Blue -Yellow 0058 +Blu -Giallo 0059 +Brightness 0059 +Luminosità 0060 +Green -Magenta 0060 +Verde -Magenta 0061 +Red -Cyan 0061 +Rosso -Ciano 0062 - blue 0062 - blu 0063 - fog/haze 0063 - foschia/nebbia 0064 .heic/.avif files not supported (install heif_convert) 0064 file .heic/.avif non supportati (installare heif_convert) 0065 .jp2 files not supported (install opj_decompress) 0065 file .jp2 non supportati (installare opj_decompress) 0066 .webp files not supported (install dwebp) 0066 file .webp non supportati (installare dwebp) 0067 0 albums selected 0067 0 album selezionati 0068 0 duplicates 0068 0 duplicati 0069 0-5 stars 0069 0-5 stelle 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = nessun indice immagine, solo vecchio indice, vecchio + aggiorna nuovo/modificato 0071 2-character code 0071 codice a 2 caratteri 0072 3D depth 0072 profondità 3D 0073 <2 images 0073 <2 immagini 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 È in corso l'installazione di una nuova versione di Fotocx. \nPotrebbe essere necessario ripristinare le impostazioni personalizzate. 0075 ADD GLARE 0075 AGGIUNGI RIFLESSO 0076 ADD NOISE 0076 AGGIUNGI RUMORE 0077 ADJUST HSL 0077 REGOLA HSL 0078 ADJUST RGB 0078 REGOLA RGB 0079 ALBUM MASS UPDATE 0079 AGGIORNAMENTO MASSIVO ALBUM 0080 ALBUMS 0080 ALBUM 0081 ALBUMS MENU 0081 MENU ALBUM 0082 ALIEN COLORS 0082 COLORI ALIENI 0083 AMPLIFY CONTRAST 0083 AMPLIFICA CONTRASTO 0084 ANTI-ALIAS 0084 ANTIALIASING 0085 AREA BLEND 0085 SFUMATURA AREA 0086 AREA FILL 0086 RIEMPIMENTO AREA 0087 AREA OVERVIEW 0087 PANORAMICA AREA 0088 AUTOSEARCH 0088 RICERCA AUTOMATICA 0089 About 0089 Informazioni 0090 Action 0090 Azione 0091 Add 0091 Aggiungi 0092 Add 1 0092 Aggiungi 1 0093 Add All 0093 Aggiungi tutto 0094 Add Current 0094 Aggiungi corrente 0095 Add Current File Here 0095 Aggiungi qui il file corrente 0096 Add Glare 0096 Aggiungi riflesso 0097 Add Image 0097 Aggiungi immagine 0098 Add Line 0098 Aggiungi riga 0099 Add Margins 0099 Aggiungi margini 0100 Add Noise 0100 Aggiungi rumore 0101 Add Random Noise 0101 Aggiungi rumore casuale 0102 Add Selected Files Here 0102 Aggiungi qui i file selezionati 0103 Add Texture 0103 Aggiungi texture 0104 Add a brightness/color ramp across an image 0104 Aggiungi una gradazione di luminosità/colore all'immagine 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 Aggiungi segnalibro: clicca su una miniatura della galleria. \nRinomina segnalibro: cliccalo e premi [Rinomina] 0106 Add glare around bright objects 0106 Aggiungi riflesso attorno agli oggetti luminosi 0107 Add margins around an image 0107 Aggiungi margini attorno a un'immagine 0108 Add newest version to existing versions 0108 Aggiungi la versione più recente alle versioni esistenti 0109 Add overlay image (e.g. copyright) to selected images 0109 Aggiungi immagine sovrapposta (es. copyright) alle immagini selezionate 0110 Add random noise to an image 0110 Aggiungi rumore casuale a un'immagine 0111 Add selected versions to existing versions 0111 Aggiungi le versioni selezionate alle versioni esistenti 0112 Add texture to an image 0112 Aggiungi texture a un'immagine 0113 Add to Selection 0113 Aggiungi alla selezione 0114 Add/change/delete metadata for selected image files 0114 Aggiungi/modifica/elimina metadata per i file immagine selezionati 0115 Add/remove barrel/pincushion distortion 0115 Aggiungi/rimuovi distorsione a barile/cuscinetto 0116 Add/remove brightness/color radially from chosen center 0116 Aggiungi/rimuovi luminosità/colore radialmente dal centro scelto 0117 Add/remove keywords for selected image files 0117 Aggiungi/rimuovi keywords per i file immagine selezionati 0118 Add/revise location/geocoordinates for selected image files 0118 Aggiungi/modifica posizione/geocoordinate per i file immagine selezionati 0119 Adjust HSL 0119 Regola HSL 0120 Adjust Image Contributions 0120 Regola contributi immagine 0121 Adjust Pixel Composition 0121 Regola composizione pixel 0122 Adjust RGB 0122 Regola RGB 0123 Adjust brightness, contrast, color 0123 Regola luminosità, contrasto, colore 0124 Adjust color saturation based on brightness 0124 Regola saturazione colore in base alla luminosità 0125 Adjust color using HSL color model 0125 Regola colore usando il modello colore HSL 0126 Adjust color using RGB or CMY colors 0126 Regola colore usando colori RGB o CMY 0127 Adjustment 0127 Regolazione 0128 Album Mass Update 0128 Aggiornamento massivo album 0129 Album Name 0129 Nome album 0130 Albums 0130 Album 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 Album: galleria di immagini scelte, disponi tramite trascinamento 0132 Algorithm Iterations 0132 Iterazioni algoritmo 0133 Alien Colors 0133 Colori alieni 0134 All 0134 Tutto 0135 All Areas 0135 Tutte le aree 0136 All files 0136 Tutti i file 0137 All image files will be re-indexed. \nContinue? 0137 Tutti i file immagine verranno reindicizzati. \nContinuare? 0138 All±1 0138 Tutti±1 0139 All±10 0139 Tutti±10 0140 Alpha 0140 Alfa 0141 Amount 0141 Quantità 0142 Amplify 0142 Amplifica 0143 Amplify Contrast 0143 Amplifica contrasto 0144 Amplify area contrast to enhance visibility of details 0144 Amplifica il contrasto dell'area per migliorare la visibilità dei dettagli 0145 Angle 0145 Angolo 0146 Anti-Alias 0146 Antialiasing 0147 Apply 0147 Applica 0148 Apply a soft focus effect to an image 0148 Applica un effetto sfocatura morbida a un'immagine 0149 Apply repeatedly while watching the image. 0149 Applica ripetutamente osservando l'immagine. 0150 Area Blend 0150 Sfumatura area 0151 Area Edge Blend 0151 Sfumatura bordo area 0152 Area Fill 0152 Riempimento area 0153 Arrange images and text in a layout (photo-montage) 0153 Disponi immagini e testo in un layout (fotomontaggio) 0154 Array Complete 0154 Array completo 0155 Array Width 0155 Larghezza array 0156 Arrow head 0156 Punta freccia 0157 Auto Level 0157 Livello automatico 0158 Auto black level 0158 Livello neri automatico 0159 Auto crop: 0159 Ritaglio automatico: 0160 Auto white balance 0160 Bilanciamento del bianco automatico 0161 Auto-replay 0161 Riproduzione automatica 0162 BATCH CHANGE META 0162 MODIFICA META BATCH 0163 BATCH CONVERT 0163 CONVERSIONE BATCH 0164 BATCH COPY/MOVE 0164 COPIA/SPOSTA BATCH 0165 BATCH DELETE/TRASH 0165 ELIMINA/CESTINA BATCH 0166 BATCH GEOTAGS 0166 GEOTAG BATCH 0167 BATCH KEYWORDS 0167 KEYWORDS BATCH 0168 BATCH MENU 0168 MENU BATCH 0169 BATCH OVERLAY 0169 SOVRAPPOSIZIONE BATCH 0170 BATCH PHOTO DATE 0170 DATA FOTO BATCH 0171 BATCH PROCESSING 0171 ELABORAZIONE BATCH 0172 BATCH PURGE KEYWORDS 0172 ELIMINA KEYWORDS BATCH 0173 BATCH RENAME KEYWORDS 0173 RINOMINA KEYWORDS BATCH 0174 BATCH REPORT META 0174 REPORT META BATCH 0175 BATCH SCRIPT 0175 SCRIPT BATCH 0176 BATCH UPRIGHT 0176 RADDRIZZAMENTO BATCH 0177 BLANK IMAGE 0177 IMMAGINE VUOTA 0178 BLUR 0178 SFOCATURA 0179 BOOKMARKS 0179 SEGNALIBRI 0180 BRIGHTNESS RAMP 0180 GRADAZIONE LUMINOSITÀ 0181 Background 0181 Sfondo 0182 Background Blur - blur relative to distance from foreground 0182 Sfocatura sfondo - sfocatura relativa alla distanza dal primo piano 0183 Background Color 0183 Colore sfondo 0184 Background Pattern 0184 Motivo sfondo 0185 Base Transparency 0185 Trasparenza base 0186 Batch 0186 Batch 0187 Batch Add/Change Metadata 0187 Aggiungi/modifica metadata in batch 0188 Batch Add/Remove Keywords 0188 Aggiungi/rimuovi keywords in batch 0189 Batch Change Meta 0189 Modifica meta batch 0190 Batch Convert 0190 Conversione batch 0191 Batch Copy/Move 0191 Copia/sposta batch 0192 Batch Delete/Trash 0192 Elimina/cestina batch 0193 Batch Geotags 0193 Geotag batch 0194 Batch Keywords 0194 Keywords batch 0195 Batch Metadata 0195 Metadata batch 0196 Batch Overlay 0196 Sovrapposizione batch 0197 Batch Photo Date 0197 Data foto batch 0198 Batch Photo Date/Time 0198 Data/ora foto batch 0199 Batch Purge Keywords 0199 Elimina keywords batch 0200 Batch Rename Keywords 0200 Rinomina keywords batch 0201 Batch Report Meta 0201 Report meta batch 0202 Batch Report Metadata 0202 Report metadata batch 0203 Batch Set Geotags 0203 Imposta geotag batch 0204 Batch Upright 0204 Raddrizzamento batch 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 Batch: copia, sposta, converti, converti RAW, aggiungi/modifica metadata 0206 Bend and fine-align 0206 Piega e allinea con precisione 0207 Bias 0207 Bias 0208 Black 0208 Nero 0209 Blank Image 0209 Immagine vuota 0210 Blend 0210 Fusione 0211 Blend 0% 0211 Fusione 0% 0212 Blend Width 0212 Larghezza fusione 0213 Blend area edits/edges using the mouse 0213 Fondi modifiche/bordi area usando il mouse 0214 Blend: 0% 0214 Fusione: 0% 0215 Blue 0215 Blu 0216 Blue Factors 0216 Fattori blu 0217 Blur 0217 Sfocatura 0218 Blur Angle (degrees) 0218 Angolo sfocatura (gradi) 0219 Blur Background 0219 Sfoca sfondo 0220 Blur Image 0220 Sfoca immagine 0221 Blur Mix 0221 Mix sfocatura 0222 Blur Normal 0222 Sfocatura normale 0223 Blur Radius 0223 Raggio sfocatura 0224 Blur Span 0224 Estensione sfocatura 0225 Blur Span (pixels) 0225 Estensione sfocatura (pixel) 0226 Blur the image (various methods) 0226 Sfoca l'immagine (vari metodi) 0227 Bookmarks 0227 Segnalibri 0228 Both 0228 Entrambi 0229 Bottom 0229 In basso 0230 Bright Limit 0230 Limite luminoso 0231 Bright Point 0231 Punto luminoso 0232 Brightness 0232 Luminosità 0233 Brightness Histogram 0233 Istogramma luminosità 0234 Brightness Ramp 0234 Gradazione luminosità 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 La luminosità dovrebbe mostrare una gradazione uniforme \nfino ai bordi. 0236 Browse 0236 Sfoglia 0237 CALIBRATE PRINTER 0237 CALIBRA STAMPANTE 0238 CAPTIONS 0238 DIDASCALIE 0239 CARTOON 0239 CARTONE ANIMATO 0240 CHOOSE ALBUM 0240 SCEGLI ALBUM 0241 CLEAR AREA 0241 CANCELLA AREA 0242 CLOSE 0242 CHIUDI 0243 COLOR MODE 0243 MODALITÀ COLORE 0244 COMBINE MENU 0244 MENU COMBINA 0245 COMMAND PARAMETERS 0245 PARAMETRI COMANDO 0246 COMPLETED 0246 COMPLETATO 0247 COPY FROM IMAGE 0247 COPIA DA IMMAGINE 0248 COPY IN IMAGE 0248 COPIA IN IMMAGINE 0249 COPY META 0249 COPIA META 0250 COPY PRIOR EDIT 0250 COPIA MODIFICA PRECEDENTE 0251 COPY TO CLIPBOARD 0251 COPIA NEGLI APPUNTI 0252 COPY TO DESKTOP 0252 COPIA SUL DESKTOP 0253 COPY/MOVE 0253 COPIA/SPOSTA 0254 COPY/PASTE AREA 0254 COPIA/INCOLLA AREA 0255 CREATE ALBUM 0255 CREA ALBUM 0256 CROP 0256 RITAGLIA 0257 CROSSHATCH 0257 TRATTEGGIO INCROCIATO 0258 CURRENT ALBUM 0258 ALBUM CORRENTE 0259 CURRENT FILE FOLDER 0259 CARTELLA FILE CORRENTE 0260 CURVE EDITING 0260 MODIFICA CURVA 0261 CUSTOM KERNEL 0261 KERNEL PERSONALIZZATO 0262 CUSTOM MENU 0262 MENU PERSONALIZZATO 0263 CYCLE 2 FILES 0263 CICLO 2 FILE 0264 CYCLE 3 FILES 0264 CICLO 3 FILE 0265 Calculate 0265 Calcola 0266 Calculate Geometry 0266 Calcola geometria 0267 Calibrate Printer 0267 Calibra stampante 0268 Cancel 0268 Annulla 0269 Cartoon 0269 Cartone animato 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 Attenzione: usa la funzione Modifica metadata principali \nper modificare i tag disponibili lì, per garantire \nche vengano effettuati gli aggiornamenti correlati. 0271 Center 0271 Centro 0272 Center Hole 0272 Foro centrale 0273 Change 0273 Cambia 0274 Change Log 0274 Registro modifiche 0275 Change file name 0275 Cambia nome file 0276 Change gallery sort order 0276 Cambia ordine di ordinamento galleria 0277 Change image colors using an algorithm 0277 Cambia i colori dell'immagine usando un algoritmo 0278 Change image pixel dimensions 0278 Cambia le dimensioni in pixel dell'immagine 0279 Chart to adjust monitor color 0279 Grafico per regolare il colore del monitor 0280 Choose 0280 Scegli 0281 Choose Album 0281 Scegli album 0282 Choose Albums 0282 Scegli album 0283 Choose Captions 0283 Scegli didascalie 0284 Choose an album and show as gallery of images 0284 Scegli un album e mostra come galleria di immagini 0285 Choose metadata shown on image captions 0285 Scegli i metadata mostrati nelle didascalie delle immagini 0286 Choose new Fotocx home folder 0286 Scegli una nuova cartella home di Fotocx 0287 Choose thumbnail folder 0287 Scegli la cartella thumbnail 0288 Choose top image folders 0288 Scegli le cartelle immagine principali 0289 Clear 0289 Cancella 0290 Click dark spot for black level 0290 Clicca su un punto scuro per il livello dei neri 0291 Click for RGB histogram 0291 Clicca per l'istogramma RGB 0292 Click gray spot for white balance 0292 Clicca su un punto grigio per il bilanciamento del bianco 0293 Click image to select pixels 0293 Clicca sull'immagine per selezionare i pixel 0294 Click image to select, drag image to move. 0294 Clicca sull'immagine per selezionare, trascina l'immagine per spostarla. 0295 Click mouse to change center 0295 Clicca con il mouse per cambiare centro 0296 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0296 Clicca vicino a una posizione qualsiasi sul contorno dell'area. \nVerranno individuate eventuali interruzioni nel contorno. \nPremi F1 per la guida 0297 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0297 Clicca i quattro angoli di un'area a tetragono. Premi [applica]. \nL'immagine viene deformata per trasformare il tetragono in un rettangolo. 0298 Click thumbnail to select file 0298 Clicca sulla miniatura per selezionare il file 0299 Clip Level 0299 Livello di clip 0300 Clip Limit % 0300 Limite clip % 0301 Color 0301 Colore 0302 Color Chooser 0302 Selettore colore 0303 Color Depth: 0303 Profondità colore: 0304 Color Fringes 0304 Frange di colore 0305 Color Hue 0305 Tonalità colore 0306 Color Map File 0306 File mappa colore 0307 Color Match Images 0307 Abbina colore immagini 0308 Color Mode 0308 Modalità colore 0309 Color calibration tool for printer and paper type 0309 Strumento di calibrazione colore per stampante e tipo di carta 0310 Color map file to use 0310 File mappa colore da usare 0311 Combine 0311 Combina 0312 Combine 2-6 images into a wide panorama image 0312 Combina da 2 a 6 immagini in un ampio panorama 0313 Combine many images into an array of images 0313 Combina molte immagini in un array di immagini 0314 Combine multiple images in layers, select and expose layers 0314 Combina più immagini in livelli, seleziona ed esponi i livelli 0315 Combine multiple noisy photos into a low-noise image 0315 Combina più foto rumorose in un'immagine a basso rumore 0316 Combine multiple photos to erase passing people, etc. 0316 Combina più foto per cancellare persone di passaggio, ecc. 0317 Combine within 0317 Combina entro 0318 Combine: HDR, HDF, stack, panorama, mashup, image array 0318 Combina: HDR, HDF, stack, panorama, mashup, array di immagini 0319 Command Params 0319 Parametri comando 0320 Commit 0320 Conferma 0321 Confirm Exit 0321 Conferma uscita 0322 Contrast 0322 Contrasto 0323 Contrast All 0323 Contrasto tutto 0324 Contrast Blue 0324 Contrasto blu 0325 Contrast Green 0325 Contrasto verde 0326 Contrast Limit 0326 Limite contrasto 0327 Contrast Red 0327 Contrasto rosso 0328 Convert %d image files 0328 Converti %d file immagine 0329 Convert an image into a Tiny Planet image 0329 Converti un'immagine in un'immagine Tiny Planet 0330 Convert image into a cartoon drawing 0330 Converti l'immagine in un disegno a cartone animato 0331 Convert image into a crosshatch sketch 0331 Converti l'immagine in uno schizzo a tratteggio incrociato 0332 Convert image into a line drawing 0332 Converti l'immagine in un disegno a linee 0333 Convert image into a simulated painting 0333 Converti l'immagine in un dipinto simulato 0334 Convert image into a simulated sketch (1) 0334 Converti l'immagine in uno schizzo simulato (1) 0335 Convert image into a simulated sketch (2) 0335 Converti l'immagine in uno schizzo simulato (2) 0336 Convert image into black/white lines 0336 Converti l'immagine in linee bianco/nero 0337 Convert image into dithered dots 0337 Converti l'immagine in punti con dithering 0338 Convert image into square tiles with 3D effect 0338 Converti l'immagine in tessere quadrate con effetto 3D 0339 Convert image into tiles matching feature contours 0339 Converti l'immagine in tessere che seguono i contorni 0340 Copy 0340 Copia 0341 Copy %d image files 0341 Copia %d file immagine 0342 Copy From Image 0342 Copia da immagine 0343 Copy Meta 0343 Copia meta 0344 Copy Metadata 0344 Copia metadata 0345 Copy Prior Edit 0345 Copia modifica precedente 0346 Copy Within Image 0346 Copia all'interno dell'immagine 0347 Copy area for later pasting into image 0347 Copia l'area per incollarla successivamente nell'immagine 0348 Copy areas from another image using the mouse 0348 Copia aree da un'altra immagine usando il mouse 0349 Copy areas from prior edits using the mouse 0349 Copia aree da modifiche precedenti usando il mouse 0350 Copy areas within an image using the mouse 0350 Copia aree all'interno di un'immagine usando il mouse 0351 Copy image file to the clipboard 0351 Copia il file immagine negli appunti 0352 Copy image file to the desktop 0352 Copia il file immagine sul desktop 0353 Copy in Image 0353 Copia in immagine 0354 Copy metadata from one image to another 0354 Copia i metadata da un'immagine a un'altra 0355 Copy or Move Image File 0355 Copia o sposta file immagine 0356 Copy or Move image file to new location 0356 Copia o sposta il file immagine in una nuova posizione 0357 Copy to Clipboard 0357 Copia negli appunti 0358 Copy to Desktop 0358 Copia sul desktop 0359 Copy without unsaved changes? 0359 Copiare senza le modifiche non salvate? 0360 Copy/Move 0360 Copia/Sposta 0361 Copy/move selected image files to a new folder 0361 Copia/sposta i file immagine selezionati in una nuova cartella 0362 Copyright 0362 Copyright 0363 Create 0363 Crea 0364 Create Album 0364 Crea album 0365 Create Blank Image 0365 Crea immagine vuota 0366 Create Mosaic 0366 Crea mosaico 0367 Create a blank image 0367 Crea un'immagine vuota 0368 Create a mosaic with tiles made from all images 0368 Crea un mosaico con tessere fatte da tutte le immagini 0369 Create a new album (ordered set of image files) 0369 Crea un nuovo album (insieme ordinato di file immagine) 0370 Create an embossed or 3D appearance 0370 Crea un aspetto in rilievo o 3D 0371 Create or replace an album 0371 Crea o sostituisci un album 0372 Crop 0372 Ritaglia 0373 Crop (trim) image margins 0373 Ritaglia (rifila) i margini dell'immagine 0374 Crop Buttons 0374 Pulsanti ritaglio 0375 Crop Image 0375 Ritaglia immagine 0376 Crosshatch 0376 Tratteggio incrociato 0377 Crosshatch Sketch 0377 Schizzo a tratteggio incrociato 0378 Current Album 0378 Album corrente 0379 Current File Folder 0379 Cartella file corrente 0380 Current gallery 0380 Galleria corrente 0381 Current image: 0381 Immagine corrente: 0382 Curve Node 0382 Nodo curva 0383 Curve lines need at least 4 points 0383 Le linee curve richiedono almeno 4 punti 0384 Custom 0384 Personalizzato 0385 Custom Kernel 0385 Kernel personalizzato 0386 Custom Shortcuts \n 0386 Scorciatoie personalizzate \n 0387 Custom menu: favorite/frequent functions, scripts, plugins 0387 Menu personalizzato: funzioni preferite/frequenti, script, plugin 0388 Customize 0388 Personalizza 0389 Customize: 0389 Personalizza: 0390 Cut Bottom 0390 Taglia in basso 0391 Cut Top 0391 Taglia in alto 0392 Cycle 2 Files 0392 Ciclo 2 file 0393 Cycle 2 Prior Files 0393 Ciclo 2 file precedenti 0394 Cycle 3 Files 0394 Ciclo 3 file 0395 Cycle 3 Prior Files 0395 Ciclo 3 file precedenti 0396 Cycle through images: 0396 Scorri le immagini: 0397 DARK/BRIGHT PIXELS 0397 PIXEL SCURI/CHIARI 0398 DEFOG 0398 DEFOG 0399 DELETE ALBUM 0399 ELIMINA ALBUM 0400 DELETE META 0400 ELIMINA META 0401 DELETE/TRASH 0401 ELIMINA/CESTINA 0402 DENOISE 0402 RIDUZIONE RUMORE 0403 DIALOG BUTTONS 0403 PULSANTI DIALOGO 0404 DITHER 0404 DITHERING 0405 DRAG AND DROP 0405 TRASCINA E RILASCIA 0406 Dark Areas 0406 Aree scure 0407 Dark Limit 0407 Limite scuro 0408 Dark Point 0408 Punto scuro 0409 Dark/Bright Pixels 0409 Pixel scuri/chiari 0410 Data file 0410 File dati 0411 Define keywords used for searching images 0411 Definisci keywords usate per la ricerca delle immagini 0412 Defined Keywords: 0412 Keywords definite: 0413 Defog 0413 Defog 0414 Delete 0414 Elimina 0415 Delete Album 0415 Elimina album 0416 Delete Meta 0416 Elimina meta 0417 Delete Metadata 0417 Elimina metadata 0418 Delete Originals 0418 Elimina originali 0419 Delete an album 0419 Elimina un album 0420 Delete or Trash selected image files 0420 Elimina o cestina i file immagine selezionati 0421 Delete or trash an image file 0421 Elimina o cestina un file immagine 0422 Delete read-only file? 0422 Eliminare il file di sola lettura? 0423 Delete/Trash 0423 Elimina/Cestina 0424 Denoise 0424 Riduzione rumore 0425 Depth 0425 Profondità 0426 Desc. 0426 Descr. 0427 Description: %s\n 0427 Descrizione: %s\n 0428 Desktop 0428 Desktop 0429 Dialog Font 0429 Font finestra di dialogo 0430 Diffs 0430 Differenze 0431 Directed Blur 0431 Sfocatura direzionale 0432 Directed Blur - blur locally in direction of mouse drag 0432 Sfocatura direzionale - sfocatura locale nella direzione del trascinamento del mouse 0433 Disable 0433 Disabilita 0434 Disable areas for editing 0434 Disabilita aree per la modifica 0435 Discard unsaved changes? 0435 Scartare le modifiche non salvate? 0436 Discard unsaved edits? 0436 Scartare le modifiche non salvate? 0437 Distort image areas using the mouse 0437 Distorci le aree dell'immagine usando il mouse 0438 Dither 0438 Dithering 0439 Dither Image 0439 Applica dithering all'immagine 0440 Dither0 0440 Dithering0 0441 Dither1 0441 Dithering1 0442 Dither2 0442 Dithering2 0443 Dither3 0443 Dithering3 0444 Dither4 0444 Dithering4 0445 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0445 Trascina le immagini per allinearle approssimativamente.\nPer ruotare, trascina dal bordo inferiore. 0446 Drag margin box middle or edges 0446 Trascina il centro o i bordi del riquadro margine 0447 Drag mouse on image. \nLeft click to cancel. 0447 Trascina il mouse sull'immagine. \nClic sinistro per annullare. 0448 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0448 Trascina il mouse per selezionare. Cancella. Ripeti. \nClic: estendi la selezione al mouse. 0449 Drag mouse to set center 0449 Trascina il mouse per impostare il centro 0450 Drag near an image corner using the mouse 0450 Trascina vicino a un angolo dell'immagine usando il mouse 0451 Drag on image to level image.\nClick on image for level lines. 0451 Trascina sull'immagine per livellarla.\nClicca sull'immagine per le linee di livello. 0452 Drag within image using the mouse 0452 Trascina all'interno dell'immagine usando il mouse 0453 Draw a line across the image in \ndirection of brightness change. 0453 Disegna una linea attraverso l'immagine nella \ndirezione del cambiamento di luminosità. 0454 Draw box on image 0454 Disegna un riquadro sull'immagine 0455 Draw line or arrow on image 0455 Disegna una linea o freccia sull'immagine 0456 Draw on image: text, line/arrow, box, circle, ellipse 0456 Disegna sull'immagine: testo, linea/freccia, riquadro, cerchio, ellisse 0457 Draw oval on image 0457 Disegna un ovale sull'immagine 0458 Draw text on image 0458 Disegna testo sull'immagine 0459 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0459 Cartelle duplicate o annidate: \n %s \n %s \nRimuovile. 0460 Duplicates: 0460 Duplicati: 0461 EDIT ALBUM 0461 MODIFICA ALBUM 0462 EDIT ANY META 0462 MODIFICA QUALSIASI META 0463 EDIT BOOKMARKS 0463 MODIFICA SEGNALIBRI 0464 EDIT MAIN META 0464 MODIFICA META PRINCIPALI 0465 EDIT MENU 0465 MENU MODIFICA 0466 EDIT PROCEDURES 0466 MODIFICA PROCEDURE 0467 EDIT SCRIPT 0467 MODIFICA SCRIPT 0468 EDIT WORKFLOW 0468 MODIFICA WORKFLOW 0469 EFFECTS MENU 0469 MENU EFFETTI 0470 EMBOSS 0470 RILIEVO 0471 ENABLE/DISABLE AREA 0471 ABILITA/DISABILITA AREA 0472 ENGRAVE 0472 INCISIONE 0473 ESCHER SPIRAL 0473 SPIRALE ESCHER 0474 EXPORT FILES 0474 ESPORTA FILE 0475 Edge 0475 Bordo 0476 Edit 0476 Modifica 0477 Edit Any Meta 0477 Modifica qualsiasi meta 0478 Edit Any Metadata 0478 Modifica qualsiasi metadata 0479 Edit Bookmarks 0479 Modifica segnalibri 0480 Edit Images 0480 Modifica immagini 0481 Edit Keyboard Shortcuts 0481 Modifica scorciatoie da tastiera 0482 Edit Line 0482 Modifica linea 0483 Edit Line/Arrow 0483 Modifica linea/freccia 0484 Edit Main Meta 0484 Modifica meta principali 0485 Edit Main Metadata 0485 Modifica metadata principali 0486 Edit Menu 0486 Modifica menu 0487 Edit Metadata 0487 Modifica metadata 0488 Edit Plugins 0488 Modifica plugin 0489 Edit Text 0489 Modifica testo 0490 Edit any metadata tag 0490 Modifica qualsiasi tag di metadata 0491 Edit function can not use Paint Edits 0491 La funzione Modifica non può usare Modifiche pittura 0492 Edit function must be active 0492 La funzione Modifica deve essere attiva 0493 Edit key metadata: keywords/geotags/description/rating ... 0493 Modifica metadata chiave: keywords/geotags/descrizione/valutazione ... 0494 Edit plugins menu 0494 Modifica menu plugin 0495 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0495 Modifica: ritaglia, ruota, ritocca, ridimensiona, markup, modifiche pittura, copia aree 0496 Effects 0496 Effetti 0497 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0497 Effetti: cartone animato, schizzo, dipinto, rilievo, dithering, texture, colori, convoluzione personalizzata 0498 Emboss 0498 Rilievo 0499 Enable 0499 Abilita 0500 Enable areas for editing 0500 Abilita aree per la modifica 0501 End of gallery 0501 Fine galleria 0502 Engrave 0502 Incisione 0503 Enter Keyword 0503 Inserisci keyword 0504 Enter New Keyword 0504 Inserisci nuova keyword 0505 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0505 Inserisci le proprietà di linea o freccia nella finestra di dialogo, \nclicca/trascina sull'immagine, clic destro per rimuovere 0506 Enter text, [Add] to layout, edit properties. 0506 Inserisci testo, [Aggiungi] al layout, modifica proprietà. 0507 Enter text, click/drag on image, right click to remove 0507 Inserisci testo, clicca/trascina sull'immagine, clic destro per rimuovere 0508 Erase 0508 Cancella 0509 Erase existing areas 0509 Cancella aree esistenti 0510 Escher Spiral 0510 Spirale Escher 0511 Exceed 50 anchor points 0511 Superati i 50 punti di ancoraggio 0512 Export Files 0512 Esporta file 0513 Export selected image files to another folder 0513 Esporta i file immagine selezionati in un'altra cartella 0514 FILE MENU 0514 MENU FILE 0515 FILE SAVE 0515 SALVA FILE 0516 FILE VIEW 0516 VISUALIZZA FILE 0517 FIND AREA GAP 0517 TROVA INTERRUZIONE AREA 0518 FIND BAD FILES 0518 TROVA FILE DANNEGGIATI 0519 FIND DUPLICATES 0519 TROVA DUPLICATI 0520 FIRST INDEX 0520 PRIMA INDICIZZAZIONE 0521 FIRST STARTUP 0521 PRIMO AVVIO 0522 FIX META 0522 CORREGGI META 0523 FLATTEN HISTOGRAM 0523 APPIATTISCI ISTOGRAMMA 0524 FLATTEN PHOTO 0524 APPIATTISCI FOTO 0525 FOLDER TREE 0525 ALBERO CARTELLE 0526 FOTOCX FOR WINDOWS 11 0526 FOTOCX PER WINDOWS 11 0527 FOTOCX LIMITATIONS 0527 LIMITAZIONI DI FOTOCX 0528 FOTOCX USAGE 0528 UTILIZZO DI FOTOCX 0529 FRINGES 0529 FRANGE 0530 FUSION 0530 FUSIONE 0531 Fetch 0531 Recupera 0532 File 0532 File 0533 File Mod Date/Time 0533 Data/ora modifica file 0534 File Name 0534 Nome file 0535 File Name/Number 0535 Nome file/Numero 0536 File Name: %s \n 0536 Nome file: %s \n 0537 File Size (bytes) 0537 Dimensione file (byte) 0538 File View 0538 Visualizza file 0539 File count: 0539 Numero file: 0540 File type cannot be edited 0540 Il tipo di file non può essere modificato 0541 File1 0541 File1 0542 File2 0542 File2 0543 File: 0543 File: 0544 File: new session, open, rename, copy/move, delete, print 0544 File: nuova sessione, apri, rinomina, copia/sposta, elimina, stampa 0545 Fill selected areas or transparent areas with a color 0545 Riempi le aree selezionate o le aree trasparenti con un colore 0546 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0546 Riempi le aree selezionate con un colore per verifica visiva. \nMetodo 1: clic sinistro in ogni area selezionata non ancora riempita. \nMetodo 2: clic destro FUORI da tutte le aree selezionate. \nPremi il pulsante [aiuto] per chiarimenti 0547 Find 0547 Trova 0548 Find Bad Files 0548 Trova file danneggiati 0549 Find Duplicate Images 0549 Trova immagini duplicate 0550 Find Duplicates 0550 Trova duplicati 0551 Find Gap 0551 Trova interruzione 0552 Find a gap in an area outline 0552 Trova un'interruzione nel contorno di un'area 0553 Find all images for a location [date range] 0553 Trova tutte le immagini per una posizione [intervallo date] 0554 Find all images for a selected tag name and value 0554 Trova tutte le immagini per un nome e valore di tag selezionato 0555 Find images meeting multiple search criteria 0555 Trova immagini che soddisfano più criteri di ricerca 0556 Find optimum factors: 0556 Trova fattori ottimali: 0557 Finish 0557 Termina 0558 Finish Area 0558 Termina area 0559 Fix Bad File 0559 Correggi file danneggiato 0560 Fix Broken Metadata 0560 Correggi metadata danneggiati 0561 Fix Meta 0561 Correggi meta 0562 Fix Motion Blur 0562 Correggi sfocatura da movimento 0563 Fix Perspective 0563 Correggi prospettiva 0564 Fix color fringes (chromatic aberration) 0564 Correggi le frange di colore (aberrazione cromatica) 0565 Fix perspective for object photographed from an angle 0565 Correggi la prospettiva per oggetti fotografati da un'angolazione 0566 Fix red-eyes from flash photo 0566 Correggi gli occhi rossi da foto con flash 0567 Flatten 0567 Appiattisci 0568 Flatten Histogram 0568 Appiattisci istogramma 0569 Flatten Pano 0569 Appiattisci panorama 0570 Flatten Photo 0570 Appiattisci foto 0571 Flatten brightness histogram to enhance details 0571 Appiattisci l'istogramma di luminosità per migliorare i dettagli 0572 Flatten curved surface. 0572 Appiattisci superficie curva. 0573 Flatten photo of a curved image (e.g. poster on round column 0573 Appiattisci foto di un'immagine curva (es. poster su colonna rotonda 0574 Flip 0574 Capovolgi 0575 Folder Tree 0575 Albero cartelle 0576 Folders 0576 Cartelle 0577 Folders for image files (subfolders included automatically) 0577 Cartelle per i file immagine (sottocartelle incluse automaticamente) 0578 Font 0578 Font 0579 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0579 Per sequenza casuale di immagini, questo valore è \nla frequenza relativa con cui mostrare l'immagine. \nIl valore base è 10. 20 --> mostra 2 volte più spesso. 0580 Foreground 0580 Primo piano 0581 Fotocx copyright notice 0581 Nota di copyright Fotocx 0582 Fotocx home 0582 Home Fotocx 0583 Fotocx privacy policy 0583 Informativa sulla privacy di Fotocx 0584 Fotocx video tutorial on YouTube 0584 Video tutorial di Fotocx su YouTube 0585 Fotocx web site (information and downloads) 0585 Sito web di Fotocx (informazioni e download) 0586 FreeSans 0586 FreeSans 0587 Full List 0587 Elenco completo 0588 Full Screen 0588 Schermo intero 0589 Fusion 0589 Fusione 0590 GALLERY END 0590 FINE GALLERIA 0591 GALLERY FILTER 0591 FILTRO GALLERIA 0592 GALLERY HOME 0592 HOME GALLERIA 0593 GALLERY MENU 0593 MENU GALLERIA 0594 GALLERY OVERVIEW 0594 PANORAMICA GALLERIA 0595 GALLERY SORT 0595 ORDINAMENTO GALLERIA 0596 GALLERY TO ALBUM 0596 DA GALLERIA AD ALBUM 0597 GALLERY VIEW 0597 VISUALIZZAZIONE GALLERIA 0598 GDK pixbuf: cannot save file 0598 GDK pixbuf: impossibile salvare il file 0599 GLOBAL RETINEX 0599 RETINEX GLOBALE 0600 GRID SETTINGS 0600 IMPOSTAZIONI GRIGLIA 0601 Gallery 0601 Galleria 0602 Gallery End 0602 Fine galleria 0603 Gallery Filter 0603 Filtro galleria 0604 Gallery Home 0604 Home galleria 0605 Gallery Sort 0605 Ordinamento galleria 0606 Gallery View 0606 Visualizzazione galleria 0607 Gallery of newest image files 0607 Galleria dei file immagine più recenti 0608 Gallery of recently viewed image files 0608 Galleria dei file immagine visualizzati di recente 0609 Gallery to Album 0609 Da galleria ad album 0610 Gallery view with thumbnails and basic metadata 0610 Vista galleria con miniature e metadata di base 0611 Gallery view with thumbnails and file data 0611 Vista galleria con miniature e dati file 0612 Gallery: thumbnails, new/recent, sort, select, bookmarks 0612 Galleria: miniature, nuovi/recenti, ordina, seleziona, segnalibri 0613 Generate an inward spiraling repeating image 0613 Genera un'immagine ripetuta a spirale verso l'interno 0614 Global Retinex 0614 Retinex globale 0615 Gradual 0615 Graduale 0616 Graduated Blur 0616 Sfocatura graduale 0617 Graduated Blur - blur relative to pixel contrast 0617 Sfocatura graduale - sfocatura relativa al contrasto dei pixel 0618 Grayscale 0618 Scala di grigi 0619 Green 0619 Verde 0620 Grid Settings 0620 Impostazioni griglia 0621 Group by country 0621 Raggruppa per paese 0622 Group by country/date 0622 Raggruppa per paese/data 0623 Group by country/location 0623 Raggruppa per paese/posizione 0624 Group by country/location/date 0624 Raggruppa per paese/posizione/data 0625 Group by date/country 0625 Raggruppa per data/paese 0626 Group by date/country/location 0626 Raggruppa per data/paese/posizione 0627 HDF 0627 HDF 0628 HDR 0628 HDR 0629 HELP MENU 0629 MENU AIUTO 0630 Hard 0630 Duro 0631 Height 0631 Altezza 0632 Height: 0632 Altezza: 0633 Help 0633 Aiuto 0634 Help: user guide, tutorial, change log, licenses, privacy, about 0634 Aiuto: guida utente, tutorial, registro modifiche, licenze, privacy, informazioni 0635 Hide 0635 Nascondi 0636 Hide selected areas 0636 Nascondi aree selezionate 0637 High 0637 Alto 0638 High Depth of Field - combine near/far focus images for deeper focus 0638 Alta profondità di campo - combina immagini a fuoco vicino/lontano per una messa a fuoco più profonda 0639 High Dynamic Range - combine bright/dark images for better detail 0639 Alta gamma dinamica - combina immagini chiare/scure per dettagli migliori 0640 Highlight darkest and brightest pixels 0640 Evidenzia i pixel più scuri e più chiari 0641 Home Folder 0641 Cartella home 0642 Home Page 0642 Pagina iniziale 0643 Horz 0643 Orizz. 0644 How to remove Fotocx application and user files 0644 Come rimuovere l'applicazione Fotocx e i file utente 0645 Hue 0645 Tonalità 0646 IMAGE ARRAY 0646 ARRAY DI IMMAGINI 0647 INDEX FILES 0647 INDICIZZA FILE 0648 INSIDE-OUT 0648 DA DENTRO A FUORI 0649 INVERT AREA 0649 INVERTI AREA 0650 Icon size 0650 Dimensione icona 0651 Icons 0651 Icone 0652 Image 0652 Immagine 0653 Image Array 0653 Array di immagini 0654 Image Columns 0654 Colonne immagine 0655 Image Differences 0655 Differenze immagine 0656 Image File 0656 File immagine 0657 Image File: 0657 File immagine: 0658 Image Keywords 0658 Keywords immagine 0659 Image Locations 0659 Posizioni immagine 0660 Image Markup 0660 Markup immagine 0661 Image Position 0661 Posizione immagine 0662 Image Preferences 0662 Preferenze immagine 0663 Image Ratios 0663 Proporzioni immagine 0664 Image Size (pixels) 0664 Dimensione immagine (pixel) 0665 Image Time 0665 Ora immagine 0666 Image Timeline 0666 Cronologia immagine 0667 Image colors are converted for printing. 0667 I colori dell'immagine vengono convertiti per la stampa. 0668 Image dimensions have changed \nCopy Prior Edit cannot be used 0668 Le dimensioni dell'immagine sono cambiate \nCopia modifica precedente non può essere usata 0669 Image dimensions have changed, \nArea Blend cannot be used 0669 Le dimensioni dell'immagine sono cambiate, \nSfumatura area non può essere usata 0670 Image dimensions have changed, \nthis prior image cannot be used 0670 Le dimensioni dell'immagine sono cambiate, \nquesta immagine precedente non può essere usata 0671 Image is fixed, unmovable 0671 L'immagine è fissa, non spostabile 0672 Images sizes are not compatible 0672 Le dimensioni delle immagini non sono compatibili 0673 Include: 0673 Includi: 0674 Index Files 0674 Indicizza file 0675 Index Level 0675 Livello indicizzazione 0676 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0676 Funzione di indicizzazione terminata. \nL'indicizzazione è necessaria per le funzioni di ricerca e mappa \ne per visualizzare rapidamente le pagine della galleria miniature. 0677 Index new image files and make thumbnails 0677 Indicizza nuovi file immagine e crea le miniature 0678 Input color to match and adjust: 0678 Colore di input da abbinare e regolare: 0679 Inside-out 0679 Da dentro a fuori 0680 Install following programs using your package manager: \n 0680 Installa i seguenti programmi usando il tuo gestore pacchetti: \n 0681 Intensity 0681 Intensità 0682 Invert 0682 Inverti 0683 Invert selected areas (selected ↔ not selected) 0683 Inverti le aree selezionate (selezionata ↔ non selezionata) 0684 Irregular Tiles 0684 Tessere irregolari 0685 Iterations 0685 Iterazioni 0686 JPEG ARTIFACTS 0686 ARTEFATTI JPEG 0687 JPEG Artifacts 0687 Artefatti JPEG 0688 JPEG files 0688 File JPEG 0689 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0689 Gen Feb Mar Apr Mag Giu Lug Ago Set Ott Nov Dic 0690 Jump to gallery beginning [home] 0690 Vai all'inizio della galleria [home] 0691 Jump to gallery end [end] 0691 Vai alla fine della galleria [end] 0692 KEYBOARD ESCAPE KEY 0692 TASTO ESC TASTIERA 0693 KEYBOARD SHORTCUTS 0693 SCORCIATOIE DA TASTIERA 0694 KEYWORDS OVERVIEW 0694 PANORAMICA KEYWORDS 0695 Keep 0695 Mantieni 0696 Kernel size 0696 Dimensione kernel 0697 Keyboard Shortcuts 0697 Scorciatoie da tastiera 0698 Keywords Category 0698 Categoria keywords 0699 Kill active dialog? 0699 Chiudere la finestra di dialogo attiva? 0700 Kill busy function? 0700 Interrompere la funzione occupata? 0701 Kuwahara 0701 Kuwahara 0702 Kuwahara Depth 0702 Profondità Kuwahara 0703 LINE COLOR 0703 COLORE LINEA 0704 LOAD/SAVE AREA 0704 CARICA/SALVA AREA 0705 LOCAL CONTRAST 0705 CONTRASTO LOCALE 0706 LOCAL RETINEX 0706 RETINEX LOCALE 0707 Language 0707 Lingua 0708 Layout and background image 0708 Layout e immagine di sfondo 0709 Left 0709 Sinistra 0710 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0710 Trascina il mouse con il tasto sinistro all'interno dell'area \nper annullare gradualmente le modifiche all'area. \nTrascina con il tasto destro per ripristinare le modifiche. \nTrascina lungo il bordo dell'area per sfumare il bordo. 0711 Left/right click: previous/next image (also arrow keys) 0711 Clic sinistro/destro: immagine precedente/successiva (anche frecce) 0712 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0712 Clic sinistro/destro: annulla/ripristina un passaggio di modifica \nClic centrale: torna al passaggio di modifica selezionato 0713 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0713 Clic sinistro/destro: zoom avanti/indietro immagine/miniatura (anche tasti +/-) 0714 Length 0714 Lunghezza 0715 Level 0715 Livello 0716 Licenses 0716 Licenze 0717 Light Source 0717 Sorgente luminosa 0718 Lightness 0718 Luminosità 0719 Limit 0719 Limite 0720 Line Color 0720 Colore linea 0721 Line Threshold 0721 Soglia linea 0722 Line Width 0722 Spessore linea 0723 Line length 0723 Lunghezza linea 0724 List Fotocx command line parameters 0724 Elenca i parametri della riga di comando di Fotocx 0725 List all metadata for current image or clicked thumbnail 0725 Elenca tutti i metadata dell'immagine corrente o della miniatura cliccata 0726 List outboard programs and functions 0726 Elenca programmi e funzioni esterni 0727 Load 0727 Carica 0728 Load settings from file 0728 Carica impostazioni da file 0729 Local Contrast 0729 Contrasto locale 0730 Local Retinex 0730 Retinex locale 0731 Location 0731 Posizione 0732 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0732 La posizione e il paese sostituiranno i valori attuali.\nI dati GPS vengono sostituiti solo se è presente un nuovo valore. 0733 Lock 0733 Blocca 0734 Low Amplify 0734 Amplificazione bassa 0735 MAGNIFY IMAGE 0735 INGRANDISCI IMMAGINE 0736 MAKE WAVES 0736 CREA ONDE 0737 MANAGE KEYWORDS 0737 GESTISCI KEYWORDS 0738 MAP MENU 0738 MENU MAPPA 0739 MAP VIEW 0739 VISTA MAPPA 0740 MARGINS 0740 MARGINI 0741 MARKUP 0741 MARKUP 0742 MASHUP 0742 MASHUP 0743 MATCH COLORS 0743 ABBINA COLORI 0744 MEASURE IMAGE 0744 MISURA IMMAGINE 0745 MENU SHORTCUTS 0745 SCORCIATOIE MENU 0746 METADATA MENU 0746 MENU METADATA 0747 METADATA TAGS 0747 TAG METADATA 0748 METADATA VIEW 0748 VISTA METADATA 0749 MONITOR COLOR 0749 COLORE MONITOR 0750 MOSAIC 0750 MOSAICO 0751 MOUSE ALT-RIGHT-BUTTON 0751 MOUSE ALT-TASTO DESTRO 0752 MOUSE FUNCTIONS 0752 FUNZIONI MOUSE 0753 MOUSE OWNERSHIP 0753 PROPRIETÀ MOUSE 0754 MOVE FOTOCX HOME 0754 SPOSTA HOME FOTOCX 0755 Magnify 0755 Ingrandisci 0756 Magnify Image 0756 Ingrandisci immagine 0757 Magnify image around the mouse position 0757 Ingrandisci l'immagine attorno alla posizione del mouse 0758 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0758 La memoria principale è troppo piccola per eseguire Fotocx. \nPuoi comunque provare, se lo desideri. \n Continuare? 0759 Make Layout Image 0759 Crea immagine layout 0760 Make Square Tiles 0760 Crea tessere quadrate 0761 Make Waves 0761 Crea onde 0762 Make a spherical projection of an image 0762 Crea una proiezione sferica di un'immagine 0763 Make black margins transparent 0763 Rendi trasparenti i margini neri 0764 Make new versions 0764 Crea nuove versioni 0765 Make width constant for window size 0765 Mantieni larghezza costante per la dimensione finestra 0766 Manage Keywords 0766 Gestisci keywords 0767 Map 0767 Mappa 0768 Map View 0768 Vista mappa 0769 Maps 0769 Mappe 0770 Maps: view images by map location 0770 Mappe: visualizza immagini in base alla posizione sulla mappa 0771 Margin 0771 Margine 0772 Margins 0772 Margini 0773 Markup 0773 Markup 0774 Mashup 0774 Mashup 0775 Mass update album files 0775 Aggiornamento massivo dei file album 0776 Match Brightness 0776 Abbina luminosità 0777 Match Colors 0777 Abbina colori 0778 Match Level 0778 Livello di abbinamento 0779 Match Limit 0779 Limite di abbinamento 0780 Match image colors to colors of another image 0780 Abbina i colori dell'immagine ai colori di un'altra immagine 0781 Match using: 0781 Abbina usando: 0782 Matching Keywords 0782 Keywords corrispondenti 0783 Max 0783 Max 0784 Max. Width 0784 Larghezza max. 0785 Measure Image 0785 Misura immagine 0786 Measure Noise 0786 Misura rumore 0787 Measure pixel distances within an image 0787 Misura le distanze tra pixel all'interno di un'immagine 0788 Menu Colors 0788 Colori menu 0789 Menu Style 0789 Stile menu 0790 Metadata 0790 Metadata 0791 Metadata Tags 0791 Tag metadata 0792 Metadata View 0792 Vista metadata 0793 Metadata from Search Function 0793 Metadata dalla funzione di ricerca 0794 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0794 Metodo 1:\nClic sinistro sull'occhio rosso per scurirlo.\nMetodo 2:\nTrascina in basso a destra per racchiudere l'occhio rosso.\nClic sinistro sull'occhio rosso per scurirlo.\nAnnulla occhio rosso:\nClic destro sull'occhio rosso. 0795 Mirror: 0795 Specchio: 0796 Mode: 0796 Modalità: 0797 Monitor Color 0797 Colore monitor 0798 Mosaic 0798 Mosaico 0799 Mouse Radius 0799 Raggio mouse 0800 Mouse Warp (drag image) 0800 Deformazione mouse (trascina immagine) 0801 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0801 Trascinamento mouse: panning immagine 360° \nClic sinistro/destro mouse: zoom avanti/indietro \nEsc: esci dalla vista panorama 0802 Move %d image files 0802 Sposta %d file immagine 0803 Move Fotocx Home 0803 Sposta home Fotocx 0804 Move Fotocx Home Folder 0804 Sposta cartella home Fotocx 0805 Move Fotocx home folder to chosen folder 0805 Sposta la cartella home di Fotocx nella cartella scelta 0806 Move mouse in a monotone image area. 0806 Muovi il mouse in un'area dell'immagine monotona. 0807 Multiplier 0807 Moltiplicatore 0808 NEW SESSION 0808 NUOVA SESSIONE 0809 NEWEST FILES 0809 FILE PIÙ RECENTI 0810 NEWLINE CHARACTERS IN METADATA 0810 CARATTERI DI NUOVA RIGA NEI METADATA 0811 NON-STANDARD DIALOG WIDGETS 0811 WIDGET DI DIALOGO NON STANDARD 0812 New Area 0812 Nuova area 0813 New File Name: 0813 Nuovo nome file: 0814 New Location 0814 Nuova posizione 0815 New Location: 0815 Nuova posizione: 0816 New Name 0816 Nuovo nome 0817 New Session 0817 Nuova sessione 0818 New Type: 0818 Nuovo tipo: 0819 New Version 0819 Nuova versione 0820 Newest 0820 Più recente 0821 Newest Files 0821 File più recenti 0822 Next 0822 Successivo 0823 Next gallery 0823 Galleria successiva 0824 No 0824 No 0825 No curve lines found 0825 Nessuna linea curva trovata 0826 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0826 Non è stato trovato alcun indice dei file immagine.\nVerrà creato un indice dei file immagine.\nI tuoi file immagine non verranno modificati.\nQuesto potrebbe richiedere molto tempo se hai \nmigliaia di file immagine. 0827 No images found 0827 Nessuna immagine trovata 0828 Noise Reduction 0828 Riduzione rumore 0829 Noise Size 0829 Dimensione rumore 0830 None 0830 Nessuno 0831 Normal Blur 0831 Sfocatura normale 0832 Normal Blur - mix pixels with all neighbor pixels 0832 Sfocatura normale - mescola i pixel con tutti i pixel adiacenti 0833 OPEN IMAGE FILE 0833 APRI FILE IMMAGINE 0834 OTHER TOPICS 0834 ALTRI ARGOMENTI 0835 OUTLINES 0835 CONTORNI 0836 Old Name 0836 Vecchio nome 0837 One Tag: 0837 Un tag: 0838 Opacity 0838 Opacità 0839 Open 0839 Apri 0840 Open Image File 0840 Apri file immagine 0841 Open a file and paste as selected area into an image 0841 Apri un file e incollalo come area selezionata in un'immagine 0842 Open a parallel Fotocx session 0842 Apri una sessione Fotocx parallela 0843 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0843 Apri e modifica il file della carta colore scansionata. \nRimuovi eventuale inclinazione o rotazione dovuta alla scansione. \n(Usa la funzione Correggi prospettiva per questo). \nTaglia con precisione il sottile margine verde. \nSalva (sostituisci) il file della carta colore. 0844 Open the trimmed color chart file 0844 Apri il file della carta colore ritagliata 0845 Optimize 0845 Ottimizza 0846 Other Tag ... 0846 Altro tag ... 0847 Outboard Programs 0847 Programmi esterni 0848 Outline Drawing 0848 Disegno contorni 0849 Outlines 0849 Contorni 0850 Output Color 0850 Colore output 0851 Overlap 0851 Sovrapposizione 0852 Overlay position in host image: 0852 Posizione sovrapposizione nell'immagine host: 0853 Overlay width, % host image width: 0853 Larghezza sovrapposizione, % larghezza immagine host: 0854 Overwrite file? \n%s 0854 Sovrascrivere il file? \n%s 0855 PAINT EDITS 0855 MODIFICHE PITTURA 0856 PAINT IMAGE 0856 DIPINGI IMMAGINE 0857 PAINT TRANSPARENCY 0857 DIPINGI TRASPARENZA 0858 PAINTING 0858 PITTURA 0859 PANORAMA 0859 PANORAMA 0860 PATTERN 0860 MOTIVO 0861 PERSPECTIVE 0861 PROSPETTIVA 0862 PLACES/DATES 0862 LUOGHI/DATE 0863 PLUGINS 0863 PLUGIN 0864 PREV/NEXT 0864 PREC/SUCC 0865 PRINT CALIBRATED 0865 STAMPA CALIBRATA 0866 PRINT IMAGE 0866 STAMPA IMMAGINE 0867 PRIVACY 0867 PRIVACY 0868 PROBLEM FILES 0868 FILE PROBLEMATICI 0869 PROBLEM REPORTING 0869 SEGNALAZIONE PROBLEMI 0870 Paint Edits 0870 Modifiche pittura 0871 Paint Edits already active 0871 Modifiche pittura già attive 0872 Paint Image 0872 Dipingi immagine 0873 Paint Image Transparencies 0873 Dipingi trasparenze immagine 0874 Paint Radius 0874 Raggio pennello 0875 Paint Transparency 0875 Dipingi trasparenza 0876 Paint and Warp Image 0876 Dipingi e deforma immagine 0877 Paint current edit function gradually using the mouse 0877 Dipingi gradualmente la funzione di modifica corrente usando il mouse 0878 Paint entire image 0878 Dipingi l'intera immagine 0879 Paint image transparency using the mouse 0879 Dipingi la trasparenza dell'immagine usando il mouse 0880 Paint on Image 0880 Dipingi sull'immagine 0881 Paint on image using the mouse 0881 Dipingi sull'immagine usando il mouse 0882 Paint transparency 0882 Dipingi trasparenza 0883 Paint within mouse 0883 Dipingi entro il mouse 0884 Painting 0884 Pittura 0885 Panorama 0885 Panorama 0886 Paste 0886 Incolla 0887 Paste Image 0887 Incolla immagine 0888 Paste previously copied area into image 0888 Incolla l'area precedentemente copiata nell'immagine 0889 Pattern 0889 Motivo 0890 Pattern File: 0890 File motivo: 0891 Pattern Width 0891 Larghezza motivo 0892 Percent 0892 Percento 0893 Permissions 0893 Permessi 0894 Perspective 0894 Prospettiva 0895 Photo Date 0895 Data foto 0896 Photo Date/Time 0896 Data/ora foto 0897 Photo Date/Time (metadata) 0897 Data/ora foto (metadata) 0898 Photo Date: %s File Date: %s \n 0898 Data foto: %s Data file: %s \n 0899 Pixel count 0899 Numero pixel 0900 Pixel difference 0900 Differenza pixel 0901 Pixels 0901 Pixel 0902 Places/Dates 0902 Luoghi/date 0903 Plugin working ... 0903 Plugin in esecuzione ... 0904 Popup Image 0904 Immagine popup 0905 Power 0905 Potenza 0906 Power Center 0906 Potenza centro 0907 Power: Center 0907 Potenza: Centro 0908 Pre-align Images 0908 Pre-allinea immagini 0909 Preference: 0909 Preferenza: 0910 Press F1 for help 0910 Premi F1 per la guida 0911 Prev 0911 Prec 0912 Prev/Next 0912 Prec/Succ 0913 Previous 0913 Precedente 0914 Previous gallery 0914 Galleria precedente 0915 Print Calibrated 0915 Stampa calibrata 0916 Print Image 0916 Stampa immagine 0917 Print chart in vertical orientation without margins. 0917 Stampa grafico in orientamento verticale senza margini. 0918 Print current image file with calibrated colors 0918 Stampa il file immagine corrente con colori calibrati 0919 Print the current image file 0919 Stampa il file immagine corrente 0920 Privacy 0920 Privacy 0921 Proceed 0921 Procedi 0922 Proceed? 0922 Procedere? 0923 Process album files matching selected files: 0923 Elabora file album corrispondenti ai file selezionati: 0924 Process an image using a custom convolution kernel 0924 Elabora un'immagine usando un kernel di convoluzione personalizzato 0925 Process selected album files: 0925 Elabora i file album selezionati: 0926 Processing files 0926 Elaborazione file 0927 Project name 0927 Nome progetto 0928 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0928 Trascina una posizione dell'immagine usando il mouse. \nEsegui più trascinamenti fino a soddisfazione. \nAl termine, premi [OK]. 0929 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0929 Trascina un angolo dell'immagine usando il mouse. \nEsegui più trascinamenti fino a soddisfazione. \nAl termine, premi [OK]. 0930 Pull on the image with the mouse. 0930 Trascina l'immagine con il mouse. 0931 Purge unwanted keywords from all image files 0931 Elimina le keywords indesiderate da tutti i file immagine 0932 QUESTIONS, SUGGESTIONS 0932 DOMANDE, SUGGERIMENTI 0933 Quit 0933 Esci 0934 Quit Fotocx 0934 Esci da Fotocx 0935 Quit Fotocx? 0935 Uscire da Fotocx? 0936 RAW Files 0936 File RAW 0937 RAW Options 0937 Opzioni RAW 0938 RAW conversion failed: %s %s 0938 Conversione RAW non riuscita: %s %s 0939 RAW loader 0939 Caricatore RAW 0940 RECENT FILES 0940 FILE RECENTI 0941 RECENT FOLDERS 0941 CARTELLE RECENTI 0942 RED EYES 0942 OCCHI ROSSI 0943 REFINE MENU 0943 MENU RAFFINA 0944 REMOVE DUST 0944 RIMUOVI POLVERE 0945 REMOVE HALO 0945 RIMUOVI ALONE 0946 RENAME 0946 RINOMINA 0947 RENAME ALBUM 0947 RINOMINA ALBUM 0948 REPAIR MENU 0948 MENU RIPARA 0949 RESCALE 0949 RIDIMENSIONA 0950 RETOUCH 0950 RITOCCA 0951 RGB -> BRG 0951 RGB -> BRG 0952 RGB -> GBR 0952 RGB -> GBR 0953 RGB HISTOGRAM 0953 ISTOGRAMMA RGB 0954 RGB Histogram 0954 Istogramma RGB 0955 RGB brightness histogram graph 0955 Grafico istogramma luminosità RGB 0956 RGB color 0956 Colore RGB 0957 RGB mix with given bit-depth 0957 Mix RGB con profondità di bit specificata 0958 ROTATE 0958 RUOTA 0959 RUN SCRIPT 0959 ESEGUI SCRIPT 0960 Radial Blur 0960 Sfocatura radiale 0961 Radial Blur - mix pixels in radial lines from chosen center 0961 Sfocatura radiale - mescola i pixel in linee radiali dal centro scelto 0962 Radius 0962 Raggio 0963 Random Image 0963 Immagine casuale 0964 Range 0964 Intervallo 0965 Rating: 0965 Valutazione: 0966 Rating: %s Size: %s %.2fmb \n 0966 Valutazione: %s Dimensione: %s %.2fmb \n 0967 Read or search the user guide 0967 Leggi o cerca nella guida utente 0968 Recent Files 0968 File recenti 0969 Recent Folders 0969 Cartelle recenti 0970 Recent Keywords 0970 Keywords recenti 0971 Rectify closeup face photo (balloon face) 0971 Rettifica foto ravvicinata del volto (effetto viso a palloncino) 0972 Red 0972 Rosso 0973 Red Eye Reduction 0973 Riduzione occhi rossi 0974 Red Eyes 0974 Occhi rossi 0975 Red Factors 0975 Fattori rosso 0976 Redo 0976 Ripristina 0977 Reduce Fog/Haze 0977 Riduci foschia/nebbia 0978 Reduce fog/haze in an image or selected areas 0978 Riduci foschia/nebbia in un'immagine o nelle aree selezionate 0979 Refine 0979 Raffina 0980 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0980 Raffina: appiattisci istogramma, contrasto locale, amplifica contrasto, retinex, saturazione 0981 Remove 0981 Rimuovi 0982 Remove Dust 0982 Rimuovi polvere 0983 Remove Halo 0983 Rimuovi alone 0984 Remove dust spots from old scanned photos 0984 Rimuovi macchie di polvere da vecchie foto scansionate 0985 Remove from Album 0985 Rimuovi da album 0986 Remove halos left by some edit functions 0986 Rimuovi aloni lasciati da alcune funzioni di modifica 0987 Remove image curvature, especially in panoramas 0987 Rimuovi la curvatura dell'immagine, specialmente nei panorami 0988 Remove jaggies on hard image feature edges 0988 Rimuovi le seghettature sui bordi netti dell'immagine 0989 Remove selected image metadata 0989 Rimuovi i metadata selezionati dell'immagine 0990 Remove unwanted objects in an image 0990 Rimuovi oggetti indesiderati in un'immagine 0991 Rename 0991 Rinomina 0992 Rename Album 0992 Rinomina album 0993 Rename Image File 0993 Rinomina file immagine 0994 Rename an existing album 0994 Rinomina un album esistente 0995 Rename or delete keywords for all image files 0995 Rinomina o elimina keywords per tutti i file immagine 0996 Rename to 0996 Rinomina in 0997 Rename/convert/rescale/move selected image or RAW files 0997 Rinomina/converti/ridimensiona/sposta i file immagine o RAW selezionati 0998 Repair 0998 Ripara 0999 Repair malformed metadata preventing metadata edits 0999 Ripara metadata malformati che impediscono la modifica dei metadata 1000 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 1000 Ripara: nitidezza, sfocatura, riduzione rumore, defog, occhi rossi, cancellazione intelligente, regola colore 1001 Replace 1001 Sostituisci 1002 Replace Text 1002 Sostituisci testo 1003 Replace all versions with newest version 1003 Sostituisci tutte le versioni con la versione più recente 1004 Replace all versions with selected versions 1004 Sostituisci tutte le versioni con le versioni selezionate 1005 Replace all with newest version only 1005 Sostituisci tutto solo con la versione più recente 1006 Replace all with original + newest version 1006 Sostituisci tutto con originale + versione più recente 1007 Replace all with original + selected versions 1007 Sostituisci tutto con originale + versioni selezionate 1008 Replace all with original and all versions 1008 Sostituisci tutto con originale e tutte le versioni 1009 Replace all with selected versions 1009 Sostituisci tutto con le versioni selezionate 1010 Replace host files 1010 Sostituisci file host 1011 Report Image Places/Dates 1011 Report luoghi/date immagine 1012 Report selected metadata for selected image files 1012 Segnala i metadata selezionati per i file immagine selezionati 1013 Required programs are installed. \n 1013 I programmi richiesti sono installati. \n 1014 Rescale 1014 Ridimensiona 1015 Rescale Image 1015 Ridimensiona immagine 1016 Rescale RGB levels to reduce color caste and fog/haze 1016 Ridimensiona i livelli RGB per ridurre la dominante di colore e la foschia/nebbia 1017 Rescale brightness levels to increase local contrast 1017 Ridimensiona i livelli di luminosità per aumentare il contrasto locale 1018 Rescale: 1018 Ridimensiona: 1019 Reserved Shortcuts \n 1019 Scorciatoie riservate \n 1020 Reserved shortcut ignored: %s 1020 Scorciatoia riservata ignorata: %s 1021 Reset 1021 Reimposta 1022 Reset all galleries to file name ascending 1022 Reimposta tutte le gallerie in ordine crescente per nome file 1023 Resolution 1023 Risoluzione 1024 Resources 1024 Risorse 1025 Resume 1025 Riprendi 1026 Retouch 1026 Ritocca 1027 Reverse R 1027 Inverti R 1028 Richardson-Lucy 1028 Richardson-Lucy 1029 Right 1029 Destra 1030 Rim % 1030 Bordo % 1031 Rotate 1031 Ruota 1032 Rotate Image 1032 Ruota immagine 1033 Rotate or level an image 1033 Ruota o livella un'immagine 1034 Rotate: 1034 Ruota: 1035 Roy Lichtenstein effect 1035 Effetto Roy Lichtenstein 1036 SATURATION 1036 SATURAZIONE 1037 SCRIPT FILES 1037 FILE SCRIPT 1038 SEARCH IMAGES 1038 CERCA IMMAGINI 1039 SELECT AREA 1039 SELEZIONA AREA 1040 SELECT FILES 1040 SELEZIONA FILE 1041 SELECT IMAGE FILES 1041 SELEZIONA FILE IMMAGINE 1042 SELECT MENU 1042 MENU SELEZIONA 1043 SET COLORS 1043 IMPOSTA COLORI 1044 SET WALLPAPER 1044 IMPOSTA SFONDO DESKTOP 1045 SETTINGS 1045 IMPOSTAZIONI 1046 SHARPEN 1046 NITIDEZZA 1047 SHIFT COLORS 1047 SPOSTA COLORI 1048 SHORTCUTS 1048 SCORCIATOIE 1049 SHOW CIM FILES 1049 MOSTRA FILE CIM 1050 SHOW DIFFS 1050 MOSTRA DIFFERENZE 1051 SHOW ON MAP 1051 MOSTRA SULLA MAPPA 1052 SHOW RESOURCES 1052 MOSTRA RISORSE 1053 SHOW RGB 1053 MOSTRA RGB 1054 SHOW/HIDE AREA 1054 MOSTRA/NASCONDI AREA 1055 SKETCH1 1055 SCHIZZO1 1056 SKETCH2 1056 SCHIZZO2 1057 SLIDE SHOW 1057 PRESENTAZIONE 1058 SLIDES AND NEGATIVES 1058 DIAPOSITIVE E NEGATIVI 1059 SLIDESHOW END 1059 FINE PRESENTAZIONE 1060 SMART ERASE 1060 CANCELLAZIONE INTELLIGENTE 1061 SOFT FOCUS 1061 MESSA A FUOCO MORBIDA 1062 SPHERE 1062 SFERA 1063 SPLIT-SCREEN 1063 SCHERMO DIVISO 1064 STACK/LAYERS 1064 STACK/LIVELLI 1065 STACK/NOISE 1065 STACK/RUMORE 1066 STACK/PAINT 1066 STACK/PITTURA 1067 Saturation 1067 Saturazione 1068 Save 1068 Salva 1069 Save Gallery as Album 1069 Salva galleria come album 1070 Save Image File 1070 Salva file immagine 1071 Save as new file name or type 1071 Salva con nuovo nome file o tipo 1072 Save current gallery as album 1072 Salva la galleria corrente come album 1073 Save modified image as new file or new file version 1073 Salva l'immagine modificata come nuovo file o nuova versione file 1074 Save selected area to a file with transparency 1074 Salva l'area selezionata in un file con trasparenza 1075 Saved Areas 1075 Aree salvate 1076 Scale 1076 Scala 1077 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1077 Scansiona il grafico colore stampato, riga più scura in alto. \nSalva come file .png usando i nomi di stampante e carta \n(es. %s/Epson_glossy.png). \n 1078 Search 1078 Cerca 1079 Search Images 1079 Cerca immagini 1080 Search Results 1080 Risultati ricerca 1081 Search all image files and report duplicates 1081 Cerca in tutti i file immagine e segnala i duplicati 1082 Searching - use ESC key to terminate 1082 Ricerca in corso - usa il tasto ESC per interrompere 1083 Seconds 1083 Secondi 1084 Select 1084 Seleziona 1085 Select %d to %d files 1085 Seleziona da %d a %d file 1086 Select Album 1086 Seleziona album 1087 Select Albums 1087 Seleziona album 1088 Select Area 1088 Seleziona area 1089 Select Area for Edits 1089 Seleziona area per modifiche 1090 Select Area not supported \nby this edit function 1090 Seleziona area non supportato \nda questa funzione di modifica 1091 Select Files 1091 Seleziona file 1092 Select Image 1092 Seleziona immagine 1093 Select Image Files 1093 Seleziona file immagine 1094 Select Metadata tags 1094 Seleziona tag metadata 1095 Select Script 1095 Seleziona script 1096 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1096 Seleziona un'area da deformare usando la funzione seleziona area. \nPremi [avvia deformazione] e trascina l'area con il mouse. \nEsegui più trascinamenti fino a soddisfazione. \nAl termine, seleziona un'altra area o premi [OK]. 1097 Select and Paint Image 1097 Seleziona e dipingi immagine 1098 Select and view an image file 1098 Seleziona e visualizza un file immagine 1099 Select area cannot be kept.\nContinue? 1099 L'area selezionata non può essere mantenuta.\nContinuare? 1100 Select area disabled, Continue? 1100 Area di selezione disabilitata, continuare? 1101 Select area not finished, Continue? 1101 Area di selezione non terminata, continuare? 1102 Select area will be ignored. \nContinue? 1102 L'area selezionata verrà ignorata. \nContinuare? 1103 Select folder 1103 Seleziona cartella 1104 Select host image files 1104 Seleziona i file immagine host 1105 Select image areas to edit separately, copy/paste selections 1105 Seleziona aree dell'immagine da modificare separatamente, copia/incolla selezioni 1106 Select image objects or areas for separate editing 1106 Seleziona oggetti o aree dell'immagine per modifica separata 1107 Select input files for subsequent function 1107 Seleziona i file di input per la funzione successiva 1108 Select overlay file 1108 Seleziona file di sovrapposizione 1109 Select startup album 1109 Seleziona album di avvio 1110 Select startup folder 1110 Seleziona cartella di avvio 1111 Select startup image file 1111 Seleziona file immagine di avvio 1112 Select the image file to print. 1112 Seleziona il file immagine da stampare. 1113 Select to add, click on X to delete. 1113 Seleziona per aggiungere, clicca su X per eliminare. 1114 Select two files 1114 Seleziona due file 1115 Select versions, ratings, keywords, filename text 1115 Seleziona versioni, valutazioni, keywords, testo nome file 1116 Separation Horz 1116 Separazione orizz. 1117 Sequence Numbers 1117 Numeri di sequenza 1118 Set Colors 1118 Imposta colori 1119 Set No. of Colors 1119 Imposta numero di colori 1120 Set Ratio: 1120 Imposta proporzione: 1121 Set Wallpaper 1121 Imposta sfondo desktop 1122 Set Width: 1122 Imposta larghezza: 1123 Set and view bookmarks, select for gallery view 1123 Imposta e visualizza segnalibri, seleziona per la vista galleria 1124 Set black-white/color, negative/positive, sepia 1124 Imposta bianco/nero-colore, negativo/positivo, seppia 1125 Set foreground line color (crop, grid, select, warp) 1125 Imposta il colore linea in primo piano (ritaglio, griglia, selezione, deformazione) 1126 Set gallery from latest search results 1126 Imposta la galleria dagli ultimi risultati di ricerca 1127 Set gallery from recent folders list 1127 Imposta la galleria dall'elenco delle cartelle recenti 1128 Set gallery to folder of current file 1128 Imposta la galleria sulla cartella del file corrente 1129 Set horizontal/vertical grid line counts 1129 Imposta il numero di linee della griglia orizzontali/verticali 1130 Set image file as desktop wallpaper 1130 Imposta il file immagine come sfondo del desktop 1131 Set line properties, [Add] to layout, edit. 1131 Imposta le proprietà della linea, [Aggiungi] al layout, modifica. 1132 Set number of colors for each R/G/B or total 1132 Imposta il numero di colori per ciascun R/G/B o totale 1133 Set or shift photo date/time for selected image files 1133 Imposta o sposta data/ora foto per i file immagine selezionati 1134 Set the name for the output calibration file \n[your calibration name].dat 1134 Imposta il nome per il file di calibrazione di output \n[nome tua calibrazione].dat 1135 Settings 1135 Impostazioni 1136 Sharpen 1136 Nitidezza 1137 Sharpen the image (various methods) 1137 Aumenta la nitidezza dell'immagine (vari metodi) 1138 Shift + drag mouse across image \nto indicate blur direction 1138 Shift + trascina il mouse sull'immagine \nper indicare la direzione della sfocatura 1139 Shift Colors 1139 Sposta colori 1140 Shift/convert image colors into other colors 1140 Sposta/converti i colori dell'immagine in altri colori 1141 Short List 1141 Elenco breve 1142 Show 1142 Mostra 1143 Show (outline) selected areas 1143 Mostra (contorno) aree selezionate 1144 Show CIM Files 1144 Mostra file CIM 1145 Show Diffs 1145 Mostra differenze 1146 Show Fotocx installed version and author contact 1146 Mostra la versione installata di Fotocx e il contatto dell'autore 1147 Show Fotocx updates for recent releases 1147 Mostra gli aggiornamenti di Fotocx per le versioni recenti 1148 Show Hidden 1148 Mostra nascosti 1149 Show Log File 1149 Mostra file di registro 1150 Show RGB 1150 Mostra RGB 1151 Show RGB levels at mouse position 1151 Mostra i livelli RGB nella posizione del mouse 1152 Show Resources 1152 Mostra risorse 1153 Show folder hierarchy, click folder for gallery view 1153 Mostra la gerarchia delle cartelle, clicca sulla cartella per la vista galleria 1154 Show image counts in year/month table, select, report 1154 Mostra il conteggio delle immagini in una tabella anno/mese, seleziona, segnala 1155 Show image description (overlap) 1155 Mostra descrizione immagine (sovrapposta) 1156 Show image differences on the image 1156 Mostra le differenze dell'immagine sull'immagine 1157 Show image file name (overlap) 1157 Mostra nome file immagine (sovrapposto) 1158 Show image title (overlap) 1158 Mostra titolo immagine (sovrapposto) 1159 Show input files used in combine function 1159 Mostra i file di input usati nella funzione combina 1160 Show key metadata for current image or clicked thumbnail 1160 Mostra i metadata chiave dell'immagine corrente o della miniatura cliccata 1161 Show map position of the current image file 1161 Mostra la posizione sulla mappa del file immagine corrente 1162 Show memory and CPU resources used 1162 Mostra le risorse di memoria e CPU utilizzate 1163 Show on Map 1163 Mostra sulla mappa 1164 Show or make Keyboard Shortcuts 1164 Mostra o crea scorciatoie da tastiera 1165 Show the current (last used) album 1165 Mostra l'album corrente (ultimo usato) 1166 Show the current log file 1166 Mostra il file di registro corrente 1167 Size 1167 Dimensione 1168 Sketch1 1168 Schizzo1 1169 Sketch2 1169 Schizzo2 1170 Slide Show 1170 Presentazione 1171 Smart Erase 1171 Cancellazione intelligente 1172 Soft Focus 1172 Messa a fuoco morbida 1173 Sphere 1173 Sfera 1174 Spherical Projection 1174 Proiezione sferica 1175 Split-Screen 1175 Schermo diviso 1176 Stack/Layers 1176 Stack/Livelli 1177 Stack/Noise 1177 Stack/Rumore 1178 Stack/Paint 1178 Stack/Pittura 1179 Stacking Order 1179 Ordine stack 1180 Start 1180 Avvia 1181 Start a slide show 1181 Avvia una presentazione 1182 Start of gallery 1182 Inizio galleria 1183 Startup View 1183 Vista iniziale 1184 Stop 1184 Ferma 1185 Stretch 1185 Estendi 1186 Stretch: 1186 Estendi: 1187 Suppress JPEG compression artifacts 1187 Sopprimi gli artefatti di compressione JPEG 1188 Suppress Ringing 1188 Sopprimi effetto ringing 1189 Suppress fine details while retaining sharpness 1189 Sopprimi i dettagli fini mantenendo la nitidezza 1190 Suppress noise from low-light photos 1190 Sopprimi il rumore delle foto scattate con poca luce 1191 Survey all files 1191 Analizza tutti i file 1192 TEXTURE 1192 TEXTURE 1193 THUMB VIEW 1193 VISTA MINIATURE 1194 TILES1 1194 TESSERE1 1195 TILES2 1195 TESSERE2 1196 TIMELINE 1196 CRONOLOGIA 1197 TINY PLANET 1197 TINY PLANET 1198 TOOLS MENU 1198 MENU STRUMENTI 1199 TRANSLATIONS 1199 TRADUZIONI 1200 TWIST 1200 TORSIONE 1201 Temperature 1201 Temperatura 1202 Text 1202 Testo 1203 Text File: 1203 File di testo: 1204 Texture 1204 Texture 1205 Threshold 1205 Soglia 1206 Threshold: Low 1206 Soglia: Bassa 1207 Thumbnail View 1207 Vista miniature 1208 Thumbnail size 1208 Dimensione miniatura 1209 Thumbnails folder 1209 Cartella miniature 1210 Thumbnails folder: %s \nPlease remove. 1210 Cartella miniature: %s \nRimuovila. 1211 Thumbnails folder: \n %s \nmust be named .../thumbnails 1211 La cartella miniature: \n %s \ndeve chiamarsi .../thumbnails 1212 Thumbnails: 1212 Miniature: 1213 Tile 1213 Tessera 1214 Tile blending 1214 Fusione tessere 1215 Tile image with a repeating pattern 1215 Applica un motivo ripetuto all'immagine 1216 Tiles 1216 Tessere 1217 Tiles1 1217 Tessere1 1218 Tiles2 1218 Tessere2 1219 Timeline 1219 Cronologia 1220 Tiny Planet 1220 Tiny Planet 1221 Title 1221 Titolo 1222 Title: %s\n 1222 Titolo: %s\n 1223 To Location 1223 Verso posizione 1224 Toggle Captions 1224 Attiva/disattiva didascalie 1225 Toggle Grid 1225 Attiva/disattiva griglia 1226 Toggle grid lines on and off 1226 Attiva/disattiva le linee della griglia 1227 Toggle image metadata display ON/OFF 1227 Attiva/disattiva la visualizzazione dei metadata dell'immagine 1228 Too little overlap, cannot align 1228 Sovrapposizione insufficiente, impossibile allineare 1229 Too many edits, please save image 1229 Troppe modifiche, salva l'immagine 1230 Tools 1230 Strumenti 1231 Tools: image index, settings, shortcuts, grid, find duplicates 1231 Strumenti: indice immagini, impostazioni, scorciatoie, griglia, trova duplicati 1232 Top 1232 Alto 1233 Total Colors 1233 Colori totali 1234 Trace 1234 Traccia 1235 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1235 Traccia le curve superiore e inferiore con \nclic del mouse, poi [appiattisci]. 1236 Transient Objects 1236 Oggetti transitori 1237 Transition Preferences 1237 Preferenze transizione 1238 Transition to next image 1238 Transizione all'immagine successiva 1239 Transitions File 1239 File transizioni 1240 Transp. 1240 Trasp. 1241 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1241 La mappa di trasparenza andrà persa \n(salva come TIFF|PNG|JXL per mantenerla) \nSalvare comunque? 1242 Trash 1242 Cestina 1243 Trash read-only file? 1243 Cestinare il file di sola lettura? 1244 Turn an image inside-out 1244 Rovescia un'immagine dall'interno verso l'esterno 1245 Twist 1245 Torsione 1246 Twist image centered at mouse position 1246 Applica una torsione all'immagine centrata sulla posizione del mouse 1247 UNBEND 1247 RADDRIZZA 1248 UNDO/REDO BUTTON 1248 PULSANTE ANNULLA/RIPRISTINA 1249 UNWARP CLOSEUP 1249 RIMUOVI DEFORMAZIONE RAVVICINATA 1250 UPDATE ALBUMS 1250 AGGIORNA ALBUM 1251 UPRIGHT 1251 RADDRIZZAMENTO 1252 USER GUIDE 1252 GUIDA UTENTE 1253 Unable to copy metadata 1253 Impossibile copiare i metadata 1254 Unbend 1254 Raddrizza 1255 Undo 1255 Annulla 1256 Undo All 1256 Annulla tutto 1257 Undo Last 1257 Annulla ultima 1258 Undo/Redo 1258 Annulla/Ripristina 1259 Uninstall 1259 Disinstalla 1260 Unwarp Closeup 1260 Rimuovi deformazione ravvicinata 1261 Update Albums 1261 Aggiorna album 1262 Update albums for new file versions 1262 Aggiorna gli album per le nuove versioni dei file 1263 Upright 1263 Raddrizzamento 1264 Upright Image 1264 Raddrizza immagine 1265 Upright or mirror-flip an image 1265 Raddrizza o capovolgi specchiando un'immagine 1266 Upright rotated image files, selected set or ALL 1266 Raddrizza i file immagine ruotati, set selezionato o TUTTI 1267 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1267 Usa Seleziona area per selezionare un volto. \nClicca al centro della distorsione. \nMuovi il cursore. \n 1268 Use [Select] to add files to an empty album 1268 Usa [Seleziona] per aggiungere file a un album vuoto 1269 Use metadata photo date or file modification date? 1269 Usare la data foto dei metadata o la data di modifica del file? 1270 Use metadata tag 1270 Usa tag metadata 1271 Use settings file 1271 Usa file impostazioni 1272 User Guide 1272 Guida utente 1273 User preferences and settings 1273 Preferenze e impostazioni utente 1274 VIDEO press P to play 1274 VIDEO premi P per riprodurre 1275 VIEW 360° PANO 1275 VISUALIZZA PANO 360° 1276 VIEW ALL META 1276 VISUALIZZA TUTTI I META 1277 VIEW MAIN META 1277 VISUALIZZA META PRINCIPALI 1278 VIGNETTE 1278 VIGNETTATURA 1279 Var. Transparency 1279 Trasparenza var. 1280 Vert 1280 Vert. 1281 Video Files 1281 File video 1282 Video Tutorial 1282 Video tutorial 1283 Video command 1283 Comando video 1284 View 360 degree panorama image 1284 Visualizza immagine panoramica a 360 gradi 1285 View 360° Pano 1285 Visualizza pano 360° 1286 View All Meta 1286 Visualizza tutti i meta 1287 View All Metadata 1287 Visualizza tutti i metadata 1288 View Main Meta 1288 Visualizza meta principali 1289 View Main Metadata 1289 Visualizza metadata principali 1290 View before/after images using split-screen 1290 Visualizza immagini prima/dopo usando lo schermo diviso 1291 View/edit metadata, image report and search functions 1291 Visualizza/modifica metadata, report immagine e funzioni di ricerca 1292 Vignette 1292 Vignettatura 1293 W/H Ratio: 1293 Proporzione L/A: 1294 WARP AFFINE 1294 DEFORMAZIONE AFFINE 1295 WARP AREA 1295 DEFORMA AREA 1296 WARP CURVED 1296 DEFORMAZIONE CURVA 1297 WARP IMAGE 1297 DEFORMA IMMAGINE 1298 WARP MENU 1298 MENU DEFORMAZIONE 1299 WARP RADIAL 1299 DEFORMAZIONE RADIALE 1300 WINDOW VIEWS AND MENUS 1300 VISTE E MENU FINESTRA 1301 WORLD MAP 1301 MAPPA DEL MONDO 1302 Wait after zoom 1302 Attesa dopo lo zoom 1303 Wait before filename/title/description 1303 Attesa prima di nome file/titolo/descrizione 1304 Wait before zoom 1304 Attesa prima dello zoom 1305 Warp 1305 Deforma 1306 Warp Affine 1306 Deformazione affine 1307 Warp Area 1307 Deforma area 1308 Warp Curved 1308 Deformazione curva 1309 Warp Image 1309 Deforma immagine 1310 Warp Linear1 1310 Deformazione lineare1 1311 Warp Linear2 1311 Deformazione lineare2 1312 Warp Radial 1312 Deformazione radiale 1313 Warp an image with a wave pattern 1313 Deforma un'immagine con un motivo ondulato 1314 Warp image (affine) using the mouse 1314 Deforma l'immagine (affine) usando il mouse 1315 Warp image (curved) using the mouse 1315 Deforma l'immagine (curva) usando il mouse 1316 Warp image (linear 1) using the mouse 1316 Deforma l'immagine (lineare 1) usando il mouse 1317 Warp image (linear 2) using the mouse 1317 Deforma l'immagine (lineare 2) usando il mouse 1318 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1318 Deformazione: raddrizza, correggi prospettiva, deforma, rimuovi deformazione ravvicinata, appiattisci, trasformazioni immagine 1319 White 1319 Bianco 1320 Widen: 1320 Allarga: 1321 Width 1321 Larghezza 1322 Width % 1322 Larghezza % 1323 X-size 1323 Dimensione X 1324 Yes 1324 Sì 1325 ZOOM 1325 ZOOM 1326 Zoom 1326 Zoom 1327 Zoom Center 1327 Centro zoom 1328 Zoom Speed 1328 Velocità zoom 1329 Zoom-in 1329 Zoom avanti 1330 Zoom-out 1330 Zoom indietro 1331 \n %d-bits/color 1331 \n %d-bit/colore 1332 \n *** CANCELED \n 1332 \n *** ANNULLATO \n 1333 \n *** COMPLETED \n 1333 \n *** COMPLETATO \n 1334 \n *** Delete Originals *** 1334 \n *** Elimina originali *** 1335 \n *** Keep Originals *** 1335 \n *** Mantieni originali *** 1336 \n *** Replace Originals *** 1336 \n *** Sostituisci originali *** 1337 \n Convert to %s 1337 \n Converti in %s 1338 \n Copy Metadata 1338 \n Copia metadata 1339 \n Downsize within %dx%d 1339 \n Riduci entro %dx%d 1340 \n New Location: %s 1340 \n Nuova posizione: %s 1341 \n Output to %s 1341 \n Output verso %s 1342 \n PROCEED? 1342 \n PROCEDERE? 1343 \n Rename to %s 1343 \n Rinomina in %s 1344 \n Replace text: %s --> %s 1344 \n Sostituisci testo: %s --> %s 1345 \n Rescale to %sx 1345 \n Ridimensiona a %sx 1346 \n Update Albums 1346 \n Aggiorna album 1347 \n Upsize within %dx%d 1347 \n Ingrandisci entro %dx%d 1348 \n*** CANCELED \n 1348 \n*** ANNULLATO \n 1349 \n*** COMPLETED \n 1349 \n*** COMPLETATO \n 1350 \n\nPROCEED? 1350 \n\nPROCEDERE? 1351 add 1351 aggiungi 1352 add after old 1352 aggiungi dopo il vecchio 1353 add all gallery files to list 1353 aggiungi tutti i file della galleria alla lista 1354 add current file to list 1354 aggiungi il file corrente alla lista 1355 add entered text to layout 1355 aggiungi il testo inserito al layout 1356 add images to layout 1356 aggiungi immagini al layout 1357 add line/arrow to layout 1357 aggiungi linea/freccia al layout 1358 add new keyword 1358 aggiungi nuova keyword 1359 add or edit images 1359 aggiungi o modifica immagini 1360 add or edit lines/arrows 1360 aggiungi o modifica linee/frecce 1361 add or edit text 1361 aggiungi o modifica testo 1362 add to set 1362 aggiungi al gruppo 1363 adder 1363 adder 1364 adjust brightness of selected image 1364 regola la luminosità dell'immagine selezionata 1365 after removal of missing files: %d \n 1365 dopo la rimozione dei file mancanti: %d \n 1366 album %s: deleted 1366 album %s: eliminato 1367 album already exists: %s 1367 l'album esiste già: %s 1368 album mass update 1368 aggiornamento massivo album 1369 albums folder missing 1369 cartella album mancante 1370 align and trim color chart 1370 allinea e rifila la carta colore 1371 all files 1371 tutti i file 1372 all image files, including unmounted folders: %d \n 1372 tutti i file immagine, incluse le cartelle non montate: %d \n 1373 all images 1373 tutte le immagini 1374 all versions 1374 tutte le versioni 1375 amplify contrast 1375 amplifica contrasto 1376 amplitude 1376 ampiezza 1377 angle 1377 angolo 1378 apply 1378 applica 1379 area edge creep 1379 slittamento bordo area 1380 area is not finished 1380 l'area non è terminata 1381 area outline color: 1381 colore contorno area: 1382 array width is too large: %d x %d 1382 larghezza array troppo grande: %d x %d 1383 ascending 1383 crescente 1384 auto color 1384 colore automatico 1385 background colors for file and gallery view windows 1385 colori di sfondo per le finestre di vista file e galleria 1386 backing 1386 supporto 1387 bad category name 1387 nome categoria non valido 1388 bad keyword name 1388 nome keyword non valido 1389 bad pattern file: %s 1389 file motivo non valido: %s 1390 base 1390 base 1391 base and adder need $s plugin 1391 base e adder richiedono il plugin $s 1392 base size 1392 dimensione base 1393 begin making a script file 1393 inizia a creare un file script 1394 black/white 1394 bianco/nero 1395 black/white negative 1395 negativo bianco/nero 1396 black/white positive 1396 positivo bianco/nero 1397 blend 1397 fondi 1398 blend edges: blend width: 1398 fondi bordi: larghezza fusione: 1399 blend image overlaps over pixel width 1399 fondi sovrapposizioni immagine sulla larghezza in pixel 1400 blend rate: center: 1400 tasso di fusione: centro: 1401 blocking function: %s 1401 funzione di blocco: %s 1402 blocksize 1402 dimensione blocco 1403 blur edges: blur width: 1403 sfoca bordi: larghezza sfocatura: 1404 blur radius 1404 raggio sfocatura 1405 borders 1405 bordi 1406 both 'All Files' and specific files were selected 1406 sono stati selezionati sia "Tutti i file" che file specifici 1407 bright halo 1407 alone luminoso 1408 brightness rescale 1408 ridimensionamento luminosità 1409 browse 1409 sfoglia 1410 brush size 1410 dimensione pennello 1411 build index, old files only 1411 crea indice, solo file vecchi 1412 cancel project 1412 annulla progetto 1413 cancel project? 1413 annullare il progetto? 1414 cannot allocate %d MB memory 1414 impossibile allocare %d MB di memoria 1415 cannot be determined 1415 impossibile determinare 1416 cannot copy a file to itself 1416 impossibile copiare un file su se stesso 1417 cannot copy current file 1417 impossibile copiare il file corrente 1418 cannot create output file 1418 impossibile creare il file di output 1419 cannot create pixbuf 1419 impossibile creare pixbuf 1420 cannot find area outline 1420 impossibile trovare il contorno dell'area 1421 cannot find output file 1421 impossibile trovare il file di output 1422 cannot load input file 1422 impossibile caricare il file di input 1423 cannot open file %s 1423 impossibile aprire il file %s 1424 cannot parse current file 1424 impossibile analizzare il file corrente 1425 cannot parse file 1425 impossibile analizzare il file 1426 cannot read pluging output file 1426 impossibile leggere il file di output del plugin 1427 cannot replace %s file 1427 impossibile sostituire il file %s 1428 cannot save as RAW type 1428 impossibile salvare come tipo RAW 1429 cannot save layout file: %s 1429 impossibile salvare il file layout: %s 1430 cannot write image folders file: %s 1430 impossibile scrivere il file cartelle immagine: %s 1431 category %s has too many keywords 1431 la categoria %s ha troppe keywords 1432 category %s is too big 1432 la categoria %s è troppo grande 1433 center 1433 centro 1434 change project scale 1434 cambia scala progetto 1435 choose 1-8 clicks or [+] keys for 2x image zoom 1435 scegli 1-8 clic o i tasti [+] per zoom immagine 2x 1436 choose a better spot 1436 scegli un punto migliore 1437 choose an image file 1437 scegli un file immagine 1438 choose file 1438 scegli file 1439 choose files 1439 scegli file 1440 choose folder 1440 scegli cartella 1441 choose folders 1441 scegli cartelle 1442 choose location 1442 scegli posizione 1443 circle 1443 cerchio 1444 clear area selections 1444 cancella selezioni area 1445 clear entered text 1445 cancella testo inserito 1446 clear inputs 1446 cancella input 1447 clear text 1447 cancella testo 1448 click a defined keyword (below) to add a search keyword 1448 clicca su una keyword definita (sotto) per aggiungere una keyword di ricerca 1449 click bright point 1449 clicca sul punto luminoso 1450 click dark point 1450 clicca sul punto scuro 1451 click on desired color 1451 clicca sul colore desiderato 1452 click on image to get source color 1452 clicca sull'immagine per ottenere il colore sorgente 1453 click on image to set matching color 1453 clicca sull'immagine per impostare il colore corrispondente 1454 click on thumbnail to set zoom center 1454 clicca sulla miniatura per impostare il centro dello zoom 1455 click position to add line 1455 clicca sulla posizione per aggiungere una linea 1456 click position to add text 1456 clicca sulla posizione per aggiungere testo 1457 click to select 1457 clicca per selezionare 1458 click to unselect 1458 clicca per deselezionare 1459 clicks per 2x image increase 1459 clic per aumento immagine 2x 1460 color 1460 colore 1461 color depth 1461 profondità colore 1462 color depth: 1462 profondità colore: 1463 color match level % 1463 livello abbinamento colore % 1464 color negative 1464 negativo colore 1465 column difference: %d pixels 1465 differenza colonna: %d pixel 1466 column difference: %d pixels \nMake columns even? 1466 differenza colonna: %d pixel \nRendere pari le colonne? 1467 combined image files 1467 file immagine combinati 1468 command: 1468 comando: 1469 commit all changes, close dialog 1469 conferma tutte le modifiche, chiudi la finestra di dialogo 1470 complete file selection first 1470 completa prima la selezione dei file 1471 completed 1471 completato 1472 condense into color blobs 1472 condensa in macchie di colore 1473 condition 1473 condizione 1474 confirm Fotocx exit 1474 conferma uscita da Fotocx 1475 constant blur 1475 sfocatura costante 1476 continue? 1476 continuare? 1477 converting colors... 1477 conversione colori... 1478 converting files 1478 conversione file 1479 copy (duplicate file) 1479 copia (duplica file) 1480 copy and paste commands 1480 comandi copia e incolla 1481 copy files to %s 1481 copia i file in %s 1482 copy metadata from Nth file: 1482 copia i metadata dall'N-esimo file: 1483 copy to Desktop failed: %s 1483 copia sul desktop non riuscita: %s 1484 count: 0 1484 conteggio: 0 1485 create folder 1485 crea cartella 1486 create folder %s 1486 crea cartella %s 1487 current gallery 1487 galleria corrente 1488 current image files found: %d \n 1488 file immagine correnti trovati: %d \n 1489 current set only 1489 solo set corrente 1490 current set: 1490 set corrente: 1491 curve file is invalid 1491 il file curva non è valido 1492 custom command to play video files 1492 comando personalizzato per riprodurre i file video 1493 dark 1493 scuro 1494 dark halo 1494 alone scuro 1495 dark pixels 1495 pixel scuri 1496 data is incomplete, proceed? 1496 i dati sono incompleti, procedere? 1497 date format is yyyy:mm:dd [hh:mm:ss] 1497 il formato data è aaaa:mm:gg [hh:mm:ss] 1498 date range 1498 intervallo date 1499 days 1499 giorni 1500 delete 1500 elimina 1501 delete %s \n%s 1501 elimina %s \n%s 1502 delete Mashup project files? 1502 eliminare i file di progetto Mashup? 1503 delete failed: \n%s 1503 eliminazione non riuscita: \n%s 1504 delete originals specified but no new name given 1504 eliminazione originali specificata ma nessun nuovo nome fornito 1505 delete selected text from layout 1505 elimina il testo selezionato dal layout 1506 deleting orphan thumbnails ... \n 1506 eliminazione miniature orfane in corso ... \n 1507 depth 1507 profondità 1508 descending 1508 decrescente 1509 direction of light and shadows 1509 direzione della luce e delle ombre 1510 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1510 disabilita la selezione miniature per abilitare i menu popup ecc. \nusa [Abilita] per riprendere la selezione miniature 1511 discard changes? 1511 scartare le modifiche? 1512 do not warp images during auto-alignment 1512 non deformare le immagini durante l'allineamento automatico 1513 do nothing 1513 non fare nulla 1514 dot size 1514 dimensione punto 1515 downsize 1515 riduci dimensione 1516 drag image 1516 trascina immagine 1517 drag mouse along an edge to follow the edge 1517 trascina il mouse lungo un bordo per seguire il bordo 1518 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1518 trascina il mouse in basso/a destra per disegnare un ovale \nshift + trascina il centro per spostare l'ovale \nshift + trascina il bordo inferiore destro per modificare 1519 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1519 trascina il mouse per disegnare un riquadro \nshift + trascina il centro per spostare il riquadro \nshift + trascina il bordo per spostare il bordo 1520 drag mouse to outline an area 1520 trascina il mouse per delineare un'area 1521 drag mouse to select circular or elliptical area 1521 trascina il mouse per selezionare un'area circolare o ellittica 1522 drag mouse to select rectangular area 1522 trascina il mouse per selezionare un'area rettangolare 1523 drag mouse to show selected image 1523 trascina il mouse per mostrare l'immagine selezionata 1524 duplicate keyword 1524 keyword duplicata 1525 edge distance calculation 1525 calcolo distanza bordo 1526 edge: 1526 bordo: 1527 edit 1527 modifica 1528 edit commands 1528 modifica comandi 1529 edit custom shell commands, match colors to embedded jpeg image 1529 modifica comandi shell personalizzati, abbina colori a immagine jpeg incorporata 1530 edit this menu 1530 modifica questo menu 1531 ellipse 1531 ellisse 1532 embedded numbers will sort by value 1532 i numeri incorporati verranno ordinati per valore 1533 emboss 1533 rilievo 1534 enter 2-character language code: en, de, fr ... 1534 inserisci codice lingua a 2 caratteri: en, de, fr ... 1535 enter a project name 1535 inserisci un nome progetto 1536 enter an album name 1536 inserisci un nome album 1537 enter cities/locations, countries 1537 inserisci città/posizioni, paesi 1538 enter project name 1538 inserisci nome progetto 1539 enter tag name 1539 inserisci nome tag 1540 enter tag names 1540 inserisci nomi tag 1541 erase 1541 cancella 1542 error compensation 1542 compensazione errore 1543 exceed %d edits 1543 superati %d modifiche 1544 exceed %d images 1544 superate %d immagini 1545 exceed %d max files, cannot continue 1545 superato il massimo di %d file, impossibile continuare 1546 exceed %d rows 1546 superate %d righe 1547 exceed %d selected files 1547 superati %d file selezionati 1548 exceed %d shortcuts 1548 superate %d scorciatoie 1549 exceeded %d line entries 1549 superati %d inserimenti di righe 1550 exceeded %d text entries 1550 superati %d inserimenti di testo 1551 exceeded max. images: %d 1551 superato il massimo di immagini: %d 1552 exceeded max. tiles: %d 1552 superato il massimo di tessere: %d 1553 exit split-screen 1553 esci dallo schermo diviso 1554 expand to these limits if smaller 1554 espandi a questi limiti se più piccolo 1555 exporting files 1555 esportazione file 1556 extra indexed metadata tags > %d 1556 tag metadata indicizzati extra > %d 1557 extra metadata tags to include in index 1557 tag metadata extra da includere nell'indice 1558 extra metadata tags: \n 1558 tag metadata extra: \n 1559 fetch 1559 recupera 1560 file 1560 file 1561 file .ext names to recognize RAW files 1561 estensioni .ext file per riconoscere i file RAW 1562 file .ext names to recognize video files 1562 estensioni .ext file per riconoscere i file video 1563 file close error 1563 errore di chiusura file 1564 file color 1564 colore file 1565 file error: %s 1565 errore file: %s 1566 file format error 1566 errore formato file 1567 file format error: %s 1567 errore formato file: %s 1568 file included: %s \n 1568 file incluso: %s \n 1569 file metadata update failed 1569 aggiornamento metadata file non riuscito 1570 file name 1570 nome file 1571 file names 1571 nomi file 1572 file not found 1572 file non trovato 1573 file not found \n 1573 file non trovato \n 1574 file not found: %s 1574 file non trovato: %s 1575 file not found: %s %s 1575 file non trovato: %s %s 1576 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1576 tipi di file: .jp2 .heic .avif .webp \ndiventeranno: .jpg - CONTINUARE? 1577 file: %s \nexceed 99 versions 1577 file: %s \nsupera 99 versioni 1578 filename text 1578 testo nome file 1579 files in %s can be deleted 1579 i file in %s possono essere eliminati 1580 fill from current gallery 1580 riempi dalla galleria corrente 1581 fill from selected files 1581 riempi dai file selezionati 1582 fill selected areas 1582 riempi le aree selezionate 1583 fill transparent areas 1583 riempi le aree trasparenti 1584 find all image files ...\n 1584 trova tutti i file immagine ...\n 1585 find and report all unreadable image files 1585 trova e segnala tutti i file immagine illeggibili 1586 find outline gap 1586 trova interruzione contorno 1587 find via table lookup 1587 trova tramite ricerca in tabella 1588 find_imagefiles() failure \n 1588 errore find_imagefiles() \n 1589 find_imagefiles() failure: %s \n 1589 errore find_imagefiles(): %s \n 1590 finish current edit first 1590 termina prima la modifica corrente 1591 finish making a script file 1591 termina la creazione di un file script 1592 finish or cancel pending edit 1592 termina o annulla la modifica in sospeso 1593 fix box in layout and start new box 1593 fissa il riquadro nel layout e inizia un nuovo riquadro 1594 fix line in layout and start new line 1594 fissa la linea nel layout e inizia una nuova linea 1595 fix motion blur 1595 correggi sfocatura da movimento 1596 fix oval in layout and start new oval 1596 fissa l'ovale nel layout e inizia un nuovo ovale 1597 follow edge 1597 segui bordo 1598 font name and size for menus and dilogs 1598 nome e dimensione carattere per menu e finestre di dialogo 1599 force a full re-index of all image files 1599 forza una reindicizzazione completa di tutti i file immagine 1600 format: yyyy:mm:dd [hh:mm:ss] 1600 formato: aaaa:mm:gg [hh:mm:ss] 1601 fotocx will exit 1601 fotocx verrà chiuso 1602 found %d pixels 1602 trovati %d pixel 1603 free disk space: %d GB \n 1603 spazio libero su disco: %d GB \n 1604 freehand draw 1604 disegno a mano libera 1605 ftruncate() failure: %s 1605 errore ftruncate(): %s 1606 full image index: reports will be complete \n 1606 indice immagini completo: i report saranno completi \n 1607 function canceled 1607 funzione annullata 1608 gallery 1608 galleria 1609 gallery is empty 1609 la galleria è vuota 1610 gallery truncated to %d images 1610 galleria troncata a %d immagini 1611 get images having text in filename (comma separated) 1611 ottieni immagini con testo nel nome file (separati da virgola) 1612 get images with matching keywords (comma separated) 1612 ottieni immagini con keywords corrispondenti (separate da virgola) 1613 get images within rating range 1613 ottieni immagini entro l'intervallo di valutazione 1614 gradual paint 1614 pittura graduale 1615 grid counts not 0-100: %s 1615 conteggi griglia non tra 0-100: %s 1616 grid picklist file error: %s 1616 errore file elenco griglia: %s 1617 grid size 1617 dimensione griglia 1618 group 1618 gruppo 1619 height 1619 altezza 1620 hide area outlines 1620 nascondi contorni area 1621 hide transient objects 1621 nascondi oggetti transitori 1622 high 1622 alto 1623 home folder was not changed 1623 la cartella home non è stata modificata 1624 horizontal 1624 orizzontale 1625 hours 1625 ore 1626 icons only, text only, or both 1626 solo icone, solo testo, o entrambi 1627 if image < window, center or shift left or right 1627 se immagine < finestra, centra o sposta a sinistra o a destra 1628 ignore differences above limit 1628 ignora differenze superiori al limite 1629 image blend 1629 fusione immagine 1630 image files 1630 file immagine 1631 image for source color 1631 immagine per colore sorgente 1632 image index records found: %d \n 1632 record indice immagini trovati: %d \n 1633 image index required 1633 indice immagini richiesto 1634 image index write error: %s 1634 errore scrittura indice immagini: %s 1635 image is too large to edit: %d x %d 1635 l'immagine è troppo grande per essere modificata: %d x %d 1636 image is too large: %dx%d, %lld megapix 1636 l'immagine è troppo grande: %dx%d, %lld megapixel 1637 image is too small to edit: %d x %d 1637 l'immagine è troppo piccola per essere modificata: %d x %d 1638 image scale 1638 scala immagine 1639 image to set matching color 1639 immagine per impostare il colore corrispondente 1640 image width must be greater than height 1640 la larghezza dell'immagine deve essere maggiore dell'altezza 1641 images to report 1641 immagini da segnalare 1642 include all files 1642 includi tutti i file 1643 include edited versions 1643 includi versioni modificate 1644 include last versions only 1644 includi solo le ultime versioni 1645 include original files 1645 includi file originali 1646 include transparent areas 1646 includi aree trasparenti 1647 include: 1647 includi: 1648 increase blur with distance 1648 aumenta la sfocatura con la distanza 1649 index completed, %.1f seconds \n 1649 indicizzazione completata, %.1f secondi \n 1650 index config file error: %s 1650 errore file configurazione indice: %s 1651 index updates needed: %d thumbnails: %d \n 1651 aggiornamenti indice necessari: %d miniature: %d \n 1652 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1652 aggiornamenti indice: %d aggiornamenti titolo/descr: %d \naggiornamenti miniature: %d, eliminazioni: %d \n 1653 input 1653 input 1654 input file: %s \n 1654 file di input: %s \n 1655 insufficient memory, cannot proceed 1655 memoria insufficiente, impossibile procedere 1656 insufficient overlap for color matching 1656 sovrapposizione insufficiente per l'abbinamento colore 1657 invalid GPS data 1657 dati GPS non validi 1658 invalid GPS data: %s 1658 dati GPS non validi: %s 1659 invalid album 1659 album non valido 1660 invalid date range: %s %s 1660 intervallo date non valido: %s %s 1661 invalid date/time format 1661 formato data/ora non valido 1662 invalid file 1662 file non valido 1663 invalid plugin: %s 1663 plugin non valido: %s 1664 invalid rating range 1664 intervallo di valutazione non valido 1665 invalid source file: %s 1665 file sorgente non valido: %s 1666 invert area 1666 inverti area 1667 jpeg quality level - 70+ for good image quality 1667 livello qualità jpeg - 70+ per una buona qualità immagine 1668 keyboard 1668 tastiera 1669 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1669 comandi da tastiera: \nEsc: esci dalla presentazione in corso \nfrecce: immagine precedente/successiva \nB: schermo nero / ripristina \nN: transizione all'immagine successiva \nP: pausa / riprendi \nX: ingrandisci nella posizione del mouse 1670 keyword names 1670 nomi keyword 1671 keywords to add 1671 keywords da aggiungere 1672 keywords to remove 1672 keywords da rimuovere 1673 keywords_defined file error: %s 1673 errore file keywords_defined: %s 1674 last search 1674 ultima ricerca 1675 last version 1675 ultima versione 1676 last versions 1676 ultime versioni 1677 layout exceeds 4 gigabytes 1677 il layout supera i 4 gigabyte 1678 layout file missing: %s 1678 file layout mancante: %s 1679 left 1679 sinistra 1680 left click on image for selected color 1680 clic sinistro sull'immagine per il colore selezionato 1681 left click: set image source location \nright click: set corresponding destination 1681 clic sinistro: imposta la posizione sorgente dell'immagine \nclic destro: imposta la destinazione corrispondente 1682 left drag: add transparency \nright drag: add opacity 1682 trascina con tasto sinistro: aggiungi trasparenza \ntrascina con tasto destro: aggiungi opacità 1683 left drag: copy image to mouse position \nright drag: restore original image 1683 trascina con tasto sinistro: copia l'immagine nella posizione del mouse \ntrascina con tasto destro: ripristina l'immagine originale 1684 left drag: reduce halo, right drag: undo 1684 trascina con tasto sinistro: riduci alone, trascina con tasto destro: annulla 1685 lens mm 1685 lente mm 1686 level based on EXIF roll angle 1686 livella in base all'angolo di rollio EXIF 1687 light 1687 chiaro 1688 light pixels 1688 pixel chiari 1689 line 1689 linea 1690 line color 1690 colore linea 1691 line width 1691 spessore linea 1692 load 1692 carica 1693 load text data from a file 1693 carica dati testo da un file 1694 load widgets failed: %s 1694 caricamento widget non riuscito: %s 1695 loading palette ... 1695 caricamento palette ... 1696 location is not a folder 1696 la posizione non è una cartella 1697 locations 1697 posizioni 1698 lock width/height ratio 1698 blocca proporzione larghezza/altezza 1699 log file is in a terminal 1699 il file di registro è in un terminale 1700 low 1700 basso 1701 low contrast 1701 basso contrasto 1702 lower 1702 inferiore 1703 make an initially empty album 1703 crea un album inizialmente vuoto 1704 make new version 1704 crea nuova versione 1705 manual align 1705 allineamento manuale 1706 map marker (red dot) diameter, pixels 1706 diametro marcatore mappa (punto rosso), pixel 1707 map selected areas and verify 1707 mappa aree selezionate e verifica 1708 mashup project 1708 progetto mashup 1709 match embedded image color 1709 abbina colore immagine incorporata 1710 match image color to base image (repeat) 1710 abbina il colore dell'immagine all'immagine base (ripeti) 1711 match values 1711 abbina valori 1712 matches 1712 corrispondenze 1713 max keywords exceeded 1713 massimo di keywords superato 1714 max. Width 1714 largh. max. 1715 max. album count exceeded: %d 1715 numero massimo di album superato: %d 1716 max. album files reached, results truncated 1716 raggiunto il massimo di file album, risultati troncati 1717 max. album size exceeded: %d 1717 dimensione massima album superata: %d 1718 max. blur radius 1718 raggio massimo sfocatura 1719 max. brightness 1719 luminosità massima 1720 max. image limit reached: %d 1720 raggiunto il limite massimo di immagini: %d 1721 max. width or height is not reasonable 1721 la larghezza o altezza massima non è ragionevole 1722 maximum clip allowed to fit window 1722 clip massimo consentito per adattarsi alla finestra 1723 mean RGB: %5.0f %5.0f %5.0f 1723 RGB medio: %5.0f %5.0f %5.0f 1724 mean noise: %5.2f %5.2f %5.2f 1724 rumore medio: %5.2f %5.2f %5.2f 1725 median 1725 mediana 1726 median diff 1726 differenza mediana 1727 menu text and background colors 1727 colori testo e sfondo menu 1728 metadata 1728 metadata 1729 metadata copy failed 1729 copia metadata non riuscita 1730 metadata from Search Function, metadata report 1730 metadata dalla funzione di ricerca, report metadata 1731 metadata picklist file not found %s 1731 file elenco metadata non trovato %s 1732 metadata tags to report 1732 tag metadata da segnalare 1733 metadata update error 1733 errore aggiornamento metadata 1734 metadata update error \n 1734 errore aggiornamento metadata \n 1735 metadata update error: %s 1735 errore aggiornamento metadata: %s 1736 metadata update failed \n 1736 aggiornamento metadata non riuscito \n 1737 min. blur radius 1737 raggio minimo sfocatura 1738 min. contrast 1738 contrasto minimo 1739 min. edit curve node separation, % of scale length 1739 separazione minima nodi curva modifica, % della lunghezza scala 1740 min. separation, %c of scale 1740 separazione minima, %c della scala 1741 minutes 1741 minuti 1742 mmap() failure: %s 1742 errore mmap(): %s 1743 months 1743 mesi 1744 more than %d categories 1744 più di %d categorie 1745 more than 20 matches 1745 più di 20 corrispondenze 1746 mouse radius 1746 raggio mouse 1747 mouse radius for color sample 1747 raggio mouse per campione colore 1748 mouse radius: 1748 raggio mouse: 1749 move (delete original) 1749 sposta (elimina originale) 1750 move area boundary in/out in 1-pixel steps 1750 sposta il confine dell'area dentro/fuori a passi di 1 pixel 1751 move to next input file 1751 vai al file di input successivo 1752 move to trash failed \n 1752 spostamento nel cestino non riuscito \n 1753 move to trash failed: %s 1753 spostamento nel cestino non riuscito: %s 1754 multiply 1754 moltiplica 1755 must have 4 corners 1755 deve avere 4 angoli 1756 need numeric match value: %s 1756 richiesto un valore numerico di corrispondenza: %s 1757 negative 1757 negativo 1758 new album created 1758 nuovo album creato 1759 new album name 1759 nuovo nome album 1760 new file 1760 nuovo file 1761 new file ... 1761 nuovo file ... 1762 new file name is invalid 1762 il nuovo nome file non è valido 1763 new file type 1763 nuovo tipo file 1764 new home folder contains a blank 1764 la nuova cartella home contiene uno spazio 1765 new location 1765 nuova posizione 1766 new location is not a folder 1766 la nuova posizione non è una cartella 1767 new version 1767 nuova versione 1768 newest files 1768 file più recenti 1769 no EXIF orientation data 1769 nessun dato di orientamento EXIF 1770 no active Select Area 1770 nessuna area di selezione attiva 1771 no albums selected 1771 nessun album selezionato 1772 no auto warp 1772 nessuna deformazione automatica 1773 no change 1773 nessuna modifica 1774 no current album 1774 nessun album corrente 1775 no current edit image 1775 nessuna immagine di modifica corrente 1776 no current file 1776 nessun file corrente 1777 no curve (scanned image) 1777 nessuna curva (immagine scansionata) 1778 no description 1778 nessuna descrizione 1779 no file selected 1779 nessun file selezionato 1780 no files found 1780 nessun file trovato 1781 no files selected 1781 nessun file selezionato 1782 no host files selected 1782 nessun file host selezionato 1783 no image index: reports disabled \n 1783 nessun indice immagini: report disabilitati \n 1784 no images 1784 nessuna immagine 1785 no images found 1785 nessuna immagine trovata 1786 no input files available 1786 nessun file di input disponibile 1787 no matching files found 1787 nessun file corrispondente trovato 1788 no matching locations 1788 nessuna posizione corrispondente 1789 no metadata level data 1789 nessun dato di livello metadata 1790 no metadata tags to report 1790 nessun tag metadata da segnalare 1791 no option selected 1791 nessuna opzione selezionata 1792 no overlay file selected 1792 nessun file di sovrapposizione selezionato 1793 no photo date, skipped 1793 nessuna data foto, saltata 1794 no plugin output file found 1794 nessun file di output plugin trovato 1795 no prior edit 1795 nessuna modifica precedente 1796 no prior edit image 1796 nessuna immagine di modifica precedente 1797 no saved folders 1797 nessuna cartella salvata 1798 no script file was started 1798 nessun file script avviato 1799 no script files found 1799 nessun file script trovato 1800 no select area 1800 nessuna area selezionata 1801 no selection 1801 nessuna selezione 1802 no title 1802 nessun titolo 1803 no write permission 1803 nessun permesso di scrittura 1804 no write permission \n 1804 nessun permesso di scrittura \n 1805 no write permission: %s 1805 nessun permesso di scrittura: %s 1806 none 1806 nessuno 1807 not a known image file 1807 non è un file immagine conosciuto 1808 not an image file 1808 non è un file immagine 1809 not an indexed image file \n 1809 non è un file immagine indicizzato \n 1810 nothing found 1810 nulla trovato 1811 nothing left, no change made 1811 nulla rimasto, nessuna modifica effettuata 1812 old file 1812 vecchio file 1813 old image index: reports will omit new files \n 1813 indice immagini vecchio: i report ometteranno i nuovi file \n 1814 old keyword name >> new keyword name 1814 vecchio nome keyword >> nuovo nome keyword 1815 omit high pixel 1815 ometti pixel alti 1816 omit low pixel 1816 ometti pixel bassi 1817 only %d tile images found 1817 trovate solo %d immagini tessera 1818 opacity center 1818 opacità centro 1819 opacity edge 1819 opacità bordo 1820 open album 1820 apri album 1821 open and process color chart 1821 apri ed elabora la carta colore 1822 open as new current file 1822 apri come nuovo file corrente 1823 optional deselect color 1823 colore deseleziona opzionale 1824 original 1824 originale 1825 originals 1825 originali 1826 other 1826 altro 1827 out of space for temp files \nsave your edits and quit Fotocx 1827 spazio esaurito per i file temporanei \nsalva le modifiche ed esci da Fotocx 1828 outline 1828 contorno 1829 output file exists 1829 il file di output esiste 1830 output file exists, overwrite? 1830 il file di output esiste, sovrascrivere? 1831 output file size change, cannot use select area 1831 cambio dimensione file di output, impossibile usare seleziona area 1832 output file: 1832 file di output: 1833 output file: %s \n 1833 file di output: %s \n 1834 oval 1834 ovale 1835 overlay file missing: %s 1835 file sovrapposizione mancante: %s 1836 owner 1836 proprietario 1837 paint 1837 pittura 1838 paint color 1838 colore pittura 1839 paint edits cannot be used for this method 1839 le modifiche pittura non possono essere usate per questo metodo 1840 paint over transparent areas 1840 dipingi sopra le aree trasparenti 1841 paint radius 1841 raggio pennello 1842 palette 1842 palette 1843 palette exceeds %d color limit 1843 la palette supera il limite di %d colori 1844 palette file 1844 file palette 1845 palette has %d colors 1845 la palette ha %d colori 1846 palette loaded, %d colors 1846 palette caricata, %d colori 1847 palette: 1847 palette: 1848 patch area goal 1848 obiettivo area patch 1849 percent 1849 percento 1850 perform edits to include in the script file 1850 esegui modifiche da includere nel file script 1851 permissions: 1851 permessi: 1852 perspective 1852 prospettiva 1853 photo 1853 foto 1854 picklist file not found: %s 1854 file elenco non trovato: %s 1855 pixel = mean of best match neighbors 1855 pixel = media dei vicini con corrispondenza migliore 1856 pixel = median of all neighbors 1856 pixel = mediana di tutti i vicini 1857 please make a choice 1857 effettua una scelta 1858 plugin command failed 1858 comando plugin non riuscito 1859 plugin menu not found %s 1859 menu plugin non trovato %s 1860 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1860 plugin: (anno mese giorno vecchio-nome sequenza) $yyyy $mm $dd $oldname $s 1861 popup_choose: empty list 1861 popup_choose: elenco vuoto 1862 position with mouse click/drag 1862 posiziona con clic/trascinamento del mouse 1863 position: 50 50 1863 posizione: 50 50 1864 position: x=%02d y=%02d 1864 posizione: x=%02d y=%02d 1865 power 1865 potenza 1866 power center 1866 potenza centro 1867 power edge 1867 potenza bordo 1868 power: center 1868 potenza: centro 1869 pref 1869 pref 1870 previous file 1870 file precedente 1871 previous name 1871 nome precedente 1872 print color chart 1872 stampa carta colore 1873 print select area(s) only? 1873 stampare solo l'area/le aree selezionate? 1874 prior edit step 1874 passaggio di modifica precedente 1875 project complete 1875 progetto completato 1876 project file is defective 1876 il file di progetto è difettoso 1877 project name cannot have quote characters 1877 il nome progetto non può contenere apici 1878 pure RGB or black/white dots 1878 punti RGB puri o bianco/nero 1879 quality 1879 qualità 1880 quality level (70+) 1880 livello qualità (70+) 1881 radius 1881 raggio 1882 radius: 1882 raggio: 1883 random 1883 casuale 1884 random position 1884 posizione casuale 1885 rating range 1885 intervallo valutazione 1886 reading image index file ...\n 1886 lettura file indice immagini ...\n 1887 recent files 1887 file recenti 1888 reduce bright 1888 riduci chiari 1889 reduce dark 1889 riduci scuri 1890 reduce to these limits if larger 1890 riduci a questi limiti se maggiore 1891 refresh 1891 aggiorna 1892 remove %d duplicates? 1892 rimuovere %d duplicati? 1893 remove all files in list 1893 rimuovi tutti i file nell'elenco 1894 remove duplicate 1894 rimuovi duplicato 1895 remove from set 1895 rimuovi dal gruppo 1896 remove panorama image curving 1896 rimuovi la curvatura dell'immagine panoramica 1897 remove selected file from list 1897 rimuovi il file selezionato dall'elenco 1898 rename keywords 1898 rinomina keywords 1899 repair metadata for %s 1899 ripara metadata per %s 1900 replace 1900 sostituisci 1901 replace album %s ? 1901 sostituire l'album %s ? 1902 replace file 1902 sostituisci file 1903 replace old 1903 sostituisci vecchio 1904 replace old file (OVERWRITE) 1904 sostituisci vecchio file (SOVRASCRIVI) 1905 replace substring within file name 1905 sostituisci sottostringa nel nome file 1906 report type: 1906 tipo report: 1907 req. color match 1907 abbinamento colore richiesto 1908 reset 1908 reimposta 1909 resolution 1909 risoluzione 1910 resume from current image 1910 riprendi dall'immagine corrente 1911 right 1911 destra 1912 right click on image for deselected color 1912 clic destro sull'immagine per colore deselezionato 1913 sample % 1913 campione % 1914 save 1914 salva 1915 save Mashup output file 1915 salva file di output Mashup 1916 save Mashup project? 1916 salvare il progetto Mashup? 1917 save area as a PNG file 1917 salva l'area come file PNG 1918 save as new file name or type 1918 salva con nuovo nome file o tipo 1919 save as new file version 1919 salva come nuova versione file 1920 save edit, start new text 1920 salva la modifica, inizia nuovo testo 1921 save metadata to image file 1921 salva metadata nel file immagine 1922 save text data to a file 1922 salva dati testo in un file 1923 save to .heic/.avif file not supported 1923 salvataggio in file .heic/.avif non supportato 1924 save to .jp2 file not supported 1924 salvataggio in file .jp2 non supportato 1925 save to .webp file not supported 1925 salvataggio in file .webp non supportato 1926 scan and save color chart 1926 scansiona e salva la carta colore 1927 scanned color chart file 1927 file carta colore scansionata 1928 scope of neighbor pixels 1928 ambito dei pixel vicini 1929 script already started 1929 script già avviato 1930 script complete 1930 script completato 1931 script error: %s, %s 1931 errore script: %s, %s 1932 script file closed 1932 file script chiuso 1933 script file error 1933 errore file script 1934 script file format error: %s 1934 errore formato file script: %s 1935 script file name too big 1935 nome file script troppo lungo 1936 script file to run 1936 file script da eseguire 1937 search for names in image location metadata 1937 cerca nomi nei metadata di posizione dell'immagine 1938 search for text within file folders or file name 1938 cerca testo nelle cartelle file o nel nome file 1939 search for text within image title or description 1939 cerca testo nel titolo o nella descrizione dell'immagine 1940 search known locations 1940 cerca posizioni conosciute 1941 search range 1941 intervallo di ricerca 1942 search: 1942 cerca: 1943 seconds 1943 secondi 1944 seconds to show with text 1944 secondi di visualizzazione con testo 1945 seconds to show without text 1945 secondi di visualizzazione senza testo 1946 select all 1946 seleziona tutto 1947 select all colors within mouse (flood) 1947 seleziona tutti i colori entro il mouse (flood) 1948 select area missing or not finished 1948 area di selezione mancante o non terminata 1949 select area within mouse 1949 seleziona area entro il mouse 1950 select area within mouse circle 1950 seleziona area entro il cerchio del mouse 1951 select base image for color matching 1951 seleziona immagine base per l'abbinamento colore 1952 select by color, required match level 1952 seleziona per colore, livello di corrispondenza richiesto 1953 select by color, search range 1953 seleziona per colore, intervallo di ricerca 1954 select font 1954 seleziona carattere 1955 select image to show with mouse paint 1955 seleziona immagine da mostrare con pittura mouse 1956 select images randomly 1956 seleziona immagini casualmente 1957 select initial files 1957 seleziona file iniziali 1958 select line color 1958 seleziona colore linea 1959 select one color within mouse 1959 seleziona un colore entro il mouse 1960 select rectangle 1960 seleziona rettangolo 1961 select source image color first 1961 seleziona prima il colore dell'immagine sorgente 1962 select surrounding areas matching colors in mouse 1962 seleziona aree circostanti con colori corrispondenti al mouse 1963 selection exceeds %d tags 1963 la selezione supera %d tag 1964 sepia 1964 seppia 1965 set a new date/time: 1965 imposta una nuova data/ora: 1966 set all 1966 imposta tutto 1967 set current window size 1967 imposta la dimensione della finestra corrente 1968 set image color from input files 1968 imposta il colore immagine dai file di input 1969 set location from world map 1969 imposta la posizione dalla mappa del mondo 1970 set maximum crop 1970 imposta il ritaglio massimo 1971 shadow 1971 ombra 1972 shell command used for converting RAW files to RGB 1972 comando shell usato per convertire i file RAW in RGB 1973 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1973 shift + clic sinistro: preleva colore dall'immagine \ntrascina con tasto sinistro: dipingi colore sull'immagine \ntrascina con tasto destro: ripristina l'immagine originale 1974 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1974 shift + clic sinistro: sincronizza posizione di copia \ntrascina con tasto sinistro: copia l'immagine sorgente sul mouse \ntrascina con tasto destro: ripristina l'immagine originale 1975 shift existing date/time (+/–): 1975 sposta data/ora esistente (+/–): 1976 shift+click on image to select color 1976 shift+clic sull'immagine per selezionare il colore 1977 shortcut function not found: %s 1977 funzione scorciatoia non trovata: %s 1978 shortcut key: 1978 tasto scorciatoia: 1979 shortcut not found: %s 1979 scorciatoia non trovata: %s 1980 show area outlines 1980 mostra contorni area 1981 show hidden files and folders 1981 mostra file e cartelle nascosti 1982 show transient objects 1982 mostra oggetti transitori 1983 size of mouse selection circle 1983 dimensione del cerchio di selezione mouse 1984 smooth 1984 morbido 1985 source file: 1985 file sorgente: 1986 source image failure (scale too big?) 1986 errore immagine sorgente (scala troppo grande?) 1987 source image scale 1987 scala immagine sorgente 1988 specify a thumbnail folder 1988 specifica una cartella miniature 1989 specify at least 1 top image folder 1989 specifica almeno 1 cartella immagine principale 1990 specify background size and color 1990 specifica dimensione e colore dello sfondo 1991 specify files and keywords 1991 specifica file e keywords 1992 spot size limit 1992 limite dimensione punto 1993 start 1993 avvia 1994 start a new script file 1994 avvia un nuovo file script 1995 start album 1995 album di avvio 1996 start blob condensation process 1996 avvia processo di condensazione macchie 1997 start file 1997 file di avvio 1998 start folder 1998 cartella di avvio 1999 start from first image in album 1999 inizia dalla prima immagine nell'album 2000 start fusion process 2000 avvia processo di fusione 2001 start over at end of album 2001 ricomincia dalla fine dell'album 2002 start warp 2002 avvia deformazione 2003 start with previous image file, gallery of recent files, etc. 2003 inizia con il file immagine precedente, galleria dei file recenti, ecc. 2004 startup album is invalid 2004 l'album di avvio non è valido 2005 startup file is invalid 2005 il file di avvio non è valido 2006 startup folder is invalid 2006 la cartella di avvio non è valida 2007 status: %s \n 2007 stato: %s \n 2008 status: completed \n 2008 stato: completato \n 2009 stay open 2009 rimani aperto 2010 step 2010 passo 2011 stop 2011 ferma 2012 stop blob condensation process 2012 ferma il processo di condensazione macchie 2013 stop fusion process 2013 ferma il processo di fusione 2014 supply a file name 2014 fornisci un nome file 2015 tag name 2015 nome tag 2016 tag name %s not in xmeta tag list 2016 nome tag %s non nell'elenco tag xmeta 2017 tag value 2017 valore tag 2018 target file: 2018 file di destinazione: 2019 template 2019 modello 2020 test: show changes, do not update files 2020 test: mostra le modifiche, non aggiornare i file 2021 text 2021 testo 2022 text file is defective 2022 il file di testo è difettoso 2023 text time 2023 ora testo 2024 this function cannot be scripted 2024 questa funzione non può essere scriptata 2025 thumbnail file 2025 file miniatura 2026 thumbnails deleted: %d \n 2026 miniature eliminate: %d \n 2027 thumbnails folder: %s \n 2027 cartella miniature: %s \n 2028 tile area goal 2028 obiettivo area tessera 2029 tile gap 2029 spaziatura tessere 2030 tile size 2030 dimensione tessera 2031 time 2031 ora 2032 title/desc. 2032 titolo/descr. 2033 to add images to current set, \nsearch all images 2033 per aggiungere immagini al set corrente, \ncerca tutte le immagini 2034 to remove images from current set, \nsearch current set 2034 per rimuovere immagini dal set corrente, \ncerca nel set corrente 2035 too many categories 2035 troppe categorie 2036 too many files, cannot continue 2036 troppi file, impossibile continuare 2037 too many keywords in a category 2037 troppe keywords in una categoria 2038 top image folders: \n 2038 cartelle immagine principali: \n 2039 transition 2039 transizione 2040 transitions 2040 transizioni 2041 trash 2041 cestina 2042 trimmed color chart file 2042 file carta colore ritagliata 2043 unable to save bookmarks file 2043 impossibile salvare il file segnalibri 2044 unknown edit function: %s 2044 funzione di modifica sconosciuta: %s 2045 unknown file type 2045 tipo file sconosciuto 2046 unknown or empty album: %s 2046 album sconosciuto o vuoto: %s 2047 unsharp mask 2047 maschera di contrasto (unsharp mask) 2048 update 2048 aggiorna 2049 updating albums ...\n 2049 aggiornamento album in corso ...\n 2050 upper 2050 superiore 2051 upsize 2051 ingrandisci dimensione 2052 use 2052 usa 2053 use a saved Mashup project 2053 usa un progetto Mashup salvato 2054 use average 2054 usa media 2055 use custom color palette 2055 usa palette colori personalizzata 2056 use median 2056 usa mediana 2057 use option to stop accidental quit 2057 usa l'opzione per evitare uscite accidentali 2058 use previous input 2058 usa input precedente 2059 use previous location 2059 usa posizione precedente 2060 use prior edit step: 2060 usa passaggio di modifica precedente: 2061 use the current image file 2061 usa il file immagine corrente 2062 variance 2062 varianza 2063 versions 2063 versioni 2064 vertical 2064 verticale 2065 video files not supported (install ffmpeg) 2065 file video non supportati (installare ffmpeg) 2066 view album 2066 visualizza album 2067 waiting 2067 in attesa 2068 warp 2068 deforma 2069 warp and align selected image with mouse drags 2069 deforma e allinea l'immagine selezionata con trascinamenti del mouse 2070 warp and fine-align selected image with neighbor 2070 deforma e allinea con precisione l'immagine selezionata con quella vicina 2071 warp span 2071 estensione deformazione 2072 wavelength 2072 lunghezza d'onda 2073 width 2073 larghezza 2074 writing updated image index file \n 2074 scrittura file indice immagini aggiornato \n 2075 x-count 2075 conteggio x 2076 x-offset 2076 offset x 2077 y-count 2077 conteggio y 2078 y-offset 2078 offset y 2079 years 2079 anni 2080 you can close this window now \n 2080 ora puoi chiudere questa finestra \n 2081 you cannot use new name and replace text together 2081 non puoi usare nuovo nome e sostituisci testo insieme 2082 you must use either $s or $oldname 2082 devi usare $s oppure $oldname 2083 zoom image 2083 zoom immagine 2084 zoom via mouse wheel or Keys +/=/-/↑/↓ 2084 zoom tramite rotellina del mouse o tasti +/=/-/↑/↓ 2085 zoom-in 2085 zoom avanti 2086 zoom-out 2086 zoom indietro fotocx/data/translations/gui_en0000664000175000017500000016026515247006657015673 0ustar micomico0000 + Zoom-in \n 0001 - Zoom-out \n 0002 = Zoom-in \n 0003 Arrow keys Previous/Next file \n 0004 Delete Delete/Trash file \n 0005 Escape Quit dialog / Quit Fotocx \n 0006 F1 User Guide, Context Help \n 0007 F10/F11 Full Screen / no menus \n 0008 Home/End Gallery start/end \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0010 Page keys Gallery page up/down \n 0011 Z 1x <--> fit to window \n 0012 $s plugin needs base and adder 0013 % from left: 0014 % from top: 0015 %d albums selected 0016 %d image files selected 0017 %d images 0018 %d keywords to purge \nin %d image files. \nProceed? 0019 %d keywords to rename \nin %d image files. \nProceed? 0020 %d max images exceeded 0021 %d red-eye limit reached 0022 %s %s %d folders %d files 0023 %s *** date/time conversion failed \n 0024 %s ALBUM %s %d files 0025 %s NEWEST FILES 0026 %s RECENT FILES 0027 %s SEARCH RESULTS %d files 0028 %s UNKNOWN 0029 %s added to script 0030 %s is already indexed 0031 %s renamed: %s 0032 %s: metadata update failed 0033 %s: no write permission 0034 %s: reserved, cannot be used 0035 %s: too many keywords 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0038 (click below) 0039 (no selection) 0040 (pixels) 0041 (press key) 0042 (select function) 0043 *** bad utf8 detected *** \n 0044 *** cannot create new file \n 0045 *** cannot get real path of input file \n 0046 *** cannot load input file \n 0047 *** cannot make new version of input file \n 0048 *** cannot open input file 0049 *** cannot read input file 0050 *** cannot save output file \n 0051 *** completed \n 0052 *** file date/time invalid \n 0053 *** file type not supported \n 0054 *** invalid file \n 0055 *** metadata update error \n 0056 *** no date/time available \n 0057 + bright 0058 +Blue -Yellow 0059 +Brightness 0060 +Green -Magenta 0061 +Red -Cyan 0062 - blue 0063 - fog/haze 0064 .heic/.avif files not supported (install heif_convert) 0065 .jp2 files not supported (install opj_decompress) 0066 .webp files not supported (install dwebp) 0067 0 albums selected 0068 0 duplicates 0069 0-5 stars 0070 0/1/2 = no image index, old index only, old + update new/modified 0071 2-character code 0072 3D depth 0073 <2 images 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0075 ADD GLARE 0076 ADD NOISE 0077 ADJUST HSL 0078 ADJUST RGB 0079 ALBUM MASS UPDATE 0080 ALBUMS 0081 ALBUMS MENU 0082 ALIEN COLORS 0083 AMPLIFY CONTRAST 0084 ANTI-ALIAS 0085 AREA BLEND 0086 AREA FILL 0087 AREA OVERVIEW 0088 AUTOSEARCH 0089 About 0090 Action 0091 Add 0092 Add 1 0093 Add All 0094 Add Current 0095 Add Current File Here 0096 Add Glare 0097 Add Image 0098 Add Line 0099 Add Margins 0100 Add Noise 0101 Add Random Noise 0102 Add Selected Files Here 0103 Add Texture 0104 Add a brightness/color ramp across an image 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0106 Add glare around bright objects 0107 Add margins around an image 0108 Add newest version to existing versions 0109 Add overlay image (e.g. copyright) to selected images 0110 Add random noise to an image 0111 Add selected versions to existing versions 0112 Add texture to an image 0113 Add to Selection 0114 Add/change/delete metadata for selected image files 0115 Add/remove barrel/pincushion distortion 0116 Add/remove brightness/color radially from chosen center 0117 Add/remove keywords for selected image files 0118 Add/revise location/geocoordinates for selected image files 0119 Adjust HSL 0120 Adjust Image Contributions 0121 Adjust Pixel Composition 0122 Adjust RGB 0123 Adjust brightness, contrast, color 0124 Adjust color saturation based on brightness 0125 Adjust color using HSL color model 0126 Adjust color using RGB or CMY colors 0127 Adjustment 0128 Album Mass Update 0129 Album Name 0130 Albums 0131 Albums: gallery of chosen images, arrange via drag & drop 0132 Algorithm Iterations 0133 Alien Colors 0134 All 0135 All Areas 0136 All files 0137 All image files will be re-indexed. \nContinue? 0138 All±1 0139 All±10 0140 Alpha 0141 Amount 0142 Amplify 0143 Amplify Contrast 0144 Amplify area contrast to enhance visibility of details 0145 Angle 0146 Anti-Alias 0147 Apply 0148 Apply a soft focus effect to an image 0149 Apply repeatedly while watching the image. 0150 Area Blend 0151 Area Edge Blend 0152 Area Fill 0153 Arrange images and text in a layout (photo-montage) 0154 Array Complete 0155 Array Width 0156 Arrow head 0157 Auto Level 0158 Auto black level 0159 Auto crop: 0160 Auto white balance 0161 Auto-replay 0162 BATCH CHANGE META 0163 BATCH CONVERT 0164 BATCH COPY/MOVE 0165 BATCH DELETE/TRASH 0166 BATCH GEOTAGS 0167 BATCH KEYWORDS 0168 BATCH MENU 0169 BATCH OVERLAY 0170 BATCH PHOTO DATE 0171 BATCH PROCESSING 0172 BATCH PURGE KEYWORDS 0173 BATCH RENAME KEYWORDS 0174 BATCH REPORT META 0175 BATCH SCRIPT 0176 BATCH UPRIGHT 0177 BLANK IMAGE 0178 BLUR 0179 BOOKMARKS 0180 BRIGHTNESS RAMP 0181 Background 0182 Background Blur - blur relative to distance from foreground 0183 Background Color 0184 Background Pattern 0185 Base Transparency 0186 Batch 0187 Batch Add/Change Metadata 0188 Batch Add/Remove Keywords 0189 Batch Change Meta 0190 Batch Convert 0191 Batch Copy/Move 0192 Batch Delete/Trash 0193 Batch Geotags 0194 Batch Keywords 0195 Batch Metadata 0196 Batch Overlay 0197 Batch Photo Date 0198 Batch Photo Date/Time 0199 Batch Purge Keywords 0200 Batch Rename Keywords 0201 Batch Report Meta 0202 Batch Report Metadata 0203 Batch Set Geotags 0204 Batch Upright 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0206 Bend and fine-align 0207 Bias 0208 Black 0209 Blank Image 0210 Blend 0211 Blend 0% 0212 Blend Width 0213 Blend area edits/edges using the mouse 0214 Blend: 0% 0215 Blue 0216 Blue Factors 0217 Blur 0218 Blur Angle (degrees) 0219 Blur Background 0220 Blur Image 0221 Blur Mix 0222 Blur Normal 0223 Blur Radius 0224 Blur Span 0225 Blur Span (pixels) 0226 Blur the image (various methods) 0227 Bookmarks 0228 Both 0229 Bottom 0230 Bright Limit 0231 Bright Point 0232 Brightness 0233 Brightness Histogram 0234 Brightness Ramp 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0236 Browse 0237 CALIBRATE PRINTER 0238 CAPTIONS 0239 CARTOON 0240 CHOOSE ALBUM 0241 CLEAR AREA 0242 CLOSE 0243 COLOR MODE 0244 COMBINE MENU 0245 COMMAND PARAMETERS 0246 COMPLETED 0247 COPY FROM IMAGE 0248 COPY IN IMAGE 0249 COPY META 0250 COPY PRIOR EDIT 0251 COPY TO CLIPBOARD 0252 COPY TO DESKTOP 0253 COPY/MOVE 0254 COPY/PASTE AREA 0255 CREATE ALBUM 0256 CROP 0257 CROSSHATCH 0258 CURRENT ALBUM 0259 CURRENT FILE FOLDER 0260 CURVE EDITING 0261 CUSTOM KERNEL 0262 CUSTOM MENU 0263 CYCLE 2 FILES 0264 CYCLE 3 FILES 0265 Calculate 0266 Calculate Geometry 0267 Calibrate Printer 0268 Cancel 0269 Cartoon 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0271 Center 0272 Center Hole 0273 Change 0274 Change Log 0275 Change file name 0276 Change gallery sort order 0277 Change image colors using an algorithm 0278 Change image pixel dimensions 0279 Chart to adjust monitor color 0280 Choose 0281 Choose Album 0282 Choose Albums 0283 Choose Captions 0284 Choose an album and show as gallery of images 0285 Choose metadata shown on image captions 0286 Choose new Fotocx home folder 0287 Choose thumbnail folder 0288 Choose top image folders 0289 Clear 0290 Clear All 0291 Click dark spot for black level 0292 Click for RGB histogram 0293 Click gray spot for white balance 0294 Click image to select pixels 0295 Click image to select, drag image to move. 0296 Click mouse to change center 0297 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0298 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0299 Click thumbnail to select file 0300 Clip Level 0301 Clip Limit % 0302 Color 0303 Color Chooser 0304 Color Depth: 0305 Color Fringes 0306 Color Hue 0307 Color Map File 0308 Color Match Images 0309 Color Mode 0310 Color calibration tool for printer and paper type 0311 Color map file to use 0312 Combine 0313 Combine 2-6 images into a wide panorama image 0314 Combine many images into an array of images 0315 Combine multiple images in layers, select and expose layers 0316 Combine multiple noisy photos into a low-noise image 0317 Combine multiple photos to erase passing people, etc. 0318 Combine within 0319 Combine: HDR, HDF, stack, panorama, mashup, image array 0320 Command Params 0321 Commit 0322 Confirm Exit 0323 Contrast 0324 Contrast All 0325 Contrast Blue 0326 Contrast Green 0327 Contrast Limit 0328 Contrast Red 0329 Convert %d image files 0330 Convert an image into a Tiny Planet image 0331 Convert image into a cartoon drawing 0332 Convert image into a crosshatch sketch 0333 Convert image into a line drawing 0334 Convert image into a simulated painting 0335 Convert image into a simulated sketch (1) 0336 Convert image into a simulated sketch (2) 0337 Convert image into black/white lines 0338 Convert image into dithered dots 0339 Convert image into square tiles with 3D effect 0340 Convert image into tiles matching feature contours 0341 Copy 0342 Copy %d image files 0343 Copy From Image 0344 Copy Meta 0345 Copy Metadata 0346 Copy Prior Edit 0347 Copy Within Image 0348 Copy area for later pasting into image 0349 Copy areas from another image using the mouse 0350 Copy areas from prior edits using the mouse 0351 Copy areas within an image using the mouse 0352 Copy image file to the clipboard 0353 Copy image file to the desktop 0354 Copy in Image 0355 Copy metadata from one image to another 0356 Copy or Move Image File 0357 Copy or Move image file to new location 0358 Copy to Clipboard 0359 Copy to Desktop 0360 Copy without unsaved changes? 0361 Copy/Move 0362 Copy/move selected image files to a new folder 0363 Copyright 0364 Create 0365 Create Album 0366 Create Blank Image 0367 Create Mosaic 0368 Create a blank image 0369 Create a mosaic with tiles made from all images 0370 Create a new album (ordered set of image files) 0371 Create an embossed or 3D appearance 0372 Create or replace an album 0373 Crop 0374 Crop (trim) image margins 0375 Crop Buttons 0376 Crop Image 0377 Crosshatch 0378 Crosshatch Sketch 0379 Current Album 0380 Current File Folder 0381 Current gallery 0382 Current image: 0383 Curve Node 0384 Curve lines need at least 4 points 0385 Custom 0386 Custom Kernel 0387 Custom Shortcuts \n 0388 Custom menu: favorite/frequent functions, scripts, plugins 0389 Customize 0390 Customize: 0391 Cut Bottom 0392 Cut Top 0393 Cycle 2 Files 0394 Cycle 2 Prior Files 0395 Cycle 3 Files 0396 Cycle 3 Prior Files 0397 Cycle through images: 0398 DARK/BRIGHT PIXELS 0399 DEFOG 0400 DELETE ALBUM 0401 DELETE META 0402 DELETE/TRASH 0403 DENOISE 0404 DIALOG BUTTONS 0405 DITHER 0406 DRAG AND DROP 0407 Dark Areas 0408 Dark Limit 0409 Dark Point 0410 Dark/Bright Pixels 0411 Data file 0412 Define keywords used for searching images 0413 Defined Keywords: 0414 Defog 0415 Delete 0416 Delete Album 0417 Delete Meta 0418 Delete Metadata 0419 Delete Originals 0420 Delete an album 0421 Delete or Trash selected image files 0422 Delete or trash an image file 0423 Delete read-only file? 0424 Delete/Trash 0425 Denoise 0426 Depth 0427 Desc. 0428 Description: %s\n 0429 Desktop 0430 Dialog Font 0431 Diffs 0432 Directed Blur 0433 Directed Blur - blur locally in direction of mouse drag 0434 Disable 0435 Disable areas for editing 0436 Discard unsaved changes? 0437 Discard unsaved edits? 0438 Distort image areas using the mouse 0439 Dither 0440 Dither Image 0441 Dither0 0442 Dither1 0443 Dither2 0444 Dither3 0445 Dither4 0446 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0447 Drag margin box middle or edges 0448 Drag mouse on image. \nLeft click to cancel. 0449 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0450 Drag mouse to set center 0451 Drag near an image corner using the mouse 0452 Drag on image to level image.\nClick on image for level lines. 0453 Drag within image using the mouse 0454 Draw a line across the image in \ndirection of brightness change. 0455 Draw box on image 0456 Draw line or arrow on image 0457 Draw on image: text, line/arrow, box, circle, ellipse 0458 Draw oval on image 0459 Draw text on image 0460 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0461 Duplicates: 0462 EDIT ALBUM 0463 EDIT ANY META 0464 EDIT BOOKMARKS 0465 EDIT MAIN META 0466 EDIT MENU 0467 EDIT PROCEDURES 0468 EDIT SCRIPT 0469 EDIT WORKFLOW 0470 EFFECTS MENU 0471 EMBOSS 0472 ENABLE/DISABLE AREA 0473 ENGRAVE 0474 ESCHER SPIRAL 0475 EXPORT FILES 0476 Edge 0477 Edit 0478 Edit Any Meta 0479 Edit Any Metadata 0480 Edit Bookmarks 0481 Edit Images 0482 Edit Keyboard Shortcuts 0483 Edit Line 0484 Edit Line/Arrow 0485 Edit Main Meta 0486 Edit Main Metadata 0487 Edit Menu 0488 Edit Metadata 0489 Edit Plugins 0490 Edit Text 0491 Edit any metadata tag 0492 Edit function can not use Paint Edits 0493 Edit function must be active 0494 Edit key metadata: keywords/geotags/description/rating ... 0495 Edit plugins menu 0496 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0497 Effects 0498 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0499 Emboss 0500 Enable 0501 Enable areas for editing 0502 End of gallery 0503 Engrave 0504 Enter Keyword 0505 Enter New Keyword 0506 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0507 Enter text, [Add] to layout, edit properties. 0508 Enter text, click/drag on image, right click to remove 0509 Erase 0510 Erase existing areas 0511 Escher Spiral 0512 Exceed 50 anchor points 0513 Export Files 0514 Export selected image files to another folder 0515 FILE MENU 0516 FILE SAVE 0517 FILE VIEW 0518 FIND AREA GAP 0519 FIND BAD FILES 0520 FIND DUPLICATES 0521 FIRST INDEX 0522 FIRST STARTUP 0523 FIX META 0524 FLATTEN HISTOGRAM 0525 FLATTEN PHOTO 0526 FOLDER TREE 0527 FOTOCX FOR WINDOWS 11 0528 FOTOCX LIMITATIONS 0529 FOTOCX USAGE 0530 FRINGES 0531 FUSION 0532 Fetch 0533 File 0534 File Mod Date/Time 0535 File Name 0536 File Name/Number 0537 File Name: %s \n 0538 File Size (bytes) 0539 File View 0540 File count: 0541 File type cannot be edited 0542 File1 0543 File2 0544 File: 0545 File: new session, open, rename, copy/move, delete, print 0546 Fill selected areas or transparent areas with a color 0547 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0548 Find 0549 Find Bad Files 0550 Find Duplicate Images 0551 Find Duplicates 0552 Find Gap 0553 Find a gap in an area outline 0554 Find all images for a location [date range] 0555 Find all images for a selected tag name and value 0556 Find images meeting multiple search criteria 0557 Find optimum factors: 0558 Finish 0559 Finish Area 0560 Fix Bad File 0561 Fix Broken Metadata 0562 Fix Meta 0563 Fix Motion Blur 0564 Fix Perspective 0565 Fix color fringes (chromatic aberration) 0566 Fix perspective for object photographed from an angle 0567 Fix red-eyes from flash photo 0568 Flatten 0569 Flatten Histogram 0570 Flatten Pano 0571 Flatten Photo 0572 Flatten brightness histogram to enhance details 0573 Flatten curved surface. 0574 Flatten photo of a curved image (e.g. poster on round column 0575 Flip 0576 Folder Tree 0577 Folders 0578 Folders for image files (subfolders included automatically) 0579 Font 0580 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0581 Foreground 0582 Fotocx copyright notice 0583 Fotocx home 0584 Fotocx privacy policy 0585 Fotocx video tutorial on YouTube 0586 Fotocx web site (information and downloads) 0587 FreeSans 0588 Full List 0589 Full Screen 0590 Fusion 0591 GALLERY END 0592 GALLERY FILTER 0593 GALLERY HOME 0594 GALLERY MENU 0595 GALLERY OVERVIEW 0596 GALLERY SORT 0597 GALLERY TO ALBUM 0598 GALLERY VIEW 0599 GDK pixbuf: cannot save file 0600 GLOBAL RETINEX 0601 GRID SETTINGS 0602 Gallery 0603 Gallery End 0604 Gallery Filter 0605 Gallery Home 0606 Gallery Sort 0607 Gallery View 0608 Gallery of newest image files 0609 Gallery of recently viewed image files 0610 Gallery to Album 0611 Gallery view with thumbnails and basic metadata 0612 Gallery view with thumbnails and file data 0613 Gallery: thumbnails, new/recent, sort, select, bookmarks 0614 Generate an inward spiraling repeating image 0615 Global Retinex 0616 Gradual 0617 Graduated Blur 0618 Graduated Blur - blur relative to pixel contrast 0619 Grayscale 0620 Green 0621 Grid Settings 0622 Group by country 0623 Group by country/date 0624 Group by country/location 0625 Group by country/location/date 0626 Group by date/country 0627 Group by date/country/location 0628 HDF 0629 HDR 0630 HELP MENU 0631 Hard 0632 Height 0633 Height: 0634 Help 0635 Help: user guide, tutorial, change log, licenses, privacy, about 0636 Hide 0637 Hide selected areas 0638 High 0639 High Depth of Field - combine near/far focus images for deeper focus 0640 High Dynamic Range - combine bright/dark images for better detail 0641 Highlight darkest and brightest pixels 0642 Home Folder 0643 Home Page 0644 Horz 0645 How to remove Fotocx application and user files 0646 Hue 0647 IMAGE ARRAY 0648 INDEX FILES 0649 INSIDE-OUT 0650 INVERT AREA 0651 Icon size 0652 Icons 0653 Image 0654 Image Array 0655 Image Columns 0656 Image Differences 0657 Image File 0658 Image File: 0659 Image Keywords 0660 Image Locations 0661 Image Markup 0662 Image Position 0663 Image Preferences 0664 Image Ratios 0665 Image Size (pixels) 0666 Image Time 0667 Image Timeline 0668 Image colors are converted for printing. 0669 Image dimensions have changed \nCopy Prior Edit cannot be used 0670 Image dimensions have changed, \nArea Blend cannot be used 0671 Image dimensions have changed, \nthis prior image cannot be used 0672 Image is fixed, unmovable 0673 Images sizes are not compatible 0674 Include: 0675 Index Files 0676 Index Level 0677 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0678 Index new image files and make thumbnails 0679 Input color to match and adjust: 0680 Inside-out 0681 Install following programs using your package manager: \n 0682 Intensity 0683 Invert 0684 Invert selected areas (selected ↔ not selected) 0685 Irregular Tiles 0686 Iterations 0687 JPEG ARTIFACTS 0688 JPEG Artifacts 0689 JPEG files 0690 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0691 Jump to gallery beginning [home] 0692 Jump to gallery end [end] 0693 KEYBOARD ESCAPE KEY 0694 KEYBOARD SHORTCUTS 0695 KEYWORDS OVERVIEW 0696 Keep 0697 Kernel size 0698 Keyboard Shortcuts 0699 Keywords Category 0700 Kill active dialog? 0701 Kill busy function? 0702 Kuwahara 0703 Kuwahara Depth 0704 LINE COLOR 0705 LOAD/SAVE AREA 0706 LOCAL CONTRAST 0707 LOCAL RETINEX 0708 Language 0709 Layout and background image 0710 Left 0711 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0712 Left/right click: previous/next image (also arrow keys) 0713 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0714 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0715 Length 0716 Level 0717 Licenses 0718 Light Source 0719 Lightness 0720 Limit 0721 Line Color 0722 Line Threshold 0723 Line Width 0724 Line length 0725 List Fotocx command line parameters 0726 List all metadata for current image or clicked thumbnail 0727 List outboard programs and functions 0728 Load 0729 Load settings from file 0730 Local Contrast 0731 Local Retinex 0732 Location 0733 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0734 Lock 0735 Low Amplify 0736 MAGNIFY IMAGE 0737 MAKE WAVES 0738 MANAGE KEYWORDS 0739 MAP MENU 0740 MAP VIEW 0741 MARGINS 0742 MARKUP 0743 MASHUP 0744 MATCH COLORS 0745 MEASURE IMAGE 0746 MENU SHORTCUTS 0747 METADATA MENU 0748 METADATA TAGS 0749 METADATA VIEW 0750 MONITOR COLOR 0751 MOSAIC 0752 MOUSE ALT-RIGHT-BUTTON 0753 MOUSE FUNCTIONS 0754 MOUSE OWNERSHIP 0755 MOVE FOTOCX HOME 0756 Magnify 0757 Magnify Image 0758 Magnify image around the mouse position 0759 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0760 Make Layout Image 0761 Make Square Tiles 0762 Make Waves 0763 Make a spherical projection of an image 0764 Make black margins transparent 0765 Make new versions 0766 Make width constant for window size 0767 Manage Keywords 0768 Map 0769 Map View 0770 Maps 0771 Maps: view images by map location 0772 Margin 0773 Margins 0774 Markup 0775 Mashup 0776 Mass update album files 0777 Match Brightness 0778 Match Colors 0779 Match Level 0780 Match Limit 0781 Match image colors to colors of another image 0782 Match using: 0783 Matching Keywords 0784 Max 0785 Max. Width 0786 Measure Image 0787 Measure Noise 0788 Measure pixel distances within an image 0789 Menu Colors 0790 Menu Style 0791 Metadata 0792 Metadata Tags 0793 Metadata View 0794 Metadata from Search Function 0795 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0796 Mirror: 0797 Mode: 0798 Monitor Color 0799 Mosaic 0800 Mouse Radius 0801 Mouse Warp (drag image) 0802 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0803 Move %d image files 0804 Move Fotocx Home 0805 Move Fotocx Home Folder 0806 Move Fotocx home folder to chosen folder 0807 Move mouse in a monotone image area. 0808 Multiplier 0809 NEW SESSION 0810 NEWEST FILES 0811 NEWLINE CHARACTERS IN METADATA 0812 NON-STANDARD DIALOG WIDGETS 0813 New Area 0814 New File Name: 0815 New Location 0816 New Location: 0817 New Name 0818 New Session 0819 New Type: 0820 New Version 0821 Newest 0822 Newest Files 0823 Next 0824 Next gallery 0825 No 0826 No curve lines found 0827 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0828 No images found 0829 Noise Reduction 0830 Noise Size 0831 None 0832 Normal Blur 0833 Normal Blur - mix pixels with all neighbor pixels 0834 OPEN IMAGE FILE 0835 OTHER TOPICS 0836 OUTLINES 0837 Old Name 0838 One Tag: 0839 Opacity 0840 Open 0841 Open Image File 0842 Open a file and paste as selected area into an image 0843 Open a parallel Fotocx session 0844 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0845 Open the trimmed color chart file 0846 Optimize 0847 Other Tag ... 0848 Outboard Programs 0849 Outline Drawing 0850 Outlines 0851 Output Color 0852 Overlap 0853 Overlay position in host image: 0854 Overlay width, % host image width: 0855 Overwrite file? \n%s 0856 PAINT EDITS 0857 PAINT IMAGE 0858 PAINT TRANSPARENCY 0859 PAINTING 0860 PANORAMA 0861 PATTERN 0862 PERSPECTIVE 0863 PLACES/DATES 0864 PLUGINS 0865 PREV/NEXT 0866 PRINT CALIBRATED 0867 PRINT IMAGE 0868 PRIVACY 0869 PROBLEM FILES 0870 PROBLEM REPORTING 0871 Paint Edits 0872 Paint Edits already active 0873 Paint Image 0874 Paint Image Transparencies 0875 Paint Radius 0876 Paint Transparency 0877 Paint and Warp Image 0878 Paint current edit function gradually using the mouse 0879 Paint entire image 0880 Paint image transparency using the mouse 0881 Paint on Image 0882 Paint on image using the mouse 0883 Paint transparency 0884 Paint within mouse 0885 Painting 0886 Panorama 0887 Paste 0888 Paste Image 0889 Paste previously copied area into image 0890 Pattern 0891 Pattern File: 0892 Pattern Width 0893 Percent 0894 Permissions 0895 Perspective 0896 Photo Date 0897 Photo Date/Time 0898 Photo Date/Time (metadata) 0899 Photo Date: %s File Date: %s \n 0900 Pixel count 0901 Pixel difference 0902 Pixels 0903 Places/Dates 0904 Plugin working ... 0905 Popup Image 0906 Power 0907 Power Center 0908 Power: Center 0909 Pre-align Images 0910 Preference: 0911 Press F1 for help 0912 Prev 0913 Prev/Next 0914 Previous 0915 Previous gallery 0916 Print Calibrated 0917 Print Image 0918 Print chart in vertical orientation without margins. 0919 Print current image file with calibrated colors 0920 Print the current image file 0921 Privacy 0922 Proceed 0923 Proceed? 0924 Process album files matching selected files: 0925 Process an image using a custom convolution kernel 0926 Process selected album files: 0927 Processing files 0928 Project name 0929 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0930 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0931 Pull on the image with the mouse. 0932 Purge unwanted keywords from all image files 0933 QUESTIONS, SUGGESTIONS 0934 Quit 0935 Quit Fotocx 0936 Quit Fotocx? 0937 RAW Files 0938 RAW Options 0939 RAW conversion failed: %s %s 0940 RAW loader 0941 RECENT FILES 0942 RECENT FOLDERS 0943 RED EYES 0944 REFINE MENU 0945 REMOVE DUST 0946 REMOVE HALO 0947 RENAME 0948 RENAME ALBUM 0949 REPAIR MENU 0950 RESCALE 0951 RETOUCH 0952 RGB -> BRG 0953 RGB -> GBR 0954 RGB HISTOGRAM 0955 RGB Histogram 0956 RGB brightness histogram graph 0957 RGB color 0958 RGB mix with given bit-depth 0959 ROTATE 0960 RUN SCRIPT 0961 Radial Blur 0962 Radial Blur - mix pixels in radial lines from chosen center 0963 Radius 0964 Random Image 0965 Range 0966 Rating: 0967 Rating: %s Size: %s %.2fmb \n 0968 Read or search the user guide 0969 Recent Files 0970 Recent Folders 0971 Recent Keywords 0972 Rectify closeup face photo (balloon face) 0973 Red 0974 Red Eye Reduction 0975 Red Eyes 0976 Red Factors 0977 Redo 0978 Reduce Fog/Haze 0979 Reduce fog/haze in an image or selected areas 0980 Refine 0981 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0982 Remove 0983 Remove Dust 0984 Remove Halo 0985 Remove dust spots from old scanned photos 0986 Remove from Album 0987 Remove halos left by some edit functions 0988 Remove image curvature, especially in panoramas 0989 Remove jaggies on hard image feature edges 0990 Remove selected image metadata 0991 Remove unwanted objects in an image 0992 Rename 0993 Rename Album 0994 Rename Image File 0995 Rename an existing album 0996 Rename or delete keywords for all image files 0997 Rename to 0998 Rename/convert/rescale/move selected image or RAW files 0999 Repair 1000 Repair malformed metadata preventing metadata edits 1001 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 1002 Replace 1003 Replace Text 1004 Replace all versions with newest version 1005 Replace all versions with selected versions 1006 Replace all with newest version only 1007 Replace all with original + newest version 1008 Replace all with original + selected versions 1009 Replace all with original and all versions 1010 Replace all with selected versions 1011 Replace host files 1012 Report Image Places/Dates 1013 Report selected metadata for selected image files 1014 Required programs are installed. \n 1015 Rescale 1016 Rescale Image 1017 Rescale RGB levels to reduce color caste and fog/haze 1018 Rescale brightness levels to increase local contrast 1019 Rescale: 1020 Reserved Shortcuts \n 1021 Reserved shortcut ignored: %s 1022 Reset 1023 Reset all galleries to file name ascending 1024 Resolution 1025 Resources 1026 Resume 1027 Retouch 1028 Reverse R 1029 Richardson-Lucy 1030 Right 1031 Rim % 1032 Rotate 1033 Rotate Image 1034 Rotate or level an image 1035 Rotate: 1036 Roy Lichtenstein effect 1037 SATURATION 1038 SCRIPT FILES 1039 SEARCH IMAGES 1040 SELECT AREA 1041 SELECT FILES 1042 SELECT IMAGE FILES 1043 SELECT MENU 1044 SET COLORS 1045 SET WALLPAPER 1046 SETTINGS 1047 SHARPEN 1048 SHIFT COLORS 1049 SHORTCUTS 1050 SHOW CIM FILES 1051 SHOW DIFFS 1052 SHOW ON MAP 1053 SHOW RESOURCES 1054 SHOW RGB 1055 SHOW/HIDE AREA 1056 SKETCH1 1057 SKETCH2 1058 SLIDE SHOW 1059 SLIDES AND NEGATIVES 1060 SLIDESHOW END 1061 SMART ERASE 1062 SOFT FOCUS 1063 SPHERE 1064 SPLIT-SCREEN 1065 STACK/LAYERS 1066 STACK/NOISE 1067 STACK/PAINT 1068 Saturation 1069 Save 1070 Save Gallery as Album 1071 Save Image File 1072 Save as new file name or type 1073 Save current gallery as album 1074 Save modified image as new file or new file version 1075 Save selected area to a file with transparency 1076 Saved Areas 1077 Scale 1078 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1079 Search 1080 Search Images 1081 Search Results 1082 Search all image files and report duplicates 1083 Searching - use ESC key to terminate 1084 Seconds 1085 Select 1086 Select %d to %d files 1087 Select Album 1088 Select Albums 1089 Select Area 1090 Select Area for Edits 1091 Select Area not supported \nby this edit function 1092 Select Files 1093 Select Image 1094 Select Image Files 1095 Select Metadata tags 1096 Select Script 1097 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1098 Select and Paint Image 1099 Select and view an image file 1100 Select area cannot be kept.\nContinue? 1101 Select area disabled, Continue? 1102 Select area not finished, Continue? 1103 Select area will be ignored. \nContinue? 1104 Select folder 1105 Select host image files 1106 Select image areas to edit separately, copy/paste selections 1107 Select image objects or areas for separate editing 1108 Select input files for subsequent function 1109 Select overlay file 1110 Select startup album 1111 Select startup folder 1112 Select startup image file 1113 Select the image file to print. 1114 Select to add, click on X to delete. 1115 Select two files 1116 Select versions, ratings, keywords, filename text 1117 Separation Horz 1118 Sequence Numbers 1119 Set Colors 1120 Set No. of Colors 1121 Set Ratio: 1122 Set Wallpaper 1123 Set Width: 1124 Set and view bookmarks, select for gallery view 1125 Set black-white/color, negative/positive, sepia 1126 Set foreground line color (crop, grid, select, warp) 1127 Set gallery from latest search results 1128 Set gallery from recent folders list 1129 Set gallery to folder of current file 1130 Set horizontal/vertical grid line counts 1131 Set image file as desktop wallpaper 1132 Set line properties, [Add] to layout, edit. 1133 Set number of colors for each R/G/B or total 1134 Set or shift photo date/time for selected image files 1135 Set the name for the output calibration file \n[your calibration name].dat 1136 Settings 1137 Sharpen 1138 Sharpen the image (various methods) 1139 Shift + drag mouse across image \nto indicate blur direction 1140 Shift Colors 1141 Shift/convert image colors into other colors 1142 Short List 1143 Show 1144 Show (outline) selected areas 1145 Show CIM Files 1146 Show Diffs 1147 Show Fotocx installed version and author contact 1148 Show Fotocx updates for recent releases 1149 Show Hidden 1150 Show Log File 1151 Show RGB 1152 Show RGB levels at mouse position 1153 Show Resources 1154 Show folder hierarchy, click folder for gallery view 1155 Show image counts in year/month table, select, report 1156 Show image description (overlap) 1157 Show image differences on the image 1158 Show image file name (overlap) 1159 Show image title (overlap) 1160 Show input files used in combine function 1161 Show key metadata for current image or clicked thumbnail 1162 Show map position of the current image file 1163 Show memory and CPU resources used 1164 Show on Map 1165 Show or make Keyboard Shortcuts 1166 Show the current (last used) album 1167 Show the current log file 1168 Size 1169 Sketch1 1170 Sketch2 1171 Slide Show 1172 Smart Erase 1173 Soft Focus 1174 Sphere 1175 Spherical Projection 1176 Split-Screen 1177 Stack/Layers 1178 Stack/Noise 1179 Stack/Paint 1180 Stacking Order 1181 Start 1182 Start a slide show 1183 Start of gallery 1184 Startup View 1185 Stop 1186 Stretch 1187 Stretch: 1188 Suppress JPEG compression artifacts 1189 Suppress Ringing 1190 Suppress fine details while retaining sharpness 1191 Suppress noise from low-light photos 1192 Survey all files 1193 TEXTURE 1194 THUMB VIEW 1195 TILES1 1196 TILES2 1197 TIMELINE 1198 TINY PLANET 1199 TOOLS MENU 1200 TRANSLATIONS 1201 TWIST 1202 Temperature 1203 Text 1204 Text File: 1205 Texture 1206 Threshold 1207 Threshold: Low 1208 Thumbnail View 1209 Thumbnail size 1210 Thumbnails folder 1211 Thumbnails folder: %s \nPlease remove. 1212 Thumbnails folder: \n %s \nmust be named .../thumbnails 1213 Thumbnails: 1214 Tile 1215 Tile blending 1216 Tile image with a repeating pattern 1217 Tiles 1218 Tiles1 1219 Tiles2 1220 Timeline 1221 Tiny Planet 1222 Title 1223 Title: %s\n 1224 To Location 1225 Toggle Captions 1226 Toggle Grid 1227 Toggle grid lines on and off 1228 Toggle image metadata display ON/OFF 1229 Too little overlap, cannot align 1230 Too many edits, please save image 1231 Tools 1232 Tools: image index, settings, shortcuts, grid, find duplicates 1233 Top 1234 Total Colors 1235 Trace 1236 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1237 Transient Objects 1238 Transition Preferences 1239 Transition to next image 1240 Transitions File 1241 Transp. 1242 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1243 Trash 1244 Trash read-only file? 1245 Turn an image inside-out 1246 Twist 1247 Twist image centered at mouse position 1248 UNBEND 1249 UNDO/REDO BUTTON 1250 UNWARP CLOSEUP 1251 UPDATE ALBUMS 1252 UPRIGHT 1253 USER GUIDE 1254 Unable to copy metadata 1255 Unbend 1256 Undo 1257 Undo All 1258 Undo Last 1259 Undo/Redo 1260 Uninstall 1261 Unwarp Closeup 1262 Update Albums 1263 Update albums for new file versions 1264 Upright 1265 Upright Image 1266 Upright or mirror-flip an image 1267 Upright rotated image files, selected set or ALL 1268 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1269 Use [Select] to add files to an empty album 1270 Use metadata photo date or file modification date? 1271 Use metadata tag 1272 Use settings file 1273 User Guide 1274 User preferences and settings 1275 VIDEO press P to play 1276 VIEW 360° PANO 1277 VIEW ALL META 1278 VIEW MAIN META 1279 VIGNETTE 1280 Var. Transparency 1281 Vert 1282 Video Files 1283 Video Tutorial 1284 Video command 1285 View 360 degree panorama image 1286 View 360° Pano 1287 View All Meta 1288 View All Metadata 1289 View Main Meta 1290 View Main Metadata 1291 View before/after images using split-screen 1292 View/edit metadata, image report and search functions 1293 Vignette 1294 W/H Ratio: 1295 WARP AFFINE 1296 WARP AREA 1297 WARP CURVED 1298 WARP IMAGE 1299 WARP MENU 1300 WARP RADIAL 1301 WINDOW VIEWS AND MENUS 1302 WORLD MAP 1303 Wait after zoom 1304 Wait before filename/title/description 1305 Wait before zoom 1306 Warp 1307 Warp Affine 1308 Warp Area 1309 Warp Curved 1310 Warp Image 1311 Warp Linear1 1312 Warp Linear2 1313 Warp Radial 1314 Warp an image with a wave pattern 1315 Warp image (affine) using the mouse 1316 Warp image (curved) using the mouse 1317 Warp image (linear 1) using the mouse 1318 Warp image (linear 2) using the mouse 1319 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1320 White 1321 Widen: 1322 Width 1323 Width % 1324 X-size 1325 Yes 1326 ZOOM 1327 Zoom 1328 Zoom Center 1329 Zoom Speed 1330 Zoom-in 1331 Zoom-out 1332 \n %d-bits/color 1333 \n *** CANCELED \n 1334 \n *** COMPLETED \n 1335 \n *** Delete Originals *** 1336 \n *** Keep Originals *** 1337 \n *** Replace Originals *** 1338 \n Convert to %s 1339 \n Copy Metadata 1340 \n Downsize within %dx%d 1341 \n New Location: %s 1342 \n Output to %s 1343 \n PROCEED? 1344 \n Rename to %s 1345 \n Replace text: %s --> %s 1346 \n Rescale to %sx 1347 \n Update Albums 1348 \n Upsize within %dx%d 1349 \n*** CANCELED \n 1350 \n*** COMPLETED \n 1351 \n\nPROCEED? 1352 add 1353 add after old 1354 add all gallery files to list 1355 add current file to list 1356 add entered text to layout 1357 add images to layout 1358 add line/arrow to layout 1359 add new keyword 1360 add or edit images 1361 add or edit lines/arrows 1362 add or edit text 1363 add to set 1364 adder 1365 adjust brightness of selected image 1366 after removal of missing files: %d \n 1367 album %s: deleted 1368 album already exists: %s 1369 album mass update 1370 albums folder missing 1371 align and trim color chart 1372 all files 1373 all image files, including unmounted folders: %d \n 1374 all images 1375 all versions 1376 amplify contrast 1377 amplitude 1378 angle 1379 apply 1380 area edge creep 1381 area is not finished 1382 area outline color: 1383 array width is too large: %d x %d 1384 ascending 1385 auto color 1386 background colors for file and gallery view windows 1387 backing 1388 bad category name 1389 bad keyword name 1390 bad pattern file: %s 1391 base 1392 base and adder need $s plugin 1393 base size 1394 begin making a script file 1395 black/white 1396 black/white negative 1397 black/white positive 1398 blend 1399 blend edges: blend width: 1400 blend image overlaps over pixel width 1401 blend rate: center: 1402 blocking function: %s 1403 blocksize 1404 blur edges: blur width: 1405 blur radius 1406 borders 1407 both 'All Files' and specific files were selected 1408 bright halo 1409 brightness rescale 1410 browse 1411 brush size 1412 build index, old files only 1413 cancel project 1414 cancel project? 1415 cannot allocate %d MB memory 1416 cannot be determined 1417 cannot copy a file to itself 1418 cannot copy current file 1419 cannot create output file 1420 cannot create pixbuf 1421 cannot find area outline 1422 cannot find output file 1423 cannot load input file 1424 cannot open file %s 1425 cannot parse current file 1426 cannot parse file 1427 cannot read pluging output file 1428 cannot replace %s file 1429 cannot save as RAW type 1430 cannot save layout file: %s 1431 cannot write image folders file: %s 1432 category %s has too many keywords 1433 category %s is too big 1434 center 1435 change project scale 1436 choose 1-8 clicks or [+] keys for 2x image zoom 1437 choose a better spot 1438 choose an image file 1439 choose file 1440 choose files 1441 choose folder 1442 choose folders 1443 choose location 1444 circle 1445 clear area selections 1446 clear entered text 1447 clear inputs 1448 clear text 1449 click a defined keyword (below) to add a search keyword 1450 click bright point 1451 click dark point 1452 click on desired color 1453 click on image to get source color 1454 click on image to set matching color 1455 click on thumbnail to set zoom center 1456 click position to add line 1457 click position to add text 1458 click to select 1459 click to unselect 1460 clicks per 2x image increase 1461 color 1462 color depth 1463 color depth: 1464 color match level % 1465 color negative 1466 column difference: %d pixels 1467 column difference: %d pixels \nMake columns even? 1468 combined image files 1469 command: 1470 commit all changes, close dialog 1471 complete file selection first 1472 completed 1473 condense into color blobs 1474 condition 1475 confirm Fotocx exit 1476 constant blur 1477 continue? 1478 converting colors... 1479 converting files 1480 copy (duplicate file) 1481 copy and paste commands 1482 copy files to %s 1483 copy metadata from Nth file: 1484 copy to Desktop failed: %s 1485 count: 0 1486 create folder 1487 create folder %s 1488 current gallery 1489 current image files found: %d \n 1490 current set only 1491 current set: 1492 curve file is invalid 1493 custom command to play video files 1494 dark 1495 dark halo 1496 dark pixels 1497 data is incomplete, proceed? 1498 date format is yyyy:mm:dd [hh:mm:ss] 1499 date range 1500 days 1501 delete 1502 delete %s \n%s 1503 delete Mashup project files? 1504 delete failed: \n%s 1505 delete originals specified but no new name given 1506 delete selected text from layout 1507 deleting orphan thumbnails ... \n 1508 depth 1509 descending 1510 direction of light and shadows 1511 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1512 discard changes? 1513 do not warp images during auto-alignment 1514 do nothing 1515 dot size 1516 downsize 1517 drag image 1518 drag mouse along an edge to follow the edge 1519 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1520 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1521 drag mouse to outline an area 1522 drag mouse to select circular or elliptical area 1523 drag mouse to select rectangular area 1524 drag mouse to show selected image 1525 duplicate keyword 1526 edge distance calculation 1527 edge: 1528 edit 1529 edit commands 1530 edit custom shell commands, match colors to embedded jpeg image 1531 edit this menu 1532 ellipse 1533 embedded numbers will sort by value 1534 emboss 1535 enter 2-character language code: en, de, fr ... 1536 enter a project name 1537 enter an album name 1538 enter cities/locations, countries 1539 enter project name 1540 enter tag name 1541 enter tag names 1542 erase 1543 error compensation 1544 exceed %d edits 1545 exceed %d images 1546 exceed %d max files, cannot continue 1547 exceed %d rows 1548 exceed %d selected files 1549 exceed %d shortcuts 1550 exceeded %d line entries 1551 exceeded %d text entries 1552 exceeded max. images: %d 1553 exceeded max. tiles: %d 1554 exit split-screen 1555 expand to these limits if smaller 1556 exporting files 1557 extra indexed metadata tags > %d 1558 extra metadata tags to include in index 1559 extra metadata tags: \n 1560 fetch 1561 file 1562 file .ext names to recognize RAW files 1563 file .ext names to recognize video files 1564 file close error 1565 file color 1566 file error: %s 1567 file format error 1568 file format error: %s 1569 file included: %s \n 1570 file metadata update failed 1571 file name 1572 file names 1573 file not found 1574 file not found \n 1575 file not found: %s 1576 file not found: %s %s 1577 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1578 file: %s \nexceed 99 versions 1579 filename text 1580 files in %s can be deleted 1581 fill from current gallery 1582 fill from selected files 1583 fill selected areas 1584 fill transparent areas 1585 find all image files ...\n 1586 find and report all unreadable image files 1587 find outline gap 1588 find via table lookup 1589 find_imagefiles() failure \n 1590 find_imagefiles() failure: %s \n 1591 finish current edit first 1592 finish making a script file 1593 finish or cancel pending edit 1594 fix box in layout and start new box 1595 fix line in layout and start new line 1596 fix motion blur 1597 fix oval in layout and start new oval 1598 follow edge 1599 font name and size for menus and dilogs 1600 force a full re-index of all image files 1601 format: yyyy:mm:dd [hh:mm:ss] 1602 fotocx will exit 1603 found %d pixels 1604 free disk space: %d GB \n 1605 freehand draw 1606 ftruncate() failure: %s 1607 full image index: reports will be complete \n 1608 function canceled 1609 gallery 1610 gallery is empty 1611 gallery truncated to %d images 1612 get images having text in filename (comma separated) 1613 get images with matching keywords (comma separated) 1614 get images within rating range 1615 gradual paint 1616 grid counts not 0-100: %s 1617 grid picklist file error: %s 1618 grid size 1619 group 1620 height 1621 hide area outlines 1622 hide transient objects 1623 high 1624 home folder was not changed 1625 horizontal 1626 hours 1627 icons only, text only, or both 1628 if image < window, center or shift left or right 1629 ignore differences above limit 1630 image blend 1631 image files 1632 image for source color 1633 image index records found: %d \n 1634 image index required 1635 image index write error: %s 1636 image is too large to edit: %d x %d 1637 image is too large: %dx%d, %lld megapix 1638 image is too small to edit: %d x %d 1639 image scale 1640 image to set matching color 1641 image width must be greater than height 1642 images to report 1643 include all files 1644 include edited versions 1645 include last versions only 1646 include original files 1647 include transparent areas 1648 include: 1649 increase blur with distance 1650 index completed, %.1f seconds \n 1651 index config file error: %s 1652 index updates needed: %d thumbnails: %d \n 1653 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1654 input 1655 input file: %s \n 1656 insufficient memory, cannot proceed 1657 insufficient overlap for color matching 1658 invalid GPS data 1659 invalid GPS data: %s 1660 invalid album 1661 invalid date range: %s %s 1662 invalid date/time format 1663 invalid file 1664 invalid plugin: %s 1665 invalid rating range 1666 invalid source file: %s 1667 invert area 1668 jpeg quality level - 70+ for good image quality 1669 keyboard 1670 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1671 keyword names 1672 keywords to add 1673 keywords to remove 1674 keywords_defined file error: %s 1675 last search 1676 last version 1677 last versions 1678 layout exceeds 4 gigabytes 1679 layout file missing: %s 1680 left 1681 left click on image for selected color 1682 left click: set image source location \nright click: set corresponding destination 1683 left drag: add transparency \nright drag: add opacity 1684 left drag: copy image to mouse position \nright drag: restore original image 1685 left drag: reduce halo, right drag: undo 1686 lens mm 1687 level based on EXIF roll angle 1688 light 1689 light pixels 1690 line 1691 line color 1692 line width 1693 load 1694 load text data from a file 1695 load widgets failed: %s 1696 loading palette ... 1697 location is not a folder 1698 locations 1699 lock width/height ratio 1700 log file is in a terminal 1701 low 1702 low contrast 1703 lower 1704 make an initially empty album 1705 make new version 1706 manual align 1707 map marker (red dot) diameter, pixels 1708 map selected areas and verify 1709 mashup project 1710 match embedded image color 1711 match image color to base image (repeat) 1712 match values 1713 matches 1714 max keywords exceeded 1715 max. Width 1716 max. album count exceeded: %d 1717 max. album files reached, results truncated 1718 max. album size exceeded: %d 1719 max. blur radius 1720 max. brightness 1721 max. image limit reached: %d 1722 max. width or height is not reasonable 1723 maximum clip allowed to fit window 1724 mean RGB: %5.0f %5.0f %5.0f 1725 mean noise: %5.2f %5.2f %5.2f 1726 median 1727 median diff 1728 menu text and background colors 1729 metadata 1730 metadata copy failed 1731 metadata from Search Function, metadata report 1732 metadata picklist file not found %s 1733 metadata tags to report 1734 metadata update error 1735 metadata update error \n 1736 metadata update error: %s 1737 metadata update failed \n 1738 min. blur radius 1739 min. contrast 1740 min. edit curve node separation, % of scale length 1741 min. separation, %c of scale 1742 minutes 1743 mmap() failure: %s 1744 months 1745 more than %d categories 1746 more than 20 matches 1747 mouse radius 1748 mouse radius for color sample 1749 mouse radius: 1750 move (delete original) 1751 move area boundary in/out in 1-pixel steps 1752 move to next input file 1753 move to trash failed \n 1754 move to trash failed: %s 1755 multiply 1756 must have 4 corners 1757 need numeric match value: %s 1758 negative 1759 new album created 1760 new album name 1761 new file 1762 new file ... 1763 new file name is invalid 1764 new file type 1765 new home folder contains a blank 1766 new location 1767 new location is not a folder 1768 new version 1769 newest files 1770 no EXIF orientation data 1771 no active Select Area 1772 no albums selected 1773 no auto warp 1774 no change 1775 no current album 1776 no current edit image 1777 no current file 1778 no curve (scanned image) 1779 no description 1780 no file selected 1781 no files found 1782 no files selected 1783 no host files selected 1784 no image index: reports disabled \n 1785 no images 1786 no images found 1787 no input files available 1788 no matching files found 1789 no matching locations 1790 no metadata level data 1791 no metadata tags to report 1792 no option selected 1793 no overlay file selected 1794 no photo date, skipped 1795 no plugin output file found 1796 no prior edit 1797 no prior edit image 1798 no saved folders 1799 no script file was started 1800 no script files found 1801 no select area 1802 no selection 1803 no title 1804 no write permission 1805 no write permission \n 1806 no write permission: %s 1807 none 1808 not a known image file 1809 not an image file 1810 not an indexed image file \n 1811 nothing found 1812 nothing left, no change made 1813 old file 1814 old image index: reports will omit new files \n 1815 old keyword name >> new keyword name 1816 omit high pixel 1817 omit low pixel 1818 only %d tile images found 1819 opacity center 1820 opacity edge 1821 open album 1822 open and process color chart 1823 open as new current file 1824 optional deselect color 1825 original 1826 originals 1827 other 1828 out of space for temp files \nsave your edits and quit Fotocx 1829 outline 1830 output file exists 1831 output file exists, overwrite? 1832 output file size change, cannot use select area 1833 output file: 1834 output file: %s \n 1835 oval 1836 overlay file missing: %s 1837 owner 1838 paint 1839 paint color 1840 paint edits cannot be used for this method 1841 paint over transparent areas 1842 paint radius 1843 palette 1844 palette exceeds %d color limit 1845 palette file 1846 palette has %d colors 1847 palette loaded, %d colors 1848 palette: 1849 patch area goal 1850 percent 1851 perform edits to include in the script file 1852 permissions: 1853 perspective 1854 photo 1855 picklist file not found: %s 1856 pixel = mean of best match neighbors 1857 pixel = median of all neighbors 1858 please make a choice 1859 plugin command failed 1860 plugin menu not found %s 1861 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1862 popup_choose: empty list 1863 position with mouse click/drag 1864 position: 50 50 1865 position: x=%02d y=%02d 1866 power 1867 power center 1868 power edge 1869 power: center 1870 pref 1871 previous file 1872 previous name 1873 print color chart 1874 print select area(s) only? 1875 prior edit step 1876 project complete 1877 project file is defective 1878 project name cannot have quote characters 1879 pure RGB or black/white dots 1880 quality 1881 quality level (70+) 1882 radius 1883 radius: 1884 random 1885 random position 1886 rating range 1887 reading image index file ...\n 1888 recent files 1889 reduce bright 1890 reduce dark 1891 reduce to these limits if larger 1892 refresh 1893 remove %d duplicates? 1894 remove all files in list 1895 remove duplicate 1896 remove from set 1897 remove panorama image curving 1898 remove selected file from list 1899 rename keywords 1900 repair metadata for %s 1901 replace 1902 replace album %s ? 1903 replace file 1904 replace old 1905 replace old file (OVERWRITE) 1906 replace substring within file name 1907 report type: 1908 req. color match 1909 reset 1910 resolution 1911 resume from current image 1912 right 1913 right click on image for deselected color 1914 sample % 1915 save 1916 save Mashup output file 1917 save Mashup project? 1918 save area as a PNG file 1919 save as new file name or type 1920 save as new file version 1921 save edit, start new text 1922 save metadata to image file 1923 save text data to a file 1924 save to .heic/.avif file not supported 1925 save to .jp2 file not supported 1926 save to .webp file not supported 1927 scan and save color chart 1928 scanned color chart file 1929 scope of neighbor pixels 1930 script already started 1931 script complete 1932 script error: %s, %s 1933 script file closed 1934 script file error 1935 script file format error: %s 1936 script file name too big 1937 script file to run 1938 search for names in image location metadata 1939 search for text within file folders or file name 1940 search for text within image title or description 1941 search known locations 1942 search range 1943 search: 1944 seconds 1945 seconds to show with text 1946 seconds to show without text 1947 select all 1948 select all colors within mouse (flood) 1949 select area missing or not finished 1950 select area within mouse 1951 select area within mouse circle 1952 select base image for color matching 1953 select by color, required match level 1954 select by color, search range 1955 select font 1956 select image to show with mouse paint 1957 select images randomly 1958 select initial files 1959 select line color 1960 select one color within mouse 1961 select rectangle 1962 select source image color first 1963 select surrounding areas matching colors in mouse 1964 selection exceeds %d tags 1965 sepia 1966 set a new date/time: 1967 set all 1968 set current window size 1969 set image color from input files 1970 set location from world map 1971 set maximum crop 1972 shadow 1973 shell command used for converting RAW files to RGB 1974 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1975 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1976 shift existing date/time (+/–): 1977 shift+click on image to select color 1978 shortcut function not found: %s 1979 shortcut key: 1980 shortcut not found: %s 1981 show area outlines 1982 show hidden files and folders 1983 show transient objects 1984 size of mouse selection circle 1985 smooth 1986 source file: 1987 source image failure (scale too big?) 1988 source image scale 1989 specify a thumbnail folder 1990 specify at least 1 top image folder 1991 specify background size and color 1992 specify files and keywords 1993 spot size limit 1994 start 1995 start a new script file 1996 start album 1997 start blob condensation process 1998 start file 1999 start folder 2000 start from first image in album 2001 start fusion process 2002 start over at end of album 2003 start warp 2004 start with previous image file, gallery of recent files, etc. 2005 startup album is invalid 2006 startup file is invalid 2007 startup folder is invalid 2008 status: %s \n 2009 status: completed \n 2010 stay open 2011 step 2012 stop 2013 stop blob condensation process 2014 stop fusion process 2015 supply a file name 2016 tag name 2017 tag name %s not in xmeta tag list 2018 tag value 2019 target file: 2020 template 2021 test: show changes, do not update files 2022 text 2023 text file is defective 2024 text time 2025 this function cannot be scripted 2026 thumbnail file 2027 thumbnails deleted: %d \n 2028 thumbnails folder: %s \n 2029 tile area goal 2030 tile gap 2031 tile size 2032 time 2033 title/desc. 2034 to add images to current set, \nsearch all images 2035 to remove images from current set, \nsearch current set 2036 too many categories 2037 too many files, cannot continue 2038 too many keywords in a category 2039 top image folders: \n 2040 transition 2041 transitions 2042 trash 2043 trimmed color chart file 2044 unable to save bookmarks file 2045 unknown edit function: %s 2046 unknown file type 2047 unknown or empty album: %s 2048 unsharp mask 2049 update 2050 updating albums ...\n 2051 upper 2052 upsize 2053 use 2054 use a saved Mashup project 2055 use average 2056 use custom color palette 2057 use median 2058 use option to stop accidental quit 2059 use previous input 2060 use previous location 2061 use prior edit step: 2062 use the current image file 2063 variance 2064 versions 2065 vertical 2066 video files not supported (install ffmpeg) 2067 view album 2068 waiting 2069 warp 2070 warp and align selected image with mouse drags 2071 warp and fine-align selected image with neighbor 2072 warp span 2073 wavelength 2074 width 2075 writing updated image index file \n 2076 x-count 2077 x-offset 2078 y-count 2079 y-offset 2080 years 2081 you can close this window now \n 2082 you cannot use new name and replace text together 2083 you must use either $s or $oldname 2084 zoom image 2085 zoom via mouse wheel or Keys +/=/-/↑/↓ 2086 zoom-in 2087 zoom-out fotocx/data/translations/$ AI prompts0000644000175000017500000000365615247006657016505 0ustar micomicoAI PROMPTS GUI translation: Please translate my text file from English to Xxxxxxx. The context is digital image editing and photography. The text lines are elements of an application GUI. Translate each input line into one output line. Output lines must have the same format as the input lines, including special characters and spaces. Do not convert embedded "\n" into a new line character. Do not translate the following technical words: OK, zoom, RAW, thumb, thumbs, thumbnail, thumbnails, metadata, tag, tags, keyword, keywords, geotag, geotags, GPS, latitude, longitude. --------------------------------------------------------- Repeat the same procedure using the new input file. --------------------------------------------------------- Userguide translation: Please translate my text file from English to Xxxxxxx. The context is digital image editing and photography. Keep 1:1 correspondence of input and output lines. Preserve existing line formats. Preserve indentations and other extra blanks. Do not translate the text "TOPIC:". Translate text following "TOPIC:". Translate uppercase text. Translate text inside bracketts {} and []. Do not translate the following technical words: OK, zoom, RAW, thumb, thumbs, thumbnail, thumbnails, metadata, tag, tags, keyword, keywords, geotag, geotags, GPS, latitude, longitude. --------------------------------------------------------- Find short translations for "Undo/Redo": My program uses the English text "Undo/Redo" as a menu item. When translated into other languages, the text is often too long. Therefore, I need to translate "Undo/Redo" into other languages, using an expression or abbreviation as small as possible. Please give me suggestions for the following languages: Danish German Greek English Spanish Finnish French Hungarian Italian Japanese Dutch Norwegian Polish Portuguese Romanian Russian Swedish Turkish Chinese ----------------------------------------------------------- fotocx/data/translations/ug_tr0000664000175000017500000106003415247006657015537 0ustar micomico- ^FOTOCX KULLANICI KILAVUZU^ v.26.8 Fotocx menüsü Yardım > Kullanıcı Kılavuzu üzerinden görüntüleyin - {FOTOCX KULLANIMI} {İLK BAŞLATMA} - hızlı arama için görüntü dosyalarını bulma ve dizinleme {KULLANICI KILAVUZU} ← ^buraya tıklayın^ - bu kullanıcı kılavuzu tarayıcısının nasıl kullanılacağı {PENCERE GÖRÜNÜMLERİ VE MENÜLERİ} - üst düzey pencereler ve ilgili menüler {DOSYA GÖRÜNÜMÜ} - Dosya Görünümü penceresi (tek bir görüntü dosyasını görüntüleme) {GALERİ GÖRÜNÜMÜ} - Galeri Görünümü penceresi (klasörü thumbnail olarak görüntüleme) {HARİTA GÖRÜNÜMÜ} - harita görünümü penceresi (görüntü konum işaretçileriyle haritayı görüntüleme) {SÜRÜKLE VE BIRAK} - dosya sürükle ve bırak yöntemleri {PROSEDÜRLERİ DÜZENLE} - görüntü dosyalarının nasıl düzenleneceği {İŞ AKIŞINI DÜZENLE} - alternatif düzenleme yöntemleri - basit ve karmaşık {FARE SAHİPLİĞİ} - iletişim kutusu-fare kontrolü ve etkileşimi {FARE ALT-SAĞ-DÜĞME} - dokunmatik yüzeyler/ekranlar için fare sağ düğmesi {İLETİŞİM KUTUSU DÜĞMELERİ} - iletişim kutusunu tamamlama seçenekleri {KLAVYE ESCAPE TUŞU} - Escape tuşunun işlevleri {STANDART DIŞI İLETİŞİM KUTUSU BİLEŞENLERİ} - standart dışı iletişim kutusu bileşenlerinin nasıl kullanılacağı {EĞRİ DÜZENLEME} - düzenleme işlevlerinde kullanılan eğrilerin nasıl değiştirileceği {MOUSE PAINTING} - fareyi kullanarak bir görüntüyü yerel olarak düzenleme {TOPLU İŞLEM} - toplu işlem işlevlerine genel bakış {GÖRÜNTÜ DOSYALARINI SEÇ} - görüntü dosyası seçme prosedürü {KISAYOLLAR} - açılır menüler, klavye kısayolları, özel kullanıcı menüsü {FARE İŞLEVLERİ} - dosya/galeri/harita görünümleri için fare işlevleri {KOMUT PARAMETRELERİ} - Fotocx komut satırı parametreleri - {DOSYA MENÜSÜ} {YENİ OTURUM} - ayrı bir pencerede yeni bir Fotocx oturumu başlat {GÖRÜNTÜ DOSYASI AÇ} - görüntülemek veya düzenlemek için bir görüntü dosyası aç {2 DOSYA DÖNGÜSÜ} - en son görüntülenen iki görüntü dosyası arasında geçiş yap {3 DOSYA DÖNGÜSÜ} - en son görüntülenen üç görüntü dosyası arasında geçiş yap {360° PANO GÖRÜNTÜLE} - döner bakış açılı 360° panorama görüntüsü {BOŞ GÖRÜNTÜ} - belirtilen boyut ve renkte boş görüntü oluştur {BOŞ GÖRÜNTÜ} - yeni bir boş görüntü oluştur {KOPYALA/TAŞI} - bir görüntü dosyasını başka bir klasöre kopyala veya taşı {MASAÜSTÜNE KOPYALA} - bir görüntü dosyasını masaüstüne kopyala {PANOYA KOPYALA} - bir görüntü dosyasını panoya kopyala {SİL/ÇÖPE AT} - bir görüntü dosyasını sil veya çöpe at {DUVAR KAĞIDINI AYARLA} - geçerli görüntü dosyasından masaüstü duvar kağıdını ayarla {GÖRÜNTÜYÜ YAZDIR} - bir görüntü dosyasını yazdır {KALİBRELİ YAZDIR} - renk kalibrasyon verilerini kullanarak yazdır {YAZICI KALİBRE ET} - yazıcı rengini kalibre et - renk kaymalarını telafi et - {GALERİ MENÜSÜ} {GALERİ GENEL GÖRÜNÜMÜ} {THUMBNAIL GÖRÜNÜMÜ} - thumbnail ve dosya adlarıyla Galeri Görünümü {METADATA GÖRÜNÜMÜ} - thumbnail ve temel metadata ile Galeri Görünümü {SON DOSYALAR} - en son görüntülenen görüntü dosyalarının Galeri Görünümü {EN YENİ DOSYALAR} - en yeni görüntü dosyalarının Galeri Görünümü {GALERİ SIRALAMA} - bir galerinin sıralama düzenini değiştir {GALERİ FİLTRESİ} - en yeni, en eski, eşleşen deseni seç ... {GALERİ ANA SAYFASI} - galeri başlangıcına atla {GALERİ SONU} - galeri sonuna atla {GEÇERLİ DOSYA KLASÖRÜ} - geçerli galeriyi geçerli dosyanın klasöründen ayarla {SON KLASÖRLER} - son görüntülenen klasörlerin listesini görüntüle, seç {KLASÖR AĞACI} - görüntü dosyası klasörlerini ağaç yapısında görüntüle, seç {DOSYALARI SEÇ} - toplu işlem, betik veya albüm girdisi için dosyaları seç {YER İMLERİ} - yer imleri listesini görüntüle, yer imine git {YER İMLERİNİ DÜZENLE} - yer imlerini ekle, kaldır, düzenle - {MAPS MENU} {DÜNYA HARİTASI} - internet dünya haritası genel görünümü {HARİTADA GÖSTER} - geçerli görüntü konumunu haritada göster - {ALBÜMLER MENÜSÜ} {ALBÜMLER} - görüntü koleksiyonları oluştur ve düzenle {ALBÜM OLUŞTUR} - yeni bir albüm oluştur (seçilen görüntülerin galerisi) {ALBÜMÜ YENİDEN ADLANDIR} - mevcut bir albümü yeniden adlandır {ALBÜMÜ SİL} - mevcut bir albümü sil {ALBÜM SEÇ} - bir albüm seç ve görüntü galerisini göster {GEÇERLİ ALBÜM} - geçerli (en son kullanılan) albümü göster {GALERİYİ ALBÜME DÖNÜŞTÜR} - geçerli galeriyi adlandırılmış bir albüm olarak kaydet {ALBÜMÜ DÜZENLE} - bir albüm galerisindeki görüntü dosyalarını ekle, kaldır, yeniden düzenle {ALBÜMLERİ GÜNCELLE} - güncellenmiş görüntü dosyaları için albümleri güncelle (yeni sürümler) {ALBÜM TOPLU GÜNCELLEME} albümleri toplu güncelle (üye dosyaları ekleme/kaldırma/değiştirme) {SLAYT GÖSTERİSİ} - animasyonlu görüntü geçişleri ve pan/zoom içeren slayt gösterisi - {ÖZEL MENÜ} - sık kullanılan işlevler için özel kullanıcı menüsü {BETİK DOSYALARI} - betik dosyalarına genel bakış {BETİĞİ DÜZENLE} - özel bir düzenleme işlevi oluşturmak için düzenlemeleri bir betiğe kaydet {BETİĞİ ÇALIŞTIR} - betiği geçerli görüntü üzerinde çalıştır {TOPLU BETİK} - betiği seçili görüntü dosyaları üzerinde çalıştır {EKLENTİLER} - bir eklenti düzenleme işlevi başlat, eklenti çıktı dosyasını aç - {ZOOM} - fare veya klavye ile görüntüyü veya thumbnail'leri yakınlaştır/uzaklaştır - {ÖNCEKİ/SONRAKİ} - fare veya klavye ile önceki veya sonraki görüntüye git - {DOSYA KAYDET} - görüntü dosyasını kaydet (değiştir, yeni sürüm, yeni dosya adı) - {METADATA MENÜSÜ} {ANA METAYI GÖRÜNTÜLE} - ana görüntü metadata'sını listele {TÜM METAYI GÖRÜNTÜLE} - tüm görüntü metadata'sını listele {KEYWORD'LERE GENEL BAKIŞ} - görüntü aramak için kullanılan keyword'ler {GEOTAGS OVERVIEW} - arama için konum adları ve coğrafi koordinatlar {ANA METAYI DÜZENLE} - sık kullanılan metadata'yı düzenle {HERHANGİ BİR METAYI DÜZENLE} - herhangi bir metadata'yı düzenle (ekle, kaldır, değiştir) {METAYI SİL} - belirtilen metadata'yı veya tüm metadata'yı sil {META KOPYALA} - metadata'yı bir görüntü dosyasından diğerine kopyala {METAYI ONAR} - metadata düzenlemelerini engelleyen bozuk metadata'yı onar {KEYWORD'LERİ YÖNET} - kullanıcı tanımlı keyword'leri yönet {BAŞLIKLAR} - görüntü köşesinde dosya adını, başlığı, açıklamayı göster {YERLER/TARİHLER} - görüntü konumlarını/tarihlerini listele, galeri için tıkla {ZAMAN ÇİZELGESİ} - yıl/ay bazında görüntü sayılarını göster, galeri için tıkla {METADATA TAG'LERİ} - tag değerine göre görüntü sayılarını göster, galeri için tıkla {OTOMATİK ARAMA} - dosyaları bulmak için betikli Arama işlevi {GÖRÜNTÜLERİ ARA} - herhangi bir metadata veya klasör/dosya adıyla ara - {SEÇ MENÜSÜ} {ALAN GENEL GÖRÜNÜMÜ} - alan seç - kavramlar ve kullanım {ALAN SEÇ} - ayrı düzenleme için görüntü özniteliği veya alanı seç {ALAN BOŞLUĞU BUL} - elle çizilen alan taslağındaki boşluğu bul {ALAN KARIŞTIRMA} - seçili bir alan içinde yapılan düzenlemeleri fareyle karıştır {ALANI GÖSTER/GİZLE} - alan taslaklarını göster veya gizle {ALANI ETKİNLEŞTİR/DEVRE DIŞI BIRAK} - düzenleme için bir alanı etkinleştir veya devre dışı bırak {ALANI TERSİNE ÇEVİR} - bir alanı tersine çevir (dış/iç alanları değiştir) {ALANI TEMİZLE} - bir alanı kaldır {ALANI KOPYALA/YAPIŞTIR} - bir alanı kopyala veya geçerli görüntüye yapıştır {ALANI YÜKLE/KAYDET} - bir alanı dosyadan yükle veya dosyaya kaydet - {GERİ AL/YİNELE DÜĞMESİ} - geçerli görüntüdeki düzenlemeleri sırayla geri al veya yinele - {DÜZENLE MENÜSÜ} {DÖNDÜR} - bir görüntüyü döndür veya düzelt {DÜZELT} - döndürülmüş veya aynalanmış bir görüntüyü düzelt {KIRP} - görüntü kenar boşluklarını kırp (kes) {RÖTUŞ} - parlaklığı, kontrastı, rengi, doygunluğu düzenle {YENİDEN ÖLÇEKLE} - görüntü piksel boyutlarını değiştir {BÖLÜNMÜŞ EKRAN} - bölünmüş ekran kullanarak önce/sonra değişikliklerini görüntüle {FARKLARI GÖSTER} - düzenleme sırasında (veya herhangi iki görüntü arasında) değişiklikleri vurgula {KENAR BOŞLUKLARI} - bir görüntüye herhangi bir renk veya saydamlıkta kenar boşlukları ekle {İŞARETLEME} - görüntü üzerine çiz: metin, çizgi/ok, kutu, oval {RENK MODU} - siyah beyaza, renkliye, negatife, pozitife dönüştür {BOYALI DÜZENLEMELER} - bir düzenleme işlevini yerel ve kademeli olarak fareyle boya {GÖRÜNTÜYÜ BOYA} - bir renk, fırça boyutu ve opaklıkla fareyle boya {SAYDAMLIĞI BOYA} - fareyi kullanarak saydamlığı artırarak boya {ALAN DOLDURMA} - seçili alanları veya saydam alanları bir renkle doldur {GÖRÜNTÜ İÇİNDE KOPYALA} - fareyi kullanarak bir görüntü içindeki pikselleri kopyala {GÖRÜNTÜDEN KOPYALA} - fareyi kullanarak başka bir görüntüden pikselleri kopyala {ÖNCEKİ DÜZENLEMEYİ KOPYALA} - fareyi kullanarak önceki düzenlemelerden pikselleri kopyala - {ONARIM MENÜSÜ} {KESKİNLEŞTİR} - bulanık bir görüntüyü çeşitli yöntemlerle keskinleştir {BULANIKLAŞTIRMA} - bir görüntüyü veya görüntü alanını çeşitli yöntemlerle bulanıklaştır {GÜRÜLTÜ GİDER} - görüntü gürültüsünü (küçük rastgele lekeler) azalt {SİS GİDER} - bir görüntüye veya seçili alana sis/pus ekle veya kaldır {KIRMIZI GÖZLER} - flaşlı fotoğraflardan kırmızı gözleri kaldır {AKILLI SİLME} - elektrik hatlarını, tabelaları, diğer küçük bozuk unsurları kaldır {HALEYİ GİDER} - keskinleştirme ve diğer işlevlerin bıraktığı haleleri kaldır {JPEG BOZULMALARI} - yüksek oranda sıkıştırılmış dosyalardaki bozulmaları bastır {KENAR YUMUŞATMA} - öznitelik kenarları boyunca pikselleşmeyi (tırtıkları) bastır {RGB AYARLA} - RGB veya CMY renklerini kullanarak görüntü renklerini ayarla {HSL AYARLA} - HSL renk modelini kullanarak renkleri seç ve değiştir {TOZU GİDER} - eski fotoğraflardan gelen görüntülerdeki toz lekelerini kaldır {SAÇAKLAR} - çevresel renk saçaklarını düzelt (kromatik sapma) - {İNCELTME MENÜSÜ} {HİSTOGRAMI DÜZLEŞTİR} - daha iyi ayrıntı için parlaklık histogramını düzleştir {YEREL KONTRAST} - yerel alan parlaklığına uyarlanmış kontrast ekle {KONTRASTI ARTIR} - ayrıntıları vurgulamak için mevcut kontrastı artır {GENEL RETİNEKS} - daha geniş aralık için RGB değerlerini yeniden ölçekle {YEREL RETİNEKS} - daha geniş aralık için RGB değerlerini yeniden ölçekle {DOYGUNLUK} - parlaklığa göre renk doygunluğunu ayarla {YUMUŞAK ODAK} - bir görüntüye klasik "yumuşak odak" efekti uygula {PARLAKLIK GEÇİŞİ} - görüntü boyunca bir parlaklık/renk geçişi ekle {VİNYET} - seçilen merkez etrafında radyal olarak parlaklığı/rengi değiştir - {EFEKTLER MENÜSÜ} {ANA HATLAR} - bir görüntüyü ana hat çizimine dönüştür {ESKİZ1} - bir görüntüyü simüle edilmiş bir eskize dönüştür (1) {ESKİZ2} - bir görüntüyü simüle edilmiş bir eskize dönüştür (2) {KARİKATÜR} - bir görüntüyü karikatür benzeri bir çizime dönüştür {KABARTMA} - bir görüntüyü simüle edilmiş bir kabartmaya dönüştür (3D efekt) {KAROLAR1} - bir görüntüyü 3D efektli kare karolara dönüştür {KAROLAR2} - bir görüntüyü görüntüye uyan düzensiz karolara dönüştür {BOYAMA} - bir görüntüyü simüle edilmiş bir tabloya dönüştür {DOKU} - bir görüntüye veya seçili alana doku ekle {FÜZYON} - keskinliği korurken ince ayrıntıları bastır {RENKLERİ EŞLEŞTİR} - bir görüntüdeki renkleri başka bir görüntüyle eşleştir {DESEN} - bir görüntüye arka plan deseni ekle {ÇAPRAZ TARAMA} - çapraz paralel çizgiler kullanarak bir eskize dönüştür {DITHER} - bir görüntüyü pikselleştirmenin veya posterize etmenin farklı yolları {OYMA} - bir görüntüyü siyah beyaz çizgilere dönüştür {PARLAMA EKLE} - parlak nesnelerin çevresine görüntüde parlama ekle {MOZAİK} - görüntüleri, görüntülerden yapılan karoları kullanarak bir mozaiğe dönüştür {GÜRÜLTÜ EKLE} - bir görüntüye rastgele gürültü ekle {RENKLERİ AYARLA} - renk sayısını azalt (posterize) {RENKLERİ KAYDIR} - RGB renklerini kademeli olarak GBR veya BRG'ye kaydır {UZAYLI RENKLER} - bir görüntüye rastgele garip renkler ekle {ÖZEL ÇEKİRDEK} - özel bir evrişim çekirdeğini düzenle ve uygula - {ÇARPITMA MENÜSÜ} {DÜZELT} - özellikle panoramalarda, kavisli çizgilere sahip görüntüleri düzleştir {PERSPEKTİF} - geniş açıdan çekilen bir nesneyi düzelt {ALANI ÇARPIT} - fareyle çekerek seçili bir görüntü alanını çarpıt {WARP LINEAR1} - fare sürüklemesiyle görüntüyü çarpıt - doğrusal 1 çarpıtma {WARP LINEAR2} - fare sürüklemesiyle görüntüyü çarpıt - doğrusal 2 çarpıtma {EĞRİSEL ÇARPIT} - fare sürüklemesiyle görüntüyü çarpıt - eğrisel çarpıtma {AFİN ÇARPIT} - fare sürüklemesiyle görüntüyü çarpıt - paralel çizgiler korunur {RADYAL ÇARPIT} - fıçı veya yastık bozulmasını ekle veya kaldır {YAKIN ÇEKİMİ DÜZELT} - yakın çekim yüz fotoğrafı bozulmasını kaldır (büyük burun) {DALGA OLUŞTUR} - bir görüntüyü dalga deseniyle çarpıt {BÜKME} - bir görüntüyü seçilen bir merkez nokta etrafında bük {KÜRE} - bir görüntüyü küresel bir şekle büker {İÇTEN DIŞA} - her pikselin merkez-kenar mesafesini tersine çevir {MİNİK GEZEGEN} - bir panorama görüntüsünü bir daire etrafına sar {ESCHER SARMALI} - bir görüntüyü sonsuz içe doğru bir sarmala dönüştür {FOTOĞRAFI DÜZLEŞTİR} - kavisli bir yüzeyin fotoğrafını düzleştir - {BİRLEŞTİR MENÜSÜ} {HDR} - genişletilmiş bir parlaklık aralığı için koyu/parlak görüntüleri birleştir {HDF} - genişletilmiş bir alan derinliği için yakın/uzak odaklı görüntüleri birleştir {YIĞIN/BOYAMA} - geçici arabaları, turistleri vb. kaldırmak için görüntüleri birleştir {YIĞIN/GÜRÜLTÜ} - ortalama alarak gürültüyü azaltmak için görüntüleri birleştir {YIĞIN/KATMANLAR} - görüntü sürümlerini birleştir, alan/sürüm seç/boya {PANORAMA} - bir dizi görüntüyü yatay olarak birleştir {CIM DOSYALARINI GÖSTER} - geçerli/en son birleştirilmiş görüntü için girdi dosyalarını göster {MASHUP} - görüntüleri ve biçimlendirilmiş metni özel bir düzende düzenle {GÖRÜNTÜ DİZİSİ} - birçok görüntüyü kompakt bir dizi biçiminde birleştir - {TOPLU MENÜ} {TOPLU DÖNÜŞTÜR} - kopyala, taşı, yeniden ölçekle, yeniden adlandır, dönüştür, metin ekle ... {TOPLU KOPYALA/TAŞI} - seçili görüntü dosyalarını yeni bir klasöre kopyala/taşı {TOPLU DÜZELTME} - döndürülmüş görüntü dosyalarını tara ve düzelt {TOPLU SİL/ÇÖPE AT} - seçili görüntü dosyalarını sil veya çöpe at {TOPLU KAPLAMA} - seçili görüntülere kaplama görüntüsü ekle (telif hakkı ...) {TOPLU KEYWORD} - seçili görüntü dosyaları için keyword ekle veya kaldır {TOPLU KEYWORD YENİDEN ADLANDIR} - tüm görüntü dosyaları için keyword'leri yeniden adlandır veya sil {TOPLU KEYWORD TEMİZLE} - tüm görüntü dosyalarından istenmeyen keyword'leri temizle {TOPLU FOTOĞRAF TARİHİ} - fotoğraf tarihlerini veya saatlerini değiştir ya da saat dilimini kaydır {TOPLU META DEĞİŞTİR} - seçili görüntü dosyaları için metadata ekle veya düzelt {TOPLU META RAPORU} - seçili veya tüm görüntü dosyaları için metadata'yı raporla {TOPLU GEOTAG} - seçili veya tüm görüntü dosyaları için geotag ekle veya düzelt {DOSYALARI DIŞA AKTAR} - seçili dosyaları bir klasöre dışa aktar (ör. web yüklemesi) - {ARAÇLAR MENÜSÜ} {DOSYALARI DİZİNLE} - tüm görüntü dosyalarını bulup dizinlemek için tek seferlik bir iş {FOTOCX ANA KLASÖRÜNÜ TAŞI} - Fotocx ana klasörünü taşı (kullanıcı verileri ve ayarları) {AYARLAR} - Fotocx çalışması için kullanıcı tercihleri ve ayarları {KLAVYE KISAYOLLARI} - menü işlevleri için klavye kısayollarını göster ve düzelt {RGB HİSTOGRAMI} - geçerli görüntü için parlaklık histogramı grafiği {GÖRÜNTÜYÜ BÜYÜT} - fareyi görüntü üzerinde bir büyüteç haline getir {GÖRÜNTÜYÜ ÖLÇ} - görüntü içindeki piksel mesafelerini ölç (fare tıklamalarıyla) {RGB GÖSTER} - fare konumundaki veya seçili noktalar için RGB değerlerini göster {IZGARA AYARLARI} - ızgara çizgilerini göster veya kaldır, çizgi sayısını veya aralığını ayarla {ÇİZGİ RENGİ} - alan seçme taslakları için renk ayarla {KOYU/PARLAK PİKSELLER} - kırpılmayı vurgulama aracı {MONİTÖR RENGİ} - monitör parlaklığını ve kontrastını ayarla {YİNELENENLERİ BUL} - bir galeride veya tüm görüntülerde yinelenen görüntüleri bul {HATALI DOSYALARI BUL} - okunamayan görüntü dosyalarını bul, sil/taşı/onar {KAYNAKLARI GÖSTER} - CPU süresini ve geçerli bellek kullanımını göster {ÇEVİRİLER} - GUI çevirilerini oluştur veya değiştir - {YARDIM MENÜSÜ} - kullanıcı kılavuzu, öğretici, değişiklik günlüğü, Fotocx hakkında, kaldır - {DİĞER KONULAR} {VIDEO FILES} - video dosyaları, thumbnail'ler, video oynatma {SLAYTLAR VE NEGATİFLER} - slayt ve film negatiflerinin nasıl çekileceği {FOTOCX SINIRLAMALARI} - boyut ve performans sınırları {WINDOWS 11 İÇİN FOTOCX} - Fotocx'i Windows 11 WSL üzerine kurma {GİZLİLİK} - Fotocx gizlilik ve veri koruma politikası {PROBLEM, QUESTION, SUGGESTION} - Fotocx yazarıyla iletişime geç - - TOPIC: FOTOCX KULLANIMI - - TOPIC: İLK BAŞLATMA - ^Harici Programlar Fotocx, gerekli ve isteğe bağlı harici programları ve her birinin sağladığı işlevi bildirir. Gerekli programlardan herhangi biri eksikse, kurun ve Fotocx'i yeniden başlatın. - ^İlk Dizinleme Fotocx görüntü dosyalarınızı dizinleyecektir. Bu, galeri sayfalarının (thumbnail'lerin) hızlı görüntülenmesini sağlar, dizinlenmiş metadata'ya dayalı hızlı aramayı etkinleştirir ve görüntüleri konuma göre görüntülemek için tıklanabilir harita işaretçilerini etkinleştirir. Bir veya daha fazla 'üst' görüntü klasörü girmelisiniz (ör. /home//Pictures). Alt klasörler otomatik olarak dahil edilir. Bu klasörlerdeki görüntü olmayan dosyalar yok sayılır. Üst görüntü klasörlerinizi bulup eklemek için [select] düğmesini kullanın. Pratik bir sınır yaklaşık 30 Üst klasördür. Her birinin yüzlerce alt klasörü olabilir. - ^Thumbnail'ler Bu, thumbnail dosyalarının yerleştirileceği klasördür. Sağlanan varsayılanı kullanın veya başka bir konum seçin. - ^Dizinleme Süresi Dizinleme hızı, görüntü dosyalarınızın türüne ve boyutuna ve bilgisayarınızın hızına bağlı olarak dakikada birkaç yüzden 10 binin üzerine kadar değişebilir. Koleksiyonunuza yeni görüntü dosyaları eklediğinizde, bir sonraki Fotocx başlatmasında yeni dosyalar dizinlenir. Çok sayıda yeni dosya varsa, başlatma işlemi bunları dizinlemek için zaman gerektirecektir. - ^Görüntü başlığı ve açıklamasının birleştirilmesi Fotocx görüntü dizinleme işlevi, eksik başlık ve açıklama metadata'sını, mevcutsa şu alternatif metadata tag'lerinden biriyle değiştirir: headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. Bu, her zaman yalnızca 'title' ve 'description' kullanarak görüntüleme/düzenleme/arama yapabilmeniz için yapılır. Bu dönüştürme işlemi nispeten yavaştır (güçlü bilgisayarımda dakikada 2200 dosya). Bu, yeni görüntü dosyaları ilk kez dizinlendiğinde yapılır. Hiçbir şey silinmez. - - TOPIC: KULLANICI KILAVUZU Kullanıcı kılavuzunu Yardım > Kullanıcı Kılavuzu menüsünden açın. Fotocx'i kullanırken, geçerli veya en son kullanılan menü işlevi için Kullanıcı Kılavuzu konusunu görüntülemek üzere F1'e basabilirsiniz. - Metni kaydırmak için yukarı/aşağı ok tuşlarını ve sayfa yukarı/aşağı tuşlarını kullanın. [Bul] düğmesi bir metin arama iletişim kutusu açar. Bir sonraki eşleşme için [Bul]'a tekrar basın. - Kalın büyük harfli metin, bir konuya tıklanabilir bir bağlantıdır, ör. {DOSYALARI DİZİNLE}. Son görüntülenen konular arasında ileri geri gitmek için [<] ve [>] düğmelerini kullanın. [Recent] düğmesi, son görüntülenen konuların tıklanabilir bir listesini sunar. - - TOPIC: PENCERE GÖRÜNÜMLERİ VE MENÜLERİ +image: fotocx-views.jpg - ^Menü Düğmeleri Bir menüye tıklandığında, açılır bir alt menü görünür. Üstteki üç menü (Dosya, Galeri, Haritalar) ilgili görünüm modunu ayarlar. F/G/M tuşları da kullanılabilir. - - TOPIC: DOSYA GÖRÜNÜMÜ Tek bir görüntü, tüm Fotocx penceresini doldurur. Sol/sağ fare tıklamasıyla yakınlaştırıp uzaklaştırın. Z tuşu, pencereye sığdırma ile 1x görüntü boyutu (1 görüntü pikseli = 1 ekran pikseli) arasında geçiş yapar. Yakınlaştırılmış bir görüntüyü kaydırmak için fareyi görüntü üzerinde sol sürükleyin. Fare tekerleği de bir görüntüyü yakınlaştırıp uzaklaştırabilir. Görüntüyü değiştirmek için menü düğmelerini (Düzenle, Onar, vb.) kullanın. Değiştirilmiş bir dosyayı kaydetmek için Dosya Kaydet düğmesini kullanın: değiştir, yeni bir sürüm oluştur veya yeni bir dosya oluştur (yeni ad). - ^Klavye sol/sağ ok tuşları Geçerli galerideki önceki veya sonraki görüntü dosyasını görüntüle. - ^yukarı/aşağı ok tuşları Yukarıdaki gibi, ancak yalnızca son sürümler gösterilir veya sürüm yoksa orijinal gösterilir. - - TOPIC: GALERİ GÖRÜNÜMÜ Geçerli galerideki tüm görüntü dosyaları bir thumbnail dizisi olarak gösterilir. - ^Galeri Türleri • Klasör: tek bir klasördeki (dizindeki) tüm görüntü dosyaları ve alt klasörler • Albüm: kullanıcı tarafından düzenlenmiş, çeşitli klasörlerden görüntü dosyaları • Son Dosyalar: en son görüntülenen veya düzenlenen görüntü dosyaları • En Yeni Dosyalar: en son eklenen veya değiştirilen görüntü dosyaları • Arama Sonuçları: Arama işlevi tarafından bulunan görüntüler. Aynı zamanda bir albüm. - ^Galeri İşlevleri • görüntü thumbnail'ine sol tıklama: görüntüyü Dosya Görünümü modunda aç • görüntü thumbnail'ine sağ tıklama: yaygın işlevlerin açılır menüsü • klasör thumbnail'ine tıklama: o klasörü Galeri modunda aç • klasör galerisinin ÜST çubuğu: üst klasörler - oraya gitmek için tıklayın • [TOP] düğmesi: üst düzey klasörlerin listesi - oraya gitmek için tıklayın • kaydırma çubukları: galeri içinde yukarı/aşağı kaydır • yukarı/aşağı ok tuşları: galeriyi bir satır kaydır • sayfa yukarı/aşağı tuşları: galeriyi bir sayfa kaydır • home/end tuşları: galerinin başına (üst) ve sonuna (alt) git • fare tekerleği: galeriyi yukarı ve aşağı kaydır • [+] ve [-] tuşları: thumbnail boyutunu artır/azalt - ^Galeri Açılır Görüntüleri • Açılır görüntü için thumbnail'e orta fare düğmesiyle tıklayın • Açılır görüntü için thumbnail'e shift + sol fare ile tıklayın • Açılır görüntüye sol tıklama: görüntüyü daha büyük yakınlaştırır • Açılır görüntüye sağ tıklama: açılır görüntüyü kapatır • Fare kaydırma tekerleği: açılır görüntüyü büyütür veya küçültür • F11 tuşu: açılır görüntüyü tam ekran yapar • Escape tuşu: açılır görüntüyü kapatır • Görüntüleri karşılaştırmak için birden çok açılır görüntü kullanılabilir - - TOPIC: HARİTA GÖRÜNÜMÜ Görüntü konumlarına karşılık gelen işaretçiler içeren haritaları görüntüleyin. İlgili görüntülerin galerisi için bir işaretçiye tıklayın. Bu, görüntü dosyalarınızın gömülü coğrafi koordinatlara (latitude, longitude) sahip olmasına bağlıdır. Modern kameralar bunu otomatik olarak ekler ve bu veriyi kendiniz de ekleyebilirsiniz. Başlangıçta bir dünya haritası görüntülenir. Herhangi bir konumda yakınlaştırmak/uzaklaştırmak için fare tekerleğini kullanın. Harita merkezini kaydırmak için sürükleyin. Tüm dünya, sokak seviyesine kadar herhangi bir ölçekte görüntülenebilir. - - TOPIC: SÜRÜKLE VE BIRAK İki Fotocx oturumu açarsanız, dosyaları birinden diğerine sürükleyip bırakabilirsiniz. Bir galeri thumbnail'ini bir pencereden diğerine sürükleyin. Dosya Görünümü ise, dosya açılır. Galeri Görünümü ise, sonuç galeri türüne bağlıdır. Galeri bir klasörse, dosya klasöre eklenir ve galeri yeni dosyayı sıralı konumunda gösterir. Galeri bir albümse, dosya bırakıldığı konumda albüme eklenir. - - TOPIC: PROSEDÜRLERİ DÜZENLE Dosya Görünümü modundaki görüntü (geçerli görüntü), Düzenle, Onar, İncelt, Efektler, Çarpıtma ve Birleştir menülerindeki düzenleme işlevleriyle değiştirilebilir. Bu işlevler geçerli görüntüyü bellekte ve pencerede değiştirir. Bu işlevleri kullandıkça düzenlemeler birikir. Düzenlemeyi bitirdiğinizde, değiştirilmiş görüntüyü aynı dosyaya, yeni bir sürüme (ör. dosyaadı.v01.jpg) veya yeni bir dosyaya ve/veya klasöre kaydetmek için [Kaydet] menü düğmesini kullanın. Görüntü düzenleme iletişim kutularında, görüntüyü anında güncelleyen kaydırıcılar, düğmeler, döndürme düğmeleri veya düzenlenebilir eğriler bulunur. - Geçerli olarak etkin düzenleme işlevini geri almak veya yinelemek için Geri Al/Yinele düğmesine sol veya sağ tıklayın. Bir görüntüye bir veya daha fazla düzenleme uygulandıktan sonra, her adımdan sonraki görüntü durumunu görüntülemek üzere tamamlanan tüm adımlar arasında ileri geri gitmek için geri al/yinele düğmesi kullanılabilir. Orta fare düğmesi, geçerli görüntüye yapılan tüm düzenlemelerin açılır bir listesini gösterir ve geri dönmek için herhangi bir adımı seçebilirsiniz. Görüntü, herhangi bir önceki adımdan yeniden düzenlenebilir. Bu, o adımdan türetildikleri için o adımdan sonra yapılan düzenlemeleri atacaktır. Bu geri al/yinele yeteneği, düzenlenen görüntü geçerli görüntü olarak kaldığı sürece devam eder. Başka bir görüntü açılırsa, düzenleme geçmişi atılır. Geçerli görüntü durumuna dönme olasılığını korumak istiyorsanız, başka bir düzenlemeye devam etmeden önce görüntüyü yeni bir sürüm olarak kaydedin. - - TOPIC: İŞ AKIŞINI DÜZENLE - ^Basit İş Akışı Çoğu zaman, kameradan çıkan JPEG dosyasını doğrudan düzenleyebilirsiniz. Aşağıdaki daha karmaşık prosedürü, yalnızca bazı görüntü alanlarında parlaklık aralığını genişleten düzenlemelerden sonra renk bantları görüyorsanız kullanın; bu, parlaklık adımlarını görülebilecek kadar büyütür. - ^Karmaşık İş Akışı Derin renkle (RGB rengi başına 8 bitten fazla) düzenlemek için kamera RAW dosyasıyla başlayın. Bir RAW dosyası, diğer herhangi bir görüntü dosyası gibi düzenlenebilir. Fotocx düzenleme işlevleri renk başına 24 bit ile çalışır, böylece RAW dosyasının tam renk derinliği korunur. Bir RAW dosyası açtığınızda, seçilen RAW yükleyici kullanılır - bkz. {AYARLAR}. Birden çok RAW dosyasını renk başına 16 bit ile TIFF, PNG veya JXL dosyalarına dönüştürmek için Toplu Dönüştür'ü de kullanabilirsiniz. - Dcraw, varsayılan RAW dosyası yükleyicisidir. Rawtherapee gibi daha karmaşık bir RAW düzenleyici de kullanabilirsiniz - bkz. {AYARLAR}. Dcraw karşılaştırıldığında basit ve hızlıdır. Bir RAW düzenleyicideki düzenleme işlevleri genellikle Fotocx ile daha kolay yapılabilir. - - TOPIC: FARE SAHİPLİĞİ Bazı düzenleme iletişim kutuları, ana penceredeki görüntüye başvurmak veya onu değiştirmek için fareyi kullanır. Aynı anda birden fazla böyle etkin iletişim kutusu olabilir. Fare aynı zamanda görüntüyü yakınlaştırmak ve kaydırmak için de kullanılır ve bir düzenleme iletişim kutusunu kullanırken bunu yapmanız gerekebilir. Bu nedenle, hangi iletişim kutusunun veya pencerenin fareye sahip olduğunu ve sahipliğin nasıl değiştirileceğini anlamak önemlidir: • Bir iletişim kutusu klavye odağına sahipse, görüntü üzerindeki fare eylemleri bu iletişim kutusuna girdi olur ve görüntüyü yakınlaştırmaz veya kaydırmaz. • Görüntü üzerinde fareyi tıklarken veya sürüklerken CTRL tuşunu basılı tutarsanız, görüntü yakınlaştırılır veya kaydırılır. Açık iletişim kutuları etkilenmez. • Fare tekerleği herhangi bir görüntü konumunda yakınlaştırıp uzaklaştırabilir. - - TOPIC: FARE ALT-SAĞ-DÜĞME Dokunmatik yüzeyler veya dokunmatik ekranlar için sağ fare tıklamaları beceriksiz olabilir. Sol fare düğmesine basarken ALT tuşu basılı tutulursa, bu sağ fare düğmesi olarak yorumlanır. - - TOPIC: İLETİŞİM KUTUSU DÜĞMELERİ Bunlar çoğunlukla şu şekilde çalışır: • [Sıfırla] - geçerli düzenlemeyi geri al, görüntüyü başlangıç durumuna döndür • [Uygula] - iletişim kutusu ayarlarını görüntüye uygula, iletişim kutusunu etkin bırak • [OK] - [Uygula] ile aynı, ancak iletişim kutusu kapatılır • [İptal] - görüntü değişikliklerini at ve iletişim kutusunu kapat • [Devam Et] - iletişim kutusu girdilerine dayalı uzun süreli göreve devam et • [X] - herhangi bir işlem yapmadan iletişim kutusunu kapat - - TOPIC: KLAVYE ESCAPE TUŞU Ana pencere odaktaysa: • uzun süredir çalışan bir işlev hâlâ çalışıyorsa, sonlandır • ana pencere büyütülmüşse, önceki boyuta geri döndür • geçerli görünüm galeri veya harita ise, dosya görünümüne geç • yukarıdakilerin hiçbiri değilse: Fotocx'ten çık İletişim kutusu penceresi odaktaysa: iletişim kutusunu kapat ([X] düğmesiyle aynı) Diğerleri: açılır görüntüyü iptal et, 360 panorama görüntüleyiciden çık, Slayt Gösterisini duraklat veya bitir. - - TOPIC: STANDART DIŞI İLETİŞİM KUTUSU BİLEŞENLERİ +image: custom-widgets.png - İletişim kutusu boyutunu azaltmak veya kullanım kolaylığını artırmak için bazı standart dışı bileşenler kullanılır. Bunlar neredeyse standart GTK bileşenleri gibi çalışır. Sayısal veri bileşeni bir GTK spin-button gibi çalışır: fare tekerleği ve klavye yukarı/aşağı ok tuşları değeri hızla yukarı veya aşağı çalıştırmak için kullanılabilir. Bir dokunmatik yüzey kullanıyorsanız, imleci konumlandırmak için girişe dokunun, ardından bir değer girmek için klavyeyi kullanın veya hızla yeni bir değere gitmek için klavye yukarı/aşağı ok tuşlarını kullanın. Tuş basılı tutulursa, değişim hızı zamanla artar. Shift tuşu hızı 10 kat artırmak için kullanılabilir. Doğrusal olmayan bir kaydırıcı, ölçeği nötr değer etrafında genişletir; böylece özellikle bir dokunmatik yüzeyle küçük değişiklikler daha hassas bir şekilde kontrol edilebilir. Birkaç standart GTK bileşeni, fazla dolgu kaldırılarak boyut olarak küçültülmüştür. Bu, Fotocx ana klasöründeki 'widgets.css' dosyası tarafından kontrol edilir. İsterseniz bu dosyayı değiştirebilirsiniz. Öğeleri silebilir veya yorum olarak işaretleyebilirsiniz, ancak dosyayı silmeyin - otomatik olarak değiştirilir. - - TOPIC: EĞRİ DÜZENLEME +image: retouch.png - Bazı görüntü düzenleme işlevleri düzenlenebilir eğriler kullanır. Bazı diğer özelliğe bağlı olarak görüntünün bir özelliğini değiştirmek için eğrileri değiştirebilirsiniz. Eğriler fareyle taşınabilir (çekilebilir). Eğri her çekildiğinde eğriye bir çapa noktası (siyah nokta) eklenir ve bu nokta sabit kalır - eğrinin diğer bölümleri çekilirken eğri bu noktadan geçmeye devam eder. Bir çapa noktası sürüklenerek taşınabilir veya sağ tıklanarak silinebilir. - - TOPIC: MOUSE PAINTING Fare, bir görüntüyü yerel olarak düzenlemek için kullanılabilir. Fare konumu etrafındaki bir daire, fare görüntü üzerinde sol sürüklenirken değiştirilen bir görüntü alanını çevreler. Değişikliğin kaynağı bir düzenleme işlevi, seçilen bir renk veya aynı görüntünün başka bir yerinden ya da başka bir görüntüden gelen pikseller olabilir. Fare dairesinin içindeki görüntü pikselleri kaynakla eşleşecek şekilde değiştirilir. Değişim hızı, fare merkezi ve kenarı için güç faktörlerine bağlı olarak hızlı veya kademeli olabilir. Merkez faktörü yüksek ve kenar faktörü düşükse, görüntü fare merkezinde daha hızlı ve merkezden kenara doğru giderek daha az değiştirilir. Pikseller kaynak renk veya görüntüyle tam olarak eşleşene ya da kaynak düzenleme işlevi tam olarak uygulanana kadar değişiklikleri biriktirmek için fareyi aynı görüntü alanı üzerinde tekrar tekrar sol sürükleyin. Değişiklikleri kademeli olarak geri alıp orijinal görüntüyü geri yüklemek için sağ sürükleyin. - Örnek: düzenleme işlevi Rötuş ise ve parlaklık artırılıyorsa, fare sol sürüklendiğinde görüntü fare alanı içinde parlaklaşır. Orijinal görüntüyü kademeli olarak geri yüklemek için sağ sürüklemeyi kullanın. - [undo-last] düğmesi son boyama veya silme işlemini tersine çevirir ve bu, birçok son düzenlemeyi kaldırmak için tekrarlanabilir. Her yeni fare sürükleme işlemi, ayrı ayrı geri alınabilen bir iş birimidir. Geri alma için ayrılan bellek sınırlıdır, bu yüzden yalnızca son boyama ve silme adımları saklanır. [undo all] görüntüyü ilk durumuna geri döndürür. - Düzenlemeler sırasındaki değişiklikleri denetlemek için [undo/redo] düğmesini kullanın. - Bir {ALAN SEÇ} etkinse, boyama alanla sınırlıdır. - NOT: Çok küçük bir yarıçap kullanırken (ör. görüntü üzerine çizgi çizerken) görüntüyü %100 veya daha fazla yakınlaştırın. Fare hareket adımları ekran pikselleri cinsindendir. Bu, birçok görüntü pikselini kapsıyorsa ve küçük bir yarıçap kullanılıyorsa, fare tarafından bazı pikseller atlanabilir ve işlenmeyebilir. - - TOPIC: TOPLU İŞLEM Bazı yaygın görevleri hızlandırmak için {TOPLU MENÜ} içinde birkaç toplu işlev bulunur. Birçok görüntü dosyası seçebilir ve toplu işlevi hepsi için çalıştırabilirsiniz. Toplu işlevler, dosya adını veya türünü değiştirmek, düzeltmek, yeniden ölçeklemek, kopyalamak veya taşımak, silmek, tag'leri, keyword'leri, konum/coğrafi koordinatları, fotoğraf tarihlerini düzeltmek için kullanılabilir. - - TOPIC: GÖRÜNTÜ DOSYALARINI SEÇ +image: select-image-files.jpg - Bu prosedür, birden çok görüntü dosyası üzerinde çalışan tüm işlevler için kullanılır. Prosedür burada açıklanmıştır ve bu konu, prosedürü kullanan her işlevden bağlantılıdır. • thumbnail'e sol tıklama: seçim listesine ekle • sağ tıklama: kaldır • birden fazla ekleme: ilk thumbnail'e tıklayın, son thumbnail'e shift ile tıklayın • [Tümünü Ekle] düğmesi: tüm galeriyi ekle • [Geçerli Olanı Ekle] düğmesi: geçerli dosyayı ekle • bir dosya listeye birden çok kez eklenebilir • gerektiğinde daha fazla dosya seçmek için başka galerilere gidin • [Kaldır] düğmesi: seçili liste konumunu kaldır • [Temizle] düğmesi: tüm listeyi temizle • yukarı/aşağı ok tuşları: liste boyunca ilerle, thumbnail'leri görüntüle • home/end tuşları: listenin başına/sonuna git - [Devre Dışı Bırak] düğmesi, dosya seçmek için thumbnail tıklamasını devre dışı bırakır. Düğme daha sonra [Etkinleştir] olarak yeniden adlandırılır - thumbnail tıklamasını geri yüklemek için basın. Bunun amacı, normal thumbnail açılır menülerini ve bir dosyayı tam boyutta görüntülemek için sol tıklamayı etkinleştirmektir; bu, thumbnail tıklamaları dosya seçimi için kullanılıyorsa mümkün değildir. Seçimlere karar verirken buna ihtiyacınız olabilir. Ayrıca dosya görünümü modunda kalıp ok tuşlarını kullanarak görüntüler arasında ilerleyebilir, dosyaları seçim listesine eklemek için [Geçerli Olanı Ekle] düğmesini kullanabilirsiniz. - - TOPIC: KISAYOLLAR Sık kullanılan işlevler için üç kısayol yöntemi vardır: • Ana pencereye veya galeri thumbnail'ine sağ tıklayın. Açılır bir menü bazı yaygın kullanılan işlevleri gösterir. • Kısayol tuşlarını değiştirebilir ve yeni kısayollar ekleyebilirsiniz. Bkz. {KLAVYE KISAYOLLARI}. • Sık kullanılan işlevleri özel bir menüde toplayın. Bkz. {ÖZEL MENÜ}. - En yaygın işlevler için klavye kısayolları mevcuttur. Bunları görüntülemek veya değiştirmek için Araçlar > Klavye Kısayolları menüsünü kullanın. - Aşağıdaki klavye kısayolları sabittir ve değiştirilemez: • [+] [=] tuşu: Görüntüyü veya thumbnail'leri büyüterek yakınlaştır • [-] tuşu: Görüntüyü veya thumbnail'leri küçülterek uzaklaştır • Z tuşu: Yakınlaştırmayı aç/kapat: 1x <--> pencereye sığdır • F1 tuşu: Geçerli işlev için kullanıcı kılavuzunu görüntüle • F10 tuşu: Ana pencereyi tam ekran yap ve geri al • F11 tuşu: F10 gibi, ancak menüler, başlık çubuğu, üst panel olmadan • Escape tuşu: Çalışan işlevi sonlandır, etkin iletişim kutusundan çık • Delete tuşu: Geçerli dosyayı silmek veya çöpe atmak için iletişim kutusu • Sol/Sağ Ok: Galeride önceki/sonraki görüntüyü göster • Yukarı/Aşağı Ok: Aynısı, ancak yalnızca son sürümleri göster • Page Up/Down: Galeri görünümü: bir sayfa yukarı/aşağı kaydır • Home/End: Galeri görünümü: ilk/son galeri sayfasına git - Aşağıdaki klavye kısayolları, kullanıcı tarafından değiştirilebilen varsayılanlardır: • F: Dosya Görünümü - dosya görünümü moduna geç • G: Galeri Görünümü - galeri görünümü moduna geç • M: Harita Görünümü - harita görünümü moduna geç • 2: 2 Dosya Döngüsü - en son iki dosyayı sırayla göster • 3: 3 Dosya Döngüsü - en son üç dosyayı sırayla göster • A: Geçerli Albüm - en son görüntülenen albümü göster • T: Rötuş - Rötuş düzenleme işlevini başlat • C: Kırp - Kırp düzenleme işlevini başlat • K: Klavye Kısayolları - klavye kısayolları iletişim kutusunu başlat • P: Görüntüyü Yazdır - görüntü yazdırma iletişim kutusunu aç • R: Döndür - döndürme düzenleme işlevini başlat • U: Geri Al - geçerli düzenlemeyi veya bir dizideki sonuncuyu geri al • Shift+U: Yinele - geçerli düzenlemeyi veya bir dizideki sonrakini yinele • Ctrl+C: Panoya Kopyala - geçerli dosyayı panoya kopyala • Shift+C: Başlıkları Aç/Kapat - başlıkları göster/gizle arasında geçiş yap • Ctrl+G: Geçerli dosya için klasör galerisini göster • Shift+G: Izgarayı Aç/Kapat - ızgara çizgilerini aç/kapat • Ctrl+S: Kaydet - dosya kaydetme iletişim kutusunu başlat - - TOPIC: FARE İŞLEVLERİ - ^Dosya Görünümü • sol tık - Yakınlaştır: görüntüyü fareyi merkez alarak büyüt • sağ tık - Görüntü yakınlaştırılmışsa: pencere boyutuna geri döndür Değilse, yaygın işlevlerin açılır menüsü • fare tekerleği - Görüntüyü yakınlaştır veya uzaklaştır • görüntüyü sol sürükle - Yakınlaştırılmış görüntüyü kaydır • Ctrl + fare - Fare etkin iletişim kutusu üzerinde değil, görüntü üzerinde etki eder - ^Galeri Görünümü • thumbnail'e sol tık - Dosya Görünümüne geç • thumbnail'e sağ tık - Yaygın işlevlerin açılır menüsünü göster • thumbnail'e orta tık - Büyük görüntüyü açılır pencerede göster, fare tekerleğiyle yakınlaştır • fare tekerleği - Galeri sayfasını yukarı veya aşağı kaydır - ^Harita Görünümü • sol sürükle - Haritayı fareyi takip ederek sürükle • fare tekerleği - Haritayı büyüt veya küçült • işaretçiye sol tık - Konumdaki görüntülerin galerisini göster • metadata düzenleme iletişim kutusu etkinse, sol tık coğrafi koordinatları ayarlar - - TOPIC: KOMUT PARAMETRELERİ Fotocx bir terminalden başlatılırsa bu parametreler kullanılabilir. -help kullanıcı kılavuzunu göster -home /klasör alternatif Fotocx ana konumu (aşağıya bakın) -lang xx dili 2 karakterli koddan ayarla -recent son görüntü dosyalarının galerisini göster -new en yeni görüntü dosyalarının galerisini göster -album albümadı açılacak albüm (galeri) -prev önceki oturumda görüntülenen son dosyayı göster -blank boş bir pencere göster -dev normalde gizli olan geliştirici menüsünü göster -menu menüadı Fotocx bu menü etkinken başlayacaktır -cwp nnn ad duvar kağıdını döngüye al (aşağıya bakın) -x0 -x1 -x2 dizin seviyesini 0, 1 veya 2 olarak ayarla (aşağıya bakın) - ^-x0 -x1 -x2 parametresi^ (başlatmada dizin seviyesini ayarla) Bu parametreler {AYARLAR} değerini geçersiz kılmak için kullanılabilir -x0 çok hızlı başlatma, görüntü dizini yok -x1 hızlı başlatma, yalnızca eski dosyaları dizinle -x2 eski dosyalar + yeni/değiştirilmiş dosyaları ara - ^-home^ parametresi (alternatif Fotocx ana klasörü) Varsayılan Fotocx ana klasörü: /home//.fotocx. Kullanıcı ayarları ve görüntü dizini burada tutulur. "$ fotocx -home " komutu belirtilen klasörü kullanır. Bu, birden çok görüntü koleksiyonunun ayrı ayrı yönetilmesini sağlar. Ayrıca bkz. {FOTOCX ANA KLASÖRÜNÜ TAŞI}. - ^-cwp^ parametresi (masaüstü duvar kağıdını döngüye al) Tam komut satırı: $ fotocx -cwp saniye kapsayıcı Bu komutu, seçili bir kümeden masaüstü görüntüsünü döngüye almak için kullanın. 'saniye', görüntüler arasındaki aralıktır. 'kapsayıcı', bir Fotocx albüm adı veya görüntü dosyaları içeren bir klasördür. Belirtilen aralıklarla yeni bir duvar kağıdı almak için bu komutu oturum açma başlangıç listenize ekleyin. Her oturum açışta yeni bir duvar kağıdı görüntüsü almak için bir gün veya daha uzun bir aralık kullanın. Fotocx, GUI olmadan arka planda çalışır. 'saniye' sıfırsa, bir duvar kağıdı güncellemesi yapılır ve ardından Fotocx çıkar. Her Linux türünün farklı bir komutu vardır. Teorik olarak şunlar kapsanır: Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: DOSYA MENÜSÜ - - TOPIC: YENİ OTURUM Yeni bir pencerede yeni bir Fotocx oturumu başlatın. Bir görüntü dosyası her iki pencerede de düzenlenirse, hiçbir örnek diğerinin yaptığı değişiklikleri görmez ve nihai sonuç en son kaydedilen dosya olur. - - TOPIC: GÖRÜNTÜ DOSYASI AÇ Klasörler ve dosya listeleriyle geleneksel bir dosya açma iletişim kutusu kullanarak görüntülemek veya düzenlemek üzere bir görüntü dosyası seçin. Bu, dosyaların dizinlenmediği ve galeri görüntülemenin çok yavaş olduğu durumlarda, ör. binlerce görüntü dosyası içeren bir kamera SD kartından okurken kullanışlıdır. - - TOPIC: 2 DOSYA DÖNGÜSÜ Bu menüyü tekrarlamak, en son açılan iki dosya arasında geçiş yapar. Bu işlev, geçerli görüntü yakınlaştırma boyutunu ve konumunu korur, bu da aynı görüntü dosyasının iki düzenlenmiş sürümünü hızlıca karşılaştırmak için idealdir. - - TOPIC: 3 DOSYA DÖNGÜSÜ Bu, 2 Dosya Döngüsü ile aynı şekilde çalışır, ancak son açılan 3 dosya arasında geçiş yapar. - - TOPIC: 360° PANO GÖRÜNTÜLE Geçerli dosya, 360° panorama dosyaları için özel bir görüntüleyiciyle açılır. Görüntü genişliğinin 360° olduğu varsayılır. Bu işlevi Google 'photosphere' görüntülerini görüntülemek için kullanın. Görüntüyü fare sürüklemesi veya sol/sağ ok tuşlarıyla kaydırın. Sol/sağ fare tıklamasıyla yakınlaştırın. Özel görüntüleyiciden çıkmak için Escape'i kullanın. - - TOPIC: YENİDEN ADLANDIR Geçerli dosyayı (Dosya Görünümü) veya tıklanan bir thumbnail'in dosyasını (Galeri Görünümü) yeniden adlandırın. Yeni bir ad girin ve [uygula]'ya basın. Bu işlev ayrıca, bir kök ad ve bir sıra numarası kullanarak bir dizi görüntü dosyasını yeniden adlandırma işlemini otomatikleştirebilir. Dizideki ilk görüntü dosyasını açın, yeni bir ad girin ve [uygula] düğmesine basın. İstenirse bir sonraki dosyaya geçmek için [next] düğmesini kullanın. [önceki ad] düğmesine basıp ardından bir ek veya sıra numarası ekleyerek aynı adı tekrar kullanabilirsiniz. Sıra numarasını artırmak için [add 1] düğmesine basın. - - TOPIC: BOŞ GÖRÜNTÜ Belirtilen piksel boyutlarında ve renkte boş bir görüntü oluşturun. Bu, başka görüntülerden alınan kesitler ({ALAN SEÇ} yoluyla) ve açıklama metni ({İŞARETLEME} metin çizme) için bir arka plan olarak kullanılabilir. - - TOPIC: KOPYALA/TAŞI Geçerli dosya (Dosya Görünümü) veya tıklanan bir thumbnail'in dosyası (Galeri Görünümü) verilen konuma kopyalanır. Dosyayı kopyalamak ve kaynak dosyayı yerinde bırakmak için kopyalama seçeneğini seçin, bu bir kopya oluşturur. Dosyayı orijinal konumdan yeni konuma taşımak için taşıma seçeneğini seçin. Her thumbnail'e tıklayıp ardından [uygula] ile bir grup dosya hızlıca işlenebilir. [Önceki] düğmesi, daha önce kullanılan dosya adını kopyalamak için kullanılabilir. Yinelenen bir dosyadan kaçınmak için bir sürüm numarası veya başka bir şey ekleyin. - - TOPIC: MASAÜSTÜNE KOPYALA Geçerli dosya (Dosya Görünümü) veya tıklanan bir thumbnail'in dosyası (Galeri Görünümü) masaüstü klasörüne (/home//Desktop) kopyalanır. - - TOPIC: PANOYA KOPYALA Geçerli dosya (Dosya Görünümü) veya tıklanan bir thumbnail'in dosyası (Galeri Görünümü) panoya kopyalanır, buradan diğer uygulamalar yapıştırabilir. - - TOPIC: SİL/ÇÖPE AT Geçerli dosya (Dosya Görünümü) veya tıklanan bir thumbnail'in dosyası (Galeri Görünümü), seçilen seçeneğe bağlı olarak silinir veya çöpe taşınır. Fotocx, çöp için standart konumu varsayar (~/.local/share/Trash). - - TOPIC: DUVAR KAĞIDINI AYARLA Masaüstü duvar kağıdı geçerli görüntü dosyasından ayarlanır. - - TOPIC: GÖRÜNTÜYÜ YAZDIR Görüntüyü yazdır menüsü, bir yazıcı, kağıt boyutu ve yönlendirme seçebileceğiniz standart bir Sayfa Ayarı iletişim kutusu açar. [uygula] düğmesini kullandıktan sonra, kağıt kenar boşluklarını ve görüntü ölçeğini girmek için başka bir iletişim kutusu başlar. - Görüntünün seçili alan(lar)ı varsa, yalnızca alan(lar)ın yazdırılıp yazdırılmayacağı sorulur. Bunlar, alanları çevrelemek için gereken minimum dikdörtgen kullanılarak yazdırılır ve seçimlerin dışındaki alanlar yazdırılmaz. - - TOPIC: KALİBRELİ YAZDIR Bu işlev, yukarıda açıklanan Görüntü Dosyasını Yazdır gibi çalışır, ancak yazdırmadan önce, görüntü renklerini ayarlamak için kullanılan bir kalibrasyon dosyası sağlamanız istenir. Amaç, yazıcı ve kağıt türünün neden olduğu renk kaymalarını telafi etmektir. - - TOPIC: YAZICI KALİBRE ET +image: printer-calibrate-chart.png +image: calibrate-printer.png - Bu araç, yazdırılan görüntülerin renk doğruluğunu artırabilir. - ^Nasıl Çalışır Hedef yazıcıda bir renk çizelgesi yazdırılır. Yazıcı kusurları nedeniyle yazdırılan renklerin bazıları biraz yanlış olacaktır. Bu yazdırılmış sayfa bir dosyaya taranır ve bu dosyadaki renkler, yazdırılan orijinal renklerle karşılaştırılır. Herhangi bir fark, artık bilinen hatalardır (tarayıcınızın yazıcınızdan daha doğru olduğu varsayılarak - genellikle doğrudur). Bir görüntü dosyası yazdırıldığında, yazdırmadan önce bu hatalar görüntü renklerinden çıkarılır. Yazıcı hataları geri ekler ve teorik olarak doğru bir sonuç bırakır. Kendi testim, aşağıda ayrıntılı olarak açıklanan mütevazı bir iyileşme gösterdi. - İletişim kutusu penceresinde listelendiği şekilde aşağıdaki adımları sırayla gerçekleştirin. Tüm dosyalar /printer_color klasöründedir. • Renk çizelgesi dosyasını oluşturun ve yazdırın (printchart.png). Büyük kağıt boyutu, dikey yönlendirme, kenar boşluğu olmadan kullanın. • Yazdırılan çizelgeyi bir PNG dosyasına tarayın. 300 dpi veya daha fazlasını kullanın. • Tarayıcının bıraktığı kenar boşluklarını kırpmak için PNG görüntüsünü düzenleyin. Düzenlenmiş görüntü dosyasını kaydedin. • Bir renk haritası dosyası oluşturmak için düzenlenmiş görüntü dosyasını işleyin. - Artık kullandığınız yazıcı ve kağıt için renk haritası dosyasının dosya adını isteyecek olan {KALİBRELİ YAZDIR} menüsünü kullanarak yazdırabilirsiniz. - Tarayıcılar, taranan bir görüntüyü hafifçe dikdörtgen olmayan bir şekle çarpıtabilir. Bu olursa, kenar boşluklarını kırpmaya çalışırken fark edersiniz: kalın yeşil kenar boşluğu çizgileri kırpma dikdörtgeniyle tam olarak hizalanmaz. Bu olursa, önce görüntüyü kare yapmak için {PERSPEKTİF}'i kullanın, ardından kenar boşluklarını kırpın. - Taranan çizelge görüntüsünü düzenlerken, en koyu satırın üstte olduğundan emin olun. Renk karolarını çevreleyen kenar boşluklarını kırpın. Renk karolarını çevreleyen kalın yeşil kenar boşluğu çizgisini bir kılavuz olarak kullanın: yalnızca karolar kalacak şekilde bu çizgiyi tam olarak kesin. Kırpma dikdörtgenini ayarlarken 2x büyütmeyle çalışın. Doğru kırpma önemlidir. Kırpma doğru değilse, hesaplanan karo konumları kayacak ve ölçülen renkler yanlış olabilir. Küçük bir hata tolere edilir. Kırpma dikdörtgeninde 1 piksellik hareketler için klavye ok tuşlarını kullanabilirsiniz. Fareyle çekilen son köşe, ok tuşlarının hareket ettireceği köşedir. - Çıktı renk haritası dosyası yalnızca kalibrasyon için kullanılan kağıt ve yazıcı ayarları için kullanılabilir. Diğer herhangi bir kombinasyon kendi kalibrasyonunu ve renk haritası dosyasını gerektirir. - ^Sonuçlar^ (Canon yazıcım) +image: printer-calibrate.jpg +image: printer-cal-study.png - Yukarıdaki çizelge üç görüntünün fotoğrafıdır: sol üst: bir renk çizelgesi fotoğrafının baskısı sağ üst: aynı fotoğrafın kalibre edilmiş baskısı alt: renk çizelgesinin kendisi Üç görüntü de birlikte fotoğraflandığından, kameradan kaynaklanan hatalar eşittir ve karşılaştırmaları geçerli kılar. - - TOPIC: GALERİ MENÜSÜ - - TOPIC: GALERİ GENEL GÖRÜNÜMÜ +image: image-management.jpg - Bir thumbnail görüntüleri galerisi, bir dosya klasörünü, bir görüntü aramasının çıktısını, yerleşik galerilerden birini (son dosyalar, en yeni dosyalar) veya bir albümü (belirli bir adı olan sıralı görüntü dosyaları listesi) temsil edebilir. Klasörler, pratik ve performans nedenleriyle birkaç bin dosyayla sınırlı olmalıdır, ancak bir sınır zorunlu kılınmaz. - ^Galeriyi Kaydırma Galeri, klavye yukarı ve aşağı ok tuşları, page-up ve page-down tuşları veya kaydırma çubukları kullanılarak yukarı ve aşağı kaydırılabilir. [home] ve [end] tuşları da kullanılabilir. Kaydırma çubuğuna sol tıklayıp basılı tutun, galeri tıklama konumuna hızla kayar. Galerinin tıklama konumuna yavaşça kaymasını sağlamak için kaydırma çubuğuna sağ tıklayıp basılı tutun. Fare düğmesini basılı tutmaya devam edip kaydırma hızını artırmak için kenara doğru hareket ettirin. - - TOPIC: THUMBNAIL GÖRÜNÜMÜ Geçerli galerideki görüntü dosyaları bir thumbnail dizisi olarak gösterilir. Thumbnail boyutunu değiştirmek için Zoom menü düğmesini veya [+] [-] tuşlarını kullanın. - - TOPIC: METADATA GÖRÜNÜMÜ Geçerli galerideki görüntü dosyaları, Fotocx tarafından kullanılan temel metadata ile birlikte gösterilir. Özel dizinlenmiş metadata tag'leri tanımlanmışsa, bunlar standart tag'lerin ardından gösterilir. Bkz. {DOSYALARI DİZİNLE}. - - TOPIC: SON DOSYALAR En son görüntülenen 1000 görüntü dosyası bir galeride gösterilir, buradan görüntülemek veya düzenlemek için dosyalar seçebilirsiniz. - - TOPIC: EN YENİ DOSYALAR En son eklenen veya değiştirilen 1000 görüntü dosyası bir galeride gösterilir, buradan görüntülemek veya düzenlemek için dosyalar seçebilirsiniz. En yeni görüntüleri belirlemek için EXIF fotoğraf tarihini veya dosya değiştirme tarihini kullanma seçeneği sunulur. - - TOPIC: GALERİ SIRALAMA Sıralama anahtarını ve artan veya azalan sırayı seçin. Sıfırla onay kutusu tüm galerileri dosya adına göre artan sıraya sıfırlar. - Bir Albüm galerisi sıralanırsa, çıktı albümün yerini almaz, bunun yerine -sorted adında yeni bir albüm oluşturur. - ^Dosya Adı/Numarası Bu, dosya adına göre değiştirilmiş bir sıralamadır. Birden çok dosyanın adları yalnızca aynı konumdaki gömülü sayılar bakımından farklıysa, bu dosya grubu gömülü sayıların sırasına göre sıralanır. Buradaki örnek farkı göstermektedir: alfabetik sıra: xxx1xx xxx11xx xxx123xx xxx3xx sayısal sıra: xxx1xx xxx3xx xxx11xx xxx123xx - ^Arama İşlevinden Metadata Galeri, {GÖRÜNTÜLERİ ARA} 'metadata raporu' seçeneğiyle oluşturulduysa ve standart rapora isteğe bağlı metadata tag'leri eklediyseniz, galeriyi bu metadata tag'lerine göre sıralayabilirsiniz. Galeriyi kamera markasına, lens bilgisine, ISO seviyesine, pozlama süresine ... mevcut herhangi bir metadata'ya göre sıralayabilirsiniz. - - TOPIC: GALERİ FİLTRESİ Seçili görüntü dosyalarını içeren "gallery_filter" adlı bir albüm oluşturmak için geçerli galerinin bir alt kümesini seçin. ^Seçim seçenekleri: • tüm dosyalar: tüm görüntü dosyalarını seç • orijinaller: orijinal dosyalar (sürüm numarası yok) • sürümler: sürümlenmiş dosyalar (düzenlenmiş) • son sürümler: son sürümler (veya sürüm yoksa orijinaller) • derecelendirme aralığı: verilen aralıktaki derecelendirmeye sahip dosyalar • keyword adları: verilen keyword'lerden herhangi birine sahip dosyalar (virgülle ayrılmış) • dosya adı metni: verilen metin dizelerinden herhangi birine sahip dosyalar (virgülle ayrılmış) - - TOPIC: GALERİ ANA SAYFASI TOPIC: GALERİ SONU Geçerli galerideki ilk veya son thumbnail'e atlayın. - - TOPIC: GEÇERLİ DOSYA KLASÖRÜ Geçerli galeriyi geçerli görüntü dosyasından ayarlayın. Başka bir şey yaptıktan sonra geçerli dosya galerisine dönmek isterseniz bu kullanışlıdır. - - TOPIC: SON KLASÖRLER Geçerli galeriyi son kullanılan bir galeriden ayarlayın. Bu, son galeriler arasında daha kolay ileri geri gitmenizi sağlar. - - TOPIC: KLASÖR AĞACI +image: folder-tree.png - Başlangıçta tüm ÜST görüntü klasörleri gösterilir. Alt klasörleri açmak için [+]'ya, tekrar katlamak için [-]'ye tıklayın. O klasördeki görüntülerin bir galerisini almak için herhangi bir klasöre tıklayabilirsiniz. Görüntü koleksiyonunuzda herhangi bir yere gidebilmek için pencereyi açık tutun. Bu işlev, galeri üst panelindeki [TOP] düğmesi kullanılarak da kullanılabilir. - - TOPIC: DOSYALARI SEÇ Albüm oluşturmak veya toplu işlevler için girdi olarak kullanılacak görüntü dosyalarını önceden seçin. Bu işlevler varsayılan olarak önceden seçilmiş dosyaları kullanır, ancak bunları değiştirebilir veya yeniden başlayabilirsiniz. {GÖRÜNTÜ DOSYALARINI SEÇ} sürecine bakın. - - TOPIC: YER İMLERİ Mevcut yer imlerini görüntüleyin. Yer imleri, kullanıcı tarafından atanan adlara sahip seçilmiş konumlardır (klasör/dosya adları). O konumla başlayan bir thumbnail galerisi göstermek için bir yer imine tıklayın. Bir yer imi eklemek, silmek veya yeniden adlandırmak için [Yer İmlerini Düzenle]'yi seçin. - - TOPIC: YER İMLERİNİ DÜZENLE Yer İmlerini Düzenle'yi başlattıktan sonra, bu konumu yer imi listesine eklemek için bir galeri thumbnail'ine tıklayın. Atanan yer imi adı başlangıçta thumbnail'in dosya adı olacaktır. Adı düzenleyebilirsiniz. Fare tıklamasıyla mevcut bir yer imini seçerseniz, adı giriş alanında gösterilir. Adı değiştirebilir veya yer imini kaldırmak için [sil]'e basabilirsiniz. Yeni yer imleri, seçilen son yer imi konumundan sonra eklenir. Sırayı değiştirmek için, Fotocx ana klasöründeki "bookmarks" dosyasını düzenleyin. - - TOPIC: MAPS MENU - - TOPIC: DÜNYA HARİTASI +image: map-click.jpg - Bu, sokak seviyesinden kıta seviyesine kadar ölçeklendirilebilen (yakınlaştırılıp uzaklaştırılabilen) bir internet dünya haritasıdır. Haritayı yakınlaştırıp uzaklaştırmak için fare tekerleğini kullanın. Merkezi değiştirmek için haritayı sürükleyin. Harita, metadata'sında coğrafi koordinatlara sahip görüntülere karşılık gelen işaretçilere (kırmızı noktalar) sahiptir. Bu konumdaki görüntülerin bir Galeri Görünümünü almak için bir işaretçiye tıklayın. Haritadaki işaretçi alanı içinde bulunan görüntüler seçilir. Etkili işaretçi alanı harita ölçeğiyle ölçeklenir. Ölçeği genişletmek ve bir işaretçiyi olası birden çok yakın işaretçiye ayırmak için yakınlaştırın. - - TOPIC: HARİTADA GÖSTER Geçerli görüntü dosyasının konumunu dünya haritasında gösterin. Birden çok işaretçi örtüşüyorsa, tek bir işaretçi merkezde olana kadar yakınlaştırın. - - TOPIC: ALBÜMLER MENÜSÜ - - TOPIC: ALBÜMLER Bir albüm, mevcut görüntülerden elle bir araya getirilmiş rastgele bir görüntü kümesidir. Bir albüm, üye görüntü dosyalarının bir listesidir. Görüntü dosyalarının kendileri kopyalanmaz veya değiştirilmez. Belirli bir görüntü dosyası birden çok albümün üyesi olabilir veya bir albüm içinde birden fazla kez bulunabilir. Bir albümdeki görüntüleri ekleyip kaldırabilir veya sırasını yeniden düzenleyebilirsiniz. Bir albüm oluşturulduktan sonra, adına göre seçebilirsiniz ve bir galeri olarak gösterilir. - - TOPIC: ALBÜM OLUŞTUR Yeni bir albüm için bir ad girin. Boş bir albüm, {DOSYALARI SEÇ} işlevinden önceden seçilmiş görüntü dosyalarına sahip bir albüm, geçerli galerideki görüntülere sahip bir albüm oluşturabilir veya albüm için başlangıç görüntülerini seçebilirsiniz. - - TOPIC: ALBÜMÜ YENİDEN ADLANDIR Mevcut bir albüm seçin ve yeni bir ad girin. - - TOPIC: ALBÜMÜ SİL Mevcut bir albüm seçin ve kalıcı olarak silin. - - TOPIC: ALBÜM SEÇ Mevcut albümlerin bir listesi sunulur. Listeden seçin. - - TOPIC: GEÇERLİ ALBÜM Galeriyi geçerli (en son kullanılan) albümden ayarlayın. - - TOPIC: GALERİYİ ALBÜME DÖNÜŞTÜR Geçerli galeriyi bir albüm olarak kaydedin. Mevcut bir albüm adı seçin [Göz At] veya yeni bir ad girin. - - TOPIC: ALBÜMÜ DÜZENLE Bir albüm thumbnail'ine sağ tıklayın ve açılır menüden seçin: • Seçili dosyaları buraya ekle - önceden seçilen dosyalar buraya eklenir (thumbnail'in önüne/arkasına eklemek için thumbnail'in sol/sağ tarafına tıklayın). • Geçerli dosyayı (Dosya Görünümü) buraya ekle - aynı şekilde çalışır. • Albümden kaldır - tıklanan dosya albümden kaldırılır. - ^Sürükle ve Bırak Thumbnail'leri fareyle sürükleyerek bir albümdeki görüntüleri yeniden düzenleyebilirsiniz. Fare imleci küçük bir thumbnail görüntüsüne dönüşene kadar thumbnail'i sürükleyin. Bu görüntüyü eklenmesi gereken konuma sürüklemeye devam edin ve fare düğmesini bırakın. Fareyi, sürüklenen görüntünün eklenmesi gereken thumbnail'ler arasına kabaca konumlandırın. Sürükleme pencerenin üst veya alt kenarına yaklaşırsa, galeri daha fazla görüntüyü görünür kılmak için kayacaktır. Birçok görüntünün seçimini veya taşınmasını hızlandırmak için iki Fotocx oturumu kullanabilirsiniz. Görüntüleri herhangi bir kaynak galeriden bir hedef albüm konumuna sürükleyip bırakın. - Fotocx kullanarak bir dosyayı yeniden adlandırır veya taşırsanız, tüm albüm bağlantıları güncellenir ve dosya içinde bulunduğu albümlerde kalır. Bunu Fotocx dışında yaparsanız, albüm bağlantıları kaybolur ve dosya albümden kaybolur. - Görüntü dosyaları Toplu Dönüştür veya Toplu Kopyala/Taşı kullanılarak yeniden adlandırılır veya taşınırsa, isteniyorsa albüm dosyalarını değiştirme seçeneğini seçtiğinizden emin olun. Aksi takdirde bunları tek tek değiştirmeniz gerekecektir. - Albümlerdeki görüntüleri içeren klasörleri yeniden adlandırmayın. Albüm bağlantıları kaybolur. Bunun yerine, görüntü dosyalarını yeni klasöre taşımak için Toplu Dönüştür veya Toplu Kopyala/Taşı kullanın, ardından eski klasör boşsa silin. Görüntü dosyalarını silmek için Toplu Sil/Çöpe At'ı kullanın. Bu, silinen dosyaları albümlerden de temizler. - - TOPIC: ALBÜMLERİ GÜNCELLE +image: album-replace-file.png - Belirtilen albüm dosyalarını belirtilen değiştirmelerle değiştirin veya belirtilen mevcut dosyalardan sonra belirtilen yeni dosyaları ekleyin. İşlenecek bir veya daha fazla albüm seçin. Galeri görünümünde, yukarıdaki iletişim kutusunda 'eski dosya' ve 'yeni dosya'yı belirtmek için iki thumbnail'e tıklayın. Seçeneği seçin: 'yeni dosya' bulunduğu her yerde 'eski dosya'nın yerini alır, ya da 'yeni dosya' 'eski dosya'dan sonra albümlere eklenir. Albümleri işlemek için [proceed]'e basın. İşlemden sonra, iletişim kutusu aynı seçili albümlerle ve aynı 'değiştir veya ekle' seçeneğiyle tekrarlanır. İki dosya daha seçip [proceed]'e basabilirsiniz. - - TOPIC: ALBÜM TOPLU GÜNCELLEME +image: album-mass-update.png - Bu, birçok görüntü dosyası için yeni sürümler oluşturduktan ve bir veya daha fazla albümü yeni sürümlere güncellemeniz gerektiğinde ihtiyaç duyabileceğiniz toplu güncellemeler için bir araçtır. Bu, muhtemelen imkansız olan her ihtiyacı kapsamaz, ancak umarım dosyaları tek tek değiştirme ihtiyacını azaltacaktır. - Bir veya daha fazla albüm seçin ve ardından işleme seçeneklerinden birini seçin: • Tümünü yalnızca en yeni sürümle değiştir: Albümler yalnızca en yeni dosya sürümlerine sahip olacak şekilde güncellenir. • Tüm sürümleri en yeni sürümle değiştir: Tüm dosya sürümleri yalnızca en yeni sürümle değiştirilir. Orijinal dosya, varsa, DEĞİŞTİRİLMEZ. • En yeni sürümleri mevcut sürümlere ekle: Eksikse en yeni sürüm mevcut sürümlere eklenir. • Tümünü orijinal ve tüm sürümlerle değiştir: Tüm dosyalar orijinal dosya ve tüm sürümlerle değiştirilir. • Tümünü orijinal sürüm ve en yeni sürümle değiştir: Tüm dosyalar orijinal dosya ve en yeni sürümle değiştirilir. • Tümünü seçili sürümlerle değiştir (*): Tüm dosyalar yalnızca seçili sürümlerle değiştirilir. Bu, orijinal (sürümsüz) dosyayı içerir. • Tüm sürümleri seçili sürümlerle değiştir (*): Tüm dosya sürümleri yalnızca seçili sürümlerle değiştirilir. Orijinal dosya, varsa, DEĞİŞTİRİLMEZ. • Seçili sürümleri mevcut sürümlere ekle (*): Eksikse seçili sürüm mevcut sürümlere eklenir. • Tümünü orijinal ve seçili sürümlerle değiştir (*): Tüm dosyalar orijinal dosyalar ve seçili sürümlerle değiştirilir. - (*) Seçili dosyaları kullanan dört seçenek: seçili dosyaların listesi {DOSYALARI SEÇ} işlevinden gelir. Seçili dosyalardan herhangi biriyle eşleşmeyen albüm dosyaları albümde bırakılır. Yalnızca seçili bir dosyayla eşleşen dosyalar yukarıdaki kurallara göre değiştirilir. Eşleştirme, sürüm veya uzantı olmadan dosya adına dayanır: 'asdfg.png' ve 'asdfg.v01.jpg' bir eşleşmedir. - Örnek: Tüm sürümleri seçili sürümlerle değiştir: Albümde filename.jpg ve filename.v02.png varsa ve seçili dosyalar listesi filename.v04.jpg içeriyorsa, güncellenmiş albümdeki sonuç şu şekilde olur: filename.jpg ve filename.v04.jpg - - TOPIC: SLAYT GÖSTERİSİ +image: slide-show.jpg - ^Monitör Kesirli Ölçekleme Bazı sistemlerde, kesirli ölçekleme Fotocx slayt gösterisi animasyonları için performans sorunlarına neden olur. Gerekirse bunu devre dışı bırakın ve uygulamalar için yazı tipi boyutunu artırmak üzere başka yollar kullanın. Fotocx için yazı tipi boyutu {AYARLAR} menüsündedir. - Slayt gösterisi iletişim kutusunda (sol üst), [Albüm Seç]'e basın ve sağlanan listeden bir albüm seçin. İletişim kutusundaki diğer ayarları istediğiniz gibi değiştirin, ardından slayt gösterisini albümdeki ilk görüntüyle başlatmak için [Başlat] düğmesine basın veya duraklatılmış bir slayt gösterisine devam etmek için [Devam Et]'e ya da thumbnail'ine tıklayarak seçilen başka bir görüntüye basın. Slayt gösterisinden çıkıp iletişim kutusuna dönmek için escape tuşunu kullanın. - Ana İletişim Kutusu Kontrolleri • Başlık Süresi: başlığı ve açıklamayı gösterme süresi (saniye). • Görüntü Süresi: yalnızca görüntüyü gösterme süresi (saniye). • Kırpma Sınırı %: kenar boşluklarını ortadan kaldırmak için görüntüleri bu miktara kadar kırp. • Tam Ekran: işaretliyse, görüntüler menü vb. olmadan tam ekran gösterilir. • Otomatik tekrar oynatma: işaretliyse, slayt gösterisi sonunda baştan başlar. • Rastgele Görüntü: işaretliyse, rastgele görüntü sırası kullanılır. Aksi halde albüm sırası. - Slayt gösterisini kontrol etmek için klavye tuşları kullanılabilir. Görüntülemek için [klavye]'ye basın. - Aşağıdaki klavye tuşları eylemlere atanmıştır ve değiştirilemez: • Escape: slayt gösterisini kesintiye uğratır ve ana iletişim kutusuna döner. • Sol / sağ ok tuşları: İstediğiniz zaman ileri geri gidebilirsiniz ve slayt gösterisi oradan devam eder. - Görüntüler arasındaki animasyonlu geçişler ve tek tek görüntülerin gösterim süreleri ile yakınlaştırma davranışı, aşağıda açıklanan iletişim kutuları kullanılarak özelleştirilebilir. - Görüntüler arasındaki geçişleri seçip özelleştirmek için bir iletişim kutusu başlatmak üzere [geçişler]'e basın. Bunlar, görüntü değiştirmenin birçok animasyonlu yöntemini içerir (ör. yeni görüntü, eski görüntünün yerini almak için merkezden genişler). Kullanılacak geçişleri ve bunların rastgele mi yoksa sırayla mı kullanılacağını seçin. Süre parametresi, geçişin süresini ayarlar. Tercih parametreleri, rastgele sıra seçildiğinde geçişin ne sıklıkla kullanılacağını etkileyecek göreli bir tercih belirtir. - [yükle] ve [kaydet] düğmeleri, geçiş ayarlarını bir dosyaya kaydetmenizi ve daha sonra yüklemenizi sağlar. Bu dosyalar slayt gösterisi dosyalarından bağımsızdır. Bir slayt gösterisi, o slayt gösterisi (albüm adı) için en son kullanılan geçiş ayarlarını varsayılan olarak kullanır, ancak [yükle] düğmesini kullanarak başka ayarları yükleyerek veya iletişim kutusunda değiştirerek bunları her zaman değiştirebilirsiniz. - Görüntü Tercihleri (sağ üst) için bir iletişim kutusu başlatmak üzere [görüntü dosyaları]'na basın. Bunlar isteğe bağlıdır. Albüm/galeri görünümünde thumbnail'ine tıklayarak bir görüntü özelleştirme için seçilir. İletişim kutusu, varsayılan ayarlarla veya bu görüntü için bu slayt gösterisindeki önceki ayarlarla doldurulur. Düzeltmeleri girin ve [done]'ye basın veya özelleştirilecek bir sonraki görüntüye tıklayın. - Tercih: Rastgele görüntü sırası seçilirse, bu sayı görüntü için göreli bir tercih verir. Nötr değer 10'dur. Görüntülerin rastgele sırasında bu dosyanın seçilme olasılığını artırmak veya azaltmak için yeni bir değer girin, ör. 20 değeri olasılığı 2 kat artırır. Sıfır değeri görüntünün gösterilmesini engeller. Görüntü ayrıca albümdeki görüntü sayısının 1/3'ü veya 10 kadar (hangisi küçükse) bir süre için engellenir. - İletişim kutusu, özelleştirilebilir görüntü olaylarını zaman sırasına göre gösterir: • belirtilen bir süre bekle (sıfır olabilir). • aşağıdaki metin etiketlerini paralel olarak göster: görüntü adı (dosya temel adı) belirtilen süre için, varsa görüntü başlığı belirtilen süre için, varsa görüntü açıklaması belirtilen süre için. • bir görüntü yakınlaştırması başlatmadan önce belirtilen bir süre bekle (sıfır olabilir). • görüntüyü belirtilen süre boyunca normalden büyütülmüşe veya tersine yakınlaştır. Hiçbir seçenek seçilmemişse, yakınlaştırma yapılmaz. • yakınlaştır: normal boyutta başla, yakınlaştırma merkezini belirtilen konuma taşırken görüntüyü büyüt. • uzaklaştır: belirtilen yakınlaştırma merkezinde büyütülmüş boyutta başla, görüntüyü tekrar normal boyuta küçült. • [zoom center] - bu düğmeye basın, ardından görüntü için zoom merkezini belirtmek üzere görüntü thumbnail'ine tıklayın. • yakınlaştırmadan sonra belirtilen bir süre bekle (sıfır olabilir) (varsayılan değer ana iletişim kutusunun 'görüntü süresi' ayarıdır). • belirtilen geçişi kullanarak veya tercih belirtmemek için 'sonraki'yi kullanarak bir sonraki görüntüye geç (rastgele seçilir). - - TOPIC: ÖZEL MENÜ +image: custom-menu.png - Bu, birden çok menüden sık kullanılan işlevleri tek bir özel menüde toplamanızı sağlar. Belirli görüntü dosyalarını veya albümleri açmak için girişler de ekleyebilirsiniz. Menü ayrıca betik işlevlerini ve eklenti işlevlerini de içerir (aşağıya bakın). - Menüdeki son giriş olan Menüyü Düzenle, menü listesinin kendisini düzenlemek için bir metin düzenleyici açar. Menü adları Fotocx menülerindeki adlarla tam olarak eşleşmelidir, ancak büyük/küçük harf önemli değildir. - Menü girişleri aşağıdaki biçimleri alabilir: • # yorum metni: hiçbir şey yapmayan bir yorum • menüadı # açılır ipucu: Fotocx menü adı ve isteğe bağlı açılır ipucu • file : adlandırılmış dosyayı aç • album : adlandırılmış albümü galeri olarak aç - Aşağıdaki girişler varsayılan olarak mevcuttur ve bunları değiştirmemeli veya kaldırmamalısınız: Betiği Düzenle, Betiği Çalıştır, Toplu Betik, Eklentiler, Menüyü Düzenle. Ayrıntılar aşağıda açıklanmıştır. - - TOPIC: BETİK DOSYALARI Menü İşlevleri: • Betiği Düzenle - Bir görüntü dosyası üzerinde bir dizi düzenleme gerçekleştirir, tüm işlevleri ve ayarları adlandırılmış bir betik dosyasına kaydeder. • Betiği Çalıştır - Bir düzenleme işlevi gibi, geçerli görüntü dosyasını kullanarak bir betik dosyasını çalıştırır. • Toplu Betik - Herhangi sayıda görüntü dosyası seçin ve toplu modda hepsi üzerinde bir betik dosyası çalıştırın. - Betik dosyaları, bir dizi düzenlemeyi bir kez tanımlamanızı ve bunları daha sonra tek veya birden çok görüntü dosyası üzerinde tekrarlamanızı sağlar. - ^Betikle Kullanılabilir Düzenleme İşlevleri Bazı düzenleme işlevleri görüntü üzerinde fare sürüklemeleri kullanır, ör. tüm çarpıtma işlevleri. Bunlar, fare sürüklemeleri kaydedilmediği için betikle kullanılamaz. Bu işlevlerin kullanımı engellenmiştir. - Aşağıdaki işlevler şu anda betikle kullanılabilir: • Düzenle: Rötuş, Kenar Boşlukları, Renk Modu, Alan Doldurma • Onar: Keskinleştir, Normal Bulanıklaştırma, Kademeli Bulanıklaştırma, Gürültü Gider, Sis Gider, JPEG Bozulmaları, Kenar Yumuşatma, RGB Ayarla • İncelt: Histogramı Düzleştir, Yerel Kontrast, Kontrastı Artır, Genel Retineks, Yerel Retineks, Yerel Kontrast, Doygunluk, Yumuşak Odak, Parlaklık Geçişi • Efektler: Ana Hatlar, Eskiz, Karikatür, Kabartma, Karolar1, Karolar2, Boyama, Doku, Desen, Dither, Oyma, Renkleri Ayarla, Renkleri Kaydır, Özel Çekirdek - - TOPIC: BETİĞİ DÜZENLE İletişim kutusunda [başlat]'a basın. Betik için bir dosya adı seçin. Geçerli görüntü dosyasını düzenlemeye başlayın. İstenen düzenleme işlevlerini herhangi bir sırada kullanın. Her düzenleme, kullanılan tüm iletişim kutusu ayarlarıyla birlikte betik dosyasına kaydedilir. Bitirdiğinizde, betik dosyasını kapatıp verilen dosya adıyla kaydetmek için [close]'a basın. - - TOPIC: BETİĞİ ÇALIŞTIR Açılır menüden kaydedilmiş betik dosyalarınızdan birini seçin. Betik, normal bir düzenleme işlevi gibi geçerli görüntü dosyası kullanılarak çalıştırılır. - - TOPIC: TOPLU BETİK İletişim kutusunda [Dosyaları Seç]'e basın. Standart dosya seçme iletişim kutusunu {GÖRÜNTÜ DOSYALARINI SEÇ} kullanarak düzenlenecek dosyaları seçin. Bitirdiğinizde, [Betik Seç]'e basın. Açılır menüden bir betik dosyası seçin. Betik artık seçilen tüm dosyalar üzerinde çalıştırılır. Değiştirilen tüm görüntüler yeni sürümler olarak kaydedilir. RAW dosyalar işlenirse, karşılık gelen çıktılar TIFF-16 dosyalarıdır. - - TOPIC: EKLENTİLER +image: plugins.png - Eklenti işlevleri, Fotocx içinde başka görüntü düzenleyicileri kullanmanın bir yoludur, ör. Gimp. Rawtherapee gibi bir RAW görüntü düzenleyici kullanıp ardından Fotocx kullanarak ek düzenlemeler yapabilirsiniz. - ^Kullanım prosedürü: • İşlenecek dosyayı Fotocx'te açın • Eklentiler menüsünü başlatın ve istenen programı seçin, ör. Gimp • Eklenti programı başlar ve Fotocx'ten iletilen dosyayı açar • Eklenti programını kullanarak istenen düzenlemeleri yapın • Bitirdiğinizde, çıktı dosyasını girdi dosyasıyla aynı adla kaydedin. .ext dosyası değişebilir. • Eklenti programını kapatın. • Fotocx, eklenti çıktı dosyasını geçerli dosyanın düzenlenmiş bir sürümü olarak açar. • Ek düzenlemeler yapın veya düzenlenmiş dosyayı yeni bir sürüm veya yeni bir dosya olarak kaydedin. - Örnek bir Eklentiler menüsü solda gösterilmiştir. Son giriş olan "Eklentileri Düzenle", sağdaki metin düzenleme uygulamasını başlatır. Eklenti menü adlarını ve karşılık gelen eklenti programlarını başlatan komutları tanımlamak için metin düzenleyiciyi kullanın. Biçim şöyledir: menüadı = eklenti-komutu %s TIP = yukarıdaki komutun açıklaması 'eklenti-komutu', eklenti işlevi için kabuk komutudur ve '%s', geçerli dosya adının komuta eklendiği yerdir. '%s' etrafına tırnak koymayın çünkü bu otomatik olarak eklenir ve boşluk veya diğer özel karakterler içeren dosya adlarının işlenmesini sağlar. Gösterilen üstteki örnek, "gimp %s" komutunu başlatan "Gimp" adlı bir menüdür. TIP metni isteğe bağlıdır. Varsa, menü adını izleyen satırdadır. Fareyi menü girişinin üzerine getirmek bu metni menü metninin yanında gösterecektir. - Bazı komutlar hem girdi hem de çıktı dosyalarının belirtilmesini bekleyebilir. Bu durumda her iki konuma da '%s' sağlayın. Komut bir görüntü dosyası işlemiyorsa '%s'yi atlayın. - ^Alan Seç Girdi dosyasının seçili bir alanı varsa, yalnızca bu alan değiştirilir. Eklenti işlevi tüm görüntüyü düzenler, ancak sonuç Fotocx tarafından işlendiğinde, yalnızca seçili alandaki değişiklikler korunur. - - TOPIC: ZOOM - ^Zoom Düğmesi {DOSYA GÖRÜNÜMÜ}'nde görüntü boyutunu veya {GALERİ GÖRÜNÜMÜ}'nde thumbnail boyutunu artırmak veya azaltmak için düğmeye sol veya sağ tıklayın. Bu yalnızca galeri görünümü modu {THUMBNAIL GÖRÜNÜMÜ} ise geçerlidir. {METADATA GÖRÜNÜMÜ} ise, hiçbir şey yapılmaz. - - TOPIC: ÖNCEKİ/SONRAKİ - Geçerli galerideki önceki veya sonraki dosyayı açmak için düğmeye sol veya sağ tıklayın. Sol/sağ ok tuşlarını da kullanabilirsiniz. - - TOPIC: DOSYA KAYDET - +image: file-save.png - +image: file-save-as.jpg - İlk iletişim kutusunda 'yeni sürüm', 'yeni dosya' veya 'dosyayı değiştir' seçin. - ^Yeni Sürüm Geçerli görüntü dosyasını yeni bir sürüm numarasıyla kaydedin. Sürüm numaralı dosya adları "dosyaadı.vNN.ext" biçimindedir; burada NN, 01 ile 99 arasında bir sayıdır. Dosya adının sürümü yoksa, .v01 sürümü oluşturulur. Diskte zaten dosya sürümleri varsa, bir sonraki daha yüksek sürüm numarası kullanılır. Dosya bir JPEG dosyasıysa, varsayılan kalite kullanılır - bkz. {AYARLAR}. - ^Yeni Dosya Yukarıda gösterilen 2. iletişim kutusu, geçerli görüntüyü orijinal dosya, başka mevcut bir dosya veya yeni bir dosya olabilecek seçili bir dosyaya kaydetmek için açılır. Bir dosya JPEG, PNG, JXL ve TIFF biçimlerinde kaydedilebilir. - JPEG için, 1-100 aralığında bir kalite değeri seçebilirsiniz. Düşük değerler daha küçük dosyalar ve daha az görüntü kalitesi verir. 70'in üzerindeki değerlerin 100'den (en yüksek kalite, en büyük dosya boyutu) ayırt edilmesi zordur. İletişim kutusunda değeri değiştirmediğiniz sürece varsayılan JPEG kalitesi kullanılır. Varsayılan {AYARLAR}'dan gelir. Kalitesi 70 ile kaydedilmiş bir dosya ile 100 ile kaydedilmiş bir dosya arasında fark göremezsiniz, ancak dosya alanındaki fark çok büyüktür. Saydam alanlar siyah olur. JPEG saydamlığı desteklemez. - PNG ve TIFF dosyaları, kalite kaybı olmadan sıkıştırılır ve JPEG'den çok daha büyüktür. Renk başına 8 veya 16 bit ile kaydedilebilirler. - 'geçerli yap' işaretliyse, kaydedilen dosya (yeni dosya adı) geçerli dosya haline gelir. - ^Dosyayı Değiştir Geçerli görüntü dosyasını kendi üzerine kaydedin. - ^İzinler^ girdi dosyasından kopyalanır. İzinleri düzenlemek için [Değiştir] düğmesine basın. - - TOPIC: METADATA MENÜSÜ - - Metadata, bir görüntü dosyası içinde saklanan metin verisidir. Dijital kameralar tarih ve saat, kamera ve fotoğraf parametreleri hakkında teknik veriler ve konum verisi (kamerada bir GPS alıcısı varsa) gibi bazı metadata'yı otomatik olarak oluşturur. Diğer veriler kullanıcı tarafından eklenebilir, ör. bir başlık, açıklama, derecelendirme, keyword'ler. Fotocx, herhangi bir metadata'yı, klasör ve dosya adlarıyla veya kısmi adlarla birlikte kullanarak görüntü koleksiyonunuzda arama yapıp eşleşen görüntülerin bir galerisini oluşturabilir. Çoğu durumda, arama neredeyse anlıktır. - - TOPIC: ANA METAYI GÖRÜNTÜLE TOPIC: TÜM METAYI GÖRÜNTÜLE +image: view-metadata.jpg - Ana Metayı Görüntüle işlevi, geçerli görüntü dosyası için yaygın olarak yararlı metadata'yı görüntüler. Bu, bir fotoğrafın tarihini ve saatini, deklanşör hızını, odak uzaklığını, görüntü boyutunu, ISO'yu vb. içerir. Dijital kameralar bu veriyi görüntüde saklar. Metadata ayrıca bir kullanıcı tarafından eklenen veriyi de içerebilir: keyword'ler, başlık veya alt yazı, açıklama, fotoğrafçı veya daha sonraki bir editör tarafından eklenen yorumlar (bazen yayınlanan görüntülerde bulunur). - Bir görüntü düzenlenirse, düzenlemenin bir kaydı metadata'da saklanır. Ana Metayı Görüntüle, yapılan düzenlemelerin geçmişini gösterir. - Tüm Metayı Görüntüle, muhtemelen önemsemediğiniz 100'den fazla öğeyi içerebilen tüm mevcut metadata'yı raporlar. - Ana Metayı Görüntüle penceresindeki [Extras] düğmesi, rapora ekstra tag'ler ekleyebileceğiniz sağda gösterilen iletişim kutusunu açar. Tüm Metayı Görüntüle raporunda bulunan herhangi bir tag, kısa rapora eklenebilir. Sol sütundaki bir tag'e tıklayarak onu sağ sütuna ve rapora ekleyin. Kaldırmak için sağ sütundaki bir tag'e tıklayın. Varsayılan listede bulunmayan (en olası ihtiyaç duyulan tag'lerle sınırlı) herhangi bir tag adını yazmak için "Diğer Tag ..." girişine tıklayın. - Fotocx, görüntü düzenleme ve aramada şu metadata tag'lerini kullanır: • Title - görüntünün kısa başlığı • Description - görüntünün açıklaması • Date/Time Original - fotoğraf tarihi/saati • Rating - 0'dan 5'e yıldız • Country - kamera GPS'inden veya elle eklenmiş • Location - EXIF adı şehirdir • Geotags - latitude/longitude • Keywords - kullanıcıdan gelen görüntü tanımlayıcıları • Camera data - marka, model, lens • Exposure data - süre, F sayısı, odak uzaklığı, ISO Bu tag'ler {ANA METAYI DÜZENLE} işlevi kullanılarak düzenlenir. Aşağıda açıklanan daha az kullanışlı yöntemlerle diğer herhangi bir tag de düzenlenebilir ve aranabilir. - Ayrıca birçok görüntü dosyasına aynı anda veri eklemek için çeşitli toplu işlevler de vardır. Bkz. {TOPLU MENÜ}. - - TOPIC: KEYWORD'LERE GENEL BAKIŞ Görüntü dosyaları tanımlama veya sınıflandırma keyword'lerine sahip olabilir. Bunlar, istenen keyword'lere sahip görüntüler için büyük bir görüntü koleksiyonunda arama yapmak üzere kullanılabilir. Tipik keyword'ler: konu, olay, konum, kişiler veya nesneler vb. Keyword'ler görüntü metadata'sının içinde bulunur. Keyword'ler normalde tek bir kelimedir, ancak gömülü boşluklar veya diğer ayırıcılar içeren kısa bir ifade de kullanılabilir. Virgüller ve noktalı virgüller keyword'ler arasında ayırıcı olarak kullanılır ve bu nedenle bir keyword içinde kullanılamaz (harici bir standart). "arizona scenery" gibi bileşik bir keyword'e izin verilir, ancak daha fazla esneklik için bunun yerine iki keyword kullanmalısınız: her iki keyword'e veya her ikisine de sahip görüntüleri arayabilirsiniz. - İstenen bir keyword veya keyword'lere sahip tüm görüntüler hızla bulunabilir ve bir galeri penceresinde görüntülenebilir. Klasör ve dosya adlarını anlamlı bir şekilde kullandıysanız, bu adları kullanarak da görüntü arayabilirsiniz. Görüntüleri tarihe, derecelendirmeye, konuma ve diğer metadata tag'lerine göre de arayabilirsiniz. Bunların keyword'lerde tekrarlanması gerekmez. Aşağıda {GÖRÜNTÜLERİ ARA}'ya bakın. - ^Yönetilen Keyword Sistemi Bu, görüntülerinize keyword eklemeden önce keyword sisteminizi planlamak isterseniz uygundur. Bu sistemde, sınırlı sayıda keyword kategorisi oluşturursunuz (ör. insanlar, yerler, nesneler, olaylar, sanat, manzara ...). Keyword'ler görüntülere atandığında gerektiğinde oluşturulabilir ve bir kategoriye atanabilir. Bir görüntüye, kategoriye göre ve kategori içinde alfabetik olarak düzenlenmiş mevcut keyword'ler listesine işaret edip tıklayarak bir keyword verilir. Yeni bir keyword gerekiyorsa, bir görüntüye ilk atandığında oluşturulur. Bir kategorideki keyword sayısı, bir seçim listesinden görsel olarak bulmanın makul ölçüde hızlı olması için ideal olarak 200'den az olmalıdır. - ^Yönetilen keyword sisteminin avantajları • tutarsız keyword adlarını önler (ör. 'landscape' ve 'scenery') • alternatif yazımları ve yazım hatalarını önler (ör. susan, susy, susna) • diğer keyword'leri içeren keyword'leri önler (ör. scenery, lake) • keyword'ler yukarıdaki hatalara sahip olmadığından arama daha güvenilirdir • keyword atarken, yönetilmeyen bir sistemdeki binlerce kaotik keyword yerine mevcut keyword'lere genel bir bakışa sahip olursunuz - Büyük bir listeden keyword seçmek yavaş olabilir. Bu, 3 şekilde hafifletilir: • Metadata düzenleme iletişim kutusunda en son kullanılan yaklaşık 10 keyword'e kadar gösterilir, burada kolayca görülüp seçilebilirler. Aynı anda çekilen bir dizi fotoğraf muhtemelen birçok keyword'ü paylaşacağından, keyword eklemek daha kolay ve hızlı hale gelir. • İstenen bir keyword adını yazmaya başlayabilirsiniz. Yalnızca birkaç olası eşleşme kaldığında eşleşen keyword'lerin açılır bir listesi görünür. Ardından istenen keyword'e tıklayarak onu görüntüye ekleyebilirsiniz. Eşleşen keyword yoksa, yeni keyword'ü tanımlı keyword'ler listesine ekleme seçeneğiniz vardır. • Daha küçük bir seçim listesi görüntülemek için bir kategori seçebilirsiniz. - Keyword'ler geniş tanımlanmış ve sayıca daha azsa, keyword'ler için arama sonuçları daha büyük olacaktır, ancak istenen görüntüleri görsel olarak bulmak oldukça hızlı olabilir. Fiziksel dosya sırası korunur: klasörlerinde birlikte bulunan görüntü dosyaları arama sonuçlarında da birlikte görünecektir. - İnternetten indirilen görüntüler genellikle keyword içerir. Bunların doğal olarak hiçbir düzeni yoktur ve topluca kaotiktir. Yönetilen bir keyword sistemi kullanıyorsanız, bu tür görüntüleri gözden geçirip keyword'leri sisteminize uyacak şekilde düzeltmek veya silmek en iyisidir. Hangi yeni keyword'ler mevcutsa "nocatg" kategorisi altına otomatik olarak eklenir. Keyword listenizde istenmeyen keyword'ler fark ederseniz, düzeltilebilmeleri veya kaldırılabilmeleri için istenmeyen keyword'lere sahip görüntüleri bulmak üzere {GÖRÜNTÜLERİ ARA}'yı keyword'e göre kullanın. - ^Rastgele Keyword Sistemi Belirli bir sistem düşünmeden gerektiğinde keyword uydurmayı tercih edebilirsiniz. Ya da zaten binlerce keyword'ünüz olabilir, bu da yönetilen bir keyword sistemine dönüştürmeyi zorlaştırır (ama imkansız değildir: Fotocx keyword adlarını toplu olarak dönüştürebilir). Bu durumda, görüntülerinize gerektiğinde yeni keyword'ler oluşturarak basitçe keyword yazabilirsiniz. Keyword'leri düzenli tutmak için hâlâ bir miktar yetenek vardır: girdiğiniz karakterlerle eşleşen mevcut keyword'ler, yalnızca birkaç olası eşleşme kaldığında gösterilir. Örnek: "new" yazarsınız ve bir keyword listesi gösterilir: New York, New Delhi, Newman ... Bunlardan biri niyetinizse, keyword'ü seçmek için ona tıklarsınız. Değilse, yazmaya devam edersiniz ve sonunda yeni bir keyword oluşturmak için Enter'a basarsınız. Görüntüleri keyword'e göre ararken, istenen keyword adlarını yazabilir veya mevcut keyword'ler listesinden seçebilirsiniz. Yazdığınız ilk birkaç harfle eşleşen mevcut keyword'ler gösterilir ve bu listeden seçim yapabilirsiniz. Görüntülerinizde bir yerde bulunmayan bir arama keyword'ü giremezsiniz. Rastgele bir keyword sistemi muhtemelen binlerce keyword'le sonuçlanacaktır. Bu pek kullanışlı olmayabilir. - - TOPIC: GEOTAGS OVERVIEW Modern kameralar, dahili bir GPS alıcısı kullanarak her fotoğrafın konumunu kaydedebilir. Latitude, longitude (ve muhtemelen şehir/konum ve ülke) görüntü dosyasının EXIF metadata'sına kaydedilir. {ANA METAYI DÜZENLE} işlevi ayrıca konum verisinin girilmesine veya düzeltilmesine de olanak tanır. Konumlar, yakınlaştırılabilir bir dünya haritasına tıklanarak da belirtilebilir. Belirtilen bir konum veya bölge için görüntüleri bulma işlevleri: • {GÖRÜNTÜLERİ ARA}: Konum adına göre arama yapın (ayrıca birden çok ad, kısmi eşleşmeler). • {YERLER/TARİHLER}: Ülke, konum ve tarih gruplarına göre arama yapın • Harita Konumuna Göre Görüntüler: İşaretçi konumundaki tüm görüntüleri göstermek için bir harita işaretçisine tıklayın. - Kamera GPS'inden gelen konum adları (şehir veya başka bir yer adı ve ülke) standartlaştırılmamıştır ve kaotik olabilir (ör. Munich, München, MONACO). Bununla nasıl başa çıkılacağı aşağıda tartışılmaktadır. - - TOPIC: ANA METAYI DÜZENLE +image: edit-meta.jpg - Ana Metayı Düzenle işlevi, bir görüntüye temel metadata eklemek için kullanılır. Ana Metayı Düzenle'yi kullanmadan önce lütfen (yukarıdaki) {KEYWORD'LERE GENEL BAKIŞ} ve {GEOTAGS OVERVIEW}'ı okuyun. - Ana Metayı Düzenle, en sık kullanılan metadata'yı düzenlemek için kullanılır: görüntü tarihi ve saati, derecelendirme, başlık, açıklama, konum verisi ve keyword'ler. İletişim kutusu başlangıçta geçerli görüntü için veriyi gösterir. Ekleme veya değişiklik yaptıktan sonra, görüntü dosyasını güncellemek için [Uygula]'ya basın. Metadata değişiklikleri için otomatik dosya sürümlemesi yoktur, ancak isterseniz Dosya Kaydet > Yeni Sürüm'ü kullanabilirsiniz. - İletişim kutusu, Dosya Görünümü'nde geçerli görüntü için veya Galeri Görünümü'nde tıklanan bir thumbnail için metadata'yı gösterir. Yeni bir görüntü açıldığında veya yeni bir thumbnail tıklandığında düzenleme iletişim kutusu kendini günceller. - Görüntünün tarihi, varsa, Görüntü Tarihi olarak gösterilir. Eksikse girilebilir veya değiştirilebilir. yyyy:mm:dd biçiminde tam bir tarih veya yyyy ya da yyyy:mm gibi daha kısa bir biçim girebilirsiniz. Eksik bir ay/gün, arama için düşük bir sınırla karşılaştırıldığında mantıksal olarak 01:01'e, yüksek bir sınırla karşılaştırıldığında ise 12:31'e eşdeğerdir. [Önceki] düğmesi, önceki girilen veriden tarihi doldurur. Bu, bir dizi görüntüye kolayca tarih vermeyi sağlamak içindir. Zaman önemliyse, hh:mm[.ss] biçimini kullanarak bir zaman ekleyebilirsiniz. Tüm giriş biçimi şudur: yyyy:mm:dd hh:mm:ss - Görüntü için bir başlık, açıklama ve derecelendirme (0-5 yıldız) girebilirsiniz. Başlığı veya açıklamayı düzenlemek için ilgili [düzenle] düğmesine basın. Bu, metin boyutu için büyük bir sınıra sahip bir metin düzenleyici açılır pencere gösterir. Kasıtlı bir satır sonu için [enter] tuşunu kullanabilirsiniz. Fotocx'te, bu satır sonları çalışır; diğer görüntü görüntüleyicilerinde, noktalarla değiştirilebilirler. - Mevcut keyword'ler Görüntü Keyword'leri'nde gösterilir. Mevcut keyword'ler aşağıdaki Tanımlı Keyword'ler penceresinde gösterilir. Bu keyword'lerden biri, üzerine tıklanarak görüntüye eklenebilir. Bir keyword, Görüntü Keyword'leri'nde üzerine tıklanarak görüntüden silinebilir. Son eklenen keyword'ler Son Keyword'ler'de gösterilir. Bu, aynı keyword'lerin çoğu tekrar kullanılacağından, yeni bir görüntü grubuna keyword eklemeyi kolaylaştırmak için bir kolaylıktır. Aynı şekilde işaret edip tıklayın. - Tanımlı keyword'ler listesi uzunsa, istenen keyword'ü Keyword Girin'e yazmak daha kolay olabilir. Şimdiye kadar yazdıklarınızla eşleşen mevcut keyword'ler Eşleşen Keyword'ler'de görünür ve keyword'ü görüntüye eklemek için bunlardan birine tıklayabilirsiniz. Girilen keyword yeniyse (eşleşen bir keyword gösterilmiyorsa), keyword tamamlandığında [yeni keyword ekle]'ye basın. Görüntüye ve "nocatg" kategorisiyle tanımlı keyword'ler listesine eklenecektir. - Keyword kategorileri kullanıyorsanız, bir kategori seçebilirsiniz ve tanımlı keyword'ler listesinde yalnızca o keyword'ler gösterilir. - [Uygula] düğmesi, veriyi görüntü dosyasına ve görüntüleri aramak için kullanılan metadata dizin dosyasına yazar. - [Önceki] düğmesi (iletişim kutusunun altında), önceden görüntülenen veya düzenlenen görüntüden mevcut tüm veriyi yüklemek için kullanılabilir. Bu, çoğu aynı veriyi paylaşan bir görüntü grubunun işlenmesini hızlandırmak için kullanılabilir. - ^Geotag Ekleme {ANA METAYI DÜZENLE} iletişim kutusunda konum adları ve coğrafi koordinatlar eklemenin birkaç yolu vardır. - Kamera GPS'i Kamera GPS sensörünüz konum adları ve coğrafi koordinatlar eklemiş olabilir. Dil istediğiniz dil olmayabilir veya tüm büyük harfler kullanılmış olabilir ya da başka bir kaos olabilir. Yeniden başlamak için [clear] düğmesini kullanın ve yeni metni girin. - [Bul] Düğmesi Görüntü dosyalarınızın herhangi bir yerinde veya bilinen konumların büyük bir listesinde (worldcities.txt) mevcut bir konumu arayın. Konum'a birkaç baştaki karakteri girin ve [Bul]'a basın. Eşleşen konumların bir seçim listesi gösterilirse, birini seçin. Hiçbir şey gösterilmiyorsa, bir harita konumuna tıklamak için [Harita]'yı kullanın. Gerekirse konum ve ülke adlarını düzeltin. Bu konum artık bilinmektedir ve seçilebilir. - [Önceki] Düğmesi Düzenlenmekte olan görüntü, önceden düzenlenen görüntüyle aynı konum verisine sahipse, daha önce kullanılan konum verisini doldurmak için [Önceki]'ye basın. - Birçok görüntü dosyasına aynı anda konum verisi eklemek için {TOPLU GEOTAG}'ı kullanabilirsiniz. - - TOPIC: HERHANGİ BİR METAYI DÜZENLE +image: edit-any-metadata.png - Bu, geçerli görüntü dosyası için herhangi bir metadata'yı düzenlemek için bir iletişim kutusudur. Düzenleme için en yaygın tag'ler solda listelenir. Geçerli görüntü dosyası için mevcut tüm tag'lerin bir listesini (yüzlerce olabilir) almak üzere [Tam Liste] düğmesine basın. Yaygın tag'ler listesine geri dönmek için [Kısa Liste]'ye basın. Geçerli tag değerini almak için listedeki bir tag'e tıklayın. İsterseniz değeri değiştirin ve [güncelle]'ye basın. Listede olmayan bir tag adını düzenlemek için, tag adını girin ve varsa mevcut değeri almak için [getir]'e basın. Ardından değeri girin veya değiştirin ve [güncelle]'ye basın. Bir tag'i silmek için [sil]'e basın. Tag adını küçük harfle ve boşluklu veya boşluksuz girebilirsiniz, ör. "Subject Distance" ve "subjectdistance" ikisi de çalışır. Bazı tag'ler değiştirilemez, ör. 'image width' görüntü piksel genişliğidir ve yalnızca görüntü piksel genişliği değiştirilerek değiştirilebilir. Kısa listenin kaynağı /meta_picklist metin dosyasıdır. Bu listeye tag ekleyebilir veya listeden tag kaldırabilirsiniz. - - TOPIC: METAYI SİL Silinecek tag adını belirtin veya Tümü'nü seçin. Metadata silinir. Bir görüntüde bulunabilecek herhangi bir tanımlayıcı bilgiyi temizlemek için Tümü'nü kullanın. Bazı tag'ler silinemez, ör. File Name. - - TOPIC: META KOPYALA Fotocx ile oluşturulan birleştirilmiş görüntüler (HDR, panorama, mashup ...) varsayılan olarak metadata içermeyecektir. Girdi görüntülerinden birinden veya başka herhangi bir görüntüden metadata kopyalamak için bu işlevi kullanın. Metadata'nın kaynağı olacak bir dosya ve metadata'yı alacak bir dosya ("hedef dosya" iletişim kutusunda) seçmek için [Göz At] düğmelerini kullanın. - - TOPIC: METAYI ONAR Metadata'yı düzenlemeye çalıştığınızda bir hata mesajı veren bir görüntü dosyanız varsa bu işlevi kullanın. Bozuk metadata'yı siler ve geri kalanını korur. - - TOPIC: KEYWORD'LERİ YÖNET +image: manage-keywords.png - Keyword'ler oluşturun ve isteğe bağlı olarak bunları kategorilere ayırın. Görüntülere keyword eklerken bunları düzenlemeye ve daha hızlı bulmaya yardımcı olması için keyword'lere kategoriler atayabilirsiniz. Bunlar isteğe bağlıdır ve keyword aramada hiçbir rol oynamazlar: bir görüntüde yalnızca keyword saklanır, kategorisi değil. Tipik kategoriler insanlar, yerler, nesneler, olaylar, manzara, binalar, sanat vb.dir. Yeni bir kategoriyle yeni bir keyword eklemek için kategoriyi ve keyword'ü girin, ardından [create]'a tıklayın. Kategori boşsa, keyword "nocatg"ye atanır. Bir keyword'ü farklı bir kategoriye atamak için, bir kategoriye (kalın metin) tıklayın veya yeni bir tane girin, keyword'e tıklayın ve [create]'a basın. Keyword eski kategoriden yeniye taşınacaktır. Bir keyword'ü silmek için, keyword'e tıklayın ve [sil]'e basın. Görüntülerde kullanılan ancak bir kategoriye atanmamış keyword'ler "nocatg" altında görünecektir. Hiçbir keyword atanmamış bir Kategori silinebilir - kategoriye tıklayın, varsa keyword adını temizleyin, [sil]'e basın. - Not: yeni oluşturulan bir keyword, kategorisinin keyword listesinin sonuna eklenir. Fotocx bir sonraki başlatıldığında, "nocatg" her zaman sonuncusu olmak üzere tüm kategoriler ve keyword listeleri alfabetik olarak sıralanır. - - TOPIC: BAŞLIKLAR +image: choose-captions.png - ^Başlıkları Seç menüsü Dosya görünümü modunda görüntünün sol üst köşesinde görüntülenen metin başlıkları için hangi metadata tag'lerinin kullanılacağını seçin. - ^Başlıkları Aç/Kapat menüsü Başlıkların görüntülenmesini AÇIK veya KAPALI olarak değiştirin. Başlık görüntülemeyi hızlıca etkinleştirmek veya devre dışı bırakmak için bir klavye kısayolu atayın. - ^Not:^ fareyi dosya görünümündeki bir görüntünün sol üst köşesine getirmek, açılır bir görüntüde başlığı ve açıklamayı gösterir. Fare uzaklaştırıldığında görüntü kaybolur. - - TOPIC: YERLER/TARİHLER +image: image-locations.jpg - Bu, belirli bir konumda veya konum ve tarih aralığında çekilen tüm fotoğrafları bulmanın hızlı bir yoludur. İletişim kutusunda, iki seçenekten birini seçin: rapora tüm görüntüleri dahil et veya yalnızca önceki Arama işlevi tarafından bulunan görüntüleri dahil et. Ardından istenen gruplama seviyesini seçin: ülke ülke ve konum ülke ve tarih ülke ve konum ve tarih tarih ve ülke tarih ve ülke ve konum - Tarih dahil edilirse, birleştirme için bir gün aralığı seçin: aralıktaki tarihlere sahip fotoğraflar ilk tarih altında gruplandırılır. Her grupta ülkeye, ülke ve konuma vb. göre görüntü sayısını gösteren bir rapor almak için [proceed]'e basın. Bu aynı zamanda sıralama düzenidir. Yukarıdaki örnekte, 2004.11.02 tarihinde Yeni Zelanda'dan 28 fotoğraf vardır. Bu görüntülerin bir thumbnail galerisini almak için raporda bir satıra tıklayın. - - TOPIC: ZAMAN ÇİZELGESİ +image: timeline-report.jpg - Bu rapor, aya göre görüntü sayılarının bir zaman çizelgesini oluşturur. İki seçenekten birini seçin: rapora tüm görüntüleri dahil et veya yalnızca önceki Arama işlevi tarafından bulunan görüntüleri dahil et. Ortaya çıkan raporda seçilen aydaki bir fotoğraf tarihine (EXIF) sahip tüm görüntülerin bir thumbnail galerisini almak için bir yıl ve ay üzerine tıklayın. Yukarıdaki örnek, Ekim 2017 için 208 görüntü göstermektedir. 'null' yılı, fotoğraf tarihi olmayan görüntüler içindir. - - TOPIC: METADATA TAG'LERİ Bu işlev, belirtilen bir metadata tag'i ve değerini kullanan tüm görüntü dosyalarını bulur. Açılır listeden bir tag seçin: rating, keywords, title, description, camera, ekstra dizinlenmiş metadata - bkz. {DOSYALARI DİZİNLE}. Mevcut tag değerlerinin bir listesi, bu tag değerini kullanan görüntü dosyası sayısıyla birlikte gösterilir. 'title' ve 'description' için, yalnızca ilk 60 karakter gösterilir ve bu ilk 60 karakterle eşleşen tag değerlerini kullanan tüm dosyalar raporlanır. 'camera' için eşleşme değeri, marka, model ve lensin bir kombinasyonudur. - - TOPIC: OTOMATİK ARAMA Bu işlev, Görüntüleri Ara işlevi kullanılırken mevcut olan seçim kriterlerinden herhangi birini karşılayan görüntü dosyalarını çıkarmak için kabuk betik dosyaları tarafından kullanılabilir (aşağıya bakın). Önce, istenen seçim kriterlerini (ör. klasör/dosya adları, tarihler, keyword'ler veya diğer metadata) ayarlamak için Görüntüleri Ara işlevini kullanın. Kriterleri bir ayarlar dosyasına kaydetmek için [kaydet] düğmesini kullanın. Fotocx'i başlatmak ve aramayı gerçekleştirmek için şu komutu kullanın: $ fotocx -m autosearch . Çıktı /search_results içine gider. - - TOPIC: GÖRÜNTÜLERİ ARA İstenen herhangi bir metadata'ya (tarih, keyword'ler, konum ...) sahip görüntüleri bulmak için Görüntüleri Ara işlevini kullanın. Arama için bir metadata dizin dosyası kullanılır, bu da saniyede binlerce görüntüyü aramayı mümkün kılar. - İki rapor biçimi vardır: arama kriterleriyle eşleşen tüm görüntüleri gösteren bir thumbnail galerisi veya thumbnail'leri metadata metniyle birleştiren bir metadata raporu. İşte metadata raporu biçiminin bir örneği: +image: search-images-metadata.jpg - ^Arama İletişim Kutusu +image: search-images.jpg - İletişim kutusunda, hangi görüntülerin aranacağını seçin: ya tümü (tüm görüntüler) ya da geçerli küme, yani bir klasör, albüm veya önceki bir görüntü aramasının sonuçları olabilen geçerli galerideki görüntüler. - Ardından, bulunan eşleşen görüntülerle ne yapılacağını seçin: 'yeni küme' geçerli kümeyi bulunan görüntülerle değiştirmek, 'ekle' bunları geçerli kümeye (galeriye) eklemek ve 'kaldır' bunları geçerli kümeden kaldırmak anlamına gelir. Görüntüleri kaldırmak için geçerli kümede arama yapmalısınız. - Seçim kriterleriyle eşleşen dosyalar için, hangi sürümlerin seçildiğini de belirtebilirsiniz: orijinal, son sürüm veya tüm sürümler. 'orijinal', orijinal veya değiştirilmemiş görüntü anlamına gelir (orijinal kaydedilmemişse ilk sürüm). 'son sürüm', mevcut en son veya en son düzenlenen sürüm anlamına gelir. 'tüm sürümler', orijinalin ve tüm sürümlerin alınacağı anlamına gelir. - İstenen rapor türünü seçin. Galeri raporu, arama kriterleriyle eşleşen tüm görüntüleri tutmak için gereken kadar uzun bir thumbnail görüntüleri sayfasıdır. Metadata raporu hem thumbnail görüntülerine hem de her thumbnail'in yanında bir metadata tag'i listesine sahiptir. Bunlar standart tag'leri (tarih, derecelendirme, keyword'ler, geotag'ler, başlık, açıklama) ve tag seçim listesine eklediğiniz diğer metadata tag'lerini içerir (aşağıya bakın). - Arama kriterlerinizi girin. İstenen keyword'leri, tarihleri, yıldız derecelendirmelerini, metinde bulunan kelimeleri (görüntü başlığı veya açıklaması), dosya veya klasör adlarını ve konum adlarını seçin. Daha fazla ayrıntı için aşağıya bakın. - Mevcut keyword'ler Tanımlı Keyword'ler'de gösterilir ve işaretleyip tıklayarak seçilebilir. Tanımlı keyword'ler listesi uzunsa, 'keyword girin'e bir keyword yazmaya başlamak daha kolay olabilir. Şimdiye kadar yazılanlarla eşleşen mevcut keyword'ler 'eşleşmeler' listesinde görünecektir ve keyword'ü arama listesine eklemek için bunlardan birine tıklayabilirsiniz. - Keyword kategorileri kullanıyorsanız, bir kategori seçebilirsiniz ve tanımlı keyword'ler listesinde yalnızca o keyword'ler gösterilir. - Aramayı tarih aralığındaki görüntülerle sınırlamak için bir tarih aralığı girilebilir. Fotoğraf tarihini (kameradan) veya dosya tarihini (oluşturma veya son değiştirme tarihi) seçin. Biçim yyyy:mm:dd şeklindedir. Varsa ilk tarihte veya sonrasında ve varsa ikinci tarihte veya öncesinde tarihe sahip görüntüler seçilir. Eksik ay/gün, düşük tarih sınırı için 01/01'e ve yüksek sınır için 12/31'e varsayılan olarak ayarlanır. Saatler isteğe bağlı olarak yyyy:mm:dd hh:mm biçimi kullanılarak belirtilebilir. Eksik saatler varsayılan olarak 00:00 ve 23:59'dur. - EXIF fotoğraf tarihi olmayan görüntüleri (ör. taranmış görüntüler) aramak için ilk tarih girişinde "null" kullanın. - Sonuçları verilen aralıktaki bir derecelendirmeye sahip görüntülerle sınırlamak için bir çift yıldız derecelendirmesi girilebilir. Eksik bir düşük değer 0 yıldız anlamına gelir ve eksik bir yüksek değer en yüksek derecelendirme olan 5 yıldız anlamına gelir. - Klasör ve dosya adları aranabilir. Dosya adlarını ara alanına, görüntü klasörleriniz ve dosya adlarınız için kullanılan herhangi sayıda adı, virgülle ayırarak girin. "egypt cairo" girişi, bu dizelerden herhangi birini içeren tüm görüntü klasörü veya dosya adlarıyla eşleşir. Alt dizeler de eşleşir. Büyük/küçük harf önemli değildir. - Görüntü başlığı ve açıklaması aranabilir. Başlık/açıklama ara alanına aranacak kelimeleri virgülle ayırarak girin. Bunlar tüm görüntülerin başlığındaki ve açıklamasındaki her kelimeyle eşleştirilir ve eşleşen görüntüler seçilir. Büyük/küçük harf önemli değildir. - Konumları aramak için, konumları ara alanına virgülle ayırarak bir veya daha fazla şehir/konum veya ülke adı girin. Yalnızca girilen konumlardan biriyle eşleşen geotag'lere sahip görüntü dosyaları seçilir. Bir konum bir şehir, park veya başka bir coğrafi ad olabilir (metadata 'City' ve 'Country' alanlarında ne saklanıyorsa). Büyük/küçük harf önemli değildir. - 'tümü' ve 'herhangi biri' radyo düğmeleri keyword'lere, metne, dosya adlarına ve konumlara uygulanır. Girilen tüm dizelere sahip görüntüleri veya girilen dizelerden HERHANGİ BİRİNE sahip görüntüleri seçebilirsiniz. Örnek: konum arama alanı "new york" ise ve "herhangi biri" seçiliyse, Yeni Zelanda'dan ve York, İngiltere'den görüntüler dahil edilir. "tümü" seçiliyse, yalnızca New York'ta bulunan görüntüler dahil edilir. - Eksik verisi olan görüntüleri bulmak isterseniz, eşleşme değeri olarak "null" girebilirsiniz. - ^Ek Metadata Ara İletişim kutusu girdilerini 'tagadı', 'koşul' ve 'eşleşme değerleri' kullanarak, seçim kriterleri olarak kullanılacak veya "metadata" rapor türü seçilirse rapor çıktısına eklenecek ek metadata tag'leri belirtebilirsiniz. Belirli bir görüntü dosyası için mevcut tag'ler {TÜM METAYI GÖRÜNTÜLE} ile gösterilebilir. Bunlar, ana iletişim kutusunda bulunmayan birçok tag'i içerir. Seçim listesi /meta_picklist metin dosyasından gelir. İsterseniz bu dosyaya tag ekleyebilirsiniz. Ana iletişim kutusunda da bulunan tag'leri kullanabilirsiniz. Buradaki avantaj, daha esnek eşleştirme mantığının kullanılabilmesidir. - Eşleştirme mantığı her metadata tag'i için seçilebilir. ^eşleştirme yöntemi seçim için eşleşme değeri • report herhangi bir değer, eksik olan da dahil • reportx eksik olmayan değer • matches virgülle ayrılmış metin değerleri • contains aynı, alt dize eşleştirmeyle • number = eşit değerler • number => eşit veya daha büyük değerler • number <= eşit veya daha küçük değerler - Sağ taraftaki [X] düğmeleri tek tek metadata arama tag'lerini temizlemek için kullanılabilir. - ^İletişim Kutusu Düğmeleri [Yükle] ve [Kaydet], arama kriterlerini bir dosyadan yüklemek veya dosyaya kaydetmek için kullanılabilir. [Temizle], iletişim kutusundaki tüm veriyi temizler. [Devam Et], arama işlemini başlatır. - Aramayı gerçekleştirmek için [proceed] düğmesine basın. Çıktı, standart bir thumbnail galerisi veya yukarıda gösterilen metadata raporu biçimidir. Aranan görüntüleri kalıcı bir albüm olarak kaydedebilirsiniz - bkz. {ALBÜMLER}. - ^Performans Dizinlenmiş metadata'nın aranması ve raporlanması neredeyse anlıktır. Dizinlenmemiş metadata için hız, bilgisayar ve disk hızına bağlıdır. SSD diskli güçlü bir bilgisayar dakikada 100 binden fazla dosyayı arayabilir. - ^search_results^ (albüm) Görüntüleri Ara'nın çıktısı "search_results" albümünde kaydedilir. Daha sonraki bir aramanın bunun yerini almasını istemiyorsanız bu albümü yeniden adlandırın. - Sınırlama: Arama işlevi 40.000 sonuçla (arama kriterlerini karşılayan bulunan görüntüler) sınırlıdır. Bu sınır aşılırsa, bilgilendirilirsiniz ve arama kısaltılır. Bu sınır, GTK'da kaydırılan bir pencerenin boyutunun sınırlı olması nedeniyle vardır ve daha büyük bir pencere oluşturma girişimi çökme veya kilitlenmeyle sonuçlanabilir. - - TOPIC: SEÇ MENÜSÜ - - TOPIC: ALAN GENEL GÖRÜNÜMÜ Düzenleme işlevleri normalde tüm görüntüye uygulanır, ancak bir görüntünün bir kısmını (bir "alan") düzenlemek ve gerisini değiştirmeden bırakmak mümkündür. Bir görüntü alanı seçilmişse, çoğu düzenleme işlevi yalnızca bu alan içinde çalışır. Bazı işlevler (ör. Yeniden Ölçekle) seçili bir alanı yok sayar. Bir alan, bir düzenleme işlevi başlatılmadan önce veya bir düzenleme işlevi kullanılırken seçilebilir. Seçili alan hemen etkin hale gelir, önceki düzenlemeler korunur ve gelecekteki düzenlemeler yalnızca alan içinde uygulanır. Başka bir düzenleme başlatılırsa, seçili alan etkin kalır, böylece bir alan içinde bir dizi düzenleme yapmak mümkündür. Bir alan, görüntüde birden çok bağlantısız alan da olabilir. - Fotocx, 'katmanlar' yerine 'alanlar' kullanır. Görüntüden bir şey seçip, seçimden ayrı bir katman oluşturup, katmanı düzenleyip son olarak katmanı birleştirmek yerine, görüntüde bir şey seçersiniz, seçim üzerinde düzenleme işlevleri gerçekleştirirsiniz ve son sonucu hemen görürsünüz. Alanlar ayrıca kaydedilebilir, başka bir görüntüye yapıştırılabilir, hareket ettirilip yeniden ölçeklenebilir ve daha fazla düzenlenebilir. - +image: edit-selection.jpg - Seçili bir alanı düzenlemek bazen alanın kenarlarında görünür sınırlarla sonuçlanabilir (bazen bunlar görüntüdeki öznitelik kenarlarına karşılık gelir ve bu nedenle sorun değildir). {ALAN KARIŞTIRMA} kullanarak kenarları karıştırabilirsiniz: düzenlemeler alan kenarından içe doğru kademeli olarak uygulanabilir ve hangi kenarların karıştırılacağını seçebilirsiniz. - - TOPIC: ALAN SEÇ +image: select-area.jpg - Alan Seç iletişim kutusu, Seç > Alan Seç menüsüyle başlar. Aşağıda açıklanan yöntemlerden birini seçin. Her yöntem görüntü alanlarını farklı bir şekilde seçer. Yöntemleri istediğiniz zaman değiştirebilirsiniz ve seçili alanlar birikir. Seçime alan eklerken veya seçimden alan kaldırırken, seçili görüntü alan(lar)ının bir taslağı gösterilir. [Bitir] düğmesi, sonraki düzenleme işlevlerini uygulamaya hazır hale getirmek için alan taslakları içindeki görüntü piksellerini haritalandırmak için kullanılır. [Gizle] düğmesi alan taslağını gizler, bu da alan kenarı taslağının müdahalesi olmadan düzenlemelerin etkilerini ve olası alan kenarı etkilerini daha iyi görmenizi sağlar. Taslağı göstermek için [Göster] düğmesini kullanın. [Temizle] düğmesi tüm alan seçimlerini kaldırır. Alan seçme iletişim kutusu iptal edilebilir ve mevcut alanları değiştirmek veya yeni alanlar eklemek için daha sonra yeniden başlatılabilir. - ^Yöntemler Aşağıdaki yöntemler, son alana ait olacak bir veya daha fazla görüntü alanını çevrelemek için kullanılır. Bu yöntemler, birleşik veya ayrı alanları tanımlamak için herhangi bir sırada kullanılabilir. • Dikdörtgen - dikdörtgen bir alanı çevrelemek için sürükleyin • Elips - dairesel veya eliptik bir alanı çevrelemek için sürükleyin • Serbest El Çizimi - fareyle çizerek bir alanı çevreleyin • Kenarı Takip Et - görüntü öznitelik kenarlarını takip ederek çevreleyin • Fare içindeki alanı seç - fare imleci etrafındaki bir daire içindeki pikselleri seçmek için sürükleyin. • Fare içinde tek bir renk seç - yalnızca verilen bir renkle eşleşen pikselleri seçin, %0-100 eşleşme. • Fare içindeki tüm renkleri seç - fare içindeki tüm pikselleri seçin, seçimi fare içindeki renklerle eşleşen renklere sahip bitişik alanlara genişletin (bazen 'flood' olarak adlandırılır). - Aşağıdaki paragraflar her yöntemin ayrıntılarını açıklar. - ^Dikdörtgen Seçilecek dikdörtgen bir alanın bir köşesinden karşı köşesine fareyi sürükleyin. Alanı çevrelemek için bir dikdörtgen çizilir. Silmek ve yeniden başlamak için sağ tıklayın. Daha fazla dikdörtgen alan seçmek için işlemi tekrarlayın. - ^Elips Bu, çevrelenen alanın bir daire veya elips olması dışında dikdörtgen seçimiyle aynı şekilde çalışır. Sürükleme başlangıç konumu, ortaya çıkan elipsin merkezidir. Sürüklemenin açısı elipsin şeklini belirler. - ^Serbest El Çizimi Serbest el çizgisi çizmek için fareyi (sol düğme basılı) sürükleyin veya çizilen son noktadan tıklanan noktaya düz bir çizgi bağlamak için sol tıklayın. Bağlı eğriler ve çizgilerle çevrelenene kadar hedef alan etrafında devam edin. Önceki çizgileri (hataları) kaldırmak için sağ tıklayın. Sağ tıklama, en fazla 50 piksele kadar önceki tıklanan veya sürüklenen çizgiyi kaldırır. Daha fazlasını kaldırmak için sağ tıklamayı tekrarlayın. Yeni tıklanan bir çizgi her zaman önceki çizginin sonuna bağlanır. Yeni sürüklenen bir çizgi, o çizginin sonuna yakın başlatılırsa önceki çizgiye bağlanır. Başka bir yerde başlatılırsa, bağlantısız bir çizgi çizilir. Uzaktan yeni bir sürükleme başlatıp önceki çizgiyle buluşacak şekilde geri çizebilirsiniz. Tıklanan bir çizgi istenmeyen bir noktaya bağlanırsa (yani çizilen son çizgiye bağlanmak istemiyorsanız), silmek için sağ tıklayın ve ardından yeni bir çizgi dizisi başlatmak için sürükleme kullanın. Bir çizgi segmentini silmek için sağ düğme sürüklemesi kullanılabilir: silmek için bir çizgi boyunca yakından sağ sürükleyin, ardından çizgiyi yeniden çizmek için sol sürükleyin. Sonunda, bir alan boşluk olmadan tamamen çevrelenmiş olmalıdır. Uçlarda biraz örtüşen çizgiler sorun değildir. Boşlukları bulmak ve düzeltmek zor olabilir, bu yüzden %100 görüntü boyutunda veya daha büyük çalışın ve dikkatli olun. Sol tıklamalarla otomatik olarak bağlanan bir dizi çizgi boşluk bırakmaz, ancak bu sıradan sapma boşluk oluşturma olasılığı yüksektir. Boşluk olasılığını azaltmak için, çizgileri elle bağlarken kasıtlı örtüşmeler kullanın. Aşağıda açıklanan bir boşluk tespit aracı vardır - {ALAN BOŞLUĞU BUL}. Bir alan kenarı aynı zamanda bir görüntü kenarıysa, alanın bu kısmını çizmek zorunda değilsiniz. Çizgiyi görüntü kenarının dışına çizin ve görüntü kenarı boyunca başka bir konumda tekrar görüntünün üzerine çizin. - ^Kenarı Takip Et Çizilen son nokta ile yeni tıklanan konum arasındaki yüksek kontrastlı pikseller (muhtemelen görüntü öznitelik kenarları) bulunur ve bağlanır. Bu, çok düzensiz olmayan net kenarlar için etkilidir. Bulanık ve pürüzlü kenarlar iyi çalışmayabilir ve yüksek hassasiyet gerekiyorsa serbest el çizimi gerekecektir. Çizgileri bağlama kuralları yukarıda açıklananla aynıdır. Tıklamak yerine fareyi sürüklemek serbest el çizimi gibi çalışır, ancak fareden biraz geride bir konumdan öznitelik kenarlarını takip etme eğilimiyle. Çok düzensiz kenarlar için (saç, yapraklar), aşağıdaki 'renk seçimini kaldır'a bakın. - ^Fare Yarıçapı ve Renk Eşleşme Seviyesi Bu iki kontrol yalnızca aşağıda açıklanan 'fare içinde seç' yöntemlerine uygulanır. Fare yarıçapı, fare imleci etrafındaki bir dairenin boyutunu tanımlar. Daire içindeki pikseller seçilir veya fare dairesinden dışa doğru piksel eşleştirme ve seçme için bir renk kümesi sağlarlar. Eşleşme seviyesi, piksellerin rengine ve parlaklığına göre seçilmesi için gereken bir eşleşme seviyesini (%0-100) tanımlar. '0' herhangi bir şeyin eşleştiği, '100' ise mükemmel bir eşleşmenin gerekli olduğu anlamına gelir. - ^Fare içindeki alanı seç Sol tıklama veya sürükleme, fare dairesi tarafından çevrelenen pikselleri seçer. Sağ tıklama son seçimi kaldırır (daha fazlasını kaldırmak için tekrarlayın). Sağ sürükleme çevrelenen piksellerin seçimini kaldırır. - ^Fare içinde tek bir renk seç Bir renk seçmek için görüntüye tıklayın. Renk, renk düğmesinde gösterilir. Doğrudan bir renk ayarlamak için düğmeyi de kullanabilirsiniz. Eşleşme seviyesi içinde seçili renkle eşleşen fare dairesi içindeki pikselleri seçmek/seçimini kaldırmak için sol/sağ sürükleyin. Daha geniş veya daha dar bir renk aralığını eşleştirmek için eşleşme seviyesini aşağı veya yukarı ayarlayın. Eşleştirilecek rengi değiştirmek için gerektiğinde görüntüye tıklayın. - ^İsteğe bağlı seçimi kaldırma rengi Bu yalnızca yukarıdaki 'tek renk seç'e uygulanır. Bir seçimi kaldırma rengi ayarlamak için görüntüye sol tıklayın. Kutu işaretliyse, seçimi kaldırma rengi etkindir. Bir piksel, seçim rengine göre seçimi kaldırma rengiyle daha iyi eşleşiyorsa, pikselin seçimi kaldırılır. Seçili kalmaması gereken bitişik bir alana kıyasla düşük renk kontrastına sahip bir öznitelik kenarı boyunca seçim yaparken, seçimi kaldırma rengini bitişik alandan ayarlayın. Bu, saç veya yapraklar gibi karmaşık bir kenarın doğru seçimi için yardımcı olur. Aşağıdaki örnek, deneyimli bir kullanıcı için 5-10 dakikalık bir projedir. Alan Karıştırma (aşağıda) da kullanılmıştır. - +image: select-hairy.jpg - ^Fare içindeki tüm renkleri seç Bazı düzenleyicilerde buna 'flood' denir. Fare dairesi içindeki pikselleri seçmek/seçimini kaldırmak için sol/sağ sürükleyin. Fare dairesinin ötesindeki pikseller de şu iki koşulu karşılıyorlarsa dahil edilir: 1) renkleri, geçerli eşleşme seviyesi içinde fare dairesi içindeki herhangi bir renkle eşleşiyor. 2) fare imlecinin arama aralığı içindeler. Bu, fare yarıçapının bir faktörüdür, ör. fare yarıçapı 20 ve arama aralığı 3 ise, arama aralığı fare imlecinden 60 pikseldir. Dahil etmek istediğiniz yeni alanlar üzerinde fareyi sürükleyin. Seçili alanın, fare dairesi içindeki renklerle eşleşen renklere sahip alanlara genişlediğini izleyin. Çok ileri giderseniz, son seçimi kaldırmak için sağ tıklayın. Daha önceki seçimleri daha fazla kaldırmak gerekirse tekrarlayın. Daha ince kontrol elde etmek için yarıçapı azaltın veya eşleşme seviyesini artırın - seçim daha yavaş genişler ve fare dairesine daha yakın kalır. Bir görüntü öznitelik kenarını takip etmek ve kenara kadar iyi hassasiyetle pikselleri seçmek için küçük bir yarıçap ve yüksek bir eşleşme seviyesi kullanılabilir. Kenar işi tamamlandıktan sonra, geri kalanını seçmek için fare içindeki alanı seç yöntemini kullanın. Sağ sürükleme, seçimi kaldırma olarak davranır: fare dairesi içindeki pikseller ve arama aralığındaki eşleşen pikseller seçimden çıkarılır. Bir seçim çok ileri giderse, bunu içeriden seçmek yerine seçili alanın dışından seçimi kaldırarak düzeltmek genellikle daha kolaydır. Bunun için bir his edinmek ve verimli çalışabilmek için biraz pratik yapmanız gerekebilir. - ^Fare içindeki tüm renkleri seç - özet • sol sürükle - fare içindeki pikselleri ve aralıktaki eşleşen pikselleri seç • sağ tık - önceki seçimi geri al, daha fazlasının seçimini kaldırmak için tekrarla • sağ sürükle - fare içindeki pikselleri ve aralıktaki eşleşen pikselleri seçimden çıkar - ^Kenar kayması Bitirilmiş (aşağıya bakın) bir alan, 1 piksellik adımlarla genişletilebilir veya daraltılabilir. Bu, renklere göre eşleştirilerek seçilen bir alan parlaklığını değiştirecek şekilde düzenlendiğinde kenar etkilerini azaltmaya yardımcı olabilir. Renge göre seçim, özniteliğin arka plana geçtiği bir kenar boyunca az seçilmiş veya fazla seçilmiş dar bir piksel bandı bırakabilir. Alanı 1-2 piksel genişletmek veya daraltmak daha temiz görünen bir kenar üretebilir. Alan, kaymadan sonra bitirilmiş kalır (aşağıya bakın). - ^Alan taslağı rengi Fare seçim dairesi ve alan taslağı için kullanılan renk, renk düğmelerinden birine tıklanarak istediğiniz zaman değiştirilebilir. Bu, çeşitli görüntü renklerine karşı iyi görünürlük sağlar. - ^Göster/Gizle Alan taslaklarını gizlemek için [Gizle]'yi kullanın. Bu, alan taslağının müdahalesi olmadan alan düzenlemelerinin etkilerini daha iyi görmek için kullanışlıdır. Taslakları göstermek ve alanı düzenlemeye devam etmek için [Göster]'i kullanın. - ^Bitir +image: select-area-finish.png - Bir alan, başarıyla bitirilene kadar düzenlemeler için etkili değildir. Bitir, çizilen taslakları doğrular ve görsel kontrol için çevrelenen pikselleri renklendirir. Alanları çevrelemeyi bitirdiğinizde, işlemi tamamlamak için [Bitir] düğmesini kullanın. Yukarıda gösterilen açılır iletişim kutusu, bitirmek için kullanabileceğiniz iki yöntemi özetlemektedir. - Yöntem 1: Elle çevrelenen alanların içine fareyle sol tıklayın. Çevrelenen alanlar geçici olarak renklendirilir, böylece nihai sonucun amaçladığınız şey olduğunu doğrulayabilirsiniz. Açıkça çevrelenmemiş olanlar da dahil olmak üzere çevrelenen herhangi bir alan seçilebilir: bir delikli çörek şekliniz varsa, çöreği, deliği veya her ikisini de seçebilirsiniz. Tüm alanlar tıklanıp doğru şekilde renklendirildiğinde [keep]'a basın. Elle çizilen bir alanın taslağında bir boşluk varsa, renklendirme işlemi "dışarı sızacak" ve çevrelemenin dışındaki alanlar renklendirilecektir. Bu durumda, orijinal alan taslağını geri yükleyen Bitir iletişim kutusundaki [Geri Al]'a basın. Taslaktaki boşluğu bulup kapatın, ardından [Bitir]'i tekrar deneyin. Büyük bir alandaki 1 piksellik bir boşluğu bulmak zor olabilir. Daha iyi görmek için yakınlaştırın. Küçük boşlukları bulmak için hızlı bir yöntem için aşağıdaki {ALAN BOŞLUĞU BUL} işlevine bakın. - Yöntem 2: Çevrelenen tüm alanların dışındaki bir yere sağ tıklayın. Çevrelenen tüm alanlar görsel doğrulama için renklendirilir. Bir boşluk varsa, sonuçlar ve düzeltme yöntem 1'de açıklananla aynıdır. Bu yöntem, elle çevrelenmiş birçok alanınız varsa ve bunları yöntem 1'i kullanarak tek tek kontrol etmek istemiyorsanız mantıklıdır. - 'Fare içinde seç' yöntemleri kullanılarak seçilen alanlar otomatik olarak bitirilir. Bu alanlar seçim işlemi sırasında haritalandırılırken, dikdörtgen, elips veya çizgi çizme yöntemlerinden biriyle seçilen alanlar yalnızca içlerine tıkladığınızda haritalandırılır. Yalnızca 'fare içinde seç' yöntemlerini kullanıyorsanız, seçili alanlardan herhangi birine tıklamadan [keep]'a basabilirsiniz. - Görüntünün bir kenarından diğerine bir çizgi çizerseniz, çizginin o tarafındaki tüm piksellerden oluşan bir alan yapmak için çizginin her iki tarafına da tıklayabilirsiniz. Örnek: gökyüzü ve kara arasındaki sınıra yatay bir çizgi çizin. Gökyüzünü seçmek için çizginin üzerine, karayı seçmek için çizginin altına tıklayın. Çizilen çizgiler görüntü kenarlarına tamamen ulaşmalıdır. - ^Temizle Geçerli alanı kalıcı olarak at. - - TOPIC: ALAN BOŞLUĞU BUL Bir alan taslağı, birden çok vuruş kullanılarak serbest el çizimiyle oluşturulduysa, 4x yakınlaştırmanın altında görünmeyen küçük boşluklar bırakmak kolaydır. Böyle bir alanı bitirme girişimi başarısız olur çünkü iç piksellerin haritalanması boşluktan dışarı sızar ve amaçlanan alanın dışındaki alanları kaplar. Bitir işlevi başarısız olursa, bu işlev boşluğu bulabilir. Başarısız alanın taslağı üzerinde bir yere tıklayın. Taslak, bir "uç piksel" bulunana kadar tıklanan konumdan bir yönde yavaşça yeniden çizilecektir. Boşluk buradadır. Ardından taslak, boşluk (veya başka biri) karşılaşılana kadar ters yönde çizilir. Boşluk, çizimin durduğu yerdir. Boşluğu yakınlaştırın ve serbest el çizimi kullanarak kapatın, ardından tam taslağın durmadan çizilip çizilemeyeceğini görmek için tekrar test edin. Bu işlev, Alan Seç işleviyle paralel olarak kullanılabilir - her iki iletişim kutusu da etkin olabilir. - - TOPIC: ALAN KARIŞTIRMA +image: area-blend.jpg - Bu araçta iki işlev bulunur: Alan Karıştırma ve Alan Kenar Karıştırma. Her iki işlev de, önceki bir düzenlemeyi veya orijinal görüntüyü karıştırarak seçili bir alan içinde yapılan bir düzenlemeyi kademeli olarak 'geri alabilir'. Yukarıdaki örnekte, arka plandaki dört adam, aydınlatılmış ve değiştirilmemiş pikseller arasında herhangi bir sınır kanıtı olmadan aydınlatıldı. - ^Alan Karıştırma Düzenlenmiş bir seçili alanın herhangi bir kısmı orijinal görüntüyle karıştırılabilir. Karıştırılacak bölgeler üzerinde sol fare sürüklemeleri kullanın. Alan içindeki her fare sürüklemesi, seçili önceki görüntüyü kademeli olarak karıştırır, alan içinde yapılan düzenlemeyi etkili bir şekilde azaltır veya kaldırır. Karıştırma hızı, fare dairesinin merkezi ve kenarı için ayrı ayrı ayarlanabilen 'karıştırma oranı' tarafından belirlenir. Fare yarıçapını ve karıştırma oranlarını ayarlayın (ör. fare merkezi/kenarı için 50/0). Karıştırılacak alan bölgeleri üzerinde fareyi sürükleyin. Karıştırmak için sol sürükleme, karıştırmayı geri almak veya geri yüklemek için sağ sürükleme kullanın. Bu yöntemi alan kenarlarını seçici olarak karıştırmak için kullanabilirsiniz: küçük bir yarıçap kullanın ve karıştırılacak kenarlar üzerinde fare merkezini sürükleyin. Bu, kenardan içe doğru kademeli bir karıştırma ile sonuçlanır. - ^Alan Kenar Karıştırma Bazen düzenlenmiş bir alan, düzenlenmiş alan ile çevresindeki görüntü arasındaki keskin bir sınır nedeniyle doğal görünmeyen kenarlara sahip olabilir (özellikle alan aydınlatıldıysa). Bu, kenarlar boyunca bir şerit için alan düzenlemesini kademeli olarak dışarı doğru karıştırarak etkili bir şekilde görünmez hale getirilebilir. Alan düzenlemesi, alan kenarından %100 kaldırılabilir ve şeridin genişliği boyunca içe doğru %0'a kadar azalabilir. Alan kenarlarını karıştırmanın iki yolu vardır: 'karıştır' ve 'bulanıklaştır'. Karıştır, kenar şeridini seçilen önceki düzenleme veya orijinal görüntüyle karıştırır. Bulanıklaştır, şeridi şeridin dışından komşu piksellerle karıştırır. Karıştırmanın genişliğini 'karıştırma genişliği' veya 'bulanıklık genişliği' girdisiyle ayarlayın. - Alan kenarı 'Karıştır' ve 'Bulanıklaştır', bir kenar mesafesi hesaplaması gerektirir: her alan pikselinden en yakın alan kenarına olan mesafe. Bu mesafe, piksel için göreli karıştırmayı hesaplamak üzere kullanılır: alan kenarında %100 ve kenardan 'karıştırma genişliği'nin ötesindeki pikseller için %0. Karmaşık bir kenara sahip büyük bir alan için bu biraz zaman alabilir. Üst panelde bir ilerleme göstergesi gösterilir. - - TOPIC: ALANI GÖSTER/GİZLE Geçerli alanın taslağını göster veya gizle. Alan bir düzenleme işleviyle değiştirilirken alanı gizlemek kullanışlıdır. Bu, düzenlemenin etkilerini değerlendirmeyi kolaylaştırır. Bunlar Alan Seç iletişim kutusunda düğmeler olarak da mevcuttur. - - TOPIC: ALANI ETKİNLEŞTİR/DEVRE DIŞI BIRAK Geçerli alanı devre dışı bırakın ve verisini daha sonra yeniden etkinleştirilebilmesi için saklayın (Etkinleştir menüsü). Bu, seçili bir alan içindeki düzenlemeler ile tüm görüntü için düzenlemeler arasında geçiş yapmanızı sağlar. - - TOPIC: ALANI TERSİNE ÇEVİR Mevcut bir alanı tersine çevirin: mevcut alan hariç tüm görüntü seçilir. İşlevi iki kez kullanmak orijinal seçili alanı geri getirir. Seçili bir alanı tersine çevirmek, alan kenarı karıştırması isteniyorsa tekrarlanması gereken kenar hesaplamasını geçersiz kılar. - - TOPIC: ALANI TEMİZLE Geçerli alanı kalıcı olarak at. Bu, Alan Seç iletişim kutusunda bir düğme olarak da mevcuttur. - - TOPIC: ALANI KOPYALA/YAPIŞTIR Seçili bir alan, Alanlar > Kopyala menüsü kullanılarak bir önbellek dosyasına kaydedilebilir. Bu alan, Alanlar > Yapıştır kullanılarak aynı veya başka bir görüntüye yapıştırılabilir. Yapıştırılan alanı konumlandırmak için tıklayıp sürükleyin. İletişim kutusu kontrolleri, yapıştırılan alanı yeniden ölçeklemek ve döndürmek için kullanılabilir. - - TOPIC: ALANI YÜKLE/KAYDET Seçili bir alan, Alanlar > Kaydet menüsü kullanılarak bir dosyaya kaydedilebilir. Bir dosya adı sağlamanız istenir. Bir PNG dosyası oluşturulur. PNG dosyası, saydamlık bilgisi için bir alfa kanalına sahiptir. Görüntü, seçili alanı çevreleyen bir dikdörtgendir. Seçili pikseller opaktır, diğerleri saydamdır. - Bu dosyalar varsayılan olarak /saved_areas içinde bulunur, ancak bunları herhangi bir yere kaydedebilirsiniz. Bir dosyadan kaydedilmiş bir alanı yüklemek ve geçerli görüntü dosyasına yapıştırmak için Alanlar > Yükle menüsünü kullanın. Arka plan görüntüsü, yapıştırılan alanın saydam kısımlarından görünecektir. Alanı konumlandırmak için tıklayıp sürükleyin. İletişim kutusu kontrolleri, yapıştırılan alanı yeniden ölçeklemek ve döndürmek için kullanılabilir. - - TOPIC: GERİ AL/YİNELE DÜĞMESİ Bir düzenleme işlevi etkinse ve görüntü değiştirildiyse: • sol fare tıklaması geçerli düzenlemeyi geri alır • sağ fare tıklaması düzenlemeyi yineler Bu, geçerli düzenleme işlevi için "önce" ve "sonra" görüntülerini hızla karşılaştırmanızı sağlar. - Etkin bir düzenleme işlevi YOKSA, ancak geçerli görüntüde bazı düzenlemeler yapıldıysa: • sol fare tıklaması tıklama başına bir düzenleme adımını geri alır • sağ fare tıklaması tıklama başına bir düzenleme adımını yineler • orta fare tıklaması tüm düzenleme adımlarının bir listesini açılır pencerede gösterir. Herhangi bir düzenleme adımına veya orijinal görüntüye geri dönebilirsiniz - Başka bir dosya açarsanız, geçerli dosya için kaydedilen düzenleme adımları atılır. - - TOPIC: DÜZENLE MENÜSÜ - - TOPIC: DÖNDÜR Eğik bir görüntüyü düzeltmek için, görüntü düzgün görünene kadar görüntünün sağ veya sol tarafını yukarı veya aşağı sürüklemek için fareyi kullanın. Görüntüye sol tıklama, görüntü düzeltmeye yardımcı olmak için dikey ve yatay kılavuz çizgileri ekler. Bunları kaldırmak için sağ tıklayın. - [Otomatik Seviye] düğmesi, kamera EXIF metadata'sına 'roll angle' kaydettiyse görüntüyü otomatik olarak düzeltebilir. [Auto Upright] düğmesi, EXIF metadata'sında 'orientation' varsa, kamera 90º döndürülerek çekilmiş bir görüntüyü otomatik olarak düzeltebilir. - - TOPIC: DÜZELT Bu, 90/180 derece döndürülmüş veya ters çevrilmiş (aynalanmış) bir görüntü için tek düğmelik bir düzeltmedir. Pikseller yeni görüntü düzenine 1:1 kopyalandığından çözünürlük kaybı yoktur. Ayrıca {TOPLU DÜZELTME} işlevine bakın. - - TOPIC: KIRP +image: crop-image.jpg +image: crop-buttons.jpg - Görüntü kenarlarından istenmeyen alanları kesin. İletişim kutusu açıldığında, görüntünün üzerine bir seçim dikdörtgeni yerleştirilir. Bu dikdörtgenin dışındaki alanlar koyulaştırılır ve görüntünün kaldırılacak kısımlarını temsil eder. Dikdörtgenin herhangi bir kenarını veya köşesini taşımak için sürükleyin. İletişim kutusu, seçim dikdörtgeninin geçerli genişlik/yükseklik oranını gösterir. "Kilit" işaretliyse, bir kenar veya köşeyi taşımak sabit genişlik/yükseklik oranının korunması için başka bir kenar veya köşenin de taşınmasına neden olur. Boyutları değiştirmeden tüm dikdörtgeni kaydırmak için ortadan (küçük bir daireyle işaretli) sürükleyin. Görüntü piksel boyutlarını doğrudan ayarlamak için genişlik ve yükseklik döndürme düğmelerini kullanın veya istenen değerleri girin. Seçim dikdörtgeni bu değerlere göre ayarlanacaktır. - Seçim dikdörtgenini 1 piksellik adımlarla taşımak için klavye ok tuşlarını kullanın. Fareyle taşınan son kenar veya köşe, ok tuşlarıyla taşınan köşedir. - [Maks] düğmesi kırpma dikdörtgenini tam görüntü boyutuna sıfırlar. Önceki bir düzenleme (Döndür, Çarpıt ...) görüntünün çevresinde saydam kenar boşlukları bıraktıysa, kırpma dikdörtgeni bu kenar boşlukları içine sığan maksimum boyutu yansıtacaktır. - [Önceki] düğmesi, daha önce kullanılan genişlik ve yükseklik değerlerinin bir listesini alır. Bunlardan birini kullanmak için listeden seçin. - Beş oran düğmesi, önceden ayarlanmış bir genişlik/yükseklik oranı seçmenizi sağlar. [invert] düğmesi geçerli genişlik/yükseklik oranını tersine çevirir. - Sağda gösterilen yeni bir iletişim kutusu başlatan [customize] düğmesiyle oran düğmelerini değiştirebilirsiniz. Düzenlemek için bir düğmeye tıklayın. Gösterilen örnekteki gibi "ww:hh" biçimini kullanarak istenen genişlik-yükseklik oranını girin. - - TOPIC: RÖTUŞ +image: retouch.png - Görüntü parlaklığını ve rengini ayarlayın. • otomatik siyah seviyesi - % en koyu pikselleri kullanarak siyah noktayı ayarla • otomatik beyaz dengesi - % en parlak pikselleri kullanarak beyaz noktayı ayarla • beyaz dengesi için gri noktaya tıkla - görüntüde gri noktaya tıkla • siyah seviyesi için koyu noktaya tıkla - görüntüde koyu noktaya tıkla • RGB histogramlarının açılır grafiği için tıkla • parlaklık - 'tümü' eğrisini yukarı veya aşağı taşır (tüm renkler değişir) • kontrast - 'tümü' eğrisinin eğimini değiştirir • renk doygunluğu - siyah/beyaz <--> yoğun renkler • renk sıcaklığı - aydınlatma dengesi (sıcak <--> soğuk) - Kaydırıcıları kullanarak ilk ayarlamaları yaptıktan sonra, görüntünün hangi kısımlarının daha fazla veya daha az değişeceğini değiştirmek için eğrileri fareyle düzenleyerek parlaklığı ve kontrastı ince ayarlayabilirsiniz. TÜMÜ eğrisi tüm renkleri ayarlar ve 3 RGB eğrisi tek tek renkleri ayarlar. Önce TÜMÜ'nü kullanın, ardından RGB kullanarak düzeltmeler yapın. - ^Düğmeler Sıfırla - tüm kontrolleri nötr bir konuma geri ayarla - görüntü de sıfırlanır Önceki - tüm kontrolleri önceki görüntü için kullanılan değerlere ayarla Bitti - düzenlemeyi bitir, iletişim kutusunu kapat, kontrol ayarlarını kaydet İptal - düzenlemeyi iptal et, görüntüyü sıfırla, iletişim kutusunu kapat - Benzer ayarlamalar gerektiren birden çok görüntüyü işlerken [Önceki] düğmesini kullanın. - - TOPIC: YENİDEN ÖLÇEKLE +image: rescale.png - Bu işlev, görüntüyü yeni bir piksel genişliğine ve yüksekliğine yeniden ölçekler. Yeni boyutları doğrudan girebilir veya bir yüzde değişikliği seçebilirsiniz. Yeni boyutu orijinal boyutun basit bir oranına ayarlamak için düğmeler bulunur. Bunlardan birini kullanmak çözünürlük kaybını en aza indirir. [Önceki] düğmesi, birden çok görüntü aynı boyuta ayarlanıyorsa bir kolaylık olan önceki boyutu hatırlar. Oranı kilitle kutusu işaretliyse, genişlik veya yükseklikten biri değiştirildiğinde geçerli genişlik/yükseklik oranı korunur. - - TOPIC: BÖLÜNMÜŞ EKRAN +image: split-screen1.jpg +image: split-screen2.png - Bir düzenleme işlevi sırasında, önce ve sonra görüntülerini bölünmüş ekran yöntemini kullanarak görüntüleyin. Sınır çizgisini fareyle sürükleyin. Bölünmüş Ekran'dan çıktığınızda, düzenleme işlevine normal şekilde devam edebilirsiniz. - Etkin bir düzenleme işlevi yoksa, bölünmüş ekran kullanılarak gösterilecek iki görüntü seçin. Aynı piksel boyutlarına sahip olmalıdırlar. - - TOPIC: FARKLARI GÖSTER Bir düzenleme işlevi sırasında, değişmemiş alanları koyulaştırarak değişiklikleri vurgulayın. Değişmemiş alanların koyuluğunu ayarlamak için kaydırıcıyı kullanın. Farkları Göster'den çıktığınızda, düzenleme işlevine normal şekilde devam edebilirsiniz. - Etkin bir düzenleme işlevi yoksa, farklarını vurgulamak için iki görüntü seçin. Aynı piksel boyutuna sahip olmalıdırlar. - - TOPIC: KENAR BOŞLUKLARI +image: margins.png - Bir görüntünün çevresine kenar boşlukları eklemek için bu işlevi kullanın. Kenar boşlukları için herhangi bir renk ve alfa (saydamlık) ayarı kullanabilirsiniz. Her kenar boşluğunu ayrı ayrı ayarlayın veya tüm kenar boşluklarını aynı miktarda (1 veya 10 piksel) yukarı ya da aşağı ayarlamak için 'Tümü±1' ve 'Tümü±10' kontrollerini kullanın. Hız için fare tekerleğini veya yukarı/aşağı ok tuşlarını kullanın. - Bu işlevi, çarpıtmayı planladığınız görüntülerin çevresine, bazı alanların kenarlardan düşmesini önlemek için kenar boşlukları eklemek üzere kullanabilirsiniz. - - TOPIC: İŞARETLEME +image: markup.jpg - Bu, görüntü işaretleme işlevlerini içeren bir menüdür: metin çiz, çizgi/ok çiz, kutu çiz, oval çiz Bu işlevlerin tümü, geçerli düzenlemeyi onaylayan ve aynı düzenleme iletişim kutusu içinde yenisine (yeni metin/çizgi/kutu/oval) başlamanızı sağlayan bir [commit] düğmesine sahiptir. - ^Metin Çiz Bu işlev, görüntü üzerine doğrudan metin çizer. Metni iletişim kutusuna girin. Birden çok satır kullanılabilir. Metni girdikten sonra, görüntüde metni istediğiniz yere fareyle sol tıklayın. Metni başka bir yere taşımak için sürükleyin. Metni kaldırmak için sağ tıklayın. Farklı bir yazı tipi seçmek için [Yazı Tipi] düğmesini kullanın. Metin boyutunu artırmak veya azaltmak için [Boyut] kontrolünü kullanın. Metnin eğim açısını değiştirmek için [Açı] kontrolünü kullanın. Diğer kontroller, metnin çevresine bir arka plan rengi, bir metin ana hattı rengi ve bir gölge efekti sağlamanıza olanak tanır. Bunların tümü için rengi ve saydamlığı seçebilirsiniz. Genişlik kontrolü, ana hatların ve gölgelerin genişliğini ayarlar. Gölge açısı kontrolü gölgenin açısını ayarlar. Metne 3D görünüm vermek için kabartma kontrollerini kullanın. - Metni görüntü dosyasındaki mevcut herhangi bir metadata'dan başlatabilirsiniz. Metadata tag'ini girin (ör. "user comments") ve [Getir]'e basın. Tag adlarını kısaltabilirsiniz, ör. "User Comments" yerine "usercomments". - [Aç] ve [Kaydet] düğmeleri, tüm metin verisini bir dosyadan yüklemenizi veya bir dosyaya kaydetmenizi sağlayan bir dosya seçici iletişim kutusu başlatır. İletişim kutusundaki tüm öğeler yüklenir veya kaydedilir, böylece sık kullanılan metin dizelerinin ve ayarların bir koleksiyonunu tutabilirsiniz. - Alttaki düğmeler şu şekilde çalışır: • Temizle - metin ve metadata alanlarını boşalt • Değiştir - eklenen metinle birlikte görüntü, geçerli görüntünün yerini alır • +Sürüm - eklenen metinle birlikte görüntü yeni bir sürüm olarak kaydedilir • Sonraki - sonraki dosyayı aç, aynı metni aynı konuma yerleştir • Uygula - geçerli düzenlemeyi onayla ve yeni metin girişi için sıfırla • Bitti - geçerli düzenlemeyi tamamla - görüntü kaydedilmeye hazır • İptal - geçerli düzenlemeyi terk et - Aynı metni bir dizi görüntüye eklemek için: metni hazırlayın ve konumlandırın, [Değiştir] veya [+Version]'e basın, ardından [Sonraki]'ye, ardından [Değiştir] veya [+Version]'e, ardından [Sonraki]'ye ... - Bir filigran oluşturun: %70 veya daha fazla metin saydamlığı ve %100 arka plan saydamlığı kullanın. Metin hafifçe okunabilir olmalıdır. Metnin görüntüye gömülü görünmesini sağlamak için kabartma kontrollerini kullanın. - ^Çizgi Çiz Bu işlev, görüntü üzerine doğrudan çizgiler veya oklar çizer. İletişim kutusuna bir çizgi uzunluğu ve genişliği girin ve isteniyorsa bir ok başı seçin. Görüntüde yerleştirmek istediğiniz yere fareyle sol tıklayın. Görüntüde konumlandırmak için çizginin/okun uçlarını sürükleyin. Kaldırmak için sağ tıklayın. Açıyı veya uzunluğu değiştirmeden taşımak için çizginin ortasından sürükleyin. İletişim kutusu kontrolleri, bir arka plan rengi, bir ana hat rengi ve bir gölge efekti sağlamanıza olanak tanır. Bunların tümü için renk ve saydamlık seçebilirsiniz. Genişlik kontrolü, ana hatların ve gölgelerin genişliğini ayarlar. Gölge açısı kontrolü gölgenin eğim açısını ayarlar. Çizilen bir çizgiyi korumak ve bir başkasına başlamak için [uygula]'ya basın. - ^Kutu Çiz Kutu ana hattı için bir renk ve genişlik seçin. İmleci bir kutu köşesi istediğiniz konuma yerleştirin ve kutuyu istenen yönde açmak için sürükleyin. Kutuyu değiştirmek için tekrar sürükleyin. Kutuyu taşımak için shift tuşunu basılı tutun ve kutuyu ortadan sürükleyin. Kenarlardan birini taşımak için shift tuşunu basılı tutun ve kenarı sürükleyin. Çizilen bir kutuyu korumak ve bir başkasına başlamak için [uygula]'ya basın. - ^Oval Çiz Oval (elips) veya daire onay kutusunu seçin. Ana hat için bir renk ve genişlik seçin. İmleci istenen merkeze yerleştirin. Ovali/daireyi çizmek için sürükleyin. Sürükleme açısı, daireden aşırı elipse, geniş veya uzun, ovalin şeklini belirler. Ovali/daireyi değiştirmek için tekrar sürükleyin. Ovali/daireyi taşımak için shift tuşunu basılı tutun ve merkezden sürükleyin. Boyutu veya şekli değiştirmek için shift tuşunu basılı tutun ve sağ alt kenardan sürükleyin. Çizilen bir ovali/daireyi korumak ve bir başkasına başlamak için [uygula]'ya basın. Bir oval için, örnekte olduğu gibi eğik eksenler için 0-90 derece bir açı girebilirsiniz. - - TOPIC: RENK MODU +image: color-mode.png +image: color-mode2.jpg - Siyah beyaz veya renkli negatif yapmak, ya da bir negatif görüntüyü pozitif bir görüntüye dönüştürmek veya sepya renklendirmeye (eskitilmiş fotoğraf efekti için) dönüştürmek için bu işlevi kullanın. Kaydırıcı, efekti %0'dan %100'e kadar kademeli olarak uygulamak için kullanılabilir. - - TOPIC: BOYALI DÜZENLEMELER Bu işlevi başka bir düzenleme işleviyle birlikte kullanın. Bir düzenleme işlevi başlatın ve kontrolleri nötr bir konumda bırakın. Ardından Boyalı Düzenlemeler'i başlatın. Düzenleme işlevini fareyle istediğiniz yere boyayın. Düzenlemeleri fareyle yerel olarak uygulamak için {MOUSE PAINTING}'ya bakın. - Düzenlemeleri kademeli olarak "boyama" yöntemi, bir görüntünün seçili alanlarını hızlı ve kolay bir şekilde iyileştirebilir. Aşağıdaki düzenleme işlevleriyle çalışır: • Düzenle > Rötuş, Renk Modu • Onar > Keskinleştir, Bulanıklaştırma, Gürültü Gider, Sis Gider, RGB Ayarla, HSL Ayarla • İncelt > Histogramı Düzleştir, Yerel Kontrast, Kontrastı Artır, Yerel Retineks, Doygunluk, Yumuşak Odak • Efektler > Ana Hatlar, Eskiz2, Kabartma, Doku, Parlama Ekle, Renkleri Ayarla, Renkleri Kaydır, Özel Çekirdek - - TOPIC: GÖRÜNTÜYÜ BOYA +image: paint-image.jpg - Bu işlev, fareyi kullanarak görüntünün üzerine seçili renklerle boyar. Düzenlemeleri fareyle yerel olarak uygulamak için {MOUSE PAINTING}'ya bakın. - Boya Rengi düğmesi geçerli rengi gösterir. Standart Gnome renk seçici iletişim kutusunu kullanarak bir renk seçmek için bu düğmeye tıklayın. Görüntüden bir renk seçmek için görüntüye shift + sol tık da yapabilirsiniz. - Palet düğmesi ortada gösterilen iletişim kutusunu açar. O konumdaki rengi seçmek için görüntüye tıklayın. Seçilen renk, ana iletişim kutusunun renk düğmesine yansıtılır. Yukarıda gösterilen görüntü varsayılandır. Herhangi bir görüntüyü renk kaynağı olarak kullanabilirsiniz. [göz at] düğmesine basın ve hatırlamak için renkleri kaydettiğiniz bir görüntü seçin. Bu seçim, değiştirilene kadar geçerli kalır. - HSL düğmesi, sağda gösterilen bir HSL renk seçiciyi açar. Bu iletişim kutusu olası herhangi bir rengi temsil edebilir. İstediğiniz rengi elde etmek için kaydırıcıları hareket ettirin. Seçilen renk, ana iletişim kutusunun renk düğmesine yansıtılır. - Saydam alanların üzerine boya seçiliyse, saydam alanların üzerine boyamak, opaklık kontrollerine bağlı olarak saydamlığı azaltacak veya ortadan kaldıracaktır. Bu seçenek seçili değilse, yalnızca görüntünün opak alanları boyanır. - ^Wacom Tablet Çalışması Görüntüyü Boya ile, fare yerine bir Wacom tablet kullanabilirsiniz. Kalemi tablet yüzeyiyle temas halinde sürüklemek yukarıda açıklandığı gibi boyayacaktır. Sürüklerken kalem düğmelerinden biri basılı tutulursa, işlem boyama yerine silme olur. İletişim kutusundaki radyo düğmelerini kullanarak boya veya silme modunu da ayarlayabilirsiniz. Bir kalem düğmesini basılı tutmak zahmetli olduğundan radyo düğmeleri bunun içindir. Kaleme basınç uygulamak opaklığı artırır, böylece opaklık kontrollerini ayarlamadan daha açık ve daha koyu vuruşlar yapabilirsiniz. - - TOPIC: SAYDAMLIĞI BOYA +image: paint-transp.png +image: paint-transp2.jpg - Bir görüntüde saydam veya yarı saydam alanlar boyayın. Düzenlemeleri fareyle yerel olarak uygulamak için {MOUSE PAINTING}'ya bakın. - - TOPIC: ALAN DOLDURMA Tüm seçili alanları veya tüm saydam alanları seçilen bir kaplama rengiyle doldurun. Bir alan kısmen saydamsa, kaplama rengi görüntünün saydam kısmının yerini alır. 'Karıştırma' kaydırıcısı, orijinal görüntü ile kaplama renginin herhangi bir karışımını seçmek için kullanılabilir. - - TOPIC: GÖRÜNTÜ İÇİNDE KOPYALA Aynı görüntünün başka bir yerinden kopyalayarak görüntü alanlarının üzerine boyayın. Bu yöntem, bir görüntü içindeki nesneleri çoğaltmak veya istenmeyen bir nesneyi başka bir yerden alınan arka planla değiştirerek silmek için kullanılabilir. Bir kaynak konum seçmek için görüntüye sol tıklayın, ardından karşılık gelen hedefi seçmek için sağ tıklayın. Düzenlemeleri fareyle yerel olarak uygulamak için {MOUSE PAINTING}'ya bakın. - Saydam alanların üzerine boya seçiliyse, saydam alanların üzerine boyamak saydamlığı azaltır veya ortadan kaldırır. Bu seçenek seçili değilse, yalnızca görüntünün opak alanları boyanır. - - TOPIC: GÖRÜNTÜDEN KOPYALA Başka bir görüntüden kopyalayarak görüntü alanlarının üzerine boyayın. Hedef görüntü, değiştirilecek alan üzerinde fare sürüklenerek 'boyanır'. Kaynak görüntüdeki önceden seçilmiş bir konum hedef görüntüye kopyalanır. Kopyalanan alan ve boyanan alan, fareyle birlikte hareket eden dairelerle çevrelenir. Yukarıdaki örnekte, sağdaki görüntüdeki tekne sol görüntüye kopyalanmıştır. - Hedef görüntüyü açarak başlayın. 'Görüntüden Kopyala' menüsünü seçin. Aynı görüntüyü gösteren 2. bir Fotocx oturumu başlatılır. Bu 2. oturumda, kaynak görüntüye gidin ve açın. İki pencereyi de görünür tutabileceğiniz şekilde düzenleyin (en azından kopyalanacak alanları). Bir kaynak konum belirlemek için kaynak görüntüye shift + sol tıklayın. Hedef konumda hedef görüntüye shift + sol tıklayın. - Hedef görüntü alanı üzerinde fareyi sol sürükleyin. Kaynak görüntüden pikseller hedef görüntüye kopyalanır. Referans konumları için yüksek hassasiyet gerekiyorsa görüntüleri maksimum boyuta yakınlaştırın. Her iki görüntü için de başlangıç referans konumu (0,0)'dır (KB köşesi). Düzenlemeleri fareyle yerel olarak uygulamak için {MOUSE PAINTING}'ya bakın. - Kaynak görüntü ölçek değeri, kaynak görüntüyü hedef görüntüye ölçeklemek için kullanılır. Ölçeği kontrol etmek için bir deneme kopyası yaparak başlayın. Çok büyük veya çok küçükse, denemeyi silmek için [undo all]'ı kullanın, ölçek değerini değiştirin ve tekrar deneyin. - Saydam alanların üzerine boya seçiliyse, saydam alanların üzerine boyamak, fare opaklık kontrollerine bağlı olarak saydamlığı azaltacak veya ortadan kaldıracaktır. Bu seçenek seçili değilse, yalnızca görüntünün opak alanları boyanır. - - TOPIC: ÖNCEKİ DÜZENLEMEYİ KOPYALA Önceki bir düzenleme adımından gelen görüntü, fareyle "boyanarak" geçerli görüntüye yerel ve kademeli olarak uygulanabilir. Önceki düzenleme, geçerli görüntü hâlâ açıkken ona yapılan düzenlemelerden biri olmalıdır - yeni bir görüntü açıldığında kaydedilmemiş düzenlemeler kaybolur. Görüntü geçerli görüntü olarak açık kaldığı sürece, önceki herhangi bir düzenlemeyi düzenlenmekte olan geçerli görüntünün herhangi bir alanına uygulayabilirsiniz. Geçerli görüntüde yapılan tüm önceki düzenleme adımlarını sırayla gösteren ve kullanılan düzenleme işleviyle tanımlanan açılır listeyi kullanarak önceki bir düzenleme seçin. Düzenlemeleri fareyle yerel olarak uygulamak için {MOUSE PAINTING}'ya bakın. - - TOPIC: ONARIM MENÜSÜ - - TOPIC: KESKİNLEŞTİR +image: sharpen.png - Bu işlevin bulanık bir görüntüyü keskinleştirmek için beş yöntemi ve pozlama sırasında kamera veya konu hareketinden kaynaklanan hareket bulanıklığını keskinleştirmek için bir yöntemi vardır. - Yöntemi seçin, parametreleri ayarlayın, [uygula]'ya basın ve sonucu görmek için birkaç saniye bekleyin. Değişiklik yapın ve memnun olana kadar işlemi tekrarlayın. Bir görüntünün farklı bölümlerinde farklı yöntem ve parametrelerle çalışmak için {ALAN SEÇ}'i kullanın. - Tüm yöntemler için, hafif bulanık görüntüler için küçük bir yarıçap ve daha kötü görüntüler için daha büyük değerler seçin. Miktar, değişikliğin gücünü kontrol eder. Eşik, düşük kontrastlı piksellere yapılan değişiklikleri bastırır: daha yüksek bir değer, düşük seviyeli düzensizliklerin (görüntü gürültüsü, düzensiz cilt tonları vb.) artırılmasını azaltır. - Keskinleştirme maskesi: çoğu görüntü düzenleyicide bulunan klasik bir yöntem. Teknik bir açıklama internet aramasıyla bulunabilir. Bu yöntem, yüksek kontrastlı kenarların çevresinde görünür 'haleler' oluşturabilir. - Kontrastı Artır: mevcut kontrastı artırır. Etkinlik, keskinleştirme maskesiyle karşılaştırılabilir, ancak 'haleler' azaltılmıştır. - Kuwahara: her pikselin çevresindeki küçük komşuluklar birbiriyle karşılaştırılır. Piksele, en küçük farka sahip komşuluğun ortalama rengi verilir. Bu, bulanık bir kenardaki pikselleri kenarın bir tarafına veya diğerine uymaya zorlar. Kenarlar çok keskin hale getirilir. Büyük bir yarıçap kullanılırsa görüntü 'bloklu' görünebilir. İnce ayrıntılar kaybolabilir. - Medyan farkı: piksel parlaklığı yarıçap içindeki piksellerin medyanıyla karşılaştırılır. Komşuluk ortalamasından sırasıyla daha parlak veya daha koyu olan pikseller için parlaklık artırılır veya azaltılır. Etkinlik, keskinleştirme maskesiyle karşılaştırılabilir, ancak 'haleler' büyük ölçüde azaltılmıştır. Bu, her RGB rengini ayrı ayrı işleyen tek yöntemdir. Küçük bir parlaklık değişikliği olsa bile bir renk geçişini keskinleştirebilir. - Richardson-Lucy: görüntü, Richardson-Lucy dekonvolüsyon yöntemi kullanılarak keskinleştirilir. Bu yöntem en iyi sonuçları üretebilir, ancak oldukça yavaştır. İşleri hızlandırmak için, {ALAN SEÇ}'i kullanarak görüntünün küçük ama yoğun bir alanını seçerek başlayın. Bu küçük alanı kullanarak optimum yarıçapı ve yineleme sayısını arayın. Ardından tam görüntü için aynı ayarları kullanın. Görüntüdeki gürültü etkinliği engelleyecektir. Eğer öyleyse, önceden {GÜRÜLTÜ GİDER}'i kullanın. - Tam olarak 2x büyütülmüş bir görüntü, 2.0 yarıçap ve 4 veya daha fazla yineleme kullanılarak Richardson-Lucy ile keskinleştirilebilir. Sonuçlar dikkat çekici derecede iyidir. - ^Hareket Bulanıklığını Düzelt +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - Kamera veya nesne hareketinden kaynaklanan küçük bulanıklığa sahip görüntüleri elle optimize edin. Aksi takdirde keskin olan bir görüntüdeki hareketli bir nesneden kaynaklanan bulanıklık, nesneyi izole etmek için {ALAN SEÇ} kullanılarak işlenebilir. Bulanıklığın doğrusal ve sabit hızlı olduğu varsayılır. Girdiler piksel cinsinden 'bulanıklık aralığı' ve derece cinsinden 'bulanıklık açısı'dır. İlk açı tahmini, görüntü üzerinde bulanıklık yönünde shift + fare sürüklemesiyle belirtilebilir (gerçek harekete aynı veya zıt yönde olabilir). Bazı parlak görüntü öznitelik kenarları boyunca bulanıklığın genişliğini ölçmek için Araçlar > RGB Göster kullanarak bulanıklık aralığının bir tahminini girin. Girdileri ayarlayın, [uygula]'ya basın ve optimum ayarları bulmak için görüntüyü inceleyin. Büyük bir görüntü için yanıt süresi yavaş olabilir. Aralığı ve açıyı optimize etmek için küçük bir bulanık alan seçmek üzere {ALAN SEÇ}'i kullanırsanız işlemi hızlandırabilirsiniz, ardından tüm görüntüyü aynı ayarlarla işlemek için alanı temizleyin. Algoritma "çınlama" gürültüsü üretebilir, bu 'çınlamayı gider' girdisi kullanılarak bastırılabilir. Optimum aralığı ve açıyı bulmak için bastırma değerini düşük bırakmak ve ardından çınlamayı azaltmak için gerektiğinde bastırma eklemek en iyi sonucu verir. Richardson-Lucy dekonvolüsyon yöntemi tek boyutta kullanılır. - ^Dijital Kamera Hareket Bulanıklığı Tüm bulanık fotoğraflar bu yöntem için en uygun olan sabit hızlı bulanıklığa sahip değildir. Görüntü, birden çok daha kısa pozlamanın üst üste binmesi olabilir. Tüm görüntü aynı anda pozlanmamış ve aynı bulanıklığa sahip olmayabilir (mekanik veya elektronik hareketli deklanşör). Bu yöntem yine de iki boyutta çalışan keskinleştirme araçlarından daha iyi sonuçlar üretebilir. Hareket bulanıklığının sabit hıza daha yakın olduğu film kameralarla çekilmiş eski fotoğraflarda daha iyi çalışması beklenir. - - TOPIC: BULANIKLAŞTIRMA +image: blur.jpg - İlgili onay kutusuyla bir yöntem seçin, gerekli parametreleri girin, [uygula]'ya basın. {ALAN SEÇ} etkinse, yalnızca seçili alanlar etkilenir. - ^Normal Bulanıklaştırma Her pikseli yarıçap içindeki çevresindeki piksellerle karıştırın. Daha yakın piksellerin ağırlığı daha yüksektir. Yarıçapı 1'e ayarlayıp görüntü sonucunu izlerken bulanıklığı yavaşça artırmak için [uygula]'ya tekrar tekrar basabilirsiniz. - İsteğe bağlı olarak, ayrı yatay ve dikey değerler girerseniz yatay ve dikey yönlerde farklı miktarlarda bulanıklaştırabilirsiniz. [yarıçap] girdisi her ikisi için de aynı değerleri zorlar. - ^Radyal Bulanıklaştırma Her pikseli, seçilen bir merkezden bir çizgi boyunca piksellerle karıştırın. Yarıçap, bulanıklaştırılmayan bir merkez alanı tanımlar. Uzunluk, bulanıklık çizgisi aralığını ayarlar: merkezden kenara 0'dan uzunluğa. Merkezi görüntüye tıklayarak seçin. - ^Yönlü Bulanıklaştırma Fareyi kullanarak görüntüde bir konumu çekin. Fare çevresindeki alan bu yönde bulanıklaştırılır. Aralık, bulanıklaştırılan alanın boyutunu belirler. Yoğunluk, bulanıklığın gücünü belirler. - ^Kademeli Bulanıklaştırma Yalnızca verilen kontrast sınırından daha az kontrasta sahip pikseller bulanıklaştırılır ve bulanıklık yarıçapı, karşılık gelen kontrastı verilen sınırdan sıfıra kadar değişen pikseller için 1'den verilen değere kadar değişir. Kısaca: düşük kontrastlı pikseller yüksek kontrastlı piksellerden daha fazla bulanıklaştırılır. Bu, saçları bulanıklaştırmadan veya gözlerdeki parıltıyı azaltmadan cilt tonlarını yumuşatmak için kullanılabilir. Aşırıya götürüldüğünde, bir "karikatür" efekti üretir. - ^Arka Plan Bulanıklığı (Bokeh) Ön planı keskin bırakırken arka plan görüntü alanlarını bulanıklaştırın. Keskin kalması gereken bir veya daha fazla alan seçin {ALAN SEÇ}. Ön plan alanlarını seçtikten sonra, şimdi arka planın seçili olması için seçimi tersine çevirin {ALANI TERSİNE ÇEVİR}. Bu, bulanıklaştırılacak alandır. İki bulanıklaştırma yöntemi mevcuttur: Sabit bulanıklık: bulanıklaştırılan tüm alanlar için sabit bir bulanıklık yarıçapı kullanılır. Mesafeyle birlikte bulanıklığı artır: ön plana bitişik pikseller için minimum bulanıklık yarıçapını ve ön plandan maksimum mesafedeki pikseller için maksimum bulanıklık yarıçapını kullanın. Bu, tüm arka plan pikselleri için kenar mesafesinin hesaplanmasını gerektirir, bu da önemli zaman alabilir. Bulanıklık yarıçapı, kenar mesafeleri yeniden hesaplanmadan değiştirilebilir. - - TOPIC: GÜRÜLTÜ GİDER +image: denoise.jpg - Düşük ışık koşullarında (yüksek ISO) çekilen fotoğraflardaki gürültüyü azaltın, düzgün yüzeylerin benekli görünmesine neden olan. İki yöntem sağlanır, Medyan ve Yumuşak. En iyi yöntem gürültüye ve görüntü özelliklerine göre değişir. Yöntemleri karıştırmak (birini kullanıp sonra diğerini) yardımcı olabilir. Yarıçap değeri, belirli bir pikseli karşılaştırmak ve ayarlamak için kullanılacak piksel komşuluğunu tanımlar. Büyük bir değer (Yarıçap > 2) gürültüyü daha etkili bir şekilde azaltır, ancak ayrıntı kaybına da neden olabilir. Sınır değeri, komşuluk medyanından bu miktardan daha fazla farklılık gösteren RGB parlaklık değerlerine sahip piksellerin yok sayılmasına neden olur. Bu, bazı görüntüler için küçük parlak ayrıntıların gürültü olarak değerlendirilmesini önlemek için gereklidir - ör. astronomik fotoğraflar. - Bir Yarıçap değeri ayarlayın ve yöntem düğmelerinden birine basın. Her yineleme, önceki görüntüyü bir başlangıç noktası olarak kullanır, bu yüzden birden çok yineleme gürültüyü kademeli olarak bastırır ve muhtemelen bazı ayrıntıları bulanıklaştırır. Yeniden başlamak için [sıfırla]'yı kullanın. Yarıçap 1 ile Medyan, ardından Yarıçap 2 ile Medyan, gürültüyü bastırma ve ayrıntıyı koruma arasında iyi bir uzlaşmadır. - Alanlar kaydırıcısı, işlemeyi yalnızca koyu alanlarla veya daha geniş bir alan aralığıyla sınırlamak için kullanılabilir. Koyu alanlar, parlak alanlardan daha fazla gürültü sorunu yaşama eğilimindedir. - Kalıcı olan bazı küçük gürültü benekleri görürseniz, sınır değerini artırın, [sıfırla] düğmesini kullanın ve [medyan] veya [yumuşak] ile devam edin. - Görüntünün farklı alanlarında farklı işlemler uygulayabilirsiniz - bkz. {ALAN SEÇ} ve görüntüyü farklı alanlarda farklı işlemler kullanarak "boyayabilirsiniz" - bkz. {BOYALI DÜZENLEMELER}. - Her RGB rengi bağımsız olarak işlenir. Renk tonu veya parlaklığın ayrı bir işlemi yoktur. - [measure] düğmesi, gerçek görüntü gürültü seviyesini ölçmek için sağ taraftaki iletişim kutusunu başlatır. Fare dairesi içindeki (yarıçap 10, yaklaşık 300 piksel) RGB gürültü seviyelerini göstermek için fareyi görüntü üzerinde hareket ettirin. Bu, gürültünün mevcut tek varyasyon olması için özelliksiz bir alan olmalıdır. Gürültü mü yoksa doku mu gördüğünüzden emin olmak için görüntüyü 4X boyutunda inceleyin. Noktalar, merkezi düz çizgiyle temsil edilen çevredeki 5x5 pikselin ortalamasına göre tek tek piksel RGB değerlerini gösterir. Alttaki sayılar, 0-255 ölçeğinde ortalama RGB parlaklığını ve gürültü seviyelerini gösterir. Grafik ölçeği -10 ile +10 arasındadır ve noktalı çizgiler, 0-255'lik toplam aralığa göre -5 ve +5'tedir. 9. veya 10. RGB bitindeki gürültü bu ölçekte 0,5 veya 0,25'tir. - ^RAW görüntü gürültüsü Kamera sensörü gürültüsünü ölçmek için bir RAW görüntü kullanın. JPEG görüntüler, gürültüyü azaltmak için kamera içinde işlenir. RAW görüntülerdeki tipik olarak yüksek gürültü seviyelerine şaşırabilirsiniz. Büyük sensörlere sahip pahalı kameralar bile 8 bitten az düşük gürültülü renge sahip olabilir. Bir RAW görüntüden gürültüyü filtrelediğinizde, kamera JPEG'ini üreten elektronik ve yazılımla rekabet ediyorsunuzdur. Daha iyisini yapmak zor olabilir. - - TOPIC: SİS GİDER +image: defog.png +image: defog2.jpg - Bir görüntüde veya seçili alanda sis/pus giderin. Bunun için başka araçlar da vardır (histogramı düzleştir, yerel kontrast, kontrastı artır, retineks, doygunluk), ancak sis/pus giderme onların birincil işlevine göre ikincildir. Bu işlev sis/pusa doğrudan saldırır: eşit miktarda R/G/B rengini kaldırır (parlaklığı azaltıp doygunluğu artırır) ve isteğe bağlı olarak kaybedilen parlaklığı geri ekler. Uzak pusla sıkça olduğu gibi çok baskın hale gelirse maviyi de azaltabilir. İstenen alanları tam olarak hedeflemek ve optimize etmek için {ALAN SEÇ} veya {BOYALI DÜZENLEMELER} kullanmanız gerekebilir. Yukarıdaki örnekte iki alan kullanılmıştır: ön plandaki tepeler ve arka plandaki dağ. - - TOPIC: KIRMIZI GÖZLER +image: red-eyes1.png +image: red-eyes2.png - Flaşlı fotoğraflardan kırmızı göz etkisini azaltın. İki yöntem sağlanır. Birincisi daha hızlıdır ancak zor durumları işleyemeyebilir. İkinci yöntem daha sağlamdır, ancak daha fazla zaman ve özen de gerektirir. İlk işlevi kullanmak için, memnun olana kadar bir kırmızı göze bir veya daha fazla kez sol tıklayın. Koyulaştırılan alan çok küçükse veya merkezden kaymışsa, değişikliği geri almak için sağ tıklayın ve ardından kırmızı gözün merkezine daha hassas bir şekilde sol tıklayın. Bir kırmızı göz doğru şekilde düzeltilemiyorsa, değişikliği geri almak için sağ tıklayın ve ardından ikinci yöntemi kullanın. İkinci yöntem, kırmızı gözün yalnızca hafifçe kırmızı olduğu ve göz kapaklarıyla renk farkının otomatik algoritmanın ayırt etmesi için çok az olduğu daha zor durumları daha iyi işleyebilir. İmleci kırmızı gözün merkezine yerleştirin. Sol fare düğmesini basılı tutun ve imleci aşağı ve sağa sürükleyin. Kırmızı gözü çevreleyen noktalı bir elips görünecektir. Kırmızı gözü elips içinde (kabaca) ortalamak için gerekirse tekrarlayın. Elipsin şeklinin sürükleme yönüne bağlı olduğunu unutmayın, bu da yalnızca kırmızı gözün daha hassas bir şekilde çevrelenmesine olanak tanır. Kırmızı gözün koyulaştığını izlerken elipsin içine tekrar tekrar sol tıklayın ve yeterince koyulaştığında durun. Çok ileri giderseniz, göz kapakları koyulaşmaya başlayabilir. Geri almak için sağ tıklayın ve gerekirse tekrarlayın. - - TOPIC: AKILLI SİLME +image: smart-erase.png +image: smart-erase2.jpg - Elektrik hatları, yerdeki çöpler, bir tabela vb. gibi iyi bir fotoğrafı bozabilecek küçük nesneleri silin. İstenmeyen nesne, çevredeki alandan alınan piksellerle değiştirilir. Bu bazen çok etkilidir (yan etkiler neredeyse görünmez), bazen değildir. Fotoğraftaki küçük veya dar nesneler için en iyi şekilde çalışır. Yarıçap, fare imleci etrafındaki bir dairenin boyutunu kontrol eder ve seçilecek ve silinecek alanı tanımlar. Kaldırılacak nesneyi çevrelemek için fareyi sürükleyin. Sol sürükleme seçer ve sağ sürükleme seçimi kaldırır. Seçili alanı silmek için [Sil]'e basın, pikselleri seçimin dışından en yakın piksellerle değiştirir. Seçim yeterince hassas değilse, [Geri Al]'ı kullanın, seçili alanı ayarlayın ve tekrar [Sil]'e basın. Yeni bir seçim başlatmak için [New_Area]'ı kullanana kadar tekrarlanan seçimler ve silmeler birikir. Önceki silinen alanlar artık sabittir ve [Geri Al] yalnızca sonraki seçimler için çalışır. Görüntüyü %200 veya daha fazla yakınlaştırarak çalışmak en iyisidir. Bulanıklaştırma kontrolü, değiştirme piksellerine bulanıklık ekler. Değiştirme pikselleri çevreden daha keskin olabileceğinden bu, görünür yan etkileri azaltabilir. Bulanıklaştırma ayarını değiştirin ve [Sil] düğmesini tekrarlayın. [show] ve [hide] düğmeleri, geçerli seçimin ana hattını göstermek veya silme sonrası sonuçları daha iyi değerlendirmek için gizlemek üzere kullanılabilir. - Uzun ince nesneler için (ör. elektrik hatları), iki konuma tıklayabilirsiniz ve aradaki her şey seçilir. Seçim düz bir çizgide çalışır, bu yüzden eğri nesneler için eğriyi takip etmek üzere belirli aralıklarla tıklamanız gerekir. - - TOPIC: HALEYİ GİDER +image: remove-halo.png +image: remove-halo2.png - Bazı düzenleme işlevlerinin bıraktığı haleleri kaldırın. Hale türünü seçin: parlak (en yaygın) veya koyu. Örnekte gösterildiği gibi, fare içindeki pikselleri değiştirmek için hale alanı üzerinde fareyi sol sürükleyin. Parlak bir hale için, fare üzerlerinde sürüklendikçe en parlak pikseller koyulaşır. Koyu bir hale için, en koyu pikseller parlaklaşır. Örnekte gösterildiği gibi, hale genişliğinden daha büyük bir fare yarıçapı kullanın. Orijinal pikselleri geri yüklemek için fareyi sağ sürükleyin. - - TOPIC: JPEG BOZULMALARI +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - Yüksek oranda sıkıştırılmış (düşük kalite ayarıyla) JPEG görüntüler, küçük dikdörtgen bloklar biçiminde sıkıştırma bozulmaları gösterebilir. Bir fotoğrafın bazı alanlarının parlaklık aralığı genişletilmişse, parlaklık adımları daha büyük olduğundan bu tür bloklar daha görünür hale gelebilir (ör. 11/12/13 RGB değerleri 5 kat parlaklaştırılarak 55/60/65 olur). Bu işlev, blokları daha az görünür kılmak için bloklar arasındaki sınırları bulanıklaştırır. - 'Eşleştirme Sınırı', bitişik piksellerin ne zaman aynı piksel bloğunun üyeleri olarak ele alınacağını belirler. Bu tür blokların daha eksiksiz haritalanması için Eşleştirme Sınırı daha düşük bir değere ayarlanabilir. 'Kontrast Sınırı', kontrastın yüksek olduğu kenarların karıştırılmasını önleyerek ayrıntı kaybını engeller. İki ayarı değiştirin ve [uygula]'ya basın. Ortaya çıkan görüntüyü >2x boyutunda görüntüleyin ve optimizasyon önemliyse farklı ayarlar deneyin. Bu işlev, yeniden ölçeklenmiş bir görüntüde daha az etkili olacaktır. Sorunlu alanları seçici olarak işlemek için {ALAN SEÇ}'i kullanın. - - TOPIC: KENAR YUMUŞATMA +image: anti-alias.jpg - Bazen fotoğraflar, bazı yüksek kontrastlı öznitelik kenarları boyunca pikselleşme ('tırtıklar') gösterir. Yukarıdaki örnekte, bunu kuşun gözünün çevresinde görebilirsiniz. Kenar yumuşatma aracı bunu azaltabilir. Etki, kamera içi işlemenin sorunu zaten halletmiş olabileceği çoğu fotoğrafta küçüktür. İkincil bir etki, yüksek oranda sıkıştırılmış görüntülerdeki jpeg bozulmalarının biraz yumuşatılmasıdır. Boyutu büyütülmüş görüntülerin daha belirgin pikselleşmeleri olacaktır. Bunlara, özellikle 2x büyütme durumunda yardımcı olunabilir. - Yardımcı olduğu görülüyorsa birden çok kez, pikselleri bastırmak için [uygula] düğmesini kullanın. Düşük kontrastlı pikselleri işlemenin dışında tutmak için 'Eşik' kullanılabilir. Genellikle 0.1 veya daha düşük bir değer en iyisidir. - Fotocx, "eşit" ve "eşit değil" yerine "benzer" ve "farklı" renk tonlarını kullanmak üzere değiştirilmiş Scale3x algoritmasını kullanır. - - TOPIC: RGB AYARLA +image: adjust-RGB.png - Genel parlaklığı ve kontrastı veya seçili renklerinkini değiştirin. • Parlaklık - genel görüntü parlaklığını artırır veya azaltır • +Kırmızı -Camgöbeği vb. - renk parlaklığını değiştirir ve tamamlayıcı rengi ters yönde değiştirir • Kontrast Tümü - genel görüntü kontrastını artırır veya azaltır • Kontrast Kırmızı Yeşil Mavi - tek tek RGB renklerini işler - - TOPIC: HSL AYARLA +image: adjust-HSL.png - HSL (Hue, Saturation, Lightness) kullanarak bir görüntüdeki seçili bir renk aralığını değiştirin. Bu işlev, bir renk tonunu düzeltmek veya bir rengi başka bir renge dönüştürmek için kullanılabilir (ör. aşırı pozlanmış bir gökyüzü - çok beyaz). HSL renk modeline aşina değilseniz, bununla ilgili Wikipedia makalesini okuyun. - Eşleştirilecek ve ayarlanacak bir hedef görüntü rengi seçerek başlayın, görüntüye shift + sol tıklayarak. Bu renk, ayarlama için seçilecek bir renk aralığının merkezi olacaktır. Hue, saturation ve lightness onay kutularını kullanarak hangi renk özniteliklerinin eşleştirileceğini seçin. Bunların her biri seçili renk aralığını daraltır. Hiçbiri işaretli değilse, tüm renkler seçilir. Eşleşme Seviyesi, seçili renk aralığını daha da genişletmek için kullanılabilir. %100, yalnızca yakından eşleşen renklerin seçildiği anlamına gelir. - Çıktı Rengi kontrolleri (hue, saturation, lightness), seçili girdi renklerinin yerini alacak veya onlarla karışacak yeni çıktı rengini ayarlamak için kullanılır. Bu rengi görüntüden de shift + sağ tık kullanarak ayarlayabilirsiniz. Ortaya çıkan renk, orijinal rengin ve yeni rengin bir karışımı olacaktır. Yeni renk oranı, %0 ile 100 arasında ayarlanabilen Ayarlama kaydırıcısıyla belirlenir. Girdi renginin hangi HSL bileşenlerinin çıktı renginin karşılık gelen HSL bileşenleriyle değiştirileceğini belirlemek için HSL onay kutularını kullanın. Yeni rengi ayarlamak için çıktı rengi HSL kaydırıcılarını kullanın. Çıktı rengi, kaydırıcıları hareket ettirdikçe güncellenen soldaki daha küçük kutuda gösterilir. - Sonucu optimize etmek için kaydırıcıları hareket ettirin ve canlı görüntü güncellemelerini izleyin. Bu pek sezgisel değildir ve pratik yardımcı olacaktır. İpucu: hue ve saturation üzerinde eşleştirerek ve yalnızca hue'yu değiştirerek başlayın - bu, çıktı rengi saturation ve lightness'ının orijinal görüntü renklerinden kopyalanacağı ve yalnızca hue'nun değiştirileceği anlamına gelir. - - TOPIC: TOZU GİDER +image: remove-dust.png +image: remove-dust2.jpg - Tozlu taranmış slaytlardan yapılan görüntülerde birçok küçük koyu leke olabilir - slaytlardaki tozun gölgeleri. İnternetten alınan tarihi fotoğraflarda sıkça benzer bir sorun vardır. Bu işlev, bu tür lekelerin çoğunu kaldırabilir. Maksimum sayıda toz lekesi kırmızı boyanana kadar üç kaydırıcıyı hareket ettirin, ardından bunları silmek için [sil] düğmesine basın. Kırmızı görünümü geri getirmek için [red]'ya basın, ardından kaydırıcıları tekrar ayarlayabilir ve [sil]'e basabilirsiniz. "Nokta boyutu sınırı" kaydırıcısı, silinecek lekelerin boyutunu sınırlar. "maks. parlaklık" kaydırıcısı, yeterince koyu olmayan lekeleri yok saymak için bir eşik belirler. "min. kontrast" kaydırıcısı, çevresiyle düşük kontrasta sahip lekeleri filtreler. Bu işlem genellikle bir uzlaşmadır. Ayarlar optimal değilse, ağaç yaprakları gibi küçük öznitelikler silinebilir veya büyük lekeler yerinde bırakılabilir. Görüntünün farklı bölümleri farklı ayarlar gerektirebilir, ör. gökyüzü bir bina duvarından daha agresif işlenebilir. Tüm toz lekelerini elde etmek için Tozu Sil'i basitçe farklı ayarlarla birden çok kez kullanabilirsiniz. Ya da görüntüyü bölümler halinde işlemek için {ALAN SEÇ}'i kullanabilirsiniz. Bazı lekeler kalıcıysa, bunları {AKILLI SİLME} ile elle işleyebilirsiniz. Küçük bir fare yarıçapı ayarlayın ve kaldırmak için her lekeye tıklayın. Liflerden (uzun ve ince) kaynaklanan lekeler genellikle otomatik olarak kaldırılmaz, ancak Akıllı Silme burada etkili olabilir. Toz yukarıdaki örnekte olduğu gibi parlaksa, bir renkli negatif yapmak için {RENK MODU}'nu kullanın, tozu işleyin, ardından normal görüntüyü geri yüklemek için renkli negatifi tekrarlayın. - - TOPIC: SAÇAKLAR +image: fringes.png +image: fringesA.jpg - Çevresel renk saçaklarını (yanal kromatik sapma) düzeltin - burada renk saçakları esas olarak görüntünün dış alanlarında görünür. - Yukarıdaki soldaki görüntü, yanal kromatik sapmaya sahip bir fotoğrafın sol üst köşesinin büyütülmüş bir kesitidir. Bu, sağdaki işlenmiş görüntüde büyük ölçüde giderilmiştir. Renk saçakları, özellikle lens bozulmalarının genellikle en büyük olduğu dış görüntü alanlarında, yüksek kontrastlı kenarlar boyunca görünebilir. Bunlardan kurtulmak için, görüntüyü maksimum boyuta yakınlaştırın ve renk saçaklarına sahip bir alana ortalayın. [search] düğmesine basın. Kırmızı ve mavi renk düzlemleri, yeşil düzlemle daha iyi hizalanacak şekilde yeniden ölçeklenir ve kullanılan faktörler iletişim kutusuna yerleştirilir. Faktörleri doğrudan iletişim kutusunda düzelterek sonucu iyileştirebilirsiniz: görüntüdeki renk saçaklarını izlerken faktörleri değiştirin. - Görüntü, görüntü merkezinin artık orijinal fotoğrafın merkeziyle aynı olmayacağı şekilde kırpılmışsa bu işlev daha az etkili olacaktır. - - TOPIC: İNCELTME MENÜSÜ - - TOPIC: HİSTOGRAMI DÜZLEŞTİR +image: flatten1.jpg +image: flatten2.jpg - Zayıf kontrasta sahip alanlarda görünür ayrıntıyı artırın. Piksel etrafındaki alan için parlaklık dağılımını (histogram) daha tek biçimli hale getirmek üzere piksel parlaklığı yukarı veya aşağı ayarlanır. Daha küçük bir yarıçap (daha küçük alan) etkiyi güçlendirir. En koyudan (1) en parlağa (5) kadar 5 parlaklık bölgesi vardır. İlgili bölge için etkiyi artırmak için bir kaydırıcıyı hareket ettirin. Tüm 5 kaydırıcıyı birlikte hareket ettirip hızlıca bir ilk sonuç elde etmek için bölge A kaydırıcısını kullanın. Ardından görüntüyü ince ayar için diğer kaydırıcıları tek tek kullanın. - - TOPIC: YEREL KONTRAST +image: localcon1.jpg +image: localcon2.jpg - Bir görüntünün her alanındaki kontrastı artırın. Her pikselin parlaklığı, çevredeki alanın ortalama parlaklığıyla karşılaştırılır. Bu farkı artırmak için piksel parlaklığı ayarlanır. Bu işlev, yaygın olarak kullanılan bir ders kitabı yöntemini uygular. Yarıçap, ortalama parlaklık için kullanılan her pikselin çevresindeki alanın boyutunu belirler. Güç, parlaklık değişikliğinin miktarını belirler. Renk, renk doygunluğunu artırmak için kullanılır. Seçili parlaklık seviyeleri için çıktı görüntüsünü aydınlatmak üzere düzenlenebilir eğriyi kullanabilirsiniz. Örnek, görüntünün daha koyu alanlarının aydınlatılmasını göstermektedir. - Yerel Kontrast bazı durumlarda "haleler" oluşturabilir: +image: localcon3.jpg - Orijinal görüntü soldadır. Ortadaki görüntüye maksimum güçte Yerel Kontrast uygulanmıştır. Koyu tepeler ile daha açık gökyüzü arasındaki sınır boyunca bir hale görülebilir. Bu, basit bir hileyle (sağdaki görüntü) düzeltilebilir. {ALAN SEÇ} kullanarak gökyüzü alanlarını ayrı ayrı seçin. Bu alana Yerel Kontrast uygulayın. Seçimi tersine çevirin ve görüntünün geri kalanına Yerel Kontrast uygulayın. - - TOPIC: KONTRASTI ARTIR +image: amplify-contrast.png +image: amplify-contrast2.jpg - Yerel kontrastı artırarak bir görüntünün görünen parlaklık aralığını artırın. Yüksek kontrastlı alanları değiştirmeden düşük kontrastlı alanları artırabilir. Kontrast artırımını başlangıç kontrast miktarına göre değiştirmek için düzenleme eğrisini de kullanabilirsiniz. - Eğrinin altındaki Artır kaydırıcısı, kontrast artırımı olmamasından tam artırıma kadar hesaplamayı düzenler. Çok fazla sağa taşınırsa, görüntü çirkin bozulmalar gösterebilir, bu yüzden bunlar kaybolana kadar geri itin. Tek biçimli alanlar (ör. gökyüzü) benekli hale gelirse, düşük kontrastlı alanlar için artırımı azaltmak üzere eğrinin sol ucunu aşağı çekin. Bazı durumlarda görüntünün farklı alanlarını seçip ayrı ayrı işlemek en iyisi olacaktır, ör. gökyüzü için muhafazakâr, taş duvarlar gibi dokulu yüzeyler için daha agresif. - - TOPIC: GENEL RETİNEKS +image: global-retx.png +image: global-retx2.jpg - Aşırı sis/pus veya renk tonuna (ör. 100 yıllık bir fotoğraf) sahip görüntüler için rengi ve kontrastı iyileştirin. Önce [Auto] düğmesini deneyin. Görüntü, mevcut en parlak ve en koyu RGB renklerini bulmak için taranır. En koyu RGB değerleri tüm piksellerden çıkarılır ve ortaya çıkan RGB değerleri, maksimum RGB değerleri 255'e yakın olacak şekilde ölçeklenir. Elbette bu başlangıçta optimal olmayabilir. Döndürme düğmeleri bulunan koyu ve beyaz RGB sınırlarına ayarlanır ve ortaya çıkan görüntüyü optimize etmek için bunları değiştirebilirsiniz. İletişim kutusunda ilgili seçeneği seçip görüntüye tıklayarak kendi koyu ve parlak noktalarınızı seçebilirsiniz. Çarpan döndürme düğmeleri varsayılan olarak 1.0'a ayarlıdır ve her RGB renginin göreli parlaklığını ayarlamak için bu değerleri değiştirebilirsiniz. Yukarıdaki örnekte, 1. görüntü orijinaldir, 2. görüntü [Auto] düğmesi kullanılarak yapılmıştır. Döndürme düğmelerinin en sağdaki sütunu, aynı satırdaki tüm düğmeleri birlikte ayarlar - fare tekerleğini veya klavye yukarı/aşağı ok tuşlarını kullanın. - Karıştırma kaydırıcısı, girdi görüntüsü ve retineks görüntüsünü herhangi bir oranda karıştırmak için kullanılır. Parlaklığı azalt kaydırıcısı, retineksin garip görünen sonuçlar üretebileceği daha parlak görüntü alanları, özellikle gökyüzü için etkiyi zayıflatmak üzere kullanılır. - Algoritma, Edwin Land tarafından 1970'lerde ilk yayınlanan kavramlardan türetilmiştir. Daha fazla bilgi için internette 'retinex' araması yapın. - - TOPIC: YEREL RETİNEKS +image: local-retx.png +image: local-retx2.jpg - Koyu görüntü alanlarında ve düşük kontrasta sahip diğer alanlarda görünür ayrıntıları artırın. Her pikselin etrafındaki bir bölgenin parlaklık aralığı, sanki tüm bölge 0-255 parlaklık aralığının tamamını kaplayacak şekilde yeniden ölçeklendirilmiş gibi piksel parlaklığını yeniden ölçeklemek için kullanılır. Yerel Retineks, Genel Retineksin zayıf olduğu yerlerde çarpıcı sonuçlar üretebilir. - Yarıçap girdisi, her pikselin etrafındaki yaklaşık bölge boyutunu belirler. Karıştırma kaydırıcısı, girdi görüntüsü ve retineks görüntüsünü herhangi bir oranda karıştırmak için kullanılır. Parlaklığı azalt kaydırıcısı, retineksin garip sonuçlar üretebileceği daha parlak görüntü alanları, özellikle gökyüzü için etkiyi zayıflatmak üzere kullanılır. Koyuluğu azalt kaydırıcısı, daha koyu görüntü alanları için aynısını yapar. Yukarıdaki örnek yaklaşık %60 orijinal görüntü + %40 retineksdir. - - TOPIC: DOYGUNLUK +image: saturation.png - Piksel parlaklığına göre renk doygunluğunu ayarlayın. Düzenleme eğrisinin Y ekseni renk doygunluğudur, sıfır renkten (tüm RGB değerleri eşit) maksimum renge (en düşük RGB değeri sıfır) kadar. Eğrinin X ekseni piksel parlaklığıdır, koyudan maksimum parlaklığa kadar. Nötr konum (renk değişikliği yok), aynı zamanda başlangıç değeri olan orta değerdir. Örnek: görüntüdeki koyu alanların renk yoğunluğunu artırmak için eğrinin sol ucunu yükseltin. Doygunluk kaydırıcısı, şeklini değiştirmeden tüm eğriyi yukarı veya aşağı taşır. - - TOPIC: YUMUŞAK ODAK +image: soft-focus2.jpg +image: soft-focus.png - Klasik "yumuşak odak" efektini bir fotoğrafa uygulayın. Bu, keskin bir görüntü ile hafifçe bulanıklaştırılmış bir görüntünün karışımıdır. Yarıçap ayarı bulanıklaştırmanın kapsamını (piksel aralığı) belirler ve karışım ayarı, karışık çıktı görüntüsündeki bulanık görüntünün oranını %0'dan 100'e kadar ayarlar. Görüntünün farklı alanları için etkiyi değiştirmek üzere bu işlevle {BOYALI DÜZENLEMELER}'i kullanabilirsiniz. - - TOPIC: PARLAKLIK GEÇİŞİ +image: brite-ramp1.png +image: brite-ramp2.png - Bir görüntü boyunca parlaklığı veya rengi değiştirin. Bunu, düzensiz aydınlatmayı veya görüntü boyunca değişen bir renk tonunu telafi etmek için kullanabilirsiniz. Değişim yönü, görüntü üzerine bir çizgi çizilerek belirlenir. Görüntüye tıklayarak çizgiyi oluşturun, ardından istenen yönü ayarlamak için herhangi bir ucu sürükleyin. Yukarıdaki örnekte, yeşil çizginin yönünde artırılmıştır. Genel parlaklığı (tüm renkler) ayarlamak için önce Tümü eğrisini düzenleyin, ardından gerekirse tek tek RGB renk eğrilerini ayarlayın. - - TOPIC: VİNYET +image: vignette.png +image: vignette2.jpg - Bir fotoğrafın köşelerinde bazen görülen koyulaşmayı düzeltin. Bir görüntü içindeki bir nesneyi veya alanı vurgulamak veya renklendirmek için de kullanılabilir. - Başlangıçta görüntünün merkezinde olan vinyet merkezini değiştirmek için görüntüye fareyle tıklayın veya sürükleyin. - Görüntünün parlaklığını radyal bir desende değiştirmek için 'Parlaklık'ı seçin: Sırasıyla görüntünün merkezinin ve kenarlarının parlaklığını değiştirmek için eğrinin sol veya sağ ucunu ayarlayın. Bir portre yüzüne koyu bir çevre verebilir veya köşeleri koyulaşmış bir görüntüyü düzeltebilirsiniz. Eğrinin orta seviyesi değişiklik olmadığı anlamına gelir. Koyulaştırmak için daha düşük değerler, aydınlatmak için daha yüksek değerler kullanın. Yukarıdaki örnek, geniş bir merkezi alanı değiştirmeden bırakırken görüntünün çevresini kademeli olarak koyulaştırır. - Görüntüye radyal bir desende seçilen bir renk eklemek için 'Renk'i seçin. Sıfır eğri değerleri değişiklik olmadığını temsil eder ve daha yüksek değerler görüntüye seçilen rengi ekler. En yüksek değer %100 renge karşılık gelir. Bir görüntüye renkli bir çevre eklemek için bu işlevi kullanın, ör. bir yüzü kademeli olarak artan bir renkle çevreleyin. - - TOPIC: EFEKTLER MENÜSÜ - - TOPIC: ANA HATLAR +image: outlines1.png +image: outlines2.jpg - Bir fotoğrafı ana hat çizimine dönüştürün. Yüksek kontrastlı pikseller güçlendirilir ve düşük kontrastlı pikseller bastırılır. Eşik ayarı kontrast eşiklerini belirler. Minimumun altındaki çizgiler gösterilmez ve maksimumdan yüksek olanlar maksimum parlaklığa sahip olur. 'siyah/beyaz' onay kutusu, 'negatif' onay kutusuna bağlı olarak renkli çizgileri beyaz üzerine siyaha veya siyah üzerine beyaza dönüştürür. İsteniyorsa soluk çizgileri aydınlatmak için 'Düşük Artırma'yı kullanın. 'Mod B', 'Mod A'ya kıyasla daha tek biçimli bir çizgi parlaklığıyla sonuçlanır. - - TOPIC: ESKİZ1 +image: sketch1.jpg - Bir fotoğrafı eskiz benzeri bir şeye dönüştürün. Koyu pikseller daha az piksele toplanır, boşalan alanları daha parlak bırakır. Kontrast, koyu pikseller için bir vekil olarak da kullanılabilir. Girdi görüntüsünü parlaklığa göre filtrelemek için Eşik kullanılabilir. Kırpma Seviyesi, izole edilmiş veya sınırda koyu pikselleri daha da azaltmak için çıktıyı filtrelemek üzere kullanılır. Ön plan ve arka plan için renkler seçin. Girdi görüntüsünün boyutunu küçültmek ilginç sonuçlar verebilir. Sonuç "kirli" görünüyorsa, burada işlemeden önce görüntüyü yumuşatmak için {GÜRÜLTÜ GİDER} veya {FÜZYON} kullanın. - - TOPIC: ESKİZ2 +image: sketch2.png +image: sketch2b.jpg - Bir fotoğrafı eskiz benzeri bir şeye dönüştürün. Farklı bir yöntem kullanır: düşük ... yüksek kontrastlı pikseller sırasıyla açık ... koyu piksellere dönüştürülür. Eğri, kontrast dönüşümünün gücünü artırmak veya azaltmak için kullanılabilir. X ekseni ölçeği piksel kontrastıdır, düşükten yükseğe, ve y değeri dönüşümün gücünü belirler. Örnek, düşük kontrastlı piksellerin bastırıldığını (daha açık yapıldığını) göstermektedir. Girdi görüntüsü herhangi bir oranda karıştırılabilir. Sonuç "kirli" görünüyorsa, burada işlemeden önce görüntüyü yumuşatmak için {GÜRÜLTÜ GİDER} veya {FÜZYON} kullanın. - - TOPIC: KARİKATÜR +image: cartoon.jpg - Bir fotoğrafı karikatür benzeri bir çizime dönüştürün. Parlaklık veya renk aniden değiştiği her yerde, görüntüdeki öznitelik kenarları üzerine siyah çizgiler çizilir. Çizgi Eşiği, kenar tespiti ve çizgi çizimi için hassasiyeti belirler ve daha az veya daha fazla çizgi çizilmesine neden olur. Çizgi Genişliği çizgileri kalınlaştırır veya inceltir. Kuwahara Derinliği, görüntü içindeki öznitelik kenarlarını güçlendirebilen bir keskinleştirme işlevini kontrol eder. - - TOPIC: KABARTMA +image: emboss2.jpg +image: emboss.png - Bir görüntüyü simüle edilmiş bir kabartma görüntüsüne (3D efekt) dönüştürün. Öznitelik kenarları, sanki yandan aydınlatılıp kaldırılmış gibi bir tarafta daha parlak, diğer tarafta daha koyu yapılır. Yarıçap ayarı efektin genişliğini belirler ve derinlik ayarı yoğunluğu belirler. Işık Kaynağı ayarı, görünen aydınlatmanın hangi açıdan geldiğini belirler. Bu açıya en dik olan öznitelik kenarları için etkiyi en üst düzeye çıkarmak üzere değiştirilebilir. - - TOPIC: KAROLAR1 Bir görüntüyü tek renkli karolar dizisine dönüştürün. Karo boyutunu ve karolar arasındaki boşluğun kalınlığını kontrol edebilirsiniz. Buna 'pixelate' de denir. Dönüşümü sınırlı bir alanla (ör. bir yüz) sınırlamak için Alan Seç'i kullanın. - - TOPIC: KAROLAR2 +image: tiles2a.png +image: tiles2b.png - Bir görüntüyü, görüntünün renklerine ve konturlarına kabaca uyan düzensiz karolara dönüştürün. ^taban boyutu:^ Daha büyük karolar yapmak için kullanılan birim karo boyutu olan karo taban boyutu. ^renk derinliği:^ Kullanılacak renk sayısı: 1 = 8 renk, 2 = 64 renk ... 8 = 16 milyon renk. ^karo alanı hedefi^: Karo boyutunun üst sınırı (piksel cinsinden alan). ^gerekli renk eşleşmesi^: Daha küçük bir alanın bitişik daha büyük bir alanla birleştirilmesi için gereken minimum renk eşleşmesini ayarlayın: 0 = önemli değil (maksimum birleştirme), 100 = mükemmel eşleşme gerekli (minimum birleştirme). - - TOPIC: BOYAMA +image: painting1.png +image: painting2.png - Bir görüntüyü bir tabloya benzer bir şeye dönüştürün. Renk sayısını azaltır, aynı renge sahip her bitişik piksel alanını haritalandırır, ardından daha küçük alanları en iyi renk eşleşmesine sahip bitişik daha büyük alanlara birleştirir. - ^bulanıklık yarıçapı^: İşlemeden önce görüntüyü bulanıklaştırın. Bu, daha yumuşak sınırlarla sonuçlanır. ^renk derinliği^: Kullanılacak renk sayısı: 1 = 8 renk, 2 = 64 renk ... 8 = 16 milyon renk. ^yama alanı hedefi^: Kendi renklerine sahip olacak alanlar için bir alt sınır ayarlayın: bu piksel sayısından daha küçük alanlar, en yakın renk eşleşmesine sahip bitişik bir alana emilecektir. ^gerekli renk eşleşmesi^: Daha küçük bir alanın bitişik daha büyük bir alanla birleştirilmesi için gereken minimum renk eşleşmesini ayarlayın: 0 = önemli değil (maksimum birleştirme), 100 = mükemmel eşleşme gerekli (minimum birleştirme). ^kenarlıklar^: Renkli alanların, bir mozaikteki düzensiz karolar gibi ince siyah bir sınırla sınırlandırılıp sınırlandırılmayacağını belirler. Bu işlevi kullandıktan sonra, {KABARTMA} kullanmak görüntüye ilginç bir doku ekleyebilir. - - TOPIC: DOKU +image: texture2.jpg +image: texture.png - Bir görüntüye veya görüntü içindeki seçili alanlara dokulu bir yüzey ekleyin. Yarıçap doku deseni boyutunu belirler. Güç, neredeyse görünmezden baskın olana kadar desenin yoğunluğunu belirler. - - TOPIC: FÜZYON +image: fusion.png +image: fusion2.jpg - Daha büyük görüntü özniteliklerinin keskinliğini korurken bir görüntüdeki küçük düşük kontrastlı ayrıntıları bastırın. [başlat]'a basın ve görüntüyü yakından izleyin. İşlem, [durdur] düğmesiyle durdurulana kadar sürekli çalışır. Küçük ayrıntılar yavaşça solacaktır. İletişim kutusundaki 'sayı' etiketi yineleme sayısını gösterir. Görüntüyü incelemek için işlemi [durdur]abilir ve ardından [başlat] ile işlemeye devam edebilirsiniz. Önce/sonra görüntü durumunu karşılaştırmak için Geri Al/Yinele düğmesini kullanın. [başlat] ile işlemeye devam edin. [adım] düğmesi bir seferde bir adım işlemek için kullanılabilir. - - TOPIC: RENKLERİ EŞLEŞTİR +image: match-colors.png - Bir görüntüdeki renkleri başka bir görüntüdekilerle eşleştirin. Bir fare tıklamasıyla seçilen küçük bir nokta, her görüntüden örneklenir. 2. görüntüdeki nokta, 1. görüntüdeki noktayla aynı ortalama renge (RGB değerleri) sahip olacak şekilde yapılır. RGB değerlerini aynı yapmak için kullanılan faktörler daha sonra 2. görüntüdeki tüm piksellere uygulanır. Yaygın bir kullanım, başka bir görüntüden bir rengi eşleştirecek bir nokta işaretleyerek bir görüntüden bir renk tonunu kaldırmaktır. - Prosedür: İletişim kutusu, sırayla izlenecek 5 adımı listeler. • Nokta örnek alanı için bir yarıçap ayarlayın. Ortaya çıkan fare dairesi, örneklenecek nokta alanıdır. • [open] düğmesine basarak 1. görüntüyü açın. • Bir renk örneği almak için görüntüye tıklayın. • [open] düğmesine basarak 2. görüntüyü açın. • 1. görüntüyle eşleştirmek istediğiniz noktada görüntüye tıklayın. Görüntü renkleri bir iki saniye içinde değişecektir. - - TOPIC: DESEN +image: pattern2.jpg +image: pattern1.png - Bir görüntüye arka plan deseni ekleyin. Küçük bir görüntü dosyası (desen dosyası), döşenmiş bir duvar gibi dosyayı çoğaltarak geçerli görüntüyü kaplamak için kullanılır. Bu dosya gerçek bir desen olabilir (ör. bir kanvas kumaş görüntüsü, bir tuğla duvar, tekrarlayan bir geometri ...) veya başka herhangi bir görüntü türü olabilir. Desen yarı saydam yapılır, böylece taban görüntü desenin üzerine basılmış gibi görünür veya desen görüntünün üzerinde görünür. "pattern image" için bir web araması kullanarak birçok desen dosyası bulunabilir. Bunlardan bazılarını indirin ve gerekirse 200-500 piksel civarında bir boyuta kırpın. Kolaylık olması için bunları ~/.fotocx/patterns içindeki sağlanan desen dosyalarına ekleyin. - Bir desen dosyası seçmek için [Göz At] düğmesini kullanın. Seçilen desen, taban görüntüyü kaplayacak şekilde döşenecektir. Desen kısmen saydamdır, böylece taban görüntü görünür. Deseni büyütmek veya küçültmek için Zoom kullanın. Deseni taban görüntüyle karıştırmanın iki yöntemi vardır. Desen opaklığı %0-100 olarak ayarlanabilir. Kullanılmayan opaklığı doldurmak için taban görüntü kullanılır. Kontrast, desen parlaklığını şablon olarak kullanarak taban görüntü parlaklığını değiştirmek için kullanılır. İki parametre herhangi bir oranda karıştırılabilir. - Desen dosyası hem yatay hem de dikey olarak sabit aralıklarla tekrarlanan bir görüntü içeriyorsa, görünür dikişler olmadan sürekli bir desen yapmak için genişlik ve yüksekliği ayarlamak üzere [Hesapla] düğmesi kullanılabilir. - Desen düzensizse ve dikişler görünüyorsa, bunu iyileştirebilirsiniz. İki Örtüşme değeri, çoğaltılan desenlerin kenarlarda yatay ve dikey olarak ne kadar örtüştüğünü belirler. Kenar etkilerini gizlemek için biraz örtüşme ekleyin. - Bir görüntünün bir kısmına desen uygulamak veya farklı kısımlarına farklı desenler uygulamak için Alan Seç kullanılabilir. Bir görüntüye desen uyguladıktan sonra, desene 3 boyutlu bir efekt eklemek için {KABARTMA} kullanmak ilginç olabilir. - "Gri Tonlama" onay kutusu, renkli bir deseni gri tonlamaya dönüştürür. - - TOPIC: ÇAPRAZ TARAMA +image: crosshatch2.jpg +image: crosshatch1.png - Bir görüntüyü çapraz paralel çizgiler kullanan bir çizime dönüştürün. Bir ızgara boyutu girin ve [uygula]'ya basın. - - TOPIC: DITHER +image: dither1.png - +image: dither2.jpg - Bu işlev, bir görüntüyü dither'lamanın (noktalara dönüştürmenin) birkaç yolunu sağlar. 0 - Roy Lichtenstein tarzında renkli noktalar 1 - rastgele veya optimize edilmiş uzamsal dağılımla saf R/G/B veya siyah/beyaz 2 - belirli bir bit derinliği kullanan RGB karışımı 3 - özel bir renk paleti kullanan klasik dither 4 - yoğunlaştırılmış piksellerin ortalama rengiyle görüntüyü lekelere yoğunlaştır - Klasik dither'lar, renk hatalarını telafi etmek için Floyd-Steinberg yöntemini kullanır: bir girdi görüntü rengi ile paletteki en yakın renk arasındaki uyumsuzluk. Bir alan üzerindeki ortalamanın girdi rengiyle daha yakından eşleşmesi için gerektiğinde yakın renklere sahip noktalar karıştırılır. İsteniyorsa, belirgin renk bantları veya konturlar elde etmek için hata telafisi kapatılabilir. - Lekeler: Görüntü pikselleri bir tür "kütle çekimsel çökme"ye uğrar, yerel kütle merkezleri etrafında kümelere yakınsar. 'Kütle', piksel parlaklığı olarak tanımlanır. 'yarıçap' kontrolü kabaca çekim aralığını tanımlar. Çökmeyi başlatmak için [başlat]'a basın. Görüntünün yavaşça 'yarıçap' girdisi boyutunda lekelere dönüştüğünü izleyin. Lekeler güzel ve yuvarlak olduğunda ve çok az değiştiğinde, işlemi bitirmek için [durdur]'a basın. - - TOPIC: OYMA +image: engrave.png +image: engrave2.png - Bir görüntüyü siyah beyaz çizgilere dönüştürün. Boyut girdisi, çizgi kalınlığını ve çıktı çizgilerindeki her dikey piksel sütunu için kaç dikey görüntü pikselinin kullanılacağını belirler. Çizgi piksel sütunları, oranları girdi piksellerinin ortalama parlaklığıyla kabaca eşleşen siyah ve beyaz kısımlara bölünür. Sapma girdisi, genel parlaklığı optimize etmek için kullanılabilir. Negatif/pozitif değerler görüntüyü koyulaştırır/aydınlatır. Renk girdisi (%0-100), beyaz kısımlara renk eklemek için kullanılabilir. - - TOPIC: PARLAMA EKLE +image: addglare.png +image: addglare2.jpg - Bir görüntüdeki parlak noktalardan yayılan parlama ekleyin. Güç: parlamanın göreli parlaklığını belirler Sınır: parlama yayması için eşik piksel parlaklığı Aralık: yayan piksellerden parlamanın piksel aralığı Parlaklığı sınırın (200-255) üzerinde olan pikseller parlama yayar. Buradaki parlaklık, bir pikseldeki en parlak RGB renginin parlaklığı anlamına gelir. Yayılan parlama, yayan pikselin rengindedir. Aralık piksel biriminde verilir. Parlama, yayan pikselde maksimum olacak ve aralık sınırında sıfıra düşecektir. - - TOPIC: MOZAİK +image: mosaic1.png +image: mosaic2.jpg - Tüm görüntülerinizden yapılan karoları kullanarak bir mozaik görüntü oluşturun. - Karo boyutunu piksel olarak belirtin (ör. 36 x 24) ve [Karolar]'a basın. Tüm görüntülerinizden karolar oluşturulacaktır (aslında hız için thumbnail görüntüleri kullanılır). Karo boyutlarını değiştirirseniz, karoları yeniden oluşturmak için [Karolar]'a tekrar basın. Karolar oluşturulduktan sonra, geçerli görüntüyü bu karoları kullanarak bir mozaiğe dönüştürmek için [Görüntü]'ye basın. Karolar, ortalama karo rengini karo konumundaki ortalama görüntü rengiyle eşleştirerek seçilir. Binlerce görüntü mevcutsa ve renk aralığı yeterince iyiyse, mozaik oldukça iyi çıkacaktır. Karo görüntülerini görmek için görüntünün herhangi bir kısmına yakınlaştırın. - Karo karıştırma kaydırıcısı, görüntünün karolarla karıştırılmasına neden olur ve karolar kötü bir renk eşleşmesindeyse daha iyi görünmesini sağlar. Karıştırma yaklaşık %50'den azsa, karolar hemen hemen önceki kadar net kalır, çünkü göz yanlış tonu telafi eder. - Bir mozaik oluşturulduktan sonra, daha büyük bir açılır görüntü almak için herhangi bir karoya tıklayabilirsiniz. Kaydedilmiş bir mozaik açılırsa, daha büyük bir görüntü için karolara tıklamak çalışmayacaktır. Mozaiği yeniden oluşturmak oldukça hızlıdır, bu yüzden açılır pencerelerin çalışmasını istiyorsanız bunu yapın. - - TOPIC: GÜRÜLTÜ EKLE +image: add-noise.png - Bir görüntüye rastgele renk gürültüsü ekleyin. Hedef nokta boyutunu 1-10 ve gürültü seviyesini %0-100 olarak ayarlayın. %100'de, her pikselin her RGB değerine -127 ile +127 arasında rastgele gürültü eklenir. Ortalama değer sıfırdır. 0-255 aralığının dışındaki taşmalar kesilir. Büyük bir alan üzerindeki ortalama renk, gürültü üst üste bindirilerek korunur. Seçili alanlara gürültü eklemek için Gürültü Ekle'yi Alan Seç veya Boyalı Düzenlemeler ile kullanabilirsiniz. - ^'Bantlanma'nın bastırılması Parlaklık dağılımının 'gerildiği' görüntü alanlarında, neredeyse tek biçimli parlaklık ve renge sahip alanlarda görünür 'bantlanma' oluşabilir. Etkilenen alanlara gürültü (veya bulanıklık) ekleyerek bu sorunu azaltabilirsiniz. - - TOPIC: RENKLERİ AYARLA +image: set-colors1.jpg +image: set-colors2.jpg - Bir poster efekti oluşturmak için görüntüde kullanılan renk sayısını azaltabilirsiniz. Her RGB rengini ayrı ayrı ayarlayın veya toplam renk sayısını değiştirin. Bunun için renk bit derinliği kullanılmaz. Fotocx'teki bazı işlevler bit derinliği kullanır, her RGB rengi için kullanılabilir renkleri 2, 4, 8 ... ile sınırlar. Bu işlev bu açıdan sınırlı değildir. Yukarıdaki örnek 8 kırmızı, 5 yeşil ve 3 mavi renk kullanır. - - TOPIC: RENKLERİ KAYDIR +image: shift-colors.png - Bu işlev, renkleri düzeltmek veya bir görüntüyü yanlış renklere dönüştürmek için kullanılabilir. Üç RGB renginden herhangi birini seçin ve kaydırıcıyı merkezden sola veya sağa hareket ettirin. Diğer iki renkten biri kademeli bir şekilde ikame edilecektir. Örneğin, kırmızı rengin yerine kademeli olarak yeşil veya mavi koyabilirsiniz. Tümü kaydırıcısı tüm renkleri birlikte kaydırır. İlk bir optimum bulmak için önce bunu yapın, ardından RGB renklerini tek tek kaydırın. - - TOPIC: UZAYLI RENKLER +image: alien-colors2.jpg +image: alien-colors1.png - Bir görüntüyü veya seçili alanı rastgele uzaylı renklerle yeniden boyayın. Kaba desen boyutunu ve yoğunluğu (neredeyse görünmezden baskın olana kadar) kontrol edebilirsiniz. Yeni bir renk dağılımı elde etmek için [Uygula]'ya basın. - - TOPIC: ÖZEL ÇEKİRDEK +image: custom-kernel.png - Bir görüntüye özel bir evrişim çekirdeği uygulayın. Altta yatan teknoloji Wikipedia'da açıklanmaktadır. Bir çekirdek boyutu, bir çarpma faktörü, bir ekleme faktörü girin ve tablo değerlerini doldurun. [Uygula] çekirdeği görüntüye uygular. [Sıfırla] orijinal görüntü durumunu geri yükler. Değerler bir dosyaya kaydedilebilir ve daha sonra [Kaydet] ve [Yükle] düğmeleri kullanılarak alınabilir. Başlangıçta birkaç örnek çekirdek dosyası mevcuttur. Bunları değiştirebilir ve özel bir adla kaydedebilirsiniz. - Matematik: görüntüdeki her N'e N piksel bloğu için parlaklık değerleri, çekirdek matrisindeki karşılık gelen değerlerle çarpılır ve toplanır. Bu sayı çarpma faktörüyle çarpılır ve ekleme faktörü buna eklenir. Bu son değer, N x N bloğunun merkezindeki görüntü pikseli için yeni parlaklık seviyesi olur. - - TOPIC: ÇARPITMA MENÜSÜ - - TOPIC: DÜZELT +image: unbend1.png +image: unbend2.jpg - Yakın öznelerin (genellikle binalar veya iç mekanlar) panoramaları, eğri görünen düz çizgiler veya eğik görünen binalar gösterebilir. Görüntülerin bir araya gelmesi için panorama işleminde görüntüleri çarpıtmak gerekliydi. Gerekirse panorama görüntüsünü düzeltmek için sonradan Düzelt işlevi kullanılabilir. Görüntünün üzerine, düzeltme eksenlerini gösteren dikey ve yatay noktalı çizgiler çizilir. Bir çizgiyi taşımak için ucuna yakın bir yere fareyle tıklayın veya sürükleyin. Dört girdi kontrolündeki değerler değiştirilirse, görüntü karşılık gelen dört görüntüde gösterilen şekilde çarpıtılır. Memnun olana kadar değerleri artırın veya azaltın ve tekrarlayın. Çarpıtma merkezlerini değiştirmek için eksenleri hareket ettirin. - Görüntü eğriliğini ve perspektifini düzeltmenin başka bir yöntemi için ayrıca {GÖRÜNTÜYÜ ÇARPIT}'a bakın. - - TOPIC: PERSPEKTİF +image: perspective2.jpg +image: perspective1.png - Bu işlev, kaymış bir açıdan çekilmiş bir fotoğrafı düzeltmek için kullanılabilir. Soldaki görüntü, yansımalardan kaçınmak için merkezin sağından çekilen orijinal fotoğraftır. Sağdaki görüntü düzeltilmiş sürümdür. Bu işlev, sokak seviyesinden veya yandan çekilmiş yüksek bir binayı düzeltmek için de kullanılabilir. - Dikdörtgen yapmak istediğiniz dörtyüzlünün dört köşesine tıklayın (yukarıdaki durumda, tablonun veya çerçevenin dört köşesi), ardından [Uygula]'yı seçin. Tıklanan köşeler "A, B, C, D" içeren küçük beyaz kutularla işaretlenir. Her kutunun sol üst köşesi görüntü konumunu tam olarak işaretler. Bir kutunun yakınına tıklamak onu yeni konuma taşır. Köşe işaretçilerini 1 piksellik adımlarla taşımak için klavye ok tuşlarını kullanabilirsiniz. Ok tuşları son tıklanan veya taşınan köşe üzerinde çalışır. - - TOPIC: GÖRÜNTÜYÜ ÇARPIT +image: warps4.jpg - - TOPIC: ALANI ÇARPIT Bu işlev, bir görüntü içinde bozulmalar yapmak için kullanılabilir. Bir görüntü alanı seçip bu alanı görüntünün geri kalanına göre germek için fareyi sürükleyebilirsiniz. Görüntü lastik gibidir. Fare sürüklemesi seçili alan içinde başlarsa, alan geçerli sınırları içinde çarpıtılır - hareket fare imlecinde maksimumdur ve alan kenarlarında sıfıra düşer. Fare sürüklemesi seçili alanın dışında başlarsa, farenin yakınındaki alan kenarları orijinal alan sınırının ötesine çekilebilir. İstenen sonuçları elde etmek için farklı uzunluk ve yönlerde birçok fare sürüklemesi birleştirilebilir. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - Bu işlev perspektif sorunlarını düzeltmek için kullanışlıdır. Fareyi kullanarak görüntüyü bir köşenin yakınından sürükleyin. Diğer köşeler sabit kalırken görüntü bu köşeden elastik olarak çekilir. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - Bu işlev perspektif sorunlarını düzeltmek için kullanışlıdır. Fareyi kullanarak görüntüyü iç kısımdan sürükleyin. Kenarlar sabit kalırken görüntünün iç kısmı elastik olarak çekilir. - - TOPIC: EĞRİSEL ÇARPIT Bu işlev perspektif sorunlarını düzeltmek için kullanışlıdır (ayrıca bkz. {DÜZELT}). Fareyi kullanarak görüntüyü herhangi bir konumdan sürükleyin. Tüm görüntü farenin yönünde çekilir veya itilir, ancak farenin yakınındaki alanlar daha uzak alanlardan daha fazla hareket eder. Eğri çizgileri düzeltebilir veya görüntüyü kasıtlı olarak eğebilirsiniz. 'çarpıtma aralığı' kontrolü, fare çevresindeki çarpıtma yarıçapını belirler. 1.0, tüm görüntünün çarpıtıldığı anlamına gelir ve daha küçük değerler çarpıtmayı farenin çevresindeki daha küçük alanlarla sınırlar. - - TOPIC: AFİN ÇARPIT Bu işlev, bir görüntüyü ilginç şekillerde çarpıtmak için kullanılabilir. Fareyi kullanarak görüntüyü bir köşeden veya kenardan sürükleyin. Değişiklikler tamamen doğrusaldır, bu yüzden düz çizgiler düz kalır. Bu dönüşüme "afin" denir. Ayrıntılar bir web aramasıyla bulunabilir. - - TOPIC: RADYAL ÇARPIT +image: warp_radial.png - Fıçı veya yastık bozulmasını ekleyin veya kaldırın. Fıçı bozulması, bu bozulmayı kaldırmak için işlenmemiş RAW görüntülerde sıkça görülür. Değişikliklerin merkezleneceği bir merkez nokta seçmek için sol tıklayın - normalde görüntünün merkezi. Bu varsayılandır. Görüntüyü bükmek için 'uzat' kaydırıcısını hareket ettirin. - - TOPIC: YAKIN ÇEKİMİ DÜZELT +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - Yakın çekim yüz fotoğrafları genellikle bozulur, çünkü kameraya daha yakın alanlar fotoğrafta daha uzak alanlardan daha büyük görünür. Bu işlev bozulmayı tersine çevirmek için kullanılabilir. Önce yüzü seçmek için {ALAN SEÇ}'i kullanın (doğru olması gerekmez). Bozulma merkezinin yakınına görüntüye tıklayın (yukarıdaki örnek: sağ yanak). Optimize etmek için kaydırıcıyı hareket ettirin. - - TOPIC: DALGA OLUŞTUR +image: make-waves2.jpg +image: make-waves1.png - Bu işlev, bir görüntüyü sanki türbülanslı su içinden görülüyormuş gibi bir dalga desenine dönüştürür. İletişim kutusu, ortalama yatay ve dikey dalga boyunu, genliği ve varyansı değiştirmenizi sağlar. "perspektif" girdisi, dalga boylarının üstten alta doğru kademeli olarak uzamasını sağlar. - - TOPIC: BÜKME +image: twist1.png +image: twist2.png - Bu işlev, bir fare tıklaması veya sürüklemesiyle seçilen bir nokta etrafında görüntüyü büker. İstenen konuma tıklayın ve Bükme kaydırıcısını istenen miktarda hareket ettirin. Bükme merkezini değiştirmek için fareyi görüntü etrafında da sürükleyebilirsiniz. Merkez kaydırıcısı, merkezi alanın bükülmesini geri kalanına göre çözer. Açı kaydırıcısı görüntüyü döndürür. - - TOPIC: KÜRE +image: sphere2.jpg +image: sphere.png - Bir görüntünün küresel bir izdüşümünü oluşturun. İzdüşümün merkezini değiştirmek için görüntüde fareyi sürükleyin (varsayılan orta noktadır). Düzleştir kontrolü, izdüşümü bir küreden (sağda) düz bir görüntüye (solda) kademeli olarak değiştirir. Büyüt kaydırıcısı, ortaya çıkan görüntüyü 2x'e kadar büyütür. - - TOPIC: İÇTEN DIŞA +image: inside-out2.jpg +image: inside-out1.png - Bu işlev, her pikselin merkez-kenar mesafelerini tersine çevirir. Merkez noktasını değiştirmek için fareye tıklayabilir veya sürükleyebilirsiniz. - - TOPIC: MİNİK GEZEGEN +image: tiny-planet.jpg - Bir görüntüyü bir daire etrafına sarın. Görüntü 360 derecelik bir panoramaysa, görünür bir dikiş olmayacaktır. • Merkez Delik: görüntü merkezi bir delik etrafına sarılır. • Üstten Kes: girdi görüntüsünden üst kenar boşluğunu kaldır. • Alttan Kes: girdi görüntüsünden alt kenar boşluğunu kaldır. • R'yi Ters Çevir: girdi görüntüsünü dikey olarak aynala. • Theta'yı Ters Çevir: girdi görüntüsünü yatay olarak aynala. • Döndür: çıktı görüntüsünü merkez etrafında çevir. - - TOPIC: ESCHER SARMALI +image: escher-spiral.png +image: escher-spiralA.png - Bir görüntüyü, M.C.Escher'in ünlü saati gibi sonsuz bir içe doğru sarmala dönüştürün. Genişlik, en dıştaki katmanın başlangıç genişliğini belirler. Kenar, katmanları ayıran sınırın başlangıç genişliğini belirler ve Renk onun rengini belirler. Varsayılan merkez, görüntünün merkezidir. Yeni bir merkez ayarlamak için görüntüye tıklayın. - - TOPIC: FOTOĞRAFI DÜZLEŞTİR +image: flatten-photo1.png +image: flatten-photo2.jpg - ^Kitap sayfası veya diğer eğri yüzey Eğri bir yüzeydeki bir görüntünün fotoğrafını düzleştirin, ör. bir sütun etrafında veya sayfaların ortadaki ciltte içe doğru kıvrıldığı açık kalın bir kitaptan bir sayfa. Yüzeyin üst ve alt kenarlarının eğriliği, eğrilik miktarı ve düz görünmesi için gereken germe miktarı hakkında bilgi sağlar. Yukarıdaki örnek kalın bir kitaptır. Diğer yuvarlak yüzeyler düzeltilebilir, ör. yuvarlak bir sütun üzerindeki bir poster. - Eğri sayfanın üst kenarını izlemek için üst iz seçeneğini seçin. Kenar boyunca fareyi tıklayarak her tıklanan noktada bir işaretçi noktası oluşturun. 4 nokta mevcut olduğunda, noktalar arasından eğri bir çizgi çizilir. Çizginin görüntü eğrisine yakından uyması için gerektiğinde daha fazla nokta ekleyin ve noktaları sürükleyin. Alt iz seçeneğini seçin ve alt kenarı aynı şekilde izleyin. Her ikisi de tamamlandığında, sayfayı düzleştirmek için [flatten]'e basın. Kenarlar artık düz olmalıdır (veya yeterince düz). Eğrilikten kaynaklanan yanal sıkışmayı telafi etmek için görüntünün kenarlarını gerektiği kadar germek üzere [stretch] kaydırıcısını kullanın. Doğru genişlik/yükseklik oranını geri yüklemek için görüntüyü gerektiği kadar genişletmek üzere Genişlet kontrolünü kullanın. [undo] düğmesi, işaretçi noktalarını koruyarak değiştirilmemiş görüntüyü geri yükler, böylece bunlar düzeltilmiş bir deneme için ayarlanabilir. - +image: flatten-photo3.jpg - ^Eğri ufuk çizgisi Geniş bir panorama veya geniş açılı bir lensten çekilen bir fotoğraf, düz veya yatay olmayan bir ufka sahip olabilir. Görüntü, ufuk çizgisi veya düz bir çizgi boyunca hizalanması gereken diğer alanlar boyunca bir eğri izlenerek düzeltilebilir (veya başka şekilde taşınabilir). Ufuk çizgisinin (veya görüntünün diğer kısmının) çoğunlukla görüntü ortasının üstünde mi yoksa altında mı olduğuna bağlı olarak üst veya alt iz seçeneğini seçin. Görüntü, bu eğriyi düzleştirmek için çarpıtılacaktır. Bir eğri yeterlidir. Diğer eğri, görüntünün karşı kenarına (üst veya alt) otomatik olarak eklenir. Sonuç tatmin edici değilse, [undo] düğmesini kullanın, her iki eğrideki işaretçileri ayarlayın ve tekrar deneyin. Ayrıca görüntüyü kaydedip işlevi ikinci kez, kaydedilen görüntüyü başlangıç noktası olarak kullanarak uygulayabilirsiniz. - - TOPIC: BİRLEŞTİR MENÜSÜ Bunlar, birden çok görüntü dosyasını birleştiren işlevlerdir. Örtüşen görüntüler söz konusu olduğunda, her görüntüdeki karşılık gelen öznitelikler tek piksel doğrulukla çakışacak şekilde hizalanır. Hizalama süresi tipik olarak görüntü başına 10-30 saniyedir. Bu hizalama işleminin yanlış gittiğini görürseniz, işlemi öldürmek için Escape tuşunu kullanabilirsiniz. - - TOPIC: HDR ^Yüksek Dinamik Aralık +image: HDR.jpg +image: HDR-adjust.png - Aynı öznenin farklı pozlama seviyelerine sahip birden çok görüntüsünü birleştirin (üst üste bindirin). Birleştirilmiş görüntü, hem daha koyu hem de daha parlak alanlarda geliştirilmiş ayrıntı görünürlüğü gösterebilir; aslında koyu alanlar için daha parlak görüntülerdeki pikseller, parlak alanlar için daha koyu görüntülerdeki pikseller kullanılır. Kamera çekimler arasında elle ayarlanıyorsa, düzgün tutmaya ve aynı uzak noktayı hedeflemeye dikkat edin. Girdi görüntülerinde bir miktar hizalama bozukluğuna tolerans gösterilebilir. İnsanlar veya nesneler çekimler arasında hareket ederse, hayalet görüntüler kaçınılmazdır. - HDR menü işlevini seçin ve hepsi neredeyse aynı piksel boyutlarına sahip olması gereken en fazla 9 görüntü seçin ({GÖRÜNTÜ DOSYALARINI SEÇ}). Görüntüler otomatik olarak hizalanır ve birleştirilir. Bittiğinde, birleştirilmiş görüntü, ayarlamalar için bir iletişim kutusuyla birlikte gösterilir. Girdi görüntülerinin katkıları bir dizi düzenlenebilir eğri olarak gösterilir. Yatay ölçek, koyudan parlağa piksel parlaklığını temsil eder. Her eğri, çıktı piksellerine katkıda bulunan bir görüntüyü temsil eder. Belirli bir parlaklık seviyesindeki görüntü katkısı, o seviyedeki eğrisinin yüksekliğiyle orantılıdır. En parlak görüntü için ilk eğri solda yüksek ve sağda düşük olacaktır, bu da koyu piksellere yüksek katkı ve parlak piksellere düşük katkı anlamına gelir. En koyu görüntü solda düşük ve sağda yüksek olacaktır ve kalan görüntüler aradadır. Eğriler fareyle sürüklenerek düzenlenebilir. Karşılık gelen görüntü katkıları buna göre değişir ve sonuçları çıktı görüntüsünde gerçek zamanlı olarak görebilirsiniz. Yukarıdaki görüntü iki girdi görüntüsünü ve çıktı görüntülerini göstermektedir. Örnek iletişim kutusu, üç girdi görüntüsünü optimize etmek için ayarlanmış üç eğriyi göstermektedir. - - TOPIC: HDF ^Yüksek Alan Derinliği Yakından uzağa farklı odak ayarlarına sahip aynı öznenin birden çok fotoğrafını birleştirin (üst üste bindirin). Öznenin farklı kısımları her görüntüde keskin odaktadır. Öznenin tüm kısımlarının keskin olması için görüntüleri birleştirin. - Fotoğrafları çekme: Görüntünün merkezi için bir nokta seçin. Kamerayı yakın bir nesneye doğrultun ve odağı bu nesneye ayarlamak için deklanşör düğmesini yarısına kadar basılı tutun. Düğmeyi yarım konumda tutun, kamerayı seçilen merkeze doğrultun ve fotoğrafı çekin. Şimdi daha uzak bir nesne seçin ve aynısını yapın. Artan odak mesafesiyle tekrarlayın. Umarım öznenin her kısmı en az bir fotoğrafta keskindir. Kamera konumu tüm fotoğraflar için neredeyse aynı olmalıdır, bu da özne çok yakınsa zor olabilir. Kamera hareketi ölçeklendirme ve paralaks sorunlarına neden olabilir (yakın nesnelerin uzak nesnelere göre kayması). Bu tür sorunlar daha sonra Fotocx'te düzeltilebilir, ancak bu önemli miktarda zaman gerektirebilir. Sorunlardan kaçınmak daha iyidir. - +image: HDF-paint.png - Fotoğrafları işleme: HDF menü işlevini seçin ve en fazla 9 görüntü seçin ({GÖRÜNTÜ DOSYALARINI SEÇ}). Görüntüler artık mümkün olduğunca iyi hizalanacaktır. Çıktı görüntüsü, hizalanmış girdi görüntülerinin eşit bir karışımıdır. Fotoğraflar arasındaki küçük miktarda kamera hareketi telafi edilir, ancak bu sınırlıdır ve paralaks kaymaları hiç telafi edilmez. Hizalama tamamlandığında, bir iletişim kutusu açılır. Herhangi bir girdi görüntüsünü seçebilir ve fareyle çıktı görüntüsünün herhangi bir alanında "boyayabilirsiniz". Bu, boyanan alan için orijinal görüntü karışımını tek seçili görüntüye dönüştürür. Görüntüdeki her alan veya nesne için, o alanda keskin olan bir girdi görüntüsü seçin. Fırçanın yarıçapı daha büyük veya daha küçük ayarlanabilir, böylece büyük alanları hızlıca boyayabilir ve gerektiğinde ince ayrıntıyı kontrol edebilirsiniz. Örtüşen yakın ve uzak nesneleriniz varsa, hepsini keskin yapmak için zaman ve sabır gerekecektir. İletişim kutusunda çarpıtma seçeneğini seçerek hizalama bozuklukları düzeltilebilir. Ardından altta yatan görüntüler fareyle sürüklenip çarpıtılabilir ve birleştirilmiş çıktı görüntüsü buna göre değişir. Çarpıtma, fare çevresindeki alanla sınırlıdır. Boyanmış bir alan sürüklendiğinde, karşılık gelen girdi görüntüsü otomatik olarak seçilip sürüklenirken, diğer görüntülerle boyanmış alanlar sabit kalır. Boyanmamış alanlar sürüklenemez. Hepsi hizalanana kadar farklı alanlara geçin ve kademeli sürüklemeler yapın. - Önerilen İş Akışı: Boyama modunu kullanarak, her görüntüyü sırayla seçin ve o görüntüde keskin görünen tüm alanları boyayın. İyi hizalanmamış sınırlar, görüntü özniteliklerinin kenarlarındaki kaymalar olarak açıkça ortaya çıkacaktır. Bunlardan bazıları, boyama için kullanılan görüntüyü değiştirerek önemsiz hale getirilebilir (birden fazla görüntü yeterince keskinse). Çarpıtma modunu kullanarak, görünür kaymaları ortadan kaldırmak için gerektiğinde ince ayarlamalar yapın. - - TOPIC: YIĞIN/BOYAMA +image: stack-paint.png - +image: stack-paint2.jpg - Farklı zamanlarda çekilen aynı öznenin birden çok fotoğrafını yığın halinde birleştirin (üst üste bindirin). Çekimler arasında gelip giden turistleri ve arabaları kaldırın. - Fotoğrafları çekme: Kamerayı aynı uzak noktaya doğrultun ve turistler veya arabalar öznenin önünden geçerken birden çok fotoğraf çekin. Geçici nesnelerle engellenmeyen öznenin her alanı için iki veya daha fazla fotoğraf almaya çalışın. Kamerayı sabit tutun ve aynı noktaya doğrultun, böylece görüntüler doğru bir şekilde hizalanır. - Fotoğrafları işleme: Yığın/Boyama menü işlevini seçin ve en fazla 9 görüntü seçin ({GÖRÜNTÜ DOSYALARINI SEÇ}). Görüntüler artık mümkün olduğunca iyi hizalanacaktır. Çıktı görüntüsü (sol alt), hizalanmış girdi görüntülerinin (üst sıra) eşit bir karışımıdır. Hizalama tamamlandığında, yukarıda gösterilen iletişim kutusu başlar. Herhangi bir girdi görüntüsünü seçebilir ve fareyle çıktı görüntüsünün herhangi bir alanında "boyayabilirsiniz". Boyanan alan için tek seçili görüntü kullanılır. Görüntüdeki her alan için, geçici nesnelerden arınmış bir girdi görüntüsü seçin. Fırçanın yarıçapı daha büyük veya daha küçük ayarlanabilir, böylece büyük alanları hızlıca boyayabilir ve gerektiğinde ince ayrıntıyı kontrol edebilirsiniz. - Otomatik işlem: geçici nesnelerin otomatik olarak kaldırılıp kaldırılamayacağını görmek için [Gizle] düğmesine basın. Bu, görüntüde engelsiz arka planın birden çok fotoğrafının mevcut olduğu alanlar için çalışır (alt orta görüntü). Tüm geçici nesneleri göstermek için [Göster] düğmesine basın (alt sağ görüntü). Bu genellikle çalışır, ancak mükemmel değildir. Hafif görüntü hizalama bozuklukları veya aydınlatma farklılıkları (özellikle hareket eden gölgeler) algoritmanın ön plan pikselleri yerine arka plan pikselleri seçmesine neden olabilir. Hataları elle onarmak için yukarıda açıklanan boyama yöntemini kullanabilirsiniz. - - TOPIC: YIĞIN/GÜRÜLTÜ +image: stack-noise2.jpg +image: stack-noise.png - Bu işlev, aynı öznenin 2-9 fotoğrafını birleştirir. Fotoğraflar, elde tutulan bir kameranın neden olduğu küçük kaymalar dışında neredeyse aynı olmalıdır. Fotoğraflar çok yüksek bir ISO ayarıyla (düşük ışık koşulları) çekildiyse, pikseller önemli miktarda gürültüye sahip olacaktır. Birçok fotoğraf çekip bunları ortalayarak gürültü büyük ölçüde ortadan kaldırılabilir. - Fotoğrafları işleme: Yığın/Gürültü işlevini seçin ve en fazla 9 görüntü seçin ({GÖRÜNTÜ DOSYALARINI SEÇ}). Otomatik olarak birleştirilip gösterilecek ve bir iletişim kutusu açılacaktır. İlk çıktı görüntüsü, seçili tüm girdi görüntülerinin birlikte ortalanmış bir kombinasyonudur. Bu, her çıktı pikseli için RGB değerlerinin karşılık gelen girdi piksellerinin RGB değerlerinin ortalaması olduğu anlamına gelir. Medyan düğmesi, çıktı piksellerini girdi piksellerinin medyanına değiştirecektir (görüntü sayısına bağlı olarak 1-3 orta RGB değeri ortalanır). Bu daha iyi olabilir veya olmayabilir, bu yüzden karşılaştırmak için ileri geri geçiş yapın. Düşük pikseli hariç tut ve yüksek pikseli hariç tut onay kutuları, ortalamadan önce en düşük ve en yüksek RGB girdi değerlerinin atılmasına neden olur. Bu, gürültü sivri uçlarının karışımdan kaldırılmasını sağlayabilir. Medyan yöntemi seçiliyse bunun bir etkisi yoktur. - - TOPIC: YIĞIN/KATMANLAR +image: stack-layers.png - Bir görüntünün farklı düzenlenmiş sürümlerini birleştirmek için bu işlevi kullanın, burada seçili görüntü alanlarında hangi sürümün gösterileceğini belirleyebilirsiniz. Aynı piksel boyutlarına sahip herhangi bir görüntü birleştirilebilir. - Aynı boyutta en fazla 9 görüntü seçin. İlk çıktı görüntüsü, tüm girdi görüntülerinin eşit bir karışımıdır. Görüntü Oranları, karıştırılan görüntülerin göreli ağırlıklarıdır. Her görüntünün ağırlığını değiştirmek için bunlar ayarlanabilir. Örnek: 3, 5, 7 göreli ağırlıklarla 3 görüntü birleştirilirse, birleştirilmiş görüntü #1 görüntüsünden 3/15, #2'den 5/15 ve #3'ten 7/15'tir. "Tüm görüntüyü boya" seçeneği seçiliyse, ağırlıklar ayarlanabilir ve çıktı görüntüsü anında tepki verir. "Fare içinde boya" seçeneği seçiliyse, fare sürüklenebilir ve yalnızca fare dairesi içindeki alan, o anda etkin olan görüntü oranları kullanılarak boyanır. Boyama hızı, fare merkezi ve kenarı için Güç ayarlarıyla kontrol edilir. Kademeli boyamak için düşük sayılar kullanın. - - TOPIC: PANORAMA +image: pano-align1.jpg +image: pano-align2.jpg - Bu işlev, geniş açılı bir görüntü veya panorama yapmak için 2-6 görüntüyü birbirine diker. Programın nerede eşleştiklerini bulup birbirine bağlayabilmesi için görüntülerin %10 veya daha fazla örtüşmesi gerekir. 2-6 görüntü dosyası seçerek başlayın ({GÖRÜNTÜ DOSYALARINI SEÇ}). İlk kaba hizalamayı kolaylaştırmak için görüntüleri soldan sağa sırayla seçmek faydalıdır. Görüntüler başlangıçta birleştirilir ve küçük bir saydam örtüşmeyle gösterilir. Bir ön hizalama iletişim kutusu (yukarıda), görüntüleri kaba bir hizalamaya sürüklemenizi ister. Görüntüleri doğru soldan sağa sıraya sürükleyin. Sürüklenen görüntü diğer görüntülerle örtüşebilir. Hangi görüntünün sürüklendiğini netleştirmek için görüntü merkezine yakın bir yerden sürükleyin. Görüntüler doğru sırada olduktan sonra, her görüntüyü soldaki komşusuyla hizalayın. Soldan sağa ilerlemek en iyi sonucu verir. Bir görüntüyü soldaki komşusuyla kaba bir şekilde hizalamak için yatay ve dikey olarak taşıyın, ardından gerekirse alt kenarı sola veya sağa sürükleyerek görüntüyü döndürün - görüntü, soldaki görüntüyle örtüşmesinin orta noktası etrafında döner. En hızlı yöntem, önce örtüşmenin orta bölgesini hizalamak, ardından üst ve alt örtüşme bölgelerini hizalamak için gerekirse sağdaki görüntüyü döndürmektir. Aşırı doğruluk GEREKLİ DEĞİLDİR. Görüntüler doğru şekilde eğri olmalı ve iyi bir şekilde bir araya gelmelidir. Değillerse, 'lens mm' (odak uzaklığı, 35mm eşdeğeri) ayarlanmalıdır. Lens mm ayarlandıkça görüntü eğriliği değişir. Başlangıç değeri mevcutsa EXIF metadata'sından elde edilir ve bu normalde yeterince iyidir. Görüntülerin eğriliği yoksa (ör. taranmış görüntüler), 'lens mm'yi etkili bir şekilde sonsuza ayarlamak için 'eğri yok' onay kutusunu kullanın. - Görüntülerden herhangi biri kırpılmışsa, EXIF odak uzaklığına bağlı matematik çalışmaz. 'lens_mm' içindeki odak uzaklığını artırarak telafi edebilirsiniz. - 'elle hizala' onay kutusu, elle yapılan ön hizalamayı nihai hizalama olarak kullanacaktır. Bu, görüntüleri hizalamak için gereken net özniteliklere sahip olmayan görüntüler içindir. Bu seçenek ayrıca görüntülerin sıfır örtüşmeye sahip olmasına da izin verir. - Ön hizalama bittiğinde [proceed]'e basın, program ince hizalama yapacak ve görüntüleri birleştirecektir. Dahili olarak, görüntüler kaydırılır ve döndürülür ve eşleşme derecesi değerlendirilir. Bu, en iyi hizalama bulunana kadar artan görüntü boyutlarıyla yapılır. Bu, CPU hızına ve görüntü boyutuna bağlı olarak bir dakika veya daha fazla sürebilir. Girdi görüntülerini 2/3 veya 1/2 boyutuna küçültürseniz işlemi büyük ölçüde hızlandırabilirsiniz. Bellek yetersizliği nedeniyle işlem başarısız olursa bunu da yapın. - +image: pano-adjust.jpg - İnce hizalama tamamlandığında, birleştirilmiş görüntü görüntülenir. Yukarıdaki iletişim kutusu, parlaklığın ince ayarlanması için başlatılır. Aynı parlaklığa sahip değillerse görüntüler arasında bir sınır görebilirsiniz. Üstteki radyo düğmelerini kullanarak bir görüntü seçin. Görüntülerin parlaklık/renk eşleşmesini otomatik olarak iyileştirmek için [otomatik renk] düğmesini tekrar tekrar kullanın. Taban görüntü, o anda seçili olan görüntüdür. Hangisinin en iyi çalıştığını görmek için farklı taban görüntüleri deneyin. Görüntüler parlaklık açısından kötü şekilde uyumsuzsa, en büyük aykırı değeri seçin ve diğerleriyle eşleştirmek için parlaklığı değiştirmek üzere parlaklık kontrolünü kullanın, ardından [otomatik renk]'i kullanın. Eşleşmenin çok iyi olması gerekmez, çünkü 'Karıştırma Genişliği' (sonraki) kalan farkları maskeleyecektir. Girdi görüntü dosyalarından parlaklık seviyelerini sıfırlamak için 'Dosya Rengi' düğmesini kullanın. - 'Karıştırma Genişliği' kontrolü, görüntülerin nasıl birlikte karıştırıldığını yönetir: görüntü örtüşmelerinde, tam olarak düzeltilemeyen dengesizlikleri maskelemek için parlaklık bu kadar piksel üzerinden değiştirilir. Varsayılan 1 pikseldir, bu da herhangi bir parlaklık farkını belirgin hale getirir. - Görüntüler mükemmel şekilde hizalanmıyorsa, görüntüleri hizalamaya itmek için fareyi kullanarak hizalamayı iyileştirebilirsiniz. 'Fare Çarpıtması'nı seçin ve radyo düğmeleriyle görüntülerden birini seçin. Ardından görüntüyü komşusuyla hizalanması gereken kenar boyunca fareyi sürükleyerek görüntüyü hizalamaya taşıyın. Görüntü, fare çevresinde yerel olarak taşınırken daha uzak kısımlar sabit kalır. Paralaks kayması olan görüntüler bir uzlaşma gerektirecektir, çünkü hem ön planı hem de arka planı hizalı tutmak imkansızdır. - Düzleştir görüntü kontrolü, görüntüyü "düzeltmek" için kullanılabilir, bu da eğri çizgileri (ör. eğri binalar) düzleştirir. Sıfır değerinin etkisi yoktur ve 1.0 değeri görüntüyü tamamen düzleştirir. - Bittiğinde, son ayarlamalar için {DÜZELT}, {GÖRÜNTÜYÜ ÇARPIT}, {KIRP} vb. kullanın. - ^Taranmış görüntüler Yeterli örtüşme varsa taranmış görüntüler birleştirilebilir. Eğrilik olmadığından 'eğri yok'u işaretleyin. - ^Otomatik Çarpıtma Görüntüler, en iyi eşleşmeyi bulmak için hizalama sırasında çeşitli yönlerde hafifçe çarpıtılır. Bu, kamera ufkundaki kaymaları veya döndürmeyi telafi etmek içindir, bu da uyum kalitesini azaltan görüntü bozulmalarına neden olur. İki görüntünün örtüşme alanı, iki fotoğraf arasında hareket eden büyük bir nesne içeriyorsa, hizalama işlemi görüntüleri eşleştirmeye çalışırken çılgına dönebilir ve hizalamayı çok kötü hale getirebilir. 'otomatik çarpıtma yok'u seçerek hizalamanın başarılı olmasını sağlayabilir veya daha küçük bir hata elde edebilirsiniz. Başka bir seçenek de elle hizalamayı seçmektir. - ^Panoramaları Birleştirme Tek bir geçişte en fazla 6 görüntüden oluşan bir panorama yapabilirsiniz. Ayrıca kenarlarda bir araya gelen panoramaları da birleştirebilirsiniz, ör. 4 görüntülü bir panoramayı başka bir 4 görüntülü panoramayla birleştirerek 8 görüntülü bir panorama yapabilirsiniz. Panoramaları birleştirdiğinizde normal görüntü eğriltmesini durdurmalısınız, çünkü panorama görüntüleri zaten eğridir (son panorama iletişim kutusunda 'düzleştir' seçeneğini kullanmadıysanız). Ön hizalama iletişim kutusunda 'eğri yok' kutusunu işaretleyerek görüntü eğriltmesini durdurun. - ^Panorama Sınırlamaları Yakın nesneleri içeren panoramalar zor olabilir: fotoğrafları çekerken, kamerayı lens boyunca bir eksende döndürmeye, minimum yanal hareketle dikkat edin, aksi takdirde ön plan nesneleri arka plana göre kaydığından (paralaks) görüntüler kötü hizalanabilir. Özne 50+ metre uzaktaysa bu bir sorun değildir, çünkü küçük bir yanal hareketin görüntü üzerinde çok az etkisi vardır. Tam olarak düzeltilemeyebilecek görüntü bozulmalarına neden olabilecek büyük bir dikey kaymayı (ufuk kayması) önlemek için kamerayı düz tutun. Aynı nedenle kamerayı döndürmekten kaçının. - ^Dikey Panorama Bu, girdi görüntülerini 90° döndürerek yapılabilir. Panorama'da, görüntüleri üstten alta sırayla seçin, böylece üst görüntü solda ve alt görüntü sağda olur. Panoramayı normal şekilde yapın. Sol üst olacak şekilde çıktı görüntüsünü döndürün. - - TOPIC: CIM DOSYALARINI GÖSTER Geçerli veya en son birleştirilmiş görüntü için girdi dosyalarını açılır bir pencerede gösterin. Yalnızca geçerli veya en son küme hatırlanır. - - TOPIC: MASHUP +image: mashup.jpg - Birden çok görüntüyü ve metni bir düzende düzenleyin. Görüntüler eklenip fareyle sürüklenerek yeniden boyutlandırılabilir, döndürülebilir ve taşınabilir. Görüntüler seçili alanlarda tamamen veya kısmen saydam yapılabilir. Metin eklenebilir, taşınabilir, yeniden boyutlandırılabilir ve döndürülebilir. Metin öznitelikleri belirtilebilir: yazı tipi, boyut, renk, ana hat, gölge, saydamlık. Çizgiler ve oklar eklenebilir. Buradaki örnek bazı olasılıkları göstermektedir. - +image: mashup1.png - İlk Mashup iletişim kutusunda, diğer görüntülerin yerleştirileceği bir arka plan veya düzen görüntüsü seçin. Mevcut bir görüntü seçin veya belirli bir boyut ve renkte yeni bir tek renkli görüntü oluşturun. Ayrıca önceden kaydedilmiş bir mashup projesi açıp düzenlemeye devam edebilirsiniz. - +image: mashup2.png - 2. Mashup iletişim kutusu bir seçimdir: görüntüleri düzenle, metni düzenle, çizgi ve okları düzenle, daha büyük bir boyuta yeniden ölçekle, tamamlanan birleştirilmiş görüntüyü kaydet (Bitti) veya görüntüyü terk et (İptal). İlk üç seçim, ilgili düzenlemeleri gerçekleştirmek için iletişim kutularına götürür. Bunların her biri bittiğinde bu iletişim kutusuna geri döner, böylece görüntüleri, metni ve çizgileri/okları herhangi bir sırada ekleyebilir veya değiştirebilirsiniz. Yeniden Ölçekle aşağıda açıklanmıştır. - +image: mashup3.jpg - Düzendeki görüntüleri seçmek ve yerleştirmek ve görünümlerini düzeltmek için bu iletişim kutusunu kullanın: boyut, döndürme, konum, saydamlık. Bir görüntü, genel olarak veya belirtilen alanlar içinde kısmen veya tamamen saydam olabilir. Bu, arka plan görüntüsünün veya örtüşen görüntünün saydam alanlardan görünebileceği anlamına gelir. Görüntü Ekle düğmesi, bir galeri dosya seçme iletişim kutusuna götürür ({GÖRÜNTÜ DOSYALARINI SEÇ}). Seçili görüntüler düzene yerleştirilir. Görüntüler eklendikten sonra, değişiklikler için seçmek üzere herhangi bir görüntüye tıklayın. Görüntüyü düzende konumlandırmak için ortasından sürükleyin. Görüntüyü yeniden boyutlandırmak için sağ alt köşeyi sürükleyin. Görüntüyü ayarlamak için iletişim kutusu kontrollerini kullanın. İletişim kutusu kontrolleri, en son eklenen, tıklanan veya sürüklenen görüntü üzerinde çalışır. 'Önceki' ve 'Sonraki' düğmeleri, seçili görüntüyü yanıp söndürerek görüntüler arasında birer birer geçiş yapar. Bu, örtüşen görüntüler istenen görüntüyü tıklayarak seçmeyi zorlaştırdığında kullanılabilir. Ölçek görüntüyü yeniden ölçekler. Açı görüntüyü döndürür. Yığın Sırası düğmeleri, bir görüntüyü diğer görüntülere göre yükseltir veya alçaltır - bu, örtüşen görüntülerden hangisinin üstte olacağını belirler. Taban Saydamlığı, tüm bir görüntüyü kısmen saydam yapmak için kullanılır. [boya] düğmesi, aşağıda gösterilen Boya iletişim kutusunu kullanarak bir görüntünün herhangi bir kısmını kısmen veya tamamen saydam yapmak için kullanılır. [çarpıt] düğmesi, aşağıda gösterilen Çarpıt iletişim kutusunu kullanarak bir görüntüyü bükmek veya çarpıtmak için kullanılır. 'siyah kenar boşlukları' onay kutusu, diğer düzenleme işlevlerinin (ör. çarpıtma) bıraktığı siyah kenar boşluklarını kaldırmak için kullanılabilir. Bunlar saydam yapılacaktır. 'Görüntü sabit' düğmesi, görüntünün fare veya klavyeyle taşınmasını önler. Bu, görüntüler ince hizalanırken ve kazara hareketin önlenmesi gerektiğinde yararlıdır. Kenar Boşlukları kontrolleri, görüntü kenarlarını saydam yapmak için kullanılabilir. Sert kenar boşlukları görüntü kenarlarını keser. Karıştırma kenar boşlukları, kenarları arka plana veya diğer örtüşen görüntülere karıştırmak için kısmen saydam yapar. - +image: mashup4.png - Seçili görüntü alanları için daha fazla veya daha az saydamlık "boyayın". Seçmek için bir görüntüye tıklayın. Fare imleci, işlem aralığını gösteren bir dairedir. Boyutu ayarlamak için yarıçapı kullanın. Dairenin kapladığı alanlarda saydam yapmak için görüntü üzerinde fareyi sol sürükleyin. Opak yapmak için sağ sürükleyin. Kademeli işaretliyse, fare sürüklendikçe saydamlık değişiklikleri yavaşça yapılır. Değişim hızını düzenlemek için fare merkezi ve kenarları için bir güç değeri belirtin. - +image: mashup5.png - Çarpıt iletişim kutusu bir görüntüyü çarpıtmak için kullanılır. Seçmek için bir görüntüye tıklayın. Görüntüyü fareyle sürükleyin - görüntü, farenin yönünde yerel olarak çarpıtılacak veya gerilecektir (lastik levha gibi). Çarpıtma alanı kabaca, görüntü boyutunun bir kesri olan çarpıtma aralığı ile verilir. Her sürükleme, önceki adımlara eklenen bir adımdır. Son adımlar [undo last] ile tersine çevrilebilir ve bükülmemiş görüntü [undo all] ile geri yüklenebilir. - +image: mashup6.png - Metni Düzenle iletişim kutusu, düzene metin yerleştirmek için kullanılır. Bir miktar metin girin ve [Uygula]'ya basın. Metnin ekleneceği düzene tıklamanız istenir. Konuma sürükleyin, ardından yazı tipini, boyutu, rengi, açıyı, arka plan rengini, ana hat boyutunu ve rengini, gölge boyutunu ve rengini ve bunların her biri için saydamlıkları ayarlamak üzere iletişim kutusu kontrollerini kullanın. Metni istediğiniz zaman yeni bir konuma sürükleyin. Özelliklerini iletişim kutusunda göstermek ve düzeltmek için mevcut herhangi bir metne tıklayın. Kaldırmak için bir metne tıklayın ve Delete'e basın. Düzenlemeyi bitirdiğinizde, 2. Mashup iletişim kutusuna dönmek için [OK]'e basın. - +image: mashup7.png - Çizgi/Ok Düzenle iletişim kutusu, düzene çizgi veya ok yerleştirmek için kullanılır. Metin eklemeye çok benzer şekilde çalışır. Bir uzunluk ve genişlik girin ve [Ekle]'ye basın. Çizginin ekleneceği düzene tıklamanız istenir. Düzene bir çizgi yerleştirilir veya Ok başı seçeneklerinden biri işaretliyse bir ok yerleştirilir. Çizgiyi/oku istenen konuma sürükleyin. İletişim kutusunu kullanarak uzunluğu, genişliği, açıyı ve öznitelikleri (arka plan, ana hat, gölge) ayarlayın. Diğer ucu sabit bırakarak o ucun konumunu ayarlamak için çizginin/okun herhangi bir ucunu da sürükleyebilirsiniz. - Düzendeki nesneleri taşımak ve yeniden boyutlandırmak için fareyi kullanabilirsiniz: • seçmek için nesneye tıklayın - seçimi onaylamak için yanıp söner. • nesneyi konumlandırmak için yaklaşık ortasından sürükleyin. • nesneyi yeniden boyutlandırmak için sağ alt köşeyi sürükleyin. • bir çizgi/ok için, yalnızca o ucu taşımak için herhangi bir ucu sürükleyin. - Klavye ok tuşları da geçerli seçili nesneyi 1 piksellik adımlarla taşımak için kullanılabilir. - {ALAN SEÇ} tarafından kaydedilen görüntüleri ekleyebilirsiniz. Görüntüleri Düzenle iletişim kutusunda, dosya seçme iletişim kutusunu başlatmak için [Ekle]'ye basın. Galeri penceresindeki [Üst] düğmesini kullanın, 'saved_areas'ı seçin. Orada bulunan .png görüntülerinden herhangi birini açın. Orijinal alan taslağı kullanılır ve alan karıştırma bu kenarlardan çalışır. - ^Mashup proje dosyaları Bir projeyi kaydedebilir ve daha sonra düzenlemeye devam etmek için açabilirsiniz. Mashup projesi, bu görüntüler ve proje dosyasına kaydedilen bazı verilerle yeniden oluşturulur: görüntü ve metin konumları, ölçekler, saydamlık vb. - ^Mashup Yeniden Ölçekleme Çok büyük bir düzenle (20 megapikselin üzerinde) çalışmak oldukça yavaş olabilir. Büyük bir kaplama görüntüsünü sürüklemek yavaş ve sarsıntılı olabilir. Projeyi oluşturmak için daha küçük bir düzen kullanıp bitirdikten sonra büyütürseniz çok daha hızlı çalışabilirsiniz. Kaplama görüntüleri ve metin girdilerden yeniden oluşturulduğundan nihai görüntüde çözünürlük kaybı yoktur. Yeniden Ölçekle düğmesi, projeyi 2x, 3x veya 4x büyütmenizi sağlar. Orijinal daha küçük proje boyutunu geri yüklemek için bir sıfırlama seçeneği de vardır. Bu yöntemle, 10 megapiksellik bir düzenle çalışabilir ve bittiğinde 160 megapiksele kadar yeniden ölçekleyebilirsiniz. Daha büyük düzen daha sonra doğrudan üzerinde çalışılabilir, ancak daha yavaş olacaktır. - - TOPIC: GÖRÜNTÜ DİZİSİ +image: image-array.jpg - Birçok görüntü seçin ve bunları renkli bir çerçeve içinde kompakt bir dizi biçiminde birleştirin. - İlk iletişim kutusu sol üstte gösterilmiştir. Arka Plan Rengi, ana hat çerçevesinin ve içerilen görüntüler arasındaki boşlukların rengidir. Dizi Genişliği, çıktı dizisinin genel genişliğidir ve Kenar Boşluğu, tüm görüntüleri çevreleyen dış kenar boşluğunun genişliğidir. Dizi yüksekliği, seçili görüntü dosyası sayısına ve bunları çerçeveye sığdırmak için gereken alana bağlıdır. Görüntü Sütunları, görüntü sütunu sayısını belirtir (yukarıdaki örnekte 6). Satır sayısı, seçili görüntü dosyası sayısına bağlıdır. Ayrım değerleri, içerilen görüntüler arasındaki yatay ve dikey boşluğu ayarlar. - Görüntü dosyalarını seçin ({GÖRÜNTÜ DOSYALARINI SEÇ}), ardından bittiğinde [Devam Et]'e basın. Ortaya çıkan görüntü birkaç saniye içinde (yüzlerce görüntü için dakikalar içinde) yapılacaktır. Bu görüntü, yukarıdaki sağ üst görüntüde gösterildiği gibi tipik olarak çok düzensiz bir alt kenar boşluğuna sahip olacaktır. Dizideki görüntülerin sırası, seçim sırasına göre belirlenir. Üst sıra önce soldan sağa doldurulur, ardından 2. sıra vb. - Optimize Et iletişim kutusu otomatik olarak başlar. Alt kenar boşluğunun daha eşit olması için görüntüleri yeniden düzenleyebilir. [Başlat]'a basın ve görüntünün optimize olmasını bekleyin. İlerlemeyi izleyebilirsiniz. Alt kenar boşluğunu 2 piksel içinde eşit yapan bir optimum bulunursa işlev çıkacaktır. Bu hedefe ulaşılmazsa süresiz olarak aramaya devam edebilir. Optimize etme işlevini şimdiye kadar bulunan en iyi çözümle çıkmaya zorlamak için [Durdur]'a basın. Optimizasyon başarılı olursa, alt sağ görüntüde gösterildiği gibi eşit sütunlar elde edersiniz. Optimizasyondan sonra alt kenar hâlâ düzensizse, alt kenarı eşit yapmak için bazı görüntülere kenar boşlukları eklemek isteyip istemediğiniz sorulur. Bu, eşit bir alt kenarla sonuçlanacaktır, ancak dikey aralıklar artık eşit olmayacaktır. - İPUCU: Sütun başına görüntü sayısı en az dört (daha fazlası daha iyi) olduğunda optimizasyon en iyi şekilde çalışır. Bu, optimize ediciye eşit bir alt kenarla bir çözüm bulması için yeterli esneklik sağlar. - Son iletişim kutusu, sol altta gösterildiği gibi görünür. Artık diziniz için bir dosya adı atamanız gerekir. Bir dosya kaydetme iletişim kutusu başlatılır ve yeni dizi dosyasını herhangi bir yere kaydedebilirsiniz. Metadata kopyala seçeneği seçilirse, metadata seçilen girdi dosyasından çıktı dosyasına kopyalanır. Bu, görüntüler düzenlenmiş sürümlerse ve dizinin son sürüm (veya herhangi bir sürüm) için düzenleme geçmişini içermesini istiyorsanız kullanışlıdır. - - TOPIC: TOPLU MENÜ Bunlar, birden çok seçili görüntü dosyasını, birkaçını veya binlercesini işleyen işlevlerdir. Bu işlevler, Escape tuşu kullanılarak işlem ortasında iptal edilebilir, ancak bu bazı dosyaların işlenmesine ve bazılarının işlenmemesine neden olur. Açılır bir rapor, dosyalar işlendikçe dosya adlarını gösterir. - - TOPIC: TOPLU DÖNÜŞTÜR +image: batch-convert.jpg - Bu işlev, birden çok görüntü dosyasını yeniden adlandırmak, dönüştürmek, yeniden ölçeklemek ve taşımak için kullanılır. RAW dosyalar da görüntü dosyalarına dönüştürülebilir. İşlev, maksimum hız için birden çok paralel iş parçacığında çalışır. - ^İletişim Kutusu Girdileri • Dosyaları Seç - dönüştürülecek dosyalar ({GÖRÜNTÜ DOSYALARINI SEÇ}). • Metni Değiştir - dosya adlarındaki metni değiştir (aşağıya bakın). • Yeni Ad - isteğe bağlı yeni ad, eklenen metin (aşağıya bakın). • Sıra Numaraları - çıktı dosya adları için taban numara ve ekleyici. • Yeni Konum - çıktı dosyaları için isteğe bağlı yeni klasör konumu. • Yeni Tür - çıktı dosyaları için dosya türü veya "değişiklik yok". • Renk Derinliği - tif veya png çıktısı için 8 veya 16 bit belirtin. • Maks. Genişlik, Yükseklik - çıktı dosyaları için isteğe bağlı sınırlar (yalnızca küçült veya büyüt işaretliyse kullanılır) • Yeniden Ölçekle - çıktı dosyaları için isteğe bağlı yeniden ölçekleme faktörü • Orijinalleri Sil - başarılı dönüştürmeden sonra girdi dosyalarını sil. • Metadata Kopyala - tüm metadata'yı çıktı dosyalarına kopyala. • Albümleri Güncelle - albüm dosyalarını dönüştürülmüş çıktı dosyalarıyla değiştir - ^Metni Değiştir Burada metin girilirse, dosya adları bu metin için taranır ve bulunursa, verilen değiştirme metni yerine konur. Değiştirme metni farklı bir uzunlukta olabilir ve boş da olabilir, bu durumda metin dosya adından kaldırılır. - ^Yeni Ad ve Eklentiler Yeni dosya adına eklenen metin olabilir: bir fotoğraf tarihi (EXIF metadata'dan), bir sıra numarası veya orijinal dosya adı. Neyin ve nereye ekleneceğini şu şekilde belirtin: • $oldname - Orijinal dosya adı buraya eklenir • $sss - Sıralı bir sıra numarası buraya eklenir. Aşağıya bakın. • $yyyy $mm $dd - Fotoğraf tarihi bu konumlara eklenir. - Örnek: San Francisco $yyyy:$mm:$dd $oldname $sss "Golden Gate Bridge.jpg" girdi dosyası, 12 Mayıs 2014 fotoğraf tarihiyle, "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg" çıktı dosya adına dönüştürülür. - "$sss" için, 's' karakteri sayısıyla alanın uzunluğunu belirtin, ör. "$ss", 99'a kadar sıra numaraları için yeterli olacaktır. Daha az basamaklı sıra numaraları için başa sıfırlar eklenir. Belirtilen uzunluğa sığmayan sıra numaraları gerektiği kadar uzun yapılır. Galerilerdeki dosya adı sıralama düzeninin kesinlikle ascii sırası olduğunu unutmayın, bu yüzden 1, 2 ... 9, 10 sayı dizisi 1, 10, 2 ... 9 olarak sıralanır. Alan uzunluğunu 2 ($ss) olarak belirterek sayısal sırayı koruyabilirsiniz, bu da 01, 02 ... 09, 10 dizisiyle sonuçlanır. - Çıktı dosya adlarının benzersiz olmasını sağlamak için "$oldname" veya "$sss"den biri mevcut olmalıdır. Yeni Konum eksikse veya değiştirilmemişse, orijinalleri sil yok sayılır. Bir çıktı dosyası zaten mevcutsa, girdi dosyası dönüştürülmez. - ^Maks. Genişlik ve Yükseklik Küçült ve/veya büyüt işaretliyse, çıktı dosyaları orijinal genişlik/yükseklik oranını koruyarak bu sınırlar içinde yeniden boyutlandırılır. Küçült işaretliyse, bu sınırlardan büyük dosyalar sınırlar içinde kalacak şekilde küçültülür. Büyüt işaretliyse, bu sınırlardan küçük dosyalar genişlik veya yüksekliğin karşılık gelen sınırda olması için büyütülür. Bu, Yeniden Ölçekle seçeneğiyle birlikte kullanılamaz. - ^Yeniden Ölçekle Düğmelerden biri işaretliyse, çıktı dosyaları seçilen faktörle yeniden ölçeklenir. Bu, Maks. Genişlik ve Yükseklik seçeneğiyle birlikte kullanılamaz. - ^Orijinalleri Sil İşaretliyse, girdi dosyaları yalnızca çıktı dosyası başarıyla oluşturulduktan sonra silinir. - ^Metadata Kopyala Tüm metadata girdiden çıktı dosyasına kopyalanır. Metadata'yı kaldırmak için bu seçeneği atlayın. - ^Albümleri Güncelle İşaretliyse, girdi dosyalarından herhangi birini içeren tüm albümler dönüştürülmüş çıktı dosyalarına güncellenir. - ^Dosya Sırasını Koruma Bir başlangıç sıra numarası ($sss) belirtirseniz, girdi dosyası seçim sırası çıktı konumunda korunur. Böylece görüntü dosyalarını istenen bir sırada seçebilir veya sıralı görüntülere sahip bir albümden seçebilir ve bu sırayı çıktıda koruyabilirsiniz. - - TOPIC: TOPLU KOPYALA/TAŞI Seçili görüntü dosyasını yeni bir konuma kopyalayın veya taşıyın. Fotocx'in bildiği herhangi bir klasörden girdi dosyalarını seçin ({GÖRÜNTÜ DOSYALARINI SEÇ}). "Orijinalleri Sil" seçiliyse, girdi dosyaları yeni klasöre başarıyla taşındıktan sonra silinir. Bu durumda, artık silinmiş girdi dosyalarına başvuran tüm albümler yeni dosya konumlarıyla güncellenir. - - TOPIC: TOPLU DÜZELTME Bu işlev, döndürülmüş veya çevrilmiş (aynalanmış) görüntü dosyalarını düzeltir. Bir dosyanın döndürülüp döndürülmediğini/çevrilip çevrilmediğini ve hangi yönde olduğunu bilmek için EXIF verisine bağlıdır. Toplu Dönüştür'den çok daha hızlıdır. Tüm aday dosyaları seçip düzeltme gerektirenleri bulmasına izin verebilirsiniz. Arama hızı, güçlü bir bilgisayarda dakikada yaklaşık 3000 görüntü dosyasıdır. Aranacak dosyaları belirtmek için iki seçenek vardır. [Dosyaları Seç] düğmesi bir galeri dosya seçme iletişim kutusuna götürür ({GÖRÜNTÜ DOSYALARINI SEÇ}). 'Tüm dosyaları tara' işaretliyse, üst klasörlerinizin altındaki tüm görüntü dosyaları aranır. - - TOPIC: TOPLU SİL/ÇÖPE AT Dosyaları seçin ({GÖRÜNTÜ DOSYALARINI SEÇ}). Seçeneği seçin: sil veya çöpe taşı. [Devam Et]. Dosyalar silindikçe veya çöpe taşındıkça açılır bir raporda listelenir. Tüm dosyalar silindikten/çöpe atıldıktan sonra, albümler taranır ve silinen dosyalar kaldırılır. - - TOPIC: TOPLU KAPLAMA +image: batch-overlay.png - Seçili girdi görüntülerinde seçili bir konuma küçük bir kaplama görüntüsü eklenebilir. Bu, görüntülerin üzerine bir kredi satırı, telif hakkı vb. eklemek için kullanılabilir. - Kaplama görüntüsünü şu şekilde hazırlayın: Metni tutacak bir taban görüntü oluşturmak için Boş Görüntü'yü kullanın. Ölçek önemli değildir, bu yüzden gerekenden büyük yapın. Tüm taban görüntüyü saydam boyamak için Saydamlığı Boya'yı kullanın. İstenen metni, istenen yazı tipi, renk ve diğer özniteliklerle taban görüntüye koymak için {İŞARETLEME} > metin çiz'i kullanın. Metni taban görüntünün çoğunu kaplayacak şekilde ölçekleyin. Taban görüntü (arka plan) saydamdır. Gerekirse {KIRP} ile fazla kenar boşluklarını kaldırın. Son görüntüyü kaydedin. Kullanışlı bir konum /saved_areas'tır, ancak herhangi bir klasör kullanılabilir. Bu görüntü artık Toplu Kaplama için bir kaplama görüntüsü olarak kullanılabilir. - Kaplama görüntüsünü alacak ana görüntü dosyalarını seçmek için ^Ana görüntü dosyalarını seç^ düğmesini kullanın. Kaplama görüntü dosyasını seçmek için ^Kaplama dosyasını seç^ düğmesini kullanın. - İki ^Kaplama konumu^ girdisi, kaplama görüntüsünün ana görüntüde nereye konumlandırılacağını belirler, üstten alta mesafenin %1-99'u ve soldan sağa mesafenin %1-99'u. 0/0 sol üst köşe, 99/99 sağ alt köşe anlamına gelir. Kaplama görüntüsü, ana görüntü kenarlarının ötesine geçmeyecek şekilde konumlandırılır. - ^Kaplama genişliğini^ ana görüntü genişliğinin bir yüzdesi olarak belirtin. Yükseklik, genişlik/yükseklik oranını korumak için ayarlanacaktır. ^Genişliği pencere boyutu için sabit yap^ işaretliyse, kaplama görüntüsünün görsel boyutu aşağıda belirtilen pencere boyutu için sabit yapılacaktır. Bu olmadan, büyük sol ve sağ kenar boşluklarıyla görüntülenen "uzun" bir görüntü, görsel olarak daha küçük bir kaplama görüntüsüne sahip olacaktır. Başlangıç pencere boyutu geçerli penceredir. Herhangi bir boyut girebilirsiniz. Bu değiştiyse geçerli pencereyi ayarlamak için ^yenile^'ye basın. - ^Ana dosyaları değiştir^ seçiliyse, girdi ana dosyaları çıktı kaplamalı ana dosyalarla değiştirilir. ^Yeni sürümler oluştur^ seçiliyse, girdi ana dosyalarının yeni sürümleri oluşturulur. - - TOPIC: TOPLU KEYWORD +image: batch-keywords.jpg - Çok sayıda görüntü dosyası için keyword'leri aynı anda ekleyin, kaldırın veya değiştirin. - Görüntü dosyalarını seçmek için [select files] düğmesini kullanın ({GÖRÜNTÜ DOSYALARINI SEÇ}). - İletişim kutusu iki keyword listesi gösterir: seçili dosyalara eklenecekler ve kaldırılacaklar. Mevcut keyword'ler aşağıdaki Tanımlı Keyword'ler penceresinde gösterilir. Bunlardan biri, üzerine tıklanarak geçerli seçili keyword listesine (ekle veya kaldır) eklenebilir. Bir keyword, üzerine tıklanarak her iki keyword listesinden de silinebilir. Keyword'leri değiştirmek için, yeni keyword'leri ekle keyword'leri listesinde ve eski keyword'leri kaldır keyword'leri listesinde belirtin. - Tanımlı keyword'ler listesi uzunsa, istenen keyword'ü Yeni Keyword Girin'e yazmak daha kolay olabilir. Şimdiye kadar yazdıklarınızla eşleşen mevcut keyword'ler Eşleşen Keyword'ler'de görünecektir ve keyword'ü görüntüye eklemek için bunlardan birini işaretleyip tıklayabilirsiniz. Girilen keyword yeniyse (eşleşen bir keyword gösterilmiyorsa), keyword tamamlandığında [Ekle]'ye basın. Seçili keyword listesine ve "nocatg" kategorisi altındaki tanımlı keyword'ler listesine eklenecektir. - Keyword kategorileri kullanıyorsanız, bir kategori seçebilirsiniz ve tanımlı keyword'ler listesinde yalnızca o keyword'ler gösterilir. Keyword listeniz çok büyükse, bu listeyi işaretleyip tıklamak için yönetilebilir bir boyuta indirebilir. - Kaldırmak veya değiştirmek istediğiniz belirli keyword'lere sahip görüntülerin bir listesini almak için, görüntüleri bulmak üzere {GÖRÜNTÜLERİ ARA}'yı kullanın, ardından bu işlevi başlatın ve az önce bulduğunuz tüm görüntü dosyalarını eklemek için [select files]'i kullanın veya herhangi bir alt kümeyi seçin. - - TOPIC: TOPLU KEYWORD YENİDEN ADLANDIR +image: batch-rename-keywords.png - Herhangi sayıda keyword'ü yeniden adlandırın ve bu değişiklikleri tüm görüntü koleksiyonunuza uygulayın. Tanımlı keyword'ler listesinden yeniden adlandırılacak bir keyword'e tıklayın, Şuna yeniden adlandır kutusuna yeni bir ad girin, ardından bu ad çiftini sağ taraftaki listeye eklemek için ok düğmesine tıklayın. Yeniden adlandırılacak her keyword için tekrarlayın. Listedeki ad çiftini kaldırmak için üzerine tıklayın. Bitirdiğinizde [Devam Et]'e basın. Bir keyword'ü yeniden adlandırmadan silmek isterseniz, yeni ad olarak 'delete' kullanın. - Açılır bir pencere, etkilenen keyword adlarını içeren görüntü dosyası sayısını gösterir. Devam etmek için [Evet]'e basın. Güncelleme hızı, güçlü bir bilgisayarda dakikada yaklaşık 500'dür. Fotocx bir sonraki başlatıldığında, dosya değiştirme tarihi değiştiği için dizin dosyası işlevi aynı görüntüler için tüm thumbnail'leri güncelleyecektir. - - TOPIC: TOPLU KEYWORD TEMİZLE +image: batch-purge-keywords.jpg - Tüm görüntü dosyalarından istenmeyen keyword'leri temizleyin (silin). Bu, özellikle indirilen görüntü dosyalarından eklenen istenmeyen keyword'lerden kurtulmak için kullanışlıdır. İstenmeyen keyword'leri iletişim kutusunun sağ tarafındaki temizleme listesine eklemek için iletişim kutusunun sol tarafındaki keyword'lere tıklayın. Bitirdiğinizde [proceed]'e basın. - - TOPIC: TOPLU FOTOĞRAF TARİHİ +image: batch-photo-date1.png +image: batch-photo-date2.png - Fotoğraf tarihi/saati olmayan veya yanlış olan bir grup fotoğrafı hızlıca düzeltin. İşlenecek görüntü dosyalarını seçebileceğiniz bir galeri penceresi açmak için [select files] düğmesini kullanın ({GÖRÜNTÜ DOSYALARINI SEÇ}). - Fotoğraf tarihini/saatini değiştirmenin iki yolu vardır: • Yeni bir tarih/saat ayarla (yukarıdaki sağ görüntü): Yalnızca yeni bir yıl girin (yyyy) - dosyalarda yalnızca yıl değiştirilir. Yalnızca bir tarih girin (yyyy:mm:dd) - tarih değiştirilir ancak saat değiştirilmez. Tam bir tarih/saat girin (yyyy:mm:dd hh:mm:ss) - her ikisi de değiştirilir. • Mevcut tarihi/saati kaydır (soldaki görüntü): 6 alanın herhangi birine + veya - değerler girin: yıl, ay, gün, saat, dakika, saniye. Tarihler/saatler girilen değerlere göre kaydırılır. - Kaydırılan tarih/saat değerleri, gerektiğinde bir sonraki daha yüksek değere yayılır: 08:30 saati -50 dakika kaydırıldığında 07:40 sonucunu verir 2016-10-20 tarihi +6 ay ve -30 gün kaydırıldığında 2017-03-21 sonucunu verir (Mart'ın 31 günü vardır). - 'test' onay kutusu seçiliyse, inceleme için seçili dosyaların eski ve yeni tarih/saatlerinin bir raporu oluşturulur. Dosyalarda hiçbir değişiklik yapılmaz. Sonuçların doğru olduğundan eminseniz, onay kutusunu kaldırın ve dosyaları güncellemek için tekrar çalıştırın. - - TOPIC: TOPLU META DEĞİŞTİR +image: batch-change-meta.png - Birden çok görüntü dosyası için metadata'yı düzeltin. Yeni metadata ekleyebilir, mevcut metadata'yı düzeltebilir ve metadata silebilirsiniz. İşlenecek dosyaları {GÖRÜNTÜ DOSYALARINI SEÇ} seçtiğiniz bir galeri penceresi açmak için [select files] düğmesini kullanın. Atanacak metadata tag adlarını ve değerlerini girin veya tag'i silmek için değeri boş bırakın. [uygula]'ya basın. Bir onay mesajı alacaksınız ve bu noktada devam edebilir veya iptal edebilirsiniz. Solda yaygın olarak kullanılan tag adlarının bir listesi sağlanır. İletişim kutusundaki ilk boş tag adı alanına eklemek için bunlardan birine tıklayın. Bu liste, listeye başka tag'ler eklemek için düzenleyebileceğiniz /metadata_picklist dosyasından gelir. [Tam Liste] düğmesi, mevcut tüm tag adlarının bir listesinin nasıl alınacağı hakkında bilgi sağlar. - - TOPIC: TOPLU META RAPORU +image: add-meta-tags.png +image: batch-report-meta.png - Herhangi sayıda görüntü için herhangi bir metadata'yı raporlayın. Çıktı, sisteminiz için varsayılan metin düzenleyicide görüntülenen bir metin dosyasıdır. İstenen metadata ile eşleşen görüntüleri bulmak için metin düzenleyicinin arama özelliklerini kullanabilir veya metin dosyasını diğer programlara girdi olarak kullanabilirsiniz. İşlenecek dosyaları seçmek için bir galeri penceresi açmak üzere [select files] düğmesini kullanın ({GÖRÜNTÜ DOSYALARINI SEÇ}). [düzenle] düğmesi, raporlanacak metadata tag'lerini seçebileceğiniz yeni bir iletişim kutusu (sağda) açar. Sol sütundaki bir tag'e tıklayarak onu sağ sütuna ve rapora ekleyin. Kaldırmak için sağ sütundaki bir tag'e tıklayın. Yalnızca en olası ihtiyaç duyulan tag'leri içeren listede görünmeyen herhangi bir tag adını yazmak için sol sütundaki son tag olan "Diğer tag ..."a tıklayın. - - TOPIC: TOPLU GEOTAG +image: batch-geotags.png - Birçok görüntü seçin ve hepsine aynı konum verisini ekleyin. Görüntü dosyalarını bir galeri penceresinden seçmek için [select files] düğmesini kullanın ({GÖRÜNTÜ DOSYALARINI SEÇ}). Ardından [Bul] düğmesini kullanarak veya bir harita işaretçisine tıklayarak {ANA METAYI DÜZENLE}'de açıklandığı gibi konum verisini alın. Bu işlevi ayrıca konum yazımındaki veya latitude/longitude verisindeki tutarsızlıkları düzeltmek için de kullanın. Konum ve/veya ülke boş bırakılırsa, güncellenmezler. Konumu veya ülkeyi silmek için "null" adını girin. Latitude ve longitude boş bırakılırsa, güncellenmezler. Latitude ve longitude'u silmek için her iki değer için de "0" girin. Yalnızca konum/ülkeyi, yalnızca latitude/longitude'u veya her ikisini de güncelleyebilirsiniz. Uygulamada, kamera GPS'inin konum ve ülke olmadan latitude ve longitude eklediğini veya istenmeyen bir dil ya da tüm büyük harfler ya da onarım gerektiren başka bir değer kullandığını fark edebilirsiniz. - - TOPIC: DOSYALARI DIŞA AKTAR Seçili görüntü dosyalarını başka bir klasöre kopyalayın. Amaçlanan kullanım, başkalarıyla paylaşmak için dosyaları kopyalamaktır, ör. bir web sitesine dosya yükleme. Çıktı dosyaları JPEG'dir. İsteğe bağlı olarak görüntüleri küçültebilirsiniz. Galeri thumbnail'lerine tıklayarak görüntü dosyalarını seçin ({GÖRÜNTÜ DOSYALARINI SEÇ}). Görüntü dosyalarının kopyalanacağı bir klasör seçin. 'metadata dışa aktar' seçiliyse, sınırlı bir metadata kümesi de kopyalanır. Bunlar: fotoğraf tarihi, keyword'ler, telif hakkı, başlık, açıklama. - - TOPIC: ARAÇLAR MENÜSÜ - - TOPIC: DOSYALARI DİZİNLE +image: index-files1.png - Fotocx, tüm görüntü dosyası klasörlerinizi ve dosya adlarınızı ve gömülü metadata'yı (tarihler, tag'ler, geotag'ler, başlıklar, açıklamalar, derecelendirmeler) bilmeye ihtiyaç duyar. Bu veri, hızlı arama için dizinlenir. Fotocx ayrıca galeri pencerelerinin (thumbnail sayfalarının) hızlı görüntülenmesi için thumbnail görüntüleri oluşturur. Fotocx, görüntü dosyalarınızı değiştirmez veya kopyalamaz. Gerekli alan tipik olarak görüntü dosyası alanınızın %2'sidir. - Dosyaları Dizinle işlevi, Fotocx her başlatıldığında çalışır. Bu işlev, eksik thumbnail'leri oluşturacak, eski olanları değiştirecek ve görüntü dosyalarınızdaki geçerli veriyi kullanarak metadata dizinini yenileyecektir. Binlerce yeni dosyanız varsa bu önemli miktarda zaman gerektirebilir. - Fotocx içinde değiştirilen veya taşınan görüntü dosyaları otomatik olarak halledilir. Dizinleme işlevi yalnızca Fotocx dışında oluşturulan yeni görüntü dosyaları için (ör. yeni bir fotoğraf grubu eklendi) ve Fotocx dışından değiştirilen veya taşınan dosyalar için kullanılır. - Üst görüntü klasörlerinizi girin (ör. /home//Pictures). Klasörleri bulup eklemek için [göz at] düğmesini kullanın. Bu klasörler ve içerdikleri herhangi bir alt klasör işlenecektir. Diğer dosyaların görüntülerle karışık olması önemli değildir. Bir girişi silmek için karşılık gelen 'X'e tıklayın. - Thumbnail dosyalarının saklanacağı thumbnail'ler klasörünü girin. Sağlanan varsayılanı kullanın veya kendi konumunuzu ayarlayın. - Görüntülerinizi sınıflandırmak için klasör veya dosya adlarını kullandıysanız, bunları {GÖRÜNTÜLERİ ARA} işlevinde hemen kullanabilirsiniz. Görüntü metadata'nızda tarihler, keyword'ler, geotag'ler, başlıklar veya derecelendirmeler kaydettiyseniz, bunlar da aranabilir olacaktır. Görüntüler dizinlendikten sonra, bunlardan herhangi biriyle arama yapmak neredeyse anlıktır. - ^Metadata Tag'leri Aşağıdaki metadata varsayılan olarak görüntü dizinine dahil edilir: • klasör ve dosya adları • fotoğraf tarihi/saati • dosya değiştirme tarihi/saati • başlık ve açıklama (exif metadata) • derecelendirme (0-5 yıldız) • keyword'ler (kullanıcı etiketleri) • geotag'ler (ülke ve konum adları ve latitude/longitude) • kamera: marka, model, lens • pozlama: süre, f-sayısı, odak uzaklığı, ISO - ^Ekstra Metadata tag'leri +image: index-files2.png - Görüntü dosyası dizinine 20'ye kadar başka metadata tag'i ekleyebilirsiniz. Bu listedeki metadata, standart tag'ler kadar hızlı aranabilir. Buna ihtiyacınız olmayabilir, ancak bazen standart olmayan metadata tag'lerini aramanız gerekiyorsa, bunları buraya ekleyebilirsiniz ve arama hızı neredeyse anlık olacaktır. Yukarıdaki iletişim kutusunu almak için "ekstra metadata" için [select] düğmesine basın. Sol listedeki tag'lere tıklayarak onları sağ listeye ekleyin - dizine eklenecek tag'ler. Kaldırmak için sağ listedeki bir tag'e tıklayın. Değişiklikleri onaylamak için [done]'ye basın. Tüm görüntü koleksiyonunuz yeniden dizinlenecektir. Thumbnail'ler yeniden oluşturulmadığından bu, ilk dizinlemeden daha hızlı ilerleyecektir. - ^Dizinlenmemiş Dosyalara ve Klasörlere Erişim Dizinlenmemiş bir görüntü dosyası veya klasörü, bildirdiğiniz üst görüntü klasörleri içine dahil edilmemiş olandır (bildirdiğiniz görüntü klasörlerinizin alt klasörleri her zaman dahildir). Böyle bir klasöre gidip thumbnail'leri normal şekilde görüntüleyebilir ve bu tür dosyaları normal şekilde görüntüleyip düzenleyebilirsiniz. Anlamanız gereken bazı sınırlamalar vardır: • Bu dosyalar herhangi bir arama sonucundan ve harita görünümlerinden eksik olacaktır. • Thumbnail'ler görüntüleme sırasında oluşturulur - galeriler yavaş olacaktır. Taşınabilir (yavaş) bir depolama cihazına (ör. kamera SD kartı) erişirseniz, yavaş performansı fark edeceksiniz. Thumbnail'ler gerektiğinde oluşturulacak ve cihaz çıkarıldıktan sonra kalacaktır. Öneri: dosyaları bildirilen bir Fotocx klasörüne kopyalayın, ardından ihtiyacınız olan işlemi bu konumdan yapın. Performans çok daha iyi olacaktır. - ^Çıkarılabilir Depolama (USB sürücü) Üst görüntü klasörleriniz çıkarılabilir bir sürücüdeki klasörleri içeriyorsa ve Fotocx'i sürücü takılı değilken çalıştırırsanız, çıkarılabilir dosyalar kaybolmuş olsa bile dizin verisi ve thumbnail'ler korunur. Çıkarılabilir sürücü tekrar takıldığında ve Fotocx başlatıldığında, son durum geri yüklenir. Bu süre zarfında herhangi bir dosya eklendiyse veya değiştirildiyse, dizin verisi ve thumbnail'ler güncellenir. - - TOPIC: FOTOCX ANA KLASÖRÜNÜ TAŞI Fotocx ana klasörü, kullanıcı tarafından özelleştirilebilen Fotocx paketinden bazı dosyalar dahil olmak üzere tüm kullanıcı ayarlarını ve verilerini içerir. Varsayılan konum: /home//.fotocx. Birden çok Linux sürümü veya dağıtımı kuruluysa, her sürüm için ayrı ayrı yerine paylaşılan tek bir Fotocx ana klasörüne sahip olmak istenebilir. Birden çok kullanıcının aynı Fotocx örneğine erişmesi gerekiyorsa da aynı durum söz konusu olabilir. - Fotocx ana klasörünü başka bir yere taşımak için bu işlevi kullanın. Seçilen klasör, yol adı içinde "fotocx" içermelidir; değilse "/fotocx" eklenecektir. - Ayrı ayrı yönetilen birden çok Fotocx görüntü koleksiyonu istiyorsanız {KOMUT PARAMETRELERİ} -home parametresine bakın. - - TOPIC: AYARLAR +image: settings.jpg - Çeşitli kullanıcı tercihleri ve ayarları toplanır ve /parameters dosyasına kaydedilir. Çoğu değişiklik hemen yapılır. Bazıları Fotocx'in yeniden başlamasına neden olur. - • İstenen 2 karakterli dil kodunu seçin. Fotocx seçilen dilde yeniden başlayacaktır. • Başlangıç Görünümü - Fotocx başlatıldığında ilk görüntülenen. Son Dosyalar: en son görüntülenen görüntü dosyaları En Yeni Dosyalar: en son eklenen/değiştirilen dosyalar Belirli Galeri: belirtilen klasör galerisi Albüm Galerisi: belirtilen albüm galerisi Önceki Galeri: önceki oturumda son kullanılan galeri Önceki Dosya: önceki oturumda son görüntülenen dosya Belirli Dosya: belirtilen görüntü dosyası Göz At düğmesi: bir klasör, albüm veya görüntü dosyası seç • Arka Plan - Dosya ve Galeri Görünümü pencereleri için arka plan renkleri • Menü Stili - menü görüntüleme stili: simgeler, metin veya ikisi de • Menü Renkleri - menü metin rengi ve arka plan rengi • İletişim Kutusu Yazı Tipi - menüler ve iletişim kutuları için yazı tipi • Gizlileri Göster - seçiliyse, gizli dosyaları ve klasörleri göster • Zoom Hızı - 2x görüntü artışı başına 1-8 tıklama veya [+] tuşu seçin • JPEG dosyaları - kalite seviyesi, varsayılan 90, iyi kalite için 70+ kullanın • Eğri Düğümü - düzenleme eğrileri için minimum düğüm ayrımı, ölçeğin %'si. Varsayılan, ölçeğin %5'idir. Dokunmatik yüzeyler için daha yüksek bir değer kullanın. • Görüntü Konumu - görüntü, daha geniş bir pencere içinde sol/orta/sağdadır • Çıkışı Onayla - açılır iletişim kutusu seçeneği: gerçekten çıkmak istiyor musunuz? • Dizin Seviyesi - aşağıya bakın • RAW Yükleyici - aşağıya bakın • RAW Seçenekleri - aşağıya bakın • RAW Dosyaları - kullanılan RAW dosya türlerinin listesi • Video Dosyaları - kullanılan video dosya türlerinin listesi • Video Uygulaması - aşağıya bakın - ^Dosya Kalitesi ve Sıkıştırma JPEG dosya kalite seviyesi: iyi görüntü kalitesi için 70 veya daha yüksek kullanın (varsayılan 90). TIFF dosya sıkıştırma yöntemi DEFLATE'dir (renkli görüntüler için en iyisi). PNG dosya sıkıştırma seviyesi '1'dir. Daha yüksek değerler dosya kaydetme süresini artırmak dışında bir şey yapmıyor gibi görünüyor (libpng). - ^Görüntü Konumu Pencere görüntüden daha genişse (yani pencere genişlik/yükseklik oranı > görüntü), görüntü sola, ortaya veya sağa kaydırılabilir. Sol veya sağ ise, kullanılmayan kenar boşluğu maksimuma çıkarılır, bu da iletişim kutularını konumlandırmak için daha uygun olabilir. - ^Görüntü Dizini Seviyesi Bu iki parametre, başlatma süresi ile görüntü dizininin eksiksizliği arasındaki bir ödünleşimi yönetir. • $ fotocx: fotocx bir kabuk komutu, sistem menüsü veya sistem simgesi/başlatıcısı kullanılarak başlatıldığında geçerlidir. Önerilen '2' değeri tam dizinleme anlamına gelir: eski dizin dosyasını yükle, yeni dosyaları (henüz dizinlenmemiş) ara ve fotocx dizin dosyasını güncelle. • $ fotocx : fotocx, bir dosya yöneticisi listesinde bir dosya adına tıklanarak başlatıldığında geçerlidir. Önerilen '1' değeri, eski dizin dosyasını yükle ancak dizini güncellemek için yeni dosya arama anlamına gelir. Başlatma orta derecede hızlıdır. Görüntü arama ve harita işlevleri normal şekilde çalışır, ancak henüz dizinlenmemiş yeni görüntü dosyaları dahil edilmez. • Alternatif: '0' dizinleme yok anlamına gelir. Başlatma çok hızlıdır. Bir görüntü aramasının veya harita işlevinin daha sonraki kullanımı, yalnızca eski dosyalar için dosya dizinleme işlevini başlatacaktır (yeni/değiştirilmiş dosyalar için arama yapılmaz). Görüntü koleksiyonunuz devasaysa ve başlatma süresi birkaç saniyeyi aşıyorsa bu seçeneği kullanın. Gerekirse dizinleme işlevini daha sonra başlatabilirsiniz. - ^RAW Yükleyici RAW yükleyici, bir RAW dosyasını okumak ve 16 bit renk derinliğiyle TIFF'e dönüştürmek için kullanılan komuttur. Bir RAW dosyası görüntülendiğinde kullanılır. Dosyayı düzenlemek ve optimize etmek için Fotocx düzenleme işlevlerini kullanabilirsiniz. Varsayılan RAW yükleyici, sRGB renk uzayını kullanan dcraw'dır. Seçim listesinde dcraw veya rawtherapee kullanan birkaç başka seçenek de sağlanır. Bu komutlar, Fotocx ana klasöründeki 'raw_commands_*' dosyasında tutulur. Yeni seçenekleri değiştirmek veya eklemek için bu dosyayı düzenleyin (aşağıya bakın). Birden çok kamera veya birden çok işleme seçeneği için birden çok komut hazırlamak isteyebilirsiniz. Bir RAW düzenleyiciyi etkileşimli olarak kullanmayı tercih ediyorsanız, bunun için bir eklenti komutu oluşturun - bkz. {EKLENTİLER}. - ^RAW Seçenekleri • komutları düzenle: RAW yükleyici komutlarının listesini düzenlemek için düğmeye basın. Geçerli komut listesiyle yeni bir pencerede bir metin düzenleyici başlayacaktır. • gömülü görüntü rengini eşleştir: RAW görüntü renklerini dönüştürülmüş TIFF görüntüsüne eşlemek için RAW dosyasının gömülü görüntüsünü bir kılavuz olarak kullanın. Bu, kamera üreticisinin RAW verisinin yorumudur - RAW dosyasının daha fazla düzenleme gerektirmesi durumunda başlamak için iyi bir yerdir. Gömülü görüntü genellikle kameradaki JPEG dosyasıyla aynıdır. - ^Video Uygulaması Bir video oynatma uygulamasını başlatmak için bir kabuk komutu girin. Video dosya adının komut satırında nereye ekleneceğini işaretlemek için '%s' kullanın. İşte bazı örnekler: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: KLAVYE KISAYOLLARI +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - Özel klavye kısayollarını görüntüleyin veya değiştirin. Şu anda atanmış kısayollar ilk pencerede gösterilir. [Düzenle] düğmesine basarsanız, klavye kısayolları ekleyip değiştirebileceğiniz ikinci iletişim kutusu gösterilir. Klavyeyi kullanarak yeni bir kısayol girin. A-Z, 0-9, F2-F9 tuşlarını ve sembollerin çoğunu (% $ & * < vb.) kullanabilirsiniz. Bir tuşu Ctrl/Alt/Shift'ten biriyle birleştirebilirsiniz: Ctrl/Alt/Shift'ten BİRİNİ basılı tutun, ardından tuşa basın, ardından ikisini de bırakın. Sağdaki listeden mevcut menü atamalarından birini seçin, ardından [Ekle] ve [OK]'e basın. Bir kısayolu seçip [Sil]'e basarak kaldırın. - - TOPIC: RGB HİSTOGRAMI +image: RGB-hist.png - Küçük bir pencere, Dosya görünümündeki geçerli görüntünün veya görüntünün geçerli seçili alanının bir parlaklık histogramı grafiğini gösterir. Bu grafik, düzenleme işlevleri görüntüyü değiştirdikçe eşzamanlı olarak güncellenir. Gösterilecek renkleri seçmek için [Tümü] [Kırmızı] [Yeşil] [Mavi] düğmelerini kullanın. - - TOPIC: GÖRÜNTÜYÜ BÜYÜT +image: magnify-image.jpg - Fare imleci çevresindeki bir alandaki görüntüyü büyütün. Bir büyüteçle basılı bir görüntüyü görüntülemeye benzer şekilde, farklı alanları büyütmek için fareyi görüntü çevresinde sol sürükleyin. Alanın yarıçapını ve büyütme miktarını ayarlamak için iletişim kutusunu kullanın. - - TOPIC: GÖRÜNTÜYÜ ÖLÇ Noktalar arasındaki piksel mesafesini ölçmek için bir görüntü içindeki herhangi iki konuma tıklayın. Tıklanan konumlar görüntüde A ve B olarak etiketlenir. Bu etiketler her zaman en son tıklanan iki noktayı gösterir. İletişim kutusu, bu iki noktayı ayıran mesafelerle güncellenir: X-mesafesi (yatay mesafe) Y-mesafesi (dikey mesafe) H-mesafesi (toplam mesafe) - - TOPIC: RGB GÖSTER +image: show-RGB.png - Görüntüde bir noktaya tıklandığında, RGB değerleri bir iletişim kutusu penceresinde gösterilir. Son tıklanan 9 nokta görüntülenir. Değerler xxx.dd biçimindedir, burada xxx renk değerinin üst 8 biti ve .dd alt 8 bittir. Aralık 0.00 ile 255.99 arasındadır. Görüntü düzenlenmiyorsa veya 8 bitten fazla renk derinliğine sahip değilse alt 8 bit sıfırdır. Görüntü düzenlenirken çıktılar gerçek zamanlı olarak güncellenir. "etiketler" işaretliyse, noktalar görüntüde iletişim kutusu penceresindeki harflere karşılık gelen harflerle etiketlenir. "delta" işaretliyse ve görüntü düzenleniyorsa, mutlak değerler yerine RGB değişiklikleri gösterilir. - Başka bir görüntü açarsanız (ör. önceki görüntüyle karşılaştırmak için), konumlar yeni görüntü sınırları içindeyse korunur ve güncellenir. Bu, görüntülerin piksel RGB değerleri düzeyinde karşılaştırılmasını kolaylaştırır. - - TOPIC: IZGARA AYARLARI +image: grid-settings.jpg - İki ızgara çizgisi işlevi vardır: Izgara Ayarları tüm ızgara parametrelerini ayarlar. Izgarayı Aç/Kapat, ızgara çizgilerini açar veya kapatır. Izgara çizgileri, görüntü boyunca düzenli aralıklarla yatay ve dikey çizgilerdir. Bu çizgiler, görüntüdeki duvarları veya diğer nesneleri düzeltmek için bir görüntü düzeltildiğinde veya çarpıtıldığında yararlı hizalama kılavuzları olabilir. Sırasıyla dikey ve yatay çizgi sayısını ayarlamak için x-sayısı ve y-sayısı girdilerini kullanın. x- ve y-uzaklığı kontrolleri, ızgara çizgilerini görüntüde istenen bir konumu kesecek şekilde kaydırmak için kullanılabilir. Izgarayı Aç/Kapat'a bir klavye kısayolu (varsayılan shift+G) atanabilir, böylece ızgara çizgileri tek bir tuş vuruşuyla açılıp kapatılabilir. - - TOPIC: ÇİZGİ RENGİ Bazı işlevler görüntü üzerine çizgiler çizer (Kırp, Alan Seç, diğerleri). Arka plan görüntüsüne karşı kontrastı en üst düzeye çıkarmak için bu çizgilerin rengini değiştirebilirsiniz. Küçük iletişim kutusu, düzenleme sırasında açık bırakılabilir, böylece mevcut renkler (siyah, beyaz, kırmızı, yeşil) arasında kolayca geçiş yapılabilir. - - TOPIC: KOYU/PARLAK PİKSELLER Bir görüntüdeki en koyu ve en parlak pikselleri vurgulayın. Başlangıçta koyu pikseller için 0 ve parlak pikseller için 255 olan parlaklık eşiklerini ayarlamak için iki döndürme kontrolünü ayarlayın. Koyu eşikten daha az veya parlak eşikten daha fazla parlaklığa sahip pikseller, öne çıkmaları için "yanıp söner". Parlaklık veya rengi düzenledikten sonra kırpılmayı tespit etmek için bu işlevi kullanın. - - TOPIC: MONİTÖR RENGİ +image: moncolor-small.png - Ekranın üzerine, sıfırdan (siyah) %100'e kadar parlaklığa sahip sekiz renk bandı yazılır. Bunu monitörünüzün parlaklığını ve kontrastını ayarlamak için kullanabilirsiniz. Bantların her iki ucunda da değişmeyen bölgeler olmamalıdır. - - TOPIC: YİNELENENLERİ BUL +image: find-dups.png - Görüntü veritabanınızın herhangi bir yerinde yinelenen görüntü dosyalarını bulun. Yinelenen bir dosya, başka bir dosyayı tam olarak veya "neredeyse" yineleyen bir dosya olabilir. Hız için, thumbnail görüntüleri bellekte karşılaştırılır. Thumbnail'lere yansımayan küçük farklara sahip ana görüntüler için eşleşen thumbnail'ler bulunması mümkündür. Boyutu küçültülmüş bir görüntü kopyası muhtemelen yinelenen olarak sınıflandırılacaktır. Thumbnail boyutu 32 ile 512 piksel arasında ayarlanabilir. Daha büyük bir boyut, yanlış pozitiflerin olasılığını azaltır. Thumbnail boyutu, gereken ana bellek miktarını büyük ölçüde etkiler - ör. 100 bin görüntü için, 64 boyutu yaklaşık 880 MB gerektirirken, 256 boyutu yaklaşık 14 GB gerektirir. Mevcut boş belleğe sığabilecek en büyük thumbnail boyutunu hesaplamak için [calculate] düğmesine basın. - Aynı veya neredeyse aynı görüntülerin tespiti için hassasiyeti ayarlamak üzere iki parametre kullanılır: piksel farkı, altında piksellerin eşit sayıldığı RGB değeri farkıdır. Piksel sayısı, altında iki görüntünün yinelenen olarak sınıflandırıldığı farklı piksel sayısıdır. Örnek: piksel farkı = 2 ve piksel sayısı = 10 ise, 10'dan az piksel 2 veya daha az farklıysa görüntüler yinelenen olarak sınıflandırılır. - Çıktı, her yinelenen görüntü kümesini gösteren bir galeridir. Çıktı galerisi "Duplicate Images" albümü olarak kaydedilir. Hangi yinelenenlerin silineceğini seçmek için bu albümle birlikte Toplu Sil/Çöpe At'ı kullanabilirsiniz. - - TOPIC: HATALI DOSYALARI BUL Bildirdiğiniz üst klasörlerinizdeki tüm görüntü dosyaları okunur. Okunamayan her dosya için üç seçeneğiniz vardır: • dosyayı sil • yanlış bir dosya türünü düzelt (aşağıya bakın) • dosyayı üst görüntü klasörlerinizin dışında bir yere taşı .jpg uzantılı .png dosyalarını sıkça görmüşümdür. Web tarayıcıları ve bazı diğer uygulamalar bununla sessizce başa çıkar. Burada, doğru dosya türü bildirilir ve uzantıyı doğru olanla değiştirebilirsiniz. - - TOPIC: KAYNAKLARI GÖSTER Fotocx tarafından kullanılan bilgisayar kaynaklarını raporlayın: • CPU süresi: Fotocx başlatıldığından beri veya son örnekten beri kullanım • Gerçek bellek: şu anda kullanımda olan gerçek bellek (takas hariç) • Harita önbelleği: önbelleğe alınmış harita karoları için kullanılan disk depolama alanı, MB • Önbelleği temizle: önbelleğe alınmış tüm harita karolarını sil • [Sample] düğmesi: yeni bir örnek al ve veriyi raporla - [Sample] düğmesi CPU süresini sıfırlar. Bir sonraki örnek yalnızca yeni birikmiş CPU süresini gösterecektir. CPU süresi, tüm işlem iş parçacıkları için toplamdır. - - TOPIC: ÇEVİRİLER Fotocx paketinde birçok dil için çeviriler bulunur. Bu yapay zeka çevirileri mükemmel değildir. Çeviri hataları, çeviri dosyalarını düzenleyerek düzeltilebilir. - ^GUI dilini değiştirme {AYARLAR} menüsü dili değiştirmek için kullanılabilir. Dil, Fotocx başlatıldığında da ayarlanabilir: $ fotocx -lang xx # dil xx (de fr zh vb.) $ fotocx -lang en # İngilizce - ^Bir GUI çevirisini değiştirme /translations/gui_xx dosyasını düzenleyin Metin satırı çiftlerinin, eşleşmesi gereken baştaki 4 basamaklı numaraları vardır. İlk satır İngilizce, 2. satır xx dilindedir. Yalnızca xx satırını değiştirin, İngilizce satırı asla değiştirmeyin. Metne parametre eklemek için kullanılan özel karakterler aynı sırada kalmalıdır. Bunlar '%d' (tam sayı parametresi), '%f' (ondalık), '%s' (metin). - ^Bir kullanıcı kılavuzu çevirisini değiştirme /translations/ug_xx dosyasını düzenleyin Çeviriyi düzeltmek için ug_xx'i düzenleyin. Herhangi bir metin satırı eklemeyin veya kaldırmayın ya da sırayı değiştirmeyin. Metin satırları, İngilizce kullanıcı kılavuzu ug_en ile 1:1 karşılık gelmelidir. - Bir sonraki Fotocx sürümüne dahil edilmek üzere düzeltilmiş dosyaları gönderin: mkornelix@gmail.com - - TOPIC: YARDIM MENÜSÜ • Kullanıcı Kılavuzu - İçindekiler tablosunu göster • Video Eğitimi - YouTube'da bir Fotocx video eğitimini göster • Harici Programlar - Harici programları ve işlevlerini listele • Günlük Dosyasını Göster - Günlüğe kaydedilmiş bilgileri ve hata mesajlarını görüntüle • Komut Parametreleri - Kullanılabilir komut satırı parametrelerini göster • Değişiklik Günlüğü - Son sürümlerdeki eklemeleri ve hata düzeltmelerini göster • Telif Hakkı - Fotocx ile ilgili telif haklarını ve lisansları göster • Gizlilik - Fotocx için gizlilik politikasını (kurallarını) göster • Hakkında - Sürüm numarasını, çalıştırılabilir dosya konumunu, iletişimi göster • Ana Sayfa - kornelix.net'teki Fotocx ana sayfasını göster • Kaldır - Fotocx nasıl kaldırılır - - TOPIC: DİĞER KONULAR Aşağıdaki konular Fotocx menüleriyle bağlantılı değildir. - - TOPIC: VIDEO FILES Video dosyaları (.mpeg, .mp4, vb.) görüntü dosyalarınızla karışık olabilir. Hem dosya hem de Galeri Görünümünde görüntü dosyaları olarak gösterilirler. 'P' tuşu videoyu başlatır, duraklatır ve devam ettirir veya bitmiş bir videoyu tekrar oynatır. 'Q' tuşu videodan çıkar. Video dosyalarını oynatmak için uygulamayı seçmek üzere {AYARLAR} menüsünü kullanın. - - TOPIC: SLAYTLAR VE NEGATİFLER +image: color-negative.jpg - Slaytları veya film negatiflerini yakalamak için yakın çekim yapabilen bir kamera kullanabilirsiniz. Aydınlatma için bir ışık kutusu kullanın veya gökyüzünü kullanın (yukarıdaki örnek). Bir renkli negatifi işlemek için önce bir pozitif yapın - bkz. {RENK MODU}. Görüntü sisliyse, film kenarlarını hariç tutarak yalnızca görüntü alanını seçin, ardından sisi ortadan kaldırmak için {GENEL RETİNEKS}'i kullanın. Sisi daha da azaltmak gerekirse görüntüye tıklayarak beyaz ve siyah noktaları ayarlayın. - - TOPIC: FOTOCX SINIRLAMALARI • Bir milyon dosyalık kesin bir sınır vardır. • görüntü sürümleri - geri al/yinele ve sürüm adlandırma için en fazla 99 sürüm. • görüntü keyword'leri - toplam 10 bin keyword. Tek bir görüntü için 1000 karakter. • Galeriler 40 bin görüntü dosyasıyla sınırlıdır. • maks. görüntü boyutları 40 bin x 20 bin pikseldir. - - TOPIC: WINDOWS 11 İÇİN FOTOCX Fotocx, Windows Subsystem for Linux 2 (WSL2) kurularak Windows 11'de kullanılabilir. İnternette bunun nasıl yapılacağına dair bol miktarda belge vardır. - Görüntü dosyalarınız Windows dosya sisteminde (NTFS) ise, Fotocx çok yavaş olacaktır. Bu yüzden görüntü dosyalarınızı Linux dosya sistemine taşıyın. Yine de bunlara Windows Dosya Gezgini ve diğer Windows uygulamalarını kullanarak erişebilirsiniz, bu yüzden hiçbir şey kaybolmaz. Microsoft ayrıca daha iyi performans için Linux dosya sistemini önerir. Linux dosya sistemindeki ana klasörünüze erişmek için Dosya Gezgini'ndeki 'Linux' simgesini kullanın. Gerekirse bir Pictures klasörü ekleyin ve görüntü dosyalarınızı oraya taşıyın. - Bir Fotocx paketi mevcutsa, kurun. Aksi takdirde, şunu yapın: Fotocx ikili paket dosyasını şuradan indirin: ^https://kornelix.net. Linux terminalinde: $ cd /mnt/c/Users//Downloads # Windows indirilenler klasörüne git $ tar -xzf fotocx-xxx-bin.tar.gz # paketi fotocx klasörüne çıkar $ cd fotocx # fotocx klasörüne git $ chmod u+x install.sh # kurulum betiğini çalıştırılabilir yap $ ./install.sh # betiği çalıştır, fotocx'i kur $ fotocx # Fotocx'i başlat Son adımın çalışması için Linux penceresini yeniden başlatmanız gerekebilir. - Bu kullanıcı kılavuzunun giriş bölümlerini okuyun. Fotocx derin bir işlevselliğe sahiptir. Fotocx'i birkaç dakikada tam olarak öğrenmeyi beklemeyin. - - TOPIC: GİZLİLİK Fotocx, görüntü dosyaları ve bunların metadata'sı dışında hiçbir kullanıcı verisini saklamaz. Metadata, internete yüklemeden önce görüntü dosyalarından kaldırılmalıdır ve Fotocx bunu yapmak için basit bir yöntem sağlar. - - TOPIC: PROBLEM, QUESTION, SUGGESTION mkornelix@gmail.com adresine e-posta gönderin. Bir çökme dökümü (zappcrash dosyası) varsa bunu da gönderin. - fotocx/data/translations/gui_de0000664000175000017500000037022415247006657015657 0ustar micomico0000 + Zoom-in \n 0000 + Zoom vergrößern \n 0001 - Zoom-out \n 0001 - Zoom verkleinern \n 0002 = Zoom-in \n 0002 = Zoom vergrößern \n 0003 Arrow keys Previous/Next file \n 0003 Pfeiltasten Vorherige/Nächste Datei \n 0004 Delete Delete/Trash file \n 0004 Entf Datei löschen/in den Papierkorb verschieben \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Esc Dialog schließen / Fotocx beenden \n 0006 F1 User Guide, Context Help \n 0006 F1 Benutzerhandbuch, Kontexthilfe \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 Vollbild / ohne Menüs \n 0008 Home/End Gallery start/end \n 0008 Pos1/Ende Galerie Anfang/Ende \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 Die Indizierungszeit hängt von der Anzahl, dem Typ und der Größe \n Ihrer Bilddateien sowie der Geschwindigkeit Ihres Computers ab. Dies kann \n von einigen Hundert bis über 10.000 pro Minute reichen. \n Sie können die Indexoptionen später über diese Menüs ändern: \n Werkzeuge > Index, Werkzeuge > Einstellungen. \n 0010 Page keys Gallery page up/down \n 0010 Bild-Tasten Galerie Seite hoch/runter \n 0011 Z 1x <--> fit to window \n 0011 Z 1x <--> An Fenster anpassen \n 0012 $s plugin needs base and adder 0012 $s Plugin benötigt Basis und Zusatz 0013 % from left: 0013 % von links: 0014 % from top: 0014 % von oben: 0015 %d albums selected 0015 %d Alben ausgewählt 0016 %d image files selected 0016 %d Bilddateien ausgewählt 0017 %d images 0017 %d Bilder 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 %d keywords werden entfernt \nin %d Bilddateien. \nFortfahren? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 %d keywords werden umbenannt \nin %d Bilddateien. \nFortfahren? 0020 %d max images exceeded 0020 %d max. Bilder überschritten 0021 %d red-eye limit reached 0021 %d Rote-Augen-Grenze erreicht 0022 %s %s %d folders %d files 0022 %s %s %d Ordner %d Dateien 0023 %s *** date/time conversion failed \n 0023 %s *** Datum/Zeit-Umwandlung fehlgeschlagen \n 0024 %s ALBUM %s %d files 0024 %s ALBUM %s %d Dateien 0025 %s NEWEST FILES 0025 %s NEUESTE DATEIEN 0026 %s RECENT FILES 0026 %s LETZTE DATEIEN 0027 %s SEARCH RESULTS %d files 0027 %s SUCHERGEBNISSE %d Dateien 0028 %s UNKNOWN 0028 %s UNBEKANNT 0029 %s added to script 0029 %s zum Skript hinzugefügt 0030 %s is already indexed 0030 %s ist bereits indiziert 0031 %s renamed: %s 0031 %s umbenannt: %s 0032 %s: metadata update failed 0032 %s: Aktualisierung der metadata fehlgeschlagen 0033 %s: no write permission 0033 %s: keine Schreibberechtigung 0034 %s: reserved, cannot be used 0034 %s: reserviert, kann nicht verwendet werden 0035 %s: too many keywords 0035 %s: zu viele keywords 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\nAufnahmedatum: %s Dateidatum: %s \nBewertung: %s Größe: %s %.2fmb \nOrt: %s %s %s \nkeywords: %s \nTitel: %s \nBeschreibung: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\nAufnahmedatum: %s Dateidatum: %s \nBewertung: %s Größe: %s %.2fmb \nOrt: %s %s %s \nkeywords: %s \nTitel: %s \nBeschreibung: %s \n----------------------- \n%s 0038 (click below) 0038 (unten klicken) 0039 (no selection) 0039 (keine Auswahl) 0040 (pixels) 0040 (Pixel) 0041 (press key) 0041 (Taste drücken) 0042 (select function) 0042 (Funktion auswählen) 0043 *** bad utf8 detected *** \n 0043 *** ungültiges utf8 erkannt *** \n 0044 *** cannot create new file \n 0044 *** neue Datei kann nicht erstellt werden \n 0045 *** cannot get real path of input file \n 0045 *** realer Pfad der Eingabedatei kann nicht ermittelt werden \n 0046 *** cannot load input file \n 0046 *** Eingabedatei kann nicht geladen werden \n 0047 *** cannot make new version of input file \n 0047 *** neue Version der Eingabedatei kann nicht erstellt werden \n 0048 *** cannot open input file 0048 *** Eingabedatei kann nicht geöffnet werden 0049 *** cannot read input file 0049 *** Eingabedatei kann nicht gelesen werden 0050 *** cannot save output file \n 0050 *** Ausgabedatei kann nicht gespeichert werden \n 0051 *** completed \n 0051 *** abgeschlossen \n 0052 *** file date/time invalid \n 0052 *** Datum/Zeit der Datei ungültig \n 0053 *** file type not supported \n 0053 *** Dateityp nicht unterstützt \n 0054 *** invalid file \n 0054 *** ungültige Datei \n 0055 *** metadata update error \n 0055 *** Fehler bei der Aktualisierung der metadata \n 0056 *** no date/time available \n 0056 *** kein Datum/Zeit verfügbar \n 0057 + bright 0057 + hell 0058 +Blue -Yellow 0058 +Blau -Gelb 0059 +Brightness 0059 +Helligkeit 0060 +Green -Magenta 0060 +Grün -Magenta 0061 +Red -Cyan 0061 +Rot -Cyan 0062 - blue 0062 - blau 0063 - fog/haze 0063 - Dunst/Nebel 0064 .heic/.avif files not supported (install heif_convert) 0064 .heic/.avif-Dateien nicht unterstützt (heif_convert installieren) 0065 .jp2 files not supported (install opj_decompress) 0065 .jp2-Dateien nicht unterstützt (opj_decompress installieren) 0066 .webp files not supported (install dwebp) 0066 .webp-Dateien nicht unterstützt (dwebp installieren) 0067 0 albums selected 0067 0 Alben ausgewählt 0068 0 duplicates 0068 0 Duplikate 0069 0-5 stars 0069 0-5 Sterne 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = kein Bildindex, nur alter Index, alt + neue/geänderte aktualisieren 0071 2-character code 0071 2-Zeichen-Code 0072 3D depth 0072 3D-Tiefe 0073 <2 images 0073 <2 Bilder 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 Eine neue Fotocx-Version wird installiert. \nBenutzerdefinierte Einstellungen müssen eventuell wiederhergestellt werden. 0075 ADD GLARE 0075 GLANZ HINZUFÜGEN 0076 ADD NOISE 0076 RAUSCHEN HINZUFÜGEN 0077 ADJUST HSL 0077 HSL ANPASSEN 0078 ADJUST RGB 0078 RGB ANPASSEN 0079 ALBUM MASS UPDATE 0079 ALBUM-SAMMELAKTUALISIERUNG 0080 ALBUMS 0080 ALBEN 0081 ALBUMS MENU 0081 ALBEN-MENÜ 0082 ALIEN COLORS 0082 FREMDE FARBEN 0083 AMPLIFY CONTRAST 0083 KONTRAST VERSTÄRKEN 0084 ANTI-ALIAS 0084 KANTENGLÄTTUNG 0085 AREA BLEND 0085 BEREICH ÜBERBLENDEN 0086 AREA FILL 0086 BEREICH FÜLLEN 0087 AREA OVERVIEW 0087 BEREICHSÜBERSICHT 0088 AUTOSEARCH 0088 AUTOSUCHE 0089 About 0089 Info 0090 Action 0090 Aktion 0091 Add 0091 Hinzufügen 0092 Add 1 0092 1 hinzufügen 0093 Add All 0093 Alle hinzufügen 0094 Add Current 0094 Aktuelles hinzufügen 0095 Add Current File Here 0095 Aktuelle Datei hier hinzufügen 0096 Add Glare 0096 Glanz hinzufügen 0097 Add Image 0097 Bild hinzufügen 0098 Add Line 0098 Linie hinzufügen 0099 Add Margins 0099 Ränder hinzufügen 0100 Add Noise 0100 Rauschen hinzufügen 0101 Add Random Noise 0101 Zufälliges Rauschen hinzufügen 0102 Add Selected Files Here 0102 Ausgewählte Dateien hier hinzufügen 0103 Add Texture 0103 Textur hinzufügen 0104 Add a brightness/color ramp across an image 0104 Einen Helligkeits-/Farbverlauf über ein Bild legen 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 Lesezeichen hinzufügen: auf ein Galerie-thumbnail klicken. \nLesezeichen umbenennen: darauf klicken und [Umbenennen] drücken 0106 Add glare around bright objects 0106 Glanz um helle Objekte hinzufügen 0107 Add margins around an image 0107 Ränder um ein Bild hinzufügen 0108 Add newest version to existing versions 0108 Neueste Version zu vorhandenen Versionen hinzufügen 0109 Add overlay image (e.g. copyright) to selected images 0109 Overlay-Bild (z. B. Copyright) zu ausgewählten Bildern hinzufügen 0110 Add random noise to an image 0110 Zufälliges Rauschen zu einem Bild hinzufügen 0111 Add selected versions to existing versions 0111 Ausgewählte Versionen zu vorhandenen Versionen hinzufügen 0112 Add texture to an image 0112 Textur zu einem Bild hinzufügen 0113 Add to Selection 0113 Zur Auswahl hinzufügen 0114 Add/change/delete metadata for selected image files 0114 metadata für ausgewählte Bilddateien hinzufügen/ändern/löschen 0115 Add/remove barrel/pincushion distortion 0115 Tonnen-/Kissenverzerrung hinzufügen/entfernen 0116 Add/remove brightness/color radially from chosen center 0116 Helligkeit/Farbe radial vom gewählten Zentrum aus hinzufügen/entfernen 0117 Add/remove keywords for selected image files 0117 keywords für ausgewählte Bilddateien hinzufügen/entfernen 0118 Add/revise location/geocoordinates for selected image files 0118 Ort/Geokoordinaten für ausgewählte Bilddateien hinzufügen/ändern 0119 Adjust HSL 0119 HSL anpassen 0120 Adjust Image Contributions 0120 Bildbeiträge anpassen 0121 Adjust Pixel Composition 0121 Pixelzusammensetzung anpassen 0122 Adjust RGB 0122 RGB anpassen 0123 Adjust brightness, contrast, color 0123 Helligkeit, Kontrast, Farbe anpassen 0124 Adjust color saturation based on brightness 0124 Farbsättigung basierend auf Helligkeit anpassen 0125 Adjust color using HSL color model 0125 Farbe mit dem HSL-Farbmodell anpassen 0126 Adjust color using RGB or CMY colors 0126 Farbe mit RGB- oder CMY-Farben anpassen 0127 Adjustment 0127 Anpassung 0128 Album Mass Update 0128 Album-Sammelaktualisierung 0129 Album Name 0129 Albumname 0130 Albums 0130 Alben 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 Alben: Galerie ausgewählter Bilder, per Drag & Drop anordnen 0132 Algorithm Iterations 0132 Algorithmus-Wiederholungen 0133 Alien Colors 0133 Fremde Farben 0134 All 0134 Alle 0135 All Areas 0135 Alle Bereiche 0136 All files 0136 Alle Dateien 0137 All image files will be re-indexed. \nContinue? 0137 Alle Bilddateien werden neu indiziert. \nFortfahren? 0138 All±1 0138 Alle±1 0139 All±10 0139 Alle±10 0140 Alpha 0140 Alpha 0141 Amount 0141 Betrag 0142 Amplify 0142 Verstärken 0143 Amplify Contrast 0143 Kontrast verstärken 0144 Amplify area contrast to enhance visibility of details 0144 Bereichskontrast verstärken, um Details sichtbarer zu machen 0145 Angle 0145 Winkel 0146 Anti-Alias 0146 Kantenglättung 0147 Apply 0147 Anwenden 0148 Apply a soft focus effect to an image 0148 Einen Weichzeichnungseffekt auf ein Bild anwenden 0149 Apply repeatedly while watching the image. 0149 Wiederholt anwenden, dabei das Bild beobachten. 0150 Area Blend 0150 Bereich überblenden 0151 Area Edge Blend 0151 Bereichskante überblenden 0152 Area Fill 0152 Bereich füllen 0153 Arrange images and text in a layout (photo-montage) 0153 Bilder und Text in einem Layout anordnen (Fotomontage) 0154 Array Complete 0154 Array vollständig 0155 Array Width 0155 Array-Breite 0156 Arrow head 0156 Pfeilspitze 0157 Auto Level 0157 Automatischer Abgleich 0158 Auto black level 0158 Automatischer Schwarzpunkt 0159 Auto crop: 0159 Automatisch zuschneiden: 0160 Auto white balance 0160 Automatischer Weißabgleich 0161 Auto-replay 0161 Auto-Wiedergabe 0162 BATCH CHANGE META 0162 SAMMEL-METADATENÄNDERUNG 0163 BATCH CONVERT 0163 SAMMELKONVERTIERUNG 0164 BATCH COPY/MOVE 0164 SAMMEL-KOPIEREN/VERSCHIEBEN 0165 BATCH DELETE/TRASH 0165 SAMMEL-LÖSCHEN/PAPIERKORB 0166 BATCH GEOTAGS 0166 SAMMEL-GEOTAGS 0167 BATCH KEYWORDS 0167 SAMMEL-KEYWORDS 0168 BATCH MENU 0168 SAMMEL-MENÜ 0169 BATCH OVERLAY 0169 SAMMEL-OVERLAY 0170 BATCH PHOTO DATE 0170 SAMMEL-AUFNAHMEDATUM 0171 BATCH PROCESSING 0171 STAPELVERARBEITUNG 0172 BATCH PURGE KEYWORDS 0172 SAMMEL-KEYWORDS ENTFERNEN 0173 BATCH RENAME KEYWORDS 0173 SAMMEL-KEYWORDS UMBENENNEN 0174 BATCH REPORT META 0174 SAMMEL-METADATENBERICHT 0175 BATCH SCRIPT 0175 SAMMELSKRIPT 0176 BATCH UPRIGHT 0176 SAMMEL-AUFRICHTEN 0177 BLANK IMAGE 0177 LEERES BILD 0178 BLUR 0178 WEICHZEICHNEN 0179 BOOKMARKS 0179 LESEZEICHEN 0180 BRIGHTNESS RAMP 0180 HELLIGKEITSVERLAUF 0181 Background 0181 Hintergrund 0182 Background Blur - blur relative to distance from foreground 0182 Hintergrundunschärfe - Unschärfe relativ zum Abstand vom Vordergrund 0183 Background Color 0183 Hintergrundfarbe 0184 Background Pattern 0184 Hintergrundmuster 0185 Base Transparency 0185 Basistransparenz 0186 Batch 0186 Sammel 0187 Batch Add/Change Metadata 0187 Metadaten sammelweise hinzufügen/ändern 0188 Batch Add/Remove Keywords 0188 keywords sammelweise hinzufügen/entfernen 0189 Batch Change Meta 0189 Metadaten sammelweise ändern 0190 Batch Convert 0190 Sammelkonvertierung 0191 Batch Copy/Move 0191 Sammelweise kopieren/verschieben 0192 Batch Delete/Trash 0192 Sammelweise löschen/Papierkorb 0193 Batch Geotags 0193 Sammel-Geotags 0194 Batch Keywords 0194 Sammel-keywords 0195 Batch Metadata 0195 Sammel-metadata 0196 Batch Overlay 0196 Sammel-Overlay 0197 Batch Photo Date 0197 Sammel-Aufnahmedatum 0198 Batch Photo Date/Time 0198 Sammel-Aufnahmedatum/-zeit 0199 Batch Purge Keywords 0199 Sammel-keywords entfernen 0200 Batch Rename Keywords 0200 Sammel-keywords umbenennen 0201 Batch Report Meta 0201 Sammel-Metadatenbericht 0202 Batch Report Metadata 0202 Sammel-metadata-Bericht 0203 Batch Set Geotags 0203 Sammel-Geotags festlegen 0204 Batch Upright 0204 Sammel-Aufrichten 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 Sammel: kopieren, verschieben, konvertieren, RAW konvertieren, metadata hinzufügen/ändern 0206 Bend and fine-align 0206 Biegen und feinausrichten 0207 Bias 0207 Bias 0208 Black 0208 Schwarz 0209 Blank Image 0209 Leeres Bild 0210 Blend 0210 Überblenden 0211 Blend 0% 0211 Überblendung 0% 0212 Blend Width 0212 Überblendbreite 0213 Blend area edits/edges using the mouse 0213 Bereichsbearbeitungen/-kanten mit der Maus überblenden 0214 Blend: 0% 0214 Überblendung: 0% 0215 Blue 0215 Blau 0216 Blue Factors 0216 Blau-Faktoren 0217 Blur 0217 Weichzeichnen 0218 Blur Angle (degrees) 0218 Weichzeichnungswinkel (Grad) 0219 Blur Background 0219 Hintergrund weichzeichnen 0220 Blur Image 0220 Bild weichzeichnen 0221 Blur Mix 0221 Unschärfe-Mix 0222 Blur Normal 0222 Normale Unschärfe 0223 Blur Radius 0223 Unschärferadius 0224 Blur Span 0224 Unschärfebereich 0225 Blur Span (pixels) 0225 Unschärfebereich (Pixel) 0226 Blur the image (various methods) 0226 Bild weichzeichnen (verschiedene Methoden) 0227 Bookmarks 0227 Lesezeichen 0228 Both 0228 Beide 0229 Bottom 0229 Unten 0230 Bright Limit 0230 Hellgrenze 0231 Bright Point 0231 Hellpunkt 0232 Brightness 0232 Helligkeit 0233 Brightness Histogram 0233 Helligkeitshistogramm 0234 Brightness Ramp 0234 Helligkeitsverlauf 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 Die Helligkeit sollte einen gleichmäßigen Verlauf zeigen, \nder bis an die Ränder reicht. 0236 Browse 0236 Durchsuchen 0237 CALIBRATE PRINTER 0237 DRUCKER KALIBRIEREN 0238 CAPTIONS 0238 BESCHRIFTUNGEN 0239 CARTOON 0239 CARTOON 0240 CHOOSE ALBUM 0240 ALBUM WÄHLEN 0241 CLEAR AREA 0241 BEREICH LEEREN 0242 CLOSE 0242 SCHLIESSEN 0243 COLOR MODE 0243 FARBMODUS 0244 COMBINE MENU 0244 KOMBINIEREN-MENÜ 0245 COMMAND PARAMETERS 0245 BEFEHLSPARAMETER 0246 COMPLETED 0246 ABGESCHLOSSEN 0247 COPY FROM IMAGE 0247 AUS BILD KOPIEREN 0248 COPY IN IMAGE 0248 IM BILD KOPIEREN 0249 COPY META 0249 METADATA KOPIEREN 0250 COPY PRIOR EDIT 0250 VORHERIGE BEARBEITUNG KOPIEREN 0251 COPY TO CLIPBOARD 0251 IN ZWISCHENABLAGE KOPIEREN 0252 COPY TO DESKTOP 0252 AUF DESKTOP KOPIEREN 0253 COPY/MOVE 0253 KOPIEREN/VERSCHIEBEN 0254 COPY/PASTE AREA 0254 BEREICH KOPIEREN/EINFÜGEN 0255 CREATE ALBUM 0255 ALBUM ERSTELLEN 0256 CROP 0256 ZUSCHNEIDEN 0257 CROSSHATCH 0257 SCHRAFFUR 0258 CURRENT ALBUM 0258 AKTUELLES ALBUM 0259 CURRENT FILE FOLDER 0259 AKTUELLER DATEIORDNER 0260 CURVE EDITING 0260 KURVENBEARBEITUNG 0261 CUSTOM KERNEL 0261 BENUTZERDEFINIERTER KERNEL 0262 CUSTOM MENU 0262 BENUTZERDEFINIERTES MENÜ 0263 CYCLE 2 FILES 0263 2 DATEIEN DURCHLAUFEN 0264 CYCLE 3 FILES 0264 3 DATEIEN DURCHLAUFEN 0265 Calculate 0265 Berechnen 0266 Calculate Geometry 0266 Geometrie berechnen 0267 Calibrate Printer 0267 Drucker kalibrieren 0268 Cancel 0268 Abbrechen 0269 Cartoon 0269 Cartoon 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 Achtung: Verwenden Sie die Funktion "Hauptmetadaten bearbeiten" \num dort verfügbare tags zu ändern, damit \nzugehörige Aktualisierungen vorgenommen werden. 0271 Center 0271 Zentrieren 0272 Center Hole 0272 Mittelloch 0273 Change 0273 Ändern 0274 Change Log 0274 Änderungsprotokoll 0275 Change file name 0275 Dateinamen ändern 0276 Change gallery sort order 0276 Galerie-Sortierreihenfolge ändern 0277 Change image colors using an algorithm 0277 Bildfarben mit einem Algorithmus ändern 0278 Change image pixel dimensions 0278 Bildpixelabmessungen ändern 0279 Chart to adjust monitor color 0279 Diagramm zur Monitorfarbanpassung 0280 Choose 0280 Wählen 0281 Choose Album 0281 Album wählen 0282 Choose Albums 0282 Alben wählen 0283 Choose Captions 0283 Beschriftungen wählen 0284 Choose an album and show as gallery of images 0284 Album wählen und als Bildergalerie anzeigen 0285 Choose metadata shown on image captions 0285 Auf Bildbeschriftungen angezeigte metadata auswählen 0286 Choose new Fotocx home folder 0286 Neuen Fotocx-Startordner wählen 0287 Choose thumbnail folder 0287 thumbnail-Ordner wählen 0288 Choose top image folders 0288 Oberste Bildordner wählen 0289 Clear 0289 Leeren 0290 Clear All 0290 Alles leeren 0291 Click dark spot for black level 0291 Auf dunkle Stelle für Schwarzpunkt klicken 0292 Click for RGB histogram 0292 Für RGB-Histogramm klicken 0293 Click gray spot for white balance 0293 Auf graue Stelle für Weißabgleich klicken 0294 Click image to select pixels 0294 Auf Bild klicken, um Pixel auszuwählen 0295 Click image to select, drag image to move. 0295 Zum Auswählen auf Bild klicken, zum Verschieben Bild ziehen. 0296 Click mouse to change center 0296 Maus klicken, um Zentrum zu ändern 0297 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0297 In der Nähe einer beliebigen Position auf der Bereichsumrandung klicken. \nMögliche Lücken in der Umrandung werden gefunden. \nF1 für Hilfe drücken 0298 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0298 Die vier Ecken eines Vierecks anklicken. [Anwenden] drücken. \nDas Bild wird verzerrt, um das Viereck zu einem Rechteck zu machen. 0299 Click thumbnail to select file 0299 Auf thumbnail klicken, um Datei auszuwählen 0300 Clip Level 0300 Clip-Niveau 0301 Clip Limit % 0301 Clip-Grenze % 0302 Color 0302 Farbe 0303 Color Chooser 0303 Farbwähler 0304 Color Depth: 0304 Farbtiefe: 0305 Color Fringes 0305 Farbsäume 0306 Color Hue 0306 Farbton 0307 Color Map File 0307 Farbzuordnungsdatei 0308 Color Match Images 0308 Bildfarben abgleichen 0309 Color Mode 0309 Farbmodus 0310 Color calibration tool for printer and paper type 0310 Farbkalibrierungswerkzeug für Drucker und Papiertyp 0311 Color map file to use 0311 Zu verwendende Farbzuordnungsdatei 0312 Combine 0312 Kombinieren 0313 Combine 2-6 images into a wide panorama image 0313 2-6 Bilder zu einem breiten Panoramabild kombinieren 0314 Combine many images into an array of images 0314 Viele Bilder zu einem Bilderfeld kombinieren 0315 Combine multiple images in layers, select and expose layers 0315 Mehrere Bilder in Ebenen kombinieren, Ebenen auswählen und belichten 0316 Combine multiple noisy photos into a low-noise image 0316 Mehrere verrauschte Fotos zu einem rauscharmen Bild kombinieren 0317 Combine multiple photos to erase passing people, etc. 0317 Mehrere Fotos kombinieren, um vorbeigehende Personen usw. zu entfernen 0318 Combine within 0318 Kombinieren innerhalb 0319 Combine: HDR, HDF, stack, panorama, mashup, image array 0319 Kombinieren: HDR, HDF, Stapel, Panorama, Mashup, Bilderfeld 0320 Command Params 0320 Befehlsparameter 0321 Commit 0321 Übernehmen 0322 Confirm Exit 0322 Beenden bestätigen 0323 Contrast 0323 Kontrast 0324 Contrast All 0324 Kontrast Gesamt 0325 Contrast Blue 0325 Kontrast Blau 0326 Contrast Green 0326 Kontrast Grün 0327 Contrast Limit 0327 Kontrastgrenze 0328 Contrast Red 0328 Kontrast Rot 0329 Convert %d image files 0329 %d Bilddateien konvertieren 0330 Convert an image into a Tiny Planet image 0330 Ein Bild in ein Tiny-Planet-Bild umwandeln 0331 Convert image into a cartoon drawing 0331 Bild in eine Cartoon-Zeichnung umwandeln 0332 Convert image into a crosshatch sketch 0332 Bild in eine Schraffurskizze umwandeln 0333 Convert image into a line drawing 0333 Bild in eine Strichzeichnung umwandeln 0334 Convert image into a simulated painting 0334 Bild in ein simuliertes Gemälde umwandeln 0335 Convert image into a simulated sketch (1) 0335 Bild in eine simulierte Skizze (1) umwandeln 0336 Convert image into a simulated sketch (2) 0336 Bild in eine simulierte Skizze (2) umwandeln 0337 Convert image into black/white lines 0337 Bild in Schwarz-Weiß-Linien umwandeln 0338 Convert image into dithered dots 0338 Bild in gerasterte Punkte umwandeln 0339 Convert image into square tiles with 3D effect 0339 Bild in quadratische Kacheln mit 3D-Effekt umwandeln 0340 Convert image into tiles matching feature contours 0340 Bild in Kacheln umwandeln, die den Bildkonturen folgen 0341 Copy 0341 Kopieren 0342 Copy %d image files 0342 %d Bilddateien kopieren 0343 Copy From Image 0343 Aus Bild kopieren 0344 Copy Meta 0344 Metadata kopieren 0345 Copy Metadata 0345 Metadata kopieren 0346 Copy Prior Edit 0346 Vorherige Bearbeitung kopieren 0347 Copy Within Image 0347 Innerhalb des Bildes kopieren 0348 Copy area for later pasting into image 0348 Bereich zum späteren Einfügen in ein Bild kopieren 0349 Copy areas from another image using the mouse 0349 Bereiche mit der Maus aus einem anderen Bild kopieren 0350 Copy areas from prior edits using the mouse 0350 Bereiche mit der Maus aus früheren Bearbeitungen kopieren 0351 Copy areas within an image using the mouse 0351 Bereiche mit der Maus innerhalb eines Bildes kopieren 0352 Copy image file to the clipboard 0352 Bilddatei in die Zwischenablage kopieren 0353 Copy image file to the desktop 0353 Bilddatei auf den Desktop kopieren 0354 Copy in Image 0354 Im Bild kopieren 0355 Copy metadata from one image to another 0355 Metadata von einem Bild in ein anderes kopieren 0356 Copy or Move Image File 0356 Bilddatei kopieren oder verschieben 0357 Copy or Move image file to new location 0357 Bilddatei an einen neuen Ort kopieren oder verschieben 0358 Copy to Clipboard 0358 In Zwischenablage kopieren 0359 Copy to Desktop 0359 Auf Desktop kopieren 0360 Copy without unsaved changes? 0360 Ohne nicht gespeicherte Änderungen kopieren? 0361 Copy/Move 0361 Kopieren/Verschieben 0362 Copy/move selected image files to a new folder 0362 Ausgewählte Bilddateien in einen neuen Ordner kopieren/verschieben 0363 Copyright 0363 Copyright 0364 Create 0364 Erstellen 0365 Create Album 0365 Album erstellen 0366 Create Blank Image 0366 Leeres Bild erstellen 0367 Create Mosaic 0367 Mosaik erstellen 0368 Create a blank image 0368 Ein leeres Bild erstellen 0369 Create a mosaic with tiles made from all images 0369 Ein Mosaik aus Kacheln aus allen Bildern erstellen 0370 Create a new album (ordered set of image files) 0370 Ein neues Album erstellen (geordnete Bilddateiliste) 0371 Create an embossed or 3D appearance 0371 Ein geprägtes oder 3D-Aussehen erstellen 0372 Create or replace an album 0372 Ein Album erstellen oder ersetzen 0373 Crop 0373 Zuschneiden 0374 Crop (trim) image margins 0374 Bildränder zuschneiden (trimmen) 0375 Crop Buttons 0375 Zuschneide-Schaltflächen 0376 Crop Image 0376 Bild zuschneiden 0377 Crosshatch 0377 Schraffur 0378 Crosshatch Sketch 0378 Schraffurskizze 0379 Current Album 0379 Aktuelles Album 0380 Current File Folder 0380 Aktueller Dateiordner 0381 Current gallery 0381 Aktuelle Galerie 0382 Current image: 0382 Aktuelles Bild: 0383 Curve Node 0383 Kurvenknoten 0384 Curve lines need at least 4 points 0384 Kurvenlinien benötigen mindestens 4 Punkte 0385 Custom 0385 Benutzerdefiniert 0386 Custom Kernel 0386 Benutzerdefinierter Kernel 0387 Custom Shortcuts \n 0387 Benutzerdefinierte Tastenkürzel \n 0388 Custom menu: favorite/frequent functions, scripts, plugins 0388 Benutzerdefiniertes Menü: bevorzugte/häufige Funktionen, Skripte, Plugins 0389 Customize 0389 Anpassen 0390 Customize: 0390 Anpassen: 0391 Cut Bottom 0391 Unten abschneiden 0392 Cut Top 0392 Oben abschneiden 0393 Cycle 2 Files 0393 2 Dateien durchlaufen 0394 Cycle 2 Prior Files 0394 2 vorherige Dateien durchlaufen 0395 Cycle 3 Files 0395 3 Dateien durchlaufen 0396 Cycle 3 Prior Files 0396 3 vorherige Dateien durchlaufen 0397 Cycle through images: 0397 Bilder durchlaufen: 0398 DARK/BRIGHT PIXELS 0398 DUNKLE/HELLE PIXEL 0399 DEFOG 0399 ENTNEBELN 0400 DELETE ALBUM 0400 ALBUM LÖSCHEN 0401 DELETE META 0401 METADATA LÖSCHEN 0402 DELETE/TRASH 0402 LÖSCHEN/PAPIERKORB 0403 DENOISE 0403 ENTRAUSCHEN 0404 DIALOG BUTTONS 0404 DIALOG-SCHALTFLÄCHEN 0405 DITHER 0405 DITHERN 0406 DRAG AND DROP 0406 DRAG AND DROP 0407 Dark Areas 0407 Dunkle Bereiche 0408 Dark Limit 0408 Dunkelgrenze 0409 Dark Point 0409 Dunkelpunkt 0410 Dark/Bright Pixels 0410 Dunkle/Helle Pixel 0411 Data file 0411 Datendatei 0412 Define keywords used for searching images 0412 Zur Bildsuche verwendete keywords festlegen 0413 Defined Keywords: 0413 Definierte keywords: 0414 Defog 0414 Entnebeln 0415 Delete 0415 Löschen 0416 Delete Album 0416 Album löschen 0417 Delete Meta 0417 Metadata löschen 0418 Delete Metadata 0418 Metadata löschen 0419 Delete Originals 0419 Originale löschen 0420 Delete an album 0420 Ein Album löschen 0421 Delete or Trash selected image files 0421 Ausgewählte Bilddateien löschen oder in den Papierkorb verschieben 0422 Delete or trash an image file 0422 Eine Bilddatei löschen oder in den Papierkorb verschieben 0423 Delete read-only file? 0423 Schreibgeschützte Datei löschen? 0424 Delete/Trash 0424 Löschen/Papierkorb 0425 Denoise 0425 Entrauschen 0426 Depth 0426 Tiefe 0427 Desc. 0427 Besch. 0428 Description: %s\n 0428 Beschreibung: %s\n 0429 Desktop 0429 Desktop 0430 Dialog Font 0430 Dialogschrift 0431 Diffs 0431 Unterschiede 0432 Directed Blur 0432 Gerichtete Unschärfe 0433 Directed Blur - blur locally in direction of mouse drag 0433 Gerichtete Unschärfe - lokale Unschärfe in Richtung der Mausbewegung 0434 Disable 0434 Deaktivieren 0435 Disable areas for editing 0435 Bereiche für die Bearbeitung deaktivieren 0436 Discard unsaved changes? 0436 Nicht gespeicherte Änderungen verwerfen? 0437 Discard unsaved edits? 0437 Nicht gespeicherte Bearbeitungen verwerfen? 0438 Distort image areas using the mouse 0438 Bildbereiche mit der Maus verzerren 0439 Dither 0439 Dithern 0440 Dither Image 0440 Bild dithern 0441 Dither0 0441 Dither0 0442 Dither1 0442 Dither1 0443 Dither2 0443 Dither2 0444 Dither3 0444 Dither3 0445 Dither4 0445 Dither4 0446 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0446 Bilder grob ausgerichtet ziehen.\nZum Drehen vom unteren Rand aus ziehen. 0447 Drag margin box middle or edges 0447 Randbox-Mitte oder -Kanten ziehen 0448 Drag mouse on image. \nLeft click to cancel. 0448 Maus auf dem Bild ziehen. \nLinksklick zum Abbrechen. 0449 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0449 Maus zum Auswählen ziehen. Löschen. Wiederholen. \nKlick: Auswahl bis zur Maus erweitern. 0450 Drag mouse to set center 0450 Maus ziehen, um Zentrum festzulegen 0451 Drag near an image corner using the mouse 0451 Mit der Maus in der Nähe einer Bildecke ziehen 0452 Drag on image to level image.\nClick on image for level lines. 0452 Auf dem Bild ziehen, um es zu begradigen.\nAuf das Bild klicken für Wasserwaagelinien. 0453 Drag within image using the mouse 0453 Mit der Maus innerhalb des Bildes ziehen 0454 Draw a line across the image in \ndirection of brightness change. 0454 Eine Linie über das Bild in \nRichtung der Helligkeitsänderung ziehen. 0455 Draw box on image 0455 Rechteck auf Bild zeichnen 0456 Draw line or arrow on image 0456 Linie oder Pfeil auf Bild zeichnen 0457 Draw on image: text, line/arrow, box, circle, ellipse 0457 Auf Bild zeichnen: Text, Linie/Pfeil, Rechteck, Kreis, Ellipse 0458 Draw oval on image 0458 Oval auf Bild zeichnen 0459 Draw text on image 0459 Text auf Bild zeichnen 0460 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0460 Doppelte oder verschachtelte Ordner: \n %s \n %s \nBitte entfernen. 0461 Duplicates: 0461 Duplikate: 0462 EDIT ALBUM 0462 ALBUM BEARBEITEN 0463 EDIT ANY META 0463 BELIEBIGE METADATA BEARBEITEN 0464 EDIT BOOKMARKS 0464 LESEZEICHEN BEARBEITEN 0465 EDIT MAIN META 0465 HAUPTMETADATA BEARBEITEN 0466 EDIT MENU 0466 BEARBEITEN-MENÜ 0467 EDIT PROCEDURES 0467 ABLÄUFE BEARBEITEN 0468 EDIT SCRIPT 0468 SKRIPT BEARBEITEN 0469 EDIT WORKFLOW 0469 WORKFLOW BEARBEITEN 0470 EFFECTS MENU 0470 EFFEKTE-MENÜ 0471 EMBOSS 0471 PRÄGUNG 0472 ENABLE/DISABLE AREA 0472 BEREICH AKTIVIEREN/DEAKTIVIEREN 0473 ENGRAVE 0473 GRAVUR 0474 ESCHER SPIRAL 0474 ESCHER-SPIRALE 0475 EXPORT FILES 0475 DATEIEN EXPORTIEREN 0476 Edge 0476 Kante 0477 Edit 0477 Bearbeiten 0478 Edit Any Meta 0478 Beliebige Metadata bearbeiten 0479 Edit Any Metadata 0479 Beliebige metadata bearbeiten 0480 Edit Bookmarks 0480 Lesezeichen bearbeiten 0481 Edit Images 0481 Bilder bearbeiten 0482 Edit Keyboard Shortcuts 0482 Tastenkürzel bearbeiten 0483 Edit Line 0483 Linie bearbeiten 0484 Edit Line/Arrow 0484 Linie/Pfeil bearbeiten 0485 Edit Main Meta 0485 Hauptmetadata bearbeiten 0486 Edit Main Metadata 0486 Hauptmetadata bearbeiten 0487 Edit Menu 0487 Menü bearbeiten 0488 Edit Metadata 0488 Metadata bearbeiten 0489 Edit Plugins 0489 Plugins bearbeiten 0490 Edit Text 0490 Text bearbeiten 0491 Edit any metadata tag 0491 Beliebigen metadata-tag bearbeiten 0492 Edit function can not use Paint Edits 0492 Bearbeitungsfunktion kann Malbearbeitungen nicht verwenden 0493 Edit function must be active 0493 Bearbeitungsfunktion muss aktiv sein 0494 Edit key metadata: keywords/geotags/description/rating ... 0494 Wichtige metadata bearbeiten: keywords/geotags/Beschreibung/Bewertung ... 0495 Edit plugins menu 0495 Plugins-Menü bearbeiten 0496 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0496 Bearbeiten: Zuschneiden, Drehen, Retusche, Skalieren, Markup, Malbearbeitungen, Bereiche kopieren 0497 Effects 0497 Effekte 0498 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0498 Effekte: Cartoon, Skizze, Malerei, Prägung, Dithern, Textur, Farben, benutzerdefinierte Faltung 0499 Emboss 0499 Prägung 0500 Enable 0500 Aktivieren 0501 Enable areas for editing 0501 Bereiche für die Bearbeitung aktivieren 0502 End of gallery 0502 Galerieende 0503 Engrave 0503 Gravur 0504 Enter Keyword 0504 Keyword eingeben 0505 Enter New Keyword 0505 Neues Keyword eingeben 0506 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0506 Linien- oder Pfeileigenschaften im Dialog eingeben, \nauf Bild klicken/ziehen, zum Entfernen rechtsklicken 0507 Enter text, [Add] to layout, edit properties. 0507 Text eingeben, [Hinzufügen] zum Layout, bearbeiten. 0508 Enter text, click/drag on image, right click to remove 0508 Text eingeben, auf Bild klicken/ziehen, zum Entfernen rechtsklicken 0509 Erase 0509 Löschen 0510 Erase existing areas 0510 Vorhandene Bereiche löschen 0511 Escher Spiral 0511 Escher-Spirale 0512 Exceed 50 anchor points 0512 50 Ankerpunkte überschritten 0513 Export Files 0513 Dateien exportieren 0514 Export selected image files to another folder 0514 Ausgewählte Bilddateien in einen anderen Ordner exportieren 0515 FILE MENU 0515 DATEI-MENÜ 0516 FILE SAVE 0516 DATEI SPEICHERN 0517 FILE VIEW 0517 DATEIANSICHT 0518 FIND AREA GAP 0518 BEREICHSLÜCKE FINDEN 0519 FIND BAD FILES 0519 FEHLERHAFTE DATEIEN FINDEN 0520 FIND DUPLICATES 0520 DUPLIKATE FINDEN 0521 FIRST INDEX 0521 ERSTINDIZIERUNG 0522 FIRST STARTUP 0522 ERSTER START 0523 FIX META 0523 METADATA REPARIEREN 0524 FLATTEN HISTOGRAM 0524 HISTOGRAMM ABFLACHEN 0525 FLATTEN PHOTO 0525 FOTO ABFLACHEN 0526 FOLDER TREE 0526 ORDNERBAUM 0527 FOTOCX FOR WINDOWS 11 0527 FOTOCX FÜR WINDOWS 11 0528 FOTOCX LIMITATIONS 0528 FOTOCX-EINSCHRÄNKUNGEN 0529 FOTOCX USAGE 0529 FOTOCX-NUTZUNG 0530 FRINGES 0530 SÄUME 0531 FUSION 0531 FUSION 0532 Fetch 0532 Abrufen 0533 File 0533 Datei 0534 File Mod Date/Time 0534 Datei geändert am/um 0535 File Name 0535 Dateiname 0536 File Name/Number 0536 Dateiname/-nummer 0537 File Name: %s \n 0537 Dateiname: %s \n 0538 File Size (bytes) 0538 Dateigröße (Bytes) 0539 File View 0539 Dateiansicht 0540 File count: 0540 Dateianzahl: 0541 File type cannot be edited 0541 Dateityp kann nicht bearbeitet werden 0542 File1 0542 Datei1 0543 File2 0543 Datei2 0544 File: 0544 Datei: 0545 File: new session, open, rename, copy/move, delete, print 0545 Datei: neue Sitzung, öffnen, umbenennen, kopieren/verschieben, löschen, drucken 0546 Fill selected areas or transparent areas with a color 0546 Ausgewählte oder transparente Bereiche mit einer Farbe füllen 0547 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0547 Ausgewählte Bereiche zur visuellen Überprüfung mit Farbe füllen. \nMethode 1: Linksklick in jedem ausgewählten, noch nicht gefüllten Bereich. \nMethode 2: Rechtsklick AUSSERHALB aller ausgewählten Bereiche. \n[Hilfe]-Taste für Erklärung drücken 0548 Find 0548 Suchen 0549 Find Bad Files 0549 Fehlerhafte Dateien finden 0550 Find Duplicate Images 0550 Doppelte Bilder finden 0551 Find Duplicates 0551 Duplikate finden 0552 Find Gap 0552 Lücke finden 0553 Find a gap in an area outline 0553 Eine Lücke in einer Bereichsumrandung finden 0554 Find all images for a location [date range] 0554 Alle Bilder für einen Ort [Datumsbereich] finden 0555 Find all images for a selected tag name and value 0555 Alle Bilder für einen ausgewählten tag-Namen und -Wert finden 0556 Find images meeting multiple search criteria 0556 Bilder finden, die mehreren Suchkriterien entsprechen 0557 Find optimum factors: 0557 Optimale Faktoren finden: 0558 Finish 0558 Fertigstellen 0559 Finish Area 0559 Bereich fertigstellen 0560 Fix Bad File 0560 Fehlerhafte Datei reparieren 0561 Fix Broken Metadata 0561 Defekte Metadata reparieren 0562 Fix Meta 0562 Metadata reparieren 0563 Fix Motion Blur 0563 Bewegungsunschärfe korrigieren 0564 Fix Perspective 0564 Perspektive korrigieren 0565 Fix color fringes (chromatic aberration) 0565 Farbsäume korrigieren (chromatische Aberration) 0566 Fix perspective for object photographed from an angle 0566 Perspektive für aus einem Winkel fotografiertes Objekt korrigieren 0567 Fix red-eyes from flash photo 0567 Rote Augen durch Blitzlichtfoto korrigieren 0568 Flatten 0568 Abflachen 0569 Flatten Histogram 0569 Histogramm abflachen 0570 Flatten Pano 0570 Panorama abflachen 0571 Flatten Photo 0571 Foto abflachen 0572 Flatten brightness histogram to enhance details 0572 Helligkeitshistogramm abflachen, um Details zu verstärken 0573 Flatten curved surface. 0573 Gekrümmte Oberfläche abflachen. 0574 Flatten photo of a curved image (e.g. poster on round column 0574 Foto einer gekrümmten Fläche abflachen (z. B. Poster auf runder Säule) 0575 Flip 0575 Spiegeln 0576 Folder Tree 0576 Ordnerbaum 0577 Folders 0577 Ordner 0578 Folders for image files (subfolders included automatically) 0578 Ordner für Bilddateien (Unterordner werden automatisch einbezogen) 0579 Font 0579 Schriftart 0580 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0580 Bei zufälliger Bildreihenfolge ist dieser Wert \ndie relative Häufigkeit, mit der das Bild angezeigt wird. \nBasiswert ist 10. 20 --> 2x so oft anzeigen. 0581 Foreground 0581 Vordergrund 0582 Fotocx copyright notice 0582 Fotocx-Copyright-Hinweis 0583 Fotocx home 0583 Fotocx-Startseite 0584 Fotocx privacy policy 0584 Fotocx-Datenschutzrichtlinie 0585 Fotocx video tutorial on YouTube 0585 Fotocx-Video-Tutorial auf YouTube 0586 Fotocx web site (information and downloads) 0586 Fotocx-Website (Informationen und Downloads) 0587 FreeSans 0587 FreeSans 0588 Full List 0588 Vollständige Liste 0589 Full Screen 0589 Vollbild 0590 Fusion 0590 Fusion 0591 GALLERY END 0591 GALERIEENDE 0592 GALLERY FILTER 0592 GALERIEFILTER 0593 GALLERY HOME 0593 GALERIE-START 0594 GALLERY MENU 0594 GALERIE-MENÜ 0595 GALLERY OVERVIEW 0595 GALERIEÜBERSICHT 0596 GALLERY SORT 0596 GALERIESORTIERUNG 0597 GALLERY TO ALBUM 0597 GALERIE ZU ALBUM 0598 GALLERY VIEW 0598 GALERIEANSICHT 0599 GDK pixbuf: cannot save file 0599 GDK pixbuf: Datei kann nicht gespeichert werden 0600 GLOBAL RETINEX 0600 GLOBALER RETINEX 0601 GRID SETTINGS 0601 RASTEREINSTELLUNGEN 0602 Gallery 0602 Galerie 0603 Gallery End 0603 Galerieende 0604 Gallery Filter 0604 Galeriefilter 0605 Gallery Home 0605 Galerie-Start 0606 Gallery Sort 0606 Galeriesortierung 0607 Gallery View 0607 Galerieansicht 0608 Gallery of newest image files 0608 Galerie der neuesten Bilddateien 0609 Gallery of recently viewed image files 0609 Galerie der zuletzt angesehenen Bilddateien 0610 Gallery to Album 0610 Galerie zu Album 0611 Gallery view with thumbnails and basic metadata 0611 Galerieansicht mit thumbnails und grundlegenden metadata 0612 Gallery view with thumbnails and file data 0612 Galerieansicht mit thumbnails und Dateidaten 0613 Gallery: thumbnails, new/recent, sort, select, bookmarks 0613 Galerie: thumbnails, neu/kürzlich, sortieren, auswählen, Lesezeichen 0614 Generate an inward spiraling repeating image 0614 Ein sich nach innen spiralförmig wiederholendes Bild erzeugen 0615 Global Retinex 0615 Globaler Retinex 0616 Gradual 0616 Allmählich 0617 Graduated Blur 0617 Abgestufte Unschärfe 0618 Graduated Blur - blur relative to pixel contrast 0618 Abgestufte Unschärfe - Unschärfe relativ zum Pixelkontrast 0619 Grayscale 0619 Graustufen 0620 Green 0620 Grün 0621 Grid Settings 0621 Rastereinstellungen 0622 Group by country 0622 Nach Land gruppieren 0623 Group by country/date 0623 Nach Land/Datum gruppieren 0624 Group by country/location 0624 Nach Land/Ort gruppieren 0625 Group by country/location/date 0625 Nach Land/Ort/Datum gruppieren 0626 Group by date/country 0626 Nach Datum/Land gruppieren 0627 Group by date/country/location 0627 Nach Datum/Land/Ort gruppieren 0628 HDF 0628 HDF 0629 HDR 0629 HDR 0630 HELP MENU 0630 HILFE-MENÜ 0631 Hard 0631 Hart 0632 Height 0632 Höhe 0633 Height: 0633 Höhe: 0634 Help 0634 Hilfe 0635 Help: user guide, tutorial, change log, licenses, privacy, about 0635 Hilfe: Benutzerhandbuch, Tutorial, Änderungsprotokoll, Lizenzen, Datenschutz, Info 0636 Hide 0636 Ausblenden 0637 Hide selected areas 0637 Ausgewählte Bereiche ausblenden 0638 High 0638 Hoch 0639 High Depth of Field - combine near/far focus images for deeper focus 0639 High Depth of Field - Bilder mit nahem/fernem Fokus für größere Tiefe kombinieren 0640 High Dynamic Range - combine bright/dark images for better detail 0640 High Dynamic Range - helle/dunkle Bilder für bessere Details kombinieren 0641 Highlight darkest and brightest pixels 0641 Dunkelste und hellste Pixel hervorheben 0642 Home Folder 0642 Startordner 0643 Home Page 0643 Startseite 0644 Horz 0644 Horz 0645 How to remove Fotocx application and user files 0645 So entfernen Sie die Fotocx-Anwendung und Benutzerdateien 0646 Hue 0646 Farbton 0647 IMAGE ARRAY 0647 BILDERFELD 0648 INDEX FILES 0648 DATEIEN INDIZIEREN 0649 INSIDE-OUT 0649 INNEN NACH AUSSEN 0650 INVERT AREA 0650 BEREICH UMKEHREN 0651 Icon size 0651 Symbolgröße 0652 Icons 0652 Symbole 0653 Image 0653 Bild 0654 Image Array 0654 Bilderfeld 0655 Image Columns 0655 Bildspalten 0656 Image Differences 0656 Bildunterschiede 0657 Image File 0657 Bilddatei 0658 Image File: 0658 Bilddatei: 0659 Image Keywords 0659 Bild-keywords 0660 Image Locations 0660 Bildorte 0661 Image Markup 0661 Bild-Markup 0662 Image Position 0662 Bildposition 0663 Image Preferences 0663 Bildeinstellungen 0664 Image Ratios 0664 Bildverhältnisse 0665 Image Size (pixels) 0665 Bildgröße (Pixel) 0666 Image Time 0666 Bildzeit 0667 Image Timeline 0667 Bildzeitleiste 0668 Image colors are converted for printing. 0668 Die Bildfarben werden für den Druck umgewandelt. 0669 Image dimensions have changed \nCopy Prior Edit cannot be used 0669 Bildabmessungen haben sich geändert \n"Vorherige Bearbeitung kopieren" kann nicht verwendet werden 0670 Image dimensions have changed, \nArea Blend cannot be used 0670 Bildabmessungen haben sich geändert, \n"Bereich überblenden" kann nicht verwendet werden 0671 Image dimensions have changed, \nthis prior image cannot be used 0671 Bildabmessungen haben sich geändert, \ndieses vorherige Bild kann nicht verwendet werden 0672 Image is fixed, unmovable 0672 Bild ist fixiert, nicht verschiebbar 0673 Images sizes are not compatible 0673 Bildgrößen sind nicht kompatibel 0674 Include: 0674 Einschließen: 0675 Index Files 0675 Dateien indizieren 0676 Index Level 0676 Indexebene 0677 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0677 Indizierungsfunktion beendet. \nIndizierung ist für Such- und Kartenfunktionen erforderlich \nund damit thumbnail-Galerieseiten schnell angezeigt werden. 0678 Index new image files and make thumbnails 0678 Neue Bilddateien indizieren und thumbnails erstellen 0679 Input color to match and adjust: 0679 Abzugleichende und anzupassende Eingabefarbe: 0680 Inside-out 0680 Innen nach außen 0681 Install following programs using your package manager: \n 0681 Folgende Programme mit dem Paketmanager installieren: \n 0682 Intensity 0682 Intensität 0683 Invert 0683 Umkehren 0684 Invert selected areas (selected ↔ not selected) 0684 Ausgewählte Bereiche umkehren (ausgewählt ↔ nicht ausgewählt) 0685 Irregular Tiles 0685 Unregelmäßige Kacheln 0686 Iterations 0686 Wiederholungen 0687 JPEG ARTIFACTS 0687 JPEG-ARTEFAKTE 0688 JPEG Artifacts 0688 JPEG-Artefakte 0689 JPEG files 0689 JPEG-Dateien 0690 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0690 Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez 0691 Jump to gallery beginning [home] 0691 Zum Galerieanfang springen [Pos1] 0692 Jump to gallery end [end] 0692 Zum Galerieende springen [Ende] 0693 KEYBOARD ESCAPE KEY 0693 TASTATUR-ESCAPE-TASTE 0694 KEYBOARD SHORTCUTS 0694 TASTENKÜRZEL 0695 KEYWORDS OVERVIEW 0695 KEYWORDS-ÜBERSICHT 0696 Keep 0696 Behalten 0697 Kernel size 0697 Kernelgröße 0698 Keyboard Shortcuts 0698 Tastenkürzel 0699 Keywords Category 0699 keywords-Kategorie 0700 Kill active dialog? 0700 Aktiven Dialog beenden? 0701 Kill busy function? 0701 Beschäftigte Funktion beenden? 0702 Kuwahara 0702 Kuwahara 0703 Kuwahara Depth 0703 Kuwahara-Tiefe 0704 LINE COLOR 0704 LINIENFARBE 0705 LOAD/SAVE AREA 0705 BEREICH LADEN/SPEICHERN 0706 LOCAL CONTRAST 0706 LOKALER KONTRAST 0707 LOCAL RETINEX 0707 LOKALER RETINEX 0708 Language 0708 Sprache 0709 Layout and background image 0709 Layout und Hintergrundbild 0710 Left 0710 Links 0711 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0711 Mit gedrückter linker Maustaste innerhalb des Bereichs ziehen, \num Bereichsbearbeitungen schrittweise rückgängig zu machen. \nMit rechter Maustaste ziehen, um Bearbeitungen wiederherzustellen. \nEntlang der Bereichskante ziehen, um die Kante zu überblenden. 0712 Left/right click: previous/next image (also arrow keys) 0712 Links-/Rechtsklick: vorheriges/nächstes Bild (auch Pfeiltasten) 0713 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0713 Links-/Rechtsklick: einen Bearbeitungsschritt rückgängig machen/wiederholen \nMittelklick: zurück zum ausgewählten Bearbeitungsschritt 0714 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0714 Links-/Rechtsklick: Bild/thumbnail vergrößern/verkleinern (auch +/- Tasten) 0715 Length 0715 Länge 0716 Level 0716 Niveau 0717 Licenses 0717 Lizenzen 0718 Light Source 0718 Lichtquelle 0719 Lightness 0719 Helligkeit 0720 Limit 0720 Grenze 0721 Line Color 0721 Linienfarbe 0722 Line Threshold 0722 Linienschwellenwert 0723 Line Width 0723 Linienbreite 0724 Line length 0724 Linienlänge 0725 List Fotocx command line parameters 0725 Fotocx-Befehlszeilenparameter auflisten 0726 List all metadata for current image or clicked thumbnail 0726 Alle metadata für aktuelles Bild oder angeklicktes thumbnail auflisten 0727 List outboard programs and functions 0727 Externe Programme und Funktionen auflisten 0728 Load 0728 Laden 0729 Load settings from file 0729 Einstellungen aus Datei laden 0730 Local Contrast 0730 Lokaler Kontrast 0731 Local Retinex 0731 Lokaler Retinex 0732 Location 0732 Ort 0733 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0733 Ort und Land ersetzen die aktuellen Werte.\nGPS-Daten werden nur ersetzt, wenn ein neuer Wert vorhanden ist. 0734 Lock 0734 Sperren 0735 Low Amplify 0735 Geringe Verstärkung 0736 MAGNIFY IMAGE 0736 BILD VERGRÖSSERN 0737 MAKE WAVES 0737 WELLEN ERZEUGEN 0738 MANAGE KEYWORDS 0738 KEYWORDS VERWALTEN 0739 MAP MENU 0739 KARTE-MENÜ 0740 MAP VIEW 0740 KARTENANSICHT 0741 MARGINS 0741 RÄNDER 0742 MARKUP 0742 MARKUP 0743 MASHUP 0743 MASHUP 0744 MATCH COLORS 0744 FARBEN ABGLEICHEN 0745 MEASURE IMAGE 0745 BILD MESSEN 0746 MENU SHORTCUTS 0746 MENÜ-TASTENKÜRZEL 0747 METADATA MENU 0747 METADATA-MENÜ 0748 METADATA TAGS 0748 METADATA-TAGS 0749 METADATA VIEW 0749 METADATA-ANSICHT 0750 MONITOR COLOR 0750 MONITORFARBE 0751 MOSAIC 0751 MOSAIK 0752 MOUSE ALT-RIGHT-BUTTON 0752 MAUS ALT-RECHTE-TASTE 0753 MOUSE FUNCTIONS 0753 MAUSFUNKTIONEN 0754 MOUSE OWNERSHIP 0754 MAUS-BESITZ 0755 MOVE FOTOCX HOME 0755 FOTOCX-STARTORDNER VERSCHIEBEN 0756 Magnify 0756 Vergrößern 0757 Magnify Image 0757 Bild vergrößern 0758 Magnify image around the mouse position 0758 Bild um die Mausposition herum vergrößern 0759 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0759 Der Arbeitsspeicher ist zu klein, um Fotocx auszuführen. \nSie können es trotzdem versuchen, wenn Sie möchten. \n Fortfahren? 0760 Make Layout Image 0760 Layout-Bild erstellen 0761 Make Square Tiles 0761 Quadratische Kacheln erstellen 0762 Make Waves 0762 Wellen erzeugen 0763 Make a spherical projection of an image 0763 Eine sphärische Projektion eines Bildes erstellen 0764 Make black margins transparent 0764 Schwarze Ränder transparent machen 0765 Make new versions 0765 Neue Versionen erstellen 0766 Make width constant for window size 0766 Breite an Fenstergröße anpassen 0767 Manage Keywords 0767 keywords verwalten 0768 Map 0768 Karte 0769 Map View 0769 Kartenansicht 0770 Maps 0770 Karten 0771 Maps: view images by map location 0771 Karten: Bilder nach Kartenort anzeigen 0772 Margin 0772 Rand 0773 Margins 0773 Ränder 0774 Markup 0774 Markup 0775 Mashup 0775 Mashup 0776 Mass update album files 0776 Albumdateien sammelweise aktualisieren 0777 Match Brightness 0777 Helligkeit abgleichen 0778 Match Colors 0778 Farben abgleichen 0779 Match Level 0779 Abgleichniveau 0780 Match Limit 0780 Abgleichgrenze 0781 Match image colors to colors of another image 0781 Bildfarben mit Farben eines anderen Bildes abgleichen 0782 Match using: 0782 Abgleich verwenden: 0783 Matching Keywords 0783 Übereinstimmende keywords 0784 Max 0784 Max. 0785 Max. Width 0785 Max. Breite 0786 Measure Image 0786 Bild messen 0787 Measure Noise 0787 Rauschen messen 0788 Measure pixel distances within an image 0788 Pixelabstände innerhalb eines Bildes messen 0789 Menu Colors 0789 Menüfarben 0790 Menu Style 0790 Menüstil 0791 Metadata 0791 Metadata 0792 Metadata Tags 0792 Metadata-Tags 0793 Metadata View 0793 Metadata-Ansicht 0794 Metadata from Search Function 0794 Metadata aus Suchfunktion 0795 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0795 Methode 1:\nLinksklick auf rote Augen zum Abdunkeln.\nMethode 2:\nNach unten rechts ziehen, um rote Augen zu umschließen.\nLinksklick auf rote Augen zum Abdunkeln.\nRote Augen rückgängig machen:\nRechtsklick auf rote Augen. 0796 Mirror: 0796 Spiegeln: 0797 Mode: 0797 Modus: 0798 Monitor Color 0798 Monitorfarbe 0799 Mosaic 0799 Mosaik 0800 Mouse Radius 0800 Mausradius 0801 Mouse Warp (drag image) 0801 Mausverzerrung (Bild ziehen) 0802 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0802 Maus ziehen: Bild um 360° schwenken \nL/R-Mausklick: vergrößern/verkleinern \nEsc: Panoramaansicht beenden 0803 Move %d image files 0803 %d Bilddateien verschieben 0804 Move Fotocx Home 0804 Fotocx-Startordner verschieben 0805 Move Fotocx Home Folder 0805 Fotocx-Startordner verschieben 0806 Move Fotocx home folder to chosen folder 0806 Fotocx-Startordner in gewählten Ordner verschieben 0807 Move mouse in a monotone image area. 0807 Maus in einem einfarbigen Bildbereich bewegen. 0808 Multiplier 0808 Multiplikator 0809 NEW SESSION 0809 NEUE SITZUNG 0810 NEWEST FILES 0810 NEUESTE DATEIEN 0811 NEWLINE CHARACTERS IN METADATA 0811 NEUE-ZEILE-ZEICHEN IN METADATA 0812 NON-STANDARD DIALOG WIDGETS 0812 NICHT-STANDARD-DIALOGELEMENTE 0813 New Area 0813 Neuer Bereich 0814 New File Name: 0814 Neuer Dateiname: 0815 New Location 0815 Neuer Ort 0816 New Location: 0816 Neuer Ort: 0817 New Name 0817 Neuer Name 0818 New Session 0818 Neue Sitzung 0819 New Type: 0819 Neuer Typ: 0820 New Version 0820 Neue Version 0821 Newest 0821 Neueste 0822 Newest Files 0822 Neueste Dateien 0823 Next 0823 Weiter 0824 Next gallery 0824 Nächste Galerie 0825 No 0825 Nein 0826 No curve lines found 0826 Keine Kurvenlinien gefunden 0827 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0827 Es wurde kein Bilddateiindex gefunden.\nEin Bilddateiindex wird erstellt.\nIhre Bilddateien werden nicht verändert.\nDies kann einige Zeit dauern, wenn Sie \nviele tausend Bilddateien haben. 0828 No images found 0828 Keine Bilder gefunden 0829 Noise Reduction 0829 Rauschunterdrückung 0830 Noise Size 0830 Rauschgröße 0831 None 0831 Keine 0832 Normal Blur 0832 Normale Unschärfe 0833 Normal Blur - mix pixels with all neighbor pixels 0833 Normale Unschärfe - Pixel mit allen Nachbarpixeln mischen 0834 OPEN IMAGE FILE 0834 BILDDATEI ÖFFNEN 0835 OTHER TOPICS 0835 WEITERE THEMEN 0836 OUTLINES 0836 UMRISSE 0837 Old Name 0837 Alter Name 0838 One Tag: 0838 Ein tag: 0839 Opacity 0839 Deckkraft 0840 Open 0840 Öffnen 0841 Open Image File 0841 Bilddatei öffnen 0842 Open a file and paste as selected area into an image 0842 Eine Datei öffnen und als ausgewählten Bereich in ein Bild einfügen 0843 Open a parallel Fotocx session 0843 Eine parallele Fotocx-Sitzung öffnen 0844 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0844 Die gescannte Farbtabellendatei öffnen und bearbeiten. \nJegliche Schräglage oder Drehung durch das Scannen entfernen. \n(Dafür die Funktion "Perspektive korrigieren" verwenden). \nDen dünnen grünen Rand GENAU abschneiden. \nDie Farbtabellendatei speichern (ersetzen). 0845 Open the trimmed color chart file 0845 Die zugeschnittene Farbtabellendatei öffnen 0846 Optimize 0846 Optimieren 0847 Other Tag ... 0847 Anderer tag ... 0848 Outboard Programs 0848 Externe Programme 0849 Outline Drawing 0849 Umrisszeichnung 0850 Outlines 0850 Umrisse 0851 Output Color 0851 Ausgabefarbe 0852 Overlap 0852 Überlappung 0853 Overlay position in host image: 0853 Overlay-Position im Basisbild: 0854 Overlay width, % host image width: 0854 Overlay-Breite, % der Basisbildbreite: 0855 Overwrite file? \n%s 0855 Datei überschreiben? \n%s 0856 PAINT EDITS 0856 MALBEARBEITUNGEN 0857 PAINT IMAGE 0857 BILD BEMALEN 0858 PAINT TRANSPARENCY 0858 TRANSPARENZ MALEN 0859 PAINTING 0859 MALEREI 0860 PANORAMA 0860 PANORAMA 0861 PATTERN 0861 MUSTER 0862 PERSPECTIVE 0862 PERSPEKTIVE 0863 PLACES/DATES 0863 ORTE/DATEN 0864 PLUGINS 0864 PLUGINS 0865 PREV/NEXT 0865 VORHERIGE/NÄCHSTE 0866 PRINT CALIBRATED 0866 KALIBRIERT DRUCKEN 0867 PRINT IMAGE 0867 BILD DRUCKEN 0868 PRIVACY 0868 DATENSCHUTZ 0869 PROBLEM FILES 0869 PROBLEMDATEIEN 0870 PROBLEM REPORTING 0870 PROBLEMMELDUNG 0871 Paint Edits 0871 Malbearbeitungen 0872 Paint Edits already active 0872 Malbearbeitungen bereits aktiv 0873 Paint Image 0873 Bild bemalen 0874 Paint Image Transparencies 0874 Bildtransparenzen bemalen 0875 Paint Radius 0875 Malradius 0876 Paint Transparency 0876 Transparenz malen 0877 Paint and Warp Image 0877 Bild bemalen und verzerren 0878 Paint current edit function gradually using the mouse 0878 Aktuelle Bearbeitungsfunktion schrittweise mit der Maus malen 0879 Paint entire image 0879 Gesamtes Bild bemalen 0880 Paint image transparency using the mouse 0880 Bildtransparenz mit der Maus bemalen 0881 Paint on Image 0881 Auf Bild malen 0882 Paint on image using the mouse 0882 Mit der Maus auf Bild malen 0883 Paint transparency 0883 Transparenz malen 0884 Paint within mouse 0884 Innerhalb des Mauszeigers malen 0885 Painting 0885 Malerei 0886 Panorama 0886 Panorama 0887 Paste 0887 Einfügen 0888 Paste Image 0888 Bild einfügen 0889 Paste previously copied area into image 0889 Zuvor kopierten Bereich in Bild einfügen 0890 Pattern 0890 Muster 0891 Pattern File: 0891 Musterdatei: 0892 Pattern Width 0892 Musterbreite 0893 Percent 0893 Prozent 0894 Permissions 0894 Berechtigungen 0895 Perspective 0895 Perspektive 0896 Photo Date 0896 Aufnahmedatum 0897 Photo Date/Time 0897 Aufnahmedatum/-zeit 0898 Photo Date/Time (metadata) 0898 Aufnahmedatum/-zeit (metadata) 0899 Photo Date: %s File Date: %s \n 0899 Aufnahmedatum: %s Dateidatum: %s \n 0900 Pixel count 0900 Pixelanzahl 0901 Pixel difference 0901 Pixeldifferenz 0902 Pixels 0902 Pixel 0903 Places/Dates 0903 Orte/Daten 0904 Plugin working ... 0904 Plugin arbeitet ... 0905 Popup Image 0905 Popup-Bild 0906 Power 0906 Leistung 0907 Power Center 0907 Leistungszentrum 0908 Power: Center 0908 Leistung: Zentrum 0909 Pre-align Images 0909 Bilder vorausrichten 0910 Preference: 0910 Einstellung: 0911 Press F1 for help 0911 F1 für Hilfe drücken 0912 Prev 0912 Vorher 0913 Prev/Next 0913 Vorherige/Nächste 0914 Previous 0914 Vorherige 0915 Previous gallery 0915 Vorherige Galerie 0916 Print Calibrated 0916 Kalibriert drucken 0917 Print Image 0917 Bild drucken 0918 Print chart in vertical orientation without margins. 0918 Tabelle in vertikaler Ausrichtung ohne Ränder drucken. 0919 Print current image file with calibrated colors 0919 Aktuelle Bilddatei mit kalibrierten Farben drucken 0920 Print the current image file 0920 Die aktuelle Bilddatei drucken 0921 Privacy 0921 Datenschutz 0922 Proceed 0922 Fortfahren 0923 Proceed? 0923 Fortfahren? 0924 Process album files matching selected files: 0924 Albumdateien verarbeiten, die den ausgewählten Dateien entsprechen: 0925 Process an image using a custom convolution kernel 0925 Ein Bild mit einem benutzerdefinierten Faltungskernel verarbeiten 0926 Process selected album files: 0926 Ausgewählte Albumdateien verarbeiten: 0927 Processing files 0927 Dateien werden verarbeitet 0928 Project name 0928 Projektname 0929 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0929 Eine Bildposition mit der Maus ziehen. \nMehrmals mit der Maus ziehen, bis das Ergebnis passt. \nWenn fertig, [OK] drücken. 0930 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0930 An einer Bildecke mit der Maus ziehen. \nMehrmals mit der Maus ziehen, bis das Ergebnis passt. \nWenn fertig, [OK] drücken. 0931 Pull on the image with the mouse. 0931 Mit der Maus am Bild ziehen. 0932 Purge unwanted keywords from all image files 0932 Unerwünschte keywords aus allen Bilddateien entfernen 0933 QUESTIONS, SUGGESTIONS 0933 FRAGEN, VORSCHLÄGE 0934 Quit 0934 Beenden 0935 Quit Fotocx 0935 Fotocx beenden 0936 Quit Fotocx? 0936 Fotocx beenden? 0937 RAW Files 0937 RAW-Dateien 0938 RAW Options 0938 RAW-Optionen 0939 RAW conversion failed: %s %s 0939 RAW-Konvertierung fehlgeschlagen: %s %s 0940 RAW loader 0940 RAW-Lader 0941 RECENT FILES 0941 LETZTE DATEIEN 0942 RECENT FOLDERS 0942 LETZTE ORDNER 0943 RED EYES 0943 ROTE AUGEN 0944 REFINE MENU 0944 VERFEINERUNG-MENÜ 0945 REMOVE DUST 0945 STAUB ENTFERNEN 0946 REMOVE HALO 0946 HALO ENTFERNEN 0947 RENAME 0947 UMBENENNEN 0948 RENAME ALBUM 0948 ALBUM UMBENENNEN 0949 REPAIR MENU 0949 REPARATUR-MENÜ 0950 RESCALE 0950 SKALIEREN 0951 RETOUCH 0951 RETUSCHE 0952 RGB -> BRG 0952 RGB -> BRG 0953 RGB -> GBR 0953 RGB -> GBR 0954 RGB HISTOGRAM 0954 RGB-HISTOGRAMM 0955 RGB Histogram 0955 RGB-Histogramm 0956 RGB brightness histogram graph 0956 RGB-Helligkeitshistogrammdiagramm 0957 RGB color 0957 RGB-Farbe 0958 RGB mix with given bit-depth 0958 RGB-Mischung mit gegebener Bit-Tiefe 0959 ROTATE 0959 DREHEN 0960 RUN SCRIPT 0960 SKRIPT AUSFÜHREN 0961 Radial Blur 0961 Radiale Unschärfe 0962 Radial Blur - mix pixels in radial lines from chosen center 0962 Radiale Unschärfe - Pixel in radialen Linien vom gewählten Zentrum aus mischen 0963 Radius 0963 Radius 0964 Random Image 0964 Zufälliges Bild 0965 Range 0965 Bereich 0966 Rating: 0966 Bewertung: 0967 Rating: %s Size: %s %.2fmb \n 0967 Bewertung: %s Größe: %s %.2fmb \n 0968 Read or search the user guide 0968 Benutzerhandbuch lesen oder durchsuchen 0969 Recent Files 0969 Letzte Dateien 0970 Recent Folders 0970 Letzte Ordner 0971 Recent Keywords 0971 Letzte keywords 0972 Rectify closeup face photo (balloon face) 0972 Nahaufnahme-Gesichtsfoto korrigieren (Ballon-Gesicht) 0973 Red 0973 Rot 0974 Red Eye Reduction 0974 Rote-Augen-Reduzierung 0975 Red Eyes 0975 Rote Augen 0976 Red Factors 0976 Rot-Faktoren 0977 Redo 0977 Wiederholen 0978 Reduce Fog/Haze 0978 Dunst/Nebel reduzieren 0979 Reduce fog/haze in an image or selected areas 0979 Dunst/Nebel in einem Bild oder ausgewählten Bereichen reduzieren 0980 Refine 0980 Verfeinern 0981 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0981 Verfeinern: Histogramm abflachen, lokaler Kontrast, Kontrast verstärken, Retinex, Sättigung 0982 Remove 0982 Entfernen 0983 Remove Dust 0983 Staub entfernen 0984 Remove Halo 0984 Halo entfernen 0985 Remove dust spots from old scanned photos 0985 Staubflecken von alten gescannten Fotos entfernen 0986 Remove from Album 0986 Aus Album entfernen 0987 Remove halos left by some edit functions 0987 Von manchen Bearbeitungsfunktionen verursachte Halos entfernen 0988 Remove image curvature, especially in panoramas 0988 Bildkrümmung entfernen, besonders bei Panoramen 0989 Remove jaggies on hard image feature edges 0989 Treppcheneffekte an harten Bildkanten entfernen 0990 Remove selected image metadata 0990 Ausgewählte Bild-metadata entfernen 0991 Remove unwanted objects in an image 0991 Unerwünschte Objekte in einem Bild entfernen 0992 Rename 0992 Umbenennen 0993 Rename Album 0993 Album umbenennen 0994 Rename Image File 0994 Bilddatei umbenennen 0995 Rename an existing album 0995 Ein vorhandenes Album umbenennen 0996 Rename or delete keywords for all image files 0996 keywords für alle Bilddateien umbenennen oder löschen 0997 Rename to 0997 Umbenennen in 0998 Rename/convert/rescale/move selected image or RAW files 0998 Ausgewählte Bild- oder RAW-Dateien umbenennen/konvertieren/skalieren/verschieben 0999 Repair 0999 Reparieren 1000 Repair malformed metadata preventing metadata edits 1000 Fehlerhafte metadata reparieren, die Bearbeitungen verhindern 1001 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 1001 Reparieren: schärfen, weichzeichnen, entrauschen, entnebeln, rote Augen, intelligentes Löschen, Farbe anpassen 1002 Replace 1002 Ersetzen 1003 Replace Text 1003 Text ersetzen 1004 Replace all versions with newest version 1004 Alle Versionen durch neueste Version ersetzen 1005 Replace all versions with selected versions 1005 Alle Versionen durch ausgewählte Versionen ersetzen 1006 Replace all with newest version only 1006 Alles nur durch neueste Version ersetzen 1007 Replace all with original + newest version 1007 Alles durch Original + neueste Version ersetzen 1008 Replace all with original + selected versions 1008 Alles durch Original + ausgewählte Versionen ersetzen 1009 Replace all with original and all versions 1009 Alles durch Original und alle Versionen ersetzen 1010 Replace all with selected versions 1010 Alles durch ausgewählte Versionen ersetzen 1011 Replace host files 1011 Basisdateien ersetzen 1012 Report Image Places/Dates 1012 Bildorte/-daten berichten 1013 Report selected metadata for selected image files 1013 Ausgewählte metadata für ausgewählte Bilddateien berichten 1014 Required programs are installed. \n 1014 Erforderliche Programme sind installiert. \n 1015 Rescale 1015 Skalieren 1016 Rescale Image 1016 Bild skalieren 1017 Rescale RGB levels to reduce color caste and fog/haze 1017 RGB-Werte neu skalieren, um Farbstich und Dunst/Nebel zu reduzieren 1018 Rescale brightness levels to increase local contrast 1018 Helligkeitswerte neu skalieren, um lokalen Kontrast zu erhöhen 1019 Rescale: 1019 Skalieren: 1020 Reserved Shortcuts \n 1020 Reservierte Tastenkürzel \n 1021 Reserved shortcut ignored: %s 1021 Reserviertes Tastenkürzel ignoriert: %s 1022 Reset 1022 Zurücksetzen 1023 Reset all galleries to file name ascending 1023 Alle Galerien auf aufsteigende Dateinamen zurücksetzen 1024 Resolution 1024 Auflösung 1025 Resources 1025 Ressourcen 1026 Resume 1026 Fortsetzen 1027 Retouch 1027 Retusche 1028 Reverse R 1028 R umkehren 1029 Richardson-Lucy 1029 Richardson-Lucy 1030 Right 1030 Rechts 1031 Rim % 1031 Rand % 1032 Rotate 1032 Drehen 1033 Rotate Image 1033 Bild drehen 1034 Rotate or level an image 1034 Bild drehen oder begradigen 1035 Rotate: 1035 Drehen: 1036 Roy Lichtenstein effect 1036 Roy-Lichtenstein-Effekt 1037 SATURATION 1037 SÄTTIGUNG 1038 SCRIPT FILES 1038 SKRIPTDATEIEN 1039 SEARCH IMAGES 1039 BILDER SUCHEN 1040 SELECT AREA 1040 BEREICH AUSWÄHLEN 1041 SELECT FILES 1041 DATEIEN AUSWÄHLEN 1042 SELECT IMAGE FILES 1042 BILDDATEIEN AUSWÄHLEN 1043 SELECT MENU 1043 AUSWAHL-MENÜ 1044 SET COLORS 1044 FARBEN FESTLEGEN 1045 SET WALLPAPER 1045 HINTERGRUNDBILD FESTLEGEN 1046 SETTINGS 1046 EINSTELLUNGEN 1047 SHARPEN 1047 SCHÄRFEN 1048 SHIFT COLORS 1048 FARBEN VERSCHIEBEN 1049 SHORTCUTS 1049 TASTENKÜRZEL 1050 SHOW CIM FILES 1050 CIM-DATEIEN ANZEIGEN 1051 SHOW DIFFS 1051 UNTERSCHIEDE ANZEIGEN 1052 SHOW ON MAP 1052 AUF KARTE ANZEIGEN 1053 SHOW RESOURCES 1053 RESSOURCEN ANZEIGEN 1054 SHOW RGB 1054 RGB ANZEIGEN 1055 SHOW/HIDE AREA 1055 BEREICH ANZEIGEN/AUSBLENDEN 1056 SKETCH1 1056 SKIZZE1 1057 SKETCH2 1057 SKIZZE2 1058 SLIDE SHOW 1058 DIASHOW 1059 SLIDES AND NEGATIVES 1059 DIAS UND NEGATIVE 1060 SLIDESHOW END 1060 DIASHOW-ENDE 1061 SMART ERASE 1061 INTELLIGENTES LÖSCHEN 1062 SOFT FOCUS 1062 WEICHZEICHNUNG 1063 SPHERE 1063 KUGEL 1064 SPLIT-SCREEN 1064 GETEILTER BILDSCHIRM 1065 STACK/LAYERS 1065 STAPEL/EBENEN 1066 STACK/NOISE 1066 STAPEL/RAUSCHEN 1067 STACK/PAINT 1067 STAPEL/MALEN 1068 Saturation 1068 Sättigung 1069 Save 1069 Speichern 1070 Save Gallery as Album 1070 Galerie als Album speichern 1071 Save Image File 1071 Bilddatei speichern 1072 Save as new file name or type 1072 Als neuer Dateiname oder Typ speichern 1073 Save current gallery as album 1073 Aktuelle Galerie als Album speichern 1074 Save modified image as new file or new file version 1074 Geändertes Bild als neue Datei oder neue Dateiversion speichern 1075 Save selected area to a file with transparency 1075 Ausgewählten Bereich mit Transparenz in eine Datei speichern 1076 Saved Areas 1076 Gespeicherte Bereiche 1077 Scale 1077 Skalierung 1078 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1078 Die gedruckte Farbtabelle scannen, dunkelste Reihe oben. \nAls .png-Datei mit Drucker- und Papiernamen speichern \n(z. B. %s/Epson_glossy.png). \n 1079 Search 1079 Suchen 1080 Search Images 1080 Bilder suchen 1081 Search Results 1081 Suchergebnisse 1082 Search all image files and report duplicates 1082 Alle Bilddateien durchsuchen und Duplikate melden 1083 Searching - use ESC key to terminate 1083 Suche läuft - mit ESC-Taste beenden 1084 Seconds 1084 Sekunden 1085 Select 1085 Auswählen 1086 Select %d to %d files 1086 %d bis %d Dateien auswählen 1087 Select Album 1087 Album auswählen 1088 Select Albums 1088 Alben auswählen 1089 Select Area 1089 Bereich auswählen 1090 Select Area for Edits 1090 Bereich für Bearbeitungen auswählen 1091 Select Area not supported \nby this edit function 1091 Bereich auswählen wird von dieser \nBearbeitungsfunktion nicht unterstützt 1092 Select Files 1092 Dateien auswählen 1093 Select Image 1093 Bild auswählen 1094 Select Image Files 1094 Bilddateien auswählen 1095 Select Metadata tags 1095 Metadata-tags auswählen 1096 Select Script 1096 Skript auswählen 1097 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1097 Einen mit der Funktion "Bereich auswählen" ausgewählten Bereich verzerren. \n[Verzerrung starten] drücken und den Bereich mit der Maus ziehen. \nMehrmals mit der Maus ziehen, bis das Ergebnis passt. \nWenn fertig, einen weiteren Bereich auswählen oder [OK] drücken. 1098 Select and Paint Image 1098 Bild auswählen und bemalen 1099 Select and view an image file 1099 Eine Bilddatei auswählen und ansehen 1100 Select area cannot be kept.\nContinue? 1100 Bereich auswählen kann nicht beibehalten werden.\nFortfahren? 1101 Select area disabled, Continue? 1101 Bereich auswählen deaktiviert, fortfahren? 1102 Select area not finished, Continue? 1102 Bereich auswählen nicht abgeschlossen, fortfahren? 1103 Select area will be ignored. \nContinue? 1103 Bereich auswählen wird ignoriert. \nFortfahren? 1104 Select folder 1104 Ordner auswählen 1105 Select host image files 1105 Basis-Bilddateien auswählen 1106 Select image areas to edit separately, copy/paste selections 1106 Bildbereiche zum separaten Bearbeiten auswählen, Auswahlen kopieren/einfügen 1107 Select image objects or areas for separate editing 1107 Bildobjekte oder -bereiche zur separaten Bearbeitung auswählen 1108 Select input files for subsequent function 1108 Eingabedateien für die nachfolgende Funktion auswählen 1109 Select overlay file 1109 Overlay-Datei auswählen 1110 Select startup album 1110 Start-Album auswählen 1111 Select startup folder 1111 Startordner auswählen 1112 Select startup image file 1112 Start-Bilddatei auswählen 1113 Select the image file to print. 1113 Die zu druckende Bilddatei auswählen. 1114 Select to add, click on X to delete. 1114 Zum Hinzufügen auswählen, auf X klicken zum Löschen. 1115 Select two files 1115 Zwei Dateien auswählen 1116 Select versions, ratings, keywords, filename text 1116 Versionen, Bewertungen, keywords, Dateinamentext auswählen 1117 Separation Horz 1117 Trennung Horz 1118 Sequence Numbers 1118 Sequenznummern 1119 Set Colors 1119 Farben festlegen 1120 Set No. of Colors 1120 Anzahl der Farben festlegen 1121 Set Ratio: 1121 Verhältnis festlegen: 1122 Set Wallpaper 1122 Hintergrundbild festlegen 1123 Set Width: 1123 Breite festlegen: 1124 Set and view bookmarks, select for gallery view 1124 Lesezeichen festlegen und anzeigen, für Galerieansicht auswählen 1125 Set black-white/color, negative/positive, sepia 1125 Schwarz-Weiß/Farbe, Negativ/Positiv, Sepia festlegen 1126 Set foreground line color (crop, grid, select, warp) 1126 Vordergrund-Linienfarbe festlegen (Zuschneiden, Raster, Auswahl, Verzerrung) 1127 Set gallery from latest search results 1127 Anzahl horizontaler/vertikaler Rasterlinien festlegen 1128 Set gallery from recent folders list 1128 Galerie aus neuesten Suchergebnissen festlegen 1129 Set gallery to folder of current file 1129 Galerie aus Liste der letzten Ordner festlegen 1130 Set horizontal/vertical grid line counts 1130 Galerie auf Ordner der aktuellen Datei festlegen 1131 Set image file as desktop wallpaper 1131 Bilddatei als Desktop-Hintergrundbild festlegen 1132 Set line properties, [Add] to layout, edit. 1132 Linieneigenschaften festlegen, [Hinzufügen] zum Layout, bearbeiten. 1133 Set number of colors for each R/G/B or total 1133 Anzahl der Farben für jeden R/G/B-Kanal oder insgesamt festlegen 1134 Set or shift photo date/time for selected image files 1134 Aufnahmedatum/-zeit für ausgewählte Bilddateien festlegen oder verschieben 1135 Set the name for the output calibration file \n[your calibration name].dat 1135 Den Namen für die Ausgabe-Kalibrierungsdatei festlegen \n[Ihr Kalibrierungsname].dat 1136 Settings 1136 Einstellungen 1137 Sharpen 1137 Schärfen 1138 Sharpen the image (various methods) 1138 Bild schärfen (verschiedene Methoden) 1139 Shift + drag mouse across image \nto indicate blur direction 1139 Umschalt + Maus über das Bild ziehen \num die Unschärferichtung anzugeben 1140 Shift Colors 1140 Farben verschieben 1141 Shift/convert image colors into other colors 1141 Bildfarben in andere Farben verschieben/umwandeln 1142 Short List 1142 Kurze Liste 1143 Show 1143 Anzeigen 1144 Show (outline) selected areas 1144 Ausgewählte Bereiche anzeigen (Umriss) 1145 Show CIM Files 1145 CIM-Dateien anzeigen 1146 Show Diffs 1146 Unterschiede anzeigen 1147 Show Fotocx installed version and author contact 1147 Installierte Fotocx-Version und Autorenkontakt anzeigen 1148 Show Fotocx updates for recent releases 1148 Fotocx-Updates für aktuelle Versionen anzeigen 1149 Show Hidden 1149 Versteckte anzeigen 1150 Show Log File 1150 Protokolldatei anzeigen 1151 Show RGB 1151 RGB anzeigen 1152 Show RGB levels at mouse position 1152 RGB-Werte an der Mausposition anzeigen 1153 Show Resources 1153 Ressourcen anzeigen 1154 Show folder hierarchy, click folder for gallery view 1154 Ordnerhierarchie anzeigen, auf Ordner für Galerieansicht klicken 1155 Show image counts in year/month table, select, report 1155 Bildanzahl in Jahr/Monat-Tabelle anzeigen, auswählen, berichten 1156 Show image description (overlap) 1156 Bildbeschreibung anzeigen (Überlappung) 1157 Show image differences on the image 1157 Bildunterschiede auf dem Bild anzeigen 1158 Show image file name (overlap) 1158 Bilddateinamen anzeigen (Überlappung) 1159 Show image title (overlap) 1159 Bildtitel anzeigen (Überlappung) 1160 Show input files used in combine function 1160 In der Kombinieren-Funktion verwendete Eingabedateien anzeigen 1161 Show key metadata for current image or clicked thumbnail 1161 Wichtige metadata für aktuelles Bild oder angeklicktes thumbnail anzeigen 1162 Show map position of the current image file 1162 Kartenposition der aktuellen Bilddatei anzeigen 1163 Show memory and CPU resources used 1163 Verwendete Speicher- und CPU-Ressourcen anzeigen 1164 Show on Map 1164 Auf Karte anzeigen 1165 Show or make Keyboard Shortcuts 1165 Tastenkürzel anzeigen oder erstellen 1166 Show the current (last used) album 1166 Das aktuelle (zuletzt verwendete) Album anzeigen 1167 Show the current log file 1167 Die aktuelle Protokolldatei anzeigen 1168 Size 1168 Größe 1169 Sketch1 1169 Skizze1 1170 Sketch2 1170 Skizze2 1171 Slide Show 1171 Diashow 1172 Smart Erase 1172 Intelligentes Löschen 1173 Soft Focus 1173 Weichzeichnung 1174 Sphere 1174 Kugel 1175 Spherical Projection 1175 Sphärische Projektion 1176 Split-Screen 1176 Geteilter Bildschirm 1177 Stack/Layers 1177 Stapel/Ebenen 1178 Stack/Noise 1178 Stapel/Rauschen 1179 Stack/Paint 1179 Stapel/Malen 1180 Stacking Order 1180 Stapelreihenfolge 1181 Start 1181 Start 1182 Start a slide show 1182 Eine Diashow starten 1183 Start of gallery 1183 Galerieanfang 1184 Startup View 1184 Startansicht 1185 Stop 1185 Stopp 1186 Stretch 1186 Strecken 1187 Stretch: 1187 Strecken: 1188 Suppress JPEG compression artifacts 1188 JPEG-Kompressionsartefakte unterdrücken 1189 Suppress Ringing 1189 Ringing unterdrücken 1190 Suppress fine details while retaining sharpness 1190 Feine Details unterdrücken, dabei Schärfe beibehalten 1191 Suppress noise from low-light photos 1191 Rauschen von Schwachlichtfotos unterdrücken 1192 Survey all files 1192 Alle Dateien durchsuchen 1193 TEXTURE 1193 TEXTUR 1194 THUMB VIEW 1194 THUMB-ANSICHT 1195 TILES1 1195 KACHELN1 1196 TILES2 1196 KACHELN2 1197 TIMELINE 1197 ZEITLEISTE 1198 TINY PLANET 1198 TINY PLANET 1199 TOOLS MENU 1199 WERKZEUGE-MENÜ 1200 TRANSLATIONS 1200 ÜBERSETZUNGEN 1201 TWIST 1201 VERDREHEN 1202 Temperature 1202 Temperatur 1203 Text 1203 Text 1204 Text File: 1204 Textdatei: 1205 Texture 1205 Textur 1206 Threshold 1206 Schwellenwert 1207 Threshold: Low 1207 Schwellenwert: Niedrig 1208 Thumbnail View 1208 Thumbnail-Ansicht 1209 Thumbnail size 1209 Thumbnail-Größe 1210 Thumbnails folder 1210 Thumbnails-Ordner 1211 Thumbnails folder: %s \nPlease remove. 1211 Thumbnails-Ordner: %s \nBitte entfernen. 1212 Thumbnails folder: \n %s \nmust be named .../thumbnails 1212 Thumbnails-Ordner: \n %s \nmuss .../thumbnails heißen 1213 Thumbnails: 1213 Thumbnails: 1214 Tile 1214 Kachel 1215 Tile blending 1215 Kachelüberblendung 1216 Tile image with a repeating pattern 1216 Bild mit einem sich wiederholenden Muster kacheln 1217 Tiles 1217 Kacheln 1218 Tiles1 1218 Kacheln1 1219 Tiles2 1219 Kacheln2 1220 Timeline 1220 Zeitleiste 1221 Tiny Planet 1221 Tiny Planet 1222 Title 1222 Titel 1223 Title: %s\n 1223 Titel: %s\n 1224 To Location 1224 Zu Ort 1225 Toggle Captions 1225 Beschriftungen umschalten 1226 Toggle Grid 1226 Raster umschalten 1227 Toggle grid lines on and off 1227 Rasterlinien ein- und ausschalten 1228 Toggle image metadata display ON/OFF 1228 Anzeige der Bild-metadata EIN/AUS umschalten 1229 Too little overlap, cannot align 1229 Zu wenig Überlappung, Ausrichtung nicht möglich 1230 Too many edits, please save image 1230 Zu viele Bearbeitungen, bitte Bild speichern 1231 Tools 1231 Werkzeuge 1232 Tools: image index, settings, shortcuts, grid, find duplicates 1232 Werkzeuge: Bildindex, Einstellungen, Tastenkürzel, Raster, Duplikate finden 1233 Top 1233 Oben 1234 Total Colors 1234 Gesamtfarben 1235 Trace 1235 Nachzeichnen 1236 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1236 Obere und untere Kurven mit \nMausklicks nachzeichnen, dann [Abflachen]. 1237 Transient Objects 1237 Vorübergehende Objekte 1238 Transition Preferences 1238 Übergangseinstellungen 1239 Transition to next image 1239 Übergang zum nächsten Bild 1240 Transitions File 1240 Übergangsdatei 1241 Transp. 1241 Transp. 1242 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1242 Transparenzkarte geht verloren \n(als TIFF|PNG|JXL speichern, um sie zu behalten) \nTrotzdem speichern? 1243 Trash 1243 Papierkorb 1244 Trash read-only file? 1244 Schreibgeschützte Datei in den Papierkorb verschieben? 1245 Turn an image inside-out 1245 Ein Bild von innen nach außen kehren 1246 Twist 1246 Verdrehen 1247 Twist image centered at mouse position 1247 Bild um Mausposition verdrehen 1248 UNBEND 1248 BEGRADIGEN 1249 UNDO/REDO BUTTON 1249 RÜCKGÄNGIG/WIEDERHOLEN-TASTE 1250 UNWARP CLOSEUP 1250 NAHAUFNAHME ENTZERREN 1251 UPDATE ALBUMS 1251 ALBEN AKTUALISIEREN 1252 UPRIGHT 1252 AUFRICHTEN 1253 USER GUIDE 1253 BENUTZERHANDBUCH 1254 Unable to copy metadata 1254 Metadata kann nicht kopiert werden 1255 Unbend 1255 Begradigen 1256 Undo 1256 Rückgängig 1257 Undo All 1257 Alle rückgängig machen 1258 Undo Last 1258 Letztes rückgängig machen 1259 Undo/Redo 1259 Rückgängig/Wiederholen 1260 Uninstall 1260 Deinstallieren 1261 Unwarp Closeup 1261 Nahaufnahme entzerren 1262 Update Albums 1262 Alben aktualisieren 1263 Update albums for new file versions 1263 Alben für neue Dateiversionen aktualisieren 1264 Upright 1264 Aufrichten 1265 Upright Image 1265 Bild aufrichten 1266 Upright or mirror-flip an image 1266 Bild aufrichten oder spiegeln 1267 Upright rotated image files, selected set or ALL 1267 Gedrehte Bilddateien aufrichten, ausgewählte Gruppe oder ALLE 1268 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1268 Bereich auswählen verwenden, um ein Gesicht auszuwählen. \nAuf das Verzerrungszentrum klicken. \nDen Schieberegler bewegen. \n 1269 Use [Select] to add files to an empty album 1269 [Auswählen] verwenden, um Dateien zu einem leeren Album hinzuzufügen 1270 Use metadata photo date or file modification date? 1270 Aufnahmedatum aus metadata oder Datei-Änderungsdatum verwenden? 1271 Use metadata tag 1271 metadata-tag verwenden 1272 Use settings file 1272 Einstellungsdatei verwenden 1273 User Guide 1273 Benutzerhandbuch 1274 User preferences and settings 1274 Benutzereinstellungen 1275 VIDEO press P to play 1275 VIDEO P drücken zum Abspielen 1276 VIEW 360° PANO 1276 360°-PANORAMA ANSEHEN 1277 VIEW ALL META 1277 ALLE METADATA ANSEHEN 1278 VIEW MAIN META 1278 HAUPTMETADATA ANSEHEN 1279 VIGNETTE 1279 VIGNETTE 1280 Var. Transparency 1280 Var. Transparenz 1281 Vert 1281 Vert 1282 Video Files 1282 Videodateien 1283 Video Tutorial 1283 Video-Tutorial 1284 Video command 1284 Videobefehl 1285 View 360 degree panorama image 1285 360-Grad-Panoramabild ansehen 1286 View 360° Pano 1286 360°-Panorama ansehen 1287 View All Meta 1287 Alle Metadata ansehen 1288 View All Metadata 1288 Alle metadata ansehen 1289 View Main Meta 1289 Hauptmetadata ansehen 1290 View Main Metadata 1290 Hauptmetadata ansehen 1291 View before/after images using split-screen 1291 Vorher-/Nachher-Bilder im geteilten Bildschirm ansehen 1292 View/edit metadata, image report and search functions 1292 Metadata ansehen/bearbeiten, Bildbericht und Suchfunktionen 1293 Vignette 1293 Vignette 1294 W/H Ratio: 1294 B/H-Verhältnis: 1295 WARP AFFINE 1295 AFFIN VERZERREN 1296 WARP AREA 1296 BEREICH VERZERREN 1297 WARP CURVED 1297 GEKRÜMMT VERZERREN 1298 WARP IMAGE 1298 BILD VERZERREN 1299 WARP MENU 1299 VERZERREN-MENÜ 1300 WARP RADIAL 1300 RADIAL VERZERREN 1301 WINDOW VIEWS AND MENUS 1301 FENSTERANSICHTEN UND MENÜS 1302 WORLD MAP 1302 WELTKARTE 1303 Wait after zoom 1303 Warten nach Zoom 1304 Wait before filename/title/description 1304 Warten vor Dateiname/Titel/Beschreibung 1305 Wait before zoom 1305 Warten vor Zoom 1306 Warp 1306 Verzerren 1307 Warp Affine 1307 Affin verzerren 1308 Warp Area 1308 Bereich verzerren 1309 Warp Curved 1309 Gekrümmt verzerren 1310 Warp Image 1310 Bild verzerren 1311 Warp Linear1 1311 Linear verzerren 1 1312 Warp Linear2 1312 Linear verzerren 2 1313 Warp Radial 1313 Radial verzerren 1314 Warp an image with a wave pattern 1314 Ein Bild mit einem Wellenmuster verzerren 1315 Warp image (affine) using the mouse 1315 Bild (affin) mit der Maus verzerren 1316 Warp image (curved) using the mouse 1316 Bild (gekrümmt) mit der Maus verzerren 1317 Warp image (linear 1) using the mouse 1317 Bild (linear 1) mit der Maus verzerren 1318 Warp image (linear 2) using the mouse 1318 Bild (linear 2) mit der Maus verzerren 1319 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1319 Verzerren: begradigen, Perspektive korrigieren, verzerren, Nahaufnahme entzerren, abflachen, Bildtransformationen 1320 White 1320 Weiß 1321 Widen: 1321 Verbreitern: 1322 Width 1322 Breite 1323 Width % 1323 Breite % 1324 X-size 1324 X-Größe 1325 Yes 1325 Ja 1326 ZOOM 1326 ZOOM 1327 Zoom 1327 Zoom 1328 Zoom Center 1328 Zoom-Zentrum 1329 Zoom Speed 1329 Zoom-Geschwindigkeit 1330 Zoom-in 1330 Zoom-in 1331 Zoom-out 1331 Zoom-out 1332 \n %d-bits/color 1332 \n %d-Bit/Farbe 1333 \n *** CANCELED \n 1333 \n *** ABGEBROCHEN \n 1334 \n *** COMPLETED \n 1334 \n *** ABGESCHLOSSEN \n 1335 \n *** Delete Originals *** 1335 \n *** Originale löschen *** 1336 \n *** Keep Originals *** 1336 \n *** Originale behalten *** 1337 \n *** Replace Originals *** 1337 \n *** Originale ersetzen *** 1338 \n Convert to %s 1338 \n Konvertieren nach %s 1339 \n Copy Metadata 1339 \n Metadata kopieren 1340 \n Downsize within %dx%d 1340 \n Verkleinern innerhalb %dx%d 1341 \n New Location: %s 1341 \n Neuer Ort: %s 1342 \n Output to %s 1342 \n Ausgabe nach %s 1343 \n PROCEED? 1343 \n FORTFAHREN? 1344 \n Rename to %s 1344 \n Umbenennen in %s 1345 \n Replace text: %s --> %s 1345 \n Text ersetzen: %s --> %s 1346 \n Rescale to %sx 1346 \n Skalieren auf %sx 1347 \n Update Albums 1347 \n Alben aktualisieren 1348 \n Upsize within %dx%d 1348 \n Vergrößern innerhalb %dx%d 1349 \n*** CANCELED \n 1349 \n*** ABGEBROCHEN \n 1350 \n*** COMPLETED \n 1350 \n*** ABGESCHLOSSEN \n 1351 \n\nPROCEED? 1351 \n\nFORTFAHREN? 1352 add 1352 hinzufügen 1353 add after old 1353 nach alt hinzufügen 1354 add all gallery files to list 1354 alle Galeriedateien zur Liste hinzufügen 1355 add current file to list 1355 aktuelle Datei zur Liste hinzufügen 1356 add entered text to layout 1356 eingegebenen Text zum Layout hinzufügen 1357 add images to layout 1357 Bilder zum Layout hinzufügen 1358 add line/arrow to layout 1358 Linie/Pfeil zum Layout hinzufügen 1359 add new keyword 1359 neues keyword hinzufügen 1360 add or edit images 1360 Bilder hinzufügen oder bearbeiten 1361 add or edit lines/arrows 1361 Linien/Pfeile hinzufügen oder bearbeiten 1362 add or edit text 1362 Text hinzufügen oder bearbeiten 1363 add to set 1363 zur Gruppe hinzufügen 1364 adder 1364 Zusatz 1365 adjust brightness of selected image 1365 Helligkeit des ausgewählten Bildes anpassen 1366 after removal of missing files: %d \n 1366 nach Entfernen fehlender Dateien: %d \n 1367 album %s: deleted 1367 Album %s: gelöscht 1368 album already exists: %s 1368 Album existiert bereits: %s 1369 album mass update 1369 Album-Sammelaktualisierung 1370 albums folder missing 1370 Alben-Ordner fehlt 1371 align and trim color chart 1371 Farbtabelle ausrichten und zuschneiden 1372 all files 1372 alle Dateien 1373 all image files, including unmounted folders: %d \n 1373 alle Bilddateien, einschließlich nicht eingebundener Ordner: %d \n 1374 all images 1374 alle Bilder 1375 all versions 1375 alle Versionen 1376 amplify contrast 1376 Kontrast verstärken 1377 amplitude 1377 Amplitude 1378 angle 1378 Winkel 1379 apply 1379 anwenden 1380 area edge creep 1380 Bereichskantenkriechen 1381 area is not finished 1381 Bereich ist nicht fertig 1382 area outline color: 1382 Bereichsumrandungsfarbe: 1383 array width is too large: %d x %d 1383 Array-Breite zu groß: %d x %d 1384 ascending 1384 aufsteigend 1385 auto color 1385 Autofarbe 1386 background colors for file and gallery view windows 1386 Hintergrundfarben für Datei- und Galerieansichtsfenster 1387 backing 1387 Unterlage 1388 bad category name 1388 ungültiger Kategoriename 1389 bad keyword name 1389 ungültiger keyword-Name 1390 bad pattern file: %s 1390 fehlerhafte Musterdatei: %s 1391 base 1391 Basis 1392 base and adder need $s plugin 1392 Basis und Zusatz benötigen $s Plugin 1393 base size 1393 Basisgröße 1394 begin making a script file 1394 Erstellen einer Skriptdatei beginnen 1395 black/white 1395 Schwarz/Weiß 1396 black/white negative 1396 Schwarz/Weiß Negativ 1397 black/white positive 1397 Schwarz/Weiß Positiv 1398 blend 1398 überblenden 1399 blend edges: blend width: 1399 Kanten überblenden: Überblendbreite: 1400 blend image overlaps over pixel width 1400 Bildüberlappung über Pixelbreite überblenden 1401 blend rate: center: 1401 Überblendrate: Zentrum: 1402 blocking function: %s 1402 blockierende Funktion: %s 1403 blocksize 1403 Blockgröße 1404 blur edges: blur width: 1404 Kanten weichzeichnen: Unschärfebreite: 1405 blur radius 1405 Unschärferadius 1406 borders 1406 Ränder 1407 both 'All Files' and specific files were selected 1407 sowohl 'Alle Dateien' als auch bestimmte Dateien wurden ausgewählt 1408 bright halo 1408 heller Halo 1409 brightness rescale 1409 Helligkeit neu skalieren 1410 browse 1410 durchsuchen 1411 brush size 1411 Pinselgröße 1412 build index, old files only 1412 Index erstellen, nur alte Dateien 1413 cancel project 1413 Projekt abbrechen 1414 cancel project? 1414 Projekt abbrechen? 1415 cannot allocate %d MB memory 1415 %d MB Speicher kann nicht zugewiesen werden 1416 cannot be determined 1416 kann nicht ermittelt werden 1417 cannot copy a file to itself 1417 eine Datei kann nicht auf sich selbst kopiert werden 1418 cannot copy current file 1418 aktuelle Datei kann nicht kopiert werden 1419 cannot create output file 1419 Ausgabedatei kann nicht erstellt werden 1420 cannot create pixbuf 1420 pixbuf kann nicht erstellt werden 1421 cannot find area outline 1421 Bereichsumrandung nicht gefunden 1422 cannot find output file 1422 Ausgabedatei nicht gefunden 1423 cannot load input file 1423 Eingabedatei kann nicht geladen werden 1424 cannot open file %s 1424 Datei %s kann nicht geöffnet werden 1425 cannot parse current file 1425 aktuelle Datei kann nicht analysiert werden 1426 cannot parse file 1426 Datei kann nicht analysiert werden 1427 cannot read pluging output file 1427 Plugin-Ausgabedatei kann nicht gelesen werden 1428 cannot replace %s file 1428 Datei %s kann nicht ersetzt werden 1429 cannot save as RAW type 1429 kann nicht als RAW-Typ gespeichert werden 1430 cannot save layout file: %s 1430 Layoutdatei kann nicht gespeichert werden: %s 1431 cannot write image folders file: %s 1431 Bildordnerdatei kann nicht geschrieben werden: %s 1432 category %s has too many keywords 1432 Kategorie %s hat zu viele keywords 1433 category %s is too big 1433 Kategorie %s ist zu groß 1434 center 1434 Zentrum 1435 change project scale 1435 Projektskalierung ändern 1436 choose 1-8 clicks or [+] keys for 2x image zoom 1436 1-8 Klicks oder [+]-Tasten für 2x Bildzoom wählen 1437 choose a better spot 1437 eine bessere Stelle wählen 1438 choose an image file 1438 eine Bilddatei wählen 1439 choose file 1439 Datei wählen 1440 choose files 1440 Dateien wählen 1441 choose folder 1441 Ordner wählen 1442 choose folders 1442 Ordner wählen 1443 choose location 1443 Ort wählen 1444 circle 1444 Kreis 1445 clear area selections 1445 Bereichsauswahlen leeren 1446 clear entered text 1446 eingegebenen Text löschen 1447 clear inputs 1447 Eingaben leeren 1448 clear text 1448 Text löschen 1449 click a defined keyword (below) to add a search keyword 1449 auf ein definiertes keyword (unten) klicken, um ein Such-keyword hinzuzufügen 1450 click bright point 1450 Hellpunkt anklicken 1451 click dark point 1451 Dunkelpunkt anklicken 1452 click on desired color 1452 gewünschte Farbe anklicken 1453 click on image to get source color 1453 auf Bild klicken, um Quellfarbe zu erhalten 1454 click on image to set matching color 1454 auf Bild klicken, um Abgleichfarbe festzulegen 1455 click on thumbnail to set zoom center 1455 auf thumbnail klicken, um Zoom-Zentrum festzulegen 1456 click position to add line 1456 Position anklicken, um Linie hinzuzufügen 1457 click position to add text 1457 Position anklicken, um Text hinzuzufügen 1458 click to select 1458 zum Auswählen klicken 1459 click to unselect 1459 zum Abwählen klicken 1460 clicks per 2x image increase 1460 Klicks pro 2x Bildvergrößerung 1461 color 1461 Farbe 1462 color depth 1462 Farbtiefe 1463 color depth: 1463 Farbtiefe: 1464 color match level % 1464 Farbabgleichniveau % 1465 color negative 1465 Farbnegativ 1466 column difference: %d pixels 1466 Spaltendifferenz: %d Pixel 1467 column difference: %d pixels \nMake columns even? 1467 Spaltendifferenz: %d Pixel \nSpalten angleichen? 1468 combined image files 1468 kombinierte Bilddateien 1469 command: 1469 Befehl: 1470 commit all changes, close dialog 1470 alle Änderungen übernehmen, Dialog schließen 1471 complete file selection first 1471 zuerst die Dateiauswahl abschließen 1472 completed 1472 abgeschlossen 1473 condense into color blobs 1473 zu Farbklumpen zusammenfassen 1474 condition 1474 Bedingung 1475 confirm Fotocx exit 1475 Fotocx-Beenden bestätigen 1476 constant blur 1476 konstante Unschärfe 1477 continue? 1477 fortfahren? 1478 converting colors... 1478 Farben werden konvertiert ... 1479 converting files 1479 Dateien werden konvertiert 1480 copy (duplicate file) 1480 kopieren (Datei duplizieren) 1481 copy and paste commands 1481 Kopieren- und Einfügen-Befehle 1482 copy files to %s 1482 Dateien nach %s kopieren 1483 copy metadata from Nth file: 1483 Metadata von der n-ten Datei kopieren: 1484 copy to Desktop failed: %s 1484 Kopieren auf Desktop fehlgeschlagen: %s 1485 count: 0 1485 Anzahl: 0 1486 create folder 1486 Ordner erstellen 1487 create folder %s 1487 Ordner %s erstellen 1488 current gallery 1488 aktuelle Galerie 1489 current image files found: %d \n 1489 gefundene aktuelle Bilddateien: %d \n 1490 current set only 1490 nur aktuelle Gruppe 1491 current set: 1491 aktuelle Gruppe: 1492 curve file is invalid 1492 Kurvendatei ist ungültig 1493 custom command to play video files 1493 benutzerdefinierter Befehl zum Abspielen von Videodateien 1494 dark 1494 dunkel 1495 dark halo 1495 dunkler Halo 1496 dark pixels 1496 dunkle Pixel 1497 data is incomplete, proceed? 1497 Daten sind unvollständig, fortfahren? 1498 date format is yyyy:mm:dd [hh:mm:ss] 1498 Datumsformat ist yyyy:mm:dd [hh:mm:ss] 1499 date range 1499 Datumsbereich 1500 days 1500 Tage 1501 delete 1501 löschen 1502 delete %s \n%s 1502 %s löschen \n%s 1503 delete Mashup project files? 1503 Mashup-Projektdateien löschen? 1504 delete failed: \n%s 1504 Löschen fehlgeschlagen: \n%s 1505 delete originals specified but no new name given 1505 Originale löschen angegeben, aber kein neuer Name angegeben 1506 delete selected text from layout 1506 ausgewählten Text aus Layout löschen 1507 deleting orphan thumbnails ... \n 1507 verwaiste thumbnails werden gelöscht ... \n 1508 depth 1508 Tiefe 1509 descending 1509 absteigend 1510 direction of light and shadows 1510 Richtung von Licht und Schatten 1511 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1511 thumbnail-Auswahl deaktivieren, um Popup-Menüs usw. zu aktivieren \n[Aktivieren] verwenden, um thumbnail-Auswahl fortzusetzen 1512 discard changes? 1512 Änderungen verwerfen? 1513 do not warp images during auto-alignment 1513 Bilder während der automatischen Ausrichtung nicht verzerren 1514 do nothing 1514 nichts tun 1515 dot size 1515 Punktgröße 1516 downsize 1516 verkleinern 1517 drag image 1517 Bild ziehen 1518 drag mouse along an edge to follow the edge 1518 Maus entlang einer Kante ziehen, um der Kante zu folgen 1519 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1519 Maus nach unten/rechts ziehen, um Oval zu zeichnen \nUmschalt + Zentrum ziehen, um Oval zu verschieben \nUmschalt + untere rechte Kante ziehen, um zu ändern 1520 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1520 Maus ziehen, um Rechteck zu zeichnen \nUmschalt + Zentrum ziehen, um Rechteck zu verschieben \nUmschalt + Kante ziehen, um Kante zu verschieben 1521 drag mouse to outline an area 1521 Maus ziehen, um einen Bereich zu umranden 1522 drag mouse to select circular or elliptical area 1522 Maus ziehen, um kreisförmigen oder elliptischen Bereich auszuwählen 1523 drag mouse to select rectangular area 1523 Maus ziehen, um rechteckigen Bereich auszuwählen 1524 drag mouse to show selected image 1524 Maus ziehen, um ausgewähltes Bild anzuzeigen 1525 duplicate keyword 1525 doppeltes keyword 1526 edge distance calculation 1526 Kantenabstandsberechnung 1527 edge: 1527 Kante: 1528 edit 1528 bearbeiten 1529 edit commands 1529 Befehle bearbeiten 1530 edit custom shell commands, match colors to embedded jpeg image 1530 benutzerdefinierte Shell-Befehle bearbeiten, Farben mit eingebettetem JPEG-Bild abgleichen 1531 edit this menu 1531 dieses Menü bearbeiten 1532 ellipse 1532 Ellipse 1533 embedded numbers will sort by value 1533 eingebettete Zahlen werden nach Wert sortiert 1534 emboss 1534 prägen 1535 enter 2-character language code: en, de, fr ... 1535 2-Zeichen-Sprachcode eingeben: en, de, fr ... 1536 enter a project name 1536 einen Projektnamen eingeben 1537 enter an album name 1537 einen Albumnamen eingeben 1538 enter cities/locations, countries 1538 Städte/Orte, Länder eingeben 1539 enter project name 1539 Projektnamen eingeben 1540 enter tag name 1540 tag-Namen eingeben 1541 enter tag names 1541 tag-Namen eingeben 1542 erase 1542 löschen 1543 error compensation 1543 Fehlerkompensation 1544 exceed %d edits 1544 %d Bearbeitungen überschritten 1545 exceed %d images 1545 %d Bilder überschritten 1546 exceed %d max files, cannot continue 1546 %d max. Dateien überschritten, kann nicht fortfahren 1547 exceed %d rows 1547 %d Zeilen überschritten 1548 exceed %d selected files 1548 %d ausgewählte Dateien überschritten 1549 exceed %d shortcuts 1549 %d Tastenkürzel überschritten 1550 exceeded %d line entries 1550 %d Zeileneinträge überschritten 1551 exceeded %d text entries 1551 %d Texteinträge überschritten 1552 exceeded max. images: %d 1552 max. Bilder überschritten: %d 1553 exceeded max. tiles: %d 1553 max. Kacheln überschritten: %d 1554 exit split-screen 1554 geteilten Bildschirm beenden 1555 expand to these limits if smaller 1555 auf diese Grenzen erweitern, wenn kleiner 1556 exporting files 1556 Dateien werden exportiert 1557 extra indexed metadata tags > %d 1557 zusätzliche indizierte metadata-tags > %d 1558 extra metadata tags to include in index 1558 zusätzliche metadata-tags, die im Index enthalten sein sollen 1559 extra metadata tags: \n 1559 zusätzliche metadata-tags: \n 1560 fetch 1560 abrufen 1561 file 1561 Datei 1562 file .ext names to recognize RAW files 1562 Datei-.ext-Namen zum Erkennen von RAW-Dateien 1563 file .ext names to recognize video files 1563 Datei-.ext-Namen zum Erkennen von Videodateien 1564 file close error 1564 Fehler beim Schließen der Datei 1565 file color 1565 Dateifarbe 1566 file error: %s 1566 Dateifehler: %s 1567 file format error 1567 Dateiformatfehler 1568 file format error: %s 1568 Dateiformatfehler: %s 1569 file included: %s \n 1569 Datei eingeschlossen: %s \n 1570 file metadata update failed 1570 Aktualisierung der Datei-metadata fehlgeschlagen 1571 file name 1571 Dateiname 1572 file names 1572 Dateinamen 1573 file not found 1573 Datei nicht gefunden 1574 file not found \n 1574 Datei nicht gefunden \n 1575 file not found: %s 1575 Datei nicht gefunden: %s 1576 file not found: %s %s 1576 Datei nicht gefunden: %s %s 1577 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1577 Dateitypen: .jp2 .heic .avif .webp \nwerden zu: .jpg - FORTFAHREN? 1578 file: %s \nexceed 99 versions 1578 Datei: %s \nüberschreitet 99 Versionen 1579 filename text 1579 Dateinamentext 1580 files in %s can be deleted 1580 Dateien in %s können gelöscht werden 1581 fill from current gallery 1581 aus aktueller Galerie füllen 1582 fill from selected files 1582 aus ausgewählten Dateien füllen 1583 fill selected areas 1583 ausgewählte Bereiche füllen 1584 fill transparent areas 1584 transparente Bereiche füllen 1585 find all image files ...\n 1585 alle Bilddateien werden gesucht ...\n 1586 find and report all unreadable image files 1586 alle nicht lesbaren Bilddateien finden und melden 1587 find outline gap 1587 Umrandungslücke finden 1588 find via table lookup 1588 über Tabellensuche finden 1589 find_imagefiles() failure \n 1589 find_imagefiles() fehlgeschlagen \n 1590 find_imagefiles() failure: %s \n 1590 find_imagefiles() fehlgeschlagen: %s \n 1591 finish current edit first 1591 zuerst aktuelle Bearbeitung abschließen 1592 finish making a script file 1592 Erstellen einer Skriptdatei abschließen 1593 finish or cancel pending edit 1593 ausstehende Bearbeitung abschließen oder abbrechen 1594 fix box in layout and start new box 1594 Rechteck im Layout fixieren und neues Rechteck beginnen 1595 fix line in layout and start new line 1595 Linie im Layout fixieren und neue Linie beginnen 1596 fix motion blur 1596 Bewegungsunschärfe korrigieren 1597 fix oval in layout and start new oval 1597 Oval im Layout fixieren und neues Oval beginnen 1598 follow edge 1598 Kante folgen 1599 font name and size for menus and dilogs 1599 Schriftname und -größe für Menüs und Dialoge 1600 force a full re-index of all image files 1600 vollständige Neuindizierung aller Bilddateien erzwingen 1601 format: yyyy:mm:dd [hh:mm:ss] 1601 Format: yyyy:mm:dd [hh:mm:ss] 1602 fotocx will exit 1602 Fotocx wird beendet 1603 found %d pixels 1603 %d Pixel gefunden 1604 free disk space: %d GB \n 1604 freier Speicherplatz: %d GB \n 1605 freehand draw 1605 Freihandzeichnung 1606 ftruncate() failure: %s 1606 ftruncate() fehlgeschlagen: %s 1607 full image index: reports will be complete \n 1607 vollständiger Bildindex: Berichte werden vollständig sein \n 1608 function canceled 1608 Funktion abgebrochen 1609 gallery 1609 Galerie 1610 gallery is empty 1610 Galerie ist leer 1611 gallery truncated to %d images 1611 Galerie auf %d Bilder gekürzt 1612 get images having text in filename (comma separated) 1612 Bilder mit Text im Dateinamen abrufen (durch Komma getrennt) 1613 get images with matching keywords (comma separated) 1613 Bilder mit übereinstimmenden keywords abrufen (durch Komma getrennt) 1614 get images within rating range 1614 Bilder innerhalb des Bewertungsbereichs abrufen 1615 gradual paint 1615 allmähliches Malen 1616 grid counts not 0-100: %s 1616 Rasteranzahl nicht 0-100: %s 1617 grid picklist file error: %s 1617 Fehler in Raster-Auswahllistendatei: %s 1618 grid size 1618 Rastergröße 1619 group 1619 Gruppe 1620 height 1620 Höhe 1621 hide area outlines 1621 Bereichsumrandungen ausblenden 1622 hide transient objects 1622 Vorübergehende Objekte ausblenden 1623 high 1623 hoch 1624 home folder was not changed 1624 Startordner wurde nicht geändert 1625 horizontal 1625 horizontal 1626 hours 1626 Stunden 1627 icons only, text only, or both 1627 nur Symbole, nur Text oder beides 1628 if image < window, center or shift left or right 1628 wenn Bild < Fenster, zentrieren oder nach links/rechts verschieben 1629 ignore differences above limit 1629 Unterschiede oberhalb der Grenze ignorieren 1630 image blend 1630 Bildüberblendung 1631 image files 1631 Bilddateien 1632 image for source color 1632 Bild für Quellfarbe 1633 image index records found: %d \n 1633 gefundene Bildindexdatensätze: %d \n 1634 image index required 1634 Bildindex erforderlich 1635 image index write error: %s 1635 Fehler beim Schreiben des Bildindex: %s 1636 image is too large to edit: %d x %d 1636 Bild ist zu groß zum Bearbeiten: %d x %d 1637 image is too large: %dx%d, %lld megapix 1637 Bild ist zu groß: %dx%d, %lld Megapixel 1638 image is too small to edit: %d x %d 1638 Bild ist zu klein zum Bearbeiten: %d x %d 1639 image scale 1639 Bildskalierung 1640 image to set matching color 1640 Bild zum Festlegen der Abgleichfarbe 1641 image width must be greater than height 1641 Bildbreite muss größer als die Höhe sein 1642 images to report 1642 Bilder für Bericht 1643 include all files 1643 alle Dateien einschließen 1644 include edited versions 1644 bearbeitete Versionen einschließen 1645 include last versions only 1645 nur letzte Versionen einschließen 1646 include original files 1646 Originaldateien einschließen 1647 include transparent areas 1647 transparente Bereiche einschließen 1648 include: 1648 einschließen: 1649 increase blur with distance 1649 Unschärfe mit Abstand erhöhen 1650 index completed, %.1f seconds \n 1650 Indizierung abgeschlossen, %.1f Sekunden \n 1651 index config file error: %s 1651 Fehler in Indexkonfigurationsdatei: %s 1652 index updates needed: %d thumbnails: %d \n 1652 erforderliche Indexaktualisierungen: %d thumbnails: %d \n 1653 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1653 Indexaktualisierungen: %d Titel-/Beschr.-Aktualisierungen: %d \nthumbnail-Aktualisierungen: %d, Löschungen: %d \n 1654 input 1654 Eingabe 1655 input file: %s \n 1655 Eingabedatei: %s \n 1656 insufficient memory, cannot proceed 1656 unzureichender Speicher, kann nicht fortfahren 1657 insufficient overlap for color matching 1657 unzureichende Überlappung für Farbabgleich 1658 invalid GPS data 1658 ungültige GPS-Daten 1659 invalid GPS data: %s 1659 ungültige GPS-Daten: %s 1660 invalid album 1660 ungültiges Album 1661 invalid date range: %s %s 1661 ungültiger Datumsbereich: %s %s 1662 invalid date/time format 1662 ungültiges Datum-/Zeitformat 1663 invalid file 1663 ungültige Datei 1664 invalid plugin: %s 1664 ungültiges Plugin: %s 1665 invalid rating range 1665 ungültiger Bewertungsbereich 1666 invalid source file: %s 1666 ungültige Quelldatei: %s 1667 invert area 1667 Bereich umkehren 1668 jpeg quality level - 70+ for good image quality 1668 JPEG-Qualitätsstufe - 70+ für gute Bildqualität 1669 keyboard 1669 Tastatur 1670 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1670 Tastatursteuerung: \nEsc: laufende Diashow beenden \nPfeiltasten: vorheriges/nächstes Bild \nB: Fenster ausblenden/einblenden \nN: Übergang zum nächsten Bild \nP: pausieren/fortsetzen \nX: an Mausposition vergrößern 1671 keyword names 1671 keyword-Namen 1672 keywords to add 1672 hinzuzufügende keywords 1673 keywords to remove 1673 zu entfernende keywords 1674 keywords_defined file error: %s 1674 Fehler in Datei keywords_defined: %s 1675 last search 1675 letzte Suche 1676 last version 1676 letzte Version 1677 last versions 1677 letzte Versionen 1678 layout exceeds 4 gigabytes 1678 Layout überschreitet 4 Gigabyte 1679 layout file missing: %s 1679 Layoutdatei fehlt: %s 1680 left 1680 links 1681 left click on image for selected color 1681 Linksklick auf Bild für ausgewählte Farbe 1682 left click: set image source location \nright click: set corresponding destination 1682 Linksklick: Bildquellort festlegen \nRechtsklick: entsprechendes Ziel festlegen 1683 left drag: add transparency \nright drag: add opacity 1683 Links ziehen: Transparenz hinzufügen \nRechts ziehen: Deckkraft hinzufügen 1684 left drag: copy image to mouse position \nright drag: restore original image 1684 Links ziehen: Bild an Mausposition kopieren \nRechts ziehen: Originalbild wiederherstellen 1685 left drag: reduce halo, right drag: undo 1685 Links ziehen: Halo reduzieren, Rechts ziehen: rückgängig machen 1686 lens mm 1686 Objektiv mm 1687 level based on EXIF roll angle 1687 Ausrichtung basierend auf EXIF-Rollwinkel 1688 light 1688 hell 1689 light pixels 1689 helle Pixel 1690 line 1690 Linie 1691 line color 1691 Linienfarbe 1692 line width 1692 Linienbreite 1693 load 1693 laden 1694 load text data from a file 1694 Textdaten aus einer Datei laden 1695 load widgets failed: %s 1695 Laden der Widgets fehlgeschlagen: %s 1696 loading palette ... 1696 Palette wird geladen ... 1697 location is not a folder 1697 Ort ist kein Ordner 1698 locations 1698 Orte 1699 lock width/height ratio 1699 Breite-/Höhenverhältnis sperren 1700 log file is in a terminal 1700 Protokolldatei befindet sich in einem Terminal 1701 low 1701 niedrig 1702 low contrast 1702 geringer Kontrast 1703 lower 1703 niedriger 1704 make an initially empty album 1704 ein anfangs leeres Album erstellen 1705 make new version 1705 neue Version erstellen 1706 manual align 1706 manuelle Ausrichtung 1707 map marker (red dot) diameter, pixels 1707 Kartenmarkierung (roter Punkt) Durchmesser, Pixel 1708 map selected areas and verify 1708 ausgewählte Bereiche kartieren und überprüfen 1709 mashup project 1709 Mashup-Projekt 1710 match embedded image color 1710 eingebettete Bildfarbe abgleichen 1711 match image color to base image (repeat) 1711 Bildfarbe an Basisbild abgleichen (wiederholen) 1712 match values 1712 Werte abgleichen 1713 matches 1713 Treffer 1714 max keywords exceeded 1714 max. keywords überschritten 1715 max. Width 1715 max. Breite 1716 max. album count exceeded: %d 1716 max. Albumanzahl überschritten: %d 1717 max. album files reached, results truncated 1717 max. Albumdateien erreicht, Ergebnisse gekürzt 1718 max. album size exceeded: %d 1718 max. Albumgröße überschritten: %d 1719 max. blur radius 1719 max. Unschärferadius 1720 max. brightness 1720 max. Helligkeit 1721 max. image limit reached: %d 1721 max. Bildgrenze erreicht: %d 1722 max. width or height is not reasonable 1722 max. Breite oder Höhe ist nicht sinnvoll 1723 maximum clip allowed to fit window 1723 maximale Beschneidung, um ins Fenster zu passen 1724 mean RGB: %5.0f %5.0f %5.0f 1724 mittleres RGB: %5.0f %5.0f %5.0f 1725 mean noise: %5.2f %5.2f %5.2f 1725 mittleres Rauschen: %5.2f %5.2f %5.2f 1726 median 1726 Median 1727 median diff 1727 Mediandifferenz 1728 menu text and background colors 1728 Menütext- und Hintergrundfarben 1729 metadata 1729 metadata 1730 metadata copy failed 1730 Metadata-Kopie fehlgeschlagen 1731 metadata from Search Function, metadata report 1731 metadata aus Suchfunktion, metadata-Bericht 1732 metadata picklist file not found %s 1732 metadata-Auswahllistendatei nicht gefunden %s 1733 metadata tags to report 1733 zu meldende metadata-tags 1734 metadata update error 1734 Fehler bei der Aktualisierung der metadata 1735 metadata update error \n 1735 Fehler bei der Aktualisierung der metadata \n 1736 metadata update error: %s 1736 Fehler bei der Aktualisierung der metadata: %s 1737 metadata update failed \n 1737 Aktualisierung der metadata fehlgeschlagen \n 1738 min. blur radius 1738 min. Unschärferadius 1739 min. contrast 1739 min. Kontrast 1740 min. edit curve node separation, % of scale length 1740 min. Abstand der Kurvenbearbeitungsknoten, % der Skalenlänge 1741 min. separation, %c of scale 1741 min. Abstand, %c der Skala 1742 minutes 1742 Minuten 1743 mmap() failure: %s 1743 mmap() fehlgeschlagen: %s 1744 months 1744 Monate 1745 more than %d categories 1745 mehr als %d Kategorien 1746 more than 20 matches 1746 mehr als 20 Treffer 1747 mouse radius 1747 Mausradius 1748 mouse radius for color sample 1748 Mausradius für Farbprobe 1749 mouse radius: 1749 Mausradius: 1750 move (delete original) 1750 verschieben (Original löschen) 1751 move area boundary in/out in 1-pixel steps 1751 Bereichsgrenze in 1-Pixel-Schritten nach innen/außen verschieben 1752 move to next input file 1752 zur nächsten Eingabedatei wechseln 1753 move to trash failed \n 1753 Verschieben in den Papierkorb fehlgeschlagen \n 1754 move to trash failed: %s 1754 Verschieben in den Papierkorb fehlgeschlagen: %s 1755 multiply 1755 multiplizieren 1756 must have 4 corners 1756 muss 4 Ecken haben 1757 need numeric match value: %s 1757 numerischer Abgleichwert erforderlich: %s 1758 negative 1758 negativ 1759 new album created 1759 neues Album erstellt 1760 new album name 1760 neuer Albumname 1761 new file 1761 neue Datei 1762 new file ... 1762 neue Datei ... 1763 new file name is invalid 1763 neuer Dateiname ist ungültig 1764 new file type 1764 neuer Dateityp 1765 new home folder contains a blank 1765 neuer Startordner enthält ein Leerzeichen 1766 new location 1766 neuer Ort 1767 new location is not a folder 1767 neuer Ort ist kein Ordner 1768 new version 1768 neue Version 1769 newest files 1769 neueste Dateien 1770 no EXIF orientation data 1770 keine EXIF-Ausrichtungsdaten 1771 no active Select Area 1771 kein aktiver Bereich ausgewählt 1772 no albums selected 1772 keine Alben ausgewählt 1773 no auto warp 1773 keine automatische Verzerrung 1774 no change 1774 keine Änderung 1775 no current album 1775 kein aktuelles Album 1776 no current edit image 1776 kein aktuelles Bearbeitungsbild 1777 no current file 1777 keine aktuelle Datei 1778 no curve (scanned image) 1778 keine Kurve (gescanntes Bild) 1779 no description 1779 keine Beschreibung 1780 no file selected 1780 keine Datei ausgewählt 1781 no files found 1781 keine Dateien gefunden 1782 no files selected 1782 keine Dateien ausgewählt 1783 no host files selected 1783 keine Basisdateien ausgewählt 1784 no image index: reports disabled \n 1784 kein Bildindex: Berichte deaktiviert \n 1785 no images 1785 keine Bilder 1786 no images found 1786 keine Bilder gefunden 1787 no input files available 1787 keine Eingabedateien verfügbar 1788 no matching files found 1788 keine passenden Dateien gefunden 1789 no matching locations 1789 keine passenden Orte 1790 no metadata level data 1790 keine metadata-Niveaudaten 1791 no metadata tags to report 1791 keine metadata-tags zu melden 1792 no option selected 1792 keine Option ausgewählt 1793 no overlay file selected 1793 keine Overlay-Datei ausgewählt 1794 no photo date, skipped 1794 kein Aufnahmedatum, übersprungen 1795 no plugin output file found 1795 keine Plugin-Ausgabedatei gefunden 1796 no prior edit 1796 keine vorherige Bearbeitung 1797 no prior edit image 1797 kein vorheriges Bearbeitungsbild 1798 no saved folders 1798 keine gespeicherten Ordner 1799 no script file was started 1799 es wurde keine Skriptdatei gestartet 1800 no script files found 1800 keine Skriptdateien gefunden 1801 no select area 1801 kein Bereich ausgewählt 1802 no selection 1802 keine Auswahl 1803 no title 1803 kein Titel 1804 no write permission 1804 keine Schreibberechtigung 1805 no write permission \n 1805 keine Schreibberechtigung \n 1806 no write permission: %s 1806 keine Schreibberechtigung: %s 1807 none 1807 keine 1808 not a known image file 1808 keine bekannte Bilddatei 1809 not an image file 1809 keine Bilddatei 1810 not an indexed image file \n 1810 keine indizierte Bilddatei \n 1811 nothing found 1811 nichts gefunden 1812 nothing left, no change made 1812 nichts übrig, keine Änderung vorgenommen 1813 old file 1813 alte Datei 1814 old image index: reports will omit new files \n 1814 alter Bildindex: Berichte lassen neue Dateien aus \n 1815 old keyword name >> new keyword name 1815 alter keyword-Name >> neuer keyword-Name 1816 omit high pixel 1816 hohen Pixel auslassen 1817 omit low pixel 1817 niedrigen Pixel auslassen 1818 only %d tile images found 1818 nur %d Kachelbilder gefunden 1819 opacity center 1819 Deckkraft Zentrum 1820 opacity edge 1820 Deckkraft Kante 1821 open album 1821 Album öffnen 1822 open and process color chart 1822 Farbtabelle öffnen und verarbeiten 1823 open as new current file 1823 als neue aktuelle Datei öffnen 1824 optional deselect color 1824 optionale Abwahlfarbe 1825 original 1825 Original 1826 originals 1826 Originale 1827 other 1827 andere 1828 out of space for temp files \nsave your edits and quit Fotocx 1828 kein Platz mehr für temporäre Dateien \nBearbeitungen speichern und Fotocx beenden 1829 outline 1829 Umriss 1830 output file exists 1830 Ausgabedatei existiert bereits 1831 output file exists, overwrite? 1831 Ausgabedatei existiert bereits, überschreiben? 1832 output file size change, cannot use select area 1832 Ausgabedateigröße geändert, Bereich auswählen kann nicht verwendet werden 1833 output file: 1833 Ausgabedatei: 1834 output file: %s \n 1834 Ausgabedatei: %s \n 1835 oval 1835 Oval 1836 overlay file missing: %s 1836 Overlay-Datei fehlt: %s 1837 owner 1837 Besitzer 1838 paint 1838 malen 1839 paint color 1839 Malfarbe 1840 paint edits cannot be used for this method 1840 Malbearbeitungen können für diese Methode nicht verwendet werden 1841 paint over transparent areas 1841 über transparente Bereiche malen 1842 paint radius 1842 Malradius 1843 palette 1843 Palette 1844 palette exceeds %d color limit 1844 Palette überschreitet %d-Farben-Grenze 1845 palette file 1845 Palettendatei 1846 palette has %d colors 1846 Palette hat %d Farben 1847 palette loaded, %d colors 1847 Palette geladen, %d Farben 1848 palette: 1848 Palette: 1849 patch area goal 1849 Flickbereichsziel 1850 percent 1850 Prozent 1851 perform edits to include in the script file 1851 Bearbeitungen zum Einschließen in die Skriptdatei durchführen 1852 permissions: 1852 Berechtigungen: 1853 perspective 1853 Perspektive 1854 photo 1854 Foto 1855 picklist file not found: %s 1855 Auswahllistendatei nicht gefunden: %s 1856 pixel = mean of best match neighbors 1856 Pixel = Mittelwert der besten Nachbarn 1857 pixel = median of all neighbors 1857 Pixel = Median aller Nachbarn 1858 please make a choice 1858 bitte eine Wahl treffen 1859 plugin command failed 1859 Plugin-Befehl fehlgeschlagen 1860 plugin menu not found %s 1860 Plugin-Menü nicht gefunden %s 1861 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1861 Plugins: (Jahr Monat Tag alter-Name Sequenz) $yyyy $mm $dd $oldname $s 1862 popup_choose: empty list 1862 popup_choose: leere Liste 1863 position with mouse click/drag 1863 Position mit Mausklick/-ziehen 1864 position: 50 50 1864 Position: 50 50 1865 position: x=%02d y=%02d 1865 Position: x=%02d y=%02d 1866 power 1866 Leistung 1867 power center 1867 Leistungszentrum 1868 power edge 1868 Leistungskante 1869 power: center 1869 Leistung: Zentrum 1870 pref 1870 Voreinst. 1871 previous file 1871 vorherige Datei 1872 previous name 1872 vorheriger Name 1873 print color chart 1873 Farbtabelle drucken 1874 print select area(s) only? 1874 nur ausgewählte(n) Bereich(e) drucken? 1875 prior edit step 1875 vorheriger Bearbeitungsschritt 1876 project complete 1876 Projekt abgeschlossen 1877 project file is defective 1877 Projektdatei ist fehlerhaft 1878 project name cannot have quote characters 1878 Projektname darf keine Anführungszeichen enthalten 1879 pure RGB or black/white dots 1879 reine RGB- oder Schwarz-Weiß-Punkte 1880 quality 1880 Qualität 1881 quality level (70+) 1881 Qualitätsstufe (70+) 1882 radius 1882 Radius 1883 radius: 1883 Radius: 1884 random 1884 zufällig 1885 random position 1885 zufällige Position 1886 rating range 1886 Bewertungsbereich 1887 reading image index file ...\n 1887 Bildindexdatei wird gelesen ...\n 1888 recent files 1888 letzte Dateien 1889 reduce bright 1889 hell reduzieren 1890 reduce dark 1890 dunkel reduzieren 1891 reduce to these limits if larger 1891 auf diese Grenzen reduzieren, wenn größer 1892 refresh 1892 aktualisieren 1893 remove %d duplicates? 1893 %d Duplikate entfernen? 1894 remove all files in list 1894 alle Dateien aus der Liste entfernen 1895 remove duplicate 1895 Duplikat entfernen 1896 remove from set 1896 aus Gruppe entfernen 1897 remove panorama image curving 1897 Panoramabildkrümmung entfernen 1898 remove selected file from list 1898 ausgewählte Datei aus Liste entfernen 1899 rename keywords 1899 keywords umbenennen 1900 repair metadata for %s 1900 metadata für %s reparieren 1901 replace 1901 ersetzen 1902 replace album %s ? 1902 Album %s ersetzen? 1903 replace file 1903 Datei ersetzen 1904 replace old 1904 alte ersetzen 1905 replace old file (OVERWRITE) 1905 alte Datei ersetzen (ÜBERSCHREIBEN) 1906 replace substring within file name 1906 Teilzeichenkette im Dateinamen ersetzen 1907 report type: 1907 Berichtstyp: 1908 req. color match 1908 erf. Farbabgleich 1909 reset 1909 zurücksetzen 1910 resolution 1910 Auflösung 1911 resume from current image 1911 beim aktuellen Bild fortsetzen 1912 right 1912 rechts 1913 right click on image for deselected color 1913 Rechtsklick auf Bild für abgewählte Farbe 1914 sample % 1914 Probe % 1915 save 1915 speichern 1916 save Mashup output file 1916 Mashup-Ausgabedatei speichern 1917 save Mashup project? 1917 Mashup-Projekt speichern? 1918 save area as a PNG file 1918 Bereich als PNG-Datei speichern 1919 save as new file name or type 1919 als neuer Dateiname oder Typ speichern 1920 save as new file version 1920 als neue Dateiversion speichern 1921 save edit, start new text 1921 Bearbeitung speichern, neuen Text beginnen 1922 save metadata to image file 1922 metadata in Bilddatei speichern 1923 save text data to a file 1923 Textdaten in einer Datei speichern 1924 save to .heic/.avif file not supported 1924 Speichern als .heic/.avif-Datei nicht unterstützt 1925 save to .jp2 file not supported 1925 Speichern als .jp2-Datei nicht unterstützt 1926 save to .webp file not supported 1926 Speichern als .webp-Datei nicht unterstützt 1927 scan and save color chart 1927 Farbtabelle scannen und speichern 1928 scanned color chart file 1928 gescannte Farbtabellendatei 1929 scope of neighbor pixels 1929 Bereich der Nachbarpixel 1930 script already started 1930 Skript bereits gestartet 1931 script complete 1931 Skript abgeschlossen 1932 script error: %s, %s 1932 Skriptfehler: %s, %s 1933 script file closed 1933 Skriptdatei geschlossen 1934 script file error 1934 Skriptdateifehler 1935 script file format error: %s 1935 Skriptdateiformatfehler: %s 1936 script file name too big 1936 Skriptdateiname zu groß 1937 script file to run 1937 auszuführende Skriptdatei 1938 search for names in image location metadata 1938 nach Namen in Bildort-metadata suchen 1939 search for text within file folders or file name 1939 nach Text innerhalb der Dateiordner oder des Dateinamens suchen 1940 search for text within image title or description 1940 nach Text innerhalb des Bildtitels oder der Beschreibung suchen 1941 search known locations 1941 bekannte Orte suchen 1942 search range 1942 Suchbereich 1943 search: 1943 Suche: 1944 seconds 1944 Sekunden 1945 seconds to show with text 1945 Sekunden Anzeige mit Text 1946 seconds to show without text 1946 Sekunden Anzeige ohne Text 1947 select all 1947 alle auswählen 1948 select all colors within mouse (flood) 1948 alle Farben innerhalb der Maus auswählen (Flutfüllung) 1949 select area missing or not finished 1949 Bereich auswählen fehlt oder nicht abgeschlossen 1950 select area within mouse 1950 Bereich innerhalb der Maus auswählen 1951 select area within mouse circle 1951 Bereich innerhalb des Mauskreises auswählen 1952 select base image for color matching 1952 Basisbild für Farbabgleich auswählen 1953 select by color, required match level 1953 nach Farbe auswählen, erforderliches Abgleichniveau 1954 select by color, search range 1954 nach Farbe auswählen, Suchbereich 1955 select font 1955 Schriftart auswählen 1956 select image to show with mouse paint 1956 Bild zur Anzeige beim Maus-Malen auswählen 1957 select images randomly 1957 Bilder zufällig auswählen 1958 select initial files 1958 Anfangsdateien auswählen 1959 select line color 1959 Linienfarbe auswählen 1960 select one color within mouse 1960 eine Farbe innerhalb der Maus auswählen 1961 select rectangle 1961 Rechteck auswählen 1962 select source image color first 1962 zuerst Quellbildfarbe auswählen 1963 select surrounding areas matching colors in mouse 1963 umgebende Bereiche mit passenden Farben in der Maus auswählen 1964 selection exceeds %d tags 1964 Auswahl überschreitet %d tags 1965 sepia 1965 Sepia 1966 set a new date/time: 1966 ein neues Datum/Uhrzeit festlegen: 1967 set all 1967 alle festlegen 1968 set current window size 1968 aktuelle Fenstergröße festlegen 1969 set image color from input files 1969 Bildfarbe aus Eingabedateien festlegen 1970 set location from world map 1970 Ort von Weltkarte festlegen 1971 set maximum crop 1971 maximalen Zuschnitt festlegen 1972 shadow 1972 Schatten 1973 shell command used for converting RAW files to RGB 1973 Shell-Befehl zum Konvertieren von RAW-Dateien nach RGB 1974 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1974 Umschalt + Linksklick: Farbe aus Bild aufnehmen \nLinks ziehen: Farbe auf Bild malen \nRechts ziehen: Originalbild wiederherstellen 1975 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1975 Umschalt + Linksklick: Kopierposition synchronisieren \nLinks ziehen: Quellbild zur Maus kopieren \nRechts ziehen: Originalbild wiederherstellen 1976 shift existing date/time (+/–): 1976 vorhandenes Datum/Uhrzeit verschieben (+/–): 1977 shift+click on image to select color 1977 Umschalt+Klick auf Bild, um Farbe auszuwählen 1978 shortcut function not found: %s 1978 Tastenkürzel-Funktion nicht gefunden: %s 1979 shortcut key: 1979 Tastenkürzel: 1980 shortcut not found: %s 1980 Tastenkürzel nicht gefunden: %s 1981 show area outlines 1981 Bereichsumrandungen anzeigen 1982 show hidden files and folders 1982 versteckte Dateien und Ordner anzeigen 1983 show transient objects 1983 vorübergehende Objekte anzeigen 1984 size of mouse selection circle 1984 Größe des Mausauswahlkreises 1985 smooth 1985 glätten 1986 source file: 1986 Quelldatei: 1987 source image failure (scale too big?) 1987 Fehler bei Quellbild (Skalierung zu groß?) 1988 source image scale 1988 Quellbildskalierung 1989 specify a thumbnail folder 1989 einen thumbnail-Ordner angeben 1990 specify at least 1 top image folder 1990 mindestens 1 oberen Bildordner angeben 1991 specify background size and color 1991 Hintergrundgröße und -farbe angeben 1992 specify files and keywords 1992 Dateien und keywords angeben 1993 spot size limit 1993 Punktgrößengrenze 1994 start 1994 Start 1995 start a new script file 1995 eine neue Skriptdatei starten 1996 start album 1996 Startalbum 1997 start blob condensation process 1997 Klumpen-Zusammenfassungsprozess starten 1998 start file 1998 Startdatei 1999 start folder 1999 Startordner 2000 start from first image in album 2000 vom ersten Bild im Album starten 2001 start fusion process 2001 Fusionsprozess starten 2002 start over at end of album 2002 am Ende des Albums von vorne beginnen 2003 start warp 2003 Verzerrung starten 2004 start with previous image file, gallery of recent files, etc. 2004 mit vorheriger Bilddatei, Galerie der letzten Dateien usw. beginnen 2005 startup album is invalid 2005 Start-Album ist ungültig 2006 startup file is invalid 2006 Startdatei ist ungültig 2007 startup folder is invalid 2007 Startordner ist ungültig 2008 status: %s \n 2008 Status: %s \n 2009 status: completed \n 2009 Status: abgeschlossen \n 2010 stay open 2010 geöffnet bleiben 2011 step 2011 Schritt 2012 stop 2012 stopp 2013 stop blob condensation process 2013 Klumpen-Zusammenfassungsprozess stoppen 2014 stop fusion process 2014 Fusionsprozess stoppen 2015 supply a file name 2015 einen Dateinamen angeben 2016 tag name 2016 tag-Name 2017 tag name %s not in xmeta tag list 2017 tag-Name %s nicht in xmeta-tag-Liste 2018 tag value 2018 tag-Wert 2019 target file: 2019 Zieldatei: 2020 template 2020 Vorlage 2021 test: show changes, do not update files 2021 Test: Änderungen anzeigen, Dateien nicht aktualisieren 2022 text 2022 Text 2023 text file is defective 2023 Textdatei ist fehlerhaft 2024 text time 2024 Textzeit 2025 this function cannot be scripted 2025 diese Funktion kann nicht per Skript ausgeführt werden 2026 thumbnail file 2026 thumbnail-Datei 2027 thumbnails deleted: %d \n 2027 gelöschte thumbnails: %d \n 2028 thumbnails folder: %s \n 2028 thumbnails-Ordner: %s \n 2029 tile area goal 2029 Kachelbereichsziel 2030 tile gap 2030 Kachelabstand 2031 tile size 2031 Kachelgröße 2032 time 2032 Zeit 2033 title/desc. 2033 Titel/Beschr. 2034 to add images to current set, \nsearch all images 2034 um Bilder zur aktuellen Gruppe hinzuzufügen, \nalle Bilder durchsuchen 2035 to remove images from current set, \nsearch current set 2035 um Bilder aus der aktuellen Gruppe zu entfernen, \naktuelle Gruppe durchsuchen 2036 too many categories 2036 zu viele Kategorien 2037 too many files, cannot continue 2037 zu viele Dateien, kann nicht fortfahren 2038 too many keywords in a category 2038 zu viele keywords in einer Kategorie 2039 top image folders: \n 2039 oberste Bildordner: \n 2040 transition 2040 Übergang 2041 transitions 2041 Übergänge 2042 trash 2042 Papierkorb 2043 trimmed color chart file 2043 zugeschnittene Farbtabellendatei 2044 unable to save bookmarks file 2044 Lesezeichendatei kann nicht gespeichert werden 2045 unknown edit function: %s 2045 unbekannte Bearbeitungsfunktion: %s 2046 unknown file type 2046 unbekannter Dateityp 2047 unknown or empty album: %s 2047 unbekanntes oder leeres Album: %s 2048 unsharp mask 2048 Unscharfmaskierung 2049 update 2049 aktualisieren 2050 updating albums ...\n 2050 Alben werden aktualisiert ...\n 2051 upper 2051 oben 2052 upsize 2052 vergrößern 2053 use 2053 verwenden 2054 use a saved Mashup project 2054 ein gespeichertes Mashup-Projekt verwenden 2055 use average 2055 Durchschnitt verwenden 2056 use custom color palette 2056 benutzerdefinierte Farbpalette verwenden 2057 use median 2057 Median verwenden 2058 use option to stop accidental quit 2058 Option verwenden, um versehentliches Beenden zu verhindern 2059 use previous input 2059 vorherige Eingabe verwenden 2060 use previous location 2060 vorherigen Ort verwenden 2061 use prior edit step: 2061 vorherigen Bearbeitungsschritt verwenden: 2062 use the current image file 2062 die aktuelle Bilddatei verwenden 2063 variance 2063 Varianz 2064 versions 2064 Versionen 2065 vertical 2065 vertikal 2066 video files not supported (install ffmpeg) 2066 Videodateien nicht unterstützt (ffmpeg installieren) 2067 view album 2067 Album ansehen 2068 waiting 2068 warten 2069 warp 2069 verzerren 2070 warp and align selected image with mouse drags 2070 ausgewähltes Bild mit Mausziehen verzerren und ausrichten 2071 warp and fine-align selected image with neighbor 2071 ausgewähltes Bild mit Nachbarn verzerren und feinausrichten 2072 warp span 2072 Verzerrungsspanne 2073 wavelength 2073 Wellenlänge 2074 width 2074 Breite 2075 writing updated image index file \n 2075 aktualisierte Bildindexdatei wird geschrieben \n 2076 x-count 2076 x-Anzahl 2077 x-offset 2077 x-Versatz 2078 y-count 2078 y-Anzahl 2079 y-offset 2079 y-Versatz 2080 years 2080 Jahre 2081 you can close this window now \n 2081 Sie können dieses Fenster jetzt schließen \n 2082 you cannot use new name and replace text together 2082 Sie können nicht gleichzeitig neuen Namen und Text ersetzen verwenden 2083 you must use either $s or $oldname 2083 Sie müssen entweder $s oder $oldname verwenden 2084 zoom image 2084 Bild zoomen 2085 zoom via mouse wheel or Keys +/=/-/↑/↓ 2085 zoomen über Mausrad oder Tasten +/=/-/↑/↓ 2086 zoom-in 2086 zoom-in 2087 zoom-out 2087 zoom-out fotocx/data/translations/ug_hu0000664000175000017500000107217515247006657015537 0ustar micomico- ^FOTOCX FELHASZNÁLÓI KÉZIKÖNYV^ v.26.8 Megtekinthető a Fotocx Súgó > Felhasználói kézikönyv menüpontban - {FOTOCX HASZNÁLATA} {ELSŐ INDÍTÁS} - képfájlok keresése és indexelése a gyors kereséshez {FELHASZNÁLÓI KÉZIKÖNYV} ← ^kattints ide^ - hogyan használd ezt a felhasználói kézikönyv böngészőt {ABLAKNÉZETEK ÉS MENÜK} - felső szintű ablakok és a hozzájuk tartozó menük {FÁJL NÉZET} - Fájlnézet ablak (egyetlen képfájl megtekintése) {GALÉRIA NÉZET} - Galérianézet ablak (mappa megtekintése thumbnails formájában) {TÉRKÉP NÉZET} - térképnézet ablak (térkép megtekintése képhely-jelölőkkel) {HÚZÁS ÉS EJTÉS} - fájlok húzásának és ejtésének módszerei {ELJÁRÁSOK SZERKESZTÉSE} - hogyan szerkeszthetők a képfájlok {MUNKAFOLYAMAT SZERKESZTÉSE} - alternatív szerkesztési módszerek - egyszerű és összetett {EGÉR TULAJDONJOGA} - párbeszédablak-egér vezérlés és kölcsönhatás {EGÉR ALT+JOBB GOMB} - egér jobb gomb touchpadekhez/érintőképernyőkhöz {PÁRBESZÉDABLAK GOMBJAI} - párbeszédablak lezárási lehetőségei {ESCAPE BILLENTYŰ} - az Escape billentyű funkciói {NEM SZABVÁNYOS PÁRBESZÉDABLAK ELEMEK} - hogyan használd a nem szokványos párbeszédablak-vezérlőket {GÖRBE SZERKESZTÉSE} - hogyan módosítsd a szerkesztési funkciókban használt görbéket {MOUSE PAINTING} - kép helyi szerkesztése az egérrel {KÖTEGELT FELDOLGOZÁS} - a köteges feldolgozási funkciók áttekintése {KÉPFÁJLOK KIJELÖLÉSE} - képfájl-kiválasztási eljárás {GYORSBILLENTYŰK} - felugró menük, gyorsbillentyűk, egyéni felhasználói menü {EGÉR FUNKCIÓK} - egérfunkciók a fájl-/galéria-/térképnézetekhez {PARANCS PARAMÉTEREK} - Fotocx parancssori paraméterek - {FÁJL MENÜ} {ÚJ MUNKAMENET} - új Fotocx munkamenet indítása külön ablakban {KÉPFÁJL MEGNYITÁSA} - képfájl megnyitása megtekintésre vagy szerkesztésre {2 FÁJL VÁLTOGATÁSA} - váltás a két legutóbb megtekintett képfájl között {3 FÁJL VÁLTOGATÁSA} - váltás a három legutóbb megtekintett képfájl között {360°-OS PANORÁMA MEGTEKINTÉSE} - 360°-os panorámakép forgatható nézőponttal {ÜRES KÉP} - üres kép létrehozása megadott mérettel és színnel {ÜRES KÉP} - új üres kép létrehozása {MÁSOLÁS/ÁTHELYEZÉS} - képfájl másolása vagy áthelyezése másik mappába {MÁSOLÁS ASZTALRA} - képfájl másolása az asztalra {MÁSOLÁS VÁGÓLAPRA} - képfájl másolása a vágólapra {TÖRLÉS/KUKA} - képfájl törlése vagy kukába helyezése {HÁTTÉRKÉP BEÁLLÍTÁSA} - asztali háttérkép beállítása az aktuális képfájlból {KÉP NYOMTATÁSA} - képfájl nyomtatása {KALIBRÁLT NYOMTATÁS} - nyomtatás színkalibrációs adatok felhasználásával {NYOMTATÓ KALIBRÁLÁSA} - nyomtató színének kalibrálása - színeltolódások kompenzálása - {GALÉRIA MENÜ} {GALÉRIA ÁTTEKINTÉS} {THUMBNAIL NÉZET} - Galérianézet thumbnailekkel és fájlnevekkel {METAADAT NÉZET} - Galérianézet thumbnaillel és alapvető metadatával {LEGUTÓBBI FÁJLOK} - a legutóbb megtekintett képfájlok galérianézete {LEGÚJABB FÁJLOK} - a legújabb képfájlok galérianézete {GALÉRIA RENDEZÉSE} - egy galéria rendezési sorrendjének módosítása {GALÉRIA SZŰRŐ} - legújabbak, legrégebbiek, mintára illeszkedők kiválasztása ... {GALÉRIA KEZDŐLAP} - ugrás a galéria elejére {GALÉRIA VÉGE} - ugrás a galéria végére {JELENLEGI FÁJL MAPPÁJA} - az aktuális galéria beállítása az aktuális fájl mappájából {LEGUTÓBBI MAPPÁK} - a legutóbb megtekintett mappák listájának megtekintése, kiválasztás {MAPPAFA} - képfájlmappák megtekintése fastruktúrában, kiválasztás {FÁJLOK KIJELÖLÉSE} - fájlok kiválasztása köteg, szkript vagy album bemenetéhez {KÖNYVJELZŐK} - könyvjelzők listájának megtekintése, ugrás könyvjelzőhöz {KÖNYVJELZŐK SZERKESZTÉSE} - könyvjelzők hozzáadása, eltávolítása, rendezése - {MAPS MENU} {VILÁGTÉRKÉP} - internetes világtérkép áttekintés {MEGJELENÍTÉS TÉRKÉPEN} - az aktuális kép helyzetének megjelenítése a térképen - {ALBUMOK MENÜ} {ALBUMOK} - képgyűjtemények létrehozása és rendezése {ALBUM LÉTREHOZÁSA} - új album létrehozása (kiválasztott képek galériája) {ALBUM ÁTNEVEZÉSE} - meglévő album átnevezése {ALBUM TÖRLÉSE} - meglévő album törlése {ALBUM KIVÁLASZTÁSA} - album kiválasztása és a képek galériájának megjelenítése {JELENLEGI ALBUM} - az aktuális (legutóbb használt) album megjelenítése {GALÉRIÁBÓL ALBUM} - az aktuális galéria mentése névvel ellátott albumként {ALBUM SZERKESZTÉSE} - képfájlok hozzáadása, eltávolítása, átrendezése egy album galériájában {ALBUMOK FRISSÍTÉSE} - albumok frissítése frissített képfájlokhoz (új verziók) {ALBUM TÖMEGES FRISSÍTÉSE} albumok tömeges frissítése (tagfájlok hozzáadása/eltávolítása/cseréje) {DIAVETÍTÉS} - diavetítés animált képátmenetekkel és pásztázással/zoom-mal - {EGYÉNI MENÜ} - egyéni felhasználói menü a gyakran használt funkciókhoz {SZKRIPTFÁJLOK} - szkriptfájlok áttekintése {SZKRIPT SZERKESZTÉSE} - szerkesztések rögzítése szkriptben egyéni szerkesztési funkció létrehozásához {SZKRIPT FUTTATÁSA} - szkript végrehajtása az aktuális képen {KÖTEGELT SZKRIPT} - szkript végrehajtása a kiválasztott képfájlokon {BEÉPÜLŐK} - plugin szerkesztési funkció indítása, plugin kimeneti fájl megnyitása - {ZOOM} - kép vagy thumbnails zoomolása be/ki egérrel vagy billentyűzettel - {ELŐZŐ/KÖVETKEZŐ} - ugrás az előző vagy következő képre egérrel vagy billentyűzettel - {FÁJL MENTÉSE} - képfájl mentése (csere, új verzió, új fájlnév) - {METAADAT MENÜ} {FŐ METAADAT MEGTEKINTÉSE} - a fő képmetadata felsorolása {ÖSSZES METAADAT MEGTEKINTÉSE} - az összes képmetadata felsorolása {KULCSSZAVAK ÁTTEKINTÉSE} - a képkereséshez használt keywords {GEOTAGS OVERVIEW} - helynevek és geokoordináták kereséshez {FŐ METAADAT SZERKESZTÉSE} - gyakran használt metadata szerkesztése {BÁRMELY METAADAT SZERKESZTÉSE} - bármely metadata szerkesztése (hozzáadás, eltávolítás, módosítás) {METAADAT TÖRLÉSE} - megadott metadata vagy az összes metadata törlése {METAADAT MÁSOLÁSA} - metadata másolása egyik képfájlból a másikba {METAADAT JAVÍTÁSA} - a metadata-szerkesztést akadályozó, hibásan formázott metadata javítása {KULCSSZAVAK KEZELÉSE} - felhasználó által meghatározott keywords kezelése {FELIRATOK} - fájlnév, cím, leírás megjelenítése a kép sarkában {HELYEK/DÁTUMOK} - képhelyek/dátumok felsorolása, kattintás a galériához {IDŐVONAL} - képek számának megjelenítése év/hónap szerint, kattintás a galériához {METAADAT TAGEK} - képek számának megjelenítése tag érték szerint, kattintás a galériához {AUTOMATIKUS KERESÉS} - szkriptelt keresési funkció fájlok megtalálásához {KÉPEK KERESÉSE} - keresés bármely metadata vagy mappa-/fájlnév alapján - {KIJELÖLÉS MENÜ} {TERÜLET ÁTTEKINTÉS} - terület kijelölése - fogalmak és használat {TERÜLET KIJELÖLÉSE} - képelem vagy terület kijelölése külön szerkesztéshez {TERÜLET HÉZAG KERESÉSE} - rés keresése egy kézzel rajzolt terület körvonalában {TERÜLET KEVERÉSE} - egy kijelölt területen belül végzett szerkesztések egérrel történő összeolvasztása {TERÜLET MEGJELENÍTÉSE/ELREJTÉSE} - a terület körvonalainak megjelenítése vagy elrejtése {TERÜLET ENGEDÉLYEZÉSE/LETILTÁSA} - egy terület engedélyezése vagy letiltása szerkesztéshez {TERÜLET INVERTÁLÁSA} - egy terület megfordítása (a külső/belső területek felcserélése) {TERÜLET TÖRLÉSE} - egy terület eltávolítása {TERÜLET MÁSOLÁSA/BEILLESZTÉSE} - terület másolása vagy beillesztése az aktuális képbe {TERÜLET BETÖLTÉSE/MENTÉSE} - terület betöltése fájlból vagy mentése fájlba - {VISSZAVONÁS/ISMÉTLÉS GOMB} - az aktuális kép szerkesztéseinek sorozatos visszavonása vagy ismételt végrehajtása - {SZERKESZTÉS MENÜ} {FORGATÁS} - kép forgatása vagy vízszintezése {EGYENESBE ÁLLÍTÁS} - elforgatott vagy tükrözött kép egyenesbe állítása {VÁGÁS} - a kép széleinek vágása (levágása) {RETUSÁLÁS} - fényerő, kontraszt, szín, telítettség szerkesztése {ÁTMÉRETEZÉS} - a kép pixelméreteinek módosítása {OSZTOTT KÉPERNYŐ} - a változtatások előtte/utána megtekintése osztott képernyővel {ELTÉRÉSEK MEGJELENÍTÉSE} - a szerkesztés közbeni változások kiemelése (vagy bármely két kép esetén) {MARGÓK} - szegélyek hozzáadása a képhez, bármilyen színnel vagy átlátszósággal {JELÖLÉS} - rajzolás a képen: szöveg, vonal/nyíl, téglalap, ovális {SZÍNMÓD} - átalakítás fekete-fehérré, színessé, negatívvá, pozitívvá {FESTÉS SZERKESZTÉSE} - egy szerkesztési funkció helyi és fokozatos egérrel történő festése {KÉP FESTÉSE} - festés egérrel egy színnel, ecsetmérettel és átlátszatlansággal {ÁTLÁTSZÓSÁG FESTÉSE} - növekvő átlátszóság festése az egérrel {TERÜLET KITÖLTÉSE} - kijelölt vagy átlátszó területek kitöltése egy színnel {MÁSOLÁS KÉPEN BELÜL} - pixelek másolása egy képen belül az egérrel {MÁSOLÁS KÉPBŐL} - pixelek másolása egy másik képről az egérrel {KORÁBBI SZERKESZTÉS MÁSOLÁSA} - pixelek másolása korábbi szerkesztésekből az egérrel - {JAVÍTÁS MENÜ} {ÉLESÍTÉS} - egy elmosódott kép élesítése, több módszerrel {ELMOSÁS} - egy kép vagy képterület elmosása, több módszerrel {ZAJCSÖKKENTÉS} - a kép zajának csökkentése (apró véletlenszerű foltok) {KÖDMENTESÍTÉS} - köd/pára hozzáadása vagy eltávolítása egy képből vagy kijelölt területből {VÖRÖSSZEM} - vörösszem-hatás eltávolítása vakus fotókból {INTELLIGENS TÖRLÉS} - villanyvezetékek, táblák, más apró zavaró elemek eltávolítása {GLÓRIA ELTÁVOLÍTÁSA} - az élesítés és más funkciók által hagyott glóriák eltávolítása {JPEG ARTEFAKTOK} - artefaktok elnyomása erősen tömörített fájlokban {ÉLSIMÍTÁS} - pixelesedés (recézettség) elnyomása az élek mentén {RGB BEÁLLÍTÁSA} - a kép színeinek beállítása RGB vagy CMY színekkel {HSL BEÁLLÍTÁSA} - színek kiválasztása és módosítása a HSL színmodellel {POR ELTÁVOLÍTÁSA} - porfoltok eltávolítása régi fotókból származó képekről {SZEGÉLYEK} - a szélek menti színszegélyek javítása (kromatikus aberráció) - {FINOMHANGOLÁS MENÜ} {HISZTOGRAM LAPÍTÁSA} - a fényerő-hisztogram kiegyenlítése a jobb részletek érdekében {HELYI KONTRASZT} - a helyi terület fényerejéhez igazított kontraszt hozzáadása {KONTRASZT ERŐSÍTÉSE} - a meglévő kontraszt erősítése a részletek kiemeléséhez {GLOBÁLIS RETINEX} - RGB-értékek átskálázása nagyobb tartományhoz {HELYI RETINEX} - RGB-értékek átskálázása nagyobb tartományhoz {TELÍTETTSÉG} - színtelítettség beállítása fényerő alapján {LÁGY FÓKUSZ} - klasszikus „lágy fókusz” hatás alkalmazása egy képre {FÉNYERŐ ÁTMENET} - fényerő-/szín-átmenet hozzáadása a képhez {VINYETTÁLÁS} - fényerő/szín sugárirányú módosítása egy kiválasztott középpont körül - {EFFEKTEK MENÜ} {KÖRVONALAK} - egy kép körvonalrajzzá alakítása {VÁZLAT1} - egy kép szimulált vázlattá alakítása (1) {VÁZLAT2} - egy kép szimulált vázlattá alakítása (2) {RAJZFILM} - egy kép rajzfilmszerű rajzzá alakítása {DOMBORÍTÁS} - egy kép szimulált dombornyomattá alakítása (3D hatás) {CSEMPÉK1} - egy kép négyzetes csempékké alakítása 3D hatással {CSEMPÉK2} - egy kép szabálytalan, a képhez illeszkedő csempékké alakítása {FESTÉS} - egy kép szimulált festménnyé alakítása {TEXTÚRA} - textúra hozzáadása egy képhez vagy kijelölt területhez {FÚZIÓ} - finom részletek elnyomása az élesség megtartása mellett {SZÍNEK EGYEZTETÉSE} - az egyik kép színeinek illesztése egy másik képhez {MINTA} - háttérminta hozzáadása egy képhez {KERESZTVONALKÁZÁS} - átalakítás vázlattá keresztező párhuzamos vonalak segítségével {DITHER} - a kép pixelesítésének vagy poszterizálásának különböző módjai {METSZET} - egy kép fekete-fehér vonalakká alakítása {CSILLOGÁS HOZZÁADÁSA} - fénycsík hozzáadása a kép fényes tárgyai köré {MOZAIK} - kép mozaikká alakítása képekből készült csempék felhasználásával {ZAJ HOZZÁADÁSA} - véletlenszerű zaj hozzáadása egy képhez {SZÍNEK BEÁLLÍTÁSA} - a színek számának csökkentése (poszterizálás) {SZÍNEK ELTOLÁSA} - az RGB színek fokozatos eltolása GBR-re vagy BRG-re {IDEGEN SZÍNEK} - véletlenszerű furcsa színek hozzáadása egy képhez {EGYÉNI KERNEL} - egyéni konvolúciós kernel szerkesztése és alkalmazása - {TORZÍTÁS MENÜ} {KIEGYENESÍTÉS} - görbe vonalú képek kiegyenesítése, különösen panorámáké {PERSPEKTÍVA} - tompaszögből fényképezett tárgy kiegyenesítése {TERÜLET TORZÍTÁSA} - egy kijelölt képterület torzítása egérrel húzva {WARP LINEAR1} - kép torzítása egérhúzással - lineáris 1 torzítás {WARP LINEAR2} - kép torzítása egérhúzással - lineáris 2 torzítás {GÖRBE TORZÍTÁS} - kép torzítása egérhúzással - íves torzítás {AFFIN TORZÍTÁS} - kép torzítása egérhúzással - a párhuzamos vonalak megmaradnak {SUGÁRIRÁNYÚ TORZÍTÁS} - hordó- vagy párnatorzítás hozzáadása vagy eltávolítása {KÖZELI KÉP KITORZÍTÁSA} - közeli arcfotó torzításának eltávolítása (nagy orr) {HULLÁMOK KÉSZÍTÉSE} - egy kép torzítása hullámmintával {CSAVARÁS} - egy kép csavarása egy kiválasztott középpont körül {GÖMB} - egy kép gömbszerű alakra görbítése {KIFORDÍTÁS} - minden pixel közép-szél távolságának megfordítása {TINY PLANET} - egy panorámakép körré csavarása {ESCHER SPIRÁL} - egy kép végtelen befelé tartó spirállá alakítása {FOTÓ LAPÍTÁSA} - egy görbült felületről készült fotó kilapítása - {EGYESÍTÉS MENÜ} {HDR} - sötét/világos képek egyesítése kiterjesztett fényerőtartományhoz {HDF} - közeli/távoli fókuszú képek egyesítése kiterjesztett mélységélességhez {STACK/FESTÉS} - képek egyesítése átmeneti autók, turisták stb. eltávolításához {STACK/ZAJ} - képek egyesítése a zaj csökkentéséhez átlagolással {STACK/RÉTEGEK} - képverziók egyesítése, terület/verzió kijelölése/festése {PANORÁMA} - egy képsorozat vízszintes egyesítése {CIM FÁJLOK MEGJELENÍTÉSE} - az aktuális/legutóbbi egyesített kép bemeneti fájljainak megjelenítése {MASHUP} - képek és formázott szöveg elrendezése egyéni elrendezésben {KÉPTÖMB} - sok kép összekapcsolása kompakt tömbformátumba - {KÖTEGELT MENÜ} {KÖTEGELT ÁTALAKÍTÁS} - másolás, áthelyezés, átméretezés, átnevezés, konvertálás, szöveg hozzáadása ... {KÖTEGELT MÁSOLÁS/ÁTHELYEZÉS} - kiválasztott képfájlok másolása/áthelyezése új mappába {KÖTEGELT EGYENESBE ÁLLÍTÁS} - elforgatott képfájlok keresése és egyenesbe állítása {KÖTEGELT TÖRLÉS/KUKA} - kiválasztott képfájlok törlése vagy kukába helyezése {KÖTEGELT RÁTÉT} - átfedő kép (szerzői jog ...) hozzáadása a kiválasztott képekhez {KÖTEGELT KULCSSZAVAK} - keywords hozzáadása vagy eltávolítása a kiválasztott képfájlokhoz {KÖTEGELT KULCSSZÓ ÁTNEVEZÉS} - keywords átnevezése vagy törlése az összes képfájlnál {KÖTEGELT KULCSSZÓ TÖRLÉS} - nem kívánt keywords eltávolítása az összes képfájlból {KÖTEGELT FOTÓ DÁTUM} - fotódátumok vagy -idők módosítása, vagy időzóna-eltolás {KÖTEGELT METAADAT MÓDOSÍTÁS} - metadata hozzáadása vagy módosítása a kiválasztott képfájlokhoz {KÖTEGELT METAADAT JELENTÉS} - metadata jelentés a kiválasztott vagy az összes képfájlhoz {KÖTEGELT GEOTAGEK} - geotags hozzáadása vagy módosítása a kiválasztott vagy az összes képfájlhoz {FÁJLOK EXPORTÁLÁSA} - kiválasztott fájlok exportálása egy mappába (pl. webre feltöltéshez) - {ESZKÖZÖK MENÜ} {FÁJLOK INDEXELÉSE} - egyszeri feladat az összes képfájl megkeresésére és indexelésére {FOTOCX ALAPMAPPA ÁTHELYEZÉSE} - a Fotocx home mappájának áthelyezése (felhasználói adatok és beállítások) {BEÁLLÍTÁSOK} - felhasználói preferenciák és beállítások a Fotocx működéséhez {GYORSBILLENTYŰK} - a menüfunkciók gyorsbillentyűinek megjelenítése és módosítása {RGB HISZTOGRAM} - fényerő-hisztogram grafikon az aktuális képhez {KÉP NAGYÍTÁSA} - az egér nagyítóüveggé alakítása a kép felett {KÉP MÉRÉSE} - pixeltávolságok mérése a képen belül (egérkattintásokkal) {RGB MEGJELENÍTÉSE} - RGB-értékek megjelenítése az egér pozíciójánál vagy kijelölt pontoknál {RÁCS BEÁLLÍTÁSOK} - rácsvonalak megjelenítése vagy eltávolítása, vonalszám vagy távolság beállítása {VONAL SZÍNE} - a kijelölt terület körvonalainak színbeállítása {SÖTÉT/VILÁGOS PIXELEK} - eszköz a levágás (clipping) kiemeléséhez {MONITOR SZÍNE} - a monitor fényerejének és kontrasztjának beállítása {DUPLIKÁTUMOK KERESÉSE} - duplikált képek keresése egy galériában vagy az összes képben {HIBÁS FÁJLOK KERESÉSE} - olvashatatlan képfájlok keresése, törlés/áthelyezés/javítás {ERŐFORRÁSOK MEGJELENÍTÉSE} - CPU-idő és az aktuális memóriahasználat megjelenítése {FORDÍTÁSOK} - GUI-fordítások létrehozása vagy módosítása - {SÚGÓ MENÜ} - felhasználói kézikönyv, útmutató, változásnapló, a Fotocx névjegye, eltávolítás - {EGYÉB TÉMÁK} {VIDEO FILES} - videófájlok, thumbnails, videók lejátszása {DIÁK ÉS NEGATÍVOK} - hogyan digitalizáld a diákat és filmnegatívokat {FOTOCX KORLÁTOZÁSOK} - méret- és teljesítménykorlátok {FOTOCX WINDOWS 11-HEZ} - a Fotocx telepítése Windows 11 WSL-re {ADATVÉDELEM} - a Fotocx adatvédelmi szabályzata {PROBLEM, QUESTION, SUGGESTION} - a Fotocx szerzőjének elérhetősége - - TOPIC: FOTOCX HASZNÁLATA - - TOPIC: ELSŐ INDÍTÁS - ^Külső programok A Fotocx jelenti a szükséges és opcionális külső programokat, valamint az egyes programok által nyújtott funkciót. Ha valamelyik szükséges program hiányzik, telepítsd, majd indítsd újra a Fotocx-et. - ^Első indexelés A Fotocx indexelni fogja a képfájljaidat. Ez lehetővé teszi a galériaoldalak (thumbnails) gyors megjelenítését, az indexelt metadata alapján történő gyors keresést, valamint a kattintható térképjelölők használatát a képek hely szerinti megtekintéséhez. Meg kell adnod egy vagy több 'felső szintű' képmappát (pl. /home//Pictures). Az almappák automatikusan bekerülnek. A nem képfájlok ezekben a mappákban figyelmen kívül maradnak. Használd a [select] gombot a felső szintű képmappák megkereséséhez és hozzáadásához. A gyakorlati korlát körülbelül 30 felső szintű mappa. Mindegyiknek lehet több száz almappája. - ^Thumbnails Ez az a mappa, ahová a thumbnail fájlok kerülnek. Használd a megadott alapértelmezést, vagy válassz másik helyet. - ^Indexelési idő Az indexelési sebesség néhány száztól >10 ezer fájl/percig terjedhet, a képfájlok típusától és méretétől, valamint a számítógéped sebességétől függően. Amikor új képfájlokat adsz a gyűjteményedhez, a Fotocx következő indításakor indexeli az új fájlokat. Ha sok új fájl van, az indításnak időre lesz szüksége azok indexeléséhez. - ^Kép címének és leírásának összevonása A Fotocx képindexelő funkciója a hiányzó cím és leírás metadata-t az elérhető alternatív metadata tag-ek egyikével pótolja, ha van ilyen: headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. Ez azért történik, hogy mindig csak a 'title' és 'description' mezőkkel tudj megtekinteni/szerkeszteni/keresni. Ez az átalakítási folyamat viszonylag lassú (2200 fájl/perc az én erős számítógépemen). Ez akkor történik, amikor az új képfájlokat először indexelik. Semmi nem törlődik. - - TOPIC: FELHASZNÁLÓI KÉZIKÖNYV Nyisd meg a felhasználói kézikönyvet a Súgó > Felhasználói kézikönyv menüből. A Fotocx használata közben megnyomhatod az F1 billentyűt, hogy megtekintsd az aktuális vagy legutóbbi menüfunkcióhoz tartozó felhasználói kézikönyv témát. - A szöveg görgetéséhez használd a fel/le nyíl és a page up/down billentyűket. A [Keresés] gomb megnyit egy párbeszédablakot a szöveges kereséshez. Nyomd meg újra a [Keresés] gombot a következő előforduláshoz. - A félkövér, nagybetűs szöveg egy témára mutató kattintható link, pl. {FÁJLOK INDEXELÉSE}. Használd a [<] és [>] gombokat, hogy oda-vissza lépkedj a legutóbb megtekintett témák között. A [Recent] gomb megjeleníti a legutóbb megtekintett témák kattintható listáját. - - TOPIC: ABLAKNÉZETEK ÉS MENÜK +image: fotocx-views.jpg - ^Menügombok Amikor egy menüre kattintasz, egy felugró almenü jelenik meg. A felső három menü (Fájl, Galéria, Térképek) beállítja a megfelelő nézetmódot. Az F/G/M billentyűk is használhatók. - - TOPIC: FÁJL NÉZET Egy kép tölti ki a teljes Fotocx ablakot. Zoomolj be/ki bal/jobb egérkattintással. A Z billentyű váltogat az ablakhoz igazítás és az 1x-es képméret (1 képpixel = 1 megjelenítési pixel) között. Egy zoomolt kép mozgatásához húzd az egeret bal gombbal a kép felett. Az egérgörgő is használható a kép zoomolására be vagy ki. Használd a menügombokat (Szerkesztés, Javítás stb.) a kép módosításához. Használd a Fájl mentése gombot a módosított fájl mentéséhez: csere, új verzió létrehozása, vagy új fájl létrehozása (új néven). - ^Billentyűzet bal/jobb nyílbillentyűk Az előző vagy következő képfájl megtekintése az aktuális galériában. - ^fel/le nyílbillentyűk Mint fent, de csak a legutóbbi verziók jelennek meg, vagy az eredeti, ha nincs verzió. - - TOPIC: GALÉRIA NÉZET Az aktuális galéria összes képfájlja thumbnails tömbjeként jelenik meg. - ^Galéria típusok • Mappa: az összes képfájl és almappa egyetlen mappában (könyvtárban) • Album: különböző mappákból származó képfájlok, a felhasználó által elrendezve • Legutóbbi fájlok: a legutóbb megtekintett vagy szerkesztett képfájlok • Legújabb fájlok: a legutóbb hozzáadott vagy módosított képfájlok • Keresési eredmények: a Keresés funkció által talált képek. Ez is egy album. - ^Galéria funkciók • bal kattintás a kép thumbnailjén: a kép megnyitása Fájlnézet módban • jobb kattintás a kép thumbnailjén: felugró menü a gyakori funkciókkal • kattintás a mappa thumbnailjén: az adott mappa megnyitása Galéria módban • a mappagaléria TOP sávja: szülőmappák - kattints, hogy odalépj • [TOP] gomb: a felső szintű mappák listája - kattints, hogy odalépj • görgetősávok: fel/le görgetés a galérián belül • fel/le nyílbillentyűk: a galéria görgetése egy sorral • page up/down billentyűk: a galéria görgetése egy oldallal • home/end billentyűk: a galéria elejére (tetejére) és végére (aljára) ugrás • egérgörgő: a galéria görgetése fel és le • [+] és [-] billentyűk: a thumbnail méretének növelése/csökkentése - ^Galéria felugró képek • Kattints a thumbnailre a középső egérgombbal a felugró képhez • Kattints a thumbnailre shift + bal egérgombbal a felugró képhez • Bal kattintás a felugró képre: a kép nagyobb zoomolása • Jobb kattintás a felugró képre: a felugró kép bezárása • Egérgörgő: a felugró kép nagyobbra vagy kisebbre zoomolása • F11 billentyű: a felugró kép teljes képernyőssé tétele • Escape billentyű: a felugró kép bezárása • Több felugró ablak is használható a képek összehasonlításához - - TOPIC: TÉRKÉP NÉZET Tekintsd meg a képek helyének megfelelő jelölőket tartalmazó térképeket. Kattints egy jelölőre a megfelelő képek galériájához. Ez attól függ, hogy a képfájljaidba be van-e ágyazva geokoordináta (latitude, longitude). A modern fényképezőgépek ezt automatikusan beillesztik, de te magad is hozzáadhatod ezt az adatot. Kezdetben egy világtérkép jelenik meg. Használd az egérgörgőt bármely helyszín be-/kizoomolásához. Húzással eltolhatod a térkép középpontját. Az egész világ megtekinthető bármilyen léptékben, egészen utcaszintig. - - TOPIC: HÚZÁS ÉS EJTÉS Ha megnyitsz két Fotocx munkamenetet, fájlokat húzhatsz és ejthetsz az egyikből a másikba. Húzz egy galéria thumbnailt az egyik ablakból a másikba. Fájlnézet esetén a fájl megnyílik. Galérianézet esetén az eredmény a galéria típusától függ. Ha a galéria egy mappa, a fájl bekerül a mappába, és a galéria a rendezett pozíciójában mutatja az új fájlt. Ha a galéria egy album, a fájl bekerül az albumba, azon a pozíción, ahová ejtetted. - - TOPIC: ELJÁRÁSOK SZERKESZTÉSE A Fájlnézet módban lévő kép (az aktuális kép) módosítható a Szerkesztés, Javítás, Finomítás, Effektek, Torzítás és Egyesítés menük szerkesztési funkcióival. Ezek a funkciók az aktuális képet módosítják a memóriában és az ablakban. Ahogy ezeket a funkciókat használod, a szerkesztések halmozódnak. Amikor befejezted a szerkesztést, használd a [Mentés] menügombot, hogy a módosított képet visszamentsd ugyanabba a fájlba, egy új verzióba (pl. filename.v01.jpg), vagy egy új fájlba és/vagy mappába. A képszerkesztő párbeszédablakoknak csúszkái, gombjai, léptetőgombjai vagy szerkeszthető görbéi vannak, amelyek azonnal frissítik a képet. - Kattints bal vagy jobb gombbal a Visszavonás/Mégis gombra, hogy visszavond vagy megismételd az éppen aktív szerkesztési funkciót. Miután egy képre egy vagy több szerkesztést alkalmaztál, a visszavonás/mégis gombbal oda-vissza léphetsz az összes elvégzett lépés között, hogy megtekintsd a kép állapotát az egyes lépések után. A középső egérgomb egy felugró listát mutat az aktuális képen elvégzett összes szerkesztésről, és bármelyik lépést kiválaszthatod, hogy visszalépj hozzá. A kép bármelyik korábbi lépéstől újraszerkeszthető. Ez elveti az adott lépés utáni szerkesztéseket, mivel azok abból a lépésből származtak. Ez a visszavonás/mégis képesség addig marad meg, amíg a szerkesztett kép az aktuális kép marad. Ha egy másik képet nyitsz meg, a szerkesztési előzmények elvesznek. Ha meg szeretnéd tartani a lehetőséget, hogy visszatérj az aktuális kép állapotához, mentsd el a képet új verzióként, mielőtt folytatnád egy másik szerkesztéssel. - - TOPIC: MUNKAFOLYAMAT SZERKESZTÉSE - ^Egyszerű munkafolyamat A legtöbbször egyszerűen szerkesztheted a fényképezőgépből kikerülő JPEG fájlt. Az alábbi összetettebb eljárást csak akkor használd, ha színsávokat látsz olyan szerkesztések után, amelyek kibővítették a fényerőtartományt egyes képterületeken, és a fényerő lépései elég nagyok lettek ahhoz, hogy láthatóvá váljanak. - ^Összetett munkafolyamat A mély színekkel (8 bitnél nagyobb RGB színenként) történő szerkesztéshez indulj ki a fényképezőgép RAW fájljából. Egy RAW fájl ugyanúgy szerkeszthető, mint bármely más képfájl. A Fotocx szerkesztési funkciói 24 bittel dolgoznak színenként, így a RAW fájl teljes színmélysége megmarad. Amikor megnyitsz egy RAW fájlt, a kiválasztott RAW betöltő kerül felhasználásra - lásd {BEÁLLÍTÁSOK}. A Kötegelt konvertálás funkcióval is átalakíthatsz több RAW fájlt TIFF, PNG vagy JXL fájlokká, 16 bittel színenként. - A Dcraw az alapértelmezett RAW fájlbetöltő. Használhatsz összetettebb RAW szerkesztőt is, mint például a Rawtherapee - lásd {BEÁLLÍTÁSOK}. A Dcraw ehhez képest egyszerű és gyors. A RAW szerkesztőben található szerkesztési funkciók általában könnyebben elvégezhetők a Fotocx-szel. - - TOPIC: EGÉR TULAJDONJOGA Egyes szerkesztő párbeszédablakok az egeret használják a fő ablakban lévő kép hivatkozásához vagy módosításához. Egyszerre több ilyen párbeszédablak is aktív lehet. Az egeret a kép zoomolására és görgetésére is használják, és erre szükséged lehet egy szerkesztő párbeszédablak használata közben is. Ezért fontos megérteni, hogy melyik párbeszédablak vagy ablak birtokolja az egeret, és hogyan lehet módosítani ezt a tulajdonjogot: • Ha egy párbeszédablak billentyűzetfókusszal rendelkezik, a képen végzett egérműveletek ennek a párbeszédablaknak a bemenetei, és nem zoomolják vagy görgetik a képet. • Ha lenyomva tartod a CTRL billentyűt, miközben a képen kattintasz vagy húzod az egeret, a kép zoomol vagy mozog/görgetődik. A nyitott párbeszédablakokra ez nincs hatással. • Az egérgörgővel bármely képhelyszínen be-/kizoomolhatsz. - - TOPIC: EGÉR ALT+JOBB GOMB Touchpadeknél vagy érintőképernyőknél a jobb egérgombos kattintás nehézkes lehet. Ha az ALT billentyűt lenyomva tartod, miközben a bal egérgombot megnyomod, ez jobb egérgombként lesz értelmezve. - - TOPIC: PÁRBESZÉDABLAK GOMBJAI Ezek többnyire a következőképpen működnek: • [Visszaállítás] - az aktuális szerkesztés visszavonása, a kép visszaállítása a kezdeti állapotba • [Alkalmaz] - a párbeszédablak beállításainak alkalmazása a képre, a párbeszédablak aktív marad • [OK] - ugyanaz, mint az [Alkalmaz], de a párbeszédablak bezárul • [Mégse] - a kép módosításainak elvetése és a párbeszédablak bezárása • [Folytatás] - hosszadalmas feladat folytatása a párbeszédablak bemenetei alapján • [X] - a párbeszédablak bezárása művelet nélkül - - TOPIC: ESCAPE BILLENTYŰ A fő ablak van fókuszban: • ha egy hosszan futó funkció még fut, megszakítja azt • ha a fő ablak maximalizálva van, visszaállítja az előző méretet • ha az aktuális nézet galéria vagy térkép, átvált fájlnézetre • ha egyik sem: kilép a Fotocx-ből Párbeszédablak van fókuszban: a párbeszédablak bezárása (ugyanaz, mint az [X] gomb) Egyéb: a felugró kép bezárása, kilépés a 360 panorámanézegetőből, a diavetítés szüneteltetése vagy bezárása. - - TOPIC: NEM SZABVÁNYOS PÁRBESZÉDABLAK ELEMEK +image: custom-widgets.png - Néhány nem szokványos vezérlőt használunk a párbeszédablak méretének csökkentésére vagy a használat megkönnyítésére. Ezek szinte úgy működnek, mint a szokványos GTK vezérlők. A numerikus adatvezérlő úgy működik, mint egy GTK léptetőgomb: az egérgörgő és a billentyűzet fel/le nyílbillentyűi használhatók az érték gyors fel- vagy lefuttatásához. Touchpad használatakor koppints a beviteli mezőre a kurzor pozicionálásához, majd használd a billentyűzetet az érték beírásához, vagy használd a billentyűzet fel/le nyílbillentyűit az új értékhez való gyors léptetéshez. Ha a billentyűt lenyomva tartod, a változási sebesség idővel felgyorsul. A shift billentyűvel a sebesség 10-szeresére növelhető. Egy nemlineáris csúszka kibővíti a skálát a semleges érték körül, hogy a kis változások pontosabban szabályozhatók legyenek, különösen touchpaddel. Néhány szokványos GTK vezérlő méretét csökkentettük a felesleges térköz eltávolításával. Ezt a 'widgets.css' fájl vezérli a Fotocx home mappájában. Ezt a fájlt igény szerint módosíthatod. Törölheted az elemeket, vagy megjelölheted őket megjegyzésként, de magát a fájlt ne töröld - az automatikusan visszaállna. - - TOPIC: GÖRBE SZERKESZTÉSE +image: retouch.png - Néhány képszerkesztési funkció szerkeszthető görbéket használ. A görbéket módosíthatod, hogy a kép egy tulajdonságát egy másik tulajdonságtól függően változtasd. A görbék az egérrel mozgathatók (húzhatók). Egy horgonypont (fekete pont) kerül a görbére, bárhol is húzod meg, és ez a pont rögzítve marad - a görbe továbbra is áthalad ezen a ponton, miközben a görbe más részeit húzod. Egy horgonypont húzással mozgatható, vagy jobb kattintással törölhető. - - TOPIC: MOUSE PAINTING Az egér használható egy kép helyi szerkesztésére. Az egér helyzete körüli kör egy olyan képterületet zár be, amely módosul, ahogy az egeret bal gombbal húzod a képen. A módosítás forrása lehet egy szerkesztési funkció, egy kiválasztott szín, vagy pixelek ugyanazon kép egy másik részéből vagy egy másik képből. Az egérkörön belüli képpixelek úgy módosulnak, hogy megfeleljenek a forrásnak. A változás sebessége gyors vagy fokozatos lehet, az egér közepének és szélének erősségi tényezőitől függően. Ha a közép tényező magas, a szél tényező pedig alacsony, a kép gyorsabban módosul az egér közepénél, és fokozatosan kevésbé a középtől a szél felé. Húzd az egeret ismételten bal gombbal ugyanazon képterület felett a változások felhalmozásához, amíg a pixelek teljesen meg nem felelnek a forrásszínnek vagy -képnek, vagy a forrás szerkesztési funkció teljesen alkalmazásra nem kerül. Húzd jobb gombbal a változások fokozatos visszavonásához, az eredeti kép visszaállításához. - Példa: ha a szerkesztési funkció a Retus, és a fényerőt növeled, akkor a kép a bal gombos egérhúzás közben az egér területén belül fényesedik. Használd a jobb gombos húzást az eredeti kép fokozatos visszaállításához. - Az [undo-last] gomb visszavonja az utolsó festési vagy törlési műveletet, és ez megismételhető sok legutóbbi szerkesztés eltávolításához. Minden új egérhúzási művelet egy külön visszavonható munkaegység. A visszavonáshoz elérhető memória korlátozott, ezért csak a legutóbbi festési és törlési lépések maradnak meg. Az [undo all] visszaállítja a képet a kezdeti állapotába. - Használd a [undo/redo] gombot a szerkesztés közbeni változások ellenőrzéséhez. - Ha egy {TERÜLET KIJELÖLÉSE} aktív, a festés a területen belülre korlátozódik. - MEGJEGYZÉS: Zoomolj a képre 100%-ra vagy nagyobbra, ha nagyon kis sugarat használsz (pl. amikor vonalakat rajzolsz a képre). Az egér mozgási lépései képernyőpixelekben mérendők. Ha ez sok képpixelt fed le, és kis sugarat használsz, néhány pixelt az egér kihagyhat, és azok nem kerülnek feldolgozásra. - - TOPIC: KÖTEGELT FELDOLGOZÁS Több köteges funkció is található a {KÖTEGELT MENÜ}-ben néhány gyakori feladat felgyorsítására. Kiválaszthatsz sok képfájlt, és végrehajthatod rájuk a köteges funkciót. A köteges funkciók használhatók fájlnév vagy -típus módosítására, egyenesbe állításra, átméretezésre, másolásra vagy áthelyezésre, törlésre, valamint tags, keywords, hely/geokoordináták, fotódátumok módosítására. - - TOPIC: KÉPFÁJLOK KIJELÖLÉSE +image: select-image-files.jpg - Ez az eljárás minden olyan funkciónál használatos, amely több képfájlon dolgozik. Az eljárás itt kerül bemutatásra, és ez a téma minden, az eljárást használó funkcióból hivatkozva van. • bal kattintás a thumbnailre: hozzáadás a kijelölési listához • jobb kattintás: eltávolítás • több hozzáadása: kattints az első thumbnailre, majd shift-kattintás az utolsóra • [Összes hozzáadása] gomb: a teljes galéria hozzáadása • [Jelenlegi hozzáadása] gomb: az aktuális fájl hozzáadása • egy fájl többször is hozzáadható a listához • navigálj más galériákhoz, hogy szükség szerint további fájlokat válassz ki • [Eltávolítás] gomb: a kijelölt lista pozíció eltávolítása • [Törlés] gomb: a teljes lista törlése • fel/le nyílbillentyűk: léptetés a listán, thumbnails megtekintése • home/end billentyűk: ugrás a lista elejére/végére - A [Letiltás] gomb letiltja a thumbnailre kattintást a fájlok kiválasztásához. A gomb ekkor [Engedélyezés] névre változik - nyomd meg, hogy visszaállítsd a thumbnailre kattintást. Ennek célja, hogy engedélyezze a normál thumbnail felugró menüket és a bal kattintást a fájl teljes méretben történő megtekintéséhez, ami nem lehetséges, ha a thumbnail kattintások a fájlkiválasztáshoz vannak használva. Erre szükséged lehet a kijelölések eldöntéséhez. Fájlnézet módban is maradhatsz, és a nyílbillentyűkkel léptethetsz a képeken, miközben az [Jelenlegi hozzáadása] gombbal fájlokat adsz a kijelölési listához. - - TOPIC: GYORSBILLENTYŰK Három gyorsbillentyű-módszer van a gyakran használt funkciókhoz: • Kattints jobb gombbal a fő ablakra vagy a galéria thumbnailjére. Egy felugró menü megjeleníti néhány gyakran használt funkciót. • Módosíthatod a gyorsbillentyűket, és újakat is hozzáadhatsz. Lásd {GYORSBILLENTYŰK}. • Gyűjtsd össze a gyakran használt funkciókat egy egyéni menüben. Lásd {EGYÉNI MENÜ}. - A leggyakoribb funkciókhoz gyorsbillentyűk állnak rendelkezésre. Használd az Eszközök > Gyorsbillentyűk menüt a megtekintésükhöz vagy módosításukhoz. - A következő gyorsbillentyűk rögzítettek, és nem módosíthatók: • [+] [=] billentyű: kép vagy thumbnails nagyobbra zoomolása • [-] billentyű: kép vagy thumbnails kisebbre zoomolása • Z billentyű: zoom váltása: 1x <--> ablakhoz igazítás • F1 billentyű: az aktuális funkció felhasználói kézikönyvének megjelenítése • F10 billentyű: a fő ablak teljes képernyős módjának be- és kikapcsolása • F11 billentyű: mint az F10, de menük, címsor, felső panel nélkül • Escape billentyű: a futó funkció megszakítása, az aktív párbeszédablak bezárása • Delete billentyű: párbeszédablak az aktuális fájl törléséhez vagy kukába helyezéséhez • Bal/jobb nyíl: az előző/következő kép megjelenítése a galériában • Fel/le nyíl: ugyanaz, de csak a legutóbbi verziók megjelenítése • Page Up/Down: Galérianézet: egy oldal görgetése fel/le • Home/End: Galérianézet: ugrás az első/utolsó galériaoldalra - A következő gyorsbillentyűk alapértelmezettek, amelyeket a felhasználó módosíthat: • F: Fájlnézet - váltás fájlnézet módba • G: Galérianézet - váltás galérianézet módba • M: Térképnézet - váltás térképnézet módba • 2: 2 fájl váltogatása - a két legutóbbi fájl felváltva történő megjelenítése • 3: 3 fájl váltogatása - a három legutóbbi fájl felváltva történő megjelenítése • A: Aktuális album - a legutóbb megtekintett album megjelenítése • T: Retus - a Retus szerkesztési funkció indítása • C: Vágás - a Vágás szerkesztési funkció indítása • K: Gyorsbillentyűk - a gyorsbillentyűk párbeszédablak indítása • P: Kép nyomtatása - a kép nyomtatása párbeszédablak megnyitása • R: Forgatás - a Forgatás szerkesztési funkció indítása • U: Visszavonás - az aktuális szerkesztés vagy egy sorozat utolsó elemének visszavonása • Shift+U: Mégis - az aktuális szerkesztés vagy egy sorozat következő elemének ismételt végrehajtása • Ctrl+C: Másolás vágólapra - az aktuális fájl másolása a vágólapra • Shift+C: Feliratok váltása - a feliratok megjelenítése/elrejtése felváltva • Ctrl+G: az aktuális fájl mappagalériájának megjelenítése • Shift+G: Rács váltása - a rácsvonalak be-/kikapcsolása • Ctrl+S: Mentés - a fájlmentés párbeszédablak indítása - - TOPIC: EGÉR FUNKCIÓK - ^Fájlnézet • bal kattintás - Zoom be: a kép nagyítása, az egér középpontjában • jobb kattintás - Ha a kép zoomolva van: visszaállítás ablakmérethez Ha nem, felugró menü a gyakori funkciókkal • egérgörgő - a kép be- vagy kizoomolása • bal gombos húzás a képen - a zoomolt kép mozgatása • Ctrl + egér - az egér a képre hat, nem az aktív párbeszédablakra - ^Galérianézet • bal kattintás a thumbnailre - váltás Fájlnézetre • jobb kattintás a thumbnailre - felugró menü megjelenítése a gyakori funkciókkal • középső kattintás a thumbnailre - felugró nagy kép, zoomolás egérgörgővel • egérgörgő - a galéria oldal görgetése fel vagy le - ^Térképnézet • bal gombos húzás - a térkép húzása, az egeret követve • egérgörgő - a térkép nagyobbra vagy kisebbre zoomolása • bal kattintás egy jelölőn - a helyszín képeinek galériájának megjelenítése • ha a metadata szerkesztése párbeszédablak aktív, a bal kattintás beállítja a geokoordinátákat - - TOPIC: PARANCS PARAMÉTEREK Ezek a paraméterek használhatók, ha a Fotocx-et terminálból indítod. -help megjeleníti a felhasználói kézikönyvet -home /folder alternatív Fotocx home hely (lásd lent) -lang xx nyelv beállítása 2 karakteres kódból -recent a legutóbbi képfájlok galériájának megjelenítése -new a legújabb képfájlok galériájának megjelenítése -album albumname a megnyitandó album (galéria) -prev az előző munkamenetben utoljára megtekintett fájl megjelenítése -blank üres ablak megjelenítése -dev a normálisan rejtett fejlesztői menü megjelenítése -menu manuname a Fotocx ezzel az aktív menüvel indul -cwp nnn name háttérkép váltogatása (lásd lent) -x0 -x1 -x2 indexszint beállítása 0, 1 vagy 2 értékre (lásd lent) - ^-x0 -x1 -x2 paraméter^ (az indexszint beállítása induláskor) Ezek a paraméterek használhatók a {BEÁLLÍTÁSOK} érték felülbírálására -x0 nagyon gyors indítás, nincs képindex -x1 gyors indítás, csak a régi fájlok indexelése -x2 régi fájlok + új/módosított fájlok keresése - ^-home^ paraméter (alternatív Fotocx home mappa) Alapértelmezett Fotocx home mappa: /home//.fotocx. Itt tárolódnak a felhasználói beállítások és a képindex. A(z) "$ fotocx -home " parancs a megadott mappát használja. Ez lehetővé teszi több képgyűjtemény külön kezelését. Lásd még: {FOTOCX ALAPMAPPA ÁTHELYEZÉSE}. - ^-cwp^ paraméter (asztali háttérkép váltogatása) A teljes parancssor: $ fotocx -cwp secs container Ezzel a paranccsal váltogathatod az asztali képet egy kiválasztott készletből. A 'secs' a képek közötti időköz. A 'container' vagy egy Fotocx albumnév, vagy egy képfájlokat tartalmazó mappa. Add hozzá ezt a parancsot a bejelentkezéskor induló programok listájához, hogy megadott időközönként új háttérképet kapj. Használj egy napos vagy hosszabb időközt, hogy minden bejelentkezéskor új háttérképet kapj. A Fotocx a háttérben fut, GUI nélkül. Ha a 'secs' nulla, egy háttérkép-frissítés történik, majd a Fotocx kilép. Minden Linux disztribúció más parancsot használ. Elméletileg a következők érintettek: Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: FÁJL MENÜ - - TOPIC: ÚJ MUNKAMENET Új Fotocx munkamenet indítása egy új ablakban. Ha egy képfájlt mindkét ablakban szerkesztesz, egyik példány sem látja a másik által végzett módosításokat, és a végeredmény az utoljára mentett fájl lesz. - - TOPIC: KÉPFÁJL MEGNYITÁSA Válassz ki egy képfájlt megtekintésre vagy szerkesztésre egy hagyományos fájlmegnyitó párbeszédablak segítségével, mappákkal és fájllistákkal. Ez akkor hasznos, ha a fájlok nincsenek indexelve, és a galéria megjelenítése nagyon lassú, pl. amikor több ezer képfájlt tartalmazó fényképezőgép SD kártyáról olvasol. - - TOPIC: 2 FÁJL VÁLTOGATÁSA Ennek a menünek az ismétlése felváltva vált a két legutóbb megnyitott fájl között. Ez a funkció megtartja az aktuális kép zoom méretét és pozícióját, ami ideális ugyanazon képfájl két szerkesztett verziójának gyors összehasonlításához. - - TOPIC: 3 FÁJL VÁLTOGATÁSA Ez ugyanúgy működik, mint a 2 fájl váltogatása, de az utolsó 3 megnyitott fájl között váltogat. - - TOPIC: 360°-OS PANORÁMA MEGTEKINTÉSE Az aktuális fájl egy speciális nézegetővel nyílik meg a 360°-os panorámafájlokhoz. A kép szélessége 360°-nak van feltételezve. Használd ezt a funkciót a Google 'photosphere' képeinek megtekintéséhez. Mozgasd a képet egérhúzással vagy a bal/jobb nyílbillentyűkkel. Zoomolj bal/jobb egérkattintással. Használd az Escape billentyűt a speciális nézegetőből való kilépéshez. - - TOPIC: ÁTNEVEZÉS Nevezd át az aktuális fájlt (Fájlnézet), vagy egy megkattintott thumbnail fájlját (Galérianézet). Add meg az új nevet, és nyomd meg az [alkalmaz] gombot. Ez a funkció automatizálhatja is egy képfájlsorozat átnevezésének folyamatát egy alapnév és egy sorszám segítségével. Nyisd meg a sorozat első képfájlját, add meg az új nevet, és nyomd meg az [alkalmaz] gombot. Használd a [next] gombot, ha a következő fájlra szeretnél lépni. Ugyanazt a nevet újra használhatod a [előző név] gomb megnyomásával, majd adj hozzá egy utótagot vagy sorszámot. Nyomd meg az [add 1] gombot a sorszám növeléséhez. - - TOPIC: ÜRES KÉP Hozz létre egy üres képet megadott pixelmérettel és színnel. Ez felhasználható háttérként más képekből kivágott részletekhez (a {TERÜLET KIJELÖLÉSE} segítségével) és jegyzet szövegekhez (a {JELÖLÉS} szövegrajzolás segítségével). - - TOPIC: MÁSOLÁS/ÁTHELYEZÉS Az aktuális fájl (Fájlnézet) vagy egy megkattintott thumbnail fájlja (Galérianézet) a megadott helyre kerül másolásra. Válaszd a másolás lehetőséget, hogy másolatot készíts, és a forrásfájl a helyén maradjon, duplikátumot létrehozva. Válaszd az áthelyezés lehetőséget, hogy a fájlt az eredeti helyről az új helyre mozgasd. Egy fájlcsoport gyorsan feldolgozható az egyes thumbnailek megkattintásával, majd az [alkalmaz] megnyomásával. A [Előző] gombbal a korábban használt fájlnév másolható. Adj hozzá egy verziószámot vagy valami mást a duplikált fájl elkerüléséhez. - - TOPIC: MÁSOLÁS ASZTALRA Az aktuális fájl (Fájlnézet) vagy egy megkattintott thumbnail fájlja (Galérianézet) az asztali mappába kerül másolásra (/home//Desktop). - - TOPIC: MÁSOLÁS VÁGÓLAPRA Az aktuális fájl (Fájlnézet) vagy egy megkattintott thumbnail fájlja (Galérianézet) a vágólapra kerül másolásra, ahonnan más alkalmazások beilleszthetik. - - TOPIC: TÖRLÉS/KUKA Az aktuális fájl (Fájlnézet) vagy egy megkattintott thumbnail fájlja (Galérianézet) törlődik vagy a kukába kerül, a kiválasztott lehetőségtől függően. A Fotocx a szabványos kuka helyet feltételezi (~/.local/share/Trash). - - TOPIC: HÁTTÉRKÉP BEÁLLÍTÁSA Az asztali háttérkép az aktuális képfájlból lesz beállítva. - - TOPIC: KÉP NYOMTATÁSA A kép nyomtatása menü megnyit egy szabványos Oldalbeállítás párbeszédablakot, ahol kiválaszthatsz egy nyomtatót, papírméretet és tájolást. Az [alkalmaz] gomb használata után egy másik párbeszédablak indul a papírmargók és a kép léptékének megadásához. - Ha a képnek van kijelölt területe (területei), a rendszer megkérdezi, hogy csak a terület(ek) kerüljön-e nyomtatásra. Ezek a területeket körülölelő minimális téglalappal kerülnek nyomtatásra, a kijelöléseken kívüli területek pedig nem kerülnek nyomtatásra. - - TOPIC: KALIBRÁLT NYOMTATÁS Ez a funkció ugyanúgy működik, mint a fent leírt Kép nyomtatása, de nyomtatás előtt meg kell adnod egy kalibrációs fájlt, amely a kép színeinek beállítására szolgál nyomtatás előtt. Célja a nyomtató és a papírtípus által okozott színeltolódások kompenzálása. - - TOPIC: NYOMTATÓ KALIBRÁLÁSA +image: printer-calibrate-chart.png +image: calibrate-printer.png - Ez a segédeszköz javíthatja a nyomtatott képek színpontosságát. - ^Hogyan működik Egy színtáblázat kerül kinyomtatásra a célnyomtatón. A nyomtatott színek némelyike a nyomtató tökéletlenségei miatt kissé hibás lesz. Ez a nyomtatott oldal fájlba van beszkennelve, és a fájlban lévő színeket összehasonlítják az eredetileg kinyomtatott színekkel. Bármilyen eltérés most már ismert hiba (feltételezve, hogy a szkenner pontosabb, mint a nyomtató - ez általában igaz). Amikor egy képfájlt kinyomtatnak, ezek a hibák le vannak vonva a kép színeiből nyomtatás előtt. A nyomtató visszaadja a hibákat, így elméletileg helyes eredményt kapunk. A saját tesztem szerény javulást mutatott, ez alább részletezve van. - Végezd el a következő lépéseket sorrendben, ahogy a párbeszédablakban fel vannak sorolva. Minden fájl a /printer_color mappában található. • Generáld és nyomtasd ki a színtáblázat fájlt (printchart.png). Használj nagy papírméretet, függőleges tájolást, margók nélkül. • Szkenneld be a nyomtatott táblázatot egy PNG fájlba. Használj 300 dpi-t vagy többet. • Szerkeszd a PNG képet, hogy levágd a szkenner által hagyott margókat. Mentsd el a szerkesztett képfájlt. • Dolgozd fel a szerkesztett képfájlt egy színtérkép fájl létrehozásához. - Most már nyomtathatsz a {KALIBRÁLT NYOMTATÁS} menüvel, amely be fogja kérni a használt nyomtatóhoz és papírhoz tartozó színtérkép fájl nevét. - A szkennerek a beszkennelt képet enyhén nem téglalap alakúra torzíthatják. Ha ez történik, észreveheted a margók vágásakor: a vastag zöld margóvonalak nem fognak tökéletesen illeszkedni a vágási téglalaphoz. Ha ez történik, használd a {PERSPEKTÍVA} funkciót a kép négyszögesítéséhez, majd vágd le a margókat. - A beszkennelt táblázatkép szerkesztésekor győződj meg róla, hogy a legsötétebb sor van felül. Vágd le a színcsempéket körülvevő margókat. Használd a színcsempéket körülvevő vastag zöld margóvonalat útmutatóként: vágd le pontosan ezt a vonalat, csak a csempéket hagyva meg. Dolgozz 2x-es nagyítással a vágási téglalap beállítása közben. A pontos vágás fontos. Ha a vágás nem pontos, a számított csempepozíciók eltolódnak, és a mért színek hibásak lehetnek. Egy kis hiba megengedett. A billentyűzet nyílbillentyűivel 1 pixeles mozgásokat végezhetsz a vágási téglalapban. A nyílbillentyűk azt a sarkot mozgatják, amelyet legutóbb az egérrel húztál. - A kimeneti színtérkép fájl csak a kalibrációhoz használt papír- és nyomtatóbeállításokhoz használható. Bármely más kombináció saját kalibrációt és színtérkép fájlt igényel. - ^Eredmények^ (az én Canon nyomtatóm) +image: printer-calibrate.jpg +image: printer-cal-study.png - A fenti táblázat három kép fotója: bal felső: egy színtáblázat fotó nyomata jobb felső: ugyanannak a fotónak a kalibrált nyomata alul: maga a színtáblázat Mivel mindhárom kép együtt lett lefotózva, a fényképezőgépből eredő hibák egyenlőek, ami érvényessé teszi az összehasonlításokat. - - TOPIC: GALÉRIA MENÜ - - TOPIC: GALÉRIA ÁTTEKINTÉS +image: image-management.jpg - Egy thumbnail képekből álló galéria reprezentálhat egy fájlmappát, egy képkeresés eredményét, az egyik beépített galériát (legutóbbi fájlok, legújabb fájlok), vagy egy albumot (egy megadott nevű, rendezett képfájllista). A mappákat gyakorlati és teljesítménybeli okokból célszerű néhány ezer fájlra korlátozni, de ez nincs kikényszerítve. - ^A galéria görgetése A galéria fel és le görgethető a billentyűzet fel és le nyílbillentyűivel, a page up és page down billentyűkkel, vagy a görgetősávokkal. A [home] és [end] billentyűk is használhatók. Kattints bal gombbal a görgetősávra és tartsd lenyomva, és a galéria gyorsan a kattintás helyére görgetődik. Kattints jobb gombbal és tartsd lenyomva a görgetősávon, hogy a galéria lassan görgetődjön a kattintás helyére. Tartsd tovább lenyomva az egérgombot, és mozdulj oldalra a görgetési sebesség növeléséhez. - - TOPIC: THUMBNAIL NÉZET Az aktuális galéria képfájljai thumbnails tömbjeként jelennek meg. Használd a Zoom menügombot vagy a [+] [-] billentyűket a thumbnail méretének módosításához. - - TOPIC: METAADAT NÉZET Az aktuális galéria képfájljai a Fotocx által használt alapvető metadata-val együtt jelennek meg. Ha egyéni indexelt metadata tagek vannak megadva, ezek a szabványos tagek után jelennek meg. Lásd {FÁJLOK INDEXELÉSE}. - - TOPIC: LEGUTÓBBI FÁJLOK Az 1000 legutóbb megtekintett képfájl jelenik meg egy galériában, amelyből fájlokat választhatsz ki megtekintésre vagy szerkesztésre. - - TOPIC: LEGÚJABB FÁJLOK Az 1000 legutóbb hozzáadott vagy módosított képfájl jelenik meg egy galériában, amelyből fájlokat választhatsz ki megtekintésre vagy szerkesztésre. Választhatsz, hogy az EXIF fotódátumot vagy a fájl módosítási dátumát használja a legújabb képek meghatározásához. - - TOPIC: GALÉRIA RENDEZÉSE Válaszd ki a rendezési kulcsot és a növekvő vagy csökkenő sorrendet. A Visszaállítás jelölőnégyzet minden galériát fájlnév szerinti növekvő sorrendbe állít vissza. - Ha egy album galériát rendezel, az eredmény nem cseréli le az albumot, hanem egy új, -sorted nevű albumot hoz létre. - ^Fájlnév/szám Ez egy módosított fájlnév szerinti rendezés. Ha több fájl neve csak az azonos pozícióban lévő beágyazott számokban különbözik, ez a fájlcsoport a beágyazott számok sorrendjében lesz rendezve. Az itt látható példa szemlélteti a különbséget: betűrendi sorrend: xxx1xx xxx11xx xxx123xx xxx3xx numerikus sorrend: xxx1xx xxx3xx xxx11xx xxx123xx - ^Metadata a keresés funkcióból Ha a galéria a {KÉPEK KERESÉSE} 'metadata jelentés' opciójával lett létrehozva, és ha opcionális metadata tageket adtál a szabványos jelentéshez, ezen metadata tagek szerint rendezheted a galériát. A galériát rendezheted fényképezőgép gyártó, objektív adatok, ISO szint, expozíciós idő ... bármilyen elérhető metadata szerint. - - TOPIC: GALÉRIA SZŰRŐ Válassz ki egy részhalmazt az aktuális galériából, hogy létrehozz egy „gallery_filter” nevű albumot, amely a kiválasztott képfájlokat tartalmazza. ^Kiválasztási lehetőségek: • összes fájl: az összes képfájl kiválasztása • eredetik: eredeti fájlok (nincs verziószám) • verziók: verziózott fájlok (szerkesztve lettek) • legutóbbi verziók: legutóbbi verziók (vagy eredetik, ha nincs verzió) • értékelési tartomány: fájlok, amelyek értékelése a megadott tartományon belül van • keyword nevek: fájlok, amelyek a megadott keywords bármelyikét tartalmazzák (vesszővel elválasztva) • fájlnév szöveg: fájlok, amelyek a megadott szövegek bármelyikét tartalmazzák (vesszővel elválasztva) - - TOPIC: GALÉRIA KEZDŐLAP TOPIC: GALÉRIA VÉGE Ugrás az aktuális galéria első vagy utolsó thumbnailjére. - - TOPIC: JELENLEGI FÁJL MAPPÁJA Állítsd be az aktuális galériát az aktuális képfájlból. Ez akkor hasznos, ha vissza szeretnél térni az aktuális fájl galériájához, miután valami mást csináltál. - - TOPIC: LEGUTÓBBI MAPPÁK Állítsd be az aktuális galériát egy nemrég használt galériából. Ez megkönnyíti az oda-vissza lépkedést a legutóbbi galériák között. - - TOPIC: MAPPAFA +image: folder-tree.png - Kezdetben az összes TOP képmappa megjelenik. Kattints a [+] gombra az almappák kibontásához, vagy a [-] gombra a visszahajtásukhoz. Bármelyik mappára kattinthatsz, hogy megkapd az adott mappában lévő képek galériáját. Tartsd nyitva az ablakot, hogy bárhova navigálhass a képgyűjteményedben. Ez a funkció a galéria felső paneljében lévő [TOP] gombbal is elérhető. - - TOPIC: FÁJLOK KIJELÖLÉSE Válassz ki előre képfájlokat, hogy bemenetként használd őket albumok létrehozásához vagy köteges funkciókhoz. Ezek a funkciók alapértelmezetten az előre kiválasztott fájlokat használják, de ezeket módosíthatod, vagy elölről is kezdheted. Lásd a {KÉPFÁJLOK KIJELÖLÉSE} eljárást. - - TOPIC: KÖNYVJELZŐK Tekintsd meg a meglévő könyvjelzőket. A könyvjelzők kiválasztott helyek (mappa-/fájlnevek), felhasználó által megadott nevekkel. Kattints egy könyvjelzőre, hogy megjelenjen az adott helytől kezdődő thumbnail galéria. Válaszd a [Könyvjelzők szerkesztése] lehetőséget könyvjelző hozzáadásához, törléséhez vagy átnevezéséhez. - - TOPIC: KÖNYVJELZŐK SZERKESZTÉSE A Könyvjelzők szerkesztése elindítása után kattints egy galéria thumbnailre, hogy hozzáadd ezt a helyet a könyvjelzőlistához. A hozzárendelt könyvjelzőnév kezdetben a thumbnail fájlneve lesz. A nevet szerkesztheted. Ha egy meglévő könyvjelzőt választasz ki egérkattintással, annak neve megjelenik a beviteli mezőben. Módosíthatod a nevet, vagy megnyomhatod a [törlés] gombot a könyvjelző eltávolításához. Az új könyvjelzők az utoljára kiválasztott könyvjelző helye után kerülnek beszúrásra. A sorrend módosításához szerkeszd a „bookmarks” fájlt a Fotocx home mappájában. - - TOPIC: MAPS MENU - - TOPIC: VILÁGTÉRKÉP +image: map-click.jpg - Ez egy internetes világtérkép, amely léptékezhető (be- és kizoomolható) utcaszinttől kontinens szintig. Használd az egérgörgőt a térkép be-/kizoomolásához. Húzással módosíthatod a középpontot. A térképen jelölők (piros pontok) vannak, amelyek a metadatájukban geokoordinátákkal rendelkező képeknek felelnek meg. Kattints egy jelölőre, hogy megkapd az adott helyen lévő képek Galérianézetét. A térkép jelölőterületén belül elhelyezkedő képek kerülnek kiválasztásra. A hatékony jelölőterület a térkép léptékével arányosan változik. Zoomolj be a lépték kibővítéséhez, és esetleg egy jelölő több közeli jelölőre bontásához. - - TOPIC: MEGJELENÍTÉS TÉRKÉPEN Jelenítsd meg az aktuális képfájl helyzetét a világtérképen. Ha több jelölő átfedésben van, zoomolj be, amíg egyetlen jelölő nem lesz középen. - - TOPIC: ALBUMOK MENÜ - - TOPIC: ALBUMOK Egy album egy tetszőleges képhalmaz, amely meglévő képekből manuálisan van összeállítva. Egy album a tagfájljainak listája. Maguk a képfájlok nincsenek másolva vagy módosítva. Egy adott képfájl több album tagja is lehet, vagy egy albumon belül többször is szerepelhet. Az albumban képeket adhatsz hozzá vagy távolíthatsz el, vagy átrendezheted a sorrendjüket. Ha egy album elkészült, névvel kiválaszthatod, és galériaként jelenik meg. - - TOPIC: ALBUM LÉTREHOZÁSA Add meg egy új album nevét. Létrehozhatsz üres albumot, egy albumot a {FÁJLOK KIJELÖLÉSE} funkcióból előre kiválasztott képfájlokkal, egy albumot az aktuális galéria képeivel, vagy kiválaszthatod az album kezdeti képeit. - - TOPIC: ALBUM ÁTNEVEZÉSE Válassz ki egy meglévő albumot, és add meg az új nevet. - - TOPIC: ALBUM TÖRLÉSE Válassz ki egy meglévő albumot, és töröld véglegesen. - - TOPIC: ALBUM KIVÁLASZTÁSA Megjelenik az elérhető albumok listája. Válassz a listából. - - TOPIC: JELENLEGI ALBUM Állítsd be a galériát az aktuális (legutóbb használt) albumból. - - TOPIC: GALÉRIÁBÓL ALBUM Mentsd el az aktuális galériát albumként. Válassz ki egy meglévő albumnevet [Tallózás], vagy add meg az új nevet. - - TOPIC: ALBUM SZERKESZTÉSE Kattints jobb gombbal egy album thumbnailre, és válassz a felugró menüből: • Kijelölt fájlok hozzáadása ide - a korábban kiválasztott fájlok ide kerülnek hozzáadásra (kattints a thumbnail bal/jobb oldalára, hogy a thumbnail elé/mögé add hozzá). • Aktuális fájl hozzáadása ide (Fájlnézet) - ugyanúgy működik. • Eltávolítás az albumból - a megkattintott fájl eltávolításra kerül az albumból. - ^Húzás és ejtés Egy albumban lévő képeket átrendezheted a thumbnailek egérrel történő húzásával. Húzd a thumbnailt, amíg az egérkurzor egy kis thumbnail képpé nem változik. Folytasd ennek a képnek a húzását arra a pozícióra, ahová be kell szúrni, majd engedd fel az egérgombot. Helyezd az egeret nagyjából a thumbnailek közé, ahová a húzott képet be kell szúrni. Ha a húzás megközelíti az ablak felső vagy alsó szélét, a galéria görgetni fog, hogy több kép kerüljön látótérbe. Két Fotocx munkamenetet is használhatsz, hogy gyorsabbá tedd sok kép kiválasztását vagy mozgatását. Húzz és ejts képeket bármely forrásgalériából egy célalbum pozíciójába. - Ha egy fájlt a Fotocx segítségével nevezel át vagy helyezel át, az albumhivatkozások frissülnek, és a fájl megmarad az azt tartalmazó albumokban. Ha ezt a Fotocx-en kívül teszed, az albumhivatkozások elvesznek, és a fájl eltűnik az albumból. - Ha a képfájlokat a Kötegelt konvertálás vagy a Kötegelt másolás/áthelyezés segítségével nevezed át vagy helyezed át, ha ezt szeretnéd, győződj meg róla, hogy kiválasztod az albumfájlok cseréjének lehetőségét. Ellenkező esetben egyenként kell lecserélned őket. - Ne nevezz át mappákat, ha azok albumokban szereplő képeket tartalmaznak. Az albumhivatkozások elvesznek. Ehelyett használd a Kötegelt konvertálást vagy a Kötegelt másolás/áthelyezést a képfájlok új mappába mozgatásához, majd töröld a régi mappát, ha üres. Képfájlok törléséhez használd a Kötegelt törlés/kuka funkciót. Ez az albumokból is eltávolítja a törölt fájlokat. - - TOPIC: ALBUMOK FRISSÍTÉSE +image: album-replace-file.png - Cseréld le a megadott albumfájlokat a megadott cserékre, vagy add hozzá a megadott új fájlokat a megadott meglévő fájlok után. Válassz ki egy vagy több feldolgozandó albumot. Galérianézetben kattints két thumbnailre, hogy megadd a 'régi fájl'-t és az 'új fájl'-t a fenti párbeszédablakban. Válaszd ki a lehetőséget: az 'új fájl' lecseréli a 'régi fájl'-t, bárhol is található, vagy az 'új fájl' hozzáadásra kerül az albumokhoz a 'régi fájl' után. Nyomd meg a [proceed] gombot az albumok feldolgozásához. A feldolgozás után a párbeszédablak megismétlődik ugyanazokkal a kiválasztott albumokkal és ugyanazzal a 'csere vagy hozzáadás' lehetőséggel. Kiválaszthatsz még két fájlt, és megnyomhatod a [proceed] gombot. - - TOPIC: ALBUM TÖMEGES FRISSÍTÉSE +image: album-mass-update.png - Ez egy segédeszköz tömeges frissítésekhez, amelyre akkor lehet szükséged, ha sok képfájlhoz hoztál létre új verziókat, és egy vagy több albumot frissítened kell az új verziókra. Ez nem fedi le az összes igényt, ami valószínűleg lehetetlen is lenne, de remélhetőleg csökkenti az egyenkénti fájlmódosítás szükségességét. - Válassz ki egy vagy több albumot, majd válaszd ki az egyik feldolgozási lehetőséget: • Mind cseréje csak a legújabb verzióra: Az albumok frissülnek, hogy csak a legújabb fájlverziókat tartalmazzák. • Minden verzió cseréje a legújabb verzióra: Minden fájlverzió lecserélődik csak a legújabb verzióra. Az eredeti fájl, ha jelen van, NEM cserélődik le. • Legújabb verziók hozzáadása a meglévő verziókhoz: A legújabb verzió hozzáadásra kerül a meglévő verziókhoz, ha hiányzik. • Mind cseréje az eredetire és minden verzióra: Minden fájl lecserélődik az eredeti fájlra és minden verzióra. • Mind cseréje az eredeti verzióra és a legújabb verzióra: Minden fájl lecserélődik az eredeti fájlra és a legújabb verzióra. • Mind cseréje a kiválasztott verziókra (*): Minden fájl lecserélődik csak a kiválasztott verziókra. Ez magában foglalja az eredeti (verziószám nélküli) fájlt is. • Minden verzió cseréje a kiválasztott verziókra (*): Minden fájlverzió lecserélődik csak a kiválasztott verziókra. Az eredeti fájl, ha jelen van, NEM cserélődik le. • Kiválasztott verziók hozzáadása a meglévő verziókhoz (*): A kiválasztott verzió hozzáadásra kerül a meglévő verziókhoz, ha hiányzik. • Mind cseréje az eredetire és a kiválasztott verziókra (*): Minden fájl lecserélődik az eredeti fájlokra és a kiválasztott verziókra. - (*) A kiválasztott fájlokat használó négy lehetőség: a kiválasztott fájlok listája a {FÁJLOK KIJELÖLÉSE} funkcióból származik. Azok az albumfájlok, amelyek nem egyeznek egyik kiválasztott fájllal sem, az albumban maradnak. Csak azok a fájlok változnak a fenti szabályok szerint, amelyek egyeznek egy kiválasztott fájllal. Az egyezés a verzió vagy kiterjesztés nélküli fájlnéven alapul: az 'asdfg.png' és az 'asdfg.v01.jpg' egyezésnek számít. - Példa: Minden verzió cseréje a kiválasztott verziókra: Ha az album tartalmazza a filename.jpg és a filename.v02.png fájlokat, és a kiválasztott fájlok listája tartalmazza a filename.v04.jpg fájlt, a frissített albumban az eredmény: filename.jpg és filename.v04.jpg - - TOPIC: DIAVETÍTÉS +image: slide-show.jpg - ^Monitor tört skálázás Egyes rendszereken a tört skálázás teljesítményproblémákat okoz a Fotocx diavetítés animációinál. Ha szükséges, kapcsold ki ezt, és használj más módot a betűméret növelésére az alkalmazásokhoz. A Fotocx esetében a betűméret a {BEÁLLÍTÁSOK} menüben található. - A diavetítés párbeszédablakban (bal felül) nyomd meg az [Album kijelölése] gombot, és válassz egy albumot a megadott listából. Módosítsd a párbeszédablak többi beállítását tetszés szerint, majd nyomd meg a [Indítás] gombot a diavetítés elindításához az album első képével, vagy a [Folytatás] gombot egy szüneteltetett diavetítés folytatásához, vagy egy másik, a thumbnailjére kattintással kiválasztott képpel. Használd az escape billentyűt a diavetítésből való kilépéshez és a párbeszédablakhoz való visszatéréshez. - Fő párbeszédablak vezérlők • Felirat ideje: másodpercek a cím és leírás megjelenítéséhez. • Kép ideje: másodpercek, amíg csak a kép látszik. • Vágási határ %: a képek vágása ilyen mértékig a margók megszüntetéséhez. • Teljes képernyő: Ha be van jelölve, a képek teljes képernyőn jelennek meg menü stb. nélkül. • Automatikus ismétlés: Ha be van jelölve, a diavetítés a vége után újraindul. • Véletlenszerű kép: Ha be van jelölve, véletlenszerű képsorrend használata. Egyébként album sorrend. - A billentyűzet billentyűivel vezérelheted a diavetítést. Nyomd meg a [billentyűzet] gombot a megtekintéshez. - A következő billentyűk vannak műveletekhez rendelve, és nem módosíthatók: • Escape: a diavetítés megszakítása és visszatérés a fő párbeszédablakhoz. • Bal/jobb nyílbillentyűk: Bármikor visszaléphetsz vagy előreléphetsz, és a diavetítés onnan folytatódik. - A képek közötti animált átmenetek, valamint az egyes képek megjelenítési ideje és zoom viselkedése az alább ismertetett párbeszédablakokkal testreszabhatók. - Nyomd meg az [átmenetek] gombot, hogy elindíts egy párbeszédablakot a képek közötti átmenetek kiválasztásához és testreszabásához. Ezek sok animált képcsere-módszert tartalmaznak (pl. az új kép a középpontból kibővülve helyettesíti a régi képet). Válaszd ki a használandó átmeneteket, és hogy véletlenszerűen vagy sorrendben legyenek-e használva. Az idő paraméter beállítja az átmenet időtartamát. A preferencia paraméterek egy relatív preferenciát adnak meg, amely befolyásolja, hogy az átmenet milyen gyakran legyen használva, ha véletlenszerű sorrend van kiválasztva. - A [betöltés] és [mentés] gombok lehetővé teszik, hogy az átmenetbeállításokat fájlba mentsd, és később betöltsd. Ezek a fájlok függetlenek a diavetítés fájloktól. Egy diavetítés alapértelmezetten az adott diavetítéshez (albumnévhez) legutóbb használt átmenetbeállításokat használja, de ezeket bármikor lecserélheted a [betöltés] gombbal más beállítások betöltésével, vagy a párbeszédablakban történő módosítással. - Nyomd meg a [képfájlok] gombot, hogy elindíts egy párbeszédablakot a Kép beállításokhoz (jobb felül). Ezek opcionálisak. Egy kép testreszabáshoz úgy választható ki, hogy megkattintod a thumbnailjét az album/galéria megjelenítésben. A párbeszédablak alapértelmezett beállításokkal vagy az adott kép ezen diavetítésben korábban használt beállításaival van kitöltve. Add meg a módosításokat, és nyomd meg a [done] gombot, vagy kattints a következő testreszabandó képre. - Preferencia: Ha véletlenszerű képsorrend van kiválasztva, ez a szám relatív preferenciát ad a képnek. A semleges érték 10. Adj meg egy új értéket a valószínűség növeléséhez vagy csökkentéséhez, hogy ez a fájl legyen kiválasztva a képek véletlenszerű sorrendjében, pl. a 20-as érték 2x nagyobbá tenné a valószínűséget. A nulla érték megakadályozná a kép megjelenítését. A kép emellett le van tiltva az album képeinek 1/3-a, vagy 10, amelyik kisebb, számú megjelenítésre. - A párbeszédablak időrendben mutatja a testreszabható képeseményeket: • várakozás egy megadott ideig (lehet nulla is). • a következő szövegtagek párhuzamos megjelenítése: képnév (fájl alapnév) megadott ideig, kép címe, ha van, megadott ideig, kép leírása, ha van, megadott ideig. • várakozás egy megadott ideig a kép zoomolásának megkezdése előtt (lehet nulla is). • a kép zoomolása normálról nagyítottra vagy fordítva, a megadott idő alatt. Ha egyik lehetőség sincs kiválasztva, nincs zoom. • zoom be: kezdés normál méreten, a kép nagyítása, miközben a zoom középpontja a megadott pozícióba mozog. • zoom ki: kezdés nagyított méreten a megadott zoom középpontnál, a kép visszakicsinyítése normál méretre. • [zoom center] - nyomd meg ezt a gombot, majd kattints a kép thumbnailjére, hogy megadd a kép zoom középpontját. • várakozás egy megadott ideig a zoom után (lehet nulla is) (az alapértelmezett érték a fő párbeszédablak 'kép ideje' beállítása). • átmenet a következő képre, a megadott átmenet használatával, vagy a 'next' jelzi, hogy nincs preferencia (véletlenszerűen kiválasztva). - - TOPIC: EGYÉNI MENÜ +image: custom-menu.png - Ez lehetővé teszi, hogy több menüből gyakran használt funkciókat gyűjts össze egyetlen egyéni menübe. Bejegyzéseket is hozzáadhatsz meghatározott képfájlok vagy albumok megnyitásához. A menü szkriptfunkciókat és pluginfunkciókat is tartalmaz (lásd alább). - A menü utolsó bejegyzése, a Menü szerkesztése, egy szövegszerkesztőt nyit meg magának a menülistának a szerkesztéséhez. A menünevek pontosan meg kell, hogy egyezzenek a Fotocx menükben szereplő nevekkel, de a kis- és nagybetűk nem számítanak. - A menübejegyzések a következő formátumokat vehetik fel: • # megjegyzés szöveg: egy megjegyzés, amely semmit nem csinál • menünév # felugró tipp: Fotocx menünév és opcionális felugró tipp • file : a megnevezett fájl megnyitása • album : a megnevezett album megnyitása galériaként - A következő bejegyzések alapértelmezetten jelen vannak, és nem szabad módosítanod vagy eltávolítanod őket: Szkript szerkesztése, Szkript futtatása, Kötegelt szkript, Pluginok, Menü szerkesztése. A részletek alább vannak ismertetve. - - TOPIC: SZKRIPTFÁJLOK Menüfunkciók: • Szkript szerkesztése - Egy sor szerkesztés elvégzése egy képfájlon, az összes funkció és beállítás rögzítése egy megnevezett szkriptfájlban. • Szkript futtatása - Egy szkriptfájl futtatása az aktuális képfájlon, mint egy szerkesztési funkció. • Kötegelt szkript - Válassz ki tetszőleges számú képfájlt, és futtass egy szkriptfájlt mindegyiken, köteges módban. - A szkriptfájlok lehetővé teszik, hogy egyszer definiálj egy sor szerkesztést, és később megismételd azokat egyetlen vagy több képfájlon. - ^Szkriptelhető szerkesztési funkciók Néhány szerkesztési funkció egérhúzásokat használ a képen, pl. minden torzítási funkció. Ezek nem szkriptelhetők, mivel az egérhúzások nincsenek rögzítve. Ezeknek a funkcióknak a használata le van tiltva. - A következő funkciók jelenleg szkriptelhetők: • Szerkesztés: Retus, Szegélyek, Színmód, Terület kitöltése • Javítás: Élesítés, Normál elmosás, Fokozatos elmosás, Zajcsökkentés, Ködmentesítés, JPEG artefaktok, Élsimítás, RGB beállítása • Finomítás: Hisztogram kiegyenlítése, Helyi kontraszt, Kontraszt erősítése, Globális retinex, Helyi retinex, Helyi kontraszt, Telítettség, Lágy fókusz, Fényerő-átmenet • Effektek: Körvonalak, Vázlat, Rajzfilm, Domborítás, Csempék1, Csempék2, Festmény, Textúra, Minta, Dither, Metszet, Színek beállítása, Színek eltolása, Egyéni kernel - - TOPIC: SZKRIPT SZERKESZTÉSE A párbeszédablakban nyomd meg a [indítás] gombot. Válassz fájlnevet a szkripthez. Kezdd el szerkeszteni az aktuális képfájlt. Használd a kívánt szerkesztési funkciókat tetszőleges sorrendben. Minden szerkesztés rögzítésre kerül a szkriptfájlban, az összes használt párbeszédablak-beállítással együtt. Ha végeztél, nyomd meg a [close] gombot a szkriptfájl bezárásához és a megadott fájlnévvel történő mentéséhez. - - TOPIC: SZKRIPT FUTTATÁSA Válaszd ki az egyik mentett szkriptfájlodat a felugró menüből. A szkript az aktuális képfájlon kerül végrehajtásra, mint egy normál szerkesztési funkció. - - TOPIC: KÖTEGELT SZKRIPT A párbeszédablakban nyomd meg a [Fájlok kijelölése] gombot. Válaszd ki a szerkesztendő fájlokat a szabványos {KÉPFÁJLOK KIJELÖLÉSE} fájlkiválasztó párbeszédablakkal. Ha kész vagy, nyomd meg a [Szkript kijelölése] gombot. Válassz egy szkriptfájlt a felugró menüből. A szkript most végrehajtásra kerül az összes kiválasztott fájlon. Minden módosított kép új verzióként kerül mentésre. Ha RAW fájlok kerülnek feldolgozásra, a megfelelő kimenetek TIFF-16 fájlok. - - TOPIC: BEÉPÜLŐK +image: plugins.png - A pluginfunkciók egy módot jelentenek arra, hogy más képszerkesztőket használj a Fotocx-en belül, pl. a Gimp-et. Használhatsz egy RAW képszerkesztőt, mint a Rawtherapee, majd további szerkesztéseket végezhetsz a Fotocx-szel. - ^Használati eljárás: • Nyisd meg a feldolgozandó fájlt a Fotocx-ben • Indítsd el a pluginok menüt, és válaszd ki a kívánt programot, pl. a Gimp-et • A pluginprogram elindul, és megnyitja a Fotocx-től kapott fájlt • Végezd el a kívánt szerkesztéseket a pluginprogrammal • Ha kész vagy, mentsd el a kimeneti fájlt ugyanazzal a névvel, mint a bemeneti fájl. A fájl .ext kiterjesztése változhat. • Zárd be a pluginprogramot. • A Fotocx megnyitja a plugin kimeneti fájlját az aktuális fájl szerkesztett verziójaként. • Végezz további szerkesztéseket, vagy mentsd el a szerkesztett fájlt új verzióként vagy új fájlként. - Egy példa Pluginok menü látható balra. Az utolsó bejegyzés, „Pluginok szerkesztése”, elindítja a jobb oldalon lévő szövegszerkesztő alkalmazást. Használd a szövegszerkesztőt a pluginmenü nevek és a megfelelő pluginprogramokat indító parancsok megadásához. A formátum: menünév = plugin-parancs %s TIP = a fenti parancs magyarázata A 'plugin-command' a pluginfunkció shell parancsa, a '%s' pedig az a hely, ahová az aktuális fájlnév be lesz szúrva a parancsba. Ne tegyél idézőjeleket a '%s' köré, mivel ez automatikusan hozzáadódik, lehetővé téve a szóközöket vagy más speciális karaktereket tartalmazó fájlnevek feldolgozását. A fent látható első példa egy „Gimp” nevű menü, amely elindítja a „gimp %s” parancsot. A TIP szöveg opcionális. Ha jelen van, a menünevet követő sorban található. Az egérrel a menübejegyzés fölé lebegtetve megjelenik ez a szöveg a menüszöveg mellett. - Néhány parancs elvárhatja, hogy mind a bemeneti, mind a kimeneti fájl meg legyen adva. Ebben az esetben add meg a '%s'-t mindkét pozícióban. Hagyd ki a '%s'-t, ha a parancs nem dolgoz fel képfájlt. - ^Terület kijelölése Ha a bemeneti fájlnak van kijelölt területe, csak ez a terület kerül módosításra. A pluginfunkció a teljes képet szerkeszti, de amikor az eredményt a Fotocx feldolgozza, csak a kijelölt területen történt változások maradnak meg. - - TOPIC: ZOOM - ^Zoom gomb Kattints bal vagy jobb gombbal a gombra a kép méretének növeléséhez vagy csökkentéséhez a {FÁJL NÉZET}-ben, vagy a thumbnail méretének módosításához a {GALÉRIA NÉZET}-ben. Ez csak akkor érvényes, ha a galérianézet módja {THUMBNAIL NÉZET}. Ha {METAADAT NÉZET}, semmi nem történik. - - TOPIC: ELŐZŐ/KÖVETKEZŐ - Kattints bal vagy jobb gombbal a gombra az aktuális galéria előző vagy következő fájljának megnyitásához. A bal/jobb nyílbillentyűket is használhatod. - - TOPIC: FÁJL MENTÉSE - +image: file-save.png - +image: file-save-as.jpg - Az első párbeszédablakban válaszd az 'új verzió', az 'új fájl' vagy a 'fájl cseréje' lehetőséget. - ^Új verzió Mentsd el az aktuális képfájlt egy új verziószámmal. A verziószámmal ellátott fájlnevek formátuma „filename.vNN.ext”, ahol NN egy 01 és 99 közötti szám. Ha a fájlnévnek nincs verziója, a .v01 verzió jön létre. Ha a fájlverziók már jelen vannak a lemezen, akkor a következő magasabb verziószám kerül felhasználásra. Ha a fájl egy JPEG fájl, az alapértelmezett minőség kerül felhasználásra - lásd {BEÁLLÍTÁSOK}. - ^Új fájl A fent látható 2. párbeszédablak nyílik meg az aktuális kép mentéséhez egy kiválasztott fájlba, amely lehet az eredeti fájl, egy másik meglévő fájl, vagy egy új fájl. Egy fájl JPEG, PNG, JXL és TIFF formátumban menthető. - JPEG esetén 1-100 közötti minőségi értéket választhatsz. Az alacsonyabb értékek kisebb fájlokat és gyengébb képminőséget eredményeznek. A 70 feletti értékeket nehéz megkülönböztetni a 100-tól (legmagasabb minőség, legnagyobb fájlméret). Az alapértelmezett JPEG minőség kerül felhasználásra, hacsak nem módosítod az értéket a párbeszédablakban. Az alapértelmezett a {BEÁLLÍTÁSOK}-ból származik. Nem fogsz különbséget látni egy 70-es és egy 100-as minőséggel mentett fájl között, de a fájlméretben lévő különbség hatalmas. Az átlátszó területek feketék lesznek. A JPEG nem támogatja az átlátszóságot. - A PNG és TIFF fájlok minőségvesztés nélkül vannak tömörítve, és sokkal nagyobbak, mint a JPEG. 8 vagy 16 bittel menthetők színenként. - Ha a 'legyen aktuális' be van jelölve, a mentett fájl (új fájlnév) lesz az aktuális fájl. - ^Fájl cseréje Mentsd el az aktuális képfájlt vissza önmagába. - A ^jogosultságok^ a bemeneti fájlból kerülnek másolásra. Nyomd meg a [Módosítás] gombot a jogosultságok szerkesztéséhez. - - TOPIC: METAADAT MENÜ - - A metadata olyan szöveges adat, amely egy képfájlon belül van tárolva. A digitális fényképezőgépek automatikusan létrehoznak bizonyos metadata-t, mint például a dátum és idő, a fényképezőgépre és fotóparaméterekre vonatkozó technikai adatok, és helyadatok (ha a fényképezőgép rendelkezik GPS vevővel). Más adatokat a felhasználó adhat hozzá, pl. cím, leírás, értékelés, keywords. A Fotocx bármilyen metadata alapján kereshet a képgyűjteményedben, a mappa- és fájlnevekkel vagy azok részleteivel együtt, egyező képek galériáját létrehozva. A legtöbb esetben a keresés szinte azonnali. - - TOPIC: FŐ METAADAT MEGTEKINTÉSE TOPIC: ÖSSZES METAADAT MEGTEKINTÉSE +image: view-metadata.jpg - A Fő meta megtekintése funkció megjeleníti az aktuális képfájl leggyakrabban hasznos metadata-ját. Ez tartalmazza a fotó dátumát és idejét, a zársebességet, a fókusztávolságot, a képméretet, az ISO-t stb. A digitális fényképezőgépek ezeket az adatokat a képben tárolják. A metadata tartalmazhat a felhasználó által hozzáadott adatokat is: keywords, cím vagy felirat, leírás, a fotós vagy egy későbbi szerkesztő által hozzáadott megjegyzések (ezek néha megtalálhatók publikált képekben). - Ha egy kép szerkesztve van, a szerkesztés egy rekordja elmentődik a metadata-ban. A Fő meta megtekintése mutatja az elvégzett szerkesztések előzményeit. - Az Összes meta megtekintése az összes elérhető metadata-t jelenti, és több mint 100 olyan elemet is tartalmazhat, amellyel valószínűleg nem törődsz. - A Fő meta megtekintése ablakban lévő [Extras] gomb megnyitja a jobb oldalon látható párbeszédablakot, ahol extra tageket adhatsz a jelentéshez. Bármely, az Összes meta megtekintése jelentésben elérhető tag hozzáadható a rövid jelentéshez. Kattints egy tagre a bal oszlopban, hogy hozzáadd a jobb oszlophoz és a jelentéshez. Kattints egy tagre a jobb oszlopban az eltávolításához. Kattints az „Other Tag ...” bejegyzésre, hogy beírj bármilyen, az alapértelmezett listában nem szereplő tagnevet, amely a legvalószínűbben szükséges tagekre van korlátozva. - A Fotocx a következő metadata tageket használja a képek szerkesztéséhez és kereséséhez: • Title - a kép rövid címe • Description - a kép leírása • Date/Time Original - fotó dátuma/ideje • Rating - 0-tól 5 csillagig • Country - a fényképezőgép GPS-éből vagy manuálisan hozzáadva • Location - az EXIF neve city • Geotags - latitude/longitude • Keywords - a felhasználótól származó képazonosítók • Camera data - gyártó, modell, objektív • Exposure data - idő, F-szám, fókusztávolság, ISO Ezek a tagek a {FŐ METAADAT SZERKESZTÉSE} funkcióval szerkeszthetők. Bármely más tag is szerkeszthető és kereshető, az alább ismertetett kevésbé kényelmes módszerekkel. - Több köteges funkció is elérhető adatok egyidejű hozzáadásához sok képfájlhoz. Lásd {KÖTEGELT MENÜ}. - - TOPIC: KULCSSZAVAK ÁTTEKINTÉSE A képfájlokhoz azonosító vagy osztályozó keywords tartozhatnak. Ezek felhasználhatók egy nagy képgyűjteményben a kívánt keywords-szel rendelkező képek kereséséhez. Tipikus keywords: téma, esemény, hely, személyek vagy tárgyak stb. A keywords a kép metadata-ján belül helyezkednek el. A keywords általában egy szóból állnak, de rövid, beágyazott szóközökkel vagy más elválasztókkal rendelkező kifejezés is használható. A vessző és a pontosvessző elválasztóként szolgál a keywords között, ezért nem használható egy keyword-ön belül (ez egy külső szabvány). Egy összetett keyword, mint pl. az „arizona scenery”, megengedett, de a nagyobb rugalmasság érdekében inkább két keyword-öt kellene használnod: kereshetsz olyan képekre, amelyek bármelyik keyword-öt vagy mindkettőt tartalmazzák. - Az összes kívánt keyword-del vagy keywords-szel rendelkező kép gyorsan megtalálható és megjeleníthető egy galéria ablakban. Ha értelmes módon használtad a mappa- és fájlneveket, ezekkel a nevekkel is kereshetsz képeket. Kereshetsz képeket dátum, értékelés, hely és más metadata tagek alapján is. Ezeket nem szükséges duplikálni a keywords-ben. Lásd alább a {KÉPEK KERESÉSE} funkciót. - ^Kezelt keyword rendszer Ez akkor megfelelő, ha meg szeretnéd tervezni a keyword rendszeredet, mielőtt keywords-t adnál a képeidhez. Ebben a rendszerben korlátozott számú keyword kategóriát hozol létre (pl. emberek, helyek, tárgyak, események, művészet, táj ...). A keywords szükség szerint hozhatók létre és rendelhetők egy kategóriához, amikor a keywords a képekhez van rendelve. Egy kép úgy kap keyword-öt, hogy rámutatsz és kattintasz az elérhető keywords listáján, amely kategória szerint, azon belül pedig ábécésorrendben van szervezve. Ha egy új keyword szükséges, az egy képhez való első hozzárendeléskor jön létre. Egy kategórián belüli keywords számának ideális esetben kevesebbnek kell lennie kb. 200-nál, hogy a választólistáról történő vizuális megtalálás ésszerűen gyors legyen. - ^A kezelt keyword rendszer előnyei • megakadályozza az inkonzisztens keyword neveket (pl. 'landscape' és 'scenery') • megakadályozza az eltérő írásmódokat és elgépeléseket (pl. susan, susy, susna) • megakadályozza az olyan keywords-t, amelyek más keywords-t is tartalmaznak (pl. scenery, lake) • a keresés megbízhatóbb, mivel a keywords nem tartalmazzák a fenti hibákat • a keywords hozzárendelésekor áttekintésed van az elérhető keywords-ről, ahelyett hogy egy nem kezelt rendszerben ezernyi kaotikus keyword lenne - A keywords kiválasztása egy nagy listából lassú lehet. Ezt 3 módon lehet enyhíteni: • Legfeljebb kb. 10 legutóbb használt keyword jelenik meg a metadata szerkesztése párbeszédablakban, ahol könnyen láthatók és kiválaszthatók. Mivel egy időben készült fotósorozat valószínűleg sok keyword-öt megoszt, a keywords hozzáadása könnyebbé és gyorsabbá válik. • Egyszerűen elkezdheted beírni a kívánt keyword nevét. Egy felugró lista jelenik meg az egyező keywords-ről, amint már csak néhány lehetséges egyezés van. Ekkor rákattinthatsz a kívánt keyword-re, hogy hozzáadd a képhez. Ha nincs egyező keyword, lehetőséged van az új keyword hozzáadására a definiált keywords listájához. • Kiválaszthatsz egy kategóriát egy kisebb választólista megjelenítéséhez. - Ha a keywords tágan vannak meghatározva és kevesebb van belőlük, a keywords keresési eredményei nagyobbak lesznek, de a kívánt képek vizuális megtalálása egészen gyors lehet. A fizikai fájlsorrend megmarad: a mappáikban együtt elhelyezkedő képfájlok a keresési eredményekben is együtt jelennek meg. - Az internetről letöltött képek gyakran tartalmaznak keywords-t. Ezeknek természetesen nincs semmilyen szervezettségük, és összességében kaotikusak. Ha kezelt keyword rendszert használsz, a legjobb, ha átnézed az ilyen képeket, és megtisztítod a keywords-t, hogy megfeleljenek a rendszerednek, vagy törlöd őket. Bármely új keyword, amely jelen van, automatikusan a „nocatg” kategória alá kerül hozzáadásra. Ha nem kívánt keywords-t veszel észre a keyword listádban, használd a {KÉPEK KERESÉSE} funkciót keyword szerint, hogy megtaláld a nem kívánt keywords-szel rendelkező képeket, hogy azok javíthatók vagy eltávolíthatók legyenek. - ^Véletlenszerű keyword rendszer Előfordulhat, hogy inkább szükség szerint találsz ki keywords-t, anélkül, hogy bármilyen konkrét rendszerre gondolnál. Vagy már lehet, hogy több ezer keyword-öd van, ami megnehezíti a kezelt keyword rendszerre való áttérést (de nem lehetetlenné teszi: a Fotocx tömegesen tudja konvertálni a keyword neveket). Ebben az esetben egyszerűen beírhatod a keywords-t a képeidbe, szükség szerint új keywords-t létrehozva. Van még némi lehetőség a keywords rendezett tartására: a beírt karaktereknek megfelelő meglévő keywords megjelennek, amint már csak néhány lehetséges egyezés van. Példa: beírod, hogy „new”, és megjelenik egy lista: New York, New Delhi, Newman ... Ha ezek egyike a szándékod, rákattintasz a keyword kiválasztásához. Ha nem, tovább gépelsz, és végül megnyomod az Entert egy új keyword létrehozásához. Amikor keywords szerint keresel képeket, beírhatod a kívánt keyword neveket, vagy kiválaszthatod őket az elérhető keywords listájából. Az általad beírt első néhány betűnek megfelelő elérhető keywords megjelennek, és választhatsz ebből a listából. Nem adhatsz meg olyan keresési keyword-öt, amely sehol sem létezik a képeidben. Egy véletlenszerű keyword rendszer valószínűleg több ezer keyword-öt fog eredményezni. Ez nem biztos, hogy túl hasznos. - - TOPIC: GEOTAGS OVERVIEW A modern fényképezőgépek belső GPS vevő segítségével rögzíthetik minden egyes fotó helyét. A latitude, longitude (és esetleg a city/location és a country) rögzítésre kerülnek a képfájl EXIF metadata-jában. A {FŐ METAADAT SZERKESZTÉSE} funkció is lehetővé teszi helyadatok megadását vagy módosítását. A helyek egy zoomolható világtérképre kattintva is megadhatók. Funkciók egy megadott hely vagy régió képeinek megtalálásához: • {KÉPEK KERESÉSE}: Keresés helynév alapján (több név is, részleges egyezések is). • {HELYEK/DÁTUMOK}: Keresés ország, hely és dátumcsoportok szerint • Képek térképi hely szerint: Kattints egy térképjelölőre, hogy megjelenjen a jelölő helyén lévő összes kép. - A fényképezőgép GPS-éből származó helynevek (város vagy más helynév, és ország) nem szabványosítottak, és kaotikusak lehetnek (pl. Munich, München, MONACO). Hogy ezzel hogyan kell bánni, azt alább tárgyaljuk. - - TOPIC: FŐ METAADAT SZERKESZTÉSE +image: edit-meta.jpg - A Fő meta szerkesztése funkció alapvető metadata hozzáadására szolgál egy képhez. Kérjük, olvasd el a {KULCSSZAVAK ÁTTEKINTÉSE} és a {GEOTAGS OVERVIEW} (fent) témákat, mielőtt a Fő meta szerkesztése funkciót használnád. - A Fő meta szerkesztése a leggyakrabban használt metadata szerkesztésére szolgál: kép dátuma és ideje, értékelés, cím, leírás, helyadatok és keywords. A párbeszédablak kezdetben az aktuális kép adatait mutatja. Kiegészítések vagy módosítások után nyomd meg az [Alkalmaz] gombot a képfájl frissítéséhez. A metadata változtatásokhoz nincs automatikus fájlverziózás, de igény szerint használhatod a Fájl mentése > Új verzió lehetőséget. - A párbeszédablak megjeleníti az aktuális kép metadata-ját Fájlnézetben, vagy egy megkattintott thumbnail metadata-ját Galérianézetben. A szerkesztő párbeszédablak frissül, amikor egy új kép nyílik meg, vagy egy új thumbnailre kattintasz. - A kép dátuma, ha elérhető, Kép dátuma néven jelenik meg. Ez megadható, ha hiányzik, vagy módosítható. Megadhatsz egy teljes dátumot yyyy:mm:dd formátumban, vagy egy rövidebb yyyy vagy yyyy:mm formátumot. Egy hiányzó hónap/nap logikailag egyenértékű a 01:01-gyel, amikor a keresés alsó határértékéhez hasonlítják, vagy a 12:31-gyel, amikor a felső határértékhez hasonlítják. A [Előző] gomb kitölti a dátumot a korábban megadott adatokból. Ez a képsorozatok egyszerű dátumozását teszi lehetővé. Ha az idő fontos, hozzáadhatsz egy időt hh:mm[.ss] formátumban. A teljes beviteli formátum: yyyy:mm:dd hh:mm:ss - Megadhatsz egy címet, leírást és értékelést (0-5 csillag) a képhez. A cím vagy leírás szerkesztéséhez nyomd meg a megfelelő [szerkesztés] gombot. Ez megnyit egy szövegszerkesztőt, nagy méretkorláttal a szöveghez. Használhatod az [enter] billentyűt szándékos sortöréshez. A Fotocx-ben ezek a sortörések működnek; más képnézegetőkben pontokkal helyettesítődhetnek. - A meglévő keywords a Kép keywords mezőben jelennek meg. Az elérhető keywords a lenti Definiált keywords ablakban jelennek meg. Ezen keywords egyike hozzáadható a képhez a rákattintással. Egy keyword törölhető a képből, ha rákattintasz a Kép keywords mezőben. A nemrég hozzáadott keywords a Legutóbbi keywords mezőben jelennek meg. Ez egy kényelmi funkció, amely megkönnyíti a keywords hozzáadását egy új képkötegehez, mivel sok ugyanaz a keyword ismét felhasználásra kerül. Ugyanúgy mutass rá és kattints. - Ha a definiált keywords listája hosszú, könnyebb lehet beírni a kívánt keyword-öt a Keyword megadása mezőbe. Az eddig beírtaknak megfelelő meglévő keywords megjelennek az Egyező keywords mezőben, és rákattinthatsz az egyikre, hogy hozzáadd a keyword-öt a képhez. Ha a bevitt keyword új (nem jelenik meg egyező keyword), nyomd meg az [új kulcsszó hozzáadása] gombot, amikor a keyword teljes. Ez hozzáadásra kerül a képhez és a definiált keywords listájához, „nocatg” kategóriával. - Ha keyword kategóriákat használsz, kiválaszthatsz egy kategóriát, és csak azok a keywords fognak megjelenni a definiált keywords listájában. - Az [Alkalmaz] gomb kiírja az adatokat a képfájlba és a képek kereséséhez használt metadata indexfájlba. - A [Előző] gomb (a párbeszédablak alján) használható az összes elérhető adat betöltésére a legutóbb megtekintett vagy szerkesztett képből. Ez felgyorsíthatja egy nagyrészt azonos adatokkal rendelkező képcsoport feldolgozását. - ^Geotags hozzáadása Több módja van a helynevek és geokoordináták hozzáadásának a {FŐ METAADAT SZERKESZTÉSE} párbeszédablakban. - Fényképezőgép GPS A fényképezőgéped GPS érzékelője beillesztette a helyneveket és geokoordinátákat. Előfordulhat, hogy nem a kívánt nyelven, vagy csupa nagybetűvel, vagy más kaotikus formában. Használd a [clear] gombot az újrakezdéshez, és add meg az új szöveget. - [Keresés] gomb Keress egy helyet, amely bárhol jelen van a képfájljaidban, vagy egy hatalmas ismert helyek listájában (worldcities.txt). Adj meg néhány kezdő karaktert a Location mezőben, és nyomd meg a [Keresés] gombot. Ha megjelenik egy egyező helyek választólistája, válassz egyet. Ha semmi nem jelenik meg, használd a [Térkép] gombot, hogy kattints egy térképi helyre. Ha szükséges, módosítsd a hely- és országneveket. Ez a hely most már ismert, és elérhető a választáshoz. - [Előző] gomb Ha a szerkesztés alatt álló képnek ugyanazok a helyadatai, mint a korábban szerkesztett képnek, nyomd meg az [Előző] gombot a korábban használt helyadatok kitöltéséhez. - A {KÖTEGELT GEOTAGEK} funkcióval sok képfájlhoz egyszerre adhatsz hozzá helyadatokat. - - TOPIC: BÁRMELY METAADAT SZERKESZTÉSE +image: edit-any-metadata.png - Ez egy párbeszédablak az aktuális képfájl bármely metadata-jának szerkesztéséhez. A leggyakoribb szerkesztendő tagek balra vannak felsorolva. Nyomd meg a [Teljes lista] gombot, hogy megkapd az aktuális képfájl összes elérhető tagjének listáját (akár több száz is lehet). Nyomd meg a [Rövid lista] gombot, hogy visszatérj a gyakori tagek listájához. Kattints egy tagre a listában, hogy lekérd az aktuális tag értékét. Módosítsd az értéket, ha szeretnéd, és nyomd meg a [frissítés] gombot. Egy nem a listában szereplő tagnév szerkesztéséhez add meg a tagnevet, és nyomd meg a [lekérés] gombot a jelenlegi érték lekéréséhez, ha van ilyen. Ezután add meg vagy módosítsd az értéket, és nyomd meg a [frissítés] gombot. Egy tag törléséhez nyomd meg a [törlés] gombot. A tagnevet kisbetűvel, szóközökkel vagy azok nélkül is megadhatod, pl. a „Subject Distance” és a „subjectdistance” egyaránt működik. Néhány tag nem módosítható, pl. az 'image width' a kép pixelszélessége, amely csak a kép pixelszélességének módosításával változtatható meg. A rövid lista forrása a /meta_picklist szövegfájl. Ehhez a listához tageket adhatsz hozzá vagy távolíthatsz el. - - TOPIC: METAADAT TÖRLÉSE Add meg a törlendő tag nevét, vagy válaszd az Összes lehetőséget. A metadata törlődik. Használd az Összes lehetőséget, hogy megtisztíts egy képet bármilyen jelen lévő azonosító információtól. Néhány tag nem törölhető, pl. a File Name. - - TOPIC: METAADAT MÁSOLÁSA A Fotocx-szel létrehozott egyesített képek (HDR, panoráma, mashup ...) alapértelmezetten nem tartalmaznak metadata-t. Használd ezt a funkciót, hogy metadata-t másolj az egyik bemeneti képből, vagy bármely más képből. Használd a [Tallózás] gombokat, hogy kiválaszd a metadata forrásfájlját és a metadata-t fogadó fájlt (a párbeszédablakban „target file”). - - TOPIC: METAADAT JAVÍTÁSA Használd ezt a funkciót, ha van egy képfájlod, amely hibaüzenetet ad, amikor megpróbálod szerkeszteni a metadata-t. Ez törli a hibásan formázott metadata-t, és megtartja a többit. - - TOPIC: KULCSSZAVAK KEZELÉSE +image: manage-keywords.png - Hozz létre keywords-t, és opcionálisan csoportosítsd őket kategóriákba. Kategóriákat rendelhetsz a keywords-höz, hogy segítsd a rendszerezésüket, és gyorsabban megtaláld őket, amikor keywords-t adsz a képekhez. Ezek opcionálisak, és nem játszanak szerepet a keyword keresésben: csak a keyword kerül tárolásra egy képben, a kategóriája nem. Tipikus kategóriák: emberek, helyek, tárgyak, események, táj, épületek, művészet stb. Egy új keyword új kategóriával történő hozzáadásához add meg a kategóriát és a keyword-öt, majd kattints a [create] gombra. Ha a kategória üres, a keyword a „nocatg” kategóriához kerül rendelésre. Egy keyword másik kategóriához rendeléséhez kattints egy kategóriára (félkövér szöveg), vagy adj meg egy újat, kattints a keyword-re, és nyomd meg a [create] gombot. A keyword átkerül a régi kategóriából az újba. Egy keyword törléséhez kattints a keyword-re, és nyomd meg a [törlés] gombot. A képekben használt, de kategóriához nem rendelt keywords a „nocatg” alatt jelennek meg. Egy kategória, amelyhez nincs keyword rendelve, törölhető - kattints a kategóriára, töröld a keyword nevét, ha van ilyen, majd nyomd meg a [törlés] gombot. - Megjegyzés: egy újonnan létrehozott keyword a kategóriájának keyword listája végéhez kerül hozzáfűzésre. A Fotocx következő indításakor az összes kategória és keyword listája ábécésorrendbe kerül, kivéve, hogy a „nocatg” mindig utolsó. - - TOPIC: FELIRATOK +image: choose-captions.png - ^Feliratok kiválasztása menü Válaszd ki, mely metadata tageket használja a fájlnézet módban a kép bal felső sarkában megjelenő szöveges feliratokhoz. - ^Feliratok váltása menü Kapcsold BE vagy KI a feliratok megjelenítését. Rendelj hozzá egy gyorsbillentyűt a feliratok megjelenítésének gyors engedélyezéséhez vagy letiltásához. - ^Megjegyzés:^ ha az egeret a kép bal felső sarkába mozgatod fájlnézetben, megjelenik a cím és a leírás egy felugró képben. A kép eltűnik, ha az egeret elmozdítod. - - TOPIC: HELYEK/DÁTUMOK +image: image-locations.jpg - Ez egy gyors módja annak, hogy megtaláld az összes fotót, amely egy adott helyen, vagy egy hely és dátumtartomány szerint készült. A párbeszédablakban válassz a két lehetőség közül: az összes kép belefoglalása a jelentésbe, vagy csak az előző Keresés funkció által talált képek belefoglalása. Majd válaszd ki a kívánt csoportosítási szintet: ország ország és hely ország és dátum ország és hely és dátum dátum és ország dátum és ország és hely - Ha a dátum benne van, válassz egy napokból álló tartományt az összevonáshoz: a tartományon belüli dátumú fotók az első dátum alatt kerülnek csoportosításra. Nyomd meg a [proceed] gombot, hogy megkapj egy jelentést, amely mutatja az egyes csoportok képeinek számát: ország, ország és hely stb. szerint. Ez egyben a rendezési sorrend is. A fenti példában 28 fotó Új-Zélandról származik, 2004.11.02-én. Kattints egy sorra a jelentésben, hogy megkapd az adott képek thumbnail galériáját. - - TOPIC: IDŐVONAL +image: timeline-report.jpg - Ez a jelentés egy idővonalat készít a képek havi számáról. Válassz a két lehetőség közül: az összes kép belefoglalása a jelentésbe, vagy csak az előző Keresés funkció által talált képek belefoglalása. Kattints egy évre és hónapra a kapott jelentésben, hogy megkapd az összes olyan kép thumbnail galériáját, amelynek fotódátuma (EXIF) a kiválasztott hónapba esik. A fenti példa 208 képet mutat 2017 októberére. A 'null' év a fotódátum nélküli képekhez tartozik. - - TOPIC: METAADAT TAGEK Ez a funkció megtalálja az összes képfájlt, amely egy megadott metadata tag-et és értéket használ. Válassz egy tag-et a felugró listából: rating, keywords, title, description, camera, extra indexelt metadata - lásd {FÁJLOK INDEXELÉSE}. Megjelenik az elérhető tag értékek listája, az adott tag értéket használó képfájlok számával együtt. A 'title' és 'description' esetén csak az első 60 karakter jelenik meg, és minden olyan fájl jelentésre kerül, amely ennek a kezdő 60 karakternek megfelelő tag értéket használ. A 'camera' esetén az egyező érték a gyártó, modell és objektív kombinációja. - - TOPIC: AUTOMATIKUS KERESÉS Ezt a funkciót shell szkriptfájlok használhatják olyan képfájlok kinyerésére, amelyek megfelelnek a Képek keresése funkció használatakor elérhető bármely kiválasztási feltételnek (lásd alább). Először használd a Képek keresése funkciót a kívánt kiválasztási feltételek beállításához (pl. mappa-/fájlnevek, dátumok, keywords vagy más metadata). Használd a [mentés] gombot a feltételek beállítási fájlba mentéséhez. Használd a következő parancsot a Fotocx elindításához és a keresés végrehajtásához: $ fotocx -m autosearch . A kimenet a /search_results helyre kerül. - - TOPIC: KÉPEK KERESÉSE Használd a Képek keresése funkciót, hogy megtalálj bármilyen kívánt metadata-val (dátum, keywords, hely ...) rendelkező képeket. A kereséshez egy metadata indexfájl kerül felhasználásra, amely lehetővé teszi, hogy másodpercenként több ezer képet keressünk át. - Két jelentésformátum létezik: egy thumbnail galéria, amely az összes keresési feltételnek megfelelő képet mutatja, vagy egy metadata jelentés, amely thumbnaileket kombinál metadata szöveggel. Íme egy példa a metadata jelentés formátumra: +image: search-images-metadata.jpg - ^Keresési párbeszédablak +image: search-images.jpg - A párbeszédablakban válaszd ki, hogy mely képeket keresd: az összeset (all images), vagy az aktuális halmazt, ami az aktuális galéria képeit jelenti, amely lehet egy mappa, album, vagy egy korábbi képkeresés eredménye. - Ezután válaszd ki, mit tegyél a talált egyező képekkel: az 'new set' azt jelenti, hogy lecseréled az aktuális halmazt a talált képekre, az 'add' azt jelenti, hogy hozzáadod őket az aktuális halmazhoz (galériához), a 'remove' pedig azt, hogy eltávolítod őket az aktuális halmazból. Képek eltávolításához az aktuális halmazban kell keresned. - A kiválasztási feltételeknek megfelelő fájlok esetén megadhatod azt is, hogy mely verziók legyenek kiválasztva: original, last version, vagy all versions. Az 'original' az eredeti vagy módosítatlan képet jelenti (vagy az első verziót, ha az eredeti nem lett elmentve). A 'last version' a legfrissebb vagy legutóbb szerkesztett elérhető verziót jelenti. Az 'all versions' azt jelenti, hogy az eredeti és az összes verzió lekérésre kerül. - Válaszd ki a kívánt jelentéstípust. A galéria jelentés egy thumbnail képekből álló oldal, amely olyan hosszú, amennyire szükséges az összes keresési feltételnek megfelelő kép elhelyezéséhez. A metadata jelentés thumbnail képeket és minden thumbnail mellett metadata tagek listáját tartalmazza. Ezek magukban foglalják a szabványos tageket (date, rating, keywords, geotags, title, description) és bármely más metadata tag-et, amelyet a tag kiválasztási listában adtál hozzá (lásd alább). - Add meg a keresési feltételeidet. Válaszd ki a kívánt keywords-t, dátumokat, csillagértékeléseket, szövegben szereplő szavakat (kép címe vagy leírása), fájl- vagy mappaneveket, és helyneveket. Lásd a további részleteket alább. - Az elérhető keywords a Definiált keywords mezőben jelennek meg, és rámutatással és kattintással választhatók ki. Ha a definiált keywords listája hosszú, könnyebb lehet elkezdeni beírni egy keyword-öt az 'enter keyword' mezőbe. Az eddig beírtaknak megfelelő meglévő keywords megjelennek a 'matches' listában, és rákattinthatsz az egyikre, hogy hozzáadd a keyword-öt a keresési listához. - Ha keyword kategóriákat használsz, kiválaszthatsz egy kategóriát, és csak azok a keywords fognak megjelenni a definiált keywords listájában. - Megadható egy dátumtartomány a keresés a dátumtartományon belüli képekre korlátozásához. Válaszd a photo date (a fényképezőgépből) vagy a file date (létrehozási vagy legutóbbi módosítási dátum) lehetőséget. A formátum yyyy:mm:dd. Azok a képek kerülnek kiválasztásra, amelyeknek a dátuma az első dátumon vagy azután van, ha meg van adva, és a második dátumon vagy azelőtt van, ha meg van adva. A hiányzó hónap/nap alapértelmezetten 01/01 az alsó dátumhatárnál, és 12/31 a felső határnál. Az idő opcionálisan megadható yyyy:mm:dd hh:mm formátumban. A hiányzó idők alapértelmezetten 00:00 és 23:59. - Az EXIF fotódátum nélküli képek (pl. beszkennelt képek) kereséséhez használd a „null” értéket az első dátummezőben. - Megadható egy pár csillagértékelés, hogy az eredményeket a megadott tartományon belüli értékelésű képekre korlátozza. A hiányzó alsó érték 0 csillagot jelent, a hiányzó felső érték pedig a legmagasabb értékelést, 5 csillagot. - Mappa- és fájlnevek is kereshetők. A search file names mezőben adj meg tetszőleges számú, a képmappáidhoz és fájlnevekhez használt nevet, vesszővel elválasztva. Az „egypt cairo” bevitel megegyezik minden olyan képmappa- vagy fájlnévvel, amely ezen szövegek bármelyikét tartalmazza. A részszövegek is egyeznek. A kis- és nagybetűk nem számítanak. - A kép címe és leírása is kereshető. Add meg a keresendő szavakat a search title/desc mezőben, vesszővel elválasztva. Ezek minden kép címének és leírásának minden szavával összehasonlításra kerülnek, és az egyező képek kerülnek kiválasztásra. A kis- és nagybetűk nem számítanak. - Helyek kereséséhez adj meg egy vagy több city/location vagy country nevet a search locations mezőben, vesszővel elválasztva. Csak azok a képfájlok kerülnek kiválasztásra, amelyeknek a geotags-je megegyezik a megadott helyek egyikével. Egy hely lehet város, park vagy más földrajzi név (bármi, ami a metadata 'City' és 'Country' mezőiben van tárolva). A kis- és nagybetűk nem számítanak. - Az 'all' és 'any' választógombok a keywords-re, a szövegre, a fájlnevekre és a helyekre vonatkoznak. Kiválaszthatod azokat a képeket, amelyek MINDEN megadott szöveget tartalmaznak, vagy amelyek BÁRMELYIK megadott szöveget tartalmazzák. Példa: ha a helykeresési mező „new york”, és az „any” van kiválasztva, a New Zealand-ről és York-ból, Angliából származó képek is bekerülnek. Ha az „all” van kiválasztva, csak a New York-ban készült képek kerülnek bele. - Ha hiányzó adatú képeket szeretnél találni, megadhatod a „null” értéket egyező értékként. - ^További metadata keresése A 'tagname', 'condition' és 'match values' párbeszédablak-mezők segítségével megadhatsz további metadata tageket, amelyeket kiválasztási feltételként használhatsz, vagy amelyeket a jelentés kimenetéhez adhatsz, ha a „metadata” jelentéstípus van kiválasztva. Egy adott képfájlhoz elérhető tagek a {ÖSSZES METAADAT MEGTEKINTÉSE} funkcióval jeleníthetők meg. Ezek sok, a fő párbeszédablakban nem szereplő tag-et is tartalmaznak. A választólista a /meta_picklist szövegfájlból származik. Ehhez a fájlhoz igény szerint tageket adhatsz hozzá. Használhatsz olyan tageket is, amelyek a fő párbeszédablakban is szerepelnek. Ennek előnye, hogy rugalmasabb egyeztetési logika használható. - Az egyeztetési logika minden metadata tag-hez külön kiválasztható. ^egyeztetési módszer egyező érték a kiválasztáshoz • report bármely érték, hiányzó is • reportx nem hiányzó érték • matches vesszővel elválasztott szövegértékek • contains ugyanaz, részszöveg-egyezéssel • number = egyenlő értékek • number => egyenlő vagy nagyobb értékek • number <= egyenlő vagy kisebb értékek - A jobb oldali [X] gombok az egyes metadata keresési tagek törlésére használhatók. - ^Párbeszédablak gombok A [Betöltés] és a [Mentés] a keresési feltételek fájlból történő betöltésére vagy mentésére használhatók. A [Törlés] törli az összes adatot a párbeszédablakban. A [Folytatás] elindítja a keresési folyamatot. - Nyomd meg a [proceed] gombot a keresés végrehajtásához. A kimenet egy szabványos thumbnail galéria, vagy a fent bemutatott metadata jelentés formátum. A megtalált képeket elmentheted állandó albumként - lásd {ALBUMOK}. - ^Teljesítmény Az indexelt metadata keresése és jelentése szinte azonnali. A nem indexelt metadata sebessége a számítógép és a lemez sebességétől függ. Egy erős, SSD lemezzel rendelkező számítógép percenként több mint 100 ezer fájlt tud átkeresni. - ^search_results^ (album) A Képek keresése kimenete a „search_results” albumban kerül mentésre. Nevezd át ezt az albumot, ha nem szeretnéd, hogy egy későbbi keresés lecserélje. - Korlátozás: A keresési funkció 40 000 eredményre korlátozott (a keresési feltételeknek megfelelő talált képek). Ha ez a korlát túllépésre kerül, értesítést kapsz, és a keresés csonkolásra kerül. Ez a korlát azért létezik, mert a GTK-ban egy görgetett ablak mérete korlátozott, és egy nagyobb ablak létrehozására tett kísérlet összeomlást vagy lefagyást eredményezhet. - - TOPIC: KIJELÖLÉS MENÜ - - TOPIC: TERÜLET ÁTTEKINTÉS A szerkesztési funkciók általában a teljes képre vonatkoznak, de lehetséges egy kép egy részének (egy „terület”) szerkesztése, a többit változatlanul hagyva. Ha egy képterület ki van jelölve, akkor a legtöbb szerkesztési funkció csak ezen a területen belül fog működni. Néhány funkció (pl. Átméretezés) figyelmen kívül hagyja a kijelölt területet. Egy terület kijelölhető egy szerkesztési funkció indítása előtt, vagy annak használata közben. A kijelölt terület azonnal aktívvá válik, a korábbi szerkesztések megmaradnak, és a jövőbeli szerkesztések csak a területen belül lesznek érvényesek. Ha egy másik szerkesztés indul, a kijelölt terület aktív marad, így lehetséges egy sor szerkesztést végrehajtani egy területen belül. Egy terület a képen belül több nem összekapcsolt területből is állhat. - A Fotocx 'terület'-eket használ 'réteg'-ek helyett. Ahelyett, hogy kiválasztanál valamit a képből, külön réteget hoznál létre a kijelölésből, szerkesztenéd a réteget, majd végül összeolvasztanád azt, kiválasztasz valamit a képen, szerkesztési funkciókat hajtasz végre a kijelölésen, és azonnal látod a végeredményt. A területek elmenthetők, beilleszthetők egy másik képbe, mozgathatók és átméretezhetők, valamint tovább szerkeszthetők. - +image: edit-selection.jpg - Egy kijelölt terület szerkesztése néha látható határokat eredményezhet a terület szélein (néha ezek megfelelnek a kép elemeinek éleinek, ezért nem probléma). A szélek összeolvaszthatók a {TERÜLET KEVERÉSE} funkcióval: a szerkesztések fokozatosan alkalmazhatók a terület szélétől befelé, és kiválaszthatod, mely szélek legyenek összeolvasztva. - - TOPIC: TERÜLET KIJELÖLÉSE +image: select-area.jpg - A Terület kijelölése párbeszédablak a Kijelölés > Terület kijelölése menüvel indul. Válaszd ki az alább ismertetett módszerek egyikét. Minden módszer más módon jelöli ki a képterületeket. Bármikor módosíthatod a módszereket, és a kijelölt területek halmozódnak. A kijelölt képterület(ek) körvonala megjelenik, ahogy területeket adsz hozzá vagy távolítasz el a kijelölésből. A [Befejezés] gomb a képpixelek feltérképezésére szolgál a terület körvonalain belül, felkészítve azokat a következő szerkesztési funkciók alkalmazására. A [Elrejtés] gomb elrejti a terület körvonalát, jobb láthatóságot biztosítva a szerkesztésekhez és a lehetséges területszéli hatásokhoz. Használd a [Megjelenítés] gombot a terület körvonalának megjelenítéséhez. A [Törlés] gomb eltávolítja az összes területkijelölést. A terület kijelölése párbeszédablak megszakítható, és később újraindítható a meglévő területek módosításához vagy újak hozzáadásához. - ^Módszerek A következő módszerek egy vagy több olyan képterület bekerítésére szolgálnak, amely a végső területhez fog tartozni. Ezek a módszerek bármilyen sorrendben használhatók olyan terek meghatározásához, amelyek összekapcsoltak vagy különállók. • Téglalap - húzással körvonalazz egy téglalap alakú területet • Ellipszis - húzással körvonalazz egy kör vagy ellipszis alakú területet • Szabadkézi rajzolás - körvonalazz egy területet az egérrel rajzolva • Él követése - körvonalazás a kép elemeinek éleit követve • Terület kijelölése az egéren belül - húzással jelölj ki pixeleket az egérmutató körüli körön belül. • Egy szín kijelölése az egéren belül - csak egy adott színnek megfelelő pixelek kijelölése, 0-100%-os egyezéssel. • Minden szín kijelölése az egéren belül - jelöld ki az egéren belüli összes pixelt, terjeszd ki a kijelölést a szomszédos, az egéren belüli színeknek megfelelő színű területekre is (néha 'flood'-nak nevezik). - A következő bekezdések ismertetik az egyes módszerek részleteit. - ^Téglalap Húzd az egeret a kijelölendő téglalap alakú terület egyik sarkából a szemközti sarokba. Egy téglalap kerül rajzolásra a terület bekerítéséhez. Kattints jobb gombbal a törléshez és újrakezdéshez. Ismételd meg a folyamatot további téglalap alakú területek kijelöléséhez. - ^Ellipszis Ez ugyanúgy működik, mint a téglalap kijelölése, azzal a különbséggel, hogy a bekerített terület egy kör vagy ellipszis. A húzás kezdőpontja a keletkező ellipszis középpontja. A húzás szöge határozza meg az ellipszis alakját. - ^Szabadkézi rajzolás Húzd az egeret (bal gombbal lenyomva) szabadkézi vonal rajzolásához, vagy kattints bal gombbal, hogy egy egyenes vonalat kössél az utoljára rajzolt ponttól a megkattintott pontig. Folytasd a célterület körül, amíg körbe nem veszik összekapcsolt görbék és vonalak. Kattints jobb gombbal az előző vonalak (hibák) eltávolításához. Egy jobb kattintás eltávolítja az előzőleg megkattintott vagy húzott vonalat, legfeljebb 50 pixelig. Kattints jobb gombbal ismételten, hogy többet eltávolíts. Egy új megkattintott vonal mindig az előző vonal végéhez fog kapcsolódni. Egy új húzott vonal kapcsolódik az előző vonalhoz, ha annak vége közelében indul. Ha máshol indul, egy nem kapcsolódó vonal kerül rajzolásra. Elindíthatsz egy új húzást messziről, és visszarajzolhatsz, hogy találkozz az előző vonallal. Ha egy megkattintott vonal nem kívánt ponthoz kapcsolódik (azaz nem szeretnéd az utoljára rajzolt vonalhoz kapcsolni), kattints jobb gombbal a törléséhez, majd használj húzást egy új vonalsorozat elindításához. A jobb gombos húzás vonalszakaszok törlésére használható: húzz jobb gombbal szorosan egy vonal mentén a törléséhez, majd húzz bal gombbal a vonal újrarajzolásához. A végén egy területnek teljesen bezártnak kell lennie, rések nélkül. A végeken kicsit átfedő vonalak rendben vannak. A rések nehezen találhatók meg és javíthatók, ezért dolgozz 100%-os vagy nagyobb képméretben, és légy körültekintő. A bal kattintásokkal automatikusan összekapcsolt vonalsorozat nem hagy réseket, de az ettől való eltérés valószínűleg réseket hoz létre. A rések lehetőségének csökkentéséhez használj szándékos átfedéseket a vonalak kézi összekapcsolásakor. Van egy résfelismerő segédeszköz, amelyet alább ismertetünk - {TERÜLET HÉZAG KERESÉSE}. Ha egy terület szélének éle egyben egy kép széle is, nem kell megrajzolnod a terület ezen részét. Rajzold a vonalat a kép szélén túlra, majd rajzold vissza a képre egy másik pozíción a kép széle mentén. - ^Él követése Az utoljára rajzolt pont és egy újonnan megkattintott pozíció közötti magas kontrasztú pixelek (valószínűleg a kép elemeinek élei) megtalálásra és összekapcsolásra kerülnek. Ez hatékony olyan tiszta éleknél, amelyek nem túl szabálytalanok. A homályos és szaggatott élek nem biztos, hogy jól működnek, és szabadkézi rajzolásra lesz szükség, ha nagy pontosság szükséges. A vonalak összekapcsolásának szabályai ugyanazok, mint fent ismertetve. Az egér húzása kattintás helyett úgy működik, mint a szabadkézi rajzolás, de hajlamos az elemek éleit követni az egér mögötti pozícióból. Nagyon szabálytalan élekhez (haj, lombozat) lásd a 'deselect color'-t alább. - ^Egérsugár és színegyezési szint Ez a két vezérlő csak az alább ismertetett 'select within mouse' módszerekre vonatkozik. Az egérsugár meghatározza az egérmutató körüli kör méretét. A körön belüli pixelek kijelölésre kerülnek, vagy egy színkészletet biztosítanak a pixelek egyeztetéséhez és kijelöléséhez az egérkörtől kifelé. Az egyezési szint meghatározza a pixelek kijelöléséhez szükséges egyezési szintet (0-100%) a színük és fényerejük alapján. A '0' azt jelenti, hogy bármi egyezik, a '100' pedig azt, hogy tökéletes egyezés szükséges. - ^Terület kijelölése az egéren belül A bal kattintás vagy húzás kijelöli az egérkör által bezárt pixeleket. A jobb kattintás megszünteti az utolsó kijelölést (ismételd meg, hogy többet szüntess meg). A jobb gombos húzás megszünteti a bezárt pixelek kijelölését. - ^Egy szín kijelölése az egéren belül Kattints a képre egy szín kiválasztásához. A szín megjelenik a színgombon. A gombot közvetlenül szín beállítására is használhatod. Bal/jobb gombos húzással jelöld ki/szüntesd meg az egérkörön belüli, a kijelölt színnek az egyezési szinten belül megfelelő pixelek kijelölését. Állítsd az egyezési szintet lejjebb vagy feljebb, hogy nagyobb vagy kisebb színtartományt egyeztess. Kattints a képre szükség szerint az egyeztetendő szín módosításához. - ^Opcionális kijelölés-megszüntető szín Ez csak a fenti 'select one color' funkcióra vonatkozik. Kattints bal gombbal a képre egy kijelölés-megszüntető szín beállításához. Amikor a jelölőnégyzet be van jelölve, a kijelölés-megszüntető szín aktív. Ha egy pixel jobban megfelel a kijelölés-megszüntető színnek, mint a kijelölő színnek, a pixel kijelölése megszűnik. Amikor egy olyan elemi él mentén jelölsz ki, amelynek alacsony a színkontrasztja a szomszédos, kijelöletlenül maradó területhez képest, állítsd be a kijelölés-megszüntető színt a szomszédos területről. Ez segít egy komplex él, mint pl. haj vagy lombozat pontos kijelölésénél. - ^Minden szín kijelölése az egéren belül Ezt néhány szerkesztőben 'flood'-nak nevezik. Bal/jobb gombos húzással jelöld ki/szüntesd meg az egérkörön belüli pixelek kijelölését. Az egérkörön túli pixelek is bekerülnek, ha megfelelnek ennek a két feltételnek: 1) a színük megegyezik bármely, az egérkörön belüli színnel, az aktuális egyezési szinten belül. 2) az egérmutató keresési tartományán belül vannak. Ez az egérsugár egy tényezője, pl. ha az egérsugár 20, a keresési tartomány pedig 3, akkor a keresési tartomány 60 pixel az egérmutatótól. Húzd az egeret az újonnan bevonni kívánt területek felett. Figyeld meg, ahogy a kijelölt terület kiterjed az egérkörön belüli színeknek megfelelő színű területekre. Ha túl messzire mész, kattints jobb gombbal az utolsó kijelölés eltávolításához. Ismételd meg, ha szükséges, további korábbi kijelölések eltávolításához. Csökkentsd a sugarat vagy növeld az egyezési szintet finomabb vezérlés eléréséhez - a kijelölés lassabban fog kiterjedni, és közelebb marad az egérkörhöz. Egy kis sugár és magas egyezési szint használható egy kép elemének éle mentén haladva, hogy a pixeleket jó pontossággal az élig kijelöld. Az él menti munka befejezése után használd a select area within mouse módszert a többi kijelöléséhez. A jobb gombos húzás kijelölés-megszüntetésként működik: az egérkörön belüli pixelek és a keresési tartományon belüli egyező pixelek kijelölése megszűnik. Ha egy kijelölés túl messzire megy, gyakran könnyebb ezt a kijelölt területen kívülről történő kijelölés-megszüntetéssel javítani, mint belülről kijelölni. Némi gyakorlásra lehet szükséged, hogy ráérezz erre, és hatékonyan tudj dolgozni. - ^Minden szín kijelölése az egéren belül - összefoglalás • bal gombos húzás - az egérben lévő és a tartományon belüli egyező pixelek kijelölése • jobb kattintás - az előző kijelölés visszavonása, ismételd meg, hogy többet szüntess meg • jobb gombos húzás - az egérben lévő és a tartományon belüli egyező pixelek kijelölésének megszüntetése - ^Szélcsúszás Egy befejezett terület (lásd alább) 1 pixeles lépésekben bővíthető vagy szűkíthető. Ez segíthet csökkenteni a szélhatásokat, amikor egy színegyezéssel kijelölt terület olyan módon van szerkesztve, amely megváltoztatja a fényerejét. A szín szerinti kijelölés keskeny alul- vagy túlkijelölt pixelsávot hagyhat egy él mentén, ahol az elem színe háttérré alakul át. A terület 1-2 pixellel történő bővítése vagy szűkítése tisztább kinézetű élt eredményezhet. A terület a csúszás után is befejezett marad (lásd alább). - ^Terület körvonalszíne Az egéres kijelölő körhöz és a terület körvonalához használt szín bármikor módosítható a színgombok egyikére kattintva. Ez jó láthatóságot biztosít a különböző képszínekkel szemben. - ^Megjelenítés/elrejtés Használd az [Elrejtés] gombot a terület körvonalainak elrejtéséhez. Ez hasznos, hogy jobban lásd a terület szerkesztéseinek hatásait a terület körvonala okozta zavaró hatás nélkül. Használd a [Megjelenítés] gombot a körvonalak megjelenítéséhez és a terület szerkesztésének folytatásához. - ^Befejezés +image: select-area-finish.png - Egy terület nem hatásos szerkesztésekhez, amíg sikeresen be nem fejeződik. A Befejezés érvényesíti a rajzolt körvonalakat, és a vizuális ellenőrzéshez színezi a bezárt pixeleket. Amikor befejezted a területek körvonalazását, használd a [Befejezés] gombot a folyamat lezárásához. A fent látható felugró párbeszédablak két, a befejezéshez használható módszert foglal össze. - 1. módszer: Kattints bal gombbal az egérrel a kézzel körvonalazott területeken belül. A bezárt területek ideiglenesen színezésre kerülnek, hogy ellenőrizhesd, hogy a végeredmény a szándékodnak megfelelő-e. Bármely bezárt terület kijelölhető, még azok is, amelyek nincsenek kifejezetten körvonalazva: ha van egy lyukas fánkod, kijelölheted a fánkot, a lyukat, vagy mindkettőt. Nyomd meg a [keep] gombot, amikor az összes területre rákattintottál, és azok helyesen vannak színezve. Ha egy kézzel rajzolt terület körvonalán rés van, a színezési folyamat „kiszivárog”, és a bekerítésen kívüli területek is színezve lesznek. Ebben az esetben nyomd meg a Befejezés párbeszédablakban a [Visszavonás] gombot, amely visszaállítja az eredeti terület körvonalát. Keresd meg a rést a körvonalban, zárd be, majd próbáld meg újra a [Befejezés] gombot. Egy 1 pixeles rés egy nagy területen nehezen található meg. Zoomolj be, hogy jobban lásd. Lásd az alábbi {TERÜLET HÉZAG KERESÉSE} funkciót a kis rések gyors megtalálásához. - 2. módszer: Kattints jobb gombbal valahol az összes bezárt területen kívül. Az összes bezárt terület színezésre kerül a vizuális ellenőrzéshez. Ha van rés, az eredmények és a javítás ugyanazok, mint az 1. módszernél leírtak. Ez a módszer akkor hasznos, ha sok kézzel körvonalazott területed van, és nem szeretnéd egyenként ellenőrizni őket az 1. módszerrel. - A 'select within mouse' módszerekkel kijelölt területek automatikusan befejeződnek. Ezek a területek a kijelölési folyamat során kerülnek feltérképezésre, míg a téglalappal, ellipszissel vagy az egyik vonalrajzoló módszerrel kijelölt területek csak akkor kerülnek feltérképezésre, amikor beléjük kattintasz. Ha csak a 'select in mouse' módszereket használod, megnyomhatod a [keep] gombot anélkül, hogy bármelyik kijelölt területre kattintanál. - Ha egy vonalat rajzolsz a kép egyik oldalától a másikig, a vonal bármelyik oldalára kattinthatsz, hogy egy területet hozz létre a vonal azon oldalán lévő összes pixelből. Példa: rajzolj egy vízszintes vonalat az ég és a föld határára. Kattints a vonal fölé az ég kijelöléséhez, a vonal alá a föld kijelöléséhez. A rajzolt vonalaknak teljesen el kell érniük a kép széleit. - ^Törlés Az aktuális terület végleges elvetése. - - TOPIC: TERÜLET HÉZAG KERESÉSE Ha egy terület körvonala szabadkézi rajzolással, több vonással készült, könnyen maradhatnak kis rések a körvonalban, amelyek 4x-es zoom alatt nem láthatók. Egy ilyen terület befejezésére tett kísérlet sikertelen lesz, mivel a belső pixelek feltérképezése kiszivárog a résen keresztül, és a szándékolt területen kívüli területeket is lefedi. Ha a Befejezés funkció sikertelen, ez a funkció megtalálhatja a rést. Kattints valahova a sikertelen terület körvonalán. A körvonal lassan újrarajzolásra kerül egy irányba a megkattintott pozíciótól, amíg egy „végpixel” nem található. Ez az, ahol a rés van. A körvonal ezután az ellenkező irányba kerül rajzolásra, amíg a rés (vagy egy másik) elő nem kerül. A rés ott van, ahol a rajzolás megállt. Zoomolj be a résre, és zárd be szabadkézi rajzolással, majd teszteld újra, hogy megnézd, a teljes körvonal megrajzolható-e megállás nélkül. Ez a funkció párhuzamosan használható a Terület kijelölése funkcióval - mindkét párbeszédablak lehet aktív. - - TOPIC: TERÜLET KEVERÉSE +image: area-blend.jpg - Ebben az eszközben két funkció található: Terület összeolvasztása és Terület széle összeolvasztása. Mindkét funkció fokozatosan 'visszavonhatja' egy kijelölt területen belül végzett szerkesztést, egy korábbi szerkesztés vagy az eredeti kép bekeverésével. A fenti példában a háttérben lévő négy férfi fényesebbé vált, anélkül, hogy bármilyen nyoma lenne a fényesített és a változatlan pixelek közötti határnak. - ^Terület összeolvasztása Egy szerkesztett kijelölt terület bármely része összeolvasztható az eredeti képpel. Használj bal egérgombos húzásokat az összeolvasztandó régiók felett. Minden egérhúzás a területen belül fokozatosan beolvasztja a kiválasztott korábbi képet, hatékonyan csökkentve vagy eltávolítva a területen belül végzett szerkesztést. Az összeolvasztás sebességét a 'blend rate' határozza meg, amely külön állítható be az egérkör közepéhez és széléhez. Állítsd be az egérsugarat és az összeolvasztási arányokat (pl. 50/0 az egér közepéhez/széléhez). Húzd az egeret az összeolvasztandó terület régiói felett. Használj bal gombos húzást az összeolvasztáshoz, jobb gombos húzást a visszaolvasztáshoz vagy visszaállításhoz. Ezzel a módszerrel szelektíven olvaszthatod össze a terület széleit: használj kis sugarat, és húzd az egér közepét az összeolvasztandó szélek felett. Ez a szélétől befelé haladó, fokozatos összeolvasztást eredményez. - ^Terület széle összeolvasztása Néha egy szerkesztett területnek természetellenes kinézetű szélei lesznek, a szerkesztett terület és a környező kép közötti éles határ miatt (különösen, ha a terület fényesebbé vált). Ez hatékonyan láthatatlanná tehető a területszerkesztés fokozatos kiolvasztásával egy, a szélek mentén húzódó sáv esetében. A területszerkesztés 100%-ban eltávolítható a terület szélétől, befelé haladva a sáv szélességéig 0%-ra csökkenve. Kétféleképpen olvaszthatók össze a terület szélei: 'blend' és 'blur'. A blend a szélsávot a kiválasztott korábbi szerkesztéssel vagy az eredeti képpel keveri. A blur a sávot a sávon kívüli szomszédos pixelekkel keveri. Állítsd be az összeolvasztás szélességét a 'blend width' vagy 'blur width' bevitellel. - A terület széle 'Blend' és 'Blur' funkciói egy szélettávolság-számítást igényelnek: az adott terület minden pixelének távolságát a legközelebbi területszéltől. Ez a távolság a pixel relatív összeolvasztásának kiszámítására szolgál: 100% a terület szélén, és 0% a 'blend width'-nél nagyobb távolságra lévő pixeleknél a szélétől. Egy nagy, összetett szélű terület esetén ez eltarthat egy ideig. A felső panelen egy folyamatjelző látható. - - TOPIC: TERÜLET MEGJELENÍTÉSE/ELREJTÉSE Az aktuális terület körvonalának megjelenítése vagy elrejtése. A terület elrejtése akkor hasznos, amikor a terület egy szerkesztési funkcióval van módosítva. Ez megkönnyíti a szerkesztés hatásainak megítélését. Ezek gombokként is elérhetők a Terület kijelölése párbeszédablakban. - - TOPIC: TERÜLET ENGEDÉLYEZÉSE/LETILTÁSA Az aktuális terület letiltása, az adatok megtartásával, hogy később újra aktiválható legyen (Engedélyezés menü). Ez lehetővé teszi, hogy felváltva végezz szerkesztéseket egy kijelölt területen belül, illetve a teljes képen. - - TOPIC: TERÜLET INVERTÁLÁSA Egy meglévő terület megfordítása: a teljes kép kijelölésre kerül, kivéve a meglévő területet. A funkció kétszeri használata visszaadja az eredeti kijelölt területet. Egy kijelölt terület megfordítása érvényteleníti a szélszámítást, amelyet meg kell ismételni, ha területszél-összeolvasztás szükséges. - - TOPIC: TERÜLET TÖRLÉSE Az aktuális terület végleges elvetése. Ez gombként is elérhető a Terület kijelölése párbeszédablakban. - - TOPIC: TERÜLET MÁSOLÁSA/BEILLESZTÉSE Egy kijelölt terület egy gyorsítótár-fájlba menthető a Területek > Másolás menüvel. Ez a terület beilleszthető ugyanabba vagy egy másik képbe a Területek > Beillesztés menüvel. Kattints és húzd a beillesztett terület pozicionálásához. A párbeszédablak vezérlőivel átméretezhető és elforgatható a beillesztett terület. - - TOPIC: TERÜLET BETÖLTÉSE/MENTÉSE Egy kijelölt terület fájlba menthető a Területek > Mentés menüvel. A rendszer bekéri a fájlnevet. Egy PNG fájl jön létre. A PNG fájl rendelkezik egy alfa csatornával az átlátszósági információhoz. A kép egy, a kijelölt területet bezáró téglalap. A kijelölt pixelek átlátszatlanok, a többi átlátszó. - Ezek a fájlok alapértelmezetten a /saved_areas mappában találhatók, de bárhova elmentheted őket. Használd a Területek > Betöltés menüt, hogy betölts egy mentett területet egy fájlból, és beilleszd az aktuális képfájlba. A háttérkép látszani fog a beillesztett terület átlátszó részein keresztül. Kattints és húzd a terület pozicionálásához. A párbeszédablak vezérlőivel átméretezhető és elforgatható a beillesztett terület. - - TOPIC: VISSZAVONÁS/ISMÉTLÉS GOMB Ha egy szerkesztési funkció aktív, és a kép megváltozott: • bal egérkattintás visszavonja az aktuális szerkesztést • jobb egérkattintás megismétli a szerkesztést Ez lehetővé teszi az aktuális szerkesztési funkció „előtte” és „utána” képeinek gyors összehasonlítását. - Ha NINCS aktív szerkesztési funkció, de az aktuális képen történtek szerkesztések: • bal egérkattintás kattintásonként visszavon egy szerkesztési lépést • jobb egérkattintás kattintásonként megismétel egy szerkesztési lépést • középső egérkattintás megjelenít egy listát az összes szerkesztési lépésről. Bármely szerkesztési lépéshez vagy az eredeti képhez visszaléphetsz - Ha egy másik fájlt nyitsz meg, az aktuális fájl mentett szerkesztési lépései elvesznek. - - TOPIC: SZERKESZTÉS MENÜ - - TOPIC: FORGATÁS Egy ferde kép vízszintezéséhez húzd az egérrel a kép jobb vagy bal oldalát fel vagy le, amíg a kép egyenesnek nem tűnik. Egy bal kattintás a képre függőleges és vízszintes segédvonalakat ad hozzá a kép vízszintezésének segítéséhez. Használd a jobb kattintást az eltávolításukhoz. - Az [Automatikus szint] gomb automatikusan vízszintezheti a képet, ha a fényképezőgép rögzítette a 'roll angle' értéket az EXIF metadata-ban. Az [Auto Upright] gomb automatikusan egyenesbe állíthat egy 90°-kal elforgatott fényképezőgéppel készült képet, ha az 'orientation' jelen van az EXIF metadata-ban. - - TOPIC: EGYENESBE ÁLLÍTÁS Ez egy 1 gombos javítás egy 90/180 fokkal elforgatott vagy megfordított (tükrözött) kép esetén. Nincs felbontásvesztés, mivel a pixelek 1:1 arányban kerülnek másolásra az új képelrendezésbe. Lásd még a {KÖTEGELT EGYENESBE ÁLLÍTÁS} funkciót. - - TOPIC: VÁGÁS +image: crop-image.jpg +image: crop-buttons.jpg - Vágd le a nem kívánt területeket a kép széleiről. A párbeszédablak megnyitásakor egy kijelölő téglalap kerül a kép fölé. Az ezen a téglalapon kívüli területek elsötétülnek, és a kép azon részeit jelentik, amelyek eltávolításra kerülnek. Húzd a téglalap bármelyik oldalát vagy sarkát, hogy mozgasd azt az oldalt vagy sarkot. A párbeszédablak mutatja a kijelölő téglalap aktuális szélesség/magasság arányát. Ha a „Zárolás” be van jelölve, akkor egy oldal vagy sarok mozgatása egy másik oldal vagy sarok mozgását is okozza, hogy a rögzített szélesség/magasság arány megmaradjon. Húzd a középről (egy kis kör jelöli), hogy az egész téglalapot elmozdítsd a méretek megváltoztatása nélkül. Használd a szélesség és magasság léptetőgombokat a kép pixelméreteinek közvetlen módosításához, vagy add meg a kívánt értékeket. A kijelölő téglalap ezekhez az értékekhez fog igazodni. - Használd a billentyűzet nyílbillentyűit a kijelölő téglalap 1 pixeles lépésekben történő mozgatásához. A nyílbillentyűk azt az oldalt vagy sarkot mozgatják, amelyet legutóbb az egérrel mozgattál. - A [Max] gomb visszaállítja a vágási téglalapot a teljes képméretre. Ha egy korábbi szerkesztés (Forgatás, Torzítás ...) átlátszó szegélyeket hagyott a kép körül, a vágási téglalap az ezeken a szegélyeken belül elférő maximális méretet fogja tükrözni. - A [Előző] gomb lekéri a korábban használt szélesség- és magasságértékek listáját. Válassz a listából ezek egyikének használatához. - Az öt arány gomb lehetővé teszi egy előre beállított szélesség/magasság arány kiválasztását. A [invert] gomb megfordítja az aktuális szélesség/magasság arányt. - Az arány gombokat a [customize] gombbal módosíthatod, amely egy új, a jobb oldalon látható párbeszédablakot indít. Kattints egy gombra a szerkesztéséhez. Add meg a kívánt szélesség-magasság arányt a bemutatott példában látható „ww:hh” formátumban. - - TOPIC: RETUSÁLÁS +image: retouch.png - A kép fényerejének és színének beállítása. • automatikus feketeszint - a feketepont beállítása a % legsötétebb pixel alapján • automatikus fehéregyensúly - a fehérpont beállítása a % legvilágosabb pixel alapján • kattints szürke pontra a fehéregyensúlyhoz - kattints egy szürke pontra a képen • kattints sötét pontra a feketeszinthez - kattints egy sötét pontra a képen • kattints az RGB hisztogramok felugró grafikonjához • brightness - az 'all' görbét mozgatja fel vagy le (minden szín változik) • contrast - módosítja az 'all' görbe meredekségét • color saturation - fekete/fehér <--> intenzív színek • color temperature - megvilágítás egyensúlya (meleg <--> hideg) - A csúszkákkal végzett kezdeti beállítások után finomhangolhatod a fényerőt és a kontrasztot a görbék egérrel történő szerkesztésével, hogy módosítsd, mely képrészek változzanak jobban vagy kevésbé. Az ALL görbe minden színt beállít, a 3 RGB görbe pedig egyedi színeket állít be. Először használd az ALL-t, majd végezz módosításokat az RGB-vel. - ^Gombok Reset - minden vezérlő visszaállítása semleges állásba - a kép is visszaáll Prev - minden vezérlő beállítása az előző képnél használt értékekre Done - a szerkesztés befejezése, a párbeszédablak bezárása, a vezérlő beállítások mentése Cancel - a szerkesztés megszakítása, a kép visszaállítása, a párbeszédablak bezárása - Használd a [Előző] gombot, amikor több, hasonló beállításokat igénylő képet dolgozol fel. - - TOPIC: ÁTMÉRETEZÉS +image: rescale.png - Ez a funkció a képet egy új pixelszélességre és -magasságra méretezi át. Közvetlenül megadhatod az új méreteket, vagy választhatsz egy százalékos változást. Vannak gombok az új méret egyszerű, az eredeti méret arányában történő beállításához. Ezek egyikének használata minimalizálja a felbontásvesztést. Az [Előző] gomb visszahívja az előző méretet, ami kényelmes, ha több kép is ugyanarra a méretre van beállítva. Ha az arány zárolása jelölőnégyzet be van jelölve, az aktuális szélesség/magasság arány megmarad, ha a szélesség vagy a magasság megváltozik. - - TOPIC: OSZTOTT KÉPERNYŐ +image: split-screen1.jpg +image: split-screen2.png - Egy szerkesztési funkció közben megtekintheted az előtte és utána képeket az osztott képernyő módszerrel. Húzd a határvonalat az egérrel. Amikor kilépsz az Osztott képernyőből, normálisan folytathatod a szerkesztési funkciót. - Ha nincs aktív szerkesztési funkció, válassz két képet, amelyeket az osztott képernyővel szeretnél megjeleníteni. Ezeknek azonos pixelmérettel kell rendelkezniük. - - TOPIC: ELTÉRÉSEK MEGJELENÍTÉSE Egy szerkesztési funkció közben kiemelheted a változásokat a változatlan területek elsötétítésével. Használd a csúszkát a változatlan területek sötétségének beállításához. Amikor kilépsz az Eltérések mutatásából, normálisan folytathatod a szerkesztési funkciót. - Ha nincs aktív szerkesztési funkció, válassz két képet a köztük lévő eltérések kiemeléséhez. Ezeknek azonos pixelmérettel kell rendelkezniük. - - TOPIC: MARGÓK +image: margins.png - Használd ezt a funkciót szegélyek hozzáadásához egy kép köré. Bármilyen színt és alfa (átlátszóság) beállítást használhatsz a szegélyekhez. Állítsd be minden szegélyt külön-külön, vagy használd az 'All±1' és 'All±10' vezérlőket, hogy az összes szegélyt egyszerre módosítsd fel vagy le ugyanannyival, 1 vagy 10 pixellel. Használd az egérgörgőt vagy a fel/le nyílbillentyűket a gyorsasághoz. - Ezzel a funkcióval szegélyeket adhatsz olyan képekhez, amelyeket torzítani tervezel, hogy megakadályozd egyes területek lelógását a szélekről. - - TOPIC: JELÖLÉS +image: markup.jpg - Ez egy menü, amely a kép jelölési funkcióit tartalmazza: szöveg rajzolása, vonal/nyíl rajzolása, téglalap rajzolása, ovális rajzolása Mindezen funkciók rendelkeznek egy [commit] gombbal, amely rögzíti az aktuális szerkesztést, és lehetővé teszi, hogy ugyanabban a szerkesztő párbeszédablakban egy újat kezdj (új szöveg/vonal/téglalap/ovális). - ^Szöveg rajzolása Ez a funkció közvetlenül szöveget rajzol a képre. Add meg a szöveget a párbeszédablakban. Több sor is használható. A szöveg megadása után kattints bal gombbal ott, ahol a szöveget szeretnéd a képen. Húzással máshova mozgathatod a szöveget. Kattints jobb gombbal a szöveg eltávolításához. Használd a [Betűtípus] gombot egy másik betűtípus kiválasztásához. Használd a [Méret] vezérlőt a szövegméret növeléséhez vagy csökkentéséhez. Használd a [Szög] vezérlőt a szöveg dőlésszögének módosításához. A többi vezérlő lehetővé teszi, hogy háttérszínt adj a szöveg köré, szövegkörvonal-színt, és árnyékhatást. Ezek mindegyikéhez kiválaszthatod a színt és az átlátszóságot. A szélesség vezérlő a körvonalak és árnyékok szélességét állítja be. Az árnyékszög vezérlő beállítja az árnyék szögét. Használd a domborítás vezérlőket, hogy 3D-s hatást adj a szövegnek. - A szöveget bármely elérhető metadata-ból inicializálhatod a képfájlban. Add meg a metadata tag-et (pl. „user comments”), és nyomd meg a [Lekérés] gombot. Rövidítheted a tagneveket, pl. „usercomments” a „User Comments” helyett. - A [Megnyitás] és [Mentés] gombok elindítanak egy fájlválasztó párbeszédablakot, amellyel betöltheted vagy elmentheted az összes szövegadatot egy fájlból vagy fájlba. A párbeszédablak összes eleme betöltésre vagy mentésre kerül, így megőrizhetsz egy gyakran használt szövegekből és beállításokból álló gyűjteményt. - Az alsó gombok a következőképpen működnek: • Clear - a szöveg- és metadata mezők üresre törlése • Replace - a hozzáadott szöveggel rendelkező kép lecseréli az aktuális képet • +Version - a hozzáadott szöveggel rendelkező kép új verzióként kerül mentésre • Next - a következő fájl megnyitása, ugyanaz a szöveg ugyanabba a pozícióba kerül • Apply - az aktuális szerkesztés rögzítése, és visszaállítás új szövegbevitelhez • Done - az aktuális szerkesztés befejezése - a kép menthető • Cancel - az aktuális szerkesztés elvetése - Ugyanazon szöveg hozzáadásához egy képsorozathoz: készítsd elő és pozicionáld a szöveget, nyomd meg a [Csere] vagy [+Version] gombot, majd a [Következő]-et, majd újra [Csere] vagy [+Version], majd [Következő] ... - Vízjel készítése: Használj 70% vagy nagyobb szövegátlátszóságot, és 100% háttérátlátszóságot. A szövegnek gyengén olvashatónak kell lennie. Használd a domborítás vezérlőket, hogy a szöveg úgy tűnjön, mintha be lenne süllyesztve a képbe. - ^Vonal rajzolása Ez a funkció közvetlenül vonalakat vagy nyilakat rajzol a képre. Add meg a vonal hosszát és szélességét a párbeszédablakban, és válassz nyílhegyet, ha szeretnél. Kattints bal gombbal ott, ahol el szeretnéd helyezni a képen. Húzd a vonal/nyíl végeit, hogy pozicionáld a képen. Kattints jobb gombbal az eltávolításához. Húzd a vonal közepéről, hogy elmozdítsd a szög vagy hossz megváltoztatása nélkül. A párbeszédablak vezérlői lehetővé teszik, hogy háttérszínt, körvonalszínt és árnyékhatást adj. Ezek mindegyikéhez kiválaszthatod a színt és az átlátszóságot. A szélesség vezérlő a körvonalak és árnyékok szélességét állítja be. Az árnyékszög vezérlő beállítja az árnyék dőlésszögét. Egy megrajzolt vonal megtartásához és egy új elkezdéséhez nyomd meg az [alkalmaz] gombot. - ^Téglalap rajzolása Válassz színt és szélességet a téglalap körvonalához. Helyezd a kurzort a téglalap sarkának kívánt pozíciójába, és húzd a téglalap nyitásához a kívánt irányba. A téglalap lecseréléséhez húzd újra. A téglalap mozgatásához tartsd lenyomva a shift billentyűt, és húzd a téglalapot a középről. Az egyik él mozgatásához tartsd lenyomva a shift billentyűt, és húzd az élet. Egy megrajzolt téglalap megtartásához és egy új elkezdéséhez nyomd meg az [alkalmaz] gombot. - ^Ovális rajzolása Válaszd az ovális (ellipszis) vagy a kör jelölőnégyzetet. Válassz színt és szélességet a körvonalhoz. Helyezd a kurzort a kívánt középpontba. Húzással rajzold meg az ovális/kört. A húzás szöge határozza meg az ovális alakját, a körtől a szélsőséges, széles vagy magas ellipszisig. Az ovális/kör lecseréléséhez húzd újra. Az ovális/kör mozgatásához tartsd lenyomva a shift billentyűt, és húzd a középről. A méret vagy alak módosításához tartsd lenyomva a shift billentyűt, és húzd a jobb alsó éltől. Egy megrajzolt ovális/kör megtartásához és egy új elkezdéséhez nyomd meg az [alkalmaz] gombot. Ovális esetén megadhatsz egy 0-90 fokos szöget a döntött tengelyekhez, mint a példában. - - TOPIC: SZÍNMÓD +image: color-mode.png +image: color-mode2.jpg - Használd ezt a funkciót fekete-fehér vagy színes negatív készítéséhez, vagy egy negatív kép pozitívvá alakításához, vagy szépia színezésre való átalakításhoz (öreg fotó hatáshoz). A csúszkával fokozatosan alkalmazhatod a hatást, 0%-tól 100%-ig. - - TOPIC: FESTÉS SZERKESZTÉSE Ezt a funkciót valamely más szerkesztési funkcióval kombinálva használd. Indíts el egy szerkesztési funkciót, és hagyd a vezérlőket semleges állásban. Majd indítsd el a Szerkesztés festését. Fesd a szerkesztési funkciót oda, ahova szeretnéd, az egérrel. Lásd {MOUSE PAINTING} a szerkesztések helyi, egérrel történő alkalmazásához. - Ez a módszer, amellyel fokozatosan „fested” a szerkesztéseket, gyorsan és könnyen javíthatja egy kép kijelölt területeit. A következő szerkesztési funkciókkal működik: • Szerkesztés > Retus, Színmód • Javítás > Élesítés, Elmosás, Zajcsökkentés, Ködmentesítés, RGB beállítása, HSL beállítása • Finomítás > Hisztogram kiegyenlítése, Helyi kontraszt, Kontraszt erősítése, Helyi retinex, Telítettség, Lágy fókusz • Effektek > Körvonalak, Vázlat2, Domborítás, Textúra, Fénycsík hozzáadása, Színek beállítása, Színek eltolása, Egyéni kernel - - TOPIC: KÉP FESTÉSE +image: paint-image.jpg - Ez a funkció kiválasztott színekkel fest a képre, az egérrel. Lásd {MOUSE PAINTING} a szerkesztések helyi, egérrel történő alkalmazásához. - A Paint Color gomb mutatja az aktuális színt. Kattints erre a gombra egy szín kiválasztásához a szabványos Gnome színválasztó párbeszédablakkal. Shift + bal kattintással is kiválaszthatsz egy színt a képről. - A palettagomb megnyitja a középen látható párbeszédablakot. Kattints a képre az adott pozíció színének kiválasztásához. A kiválasztott szín tükröződik a fő párbeszédablak színgombján. A fent látható kép az alapértelmezett. Bármely képet használhatsz színforrásként. Nyomd meg a [tallózás] gombot, és válassz egy képet, ahol elmentetted a felidézhető színeket. Ez a választás mindaddig érvényben marad, amíg meg nem változtatod. - A HSL gomb megnyit egy jobb oldalon látható HSL színválasztót. Ez a párbeszédablak bármely lehetséges színt reprezentálhat. Mozgasd a csúszkákat, hogy megkapd a kívánt színt. A kiválasztott szín tükröződik a fő párbeszédablak színgombján. - Ha az átlátszó területekre festés lehetőség ki van választva, az átlátszó területekre való festés csökkenti vagy megszünteti az átlátszóságot, az átlátszatlanság vezérlőktől függően. Ha ez a lehetőség nincs kiválasztva, csak a kép átlátszatlan területei kerülnek festésre. - ^Wacom tábla működése A Kép festése funkcióval egér helyett Wacom táblát is használhatsz. A ceruza tábla felületével érintkezve történő húzása a fent leírtak szerint fest. Ha a ceruza egyik gombját lenyomva tartod húzás közben, a művelet festés helyett törlés lesz. A festés vagy törlés módot a párbeszédablak választógombjaival is beállíthatod. A ceruzagomb lenyomva tartása kényelmetlen, ezért vannak ott a választógombok. A ceruzára gyakorolt nagyobb nyomás növeli az átlátszatlanságot, így az átlátszatlanság vezérlők módosítása nélkül készíthetsz világosabb és sötétebb vonásokat. - - TOPIC: ÁTLÁTSZÓSÁG FESTÉSE +image: paint-transp.png +image: paint-transp2.jpg - Fess átlátszó vagy félig átlátszó területeket egy képre. Lásd {MOUSE PAINTING} a szerkesztések helyi, egérrel történő alkalmazásához. - - TOPIC: TERÜLET KITÖLTÉSE Töltsd ki az összes kijelölt vagy az összes átlátszó területet egy kiválasztott átfedő színnel. Ha egy terület részben átlátszó, az átfedő szín lecseréli a kép átlátszó részét. A 'Blend' csúszkával kiválasztható az eredeti kép és az átfedő szín tetszőleges keveréke. - - TOPIC: MÁSOLÁS KÉPEN BELÜL Fess a képterületekre az ugyanazon kép más részéből történő másolással. Ez a módszer objektumok duplikálására használható egy képen belül, vagy egy nem kívánt objektum eltávolítására, azt máshonnan vett háttérrel helyettesítve. Kattints bal gombbal a képre egy forráshely kiválasztásához, majd kattints jobb gombbal a megfelelő célhely kiválasztásához. Lásd {MOUSE PAINTING} a szerkesztések helyi, egérrel történő alkalmazásához. - Ha az átlátszó területekre festés lehetőség ki van választva, az átlátszó területekre való festés csökkenti vagy megszünteti az átlátszóságot. Ha ez a lehetőség nincs kiválasztva, csak a kép átlátszatlan területei kerülnek festésre. - - TOPIC: MÁSOLÁS KÉPBŐL Fess a képterületekre egy másik képről történő másolással. A célkép úgy kerül „festésre”, hogy az egeret a módosítandó terület felett húzod. A forrásképben korábban kiválasztott pozíció a célképre kerül másolásra. Mind a másolandó, mind a festendő terület körökkel van bekerítve, amelyek az egérrel mozognak. A fenti példában a jobb oldali képen lévő csónak a bal oldali képre lett másolva. - Kezdd a célkép megnyitásával. Válaszd a 'Copy From Image' menüt. Elindul egy 2. Fotocx munkamenet, amely ugyanazt a képet mutatja. Ebben a 2. munkamenetben navigálj a forrásképhez, és nyisd meg. Rendezd el a két ablakot úgy, hogy mindkettőt láthasd (legalább a másolandó területeket). Shift + bal kattintással a forrásképen állíts be egy forráspozíciót. Shift + bal kattintással a célképen a célpozíción. - Húzd az egeret bal gombbal a célkép területe felett. A forrásképből származó pixelek a célképre kerülnek másolásra. Zoomolj a képekre max. méretre, ha nagy pontosság szükséges a referenciapozíciókhoz. A kezdeti referenciapozíció mindkét képnél (0,0) (ÉNy sarok). Lásd {MOUSE PAINTING} a szerkesztések helyi, egérrel történő alkalmazásához. - A forráskép léptékértéke a forráskép célképre történő skálázásához használatos. Kezdd egy próbamásolással a lépték ellenőrzéséhez. Ha túl nagy vagy túl kicsi, használd az [undo all] gombot a próba törléséhez, módosítsd a léptékértéket, és próbáld újra. - Ha az átlátszó területekre festés lehetőség ki van választva, az átlátszó területekre való festés csökkenti vagy megszünteti az átlátszóságot, az egér átlátszatlanság vezérlőitől függően. Ha ez a lehetőség nincs kiválasztva, csak a kép átlátszatlan területei kerülnek festésre. - - TOPIC: KORÁBBI SZERKESZTÉS MÁSOLÁSA Egy korábbi szerkesztési lépés képe helyi jelleggel és fokozatosan alkalmazható az aktuális képre, az egérrel történő „festéssel”. A korábbi szerkesztésnek az aktuális képen, annak nyitva léte alatt végzett szerkesztések egyikének kell lennie - a nem mentett szerkesztések elvesznek, amikor egy új kép nyílik meg. Bármely korábbi szerkesztést alkalmazhatod a szerkesztés alatt álló aktuális kép bármely területére, amíg a kép aktuális képként nyitva marad. Válassz egy korábbi szerkesztést a legördülő listával, amely az aktuális képen végzett összes korábbi szerkesztési lépést mutatja, sorrendben, és a használt szerkesztési funkcióval azonosítva. Lásd {MOUSE PAINTING} a szerkesztések helyi, egérrel történő alkalmazásához. - - TOPIC: JAVÍTÁS MENÜ - - TOPIC: ÉLESÍTÉS +image: sharpen.png - Ennek a funkciónak öt módszere van egy elmosódott kép élesítésére, valamint egy módszer a fényképezőgép vagy a téma expozíció közbeni mozgásából eredő mozgásélesség elmosódásának élesítésére. - Válaszd ki a módszert, állítsd be a paramétereket, nyomd meg az [alkalmaz] gombot, és várj néhány másodpercet az eredmény megtekintéséhez. Végezz módosításokat, és ismételd meg a folyamatot, amíg meg nem vagy elégedve. Használd a {TERÜLET KIJELÖLÉSE} funkciót, hogy egy kép különböző részein különböző módszerekkel és paraméterekkel dolgozz. - Minden módszernél válassz kis sugarat a kissé elmosódott képekhez, és nagyobb értékeket a gyengébb minőségű képekhez. Az Amount a módosítás erősségét szabályozza. A Threshold elnyomja a változásokat az alacsony kontrasztú pixeleknél: egy magasabb érték csökkenti az alacsony szintű szabálytalanságok (képzaj, egyenetlen bőrtónus stb.) felerősítését. - Unsharp mask: egy klasszikus módszer, amely a legtöbb képszerkesztőben megtalálható. Egy technikai leírás internetes kereséssel található. Ez a módszer látható 'glóriákat' hozhat létre a magas kontrasztú élek körül. - Amplify Contrast: a meglévő kontraszt erősítése. Hatékonysága összemérhető az unsharp mask-kal, de a 'glóriák' csökkennek. - Kuwahara: az egyes pixelek körüli kis szomszédságokat hasonlítják össze egymással. A pixel a legkisebb eltérésű szomszédság átlagos színét kapja. Ez arra kényszeríti az elmosódott él pixeleit, hogy az él egyik vagy másik oldalához igazodjanak. Az élek nagyon élessé válnak. A kép 'tömbösnek' tűnhet, ha nagy sugarat használsz. Finom részletek elveszhetnek. - Median diff: a pixel fényereje összehasonlításra kerül a sugáron belüli pixelek mediánjával. A fényerő nő vagy csökken azoknál a pixeleknél, amelyek fényesebbek vagy sötétebbek a szomszédság átlagánál. Hatékonysága összemérhető az unsharp mask-kal, de a 'glóriák' jelentősen csökkennek. Ez az egyetlen módszer, amely minden RGB színnel külön dolgozik. Élesíteni tud egy színátmenetet még akkor is, ha kevés a fényerőváltozás. - Richardson-Lucy: a kép a Richardson-Lucy dekonvolúciós módszerrel kerül élesítésre. Ez a módszer adhatja a legjobb eredményeket, de meglehetősen lassú is. A folyamat felgyorsításához kezdd a kép egy kicsi, de mozgalmas területének kiválasztásával a {TERÜLET KIJELÖLÉSE} funkcióval. Keresd meg az optimális sugarat és iterációszámot ezen a kis területen. Majd használd ugyanazokat a beállításokat a teljes képhez. A képben lévő zaj rontja a hatékonyságot. Ha ez a helyzet, használd előtte a {ZAJCSÖKKENTÉS} funkciót. - Egy pontosan 2x-esre felskálázott kép élesíthető a Richardson-Lucy módszerrel, 2,0-s sugár és 4 vagy több iteráció használatával. Az eredmények figyelemre méltóan jók. - ^Mozgáselmosódás javítása +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - Kézzel optimalizálhatod a fényképezőgép vagy egy tárgy mozgásából eredő kisebb elmosódású képeket. Egy egyébként éles képen belüli mozgó tárgy elmosódása a {TERÜLET KIJELÖLÉSE} funkcióval dolgozható fel a tárgy elszigetelésére. Az elmosódás lineárisnak és állandó sebességűnek van feltételezve. A bemenetek a 'blur span' pixelben és a 'blur angle' fokban. A kezdeti szögbecslés shift + egérhúzással adható meg a képen keresztül az elmosódás irányában (lehet ugyanaz vagy ellentétes, mint a tényleges mozgás). Add meg az elmosódási kiterjedés becslését az Eszközök > RGB megjelenítése funkcióval, hogy megmérd az elmosódás szélességét egy fényes kép elem éle mentén. Állítsd be a bemeneteket, nyomd meg az [alkalmaz] gombot, és vizsgáld meg a képet az optimális beállítások megtalálásához. A válaszidő lassú lehet nagy kép esetén. Felgyorsíthatod a folyamatot, ha a {TERÜLET KIJELÖLÉSE} funkcióval kiválasztasz egy kis elmosódott területet a kiterjedés és szög optimalizálásához, majd törlöd a területet, hogy a teljes képet ugyanazokkal a beállításokkal dolgozd fel. Az algoritmus „csengő” zajt hozhat létre, amely a 'suppress ringing' bemenettel elnyomható. A legjobb, ha alacsonyan hagyod az elnyomási értéket az optimális kiterjedés és szög megtalálásához, majd szükség szerint hozzáadsz elnyomást a csengés csökkentéséhez. A Richardson-Lucy dekonvolúciós módszer egy dimenzióban kerül alkalmazásra. - ^Digitális fényképezőgép mozgáselmosódása Nem minden elmosódott fotónak van olyan állandó sebességű elmosódása, amely a legjobban megfelel ennek a módszernek. A kép több rövidebb expozíció szuperpozíciója lehet. Előfordulhat, hogy a teljes kép nem egyszerre volt exponálva, és nem ugyanolyan az elmosódása (mechanikus vagy elektronikus mozgó zár). Ez a módszer így is jobb eredményeket hozhat, mint a két dimenzióban dolgozó élesítő eszközök. Jobban kell működnie régi, filmes fényképezőgéppel készült fotókon, ahol a mozgáselmosódás közelebb áll az állandó sebességhez. - - TOPIC: ELMOSÁS +image: blur.jpg - Válassz módszert a megfelelő jelölőnégyzettel, add meg a szükséges paramétereket, nyomd meg az [alkalmaz] gombot. Ha a {TERÜLET KIJELÖLÉSE} aktív, csak a kijelölt területek érintettek. - ^Normál elmosás Keverd össze az egyes pixeleket a sugáron belüli szomszédos pixelekkel. A közelebbi pixelek nagyobb súllyal rendelkeznek. Beállíthatod a sugarat 1-re, és ismételten megnyomhatod az [alkalmaz] gombot, hogy lassan növeld az elmosást, miközben figyeled a kép eredményét. - Opcionálisan különböző mértékben mosd el vízszintes és függőleges irányban, ha külön vízszintes és függőleges értékeket adsz meg. A [sugár] bemenet mindkettőhöz ugyanazt az értéket kényszeríti. - ^Sugárirányú elmosás Keverd össze az egyes pixeleket egy kiválasztott középponttól induló vonal menti pixelekkel. A Radius meghatároz egy központi területet, amely nincs elmosva. A Length beállítja az elmosási vonal tartományát: 0-tól length-ig, a középponttól a szélig. Válaszd ki a középpontot a képre kattintva. - ^Irányított elmosás Húzz egy pozíciót a képen az egérrel. Az egér körüli terület ebben az irányban lesz elmosva. A Span meghatározza az elmosott terület méretét. Az Intensity meghatározza az elmosás erősségét. - ^Fokozatos elmosás Csak a megadott kontraszthatárnál kisebb kontrasztú pixelek kerülnek elmosásra, és az elmosási sugár 1-től a megadott értékig terjed azoknál a pixeleknél, amelyeknek a kontrasztja a megadott határtól nulláig terjed. Röviden: az alacsony kontrasztú pixelek jobban elmosódnak, mint a magas kontrasztúak. Ez a bőrtónusok simítására használható a haj elmosása vagy a szemek csillogásának csökkentése nélkül. Szélsőségekig vive „rajzfilm” hatást eredményez. - ^Háttér elmosása (Bokeh) Mosd el a háttér képterületeit, miközben az előtér éles marad. Válaszd ki azt az egy vagy több területet, amelynek élesnek kell maradnia {TERÜLET KIJELÖLÉSE}. Az előtér területeinek kiválasztása után fordítsd meg a kijelölést, hogy most a háttér legyen kijelölve {TERÜLET INVERTÁLÁSA}. Ez az a terület, amely elmosásra kerül. Két elmosási módszer érhető el: Constant blur: minden elmosott területhez állandó elmosási sugarat használ. Increase blur with distance: a minimális elmosási sugarat használja az előtérhez közeli pixeleknél, és a maximális elmosási sugarat az előtértől legtávolabbi pixeleknél. Ehhez ki kell számítani az összes háttérpixel szélétávolságát, ami jelentős időt vehet igénybe. Az elmosási sugár a szélétávolságok újraszámítása nélkül is módosítható. - - TOPIC: ZAJCSÖKKENTÉS +image: denoise.jpg - Csökkentsd a gyenge fényviszonyok mellett (magas ISO) készült fotók zaját, amely miatt az egyenletes felületek pöttyösnek tűnnek. Két módszer áll rendelkezésre, Median és Smooth. A legjobb módszer a zajtól és a kép jellemzőitől függően változik. A módszerek keverése (az egyik, majd a másik használata) hasznos lehet. A Radius érték meghatározza azt a pixelszomszédságot, amelyet egy adott pixel összehasonlítására és módosítására használnak. Egy nagy érték (Radius > 2) hatékonyabban csökkenti a zajt, de részletvesztést is okozhat. A limit érték hatására figyelmen kívül maradnak azok a pixelek, amelyek RGB fényerőértékei ennél nagyobb mértékben térnek el a szomszédság mediánjától. Ez néhány képnél szükséges, hogy megakadályozza, hogy az apró fényes részletek zajként legyenek kezelve - pl. csillagászati fotóknál. - Állíts be egy Radius értéket, és nyomd meg az egyik módszergombot. Minden iteráció az előző képet használja kiindulópontként, így több iteráció fokozatosan elnyomja a zajt, és esetleg elmoshat néhány részletet. Használd a [visszaállítás] gombot az újrakezdéshez. A Median 1-es Radius-szal, majd Median 2-es Radius-szal, jó kompromisszum a zaj elnyomása és a részletek megőrzése között. - Az Areas csúszkával a feldolgozás csak sötét területekre korlátozható, vagy egy szélesebb területtartományra. A sötét területeknek jellemzően nagyobb a zajproblémája, mint a világos területeknek. - Ha néhány apró, tartósan megmaradó zajfoltot látsz, növeld a limit értéket, használd a [visszaállítás] gombot, és folytasd a [medián] vagy [sima] gombbal. - Különböző feldolgozást alkalmazhatsz a kép különböző területein - lásd {TERÜLET KIJELÖLÉSE}, és „festheted” is a képet, különböző feldolgozást használva a különböző területeken - lásd {FESTÉS SZERKESZTÉSE}. - Minden RGB szín önállóan kerül feldolgozásra. Nincs külön feldolgozás a színezetre vagy a fényességre. - A [measure] gomb elindítja a jobb oldali párbeszédablakot a tényleges képzajszint méréséhez. Mozgasd az egeret a kép felett, hogy megjelenjenek az RGB zajszintek az egérkörön belül (10-es sugár, kb. 300 pixel). Ennek egy jellegtelen területnek kell lennie, hogy a zaj legyen az egyetlen jelen lévő változás. Vizsgáld meg a képet 4X-es méretben, hogy biztosan zajt látsz, nem textúrát. A pontok az egyes pixelek RGB értékeit mutatják a körülöttük lévő 5x5 pixel átlagához képest, amelyet a középső folytonos vonal jelöl. Az alsó számok mutatják az átlagos RGB fényerőt és a zajszinteket a 0-255 skálán. A grafikon skálája -10-től +10-ig terjed, a szaggatott vonalak pedig -5-nél és +5-nél vannak, a 0-255 teljes tartományhoz viszonyítva. A 9. vagy 10. RGB bitben lévő zaj ezen a skálán 0,5 vagy 0,25. - ^RAW kép zaja A fényképezőgép érzékelőjének zajának méréséhez használj RAW képet. A JPEG képek a fényképezőgépen belül kerülnek feldolgozásra a zaj csökkentésére. Meglepődhetsz a RAW képek jellemzően magas zajszintjén. Még a nagy érzékelőkkel rendelkező drága fényképezőgépeknek is lehet kevesebb, mint 8 bitnyi alacsony zajú színe. Amikor zajt szűrsz egy RAW képből, a kamera JPEG-jét előállító elektronikával és szoftverrel versenyzel. Kihívást jelenthet jobbat elérni. - - TOPIC: KÖDMENTESÍTÉS +image: defog.png +image: defog2.jpg - Távolítsd el a ködöt/párát egy képből vagy kijelölt területről. Ehhez más eszközök is vannak (hisztogram kiegyenlítése, helyi kontraszt, kontraszt erősítése, retinex, telítettség), de a köd-/pára-eltávolítás másodlagos ezek elsődleges funkciójához képest. Ez a funkció közvetlenül a ködöt/párát célozza meg: egyenlő mennyiségű R/G/B színt távolít el (csökkentve a fényerőt és növelve a telítettséget), és opcionálisan visszaadja az elveszett fényerőt. A kéket is csökkentheti, ha az túl domináns lesz, ami gyakran előfordul távoli párával. Szükséged lehet a {TERÜLET KIJELÖLÉSE} vagy a {FESTÉS SZERKESZTÉSE} funkció használatára a kívánt területek pontos megcélzásához és optimalizálásához. A fenti példa két területet használt, az előtérben lévő dombokat és a háttérben lévő hegyet. - - TOPIC: VÖRÖSSZEM +image: red-eyes1.png +image: red-eyes2.png - Csökkentsd a vörösszem-hatást a vakus fotókon. Két módszer áll rendelkezésre. Az első gyorsabb, de lehet, hogy nem kezeli jól a nehezebb eseteket. A második módszer robusztusabb, de több időt és odafigyelést is igényel. Az első funkció használatához kattints bal gombbal a vörösszemre egyszer vagy többször, amíg elégedett nem vagy. Ha az elsötétített terület túl kicsi vagy nincs középen, kattints jobb gombbal a módosítás visszavonásához, majd kattints bal gombbal pontosabban a vörösszem közepére. Ha egy vörösszem nem javítható megfelelően, kattints jobb gombbal a módosítás visszavonásához, majd használd a második módszert. A második módszer jobban kezeli azokat a nehezebb eseteket, ahol a vörösszem csak kissé vörös, és a szemhéjaktól való színkülönbség túl kicsi ahhoz, hogy az automatikus algoritmus megkülönböztesse. Helyezd a kurzort a vörösszem közepére. Tartsd lenyomva a bal egérgombot, és húzd a kurzort lefelé és jobbra. Egy szaggatott ellipszis jelenik meg, amely bezárja a vörösszemet. Ismételd meg, ha szükséges, hogy a vörösszem (nagyjából) középre kerüljön az ellipszisben. Vedd figyelembe, hogy az ellipszis alakja a húzás irányától függ, ami lehetővé teszi a vörösszem pontosabb bezárását. Kattints bal gombbal ismételten az ellipszisen belül, miközben figyeled, ahogy a vörösszem sötétedik, és állj meg, amikor elég sötét. Ha túl messzire mész, a szemhéjak elkezdhetnek sötétedni. Kattints jobb gombbal a visszavonáshoz, és ismételd meg, ha szükséges. - - TOPIC: INTELLIGENS TÖRLÉS +image: smart-erase.png +image: smart-erase2.jpg - Töröld ki azokat a kis objektumokat, amelyek elronthatnak egy jó fotót, mint pl. villanyvezetékek, szemét a talajon, egy tábla stb. A nem kívánt objektum a környező területről vett pixelekkel kerül helyettesítésre. Ez néha nagyon hatékony (a mellékhatások szinte láthatatlanok), néha nem. A fotón lévő kis vagy keskeny objektumoknál működik a legjobban. A Radius szabályozza az egérmutató körüli kör méretét, meghatározva a kijelölendő és törlendő területet. Húzd az egeret az eltávolítandó objektum bezárásához. A bal gombos húzás kijelöl, a jobb gombos húzás megszünteti a kijelölést. Nyomd meg az [Törlés] gombot a kijelölt terület törléséhez, a pixeleket a kijelölésen kívüli legközelebbi pixelekkel helyettesítve. Ha a kijelölés nem volt elég pontos, használd az [Visszavonás] gombot, állítsd be a kijelölt területet, és nyomd meg újra az [Törlés] gombot. Az ismételt kijelölések és törlések halmozódnak, amíg nem használod a [New_Area] gombot egy új kijelölés elindításához. A korábban törölt területek most már rögzítettek, és az [Visszavonás] csak a következő kijelölésekre fog működni. A legjobb 200%-ra vagy nagyobbra zoomolt képpel dolgozni. A Blur vezérlő elmosást ad a helyettesítő pixelekhez. Ez csökkentheti a látható mellékhatásokat, mivel a helyettesítő pixelek élesebbek lehetnek a környezetnél. Módosítsd a Blur beállítást, és ismételd meg az [Törlés] gombot. A [show] és [hide] gombok használhatók az aktuális kijelölés körvonalának megjelenítésére vagy elrejtésére, hogy jobban megítélhesd az eredményeket törlés után. - Hosszú, vékony objektumoknál (pl. villanyvezetékek) rákattinthatsz két pozícióra, és minden közöttük lévő rész kijelölésre kerül. A kijelölés egyenes vonalban működik, ezért görbülő objektumoknál időközönként kattintanod kell, hogy kövesd a görbét. - - TOPIC: GLÓRIA ELTÁVOLÍTÁSA +image: remove-halo.png +image: remove-halo2.png - Távolítsd el a néhány szerkesztési funkció által hagyott glóriákat. Válaszd ki a glória típusát: fényes (leggyakoribb) vagy sötét. Húzd az egeret bal gombbal a glória területe felett, hogy módosítsd az egéren belüli pixeleket, ahogy a példa mutatja. Fényes glória esetén a legfényesebb pixelek sötétednek, ahogy az egeret áthúzod rajtuk. Sötét glória esetén a legsötétebb pixelek fényesednek. Használj a glória szélességénél nagyobb egérsugarat, ahogy a példa mutatja. Húzd jobb gombbal az egeret az eredeti pixelek visszaállításához. - - TOPIC: JPEG ARTEFAKTOK +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - Az erősen tömörített (alacsony minőségi beállítású) JPEG képek kis, téglalap alakú blokkok formájában mutathatnak tömörítési artefaktokat. Ha egy fotó bizonyos területeinek fényerőtartománya kibővítésre került, ezek a blokkok láthatóbbá válhatnak, mivel a fényerőlépések nagyobbak (pl. a 11/12/13 RGB értékek 5x-re fényesedve 55/60/65-re). Ez a funkció elmossa a blokkok közötti határokat, hogy kevésbé legyenek láthatóak. - A 'Match Limit' határozza meg, hogy a szomszédos pixelek mikor kezelendők ugyanazon pixelblokk tagjaiként. A Match Limit alacsonyabb értékre állítható, hogy az ilyen blokkok teljesebben legyenek feltérképezve. A 'Contrast Limit' megakadályozza az élek összeolvasztását ott, ahol a kontraszt magas, ami részletvesztést okozna. Módosítsd a két beállítást, és nyomd meg az [alkalmaz] gombot. Tekintsd meg az eredményül kapott képet >2x-es méretben, és próbálj ki különböző beállításokat, ha az optimalizálás fontos. Ez a funkció kevésbé hatékony lesz egy átméretezett képen. Használd a {TERÜLET KIJELÖLÉSE} funkciót a problémás területek szelektív feldolgozásához. - - TOPIC: ÉLSIMÍTÁS +image: anti-alias.jpg - Néha a fotók pixelesedést ('recézettséget') mutatnak néhány magas kontrasztú elem éle mentén. A fenti példában ezt a madár szeme körül láthatod. Az élsimító eszköz ezt csökkentheti. A hatás a legtöbb fotón kisebb, ahol a fényképezőgépen belüli feldolgozás valószínűleg már kezelte a problémát. Másodlagos hatásként az erősen tömörített képek jpeg artefaktjai valamelyest elsimulnak. A méretükben felskálázott képeken kifejezettebb lesz a pixelesedés. Ezeken lehet segíteni, különösen 2x-es felskálázás esetén. - Használd az [alkalmaz] gombot a pixelek elnyomásához, akár többször is, ha ez segít. A 'Threshold' használható az alacsony kontrasztú pixelek feldolgozásból való kizárására. Általában a 0,1 vagy kisebb érték a legjobb. - A Fotocx a Scale3x algoritmust használja, módosítva, hogy „hasonló” és „eltérő” színtónusokat használjon az „egyenlő” és „nem egyenlő” helyett. - - TOPIC: RGB BEÁLLÍTÁSA +image: adjust-RGB.png - Módosítsd az általános fényerőt és kontrasztot, vagy a kiválasztott színekét. • Brightness - a teljes kép fényerejének növelése vagy csökkentése • +Red -Cyan stb. - a szín fényerejének módosítása, és a kiegészítő szín ellentétes irányba történő módosítása • Contrast All - a teljes kép kontrasztjának növelése vagy csökkentése • Contrast Red Green Blue - egyedi RGB színek feldolgozása - - TOPIC: HSL BEÁLLÍTÁSA +image: adjust-HSL.png - Módosítsd egy kép színeinek egy kiválasztott tartományát a HSL (Hue, Saturation, Lightness) segítségével. Ez a funkció használható egy színelfogultság javítására, vagy egy szín másikra való cserélésére (pl. egy túlexponált ég - túl fehér). Ha nem ismered a HSL színmodellt, olvasd el a róla szóló Wikipédia cikket. - Kezdd egy egyeztetendő és módosítandó célszín kiválasztásával, shift + bal kattintással a képen. Ez a szín lesz a módosításra kiválasztott színtartomány középpontja. Válaszd ki, mely színjellemzők legyenek egyeztetve a hue, saturation és lightness jelölőnégyzetekkel. Ezek mindegyike szűkíti a kiválasztott színek tartományát. Ha egyik sincs bejelölve, minden szín kiválasztásra kerül. A Match Level használható a kiválasztott színek tartományának további szélesítésére. A 100% azt jelenti, hogy csak a szorosan egyező színek kerülnek kiválasztásra. - Az Output Color vezérlők (hue, saturation, lightness) az új kimeneti szín beállítására szolgálnak, amely lecseréli vagy keveredik a kiválasztott bemeneti színekkel. Ezt a színt a képről is beállíthatod, shift + jobb kattintással. Az eredményszín az eredeti szín és az új szín keveréke lesz. Az új szín arányát az Adjustment csúszka állítja be, amely 0-tól 100%-ig állítható. Használd a HSL jelölőnégyzeteket annak meghatározásához, hogy a bemeneti szín mely HSL komponensei kerüljenek lecserélésre a kimeneti szín megfelelő HSL komponenseivel. Használd a kimeneti szín HSL csúszkáit az új szín beállításához. A kimeneti szín a bal oldali kisebb dobozban jelenik meg, amely frissül, ahogy mozgatod a csúszkákat. - Mozgasd a csúszkákat, és figyeld az élő képfrissítéseket az eredmény optimalizálásához. Ez nem túl intuitív, és a gyakorlás segít. Tipp: kezdd a hue és saturation egyeztetésével, és csak a hue cseréjével - ez azt jelenti, hogy a kimeneti szín telítettsége és fényessége az eredeti képszínekből lesz átmásolva, és csak a hue kerül lecserélésre. - - TOPIC: POR ELTÁVOLÍTÁSA +image: remove-dust.png +image: remove-dust2.jpg - A poros beszkennelt diákból készült képeken sok apró sötét folt lehet - a por árnyékai a diákon. Az internetről származó régi fotóknak gyakran hasonló problémájuk van. Ez a funkció az ilyen foltok többségét eltávolíthatja. Mozgasd a három csúszkát, amíg a maximális számú porfolt pirosra nem festődik, majd nyomd meg az [törlés] gombot a törlésükhöz. Nyomd meg a [red] gombot a piros nézet visszahozásához, majd újra beállíthatod a csúszkákat, és megnyomhatod az [törlés] gombot. A „spot size limit” csúszka korlátozza a törlendő foltok méretét. A „max. brightness” csúszka egy küszöbértéket állít be azoknak a foltoknak a figyelmen kívül hagyásához, amelyek nem elég sötétek. A „min. contrast” csúszka kiszűri azokat a foltokat, amelyeknek alacsony a kontrasztjuk a környezetükhöz képest. Ez a folyamat általában kompromisszum. Ha a beállítások nem optimálisak, kis elemek, mint a falevelek, törölve lehetnek, vagy nagy foltok maradhatnak a helyükön. A kép különböző részeinél különböző beállításokra lehet szükség, pl. az ég agresszívebben kezelhető, mint egy épület fala. Egyszerűen többször is használhatod az Erase Dust funkciót különböző beállításokkal, szükség szerint, hogy az összes porfoltot megkapd. Vagy használhatod a {TERÜLET KIJELÖLÉSE} funkciót a kép szakaszokban történő feldolgozásához. Ha néhány folt tartósan megmarad, kézzel is kezelheted őket az {INTELLIGENS TÖRLÉS} funkcióval. Állíts be kis egérsugarat, és kattints az egyes foltokra az eltávolításukhoz. A szálakból (hosszú és vékony) származó foltokat általában nem távolítja el automatikusan, de az Intelligens törlés itt hatékony lehet. Ha a por fényes, mint a fenti példában, használd a {SZÍNMÓD} funkciót színes negatív készítéséhez, dolgozd fel a port, majd ismételd meg a színes negatívot a normál kép visszaállításához. - - TOPIC: SZEGÉLYEK +image: fringes.png +image: fringesA.jpg - Javítsd a szél menti színszegélyeket (laterális kromatikus aberráció) - ahol a színszegélyek főleg a kép külső területein jelennek meg. - A fenti bal oldali kép egy nagyított kivágás egy laterális kromatikus aberrációval rendelkező fotó bal felső sarkából. Ez nagyrészt megszűnt a jobb oldali feldolgozott képen. Színszegélyek jelenhetnek meg magas kontrasztú élek mentén, különösen a kép külső területein, ahol az objektívtorzítások általában a legnagyobbak. Ezek megszüntetéséhez zoomolj a képre maximális méretre, és középítsd egy színszegélyekkel rendelkező területre. Nyomd meg a [search] gombot. A piros és kék színsíkok átskálázásra kerülnek, hogy jobban illeszkedjenek a zöld síkhoz, és a használt tényezők bekerülnek a párbeszédablakba. Javíthatod az eredményt a tényezők közvetlen módosításával a párbeszédablakban: módosítsd a tényezőket, miközben figyeled a színszegélyeket a képen. - Ez a funkció kevésbé hatékony lesz, ha a kép úgy lett levágva, hogy a kép középpontja már nem egyezik meg az eredeti fotó középpontjával. - - TOPIC: FINOMHANGOLÁS MENÜ - - TOPIC: HISZTOGRAM LAPÍTÁSA +image: flatten1.jpg +image: flatten2.jpg - Növeld a látható részleteket a gyenge kontrasztú területeken. A pixel fényereje fel vagy le kerül módosításra, hogy a pixel körüli terület fényerő-eloszlása (hisztogramja) egyenletesebb legyen. Egy kisebb sugár (kisebb terület) erősíti a hatást. 5 fényerő-zóna van a legsötétebbtől (1) a legvilágosabbig (5). Mozgasd egy csúszkát a megfelelő zóna hatásának növeléséhez. Használd a zone A csúszkát, hogy mind az 5 csúszkát együtt mozgasd, és gyorsan beállíts egy kezdeti eredményt. Majd használd a többi csúszkát egyenként a kép finomhangolásához. - - TOPIC: HELYI KONTRASZT +image: localcon1.jpg +image: localcon2.jpg - Növeld a kontrasztot egy kép minden területén. Az egyes pixelek fényereje összehasonlításra kerül a környező terület átlagos fényerejével. A pixel fényereje úgy kerül módosításra, hogy növelje ezt a különbséget. Ez a funkció egy széles körben használt tankönyvi módszert valósít meg. A Radius meghatározza az egyes pixelek körüli, az átlagos fényerőhöz használt terület méretét. A Power meghatározza a fényerőváltozás mértékét. A Color a színtelítettség növelésére szolgál. Használhatod a szerkeszthető görbét a kimeneti kép fényesítéséhez a kiválasztott fényerőszinteken. A példa a kép sötétebb területeinek fényesítését mutatja. - A Helyi kontraszt bizonyos körülmények között „glóriákat” hozhat létre: +image: localcon3.jpg - Az eredeti kép a bal oldalon van. A középső képre a Helyi kontraszt lett alkalmazva max. power-nél. Egy glória látható a sötét dombok és a világosabb ég közötti határ mentén. Ez egy egyszerű trükkel javítható (jobb oldali kép). Válaszd ki külön az égterületeket a {TERÜLET KIJELÖLÉSE} funkcióval. Alkalmazd a Helyi kontrasztot erre a területre. Fordítsd meg a kijelölést, és alkalmazd a Helyi kontrasztot a kép többi részére. - - TOPIC: KONTRASZT ERŐSÍTÉSE +image: amplify-contrast.png +image: amplify-contrast2.jpg - Növeld egy kép látszólagos fényerőtartományát a helyi kontraszt növelésével. Ez növelheti az alacsony kontrasztú területeket, miközben nem változtatja meg a magas kontrasztú területeket. A szerkesztő görbével is módosíthatod a kontraszterősítést a kezdeti kontrasztmennyiség szerint. - A görbe alatti Amplify csúszka szabályozza a számítást, a kontraszterősítés hiányától a teljes erősítésig. Ha túl messzire mozgatod jobbra, a kép csúnya artefaktokat mutathat, ezért húzd vissza, amíg ezek el nem tűnnek. Ha az egyenletes területek (pl. az ég) foltosak lesznek, húzd le a görbe bal végét, hogy csökkentsd az erősítést az alacsony kontrasztú területeken. Néhány esetben a legjobb, ha a kép különböző területeit kiválasztod, és külön dolgozod fel őket, pl. visszafogottan az égre, agresszívebben a texturált felületekre, mint a kőfalak. - - TOPIC: GLOBÁLIS RETINEX +image: global-retx.png +image: global-retx2.jpg - Javítsd a színt és a kontrasztot extrém köddel/párával vagy színelfogultsággal rendelkező képeknél (pl. egy 100 éves fotó). Először próbáld ki az [Auto] gombot. A kép átvizsgálásra kerül, hogy megtalálja a jelenlévő legvilágosabb és legsötétebb RGB színeket. A legsötétebb RGB értékek levonásra kerülnek az összes pixelből, és az eredményül kapott RGB értékek felskálázásra kerülnek, hogy a maximális RGB értékek 255 közelében legyenek. Ez természetesen kezdetben nem biztos, hogy optimális. A léptetőgombok a talált sötét és fehér RGB határértékekre vannak beállítva, és ezeket módosíthatod az eredményül kapott kép optimalizálásához. Kiválaszthatod a saját sötét és világos pontjaidat a párbeszédablakban a megfelelő lehetőség kiválasztásával és a képre kattintással. A szorzó léptetőgombok alapértelmezetten 1,0-ra vannak állítva, és módosíthatod ezeket az értékeket az egyes RGB színek relatív fényerejének beállításához. A fenti példában az 1. kép az eredeti, a 2. kép az [Auto] gombbal készült. A léptetőgombok legjobb oldali oszlopa az azonos sorban lévő összes gombot együtt módosítja - használd az egérgörgőt vagy a billentyűzet fel/le nyílbillentyűit. - A blend csúszka a bemeneti kép és a retinex kép tetszőleges arányban történő keverésére szolgál. A reduce bright csúszka a hatás gyengítésére szolgál a világosabb képterületeken, különösen az égen, ahol a Retinex furcsa kinézetű eredményeket produkálhat. - Az algoritmus az Edwin Land által az 1970-es években először publikált koncepciókból származik. Keress rá az interneten a 'retinex' szóra további információért. - - TOPIC: HELYI RETINEX +image: local-retx.png +image: local-retx2.jpg - Növeld a látható részleteket a sötét képterületeken és más, alacsony kontrasztú területeken. Az egyes pixelek körüli zóna fényerőtartománya a pixel fényerejének átskálázására szolgál, mintha az egész zóna át lenne skálázva, hogy lefedje a teljes 0-255-ös fényerőtartományt. A Helyi retinex drámai eredményeket produkálhat ott, ahol a Globális retinex gyenge. - A radius bemenet meghatározza az egyes pixelek körüli zóna hozzávetőleges méretét. A blend csúszka a bemeneti kép és a retinex kép tetszőleges arányban történő keverésére szolgál. A reduce bright csúszka a hatás gyengítésére szolgál a világosabb képterületeken, különösen az égen, ahol a Retinex furcsa eredményeket produkálhat. A reduce dark csúszka ugyanezt teszi a sötétebb képterületeken. A fenti példa kb. 60% eredeti kép + 40% retinex. - - TOPIC: TELÍTETTSÉG +image: saturation.png - Állítsd be a színtelítettséget a pixel fényereje alapján. A szerkesztő görbe Y-tengelye a színtelítettség, a nulla színtől (minden RGB érték egyenlő) a maximális színig (a legalacsonyabb RGB érték nulla). A görbe X-tengelye a pixel fényereje, a sötéttől a maximális fényerőig. A semleges pozíció (nincs színváltozás) a középső érték, amely egyben a kezdeti érték is. Példa: a kép sötét területeinek színintenzitásának növeléséhez emeld fel a görbe bal végét. A Saturation csúszka az egész görbét mozgatja fel vagy le, az alakjának megváltoztatása nélkül. - - TOPIC: LÁGY FÓKUSZ +image: soft-focus2.jpg +image: soft-focus.png - Alkalmazd a klasszikus „lágy fókusz” hatást egy fotóra. Ez egy éles kép és egy kissé elmosódott kép keveréke. A radius beállítás meghatározza az elmosás mértékét (pixeltartomány), a mix beállítás pedig az elmosott kép arányát a kevert kimeneti képben, 0-tól 100 százalékig. Ezzel a funkcióval együtt használhatod a {FESTÉS SZERKESZTÉSE} funkciót, hogy a hatást a kép különböző területein módosítsd. - - TOPIC: FÉNYERŐ ÁTMENET +image: brite-ramp1.png +image: brite-ramp2.png - Változtasd a fényerőt vagy a színt egy kép mentén. Ezzel kompenzálhatod az egyenetlen megvilágítást vagy a képen keresztül változó színelfogultságot. A változás irányát egy, a képre rajzolt vonal határozza meg. Hozd létre a vonalat a képre kattintva, majd húzd bármelyik végét a kívánt irány beállításához. A fenti példában a zöld nőtt a vonal irányában. Először szerkeszd az All görbét az általános fényerő (minden szín) beállításához, majd szükség szerint állítsd be az egyedi RGB színgörbéket. - - TOPIC: VINYETTÁLÁS +image: vignette.png +image: vignette2.jpg - Javítsd a fotó sarkaiban néha látható elsötétedést. Használható egy objektum vagy terület kiemelésére vagy színezésére is egy képen belül. - Kattints vagy húzd az egeret a képen a vinyetta középpontjának megváltoztatásához, amely kezdetben a kép közepén van. - Válaszd a 'Brightness'-t a kép fényerejének sugárirányú mintázatban történő módosításához: állítsd be a görbe bal vagy jobb végét a kép középpontjának, illetve szélének fényerejének megváltoztatásához. Sötét környezetet adhatsz egy portré arcnak, vagy javíthatsz egy elsötétült sarkú képet. A görbe középső szintje nem jelent változást. Használj alacsonyabb értékeket a sötétítéshez, magasabbakat a fényesítéshez. A fenti példa fokozatosan sötétíti a kép szélét, miközben egy széles középső területet változatlanul hagy. - Válaszd a 'Color'-t, hogy egy kiválasztott színt adj a képhez sugárirányú mintázatban. A nulla görbeérték nem jelent változást, a magasabb értékek pedig hozzáadják a kiválasztott színt a képhez. A legmagasabb érték 100%-os színnek felel meg. Használd ezt a funkciót, hogy színes környezetet adj egy képhez, pl. vegyél körül egy arcot fokozatosan növekvő színnel. - - TOPIC: EFFEKTEK MENÜ - - TOPIC: KÖRVONALAK +image: outlines1.png +image: outlines2.jpg - Alakíts át egy fotót körvonalrajzzá. A magas kontrasztú pixelek felerősödnek, az alacsony kontrasztúak elnyomódnak. A threshold beállítás állítja be a kontraszt küszöbértékeit. A minimum alatti vonalak nem jelennek meg, a maximumnál magasabbak pedig maximális fényerővel rendelkeznek. A 'black/white' jelölőnégyzet a színes vonalakat feketévé fehéren, vagy fehérré feketén alakítja, a 'negative' jelölőnégyzettől függően. Használd a 'Low Amplify'-t az elhalványult vonalak fényesítéséhez, ha szeretnéd. A 'Mode B' egyenletesebb vonalfényerőt eredményez, mint a 'Mode A'. - - TOPIC: VÁZLAT1 +image: sketch1.jpg - Alakíts át egy fotót vázlatszerűvé. A sötét pixelek kevesebb pixelbe tömörülnek, a felszabadult területeket fényesebbé téve. A kontraszt is használható a sötét pixelek helyettesítőjeként. A Threshold használható a bemeneti kép fényerő szerinti szűrésére. A Clip Level a kimenet szűrésére szolgál, hogy tovább csökkentse az elszigetelt vagy alig sötét pixeleket. Válassz színeket az előtérhez és a háttérhez. A bemeneti kép méretének csökkentése érdekes eredményeket adhat. Ha az eredmény „piszkosnak” tűnik, használd a {ZAJCSÖKKENTÉS} vagy a {FÚZIÓ} funkciót a kép simításához, mielőtt itt feldolgoznád. - - TOPIC: VÁZLAT2 +image: sketch2.png +image: sketch2b.jpg - Alakíts át egy fotót vázlatszerűvé. Ez egy más módszert használ: az alacsony ... magas kontrasztú pixelek világos ... sötét pixelekké alakulnak át, ennek megfelelően. A görbe használható a kontrasztátalakítás erősségének növelésére vagy csökkentésére. Az x-tengely skálája a pixelkontraszt, alacsonytól magasig, az y-érték pedig az átalakítás erősségét határozza meg. A példa az alacsony kontrasztú pixelek elnyomását (világosabbá tételét) mutatja. A bemeneti kép tetszőleges arányban bekeverhető. Ha az eredmény „piszkosnak” tűnik, használd a {ZAJCSÖKKENTÉS} vagy a {FÚZIÓ} funkciót a kép simításához, mielőtt itt feldolgoznád. - - TOPIC: RAJZFILM +image: cartoon.jpg - Alakíts át egy fotót rajzfilmszerű rajzzá. Fekete vonalak rajzolódnak a kép elemeinek élei fölé, mindenütt, ahol a fényerő vagy a szín hirtelen változik. A Line Threshold állítja be az élérzékelés és a vonalrajzolás érzékenységét, kevesebb vagy több vonalat rajzolva. A Line Width a vonalakat vastagabbá vagy vékonyabbá teszi. A Kuwahara Depth egy élesítő funkciót vezérel, amely erősítheti a kép elemeinek éleit. - - TOPIC: DOMBORÍTÁS +image: emboss2.jpg +image: emboss.png - Alakíts át egy képet szimulált domborművé vagy dombornyomatos képpé (3D hatás). A kép elemeinek élei az egyik oldalon fényesebbé, a másikon sötétebbé válnak, mintha felemelkednének és oldalról meg lennének világítva. A radius beállítás meghatározza a hatás szélességét, a depth beállítás pedig az intenzitást. A Light Source beállítás határozza meg azt a szöget, amelyből a látszólagos megvilágítás érkezik. Ez módosítható, hogy maximalizáld a hatást az erre a szögre leginkább merőleges kép elemeinek éleinél. - - TOPIC: CSEMPÉK1 Alakíts át egy képet egyszínű csempék tömbjévé. Szabályozhatod a csempeméretet és a csempék közötti rés vastagságát. Ezt 'pixelate'-nek is nevezik. Használd a Terület kijelölése funkciót az átalakítás egy korlátozott területre, pl. egy arcra, való korlátozásához. - - TOPIC: CSEMPÉK2 +image: tiles2a.png +image: tiles2b.png - Alakíts át egy képet szabálytalan csempékké, amelyek nagyjából illeszkednek a kép színeihez és kontúrjaihoz. ^base size:^ A csempe alapmérete, amely az a mértékegység-csempe méret, amelyet a nagyobb csempék készítéséhez használnak. ^color depth:^ A használandó színek száma: 1 = 8 szín, 2 = 64 szín ... 8 = 16 millió szín. ^tile area goal^: A csempeméret felső határa (terület pixelben). ^req. color match^: Állítsd be a minimálisan szükséges színegyezést ahhoz, hogy egy kisebb terület egy szomszédos nagyobb területbe olvadjon: 0 = mindegy (maximális összevonás), 100 = tökéletes egyezés szükséges (minimális összevonás). - - TOPIC: FESTÉS +image: painting1.png +image: painting2.png - Alakíts át egy képet festményszerűvé. Csökkenti a színek számát, feltérképezi az azonos színű összefüggő pixelterületeket, majd a kisebb területeket a legjobb színegyezéssel rendelkező szomszédos nagyobb területekbe olvasztja. - ^blur radius^: Mosd el a képet feldolgozás előtt. Ez simább határokat eredményez. ^color depth^: A használandó színek száma: 1 = 8 szín, 2 = 64 szín ... 8 = 16 millió szín. ^patch area goal^: Állíts be egy alsó határt azokhoz a területekhez, amelyeknek saját színük lesz: az ennél a pixelszámnál kisebb területek beleolvadnak a legközelebbi színegyezéssel rendelkező szomszédos területbe. ^required color match^: Állítsd be a minimálisan szükséges színegyezést ahhoz, hogy egy kisebb terület egy szomszédos nagyobb területbe olvadjon: 0 = mindegy (maximális összevonás), 100 = tökéletes egyezés szükséges (minimális összevonás). ^borders^: Meghatározza, hogy a színes területek vékony fekete határvonallal legyenek-e körülhatárolva, mint a szabálytalan mozaikcsempék. E funkció használata után a {DOMBORÍTÁS} funkció használata érdekes textúrát adhat a képhez. - - TOPIC: TEXTÚRA +image: texture2.jpg +image: texture.png - Adj egy texturált felületet egy képhez vagy egy kép kijelölt területeihez. A Radius meghatározza a textúraminta méretét. A Strength meghatározza a minta intenzitását, a szinte láthatatlantól a dominánsig. - - TOPIC: FÚZIÓ +image: fusion.png +image: fusion2.jpg - Nyomd el a kép kis, alacsony kontrasztú részleteit, miközben megőrzöd a nagyobb kép elemek élességét. Nyomd meg a [indítás] gombot, és figyeld szorosan a képet. A folyamat folyamatosan fut, amíg meg nem állítod a [leállítás] gombbal. A kis részletek lassan elhalványulnak. A párbeszédablak 'count' címkéje mutatja az iterációk számát. Megállíthatod a folyamatot a [leállítás] gombbal a kép megvizsgálásához, majd folytathatod a feldolgozást a [indítás] gombbal. Használd a Visszavonás/Mégis gombot az előtte/utána kép állapotának összehasonlításához. Folytasd a feldolgozást a [indítás] gombbal. A [lépés] gomb használható egyetlen lépés egyszerre történő feldolgozásához. - - TOPIC: SZÍNEK EGYEZTETÉSE +image: match-colors.png - Illeszd az egyik kép színeit egy másikéhoz. Egy egérkattintással kiválasztott kis foltot mintavételeznek mindegyik képből. A 2. kép foltja ugyanazt az átlagos színt (RGB értékeket) kapja, mint az 1. kép foltja. Az RGB értékek azonossá tételéhez használt tényezők ezután az összes pixelre alkalmazásra kerülnek a 2. képben. Egy gyakori felhasználás egy kép színelfogultságának eltávolítása egy folt megjelölésével, amely egy másik kép színéhez fog illeszkedni. - Eljárás: A párbeszédablak 5 sorrendben elvégzendő lépést sorol fel. • Állíts be egy sugarat a mintaterülethez. Az eredményül kapott egérkör a mintavételezendő foltterület. • Nyisd meg az 1. képet az [open] gomb megnyomásával. • Kattints a képre egy színminta vételéhez. • Nyisd meg a 2. képet az [open] gomb megnyomásával. • Kattints a képre azon a foltnál, amelyet az 1. képhez szeretnél illeszteni. A kép színei egy-két másodpercen belül megváltoznak. - - TOPIC: MINTA +image: pattern2.jpg +image: pattern1.png - Adj háttérmintát egy képhez. Egy kis képfájl (mintafájl) szolgál az aktuális kép lefedésére a fájl duplikálásával, mint egy csempézett fal. Ez a fájl lehet egy valódi minta (pl. egy vászonszövet, egy téglafal, egy ismétlődő geometria képe ...), vagy bármilyen más típusú kép. A minta félig átlátszóvá válik, így az alapkép úgy tűnik, mintha a minta fölé lenne nyomtatva, vagy a minta a kép fölé. Sok mintafájl található „pattern image” internetes kereséssel. Töltsd le ezek némelyikét, és vágd le szükség szerint kb. 200-500 pixel méretűre. Kényelmi célból add hozzá ezeket a mellékelt mintafájlokhoz a ~/.fotocx/patterns mappában. - Használd a [Tallózás] gombot egy mintafájl kiválasztásához. A kiválasztott minta csempézve lefedi az alapképet. A minta részben átlátszó, így az alapkép átlátszik rajta. Használd a Zoom-ot a mintaméret növeléséhez vagy csökkentéséhez. Két módszer van a minta és az alapkép keverésére. A minta átlátszatlansága 0-100%-ra állítható. Az alapkép tölti ki a fel nem használt átlátszatlanságot. A Contrast az alapkép fényerejének módosítására szolgál, a minta fényerejét sablonként használva. A két paraméter bármilyen arányban keverhető. - Ha a mintafájl olyan képet tartalmaz, amely fix időközönként ismétlődik vízszintesen és függőlegesen is, a [Számítás] gomb használható a szélesség és magasság beállítására, hogy folyamatos, látható varratok nélküli minta jöjjön létre. - Ha a minta szabálytalan, és a varratok látszanak, javíthatsz ezen. A két Overlap érték meghatározza, hogy a duplikált minták mennyire fedjenek át a széleken, vízszintesen és függőlegesen. Adj hozzá egy kis átfedést a szélhatások elfedéséhez. - A Terület kijelölése használható egy minta alkalmazására egy kép egy részére, vagy különböző minták alkalmazására különböző részekre. Miután alkalmaztál egy mintát egy képre, érdekes lehet a {DOMBORÍTÁS} funkció használata, hogy 3D-s hatást adj a mintának. - A „Grayscale” jelölőnégyzet szürkeárnyalatossá alakítja a színes mintát. - - TOPIC: KERESZTVONALKÁZÁS +image: crosshatch2.jpg +image: crosshatch1.png - Alakíts át egy képet keresztező párhuzamos vonalakkal készült rajzzá. Add meg egy rácsméretet, és nyomd meg az [alkalmaz] gombot. - - TOPIC: DITHER +image: dither1.png - +image: dither2.jpg - Ez a funkció több módot biztosít egy kép dither-elésére - pontokká alakítására. 0 - színes pontok Roy Lichtenstein stílusában 1 - tiszta R/G/B vagy fekete/fehér véletlenszerű vagy optimalizált térbeli eloszlással 2 - RGB keverék megadott bitmélységgel 3 - klasszikus dither egyéni színpalettával 4 - kép tömörítése foltokká a tömörített pixelek átlagos színével - A klasszikus ditherek a Floyd-Steinberg módszert használják a színhibák kompenzálására: a bemeneti képszín és a palettából vett legközelebbi szín közötti eltérésre. A közeli színű pontok szükség szerint bekeverésre kerülnek, hogy egy terület átlaga jobban megegyezzen a bemeneti színnel. A hibakompenzáció kikapcsolható, ha szeretnéd, hogy elkülönült színsávokat vagy kontúrokat kapj. - Blobs: A képpixelek egyfajta „gravitációs összeomláson” mennek keresztül, helyi tömegközéppontok köré tömörülve. A 'Mass' a pixel fényereje szerint van meghatározva. A 'radius' vezérlő nagyjából meghatározza a vonzás tartományát. Nyomd meg a [indítás] gombot az összeomlás elindításához. Figyeld, ahogy a kép lassan foltokká alakul, amelyek nagyjából a 'radius' bemenet méretűek. Amikor a foltok szépek és kerekek, és már alig változnak, nyomd meg a [leállítás] gombot a folyamat befejezéséhez. - - TOPIC: METSZET +image: engrave.png +image: engrave2.png - Alakíts át egy képet fekete-fehér vonalakká. A Size bemenet meghatározza a vonalvastagságot, és hogy a kimeneti vonalak minden egyes függőleges pixeloszlopához hány függőleges képpixel legyen felhasználva. A vonal pixeloszlopok fekete és fehér részekre oszlanak, amelyek aránya nagyjából megfelel a bemeneti pixelek átlagos fényerejének. A Bias bemenet az általános fényerő optimalizálására használható. A negatív/pozitív értékek sötétebbé/fényesebbé teszik a képet. A Color bemenet (0-100%) használható szín hozzáadására a fehér részekhez. - - TOPIC: CSILLOGÁS HOZZÁADÁSA +image: addglare.png +image: addglare2.jpg - Adj hozzá fénycsíkot, amely a kép fényes foltjaiból sugárzik ki. Power: meghatározza a fénycsík relatív fényerejét Limit: a fénycsík kibocsátásához szükséges küszöb pixelfényerő Range: a fénycsík pixel-tartománya a kibocsátó pixelektől A limit fölötti fényerejű pixelek (200-255) fénycsíkot bocsátanak ki. A fényerő itt egy pixel legfényesebb RGB színének fényerejét jelenti. A kibocsátott fénycsík a kibocsátó pixel színében van. A range pixel egységekben értendő. A fénycsík a kibocsátó pixelnél lesz maximális, és a range határánál nullára csökken. - - TOPIC: MOZAIK +image: mosaic1.png +image: mosaic2.jpg - Hozz létre egy mozaikképet az összes képedből készült csempék felhasználásával. - Add meg a csempeméretet pixelben (pl. 36 x 24), és nyomd meg a [Csempék] gombot. A csempék az összes képedből jönnek létre (valójában a sebesség érdekében a thumbnail képek kerülnek felhasználásra). Ha módosítod a csempeméreteket, nyomd meg újra a [Csempék] gombot a csempék újragenerálásához. A csempék létrehozása után nyomd meg az [Kép] gombot, hogy az aktuális képet ezekkel a csempékkel mozaikká alakítsd. A csempék kiválasztása az átlagos csempeszín és az adott csempepozíció átlagos képszínének egyeztetésével történik. Ha több ezer kép áll rendelkezésre, és a színtartomány elég jó, a mozaik egészen jól fog kinézni. Zoomolj be a kép bármelyik részére a csempeképek megtekintéséhez. - A Tile blending csúszka a kép csempékkel történő összeolvasztását okozza, jobban kinézővé téve azt, ha a csempék rossz színegyezésűek. Ha az összeolvasztás kevesebb, mint kb. 50%, a csempék szinte olyan tisztán maradnak, mint korábban, mivel a szem kompenzálja a hamis árnyalatot. - Miután egy mozaik létrejött, rákattinthatsz bármelyik csempére, hogy egy nagyobb felugró képet kapj. Ha egy mentett mozaikot nyitsz meg, a csempékre kattintás nem fog nagyobb képet eredményezni. A mozaik újragenerálása elég gyors, ezért tedd ezt meg, ha szeretnéd, hogy a felugró ablakok működjenek. - - TOPIC: ZAJ HOZZÁADÁSA +image: add-noise.png - Adj véletlenszerű színzajt egy képhez. Állíts be egy 1-10 közötti célfoltméretet és 0-100%-os zajszintet. 100%-nál -127-től +127-ig terjedő véletlenszerű zaj kerül hozzáadásra minden pixel minden RGB értékéhez. Az átlagérték nulla. A 0-255 tartományon kívüli túlcsordulások levágásra kerülnek. Egy nagy terület átlagos színe megmarad, a zaj rárakódásával. A Zaj hozzáadása funkciót a Terület kijelölésével vagy a Szerkesztés festésével együtt használhatod, hogy zajt adj a kijelölt területekhez. - ^A 'sávosodás' elnyomása Azokon a képterületeken, ahol a fényerő-eloszlás 'ki lett nyújtva', látható 'sávosodás' fordulhat elő a majdnem egyenletes fényerejű és színű területeken. Ezt a problémát zaj (vagy elmosás) hozzáadásával csökkentheted az érintett területeken. - - TOPIC: SZÍNEK BEÁLLÍTÁSA +image: set-colors1.jpg +image: set-colors2.jpg - Csökkentheted a képben használt színek számát, hogy poszterhatást hozz létre. Állítsd be az egyes RGB színeket külön-külön, vagy módosítsd a teljes színszámot. Ehhez nincs színbitmélység használva. A Fotocx néhány funkciója bitmélységet használ, az elérhető színeket 2, 4, 8 ... -ra korlátozva minden RGB színnél. Ez a funkció ebből a szempontból nincs korlátozva. A fenti példa 8 piros, 5 zöld és 3 kék színt használ. - - TOPIC: SZÍNEK ELTOLÁSA +image: shift-colors.png - Ez a funkció használható színek javítására, vagy egy kép hamis színekké alakítására. Válaszd ki a három RGB szín bármelyikét, és mozgasd a csúszkát balra vagy jobbra a középtől. A másik két szín egyike fokozatosan helyettesítve lesz. Például fokozatosan lecserélheted a piros színt zöldre vagy kékre. Az All csúszka az összes színt együtt tolja el. Ezt tedd meg először, hogy megtalálj egy első optimumot, majd told el egyenként az RGB színeket. - - TOPIC: IDEGEN SZÍNEK +image: alien-colors2.jpg +image: alien-colors1.png - Fesd újra egy kép vagy kijelölt terület idegen véletlenszerű színekkel. Szabályozhatod a durva mintaméretet és az intenzitást (az alig láthatótól a dominánsig). Nyomd meg az [Alkalmaz] gombot egy új színeloszlás eléréséhez. - - TOPIC: EGYÉNI KERNEL +image: custom-kernel.png - Alkalmazz egy egyéni konvolúciós kernelt egy képre. Az alapul szolgáló technológia a Wikipédián van elmagyarázva. Add meg a kernel méretét, egy szorzótényezőt, egy összeadási tényezőt, és töltsd ki a táblázat értékeit. Az [Alkalmaz] alkalmazza a kernelt a képre. A [Visszaállítás] visszaállítja az eredeti kép állapotát. Az értékek fájlba menthetők, és később visszakereshetők a [Mentés] és [Betöltés] gombokkal. Kezdetben több kernel példafájl is elérhető. Módosíthatod ezeket, és elmentheted egyéni névvel. - Matematika: a kép minden N×N-es pixeltömbjének fényerőértékei megszorozódnak a kernel mátrix megfelelő értékeivel, és összeadódnak. Ez a szám megszorozódik a szorzótényezővel, és hozzáadódik az összeadási tényező. Ez a végső érték lesz az N x N tömb közepén lévő képpixel új fényerőszintje. - - TOPIC: TORZÍTÁS MENÜ - - TOPIC: KIEGYENESÍTÉS +image: unbend1.png +image: unbend2.jpg - A közeli témák (jellemzően épületek vagy belső terek) panorámái görbévé vált egyenes vonalakat, vagy ferde épületeket mutathatnak. A képek torzítása szükséges volt a panorámakészítés folyamatában, hogy a képek illeszkedjenek egymáshoz. A Kiegyenesítés funkció utólag használható a panorámakép egyenesítésére, ha szükséges. Függőleges és vízszintes szaggatott vonalak jelennek meg a képen, mutatva a kiegyenesítési tengelyeket. Kattints vagy húzd az egeret egy vonal vége közelében a mozgatásához. Ha a négy beviteli vezérlő értékei megváltoznak, a kép a megfelelő négy kép által jelzett módon torzul. Növeld vagy csökkentsd az értékeket, és ismételd, amíg meg nem vagy elégedve. Mozgasd a tengelyeket a torzítás középpontjainak megváltoztatásához. - Lásd még a {KÉP TORZÍTÁSA} funkciót a képgörbülés és perspektíva javításának egy másik módszeréért. - - TOPIC: PERSPEKTÍVA +image: perspective2.jpg +image: perspective1.png - Ez a funkció használható egy eltolt szögből készült fotó kiegyenesítésére. A bal oldali kép az eredeti fotó, amely a középtől jobbra készült a tükröződések elkerülése érdekében. A jobb oldali kép a kiegyenesített változat. Ez a funkció egy magas épület utcaszintről vagy oldalról fényképezett kiegyenesítésére is használható. - Kattints annak a tetraédernek a négy sarkára, amelyet téglalappá szeretnél alakítani (a fenti esetben a festmény vagy keret négy sarka), majd válaszd az [Alkalmaz] lehetőséget. A megkattintott sarkokat kis fehér dobozok jelölik, amelyek „A, B, C, D” feliratot tartalmaznak. Minden doboz bal felső sarka pontosan megjelöli a kép pozícióját. Egy doboz közelébe kattintva az új pozícióba mozgatod. Használhatod a billentyűzet nyílbillentyűit a sarokjelölők 1 pixeles lépésekben történő mozgatásához. A nyílbillentyűk a legutóbb megkattintott vagy mozgatott sarokra hatnak. - - TOPIC: KÉP TORZÍTÁSA +image: warps4.jpg - - TOPIC: TERÜLET TORZÍTÁSA Ez a funkció használható torzítások létrehozására egy képen belül. Kiválaszthatsz egy képterületet, és húzhatod az egeret, hogy ezt a területet a kép többi részéhez képest megnyújtsd. A kép olyan, mint a gumi. Ha az egérhúzás a kijelölt területen belül kezdődik, a terület az aktuális határain belül torzul - a mozgás az egérmutatónál maximális, és a terület szélein nullára csökken. Ha az egérhúzás a kijelölt területen kívül kezdődik, az egér közelében lévő területszélek kihúzhatók az eredeti területhatáron túlra. Sok, különböző hosszúságú és irányú egérhúzás kombinálható a kívánt eredmények eléréséhez. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - Ez a funkció hasznos a perspektívaproblémák javításához. Húzd a képet egy sarok közeléből, az egérrel. A kép rugalmasan meghúzódik ebből a sarokból, míg a többi sarok rögzítve marad. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - Ez a funkció hasznos a perspektívaproblémák javításához. Húzd a képet a belsejéből, az egérrel. A kép belseje rugalmasan meghúzódik, míg a szélek rögzítve maradnak. - - TOPIC: GÖRBE TORZÍTÁS Ez a funkció hasznos a perspektívaproblémák javításához (lásd még {KIEGYENESÍTÉS}). Húzd a képet bármely pozícióból, az egérrel. A teljes kép húzódik vagy tolódik az egér irányába, de az egér közeli területei jobban mozdulnak el, mint a távolabbi területek. Kiegyenesíthetsz görbe vonalakat, vagy szándékosan meggörbítheted a képet. A 'warp span' vezérlő meghatározza a torzítás sugarát az egér körül. Az 1.0 azt jelenti, hogy a teljes kép torzul, a kisebb értékek pedig az egér körüli kisebb területekre korlátozzák a torzítást. - - TOPIC: AFFIN TORZÍTÁS Ez a funkció használható egy kép érdekes módokon történő torzítására. Húzd a képet egy sarokból vagy szélből, az egérrel. A változások tisztán lineárisak, így az egyenes vonalak egyenesek maradnak. Ezt az átalakítást „affin”-nak nevezik. A részletek internetes kereséssel találhatók. - - TOPIC: SUGÁRIRÁNYÚ TORZÍTÁS +image: warp_radial.png - Adj hozzá vagy távolíts el hordó- vagy párnatorzítást. A hordótorzítás gyakran látható olyan RAW képeken, amelyeket még nem dolgoztak fel a torzítás eltávolítására. Kattints bal gombbal egy középpont kiválasztásához, ahol a változtatások középre kerülnek - normál esetben a kép közepe. Ez az alapértelmezett. Mozgasd a 'stretch' csúszkát a kép meghajlításához. - - TOPIC: KÖZELI KÉP KITORZÍTÁSA +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - A közeli arcfotók gyakran torzítottak, mivel a fényképezőgéphez közelebbi területek nagyobbak a fotón, mint a távolabbi területek. Ez a funkció használható a torzítás visszafordítására. Használd a {TERÜLET KIJELÖLÉSE} funkciót az arc kiválasztásához először (nem kell pontosnak lennie). Kattints a képre a torzítás középpontja közelében (fenti példa: jobb arc). Mozgasd a csúszkát az optimalizáláshoz. - - TOPIC: HULLÁMOK KÉSZÍTÉSE +image: make-waves2.jpg +image: make-waves1.png - Ez a funkció egy hullámmintává torzítja a képet, mintha turbulens vízen keresztül néznéd. A párbeszédablak lehetővé teszi az átlagos vízszintes és függőleges hullámhossz, amplitúdó és variancia módosítását. A „perspective” bemenet lehetővé teszi, hogy a hullámhosszak fokozatosan megnyúljanak fentről lefelé. - - TOPIC: CSAVARÁS +image: twist1.png +image: twist2.png - Ez a funkció megcsavarja a képet egy egérkattintással vagy húzással kiválasztott pont körül. Kattints a kívánt pozícióra, és mozgasd a Twist csúszkát a kívánt mértékben. Az egeret is húzhatod a kép körül a csavarás középpontjának megváltoztatásához. A Center csúszka kicsavarja a középső területet a többihez képest. Az Angle csúszka elforgatja a képet. - - TOPIC: GÖMB +image: sphere2.jpg +image: sphere.png - Készíts egy gömbszerű vetületet egy képből. Húzd az egeret a képen a vetület középpontjának megváltoztatásához (alapértelmezetten a középpont). A flatten vezérlő fokozatosan módosítja a vetületet egy gömbtől (jobb) egy lapos képig (bal). A magnify csúszka az eredményül kapott képet akár 2x-esre is nagyíthatja. - - TOPIC: KIFORDÍTÁS +image: inside-out2.jpg +image: inside-out1.png - Ez a funkció megfordítja az egyes pixelek közép-szél távolságát. Kattinthatsz vagy húzhatod az egeret a középpont módosításához. - - TOPIC: TINY PLANET +image: tiny-planet.jpg - Csavard egy kép köré egy körré. Ha a kép egy 360 fokos panoráma, nem lesz látható varrat. • Center Hole: a kép egy központi lyuk köré van csavarva. • Cut Top: eltávolít egy felső margót a bemeneti képből. • Cut Bottom: eltávolít egy alsó margót a bemeneti képből. • Reverse R: függőlegesen tükrözi a bemeneti képet. • Reverse Theta: vízszintesen tükrözi a bemeneti képet. • Rotate: elforgatja a kimeneti képet a középpont körül. - - TOPIC: ESCHER SPIRÁL +image: escher-spiral.png +image: escher-spiralA.png - Alakíts át egy képet végtelen befelé tartó spirállá, mint M.C.Escher híres órája. A Width meghatározza a legkülső réteg kezdő szélességét. A Rim meghatározza a rétegeket elválasztó határ kezdő szélességét, a Color pedig annak színét. Az alapértelmezett középpont a kép közepe. Kattints a képre egy új középpont beállításához. - - TOPIC: FOTÓ LAPÍTÁSA +image: flatten-photo1.png +image: flatten-photo2.jpg - ^Könyvoldal vagy más görbült felület Lapítsd ki egy görbült felületen lévő kép fotóját, pl. egy oszlop körül, vagy egy nyitott, vastag könyv egy oldalát, ahol az oldalak befelé görbülnek a középső kötésnél. A felület felső és alsó szélének görbülete információt ad a görbület mértékéről és a lapos megjelenéshez szükséges nyújtás mértékéről. A fenti példa egy vastag könyv. Más lekerekített felületek is javíthatók, pl. egy plakát egy kerek oszlopon. - Válaszd az upper trace lehetőséget a görbült oldal felső élének nyomon követéséhez. Kattints az egérrel az él mentén, minden megkattintott pontnál egy jelölőpontot létrehozva. Miután 4 pont elérhető, egy görbe vonal kerül rajzolásra a pontokon keresztül. Adj hozzá további pontokat, és húzd a pontokat szükség szerint, hogy a vonal szorosan illeszkedjen a kép görbületéhez. Válaszd a lower trace lehetőséget, és kövesd nyomon az alsó élet ugyanígy. Amikor mindkettővel végeztél, nyomd meg a [flatten] gombot az oldal kilapításához. Az éleknek most egyenesnek (vagy elég egyenesnek) kell lenniük. Használd a [stretch] csúszkát a kép oldalainak szükség szerinti megnyújtásához, hogy kompenzáld a görbület okozta oldalirányú összenyomódást. Használd a Widen vezérlőt a kép szükség szerinti szélesítéséhez, hogy visszaállítsd a helyes szélesség/magasság arányt. Az [undo] gomb visszaállítja a módosítatlan képet, megtartva a jelölőpontokat, amelyek ezután módosíthatók egy felülvizsgált próbálkozáshoz. - +image: flatten-photo3.jpg - ^Görbült horizont Egy széles panorámának, vagy egy nagylátószögű objektívvel készült fotónak lehet olyan horizontja, amely nem egyenes vagy vízszintes. A kép kiegyenesíthető (vagy más módon mozgatható) egy görbe húzásával a horizonton vagy más olyan területeken keresztül, amelyeket egy egyenes vonal mentén kell igazítani. Válaszd az upper vagy lower trace lehetőséget, attól függően, hogy a horizont (vagy más képrész) inkább a kép közepe felett vagy alatt helyezkedik-e el. A kép torzul, hogy ez a görbe egyenessé váljon. Egy görbe elegendő. A másik görbe automatikusan hozzáadásra kerül a kép ellentétes széléhez (felül vagy alul). Ha az eredmény nem kielégítő, használd az [undo] gombot, állítsd be a jelölőket bármelyik görbén, és próbáld újra. A képet el is mentheted, és a funkciót másodszor is alkalmazhatod, a mentett képet kiindulópontként használva. - - TOPIC: EGYESÍTÉS MENÜ Ezek olyan funkciók, amelyek több képfájlt egyesítenek. Átfedő képek esetén az egyes képek megfelelő elemei egybeesésig kerülnek igazításra, pixelpontos precizitással. Az igazítási idő jellemzően 10-30 másodperc képenként. Ha azt látod, hogy ez az igazítási folyamat rosszul megy, az Escape billentyűvel megszakíthatod a folyamatot. - - TOPIC: HDR ^High Dynamic Range +image: HDR.jpg +image: HDR-adjust.png - Egyesíts (fedj át) több, ugyanarról a témáról készült, különböző expozíciós szintű képet. Az egyesített kép javított láthatóságú részleteket mutathat mind a sötétebb, mind a világosabb területeken, lényegében a világosabb képek pixeleit használva a sötétebb területekhez, és a sötétebb képekéit a világosabb területekhez. Ha a fényképezőgépet felvételek között kézzel állítod be, ügyelj arra, hogy vízszintes maradjon, és ugyanarra a távoli pontra célozz. A bemeneti képek némi elcsúszása megengedett. Ha emberek vagy tárgyak mozognak a felvételek között, a szellemkép (ghosting) nem kerülhető el. - Válaszd ki a HDR menüfunkciót, és válassz ki legfeljebb 9 képet ({KÉPFÁJLOK KIJELÖLÉSE}), amelyeknek mind közel azonos pixelméretűnek kell lenniük. A képek automatikusan igazításra és egyesítésre kerülnek. Ha kész, megjelenik az egyesített kép, valamint egy párbeszédablak a beállításokhoz. A bemeneti képek hozzájárulása szerkeszthető görbék sorozataként jelenik meg. A vízszintes lépték a pixel fényerejét jelenti, a sötéttől a világosig. Minden görbe egy olyan képet jelöl, amely hozzájárul a kimeneti pixelekhez. Egy adott fényerőszinten a kép hozzájárulása arányos a görbéjének magasságával azon a szinten. A legvilágosabb kép kezdeti görbéje bal oldalon magas lesz, jobb oldalon alacsony, ami nagy hozzájárulást jelent a sötét pixelekhez, és kicsit a világos pixelekhez. A legsötétebb kép bal oldalon alacsony lesz, jobb oldalon magas, a közbenső képek pedig a kettő között. A görbék az egérrel történő húzással szerkeszthetők. A megfelelő képhozzájárulások ennek megfelelően változnak, és az eredményeket valós időben láthatod a kimeneti képen. A fenti kép két bemeneti képet és azok kimeneti képét mutatja. A példa párbeszédablak három, három bemeneti kép optimalizálásához beállított görbét mutat. - - TOPIC: HDF ^High Depth of Field Egyesíts (fedj át) több, ugyanarról a témáról készült, közelitől távolira váltó fókuszbeállítású fotót. A téma különböző részei élesek az egyes képeken. Egyesítsd a képeket úgy, hogy a téma minden része éles legyen. - A fotók készítése: Válassz egy pontot a kép középpontjához. Célozz a fényképezőgéppel egy közeli tárgyra, és nyomd le félig a kioldógombot, hogy erre a tárgyra állítsd be a fókuszt. Tartsd a gombot félig lenyomva, célozz a fényképezőgéppel a kiválasztott középpontra, és készítsd el a fotót. Most válassz egy távolabbi tárgyat, és tedd ugyanezt. Ismételd növekvő fókusztávolsággal. Remélhetőleg a téma minden része éles lesz legalább egy fotón. A fényképezőgép pozíciójának minden fotónál nagyon közel azonosnak kell lennie, ami kihívást jelenthet, ha a téma nagyon közel van. A fényképezőgép mozgása méretezési és parallax problémákat okozhat (a közeli tárgyak elmozdulnak a távoli tárgyakhoz képest). Az ilyen problémák később javíthatók a Fotocx-ben, de ez jelentős időt igényelhet. Jobb elkerülni ezeket a problémákat. - +image: HDF-paint.png - A fotók feldolgozása: Válaszd ki a HDF menüfunkciót, és válassz ki legfeljebb 9 képet ({KÉPFÁJLOK KIJELÖLÉSE}). A képek most a lehető legjobban igazításra kerülnek. A kimeneti kép az igazított bemeneti képek egyenletes keveréke. A fotók közötti kis mértékű fényképezőgép-mozgás kompenzálásra kerül, de ez korlátozott, és a parallax eltolódások egyáltalán nincsenek kompenzálva. Az igazítás befejezése után egy párbeszédablak nyílik meg. Kiválaszthatsz bármely bemeneti képet, és „festheted” az egérrel a kimeneti kép bármely területén. Ez az eredeti képkeveréket a festett terület egyetlen kiválasztott képére alakítja. A kép minden területéhez vagy objektumához válassz olyan bemeneti képet, amely éles azon a területen. Az ecset sugara nagyobbra vagy kisebbre állítható, így gyorsan festhetsz nagy területeket, és szükség esetén finom részleteket is szabályozhatsz. Ha átfedő közeli és távoli tárgyaid vannak, idő és türelem szükséges ahhoz, hogy mindegyiket élessé tedd. Az elcsúszások javíthatók a párbeszédablak warp opciójának kiválasztásával. Az alapul szolgáló képek ezután húzhatók és torzíthatók az egérrel, és az egyesített kimeneti kép ennek megfelelően változik. A torzítás az egér körüli területre korlátozódik. Amikor egy festett területet húzol, a megfelelő bemeneti kép automatikusan kiválasztásra és húzásra kerül, miközben a más képekkel festett területek rögzítve maradnak. A nem festett területek nem húzhatók. Mozogj a különböző területek között, és végezz fokozatos húzásokat, amíg mindegyik igazításra nem kerül. - Javasolt munkafolyamat: Festés módban válaszd ki sorban az egyes képeket, és fesd meg az összes olyan területet, amely élesnek tűnik az adott képen. Bármely rosszul igazított határ egyértelműen látszani fog a kép elemeinek éleinek elcsúszásaként. Ezek némelyike jelentéktelenné tehető a festéshez használt kép módosításával (ha több kép is elég éles). Torzítás módban végezz finom beállításokat szükség szerint a látható elcsúszások megszüntetéséhez. - - TOPIC: STACK/FESTÉS +image: stack-paint.png - +image: stack-paint2.jpg - Halmozz (fedj át) több, ugyanarról a témáról, különböző időpontokban készült fotót. Távolítsd el a turistákat és autókat, amelyek jönnek-mennek a felvételek között. - A fotók készítése: Célozz a fényképezőgéppel ugyanarra a távoli pontra, és készíts több fotót, miközben turisták vagy autók mozognak a téma előtt. Próbálj két vagy több fotót készíteni a téma minden olyan területéről, amelyet nem takarnak el az átmeneti objektumok. Tartsd stabilan a fényképezőgépet, és célozz ugyanarra a pontra, hogy a képek pontosan igazodjanak. - A fotók feldolgozása: Válaszd ki a Halmozás/Festés menüfunkciót, és válassz ki legfeljebb 9 képet ({KÉPFÁJLOK KIJELÖLÉSE}). A képek most a lehető legjobban igazításra kerülnek. A kimeneti kép (bal alul) az igazított bemeneti képek (felső sor) egyenletes keveréke. Az igazítás befejezése után elindul a fent látható párbeszédablak. Kiválaszthatsz bármely bemeneti képet, és „festhetsz” az egérrel a kimeneti kép bármely területén. A festett területhez az egyetlen kiválasztott kép kerül felhasználásra. A kép minden területéhez válassz olyan bemeneti képet, amely mentes az átmeneti objektumoktól. Az ecset sugara nagyobbra vagy kisebbre állítható, így gyorsan festhetsz nagy területeket, és szükség esetén finom részleteket is szabályozhatsz. - Automatikus működés: nyomd meg a [Elrejtés] gombot, hogy megnézd, az átmeneti objektumok automatikusan eltávolíthatók-e. Ez azoknál a képterületeknél fog működni, ahol több fotó is elérhető a szabad háttérről (középső alsó kép). Az összes átmeneti objektum megjelenítéséhez nyomd meg a [Megjelenítés] gombot (jobb alsó kép). Ez általában működik, de nem tökéletesen. A kismértékű képelcsúszások vagy megvilágításbeli különbségek (különösen a mozgó árnyékok) miatt előfordulhat, hogy az algoritmus háttérpixeleket választ előtérpixelek helyett. A fent leírt festési módszerrel kézzel javíthatod a hibákat. - - TOPIC: STACK/ZAJ +image: stack-noise2.jpg +image: stack-noise.png - Ez a funkció 2-9, ugyanarról a témáról készült fotót egyesít. A fotóknak nagyjából egyformáknak kell lenniük, eltekintve a kézben tartott fényképezőgép okozta kis eltolódásoktól. Ha a fotók nagyon magas ISO beállítással (gyenge fényviszonyok) készültek, a pixeleknek jelentős zajuk lesz. Sok fotó készítésével és azok átlagolásával a zaj nagyrészt kiküszöbölhető. - A fotók feldolgozása: Válaszd ki a Halmozás/Zaj funkciót, és válassz ki legfeljebb 9 képet ({KÉPFÁJLOK KIJELÖLÉSE}). Ezek automatikusan egyesítésre kerülnek és megjelennek, és egy párbeszédablak nyílik meg. A kezdeti kimeneti kép az összes kiválasztott bemeneti kép kombinációja, átlagolva. Ez azt jelenti, hogy minden kimeneti pixel RGB értékei a megfelelő bemeneti pixelek RGB értékeinek átlaga. A median gomb a kimeneti pixeleket a bemeneti pixelek mediánjára változtatja (1-3 középső RGB érték kerül átlagolásra, a képek számától függően). Ez lehet jobb vagy rosszabb is, ezért váltogass oda-vissza az összehasonlításhoz. Az omit low pixel és omit high pixel jelölőnégyzetek hatására a legalacsonyabb és legmagasabb RGB bemeneti értékek elvetésre kerülnek átlagolás előtt. Ez eltávolíthatja a zajcsúcsokat a keverékből. Ennek nincs hatása, ha a median módszer van kiválasztva. - - TOPIC: STACK/RÉTEGEK +image: stack-layers.png - Ezzel a funkcióval egyesítheted egy kép különböző szerkesztett verzióit, ahol meghatározhatod, hogy a kijelölt képterületeken melyik verzió jelenjen meg. Bármely, azonos pixelmérettel rendelkező kép egyesíthető. - Válassz ki legfeljebb 9, azonos méretű képet. A kezdeti kimeneti kép az összes bemeneti kép egyenlő keveréke. Az Image Ratios az összeolvasztott képek relatív súlyai. Ezek módosíthatók az egyes képek súlyának változtatásához. Példa: ha 3 kép van egyesítve 3, 5, 7 relatív súllyal, akkor az egyesített kép 3/15 rész az #1 képből, 5/15 a #2-ból, és 7/15 a #3-ból. Ha a "Paint entire image" opció van kiválasztva, a súlyok módosíthatók, és a kimeneti kép azonnal reagál. Ha a "Paint within mouse" opció van kiválasztva, akkor az egér húzható, és csak az egérkörön belüli terület kerül festésre, az éppen aktív képarányok felhasználásával. A festési sebességet a Power beállítások szabályozzák az egér közepéhez és széléhez. Használj alacsony számokat a fokozatos festéshez. - - TOPIC: PANORÁMA +image: pano-align1.jpg +image: pano-align2.jpg - Ez a funkció 2-6 képet varr össze egy nagylátószögű kép vagy panoráma készítéséhez. A képeknek 10%-ban vagy annál nagyobb mértékben át kell fedniük, hogy a program megtalálhassa, hol egyeznek meg, és össze tudja illeszteni őket. Kezdd 2-6 képfájl kiválasztásával ({KÉPFÁJLOK KIJELÖLÉSE}). Hasznos a képeket balról jobbra sorrendben kiválasztani, hogy megkönnyítsd a kezdeti durva igazítást. A képek kezdetben összekapcsolásra és egy kis átlátszó átfedéssel megjelenítésre kerülnek. Egy előzetes igazítási párbeszédablak (fent) arra kér, hogy húzd a képeket durva igazításba. Húzd a képeket a helyes balról jobbra sorrendbe. A húzandó kép átfedheti más képeket. Hogy egyértelmű legyen, melyik képet húzod, a kép közepe közelében húzd. Miután a képek helyes sorrendben vannak, igazítsd az egyes képeket a bal szomszédjukhoz. A legjobb balról jobbra haladni. Mozgasd a képet vízszintesen és függőlegesen durva igazításba a bal oldali szomszédjával, majd forgasd el a képet, ha szükséges, az alsó él balra vagy jobbra húzásával - a kép a bal oldali képpel való átfedésének középpontja körül forog. A leggyorsabb módszer az, hogy először az átfedés középső régióját igazítod, majd elforgatod a jobb oldali képet, ha szükséges, hogy a felső és alsó átfedési régiók igazodjanak. Rendkívüli pontosság NEM szükséges. A képeknek megfelelően görbültnek kell lenniük, és jól kell illeszkedniük egymáshoz. Ha nem így van, akkor a 'lens mm' (fókusztávolság, 35mm-es ekvivalens) beállítása szükséges. A kép görbülete változik, ahogy a lens mm módosul. A kezdeti érték az EXIF metadata-ból származik, ha elérhető, és ez általában elég jó. Ha a képeknek nincs görbületük (pl. beszkennelt képek), használd a 'no curve' jelölőnégyzetet, hogy a 'lens mm'-et gyakorlatilag végtelenre állítsd. - Ha bármelyik kép le lett vágva, az EXIF fókusztávolságtól függő matematika nem fog működni. Kompenzálhatod ezt a fókusztávolság növelésével a 'lens_mm'-ben. - A 'manual align' jelölőnégyzet a kézi előzetes igazítást használja végső igazításként. Ez olyan képekhez való, amelyeknek nincsenek egyértelmű, a képek igazításához szükséges jellemzőik. Ez az opció azt is lehetővé teszi, hogy a képeknek nulla átfedésük legyen. - Nyomd meg a [proceed] gombot, amikor az előzetes igazítás befejeződött, és a program elvégzi a finom igazítást, és összeilleszti a képeket. Belsőleg a képek eltolásra és elforgatásra kerülnek, és az egyezés mértéke kiértékelésre kerül. Ez növekvő képméretekkel történik, amíg a legjobb igazítás meg nem található. Ez percet vagy többet is igénybe vehet, a CPU sebességétől és a képmérettől függően. Jelentősen felgyorsíthatod a folyamatot, ha a bemeneti képeket 2/3-os vagy 1/2-es méretre csökkented. Tedd ezt meg akkor is, ha a folyamat memóriahiány miatt meghiúsul. - +image: pano-adjust.jpg - Amikor a finom igazítás befejeződik, megjelenik az egyesített kép. A fenti párbeszédablak a fényerő finombeállításához indul el. Előfordulhat, hogy egy határ látszik a képek között, ha azoknak nem azonos a fényereje. Válassz ki egy képet a felül lévő választógombokkal. Használd ismételten az [automatikus szín] gombot, hogy automatikusan javítsd a képek fényerő-/színegyezését. Az alapkép az éppen kiválasztott kép. Próbálj ki különböző alapképeket, hogy megnézd, melyik működik a legjobban. Ha a képek fényereje erősen eltér, válaszd ki a legnagyobb kilógót, és használd a fényerő vezérlőt, hogy a fényerőt a többihez igazítsd, majd az [automatikus szín] gombot. Az egyezésnek nem kell nagyon jónak lennie, mivel a 'Blend Width' (következő) elfedi a fennmaradó különbségeket. Használd a 'File Color' gombot a fényerőszintek visszaállításához a bemeneti képfájlokból. - A 'Blend Width' vezérlő szabályozza a képek összeolvasztásának módját: a kép átfedéseinél a fényerő ennyi pixelen keresztül változik, hogy elfedje azokat az egyensúlyhiányokat, amelyek nem teljesen javíthatók. Az alapértelmezett 1 pixel, ami minden fényerőkülönbséget nyilvánvalóvá tesz. - Ha a képek nem tökéletesen igazodnak, javíthatod az igazítást azzal, hogy az egérrel tolod a képeket igazításba. Válaszd a 'Mouse Warp'-ot, és válassz ki egy képet a választógombokkal. Ezután húzd az egeret a kép azon éle mentén, ahol igazodnia kell a szomszédjához, ezzel mozgatva a képet az igazításba. A kép helyileg mozog az egér körül, míg a távolabbi részek rögzítve maradnak. A parallax-eltolódással rendelkező képek kompromisszumot igényelnek, mivel lehetetlen egyszerre igazítani az előteret és a hátteret. - A flatten image vezérlő használható a kép „kiegyenesítésére”, amely kiegyenesíti a görbe vonalakat (pl. görbült épületeket). A nulla érték nincs hatással, az 1,0 érték pedig teljesen kilapítja a képet. - Amikor kész, használd a {KIEGYENESÍTÉS}, {KÉP TORZÍTÁSA}, {VÁGÁS} stb. funkciókat a végső beállításokhoz. - ^Beszkennelt képek A beszkennelt képek egyesíthetők, ha elegendő az átfedés. Jelöld be a 'no curve'-t, mivel nincs görbület. - ^Automatikus torzítás A képek az igazítás során enyhén különböző irányokba torzulnak, hogy megtalálják a legjobb egyezést. Ez a fényképezőgép horizontjának eltolódásait vagy forgását kompenzálja, amelyek olyan képtorzulásokat okoznak, amelyek csökkentik az illeszkedés minőségét. Ha két kép átfedési területe tartalmaz egy nagy tárgyat, amely elmozdult a két fotó között, az igazítási folyamat megőrülhet a képek egyeztetésekor, nagyon rossz igazítást eredményezve. A 'no auto warp' kiválasztásával elérheted, hogy az igazítás sikeres legyen, vagy kisebb hibát kapj. Egy másik lehetőség a manual align kiválasztása. - ^Panorámák egyesítése Egy menetben akár 6 képből is készíthetsz panorámát. Olyan panorámákat is egyesíthetsz, amelyek az oldalaikon illeszkednek egymáshoz, pl. egyesíts egy 4-képes panorámát egy másik 4-képes panorámával, hogy egy 8-képes panorámát kapj. Panorámák egyesítésekor meg kell állítanod a normál képgörbítést, mivel a panorámaképek már görbültek (feltéve, hogy nem használtad a 'flatten' opciót a végső panoráma párbeszédablakban). Állítsd meg a képgörbítést a 'no curve' jelölőnégyzet bejelölésével az előzetes igazítási párbeszédablakban. - ^Panoráma korlátok A közeli tárgyakat tartalmazó panorámák trükkösek lehetnek: a fotók készítésekor ügyelj arra, hogy a fényképezőgépet az objektíven átmenő tengely körül forgasd, minimális oldalirányú mozgással, különben a képek rosszul igazodhatnak, mivel az előtér tárgyai eltolódnak a háttérhez képest (parallax). Ez nem probléma, ha a téma 50+ méterre van, mivel egy kis oldalirányú mozgásnak kevés hatása van a képre. Tartsd vízszintesen a fényképezőgépet, hogy elkerüld a nagy függőleges eltolódást (horizontváltás), amely olyan képtorzulásokat okozhat, amelyek nem javíthatók teljesen. Ugyanezen okból kerüld a fényképezőgép elforgatását. - ^Függőleges panoráma Ez a bemeneti képek 90°-os elforgatásával végezhető el. A Panorámában válaszd ki a képeket fentről lefelé sorrendben, hogy a felső kép legyen bal oldalon, az alsó pedig jobb oldalon. Készítsd el a panorámát normálisan. Forgasd el a kimeneti képet úgy, hogy a bal oldal legyen a tetején. - - TOPIC: CIM FÁJLOK MEGJELENÍTÉSE Jelenítsd meg egy felugró ablakban az aktuális vagy legutóbbi egyesített kép bemeneti fájljait. Csak az aktuális vagy legutóbbi halmaz kerül megjegyzésre. - - TOPIC: MASHUP +image: mashup.jpg - Rendezz el több képet és szöveget egy elrendezésben. Képek adhatók hozzá, méretezhetők át, forgathatók el, és mozgathatók az egérrel történő húzással. A képek teljesen vagy részben átlátszóvá tehetők a kijelölt területeken. Szöveg adható hozzá, mozgatható, átméretezhető és elforgatható. A szövegjellemzők megadhatók: betűtípus, méret, szín, körvonal, árnyék, átlátszóság. Vonalak és nyilak adhatók hozzá. Az itt látható példa néhány lehetőséget mutat. - +image: mashup1.png - Az első Mashup párbeszédablakban válassz egy háttér- vagy elrendezésképet, ahová más képek kerülnek elhelyezésre. Válassz egy meglévő képet, vagy hozz létre egy új, egyszínű képet megadott mérettel és színnel. Egy korábban mentett mashup projektet is megnyithatsz, hogy folytasd a szerkesztést. - +image: mashup2.png - A 2. Mashup párbeszédablak egy választás: képek szerkesztése, szöveg szerkesztése, vonalak és nyilak szerkesztése, átméretezés nagyobb méretre, a kész egyesített kép mentése (Done) vagy a kép elvetése (Cancel). Az első három választás a megfelelő szerkesztéseket végző párbeszédablakokhoz vezet. Ezek mindegyike visszatér ehhez a párbeszédablakhoz, amikor kész, így tetszőleges sorrendben adhatsz hozzá vagy módosíthatsz képeket, szöveget és vonalakat/nyilakat. Az átméretezés alább van kifejtve. - +image: mashup3.jpg - Használd ezt a párbeszédablakot képek kiválasztásához és elhelyezéséhez az elrendezésben, valamint megjelenésük módosításához: méret, forgatás, pozíció, átlátszóság. Egy kép részben vagy egészben átlátszó lehet, egészében vagy megadott területeken belül. Ez azt jelenti, hogy a háttérkép vagy az átfedő kép átlátszhat az átlátszó területeken keresztül. Az Add Image gomb egy galéria fájlkiválasztó párbeszédablakhoz vezet ({KÉPFÁJLOK KIJELÖLÉSE}). A kiválasztott képek az elrendezésen kerülnek elhelyezésre. A képek hozzáadása után kattints bármely képre, hogy kiválaszd módosításra. Húzd a képet a közepéről, hogy pozicionáld az elrendezésben. Húzd a jobb alsó sarkot a kép átméretezéséhez. Használd a párbeszédablak vezérlőit a kép beállításához. A párbeszédablak vezérlői a legutóbb hozzáadott, megkattintott vagy húzott képen működnek. A 'Prev' és 'Next' gombok egyenként végigmennek a képeken, felvillantva a kiválasztott képet. Ez akkor használható, ha az átfedő képek megnehezítik a kívánt kép kattintással történő kiválasztását. A Scale átméretezi a képet. Az Angle elforgatja a képet. A Stacking Order gombok egy másik képhez viszonyítva emelik vagy süllyesztik a képet - ez határozza meg, hogy melyik átfedő kép legyen felül. A Base Transparency egy egész kép részleges átlátszóvá tételére szolgál. A [festés] gomb egy kép bármely részének részleges vagy teljes átlátszóvá tételére szolgál, az alább látható Paint párbeszédablak használatával. A [torzítás] gomb egy kép meghajlítására vagy torzítására szolgál, az alább látható Warp párbeszédablak használatával. A 'black margins' jelölőnégyzet használható a más szerkesztési funkciók, pl. a warp, által hagyott fekete szegélyek eltávolítására. Ezek átlátszóvá válnak. Az 'Image is fixed' gomb megakadályozza, hogy a kép az egérrel vagy a billentyűzettel mozgatható legyen. Ez akkor hasznos, amikor a képek finomhangolása folyik, és el kell kerülni a véletlen mozgatást. A Margins vezérlők használhatók a kép széleinek átlátszóvá tételéhez. A Hard margins levágja a kép széleit. A Blend margins részben átlátszóvá teszi a széleket, hogy összeolvassza őket a háttérrel vagy más átfedő képekkel. - +image: mashup4.png - „Fess” több vagy kevesebb átlátszóságot a kép kijelölt területeihez. Kattints egy képre a kiválasztásához. Az egérmutató egy kör, amely a hatás tartományát mutatja. Használd a radius-t a méret beállításához. Húzd az egeret bal gombbal a képen, hogy átlátszóvá tedd a kör által lefedett területeken. Húzd jobb gombbal, hogy átlátszatlanná tedd. Ha a Gradual be van jelölve, az átlátszóság-változások lassan történnek, ahogy húzod az egeret. Adj meg egy power értéket az egér közepéhez és széléhez a változási sebesség szabályozásához. - +image: mashup5.png - A warp párbeszédablak egy kép torzítására szolgál. Kattints egy képre a kiválasztásához. Húzd a képet az egérrel - a kép helyileg torzul vagy nyúlik az egér irányában (mint egy gumilap). A torzítás területét nagyjából a warp span adja meg, amely a képméret egy törtrésze. Minden húzás egy lépés, amely hozzáadódik a korábbi lépésekhez. A legutóbbi lépések visszavonhatók az [undo last] gombbal, a nem hajlított kép pedig visszaállítható az [undo all] gombbal. - +image: mashup6.png - Az Edit Text párbeszédablak szöveg elrendezésen történő elhelyezésére szolgál. Írj be némi szöveget, és nyomd meg az [Alkalmaz] gombot. A rendszer megkéri, hogy kattints az elrendezésen oda, ahová a szöveg kerül. Húzd pozícióba, majd használd a párbeszédablak vezérlőit a betűtípus, méret, szín, szög, háttérszín, körvonalméret és -szín, árnyékméret és -szín, valamint ezek mindegyikének átlátszósága beállításához. Bármikor húzhatod a szöveget új pozícióba. Kattints bármely meglévő szövegre, hogy megjelenítsd a tulajdonságait a párbeszédablakban és módosítsd őket. Kattints egy szövegre, és nyomd meg a Delete billentyűt az eltávolításához. Ha végeztél a szerkesztéssel, nyomd meg az [OK] gombot, hogy visszatérj a 2. Mashup párbeszédablakhoz. - +image: mashup7.png - Az Edit Line/Arrow párbeszédablak vonalak vagy nyilak elrendezésen történő elhelyezésére szolgál. Nagyon hasonlóan működik, mint a szöveg hozzáadása. Add meg a hosszt és a szélességet, és nyomd meg az [Hozzáadás] gombot. A rendszer megkéri, hogy kattints az elrendezésen oda, ahová a vonal kerül. Egy vonal kerül az elrendezésre, vagy egy nyíl, ha az Arrow head opciók egyike be van jelölve. Húzd a vonalat/nyilat a kívánt pozícióba. Állítsd be a hosszt, szélességet, szöget és jellemzőket (háttér, körvonal, árnyék) a párbeszédablakkal. A vonal/nyíl bármelyik végét is húzhatod, hogy beállítsd annak a végnek a pozícióját, míg a másik vég rögzítve marad. - Az egérrel mozgathatod és átméretezheted az elrendezésben lévő objektumokat: • kattints az objektumra a kiválasztásához - felvillan a kiválasztás megerősítéseként. • húzd a hozzávetőleges közepéről az objektum pozicionálásához. • húzd a jobb alsó sarkot az objektum átméretezéséhez. • egy vonal/nyíl esetén húzd bármelyik végét, hogy csak azt a véget mozgasd. - A billentyűzet nyílbillentyűi is használhatók az éppen kiválasztott objektum 1 pixeles lépésekben történő mozgatásához. - Hozzáadhatsz a {TERÜLET KIJELÖLÉSE} funkcióval mentett képeket. Az Edit Images párbeszédablakban nyomd meg az [Hozzáadás] gombot a fájlkiválasztó párbeszédablak elindításához. Használd a [Felül] gombot a galéria ablakban, válaszd a 'saved_areas'-t. Nyisd meg bármelyik ott található .png képet. Az eredeti terület körvonala kerül felhasználásra, és a területösszeolvasztás ezekből az élekből dolgozik. - ^Mashup projektfájlok Elmenthetsz egy projektet, és később megnyithatod a szerkesztés folytatásához. A Mashup projekt ezen képek és a projektfájlban mentett néhány adat felhasználásával épül újra: kép- és szövegpozíciók, méretek, átlátszóság stb. - ^Mashup átméretezés Egy nagyon nagy elrendezéssel (20 megapixel felett) való munka elég lassú lehet. Egy nagy átfedő kép húzása lassú és rángatózó lehet. Sokkal gyorsabban dolgozhatsz, ha kisebb elrendezéssel építed fel a projektet, majd naggyá teszed, miután végeztél. Nincs felbontásvesztés a végső képen, mivel az átfedő képek és a szöveg a bemenetekből újragenerálásra kerülnek. A Rescale gomb lehetővé teszi, hogy 2x-re, 3x-ra vagy 4x-re nagyítsd a projektet. Van egy reset opció is az eredeti kisebb projektméret visszaállításához. Ezzel a módszerrel egy 10 megapixeles elrendezéssel dolgozhatsz, majd akár 160 megapixelre is átméretezheted, ha kész vagy. A nagyobb elrendezéssel utána is dolgozhatsz közvetlenül, de az lassabb lesz. - - TOPIC: KÉPTÖMB +image: image-array.jpg - Válassz ki sok képet, és kapcsold össze őket egy kompakt tömbformátumban, egy színes kereten belül. - Az első párbeszédablak bal felül látható. A Background Color a keretvonal és a tartalmazott képek közötti terek színe. Az Array Width a kimeneti tömb teljes szélessége, a Margin pedig az összes képet körülvevő külső margó szélessége. A tömb magasságát a kiválasztott képfájlok száma és a keretbe illesztésükhöz szükséges hely határozza meg. Az Image Columns megadja a képoszlopok számát (a fenti példában 6). A sorok száma a kiválasztott képfájlok számától függ. A Separation értékek beállítják a tartalmazott képek közötti vízszintes és függőleges teret. - Válaszd ki a képfájlokat ({KÉPFÁJLOK KIJELÖLÉSE}), majd nyomd meg a [Folytatás] gombot, ha kész vagy. Az eredményül kapott kép néhány másodperc alatt elkészül (vagy percek alatt, több száz kép esetén). Ez a kép jellemzően nagyon egyenetlen alsó margóval fog rendelkezni, ahogy a fenti jobb felső kép is mutatja. A tömbben lévő képek sorrendjét a kiválasztási sorrend határozza meg. Először a felső sor töltődik ki, balról jobbra, majd a 2. sor stb. - Az Optimize párbeszédablak automatikusan elindul. Átrendezheti a képeket, hogy az alsó margó egyenletesebb legyen. Nyomd meg a [Indítás] gombot, és várj, amíg a kép optimalizálódik. Figyelheted a folyamatot. A funkció kilép, ha talál egy optimumot, amely 2 pixelen belül egyenletessé teszi az alsó margót. Ha ezt a célt nem éri el, akár a végtelenségig is kereshet. Nyomd meg a [Leállítás] gombot, hogy az optimalizáló funkciót az addig talált legjobb megoldással léptesd ki. Ha az optimalizálás sikeres, egyenletes oszlopokat kapsz, ahogy a jobb alsó kép mutatja. Ha az alsó él az optimalizálás után is egyenetlen, a rendszer megkérdezi, szeretnél-e margókat adni néhány képhez, hogy az alsó él egyenletessé váljon. Ez egyenletes alsó élt eredményez, de a függőleges térközök már nem lesznek egyenlőek. - TIPP: Az optimalizálás akkor működik a legjobban, ha oszloponként legalább négy kép van (jobb, ha több). Ez elég rugalmasságot ad az optimalizálónak, hogy egyenletes alsó éllel rendelkező megoldást találjon. - Megjelenik az utolsó párbeszédablak, a bal alsó részen látható. Most fájlnevet kell rendelned a tömbödhöz. Egy fájlmentő párbeszédablak indul, és bárhova elmentheted az új tömbfájlt. Ha a copy metadata opció van kiválasztva, a metadata a kiválasztott bemeneti fájlból a kimeneti fájlba kerül másolásra. Ez akkor hasznos, ha a képek szerkesztett verziók, és szeretnéd, hogy a tömb tartalmazza a legutóbbi (vagy bármely) verzió szerkesztési előzményeit. - - TOPIC: KÖTEGELT MENÜ Ezek olyan funkciók, amelyek több kiválasztott képfájlt dolgoznak fel, néhányat vagy több ezret. Ezek a funkciók a folyamat közben megszakíthatók az Escape billentyűvel, de ez néhány fájlt feldolgozva, néhányat pedig feldolgozatlanul hagy. Egy felugró jelentés mutatja a fájlneveket, ahogy feldolgozásra kerülnek. - - TOPIC: KÖTEGELT ÁTALAKÍTÁS +image: batch-convert.jpg - Ez a funkció több képfájl átnevezésére, konvertálására, átméretezésére és áthelyezésére szolgál. A RAW fájlok is konvertálhatók képfájlokká. A funkció több párhuzamos szálon fut a maximális sebesség érdekében. - ^Párbeszédablak bemenetek • Select Files - a konvertálandó fájlok ({KÉPFÁJLOK KIJELÖLÉSE}). • Replace Text - szöveg cseréje a fájlnevekben (lásd alább). • New Name - opcionális új név, beszúrt szöveg (lásd alább). • Sequence Numbers - alapszám és növekmény a kimeneti fájlnevekhez. • New Location - opcionális új mappahely a kimeneti fájlokhoz. • New Type - fájltípus a kimeneti fájlokhoz, vagy „no change”. • Color Depth - add meg 8 vagy 16 bitet tif vagy png kimenethez. • Max. Width, Height - opcionális korlátok a kimeneti fájlokhoz (csak akkor van használva, ha a downsize vagy upsize be van jelölve) • Rescale - opcionális átméretezési tényező a kimeneti fájlokhoz • Delete Originals - A bemeneti fájlok törlése sikeres konvertálás után. • Copy Metadata - Az összes metadata másolása a kimeneti fájlokba. • Update Albums - az albumfájlok lecserélése a konvertált kimeneti fájlokra - ^Replace Text Ha itt szöveg van megadva, a fájlnevek átvizsgálásra kerülnek erre a szövegre, és ha megtalálható, a megadott csereszöveg kerül behelyettesítésre. A csereszöveg lehet más hosszúságú, és üres is lehet, ebben az esetben a szöveg eltávolításra kerül a fájlnévből. - ^New Name és Pluginok Az új fájlnév tartalmazhat beszúrt szöveget: egy fotódátumot (az EXIF metadata-ból), egy sorszámot, vagy az eredeti fájlnevet. Add meg, hogy mit és hova szúrj be, a következőképpen: • $oldname - Ide kerül beszúrásra az eredeti fájlnév • $sss - Ide kerül beszúrásra egy futó sorszám. Lásd alább. • $yyyy $mm $dd - A fotódátum ezekre a pozíciókra kerül beszúrásra. - Példa: San Francisco $yyyy:$mm:$dd $oldname $sss A „Golden Gate Bridge.jpg” bemeneti fájl, amelynek fotódátuma 2014. május 12., a „San Francisco 2014-05-12 Golden Gate Bridge 123.jpg” kimeneti fájlnévvé alakulna. - A „$sss” esetén add meg a mező hosszát az 's' karakterek számával, pl. a „$ss” megfelelő lesz a 99-ig terjedő sorszámokhoz. A kevesebb számjegyű sorszámok elé vezető nullák kerülnek. A megadott hosszba nem illeszkedő sorszámok annyira hosszúak lesznek, amennyire szükséges. Vedd figyelembe, hogy a galériákban a fájlnév rendezési sorrendje szigorúan ascii sorrend, így az 1, 2 ... 9, 10 számsorozat 1, 10, 2 ... 9 sorrendben rendeződik. A numerikus sorrendet megtarthatod, ha 2-es mezőhosszt adsz meg ($ss), ami a 01, 02 ... 09, 10 sorozatot eredményezi. - A „$oldname” vagy a „$sss” valamelyikének jelen kell lennie, hogy biztosítsa a kimeneti fájlnevek egyediségét. Ha a New Location hiányzik vagy változatlan, a delete originals figyelmen kívül marad. Ha egy kimeneti fájl már létezik, a bemeneti fájl nem kerül konvertálásra. - ^Max. Width and Height Ha a downsize és/vagy upsize be van jelölve, a kimeneti fájlok ezeken a határokon belül kerülnek átméretezésre, megtartva az eredeti szélesség/magasság arányt. Ha a downsize be van jelölve, az ezeknél a határoknál nagyobb fájlok lekicsinyítésre kerülnek, hogy a határokon belül maradjanak. Ha az upsize be van jelölve, az ezeknél a határoknál kisebb fájlok felnagyításra kerülnek, hogy a szélesség vagy a magasság a megfelelő határnál legyen. Ez nem használható a Rescale opcióval együtt. - ^Rescale Ha az egyik gomb be van jelölve, a kimeneti fájlok a kiválasztott tényezővel kerülnek átméretezésre. Ez nem használható a Max. Width and Height opcióval együtt. - ^Delete Originals Ha be van jelölve, a bemeneti fájlok törlődnek, de csak azután, hogy a kimeneti fájl sikeresen létrejött. - ^Copy Metadata Az összes metadata átmásolásra kerül a bemeneti fájlból a kimeneti fájlba. Hagyd ki ezt az opciót a metadata eltávolításához. - ^Update Albums Ha be van jelölve, az összes olyan album, amely bármelyik bemeneti fájlt tartalmazza, frissítésre kerül a konvertált kimeneti fájlokra. - ^A fájlsorrend megőrzése Ha megadsz egy vezető sorszámot ($sss), a bemeneti fájlok kiválasztási sorrendje megmarad a kimeneti helyen. Így kiválaszthatod a képfájlokat kívánt sorrendben, vagy kiválaszthatsz egy rendezett képekkel rendelkező albumból, és megőrizheted ezt a sorrendet a kimenetben. - - TOPIC: KÖTEGELT MÁSOLÁS/ÁTHELYEZÉS Másold vagy helyezd át a kiválasztott képfájlt egy új helyre. Válaszd ki a bemeneti fájlokat ({KÉPFÁJLOK KIJELÖLÉSE}) bármely, a Fotocx számára ismert mappából. Ha a „Delete Originals” van kiválasztva, a bemeneti fájlok törlésre kerülnek, miután sikeresen áthelyezted őket az új mappába. Ebben az esetben az immár törölt bemeneti fájlokra hivatkozó albumok frissülnek az új fájlhelyekkel. - - TOPIC: KÖTEGELT EGYENESBE ÁLLÍTÁS Ez a funkció egyenesbe állítja az elforgatott vagy megfordított (tükrözött) képfájlokat. Az EXIF adatoktól függ, hogy tudja, egy fájl el van-e forgatva/megfordítva, és milyen irányba. Sokkal gyorsabb, mint a Kötegelt konvertálás. Egyszerűen kiválaszthatod az összes jelölt fájlt, és hagyhatod, hogy megtalálja azokat, amelyeknek javításra van szükségük. A keresési sebesség kb. 3000 képfájl percenként egy erős számítógépen. Két lehetőség van a keresendő fájlok megadására. A [Fájlok kijelölése] gomb egy galéria fájlkiválasztó párbeszédablakhoz vezet ({KÉPFÁJLOK KIJELÖLÉSE}). Ha a 'Survey all files' be van jelölve, a felső mappáid alatt lévő összes képfájl átvizsgálásra kerül. - - TOPIC: KÖTEGELT TÖRLÉS/KUKA Válaszd ki a fájlokat ({KÉPFÁJLOK KIJELÖLÉSE}). Válaszd ki a lehetőséget: törlés vagy kukába helyezés. [Folytatás]. A fájlok egy felugró jelentésben kerülnek felsorolásra, ahogy törlődnek vagy kukába kerülnek. Miután az összes fájl törlődött/kukába került, az albumok átvizsgálásra kerülnek, és a törölt fájlok eltávolításra kerülnek. - - TOPIC: KÖTEGELT RÁTÉT +image: batch-overlay.png - Egy kis átfedő kép adható hozzá egy kiválasztott pozíción a kiválasztott bemeneti képekhez. Ez használható köszönetnyilvánítás, szerzői jog stb. hozzáadására a képek tetejére. - Készítsd elő az átfedő képet a következőképpen: Használd az Üres kép funkciót egy, a szöveget tartalmazó alapkép létrehozásához. A lépték nem számít, ezért készítsd nagyobbra, mint amennyi szükséges. Használd az Átlátszóság festése funkciót a teljes alapkép átlátszóra festéséhez. Használd a {JELÖLÉS} > szöveg rajzolása funkciót, hogy a kívánt szöveget az alapképre helyezd, tetszőleges betűtípussal, színnel és egyéb jellemzőkkel. Méretezd a szöveget úgy, hogy kitöltse az alapkép nagy részét. Az alapkép (háttér) átlátszó. Távolítsd el a felesleges margókat a {VÁGÁS} funkcióval, ha szükséges. Mentsd el a végső képet. Egy kényelmes hely a /saved_areas, de bármely mappa használható. Ez a kép most már használható átfedő képként a Kötegelt átfedéshez. - Használd a ^Select host image files^ gombot az átfedő képet fogadó gazdaképfájlok kiválasztásához. Használd a ^Select overlay file^ gombot az átfedő képfájl kiválasztásához. - A két ^Overlay position^ bemenet meghatározza, hogy az átfedő kép hova kerül a gazdaképen, a felsőtől az alsóig terjedő távolság 1-99%-ánál, és a baltól a jobbig terjedő távolság 1-99%-ánál. A 0/0 a bal felső sarkot jelenti, a 99/99 a jobb alsó sarkot. Az átfedő kép úgy kerül elhelyezésre, hogy ne nyúljon túl a gazdakép szélein. - Add meg az ^Overlay width^-et a gazdakép szélességének százalékában. A magasság a szélesség/magasság arány megőrzésére lesz beállítva. Ha a ^Make width constant for window size^ be van jelölve, az átfedő kép vizuális mérete állandó lesz az alább megadott ablakmérethez. Enélkül egy „magas” kép, amely nagy bal és jobb margókkal jelenik meg, vizuálisan kisebb átfedő képpel rendelkezne. A kezdeti ablakméret az aktuális ablak. Bármilyen méretet megadhatsz. Nyomd meg a ^refresh^ gombot az aktuális ablak beállításához, ha ez megváltozott. - Ha a ^Replace host files^ van kiválasztva, a bemeneti gazdafájlok lecserélődnek az átfedett kimeneti gazdafájlokra. Ha a ^Make new versions^ van kiválasztva, a bemeneti gazdafájlok új verziói jönnek létre. - - TOPIC: KÖTEGELT KULCSSZAVAK +image: batch-keywords.jpg - Adj hozzá, távolíts el, vagy módosíts keywords-t sok képfájlhoz egyszerre. - Használd a [select files] gombot a képfájlok kiválasztásához ({KÉPFÁJLOK KIJELÖLÉSE}). - A párbeszédablak két keyword listát mutat: azokat, amelyeket hozzá kell adni a kiválasztott fájlokhoz, és azokat, amelyeket el kell távolítani. Az elérhető keywords a lenti Defined Keywords ablakban jelennek meg. Ezek egyike hozzáadható az éppen kiválasztott keyword listához (add vagy remove) a rákattintással. Egy keyword bármelyik keyword listából törölhető a rákattintással. A keywords cseréjéhez add meg az új keywords-t az add keywords listában, és a régi keywords-t a remove keywords listában. - Ha a definiált keywords listája hosszú, könnyebb lehet beírni a kívánt keyword-öt az Enter New Keyword mezőbe. Az eddig beírtaknak megfelelő meglévő keywords megjelennek a Matching Keywords mezőben, és rámutathatsz és rákattinthatsz az egyikre, hogy hozzáadd a keyword-öt a képhez. Ha a bevitt keyword új (nem jelenik meg egyező keyword), nyomd meg az [Hozzáadás] gombot, amikor a keyword teljes. Ez hozzáadásra kerül a kiválasztott keyword listához és a definiált keywords listájához, a „nocatg” kategória alatt. - Ha keyword kategóriákat használsz, kiválaszthatsz egy kategóriát, és csak azok a keywords fognak megjelenni a definiált keywords listájában. Ha a keywords listád hatalmas, ez kezelhető méretűre csökkentheti a listát a rámutatáshoz és kattintáshoz. - Ahhoz, hogy megkapj egy listát azokról a képekről, amelyek adott, eltávolítani vagy lecserélni kívánt keywords-szel rendelkeznek, használd a {KÉPEK KERESÉSE} funkciót a képek megtalálásához, majd indítsd el ezt a funkciót, és használd a [select files] gombot, hogy hozzáadd az összes, éppen most megtalált képfájlt, vagy válassz ki egy tetszőleges részhalmazt. - - TOPIC: KÖTEGELT KULCSSZÓ ÁTNEVEZÉS +image: batch-rename-keywords.png - Nevezz át tetszőleges számú keyword-öt, és alkalmazd ezeket a módosításokat a teljes képgyűjteményedre. Kattints egy átnevezendő keyword-re a definiált keywords listájában, add meg az új nevet a Rename to mezőben, majd kattints a nyílgombra, hogy hozzáadd ezt a névpárt a jobb oldali listához. Ismételd meg minden átnevezendő keyword-nél. Kattints a névpárra a listában az eltávolításukhoz. Nyomd meg a [Folytatás] gombot, ha kész vagy. Ha egy keyword-öt átnevezés nélkül szeretnél törölni, használd a 'delete'-et új névként. - Egy felugró ablak megmutatja az érintett keyword neveket tartalmazó képfájlok számát. Nyomd meg az [Igen] gombot a folytatáshoz. A frissítési sebesség kb. 500/perc egy erős számítógépen. A Fotocx következő indításakor a fájlindexelő funkció frissíti az ugyanazon képekhez tartozó összes thumbnailt, mivel a fájl módosítási dátuma megváltozott. - - TOPIC: KÖTEGELT KULCSSZÓ TÖRLÉS +image: batch-purge-keywords.jpg - Tisztítsd meg (töröld) a nem kívánt keywords-t az összes képfájlból. Ez különösen hasznos a letöltött képfájlokból hozzáadott nem kívánt keywords megszüntetéséhez. Kattints a párbeszédablak bal oldalán lévő nem kívánt keywords-re, hogy hozzáadd őket a párbeszédablak jobb oldalán lévő tisztítási listához. Nyomd meg a [proceed] gombot, ha kész vagy. - - TOPIC: KÖTEGELT FOTÓ DÁTUM +image: batch-photo-date1.png +image: batch-photo-date2.png - Gyorsan javíts ki egy köteg fotót, amelyeknek nincs fotódátumuk/idejük, vagy hibás. Használd a [select files] gombot egy galéria ablak megnyitásához, ahol kiválaszthatod a feldolgozandó képfájlokat ({KÉPFÁJLOK KIJELÖLÉSE}). - Két módja van a fotódátumok/idők módosításának: • Új dátum/idő beállítása (fenti jobb oldali kép): Adj meg csak egy új évet (yyyy) - csak az év kerül lecserélésre a fájlokban. Adj meg csak egy dátumot (yyyy:mm:dd) - a dátum kicserélődik, de az idő nem. Adj meg egy teljes dátumot/időt (yyyy:mm:dd hh:mm:ss) - mindkettő kicserélődik. • Meglévő dátum/idő eltolása (bal oldali kép): Adj meg + vagy - értékeket a 6 mező bármelyikébe: évek, hónapok, napok, órák, percek, másodpercek. A dátumok/idők a megadott értékekkel kerülnek eltolásra. - Az eltolt dátum-/időértékek szükség esetén tovagyűrűznek a következő magasabb értékre: A 08:30 idő -50 perccel eltolva 07:40-et eredményez A 2016-10-20 dátum +6 hónappal és -30 nappal eltolva 2017-03-21-et eredményez (a márciusnak 31 napja van). - Ha a 'test' jelölőnégyzet ki van választva, egy jelentés készül a kiválasztott fájlok régi és új dátumairól/idejéről ellenőrzésre. A fájlokon semmilyen módosítás nem történik. Ha meg vagy elégedve azzal, hogy az eredmények helyesek, vedd ki a jelölést, és futtasd újra a fájlok frissítéséhez. - - TOPIC: KÖTEGELT METAADAT MÓDOSÍTÁS +image: batch-change-meta.png - Módosítsd a metadata-t több képfájlhoz. Hozzáadhatsz új metadata-t, módosíthatod a meglévőt, és törölheted a metadata-t. Használd a [select files] gombot egy galéria ablak megnyitásához, amelyből kiválasztod a feldolgozandó fájlokat {KÉPFÁJLOK KIJELÖLÉSE}. Add meg a hozzárendelendő metadata tag neveket és értékeket, vagy hagyd üresen az értéket a tag törléséhez. Nyomd meg az [alkalmaz] gombot. Egy megerősítő üzenetet kapsz, és ekkor folytathatod vagy megszakíthatod. Bal oldalt egy gyakran használt tagnevek listája található. Kattints ezek egyikére, hogy beszúrd az első üres tagnév mezőbe a párbeszédablakban. Ez a lista a /metadata_picklist fájlból származik, amelyet szerkeszthetsz, hogy más tageket adj a listához. A [Teljes lista] gomb információt nyújt arról, hogyan kaphatsz meg egy listát az összes elérhető tagnévről. - - TOPIC: KÖTEGELT METAADAT JELENTÉS +image: add-meta-tags.png +image: batch-report-meta.png - Jelents ki bármilyen metadata-t tetszőleges számú képhez. A kimenet egy szövegfájl, amely a rendszered alapértelmezett szövegszerkesztőjében jelenik meg. A szövegszerkesztő keresési funkcióival megtalálhatod a kívánt metadata-nak megfelelő képeket, vagy felhasználhatod a szövegfájlt más programok bemeneteként. Használd a [select files] gombot egy galéria ablak megnyitásához a feldolgozandó fájlok kiválasztásához ({KÉPFÁJLOK KIJELÖLÉSE}). Az [szerkesztés] gomb megnyit egy új párbeszédablakot (jobbra), ahol kiválaszthatod a jelentendő metadata tageket. Kattints egy tagre a bal oszlopban, hogy hozzáadd a jobb oszlophoz és a jelentéshez. Kattints egy tagre a jobb oszlopban az eltávolításához. Kattints a bal oszlop utolsó tagjére, „Other tag ...”, hogy beírj bármilyen, a listában nem szereplő tagnevet, amely csak a legvalószínűbben szükséges tageket tartalmazza. - - TOPIC: KÖTEGELT GEOTAGEK +image: batch-geotags.png - Válassz ki sok képet, és adj hozzájuk azonos helyadatokat. Használd a [select files] gombot a képfájlok kiválasztásához egy galéria ablakból ({KÉPFÁJLOK KIJELÖLÉSE}). Ezután szerezd meg a helyadatokat a {FŐ METAADAT SZERKESZTÉSE} funkciónál leírtak szerint, a [Keresés] gombbal vagy egy térképjelölőre kattintva. Ezt a funkciót a location vagy latitude/longitude adatok helyesírási következetlenségeinek javítására is használhatod. Ha a location és/vagy a country üresen marad, ezek nem frissülnek. A location vagy a country törléséhez add meg a „null” nevet. Ha a latitude és a longitude üresen marad, ezek nem frissülnek. A latitude és a longitude törléséhez add meg a „0” értéket mindkettőhöz. Frissítheted csak a location/country-t, csak a latitude/longitude-ot, vagy mindkettőt. A gyakorlatban előfordulhat, hogy a fényképezőgép GPS-e latitude-ot és longitude-ot szúr be location és country nélkül, vagy nem kívánt nyelvet használ, vagy csupa nagybetűt, vagy valamilyen más, javítást igénylő értéket. - - TOPIC: FÁJLOK EXPORTÁLÁSA Másold a kiválasztott képfájlokat egy másik mappába. A tervezett felhasználás fájlok másolása másokkal való megosztáshoz, pl. fájlok feltöltése egy weboldalra. A kimeneti fájlok JPEG formátumúak. Opcionálisan lekicsinyítheted a képeket. Válaszd ki a képfájlokat a galéria thumbnailekre kattintva ({KÉPFÁJLOK KIJELÖLÉSE}). Válassz egy mappát, ahová a képfájlok másolásra kerülnek. Ha az 'export metadata' van kiválasztva, a metadata egy korlátozott halmaza is átmásolásra kerül. Ezek: photo date, keywords, copyright, title, description. - - TOPIC: ESZKÖZÖK MENÜ - - TOPIC: FÁJLOK INDEXELÉSE +image: index-files1.png - A Fotocx-nek ismernie kell az összes képfájl mappa- és fájlnevét, valamint a beágyazott metadata-t (dátumok, tagek, geotags, címek, leírások, értékelések). Ez az adat indexelésre kerül a gyors kereséshez. A Fotocx thumbnail képeket is létrehoz, hogy a galéria ablakok (thumbnail oldalak) gyorsan jelenjenek meg. A Fotocx nem módosítja és nem másolja a képfájlokat. A szükséges terület jellemzően a képfájl-tér 2%-a. - A Fájlok indexelése funkció minden Fotocx indításkor lefut. Ez a funkció létrehozza a hiányzó thumbnaileket, lecseréli az elavultakat, és frissíti a metadata indexet a képfájljaid aktuális adataival. Ez jelentős időt igényelhet, ha sok ezer új fájlod van. - A Fotocx-en belül módosított vagy áthelyezett képfájlokról automatikusan gondoskodik a rendszer. Az Indexelés funkció csak a Fotocx-en kívül létrehozott új képfájlokhoz (pl. egy új fotóköteg hozzáadásához) és a Fotocx-en kívül módosított vagy áthelyezett fájlokhoz szükséges. - Add meg a felső szintű képmappáidat (pl. /home//Pictures). Használd a [tallózás] gombot mappák megkereséséhez és hozzáadásához. Ezek a mappák és az összes bennük lévő almappa feldolgozásra kerül. Nem számít, ha más fájlok is keverednek a képekkel. Töröljünk egy bejegyzést a megfelelő 'X'-re kattintva. - Add meg azt a thumbnails mappát, ahová a thumbnail fájlok kerülnek tárolásra. Használd a megadott alapértelmezést, vagy állíts be egy saját helyet. - Ha mappa- vagy fájlneveket használtál a képeid osztályozásához, ezeket azonnal felhasználhatod a {KÉPEK KERESÉSE} funkcióban. Ha dátumokat, keywords-t, geotags-t, címeket vagy értékeléseket mentettél el a kép metadata-jában, ezek is kereshetők lesznek. Miután a képek indexelve vannak, az ezek bármelyike szerinti keresés szinte azonnali. - ^Metadata tagek A következő metadata alapértelmezetten szerepel a képindexben: • mappa- és fájlnevek • fotódátum/idő • fájl módosítási dátuma/ideje • cím és leírás (exif metadata) • értékelés (0-5 csillag) • keywords (felhasználói címkék) • geotags (ország- és helynevek, valamint latitude/longitude) • fényképezőgép: gyártó, modell, objektív • expozíció: idő, F-szám, fókusztávolság, ISO - ^Extra metadata tagek +image: index-files2.png - Legfeljebb 20 másik metadata tag-et adhatsz hozzá a képfájl-indexhez. Az ebben a listában szereplő metadata ugyanolyan gyorsan kereshető, mint a szabványos tagek. Lehet, hogy erre nincs szükséged, de ha néha nem szabványos metadata tageket kell keresned, itt hozzáadhatod őket, és a keresési sebesség szinte azonnali lesz. Nyomd meg az „extra metadata” [select] gombját a fenti párbeszédablak megkapásához. Kattints a bal oldali listában lévő tagekre, hogy hozzáadd őket a jobb oldali listához - az indexhez hozzáadandó tagekhez. Kattints egy tagre a jobb oldali listában az eltávolításához. Nyomd meg a [done] gombot a módosítások rögzítéséhez. A teljes képgyűjteményed újraindexelésre kerül. Ez gyorsabban fog lezajlani, mint a kezdeti indexelés, mivel a thumbnailek nem jönnek létre újra. - ^Nem indexelt fájlok és mappák elérése Egy nem indexelt képfájl vagy mappa olyan, amely nem szerepel a deklarált felső szintű képmappáidban (a deklarált képmappáid almappái mindig belekerülnek). Navigálhatsz egy ilyen mappához, és normálisan megtekintheted a thumbnaileket, és normálisan megtekintheted és szerkesztheted az ilyen fájlokat. Vannak korlátozások, amelyeket meg kell értened: • Ezek a fájlok hiányozni fognak bármely keresési eredményből és térképnézetből. • A thumbnailek megtekintéskor jönnek létre - a galériák lassúak lesznek. Ha egy hordozható (lassú) tárolóeszközt (pl. fényképezőgép SD kártyát) érsz el, észre fogod venni a döcögős teljesítményt. A thumbnailek szükség szerint jönnek létre, és megmaradnak az eszköz eltávolítása után is. Javaslat: másold a fájlokat egy deklarált Fotocx mappába, majd végezd el onnan a szükséges feldolgozást. A teljesítmény sokkal jobb lesz. - ^Cserélhető tároló (USB meghajtó) Ha a felső szintű képmappáid tartalmaznak egy cserélhető meghajtón lévő mappákat, és csatlakoztatás nélkül futtatod a Fotocx-et, az indexadatok és a thumbnailek megmaradnak, még akkor is, ha a cserélhető fájlok eltűntek. Amikor a cserélhető meghajtó ismét csatlakoztatva van, és a Fotocx elindul, az utolsó állapot visszaáll. Ha időközben fájlokat adtak hozzá vagy módosítottak, az indexadatok és a thumbnailek frissülnek. - - TOPIC: FOTOCX ALAPMAPPA ÁTHELYEZÉSE A Fotocx home mappa tartalmazza az összes felhasználói beállítást és adatot, beleértve a Fotocx csomag néhány, a felhasználó által testreszabható fájlját is. Alapértelmezett hely: /home//.fotocx. Ha a Linux több verziója vagy kiadása van telepítve, kívánatos lehet egyetlen közös Fotocx home mappával rendelkezni minden egyes kiadás sajátja helyett. Ugyanez igaz lehet, ha több felhasználónak kell hozzáférnie ugyanahhoz a Fotocx példányhoz. - Használd ezt a funkciót a Fotocx home mappa máshova történő áthelyezéséhez. A kiválasztott mappának tartalmaznia kell a „fotocx” szót az elérési útban, ellenkező esetben a „/fotocx” automatikusan hozzáfűzésre kerül. - Lásd a {PARANCS PARAMÉTEREK} -home paraméterét, ha több, külön kezelt Fotocx képgyűjteményt szeretnél. - - TOPIC: BEÁLLÍTÁSOK +image: settings.jpg - Különböző felhasználói preferenciák és beállítások kerülnek összegyűjtésre és mentésre a /parameters fájlban. A legtöbb módosítás azonnal érvénybe lép. Néhány a Fotocx újraindítását okozza. - • Válaszd ki a kívánt 2 karakteres nyelvi kódot. A Fotocx a kiválasztott nyelven fog újraindulni. • Startup View - a kezdeti megjelenítés a Fotocx indításakor. Recent Files: a legutóbb megtekintett képfájlok Newest Files: a legutóbb hozzáadott/módosított fájlok Specific Gallery: a megadott mappagaléria Album Gallery: a megadott albumgaléria Previous Gallery: az előző munkamenetben legutóbb használt galéria Previous File: az előző munkamenetben legutóbb megtekintett fájl Specific File: a megadott képfájl Browse gomb: mappa, album vagy képfájl kiválasztása • Background - a Fájlnézet és Galérianézet ablakok háttérszínei • Menu Style - a menü megjelenítési stílusa: ikonok, szöveg, vagy mindkettő • Menu Colors - a menü szövegszíne és háttérszíne • Dialog Font - a menük és párbeszédablakok betűtípusa • Show Hidden - ha ki van választva, megjeleníti a rejtett fájlokat és mappákat • Zoom Speed - Válassz 1-8 kattintást vagy [+] billentyűt a 2x-es képnövekedéshez • JPEG files - minőségi szint, alapértelmezett 90, jó minőséghez használj 70+-ot • Curve Node - a szerkesztő görbék csomópontjai közötti minimális távolság, a skála %-ában. Az alapértelmezett a skála 5%-a. Touchpadekhez használj magasabb értéket. • Image Position - a kép bal/közép/jobb elhelyezkedése egy szélesebb ablakon belül • Confirm Exit - felugró párbeszédablak opció: tényleg ki szeretnél lépni? • Index Level - lásd alább • RAW Loader - lásd alább • RAW Options - lásd alább • RAW Files - a használt RAW fájltípusok listája • Video Files - a használt videófájl-típusok listája • Video App - lásd alább - ^Fájlminőség és tömörítés JPEG fájl minőségi szint: használj 70-et vagy magasabbat a jó képminőséghez (alapértelmezett 90). A TIFF fájl tömörítési módszere DEFLATE (a legjobb színes képekhez). A PNG fájl tömörítési szintje '1'. A magasabb értékek úgy tűnik, semmi mást nem tesznek, csak növelik a fájlmentés idejét (libpng). - ^Kép pozíciója Ha az ablak szélesebb, mint a kép (azaz az ablak szélesség/magasság aránya nagyobb, mint a képé), a kép eltolható a bal oldalra, középre, vagy a jobb oldalra. Bal vagy jobb esetén a fel nem használt margó maximalizálódik, ami kényelmesebb lehet a párbeszédablakok elhelyezéséhez. - ^Kép indexelési szint Ez a két paraméter szabályozza az indítási idő és a képindex teljességének kompromisszumát. • $ fotocx: Akkor érvényes, amikor a fotocx egy shell paranccsal, rendszermenüvel vagy rendszerikonnal/indítóval kerül elindításra. Az ajánlott '2' érték teljes indexelést jelent: a régi indexfájl betöltése, új (még nem indexelt) fájlok keresése, és a fotocx indexfájl frissítése. • $ fotocx : Akkor érvényes, amikor a fotocx egy fájlnévre kattintva kerül elindításra egy fájlkezelő listában. Az ajánlott '1' érték azt jelenti, hogy a régi indexfájl betöltődik, de nem keres új fájlokat az index frissítéséhez. Az indítás mérsékelten gyors. A képkeresési és térképfunkciók normálisan működnek, de bármely új (még nem indexelt) képfájl nem szerepel bennük. • Alternatíva: a '0' azt jelenti, hogy nincs indexelés. Az indítás nagyon gyors. Egy képkereső vagy térkép funkció későbbi használata elindítja a fájlindex funkciót, de csak a régi fájlokhoz (nincs keresés új/módosított fájlokra). Használd ezt az opciót, ha a képgyűjteményed óriási, és az indítási idő meghaladja a néhány másodpercet. Az indexelés funkciót később is elindíthatod, ha szükséges. - ^RAW betöltő A RAW betöltő az a parancs, amelyet egy RAW fájl beolvasására és 16 bites színmélységű TIFF-fé alakítására használnak. Egy RAW fájl megtekintésekor kerül felhasználásra. A Fotocx szerkesztési funkciókkal szerkesztheted és optimalizálhatod a fájlt. Az alapértelmezett RAW betöltő a dcraw, amely az sRGB színteret használja. Néhány más, dcraw-t vagy rawtherapee-t használó opció is elérhető a választólistában. Ezek a parancsok a 'raw_commands_*' fájlban vannak tárolva a Fotocx home mappájában. Szerkeszd ezt a fájlt új opciók módosításához vagy hozzáadásához (lásd alább). Előfordulhat, hogy több parancsot szeretnél előkészíteni több fényképezőgéphez vagy több feldolgozási opcióhoz. Ha inkább interaktívan szeretnél egy RAW szerkesztőt használni, hozz létre ehhez egy plugin parancsot - lásd {BEÉPÜLŐK}. - ^RAW opciók • edit commands: nyomd meg a gombot a RAW betöltő parancsok listájának szerkesztéséhez. Egy szövegszerkesztő indul egy új ablakban, a parancsok aktuális listájával. • match embedded image color: használd a RAW fájlba ágyazott képet útmutatóként a RAW kép színeinek a konvertált TIFF képre való leképezéséhez. Ez a fényképezőgép gyártójának értelmezése a RAW adatokról - jó kiindulópont, ha a RAW fájlnak további szerkesztésre van szüksége. A beágyazott kép általában megegyezik a fényképezőgépből származó JPEG fájllal. - ^Video App Adj meg egy shell parancsot egy videólejátszó alkalmazás indításához. Használd a '%s'-t annak jelölésére, hogy hova kerüljön beszúrásra a videófájl neve a parancssorban. Íme néhány példa: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: GYORSBILLENTYŰK +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - Tekintsd meg vagy módosítsd az egyéni gyorsbillentyűket. Az éppen hozzárendelt gyorsbillentyűk az első ablakban jelennek meg. Ha megnyomod az [Szerkesztés] gombot, megjelenik a második párbeszédablak, ahol gyorsbillentyűket adhatsz hozzá és módosíthatsz. Add meg az új gyorsbillentyűt a billentyűzettel. Használhatod az A-Z, 0-9, F2-F9 billentyűket, és a legtöbb szimbólumot (% $ & * < stb.). Kombinálhatsz egy billentyűt a Ctrl/Alt/Shift EGYIKÉVEL: Nyomd meg és tartsd lenyomva a Ctrl/Alt/Shift EGYIKÉT, majd nyomd meg a billentyűt, majd engedd fel mindkettőt. Válassz egyet az elérhető menühozzárendelések közül a jobb oldali listából, majd nyomd meg az [Hozzáadás] és az [OK] gombot. Egy gyorsbillentyű eltávolításához válaszd ki, és nyomd meg a [Törlés] gombot. - - TOPIC: RGB HISZTOGRAM +image: RGB-hist.png - Egy kis ablak mutatja az aktuális kép fényerő-hisztogram grafikonját Fájlnézetben, vagy a kép éppen kijelölt területét. Ez a grafikon szinkron módon frissül, ahogy a szerkesztési funkciók módosítják a képet. Használd az [Összes] [Vörös] [Zöld] [Kék] gombokat a megjelenítendő színek kiválasztásához. - - TOPIC: KÉP NAGYÍTÁSA +image: magnify-image.jpg - Nagyítsd fel a képet az egérmutató körüli területen. Húzd az egeret bal gombbal a kép körül, hogy különböző területeket nagyíts fel, hasonlóan ahhoz, mintha egy nyomtatott képet néznél nagyítóval. Használd a párbeszédablakot a terület sugarának és a nagyítás mértékének beállításához. - - TOPIC: KÉP MÉRÉSE Kattints egy képen belüli bármely két pozícióra a köztük lévő pixeltávolság méréséhez. A megkattintott pozíciók A és B jelöléssel kerülnek megjelölésre a képen. Ezek a jelölések mindig az utoljára megkattintott két pontot mutatják. A párbeszédablak frissül az e két pontot elválasztó távolságokkal: X-distance (vízszintes távolság) Y-distance (függőleges távolság) H-distance (teljes távolság) - - TOPIC: RGB MEGJELENÍTÉSE +image: show-RGB.png - Amikor a kép egy pontjára kattintasz, az RGB értékek megjelennek egy párbeszédablakban. Az utolsó 9 megkattintott pont jelenik meg. Az értékek formátuma xxx.dd, ahol xxx a színérték felső 8 bitje, a .dd pedig az alsó 8 bit. A tartomány 0.00-tól 255.99-ig terjed. Az alsó 8 bit nulla, hacsak a kép nincs szerkesztve, vagy nem rendelkezik 8 bitnél nagyobb színmélységgel. A kimenetek valós időben frissülnek, ha a kép szerkesztés alatt áll. Ha a „labels” be van jelölve, a pontok betűkkel kerülnek megjelölésre a képen, amelyek megfelelnek a párbeszédablak betűinek. Ha a „delta” be van jelölve, és a kép szerkesztés alatt áll, akkor az abszolút értékek helyett az RGB változások jelennek meg. - Ha megnyitsz egy másik képet (pl. az előző képpel való összehasonlításhoz), a pozíciók megmaradnak és frissülnek, ha az új kép határain belül vannak. Ez megkönnyíti a képek pixel RGB értékek szintjén történő összehasonlítását. - - TOPIC: RÁCS BEÁLLÍTÁSOK +image: grid-settings.jpg - Két rácsvonal-funkció van: a Rács beállításai beállítja az összes rácsparamétert. A Rács váltása be- vagy kikapcsolja a rácsvonalakat. A rácsvonalak vízszintes és függőleges vonalak, szabályos időközönként a képen keresztül. Ezek a vonalak hasznos igazítási segédletek lehetnek, amikor egy kép kiegyenesítésre vagy torzításra kerül a falak vagy más objektumok kiegyenesítéséhez a képen. Használd az x-count és y-count bemeneteket a függőleges, illetve vízszintes vonalak számának beállításához. Az x- és y-offset vezérlők használhatók a rácsvonalak eltolására, hogy egy kívánt pozíciót messenek a képen. Egy gyorsbillentyű (alapértelmezetten shift+G) rendelhető a Rács váltásához, így a rácsvonalak egy billentyűleütéssel be- vagy kikapcsolhatók. - - TOPIC: VONAL SZÍNE Néhány funkció vonalakat rajzol a kép fölé (Vágás, Terület kijelölése, mások). Módosíthatod ezeknek a vonalaknak a színét, hogy maximalizáld a kontrasztot a háttérképpel szemben. A kis párbeszédablak nyitva hagyható szerkesztés közben, hogy kényelmesen válthass az elérhető színek (fekete, fehér, piros, zöld) között. - - TOPIC: SÖTÉT/VILÁGOS PIXELEK Emeld ki egy kép legsötétebb és legvilágosabb pixeleit. Állítsd be a két léptetőgombot a fényerőküszöbök beállításához, amelyek kezdetben 0 a sötét pixelekhez és 255 a világos pixelekhez. A sötét küszöbnél kisebb vagy a világos küszöbnél nagyobb fényerejű pixelek „villognak”, hogy kiemelkedjenek. Használd ezt a funkciót a fényerő vagy szín szerkesztése utáni levágás (clipping) észlelésére. - - TOPIC: MONITOR SZÍNE +image: moncolor-small.png - Nyolc színsáv kerül kiírásra a képernyőn, fényerővel a nullától (fekete) 100%-ig. Ezzel beállíthatod a monitorod fényerejét és kontrasztját. A sávok egyik végén se legyenek változatlan területek. - - TOPIC: DUPLIKÁTUMOK KERESÉSE +image: find-dups.png - Keresd meg a duplikált képfájlokat bárhol a képadatbázisodban. Egy duplikátum fájl lehet egy fájl, amely pontosan vagy „majdnem” duplikálja egy másik fájlt. A sebesség érdekében a thumbnail képek memóriában kerülnek összehasonlításra. Előfordulhat, hogy egyező thumbnailek találhatók olyan fő képekhez, amelyeknek kis eltéréseik vannak, amelyek nem tükröződnek a thumbnailekben. Egy méretében csökkentett képmásolat valószínűleg duplikátumként lesz osztályozva. A thumbnail mérete 32-től 512 pixelig állítható. A nagyobb méret csökkenti a téves pozitív találatok valószínűségét. A thumbnail mérete nagymértékben befolyásolja a szükséges fő memória mennyiségét - pl. 100 ezer kép esetén a 64-es méret kb. 880 MB-ot igényel, míg a 256-os méret kb. 14 GB-ot. Nyomd meg a [calculate] gombot a rendelkezésre álló szabad memórián belül elférő legnagyobb thumbnail méret kiszámításához. - Két paraméter szolgál az azonos vagy majdnem azonos képek észlelési érzékenységének beállítására: a pixel difference az az RGB értékkülönbség, amely alatt a pixelek egyenlőnek számítanak. A pixel count az a különböző pixelszám, amely alatt két kép duplikátumnak minősül. Példa: ha a pixel difference = 2 és a pixel count = 10, akkor a képek duplikátumnak minősülnek, ha kevesebb mint 10 pixel tér el 2-vel vagy kevesebbel. - A kimenet egy galéria, amely az egyes duplikátumkép-halmazokat mutatja. A kimeneti galéria „Duplicate Images” néven kerül mentésre albumként. Ezzel az albummal együtt használhatod a Kötegelt törlés/kuka funkciót, hogy kiválaszd, mely duplikátumokat töröld. - - TOPIC: HIBÁS FÁJLOK KERESÉSE A deklarált felső szintű mappáidban lévő összes képfájl beolvasásra kerül. Minden olyan fájlnál, amely nem olvasható be, három lehetőséged van: • a fájl törlése • egy hibás fájltípus javítása (lásd alább) • a fájl áthelyezése valahova a felső szintű képmappáidon kívülre Gyakran láttam .png fájlokat .jpg kiterjesztéssel. A webböngészők és néhány más alkalmazás csendben kezeli ezt. Itt a helyes fájltípus kerül jelentésre, és megváltoztathatod a kiterjesztést a helyesre. - - TOPIC: ERŐFORRÁSOK MEGJELENÍTÉSE Jelentsd a Fotocx által használt számítógép-erőforrásokat: • CPU time: felhasználás a Fotocx indítása vagy a legutóbbi mintavétel óta • Real memory: az éppen használt valós memória (a swap kivételével) • Maps cache: a gyorsítótárazott térképcsempékhez használt lemezterület MB-ban • Clear cache: az összes gyorsítótárazott térképcsempe törlése • [Sample] gomb: új minta vétele és az adatok jelentése - A [Sample] gomb visszaállítja a CPU időt. A következő minta csak az újonnan felhalmozott CPU időt fogja mutatni. A CPU idő az összes folyamatszál összege. - - TOPIC: FORDÍTÁSOK A Fotocx csomag több nyelvhez tartalmaz fordításokat. Ezek az AI fordítások nem tökéletesek. A fordítási hibák a fordítási fájlok szerkesztésével javíthatók. - ^A GUI nyelvének módosítása A {BEÁLLÍTÁSOK} menü használható a nyelv módosításához. A nyelv a Fotocx indításakor is beállítható: $ fotocx -lang xx # xx nyelv (de fr zh stb.) $ fotocx -lang en # angol - ^Egy GUI fordítás módosítása Szerkeszd a /translations/gui_xx fájlt A szövegsor-párok elején 4 számjegyű számok vannak, amelyeknek egyezniük kell. Az első sor angol, a 2. sor az xx nyelv. Csak az xx sort módosítsd, soha az angol sort. A szövegbe paramétereket beszúró speciális karaktereknek ugyanabban a sorrendben kell maradniuk. Ezek: '%d' (egész paraméter), '%f' (tizedes), '%s' (szöveg). - ^Egy felhasználói kézikönyv fordítás módosítása Szerkeszd a /translations/ug_xx fájlt Szerkeszd az ug_xx fájlt a fordítás javításához. Ne adj hozzá és ne távolíts el szövegsorokat, és ne módosítsd a sorrendet. A szövegsoroknak 1:1 arányban meg kell felelniük az angol felhasználói kézikönyvnek, az ug_en-nek. - Küldd el a felülvizsgált fájlokat a következő Fotocx kiadásba való belefoglaláshoz: mkornelix@gmail.com - - TOPIC: SÚGÓ MENÜ • User Guide - A tartalomjegyzék megjelenítése • Video Tutorial - Egy Fotocx videós útmutató megjelenítése a YouTube-on • Outboard Programs - A külső programok és funkcióik felsorolása • Show Log File - A naplózott információk és hibaüzenetek megjelenítése • Command Parameters - Az elérhető parancssori paraméterek megjelenítése • Change Log - A legutóbbi kiadások kiegészítéseinek és hibajavításainak megjelenítése • Copyright - A Fotocx-re vonatkozó szerzői jogok és licencek megjelenítése • Privacy - A Fotocx adatvédelmi szabályzatának (szabályainak) megjelenítése • About - A kiadási szám, a végrehajtható fájl helye, elérhetőség megjelenítése • Home Page - A Fotocx honlapjának megjelenítése a kornelix.net-en • Uninstall - Hogyan távolítsd el a Fotocx-et - - TOPIC: EGYÉB TÉMÁK A következő témák nem kapcsolódnak a Fotocx menükhöz. - - TOPIC: VIDEO FILES Videófájlok (.mpeg, .mp4 stb.) keveredhetnek a képfájljaiddal. Ezek képfájlokként jelennek meg mind Fájlnézetben, mind Galérianézetben. A 'P' billentyű elindítja, szünetelteti, és folytatja a videót, vagy újrajátssza a véget ért videót. A 'Q' billentyű kilép a videóból. Használd a {BEÁLLÍTÁSOK} menüt a videófájlok lejátszásához használt alkalmazás kiválasztásához. - - TOPIC: DIÁK ÉS NEGATÍVOK +image: color-negative.jpg - Használhatsz egy közeli felvételre képes fényképezőgépet diák vagy filmnegatívok digitalizálásához. Használj fényasztalt a megvilágításhoz, vagy használd az eget (fenti példa). Egy színes negatív feldolgozásához először készíts pozitívot - lásd {SZÍNMÓD}. Ha a kép ködös, csak a képterületet válaszd ki, a filmszéleket kizárva, majd használd a {GLOBÁLIS RETINEX} funkciót a köd megszüntetéséhez. Állítsd be a fehér és fekete pontokat a képre kattintva, ha szükséges a köd további csökkentéséhez. - - TOPIC: FOTOCX KORLÁTOZÁSOK • Egymillió fájl kemény korlátja van. • képverziók - legfeljebb 99 verzió a visszavonáshoz/mégis-hez és a verzióelnevezéshez. • képkeywords - összesen 10 ezer keyword. 1000 karakter egyetlen képhez. • A galériák 40 ezer képfájlra korlátozottak. • a maximális képméretek 40 ezer x 20 ezer pixel. - - TOPIC: FOTOCX WINDOWS 11-HEZ A Fotocx Windows 11-en használható a Windows Subsystem for Linux 2, vagyis a WSL2 telepítésével. Bőséges dokumentáció található az interneten arról, hogyan kell ezt megtenni. - Ha a képfájljaid a Windows fájlrendszerében (NTFS) vannak, a Fotocx nagyon lassú lesz. Ezért helyezd át a képfájljaidat a Linux fájlrendszerbe. Továbbra is elérheted őket a Windows Intézővel és más Windows alkalmazásokkal, így semmi sem vész el. A Microsoft is a Linux fájlrendszert ajánlja a jobb teljesítmény érdekében. Használd a 'Linux' ikont a Fájlkezelőben, hogy elérd a home mappádat a Linux fájlrendszerben. Adj hozzá egy Pictures mappát, ha szükséges, és helyezd át oda a képfájljaidat. - Ha elérhető egy Fotocx csomag, telepítsd. Ellenkező esetben tedd a következőt: Töltsd le a Fotocx bináris csomagfájlt innen: ^https://kornelix.net. A Linux terminálban: $ cd /mnt/c/Users//Downloads # lépj a Windows letöltések mappájába $ tar -xzf fotocx-xxx-bin.tar.gz # csomagold ki a csomagot a fotocx mappába $ cd fotocx # lépj a fotocx mappába $ chmod u+x install.sh # tedd az install szkriptet végrehajthatóvá $ ./install.sh # futtasd a szkriptet, telepítsd a fotocx-et $ fotocx # indítsd el a Fotocx-et Előfordulhat, hogy újra kell indítanod a Linux ablakot, hogy az utolsó lépés működjön. - Olvasd el ennek a felhasználói kézikönyvnek a bevezető részeit. A Fotocx mély funkcionalitással rendelkezik. Ne várd, hogy néhány perc alatt elsajátítsd a Fotocx-et. - - TOPIC: ADATVÉDELEM A Fotocx a képfájlokon és azok metadata-ján kívül nem tárol felhasználói adatot. A metadata-t el kell távolítani a képfájlokból az internetre való feltöltés előtt, és a Fotocx erre egy egyszerű módszert biztosít. - - TOPIC: PROBLEM, QUESTION, SUGGESTION Küldj e-mailt a mkornelix@gmail.com címre. Ha van összeomlási memóriakép (zappcrash fájl), küldd el azt is. - fotocx/data/translations/ug_fr0000664000175000017500000112742515247006657015531 0ustar micomico- ^GUIDE UTILISATEUR FOTOCX^ v.26.8 Consulter via le menu Fotocx Aide > Guide utilisateur - {UTILISATION DE FOTOCX} {PREMIER DÉMARRAGE} - localiser et indexer les fichiers image pour une recherche rapide {GUIDE UTILISATEUR} ← ^cliquer ici^ - comment utiliser ce navigateur de guide utilisateur {VUES ET MENUS DE LA FENÊTRE} - fenêtres de premier niveau et menus associés {AFFICHAGE DU FICHIER} - fenêtre Affichage du fichier (afficher un seul fichier image) {AFFICHAGE DE LA GALERIE} - fenêtre Affichage de la galerie (afficher un dossier sous forme de vignettes) {AFFICHAGE DE LA CARTE} - fenêtre d'affichage de la carte (afficher la carte avec les marqueurs de lieu des images) {GLISSER-DÉPOSER} - méthodes de glisser-déposer de fichiers {MODIFIER LES PROCÉDURES} - comment modifier les fichiers image {MODIFIER LE FLUX DE TRAVAIL} - méthodes de modification alternatives - simples et complexes {PROPRIÉTÉ DE LA SOURIS} - contrôle et interaction souris-boîte de dialogue {SOURIS ALT-CLIC DROIT} - bouton droit de la souris pour pavés tactiles/écrans {BOUTONS DE DIALOGUE} - options de fin de dialogue {TOUCHE ÉCHAP DU CLAVIER} - fonctions de la touche Échap {WIDGETS DE DIALOGUE NON STANDARD} - comment utiliser les widgets de dialogue non standard {ÉDITION DE COURBES} - comment manipuler les courbes utilisées dans les fonctions de modification {MOUSE PAINTING} - modifier une image localement à l'aide de la souris {TRAITEMENT MASSIF} - aperçu des fonctions de traitement massif {SÉLECTIONNER DES FICHIERS IMAGE} - procédure de sélection de fichiers image {RACCOURCIS} - menus contextuels, raccourcis clavier, menu utilisateur personnalisé {FONCTIONS DE LA SOURIS} - fonctions de la souris pour les vues fichier/galerie/carte {PARAMÈTRES DE COMMANDE} - paramètres de ligne de commande de Fotocx - {MENU FICHIER} {NOUVELLE SESSION} - démarrer une nouvelle session Fotocx dans une fenêtre séparée {OUVRIR UN FICHIER IMAGE} - ouvrir un fichier image pour l'afficher ou le modifier {CYCLE 2 FICHIERS} - parcourir les deux fichiers image vus le plus récemment {CYCLE 3 FICHIERS} - parcourir les trois fichiers image vus le plus récemment {AFFICHER PANO 360°} - image panoramique à 360° avec point de vue rotatif {IMAGE VIERGE} - créer une image vierge avec une taille et une couleur spécifiées {IMAGE VIERGE} - créer une nouvelle image vierge {COPIER/DÉPLACER} - copier ou déplacer un fichier image vers un autre dossier {COPIER SUR LE BUREAU} - copier un fichier image sur le bureau {COPIER DANS LE PRESSE-PAPIERS} - copier un fichier image dans le presse-papiers {SUPPRIMER/CORBEILLE} - supprimer ou mettre à la corbeille un fichier image {DÉFINIR LE FOND D'ÉCRAN} - définir le fond d'écran du bureau à partir du fichier image actuel {IMPRIMER L'IMAGE} - imprimer un fichier image {IMPRESSION CALIBRÉE} - imprimer en utilisant les données de calibration des couleurs {CALIBRER L'IMPRIMANTE} - calibrer la couleur de l'imprimante - compenser les décalages de couleur - {MENU GALERIE} {APERÇU DE LA GALERIE} {VUE VIGNETTES} - Affichage de la galerie avec vignettes et noms de fichiers {AFFICHAGE DES MÉTADONNÉES} - Affichage de la galerie avec vignette et métadonnées de base {FICHIERS RÉCENTS} - Affichage de la galerie des fichiers image vus le plus récemment {FICHIERS LES PLUS RÉCENTS} - Affichage de la galerie des fichiers image les plus récents {TRI DE LA GALERIE} - modifier l'ordre de tri d'une galerie {FILTRE DE GALERIE} - sélectionner le plus récent, le plus ancien, un motif correspondant ... {ACCUEIL DE LA GALERIE} - aller au début de la galerie {FIN DE GALERIE} - aller à la fin de la galerie {DOSSIER DU FICHIER ACTUEL} - définir la galerie actuelle à partir du dossier du fichier actuel {DOSSIERS RÉCENTS} - afficher la liste des dossiers vus récemment, sélectionner {ARBORESCENCE DES DOSSIERS} - afficher les dossiers de fichiers image sous forme d'arborescence, sélectionner {SÉLECTIONNER DES FICHIERS} - sélectionner des fichiers en entrée pour un traitement massif, un script ou un album {SIGNETS} - afficher la liste des signets, aller à un signet {MODIFIER LES SIGNETS} - ajouter, retirer, organiser les signets - {MAPS MENU} {CARTE DU MONDE} - aperçu de la carte du monde sur internet {AFFICHER SUR LA CARTE} - afficher la position de l'image actuelle sur la carte - {MENU ALBUMS} {ALBUMS} - créer et organiser des collections d'images {CRÉER UN ALBUM} - créer un nouvel album (galerie d'images choisies) {RENOMMER L'ALBUM} - renommer un album existant {SUPPRIMER L'ALBUM} - supprimer un album existant {CHOISIR UN ALBUM} - choisir un album et afficher la galerie d'images {ALBUM ACTUEL} - afficher l'album actuel (le plus récemment utilisé) {GALERIE VERS ALBUM} - enregistrer la galerie actuelle comme album nommé {MODIFIER L'ALBUM} - ajouter, retirer, réorganiser les fichiers image dans la galerie d'un album {METTRE À JOUR LES ALBUMS} - mettre à jour les albums pour les fichiers image modifiés (nouvelles versions) {MISE À JOUR MASSIVE D'ALBUM} mise à jour massive des albums (ajout/retrait/remplacement des fichiers membres) {DIAPORAMA} - diaporama avec transitions d'image animées et panoramique/zoom - {MENU PERSONNALISÉ} - menu utilisateur personnalisé pour les fonctions fréquemment utilisées {FICHIERS DE SCRIPT} - aperçu des fichiers de script {MODIFIER LE SCRIPT} - enregistrer des modifications dans un script pour créer une fonction de modification personnalisée {EXÉCUTER LE SCRIPT} - exécuter le script sur l'image actuelle {SCRIPT MASSIF} - exécuter le script sur les fichiers image sélectionnés {PLUGINS} - démarrer une fonction de modification par plugin, ouvrir le fichier de sortie du plugin - {ZOOM} - zoom avant/arrière sur l'image ou les vignettes via la souris ou le clavier - {PRÉC/SUIV} - passer à l'image précédente ou suivante via la souris ou le clavier - {ENREGISTRER LE FICHIER} - enregistrer le fichier image (remplacer, nouvelle version, nouveau nom de fichier) - {MENU MÉTADONNÉES} {AFFICHER LES MÉTADONNÉES PRINCIPALES} - lister les métadonnées principales de l'image {AFFICHER TOUTES LES MÉTADONNÉES} - lister toutes les métadonnées de l'image {APERÇU DES MOTS-CLÉS} - mots-clés utilisés pour la recherche d'images {GEOTAGS OVERVIEW} - noms de lieux et géocoordonnées pour la recherche {MODIFIER LES MÉTADONNÉES PRINCIPALES} - modifier les métadonnées couramment utilisées {MODIFIER TOUTES LES MÉTADONNÉES} - modifier n'importe quelle métadonnée (ajouter, retirer, changer) {SUPPRIMER LES MÉTADONNÉES} - supprimer les métadonnées spécifiées ou toutes les métadonnées {COPIER LES MÉTADONNÉES} - copier les métadonnées d'un fichier image vers un autre {CORRIGER LES MÉTADONNÉES} - réparer des métadonnées mal formées empêchant leur modification {GÉRER LES MOTS-CLÉS} - gérer les mots-clés définis par l'utilisateur {LÉGENDES} - afficher le nom de fichier, le titre, la description dans un coin de l'image {LIEUX/DATES} - lister les lieux/dates des images, cliquer pour la galerie {CHRONOLOGIE} - afficher le nombre d'images par année/mois, cliquer pour la galerie {BALISES DE MÉTADONNÉES} - afficher le nombre d'images par valeur de balise, cliquer pour la galerie {RECHERCHE AUTOMATIQUE} - fonction de recherche scriptée pour trouver des fichiers {RECHERCHER DES IMAGES} - rechercher en utilisant n'importe quelle métadonnée ou nom de dossier/fichier - {MENU SÉLECTION} {APERÇU DE ZONE} - sélectionner une zone - concepts et utilisation {SÉLECTIONNER UNE ZONE} - sélectionner un élément ou une zone de l'image pour une modification séparée {TROUVER UN ESPACE DANS LA ZONE} - trouver un espace dans un contour de zone dessiné à la main {FUSION DE ZONE} - fondre à la souris les modifications faites dans une zone sélectionnée {AFFICHER/MASQUER LA ZONE} - afficher ou masquer les contours de zone {ACTIVER/DÉSACTIVER LA ZONE} - activer ou désactiver une zone pour la modification {INVERSER LA ZONE} - inverser une zone (échanger l'extérieur/l'intérieur de la zone) {EFFACER LA ZONE} - supprimer une zone {COPIER/COLLER UNE ZONE} - copier une zone ou coller une zone dans l'image actuelle {CHARGER/ENREGISTRER LA ZONE} - charger une zone depuis un fichier ou l'enregistrer dans un fichier - {BOUTON ANNULER/RÉTABLIR} - annuler ou rétablir séquentiellement les modifications de l'image actuelle - {MENU ÉDITION} {PIVOTER} - pivoter ou mettre à niveau une image {REDRESSEMENT} - redresser une image pivotée ou retournée en miroir {RECADRER} - recadrer (rogner) les marges de l'image {RETOUCHER} - modifier la luminosité, le contraste, la couleur, la saturation {REDIMENSIONNER} - modifier les dimensions en pixels de l'image {ÉCRAN PARTAGÉ} - afficher les changements avant/après avec un écran partagé {AFFICHER LES DIFFÉRENCES} - mettre en évidence les changements pendant la modification (ou deux images quelconques) {MARGES} - ajouter des marges à une image, n'importe quelle couleur ou transparence {ANNOTATION} - dessiner sur l'image : texte, ligne/flèche, rectangle, ovale {MODE COULEUR} - convertir en noir et blanc, couleur, négatif, positif {PEINDRE LES MODIFICATIONS} - peindre à la souris une fonction de modification localement et progressivement {PEINDRE L'IMAGE} - peindre à la souris avec une couleur, une taille de pinceau et une opacité {PEINDRE LA TRANSPARENCE} - peindre une transparence croissante à la souris {REMPLISSAGE DE ZONE} - remplir les zones sélectionnées ou les zones transparentes avec une couleur {COPIER DANS L'IMAGE} - copier des pixels à l'intérieur d'une image avec la souris {COPIER DEPUIS L'IMAGE} - copier des pixels depuis une autre image avec la souris {COPIER LA MODIFICATION PRÉCÉDENTE} - copier des pixels de modifications précédentes avec la souris - {MENU RÉPARATION} {NETTETÉ} - rendre nette une image floue, plusieurs méthodes {FLOU} - flouter une image ou une zone d'image, plusieurs méthodes {RÉDUCTION DU BRUIT} - réduire le bruit de l'image (petites taches aléatoires) {ANTI-BRUME} - ajouter ou supprimer la brume/le voile d'une image ou d'une zone sélectionnée {YEUX ROUGES} - supprimer les yeux rouges des photos au flash {EFFACEMENT INTELLIGENT} - supprimer les lignes électriques, panneaux, autres petits éléments gênants {SUPPRIMER LE HALO} - supprimer les halos laissés par la netteté et d'autres fonctions {ARTEFACTS JPEG} - supprimer les artefacts dans les fichiers fortement compressés {ANTI-ALIASING} - supprimer la pixellisation (crénelage) le long des bords des éléments {AJUSTER RVB} - ajuster les couleurs de l'image avec les couleurs RVB ou CMJ {AJUSTER TSL} - sélectionner et modifier les couleurs avec le modèle colorimétrique TSL {SUPPRIMER LA POUSSIÈRE} - supprimer les taches de poussière sur les images d'anciennes photos {FRANGES} - corriger les franges colorées périphériques (aberration chromatique) - {MENU CORRECTION} {APLATIR L'HISTOGRAMME} - aplatir l'histogramme de luminosité pour de meilleurs détails {CONTRASTE LOCAL} - ajouter un contraste adapté à la luminosité locale de la zone {AMPLIFIER LE CONTRASTE} - amplifier le contraste existant pour améliorer les détails {RETINEX GLOBAL} - redimensionner les valeurs RVB pour une plage plus grande {RETINEX LOCAL} - redimensionner les valeurs RVB pour une plage plus grande {SATURATION} - ajuster la saturation des couleurs selon la luminosité {FLOU ARTISTIQUE} - appliquer l'effet classique de « flou artistique » à une image {DÉGRADÉ DE LUMINOSITÉ} - ajouter un dégradé de luminosité/couleur sur une image {VIGNETTE} - modifier la luminosité/couleur radialement autour d'un centre choisi - {MENU EFFETS} {CONTOURS} - convertir une image en dessin au trait {CROQUIS1} - convertir une image en croquis simulé (1) {CROQUIS2} - convertir une image en croquis simulé (2) {DESSIN ANIMÉ} - convertir une image en dessin façon dessin animé {RELIEF} - convertir une image en gravure en relief simulée (effet 3D) {TUILES1} - convertir une image en tuiles carrées avec effet 3D {TUILES2} - convertir une image en tuiles irrégulières correspondant à l'image {PEINTURE} - convertir une image en peinture simulée {TEXTURE} - ajouter une texture à une image ou une zone sélectionnée {FUSION} - supprimer les détails fins tout en conservant la netteté {FAIRE CORRESPONDRE LES COULEURS} - faire correspondre les couleurs d'une image à une autre image {MOTIF} - ajouter un motif d'arrière-plan à une image {HACHURES CROISÉES} - convertir en croquis avec des lignes parallèles croisées {TRAMAGE} - différentes façons de pixelliser ou postériser une image {GRAVURE} - convertir une image en lignes noir et blanc {AJOUTER UN ÉBLOUISSEMENT} - ajouter un éblouissement autour des objets lumineux de l'image {MOSAÏQUE} - convertir une image en mosaïque avec des tuiles faites d'images {AJOUTER DU BRUIT} - ajouter du bruit aléatoire à une image {DÉFINIR LES COULEURS} - réduire le nombre de couleurs (postériser) {DÉCALER LES COULEURS} - décaler progressivement les couleurs RVB vers VBR ou BRV {COULEURS ALIEN} - ajouter des couleurs étranges aléatoires à une image {NOYAU PERSONNALISÉ} - modifier et appliquer un noyau de convolution personnalisé - {MENU DÉFORMATION} {REDRESSER} - redresser des images ayant des lignes courbes, notamment des panoramas {PERSPECTIVE} - redresser un objet photographié sous un angle obtus {DÉFORMATION DE ZONE} - déformer une zone d'image sélectionnée en tirant avec la souris {WARP LINEAR1} - déformer l'image par glissement de la souris - déformation linéaire 1 {WARP LINEAR2} - déformer l'image par glissement de la souris - déformation linéaire 2 {DÉFORMATION COURBE} - déformer l'image par glissement de la souris - déformation courbe {DÉFORMATION AFFINE} - déformer l'image par glissement de la souris - lignes parallèles conservées {DÉFORMATION RADIALE} - ajouter ou supprimer une distorsion en barillet ou en coussinet {DÉFORMER UN GROS PLAN} - supprimer la distorsion des photos de visage en gros plan (gros nez) {CRÉER DES VAGUES} - déformer une image avec un motif de vagues {TORSION} - tordre une image autour d'un point central choisi {SPHÈRE} - courber une image en forme de sphéroïde {INTÉRIEUR-EXTÉRIEUR} - inverser la distance centre-bord de chaque pixel {TINY PLANET} - enrouler une image panoramique autour d'un cercle {SPIRALE D'ESCHER} - transformer une image en spirale infinie vers l'intérieur {APLATIR LA PHOTO} - aplatir la photo d'une surface courbe - {MENU COMBINER} {HDR} - combiner des images sombres/claires pour une plage de luminosité étendue {HDF} - combiner des images à mise au point proche/lointaine pour une profondeur de champ étendue {EMPILEMENT/PEINTURE} - combiner des images pour supprimer les voitures, touristes de passage, etc. {EMPILEMENT/BRUIT} - combiner des images pour réduire le bruit par moyennage {EMPILEMENT/CALQUES} - combiner des versions d'image, sélectionner/peindre une zone/version {PANORAMA} - combiner une série d'images horizontalement {AFFICHER LES FICHIERS CIM} - afficher les fichiers d'entrée de l'image combinée actuelle/la plus récente {MASHUP} - disposer des images et du texte formaté dans une mise en page personnalisée {RÉSEAU D'IMAGES} - joindre de nombreuses images en un format de réseau compact - {MENU TRAITEMENT MASSIF} {CONVERSION MASSIVE} - copier, déplacer, redimensionner, renommer, convertir, ajouter du texte ... {COPIE/DÉPLACEMENT MASSIF} - copier/déplacer les fichiers image sélectionnés vers un nouveau dossier {REDRESSEMENT MASSIF} - rechercher les fichiers image pivotés et les redresser {SUPPRESSION/CORBEILLE MASSIVE} - supprimer ou mettre à la corbeille les fichiers image sélectionnés {SUPERPOSITION MASSIVE} - ajouter une image de superposition (copyright ...) aux images sélectionnées {MOTS-CLÉS MASSIFS} - ajouter ou supprimer des mots-clés pour les fichiers image sélectionnés {RENOMMAGE MASSIF DES MOTS-CLÉS} - renommer ou supprimer des mots-clés pour tous les fichiers image {PURGE MASSIVE DES MOTS-CLÉS} - purger les mots-clés indésirables de tous les fichiers image {DATE PHOTO MASSIVE} - modifier les dates ou heures des photos, ou décaler le fuseau horaire {MODIFICATION MASSIVE DES MÉTADONNÉES} - ajouter ou réviser les métadonnées des fichiers image sélectionnés {RAPPORT MASSIF DES MÉTADONNÉES} - rapporter les métadonnées des fichiers image sélectionnés ou de tous les fichiers {GÉOMARQUAGE MASSIF} - ajouter ou réviser les géomarquages des fichiers image sélectionnés ou de tous les fichiers {EXPORTER LES FICHIERS} - exporter les fichiers sélectionnés vers un dossier (ex. envoi sur le web) - {MENU OUTILS} {INDEXER LES FICHIERS} - tâche unique pour trouver et indexer tous les fichiers image {DÉPLACER L'ACCUEIL DE FOTOCX} - déplacer le dossier d'accueil de Fotocx (données et paramètres utilisateur) {PARAMÈTRES} - préférences et paramètres utilisateur pour le fonctionnement de Fotocx {RACCOURCIS CLAVIER} - afficher et modifier les raccourcis clavier des fonctions de menu {HISTOGRAMME RVB} - graphique d'histogramme de luminosité pour l'image actuelle {AGRANDIR L'IMAGE} - transformer la souris en loupe sur l'image {MESURER L'IMAGE} - mesurer les distances entre pixels dans l'image (clics de souris) {AFFICHER RVB} - afficher les valeurs RVB à la position de la souris ou pour des points sélectionnés {PARAMÈTRES DE LA GRILLE} - afficher ou retirer les lignes de grille, définir le nombre de lignes ou l'espacement {COULEUR DE LIGNE} - définir la couleur des contours de zone sélectionnée {PIXELS SOMBRES/CLAIRS} - outil pour mettre en évidence l'écrêtage {COULEUR DU MONITEUR} - ajuster la luminosité et le contraste du moniteur {TROUVER LES DOUBLONS} - trouver les images en double dans une galerie ou dans toutes les images {TROUVER LES FICHIERS DÉFECTUEUX} - trouver les fichiers image illisibles, supprimer/déplacer/corriger {AFFICHER LES RESSOURCES} - afficher le temps CPU et l'utilisation actuelle de la mémoire {TRADUCTIONS} - créer ou modifier les traductions de l'interface graphique - {MENU AIDE} - guide utilisateur, tutoriel, journal des modifications, à propos de Fotocx, désinstaller - {AUTRES SUJETS} {VIDEO FILES} - fichiers vidéo, vignettes, lecture des vidéos {DIAPOSITIVES ET NÉGATIFS} - comment numériser des diapositives et des négatifs de film {LIMITATIONS DE FOTOCX} - limites de taille et de performance {FOTOCX POUR WINDOWS 11} - installer Fotocx sur Windows 11 WSL {CONFIDENTIALITÉ} - politique de confidentialité et de protection des données de Fotocx {PROBLEM, QUESTION, SUGGESTION} - contacter l'auteur de Fotocx - - TOPIC: UTILISATION DE FOTOCX - - TOPIC: PREMIER DÉMARRAGE - ^Programmes externes Fotocx signale les programmes externes requis et optionnels ainsi que la fonction fournie par chacun. Si des programmes requis sont manquants, installez-les puis redémarrez Fotocx. - ^Premier index Fotocx va indexer vos fichiers image. Cela permet aux pages de galerie (vignettes) de s'afficher rapidement, active la recherche rapide basée sur les métadonnées indexées, et permet d'utiliser des marqueurs de carte cliquables pour afficher les images par lieu. Vous devez indiquer un ou plusieurs dossiers d'images « principaux » (ex. /home//Images). Les sous-dossiers sont automatiquement inclus. Les fichiers non-image dans ces dossiers sont ignorés. Utilisez le bouton [select] pour localiser et ajouter vos dossiers d'images principaux. Une limite pratique est d'environ 30 dossiers principaux. Chacun peut avoir des centaines de sous-dossiers. - ^Vignettes Il s'agit du dossier où les fichiers de vignettes seront placés. Utilisez le dossier par défaut fourni ou choisissez un autre emplacement. - ^Temps d'indexation La vitesse d'indexation peut aller de quelques centaines à plus de 10 000 fichiers/minute, selon le type et la taille de vos fichiers image et la vitesse de votre ordinateur. Lorsque vous ajoutez de nouveaux fichiers image à votre collection, le prochain démarrage de Fotocx indexera les nouveaux fichiers. S'il y a de nombreux nouveaux fichiers, le démarrage nécessitera du temps pour les indexer. - ^Consolidation du titre et de la description de l'image La fonction d'index d'image de Fotocx remplace les métadonnées de titre et de description manquantes par l'une des nombreuses balises de métadonnées alternatives, si disponible : headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. Cela permet de toujours afficher/modifier/rechercher en utilisant uniquement « titre » et « description ». Ce processus de conversion est relativement lent (2200 fichiers/minute sur mon ordinateur puissant). Il est effectué lorsque de nouveaux fichiers image sont indexés pour la première fois. Rien n'est effacé. - - TOPIC: GUIDE UTILISATEUR Ouvrez le guide utilisateur depuis le menu Aide > Guide utilisateur. Pendant l'utilisation de Fotocx, vous pouvez appuyer sur F1 pour afficher le sujet du guide utilisateur correspondant à la fonction de menu actuelle ou la plus récente. - Pour faire défiler le texte, utilisez les touches flèche haut/bas et page précédente/suivante. Le bouton [Rechercher] ouvre une boîte de dialogue de recherche de texte. Appuyez de nouveau sur [Rechercher] pour l'occurrence suivante. - Le texte en gras et en majuscules est un lien cliquable vers un sujet, par ex. {INDEXER LES FICHIERS}. Utilisez les boutons [<] et [>] pour naviguer entre les sujets récemment consultés. Le bouton [Recent] présente une liste cliquable des sujets récemment consultés. - - TOPIC: VUES ET MENUS DE LA FENÊTRE +image: fotocx-views.jpg - ^Boutons de menu Lorsqu'un menu est cliqué, un sous-menu contextuel apparaît. Les trois menus du haut (Fichier, Galerie, Cartes) définissent le mode d'affichage correspondant. Les touches F/G/M peuvent aussi être utilisées. - - TOPIC: AFFICHAGE DU FICHIER Une seule image remplit toute la fenêtre de Fotocx. Zoom avant/arrière avec un clic gauche/droit de la souris. La touche Z alterne entre l'ajustement à la fenêtre et la taille d'image 1x (1 pixel d'image = 1 pixel d'affichage). Pour faire un panoramique d'une image zoomée, glissez la souris avec le clic gauche sur l'image. La molette de la souris peut aussi zoomer une image en avant ou en arrière. Utilisez les boutons de menu (Édition, Réparation, etc.) pour modifier l'image. Utilisez le bouton Enregistrer le fichier pour enregistrer un fichier modifié : remplacer, créer une nouvelle version, ou créer un nouveau fichier (nouveau nom). - ^Touches clavier flèche gauche/droite Afficher le fichier image précédent ou suivant dans la galerie actuelle. - ^touches flèche haut/bas Comme ci-dessus, mais seules les dernières versions sont affichées, ou l'original s'il n'existe aucune version. - - TOPIC: AFFICHAGE DE LA GALERIE Tous les fichiers image de la galerie actuelle sont affichés sous forme d'un ensemble de vignettes. - ^Types de galerie • Dossier : tous les fichiers image et sous-dossiers d'un seul dossier (répertoire) • Album : fichiers image provenant de divers dossiers, organisés par l'utilisateur • Fichiers récents : les fichiers image vus ou modifiés le plus récemment • Fichiers les plus récents : les fichiers image ajoutés ou modifiés le plus récemment • Résultats de recherche : images trouvées par la fonction Rechercher. C'est aussi un album. - ^Fonctions de la galerie • clic gauche sur une vignette d'image : ouvrir l'image en mode Affichage du fichier • clic droit sur une vignette d'image : menu contextuel des fonctions courantes • clic sur une vignette de dossier : ouvrir ce dossier en mode Galerie • barre TOP de la galerie de dossier : dossiers parents - cliquer pour y aller • bouton [TOP] : liste des dossiers de premier niveau - cliquer pour y aller • barres de défilement : défiler vers le haut/bas dans la galerie • touches flèche haut/bas : faire défiler la galerie d'une ligne • touches page précédente/suivante : faire défiler la galerie d'une page • touches origine/fin : aller au début (haut) et à la fin (bas) de la galerie • molette de la souris : faire défiler la galerie vers le haut et le bas • touches [+] et [-] : augmenter/diminuer la taille des vignettes - ^Images popup de la galerie • Cliquer sur une vignette avec le bouton du milieu de la souris pour une image popup • Cliquer sur une vignette avec maj + clic gauche pour une image popup • Clic gauche sur l'image popup : agrandir l'image • Clic droit sur l'image popup : fermer l'image popup • Molette de la souris : agrandir ou réduire l'image popup • Touche F11 : mettre l'image popup en plein écran • Touche Échap : fermer l'image popup • Plusieurs popups peuvent être utilisés pour comparer des images - - TOPIC: AFFICHAGE DE LA CARTE Affichez des cartes contenant des marqueurs correspondant aux lieux des images. Cliquez sur un marqueur pour obtenir une galerie des images correspondantes. Cela dépend du fait que vos fichiers image contiennent des géocoordonnées intégrées (latitude, longitude). Les appareils photo modernes les insèrent automatiquement, et vous pouvez aussi ajouter ces données vous-même. Une carte du monde est affichée initialement. Utilisez la molette de la souris pour zoomer/dézoomer à n'importe quel endroit. Glissez pour déplacer le centre de la carte. Le monde entier peut être visualisé à n'importe quelle échelle, jusqu'au niveau de la rue. - - TOPIC: GLISSER-DÉPOSER Si vous ouvrez deux sessions Fotocx, vous pouvez glisser-déposer des fichiers de l'une vers l'autre. Faites glisser une vignette de galerie d'une fenêtre vers l'autre. En mode Affichage du fichier, le fichier est ouvert. En mode Affichage de la galerie, le résultat dépend du type de galerie. Si la galerie est un dossier, le fichier est ajouté au dossier et la galerie affichera le nouveau fichier à sa position triée. Si la galerie est un album, le fichier est ajouté à l'album à la position où il est déposé. - - TOPIC: MODIFIER LES PROCÉDURES L'image en mode Affichage du fichier (l'image actuelle) peut être modifiée avec les fonctions de modification des menus Édition, Réparation, Correction, Effets, Déformation et Combiner. Ces fonctions modifient l'image actuelle en mémoire et dans la fenêtre. Au fur et à mesure que vous utilisez ces fonctions, les modifications s'accumulent. Lorsque vous avez terminé la modification, utilisez le bouton de menu [Enregistrer] pour enregistrer l'image modifiée dans le même fichier, dans une nouvelle version (ex. nomfichier.v01.jpg), ou dans un nouveau fichier et/ou dossier. Les boîtes de dialogue de modification d'image comportent des curseurs, des boutons, des boutons rotatifs, ou des courbes modifiables qui mettent à jour l'image immédiatement. - Cliquez à gauche ou à droite sur le bouton Annuler/Rétablir pour annuler ou rétablir la fonction de modification actuellement active. Une fois qu'une image a subi une ou plusieurs modifications, le bouton annuler/rétablir peut être utilisé pour naviguer en avant et en arrière parmi toutes les étapes effectuées afin de voir l'état de l'image après chaque étape. Le bouton du milieu de la souris affiche une liste contextuelle de toutes les modifications effectuées sur l'image actuelle, et vous pouvez sélectionner n'importe quelle étape pour y revenir. L'image peut être remodifiée à partir de n'importe quelle étape précédente. Cela supprimera les modifications effectuées après cette étape, puisqu'elles en découlaient. Cette capacité d'annulation/rétablissement subsiste tant que l'image modifiée reste l'image actuelle. Si une autre image est ouverte, l'historique des modifications est perdu. Si vous voulez conserver la possibilité de revenir à l'état actuel de l'image, enregistrez l'image comme nouvelle version avant de poursuivre avec une autre modification. - - TOPIC: MODIFIER LE FLUX DE TRAVAIL - ^Flux de travail simple La plupart du temps, vous pouvez simplement modifier le fichier JPEG qui sort de l'appareil photo. N'utilisez la procédure plus complexe suivante que si vous voyez des bandes de couleur après des modifications ayant étendu la plage de luminosité dans certaines zones de l'image, rendant les paliers de luminosité assez grands pour être visibles. - ^Flux de travail complexe Pour modifier avec une couleur profonde (plus de 8 bits par couleur RVB), partez du fichier RAW de l'appareil photo. Un fichier RAW peut être modifié comme n'importe quel autre fichier image. Les fonctions de modification de Fotocx fonctionnent avec 24 bits par couleur, de sorte que toute la profondeur de couleur du fichier RAW est préservée. Lorsque vous ouvrez un fichier RAW, le chargeur RAW choisi est utilisé - voir {PARAMÈTRES}. Vous pouvez aussi utiliser la Conversion massive pour convertir plusieurs fichiers RAW en fichiers TIFF, PNG, ou JXL avec 16 bits par couleur. - Dcraw est le chargeur de fichiers RAW par défaut. Vous pouvez aussi utiliser un éditeur RAW plus complexe comme Rawtherapee - voir {PARAMÈTRES}. Dcraw est simple et rapide en comparaison. Les fonctions de modification d'un éditeur RAW peuvent généralement être effectuées plus facilement avec Fotocx. - - TOPIC: PROPRIÉTÉ DE LA SOURIS Certaines boîtes de dialogue de modification utilisent la souris pour référencer ou modifier l'image dans la fenêtre principale. Plusieurs de ces boîtes de dialogue peuvent être actives en même temps. La souris est également utilisée pour zoomer et faire défiler l'image, ce que vous pouvez avoir besoin de faire en utilisant une boîte de dialogue de modification. Il est donc important de comprendre quelle boîte de dialogue ou fenêtre possède la souris, et comment changer cette possession : • Si une boîte de dialogue a le focus clavier, les actions de la souris sur l'image sont des entrées pour cette boîte de dialogue et ne zooment ni ne font défiler l'image. • Si vous maintenez la touche CTRL enfoncée en cliquant ou en faisant glisser la souris sur l'image, l'image zoomera ou fera un panoramique/défilement. Les boîtes de dialogue ouvertes ne sont pas affectées. • La molette de la souris peut zoomer/dézoomer à n'importe quel endroit de l'image. - - TOPIC: SOURIS ALT-CLIC DROIT Pour les pavés tactiles ou écrans tactiles, les clics droits de la souris peuvent être maladroits. Si la touche ALT est maintenue enfoncée en appuyant sur le bouton gauche de la souris, cela est interprété comme le bouton droit de la souris. - - TOPIC: BOUTONS DE DIALOGUE Ils fonctionnent principalement comme suit : • [Réinitialiser] - annuler la modification actuelle, remettre l'image à son état initial • [Appliquer] - appliquer les paramètres de la boîte de dialogue à l'image, laisser la boîte de dialogue active • [OK] - identique à [Appliquer], mais la boîte de dialogue est fermée • [Annuler] - abandonner les modifications de l'image et fermer la boîte de dialogue • [Continuer] - poursuivre une tâche longue basée sur les entrées de la boîte de dialogue • [X] - fermer la boîte de dialogue sans action - - TOPIC: TOUCHE ÉCHAP DU CLAVIER La fenêtre principale a le focus : • si une fonction de longue durée est encore en cours, l'arrêter • si la fenêtre principale est maximisée, restaurer la taille précédente • si la vue actuelle est la galerie ou la carte, passer en affichage du fichier • aucun des cas ci-dessus : quitter Fotocx La fenêtre de dialogue a le focus : fermer la boîte de dialogue (identique au bouton [X]) Autres : annuler l'image popup, quitter la visionneuse de panorama 360, mettre en pause ou quitter le diaporama. - - TOPIC: WIDGETS DE DIALOGUE NON STANDARD +image: custom-widgets.png - Certains widgets non standard sont utilisés pour réduire la taille des boîtes de dialogue ou améliorer la facilité d'utilisation. Ils fonctionnent presque comme les widgets GTK standard. Le widget de données numériques fonctionne comme un bouton rotatif (spin-button) GTK : la molette de la souris et les touches flèche haut/bas du clavier peuvent être utilisées pour faire varier rapidement la valeur vers le haut ou vers le bas. Si vous utilisez un pavé tactile, touchez le champ pour positionner le curseur, puis utilisez le clavier pour saisir une valeur, ou utilisez les touches flèche haut/bas du clavier pour indexer rapidement vers une nouvelle valeur. Si la touche est maintenue enfoncée, la vitesse de changement s'accélère avec le temps. La touche majuscule peut être utilisée pour multiplier la vitesse par 10. Un curseur non linéaire étend l'échelle autour de la valeur neutre, afin que les petits changements puissent être contrôlés plus précisément, en particulier avec un pavé tactile. Quelques widgets GTK standard ont été réduits en taille en supprimant l'espacement excessif. Ceci est contrôlé par le fichier « widgets.css » dans le dossier d'accueil de Fotocx. Vous pouvez modifier ce fichier si vous le souhaitez. Vous pouvez supprimer des éléments ou les marquer comme des commentaires, mais ne supprimez pas le fichier - il serait automatiquement remplacé. - - TOPIC: ÉDITION DE COURBES +image: retouch.png - Certaines fonctions de modification d'image utilisent des courbes modifiables. Vous pouvez manipuler les courbes pour modifier une propriété de l'image en fonction d'une autre propriété. Les courbes peuvent être déplacées (tirées) avec la souris. Un point d'ancrage (point noir) est ajouté à la courbe partout où elle est tirée, et ce point reste fixe - la courbe continuera à passer par ce point lorsque d'autres parties de la courbe sont tirées. Un point d'ancrage peut être déplacé en le faisant glisser, ou supprimé par un clic droit. - - TOPIC: MOUSE PAINTING La souris peut être utilisée pour modifier une image localement. Un cercle autour de la position de la souris délimite une zone d'image qui est modifiée lorsque la souris est glissée avec le clic gauche sur l'image. La source de la modification peut être une fonction de modification, une couleur choisie, ou des pixels provenant d'ailleurs dans la même image ou d'une autre image. Les pixels de l'image à l'intérieur du cercle de la souris sont modifiés pour correspondre à la source. La vitesse de changement peut être rapide ou progressive, selon des facteurs de puissance pour le centre et le bord de la souris. Si le facteur du centre est élevé et celui du bord faible, l'image est modifiée plus rapidement au centre de la souris et de moins en moins progressivement du centre vers le bord. Glissez la souris à plusieurs reprises avec le clic gauche sur la même zone d'image pour accumuler les changements, jusqu'à ce que les pixels correspondent entièrement à la couleur ou à l'image source, ou que la fonction de modification source soit entièrement appliquée. Glissez avec le clic droit pour annuler progressivement les changements, restaurant l'image originale. - Exemple : si la fonction de modification est Retoucher, et que la luminosité est augmentée, alors l'image s'éclaircira dans la zone de la souris lorsque la souris est glissée avec le clic gauche. Utilisez le glissement avec le clic droit pour restaurer progressivement l'image originale. - Le bouton [undo-last] annule la dernière opération de peinture ou d'effacement, et cela peut être répété pour supprimer de nombreuses modifications récentes. Chaque nouvelle opération de glissement de la souris est une unité de travail qui peut être annulée séparément. La mémoire d'annulation est limitée, donc seules les étapes récentes de peinture et d'effacement sont conservées. [undo all] remettra l'image dans son état initial. - Utilisez le bouton [undo/redo] pour vérifier les changements pendant les modifications. - Si une {SÉLECTIONNER UNE ZONE} est active, la peinture est confinée à l'intérieur de la zone. - NOTE : Zoomez l'image à 100 % ou plus lorsque vous utilisez un très petit rayon (ex. lors du dessin de lignes sur l'image). Les pas de mouvement de la souris sont en pixels d'écran. Si cela couvre de nombreux pixels d'image et qu'un petit rayon est utilisé, certains pixels peuvent être sautés par la souris et ne pas être traités. - - TOPIC: TRAITEMENT MASSIF Il existe plusieurs fonctions de traitement massif dans le {MENU TRAITEMENT MASSIF} pour accélérer certaines tâches courantes. Vous pouvez sélectionner de nombreux fichiers image et exécuter la fonction de traitement massif pour tous. Les fonctions de traitement massif peuvent être utilisées pour changer le nom ou le type de fichier, redresser, redimensionner, copier ou déplacer, supprimer, réviser les balises, mots-clés, lieu/géocoordonnées, dates des photos. - - TOPIC: SÉLECTIONNER DES FICHIERS IMAGE +image: select-image-files.jpg - Cette procédure est utilisée pour toutes les fonctions opérant sur plusieurs fichiers image. La procédure est expliquée ici, et ce sujet est lié depuis chaque fonction utilisant cette procédure. • clic gauche sur une vignette : ajouter à la liste de sélection • clic droit : retirer • ajouter plusieurs : cliquer sur la première vignette, maj-clic sur la dernière • bouton [Tout ajouter] : ajouter toute la galerie • bouton [Ajouter l'actuel] : ajouter le fichier actuel • un fichier peut être ajouté plusieurs fois à la liste • naviguer vers d'autres galeries pour sélectionner d'autres fichiers si besoin • bouton [Supprimer] : retirer la position sélectionnée de la liste • bouton [Effacer] : effacer toute la liste • touches flèche haut/bas : parcourir la liste, afficher les vignettes • touches origine/fin : aller au début/à la fin de la liste - Le bouton [Désactiver] désactivera le clic sur les vignettes pour sélectionner des fichiers. Le bouton est alors renommé [Activer] - appuyez dessus pour rétablir le clic sur les vignettes. Le but est d'activer les menus contextuels normaux des vignettes et le clic gauche pour afficher un fichier en taille réelle, ce qui n'est pas possible si les clics sur les vignettes sont utilisés pour la sélection de fichiers. Vous pourriez en avoir besoin pour décider des sélections. Vous pouvez aussi rester en mode affichage du fichier et parcourir les images avec les touches fléchées, tout en utilisant le bouton [Ajouter l'actuel] pour ajouter des fichiers à la liste de sélection. - - TOPIC: RACCOURCIS Il existe trois méthodes de raccourci pour les fonctions fréquemment utilisées : • Clic droit sur la fenêtre principale ou une vignette de galerie. Un menu contextuel affiche certaines fonctions couramment utilisées. • Vous pouvez changer les touches de raccourci et en ajouter de nouvelles. Voir {RACCOURCIS CLAVIER}. • Rassemblez les fonctions fréquemment utilisées dans un menu personnalisé. Voir {MENU PERSONNALISÉ}. - Des raccourcis clavier sont disponibles pour les fonctions les plus courantes. Utilisez le menu Outils > Raccourcis clavier pour les afficher ou les modifier. - Les raccourcis clavier suivants sont fixes et ne peuvent pas être modifiés : • touche [+] [=] : agrandir l'image ou les vignettes • touche [-] : réduire l'image ou les vignettes • touche Z : basculer le zoom : 1x <--> ajuster à la fenêtre • touche F1 : afficher le guide utilisateur pour la fonction actuelle • touche F10 : basculer la fenêtre principale en plein écran et retour • touche F11 : comme F10, sans menus, barre de titre, panneau du haut • touche Échap : arrêter la fonction en cours, quitter la boîte de dialogue active • touche Suppr : boîte de dialogue pour supprimer ou mettre à la corbeille le fichier actuel • Flèche gauche/droite : afficher l'image précédente/suivante dans la galerie • Flèche haut/bas : idem, mais affiche seulement les dernières versions • Page précédente/suivante : affichage galerie : défiler d'une page vers le haut/bas • Origine/Fin : affichage galerie : aller à la première/dernière page de la galerie - Les raccourcis clavier suivants sont des valeurs par défaut modifiables par l'utilisateur : • F : Affichage du fichier - passer en mode affichage du fichier • G : Affichage de la galerie - passer en mode affichage de la galerie • M : Affichage de la carte - passer en mode affichage de la carte • 2 : Cycle 2 fichiers - alterner l'affichage des deux fichiers les plus récents • 3 : Cycle 3 fichiers - alterner l'affichage des trois fichiers les plus récents • A : Album actuel - afficher l'album consulté le plus récemment • T : Retoucher - démarrer la fonction de modification Retoucher • C : Recadrer - démarrer la fonction de modification Recadrer • K : Raccourcis clavier - démarrer la boîte de dialogue des raccourcis clavier • P : Imprimer l'image - ouvrir la boîte de dialogue d'impression d'image • R : Pivoter - démarrer la fonction de modification Pivoter • U : Annuler - annuler la modification actuelle ou la dernière d'une série • Maj+U : Rétablir - rétablir la modification actuelle ou la suivante d'une série • Ctrl+C : Copier dans le presse-papiers - copier le fichier actuel dans le presse-papiers • Maj+C : Activer/désactiver les légendes - alterner afficher/masquer les légendes • Ctrl+G : afficher la galerie du dossier pour le fichier actuel • Maj+G : Activer/désactiver la grille - basculer les lignes de grille activées/désactivées • Ctrl+S : Enregistrer - démarrer la boîte de dialogue d'enregistrement de fichier - - TOPIC: FONCTIONS DE LA SOURIS - ^Affichage du fichier • clic gauche - Zoom avant : agrandir l'image, centré sur la souris • clic droit - Si l'image est zoomée : revenir à la taille de la fenêtre Sinon, menu contextuel avec les fonctions courantes • molette de la souris - zoom avant ou arrière sur l'image • glisser l'image avec le clic gauche - panoramique de l'image zoomée • Ctrl + souris - la souris agit sur l'image, pas sur la boîte de dialogue active - ^Affichage de la galerie • clic gauche sur une vignette - passer en Affichage du fichier • clic droit sur une vignette - afficher le menu contextuel avec les fonctions courantes • clic du milieu sur une vignette - image agrandie en popup, zoomer avec la molette de la souris • molette de la souris - faire défiler la page de la galerie vers le haut ou le bas - ^Affichage de la carte • glisser avec le clic gauche - faire glisser la carte, en suivant la souris • molette de la souris - agrandir ou réduire la carte • clic gauche sur un marqueur - afficher la galerie des images à ce lieu • si la boîte de dialogue de modification des métadonnées est active, un clic gauche définit les géocoordonnées - - TOPIC: PARAMÈTRES DE COMMANDE Ces paramètres peuvent être utilisés si Fotocx est démarré depuis un terminal. -help afficher le guide utilisateur -home /dossier emplacement d'accueil alternatif de Fotocx (voir ci-dessous) -lang xx définir la langue à partir du code à 2 caractères -recent afficher la galerie des fichiers image récents -new afficher la galerie des fichiers image les plus récents -album nomalbum album (galerie) à ouvrir -prev afficher le dernier fichier consulté dans la session précédente -blank afficher une fenêtre vide -dev afficher le menu développeur normalement masqué -menu nommenu Fotocx démarrera avec ce menu actif -cwp nnn nom faire défiler le fond d'écran (voir ci-dessous) -x0 -x1 -x2 définir le niveau d'index à 0, 1, ou 2 (voir ci-dessous) - ^paramètre -x0 -x1 -x2^ (définir le niveau d'index au démarrage) Ces paramètres peuvent être utilisés pour remplacer la valeur des {PARAMÈTRES} -x0 démarrage très rapide, pas d'index d'image -x1 démarrage rapide, indexer uniquement les anciens fichiers -x2 anciens fichiers + recherche des fichiers nouveaux/modifiés - ^paramètre -home^ (dossier d'accueil alternatif de Fotocx) Dossier d'accueil de Fotocx par défaut : /home//.fotocx. C'est là que sont conservés les paramètres utilisateur et l'index d'image. La commande « $ fotocx -home » utilise le dossier désigné. Cela permet de gérer plusieurs collections d'images séparément. Voir aussi {DÉPLACER L'ACCUEIL DE FOTOCX}. - ^paramètre -cwp^ (faire défiler le fond d'écran du bureau) La ligne de commande complète est : $ fotocx -cwp secondes conteneur Utilisez cette commande pour faire défiler l'image du bureau à partir d'un ensemble sélectionné. « secondes » est l'intervalle entre les images. « conteneur » est soit un nom d'album Fotocx, soit un dossier contenant des fichiers image. Ajoutez cette commande à votre liste de démarrage de connexion pour obtenir un nouveau fond d'écran à intervalles spécifiés. Utilisez un intervalle d'un jour ou plus pour obtenir une nouvelle image de fond d'écran à chaque connexion. Fotocx s'exécute en arrière-plan sans interface graphique. Si « secondes » est zéro, une seule mise à jour du fond d'écran sera effectuée puis Fotocx se fermera. Chaque distribution Linux a une commande différente. En théorie, les suivantes sont prises en charge : Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: MENU FICHIER - - TOPIC: NOUVELLE SESSION Démarrer une nouvelle session Fotocx dans une nouvelle fenêtre. Si un fichier image est modifié dans les deux fenêtres, aucune des deux instances ne verra les modifications faites par l'autre, et le résultat final est le dernier fichier enregistré. - - TOPIC: OUVRIR UN FICHIER IMAGE Sélectionner un fichier image à afficher ou modifier, à l'aide d'une boîte de dialogue classique d'ouverture de fichier avec dossiers et listes de fichiers. Ceci est utile lorsque les fichiers ne sont pas indexés et que l'affichage de la galerie est très lent, par ex. lors de la lecture depuis une carte SD d'appareil photo contenant des milliers de fichiers image. - - TOPIC: CYCLE 2 FICHIERS Répéter ce menu alternera entre les deux fichiers ouverts le plus récemment. Cette fonction conserve la taille et la position de zoom de l'image actuelle, ce qui est idéal pour comparer rapidement deux versions modifiées du même fichier image. - - TOPIC: CYCLE 3 FICHIERS Cela fonctionne de la même manière que Cycle 2 fichiers, mais en alternant les 3 derniers fichiers ouverts. - - TOPIC: AFFICHER PANO 360° Le fichier actuel est ouvert avec une visionneuse spéciale pour les fichiers panoramiques à 360°. La largeur de l'image est supposée être de 360°. Utilisez cette fonction pour afficher les images « photosphere » de Google. Faites un panoramique de l'image en glissant la souris ou avec les touches flèche gauche/droite. Zoomez avec un clic gauche/droit de la souris. Utilisez Échap pour quitter la visionneuse spéciale. - - TOPIC: RENOMMER Renommer le fichier actuel (Affichage du fichier), ou le fichier d'une vignette cliquée (Affichage de la galerie). Entrez un nouveau nom et appuyez sur [appliquer]. Cette fonction peut aussi automatiser le processus de renommage d'une série de fichiers image en utilisant un nom racine et un numéro de séquence. Ouvrez le premier fichier image de la série, entrez un nouveau nom, et appuyez sur le bouton [appliquer]. Utilisez le bouton [next] pour passer au fichier suivant si vous le souhaitez. Vous pouvez réutiliser le même nom en appuyant sur le bouton [nom précédent] puis ajouter un suffixe ou un numéro de séquence. Appuyez sur le bouton [add 1] pour incrémenter le numéro de séquence. - - TOPIC: IMAGE VIERGE Créer une image vierge avec des dimensions en pixels et une couleur spécifiées. Cela peut être utilisé comme arrière-plan pour des découpes provenant d'autres images (via {SÉLECTIONNER UNE ZONE}) et du texte d'annotation (via {ANNOTATION} dessiner du texte). - - TOPIC: COPIER/DÉPLACER Le fichier actuel (Affichage du fichier) ou le fichier d'une vignette cliquée (Affichage de la galerie) est copié vers l'emplacement donné. Sélectionnez l'option copier pour copier le fichier et laisser le fichier source en place, créant un doublon. Sélectionnez l'option déplacer pour déplacer le fichier de l'emplacement d'origine vers le nouvel emplacement. Un groupe de fichiers peut être traité rapidement en cliquant sur chaque vignette suivi de [appliquer]. Le bouton [Préc] peut être utilisé pour copier le nom de fichier précédemment utilisé. Ajoutez un numéro de version ou autre chose pour éviter un fichier en double. - - TOPIC: COPIER SUR LE BUREAU Le fichier actuel (Affichage du fichier) ou le fichier d'une vignette cliquée (Affichage de la galerie) est copié dans le dossier bureau (/home//Desktop). - - TOPIC: COPIER DANS LE PRESSE-PAPIERS Le fichier actuel (Affichage du fichier) ou le fichier d'une vignette cliquée (Affichage de la galerie) est copié dans le presse-papiers, à partir duquel d'autres applications peuvent le coller. - - TOPIC: SUPPRIMER/CORBEILLE Le fichier actuel (Affichage du fichier) ou le fichier d'une vignette cliquée (Affichage de la galerie) est supprimé ou mis à la corbeille, selon l'option sélectionnée. Fotocx utilise l'emplacement standard de la corbeille (~/.local/share/Trash). - - TOPIC: DÉFINIR LE FOND D'ÉCRAN Le fond d'écran du bureau est défini à partir du fichier image actuel. - - TOPIC: IMPRIMER L'IMAGE Le menu imprimer l'image affiche une boîte de dialogue standard de mise en page où vous pouvez sélectionner une imprimante, un format de papier, et une orientation. Après avoir utilisé le bouton [appliquer], une autre boîte de dialogue démarre pour saisir les marges de papier et l'échelle de l'image. - Si l'image a des zones sélectionnées, on vous demande si seules les zones doivent être imprimées. Celles-ci seront imprimées en utilisant le rectangle minimum nécessaire pour englober les zones, et les parties hors des sélections ne sont pas imprimées. - - TOPIC: IMPRESSION CALIBRÉE Cette fonction fonctionne comme Imprimer l'image décrite ci-dessus, mais avant l'impression on vous demande de fournir un fichier de calibration qui est utilisé pour ajuster les couleurs de l'image avant l'impression. Le but est de compenser les décalages de couleur causés par l'imprimante et le type de papier. - - TOPIC: CALIBRER L'IMPRIMANTE +image: printer-calibrate-chart.png +image: calibrate-printer.png - Cet utilitaire peut améliorer la précision des couleurs des images imprimées. - ^Comment ça fonctionne Une charte de couleurs est imprimée sur l'imprimante cible. Certaines des couleurs imprimées seront légèrement incorrectes en raison des imperfections de l'imprimante. Cette page imprimée est numérisée dans un fichier, et les couleurs de ce fichier sont comparées aux couleurs originales qui ont été imprimées. Les différences constituent des erreurs désormais connues (en supposant que votre scanner soit plus précis que votre imprimante - généralement vrai). Lorsqu'un fichier image est imprimé, ces erreurs sont soustraites des couleurs de l'image avant l'impression. L'imprimante réintroduit les erreurs, laissant un résultat théoriquement correct. Mon propre test a montré une amélioration modeste, détaillée ci-dessous. - Effectuez les étapes suivantes dans l'ordre, comme indiqué dans la fenêtre de dialogue. Tous les fichiers se trouvent dans le dossier /printer_color. • Générer et imprimer le fichier de la charte de couleurs (printchart.png). Utilisez un grand format de papier, une orientation verticale, sans marges. • Numérisez la charte imprimée dans un fichier PNG. Utilisez 300 ppp ou plus. • Modifiez l'image PNG pour recadrer les marges laissées par le scanner. Enregistrez le fichier image modifié. • Traitez le fichier image modifié pour créer un fichier de carte des couleurs. - Vous pouvez maintenant imprimer en utilisant le menu {IMPRESSION CALIBRÉE}, qui demandera le nom du fichier de carte des couleurs pour l'imprimante et le papier que vous utilisez. - Les scanners peuvent incliner une image numérisée en une forme légèrement non rectangulaire. Si cela se produit, vous le remarquerez en essayant de recadrer les marges : les épaisses lignes de marge vertes ne s'aligneront pas parfaitement avec le rectangle de recadrage. Si cela se produit, utilisez {PERSPECTIVE} pour équarrir d'abord l'image, puis recadrez les marges. - Lors de la modification de l'image de la charte numérisée, assurez-vous que la rangée la plus sombre soit en haut. Recadrez les marges entourant les carreaux de couleur. Utilisez l'épaisse ligne de marge verte entourant les carreaux de couleur comme guide : coupez exactement cette ligne, ne laissant que les carreaux. Travaillez avec un grossissement 2x lors de l'ajustement du rectangle de recadrage. Un recadrage précis est important. Si le recadrage n'est pas précis, les positions calculées des carreaux seront décalées, et les couleurs mesurées pourraient être incorrectes. Une petite erreur est tolérée. Vous pouvez utiliser les touches fléchées du clavier pour des déplacements de 1 pixel dans le rectangle de recadrage. Le dernier coin tiré avec la souris est celui que les touches fléchées déplaceront. - Le fichier de carte des couleurs de sortie ne peut être utilisé que pour les réglages de papier et d'imprimante utilisés lors de la calibration. Toute autre combinaison nécessite sa propre calibration et son propre fichier de carte des couleurs. - ^Résultats^ (mon imprimante Canon) +image: printer-calibrate.jpg +image: printer-cal-study.png - La charte ci-dessus est une photo de trois images : en haut à gauche : impression d'une photo de la charte de couleurs en haut à droite : impression calibrée de la même photo en bas : la charte de couleurs elle-même Comme les 3 images ont été photographiées ensemble, les erreurs provenant de l'appareil photo sont identiques, rendant les comparaisons valides. - - TOPIC: MENU GALERIE - - TOPIC: APERÇU DE LA GALERIE +image: image-management.jpg - Une galerie de vignettes peut représenter un dossier de fichiers, le résultat d'une recherche d'images, l'une des galeries intégrées (fichiers récents, fichiers les plus récents), ou un album (une liste ordonnée de fichiers image portant un nom donné). Les dossiers devraient être limités à quelques milliers de fichiers pour des raisons pratiques et de performance, mais aucune limite n'est imposée. - ^Défilement de la galerie La galerie peut être parcourue vers le haut et le bas à l'aide des touches fléchées haut et bas du clavier, des touches page précédente et page suivante, ou des barres de défilement. Les touches [home] et [end] peuvent aussi être utilisées. Cliquez à gauche et maintenez sur la barre de défilement, et la galerie défilera rapidement jusqu'à la position du clic. Cliquez à droite et maintenez sur la barre de défilement pour faire défiler la galerie lentement jusqu'à la position du clic. Continuez à maintenir le bouton de la souris et déplacez-le sur le côté pour augmenter la vitesse de défilement. - - TOPIC: VUE VIGNETTES Les fichiers image de la galerie actuelle sont affichés sous forme d'un ensemble de vignettes. Utilisez le bouton de menu Zoom ou les touches [+] [-] pour modifier la taille des vignettes. - - TOPIC: AFFICHAGE DES MÉTADONNÉES Les fichiers image de la galerie actuelle sont affichés avec les métadonnées de base utilisées par Fotocx. Si des balises de métadonnées indexées personnalisées sont définies, elles sont affichées après les balises standard. Voir {INDEXER LES FICHIERS}. - - TOPIC: FICHIERS RÉCENTS Les 1000 fichiers image vus le plus récemment sont affichés dans une galerie, à partir de laquelle vous pouvez sélectionner des fichiers à afficher ou à modifier. - - TOPIC: FICHIERS LES PLUS RÉCENTS Les 1000 fichiers image ajoutés ou modifiés le plus récemment sont affichés dans une galerie, à partir de laquelle vous pouvez sélectionner des fichiers à afficher ou à modifier. Vous avez le choix d'utiliser la date de la photo EXIF ou la date de modification du fichier pour déterminer les images les plus récentes. - - TOPIC: TRI DE LA GALERIE Choisissez la clé de tri et l'ordre croissant ou décroissant. La case à cocher Réinitialiser remet toutes les galeries au tri par nom de fichier croissant. - Si une galerie d'album est triée, le résultat ne remplace pas l'album mais crée un nouvel album nommé -trié. - ^Nom/numéro de fichier Il s'agit d'un tri modifié par nom de fichier. Si plusieurs fichiers ont des noms qui ne diffèrent que par des nombres intégrés à la même position, ce groupe de fichiers sera trié selon l'ordre des nombres intégrés. L'exemple ici illustre la différence : ordre alphabétique : xxx1xx xxx11xx xxx123xx xxx3xx ordre numérique : xxx1xx xxx3xx xxx11xx xxx123xx - ^Métadonnées de la fonction de recherche Si la galerie a été générée par l'option « rapport de métadonnées » de {RECHERCHER DES IMAGES}, et si vous avez ajouté des balises de métadonnées optionnelles au rapport standard, vous pouvez trier la galerie par ces balises de métadonnées. Vous pouvez trier la galerie par marque d'appareil photo, informations sur l'objectif, niveau ISO, temps d'exposition ... n'importe quelle métadonnée disponible. - - TOPIC: FILTRE DE GALERIE Sélectionnez un sous-ensemble de la galerie actuelle pour créer un album nommé « gallery_filter » contenant les fichiers image sélectionnés. ^Options de sélection : • tous les fichiers : sélectionner tous les fichiers image • originaux : fichiers originaux (sans numéro de version) • versions : fichiers versionnés (ont été modifiés) • dernières versions : dernières versions (ou originaux s'il n'y a pas de version) • plage d'évaluation : fichiers avec une évaluation dans la plage donnée • noms de mots-clés : fichiers ayant l'un des mots-clés donnés (séparés par des virgules) • texte du nom de fichier : fichiers avec l'une des chaînes de texte données (séparées par des virgules) - - TOPIC: ACCUEIL DE LA GALERIE TOPIC: FIN DE GALERIE Aller à la première ou à la dernière vignette de la galerie actuelle. - - TOPIC: DOSSIER DU FICHIER ACTUEL Définir la galerie actuelle à partir du fichier image actuel. Ceci est pratique si vous voulez revenir à la galerie du fichier actuel après avoir fait autre chose. - - TOPIC: DOSSIERS RÉCENTS Définir la galerie actuelle à partir d'une galerie récemment utilisée. Cela vous permet de naviguer plus facilement entre les galeries récentes. - - TOPIC: ARBORESCENCE DES DOSSIERS +image: folder-tree.png - Tous les dossiers d'images PRINCIPAUX sont affichés au départ. Cliquez sur [+] pour déplier les sous-dossiers, ou sur [-] pour les replier. Vous pouvez cliquer sur n'importe quel dossier pour obtenir une galerie des images de ce dossier. Gardez la fenêtre ouverte pour naviguer n'importe où dans votre collection d'images. Cette fonction est aussi disponible via le bouton [TOP] dans le panneau supérieur de la galerie. - - TOPIC: SÉLECTIONNER DES FICHIERS Présélectionner des fichiers image à utiliser comme entrées pour créer des albums ou pour des fonctions de traitement massif. Ces fonctions utiliseront par défaut les fichiers présélectionnés, mais vous pouvez aussi les modifier ou recommencer. Voir la procédure {SÉLECTIONNER DES FICHIERS IMAGE}. - - TOPIC: SIGNETS Afficher les signets existants. Les signets sont des emplacements choisis (noms de dossier/fichier) avec des noms assignés par l'utilisateur. Cliquez sur un signet pour afficher une galerie de vignettes commençant à cet emplacement. Sélectionnez [Modifier les signets] pour ajouter, supprimer, ou renommer un signet. - - TOPIC: MODIFIER LES SIGNETS Après avoir démarré Modifier les signets, cliquez sur une vignette de galerie pour ajouter cet emplacement à la liste des signets. Le nom de signet attribué sera initialement le nom du fichier de la vignette. Vous pouvez modifier le nom. Si vous sélectionnez un signet existant d'un clic de souris, son nom s'affiche dans le champ de saisie. Vous pouvez changer le nom ou appuyer sur [supprimer] pour retirer le signet. Les nouveaux signets sont insérés après le dernier emplacement de signet sélectionné. Pour changer l'ordre, modifiez le fichier « bookmarks » dans le dossier d'accueil de Fotocx. - - TOPIC: MAPS MENU - - TOPIC: CARTE DU MONDE +image: map-click.jpg - Il s'agit d'une carte du monde en ligne qui peut être mise à l'échelle (zoomée en avant et en arrière) du niveau de la rue au niveau du continent. Utilisez la molette de la souris pour zoomer la carte en avant/arrière. Glissez la carte pour changer le centre. La carte comporte des marqueurs (points rouges) correspondant aux images ayant des géocoordonnées dans leurs métadonnées. Cliquez sur un marqueur pour obtenir un Affichage de la galerie des images à cet emplacement. Les images situées dans la zone du marqueur sur la carte sont sélectionnées. La zone effective du marqueur s'adapte à l'échelle de la carte. Zoomez pour agrandir l'échelle et éventuellement séparer un marqueur en plusieurs marqueurs proches. - - TOPIC: AFFICHER SUR LA CARTE Afficher la position du fichier image actuel sur la carte du monde. Si plusieurs marqueurs se chevauchent, zoomez jusqu'à ce qu'un seul marqueur soit au centre. - - TOPIC: MENU ALBUMS - - TOPIC: ALBUMS Un album est un ensemble arbitraire d'images assemblé manuellement à partir d'images existantes. Un album est une liste de ses fichiers image membres. Les fichiers image eux-mêmes ne sont ni copiés ni modifiés. Un fichier image donné peut être membre de plusieurs albums, ou peut être présent plus d'une fois dans un album. Vous pouvez ajouter et retirer des images dans un album ou réorganiser leur ordre. Une fois qu'un album est créé, vous pouvez le sélectionner par son nom et il s'affiche comme une galerie. - - TOPIC: CRÉER UN ALBUM Entrez un nom pour un nouvel album. Vous pouvez créer un album vide, un album avec des fichiers image présélectionnés depuis {SÉLECTIONNER DES FICHIERS}, un album avec des images de la galerie actuelle, ou vous pouvez sélectionner les images initiales de l'album. - - TOPIC: RENOMMER L'ALBUM Choisissez un album existant et entrez un nouveau nom. - - TOPIC: SUPPRIMER L'ALBUM Choisissez un album existant et supprimez-le définitivement. - - TOPIC: CHOISIR UN ALBUM Une liste des albums disponibles est présentée. Choisissez dans la liste. - - TOPIC: ALBUM ACTUEL Définir la galerie à partir de l'album actuel (le plus récemment utilisé). - - TOPIC: GALERIE VERS ALBUM Enregistrer la galerie actuelle comme album. Sélectionnez un nom d'album existant [Parcourir], ou entrez un nouveau nom. - - TOPIC: MODIFIER L'ALBUM Faites un clic droit sur une vignette d'album et sélectionnez dans le menu contextuel : • Ajouter les fichiers sélectionnés ici - les fichiers précédemment sélectionnés sont ajoutés ici (cliquez sur le côté gauche/droit de la vignette pour ajouter avant/après la vignette). • Ajouter le fichier actuel (Affichage du fichier) ici - fonctionne de la même manière. • Retirer de l'album - le fichier cliqué est retiré de l'album. - ^Glisser-déposer Vous pouvez réorganiser les images d'un album en faisant glisser les vignettes avec la souris. Faites glisser la vignette jusqu'à ce que le curseur de la souris se transforme en une petite image de vignette. Continuez à faire glisser cette image jusqu'à la position où elle doit être insérée, et relâchez le bouton de la souris. Positionnez la souris approximativement entre les vignettes où l'image glissée doit être insérée. Si le glissement approche le bord supérieur ou inférieur de la fenêtre, la galerie défilera pour faire apparaître plus d'images. Vous pouvez utiliser deux sessions Fotocx pour accélérer la sélection ou le déplacement de nombreuses images. Glissez-déposez des images depuis n'importe quelle galerie source vers une position cible dans l'album. - Si vous renommez ou déplacez un fichier avec Fotocx, tous les liens d'album sont mis à jour et le fichier reste dans les albums qui le contiennent. Si vous faites cela en dehors de Fotocx, les liens d'album sont perdus et le fichier disparaît de l'album. - Si des fichiers image sont renommés ou déplacés avec Conversion massive ou Copie/déplacement massif, veillez à sélectionner l'option pour remplacer les fichiers d'album si c'est ce que vous voulez. Sinon, vous devrez les remplacer un par un. - Ne renommez pas de dossiers s'ils contiennent des images présentes dans des albums. Les liens d'album seraient perdus. Utilisez plutôt Conversion massive ou Copie/déplacement massif pour déplacer les fichiers image vers le nouveau dossier, puis supprimez l'ancien dossier s'il est vide. Pour supprimer des fichiers image, utilisez Suppression/corbeille massive. Cela purgera aussi les fichiers supprimés des albums. - - TOPIC: METTRE À JOUR LES ALBUMS +image: album-replace-file.png - Remplacer les fichiers d'album spécifiés par des remplacements spécifiés, ou ajouter de nouveaux fichiers spécifiés après des fichiers existants spécifiés. Sélectionnez un ou plusieurs albums à traiter. En affichage galerie, cliquez sur deux vignettes pour spécifier « ancien fichier » et « nouveau fichier » dans la boîte de dialogue ci-dessus. Sélectionnez l'option : « nouveau fichier » remplace « ancien fichier » partout où il se trouve, ou « nouveau fichier » est ajouté aux albums après « ancien fichier ». Appuyez sur [proceed] pour traiter les albums. Après le traitement, la boîte de dialogue se répète avec les mêmes albums sélectionnés et la même option « remplacer ou ajouter ». Vous pouvez sélectionner deux autres fichiers et appuyer sur [proceed]. - - TOPIC: MISE À JOUR MASSIVE D'ALBUM +image: album-mass-update.png - Ceci est un utilitaire de mise à jour massive dont vous pourriez avoir besoin après avoir créé de nouvelles versions pour de nombreux fichiers image et devoir mettre à jour un ou plusieurs albums vers les nouvelles versions. Cela ne couvre pas tous les besoins, ce qui est sans doute impossible, mais réduira, on l'espère, le besoin de modifier un fichier à la fois. - Sélectionnez un ou plusieurs albums puis sélectionnez l'une des options de traitement : • Remplacer tout par la version la plus récente uniquement : les albums sont mis à jour pour n'avoir que les versions de fichiers les plus récentes. • Remplacer toutes les versions par la plus récente : toutes les versions de fichiers sont remplacées par la version la plus récente uniquement. Le fichier original, s'il est présent, n'est PAS remplacé. • Ajouter la version la plus récente aux versions existantes : la version la plus récente est ajoutée aux versions existantes, si elle est manquante. • Remplacer tout par l'original et toutes les versions : tous les fichiers sont remplacés par le fichier original et toutes les versions. • Remplacer tout par la version originale et la plus récente : tous les fichiers sont remplacés par le fichier original et la version la plus récente. • Remplacer tout par les versions sélectionnées (*) : tous les fichiers sont remplacés uniquement par les versions sélectionnées. Cela inclut le fichier original (sans version). • Remplacer toutes les versions par les versions sélectionnées (*) : toutes les versions de fichiers sont remplacées uniquement par les versions sélectionnées. Le fichier original, s'il est présent, n'est PAS remplacé. • Ajouter les versions sélectionnées aux versions existantes (*) : la version sélectionnée est ajoutée aux versions existantes, si elle est manquante. • Remplacer tout par l'original et les versions sélectionnées (*) : tous les fichiers sont remplacés par les fichiers originaux et les versions sélectionnées. - (*) Les quatre options utilisant des fichiers sélectionnés : la liste des fichiers sélectionnés provient de la fonction {SÉLECTIONNER DES FICHIERS}. Les fichiers d'album qui ne correspondent à aucun fichier sélectionné restent dans l'album. Seuls les fichiers correspondant à un fichier sélectionné sont modifiés selon les règles ci-dessus. La correspondance se base sur le nom de fichier sans version ni extension : « asdfg.png » et « asdfg.v01.jpg » correspondent. - Exemple : Remplacer toutes les versions par les versions sélectionnées : si l'album contient filename.jpg et filename.v02.png, et que la liste des fichiers sélectionnés contient filename.v04.jpg, le résultat dans l'album mis à jour sera : filename.jpg et filename.v04.jpg - - TOPIC: DIAPORAMA +image: slide-show.jpg - ^Mise à l'échelle fractionnaire du moniteur Sur certains systèmes, la mise à l'échelle fractionnaire cause des problèmes de performance pour les animations du diaporama de Fotocx. Désactivez-la et utilisez d'autres moyens pour augmenter la taille de police des applications, si besoin. Pour Fotocx, la taille de police se trouve dans le menu {PARAMÈTRES}. - Dans la boîte de dialogue du diaporama (en haut à gauche), appuyez sur [Sélectionner un album] et choisissez un album dans la liste fournie. Modifiez les autres paramètres de la boîte de dialogue comme souhaité, puis appuyez sur le bouton [Démarrer] pour démarrer le diaporama avec la première image de l'album, ou [Reprendre] pour reprendre un diaporama en pause, ou une autre image sélectionnée en cliquant sur sa vignette. Utilisez la touche Échap pour quitter le diaporama et revenir à la boîte de dialogue. - Contrôles de la boîte de dialogue principale • Temps de légende : secondes pour afficher le titre et la description. • Temps d'image : secondes pour afficher l'image seule. • Limite d'écrêtage % : recadrer les images jusqu'à ce montant pour éliminer les marges. • Plein écran : si coché, les images sont affichées en plein écran sans menu, etc. • Lecture automatique : si coché, le diaporama recommencera après la fin. • Image aléatoire : si coché, utiliser un ordre d'image aléatoire. Sinon l'ordre de l'album. - Des touches du clavier peuvent être utilisées pour contrôler le diaporama. Appuyez sur [clavier] pour les afficher. - Les touches clavier suivantes sont assignées à des actions et ne peuvent pas être modifiées : • Échap : interrompre le diaporama et revenir à la boîte de dialogue principale. • Touches flèche gauche/droite : vous pouvez avancer et reculer à tout moment et le diaporama continuera à partir de là. - Les transitions animées entre les images, ainsi que les durées d'affichage et le comportement de zoom des images individuelles, peuvent être personnalisés à l'aide des boîtes de dialogue expliquées ci-dessous. - Appuyez sur [transitions] pour démarrer une boîte de dialogue permettant de sélectionner et de personnaliser les transitions entre les images. Celles-ci comprennent de nombreuses méthodes animées de remplacement d'image (ex. la nouvelle image se développe depuis le centre pour remplacer l'ancienne image). Sélectionnez les transitions à utiliser et si elles sont utilisées aléatoirement ou en séquence. Le paramètre de temps définit la durée de la transition. Les paramètres de préférence spécifient une préférence relative qui influencera la fréquence d'utilisation de la transition lorsque la séquence aléatoire est sélectionnée. - Les boutons [charger] et [enregistrer] vous permettent d'enregistrer les paramètres de transition dans un fichier et de les charger plus tard. Ces fichiers sont indépendants des fichiers de diaporama. Un diaporama utilisera par défaut les paramètres de transition utilisés en dernier pour ce diaporama (nom d'album), mais vous pouvez toujours les remplacer en utilisant le bouton [charger] pour charger d'autres paramètres, ou en les modifiant dans la boîte de dialogue. - Appuyez sur [fichiers image] pour démarrer une boîte de dialogue pour les Préférences de l'image (en haut à droite). Celles-ci sont optionnelles. Une image est sélectionnée pour la personnalisation en cliquant sur sa vignette dans l'affichage album/galerie. La boîte de dialogue est remplie avec les paramètres par défaut ou les paramètres précédents pour cette image dans ce diaporama. Entrez les révisions et appuyez sur [done], ou cliquez sur l'image suivante à personnaliser. - Préférence : si la séquence d'images aléatoire est choisie, ce nombre donne une préférence relative pour l'image. La valeur neutre est 10. Entrez une nouvelle valeur pour augmenter ou diminuer la probabilité que ce fichier soit choisi dans la séquence aléatoire d'images, par ex. une valeur de 20 rendrait la probabilité 2x plus grande. Une valeur de zéro empêcherait l'image d'être affichée. L'image est aussi bloquée pendant un nombre égal à 1/3 des images de l'album, ou 10, selon la plus petite valeur. - La boîte de dialogue affiche les événements d'image personnalisables dans l'ordre chronologique : • attendre un temps spécifié (peut être zéro). • afficher en parallèle les balises de texte suivantes : nom de l'image (nom de fichier de base) pendant un temps spécifié, titre de l'image, le cas échéant, pendant un temps spécifié, description de l'image, le cas échéant, pendant un temps spécifié. • attendre un temps spécifié avant de démarrer un zoom d'image (peut être zéro). • zoomer l'image de la taille normale à agrandie ou l'inverse, sur le temps spécifié. Si aucune option n'est sélectionnée, il n'y a pas de zoom. • zoom avant : commencer à la taille normale, agrandir l'image tout en déplaçant le centre du zoom vers la position spécifiée. • zoom arrière : commencer à la taille agrandie au centre de zoom spécifié, réduire l'image à sa taille normale. • [zoom center] - appuyez sur ce bouton, puis cliquez sur la vignette de l'image pour spécifier le centre du zoom pour l'image. • attendre un temps spécifié après le zoom (peut être zéro) (la valeur par défaut est le paramètre « temps d'image » de la boîte de dialogue principale). • transition vers l'image suivante, en utilisant la transition spécifiée ou « suivant » pour indiquer aucune préférence (sélection aléatoire). - - TOPIC: MENU PERSONNALISÉ +image: custom-menu.png - Cela vous permet de rassembler des fonctions fréquemment utilisées de plusieurs menus en un seul menu personnalisé. Vous pouvez aussi ajouter des entrées pour ouvrir des fichiers image ou des albums spécifiques. Le menu comprend aussi des fonctions de script et des fonctions de plugin (voir ci-dessous). - La dernière entrée du menu, Modifier le menu, ouvre un éditeur de texte pour modifier la liste du menu elle-même. Les noms de menu doivent correspondre exactement aux noms des menus de Fotocx, mais la casse n'est pas significative. - Les entrées de menu peuvent prendre les formats suivants : • # texte de commentaire : un commentaire qui ne fait rien • nommenu # info-bulle : nom du menu Fotocx et info-bulle optionnelle • file : ouvrir le fichier nommé • album : ouvrir l'album nommé comme galerie - Les entrées suivantes sont présentes par défaut et vous ne devriez pas les modifier ou les supprimer : Modifier le script, Exécuter le script, Script massif, Plugins, Modifier le menu. Les détails sont expliqués ci-dessous. - - TOPIC: FICHIERS DE SCRIPT Fonctions de menu : • Modifier le script - effectuer un ensemble de modifications sur un fichier image, en enregistrant toutes les fonctions et paramètres dans un fichier de script nommé. • Exécuter le script - exécuter un fichier de script en utilisant le fichier image actuel, comme une fonction de modification. • Script massif - sélectionner un nombre quelconque de fichiers image et exécuter un fichier de script sur tous, en mode massif. - Les fichiers de script vous permettent de définir un ensemble de modifications une seule fois, et de les répéter sur un ou plusieurs fichiers image plus tard. - ^Fonctions de modification scriptables Certaines fonctions de modification utilisent des glissements de souris sur l'image, par ex. toutes les fonctions de déformation. Elles ne sont pas scriptables car les glissements de souris ne sont pas enregistrés. L'utilisation de ces fonctions est bloquée. - Les fonctions suivantes sont actuellement scriptables : • Édition : Retoucher, Marges, Mode couleur, Remplissage de zone • Réparation : Netteté, Flou normal, Flou progressif, Réduction du bruit, Anti-brume, Artefacts JPEG, Anti-crénelage, Ajuster RVB • Correction : Aplatir l'histogramme, Contraste local, Amplifier le contraste, Retinex global, Retinex local, Contraste local, Saturation, Flou artistique, Dégradé de luminosité • Effets : Contours, Croquis, Dessin animé, Relief, Tuiles1, Tuiles2, Peinture, Texture, Motif, Tramage, Gravure, Définir les couleurs, Décaler les couleurs, Noyau personnalisé - - TOPIC: MODIFIER LE SCRIPT Dans la boîte de dialogue, appuyez sur [démarrer]. Choisissez un nom de fichier pour le script. Commencez à modifier le fichier image actuel. Utilisez les fonctions de modification souhaitées dans n'importe quel ordre. Chaque modification est enregistrée dans le fichier de script avec tous les paramètres de dialogue utilisés. Une fois terminé, appuyez sur [close] pour fermer le fichier de script et l'enregistrer sous le nom de fichier donné. - - TOPIC: EXÉCUTER LE SCRIPT Choisissez l'un de vos fichiers de script enregistrés dans le menu contextuel. Le script est exécuté en utilisant le fichier image actuel, comme une fonction de modification normale. - - TOPIC: SCRIPT MASSIF Dans la boîte de dialogue, appuyez sur [Sélectionner des fichiers]. Sélectionnez les fichiers à modifier en utilisant la boîte de dialogue standard de sélection de fichiers {SÉLECTIONNER DES FICHIERS IMAGE}. Une fois terminé, appuyez sur [Sélectionner un script]. Choisissez un fichier de script dans le menu contextuel. Le script est maintenant exécuté sur tous les fichiers choisis. Toutes les images modifiées sont enregistrées comme nouvelles versions. Si des fichiers RAW sont traités, les sorties correspondantes sont des fichiers TIFF-16. - - TOPIC: PLUGINS +image: plugins.png - Les fonctions de plugin sont un moyen d'utiliser d'autres éditeurs d'images au sein de Fotocx, par ex. Gimp. Vous pouvez utiliser un éditeur RAW comme Rawtherapee puis effectuer des modifications supplémentaires avec Fotocx. - ^Procédure d'utilisation : • Ouvrir le fichier à traiter dans Fotocx • Démarrer le menu des plugins et sélectionner le programme souhaité, par ex. Gimp • Le programme du plugin démarre et ouvre le fichier transmis par Fotocx • Effectuer les modifications souhaitées avec le programme du plugin • Une fois terminé, enregistrer le fichier de sortie sous le même nom que le fichier d'entrée. L'extension .ext peut changer. • Fermer le programme du plugin. • Fotocx ouvre le fichier de sortie du plugin comme version modifiée du fichier actuel. • Effectuer des modifications supplémentaires, ou enregistrer le fichier modifié comme nouvelle version ou nouveau fichier. - Un exemple de menu Plugins figure à gauche. La dernière entrée « Modifier les plugins » démarre l'application d'édition de texte à droite. Utilisez l'éditeur de texte pour définir les noms des menus de plugins et les commandes pour démarrer les programmes de plugin correspondants. Le format est : nommenu = commande-plugin %s TIP = explication de la commande ci-dessus La « commande-plugin » est la commande shell pour la fonction de plugin, et « %s » est l'endroit où le nom du fichier actuel est inséré dans la commande. Ne mettez pas de guillemets autour de « %s » car cela est ajouté automatiquement, permettant de traiter les noms de fichiers avec des espaces ou d'autres caractères spéciaux. L'exemple du haut affiché est un menu nommé « Gimp » qui démarre la commande « gimp %s ». Le texte TIP est optionnel. S'il est présent, il se trouve sur la ligne suivant le nom du menu. Survoler l'entrée de menu avec la souris affichera ce texte à côté du texte du menu. - Certaines commandes peuvent nécessiter que les fichiers d'entrée et de sortie soient tous deux spécifiés. Dans ce cas, fournissez « %s » aux deux positions. Omettez « %s » si la commande ne traite pas de fichier image. - ^Sélectionner une zone Si le fichier d'entrée a une zone sélectionnée, seule cette zone sera modifiée. La fonction de plugin modifie l'image entière, mais lorsque le résultat est traité par Fotocx, seuls les changements dans la zone sélectionnée sont conservés. - - TOPIC: ZOOM - ^Bouton Zoom Cliquez à gauche ou à droite sur le bouton pour augmenter ou diminuer la taille de l'image en {AFFICHAGE DU FICHIER} ou la taille des vignettes en {AFFICHAGE DE LA GALERIE}. Ceci s'applique seulement si le mode d'affichage de la galerie est {VUE VIGNETTES}. Si {AFFICHAGE DES MÉTADONNÉES}, rien n'est fait. - - TOPIC: PRÉC/SUIV - Cliquez à gauche ou à droite sur le bouton pour ouvrir le fichier précédent ou suivant dans la galerie actuelle. Vous pouvez aussi utiliser les touches flèche gauche/droite. - - TOPIC: ENREGISTRER LE FICHIER - +image: file-save.png - +image: file-save-as.jpg - Dans la première boîte de dialogue, sélectionnez « nouvelle version », « nouveau fichier », ou « remplacer le fichier ». - ^Nouvelle version Enregistrer le fichier image actuel avec un nouveau numéro de version. Les noms de fichiers avec numéros de version sont formatés « nomfichier.vNN.ext » où NN est un nombre de 01 à 99. Si le nom de fichier n'a pas de version, la version .v01 sera créée. Si des versions du fichier existent déjà sur le disque, le numéro de version supérieur suivant est utilisé. Si le fichier est un fichier JPEG, la qualité par défaut est utilisée - voir {PARAMÈTRES}. - ^Nouveau fichier La 2e boîte de dialogue montrée ci-dessus s'ouvrira pour enregistrer l'image actuelle vers un fichier sélectionné, qui peut être le fichier original, un autre fichier existant, ou un nouveau fichier. Un fichier peut être enregistré aux formats JPEG, PNG, JXL et TIFF. - Pour JPEG, vous pouvez choisir une valeur de qualité dans la plage 1-100. Des valeurs plus basses donnent des fichiers plus petits et une qualité d'image moindre. Les valeurs au-dessus de 70 sont difficiles à distinguer de 100 (qualité la plus haute, taille de fichier la plus grande). La qualité JPEG par défaut est utilisée sauf si vous changez la valeur dans la boîte de dialogue. La valeur par défaut provient de {PARAMÈTRES}. Vous ne pourrez pas voir de différence entre un fichier enregistré avec une qualité de 70 et un avec 100, mais la différence d'espace de fichier est énorme. Les zones transparentes seront noires. JPEG ne prend pas en charge la transparence. - Les fichiers PNG et TIFF sont compressés sans perte de qualité et beaucoup plus volumineux que JPEG. Ils peuvent être enregistrés avec 8 ou 16 bits par couleur. - Si « rendre actuel » est coché, le fichier enregistré (nouveau nom de fichier) deviendra le fichier actuel. - ^Remplacer le fichier Enregistrer le fichier image actuel dans lui-même. - Les ^autorisations^ sont copiées depuis le fichier d'entrée. Appuyez sur le bouton [Modifier] pour modifier les autorisations. - - TOPIC: MENU MÉTADONNÉES - - Les métadonnées sont des données textuelles stockées à l'intérieur d'un fichier image. Les appareils photo numériques créent automatiquement certaines métadonnées, comme la date et l'heure, des données techniques sur l'appareil et les paramètres de la photo, et des données de lieu (si l'appareil dispose d'un récepteur GPS). D'autres données peuvent être ajoutées par l'utilisateur, par ex. un titre, une description, une évaluation, des mots-clés. Fotocx peut rechercher dans votre collection d'images en utilisant n'importe quelle métadonnée, ainsi que les noms de dossiers et de fichiers ou des noms partiels, produisant une galerie d'images correspondantes. Dans la plupart des cas, la recherche est presque instantanée. - - TOPIC: AFFICHER LES MÉTADONNÉES PRINCIPALES TOPIC: AFFICHER TOUTES LES MÉTADONNÉES +image: view-metadata.jpg - La fonction Afficher les métadonnées principales affiche les métadonnées couramment utiles pour le fichier image actuel. Cela comprend la date et l'heure d'une photo, la vitesse d'obturation, la distance focale, la taille de l'image, l'ISO, etc. Les appareils photo numériques stockent ces données dans l'image. Les métadonnées peuvent aussi contenir des données ajoutées par un utilisateur : mots-clés, titre ou légende, description, commentaires ajoutés par le photographe ou un éditeur ultérieur (parfois trouvés dans les images publiées). - Si une image est modifiée, un enregistrement de la modification est sauvegardé dans les métadonnées. Afficher les métadonnées principales montre l'historique des modifications effectuées. - Afficher toutes les métadonnées rapporte toutes les métadonnées disponibles, et peut inclure plus de 100 éléments dont vous ne vous souciez probablement pas. - Le bouton [Extras] sur la fenêtre Afficher les métadonnées principales ouvre la boîte de dialogue affichée à droite, où vous pouvez ajouter des balises supplémentaires au rapport. Toute balise disponible dans le rapport Afficher toutes les métadonnées peut être ajoutée au rapport court. Cliquez sur une balise dans la colonne de gauche pour l'ajouter à la colonne de droite et au rapport. Cliquez sur une balise dans la colonne de droite pour la retirer. Cliquez sur l'entrée « Autre balise ... » pour saisir n'importe quel nom de balise non contenu dans la liste par défaut, qui est limitée aux balises les plus probablement nécessaires. - Fotocx utilise ces balises de métadonnées pour la modification et la recherche d'images : • Titre - titre court de l'image • Description - description de l'image • Date/heure d'origine - date/heure de la photo • Évaluation - de 0 à 5 étoiles • Pays - depuis le GPS de l'appareil ou ajouté manuellement • Lieu - le nom EXIF est la ville • Géomarquages - latitude/longitude • Mots-clés - identifiants de l'image donnés par l'utilisateur • Données de l'appareil - marque, modèle, objectif • Données d'exposition - temps, ouverture, distance focale, ISO Ces balises sont modifiées à l'aide de la fonction {MODIFIER LES MÉTADONNÉES PRINCIPALES}. Toutes les autres balises peuvent aussi être modifiées et recherchées, en utilisant des méthodes moins pratiques expliquées ci-dessous. - Il existe aussi plusieurs fonctions de traitement massif pour ajouter des données à de nombreux fichiers image à la fois. Voir {MENU TRAITEMENT MASSIF}. - - TOPIC: APERÇU DES MOTS-CLÉS Les fichiers image peuvent avoir des mots-clés d'identification ou de classification. Ceux-ci peuvent être utilisés pour rechercher dans une grande collection d'images les images ayant les mots-clés souhaités. Mots-clés typiques : sujet, événement, lieu, personnes ou choses, etc. Les mots-clés résident à l'intérieur des métadonnées de l'image. Les mots-clés sont normalement d'un seul mot, mais une courte expression avec des espaces ou d'autres délimiteurs intégrés peut être utilisée. Les virgules et points-virgules sont utilisés comme délimiteurs entre les mots-clés, et ne peuvent donc pas être utilisés à l'intérieur d'un mot-clé (une norme externe). Un mot-clé composé comme « arizona scenery » est autorisé, mais vous devriez utiliser deux mots-clés à la place pour plus de flexibilité : vous pouvez rechercher des images ayant l'un ou l'autre mot-clé ou les deux. - Toutes les images ayant un ou plusieurs mots-clés souhaités peuvent être trouvées rapidement et affichées dans une fenêtre galerie. Si vous avez utilisé les noms de dossiers et de fichiers de manière significative, vous pouvez aussi rechercher des images en utilisant ces noms. Vous pouvez aussi rechercher des images par date, évaluation, lieu, et d'autres balises de métadonnées. Celles-ci n'ont pas besoin d'être dupliquées dans les mots-clés. Voir {RECHERCHER DES IMAGES} ci-dessous. - ^Système de mots-clés géré Ceci est approprié si vous souhaitez planifier votre système de mots-clés avant d'ajouter des mots-clés à vos images. Dans ce système, vous créez un nombre limité de catégories de mots-clés (ex. personnes, lieux, choses, événements, art, paysages ...). Les mots-clés peuvent être créés et assignés à une catégorie selon les besoins lorsque des mots-clés sont assignés aux images. Une image reçoit un mot-clé en pointant et cliquant sur la liste des mots-clés disponibles, qui est organisée par catégorie et alphabétiquement au sein de chaque catégorie. Si un nouveau mot-clé est nécessaire, il est créé lors de sa première assignation à une image. Le nombre de mots-clés au sein d'une catégorie devrait idéalement être inférieur à environ 200, afin que la localisation visuelle depuis une liste de sélection soit raisonnablement rapide. - ^Avantages du système de mots-clés géré • empêche les noms de mots-clés incohérents (ex. « paysage » et « scenery ») • empêche les orthographes alternatives et les fautes de frappe (ex. susan, susy, susna) • empêche les mots-clés qui incluent d'autres mots-clés (ex. paysage, lac) • la recherche est plus fiable car les mots-clés n'ont pas les erreurs ci-dessus • lors de l'assignation de mots-clés, vous avez une vue d'ensemble des mots-clés disponibles, plutôt que des milliers de mots-clés chaotiques dans un système non géré - Choisir des mots-clés dans une longue liste peut être lent. Ceci est atténué de 3 façons : • Jusqu'à environ 10 mots-clés utilisés le plus récemment sont affichés dans la boîte de dialogue de modification des métadonnées, où ils peuvent être facilement vus et choisis. Comme une série de photos prises en même temps partagera probablement de nombreux mots-clés, l'ajout de mots-clés est rendu plus facile et plus rapide. • Vous pouvez simplement commencer à taper le nom d'un mot-clé souhaité. Une liste contextuelle de mots-clés correspondants apparaît dès qu'il n'y a que quelques correspondances possibles. Vous pouvez alors cliquer sur le mot-clé souhaité pour l'ajouter à l'image. S'il n'y a aucun mot-clé correspondant, vous avez la possibilité d'ajouter le nouveau mot-clé à la liste des mots-clés définis. • Vous pouvez choisir une catégorie pour afficher une liste de sélection plus courte. - Si les mots-clés sont largement définis et moins nombreux, les résultats de recherche pour les mots-clés seront plus grands, mais trouver les images souhaitées visuellement peut être assez rapide. L'ordre physique des fichiers est préservé : les fichiers image situés ensemble dans leurs dossiers apparaîtront aussi ensemble dans les résultats de recherche. - Les images téléchargées depuis internet contiennent souvent des mots-clés. Ceux-ci n'ont bien sûr aucune organisation et sont collectivement chaotiques. Si vous utilisez un système de mots-clés géré, il est préférable de revoir ces images et de nettoyer les mots-clés pour qu'ils soient conformes à votre système, ou de les supprimer. Tout nouveau mot-clé présent sera automatiquement ajouté sous la catégorie « nocatg ». Si vous remarquez des mots-clés indésirables dans votre liste de mots-clés, utilisez {RECHERCHER DES IMAGES} par mot-clé pour trouver les images ayant des mots-clés indésirables afin qu'ils puissent être corrigés ou supprimés. - ^Système de mots-clés aléatoire Vous préférerez peut-être inventer des mots-clés selon les besoins sans système particulier en tête. Ou vous avez peut-être déjà des milliers de mots-clés, rendant une conversion vers un système de mots-clés géré difficile (mais pas impossible : Fotocx peut convertir les noms de mots-clés en masse). Dans ce cas, vous pouvez simplement taper des mots-clés dans vos images, en créant de nouveaux mots-clés selon les besoins. Il existe encore une certaine capacité à garder les mots-clés organisés : les mots-clés existants correspondant aux caractères saisis sont affichés dès qu'il n'y a que quelques correspondances possibles. Exemple : vous tapez « new » et une liste de mots-clés s'affiche : New York, New Delhi, Newman ... Si l'un d'eux correspond à votre intention, cliquez dessus pour sélectionner le mot-clé. Sinon, continuez à taper et appuyez finalement sur Entrée pour créer un nouveau mot-clé. Lors de la recherche d'images par mots-clés, vous pouvez taper les noms de mots-clés souhaités ou les choisir dans la liste des mots-clés disponibles. Les mots-clés disponibles correspondant aux premières lettres saisies sont affichés, et vous pouvez choisir dans cette liste. Vous ne pouvez pas saisir un mot-clé de recherche qui n'existe nulle part dans vos images. Un système de mots-clés aléatoire aboutira probablement à des milliers de mots-clés. Cela peut ne pas être très utile. - - TOPIC: GEOTAGS OVERVIEW Les appareils photo modernes peuvent enregistrer le lieu de chaque photo, à l'aide d'un récepteur GPS interne. La latitude, la longitude (et éventuellement la ville/le lieu et le pays) sont enregistrés dans les métadonnées EXIF du fichier image. La fonction {MODIFIER LES MÉTADONNÉES PRINCIPALES} permet aussi de saisir ou de réviser les données de lieu. Les lieux peuvent aussi être spécifiés en cliquant sur une carte du monde zoomable. Fonctions pour trouver des images à un lieu ou une région spécifiés : • {RECHERCHER DES IMAGES} : rechercher par nom de lieu (aussi plusieurs noms, correspondances partielles). • {LIEUX/DATES} : rechercher par groupes de pays, lieu, et date • Images par lieu sur la carte : cliquer sur un marqueur de carte pour afficher toutes les images à ce lieu. - Les noms de lieux (ville ou autre nom de lieu, et pays) provenant du GPS de l'appareil ne sont pas standardisés et peuvent être chaotiques (ex. Munich, München, MONACO). La manière de traiter cela est abordée ci-dessous. - - TOPIC: MODIFIER LES MÉTADONNÉES PRINCIPALES +image: edit-meta.jpg - La fonction Modifier les métadonnées principales est utilisée pour ajouter des métadonnées de base à une image. Veuillez lire {APERÇU DES MOTS-CLÉS} et {GEOTAGS OVERVIEW} (ci-dessus) avant d'utiliser Modifier les métadonnées principales. - Modifier les métadonnées principales est utilisé pour modifier les métadonnées les plus fréquemment utilisées : date et heure de l'image, évaluation, titre, description, données de lieu, et mots-clés. La boîte de dialogue affiche initialement les données de l'image actuelle. Après avoir fait des ajouts ou des modifications, appuyez sur [Appliquer] pour mettre à jour le fichier image. Il n'y a pas de versionnement automatique de fichier pour les modifications de métadonnées, mais vous pouvez utiliser Enregistrer le fichier > Nouvelle version si vous le souhaitez. - La boîte de dialogue affiche les métadonnées de l'image actuelle en Affichage du fichier, ou d'une vignette cliquée en Affichage de la galerie. La boîte de dialogue de modification se met à jour lorsqu'une nouvelle image est ouverte ou qu'une nouvelle vignette est cliquée. - La date de l'image, si disponible, est affichée comme Date de l'image. Celle-ci peut être saisie si elle est manquante, ou modifiée. Vous pouvez saisir une date complète au format aaaa:mm:jj ou un format plus court aaaa ou aaaa:mm. Un mois/jour manquant équivaut logiquement à 01:01 lors de la comparaison avec une limite basse pour la recherche, ou à 12:31 lors de la comparaison avec une limite haute. Le bouton [Préc] remplit la date à partir des dernières données saisies. Cela permet de dater facilement une série d'images. Si l'heure est importante, vous pouvez ajouter une heure au format hh:mm[.ss]. Le format de saisie complet est : aaaa:mm:jj hh:mm:ss - Vous pouvez saisir un titre, une description, et une évaluation (0-5 étoiles) pour l'image. Pour modifier le titre ou la description, appuyez sur le bouton [modifier] correspondant. Cela ouvrira un éditeur de texte avec une grande limite sur la taille du texte. Vous pouvez utiliser la touche [enter] pour un saut de ligne délibéré. Dans Fotocx, ces sauts de ligne fonctionneront ; dans d'autres visionneuses d'images, ils peuvent être remplacés par des points. - Les mots-clés existants sont affichés dans Mots-clés de l'image. Les mots-clés disponibles sont affichés dans la fenêtre Mots-clés définis ci-dessous. L'un de ces mots-clés peut être ajouté à l'image en cliquant dessus. Un mot-clé peut être supprimé de l'image en cliquant dessus dans Mots-clés de l'image. Les mots-clés récemment ajoutés sont affichés dans Mots-clés récents. Ceci est une commodité pour faciliter l'ajout de mots-clés à un nouveau lot d'images, car beaucoup des mêmes mots-clés seront réutilisés. Pointez et cliquez de la même manière. - Si la liste des mots-clés définis est longue, il peut être plus facile de taper le mot-clé souhaité dans Entrer un mot-clé. Les mots-clés existants correspondant à ce que vous avez tapé apparaissent dans Mots-clés correspondants, et vous pouvez cliquer sur l'un d'eux pour ajouter le mot-clé à l'image. Si le mot-clé saisi est nouveau (aucun mot-clé correspondant n'est affiché), appuyez sur [ajouter un nouveau mot-clé] une fois le mot-clé complet. Il sera ajouté à l'image et à la liste des mots-clés définis avec la catégorie « nocatg ». - Si vous utilisez des catégories de mots-clés, vous pouvez sélectionner une catégorie, et seuls ces mots-clés seront affichés dans la liste des mots-clés définis. - Le bouton [Appliquer] écrit les données dans le fichier image et dans le fichier d'index de métadonnées utilisé pour la recherche d'images. - Le bouton [Préc] (en bas de la boîte de dialogue) peut être utilisé pour charger toutes les données disponibles de la précédente image consultée ou modifiée. Cela peut être utilisé pour accélérer le traitement d'un groupe d'images partageant beaucoup des mêmes données. - ^Ajout de géomarquages Il existe plusieurs façons d'ajouter des noms de lieux et des géocoordonnées dans la boîte de dialogue {MODIFIER LES MÉTADONNÉES PRINCIPALES}. - GPS de l'appareil photo Le capteur GPS de votre appareil photo peut avoir inséré des noms de lieux et des géocoordonnées. La langue peut ne pas être celle que vous souhaitez, ou des lettres entièrement majuscules peuvent être utilisées, ou un autre chaos. Utilisez le bouton [clear] pour recommencer, et saisissez le nouveau texte. - Bouton [Rechercher] Rechercher un lieu présent n'importe où dans vos fichiers image ou dans une immense liste de lieux connus (worldcities.txt). Saisissez quelques premiers caractères dans Lieu et appuyez sur [Rechercher]. Si une liste de sélection de lieux correspondants s'affiche, choisissez-en un. Si rien ne s'affiche, utilisez [Carte] pour cliquer sur un emplacement de la carte. Révisez les noms de lieu et de pays si besoin. Ce lieu est maintenant connu et disponible pour être choisi. - Bouton [Précédent] Si l'image en cours de modification a les mêmes données de lieu que l'image précédemment modifiée, appuyez sur [Précédent] pour remplir les données de lieu utilisées auparavant. - Vous pouvez utiliser {GÉOMARQUAGE MASSIF} pour ajouter des données de lieu à de nombreux fichiers image à la fois. - - TOPIC: MODIFIER TOUTES LES MÉTADONNÉES +image: edit-any-metadata.png - Ceci est une boîte de dialogue pour modifier n'importe quelle métadonnée du fichier image actuel. Les balises les plus courantes pour la modification sont listées à gauche. Appuyez sur le bouton [Liste complète] pour obtenir une liste de toutes les balises disponibles pour le fichier image actuel (il peut y en avoir des centaines). Appuyez sur [Liste courte] pour revenir à la liste des balises courantes. Cliquez sur une balise dans la liste pour récupérer la valeur actuelle de la balise. Modifiez la valeur si vous le souhaitez et appuyez sur [mettre à jour]. Pour modifier un nom de balise qui n'est pas dans la liste, saisissez le nom de la balise et appuyez sur [récupérer] pour récupérer la valeur actuelle, le cas échéant. Puis saisissez ou modifiez la valeur et appuyez sur [mettre à jour]. Pour supprimer une balise, appuyez sur [supprimer]. Vous pouvez saisir le nom de la balise en minuscules et avec ou sans espaces, ex. « Subject Distance » et « subjectdistance » fonctionneront tous les deux. Certaines balises ne peuvent pas être modifiées, ex. « largeur de l'image » est la largeur en pixels de l'image, qui ne peut être modifiée qu'en changeant la largeur en pixels de l'image. La source de la liste courte est le fichier texte /meta_picklist. Vous pouvez ajouter ou retirer des balises de cette liste. - - TOPIC: SUPPRIMER LES MÉTADONNÉES Spécifiez le nom de la balise à supprimer, ou sélectionnez Tout. La métadonnée est supprimée. Utilisez Tout pour nettoyer une image de toute information identifiante pouvant être présente. Certaines balises ne peuvent pas être supprimées, ex. Nom du fichier. - - TOPIC: COPIER LES MÉTADONNÉES Les images combinées créées avec Fotocx (HDR, panorama, mashup ...) ne contiendront pas de métadonnées par défaut. Utilisez cette fonction pour copier les métadonnées de l'une des images d'entrée, ou de toute autre image. Utilisez les boutons [Parcourir] pour choisir un fichier source des métadonnées et un fichier destinataire des métadonnées (« fichier cible » dans la boîte de dialogue). - - TOPIC: CORRIGER LES MÉTADONNÉES Utilisez cette fonction si vous avez un fichier image qui produit un message d'erreur lorsque vous essayez de modifier les métadonnées. Cela supprimera les métadonnées mal formées et conservera le reste. - - TOPIC: GÉRER LES MOTS-CLÉS +image: manage-keywords.png - Créer des mots-clés et éventuellement les regrouper en catégories. Vous pouvez assigner des catégories aux mots-clés pour aider à les organiser et à les localiser plus rapidement lors de l'ajout de mots-clés aux images. Elles sont optionnelles et ne jouent aucun rôle dans la recherche par mots-clés : seul le mot-clé est stocké dans une image, pas sa catégorie. Les catégories typiques sont personnes, lieux, choses, événements, paysages, bâtiments, art, etc. Pour ajouter un nouveau mot-clé avec une nouvelle catégorie, saisissez la catégorie et le mot-clé, puis cliquez sur [create]. Si la catégorie est vide, le mot-clé sera assigné à « nocatg ». Pour assigner un mot-clé à une catégorie différente, cliquez sur une catégorie (texte en gras) ou saisissez-en une nouvelle, cliquez sur le mot-clé, et appuyez sur [create]. Le mot-clé passera de l'ancienne à la nouvelle catégorie. Pour supprimer un mot-clé, cliquez sur le mot-clé et appuyez sur [supprimer]. Les mots-clés utilisés dans les images mais non assignés à une catégorie apparaîtront sous « nocatg ». Une catégorie sans mot-clé assigné peut être supprimée - cliquez sur la catégorie, effacez le nom du mot-clé s'il est présent, appuyez sur [supprimer]. - Note : un mot-clé nouvellement créé est ajouté à la fin de la liste de mots-clés de sa catégorie. Au prochain démarrage de Fotocx, toutes les catégories et leurs listes de mots-clés sont triées alphabétiquement, sauf que « nocatg » est toujours en dernier. - - TOPIC: LÉGENDES +image: choose-captions.png - ^Menu Choisir les légendes Choisir les balises de métadonnées à utiliser pour les légendes textuelles affichées dans le coin supérieur gauche de l'image en mode affichage du fichier. - ^Menu Activer/désactiver les légendes Activer ou désactiver l'affichage des légendes. Assigner un raccourci clavier pour activer ou désactiver rapidement l'affichage des légendes. - ^Note :^ déplacer la souris vers le coin supérieur gauche d'une image en affichage du fichier affichera le titre et la description dans une image popup. L'image disparaît lorsque la souris s'éloigne. - - TOPIC: LIEUX/DATES +image: image-locations.jpg - Ceci est un moyen rapide de trouver toutes les photos prises à un lieu donné ou dans une plage de lieu et de date. Dans la boîte de dialogue, choisissez parmi les deux options : inclure toutes les images dans le rapport, ou n'inclure que les images trouvées par la fonction Rechercher précédente. Sélectionnez ensuite le niveau de groupement souhaité : pays pays et lieu pays et date pays et lieu et date date et pays date et pays et lieu - Si la date est incluse, sélectionnez une plage de jours pour la consolidation : les photos dont les dates se trouvent dans la plage seront regroupées sous la première date. Appuyez sur [proceed] pour obtenir un rapport montrant le nombre d'images dans chaque groupe : par pays, pays et lieu, etc. C'est aussi l'ordre de tri. Dans l'exemple ci-dessus, 28 photos proviennent de Nouvelle-Zélande le 2004.11.02. Cliquez sur une ligne du rapport pour obtenir une galerie de vignettes de ces images. - - TOPIC: CHRONOLOGIE +image: timeline-report.jpg - Ce rapport produit une chronologie du nombre d'images par mois. Choisissez parmi les deux options : inclure toutes les images dans le rapport, ou n'inclure que les images trouvées par la fonction Rechercher précédente. Cliquez sur une année et un mois dans le rapport résultant pour obtenir une galerie de vignettes de toutes les images ayant une date de photo (EXIF) dans le mois sélectionné. L'exemple ci-dessus montre 208 images pour oct. 2017. L'année « null » concerne les images sans date de photo. - - TOPIC: BALISES DE MÉTADONNÉES Cette fonction trouve tous les fichiers image utilisant une balise et une valeur de métadonnées spécifiées. Sélectionnez une balise dans la liste contextuelle : évaluation, mots-clés, titre, description, appareil photo, métadonnées indexées supplémentaires - voir {INDEXER LES FICHIERS}. Une liste des valeurs de balise disponibles s'affiche, avec le nombre de fichiers image utilisant cette valeur de balise. Pour « titre » et « description », seuls les 60 premiers caractères sont affichés, et tous les fichiers utilisant des valeurs de balise correspondant à ces 60 premiers caractères sont rapportés. Pour « appareil photo », la valeur de correspondance est une combinaison de la marque, du modèle, et de l'objectif. - - TOPIC: RECHERCHE AUTOMATIQUE Cette fonction peut être utilisée par des fichiers de script shell pour extraire les fichiers image répondant à l'un des critères de sélection disponibles lors de l'utilisation de la fonction Rechercher des images (voir ci-dessous). D'abord, utilisez la fonction Rechercher des images pour définir les critères de sélection souhaités (ex. noms de dossiers/fichiers, dates, mots-clés, ou autres métadonnées). Utilisez le bouton [enregistrer] pour enregistrer les critères dans un fichier de paramètres. Utilisez la commande suivante pour démarrer Fotocx et effectuer la recherche : $ fotocx -m autosearch . La sortie se trouve dans /search_results. - - TOPIC: RECHERCHER DES IMAGES Utilisez la fonction Rechercher des images pour trouver des images ayant n'importe quelle métadonnée souhaitée (date, mots-clés, lieu ...). Un fichier d'index de métadonnées est utilisé pour la recherche, ce qui permet de rechercher des milliers d'images par seconde. - Il existe deux formats de rapport : une galerie de vignettes montrant toutes les images correspondant aux critères de recherche, ou un rapport de métadonnées qui combine les vignettes avec le texte des métadonnées. Voici un exemple du format de rapport de métadonnées : +image: search-images-metadata.jpg - ^Boîte de dialogue de recherche +image: search-images.jpg - Dans la boîte de dialogue, sélectionnez quelles images rechercher, soit toutes (toutes les images) soit l'ensemble actuel, c'est-à-dire les images de la galerie actuelle, qui peut être un dossier, un album, ou les résultats d'une recherche d'image précédente. - Ensuite, choisissez ce qu'il faut faire avec les images correspondantes trouvées : « nouvel ensemble » signifie remplacer l'ensemble actuel par les images trouvées, « ajouter » signifie les ajouter à l'ensemble actuel (galerie), et « retirer » signifie les retirer de l'ensemble actuel. Pour retirer des images, vous devez rechercher dans l'ensemble actuel. - Pour les fichiers correspondant aux critères de sélection, vous pouvez également spécifier quelles versions sont sélectionnées : original, dernière version, ou toutes les versions. « original » signifie l'image originale ou non modifiée (ou la première version si l'original n'a pas été enregistré). « dernière version » signifie la version disponible la plus récente ou la dernière modifiée. « toutes les versions » signifie que l'original et toutes les versions seront récupérés. - Sélectionnez le type de rapport souhaité. Le rapport galerie est une page d'images en vignettes, aussi longue que nécessaire pour contenir toutes les images correspondant aux critères de recherche. Le rapport de métadonnées comporte à la fois des images en vignettes et une liste de balises de métadonnées à côté de chaque vignette. Celles-ci incluent les balises standard (date, évaluation, mots-clés, géomarquages, titre, description) et toute autre balise de métadonnées que vous avez ajoutée dans la liste de sélection de balises (voir ci-dessous). - Saisissez vos critères de recherche. Sélectionnez les mots-clés, dates, évaluations en étoiles, mots contenus dans le texte (titre ou description de l'image), noms de fichiers ou de dossiers, et noms de lieux souhaités. Voir plus de détails ci-dessous. - Les mots-clés disponibles sont affichés dans Mots-clés définis et peuvent être choisis en pointant et cliquant. Si la liste des mots-clés définis est longue, il peut être plus facile de commencer à taper un mot-clé dans « entrer un mot-clé ». Les mots-clés existants correspondant à ce qui a été tapé apparaîtront dans la liste « correspondances », et vous pouvez cliquer sur l'un d'eux pour ajouter le mot-clé à la liste de recherche. - Si vous utilisez des catégories de mots-clés, vous pouvez sélectionner une catégorie, et seuls ces mots-clés seront affichés dans la liste des mots-clés définis. - Une plage de dates peut être saisie pour restreindre la recherche aux images de cette plage de dates. Choisissez la date de la photo (depuis l'appareil photo) ou la date du fichier (date de création ou de dernière modification). Le format est aaaa:mm:jj. Les images sont sélectionnées si elles ont une date à ou après la première date, si elle est présente, et à ou avant la deuxième date, si elle est présente. Un mois/jour manquant est par défaut 01/01 pour la limite basse et 12/31 pour la limite haute. Les heures peuvent optionnellement être spécifiées avec le format aaaa:mm:jj hh:mm. Les heures manquantes sont par défaut 00:00 et 23:59. - Pour rechercher des images sans date de photo EXIF (ex. images numérisées), utilisez « null » dans la première saisie de date. - Une paire d'évaluations en étoiles peut être saisie pour restreindre les résultats aux images ayant une évaluation dans la plage donnée. Une valeur basse manquante implique 0 étoile, et une valeur haute manquante signifie l'évaluation la plus élevée, 5 étoiles. - Les noms de dossiers et de fichiers peuvent être recherchés. Dans le champ rechercher noms de fichiers, saisissez un nombre quelconque de noms utilisés pour vos dossiers d'images et noms de fichiers, séparés par des virgules. Une saisie « egypt cairo » correspondrait à tous les noms de dossiers ou de fichiers image contenant l'une de ces chaînes. Les sous-chaînes correspondront aussi. La casse n'a pas d'importance. - Le titre et la description de l'image peuvent être recherchés. Saisissez les mots à rechercher dans le champ rechercher titre/desc, séparés par des virgules. Ceux-ci seront comparés à chaque mot du titre et de la description de toutes les images, et les images correspondantes sont sélectionnées. La casse n'a pas d'importance. - Pour rechercher des lieux, saisissez un ou plusieurs noms de ville/lieu ou de pays dans le champ rechercher des lieux, séparés par des virgules. Seuls les fichiers image avec des géomarquages correspondant à l'un des lieux saisis seront sélectionnés. Un lieu peut être une ville, un parc ou un autre nom géographique (ce qui est stocké dans les champs de métadonnées « Ville » et « Pays »). La casse n'a pas d'importance. - Les boutons radio « tous » et « n'importe lequel » s'appliquent aux mots-clés, au texte, aux noms de fichiers, et aux lieux. Vous pouvez sélectionner les images ayant TOUTES les chaînes saisies, ou N'IMPORTE LAQUELLE des chaînes saisies. Exemple : si le champ de recherche de lieu est « new york » et que « n'importe lequel » est sélectionné, les images de Nouvelle-Zélande et de York, Angleterre seraient incluses. Si « tous » est sélectionné, seules les images situées à New York seraient incluses. - Si vous souhaitez trouver des images avec des données manquantes, vous pouvez saisir « null » comme valeur de correspondance. - ^Rechercher des métadonnées supplémentaires En utilisant les champs de la boîte de dialogue « nom de balise », « condition », et « valeurs de correspondance », vous pouvez spécifier des balises de métadonnées supplémentaires à utiliser comme critères de sélection, ou à ajouter à la sortie du rapport si le type de rapport « métadonnées » est choisi. Les balises disponibles pour un fichier image donné peuvent être affichées avec {AFFICHER TOUTES LES MÉTADONNÉES}. Celles-ci incluent de nombreuses balises non présentes dans la boîte de dialogue principale. La liste de sélection provient du fichier texte /meta_picklist. Vous pouvez ajouter des balises à ce fichier si vous le souhaitez. Vous pouvez utiliser des balises qui sont aussi présentes dans la boîte de dialogue principale. L'avantage ici est qu'une logique de correspondance plus flexible peut être utilisée. - La logique de correspondance peut être sélectionnée pour chaque balise de métadonnées. ^méthode de correspondance valeur de correspondance pour la sélection • report n'importe quelle valeur, aussi manquante • reportx valeur non manquante • matches valeurs texte séparées par des virgules • contains identique, avec correspondance de sous-chaîne • number = valeurs égales • number => valeurs égales ou supérieures • number <= valeurs égales ou inférieures - Les boutons [X] sur le côté droit peuvent être utilisés pour effacer des balises de recherche de métadonnées individuelles. - ^Boutons de la boîte de dialogue [Charger] et [Enregistrer] peuvent être utilisés pour charger ou enregistrer les critères de recherche depuis un fichier. [Effacer] effacera toutes les données de la boîte de dialogue. [Continuer] démarrera le processus de recherche. - Appuyez sur le bouton [proceed] pour effectuer la recherche. Le résultat est une galerie standard de vignettes, ou le format de rapport de métadonnées montré ci-dessus. Vous pouvez enregistrer les images trouvées comme un album permanent - voir {ALBUMS}. - ^Performance La recherche et le rapport de métadonnées indexées sont presque instantanés. La vitesse pour les métadonnées non indexées dépend de la vitesse de l'ordinateur et du disque. Un ordinateur puissant avec un disque SSD peut rechercher plus de 100 000 fichiers par minute. - ^search_results^ (album) Le résultat de Rechercher des images est enregistré dans l'album « search_results ». Renommez cet album si vous voulez éviter qu'une recherche ultérieure ne le remplace. - Limitation : la fonction de recherche est limitée à 40 000 résultats (images trouvées répondant aux critères de recherche). Si cette limite est dépassée, vous êtes averti et la recherche est tronquée. Cette limite existe parce que la taille d'une fenêtre défilante dans GTK est limitée, et une tentative de créer une fenêtre plus grande peut entraîner un plantage ou un blocage. - - TOPIC: MENU SÉLECTION - - TOPIC: APERÇU DE ZONE Les fonctions de modification s'appliquent normalement à l'image entière, mais il est possible de modifier une partie d'une image (une « zone ») et de laisser le reste inchangé. Si une zone d'image a été sélectionnée, la plupart des fonctions de modification ne fonctionneront qu'à l'intérieur de cette zone. Certaines fonctions (ex. Redimensionner) ignorent une zone sélectionnée. Une zone peut être sélectionnée avant de démarrer une fonction de modification, ou pendant qu'une fonction de modification est utilisée. La zone sélectionnée est immédiatement active, les modifications précédentes sont conservées, et les modifications futures s'appliqueront uniquement à l'intérieur de la zone. Si une autre modification est démarrée, la zone sélectionnée reste active, il est donc possible d'effectuer une série de modifications à l'intérieur d'une zone. Une zone peut aussi être constituée de plusieurs zones non connectées dans l'image. - Fotocx utilise des « zones » au lieu de « calques ». Au lieu de sélectionner quelque chose dans l'image, de créer un calque séparé à partir de la sélection, de modifier le calque et enfin de fusionner le calque, vous sélectionnez quelque chose dans l'image, effectuez des fonctions de modification sur la sélection, et vous voyez le résultat final immédiatement. Les zones peuvent aussi être enregistrées, collées dans une autre image, déplacées et redimensionnées, et modifiées davantage. - +image: edit-selection.jpg - Modifier une zone sélectionnée peut parfois entraîner des limites visibles aux bords de la zone (parfois celles-ci correspondent à des bords d'éléments dans l'image, et ne sont donc pas un problème). Vous pouvez fondre les bords en utilisant {FUSION DE ZONE} : les modifications peuvent être appliquées progressivement du bord de la zone vers l'intérieur, et vous pouvez sélectionner quels bords sont fondus. - - TOPIC: SÉLECTIONNER UNE ZONE +image: select-area.jpg - La boîte de dialogue Sélectionner une zone démarre avec le menu Sélection > Sélectionner une zone. Sélectionnez l'une des méthodes expliquées ci-dessous. Chaque méthode sélectionne les zones d'image d'une manière différente. Vous pouvez changer de méthode à tout moment, et les zones sélectionnées s'accumulent. Un contour de la ou des zones d'image sélectionnées est affiché au fur et à mesure que vous ajoutez ou retirez des zones de la sélection. Le bouton [Terminer] est utilisé pour cartographier les pixels de l'image à l'intérieur des contours de zone, les rendant prêts pour l'application de fonctions de modification ultérieures. Le bouton [Masquer] masque le contour de zone, vous donnant une meilleure visibilité des modifications et des effets possibles de bord de zone. Utilisez le bouton [Afficher] pour afficher le contour de zone. Le bouton [Effacer] supprime toutes les sélections de zone. La boîte de dialogue de sélection de zone peut être annulée et redémarrée plus tard pour modifier des zones existantes ou en ajouter de nouvelles. - ^Méthodes Les méthodes suivantes sont utilisées pour englober un ou plusieurs espaces d'image qui appartiendront à la zone finale. Ces méthodes peuvent être utilisées dans n'importe quel ordre pour définir des espaces qui sont soit joints soit séparés. • Rectangle - glisser pour délimiter une zone rectangulaire • Ellipse - glisser pour délimiter une zone circulaire ou elliptique • Dessin à main levée - délimiter une zone en dessinant avec la souris • Suivre le bord - délimiter en suivant les bords des éléments de l'image • Sélectionner une zone autour de la souris - glisser pour sélectionner les pixels dans un cercle autour du pointeur de la souris. • Sélectionner une couleur autour de la souris - sélectionner uniquement les pixels correspondant à une couleur donnée, correspondance de 0-100 %. • Sélectionner toutes les couleurs autour de la souris - sélectionner tous les pixels dans la souris, étendre la sélection aux zones adjacentes avec des couleurs correspondant aux couleurs à l'intérieur de la souris (parfois appelé « remplissage »). - Les paragraphes suivants expliquent les détails de chaque méthode. - ^Rectangle Faites glisser la souris d'un coin à l'autre coin d'une zone rectangulaire à sélectionner. Un rectangle est dessiné pour englober la zone. Clic droit pour supprimer et recommencer. Répétez le processus pour sélectionner d'autres zones rectangulaires. - ^Ellipse Cela fonctionne de la même manière que la sélection rectangle, sauf que la zone englobée est un cercle ou une ellipse. La position de début du glissement est le centre de l'ellipse résultante. L'angle du glissement détermine la forme de l'ellipse. - ^Dessin à main levée Faites glisser la souris (bouton gauche enfoncé) pour dessiner une ligne à main levée, ou cliquez à gauche pour relier une ligne droite du dernier point dessiné au point cliqué. Continuez autour de la zone cible jusqu'à ce qu'elle soit entourée de courbes et lignes connectées. Clic droit pour retirer les lignes précédentes (erreurs). Un clic droit retirera la dernière ligne cliquée ou glissée, jusqu'à 50 pixels. Cliquez à droite de manière répétée pour en retirer davantage. Une nouvelle ligne cliquée se connectera toujours à la fin de la ligne précédente. Une nouvelle ligne glissée se connectera à la ligne précédente si elle commence près de la fin de cette ligne. Si elle commence ailleurs, une ligne déconnectée sera dessinée. Vous pouvez commencer un nouveau glissement depuis un endroit éloigné et dessiner en arrière pour rejoindre la ligne précédente. Si une ligne cliquée se connecte à un point indésirable (c.-à-d. que vous ne voulez pas vous connecter à la dernière ligne dessinée), cliquez à droite pour l'effacer puis utilisez le glissement pour démarrer une nouvelle séquence de lignes. Un glissement du bouton droit peut être utilisé pour effacer des segments de ligne : glissez à droite de près le long d'une ligne pour l'effacer, puis glissez à gauche pour redessiner la ligne. À la fin, une zone doit être entièrement englobée, sans espace. Les lignes qui se chevauchent légèrement aux extrémités sont acceptables. Les espaces peuvent être difficiles à trouver et à corriger, alors travaillez à 100 % de la taille de l'image ou plus et soyez prudent. Une série de lignes automatiquement connectées par des clics gauches ne laissera pas d'espaces, mais s'écarter de cette séquence risque de créer des espaces. Pour réduire la possibilité d'espaces, utilisez des chevauchements délibérés lors de la connexion manuelle des lignes. Il existe un utilitaire de détection d'espace décrit ci-dessous - {TROUVER UN ESPACE DANS LA ZONE}. Si un bord de zone est aussi un bord d'image, vous n'avez pas besoin de dessiner cette portion de la zone. Dessinez la ligne hors du bord de l'image, et redessinez-la sur l'image à une autre position le long du bord de l'image. - ^Suivre le bord Les pixels à fort contraste (probablement des bords d'éléments de l'image) entre le dernier point dessiné et une position nouvellement cliquée sont trouvés et connectés. Ceci est efficace pour des bords nets qui ne sont pas trop irréguliers. Les bords flous et déchiquetés peuvent ne pas bien fonctionner et le dessin à main levée sera nécessaire si une haute précision est requise. Les règles de connexion des lignes sont les mêmes qu'expliquées ci-dessus. Faire glisser la souris au lieu de cliquer fonctionne comme le dessin à main levée, mais avec une tendance à suivre les bords d'éléments depuis une position légèrement derrière la souris. Pour des bords très irréguliers (cheveux, feuillage), voir « couleur de désélection », ci-dessous. - ^Rayon de la souris et niveau de correspondance des couleurs Ces deux contrôles s'appliquent uniquement aux méthodes « sélectionner autour de la souris » décrites ci-dessous. Le rayon de la souris définit la taille d'un cercle autour du pointeur de la souris. Les pixels à l'intérieur du cercle sont sélectionnés, ou ils fournissent un ensemble de couleurs pour la correspondance et la sélection des pixels depuis le cercle de la souris vers l'extérieur. Le niveau de correspondance définit un niveau de correspondance requis (0-100 %) pour sélectionner les pixels selon leur couleur et leur luminosité. « 0 » signifie que tout correspond, et « 100 » signifie qu'une correspondance parfaite est requise. - ^Sélectionner une zone autour de la souris Un clic gauche ou un glissement sélectionnera les pixels englobés par le cercle de la souris. Un clic droit désélectionnera la dernière sélection (répéter pour en désélectionner davantage). Un glissement à droite désélectionnera les pixels englobés. - ^Sélectionner une couleur autour de la souris Cliquez sur l'image pour sélectionner une couleur. La couleur est affichée sur le bouton de couleur. Vous pouvez aussi utiliser le bouton pour définir une couleur directement. Glissez à gauche/droite pour sélectionner/désélectionner les pixels dans le cercle de la souris correspondant à la couleur sélectionnée selon le niveau de correspondance. Ajustez le niveau de correspondance vers le bas ou le haut pour correspondre à une plage de couleurs plus ou moins large. Cliquez selon les besoins sur l'image pour changer la couleur à faire correspondre. - ^Couleur de désélection optionnelle Ceci s'applique uniquement à « sélectionner une couleur » ci-dessus. Cliquez à gauche sur l'image pour définir une couleur de désélection. Lorsque la case est cochée, la couleur de désélection est active. Si un pixel correspond mieux à la couleur de désélection qu'à la couleur de sélection, le pixel est désélectionné. Lors de la sélection le long d'un bord d'élément avec un faible contraste de couleur par rapport à une zone adjacente qui devrait rester non sélectionnée, définissez la couleur de désélection à partir de la zone adjacente. Ceci est utile pour une sélection précise d'un bord complexe, comme les cheveux ou le feuillage. - ^Sélectionner toutes les couleurs autour de la souris Ceci est appelé « remplissage » dans certains éditeurs. Glissez à gauche/droite pour sélectionner/désélectionner les pixels à l'intérieur du cercle de la souris. Les pixels au-delà du cercle de la souris sont aussi inclus s'ils remplissent ces deux conditions : 1) leur couleur correspond à n'importe quelle couleur à l'intérieur du cercle de la souris, dans le niveau de correspondance actuel. 2) ils se trouvent dans la plage de recherche du pointeur de la souris. Ceci est un facteur du rayon de la souris, ex. si le rayon de la souris est 20 et la plage de recherche est 3, alors la plage de recherche est de 60 pixels depuis le pointeur de la souris. Glissez la souris sur les nouvelles zones que vous voulez inclure. Observez la zone sélectionnée s'étendre dans les zones ayant des couleurs correspondant à celles à l'intérieur du cercle de la souris. Si vous allez trop loin, cliquez à droite pour retirer la dernière sélection. Répétez si besoin pour retirer d'autres sélections précédentes. Réduisez le rayon ou augmentez le niveau de correspondance pour obtenir un contrôle plus fin - la sélection s'étendra plus lentement et restera plus proche du cercle de la souris. Un petit rayon et un niveau de correspondance élevé peuvent être utilisés pour suivre le long d'un bord d'élément de l'image et sélectionner les pixels jusqu'au bord avec bonne précision. Une fois le travail sur les bords terminé, utilisez la méthode sélectionner une zone autour de la souris pour sélectionner le reste. Le glissement à droite agit comme une désélection : les pixels à l'intérieur du cercle de la souris et les pixels correspondants dans la plage de recherche sont désélectionnés. Si une sélection va trop loin, il est souvent plus facile de corriger cela en désélectionnant depuis l'extérieur de la zone sélectionnée plutôt qu'en sélectionnant depuis l'intérieur. Vous aurez peut-être besoin d'un peu de pratique pour vous familiariser avec cela et pouvoir travailler efficacement. - ^Sélectionner toutes les couleurs autour de la souris - résumé • glisser à gauche - sélectionner les pixels dans la souris et les pixels correspondants dans la plage • clic droit - annuler la sélection précédente, répéter pour désélectionner davantage • glisser à droite - désélectionner les pixels dans la souris et les pixels correspondants dans la plage - ^Fluage du bord Une zone qui a été terminée (voir ci-dessous) peut être étendue ou réduite par pas de 1 pixel. Ceci peut être utile pour réduire les effets de bord lorsqu'une zone sélectionnée par correspondance de couleurs est modifiée d'une manière qui change sa luminosité. La sélection par couleur peut laisser une bande étroite de pixels sous-sélectionnés ou sur-sélectionnés le long d'un bord où la couleur de l'élément transitionne vers l'arrière-plan. Étendre ou réduire la zone de 1-2 pixels peut produire un bord d'apparence plus nette. La zone reste terminée (voir ci-dessous) après le fluage. - ^Couleur du contour de zone La couleur utilisée pour le cercle de sélection de la souris et le contour de zone peut être changée à tout moment en cliquant sur l'un des boutons de couleur. Cela permet une bonne visibilité contre diverses couleurs d'image. - ^Afficher/Masquer Utilisez [Masquer] pour masquer les contours de zone. Ceci est utile pour mieux voir les effets des modifications de zone sans interférence du contour de zone. Utilisez [Afficher] pour afficher les contours et reprendre la modification de la zone. - ^Terminer +image: select-area-finish.png - Une zone n'est pas effective pour les modifications tant qu'elle n'est pas terminée avec succès. Terminer valide les contours dessinés et colore les pixels englobés pour vérification visuelle. Lorsque vous avez fini de délimiter les zones, utilisez le bouton [Terminer] pour compléter le processus. La boîte de dialogue popup montrée ci-dessus résume deux méthodes que vous pouvez utiliser pour terminer. - Méthode 1 : cliquez à gauche à l'intérieur des zones qui ont été délimitées à la main. Les zones englobées sont temporairement colorées afin que vous puissiez vérifier que le résultat final est celui que vous vouliez. N'importe quelle zone englobée peut être sélectionnée, même celles non explicitement délimitées : si vous avez un donut avec un trou, vous pouvez sélectionner le donut, le trou, ou les deux. Appuyez sur [keep] lorsque toutes les zones ont été cliquées et correctement colorées. Si le contour d'une zone dessinée à la main a un espace, le processus de coloration va « fuir » et des zones en dehors de l'enceinte seront colorées. Dans ce cas, appuyez sur [Annuler] dans la boîte de dialogue Terminer, qui restaure le contour de zone original. Trouvez l'espace dans le contour et fermez-le, puis essayez [Terminer] à nouveau. Un espace de 1 pixel dans une grande zone peut être difficile à trouver. Zoomez pour mieux voir. Voir la fonction {TROUVER UN ESPACE DANS LA ZONE} ci-dessous pour une méthode rapide de trouver de minuscules espaces. - Méthode 2 : cliquez à droite quelque part en dehors de toutes les zones englobées. Toutes les zones englobées seront colorées pour vérification visuelle. S'il y a un espace, les résultats et la correction sont les mêmes que décrits dans la méthode 1. Cette méthode est judicieuse si vous avez de nombreuses zones délimitées à la main et que vous ne voulez pas les vérifier une par une avec la méthode 1. - Les zones sélectionnées avec les méthodes « sélectionner autour de la souris » sont automatiquement terminées. Ces zones sont cartographiées pendant le processus de sélection, tandis que les zones sélectionnées avec rectangle, ellipse, ou l'une des méthodes de dessin de ligne ne sont cartographiées que lorsque vous cliquez à l'intérieur. Si vous utilisez uniquement les méthodes « sélectionner autour de la souris », vous pouvez appuyer sur [keep] sans cliquer sur aucune des zones sélectionnées. - Si vous dessinez une ligne d'un côté de l'image à l'autre, vous pouvez cliquer de chaque côté de la ligne pour créer une zone de tous les pixels de ce côté de la ligne. Exemple : dessinez une ligne horizontale sur la limite entre le ciel et la terre. Cliquez au-dessus de la ligne pour sélectionner le ciel, en dessous de la ligne pour sélectionner la terre. Les lignes dessinées doivent atteindre complètement les bords de l'image. - ^Effacer Abandonner définitivement la zone actuelle. - - TOPIC: TROUVER UN ESPACE DANS LA ZONE Si un contour de zone a été créé par dessin à main levée en utilisant plusieurs traits, il est facile de laisser de petits espaces dans le contour qui ne sont pas visibles en dessous d'un zoom 4x. Une tentative de terminer une telle zone échouera car la cartographie des pixels intérieurs fuira à travers l'espace et couvrira des zones en dehors de la zone prévue. Si la fonction Terminer échoue, cette fonction peut trouver l'espace. Cliquez quelque part sur le contour de la zone en échec. Le contour sera lentement redessiné dans une direction depuis la position cliquée, jusqu'à ce qu'un « pixel de fin » soit trouvé. C'est là que se trouve l'espace. Le contour est ensuite dessiné dans la direction opposée jusqu'à ce que l'espace (ou un autre) soit rencontré. L'espace se trouve là où le dessin s'est arrêté. Zoomez sur l'espace et fermez-le avec le dessin à main levée, puis testez à nouveau pour voir si le contour complet peut être dessiné sans s'arrêter. Cette fonction peut être utilisée en parallèle avec la fonction Sélectionner une zone - les deux boîtes de dialogue peuvent être actives. - - TOPIC: FUSION DE ZONE +image: area-blend.jpg - Deux fonctions sont présentes dans cet outil : Fusion de zone et Fusion des bords de zone. Les deux fonctions peuvent progressivement « annuler » une modification faite dans une zone sélectionnée, en mélangeant une modification précédente ou l'image originale. Dans l'exemple ci-dessus, les quatre hommes à l'arrière-plan ont été éclaircis sans aucune trace de limite entre les pixels éclaircis et inchangés. - ^Fusion de zone N'importe quelle partie d'une zone sélectionnée modifiée peut être fondue avec l'image originale. Utilisez des glissements de la souris à gauche sur les régions à fondre. Chaque glissement de souris à l'intérieur de la zone fondra progressivement l'image précédente sélectionnée, réduisant ou supprimant effectivement la modification qui a été faite dans la zone. Le taux de fondu est déterminé par le « taux de fondu », qui peut être défini séparément pour le centre et le bord du cercle de la souris. Définissez le rayon de la souris et les taux de fondu (ex. 50/0 pour centre/bord de la souris). Glissez la souris sur les régions de zone à fondre. Utilisez le glissement à gauche pour fondre, le glissement à droite pour défaire le fondu ou restaurer. Vous pouvez utiliser cette méthode pour fondre les bords de zone de manière sélective : utilisez un petit rayon et glissez le centre de la souris sur les bords à fondre. Cela produira un fondu en dégradé du bord vers l'intérieur. - ^Fusion des bords de zone Parfois une zone modifiée aura des bords d'apparence peu naturelle, en raison d'une limite nette entre la zone modifiée et l'image environnante (surtout si la zone a été éclaircie). Cela peut être efficacement rendu invisible en fondant progressivement la modification de zone sur une bande le long des bords. La modification de zone peut être supprimée à 100 % au bord de la zone, diminuant à 0 % vers l'intérieur sur la largeur de la bande. Il existe deux façons de fondre les bords de zone, « fondu » et « flou ». Le fondu mélange la bande de bord avec la modification précédente choisie ou l'image originale. Le flou mélange la bande avec les pixels voisins depuis l'extérieur de la bande. Définissez la largeur du fondu avec le champ « largeur du fondu » ou « largeur du flou ». - Les fonctions « Fondu » et « Flou » de bord de zone nécessitent un calcul de distance au bord : la distance de chaque pixel de la zone au bord de zone le plus proche. Cette distance est utilisée pour calculer le fondu relatif du pixel : 100 % au bord de la zone et 0 % pour les pixels au-delà de la « largeur du fondu » depuis le bord. Pour une grande zone avec un bord complexe, cela peut prendre du temps. Une jauge de progression est affichée dans le panneau supérieur. - - TOPIC: AFFICHER/MASQUER LA ZONE Afficher ou masquer le contour de la zone actuelle. Masquer la zone est utile lorsque la zone est modifiée avec une fonction de modification. Cela facilite l'évaluation des effets de la modification. Celles-ci sont aussi disponibles comme boutons dans la boîte de dialogue Sélectionner une zone. - - TOPIC: ACTIVER/DÉSACTIVER LA ZONE Désactiver la zone actuelle et conserver les données afin qu'elle puisse être réactivée plus tard (menu Activer). Cela vous permet d'alterner entre les modifications à l'intérieur d'une zone sélectionnée et les modifications de l'image entière. - - TOPIC: INVERSER LA ZONE Inverser une zone existante : toute l'image est sélectionnée sauf la zone existante. Utiliser la fonction deux fois retourne à la zone sélectionnée originale. Inverser une zone sélectionnée invalide le calcul de bord qui doit être répété si un fondu de bord de zone est souhaité. - - TOPIC: EFFACER LA ZONE Abandonner définitivement la zone actuelle. Ceci est aussi disponible comme bouton dans la boîte de dialogue Sélectionner une zone. - - TOPIC: COPIER/COLLER UNE ZONE Une zone sélectionnée peut être enregistrée dans un fichier cache à l'aide du menu Zones > Copier. Cette zone peut être collée dans la même image ou une autre à l'aide de Zones > Coller. Cliquez et glissez pour positionner la zone collée. Les contrôles de la boîte de dialogue peuvent être utilisés pour redimensionner et faire pivoter la zone collée. - - TOPIC: CHARGER/ENREGISTRER LA ZONE Une zone sélectionnée peut être enregistrée dans un fichier à l'aide du menu Zones > Enregistrer. On vous demande de fournir un nom de fichier. Un fichier PNG est créé. Le fichier PNG a un canal alpha pour les informations de transparence. L'image est un rectangle englobant la zone sélectionnée. Les pixels sélectionnés sont opaques, et les autres sont transparents. - Ces fichiers résident dans /saved_areas par défaut, mais vous pouvez les enregistrer n'importe où. Utilisez le menu Zones > Charger pour charger une zone enregistrée depuis un fichier et la coller dans le fichier image actuel. L'image d'arrière-plan apparaîtra à travers les parties transparentes de la zone collée. Cliquez et glissez pour positionner la zone. Les contrôles de la boîte de dialogue peuvent être utilisés pour redimensionner et faire pivoter la zone collée. - - TOPIC: BOUTON ANNULER/RÉTABLIR Si une fonction de modification est active et que l'image a été modifiée : • un clic gauche de la souris annulera la modification actuelle • un clic droit de la souris rétablira la modification Cela vous permet de comparer rapidement les images « avant » et « après » pour la fonction de modification actuelle. - Si AUCUNE fonction de modification n'est active, mais que certaines modifications ont été faites à l'image actuelle : • un clic gauche de la souris annulera une étape de modification par clic • un clic droit de la souris rétablira une étape de modification par clic • un clic du milieu de la souris affiche une liste contextuelle de toutes les étapes de modification. Vous pouvez revenir à n'importe quelle étape de modification ou à l'image originale - Si vous ouvrez un autre fichier, les étapes de modification enregistrées pour le fichier actuel sont perdues. - - TOPIC: MENU ÉDITION - - TOPIC: PIVOTER Pour mettre à niveau une image inclinée, utilisez la souris pour faire glisser le côté droit ou gauche de l'image vers le haut ou le bas jusqu'à ce que l'image paraisse de niveau. Un clic gauche sur l'image ajoutera des lignes guides verticales et horizontales pour aider à la mise à niveau de l'image. Utilisez le clic droit pour les retirer. - Le bouton [Niveau automatique] peut mettre à niveau automatiquement l'image si l'appareil photo a enregistré l'« angle de roulis » dans les métadonnées EXIF. Le bouton [Auto Upright] peut redresser automatiquement une image prise avec l'appareil photo tourné à 90º, si l'« orientation » est présente dans les métadonnées EXIF. - - TOPIC: REDRESSEMENT Ceci est une correction en 1 bouton pour une image qui est pivotée de 90/180 degrés ou inversée (en miroir). Il n'y a pas de perte de résolution puisque les pixels sont copiés 1:1 vers la nouvelle disposition de l'image. Voir aussi la fonction {REDRESSEMENT MASSIF}. - - TOPIC: RECADRER +image: crop-image.jpg +image: crop-buttons.jpg - Couper les zones indésirables des bords de l'image. Lorsque la boîte de dialogue s'ouvre, un rectangle de sélection est placé sur l'image. Les zones à l'extérieur de ce rectangle sont assombries et représentent les parties de l'image qui seront supprimées. Faites glisser n'importe quel côté ou coin du rectangle pour déplacer ce côté ou coin. La boîte de dialogue affiche le ratio largeur/hauteur actuel du rectangle de sélection. Si « Verrouiller » est coché, déplacer un côté ou un coin fera bouger un autre côté ou coin, afin que le ratio largeur/hauteur fixe soit maintenu. Glissez depuis le milieu (marqué par un petit cercle) pour déplacer tout le rectangle sans changer les dimensions. Utilisez les boutons rotatifs de largeur et hauteur pour ajuster directement les dimensions en pixels de l'image, ou saisissez les valeurs souhaitées. Le rectangle de sélection s'ajustera à ces valeurs. - Utilisez les touches fléchées du clavier pour déplacer le rectangle de sélection par pas de 1 pixel. Le dernier côté ou coin déplacé avec la souris est celui qui est déplacé avec les touches fléchées. - Le bouton [Max] réinitialise le rectangle de recadrage à la taille complète de l'image. Si une modification précédente (Pivoter, Déformer ...) a laissé des marges transparentes autour de l'image, le rectangle de recadrage reflétera la taille maximale s'inscrivant dans ces marges. - Le bouton [Préc] récupère une liste des valeurs de largeur et hauteur précédemment utilisées. Sélectionnez dans la liste pour en utiliser une. - Les cinq boutons de ratio vous permettent de choisir un ratio largeur/hauteur prédéfini. Le bouton [invert] inverse le ratio largeur/hauteur actuel. - Vous pouvez changer les boutons de ratio avec le bouton [customize], qui démarre une nouvelle boîte de dialogue montrée à droite. Cliquez sur un bouton pour le modifier. Saisissez le ratio largeur/hauteur souhaité en utilisant le format « ll:hh » comme dans l'exemple montré. - - TOPIC: RETOUCHER +image: retouch.png - Ajuster la luminosité et la couleur de l'image. • niveau de noir automatique - définir le point noir en utilisant % des pixels les plus sombres • balance des blancs automatique - définir le point blanc en utilisant % des pixels les plus clairs • cliquer sur un point gris pour la balance des blancs - cliquer sur un point gris de l'image • cliquer sur un point sombre pour le niveau de noir - cliquer sur un point sombre de l'image • cliquer pour un graphique popup des histogrammes RVB • luminosité - déplace la courbe « all » vers le haut ou le bas (toutes les couleurs changent) • contraste - change la pente de la courbe « all » • saturation des couleurs - noir/blanc <--> couleurs intenses • température de couleur - équilibre de l'illumination (chaud <--> froid) - Après avoir fait les ajustements initiaux avec les curseurs, vous pouvez affiner la luminosité et le contraste en modifiant les courbes avec la souris pour changer quelles parties de l'image changent plus ou moins. La courbe ALL ajuste toutes les couleurs, et les 3 courbes RVB ajustent les couleurs individuelles. Utilisez d'abord ALL, puis faites des révisions en utilisant RVB. - ^Boutons Réinitialiser - remettre tous les contrôles à une position neutre - l'image est aussi réinitialisée Préc - régler tous les contrôles aux valeurs utilisées pour l'image précédente Terminé - terminer la modification, fermer la boîte de dialogue, enregistrer les paramètres des contrôles Annuler - annuler la modification, réinitialiser l'image, fermer la boîte de dialogue - Utilisez le bouton [Préc] lors du traitement de plusieurs images nécessitant des ajustements similaires. - - TOPIC: REDIMENSIONNER +image: rescale.png - Cette fonction redimensionne l'image à une nouvelle largeur et hauteur en pixels. Vous pouvez saisir directement les nouvelles dimensions ou choisir un changement en pourcentage. Des boutons sont présents pour définir la nouvelle taille selon un ratio simple de la taille originale. Utiliser l'un d'eux minimisera la perte de résolution. Le bouton [Précédent] rappelle la taille précédente, une commodité si plusieurs images sont réglées à la même taille. Si la case verrouiller le ratio est cochée, le ratio largeur/hauteur actuel sera préservé si la largeur ou la hauteur est modifiée. - - TOPIC: ÉCRAN PARTAGÉ +image: split-screen1.jpg +image: split-screen2.png - Pendant une fonction de modification, affichez les images avant et après avec la méthode écran partagé. Faites glisser la ligne de séparation avec la souris. Lorsque vous quittez l'écran partagé, vous pouvez continuer normalement la fonction de modification. - Si aucune fonction de modification n'est active, choisissez deux images à afficher avec l'écran partagé. Elles doivent avoir les mêmes dimensions en pixels. - - TOPIC: AFFICHER LES DIFFÉRENCES Pendant une fonction de modification, mettez en évidence les changements en assombrissant les zones inchangées. Utilisez le curseur pour ajuster l'obscurité des zones inchangées. Lorsque vous quittez Afficher les différences, vous pouvez continuer normalement la fonction de modification. - Si aucune fonction de modification n'est active, choisissez deux images pour mettre en évidence leurs différences. Elles doivent avoir les mêmes dimensions en pixels. - - TOPIC: MARGES +image: margins.png - Utilisez cette fonction pour ajouter des marges autour d'une image. Vous pouvez utiliser n'importe quelle couleur et paramètre alpha (transparence) pour les marges. Réglez chaque marge séparément, ou utilisez les contrôles « Tout±1 » et « Tout±10 » pour ajuster toutes les marges vers le haut ou le bas de la même quantité, 1 ou 10 pixels. Utilisez la molette de la souris ou les touches flèche haut/bas pour la vitesse. - Vous pouvez utiliser cette fonction pour ajouter des marges autour des images que vous prévoyez de déformer, afin d'empêcher certaines zones de tomber hors des bords. - - TOPIC: ANNOTATION +image: markup.jpg - Ceci est un menu contenant les fonctions d'annotation d'image : dessiner du texte, dessiner une ligne/flèche, dessiner un rectangle, dessiner un ovale Toutes ces fonctions ont un bouton [commit] qui valide la modification actuelle et vous permet d'en commencer une nouvelle (nouveau texte/ligne/rectangle/ovale) dans la même boîte de dialogue de modification. - ^Dessiner du texte Cette fonction dessine du texte directement sur l'image. Saisissez le texte dans la boîte de dialogue. Plusieurs lignes peuvent être utilisées. Après avoir saisi le texte, cliquez à gauche à l'endroit où vous voulez le texte sur l'image. Faites glisser pour déplacer le texte ailleurs. Clic droit pour supprimer le texte. Utilisez le bouton [Police] pour sélectionner une police différente. Utilisez le contrôle [Taille] pour augmenter ou diminuer la taille du texte. Utilisez le contrôle [Angle] pour changer l'angle d'inclinaison du texte. Les autres contrôles vous permettent de fournir une couleur d'arrière-plan autour du texte, une couleur de contour du texte, et un effet d'ombre. Vous pouvez sélectionner la couleur et la transparence pour tous ces éléments. Le contrôle de largeur ajuste la largeur des contours et des ombres. Le contrôle d'angle d'ombre définit l'angle de l'ombre. Utilisez les contrôles de relief pour donner au texte un aspect 3D. - Vous pouvez initialiser le texte à partir de n'importe quelle métadonnée disponible dans le fichier image. Saisissez la balise de métadonnées (ex. « user comments ») et appuyez sur [Récupérer]. Vous pouvez abréger les noms de balises, ex. « usercomments » au lieu de « User Comments ». - Les boutons [Ouvrir] et [Enregistrer] démarrent une boîte de dialogue de sélection de fichier avec laquelle vous pouvez charger ou enregistrer toutes les données de texte depuis ou vers un fichier. Tous les éléments de la boîte de dialogue sont chargés ou enregistrés, vous pouvez donc conserver une collection de chaînes de texte et de paramètres fréquemment utilisés. - Les boutons en bas fonctionnent comme suit : • Effacer - effacer les champs de texte et de métadonnées • Remplacer - l'image avec le texte ajouté remplace l'image actuelle • +Version - l'image avec le texte ajouté est enregistrée comme nouvelle version • Suivant - ouvrir le fichier suivant, placer le même texte à la même position • Appliquer - valider la modification actuelle et réinitialiser pour une nouvelle saisie de texte • Terminé - terminer la modification actuelle - l'image est prête à être enregistrée • Annuler - abandonner la modification actuelle - Pour ajouter le même texte à une série d'images : préparez et positionnez le texte, appuyez sur [Remplacer] ou [+Version], puis [Suivant], puis [Remplacer] ou [+Version], puis [Suivant] ... - Créer un filigrane : utilisez une transparence de texte de 70 % ou plus et une transparence d'arrière-plan de 100 %. Le texte doit être faiblement lisible. Utilisez les contrôles de relief pour donner au texte l'apparence d'être en creux dans l'image. - ^Dessiner une ligne Cette fonction dessine des lignes ou des flèches directement sur l'image. Saisissez une longueur et une largeur de ligne dans la boîte de dialogue, et sélectionnez une pointe de flèche si vous le souhaitez. Cliquez à gauche à l'endroit où vous voulez la placer sur l'image. Faites glisser les extrémités de la ligne/flèche pour la positionner sur l'image. Clic droit pour la supprimer. Faites glisser depuis le milieu de la ligne pour la déplacer sans changer l'angle ou la longueur. Les contrôles de la boîte de dialogue vous permettent de fournir une couleur d'arrière-plan, une couleur de contour, et un effet d'ombre. Vous pouvez sélectionner la couleur et la transparence pour tous ces éléments. Le contrôle de largeur ajuste la largeur des contours et des ombres. Le contrôle d'angle d'ombre définit l'angle d'inclinaison de l'ombre. Pour conserver une ligne dessinée et en commencer une autre, appuyez sur [appliquer]. - ^Dessiner un rectangle Choisissez une couleur et une largeur pour le contour du rectangle. Placez le curseur à la position où vous voulez un coin du rectangle, et faites glisser pour ouvrir le rectangle dans la direction souhaitée. Pour remplacer le rectangle, glissez à nouveau. Pour déplacer le rectangle, maintenez la touche majuscule et faites glisser le rectangle depuis le centre. Pour déplacer l'un des bords, maintenez la touche majuscule et faites glisser le bord. Pour conserver un rectangle dessiné et en commencer un autre, appuyez sur [appliquer]. - ^Dessiner un ovale Choisissez la case à cocher ovale (ellipse) ou cercle. Choisissez une couleur et une largeur pour le contour. Placez le curseur au centre désiré. Faites glisser pour dessiner l'ovale/cercle. L'angle du glissement détermine la forme de l'ovale, du cercle à l'ellipse extrême, large ou haute. Pour remplacer l'ovale/cercle, glissez à nouveau. Pour déplacer l'ovale/cercle, maintenez la touche majuscule et faites glisser depuis le centre. Pour changer la taille ou la forme, maintenez la touche majuscule et faites glisser depuis le bord inférieur droit. Pour conserver un ovale/cercle dessiné et en commencer un autre, appuyez sur [appliquer]. Pour un ovale, vous pouvez saisir un angle de 0-90 degrés pour des axes inclinés, comme dans l'exemple. - - TOPIC: MODE COULEUR +image: color-mode.png +image: color-mode2.jpg - Utilisez cette fonction pour créer un négatif noir et blanc ou couleur, ou convertir une image négative en image positive, ou convertir en coloration sépia (pour un effet de photo vieillie). Le curseur peut être utilisé pour appliquer l'effet de manière incrémentale, de 0 % à 100 %. - - TOPIC: PEINDRE LES MODIFICATIONS Utilisez cette fonction en combinaison avec une autre fonction de modification. Démarrez une fonction de modification et laissez les contrôles dans une position neutre. Puis démarrez Peindre les modifications. Peignez la fonction de modification où vous le souhaitez avec la souris. Voir {MOUSE PAINTING} pour savoir comment appliquer des modifications localement avec la souris. - Cette méthode pour « peindre » des modifications de manière incrémentale peut améliorer rapidement et facilement des zones sélectionnées d'une image. Elle fonctionne avec les fonctions de modification suivantes : • Édition > Retoucher, Mode couleur • Réparation > Netteté, Flou, Réduction du bruit, Anti-brume, Ajuster RVB, Ajuster TSL • Correction > Aplatir l'histogramme, Contraste local, Amplifier le contraste, Retinex local, Saturation, Flou artistique • Effets > Contours, Croquis2, Relief, Texture, Ajouter un éblouissement, Définir les couleurs, Décaler les couleurs, Noyau personnalisé - - TOPIC: PEINDRE L'IMAGE +image: paint-image.jpg - Cette fonction peint sur l'image avec des couleurs sélectionnées, à l'aide de la souris. Voir {MOUSE PAINTING} pour savoir comment appliquer des modifications localement avec la souris. - Le bouton Couleur de peinture affiche la couleur actuelle. Cliquez sur ce bouton pour choisir une couleur à l'aide de la boîte de dialogue standard de sélection de couleur de Gnome. Vous pouvez aussi faire maj + clic gauche sur l'image pour choisir une couleur depuis l'image. - Le bouton palette ouvre la boîte de dialogue montrée au milieu. Cliquez sur l'image pour sélectionner la couleur à cette position. La couleur choisie se reflète dans le bouton de couleur de la boîte de dialogue principale. L'image montrée ci-dessus est celle par défaut. Vous pouvez utiliser n'importe quelle image comme source de couleur. Appuyez sur le bouton [parcourir] et sélectionnez une image où vous avez enregistré des couleurs pour rappel. Ce choix reste en vigueur jusqu'à ce qu'il soit changé. - Le bouton TSL ouvre un sélecteur de couleur TSL montré à droite. Cette boîte de dialogue peut représenter n'importe quelle couleur possible. Déplacez les curseurs pour obtenir la couleur souhaitée. La couleur choisie se reflète dans le bouton de couleur de la boîte de dialogue principale. - Si peindre sur les zones transparentes est sélectionné, peindre sur les zones transparentes réduira ou éliminera la transparence, selon les contrôles d'opacité. Si cette option n'est pas sélectionnée, seules les zones opaques de l'image sont peintes. - ^Fonctionnement avec tablette Wacom Avec Peindre l'image, vous pouvez utiliser une tablette Wacom au lieu d'une souris. Faire glisser le stylet en contact avec la surface de la tablette peindra comme décrit ci-dessus. Si l'un des boutons du stylet est maintenu enfoncé pendant le glissement, l'opération sera effacer au lieu de peindre. Vous pouvez aussi définir le mode peindre ou effacer à l'aide des boutons radio dans la boîte de dialogue. Maintenir un bouton du stylet enfoncé est peu pratique, c'est pourquoi les boutons radio sont là. Ajouter de la pression sur le stylet augmentera l'opacité, vous pouvez donc faire des traits plus légers ou plus foncés sans ajuster les contrôles d'opacité. - - TOPIC: PEINDRE LA TRANSPARENCE +image: paint-transp.png +image: paint-transp2.jpg - Peindre des zones transparentes ou semi-transparentes sur une image. Voir {MOUSE PAINTING} pour savoir comment appliquer des modifications localement avec la souris. - - TOPIC: REMPLISSAGE DE ZONE Remplir toutes les zones sélectionnées ou toutes les zones transparentes avec une couleur de superposition choisie. Si une zone est partiellement transparente, la couleur de superposition remplacera la fraction transparente de l'image. Le curseur « Fondu » peut être utilisé pour sélectionner n'importe quel mélange de l'image originale et de la couleur de superposition. - - TOPIC: COPIER DANS L'IMAGE Peindre sur des zones d'image en copiant depuis un autre endroit de la même image. Cette méthode peut être utilisée pour dupliquer des objets à l'intérieur d'une image, ou effacer un objet indésirable en le remplaçant par un arrière-plan pris ailleurs. Cliquez à gauche sur l'image pour sélectionner un emplacement source, puis cliquez à droite pour sélectionner la destination correspondante. Voir {MOUSE PAINTING} pour savoir comment appliquer des modifications localement avec la souris. - Si peindre sur les zones transparentes est sélectionné, peindre sur les zones transparentes réduira ou éliminera la transparence. Si cette option n'est pas sélectionnée, seules les zones opaques de l'image sont peintes. - - TOPIC: COPIER DEPUIS L'IMAGE Peindre sur des zones d'image en copiant depuis une autre image. L'image cible est « peinte » en faisant glisser la souris sur la zone à modifier. Une position précédemment sélectionnée dans l'image source est copiée sur l'image cible. La zone étant copiée et la zone étant peinte sont toutes deux englobées dans des cercles qui se déplacent avec la souris. Dans l'exemple ci-dessus, le bateau dans l'image de droite a été copié dans l'image de gauche. - Commencez par ouvrir l'image cible. Sélectionnez le menu « Copier depuis l'image ». Une 2e session Fotocx démarre montrant la même image. Dans cette 2e session, naviguez vers l'image source et ouvrez-la. Disposez les deux fenêtres afin de pouvoir garder les deux en vue (au moins les zones à copier). Maj + clic gauche sur l'image source pour établir une position source. Maj + clic gauche sur l'image cible à la position de destination. - Glissez à gauche la souris sur la zone de l'image cible. Les pixels de l'image source sont copiés vers l'image cible. Zoomez les images à la taille maximale si une haute précision est nécessaire pour les positions de référence. La position de référence initiale est (0,0) (coin nord-ouest) pour les deux images. Voir {MOUSE PAINTING} pour savoir comment appliquer des modifications localement avec la souris. - La valeur d'échelle de l'image source est utilisée pour mettre à l'échelle l'image source par rapport à l'image cible. Commencez par faire une copie d'essai pour vérifier l'échelle. Si trop grande ou trop petite, utilisez [undo all] pour effacer l'essai, changez la valeur d'échelle, et réessayez. - Si peindre sur les zones transparentes est sélectionné, peindre sur les zones transparentes réduira ou éliminera la transparence, selon les contrôles d'opacité de la souris. Si cette option n'est pas sélectionnée, seules les zones opaques de l'image sont peintes. - - TOPIC: COPIER LA MODIFICATION PRÉCÉDENTE L'image d'une étape de modification précédente peut être appliquée à l'image actuelle localement et progressivement, en « peignant » avec la souris. La modification précédente doit être l'une des modifications faites à l'image actuelle pendant qu'elle est encore ouverte - les modifications non enregistrées sont perdues lorsqu'une nouvelle image est ouverte. Vous pouvez appliquer n'importe quelle modification précédente à n'importe quelle zone de l'image actuelle en cours de modification, tant que l'image reste ouverte comme image actuelle. Sélectionnez une modification précédente à l'aide de la liste déroulante qui montre toutes les étapes de modification précédentes faites sur l'image actuelle, en séquence, et identifiées par la fonction de modification utilisée. Voir {MOUSE PAINTING} pour savoir comment appliquer des modifications localement avec la souris. - - TOPIC: MENU RÉPARATION - - TOPIC: NETTETÉ +image: sharpen.png - Cette fonction dispose de cinq méthodes pour rendre nette une image floue, et une méthode pour corriger le flou de mouvement dû au mouvement de l'appareil photo ou du sujet pendant l'exposition. - Choisissez la méthode, réglez les paramètres, appuyez sur [appliquer] et attendez quelques secondes pour voir le résultat. Faites des changements et répétez le processus jusqu'à satisfaction. Utilisez {SÉLECTIONNER UNE ZONE} pour opérer sur différentes parties d'une image avec différentes méthodes et paramètres. - Pour toutes les méthodes, choisissez un petit rayon pour les images légèrement floues et des valeurs plus grandes pour les images de moins bonne qualité. Quantité contrôle la force de la modification. Seuil supprime les changements sur les pixels à faible contraste : une valeur plus élevée réduit l'amplification des irrégularités de bas niveau (bruit d'image, tons de peau inégaux, etc.). - Masque flou : une méthode classique trouvée dans la plupart des éditeurs d'images. Une description technique peut être trouvée par une recherche sur internet. Cette méthode peut créer des « halos » visibles autour des bords à fort contraste. - Amplifier le contraste : amplifie le contraste existant. L'efficacité est comparable au masque flou, mais les « halos » sont réduits. - Kuwahara : de petits voisinages autour de chaque pixel sont comparés entre eux. Le pixel reçoit la couleur moyenne du voisinage ayant la plus petite différence. Cela force les pixels sur un bord flou à correspondre à un côté ou l'autre du bord. Les bords deviennent très nets. L'image peut paraître « en blocs » si un grand rayon est utilisé. Des détails subtils peuvent être perdus. - Différence médiane : la luminosité du pixel est comparée à la médiane des pixels dans le rayon. La luminosité est augmentée ou diminuée pour les pixels respectivement plus clairs ou plus sombres que la moyenne du voisinage. L'efficacité est comparable au masque flou, mais les « halos » sont grandement réduits. C'est la seule méthode qui traite chaque couleur RVB séparément. Elle peut rendre nette une transition de couleur même s'il y a peu de changement de luminosité. - Richardson-Lucy : l'image est rendue nette en utilisant la méthode de déconvolution de Richardson-Lucy. Cette méthode peut produire les meilleurs résultats, mais est aussi assez lente. Pour accélérer les choses, commencez par sélectionner une petite zone chargée en détails de l'image avec {SÉLECTIONNER UNE ZONE}. Recherchez le rayon et le nombre d'itérations optimaux en utilisant cette petite zone. Puis utilisez les mêmes paramètres pour l'image complète. Le bruit dans l'image gênera l'efficacité. Si c'est le cas, utilisez {RÉDUCTION DU BRUIT} au préalable. - Une image agrandie exactement 2x peut être rendue nette avec Richardson-Lucy, en utilisant un rayon de 2,0 et 4 itérations ou plus. Les résultats sont remarquablement bons. - ^Corriger le flou de mouvement +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - Optimiser manuellement des images avec un léger flou dû au mouvement de l'appareil photo ou de l'objet. Le flou d'un objet en mouvement dans une image par ailleurs nette peut être traité avec {SÉLECTIONNER UNE ZONE} pour isoler l'objet. Le flou est supposé être linéaire et à vitesse constante. Les entrées sont l'« étendue du flou » en pixels et l'« angle de flou » en degrés. L'estimation initiale de l'angle peut être spécifiée par maj + glissement de la souris sur l'image dans la direction du flou (peut être identique ou opposée au mouvement réel). Saisissez une estimation de l'étendue du flou en utilisant Outils > Afficher RVB pour mesurer la largeur du flou le long d'un bord d'élément d'image lumineux. Ajustez les entrées, appuyez sur [appliquer], et inspectez l'image pour trouver les paramètres optimaux. Le temps de réponse peut être lent pour une grande image. Vous pouvez accélérer le processus si vous utilisez {SÉLECTIONNER UNE ZONE} pour sélectionner une petite zone floue afin d'optimiser l'étendue et l'angle, puis effacez la zone pour traiter toute l'image avec les mêmes paramètres. L'algorithme peut produire un bruit de « ringing », qui peut être supprimé en utilisant l'entrée « supprimer le ringing ». Il est préférable de laisser la valeur de suppression basse pour trouver l'étendue et l'angle optimaux, puis d'ajouter de la suppression selon les besoins pour réduire le ringing. La méthode de déconvolution de Richardson-Lucy est utilisée dans une dimension. - ^Flou de mouvement d'appareil photo numérique Toutes les photos floues n'ont pas le flou à vitesse constante le mieux adapté à cette méthode. L'image peut être une superposition de plusieurs expositions plus courtes. L'image entière peut ne pas être exposée en même temps ni avoir le même flou (obturateur mécanique ou électronique en mouvement). Cette méthode peut tout de même produire de meilleurs résultats que les outils de netteté qui fonctionnent en deux dimensions. Elle devrait mieux fonctionner sur d'anciennes photos prises avec des appareils argentiques, où le flou de mouvement est plus proche d'une vitesse constante. - - TOPIC: FLOU +image: blur.jpg - Choisissez une méthode avec la case à cocher correspondante, saisissez les paramètres requis, appuyez sur [appliquer]. Si {SÉLECTIONNER UNE ZONE} est active, seules les zones sélectionnées sont affectées. - ^Flou normal Mélange chaque pixel avec les pixels environnants dans le rayon. Les pixels les plus proches ont un poids plus élevé. Vous pouvez régler le rayon à 1 et appuyer sur [appliquer] de manière répétée pour augmenter le flou lentement tout en surveillant le résultat sur l'image. - Vous pouvez optionnellement flouter par des quantités différentes dans les directions horizontale et verticale si vous saisissez des valeurs horizontale et verticale séparées. L'entrée [rayon] forcera les mêmes valeurs pour les deux. - ^Flou radial Mélange chaque pixel avec les pixels le long d'une ligne depuis un centre choisi. Rayon définit une zone centrale qui n'est pas floutée. Longueur définit la plage de la ligne de flou : 0 à longueur, du centre vers le bord. Choisissez le centre en cliquant sur l'image. - ^Flou dirigé Tirez une position sur l'image avec la souris. La zone autour de la souris sera floutée dans cette direction. Étendue détermine la taille de la zone floutée. Intensité détermine la force du flou. - ^Flou progressif Seuls les pixels ayant moins de contraste que la limite de contraste donnée sont floutés, et le rayon de flou varie de 1 à la valeur donnée pour les pixels ayant un contraste correspondant variant de la limite donnée à zéro. En bref : les pixels à faible contraste sont floutés davantage que les pixels à fort contraste. Cela peut être utilisé pour lisser les tons de peau sans flouter les cheveux ni réduire l'étincelle des yeux. Poussé à l'extrême, cela produit un effet « dessin animé ». - ^Flou d'arrière-plan (Bokeh) Flouter les zones d'arrière-plan de l'image tout en laissant le premier plan net. Sélectionnez une ou plusieurs zones qui doivent rester nettes {SÉLECTIONNER UNE ZONE}. Après avoir sélectionné les zones de premier plan, inversez la sélection afin que l'arrière-plan soit maintenant sélectionné {INVERSER LA ZONE}. C'est la zone qui sera floutée. Il existe deux méthodes de flou disponibles : Flou constant : un rayon de flou constant est utilisé pour toutes les zones floutées. Augmenter le flou avec la distance : utiliser le rayon de flou minimum pour les pixels adjacents au premier plan et le rayon de flou maximum pour les pixels à la distance maximale du premier plan. Cela nécessite que la distance au bord soit calculée pour tous les pixels d'arrière-plan, ce qui peut prendre un temps considérable. Le rayon de flou peut être modifié sans recalculer les distances au bord. - - TOPIC: RÉDUCTION DU BRUIT +image: denoise.jpg - Réduire le bruit dans les photos prises dans des conditions de faible luminosité (ISO élevé), qui donne aux surfaces uniformes un aspect tacheté. Deux méthodes sont fournies, Médiane et Lissage. La meilleure méthode varie selon le bruit et les caractéristiques de l'image. Mélanger les méthodes (utiliser l'une puis l'autre) peut être utile. La valeur Rayon définit le voisinage de pixels qui sera utilisé pour comparer et ajuster un pixel donné. Une grande valeur (Rayon > 2) réduira le bruit plus efficacement mais peut aussi causer une perte de détail. La valeur limite fera ignorer les pixels dont les valeurs de luminosité RVB diffèrent de la médiane du voisinage de plus que ce montant. Ceci est nécessaire pour certaines images afin d'éviter que de minuscules détails lumineux soient traités comme du bruit - ex. les photos astronomiques. - Réglez une valeur Rayon et appuyez sur l'un des boutons de méthode. Chaque itération utilise l'image précédente comme point de départ, donc plusieurs itérations supprimeront progressivement le bruit et pourront flouter certains détails. Utilisez [réinitialiser] pour recommencer. Médiane avec Rayon 1, suivi de Médiane avec Rayon 2, est un bon compromis entre supprimer le bruit et préserver le détail. - Le curseur Zones peut être utilisé pour restreindre le traitement aux zones sombres uniquement, ou à une plage de zones plus large. Les zones sombres ont tendance à avoir un problème de bruit plus important que les zones claires. - Si vous voyez de minuscules taches de bruit qui persistent, augmentez la valeur limite, utilisez le bouton [réinitialiser], et continuez avec [médiane] ou [lisse]. - Vous pouvez appliquer un traitement différent dans différentes zones de l'image - voir {SÉLECTIONNER UNE ZONE}, et vous pouvez « peindre » l'image en utilisant un traitement différent dans différentes zones - voir {PEINDRE LES MODIFICATIONS}. - Chaque couleur RVB est traitée indépendamment. Il n'y a pas de traitement séparé de la chrominance ou de la luminance. - Le bouton [measure] démarre la boîte de dialogue de droite pour mesurer le niveau de bruit réel de l'image. Déplacez la souris sur l'image pour afficher les niveaux de bruit RVB dans le cercle de la souris (rayon 10, environ 300 pixels). Cela doit être une zone sans caractéristique afin que le bruit soit la seule variation présente. Inspectez l'image à une taille 4X pour être sûr de voir du bruit et non de la texture. Les points montrent les valeurs RVB de pixels individuels par rapport à la moyenne des 5x5 pixels environnants, représentée par la ligne pleine centrale. Les nombres en bas montrent la luminosité RVB moyenne et les niveaux de bruit sur l'échelle 0-255. L'échelle du graphique va de -10 à +10 et les lignes pointillées sont à -5 et +5, par rapport à une plage totale de 0-255. Le bruit dans le 9e ou 10e bit RVB est de 0,5 ou 0,25 sur cette échelle. - ^Bruit d'image RAW Pour mesurer le bruit du capteur de l'appareil photo, utilisez une image RAW. Les images JPEG sont traitées à l'intérieur de l'appareil photo pour réduire le bruit. Vous pourriez être surpris par les niveaux de bruit typiquement élevés dans les images RAW. Même les appareils photo coûteux avec de grands capteurs peuvent avoir moins de 8 bits de couleur à faible bruit. Lorsque vous filtrez le bruit d'une image RAW, vous êtes en concurrence avec l'électronique et le logiciel qui produisent le JPEG de l'appareil photo. Il pourrait être difficile de faire mieux. - - TOPIC: ANTI-BRUME +image: defog.png +image: defog2.jpg - Supprimer la brume/le voile dans une image ou une zone sélectionnée. Il existe d'autres outils pour cela (aplatir l'histogramme, contraste local, amplifier le contraste, retinex, saturation), mais la suppression de la brume/du voile est secondaire à leur fonction principale. Cette fonction s'attaque directement à la brume/au voile : elle retire des quantités égales de couleur R/V/B (réduisant la luminosité et augmentant la saturation), et rajoute optionnellement la luminosité perdue. Elle peut aussi réduire le bleu si celui-ci devient trop dominant, comme cela arrive souvent avec la brume lointaine. Vous pourriez avoir besoin d'utiliser {SÉLECTIONNER UNE ZONE} ou {PEINDRE LES MODIFICATIONS} pour cibler et optimiser précisément les zones souhaitées. L'exemple ci-dessus a utilisé deux zones, les collines au premier plan et la montagne à l'arrière-plan. - - TOPIC: YEUX ROUGES +image: red-eyes1.png +image: red-eyes2.png - Réduire l'effet yeux rouges des photos au flash. Deux méthodes sont fournies. La première est plus rapide mais peut ne pas gérer les cas difficiles. La deuxième méthode est plus robuste mais nécessite aussi plus de temps et de soin. Pour utiliser la première fonction, cliquez à gauche sur un œil rouge une ou plusieurs fois jusqu'à satisfaction. Si la zone assombrie est trop petite ou décentrée, cliquez à droite pour annuler le changement puis cliquez à gauche plus précisément sur le centre de l'œil rouge. Si un œil rouge ne peut pas être corrigé correctement, cliquez à droite pour annuler le changement puis utilisez la deuxième méthode. La deuxième méthode peut mieux gérer les cas plus difficiles où l'œil rouge n'est que légèrement rouge et la différence de couleur avec les paupières est trop faible pour que l'algorithme automatique la distingue. Placez le curseur sur le centre de l'œil rouge. Maintenez le bouton gauche de la souris et faites glisser le curseur vers le bas et vers la droite. Une ellipse pointillée apparaîtra englobant l'œil rouge. Répétez si besoin pour centrer approximativement l'œil rouge dans l'ellipse. Notez que la forme de l'ellipse dépend de la direction du glissement, ce qui peut permettre un englobement plus précis de seulement l'œil rouge. Cliquez à gauche à l'intérieur de l'ellipse de manière répétée tout en observant l'œil rouge s'assombrir, et arrêtez lorsqu'il est assez sombre. Si vous allez trop loin, les paupières peuvent commencer à s'assombrir. Cliquez à droite pour annuler et répétez si nécessaire. - - TOPIC: EFFACEMENT INTELLIGENT +image: smart-erase.png +image: smart-erase2.jpg - Effacer les petits objets qui peuvent gâcher une bonne photo, comme les lignes électriques, les déchets au sol, un panneau, etc. L'objet indésirable est remplacé par des pixels pris de la zone environnante. Ceci est parfois très efficace (effets secondaires presque invisibles), et parfois non. Cela fonctionne mieux pour les petits ou fins objets dans la photo. Rayon contrôle la taille d'un cercle autour du pointeur de la souris, définissant la zone à sélectionner et effacer. Faites glisser la souris pour englober l'objet à retirer. Glisser à gauche sélectionne et glisser à droite désélectionne. Appuyez sur [Effacer] pour effacer la zone sélectionnée, remplaçant les pixels par les pixels les plus proches en dehors de la sélection. Si la sélection n'était pas assez précise, utilisez [Annuler], ajustez la zone sélectionnée, et [Effacer] à nouveau. Les sélections et effacements répétés s'accumuleront jusqu'à ce que vous utilisiez [New_Area] pour démarrer une nouvelle sélection. Les zones précédemment effacées sont maintenant fixées et [Annuler] ne fonctionnera que pour les sélections suivantes. Il est préférable de travailler avec une image zoomée à 200 % ou plus. Le contrôle Flou ajoute du flou aux pixels de remplacement. Cela peut réduire les effets secondaires visibles, car les pixels de remplacement peuvent être plus nets que l'environnement. Changez le paramètre Flou et répétez le bouton [Effacer]. Les boutons [show] et [hide] peuvent être utilisés pour afficher le contour de la sélection actuelle ou le masquer pour mieux juger les résultats après l'effacement. - Pour les objets longs et fins (ex. lignes électriques), vous pouvez cliquer sur deux positions et tout ce qui se trouve entre les deux sera sélectionné. La sélection fonctionne en ligne droite, donc pour les objets courbes vous devrez cliquer par intervalles pour suivre la courbe. - - TOPIC: SUPPRIMER LE HALO +image: remove-halo.png +image: remove-halo2.png - Supprimer les halos laissés par certaines fonctions de modification. Sélectionnez le type de halo : clair (le plus courant) ou sombre. Glissez à gauche la souris sur la zone de halo pour modifier les pixels à l'intérieur de la souris, comme montré dans l'exemple. Pour un halo clair, les pixels les plus clairs s'assombriront à mesure que la souris est glissée dessus. Pour un halo sombre, les pixels les plus sombres s'éclairciront. Utilisez un rayon de souris plus grand que la largeur du halo, comme montré dans l'exemple. Glissez à droite la souris pour restaurer les pixels originaux. - - TOPIC: ARTEFACTS JPEG +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - Les images JPEG qui ont été fortement compressées (avec un réglage de faible qualité) peuvent montrer des artefacts de compression sous forme de petits blocs rectangulaires. Si certaines zones d'une photo ont eu leur plage de luminosité étendue, ces blocs peuvent devenir plus visibles car les paliers de luminosité sont plus grands (ex. valeurs RVB de 11/12/13 éclaircies 5x à 55/60/65). Cette fonction floute les bordures entre les blocs pour les rendre moins visibles. - « Limite de correspondance » détermine quand des pixels adjacents sont traités comme membres du même bloc de pixels. La limite de correspondance peut être réglée à une valeur plus basse pour obtenir une cartographie plus complète de ces blocs. « Limite de contraste » sert à empêcher le fondu des bords où le contraste est élevé, causant une perte de détail. Changez les deux paramètres et appuyez sur [appliquer]. Visualisez l'image résultante à une taille >2x et essayez différents paramètres si l'optimisation est importante. Cette fonction sera moins efficace sur une image qui a été redimensionnée. Utilisez {SÉLECTIONNER UNE ZONE} pour traiter sélectivement les zones à problème. - - TOPIC: ANTI-ALIASING +image: anti-alias.jpg - Parfois les photos montrent une pixellisation (« crénelage ») le long de certains bords d'éléments à fort contraste. Dans l'exemple ci-dessus, vous pouvez voir cela autour de l'œil de l'oiseau. L'outil anti-crénelage peut réduire cela. L'effet est mineur sur la plupart des photos, où le traitement intégré à l'appareil photo a peut-être déjà pris en charge le problème. Un effet secondaire est que les artefacts jpeg dans les images fortement compressées sont quelque peu lissés. Les images qui ont été agrandies auront des pixellisations plus marquées. Celles-ci peuvent être aidées, en particulier dans le cas d'un agrandissement 2x. - Utilisez le bouton [appliquer] pour supprimer les pixels, plusieurs fois si cela semble aider. « Seuil » peut être utilisé pour exclure les pixels à faible contraste du traitement. Une valeur de 0,1 ou moins est généralement la meilleure. - Fotocx utilise l'algorithme Scale3x, modifié pour utiliser des tons de couleur « similaires » et « différents » à la place de « égal » et « pas égal ». - - TOPIC: AJUSTER RVB +image: adjust-RGB.png - Modifier la luminosité et le contraste global, ou ceux de couleurs sélectionnées. • Luminosité - augmenter ou diminuer la luminosité globale de l'image • +Rouge -Cyan etc. - changer la luminosité de la couleur et changer la couleur complémentaire dans la direction opposée • Contraste global - augmenter ou diminuer le contraste global de l'image • Contraste rouge vert bleu - traiter les couleurs RVB individuelles - - TOPIC: AJUSTER TSL +image: adjust-HSL.png - Modifier une plage de couleurs sélectionnée dans une image en utilisant TSL (Teinte, Saturation, Luminosité). Cette fonction peut être utilisée pour corriger une dominante de couleur ou changer une couleur en une autre (ex. un ciel surexposé - trop blanc). Si vous n'êtes pas familier avec le modèle colorimétrique TSL, lisez l'article Wikipédia à ce sujet. - Commencez par sélectionner une couleur cible de l'image à faire correspondre et ajuster, en utilisant maj + clic gauche sur l'image. Cette couleur sera le centre d'une plage de couleurs qui seront sélectionnées pour l'ajustement. Sélectionnez les attributs de couleur qui seront comparés à l'aide des cases à cocher pour teinte, saturation, et luminosité. Chacune d'elles réduira la plage de couleurs sélectionnées. Si aucune n'est cochée, toutes les couleurs sont sélectionnées. Niveau de correspondance peut être utilisé pour élargir davantage la plage de couleurs sélectionnées. 100 % signifie que seules les couleurs très proches sont sélectionnées. - Les contrôles Couleur de sortie (teinte, saturation, luminosité) sont utilisés pour définir la nouvelle couleur de sortie qui remplacera ou se mélangera avec les couleurs d'entrée sélectionnées. Vous pouvez aussi définir cette couleur à partir de l'image, en utilisant maj + clic droit. La couleur résultante sera un mélange de la couleur originale et de la nouvelle couleur. La fraction de nouvelle couleur est définie par le curseur Ajustement, qui peut être réglé de 0 à 100 %. Utilisez les cases à cocher TSL pour déterminer quelles composantes TSL de la couleur d'entrée sont remplacées par les composantes TSL correspondantes de la couleur de sortie. Utilisez les curseurs de couleur de sortie TSL pour ajuster la nouvelle couleur. La couleur de sortie est affichée dans la petite case à gauche, qui se met à jour lorsque vous déplacez les curseurs. - Déplacez les curseurs et observez les mises à jour en direct de l'image pour optimiser le résultat. Ceci n'est pas très intuitif, et la pratique aidera. Astuce : commencez par faire correspondre la teinte et la saturation, et ne remplacez que la teinte - cela signifie que la saturation et la luminosité de la couleur de sortie seront copiées des couleurs de l'image originale, et seule la teinte sera remplacée. - - TOPIC: SUPPRIMER LA POUSSIÈRE +image: remove-dust.png +image: remove-dust2.jpg - Les images faites à partir de diapositives numérisées poussiéreuses peuvent avoir de nombreuses petites taches sombres - des ombres de la poussière sur les diapositives. Les photos historiques d'internet ont souvent un problème similaire. Cette fonction peut supprimer la majorité de ces taches. Déplacez les trois curseurs jusqu'à ce que le nombre maximum de taches de poussière soit peint en rouge, puis appuyez sur le bouton [effacer] pour les effacer. Appuyez sur [red] pour ramener la vue rouge, puis vous pouvez ajuster les curseurs à nouveau et appuyer sur [effacer]. Le curseur « limite de taille des points » limite la taille des taches qui seront effacées. Le curseur « luminosité max. » définit un seuil pour ignorer les taches qui ne sont pas assez sombres. Le curseur « contraste min. » filtre les taches ayant un faible contraste avec leur environnement. Ce processus est généralement un compromis. Si les paramètres ne sont pas optimaux, de petits éléments comme des feuilles d'arbre peuvent être effacés, ou de grandes taches peuvent rester en place. Différentes parties de l'image peuvent nécessiter différents paramètres, ex. le ciel peut être traité plus agressivement qu'un mur de bâtiment. Vous pouvez simplement utiliser Effacer la poussière plusieurs fois avec différents paramètres selon les besoins pour éliminer toutes les taches de poussière. Ou vous pouvez utiliser {SÉLECTIONNER UNE ZONE} pour traiter l'image par sections. Si certaines taches persistent, vous pouvez les traiter manuellement avec {EFFACEMENT INTELLIGENT}. Réglez un petit rayon de souris et cliquez sur chaque tache pour la retirer. Les taches provenant de fibres (longues et fines) ne sont généralement pas retirées automatiquement, mais Effacement intelligent peut être efficace ici. Si la poussière est claire, comme dans l'exemple ci-dessus, utilisez {MODE COULEUR} pour créer un négatif couleur, traitez la poussière, puis répétez négatif couleur pour restaurer l'image normale. - - TOPIC: FRANGES +image: fringes.png +image: fringesA.jpg - Corriger les franges colorées périphériques (aberration chromatique latérale) - où les franges de couleur apparaissent principalement dans les zones extérieures de l'image. - L'image de gauche ci-dessus est une découpe agrandie du coin supérieur gauche d'une photo présentant une aberration chromatique latérale. Ceci a été en grande partie éliminé dans l'image traitée à droite. Les franges de couleur peuvent apparaître le long des bords à fort contraste, en particulier dans les zones extérieures de l'image où les distorsions de l'objectif sont généralement les plus fortes. Pour vous en débarrasser, zoomez l'image à la taille maximale et centrez sur une zone avec des franges de couleur. Appuyez sur le bouton [search]. Les plans de couleur rouge et bleu sont redimensionnés pour mieux s'aligner avec le plan vert, et les facteurs utilisés sont insérés dans la boîte de dialogue. Vous pourriez pouvoir améliorer le résultat en révisant les facteurs directement dans la boîte de dialogue : changez les facteurs tout en observant les franges de couleur sur l'image. - Cette fonction sera moins efficace si l'image a été recadrée de sorte que le centre de l'image ne correspond plus au centre de la photographie originale. - - TOPIC: MENU CORRECTION - - TOPIC: APLATIR L'HISTOGRAMME +image: flatten1.jpg +image: flatten2.jpg - Augmenter le détail visible dans les zones ayant un faible contraste. La luminosité des pixels est ajustée vers le haut ou le bas pour rendre la distribution de luminosité (histogramme) de la zone autour du pixel plus uniforme. Un rayon plus petit (zone plus petite) intensifiera l'effet. Il existe 5 zones de luminosité, de la plus sombre (1) à la plus claire (5). Déplacez un curseur pour augmenter l'effet pour la zone correspondante. Utilisez le curseur zone A pour déplacer les 5 curseurs ensemble et régler rapidement un résultat initial. Puis utilisez les autres curseurs individuellement pour affiner l'image. - - TOPIC: CONTRASTE LOCAL +image: localcon1.jpg +image: localcon2.jpg - Augmenter le contraste dans chaque zone d'une image. La luminosité de chaque pixel est comparée à la luminosité moyenne de la zone environnante. La luminosité des pixels est ajustée pour augmenter cette différence. Cette fonction met en œuvre une méthode classique largement utilisée. Rayon détermine la taille de la zone autour de chaque pixel utilisée pour la luminosité moyenne. Puissance détermine l'ampleur du changement de luminosité. Couleur est utilisé pour augmenter la saturation des couleurs. Vous pouvez utiliser la courbe modifiable pour éclaircir l'image de sortie pour des niveaux de luminosité sélectionnés. L'exemple montre l'éclaircissement des zones plus sombres de l'image. - Le Contraste local peut créer des « halos » dans certaines circonstances : +image: localcon3.jpg - L'image originale est à gauche. L'image du milieu a eu le Contraste local appliqué à puissance maximale. Un halo peut être vu le long de la frontière entre les collines sombres et le ciel plus clair. Cela peut être corrigé avec une astuce simple (image de droite). Sélectionnez les zones du ciel séparément, en utilisant {SÉLECTIONNER UNE ZONE}. Appliquez le Contraste local à cette zone. Inversez la sélection et appliquez le Contraste local au reste de l'image. - - TOPIC: AMPLIFIER LE CONTRASTE +image: amplify-contrast.png +image: amplify-contrast2.jpg - Augmenter la plage de luminosité apparente d'une image en augmentant le contraste local. Cela peut augmenter les zones à faible contraste sans changer les zones à fort contraste. Vous pouvez aussi utiliser la courbe de modification pour faire varier l'amplification du contraste selon la quantité initiale de contraste. - Le curseur Amplifier sous la courbe régule le calcul, de l'absence d'amplification du contraste à l'amplification complète. S'il est déplacé trop loin vers la droite, l'image peut montrer des artefacts disgracieux, alors reculez-le jusqu'à ce qu'ils disparaissent. Si des zones uniformes (ex. ciel) deviennent tachetées, tirez l'extrémité gauche de la courbe vers le bas pour réduire l'amplification des zones à faible contraste. Dans certains cas, il sera préférable de sélectionner différentes zones de l'image et de les traiter séparément, ex. de manière conservatrice pour le ciel, plus agressive pour les surfaces texturées comme les murs en pierre. - - TOPIC: RETINEX GLOBAL +image: global-retx.png +image: global-retx2.jpg - Améliorer la couleur et le contraste pour les images avec une brume/un voile extrême ou une dominante de couleur (ex. une photo vieille de 100 ans). Essayez d'abord le bouton [Auto]. L'image est analysée pour trouver les couleurs RVB les plus claires et les plus sombres présentes. Les valeurs RVB les plus sombres sont soustraites de tous les pixels et les valeurs RVB résultantes sont mises à l'échelle pour que les valeurs RVB maximales soient proches de 255. Bien sûr cela peut ne pas être optimal au départ. Les boutons rotatifs sont réglés sur les limites RVB sombre et blanche trouvées, et vous pouvez les changer pour optimiser l'image résultante. Vous pouvez choisir vos propres points sombres et clairs en sélectionnant l'option correspondante dans la boîte de dialogue et en cliquant sur l'image. Les boutons rotatifs multiplicateurs sont réglés sur 1,0 par défaut, et vous pouvez changer ces valeurs pour ajuster la luminosité relative de chaque couleur RVB. Dans l'exemple ci-dessus, la 1ère image est l'originale, la 2e image a été faite en utilisant le bouton [Auto]. La colonne de boutons rotatifs la plus à droite ajustera tous les boutons de la même ligne ensemble - utilisez la molette de la souris ou les touches flèche haut/bas du clavier. - Le curseur de fondu est utilisé pour mélanger l'image d'entrée et l'image retinex dans n'importe quel ratio. Le curseur réduire les zones claires est utilisé pour atténuer l'effet pour les zones d'image plus claires, en particulier le ciel, où Retinex peut produire des résultats d'apparence étrange. - L'algorithme a été dérivé de concepts publiés pour la première fois par Edwin Land dans les années 1970. Recherchez « retinex » sur internet pour plus d'informations. - - TOPIC: RETINEX LOCAL +image: local-retx.png +image: local-retx2.jpg - Augmenter les détails visibles dans les zones sombres de l'image et les autres zones ayant un faible contraste. La plage de luminosité d'une zone autour de chaque pixel est utilisée pour redimensionner la luminosité du pixel comme si toute la zone était redimensionnée pour couvrir toute la plage de luminosité 0-255. Retinex local peut produire des résultats spectaculaires là où Retinex global est faible. - L'entrée rayon détermine la taille approximative de la zone autour de chaque pixel. Le curseur de fondu est utilisé pour mélanger l'image d'entrée et l'image retinex dans n'importe quel ratio. Le curseur réduire les zones claires est utilisé pour atténuer l'effet pour les zones d'image plus claires, en particulier le ciel, où Retinex peut produire des résultats étranges. Le curseur réduire les zones sombres fait de même pour les zones d'image plus sombres. L'exemple ci-dessus est environ 60 % image originale + 40 % retinex. - - TOPIC: SATURATION +image: saturation.png - Ajuster la saturation des couleurs selon la luminosité des pixels. L'axe Y de la courbe de modification est la saturation des couleurs, de zéro couleur (toutes les valeurs RVB égales) à couleur maximale (la plus faible valeur RVB est zéro). L'axe X de la courbe est la luminosité des pixels, du sombre à la luminosité maximale. La position neutre (aucun changement de couleur) est la valeur médiane, qui est aussi la valeur initiale. Exemple : pour augmenter l'intensité de couleur des zones sombres de l'image, relevez l'extrémité gauche de la courbe. Le curseur Saturation déplace toute la courbe vers le haut ou le bas sans changer sa forme. - - TOPIC: FLOU ARTISTIQUE +image: soft-focus2.jpg +image: soft-focus.png - Appliquer l'effet classique de « flou artistique » à une photo. C'est un mélange d'une image nette et d'une image légèrement floue. Le réglage du rayon détermine l'étendue du flou (portée en pixels), et le réglage du mélange définit la proportion de l'image floue dans l'image de sortie mélangée, de 0 à 100 pourcent. Vous pouvez utiliser {PEINDRE LES MODIFICATIONS} avec cette fonction, pour faire varier l'effet selon différentes zones de l'image. - - TOPIC: DÉGRADÉ DE LUMINOSITÉ +image: brite-ramp1.png +image: brite-ramp2.png - Faire varier la luminosité ou la couleur sur une image. Vous pouvez utiliser ceci pour compenser un éclairage inégal ou une dominante de couleur qui varie sur l'image. La direction du changement est déterminée en dessinant une ligne sur l'image. Créez la ligne en cliquant sur l'image, puis faites glisser l'une ou l'autre extrémité pour définir la direction souhaitée. Dans l'exemple ci-dessus, le vert a été augmenté dans la direction de la ligne. Modifiez d'abord la courbe All pour ajuster la luminosité globale (toutes les couleurs), puis ajustez les courbes de couleur RVB individuelles si besoin. - - TOPIC: VIGNETTE +image: vignette.png +image: vignette2.jpg - Corriger l'assombrissement parfois observé dans les coins d'une photo. Cela peut aussi être utilisé pour mettre en évidence ou coloriser un objet ou une zone dans une image. - Cliquez ou faites glisser la souris sur l'image pour changer le centre de la vignette, qui est initialement au centre de l'image. - Sélectionnez « Luminosité » pour changer la luminosité de l'image selon un motif radial : ajustez l'extrémité gauche ou droite de la courbe pour changer respectivement la luminosité du centre et des bords de l'image. Vous pouvez donner un entourage sombre à un visage en portrait, ou vous pouvez corriger une image avec des coins assombris. Le niveau médian de la courbe correspond à aucun changement. Utilisez des valeurs plus basses pour assombrir et des valeurs plus hautes pour éclaircir. L'exemple ci-dessus assombrit progressivement la périphérie de l'image tout en laissant une large zone centrale inchangée. - Sélectionnez « Couleur » pour ajouter une couleur choisie à l'image selon un motif radial. Les valeurs de courbe de zéro représentent aucun changement, et des valeurs plus hautes ajoutent la couleur choisie à l'image. La valeur la plus haute correspond à 100 % de couleur. Utilisez cette fonction pour ajouter un entourage de couleur à une image, ex. entourer un visage avec une couleur progressivement croissante. - - TOPIC: MENU EFFETS - - TOPIC: CONTOURS +image: outlines1.png +image: outlines2.jpg - Transformer une photo en dessin au trait. Les pixels à fort contraste sont intensifiés et les pixels à faible contraste sont supprimés. Le réglage de seuil définit les seuils de contraste. Les lignes en dessous du minimum ne sont pas affichées, et celles au-dessus du maximum auront la luminosité maximale. La case à cocher « noir/blanc » convertit les lignes colorées en noir sur blanc ou blanc sur noir, selon la case à cocher « négatif ». Utilisez « Faible amplification » pour éclaircir les lignes fanées si vous le souhaitez. « Mode B » donne une luminosité de ligne plus uniforme comparé au « Mode A ». - - TOPIC: CROQUIS1 +image: sketch1.jpg - Transformer une photo en quelque chose ressemblant à un croquis. Les pixels sombres sont agrégés en moins de pixels, laissant les zones libérées plus claires. Le contraste peut aussi être utilisé comme indicateur des pixels sombres. Seuil peut être utilisé pour filtrer l'image d'entrée par luminosité. Niveau d'écrêtage est utilisé pour filtrer la sortie afin de réduire davantage les pixels sombres isolés ou marginaux. Choisissez les couleurs pour le premier plan et l'arrière-plan. Réduire la taille de l'image d'entrée peut donner des résultats intéressants. Si le résultat paraît « sale », utilisez {RÉDUCTION DU BRUIT} ou {FUSION} pour lisser l'image avant de traiter ici. - - TOPIC: CROQUIS2 +image: sketch2.png +image: sketch2b.jpg - Transformer une photo en quelque chose ressemblant à un croquis. Cela utilise une méthode différente : les pixels à faible ... fort contraste sont convertis en pixels clairs ... sombres respectivement. La courbe peut être utilisée pour augmenter ou diminuer la puissance de la conversion de contraste. L'échelle de l'axe x est le contraste des pixels, de faible à élevé, et la valeur y détermine la force de la conversion. L'exemple montre les pixels à faible contraste étant supprimés (rendus plus clairs). L'image d'entrée peut être mélangée à n'importe quel ratio. Si le résultat paraît « sale », utilisez {RÉDUCTION DU BRUIT} ou {FUSION} pour lisser l'image avant de traiter ici. - - TOPIC: DESSIN ANIMÉ +image: cartoon.jpg - Transformer une photo en dessin façon dessin animé. Des lignes noires sont dessinées sur les bords des éléments de l'image, partout où la luminosité ou la couleur change brusquement. Seuil de ligne définit la sensibilité de la détection des bords et du tracé des lignes, entraînant le dessin de moins ou plus de lignes. Largeur de ligne rend les lignes plus épaisses ou plus fines. Profondeur Kuwahara contrôle une fonction de netteté qui peut renforcer les bords des éléments dans l'image. - - TOPIC: RELIEF +image: emboss2.jpg +image: emboss.png - Transformer une image en relief simulé ou image en relief (un effet 3D). Les bords des éléments sont rendus plus clairs d'un côté et plus sombres du côté opposé, comme s'ils étaient soulevés et éclairés de côté. Le réglage du rayon détermine la largeur de l'effet, et le réglage de la profondeur détermine l'intensité. Le réglage Source de lumière détermine l'angle d'où provient l'illumination apparente. Cela peut être varié pour maximiser l'effet pour les bords d'éléments les plus perpendiculaires à cet angle. - - TOPIC: TUILES1 Transformer une image en un ensemble de tuiles monochromes. Vous pouvez contrôler la taille des tuiles et l'épaisseur de l'espace entre les tuiles. Ceci est aussi appelé « pixelliser ». Utilisez Sélectionner une zone pour confiner la transformation à une zone limitée, ex. un visage. - - TOPIC: TUILES2 +image: tiles2a.png +image: tiles2b.png - Transformer une image en tuiles irrégulières qui se conforment approximativement aux couleurs et contours de l'image. ^taille de base :^ La taille de base des tuiles, qui est la taille de tuile unitaire utilisée pour créer des tuiles plus grandes. ^profondeur de couleur :^ Nombre de couleurs à utiliser : 1 = 8 couleurs, 2 = 64 couleurs ... 8 = 16 millions de couleurs. ^objectif de la zone de tuile^ : la limite supérieure de la taille des tuiles (aire en pixels). ^correspondance de couleur requise^ : définir la correspondance de couleur minimale requise pour qu'une zone plus petite soit consolidée dans une zone adjacente plus grande : 0 = peu importe (consolidation maximale), 100 = correspondance parfaite requise (consolidation minimale). - - TOPIC: PEINTURE +image: painting1.png +image: painting2.png - Transformer une image en quelque chose de similaire à une peinture. Cela réduit le nombre de couleurs, cartographie chaque zone de pixels contiguë ayant la même couleur, puis consolide les zones plus petites dans des zones adjacentes plus grandes ayant la meilleure correspondance de couleur. - ^rayon de flou^ : flouter l'image avant traitement. Cela donne des limites plus lisses. ^profondeur de couleur^ : nombre de couleurs à utiliser : 1 = 8 couleurs, 2 = 64 couleurs ... 8 = 16 millions de couleurs. ^objectif de la zone de correction^ : définir une limite inférieure pour les zones qui auront leur propre couleur : les zones plus petites que ce nombre de pixels seront absorbées dans une zone adjacente ayant la couleur la plus proche. ^correspondance de couleur requise^ : définir la correspondance de couleur minimale requise pour qu'une zone plus petite soit consolidée dans une zone adjacente plus grande : 0 = peu importe (consolidation maximale), 100 = correspondance parfaite requise (consolidation minimale). ^bordures^ : détermine si les zones colorées seront délimitées par une fine bordure noire, comme des tuiles irrégulières dans une mosaïque. Après avoir utilisé cette fonction, utiliser {RELIEF} peut ajouter une texture intéressante à l'image. - - TOPIC: TEXTURE +image: texture2.jpg +image: texture.png - Ajouter une surface texturée à une image ou à des zones sélectionnées dans une image. Rayon détermine la taille du motif de texture. Force détermine l'intensité du motif, de presque invisible à dominant. - - TOPIC: FUSION +image: fusion.png +image: fusion2.jpg - Supprimer les petits détails à faible contraste dans une image tout en conservant la netteté des éléments plus grands de l'image. Appuyez sur [démarrer] et observez l'image attentivement. Le processus s'exécute en continu jusqu'à ce qu'il soit arrêté avec le bouton [arrêter]. Les petits détails s'estomperont lentement. L'étiquette « nombre » de la boîte de dialogue affiche le nombre d'itérations. Vous pouvez [arrêter] le processus pour inspecter l'image puis reprendre le traitement avec [démarrer]. Utilisez le bouton Annuler/Rétablir pour comparer l'état de l'image avant/après. Reprenez le traitement avec [démarrer]. Le bouton [étape] peut être utilisé pour traiter une étape à la fois. - - TOPIC: FAIRE CORRESPONDRE LES COULEURS +image: match-colors.png - Faire correspondre les couleurs d'une image à celles d'une autre. Un petit point, sélectionné avec un clic de souris, est échantillonné de chaque image. Le point sur la 2e image sera ajusté pour avoir la même couleur moyenne (valeurs RVB) que le point de la 1ère image. Les facteurs utilisés pour rendre les valeurs RVB identiques sont ensuite appliqués à tous les pixels de la 2e image. Un usage courant est de retirer une dominante de couleur d'une image en marquant un point sur l'image qui correspondra à une couleur d'une autre image. - Procédure : la boîte de dialogue liste 5 étapes à suivre dans l'ordre. • Définir un rayon pour la zone d'échantillon du point. Le cercle de souris résultant est la zone du point à échantillonner. • Ouvrir la 1ère image en appuyant sur le bouton [open]. • Cliquer sur l'image pour prendre un échantillon de couleur. • Ouvrir la 2e image en appuyant sur le bouton [open]. • Cliquer sur l'image au point que vous voulez faire correspondre à la 1ère image. Les couleurs de l'image changeront en une seconde ou deux. - - TOPIC: MOTIF +image: pattern2.jpg +image: pattern1.png - Ajouter un motif d'arrière-plan à une image. Un petit fichier image (fichier de motif) est utilisé pour couvrir l'image actuelle en dupliquant le fichier, comme un mur carrelé. Ce fichier peut être un vrai motif (ex. une image de tissu de toile, un mur de briques, une géométrie répétitive ...), ou tout autre type d'image. Le motif est rendu semi-transparent, afin que l'image de base semble être imprimée sur le motif, ou le motif sur l'image. De nombreux fichiers de motif peuvent être trouvés en effectuant une recherche web pour « pattern image ». Téléchargez-en quelques-uns et recadrez-les si besoin à une taille d'environ 200-500 pixels. Pour plus de commodité, ajoutez-les aux fichiers de motif fournis dans ~/.fotocx/patterns. - Utilisez le bouton [Parcourir] pour sélectionner un fichier de motif. Le motif sélectionné sera carrelé pour couvrir l'image de base. Le motif est partiellement transparent afin que l'image de base transparaisse. Utilisez Zoom pour agrandir ou réduire la taille du motif. Il existe deux méthodes pour mélanger le motif avec l'image de base. L'opacité du motif peut être réglée de 0-100 %. L'image de base est utilisée pour remplir l'opacité inutilisée. Contraste est utilisé pour modifier la luminosité de l'image de base en utilisant la luminosité du motif comme modèle. Les deux paramètres peuvent être mélangés dans n'importe quel ratio. - Si le fichier de motif contient une image qui se répète à intervalles fixes horizontalement et verticalement, le bouton [Calculer] peut être utilisé pour définir la largeur et la hauteur afin de créer un motif continu sans coutures visibles. - Si le motif est irrégulier et que des coutures sont apparentes, vous pourriez pouvoir améliorer cela. Les deux valeurs de Chevauchement déterminent combien les motifs dupliqués se chevauchent aux bords, horizontalement et verticalement. Ajoutez un peu de chevauchement pour masquer les effets de bord. - Sélectionner une zone peut être utilisé pour appliquer un motif à une partie d'une image, ou différents motifs à différentes parties. Après avoir appliqué un motif à une image, il pourrait être intéressant d'utiliser {RELIEF} pour ajouter un effet 3D au motif. - La case à cocher « Niveaux de gris » convertira un motif couleur en niveaux de gris. - - TOPIC: HACHURES CROISÉES +image: crosshatch2.jpg +image: crosshatch1.png - Convertir une image en dessin utilisant des lignes parallèles croisées. Saisissez une taille de grille et appuyez sur [appliquer]. - - TOPIC: TRAMAGE +image: dither1.png - +image: dither2.jpg - Cette fonction propose plusieurs façons de tramer une image - la convertir en points. 0 - points colorés dans le style de Roy Lichtenstein 1 - RVB pur ou noir/blanc avec distribution spatiale aléatoire ou optimisée 2 - mélange RVB avec une profondeur de bits donnée 3 - tramage classique avec une palette de couleurs personnalisée 4 - condenser l'image en taches avec la couleur moyenne des pixels condensés - Les tramages classiques utilisent la méthode Floyd-Steinberg de compensation des erreurs de couleur : décalage entre une couleur de l'image d'entrée et la couleur la plus proche de la palette. Des points de couleurs proches sont mélangés selon les besoins afin que la moyenne sur une zone corresponde plus étroitement à la couleur d'entrée. La compensation d'erreur peut être désactivée si vous le souhaitez, pour obtenir des bandes ou contours de couleur distincts. - Taches : les pixels de l'image subissent une sorte d'« effondrement gravitationnel », convergeant en amas autour de centres de masse locaux. « Masse » est défini comme la luminosité des pixels. Le contrôle « rayon » définit approximativement la portée de l'attraction. Appuyez sur [démarrer] pour démarrer l'effondrement. Observez l'image se transformer lentement en taches approximativement de la taille de l'entrée « rayon ». Lorsque les taches sont belles et rondes et changent très peu, appuyez sur [arrêter] pour terminer le processus. - - TOPIC: GRAVURE +image: engrave.png +image: engrave2.png - Convertir une image en lignes noir et blanc. L'entrée Taille détermine l'épaisseur des lignes et le nombre de pixels verticaux de l'image utilisés pour chaque colonne de pixels verticale dans les lignes de sortie. Les colonnes de pixels de ligne sont divisées en parties noires et blanches avec leur proportion correspondant approximativement à la luminosité moyenne des pixels d'entrée. L'entrée Décalage peut être utilisée pour optimiser la luminosité globale. Des valeurs négatives/positives rendent l'image plus sombre/plus claire. L'entrée Couleur (0-100 %) peut être utilisée pour ajouter de la couleur aux parties blanches. - - TOPIC: AJOUTER UN ÉBLOUISSEMENT +image: addglare.png +image: addglare2.jpg - Ajouter un éblouissement rayonnant depuis les points lumineux d'une image. Puissance : détermine la luminosité relative de l'éblouissement Limite : seuil de luminosité des pixels pour émettre l'éblouissement Portée : plage en pixels de l'éblouissement depuis les pixels émetteurs Les pixels avec une luminosité au-dessus de la limite (200-255) émettront un éblouissement. Luminosité signifie ici la luminosité de la couleur RVB la plus claire dans un pixel. L'éblouissement émis est de la couleur du pixel émetteur. Portée est en unités de pixels. L'éblouissement sera maximal au pixel émetteur et diminuera jusqu'à zéro à la limite de portée. - - TOPIC: MOSAÏQUE +image: mosaic1.png +image: mosaic2.jpg - Créer une image en mosaïque en utilisant des tuiles faites à partir de toutes vos images. - Spécifiez la taille des tuiles en pixels (ex. 36 x 24) et appuyez sur [Tuiles]. Des tuiles seront créées à partir de toutes vos images (en fait les vignettes sont utilisées, pour la vitesse). Si vous changez les dimensions des tuiles, appuyez à nouveau sur [Tuiles] pour régénérer les tuiles. Une fois les tuiles créées, appuyez sur [Image] pour convertir l'image actuelle en mosaïque en utilisant ces tuiles. Les tuiles sont choisies en faisant correspondre la couleur moyenne de la tuile à la couleur moyenne de l'image à la position de la tuile. Si des milliers d'images sont disponibles et si la gamme de couleurs est suffisamment bonne, la mosaïque sera plutôt réussie. Zoomez sur n'importe quelle partie de l'image pour voir les images des tuiles. - Le curseur Fondu des tuiles fera fondre l'image avec les tuiles, la rendant plus belle si les tuiles ont une mauvaise correspondance de couleur. Si le fondu est inférieur à environ 50 %, les tuiles restent presque aussi nettes qu'avant, car l'œil compense la fausse teinte. - Une fois une mosaïque créée, vous pouvez cliquer sur n'importe quelle tuile pour obtenir une image popup plus grande. Si une mosaïque enregistrée est ouverte, cliquer sur les tuiles pour une image plus grande ne fonctionnera pas. Régénérer la mosaïque est assez rapide, alors faites-le si vous voulez que les popups fonctionnent. - - TOPIC: AJOUTER DU BRUIT +image: add-noise.png - Ajouter du bruit de couleur aléatoire à une image. Définissez une taille de point cible de 1-10 et un niveau de bruit de 0-100 %. À 100 %, un bruit aléatoire dans la plage -127 à +127 est ajouté à chaque valeur RVB de chaque pixel. La valeur moyenne est zéro. Les dépassements hors de la plage 0-255 sont tronqués. La couleur moyenne sur une grande zone est préservée, avec le bruit superposé. Vous pouvez utiliser Ajouter du bruit avec Sélectionner une zone ou Peindre les modifications pour ajouter du bruit à des zones sélectionnées. - ^Suppression du « banding » Dans les zones d'image où la distribution de luminosité a été « étirée », un « banding » visible peut se produire dans les zones de luminosité et couleur presque uniformes. Vous pouvez réduire ce problème en ajoutant du bruit (ou du flou) aux zones affectées. - - TOPIC: DÉFINIR LES COULEURS +image: set-colors1.jpg +image: set-colors2.jpg - Vous pouvez réduire le nombre de couleurs utilisées dans l'image pour créer un effet poster. Réglez chaque couleur RVB séparément, ou ajustez le nombre total de couleurs. La profondeur de bits de couleur n'est pas utilisée pour cela. Certaines fonctions de Fotocx utilisent la profondeur de bits, limitant les couleurs disponibles à 2, 4, 8 ... pour chaque couleur RVB. Cette fonction n'est pas limitée à cet égard. L'exemple ci-dessus utilise 8 rouges, 5 verts, et 3 bleus. - - TOPIC: DÉCALER LES COULEURS +image: shift-colors.png - Cette fonction peut être utilisée pour corriger les couleurs ou convertir une image en fausses couleurs. Choisissez l'une des trois couleurs RVB et déplacez le curseur à gauche ou à droite du centre. L'une des deux autres couleurs sera substituée de manière graduée. Par exemple, vous pouvez substituer progressivement le vert ou le bleu à la couleur rouge. Le curseur All décale toutes les couleurs ensemble. Faites cela en premier pour trouver un premier optimum, puis décalez les couleurs RVB individuellement. - - TOPIC: COULEURS ALIEN +image: alien-colors2.jpg +image: alien-colors1.png - Repeindre une image ou une zone sélectionnée avec des couleurs alien aléatoires. Vous pouvez contrôler la taille approximative du motif et l'intensité (de presque invisible à dominant). Appuyez sur [Appliquer] pour obtenir une nouvelle distribution de couleurs. - - TOPIC: NOYAU PERSONNALISÉ +image: custom-kernel.png - Appliquer un noyau de convolution personnalisé à une image. La technologie sous-jacente est expliquée sur Wikipédia. Saisissez une taille de noyau, un facteur multiplicateur, un facteur additif, et remplissez les valeurs du tableau. [Appliquer] applique le noyau à l'image. [Réinitialiser] restaure l'état original de l'image. Les valeurs peuvent être enregistrées dans un fichier et récupérées plus tard en utilisant les boutons [Enregistrer] et [Charger]. Plusieurs fichiers d'exemple de noyau sont disponibles au départ. Vous pouvez les modifier et les enregistrer avec un nom personnalisé. - Mathématiques : les valeurs de luminosité pour chaque bloc de N par N pixels dans l'image sont multipliées par les valeurs correspondantes dans la matrice du noyau et additionnées. Ce nombre est multiplié par le facteur multiplicateur, et le facteur additif y est ajouté. Cette valeur finale devient le nouveau niveau de luminosité pour le pixel de l'image au centre du bloc N x N. - - TOPIC: MENU DÉFORMATION - - TOPIC: REDRESSER +image: unbend1.png +image: unbend2.jpg - Les panoramas de sujets proches (typiquement des bâtiments ou des pièces intérieures) peuvent montrer des lignes droites qui sont courbées, ou des bâtiments inclinés. Déformer les images était nécessaire dans le processus de panorama pour que les images s'assemblent. La fonction Redresser peut être utilisée ensuite pour redresser l'image panoramique si besoin. Des lignes pointillées verticales et horizontales sont dessinées sur l'image, montrant les axes de redressement. Cliquez ou glissez la souris près de l'extrémité d'une ligne pour la déplacer. Si les valeurs dans les quatre contrôles d'entrée sont modifiées, l'image est déformée de la manière indiquée par les quatre images correspondantes. Augmentez ou diminuez les valeurs et répétez jusqu'à satisfaction. Déplacez les axes pour changer les centres de déformation. - Voir aussi {DÉFORMER L'IMAGE} pour une autre méthode de correction de la courbure et de la perspective de l'image. - - TOPIC: PERSPECTIVE +image: perspective2.jpg +image: perspective1.png - Cette fonction peut être utilisée pour redresser une photo prise sous un angle décalé. L'image de gauche est la photo originale, prise à droite du centre pour éviter les reflets. L'image de droite est la version redressée. Cette fonction peut aussi être utilisée pour redresser un immeuble élevé photographié depuis le niveau de la rue ou de côté. - Cliquez sur les quatre coins du tétraèdre que vous voulez transformer en rectangle (dans le cas ci-dessus, les quatre coins du tableau ou du cadre), puis sélectionnez [Appliquer]. Les coins cliqués sont marqués par de petites cases blanches contenant « A, B, C, D ». Le coin supérieur gauche de chaque case marque précisément la position sur l'image. Cliquer près d'une case la déplacera vers la nouvelle position. Vous pouvez utiliser les touches fléchées du clavier pour déplacer les marqueurs de coin par pas de 1 pixel. Les touches fléchées agissent sur le dernier coin cliqué ou déplacé. - - TOPIC: DÉFORMER L'IMAGE +image: warps4.jpg - - TOPIC: DÉFORMATION DE ZONE Cette fonction peut être utilisée pour créer des distorsions à l'intérieur d'une image. Vous pouvez sélectionner une zone d'image et faire glisser la souris pour étirer cette zone par rapport au reste de l'image. L'image est comme du caoutchouc. Si le glissement de la souris commence à l'intérieur de la zone sélectionnée, alors la zone est déformée à l'intérieur de ses limites actuelles - le mouvement est maximal au pointeur de la souris et décline jusqu'à zéro aux bords de la zone. Si le glissement de la souris commence en dehors de la zone sélectionnée, les bords de la zone près de la souris peuvent être tirés au-delà de la limite originale de la zone. De nombreux glissements de souris de longueurs et directions différentes peuvent être combinés pour obtenir les résultats souhaités. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - Cette fonction est utile pour corriger les problèmes de perspective. Faites glisser l'image depuis près d'un coin, avec la souris. L'image est tirée élastiquement depuis ce coin tandis que les autres coins restent fixes. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - Cette fonction est utile pour corriger les problèmes de perspective. Faites glisser l'image depuis l'intérieur, avec la souris. L'intérieur de l'image est tiré élastiquement tandis que les bords restent fixes. - - TOPIC: DÉFORMATION COURBE Cette fonction est utile pour corriger les problèmes de perspective (voir aussi {REDRESSER}). Faites glisser l'image depuis n'importe quelle position, avec la souris. Toute l'image sera tirée ou poussée dans la direction de la souris, mais les zones proches de la souris sont déplacées davantage que les zones plus éloignées. Vous pouvez redresser des lignes courbes ou courber délibérément l'image. Le contrôle « étendue de la déformation » détermine le rayon de déformation autour de la souris. 1,0 signifie que l'image entière est déformée, et des valeurs plus petites confinent la déformation à des zones plus petites autour de la souris. - - TOPIC: DÉFORMATION AFFINE Cette fonction peut être utilisée pour déformer une image de manières intéressantes. Faites glisser l'image depuis un coin ou un bord avec la souris. Les changements sont purement linéaires, les lignes droites restent donc droites. Cette transformation est appelée « affine ». Des détails peuvent être trouvés par une recherche web. - - TOPIC: DÉFORMATION RADIALE +image: warp_radial.png - Ajouter ou retirer une distorsion en barillet ou en coussinet. La distorsion en barillet est souvent observée dans les images RAW qui n'ont pas été traitées pour retirer cette distorsion. Cliquez à gauche pour choisir un point central où les changements seront centrés - normalement le centre de l'image. C'est la valeur par défaut. Déplacez le curseur « étirement » pour courber l'image. - - TOPIC: DÉFORMER UN GROS PLAN +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - Les photos de visage en gros plan sont souvent déformées, car les zones plus proches de l'appareil photo sont plus grandes sur la photo que les zones plus éloignées. Cette fonction peut être utilisée pour inverser la distorsion. Utilisez {SÉLECTIONNER UNE ZONE} pour sélectionner d'abord le visage (n'a pas besoin d'être précis). Cliquez sur l'image près du centre de la distorsion (exemple ci-dessus : joue droite). Déplacez le curseur pour optimiser. - - TOPIC: CRÉER DES VAGUES +image: make-waves2.jpg +image: make-waves1.png - Cette fonction déforme une image en un motif de vagues, comme si elle était vue à travers de l'eau turbulente. La boîte de dialogue vous permet de changer la longueur d'onde moyenne horizontale et verticale, l'amplitude et la variance. L'entrée « perspective » permet aux longueurs d'onde de s'allonger progressivement du haut vers le bas. - - TOPIC: TORSION +image: twist1.png +image: twist2.png - Cette fonction tord l'image autour d'un point choisi par un clic ou un glissement de la souris. Cliquez sur la position désirée et déplacez le curseur Torsion de la quantité voulue. Vous pouvez aussi faire glisser la souris autour de l'image pour changer le centre de torsion. Le curseur Centre détord la zone centrale par rapport au reste. Le curseur Angle fait pivoter l'image. - - TOPIC: SPHÈRE +image: sphere2.jpg +image: sphere.png - Créer une projection sphérique d'une image. Faites glisser la souris sur l'image pour changer le centre de la projection (par défaut le point médian). Le contrôle d'aplatissement modifie progressivement la projection d'une sphère (droite) à une image plate (gauche). Le curseur d'agrandissement agrandit l'image résultante jusqu'à 2x. - - TOPIC: INTÉRIEUR-EXTÉRIEUR +image: inside-out2.jpg +image: inside-out1.png - Cette fonction inverse les distances centre-bord de chaque pixel. Vous pouvez cliquer ou faire glisser la souris pour varier le point central. - - TOPIC: TINY PLANET +image: tiny-planet.jpg - Enrouler une image autour d'un cercle. Si l'image est un panorama à 360 degrés, il n'y aura pas de couture visible. • Trou central : l'image est enroulée autour d'un trou central. • Couper le haut : retirer une marge supérieure de l'image d'entrée. • Couper le bas : retirer une marge inférieure de l'image d'entrée. • Inverser R : refléter l'image d'entrée verticalement. • Inverser Theta : refléter l'image d'entrée horizontalement. • Pivoter : faire tourner l'image de sortie autour du centre. - - TOPIC: SPIRALE D'ESCHER +image: escher-spiral.png +image: escher-spiralA.png - Transformer une image en une spirale infinie vers l'intérieur comme la célèbre horloge de M.C.Escher. Largeur détermine la largeur de départ de la couche la plus extérieure. Contour détermine la largeur de départ de la bordure séparant les couches, et Couleur détermine sa couleur. Le centre par défaut est le centre de l'image. Cliquez sur l'image pour définir un nouveau centre. - - TOPIC: APLATIR LA PHOTO +image: flatten-photo1.png +image: flatten-photo2.jpg - ^Page de livre ou autre surface courbe Aplatir une photo d'une image sur une surface courbe, ex. autour d'une colonne, ou une page d'un livre épais ouvert, où les pages se courbent vers l'intérieur à la reliure centrale. La courbure des bords supérieur et inférieur de la surface fournit des informations sur l'ampleur de la courbure et l'ampleur de l'étirement nécessaire pour paraître plate. L'exemple ci-dessus est un livre épais. D'autres surfaces arrondies peuvent être corrigées, ex. une affiche sur une colonne ronde. - Sélectionnez l'option de tracé supérieur pour tracer le bord supérieur de la page courbe. Cliquez avec la souris le long du bord, créant un point marqueur à chaque point cliqué. Après que 4 points soient disponibles, une ligne courbe est dessinée à travers les points. Ajoutez plus de points et faites-les glisser selon les besoins pour que la ligne se conforme étroitement à la courbe de l'image. Sélectionnez l'option de tracé inférieur et tracez le bord inférieur de la même manière. Lorsque les deux sont terminés, appuyez sur [flatten] pour aplatir la page. Les bords devraient maintenant être droits (ou assez droits). Utilisez le curseur [stretch] pour étirer les côtés de l'image selon les besoins, pour compenser la compression latérale causée par la courbure. Utilisez le contrôle Élargir pour élargir l'image selon les besoins afin de restaurer le ratio largeur/hauteur correct. Le bouton [undo] restaure l'image non modifiée, en conservant les points marqueurs, qui peuvent ensuite être ajustés pour une nouvelle tentative. - +image: flatten-photo3.jpg - ^Horizon courbe Un large panorama, ou une photo prise avec un objectif grand angle, peut avoir un horizon qui n'est pas droit ou horizontal. L'image peut être redressée (ou déplacée d'une autre manière) en traçant une courbe à travers l'horizon ou d'autres zones qui doivent être alignées le long d'une ligne droite. Sélectionnez l'option de tracé supérieur ou inférieur, selon que l'horizon (ou une autre partie de l'image) se trouve principalement au-dessus ou en dessous du milieu de l'image. L'image sera déformée pour rendre cette courbe droite. Une courbe suffit. L'autre courbe est ajoutée automatiquement au bord opposé (haut ou bas) de l'image. Si le résultat n'est pas satisfaisant, utilisez le bouton [undo], ajustez les marqueurs sur l'une ou l'autre courbe, et réessayez. Vous pouvez aussi enregistrer l'image et appliquer la fonction une deuxième fois, en utilisant l'image enregistrée comme point de départ. - - TOPIC: MENU COMBINER Ce sont des fonctions qui combinent plusieurs fichiers image. Dans le cas d'images qui se chevauchent, les éléments correspondants de chaque image sont alignés pour coïncider, avec une précision au pixel près. Le temps d'alignement est typiquement de 10-30 secondes par image. Si vous voyez ce processus d'alignement mal se dérouler, vous pouvez utiliser la touche Échap pour arrêter le processus. - - TOPIC: HDR ^Plage dynamique élevée +image: HDR.jpg +image: HDR-adjust.png - Combiner (superposer) plusieurs images du même sujet avec différents niveaux d'exposition. L'image combinée peut montrer une meilleure visibilité des détails dans les zones sombres et claires, en utilisant en effet les pixels des images plus claires pour les zones sombres, et des images plus sombres pour les zones claires. Si l'appareil photo est ajusté manuellement entre les prises, veillez à le maintenir de niveau et à viser le même point éloigné. Un léger désalignement des images d'entrée peut être toléré. Si des personnes ou des choses bougent entre les prises, un effet fantôme est inévitable. - Sélectionnez la fonction de menu HDR et sélectionnez jusqu'à 9 images ({SÉLECTIONNER DES FICHIERS IMAGE}), qui doivent toutes avoir presque les mêmes dimensions en pixels. Les images sont alignées et combinées automatiquement. Une fois terminé, l'image combinée est affichée, avec une boîte de dialogue pour les ajustements. Les contributions des images d'entrée sont affichées comme une série de courbes modifiables. L'échelle horizontale représente la luminosité des pixels, du sombre au clair. Chaque courbe représente une image qui contribue aux pixels de sortie. La contribution de l'image à un niveau de luminosité donné est proportionnelle à la hauteur de sa courbe à ce niveau. La courbe initiale pour l'image la plus claire sera haute à gauche et basse à droite, signifiant une contribution élevée aux pixels sombres et une faible contribution aux pixels clairs. L'image la plus sombre sera basse à gauche et haute à droite, et les images restantes entre les deux. Les courbes peuvent être modifiées en les faisant glisser avec la souris. Les contributions d'image correspondantes changent en conséquence, et vous pouvez voir les résultats en temps réel dans l'image de sortie. L'image ci-dessus montre deux images d'entrée et leur image de sortie. La boîte de dialogue d'exemple montre trois courbes ajustées pour optimiser trois images d'entrée. - - TOPIC: HDF ^Profondeur de champ élevée Combiner (superposer) plusieurs photos du même sujet avec différents réglages de mise au point, de proche à lointain. Différentes parties du sujet sont nettes dans chaque image. Combinez les images afin que toutes les parties du sujet soient nettes. - Prendre les photos : choisissez un point pour le centre de l'image. Visez un objet proche avec l'appareil photo et appuyez sur le déclencheur à mi-course pour faire la mise au point sur cet objet. Maintenez le bouton à mi-course, visez le centre choisi avec l'appareil photo, et prenez la photo. Choisissez maintenant un objet plus éloigné et faites de même. Répétez avec une distance de mise au point croissante. Idéalement, chaque partie du sujet est nette dans au moins une photo. La position de l'appareil photo doit être très proche pour toutes les photos, ce qui peut être un défi si le sujet est très proche. Le mouvement de l'appareil photo peut causer des problèmes d'échelle et de parallaxe (objets proches décalés par rapport aux objets éloignés). De tels problèmes peuvent être corrigibles plus tard dans Fotocx, mais cela peut nécessiter un temps considérable. Il est préférable d'éviter les problèmes. - +image: HDF-paint.png - Traiter les photos : choisissez la fonction de menu HDF et sélectionnez jusqu'à 9 images ({SÉLECTIONNER DES FICHIERS IMAGE}). Les images seront maintenant alignées du mieux possible. L'image de sortie est un mélange équilibré des images d'entrée alignées. Une petite quantité de mouvement de l'appareil photo entre les photos est compensée, mais ceci est limité, et les décalages de parallaxe ne sont pas compensés du tout. Lorsque l'alignement est terminé, une boîte de dialogue s'ouvre. Vous pouvez sélectionner n'importe quelle image d'entrée et la « peindre » avec la souris sur n'importe quelle zone de l'image de sortie. Cela convertit le mélange d'images original en l'image unique sélectionnée pour la zone en cours de peinture. Pour chaque zone ou objet de l'image, choisissez une image d'entrée qui est nette dans cette zone. Le rayon du pinceau peut être réglé plus grand ou plus petit, vous pouvez donc peindre de grandes zones rapidement et contrôler les détails fins si besoin. Si vous avez des objets proches et lointains qui se chevauchent, du temps et de la patience seront nécessaires pour rendre tous nets. Les désalignements peuvent être corrigés en sélectionnant l'option de déformation dans la boîte de dialogue. Les images sous-jacentes peuvent alors être glissées et déformées avec la souris, et l'image de sortie combinée change en conséquence. La déformation est limitée à la zone autour de la souris. Lorsqu'une zone peinte est glissée, l'image d'entrée correspondante est automatiquement sélectionnée et glissée, tandis que les zones peintes avec d'autres images restent fixes. Les zones qui n'ont pas été peintes ne peuvent pas être glissées. Déplacez-vous vers différentes zones et faites des glissements incrémentaux jusqu'à ce que toutes soient alignées. - Flux de travail suggéré : en mode peinture, choisissez chaque image dans l'ordre et peignez toutes les zones qui paraissent nettes dans cette image. Toutes les limites qui ne sont pas bien alignées apparaîtront clairement comme des décalages dans les bords des éléments de l'image. Certaines peuvent être rendues sans importance en changeant l'image utilisée pour la peinture (si plus d'une image est assez nette). En mode déformation, faites des ajustements fins selon les besoins pour éliminer les décalages visibles. - - TOPIC: EMPILEMENT/PEINTURE +image: stack-paint.png - +image: stack-paint2.jpg - Empiler (superposer) plusieurs photos du même sujet prises à des moments différents. Retirer les touristes et voitures qui vont et viennent entre les prises. - Prendre les photos : visez le même point éloigné avec l'appareil photo et prenez plusieurs photos pendant que des touristes ou des voitures se déplacent devant le sujet. Essayez d'obtenir deux photos ou plus pour chaque zone du sujet non obstruée par les objets transitoires. Maintenez l'appareil photo stable et visez le même point, afin que les images s'alignent avec précision. - Traiter les photos : choisissez la fonction de menu Empilement/Peinture et sélectionnez jusqu'à 9 images ({SÉLECTIONNER DES FICHIERS IMAGE}). Les images seront maintenant alignées du mieux possible. L'image de sortie (en bas à gauche) est un mélange équilibré des images d'entrée alignées (rangée du haut). Lorsque l'alignement est terminé, la boîte de dialogue montrée ci-dessus démarre. Vous pouvez sélectionner n'importe quelle image d'entrée et « peindre » avec la souris sur n'importe quelle zone de l'image de sortie. L'unique image sélectionnée est utilisée pour la zone en cours de peinture. Pour chaque zone de l'image, choisissez une image d'entrée exempte des objets transitoires. Le rayon du pinceau peut être réglé plus grand ou plus petit, vous pouvez donc peindre de grandes zones rapidement et contrôler les détails fins si besoin. - Fonctionnement automatique : appuyez sur le bouton [Masquer] pour voir si les objets transitoires peuvent être retirés automatiquement. Cela fonctionnera pour les zones de l'image où plusieurs photos de l'arrière-plan non obstrué sont disponibles (image du milieu en bas). Pour afficher tous les objets transitoires, appuyez sur le bouton [Afficher] (image de droite en bas). Cela fonctionne généralement, mais pas parfaitement. De légers désalignements d'image ou différences d'éclairage (notamment les ombres en mouvement) peuvent amener l'algorithme à sélectionner des pixels d'arrière-plan au lieu de pixels de premier plan. Vous pouvez utiliser la méthode de peinture décrite ci-dessus pour corriger les erreurs manuellement. - - TOPIC: EMPILEMENT/BRUIT +image: stack-noise2.jpg +image: stack-noise.png - Cette fonction combine 2-9 photos du même sujet. Les photos doivent être presque identiques, à l'exception de petits décalages causés par un appareil photo tenu à la main. Si les photos ont été prises avec un réglage ISO très élevé (conditions de faible luminosité), les pixels auront un bruit considérable. En prenant de nombreuses photos et en les moyennant, le bruit peut être en grande partie éliminé. - Traiter les photos : choisissez la fonction Empilement/Bruit et sélectionnez jusqu'à 9 images ({SÉLECTIONNER DES FICHIERS IMAGE}). Elles seront combinées automatiquement et affichées, et une boîte de dialogue s'ouvrira. L'image de sortie initiale est une combinaison de toutes les images d'entrée sélectionnées, moyennées ensemble. Cela signifie que les valeurs RVB pour chaque pixel de sortie sont la moyenne des valeurs RVB des pixels d'entrée correspondants. Le bouton médiane changera les pixels de sortie en médiane des pixels d'entrée (1-3 valeurs RVB médianes sont moyennées, selon le nombre d'images). Cela peut être meilleur ou non, alors basculez entre les deux pour comparer. Les cases à cocher omettre pixel bas et omettre pixel haut feront ignorer les valeurs RVB d'entrée les plus basses et les plus hautes avant le moyennage. Cela peut permettre de retirer les pics de bruit du mélange. Ceci n'a aucun effet si la méthode médiane est sélectionnée. - - TOPIC: EMPILEMENT/CALQUES +image: stack-layers.png - Utilisez cette fonction pour combiner différentes versions modifiées d'une image, où vous pouvez déterminer quelle version est affichée dans des zones d'image sélectionnées. N'importe quelles images ayant les mêmes dimensions en pixels peuvent être combinées. - Sélectionnez jusqu'à 9 images de taille identique. L'image de sortie initiale est un mélange égal de toutes les images d'entrée. Ratios d'image sont les poids relatifs des images mélangées. Ceux-ci peuvent être ajustés pour varier le poids de chaque image. Exemple : si 3 images sont combinées avec des poids relatifs de 3, 5, 7, alors l'image combinée est 3/15 de l'image n°1, 5/15 de la n°2, et 7/15 de la n°3. Si l'option « Peindre l'image entière » est sélectionnée, les poids peuvent être ajustés et l'image de sortie répond immédiatement. Si l'option « Peindre autour de la souris » est sélectionnée, alors la souris peut être glissée et seule la zone à l'intérieur du cercle de la souris est peinte, en utilisant les ratios d'image actuellement actifs. La vitesse de peinture est contrôlée par les paramètres Puissance pour le centre et le bord de la souris. Utilisez des nombres bas pour peindre progressivement. - - TOPIC: PANORAMA +image: pano-align1.jpg +image: pano-align2.jpg - Cette fonction assemble 2-6 images ensemble pour créer une image grand angle ou panorama. Les images doivent se chevaucher d'au moins 10 %, afin que le programme puisse trouver où elles correspondent et les joindre. Commencez par sélectionner 2-6 fichiers image ({SÉLECTIONNER DES FICHIERS IMAGE}). Il est utile de sélectionner les images dans l'ordre de gauche à droite, pour faciliter l'alignement approximatif initial. Les images sont initialement jointes et affichées avec un petit chevauchement transparent. Une boîte de dialogue de pré-alignement (ci-dessus) vous demande de faire glisser les images pour un alignement approximatif. Faites glisser les images dans le bon ordre de gauche à droite. L'image à glisser peut chevaucher d'autres images. Pour être clair sur quelle image est glissée, glissez depuis près du centre de l'image. Une fois les images dans le bon ordre, alignez chaque image avec son voisin de gauche. Il est préférable de procéder de gauche à droite. Déplacez une image horizontalement et verticalement pour un alignement approximatif avec son voisin de gauche, puis faites pivoter l'image si besoin en faisant glisser le bord inférieur vers la gauche ou la droite - l'image pivote autour du point médian de son chevauchement avec l'image de gauche. La méthode la plus rapide est d'aligner d'abord la région médiane du chevauchement, puis de faire pivoter l'image de droite si besoin pour aligner les régions de chevauchement supérieure et inférieure. Une précision extrême n'est PAS nécessaire. Les images doivent être correctement courbées et bien s'assembler. Si ce n'est pas le cas, alors « objectif mm » (distance focale, équivalent 35mm) nécessite un ajustement. La courbure de l'image change lorsque objectif mm est ajusté. La valeur initiale est obtenue des métadonnées EXIF si disponible, et cela est normalement suffisant. Si les images n'ont pas de courbure (ex. images numérisées), utilisez la case à cocher « sans courbe » pour régler « objectif mm » effectivement à l'infini. - Si l'une des images a été recadrée, les calculs dépendant de la distance focale EXIF ne fonctionnent pas. Vous pourriez pouvoir compenser en augmentant la distance focale dans « lens_mm ». - La case à cocher « alignement manuel » utilisera le pré-alignement manuel comme alignement final. Ceci est pour les images qui n'ont pas d'éléments clairs nécessaires pour aligner les images. Cette option permet aussi aux images d'avoir un chevauchement nul. - Appuyez sur [proceed] lorsque le pré-alignement est terminé, et le programme fera un alignement fin et joindra les images. En interne, les images sont décalées et pivotées et le degré de correspondance est évalué. Cela est fait avec des tailles d'image croissantes jusqu'à ce que le meilleur alignement soit trouvé. Cela peut nécessiter une minute ou plus, selon la vitesse du CPU et la taille de l'image. Vous pouvez accélérer grandement le processus si vous réduisez les images d'entrée à 2/3 ou 1/2 de leur taille. Faites cela aussi si le processus échoue par manque de mémoire. - +image: pano-adjust.jpg - Lorsque l'alignement fin est terminé, l'image combinée est affichée. La boîte de dialogue ci-dessus démarre pour les ajustements fins de luminosité. Vous pourriez voir une bordure entre les images si elles n'ont pas la même luminosité. Sélectionnez une image à l'aide des boutons radio en haut. Utilisez le bouton [couleur automatique] de manière répétée pour améliorer automatiquement la correspondance de luminosité/couleur des images. L'image de base est celle actuellement sélectionnée. Essayez différentes images de base pour voir laquelle fonctionne le mieux. Si les images sont très mal assorties en luminosité, sélectionnez la plus divergente et utilisez le contrôle de luminosité pour la faire correspondre aux autres, suivi de [couleur automatique]. La correspondance n'a pas besoin d'être très bonne, puisque « Largeur du fondu » (suivant) masquera les différences restantes. Utilisez le bouton « Couleur du fichier » pour réinitialiser les niveaux de luminosité à partir des fichiers image d'entrée. - Le contrôle « Largeur du fondu » régit comment les images sont fondues ensemble : aux chevauchements d'image, la luminosité change sur ce nombre de pixels, pour masquer les déséquilibres qui ne peuvent pas être entièrement corrigés. La valeur par défaut est 1 pixel, ce qui rend toute différence de luminosité évidente. - Si les images ne s'alignent pas parfaitement, vous pourriez pouvoir améliorer l'alignement en utilisant la souris pour pousser les images dans l'alignement. Sélectionnez « Déformation à la souris » et sélectionnez l'une des images avec les boutons radio. Puis glissez la souris le long du bord de l'image où elle devrait s'aligner avec son voisin, déplaçant l'image dans l'alignement. L'image est déplacée localement autour de la souris tandis que les parties plus éloignées restent fixes. Les images avec un décalage de parallaxe nécessiteront un compromis, car il est impossible de garder à la fois le premier plan et l'arrière-plan alignés. - Le contrôle d'aplatissement de l'image peut être utilisé pour « redresser » l'image, ce qui redressera les lignes courbes (ex. bâtiments courbés). Une valeur de zéro n'a aucun effet et une valeur de 1,0 aplatira entièrement l'image. - Une fois terminé, utilisez {REDRESSER}, {DÉFORMER L'IMAGE}, {RECADRER} etc. pour les ajustements finaux. - ^Images numérisées Les images numérisées peuvent être combinées s'il y a suffisamment de chevauchement. Cochez « sans courbe » puisqu'il n'y a pas de courbure. - ^Déformation automatique Les images sont légèrement déformées dans différentes directions pendant l'alignement pour trouver la meilleure correspondance. Ceci compense les décalages de l'horizon de l'appareil photo ou la rotation, causant des distorsions d'image qui réduisent la qualité de l'ajustement. Si la zone de chevauchement de deux images inclut un grand objet qui a bougé entre les deux photos, le processus d'alignement peut devenir erratique en essayant de faire correspondre les images, rendant l'alignement très mauvais. En sélectionnant « pas de déformation automatique » vous pourriez réussir l'alignement ou avoir une erreur plus petite. Une autre option est de sélectionner alignement manuel. - ^Combiner des panoramas Vous pouvez créer un panorama de jusqu'à 6 images en une passe. Vous pouvez aussi combiner des panoramas qui s'assemblent sur les côtés, ex. combiner un panorama de 4 images avec un autre panorama de 4 images pour créer un panorama de 8 images. Vous devez arrêter la courbure normale de l'image lorsque vous combinez des panoramas, car les images de panorama sont déjà courbées (en supposant que vous n'ayez pas utilisé l'option « aplatir » dans la boîte de dialogue finale du panorama). Arrêtez la courbure de l'image en cochant la case « sans courbe » dans la boîte de dialogue de pré-alignement. - ^Limitations du panorama Les panoramas incluant des objets proches peuvent être délicats : lors de la prise des photos, veillez à tourner l'appareil photo sur un axe passant par l'objectif, avec un mouvement latéral minimal, sinon les images pourraient mal s'aligner car les objets de premier plan sont décalés par rapport à l'arrière-plan (parallaxe). Ce n'est pas un problème lorsque le sujet est à 50+ mètres, car un petit mouvement latéral a peu d'impact sur l'image. Gardez l'appareil photo de niveau pour éviter un grand décalage vertical (décalage d'horizon), qui peut causer des distorsions d'image qui pourraient ne pas être entièrement corrigées. Évitez de faire pivoter l'appareil photo pour la même raison. - ^Panorama vertical Ceci peut être fait en faisant pivoter les images d'entrée de 90°. Dans Panorama, choisissez les images dans l'ordre de haut en bas, afin que l'image du haut soit à gauche et celle du bas à droite. Faites le panorama normalement. Faites pivoter l'image de sortie afin que la gauche devienne le haut. - - TOPIC: AFFICHER LES FICHIERS CIM Afficher les fichiers d'entrée de l'image combinée actuelle ou la plus récente, dans une fenêtre popup. Seul l'ensemble actuel ou le plus récent est mémorisé. - - TOPIC: MASHUP +image: mashup.jpg - Disposer plusieurs images et du texte dans une mise en page. Les images peuvent être ajoutées, redimensionnées, pivotées et déplacées en les faisant glisser avec la souris. Les images peuvent être rendues entièrement ou partiellement transparentes dans des zones sélectionnées. Du texte peut être ajouté, déplacé, redimensionné et pivoté. Les attributs du texte peuvent être spécifiés : police, taille, couleur, contour, ombre, transparence. Des lignes et flèches peuvent être ajoutées. L'exemple ici montre certaines des possibilités. - +image: mashup1.png - Dans la première boîte de dialogue Mashup, choisissez une image d'arrière-plan ou de mise en page où d'autres images seront placées. Choisissez une image existante ou créez une nouvelle image monochrome avec une taille et une couleur spécifiées. Vous pouvez aussi ouvrir un projet mashup précédemment enregistré et continuer la modification. - +image: mashup2.png - La 2e boîte de dialogue Mashup est un choix : modifier les images, modifier le texte, modifier les lignes et flèches, redimensionner à une taille plus grande, enregistrer l'image combinée terminée (Terminé) ou abandonner l'image (Annuler). Les trois premiers choix mènent à des boîtes de dialogue pour effectuer les modifications respectives. Chacune d'elles retourne à cette boîte de dialogue une fois terminée, vous pouvez donc ajouter ou modifier des images, du texte, et des lignes/flèches dans n'importe quel ordre. Redimensionner est expliqué ci-dessous. - +image: mashup3.jpg - Utilisez cette boîte de dialogue pour sélectionner et placer des images sur la mise en page et réviser leur apparence : taille, rotation, position, transparence. Une image peut être partiellement ou entièrement transparente, globalement ou dans des zones spécifiées. Cela signifie que l'image d'arrière-plan ou l'image chevauchée peut apparaître à travers les zones transparentes. Le bouton Ajouter une image mène à une boîte de dialogue de sélection de fichiers de galerie ({SÉLECTIONNER DES FICHIERS IMAGE}). Les images sélectionnées sont placées sur la mise en page. Après l'ajout des images, cliquez sur n'importe quelle image pour la sélectionner pour des modifications. Faites glisser l'image depuis le milieu pour positionner l'image dans la mise en page. Faites glisser le coin inférieur droit pour redimensionner l'image. Utilisez les contrôles de la boîte de dialogue pour ajuster l'image. Les contrôles de la boîte de dialogue agissent sur la dernière image ajoutée, cliquée ou glissée. Les boutons « Préc » et « Suiv » parcourent les images une à la fois, en faisant clignoter l'image sélectionnée. Ceci peut être utilisé lorsque des images chevauchées rendent difficile la sélection de l'image souhaitée en cliquant dessus. Échelle redimensionne l'image. Angle fait pivoter l'image. Les boutons Ordre d'empilement élèvent ou abaissent une image par rapport aux autres images - cela détermine quelle image chevauchante sera au-dessus. Transparence de base est utilisé pour rendre une image entière partiellement transparente. Le bouton [peindre] est utilisé pour rendre n'importe quelle partie d'une image partiellement ou totalement transparente, à l'aide de la boîte de dialogue Peindre montrée ci-dessous. Le bouton [déformer] est utilisé pour courber ou déformer une image, à l'aide de la boîte de dialogue Déformer montrée ci-dessous. La case à cocher « marges noires » peut être utilisée pour retirer les marges noires laissées par d'autres fonctions de modification, ex. déformation. Celles-ci seront rendues transparentes. Le bouton « L'image est fixe » empêchera l'image d'être déplacée par la souris ou le clavier. Ceci est utile lorsque les images sont finement alignées et qu'un mouvement accidentel doit être empêché. Les contrôles Marges peuvent être utilisés pour rendre les bords de l'image transparents. Les marges dures coupent les bords de l'image. Les marges de fondu rendent les bords partiellement transparents pour les fondre dans l'arrière-plan ou d'autres images chevauchées. - +image: mashup4.png - « Peindre » plus ou moins de transparence pour des zones d'image sélectionnées. Cliquez sur une image pour la sélectionner. Le pointeur de la souris est un cercle montrant la plage d'action. Utilisez rayon pour ajuster la taille. Glissez à gauche la souris sur l'image pour la rendre transparente dans les zones couvertes par le cercle. Glissez à droite pour la rendre opaque. Si Progressif est coché, les changements de transparence sont faits lentement au fur et à mesure que la souris est glissée. Spécifiez une valeur de puissance pour le centre et les bords de la souris pour réguler la vitesse de changement. - +image: mashup5.png - La boîte de dialogue de déformation est utilisée pour déformer une image. Cliquez sur une image pour la sélectionner. Faites glisser l'image avec la souris - l'image se déformera ou s'étirera localement dans la direction de la souris (comme une feuille de caoutchouc). La zone de déformation est approximativement donnée par l'étendue de la déformation, qui est une fraction de la taille de l'image. Chaque glissement est une étape qui s'ajoute aux précédentes. Les étapes récentes peuvent être annulées avec [undo last], et l'image non déformée peut être restaurée avec [undo all]. - +image: mashup6.png - La boîte de dialogue Modifier le texte est utilisée pour placer du texte sur la mise en page. Saisissez du texte et appuyez sur [Appliquer]. On vous demande de cliquer sur la mise en page où le texte sera ajouté. Faites-le glisser en position, puis utilisez les contrôles de la boîte de dialogue pour définir la police, la taille, la couleur, l'angle, la couleur d'arrière-plan, la taille et la couleur du contour, la taille et la couleur de l'ombre, et les transparences pour chacun de ces éléments. Faites glisser le texte vers une nouvelle position à tout moment. Cliquez sur n'importe quel texte existant pour afficher ses propriétés dans la boîte de dialogue et les réviser. Cliquez sur un texte et appuyez sur Suppr pour le retirer. Une fois la modification terminée, appuyez sur [OK] pour revenir à la 2e boîte de dialogue Mashup. - +image: mashup7.png - La boîte de dialogue Modifier la ligne/flèche est utilisée pour placer des lignes ou des flèches sur la mise en page. Cela fonctionne très comme l'ajout de texte. Saisissez une longueur et une largeur et appuyez sur [Ajouter]. On vous demande de cliquer sur la mise en page où la ligne sera ajoutée. Une ligne est placée sur la mise en page, ou une flèche si l'une des options de pointe de flèche est cochée. Faites glisser la ligne/flèche vers la position désirée. Ajustez la longueur, la largeur, l'angle et les attributs (arrière-plan, contour, ombre) à l'aide de la boîte de dialogue. Vous pouvez aussi faire glisser l'une ou l'autre extrémité de la ligne/flèche pour définir la position de cette extrémité, en laissant l'autre extrémité fixe. - Vous pouvez utiliser la souris pour déplacer et redimensionner des objets dans la mise en page : • cliquez sur l'objet pour le sélectionner - il clignote pour confirmer la sélection. • glissez depuis le centre approximatif pour positionner l'objet. • glissez le coin inférieur droit pour redimensionner l'objet. • pour une ligne/flèche, glissez l'une ou l'autre extrémité pour déplacer seulement cette extrémité. - Les touches fléchées du clavier peuvent aussi être utilisées pour déplacer l'objet actuellement sélectionné par pas de 1 pixel. - Vous pouvez ajouter des images enregistrées par {SÉLECTIONNER UNE ZONE}. Dans la boîte de dialogue Modifier les images, appuyez sur [Ajouter] pour démarrer la boîte de dialogue de sélection de fichiers. Utilisez le bouton [Haut] dans la fenêtre de la galerie, sélectionnez « saved_areas ». Ouvrez n'importe laquelle des images .png trouvées là. Le contour de zone original est utilisé, et la fusion de zone fonctionne à partir de ces bords. - ^Fichiers de projet Mashup Vous pouvez enregistrer un projet et l'ouvrir plus tard pour continuer la modification. Le projet Mashup est reconstruit en utilisant ces images et certaines données enregistrées dans le fichier projet : positions des images et du texte, échelles, transparence, etc. - ^Redimensionnement Mashup Travailler avec une très grande mise en page (plus de 20 mégapixels) peut être assez lent. Faire glisser une grande image de superposition peut être lent et saccadé. Vous pouvez travailler beaucoup plus vite si vous utilisez une mise en page plus petite pour construire le projet, puis l'agrandir une fois terminé. Il n'y a pas de perte de résolution dans l'image finale, puisque les images de superposition et le texte sont régénérés à partir des entrées. Le bouton Redimensionner vous permet d'agrandir le projet de 2x, 3x ou 4x. Il existe aussi une option de réinitialisation pour restaurer la taille de projet plus petite d'origine. Avec cette méthode, vous pouvez travailler avec une mise en page de 10 mégapixels et la redimensionner jusqu'à 160 mégapixels une fois terminé. La mise en page plus grande peut toujours être travaillée directement ensuite, mais ce sera plus lent. - - TOPIC: RÉSEAU D'IMAGES +image: image-array.jpg - Sélectionner de nombreuses images et les joindre en un format de réseau compact dans un cadre coloré. - La première boîte de dialogue est montrée en haut à gauche. Couleur d'arrière-plan est la couleur du cadre de contour et des espaces entre les images contenues. Largeur du réseau est la largeur globale du réseau de sortie, et Marge est la largeur de la marge extérieure entourant toutes les images. La hauteur du réseau est déterminée par le nombre de fichiers image sélectionnés et l'espace nécessaire pour les faire tenir dans le cadre. Colonnes d'images spécifie le nombre de colonnes d'images (6 dans l'exemple ci-dessus). Le nombre de lignes dépend du nombre de fichiers image sélectionnés. Les valeurs de Séparation définissent l'espace horizontal et vertical entre les images contenues. - Sélectionnez les fichiers image ({SÉLECTIONNER DES FICHIERS IMAGE}), puis appuyez sur [Continuer] une fois terminé. L'image résultante sera créée en quelques secondes (ou minutes pour des centaines d'images). Cette image aura typiquement une marge inférieure très inégale, comme montré par l'image en haut à droite ci-dessus. La séquence d'images dans le réseau est déterminée par l'ordre de sélection. La rangée du haut est remplie d'abord, de gauche à droite, puis la 2e rangée, etc. - La boîte de dialogue Optimiser démarre automatiquement. Elle peut réorganiser les images afin que la marge inférieure soit plus régulière. Appuyez sur [Démarrer] et attendez que l'image s'optimise. Vous pouvez observer la progression. La fonction se terminera si un optimum est trouvé qui rend la marge inférieure régulière à 2 pixels près. Elle peut continuer à chercher indéfiniment si cet objectif n'est pas atteint. Appuyez sur [Arrêter] pour forcer la fonction d'optimisation à se terminer avec la meilleure solution trouvée jusque-là. Si l'optimisation réussit, vous obtiendrez des colonnes régulières comme montré dans l'image en bas à droite. Si le bord inférieur est encore inégal après optimisation, on vous demande si vous voulez ajouter des marges à certaines des images pour rendre le bord inférieur régulier. Cela donnera un bord inférieur régulier, mais les espacements verticaux ne seront plus égaux. - ASTUCE : l'optimisation fonctionne mieux si le nombre d'images par colonne est d'au moins quatre (mieux encore plus). Cela donne à l'optimiseur assez de flexibilité pour trouver une solution avec un bord inférieur régulier. - La dernière boîte de dialogue apparaît, montrée en bas à gauche. Vous devez maintenant attribuer un nom de fichier à votre réseau. Une boîte de dialogue d'enregistrement de fichier démarre, et vous pouvez enregistrer le nouveau fichier de réseau n'importe où. Si l'option copier les métadonnées est choisie, les métadonnées sont copiées du fichier d'entrée choisi vers le fichier de sortie. Ceci est utile si les images sont des versions modifiées et que vous voulez que le réseau contienne l'historique de modification pour la dernière version (ou n'importe quelle version). - - TOPIC: MENU TRAITEMENT MASSIF Ce sont des fonctions qui traitent plusieurs fichiers image sélectionnés, quelques-uns ou des milliers. Ces fonctions peuvent être annulées en cours de processus à l'aide de la touche Échap, mais cela laissera certains fichiers traités et d'autres non. Un rapport contextuel affiche les noms de fichiers au fur et à mesure qu'ils sont traités. - - TOPIC: CONVERSION MASSIVE +image: batch-convert.jpg - Cette fonction est utilisée pour renommer, convertir, redimensionner et déplacer plusieurs fichiers image. Les fichiers RAW peuvent aussi être convertis en fichiers image. La fonction s'exécute dans plusieurs threads parallèles pour une vitesse maximale. - ^Entrées de la boîte de dialogue • Sélectionner des fichiers - fichiers à convertir ({SÉLECTIONNER DES FICHIERS IMAGE}). • Remplacer le texte - remplacer du texte dans les noms de fichiers (voir ci-dessous). • Nouveau nom - nouveau nom optionnel, texte inséré (voir ci-dessous). • Numéros de séquence - nombre de base et incrément pour les noms de fichiers de sortie. • Nouveau lieu - nouvel emplacement de dossier optionnel pour les fichiers de sortie. • Nouveau type - type de fichier pour les fichiers de sortie, ou « aucun changement ». • Profondeur de couleur - spécifier 8 ou 16 bits pour la sortie tif ou png. • Largeur, hauteur max. - limites optionnelles pour les fichiers de sortie (utilisées seulement si réduire ou agrandir est coché) • Redimensionner - facteur de redimensionnement optionnel pour les fichiers de sortie • Supprimer les originaux - supprimer les fichiers d'entrée après conversion réussie. • Copier les métadonnées - copier toutes les métadonnées vers les fichiers de sortie. • Mettre à jour les albums - remplacer les fichiers d'album par les fichiers de sortie convertis - ^Remplacer le texte Si du texte est saisi ici, les noms de fichiers sont analysés pour ce texte, et s'il est trouvé, le texte de remplacement donné est substitué. Le texte de remplacement peut avoir une longueur différente et peut aussi être vide, auquel cas le texte est retiré du nom de fichier. - ^Nouveau nom et plugins Le nouveau nom de fichier peut avoir du texte inséré : une date de photo (des métadonnées EXIF), un numéro de séquence, ou le nom de fichier original. Spécifiez quoi et où insérer comme suit : • $oldname - le nom de fichier original est inséré ici • $sss - un numéro de séquence continu est inséré ici. Voir ci-dessous. • $yyyy $mm $dd - la date de la photo est insérée à ces positions. - Exemple : San Francisco $yyyy:$mm:$dd $oldname $sss Le fichier d'entrée « Golden Gate Bridge.jpg », avec une date de photo du 12 mai 2014, serait converti en le nom de fichier de sortie « San Francisco 2014-05-12 Golden Gate Bridge 123.jpg ». - Pour « $sss », spécifiez la longueur du champ avec le nombre de caractères « s », ex. « $ss » sera adéquat pour des numéros de séquence jusqu'à 99. Des zéros de tête sont ajoutés pour les numéros de séquence avec moins de chiffres. Les numéros de séquence ne rentrant pas dans la longueur spécifiée sont rendus aussi longs que nécessaire. Gardez à l'esprit que l'ordre de tri des noms de fichiers dans les galeries est strictement l'ordre ascii, donc la séquence de nombres 1, 2 ... 9, 10 sera triée comme 1, 10, 2 ... 9. Vous pouvez conserver l'ordre numérique en spécifiant une longueur de champ de 2 ($ss), résultant en la séquence 01, 02 ... 09, 10. - Soit « $oldname » soit « $sss » doit être présent pour garantir que les noms de fichiers de sortie sont uniques. Si Nouveau lieu est manquant ou inchangé, supprimer les originaux est ignoré. Si un fichier de sortie existe déjà, le fichier d'entrée n'est pas converti. - ^Largeur et hauteur max. Si réduire et/ou agrandir est coché, alors les fichiers de sortie seront redimensionnés dans ces limites, en conservant le ratio largeur/hauteur original. Si réduire est coché, les fichiers plus grands que ces limites sont réduits pour rester dans les limites. Si agrandir est coché, les fichiers plus petits que ces limites sont agrandis afin que la largeur ou la hauteur soit à la limite correspondante. Ceci ne peut pas être utilisé avec l'option Redimensionner. - ^Redimensionner Si l'un des boutons est coché, les fichiers de sortie sont redimensionnés selon le facteur choisi. Ceci ne peut pas être utilisé avec l'option Largeur et hauteur max. - ^Supprimer les originaux Si coché, les fichiers d'entrée sont supprimés, mais seulement après que le fichier de sortie ait été créé avec succès. - ^Copier les métadonnées Toutes les métadonnées sont copiées du fichier d'entrée vers le fichier de sortie. Omettez cette option pour retirer les métadonnées. - ^Mettre à jour les albums Si coché, tous les albums contenant l'un des fichiers d'entrée sont mis à jour avec les fichiers de sortie convertis. - ^Préserver la séquence de fichiers Si vous spécifiez un numéro de séquence en tête ($sss), la séquence de sélection des fichiers d'entrée sera préservée à l'emplacement de sortie. Vous pouvez ainsi sélectionner des fichiers image dans un ordre souhaité, ou sélectionner depuis un album avec des images ordonnées, et préserver cette séquence dans la sortie. - - TOPIC: COPIE/DÉPLACEMENT MASSIF Copier ou déplacer les fichiers image sélectionnés vers un nouvel emplacement. Sélectionnez les fichiers d'entrée ({SÉLECTIONNER DES FICHIERS IMAGE}) depuis n'importe quels dossiers connus de Fotocx. Si « Supprimer les originaux » est sélectionné, alors les fichiers d'entrée seront supprimés après leur déplacement réussi vers le nouveau dossier. Dans ce cas, tous les albums référençant les fichiers d'entrée maintenant supprimés sont mis à jour avec les nouveaux emplacements de fichiers. - - TOPIC: REDRESSEMENT MASSIF Cette fonction redresse les fichiers image pivotés ou retournés (en miroir). Elle dépend des données EXIF pour savoir si un fichier est pivoté/retourné et dans quelle direction. C'est beaucoup plus rapide que Conversion massive. Vous pouvez simplement sélectionner tous les fichiers candidats et laisser la fonction trouver ceux nécessitant une correction. La vitesse de recherche est d'environ 3000 fichiers image par minute sur un ordinateur puissant. Il existe deux options pour spécifier les fichiers à rechercher. Le bouton [Sélectionner des fichiers] mène à une boîte de dialogue de sélection de fichiers de galerie ({SÉLECTIONNER DES FICHIERS IMAGE}). Si « Examiner tous les fichiers » est coché, tous les fichiers image sous vos dossiers principaux seront recherchés. - - TOPIC: SUPPRESSION/CORBEILLE MASSIVE Sélectionnez les fichiers ({SÉLECTIONNER DES FICHIERS IMAGE}). Sélectionnez l'option : supprimer ou mettre à la corbeille. [Continuer]. Les fichiers sont listés dans un rapport contextuel au fur et à mesure qu'ils sont supprimés ou mis à la corbeille. Une fois tous les fichiers supprimés/mis à la corbeille, les albums sont analysés et les fichiers supprimés retirés. - - TOPIC: SUPERPOSITION MASSIVE +image: batch-overlay.png - Une petite image de superposition peut être ajoutée à une position sélectionnée sur les images d'entrée sélectionnées. Ceci peut être utilisé pour ajouter une mention de crédit, un copyright, etc. sur les images. - Préparez l'image de superposition comme suit : utilisez Image vierge pour créer une image de base pour contenir le texte. L'échelle n'a pas d'importance, alors faites-la plus grande que nécessaire. Utilisez Peindre la transparence pour rendre toute l'image de base transparente. Utilisez {ANNOTATION} > dessiner du texte pour mettre le texte souhaité sur l'image de base, en utilisant la police, la couleur, et d'autres attributs selon vos souhaits. Mettez le texte à l'échelle pour remplir la majeure partie de l'image de base. L'image de base (arrière-plan) est transparente. Retirez les marges excédentaires avec {RECADRER} si besoin. Enregistrez l'image finale. Un emplacement pratique est /saved_areas, mais n'importe quel dossier peut être utilisé. Cette image peut maintenant être utilisée comme image de superposition pour Superposition massive. - Utilisez le bouton ^Sélectionner les fichiers image hôtes^ pour sélectionner les fichiers image hôtes qui recevront l'image de superposition. Utilisez le bouton ^Sélectionner le fichier de superposition^ pour sélectionner le fichier image de superposition. - Les deux entrées ^Position de la superposition^ déterminent où l'image de superposition est positionnée sur l'image hôte, de 1-99 % de la distance du haut vers le bas, et de 1-99 % de la distance de gauche à droite. 0/0 signifie le coin supérieur gauche, 99/99 signifie le coin inférieur droit. L'image de superposition sera positionnée de manière à ne pas dépasser les bords de l'image hôte. - Spécifiez ^Largeur de la superposition^ en pourcentage de la largeur de l'image hôte. La hauteur sera définie pour conserver le ratio largeur/hauteur. Si ^Rendre la largeur constante pour la taille de la fenêtre^ est coché, la taille visuelle de l'image de superposition sera rendue constante pour la taille de fenêtre spécifiée ci-dessous. Sans cela, une image « haute » qui s'affiche avec de grandes marges gauche et droite aurait une image de superposition visuellement plus petite. La taille de fenêtre initiale est la fenêtre actuelle. Vous pouvez saisir n'importe quelle taille. Appuyez sur ^actualiser^ pour définir la fenêtre actuelle si cela a changé. - Si ^Remplacer les fichiers hôtes^ est sélectionné, les fichiers hôtes d'entrée sont remplacés par les fichiers hôtes de sortie superposés. Si ^Créer de nouvelles versions^ est sélectionné, de nouvelles versions des fichiers hôtes d'entrée sont créées. - - TOPIC: MOTS-CLÉS MASSIFS +image: batch-keywords.jpg - Ajouter, retirer, ou changer les mots-clés pour un grand nombre de fichiers image à la fois. - Utilisez le bouton [select files] pour sélectionner les fichiers image ({SÉLECTIONNER DES FICHIERS IMAGE}). - La boîte de dialogue montre deux listes de mots-clés : ceux à ajouter aux fichiers sélectionnés, et ceux à retirer. Les mots-clés disponibles sont affichés dans la fenêtre Mots-clés définis ci-dessous. L'un de ceux-ci peut être ajouté à la liste de mots-clés actuellement sélectionnée (ajouter ou retirer) en cliquant dessus. Un mot-clé peut être supprimé de l'une ou l'autre liste de mots-clés en cliquant dessus. Pour remplacer des mots-clés, spécifiez les nouveaux mots-clés dans la liste ajouter des mots-clés et les anciens mots-clés dans la liste retirer des mots-clés. - Si la liste des mots-clés définis est longue, il peut être plus facile de taper le mot-clé souhaité dans Entrer un nouveau mot-clé. Les mots-clés existants correspondant à ce que vous avez tapé apparaîtront dans Mots-clés correspondants, et vous pouvez pointer et cliquer sur l'un d'eux pour ajouter le mot-clé à l'image. Si le mot-clé saisi est nouveau (aucun mot-clé correspondant n'est affiché), appuyez sur [Ajouter] une fois le mot-clé complet. Il sera ajouté à la liste de mots-clés sélectionnée et à la liste des mots-clés définis sous la catégorie « nocatg ». - Si vous utilisez des catégories de mots-clés, vous pouvez sélectionner une catégorie, et seuls ces mots-clés seront affichés dans la liste des mots-clés définis. Si votre liste de mots-clés est énorme, cela peut réduire la liste à une taille gérable pour pointer et cliquer. - Pour obtenir une liste des images ayant des mots-clés spécifiques que vous voulez retirer ou remplacer, utilisez {RECHERCHER DES IMAGES} pour trouver les images, puis démarrez cette fonction et utilisez [select files] pour ajouter tous les fichiers image que vous venez de trouver, ou sélectionnez un sous-ensemble quelconque. - - TOPIC: RENOMMAGE MASSIF DES MOTS-CLÉS +image: batch-rename-keywords.png - Renommer n'importe quel nombre de mots-clés et appliquer ces changements à toute votre collection d'images. Cliquez sur un mot-clé à renommer dans la liste des mots-clés définis, saisissez un nouveau nom dans le champ Renommer en, puis cliquez sur le bouton flèche pour ajouter cette paire de noms à la liste du côté droit. Répétez pour chaque mot-clé à renommer. Cliquez sur la paire de noms dans la liste pour la retirer. Appuyez sur [Continuer] une fois terminé. Si vous voulez supprimer un mot-clé sans le renommer, utilisez « delete » comme nouveau nom. - Une fenêtre contextuelle montre le nombre de fichiers image contenant les noms de mots-clés affectés. Appuyez sur [Oui] pour continuer. Le taux de mise à jour est d'environ 500/minute sur un ordinateur puissant. Au prochain démarrage de Fotocx, la fonction de fichier d'index mettra à jour toutes les vignettes pour les mêmes images, car la date de modification du fichier a changé. - - TOPIC: PURGE MASSIVE DES MOTS-CLÉS +image: batch-purge-keywords.jpg - Purger (supprimer) les mots-clés indésirables de tous les fichiers image. Ceci est particulièrement utile pour se débarrasser des mots-clés indésirables qui ont été ajoutés depuis des fichiers image téléchargés. Cliquez sur les mots-clés indésirables du côté gauche de la boîte de dialogue pour les ajouter à la liste de purge du côté droit de la boîte de dialogue. Appuyez sur [proceed] une fois terminé. - - TOPIC: DATE PHOTO MASSIVE +image: batch-photo-date1.png +image: batch-photo-date2.png - Corriger rapidement un lot de photos qui n'ont pas de date/heure de photo ou qui en ont une incorrecte. Utilisez le bouton [select files] pour ouvrir une fenêtre galerie où vous pouvez sélectionner les fichiers image à traiter ({SÉLECTIONNER DES FICHIERS IMAGE}). - Il existe deux façons de changer les dates/heures de photo : • Définir une nouvelle date/heure (image de droite ci-dessus) : saisissez seulement une nouvelle année (aaaa) - seule l'année est remplacée dans les fichiers. Saisissez seulement une date (aaaa:mm:jj) - la date est remplacée mais pas l'heure. Saisissez une date/heure complète (aaaa:mm:jj hh:mm:ss) - les deux sont remplacées. • Décaler la date/heure existante (image de gauche) : saisissez des valeurs + ou - dans l'un des 6 champs : années, mois, jours, heures, minutes, secondes. Les dates/heures seront décalées selon les valeurs saisies. - Les valeurs de date/heure décalées se propagent à la valeur supérieure suivante si nécessaire : L'heure 08:30 décalée de -50 minutes donne 07:40 La date 2016-10-20 décalée de +6 mois et -30 jours donne 2017-03-21 (mars a 31 jours). - Si la case à cocher « test » est sélectionnée, un rapport des anciennes et nouvelles dates/heures pour les fichiers sélectionnés est produit pour inspection. Aucun changement n'est fait aux fichiers. Si vous êtes satisfait que les résultats sont corrects, décochez la case et exécutez à nouveau pour mettre à jour les fichiers. - - TOPIC: MODIFICATION MASSIVE DES MÉTADONNÉES +image: batch-change-meta.png - Réviser les métadonnées de plusieurs fichiers image. Vous pouvez ajouter de nouvelles métadonnées, réviser les métadonnées existantes, et supprimer des métadonnées. Utilisez le bouton [select files] pour ouvrir une fenêtre galerie à partir de laquelle vous sélectionnez les fichiers à traiter {SÉLECTIONNER DES FICHIERS IMAGE}. Saisissez les noms et valeurs de balise de métadonnées à assigner, ou laissez la valeur vide pour supprimer la balise. Appuyez sur [appliquer]. Vous recevrez un message de confirmation et vous pourrez continuer ou annuler à ce moment. Une liste de noms de balises couramment utilisés est fournie à gauche. Cliquez sur l'une d'elles pour l'insérer dans le premier champ de nom de balise vide dans la boîte de dialogue. Cette liste provient du fichier /metadata_picklist, que vous pouvez modifier pour ajouter d'autres balises à la liste. Le bouton [Liste complète] fournit des informations sur comment obtenir une liste de tous les noms de balises disponibles. - - TOPIC: RAPPORT MASSIF DES MÉTADONNÉES +image: add-meta-tags.png +image: batch-report-meta.png - Rapporter n'importe quelle métadonnée pour n'importe quel nombre d'images. La sortie est un fichier texte qui est affiché dans l'éditeur de texte par défaut de votre système. Vous pouvez utiliser les fonctionnalités de recherche de l'éditeur de texte pour trouver des images correspondant aux métadonnées souhaitées, ou vous pouvez utiliser le fichier texte comme entrée pour d'autres programmes. Utilisez le bouton [select files] pour ouvrir une fenêtre galerie afin de sélectionner les fichiers à traiter ({SÉLECTIONNER DES FICHIERS IMAGE}). Le bouton [modifier] ouvre une nouvelle boîte de dialogue (à droite) où vous pouvez sélectionner les balises de métadonnées à rapporter. Cliquez sur une balise dans la colonne de gauche pour l'ajouter à la colonne de droite et au rapport. Cliquez sur une balise dans la colonne de droite pour la retirer. Cliquez sur la dernière balise dans la colonne de gauche, « Autre balise ... », pour saisir n'importe quel nom de balise n'apparaissant pas dans la liste, qui contient seulement les balises les plus probablement nécessaires. - - TOPIC: GÉOMARQUAGE MASSIF +image: batch-geotags.png - Sélectionner de nombreuses images et ajouter les mêmes données de lieu à toutes. Utilisez le bouton [select files] pour sélectionner les fichiers image depuis une fenêtre galerie ({SÉLECTIONNER DES FICHIERS IMAGE}). Puis obtenez les données de lieu comme décrit dans {MODIFIER LES MÉTADONNÉES PRINCIPALES}, en utilisant le bouton [Rechercher] ou en cliquant sur un marqueur de carte. Utilisez aussi cette fonction pour corriger les incohérences dans l'orthographe des lieux ou les données de latitude/longitude. Si le lieu et/ou le pays sont laissés vides, ils ne sont pas mis à jour. Pour effacer le lieu ou le pays, saisissez le nom « null ». Si la latitude et la longitude sont laissées vides, elles ne sont pas mises à jour. Pour effacer la latitude et la longitude, saisissez « 0 » pour les deux valeurs. Vous pouvez mettre à jour seulement le lieu/pays, seulement la latitude/longitude, ou les deux. En pratique, vous pourriez constater que le GPS de l'appareil photo insère la latitude et la longitude sans le lieu et le pays, ou qu'il utilise une langue indésirable, ou tout en majuscules, ou une autre valeur nécessitant une correction. - - TOPIC: EXPORTER LES FICHIERS Copier les fichiers image sélectionnés vers un autre dossier. L'usage prévu est de copier des fichiers à partager avec d'autres, ex. téléverser des fichiers sur un site web. Les fichiers de sortie sont en JPEG. Vous pouvez optionnellement réduire la taille des images. Sélectionnez les fichiers image en cliquant sur les vignettes de la galerie ({SÉLECTIONNER DES FICHIERS IMAGE}). Sélectionnez un dossier où les fichiers image seront copiés. Si « exporter les métadonnées » est sélectionné, un ensemble limité de métadonnées est aussi copié. Ce sont : date de la photo, mots-clés, copyright, titre, description. - - TOPIC: MENU OUTILS - - TOPIC: INDEXER LES FICHIERS +image: index-files1.png - Fotocx a besoin de connaître tous vos noms de dossiers et fichiers image ainsi que les métadonnées intégrées (dates, balises, géomarquages, titres, descriptions, évaluations). Ces données sont indexées pour une recherche rapide. Fotocx crée aussi des vignettes afin que les fenêtres galerie (pages de vignettes) s'affichent rapidement. Fotocx ne modifie ni ne copie vos fichiers image. L'espace requis est typiquement de 2 % de l'espace de vos fichiers image. - La fonction Indexer les fichiers s'exécute à chaque démarrage de Fotocx. Cette fonction créera les vignettes manquantes, remplacera les obsolètes, et actualisera l'index de métadonnées en utilisant les données actuelles de vos fichiers image. Cela peut nécessiter un temps significatif si vous avez plusieurs milliers de nouveaux fichiers. - Les fichiers image modifiés ou déplacés dans Fotocx sont pris en charge automatiquement. La fonction Index est utilisée uniquement pour les nouveaux fichiers image créés en dehors de Fotocx (ex. un nouveau lot de photos a été ajouté), et pour les fichiers modifiés ou déplacés en dehors de Fotocx. - Saisissez vos dossiers d'images principaux (ex. /home//Images). Utilisez le bouton [parcourir] pour localiser et ajouter des dossiers. Ces dossiers et tous les sous-dossiers contenus seront traités. Peu importe si d'autres fichiers sont mélangés avec les images. Supprimez une entrée en cliquant sur le « X » correspondant. - Saisissez le dossier des vignettes où les fichiers de vignettes seront stockés. Utilisez le dossier par défaut fourni ou définissez votre propre emplacement. - Si vous avez utilisé les noms de dossiers ou de fichiers pour classer vos images, vous pouvez en faire un usage immédiat dans la fonction {RECHERCHER DES IMAGES}. Si vous avez enregistré des dates, mots-clés, géomarquages, titres, ou évaluations dans les métadonnées de vos images, ceux-ci seront aussi consultables. Une fois les images indexées, la recherche par n'importe lequel de ces éléments est presque instantanée. - ^Balises de métadonnées Les métadonnées suivantes sont incluses dans l'index d'image par défaut : • noms de dossiers et de fichiers • date/heure de la photo • date/heure de modification du fichier • titre et description (métadonnées exif) • évaluation (0-5 étoiles) • mots-clés (étiquettes utilisateur) • géomarquages (noms de pays et de lieu et latitude/longitude) • appareil photo : marque, modèle, objectif • exposition : temps, ouverture, distance focale, ISO - ^Balises de métadonnées supplémentaires +image: index-files2.png - Vous pouvez ajouter jusqu'à 20 autres balises de métadonnées à l'index de fichiers image. Les métadonnées dans cette liste peuvent être recherchées aussi rapidement que les balises standard. Vous n'en aurez peut-être pas besoin, mais si vous avez parfois besoin de rechercher des balises de métadonnées non standard, vous pouvez les ajouter ici et la vitesse de recherche sera presque instantanée. Appuyez sur le bouton [select] pour « métadonnées supplémentaires » pour obtenir la boîte de dialogue ci-dessus. Cliquez sur les balises dans la liste de gauche pour les ajouter à la liste de droite - les balises à ajouter à l'index. Cliquez sur une balise dans la liste de droite pour la retirer. Appuyez sur [done] pour valider les changements. Toute votre collection d'images sera réindexée. Cela se déroulera plus vite que l'indexation initiale car les vignettes ne sont pas recréées. - ^Accès aux fichiers et dossiers non indexés Un fichier ou dossier image non indexé est un fichier qui n'est pas inclus dans vos dossiers d'images principaux déclarés (les sous-dossiers de vos dossiers d'images déclarés sont toujours inclus). Vous pouvez naviguer vers un tel dossier et afficher les vignettes normalement, et vous pouvez afficher et modifier de tels fichiers normalement. Il existe des limitations que vous devriez comprendre : • Ces fichiers seront absents de tous les résultats de recherche et vues de carte. • Les vignettes sont créées au moment de la consultation - les galeries seront lentes. Si vous accédez à un périphérique de stockage portable (lent) (ex. carte SD d'appareil photo), vous remarquerez la performance capricieuse. Les vignettes seront créées selon les besoins, et elles resteront après le retrait du périphérique. Suggestion : copiez les fichiers vers un dossier Fotocx déclaré, puis effectuez le traitement nécessaire depuis cet emplacement. La performance sera bien meilleure. - ^Stockage amovible (clé USB) Si vos dossiers d'images principaux incluent des dossiers sur un lecteur amovible, et que vous exécutez Fotocx sans que le lecteur soit monté, les données d'index et les vignettes sont tout de même préservées, même si les fichiers amovibles ont disparu. Lorsque le lecteur amovible est monté à nouveau, et que Fotocx est démarré, le dernier état est restauré. Si des fichiers ont été ajoutés ou modifiés entre-temps, les données d'index et les vignettes sont mises à jour. - - TOPIC: DÉPLACER L'ACCUEIL DE FOTOCX Le dossier d'accueil de Fotocx contient tous les paramètres et données utilisateur, y compris certains fichiers du package Fotocx qui peuvent être personnalisés par l'utilisateur. Emplacement par défaut : /home//.fotocx. Si plusieurs versions ou distributions de Linux sont installées, il peut être souhaitable d'avoir un seul dossier d'accueil Fotocx partagé au lieu d'un pour chaque distribution. Il en va de même si plusieurs utilisateurs ont besoin d'accéder à la même instance Fotocx. - Utilisez cette fonction pour déplacer le dossier d'accueil de Fotocx ailleurs. Le dossier sélectionné doit inclure « fotocx » dans le nom du chemin, sinon « /fotocx » sera ajouté. - Voir le paramètre -home de {PARAMÈTRES DE COMMANDE} si vous voulez plusieurs collections d'images Fotocx, gérées séparément. - - TOPIC: PARAMÈTRES +image: settings.jpg - Diverses préférences et paramètres utilisateur sont rassemblés et enregistrés dans le fichier /parameters. La plupart des changements sont effectués immédiatement. Certains provoqueront le redémarrage de Fotocx. - • Sélectionnez le code de langue à 2 caractères souhaité. Fotocx redémarrera dans la langue sélectionnée. • Vue de démarrage - affichage initial au démarrage de Fotocx. Fichiers récents : les fichiers image vus le plus récemment Fichiers les plus récents : fichiers ajoutés/modifiés le plus récemment Galerie spécifique : la galerie de dossier spécifiée Galerie d'album : la galerie d'album spécifiée Galerie précédente : galerie utilisée en dernier lors de la session précédente Fichier précédent : fichier consulté en dernier lors de la session précédente Fichier spécifique : le fichier image spécifié Bouton Parcourir : sélectionner un dossier, un album, ou un fichier image • Arrière-plan - couleurs d'arrière-plan pour les fenêtres Affichage du fichier et de la galerie • Style du menu - style d'affichage du menu : icônes, texte, ou les deux • Couleurs du menu - couleur du texte et de l'arrière-plan du menu • Police de la boîte de dialogue - police pour les menus et boîtes de dialogue • Afficher les fichiers masqués - si sélectionné, afficher les fichiers et dossiers masqués • Vitesse du zoom - choisir 1-8 clics ou touches [+] par augmentation d'image 2x • Fichiers JPEG - niveau de qualité, par défaut 90, utiliser 70+ pour une bonne qualité • Nœud de courbe - séparation minimale des nœuds pour les courbes de modification, % de l'échelle. La valeur par défaut est 5 % de l'échelle. Utilisez une valeur plus élevée pour les pavés tactiles. • Position de l'image - l'image est à gauche/au centre/à droite dans une fenêtre plus large • Confirmer la sortie - option de boîte de dialogue contextuelle : voulez-vous vraiment quitter ? • Niveau d'index - voir ci-dessous • Chargeur RAW - voir ci-dessous • Options RAW - voir ci-dessous • Fichiers RAW - liste des types de fichiers RAW utilisés • Fichiers vidéo - liste des types de fichiers vidéo utilisés • Application vidéo - voir ci-dessous - ^Qualité et compression des fichiers Niveau de qualité des fichiers JPEG : utilisez 70 ou plus pour une bonne qualité d'image (par défaut 90). La méthode de compression des fichiers TIFF est DEFLATE (meilleure pour les images en couleur). Le niveau de compression des fichiers PNG est « 1 ». Des valeurs plus élevées ne semblent faire qu'augmenter le temps d'enregistrement du fichier (libpng). - ^Position de l'image Si la fenêtre est plus large que l'image (c.-à-d. le ratio largeur/hauteur de la fenêtre > image), l'image peut être décalée vers le côté gauche, centrée, ou vers le côté droit. Si gauche ou droite, la marge inutilisée est maximisée, ce qui peut être plus pratique pour positionner les boîtes de dialogue. - ^Niveau d'index d'image Ces deux paramètres régissent un compromis entre le temps de démarrage et l'exhaustivité de l'index d'image. • $ fotocx : s'applique lorsque fotocx est démarré à l'aide d'une commande shell, d'un menu système, ou d'une icône/lanceur système. La valeur recommandée « 2 » signifie une indexation complète : charger l'ancien fichier d'index, rechercher les nouveaux fichiers (pas encore indexés) et mettre à jour le fichier d'index de fotocx. • $ fotocx : s'applique lorsque fotocx est démarré en cliquant sur un nom de fichier dans une liste de gestionnaire de fichiers. La valeur recommandée « 1 » signifie charger l'ancien fichier d'index mais ne pas rechercher de nouveaux fichiers pour mettre à jour l'index. Le démarrage est modérément rapide. Les fonctions de recherche d'image et de carte fonctionnent normalement, mais tout nouveau fichier image (pas encore indexé) n'est pas inclus. • Alternative : « 0 » signifie aucune indexation. Le démarrage est très rapide. L'utilisation ultérieure d'une fonction de recherche d'image ou de carte démarrera la fonction d'index de fichiers pour les anciens fichiers uniquement (pas de recherche de fichiers nouveaux/modifiés). Utilisez cette option si votre collection d'images est gigantesque et que le temps de démarrage dépasse quelques secondes. Vous pouvez démarrer la fonction d'index plus tard si besoin. - ^Chargeur RAW Le chargeur RAW est la commande utilisée pour lire un fichier RAW et le convertir en TIFF avec une profondeur de couleur de 16 bits. Il est utilisé lorsqu'un fichier RAW est consulté. Vous pouvez utiliser les fonctions de modification de Fotocx pour modifier et optimiser le fichier. Le chargeur RAW par défaut est dcraw utilisant l'espace colorimétrique sRGB. Quelques autres options utilisant dcraw ou rawtherapee sont fournies dans la liste de sélection. Ces commandes sont conservées dans le fichier « raw_commands_* » dans le dossier d'accueil de Fotocx. Modifiez ce fichier pour changer ou ajouter de nouvelles options (voir ci-dessous). Vous pourriez vouloir préparer plusieurs commandes pour plusieurs appareils photo ou plusieurs options de traitement. Si vous préférez utiliser un éditeur RAW interactivement, créez une commande de plugin pour cela - voir {PLUGINS}. - ^Options RAW • modifier les commandes : appuyez sur le bouton pour modifier la liste des commandes du chargeur RAW. Un éditeur de texte démarrera dans une nouvelle fenêtre, avec la liste actuelle des commandes. • faire correspondre la couleur de l'image intégrée : utiliser l'image intégrée du fichier RAW comme guide pour faire correspondre les couleurs de l'image RAW à l'image TIFF convertie. C'est l'interprétation du fabricant de l'appareil photo des données RAW - un bon point de départ si le fichier RAW nécessite une modification supplémentaire. L'image intégrée est habituellement la même que le fichier JPEG de l'appareil photo. - ^Application vidéo Saisissez une commande shell pour démarrer une application de lecture vidéo. Utilisez « %s » pour marquer où le nom du fichier vidéo est inséré dans la ligne de commande. Voici quelques exemples : ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: RACCOURCIS CLAVIER +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - Afficher ou changer les raccourcis clavier personnalisés. Les raccourcis actuellement assignés sont affichés dans la première fenêtre. Si vous appuyez sur le bouton [Modifier], la deuxième boîte de dialogue s'affiche, où vous pouvez ajouter et changer des raccourcis clavier. Saisissez un nouveau raccourci à l'aide du clavier. Vous pouvez utiliser les touches A-Z, 0-9, F2-F9, et la plupart des symboles (% $ & * < etc.). Vous pouvez combiner une touche avec l'une de Ctrl/Alt/Maj : appuyez et maintenez UNE des touches Ctrl/Alt/Maj, puis appuyez sur la touche, puis relâchez les deux. Sélectionnez l'une des affectations de menu disponibles dans la liste de droite, puis appuyez sur [Ajouter] et [OK]. Retirez un raccourci en le sélectionnant et en appuyant sur [Supprimer]. - - TOPIC: HISTOGRAMME RVB +image: RGB-hist.png - Une petite fenêtre montre un graphique d'histogramme de luminosité de l'image actuelle en Affichage du fichier, ou de la zone actuellement sélectionnée de l'image. Ce graphique se met à jour de façon synchrone à mesure que les fonctions de modification changent l'image. Utilisez les boutons [Tout] [Rouge] [Vert] [Bleu] pour sélectionner les couleurs à afficher. - - TOPIC: AGRANDIR L'IMAGE +image: magnify-image.jpg - Agrandir l'image dans une zone autour du pointeur de la souris. Glissez à gauche la souris autour de l'image pour agrandir différentes zones, comme si vous consultiez une image imprimée avec une loupe. Utilisez la boîte de dialogue pour ajuster le rayon de la zone et l'ampleur de l'agrandissement. - - TOPIC: MESURER L'IMAGE Cliquez sur deux positions quelconques dans une image pour mesurer la distance en pixels entre les points. Les positions cliquées sont étiquetées A et B sur l'image. Ces étiquettes montrent toujours les deux derniers points cliqués. La boîte de dialogue est mise à jour avec les distances séparant ces deux points : Distance-X (distance horizontale) Distance-Y (distance verticale) Distance-H (distance totale) - - TOPIC: AFFICHER RVB +image: show-RGB.png - Lorsqu'un point de l'image est cliqué, les valeurs RVB sont affichées dans une fenêtre de dialogue. Les 9 derniers points cliqués sont affichés. Les valeurs ont le format xxx.dd, où xxx sont les 8 bits supérieurs de la valeur de couleur et .dd sont les 8 bits inférieurs. La plage est de 0.00 à 255.99. Les 8 bits inférieurs sont zéro sauf si l'image est en cours de modification ou a plus de 8 bits de profondeur de couleur. Les sorties sont mises à jour en temps réel si l'image est en cours de modification. Si « étiquettes » est coché, les points sont étiquetés sur l'image avec des lettres correspondant aux lettres dans la fenêtre de dialogue. Si « delta » est coché et que l'image est en cours de modification, alors les changements RVB sont affichés au lieu des valeurs absolues. - Si vous ouvrez une autre image (ex. pour la comparer avec l'image précédente), les positions sont conservées et mises à jour si elles se trouvent dans les limites de la nouvelle image. Cela facilite la comparaison d'images au niveau des valeurs RVB des pixels. - - TOPIC: PARAMÈTRES DE LA GRILLE +image: grid-settings.jpg - Il existe deux fonctions de lignes de grille : Paramètres de la grille définit tous les paramètres de grille. Activer/désactiver la grille active ou désactive les lignes de grille. Les lignes de grille sont des lignes horizontales et verticales à intervalles réguliers sur l'image. Ces lignes peuvent être des guides d'alignement utiles lorsqu'une image est redressée ou déformée pour redresser des murs ou d'autres objets dans l'image. Utilisez les entrées nombre-x et nombre-y pour définir le nombre de lignes verticales et horizontales respectivement. Les contrôles décalage-x et décalage-y peuvent être utilisés pour décaler les lignes de grille afin de croiser une position souhaitée dans l'image. Un raccourci clavier (par défaut maj+G) peut être assigné à Activer/désactiver la grille, afin que les lignes de grille puissent être activées ou désactivées avec une seule touche. - - TOPIC: COULEUR DE LIGNE Certaines fonctions dessinent des lignes sur l'image (Recadrer, Sélectionner une zone, autres). Vous pouvez changer la couleur de ces lignes pour maximiser le contraste avec l'image d'arrière-plan. La petite boîte de dialogue peut être laissée ouverte pendant la modification, pour basculer facilement entre les couleurs disponibles (noir, blanc, rouge, vert). - - TOPIC: PIXELS SOMBRES/CLAIRS Mettre en évidence les pixels les plus sombres et les plus clairs d'une image. Ajustez les deux contrôles rotatifs pour définir les seuils de luminosité, qui sont initialement 0 pour les pixels sombres et 255 pour les pixels clairs. Les pixels avec une luminosité inférieure au seuil sombre ou supérieure au seuil clair sont « clignotés » pour les faire ressortir. Utilisez cette fonction pour détecter l'écrêtage après avoir modifié la luminosité ou la couleur. - - TOPIC: COULEUR DU MONITEUR +image: moncolor-small.png - Huit bandes de couleur sont écrites sur l'écran avec une luminosité de zéro (noir) à 100 %. Vous pouvez utiliser cela pour ajuster la luminosité et le contraste de votre moniteur. Il ne devrait y avoir aucune région inchangée à l'une ou l'autre extrémité des bandes. - - TOPIC: TROUVER LES DOUBLONS +image: find-dups.png - Trouver les fichiers image en double n'importe où dans votre base de données d'images. Un fichier en double peut être un fichier qui duplique exactement ou « presque » un autre fichier. Pour des raisons de vitesse, les vignettes sont comparées en mémoire. Il est possible que des vignettes correspondantes soient trouvées pour des images principales ayant des différences mineures non reflétées dans les vignettes. Une copie d'image qui a été réduite en taille sera probablement classée comme doublon. La taille des vignettes peut être réglée de 32 à 512 pixels. Une taille plus grande réduit la probabilité de faux positifs. La taille des vignettes affecte grandement la quantité de mémoire principale requise - ex. pour 100 000 images, la taille 64 nécessite environ 880 Mo, tandis que la taille 256 nécessite environ 14 Go. Appuyez sur le bouton [calculate] pour calculer la plus grande taille de vignette pouvant tenir dans la mémoire libre disponible. - Deux paramètres sont utilisés pour définir la sensibilité de détection d'images identiques ou presque identiques : différence de pixels est la différence de valeur RVB en dessous de laquelle les pixels sont considérés identiques. Nombre de pixels est le nombre de pixels différents en dessous duquel deux images sont classées comme doublons. Exemple : si différence de pixels = 2 et nombre de pixels = 10, alors les images sont classées comme doublons si moins de 10 pixels diffèrent de 2 ou moins. - La sortie est une galerie montrant chaque ensemble d'images en double. La galerie de sortie est enregistrée comme album « Duplicate Images ». Vous pouvez utiliser Suppression/corbeille massive avec cet album pour choisir quels doublons supprimer. - - TOPIC: TROUVER LES FICHIERS DÉFECTUEUX Tous les fichiers image dans vos dossiers principaux déclarés sont lus. Pour chaque fichier qui ne peut pas être lu, vous avez trois options : • supprimer le fichier • corriger un type de fichier incorrect (voir ci-dessous) • déplacer le fichier quelque part en dehors de vos dossiers d'images principaux J'ai souvent vu des fichiers .png avec une extension .jpg. Les navigateurs web et certaines autres applications gèrent cela silencieusement. Ici, le type de fichier correct est rapporté et vous pouvez changer l'extension pour la correcte. - - TOPIC: AFFICHER LES RESSOURCES Rapporter les ressources informatiques utilisées par Fotocx : • Temps CPU : utilisation depuis le démarrage de Fotocx ou depuis le dernier échantillon • Mémoire réelle : la mémoire réelle actuellement utilisée (hors swap) • Cache des cartes : Mo de stockage disque utilisés pour les tuiles de carte en cache • Vider le cache : supprimer toutes les tuiles de carte en cache • bouton [Sample] : prendre un nouvel échantillon et rapporter les données - Le bouton [Sample] réinitialise le temps CPU. Le prochain échantillon montrera seulement le nouveau temps CPU accumulé. Le temps CPU est la somme pour tous les threads du processus. - - TOPIC: TRADUCTIONS Les traductions pour plusieurs langues sont incluses dans le package Fotocx. Ces traductions par IA ne sont pas parfaites. Les erreurs de traduction peuvent être corrigées en modifiant les fichiers de traduction. - ^Changer la langue de l'interface graphique Le menu {PARAMÈTRES} peut être utilisé pour changer la langue. La langue peut aussi être définie au démarrage de Fotocx : $ fotocx -lang xx # langue xx (de fr zh etc.) $ fotocx -lang en # anglais - ^Modifier une traduction de l'interface graphique Modifiez le fichier /translations/gui_xx Les paires de lignes de texte ont des numéros à 4 chiffres en tête qui doivent correspondre. La première ligne est en anglais, la 2e ligne est la langue xx. Ne modifiez que la ligne xx, jamais la ligne anglaise. Les caractères spéciaux pour insérer des paramètres dans le texte doivent rester dans le même ordre. Ce sont « %d » (paramètre entier), « %f » (décimal), « %s » (texte). - ^Modifier une traduction du guide utilisateur Modifiez le fichier /translations/ug_xx Modifiez ug_xx pour corriger la traduction. N'ajoutez ni ne retirez de lignes de texte et ne changez pas l'ordre. Les lignes de texte doivent correspondre 1:1 avec le guide utilisateur anglais, ug_en. - Envoyez les fichiers révisés pour inclusion dans la prochaine version de Fotocx : mkornelix@gmail.com - - TOPIC: MENU AIDE • Guide utilisateur - afficher la table des matières • Tutoriel vidéo - afficher un tutoriel vidéo Fotocx sur YouTube • Programmes externes - lister les programmes externes et leurs fonctions • Afficher le fichier journal - afficher les informations et messages d'erreur enregistrés • Paramètres de commande - afficher les paramètres de ligne de commande disponibles • Journal des modifications - afficher les ajouts et corrections de bugs des versions récentes • Copyright - afficher les copyrights et licences pertinents pour Fotocx • Confidentialité - afficher la politique de confidentialité (règles) de Fotocx • À propos - afficher le numéro de version, l'emplacement de l'exécutable, le contact • Page d'accueil - afficher la page d'accueil de Fotocx sur kornelix.net • Désinstaller - comment désinstaller Fotocx - - TOPIC: AUTRES SUJETS Les sujets suivants ne sont pas liés aux menus de Fotocx. - - TOPIC: VIDEO FILES Les fichiers vidéo (.mpeg, .mp4, etc.) peuvent être mélangés avec vos fichiers image. Ils s'afficheront comme des fichiers image à la fois en Affichage du fichier et en Affichage de la galerie. La touche « P » démarrera, mettra en pause, et reprendra la vidéo, ou rejouera une vidéo terminée. La touche « Q » quittera la vidéo. Utilisez le menu {PARAMÈTRES} pour sélectionner l'application de lecture des fichiers vidéo. - - TOPIC: DIAPOSITIVES ET NÉGATIFS +image: color-negative.jpg - Vous pouvez utiliser un appareil photo avec capacité macro pour capturer des diapositives ou des négatifs de film. Utilisez une boîte à lumière pour l'éclairage, ou utilisez le ciel (exemple ci-dessus). Pour traiter un négatif couleur, créez d'abord un positif - voir {MODE COULEUR}. Si l'image est brumeuse, sélectionnez seulement la zone de l'image, en excluant les bords du film, puis utilisez {RETINEX GLOBAL} pour éliminer la brume. Définissez les points blanc et noir en cliquant sur l'image si besoin pour réduire davantage la brume. - - TOPIC: LIMITATIONS DE FOTOCX • Il existe une limite stricte d'un million de fichiers. • versions d'image - jusqu'à 99 versions pour annuler/rétablir et nommage de version. • mots-clés d'image - 10 000 mots-clés au total. 1000 caractères pour une seule image. • Les galeries sont limitées à 40 000 fichiers image. • les dimensions max. d'image sont 40 000 x 20 000 pixels. - - TOPIC: FOTOCX POUR WINDOWS 11 Fotocx peut être utilisé sur Windows 11 en installant le sous-système Windows pour Linux 2, ou WSL2. Une documentation abondante est disponible sur internet expliquant comment faire cela. - Si vos fichiers image sont sur le système de fichiers Windows (NTFS), Fotocx sera très lent. Déplacez donc vos fichiers image vers le système de fichiers Linux. Vous pouvez toujours y accéder avec l'Explorateur de fichiers Windows et d'autres applications Windows, rien n'est donc perdu. Microsoft recommande aussi le système de fichiers Linux pour de meilleures performances. Utilisez l'icône « Linux » dans l'Explorateur de fichiers pour accéder à votre dossier d'accueil dans le système de fichiers Linux. Ajoutez un dossier Images si besoin, et déplacez-y vos fichiers image. - Si un package Fotocx est disponible, installez-le. Sinon, procédez comme suit : Téléchargez le fichier du package binaire Fotocx depuis ^https://kornelix.net. Dans le terminal Linux : $ cd /mnt/c/Users//Downloads # aller au dossier de téléchargements Windows $ tar -xzf fotocx-xxx-bin.tar.gz # décompresser le package dans le dossier fotocx $ cd fotocx # aller dans le dossier fotocx $ chmod u+x install.sh # rendre le script d'installation exécutable $ ./install.sh # exécuter le script, installer fotocx $ fotocx # démarrer Fotocx Vous pourriez avoir besoin de redémarrer la fenêtre Linux pour que la dernière étape fonctionne. - Lisez les parties introductives de ce guide utilisateur. Fotocx a des fonctionnalités approfondies. Ne vous attendez pas à maîtriser Fotocx en quelques minutes. - - TOPIC: CONFIDENTIALITÉ Fotocx ne conserve aucune donnée utilisateur autre que les fichiers image et leurs métadonnées. Les métadonnées devraient être retirées des fichiers image avant de les téléverser sur internet, et Fotocx fournit une méthode simple pour cela. - - TOPIC: PROBLEM, QUESTION, SUGGESTION Envoyez un e-mail à mkornelix@gmail.com. S'il y a un vidage de plantage (fichier zappcrash) envoyez-le aussi. - fotocx/data/translations/gui_hu0000664000175000017500000040116115247006657015676 0ustar micomico0000 + Zoom-in \n 0000 + Zoom-in \n 0001 - Zoom-out \n 0001 - Zoom-out \n 0002 = Zoom-in \n 0002 = Zoom-in \n 0003 Arrow keys Previous/Next file \n 0003 Nyílbillentyűk Előző/következő fájl \n 0004 Delete Delete/Trash file \n 0004 Delete Törlés/Kukába helyezés \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Escape Párbeszédablak bezárása / Kilépés a Fotocx-ből \n 0006 F1 User Guide, Context Help \n 0006 F1 Felhasználói kézikönyv, helyi súgó \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 Teljes képernyő / menük nélkül \n 0008 Home/End Gallery start/end \n 0008 Home/End Galéria eleje/vége \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 Az indexelés ideje a fájlok számától, típusától és méretétől, \n valamint a számítógép sebességétől függ. Ez percenként \n néhány száztól akár 10 ezer fájlig terjedhet. \n Az indexelési beállításokat később is módosíthatja ezekben a menükben: \n Eszközök > Index, Eszközök > Beállítások. \n 0010 Page keys Gallery page up/down \n 0010 Lapozó billentyűk Galéria lap fel/le \n 0011 Z 1x <--> fit to window \n 0011 Z 1x <--> ablakhoz igazítás \n 0012 $s plugin needs base and adder 0012 A(z) $s beépülőhöz alap és összeadó szükséges 0013 % from left: 0013 % balról: 0014 % from top: 0014 % felülről: 0015 %d albums selected 0015 %d album kijelölve 0016 %d image files selected 0016 %d képfájl kijelölve 0017 %d images 0017 %d kép 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 %d kulcsszó törlésre kerül \n%d képfájlban. \nFolytatja? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 %d kulcsszó átnevezésre kerül \n%d képfájlban. \nFolytatja? 0020 %d max images exceeded 0020 %d elérve a képek maximális számát 0021 %d red-eye limit reached 0021 %d elérve a vörösszem-korlátot 0022 %s %s %d folders %d files 0022 %s %s %d mappa %d fájl 0023 %s *** date/time conversion failed \n 0023 %s *** a dátum/idő átalakítása sikertelen \n 0024 %s ALBUM %s %d files 0024 %s ALBUM %s %d fájl 0025 %s NEWEST FILES 0025 %s LEGÚJABB FÁJLOK 0026 %s RECENT FILES 0026 %s LEGUTÓBBI FÁJLOK 0027 %s SEARCH RESULTS %d files 0027 %s KERESÉSI EREDMÉNYEK %d fájl 0028 %s UNKNOWN 0028 %s ISMERETLEN 0029 %s added to script 0029 %s hozzáadva a szkripthez 0030 %s is already indexed 0030 %s már indexelve van 0031 %s renamed: %s 0031 %s átnevezve: %s 0032 %s: metadata update failed 0032 %s: a metaadat frissítése sikertelen 0033 %s: no write permission 0033 %s: nincs írási jogosultság 0034 %s: reserved, cannot be used 0034 %s: fenntartott név, nem használható 0035 %s: too many keywords 0035 %s: túl sok kulcsszó 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\nFotó dátuma: %s Fájl dátuma: %s \nÉrtékelés: %s Méret: %s %.2fmb \nHely: %s %s %s \nKulcsszavak: %s \nCím: %s \nLeírás: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\nFotó dátuma: %s Fájl dátuma: %s \nÉrtékelés: %s Méret: %s %.2fmb \nHely: %s %s %s \nKulcsszavak: %s \nCím: %s \nLeírás: %s \n----------------------- \n%s 0038 (click below) 0038 (kattintson alább) 0039 (no selection) 0039 (nincs kijelölés) 0040 (pixels) 0040 (pixel) 0041 (press key) 0041 (nyomjon billentyűt) 0042 (select function) 0042 (válasszon funkciót) 0043 *** bad utf8 detected *** \n 0043 *** hibás utf8 észlelve *** \n 0044 *** cannot create new file \n 0044 *** új fájl létrehozása sikertelen \n 0045 *** cannot get real path of input file \n 0045 *** a bemeneti fájl valódi elérési útja nem állapítható meg \n 0046 *** cannot load input file \n 0046 *** a bemeneti fájl betöltése sikertelen \n 0047 *** cannot make new version of input file \n 0047 *** a bemeneti fájl új verziójának létrehozása sikertelen \n 0048 *** cannot open input file 0048 *** a bemeneti fájl megnyitása sikertelen 0049 *** cannot read input file 0049 *** a bemeneti fájl olvasása sikertelen 0050 *** cannot save output file \n 0050 *** a kimeneti fájl mentése sikertelen \n 0051 *** completed \n 0051 *** befejezve \n 0052 *** file date/time invalid \n 0052 *** érvénytelen fájldátum/idő \n 0053 *** file type not supported \n 0053 *** nem támogatott fájltípus \n 0054 *** invalid file \n 0054 *** érvénytelen fájl \n 0055 *** metadata update error \n 0055 *** hiba a metaadat frissítésekor \n 0056 *** no date/time available \n 0056 *** nincs elérhető dátum/idő \n 0057 + bright 0057 + világos 0058 +Blue -Yellow 0058 +Kék -Sárga 0059 +Brightness 0059 +Fényerő 0060 +Green -Magenta 0060 +Zöld -Bíbor 0061 +Red -Cyan 0061 +Vörös -Cián 0062 - blue 0062 - kék 0063 - fog/haze 0063 - köd/pára 0064 .heic/.avif files not supported (install heif_convert) 0064 A .heic/.avif fájlok nem támogatottak (telepítse a heif_convert-et) 0065 .jp2 files not supported (install opj_decompress) 0065 A .jp2 fájlok nem támogatottak (telepítse az opj_decompress-t) 0066 .webp files not supported (install dwebp) 0066 A .webp fájlok nem támogatottak (telepítse a dwebp-t) 0067 0 albums selected 0067 0 album kijelölve 0068 0 duplicates 0068 0 duplikátum 0069 0-5 stars 0069 0-5 csillag 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = nincs képindex, csak régi index, régi + új/módosított frissítése 0071 2-character code 0071 2 karakteres kód 0072 3D depth 0072 3D mélység 0073 <2 images 0073 <2 kép 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 Egy új Fotocx kiadás telepítése folyamatban van. \nSzükség lehet az egyéni beállítások visszaállítására. 0075 ADD GLARE 0075 CSILLOGÁS HOZZÁADÁSA 0076 ADD NOISE 0076 ZAJ HOZZÁADÁSA 0077 ADJUST HSL 0077 HSL BEÁLLÍTÁSA 0078 ADJUST RGB 0078 RGB BEÁLLÍTÁSA 0079 ALBUM MASS UPDATE 0079 ALBUM TÖMEGES FRISSÍTÉSE 0080 ALBUMS 0080 ALBUMOK 0081 ALBUMS MENU 0081 ALBUMOK MENÜ 0082 ALIEN COLORS 0082 IDEGEN SZÍNEK 0083 AMPLIFY CONTRAST 0083 KONTRASZT ERŐSÍTÉSE 0084 ANTI-ALIAS 0084 ÉLSIMÍTÁS 0085 AREA BLEND 0085 TERÜLET KEVERÉSE 0086 AREA FILL 0086 TERÜLET KITÖLTÉSE 0087 AREA OVERVIEW 0087 TERÜLET ÁTTEKINTÉS 0088 AUTOSEARCH 0088 AUTOMATIKUS KERESÉS 0089 About 0089 Névjegy 0090 Action 0090 Művelet 0091 Add 0091 Hozzáadás 0092 Add 1 0092 Hozzáadás 1 0093 Add All 0093 Összes hozzáadása 0094 Add Current 0094 Jelenlegi hozzáadása 0095 Add Current File Here 0095 Jelenlegi fájl hozzáadása ide 0096 Add Glare 0096 Csillogás hozzáadása 0097 Add Image 0097 Kép hozzáadása 0098 Add Line 0098 Vonal hozzáadása 0099 Add Margins 0099 Margó hozzáadása 0100 Add Noise 0100 Zaj hozzáadása 0101 Add Random Noise 0101 Véletlenszerű zaj hozzáadása 0102 Add Selected Files Here 0102 Kijelölt fájlok hozzáadása ide 0103 Add Texture 0103 Textúra hozzáadása 0104 Add a brightness/color ramp across an image 0104 Fényerő/szín átmenet hozzáadása a képhez 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 Könyvjelző hozzáadása: kattintson egy galéria-thumbnailre. \nKönyvjelző átnevezése: kattintson rá, majd nyomja meg az [Átnevezés] gombot 0106 Add glare around bright objects 0106 Csillogás hozzáadása a fényes objektumok köré 0107 Add margins around an image 0107 Margó hozzáadása a kép köré 0108 Add newest version to existing versions 0108 Legújabb verzió hozzáadása a meglévő verziókhoz 0109 Add overlay image (e.g. copyright) to selected images 0109 Rátétkép hozzáadása (pl. copyright) a kijelölt képekhez 0110 Add random noise to an image 0110 Véletlenszerű zaj hozzáadása a képhez 0111 Add selected versions to existing versions 0111 Kijelölt verziók hozzáadása a meglévő verziókhoz 0112 Add texture to an image 0112 Textúra hozzáadása a képhez 0113 Add to Selection 0113 Hozzáadás a kijelöléshez 0114 Add/change/delete metadata for selected image files 0114 Metaadat hozzáadása/módosítása/törlése a kijelölt képfájlokhoz 0115 Add/remove barrel/pincushion distortion 0115 Hordó-/párnatorzítás hozzáadása/eltávolítása 0116 Add/remove brightness/color radially from chosen center 0116 Fényerő/szín hozzáadása/eltávolítása sugárirányban a választott középpontból 0117 Add/remove keywords for selected image files 0117 Kulcsszavak hozzáadása/eltávolítása a kijelölt képfájlokhoz 0118 Add/revise location/geocoordinates for selected image files 0118 Hely/geokoordináták hozzáadása/módosítása a kijelölt képfájlokhoz 0119 Adjust HSL 0119 HSL beállítása 0120 Adjust Image Contributions 0120 Kép-hozzájárulások beállítása 0121 Adjust Pixel Composition 0121 Pixelösszetétel beállítása 0122 Adjust RGB 0122 RGB beállítása 0123 Adjust brightness, contrast, color 0123 Fényerő, kontraszt, szín beállítása 0124 Adjust color saturation based on brightness 0124 Szín telítettségének beállítása a fényerő alapján 0125 Adjust color using HSL color model 0125 Szín beállítása HSL színmodell alapján 0126 Adjust color using RGB or CMY colors 0126 Szín beállítása RGB vagy CMY színek alapján 0127 Adjustment 0127 Beállítás 0128 Album Mass Update 0128 Album tömeges frissítése 0129 Album Name 0129 Album neve 0130 Albums 0130 Albumok 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 Albumok: kiválasztott képek galériája, húzd és ejtsd elrendezéssel 0132 Algorithm Iterations 0132 Algoritmus iterációi 0133 Alien Colors 0133 Idegen színek 0134 All 0134 Összes 0135 All Areas 0135 Minden terület 0136 All files 0136 Minden fájl 0137 All image files will be re-indexed. \nContinue? 0137 Minden képfájl újraindexelésre kerül. \nFolytatja? 0138 All±1 0138 Mind±1 0139 All±10 0139 Mind±10 0140 Alpha 0140 Alfa 0141 Amount 0141 Mennyiség 0142 Amplify 0142 Erősítés 0143 Amplify Contrast 0143 Kontraszt erősítése 0144 Amplify area contrast to enhance visibility of details 0144 Terület kontrasztjának erősítése a részletek láthatóságának javítására 0145 Angle 0145 Szög 0146 Anti-Alias 0146 Élsimítás 0147 Apply 0147 Alkalmaz 0148 Apply a soft focus effect to an image 0148 Lágy fókusz effekt alkalmazása a képre 0149 Apply repeatedly while watching the image. 0149 Ismételje meg többször, miközben figyeli a képet. 0150 Area Blend 0150 Terület keverése 0151 Area Edge Blend 0151 Terület szélének keverése 0152 Area Fill 0152 Terület kitöltése 0153 Arrange images and text in a layout (photo-montage) 0153 Képek és szöveg elrendezése egy layoutban (fotómontázs) 0154 Array Complete 0154 Sor kész 0155 Array Width 0155 Sor szélessége 0156 Arrow head 0156 Nyílhegy 0157 Auto Level 0157 Automatikus szint 0158 Auto black level 0158 Automatikus feketepont 0159 Auto crop: 0159 Automatikus vágás: 0160 Auto white balance 0160 Automatikus fehéregyensúly 0161 Auto-replay 0161 Automatikus lejátszás 0162 BATCH CHANGE META 0162 KÖTEGELT METAADAT MÓDOSÍTÁS 0163 BATCH CONVERT 0163 KÖTEGELT ÁTALAKÍTÁS 0164 BATCH COPY/MOVE 0164 KÖTEGELT MÁSOLÁS/ÁTHELYEZÉS 0165 BATCH DELETE/TRASH 0165 KÖTEGELT TÖRLÉS/KUKA 0166 BATCH GEOTAGS 0166 KÖTEGELT GEOTAGEK 0167 BATCH KEYWORDS 0167 KÖTEGELT KULCSSZAVAK 0168 BATCH MENU 0168 KÖTEGELT MENÜ 0169 BATCH OVERLAY 0169 KÖTEGELT RÁTÉT 0170 BATCH PHOTO DATE 0170 KÖTEGELT FOTÓ DÁTUM 0171 BATCH PROCESSING 0171 KÖTEGELT FELDOLGOZÁS 0172 BATCH PURGE KEYWORDS 0172 KÖTEGELT KULCSSZÓ TÖRLÉS 0173 BATCH RENAME KEYWORDS 0173 KÖTEGELT KULCSSZÓ ÁTNEVEZÉS 0174 BATCH REPORT META 0174 KÖTEGELT METAADAT JELENTÉS 0175 BATCH SCRIPT 0175 KÖTEGELT SZKRIPT 0176 BATCH UPRIGHT 0176 KÖTEGELT EGYENESBE ÁLLÍTÁS 0177 BLANK IMAGE 0177 ÜRES KÉP 0178 BLUR 0178 ELMOSÁS 0179 BOOKMARKS 0179 KÖNYVJELZŐK 0180 BRIGHTNESS RAMP 0180 FÉNYERŐ ÁTMENET 0181 Background 0181 Háttér 0182 Background Blur - blur relative to distance from foreground 0182 Háttérelmosás - elmosás az előtértől mért távolság alapján 0183 Background Color 0183 Háttérszín 0184 Background Pattern 0184 Háttérminta 0185 Base Transparency 0185 Alap átlátszóság 0186 Batch 0186 Köteg 0187 Batch Add/Change Metadata 0187 Metaadat kötegelt hozzáadása/módosítása 0188 Batch Add/Remove Keywords 0188 Kulcsszavak kötegelt hozzáadása/eltávolítása 0189 Batch Change Meta 0189 Metaadat kötegelt módosítása 0190 Batch Convert 0190 Kötegelt átalakítás 0191 Batch Copy/Move 0191 Kötegelt másolás/áthelyezés 0192 Batch Delete/Trash 0192 Kötegelt törlés/kuka 0193 Batch Geotags 0193 Geotagek kötegelt beállítása 0194 Batch Keywords 0194 Kulcsszavak kötegelt kezelése 0195 Batch Metadata 0195 Metaadat kötegelt kezelése 0196 Batch Overlay 0196 Rátét kötegelt alkalmazása 0197 Batch Photo Date 0197 Fotó dátumának kötegelt beállítása 0198 Batch Photo Date/Time 0198 Fotó dátumának/idejének kötegelt beállítása 0199 Batch Purge Keywords 0199 Kulcsszavak kötegelt törlése 0200 Batch Rename Keywords 0200 Kulcsszavak kötegelt átnevezése 0201 Batch Report Meta 0201 Metaadat kötegelt jelentése 0202 Batch Report Metadata 0202 Metaadat kötegelt jelentése 0203 Batch Set Geotags 0203 Geotagek kötegelt beállítása 0204 Batch Upright 0204 Kötegelt egyenesbe állítás 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 Köteg: másolás, áthelyezés, átalakítás, RAW átalakítás, metaadat hozzáadása/módosítása 0206 Bend and fine-align 0206 Hajlítás és finomigazítás 0207 Bias 0207 Torzítás 0208 Black 0208 Fekete 0209 Blank Image 0209 Üres kép 0210 Blend 0210 Keverés 0211 Blend 0% 0211 Keverés 0% 0212 Blend Width 0212 Keverési szélesség 0213 Blend area edits/edges using the mouse 0213 Terület szerkesztéseinek/széleinek keverése az egérrel 0214 Blend: 0% 0214 Keverés: 0% 0215 Blue 0215 Kék 0216 Blue Factors 0216 Kék tényezők 0217 Blur 0217 Elmosás 0218 Blur Angle (degrees) 0218 Elmosás szöge (fok) 0219 Blur Background 0219 Háttér elmosása 0220 Blur Image 0220 Kép elmosása 0221 Blur Mix 0221 Elmosás keverése 0222 Blur Normal 0222 Normál elmosás 0223 Blur Radius 0223 Elmosás sugara 0224 Blur Span 0224 Elmosás mértéke 0225 Blur Span (pixels) 0225 Elmosás mértéke (pixel) 0226 Blur the image (various methods) 0226 Kép elmosása (különböző módszerekkel) 0227 Bookmarks 0227 Könyvjelzők 0228 Both 0228 Mindkettő 0229 Bottom 0229 Alul 0230 Bright Limit 0230 Fényes határ 0231 Bright Point 0231 Fényes pont 0232 Brightness 0232 Fényerő 0233 Brightness Histogram 0233 Fényerő-hisztogram 0234 Brightness Ramp 0234 Fényerő átmenet 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 A fényerőnek fokozatos átmenetet kell mutatnia, \negészen a szélekig. 0236 Browse 0236 Tallózás 0237 CALIBRATE PRINTER 0237 NYOMTATÓ KALIBRÁLÁSA 0238 CAPTIONS 0238 FELIRATOK 0239 CARTOON 0239 RAJZFILM 0240 CHOOSE ALBUM 0240 ALBUM KIVÁLASZTÁSA 0241 CLEAR AREA 0241 TERÜLET TÖRLÉSE 0242 CLOSE 0242 BEZÁRÁS 0243 COLOR MODE 0243 SZÍNMÓD 0244 COMBINE MENU 0244 EGYESÍTÉS MENÜ 0245 COMMAND PARAMETERS 0245 PARANCS PARAMÉTEREK 0246 COMPLETED 0246 BEFEJEZVE 0247 COPY FROM IMAGE 0247 MÁSOLÁS KÉPBŐL 0248 COPY IN IMAGE 0248 MÁSOLÁS KÉPEN BELÜL 0249 COPY META 0249 METAADAT MÁSOLÁSA 0250 COPY PRIOR EDIT 0250 KORÁBBI SZERKESZTÉS MÁSOLÁSA 0251 COPY TO CLIPBOARD 0251 MÁSOLÁS VÁGÓLAPRA 0252 COPY TO DESKTOP 0252 MÁSOLÁS ASZTALRA 0253 COPY/MOVE 0253 MÁSOLÁS/ÁTHELYEZÉS 0254 COPY/PASTE AREA 0254 TERÜLET MÁSOLÁSA/BEILLESZTÉSE 0255 CREATE ALBUM 0255 ALBUM LÉTREHOZÁSA 0256 CROP 0256 VÁGÁS 0257 CROSSHATCH 0257 KERESZTVONALKÁZÁS 0258 CURRENT ALBUM 0258 JELENLEGI ALBUM 0259 CURRENT FILE FOLDER 0259 JELENLEGI FÁJL MAPPÁJA 0260 CURVE EDITING 0260 GÖRBE SZERKESZTÉSE 0261 CUSTOM KERNEL 0261 EGYÉNI KERNEL 0262 CUSTOM MENU 0262 EGYÉNI MENÜ 0263 CYCLE 2 FILES 0263 2 FÁJL VÁLTOGATÁSA 0264 CYCLE 3 FILES 0264 3 FÁJL VÁLTOGATÁSA 0265 Calculate 0265 Számítás 0266 Calculate Geometry 0266 Geometria számítása 0267 Calibrate Printer 0267 Nyomtató kalibrálása 0268 Cancel 0268 Mégse 0269 Cartoon 0269 Rajzfilm 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 Figyelem: Az ott elérhető tagek módosításához \nhasználja a Fő metaadat szerkesztése funkciót, \nhogy a kapcsolódó frissítések is megtörténjenek. 0271 Center 0271 Középpont 0272 Center Hole 0272 Középső lyuk 0273 Change 0273 Módosítás 0274 Change Log 0274 Változásnapló 0275 Change file name 0275 Fájlnév módosítása 0276 Change gallery sort order 0276 Galéria rendezési sorrendjének módosítása 0277 Change image colors using an algorithm 0277 Kép színeinek módosítása algoritmussal 0278 Change image pixel dimensions 0278 Kép pixelméretének módosítása 0279 Chart to adjust monitor color 0279 Táblázat a monitor színének beállításához 0280 Choose 0280 Válasszon 0281 Choose Album 0281 Album kiválasztása 0282 Choose Albums 0282 Albumok kiválasztása 0283 Choose Captions 0283 Feliratok kiválasztása 0284 Choose an album and show as gallery of images 0284 Album kiválasztása és megjelenítése képgalériaként 0285 Choose metadata shown on image captions 0285 A képfeliratokon megjelenő metaadat kiválasztása 0286 Choose new Fotocx home folder 0286 Új Fotocx alapmappa kiválasztása 0287 Choose thumbnail folder 0287 Thumbnail mappa kiválasztása 0288 Choose top image folders 0288 Felső képmappák kiválasztása 0289 Clear 0289 Törlés 0290 Click dark spot for black level 0290 Kattintson egy sötét pontra a feketepont beállításához 0291 Click for RGB histogram 0291 Kattintson az RGB hisztogramért 0292 Click gray spot for white balance 0292 Kattintson egy szürke pontra a fehéregyensúly beállításához 0293 Click image to select pixels 0293 Kattintson a képre pixelek kijelöléséhez 0294 Click image to select, drag image to move. 0294 Kattintson a képre a kijelöléshez, húzza a mozgatáshoz. 0295 Click mouse to change center 0295 Kattintson az egérrel a középpont módosításához 0296 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0296 Kattintson a terület körvonalának bármely pontja közelébe. \nA körvonalban lévő esetleges hézagok megkeresésre kerülnek. \nNyomja meg az F1-et a súgóhoz 0297 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0297 Kattintson egy tetragon terület négy sarkára. Nyomja meg az [alkalmaz] gombot. \nA kép torzítása négyszögletessé alakítja a tetragont. 0298 Click thumbnail to select file 0298 Kattintson a thumbnailre a fájl kijelöléséhez 0299 Clip Level 0299 Vágási szint 0300 Clip Limit % 0300 Vágási korlát % 0301 Color 0301 Szín 0302 Color Chooser 0302 Színválasztó 0303 Color Depth: 0303 Színmélység: 0304 Color Fringes 0304 Színszegélyek 0305 Color Hue 0305 Szín árnyalata 0306 Color Map File 0306 Színtérkép fájl 0307 Color Match Images 0307 Színek egyeztetése képek között 0308 Color Mode 0308 Színmód 0309 Color calibration tool for printer and paper type 0309 Színkalibráló eszköz nyomtatóhoz és papírtípushoz 0310 Color map file to use 0310 Használandó színtérkép fájl 0311 Combine 0311 Egyesítés 0312 Combine 2-6 images into a wide panorama image 0312 2-6 kép egyesítése széles panorámaképpé 0313 Combine many images into an array of images 0313 Sok kép egyesítése egy képtömbbé 0314 Combine multiple images in layers, select and expose layers 0314 Több kép egyesítése rétegekben, rétegek kijelölése és megjelenítése 0315 Combine multiple noisy photos into a low-noise image 0315 Több zajos fotó egyesítése alacsony zajú képpé 0316 Combine multiple photos to erase passing people, etc. 0316 Több fotó egyesítése az áthaladó emberek stb. eltüntetéséhez 0317 Combine within 0317 Egyesítés ezen belül 0318 Combine: HDR, HDF, stack, panorama, mashup, image array 0318 Egyesítés: HDR, HDF, stack, panoráma, mashup, képtömb 0319 Command Params 0319 Parancs paraméterei 0320 Commit 0320 Véglegesítés 0321 Confirm Exit 0321 Kilépés megerősítése 0322 Contrast 0322 Kontraszt 0323 Contrast All 0323 Kontraszt - összes 0324 Contrast Blue 0324 Kontraszt - kék 0325 Contrast Green 0325 Kontraszt - zöld 0326 Contrast Limit 0326 Kontraszt korlátja 0327 Contrast Red 0327 Kontraszt - vörös 0328 Convert %d image files 0328 %d képfájl átalakítása 0329 Convert an image into a Tiny Planet image 0329 Kép átalakítása Tiny Planet képpé 0330 Convert image into a cartoon drawing 0330 Kép átalakítása rajzfilmszerű rajzzá 0331 Convert image into a crosshatch sketch 0331 Kép átalakítása keresztvonalkázott vázlattá 0332 Convert image into a line drawing 0332 Kép átalakítása vonalrajzzá 0333 Convert image into a simulated painting 0333 Kép átalakítása szimulált festménnyé 0334 Convert image into a simulated sketch (1) 0334 Kép átalakítása szimulált vázlattá (1) 0335 Convert image into a simulated sketch (2) 0335 Kép átalakítása szimulált vázlattá (2) 0336 Convert image into black/white lines 0336 Kép átalakítása fekete-fehér vonalakká 0337 Convert image into dithered dots 0337 Kép átalakítása pontozott (dithered) mintává 0338 Convert image into square tiles with 3D effect 0338 Kép átalakítása négyzet alakú, 3D hatású csempékké 0339 Convert image into tiles matching feature contours 0339 Kép átalakítása a jellemzők körvonalaihoz illeszkedő csempékké 0340 Copy 0340 Másolás 0341 Copy %d image files 0341 %d képfájl másolása 0342 Copy From Image 0342 Másolás képből 0343 Copy Meta 0343 Metaadat másolása 0344 Copy Metadata 0344 Metaadat másolása 0345 Copy Prior Edit 0345 Korábbi szerkesztés másolása 0346 Copy Within Image 0346 Másolás képen belül 0347 Copy area for later pasting into image 0347 Terület másolása későbbi beillesztéshez a képbe 0348 Copy areas from another image using the mouse 0348 Területek másolása másik képből az egérrel 0349 Copy areas from prior edits using the mouse 0349 Területek másolása korábbi szerkesztésekből az egérrel 0350 Copy areas within an image using the mouse 0350 Területek másolása képen belül az egérrel 0351 Copy image file to the clipboard 0351 Képfájl másolása a vágólapra 0352 Copy image file to the desktop 0352 Képfájl másolása az asztalra 0353 Copy in Image 0353 Másolás a képen belül 0354 Copy metadata from one image to another 0354 Metaadat másolása egyik képről a másikra 0355 Copy or Move Image File 0355 Képfájl másolása vagy áthelyezése 0356 Copy or Move image file to new location 0356 Képfájl másolása vagy áthelyezése új helyre 0357 Copy to Clipboard 0357 Másolás vágólapra 0358 Copy to Desktop 0358 Másolás asztalra 0359 Copy without unsaved changes? 0359 Másolás a mentetlen módosítások nélkül? 0360 Copy/Move 0360 Másolás/Áthelyezés 0361 Copy/move selected image files to a new folder 0361 Kijelölt képfájlok másolása/áthelyezése új mappába 0362 Copyright 0362 Copyright 0363 Create 0363 Létrehozás 0364 Create Album 0364 Album létrehozása 0365 Create Blank Image 0365 Üres kép létrehozása 0366 Create Mosaic 0366 Mozaik létrehozása 0367 Create a blank image 0367 Üres kép létrehozása 0368 Create a mosaic with tiles made from all images 0368 Mozaik létrehozása az összes képből készült csempékkel 0369 Create a new album (ordered set of image files) 0369 Új album létrehozása (rendezett képfájlkészlet) 0370 Create an embossed or 3D appearance 0370 Dombornyomott vagy 3D megjelenés létrehozása 0371 Create or replace an album 0371 Album létrehozása vagy cseréje 0372 Crop 0372 Vágás 0373 Crop (trim) image margins 0373 Kép margóinak levágása 0374 Crop Buttons 0374 Vágógombok 0375 Crop Image 0375 Kép vágása 0376 Crosshatch 0376 Keresztvonalkázás 0377 Crosshatch Sketch 0377 Keresztvonalkázott vázlat 0378 Current Album 0378 Jelenlegi album 0379 Current File Folder 0379 Jelenlegi fájl mappája 0380 Current gallery 0380 Jelenlegi galéria 0381 Current image: 0381 Jelenlegi kép: 0382 Curve Node 0382 Görbe csomópont 0383 Curve lines need at least 4 points 0383 A görbevonalakhoz legalább 4 pont szükséges 0384 Custom 0384 Egyéni 0385 Custom Kernel 0385 Egyéni kernel 0386 Custom Shortcuts \n 0386 Egyéni gyorsbillentyűk \n 0387 Custom menu: favorite/frequent functions, scripts, plugins 0387 Egyéni menü: kedvenc/gyakori funkciók, szkriptek, beépülők 0388 Customize 0388 Testreszabás 0389 Customize: 0389 Testreszabás: 0390 Cut Bottom 0390 Alsó levágás 0391 Cut Top 0391 Felső levágás 0392 Cycle 2 Files 0392 2 fájl váltogatása 0393 Cycle 2 Prior Files 0393 2 korábbi fájl váltogatása 0394 Cycle 3 Files 0394 3 fájl váltogatása 0395 Cycle 3 Prior Files 0395 3 korábbi fájl váltogatása 0396 Cycle through images: 0396 Váltogatás a képek között: 0397 DARK/BRIGHT PIXELS 0397 SÖTÉT/VILÁGOS PIXELEK 0398 DEFOG 0398 KÖDMENTESÍTÉS 0399 DELETE ALBUM 0399 ALBUM TÖRLÉSE 0400 DELETE META 0400 METAADAT TÖRLÉSE 0401 DELETE/TRASH 0401 TÖRLÉS/KUKA 0402 DENOISE 0402 ZAJCSÖKKENTÉS 0403 DIALOG BUTTONS 0403 PÁRBESZÉDABLAK GOMBJAI 0404 DITHER 0404 DITHER 0405 DRAG AND DROP 0405 HÚZÁS ÉS EJTÉS 0406 Dark Areas 0406 Sötét területek 0407 Dark Limit 0407 Sötét határ 0408 Dark Point 0408 Sötét pont 0409 Dark/Bright Pixels 0409 Sötét/világos pixelek 0410 Data file 0410 Adatfájl 0411 Define keywords used for searching images 0411 Képek kereséséhez használt kulcsszavak meghatározása 0412 Defined Keywords: 0412 Meghatározott kulcsszavak: 0413 Defog 0413 Ködmentesítés 0414 Delete 0414 Törlés 0415 Delete Album 0415 Album törlése 0416 Delete Meta 0416 Metaadat törlése 0417 Delete Metadata 0417 Metaadat törlése 0418 Delete Originals 0418 Eredetik törlése 0419 Delete an album 0419 Album törlése 0420 Delete or Trash selected image files 0420 Kijelölt képfájlok törlése vagy kukába helyezése 0421 Delete or trash an image file 0421 Képfájl törlése vagy kukába helyezése 0422 Delete read-only file? 0422 Törli a csak olvasható fájlt? 0423 Delete/Trash 0423 Törlés/Kuka 0424 Denoise 0424 Zajcsökkentés 0425 Depth 0425 Mélység 0426 Description: %s\n 0426 Leírás: %s\n 0427 Desktop 0427 Asztal 0428 Dialog Font 0428 Párbeszédablak betűtípusa 0429 Diffs 0429 Eltérések 0430 Directed Blur 0430 Irányított elmosás 0431 Directed Blur - blur locally in direction of mouse drag 0431 Irányított elmosás - helyi elmosás az egérhúzás irányában 0432 Disable 0432 Letiltás 0433 Disable areas for editing 0433 Területek letiltása szerkesztésre 0434 Discard unsaved changes? 0434 Elveti a mentetlen módosításokat? 0435 Discard unsaved edits? 0435 Elveti a mentetlen szerkesztéseket? 0436 Distort image areas using the mouse 0436 Képterületek torzítása az egérrel 0437 Dither 0437 Dither 0438 Dither Image 0438 Kép ditherelése 0439 Dither0 0439 Dither0 0440 Dither1 0440 Dither1 0441 Dither2 0441 Dither2 0442 Dither3 0442 Dither3 0443 Dither4 0443 Dither4 0444 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0444 Húzza a képeket durva igazításba.\nForgatáshoz húzza az alsó élből. 0445 Drag margin box middle or edges 0445 Húzza a margódoboz közepét vagy széleit 0446 Drag mouse on image. \nLeft click to cancel. 0446 Húzza az egeret a képen. \nBal kattintás a megszakításhoz. 0447 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0447 Húzza az egeret a kijelöléshez. Törlés. Ismétlés. \nKattintás: kijelölés kiterjesztése az egérig. 0448 Drag mouse to set center 0448 Húzza az egeret a középpont beállításához 0449 Drag near an image corner using the mouse 0449 Húzza az egeret egy képsarok közelében 0450 Drag on image to level image.\nClick on image for level lines. 0450 Húzza a képet a szintezéshez.\nKattintson a képre a szintvonalakért. 0451 Drag within image using the mouse 0451 Húzza az egeret a képen belül 0452 Draw a line across the image in \ndirection of brightness change. 0452 Húzzon egy vonalat a képen keresztül \na fényerő-változás irányában. 0453 Draw box on image 0453 Doboz rajzolása a képre 0454 Draw line or arrow on image 0454 Vonal vagy nyíl rajzolása a képre 0455 Draw on image: text, line/arrow, box, circle, ellipse 0455 Rajzolás a képre: szöveg, vonal/nyíl, doboz, kör, ellipszis 0456 Draw oval on image 0456 Ovális rajzolása a képre 0457 Draw text on image 0457 Szöveg rajzolása a képre 0458 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0458 Duplikált vagy egymásba ágyazott mappák: \n %s \n %s \nKérjük, távolítsa el. 0459 Duplicates: 0459 Duplikátumok: 0460 EDIT ALBUM 0460 ALBUM SZERKESZTÉSE 0461 EDIT ANY META 0461 BÁRMELY METAADAT SZERKESZTÉSE 0462 EDIT BOOKMARKS 0462 KÖNYVJELZŐK SZERKESZTÉSE 0463 EDIT MAIN META 0463 FŐ METAADAT SZERKESZTÉSE 0464 EDIT MENU 0464 SZERKESZTÉS MENÜ 0465 EDIT PROCEDURES 0465 ELJÁRÁSOK SZERKESZTÉSE 0466 EDIT SCRIPT 0466 SZKRIPT SZERKESZTÉSE 0467 EDIT WORKFLOW 0467 MUNKAFOLYAMAT SZERKESZTÉSE 0468 EFFECTS MENU 0468 EFFEKTEK MENÜ 0469 EMBOSS 0469 DOMBORÍTÁS 0470 ENABLE/DISABLE AREA 0470 TERÜLET ENGEDÉLYEZÉSE/LETILTÁSA 0471 ENGRAVE 0471 METSZET 0472 ESCHER SPIRAL 0472 ESCHER SPIRÁL 0473 EXPORT FILES 0473 FÁJLOK EXPORTÁLÁSA 0474 Edge 0474 Él 0475 Edit 0475 Szerkesztés 0476 Edit Any Meta 0476 Bármely metaadat szerkesztése 0477 Edit Any Metadata 0477 Bármely metaadat szerkesztése 0478 Edit Bookmarks 0478 Könyvjelzők szerkesztése 0479 Edit Images 0479 Képek szerkesztése 0480 Edit Line 0480 Vonal szerkesztése 0481 Edit Line/Arrow 0481 Vonal/nyíl szerkesztése 0482 Edit Main Meta 0482 Fő metaadat szerkesztése 0483 Edit Main Metadata 0483 Fő metaadat szerkesztése 0484 Edit Menu 0484 Szerkesztés menü 0485 Edit Metadata 0485 Metaadat szerkesztése 0486 Edit Text 0486 Szöveg szerkesztése 0487 Edit any metadata tag 0487 Bármely metaadat tag szerkesztése 0488 Edit function can not use Paint Edits 0488 A szerkesztő funkció nem használhatja a Festés szerkesztést 0489 Edit function must be active 0489 A szerkesztő funkciónak aktívnak kell lennie 0490 Edit key metadata: keywords/geotags/description/rating ... 0490 Fő metaadat szerkesztése: kulcsszavak/geotagek/leírás/értékelés ... 0491 Edit plugins menu 0491 Beépülők menü szerkesztése 0492 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0492 Szerkesztés: vágás, forgatás, retusálás, átméretezés, jelölés, festés szerkesztése, területek másolása 0493 Effects 0493 Effektek 0494 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0494 Effektek: rajzfilm, vázlat, festés, dombornyomás, dither, textúra, színek, egyéni konvolúció 0495 Emboss 0495 Dombornyomás 0496 Enable 0496 Engedélyezés 0497 Enable areas for editing 0497 Területek engedélyezése szerkesztésre 0498 End of gallery 0498 A galéria vége 0499 Engrave 0499 Metszet 0500 Enter Keyword 0500 Kulcsszó megadása 0501 Enter New Keyword 0501 Új kulcsszó megadása 0502 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0502 Adja meg a vonal vagy nyíl tulajdonságait a párbeszédablakban, \nkattintson/húzza a képen, jobb kattintással eltávolítható 0503 Enter text, [Add] to layout, edit properties. 0503 Adja meg a szöveget, [Hozzáadás] az elrendezéshez, tulajdonságok szerkesztése. 0504 Enter text, click/drag on image, right click to remove 0504 Adja meg a szöveget, kattintson/húzza a képen, jobb kattintással eltávolítható 0505 Erase 0505 Törlés 0506 Erase existing areas 0506 Meglévő területek törlése 0507 Escher Spiral 0507 Escher spirál 0508 Exceed 50 anchor points 0508 Túllépte az 50 rögzítési pontot 0509 Export Files 0509 Fájlok exportálása 0510 Export selected image files to another folder 0510 Kijelölt képfájlok exportálása másik mappába 0511 FILE MENU 0511 FÁJL MENÜ 0512 FILE SAVE 0512 FÁJL MENTÉSE 0513 FILE VIEW 0513 FÁJL NÉZET 0514 FIND AREA GAP 0514 TERÜLET HÉZAG KERESÉSE 0515 FIND BAD FILES 0515 HIBÁS FÁJLOK KERESÉSE 0516 FIND DUPLICATES 0516 DUPLIKÁTUMOK KERESÉSE 0517 FIRST INDEX 0517 ELSŐ INDEXELÉS 0518 FIRST STARTUP 0518 ELSŐ INDÍTÁS 0519 FIX META 0519 METAADAT JAVÍTÁSA 0520 FLATTEN HISTOGRAM 0520 HISZTOGRAM LAPÍTÁSA 0521 FLATTEN PHOTO 0521 FOTÓ LAPÍTÁSA 0522 FOLDER TREE 0522 MAPPAFA 0523 FOTOCX FOR WINDOWS 11 0523 FOTOCX WINDOWS 11-HEZ 0524 FOTOCX LIMITATIONS 0524 FOTOCX KORLÁTOZÁSOK 0525 FOTOCX USAGE 0525 FOTOCX HASZNÁLATA 0526 FRINGES 0526 SZEGÉLYEK 0527 FUSION 0527 FÚZIÓ 0528 Fetch 0528 Lekérés 0529 File 0529 Fájl 0530 File Mod Date/Time 0530 Fájl módosítási dátuma/ideje 0531 File Name 0531 Fájlnév 0532 File Name/Number 0532 Fájlnév/szám 0533 File Name: %s \n 0533 Fájlnév: %s \n 0534 File Size (bytes) 0534 Fájlméret (bájt) 0535 File View 0535 Fájl nézet 0536 File count: 0536 Fájlok száma: 0537 File type cannot be edited 0537 A fájltípus nem szerkeszthető 0538 File1 0538 Fájl1 0539 File2 0539 Fájl2 0540 File: 0540 Fájl: 0541 File: new session, open, rename, copy/move, delete, print 0541 Fájl: új munkamenet, megnyitás, átnevezés, másolás/áthelyezés, törlés, nyomtatás 0542 Fill selected areas or transparent areas with a color 0542 Kijelölt vagy átlátszó területek kitöltése színnel 0543 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0543 Kijelölt területek kitöltése színnel a vizuális ellenőrzéshez. \n1. módszer: bal kattintás minden még ki nem töltött kijelölt területen. \n2. módszer: jobb kattintás az összes kijelölt területen KÍVÜL. \nNyomja meg a [súgó] gombot a részletekért 0544 Find 0544 Keresés 0545 Find Bad Files 0545 Hibás fájlok keresése 0546 Find Duplicate Images 0546 Duplikált képek keresése 0547 Find Duplicates 0547 Duplikátumok keresése 0548 Find Gap 0548 Hézag keresése 0549 Find a gap in an area outline 0549 Hézag keresése a terület körvonalában 0550 Find all images for a location [date range] 0550 Az adott helyhez tartozó összes kép keresése [dátumtartomány] 0551 Find all images for a selected tag name and value 0551 Az összes kép keresése egy kijelölt tag névhez és értékhez 0552 Find images meeting multiple search criteria 0552 Több keresési feltételnek megfelelő képek keresése 0553 Find optimum factors: 0553 Optimális tényezők keresése: 0554 Finish 0554 Befejezés 0555 Finish Area 0555 Terület befejezése 0556 Fix Bad File 0556 Hibás fájl javítása 0557 Fix Broken Metadata 0557 Sérült metaadat javítása 0558 Fix Meta 0558 Metaadat javítása 0559 Fix Motion Blur 0559 Mozgási elmosódás javítása 0560 Fix Perspective 0560 Perspektíva javítása 0561 Fix color fringes (chromatic aberration) 0561 Színszegélyek javítása (kromatikus aberráció) 0562 Fix perspective for object photographed from an angle 0562 Perspektíva javítása szögből fotózott objektumhoz 0563 Fix red-eyes from flash photo 0563 Vörösszem javítása vaku használata után 0564 Flatten 0564 Lapítás 0565 Flatten Histogram 0565 Hisztogram lapítása 0566 Flatten Pano 0566 Panoráma lapítása 0567 Flatten Photo 0567 Fotó lapítása 0568 Flatten brightness histogram to enhance details 0568 Fényerő-hisztogram lapítása a részletek javításához 0569 Flatten curved surface. 0569 Görbült felület lapítása. 0570 Flatten photo of a curved image (e.g. poster on round column 0570 Görbült felületű kép lapítása (pl. henger alakú oszlopon lévő poszter) 0571 Flip 0571 Tükrözés 0572 Folder Tree 0572 Mappafa 0573 Folders 0573 Mappák 0574 Folders for image files (subfolders included automatically) 0574 Mappák a képfájlokhoz (az almappák automatikusan beleértve) 0575 Font 0575 Betűtípus 0576 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0576 Véletlenszerű képsorrend esetén ez az érték a kép \nmegjelenítésének relatív gyakorisága. \nAz alapérték 10. 20 --> kétszer olyan gyakran jelenik meg. 0577 Foreground 0577 Előtér 0578 Fotocx copyright notice 0578 Fotocx copyright nyilatkozat 0579 Fotocx home 0579 Fotocx alapmappa 0580 Fotocx privacy policy 0580 Fotocx adatvédelmi szabályzat 0581 Fotocx video tutorial on YouTube 0581 Fotocx videó bemutató a YouTube-on 0582 Fotocx web site (information and downloads) 0582 Fotocx weboldal (információk és letöltések) 0583 FreeSans 0583 FreeSans 0584 Full List 0584 Teljes lista 0585 Full Screen 0585 Teljes képernyő 0586 Fusion 0586 Fúzió 0587 GALLERY END 0587 GALÉRIA VÉGE 0588 GALLERY FILTER 0588 GALÉRIA SZŰRŐ 0589 GALLERY HOME 0589 GALÉRIA KEZDŐLAP 0590 GALLERY MENU 0590 GALÉRIA MENÜ 0591 GALLERY OVERVIEW 0591 GALÉRIA ÁTTEKINTÉS 0592 GALLERY SORT 0592 GALÉRIA RENDEZÉSE 0593 GALLERY TO ALBUM 0593 GALÉRIÁBÓL ALBUM 0594 GALLERY VIEW 0594 GALÉRIA NÉZET 0595 GDK pixbuf: cannot save file 0595 GDK pixbuf: a fájl mentése sikertelen 0596 GLOBAL RETINEX 0596 GLOBÁLIS RETINEX 0597 GRID SETTINGS 0597 RÁCS BEÁLLÍTÁSOK 0598 Gallery 0598 Galéria 0599 Gallery End 0599 Galéria vége 0600 Gallery Filter 0600 Galéria szűrő 0601 Gallery Home 0601 Galéria kezdőlap 0602 Gallery Sort 0602 Galéria rendezése 0603 Gallery View 0603 Galéria nézet 0604 Gallery of newest image files 0604 A legújabb képfájlok galériája 0605 Gallery of recently viewed image files 0605 A legutóbb megtekintett képfájlok galériája 0606 Gallery to Album 0606 Galériából album 0607 Gallery view with thumbnails and basic metadata 0607 Galéria nézet thumbnailekkel és alapvető metaadattal 0608 Gallery view with thumbnails and file data 0608 Galéria nézet thumbnailekkel és fájladatokkal 0609 Gallery: thumbnails, new/recent, sort, select, bookmarks 0609 Galéria: thumbnailek, új/legutóbbi, rendezés, kijelölés, könyvjelzők 0610 Generate an inward spiraling repeating image 0610 Befelé spirálozó ismétlődő kép létrehozása 0611 Global Retinex 0611 Globális retinex 0612 Gradual 0612 Fokozatos 0613 Graduated Blur 0613 Fokozatos elmosás 0614 Graduated Blur - blur relative to pixel contrast 0614 Fokozatos elmosás - elmosás a pixelkontraszt alapján 0615 Grayscale 0615 Szürkeárnyalatos 0616 Green 0616 Zöld 0617 Grid Settings 0617 Rács beállítások 0618 Group by country 0618 Csoportosítás ország szerint 0619 Group by country/date 0619 Csoportosítás ország/dátum szerint 0620 Group by country/location 0620 Csoportosítás ország/hely szerint 0621 Group by country/location/date 0621 Csoportosítás ország/hely/dátum szerint 0622 Group by date/country 0622 Csoportosítás dátum/ország szerint 0623 Group by date/country/location 0623 Csoportosítás dátum/ország/hely szerint 0624 HDF 0624 HDF 0625 HDR 0625 HDR 0626 HELP MENU 0626 SÚGÓ MENÜ 0627 Hard 0627 Kemény 0628 Height 0628 Magasság 0629 Height: 0629 Magasság: 0630 Help 0630 Súgó 0631 Help: user guide, tutorial, change log, licenses, privacy, about 0631 Súgó: felhasználói kézikönyv, oktatóanyag, változásnapló, licencek, adatvédelem, névjegy 0632 Hide 0632 Elrejtés 0633 Hide selected areas 0633 Kijelölt területek elrejtése 0634 High 0634 Magas 0635 High Depth of Field - combine near/far focus images for deeper focus 0635 Nagy mélységélesség - közeli/távoli fókuszú képek egyesítése nagyobb élesség érdekében 0636 High Dynamic Range - combine bright/dark images for better detail 0636 Nagy dinamikatartomány - világos/sötét képek egyesítése jobb részletekért 0637 Highlight darkest and brightest pixels 0637 A legsötétebb és legvilágosabb pixelek kiemelése 0638 Home Folder 0638 Alapmappa 0639 Home Page 0639 Kezdőlap 0640 Horz 0640 Vízsz. 0641 How to remove Fotocx application and user files 0641 Hogyan távolítsa el a Fotocx alkalmazást és felhasználói fájlokat 0642 Hue 0642 Árnyalat 0643 IMAGE ARRAY 0643 KÉPTÖMB 0644 INDEX FILES 0644 FÁJLOK INDEXELÉSE 0645 INSIDE-OUT 0645 KIFORDÍTÁS 0646 INVERT AREA 0646 TERÜLET INVERTÁLÁSA 0647 Icon size 0647 Ikonméret 0648 Icons 0648 Ikonok 0649 Image 0649 Kép 0650 Image Array 0650 Képtömb 0651 Image Columns 0651 Kép oszlopok 0652 Image Differences 0652 Kép különbségei 0653 Image File 0653 Képfájl 0654 Image File: 0654 Képfájl: 0655 Image Keywords 0655 Kép kulcsszavai 0656 Image Locations 0656 Kép helyei 0657 Image Markup 0657 Kép jelölése 0658 Image Position 0658 Kép pozíciója 0659 Image Preferences 0659 Kép beállításai 0660 Image Ratios 0660 Kép arányai 0661 Image Size (pixels) 0661 Képméret (pixel) 0662 Image Time 0662 Kép ideje 0663 Image Timeline 0663 Kép idővonala 0664 Image colors are converted for printing. 0664 A kép színei nyomtatáshoz lettek átalakítva. 0665 Image dimensions have changed \nCopy Prior Edit cannot be used 0665 A kép méretei megváltoztak, \na Korábbi szerkesztés másolása nem használható 0666 Image dimensions have changed, \nArea Blend cannot be used 0666 A kép méretei megváltoztak, \na Terület keverése nem használható 0667 Image dimensions have changed, \nthis prior image cannot be used 0667 A kép méretei megváltoztak, \nez a korábbi kép nem használható 0668 Image is fixed, unmovable 0668 A kép rögzített, nem mozgatható 0669 Images sizes are not compatible 0669 A képméretek nem kompatibilisek 0670 Include: 0670 Belefoglalás: 0671 Index Files 0671 Fájlok indexelése 0672 Index Level 0672 Index szintje 0673 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0673 Az indexelés megszakadt. \nAz indexelés szükséges a kereséshez, a térkép funkciókhoz, \nés ahhoz, hogy a galéria thumbnail oldalai gyorsan jelenjenek meg. 0674 Index new image files and make thumbnails 0674 Új képfájlok indexelése és thumbnailek készítése 0675 Input color to match and adjust: 0675 Egyeztetendő és beállítandó bemeneti szín: 0676 Inside-out 0676 Kifordítás 0677 Intensity 0677 Intenzitás 0678 Invert 0678 Invertálás 0679 Invert selected areas (selected ↔ not selected) 0679 Kijelölt területek invertálása (kijelölt ↔ nem kijelölt) 0680 Irregular Tiles 0680 Szabálytalan csempék 0681 Iterations 0681 Iterációk 0682 JPEG ARTIFACTS 0682 JPEG ARTEFAKTOK 0683 JPEG Artifacts 0683 JPEG artefaktok 0684 JPEG files 0684 JPEG fájlok 0685 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0685 Jan Feb Már Ápr Máj Jún Júl Aug Sze Okt Nov Dec 0686 Jump to gallery beginning [home] 0686 Ugrás a galéria elejére [home] 0687 Jump to gallery end [end] 0687 Ugrás a galéria végére [end] 0688 KEYBOARD ESCAPE KEY 0688 ESCAPE BILLENTYŰ 0689 KEYBOARD SHORTCUTS 0689 GYORSBILLENTYŰK 0690 KEYWORDS OVERVIEW 0690 KULCSSZAVAK ÁTTEKINTÉSE 0691 Keep 0691 Megtartás 0692 Kernel size 0692 Kernel mérete 0693 Keyboard Shortcuts 0693 Gyorsbillentyűk 0694 Keywords Category 0694 Kulcsszó kategória 0695 Kill active dialog? 0695 Bezárja az aktív párbeszédablakot? 0696 Kill busy function? 0696 Megszakítja a futó funkciót? 0697 Kuwahara 0697 Kuwahara 0698 Kuwahara Depth 0698 Kuwahara mélység 0699 LINE COLOR 0699 VONAL SZÍNE 0700 LOAD/SAVE AREA 0700 TERÜLET BETÖLTÉSE/MENTÉSE 0701 LOCAL CONTRAST 0701 HELYI KONTRASZT 0702 LOCAL RETINEX 0702 HELYI RETINEX 0703 Language 0703 Nyelv 0704 Layout and background image 0704 Elrendezés és háttérkép 0705 Left 0705 Balra 0706 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0706 Húzza balra az egeret a területen belül \na terület szerkesztéseinek fokozatos visszavonásához. \nHúzza jobbra a szerkesztések visszaállításához. \nHúzza a terület széle mentén az él keveréséhez. 0707 Left/right click: previous/next image (also arrow keys) 0707 Bal/jobb kattintás: előző/következő kép (nyílbillentyűkkel is) 0708 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0708 Bal/jobb kattintás: egy szerkesztési lépés visszavonása/ismétlése \nKözépső kattintás: vissza a kijelölt szerkesztési lépéshez 0709 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0709 Bal/jobb kattintás: kép/thumbnail nagyítása/kicsinyítése (+/- billentyűkkel is) 0710 Length 0710 Hossz 0711 Level 0711 Szint 0712 Licenses 0712 Licencek 0713 Light Source 0713 Fényforrás 0714 Lightness 0714 Világosság 0715 Limit 0715 Korlát 0716 Line Color 0716 Vonal színe 0717 Line Threshold 0717 Vonal küszöbérték 0718 Line Width 0718 Vonal szélessége 0719 Line length 0719 Vonal hossza 0720 List Fotocx command line parameters 0720 Fotocx parancssori paramétereinek listázása 0721 List all metadata for current image or clicked thumbnail 0721 A jelenlegi kép vagy a kattintott thumbnail összes metaadatának listázása 0722 List outboard programs and functions 0722 Külső programok és funkciók listázása 0723 Load 0723 Betöltés 0724 Load settings from file 0724 Beállítások betöltése fájlból 0725 Local Contrast 0725 Helyi kontraszt 0726 Local Retinex 0726 Helyi retinex 0727 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0727 A hely és az ország felülírja a jelenlegi értékeket.\nA GPS adat csak akkor kerül cserére, ha új érték van megadva. 0728 Lock 0728 Zárolás 0729 Low Amplify 0729 Alacsony erősítés 0730 MAGNIFY IMAGE 0730 KÉP NAGYÍTÁSA 0731 MAKE WAVES 0731 HULLÁMOK KÉSZÍTÉSE 0732 MANAGE KEYWORDS 0732 KULCSSZAVAK KEZELÉSE 0733 MAP MENU 0733 TÉRKÉP MENÜ 0734 MAP VIEW 0734 TÉRKÉP NÉZET 0735 MARGINS 0735 MARGÓK 0736 MARKUP 0736 JELÖLÉS 0737 MASHUP 0737 MASHUP 0738 MATCH COLORS 0738 SZÍNEK EGYEZTETÉSE 0739 MEASURE IMAGE 0739 KÉP MÉRÉSE 0740 MENU SHORTCUTS 0740 MENÜ GYORSBILLENTYŰK 0741 METADATA MENU 0741 METAADAT MENÜ 0742 METADATA TAGS 0742 METAADAT TAGEK 0743 METADATA VIEW 0743 METAADAT NÉZET 0744 MONITOR COLOR 0744 MONITOR SZÍNE 0745 MOSAIC 0745 MOZAIK 0746 MOUSE ALT-RIGHT-BUTTON 0746 EGÉR ALT+JOBB GOMB 0747 MOUSE FUNCTIONS 0747 EGÉR FUNKCIÓK 0748 MOUSE OWNERSHIP 0748 EGÉR TULAJDONJOGA 0749 MOVE FOTOCX HOME 0749 FOTOCX ALAPMAPPA ÁTHELYEZÉSE 0750 Magnify 0750 Nagyítás 0751 Magnify Image 0751 Kép nagyítása 0752 Magnify image around the mouse position 0752 Kép nagyítása az egér pozíciója körül 0753 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0753 A rendelkezésre álló memória túl kicsi a Fotocx futtatásához. \nKívánság szerint mégis megpróbálhatja. \n Folytatja? 0754 Make Layout Image 0754 Elrendezéskép készítése 0755 Make Square Tiles 0755 Négyzetes csempék készítése 0756 Make Waves 0756 Hullámok készítése 0757 Make a spherical projection of an image 0757 Kép gömbi vetületének készítése 0758 Make black margins transparent 0758 Fekete margók átlátszóvá tétele 0759 Make new versions 0759 Új verziók készítése 0760 Make width constant for window size 0760 Szélesség állandóvá tétele az ablak méretéhez 0761 Manage Keywords 0761 Kulcsszavak kezelése 0762 Map 0762 Térkép 0763 Map View 0763 Térkép nézet 0764 Maps 0764 Térképek 0765 Maps: view images by map location 0765 Térképek: képek megtekintése térképi hely szerint 0766 Margin 0766 Margó 0767 Margins 0767 Margók 0768 Markup 0768 Jelölés 0769 Mashup 0769 Mashup 0770 Mass update album files 0770 Albumfájlok tömeges frissítése 0771 Match Brightness 0771 Fényerő egyeztetése 0772 Match Colors 0772 Színek egyeztetése 0773 Match Level 0773 Egyezési szint 0774 Match Limit 0774 Egyezési korlát 0775 Match image colors to colors of another image 0775 Kép színeinek egyeztetése egy másik kép színeivel 0776 Match using: 0776 Egyeztetés alapja: 0777 Matching Keywords 0777 Egyező kulcsszavak 0778 Max 0778 Max 0779 Max. Width 0779 Max. szélesség 0780 Measure Image 0780 Kép mérése 0781 Measure Noise 0781 Zaj mérése 0782 Measure pixel distances within an image 0782 Pixeltávolságok mérése a képen belül 0783 Menu Colors 0783 Menü színei 0784 Menu Style 0784 Menü stílusa 0785 Metadata 0785 Metaadat 0786 Metadata Tags 0786 Metaadat tagek 0787 Metadata View 0787 Metaadat nézet 0788 Metadata from Search Function 0788 Metaadat a keresési funkcióból 0789 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0789 1. módszer:\nBal kattintás a vörösszemre a sötétítéshez.\n2. módszer:\nHúzza lefelé és jobbra a vörösszem bekeretezéséhez.\nBal kattintás a vörösszemre a sötétítéshez.\nVörösszem visszavonása:\nJobb kattintás a vörösszemre. 0790 Mirror: 0790 Tükrözés: 0791 Mode: 0791 Mód: 0792 Monitor Color 0792 Monitor színe 0793 Mosaic 0793 Mozaik 0794 Mouse Radius 0794 Egér sugara 0795 Mouse Warp (drag image) 0795 Egeres torzítás (kép húzása) 0796 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0796 Egér húzása: kép panorámázása 360°-ban \nBal/jobb egérkattintás: nagyítás/kicsinyítés \nEscape: kilépés a panoráma nézetből 0797 Move %d image files 0797 %d képfájl áthelyezése 0798 Move Fotocx Home 0798 Fotocx alapmappa áthelyezése 0799 Move Fotocx Home Folder 0799 Fotocx alapmappa áthelyezése 0800 Move Fotocx home folder to chosen folder 0800 Fotocx alapmappa áthelyezése a kiválasztott mappába 0801 Move mouse in a monotone image area. 0801 Mozgassa az egeret a kép egy egyszínű területén. 0802 Multiplier 0802 Szorzó 0803 NEW SESSION 0803 ÚJ MUNKAMENET 0804 NEWEST FILES 0804 LEGÚJABB FÁJLOK 0805 NEWLINE CHARACTERS IN METADATA 0805 ÚJSOR KARAKTEREK A METAADATBAN 0806 NON-STANDARD DIALOG WIDGETS 0806 NEM SZABVÁNYOS PÁRBESZÉDABLAK ELEMEK 0807 New Area 0807 Új terület 0808 New File Name: 0808 Új fájlnév: 0809 New Location 0809 Új hely 0810 New Location: 0810 Új hely: 0811 New Name 0811 Új név 0812 New Session 0812 Új munkamenet 0813 New Type: 0813 Új típus: 0814 New Version 0814 Új verzió 0815 Newest 0815 Legújabb 0816 Newest Files 0816 Legújabb fájlok 0817 Next 0817 Következő 0818 Next gallery 0818 Következő galéria 0819 No 0819 Nem 0820 No curve lines found 0820 Nem található görbevonal 0821 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0821 Nem található képfájl-index.\nEgy képfájl-index létrehozásra kerül.\nA képfájljai nem módosulnak.\nEz jelentős időt vehet igénybe, ha \nsok ezer képfájlja van. 0822 No images found 0822 Nem található kép 0823 Noise Reduction 0823 Zajcsökkentés 0824 Noise Size 0824 Zaj mérete 0825 None 0825 Nincs 0826 Normal Blur 0826 Normál elmosás 0827 Normal Blur - mix pixels with all neighbor pixels 0827 Normál elmosás - pixelek keverése az összes szomszédos pixellel 0828 OPEN IMAGE FILE 0828 KÉPFÁJL MEGNYITÁSA 0829 OTHER TOPICS 0829 EGYÉB TÉMÁK 0830 OUTLINES 0830 KÖRVONALAK 0831 Old Name 0831 Régi név 0832 One Tag: 0832 Egy tag: 0833 Opacity 0833 Átlátszatlanság 0834 Open 0834 Megnyitás 0835 Open Image File 0835 Képfájl megnyitása 0836 Open a file and paste as selected area into an image 0836 Fájl megnyitása és beillesztése kijelölt területként a képbe 0837 Open a parallel Fotocx session 0837 Párhuzamos Fotocx munkamenet megnyitása 0838 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0838 Nyissa meg és szerkessze a beszkennelt színkártya fájlt. \nTávolítsa el a szkennelésből eredő ferdeséget vagy elforgatást. \n(Ehhez használja a Perspektíva javítása funkciót.) \nVágja le PONTOSAN a keskeny zöld margót. \nMentse (cserélje le) a színkártya fájlt. 0839 Open the trimmed color chart file 0839 A vágott színkártya fájl megnyitása 0840 Optimize 0840 Optimalizálás 0841 Other Tag ... 0841 Egyéb tag ... 0842 Outboard Programs 0842 Külső programok 0843 Outline Drawing 0843 Körvonalrajz 0844 Outlines 0844 Körvonalak 0845 Output Color 0845 Kimeneti szín 0846 Overlap 0846 Átfedés 0847 Overlay position in host image: 0847 Rátét pozíciója a gazdaképen belül: 0848 Overlay width, % host image width: 0848 Rátét szélessége, a gazdakép szélességének %-ában: 0849 Overwrite file? \n%s 0849 Felülírja a fájlt? \n%s 0850 PAINT EDITS 0850 FESTÉS SZERKESZTÉSE 0851 PAINT IMAGE 0851 KÉP FESTÉSE 0852 PAINT TRANSPARENCY 0852 ÁTLÁTSZÓSÁG FESTÉSE 0853 PAINTING 0853 FESTÉS 0854 PANORAMA 0854 PANORÁMA 0855 PATTERN 0855 MINTA 0856 PERSPECTIVE 0856 PERSPEKTÍVA 0857 PLACES/DATES 0857 HELYEK/DÁTUMOK 0858 PLUGINS 0858 BEÉPÜLŐK 0859 PREV/NEXT 0859 ELŐZŐ/KÖVETKEZŐ 0860 PRINT CALIBRATED 0860 KALIBRÁLT NYOMTATÁS 0861 PRINT IMAGE 0861 KÉP NYOMTATÁSA 0862 PRIVACY 0862 ADATVÉDELEM 0863 PROBLEM FILES 0863 PROBLÉMÁS FÁJLOK 0864 PROBLEM REPORTING 0864 HIBABEJELENTÉS 0865 Paint Edits 0865 Festés szerkesztése 0866 Paint Edits already active 0866 A Festés szerkesztése már aktív 0867 Paint Image 0867 Kép festése 0868 Paint Image Transparencies 0868 Kép átlátszóságának festése 0869 Paint Radius 0869 Ecsetsugár 0870 Paint Transparency 0870 Átlátszóság festése 0871 Paint and Warp Image 0871 Kép festése és torzítása 0872 Paint current edit function gradually using the mouse 0872 A jelenlegi szerkesztő funkció fokozatos festése az egérrel 0873 Paint entire image 0873 Teljes kép festése 0874 Paint image transparency using the mouse 0874 Kép átlátszóságának festése az egérrel 0875 Paint on Image 0875 Festés a képen 0876 Paint on image using the mouse 0876 Festés a képen az egérrel 0877 Paint transparency 0877 Átlátszóság festése 0878 Paint within mouse 0878 Festés az egéren belül 0879 Painting 0879 Festés 0880 Panorama 0880 Panoráma 0881 Paste 0881 Beillesztés 0882 Paste Image 0882 Kép beillesztése 0883 Paste previously copied area into image 0883 Korábban másolt terület beillesztése a képbe 0884 Pattern 0884 Minta 0885 Pattern File: 0885 Mintafájl: 0886 Pattern Width 0886 Minta szélessége 0887 Percent 0887 Százalék 0888 Permissions 0888 Jogosultságok 0889 Perspective 0889 Perspektíva 0890 Photo Date/Time 0890 Fotó dátuma/ideje 0891 Photo Date/Time (metadata) 0891 Fotó dátuma/ideje (metaadat) 0892 Photo Date: %s File Date: %s \n 0892 Fotó dátuma: %s Fájl dátuma: %s \n 0893 Pixel count 0893 Pixelek száma 0894 Pixel difference 0894 Pixelkülönbség 0895 Pixels 0895 Pixelek 0896 Places/Dates 0896 Helyek/dátumok 0897 Plugin working ... 0897 Beépülő fut ... 0898 Popup Image 0898 Előugró kép 0899 Power 0899 Erő 0900 Power Center 0900 Erő középpontja 0901 Power: Center 0901 Erő: középpont 0902 Pre-align Images 0902 Képek előzetes igazítása 0903 Preference: 0903 Beállítás: 0904 Press F1 for help 0904 Nyomja meg az F1-et a súgóhoz 0905 Prev 0905 Előző 0906 Prev/Next 0906 Előző/következő 0907 Previous 0907 Előző 0908 Previous gallery 0908 Előző galéria 0909 Print Calibrated 0909 Kalibrált nyomtatás 0910 Print Image 0910 Kép nyomtatása 0911 Print chart in vertical orientation without margins. 0911 Táblázat nyomtatása függőleges tájolásban, margók nélkül. 0912 Print current image file with calibrated colors 0912 Jelenlegi képfájl nyomtatása kalibrált színekkel 0913 Print the current image file 0913 A jelenlegi képfájl nyomtatása 0914 Privacy 0914 Adatvédelem 0915 Proceed 0915 Folytatás 0916 Proceed? 0916 Folytatja? 0917 Process album files matching selected files: 0917 A kijelölt fájlokkal egyező albumfájlok feldolgozása: 0918 Process an image using a custom convolution kernel 0918 Kép feldolgozása egyéni konvolúciós kernellel 0919 Process selected album files: 0919 Kijelölt albumfájlok feldolgozása: 0920 Processing files 0920 Fájlok feldolgozása 0921 Project name 0921 Projekt neve 0922 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0922 Húzza a kép pozícióját az egérrel. \nHúzza többször, amíg meg nem elégedett. \nHa kész, nyomja meg az [OK] gombot. 0923 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0923 Húzza a kép egyik sarkát az egérrel. \nHúzza többször, amíg meg nem elégedett. \nHa kész, nyomja meg az [OK] gombot. 0924 Pull on the image with the mouse. 0924 Húzza a képet az egérrel. 0925 Purge unwanted keywords from all image files 0925 Nem kívánt kulcsszavak törlése az összes képfájlból 0926 QUESTIONS, SUGGESTIONS 0926 KÉRDÉSEK, JAVASLATOK 0927 Quit 0927 Kilépés 0928 Quit Fotocx 0928 Kilépés a Fotocx-ből 0929 Quit Fotocx? 0929 Kilépés a Fotocx-ből? 0930 RAW Files 0930 RAW fájlok 0931 RAW Options 0931 RAW beállítások 0932 RAW conversion failed: %s %s 0932 A RAW átalakítás sikertelen: %s %s 0933 RAW loader 0933 RAW betöltő 0934 RECENT FILES 0934 LEGUTÓBBI FÁJLOK 0935 RECENT FOLDERS 0935 LEGUTÓBBI MAPPÁK 0936 RED EYES 0936 VÖRÖSSZEM 0937 REFINE MENU 0937 FINOMHANGOLÁS MENÜ 0938 REMOVE DUST 0938 POR ELTÁVOLÍTÁSA 0939 REMOVE HALO 0939 GLÓRIA ELTÁVOLÍTÁSA 0940 RENAME 0940 ÁTNEVEZÉS 0941 RENAME ALBUM 0941 ALBUM ÁTNEVEZÉSE 0942 REPAIR MENU 0942 JAVÍTÁS MENÜ 0943 RESCALE 0943 ÁTMÉRETEZÉS 0944 RETOUCH 0944 RETUSÁLÁS 0945 RGB -> BRG 0945 RGB -> BRG 0946 RGB -> GBR 0946 RGB -> GBR 0947 RGB HISTOGRAM 0947 RGB HISZTOGRAM 0948 RGB Histogram 0948 RGB hisztogram 0949 RGB brightness histogram graph 0949 RGB fényerő-hisztogram grafikon 0950 RGB color 0950 RGB szín 0951 RGB mix with given bit-depth 0951 RGB keverés adott bitmélységgel 0952 ROTATE 0952 FORGATÁS 0953 RUN SCRIPT 0953 SZKRIPT FUTTATÁSA 0954 Radial Blur 0954 Sugárirányú elmosás 0955 Radial Blur - mix pixels in radial lines from chosen center 0955 Sugárirányú elmosás - pixelek keverése sugárirányú vonalakban a választott középpontból 0956 Radius 0956 Sugár 0957 Random Image 0957 Véletlenszerű kép 0958 Range 0958 Tartomány 0959 Rating: %s Size: %s %.2fmb \n 0959 Értékelés: %s Méret: %s %.2fmb \n 0960 Read or search the user guide 0960 Felhasználói kézikönyv olvasása vagy keresése 0961 Recent Files 0961 Legutóbbi fájlok 0962 Recent Folders 0962 Legutóbbi mappák 0963 Recent Keywords 0963 Legutóbbi kulcsszavak 0964 Rectify closeup face photo (balloon face) 0964 Közeli arcfotó javítása (léggömbarc-hatás) 0965 Red 0965 Vörös 0966 Red Eye Reduction 0966 Vörösszem-csökkentés 0967 Red Eyes 0967 Vörösszem 0968 Red Factors 0968 Vörös tényezők 0969 Redo 0969 Ismétlés 0970 Reduce Fog/Haze 0970 Köd/pára csökkentése 0971 Reduce fog/haze in an image or selected areas 0971 Köd/pára csökkentése a képen vagy a kijelölt területeken 0972 Refine 0972 Finomhangolás 0973 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0973 Finomhangolás: hisztogram lapítása, helyi kontraszt, kontraszt erősítése, retinex, telítettség 0974 Remove 0974 Eltávolítás 0975 Remove Dust 0975 Por eltávolítása 0976 Remove Halo 0976 Glória eltávolítása 0977 Remove dust spots from old scanned photos 0977 Porszemek eltávolítása régi beszkennelt fotókról 0978 Remove from Album 0978 Eltávolítás az albumból 0979 Remove halos left by some edit functions 0979 Egyes szerkesztő funkciók által hagyott glóriák eltávolítása 0980 Remove image curvature, especially in panoramas 0980 Kép görbültségének eltávolítása, különösen panorámáknál 0981 Remove jaggies on hard image feature edges 0981 Recézettség eltávolítása éles képélekről 0982 Remove selected image metadata 0982 Kijelölt kép metaadatának eltávolítása 0983 Remove unwanted objects in an image 0983 Nem kívánt objektumok eltávolítása a képről 0984 Rename 0984 Átnevezés 0985 Rename Album 0985 Album átnevezése 0986 Rename Image File 0986 Képfájl átnevezése 0987 Rename an existing album 0987 Meglévő album átnevezése 0988 Rename or delete keywords for all image files 0988 Kulcsszavak átnevezése vagy törlése az összes képfájlnál 0989 Rename to 0989 Átnevezés erre 0990 Rename/convert/rescale/move selected image or RAW files 0990 Kijelölt kép- vagy RAW fájlok átnevezése/átalakítása/átméretezése/áthelyezése 0991 Repair 0991 Javítás 0992 Repair malformed metadata preventing metadata edits 0992 Hibás formátumú metaadat javítása, amely megakadályozza a metaadat szerkesztését 0993 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 0993 Javítás: élesítés, elmosás, zajcsökkentés, ködmentesítés, vörösszem, intelligens törlés, színbeállítás 0994 Replace 0994 Csere 0995 Replace Text 0995 Szöveg cseréje 0996 Replace all versions with newest version 0996 Az összes verzió cseréje a legújabb verzióra 0997 Replace all versions with selected versions 0997 Az összes verzió cseréje a kijelölt verziókra 0998 Replace all with newest version only 0998 Csere csak a legújabb verzióra 0999 Replace all with original + newest version 0999 Csere az eredetire + legújabb verzióra 1000 Replace all with original + selected versions 1000 Csere az eredetire + kijelölt verziókra 1001 Replace all with original and all versions 1001 Csere az eredetire és az összes verzióra 1002 Replace all with selected versions 1002 Csere a kijelölt verziókra 1003 Replace host files 1003 Gazdafájlok cseréje 1004 Report Image Places/Dates 1004 Kép helyeinek/dátumainak jelentése 1005 Report selected metadata for selected image files 1005 Kijelölt metaadat jelentése a kijelölt képfájlokhoz 1006 Rescale 1006 Átméretezés 1007 Rescale Image 1007 Kép átméretezése 1008 Rescale RGB levels to reduce color caste and fog/haze 1008 RGB szintek átméretezése a színtorzulás és a köd/pára csökkentésére 1009 Rescale brightness levels to increase local contrast 1009 Fényerőszintek átméretezése a helyi kontraszt növelésére 1010 Rescale: 1010 Átméretezés: 1011 Reserved Shortcuts \n 1011 Fenntartott gyorsbillentyűk \n 1012 Reserved shortcut ignored: %s 1012 Fenntartott gyorsbillentyű figyelmen kívül hagyva: %s 1013 Reset 1013 Visszaállítás 1014 Reset all galleries to file name ascending 1014 Az összes galéria visszaállítása fájlnév szerinti növekvő rendezésre 1015 Resolution 1015 Felbontás 1016 Resources 1016 Erőforrások 1017 Resume 1017 Folytatás 1018 Retouch 1018 Retusálás 1019 Reverse R 1019 R fordítása 1020 Richardson-Lucy 1020 Richardson-Lucy 1021 Right 1021 Jobbra 1022 Rim % 1022 Perem % 1023 Rotate 1023 Forgatás 1024 Rotate Image 1024 Kép forgatása 1025 Rotate or level an image 1025 Kép forgatása vagy szintezése 1026 Rotate: 1026 Forgatás: 1027 Roy Lichtenstein effect 1027 Roy Lichtenstein effekt 1028 SATURATION 1028 TELÍTETTSÉG 1029 SCRIPT FILES 1029 SZKRIPTFÁJLOK 1030 SEARCH IMAGES 1030 KÉPEK KERESÉSE 1031 SELECT AREA 1031 TERÜLET KIJELÖLÉSE 1032 SELECT FILES 1032 FÁJLOK KIJELÖLÉSE 1033 SELECT IMAGE FILES 1033 KÉPFÁJLOK KIJELÖLÉSE 1034 SELECT MENU 1034 KIJELÖLÉS MENÜ 1035 SET COLORS 1035 SZÍNEK BEÁLLÍTÁSA 1036 SET WALLPAPER 1036 HÁTTÉRKÉP BEÁLLÍTÁSA 1037 SETTINGS 1037 BEÁLLÍTÁSOK 1038 SHARPEN 1038 ÉLESÍTÉS 1039 SHIFT COLORS 1039 SZÍNEK ELTOLÁSA 1040 SHORTCUTS 1040 GYORSBILLENTYŰK 1041 SHOW CIM FILES 1041 CIM FÁJLOK MEGJELENÍTÉSE 1042 SHOW DIFFS 1042 ELTÉRÉSEK MEGJELENÍTÉSE 1043 SHOW ON MAP 1043 MEGJELENÍTÉS TÉRKÉPEN 1044 SHOW RESOURCES 1044 ERŐFORRÁSOK MEGJELENÍTÉSE 1045 SHOW RGB 1045 RGB MEGJELENÍTÉSE 1046 SHOW/HIDE AREA 1046 TERÜLET MEGJELENÍTÉSE/ELREJTÉSE 1047 SKETCH1 1047 VÁZLAT1 1048 SKETCH2 1048 VÁZLAT2 1049 SLIDE SHOW 1049 DIAVETÍTÉS 1050 SLIDES AND NEGATIVES 1050 DIÁK ÉS NEGATÍVOK 1051 SLIDESHOW END 1051 DIAVETÍTÉS VÉGE 1052 SMART ERASE 1052 INTELLIGENS TÖRLÉS 1053 SOFT FOCUS 1053 LÁGY FÓKUSZ 1054 SPHERE 1054 GÖMB 1055 SPLIT-SCREEN 1055 OSZTOTT KÉPERNYŐ 1056 STACK/LAYERS 1056 STACK/RÉTEGEK 1057 STACK/NOISE 1057 STACK/ZAJ 1058 STACK/PAINT 1058 STACK/FESTÉS 1059 Saturation 1059 Telítettség 1060 Save 1060 Mentés 1061 Save Gallery as Album 1061 Galéria mentése albumként 1062 Save Image File 1062 Képfájl mentése 1063 Save as new file name or type 1063 Mentés új fájlnévvel vagy típussal 1064 Save current gallery as album 1064 Jelenlegi galéria mentése albumként 1065 Save modified image as new file or new file version 1065 Módosított kép mentése új fájlként vagy új fájlverzióként 1066 Save selected area to a file with transparency 1066 Kijelölt terület mentése fájlba átlátszósággal 1067 Saved Areas 1067 Mentett területek 1068 Scale 1068 Méretezés 1069 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1069 Szkennelje be a nyomtatott színkártyát, a legsötétebb sorral felül. \nMentse .png fájlként a nyomtató és papír nevének használatával \n(pl. %s/Epson_glossy.png). \n 1070 Search 1070 Keresés 1071 Search Images 1071 Képek keresése 1072 Search Results 1072 Keresési eredmények 1073 Search all image files and report duplicates 1073 Az összes képfájl átvizsgálása és a duplikátumok jelentése 1074 Searching - use ESC key to terminate 1074 Keresés folyamatban - az ESC billentyűvel megszakítható 1075 Seconds 1075 Másodperc 1076 Select 1076 Kijelölés 1077 Select %d to %d files 1077 %d - %d fájl kijelölése 1078 Select Album 1078 Album kijelölése 1079 Select Albums 1079 Albumok kijelölése 1080 Select Area 1080 Terület kijelölése 1081 Select Area for Edits 1081 Terület kijelölése szerkesztéshez 1082 Select Area not supported \nby this edit function 1082 A terület kijelölése nem támogatott \nezzel a szerkesztő funkcióval 1083 Select Files 1083 Fájlok kijelölése 1084 Select Image 1084 Kép kijelölése 1085 Select Image Files 1085 Képfájlok kijelölése 1086 Select Metadata tags 1086 Metaadat tagek kijelölése 1087 Select Script 1087 Szkript kijelölése 1088 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1088 Jelöljön ki egy területet a torzításhoz a terület kijelölése funkcióval. \nNyomja meg a [torzítás indítása] gombot, és húzza a területet az egérrel. \nHúzza többször, amíg meg nem elégedett. \nHa kész, jelöljön ki egy másik területet, vagy nyomja meg az [OK] gombot. 1089 Select and Paint Image 1089 Kép kijelölése és festése 1090 Select and view an image file 1090 Képfájl kijelölése és megtekintése 1091 Select area cannot be kept.\nContinue? 1091 A kijelölt terület nem tartható meg.\nFolytatja? 1092 Select area disabled, Continue? 1092 A terület kijelölése letiltva, folytatja? 1093 Select area not finished, Continue? 1093 A terület kijelölése nincs befejezve, folytatja? 1094 Select area will be ignored. \nContinue? 1094 A kijelölt terület figyelmen kívül lesz hagyva. \nFolytatja? 1095 Select folder 1095 Mappa kijelölése 1096 Select host image files 1096 Gazdaképfájlok kijelölése 1097 Select image areas to edit separately, copy/paste selections 1097 Képterületek kijelölése külön szerkesztéshez, kijelölések másolása/beillesztése 1098 Select image objects or areas for separate editing 1098 Kép objektumok vagy területek kijelölése külön szerkesztéshez 1099 Select input files for subsequent function 1099 Bemeneti fájlok kijelölése a következő funkcióhoz 1100 Select overlay file 1100 Rátétfájl kijelölése 1101 Select startup album 1101 Indítási album kijelölése 1102 Select startup folder 1102 Indítási mappa kijelölése 1103 Select startup image file 1103 Indítási képfájl kijelölése 1104 Select the image file to print. 1104 Válassza ki a nyomtatandó képfájlt. 1105 Select to add, click on X to delete. 1105 Válassza ki a hozzáadáshoz, kattintson az X-re a törléshez. 1106 Select two files 1106 Válasszon két fájlt 1107 Select versions, ratings, keywords, filename text 1107 Verziók, értékelések, kulcsszavak, fájlnévszöveg kijelölése 1108 Separation Horz 1108 Vízsz. elválasztás 1109 Sequence Numbers 1109 Sorszámok 1110 Set Colors 1110 Színek beállítása 1111 Set No. of Colors 1111 Színek számának beállítása 1112 Set Ratio: 1112 Arány beállítása: 1113 Set Wallpaper 1113 Háttérkép beállítása 1114 Set Width: 1114 Szélesség beállítása: 1115 Set and view bookmarks, select for gallery view 1115 Könyvjelzők beállítása és megtekintése, kijelölés galérianézethez 1116 Set black-white/color, negative/positive, sepia 1116 Fekete-fehér/színes, negatív/pozitív, szépia beállítása 1117 Set foreground line color (crop, grid, select, warp) 1117 Előtér vonalszínének beállítása (vágás, rács, kijelölés, torzítás) 1118 Set gallery from latest search results 1118 Galéria beállítása a legutóbbi keresési eredményekből 1119 Set gallery from recent folders list 1119 Galéria beállítása a legutóbbi mappák listájából 1120 Set gallery to folder of current file 1120 Galéria beállítása a jelenlegi fájl mappájára 1121 Set horizontal/vertical grid line counts 1121 Vízszintes/függőleges rácsvonalak számának beállítása 1122 Set image file as desktop wallpaper 1122 Képfájl beállítása asztali háttérképként 1123 Set line properties, [Add] to layout, edit. 1123 Vonal tulajdonságainak beállítása, [Hozzáadás] az elrendezéshez, szerkesztés. 1124 Set number of colors for each R/G/B or total 1124 Színek számának beállítása R/G/B csatornánként vagy összesen 1125 Set or shift photo date/time for selected image files 1125 Fotó dátumának/idejének beállítása vagy eltolása a kijelölt képfájlokhoz 1126 Set the name for the output calibration file \n[your calibration name].dat 1126 Adja meg a kimeneti kalibrációs fájl nevét \n[az ön kalibrációs neve].dat 1127 Settings 1127 Beállítások 1128 Sharpen 1128 Élesítés 1129 Sharpen the image (various methods) 1129 Kép élesítése (különböző módszerekkel) 1130 Shift + drag mouse across image \nto indicate blur direction 1130 Shift + húzza az egeret a képen keresztül \naz elmosás irányának megadásához 1131 Shift Colors 1131 Színek eltolása 1132 Shift/convert image colors into other colors 1132 Kép színeinek eltolása/átalakítása más színekre 1133 Short List 1133 Rövid lista 1134 Show 1134 Megjelenítés 1135 Show (outline) selected areas 1135 Kijelölt területek megjelenítése (körvonal) 1136 Show CIM Files 1136 CIM fájlok megjelenítése 1137 Show Diffs 1137 Eltérések megjelenítése 1138 Show Fotocx installed version and author contact 1138 A telepített Fotocx verzió és a szerző elérhetőségének megjelenítése 1139 Show Fotocx updates for recent releases 1139 Fotocx frissítések megjelenítése a legutóbbi kiadásokhoz 1140 Show Hidden 1140 Rejtett elemek megjelenítése 1141 Show Log File 1141 Naplófájl megjelenítése 1142 Show RGB 1142 RGB megjelenítése 1143 Show RGB levels at mouse position 1143 RGB szintek megjelenítése az egér pozíciójánál 1144 Show Resources 1144 Erőforrások megjelenítése 1145 Show folder hierarchy, click folder for gallery view 1145 Mappahierarchia megjelenítése, kattintson egy mappára a galérianézethez 1146 Show image counts in year/month table, select, report 1146 Képszámok megjelenítése év/hónap táblázatban, kijelölés, jelentés 1147 Show image description (overlap) 1147 Kép leírásának megjelenítése (átfedés) 1148 Show image differences on the image 1148 Kép különbségeinek megjelenítése a képen 1149 Show image file name (overlap) 1149 Képfájl nevének megjelenítése (átfedés) 1150 Show image title (overlap) 1150 Kép címének megjelenítése (átfedés) 1151 Show input files used in combine function 1151 Az egyesítő funkcióban használt bemeneti fájlok megjelenítése 1152 Show key metadata for current image or clicked thumbnail 1152 A jelenlegi kép vagy a kattintott thumbnail fő metaadatainak megjelenítése 1153 Show map position of the current image file 1153 A jelenlegi képfájl térképi pozíciójának megjelenítése 1154 Show memory and CPU resources used 1154 A használt memória- és CPU-erőforrások megjelenítése 1155 Show on Map 1155 Megjelenítés térképen 1156 Show or make Keyboard Shortcuts 1156 Gyorsbillentyűk megjelenítése vagy létrehozása 1157 Show the current (last used) album 1157 A jelenlegi (legutóbb használt) album megjelenítése 1158 Show the current log file 1158 A jelenlegi naplófájl megjelenítése 1159 Size 1159 Méret 1160 Sketch1 1160 Vázlat1 1161 Sketch2 1161 Vázlat2 1162 Slide Show 1162 Diavetítés 1163 Smart Erase 1163 Intelligens törlés 1164 Soft Focus 1164 Lágy fókusz 1165 Sphere 1165 Gömb 1166 Spherical Projection 1166 Gömbi vetület 1167 Split-Screen 1167 Osztott képernyő 1168 Stack/Layers 1168 Stack/Rétegek 1169 Stack/Noise 1169 Stack/Zaj 1170 Stack/Paint 1170 Stack/Festés 1171 Stacking Order 1171 Rétegsorrend 1172 Start 1172 Indítás 1173 Start a slide show 1173 Diavetítés indítása 1174 Start of gallery 1174 A galéria eleje 1175 Startup View 1175 Indítási nézet 1176 Stop 1176 Leállítás 1177 Stretch 1177 Nyújtás 1178 Stretch: 1178 Nyújtás: 1179 Suppress JPEG compression artifacts 1179 JPEG tömörítési artefaktok elnyomása 1180 Suppress Ringing 1180 Gyűrűzés elnyomása 1181 Suppress fine details while retaining sharpness 1181 Finom részletek elnyomása az élesség megtartása mellett 1182 Suppress noise from low-light photos 1182 Zaj elnyomása gyenge fényviszonyok között készült fotókon 1183 Survey all files 1183 Az összes fájl felmérése 1184 TEXTURE 1184 TEXTÚRA 1185 THUMB VIEW 1185 THUMBNAIL NÉZET 1186 TILES1 1186 CSEMPÉK1 1187 TILES2 1187 CSEMPÉK2 1188 TIMELINE 1188 IDŐVONAL 1189 TINY PLANET 1189 TINY PLANET 1190 TOOLS MENU 1190 ESZKÖZÖK MENÜ 1191 TRANSLATIONS 1191 FORDÍTÁSOK 1192 TWIST 1192 CSAVARÁS 1193 Temperature 1193 Hőmérséklet 1194 Text 1194 Szöveg 1195 Text File: 1195 Szövegfájl: 1196 Texture 1196 Textúra 1197 Threshold 1197 Küszöbérték 1198 Threshold: Low 1198 Küszöbérték: Alacsony 1199 Thumbnail View 1199 Thumbnail nézet 1200 Thumbnail size 1200 Thumbnail mérete 1201 Thumbnails folder 1201 Thumbnails mappa 1202 Thumbnails folder: %s \nPlease remove. 1202 Thumbnails mappa: %s \nKérjük, távolítsa el. 1203 Thumbnails folder: \n %s \nmust be named .../thumbnails 1203 A thumbnails mappa: \n %s \nnevének .../thumbnails-nak kell lennie 1204 Thumbnails: 1204 Thumbnailek: 1205 Tile 1205 Csempe 1206 Tile blending 1206 Csempék keverése 1207 Tile image with a repeating pattern 1207 Kép csempézése ismétlődő mintával 1208 Tiles 1208 Csempék 1209 Tiles1 1209 Csempék1 1210 Tiles2 1210 Csempék2 1211 Timeline 1211 Idővonal 1212 Tiny Planet 1212 Tiny Planet 1213 Title: %s\n 1213 Cím: %s\n 1214 To Location 1214 Célhely 1215 Toggle Captions 1215 Feliratok be/ki 1216 Toggle Grid 1216 Rács be/ki 1217 Toggle grid lines on and off 1217 Rácsvonalak be- és kikapcsolása 1218 Toggle image metadata display ON/OFF 1218 Kép metaadat megjelenítésének be/ki kapcsolása 1219 Too little overlap, cannot align 1219 Túl kicsi az átfedés, nem lehet igazítani 1220 Too many edits, please save image 1220 Túl sok szerkesztés, kérjük mentse a képet 1221 Tools 1221 Eszközök 1222 Tools: image index, settings, shortcuts, grid, find duplicates 1222 Eszközök: képindex, beállítások, gyorsbillentyűk, rács, duplikátumok keresése 1223 Top 1223 Felül 1224 Total Colors 1224 Színek összesen 1225 Trace 1225 Vonalkövetés 1226 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1226 Kövesse a felső és alsó görbéket \negérkattintásokkal, majd [lapítás]. 1227 Transient Objects 1227 Átmeneti objektumok 1228 Transition Preferences 1228 Átmenet beállításai 1229 Transition to next image 1229 Átmenet a következő képre 1230 Transitions File 1230 Átmenetek fájl 1231 Transp. 1231 Átlátsz. 1232 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1232 Az átlátszósági térkép elveszik \n(mentse TIFF|PNG|JXL formátumban a megtartáshoz) \nMégis menti? 1233 Trash 1233 Kuka 1234 Trash read-only file? 1234 Kukába helyezi a csak olvasható fájlt? 1235 Turn an image inside-out 1235 Kép kifordítása 1236 Twist 1236 Csavarás 1237 Twist image centered at mouse position 1237 Kép csavarása az egér pozíciója körül 1238 UNBEND 1238 KIEGYENESÍTÉS 1239 UNDO/REDO BUTTON 1239 VISSZAVONÁS/ISMÉTLÉS GOMB 1240 UNWARP CLOSEUP 1240 KÖZELI KÉP KITORZÍTÁSA 1241 UPDATE ALBUMS 1241 ALBUMOK FRISSÍTÉSE 1242 UPRIGHT 1242 EGYENESBE ÁLLÍTÁS 1243 USER GUIDE 1243 FELHASZNÁLÓI KÉZIKÖNYV 1244 Unable to copy metadata 1244 A metaadat másolása sikertelen 1245 Unbend 1245 Kiegyenesítés 1246 Undo 1246 Visszavonás 1247 Undo All 1247 Összes visszavonása 1248 Undo Last 1248 Utolsó visszavonása 1249 Undo/Redo 1249 Visszavonás/Ismétlés 1250 Uninstall 1250 Eltávolítás 1251 Unwarp Closeup 1251 Közeli kép kitorzítása 1252 Update Albums 1252 Albumok frissítése 1253 Update albums for new file versions 1253 Albumok frissítése az új fájlverziókhoz 1254 Upright 1254 Egyenesbe állítás 1255 Upright Image 1255 Kép egyenesbe állítása 1256 Upright or mirror-flip an image 1256 Kép egyenesbe állítása vagy tükrözése 1257 Upright rotated image files, selected set or ALL 1257 Elforgatott képfájlok egyenesbe állítása, kijelölt csoport vagy MIND 1258 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1258 Használja a Terület kijelölése funkciót egy arc kijelöléséhez. \nKattintson a torzítás középpontjára. \nMozgassa a csúszkát. \n 1259 Use [Select] to add files to an empty album 1259 Használja a [Kijelölés] gombot fájlok hozzáadásához egy üres albumhoz 1260 Use metadata photo date or file modification date? 1260 A metaadat fotódátumot vagy a fájl módosítási dátumát használja? 1261 Use metadata tag 1261 Metaadat tag használata 1262 Use settings file 1262 Beállításfájl használata 1263 User Guide 1263 Felhasználói kézikönyv 1264 User preferences and settings 1264 Felhasználói beállítások és preferenciák 1265 VIDEO press P to play 1265 VIDEO nyomja meg a P-t a lejátszáshoz 1266 VIEW 360° PANO 1266 360°-OS PANORÁMA MEGTEKINTÉSE 1267 VIEW ALL META 1267 ÖSSZES METAADAT MEGTEKINTÉSE 1268 VIEW MAIN META 1268 FŐ METAADAT MEGTEKINTÉSE 1269 VIGNETTE 1269 VINYETTÁLÁS 1270 Var. Transparency 1270 Változó átlátszóság 1271 Vert 1271 Függ. 1272 Video Files 1272 Videófájlok 1273 Video Tutorial 1273 Videó bemutató 1274 Video command 1274 Videó parancs 1275 View 360 degree panorama image 1275 360 fokos panorámakép megtekintése 1276 View 360° Pano 1276 360°-os panoráma megtekintése 1277 View All Meta 1277 Összes metaadat megtekintése 1278 View All Metadata 1278 Összes metaadat megtekintése 1279 View Main Meta 1279 Fő metaadat megtekintése 1280 View Main Metadata 1280 Fő metaadat megtekintése 1281 View before/after images using split-screen 1281 Előtte/utána képek megtekintése osztott képernyővel 1282 View/edit metadata, image report and search functions 1282 Metaadat megtekintése/szerkesztése, kép jelentés és keresési funkciók 1283 Vignette 1283 Vinyettálás 1284 W/H Ratio: 1284 Szél./Mag. arány: 1285 WARP AFFINE 1285 AFFIN TORZÍTÁS 1286 WARP AREA 1286 TERÜLET TORZÍTÁSA 1287 WARP CURVED 1287 GÖRBE TORZÍTÁS 1288 WARP IMAGE 1288 KÉP TORZÍTÁSA 1289 WARP MENU 1289 TORZÍTÁS MENÜ 1290 WARP RADIAL 1290 SUGÁRIRÁNYÚ TORZÍTÁS 1291 WINDOW VIEWS AND MENUS 1291 ABLAKNÉZETEK ÉS MENÜK 1292 WORLD MAP 1292 VILÁGTÉRKÉP 1293 Wait after zoom 1293 Várakozás nagyítás után 1294 Wait before filename/title/description 1294 Várakozás fájlnév/cím/leírás előtt 1295 Wait before zoom 1295 Várakozás nagyítás előtt 1296 Warp 1296 ZOOM 1297 Warp Affine 1297 Affin torzítás 1298 Warp Area 1298 Terület torzítása 1299 Warp Curved 1299 Görbe torzítás 1300 Warp Image 1300 Kép torzítása 1301 Warp Linear1 1301 Lineáris torzítás 1 1302 Warp Linear2 1302 Lineáris torzítás 2 1303 Warp Radial 1303 Sugárirányú torzítás 1304 Warp an image with a wave pattern 1304 Kép torzítása hullámmintával 1305 Warp image (affine) using the mouse 1305 Kép torzítása (affin) az egérrel 1306 Warp image (curved) using the mouse 1306 Kép torzítása (görbe) az egérrel 1307 Warp image (linear 1) using the mouse 1307 Kép torzítása (lineáris 1) az egérrel 1308 Warp image (linear 2) using the mouse 1308 Kép torzítása (lineáris 2) az egérrel 1309 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1309 Torzítás: kiegyenesítés, perspektíva javítása, torzítás, közeli kép kitorzítása, lapítás, kép transzformációk 1310 White 1310 Fehér 1311 Widen: 1311 Szélesítés: 1312 Width 1312 Szélesség 1313 Width % 1313 Szélesség % 1314 X-size 1314 X-méret 1315 Yes 1315 Igen 1316 ZOOM 1316 ZOOM 1317 Zoom 1317 Zoom 1318 Zoom Center 1318 Zoom középpontja 1319 Zoom Speed 1319 Zoom sebessége 1320 Zoom-in 1320 Zoom-in 1321 Zoom-out 1321 Zoom-out 1322 \n %d-bits/color 1322 \n %d bit/szín 1323 \n *** CANCELED \n 1323 \n *** MEGSZAKÍTVA \n 1324 \n *** COMPLETED \n 1324 \n *** BEFEJEZVE \n 1325 \n *** Delete Originals *** 1325 \n *** Eredetik törlése *** 1326 \n *** Keep Originals *** 1326 \n *** Eredetik megtartása *** 1327 \n *** Replace Originals *** 1327 \n *** Eredetik cseréje *** 1328 \n Convert to %s 1328 \n Átalakítás erre: %s 1329 \n Copy Metadata 1329 \n Metaadat másolása 1330 \n Downsize within %dx%d 1330 \n Kicsinyítés %dx%d méretre 1331 \n New Location: %s 1331 \n Új hely: %s 1332 \n Output to %s 1332 \n Kimenet ide: %s 1333 \n PROCEED? 1333 \n FOLYTATJA? 1334 \n Rename to %s 1334 \n Átnevezés erre: %s 1335 \n Replace text: %s --> %s 1335 \n Szöveg cseréje: %s --> %s 1336 \n Rescale to %sx 1336 \n Átméretezés %sx méretre 1337 \n Update Albums 1337 \n Albumok frissítése 1338 \n Upsize within %dx%d 1338 \n Nagyítás %dx%d méretre 1339 \n*** CANCELED \n 1339 \n*** MEGSZAKÍTVA \n 1340 \n*** COMPLETED \n 1340 \n*** BEFEJEZVE \n 1341 \n\nPROCEED? 1341 \n\nFOLYTATJA? 1342 add 1342 hozzáadás 1343 add after old 1343 hozzáadás a régi után 1344 add all gallery files to list 1344 az összes galériafájl hozzáadása a listához 1345 add current file to list 1345 a jelenlegi fájl hozzáadása a listához 1346 add entered text to layout 1346 a megadott szöveg hozzáadása az elrendezéshez 1347 add images to layout 1347 képek hozzáadása az elrendezéshez 1348 add line/arrow to layout 1348 vonal/nyíl hozzáadása az elrendezéshez 1349 add new keyword 1349 új kulcsszó hozzáadása 1350 add or edit images 1350 képek hozzáadása vagy szerkesztése 1351 add or edit lines/arrows 1351 vonalak/nyilak hozzáadása vagy szerkesztése 1352 add or edit text 1352 szöveg hozzáadása vagy szerkesztése 1353 add to set 1353 hozzáadás a készlethez 1354 adder 1354 összeadó 1355 adjust brightness of selected image 1355 a kijelölt kép fényerejének beállítása 1356 after removal of missing files: %d \n 1356 a hiányzó fájlok eltávolítása után: %d \n 1357 album %s: deleted 1357 %s album: törölve 1358 album already exists: %s 1358 az album már létezik: %s 1359 album mass update 1359 album tömeges frissítés 1360 albums folder missing 1360 az albumok mappa hiányzik 1361 align and trim color chart 1361 színkártya igazítása és vágása 1362 all files 1362 minden fájl 1363 all image files, including unmounted folders: %d \n 1363 minden képfájl, a nem csatolt mappákat is beleértve: %d \n 1364 all images 1364 minden kép 1365 all versions 1365 összes verzió 1366 amplify contrast 1366 kontraszt erősítése 1367 amplitude 1367 amplitúdó 1368 angle 1368 szög 1369 apply 1369 alkalmaz 1370 area edge creep 1370 terület szélének csúszása 1371 area is not finished 1371 a terület nincs befejezve 1372 area outline color: 1372 terület körvonalának színe: 1373 array width is too large: %d x %d 1373 a tömb szélessége túl nagy: %d x %d 1374 ascending 1374 növekvő 1375 auto color 1375 automatikus szín 1376 background colors for file and gallery view windows 1376 háttérszínek a fájl- és galérianézet ablakokhoz 1377 backing 1377 alátét 1378 bad category name 1378 hibás kategórianév 1379 bad keyword name 1379 hibás kulcsszónév 1380 bad pattern file: %s 1380 hibás mintafájl: %s 1381 base 1381 alap 1382 base and adder need $s plugin 1382 az alaphoz és az összeadóhoz $s beépülő szükséges 1383 base size 1383 alapméret 1384 begin making a script file 1384 szkriptfájl készítésének megkezdése 1385 black/white 1385 fekete-fehér 1386 black/white negative 1386 fekete-fehér negatív 1387 black/white positive 1387 fekete-fehér pozitív 1388 blend 1388 keverés 1389 blend edges: blend width: 1389 élek keverése: keverési szélesség: 1390 blend image overlaps over pixel width 1390 kép átfedések keverése pixelszélesség felett 1391 blend rate: center: 1391 keverési arány: középpont: 1392 blocking function: %s 1392 blokkoló funkció: %s 1393 blocksize 1393 blokkméret 1394 blur edges: blur width: 1394 élek elmosása: elmosási szélesség: 1395 blur radius 1395 elmosás sugara 1396 borders 1396 szegélyek 1397 both 'All Files' and specific files were selected 1397 mind az „Összes fájl”, mind konkrét fájlok ki lettek jelölve 1398 bright halo 1398 fényes glória 1399 brightness rescale 1399 fényerő átméretezése 1400 browse 1400 tallózás 1401 brush size 1401 ecsetméret 1402 build index, old files only 1402 index készítése, csak régi fájlok 1403 cancel project 1403 projekt megszakítása 1404 cancel project? 1404 megszakítja a projektet? 1405 cannot allocate %d MB memory 1405 nem sikerült lefoglalni %d MB memóriát 1406 cannot be determined 1406 nem határozható meg 1407 cannot copy a file to itself 1407 egy fájl nem másolható önmagára 1408 cannot copy current file 1408 a jelenlegi fájl nem másolható 1409 cannot create output file 1409 nem sikerült létrehozni a kimeneti fájlt 1410 cannot create pixbuf 1410 nem sikerült pixbufot létrehozni 1411 cannot find area outline 1411 nem található a terület körvonala 1412 cannot find output file 1412 nem található a kimeneti fájl 1413 cannot load input file 1413 nem sikerült betölteni a bemeneti fájlt 1414 cannot open file %s 1414 nem sikerült megnyitni a fájlt: %s 1415 cannot parse current file 1415 nem sikerült feldolgozni a jelenlegi fájlt 1416 cannot parse file 1416 nem sikerült feldolgozni a fájlt 1417 cannot read pluging output file 1417 nem sikerült olvasni a beépülő kimeneti fájlját 1418 cannot replace %s file 1418 nem sikerült cserélni a(z) %s fájlt 1419 cannot save as RAW type 1419 nem menthető RAW típusként 1420 cannot save layout file: %s 1420 nem sikerült menteni az elrendezésfájlt: %s 1421 cannot write image folders file: %s 1421 nem sikerült írni a képmappák fájlját: %s 1422 category %s has too many keywords 1422 a(z) %s kategóriában túl sok kulcsszó van 1423 category %s is too big 1423 a(z) %s kategória túl nagy 1424 center 1424 középpont 1425 change project scale 1425 projekt méretarányának módosítása 1426 choose 1-8 clicks or [+] keys for 2x image zoom 1426 válasszon 1-8 kattintást vagy [+] billentyűt a kép 2x nagyításához 1427 choose a better spot 1427 válasszon jobb helyet 1428 choose an image file 1428 válasszon egy képfájlt 1429 choose file 1429 válasszon fájlt 1430 choose files 1430 válasszon fájlokat 1431 choose folder 1431 válasszon mappát 1432 choose folders 1432 válasszon mappákat 1433 choose location 1433 válasszon helyet 1434 circle 1434 kör 1435 clear area selections 1435 terület kijelöléseinek törlése 1436 clear entered text 1436 megadott szöveg törlése 1437 clear inputs 1437 bemenetek törlése 1438 clear text 1438 szöveg törlése 1439 click a defined keyword (below) to add a search keyword 1439 kattintson egy meghatározott kulcsszóra (lent) kereső kulcsszó hozzáadásához 1440 click bright point 1440 kattintson a fényes pontra 1441 click dark point 1441 kattintson a sötét pontra 1442 click on desired color 1442 kattintson a kívánt színre 1443 click on image to get source color 1443 kattintson a képre a forrásszín lekéréséhez 1444 click on image to set matching color 1444 kattintson a képre az egyeztetési szín beállításához 1445 click on thumbnail to set zoom center 1445 kattintson a thumbnailre a zoom középpontjának beállításához 1446 click position to add line 1446 kattintson a pozícióra vonal hozzáadásához 1447 click position to add text 1447 kattintson a pozícióra szöveg hozzáadásához 1448 click to select 1448 kattintson a kijelöléshez 1449 click to unselect 1449 kattintson a kijelölés megszüntetéséhez 1450 clicks per 2x image increase 1450 kattintás a kép 2x-es növeléséhez 1451 color 1451 szín 1452 color depth 1452 színmélység 1453 color depth: 1453 színmélység: 1454 color match level % 1454 színegyeztetési szint % 1455 color negative 1455 színes negatív 1456 column difference: %d pixels 1456 oszlopkülönbség: %d pixel 1457 column difference: %d pixels \nMake columns even? 1457 oszlopkülönbség: %d pixel \nEgyenlővé teszi az oszlopokat? 1458 combined image files 1458 egyesített képfájlok 1459 command: 1459 parancs: 1460 commit all changes, close dialog 1460 az összes módosítás véglegesítése, párbeszédablak bezárása 1461 complete file selection first 1461 először fejezze be a fájlkijelölést 1462 completed 1462 befejezve 1463 condense into color blobs 1463 összevonás színfoltokba 1464 condition 1464 feltétel 1465 confirm Fotocx exit 1465 Fotocx bezárásának megerősítése 1466 constant blur 1466 állandó elmosás 1467 continue? 1467 folytatja? 1468 converting colors... 1468 színek átalakítása... 1469 converting files 1469 fájlok átalakítása 1470 copy (duplicate file) 1470 másolás (fájl duplikálása) 1471 copy and paste commands 1471 másolási és beillesztési parancsok 1472 copy files to %s 1472 fájlok másolása ide: %s 1473 copy metadata from Nth file: 1473 metaadat másolása az N. fájlból: 1474 copy to Desktop failed: %s 1474 az asztalra másolás sikertelen: %s 1475 count: 0 1475 szám: 0 1476 create folder 1476 mappa létrehozása 1477 create folder %s 1477 %s mappa létrehozása 1478 current gallery 1478 jelenlegi galéria 1479 current image files found: %d \n 1479 talált jelenlegi képfájlok: %d \n 1480 current set only 1480 csak a jelenlegi készlet 1481 current set: 1481 jelenlegi készlet: 1482 curve file is invalid 1482 a görbefájl érvénytelen 1483 custom command to play video files 1483 egyéni parancs videófájlok lejátszásához 1484 dark 1484 sötét 1485 dark halo 1485 sötét glória 1486 dark pixels 1486 sötét pixelek 1487 data is incomplete, proceed? 1487 az adat hiányos, folytatja? 1488 date format is yyyy:mm:dd [hh:mm:ss] 1488 a dátumformátum: éééé:hh:nn [óó:pp:mm] 1489 date range 1489 dátumtartomány 1490 days 1490 nap 1491 delete 1491 törlés 1492 delete %s \n%s 1492 törlés: %s \n%s 1493 delete Mashup project files? 1493 törli a Mashup projektfájlokat? 1494 delete failed: \n%s 1494 a törlés sikertelen: \n%s 1495 delete originals specified but no new name given 1495 az eredetik törlése meg lett adva, de nincs megadva új név 1496 delete selected text from layout 1496 kijelölt szöveg törlése az elrendezésből 1497 deleting orphan thumbnails ... \n 1497 árva thumbnailek törlése ... \n 1498 depth 1498 mélység 1499 descending 1499 csökkenő 1500 direction of light and shadows 1500 fény és árnyékok iránya 1501 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1501 thumbnail kijelölés letiltása felugró menük stb. engedélyezéséhez \nhasználja az [Engedélyezés] gombot a thumbnail kijelölés folytatásához 1502 discard changes? 1502 elveti a módosításokat? 1503 do not warp images during auto-alignment 1503 ne torzítsa a képeket automatikus igazítás közben 1504 do nothing 1504 ne tegyen semmit 1505 dot size 1505 pont mérete 1506 downsize 1506 kicsinyítés 1507 drag image 1507 kép húzása 1508 drag mouse along an edge to follow the edge 1508 húzza az egeret egy él mentén az él követéséhez 1509 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1509 húzza az egeret lefelé/jobbra ovális rajzolásához \nshift + húzás középen az ovális mozgatásához \nshift + húzás a jobb alsó szélen a módosításhoz 1510 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1510 húzza az egeret doboz rajzolásához \nshift + húzás középen a doboz mozgatásához \nshift + húzás a szélen az él mozgatásához 1511 drag mouse to outline an area 1511 húzza az egeret egy terület körvonalazásához 1512 drag mouse to select circular or elliptical area 1512 húzza az egeret kör vagy ellipszis alakú terület kijelöléséhez 1513 drag mouse to select rectangular area 1513 húzza az egeret téglalap alakú terület kijelöléséhez 1514 drag mouse to show selected image 1514 húzza az egeret a kijelölt kép megjelenítéséhez 1515 duplicate keyword 1515 duplikált kulcsszó 1516 edge distance calculation 1516 él-távolság számítása 1517 edge: 1517 él: 1518 edit 1518 szerkesztés 1519 edit commands 1519 parancsok szerkesztése 1520 edit custom shell commands, match colors to embedded jpeg image 1520 egyéni shell parancsok szerkesztése, színek egyeztetése a beágyazott jpeg képpel 1521 edit this menu 1521 e menü szerkesztése 1522 ellipse 1522 ellipszis 1523 embedded numbers will sort by value 1523 a beágyazott számok érték szerint lesznek rendezve 1524 emboss 1524 dombornyomás 1525 enter 2-character language code: en, de, fr ... 1525 adjon meg egy 2 karakteres nyelvi kódot: en, de, fr ... 1526 enter a project name 1526 adjon meg egy projektnevet 1527 enter an album name 1527 adjon meg egy albumnevet 1528 enter cities/locations, countries 1528 adjon meg városokat/helyeket, országokat 1529 enter project name 1529 adjon meg projektnevet 1530 enter tag name 1530 adjon meg tag nevet 1531 enter tag names 1531 adjon meg tag neveket 1532 erase 1532 törlés 1533 error compensation 1533 hibakompenzáció 1534 exceed %d edits 1534 túllépte a(z) %d szerkesztést 1535 exceed %d images 1535 túllépte a(z) %d képet 1536 exceed %d max files, cannot continue 1536 túllépte a(z) %d maximális fájlszámot, nem folytatható 1537 exceed %d rows 1537 túllépte a(z) %d sort 1538 exceed %d selected files 1538 túllépte a(z) %d kijelölt fájlt 1539 exceed %d shortcuts 1539 túllépte a(z) %d gyorsbillentyűt 1540 exceeded %d line entries 1540 túllépte a(z) %d sorbejegyzést 1541 exceeded %d text entries 1541 túllépte a(z) %d szövegbejegyzést 1542 exceeded max. images: %d 1542 túllépte a maximális képszámot: %d 1543 exceeded max. tiles: %d 1543 túllépte a maximális csempeszámot: %d 1544 exit split-screen 1544 kilépés az osztott képernyőből 1545 expand to these limits if smaller 1545 bővítés ezekre a korlátokra, ha kisebb 1546 exporting files 1546 fájlok exportálása 1547 extra indexed metadata tags > %d 1547 extra indexelt metaadat tagek > %d 1548 extra metadata tags to include in index 1548 extra metaadat tagek az indexbe foglaláshoz 1549 extra metadata tags: \n 1549 extra metaadat tagek: \n 1550 fetch 1550 lekérés 1551 file 1551 fájl 1552 file .ext names to recognize RAW files 1552 RAW fájlok felismeréséhez tartozó .ext fájlnevek 1553 file .ext names to recognize video files 1553 videófájlok felismeréséhez tartozó .ext fájlnevek 1554 file close error 1554 fájlbezárási hiba 1555 file color 1555 fájl színe 1556 file error: %s 1556 fájlhiba: %s 1557 file format error 1557 fájlformátum-hiba 1558 file format error: %s 1558 fájlformátum-hiba: %s 1559 file included: %s \n 1559 fájl belefoglalva: %s \n 1560 file metadata update failed 1560 a fájl metaadatának frissítése sikertelen 1561 file name 1561 fájlnév 1562 file names 1562 fájlnevek 1563 file not found 1563 a fájl nem található 1564 file not found \n 1564 a fájl nem található \n 1565 file not found: %s 1565 a fájl nem található: %s 1566 file not found: %s %s 1566 a fájl nem található: %s %s 1567 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1567 fájltípusok: .jp2 .heic .avif .webp \nát lesznek alakítva: .jpg - FOLYTATJA? 1568 file: %s \nexceed 99 versions 1568 fájl: %s \ntúllépte a 99 verziót 1569 filename text 1569 fájlnévszöveg 1570 files in %s can be deleted 1570 a(z) %s mappában lévő fájlok törölhetők 1571 fill from current gallery 1571 kitöltés a jelenlegi galériából 1572 fill from selected files 1572 kitöltés a kijelölt fájlokból 1573 fill selected areas 1573 kijelölt területek kitöltése 1574 fill transparent areas 1574 átlátszó területek kitöltése 1575 find all image files ...\n 1575 az összes képfájl keresése ...\n 1576 find and report all unreadable image files 1576 az összes nem olvasható képfájl keresése és jelentése 1577 find outline gap 1577 körvonalhézag keresése 1578 find via table lookup 1578 keresés táblázat alapján 1579 find_imagefiles() failure \n 1579 find_imagefiles() hiba \n 1580 find_imagefiles() failure: %s \n 1580 find_imagefiles() hiba: %s \n 1581 finish current edit first 1581 először fejezze be a jelenlegi szerkesztést 1582 finish making a script file 1582 szkriptfájl elkészítésének befejezése 1583 finish or cancel pending edit 1583 fejezze be vagy szakítsa meg a folyamatban lévő szerkesztést 1584 fix box in layout and start new box 1584 doboz rögzítése az elrendezésben és új doboz indítása 1585 fix line in layout and start new line 1585 vonal rögzítése az elrendezésben és új vonal indítása 1586 fix motion blur 1586 mozgási elmosódás javítása 1587 fix oval in layout and start new oval 1587 ovális rögzítése az elrendezésben és új ovális indítása 1588 follow edge 1588 él követése 1589 font name and size for menus and dilogs 1589 a menük és párbeszédablakok betűtípusának neve és mérete 1590 force a full re-index of all image files 1590 az összes képfájl teljes újraindexelésének kikényszerítése 1591 format: yyyy:mm:dd [hh:mm:ss] 1591 formátum: éééé:hh:nn [óó:pp:mm] 1592 fotocx will exit 1592 a Fotocx kilép 1593 found %d pixels 1593 %d pixel található 1594 free disk space: %d GB \n 1594 szabad lemezterület: %d GB \n 1595 freehand draw 1595 szabadkézi rajzolás 1596 ftruncate() failure: %s 1596 ftruncate() hiba: %s 1597 full image index: reports will be complete \n 1597 teljes képindex: a jelentések teljesek lesznek \n 1598 function canceled 1598 a funkció megszakítva 1599 gallery 1599 galéria 1600 gallery is empty 1600 a galéria üres 1601 gallery truncated to %d images 1601 a galéria %d képre csonkítva 1602 get images having text in filename (comma separated) 1602 a fájlnévben szöveget tartalmazó képek lekérése (vesszővel elválasztva) 1603 get images with matching keywords (comma separated) 1603 egyező kulcsszavú képek lekérése (vesszővel elválasztva) 1604 get images within rating range 1604 értékelési tartományon belüli képek lekérése 1605 gradual paint 1605 fokozatos festés 1606 grid counts not 0-100: %s 1606 a rácsszámok nincsenek 0-100 között: %s 1607 grid picklist file error: %s 1607 rács választólista fájl hiba: %s 1608 grid size 1608 rács mérete 1609 group 1609 csoport 1610 height 1610 magasság 1611 hide area outlines 1611 terület körvonalak elrejtése 1612 hide transient objects 1612 átmeneti objektumok elrejtése 1613 high 1613 magas 1614 home folder was not changed 1614 az alapmappa nem változott 1615 horizontal 1615 vízszintes 1616 hours 1616 óra 1617 icons only, text only, or both 1617 csak ikonok, csak szöveg, vagy mindkettő 1618 if image < window, center or shift left or right 1618 ha a kép < ablak, középre igazítás vagy eltolás balra/jobbra 1619 ignore differences above limit 1619 a korlát feletti különbségek figyelmen kívül hagyása 1620 image blend 1620 kép keverése 1621 image files 1621 képfájlok 1622 image for source color 1622 kép a forrásszínhez 1623 image index records found: %d \n 1623 talált képindex-rekordok: %d \n 1624 image index required 1624 képindex szükséges 1625 image index write error: %s 1625 képindex írási hiba: %s 1626 image is too large to edit: %d x %d 1626 a kép túl nagy a szerkesztéshez: %d x %d 1627 image is too large: %dx%d, %lld megapix 1627 a kép túl nagy: %dx%d, %lld megapixel 1628 image is too small to edit: %d x %d 1628 a kép túl kicsi a szerkesztéshez: %d x %d 1629 image scale 1629 kép méretaránya 1630 image to set matching color 1630 kép az egyeztetési színhez 1631 image width must be greater than height 1631 a kép szélességének nagyobbnak kell lennie, mint a magassága 1632 images to report 1632 jelentendő képek 1633 include all files 1633 az összes fájl belefoglalása 1634 include edited versions 1634 szerkesztett verziók belefoglalása 1635 include last versions only 1635 csak az utolsó verziók belefoglalása 1636 include original files 1636 eredeti fájlok belefoglalása 1637 include transparent areas 1637 átlátszó területek belefoglalása 1638 include: 1638 belefoglalás: 1639 increase blur with distance 1639 elmosás növelése a távolsággal 1640 index completed, %.1f seconds \n 1640 az indexelés befejeződött, %.1f másodperc \n 1641 index config file error: %s 1641 index konfigurációs fájl hiba: %s 1642 index updates needed: %d thumbnails: %d \n 1642 szükséges index frissítések: %d thumbnail: %d \n 1643 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1643 index frissítések: %d cím/leírás frissítések: %d \nthumbnail frissítések: %d, törlések: %d \n 1644 input 1644 bemenet 1645 input file: %s \n 1645 bemeneti fájl: %s \n 1646 insufficient memory, cannot proceed 1646 nincs elég memória, nem folytatható 1647 insufficient overlap for color matching 1647 elégtelen átfedés a színegyeztetéshez 1648 invalid GPS data 1648 érvénytelen GPS adat 1649 invalid GPS data: %s 1649 érvénytelen GPS adat: %s 1650 invalid album 1650 érvénytelen album 1651 invalid date range: %s %s 1651 érvénytelen dátumtartomány: %s %s 1652 invalid date/time format 1652 érvénytelen dátum/idő formátum 1653 invalid file 1653 érvénytelen fájl 1654 invalid plugin: %s 1654 érvénytelen beépülő: %s 1655 invalid rating range 1655 érvénytelen értékelési tartomány 1656 invalid source file: %s 1656 érvénytelen forrásfájl: %s 1657 invert area 1657 terület invertálása 1658 jpeg quality level - 70+ for good image quality 1658 jpeg minőségi szint - 70+ a jó képminőségért 1659 keyboard 1659 billentyűzet 1660 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1660 billentyűzet vezérlők: \nEsc: futó diavetítés bezárása \nnyílbillentyűk: előző/következő kép \nB: ablak elsötétítése / visszakapcsolása \nN: átmenet a következő képre \nP: szünet / folytatás \nX: nagyítás az egér pozíciójánál 1661 keyword names 1661 kulcsszó nevek 1662 keywords to add 1662 hozzáadandó kulcsszavak 1663 keywords to remove 1663 eltávolítandó kulcsszavak 1664 keywords_defined file error: %s 1664 keywords_defined fájl hiba: %s 1665 last search 1665 legutóbbi keresés 1666 last version 1666 legutóbbi verzió 1667 last versions 1667 legutóbbi verziók 1668 layout exceeds 4 gigabytes 1668 az elrendezés meghaladja a 4 gigabájtot 1669 layout file missing: %s 1669 hiányzó elrendezésfájl: %s 1670 left 1670 balra 1671 left click on image for selected color 1671 bal kattintás a képre a kijelölt szín lekéréséhez 1672 left click: set image source location \nright click: set corresponding destination 1672 bal kattintás: kép forráshelyének beállítása \njobb kattintás: a megfelelő célhely beállítása 1673 left drag: add transparency \nright drag: add opacity 1673 bal húzás: átlátszóság hozzáadása \njobb húzás: átlátszatlanság hozzáadása 1674 left drag: copy image to mouse position \nright drag: restore original image 1674 bal húzás: kép másolása az egér pozíciójára \njobb húzás: eredeti kép visszaállítása 1675 left drag: reduce halo, right drag: undo 1675 bal húzás: glória csökkentése, jobb húzás: visszavonás 1676 lens mm 1676 objektív mm 1677 level based on EXIF roll angle 1677 szintezés az EXIF döntési szög alapján 1678 light 1678 világos 1679 light pixels 1679 világos pixelek 1680 line 1680 vonal 1681 line color 1681 vonal színe 1682 line width 1682 vonal szélessége 1683 load 1683 betöltés 1684 load text data from a file 1684 szövegadat betöltése fájlból 1685 load widgets failed: %s 1685 a widgetek betöltése sikertelen: %s 1686 loading palette ... 1686 paletta betöltése ... 1687 location is not a folder 1687 a hely nem mappa 1688 locations 1688 helyek 1689 lock width/height ratio 1689 szélesség/magasság arány zárolása 1690 log file is in a terminal 1690 a naplófájl egy terminálban van 1691 low 1691 alacsony 1692 low contrast 1692 alacsony kontraszt 1693 lower 1693 alsó 1694 make an initially empty album 1694 kezdetben üres album létrehozása 1695 make new version 1695 új verzió készítése 1696 manual align 1696 kézi igazítás 1697 map marker (red dot) diameter, pixels 1697 térképjelölő (piros pont) átmérője, pixelben 1698 map selected areas and verify 1698 kijelölt területek feltérképezése és ellenőrzése 1699 mashup project 1699 mashup projekt 1700 match embedded image color 1700 beágyazott kép színének egyeztetése 1701 match image color to base image (repeat) 1701 kép színének egyeztetése az alapképhez (ismétlés) 1702 match values 1702 értékek egyeztetése 1703 matches 1703 találatok 1704 max keywords exceeded 1704 túllépte a maximális kulcsszószámot 1705 max. Width 1705 max. szélesség 1706 max. album count exceeded: %d 1706 túllépte a maximális albumszámot: %d 1707 max. album files reached, results truncated 1707 elérte a maximális albumfájl-számot, az eredmények csonkítva 1708 max. album size exceeded: %d 1708 túllépte a maximális albumméretet: %d 1709 max. blur radius 1709 max. elmosási sugár 1710 max. brightness 1710 max. fényerő 1711 max. image limit reached: %d 1711 elérte a maximális képkorlátot: %d 1712 max. width or height is not reasonable 1712 a max. szélesség vagy magasság nem ésszerű 1713 maximum clip allowed to fit window 1713 az ablakhoz illesztéshez engedélyezett maximális vágás 1714 mean RGB: %5.0f %5.0f %5.0f 1714 átlagos RGB: %5.0f %5.0f %5.0f 1715 mean noise: %5.2f %5.2f %5.2f 1715 átlagos zaj: %5.2f %5.2f %5.2f 1716 median 1716 medián 1717 median diff 1717 medián eltérés 1718 menu text and background colors 1718 menü szöveg- és háttérszínei 1719 metadata 1719 metaadat 1720 metadata copy failed 1720 a metaadat másolása sikertelen 1721 metadata from Search Function, metadata report 1721 metaadat a keresési funkcióból, metaadat jelentés 1722 metadata picklist file not found %s 1722 a metaadat választólista fájl nem található: %s 1723 metadata tags to report 1723 jelentendő metaadat tagek 1724 metadata update error 1724 hiba a metaadat frissítésekor 1725 metadata update error \n 1725 hiba a metaadat frissítésekor \n 1726 metadata update error: %s 1726 hiba a metaadat frissítésekor: %s 1727 metadata update failed \n 1727 a metaadat frissítése sikertelen \n 1728 min. blur radius 1728 min. elmosási sugár 1729 min. contrast 1729 min. kontraszt 1730 min. edit curve node separation, % of scale length 1730 min. szerkesztési görbecsomópont-távolság, a skálahossz %-a 1731 min. separation, %c of scale 1731 min. távolság, a skála %c-a 1732 minutes 1732 perc 1733 mmap() failure: %s 1733 mmap() hiba: %s 1734 months 1734 hónap 1735 more than %d categories 1735 több mint %d kategória 1736 more than 20 matches 1736 több mint 20 találat 1737 mouse radius 1737 egér sugara 1738 mouse radius for color sample 1738 egér sugara a színmintához 1739 mouse radius: 1739 egér sugara: 1740 move (delete original) 1740 áthelyezés (eredeti törlése) 1741 move area boundary in/out in 1-pixel steps 1741 terület határának mozgatása befelé/kifelé 1 pixeles lépésekben 1742 move to next input file 1742 ugrás a következő bemeneti fájlra 1743 move to trash failed \n 1743 a kukába helyezés sikertelen \n 1744 move to trash failed: %s 1744 a kukába helyezés sikertelen: %s 1745 multiply 1745 szorzás 1746 must have 4 corners 1746 4 saroknak kell lennie 1747 need numeric match value: %s 1747 numerikus egyezési érték szükséges: %s 1748 negative 1748 negatív 1749 new album created 1749 új album létrehozva 1750 new album name 1750 új album neve 1751 new file 1751 új fájl 1752 new file ... 1752 új fájl ... 1753 new file name is invalid 1753 az új fájlnév érvénytelen 1754 new file type 1754 új fájltípus 1755 new home folder contains a blank 1755 az új alapmappa szóközt tartalmaz 1756 new location 1756 új hely 1757 new location is not a folder 1757 az új hely nem mappa 1758 new version 1758 új verzió 1759 newest files 1759 legújabb fájlok 1760 no EXIF orientation data 1760 nincs EXIF tájolási adat 1761 no active Select Area 1761 nincs aktív Terület kijelölése 1762 no albums selected 1762 nincs kijelölt album 1763 no auto warp 1763 nincs automatikus torzítás 1764 no change 1764 nincs módosítás 1765 no current album 1765 nincs jelenlegi album 1766 no current edit image 1766 nincs jelenlegi szerkesztett kép 1767 no current file 1767 nincs jelenlegi fájl 1768 no curve (scanned image) 1768 nincs görbe (beszkennelt kép) 1769 no description 1769 nincs leírás 1770 no file selected 1770 nincs kijelölt fájl 1771 no files found 1771 nem található fájl 1772 no files selected 1772 nincs kijelölt fájl 1773 no host files selected 1773 nincs kijelölt gazdafájl 1774 no image index: reports disabled \n 1774 nincs képindex: a jelentések letiltva \n 1775 no images 1775 nincs kép 1776 no images found 1776 nem található kép 1777 no input files available 1777 nincs elérhető bemeneti fájl 1778 no matching files found 1778 nem található egyező fájl 1779 no matching locations 1779 nem található egyező hely 1780 no metadata level data 1780 nincs metaadat szintadat 1781 no metadata tags to report 1781 nincs jelentendő metaadat tag 1782 no option selected 1782 nincs kijelölt opció 1783 no overlay file selected 1783 nincs kijelölt rátétfájl 1784 no photo date, skipped 1784 nincs fotódátum, kihagyva 1785 no plugin output file found 1785 nem található beépülő kimeneti fájl 1786 no prior edit 1786 nincs korábbi szerkesztés 1787 no prior edit image 1787 nincs korábbi szerkesztett kép 1788 no saved folders 1788 nincsenek mentett mappák 1789 no script file was started 1789 nem indult szkriptfájl készítése 1790 no script files found 1790 nem található szkriptfájl 1791 no select area 1791 nincs kijelölt terület 1792 no selection 1792 nincs kijelölés 1793 no title 1793 nincs cím 1794 no write permission 1794 nincs írási jogosultság 1795 no write permission \n 1795 nincs írási jogosultság \n 1796 no write permission: %s 1796 nincs írási jogosultság: %s 1797 none 1797 nincs 1798 not a known image file 1798 nem ismert képfájltípus 1799 not an image file 1799 ez nem képfájl 1800 not an indexed image file \n 1800 nem indexelt képfájl \n 1801 nothing found 1801 nem található semmi 1802 nothing left, no change made 1802 nem maradt semmi, nem történt módosítás 1803 old file 1803 régi fájl 1804 old image index: reports will omit new files \n 1804 régi képindex: a jelentések kihagyják az új fájlokat \n 1805 old keyword name >> new keyword name 1805 régi kulcsszó neve >> új kulcsszó neve 1806 omit high pixel 1806 magas pixel kihagyása 1807 omit low pixel 1807 alacsony pixel kihagyása 1808 only %d tile images found 1808 csak %d csempekép található 1809 opacity center 1809 átlátszatlanság középen 1810 opacity edge 1810 átlátszatlanság a szélen 1811 open album 1811 album megnyitása 1812 open and process color chart 1812 színkártya megnyitása és feldolgozása 1813 open as new current file 1813 megnyitás új jelenlegi fájlként 1814 optional deselect color 1814 opcionális szín kijelölésének megszüntetése 1815 original 1815 eredeti 1816 originals 1816 eredetik 1817 other 1817 egyéb 1818 out of space for temp files \nsave your edits and quit Fotocx 1818 elfogyott a hely az ideiglenes fájloknak \nmentse a szerkesztéseit és lépjen ki a Fotocx-ből 1819 outline 1819 körvonal 1820 output file exists 1820 a kimeneti fájl már létezik 1821 output file exists, overwrite? 1821 a kimeneti fájl már létezik, felülírja? 1822 output file size change, cannot use select area 1822 a kimeneti fájl mérete megváltozott, a terület kijelölése nem használható 1823 output file: 1823 kimeneti fájl: 1824 output file: %s \n 1824 kimeneti fájl: %s \n 1825 oval 1825 ovális 1826 overlay file missing: %s 1826 hiányzó rátétfájl: %s 1827 owner 1827 tulajdonos 1828 paint 1828 festés 1829 paint color 1829 festés színe 1830 paint edits cannot be used for this method 1830 a festés szerkesztés nem használható ehhez a módszerhez 1831 paint over transparent areas 1831 festés átlátszó területek felett 1832 paint radius 1832 ecsetsugár 1833 palette 1833 paletta 1834 palette exceeds %d color limit 1834 a paletta meghaladja a(z) %d színkorlátot 1835 palette file 1835 palettafájl 1836 palette has %d colors 1836 a paletta %d színt tartalmaz 1837 palette loaded, %d colors 1837 paletta betöltve, %d szín 1838 palette: 1838 paletta: 1839 patch area goal 1839 folt terület célja 1840 percent 1840 százalék 1841 perform edits to include in the script file 1841 hajtson végre szerkesztéseket a szkriptfájlba foglaláshoz 1842 permissions: 1842 jogosultságok: 1843 perspective 1843 perspektíva 1844 photo 1844 fotó 1845 picklist file not found: %s 1845 a választólista fájl nem található: %s 1846 pixel = mean of best match neighbors 1846 pixel = a legjobban egyező szomszédok átlaga 1847 pixel = median of all neighbors 1847 pixel = az összes szomszéd mediánja 1848 please make a choice 1848 kérjük, válasszon 1849 plugin command failed 1849 a beépülő parancsa sikertelen 1850 plugin menu not found %s 1850 a beépülő menü nem található: %s 1851 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1851 beépülők: (év hónap nap régi név sorszám) $yyyy $mm $dd $oldname $s 1852 popup_choose: empty list 1852 popup_choose: üres lista 1853 position with mouse click/drag 1853 pozíció egérkattintással/húzással 1854 position: 50 50 1854 pozíció: 50 50 1855 position: x=%02d y=%02d 1855 pozíció: x=%02d y=%02d 1856 power 1856 erő 1857 power center 1857 erő középpontja 1858 power edge 1858 erő széle 1859 power: center 1859 erő: középpont 1860 pref 1860 beállítás 1861 previous file 1861 előző fájl 1862 previous name 1862 előző név 1863 print color chart 1863 színkártya nyomtatása 1864 print select area(s) only? 1864 csak a kijelölt terület(ek) nyomtatása? 1865 prior edit step 1865 korábbi szerkesztési lépés 1866 project complete 1866 a projekt kész 1867 project file is defective 1867 a projektfájl hibás 1868 project name cannot have quote characters 1868 a projektnév nem tartalmazhat idézőjel karaktereket 1869 pure RGB or black/white dots 1869 tiszta RGB vagy fekete-fehér pontok 1870 quality 1870 minőség 1871 quality level (70+) 1871 minőségi szint (70+) 1872 radius 1872 sugár 1873 radius: 1873 sugár: 1874 random 1874 véletlenszerű 1875 random position 1875 véletlenszerű pozíció 1876 rating range 1876 értékelési tartomány 1877 reading image index file ...\n 1877 képindex fájl olvasása ...\n 1878 recent files 1878 legutóbbi fájlok 1879 reduce bright 1879 fényesség csökkentése 1880 reduce dark 1880 sötétség csökkentése 1881 reduce to these limits if larger 1881 csökkentés ezekre a korlátokra, ha nagyobb 1882 refresh 1882 frissítés 1883 remove %d duplicates? 1883 eltávolítja a(z) %d duplikátumot? 1884 remove all files in list 1884 az összes fájl eltávolítása a listából 1885 remove duplicate 1885 duplikátum eltávolítása 1886 remove from set 1886 eltávolítás a készletből 1887 remove panorama image curving 1887 panorámakép görbültségének eltávolítása 1888 remove selected file from list 1888 kijelölt fájl eltávolítása a listából 1889 rename keywords 1889 kulcsszavak átnevezése 1890 repair metadata for %s 1890 metaadat javítása ehhez: %s 1891 replace 1891 csere 1892 replace album %s ? 1892 kicseréli a(z) %s albumot? 1893 replace file 1893 fájl cseréje 1894 replace old 1894 régi cseréje 1895 replace old file (OVERWRITE) 1895 régi fájl cseréje (FELÜLÍRÁS) 1896 replace substring within file name 1896 részszöveg cseréje a fájlnéven belül 1897 report type: 1897 jelentés típusa: 1898 req. color match 1898 kért színegyezés 1899 reset 1899 visszaállítás 1900 resolution 1900 felbontás 1901 resume from current image 1901 folytatás a jelenlegi képtől 1902 right 1902 jobbra 1903 right click on image for deselected color 1903 jobb kattintás a képre a kijelölés megszüntetéséhez 1904 sample % 1904 minta % 1905 save 1905 mentés 1906 save Mashup output file 1906 Mashup kimeneti fájl mentése 1907 save Mashup project? 1907 menti a Mashup projektet? 1908 save area as a PNG file 1908 terület mentése PNG fájlként 1909 save as new file name or type 1909 mentés új fájlnévvel vagy típussal 1910 save as new file version 1910 mentés új fájlverzióként 1911 save edit, start new text 1911 szerkesztés mentése, új szöveg indítása 1912 save metadata to image file 1912 metaadat mentése a képfájlba 1913 save text data to a file 1913 szövegadat mentése fájlba 1914 save to .heic/.avif file not supported 1914 .heic/.avif fájlba mentés nem támogatott 1915 save to .jp2 file not supported 1915 .jp2 fájlba mentés nem támogatott 1916 save to .webp file not supported 1916 .webp fájlba mentés nem támogatott 1917 scan and save color chart 1917 színkártya beszkennelése és mentése 1918 scanned color chart file 1918 beszkennelt színkártya fájl 1919 scope of neighbor pixels 1919 szomszédos pixelek tartománya 1920 script already started 1920 a szkript már elindult 1921 script complete 1921 a szkript kész 1922 script error: %s, %s 1922 szkript hiba: %s, %s 1923 script file closed 1923 a szkriptfájl bezárva 1924 script file error 1924 szkriptfájl hiba 1925 script file format error: %s 1925 szkriptfájl formátum hiba: %s 1926 script file name too big 1926 a szkriptfájl neve túl hosszú 1927 script file to run 1927 futtatandó szkriptfájl 1928 search for names in image location metadata 1928 nevek keresése a kép helymetaadatában 1929 search for text within file folders or file name 1929 szöveg keresése a fájlmappákban vagy fájlnévben 1930 search for text within image title or description 1930 szöveg keresése a kép címében vagy leírásában 1931 search known locations 1931 ismert helyek keresése 1932 search range 1932 keresési tartomány 1933 search: 1933 keresés: 1934 seconds 1934 másodperc 1935 seconds to show with text 1935 megjelenítési idő szöveggel (másodperc) 1936 seconds to show without text 1936 megjelenítési idő szöveg nélkül (másodperc) 1937 select all 1937 összes kijelölése 1938 select all colors within mouse (flood) 1938 az egéren belüli összes szín kijelölése (kiöntés) 1939 select area missing or not finished 1939 a kijelölt terület hiányzik vagy nincs befejezve 1940 select area within mouse 1940 terület kijelölése az egéren belül 1941 select area within mouse circle 1941 terület kijelölése az egérkörön belül 1942 select base image for color matching 1942 alapkép kijelölése színegyeztetéshez 1943 select by color, required match level 1943 kijelölés szín alapján, szükséges egyezési szint 1944 select by color, search range 1944 kijelölés szín alapján, keresési tartomány 1945 select font 1945 betűtípus kijelölése 1946 select image to show with mouse paint 1946 egérrel festéssel megjelenítendő kép kijelölése 1947 select images randomly 1947 képek véletlenszerű kijelölése 1948 select initial files 1948 kezdeti fájlok kijelölése 1949 select line color 1949 vonal színének kijelölése 1950 select one color within mouse 1950 egy szín kijelölése az egéren belül 1951 select rectangle 1951 téglalap kijelölése 1952 select source image color first 1952 először jelölje ki a forráskép színét 1953 select surrounding areas matching colors in mouse 1953 az egéren belüli színeknek megfelelő környező területek kijelölése 1954 selection exceeds %d tags 1954 a kijelölés meghaladja a(z) %d tageket 1955 sepia 1955 szépia 1956 set a new date/time: 1956 új dátum/idő beállítása: 1957 set all 1957 összes beállítása 1958 set current window size 1958 jelenlegi ablakméret beállítása 1959 set image color from input files 1959 kép színének beállítása a bemeneti fájlokból 1960 set location from world map 1960 hely beállítása a világtérképről 1961 set maximum crop 1961 maximális vágás beállítása 1962 shadow 1962 árnyék 1963 shell command used for converting RAW files to RGB 1963 a RAW fájlok RGB-vé alakításához használt shell parancs 1964 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1964 shift + bal kattintás: szín lekérése a képről \nbal húzás: szín festése a képre \njobb húzás: eredeti kép visszaállítása 1965 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1965 shift + bal kattintás: másolási pozíció szinkronizálása \nbal húzás: forráskép másolása az egérhez \njobb húzás: eredeti kép visszaállítása 1966 shift existing date/time (+/–): 1966 meglévő dátum/idő eltolása (+/–): 1967 shift+click on image to select color 1967 shift+kattintás a képre a szín kijelöléséhez 1968 shortcut function not found: %s 1968 a gyorsbillentyű funkciója nem található: %s 1969 shortcut key: 1969 gyorsbillentyű: 1970 shortcut not found: %s 1970 a gyorsbillentyű nem található: %s 1971 show area outlines 1971 terület körvonalak megjelenítése 1972 show hidden files and folders 1972 rejtett fájlok és mappák megjelenítése 1973 show transient objects 1973 átmeneti objektumok megjelenítése 1974 size of mouse selection circle 1974 az egér kijelölő körének mérete 1975 smooth 1975 sima 1976 source file: 1976 forrásfájl: 1977 source image failure (scale too big?) 1977 a forráskép hiba (túl nagy a méretarány?) 1978 source image scale 1978 forráskép méretaránya 1979 specify a thumbnail folder 1979 adjon meg egy thumbnail mappát 1980 specify at least 1 top image folder 1980 adjon meg legalább 1 felső képmappát 1981 specify background size and color 1981 adja meg a háttér méretét és színét 1982 specify files and keywords 1982 adjon meg fájlokat és kulcsszavakat 1983 spot size limit 1983 folt méretének korlátja 1984 start 1984 indítás 1985 start a new script file 1985 új szkriptfájl indítása 1986 start album 1986 kezdő album 1987 start blob condensation process 1987 folt-összevonási folyamat indítása 1988 start file 1988 kezdő fájl 1989 start folder 1989 kezdő mappa 1990 start from first image in album 1990 kezdés az album első képétől 1991 start fusion process 1991 fúziós folyamat indítása 1992 start over at end of album 1992 kezdés elölről az album végén 1993 start warp 1993 torzítás indítása 1994 start with previous image file, gallery of recent files, etc. 1994 kezdés az előző képfájllal, legutóbbi fájlok galériájával stb. 1995 startup album is invalid 1995 az indítási album érvénytelen 1996 startup file is invalid 1996 az indítási fájl érvénytelen 1997 startup folder is invalid 1997 az indítási mappa érvénytelen 1998 status: %s \n 1998 állapot: %s \n 1999 status: completed \n 1999 állapot: befejezve \n 2000 stay open 2000 nyitva tartás 2001 step 2001 lépés 2002 stop 2002 leállítás 2003 stop blob condensation process 2003 folt-összevonási folyamat leállítása 2004 stop fusion process 2004 fúziós folyamat leállítása 2005 supply a file name 2005 adjon meg egy fájlnevet 2006 tag name 2006 tag neve 2007 tag name %s not in xmeta tag list 2007 a(z) %s tag neve nincs az xmeta tag listában 2008 tag value 2008 tag értéke 2009 target file: 2009 célfájl: 2010 template 2010 sablon 2011 test: show changes, do not update files 2011 teszt: módosítások megjelenítése, fájlok nem frissülnek 2012 text 2012 szöveg 2013 text file is defective 2013 a szövegfájl hibás 2014 text time 2014 szöveg ideje 2015 this function cannot be scripted 2015 ez a funkció nem szkriptelhető 2016 thumbnail file 2016 thumbnail fájl 2017 thumbnails deleted: %d \n 2017 törölt thumbnailek: %d \n 2018 thumbnails folder: %s \n 2018 thumbnails mappa: %s \n 2019 tile area goal 2019 csempeterület célja 2020 tile gap 2020 csempehézag 2021 tile size 2021 csempeméret 2022 time 2022 idő 2023 title/desc. 2023 cím/leírás 2024 to add images to current set, \nsearch all images 2024 képek hozzáadásához a jelenlegi készlethez, \nkeresse az összes képet 2025 to remove images from current set, \nsearch current set 2025 képek eltávolításához a jelenlegi készletből, \nkeresse a jelenlegi készletet 2026 too many categories 2026 túl sok kategória 2027 too many files, cannot continue 2027 túl sok fájl, nem folytatható 2028 too many keywords in a category 2028 túl sok kulcsszó egy kategóriában 2029 top image folders: \n 2029 felső képmappák: \n 2030 transition 2030 átmenet 2031 transitions 2031 átmenetek 2032 trash 2032 kuka 2033 trimmed color chart file 2033 vágott színkártya fájl 2034 unable to save bookmarks file 2034 nem sikerült menteni a könyvjelzőfájlt 2035 unknown edit function: %s 2035 ismeretlen szerkesztő funkció: %s 2036 unknown file type 2036 ismeretlen fájltípus 2037 unknown or empty album: %s 2037 ismeretlen vagy üres album: %s 2038 unsharp mask 2038 kontrasztos élesítés (unsharp mask) 2039 update 2039 frissítés 2040 updating albums ...\n 2040 albumok frissítése ...\n 2041 upper 2041 felső 2042 upsize 2042 nagyítás 2043 use 2043 használat 2044 use a saved Mashup project 2044 mentett Mashup projekt használata 2045 use average 2045 átlag használata 2046 use custom color palette 2046 egyéni színpaletta használata 2047 use median 2047 medián használata 2048 use option to stop accidental quit 2048 opció használata a véletlen kilépés megakadályozására 2049 use previous input 2049 előző bemenet használata 2050 use previous location 2050 előző hely használata 2051 use prior edit step: 2051 korábbi szerkesztési lépés használata: 2052 use the current image file 2052 a jelenlegi képfájl használata 2053 variance 2053 szórás 2054 versions 2054 verziók 2055 vertical 2055 függőleges 2056 video files not supported (install ffmpeg) 2056 videófájlok nem támogatottak (telepítse az ffmpeg-et) 2057 view album 2057 album megtekintése 2058 waiting 2058 várakozás 2059 warp 2059 torzítás 2060 warp and align selected image with mouse drags 2060 kijelölt kép torzítása és igazítása egérhúzással 2061 warp and fine-align selected image with neighbor 2061 kijelölt kép torzítása és finomigazítása a szomszéddal 2062 warp span 2062 torzítási tartomány 2063 wavelength 2063 hullámhossz 2064 width 2064 szélesség 2065 writing updated image index file \n 2065 frissített képindex fájl írása \n 2066 x-count 2066 x-szám 2067 x-offset 2067 x-eltolás 2068 y-count 2068 y-szám 2069 y-offset 2069 y-eltolás 2070 years 2070 év 2071 you can close this window now \n 2071 ezt az ablakot most bezárhatja \n 2072 you cannot use new name and replace text together 2072 nem használhatja együtt az új nevet és a szöveg cseréjét 2073 you must use either $s or $oldname 2073 vagy a $s, vagy a $oldname használata kötelező 2074 zoom image 2074 kép nagyítása 2075 zoom via mouse wheel or Keys +/=/-/↑/↓ 2075 nagyítás egérgörgővel vagy a +/=/-/↑/↓ billentyűkkel 2076 zoom-in 2076 zoom-in 2077 zoom-out 2077 zoom-out fotocx/data/translations/ug_en0000664000175000017500000072336015247006657015523 0ustar micomico- ^FOTOCX USER GUIDE^ v.26.8 View using the Fotocx menu Help > User Guide - {FOTOCX USAGE} {FIRST STARTUP} - locating and indexing image files for fast searching {USER GUIDE} ← ^click here^ - how to use this user guide browser {WINDOW VIEWS AND MENUS} - top-level windows and associated menus {FILE VIEW} - File View window (view single image file) {GALLERY VIEW} - Gallery View window (view folder as thumbnails) {MAP VIEW} - map view window (view map with image location markers) {DRAG AND DROP} - file drag and drop methods {EDIT PROCEDURES} - how to edit image files {EDIT WORKFLOW} - alternative edit methods - simple and complex {MOUSE OWNERSHIP} - dialog-mouse control and interaction {MOUSE ALT-RIGHT-BUTTON} - mouse right-button for touchpads/screens {DIALOG BUTTONS} - dialog completion options {KEYBOARD ESCAPE KEY} - functions of the Escape key {NON-STANDARD DIALOG WIDGETS} - how to use non-standard dialog widgets {CURVE EDITING} - how to manipulate curves used in edit functions {MOUSE PAINTING} - editing an image locally using the mouse {BATCH PROCESSING} - overview of batch processing functions {SELECT IMAGE FILES} - image file selection procedure {SHORTCUTS} - popup menus, keyboard shortcuts, custom user menu {MOUSE FUNCTIONS} - mouse functions for file/gallery/map views {COMMAND PARAMETERS} - Fotocx command line parameters - {FILE MENU} {NEW SESSION} - start new Fotocx session in a separate window {OPEN IMAGE FILE} - open an image file for view or edit {CYCLE 2 FILES} - cycle through the two most recently seen image files {CYCLE 3 FILES} - cycle through the three most recently seen image files {VIEW 360° PANO} - 360° panorama image with rotating viewpoint {BLANK IMAGE} - create blank image with specified size and color {BLANK IMAGE} - create a new blank image {COPY/MOVE} - copy or move an image file to another folder {COPY TO DESKTOP} - copy an image file to the desktop {COPY TO CLIPBOARD} - copy an image file to the clipboard {DELETE/TRASH} - delete or trash an image file {SET WALLPAPER} - set desktop wallpaper from the current image file {PRINT IMAGE} - print an image file {PRINT CALIBRATED} - print using color calibration data {CALIBRATE PRINTER} - calibrate printer color - compensate color shifts - {GALLERY MENU} {GALLERY OVERVIEW} {THUMB VIEW} - Gallery View with thumbnails and file names {METADATA VIEW} - Gallery View with thumbnail and basic metadata {RECENT FILES} - Gallery View of most recently seen image files {NEWEST FILES} - Gallery View of newest image files {GALLERY SORT} - change the sort order of a gallery {GALLERY FILTER} - select newest, oldest, matching pattern ... {GALLERY HOME} - jump to gallery start {GALLERY END} - jump to gallery end {CURRENT FILE FOLDER} - set current gallery from folder of current file {RECENT FOLDERS} - view list of recently seen folders, select {FOLDER TREE} - view image file folders in a tree structure, select {SELECT FILES} - select files for input to batch, script or album {BOOKMARKS} - view list of bookmarks, go to bookmark {EDIT BOOKMARKS} - add, remove, arrange bookmarks - {MAPS MENU} {WORLD MAP} - internet world map overview {SHOW ON MAP} - show current image position on map - {ALBUMS MENU} {ALBUMS} - create and arrange image collections {CREATE ALBUM} - create a new album (gallery of chosen images) {RENAME ALBUM} - rename an existing album {DELETE ALBUM} - delete an existing album {CHOOSE ALBUM} - choose an album and display gallery of images {CURRENT ALBUM} - show the current (last used) album {GALLERY TO ALBUM} - save current gallery as a named album {EDIT ALBUM} - add, remove, rearrange image files in an album gallery {UPDATE ALBUMS} - update albums for updated image files (new versions) {ALBUM MASS UPDATE} mass update albums (member files add/remove/replace) {SLIDE SHOW} - slide show with animated image transitions and pan/zoom - {CUSTOM MENU} - custom user menu for frequently used functions {SCRIPT FILES} - script files overview {EDIT SCRIPT} - record edits in a script to make a custom edit function {RUN SCRIPT} - execute script on current image {BATCH SCRIPT} - execute script on selected image files {PLUGINS} - start a plugin edit function, open plugin output file - {ZOOM} - zoom image or thumbnails in/out via mouse or keyboard - {PREV/NEXT} - index to previous or next image via mouse or keyboard - {FILE SAVE} - save image file (replace, new version, new file name) - {METADATA MENU} {VIEW MAIN META} - list main image metadata {VIEW ALL META} - list all image metadata {KEYWORDS OVERVIEW} - keywords used for image searching {GEOTAGS OVERVIEW} - location names and geocoordinates for searching {EDIT MAIN META} - edit commonly used metadata {EDIT ANY META} - edit any metadata (add, remove, change) {DELETE META} - delete specified metadata or all metadata {COPY META} - copy metadata from one image file to another {FIX META} - repair malformed metadata preventing metadata edits {MANAGE KEYWORDS} - manage user-defined keywords {CAPTIONS} - show file name, title, description in image corner {PLACES/DATES} - list image locations/dates, click for gallery {TIMELINE} - show image counts by year/month, click for gallery {METADATA TAGS} - show image counts by tag value, click for gallery {AUTOSEARCH} - scripted Search function to find files {SEARCH IMAGES} - search using any metadata or folder/file names - {SELECT MENU} {AREA OVERVIEW} - select area - concepts and usage {SELECT AREA} - select image feature or area for separate editing {FIND AREA GAP} - find gap in hand-drawn area outline {AREA BLEND} - mouse-blend edits made within a selected area {SHOW/HIDE AREA} - show or hide area outlines {ENABLE/DISABLE AREA} - enable or disable an area for editing {INVERT AREA} - invert an area (exchange outside/inside areas) {CLEAR AREA} - remove an area {COPY/PASTE AREA} - copy an area or paste area into current image {LOAD/SAVE AREA} - load an area from a file or save to a file - {UNDO/REDO BUTTON} - sequential undo or redo edits to current image - {EDIT MENU} {ROTATE} - rotate or level an image {UPRIGHT} - upright a rotated or mirrored image {CROP} - crop (trim) image margins {RETOUCH} - edit brightness, contrast, color, saturation {RESCALE} - change the image pixel dimensions {SPLIT-SCREEN} - view before/after changes using split-screen {SHOW DIFFS} - highlight changes during edit (or any two images) {MARGINS} - add margins to an image, any color or transparency {MARKUP} - draw on image: text, line/arrow, box, oval {COLOR MODE} - convert to black & white, color, negative, positive {PAINT EDITS} - mouse-paint an edit function locally and gradually {PAINT IMAGE} - mouse-paint with a color, brush size, and opacity {PAINT TRANSPARENCY} - paint increasing transparency using the mouse {AREA FILL} - fill selected areas or transparent areas with a color {COPY IN IMAGE} - copy pixels within an image using the mouse {COPY FROM IMAGE} - copy pixels from another image using the mouse {COPY PRIOR EDIT} - copy pixels from prior edits using the mouse - {REPAIR MENU} {SHARPEN} - sharpen a blurred image, multiple methods {BLUR} - blur an image or image area, multiple methods {DENOISE} - reduce image noise (small random specks) {DEFOG} - add or remove fog/haze from an image or selected area {RED EYES} - remove red eyes from flash photos {SMART ERASE} - remove power lines, signs, other small spoilers {REMOVE HALO} - remove halos left by sharpen and other functions {JPEG ARTIFACTS} - suppress artifacts in highly compressed files {ANTI-ALIAS} - suppress pixelation (jaggies) along feature edges {ADJUST RGB} - adjust image colors using RGB or CMY colors {ADJUST HSL} - select and change colors using HSL color model {REMOVE DUST} - remove dust spots on images from old photos {FRINGES} - fix peripheral color fringes (chromatic aberration) - {REFINE MENU} {FLATTEN HISTOGRAM} - flatten brightness histogram for better detail {LOCAL CONTRAST} - add contrast adapted to local area brightness {AMPLIFY CONTRAST} - amplify existing contrast to enhance details {GLOBAL RETINEX} - rescale RGB values for greater range {LOCAL RETINEX} - rescale RGB values for greater range {SATURATION} - adjust color saturation based on brightness {SOFT FOCUS} - apply classic "soft focus" effect to an image {BRIGHTNESS RAMP} - add a brightness/color ramp across an image {VIGNETTE} - change brightness/color radially around chosen center - {EFFECTS MENU} {OUTLINES} - convert an image into an outline drawing {SKETCH1} - convert an image into a simulated sketch (1) {SKETCH2} - convert an image into a simulated sketch (2) {CARTOON} - convert an image to a cartoon-like drawing {EMBOSS} - convert an image to a simulated embossing (3D effect) {TILES1} - convert an image into square tiles with 3D effect {TILES2} - convert an image into irregular tiles matching image {PAINTING} - convert an image into a simulated painting {TEXTURE} - add texture to an image or selected area {FUSION} - suppress fine details while retaining sharpness {MATCH COLORS} - match the colors in one image to another image {PATTERN} - add a background pattern to an image {CROSSHATCH} - convert into a sketch using crossing parallel lines {DITHER} - different ways to pixelize or posterize an image {ENGRAVE} - convert an image into black & white lines {ADD GLARE} - add glare around bright objects im image {MOSAIC} - convert image into a mosaic using tiles made from images {ADD NOISE} - add random noise to an image {SET COLORS} - reduce the number of colors (posterize) {SHIFT COLORS} - gradually shift RGB colors to GBR or BRG {ALIEN COLORS} - add random strange colors to an image {CUSTOM KERNEL} - edit and apply a custom convolution kernel - {WARP MENU} {UNBEND} - straighten images having curved lines, esp. panoramas {PERSPECTIVE} - straighten object photographed from an obtuse angle {WARP AREA} - warp a selected image area by pulling with the mouse {WARP LINEAR1} - warp image by mouse drag - linear 1 warp {WARP LINEAR2} - warp image by mouse drag - linear 2 warp {WARP CURVED} - warp image by mouse drag - curvy warp {WARP AFFINE} - warp image by mouse drag - parallel lines preserved {WARP RADIAL} - add or remove barrel or pincushion distortion {UNWARP CLOSEUP} - remove close-up face photo distortion (big nose) {MAKE WAVES} - warp an image with a wave pattern {TWIST} - twist an image around a chosen center point {SPHERE} - curve an image into a spheroid shape {INSIDE-OUT} - invert the center-edge distance of each pixel {TINY PLANET} - wrap a panorama image around a circle {ESCHER SPIRAL} - transform an image into an endless inward spiral {FLATTEN PHOTO} - flatten a photo of a curved surface - {COMBINE MENU} {HDR} - combine dark/bright images for an extended brightness range {HDF} - combine close/far focused images for extended depth of field {STACK/PAINT} - combine images to remove transient cars, tourists, etc. {STACK/NOISE} - combine images to reduce noise by averaging {STACK/LAYERS} - combine image versions, select/paint area/version {PANORAMA} - combine a series of images horizontally {SHOW CIM FILES} - show input files for current/latest combined image {MASHUP} - arrange images and formatted text in a custom layout {IMAGE ARRAY} - join many images into a compact array format - {BATCH MENU} {BATCH CONVERT} - copy, move, rescale, rename, convert, add text ... {BATCH COPY/MOVE} - copy/move selected image files to a new folder {BATCH UPRIGHT} - scan for rotated image files and upright them {BATCH DELETE/TRASH} - delete or trash selected image files {BATCH OVERLAY} - add overlay image (copyright ...) to selected images {BATCH KEYWORDS} - add or remove keywords for selected image files {BATCH RENAME KEYWORDS} - rename or delete keywords for all image files {BATCH PURGE KEYWORDS} - purge unwanted keywords from all imagg files {BATCH PHOTO DATE} - change photo dates or times, or shift time zone {BATCH CHANGE META} - add or revise metadata for selected image files {BATCH REPORT META} - report metadata for selected or all image files {BATCH GEOTAGS} - add or revise geotags for selected or all image files {EXPORT FILES} - export selected files to a folder (e.g. web upload) - {TOOLS MENU} {INDEX FILES} - 1-time job to find and index all image files {MOVE FOTOCX HOME} - move Fotocx home folder (user data and settings) {SETTINGS} - user preferences and settings for Fotocx operation {KEYBOARD SHORTCUTS} - show and revise keyboard shortcuts for menu functions {RGB HISTOGRAM} - brightness histogram graph for current image {MAGNIFY IMAGE} - turn mouse into a magnifying glass over image {MEASURE IMAGE} - measure pixel distances within image (mouse clicks) {SHOW RGB} - show RGB values at mouse position or for selected points {GRID SETTINGS} - show or remove grid lines, set line count or spacing {LINE COLOR} - set color for select area outlines {DARK/BRIGHT PIXELS} - tool to highlight clipping {MONITOR COLOR} - adjust monitor brightness and contrast {FIND DUPLICATES} - find duplicate images in a gallery or all images {FIND BAD FILES} - find unreadable image files, delete/move/fix {SHOW RESOURCES} - show CPU time and current memory usage {TRANSLATIONS} - create or modify GUI translations - {HELP MENU} - user guide, tutorial, change log, about Fotocx, uninstall - {OTHER TOPICS} {VIDEO FILES} - video files, thumbnails, playing videos {SLIDES AND NEGATIVES} - how to capture slides and film negatives {FOTOCX LIMITATIONS} - size and performance limits {FOTOCX FOR WINDOWS 11} - installing Fotocx on Windows 11 WSL {PRIVACY} - Fotocx privacy and data protection policy {PROBLEM, QUESTION, SUGGESTION} - contact the Fotocx author - - TOPIC: FOTOCX USAGE - - TOPIC: FIRST STARTUP - ^Outboard Programs Fotocx reports required and optional outboard programs and the function provided by each. If any required programs are missing, install them and start Fotocx again. - ^First Index Fotocx will index your image files. This makes the gallery pages (thumbnails) display fast, enables fast search based on indexed metadata, and enables clickable map markers to view images by location. You must input one or more 'top' image folders (e.g. /home//Pictures). Subfolders are automatically included. Non-image files in these folders are ignored. Use the [select] button to locate and add your top image folders. A practical limit is about 30 Top folders. Each may have hundreds of subfolders. - ^Thumbnails This is the folder where thumbnail files will be placed. Use the supplied default or choose another location. - ^Index Time Indexing speed can range from a few hundred to >10K files/minute, depending on the type and size of your image files and your computer speed. When you add new image files to your collection, the next Fotocx startup will index the new files. If there are many new files, startup will need time to index them. - ^Consolidation of image title and description The Fotocx image index function replaces missing title and description metadata with one of the many alternative metadata tags, if available: headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. This is done so that you can always view/edit/search using only 'title' and 'description'. This conversion process is relatively slow (2200 files/minute on my strong computer). This is done when new image files are indexed for the first time. Nothing is erased. - - TOPIC: USER GUIDE Open the user guide from the menu Help > User Guide. While using Fotocx, you can press F1 to view the User Guide topic for the current or most recent menu function. - To scroll the text, use arrow-up/down and page-up/down keys. The [Find] button opens a dialog for a text search. Press [Find] again for the next occurrence. - Bold capitalized text is a clickable link to a topic, e.g. {INDEX FILES}. Use the buttons [<] and [>] to go back and forth between topics recently viewed. The button [Recent] presents a clickable list of recently viewed topics. - - TOPIC: WINDOW VIEWS AND MENUS +image: fotocx-views.jpg - ^Menu Buttons When a menu is clicked, a popup sub-menu appears. The top three menus (File, Gallery, Maps) set the corresponding view mode. The keys F/G/M can also be used. - - TOPIC: FILE VIEW One image fills the entire Fotocx window. Zoom in/out with left/right mouse click. The Z key alternates between fit-to-window and 1x image size (1 image pixel = 1 display pixel). To pan a zoomed image, left-drag the mouse across the image. The mouse wheel can also zoom an image in or out. Use the menu buttons (Edit, Repair, etc.) to modify the image. Use the File Save button to save a modified file: replace, create a new version, or create a new file (new name). - ^Keyboard left/right arrow keys View the previous or next image file in the current gallery. - ^up/down arrow keys As above, but only last versions are shown, or the original if no versions exist. - - TOPIC: GALLERY VIEW All image files in the current gallery are shown as an array of thumbnails. - ^Gallery Types • Folder: all the image files and subfolders in a single folder (directory) • Album: image files from various folders, arranged by the user • Recent Files: the most recently viewed or edited image files • Newest Files: image files most recently added or modified • Search Results: images found by the Search function. Also an album. - ^Gallery Functions • left click on image thumbnail: open image in File View mode • right click on image thumbnail: popup menu of common functions • click on folder thumbnail: open that folder in Gallery mode • TOP bar of folder gallery: parent folders - click to go there • [TOP] button: list of top-level folders - click to go there • scroll bars: scroll up/down within the gallery • arrow up/down keys: scroll the gallery one row • page up/down keys: scroll the gallery one page • home/end keys: go to start (top) and end (bottom) of gallery • mouse wheel: scroll the gallery up and down • [+] and [-] keys: increase/decrease thumbnail size - ^Gallery Popup Images • Click thumbnail with middle mouse button for popup image • Click thumbnail with shift + left mouse for popup image • Left click popup image: zoom the image bigger • Right click popup image: close the popup image • Mouse scroll wheel: zoom popup image bigger or smaller • Key F11: make popup image full screen • Escape key: close the popup image • Multiple popups can be used to compare images - - TOPIC: MAP VIEW View maps containing markers corresponding to image locations. Click on a marker for a gallery of the corresponding images. This depends on your image files having embedded geocoordinates (latitude, longitude). Modern cameras insert this automatically, and you can also add this data yourself. Initially a world map is displayed. Use the mouse wheel to zoom-in/out at any location. Drag to shift the map center. The entire world can be viewed at any scale down to street-level. - - TOPIC: DRAG AND DROP If you open two Fotocx sessions, you can drag and drop files from one to the other. Drag a gallery thumbnail from one window to the other. If File View, the file is opened. If Gallery View, the result depends on the type of gallery. If the gallery is a folder, the file is added to the folder and the gallery will show the new file in its sorted position. If the gallery is an album, the file is added to the album at the position where it is dropped. - - TOPIC: EDIT PROCEDURES The image in File View mode (the current image) can be modified with the edit functions in the menus Edit, Repair, Refine, Effects, Warp and Combine. These functions modify the current image in memory and in the window. As you use these functions, edits are accumulated. When you are finished editing, use the [Save] menu button to save the modified image back to the same file, to a new version (e.g. filename.v01.jpg), or to a new file and/or folder. Image edit dialogs have sliders, buttons, spin buttons, or editable curves that immediately update the image. - Left or right click the Undo/Redo button to undo or redo the currently active edit function. After an image has had one or more edits applied, the undo/redo button can be used to step back and forth through all the completed steps to view the image status after each step. The middle mouse button shows a popup list of all edits done to the current image, and you can select any step to go back to. The image can be re-edited from any prior step. This will discard edits done after that step, since they were derived from that step. This undo/redo capability remains as long as the edited image remains as the current image. If another image is opened, the edit history is discarded. If you want to retain the possibility of returning to the current image status, then save the image as a new version before continuing with another edit. - - TOPIC: EDIT WORKFLOW - ^Simple Workflow Most of the time you can just edit the JPEG file that comes out of the camera. Use the following more complex procedure only if you see color bands after edits that have expanded the brightness range in some image areas, making the brightness steps big enough to see. - ^Complex Workflow To edit with deep color (over 8 bits per RGB color), start with the camera RAW file. A RAW file can be edited like any other image file. Fotocx edit functions work with 24 bits per color, so the full color depth of the RAW file is preserved. When you open a RAW file, the chosen RAW loader is used - see {SETTINGS}. You can also use Batch Convert to convert multiple RAW files to TIFF, PNG, or JXL files with 16 bits per color. - Dcraw is the default RAW file loader. You can also use a more complex RAW editor like Rawtherapee - see {SETTINGS}. Dcraw is simple and fast in comparison. The edit functions in a RAW editor can usually be done more easily with Fotocx. - - TOPIC: MOUSE OWNERSHIP Some edit dialogs use the mouse to reference or alter the image in the main window. There may be more than one such dialog active at the same time. The mouse is also used to zoom and scroll the image, and you may need to do this while using an edit dialog. Therefore it is important to understand which dialog or window owns the mouse, and how to change the ownership: • If a dialog has keyboard focus, mouse actions on the image are inputs to this dialog and do not zoom or scroll the image. • If you hold the CTRL key down while clicking or dragging the mouse on the image, the image will zoom or pan/scroll. Open dialogs are not affected. • The mouse wheel can zoom-in/out at any image location. - - TOPIC: MOUSE ALT-RIGHT-BUTTON For touchpads or touchscreens, right-mouse clicks may be clumsy. If the ALT key is held while pressing the left mouse button, this is interpreted as the right mouse button. - - TOPIC: DIALOG BUTTONS These mostly work as follows: • [Reset] - undo current edit, return image to initial status • [Apply] - apply dialog settings to image, leave dialog active • [OK] - same as [Apply], but the dialog is closed • [Cancel] - discard image changes and close the dialog • [Proceed] - proceed with lengthy task based on dialog inputs • [X] - close dialog with no action - - TOPIC: KEYBOARD ESCAPE KEY Main window has focus: • if a long-running function is still running, terminate it • if the main window is maximized, restore prior size • if the current view is gallery or map, change to file view • none of the above: quit Fotocx Dialog window has focus: kill the dialog (same as [X] button) Others: cancel popup image, exit 360 panorama viewer, pause or exit Slide Show. - - TOPIC: NON-STANDARD DIALOG WIDGETS +image: custom-widgets.png - Some non-standard widgets are used to reduce dialog size or improve the ease of use. They work almost like standard GTK widgets. The numeric data widget works like a GTK spin-button: the mouse wheel and keyboard up/down arrow keys can be used to rapidly run the value up or down. If using a touchpad, tap the entry to position the cursor, then use the keyboard to enter a value, or use the keyboard up/down arrow keys to rapidly index to a new value. If the key is held down, the change rate accelerates over time. The shift key can be used to increase the rate by 10x. A nonlinear slider expands the scale around the neutral value, so that small changes can be controlled more precisely, especially with a touchpad. A few standard GTK widgets have been reduced in size by removing excess padding. This is controlled by the file 'widgets.css' in the Fotocx home folder. You can modify this file if desired. You can delete items or mark them as comments, but do not delete the file - it would be automatically replaced. - - TOPIC: CURVE EDITING +image: retouch.png - Some image edit functions use editable curves. You can manipulate the curves to change some property of the image depending on some other property. The curves can be moved (pulled) with the mouse. An anchor point (black dot) is added to the curve wherever it is pulled, and this point remains fixed - the curve will continue to go through this point as other parts of the curve are pulled. An anchor point can be moved by dragging, or deleted by right-clicking. - - TOPIC: MOUSE PAINTING The mouse can be used to edit an image locally. A circle around the mouse location encloses an image area that is modified as the mouse is left-dragged across the image. The source of the modification can be an edit function, a chosen color, or pixels from elsewhere in the same image or from another image. The image pixels inside the mouse circle are modified to match the source. The rate of change can be fast or gradual, depending on power factors for the mouse center and edge. If the center factor is high and the edge factor low, the image is modified faster at the mouse center and gradually less from center to edge. Left-drag the mouse repeatedly over the same image area to accumulate the changes, until the pixels fully match the source color or image, or the source edit function is fully applied. Right-drag to gradually undo the changes, restoring the original image. - Example: if the edit function is Retouch, and brightness is increased, then the image will brighten within the mouse area as the mouse is left-dragged. Use right-drag to gradually restore the original image. - The [undo-last] button reverses the last paint or erase operation, and this can be repeated to remove many recent edits. Each new mouse drag operation is a unit of work that can be separately reversed. The memory for undo is limited, so only recent paint and erase steps are kept. [undo all] will put the image back in its initial condition. - Use the [undo/redo] button to audit the changes during the edits. - If a {SELECT AREA} is active, the painting is confined within the area. - NOTE: Zoom the image to 100% or more when using a very small radius (e.g. when drawing lines on the image). Mouse movement steps are in screen pixels. If this spans many image pixels and a small radius is being used, some pixels may be skipped by the mouse and are not processed. - - TOPIC: BATCH PROCESSING There are several batch functions in the {BATCH MENU} to speed some common tasks. You can select many image files and execute the batch function for all of them. Batch functions can be used to change file name or type, upright, rescale, copy or move, delete, revise tags, keywords, location/geocoordinates, photo dates. - - TOPIC: SELECT IMAGE FILES +image: select-image-files.jpg - This procedure is used for all functions operating on multiple image files. The procedure is explained here, and this topic is linked from every function using the procedure. • left-click thumbnail: add to selection list • right-click: remove • add multiple: click first thumbnail, shift-click last • [Add All] button: add entire gallery • [Add Current] button: add the current file • a file may be added multiple times to the list • navigate to other galleries to select more files as needed • [Remove] button: remove selected list position • [Clear] button: clear the entire list • up/down arrow keys: step through list, view thumbnails • home/end keys: goto start/end of list - The [Disable] button will disable thumbnail clicking to select files. The button is then renamed to [Enable] - press to restore thumbnail clicking. The purpose of this is to enable the normal thumbnail popup menus and left-click to view a file at full size, which is not possible if thumbnail clicks are being used for file selection. You may need this for deciding selections. You can also stay in file view mode and step through images using the arrow keys, while using the [Add Current] button to add files to the selection list. - - TOPIC: SHORTCUTS There are three shortcut methods for frequently used functions: • Right-click the main window or gallery thumbnail. A popup menu shows some commonly used functions. • You can change shortcut keys and add new shortcuts. See {KEYBOARD SHORTCUTS}. • Collect frequently used functions in a custom menu. See {CUSTOM MENU}. - Keyboard shortcuts are available for the most common functions. Use the menu Tools > Keyboard Shortcuts to view or change them. - The following keyboard shortcuts are fixed and cannot be changed: • [+] [=] key: Zoom image or thumbnails larger • [-] key: Zoom image or thumbnails smaller • Z key: Toggle zoom: 1x <--> fit to window • F1 key: Display user guide for current function • F10 key: Toggle main window full-screen and back • F11 key: Like F10, without menus, title bar, top panel • Escape key: Kill running function, Exit active dialog • Delete key: Dialog to delete or trash the current file • Arrow Left/Right: Show previous/next image in gallery • Arrow Up/Down: Same, but show only last versions • Page Up/Down: Gallery view: scroll one page up/down • Home/End: Gallery view: go to first/last gallery page - The following keyboard shortcuts are defaults that can be changed by the user: • F: File View - change to file view mode • G: Gallery View - change to gallery view mode • M: Map View - change to map view mode • 2: Cycle 2 Files - alternate show most recent two files • 3: Cycle 3 Files - alternate show most recent three files • A: Current Album - show most recently viewed album • T: Retouch - start Retouch edit function • C: Crop - start Crop edit function • K: Keyboard Shortcuts - start keyboard shortcuts dialog • P: Print Image - open print image dialog • R: Rotate - start rotate edit function • U: Undo - undo current edit or last in a series • Shift+U: Redo - redo current edit or next in a series • Ctrl+C: Copy to Clipboard - copy current file to clipboard • Shift+C: Toggle Captions - alternate show / hide captions • Ctrl+G: Show folder gallery for the current file • Shift+G: Toggle Grid - toggle the grid lines on/off • Ctrl+S: Save - start file save dialog - - TOPIC: MOUSE FUNCTIONS - ^File View • left click - Zoom-in: magnify image, centered at mouse • right click - If image is zoomed: restore to window size If not, popup menu with common functions • mouse wheel - Zoom image in or out • left drag image - Pan zoomed image • Ctrl + mouse - Mouse acts on image, not on active dialog - ^Gallery View • left click thumbnail - Change to File View • right click thumbnail - Show popup menu with common functions • middle click thumbnail - Popup big image, zoom with mouse wheel • mouse wheel - Scroll the gallery page up or down - ^Map View • left drag - Drag the map, following the mouse • mouse wheel - Zoom map larger or smaller • left click on marker - Show gallery of images at location • if edit metadata dialog is active, a left click sets geocoordinates - - TOPIC: COMMAND PARAMETERS These parameters can be used if Fotocx is started from a terminal. -help show user guide -home /folder alternate Fotocx home location (see below) -lang xx set language from 2-char. code -recent show gallery of recent image files -new show gallery of newest image files -album albumname album (gallery) to open -prev show last file viewed in prior session -blank show a blank window -dev show normally hidden developer menu -menu manuname Fotocx will start with this menu active -cwp nnn name cycle wallpaper (see below) -x0 -x1 -x2 set index level to 0, 1, or 2 (see below) - ^-x0 -x1 -x2 parameter^ (set index level at startup) These parameters can be used to override the {SETTINGS} value -x0 very fast startup, no image index -x1 fast startup, index old files only -x2 old files + search for new/modified files - ^-home^ parameter (alternate Fotocx home folder) Default Fotocx home folder: /home//.fotocx. This is where user settings and image index is kept. The command "$ fotocx -home " uses designated folder. This enables multiple image collections to be managed separately. See also {MOVE FOTOCX HOME}. - ^-cwp^ parameter (cycle desktop wallpaper) The full command line is: $ fotocx -cwp secs container Use this command to cycle the desktop image from a selected set. 'secs' is the interval between images. 'container' is either a Fotocx album name or a folder containing image files. Add this command to your log-in startup list to get a new wallpaper at specified intervals. Use an interval of a day or more to get a new wallpaper image with each log-in. Fotocx runs in the background without a GUI. If 'secs' is zero, one wallpaper update will be made and then Fotocx exits. Every Linux flavor has a different command. Theoretically, the following are covered: Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: FILE MENU - - TOPIC: NEW SESSION Start a new Fotocx session in a new window. If an image file is edited in both windows, neither instance will see the changes made by the other, and the final result is the last file saved. - - TOPIC: OPEN IMAGE FILE Select an image file to view or edit, using a conventional file open dialog with folders and lists of files. This is useful for the case where files are not indexed and gallery display is very slow, e.g. reading from a camera SD card containing thousands of image files. - - TOPIC: CYCLE 2 FILES Repeating this menu will alternate between the two most recently opened files. This function retains the current image zoom size and position, which is ideal for rapidly comparing two edited versions of the same image file. - - TOPIC: CYCLE 3 FILES This works the same way as Cycle 2 Files, but alternating the last 3 opened files. - - TOPIC: VIEW 360° PANO The current file is opened with a special viewer for 360° panorama files. The image width is assumed to be 360°. Use this function to view Google 'photosphere' images. Pan the image with mouse drag or left/right arrow keys. Zoom with left/right mouse-click. Use Escape to exit the special viewer. - - TOPIC: RENAME Rename the current file (File View), or the file of a clicked thumbnail (Gallery View). Enter a new name and press [apply]. This function can also automate the process of renaming a series of image files using a root name and a sequence number. Open the first image file in the series, input a new name, and press the [apply] button. Use the [next] button to move to the next file if wanted. You can use the same name again by pressing the [previous name] button and then add a suffix or sequence number. Press the [add 1] button to increment the sequence number. - - TOPIC: BLANK IMAGE Create a blank image with specified pixel dimensions and color. This can be used as a background for cutouts taken from other images (via {SELECT AREA}) and annotation text (via {MARKUP} draw text). - - TOPIC: COPY/MOVE The current file (File View) or the file of a clicked thumbnail (Gallery View) is copied to the given location. Select the copy option to copy the file and leave the source file in place, creating a duplicate. Select the move option to move the file from the original location to the new location. A group of files can be rapidly processed by clicking each thumbnail followed by [apply]. The [Prev] button can be used to copy the previously used file name. Add a version number or something else to avoid a duplicate file. - - TOPIC: COPY TO DESKTOP The current file (File View) or the file of a clicked thumbnail (Gallery View) is copied to the desktop folder (/home//Desktop). - - TOPIC: COPY TO CLIPBOARD The current file (File View) or the file of a clicked thumbnail (Gallery View) is copied to the clipboard, from which other applications can paste. - - TOPIC: DELETE/TRASH The current file (File View) or the file of a clicked thumbnail (Gallery View) is deleted or moved to trash, depending on the option selected. Fotocx assumes the standard for trash (~/.local/share/Trash). - - TOPIC: SET WALLPAPER The desktop wallpaper is set from the current image file. - - TOPIC: PRINT IMAGE The print image menu brings up a standard Page Setup dialog where you can select a printer, a paper size, and orientation. After using the [apply] button, another dialog starts for entering paper margins and image scale. - If the image has selected area(s), you are asked if only the area(s) should be printed. These will be printed using the minimum rectangle needed to enclose the areas, and areas outside the selections are not printed. - - TOPIC: PRINT CALIBRATED This function works like Print Image File described above, but before printing you are asked to supply a calibration file which is used to adjust image colors prior to printing. The purpose is to compensate for color shifts caused by the printer and paper type. - - TOPIC: CALIBRATE PRINTER +image: printer-calibrate-chart.png +image: calibrate-printer.png - This utility may be able to improve the color accuracy of printed images. - ^How It Works A chart of colors is printed on the target printer. Some of the printed colors will be slightly wrong due to printer imperfections. This printed page is scanned into a file, and the colors in this file are compared to the original colors that were printed. Any differences are errors that are now known (assuming your scanner is more accurate than your printer - generally true). When an image file is printed, these errors are subtracted from the image colors before printing. The printer adds the errors back, leaving a result that is theoretically correct. My own test showed a modest improvement, detailed below. - Perform the following steps in sequence, as listed in the dialog window. All files are in the folder /printer_color. • Generate and print the color chart file (printchart.png). Use large paper size, vertical orientation, no margins. • Scan the printed chart into a PNG file. Use 300 dpi or more. • Edit the PNG image to crop margins left by the scanner. Save the edited image file. • Process the edited image file to create a color map file. - You can now print using the menu {PRINT CALIBRATED}, which will request the file name of the color map file for the printer and paper you are using. - Scanners can skew a scanned image into a slightly non-rectangular form. If this happens, you will notice it when trying to crop the margins: the fat green margin lines will not align perfectly with the crop rectangle. If his happens, use {PERSPECTIVE} to square the image first, then crop the margins. - When editing the scanned chart image, be sure the darkest row is at the top. Crop the margins surrounding the color tiles. Use the fat green margin line surrounding the color tiles as a guide: cut off this line exactly, leaving only the tiles. Work with 2x magnification while adjusting the crop rectangle. Accurate crop is important. If the crop is not accurate, the calculated tile positions will be offset, and the measured colors could be wrong. A small error is tolerated. You can use the keyboard arrow keys for 1-pixel movements in the crop rectangle. The last corner pulled with the mouse is the corner that the arrow keys will move. - The output color map file can be used only for the paper and printer settings used for the calibration. Any other combination needs its own calibration and color map file. - ^Results^ (my Canon printer) +image: printer-calibrate.jpg +image: printer-cal-study.png - The chart above is a photo of three images: upper left: print of a color chart photo upper right: calibrated print of the same photo bottom: the color chart itself Since all 3 images were photographed together, errors from the camera are equal, making the comparisons valid. - - TOPIC: GALLERY MENU - - TOPIC: GALLERY OVERVIEW +image: image-management.jpg - A gallery of thumbnail images can represent a file folder, the output of an image search, one of the built-in galleries (recent files, newest files), or an album (an ordered list of image files with a given name). Folders should be limited to a few thousand files for practical and performance reasons, but no limit is enforced. - ^Scrolling the Gallery The gallery can be scrolled up and down using the keyboard up and down arrow keys, page-up and page-down keys, or the scroll bars. [home] and [end] keys may also be used. Left-click and hold on the scroll bar, and the gallery will scroll rapidly to the click position. Right click and hold on the scroll bar to make the gallery scroll slowly to the click position. Continue holding the mouse button and move to the side to increase the scroll speed. - - TOPIC: THUMB VIEW Image files in the current gallery are shown as an array of thumbnails. Use the Zoom menu button or the [+] [-] keys to change the thumbnail size. - - TOPIC: METADATA VIEW Image files in the current gallery are shown together with the basic metadata used by Fotocx. If custom indexed metadata tags are defined, these are shown following the standard tags. See {INDEX FILES}. - - TOPIC: RECENT FILES The 1000 most recently seen image files are shown in a gallery, from which you can select files to view or edit. - - TOPIC: NEWEST FILES The 1000 most recently added or modified image files are shown in a gallery, from which you can select files to view or edit. You are given a choice of using the EXIF photo date or the file modification date to determine newest images. - - TOPIC: GALLERY SORT Choose the sort key and ascending or descending order. The Reset checkbox resets all galleries to file name ascending. - If an Album gallery is sorted, the output does not replace the album but creates a new album named -sorted. - ^File Name/Number This is a modified sort by file name. If multiple files have names that differ only by embedded numbers in the same position, this group of files will be sorted in the order of the embedded numbers. The example here illustrates the difference: alphabetic order: xxx1xx xxx11xx xxx123xx xxx3xx numeric order: xxx1xx xxx3xx xxx11xx xxx123xx - ^Metadata from Search Function If the gallery was generated by the {SEARCH IMAGES} 'metadata report' option, and if you added optional metadata tags to the standard report, you can sort the gallery by these metadata tags. You can sort the gallery by camera make, lens info, ISO level, exposure time ... any available metadata. - - TOPIC: GALLERY FILTER Select a subset of the current gallery to create an album named "gallery_filter" containing the selected image files. ^Selection options: • all files: select all image files • originals: original files (no version number) • versions: versioned files (have been edited) • last versions: last versions (or originals if no versions) • rating range: files with rating within the given range • keyword names: files having any of the given keywords (comma separated) • filename text: files with any of the given text strings (comma separated) - - TOPIC: GALLERY HOME TOPIC: GALLERY END Jump to the first or last thumbnail in the current gallery. - - TOPIC: CURRENT FILE FOLDER Set the current gallery from the current image file. This is handy if you want to return to the current file gallery after doing something else. - - TOPIC: RECENT FOLDERS Set the current gallery from a recently used gallery. This lets you more easily go back and forth among recent galleries. - - TOPIC: FOLDER TREE +image: folder-tree.png - All TOP image folders are shown initially. Click on [+] to unfold subfolders, or on [-] to fold them back in. You can click on any folder to get a gallery of the images in that folder. Keep the window open to navigate anywhere in your image collection. This function is also available using the [TOP] button in the gallery top panel. - - TOPIC: SELECT FILES Pre-select image files for use as inputs for creating albums or for batch functions. These functions will use the pre-selected files by default, but you can also modify these or start over. See the process {SELECT IMAGE FILES}. - - TOPIC: BOOKMARKS View existing bookmarks. Bookmarks are chosen locations (folder/file names) with user-assigned names. Click on a bookmark to show a gallery of thumbnails starting with that location. Select [Edit Bookmarks] to add, delete, or rename a bookmark. - - TOPIC: EDIT BOOKMARKS After starting Edit Bookmarks, click on a gallery thumbnail to add this location to the bookmark list. The assigned bookmark name will initially be the file name for the thumbnail. You can edit the name. If you select an existing bookmark with a mouse click, its name is shown in the input field. You can change the name or press [delete] to remove the bookmark. New bookmarks are inserted after the last bookmark location selected. To change the order, edit the file "bookmarks" in the Fotocx home folder. - - TOPIC: MAPS MENU - - TOPIC: WORLD MAP +image: map-click.jpg - This is an internet world map that can be scaled (zoomed in and out) from street level to continent level. Use the mouse wheel to zoom the map in/out. Drag the map to change the center. The map has markers (red dots) corresponding to images having geocoordinates in their metadata. Click on a marker to get a Gallery View of images at this location. Images located within the marker area on the map are selected. The effective marker area scales with the map scale. Zoom-in to expand the scale and possibly separate one marker into multiple nearby markers. - - TOPIC: SHOW ON MAP Show the position of the current image file on the world map. If multiple markers are overlapping, zoom-in until a single marker is at the center. - - TOPIC: ALBUMS MENU - - TOPIC: ALBUMS An album is an arbitrary set of images that is manually assembled from existing images. An album is a list of its member image files. The image files themselves are not copied or changed. A given image file can be a member of multiple albums, or may be present more than once within an album. You can add and remove images in an album or rearrange their order. Once an album is made, you can select it by name and it shows as a gallery. - - TOPIC: CREATE ALBUM Enter a name for a new album. You can make an empty album, an album with pre-selected image files from {SELECT FILES}, an album with images from the current gallery, or you can select the initial images for the album. - - TOPIC: RENAME ALBUM Choose an existing album and enter a new name. - - TOPIC: DELETE ALBUM Choose an existing album and delete it permanently. - - TOPIC: CHOOSE ALBUM A list of available albums is presented. Choose from the list. - - TOPIC: CURRENT ALBUM Set the gallery from the current (last used) album. - - TOPIC: GALLERY TO ALBUM Save the current gallery as an album. Select an existing album name [Browse], or input a new name. - - TOPIC: EDIT ALBUM Right-click an album thumbnail and select from the popup menu: • Add selected files here - previously selected files are added here (click thumbnail left/right side to add before/after thumbnail). • Add the current file (File View) here - works the same way. • Remove from album - the clicked file is removed from the album. - ^Drag and Drop You can rearrange images in an album by dragging thumbnails with the mouse. Drag the thumbnail until the mouse cursor changes to a small thumbnail image. Continue dragging this image to the position where it should be inserted, and release the mouse button. Position the mouse roughly between the thumbnails where the dragged image is to be inserted. If the drag approaches the top or bottom edge of the window, the gallery will scroll to bring more images into view. You can use two Fotocx sessions to make the selection or movement of many images faster. Drag and drop images from any source gallery to a target album position. - If you rename or move a file using Fotocx, any album links are updated and the file remains in the albums containing it. If you do this outside of Fotocx, the album links are lost and the file disappears from the album. - If image files are renamed or moved using Batch Convert or Batch Copy/Move, be sure to select the option to replace album files if this is wanted. Otherwise you will have to replace them one at a time. - Do not rename folders if they contain images in albums. Album links will be lost. Instead, use Batch Convert or Batch Copy/Move to move the image files to the new folder, then delete the old folder if empty. To delete image files, use Batch Delete/Trash. This will also purge deleted files from albums. - - TOPIC: UPDATE ALBUMS +image: album-replace-file.png - Replace specified album files with specified replacements, or add specified new files after specified existing files. Select one or more albums to be processed. In gallery view, click on two thumbnails to specify 'old file' and 'new file' in the above dialog. Select the option: 'new file' replaces 'old file' wherever found, or 'new file' is added to albums after 'old file'. Press [proceed] to process the albums. After processing, the dialog is repeated with the same albums selected and the same 'replace or add' option. You can select two more files and press [proceed]. - - TOPIC: ALBUM MASS UPDATE +image: album-mass-update.png - This is a utility for mass updates that you may need after creating new versions for many image files and needing to update one or more albums to the new versions. This does not cover every need, which is likely impossible, but hopefully will reduce the need to change one file at a time. - Select one or more albums and then select one of the processing options: • Replace all with newest version only: Albums are updated to have only the newest file versions. • Replace all versions with newest version: All file versions are replaced with only the newest version. The original file, if present, is NOT replaced. • Add newest versions to existing versions: The newest version is added to existing versions, if missing. • Replace all with original and all versions: All files are replaced with the original file and all versions. • Replace all with original version and newest version: All files are replaced with the original file and newest version. • Replace all with selected versions (*): All files are replaced with the selected versions only. This includes the original (unversioned) file. • Replace all versions with selected versions (*): All file versions are replaced with the selected versions only. The original file, if present, is NOT replaced. • Add selected versions to existing versions (*): The selected version is added to existing versions, if missing. • Replace all with original and selected versions (*): All files are replaced with original files and selected versions. - (*) The four options using selected files: the list of selected files is from the function {SELECT FILES}. Album files that do not match any selected files are left in the album. Only files that match a selected file are changed according to the above rules. The matching is based on the file name without version or extension: 'asdfg.png' and 'asdfg.v01.jpg' are a match. - Example: Replace all versions with selected versions: If the album has filename.jpg and filename.v02.png, and the selected files list contains filename.v04.jpg, the result in the updated album will be: filename.jpg and filename.v04.jpg - - TOPIC: SLIDE SHOW +image: slide-show.jpg - ^Monitor Fractional Scaling For some systems, fractional scaling causes performance problems for Fotocx slide show animations. Disable this and use other means to increase the font size for applications, if needed. For Fotocx, font size is in the menu {SETTINGS}. - In the slide show dialog (top left), press [Select Album] and choose an album from the list provided. Change the other settings in the dialog as desired, then press the [Start] button to start the slide show with the first image in the album, or [Resume] to resume a paused slide show, or another image selected by clicking its thumbnail. Use the escape key to exit the slide show and return to the dialog. - Main Dialog Controls • Caption Time: seconds to show title and description. • Image Time: seconds to show the image alone. • Clip Limit %: clip images up to this amount to eliminate margins. • Full Screen: If checked, images are shown full-screen without menu, etc. • Auto-replay: If checked, the slide show will start over after the end. • Random Image: If checked, use random image order. Otherwise album order. - Keyboard keys can be used to control the slide show. Press [keyboard] to view. - The following keyboard keys are assigned to actions and cannot be changed: • Escape: interrupt the slide show and return to the main dialog. • Left / right arrow keys: You can go back and forward at any time and the slide show will continue from there. - The animated transitions between images, and the display times and zoom behavior of individual images, can be customized using the dialogs explained below. - Press [transitions] to start a dialog to select and customize the transitions between images. These include many animated methods of image replacement (e.g. the new image expands from the center to replace the old image). Select the transitions to be used and whether they are used randomly or in sequence. The time parameter sets the duration of the transition. The preference parameters specify a relative preference which will influence how frequently the transition is used when random sequence is selected. - The buttons [load] and [save] allow you to save transition settings in a file and load them later. These files are independent of the slide show files. A slide show will default to the transition settings last used for that slide show (album name), but you can always replace these by using the [load] button to load some other settings, or changing them in the dialog. - Press [image files] to start a dialog for Image Preferences (top right). These are optional. An image is selected for customizing by clicking its thumbnail in the album/gallery display. The dialog is filled-in with default settings or the previous settings for this image in this slide show. Enter revisions and press [done], or click on the next image to be customized. - Preference: If random image sequence is chosen, this number gives a relative preference for the image. The neutral value is 10. Enter a new value to increase or decrease the probability that this file is chosen in the random sequence of images, e.g. a value of 20 would make the probability 2x greater. A value of zero would prevent the image from being shown. The image is also blocked for a count of 1/3 the images in the album, or 10, whichever is smaller. - The dialog shows the customizable image events in time order: • wait for a specified time (may be zero). • show the following text tags in parallel: image name (file base name) for specified time, image title, if any, for a specified time, image description, if any, for a specified time. • wait a specified time before starting an image zoom (may be zero). • zoom the image from normal to magnified or the reverse, over the specified time. If neither option is selected, there is no zoom. • zoom-in: start at normal size, magnify the image while moving the zoom center to the specified position. • zoom-out: start at magnified size at the specified zoom center, shrink the image back to normal size. • [zoom center] - press this button, then click on the image thumbnail to specify the zoom center for the image. • wait for a specified time after zoom (may be zero) (the default value is the main dialog 'image time' setting). • transition to the next image, using the specified transition or 'next' to indicate no preference (randomly selected). - - TOPIC: CUSTOM MENU +image: custom-menu.png - This enables you to collect frequently used functions from multiple menus into a single custom menu. You can also add entries to open specific image files or albums. The menu also includes script functions and plugin functions (see below). - The last entry in the menu, Edit Menu, opens a text editor for editing the menu list itself. The menu names must exactly match the names in the Fotocx menus, but case is not significant. - Menu entries can take the following formats: • # comment text: a comment that does nothing • menuname # popup tip: Fotocx menu name and optional popup tip • file : open named file • album : open named album as gallery - The following entries are present by default and you should not change or remove them: Edit Script, Run Script, Batch Script, Plugins, Edit Menu. Details are explained below. - - TOPIC: SCRIPT FILES Menu Functions: • Edit Script - Perform a set of edits on one image file, recording all functions and settings in a named script file. • Run Script - Run a script file using the current image file, like an edit function. • Batch Script - Select any number of image files and run a script file on all of them, in batch mode. - Script files allow you to define a set of edits once, and repeat them on single or multiple image files at a later time. - ^Scriptable Edit Functions Some edit functions use mouse drags on the image, e.g. all warping functions. These are not scriptable because mouse drags are not recorded. Using these functions is blocked. - The following functions are currently scriptable: • Edit: Retouch, Margins, Color Mode, Area Fill • Repair: Sharpen, Blur Normal, Blur Graduated, Denoise, Defog, JPEG Artifacts, Anti-Alias, Adjust RGB • Refine: Flatten Histogram, Local Contrast, Amplify Contrast, Global Retinex, Local Retinex, Local Contrast, Saturation, Soft Focus, Brightness Ramp • Effects: Outlines, Sketch, Cartoon, Emboss, Tiles1, Tiles2, Painting, Texture, Pattern, Dither, Engrave, Set Colors, Shift Colors, Custom Kernel - - TOPIC: EDIT SCRIPT In the dialog, press [start]. Choose a file name for the script. Begin editing the current image file. Use desired edit functions in any sequence. Each edit is recorded in the script file along with all the dialog settings used. When finished, press [close] to close the script file and save it with the given file name. - - TOPIC: RUN SCRIPT Choose one of your saved script files from the popup menu. The script is executed using the current image file, like a normal edit function. - - TOPIC: BATCH SCRIPT In the dialog, press [Select Files]. Select the files to edit using the standard file selection dialog {SELECT IMAGE FILES}. When done, press [Select Script]. Choose a script file from the popup menu. The script is now executed on all of the chosen files. All modified images are saved as new versions. If RAW files are processed, the corresponding outputs are TIFF-16 files. - - TOPIC: PLUGINS +image: plugins.png - Plugin functions are a way to use other image editors within Fotocx, e.g. Gimp. You can use a RAW image editor like Rawtherapee and then perform additional edits using Fotocx. - ^Usage procedure: • Open the file to be processed in Fotocx • Start the plugins menu and select desired program, e.g. Gimp • The plugin program starts and opens the file passed from Fotocx • Perform the desired edits using the plugin program • When done, save the output file with the same name as the input file. The file .ext can change. • Close the plugin program. • Fotocx opens the plugin output file as an edited version of the current file. • Perform additional edits, or save the edited file as a new version or new file. - An example Plugins menu is on the left. The last entry "Edit Plugins" starts the text edit application on the right. Use the text editor to define the plugin menu names and the commands to start the corresponding plugin programs. The format is: menuname = plugin-command %s TIP = explanation of above command The 'plugin-command' is the shell command for the plugin function, and '%s' is where the current file name is inserted into the command. Do not put quotes around the '%s' because this is added automatically, allowing file names with blanks or other special characters to be processed. The top example shown is a menu named "Gimp" which starts the command "gimp %s". The TIP text is optional. If present, it is on the line following the menu name. Hovering the mouse over the menu entry will show this text next to the menu text. - Some commands may expect both input and output files to be specified. In this case supply '%s' in both positions. Omit '%s' if the command does not process an image file. - ^Select Area If the input file has a selected area, only this area will be modified. The plugin function edits the entire image, but when the result is processed by Fotocx, only changes in the selected area are kept. - - TOPIC: ZOOM - ^Zoom Button Left or right-click the button to increase or decrease the image size in {FILE VIEW} or thumbnail size in {GALLERY VIEW}. This applies only if the gallery view mode is {THUMB VIEW}. If {METADATA VIEW}, nothing is done. - - TOPIC: PREV/NEXT - Left or right-click the button to open the previous or next file in the current gallery. You may also use the left/right arrow keys. - - TOPIC: FILE SAVE - +image: file-save.png - +image: file-save-as.jpg - In the first dialog, select 'new version', 'new file', or 'replace file'. - ^New Version Save the current image file with a new version number. File names with version numbers are formatted "filename.vNN.ext" where NN is a number 01 to 99. If the file name has no versions, version .v01 will be created. If file versions are already present on disk, then the next higher version number is used. If the file is a JPEG file, the default quality is used - see {SETTINGS}. - ^New File The 2nd dialog shown above will open to save the current image to a selected file, which can be the original file, another existing file, or a new file. A file can be saved in formats JPEG, PNG, JXL and TIFF. - For JPEG, you can choose a quality value in the range 1-100. Lower values give smaller files and less image quality. Values above 70 are difficult to distinguish from 100 (highest quality, largest file size). The default JPEG quality is used unless you change the value in the dialog. The default is from {SETTINGS}. You will not be able to see a difference between a file saved with quality 70 and one with 100, but the difference in file space is huge. Transparent areas will be black. JPEG does not support transparency. - PNG and TIFF files are compressed without loss of quality and much larger than JPEG. They may be saved with 8 or 16 bits per color. - If 'make current' is checked, the saved file (new file name) will become the current file. - ^Replace File Save the current image file back to itself. - The ^permissions^ are copied from the input file. Press the [Change] button to edit the permissions. - - TOPIC: METADATA MENU - - Metadata is text data that is stored inside an image file. Digital cameras create some metadata automatically, such as date and time, technical data about the camera and photo parameters, and location data (if the camera has a GPS receiver). Other data can be added by the user, e.g. a title, description, rating, keywords. Fotocx can search your image collection using any metadata, along with folder and file names or partial names, producing a gallery of matching images. In most cases, the search is almost instantaneous. - - TOPIC: VIEW MAIN META TOPIC: VIEW ALL META +image: view-metadata.jpg - The View Main Meta functions displays commonly useful metadata for the current image file. This includes the date and time of a photo, shutter speed, focal length, image size, ISO, etc. Digital cameras store this data in the image. Metadata may also contain data added by a user: keywords, title or caption, description, comments added by the photographer or later editor (sometimes found in published images). - If an image is edited, a record of the edit is saved in the metadata. View Main Meta shows the history of edits made. - View All Meta reports all available metadata, and can include over 100 items you likely don't care about. - The [Extras] button on the View Main Meta window opens the dialog shown on the right, where you can add extra tags to the report. Any tag available in the View All Meta report can be added to the short report. Click a tag in the left column to add it to the right column and to the report. Click a tag in the right column to remove it. Click the entry "Other Tag ..." to type-in any tag name not contained in the default list, which is limited to the most likely needed tags. - Fotocx uses these metadata tags for image editing and searching: • Title - short title of image • Description - description of image • Date/Time Original - photo date/time • Rating - 0 to 5 stars • Country - from camera GPS or manually added • Location - EXIF name is city • Geotags - latitude/longitude • Keywords - image identifiers from user • Camera data - make, model, lens • Exposure data - time, F-number, focal length, ISO These tags are edited using the function {EDIT MAIN META}. Any other tags may also be edited and searched, using less convenient methods explained below. - There are also several batch functions for adding data to many image files at once. See {BATCH MENU}. - - TOPIC: KEYWORDS OVERVIEW Image files can have identification or classification keywords. These can be used to search a large image collection for images having desired keywords. Typical keywords: subject, event, location, persons or things, etc. Keywords reside inside the image metadata. Keywords are normally one word, but a short phrase with embedded blanks or other delimiters can be used. Commas and semicolons are used as delimiters between keywords, and therefore cannot be used within a keyword (an external standard). A compound keyword like "arizona scenery" is allowed, but you should use two keywords instead for more flexibility: you can search for images having either keyword or both keywords. - All images having a desired keyword or keywords can be found quickly and displayed in a gallery window. If you have used folder and file names in a meaningful way, you can also search for images using these names. You can also search images by date, rating, location, and other metadata tags. These need not be duplicated in keywords. See {SEARCH IMAGES} below. - ^Managed Keyword System This is appropriate if you wish to plan your keyword system before adding keywords to your images. In this system, you create a limited number of keyword categories (e.g. people, places, things, events, art, scenery ...). Keywords can be created and assigned to a category as needed when keywords are assigned to images. An image is given a keyword by pointing and clicking on the list of available keywords, which is organized by category and alphabetically within category. If a new keyword is needed, it is created when first assigned to an image. The number of keywords within a category should ideally be less than about 200, so that visual location from a pick-list is reasonably fast. - ^Managed keyword system advantages • prevent inconsistent keyword names (e.g. 'landscape' and 'scenery') • prevent alternate spellings and typos (e.g. susan, susy, susna) • prevent keywords that include other keywords (e.g. scenery, lake) • searching is more reliable because keywords do not have above errors • when assigning keywords, you have an overview of available keywords, rather than thousands of chaos keywords in an unmanaged system - Picking keywords from a large list can be slow. This is mitigated in 3 ways: • Up to about 10 most recently used keywords are shown in the edit metadata dialog, where they can be easily seen and chosen. Since a series of photos made at the same time will likely share many keywords, adding keywords is made easier and faster. • You can simply start typing a desired keyword name. A popup list of matching keywords appears as soon as there are only a few possible matches. You can then click the desired keyword to add it to the image. If there are no matching keywords, you have the option of adding the new keyword to the list of defined keywords. • You can choose a category to display a smaller picklist. - If keywords are broadly defined and fewer in number, search results for keywords will be larger, but finding the desired images visually can be quite fast. Physical file order is preserved: image files located together in their folders will also appear together in search results. - Images downloaded from the internet often contain keywords. These of course have no organization and are collectively chaotic. If you use a managed keyword system, it is best to review such images and clean up the keywords to conform with your system, or delete them. Whatever new keywords are present will be automatically added under the category "nocatg". If you notice unwanted keywords in your keyword list, use {SEARCH IMAGES} by keyword to find the images with unwanted keywords so they can be fixed or removed. - ^Random Keyword System You may prefer to invent keywords as needed with no particular system in mind. Or you may already have thousands of keywords, making a conversion to a managed keyword system difficult (but not impossible: Fotocx can mass-convert keyword names). In this case, you can simply type keywords into your images, creating new keywords as needed. There is still some capability to keep keywords organized: existing keywords matching the characters you input are shown as soon as there are only a few possible matches. Example: you type "new" and a list of keywords is shown: New York, New Delhi, Newman ... If one of these is your intention, you click on it to select the keyword. If not, you keep on typing and eventually press Enter to create a new keyword. When searching images for keywords, you can type desired keyword names or pick them from the list of available keywords. Available keywords matching the first few letters you type are shown, and you can pick from this list. You cannot enter a search keyword that does not exist somewhere in your images. A random keyword system will likely result in thousands of keywords. This may not be very useful. - - TOPIC: GEOTAGS OVERVIEW Modern cameras can record the location of each photo, using an internal GPS receiver. Latitude, longitude (and possibly city/location and country) are recorded in the EXIF metadata of the image file. The {EDIT MAIN META} function also allows location data to be entered or revised. Locations may also be specified by clicking on a zoomable world map. Functions to find images for a specified location or region: • {SEARCH IMAGES}: Search by location name (also multiple names, partial matches). • {PLACES/DATES}: Search by country, location, and date groups • Images by Map Location: Click on a map marker to show all images at the marker location. - Location names (city or other place name, and country) from the camera GPS are not standardized and may be chaotic (e.g. Munich, München, MONACO). How to deal with this is discussed below. - - TOPIC: EDIT MAIN META +image: edit-meta.jpg - The Edit Main Meta function is used to add basic metadata to an image. Please read {KEYWORDS OVERVIEW} and {GEOTAGS OVERVIEW} (above) before using Edit Main Meta. - Edit Main Meta is used to edit the most frequently used metadata: image date and time, rating, title, description, location data, and keywords. The dialog initially shows data for the current image. After making additions or changes, press [Apply] to update the image file. There is no automatic file versioning for metadata changes, but you can use File Save > New Version if wanted. - The dialog shows the metadata for the current image in File View, or for a clicked thumbnail in Gallery View. The edit dialog updates itself when a new image is opened or new thumbnail is clicked. - The date of the image, if available, is shown as Image Date. This may be entered if missing, or changed. You can enter a full date in the format yyyy:mm:dd or a shorter format yyyy or yyyy:mm. A missing month/day is logically equivalent to 01:01 when compared with a low limit for searching, or 12:31 when compared with a high limit. The [Prev] button fills-in the date from the previous data entered. This is to allow easy dating of a series of images. If time is important, you can add a time using format hh:mm[.ss]. The entire entry format is: yyyy:mm:dd hh:mm:ss - You may enter a title, description, and a rating (0-5 stars) for the image. To edit the title or description, press the corresponding [edit] button. This will pop-up a text editor with a large limit on the size of the text. You can use the [enter] key for a deliberate line break. In Fotocx, these line breaks will work; in other image viewers, they may be replaced with periods. - Existing keywords are shown in Image Keywords. Available keywords are shown in the Defined Keywords window below. One of these keywords can be added to the image by clicking it. A keyword can be deleted from the image by clicking it in Image Keywords. Recently added keywords are shown in Recent Keywords. This is a convenience to make adding keywords to a new batch of images easier, since many of the same keywords will be used again. Point and click the same way. - If the list of defined keywords is long, it may be easier to type the desired keyword into Enter Keyword. Existing keywords matching what you have typed so far appear in Matching Keywords, and you can click on one of these to add the keyword to the image. If the input keyword is new (no matching keyword is shown), press [add new keyword] when the keyword is complete. It will be added to the image and to the list of defined keywords with category "nocatg". - If you are using keyword categories, you can select a category, and only those keywords will be shown in the list of defined keywords. - The [Apply] button writes the data to the image file and to the metadata index file used for searching images. - The [Prev] button (at the dialog bottom) can be used to load all available data from the previous image viewed or edited. This can be used to speed-up the processing of a group of images sharing much of the same data. - ^Adding Geotags There are several ways to add location names and geocoordinates in the {EDIT MAIN META} dialog. - Camera GPS Your camera GPS sensor may have inserted location names and geocoordinates. The language may not be the one you want, or all-capital letters may be used, or some other chaos. Use the [clear] button to start over, and enter the new text. - [Find] Button Search for a location present anywhere in your image files or in a huge list of known locations (worldcities.txt). Enter a few leading characters into Location and press [Find]. If a pick-list of matching locations is shown, choose one. If nothing is shown, use [Map] to click on a map location. Revise the location and country names if needed. This location is now known and available to choose from. - [Previous] Button If the image being edited has the same location data as the previously edited image, press [Previous] to fill the location data used before. - You can use {BATCH GEOTAGS} to add location data to many image files at once. - - TOPIC: EDIT ANY META +image: edit-any-metadata.png - This is a dialog for editing any metadata for the current image file. The most common tags for editing are listed on the left. Press the [Full List] button to get a list of all available tags for the current image file (there may be hundreds of them). Press [Short List] to go back to the common tags list. Click a tag in the list to retrieve the current tag value. Change the value if wanted and press [update]. To edit a tag name not in the list, enter the tag name and press [fetch] to retrieve the present value, if any. Then enter or change the value and press [update]. To delete a tag, press [delete]. You may enter the tag name in lower case and with or without spaces, e.g. "Subject Distance" and "subjectdistance" will both work. Some tags cannot be changed, e.g. 'image width' is the image pixel width, which can only be changed by changing the image pixel width. The source for the short list is the text file /meta_picklist. You can add or remove tags from this list. - - TOPIC: DELETE META Specify the tag name to delete, or select All. The metadata is deleted. Use All to clean an image of any identifying information that may be present. Some tags are not deletable, e.g. File Name. - - TOPIC: COPY META Combined images created with Fotocx (HDR, panorama, mashup ...) will not contain metadata by default. Use this function to copy metadata from one of the input images, or any other image. Use the [Browse] buttons to choose a file to source the metadata and a file to receive the metadata ("target file" in the dialog). - - TOPIC: FIX META Use this function if you have an image file that produces an error message when you try to edit the metadata. It will delete malformed metadata and keep the rest. - - TOPIC: MANAGE KEYWORDS +image: manage-keywords.png - Create keywords and optionally group them into categories. You can assign categories to keywords to help organize them and locate them more quickly when adding keywords to images. They are optional and they play no role in keyword searching: only the keyword is stored in an image, not its category. Typical categories are people, places, things, events, scenery, buildings, art, etc. To add a new keyword with a new category, enter the category and the keyword, then click [create]. If the category is blank, the keyword will be assigned to "nocatg". To assign a keyword to a different category, click a category (bold text) or enter a new one, click the keyword, and press [create]. The keyword will move from the old to the new category. To delete a keyword, click the keyword and press [delete]. Keywords used in images but not assigned to a category will appear under "nocatg". A Category with no keywords assigned can be deleted - click the category, clear the keyword name if present, press [delete]. - Note: a newly created keyword is appended to the end of the keyword list for its category. The next time Fotocx is started, all categories and their keyword lists are sorted alphabetically, except that "nocatg" is always last. - - TOPIC: CAPTIONS +image: choose-captions.png - ^Choose Captions menu Choose which metadata tags to use for text captions displayed in the top left corner of the image in file-view mode. - ^Toggle Captions menu Toggle the display of captions ON or OFF. Assign a keyboard shortcut to quickly enable or disable captions display. - ^Note:^ moving the mouse to the top left corner of an image in file view will show the title and description in a popup image. The image disappears when the mouse if moved away. - - TOPIC: PLACES/DATES +image: image-locations.jpg - This is a fast way to find all photos made at a given location or location and date range. In the dialog, choose from the two options: include all images in the report, or include only images found by the previous Search function. Then select the desired grouping level: country country and location country and date country and location and date date and country date and country and location - If date is included, select a range of days for consolidation: photos with dates within range will be grouped together under the first date. Press [proceed] to get a report showing the count of images in each group: by country, country and location, etc. This is also the sort order. In the above example, 28 photos are from New Zealand on 2004.11.02. Click on a line in the report to get a thumbnail gallery of those images. - - TOPIC: TIMELINE +image: timeline-report.jpg - This report produces a timeline of image counts by month. Choose from the two options: include all images in the report, or include only images found by the previous Search function. Click on a year and month in the resulting report to get a thumbnail gallery of all images with a photo date (EXIF) in the selected month. The example above shows 208 images for Oct. 2017. Year 'null' is for images without a photo date. - - TOPIC: METADATA TAGS This function finds all image files using a specified metadata tag and value. Select a tag from the popup list: rating, keywords, title, description, camera, extra indexed metadata - see {INDEX FILES}. A list of available tag values is shown, along with the number of image files using this tag value. For 'title' and 'description', only the first 60 characters are shown, and all files are reported which use tag values matching these initial 60 characters. For 'camera' the match value is a combination of make, model, and lens. - - TOPIC: AUTOSEARCH This function can be used by shell script files to extract image files meeting any of the selection criteria available when using the Search Images function (see below). First, use the Search Images function to set desired selection criteria (e.g. folder/file names, dates, keywords, or other metadata). Use the [save] button to save the criteria in a settings file. Use the following command to start Fotocx and perform the search: $ fotocx -m autosearch . The output goes into /search_results. - - TOPIC: SEARCH IMAGES Use the Search Images function to find images having any desired metadata (date, keywords, location ...). A metadata index file is used for searching, which makes it possible to search thousands of images per second. - There are two report formats: a gallery of thumbnails showing all images that match the search criteria, or a metadata report which combines thumbnails with metadata text. Here is an example of the metadata report format: +image: search-images-metadata.jpg - ^Search Dialog +image: search-images.jpg - In the dialog, select which images to search, either all (all images) or the current set, meaning the images in the current gallery, which can be a folder, album, or the results of a previous image search. - Next, choose what to do with the matching images found: 'new set' means replace the current set with the images found, 'add' means add them to the current set (gallery), and 'remove' means remove them from the current set. To remove images, you must search the current set. - For files matching the select criteria, you may additionally specify which versions are selected: original, last version, or all versions. 'original' means the original or unmodified image (or the first version if the original was not saved). 'last version' means the latest or last edited version available. 'all versions' means that the original and all versions will be retrieved. - Select the desired report type. The gallery report is a page of thumbnail images, as long as needed to hold all the images that match the search criteria. The metadata report has both thumbnail images and a list of metadata tags beside each thumbnail. These include the standard tags (date, rating, keywords, geotags, title, description) and any other metadata tags you added in the tag selection list (see below). - Enter your search criteria. Select desired keywords, dates, star ratings, words contained in text (image title or description), file or folder names, and location names. See more details below. - Available keywords are shown in Defined Keywords and can be chosen with point and click. If the list of defined keywords is long, it may be easier to begin typing a keyword into 'enter keyword'. Existing keywords matching what was typed so far will appear in the 'matches' list, and you can click one of these to add the keyword to the search list. - If you are using keyword categories, you can select a category, and only those keywords will be shown in the list of defined keywords. - A date range may be entered to restrict the search to images within the date range. Choose photo date (from camera) or file date (creation or last modification date). The format is yyyy:mm:dd. Images are selected which have a date on or after the first date, if present, and on or before the second date, if present. Missing month/day default to 01/01 for the low date limit and to 12/31 for the high limit. Times may optionally be specified using the format yyyy:mm:dd hh:mm. Missing times default to 00:00 and 23:59. - To search for images having no EXIF photo date (e.g. scanned images), use "null" in the first date input. - A pair of star ratings may be entered to restrict the results to images having a rating within the given range. A missing low value implies 0 stars, and a missing high value means the highest rating, 5 stars. - Folder and file names may be searched. In the field search file names, enter any number of names used for your image folders and file names, separated by commas. An input of "egypt cairo" would match all image folder or file names containing either of these strings. Substrings will also match. Case does not matter. - Image title and description may be searched. Enter the words to search for in the field search title/desc, separated by commas. These will be matched to every word in the title and description of all images, and matching images are selected. Case does not matter. - To search locations, enter one or more city/location or country names in the search locations field, separated by commas. Only image files with geotags matching one of the entered locations will be selected. A location may be a city, park or other geographical name (whatever is stored in metadata 'City' and 'Country' fields). Case does not matter. - The radio buttons 'all' and 'any' apply to keywords, text, file names, and locations. You can select images having ALL the entered strings, or ANY of the entered strings. Example: if the location search field is "new york" and "any" is selected, images from New Zealand and York, England would be included. If "all" is selected, only images located in New York would be included. - If you wish to find images with missing data, you can enter "null" as a match value. - ^Search Additional Metadata Using the dialog inputs 'tagname', 'condition', and 'match values' you can specify additional metadata tags to use as select criteria, or to be added to the report output if the "metadata" report type is chosen. The tags available for a given image file can be shown with {VIEW ALL META}. These include many tags not present in the main dialog. The pick list comes from the text file /meta_picklist. You can add tags to this file if wanted. You can use tags which are also present in the main dialog. The advantage here is that more flexible matching logic can be used. - The matching logic can be selected for each metadata tag. ^match method match value for selection • report any value, also missing • reportx value not missing • matches comma separated text values • contains same, with substring matching • number = equal values • number => equal or greater values • number <= equal or less values - The [X] buttons on the right side can be used to clear single metadata search tags. - ^Dialog Buttons [Load] and [Save] can be used to load or save search criteria from a file. [Clear] will clear all data in the dialog. [Proceed] will start the search process. - Press the [proceed] button to perform the search. The output is a standard gallery of thumbnails, or the metadata report format shown above. You can save the searched images as a permanent album - see {ALBUMS}. - ^Performance Searching and reporting of indexed metadata is almost instantaneous. The speed for non-indexed metadata depends on computer and disk speed. A strong computer with SSD disk can search over 100K files per minute. - ^search_results^ (album) The output of Search Images is saved in the album "search_results". Rename this album if you want to keep a later search from replacing it. - Limitation: The search function is limited to 40,000 results (images found that meet the search criteria). If this limit is exceeded, you are notified and the search is truncated. This limit exists because the size of a scrolled window in GTK is limited, and an attempt to create a larger window may result in a crash or lock-up. - - TOPIC: SELECT MENU - - TOPIC: AREA OVERVIEW Edit functions normally apply to the entire image, but it is possible to edit part of an image (an "area") and leave the rest unchanged. If an image area has been selected, then most edit functions will work only within this area. Some functions (e.g. Rescale) ignore a selected area. An area may be selected before starting an edit function, or while an edit function is being used. The selected area is immediately active, prior edits are retained, and future edits will apply only within the area. If another edit is started, the selected area remains active, so it is possible to carry out a series of edits within an area. An area may also be multiple unconnected areas in the image. - Fotocx uses 'areas' instead of 'layers'. Instead of selecting something from the image, making a separate layer from the selection, editing the layer and finally merging the layer, you select something in the image, perform edit functions on the selection, and you see the end result immediately. Areas can also be saved, pasted into another image, moved around and rescaled, and further edited. - +image: edit-selection.jpg - Editing a selected area can sometimes result in visible boundaries at the edges of the area (sometimes these correspond to feature edges in the image, and therefore not a problem). You can blend edges using {AREA BLEND}: edits can be applied gradually from the area edge inward, and you can select which edges are blended. - - TOPIC: SELECT AREA +image: select-area.jpg - The Select Area dialog starts with the menu Select > Select Area. Select one of the methods explained below. Each method selects image areas in a different way. You can change methods at any time, and the selected areas accumulate. An outline of the selected image area(s) is shown as you add or remove areas from the selection. The [Finish] button is used to map the image pixels within the area outlines, making them ready to apply subsequent edit functions. The [Hide] button hides the area outline, giving you better visibility of edits and possible area edge effects. Use the [Show] button to show the area outline. The [Clear] button removes all area selections. The select area dialog can be canceled and re-started later to modify existing areas or add new ones. - ^Methods The following methods are used to enclose one or more image spaces that will belong to the final area. These methods may be used in any sequence to define spaces that are either joined or detached. • Rectangle - drag to outline a rectangular area • Ellipse - drag to outline a circular or elliptical area • Freehand Draw - outline an area by drawing with the mouse • Follow Edge - outline by following image feature edges • Select area within mouse - drag to select pixels within a circle around the mouse pointer. • Select one color within mouse - select only pixels matching a given color, 0-100% match. • Select all colors within mouse - select all pixels within the mouse, extend the selection into adjacent areas with colors matching colors within the mouse (sometimes called 'flood'). - The following paragraphs explain the details of each method. - ^Rectangle Drag the mouse from one corner to the opposite corner of a rectangular area to select. A rectangle is drawn to enclose the area. Right-click to delete and start over. Repeat the process to select more rectangular areas. - ^Ellipse This works the same as rectangle selection, except that the area enclosed is a circle or ellipse. The drag start location is the center of the resulting ellipse. The angle of the drag determines the shape of the ellipse. - ^Freehand Draw Drag the mouse (left button down) to draw a freehand line, or left-click to connect a straight line from the last point drawn to the point clicked. Continue around the target area until it is surrounded with connected curves and lines. Right click to remove previous lines (mistakes). A right click will remove the previous clicked or dragged line, up to 50 pixels. Right click repeatedly to remove more. A new clicked line will always connect to the end of the previous line. A new dragged line will connect to the previous line if it is started close to the end of that line. If it is started elsewhere, a disconnected line will be drawn. You can start a new drag from far away and draw back to meet the previous line. If a clicked line connects to an undesired point (i.e. you don't want to connect to the last line drawn), right click to erase it and then use drag to start a new sequence of lines. A right-button drag can be used to erase line segments: right-drag closely along a line to erase it, then left-drag to re-draw the line. At the end, an area must be fully enclosed, with no gaps. Lines that overlap a little at the ends are OK. Gaps can be difficult to find and correct, so work at 100% image size or greater and be careful. A series of lines automatically connected with left clicks will not leave gaps, but deviation from this sequence is likely to create gaps. To reduce the possibility of gaps, use deliberate overlaps when manually connecting lines. There is a gap detection utility described below - {FIND AREA GAP}. If an area edge is also an image edge, you do not have to draw this portion of the area. Draw the line off the image edge, and draw it back onto the image at another position along the image edge. - ^Follow Edge High-contrast pixels (likely image feature edges) between the last point drawn and a newly clicked position are found and connected. This is effective for clear edges that are not too irregular. Fuzzy and ragged edges may not work well and freehand draw will be needed if high precision is necessary. The rules for connecting lines are the same as explained above. Dragging the mouse instead of clicking works like freehand draw, but with a tendency to follow feature edges from a position slightly behind the mouse. For very irregular edges (hair, foliage), see 'deselect color', below. - ^Mouse Radius and Color Match Level These two controls apply only to the 'select within mouse' methods described below. Mouse radius defines the size of a circle around the mouse pointer. Pixels within the circle are selected, or they provide a set of colors for matching and selecting pixels from the mouse circle outwards. Match level defines a required match level (0-100%) to select pixels based on their color and brightness. '0' means anything matches, and '100' means a perfect match is required. - ^Select area within mouse Left click or drag will select the pixels enclosed by the mouse circle. A right click will unselect the last selection (repeat to unselect more). A right drag will unselect the enclosed pixels. - ^Select one color within mouse Click on the image to select a color. The color is shown on the color button. You can also use the button to set a color directly. Left/right drag to select/unselect pixels within the mouse circle that match the selected color within the match level. Adjust the match level down or up to match a greater or lesser range of colors. Click as needed on the image to change the color to be matched. - ^Optional deselect color This applies only to 'select one color' above. Left click on the image to set a deselect color. When the box is checked, the deselect color is active. If a pixel matches the deselect color better than the select color, the pixel is unselected. When selecting along a feature edge with a low color contrast compared to an adjacent area that should remain unselected, set the deselect color from the adjacent area. This is helpful for accurate selection of a complex edge, like hair or foliage. The example below is a 5-10 minute project for an experienced user. Area Blend (below) was also used. - +image: select-hairy.jpg - ^Select all colors within mouse This is called 'flood' in some editors. Left/right drag to select/unselect pixels inside the mouse circle. Pixels beyond the mouse circle are also included if they meet these two conditions: 1) their color matches any color inside the mouse circle, within the current match level. 2) they are within the search range of the mouse pointer. This is a factor of mouse radius, e.g. if mouse radius is 20 and search range is 3, then the search range is 60 pixels from the mouse pointer. Drag the mouse over new areas you want to include. Watch the selected area expand into areas with colors matching those inside the mouse circle. If you go too far, right click to remove the last selection. Repeat if needed to remove more previous selections. Reduce the radius or increase the match level to gain finer control - the selection will expand more slowly and stay closer to the mouse circle. A small radius and high match level can be used to follow along an image feature edge and select pixels up to the edge with good precision. After the edge work is complete, use the select area within mouse method to select the rest. Right drag acts as an unselect: pixels inside the mouse circle and matching pixels within the search range are unselected. If a selection goes too far, it is often easier to correct this by unselecting from outside the selected area instead of selecting from inside. You may need some practice to get a feeling for this and be able to work efficiently. - ^Select all colors within mouse - summary • left drag - select pixels in mouse and matching pixels in range • right click - undo previous selection, repeat to unselect more • right drag - unselect pixels in mouse and matching pixels in range - ^Edge creep An area that has been finished (see below) can be expanded or contracted in 1-pixel steps. This can be helpful to reduce edge effects when an area selected by matching colors is edited in a way that changes its brightness. Selection by color may leave a narrow band of underselected or overselected pixels along an edge where feature color transitions to background. Expanding or contracting the area 1-2 pixels can produce a cleaner looking edge. The area remains finished (see below) after creep. - ^Area outline color The color used for the mouse selection circle and the area outline can be changed at any time by clicking one of the color buttons. This allows good visibility against various image colors. - ^Show/Hide Use [Hide] to hide the area outlines. This is useful to better see the effects of the area edits without interference from the area outline. Use [Show] to show the outlines and resume editing the area. - ^Finish +image: select-area-finish.png - An area is not effective for edits until it is successfully finished. Finish validates drawn outlines and colors the enclosed pixels for visual checking. When you are finished outlining areas, use the [Finish] button to complete the process. The popup dialog shown above summarizes two methods you can use to finish. - Method 1: Left-click the mouse inside areas that were outlined by hand. The enclosed areas are temporarily colored so you can verify that the final result is what you intended. Any enclosed area can be selected, even those not explicitly outlined: if you have a donut with a hole, you can select the donut, the hole, or both. Press [keep] when all areas have been clicked and correctly colored. If the outline of a hand-drawn area has a gap, the coloring process will "leak out" and areas outside the enclosure will be colored. In this case, press [Undo] in the Finish dialog, which restores the original area outline. Find the gap in the outline and close it, then try [Finish] again. A 1-pixel gap in a large area can be hard to find. Zoom-in to see better. See the function {FIND AREA GAP} below for a fast method to find tiny gaps. - Method2: Right-click somewhere outside all the enclosed areas. All enclosed areas will be colored for visual verification. If there is a gap, the results and the fix are the same as described in method 1. This method makes sense if you have many hand-outlined areas and you do not want to check them one at a time using method 1. - Areas selected using the 'select within mouse' methods are automatically finished. These areas are mapped during the selection process, whereas areas selected with rectangle, ellipse, or one of the line-drawing methods are mapped only when you click inside them. If you use only the 'select in mouse' methods, you can press [keep] without clicking any of the selected areas. - If you draw a line from one image side to another, you can click on either side of the line to make an area of all pixels on that side of the line. Example: draw a horizontal line on the boundary between sky and land. Click above the line to select sky, below the line to select land. The drawn lines must reach the image edges completely. - ^Clear Discard the current area permanently. - - TOPIC: FIND AREA GAP If an area outline was created by freehand drawing using multiple strokes, it is easy to leave small gaps in the outline that are not visible below 4x zoom. An attempt to finish such an area will fail because the mapping of the interior pixels will leak out through the gap and cover areas outside the intended area. If the Finish function fails, this function can find the gap. Click somewhere on the outline of the failed area. The outline will be slowly re-drawn in one direction from the clicked position, until an "end pixel" is found. This is where the gap is. The outline is then drawn in the opposite direction until the gap (or another one) is encountered. The gap is where the drawing stopped. Zoom-in on the gap and close it using freehand draw, then test again to see if the full outline can be drawn without stopping. This function can be used in parallel with the Select Area function - both dialogs can be active. - - TOPIC: AREA BLEND +image: area-blend.jpg - Two functions are present in this tool: Area Blend and Area Edge Blend. Both functions can gradually 'undo' an edit made within a select area, by mixing a prior edit or the original image. In the above example, the four men in the background were brightened without any evidence of a boundary between brightened and unchanged pixels. - ^Area Blend Any part of an edited select-area can be blended with the original image. Use left-mouse drags over regions to be blended. Each mouse drag within the area will gradually blend-in the selected prior image, effectively reducing or removing the edit that was done within the area. The rate of blending is determined by 'blend rate', which can be set separately for the center and edge of the mouse circle. Set the mouse radius and the blend rates (e.g. 50/0 for mouse center/edge). Drag the mouse over the area regions to be blended. Use left-drag to blend, right-drag to un-blend or restore. You can use this method to blend area edges selectively: use a small radius and drag the center of the mouse over the edges to be blended. This will result in a ramped blend from the edge inward. - ^Area Edge Blend Sometimes an edited area will have unnatural-looking edges, because of a sharp boundary between the edited area and the surrounding image (esp. if the area was brightened). This can be effectively made invisible by gradually blending-out the area edit for a strip along the edges. The area edit can be 100% removed from the area edge, diminishing to 0% inward for the width of the strip. There are two ways to blend area edges, 'blend' and 'blur'. Blend mixes the edge strip with the chosen prior edit or original image. Blur mixes the strip with neighboring pixels from outside the strip. Set the width of the blend with the input 'blend width' or 'blur width'. - Area edge 'Blend' and 'Blur' require an edge-distance calculation: the distance from each area pixel to the nearest area edge. This distance is used to calculate the relative blend for the pixel: 100% on the area edge and 0% for pixels beyond 'blend width' from the edge. For a large area with a complex edge, this can take some time. A progress meter is shown on the top panel. - - TOPIC: SHOW/HIDE AREA Show or hide the outline of the current area. Hiding the area is useful when the area is being modified with an edit functions. This makes it easier to judge the effects of the edit. These are also available as buttons in the Select Area dialog. - - TOPIC: ENABLE/DISABLE AREA Disable the current area and keep the data so that it can be re-activated later (Enable menu). This allows you to alternate edits within a selected area and edits for the entire image. - - TOPIC: INVERT AREA Invert an existing area: the entire image is selected except for the existing area. Using the function two times returns the original selected area. Inverting a selected area invalidates the edge calculation which must be repeated if area edge blending is desired. - - TOPIC: CLEAR AREA Permanently discard the current area. This is also available as a button in the Select Area dialog. - - TOPIC: COPY/PASTE AREA A selected area can be saved to a cache file using the menu Areas > Copy. This area can be pasted into the same or another image using Areas > Paste. Click and drag to position the pasted area. The dialog controls can be used to rescale and rotate the pasted area. - - TOPIC: LOAD/SAVE AREA A selected area can be saved to a file using the menu Areas > Save. You are asked to supply a file name. A PNG file is created. The PNG file has an alpha channel for transparency information. The image is a rectangle enclosing the selected area. Selected pixels are opaque, and others are transparent. - These files reside in /saved_areas by default, but you can save them anywhere. Use the menu Areas > Load to load a saved area from a file and paste into the current image file. The background image will show through the transparent parts of the pasted area. Click and drag to position the area. The dialog controls can be used to rescale and rotate the pasted area. - - TOPIC: UNDO/REDO BUTTON If an edit function is active and the image has been changed: • left mouse click will undo the current edit • right mouse click will redo the edit This allows you to rapidly compare the "before" and "after" images for the current edit function. - If NO edit function is active, but some edits were made to the current image: • left mouse click will undo one edit step per click • right mouse click will redo one edit step per click • middle mouse click pops-up a list of all edit steps. You can go back to any edit step or the original image - If you open another file, the saved edit steps for the current file are discarded. - - TOPIC: EDIT MENU - - TOPIC: ROTATE To level a slanted image, use the mouse to drag the right or left side of the image up or down until image looks level. A left-click on the image will add vertical and horizontal guide lines to help with image leveling. Use right-click to remove them. - The [Auto Level] button can automatically level the image if the camera has recorded 'roll angle' in the EXIF metadata. The [Auto Upright] button can automatically upright an image made with the camera turned 90º, if 'orientation' is present in the EXIF metadata. - - TOPIC: UPRIGHT This is a 1-button fix for an image that is rotated 90/180 degrees or inverted (mirrored). There is no loss of resolution since pixels are copied 1:1 to the new image layout. See also the function {BATCH UPRIGHT}. - - TOPIC: CROP +image: crop-image.jpg +image: crop-buttons.jpg - Cut off unwanted areas from image edges. When the dialog opens, a selection rectangle is placed over the image. Areas outside this rectangle are darkened and represent the parts of the image that will be removed. Drag any side or corner of the rectangle to move that side or corner. The dialog box shows the current width/height ratio of the selection rectangle. If "Lock" is checked, then moving a side or corner will cause another side or corner to move, so that the fixed width/height ratio is maintained. Drag from the middle (marked by a small circle) to shift the whole rectangle without changing dimensions. Use the width and height spin buttons to adjust the image pixel dimensions directly. or enter the desired values. The selection rectangle will adjust to these values. - Use the keyboard arrow keys to move the selection rectangle in 1-pixel steps. The last side or corner moved with the mouse is the one that is moved with the arrow-keys. - The [Max] button resets the crop rectangle to the full image size. If a previous edit (Rotate, Warp ...) has left transparent margins around the image, the crop rectangle will reflect the maximum size fitting within these margins. - The [Prev] button retrieves a list of previously used width and height values. Select from the list to use one of these. - The five ratio buttons allow you to choose a preset width/height ratio. The [invert] button inverts the current width/height ratio. - You can change the ratio buttons with the button [customize], which starts a new dialog shown on the right. Click on a button to edit it. Enter the desired width to height ratio using the format "ww:hh" as in the example shown. - - TOPIC: RETOUCH +image: retouch.png - Adjust image brightness and color. • auto black level - set black point using % darkest pixels • auto white balance - set white point using % brightest pixels • click gray spot for white balance - click gray spot on image • click dark spot for black level - click dark spot on image • click for popup graph of RGB histograms • brightness - moves the 'all' curve up or down (all colors change) • contrast - changes the slope of the 'all' curve • color saturation - black/white <--> intense colors • color temperature - illumination balance (warm <--> cool) - After making initial adjustments using the sliders, you can fine tune brightness and contrast by editing the curves with the mouse to change which parts of the image change more or less. The ALL curve adjusts all colors, and the 3 RGB curves adjust individual colors. Use ALL first, then make revisions using RGB. - ^Buttons Reset - set all controls back to a neutral position - image is also reset Prev - set all controls to the values used for the previous image Done - finish the edit, close the dialog, save the control settings Cancel - cancel the edit, reset the image, close the dialog - Use the [Prev] button when processing multiple images needing similar adjustments. - - TOPIC: RESCALE +image: rescale.png - This function rescales the image to a new pixel width and height. You can input the new dimensions directly or choose a percent change. Buttons are present for setting the new size to a simple ratio of the original size. Using one of these will minimize loss of resolution. The [Previous] button recalls the previous size, a convenience if multiple images are being set to the same size. If the lock ratio box is checked, the current width/height ratio will be preserved if either width or height is changed. - - TOPIC: SPLIT-SCREEN +image: split-screen1.jpg +image: split-screen2.png - During an edit function, view the before and after images using the split-screen method. Drag the boundary line using the mouse. When you exit Split-Screen, you can continue the edit function normally. - If no edit function is active, choose two images to show using split-screen. They must have the same pixel dimensions. - - TOPIC: SHOW DIFFS During an edit function, highlight the changes by darkening unchanged areas. Use the slider to adjust the darkness of unchanged areas. When you exit Show Diffs, you can continue the edit function normally. - If no edit function is active, choose two images to highlight their differences. They must have the same pixel dimension. - - TOPIC: MARGINS +image: margins.png - Use this function to add margins around an image. You can use any color and alpha (transparency) settings for the margins. Set each margin separately, or use the controls 'All±1' and 'All±10' to adjust all margins up or down by the same amount, 1 or 10 pixels. Use the mouse wheel or up/down arrow keys for speed. - You can use this function to add margins around images that you plan to warp, to prevent some areas from falling off the edges. - - TOPIC: MARKUP +image: markup.jpg - This is a menu containing the image markup functions: draw text, draw line/arrow, draw box, draw oval All of these functions have an [commit] button which commits the current edit and lets you begin a new one (new text/line/box/oval) within the same edit dialog. - ^Draw Text This function draws text directly on the image. Enter the text into the dialog. Multiple lines can be used. After entering the text, left-click the mouse where you want the text on the image. Drag to move the text elsewhere. Right click to remove the text. Use the [Font] button to select a different font. Use the [Size] control to increase or decrease the text size. Use the [Angle] control to change the slant angle of the text. The other controls allow you to provide a background color around the text, a text outline color, and a shadow effect. You can select the color and transparency for all of these. The width control adjusts the width of outlines and shadows. The shadow angle control sets the angle of the shadow. Use the emboss controls to give the text a 3D look. - You can initialize the text from any available metadata in the image file. Enter the metadata tag (e.g. "user comments") and press [Fetch]. You can abbreviate tag names, e.g. "usercomments" instead of "User Comments". - The [Open] and [Save] buttons start a file chooser dialog with which you can load or save all text data from or to a file. All the items in the dialog are loaded or saved, so you can keep a collection of often-used text strings and settings. - The buttons at the bottom work as follows: • Clear - clear the text and metadata fields to blank • Replace - image with added text replaces the current image • +Version - image with added text is saved as a new version • Next - open next file, put the same text at the same position • Apply - commit the current edit and reset for new text entry • Done - complete the current edit - image is ready to save • Cancel - abandon the current edit - To add the same text to a series of images: prepare and position the text, press [Replace] or [+Version], then [Next], then [Replace] or [+Version], then [Next] ... - Make a watermark: Use a text transparency of 70% or more and a background transparency of 100%. The text should be faintly readable. Use the emboss controls to make the text appear to be recessed into the image. - ^Draw Line This function draws lines or arrows directly on the image. Enter a line length and width into the dialog, and select an arrow head if wanted. Left-click the mouse where you want to place it on the image. Drag the ends of the line/arrow to position it on the image. Right click to remove it. Drag from the middle of the line to move without changing the angle or length. The dialog controls allow you to provide a background color, an outline color, and a shadow effect. You can select color and transparency for all of these. The width control adjusts the width of outlines and shadows. The shadow angle control sets the slant angle of the shadow. To keep a drawn line and begin another one, press [apply]. - ^Draw Box Choose a color and width for the box outline. Place the cursor at the position where you want a box corner, and drag to open the box in the wanted direction. To replace the box, drag again. To move the box, hold the shift key and drag the box from the center. To move one of the edges, hold the shift key and drag the edge. To keep a drawn box and begin another one, press [apply]. - ^Draw Oval Choose either the oval (ellipse) or circle checkbox. Choose a color and width for the outline. Place the cursor at the desired center. Drag to draw the oval/circle. The drag angle determines the shape of the oval, from circle to extreme ellipse, wide or tall. To replace the oval/circle, drag again. To move the oval/circle, hold the shift key and drag from the center. To change the size or shape, hold the shift key and drag from the lower right edge. To keep a drawn oval/circle and begin another one, press [apply]. For an oval, you can enter an angle 0-90 degrees for slanted axes, as in the example. - - TOPIC: COLOR MODE +image: color-mode.png +image: color-mode2.jpg - Use this function to make a black and white or color negative, or convert a negative image into a positive image, or convert to sepia coloring (for an aged photo effect). The slider can be used to apply the effect incrementally, from 0% to 100%. - - TOPIC: PAINT EDITS Use this function in combination with some other edit function. Start an edit function and leave the controls in a neutral position. Then start Paint Edits. Paint the edit function where desired using the mouse. See {MOUSE PAINTING} for how to apply edits locally using the mouse. - This method to "paint" edits incrementally can improve selected areas of an image quickly and easily. It works with the following edit functions: • Edit > Retouch, Color Mode • Repair > Sharpen, Blur, Denoise, Defog, Adjust RGB, Adjust HSL • Refine > Flatten Histogram, Local Contrast, Amplify Contrast, Local Retinex, Saturation, Soft Focus • Effects > Outlines, Sketch2, Emboss, Texture, Add Glare, Set Colors, Shift Colors, Custom Kernel - - TOPIC: PAINT IMAGE +image: paint-image.jpg - This function paints over the image with selected colors, using the mouse. See {MOUSE PAINTING} for how to apply edits locally using the mouse. - The Paint Color button shows the current color. Click this button to choose a color using the standard Gnome color chooser dialog. You can also shift + left-click on the image to choose a color from the image. - The palette button opens the dialog shown in the middle. Click on the image to select the color at that position. The chosen color is reflected in the color button of the main dialog. The image shown above is the default. You can use any image as a color source. Press the [browse] button and select an image where you have saved colors for recall. This choice remains in effect until changed. - The HSL button opens an HSL color chooser shown on the right. This dialog can represent any possible color. Move the sliders to get the color you want. The chosen color is reflected in the color button of the main dialog. - If paint over transparent areas is selected, painting over transparent areas will reduce or eliminate the transparency, depending on the opacity controls. If this option is not selected, only opaque areas of the image are painted. - ^Wacom Tablet Operation With Paint Image, you can use a Wacom tablet instead of a mouse. Dragging the stylus in contact with the tablet surface will paint as described above. If one of the stylus buttons is held down while dragging, the operation will be erase instead of paint. You can also set paint or erase mode using the radio buttons in the dialog. Holding down a stylus button is cumbersome, which is why the radio buttons are there. Adding pressure to the stylus will increase the opacity, so you can make lighter and darker strokes without adjusting the opacity controls. - - TOPIC: PAINT TRANSPARENCY +image: paint-transp.png +image: paint-transp2.jpg - Paint transparent or semi-transparent areas on an image. See {MOUSE PAINTING} for how to apply edits locally using the mouse. - - TOPIC: AREA FILL Fill all selected areas or all transparent areas with a chosen overlay color. If an area is partly transparent, the overlay color will replace the transparent fraction of the image. The 'Blend' slider can be used to select any mix of the original image and the overlay color. - - TOPIC: COPY IN IMAGE Paint over image areas by copying from elsewhere in the same image. This method can be used to duplicate objects within an image, or erase an unwanted object by replacing it with background taken from elsewhere. Left-click on the image to select a source location, then right-click to select the corresponding destination. See {MOUSE PAINTING} for how to apply edits locally using the mouse. - If paint over transparent areas is selected, painting over transparent areas will reduce or eliminate the transparency. If this option is not selected, only opaque areas of the image are painted. - - TOPIC: COPY FROM IMAGE Paint over image areas by copying from another image. The target image is 'painted' by dragging the mouse over the area to be modified. A previously selected position in the source image is copied onto the target image. The area being copied and the area being painted are both enclosed in circles which move with the mouse. In the above example, the boat in the right image was copied to the left image. - Start by opening the target image. Select the menu 'Copy From Image'. A 2nd Fotocx session is started showing the same image. In this 2nd session, navigate to the source image and open it. Arrange the two windows so you can keep both of them in view (at least the areas to be copied). Shift + left click the source image to establish a source position. Shift + left click the target image at the destination position. - Left-drag the mouse over the target image area. Pixels from the source image are copied to the target image. Zoom the images to max. size if high precision is needed for the reference positions. The initial reference position is (0,0) (NW corner) for both images. See {MOUSE PAINTING} for how to apply edits locally using the mouse. - The source image scale value is used to scale the source image to the target image. Start by making a trial copy to check the scale. If too big or too small, use [undo all] to erase the trial, change the scale value, and try again. - If paint over transparent areas is selected, painting over transparent areas will reduce or eliminate the transparency, depending on the mouse opacity controls. If this option is not selected, only opaque areas of the image are painted. - - TOPIC: COPY PRIOR EDIT The image from a previous edit step can be applied to the current image locally and gradually, by "painting" with the mouse. The previous edit must be one of the edits made to the current image while it is still open - unsaved edits are lost when a new image is opened. You can apply any previous edit to any area of the current image being edited, as long as the image remains open as the current image. Select a previous edit using the dropdown list which shows all previous edit steps done on the current image, in sequence, and identified by the edit function used. See {MOUSE PAINTING} for how to apply edits locally using the mouse. - - TOPIC: REPAIR MENU - - TOPIC: SHARPEN +image: sharpen.png - This function has five methods to sharpen a blurry image, and a method to sharpen motion blur from camera or subject motion during exposure. - Choose the method, set the parameters, press [apply] and wait a few seconds to see the result. Make changes and repeat the process until satisfied. Use {SELECT AREA} to operate on different parts of an image with different methods and parameters. - For all methods, choose a small radius for images that are slightly blured and a larger values for poorer images. Amount controls the strength of the modification. Threshold suppresses changes to low-contrast pixels: a higher values reduces the amplification of low-level irregularities (image noise, uneven skin tones, etc.). - Unsharp mask: a classical method found in most image editors. A technical description can be found with an internet search. This method can make visible 'halos' around high-contrast edges. - Amplify Contrast: amplify existing contrast. Effectiveness is comparable to unsharp mask, but 'halos' are reduced. - Kuwahara: small neighborhoods around each pixel are compared to each-other. The pixel is given the mean color of the neighborhood with the smallest difference. This forces pixels on a blurry edge to match one side of the edge or the other. Edges are made very sharp. Image may appear 'blocky' if a large radius is used. Subtle details can be lost. - Median diff: pixel brightness is compared to the median of pixels within radius. The brightness is increased or decreased for pixels respectively brighter or darker than the neighborhood mean. Effectiveness is comparable to unsharp mask, but 'halos' are greatly reduced. This is the only method that works on each RGB color separately. It can sharpen a color transition even if there is little brightness change. - Richardson-Lucy: the image is sharpened using the Richardson-Lucy deconvolution method. This method may produce the best results, but is also quite slow. To speed things up, start by selecting a small but busy area of the image using {SELECT AREA}. Hunt for the optimum radius and iteration count using this small area. Then use the same settings for the full image. Noise in the image will hamper effectiveness. If so, use {DENOISE} beforehand. - An image upscaled exactly 2x can be sharpened with Richardson-Lucy, using a radius of 2.0 and 4 or more iterations. The results are remarkably good. - ^Fix Motion Blur +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - Hand-optimize images with minor blur from camera or object motion. Blur from a moving object in an otherwise sharp image can be processed using {SELECT AREA} to isolate the object. Blur is assumed to be linear and constant velocity. The inputs are 'blur span' in pixels and 'blur angle' in degrees. The initial angle estimation can be specified by shift + mouse drag across the image in the blur direction (can be the same or opposite to the actual motion). Input an estimate of the blur span by using Tools > Show RGB to measure the width of blur along some bright image feature edge. Adjust inputs, press [apply], and inspect the image to find optimum settings. The response time may be slow for a large image. You can speed up the process if you use {SELECT AREA} to select a small blurred area to optimize span and angle, then clear the area to process the whole image using the same settings. The algorithm may produce "ringing" noise, which can be suppressed using the input 'suppress ringing'. It works best to leave the suppress value low to find the optimum span and angle, and then add suppression as needed to reduce ringing. The Richardson-Lucy deconvolution method is used in one dimension. - ^Digital Camera Motion Blur Not all blurred photos have the constant-velocity blur best suited for this method. The image may be a superposition of multiple shorter exposures. The entire image may not be exposed at the same time and have the same blur (mechanical or electronic moving shutter). This method may still produce better results than sharpen tools that work in two dimensions. It should work better on old photos made with film cameras, where motion-blur is closer to constant-velocity. - - TOPIC: BLUR +image: blur.jpg - Choose a method with the corresponding check-box, input the required parameters, press [apply]. If {SELECT AREA} is active, only the selected areas are affected. - ^Normal Blur Mix each pixel with surrounding pixels within radius. Closer pixels have a higher weight. You can set the radius to 1 and press [apply] repeatedly to increase the blur slowly while you monitor the image result. - You can optionally blur by different amounts in the horizontal and vertical directions if you input separate horizontal and vertical values. The [radius] input will force the same values for both. - ^Radial Blur Mix each pixel with pixels along a line from a chosen center. Radius defines a central area that is not blurred. Length sets the blur line range: 0 to length, from center to edge. Choose the center by clicking on the image. - ^Directed Blur Pull a position on the image using the mouse. The area around the mouse will be blurred in this direction. Span determines the size of the area blurred. Intensity determines the strength of the blur. - ^Graduated Blur Only pixels with less contrast than the given contrast limit are blurred, and the blur radius ranges from 1 to the given value for pixels with a corresponding contrast ranging from the given limit to zero. In short: low-contrast pixels are blurred more than high-contrast pixels. This can be used to smooth skin tones without blurring hair or reducing the sparkle in the eyes. Taken to extremes, it produces a "cartoon" effect. - ^Background Blur (Bokeh) Blur background image areas while leaving the foreground sharp. Select one or more areas that are to remain sharp {SELECT AREA}. After selecting the foreground areas, invert the selection so that the background is now selected {INVERT AREA}. This is the area that will be blurred. There are two blur methods available: Constant blur: a constant blur radius is used for all areas blurred. Increase blur with distance: use the minimum blur radius for pixels adjacent to the foreground and the maximum blur radius for pixels at the maximum distance from the foreground. This requires that the edge distance for all background pixels be calculated, which can take significant time. Blur radius can be varied without recalculating edge distances. - - TOPIC: DENOISE +image: denoise.jpg - Reduce the noise in photos taken in low light conditions (high ISO), making uniform surfaces appear speckled. Two methods are provided, Median and Smooth. The best method varies with noise and image characteristics. Mixing methods (using one and then another) can be helpful. The Radius value defines the pixel neighborhood that will be used to compare and adjust a given pixel. A large value (Radius > 2) will reduce the noise more effectively but may also cause loss of detail. The limit value will cause pixels with RGB brightness values that differ from the neighborhood median by more than this amount to be ignored. This is necessary for some images to prevent tiny bright details from being treated as noise - e.g. astronomical photos. - Set a Radius value and press one of the method buttons. Each iteration uses the previous image as a starting point, so multiple iterations will gradually suppress the noise and possibly blur some details. Use [reset] to start over. Median with Radius 1, followed by Median with Radius 2, is a good compromise between suppressing noise and preserving detail. - The Areas slider can be used to restrict processing to dark areas only, or to a broader range of areas. Dark areas tend to have a noise problem moreso than bright areas. - If you see some tiny noise speckles that persist, increase the limit value, use the [reset] button, and continue with [median] or [smooth]. - You can apply different processing in different areas of the image - see {SELECT AREA}, and you can "paint" the image using different processing in different areas - see {PAINT EDITS}. - Each RGB color is processed independently. There is no separate processing of chroma or lightness. - The [measure] button starts the right side dialog to measure the actual image noise level. Move the mouse over the image to show the RGB noise levels within the mouse circle (radius 10, about 300 pixels). This must be a featureless area so that noise is the only variation present. Inspect the image at 4X size to be sure you are seeing noise and not texture. The dots show individual pixel RGB values relative to the mean of the surrounding 5x5 pixels, represented by the central solid line. The numbers at the bottom show the mean RGB brightness and noise levels on the scale 0-255. The graph scale is -10 to +10 and the dotted lines are at -5 and +5, relative to a total range of 0-255. Noise in the 9th or 10th RGB bit is 0.5 or 0.25 on this scale. - ^RAW image noise To measure camera sensor noise, use a RAW image. JPEG images are processed inside the camera to reduce noise. You may be surprised at the typically high noise levels in RAW images. Even expensive cameras with large sensors may have less than 8 bits of low-noise color. When you filter noise from a RAW image, you are competing with the electronics and software that produce the camera JPEG. It might be a challenge to do better. - - TOPIC: DEFOG +image: defog.png +image: defog2.jpg - Remove fog/haze in an image or selected area. There are other tools for this (flatten histogram, local contrast, amplify contrast, retinex, saturation), but fog/haze removal is secondary to their primary function. This function attacks fog/haze directly: it removes equal amounts of R/G/B color (reducing brightness and increasing saturation), and optionally adds-back the lost brightness. It can also reduce blue if this becomes too dominant, as often happens with distant haze. You may need to use {SELECT AREA} or {PAINT EDITS} to precisely target and optimize the desired areas. The above example used two areas, the foreground hills and the background mountain. - - TOPIC: RED EYES +image: red-eyes1.png +image: red-eyes2.png - Reduce the red-eye effect from flash photos. Two methods are provided. The first is faster but may not handle difficult cases. The second method is more robust but also needs more time and care. To use the first function, left-click on a red-eye one or more times until satisfied. If the darkened area is too small or off-center, right-click to undo the change and then left-click more precisely on the center of the red-eye. If a red-eye cannot be fixed correctly, right-click to undo the change and then use the second method. The second method can better handle more difficult cases where the red-eye is only slightly red and the color difference with the eyelids is too little for the automatic algorithm to distinguish. Place the cursor over the center of the red eye. Hold the left mouse button and drag the cursor down and to the right. A dotted ellipse will appear enclosing the red eye. Repeat if needed to get the red eye centered in the ellipse (roughly). Note that the shape of the ellipse depends on the direction of the drag, which can allow more precise enclosure of only the red-eye. Left-click inside the ellipse repeatedly while watching the red eye darken, and stop when it is dark enough. If you go too far, the eyelids may start to darken. Right-click to undo and repeat if necessary. - - TOPIC: SMART ERASE +image: smart-erase.png +image: smart-erase2.jpg - Erase small objects that can spoil a good photo, such as power lines, trash on the ground, a sign, etc. The unwanted object is replaced with pixels taken from the surrounding area. This is sometimes very effective (side-effects almost invisible), and sometimes not. It works best for small or narrow objects in the photo. Radius controls the size of a circle around the mouse pointer, defining the area to select and erase. Drag the mouse to enclose the object to be removed. Left-drag selects and right-drag unselects. Press [Erase] to erase the selected area, replacing the pixels with the nearest pixels from outside the selection. If the selection was not precise enough, use [Undo], adjust the selected area, and [Erase] again. Repeated selections and erasures will accumulate until you use [New_Area] to start a new selection. The prior erased areas are now fixed and [Undo] will only work for following selections. It is best to work with an image zoomed to 200% or more. The Blur control adds blur to the replacement pixels. This can reduce visible side-effects, since the replacement pixels may be sharper than the surroundings. Change the Blur setting and repeat the [Erase] button. The [show] and [hide] buttons can be used to show the outline of the current selection or hide it to better judge the results after erasing. - For long thin objects (e.g. power lines), you can click on two positions and everything in-between will be selected. The selection works in a straight line, so for curving objects you will need to click at intervals to follow the curve. - - TOPIC: REMOVE HALO +image: remove-halo.png +image: remove-halo2.png - Remove halos left by some edit functions. Select the type of halo: bright (most common) or dark. Left-drag the mouse over the halo area to alter the pixels inside the mouse, as shown in the example. For a bright halo, the brightest pixels will darken as the mouse is dragged over them. For a dark halo, the darkest pixels will brighten. Use a mouse radius larger than the width of the halo, as shown in the example. Right-drag the mouse to restore the original pixels. - - TOPIC: JPEG ARTIFACTS +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - JPEG images that have been highly compressed (with a low quality setting) can show compression artifacts in the form of small rectangular blocks. If some areas of a photo have had their brightness range expanded, such blocks may become more visible because the brightness steps are larger (e.g. RGB values of 11/12/13 brightened 5x to 55/60/65). This function blurs the borders between the blocks to make them less visible. - 'Match Limit' determines when adjacent pixels are treated as members of the same pixel block. Match Limit can be set to a lower value to get such blocks more completely mapped. 'Contrast Limit' serves to prevent blending of edges where contrast is high, causing loss of detail. Change the two settings and press [apply]. View the resulting image at >2x size and try different settings if optimization is important. This function will be less effective on an image that has been rescaled. Use {SELECT AREA} to selectively process problem areas. - - TOPIC: ANTI-ALIAS +image: anti-alias.jpg - Sometimes photos show pixelation ('jaggies') along some high-contrast feature edges. In the example above, you can see this around the bird's eye. The anti-alias tool can reduce this. The effect is minor on most photos, where in-camera processing may have already taken care of the problem. A secondary effect is that jpeg artifacts in highly compressed images are somewhat smoothed over. Images that have been scaled-up in size will have more prominent pixelations. These can be helped, especially in the case of a 2x upscale. - Use the [apply] button to suppress the pixels, multiple times if this seems to help. 'Threshold' can be used to exclude low-contrast pixels from processing. A value of 0.1 or less is usually best. - Fotocx uses the Scale3x algorithm, modified to use "similar" and "different" color tones in place of "equal" and "not equal". - - TOPIC: ADJUST RGB +image: adjust-RGB.png - Change overall brightness and contrast, or that of selected colors. • Brightness - increase or decrease overall image brightness • +Red -Cyan etc. - change the color brightness and change the complimentary color in the opposite direction • Contrast All - increase or decrease the overall image contrast • Contrast Red Green Blue - process individual RGB colors - - TOPIC: ADJUST HSL +image: adjust-HSL.png - Change a selected range of colors in an image using HSL (Hue, Saturation, Lightness). This function can be used to fix a color caste or change one color to another (e.g. an overexposed sky - too white). If you are not familiar with the HSL color model, read the Wikipedia article about this. - Begin by selecting a target image color to match and adjust, using shift + left-click on the image. This color will be the center of a range of colors that will be selected for adjustment. Select what color attributes will be matched using the checkboxes for hue, saturation, and lightness. Each of these will narrow the range of selected colors. If none are checked, all colors are selected. Match Level can be used to further widen the range of selected colors. 100% means only closely matching colors are selected. - The Output Color controls (hue, saturation, lightness) are used to set the new output color which will replace or blend with the selected input colors. You can also set this color from the image, using shift + right-click. The resulting color will be a mix of the original color and the new color. The new color fraction is set by the Adjustment slider, which can be set 0 to 100%. Use the HSL checkboxes to determine which HSL components of input color are replaced with the corresponding HSL components of the output color. Use the sliders for output color HSL to adjust the new color. The output color is shown in the smaller box on the left, which is updated as you move the sliders. - Move the sliders and watch the live image updates to optimize the result. This is not very intuitive, and practice will help. Hint: begin by matching on hue and saturation, and replacing only hue - this means that the output color saturation and lightness will be copied from the original image colors, and only the hue will be replaced. - - TOPIC: REMOVE DUST +image: remove-dust.png +image: remove-dust2.jpg - Images made from dusty scanned slides can have many small dark spots - shadows of the dust on the slides. Historical photos from the internet often have a similar problem. This function can remove the majority of such spots. Move the three sliders until the maximum number of dust spots are painted red, then press the [erase] button to erase them. Press [red] to bring back the red view, then you can adjust the sliders again and press [erase]. The "spot size limit" slider limits the size of the spots that will be erased. The "max. brightness" slider sets a threshold for ignoring spots that are not dark enough. The "min. contrast" slider filters out spots having low contrast with their surroundings. This process is usually a compromise. If the settings are not optimal, small features like tree leaves can be erased, or large spots may be left in place. Different parts of the image may need different settings, e.g. sky can be treated more aggressively than a building wall. You can simply use Erase Dust multiple times with different settings as needed to get all the dust spots. Or you can use {SELECT AREA} to process the image in sections. If some spots are persistent, you can treat them manually with {SMART ERASE}. Set a small mouse radius and click on each spot to remove it. Spots from fibers (long and thin) are usually not automatically removed, but Smart Erase can be effective here. If the dust is bright, as in the above example, use {COLOR MODE} to make a color negative, process the dust, and then repeat color negative to restore the normal image. - - TOPIC: FRINGES +image: fringes.png +image: fringesA.jpg - Fix pheripheral color fringes (lateral chromatic aberration) - where color fringes appear mainly in outer image areas. - The left image above is a magnified cutout of the top left corner of a photo with lateral chromatic aberration. This was mostly eliminated in the processed image to the right. Color fringes can appear along high-contrast edges, especially in the outer image areas where lens distortions are usually greatest. To get rid of them, zoom the image to a maximum size and center on an area with color fringes. Press the [search] button. The red and blue color planes are rescaled to better align with the green plane, and the factors used are stuffed into the dialog box. You may be able to improve the result by revising the factors directly in the dialog: change the factors while watching the color fringes on the image. - This function will be less effective if the image has been cropped so that the image center is no longer the same as the center of the original photograph. - - TOPIC: REFINE MENU - - TOPIC: FLATTEN HISTOGRAM +image: flatten1.jpg +image: flatten2.jpg - Increase visible detail in areas having poor contrast. Pixel brightness is adjusted up or down to make the brightness distribution (histogram) for the area around the pixel more uniform. A smaller radius (smaller area) will intensify the effect. There are 5 brightness zones from darkest (1) to brightest (5). Move a slider to increase the effect for the corresponding zone. Use the zone A slider to move all 5 sliders together and quickly set an initial result. Then use the other sliders individually to fine-tune the image. - - TOPIC: LOCAL CONTRAST +image: localcon1.jpg +image: localcon2.jpg - Increase the contrast in every area of an image. The brightness of each pixel is compared to the average brightness of the surrounding area. Pixel brightness in adjusted to increase this difference. This function implements a widely used textbook method. Radius determines the size of the area around each pixel that is used for the average brightness. Power determines the amount of brightness change. Color is used to increase the color saturation. You can use the editable curve to brighten the output image for selected brightness levels. The example shows brightening of the darker areas of the image. - Local Contrast can create "halos" under some circumstances: +image: localcon3.jpg - The original image is on the left. The middle image had Local Contrast applied at max. power. A halo can be seen along the border between the dark hills and lighter sky. This can be fixed with a simple trick (right image). Select the sky areas separately, using {SELECT AREA}. Apply Local Contrast to this area. Invert the selection and apply Local Contrast to the rest of the image. - - TOPIC: AMPLIFY CONTRAST +image: amplify-contrast.png +image: amplify-contrast2.jpg - Increase the apparent brightness range of an image by increasing local contrast. It can increase low-contrast areas while not changing high-contrast areas. You can also use the edit curve to vary the contrast amplification by the initial amount of contrast. - The Amplify slider below the curve regulates the calculation, from no contrast amplification to full amplification. If moved too far to the right, the image may show ugly artifacts, so push it back until these disappear. If uniform areas (e.g. sky) become mottled, pull the left end of the curve down to reduce amplification for low-contrast areas. In some cases it will be best to select different areas of the image and process them separately, e.g. conservative for sky, more aggressive for textured surfaces like stone walls. - - TOPIC: GLOBAL RETINEX +image: global-retx.png +image: global-retx2.jpg - Improve color and contrast for images with extreme fog/haze or color cast (e.g. a 100 year-old photo). Try the [Auto] button first. The image is searched to find the brightest and darkest RGB colors present. The darkest RGB values are subtracted from all pixels and the resulting RGB values are scaled up so that the maximum RGB values are near 255. Of course this may not be initially optimum. The spin buttons are set to the dark and white RGB limits found, and you can changes these to optimize the resulting image. You can choose your own dark and bright points by selecting the corresponding option in the dialog and clicking on the image. The multiplier spin buttons are set to 1.0 by default, and you can change these values to adjust the relative brightness of each RGB color. In the above example, the 1st image is the original, the 2nd image was made using the [Auto] button. The rightmost column of spin buttons will adjust all buttons in the same row together - use the mouse wheel or the keyboard up/down arrow keys. - The blend slider is used to mix the input image and the retinex image in any ratio. The reduce bright slider is used to attenuate the effect for brighter image areas, especially sky, where Retinex can produce strange looking results. - The algorithm was derived from concepts first published by Edwin Land in the 1970s. Search the internet for 'retinex' for more information. - - TOPIC: LOCAL RETINEX +image: local-retx.png +image: local-retx2.jpg - Increase visible details in dark image areas and other areas having low contrast. The brightness range of a zone around each pixel is used to rescale the pixel brightness as though the entire zone were rescaled to cover the entire 0-255 brightness range. Local Retinex can produce dramatic results where Global Retinex is weak. - The radius input determines the approximate zone size around each pixel. The blend slider is used to mix the input image and the retinex image in any ratio. The reduce bright slider is used to attenuate the effect for brighter image areas, especially sky, where Retinex can produce strange results. The reduce dark slider does the same for darker image areas. The example above is about 60% original image + 40% retinex. - - TOPIC: SATURATION +image: saturation.png - Adjust color saturation based on pixel brightness. The edit curve Y-axis is color saturation, from zero color (all RGB values equal) to maximum color (lowest RGB value is zero). The curve X-axis is pixel brightness, from dark to maximum brightness. The neutral position (no color change) is the midway value, which is also the initial value. Example: to increase the color intensity of dark areas in the image, raise the left end of the curve. The Saturation slider moves the entire curve up or down without changing its shape. - - TOPIC: SOFT FOCUS +image: soft-focus2.jpg +image: soft-focus.png - Apply the classic "soft focus" effect to a photo. This is a mixture of a sharp image and a slightly blurred image. The radius setting determines the extent of blurring (pixel span), and the mix setting sets the portion of the blurred image in the mixed output image, from 0 to 100 percent. You can use {PAINT EDITS} with this function, to vary the effect for different areas of the image. - - TOPIC: BRIGHTNESS RAMP +image: brite-ramp1.png +image: brite-ramp2.png - Vary brightness or color across an image. You can use this to compensate for uneven lighting or a color cast that varies across the image. The direction of change is determined by drawing a line on the image. Create the line by clicking on the image, then drag either end to set the direction wanted. In the example above, green was increased in the direction of the line. Edit the All curve first to adjust overall brightness (all colors), then adjust the individual RGB color curves if needed. - - TOPIC: VIGNETTE +image: vignette.png +image: vignette2.jpg - Correct the darkening sometimes seen in the corners of a photo. It can also be used to highlight or colorize an object or area within an image. - Click or drag the mouse on the image to change the vignette center, which is initially at the center of the image. - Select 'Brightness' to change the brightness of the image in a radial pattern: Adjust the left or right end of the curve to change the brightness of the center and edges of the image respectively. You can give a dark surround to a portrait face, or you can fix an image with darkened corners. The curve middle level corresponds to no change. Use lower values to darken and higher values to brighten. The example above gradually darkens the periphery of the image while leaving a broad central area unchanged. - Select 'Color' to add a chosen color to the image in a radial pattern. Curve values of zero represent no change, and higher values add the chosen color to the image. The highest value corresponds to 100% color. Use this function to add a color surround to an image, e.g. surround a face with a gradually increasing color. - - TOPIC: EFFECTS MENU - - TOPIC: OUTLINES +image: outlines1.png +image: outlines2.jpg - Transform a photo into an outline drawing. High-contrast pixels are intensified and low contrast pixels are suppressed. The threshold setting sets the contrast thresholds. Lines below the minimum are not shown, and those higher than the maximum will have maximum brightness. The 'black/white' checkbox converts colored lines to black over white or white over black, depending on the 'negative' checkbox. Use 'Low Amplify' to brighten faded lines if wanted. 'Mode B' results in a more uniform line brightness compared to 'Mode A'. - - TOPIC: SKETCH1 +image: sketch1.jpg - Transform a photo into something like a sketch. Dark pixels are aggregated into fewer pixels, leaving vacated areas brighter. Contrast can also be used as a proxy for dark pixels. Threshold can be used to filter the input image by brightness. Clip Level is used to filter the output to further reduce isolated or marginally dark pixels. Choose colors for foreground and background. Reducing the size of the input image may give interesting results. If the result looks "dirty", use {DENOISE} or {FUSION} to smoothen the image before processing here. - - TOPIC: SKETCH2 +image: sketch2.png +image: sketch2b.jpg - Transform a photo into something like a sketch. It uses a different method: low ... high contrast pixels are converted into light ... dark pixels respectively. The curve can be used to increase or decrease the power of the contrast conversion. The x-axis scale is pixel contrast, from low to high, and the y-value determines the strength of the conversion. The example shows low-contrast pixels being suppressed (made lighter). The input image can be blended in at any ratio. If the result looks "dirty", use {DENOISE} or {FUSION} to smoothen the image before processing here. - - TOPIC: CARTOON +image: cartoon.jpg - Transform a photo into a cartoon-like drawing. Black lines are drawn over feature edges in the image, wherever the brightness or color changes abruptly. Line Threshold sets the sensitivity for edge detection and line drawing, causing fewer or more lines to be drawn. Line Width makes the lines thicker or thinner. Kuwahara Depth controls a sharpen function which can strengthen feature edges within the image. - - TOPIC: EMBOSS +image: emboss2.jpg +image: emboss.png - Transform an image into a simulated relief or embossed image (a 3D effect). Feature edges are made brighter on one side and darker on the opposite, as if raised up and illuminated from the side. The radius setting determines the width of the effect, and the depth setting determines the intensity. The Light Source setting determines the angle from which the apparent illumination is coming. This can be varied to maximize the effect for feature edges most perpendicular to this angle. - - TOPIC: TILES1 Transform an image into an array of monocolor tiles. You can control the tile size and the thickness of the gap between tiles. This is also called 'pixelate'. Use Select Area to confine the transform to a limited area, e.g. a face. - - TOPIC: TILES2 +image: tiles2a.png +image: tiles2b.png - Transform an image into irregular tiles that roughly conform to the colors and contours of the image. ^base size:^ The tile base size, which is the unit tile size used to make larger tiles. ^color depth:^ Number of colors to use: 1 = 8 colors, 2 = 64 colors ... 8 = 16 million colors. ^tile area goal^: The upper limit of tile size (area in pixels). ^req. color match^: Set the minimum color match required for a smaller area to be consolidated into an adjacent larger area: 0 = don't care (maximum consolidation), 100 = perfect match required (minimum consolidation). - - TOPIC: PAINTING +image: painting1.png +image: painting2.png - Transform an image into something similar to a painting. It reduces the number of colors, maps each contiguous pixel area having the same color, and then consolidates smaller areas into adjacent larger areas having the best color match. - ^blur radius^: Blur the image before processing. This results in smoother boundaries. ^color depth^: Number of colors to use: 1 = 8 colors, 2 = 64 colors ... 8 = 16 million colors. ^patch area goal^: Set a lower limit for areas that will have their own color: areas smaller than this number of pixels will be absorbed into an adjacent area with the nearest color match. ^required color match^: Set the minimum color match required for a smaller area to be consolidated into an adjacent larger area: 0 = don't care (maximum consolidation), 100 = perfect match required (minimum consolidation). ^borders^: Determines whether the colored areas will be delineated with a thin black border, like irregular tiles in a mosaic. After using this function, using {EMBOSS} can add interesting texture to the image. - - TOPIC: TEXTURE +image: texture2.jpg +image: texture.png - Add a textured surface to an image or selected areas within an image. Radius determines the texture pattern size. Strength determines the intensity of the pattern, from almost invisible to dominant. - - TOPIC: FUSION +image: fusion.png +image: fusion2.jpg - Suppress small low-contrast details in an image while retaining sharpness for larger image features. Press [start] and watch the image closely. The process runs continuously until stopped with the [stop] button. Small details will slowly fade away. The dialog box 'count' label shows the iteration count. You can [stop] the process to inspect the image and then resume processing with [start]. Use the Undo/Redo button to compare the before/after image status. Resume processing with [start]. The [step] button can be used to process one step at a time. - - TOPIC: MATCH COLORS +image: match-colors.png - Match the colors in one image to those in another. A small spot, selected with a mouse click, is sampled from each image. The spot on the 2nd image will be made to have the same average color (RGB values) as the spot from the 1st image. The factors used to make the RGB values the same are then applied to all the pixels in the 2nd image. A common usage is to remove a color cast from an image by marking a spot on the image that will match a color from another image. - Procedure: The dialog lists 5 steps to take in sequence. • Set a radius for the spot sample area. The resulting mouse circle is the spot area to be sampled. • Open the 1st image by pressing the [open] button. • Click on the image to take a color sample. • Open the 2nd image by pressing the [open] button. • Click on the image at the spot you want to match the 1st image. The image colors will change within a second or two. - - TOPIC: PATTERN +image: pattern2.jpg +image: pattern1.png - Add a background pattern to an image. A small image file (pattern file) is used to cover the current image by duplicating the file, like a tiled wall. This file can be a real pattern (e.g. an image of canvas cloth, a brick wall, a repeating geometry ...), or any other kind of image. The pattern is made semi-transparent, so that the base image appears to be printed over the pattern, or the pattern over the image. Many pattern files can be found using a web search for "pattern image". Download some of these and crop them if needed to a size around 200-500 pixels. For convenience, add these to the supplied pattern files in ~/.fotocx/patterns. - Use the [Browse] button to select a pattern file. The selected pattern will be tiled to cover the base image. The pattern is partly transparent so that the base image shows through. Use Zoom to grow or shrink the pattern size. There are two methods to mix the pattern with the base image. The pattern opacity can be set 0-100%. The base image is used to fill the unused opacity. Contrast is used to modify the base image brightness using the pattern brightness as a template. The two parameters can be mixed in any ratio. - If the pattern file contains an image that repeats at fixed intervals both horizontally and vertically, the [Calculate] button can be used to set width and height to make a continuous pattern without visible seams. - If the pattern is irregular and seams are apparent, you may be able to improve this. The two Overlap values determine how much the duplicated patterns overlap at the edges, horizontally and vertically. Add some overlap to mask edge effects. - Select Area can be used to apply a pattern to part of an image, or different patterns to different parts. After applying a pattern to an image, it might be interesting to use {EMBOSS} to add a 3-D effect to the pattern. - The checkbox "Grayscale" will convert a color pattern to grayscale. - - TOPIC: CROSSHATCH +image: crosshatch2.jpg +image: crosshatch1.png - Convert an image into a drawing using crossing parallel lines. Enter a grid size and press [apply]. - - TOPIC: DITHER +image: dither1.png - +image: dither2.jpg - This function provides several ways to dither an image - convert into dots. 0 - colored dots in the style of Roy Lichtenstein 1 - pure R/G/B or black/white with random or optimized spacial distribution 2 - RGB mix using a given bit depth 3 - classic dither using a custom color palette 4 - condense image into blobs with mean color of condensed pixels - The classic dithers use the Floyd-Steinberg method of compensating for color errors: mismatch between an input image color and the closest color from the palette. Dots with nearby colors are mixed-in as needed so that the average over an area more closely matches the input color. The error compensation can be turned off if wanted, to get distinct color bands or contours. - Blobs: Image pixels undergo a kind of "gravitational collapse", converging into clumps around local centers of mass. 'Mass' is defined as pixel brightness. The 'radius' control roughly defines the range of attraction. Press [start] to start the collapse. Watch the image change slowly into blobs roughly the size of the 'radius' input. When the blobs are nice and round and changing very little, press [stop] to finish the process. - - TOPIC: ENGRAVE +image: engrave.png +image: engrave2.png - Convert an image into black & white lines. The Size input determines line thickness and how many vertical image pixels are used for each vertical pixel column in the output lines. The line pixel columns are split into black and white parts with their proportion roughly matching the mean brightness of the input pixels. The Bias input can be used to optimize the overall brightness. Negative/positive values make the image darker/brighter. The Color input (0-100%) can be used to add color to the white parts. - - TOPIC: ADD GLARE +image: addglare.png +image: addglare2.jpg - Add glare radiating out from bright spots in an image. Power: determines relative brightness of the glare Limit: threshold pixel brightness to emit glare Range: pixel-range of glare from emitting pixels Pixels with brightness above the limit (200-255) will emit glare. Brightness here means the brightness of the brightest RGB color in a pixel. Emitted glare is in the color of the emitting pixel. Range is in pixel units. The glare will be maximum at the emitting pixel and taper off to zero at the range limit. - - TOPIC: MOSAIC +image: mosaic1.png +image: mosaic2.jpg - Create a mosaic image using tiles made from all your images. - Specify the tile size in pixels (e.g. 36 x 24) and press [Tiles]. Tiles will be created from all of your images (actually the thumbnail images are used, for speed). If you change the tile dimensions, press [Tiles] again to regenerate the tiles. After the tiles are created, press [Image] to convert the current image into a mosaic using these tiles. Tiles are chosen by matching the average tile color to the average image color at the tile position. If thousands of images are available and if the range of colors is good enough, the mosaic will turn out quite good. Zoom-in on any part of the image to see the tile images. - The Tile blending slider will cause the image to be blended with the tiles, making it look better if the tiles are a bad color match. If the blending is less than about 50%, the tiles remain almost as clear as before, because the eye compensates the false tint. - After a mosaic is created, you can click on any tile to get a larger popup image. If a saved mosaic is opened, clicking the tiles for a bigger image will not work. Regenerating the mosaic is quite fast, so do this if you want the popups to work. - - TOPIC: ADD NOISE +image: add-noise.png - Add random color noise to an image. Set a target spot size 1-10 and noise level 0-100%. At 100%, random noise in the range -127 to +127 is added to each RGB value of each pixel. The mean value is zero. Overflows outside the range 0-255 are truncated. Average color over a large area is preserved, with the noise superimposed. You can use Add Noise with Select Area or Paint Edits to add noise to selected areas. - ^Suppression of 'banding' In image areas where the brightness distribution has been 'stretched', visible 'banding' can occur in areas of near-uniform brightness and color. You can reduce this problem by adding noise (or blur) to affected areas. - - TOPIC: SET COLORS +image: set-colors1.jpg +image: set-colors2.jpg - You can reduce the number of colors used in the image to create a poster effect. Set each RGB color separately, or adjust the total color count. Color bit depth is not used for this. Some functions in Fotocx use bit depth, limiting available colors to 2, 4, 8 ... for each RGB color. This function is not limited in this respect. The example above uses 8 red, 5 green, and 3 blue colors. - - TOPIC: SHIFT COLORS +image: shift-colors.png - This function can be used to correct colors or convert an image into false colors. Choose any of the three RGB colors and move the slider left or right from the center. One of the two other colors will be substituted in a graduated manner. For example, you can gradually substitute green or blue for the color red. The All slider shifts all colors together. Do this first to find a first optimum, then shift the RGB colors individually. - - TOPIC: ALIEN COLORS +image: alien-colors2.jpg +image: alien-colors1.png - Repaint an image or selected area with random alien colors. You can control the rough pattern size and the intensity (from barely visible to dominant). Press [Apply] to get a new color distribution. - - TOPIC: CUSTOM KERNEL +image: custom-kernel.png - Apply a custom convolution kernel to an image. The underlying technology is explained in Wikipedia. Input a kernel size, a multiply factor, an add factor, and fill-in the table values. [Apply] applies the kernel to the image. [Reset] restores the original image status. The values can be saved into a file and retrieved later by using the [Save] and [Load] buttons. Several kernel example files are available initially. You can modify these and save with a custom name. - Math: the brightness values for each N-by-N block of pixels in the image are multiplied by the corresponding values in the kernel matrix and added together. This number is multiplied by the multiply factor, and the add factor is added to it. This final value becomes the new brightness level for the image pixel at the center of the N x N block. - - TOPIC: WARP MENU - - TOPIC: UNBEND +image: unbend1.png +image: unbend2.jpg - Panoramas of nearby subjects (typically buildings or interior rooms) may show straight lines that are curved, or buildings that are slanted. Warping the images was necessary in the panorama process in order for the images to fit together. The Unbend function can be used afterwards to straighten the panorama image if needed. Vertical and horizontal dotted lines are drawn over the image, showing the unbend axes. Click or drag the mouse near the end of a line to move it. If values in the four input controls are changed, the image is warped in the manner indicated by the corresponding four images. Increase or decrease the values and repeat until satisfied. Move the axes to change the centers of warping. - See also {WARP IMAGE} for another method of correcting image curving and perspective. - - TOPIC: PERSPECTIVE +image: perspective2.jpg +image: perspective1.png - This function can be used to straighten a photo made from an offset angle. The image on the left is the original photo, taken from right of center to avoid reflections. The image on the right is the straightened version. This function can also be used to straighten a high building photographed from street-level or from the side. - Click on the four corners of the tetrahedron that you want to make into a rectangle (in the above case, the four corners of the painting or frame), then select [Apply]. The clicked corners are marked with small white boxes containing "A, B, C, D". The upper left corner of each box precisely marks the image position. Clicking near a box will move it to the new position. You can use the keyboard arrow keys to move the corner markers in 1-pixel steps. The arrow keys work on the last corner clicked or moved. - - TOPIC: WARP IMAGE +image: warps4.jpg - - TOPIC: WARP AREA This function can be used to make distortions within an image. You can select an image area and drag the mouse to stretch this area with respect to the rest of the image. The image is like rubber. If the mouse drag begins within the selected area, then the area is warped within its current boundaries - the movement is maximum at the mouse pointer and declines to zero at the area edges. If the mouse drag begins outside the selected area, the area edges near the mouse can be pulled out beyond the original area boundary. Many mouse drags of different lengths and directions can be combined to achieve the desired results. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - This function is useful to correct perspective problems. Drag the image from near a corner, using the mouse. The image is pulled elastically from this corner while the other corners stay fixed. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - This function is useful to correct perspective problems. Drag the image from the interior, using the mouse. The image interior is pulled elastically while the borders remain fixed. - - TOPIC: WARP CURVED This function is useful to correct perspective problems (see also {UNBEND}). Drag the image from any position, using the mouse. The entire image will be pulled or pushed in the direction of the mouse, but areas near the mouse are moved more than more distant areas. You can straighten curved lines or deliberately curve the image. The control 'warp span' determines the radius of warping around the mouse. 1.0 means the full image is warped, and smaller values confine the warp to smaller areas around the mouse. - - TOPIC: WARP AFFINE This function can be used to warp an image in interesting ways. Drag the image from a corner or edge using the mouse. The changes are purely linear so straight lines remain straight. This transform is called "affine". Details can be found with a web search. - - TOPIC: WARP RADIAL +image: warp_radial.png - Add or remove barrel or pincushion distortion. Barrel distortion is often seen in RAW images that have not been processed to remove this distortion. Left click to choose a central point where changes will be centered - normally the center of the image. This is the default. Move the 'stretch' slider to bend the image. - - TOPIC: UNWARP CLOSEUP +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - Closeup face photos are often distorted, because areas closer to the camera are larger in the photo than areas farther away. This function can be used to reverse the distortion. Use {SELECT AREA} to select the face first (does not need to be accurate). Click the image near the center of distortion (above example: right cheek). Move the slider to optimize. - - TOPIC: MAKE WAVES +image: make-waves2.jpg +image: make-waves1.png - This function distorts an image into a wave pattern, as if viewed through turbulent water. The dialog allows you to change the mean horizontal and vertical wavelengh, amplitude and variance. The "perspective" input allows the wavelengths to gradually lengthen from top to bottom. - - TOPIC: TWIST +image: twist1.png +image: twist2.png - This function twists the image around a point chosen with a mouse click or drag. Click the desired position and move the Twist slider the amount wanted. You can also drag the mouse around the image to change the center of twisting. The Center slider untwists the central area relative to the rest. The Angle slider rotates the image. - - TOPIC: SPHERE +image: sphere2.jpg +image: sphere.png - Make a spherical projection of an image. Drag the mouse on the image to change the center of the projection (defaults to midpoint). The flatten control modifies the projection gradually from a sphere (right) to a flat image (left). The magnify slider magnifies the resulting image up to 2x. - - TOPIC: INSIDE-OUT +image: inside-out2.jpg +image: inside-out1.png - This function inverts the center-edge distances of each pixel. You can click or drag the mouse to vary the center point. - - TOPIC: TINY PLANET +image: tiny-planet.jpg - Wrap an image around a circle. If the image is a 360 degree panorama, there will be no visible seam. • Center Hole: the image is wrapped around a central hole. • Cut Top: remove a top margin from the input image. • Cut Bottom: remove a bottom margin from the input image. • Reverse R: mirror the input image vertically. • Reverse Theta: mirror the input image horizontally. • Rotate: turn the output image around the center. - - TOPIC: ESCHER SPIRAL +image: escher-spiral.png +image: escher-spiralA.png - Transform an image into an endless inward spiral like the famous clock of M.C.Escher. Width determines the starting width of the outermost layer. Rim determines the starting width of the border separating layers, and Color determines its color. The default center is the center of the image. Click on the image to set a new center. - - TOPIC: FLATTEN PHOTO +image: flatten-photo1.png +image: flatten-photo2.jpg - ^Book page or other curved surface Flatten a photo of an image on a surface that is curved, e.g. around a column, or a page from an open thick book, where the pages curve inward at the center binding. The curvature of the top and bottom edges of the surface provide information about the amount of curvature and the amount of stretching needed to appear flat. The example above is a thick book. Other rounded surfaces can be corrected, e.g. a poster on a round column. - Select the upper trace option to trace the upper edge of the curved page. Click the mouse along the edge, creating a marker dot at each clicked point. After 4 points are available, a curved line is drawn through the points. Add more points and drag the points as needed to make the line conform closely to the image curve. Select the lower trace option and trace the bottom edge in the same manner. When both are done, press [flatten] to flatten the page. The edges should now be straight (or straight enough). Use the [stretch] slider to stretch the sides of the image as needed, to compensate for the lateral compression caused by the curvature. Use the Widen control to widen the image as needed to restore the correct width/height ratio. The [undo] button restores the unmodified image, keeping the marker dots, which can then be adjusted for a revised attempt. - +image: flatten-photo3.jpg - ^Curved horizon A wide panorama, or a photo from a wide-angle lens, may have a horizon that is not straight or horizontal. The image can be straightened (or otherwise moved) by tracing a curve through the horizon or other areas that need to be aligned along a straight line. Select either the upper or lower trace option, depending on whether the horizon (or other image part) lies mostly above or below the image middle. The image will be warped to make this curve straight. One curve is enough. The other curve is added automatically to the opposite edge (top or bottom) of the image. If the result is not satisfactory, use the [undo] button, adjust the markers on either curve, and try again. You can also save the image and apply the function a second time, using the saved image as a starting point. - - TOPIC: COMBINE MENU These are functions which combine multiple image files. In the case of overlapping images, corresponding features in each image are aligned to coincide, with single-pixel accuracy. Alignment time is typically 10-30 seconds per image. If you see this alignment process going wrong, you can use the Escape key to kill the process. - - TOPIC: HDR ^High Dynamic Range +image: HDR.jpg +image: HDR-adjust.png - Combine (overlay) multiple images of the same subject with different exposure levels. The combined image can show improved visibility of detail in both the darker and brighter areas, in effect using pixels from the brighter images for the darker areas, and from the darker images for the brighter areas. If the camera is adjusted manually between shots, take care to keep it level and aim at the same distant point. Some misalignment of the input images can be tolerated. If people or things move between shots, ghosting cannot be avoided. - Select the HDR menu function and select up to 9 images ({SELECT IMAGE FILES}), which must all have nearly the same pixel dimensions. The images are aligned and combined automatically. When done, the combined image is shown, along with a dialog for adjustments. The contributions from the input images are shown as a series of editable curves. The horizontal scale represents pixel brightness, from dark to bright. Each curve represents an image which contributes to the output pixels. The image contribution at a given brightness level is proportional to the height of its curve at that level. The initial curve for the brightest image will be high on the left and low on the right, meaning high contribution to dark pixels and a low contribution to bright pixels. The darkest image will be low on the left and high on the right, and remaining images in-between. The curves can be edited by dragging them with the mouse. The corresponding image contributions are changed accordingly, and you can see the results in real-time in the output image. The above image shows two input images and their output image. The example dialog shows three curves adjusted to optimize three input images. - - TOPIC: HDF ^High Depth of Field Combine (overlay) multiple photos of the same subject with different focus settings from close to distant. Different parts of the subject are in sharp focus in each image. Combine the images so that all parts of the subject are sharp. - Making the photos: Choose a point for the center of the image. Aim the camera at a near object and depress the shutter button 1/2 way to set the focus on this object. Hold the button at the 1/2 position, aim the camera at the chosen center, and snap the photo. Now choose a farther object and do the same. Repeat with increasing focus distance. Hopefully each part of the subject is sharp in at least one photo. The camera position should be very nearly the same for all photos, which can be a challenge if the subject is very close. Camera movement can cause scaling and parallax problems (close objects shifted against distant objects). Such problems may be fixable later in Fotocx, but this may require considerable time. It is better to avoid the problems. - +image: HDF-paint.png - Processing the photos: Choose the HDF menu function and select up to 9 images ({SELECT IMAGE FILES}). The images will now be aligned as well as possible. The output image is an even mix of the aligned input images. A small amount of camera movement between the photos is compensated, but this is limited, and parallax shifts are not compensated at all. When the alignment is complete, a dialog opens. You can select any input image and "paint" it with the mouse on any area of the output image. This converts the original image mix to the single selected image for the area being painted. For each area or object in the image, choose an input image that is sharp in that area. The radius of the paintbrush can set larger or smaller, so you can paint large areas quickly and control fine detail when needed. If you have overlapping near and far objects, time and patience will be needed to make all of them sharp. Misalignments can be corrected by selecting the warp option in the dialog. The underlying images can then be dragged and warped with the mouse, and the combined output image is changed accordingly. The warp is limited to the area around the mouse. When a painted area is dragged, the corresponding input image is automatically selected and dragged, while areas painted with other images remain fixed. Areas that have not been painted cannot be dragged. Move around to different areas and make incremental drags until all are aligned. - Suggested Workflow: Using paint mode, choose each image in sequence and paint all areas that look sharp in that image. Any boundaries that are not aligned well will show up clearly as shifts in the edges of image features. Some of these can be made unimportant by changing the image used for painting (if more than one image is sharp enough). Using warp mode, make fine adjustments as needed to eliminate visible shifts. - - TOPIC: STACK/PAINT +image: stack-paint.png - +image: stack-paint2.jpg - Stack (overlay) multiple photos of the same subject taken at different times. Remove tourists and cars that come and go between shots. - Making the photos: Aim the camera at the same distant point and take multiple photos as tourists or cars move in front of the subject. Try to get two or more photos for each area of the subject not obstructed by the transient objects. Hold the camera steady and aim at the same point, so that the images will align accurately. - Processing the photos: Choose the Stack/Paint menu function and select up to 9 images ({SELECT IMAGE FILES}). The images will now be aligned as well as possible. The output image (lower left) is an even mix of the aligned input images (top row). When the alignment is complete, the dialog shown above starts. You can select any input image and "paint" with the mouse on any area of the output image. The single selected image is used for the area being painted. For each area in the image, choose an input image that is free from the transient objects. The radius of the paintbrush can set larger or smaller, so you can paint large areas quickly and control fine detail when needed. - Automatic operation: press the [Hide] button to see if transient objects can be removed automatically. This will work for areas in the image where multiple photos of the unobstructed background are available (lower middle image). To show all of the transient objects, press the [Show] button (lower right image). This generally works, but not perfectly. Slight image misalignments or lighting differences (esp. moving shadows) may cause the algorithm to select background pixels instead of foreground pixels. You can use the paint method described above to repair the errors manually. - - TOPIC: STACK/NOISE +image: stack-noise2.jpg +image: stack-noise.png - This function combines 2-9 photos of the same subject. The photos should be nearly the same, except for small offsets caused by a hand-held camera. If the photos were made with a very high ISO setting (low light conditions), the pixels will have considerable noise. By making many photos and averaging them, the noise can be mostly eliminated. - Processing the photos: Chose the Stack/Noise function and select up to 9 images ({SELECT IMAGE FILES}). They will be combined automatically and shown, and a dialog will open. The initial output image is a combination of all the selected input images, averaged together. This means that the RGB values for each output pixel are the average of RGB values for the corresponding input pixels. The median button will change the output pixels to the median of the input pixels (1-3 middle RGB values are averaged, depending on the number of images). This may or may not be better, so switch back and forth to compare. The checkboxes for omit low pixel and omit high pixel will cause the lowest and highest RGB input values to be discarded before averaging. This may get noise spikes removed from the mix. This has no effect if the median method is selected. - - TOPIC: STACK/LAYERS +image: stack-layers.png - Use this function to combine different edited versions of an image, where you can determine which version is shown in selected image areas. Any images can be combined that have the same pixel dimensions. - Select up to 9 images of identical size. The initial output image is an equal blend of all input images. Image Ratios are the relative weights of the blended images. These can be adjusted to vary the weight of each image. Example: if 3 images are combined with relative weights of 3, 5, 7, then the combined image is 3/15 from image #1, 5/15 from #2, and 7/15 from #3. If the option "Paint entire image" is selected, the weights can be adjusted and the output image responds immediately. If the option "Paint within mouse" is selected, then the mouse can be dragged and only the area within the mouse circle is painted, using the image ratios currently active. The paint speed is controlled by the Power settings for the center and edge of the mouse. Use low numbers to paint gradually. - - TOPIC: PANORAMA +image: pano-align1.jpg +image: pano-align2.jpg - This function stitches 2-6 images together to make a wide-angle image or panorama. The images must overlap by 10% or more, so that the program can find where they match and join them together. Start by selecting 2-6 image files ({SELECT IMAGE FILES}). It is helpful to select the images in left-to-right order, to make the initial rough alignment easier. The images are initially joined and shown with a small transparent overlap. A pre-align dialog (above) asks you to drag the images into rough alignment. Drag the images into the correct left to right order. The image to drag may overlap other images. To be clear about which image is being dragged, drag from near the image center. After the images are in correct order, align each image to its left neighbor. It works best to proceed from left to right. Move an image horizontally and vertically into rough alignment with its neighbor to the left, then rotate the image if needed by dragging the bottom edge left or right - the image pivots around the mid-point of its overlap with the image to the left. The fastest method is to align the overlap middle region first, then rotate the right image if needed to bring the upper and lower overlap regions into alignment. Extreme accuracy is NOT necessary. The images should be correctly curved and fit together well. If they do not, then 'lens mm' (focal length, 35mm equivalent) needs adjustment. Image curvature changes as lens mm is adjusted. The initial value is obtained from EXIF metadata if available, and this is normally good enough. If the images have no curvature (e.g. scanned images), use the 'no curve' checkbox to set 'lens mm' effectively to infinity. - If any of the images have been cropped, the math depending on the the EXIF focal length does not work. You may be able to compensate by increasing the focal length in 'lens_mm'. - The 'manual align' checkbox will use the manual pre-alignment as the final alignment. This is for images that have no clear features needed to align the images. This option also allows the images to have zero overlap. - Press [proceed] when pre-alignment is finished, and the program will do fine alignment and join the images. Internally, the images are shifted and rotated and the degree of match is evaluated. This is done with increasing image sizes until the best alignment is found. This may need a minute or more, depending on CPU speed and image size. You can speed up the process greatly if you reduce the input images to 2/3 or 1/2 size. Do this also if the process fails for lack of memory. - +image: pano-adjust.jpg - When fine alignment is complete, the combined image is displayed. The above dialog is started for fine adjustments of brightness. You may see a border between images if they do not have the same brightness. Select an image using the radio buttons at the top. Use the [auto color] button repeatedly to automatically improve the brightness/color match of the images. The basis image is the currently selected one. Try different basis images to see which one works best. If the images are badly mismatched in brightness, select the biggest outlier and use the brightness control to change the brightness to match the others, followed by [auto color]. The match does not have to be very good, since 'Blend Width' (next) will mask remaining differences. Use the 'File Color' button to reset brightness levels from the input image files. - The 'Blend Width' control governs how the images are blended together: at the image overlaps, brightness is changed over this many pixels, to mask imbalances that cannot be fully corrected. The default is 1 pixel, which makes any brightness difference obvious. - If the images do not align perfectly, you may be able to improve the alignment by using the mouse to push the images into alignment. Select 'Mouse Warp' and select one of the images with the radio buttons. Then drag the mouse along the edge of the image where it should align with its neighbor, moving the image into alignment. The image is moved locally around the mouse while more distant parts stay fixed. Images with parallax shifting will require a compromise, since it is impossible to keep both foreground and background in alignment. - The flatten image control can be used to "unbend" the image, which will straighten curved lines (e.g. curved buildings). A value of zero has no effect and a value of 1.0 will fully flatten the image. - When done, use {UNBEND}, {WARP IMAGE}, {CROP} etc. for final adjustments. - ^Scanned images Scanned images can be combined if there is enough overlap. Check 'no curve' since there is no curvature. - ^Auto Warping The images are slightly warped in various directions during alignment to find the best match. This is to compensate for shifts in camera horizon or rotation, causing image distortions that reduce the quality of fit. If the overlap area of two images includes a large object that moved between the two photos, the alignment process may go crazy trying to match the images, making alignment very poor. By selecting 'no auto warp' you may be able to get the alignment to succeed or have a smaller error. Another option is to select manual align. - ^Combining Panoramas You can make a panorama of up to 6 images in one pass. You can also combine panoramas that fit together at the sides, e.g. combine a 4-image panorama with another 4-image panorama to make an 8-image panorama. You must stop the normal image curving when you combine panoramas, since the panorama images are curved already (assuming you have not used the 'flatten' option in the final panorama dialog). Stop image curving by checking the box 'no curve' in the pre-align dialog. - ^Panorama Limitations Panoramas including nearby objects can be tricky: when making the photos, be careful to turn the camera on an axis through the lens, with minimum lateral movement, otherwise the images may align poorly because foreground objects are shifted against the background (parallax). This is not an issue when the subject is 50+ meters away, since a small lateral movement has little impact on the image. Keep the camera level to avoid a large vertical shift (horizon shift), which can cause image distortions that may not be fully corrected. Avoid rotating the camera for the same reason. - ^Vertical Panorama This can be done by rotating the input images 90°. In Panorama, choose the images in order top to bottom, so that the top image is on the left and bottom is on the right. Do the panorama normally. Rotate the output image so that left becomes top. - - TOPIC: SHOW CIM FILES Show the input files for the current or latest combined image, in a popup window. Only the current or latest set is remembered. - - TOPIC: MASHUP +image: mashup.jpg - Arrange multiple images and text in a layout. Images can be added, resized, rotated and moved around by dragging with the mouse. Images can be made entirely or partly transparent in selected areas. Text can be added, moved, resized and rotated. Text attributes can be specified: font, size, color, outline, shadow, transparency. Lines and arrows can be added. The example here shows some of the possibilities. - +image: mashup1.png - In the first Mashup dialog, choose a background or layout image where other images will be placed. Choose an existing image or create a new monotone image with a specified size and color. You may also open a previously saved mashup project and continue editing. - +image: mashup2.png - The 2nd Mashup dialog is a choice: edit images, edit text, edit lines and arrows, rescale to a larger size, save the completed combined image (Done) or abandon the image (Cancel). The first three choices lead to dialogs to perform the respective edits. Each of these return to this dialog when done, so you can add or modify images, text, and lines/arrows in any sequence. Rescale is explained below. - +image: mashup3.jpg - Use this dialog to select and place images on the layout and revise their appearance: size, rotation, position, transparency. An image may be partly or wholely transparent, overall or within specified areas. This means that the background image or overlapped image can show through transparent areas. The Add Image button leads to a gallery file selection dialog ({SELECT IMAGE FILES}). Selected images are placed on the layout. After the images are added, click on any image to select for modifications. Drag the image from the middle to position the image in the layout. Drag the lower right corner to resize the image. Use the dialog controls to adjust the image. The dialog controls operate on the last image added, clicked or dragged. The 'Prev' and 'Next' buttons cycle through the images one at a time, flashing the selected image. This can be used when overlapped images make it difficult to select the desired image by clicking it. Scale rescales the image. Angle rotates the image. The Stacking Order buttons raise or lower an image relative to other images - this determines which overlapping image will be on top. Base Transparency is used to make an entire image partly transparent. The [paint] button is used to make any part of an image partly or fully transparent, using the Paint dialog shown below. The [warp] button is used to bend or warp an image, using the Warp dialog shown below. The 'black margins' checkbox can be used to remove black margins left by other edit functions, e.g. warp. These will be made transparent. The 'Image is fixed' button will prevent the image from being moved by the mouse or keyboard. This is helpful when images are being fine-aligned and accidental movement should be prevented. The Margins controls can be used to make image edges transparent. The Hard margins cut off image edges. The Blend margins make the edges partly transparent to blend them into the background or other overlapped images. - +image: mashup4.png - "Paint" more or less transparency for selected image areas. Click on an image to select it. The mouse pointer is a circle showing the range of action. Use radius to adjust the size. Left-drag the mouse over the image to make it transparent in the areas covered by the circle. Right-drag to make it opaque. If Gradual is checked, transparency changes are made slowly as the mouse is dragged. Specify a power value for the mouse center and edges to regulate the change rate. - +image: mashup5.png - The warp dialog is used to warp an image. Click on an image to select it. Drag the image with the mouse - the image will warp or stretch locally in the direction of the mouse (like sheet rubber). The area of warping is roughly given by warp span, which is a fraction of the image size. Each drag is a step that adds to previous steps. Recent steps can be reversed with [undo last], and the unbent image can be restored with [undo all]. - +image: mashup6.png - The Edit Text dialog is used for placing text on the layout. Enter some text and press [Apply]. You are asked to click on the layout where the text will be added. Drag it into position, then use the dialog controls to set font, size, color, angle, background color, outline size and color, shadow size and color, and transparencies for each of these. Drag the text to a new position at any time. Click on any existing text to show its properties in the dialog and revise them. Click on a text and press Delete to remove it. When done editing, press [OK] to return to the 2nd Mashup dialog. - +image: mashup7.png - The Edit Line/Arrow dialog is used for placing lines or arrows on the layout. It works very much like adding text. Enter a length and width and press [Add]. You are asked to click on the layout where the line will be added. A line is placed on the layout, or an arrow if one of the Arrow head options is checked. Drag the line/arrow to the desired position. Adjust length, width, angle and attributes (background, outline, shadow) using the dialog. You can also drag either end of the line/arrow to set the position of that end, while leaving the other end fixed. - You can use the mouse to move and resize objects in the layout: • click the object to select it - it flashes to confirm the selection. • drag from the approximate center to position the object. • drag the lower right corner to resize the object. • for a line/arrow, drag either end to move that end only. - The keyboard arrow keys can also be used to move the currently selected object in 1-pixel steps. - You can add images saved by {SELECT AREA}. In the Edit Images dialog, press [Add] to start the file selection dialog. Use the [Top] button in the gallery window, select 'saved_areas'. Open any of the .png images found there. The original area outline is used, and area blending works from these edges. - ^Mashup project files You can save a project and open it later to continue editing. The Mashup project is rebuilt using these images and some data saved in the project file: image and text locations, scales, transparency, etc. - ^Mashup Rescale Working with a very large layout (over 20 megapixels) can be quite slow. Dragging a large overlay image can be slow and jerky. You can work much faster if you use a smaller layout to build the project, and then make it larger after you are finished. There is no loss of resolution in the final image, since the overlay images and text are regenerated from the inputs. The Rescale button allows you to magnify the project by 2x, 3x or 4x. There is also a reset option to restore the original smaller project size. With this method, you can work with a 10 megapixel layout and rescale it up to 160 megapixels when done. The larger layout can still be worked on directly afterwards, but it will be slower. - - TOPIC: IMAGE ARRAY +image: image-array.jpg - Select many images and join them into a compact array format within a colored frame. - The first dialog is shown at upper left. Background Color is the color of the outline frame and the spaces between the contained images. Array Width is the overall width of the output array, and Margin is the width of the outer margin surrounding all images. Array height is determined by the number of selected image files and the space required to fit them in the frame. Image Columns specifies the number of image columns (6 in the above example). The number of rows depends on the number of image files selected. The Separation values set the horizontal and vertical space between the contained images. - Select the image files ({SELECT IMAGE FILES}), then press [Proceed] when done. The resulting image will be made in a few seconds (or minutes for hundreds of images). This image will typically have a very uneven bottom margin, as shown by the top right image above. The sequence of images in the array is determined by the selection order. The top row is filled first, left to right, then the 2nd row, etc. - The Optimize dialog begins automatically. It can rearrange the images so that the bottom margin is more even. Press [Start] and wait for the image to optimize. You can watch the progress. The function will exit if an optimum is found that makes the bottom margin even within 2 pixels. It may continue to search indefinitely if this goal is not reached. Press [Stop] to force the optimize function to exit with the best solution found so far. If optimization is successful, you will get even columns as shown in the lower right image. If the bottom edge is still uneven after optimization, you are asked if you want to add margins to some of the images to make the bottom edge even. This will result in an even bottom edge, but the vertical spacings will no longer be equal. - TIP: Optimization works best if the number of images per column is at least four (better more). This gives the optimizer enough flexibility to find a solution with an even bottom edge. - The last dialog appears, shown at lower left. You must now assign a file name to your array. A file save dialog is started, and you can save the new array file anywhere. If the copy metadata option is chosen, metadata is copied from the chosen input file to the output file. This is useful if the images are edited versions and you want the array to contain the edit history for the last version (or any version). - - TOPIC: BATCH MENU These are functions that process multiple selected image files, a few or thousands. These functions can be canceled in mid-process using the Escape key, but this will leave some files processed and some not. A popup report shows file names as they are processed. - - TOPIC: BATCH CONVERT +image: batch-convert.jpg - This function is used to rename, convert, rescale and move multiple image files. RAW files can also be converted into image files. The function runs in multiple parallel threads for maximum speed. - ^Dialog Inputs • Select Files - files to convert ({SELECT IMAGE FILES}). • Replace Text - replace text in file names (see below). • New Name - optional new name, inserted text (see below). • Sequence Numbers - base number and adder for output file names. • New Location - optional new folder location for output files. • New Type - file type for output files, or "no change". • Color Depth - specify 8 or 16 bits for tif or png output. • Max. Width, Height - optional limits for output files (only used if downsize or upsize is checked) • Rescale - optional rescale factor for output files • Delete Originals - Delete input files after successful conversion. • Copy Metadata - Copy all metadata to the output files. • Update Albums - replace album files with converted output files - ^Replace Text If text is entered here, file names are scanned for this text, and if found, the given replacement text is substituted. The replacement text can have a different length and can also be empty, in which the text is removed from the file name. - ^New Name and Plugins The new file name may have inserted text: a photo date (from EXIF metadata), a sequence number, or the original file name. Specify what and where to insert as follows: • $oldname - The original file name is inserted here • $sss - A running sequence number is inserted here. See below. • $yyyy $mm $dd - The photo date is inserted at these positions. - Example: San Francisco $yyyy:$mm:$dd $oldname $sss The input file "Golden Gate Bridge.jpg", with a photo date of May 12, 2014, would convert to the output file name "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg". - For "$sss", specify the length of the field with the number of 's' characters, e.g. "$ss" will be adequate for sequence numbers up to 99. Leading zeros are added for sequence numbers with fewer digits. Sequence numbers not fitting in the specified length are made as long as needed. Keep in mind that the file name sort order in the galleries is strictly ascii order, so the sequence of numbers 1, 2 ... 9, 10 will sort as 1, 10, 2 ... 9. You can keep the numeric order by specifying a field length of 2 ($ss), resulting in the sequence 01, 02 ... 09, 10. - Either "$oldname" or "$sss" must be present to insure output file names are unique. If New Location is missing or unchanged, delete originals is ignored. If an output file already exists, the input file is not converted. - ^Max. Width and Height If downsize and/or upsize is checked, then the output files will be resized within these limits, retaining the original width/height ratio. If downsize is checked, files larger than these limits are downsized to stay within the limits. If upsize is checked, files smaller than these limits are upsized so that either width or height is at the corresponding limit. This cannot be used with the Rescale option. - ^Rescale If one of the buttons is checked, output files are rescaled by the chosen factor. This cannot be used with the Max. Width and Height option. - ^Delete Originals If checked, input files are deleted, but only after the output file is successfully created. - ^Copy Metadata All metadata is copied from the input to the output file. Omit this option to remove metadata. - ^Update Albums If checked, all albums containing any of the input files are updated to the converted output files. - ^Preserving File Sequence If you specify a leading sequence number ($sss), the input file selection sequence will be preserved at the output location. Thus you can select image files in a desired order, or select from an album with ordered images, and preserve this sequence in the output. - - TOPIC: BATCH COPY/MOVE Copy or move selected image file to a new location. Select the input files ({SELECT IMAGE FILES}) from any folders known to Fotocx. If "Delete Originals" is selected, then the input files will be deleted after successfully moving them to the new folder. In this case, any albums referencing the now deleted input files are updated with the new file locations. - - TOPIC: BATCH UPRIGHT This function uprights image files rotated or flipped (mirrored). It depends on EXIF data to know if a file is rotated/flipped and in what direction. It is much faster than Batch Convert. You can simply select all candidate files and let it find the ones needing a fix. The search speed is about 3000 image files per minute on a strong computer. There are two options to specify the files to search. The [Select Files] button leads to a gallery file selection dialog ({SELECT IMAGE FILES}). If 'Survey all files' is checked, all image files under your top folders will be searched. - - TOPIC: BATCH DELETE/TRASH Select the files ({SELECT IMAGE FILES}). Select the option: delete or move to trash. [Proceed]. Files are listed in a popup report as they are deleted or moved to trash. After all files are deleted/trashed, albums are scanned and deleted files removed. - - TOPIC: BATCH OVERLAY +image: batch-overlay.png - A small overlay image can be added at a selected position on the selected input images. This can be used to add a credit line, copyright, etc. on top of the images. - Prepare the overlay image as follows: Use Blank Image to create a base image to hold the text. The scale does not matter, so make it larger than needed. Use Paint Transparency to paint the entire base image transparent. Use {MARKUP} > draw text to put the desired text on the base image, using font, color, and other attributes as desired. Scale the text to fill most of the base image. The base image (background) is transparent. Remove excess margins with {CROP} if needed. Save the final image. A convenient location is /saved_areas, but any folder can be used. This image can now be used as an overlay image for Batch Overlay. - Use the ^Select host image files^ button to select the host image files to receive the overlay image. Use the ^Select overlay file^ button to select the overlay image file. - The two ^Overlay position^ inputs determine where the overlay image is positioned on the host image, from 1-99% of the distance from top to bottom, and 1-99% of the distance from left to right. 0/0 means the top left corner, 99/99 means the bottom right corner. The overlay image will be positioned not to extend beyond the host image edges. - Specify ^Overlay width^ as a percent of the host image width. The height will be set to conserve the width/height ratio. If ^Make width constant for window size^ is checked, the overlay image visual size will be made constant for the window size specified below. Without this, a "tall" image that displays with large left and right margins would have a visually smaller overlay image. The initial window size is the current window. You can input any size. Press ^refresh^ to set the current window if this has changed. - If ^Replace host files^ is selected, the input host files are replaced with the output overlaid host files. If ^Make new versions^ is selected, new versions of the input host files are created. - - TOPIC: BATCH KEYWORDS +image: batch-keywords.jpg - Add, remove, or change the keywords for a large number of image files at once. - Use the [select files] button to select the image files ({SELECT IMAGE FILES}). - The dialog shows two lists of keywords: those to add to the selected files, and those to remove. Available keywords are shown in the Defined Keywords window below. One of these can be added to the currently selected keyword list (add or remove) by clicking it. A keyword can be deleted from either keyword list by clicking it. To replace keywords, specify the new keywords in the add keywords list and the old keywords in the remove keywords list. - If the list of defined keywords is long, it may be easier to type the desired keyword into Enter New Keyword. Existing keywords matching what you have typed so far will appear in Matching Keywords, and you can point and click one of these to add the keyword to the image. If the input keyword is new (no matching keyword is shown), press [Add] when the keyword is complete. It will be added to the selected keyword list and to the list of defined keywords under the category "nocatg". - If you are using keyword categories, you can select a category, and only those keywords will be shown in the list of defined keywords. If your keywords list is huge, this can reduce the list to a manageable size for pointing and clicking. - To get a list of images having specific keywords which you want to remove or replace, use {SEARCH IMAGES} to find the images, then start this function and use [select files] to add all the image files that you just found, or select any subset. - - TOPIC: BATCH RENAME KEYWORDS +image: batch-rename-keywords.png - Rename any number of keywords and apply these changes to your entire image collection. Click on a keyword to rename from the list of defined keywords, enter a new name in the Rename to box, then click on the arrow button to add this pair of names to the list on the right side. Repeat for each keyword to rename. Click on the pair of names in the list to remove them. Press [Proceed] when done. If you want to delete a keyword without renaming it, use 'delete' as the new name. - A popup window shows the number of image files containing the affected keyword names. Press [Yes] to proceed. The update rate is around 500/minute on a strong computer. The next time Fotocx is started, the index file function will update all thumbnails for the same images, because the file modification date has changed. - - TOPIC: BATCH PURGE KEYWORDS +image: batch-purge-keywords.jpg - Purge (delete) unwanted keywords from all image files. This is especially useful to get rid of unwanted keywords that were added from downloaded image files. Click on unwanted keywords on the left side of the dialog to add them to the purge list on the right side of the dialog. Press [proceed] when done. - - TOPIC: BATCH PHOTO DATE +image: batch-photo-date1.png +image: batch-photo-date2.png - Quickly fix a batch of photos that have no photo date/time or an incorrect one. Use the [select files] button to open a gallery window where you can select the image files to process ({SELECT IMAGE FILES}). - There are two ways to change photo date/times: • Set a new date/time (right image above): Enter a new year only (yyyy) - only the year is replaced in the files. Enter a date only (yyyy:mm:dd) - the date is replaced but not the time. Enter a full date/time (yyyy:mm:dd hh:mm:ss) - both are replaced. • Shift existing date/time (left image): Enter + or - values into any of the 6 fields: years, months, days, hours, minutes, seconds. Dates/times will be shifted by the entered values. - Shifted date/time values propagate to the next higher value when necessary: Time 08:30 shifted by -50 minutes results in 07:40 Date 2016-10-20 shifted by +6 months and -30 days results in 2017-03-21 (March has 31 days). - If the checkbox 'test' is selected, a report of the old and new date/times for the selected files is produced for inspection. No changes to the files are made. If you are satisfied that the results are correct, remove the checkbox and run again to update the files. - - TOPIC: BATCH CHANGE META +image: batch-change-meta.png - Revise metadata for multiple image files. You can add new metadata, revise existing metadata, and delete metadata. Use the [select files] button to open a gallery window from which you select files to process {SELECT IMAGE FILES}. Enter metadata tag names and values to be assigned, or leave the value blank to delete the tag. Press [apply]. You will get a confirmation message and you can proceed or cancel at this time. A list of commonly used tag names is provided on the left. Click one of these to insert it into the first empty tag name field in the dialog. This list comes from the file /metadata_picklist, which you can edit to add other tags to the list. The [Full List] button provides information on how to get a list of all available tag names. - - TOPIC: BATCH REPORT META +image: add-meta-tags.png +image: batch-report-meta.png - Report any metadata for any number of images. The output is a text file which is displayed in the default text editor for your system. You can use the search features of the text editor to find images matching desired metadata, or you can use the text file as input to other programs. Use the [select files] button to open a gallery window to select the files to be processed ({SELECT IMAGE FILES}). The [edit] button opens a new dialog (right) where you can select the metadata tags to be reported. Click a tag in the left column to add it to the right column and to the report. Click a tag in the right column to remove it. Click the last tag in the left column, "Other tag ...", to type-in any tag name not appearing in the list, which contains only the most likely needed tags. - - TOPIC: BATCH GEOTAGS +image: batch-geotags.png - Select many images and add the same location data to all of them. Use the [select files] button to select the image files from a gallery window ({SELECT IMAGE FILES}). Then get the location data as described in {EDIT MAIN META}, using the button [Find] or clicking a map marker. Use this function also to fix inconsistencies in location spelling or latitude/longitude data. If location and/or country is left blank, they are not updated. To erase location or country, input the name "null". If latitude and longitude are left blank, they are not updated. To erase latitude and longitude, input "0" for both values. You can update location/country only, latitude/longitude only, or both. In practice, you may find that the camera GPS inserts latitude and longitude without location and country, or it uses an unwanted language, or all capital letters, or some other value needing repair. - - TOPIC: EXPORT FILES Copy selected image files to another folder. The intended use is for copying files to share with others, e.g. uploading files to a web site. The output files are JPEG. You can optionally downsize the images. Select image files by clicking gallery thumbnails ({SELECT IMAGE FILES}). Select a folder where the image files will be copied. If 'export metadata' is selected, a limited set of metadata is also copied. These are: photo date, keywords, copyright, title, description. - - TOPIC: TOOLS MENU - - TOPIC: INDEX FILES +image: index-files1.png - Fotocx needs to know all your image file folder and file names and embedded metadata (dates, tags, geotags, titles, descriptions, ratings). This data is indexed for fast searching. Fotocx also creates thumbnail images so that the gallery windows (thumbnail pages) will display fast. Fotocx does not modify or copy your image files. The space required is typically 2% of your image file space. - The Index Files function runs whenever Fotocx is started. This function will create missing thumbnails, replace outdated ones, and refresh the metadata index using current data from your image files. This may need significant time if you have many thousands of new files. - Image files modified or moved within Fotocx are taken care of automatically. The Index function is used only for new image files created from outside Fotocx (e.g. a new batch of photos was added), and for files modified or moved from outside Fotocx. - Enter your top image folders (e.g. /home//Pictures). Use the [browse] button to locate and add folders. These folders and any contained subfolders will be processed. It does not matter if other files are mixed with the images. Delete an entry by clicking the corresponding 'X'. - Enter the thumbnails folder where thumbnail files will be stored. Use the supplied default or set your own location. - If you have used folder or file names to classify your images, you can make immediate use of these in the {SEARCH IMAGES} function. If you have saved dates, keywords, geotags, titles, or ratings in your image metadata, these will also be searchable. After the images are indexed, searching by any of these is almost instantaneous. - ^Metadata Tags The following metadata is included in the image index by default: • folder and file names • photo date/time • file modification date/time • title and description (exif metadata) • rating (0-5 stars) • keywords (user labels) • geotags (country and location names and latitude/longitude) • camera: make, model, lens • exposure: time, f-number, focal length, ISO - ^Extra Metadata tags +image: index-files2.png - You may add up to 20 other metadata tags to the image file index. Metadata in this list can be searched as fast as the standard tags. You may not need this, but if you sometimes need to search non-standard metadata tags, you can add them here and the search speed will be almost instantaneous. Press the [select] button for "extra metadata" to get the above dialog. Click on tags in the left list to add them to the right list - the tags to be added to the index. Click on a tag in the right list to remove it. Press [done] to commit the changes. Your entire image collection will be indexed again. This will proceed faster than the initial indexing because thumbnails are not re-created. - ^Accessing non-indexed Files and Folders A non-indexed image file or folder is one that is not included within your declared top image folders (subfolders of your declared image folders are always included). You can navigate to such a folder and view the thumbnails normally, and you can view and edit such files normally. There are limitations that you should understand: • These files will be missing from any search results and map views. • Thumbnails are created at the time of viewing - galleries will be slow. If you access a portable (slow) storage device (e.g. camera SD card), you will notice the balky performance. Thumbnails will be created as needed, and they will remain after the device is removed. Suggestion: copy the files to a declared Fotocx folder, then do whatever processing you need from this location. The performance will be much better. - ^Removable Storage (USB drive) If your top image folders include folders on a removable drive, and you run Fotocx without the drive mounted, the index data and thumbnails are still preserved, even though the removable files have disappeared. When the removable drive is mounted again, and Fotocx is started, the last status is restored. If any files were added or modified in the interim, index data and thumbnails are updated. - - TOPIC: MOVE FOTOCX HOME The Fotocx home folder contains all user settings and data, including some files from the Fotocx package that can be customized by the user. Default location: /home//.fotocx. If multiple versions or releases of Linux are installed, it may be desirable to have one shared Fotocx home folder instead of one for each release. The same could be true if multiple users need to access the same Fotocx instance. - Use this function to move the Fotocx home folder somewhere else. The selected folder should include "fotocx" within the path name, or "/fotocx" will be appended if not. - See {COMMAND PARAMETERS} -home parameter if you want multiple Fotocx image collections, managed separately. - - TOPIC: SETTINGS +image: settings.jpg - Various user preferences and settings are collected and saved in the file /parameters. Most changes are made immediately. Some will cause Fotocx to restart. - • Select the desired 2-character language code. Fotocx will restart in the selected language. • Startup View - initial display when Fotocx is started. Recent Files: the most recently seen image files Newest Files: files most recently added/modified Specific Gallery: the specified folder gallery Album Gallery: the specified album gallery Previous Gallery: gallery last used in prior session Previous File: file last viewed in prior session Specific File: the specified image file Browse button: select a folder, album, or image file • Background - background colors for File and Gallery View windows • Menu Style - menu display style: icons, text, or both • Menu Colors - menu text color and background color • Dialog Font - font for menus and dialogs • Show Hidden - if selected, show hidden files and folders • Zoom Speed - Choose 1-8 clicks or [+] keys per 2x image increase • JPEG files - quality level, default 90, use 70+ for good quality • Curve Node - minimum node separation for edit curves, % of scale. The default is 5% of scale. Use a higher value for touchpads. • Image Position - image is left/center/right within a wider window • Confirm Exit - popup dialog option: you really want to quit? • Index Level - see below • RAW Loader - see below • RAW Options - see below • RAW Files - list of RAW file types used • Video Files - list of video file types used • Video App - see below - ^File Quality and Compression JPEG file quality level: use 70 or higher for good image quality (default 90). TIFF file compression method is DEFLATE (best for color images). PNG file compression level is '1'. Higher values seem to do nothing but increase the file save time (libpng). - ^Image Position If the window is wider than the image (i.e. window width/height ratio > image), the image can be shifted to the left side, centered, or to the right side. If left or right, the unused margin is maximized, which may be more convenient to position dialog boxes. - ^Image Index Level These two parameters govern a tradeoff between startup time and completeness of the image index. • $ fotocx: Applies when fotocx is started using a shell command, system menu, or system icon/launcher. The recommended value of '2' means full indexing: load the old index file, search for new files (not yet indexed) and update the fotocx index file. • $ fotocx : Applies when fotocx is started by clicking on a file name in a file manager list. The recommended value of '1' means load the old index file but do not search for new files to update the index. Startup is moderately fast. Image search and map functions work normally, but any new (not yet indexed) image files are not included. • Alternative: '0' means no indexing. The startup is very fast. Later use of an image search or map function will start the file index function for old files only (no search for new/modified files). Use this option if your image collection is gigantic and startup time exceeds a few seconds. You can start the index function later if needed. - ^RAW Loader The RAW loader is the command used to read a RAW file and convert it to TIFF with 16-bit color depth. It is used when a RAW file is viewed. You can use the Fotocx edit functions to edit and optimize the file. The default RAW loader is dcraw using the sRGB color space. A few other options using dcraw or rawtherapee are supplied in the pick list. These commands are kept in the file 'raw_commands_*' in the Fotocx home folder. Edit this file to change or add new options (see below). You may want to prepare multiple commands for multiple cameras or multiple processing options. If you prefer to use a RAW editor interactively, create a plugin command for this - see {PLUGINS}. - ^RAW Options • edit commands: press the button to edit the list of RAW loader commands. A text editor will start in a new window, with the current list of commands. • match embedded image color: use the RAW file embedded image as a guide to map the RAW image colors to the converted TIFF image. This is the camera maker's interpretation of the RAW data - a good place to start if the RAW file needs further editing. The embedded image is usually the same as the JPEG file from the camera. - ^Video App Enter a shell command to start a video playback app. Use '%s' to mark where the video file name is inserted in the command line. Here are some examples: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: KEYBOARD SHORTCUTS +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - View or change custom keyboard shortcuts. Currently assigned shortcuts are shown in the first window. If you press the [Edit] button, the second dialog is shown, where you can add and change keyboard shortcuts. Enter a new shortcut using the keyboard. You can use the keys A-Z, 0-9, F2-F9, and most of the symbols (% $ & * < etc.). You can combine a key with one of Ctrl/Alt/Shift: Press and hold ONE of Ctrl/Alt/Shift, then press the key, then release both. Select one of the available menu assignments from the list on the right, then press [Add] and [OK]. Remove a shortcut by selecting it and pressing [Delete]. - - TOPIC: RGB HISTOGRAM +image: RGB-hist.png - A small window shows a brightness histogram graph of the current image in File view, or the currently selected area of the image. This graph updates synchrnously as edit functions change the image. Use the buttons [All] [Red] [Green] [Blue] to select colors to show. - - TOPIC: MAGNIFY IMAGE +image: magnify-image.jpg - Magnify the image in an area around the mouse pointer. Left-drag the mouse around the image to magnify different areas, analogous to viewing a printed image with a loupe. Use the dialog to adjust the radius of the area and the amount of magnification. - - TOPIC: MEASURE IMAGE Click any two positions within an image to measure the pixel distance between the points. The clicked positions are labeled A and B on the image. These labels always show last two points clicked. The dialog is updated with the distances separating these two points: X-distance (horizontal distance) Y-distance (vertical distance) H-distance (total distance) - - TOPIC: SHOW RGB +image: show-RGB.png - When a point on the image is clicked, the RGB values are shown in a dialog window. The last 9 clicked points are displayed. The values have the format xxx.dd, where xxx is the upper 8 bits of the color value and .dd is the lower 8 bits. The range is 0.00 to 255.99. The lower 8 bits are zero unless the image is being edited or has over 8 bits of color depth. The outputs are updated in real time if the image is being edited. If "labels" is checked, the points are labeled on the image with letters corresponding to the letters in the dialog window. If "delta" is checked and the image is being edited, then RGB changes are shown instead of the absolute values. - If you open another image (e.g. to compare with the prior image), the positions are kept and updated if they are within the new image boundaries. This facilitates the comparison of images at the level of pixel RGB values. - - TOPIC: GRID SETTINGS +image: grid-settings.jpg - There are two grid line functions: Grid Settings sets all grid parameters. Toggle Grid sets the grid lines on or off. Grid lines are horizontal and vertical lines at regular intervals across the image. These lines can be useful alignment guides when an image is unbent or warped to straighten walls or other objects in the image. Use the x-count and y-count inputs to set the number of vertical and horizontal lines respectively. The x- and y-offset controls can be used to shift the grid lines to intersect a desired position in the image. A keyboard shortcut (default shift+G) can be assigned to Toggle Grid, so the grid lines can be turned on or off with one keystroke. - - TOPIC: LINE COLOR Some functions draw lines over the image (Crop, Select Area, others). You can change the color of these lines to maximize contrast against the background image. The small dialog can be left open while editing, to conveniently switch among available colors (black, white, red, green). - - TOPIC: DARK/BRIGHT PIXELS Highlight the darkest and brightest pixels in an image. Adjust the two spin controls to set the brightness thresholds, which are initially 0 for dark pixels and 255 for bright pixels. Pixels with a brightness less than the dark threshold or greater than the bright threshold are "blinked" to make them stand out. Use this function to detect clipping after editing brightness or color. - - TOPIC: MONITOR COLOR +image: moncolor-small.png - Eight color bands are written across the screen with brightness from zero (black) to 100%. You can use this to adjust the brightness and contrast of your monitor. There should be no unchanging regions at either end of the bands. - - TOPIC: FIND DUPLICATES +image: find-dups.png - Find duplicated image files anywhere within your image database. A duplicate file can be a file that exactly or "almost" duplicates another file. For the sake of speed, thumbnail images are compared in memory. It is possible that matching thumbnails are found for main images having minor differences not reflected in the thumbnails. An image copy that was reduced in size is likely be classified as a duplicate. Thumbnail size can be set from 32 to 512 pixels. A larger size reduces the probability of false positives. The thumbnail size greatly affects the amount of main memory required - e.g. for 100K images, size 64 needs about 880 MB, whereas size 256 needs about 14 GB. Press the [calculate] button to calculate the largest thumbnail size that can fit within the free memory available. - Two parameters are used to set the sensitivity for detection of identical or nearly identical images: pixel difference is the RGB value difference below which pixels are considered equal. Pixel count is the number of different pixels below which two images are classified as duplicates. Example: if pixel difference = 2 and pixel count = 10, then images are classified as duplicates if fewer than 10 pixels differ by 2 or less. - The output is a gallery showing each set of duplicate images. The output gallery is saved as album "Duplicate Images". You can use Batch Delete/Trash together with this album to choose which duplicates to delete. - - TOPIC: FIND BAD FILES All image files within your declared top folders are read. For each file that cannot be read, you have three options: • delete the file • fix an incorrect file type (see below) • move the file somewhere outside your top image folders I have often seen .png files with a .jpg extension. Web browsers and some other apps deal with this silently. Here, the correct file type is reported and you can change the extension to the correct one. - - TOPIC: SHOW RESOURCES Report the computer resources used by Fotocx: • CPU time: usage since Fotocx startup or since the last sample • Real memory: the real memory currently in use (excluding swap) • Maps cache: MB of disk storage used for cached map tiles • Clear cache: delete all cached map tiles • [Sample] button: take a new sample and report the data - The [Sample] button resets the CPU time. The next sample will show only new accumulated CPU time. The CPU time is the sum for all process threads. - - TOPIC: TRANSLATIONS Translations for several languages are included in the Fotocx package. These AI translations are not perfect. Translation errors can be corrected by editing the translation files. - ^Changing the GUI language The {SETTINGS} menu can be used to change the language. The language can also be set when Fotocx is started: $ fotocx -lang xx # language xx (de fr zh etc.) $ fotocx -lang en # English - ^Modify a GUI translation Edit the file /translations/gui_xx The pairs of text lines have leading 4-digit numbers which must match. The first line is English, the 2nd line is language xx. Modify the xx line only, never the English line. The special characters for inserting parameters into the text must remain in the same sequence. These are '%d' (integer parameter), '%f' (decimal), '%s' (text). - ^Modify a userguide translation Edit the file /translations/ug_xx Edit ug_xx to fix the translation. Do not add or remove any text lines or change the sequence. The text lines must correspond 1:1 with the English user guide, ug_en. - Send revised files for inclusion in the next Fotocx release: mkornelix@gmail.com - - TOPIC: HELP MENU • User Guide - Show table of contents • Video Tutorial - Show a Fotocx video tutorial on YouTube • Outboard Programs - List outboard programs and their functions • Show Log File - Display logged information and error messages • Command Parameters - Show available command line parameters • Change Log - Show additions and bug fixes in recent releases • Copyright - Show copyrights and licenses relevant for Fotocx • Privacy - Show the privacy policy (rules) for Fotocx • About - Show release number, executable location, contact • Home Page - Show the Fotocx home page on kornelix.net • Uninstall - How to uninstall Fotocx - - TOPIC: OTHER TOPICS The following topics are not connected to Fotocx menus. - - TOPIC: VIDEO FILES Video files (.mpeg, .mp4, etc.) may be mixed-in with your image files. They will show as image files in both file and Gallery View. The 'P' key will start, pause, and resume the video, or replay a video that has ended. The 'Q' key will quit the video. Use the {SETTINGS} menu to select the application for playing video files. - - TOPIC: SLIDES AND NEGATIVES +image: color-negative.jpg - You can use a camera with close-up capability to capture slides or film negatives. Use a light box for illumination, or use the sky (example above). To process a color negative, first make a positive - see {COLOR MODE}. If the image is foggy, select the image area only, excluding the film edges, and then use {GLOBAL RETINEX} to eliminate the fog. Set the white and black points by clicking on the image if needed to further reduce fog. - - TOPIC: FOTOCX LIMITATIONS • There is a hard limit of one million files. • image versions - up to 99 versions for undo/redo and version naming. • image keywords - 10K total keywords. 1000 characters for a single image. • Galleries are limited to 40K image files. • max. image dimensions are 40K x 20K pixels. - - TOPIC: FOTOCX FOR WINDOWS 11 Fotocx can be used in Windows 11 by installing Windows Subsystem for Linux 2, or WSL2. There is ample documentation in the internet about how to do this. - If your image files are in the Windows file system (NTFS), Fotocx will be very slow. Therefore move your image files to the Linux file system. You can still access them using Windows File Explorer and other Windows apps, so nothing is lost. Microsoft also recommends the Linux file system for improved performance. Use the 'Linux' icon in File Explorer to access your home folder in the Linux file system. Add a Pictures folder if needed, and move your image files there. - If a Fotocx package is available, install it. Otherwise, do the following: Download the Fotocx binary package file from ^https://kornelix.net. In the Linux terminal: $ cd /mnt/c/Users//Downloads # go to Windows downloads folder $ tar -xzf fotocx-xxx-bin.tar.gz # unpack package to folder fotocx $ cd fotocx # go to folder fotocx $ chmod u+x install.sh # make install script executable $ ./install.sh # run the script, install fotocx $ fotocx # start Fotocx You may need to restart the Linux window for the last step to work. - Read the introductory parts of this user guide. Fotocx has deep functionality. Do not expect to master Fotocx in a few minutes. - - TOPIC: PRIVACY Fotocx does not retain any user data other than image files and their metadata. Metadata should be removed from image files before uploading to the internet, and Fotocx provides a simple method to do this. - - TOPIC: PROBLEM, QUESTION, SUGGESTION Send e-mail to mkornelix@gmail.com. If there is a crash dump (zappcrash file) send this also. - fotocx/data/translations/gui_tr0000664000175000017500000037467215247006657015727 0ustar micomico0000 + Zoom-in \n 0000 + Yakınlaştır \n 0001 - Zoom-out \n 0001 - Uzaklaştır \n 0002 = Zoom-in \n 0002 = Yakınlaştır \n 0003 Arrow keys Previous/Next file \n 0003 Arrow keys Önceki/Sonraki dosya \n 0004 Delete Delete/Trash file \n 0004 Delete Dosyayı sil/çöpe at \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Escape İletişim kutusundan çık / Fotocx'ten çık \n 0006 F1 User Guide, Context Help \n 0006 F1 Kullanıcı Kılavuzu, Bağlamsal Yardım \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 Tam Ekran / menüsüz \n 0008 Home/End Gallery start/end \n 0008 Home/End Galeri başı/sonu \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 Dizinleme süresi, görüntü dosyalarınızın sayısına, türüne ve boyutuna \n ve bilgisayarınızın hızına bağlıdır. Bu süre \n dakikada birkaç yüzden 10 binin üzerine kadar değişebilir. \n Dizin seçeneklerini daha sonra şu menüleri kullanarak değiştirebilirsiniz: \n Araçlar > Dizin, Araçlar > Ayarlar. \n 0010 Page keys Gallery page up/down \n 0010 Page keys Galeri sayfa yukarı/aşağı \n 0011 Z 1x <--> fit to window \n 0011 Z 1x <--> pencereye sığdır \n 0012 $s plugin needs base and adder 0012 $s eklentisi taban ve ekleyici gerektirir 0013 % from left: 0013 % soldan: 0014 % from top: 0014 % yukarıdan: 0015 %d albums selected 0015 %d albüm seçildi 0016 %d image files selected 0016 %d görüntü dosyası seçildi 0017 %d images 0017 %d görüntü 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 %d keyword temizlenecek \n%d görüntü dosyasında. \nDevam edilsin mi? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 %d keyword yeniden adlandırılacak \n%d görüntü dosyasında. \nDevam edilsin mi? 0020 %d max images exceeded 0020 %d maksimum görüntü sayısı aşıldı 0021 %d red-eye limit reached 0021 %d kırmızı göz sınırına ulaşıldı 0022 %s %s %d folders %d files 0022 %s %s %d klasör %d dosya 0023 %s *** date/time conversion failed \n 0023 %s *** tarih/saat dönüştürme başarısız \n 0024 %s ALBUM %s %d files 0024 %s ALBÜM %s %d dosya 0025 %s NEWEST FILES 0025 %s EN YENİ DOSYALAR 0026 %s RECENT FILES 0026 %s SON DOSYALAR 0027 %s SEARCH RESULTS %d files 0027 %s ARAMA SONUÇLARI %d dosya 0028 %s UNKNOWN 0028 %s BİLİNMİYOR 0029 %s added to script 0029 %s betiğe eklendi 0030 %s is already indexed 0030 %s zaten dizinlenmiş 0031 %s renamed: %s 0031 %s yeniden adlandırıldı: %s 0032 %s: metadata update failed 0032 %s: metadata güncellemesi başarısız 0033 %s: no write permission 0033 %s: yazma izni yok 0034 %s: reserved, cannot be used 0034 %s: ayrılmış, kullanılamaz 0035 %s: too many keywords 0035 %s: çok fazla keyword 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\nFotoğraf Tarihi: %s Dosya Tarihi: %s \nDerecelendirme: %s Boyut: %s %.2fmb \nKonum: %s %s %s \nKeywords: %s \nBaşlık: %s \nAçıklama: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\nFotoğraf Tarihi: %s Dosya Tarihi: %s \nDerecelendirme: %s Boyut: %s %.2fmb \nKonum: %s %s %s \nKeywords: %s \nBaşlık: %s \nAçıklama: %s \n----------------------- \n%s 0038 (click below) 0038 (aşağıya tıklayın) 0039 (no selection) 0039 (seçim yok) 0040 (pixels) 0040 (piksel) 0041 (press key) 0041 (bir tuşa basın) 0042 (select function) 0042 (işlev seçin) 0043 *** bad utf8 detected *** \n 0043 *** hatalı utf8 tespit edildi *** \n 0044 *** cannot create new file \n 0044 *** yeni dosya oluşturulamıyor \n 0045 *** cannot get real path of input file \n 0045 *** girdi dosyasının gerçek yolu alınamıyor \n 0046 *** cannot load input file \n 0046 *** girdi dosyası yüklenemiyor \n 0047 *** cannot make new version of input file \n 0047 *** girdi dosyasının yeni sürümü oluşturulamıyor \n 0048 *** cannot open input file 0048 *** girdi dosyası açılamıyor 0049 *** cannot read input file 0049 *** girdi dosyası okunamıyor 0050 *** cannot save output file \n 0050 *** çıktı dosyası kaydedilemiyor \n 0051 *** completed \n 0051 *** tamamlandı \n 0052 *** file date/time invalid \n 0052 *** dosya tarihi/saati geçersiz \n 0053 *** file type not supported \n 0053 *** dosya türü desteklenmiyor \n 0054 *** invalid file \n 0054 *** geçersiz dosya \n 0055 *** metadata update error \n 0055 *** metadata güncelleme hatası \n 0056 *** no date/time available \n 0056 *** tarih/saat bilgisi yok \n 0057 + bright 0057 + parlak 0058 +Blue -Yellow 0058 +Mavi -Sarı 0059 +Brightness 0059 +Parlaklık 0060 +Green -Magenta 0060 +Yeşil -Macenta 0061 +Red -Cyan 0061 +Kırmızı -Camgöbeği 0062 - blue 0062 - mavi 0063 - fog/haze 0063 - sis/pus 0064 .heic/.avif files not supported (install heif_convert) 0064 .heic/.avif dosyaları desteklenmiyor (heif_convert yükleyin) 0065 .jp2 files not supported (install opj_decompress) 0065 .jp2 dosyaları desteklenmiyor (opj_decompress yükleyin) 0066 .webp files not supported (install dwebp) 0066 .webp dosyaları desteklenmiyor (dwebp yükleyin) 0067 0 albums selected 0067 0 albüm seçildi 0068 0 duplicates 0068 0 yinelenen 0069 0-5 stars 0069 0-5 yıldız 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = görüntü dizini yok, yalnızca eski dizin, eski + yeni/değiştirilmişi güncelle 0071 2-character code 0071 2 karakterli kod 0072 3D depth 0072 3D derinlik 0073 <2 images 0073 <2 görüntü 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 Yeni bir Fotocx sürümü kuruluyor. \nÖzel ayarlarınızı geri yüklemeniz gerekebilir. 0075 ADD GLARE 0075 PARLAMA EKLE 0076 ADD NOISE 0076 GÜRÜLTÜ EKLE 0077 ADJUST HSL 0077 HSL AYARLA 0078 ADJUST RGB 0078 RGB AYARLA 0079 ALBUM MASS UPDATE 0079 ALBÜM TOPLU GÜNCELLEME 0080 ALBUMS 0080 ALBÜMLER 0081 ALBUMS MENU 0081 ALBÜMLER MENÜSÜ 0082 ALIEN COLORS 0082 UZAYLI RENKLER 0083 AMPLIFY CONTRAST 0083 KONTRASTI ARTIR 0084 ANTI-ALIAS 0084 KENAR YUMUŞATMA 0085 AREA BLEND 0085 ALAN KARIŞTIRMA 0086 AREA FILL 0086 ALAN DOLDURMA 0087 AREA OVERVIEW 0087 ALAN GENEL GÖRÜNÜMÜ 0088 AUTOSEARCH 0088 OTOMATİK ARAMA 0089 About 0089 Hakkında 0090 Action 0090 Eylem 0091 Add 0091 Ekle 0092 Add 1 0092 1 Ekle 0093 Add All 0093 Tümünü Ekle 0094 Add Current 0094 Geçerli Olanı Ekle 0095 Add Current File Here 0095 Geçerli Dosyayı Buraya Ekle 0096 Add Glare 0096 Parlama Ekle 0097 Add Image 0097 Görüntü Ekle 0098 Add Line 0098 Satır Ekle 0099 Add Margins 0099 Kenar Boşlukları Ekle 0100 Add Noise 0100 Gürültü Ekle 0101 Add Random Noise 0101 Rastgele Gürültü Ekle 0102 Add Selected Files Here 0102 Seçili Dosyaları Buraya Ekle 0103 Add Texture 0103 Doku Ekle 0104 Add a brightness/color ramp across an image 0104 Görüntü boyunca bir parlaklık/renk geçişi ekleyin 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 Yer imi ekle: bir galeri thumbnail'ine tıklayın. \nYer imini yeniden adlandır: üzerine tıklayın ve [Yeniden Adlandır]'a basın 0106 Add glare around bright objects 0106 Parlak nesnelerin çevresine parlama ekleyin 0107 Add margins around an image 0107 Görüntünün çevresine kenar boşlukları ekleyin 0108 Add newest version to existing versions 0108 En yeni sürümü mevcut sürümlere ekleyin 0109 Add overlay image (e.g. copyright) to selected images 0109 Seçili görüntülere kaplama görüntüsü ekleyin (ör. telif hakkı) 0110 Add random noise to an image 0110 Görüntüye rastgele gürültü ekleyin 0111 Add selected versions to existing versions 0111 Seçili sürümleri mevcut sürümlere ekleyin 0112 Add texture to an image 0112 Görüntüye doku ekleyin 0113 Add to Selection 0113 Seçime Ekle 0114 Add/change/delete metadata for selected image files 0114 Seçili görüntü dosyaları için metadata ekleyin/değiştirin/silin 0115 Add/remove barrel/pincushion distortion 0115 Fıçı/yastık bozulmasını ekleyin/kaldırın 0116 Add/remove brightness/color radially from chosen center 0116 Seçilen merkezden radyal olarak parlaklık/renk ekleyin/kaldırın 0117 Add/remove keywords for selected image files 0117 Seçili görüntü dosyaları için keyword ekleyin/kaldırın 0118 Add/revise location/geocoordinates for selected image files 0118 Seçili görüntü dosyaları için konum/coğrafi koordinatları ekleyin/düzenleyin 0119 Adjust HSL 0119 HSL Ayarla 0120 Adjust Image Contributions 0120 Görüntü Katkılarını Ayarla 0121 Adjust Pixel Composition 0121 Piksel Kompozisyonunu Ayarla 0122 Adjust RGB 0122 RGB Ayarla 0123 Adjust brightness, contrast, color 0123 Parlaklığı, kontrastı, rengi ayarlayın 0124 Adjust color saturation based on brightness 0124 Rengin doygunluğunu parlaklığa göre ayarlayın 0125 Adjust color using HSL color model 0125 HSL renk modelini kullanarak rengi ayarlayın 0126 Adjust color using RGB or CMY colors 0126 RGB veya CMY renklerini kullanarak rengi ayarlayın 0127 Adjustment 0127 Ayarlama 0128 Album Mass Update 0128 Albüm Toplu Güncelleme 0129 Album Name 0129 Albüm Adı 0130 Albums 0130 Albümler 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 Albümler: sürükle & bırak ile düzenlenen seçili görüntü galerisi 0132 Algorithm Iterations 0132 Algoritma Yinelemeleri 0133 Alien Colors 0133 Uzaylı Renkler 0134 All 0134 Tümü 0135 All Areas 0135 Tüm Alanlar 0136 All files 0136 Tüm dosyalar 0137 All image files will be re-indexed. \nContinue? 0137 Tüm görüntü dosyaları yeniden dizinlenecek. \nDevam edilsin mi? 0138 All±1 0138 Tümü±1 0139 All±10 0139 Tümü±10 0140 Alpha 0140 Alfa 0141 Amount 0141 Miktar 0142 Amplify 0142 Artır 0143 Amplify Contrast 0143 Kontrastı Artır 0144 Amplify area contrast to enhance visibility of details 0144 Ayrıntıların görünürlüğünü artırmak için alan kontrastını artır 0145 Angle 0145 Açı 0146 Anti-Alias 0146 Kenar Yumuşatma 0147 Apply 0147 Uygula 0148 Apply a soft focus effect to an image 0148 Görüntüye yumuşak odak efekti uygulayın 0149 Apply repeatedly while watching the image. 0149 Görüntüyü izlerken tekrar tekrar uygulayın. 0150 Area Blend 0150 Alan Karıştırma 0151 Area Edge Blend 0151 Alan Kenar Karıştırma 0152 Area Fill 0152 Alan Doldurma 0153 Arrange images and text in a layout (photo-montage) 0153 Görüntüleri ve metni bir düzende (foto-montaj) düzenleyin 0154 Array Complete 0154 Dizi Tamamlandı 0155 Array Width 0155 Dizi Genişliği 0156 Arrow head 0156 Ok başı 0157 Auto Level 0157 Otomatik Seviye 0158 Auto black level 0158 Otomatik siyah seviyesi 0159 Auto crop: 0159 Otomatik kırpma: 0160 Auto white balance 0160 Otomatik beyaz dengesi 0161 Auto-replay 0161 Otomatik tekrar oynatma 0162 BATCH CHANGE META 0162 TOPLU META DEĞİŞTİR 0163 BATCH CONVERT 0163 TOPLU DÖNÜŞTÜR 0164 BATCH COPY/MOVE 0164 TOPLU KOPYALA/TAŞI 0165 BATCH DELETE/TRASH 0165 TOPLU SİL/ÇÖPE AT 0166 BATCH GEOTAGS 0166 TOPLU GEOTAG 0167 BATCH KEYWORDS 0167 TOPLU KEYWORD 0168 BATCH MENU 0168 TOPLU MENÜ 0169 BATCH OVERLAY 0169 TOPLU KAPLAMA 0170 BATCH PHOTO DATE 0170 TOPLU FOTOĞRAF TARİHİ 0171 BATCH PROCESSING 0171 TOPLU İŞLEM 0172 BATCH PURGE KEYWORDS 0172 TOPLU KEYWORD TEMİZLE 0173 BATCH RENAME KEYWORDS 0173 TOPLU KEYWORD YENİDEN ADLANDIR 0174 BATCH REPORT META 0174 TOPLU META RAPORU 0175 BATCH SCRIPT 0175 TOPLU BETİK 0176 BATCH UPRIGHT 0176 TOPLU DÜZELTME 0177 BLANK IMAGE 0177 BOŞ GÖRÜNTÜ 0178 BLUR 0178 BULANIKLAŞTIRMA 0179 BOOKMARKS 0179 YER İMLERİ 0180 BRIGHTNESS RAMP 0180 PARLAKLIK GEÇİŞİ 0181 Background 0181 Arka Plan 0182 Background Blur - blur relative to distance from foreground 0182 Arka Plan Bulanıklığı - ön plana olan mesafeye göre bulanıklık 0183 Background Color 0183 Arka Plan Rengi 0184 Background Pattern 0184 Arka Plan Deseni 0185 Base Transparency 0185 Taban Saydamlığı 0186 Batch 0186 Toplu 0187 Batch Add/Change Metadata 0187 Metadata Ekle/Değiştir (Toplu) 0188 Batch Add/Remove Keywords 0188 Toplu Keyword Ekle/Kaldır 0189 Batch Change Meta 0189 Toplu Meta Değiştir 0190 Batch Convert 0190 Toplu Dönüştür 0191 Batch Copy/Move 0191 Toplu Kopyala/Taşı 0192 Batch Delete/Trash 0192 Toplu Sil/Çöpe At 0193 Batch Geotags 0193 Toplu Geotag 0194 Batch Keywords 0194 Toplu Keyword 0195 Batch Metadata 0195 Toplu Metadata 0196 Batch Overlay 0196 Toplu Kaplama 0197 Batch Photo Date 0197 Toplu Fotoğraf Tarihi 0198 Batch Photo Date/Time 0198 Toplu Fotoğraf Tarihi/Saati 0199 Batch Purge Keywords 0199 Toplu Keyword Temizle 0200 Batch Rename Keywords 0200 Toplu Keyword Yeniden Adlandır 0201 Batch Report Meta 0201 Toplu Meta Raporu 0202 Batch Report Metadata 0202 Toplu Metadata Raporu 0203 Batch Set Geotags 0203 Toplu Geotag Ayarla 0204 Batch Upright 0204 Toplu Düzeltme 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 Toplu: kopyala, taşı, dönüştür, RAW dönüştür, metadata ekle/değiştir 0206 Bend and fine-align 0206 Bük ve ince hizala 0207 Bias 0207 Sapma 0208 Black 0208 Siyah 0209 Blank Image 0209 Boş Görüntü 0210 Blend 0210 Karıştır 0211 Blend 0% 0211 Karıştırma %0 0212 Blend Width 0212 Karıştırma Genişliği 0213 Blend area edits/edges using the mouse 0213 Fare ile alan düzenlemelerini/kenarlarını karıştırın 0214 Blend: 0% 0214 Karıştırma: %0 0215 Blue 0215 Mavi 0216 Blue Factors 0216 Mavi Faktörleri 0217 Blur 0217 Bulanıklaştırma 0218 Blur Angle (degrees) 0218 Bulanıklık Açısı (derece) 0219 Blur Background 0219 Arka Planı Bulanıklaştır 0220 Blur Image 0220 Görüntüyü Bulanıklaştır 0221 Blur Mix 0221 Bulanıklık Karışımı 0222 Blur Normal 0222 Normal Bulanıklık 0223 Blur Radius 0223 Bulanıklık Yarıçapı 0224 Blur Span 0224 Bulanıklık Aralığı 0225 Blur Span (pixels) 0225 Bulanıklık Aralığı (piksel) 0226 Blur the image (various methods) 0226 Görüntüyü bulanıklaştır (çeşitli yöntemler) 0227 Bookmarks 0227 Yer İmleri 0228 Both 0228 İkisi de 0229 Bottom 0229 Alt 0230 Bright Limit 0230 Parlaklık Sınırı 0231 Bright Point 0231 Parlaklık Noktası 0232 Brightness 0232 Parlaklık 0233 Brightness Histogram 0233 Parlaklık Histogramı 0234 Brightness Ramp 0234 Parlaklık Geçişi 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 Parlaklık, kenarlara kadar uzanan kademeli \nbir geçiş göstermelidir. 0236 Browse 0236 Göz At 0237 CALIBRATE PRINTER 0237 YAZICI KALİBRE ET 0238 CAPTIONS 0238 BAŞLIKLAR 0239 CARTOON 0239 KARİKATÜR 0240 CHOOSE ALBUM 0240 ALBÜM SEÇ 0241 CLEAR AREA 0241 ALANI TEMİZLE 0242 CLOSE 0242 KAPAT 0243 COLOR MODE 0243 RENK MODU 0244 COMBINE MENU 0244 BİRLEŞTİR MENÜSÜ 0245 COMMAND PARAMETERS 0245 KOMUT PARAMETRELERİ 0246 COMPLETED 0246 TAMAMLANDI 0247 COPY FROM IMAGE 0247 GÖRÜNTÜDEN KOPYALA 0248 COPY IN IMAGE 0248 GÖRÜNTÜ İÇİNDE KOPYALA 0249 COPY META 0249 META KOPYALA 0250 COPY PRIOR EDIT 0250 ÖNCEKİ DÜZENLEMEYİ KOPYALA 0251 COPY TO CLIPBOARD 0251 PANOYA KOPYALA 0252 COPY TO DESKTOP 0252 MASAÜSTÜNE KOPYALA 0253 COPY/MOVE 0253 KOPYALA/TAŞI 0254 COPY/PASTE AREA 0254 ALANI KOPYALA/YAPIŞTIR 0255 CREATE ALBUM 0255 ALBÜM OLUŞTUR 0256 CROP 0256 KIRP 0257 CROSSHATCH 0257 ÇAPRAZ TARAMA 0258 CURRENT ALBUM 0258 GEÇERLİ ALBÜM 0259 CURRENT FILE FOLDER 0259 GEÇERLİ DOSYA KLASÖRÜ 0260 CURVE EDITING 0260 EĞRİ DÜZENLEME 0261 CUSTOM KERNEL 0261 ÖZEL ÇEKİRDEK 0262 CUSTOM MENU 0262 ÖZEL MENÜ 0263 CYCLE 2 FILES 0263 2 DOSYA DÖNGÜSÜ 0264 CYCLE 3 FILES 0264 3 DOSYA DÖNGÜSÜ 0265 Calculate 0265 Hesapla 0266 Calculate Geometry 0266 Geometri Hesapla 0267 Calibrate Printer 0267 Yazıcı Kalibre Et 0268 Cancel 0268 İptal 0269 Cartoon 0269 Karikatür 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 Dikkat: İlgili güncellemelerin yapıldığından emin olmak için, \noradaki mevcut tag'leri değiştirmek üzere Ana Metadata Düzenle \nişlevini kullanın. 0271 Center 0271 Merkez 0272 Center Hole 0272 Merkez Delik 0273 Change 0273 Değiştir 0274 Change Log 0274 Değişiklik Günlüğü 0275 Change file name 0275 Dosya adını değiştir 0276 Change gallery sort order 0276 Galeri sıralama düzenini değiştir 0277 Change image colors using an algorithm 0277 Bir algoritma kullanarak görüntü renklerini değiştir 0278 Change image pixel dimensions 0278 Görüntü piksel boyutlarını değiştir 0279 Chart to adjust monitor color 0279 Monitör rengini ayarlamak için çizelge 0280 Choose 0280 Seç 0281 Choose Album 0281 Albüm Seç 0282 Choose Albums 0282 Albümleri Seç 0283 Choose Captions 0283 Başlıkları Seç 0284 Choose an album and show as gallery of images 0284 Bir albüm seçin ve görüntü galerisi olarak gösterin 0285 Choose metadata shown on image captions 0285 Görüntü başlıklarında gösterilecek metadata'yı seçin 0286 Choose new Fotocx home folder 0286 Yeni Fotocx ana klasörünü seçin 0287 Choose thumbnail folder 0287 Thumbnail klasörünü seçin 0288 Choose top image folders 0288 Üst görüntü klasörlerini seçin 0289 Clear 0289 Temizle 0290 Clear All 0290 Tümünü Temizle 0291 Click dark spot for black level 0291 Siyah seviyesi için koyu bir nokta tıklayın 0292 Click for RGB histogram 0292 RGB histogramı için tıklayın 0293 Click gray spot for white balance 0293 Beyaz dengesi için gri bir nokta tıklayın 0294 Click image to select pixels 0294 Piksel seçmek için görüntüye tıklayın 0295 Click image to select, drag image to move. 0295 Seçmek için görüntüye tıklayın, taşımak için görüntüyü sürükleyin. 0296 Click mouse to change center 0296 Merkezi değiştirmek için fareyle tıklayın 0297 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0297 Alan taslağı üzerindeki herhangi bir konuma yakın tıklayın. \nTaslaktaki olası boşluklar bulunacaktır. \nYardım için F1'e basın 0298 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0298 Bir dörtgen alanın dört köşesine tıklayın. [uygula]'ya basın. \nGörüntü, dörtgeni bir dikdörtgene dönüştürecek şekilde çarpıtılır. 0299 Click thumbnail to select file 0299 Dosya seçmek için thumbnail'e tıklayın 0300 Clip Level 0300 Kırpma Seviyesi 0301 Clip Limit % 0301 Kırpma Sınırı % 0302 Color 0302 Renk 0303 Color Chooser 0303 Renk Seçici 0304 Color Depth: 0304 Renk Derinliği: 0305 Color Fringes 0305 Renk Saçakları 0306 Color Hue 0306 Renk Tonu 0307 Color Map File 0307 Renk Haritası Dosyası 0308 Color Match Images 0308 Görüntüleri Renk Eşleştir 0309 Color Mode 0309 Renk Modu 0310 Color calibration tool for printer and paper type 0310 Yazıcı ve kağıt türü için renk kalibrasyon aracı 0311 Color map file to use 0311 Kullanılacak renk haritası dosyası 0312 Combine 0312 Birleştir 0313 Combine 2-6 images into a wide panorama image 0313 2-6 görüntüyü geniş bir panorama görüntüsünde birleştir 0314 Combine many images into an array of images 0314 Birçok görüntüyü bir görüntü dizisinde birleştir 0315 Combine multiple images in layers, select and expose layers 0315 Birden çok görüntüyü katmanlarda birleştir, katmanları seç ve göster 0316 Combine multiple noisy photos into a low-noise image 0316 Düşük gürültülü bir görüntü oluşturmak için birden çok gürültülü fotoğrafı birleştir 0317 Combine multiple photos to erase passing people, etc. 0317 Geçen kişileri vb. silmek için birden çok fotoğrafı birleştir 0318 Combine within 0318 Şu aralıkta birleştir 0319 Combine: HDR, HDF, stack, panorama, mashup, image array 0319 Birleştir: HDR, HDF, yığın, panorama, mashup, görüntü dizisi 0320 Command Params 0320 Komut Parametreleri 0321 Commit 0321 Onayla 0322 Confirm Exit 0322 Çıkışı Onayla 0323 Contrast 0323 Kontrast 0324 Contrast All 0324 Kontrast Tümü 0325 Contrast Blue 0325 Kontrast Mavi 0326 Contrast Green 0326 Kontrast Yeşil 0327 Contrast Limit 0327 Kontrast Sınırı 0328 Contrast Red 0328 Kontrast Kırmızı 0329 Convert %d image files 0329 %d görüntü dosyasını dönüştür 0330 Convert an image into a Tiny Planet image 0330 Bir görüntüyü Minik Gezegen görüntüsüne dönüştür 0331 Convert image into a cartoon drawing 0331 Görüntüyü bir karikatür çizimine dönüştür 0332 Convert image into a crosshatch sketch 0332 Görüntüyü çapraz tarama eskizine dönüştür 0333 Convert image into a line drawing 0333 Görüntüyü bir çizgi çizimine dönüştür 0334 Convert image into a simulated painting 0334 Görüntüyü simüle edilmiş bir tabloya dönüştür 0335 Convert image into a simulated sketch (1) 0335 Görüntüyü simüle edilmiş bir eskize dönüştür (1) 0336 Convert image into a simulated sketch (2) 0336 Görüntüyü simüle edilmiş bir eskize dönüştür (2) 0337 Convert image into black/white lines 0337 Görüntüyü siyah/beyaz çizgilere dönüştür 0338 Convert image into dithered dots 0338 Görüntüyü noktalı (dither) görünüme dönüştür 0339 Convert image into square tiles with 3D effect 0339 Görüntüyü 3D efektli kare karolara dönüştür 0340 Convert image into tiles matching feature contours 0340 Görüntüyü öznitelik konturlarına uyan karolara dönüştür 0341 Copy 0341 Kopyala 0342 Copy %d image files 0342 %d görüntü dosyasını kopyala 0343 Copy From Image 0343 Görüntüden Kopyala 0344 Copy Meta 0344 Meta Kopyala 0345 Copy Metadata 0345 Metadata Kopyala 0346 Copy Prior Edit 0346 Önceki Düzenlemeyi Kopyala 0347 Copy Within Image 0347 Görüntü İçinde Kopyala 0348 Copy area for later pasting into image 0348 Daha sonra görüntüye yapıştırmak için alanı kopyala 0349 Copy areas from another image using the mouse 0349 Fareyi kullanarak başka bir görüntüden alanları kopyala 0350 Copy areas from prior edits using the mouse 0350 Fareyi kullanarak önceki düzenlemelerden alanları kopyala 0351 Copy areas within an image using the mouse 0351 Fareyi kullanarak bir görüntü içindeki alanları kopyala 0352 Copy image file to the clipboard 0352 Görüntü dosyasını panoya kopyala 0353 Copy image file to the desktop 0353 Görüntü dosyasını masaüstüne kopyala 0354 Copy in Image 0354 Görüntü İçinde Kopyala 0355 Copy metadata from one image to another 0355 Metadata'yı bir görüntüden diğerine kopyala 0356 Copy or Move Image File 0356 Görüntü Dosyasını Kopyala veya Taşı 0357 Copy or Move image file to new location 0357 Görüntü dosyasını yeni bir konuma kopyala veya taşı 0358 Copy to Clipboard 0358 Panoya Kopyala 0359 Copy to Desktop 0359 Masaüstüne Kopyala 0360 Copy without unsaved changes? 0360 Kaydedilmemiş değişiklikler olmadan kopyalansın mı? 0361 Copy/Move 0361 Kopyala/Taşı 0362 Copy/move selected image files to a new folder 0362 Seçili görüntü dosyalarını yeni bir klasöre kopyala/taşı 0363 Copyright 0363 Telif Hakkı 0364 Create 0364 Oluştur 0365 Create Album 0365 Albüm Oluştur 0366 Create Blank Image 0366 Boş Görüntü Oluştur 0367 Create Mosaic 0367 Mozaik Oluştur 0368 Create a blank image 0368 Boş bir görüntü oluştur 0369 Create a mosaic with tiles made from all images 0369 Tüm görüntülerden yapılan karolarla bir mozaik oluştur 0370 Create a new album (ordered set of image files) 0370 Yeni bir albüm oluştur (sıralı görüntü dosyaları kümesi) 0371 Create an embossed or 3D appearance 0371 Kabartma veya 3D görünüm oluştur 0372 Create or replace an album 0372 Bir albüm oluştur veya değiştir 0373 Crop 0373 Kırp 0374 Crop (trim) image margins 0374 Görüntü kenar boşluklarını kırp (kes) 0375 Crop Buttons 0375 Kırpma Düğmeleri 0376 Crop Image 0376 Görüntüyü Kırp 0377 Crosshatch 0377 Çapraz Tarama 0378 Crosshatch Sketch 0378 Çapraz Tarama Eskizi 0379 Current Album 0379 Geçerli Albüm 0380 Current File Folder 0380 Geçerli Dosya Klasörü 0381 Current gallery 0381 Geçerli galeri 0382 Current image: 0382 Geçerli görüntü: 0383 Curve Node 0383 Eğri Düğümü 0384 Curve lines need at least 4 points 0384 Eğri çizgileri en az 4 nokta gerektirir 0385 Custom 0385 Özel 0386 Custom Kernel 0386 Özel Çekirdek 0387 Custom Shortcuts \n 0387 Özel Kısayollar \n 0388 Custom menu: favorite/frequent functions, scripts, plugins 0388 Özel menü: favori/sık kullanılan işlevler, betikler, eklentiler 0389 Customize 0389 Özelleştir 0390 Customize: 0390 Özelleştir: 0391 Cut Bottom 0391 Alttan Kes 0392 Cut Top 0392 Üstten Kes 0393 Cycle 2 Files 0393 2 Dosya Arasında Geçiş 0394 Cycle 2 Prior Files 0394 2 Önceki Dosya Arasında Geçiş 0395 Cycle 3 Files 0395 3 Dosya Arasında Geçiş 0396 Cycle 3 Prior Files 0396 3 Önceki Dosya Arasında Geçiş 0397 Cycle through images: 0397 Görüntüler arasında geçiş yap: 0398 DARK/BRIGHT PIXELS 0398 KOYU/PARLAK PİKSELLER 0399 DEFOG 0399 SİS GİDER 0400 DELETE ALBUM 0400 ALBÜMÜ SİL 0401 DELETE META 0401 METAYI SİL 0402 DELETE/TRASH 0402 SİL/ÇÖPE AT 0403 DENOISE 0403 GÜRÜLTÜ GİDER 0404 DIALOG BUTTONS 0404 İLETİŞİM KUTUSU DÜĞMELERİ 0405 DITHER 0405 DITHER 0406 DRAG AND DROP 0406 SÜRÜKLE VE BIRAK 0407 Dark Areas 0407 Koyu Alanlar 0408 Dark Limit 0408 Koyu Sınır 0409 Dark Point 0409 Koyu Nokta 0410 Dark/Bright Pixels 0410 Koyu/Parlak Pikseller 0411 Data file 0411 Veri dosyası 0412 Define keywords used for searching images 0412 Görüntü aramak için kullanılan keyword'leri tanımla 0413 Defined Keywords: 0413 Tanımlı Keyword'ler: 0414 Defog 0414 Sis Gider 0415 Delete 0415 Sil 0416 Delete Album 0416 Albümü Sil 0417 Delete Meta 0417 Metayı Sil 0418 Delete Metadata 0418 Metadata'yı Sil 0419 Delete Originals 0419 Orijinalleri Sil 0420 Delete an album 0420 Bir albümü sil 0421 Delete or Trash selected image files 0421 Seçili görüntü dosyalarını sil veya çöpe at 0422 Delete or trash an image file 0422 Bir görüntü dosyasını sil veya çöpe at 0423 Delete read-only file? 0423 Salt okunur dosya silinsin mi? 0424 Delete/Trash 0424 Sil/Çöpe At 0425 Denoise 0425 Gürültü Gider 0426 Depth 0426 Derinlik 0427 Desc. 0427 Açıkl. 0428 Description: %s\n 0428 Açıklama: %s\n 0429 Desktop 0429 Masaüstü 0430 Dialog Font 0430 İletişim Kutusu Yazı Tipi 0431 Diffs 0431 Farklar 0432 Directed Blur 0432 Yönlü Bulanıklaştırma 0433 Directed Blur - blur locally in direction of mouse drag 0433 Yönlü Bulanıklaştırma - fare sürüklemesi yönünde yerel bulanıklaştırma 0434 Disable 0434 Devre Dışı Bırak 0435 Disable areas for editing 0435 Düzenleme için alanları devre dışı bırak 0436 Discard unsaved changes? 0436 Kaydedilmemiş değişiklikler atılsın mı? 0437 Discard unsaved edits? 0437 Kaydedilmemiş düzenlemeler atılsın mı? 0438 Distort image areas using the mouse 0438 Fareyi kullanarak görüntü alanlarını çarpıt 0439 Dither 0439 Dither 0440 Dither Image 0440 Görüntüyü Dither'la 0441 Dither0 0441 Dither0 0442 Dither1 0442 Dither1 0443 Dither2 0443 Dither2 0444 Dither3 0444 Dither3 0445 Dither4 0445 Dither4 0446 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0446 Görüntüleri kabaca hizalamak için sürükleyin.\nDöndürmek için alt kenardan sürükleyin. 0447 Drag margin box middle or edges 0447 Kenar boşluğu kutusunun ortasını veya kenarlarını sürükleyin 0448 Drag mouse on image. \nLeft click to cancel. 0448 Fareyi görüntü üzerinde sürükleyin. \nİptal etmek için sol tıklayın. 0449 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0449 Seçmek için fareyi sürükleyin. Silin. Tekrarlayın. \nTıklama: seçimi fareye kadar genişletir. 0450 Drag mouse to set center 0450 Merkezi ayarlamak için fareyi sürükleyin 0451 Drag near an image corner using the mouse 0451 Fareyi kullanarak bir görüntü köşesine yakın sürükleyin 0452 Drag on image to level image.\nClick on image for level lines. 0452 Görüntüyü düzeltmek için görüntü üzerinde sürükleyin.\nDüzey çizgileri için görüntüye tıklayın. 0453 Drag within image using the mouse 0453 Fareyi kullanarak görüntü içinde sürükleyin 0454 Draw a line across the image in \ndirection of brightness change. 0454 Parlaklık değişimi yönünde \ngörüntü boyunca bir çizgi çizin. 0455 Draw box on image 0455 Görüntü üzerine kutu çiz 0456 Draw line or arrow on image 0456 Görüntü üzerine çizgi veya ok çiz 0457 Draw on image: text, line/arrow, box, circle, ellipse 0457 Görüntü üzerine çiz: metin, çizgi/ok, kutu, daire, elips 0458 Draw oval on image 0458 Görüntü üzerine oval çiz 0459 Draw text on image 0459 Görüntü üzerine metin yaz 0460 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0460 Yinelenen veya iç içe klasörler: \n %s \n %s \nLütfen kaldırın. 0461 Duplicates: 0461 Yinelenenler: 0462 EDIT ALBUM 0462 ALBÜMÜ DÜZENLE 0463 EDIT ANY META 0463 HERHANGİ BİR METAYI DÜZENLE 0464 EDIT BOOKMARKS 0464 YER İMLERİNİ DÜZENLE 0465 EDIT MAIN META 0465 ANA METAYI DÜZENLE 0466 EDIT MENU 0466 DÜZENLE MENÜSÜ 0467 EDIT PROCEDURES 0467 PROSEDÜRLERİ DÜZENLE 0468 EDIT SCRIPT 0468 BETİĞİ DÜZENLE 0469 EDIT WORKFLOW 0469 İŞ AKIŞINI DÜZENLE 0470 EFFECTS MENU 0470 EFEKTLER MENÜSÜ 0471 EMBOSS 0471 KABARTMA 0472 ENABLE/DISABLE AREA 0472 ALANI ETKİNLEŞTİR/DEVRE DIŞI BIRAK 0473 ENGRAVE 0473 OYMA 0474 ESCHER SPIRAL 0474 ESCHER SARMALI 0475 EXPORT FILES 0475 DOSYALARI DIŞA AKTAR 0476 Edge 0476 Kenar 0477 Edit 0477 Düzenle 0478 Edit Any Meta 0478 Herhangi Bir Metayı Düzenle 0479 Edit Any Metadata 0479 Herhangi Bir Metadata'yı Düzenle 0480 Edit Bookmarks 0480 Yer İmlerini Düzenle 0481 Edit Images 0481 Görüntüleri Düzenle 0482 Edit Keyboard Shortcuts 0482 Klavye Kısayollarını Düzenle 0483 Edit Line 0483 Çizgiyi Düzenle 0484 Edit Line/Arrow 0484 Çizgi/Ok Düzenle 0485 Edit Main Meta 0485 Ana Metayı Düzenle 0486 Edit Main Metadata 0486 Ana Metadata'yı Düzenle 0487 Edit Menu 0487 Menüyü Düzenle 0488 Edit Metadata 0488 Metadata'yı Düzenle 0489 Edit Plugins 0489 Eklentileri Düzenle 0490 Edit Text 0490 Metni Düzenle 0491 Edit any metadata tag 0491 Herhangi bir metadata tag'ini düzenle 0492 Edit function can not use Paint Edits 0492 Düzenle işlevi Boyalı Düzenlemeleri kullanamaz 0493 Edit function must be active 0493 Düzenle işlevi etkin olmalı 0494 Edit key metadata: keywords/geotags/description/rating ... 0494 Temel metadata'yı düzenle: keyword/geotag/açıklama/derecelendirme ... 0495 Edit plugins menu 0495 Eklentiler menüsünü düzenle 0496 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0496 Düzenle: kırp, döndür, rötuşla, yeniden ölçekle, işaretle, boyalı düzenlemeler, alan kopyala 0497 Effects 0497 Efektler 0498 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0498 Efektler: karikatür, eskiz, boyama, kabartma, dither, doku, renkler, özel evrişim 0499 Emboss 0499 Kabartma 0500 Enable 0500 Etkinleştir 0501 Enable areas for editing 0501 Düzenleme için alanları etkinleştir 0502 End of gallery 0502 Galeri sonu 0503 Engrave 0503 Oyma 0504 Enter Keyword 0504 Keyword Girin 0505 Enter New Keyword 0505 Yeni Keyword Girin 0506 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0506 İletişim kutusunda çizgi veya ok özelliklerini girin, \ngörüntü üzerinde tıklayın/sürükleyin, kaldırmak için sağ tıklayın 0507 Enter text, [Add] to layout, edit properties. 0507 Metin girin, düzene [Ekle], özellikleri düzenleyin. 0508 Enter text, click/drag on image, right click to remove 0508 Metin girin, görüntü üzerinde tıklayın/sürükleyin, kaldırmak için sağ tıklayın 0509 Erase 0509 Sil 0510 Erase existing areas 0510 Mevcut alanları sil 0511 Escher Spiral 0511 Escher Sarmalı 0512 Exceed 50 anchor points 0512 50 çapa noktasını aşıyor 0513 Export Files 0513 Dosyaları Dışa Aktar 0514 Export selected image files to another folder 0514 Seçili görüntü dosyalarını başka bir klasöre dışa aktar 0515 FILE MENU 0515 DOSYA MENÜSÜ 0516 FILE SAVE 0516 DOSYA KAYDET 0517 FILE VIEW 0517 DOSYA GÖRÜNÜMÜ 0518 FIND AREA GAP 0518 ALAN BOŞLUĞU BUL 0519 FIND BAD FILES 0519 HATALI DOSYALARI BUL 0520 FIND DUPLICATES 0520 YİNELENENLERİ BUL 0521 FIRST INDEX 0521 İLK DİZİNLEME 0522 FIRST STARTUP 0522 İLK BAŞLATMA 0523 FIX META 0523 METAYI ONAR 0524 FLATTEN HISTOGRAM 0524 HİSTOGRAMI DÜZLEŞTİR 0525 FLATTEN PHOTO 0525 FOTOĞRAFI DÜZLEŞTİR 0526 FOLDER TREE 0526 KLASÖR AĞACI 0527 FOTOCX FOR WINDOWS 11 0527 WINDOWS 11 İÇİN FOTOCX 0528 FOTOCX LIMITATIONS 0528 FOTOCX SINIRLAMALARI 0529 FOTOCX USAGE 0529 FOTOCX KULLANIMI 0530 FRINGES 0530 SAÇAKLAR 0531 FUSION 0531 FÜZYON 0532 Fetch 0532 Getir 0533 File 0533 Dosya 0534 File Mod Date/Time 0534 Dosya Değişiklik Tarihi/Saati 0535 File Name 0535 Dosya Adı 0536 File Name/Number 0536 Dosya Adı/Numarası 0537 File Name: %s \n 0537 Dosya Adı: %s \n 0538 File Size (bytes) 0538 Dosya Boyutu (bayt) 0539 File View 0539 Dosya Görünümü 0540 File count: 0540 Dosya sayısı: 0541 File type cannot be edited 0541 Dosya türü düzenlenemez 0542 File1 0542 Dosya1 0543 File2 0543 Dosya2 0544 File: 0544 Dosya: 0545 File: new session, open, rename, copy/move, delete, print 0545 Dosya: yeni oturum, aç, yeniden adlandır, kopyala/taşı, sil, yazdır 0546 Fill selected areas or transparent areas with a color 0546 Seçili alanları veya saydam alanları bir renkle doldur 0547 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0547 Görsel doğrulama için seçili alanları renkle doldur. \nYöntem 1: henüz doldurulmamış her seçili alana sol tıklayın. \nYöntem 2: tüm seçili alanların DIŞINA sağ tıklayın. \nAçıklama için [yardım] düğmesine basın 0548 Find 0548 Bul 0549 Find Bad Files 0549 Hatalı Dosyaları Bul 0550 Find Duplicate Images 0550 Yinelenen Görüntüleri Bul 0551 Find Duplicates 0551 Yinelenenleri Bul 0552 Find Gap 0552 Boşluk Bul 0553 Find a gap in an area outline 0553 Bir alan taslağındaki boşluğu bul 0554 Find all images for a location [date range] 0554 Bir konum için tüm görüntüleri bul [tarih aralığı] 0555 Find all images for a selected tag name and value 0555 Seçili bir tag adı ve değeri için tüm görüntüleri bul 0556 Find images meeting multiple search criteria 0556 Birden çok arama kriterini karşılayan görüntüleri bul 0557 Find optimum factors: 0557 Optimum faktörleri bul: 0558 Finish 0558 Bitir 0559 Finish Area 0559 Alanı Bitir 0560 Fix Bad File 0560 Hatalı Dosyayı Onar 0561 Fix Broken Metadata 0561 Bozuk Metadata'yı Onar 0562 Fix Meta 0562 Metayı Onar 0563 Fix Motion Blur 0563 Hareket Bulanıklığını Düzelt 0564 Fix Perspective 0564 Perspektifi Düzelt 0565 Fix color fringes (chromatic aberration) 0565 Renk saçaklarını düzelt (kromatik sapma) 0566 Fix perspective for object photographed from an angle 0566 Açılı çekilen nesnenin perspektifini düzelt 0567 Fix red-eyes from flash photo 0567 Flaşlı fotoğraftaki kırmızı gözleri düzelt 0568 Flatten 0568 Düzleştir 0569 Flatten Histogram 0569 Histogramı Düzleştir 0570 Flatten Pano 0570 Panoyu Düzleştir 0571 Flatten Photo 0571 Fotoğrafı Düzleştir 0572 Flatten brightness histogram to enhance details 0572 Ayrıntıları vurgulamak için parlaklık histogramını düzleştir 0573 Flatten curved surface. 0573 Eğri yüzeyi düzleştir. 0574 Flatten photo of a curved image (e.g. poster on round column 0574 Eğri bir görüntünün fotoğrafını düzleştir (ör. yuvarlak sütun üzerindeki poster) 0575 Flip 0575 Çevir 0576 Folder Tree 0576 Klasör Ağacı 0577 Folders 0577 Klasörler 0578 Folders for image files (subfolders included automatically) 0578 Görüntü dosyaları için klasörler (alt klasörler otomatik olarak dahil edilir) 0579 Font 0579 Yazı Tipi 0580 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0580 Rastgele görüntü sırası için bu değer, \ngörüntüyü gösterme göreli sıklığıdır. \nTaban değer 10'dur. 20 --> 2 kat daha sık göster. 0581 Foreground 0581 Ön Plan 0582 Fotocx copyright notice 0582 Fotocx telif hakkı bildirimi 0583 Fotocx home 0583 Fotocx ana sayfası 0584 Fotocx privacy policy 0584 Fotocx gizlilik politikası 0585 Fotocx video tutorial on YouTube 0585 YouTube'da Fotocx video eğitimi 0586 Fotocx web site (information and downloads) 0586 Fotocx web sitesi (bilgi ve indirmeler) 0587 FreeSans 0587 FreeSans 0588 Full List 0588 Tam Liste 0589 Full Screen 0589 Tam Ekran 0590 Fusion 0590 Füzyon 0591 GALLERY END 0591 GALERİ SONU 0592 GALLERY FILTER 0592 GALERİ FİLTRESİ 0593 GALLERY HOME 0593 GALERİ ANA SAYFASI 0594 GALLERY MENU 0594 GALERİ MENÜSÜ 0595 GALLERY OVERVIEW 0595 GALERİ GENEL GÖRÜNÜMÜ 0596 GALLERY SORT 0596 GALERİ SIRALAMA 0597 GALLERY TO ALBUM 0597 GALERİYİ ALBÜME DÖNÜŞTÜR 0598 GALLERY VIEW 0598 GALERİ GÖRÜNÜMÜ 0599 GDK pixbuf: cannot save file 0599 GDK pixbuf: dosya kaydedilemiyor 0600 GLOBAL RETINEX 0600 GENEL RETİNEKS 0601 GRID SETTINGS 0601 IZGARA AYARLARI 0602 Gallery 0602 Galeri 0603 Gallery End 0603 Galeri Sonu 0604 Gallery Filter 0604 Galeri Filtresi 0605 Gallery Home 0605 Galeri Ana Sayfası 0606 Gallery Sort 0606 Galeri Sıralama 0607 Gallery View 0607 Galeri Görünümü 0608 Gallery of newest image files 0608 En yeni görüntü dosyalarının galerisi 0609 Gallery of recently viewed image files 0609 Son görüntülenen görüntü dosyalarının galerisi 0610 Gallery to Album 0610 Galeriyi Albüme Dönüştür 0611 Gallery view with thumbnails and basic metadata 0611 Thumbnail ve temel metadata içeren galeri görünümü 0612 Gallery view with thumbnails and file data 0612 Thumbnail ve dosya bilgisi içeren galeri görünümü 0613 Gallery: thumbnails, new/recent, sort, select, bookmarks 0613 Galeri: thumbnail, yeni/son, sırala, seç, yer imleri 0614 Generate an inward spiraling repeating image 0614 İçe doğru sarmalanan tekrarlayan bir görüntü oluştur 0615 Global Retinex 0615 Genel Retineks 0616 Gradual 0616 Kademeli 0617 Graduated Blur 0617 Kademeli Bulanıklaştırma 0618 Graduated Blur - blur relative to pixel contrast 0618 Kademeli Bulanıklaştırma - piksel kontrastına göre bulanıklık 0619 Grayscale 0619 Gri Tonlama 0620 Green 0620 Yeşil 0621 Grid Settings 0621 Izgara Ayarları 0622 Group by country 0622 Ülkeye göre grupla 0623 Group by country/date 0623 Ülke/tarihe göre grupla 0624 Group by country/location 0624 Ülke/konuma göre grupla 0625 Group by country/location/date 0625 Ülke/konum/tarihe göre grupla 0626 Group by date/country 0626 Tarih/ülkeye göre grupla 0627 Group by date/country/location 0627 Tarih/ülke/konuma göre grupla 0628 HDF 0628 HDF 0629 HDR 0629 HDR 0630 HELP MENU 0630 YARDIM MENÜSÜ 0631 Hard 0631 Sert 0632 Height 0632 Yükseklik 0633 Height: 0633 Yükseklik: 0634 Help 0634 Yardım 0635 Help: user guide, tutorial, change log, licenses, privacy, about 0635 Yardım: kullanıcı kılavuzu, öğretici, değişiklik günlüğü, lisanslar, gizlilik, hakkında 0636 Hide 0636 Gizle 0637 Hide selected areas 0637 Seçili alanları gizle 0638 High 0638 Yüksek 0639 High Depth of Field - combine near/far focus images for deeper focus 0639 Yüksek Alan Derinliği - daha derin odak için yakın/uzak odaklı görüntüleri birleştir 0640 High Dynamic Range - combine bright/dark images for better detail 0640 Yüksek Dinamik Aralık - daha iyi ayrıntı için parlak/koyu görüntüleri birleştir 0641 Highlight darkest and brightest pixels 0641 En koyu ve en parlak pikselleri vurgula 0642 Home Folder 0642 Ana Klasör 0643 Home Page 0643 Ana Sayfa 0644 Horz 0644 Yatay 0645 How to remove Fotocx application and user files 0645 Fotocx uygulamasını ve kullanıcı dosyalarını kaldırma yöntemi 0646 Hue 0646 Ton 0647 IMAGE ARRAY 0647 GÖRÜNTÜ DİZİSİ 0648 INDEX FILES 0648 DOSYALARI DİZİNLE 0649 INSIDE-OUT 0649 İÇTEN DIŞA 0650 INVERT AREA 0650 ALANI TERSİNE ÇEVİR 0651 Icon size 0651 Simge boyutu 0652 Icons 0652 Simgeler 0653 Image 0653 Görüntü 0654 Image Array 0654 Görüntü Dizisi 0655 Image Columns 0655 Görüntü Sütunları 0656 Image Differences 0656 Görüntü Farkları 0657 Image File 0657 Görüntü Dosyası 0658 Image File: 0658 Görüntü Dosyası: 0659 Image Keywords 0659 Görüntü Keyword'leri 0660 Image Locations 0660 Görüntü Konumları 0661 Image Markup 0661 Görüntü İşaretleme 0662 Image Position 0662 Görüntü Konumu 0663 Image Preferences 0663 Görüntü Tercihleri 0664 Image Ratios 0664 Görüntü Oranları 0665 Image Size (pixels) 0665 Görüntü Boyutu (piksel) 0666 Image Time 0666 Görüntü Saati 0667 Image Timeline 0667 Görüntü Zaman Çizelgesi 0668 Image colors are converted for printing. 0668 Görüntü renkleri baskı için dönüştürülür. 0669 Image dimensions have changed \nCopy Prior Edit cannot be used 0669 Görüntü boyutları değişti \nÖnceki Düzenlemeyi Kopyala kullanılamaz 0670 Image dimensions have changed, \nArea Blend cannot be used 0670 Görüntü boyutları değişti, \nAlan Karıştırma kullanılamaz 0671 Image dimensions have changed, \nthis prior image cannot be used 0671 Görüntü boyutları değişti, \nbu önceki görüntü kullanılamaz 0672 Image is fixed, unmovable 0672 Görüntü sabit, hareket ettirilemez 0673 Images sizes are not compatible 0673 Görüntü boyutları uyumlu değil 0674 Include: 0674 Dahil et: 0675 Index Files 0675 Dosyaları Dizinle 0676 Index Level 0676 Dizin Seviyesi 0677 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0677 Dizinleme işlevi sonlandırıldı. \nDizinleme, arama ve harita işlevleri için \nve thumbnail galeri sayfalarının hızlı görüntülenmesi için gereklidir. 0678 Index new image files and make thumbnails 0678 Yeni görüntü dosyalarını dizinle ve thumbnail oluştur 0679 Input color to match and adjust: 0679 Eşleştirilecek ve ayarlanacak girdi rengi: 0680 Inside-out 0680 İçten Dışa 0681 Install following programs using your package manager: \n 0681 Paket yöneticinizi kullanarak şu programları kurun: \n 0682 Intensity 0682 Yoğunluk 0683 Invert 0683 Tersine Çevir 0684 Invert selected areas (selected ↔ not selected) 0684 Seçili alanları tersine çevir (seçili ↔ seçili değil) 0685 Irregular Tiles 0685 Düzensiz Karolar 0686 Iterations 0686 Yinelemeler 0687 JPEG ARTIFACTS 0687 JPEG BOZULMALARI 0688 JPEG Artifacts 0688 JPEG Bozulmaları 0689 JPEG files 0689 JPEG dosyaları 0690 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0690 Oca Şub Mar Nis May Haz Tem Ağu Eyl Eki Kas Ara 0691 Jump to gallery beginning [home] 0691 Galeri başına atla [home] 0692 Jump to gallery end [end] 0692 Galeri sonuna atla [end] 0693 KEYBOARD ESCAPE KEY 0693 KLAVYE ESCAPE TUŞU 0694 KEYBOARD SHORTCUTS 0694 KLAVYE KISAYOLLARI 0695 KEYWORDS OVERVIEW 0695 KEYWORD'LERE GENEL BAKIŞ 0696 Keep 0696 Koru 0697 Kernel size 0697 Çekirdek boyutu 0698 Keyboard Shortcuts 0698 Klavye Kısayolları 0699 Keywords Category 0699 Keyword Kategorisi 0700 Kill active dialog? 0700 Etkin iletişim kutusu kapatılsın mı? 0701 Kill busy function? 0701 Meşgul işlev sonlandırılsın mı? 0702 Kuwahara 0702 Kuwahara 0703 Kuwahara Depth 0703 Kuwahara Derinliği 0704 LINE COLOR 0704 ÇİZGİ RENGİ 0705 LOAD/SAVE AREA 0705 ALANI YÜKLE/KAYDET 0706 LOCAL CONTRAST 0706 YEREL KONTRAST 0707 LOCAL RETINEX 0707 YEREL RETİNEKS 0708 Language 0708 Dil 0709 Layout and background image 0709 Düzen ve arka plan görüntüsü 0710 Left 0710 Sol 0711 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0711 Alan düzenlemelerini kademeli olarak geri almak için \nalan içinde fareyi sol sürükleyin. \nDüzenlemeleri geri yüklemek için sağ sürükleyin. \nKenarı karıştırmak için alan kenarı boyunca sürükleyin. 0712 Left/right click: previous/next image (also arrow keys) 0712 Sol/sağ tık: önceki/sonraki görüntü (ok tuşları da kullanılabilir) 0713 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0713 Sol/sağ tık: bir düzenleme adımını geri al/yinele \nOrta tık: seçili düzenleme adımına geri dön 0714 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0714 Sol/sağ tık: görüntüyü/thumbnail'i yakınlaştır/uzaklaştır (+/- tuşları da kullanılabilir) 0715 Length 0715 Uzunluk 0716 Level 0716 Seviye 0717 Licenses 0717 Lisanslar 0718 Light Source 0718 Işık Kaynağı 0719 Lightness 0719 Açıklık 0720 Limit 0720 Sınır 0721 Line Color 0721 Çizgi Rengi 0722 Line Threshold 0722 Çizgi Eşiği 0723 Line Width 0723 Çizgi Genişliği 0724 Line length 0724 Çizgi uzunluğu 0725 List Fotocx command line parameters 0725 Fotocx komut satırı parametrelerini listele 0726 List all metadata for current image or clicked thumbnail 0726 Geçerli görüntü veya tıklanan thumbnail için tüm metadata'yı listele 0727 List outboard programs and functions 0727 Harici programları ve işlevleri listele 0728 Load 0728 Yükle 0729 Load settings from file 0729 Ayarları dosyadan yükle 0730 Local Contrast 0730 Yerel Kontrast 0731 Local Retinex 0731 Yerel Retineks 0732 Location 0732 Konum 0733 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0733 Konum ve ülke geçerli değerlerin yerini alacak.\nGPS verisi yalnızca yeni değer mevcutsa değiştirilir. 0734 Lock 0734 Kilitle 0735 Low Amplify 0735 Düşük Artırma 0736 MAGNIFY IMAGE 0736 GÖRÜNTÜYÜ BÜYÜT 0737 MAKE WAVES 0737 DALGA OLUŞTUR 0738 MANAGE KEYWORDS 0738 KEYWORD'LERİ YÖNET 0739 MAP MENU 0739 HARİTA MENÜSÜ 0740 MAP VIEW 0740 HARİTA GÖRÜNÜMÜ 0741 MARGINS 0741 KENAR BOŞLUKLARI 0742 MARKUP 0742 İŞARETLEME 0743 MASHUP 0743 MASHUP 0744 MATCH COLORS 0744 RENKLERİ EŞLEŞTİR 0745 MEASURE IMAGE 0745 GÖRÜNTÜYÜ ÖLÇ 0746 MENU SHORTCUTS 0746 MENÜ KISAYOLLARI 0747 METADATA MENU 0747 METADATA MENÜSÜ 0748 METADATA TAGS 0748 METADATA TAG'LERİ 0749 METADATA VIEW 0749 METADATA GÖRÜNÜMÜ 0750 MONITOR COLOR 0750 MONİTÖR RENGİ 0751 MOSAIC 0751 MOZAİK 0752 MOUSE ALT-RIGHT-BUTTON 0752 FARE ALT-SAĞ-DÜĞME 0753 MOUSE FUNCTIONS 0753 FARE İŞLEVLERİ 0754 MOUSE OWNERSHIP 0754 FARE SAHİPLİĞİ 0755 MOVE FOTOCX HOME 0755 FOTOCX ANA KLASÖRÜNÜ TAŞI 0756 Magnify 0756 Büyüt 0757 Magnify Image 0757 Görüntüyü Büyüt 0758 Magnify image around the mouse position 0758 Fare konumu etrafındaki görüntüyü büyüt 0759 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0759 Ana bellek Fotocx'i çalıştırmak için çok küçük. \nDilerseniz yine de deneyebilirsiniz. \n Devam edilsin mi? 0760 Make Layout Image 0760 Düzen Görüntüsü Oluştur 0761 Make Square Tiles 0761 Kare Karolar Oluştur 0762 Make Waves 0762 Dalga Oluştur 0763 Make a spherical projection of an image 0763 Bir görüntünün küresel izdüşümünü oluştur 0764 Make black margins transparent 0764 Siyah kenar boşluklarını saydam yap 0765 Make new versions 0765 Yeni sürümler oluştur 0766 Make width constant for window size 0766 Genişliği pencere boyutu için sabit yap 0767 Manage Keywords 0767 Keyword'leri Yönet 0768 Map 0768 Harita 0769 Map View 0769 Harita Görünümü 0770 Maps 0770 Haritalar 0771 Maps: view images by map location 0771 Haritalar: görüntüleri harita konumuna göre görüntüle 0772 Margin 0772 Kenar Boşluğu 0773 Margins 0773 Kenar Boşlukları 0774 Markup 0774 İşaretleme 0775 Mashup 0775 Mashup 0776 Mass update album files 0776 Albüm dosyalarını toplu güncelle 0777 Match Brightness 0777 Parlaklığı Eşleştir 0778 Match Colors 0778 Renkleri Eşleştir 0779 Match Level 0779 Seviyeyi Eşleştir 0780 Match Limit 0780 Eşleştirme Sınırı 0781 Match image colors to colors of another image 0781 Görüntü renklerini başka bir görüntünün renkleriyle eşleştir 0782 Match using: 0782 Şunu kullanarak eşleştir: 0783 Matching Keywords 0783 Eşleşen Keyword'ler 0784 Max 0784 Maks 0785 Max. Width 0785 Maks. Genişlik 0786 Measure Image 0786 Görüntüyü Ölç 0787 Measure Noise 0787 Gürültüyü Ölç 0788 Measure pixel distances within an image 0788 Bir görüntü içindeki piksel mesafelerini ölç 0789 Menu Colors 0789 Menü Renkleri 0790 Menu Style 0790 Menü Stili 0791 Metadata 0791 Metadata 0792 Metadata Tags 0792 Metadata Tag'leri 0793 Metadata View 0793 Metadata Görünümü 0794 Metadata from Search Function 0794 Arama İşlevinden Metadata 0795 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0795 Yöntem 1:\nKoyulaştırmak için kırmızı gözün üzerine sol tıklayın.\nYöntem 2:\nKırmızı gözü çevrelemek için aşağı ve sağa sürükleyin.\nKoyulaştırmak için kırmızı gözün üzerine sol tıklayın.\nKırmızı gözü geri al:\nKırmızı gözün üzerine sağ tıklayın. 0796 Mirror: 0796 Ayna: 0797 Mode: 0797 Mod: 0798 Monitor Color 0798 Monitör Rengi 0799 Mosaic 0799 Mozaik 0800 Mouse Radius 0800 Fare Yarıçapı 0801 Mouse Warp (drag image) 0801 Fare Çarpıtması (görüntüyü sürükle) 0802 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0802 Fare sürükleme: görüntüyü 360° kaydır \nSol/Sağ fare tıklaması: yakınlaştır/uzaklaştır \nEscape: panorama görünümünden çık 0803 Move %d image files 0803 %d görüntü dosyasını taşı 0804 Move Fotocx Home 0804 Fotocx Ana Klasörünü Taşı 0805 Move Fotocx Home Folder 0805 Fotocx Ana Klasörünü Taşı 0806 Move Fotocx home folder to chosen folder 0806 Fotocx ana klasörünü seçilen klasöre taşı 0807 Move mouse in a monotone image area. 0807 Fareyi tek renkli bir görüntü alanında hareket ettirin. 0808 Multiplier 0808 Çarpan 0809 NEW SESSION 0809 YENİ OTURUM 0810 NEWEST FILES 0810 EN YENİ DOSYALAR 0811 NEWLINE CHARACTERS IN METADATA 0811 METADATA'DAKİ SATIR SONU KARAKTERLERİ 0812 NON-STANDARD DIALOG WIDGETS 0812 STANDART DIŞI İLETİŞİM KUTUSU BİLEŞENLERİ 0813 New Area 0813 Yeni Alan 0814 New File Name: 0814 Yeni Dosya Adı: 0815 New Location 0815 Yeni Konum 0816 New Location: 0816 Yeni Konum: 0817 New Name 0817 Yeni Ad 0818 New Session 0818 Yeni Oturum 0819 New Type: 0819 Yeni Tür: 0820 New Version 0820 Yeni Sürüm 0821 Newest 0821 En Yeni 0822 Newest Files 0822 En Yeni Dosyalar 0823 Next 0823 Sonraki 0824 Next gallery 0824 Sonraki galeri 0825 No 0825 Hayır 0826 No curve lines found 0826 Eğri çizgisi bulunamadı 0827 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0827 Görüntü dosyası dizini bulunamadı.\nBir görüntü dosyası dizini oluşturulacak.\nGörüntü dosyalarınız değiştirilmeyecek.\nBinlerce görüntü dosyanız varsa \nbu işlem oldukça uzun sürebilir. 0828 No images found 0828 Görüntü bulunamadı 0829 Noise Reduction 0829 Gürültü Azaltma 0830 Noise Size 0830 Gürültü Boyutu 0831 None 0831 Yok 0832 Normal Blur 0832 Normal Bulanıklaştırma 0833 Normal Blur - mix pixels with all neighbor pixels 0833 Normal Bulanıklaştırma - pikselleri tüm komşu piksellerle karıştır 0834 OPEN IMAGE FILE 0834 GÖRÜNTÜ DOSYASI AÇ 0835 OTHER TOPICS 0835 DİĞER KONULAR 0836 OUTLINES 0836 ANA HATLAR 0837 Old Name 0837 Eski Ad 0838 One Tag: 0838 Tek Tag: 0839 Opacity 0839 Opaklık 0840 Open 0840 Aç 0841 Open Image File 0841 Görüntü Dosyası Aç 0842 Open a file and paste as selected area into an image 0842 Bir dosya aç ve görüntüye seçili alan olarak yapıştır 0843 Open a parallel Fotocx session 0843 Paralel bir Fotocx oturumu aç 0844 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0844 Taranmış renk çizelgesi dosyasını aç ve düzenle. \nTaramadan kaynaklanan eğriliği veya dönüklüğü giderin. \n(Bunun için Perspektifi Düzelt işlevini kullanın). \nİnce yeşil kenar boşluğunu TAM OLARAK kesin. \nRenk çizelgesi dosyasını kaydedin (değiştirin). 0845 Open the trimmed color chart file 0845 Kesilmiş renk çizelgesi dosyasını aç 0846 Optimize 0846 Optimize Et 0847 Other Tag ... 0847 Diğer Tag ... 0848 Outboard Programs 0848 Harici Programlar 0849 Outline Drawing 0849 Ana Hat Çizimi 0850 Outlines 0850 Ana Hatlar 0851 Output Color 0851 Çıktı Rengi 0852 Overlap 0852 Örtüşme 0853 Overlay position in host image: 0853 Ana görüntüde kaplama konumu: 0854 Overlay width, % host image width: 0854 Kaplama genişliği, ana görüntü genişliğinin %'si: 0855 Overwrite file? \n%s 0855 Dosyanın üzerine yazılsın mı? \n%s 0856 PAINT EDITS 0856 BOYALI DÜZENLEMELER 0857 PAINT IMAGE 0857 GÖRÜNTÜYÜ BOYA 0858 PAINT TRANSPARENCY 0858 SAYDAMLIĞI BOYA 0859 PAINTING 0859 BOYAMA 0860 PANORAMA 0860 PANORAMA 0861 PATTERN 0861 DESEN 0862 PERSPECTIVE 0862 PERSPEKTİF 0863 PLACES/DATES 0863 YERLER/TARİHLER 0864 PLUGINS 0864 EKLENTİLER 0865 PREV/NEXT 0865 ÖNCEKİ/SONRAKİ 0866 PRINT CALIBRATED 0866 KALİBRELİ YAZDIR 0867 PRINT IMAGE 0867 GÖRÜNTÜYÜ YAZDIR 0868 PRIVACY 0868 GİZLİLİK 0869 PROBLEM FILES 0869 SORUNLU DOSYALAR 0870 PROBLEM REPORTING 0870 SORUN BİLDİRME 0871 Paint Edits 0871 Boyalı Düzenlemeler 0872 Paint Edits already active 0872 Boyalı Düzenlemeler zaten etkin 0873 Paint Image 0873 Görüntüyü Boya 0874 Paint Image Transparencies 0874 Görüntü Saydamlıklarını Boya 0875 Paint Radius 0875 Boya Yarıçapı 0876 Paint Transparency 0876 Saydamlığı Boya 0877 Paint and Warp Image 0877 Görüntüyü Boya ve Çarpıt 0878 Paint current edit function gradually using the mouse 0878 Fareyi kullanarak geçerli düzenleme işlevini kademeli olarak boya 0879 Paint entire image 0879 Tüm görüntüyü boya 0880 Paint image transparency using the mouse 0880 Fareyi kullanarak görüntü saydamlığını boya 0881 Paint on Image 0881 Görüntü Üzerine Boya 0882 Paint on image using the mouse 0882 Fareyi kullanarak görüntü üzerine boya 0883 Paint transparency 0883 Saydamlığı boya 0884 Paint within mouse 0884 Fare içinde boya 0885 Painting 0885 Boyama 0886 Panorama 0886 Panorama 0887 Paste 0887 Yapıştır 0888 Paste Image 0888 Görüntüyü Yapıştır 0889 Paste previously copied area into image 0889 Önceden kopyalanan alanı görüntüye yapıştır 0890 Pattern 0890 Desen 0891 Pattern File: 0891 Desen Dosyası: 0892 Pattern Width 0892 Desen Genişliği 0893 Percent 0893 Yüzde 0894 Permissions 0894 İzinler 0895 Perspective 0895 Perspektif 0896 Photo Date 0896 Fotoğraf Tarihi 0897 Photo Date/Time 0897 Fotoğraf Tarihi/Saati 0898 Photo Date/Time (metadata) 0898 Fotoğraf Tarihi/Saati (metadata) 0899 Photo Date: %s File Date: %s \n 0899 Fotoğraf Tarihi: %s Dosya Tarihi: %s \n 0900 Pixel count 0900 Piksel sayısı 0901 Pixel difference 0901 Piksel farkı 0902 Pixels 0902 Piksel 0903 Places/Dates 0903 Yerler/Tarihler 0904 Plugin working ... 0904 Eklenti çalışıyor ... 0905 Popup Image 0905 Açılır Görüntü 0906 Power 0906 Güç 0907 Power Center 0907 Güç Merkezi 0908 Power: Center 0908 Güç: Merkez 0909 Pre-align Images 0909 Görüntüleri Ön Hizala 0910 Preference: 0910 Tercih: 0911 Press F1 for help 0911 Yardım için F1'e basın 0912 Prev 0912 Önceki 0913 Prev/Next 0913 Önceki/Sonraki 0914 Previous 0914 Önceki 0915 Previous gallery 0915 Önceki galeri 0916 Print Calibrated 0916 Kalibreli Yazdır 0917 Print Image 0917 Görüntüyü Yazdır 0918 Print chart in vertical orientation without margins. 0918 Çizelgeyi kenar boşluğu olmadan dikey yönde yazdırın. 0919 Print current image file with calibrated colors 0919 Geçerli görüntü dosyasını kalibreli renklerle yazdır 0920 Print the current image file 0920 Geçerli görüntü dosyasını yazdır 0921 Privacy 0921 Gizlilik 0922 Proceed 0922 Devam Et 0923 Proceed? 0923 Devam edilsin mi? 0924 Process album files matching selected files: 0924 Seçili dosyalarla eşleşen albüm dosyalarını işle: 0925 Process an image using a custom convolution kernel 0925 Özel bir evrişim çekirdeği kullanarak görüntüyü işle 0926 Process selected album files: 0926 Seçili albüm dosyalarını işle: 0927 Processing files 0927 Dosyalar işleniyor 0928 Project name 0928 Proje adı 0929 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0929 Fareyi kullanarak bir görüntü konumunu çekin. \nİstediğiniz sonucu alana kadar fareyle birden çok kez çekin. \nBitirdiğinizde [OK]'e basın. 0930 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0930 Fareyi kullanarak bir görüntü köşesini çekin. \nİstediğiniz sonucu alana kadar fareyle birden çok kez çekin. \nBitirdiğinizde [OK]'e basın. 0931 Pull on the image with the mouse. 0931 Fareyle görüntüyü çekin. 0932 Purge unwanted keywords from all image files 0932 Tüm görüntü dosyalarından istenmeyen keyword'leri temizle 0933 QUESTIONS, SUGGESTIONS 0933 SORULAR, ÖNERİLER 0934 Quit 0934 Çık 0935 Quit Fotocx 0935 Fotocx'ten Çık 0936 Quit Fotocx? 0936 Fotocx'ten çıkılsın mı? 0937 RAW Files 0937 RAW Dosyaları 0938 RAW Options 0938 RAW Seçenekleri 0939 RAW conversion failed: %s %s 0939 RAW dönüştürme başarısız: %s %s 0940 RAW loader 0940 RAW yükleyici 0941 RECENT FILES 0941 SON DOSYALAR 0942 RECENT FOLDERS 0942 SON KLASÖRLER 0943 RED EYES 0943 KIRMIZI GÖZLER 0944 REFINE MENU 0944 İNCELTME MENÜSÜ 0945 REMOVE DUST 0945 TOZU GİDER 0946 REMOVE HALO 0946 HALEYİ GİDER 0947 RENAME 0947 YENİDEN ADLANDIR 0948 RENAME ALBUM 0948 ALBÜMÜ YENİDEN ADLANDIR 0949 REPAIR MENU 0949 ONARIM MENÜSÜ 0950 RESCALE 0950 YENİDEN ÖLÇEKLE 0951 RETOUCH 0951 RÖTUŞ 0952 RGB -> BRG 0952 RGB -> BRG 0953 RGB -> GBR 0953 RGB -> GBR 0954 RGB HISTOGRAM 0954 RGB HİSTOGRAMI 0955 RGB Histogram 0955 RGB Histogramı 0956 RGB brightness histogram graph 0956 RGB parlaklık histogramı grafiği 0957 RGB color 0957 RGB rengi 0958 RGB mix with given bit-depth 0958 Belirtilen bit derinliğiyle RGB karışımı 0959 ROTATE 0959 DÖNDÜR 0960 RUN SCRIPT 0960 BETİĞİ ÇALIŞTIR 0961 Radial Blur 0961 Radyal Bulanıklaştırma 0962 Radial Blur - mix pixels in radial lines from chosen center 0962 Radyal Bulanıklaştırma - seçilen merkezden radyal çizgilerde pikselleri karıştır 0963 Radius 0963 Yarıçap 0964 Random Image 0964 Rastgele Görüntü 0965 Range 0965 Aralık 0966 Rating: 0966 Derecelendirme: 0967 Rating: %s Size: %s %.2fmb \n 0967 Derecelendirme: %s Boyut: %s %.2fmb \n 0968 Read or search the user guide 0968 Kullanıcı kılavuzunu oku veya ara 0969 Recent Files 0969 Son Dosyalar 0970 Recent Folders 0970 Son Klasörler 0971 Recent Keywords 0971 Son Keyword'ler 0972 Rectify closeup face photo (balloon face) 0972 Yakın çekim yüz fotoğrafını düzelt (balon yüz) 0973 Red 0973 Kırmızı 0974 Red Eye Reduction 0974 Kırmızı Göz Azaltma 0975 Red Eyes 0975 Kırmızı Gözler 0976 Red Factors 0976 Kırmızı Faktörleri 0977 Redo 0977 Yinele 0978 Reduce Fog/Haze 0978 Sis/Pus Azalt 0979 Reduce fog/haze in an image or selected areas 0979 Bir görüntüde veya seçili alanlarda sis/pusu azalt 0980 Refine 0980 İncelt 0981 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0981 İncelt: histogramı düzleştir, yerel kontrast, kontrastı artır, retineks, doygunluk 0982 Remove 0982 Kaldır 0983 Remove Dust 0983 Tozu Gider 0984 Remove Halo 0984 Haleyi Gider 0985 Remove dust spots from old scanned photos 0985 Eski taranmış fotoğraflardan toz lekelerini kaldır 0986 Remove from Album 0986 Albümden Kaldır 0987 Remove halos left by some edit functions 0987 Bazı düzenleme işlevlerinin bıraktığı haleleri kaldır 0988 Remove image curvature, especially in panoramas 0988 Görüntü eğriliğini kaldır, özellikle panoramalarda 0989 Remove jaggies on hard image feature edges 0989 Sert görüntü öznitelik kenarlarındaki tırtıkları kaldır 0990 Remove selected image metadata 0990 Seçili görüntü metadata'sını kaldır 0991 Remove unwanted objects in an image 0991 Bir görüntüdeki istenmeyen nesneleri kaldır 0992 Rename 0992 Yeniden Adlandır 0993 Rename Album 0993 Albümü Yeniden Adlandır 0994 Rename Image File 0994 Görüntü Dosyasını Yeniden Adlandır 0995 Rename an existing album 0995 Mevcut bir albümü yeniden adlandır 0996 Rename or delete keywords for all image files 0996 Tüm görüntü dosyaları için keyword'leri yeniden adlandır veya sil 0997 Rename to 0997 Şuna yeniden adlandır 0998 Rename/convert/rescale/move selected image or RAW files 0998 Seçili görüntü veya RAW dosyalarını yeniden adlandır/dönüştür/yeniden ölçekle/taşı 0999 Repair 0999 Onar 1000 Repair malformed metadata preventing metadata edits 1000 Metadata düzenlemelerini engelleyen bozuk metadata'yı onar 1001 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 1001 Onar: keskinleştir, bulanıklaştır, gürültü gider, sis gider, kırmızı gözler, akıllı silme, renk ayarla 1002 Replace 1002 Değiştir 1003 Replace Text 1003 Metni Değiştir 1004 Replace all versions with newest version 1004 Tüm sürümleri en yeni sürümle değiştir 1005 Replace all versions with selected versions 1005 Tüm sürümleri seçili sürümlerle değiştir 1006 Replace all with newest version only 1006 Tümünü yalnızca en yeni sürümle değiştir 1007 Replace all with original + newest version 1007 Tümünü orijinal + en yeni sürümle değiştir 1008 Replace all with original + selected versions 1008 Tümünü orijinal + seçili sürümlerle değiştir 1009 Replace all with original and all versions 1009 Tümünü orijinal ve tüm sürümlerle değiştir 1010 Replace all with selected versions 1010 Tümünü seçili sürümlerle değiştir 1011 Replace host files 1011 Ana dosyaları değiştir 1012 Report Image Places/Dates 1012 Görüntü Yerlerini/Tarihlerini Raporla 1013 Report selected metadata for selected image files 1013 Seçili görüntü dosyaları için seçili metadata'yı raporla 1014 Required programs are installed. \n 1014 Gerekli programlar kurulu. \n 1015 Rescale 1015 Yeniden Ölçekle 1016 Rescale Image 1016 Görüntüyü Yeniden Ölçekle 1017 Rescale RGB levels to reduce color caste and fog/haze 1017 Renk tonunu ve sis/pusu azaltmak için RGB seviyelerini yeniden ölçekle 1018 Rescale brightness levels to increase local contrast 1018 Yerel kontrastı artırmak için parlaklık seviyelerini yeniden ölçekle 1019 Rescale: 1019 Yeniden Ölçekle: 1020 Reserved Shortcuts \n 1020 Ayrılmış Kısayollar \n 1021 Reserved shortcut ignored: %s 1021 Ayrılmış kısayol yok sayıldı: %s 1022 Reset 1022 Sıfırla 1023 Reset all galleries to file name ascending 1023 Tüm galerileri dosya adına göre artan sıraya sıfırla 1024 Resolution 1024 Çözünürlük 1025 Resources 1025 Kaynaklar 1026 Resume 1026 Devam Et 1027 Retouch 1027 Rötuş 1028 Reverse R 1028 R'yi Ters Çevir 1029 Richardson-Lucy 1029 Richardson-Lucy 1030 Right 1030 Sağ 1031 Rim % 1031 Kenar % 1032 Rotate 1032 Döndür 1033 Rotate Image 1033 Görüntüyü Döndür 1034 Rotate or level an image 1034 Görüntüyü döndür veya düzelt 1035 Rotate: 1035 Döndür: 1036 Roy Lichtenstein effect 1036 Roy Lichtenstein efekti 1037 SATURATION 1037 DOYGUNLUK 1038 SCRIPT FILES 1038 BETİK DOSYALARI 1039 SEARCH IMAGES 1039 GÖRÜNTÜLERİ ARA 1040 SELECT AREA 1040 ALAN SEÇ 1041 SELECT FILES 1041 DOSYALARI SEÇ 1042 SELECT IMAGE FILES 1042 GÖRÜNTÜ DOSYALARINI SEÇ 1043 SELECT MENU 1043 SEÇ MENÜSÜ 1044 SET COLORS 1044 RENKLERİ AYARLA 1045 SET WALLPAPER 1045 DUVAR KAĞIDINI AYARLA 1046 SETTINGS 1046 AYARLAR 1047 SHARPEN 1047 KESKİNLEŞTİR 1048 SHIFT COLORS 1048 RENKLERİ KAYDIR 1049 SHORTCUTS 1049 KISAYOLLAR 1050 SHOW CIM FILES 1050 CIM DOSYALARINI GÖSTER 1051 SHOW DIFFS 1051 FARKLARI GÖSTER 1052 SHOW ON MAP 1052 HARİTADA GÖSTER 1053 SHOW RESOURCES 1053 KAYNAKLARI GÖSTER 1054 SHOW RGB 1054 RGB GÖSTER 1055 SHOW/HIDE AREA 1055 ALANI GÖSTER/GİZLE 1056 SKETCH1 1056 ESKİZ1 1057 SKETCH2 1057 ESKİZ2 1058 SLIDE SHOW 1058 SLAYT GÖSTERİSİ 1059 SLIDES AND NEGATIVES 1059 SLAYTLAR VE NEGATİFLER 1060 SLIDESHOW END 1060 SLAYT GÖSTERİSİ SONU 1061 SMART ERASE 1061 AKILLI SİLME 1062 SOFT FOCUS 1062 YUMUŞAK ODAK 1063 SPHERE 1063 KÜRE 1064 SPLIT-SCREEN 1064 BÖLÜNMÜŞ EKRAN 1065 STACK/LAYERS 1065 YIĞIN/KATMANLAR 1066 STACK/NOISE 1066 YIĞIN/GÜRÜLTÜ 1067 STACK/PAINT 1067 YIĞIN/BOYAMA 1068 Saturation 1068 Doygunluk 1069 Save 1069 Kaydet 1070 Save Gallery as Album 1070 Galeriyi Albüm Olarak Kaydet 1071 Save Image File 1071 Görüntü Dosyasını Kaydet 1072 Save as new file name or type 1072 Yeni dosya adı veya türü olarak kaydet 1073 Save current gallery as album 1073 Geçerli galeriyi albüm olarak kaydet 1074 Save modified image as new file or new file version 1074 Değiştirilmiş görüntüyü yeni dosya veya yeni dosya sürümü olarak kaydet 1075 Save selected area to a file with transparency 1075 Seçili alanı saydamlıkla birlikte bir dosyaya kaydet 1076 Saved Areas 1076 Kaydedilmiş Alanlar 1077 Scale 1077 Ölçek 1078 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1078 Basılı renk çizelgesini tarayın, en koyu satır üstte olacak şekilde. \nYazıcı ve kağıt adlarını kullanarak .png dosyası olarak kaydedin \n(ör. %s/Epson_glossy.png). \n 1079 Search 1079 Ara 1080 Search Images 1080 Görüntüleri Ara 1081 Search Results 1081 Arama Sonuçları 1082 Search all image files and report duplicates 1082 Tüm görüntü dosyalarını ara ve yinelenenleri raporla 1083 Searching - use ESC key to terminate 1083 Aranıyor - sonlandırmak için ESC tuşunu kullanın 1084 Seconds 1084 Saniye 1085 Select 1085 Seç 1086 Select %d to %d files 1086 %d ile %d arasında dosya seç 1087 Select Album 1087 Albüm Seç 1088 Select Albums 1088 Albümleri Seç 1089 Select Area 1089 Alan Seç 1090 Select Area for Edits 1090 Düzenlemeler için Alan Seç 1091 Select Area not supported \nby this edit function 1091 Alan Seç, \nbu düzenleme işlevi tarafından desteklenmiyor 1092 Select Files 1092 Dosyaları Seç 1093 Select Image 1093 Görüntü Seç 1094 Select Image Files 1094 Görüntü Dosyalarını Seç 1095 Select Metadata tags 1095 Metadata tag'lerini seç 1096 Select Script 1096 Betik Seç 1097 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1097 Çarpıtmak için alan seçme işlevini kullanarak bir alan seçin. \n[çarpıtmayı başlat]'a basın ve alanı fareyle çekin. \nİstediğiniz sonucu alana kadar fareyle birden çok kez çekin. \nBitirdiğinizde başka bir alan seçin veya [OK]'e basın. 1098 Select and Paint Image 1098 Görüntüyü Seç ve Boya 1099 Select and view an image file 1099 Bir görüntü dosyası seçin ve görüntüleyin 1100 Select area cannot be kept.\nContinue? 1100 Seçili alan tutulamaz.\nDevam edilsin mi? 1101 Select area disabled, Continue? 1101 Alan seçimi devre dışı, Devam edilsin mi? 1102 Select area not finished, Continue? 1102 Alan seçimi tamamlanmadı, Devam edilsin mi? 1103 Select area will be ignored. \nContinue? 1103 Seçili alan yok sayılacak. \nDevam edilsin mi? 1104 Select folder 1104 Klasör seç 1105 Select host image files 1105 Ana görüntü dosyalarını seç 1106 Select image areas to edit separately, copy/paste selections 1106 Ayrı ayrı düzenlemek için görüntü alanlarını seç, seçimleri kopyala/yapıştır 1107 Select image objects or areas for separate editing 1107 Ayrı düzenleme için görüntü nesnelerini veya alanlarını seç 1108 Select input files for subsequent function 1108 Sonraki işlev için girdi dosyalarını seç 1109 Select overlay file 1109 Kaplama dosyasını seç 1110 Select startup album 1110 Başlangıç albümünü seç 1111 Select startup folder 1111 Başlangıç klasörünü seç 1112 Select startup image file 1112 Başlangıç görüntü dosyasını seç 1113 Select the image file to print. 1113 Yazdırılacak görüntü dosyasını seçin. 1114 Select to add, click on X to delete. 1114 Eklemek için seçin, silmek için X'e tıklayın. 1115 Select two files 1115 İki dosya seç 1116 Select versions, ratings, keywords, filename text 1116 Sürümleri, derecelendirmeleri, keyword'leri, dosya adı metnini seç 1117 Separation Horz 1117 Yatay Ayrım 1118 Sequence Numbers 1118 Sıra Numaraları 1119 Set Colors 1119 Renkleri Ayarla 1120 Set No. of Colors 1120 Renk Sayısını Ayarla 1121 Set Ratio: 1121 Oranı Ayarla: 1122 Set Wallpaper 1122 Duvar Kağıdını Ayarla 1123 Set Width: 1123 Genişliği Ayarla: 1124 Set and view bookmarks, select for gallery view 1124 Yer imlerini ayarla ve görüntüle, galeri görünümü için seç 1125 Set black-white/color, negative/positive, sepia 1125 Siyah-beyaz/renkli, negatif/pozitif, sepya ayarla 1126 Set foreground line color (crop, grid, select, warp) 1126 Ön plan çizgi rengini ayarla (kırpma, ızgara, seçim, çarpıtma) 1127 Set gallery from latest search results 1127 Galeriyi en son arama sonuçlarından ayarla 1128 Set gallery from recent folders list 1128 Galeriyi son klasörler listesinden ayarla 1129 Set gallery to folder of current file 1129 Galeriyi geçerli dosyanın klasörüne ayarla 1130 Set horizontal/vertical grid line counts 1130 Yatay/dikey ızgara çizgisi sayısını ayarla 1131 Set image file as desktop wallpaper 1131 Görüntü dosyasını masaüstü duvar kağıdı olarak ayarla 1132 Set line properties, [Add] to layout, edit. 1132 Çizgi özelliklerini ayarla, düzene [Ekle], düzenle. 1133 Set number of colors for each R/G/B or total 1133 Her R/G/B veya toplam için renk sayısını ayarla 1134 Set or shift photo date/time for selected image files 1134 Seçili görüntü dosyaları için fotoğraf tarihini/saatini ayarla veya kaydır 1135 Set the name for the output calibration file \n[your calibration name].dat 1135 Çıktı kalibrasyon dosyası için adı ayarla \n[kalibrasyon adınız].dat 1136 Settings 1136 Ayarlar 1137 Sharpen 1137 Keskinleştir 1138 Sharpen the image (various methods) 1138 Görüntüyü keskinleştir (çeşitli yöntemler) 1139 Shift + drag mouse across image \nto indicate blur direction 1139 Bulanıklık yönünü belirtmek için Shift + fareyi \ngörüntü boyunca sürükleyin 1140 Shift Colors 1140 Renkleri Kaydır 1141 Shift/convert image colors into other colors 1141 Görüntü renklerini başka renklere kaydır/dönüştür 1142 Short List 1142 Kısa Liste 1143 Show 1143 Göster 1144 Show (outline) selected areas 1144 Seçili alanları göster (ana hat) 1145 Show CIM Files 1145 CIM Dosyalarını Göster 1146 Show Diffs 1146 Farkları Göster 1147 Show Fotocx installed version and author contact 1147 Kurulu Fotocx sürümünü ve yazar iletişim bilgilerini göster 1148 Show Fotocx updates for recent releases 1148 Son sürümler için Fotocx güncellemelerini göster 1149 Show Hidden 1149 Gizlileri Göster 1150 Show Log File 1150 Günlük Dosyasını Göster 1151 Show RGB 1151 RGB Göster 1152 Show RGB levels at mouse position 1152 Fare konumundaki RGB seviyelerini göster 1153 Show Resources 1153 Kaynakları Göster 1154 Show folder hierarchy, click folder for gallery view 1154 Klasör hiyerarşisini göster, galeri görünümü için klasöre tıklayın 1155 Show image counts in year/month table, select, report 1155 Görüntü sayılarını yıl/ay tablosunda göster, seç, raporla 1156 Show image description (overlap) 1156 Görüntü açıklamasını göster (örtüşme) 1157 Show image differences on the image 1157 Görüntüdeki farkları göster 1158 Show image file name (overlap) 1158 Görüntü dosyası adını göster (örtüşme) 1159 Show image title (overlap) 1159 Görüntü başlığını göster (örtüşme) 1160 Show input files used in combine function 1160 Birleştirme işlevinde kullanılan girdi dosyalarını göster 1161 Show key metadata for current image or clicked thumbnail 1161 Geçerli görüntü veya tıklanan thumbnail için temel metadata'yı göster 1162 Show map position of the current image file 1162 Geçerli görüntü dosyasının harita konumunu göster 1163 Show memory and CPU resources used 1163 Kullanılan bellek ve CPU kaynaklarını göster 1164 Show on Map 1164 Haritada Göster 1165 Show or make Keyboard Shortcuts 1165 Klavye Kısayollarını göster veya oluştur 1166 Show the current (last used) album 1166 Geçerli (en son kullanılan) albümü göster 1167 Show the current log file 1167 Geçerli günlük dosyasını göster 1168 Size 1168 Boyut 1169 Sketch1 1169 Eskiz1 1170 Sketch2 1170 Eskiz2 1171 Slide Show 1171 Slayt Gösterisi 1172 Smart Erase 1172 Akıllı Silme 1173 Soft Focus 1173 Yumuşak Odak 1174 Sphere 1174 Küre 1175 Spherical Projection 1175 Küresel İzdüşüm 1176 Split-Screen 1176 Bölünmüş Ekran 1177 Stack/Layers 1177 Yığın/Katmanlar 1178 Stack/Noise 1178 Yığın/Gürültü 1179 Stack/Paint 1179 Yığın/Boyama 1180 Stacking Order 1180 Yığın Sırası 1181 Start 1181 Başlat 1182 Start a slide show 1182 Bir slayt gösterisi başlat 1183 Start of gallery 1183 Galeri başlangıcı 1184 Startup View 1184 Başlangıç Görünümü 1185 Stop 1185 Durdur 1186 Stretch 1186 Uzat 1187 Stretch: 1187 Uzat: 1188 Suppress JPEG compression artifacts 1188 JPEG sıkıştırma bozulmalarını gider 1189 Suppress Ringing 1189 Çınlamayı Gider 1190 Suppress fine details while retaining sharpness 1190 Keskinliği korurken ince ayrıntıları bastır 1191 Suppress noise from low-light photos 1191 Düşük ışıklı fotoğraflardaki gürültüyü bastır 1192 Survey all files 1192 Tüm dosyaları tara 1193 TEXTURE 1193 DOKU 1194 THUMB VIEW 1194 THUMBNAIL GÖRÜNÜMÜ 1195 TILES1 1195 KAROLAR1 1196 TILES2 1196 KAROLAR2 1197 TIMELINE 1197 ZAMAN ÇİZELGESİ 1198 TINY PLANET 1198 MİNİK GEZEGEN 1199 TOOLS MENU 1199 ARAÇLAR MENÜSÜ 1200 TRANSLATIONS 1200 ÇEVİRİLER 1201 TWIST 1201 BÜKME 1202 Temperature 1202 Sıcaklık 1203 Text 1203 Metin 1204 Text File: 1204 Metin Dosyası: 1205 Texture 1205 Doku 1206 Threshold 1206 Eşik 1207 Threshold: Low 1207 Eşik: Düşük 1208 Thumbnail View 1208 Thumbnail Görünümü 1209 Thumbnail size 1209 Thumbnail boyutu 1210 Thumbnails folder 1210 Thumbnails klasörü 1211 Thumbnails folder: %s \nPlease remove. 1211 Thumbnails klasörü: %s \nLütfen kaldırın. 1212 Thumbnails folder: \n %s \nmust be named .../thumbnails 1212 Thumbnails klasörü: \n %s \n.../thumbnails olarak adlandırılmalı 1213 Thumbnails: 1213 Thumbnails: 1214 Tile 1214 Karo 1215 Tile blending 1215 Karo karıştırma 1216 Tile image with a repeating pattern 1216 Görüntüyü tekrarlayan bir desenle karola 1217 Tiles 1217 Karolar 1218 Tiles1 1218 Karolar1 1219 Tiles2 1219 Karolar2 1220 Timeline 1220 Zaman Çizelgesi 1221 Tiny Planet 1221 Minik Gezegen 1222 Title 1222 Başlık 1223 Title: %s\n 1223 Başlık: %s\n 1224 To Location 1224 Konuma 1225 Toggle Captions 1225 Başlıkları Aç/Kapat 1226 Toggle Grid 1226 Izgarayı Aç/Kapat 1227 Toggle grid lines on and off 1227 Izgara çizgilerini aç/kapat 1228 Toggle image metadata display ON/OFF 1228 Görüntü metadata gösterimini AÇ/KAPAT 1229 Too little overlap, cannot align 1229 Örtüşme çok az, hizalanamıyor 1230 Too many edits, please save image 1230 Çok fazla düzenleme var, lütfen görüntüyü kaydedin 1231 Tools 1231 Araçlar 1232 Tools: image index, settings, shortcuts, grid, find duplicates 1232 Araçlar: görüntü dizini, ayarlar, kısayollar, ızgara, yinelenenleri bul 1233 Top 1233 Üst 1234 Total Colors 1234 Toplam Renk 1235 Trace 1235 İzle 1236 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1236 Fare tıklamalarıyla üst ve alt eğrileri \nizleyin, sonra [düzleştir]. 1237 Transient Objects 1237 Geçici Nesneler 1238 Transition Preferences 1238 Geçiş Tercihleri 1239 Transition to next image 1239 Sonraki görüntüye geçiş 1240 Transitions File 1240 Geçişler Dosyası 1241 Transp. 1241 Saydam. 1242 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1242 Saydamlık haritası kaybolacak \n(korumak için TIFF|PNG|JXL olarak kaydedin) \nYine de kaydedilsin mi? 1243 Trash 1243 Çöp 1244 Trash read-only file? 1244 Salt okunur dosya çöpe atılsın mı? 1245 Turn an image inside-out 1245 Bir görüntüyü içten dışa çevir 1246 Twist 1246 Bükme 1247 Twist image centered at mouse position 1247 Görüntüyü fare konumu merkezli olarak bük 1248 UNBEND 1248 DÜZELT 1249 UNDO/REDO BUTTON 1249 GERİ AL/YİNELE DÜĞMESİ 1250 UNWARP CLOSEUP 1250 YAKIN ÇEKİMİ DÜZELT 1251 UPDATE ALBUMS 1251 ALBÜMLERİ GÜNCELLE 1252 UPRIGHT 1252 DÜZELT 1253 USER GUIDE 1253 KULLANICI KILAVUZU 1254 Unable to copy metadata 1254 Metadata kopyalanamıyor 1255 Unbend 1255 Düzelt 1256 Undo 1256 Geri Al 1257 Undo All 1257 Tümünü Geri Al 1258 Undo Last 1258 Sonuncuyu Geri Al 1259 Undo/Redo 1259 Geri Al/Yinele 1260 Uninstall 1260 Kaldır (Uninstall) 1261 Unwarp Closeup 1261 Yakın Çekimi Düzelt 1262 Update Albums 1262 Albümleri Güncelle 1263 Update albums for new file versions 1263 Yeni dosya sürümleri için albümleri güncelle 1264 Upright 1264 Düzelt 1265 Upright Image 1265 Görüntüyü Düzelt 1266 Upright or mirror-flip an image 1266 Bir görüntüyü düzelt veya ayna çevir 1267 Upright rotated image files, selected set or ALL 1267 Döndürülmüş görüntü dosyalarını düzelt, seçili küme veya TÜMÜ 1268 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1268 Bir yüz seçmek için Alan Seç'i kullanın. \nÇarpıtma merkezine tıklayın. \nKaydırıcıyı hareket ettirin. \n 1269 Use [Select] to add files to an empty album 1269 Boş bir albüme dosya eklemek için [Seç]'i kullanın 1270 Use metadata photo date or file modification date? 1270 Metadata fotoğraf tarihi mi yoksa dosya değiştirme tarihi mi kullanılsın? 1271 Use metadata tag 1271 Metadata tag kullan 1272 Use settings file 1272 Ayarlar dosyasını kullan 1273 User Guide 1273 Kullanıcı Kılavuzu 1274 User preferences and settings 1274 Kullanıcı tercihleri ve ayarları 1275 VIDEO press P to play 1275 VİDEO oynatmak için P'ye basın 1276 VIEW 360° PANO 1276 360° PANO GÖRÜNTÜLE 1277 VIEW ALL META 1277 TÜM METAYI GÖRÜNTÜLE 1278 VIEW MAIN META 1278 ANA METAYI GÖRÜNTÜLE 1279 VIGNETTE 1279 VİNYET 1280 Var. Transparency 1280 Değ. Saydamlık 1281 Vert 1281 Dikey 1282 Video Files 1282 Video Dosyaları 1283 Video Tutorial 1283 Video Eğitimi 1284 Video command 1284 Video komutu 1285 View 360 degree panorama image 1285 360 derece panorama görüntüsünü görüntüle 1286 View 360° Pano 1286 360° Pano Görüntüle 1287 View All Meta 1287 Tüm Metayı Görüntüle 1288 View All Metadata 1288 Tüm Metadata'yı Görüntüle 1289 View Main Meta 1289 Ana Metayı Görüntüle 1290 View Main Metadata 1290 Ana Metadata'yı Görüntüle 1291 View before/after images using split-screen 1291 Bölünmüş ekran kullanarak önce/sonra görüntülerini görüntüle 1292 View/edit metadata, image report and search functions 1292 Metadata'yı görüntüle/düzenle, görüntü raporu ve arama işlevleri 1293 Vignette 1293 Vinyet 1294 W/H Ratio: 1294 G/Y Oranı: 1295 WARP AFFINE 1295 AFİN ÇARPIT 1296 WARP AREA 1296 ALANI ÇARPIT 1297 WARP CURVED 1297 EĞRİSEL ÇARPIT 1298 WARP IMAGE 1298 GÖRÜNTÜYÜ ÇARPIT 1299 WARP MENU 1299 ÇARPITMA MENÜSÜ 1300 WARP RADIAL 1300 RADYAL ÇARPIT 1301 WINDOW VIEWS AND MENUS 1301 PENCERE GÖRÜNÜMLERİ VE MENÜLERİ 1302 WORLD MAP 1302 DÜNYA HARİTASI 1303 Wait after zoom 1303 Yakınlaştırma sonrası bekle 1304 Wait before filename/title/description 1304 Dosya adı/başlık/açıklamadan önce bekle 1305 Wait before zoom 1305 Yakınlaştırmadan önce bekle 1306 Warp 1306 Çarpıt 1307 Warp Affine 1307 Afin Çarpıt 1308 Warp Area 1308 Alanı Çarpıt 1309 Warp Curved 1309 Eğrisel Çarpıt 1310 Warp Image 1310 Görüntüyü Çarpıt 1311 Warp Linear1 1311 Doğrusal Çarpıt1 1312 Warp Linear2 1312 Doğrusal Çarpıt2 1313 Warp Radial 1313 Radyal Çarpıt 1314 Warp an image with a wave pattern 1314 Bir görüntüyü dalga deseniyle çarpıt 1315 Warp image (affine) using the mouse 1315 Fareyi kullanarak görüntüyü çarpıt (afin) 1316 Warp image (curved) using the mouse 1316 Fareyi kullanarak görüntüyü çarpıt (eğrisel) 1317 Warp image (linear 1) using the mouse 1317 Fareyi kullanarak görüntüyü çarpıt (doğrusal 1) 1318 Warp image (linear 2) using the mouse 1318 Fareyi kullanarak görüntüyü çarpıt (doğrusal 2) 1319 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1319 Çarpıtma: düzelt, perspektifi düzelt, çarpıt, yakın çekimi düzelt, düzleştir, görüntü dönüşümleri 1320 White 1320 Beyaz 1321 Widen: 1321 Genişlet: 1322 Width 1322 Genişlik 1323 Width % 1323 Genişlik % 1324 X-size 1324 X-boyutu 1325 Yes 1325 Evet 1326 ZOOM 1326 ZOOM 1327 Zoom 1327 Zoom 1328 Zoom Center 1328 Zoom Merkezi 1329 Zoom Speed 1329 Zoom Hızı 1330 Zoom-in 1330 Yakınlaştır 1331 Zoom-out 1331 Uzaklaştır 1332 \n %d-bits/color 1332 \n %d-bit/renk 1333 \n *** CANCELED \n 1333 \n *** İPTAL EDİLDİ \n 1334 \n *** COMPLETED \n 1334 \n *** TAMAMLANDI \n 1335 \n *** Delete Originals *** 1335 \n *** Orijinalleri Sil *** 1336 \n *** Keep Originals *** 1336 \n *** Orijinalleri Koru *** 1337 \n *** Replace Originals *** 1337 \n *** Orijinalleri Değiştir *** 1338 \n Convert to %s 1338 \n %s'e dönüştür 1339 \n Copy Metadata 1339 \n Metadata Kopyala 1340 \n Downsize within %dx%d 1340 \n %dx%d içinde küçült 1341 \n New Location: %s 1341 \n Yeni Konum: %s 1342 \n Output to %s 1342 \n %s konumuna çıktı ver 1343 \n PROCEED? 1343 \n DEVAM EDİLSİN Mİ? 1344 \n Rename to %s 1344 \n %s olarak yeniden adlandır 1345 \n Replace text: %s --> %s 1345 \n Metni değiştir: %s --> %s 1346 \n Rescale to %sx 1346 \n %sx olarak yeniden ölçekle 1347 \n Update Albums 1347 \n Albümleri Güncelle 1348 \n Upsize within %dx%d 1348 \n %dx%d içinde büyüt 1349 \n*** CANCELED \n 1349 \n*** İPTAL EDİLDİ \n 1350 \n*** COMPLETED \n 1350 \n*** TAMAMLANDI \n 1351 \n\nPROCEED? 1351 \n\nDEVAM EDİLSİN Mİ? 1352 add 1352 ekle 1353 add after old 1353 eskiden sonra ekle 1354 add all gallery files to list 1354 tüm galeri dosyalarını listeye ekle 1355 add current file to list 1355 geçerli dosyayı listeye ekle 1356 add entered text to layout 1356 girilen metni düzene ekle 1357 add images to layout 1357 görüntüleri düzene ekle 1358 add line/arrow to layout 1358 çizgi/ok düzene ekle 1359 add new keyword 1359 yeni keyword ekle 1360 add or edit images 1360 görüntü ekle veya düzenle 1361 add or edit lines/arrows 1361 çizgi/ok ekle veya düzenle 1362 add or edit text 1362 metin ekle veya düzenle 1363 add to set 1363 kümeye ekle 1364 adder 1364 ekleyici 1365 adjust brightness of selected image 1365 seçili görüntünün parlaklığını ayarla 1366 after removal of missing files: %d \n 1366 eksik dosyaların kaldırılmasından sonra: %d \n 1367 album %s: deleted 1367 albüm %s: silindi 1368 album already exists: %s 1368 albüm zaten mevcut: %s 1369 album mass update 1369 albüm toplu güncelleme 1370 albums folder missing 1370 albümler klasörü eksik 1371 align and trim color chart 1371 renk çizelgesini hizala ve kırp 1372 all files 1372 tüm dosyalar 1373 all image files, including unmounted folders: %d \n 1373 bağlanmamış klasörler dahil tüm görüntü dosyaları: %d \n 1374 all images 1374 tüm görüntüler 1375 all versions 1375 tüm sürümler 1376 amplify contrast 1376 kontrastı artır 1377 amplitude 1377 genlik 1378 angle 1378 açı 1379 apply 1379 uygula 1380 area edge creep 1380 alan kenarı kayması 1381 area is not finished 1381 alan tamamlanmadı 1382 area outline color: 1382 alan taslağı rengi: 1383 array width is too large: %d x %d 1383 dizi genişliği çok büyük: %d x %d 1384 ascending 1384 artan 1385 auto color 1385 otomatik renk 1386 background colors for file and gallery view windows 1386 dosya ve galeri görünümü pencereleri için arka plan renkleri 1387 backing 1387 destek 1388 bad category name 1388 hatalı kategori adı 1389 bad keyword name 1389 hatalı keyword adı 1390 bad pattern file: %s 1390 hatalı desen dosyası: %s 1391 base 1391 taban 1392 base and adder need $s plugin 1392 taban ve ekleyici $s eklentisini gerektirir 1393 base size 1393 taban boyutu 1394 begin making a script file 1394 bir betik dosyası oluşturmaya başla 1395 black/white 1395 siyah/beyaz 1396 black/white negative 1396 siyah/beyaz negatif 1397 black/white positive 1397 siyah/beyaz pozitif 1398 blend 1398 karıştır 1399 blend edges: blend width: 1399 kenarları karıştır: karıştırma genişliği: 1400 blend image overlaps over pixel width 1400 piksel genişliği üzerinden görüntü çakışmalarını karıştır 1401 blend rate: center: 1401 karıştırma oranı: merkez: 1402 blocking function: %s 1402 engelleyen işlev: %s 1403 blocksize 1403 blok boyutu 1404 blur edges: blur width: 1404 kenarları bulanıklaştır: bulanıklık genişliği: 1405 blur radius 1405 bulanıklık yarıçapı 1406 borders 1406 kenarlıklar 1407 both 'All Files' and specific files were selected 1407 hem 'Tüm Dosyalar' hem de belirli dosyalar seçildi 1408 bright halo 1408 parlak hale 1409 brightness rescale 1409 parlaklık yeniden ölçekleme 1410 browse 1410 göz at 1411 brush size 1411 fırça boyutu 1412 build index, old files only 1412 dizin oluştur, yalnızca eski dosyalar 1413 cancel project 1413 projeyi iptal et 1414 cancel project? 1414 proje iptal edilsin mi? 1415 cannot allocate %d MB memory 1415 %d MB bellek ayrılamıyor 1416 cannot be determined 1416 belirlenemiyor 1417 cannot copy a file to itself 1417 bir dosya kendisine kopyalanamaz 1418 cannot copy current file 1418 geçerli dosya kopyalanamıyor 1419 cannot create output file 1419 çıktı dosyası oluşturulamıyor 1420 cannot create pixbuf 1420 pixbuf oluşturulamıyor 1421 cannot find area outline 1421 alan taslağı bulunamıyor 1422 cannot find output file 1422 çıktı dosyası bulunamıyor 1423 cannot load input file 1423 girdi dosyası yüklenemiyor 1424 cannot open file %s 1424 %s dosyası açılamıyor 1425 cannot parse current file 1425 geçerli dosya ayrıştırılamıyor 1426 cannot parse file 1426 dosya ayrıştırılamıyor 1427 cannot read pluging output file 1427 eklenti çıktı dosyası okunamıyor 1428 cannot replace %s file 1428 %s dosyası değiştirilemiyor 1429 cannot save as RAW type 1429 RAW türü olarak kaydedilemiyor 1430 cannot save layout file: %s 1430 düzen dosyası kaydedilemiyor: %s 1431 cannot write image folders file: %s 1431 görüntü klasörleri dosyası yazılamıyor: %s 1432 category %s has too many keywords 1432 %s kategorisinde çok fazla keyword var 1433 category %s is too big 1433 %s kategorisi çok büyük 1434 center 1434 merkez 1435 change project scale 1435 proje ölçeğini değiştir 1436 choose 1-8 clicks or [+] keys for 2x image zoom 1436 2x görüntü yakınlaştırma için 1-8 tıklama veya [+] tuşları seçin 1437 choose a better spot 1437 daha iyi bir nokta seçin 1438 choose an image file 1438 bir görüntü dosyası seçin 1439 choose file 1439 dosya seç 1440 choose files 1440 dosyalar seç 1441 choose folder 1441 klasör seç 1442 choose folders 1442 klasörler seç 1443 choose location 1443 konum seç 1444 circle 1444 daire 1445 clear area selections 1445 alan seçimlerini temizle 1446 clear entered text 1446 girilen metni temizle 1447 clear inputs 1447 girdileri temizle 1448 clear text 1448 metni temizle 1449 click a defined keyword (below) to add a search keyword 1449 bir arama keyword'ü eklemek için tanımlı bir keyword'e (aşağıda) tıklayın 1450 click bright point 1450 parlak noktaya tıklayın 1451 click dark point 1451 koyu noktaya tıklayın 1452 click on desired color 1452 istenen renge tıklayın 1453 click on image to get source color 1453 kaynak rengi almak için görüntüye tıklayın 1454 click on image to set matching color 1454 eşleşen rengi ayarlamak için görüntüye tıklayın 1455 click on thumbnail to set zoom center 1455 zoom merkezini ayarlamak için thumbnail'e tıklayın 1456 click position to add line 1456 çizgi eklemek için konuma tıklayın 1457 click position to add text 1457 metin eklemek için konuma tıklayın 1458 click to select 1458 seçmek için tıklayın 1459 click to unselect 1459 seçimi kaldırmak için tıklayın 1460 clicks per 2x image increase 1460 2x görüntü artışı başına tıklama 1461 color 1461 renk 1462 color depth 1462 renk derinliği 1463 color depth: 1463 renk derinliği: 1464 color match level % 1464 renk eşleşme seviyesi % 1465 color negative 1465 renkli negatif 1466 column difference: %d pixels 1466 sütun farkı: %d piksel 1467 column difference: %d pixels \nMake columns even? 1467 sütun farkı: %d piksel \nSütunlar eşitlensin mi? 1468 combined image files 1468 birleştirilmiş görüntü dosyaları 1469 command: 1469 komut: 1470 commit all changes, close dialog 1470 tüm değişiklikleri onayla, iletişim kutusunu kapat 1471 complete file selection first 1471 önce dosya seçimini tamamlayın 1472 completed 1472 tamamlandı 1473 condense into color blobs 1473 renk lekelerine yoğunlaştır 1474 condition 1474 koşul 1475 confirm Fotocx exit 1475 Fotocx'ten çıkışı onayla 1476 constant blur 1476 sabit bulanıklık 1477 continue? 1477 devam edilsin mi? 1478 converting colors... 1478 renkler dönüştürülüyor... 1479 converting files 1479 dosyalar dönüştürülüyor 1480 copy (duplicate file) 1480 kopyala (dosyayı çoğalt) 1481 copy and paste commands 1481 kopyala ve yapıştır komutları 1482 copy files to %s 1482 dosyaları %s konumuna kopyala 1483 copy metadata from Nth file: 1483 N. dosyadan metadata'yı kopyala: 1484 copy to Desktop failed: %s 1484 Masaüstüne kopyalama başarısız: %s 1485 count: 0 1485 sayı: 0 1486 create folder 1486 klasör oluştur 1487 create folder %s 1487 %s klasörünü oluştur 1488 current gallery 1488 geçerli galeri 1489 current image files found: %d \n 1489 bulunan geçerli görüntü dosyaları: %d \n 1490 current set only 1490 yalnızca geçerli küme 1491 current set: 1491 geçerli küme: 1492 curve file is invalid 1492 eğri dosyası geçersiz 1493 custom command to play video files 1493 video dosyalarını oynatmak için özel komut 1494 dark 1494 koyu 1495 dark halo 1495 koyu hale 1496 dark pixels 1496 koyu pikseller 1497 data is incomplete, proceed? 1497 veri eksik, devam edilsin mi? 1498 date format is yyyy:mm:dd [hh:mm:ss] 1498 tarih biçimi yyyy:mm:dd [hh:mm:ss] 1499 date range 1499 tarih aralığı 1500 days 1500 gün 1501 delete 1501 sil 1502 delete %s \n%s 1502 sil %s \n%s 1503 delete Mashup project files? 1503 Mashup proje dosyaları silinsin mi? 1504 delete failed: \n%s 1504 silme başarısız: \n%s 1505 delete originals specified but no new name given 1505 orijinalleri sil belirtildi ancak yeni ad verilmedi 1506 delete selected text from layout 1506 seçili metni düzenden sil 1507 deleting orphan thumbnails ... \n 1507 sahipsiz thumbnail'ler siliniyor ... \n 1508 depth 1508 derinlik 1509 descending 1509 azalan 1510 direction of light and shadows 1510 ışık ve gölge yönü 1511 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1511 açılır menüleri vb. etkinleştirmek için thumbnail seçimini devre dışı bırak \nthumbnail seçimine devam etmek için [Etkinleştir] kullanın 1512 discard changes? 1512 değişiklikler atılsın mı? 1513 do not warp images during auto-alignment 1513 otomatik hizalama sırasında görüntüleri çarpıtma 1514 do nothing 1514 hiçbir şey yapma 1515 dot size 1515 nokta boyutu 1516 downsize 1516 küçült 1517 drag image 1517 görüntüyü sürükle 1518 drag mouse along an edge to follow the edge 1518 kenarı takip etmek için kenar boyunca fareyi sürükleyin 1519 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1519 oval çizmek için fareyi aşağı/sağa sürükleyin \novali taşımak için shift + merkezi sürükleyin \ndeğiştirmek için shift + sağ alt kenarı sürükleyin 1520 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1520 kutu çizmek için fareyi sürükleyin \nkutuyu taşımak için shift + merkezi sürükleyin \nkenarı taşımak için shift + kenarı sürükleyin 1521 drag mouse to outline an area 1521 bir alanın ana hattını çizmek için fareyi sürükleyin 1522 drag mouse to select circular or elliptical area 1522 dairesel veya eliptik alan seçmek için fareyi sürükleyin 1523 drag mouse to select rectangular area 1523 dikdörtgen alan seçmek için fareyi sürükleyin 1524 drag mouse to show selected image 1524 seçili görüntüyü göstermek için fareyi sürükleyin 1525 duplicate keyword 1525 yinelenen keyword 1526 edge distance calculation 1526 kenar mesafesi hesaplaması 1527 edge: 1527 kenar: 1528 edit 1528 düzenle 1529 edit commands 1529 komutları düzenle 1530 edit custom shell commands, match colors to embedded jpeg image 1530 özel kabuk komutlarını düzenle, renkleri gömülü jpeg görüntüsüyle eşleştir 1531 edit this menu 1531 bu menüyü düzenle 1532 ellipse 1532 elips 1533 embedded numbers will sort by value 1533 gömülü sayılar değere göre sıralanır 1534 emboss 1534 kabart 1535 enter 2-character language code: en, de, fr ... 1535 2 karakterli dil kodu girin: en, de, fr ... 1536 enter a project name 1536 bir proje adı girin 1537 enter an album name 1537 bir albüm adı girin 1538 enter cities/locations, countries 1538 şehirler/konumlar, ülkeler girin 1539 enter project name 1539 proje adı girin 1540 enter tag name 1540 tag adı girin 1541 enter tag names 1541 tag adları girin 1542 erase 1542 sil 1543 error compensation 1543 hata telafisi 1544 exceed %d edits 1544 %d düzenlemeyi aşıyor 1545 exceed %d images 1545 %d görüntüyü aşıyor 1546 exceed %d max files, cannot continue 1546 %d maksimum dosyayı aşıyor, devam edilemiyor 1547 exceed %d rows 1547 %d satırı aşıyor 1548 exceed %d selected files 1548 %d seçili dosyayı aşıyor 1549 exceed %d shortcuts 1549 %d kısayolu aşıyor 1550 exceeded %d line entries 1550 %d satır girişini aştı 1551 exceeded %d text entries 1551 %d metin girişini aştı 1552 exceeded max. images: %d 1552 maks. görüntü sayısını aştı: %d 1553 exceeded max. tiles: %d 1553 maks. karo sayısını aştı: %d 1554 exit split-screen 1554 bölünmüş ekrandan çık 1555 expand to these limits if smaller 1555 daha küçükse bu sınırlara genişlet 1556 exporting files 1556 dosyalar dışa aktarılıyor 1557 extra indexed metadata tags > %d 1557 ekstra dizinlenmiş metadata tag'i > %d 1558 extra metadata tags to include in index 1558 dizine dahil edilecek ekstra metadata tag'leri 1559 extra metadata tags: \n 1559 ekstra metadata tag'leri: \n 1560 fetch 1560 getir 1561 file 1561 dosya 1562 file .ext names to recognize RAW files 1562 RAW dosyalarını tanımak için dosya .ext adları 1563 file .ext names to recognize video files 1563 video dosyalarını tanımak için dosya .ext adları 1564 file close error 1564 dosya kapatma hatası 1565 file color 1565 dosya rengi 1566 file error: %s 1566 dosya hatası: %s 1567 file format error 1567 dosya biçimi hatası 1568 file format error: %s 1568 dosya biçimi hatası: %s 1569 file included: %s \n 1569 dosya dahil edildi: %s \n 1570 file metadata update failed 1570 dosya metadata güncellemesi başarısız 1571 file name 1571 dosya adı 1572 file names 1572 dosya adları 1573 file not found 1573 dosya bulunamadı 1574 file not found \n 1574 dosya bulunamadı \n 1575 file not found: %s 1575 dosya bulunamadı: %s 1576 file not found: %s %s 1576 dosya bulunamadı: %s %s 1577 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1577 dosya türleri: .jp2 .heic .avif .webp \nşuna dönüşecek: .jpg - DEVAM EDİLSİN Mİ? 1578 file: %s \nexceed 99 versions 1578 dosya: %s \n99 sürümü aşıyor 1579 filename text 1579 dosya adı metni 1580 files in %s can be deleted 1580 %s içindeki dosyalar silinebilir 1581 fill from current gallery 1581 geçerli galeriden doldur 1582 fill from selected files 1582 seçili dosyalardan doldur 1583 fill selected areas 1583 seçili alanları doldur 1584 fill transparent areas 1584 saydam alanları doldur 1585 find all image files ...\n 1585 tüm görüntü dosyalarını bul ...\n 1586 find and report all unreadable image files 1586 okunamayan tüm görüntü dosyalarını bul ve raporla 1587 find outline gap 1587 taslak boşluğu bul 1588 find via table lookup 1588 tablo araması ile bul 1589 find_imagefiles() failure \n 1589 find_imagefiles() hatası \n 1590 find_imagefiles() failure: %s \n 1590 find_imagefiles() hatası: %s \n 1591 finish current edit first 1591 önce geçerli düzenlemeyi bitirin 1592 finish making a script file 1592 bir betik dosyası oluşturmayı bitir 1593 finish or cancel pending edit 1593 bekleyen düzenlemeyi bitir veya iptal et 1594 fix box in layout and start new box 1594 düzendeki kutuyu sabitle ve yeni bir kutu başlat 1595 fix line in layout and start new line 1595 düzendeki çizgiyi sabitle ve yeni bir çizgi başlat 1596 fix motion blur 1596 hareket bulanıklığını düzelt 1597 fix oval in layout and start new oval 1597 düzendeki ovali sabitle ve yeni bir oval başlat 1598 follow edge 1598 kenarı takip et 1599 font name and size for menus and dilogs 1599 menüler ve iletişim kutuları için yazı tipi adı ve boyutu 1600 force a full re-index of all image files 1600 tüm görüntü dosyalarının tam yeniden dizinlenmesini zorla 1601 format: yyyy:mm:dd [hh:mm:ss] 1601 biçim: yyyy:mm:dd [hh:mm:ss] 1602 fotocx will exit 1602 fotocx kapanacak 1603 found %d pixels 1603 %d piksel bulundu 1604 free disk space: %d GB \n 1604 boş disk alanı: %d GB \n 1605 freehand draw 1605 serbest el çizimi 1606 ftruncate() failure: %s 1606 ftruncate() hatası: %s 1607 full image index: reports will be complete \n 1607 tam görüntü dizini: raporlar eksiksiz olacak \n 1608 function canceled 1608 işlev iptal edildi 1609 gallery 1609 galeri 1610 gallery is empty 1610 galeri boş 1611 gallery truncated to %d images 1611 galeri %d görüntüyle sınırlandırıldı 1612 get images having text in filename (comma separated) 1612 dosya adında metin içeren görüntüleri getir (virgülle ayrılmış) 1613 get images with matching keywords (comma separated) 1613 eşleşen keyword'lere sahip görüntüleri getir (virgülle ayrılmış) 1614 get images within rating range 1614 derecelendirme aralığındaki görüntüleri getir 1615 gradual paint 1615 kademeli boyama 1616 grid counts not 0-100: %s 1616 ızgara sayıları 0-100 arasında değil: %s 1617 grid picklist file error: %s 1617 ızgara seçim listesi dosyası hatası: %s 1618 grid size 1618 ızgara boyutu 1619 group 1619 grup 1620 height 1620 yükseklik 1621 hide area outlines 1621 alan taslaklarını gizle 1622 hide transient objects 1622 geçici nesneleri gizle 1623 high 1623 yüksek 1624 home folder was not changed 1624 ana klasör değiştirilmedi 1625 horizontal 1625 yatay 1626 hours 1626 saat 1627 icons only, text only, or both 1627 yalnızca simgeler, yalnızca metin veya ikisi de 1628 if image < window, center or shift left or right 1628 görüntü < pencere ise, ortala veya sola/sağa kaydır 1629 ignore differences above limit 1629 sınırın üzerindeki farkları yok say 1630 image blend 1630 görüntü karıştırma 1631 image files 1631 görüntü dosyaları 1632 image for source color 1632 kaynak renk için görüntü 1633 image index records found: %d \n 1633 bulunan görüntü dizini kayıtları: %d \n 1634 image index required 1634 görüntü dizini gerekli 1635 image index write error: %s 1635 görüntü dizini yazma hatası: %s 1636 image is too large to edit: %d x %d 1636 görüntü düzenlemek için çok büyük: %d x %d 1637 image is too large: %dx%d, %lld megapix 1637 görüntü çok büyük: %dx%d, %lld megapiksel 1638 image is too small to edit: %d x %d 1638 görüntü düzenlemek için çok küçük: %d x %d 1639 image scale 1639 görüntü ölçeği 1640 image to set matching color 1640 eşleşen rengi ayarlamak için görüntü 1641 image width must be greater than height 1641 görüntü genişliği yükseklikten büyük olmalı 1642 images to report 1642 raporlanacak görüntüler 1643 include all files 1643 tüm dosyaları dahil et 1644 include edited versions 1644 düzenlenmiş sürümleri dahil et 1645 include last versions only 1645 yalnızca son sürümleri dahil et 1646 include original files 1646 orijinal dosyaları dahil et 1647 include transparent areas 1647 saydam alanları dahil et 1648 include: 1648 dahil et: 1649 increase blur with distance 1649 mesafeyle birlikte bulanıklığı artır 1650 index completed, %.1f seconds \n 1650 dizinleme tamamlandı, %.1f saniye \n 1651 index config file error: %s 1651 dizin yapılandırma dosyası hatası: %s 1652 index updates needed: %d thumbnails: %d \n 1652 gerekli dizin güncellemeleri: %d thumbnail: %d \n 1653 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1653 dizin güncellemeleri: %d başlık/açıklama güncellemesi: %d \nthumbnail güncellemesi: %d, silme: %d \n 1654 input 1654 girdi 1655 input file: %s \n 1655 girdi dosyası: %s \n 1656 insufficient memory, cannot proceed 1656 yetersiz bellek, devam edilemiyor 1657 insufficient overlap for color matching 1657 renk eşleştirme için yetersiz çakışma 1658 invalid GPS data 1658 geçersiz GPS verisi 1659 invalid GPS data: %s 1659 geçersiz GPS verisi: %s 1660 invalid album 1660 geçersiz albüm 1661 invalid date range: %s %s 1661 geçersiz tarih aralığı: %s %s 1662 invalid date/time format 1662 geçersiz tarih/saat biçimi 1663 invalid file 1663 geçersiz dosya 1664 invalid plugin: %s 1664 geçersiz eklenti: %s 1665 invalid rating range 1665 geçersiz derecelendirme aralığı 1666 invalid source file: %s 1666 geçersiz kaynak dosya: %s 1667 invert area 1667 alanı tersine çevir 1668 jpeg quality level - 70+ for good image quality 1668 jpeg kalite seviyesi - iyi görüntü kalitesi için 70+ 1669 keyboard 1669 klavye 1670 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1670 klavye kontrolleri: \nEsc: çalışan slayt gösterisinden çık \nok tuşları: önceki/sonraki görüntü \nB: pencereyi karart/aydınlat \nN: sonraki görüntüye geçiş \nP: duraklat/devam et \nX: fare konumunda büyüt 1671 keyword names 1671 keyword adları 1672 keywords to add 1672 eklenecek keyword'ler 1673 keywords to remove 1673 kaldırılacak keyword'ler 1674 keywords_defined file error: %s 1674 keywords_defined dosyası hatası: %s 1675 last search 1675 son arama 1676 last version 1676 son sürüm 1677 last versions 1677 son sürümler 1678 layout exceeds 4 gigabytes 1678 düzen 4 gigabaytı aşıyor 1679 layout file missing: %s 1679 düzen dosyası eksik: %s 1680 left 1680 sol 1681 left click on image for selected color 1681 seçili renk için görüntüye sol tıklayın 1682 left click: set image source location \nright click: set corresponding destination 1682 sol tık: görüntü kaynak konumunu ayarla \nsağ tık: karşılık gelen hedefi ayarla 1683 left drag: add transparency \nright drag: add opacity 1683 sol sürükle: saydamlık ekle \nsağ sürükle: opaklık ekle 1684 left drag: copy image to mouse position \nright drag: restore original image 1684 sol sürükle: görüntüyü fare konumuna kopyala \nsağ sürükle: orijinal görüntüyü geri yükle 1685 left drag: reduce halo, right drag: undo 1685 sol sürükle: haleyi azalt, sağ sürükle: geri al 1686 lens mm 1686 lens mm 1687 level based on EXIF roll angle 1687 EXIF döndürme açısına göre düzeltilmiş 1688 light 1688 açık 1689 light pixels 1689 açık pikseller 1690 line 1690 çizgi 1691 line color 1691 çizgi rengi 1692 line width 1692 çizgi genişliği 1693 load 1693 yükle 1694 load text data from a file 1694 bir dosyadan metin verisi yükle 1695 load widgets failed: %s 1695 bileşenler yüklenemedi: %s 1696 loading palette ... 1696 palet yükleniyor ... 1697 location is not a folder 1697 konum bir klasör değil 1698 locations 1698 konumlar 1699 lock width/height ratio 1699 genişlik/yükseklik oranını kilitle 1700 log file is in a terminal 1700 günlük dosyası bir terminalde 1701 low 1701 düşük 1702 low contrast 1702 düşük kontrast 1703 lower 1703 alt 1704 make an initially empty album 1704 başlangıçta boş bir albüm oluştur 1705 make new version 1705 yeni sürüm oluştur 1706 manual align 1706 elle hizala 1707 map marker (red dot) diameter, pixels 1707 harita işaretçisi (kırmızı nokta) çapı, piksel 1708 map selected areas and verify 1708 seçili alanları haritalandır ve doğrula 1709 mashup project 1709 mashup projesi 1710 match embedded image color 1710 gömülü görüntü rengini eşleştir 1711 match image color to base image (repeat) 1711 görüntü rengini taban görüntüyle eşleştir (tekrar et) 1712 match values 1712 değerleri eşleştir 1713 matches 1713 eşleşmeler 1714 max keywords exceeded 1714 maksimum keyword sayısı aşıldı 1715 max. Width 1715 maks. Genişlik 1716 max. album count exceeded: %d 1716 maks. albüm sayısı aşıldı: %d 1717 max. album files reached, results truncated 1717 maks. albüm dosyası sayısına ulaşıldı, sonuçlar kısaltıldı 1718 max. album size exceeded: %d 1718 maks. albüm boyutu aşıldı: %d 1719 max. blur radius 1719 maks. bulanıklık yarıçapı 1720 max. brightness 1720 maks. parlaklık 1721 max. image limit reached: %d 1721 maks. görüntü sınırına ulaşıldı: %d 1722 max. width or height is not reasonable 1722 maks. genişlik veya yükseklik mantıklı değil 1723 maximum clip allowed to fit window 1723 pencereye sığdırmak için izin verilen maksimum kırpma 1724 mean RGB: %5.0f %5.0f %5.0f 1724 ortalama RGB: %5.0f %5.0f %5.0f 1725 mean noise: %5.2f %5.2f %5.2f 1725 ortalama gürültü: %5.2f %5.2f %5.2f 1726 median 1726 medyan 1727 median diff 1727 medyan farkı 1728 menu text and background colors 1728 menü metni ve arka plan renkleri 1729 metadata 1729 metadata 1730 metadata copy failed 1730 metadata kopyalama başarısız 1731 metadata from Search Function, metadata report 1731 Arama İşlevinden metadata, metadata raporu 1732 metadata picklist file not found %s 1732 metadata seçim listesi dosyası bulunamadı %s 1733 metadata tags to report 1733 raporlanacak metadata tag'leri 1734 metadata update error 1734 metadata güncelleme hatası 1735 metadata update error \n 1735 metadata güncelleme hatası \n 1736 metadata update error: %s 1736 metadata güncelleme hatası: %s 1737 metadata update failed \n 1737 metadata güncellemesi başarısız \n 1738 min. blur radius 1738 min. bulanıklık yarıçapı 1739 min. contrast 1739 min. kontrast 1740 min. edit curve node separation, % of scale length 1740 min. düzenleme eğrisi düğüm ayrımı, ölçek uzunluğunun %'si 1741 min. separation, %c of scale 1741 min. ayrım, ölçeğin %c'si 1742 minutes 1742 dakika 1743 mmap() failure: %s 1743 mmap() hatası: %s 1744 months 1744 ay 1745 more than %d categories 1745 %d kategoriden fazla 1746 more than 20 matches 1746 20'den fazla eşleşme 1747 mouse radius 1747 fare yarıçapı 1748 mouse radius for color sample 1748 renk örneği için fare yarıçapı 1749 mouse radius: 1749 fare yarıçapı: 1750 move (delete original) 1750 taşı (orijinali sil) 1751 move area boundary in/out in 1-pixel steps 1751 alan sınırını 1 piksellik adımlarla içeri/dışarı taşı 1752 move to next input file 1752 sonraki girdi dosyasına geç 1753 move to trash failed \n 1753 çöpe taşıma başarısız \n 1754 move to trash failed: %s 1754 çöpe taşıma başarısız: %s 1755 multiply 1755 çarp 1756 must have 4 corners 1756 4 köşesi olmalı 1757 need numeric match value: %s 1757 sayısal eşleşme değeri gerekli: %s 1758 negative 1758 negatif 1759 new album created 1759 yeni albüm oluşturuldu 1760 new album name 1760 yeni albüm adı 1761 new file 1761 yeni dosya 1762 new file ... 1762 yeni dosya ... 1763 new file name is invalid 1763 yeni dosya adı geçersiz 1764 new file type 1764 yeni dosya türü 1765 new home folder contains a blank 1765 yeni ana klasör boşluk içeriyor 1766 new location 1766 yeni konum 1767 new location is not a folder 1767 yeni konum bir klasör değil 1768 new version 1768 yeni sürüm 1769 newest files 1769 en yeni dosyalar 1770 no EXIF orientation data 1770 EXIF yönlendirme verisi yok 1771 no active Select Area 1771 etkin Alan Seç yok 1772 no albums selected 1772 albüm seçilmedi 1773 no auto warp 1773 otomatik çarpıtma yok 1774 no change 1774 değişiklik yok 1775 no current album 1775 geçerli albüm yok 1776 no current edit image 1776 geçerli düzenleme görüntüsü yok 1777 no current file 1777 geçerli dosya yok 1778 no curve (scanned image) 1778 eğri yok (taranmış görüntü) 1779 no description 1779 açıklama yok 1780 no file selected 1780 dosya seçilmedi 1781 no files found 1781 dosya bulunamadı 1782 no files selected 1782 dosya seçilmedi 1783 no host files selected 1783 ana dosya seçilmedi 1784 no image index: reports disabled \n 1784 görüntü dizini yok: raporlar devre dışı \n 1785 no images 1785 görüntü yok 1786 no images found 1786 görüntü bulunamadı 1787 no input files available 1787 kullanılabilir girdi dosyası yok 1788 no matching files found 1788 eşleşen dosya bulunamadı 1789 no matching locations 1789 eşleşen konum yok 1790 no metadata level data 1790 metadata seviye verisi yok 1791 no metadata tags to report 1791 raporlanacak metadata tag'i yok 1792 no option selected 1792 seçenek seçilmedi 1793 no overlay file selected 1793 kaplama dosyası seçilmedi 1794 no photo date, skipped 1794 fotoğraf tarihi yok, atlandı 1795 no plugin output file found 1795 eklenti çıktı dosyası bulunamadı 1796 no prior edit 1796 önceki düzenleme yok 1797 no prior edit image 1797 önceki düzenleme görüntüsü yok 1798 no saved folders 1798 kaydedilmiş klasör yok 1799 no script file was started 1799 hiçbir betik dosyası başlatılmadı 1800 no script files found 1800 betik dosyası bulunamadı 1801 no select area 1801 alan seçimi yok 1802 no selection 1802 seçim yok 1803 no title 1803 başlık yok 1804 no write permission 1804 yazma izni yok 1805 no write permission \n 1805 yazma izni yok \n 1806 no write permission: %s 1806 yazma izni yok: %s 1807 none 1807 yok 1808 not a known image file 1808 bilinen bir görüntü dosyası değil 1809 not an image file 1809 bir görüntü dosyası değil 1810 not an indexed image file \n 1810 dizinlenmiş bir görüntü dosyası değil \n 1811 nothing found 1811 hiçbir şey bulunamadı 1812 nothing left, no change made 1812 hiçbir şey kalmadı, değişiklik yapılmadı 1813 old file 1813 eski dosya 1814 old image index: reports will omit new files \n 1814 eski görüntü dizini: raporlar yeni dosyaları içermeyecek \n 1815 old keyword name >> new keyword name 1815 eski keyword adı >> yeni keyword adı 1816 omit high pixel 1816 yüksek pikseli hariç tut 1817 omit low pixel 1817 düşük pikseli hariç tut 1818 only %d tile images found 1818 yalnızca %d karo görüntüsü bulundu 1819 opacity center 1819 opaklık merkezi 1820 opacity edge 1820 opaklık kenarı 1821 open album 1821 albüm aç 1822 open and process color chart 1822 renk çizelgesini aç ve işle 1823 open as new current file 1823 yeni geçerli dosya olarak aç 1824 optional deselect color 1824 isteğe bağlı seçimi kaldırma rengi 1825 original 1825 orijinal 1826 originals 1826 orijinaller 1827 other 1827 diğer 1828 out of space for temp files \nsave your edits and quit Fotocx 1828 geçici dosyalar için yer kalmadı \ndüzenlemelerinizi kaydedin ve Fotocx'ten çıkın 1829 outline 1829 ana hat 1830 output file exists 1830 çıktı dosyası mevcut 1831 output file exists, overwrite? 1831 çıktı dosyası mevcut, üzerine yazılsın mı? 1832 output file size change, cannot use select area 1832 çıktı dosyası boyutu değişti, alan seçimi kullanılamıyor 1833 output file: 1833 çıktı dosyası: 1834 output file: %s \n 1834 çıktı dosyası: %s \n 1835 oval 1835 oval 1836 overlay file missing: %s 1836 kaplama dosyası eksik: %s 1837 owner 1837 sahip 1838 paint 1838 boya 1839 paint color 1839 boya rengi 1840 paint edits cannot be used for this method 1840 boyalı düzenlemeler bu yöntem için kullanılamaz 1841 paint over transparent areas 1841 saydam alanların üzerine boya 1842 paint radius 1842 boya yarıçapı 1843 palette 1843 palet 1844 palette exceeds %d color limit 1844 palet %d renk sınırını aşıyor 1845 palette file 1845 palet dosyası 1846 palette has %d colors 1846 palet %d renge sahip 1847 palette loaded, %d colors 1847 palet yüklendi, %d renk 1848 palette: 1848 palet: 1849 patch area goal 1849 yama alanı hedefi 1850 percent 1850 yüzde 1851 perform edits to include in the script file 1851 betik dosyasına dahil edilecek düzenlemeleri gerçekleştirin 1852 permissions: 1852 izinler: 1853 perspective 1853 perspektif 1854 photo 1854 fotoğraf 1855 picklist file not found: %s 1855 seçim listesi dosyası bulunamadı: %s 1856 pixel = mean of best match neighbors 1856 piksel = en iyi eşleşen komşuların ortalaması 1857 pixel = median of all neighbors 1857 piksel = tüm komşuların medyanı 1858 please make a choice 1858 lütfen bir seçim yapın 1859 plugin command failed 1859 eklenti komutu başarısız 1860 plugin menu not found %s 1860 eklenti menüsü bulunamadı %s 1861 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1861 eklentiler: (yıl ay gün eski-ad sıra) $yyyy $mm $dd $oldname $s 1862 popup_choose: empty list 1862 popup_choose: boş liste 1863 position with mouse click/drag 1863 fare tıklaması/sürüklemesiyle konumlandır 1864 position: 50 50 1864 konum: 50 50 1865 position: x=%02d y=%02d 1865 konum: x=%02d y=%02d 1866 power 1866 güç 1867 power center 1867 güç merkezi 1868 power edge 1868 güç kenarı 1869 power: center 1869 güç: merkez 1870 pref 1870 tercih 1871 previous file 1871 önceki dosya 1872 previous name 1872 önceki ad 1873 print color chart 1873 renk çizelgesini yazdır 1874 print select area(s) only? 1874 yalnızca seçili alan(lar) yazdırılsın mı? 1875 prior edit step 1875 önceki düzenleme adımı 1876 project complete 1876 proje tamamlandı 1877 project file is defective 1877 proje dosyası bozuk 1878 project name cannot have quote characters 1878 proje adında tırnak karakteri bulunamaz 1879 pure RGB or black/white dots 1879 saf RGB veya siyah/beyaz noktalar 1880 quality 1880 kalite 1881 quality level (70+) 1881 kalite seviyesi (70+) 1882 radius 1882 yarıçap 1883 radius: 1883 yarıçap: 1884 random 1884 rastgele 1885 random position 1885 rastgele konum 1886 rating range 1886 derecelendirme aralığı 1887 reading image index file ...\n 1887 görüntü dizini dosyası okunuyor ...\n 1888 recent files 1888 son dosyalar 1889 reduce bright 1889 parlaklığı azalt 1890 reduce dark 1890 koyuluğu azalt 1891 reduce to these limits if larger 1891 daha büyükse bu sınırlara küçült 1892 refresh 1892 yenile 1893 remove %d duplicates? 1893 %d yinelenen kaldırılsın mı? 1894 remove all files in list 1894 listedeki tüm dosyaları kaldır 1895 remove duplicate 1895 yinelenenleri kaldır 1896 remove from set 1896 kümeden kaldır 1897 remove panorama image curving 1897 panorama görüntü eğriliğini kaldır 1898 remove selected file from list 1898 seçili dosyayı listeden kaldır 1899 rename keywords 1899 keyword'leri yeniden adlandır 1900 repair metadata for %s 1900 %s için metadata'yı onar 1901 replace 1901 değiştir 1902 replace album %s ? 1902 %s albümü değiştirilsin mi? 1903 replace file 1903 dosyayı değiştir 1904 replace old 1904 eskiyi değiştir 1905 replace old file (OVERWRITE) 1905 eski dosyayı değiştir (ÜZERİNE YAZ) 1906 replace substring within file name 1906 dosya adı içinde alt dizeyi değiştir 1907 report type: 1907 rapor türü: 1908 req. color match 1908 gerekli renk eşleşmesi 1909 reset 1909 sıfırla 1910 resolution 1910 çözünürlük 1911 resume from current image 1911 geçerli görüntüden devam et 1912 right 1912 sağ 1913 right click on image for deselected color 1913 seçimi kaldırılan renk için görüntüye sağ tıklayın 1914 sample % 1914 örnek % 1915 save 1915 kaydet 1916 save Mashup output file 1916 Mashup çıktı dosyasını kaydet 1917 save Mashup project? 1917 Mashup projesi kaydedilsin mi? 1918 save area as a PNG file 1918 alanı PNG dosyası olarak kaydet 1919 save as new file name or type 1919 yeni dosya adı veya türü olarak kaydet 1920 save as new file version 1920 yeni dosya sürümü olarak kaydet 1921 save edit, start new text 1921 düzenlemeyi kaydet, yeni metne başla 1922 save metadata to image file 1922 metadata'yı görüntü dosyasına kaydet 1923 save text data to a file 1923 metin verisini bir dosyaya kaydet 1924 save to .heic/.avif file not supported 1924 .heic/.avif dosyasına kaydetme desteklenmiyor 1925 save to .jp2 file not supported 1925 .jp2 dosyasına kaydetme desteklenmiyor 1926 save to .webp file not supported 1926 .webp dosyasına kaydetme desteklenmiyor 1927 scan and save color chart 1927 renk çizelgesini tara ve kaydet 1928 scanned color chart file 1928 taranmış renk çizelgesi dosyası 1929 scope of neighbor pixels 1929 komşu piksel kapsamı 1930 script already started 1930 betik zaten başlatıldı 1931 script complete 1931 betik tamamlandı 1932 script error: %s, %s 1932 betik hatası: %s, %s 1933 script file closed 1933 betik dosyası kapatıldı 1934 script file error 1934 betik dosyası hatası 1935 script file format error: %s 1935 betik dosyası biçim hatası: %s 1936 script file name too big 1936 betik dosyası adı çok büyük 1937 script file to run 1937 çalıştırılacak betik dosyası 1938 search for names in image location metadata 1938 görüntü konum metadata'sında ad ara 1939 search for text within file folders or file name 1939 dosya klasörleri veya dosya adı içinde metin ara 1940 search for text within image title or description 1940 görüntü başlığı veya açıklaması içinde metin ara 1941 search known locations 1941 bilinen konumları ara 1942 search range 1942 arama aralığı 1943 search: 1943 ara: 1944 seconds 1944 saniye 1945 seconds to show with text 1945 metinle gösterme süresi (saniye) 1946 seconds to show without text 1946 metinsiz gösterme süresi (saniye) 1947 select all 1947 tümünü seç 1948 select all colors within mouse (flood) 1948 fare içindeki tüm renkleri seç (dolgu) 1949 select area missing or not finished 1949 alan seçimi eksik veya tamamlanmadı 1950 select area within mouse 1950 fare içindeki alanı seç 1951 select area within mouse circle 1951 fare dairesi içindeki alanı seç 1952 select base image for color matching 1952 renk eşleştirme için taban görüntü seç 1953 select by color, required match level 1953 renge göre seç, gerekli eşleşme seviyesi 1954 select by color, search range 1954 renge göre seç, arama aralığı 1955 select font 1955 yazı tipi seç 1956 select image to show with mouse paint 1956 fareyle boyarken gösterilecek görüntüyü seç 1957 select images randomly 1957 görüntüleri rastgele seç 1958 select initial files 1958 başlangıç dosyalarını seç 1959 select line color 1959 çizgi rengini seç 1960 select one color within mouse 1960 fare içinde tek bir renk seç 1961 select rectangle 1961 dikdörtgen seç 1962 select source image color first 1962 önce kaynak görüntü rengini seçin 1963 select surrounding areas matching colors in mouse 1963 fare içindeki renklerle eşleşen çevre alanları seç 1964 selection exceeds %d tags 1964 seçim %d tag'i aşıyor 1965 sepia 1965 sepya 1966 set a new date/time: 1966 yeni bir tarih/saat belirle: 1967 set all 1967 tümünü ayarla 1968 set current window size 1968 geçerli pencere boyutunu ayarla 1969 set image color from input files 1969 görüntü rengini girdi dosyalarından ayarla 1970 set location from world map 1970 dünya haritasından konumu ayarla 1971 set maximum crop 1971 maksimum kırpmayı ayarla 1972 shadow 1972 gölge 1973 shell command used for converting RAW files to RGB 1973 RAW dosyalarını RGB'ye dönüştürmek için kullanılan kabuk komutu 1974 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1974 shift + sol tık: görüntüden renk seç \nsol sürükle: görüntü üzerine renk boya \nsağ sürükle: orijinal görüntüyü geri yükle 1975 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1975 shift + sol tık: kopyalama konumunu senkronize et \nsol sürükle: kaynak görüntüyü fareye kopyala \nsağ sürükle: orijinal görüntüyü geri yükle 1976 shift existing date/time (+/–): 1976 mevcut tarihi/saati kaydır (+/–): 1977 shift+click on image to select color 1977 renk seçmek için görüntüye shift+tıklayın 1978 shortcut function not found: %s 1978 kısayol işlevi bulunamadı: %s 1979 shortcut key: 1979 kısayol tuşu: 1980 shortcut not found: %s 1980 kısayol bulunamadı: %s 1981 show area outlines 1981 alan taslaklarını göster 1982 show hidden files and folders 1982 gizli dosyaları ve klasörleri göster 1983 show transient objects 1983 geçici nesneleri göster 1984 size of mouse selection circle 1984 fare seçim dairesinin boyutu 1985 smooth 1985 yumuşak 1986 source file: 1986 kaynak dosya: 1987 source image failure (scale too big?) 1987 kaynak görüntü hatası (ölçek çok mu büyük?) 1988 source image scale 1988 kaynak görüntü ölçeği 1989 specify a thumbnail folder 1989 bir thumbnail klasörü belirtin 1990 specify at least 1 top image folder 1990 en az 1 üst görüntü klasörü belirtin 1991 specify background size and color 1991 arka plan boyutunu ve rengini belirtin 1992 specify files and keywords 1992 dosyaları ve keyword'leri belirtin 1993 spot size limit 1993 nokta boyutu sınırı 1994 start 1994 başlat 1995 start a new script file 1995 yeni bir betik dosyası başlat 1996 start album 1996 albüm başlat 1997 start blob condensation process 1997 leke yoğunlaştırma işlemini başlat 1998 start file 1998 başlangıç dosyası 1999 start folder 1999 başlangıç klasörü 2000 start from first image in album 2000 albümdeki ilk görüntüden başla 2001 start fusion process 2001 füzyon işlemini başlat 2002 start over at end of album 2002 albüm sonunda baştan başla 2003 start warp 2003 çarpıtmayı başlat 2004 start with previous image file, gallery of recent files, etc. 2004 önceki görüntü dosyası, son dosyalar galerisi vb. ile başla 2005 startup album is invalid 2005 başlangıç albümü geçersiz 2006 startup file is invalid 2006 başlangıç dosyası geçersiz 2007 startup folder is invalid 2007 başlangıç klasörü geçersiz 2008 status: %s \n 2008 durum: %s \n 2009 status: completed \n 2009 durum: tamamlandı \n 2010 stay open 2010 açık kalsın 2011 step 2011 adım 2012 stop 2012 durdur 2013 stop blob condensation process 2013 leke yoğunlaştırma işlemini durdur 2014 stop fusion process 2014 füzyon işlemini durdur 2015 supply a file name 2015 bir dosya adı belirtin 2016 tag name 2016 tag adı 2017 tag name %s not in xmeta tag list 2017 %s tag adı xmeta tag listesinde yok 2018 tag value 2018 tag değeri 2019 target file: 2019 hedef dosya: 2020 template 2020 şablon 2021 test: show changes, do not update files 2021 test: değişiklikleri göster, dosyaları güncelleme 2022 text 2022 metin 2023 text file is defective 2023 metin dosyası bozuk 2024 text time 2024 metin saati 2025 this function cannot be scripted 2025 bu işlev betikle çalıştırılamaz 2026 thumbnail file 2026 thumbnail dosyası 2027 thumbnails deleted: %d \n 2027 silinen thumbnail sayısı: %d \n 2028 thumbnails folder: %s \n 2028 thumbnails klasörü: %s \n 2029 tile area goal 2029 karo alanı hedefi 2030 tile gap 2030 karo boşluğu 2031 tile size 2031 karo boyutu 2032 time 2032 zaman 2033 title/desc. 2033 başlık/açıkl. 2034 to add images to current set, \nsearch all images 2034 geçerli kümeye görüntü eklemek için, \ntüm görüntülerde ara 2035 to remove images from current set, \nsearch current set 2035 geçerli kümeden görüntü kaldırmak için, \ngeçerli kümede ara 2036 too many categories 2036 çok fazla kategori 2037 too many files, cannot continue 2037 çok fazla dosya, devam edilemiyor 2038 too many keywords in a category 2038 bir kategoride çok fazla keyword var 2039 top image folders: \n 2039 üst görüntü klasörleri: \n 2040 transition 2040 geçiş 2041 transitions 2041 geçişler 2042 trash 2042 çöp 2043 trimmed color chart file 2043 kesilmiş renk çizelgesi dosyası 2044 unable to save bookmarks file 2044 yer imleri dosyası kaydedilemiyor 2045 unknown edit function: %s 2045 bilinmeyen düzenleme işlevi: %s 2046 unknown file type 2046 bilinmeyen dosya türü 2047 unknown or empty album: %s 2047 bilinmeyen veya boş albüm: %s 2048 unsharp mask 2048 keskinleştirme maskesi 2049 update 2049 güncelle 2050 updating albums ...\n 2050 albümler güncelleniyor ...\n 2051 upper 2051 üst 2052 upsize 2052 büyüt 2053 use 2053 kullan 2054 use a saved Mashup project 2054 kaydedilmiş bir Mashup projesi kullan 2055 use average 2055 ortalamayı kullan 2056 use custom color palette 2056 özel renk paleti kullan 2057 use median 2057 medyanı kullan 2058 use option to stop accidental quit 2058 kazara çıkışı durdurmak için seçeneği kullan 2059 use previous input 2059 önceki girdiyi kullan 2060 use previous location 2060 önceki konumu kullan 2061 use prior edit step: 2061 önceki düzenleme adımını kullan: 2062 use the current image file 2062 geçerli görüntü dosyasını kullan 2063 variance 2063 varyans 2064 versions 2064 sürümler 2065 vertical 2065 dikey 2066 video files not supported (install ffmpeg) 2066 video dosyaları desteklenmiyor (ffmpeg yükleyin) 2067 view album 2067 albümü görüntüle 2068 waiting 2068 bekleniyor 2069 warp 2069 çarpıt 2070 warp and align selected image with mouse drags 2070 fareyle sürükleyerek seçili görüntüyü çarpıt ve hizala 2071 warp and fine-align selected image with neighbor 2071 komşuyla seçili görüntüyü çarpıt ve ince hizala 2072 warp span 2072 çarpıtma aralığı 2073 wavelength 2073 dalga boyu 2074 width 2074 genişlik 2075 writing updated image index file \n 2075 güncellenmiş görüntü dizini dosyası yazılıyor \n 2076 x-count 2076 x-sayısı 2077 x-offset 2077 x-uzaklığı 2078 y-count 2078 y-sayısı 2079 y-offset 2079 y-uzaklığı 2080 years 2080 yıl 2081 you can close this window now \n 2081 bu pencereyi şimdi kapatabilirsiniz \n 2082 you cannot use new name and replace text together 2082 yeni ad ve metin değiştirmeyi birlikte kullanamazsınız 2083 you must use either $s or $oldname 2083 $s veya $oldname'den birini kullanmalısınız 2084 zoom image 2084 görüntüyü yakınlaştır 2085 zoom via mouse wheel or Keys +/=/-/↑/↓ 2085 fare tekerleği veya +/=/-/↑/↓ tuşlarıyla zoom yap 2086 zoom-in 2086 yakınlaştır 2087 zoom-out 2087 uzaklaştır fotocx/data/translations/gui_pl0000664000175000017500000036645515247006657015715 0ustar micomico0000 + Zoom-in \n 0000 + Zoom-in \n 0001 - Zoom-out \n 0001 - Zoom-out \n 0002 = Zoom-in \n 0002 = Zoom-in \n 0003 Arrow keys Previous/Next file \n 0003 Strzałki Poprzedni/następny plik \n 0004 Delete Delete/Trash file \n 0004 Delete Usuń/Kosz plik \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Escape Zamknij okno / Zamknij Fotocx \n 0006 F1 User Guide, Context Help \n 0006 F1 Podręcznik użytkownika, pomoc kontekstowa \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 Pełny ekran / bez menu \n 0008 Home/End Gallery start/end \n 0008 Home/End Początek/koniec galerii \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 Czas indeksowania zależy od liczby, typu i rozmiaru \n plików obrazów oraz szybkości komputera. Może to trwać \n od kilkuset do ponad 10 tysięcy na minutę. \n Opcje indeksowania można później zmienić w tych menu: \n Narzędzia > Indeks, Narzędzia > Ustawienia. \n 0010 Page keys Gallery page up/down \n 0010 Page keys Strona galerii w górę/w dół \n 0011 Z 1x <--> fit to window \n 0011 Z 1x <--> dopasuj do okna \n 0012 $s plugin needs base and adder 0012 wtyczka $s wymaga base i adder 0013 % from left: 0013 % od lewej: 0014 % from top: 0014 % od góry: 0015 %d albums selected 0015 %d albumów wybranych 0016 %d image files selected 0016 %d plików obrazów wybranych 0017 %d images 0017 %d obrazów 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 %d keywords do usunięcia \nw %d plikach obrazów. \nKontynuować? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 %d keywords do zmiany nazwy \nw %d plikach obrazów. \nKontynuować? 0020 %d max images exceeded 0020 Przekroczono maksymalną liczbę %d obrazów 0021 %d red-eye limit reached 0021 Osiągnięto limit czerwonych oczu %d 0022 %s %s %d folders %d files 0022 %s %s %d folderów %d plików 0023 %s *** date/time conversion failed \n 0023 %s *** konwersja daty/czasu nie powiodła się \n 0024 %s ALBUM %s %d files 0024 %s ALBUM %s %d plików 0025 %s NEWEST FILES 0025 %s NAJNOWSZE PLIKI 0026 %s RECENT FILES 0026 %s OSTATNIE PLIKI 0027 %s SEARCH RESULTS %d files 0027 %s WYNIKI WYSZUKIWANIA %d plików 0028 %s UNKNOWN 0028 %s NIEZNANY 0029 %s added to script 0029 %s dodano do skryptu 0030 %s is already indexed 0030 %s jest już zindeksowany 0031 %s renamed: %s 0031 %s zmieniono nazwę: %s 0032 %s: metadata update failed 0032 %s: aktualizacja metadata nie powiodła się 0033 %s: no write permission 0033 %s: brak uprawnień do zapisu 0034 %s: reserved, cannot be used 0034 %s: zarezerwowane, nie można użyć 0035 %s: too many keywords 0035 %s: zbyt wiele keywords 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\nData zdjęcia: %s Data pliku: %s \nOcena: %s Rozmiar: %s %.2fmb \nLokalizacja: %s %s %s \nKeywords: %s \nTytuł: %s \nOpis: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\nData zdjęcia: %s Data pliku: %s \nOcena: %s Rozmiar: %s %.2fmb \nLokalizacja: %s %s %s \nKeywords: %s \nTytuł: %s \nOpis: %s \n----------------------- \n%s 0038 (click below) 0038 (kliknij poniżej) 0039 (no selection) 0039 (brak wyboru) 0040 (pixels) 0040 (piksele) 0041 (press key) 0041 (naciśnij klawisz) 0042 (select function) 0042 (wybierz funkcję) 0043 *** bad utf8 detected *** \n 0043 *** wykryto nieprawidłowy utf8 *** \n 0044 *** cannot create new file \n 0044 *** nie można utworzyć nowego pliku \n 0045 *** cannot get real path of input file \n 0045 *** nie można uzyskać rzeczywistej ścieżki pliku wejściowego \n 0046 *** cannot load input file \n 0046 *** nie można wczytać pliku wejściowego \n 0047 *** cannot make new version of input file \n 0047 *** nie można utworzyć nowej wersji pliku wejściowego \n 0048 *** cannot open input file 0048 *** nie można otworzyć pliku wejściowego 0049 *** cannot read input file 0049 *** nie można odczytać pliku wejściowego 0050 *** cannot save output file \n 0050 *** nie można zapisać pliku wyjściowego \n 0051 *** completed \n 0051 *** zakończono \n 0052 *** file date/time invalid \n 0052 *** nieprawidłowa data/czas pliku \n 0053 *** file type not supported \n 0053 *** typ pliku nieobsługiwany \n 0054 *** invalid file \n 0054 *** nieprawidłowy plik \n 0055 *** metadata update error \n 0055 *** błąd aktualizacji metadata \n 0056 *** no date/time available \n 0056 *** brak dostępnej daty/czasu \n 0057 + bright 0057 + jaśniej 0058 +Blue -Yellow 0058 +Niebieski -Żółty 0059 +Brightness 0059 +Jasność 0060 +Green -Magenta 0060 +Zielony -Purpurowy 0061 +Red -Cyan 0061 +Czerwony -Cyjan 0062 - blue 0062 - niebieski 0063 - fog/haze 0063 - mgła/zamglenie 0064 .heic/.avif files not supported (install heif_convert) 0064 Pliki .heic/.avif nieobsługiwane (zainstaluj heif_convert) 0065 .jp2 files not supported (install opj_decompress) 0065 Pliki .jp2 nieobsługiwane (zainstaluj opj_decompress) 0066 .webp files not supported (install dwebp) 0066 Pliki .webp nieobsługiwane (zainstaluj dwebp) 0067 0 albums selected 0067 0 albumów wybranych 0068 0 duplicates 0068 0 duplikatów 0069 0-5 stars 0069 0-5 gwiazdek 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = brak indeksu obrazów, tylko stary indeks, stary + aktualizacja nowych/zmodyfikowanych 0071 2-character code 0071 Kod 2-znakowy 0072 3D depth 0072 Głębia 3D 0073 <2 images 0073 <2 obrazy 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 Instalowana jest nowa wersja Fotocx. \nMoże być konieczne przywrócenie ustawień niestandardowych. 0075 ADD GLARE 0075 DODAJ POŚWIATĘ 0076 ADD NOISE 0076 DODAJ SZUM 0077 ADJUST HSL 0077 DOSTOSUJ HSL 0078 ADJUST RGB 0078 DOSTOSUJ RGB 0079 ALBUM MASS UPDATE 0079 MASOWA AKTUALIZACJA ALBUMU 0080 ALBUMS 0080 ALBUMY 0081 ALBUMS MENU 0081 MENU ALBUMÓW 0082 ALIEN COLORS 0082 OBCE KOLORY 0083 AMPLIFY CONTRAST 0083 WZMOCNIJ KONTRAST 0084 ANTI-ALIAS 0084 WYGŁADZANIE KRAWĘDZI 0085 AREA BLEND 0085 MIESZANIE OBSZARU 0086 AREA FILL 0086 WYPEŁNIENIE OBSZARU 0087 AREA OVERVIEW 0087 PRZEGLĄD OBSZARU 0088 AUTOSEARCH 0088 AUTOWYSZUKIWANIE 0089 About 0089 O programie 0090 Action 0090 Akcja 0091 Add 0091 Dodaj 0092 Add 1 0092 Dodaj 1 0093 Add All 0093 Dodaj wszystko 0094 Add Current 0094 Dodaj bieżący 0095 Add Current File Here 0095 Dodaj tutaj bieżący plik 0096 Add Glare 0096 Dodaj poświatę 0097 Add Image 0097 Dodaj obraz 0098 Add Line 0098 Dodaj linię 0099 Add Margins 0099 Dodaj marginesy 0100 Add Noise 0100 Dodaj szum 0101 Add Random Noise 0101 Dodaj losowy szum 0102 Add Selected Files Here 0102 Dodaj tutaj wybrane pliki 0103 Add Texture 0103 Dodaj teksturę 0104 Add a brightness/color ramp across an image 0104 Dodaj gradient jasności/koloru na obrazie 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 Dodaj zakładkę: kliknij thumbnail w galerii. \nZmień nazwę zakładki: kliknij ją i naciśnij [Zmień nazwę] 0106 Add glare around bright objects 0106 Dodaj poświatę wokół jasnych obiektów 0107 Add margins around an image 0107 Dodaj marginesy wokół obrazu 0108 Add newest version to existing versions 0108 Dodaj najnowszą wersję do istniejących wersji 0109 Add overlay image (e.g. copyright) to selected images 0109 Dodaj obraz nakładki (np. prawa autorskie) do wybranych obrazów 0110 Add random noise to an image 0110 Dodaj losowy szum do obrazu 0111 Add selected versions to existing versions 0111 Dodaj wybrane wersje do istniejących wersji 0112 Add texture to an image 0112 Dodaj teksturę do obrazu 0113 Add to Selection 0113 Dodaj do zaznaczenia 0114 Add/change/delete metadata for selected image files 0114 Dodaj/zmień/usuń metadata dla wybranych plików obrazów 0115 Add/remove barrel/pincushion distortion 0115 Dodaj/usuń dystorsję beczkową/poduszkową 0116 Add/remove brightness/color radially from chosen center 0116 Dodaj/usuń jasność/kolor promieniście od wybranego środka 0117 Add/remove keywords for selected image files 0117 Dodaj/usuń keywords dla wybranych plików obrazów 0118 Add/revise location/geocoordinates for selected image files 0118 Dodaj/popraw lokalizację/geowspółrzędne dla wybranych plików obrazów 0119 Adjust HSL 0119 Dostosuj HSL 0120 Adjust Image Contributions 0120 Dostosuj udział obrazów 0121 Adjust Pixel Composition 0121 Dostosuj kompozycję pikseli 0122 Adjust RGB 0122 Dostosuj RGB 0123 Adjust brightness, contrast, color 0123 Dostosuj jasność, kontrast, kolor 0124 Adjust color saturation based on brightness 0124 Dostosuj nasycenie koloru na podstawie jasności 0125 Adjust color using HSL color model 0125 Dostosuj kolor za pomocą modelu koloru HSL 0126 Adjust color using RGB or CMY colors 0126 Dostosuj kolor za pomocą kolorów RGB lub CMY 0127 Adjustment 0127 Dostosowanie 0128 Album Mass Update 0128 Masowa aktualizacja albumu 0129 Album Name 0129 Nazwa albumu 0130 Albums 0130 Albumy 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 Albumy: galeria wybranych obrazów, ułóż metodą przeciągnij i upuść 0132 Algorithm Iterations 0132 Iteracje algorytmu 0133 Alien Colors 0133 Obce kolory 0134 All 0134 Wszystko 0135 All Areas 0135 Wszystkie obszary 0136 All files 0136 Wszystkie pliki 0137 All image files will be re-indexed. \nContinue? 0137 Wszystkie pliki obrazów zostaną ponownie zindeksowane. \nKontynuować? 0138 All±1 0138 Wszystko±1 0139 All±10 0139 Wszystko±10 0140 Alpha 0140 Alfa 0141 Amount 0141 Ilość 0142 Amplify 0142 Wzmocnij 0143 Amplify Contrast 0143 Wzmocnij kontrast 0144 Amplify area contrast to enhance visibility of details 0144 Wzmocnij kontrast obszaru, aby zwiększyć widoczność szczegółów 0145 Angle 0145 Kąt 0146 Anti-Alias 0146 Wygładzanie krawędzi 0147 Apply 0147 Zastosuj 0148 Apply a soft focus effect to an image 0148 Zastosuj efekt miękkiej ostrości do obrazu 0149 Apply repeatedly while watching the image. 0149 Stosuj wielokrotnie, obserwując obraz. 0150 Area Blend 0150 Mieszanie obszaru 0151 Area Edge Blend 0151 Mieszanie krawędzi obszaru 0152 Area Fill 0152 Wypełnienie obszaru 0153 Arrange images and text in a layout (photo-montage) 0153 Ułóż obrazy i tekst w układzie (fotomontaż) 0154 Array Complete 0154 Tablica ukończona 0155 Array Width 0155 Szerokość tablicy 0156 Arrow head 0156 Grot strzałki 0157 Auto Level 0157 Automatyczny poziom 0158 Auto black level 0158 Automatyczny poziom czerni 0159 Auto crop: 0159 Automatyczne kadrowanie: 0160 Auto white balance 0160 Automatyczny balans bieli 0161 Auto-replay 0161 Automatyczne odtwarzanie 0162 BATCH CHANGE META 0162 MASOWA ZMIANA META 0163 BATCH CONVERT 0163 MASOWA KONWERSJA 0164 BATCH COPY/MOVE 0164 MASOWE KOPIOWANIE/PRZENOSZENIE 0165 BATCH DELETE/TRASH 0165 MASOWE USUWANIE/KOSZ 0166 BATCH GEOTAGS 0166 MASOWE GEOTAGS 0167 BATCH KEYWORDS 0167 MASOWE KEYWORDS 0168 BATCH MENU 0168 MENU MASOWE 0169 BATCH OVERLAY 0169 MASOWA NAKŁADKA 0170 BATCH PHOTO DATE 0170 MASOWA DATA ZDJĘCIA 0171 BATCH PROCESSING 0171 PRZETWARZANIE MASOWE 0172 BATCH PURGE KEYWORDS 0172 MASOWE USUWANIE KEYWORDS 0173 BATCH RENAME KEYWORDS 0173 MASOWA ZMIANA NAZW KEYWORDS 0174 BATCH REPORT META 0174 MASOWY RAPORT META 0175 BATCH SCRIPT 0175 SKRYPT MASOWY 0176 BATCH UPRIGHT 0176 MASOWE PROSTOWANIE 0177 BLANK IMAGE 0177 PUSTY OBRAZ 0178 BLUR 0178 ROZMYCIE 0179 BOOKMARKS 0179 ZAKŁADKI 0180 BRIGHTNESS RAMP 0180 GRADIENT JASNOŚCI 0181 Background 0181 Tło 0182 Background Blur - blur relative to distance from foreground 0182 Rozmycie tła - rozmycie zależne od odległości od pierwszego planu 0183 Background Color 0183 Kolor tła 0184 Background Pattern 0184 Wzór tła 0185 Base Transparency 0185 Przezroczystość bazowa 0186 Batch 0186 Masowe 0187 Batch Add/Change Metadata 0187 Masowe dodawanie/zmiana metadata 0188 Batch Add/Remove Keywords 0188 Masowe dodawanie/usuwanie keywords 0189 Batch Change Meta 0189 Masowa zmiana meta 0190 Batch Convert 0190 Masowa konwersja 0191 Batch Copy/Move 0191 Masowe kopiowanie/przenoszenie 0192 Batch Delete/Trash 0192 Masowe usuwanie/kosz 0193 Batch Geotags 0193 Masowe geotags 0194 Batch Keywords 0194 Masowe keywords 0195 Batch Metadata 0195 Masowe metadata 0196 Batch Overlay 0196 Masowa nakładka 0197 Batch Photo Date 0197 Masowa data zdjęcia 0198 Batch Photo Date/Time 0198 Masowa data/czas zdjęcia 0199 Batch Purge Keywords 0199 Masowe usuwanie keywords 0200 Batch Rename Keywords 0200 Masowa zmiana nazw keywords 0201 Batch Report Meta 0201 Masowy raport meta 0202 Batch Report Metadata 0202 Masowy raport metadata 0203 Batch Set Geotags 0203 Masowe ustawianie geotags 0204 Batch Upright 0204 Masowe prostowanie 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 Masowe: kopiowanie, przenoszenie, konwersja, konwersja RAW, dodawanie/zmiana metadata 0206 Bend and fine-align 0206 Wygnij i dostrój wyrównanie 0207 Bias 0207 Odchylenie 0208 Black 0208 Czerń 0209 Blank Image 0209 Pusty obraz 0210 Blend 0210 Mieszanie 0211 Blend 0% 0211 Mieszanie 0% 0212 Blend Width 0212 Szerokość mieszania 0213 Blend area edits/edges using the mouse 0213 Mieszaj edycje/krawędzie obszaru za pomocą myszy 0214 Blend: 0% 0214 Mieszanie: 0% 0215 Blue 0215 Niebieski 0216 Blue Factors 0216 Współczynniki niebieskiego 0217 Blur 0217 Rozmycie 0218 Blur Angle (degrees) 0218 Kąt rozmycia (stopnie) 0219 Blur Background 0219 Rozmyj tło 0220 Blur Image 0220 Rozmyj obraz 0221 Blur Mix 0221 Mieszanie rozmycia 0222 Blur Normal 0222 Rozmycie normalne 0223 Blur Radius 0223 Promień rozmycia 0224 Blur Span 0224 Zasięg rozmycia 0225 Blur Span (pixels) 0225 Zasięg rozmycia (piksele) 0226 Blur the image (various methods) 0226 Rozmyj obraz (różne metody) 0227 Bookmarks 0227 Zakładki 0228 Both 0228 Oba 0229 Bottom 0229 Dół 0230 Bright Limit 0230 Limit jasności 0231 Bright Point 0231 Punkt jasny 0232 Brightness 0232 Jasność 0233 Brightness Histogram 0233 Histogram jasności 0234 Brightness Ramp 0234 Gradient jasności 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 Jasność powinna wykazywać stopniowy gradient \nsięgający aż do krawędzi. 0236 Browse 0236 Przeglądaj 0237 CALIBRATE PRINTER 0237 KALIBRACJA DRUKARKI 0238 CAPTIONS 0238 PODPISY 0239 CARTOON 0239 KARYKATURA 0240 CHOOSE ALBUM 0240 WYBIERZ ALBUM 0241 CLEAR AREA 0241 WYCZYŚĆ OBSZAR 0242 CLOSE 0242 ZAMKNIJ 0243 COLOR MODE 0243 TRYB KOLORU 0244 COMBINE MENU 0244 MENU ŁĄCZENIA 0245 COMMAND PARAMETERS 0245 PARAMETRY POLECENIA 0246 COMPLETED 0246 UKOŃCZONO 0247 COPY FROM IMAGE 0247 KOPIUJ Z OBRAZU 0248 COPY IN IMAGE 0248 KOPIUJ W OBRAZIE 0249 COPY META 0249 KOPIUJ META 0250 COPY PRIOR EDIT 0250 KOPIUJ POPRZEDNIĄ EDYCJĘ 0251 COPY TO CLIPBOARD 0251 KOPIUJ DO SCHOWKA 0252 COPY TO DESKTOP 0252 KOPIUJ NA PULPIT 0253 COPY/MOVE 0253 KOPIUJ/PRZENIEŚ 0254 COPY/PASTE AREA 0254 KOPIUJ/WKLEJ OBSZAR 0255 CREATE ALBUM 0255 UTWÓRZ ALBUM 0256 CROP 0256 KADRUJ 0257 CROSSHATCH 0257 KRATKOWANIE 0258 CURRENT ALBUM 0258 BIEŻĄCY ALBUM 0259 CURRENT FILE FOLDER 0259 FOLDER BIEŻĄCEGO PLIKU 0260 CURVE EDITING 0260 EDYCJA KRZYWEJ 0261 CUSTOM KERNEL 0261 WŁASNE JĄDRO 0262 CUSTOM MENU 0262 MENU NIESTANDARDOWE 0263 CYCLE 2 FILES 0263 PRZEŁĄCZAJ 2 PLIKI 0264 CYCLE 3 FILES 0264 PRZEŁĄCZAJ 3 PLIKI 0265 Calculate 0265 Oblicz 0266 Calculate Geometry 0266 Oblicz geometrię 0267 Calibrate Printer 0267 Kalibracja drukarki 0268 Cancel 0268 Anuluj 0269 Cartoon 0269 Karykatura 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 Uwaga: użyj funkcji Edytuj metadata główne, \naby zmienić tags tam dostępne, dla zapewnienia \nwprowadzenia powiązanych aktualizacji. 0271 Center 0271 Środek 0272 Center Hole 0272 Środkowy otwór 0273 Change 0273 Zmień 0274 Change Log 0274 Dziennik zmian 0275 Change file name 0275 Zmień nazwę pliku 0276 Change gallery sort order 0276 Zmień kolejność sortowania galerii 0277 Change image colors using an algorithm 0277 Zmień kolory obrazu za pomocą algorytmu 0278 Change image pixel dimensions 0278 Zmień wymiary pikseli obrazu 0279 Chart to adjust monitor color 0279 Wykres do dostosowania koloru monitora 0280 Choose 0280 Wybierz 0281 Choose Album 0281 Wybierz album 0282 Choose Albums 0282 Wybierz albumy 0283 Choose Captions 0283 Wybierz podpisy 0284 Choose an album and show as gallery of images 0284 Wybierz album i pokaż jako galerię obrazów 0285 Choose metadata shown on image captions 0285 Wybierz metadata pokazywane w podpisach obrazu 0286 Choose new Fotocx home folder 0286 Wybierz nowy folder domowy Fotocx 0287 Choose thumbnail folder 0287 Wybierz folder thumbnail 0288 Choose top image folders 0288 Wybierz foldery główne obrazów 0289 Clear 0289 Wyczyść 0290 Clear All 0290 Wyczyść wszystko 0291 Click dark spot for black level 0291 Kliknij ciemny punkt dla poziomu czerni 0292 Click for RGB histogram 0292 Kliknij, aby uzyskać histogram RGB 0293 Click gray spot for white balance 0293 Kliknij szary punkt dla balansu bieli 0294 Click image to select pixels 0294 Kliknij obraz, aby wybrać piksele 0295 Click image to select, drag image to move. 0295 Kliknij obraz, aby wybrać, przeciągnij obraz, aby przesunąć. 0296 Click mouse to change center 0296 Kliknij myszą, aby zmienić środek 0297 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0297 Kliknij w pobliżu dowolnego miejsca na obrysie obszaru. \nMożliwe luki w obrysie zostaną znalezione. \nNaciśnij F1, aby uzyskać pomoc 0298 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0298 Kliknij cztery narożniki obszaru czworokąta. Naciśnij [zastosuj]. \nObraz jest przekształcany, aby zamienić czworokąt w prostokąt. 0299 Click thumbnail to select file 0299 Kliknij thumbnail, aby wybrać plik 0300 Clip Level 0300 Poziom obcięcia 0301 Clip Limit % 0301 Limit obcięcia % 0302 Color 0302 Kolor 0303 Color Chooser 0303 Wybór koloru 0304 Color Depth: 0304 Głębia koloru: 0305 Color Fringes 0305 Obwódki koloru 0306 Color Hue 0306 Odcień koloru 0307 Color Map File 0307 Plik mapy kolorów 0308 Color Match Images 0308 Dopasuj kolory obrazów 0309 Color Mode 0309 Tryb koloru 0310 Color calibration tool for printer and paper type 0310 Narzędzie kalibracji koloru dla drukarki i typu papieru 0311 Color map file to use 0311 Plik mapy kolorów do użycia 0312 Combine 0312 Połącz 0313 Combine 2-6 images into a wide panorama image 0313 Połącz 2-6 obrazów w szeroką panoramę 0314 Combine many images into an array of images 0314 Połącz wiele obrazów w tablicę obrazów 0315 Combine multiple images in layers, select and expose layers 0315 Połącz wiele obrazów w warstwach, wybierz i eksponuj warstwy 0316 Combine multiple noisy photos into a low-noise image 0316 Połącz wiele zaszumionych zdjęć w obraz o niskim szumie 0317 Combine multiple photos to erase passing people, etc. 0317 Połącz wiele zdjęć, aby usunąć przechodzących ludzi itp. 0318 Combine within 0318 Połącz w obrębie 0319 Combine: HDR, HDF, stack, panorama, mashup, image array 0319 Połącz: HDR, HDF, stos, panorama, mashup, tablica obrazów 0320 Command Params 0320 Parametry polecenia 0321 Commit 0321 Zatwierdź 0322 Confirm Exit 0322 Potwierdź wyjście 0323 Contrast 0323 Kontrast 0324 Contrast All 0324 Kontrast - wszystko 0325 Contrast Blue 0325 Kontrast niebieskiego 0326 Contrast Green 0326 Kontrast zielonego 0327 Contrast Limit 0327 Limit kontrastu 0328 Contrast Red 0328 Kontrast czerwonego 0329 Convert %d image files 0329 Konwertuj %d plików obrazów 0330 Convert an image into a Tiny Planet image 0330 Przekształć obraz w obraz Tiny Planet 0331 Convert image into a cartoon drawing 0331 Przekształć obraz w karykaturę 0332 Convert image into a crosshatch sketch 0332 Przekształć obraz w szkic kratkowany 0333 Convert image into a line drawing 0333 Przekształć obraz w rysunek liniowy 0334 Convert image into a simulated painting 0334 Przekształć obraz w symulowany obraz malarski 0335 Convert image into a simulated sketch (1) 0335 Przekształć obraz w symulowany szkic (1) 0336 Convert image into a simulated sketch (2) 0336 Przekształć obraz w symulowany szkic (2) 0337 Convert image into black/white lines 0337 Przekształć obraz w czarno-białe linie 0338 Convert image into dithered dots 0338 Przekształć obraz w rozproszone kropki 0339 Convert image into square tiles with 3D effect 0339 Przekształć obraz w kwadratowe kafelki z efektem 3D 0340 Convert image into tiles matching feature contours 0340 Przekształć obraz w kafelki dopasowane do konturów 0341 Copy 0341 Kopiuj 0342 Copy %d image files 0342 Kopiuj %d plików obrazów 0343 Copy From Image 0343 Kopiuj z obrazu 0344 Copy Meta 0344 Kopiuj meta 0345 Copy Metadata 0345 Kopiuj metadata 0346 Copy Prior Edit 0346 Kopiuj poprzednią edycję 0347 Copy Within Image 0347 Kopiuj w obrazie 0348 Copy area for later pasting into image 0348 Skopiuj obszar do późniejszego wklejenia do obrazu 0349 Copy areas from another image using the mouse 0349 Kopiuj obszary z innego obrazu za pomocą myszy 0350 Copy areas from prior edits using the mouse 0350 Kopiuj obszary z poprzednich edycji za pomocą myszy 0351 Copy areas within an image using the mouse 0351 Kopiuj obszary w obrębie obrazu za pomocą myszy 0352 Copy image file to the clipboard 0352 Skopiuj plik obrazu do schowka 0353 Copy image file to the desktop 0353 Skopiuj plik obrazu na pulpit 0354 Copy in Image 0354 Kopiuj w obrazie 0355 Copy metadata from one image to another 0355 Skopiuj metadata z jednego obrazu do drugiego 0356 Copy or Move Image File 0356 Kopiuj lub przenieś plik obrazu 0357 Copy or Move image file to new location 0357 Skopiuj lub przenieś plik obrazu w nowe miejsce 0358 Copy to Clipboard 0358 Kopiuj do schowka 0359 Copy to Desktop 0359 Kopiuj na pulpit 0360 Copy without unsaved changes? 0360 Kopiować bez niezapisanych zmian? 0361 Copy/Move 0361 Kopiuj/przenieś 0362 Copy/move selected image files to a new folder 0362 Skopiuj/przenieś wybrane pliki obrazów do nowego folderu 0363 Copyright 0363 Prawa autorskie 0364 Create 0364 Utwórz 0365 Create Album 0365 Utwórz album 0366 Create Blank Image 0366 Utwórz pusty obraz 0367 Create Mosaic 0367 Utwórz mozaikę 0368 Create a blank image 0368 Utwórz pusty obraz 0369 Create a mosaic with tiles made from all images 0369 Utwórz mozaikę z kafelków utworzonych ze wszystkich obrazów 0370 Create a new album (ordered set of image files) 0370 Utwórz nowy album (uporządkowany zestaw plików obrazów) 0371 Create an embossed or 3D appearance 0371 Utwórz wygląd wytłoczony lub 3D 0372 Create or replace an album 0372 Utwórz lub zastąp album 0373 Crop 0373 Kadruj 0374 Crop (trim) image margins 0374 Kadruj (przytnij) marginesy obrazu 0375 Crop Buttons 0375 Przyciski kadrowania 0376 Crop Image 0376 Kadruj obraz 0377 Crosshatch 0377 Kratkowanie 0378 Crosshatch Sketch 0378 Szkic kratkowany 0379 Current Album 0379 Bieżący album 0380 Current File Folder 0380 Folder bieżącego pliku 0381 Current gallery 0381 Bieżąca galeria 0382 Current image: 0382 Bieżący obraz: 0383 Curve Node 0383 Węzeł krzywej 0384 Curve lines need at least 4 points 0384 Linie krzywej wymagają co najmniej 4 punktów 0385 Custom 0385 Niestandardowe 0386 Custom Kernel 0386 Własne jądro 0387 Custom Shortcuts \n 0387 Niestandardowe skróty \n 0388 Custom menu: favorite/frequent functions, scripts, plugins 0388 Menu niestandardowe: ulubione/często używane funkcje, skrypty, wtyczki 0389 Customize 0389 Dostosuj 0390 Customize: 0390 Dostosuj: 0391 Cut Bottom 0391 Przytnij dół 0392 Cut Top 0392 Przytnij górę 0393 Cycle 2 Files 0393 Przełączaj 2 pliki 0394 Cycle 2 Prior Files 0394 Przełączaj 2 poprzednie pliki 0395 Cycle 3 Files 0395 Przełączaj 3 pliki 0396 Cycle 3 Prior Files 0396 Przełączaj 3 poprzednie pliki 0397 Cycle through images: 0397 Przełączaj obrazy: 0398 DARK/BRIGHT PIXELS 0398 CIEMNE/JASNE PIKSELE 0399 DEFOG 0399 USUŃ MGŁĘ 0400 DELETE ALBUM 0400 USUŃ ALBUM 0401 DELETE META 0401 USUŃ META 0402 DELETE/TRASH 0402 USUŃ/KOSZ 0403 DENOISE 0403 REDUKCJA SZUMU 0404 DIALOG BUTTONS 0404 PRZYCISKI OKNA DIALOGOWEGO 0405 DITHER 0405 DITHERING 0406 DRAG AND DROP 0406 PRZECIĄGNIJ I UPUŚĆ 0407 Dark Areas 0407 Ciemne obszary 0408 Dark Limit 0408 Limit ciemności 0409 Dark Point 0409 Punkt ciemny 0410 Dark/Bright Pixels 0410 Ciemne/jasne piksele 0411 Data file 0411 Plik danych 0412 Define keywords used for searching images 0412 Zdefiniuj keywords używane do wyszukiwania obrazów 0413 Defined Keywords: 0413 Zdefiniowane keywords: 0414 Defog 0414 Usuń mgłę 0415 Delete 0415 Usuń 0416 Delete Album 0416 Usuń album 0417 Delete Meta 0417 Usuń meta 0418 Delete Metadata 0418 Usuń metadata 0419 Delete Originals 0419 Usuń oryginały 0420 Delete an album 0420 Usuń album 0421 Delete or Trash selected image files 0421 Usuń lub wyrzuć do kosza wybrane pliki obrazów 0422 Delete or trash an image file 0422 Usuń lub wyrzuć do kosza plik obrazu 0423 Delete read-only file? 0423 Usunąć plik tylko do odczytu? 0424 Delete/Trash 0424 Usuń/Kosz 0425 Denoise 0425 Redukuj szum 0426 Depth 0426 Głębia 0427 Desc. 0427 Opis 0428 Description: %s\n 0428 Opis: %s\n 0429 Desktop 0429 Pulpit 0430 Dialog Font 0430 Czcionka okna dialogowego 0431 Diffs 0431 Różnice 0432 Directed Blur 0432 Rozmycie kierunkowe 0433 Directed Blur - blur locally in direction of mouse drag 0433 Rozmycie kierunkowe - rozmycie lokalne w kierunku przeciągnięcia myszą 0434 Disable 0434 Wyłącz 0435 Disable areas for editing 0435 Wyłącz obszary do edycji 0436 Discard unsaved changes? 0436 Odrzucić niezapisane zmiany? 0437 Discard unsaved edits? 0437 Odrzucić niezapisane edycje? 0438 Distort image areas using the mouse 0438 Zniekształć obszary obrazu za pomocą myszy 0439 Dither 0439 Dithering 0440 Dither Image 0440 Dithering obrazu 0441 Dither0 0441 Dithering0 0442 Dither1 0442 Dithering1 0443 Dither2 0443 Dithering2 0444 Dither3 0444 Dithering3 0445 Dither4 0445 Dithering4 0446 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0446 Przeciągnij obrazy do zgrubnego wyrównania.\nAby obrócić, przeciągnij od dolnej krawędzi. 0447 Drag margin box middle or edges 0447 Przeciągnij środek lub krawędzie pola marginesu 0448 Drag mouse on image. \nLeft click to cancel. 0448 Przeciągnij myszą po obrazie. \nKliknięcie lewym przyciskiem anuluje. 0449 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0449 Przeciągnij myszą, aby zaznaczyć. Usuń. Powtórz. \nKliknięcie: rozszerz zaznaczenie do myszy. 0450 Drag mouse to set center 0450 Przeciągnij myszą, aby ustawić środek 0451 Drag near an image corner using the mouse 0451 Przeciągnij w pobliżu narożnika obrazu za pomocą myszy 0452 Drag on image to level image.\nClick on image for level lines. 0452 Przeciągnij po obrazie, aby wypoziomować obraz.\nKliknij obraz, aby uzyskać linie poziomu. 0453 Drag within image using the mouse 0453 Przeciągnij w obrębie obrazu za pomocą myszy 0454 Draw a line across the image in \ndirection of brightness change. 0454 Narysuj linię w poprzek obrazu w \nkierunku zmiany jasności. 0455 Draw box on image 0455 Narysuj prostokąt na obrazie 0456 Draw line or arrow on image 0456 Narysuj linię lub strzałkę na obrazie 0457 Draw on image: text, line/arrow, box, circle, ellipse 0457 Rysuj na obrazie: tekst, linia/strzałka, prostokąt, koło, elipsa 0458 Draw oval on image 0458 Narysuj owal na obrazie 0459 Draw text on image 0459 Narysuj tekst na obrazie 0460 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0460 Zduplikowane lub zagnieżdżone foldery: \n %s \n %s \nUsuń jeden z nich. 0461 Duplicates: 0461 Duplikaty: 0462 EDIT ALBUM 0462 EDYTUJ ALBUM 0463 EDIT ANY META 0463 EDYTUJ DOWOLNE META 0464 EDIT BOOKMARKS 0464 EDYTUJ ZAKŁADKI 0465 EDIT MAIN META 0465 EDYTUJ META GŁÓWNE 0466 EDIT MENU 0466 MENU EDYCJI 0467 EDIT PROCEDURES 0467 EDYTUJ PROCEDURY 0468 EDIT SCRIPT 0468 EDYTUJ SKRYPT 0469 EDIT WORKFLOW 0469 EDYTUJ WORKFLOW 0470 EFFECTS MENU 0470 MENU EFEKTÓW 0471 EMBOSS 0471 WYTŁOCZENIE 0472 ENABLE/DISABLE AREA 0472 WŁĄCZ/WYŁĄCZ OBSZAR 0473 ENGRAVE 0473 GRAWEROWANIE 0474 ESCHER SPIRAL 0474 SPIRALA ESCHERA 0475 EXPORT FILES 0475 EKSPORTUJ PLIKI 0476 Edge 0476 Krawędź 0477 Edit 0477 Edytuj 0478 Edit Any Meta 0478 Edytuj dowolne meta 0479 Edit Any Metadata 0479 Edytuj dowolne metadata 0480 Edit Bookmarks 0480 Edytuj zakładki 0481 Edit Images 0481 Edytuj obrazy 0482 Edit Keyboard Shortcuts 0482 Edytuj skróty klawiszowe 0483 Edit Line 0483 Edytuj linię 0484 Edit Line/Arrow 0484 Edytuj linię/strzałkę 0485 Edit Main Meta 0485 Edytuj meta główne 0486 Edit Main Metadata 0486 Edytuj metadata główne 0487 Edit Menu 0487 Menu edycji 0488 Edit Metadata 0488 Edytuj metadata 0489 Edit Plugins 0489 Edytuj wtyczki 0490 Edit Text 0490 Edytuj tekst 0491 Edit any metadata tag 0491 Edytuj dowolny tag metadata 0492 Edit function can not use Paint Edits 0492 Funkcja edycji nie może używać funkcji Maluj edycje 0493 Edit function must be active 0493 Funkcja edycji musi być aktywna 0494 Edit key metadata: keywords/geotags/description/rating ... 0494 Edytuj kluczowe metadata: keywords/geotags/opis/ocena ... 0495 Edit plugins menu 0495 Edytuj menu wtyczek 0496 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0496 Edycja: kadrowanie, obrót, retusz, przeskalowanie, oznaczenia, malowane edycje, kopiowanie obszarów 0497 Effects 0497 Efekty 0498 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0498 Efekty: karykatura, szkic, malarstwo, wytłoczenie, dithering, tekstura, kolory, własna konwolucja 0499 Emboss 0499 Wytłoczenie 0500 Enable 0500 Włącz 0501 Enable areas for editing 0501 Włącz obszary do edycji 0502 End of gallery 0502 Koniec galerii 0503 Engrave 0503 Graweruj 0504 Enter Keyword 0504 Wprowadź keyword 0505 Enter New Keyword 0505 Wprowadź nowy keyword 0506 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0506 Wprowadź właściwości linii lub strzałki w oknie dialogowym, \nkliknij/przeciągnij na obrazie, kliknij prawym, aby usunąć 0507 Enter text, [Add] to layout, edit properties. 0507 Wprowadź tekst, [Dodaj] do układu, edytuj właściwości. 0508 Enter text, click/drag on image, right click to remove 0508 Wprowadź tekst, kliknij/przeciągnij na obrazie, kliknij prawym, aby usunąć 0509 Erase 0509 Usuń 0510 Erase existing areas 0510 Usuń istniejące obszary 0511 Escher Spiral 0511 Spirala Eschera 0512 Exceed 50 anchor points 0512 Przekroczono 50 punktów kotwiczących 0513 Export Files 0513 Eksportuj pliki 0514 Export selected image files to another folder 0514 Eksportuj wybrane pliki obrazów do innego folderu 0515 FILE MENU 0515 MENU PLIKU 0516 FILE SAVE 0516 ZAPIS PLIKU 0517 FILE VIEW 0517 WIDOK PLIKU 0518 FIND AREA GAP 0518 ZNAJDŹ LUKĘ W OBSZARZE 0519 FIND BAD FILES 0519 ZNAJDŹ USZKODZONE PLIKI 0520 FIND DUPLICATES 0520 ZNAJDŹ DUPLIKATY 0521 FIRST INDEX 0521 PIERWSZY INDEKS 0522 FIRST STARTUP 0522 PIERWSZE URUCHOMIENIE 0523 FIX META 0523 NAPRAW META 0524 FLATTEN HISTOGRAM 0524 SPŁASZCZ HISTOGRAM 0525 FLATTEN PHOTO 0525 SPŁASZCZ ZDJĘCIE 0526 FOLDER TREE 0526 DRZEWO FOLDERÓW 0527 FOTOCX FOR WINDOWS 11 0527 FOTOCX DLA WINDOWS 11 0528 FOTOCX LIMITATIONS 0528 OGRANICZENIA FOTOCX 0529 FOTOCX USAGE 0529 UŻYTKOWANIE FOTOCX 0530 FRINGES 0530 OBWÓDKI 0531 FUSION 0531 FUZJA 0532 Fetch 0532 Pobierz 0533 File 0533 Plik 0534 File Mod Date/Time 0534 Data/czas modyfikacji pliku 0535 File Name 0535 Nazwa pliku 0536 File Name/Number 0536 Nazwa pliku/numer 0537 File Name: %s \n 0537 Nazwa pliku: %s \n 0538 File Size (bytes) 0538 Rozmiar pliku (bajty) 0539 File View 0539 Widok pliku 0540 File count: 0540 Liczba plików: 0541 File type cannot be edited 0541 Typu pliku nie można edytować 0542 File1 0542 Plik1 0543 File2 0543 Plik2 0544 File: 0544 Plik: 0545 File: new session, open, rename, copy/move, delete, print 0545 Plik: nowa sesja, otwórz, zmień nazwę, kopiuj/przenieś, usuń, drukuj 0546 Fill selected areas or transparent areas with a color 0546 Wypełnij wybrane obszary lub przezroczyste obszary kolorem 0547 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0547 Wypełnij wybrane obszary kolorem w celu weryfikacji wizualnej. \nMetoda 1: kliknij lewym przyciskiem w każdym wybranym obszarze, który nie jest jeszcze wypełniony. \nMetoda 2: kliknij prawym przyciskiem POZA wszystkimi wybranymi obszarami. \nNaciśnij przycisk [pomoc], aby uzyskać wyjaśnienie 0548 Find 0548 Znajdź 0549 Find Bad Files 0549 Znajdź uszkodzone pliki 0550 Find Duplicate Images 0550 Znajdź duplikaty obrazów 0551 Find Duplicates 0551 Znajdź duplikaty 0552 Find Gap 0552 Znajdź lukę 0553 Find a gap in an area outline 0553 Znajdź lukę w obrysie obszaru 0554 Find all images for a location [date range] 0554 Znajdź wszystkie obrazy dla lokalizacji [zakres dat] 0555 Find all images for a selected tag name and value 0555 Znajdź wszystkie obrazy dla wybranej nazwy tag i wartości 0556 Find images meeting multiple search criteria 0556 Znajdź obrazy spełniające wiele kryteriów wyszukiwania 0557 Find optimum factors: 0557 Znajdź optymalne współczynniki: 0558 Finish 0558 Zakończ 0559 Finish Area 0559 Zakończ obszar 0560 Fix Bad File 0560 Napraw uszkodzony plik 0561 Fix Broken Metadata 0561 Napraw uszkodzone metadata 0562 Fix Meta 0562 Napraw meta 0563 Fix Motion Blur 0563 Napraw rozmycie ruchu 0564 Fix Perspective 0564 Popraw perspektywę 0565 Fix color fringes (chromatic aberration) 0565 Napraw obwódki koloru (aberrację chromatyczną) 0566 Fix perspective for object photographed from an angle 0566 Popraw perspektywę obiektu sfotografowanego pod kątem 0567 Fix red-eyes from flash photo 0567 Napraw czerwone oczy ze zdjęcia z lampą błyskową 0568 Flatten 0568 Spłaszcz 0569 Flatten Histogram 0569 Spłaszcz histogram 0570 Flatten Pano 0570 Spłaszcz panoramę 0571 Flatten Photo 0571 Spłaszcz zdjęcie 0572 Flatten brightness histogram to enhance details 0572 Spłaszcz histogram jasności, aby uwydatnić szczegóły 0573 Flatten curved surface. 0573 Spłaszcz zakrzywioną powierzchnię. 0574 Flatten photo of a curved image (e.g. poster on round column 0574 Spłaszcz zdjęcie zakrzywionego obrazu (np. plakat na okrągłej kolumnie) 0575 Flip 0575 Odbij 0576 Folder Tree 0576 Drzewo folderów 0577 Folders 0577 Foldery 0578 Folders for image files (subfolders included automatically) 0578 Foldery dla plików obrazów (podfoldery uwzględniane automatycznie) 0579 Font 0579 Czcionka 0580 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0580 Dla losowej sekwencji obrazów ta wartość to \nwzględna częstotliwość pokazywania obrazu. \nWartość bazowa to 10. 20 --> pokazuj 2x częściej. 0581 Foreground 0581 Pierwszy plan 0582 Fotocx copyright notice 0582 Informacja o prawach autorskich Fotocx 0583 Fotocx home 0583 Strona domowa Fotocx 0584 Fotocx privacy policy 0584 Polityka prywatności Fotocx 0585 Fotocx video tutorial on YouTube 0585 Samouczek wideo Fotocx na YouTube 0586 Fotocx web site (information and downloads) 0586 Strona internetowa Fotocx (informacje i pliki do pobrania) 0587 FreeSans 0587 FreeSans 0588 Full List 0588 Pełna lista 0589 Full Screen 0589 Pełny ekran 0590 Fusion 0590 Fuzja 0591 GALLERY END 0591 KONIEC GALERII 0592 GALLERY FILTER 0592 FILTR GALERII 0593 GALLERY HOME 0593 GALERIA - START 0594 GALLERY MENU 0594 MENU GALERII 0595 GALLERY OVERVIEW 0595 PRZEGLĄD GALERII 0596 GALLERY SORT 0596 SORTOWANIE GALERII 0597 GALLERY TO ALBUM 0597 GALERIA DO ALBUMU 0598 GALLERY VIEW 0598 WIDOK GALERII 0599 GDK pixbuf: cannot save file 0599 GDK pixbuf: nie można zapisać pliku 0600 GLOBAL RETINEX 0600 RETINEX GLOBALNY 0601 GRID SETTINGS 0601 USTAWIENIA SIATKI 0602 Gallery 0602 Galeria 0603 Gallery End 0603 Koniec galerii 0604 Gallery Filter 0604 Filtr galerii 0605 Gallery Home 0605 Start galerii 0606 Gallery Sort 0606 Sortowanie galerii 0607 Gallery View 0607 Widok galerii 0608 Gallery of newest image files 0608 Galeria najnowszych plików obrazów 0609 Gallery of recently viewed image files 0609 Galeria niedawno przeglądanych plików obrazów 0610 Gallery to Album 0610 Galeria do albumu 0611 Gallery view with thumbnails and basic metadata 0611 Widok galerii z thumbnails i podstawowymi metadata 0612 Gallery view with thumbnails and file data 0612 Widok galerii z thumbnails i danymi pliku 0613 Gallery: thumbnails, new/recent, sort, select, bookmarks 0613 Galeria: thumbnails, nowe/ostatnie, sortowanie, wybór, zakładki 0614 Generate an inward spiraling repeating image 0614 Generuj obraz z powtarzającą się spiralą do wewnątrz 0615 Global Retinex 0615 Retinex globalny 0616 Gradual 0616 Stopniowe 0617 Graduated Blur 0617 Rozmycie stopniowane 0618 Graduated Blur - blur relative to pixel contrast 0618 Rozmycie stopniowane - rozmycie względem kontrastu pikseli 0619 Grayscale 0619 Skala szarości 0620 Green 0620 Zielony 0621 Grid Settings 0621 Ustawienia siatki 0622 Group by country 0622 Grupuj według kraju 0623 Group by country/date 0623 Grupuj według kraju/daty 0624 Group by country/location 0624 Grupuj według kraju/lokalizacji 0625 Group by country/location/date 0625 Grupuj według kraju/lokalizacji/daty 0626 Group by date/country 0626 Grupuj według daty/kraju 0627 Group by date/country/location 0627 Grupuj według daty/kraju/lokalizacji 0628 HDF 0628 HDF 0629 HDR 0629 HDR 0630 HELP MENU 0630 MENU POMOCY 0631 Hard 0631 Twardy 0632 Height 0632 Wysokość 0633 Height: 0633 Wysokość: 0634 Help 0634 Pomoc 0635 Help: user guide, tutorial, change log, licenses, privacy, about 0635 Pomoc: podręcznik użytkownika, samouczek, dziennik zmian, licencje, prywatność, o programie 0636 Hide 0636 Ukryj 0637 Hide selected areas 0637 Ukryj wybrane obszary 0638 High 0638 Wysoki 0639 High Depth of Field - combine near/far focus images for deeper focus 0639 Duża głębia ostrości - połącz obrazy z ostrością bliską/daleką dla głębszej ostrości 0640 High Dynamic Range - combine bright/dark images for better detail 0640 Wysoki zakres dynamiki - połącz jasne/ciemne obrazy dla lepszych szczegółów 0641 Highlight darkest and brightest pixels 0641 Podświetl najciemniejsze i najjaśniejsze piksele 0642 Home Folder 0642 Folder domowy 0643 Home Page 0643 Strona główna 0644 Horz 0644 Poziomo 0645 How to remove Fotocx application and user files 0645 Jak usunąć aplikację Fotocx i pliki użytkownika 0646 Hue 0646 Odcień 0647 IMAGE ARRAY 0647 TABLICA OBRAZÓW 0648 INDEX FILES 0648 INDEKSUJ PLIKI 0649 INSIDE-OUT 0649 NA LEWĄ STRONĘ 0650 INVERT AREA 0650 ODWRÓĆ OBSZAR 0651 Icon size 0651 Rozmiar ikony 0652 Icons 0652 Ikony 0653 Image 0653 Obraz 0654 Image Array 0654 Tablica obrazów 0655 Image Columns 0655 Kolumny obrazów 0656 Image Differences 0656 Różnice obrazów 0657 Image File 0657 Plik obrazu 0658 Image File: 0658 Plik obrazu: 0659 Image Keywords 0659 Keywords obrazu 0660 Image Locations 0660 Lokalizacje obrazów 0661 Image Markup 0661 Oznaczenia obrazu 0662 Image Position 0662 Pozycja obrazu 0663 Image Preferences 0663 Preferencje obrazu 0664 Image Ratios 0664 Proporcje obrazu 0665 Image Size (pixels) 0665 Rozmiar obrazu (piksele) 0666 Image Time 0666 Czas obrazu 0667 Image Timeline 0667 Oś czasu obrazów 0668 Image colors are converted for printing. 0668 Kolory obrazu są konwertowane do druku. 0669 Image dimensions have changed \nCopy Prior Edit cannot be used 0669 Wymiary obrazu uległy zmianie \nNie można użyć Kopiuj poprzednią edycję 0670 Image dimensions have changed, \nArea Blend cannot be used 0670 Wymiary obrazu uległy zmianie, \nnie można użyć Mieszania obszaru 0671 Image dimensions have changed, \nthis prior image cannot be used 0671 Wymiary obrazu uległy zmianie, \ntego poprzedniego obrazu nie można użyć 0672 Image is fixed, unmovable 0672 Obraz jest zablokowany, nieruchomy 0673 Images sizes are not compatible 0673 Rozmiary obrazów są niezgodne 0674 Include: 0674 Uwzględnij: 0675 Index Files 0675 Indeksuj pliki 0676 Index Level 0676 Poziom indeksowania 0677 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0677 Funkcja indeksowania zakończona. \nIndeksowanie jest wymagane do funkcji wyszukiwania i mapy \noraz aby strony galerii z thumbnails wyświetlały się szybko. 0678 Index new image files and make thumbnails 0678 Indeksuj nowe pliki obrazów i twórz thumbnails 0679 Input color to match and adjust: 0679 Kolor wejściowy do dopasowania i regulacji: 0680 Inside-out 0680 Na lewą stronę 0681 Install following programs using your package manager: \n 0681 Zainstaluj następujące programy za pomocą menedżera pakietów: \n 0682 Intensity 0682 Intensywność 0683 Invert 0683 Odwróć 0684 Invert selected areas (selected ↔ not selected) 0684 Odwróć wybrane obszary (wybrane ↔ niewybrane) 0685 Irregular Tiles 0685 Nieregularne kafelki 0686 Iterations 0686 Iteracje 0687 JPEG ARTIFACTS 0687 ARTEFAKTY JPEG 0688 JPEG Artifacts 0688 Artefakty JPEG 0689 JPEG files 0689 Pliki JPEG 0690 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0690 Sty Lut Mar Kwi Maj Cze Lip Sie Wrz Paź Lis Gru 0691 Jump to gallery beginning [home] 0691 Przejdź do początku galerii [home] 0692 Jump to gallery end [end] 0692 Przejdź do końca galerii [end] 0693 KEYBOARD ESCAPE KEY 0693 KLAWISZ ESCAPE 0694 KEYBOARD SHORTCUTS 0694 SKRÓTY KLAWISZOWE 0695 KEYWORDS OVERVIEW 0695 PRZEGLĄD KEYWORDS 0696 Keep 0696 Zachowaj 0697 Kernel size 0697 Rozmiar jądra 0698 Keyboard Shortcuts 0698 Skróty klawiszowe 0699 Keywords Category 0699 Kategoria keywords 0700 Kill active dialog? 0700 Zamknąć aktywne okno dialogowe? 0701 Kill busy function? 0701 Przerwać zajętą funkcję? 0702 Kuwahara 0702 Kuwahara 0703 Kuwahara Depth 0703 Głębia Kuwahara 0704 LINE COLOR 0704 KOLOR LINII 0705 LOAD/SAVE AREA 0705 WCZYTAJ/ZAPISZ OBSZAR 0706 LOCAL CONTRAST 0706 KONTRAST LOKALNY 0707 LOCAL RETINEX 0707 RETINEX LOKALNY 0708 Language 0708 Język 0709 Layout and background image 0709 Układ i obraz tła 0710 Left 0710 Lewo 0711 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0711 Przeciągnij lewym przyciskiem w obrębie obszaru, \naby stopniowo cofać edycje obszaru. \nPrzeciągnij prawym, aby przywrócić edycje. \nPrzeciągnij wzdłuż krawędzi obszaru, aby zmieszać krawędź. 0712 Left/right click: previous/next image (also arrow keys) 0712 Kliknięcie lewym/prawym: poprzedni/następny obraz (również strzałki) 0713 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0713 Kliknięcie lewym/prawym: cofnij/ponów jeden krok edycji \nKliknięcie środkowym: wróć do wybranego kroku edycji 0714 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0714 Kliknięcie lewym/prawym: zoom obrazu/thumbnail (również klawisze +/-) 0715 Length 0715 Długość 0716 Level 0716 Poziom 0717 Licenses 0717 Licencje 0718 Light Source 0718 Źródło światła 0719 Lightness 0719 Jasność 0720 Limit 0720 Limit 0721 Line Color 0721 Kolor linii 0722 Line Threshold 0722 Próg linii 0723 Line Width 0723 Szerokość linii 0724 Line length 0724 Długość linii 0725 List Fotocx command line parameters 0725 Wyświetl parametry wiersza poleceń Fotocx 0726 List all metadata for current image or clicked thumbnail 0726 Wyświetl wszystkie metadata dla bieżącego obrazu lub klikniętego thumbnail 0727 List outboard programs and functions 0727 Wyświetl zewnętrzne programy i funkcje 0728 Load 0728 Wczytaj 0729 Load settings from file 0729 Wczytaj ustawienia z pliku 0730 Local Contrast 0730 Kontrast lokalny 0731 Local Retinex 0731 Retinex lokalny 0732 Location 0732 Lokalizacja 0733 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0733 Lokalizacja i kraj zastąpią bieżące wartości.\nDane GPS są zastępowane tylko, gdy nowa wartość jest obecna. 0734 Lock 0734 Zablokuj 0735 Low Amplify 0735 Niskie wzmocnienie 0736 MAGNIFY IMAGE 0736 POWIĘKSZ OBRAZ 0737 MAKE WAVES 0737 TWÓRZ FALE 0738 MANAGE KEYWORDS 0738 ZARZĄDZAJ KEYWORDS 0739 MAP MENU 0739 MENU MAPY 0740 MAP VIEW 0740 WIDOK MAPY 0741 MARGINS 0741 MARGINESY 0742 MARKUP 0742 OZNACZENIA 0743 MASHUP 0743 MASHUP 0744 MATCH COLORS 0744 DOPASUJ KOLORY 0745 MEASURE IMAGE 0745 MIERZ OBRAZ 0746 MENU SHORTCUTS 0746 SKRÓTY MENU 0747 METADATA MENU 0747 MENU METADATA 0748 METADATA TAGS 0748 TAGS METADATA 0749 METADATA VIEW 0749 WIDOK METADATA 0750 MONITOR COLOR 0750 KOLOR MONITORA 0751 MOSAIC 0751 MOZAIKA 0752 MOUSE ALT-RIGHT-BUTTON 0752 MYSZ ALT-PRAWY-PRZYCISK 0753 MOUSE FUNCTIONS 0753 FUNKCJE MYSZY 0754 MOUSE OWNERSHIP 0754 WŁASNOŚĆ MYSZY 0755 MOVE FOTOCX HOME 0755 PRZENIEŚ FOLDER DOMOWY FOTOCX 0756 Magnify 0756 Powiększ 0757 Magnify Image 0757 Powiększ obraz 0758 Magnify image around the mouse position 0758 Powiększ obraz wokół pozycji myszy 0759 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0759 Pamięć główna jest zbyt mała, aby uruchomić Fotocx. \nMożesz spróbować mimo to, jeśli chcesz. \n Kontynuować? 0760 Make Layout Image 0760 Utwórz obraz układu 0761 Make Square Tiles 0761 Utwórz kwadratowe kafelki 0762 Make Waves 0762 Twórz fale 0763 Make a spherical projection of an image 0763 Utwórz sferyczną projekcję obrazu 0764 Make black margins transparent 0764 Uczyń czarne marginesy przezroczystymi 0765 Make new versions 0765 Utwórz nowe wersje 0766 Make width constant for window size 0766 Ustaw stałą szerokość dla rozmiaru okna 0767 Manage Keywords 0767 Zarządzaj keywords 0768 Map 0768 Mapa 0769 Map View 0769 Widok mapy 0770 Maps 0770 Mapy 0771 Maps: view images by map location 0771 Mapy: przeglądaj obrazy według lokalizacji na mapie 0772 Margin 0772 Margines 0773 Margins 0773 Marginesy 0774 Markup 0774 Oznaczenia 0775 Mashup 0775 Mashup 0776 Mass update album files 0776 Masowa aktualizacja plików albumu 0777 Match Brightness 0777 Dopasuj jasność 0778 Match Colors 0778 Dopasuj kolory 0779 Match Level 0779 Poziom dopasowania 0780 Match Limit 0780 Limit dopasowania 0781 Match image colors to colors of another image 0781 Dopasuj kolory obrazu do kolorów innego obrazu 0782 Match using: 0782 Dopasuj używając: 0783 Matching Keywords 0783 Pasujące keywords 0784 Max 0784 Maks. 0785 Max. Width 0785 Maks. szerokość 0786 Measure Image 0786 Mierz obraz 0787 Measure Noise 0787 Mierz szum 0788 Measure pixel distances within an image 0788 Mierz odległości pikseli w obrębie obrazu 0789 Menu Colors 0789 Kolory menu 0790 Menu Style 0790 Styl menu 0791 Metadata 0791 Metadata 0792 Metadata Tags 0792 Tags metadata 0793 Metadata View 0793 Widok metadata 0794 Metadata from Search Function 0794 Metadata z funkcji wyszukiwania 0795 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0795 Metoda 1:\nKliknij lewym przyciskiem na czerwone oko, aby przyciemnić.\nMetoda 2:\nPrzeciągnij w dół i w prawo, aby otoczyć czerwone oko.\nKliknij lewym przyciskiem na czerwone oko, aby przyciemnić.\nCofnij czerwone oko:\nKliknij prawym przyciskiem na czerwone oko. 0796 Mirror: 0796 Odbicie lustrzane: 0797 Mode: 0797 Tryb: 0798 Monitor Color 0798 Kolor monitora 0799 Mosaic 0799 Mozaika 0800 Mouse Radius 0800 Promień myszy 0801 Mouse Warp (drag image) 0801 Wypaczanie myszą (przeciągnij obraz) 0802 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0802 Przeciągnięcie myszy: obrót panoramy 360° \nKliknięcie L/P myszy: zoom (przybliż/oddal) \nEscape: zakończ widok panoramy 0803 Move %d image files 0803 Przenieś %d plików obrazów 0804 Move Fotocx Home 0804 Przenieś folder domowy Fotocx 0805 Move Fotocx Home Folder 0805 Przenieś folder domowy Fotocx 0806 Move Fotocx home folder to chosen folder 0806 Przenieś folder domowy Fotocx do wybranego folderu 0807 Move mouse in a monotone image area. 0807 Przesuń myszą w jednolitym obszarze obrazu. 0808 Multiplier 0808 Mnożnik 0809 NEW SESSION 0809 NOWA SESJA 0810 NEWEST FILES 0810 NAJNOWSZE PLIKI 0811 NEWLINE CHARACTERS IN METADATA 0811 ZNAKI NOWEJ LINII W METADATA 0812 NON-STANDARD DIALOG WIDGETS 0812 NIESTANDARDOWE WIDGETY OKIEN DIALOGOWYCH 0813 New Area 0813 Nowy obszar 0814 New File Name: 0814 Nowa nazwa pliku: 0815 New Location 0815 Nowa lokalizacja 0816 New Location: 0816 Nowa lokalizacja: 0817 New Name 0817 Nowa nazwa 0818 New Session 0818 Nowa sesja 0819 New Type: 0819 Nowy typ: 0820 New Version 0820 Nowa wersja 0821 Newest 0821 Najnowsze 0822 Newest Files 0822 Najnowsze pliki 0823 Next 0823 Dalej 0824 Next gallery 0824 Następna galeria 0825 No 0825 Nie 0826 No curve lines found 0826 Nie znaleziono linii krzywej 0827 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0827 Nie znaleziono indeksu plików obrazów.\nIndeks plików obrazów zostanie utworzony.\nTwoje pliki obrazów nie zostaną zmienione.\nMoże to zająć sporo czasu, jeśli masz \nwiele tysięcy plików obrazów. 0828 No images found 0828 Nie znaleziono obrazów 0829 Noise Reduction 0829 Redukcja szumu 0830 Noise Size 0830 Rozmiar szumu 0831 None 0831 Brak 0832 Normal Blur 0832 Rozmycie normalne 0833 Normal Blur - mix pixels with all neighbor pixels 0833 Rozmycie normalne - miesza piksele ze wszystkimi sąsiednimi pikselami 0834 OPEN IMAGE FILE 0834 OTWÓRZ PLIK OBRAZU 0835 OTHER TOPICS 0835 INNE TEMATY 0836 OUTLINES 0836 OBRYSY 0837 Old Name 0837 Stara nazwa 0838 One Tag: 0838 Jeden tag: 0839 Opacity 0839 Krycie 0840 Open 0840 Otwórz 0841 Open Image File 0841 Otwórz plik obrazu 0842 Open a file and paste as selected area into an image 0842 Otwórz plik i wklej jako wybrany obszar do obrazu 0843 Open a parallel Fotocx session 0843 Otwórz równoległą sesję Fotocx 0844 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0844 Otwórz i edytuj zeskanowany plik wykresu kolorów. \nUsuń wszelkie przekrzywienia lub obrót ze skanowania. \n(Użyj do tego funkcji Popraw perspektywę). \nDOKŁADNIE odetnij cienki zielony margines. \nZapisz (zastąp) plik wykresu kolorów. 0845 Open the trimmed color chart file 0845 Otwórz przycięty plik wykresu kolorów 0846 Optimize 0846 Optymalizuj 0847 Other Tag ... 0847 Inny tag ... 0848 Outboard Programs 0848 Programy zewnętrzne 0849 Outline Drawing 0849 Rysunek konturowy 0850 Outlines 0850 Obrysy 0851 Output Color 0851 Kolor wyjściowy 0852 Overlap 0852 Nakładanie 0853 Overlay position in host image: 0853 Pozycja nakładki w obrazie bazowym: 0854 Overlay width, % host image width: 0854 Szerokość nakładki, % szerokości obrazu bazowego: 0855 Overwrite file? \n%s 0855 Nadpisać plik? \n%s 0856 PAINT EDITS 0856 MALOWANE EDYCJE 0857 PAINT IMAGE 0857 MALUJ OBRAZ 0858 PAINT TRANSPARENCY 0858 MALUJ PRZEZROCZYSTOŚĆ 0859 PAINTING 0859 MALARSTWO 0860 PANORAMA 0860 PANORAMA 0861 PATTERN 0861 WZÓR 0862 PERSPECTIVE 0862 PERSPEKTYWA 0863 PLACES/DATES 0863 MIEJSCA/DATY 0864 PLUGINS 0864 WTYCZKI 0865 PREV/NEXT 0865 POPRZ./NAST. 0866 PRINT CALIBRATED 0866 DRUKUJ SKALIBROWANE 0867 PRINT IMAGE 0867 DRUKUJ OBRAZ 0868 PRIVACY 0868 PRYWATNOŚĆ 0869 PROBLEM FILES 0869 PROBLEMATYCZNE PLIKI 0870 PROBLEM REPORTING 0870 ZGŁASZANIE PROBLEMÓW 0871 Paint Edits 0871 Malowane edycje 0872 Paint Edits already active 0872 Malowane edycje są już aktywne 0873 Paint Image 0873 Maluj obraz 0874 Paint Image Transparencies 0874 Maluj przezroczystości obrazu 0875 Paint Radius 0875 Promień malowania 0876 Paint Transparency 0876 Maluj przezroczystość 0877 Paint and Warp Image 0877 Maluj i wypaczaj obraz 0878 Paint current edit function gradually using the mouse 0878 Maluj bieżącą funkcję edycji stopniowo za pomocą myszy 0879 Paint entire image 0879 Maluj cały obraz 0880 Paint image transparency using the mouse 0880 Maluj przezroczystość obrazu za pomocą myszy 0881 Paint on Image 0881 Maluj na obrazie 0882 Paint on image using the mouse 0882 Maluj na obrazie za pomocą myszy 0883 Paint transparency 0883 Maluj przezroczystość 0884 Paint within mouse 0884 Maluj w obrębie myszy 0885 Painting 0885 Malarstwo 0886 Panorama 0886 Panorama 0887 Paste 0887 Wklej 0888 Paste Image 0888 Wklej obraz 0889 Paste previously copied area into image 0889 Wklej wcześniej skopiowany obszar do obrazu 0890 Pattern 0890 Wzór 0891 Pattern File: 0891 Plik wzoru: 0892 Pattern Width 0892 Szerokość wzoru 0893 Percent 0893 Procent 0894 Permissions 0894 Uprawnienia 0895 Perspective 0895 Perspektywa 0896 Photo Date 0896 Data zdjęcia 0897 Photo Date/Time 0897 Data/czas zdjęcia 0898 Photo Date/Time (metadata) 0898 Data/czas zdjęcia (metadata) 0899 Photo Date: %s File Date: %s \n 0899 Data zdjęcia: %s Data pliku: %s \n 0900 Pixel count 0900 Liczba pikseli 0901 Pixel difference 0901 Różnica pikseli 0902 Pixels 0902 Piksele 0903 Places/Dates 0903 Miejsca/daty 0904 Plugin working ... 0904 Wtyczka działa ... 0905 Popup Image 0905 Wyskakujący obraz 0906 Power 0906 Moc 0907 Power Center 0907 Środek mocy 0908 Power: Center 0908 Moc: środek 0909 Pre-align Images 0909 Wstępne wyrównanie obrazów 0910 Preference: 0910 Preferencja: 0911 Press F1 for help 0911 Naciśnij F1, aby uzyskać pomoc 0912 Prev 0912 Wstecz 0913 Prev/Next 0913 Poprz./Nast. 0914 Previous 0914 Poprzedni 0915 Previous gallery 0915 Poprzednia galeria 0916 Print Calibrated 0916 Drukuj skalibrowane 0917 Print Image 0917 Drukuj obraz 0918 Print chart in vertical orientation without margins. 0918 Drukuj wykres w orientacji pionowej bez marginesów. 0919 Print current image file with calibrated colors 0919 Drukuj bieżący plik obrazu ze skalibrowanymi kolorami 0920 Print the current image file 0920 Drukuj bieżący plik obrazu 0921 Privacy 0921 Prywatność 0922 Proceed 0922 Kontynuuj 0923 Proceed? 0923 Kontynuować? 0924 Process album files matching selected files: 0924 Przetwórz pliki albumu pasujące do wybranych plików: 0925 Process an image using a custom convolution kernel 0925 Przetwórz obraz za pomocą własnego jądra konwolucji 0926 Process selected album files: 0926 Przetwórz wybrane pliki albumu: 0927 Processing files 0927 Przetwarzanie plików 0928 Project name 0928 Nazwa projektu 0929 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0929 Przeciągnij pozycję obrazu za pomocą myszy. \nWykonaj wiele przeciągnięć myszą, aż osiągniesz zadowalający efekt. \nPo zakończeniu naciśnij [OK]. 0930 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0930 Przeciągnij narożnik obrazu za pomocą myszy. \nWykonaj wiele przeciągnięć myszą, aż osiągniesz zadowalający efekt. \nPo zakończeniu naciśnij [OK]. 0931 Pull on the image with the mouse. 0931 Przeciągnij obraz za pomocą myszy. 0932 Purge unwanted keywords from all image files 0932 Usuń niechciane keywords ze wszystkich plików obrazów 0933 QUESTIONS, SUGGESTIONS 0933 PYTANIA, SUGESTIE 0934 Quit 0934 Zamknij 0935 Quit Fotocx 0935 Zamknij Fotocx 0936 Quit Fotocx? 0936 Zamknąć Fotocx? 0937 RAW Files 0937 Pliki RAW 0938 RAW Options 0938 Opcje RAW 0939 RAW conversion failed: %s %s 0939 Konwersja RAW nie powiodła się: %s %s 0940 RAW loader 0940 Loader RAW 0941 RECENT FILES 0941 OSTATNIE PLIKI 0942 RECENT FOLDERS 0942 OSTATNIE FOLDERY 0943 RED EYES 0943 CZERWONE OCZY 0944 REFINE MENU 0944 MENU DOPRACOWANIA 0945 REMOVE DUST 0945 USUŃ KURZ 0946 REMOVE HALO 0946 USUŃ HALO 0947 RENAME 0947 ZMIEŃ NAZWĘ 0948 RENAME ALBUM 0948 ZMIEŃ NAZWĘ ALBUMU 0949 REPAIR MENU 0949 MENU NAPRAWY 0950 RESCALE 0950 PRZESKALUJ 0951 RETOUCH 0951 RETUSZ 0952 RGB -> BRG 0952 RGB -> BRG 0953 RGB -> GBR 0953 RGB -> GBR 0954 RGB HISTOGRAM 0954 HISTOGRAM RGB 0955 RGB Histogram 0955 Histogram RGB 0956 RGB brightness histogram graph 0956 Wykres histogramu jasności RGB 0957 RGB color 0957 Kolor RGB 0958 RGB mix with given bit-depth 0958 Mieszanie RGB z zadaną głębią bitową 0959 ROTATE 0959 OBRÓĆ 0960 RUN SCRIPT 0960 URUCHOM SKRYPT 0961 Radial Blur 0961 Rozmycie radialne 0962 Radial Blur - mix pixels in radial lines from chosen center 0962 Rozmycie radialne - miesza piksele wzdłuż linii promienistych z wybranego środka 0963 Radius 0963 Promień 0964 Random Image 0964 Losowy obraz 0965 Range 0965 Zakres 0966 Rating: 0966 Ocena: 0967 Rating: %s Size: %s %.2fmb \n 0967 Ocena: %s Rozmiar: %s %.2fmb \n 0968 Read or search the user guide 0968 Przeczytaj lub przeszukaj podręcznik użytkownika 0969 Recent Files 0969 Ostatnie pliki 0970 Recent Folders 0970 Ostatnie foldery 0971 Recent Keywords 0971 Ostatnie keywords 0972 Rectify closeup face photo (balloon face) 0972 Prostuj zdjęcie twarzy z bliska (efekt balonika) 0973 Red 0973 Czerwony 0974 Red Eye Reduction 0974 Redukcja czerwonych oczu 0975 Red Eyes 0975 Czerwone oczy 0976 Red Factors 0976 Współczynniki czerwonego 0977 Redo 0977 Ponów 0978 Reduce Fog/Haze 0978 Redukuj mgłę/zamglenie 0979 Reduce fog/haze in an image or selected areas 0979 Redukuj mgłę/zamglenie na obrazie lub w wybranych obszarach 0980 Refine 0980 Dopracuj 0981 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0981 Dopracuj: spłaszcz histogram, kontrast lokalny, wzmocnij kontrast, retinex, nasycenie 0982 Remove 0982 Usuń 0983 Remove Dust 0983 Usuń kurz 0984 Remove Halo 0984 Usuń halo 0985 Remove dust spots from old scanned photos 0985 Usuń plamki kurzu ze starych zeskanowanych zdjęć 0986 Remove from Album 0986 Usuń z albumu 0987 Remove halos left by some edit functions 0987 Usuń halo pozostawione przez niektóre funkcje edycji 0988 Remove image curvature, especially in panoramas 0988 Usuń krzywiznę obrazu, szczególnie w panoramach 0989 Remove jaggies on hard image feature edges 0989 Usuń schodkowanie na twardych krawędziach obrazu 0990 Remove selected image metadata 0990 Usuń wybrane metadata obrazu 0991 Remove unwanted objects in an image 0991 Usuń niechciane obiekty z obrazu 0992 Rename 0992 Zmień nazwę 0993 Rename Album 0993 Zmień nazwę albumu 0994 Rename Image File 0994 Zmień nazwę pliku obrazu 0995 Rename an existing album 0995 Zmień nazwę istniejącego albumu 0996 Rename or delete keywords for all image files 0996 Zmień nazwę lub usuń keywords dla wszystkich plików obrazów 0997 Rename to 0997 Zmień nazwę na 0998 Rename/convert/rescale/move selected image or RAW files 0998 Zmień nazwę/konwertuj/przeskaluj/przenieś wybrane pliki obrazów lub RAW 0999 Repair 0999 Napraw 1000 Repair malformed metadata preventing metadata edits 1000 Napraw nieprawidłowo sformułowane metadata uniemożliwiające edycję metadata 1001 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 1001 Napraw: wyostrz, rozmyj, redukuj szum, usuń mgłę, czerwone oczy, inteligentne usuwanie, dostosuj kolor 1002 Replace 1002 Zastąp 1003 Replace Text 1003 Zamień tekst 1004 Replace all versions with newest version 1004 Zastąp wszystkie wersje najnowszą wersją 1005 Replace all versions with selected versions 1005 Zastąp wszystkie wersje wybranymi wersjami 1006 Replace all with newest version only 1006 Zastąp wszystko tylko najnowszą wersją 1007 Replace all with original + newest version 1007 Zastąp wszystko oryginałem + najnowszą wersją 1008 Replace all with original + selected versions 1008 Zastąp wszystko oryginałem + wybranymi wersjami 1009 Replace all with original and all versions 1009 Zastąp wszystko oryginałem i wszystkimi wersjami 1010 Replace all with selected versions 1010 Zastąp wszystko wybranymi wersjami 1011 Replace host files 1011 Zastąp pliki bazowe 1012 Report Image Places/Dates 1012 Raport miejsc/dat obrazów 1013 Report selected metadata for selected image files 1013 Zgłoś wybrane metadata dla wybranych plików obrazów 1014 Required programs are installed. \n 1014 Wymagane programy są zainstalowane. \n 1015 Rescale 1015 Przeskaluj 1016 Rescale Image 1016 Przeskaluj obraz 1017 Rescale RGB levels to reduce color caste and fog/haze 1017 Przeskaluj poziomy RGB, aby zredukować odcień koloru i mgłę/zamglenie 1018 Rescale brightness levels to increase local contrast 1018 Przeskaluj poziomy jasności, aby zwiększyć kontrast lokalny 1019 Rescale: 1019 Przeskaluj: 1020 Reserved Shortcuts \n 1020 Zarezerwowane skróty \n 1021 Reserved shortcut ignored: %s 1021 Zignorowano zarezerwowany skrót: %s 1022 Reset 1022 Resetuj 1023 Reset all galleries to file name ascending 1023 Zresetuj wszystkie galerie do sortowania rosnąco wg nazwy pliku 1024 Resolution 1024 Rozdzielczość 1025 Resources 1025 Zasoby 1026 Resume 1026 Wznów 1027 Retouch 1027 Retusz 1028 Reverse R 1028 Odwróć R 1029 Richardson-Lucy 1029 Richardson-Lucy 1030 Right 1030 Prawo 1031 Rim % 1031 Obwódka % 1032 Rotate 1032 Obróć 1033 Rotate Image 1033 Obróć obraz 1034 Rotate or level an image 1034 Obróć lub wypoziomuj obraz 1035 Rotate: 1035 Obrót: 1036 Roy Lichtenstein effect 1036 Efekt Roya Lichtensteina 1037 SATURATION 1037 NASYCENIE 1038 SCRIPT FILES 1038 PLIKI SKRYPTÓW 1039 SEARCH IMAGES 1039 WYSZUKAJ OBRAZY 1040 SELECT AREA 1040 WYBIERZ OBSZAR 1041 SELECT FILES 1041 WYBIERZ PLIKI 1042 SELECT IMAGE FILES 1042 WYBIERZ PLIKI OBRAZÓW 1043 SELECT MENU 1043 MENU WYBORU 1044 SET COLORS 1044 USTAW KOLORY 1045 SET WALLPAPER 1045 USTAW TAPETĘ 1046 SETTINGS 1046 USTAWIENIA 1047 SHARPEN 1047 WYOSTRZ 1048 SHIFT COLORS 1048 PRZESUŃ KOLORY 1049 SHORTCUTS 1049 SKRÓTY 1050 SHOW CIM FILES 1050 POKAŻ PLIKI CIM 1051 SHOW DIFFS 1051 POKAŻ RÓŻNICE 1052 SHOW ON MAP 1052 POKAŻ NA MAPIE 1053 SHOW RESOURCES 1053 POKAŻ ZASOBY 1054 SHOW RGB 1054 POKAŻ RGB 1055 SHOW/HIDE AREA 1055 POKAŻ/UKRYJ OBSZAR 1056 SKETCH1 1056 SZKIC1 1057 SKETCH2 1057 SZKIC2 1058 SLIDE SHOW 1058 POKAZ SLAJDÓW 1059 SLIDES AND NEGATIVES 1059 SLAJDY I NEGATYWY 1060 SLIDESHOW END 1060 KONIEC POKAZU SLAJDÓW 1061 SMART ERASE 1061 INTELIGENTNE USUWANIE 1062 SOFT FOCUS 1062 MIĘKKA OSTROŚĆ 1063 SPHERE 1063 SFERA 1064 SPLIT-SCREEN 1064 PODZIELONY EKRAN 1065 STACK/LAYERS 1065 STOS/WARSTWY 1066 STACK/NOISE 1066 STOS/SZUM 1067 STACK/PAINT 1067 STOS/MALOWANIE 1068 Saturation 1068 Nasycenie 1069 Save 1069 Zapisz 1070 Save Gallery as Album 1070 Zapisz galerię jako album 1071 Save Image File 1071 Zapisz plik obrazu 1072 Save as new file name or type 1072 Zapisz jako nową nazwę pliku lub typ 1073 Save current gallery as album 1073 Zapisz bieżącą galerię jako album 1074 Save modified image as new file or new file version 1074 Zapisz zmodyfikowany obraz jako nowy plik lub nową wersję pliku 1075 Save selected area to a file with transparency 1075 Zapisz wybrany obszar do pliku z przezroczystością 1076 Saved Areas 1076 Zapisane obszary 1077 Scale 1077 Skala 1078 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1078 Zeskanuj wydrukowany wykres kolorów, najciemniejszy wiersz na górze. \nZapisz jako plik .png, używając nazw drukarki i papieru \n(np. %s/Epson_glossy.png). \n 1079 Search 1079 Szukaj 1080 Search Images 1080 Szukaj obrazów 1081 Search Results 1081 Wyniki wyszukiwania 1082 Search all image files and report duplicates 1082 Przeszukaj wszystkie pliki obrazów i zgłoś duplikaty 1083 Searching - use ESC key to terminate 1083 Wyszukiwanie - naciśnij ESC, aby zakończyć 1084 Seconds 1084 Sekundy 1085 Select 1085 Wybierz 1086 Select %d to %d files 1086 Wybierz od %d do %d plików 1087 Select Album 1087 Wybierz album 1088 Select Albums 1088 Wybierz albumy 1089 Select Area 1089 Wybierz obszar 1090 Select Area for Edits 1090 Wybierz obszar do edycji 1091 Select Area not supported \nby this edit function 1091 Wybór obszaru nieobsługiwany \nprzez tę funkcję edycji 1092 Select Files 1092 Wybierz pliki 1093 Select Image 1093 Wybierz obraz 1094 Select Image Files 1094 Wybierz pliki obrazów 1095 Select Metadata tags 1095 Wybierz tags metadata 1096 Select Script 1096 Wybierz skrypt 1097 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1097 Wybierz obszar do wypaczenia za pomocą funkcji wyboru obszaru. \nNaciśnij [rozpocznij wypaczanie] i przeciągnij obszar myszą. \nWykonaj wiele przeciągnięć myszą, aż osiągniesz zadowalający efekt. \nPo zakończeniu wybierz inny obszar lub naciśnij [OK]. 1098 Select and Paint Image 1098 Wybierz i maluj obraz 1099 Select and view an image file 1099 Wybierz i wyświetl plik obrazu 1100 Select area cannot be kept.\nContinue? 1100 Nie można zachować wybranego obszaru.\nKontynuować? 1101 Select area disabled, Continue? 1101 Wybór obszaru wyłączony, kontynuować? 1102 Select area not finished, Continue? 1102 Wybór obszaru nie ukończony, kontynuować? 1103 Select area will be ignored. \nContinue? 1103 Wybrany obszar zostanie zignorowany. \nKontynuować? 1104 Select folder 1104 Wybierz folder 1105 Select host image files 1105 Wybierz pliki obrazów bazowych 1106 Select image areas to edit separately, copy/paste selections 1106 Wybierz obszary obrazu do osobnej edycji, kopiuj/wklej zaznaczenia 1107 Select image objects or areas for separate editing 1107 Wybierz obiekty lub obszary obrazu do osobnej edycji 1108 Select input files for subsequent function 1108 Wybierz pliki wejściowe dla kolejnej funkcji 1109 Select overlay file 1109 Wybierz plik nakładki 1110 Select startup album 1110 Wybierz album startowy 1111 Select startup folder 1111 Wybierz folder startowy 1112 Select startup image file 1112 Wybierz plik obrazu startowego 1113 Select the image file to print. 1113 Wybierz plik obrazu do wydruku. 1114 Select to add, click on X to delete. 1114 Wybierz, aby dodać, kliknij X, aby usunąć. 1115 Select two files 1115 Wybierz dwa pliki 1116 Select versions, ratings, keywords, filename text 1116 Wybierz wersje, oceny, keywords, tekst nazwy pliku 1117 Separation Horz 1117 Rozdzielenie poziome 1118 Sequence Numbers 1118 Numery sekwencji 1119 Set Colors 1119 Ustaw kolory 1120 Set No. of Colors 1120 Ustaw liczbę kolorów 1121 Set Ratio: 1121 Ustaw proporcje: 1122 Set Wallpaper 1122 Ustaw tapetę 1123 Set Width: 1123 Ustaw szerokość: 1124 Set and view bookmarks, select for gallery view 1124 Ustaw i przeglądaj zakładki, wybierz do widoku galerii 1125 Set black-white/color, negative/positive, sepia 1125 Ustaw czarno-białe/kolor, negatyw/pozytyw, sepia 1126 Set foreground line color (crop, grid, select, warp) 1126 Ustaw kolor linii pierwszego planu (kadrowanie, siatka, wybór, wypaczanie) 1127 Set gallery from latest search results 1127 Ustaw galerię z najnowszych wyników wyszukiwania 1128 Set gallery from recent folders list 1128 Ustaw galerię z listy ostatnich folderów 1129 Set gallery to folder of current file 1129 Ustaw galerię na folder bieżącego pliku 1130 Set horizontal/vertical grid line counts 1130 Ustaw liczbę poziomych/pionowych linii siatki 1131 Set image file as desktop wallpaper 1131 Ustaw plik obrazu jako tapetę pulpitu 1132 Set line properties, [Add] to layout, edit. 1132 Ustaw właściwości linii, [Dodaj] do układu, edytuj. 1133 Set number of colors for each R/G/B or total 1133 Ustaw liczbę kolorów dla każdego R/G/B lub łącznie 1134 Set or shift photo date/time for selected image files 1134 Ustaw lub przesuń datę/czas zdjęcia dla wybranych plików obrazów 1135 Set the name for the output calibration file \n[your calibration name].dat 1135 Ustaw nazwę dla wyjściowego pliku kalibracji \n[nazwa twojej kalibracji].dat 1136 Settings 1136 Ustawienia 1137 Sharpen 1137 Wyostrz 1138 Sharpen the image (various methods) 1138 Wyostrz obraz (różne metody) 1139 Shift + drag mouse across image \nto indicate blur direction 1139 Shift + przeciągnij myszą po obrazie, \naby wskazać kierunek rozmycia 1140 Shift Colors 1140 Przesuń kolory 1141 Shift/convert image colors into other colors 1141 Przesuń/przekształć kolory obrazu w inne kolory 1142 Short List 1142 Krótka lista 1143 Show 1143 Pokaż 1144 Show (outline) selected areas 1144 Pokaż (obrys) wybranych obszarów 1145 Show CIM Files 1145 Pokaż pliki CIM 1146 Show Diffs 1146 Pokaż różnice 1147 Show Fotocx installed version and author contact 1147 Pokaż zainstalowaną wersję Fotocx i kontakt do autora 1148 Show Fotocx updates for recent releases 1148 Pokaż aktualizacje Fotocx dla ostatnich wydań 1149 Show Hidden 1149 Pokaż ukryte 1150 Show Log File 1150 Pokaż plik dziennika 1151 Show RGB 1151 Pokaż RGB 1152 Show RGB levels at mouse position 1152 Pokaż poziomy RGB w pozycji myszy 1153 Show Resources 1153 Pokaż zasoby 1154 Show folder hierarchy, click folder for gallery view 1154 Pokaż hierarchię folderów, kliknij folder, aby zobaczyć galerię 1155 Show image counts in year/month table, select, report 1155 Pokaż liczbę obrazów w tabeli rok/miesiąc, wybierz, zgłoś 1156 Show image description (overlap) 1156 Pokaż opis obrazu (nakładka) 1157 Show image differences on the image 1157 Pokaż różnice obrazu na obrazie 1158 Show image file name (overlap) 1158 Pokaż nazwę pliku obrazu (nakładka) 1159 Show image title (overlap) 1159 Pokaż tytuł obrazu (nakładka) 1160 Show input files used in combine function 1160 Pokaż pliki wejściowe użyte w funkcji łączenia 1161 Show key metadata for current image or clicked thumbnail 1161 Pokaż kluczowe metadata dla bieżącego obrazu lub klikniętego thumbnail 1162 Show map position of the current image file 1162 Pokaż pozycję na mapie bieżącego pliku obrazu 1163 Show memory and CPU resources used 1163 Pokaż wykorzystywane zasoby pamięci i CPU 1164 Show on Map 1164 Pokaż na mapie 1165 Show or make Keyboard Shortcuts 1165 Pokaż lub utwórz skróty klawiszowe 1166 Show the current (last used) album 1166 Pokaż bieżący (ostatnio używany) album 1167 Show the current log file 1167 Pokaż bieżący plik dziennika 1168 Size 1168 Rozmiar 1169 Sketch1 1169 Szkic1 1170 Sketch2 1170 Szkic2 1171 Slide Show 1171 Pokaz slajdów 1172 Smart Erase 1172 Inteligentne usuwanie 1173 Soft Focus 1173 Miękka ostrość 1174 Sphere 1174 Sfera 1175 Spherical Projection 1175 Projekcja sferyczna 1176 Split-Screen 1176 Podzielony ekran 1177 Stack/Layers 1177 Stos/warstwy 1178 Stack/Noise 1178 Stos/szum 1179 Stack/Paint 1179 Stos/malowanie 1180 Stacking Order 1180 Kolejność stosu 1181 Start 1181 Start 1182 Start a slide show 1182 Rozpocznij pokaz slajdów 1183 Start of gallery 1183 Początek galerii 1184 Startup View 1184 Widok startowy 1185 Stop 1185 Stop 1186 Stretch 1186 Rozciągnij 1187 Stretch: 1187 Rozciągnięcie: 1188 Suppress JPEG compression artifacts 1188 Tłum artefakty kompresji JPEG 1189 Suppress Ringing 1189 Tłum efekt dzwonienia 1190 Suppress fine details while retaining sharpness 1190 Tłum drobne szczegóły, zachowując ostrość 1191 Suppress noise from low-light photos 1191 Tłum szum ze zdjęć w słabym świetle 1192 Survey all files 1192 Przeskanuj wszystkie pliki 1193 TEXTURE 1193 TEKSTURA 1194 THUMB VIEW 1194 WIDOK THUMB 1195 TILES1 1195 KAFELKI1 1196 TILES2 1196 KAFELKI2 1197 TIMELINE 1197 OŚ CZASU 1198 TINY PLANET 1198 TINY PLANET 1199 TOOLS MENU 1199 MENU NARZĘDZI 1200 TRANSLATIONS 1200 TŁUMACZENIA 1201 TWIST 1201 SKRĘĆ 1202 Temperature 1202 Temperatura 1203 Text 1203 Tekst 1204 Text File: 1204 Plik tekstowy: 1205 Texture 1205 Tekstura 1206 Threshold 1206 Próg 1207 Threshold: Low 1207 Próg: niski 1208 Thumbnail View 1208 Widok thumbnails 1209 Thumbnail size 1209 Rozmiar thumbnail 1210 Thumbnails folder 1210 Folder thumbnails 1211 Thumbnails folder: %s \nPlease remove. 1211 Folder thumbnails: %s \nProszę usunąć. 1212 Thumbnails folder: \n %s \nmust be named .../thumbnails 1212 Folder thumbnails: \n %s \nmusi nazywać się .../thumbnails 1213 Thumbnails: 1213 Thumbnails: 1214 Tile 1214 Kafelek 1215 Tile blending 1215 Mieszanie kafelków 1216 Tile image with a repeating pattern 1216 Wypełnij obraz kafelkami z powtarzającym się wzorem 1217 Tiles 1217 Kafelki 1218 Tiles1 1218 Kafelki1 1219 Tiles2 1219 Kafelki2 1220 Timeline 1220 Oś czasu 1221 Tiny Planet 1221 Tiny Planet 1222 Title 1222 Tytuł 1223 Title: %s\n 1223 Tytuł: %s\n 1224 To Location 1224 Do lokalizacji 1225 Toggle Captions 1225 Przełącz podpisy 1226 Toggle Grid 1226 Przełącz siatkę 1227 Toggle grid lines on and off 1227 Włącz i wyłącz linie siatki 1228 Toggle image metadata display ON/OFF 1228 Przełącz wyświetlanie metadata obrazu WŁ./WYŁ. 1229 Too little overlap, cannot align 1229 Za mało nakładania się, nie można wyrównać 1230 Too many edits, please save image 1230 Zbyt wiele edycji, proszę zapisać obraz 1231 Tools 1231 Narzędzia 1232 Tools: image index, settings, shortcuts, grid, find duplicates 1232 Narzędzia: indeks obrazów, ustawienia, skróty, siatka, znajdź duplikaty 1233 Top 1233 Góra 1234 Total Colors 1234 Łączna liczba kolorów 1235 Trace 1235 Śledź 1236 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1236 Zaznacz górną i dolną krzywą \nkliknięciami myszy, następnie [spłaszcz]. 1237 Transient Objects 1237 Obiekty przejściowe 1238 Transition Preferences 1238 Preferencje przejść 1239 Transition to next image 1239 Przejście do następnego obrazu 1240 Transitions File 1240 Plik przejść 1241 Transp. 1241 Przezr. 1242 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1242 Mapa przezroczystości zostanie utracona \n(zapisz jako TIFF|PNG|JXL, aby ją zachować) \nZapisać mimo to? 1243 Trash 1243 Kosz 1244 Trash read-only file? 1244 Wyrzucić do kosza plik tylko do odczytu? 1245 Turn an image inside-out 1245 Odwróć obraz na lewą stronę 1246 Twist 1246 Skręć 1247 Twist image centered at mouse position 1247 Skręć obraz wyśrodkowany na pozycji myszy 1248 UNBEND 1248 WYGNIJ 1249 UNDO/REDO BUTTON 1249 PRZYCISK COFNIJ/PONÓW 1250 UNWARP CLOSEUP 1250 ROZWYPACZ ZBLIŻENIE 1251 UPDATE ALBUMS 1251 AKTUALIZUJ ALBUMY 1252 UPRIGHT 1252 PROSTUJ 1253 USER GUIDE 1253 PODRĘCZNIK UŻYTKOWNIKA 1254 Unable to copy metadata 1254 Nie można skopiować metadata 1255 Unbend 1255 Wygnij 1256 Undo 1256 Cofnij 1257 Undo All 1257 Cofnij wszystko 1258 Undo Last 1258 Cofnij ostatnie 1259 Undo/Redo 1259 Cofnij/ponów 1260 Uninstall 1260 Odinstaluj 1261 Unwarp Closeup 1261 Rozwypacz zbliżenie 1262 Update Albums 1262 Aktualizuj albumy 1263 Update albums for new file versions 1263 Aktualizuj albumy dla nowych wersji plików 1264 Upright 1264 Prostuj 1265 Upright Image 1265 Prostuj obraz 1266 Upright or mirror-flip an image 1266 Prostuj lub odbij lustrzanie obraz 1267 Upright rotated image files, selected set or ALL 1267 Prostuj obrócone pliki obrazów, wybrany zestaw lub WSZYSTKIE 1268 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1268 Użyj Wybierz obszar, aby wybrać twarz. \nKliknij na środku zniekształcenia. \nPrzesuń suwak. \n 1269 Use [Select] to add files to an empty album 1269 Użyj [Wybierz], aby dodać pliki do pustego albumu 1270 Use metadata photo date or file modification date? 1270 Użyć daty zdjęcia z metadata czy daty modyfikacji pliku? 1271 Use metadata tag 1271 Użyj tag metadata 1272 Use settings file 1272 Użyj pliku ustawień 1273 User Guide 1273 Podręcznik użytkownika 1274 User preferences and settings 1274 Preferencje i ustawienia użytkownika 1275 VIDEO press P to play 1275 WIDEO naciśnij P, aby odtworzyć 1276 VIEW 360° PANO 1276 WIDOK PANORAMY 360° 1277 VIEW ALL META 1277 POKAŻ WSZYSTKIE META 1278 VIEW MAIN META 1278 POKAŻ META GŁÓWNE 1279 VIGNETTE 1279 WINIETA 1280 Var. Transparency 1280 Zm. przezroczystość 1281 Vert 1281 Pion 1282 Video Files 1282 Pliki wideo 1283 Video Tutorial 1283 Samouczek wideo 1284 Video command 1284 Polecenie wideo 1285 View 360 degree panorama image 1285 Wyświetl obraz panoramy 360 stopni 1286 View 360° Pano 1286 Widok panoramy 360° 1287 View All Meta 1287 Pokaż wszystkie meta 1288 View All Metadata 1288 Pokaż wszystkie metadata 1289 View Main Meta 1289 Pokaż meta główne 1290 View Main Metadata 1290 Pokaż metadata główne 1291 View before/after images using split-screen 1291 Wyświetl obrazy przed/po za pomocą podzielonego ekranu 1292 View/edit metadata, image report and search functions 1292 Wyświetl/edytuj metadata, funkcje raportu obrazu i wyszukiwania 1293 Vignette 1293 Winieta 1294 W/H Ratio: 1294 Proporcja Sz./Wys.: 1295 WARP AFFINE 1295 WYPACZ AFINICZNIE 1296 WARP AREA 1296 WYPACZ OBSZAR 1297 WARP CURVED 1297 WYPACZ ZAKRZYWIENIE 1298 WARP IMAGE 1298 WYPACZ OBRAZ 1299 WARP MENU 1299 MENU WYPACZANIA 1300 WARP RADIAL 1300 WYPACZ RADIALNIE 1301 WINDOW VIEWS AND MENUS 1301 WIDOKI I MENU OKNA 1302 WORLD MAP 1302 MAPA ŚWIATA 1303 Wait after zoom 1303 Czekaj po zoom 1304 Wait before filename/title/description 1304 Czekaj przed nazwą pliku/tytułem/opisem 1305 Wait before zoom 1305 Czekaj przed zoom 1306 Warp 1306 Wypacz 1307 Warp Affine 1307 Wypacz afinicznie 1308 Warp Area 1308 Wypacz obszar 1309 Warp Curved 1309 Wypacz zakrzywienie 1310 Warp Image 1310 Wypacz obraz 1311 Warp Linear1 1311 Wypacz liniowo1 1312 Warp Linear2 1312 Wypacz liniowo2 1313 Warp Radial 1313 Wypacz radialnie 1314 Warp an image with a wave pattern 1314 Wypacz obraz wzorem fali 1315 Warp image (affine) using the mouse 1315 Wypacz obraz (afinicznie) za pomocą myszy 1316 Warp image (curved) using the mouse 1316 Wypacz obraz (zakrzywienie) za pomocą myszy 1317 Warp image (linear 1) using the mouse 1317 Wypacz obraz (liniowo 1) za pomocą myszy 1318 Warp image (linear 2) using the mouse 1318 Wypacz obraz (liniowo 2) za pomocą myszy 1319 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1319 Wypaczanie: wygnij, popraw perspektywę, wypacz, rozwypacz zbliżenie, spłaszcz, przekształcenia obrazu 1320 White 1320 Biały 1321 Widen: 1321 Rozszerz: 1322 Width 1322 Szerokość 1323 Width % 1323 Szerokość % 1324 X-size 1324 Rozmiar X 1325 Yes 1325 Tak 1326 ZOOM 1326 ZOOM 1327 Zoom 1327 Zoom 1328 Zoom Center 1328 Środek zoom 1329 Zoom Speed 1329 Szybkość zoom 1330 Zoom-in 1330 Zoom-in 1331 Zoom-out 1331 Zoom-out 1332 \n %d-bits/color 1332 \n %d-bitów/kolor 1333 \n *** CANCELED \n 1333 \n *** ANULOWANO \n 1334 \n *** COMPLETED \n 1334 \n *** UKOŃCZONO \n 1335 \n *** Delete Originals *** 1335 \n *** Usuń oryginały *** 1336 \n *** Keep Originals *** 1336 \n *** Zachowaj oryginały *** 1337 \n *** Replace Originals *** 1337 \n *** Zastąp oryginały *** 1338 \n Convert to %s 1338 \n Konwertuj na %s 1339 \n Copy Metadata 1339 \n Kopiuj metadata 1340 \n Downsize within %dx%d 1340 \n Zmniejsz w granicach %dx%d 1341 \n New Location: %s 1341 \n Nowa lokalizacja: %s 1342 \n Output to %s 1342 \n Zapisz do %s 1343 \n PROCEED? 1343 \n KONTYNUOWAĆ? 1344 \n Rename to %s 1344 \n Zmień nazwę na %s 1345 \n Replace text: %s --> %s 1345 \n Zamień tekst: %s --> %s 1346 \n Rescale to %sx 1346 \n Przeskaluj do %sx 1347 \n Update Albums 1347 \n Aktualizuj albumy 1348 \n Upsize within %dx%d 1348 \n Zwiększ w granicach %dx%d 1349 \n*** CANCELED \n 1349 \n*** ANULOWANO \n 1350 \n*** COMPLETED \n 1350 \n*** UKOŃCZONO \n 1351 \n\nPROCEED? 1351 \n\nKONTYNUOWAĆ? 1352 add 1352 dodaj 1353 add after old 1353 dodaj po starym 1354 add all gallery files to list 1354 dodaj wszystkie pliki galerii do listy 1355 add current file to list 1355 dodaj bieżący plik do listy 1356 add entered text to layout 1356 dodaj wprowadzony tekst do układu 1357 add images to layout 1357 dodaj obrazy do układu 1358 add line/arrow to layout 1358 dodaj linię/strzałkę do układu 1359 add new keyword 1359 dodaj nowy keyword 1360 add or edit images 1360 dodaj lub edytuj obrazy 1361 add or edit lines/arrows 1361 dodaj lub edytuj linie/strzałki 1362 add or edit text 1362 dodaj lub edytuj tekst 1363 add to set 1363 dodaj do zestawu 1364 adder 1364 adder 1365 adjust brightness of selected image 1365 dostosuj jasność wybranego obrazu 1366 after removal of missing files: %d \n 1366 po usunięciu brakujących plików: %d \n 1367 album %s: deleted 1367 album %s: usunięty 1368 album already exists: %s 1368 album już istnieje: %s 1369 album mass update 1369 masowa aktualizacja albumu 1370 albums folder missing 1370 brak folderu albumów 1371 align and trim color chart 1371 wyrównaj i przytnij wykres kolorów 1372 all files 1372 wszystkie pliki 1373 all image files, including unmounted folders: %d \n 1373 wszystkie pliki obrazów, w tym niezamontowane foldery: %d \n 1374 all images 1374 wszystkie obrazy 1375 all versions 1375 wszystkie wersje 1376 amplify contrast 1376 wzmocnij kontrast 1377 amplitude 1377 amplituda 1378 angle 1378 kąt 1379 apply 1379 zastosuj 1380 area edge creep 1380 pełzanie krawędzi obszaru 1381 area is not finished 1381 obszar nie jest ukończony 1382 area outline color: 1382 kolor obrysu obszaru: 1383 array width is too large: %d x %d 1383 szerokość tablicy zbyt duża: %d x %d 1384 ascending 1384 rosnąco 1385 auto color 1385 automatyczny kolor 1386 background colors for file and gallery view windows 1386 kolory tła dla okien widoku pliku i galerii 1387 backing 1387 podkład 1388 bad category name 1388 nieprawidłowa nazwa kategorii 1389 bad keyword name 1389 nieprawidłowa nazwa keyword 1390 bad pattern file: %s 1390 nieprawidłowy plik wzoru: %s 1391 base 1391 base 1392 base and adder need $s plugin 1392 base i adder wymagają wtyczki $s 1393 base size 1393 rozmiar bazowy 1394 begin making a script file 1394 zacznij tworzenie pliku skryptu 1395 black/white 1395 czarno-białe 1396 black/white negative 1396 czarno-biały negatyw 1397 black/white positive 1397 czarno-biały pozytyw 1398 blend 1398 mieszanie 1399 blend edges: blend width: 1399 mieszaj krawędzie: szerokość mieszania: 1400 blend image overlaps over pixel width 1400 mieszaj nakładanie się obrazów w szerokości pikseli 1401 blend rate: center: 1401 poziom mieszania: środek: 1402 blocking function: %s 1402 funkcja blokująca: %s 1403 blocksize 1403 rozmiar bloku 1404 blur edges: blur width: 1404 rozmyj krawędzie: szerokość rozmycia: 1405 blur radius 1405 promień rozmycia 1406 borders 1406 obramowania 1407 both 'All Files' and specific files were selected 1407 wybrano jednocześnie "Wszystkie pliki" i konkretne pliki 1408 bright halo 1408 jasne halo 1409 brightness rescale 1409 przeskalowanie jasności 1410 browse 1410 przeglądaj 1411 brush size 1411 rozmiar pędzla 1412 build index, old files only 1412 buduj indeks, tylko stare pliki 1413 cancel project 1413 anuluj projekt 1414 cancel project? 1414 anulować projekt? 1415 cannot allocate %d MB memory 1415 nie można przydzielić %d MB pamięci 1416 cannot be determined 1416 nie można ustalić 1417 cannot copy a file to itself 1417 nie można skopiować pliku do niego samego 1418 cannot copy current file 1418 nie można skopiować bieżącego pliku 1419 cannot create output file 1419 nie można utworzyć pliku wyjściowego 1420 cannot create pixbuf 1420 nie można utworzyć pixbuf 1421 cannot find area outline 1421 nie można znaleźć obrysu obszaru 1422 cannot find output file 1422 nie można znaleźć pliku wyjściowego 1423 cannot load input file 1423 nie można wczytać pliku wejściowego 1424 cannot open file %s 1424 nie można otworzyć pliku %s 1425 cannot parse current file 1425 nie można przetworzyć bieżącego pliku 1426 cannot parse file 1426 nie można przetworzyć pliku 1427 cannot read pluging output file 1427 nie można odczytać pliku wyjściowego wtyczki 1428 cannot replace %s file 1428 nie można zastąpić pliku %s 1429 cannot save as RAW type 1429 nie można zapisać jako typ RAW 1430 cannot save layout file: %s 1430 nie można zapisać pliku układu: %s 1431 cannot write image folders file: %s 1431 nie można zapisać pliku folderów obrazów: %s 1432 category %s has too many keywords 1432 kategoria %s ma zbyt wiele keywords 1433 category %s is too big 1433 kategoria %s jest zbyt duża 1434 center 1434 środek 1435 change project scale 1435 zmień skalę projektu 1436 choose 1-8 clicks or [+] keys for 2x image zoom 1436 wybierz 1-8 kliknięć lub klawisze [+] dla 2x zoom obrazu 1437 choose a better spot 1437 wybierz lepsze miejsce 1438 choose an image file 1438 wybierz plik obrazu 1439 choose file 1439 wybierz plik 1440 choose files 1440 wybierz pliki 1441 choose folder 1441 wybierz folder 1442 choose folders 1442 wybierz foldery 1443 choose location 1443 wybierz lokalizację 1444 circle 1444 koło 1445 clear area selections 1445 wyczyść wybory obszarów 1446 clear entered text 1446 wyczyść wprowadzony tekst 1447 clear inputs 1447 wyczyść wprowadzone dane 1448 clear text 1448 wyczyść tekst 1449 click a defined keyword (below) to add a search keyword 1449 kliknij zdefiniowany keyword (poniżej), aby dodać keyword wyszukiwania 1450 click bright point 1450 kliknij jasny punkt 1451 click dark point 1451 kliknij ciemny punkt 1452 click on desired color 1452 kliknij żądany kolor 1453 click on image to get source color 1453 kliknij obraz, aby uzyskać kolor źródłowy 1454 click on image to set matching color 1454 kliknij obraz, aby ustawić dopasowywany kolor 1455 click on thumbnail to set zoom center 1455 kliknij thumbnail, aby ustawić środek zoom 1456 click position to add line 1456 kliknij pozycję, aby dodać linię 1457 click position to add text 1457 kliknij pozycję, aby dodać tekst 1458 click to select 1458 kliknij, aby wybrać 1459 click to unselect 1459 kliknij, aby odznaczyć 1460 clicks per 2x image increase 1460 kliknięcia na 2x powiększenie obrazu 1461 color 1461 kolor 1462 color depth 1462 głębia koloru 1463 color depth: 1463 głębia koloru: 1464 color match level % 1464 poziom dopasowania koloru % 1465 color negative 1465 negatyw koloru 1466 column difference: %d pixels 1466 różnica kolumn: %d pikseli 1467 column difference: %d pixels \nMake columns even? 1467 różnica kolumn: %d pikseli \nWyrównać kolumny? 1468 combined image files 1468 połączone pliki obrazów 1469 command: 1469 polecenie: 1470 commit all changes, close dialog 1470 zatwierdź wszystkie zmiany, zamknij okno dialogowe 1471 complete file selection first 1471 najpierw zakończ wybór pliku 1472 completed 1472 ukończono 1473 condense into color blobs 1473 kondensuj w plamy koloru 1474 condition 1474 warunek 1475 confirm Fotocx exit 1475 potwierdź zamknięcie Fotocx 1476 constant blur 1476 stałe rozmycie 1477 continue? 1477 kontynuować? 1478 converting colors... 1478 konwertowanie kolorów... 1479 converting files 1479 konwertowanie plików 1480 copy (duplicate file) 1480 kopiuj (zduplikuj plik) 1481 copy and paste commands 1481 polecenia kopiuj i wklej 1482 copy files to %s 1482 kopiuj pliki do %s 1483 copy metadata from Nth file: 1483 kopiuj metadata z N-tego pliku: 1484 copy to Desktop failed: %s 1484 kopiowanie na pulpit nie powiodło się: %s 1485 count: 0 1485 liczba: 0 1486 create folder 1486 utwórz folder 1487 create folder %s 1487 utwórz folder %s 1488 current gallery 1488 bieżąca galeria 1489 current image files found: %d \n 1489 znaleziono bieżących plików obrazów: %d \n 1490 current set only 1490 tylko bieżący zestaw 1491 current set: 1491 bieżący zestaw: 1492 curve file is invalid 1492 plik krzywej jest nieprawidłowy 1493 custom command to play video files 1493 niestandardowe polecenie do odtwarzania plików wideo 1494 dark 1494 ciemny 1495 dark halo 1495 ciemne halo 1496 dark pixels 1496 ciemne piksele 1497 data is incomplete, proceed? 1497 dane są niekompletne, kontynuować? 1498 date format is yyyy:mm:dd [hh:mm:ss] 1498 format daty to yyyy:mm:dd [hh:mm:ss] 1499 date range 1499 zakres dat 1500 days 1500 dni 1501 delete 1501 usuń 1502 delete %s \n%s 1502 usuń %s \n%s 1503 delete Mashup project files? 1503 usunąć pliki projektu Mashup? 1504 delete failed: \n%s 1504 usunięcie nie powiodło się: \n%s 1505 delete originals specified but no new name given 1505 podano usuwanie oryginałów, ale nie podano nowej nazwy 1506 delete selected text from layout 1506 usuń wybrany tekst z układu 1507 deleting orphan thumbnails ... \n 1507 usuwanie osieroconych thumbnails ... \n 1508 depth 1508 głębia 1509 descending 1509 malejąco 1510 direction of light and shadows 1510 kierunek światła i cieni 1511 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1511 wyłącz wybór thumbnail, aby włączyć menu podręczne itp. \nużyj [Włącz], aby wznowić wybór thumbnail 1512 discard changes? 1512 odrzucić zmiany? 1513 do not warp images during auto-alignment 1513 nie wypaczaj obrazów podczas automatycznego wyrównania 1514 do nothing 1514 nie rób nic 1515 dot size 1515 rozmiar kropki 1516 downsize 1516 zmniejsz 1517 drag image 1517 przeciągnij obraz 1518 drag mouse along an edge to follow the edge 1518 przeciągnij myszą wzdłuż krawędzi, aby podążać za krawędzią 1519 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1519 przeciągnij myszą w dół/w prawo, aby narysować owal \nshift + przeciągnij środek, aby przesunąć owal \nshift + przeciągnij prawy dolny róg, aby zmienić 1520 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1520 przeciągnij myszą, aby narysować prostokąt \nshift + przeciągnij środek, aby przesunąć prostokąt \nshift + przeciągnij krawędź, aby przesunąć krawędź 1521 drag mouse to outline an area 1521 przeciągnij myszą, aby obrysować obszar 1522 drag mouse to select circular or elliptical area 1522 przeciągnij myszą, aby wybrać obszar kołowy lub eliptyczny 1523 drag mouse to select rectangular area 1523 przeciągnij myszą, aby wybrać obszar prostokątny 1524 drag mouse to show selected image 1524 przeciągnij myszą, aby pokazać wybrany obraz 1525 duplicate keyword 1525 zduplikowany keyword 1526 edge distance calculation 1526 obliczanie odległości krawędzi 1527 edge: 1527 krawędź: 1528 edit 1528 edytuj 1529 edit commands 1529 edytuj polecenia 1530 edit custom shell commands, match colors to embedded jpeg image 1530 edytuj niestandardowe polecenia powłoki, dopasuj kolory do osadzonego obrazu jpeg 1531 edit this menu 1531 edytuj to menu 1532 ellipse 1532 elipsa 1533 embedded numbers will sort by value 1533 osadzone liczby będą sortowane według wartości 1534 emboss 1534 wytłoczenie 1535 enter 2-character language code: en, de, fr ... 1535 wprowadź 2-znakowy kod języka: en, de, fr ... 1536 enter a project name 1536 wprowadź nazwę projektu 1537 enter an album name 1537 wprowadź nazwę albumu 1538 enter cities/locations, countries 1538 wprowadź miasta/lokalizacje, kraje 1539 enter project name 1539 wprowadź nazwę projektu 1540 enter tag name 1540 wprowadź nazwę tag 1541 enter tag names 1541 wprowadź nazwy tags 1542 erase 1542 usuń 1543 error compensation 1543 kompensacja błędów 1544 exceed %d edits 1544 przekroczono %d edycji 1545 exceed %d images 1545 przekroczono %d obrazów 1546 exceed %d max files, cannot continue 1546 przekroczono maksymalnie %d plików, nie można kontynuować 1547 exceed %d rows 1547 przekroczono %d wierszy 1548 exceed %d selected files 1548 przekroczono %d wybranych plików 1549 exceed %d shortcuts 1549 przekroczono %d skrótów 1550 exceeded %d line entries 1550 przekroczono %d wpisów linii 1551 exceeded %d text entries 1551 przekroczono %d wpisów tekstu 1552 exceeded max. images: %d 1552 przekroczono maks. liczbę obrazów: %d 1553 exceeded max. tiles: %d 1553 przekroczono maks. liczbę kafelków: %d 1554 exit split-screen 1554 wyjdź z podzielonego ekranu 1555 expand to these limits if smaller 1555 rozszerz do tych limitów, jeśli mniejsze 1556 exporting files 1556 eksportowanie plików 1557 extra indexed metadata tags > %d 1557 dodatkowe indeksowane tags metadata > %d 1558 extra metadata tags to include in index 1558 dodatkowe tags metadata do uwzględnienia w indeksie 1559 extra metadata tags: \n 1559 dodatkowe tags metadata: \n 1560 fetch 1560 pobierz 1561 file 1561 plik 1562 file .ext names to recognize RAW files 1562 rozszerzenia plików .ext rozpoznawane jako pliki RAW 1563 file .ext names to recognize video files 1563 rozszerzenia plików .ext rozpoznawane jako pliki wideo 1564 file close error 1564 błąd zamknięcia pliku 1565 file color 1565 kolor pliku 1566 file error: %s 1566 błąd pliku: %s 1567 file format error 1567 błąd formatu pliku 1568 file format error: %s 1568 błąd formatu pliku: %s 1569 file included: %s \n 1569 plik uwzględniony: %s \n 1570 file metadata update failed 1570 aktualizacja metadata pliku nie powiodła się 1571 file name 1571 nazwa pliku 1572 file names 1572 nazwy plików 1573 file not found 1573 nie znaleziono pliku 1574 file not found \n 1574 nie znaleziono pliku \n 1575 file not found: %s 1575 nie znaleziono pliku: %s 1576 file not found: %s %s 1576 nie znaleziono pliku: %s %s 1577 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1577 typy plików: .jp2 .heic .avif .webp \nstaną się: .jpg - KONTYNUOWAĆ? 1578 file: %s \nexceed 99 versions 1578 plik: %s \nprzekracza 99 wersji 1579 filename text 1579 tekst nazwy pliku 1580 files in %s can be deleted 1580 pliki w %s można usunąć 1581 fill from current gallery 1581 wypełnij z bieżącej galerii 1582 fill from selected files 1582 wypełnij z wybranych plików 1583 fill selected areas 1583 wypełnij wybrane obszary 1584 fill transparent areas 1584 wypełnij przezroczyste obszary 1585 find all image files ...\n 1585 wyszukiwanie wszystkich plików obrazów ...\n 1586 find and report all unreadable image files 1586 znajdź i zgłoś wszystkie nieodczytywalne pliki obrazów 1587 find outline gap 1587 znajdź lukę w obrysie 1588 find via table lookup 1588 znajdź poprzez wyszukiwanie w tabeli 1589 find_imagefiles() failure \n 1589 błąd find_imagefiles() \n 1590 find_imagefiles() failure: %s \n 1590 błąd find_imagefiles(): %s \n 1591 finish current edit first 1591 najpierw zakończ bieżącą edycję 1592 finish making a script file 1592 zakończ tworzenie pliku skryptu 1593 finish or cancel pending edit 1593 zakończ lub anuluj oczekującą edycję 1594 fix box in layout and start new box 1594 zatwierdź prostokąt w układzie i rozpocznij nowy prostokąt 1595 fix line in layout and start new line 1595 zatwierdź linię w układzie i rozpocznij nową linię 1596 fix motion blur 1596 napraw rozmycie ruchu 1597 fix oval in layout and start new oval 1597 zatwierdź owal w układzie i rozpocznij nowy owal 1598 follow edge 1598 podążaj za krawędzią 1599 font name and size for menus and dilogs 1599 nazwa i rozmiar czcionki dla menu i okien dialogowych 1600 force a full re-index of all image files 1600 wymuś pełne ponowne zindeksowanie wszystkich plików obrazów 1601 format: yyyy:mm:dd [hh:mm:ss] 1601 format: yyyy:mm:dd [hh:mm:ss] 1602 fotocx will exit 1602 fotocx zostanie zamknięty 1603 found %d pixels 1603 znaleziono %d pikseli 1604 free disk space: %d GB \n 1604 wolne miejsce na dysku: %d GB \n 1605 freehand draw 1605 rysowanie odręczne 1606 ftruncate() failure: %s 1606 błąd ftruncate(): %s 1607 full image index: reports will be complete \n 1607 pełny indeks obrazów: raporty będą kompletne \n 1608 function canceled 1608 funkcja anulowana 1609 gallery 1609 galeria 1610 gallery is empty 1610 galeria jest pusta 1611 gallery truncated to %d images 1611 galeria obcięta do %d obrazów 1612 get images having text in filename (comma separated) 1612 pobierz obrazy zawierające tekst w nazwie pliku (rozdzielone przecinkami) 1613 get images with matching keywords (comma separated) 1613 pobierz obrazy z pasującymi keywords (rozdzielone przecinkami) 1614 get images within rating range 1614 pobierz obrazy w zakresie ocen 1615 gradual paint 1615 stopniowe malowanie 1616 grid counts not 0-100: %s 1616 liczby siatki poza zakresem 0-100: %s 1617 grid picklist file error: %s 1617 błąd pliku listy siatki: %s 1618 grid size 1618 rozmiar siatki 1619 group 1619 grupa 1620 height 1620 wysokość 1621 hide area outlines 1621 ukryj obrysy obszarów 1622 hide transient objects 1622 ukryj obiekty przejściowe 1623 high 1623 wysoki 1624 home folder was not changed 1624 folder domowy nie został zmieniony 1625 horizontal 1625 poziomo 1626 hours 1626 godziny 1627 icons only, text only, or both 1627 tylko ikony, tylko tekst lub oba 1628 if image < window, center or shift left or right 1628 jeśli obraz < okno, wyśrodkuj lub przesuń w lewo lub w prawo 1629 ignore differences above limit 1629 ignoruj różnice powyżej limitu 1630 image blend 1630 mieszanie obrazu 1631 image files 1631 pliki obrazów 1632 image for source color 1632 obraz dla koloru źródłowego 1633 image index records found: %d \n 1633 znaleziono rekordów indeksu obrazów: %d \n 1634 image index required 1634 wymagany indeks obrazów 1635 image index write error: %s 1635 błąd zapisu indeksu obrazów: %s 1636 image is too large to edit: %d x %d 1636 obraz zbyt duży do edycji: %d x %d 1637 image is too large: %dx%d, %lld megapix 1637 obraz jest zbyt duży: %dx%d, %lld megapikseli 1638 image is too small to edit: %d x %d 1638 obraz zbyt mały do edycji: %d x %d 1639 image scale 1639 skala obrazu 1640 image to set matching color 1640 obraz do ustawienia dopasowywanego koloru 1641 image width must be greater than height 1641 szerokość obrazu musi być większa niż wysokość 1642 images to report 1642 obrazy do zgłoszenia 1643 include all files 1643 uwzględnij wszystkie pliki 1644 include edited versions 1644 uwzględnij edytowane wersje 1645 include last versions only 1645 uwzględnij tylko ostatnie wersje 1646 include original files 1646 uwzględnij pliki oryginalne 1647 include transparent areas 1647 uwzględnij przezroczyste obszary 1648 include: 1648 uwzględnij: 1649 increase blur with distance 1649 zwiększaj rozmycie wraz z odległością 1650 index completed, %.1f seconds \n 1650 indeksowanie ukończone, %.1f sekund \n 1651 index config file error: %s 1651 błąd pliku konfiguracji indeksu: %s 1652 index updates needed: %d thumbnails: %d \n 1652 wymagane aktualizacje indeksu: %d thumbnails: %d \n 1653 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1653 aktualizacje indeksu: %d aktualizacje tytułu/opisu: %d \naktualizacje thumbnails: %d, usunięcia: %d \n 1654 input 1654 wejście 1655 input file: %s \n 1655 plik wejściowy: %s \n 1656 insufficient memory, cannot proceed 1656 niewystarczająca pamięć, nie można kontynuować 1657 insufficient overlap for color matching 1657 niewystarczające nakładanie się do dopasowania koloru 1658 invalid GPS data 1658 nieprawidłowe dane GPS 1659 invalid GPS data: %s 1659 nieprawidłowe dane GPS: %s 1660 invalid album 1660 nieprawidłowy album 1661 invalid date range: %s %s 1661 nieprawidłowy zakres dat: %s %s 1662 invalid date/time format 1662 nieprawidłowy format daty/czasu 1663 invalid file 1663 nieprawidłowy plik 1664 invalid plugin: %s 1664 nieprawidłowa wtyczka: %s 1665 invalid rating range 1665 nieprawidłowy zakres ocen 1666 invalid source file: %s 1666 nieprawidłowy plik źródłowy: %s 1667 invert area 1667 odwróć obszar 1668 jpeg quality level - 70+ for good image quality 1668 poziom jakości jpeg - 70+ dla dobrej jakości obrazu 1669 keyboard 1669 klawiatura 1670 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1670 sterowanie klawiaturą: \nEsc: zakończ trwający pokaz slajdów \nstrzałki: poprzedni/następny obraz \nB: wygaś/przywróć okno \nN: przejście do następnego obrazu \nP: pauza / wznów \nX: powiększ w pozycji myszy 1671 keyword names 1671 nazwy keywords 1672 keywords to add 1672 keywords do dodania 1673 keywords to remove 1673 keywords do usunięcia 1674 keywords_defined file error: %s 1674 błąd pliku keywords_defined: %s 1675 last search 1675 ostatnie wyszukiwanie 1676 last version 1676 ostatnia wersja 1677 last versions 1677 ostatnie wersje 1678 layout exceeds 4 gigabytes 1678 układ przekracza 4 gigabajty 1679 layout file missing: %s 1679 brak pliku układu: %s 1680 left 1680 lewo 1681 left click on image for selected color 1681 kliknij lewym przyciskiem na obrazie dla wybranego koloru 1682 left click: set image source location \nright click: set corresponding destination 1682 kliknięcie lewym: ustaw lokalizację źródłową obrazu \nkliknięcie prawym: ustaw odpowiadającą lokalizację docelową 1683 left drag: add transparency \nright drag: add opacity 1683 przeciągnięcie lewym: dodaj przezroczystość \nprzeciągnięcie prawym: dodaj krycie 1684 left drag: copy image to mouse position \nright drag: restore original image 1684 przeciągnięcie lewym: skopiuj obraz do pozycji myszy \nprzeciągnięcie prawym: przywróć oryginalny obraz 1685 left drag: reduce halo, right drag: undo 1685 przeciągnięcie lewym: zredukuj halo, przeciągnięcie prawym: cofnij 1686 lens mm 1686 obiektyw mm 1687 level based on EXIF roll angle 1687 wypoziomuj na podstawie kąta przechyłu EXIF 1688 light 1688 jasny 1689 light pixels 1689 jasne piksele 1690 line 1690 linia 1691 line color 1691 kolor linii 1692 line width 1692 szerokość linii 1693 load 1693 wczytaj 1694 load text data from a file 1694 wczytaj dane tekstowe z pliku 1695 load widgets failed: %s 1695 wczytanie widgetów nie powiodło się: %s 1696 loading palette ... 1696 wczytywanie palety ... 1697 location is not a folder 1697 lokalizacja nie jest folderem 1698 locations 1698 lokalizacje 1699 lock width/height ratio 1699 zablokuj proporcje szerokości/wysokości 1700 log file is in a terminal 1700 plik dziennika znajduje się w terminalu 1701 low 1701 niski 1702 low contrast 1702 niski kontrast 1703 lower 1703 niższy 1704 make an initially empty album 1704 utwórz początkowo pusty album 1705 make new version 1705 utwórz nową wersję 1706 manual align 1706 ręczne wyrównanie 1707 map marker (red dot) diameter, pixels 1707 średnica znacznika mapy (czerwona kropka), piksele 1708 map selected areas and verify 1708 zmapuj wybrane obszary i zweryfikuj 1709 mashup project 1709 projekt mashup 1710 match embedded image color 1710 dopasuj kolor osadzonego obrazu 1711 match image color to base image (repeat) 1711 dopasuj kolor obrazu do obrazu bazowego (powtórz) 1712 match values 1712 dopasuj wartości 1713 matches 1713 dopasowania 1714 max keywords exceeded 1714 przekroczono maks. liczbę keywords 1715 max. Width 1715 maks. szerokość 1716 max. album count exceeded: %d 1716 przekroczono maks. liczbę albumów: %d 1717 max. album files reached, results truncated 1717 osiągnięto maks. liczbę plików albumu, wyniki obcięte 1718 max. album size exceeded: %d 1718 przekroczono maks. rozmiar albumu: %d 1719 max. blur radius 1719 maks. promień rozmycia 1720 max. brightness 1720 maks. jasność 1721 max. image limit reached: %d 1721 osiągnięto limit maks. obrazów: %d 1722 max. width or height is not reasonable 1722 maks. szerokość lub wysokość jest nierozsądna 1723 maximum clip allowed to fit window 1723 maksymalne obcięcie dozwolone, aby dopasować do okna 1724 mean RGB: %5.0f %5.0f %5.0f 1724 średnie RGB: %5.0f %5.0f %5.0f 1725 mean noise: %5.2f %5.2f %5.2f 1725 średni szum: %5.2f %5.2f %5.2f 1726 median 1726 mediana 1727 median diff 1727 różnica mediany 1728 menu text and background colors 1728 kolory tekstu i tła menu 1729 metadata 1729 metadata 1730 metadata copy failed 1730 kopiowanie metadata nie powiodło się 1731 metadata from Search Function, metadata report 1731 metadata z funkcji wyszukiwania, raport metadata 1732 metadata picklist file not found %s 1732 nie znaleziono pliku listy wyboru metadata %s 1733 metadata tags to report 1733 tags metadata do zgłoszenia 1734 metadata update error 1734 błąd aktualizacji metadata 1735 metadata update error \n 1735 błąd aktualizacji metadata \n 1736 metadata update error: %s 1736 błąd aktualizacji metadata: %s 1737 metadata update failed \n 1737 aktualizacja metadata nie powiodła się \n 1738 min. blur radius 1738 min. promień rozmycia 1739 min. contrast 1739 min. kontrast 1740 min. edit curve node separation, % of scale length 1740 min. odstęp węzłów krzywej edycji, % długości skali 1741 min. separation, %c of scale 1741 min. odstęp, %c skali 1742 minutes 1742 minuty 1743 mmap() failure: %s 1743 błąd mmap(): %s 1744 months 1744 miesiące 1745 more than %d categories 1745 więcej niż %d kategorii 1746 more than 20 matches 1746 więcej niż 20 dopasowań 1747 mouse radius 1747 promień myszy 1748 mouse radius for color sample 1748 promień myszy dla próbki koloru 1749 mouse radius: 1749 promień myszy: 1750 move (delete original) 1750 przenieś (usuń oryginał) 1751 move area boundary in/out in 1-pixel steps 1751 przesuń granicę obszaru do wewnątrz/na zewnątrz w krokach 1-pikselowych 1752 move to next input file 1752 przejdź do następnego pliku wejściowego 1753 move to trash failed \n 1753 przeniesienie do kosza nie powiodło się \n 1754 move to trash failed: %s 1754 przeniesienie do kosza nie powiodło się: %s 1755 multiply 1755 mnóż 1756 must have 4 corners 1756 musi mieć 4 narożniki 1757 need numeric match value: %s 1757 wymagana wartość liczbowa dopasowania: %s 1758 negative 1758 negatyw 1759 new album created 1759 utworzono nowy album 1760 new album name 1760 nazwa nowego albumu 1761 new file 1761 nowy plik 1762 new file ... 1762 nowy plik ... 1763 new file name is invalid 1763 nowa nazwa pliku jest nieprawidłowa 1764 new file type 1764 nowy typ pliku 1765 new home folder contains a blank 1765 nowy folder domowy zawiera spację 1766 new location 1766 nowa lokalizacja 1767 new location is not a folder 1767 nowa lokalizacja nie jest folderem 1768 new version 1768 nowa wersja 1769 newest files 1769 najnowsze pliki 1770 no EXIF orientation data 1770 brak danych orientacji EXIF 1771 no active Select Area 1771 brak aktywnego Wybierz obszar 1772 no albums selected 1772 nie wybrano albumów 1773 no auto warp 1773 bez automatycznego wypaczania 1774 no change 1774 brak zmian 1775 no current album 1775 brak bieżącego albumu 1776 no current edit image 1776 brak bieżącego obrazu edycji 1777 no current file 1777 brak bieżącego pliku 1778 no curve (scanned image) 1778 brak krzywej (zeskanowany obraz) 1779 no description 1779 brak opisu 1780 no file selected 1780 nie wybrano pliku 1781 no files found 1781 nie znaleziono plików 1782 no files selected 1782 nie wybrano plików 1783 no host files selected 1783 nie wybrano plików bazowych 1784 no image index: reports disabled \n 1784 brak indeksu obrazów: raporty wyłączone \n 1785 no images 1785 brak obrazów 1786 no images found 1786 nie znaleziono obrazów 1787 no input files available 1787 brak dostępnych plików wejściowych 1788 no matching files found 1788 nie znaleziono pasujących plików 1789 no matching locations 1789 nie znaleziono pasujących lokalizacji 1790 no metadata level data 1790 brak danych poziomu metadata 1791 no metadata tags to report 1791 brak tags metadata do zgłoszenia 1792 no option selected 1792 nie wybrano opcji 1793 no overlay file selected 1793 nie wybrano pliku nakładki 1794 no photo date, skipped 1794 brak daty zdjęcia, pominięto 1795 no plugin output file found 1795 nie znaleziono pliku wyjściowego wtyczki 1796 no prior edit 1796 brak poprzedniej edycji 1797 no prior edit image 1797 brak obrazu poprzedniej edycji 1798 no saved folders 1798 brak zapisanych folderów 1799 no script file was started 1799 nie rozpoczęto żadnego pliku skryptu 1800 no script files found 1800 nie znaleziono plików skryptu 1801 no select area 1801 brak wybranego obszaru 1802 no selection 1802 brak zaznaczenia 1803 no title 1803 brak tytułu 1804 no write permission 1804 brak uprawnień do zapisu 1805 no write permission \n 1805 brak uprawnień do zapisu \n 1806 no write permission: %s 1806 brak uprawnień do zapisu: %s 1807 none 1807 brak 1808 not a known image file 1808 nie jest znanym plikiem obrazu 1809 not an image file 1809 nie jest plikiem obrazu 1810 not an indexed image file \n 1810 nie jest zindeksowanym plikiem obrazu \n 1811 nothing found 1811 nic nie znaleziono 1812 nothing left, no change made 1812 nic nie pozostało, nie wprowadzono zmian 1813 old file 1813 stary plik 1814 old image index: reports will omit new files \n 1814 stary indeks obrazów: raporty pominą nowe pliki \n 1815 old keyword name >> new keyword name 1815 stara nazwa keyword >> nowa nazwa keyword 1816 omit high pixel 1816 pomiń wysoki piksel 1817 omit low pixel 1817 pomiń niski piksel 1818 only %d tile images found 1818 znaleziono tylko %d obrazów kafelków 1819 opacity center 1819 krycie środka 1820 opacity edge 1820 krycie krawędzi 1821 open album 1821 otwórz album 1822 open and process color chart 1822 otwórz i przetwórz wykres kolorów 1823 open as new current file 1823 otwórz jako nowy bieżący plik 1824 optional deselect color 1824 opcjonalny kolor odznaczenia 1825 original 1825 oryginał 1826 originals 1826 oryginały 1827 other 1827 inne 1828 out of space for temp files \nsave your edits and quit Fotocx 1828 brak miejsca na pliki tymczasowe \nzapisz swoje edycje i zamknij Fotocx 1829 outline 1829 obrys 1830 output file exists 1830 plik wyjściowy istnieje 1831 output file exists, overwrite? 1831 plik wyjściowy istnieje, nadpisać? 1832 output file size change, cannot use select area 1832 zmiana rozmiaru pliku wyjściowego, nie można użyć wyboru obszaru 1833 output file: 1833 plik wyjściowy: 1834 output file: %s \n 1834 plik wyjściowy: %s \n 1835 oval 1835 owal 1836 overlay file missing: %s 1836 brak pliku nakładki: %s 1837 owner 1837 właściciel 1838 paint 1838 maluj 1839 paint color 1839 kolor malowania 1840 paint edits cannot be used for this method 1840 malowanych edycji nie można użyć dla tej metody 1841 paint over transparent areas 1841 maluj nad przezroczystymi obszarami 1842 paint radius 1842 promień malowania 1843 palette 1843 paleta 1844 palette exceeds %d color limit 1844 paleta przekracza limit %d kolorów 1845 palette file 1845 plik palety 1846 palette has %d colors 1846 paleta ma %d kolorów 1847 palette loaded, %d colors 1847 wczytano paletę, %d kolorów 1848 palette: 1848 paleta: 1849 patch area goal 1849 cel obszaru łaty 1850 percent 1850 procent 1851 perform edits to include in the script file 1851 wykonaj edycje do uwzględnienia w pliku skryptu 1852 permissions: 1852 uprawnienia: 1853 perspective 1853 perspektywa 1854 photo 1854 zdjęcie 1855 picklist file not found: %s 1855 nie znaleziono pliku listy wyboru: %s 1856 pixel = mean of best match neighbors 1856 piksel = średnia najlepiej dopasowanych sąsiadów 1857 pixel = median of all neighbors 1857 piksel = mediana wszystkich sąsiadów 1858 please make a choice 1858 proszę dokonać wyboru 1859 plugin command failed 1859 polecenie wtyczki nie powiodło się 1860 plugin menu not found %s 1860 nie znaleziono menu wtyczki %s 1861 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1861 wtyczki: (rok miesiąc dzień stara-nazwa sekwencja) $yyyy $mm $dd $oldname $s 1862 popup_choose: empty list 1862 popup_choose: pusta lista 1863 position with mouse click/drag 1863 pozycja za pomocą kliknięcia/przeciągnięcia myszy 1864 position: 50 50 1864 pozycja: 50 50 1865 position: x=%02d y=%02d 1865 pozycja: x=%02d y=%02d 1866 power 1866 moc 1867 power center 1867 środek mocy 1868 power edge 1868 krawędź mocy 1869 power: center 1869 moc: środek 1870 pref 1870 pref 1871 previous file 1871 poprzedni plik 1872 previous name 1872 poprzednia nazwa 1873 print color chart 1873 drukuj wykres kolorów 1874 print select area(s) only? 1874 drukować tylko wybrane obszary? 1875 prior edit step 1875 poprzedni krok edycji 1876 project complete 1876 projekt ukończony 1877 project file is defective 1877 plik projektu jest uszkodzony 1878 project name cannot have quote characters 1878 nazwa projektu nie może zawierać znaków cudzysłowu 1879 pure RGB or black/white dots 1879 czyste kropki RGB lub czarno-białe 1880 quality 1880 jakość 1881 quality level (70+) 1881 poziom jakości (70+) 1882 radius 1882 promień 1883 radius: 1883 promień: 1884 random 1884 losowo 1885 random position 1885 losowa pozycja 1886 rating range 1886 zakres ocen 1887 reading image index file ...\n 1887 wczytywanie pliku indeksu obrazów ...\n 1888 recent files 1888 ostatnie pliki 1889 reduce bright 1889 zredukuj jasność 1890 reduce dark 1890 zredukuj ciemność 1891 reduce to these limits if larger 1891 zredukuj do tych limitów, jeśli większe 1892 refresh 1892 odśwież 1893 remove %d duplicates? 1893 usunąć %d duplikatów? 1894 remove all files in list 1894 usuń wszystkie pliki z listy 1895 remove duplicate 1895 usuń duplikat 1896 remove from set 1896 usuń z zestawu 1897 remove panorama image curving 1897 usuń zakrzywienie obrazu panoramy 1898 remove selected file from list 1898 usuń wybrany plik z listy 1899 rename keywords 1899 zmień nazwy keywords 1900 repair metadata for %s 1900 napraw metadata dla %s 1901 replace 1901 zastąp 1902 replace album %s ? 1902 zastąpić album %s ? 1903 replace file 1903 zastąp plik 1904 replace old 1904 zastąp stary 1905 replace old file (OVERWRITE) 1905 zastąp stary plik (NADPISZ) 1906 replace substring within file name 1906 zamień podciąg w nazwie pliku 1907 report type: 1907 typ raportu: 1908 req. color match 1908 wym. dopasowanie koloru 1909 reset 1909 resetuj 1910 resolution 1910 rozdzielczość 1911 resume from current image 1911 wznów od bieżącego obrazu 1912 right 1912 prawo 1913 right click on image for deselected color 1913 kliknij prawym przyciskiem na obrazie dla odznaczonego koloru 1914 sample % 1914 próbka % 1915 save 1915 zapisz 1916 save Mashup output file 1916 zapisz plik wyjściowy Mashup 1917 save Mashup project? 1917 zapisać projekt Mashup? 1918 save area as a PNG file 1918 zapisz obszar jako plik PNG 1919 save as new file name or type 1919 zapisz jako nową nazwę pliku lub typ 1920 save as new file version 1920 zapisz jako nową wersję pliku 1921 save edit, start new text 1921 zapisz edycję, rozpocznij nowy tekst 1922 save metadata to image file 1922 zapisz metadata do pliku obrazu 1923 save text data to a file 1923 zapisz dane tekstowe do pliku 1924 save to .heic/.avif file not supported 1924 zapis do pliku .heic/.avif nieobsługiwany 1925 save to .jp2 file not supported 1925 zapis do pliku .jp2 nieobsługiwany 1926 save to .webp file not supported 1926 zapis do pliku .webp nieobsługiwany 1927 scan and save color chart 1927 zeskanuj i zapisz wykres kolorów 1928 scanned color chart file 1928 zeskanowany plik wykresu kolorów 1929 scope of neighbor pixels 1929 zakres sąsiednich pikseli 1930 script already started 1930 skrypt już rozpoczęty 1931 script complete 1931 skrypt ukończony 1932 script error: %s, %s 1932 błąd skryptu: %s, %s 1933 script file closed 1933 plik skryptu zamknięty 1934 script file error 1934 błąd pliku skryptu 1935 script file format error: %s 1935 błąd formatu pliku skryptu: %s 1936 script file name too big 1936 nazwa pliku skryptu zbyt długa 1937 script file to run 1937 plik skryptu do uruchomienia 1938 search for names in image location metadata 1938 szukaj nazw w metadata lokalizacji obrazu 1939 search for text within file folders or file name 1939 szukaj tekstu w folderach plików lub nazwie pliku 1940 search for text within image title or description 1940 szukaj tekstu w tytule lub opisie obrazu 1941 search known locations 1941 przeszukaj znane lokalizacje 1942 search range 1942 zakres wyszukiwania 1943 search: 1943 szukaj: 1944 seconds 1944 sekundy 1945 seconds to show with text 1945 sekundy pokazywania z tekstem 1946 seconds to show without text 1946 sekundy pokazywania bez tekstu 1947 select all 1947 wybierz wszystko 1948 select all colors within mouse (flood) 1948 wybierz wszystkie kolory w obrębie myszy (wypełnienie) 1949 select area missing or not finished 1949 brak lub nieukończony wybór obszaru 1950 select area within mouse 1950 wybierz obszar w obrębie myszy 1951 select area within mouse circle 1951 wybierz obszar w obrębie koła myszy 1952 select base image for color matching 1952 wybierz obraz bazowy do dopasowania kolorów 1953 select by color, required match level 1953 wybierz według koloru, wymagany poziom dopasowania 1954 select by color, search range 1954 wybierz według koloru, zakres wyszukiwania 1955 select font 1955 wybierz czcionkę 1956 select image to show with mouse paint 1956 wybierz obraz do pokazania przy malowaniu myszą 1957 select images randomly 1957 wybierz obrazy losowo 1958 select initial files 1958 wybierz pliki początkowe 1959 select line color 1959 wybierz kolor linii 1960 select one color within mouse 1960 wybierz jeden kolor w obrębie myszy 1961 select rectangle 1961 wybierz prostokąt 1962 select source image color first 1962 najpierw wybierz kolor obrazu źródłowego 1963 select surrounding areas matching colors in mouse 1963 wybierz otaczające obszary o pasujących kolorach w obrębie myszy 1964 selection exceeds %d tags 1964 wybór przekracza %d tags 1965 sepia 1965 sepia 1966 set a new date/time: 1966 ustaw nową datę/czas: 1967 set all 1967 ustaw wszystko 1968 set current window size 1968 ustaw bieżący rozmiar okna 1969 set image color from input files 1969 ustaw kolor obrazu z plików wejściowych 1970 set location from world map 1970 ustaw lokalizację z mapy świata 1971 set maximum crop 1971 ustaw maksymalne kadrowanie 1972 shadow 1972 cień 1973 shell command used for converting RAW files to RGB 1973 polecenie powłoki używane do konwersji plików RAW na RGB 1974 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1974 shift + kliknięcie lewym: pobierz kolor z obrazu \nprzeciągnięcie lewym: maluj kolorem na obrazie \nprzeciągnięcie prawym: przywróć oryginalny obraz 1975 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1975 shift + kliknięcie lewym: zsynchronizuj pozycję kopiowania \nprzeciągnięcie lewym: skopiuj obraz źródłowy do myszy \nprzeciągnięcie prawym: przywróć oryginalny obraz 1976 shift existing date/time (+/–): 1976 przesuń istniejącą datę/czas (+/–): 1977 shift+click on image to select color 1977 shift+kliknięcie na obrazie, aby wybrać kolor 1978 shortcut function not found: %s 1978 nie znaleziono funkcji skrótu: %s 1979 shortcut key: 1979 klawisz skrótu: 1980 shortcut not found: %s 1980 nie znaleziono skrótu: %s 1981 show area outlines 1981 pokaż obrysy obszarów 1982 show hidden files and folders 1982 pokaż ukryte pliki i foldery 1983 show transient objects 1983 pokaż obiekty przejściowe 1984 size of mouse selection circle 1984 rozmiar koła wyboru myszy 1985 smooth 1985 wygładź 1986 source file: 1986 plik źródłowy: 1987 source image failure (scale too big?) 1987 błąd obrazu źródłowego (skala zbyt duża?) 1988 source image scale 1988 skala obrazu źródłowego 1989 specify a thumbnail folder 1989 podaj folder thumbnail 1990 specify at least 1 top image folder 1990 podaj przynajmniej 1 folder główny obrazów 1991 specify background size and color 1991 podaj rozmiar i kolor tła 1992 specify files and keywords 1992 podaj pliki i keywords 1993 spot size limit 1993 limit rozmiaru plamki 1994 start 1994 start 1995 start a new script file 1995 rozpocznij nowy plik skryptu 1996 start album 1996 album startowy 1997 start blob condensation process 1997 rozpocznij proces kondensacji plam 1998 start file 1998 plik startowy 1999 start folder 1999 folder startowy 2000 start from first image in album 2000 zacznij od pierwszego obrazu w albumie 2001 start fusion process 2001 rozpocznij proces fuzji 2002 start over at end of album 2002 zacznij od nowa na końcu albumu 2003 start warp 2003 rozpocznij wypaczanie 2004 start with previous image file, gallery of recent files, etc. 2004 zacznij od poprzedniego pliku obrazu, galerii ostatnich plików itp. 2005 startup album is invalid 2005 album startowy jest nieprawidłowy 2006 startup file is invalid 2006 plik startowy jest nieprawidłowy 2007 startup folder is invalid 2007 folder startowy jest nieprawidłowy 2008 status: %s \n 2008 stan: %s \n 2009 status: completed \n 2009 stan: ukończono \n 2010 stay open 2010 pozostaw otwarte 2011 step 2011 krok 2012 stop 2012 stop 2013 stop blob condensation process 2013 zatrzymaj proces kondensacji plam 2014 stop fusion process 2014 zatrzymaj proces fuzji 2015 supply a file name 2015 podaj nazwę pliku 2016 tag name 2016 nazwa tag 2017 tag name %s not in xmeta tag list 2017 nazwa tag %s nie znajduje się na liście tags xmeta 2018 tag value 2018 wartość tag 2019 target file: 2019 plik docelowy: 2020 template 2020 szablon 2021 test: show changes, do not update files 2021 test: pokaż zmiany, nie aktualizuj plików 2022 text 2022 tekst 2023 text file is defective 2023 plik tekstowy jest uszkodzony 2024 text time 2024 czas tekstu 2025 this function cannot be scripted 2025 ta funkcja nie może być skryptowana 2026 thumbnail file 2026 plik thumbnail 2027 thumbnails deleted: %d \n 2027 usunięto thumbnails: %d \n 2028 thumbnails folder: %s \n 2028 folder thumbnails: %s \n 2029 tile area goal 2029 cel obszaru kafelka 2030 tile gap 2030 odstęp kafelków 2031 tile size 2031 rozmiar kafelka 2032 time 2032 czas 2033 title/desc. 2033 tytuł/opis. 2034 to add images to current set, \nsearch all images 2034 aby dodać obrazy do bieżącego zestawu, \nprzeszukaj wszystkie obrazy 2035 to remove images from current set, \nsearch current set 2035 aby usunąć obrazy z bieżącego zestawu, \nprzeszukaj bieżący zestaw 2036 too many categories 2036 zbyt wiele kategorii 2037 too many files, cannot continue 2037 zbyt wiele plików, nie można kontynuować 2038 too many keywords in a category 2038 zbyt wiele keywords w kategorii 2039 top image folders: \n 2039 foldery główne obrazów: \n 2040 transition 2040 przejście 2041 transitions 2041 przejścia 2042 trash 2042 kosz 2043 trimmed color chart file 2043 przycięty plik wykresu kolorów 2044 unable to save bookmarks file 2044 nie można zapisać pliku zakładek 2045 unknown edit function: %s 2045 nieznana funkcja edycji: %s 2046 unknown file type 2046 nieznany typ pliku 2047 unknown or empty album: %s 2047 nieznany lub pusty album: %s 2048 unsharp mask 2048 maska wyostrzająca 2049 update 2049 aktualizuj 2050 updating albums ...\n 2050 aktualizowanie albumów ...\n 2051 upper 2051 górny 2052 upsize 2052 zwiększ 2053 use 2053 użyj 2054 use a saved Mashup project 2054 użyj zapisanego projektu Mashup 2055 use average 2055 użyj średniej 2056 use custom color palette 2056 użyj niestandardowej palety kolorów 2057 use median 2057 użyj mediany 2058 use option to stop accidental quit 2058 użyj opcji, aby zapobiec przypadkowemu zamknięciu 2059 use previous input 2059 użyj poprzedniego wejścia 2060 use previous location 2060 użyj poprzedniej lokalizacji 2061 use prior edit step: 2061 użyj poprzedniego kroku edycji: 2062 use the current image file 2062 użyj bieżącego pliku obrazu 2063 variance 2063 wariancja 2064 versions 2064 wersje 2065 vertical 2065 pionowo 2066 video files not supported (install ffmpeg) 2066 pliki wideo nieobsługiwane (zainstaluj ffmpeg) 2067 view album 2067 wyświetl album 2068 waiting 2068 oczekiwanie 2069 warp 2069 wypacz 2070 warp and align selected image with mouse drags 2070 wypacz i wyrównaj wybrany obraz przeciągnięciami myszy 2071 warp and fine-align selected image with neighbor 2071 wypacz i precyzyjnie wyrównaj wybrany obraz z sąsiadem 2072 warp span 2072 zasięg wypaczania 2073 wavelength 2073 długość fali 2074 width 2074 szerokość 2075 writing updated image index file \n 2075 zapisywanie zaktualizowanego pliku indeksu obrazów \n 2076 x-count 2076 liczba x 2077 x-offset 2077 przesunięcie x 2078 y-count 2078 liczba y 2079 y-offset 2079 przesunięcie y 2080 years 2080 lata 2081 you can close this window now \n 2081 możesz teraz zamknąć to okno \n 2082 you cannot use new name and replace text together 2082 nie można jednocześnie użyć nowej nazwy i zamiany tekstu 2083 you must use either $s or $oldname 2083 musisz użyć $s lub $oldname 2084 zoom image 2084 zoom obrazu 2085 zoom via mouse wheel or Keys +/=/-/↑/↓ 2085 zoom za pomocą kółka myszy lub klawiszy +/=/-/↑/↓ 2086 zoom-in 2086 zoom-in 2087 zoom-out 2087 zoom-out fotocx/data/translations/gui_ko0000664000175000017500000037611215247006657015702 0ustar micomico0000 + Zoom-in \n 0000 + 확대(zoom-in) \n 0001 - Zoom-out \n 0001 - 축소(zoom-out) \n 0002 = Zoom-in \n 0002 = 확대(zoom-in) \n 0003 Arrow keys Previous/Next file \n 0003 방향키 이전/다음 파일 \n 0004 Delete Delete/Trash file \n 0004 Delete 파일 삭제/휴지통으로 이동 \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Escape 대화 상자 닫기 / Fotocx 종료 \n 0006 F1 User Guide, Context Help \n 0006 F1 사용자 안내서, 상황별 도움말 \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 전체 화면 / 메뉴 숨기기 \n 0008 Home/End Gallery start/end \n 0008 Home/End 갤러리 처음/끝으로 이동 \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 색인 작업 시간은 이미지 파일의 개수, 종류, 크기와 \n 컴퓨터 속도에 따라 달라집니다. 분당 \n 수백 개에서 만 개 이상까지 처리될 수 있습니다. \n 색인 옵션은 다음 메뉴에서 나중에 변경할 수 있습니다: \n 도구 > 색인, 도구 > 설정. \n 0010 Page keys Gallery page up/down \n 0010 Page 키 갤러리 페이지 위/아래로 이동 \n 0011 Z 1x <--> fit to window \n 0011 Z 1배 <--> 창에 맞춤 \n 0012 $s plugin needs base and adder 0012 $s 플러그인에는 base와 adder가 필요합니다 0013 % from left: 0013 % 왼쪽에서: 0014 % from top: 0014 % 위에서: 0015 %d albums selected 0015 앨범 %d개 선택됨 0016 %d image files selected 0016 이미지 파일 %d개 선택됨 0017 %d images 0017 이미지 %d개 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 keyword %d개를 삭제합니다 \n이미지 파일 %d개에서. \n계속하시겠습니까? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 keyword %d개의 이름을 바꿉니다 \n이미지 파일 %d개에서. \n계속하시겠습니까? 0020 %d max images exceeded 0020 최대 이미지 개수(%d개)를 초과했습니다 0021 %d red-eye limit reached 0021 적목 현상 제한(%d개)에 도달했습니다 0022 %s %s %d folders %d files 0022 %s %s 폴더 %d개 파일 %d개 0023 %s *** date/time conversion failed \n 0023 %s *** 날짜/시간 변환 실패 \n 0024 %s ALBUM %s %d files 0024 %s 앨범 %s 파일 %d개 0025 %s NEWEST FILES 0025 %s 최신 파일 0026 %s RECENT FILES 0026 %s 최근 파일 0027 %s SEARCH RESULTS %d files 0027 %s 검색 결과 파일 %d개 0028 %s UNKNOWN 0028 %s 알 수 없음 0029 %s added to script 0029 %s이(가) 스크립트에 추가됨 0030 %s is already indexed 0030 %s은(는) 이미 색인되어 있습니다 0031 %s renamed: %s 0031 %s 이름 변경됨: %s 0032 %s: metadata update failed 0032 %s: metadata 업데이트 실패 0033 %s: no write permission 0033 %s: 쓰기 권한 없음 0034 %s: reserved, cannot be used 0034 %s: 예약됨, 사용할 수 없음 0035 %s: too many keywords 0035 %s: keyword가 너무 많음 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\n촬영 날짜: %s 파일 날짜: %s \n평점: %s 크기: %s %.2fmb \n위치: %s %s %s \nKeywords: %s \n제목: %s \n설명: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\n촬영 날짜: %s 파일 날짜: %s \n평점: %s 크기: %s %.2fmb \n위치: %s %s %s \nKeywords: %s \n제목: %s \n설명: %s \n----------------------- \n%s 0038 (click below) 0038 (아래를 클릭하세요) 0039 (no selection) 0039 (선택 없음) 0040 (pixels) 0040 (픽셀) 0041 (press key) 0041 (키를 누르세요) 0042 (select function) 0042 (기능 선택) 0043 *** bad utf8 detected *** \n 0043 *** 잘못된 utf8 감지됨 *** \n 0044 *** cannot create new file \n 0044 *** 새 파일을 만들 수 없습니다 \n 0045 *** cannot get real path of input file \n 0045 *** 입력 파일의 실제 경로를 가져올 수 없습니다 \n 0046 *** cannot load input file \n 0046 *** 입력 파일을 불러올 수 없습니다 \n 0047 *** cannot make new version of input file \n 0047 *** 입력 파일의 새 버전을 만들 수 없습니다 \n 0048 *** cannot open input file 0048 *** 입력 파일을 열 수 없습니다 0049 *** cannot read input file 0049 *** 입력 파일을 읽을 수 없습니다 0050 *** cannot save output file \n 0050 *** 출력 파일을 저장할 수 없습니다 \n 0051 *** completed \n 0051 *** 완료됨 \n 0052 *** file date/time invalid \n 0052 *** 파일 날짜/시간이 잘못되었습니다 \n 0053 *** file type not supported \n 0053 *** 지원되지 않는 파일 형식입니다 \n 0054 *** invalid file \n 0054 *** 잘못된 파일입니다 \n 0055 *** metadata update error \n 0055 *** metadata 업데이트 오류 \n 0056 *** no date/time available \n 0056 *** 사용 가능한 날짜/시간이 없습니다 \n 0057 + bright 0057 + 밝게 0058 +Blue -Yellow 0058 +파랑 -노랑 0059 +Brightness 0059 +밝기 0060 +Green -Magenta 0060 +초록 -마젠타 0061 +Red -Cyan 0061 +빨강 -시안 0062 - blue 0062 - 파랑 0063 - fog/haze 0063 - 안개/뿌옇게 0064 .heic/.avif files not supported (install heif_convert) 0064 .heic/.avif 파일은 지원되지 않습니다 (heif_convert 설치 필요) 0065 .jp2 files not supported (install opj_decompress) 0065 .jp2 파일은 지원되지 않습니다 (opj_decompress 설치 필요) 0066 .webp files not supported (install dwebp) 0066 .webp 파일은 지원되지 않습니다 (dwebp 설치 필요) 0067 0 albums selected 0067 앨범 0개 선택됨 0068 0 duplicates 0068 중복 0개 0069 0-5 stars 0069 0~5점 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = 이미지 색인 없음, 이전 색인만 사용, 이전 색인 + 새/수정된 항목 업데이트 0071 2-character code 0071 2자리 코드 0072 3D depth 0072 3D 깊이 0073 <2 images 0073 이미지 2개 미만 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 새로운 Fotocx 버전이 설치되고 있습니다. \n사용자 지정 설정을 복원해야 할 수 있습니다. 0075 ADD GLARE 0075 눈부심 효과 추가 0076 ADD NOISE 0076 노이즈 추가 0077 ADJUST HSL 0077 HSL 조정 0078 ADJUST RGB 0078 RGB 조정 0079 ALBUM MASS UPDATE 0079 앨범 일괄 업데이트 0080 ALBUMS 0080 앨범 0081 ALBUMS MENU 0081 앨범 메뉴 0082 ALIEN COLORS 0082 에일리언 컬러 0083 AMPLIFY CONTRAST 0083 대비 증폭 0084 ANTI-ALIAS 0084 안티앨리어스 0085 AREA BLEND 0085 영역 블렌드 0086 AREA FILL 0086 영역 채우기 0087 AREA OVERVIEW 0087 영역 개요 0088 AUTOSEARCH 0088 자동 검색 0089 About 0089 정보 0090 Action 0090 작업 0091 Add 0091 추가 0092 Add 1 0092 1개 추가 0093 Add All 0093 모두 추가 0094 Add Current 0094 현재 항목 추가 0095 Add Current File Here 0095 여기에 현재 파일 추가 0096 Add Glare 0096 눈부심 효과 추가 0097 Add Image 0097 이미지 추가 0098 Add Line 0098 선 추가 0099 Add Margins 0099 여백 추가 0100 Add Noise 0100 노이즈 추가 0101 Add Random Noise 0101 무작위 노이즈 추가 0102 Add Selected Files Here 0102 여기에 선택한 파일 추가 0103 Add Texture 0103 텍스처 추가 0104 Add a brightness/color ramp across an image 0104 이미지 전체에 밝기/색상 그라데이션 추가 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 북마크 추가: 갤러리 thumbnail을 클릭하세요. \n북마크 이름 바꾸기: 클릭 후 [이름 바꾸기]를 누르세요 0106 Add glare around bright objects 0106 밝은 물체 주위에 눈부심 효과 추가 0107 Add margins around an image 0107 이미지 주위에 여백 추가 0108 Add newest version to existing versions 0108 최신 버전을 기존 버전에 추가 0109 Add overlay image (e.g. copyright) to selected images 0109 선택한 이미지에 오버레이 이미지 추가 (예: 저작권 표시) 0110 Add random noise to an image 0110 이미지에 무작위 노이즈 추가 0111 Add selected versions to existing versions 0111 선택한 버전을 기존 버전에 추가 0112 Add texture to an image 0112 이미지에 텍스처 추가 0113 Add to Selection 0113 선택 항목에 추가 0114 Add/change/delete metadata for selected image files 0114 선택한 이미지 파일의 metadata 추가/변경/삭제 0115 Add/remove barrel/pincushion distortion 0115 배럴/핀쿠션 왜곡 추가/제거 0116 Add/remove brightness/color radially from chosen center 0116 선택한 중심에서 방사형으로 밝기/색상 추가/제거 0117 Add/remove keywords for selected image files 0117 선택한 이미지 파일의 keyword 추가/제거 0118 Add/revise location/geocoordinates for selected image files 0118 선택한 이미지 파일의 위치/geotag 정보 추가/수정 0119 Adjust HSL 0119 HSL 조정 0120 Adjust Image Contributions 0120 이미지 기여도 조정 0121 Adjust Pixel Composition 0121 픽셀 구성 조정 0122 Adjust RGB 0122 RGB 조정 0123 Adjust brightness, contrast, color 0123 밝기, 대비, 색상 조정 0124 Adjust color saturation based on brightness 0124 밝기에 따라 색 채도 조정 0125 Adjust color using HSL color model 0125 HSL 색상 모델을 사용해 색상 조정 0126 Adjust color using RGB or CMY colors 0126 RGB 또는 CMY 색상을 사용해 색상 조정 0127 Adjustment 0127 조정 0128 Album Mass Update 0128 앨범 일괄 업데이트 0129 Album Name 0129 앨범 이름 0130 Albums 0130 앨범 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 앨범: 선택한 이미지의 갤러리, 드래그 앤 드롭으로 정렬 0132 Algorithm Iterations 0132 알고리즘 반복 횟수 0133 Alien Colors 0133 에일리언 컬러 0134 All 0134 전체 0135 All Areas 0135 모든 영역 0136 All files 0136 모든 파일 0137 All image files will be re-indexed. \nContinue? 0137 모든 이미지 파일이 다시 색인됩니다. \n계속하시겠습니까? 0138 All±1 0138 전체±1 0139 All±10 0139 전체±10 0140 Alpha 0140 알파 0141 Amount 0141 양 0142 Amplify 0142 증폭 0143 Amplify Contrast 0143 대비 증폭 0144 Amplify area contrast to enhance visibility of details 0144 세부 사항이 잘 보이도록 영역 대비 증폭 0145 Angle 0145 각도 0146 Anti-Alias 0146 안티앨리어스 0147 Apply 0147 적용 0148 Apply a soft focus effect to an image 0148 이미지에 소프트 포커스 효과 적용 0149 Apply repeatedly while watching the image. 0149 이미지를 보면서 반복 적용하세요. 0150 Area Blend 0150 영역 블렌드 0151 Area Edge Blend 0151 영역 경계 블렌드 0152 Area Fill 0152 영역 채우기 0153 Arrange images and text in a layout (photo-montage) 0153 이미지와 텍스트를 레이아웃에 배치 (포토 몽타주) 0154 Array Complete 0154 배열 완료 0155 Array Width 0155 배열 너비 0156 Arrow head 0156 화살촉 0157 Auto Level 0157 자동 레벨 0158 Auto black level 0158 자동 블랙 레벨 0159 Auto crop: 0159 자동 자르기: 0160 Auto white balance 0160 자동 화이트 밸런스 0161 Auto-replay 0161 자동 재생 0162 BATCH CHANGE META 0162 metadata 일괄 변경 0163 BATCH CONVERT 0163 일괄 변환 0164 BATCH COPY/MOVE 0164 일괄 복사/이동 0165 BATCH DELETE/TRASH 0165 일괄 삭제/휴지통 0166 BATCH GEOTAGS 0166 geotag 일괄 설정 0167 BATCH KEYWORDS 0167 keyword 일괄 처리 0168 BATCH MENU 0168 일괄 메뉴 0169 BATCH OVERLAY 0169 오버레이 일괄 적용 0170 BATCH PHOTO DATE 0170 촬영 날짜 일괄 설정 0171 BATCH PROCESSING 0171 일괄 처리 0172 BATCH PURGE KEYWORDS 0172 keyword 일괄 삭제 0173 BATCH RENAME KEYWORDS 0173 keyword 일괄 이름 변경 0174 BATCH REPORT META 0174 metadata 일괄 보고 0175 BATCH SCRIPT 0175 일괄 스크립트 0176 BATCH UPRIGHT 0176 업라이트 일괄 적용 0177 BLANK IMAGE 0177 빈 이미지 0178 BLUR 0178 블러 0179 BOOKMARKS 0179 북마크 0180 BRIGHTNESS RAMP 0180 밝기 그라데이션 0181 Background 0181 배경 0182 Background Blur - blur relative to distance from foreground 0182 배경 블러 - 전경과의 거리에 비례해 블러 적용 0183 Background Color 0183 배경 색상 0184 Background Pattern 0184 배경 패턴 0185 Base Transparency 0185 기본 투명도 0186 Batch 0186 일괄 0187 Batch Add/Change Metadata 0187 metadata 일괄 추가/변경 0188 Batch Add/Remove Keywords 0188 keyword 일괄 추가/제거 0189 Batch Change Meta 0189 metadata 일괄 변경 0190 Batch Convert 0190 일괄 변환 0191 Batch Copy/Move 0191 일괄 복사/이동 0192 Batch Delete/Trash 0192 일괄 삭제/휴지통 0193 Batch Geotags 0193 geotag 일괄 설정 0194 Batch Keywords 0194 keyword 일괄 처리 0195 Batch Metadata 0195 metadata 일괄 처리 0196 Batch Overlay 0196 오버레이 일괄 적용 0197 Batch Photo Date 0197 촬영 날짜 일괄 설정 0198 Batch Photo Date/Time 0198 촬영 날짜/시간 일괄 설정 0199 Batch Purge Keywords 0199 keyword 일괄 삭제 0200 Batch Rename Keywords 0200 keyword 일괄 이름 변경 0201 Batch Report Meta 0201 metadata 일괄 보고 0202 Batch Report Metadata 0202 metadata 일괄 보고 0203 Batch Set Geotags 0203 geotag 일괄 설정 0204 Batch Upright 0204 업라이트 일괄 적용 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 일괄 처리: 복사, 이동, 변환, RAW 변환, metadata 추가/변경 0206 Bend and fine-align 0206 구부리기 및 정밀 정렬 0207 Bias 0207 편향 0208 Black 0208 검정 0209 Blank Image 0209 빈 이미지 0210 Blend 0210 블렌드 0211 Blend 0% 0211 블렌드 0% 0212 Blend Width 0212 블렌드 너비 0213 Blend area edits/edges using the mouse 0213 마우스로 영역 편집/경계 블렌드 0214 Blend: 0% 0214 블렌드: 0% 0215 Blue 0215 파랑 0216 Blue Factors 0216 파랑 계수 0217 Blur 0217 블러 0218 Blur Angle (degrees) 0218 블러 각도 (도) 0219 Blur Background 0219 배경 블러 0220 Blur Image 0220 이미지 블러 0221 Blur Mix 0221 블러 혼합 0222 Blur Normal 0222 일반 블러 0223 Blur Radius 0223 블러 반경 0224 Blur Span 0224 블러 범위 0225 Blur Span (pixels) 0225 블러 범위 (픽셀) 0226 Blur the image (various methods) 0226 이미지 블러 (다양한 방법) 0227 Bookmarks 0227 북마크 0228 Both 0228 둘 다 0229 Bottom 0229 아래쪽 0230 Bright Limit 0230 밝음 한계 0231 Bright Point 0231 밝은 점 0232 Brightness 0232 밝기 0233 Brightness Histogram 0233 밝기 히스토그램 0234 Brightness Ramp 0234 밝기 그라데이션 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 밝기는 가장자리까지 완만한 \n그라데이션을 보여야 합니다. 0236 Browse 0236 찾아보기 0237 CALIBRATE PRINTER 0237 프린터 보정 0238 CAPTIONS 0238 캡션 0239 CARTOON 0239 카툰 0240 CHOOSE ALBUM 0240 앨범 선택 0241 CLEAR AREA 0241 영역 지우기 0242 CLOSE 0242 닫기 0243 COLOR MODE 0243 색상 모드 0244 COMBINE MENU 0244 결합 메뉴 0245 COMMAND PARAMETERS 0245 명령줄 매개변수 0246 COMPLETED 0246 완료됨 0247 COPY FROM IMAGE 0247 이미지에서 복사 0248 COPY IN IMAGE 0248 이미지 내 복사 0249 COPY META 0249 metadata 복사 0250 COPY PRIOR EDIT 0250 이전 편집 복사 0251 COPY TO CLIPBOARD 0251 클립보드에 복사 0252 COPY TO DESKTOP 0252 데스크톱에 복사 0253 COPY/MOVE 0253 복사/이동 0254 COPY/PASTE AREA 0254 영역 복사/붙여넣기 0255 CREATE ALBUM 0255 앨범 만들기 0256 CROP 0256 자르기 0257 CROSSHATCH 0257 크로스해치 0258 CURRENT ALBUM 0258 현재 앨범 0259 CURRENT FILE FOLDER 0259 현재 파일 폴더 0260 CURVE EDITING 0260 곡선 편집 0261 CUSTOM KERNEL 0261 사용자 지정 커널 0262 CUSTOM MENU 0262 사용자 지정 메뉴 0263 CYCLE 2 FILES 0263 파일 2개 순환 0264 CYCLE 3 FILES 0264 파일 3개 순환 0265 Calculate 0265 계산 0266 Calculate Geometry 0266 형상 계산 0267 Calibrate Printer 0267 프린터 보정 0268 Cancel 0268 취소 0269 Cartoon 0269 카툰 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 주의: 관련 항목이 함께 업데이트되도록 하려면 \n여기서 tag를 변경할 때는 "주 metadata 편집" \n기능을 사용하세요. 0271 Center 0271 중앙 0272 Center Hole 0272 중앙 구멍 0273 Change 0273 변경 0274 Change Log 0274 변경 내역 0275 Change file name 0275 파일 이름 변경 0276 Change gallery sort order 0276 갤러리 정렬 순서 변경 0277 Change image colors using an algorithm 0277 알고리즘을 사용해 이미지 색상 변경 0278 Change image pixel dimensions 0278 이미지 픽셀 크기 변경 0279 Chart to adjust monitor color 0279 모니터 색상 조정을 위한 차트 0280 Choose 0280 선택 0281 Choose Album 0281 앨범 선택 0282 Choose Albums 0282 앨범 선택 0283 Choose Captions 0283 캡션 선택 0284 Choose an album and show as gallery of images 0284 앨범을 선택해 이미지 갤러리로 표시 0285 Choose metadata shown on image captions 0285 이미지 캡션에 표시할 metadata 선택 0286 Choose new Fotocx home folder 0286 새 Fotocx 홈 폴더 선택 0287 Choose thumbnail folder 0287 thumbnail 폴더 선택 0288 Choose top image folders 0288 최상위 이미지 폴더 선택 0289 Clear 0289 지우기 0290 Clear All 0290 모두 지우기 0291 Click dark spot for black level 0291 블랙 레벨을 지정하려면 어두운 지점을 클릭하세요 0292 Click for RGB histogram 0292 RGB 히스토그램을 보려면 클릭하세요 0293 Click gray spot for white balance 0293 화이트 밸런스를 지정하려면 회색 지점을 클릭하세요 0294 Click image to select pixels 0294 이미지를 클릭해 픽셀 선택 0295 Click image to select, drag image to move. 0295 이미지를 클릭해 선택하고, 드래그해 이동하세요. 0296 Click mouse to change center 0296 마우스를 클릭해 중심 변경 0297 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0297 영역 윤곽선 근처의 아무 지점이나 클릭하세요. \n윤곽선의 빈틈을 찾아냅니다. \n도움말을 보려면 F1을 누르세요 0298 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0298 사각 영역의 네 모서리를 클릭하세요. [적용]을 누르세요. \n이미지가 왜곡되어 사각형이 직사각형으로 변환됩니다. 0299 Click thumbnail to select file 0299 파일을 선택하려면 thumbnail을 클릭하세요 0300 Clip Level 0300 클립 레벨 0301 Clip Limit % 0301 클립 한계 % 0302 Color 0302 색상 0303 Color Chooser 0303 색상 선택 0304 Color Depth: 0304 색상 심도: 0305 Color Fringes 0305 색 번짐 0306 Color Hue 0306 색조 0307 Color Map File 0307 색상 맵 파일 0308 Color Match Images 0308 이미지 색상 맞추기 0309 Color Mode 0309 색상 모드 0310 Color calibration tool for printer and paper type 0310 프린터 및 용지 종류를 위한 색상 보정 도구 0311 Color map file to use 0311 사용할 색상 맵 파일 0312 Combine 0312 결합 0313 Combine 2-6 images into a wide panorama image 0313 이미지 2~6개를 넓은 파노라마 이미지로 결합 0314 Combine many images into an array of images 0314 여러 이미지를 이미지 배열로 결합 0315 Combine multiple images in layers, select and expose layers 0315 여러 이미지를 레이어로 결합, 레이어 선택 및 표시 0316 Combine multiple noisy photos into a low-noise image 0316 노이즈가 있는 여러 사진을 결합해 노이즈가 적은 이미지 생성 0317 Combine multiple photos to erase passing people, etc. 0317 여러 사진을 결합해 지나가는 사람 등을 지우기 0318 Combine within 0318 결합 범위 0319 Combine: HDR, HDF, stack, panorama, mashup, image array 0319 결합: HDR, HDF, 스택, 파노라마, 매시업, 이미지 배열 0320 Command Params 0320 명령줄 매개변수 0321 Commit 0321 커밋 0322 Confirm Exit 0322 종료 확인 0323 Contrast 0323 대비 0324 Contrast All 0324 전체 대비 0325 Contrast Blue 0325 파랑 대비 0326 Contrast Green 0326 초록 대비 0327 Contrast Limit 0327 대비 한계 0328 Contrast Red 0328 빨강 대비 0329 Convert %d image files 0329 이미지 파일 %d개 변환 0330 Convert an image into a Tiny Planet image 0330 이미지를 타이니 플래닛 이미지로 변환 0331 Convert image into a cartoon drawing 0331 이미지를 카툰 그림으로 변환 0332 Convert image into a crosshatch sketch 0332 이미지를 크로스해치 스케치로 변환 0333 Convert image into a line drawing 0333 이미지를 선 그림으로 변환 0334 Convert image into a simulated painting 0334 이미지를 모의 회화로 변환 0335 Convert image into a simulated sketch (1) 0335 이미지를 모의 스케치(1)로 변환 0336 Convert image into a simulated sketch (2) 0336 이미지를 모의 스케치(2)로 변환 0337 Convert image into black/white lines 0337 이미지를 흑백 선으로 변환 0338 Convert image into dithered dots 0338 이미지를 디더링된 점으로 변환 0339 Convert image into square tiles with 3D effect 0339 이미지를 3D 효과가 있는 정사각형 타일로 변환 0340 Convert image into tiles matching feature contours 0340 이미지를 특징 윤곽에 맞춘 타일로 변환 0341 Copy 0341 복사 0342 Copy %d image files 0342 이미지 파일 %d개 복사 0343 Copy From Image 0343 이미지에서 복사 0344 Copy Meta 0344 metadata 복사 0345 Copy Metadata 0345 metadata 복사 0346 Copy Prior Edit 0346 이전 편집 복사 0347 Copy Within Image 0347 이미지 내 복사 0348 Copy area for later pasting into image 0348 나중에 이미지에 붙여넣을 영역 복사 0349 Copy areas from another image using the mouse 0349 마우스로 다른 이미지에서 영역 복사 0350 Copy areas from prior edits using the mouse 0350 마우스로 이전 편집에서 영역 복사 0351 Copy areas within an image using the mouse 0351 마우스로 이미지 내 영역 복사 0352 Copy image file to the clipboard 0352 이미지 파일을 클립보드에 복사 0353 Copy image file to the desktop 0353 이미지 파일을 데스크톱에 복사 0354 Copy in Image 0354 이미지 내 복사 0355 Copy metadata from one image to another 0355 한 이미지에서 다른 이미지로 metadata 복사 0356 Copy or Move Image File 0356 이미지 파일 복사 또는 이동 0357 Copy or Move image file to new location 0357 이미지 파일을 새 위치로 복사 또는 이동 0358 Copy to Clipboard 0358 클립보드에 복사 0359 Copy to Desktop 0359 데스크톱에 복사 0360 Copy without unsaved changes? 0360 저장하지 않은 변경 사항 없이 복사할까요? 0361 Copy/Move 0361 복사/이동 0362 Copy/move selected image files to a new folder 0362 선택한 이미지 파일을 새 폴더로 복사/이동 0363 Copyright 0363 저작권 0364 Create 0364 만들기 0365 Create Album 0365 앨범 만들기 0366 Create Blank Image 0366 빈 이미지 만들기 0367 Create Mosaic 0367 모자이크 만들기 0368 Create a blank image 0368 빈 이미지 만들기 0369 Create a mosaic with tiles made from all images 0369 모든 이미지로 만든 타일로 모자이크 만들기 0370 Create a new album (ordered set of image files) 0370 새 앨범(정렬된 이미지 파일 집합) 만들기 0371 Create an embossed or 3D appearance 0371 엠보싱 또는 3D 효과 만들기 0372 Create or replace an album 0372 앨범 만들기 또는 바꾸기 0373 Crop 0373 자르기 0374 Crop (trim) image margins 0374 이미지 여백 자르기 0375 Crop Buttons 0375 자르기 버튼 0376 Crop Image 0376 이미지 자르기 0377 Crosshatch 0377 크로스해치 0378 Crosshatch Sketch 0378 크로스해치 스케치 0379 Current Album 0379 현재 앨범 0380 Current File Folder 0380 현재 파일 폴더 0381 Current gallery 0381 현재 갤러리 0382 Current image: 0382 현재 이미지: 0383 Curve Node 0383 곡선 노드 0384 Curve lines need at least 4 points 0384 곡선에는 최소 4개의 점이 필요합니다 0385 Custom 0385 사용자 지정 0386 Custom Kernel 0386 사용자 지정 커널 0387 Custom Shortcuts \n 0387 사용자 지정 단축키 \n 0388 Custom menu: favorite/frequent functions, scripts, plugins 0388 사용자 지정 메뉴: 자주 쓰는 기능, 스크립트, 플러그인 0389 Customize 0389 사용자 지정 0390 Customize: 0390 사용자 지정: 0391 Cut Bottom 0391 아래쪽 자르기 0392 Cut Top 0392 위쪽 자르기 0393 Cycle 2 Files 0393 파일 2개 순환 0394 Cycle 2 Prior Files 0394 이전 파일 2개 순환 0395 Cycle 3 Files 0395 파일 3개 순환 0396 Cycle 3 Prior Files 0396 이전 파일 3개 순환 0397 Cycle through images: 0397 이미지 순환: 0398 DARK/BRIGHT PIXELS 0398 어둡거나 밝은 픽셀 0399 DEFOG 0399 안개 제거 0400 DELETE ALBUM 0400 앨범 삭제 0401 DELETE META 0401 metadata 삭제 0402 DELETE/TRASH 0402 삭제/휴지통 0403 DENOISE 0403 노이즈 제거 0404 DIALOG BUTTONS 0404 대화 상자 버튼 0405 DITHER 0405 디더 0406 DRAG AND DROP 0406 드래그 앤 드롭 0407 Dark Areas 0407 어두운 영역 0408 Dark Limit 0408 어둠 한계 0409 Dark Point 0409 어두운 점 0410 Dark/Bright Pixels 0410 어둡거나 밝은 픽셀 0411 Data file 0411 데이터 파일 0412 Define keywords used for searching images 0412 이미지 검색에 사용할 keyword 정의 0413 Defined Keywords: 0413 정의된 Keywords: 0414 Defog 0414 안개 제거 0415 Delete 0415 삭제 0416 Delete Album 0416 앨범 삭제 0417 Delete Meta 0417 metadata 삭제 0418 Delete Metadata 0418 metadata 삭제 0419 Delete Originals 0419 원본 삭제 0420 Delete an album 0420 앨범 삭제 0421 Delete or Trash selected image files 0421 선택한 이미지 파일 삭제 또는 휴지통으로 이동 0422 Delete or trash an image file 0422 이미지 파일 삭제 또는 휴지통으로 이동 0423 Delete read-only file? 0423 읽기 전용 파일을 삭제할까요? 0424 Delete/Trash 0424 삭제/휴지통 0425 Denoise 0425 노이즈 제거 0426 Depth 0426 깊이 0427 Desc. 0427 설명 0428 Description: %s\n 0428 설명: %s\n 0429 Desktop 0429 데스크톱 0430 Dialog Font 0430 대화 상자 글꼴 0431 Diffs 0431 차이점 0432 Directed Blur 0432 방향 블러 0433 Directed Blur - blur locally in direction of mouse drag 0433 방향 블러 - 마우스 드래그 방향으로 국소 블러 적용 0434 Disable 0434 사용 안 함 0435 Disable areas for editing 0435 편집용 영역 사용 안 함 0436 Discard unsaved changes? 0436 저장하지 않은 변경 사항을 버릴까요? 0437 Discard unsaved edits? 0437 저장하지 않은 편집 내용을 버릴까요? 0438 Distort image areas using the mouse 0438 마우스로 이미지 영역 왜곡 0439 Dither 0439 디더 0440 Dither Image 0440 이미지 디더링 0441 Dither0 0441 디더0 0442 Dither1 0442 디더1 0443 Dither2 0443 디더2 0444 Dither3 0444 디더3 0445 Dither4 0445 디더4 0446 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0446 이미지를 드래그해 대략적으로 정렬하세요.\n회전하려면 아래쪽 가장자리에서 드래그하세요. 0447 Drag margin box middle or edges 0447 여백 상자 중앙이나 가장자리를 드래그 0448 Drag mouse on image. \nLeft click to cancel. 0448 이미지 위에서 마우스를 드래그하세요. \n취소하려면 왼쪽 클릭하세요. 0449 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0449 마우스를 드래그해 선택. 지우기. 반복. \n클릭: 마우스 위치까지 선택 확장. 0450 Drag mouse to set center 0450 마우스를 드래그해 중심 설정 0451 Drag near an image corner using the mouse 0451 마우스로 이미지 모서리 근처를 드래그 0452 Drag on image to level image.\nClick on image for level lines. 0452 이미지를 드래그해 수평을 맞추세요.\n이미지를 클릭하면 수평선이 나타납니다. 0453 Drag within image using the mouse 0453 마우스로 이미지 내에서 드래그 0454 Draw a line across the image in \ndirection of brightness change. 0454 밝기 변화 방향으로 \n이미지를 가로지르는 선을 그으세요. 0455 Draw box on image 0455 이미지에 상자 그리기 0456 Draw line or arrow on image 0456 이미지에 선 또는 화살표 그리기 0457 Draw on image: text, line/arrow, box, circle, ellipse 0457 이미지에 그리기: 텍스트, 선/화살표, 상자, 원, 타원 0458 Draw oval on image 0458 이미지에 타원 그리기 0459 Draw text on image 0459 이미지에 텍스트 쓰기 0460 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0460 중복되거나 중첩된 폴더: \n %s \n %s \n제거해 주세요. 0461 Duplicates: 0461 중복: 0462 EDIT ALBUM 0462 앨범 편집 0463 EDIT ANY META 0463 모든 metadata 편집 0464 EDIT BOOKMARKS 0464 북마크 편집 0465 EDIT MAIN META 0465 주 metadata 편집 0466 EDIT MENU 0466 편집 메뉴 0467 EDIT PROCEDURES 0467 절차 편집 0468 EDIT SCRIPT 0468 스크립트 편집 0469 EDIT WORKFLOW 0469 워크플로 편집 0470 EFFECTS MENU 0470 효과 메뉴 0471 EMBOSS 0471 엠보싱 0472 ENABLE/DISABLE AREA 0472 영역 사용/사용 안 함 0473 ENGRAVE 0473 판화 효과 0474 ESCHER SPIRAL 0474 에셔 나선 0475 EXPORT FILES 0475 파일 내보내기 0476 Edge 0476 가장자리 0477 Edit 0477 편집 0478 Edit Any Meta 0478 모든 metadata 편집 0479 Edit Any Metadata 0479 모든 metadata 편집 0480 Edit Bookmarks 0480 북마크 편집 0481 Edit Images 0481 이미지 편집 0482 Edit Keyboard Shortcuts 0482 키보드 단축키 편집 0483 Edit Line 0483 선 편집 0484 Edit Line/Arrow 0484 선/화살표 편집 0485 Edit Main Meta 0485 주 metadata 편집 0486 Edit Main Metadata 0486 주 metadata 편집 0487 Edit Menu 0487 편집 메뉴 0488 Edit Metadata 0488 metadata 편집 0489 Edit Plugins 0489 플러그인 편집 0490 Edit Text 0490 텍스트 편집 0491 Edit any metadata tag 0491 임의의 metadata tag 편집 0492 Edit function can not use Paint Edits 0492 편집 기능은 페인트 편집을 사용할 수 없습니다 0493 Edit function must be active 0493 편집 기능이 활성화되어 있어야 합니다 0494 Edit key metadata: keywords/geotags/description/rating ... 0494 주요 metadata 편집: keywords/geotags/설명/평점 등 0495 Edit plugins menu 0495 플러그인 메뉴 편집 0496 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0496 편집: 자르기, 회전, 리터치, 크기 조정, 마크업, 페인트 편집, 영역 복사 0497 Effects 0497 효과 0498 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0498 효과: 카툰, 스케치, 페인트, 엠보싱, 디더, 텍스처, 색상, 사용자 지정 컨볼루션 0499 Emboss 0499 엠보싱 0500 Enable 0500 사용 0501 Enable areas for editing 0501 편집용 영역 사용 0502 End of gallery 0502 갤러리 끝 0503 Engrave 0503 판화 효과 0504 Enter Keyword 0504 Keyword 입력 0505 Enter New Keyword 0505 새 Keyword 입력 0506 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0506 대화 상자에 선/화살표 속성을 입력하고, \n이미지를 클릭/드래그하세요. 제거하려면 오른쪽 클릭하세요 0507 Enter text, [Add] to layout, edit properties. 0507 텍스트를 입력하고, 레이아웃에 [추가]한 후 속성을 편집하세요. 0508 Enter text, click/drag on image, right click to remove 0508 텍스트를 입력하고, 이미지를 클릭/드래그하세요. 제거하려면 오른쪽 클릭하세요 0509 Erase 0509 지우기 0510 Erase existing areas 0510 기존 영역 지우기 0511 Escher Spiral 0511 에셔 나선 0512 Exceed 50 anchor points 0512 앵커 포인트가 50개를 초과했습니다 0513 Export Files 0513 파일 내보내기 0514 Export selected image files to another folder 0514 선택한 이미지 파일을 다른 폴더로 내보내기 0515 FILE MENU 0515 파일 메뉴 0516 FILE SAVE 0516 파일 저장 0517 FILE VIEW 0517 파일 보기 0518 FIND AREA GAP 0518 영역 빈틈 찾기 0519 FIND BAD FILES 0519 손상된 파일 찾기 0520 FIND DUPLICATES 0520 중복 항목 찾기 0521 FIRST INDEX 0521 최초 색인 0522 FIRST STARTUP 0522 최초 시작 0523 FIX META 0523 metadata 복구 0524 FLATTEN HISTOGRAM 0524 히스토그램 평탄화 0525 FLATTEN PHOTO 0525 사진 평탄화 0526 FOLDER TREE 0526 폴더 트리 0527 FOTOCX FOR WINDOWS 11 0527 Windows 11용 Fotocx 0528 FOTOCX LIMITATIONS 0528 Fotocx 제한 사항 0529 FOTOCX USAGE 0529 Fotocx 사용법 0530 FRINGES 0530 색 번짐 0531 FUSION 0531 퓨전 0532 Fetch 0532 가져오기 0533 File 0533 파일 0534 File Mod Date/Time 0534 파일 수정 날짜/시간 0535 File Name 0535 파일 이름 0536 File Name/Number 0536 파일 이름/번호 0537 File Name: %s \n 0537 파일 이름: %s \n 0538 File Size (bytes) 0538 파일 크기 (바이트) 0539 File View 0539 파일 보기 0540 File count: 0540 파일 개수: 0541 File type cannot be edited 0541 이 파일 형식은 편집할 수 없습니다 0542 File1 0542 파일1 0543 File2 0543 파일2 0544 File: 0544 파일: 0545 File: new session, open, rename, copy/move, delete, print 0545 파일: 새 세션, 열기, 이름 바꾸기, 복사/이동, 삭제, 인쇄 0546 Fill selected areas or transparent areas with a color 0546 선택한 영역이나 투명한 영역을 색으로 채우기 0547 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0547 시각적 확인을 위해 선택한 영역을 색으로 채웁니다. \n방법 1: 아직 채워지지 않은 각 선택 영역을 왼쪽 클릭합니다. \n방법 2: 모든 선택 영역 바깥을 오른쪽 클릭합니다. \n자세한 내용은 [도움말] 버튼을 누르세요 0548 Find 0548 찾기 0549 Find Bad Files 0549 손상된 파일 찾기 0550 Find Duplicate Images 0550 중복 이미지 찾기 0551 Find Duplicates 0551 중복 항목 찾기 0552 Find Gap 0552 빈틈 찾기 0553 Find a gap in an area outline 0553 영역 윤곽선에서 빈틈 찾기 0554 Find all images for a location [date range] 0554 특정 위치[날짜 범위]의 모든 이미지 찾기 0555 Find all images for a selected tag name and value 0555 선택한 tag 이름과 값에 해당하는 모든 이미지 찾기 0556 Find images meeting multiple search criteria 0556 여러 검색 조건에 맞는 이미지 찾기 0557 Find optimum factors: 0557 최적 계수 찾기: 0558 Finish 0558 완료 0559 Finish Area 0559 영역 완료 0560 Fix Bad File 0560 손상된 파일 복구 0561 Fix Broken Metadata 0561 손상된 metadata 복구 0562 Fix Meta 0562 metadata 복구 0563 Fix Motion Blur 0563 모션 블러 보정 0564 Fix Perspective 0564 원근 보정 0565 Fix color fringes (chromatic aberration) 0565 색 번짐(색수차) 보정 0566 Fix perspective for object photographed from an angle 0566 비스듬히 촬영된 물체의 원근 보정 0567 Fix red-eyes from flash photo 0567 플래시 사진의 적목 현상 보정 0568 Flatten 0568 평탄화 0569 Flatten Histogram 0569 히스토그램 평탄화 0570 Flatten Pano 0570 파노라마 평탄화 0571 Flatten Photo 0571 사진 평탄화 0572 Flatten brightness histogram to enhance details 0572 세부 사항을 강조하기 위해 밝기 히스토그램 평탄화 0573 Flatten curved surface. 0573 곡면 평탄화. 0574 Flatten photo of a curved image (e.g. poster on round column 0574 곡면 이미지(예: 원기둥 위의 포스터)를 촬영한 사진 평탄화 0575 Flip 0575 뒤집기 0576 Folder Tree 0576 폴더 트리 0577 Folders 0577 폴더 0578 Folders for image files (subfolders included automatically) 0578 이미지 파일 폴더 (하위 폴더 자동 포함) 0579 Font 0579 글꼴 0580 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0580 무작위 이미지 순서에서 이 값은 \n이미지를 표시하는 상대적 빈도입니다. \n기본값은 10입니다. 20 --> 2배 자주 표시. 0581 Foreground 0581 전경 0582 Fotocx copyright notice 0582 Fotocx 저작권 안내 0583 Fotocx home 0583 Fotocx 홈 0584 Fotocx privacy policy 0584 Fotocx 개인정보 처리방침 0585 Fotocx video tutorial on YouTube 0585 YouTube의 Fotocx 동영상 튜토리얼 0586 Fotocx web site (information and downloads) 0586 Fotocx 웹사이트 (정보 및 다운로드) 0587 FreeSans 0587 FreeSans 0588 Full List 0588 전체 목록 0589 Full Screen 0589 전체 화면 0590 Fusion 0590 퓨전 0591 GALLERY END 0591 갤러리 끝 0592 GALLERY FILTER 0592 갤러리 필터 0593 GALLERY HOME 0593 갤러리 홈 0594 GALLERY MENU 0594 갤러리 메뉴 0595 GALLERY OVERVIEW 0595 갤러리 개요 0596 GALLERY SORT 0596 갤러리 정렬 0597 GALLERY TO ALBUM 0597 갤러리를 앨범으로 0598 GALLERY VIEW 0598 갤러리 보기 0599 GDK pixbuf: cannot save file 0599 GDK pixbuf: 파일을 저장할 수 없습니다 0600 GLOBAL RETINEX 0600 전역 레티넥스 0601 GRID SETTINGS 0601 격자 설정 0602 Gallery 0602 갤러리 0603 Gallery End 0603 갤러리 끝 0604 Gallery Filter 0604 갤러리 필터 0605 Gallery Home 0605 갤러리 홈 0606 Gallery Sort 0606 갤러리 정렬 0607 Gallery View 0607 갤러리 보기 0608 Gallery of newest image files 0608 최신 이미지 파일 갤러리 0609 Gallery of recently viewed image files 0609 최근에 본 이미지 파일 갤러리 0610 Gallery to Album 0610 갤러리를 앨범으로 0611 Gallery view with thumbnails and basic metadata 0611 thumbnail과 기본 metadata가 있는 갤러리 보기 0612 Gallery view with thumbnails and file data 0612 thumbnail과 파일 데이터가 있는 갤러리 보기 0613 Gallery: thumbnails, new/recent, sort, select, bookmarks 0613 갤러리: thumbnails, 새 항목/최근 항목, 정렬, 선택, 북마크 0614 Generate an inward spiraling repeating image 0614 안쪽으로 소용돌이치는 반복 이미지 생성 0615 Global Retinex 0615 전역 레티넥스 0616 Gradual 0616 점진적 0617 Graduated Blur 0617 그라데이션 블러 0618 Graduated Blur - blur relative to pixel contrast 0618 그라데이션 블러 - 픽셀 대비에 비례해 블러 적용 0619 Grayscale 0619 그레이스케일 0620 Green 0620 초록 0621 Grid Settings 0621 격자 설정 0622 Group by country 0622 국가별로 그룹화 0623 Group by country/date 0623 국가/날짜별로 그룹화 0624 Group by country/location 0624 국가/위치별로 그룹화 0625 Group by country/location/date 0625 국가/위치/날짜별로 그룹화 0626 Group by date/country 0626 날짜/국가별로 그룹화 0627 Group by date/country/location 0627 날짜/국가/위치별로 그룹화 0628 HDF 0628 HDF 0629 HDR 0629 HDR 0630 HELP MENU 0630 도움말 메뉴 0631 Hard 0631 강함 0632 Height 0632 높이 0633 Height: 0633 높이: 0634 Help 0634 도움말 0635 Help: user guide, tutorial, change log, licenses, privacy, about 0635 도움말: 사용자 안내서, 튜토리얼, 변경 내역, 라이선스, 개인정보, 정보 0636 Hide 0636 숨기기 0637 Hide selected areas 0637 선택한 영역 숨기기 0638 High 0638 높음 0639 High Depth of Field - combine near/far focus images for deeper focus 0639 심도 확장 - 근거리/원거리 초점 이미지를 결합해 더 깊은 초점 만들기 0640 High Dynamic Range - combine bright/dark images for better detail 0640 High Dynamic Range - 밝은/어두운 이미지를 결합해 세부 표현 향상 0641 Highlight darkest and brightest pixels 0641 가장 어둡거나 가장 밝은 픽셀 강조 0642 Home Folder 0642 홈 폴더 0643 Home Page 0643 홈페이지 0644 Horz 0644 가로 0645 How to remove Fotocx application and user files 0645 Fotocx 애플리케이션 및 사용자 파일 제거 방법 0646 Hue 0646 색조 0647 IMAGE ARRAY 0647 이미지 배열 0648 INDEX FILES 0648 파일 색인 0649 INSIDE-OUT 0649 인사이드아웃 0650 INVERT AREA 0650 영역 반전 0651 Icon size 0651 아이콘 크기 0652 Icons 0652 아이콘 0653 Image 0653 이미지 0654 Image Array 0654 이미지 배열 0655 Image Columns 0655 이미지 열 0656 Image Differences 0656 이미지 차이점 0657 Image File 0657 이미지 파일 0658 Image File: 0658 이미지 파일: 0659 Image Keywords 0659 이미지 Keywords 0660 Image Locations 0660 이미지 위치 0661 Image Markup 0661 이미지 마크업 0662 Image Position 0662 이미지 위치 0663 Image Preferences 0663 이미지 환경설정 0664 Image Ratios 0664 이미지 비율 0665 Image Size (pixels) 0665 이미지 크기 (픽셀) 0666 Image Time 0666 이미지 시간 0667 Image Timeline 0667 이미지 타임라인 0668 Image colors are converted for printing. 0668 인쇄를 위해 이미지 색상이 변환됩니다. 0669 Image dimensions have changed \nCopy Prior Edit cannot be used 0669 이미지 크기가 변경되어 \n이전 편집 복사를 사용할 수 없습니다 0670 Image dimensions have changed, \nArea Blend cannot be used 0670 이미지 크기가 변경되어, \n영역 블렌드를 사용할 수 없습니다 0671 Image dimensions have changed, \nthis prior image cannot be used 0671 이미지 크기가 변경되어, \n이 이전 이미지를 사용할 수 없습니다 0672 Image is fixed, unmovable 0672 이미지가 고정되어 이동할 수 없습니다 0673 Images sizes are not compatible 0673 이미지 크기가 호환되지 않습니다 0674 Include: 0674 포함: 0675 Index Files 0675 파일 색인 0676 Index Level 0676 색인 수준 0677 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0677 색인 기능이 종료되었습니다. \n검색 및 지도 기능을 사용하고 \nthumbnail 갤러리 페이지를 빠르게 표시하려면 색인이 필요합니다. 0678 Index new image files and make thumbnails 0678 새 이미지 파일을 색인하고 thumbnails 생성 0679 Input color to match and adjust: 0679 맞추고 조정할 입력 색상: 0680 Inside-out 0680 인사이드아웃 0681 Install following programs using your package manager: \n 0681 패키지 관리자를 사용해 다음 프로그램을 설치하세요: \n 0682 Intensity 0682 강도 0683 Invert 0683 반전 0684 Invert selected areas (selected ↔ not selected) 0684 선택한 영역 반전 (선택됨 ↔ 선택 안 됨) 0685 Irregular Tiles 0685 불규칙 타일 0686 Iterations 0686 반복 횟수 0687 JPEG ARTIFACTS 0687 JPEG 아티팩트 0688 JPEG Artifacts 0688 JPEG 아티팩트 0689 JPEG files 0689 JPEG 파일 0690 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0690 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월 0691 Jump to gallery beginning [home] 0691 갤러리 시작으로 이동 [home] 0692 Jump to gallery end [end] 0692 갤러리 끝으로 이동 [end] 0693 KEYBOARD ESCAPE KEY 0693 키보드 Escape 키 0694 KEYBOARD SHORTCUTS 0694 키보드 단축키 0695 KEYWORDS OVERVIEW 0695 Keywords 개요 0696 Keep 0696 유지 0697 Kernel size 0697 커널 크기 0698 Keyboard Shortcuts 0698 키보드 단축키 0699 Keywords Category 0699 Keywords 카테고리 0700 Kill active dialog? 0700 활성 대화 상자를 닫을까요? 0701 Kill busy function? 0701 실행 중인 기능을 중단할까요? 0702 Kuwahara 0702 구와하라 0703 Kuwahara Depth 0703 구와하라 깊이 0704 LINE COLOR 0704 선 색상 0705 LOAD/SAVE AREA 0705 영역 불러오기/저장 0706 LOCAL CONTRAST 0706 로컬 대비 0707 LOCAL RETINEX 0707 로컬 레티넥스 0708 Language 0708 언어 0709 Layout and background image 0709 레이아웃 및 배경 이미지 0710 Left 0710 왼쪽 0711 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0711 영역 안에서 왼쪽으로 드래그하면 \n영역 편집이 점차 실행 취소됩니다. \n오른쪽으로 드래그하면 편집이 복원됩니다. \n영역 가장자리를 따라 드래그하면 경계가 블렌드됩니다. 0712 Left/right click: previous/next image (also arrow keys) 0712 왼쪽/오른쪽 클릭: 이전/다음 이미지 (방향키도 가능) 0713 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0713 왼쪽/오른쪽 클릭: 편집 단계 실행 취소/다시 실행 \n가운데 클릭: 선택한 편집 단계로 돌아가기 0714 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0714 왼쪽/오른쪽 클릭: 이미지/thumbnail 확대/축소 (+/- 키도 가능) 0715 Length 0715 길이 0716 Level 0716 레벨 0717 Licenses 0717 라이선스 0718 Light Source 0718 광원 0719 Lightness 0719 명도 0720 Limit 0720 한계 0721 Line Color 0721 선 색상 0722 Line Threshold 0722 선 임계값 0723 Line Width 0723 선 너비 0724 Line length 0724 선 길이 0725 List Fotocx command line parameters 0725 Fotocx 명령줄 매개변수 나열 0726 List all metadata for current image or clicked thumbnail 0726 현재 이미지 또는 클릭한 thumbnail의 모든 metadata 나열 0727 List outboard programs and functions 0727 외부 프로그램 및 기능 나열 0728 Load 0728 불러오기 0729 Load settings from file 0729 파일에서 설정 불러오기 0730 Local Contrast 0730 로컬 대비 0731 Local Retinex 0731 로컬 레티넥스 0732 Location 0732 위치 0733 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0733 위치와 국가 정보가 현재 값을 대체합니다.\nGPS 데이터는 새 값이 있을 때만 대체됩니다. 0734 Lock 0734 잠금 0735 Low Amplify 0735 약한 증폭 0736 MAGNIFY IMAGE 0736 이미지 확대 0737 MAKE WAVES 0737 물결 효과 만들기 0738 MANAGE KEYWORDS 0738 Keywords 관리 0739 MAP MENU 0739 지도 메뉴 0740 MAP VIEW 0740 지도 보기 0741 MARGINS 0741 여백 0742 MARKUP 0742 마크업 0743 MASHUP 0743 매시업 0744 MATCH COLORS 0744 색상 맞추기 0745 MEASURE IMAGE 0745 이미지 측정 0746 MENU SHORTCUTS 0746 메뉴 단축키 0747 METADATA MENU 0747 metadata 메뉴 0748 METADATA TAGS 0748 metadata tags 0749 METADATA VIEW 0749 metadata 보기 0750 MONITOR COLOR 0750 모니터 색상 0751 MOSAIC 0751 모자이크 0752 MOUSE ALT-RIGHT-BUTTON 0752 마우스 Alt+오른쪽 버튼 0753 MOUSE FUNCTIONS 0753 마우스 기능 0754 MOUSE OWNERSHIP 0754 마우스 소유권 0755 MOVE FOTOCX HOME 0755 Fotocx 홈 이동 0756 Magnify 0756 확대 0757 Magnify Image 0757 이미지 확대 0758 Magnify image around the mouse position 0758 마우스 위치 주변 이미지 확대 0759 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0759 Fotocx를 실행하기에 메인 메모리가 부족합니다. \n그래도 시도해 볼 수 있습니다. \n계속하시겠습니까? 0760 Make Layout Image 0760 레이아웃 이미지 만들기 0761 Make Square Tiles 0761 정사각형 타일 만들기 0762 Make Waves 0762 물결 효과 만들기 0763 Make a spherical projection of an image 0763 이미지의 구형 투영 만들기 0764 Make black margins transparent 0764 검은색 여백을 투명하게 만들기 0765 Make new versions 0765 새 버전 만들기 0766 Make width constant for window size 0766 창 크기에 맞춰 너비 고정 0767 Manage Keywords 0767 Keywords 관리 0768 Map 0768 지도 0769 Map View 0769 지도 보기 0770 Maps 0770 지도 0771 Maps: view images by map location 0771 지도: 지도 위치별로 이미지 보기 0772 Margin 0772 여백 0773 Margins 0773 여백 0774 Markup 0774 마크업 0775 Mashup 0775 매시업 0776 Mass update album files 0776 앨범 파일 일괄 업데이트 0777 Match Brightness 0777 밝기 맞추기 0778 Match Colors 0778 색상 맞추기 0779 Match Level 0779 일치 수준 0780 Match Limit 0780 일치 한계 0781 Match image colors to colors of another image 0781 다른 이미지의 색상에 맞추기 0782 Match using: 0782 다음을 사용해 맞추기: 0783 Matching Keywords 0783 일치하는 Keywords 0784 Max 0784 최대 0785 Max. Width 0785 최대 너비 0786 Measure Image 0786 이미지 측정 0787 Measure Noise 0787 노이즈 측정 0788 Measure pixel distances within an image 0788 이미지 내 픽셀 거리 측정 0789 Menu Colors 0789 메뉴 색상 0790 Menu Style 0790 메뉴 스타일 0791 Metadata 0791 Metadata 0792 Metadata Tags 0792 Metadata Tags 0793 Metadata View 0793 Metadata 보기 0794 Metadata from Search Function 0794 검색 기능의 Metadata 0795 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0795 방법 1:\n적목 현상 부위를 왼쪽 클릭해 어둡게 합니다.\n방법 2:\n아래오른쪽으로 드래그해 적목 현상 부위를 감쌉니다.\n적목 현상 부위를 왼쪽 클릭해 어둡게 합니다.\n적목 현상 실행 취소:\n적목 현상 부위를 오른쪽 클릭합니다. 0796 Mirror: 0796 미러: 0797 Mode: 0797 모드: 0798 Monitor Color 0798 모니터 색상 0799 Mosaic 0799 모자이크 0800 Mouse Radius 0800 마우스 반경 0801 Mouse Warp (drag image) 0801 마우스 왜곡 (이미지 드래그) 0802 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0802 마우스 드래그: 이미지를 360° 회전 \n왼쪽/오른쪽 클릭: 확대/축소 \nEscape: 파노라마 보기 종료 0803 Move %d image files 0803 이미지 파일 %d개 이동 0804 Move Fotocx Home 0804 Fotocx 홈 이동 0805 Move Fotocx Home Folder 0805 Fotocx 홈 폴더 이동 0806 Move Fotocx home folder to chosen folder 0806 Fotocx 홈 폴더를 선택한 폴더로 이동 0807 Move mouse in a monotone image area. 0807 단조로운 이미지 영역에서 마우스를 움직이세요. 0808 Multiplier 0808 배수 0809 NEW SESSION 0809 새 세션 0810 NEWEST FILES 0810 최신 파일 0811 NEWLINE CHARACTERS IN METADATA 0811 Metadata의 줄바꿈 문자 0812 NON-STANDARD DIALOG WIDGETS 0812 비표준 대화 상자 위젯 0813 New Area 0813 새 영역 0814 New File Name: 0814 새 파일 이름: 0815 New Location 0815 새 위치 0816 New Location: 0816 새 위치: 0817 New Name 0817 새 이름 0818 New Session 0818 새 세션 0819 New Type: 0819 새 유형: 0820 New Version 0820 새 버전 0821 Newest 0821 최신 0822 Newest Files 0822 최신 파일 0823 Next 0823 다음 0824 Next gallery 0824 다음 갤러리 0825 No 0825 아니요 0826 No curve lines found 0826 곡선을 찾을 수 없습니다 0827 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0827 이미지 파일 색인을 찾을 수 없습니다.\n이미지 파일 색인을 새로 만듭니다.\n이미지 파일은 변경되지 않습니다.\n이미지 파일이 수천 개 이상 있다면 \n상당한 시간이 걸릴 수 있습니다. 0828 No images found 0828 이미지를 찾을 수 없습니다 0829 Noise Reduction 0829 노이즈 감소 0830 Noise Size 0830 노이즈 크기 0831 None 0831 없음 0832 Normal Blur 0832 일반 블러 0833 Normal Blur - mix pixels with all neighbor pixels 0833 일반 블러 - 모든 인접 픽셀과 혼합 0834 OPEN IMAGE FILE 0834 이미지 파일 열기 0835 OTHER TOPICS 0835 기타 주제 0836 OUTLINES 0836 윤곽선 0837 Old Name 0837 이전 이름 0838 One Tag: 0838 tag 하나: 0839 Opacity 0839 불투명도 0840 Open 0840 열기 0841 Open Image File 0841 이미지 파일 열기 0842 Open a file and paste as selected area into an image 0842 파일을 열어 이미지의 선택 영역에 붙여넣기 0843 Open a parallel Fotocx session 0843 병렬 Fotocx 세션 열기 0844 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0844 스캔한 색상 차트 파일을 열어 편집합니다. \n스캔 과정에서 생긴 기울어짐이나 회전을 제거하세요. \n(이때 원근 보정 기능을 사용하세요). \n얇은 초록색 여백을 정확하게 잘라내세요. \n색상 차트 파일을 저장(대체)하세요. 0845 Open the trimmed color chart file 0845 자른 색상 차트 파일 열기 0846 Optimize 0846 최적화 0847 Other Tag ... 0847 다른 Tag ... 0848 Outboard Programs 0848 외부 프로그램 0849 Outline Drawing 0849 윤곽선 그리기 0850 Outlines 0850 윤곽선 0851 Output Color 0851 출력 색상 0852 Overlap 0852 겹침 0853 Overlay position in host image: 0853 호스트 이미지 내 오버레이 위치: 0854 Overlay width, % host image width: 0854 오버레이 너비, 호스트 이미지 너비 대비 %: 0855 Overwrite file? \n%s 0855 파일을 덮어쓸까요? \n%s 0856 PAINT EDITS 0856 페인트 편집 0857 PAINT IMAGE 0857 이미지 페인트 0858 PAINT TRANSPARENCY 0858 투명도 페인트 0859 PAINTING 0859 페인팅 0860 PANORAMA 0860 파노라마 0861 PATTERN 0861 패턴 0862 PERSPECTIVE 0862 원근 0863 PLACES/DATES 0863 장소/날짜 0864 PLUGINS 0864 플러그인 0865 PREV/NEXT 0865 이전/다음 0866 PRINT CALIBRATED 0866 보정된 색상으로 인쇄 0867 PRINT IMAGE 0867 이미지 인쇄 0868 PRIVACY 0868 개인정보 0869 PROBLEM FILES 0869 문제 있는 파일 0870 PROBLEM REPORTING 0870 문제 보고 0871 Paint Edits 0871 페인트 편집 0872 Paint Edits already active 0872 페인트 편집이 이미 활성화되어 있습니다 0873 Paint Image 0873 이미지 페인트 0874 Paint Image Transparencies 0874 이미지 투명도 페인트 0875 Paint Radius 0875 페인트 반경 0876 Paint Transparency 0876 투명도 페인트 0877 Paint and Warp Image 0877 이미지 페인트 및 왜곡 0878 Paint current edit function gradually using the mouse 0878 마우스로 현재 편집 기능을 점차 적용 0879 Paint entire image 0879 전체 이미지 페인트 0880 Paint image transparency using the mouse 0880 마우스로 이미지 투명도 페인트 0881 Paint on Image 0881 이미지에 페인트 0882 Paint on image using the mouse 0882 마우스로 이미지에 페인트 0883 Paint transparency 0883 투명도 페인트 0884 Paint within mouse 0884 마우스 안쪽 페인트 0885 Painting 0885 페인팅 0886 Panorama 0886 파노라마 0887 Paste 0887 붙여넣기 0888 Paste Image 0888 이미지 붙여넣기 0889 Paste previously copied area into image 0889 이전에 복사한 영역을 이미지에 붙여넣기 0890 Pattern 0890 패턴 0891 Pattern File: 0891 패턴 파일: 0892 Pattern Width 0892 패턴 너비 0893 Percent 0893 퍼센트 0894 Permissions 0894 권한 0895 Perspective 0895 원근 0896 Photo Date 0896 촬영 날짜 0897 Photo Date/Time 0897 촬영 날짜/시간 0898 Photo Date/Time (metadata) 0898 촬영 날짜/시간 (metadata) 0899 Photo Date: %s File Date: %s \n 0899 촬영 날짜: %s 파일 날짜: %s \n 0900 Pixel count 0900 픽셀 개수 0901 Pixel difference 0901 픽셀 차이 0902 Pixels 0902 픽셀 0903 Places/Dates 0903 장소/날짜 0904 Plugin working ... 0904 플러그인 작동 중... 0905 Popup Image 0905 팝업 이미지 0906 Power 0906 파워 0907 Power Center 0907 파워 중심 0908 Power: Center 0908 파워: 중심 0909 Pre-align Images 0909 이미지 사전 정렬 0910 Preference: 0910 환경설정: 0911 Press F1 for help 0911 도움말을 보려면 F1을 누르세요 0912 Prev 0912 이전 0913 Prev/Next 0913 이전/다음 0914 Previous 0914 이전 0915 Previous gallery 0915 이전 갤러리 0916 Print Calibrated 0916 보정된 색상으로 인쇄 0917 Print Image 0917 이미지 인쇄 0918 Print chart in vertical orientation without margins. 0918 여백 없이 세로 방향으로 차트 인쇄. 0919 Print current image file with calibrated colors 0919 보정된 색상으로 현재 이미지 파일 인쇄 0920 Print the current image file 0920 현재 이미지 파일 인쇄 0921 Privacy 0921 개인정보 0922 Proceed 0922 계속 0923 Proceed? 0923 계속하시겠습니까? 0924 Process album files matching selected files: 0924 선택한 파일과 일치하는 앨범 파일 처리: 0925 Process an image using a custom convolution kernel 0925 사용자 지정 컨볼루션 커널을 사용해 이미지 처리 0926 Process selected album files: 0926 선택한 앨범 파일 처리: 0927 Processing files 0927 파일 처리 중 0928 Project name 0928 프로젝트 이름 0929 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0929 마우스로 이미지 위치를 끌어당기세요. \n만족할 때까지 여러 번 마우스로 끌어당기세요. \n완료되면 [OK]를 누르세요. 0930 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0930 마우스로 이미지 모서리를 끌어당기세요. \n만족할 때까지 여러 번 마우스로 끌어당기세요. \n완료되면 [OK]를 누르세요. 0931 Pull on the image with the mouse. 0931 마우스로 이미지를 끌어당기세요. 0932 Purge unwanted keywords from all image files 0932 모든 이미지 파일에서 불필요한 keyword 삭제 0933 QUESTIONS, SUGGESTIONS 0933 질문 및 제안 0934 Quit 0934 종료 0935 Quit Fotocx 0935 Fotocx 종료 0936 Quit Fotocx? 0936 Fotocx를 종료할까요? 0937 RAW Files 0937 RAW 파일 0938 RAW Options 0938 RAW 옵션 0939 RAW conversion failed: %s %s 0939 RAW 변환 실패: %s %s 0940 RAW loader 0940 RAW 로더 0941 RECENT FILES 0941 최근 파일 0942 RECENT FOLDERS 0942 최근 폴더 0943 RED EYES 0943 적목 현상 0944 REFINE MENU 0944 보정 메뉴 0945 REMOVE DUST 0945 먼지 제거 0946 REMOVE HALO 0946 헤일로 제거 0947 RENAME 0947 이름 바꾸기 0948 RENAME ALBUM 0948 앨범 이름 바꾸기 0949 REPAIR MENU 0949 복구 메뉴 0950 RESCALE 0950 크기 조정 0951 RETOUCH 0951 리터치 0952 RGB -> BRG 0952 RGB -> BRG 0953 RGB -> GBR 0953 RGB -> GBR 0954 RGB HISTOGRAM 0954 RGB 히스토그램 0955 RGB Histogram 0955 RGB 히스토그램 0956 RGB brightness histogram graph 0956 RGB 밝기 히스토그램 그래프 0957 RGB color 0957 RGB 색상 0958 RGB mix with given bit-depth 0958 지정된 비트 심도의 RGB 혼합 0959 ROTATE 0959 회전 0960 RUN SCRIPT 0960 스크립트 실행 0961 Radial Blur 0961 방사형 블러 0962 Radial Blur - mix pixels in radial lines from chosen center 0962 방사형 블러 - 선택한 중심에서 방사형으로 픽셀 혼합 0963 Radius 0963 반경 0964 Random Image 0964 무작위 이미지 0965 Range 0965 범위 0966 Rating: 0966 평점: 0967 Rating: %s Size: %s %.2fmb \n 0967 평점: %s 크기: %s %.2fmb \n 0968 Read or search the user guide 0968 사용자 안내서 읽기 또는 검색 0969 Recent Files 0969 최근 파일 0970 Recent Folders 0970 최근 폴더 0971 Recent Keywords 0971 최근 Keywords 0972 Rectify closeup face photo (balloon face) 0972 클로즈업 얼굴 사진 보정 (풍선 얼굴 현상) 0973 Red 0973 빨강 0974 Red Eye Reduction 0974 적목 현상 감소 0975 Red Eyes 0975 적목 현상 0976 Red Factors 0976 빨강 계수 0977 Redo 0977 다시 실행 0978 Reduce Fog/Haze 0978 안개/뿌옇게 감소 0979 Reduce fog/haze in an image or selected areas 0979 이미지 또는 선택 영역의 안개/뿌옇게 감소 0980 Refine 0980 보정 0981 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0981 보정: 히스토그램 평탄화, 로컬 대비, 대비 증폭, 레티넥스, 채도 0982 Remove 0982 제거 0983 Remove Dust 0983 먼지 제거 0984 Remove Halo 0984 헤일로 제거 0985 Remove dust spots from old scanned photos 0985 오래된 스캔 사진에서 먼지 자국 제거 0986 Remove from Album 0986 앨범에서 제거 0987 Remove halos left by some edit functions 0987 일부 편집 기능으로 생긴 헤일로 제거 0988 Remove image curvature, especially in panoramas 0988 이미지 곡률 제거, 특히 파노라마에서 0989 Remove jaggies on hard image feature edges 0989 딱딱한 이미지 경계의 계단 현상 제거 0990 Remove selected image metadata 0990 선택한 이미지의 metadata 제거 0991 Remove unwanted objects in an image 0991 이미지 내 불필요한 물체 제거 0992 Rename 0992 이름 바꾸기 0993 Rename Album 0993 앨범 이름 바꾸기 0994 Rename Image File 0994 이미지 파일 이름 바꾸기 0995 Rename an existing album 0995 기존 앨범 이름 바꾸기 0996 Rename or delete keywords for all image files 0996 모든 이미지 파일의 keyword 이름 바꾸기 또는 삭제 0997 Rename to 0997 다음으로 이름 바꾸기 0998 Rename/convert/rescale/move selected image or RAW files 0998 선택한 이미지 또는 RAW 파일 이름 바꾸기/변환/크기 조정/이동 0999 Repair 0999 복구 1000 Repair malformed metadata preventing metadata edits 1000 metadata 편집을 막는 손상된 metadata 복구 1001 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 1001 복구: 선명하게, 블러, 노이즈 제거, 안개 제거, 적목 현상, 스마트 지우기, 색상 조정 1002 Replace 1002 바꾸기 1003 Replace Text 1003 텍스트 바꾸기 1004 Replace all versions with newest version 1004 모든 버전을 최신 버전으로 바꾸기 1005 Replace all versions with selected versions 1005 모든 버전을 선택한 버전으로 바꾸기 1006 Replace all with newest version only 1006 모두 최신 버전으로만 바꾸기 1007 Replace all with original + newest version 1007 모두 원본 + 최신 버전으로 바꾸기 1008 Replace all with original + selected versions 1008 모두 원본 + 선택한 버전으로 바꾸기 1009 Replace all with original and all versions 1009 모두 원본과 모든 버전으로 바꾸기 1010 Replace all with selected versions 1010 모두 선택한 버전으로 바꾸기 1011 Replace host files 1011 호스트 파일 바꾸기 1012 Report Image Places/Dates 1012 이미지 장소/날짜 보고 1013 Report selected metadata for selected image files 1013 선택한 이미지 파일의 선택한 metadata 보고 1014 Required programs are installed. \n 1014 필요한 프로그램이 설치되어 있습니다. \n 1015 Rescale 1015 크기 조정 1016 Rescale Image 1016 이미지 크기 조정 1017 Rescale RGB levels to reduce color caste and fog/haze 1017 색 편향과 안개/뿌옇게를 줄이기 위해 RGB 레벨 재조정 1018 Rescale brightness levels to increase local contrast 1018 로컬 대비를 높이기 위해 밝기 레벨 재조정 1019 Rescale: 1019 크기 조정: 1020 Reserved Shortcuts \n 1020 예약된 단축키 \n 1021 Reserved shortcut ignored: %s 1021 예약된 단축키가 무시됨: %s 1022 Reset 1022 재설정 1023 Reset all galleries to file name ascending 1023 모든 갤러리를 파일 이름 오름차순으로 재설정 1024 Resolution 1024 해상도 1025 Resources 1025 리소스 1026 Resume 1026 재개 1027 Retouch 1027 리터치 1028 Reverse R 1028 R 반전 1029 Richardson-Lucy 1029 리처드슨-루시 1030 Right 1030 오른쪽 1031 Rim % 1031 테두리 % 1032 Rotate 1032 회전 1033 Rotate Image 1033 이미지 회전 1034 Rotate or level an image 1034 이미지 회전 또는 수평 맞추기 1035 Rotate: 1035 회전: 1036 Roy Lichtenstein effect 1036 로이 리히텐슈타인 효과 1037 SATURATION 1037 채도 1038 SCRIPT FILES 1038 스크립트 파일 1039 SEARCH IMAGES 1039 이미지 검색 1040 SELECT AREA 1040 영역 선택 1041 SELECT FILES 1041 파일 선택 1042 SELECT IMAGE FILES 1042 이미지 파일 선택 1043 SELECT MENU 1043 선택 메뉴 1044 SET COLORS 1044 색상 설정 1045 SET WALLPAPER 1045 배경화면 설정 1046 SETTINGS 1046 설정 1047 SHARPEN 1047 선명하게 1048 SHIFT COLORS 1048 색상 전환 1049 SHORTCUTS 1049 단축키 1050 SHOW CIM FILES 1050 CIM 파일 표시 1051 SHOW DIFFS 1051 차이점 표시 1052 SHOW ON MAP 1052 지도에 표시 1053 SHOW RESOURCES 1053 리소스 표시 1054 SHOW RGB 1054 RGB 표시 1055 SHOW/HIDE AREA 1055 영역 표시/숨기기 1056 SKETCH1 1056 스케치1 1057 SKETCH2 1057 스케치2 1058 SLIDE SHOW 1058 슬라이드 쇼 1059 SLIDES AND NEGATIVES 1059 슬라이드 및 필름 1060 SLIDESHOW END 1060 슬라이드 쇼 종료 1061 SMART ERASE 1061 스마트 지우기 1062 SOFT FOCUS 1062 소프트 포커스 1063 SPHERE 1063 구 1064 SPLIT-SCREEN 1064 분할 화면 1065 STACK/LAYERS 1065 스택/레이어 1066 STACK/NOISE 1066 스택/노이즈 1067 STACK/PAINT 1067 스택/페인트 1068 Saturation 1068 채도 1069 Save 1069 저장 1070 Save Gallery as Album 1070 갤러리를 앨범으로 저장 1071 Save Image File 1071 이미지 파일 저장 1072 Save as new file name or type 1072 새 파일 이름 또는 형식으로 저장 1073 Save current gallery as album 1073 현재 갤러리를 앨범으로 저장 1074 Save modified image as new file or new file version 1074 수정된 이미지를 새 파일 또는 새 파일 버전으로 저장 1075 Save selected area to a file with transparency 1075 선택한 영역을 투명도가 있는 파일로 저장 1076 Saved Areas 1076 저장된 영역 1077 Scale 1077 배율 1078 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1078 인쇄된 색상 차트를 스캔하세요, 가장 어두운 행이 위로 오도록. \n프린터와 용지 이름을 사용해 .png 파일로 저장하세요 \n(예: %s/Epson_glossy.png). \n 1079 Search 1079 검색 1080 Search Images 1080 이미지 검색 1081 Search Results 1081 검색 결과 1082 Search all image files and report duplicates 1082 모든 이미지 파일을 검색해 중복 보고 1083 Searching - use ESC key to terminate 1083 검색 중 - 중단하려면 ESC 키 사용 1084 Seconds 1084 초 1085 Select 1085 선택 1086 Select %d to %d files 1086 파일 %d~%d개 선택 1087 Select Album 1087 앨범 선택 1088 Select Albums 1088 앨범 선택 1089 Select Area 1089 영역 선택 1090 Select Area for Edits 1090 편집할 영역 선택 1091 Select Area not supported \nby this edit function 1091 이 편집 기능은 \n영역 선택을 지원하지 않습니다 1092 Select Files 1092 파일 선택 1093 Select Image 1093 이미지 선택 1094 Select Image Files 1094 이미지 파일 선택 1095 Select Metadata tags 1095 Metadata tags 선택 1096 Select Script 1096 스크립트 선택 1097 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1097 영역 선택 기능을 사용해 왜곡할 영역을 선택하세요. \n[왜곡 시작]을 누르고 마우스로 영역을 끌어당기세요. \n만족할 때까지 여러 번 마우스로 끌어당기세요. \n완료되면 다른 영역을 선택하거나 [OK]를 누르세요. 1098 Select and Paint Image 1098 이미지 선택 및 페인트 1099 Select and view an image file 1099 이미지 파일 선택 및 보기 1100 Select area cannot be kept.\nContinue? 1100 선택 영역을 유지할 수 없습니다.\n계속하시겠습니까? 1101 Select area disabled, Continue? 1101 영역 선택이 비활성화되어 있습니다. 계속하시겠습니까? 1102 Select area not finished, Continue? 1102 영역 선택이 완료되지 않았습니다. 계속하시겠습니까? 1103 Select area will be ignored. \nContinue? 1103 선택 영역이 무시됩니다. \n계속하시겠습니까? 1104 Select folder 1104 폴더 선택 1105 Select host image files 1105 호스트 이미지 파일 선택 1106 Select image areas to edit separately, copy/paste selections 1106 별도로 편집할 이미지 영역 선택, 선택 영역 복사/붙여넣기 1107 Select image objects or areas for separate editing 1107 별도로 편집할 이미지 물체 또는 영역 선택 1108 Select input files for subsequent function 1108 다음 기능에 사용할 입력 파일 선택 1109 Select overlay file 1109 오버레이 파일 선택 1110 Select startup album 1110 시작 앨범 선택 1111 Select startup folder 1111 시작 폴더 선택 1112 Select startup image file 1112 시작 이미지 파일 선택 1113 Select the image file to print. 1113 인쇄할 이미지 파일을 선택하세요. 1114 Select to add, click on X to delete. 1114 추가하려면 선택하고, 삭제하려면 X를 클릭하세요. 1115 Select two files 1115 파일 두 개 선택 1116 Select versions, ratings, keywords, filename text 1116 버전, 평점, keywords, 파일 이름 텍스트 선택 1117 Separation Horz 1117 가로 분리 1118 Sequence Numbers 1118 순서 번호 1119 Set Colors 1119 색상 설정 1120 Set No. of Colors 1120 색상 개수 설정 1121 Set Ratio: 1121 비율 설정: 1122 Set Wallpaper 1122 배경화면 설정 1123 Set Width: 1123 너비 설정: 1124 Set and view bookmarks, select for gallery view 1124 북마크 설정 및 보기, 갤러리 보기용 선택 1125 Set black-white/color, negative/positive, sepia 1125 흑백/컬러, 네거티브/포지티브, 세피아 설정 1126 Set foreground line color (crop, grid, select, warp) 1126 전경 선 색상 설정 (자르기, 격자, 선택, 왜곡) 1127 Set gallery from latest search results 1127 최신 검색 결과에서 갤러리 설정 1128 Set gallery from recent folders list 1128 최근 폴더 목록에서 갤러리 설정 1129 Set gallery to folder of current file 1129 현재 파일의 폴더로 갤러리 설정 1130 Set horizontal/vertical grid line counts 1130 가로/세로 격자선 개수 설정 1131 Set image file as desktop wallpaper 1131 이미지 파일을 데스크톱 배경화면으로 설정 1132 Set line properties, [Add] to layout, edit. 1132 선 속성 설정, 레이아웃에 [추가], 편집. 1133 Set number of colors for each R/G/B or total 1133 각 R/G/B 또는 전체 색상 개수 설정 1134 Set or shift photo date/time for selected image files 1134 선택한 이미지 파일의 촬영 날짜/시간 설정 또는 이동 1135 Set the name for the output calibration file \n[your calibration name].dat 1135 출력 보정 파일의 이름을 설정하세요 \n[사용자 보정 이름].dat 1136 Settings 1136 설정 1137 Sharpen 1137 선명하게 1138 Sharpen the image (various methods) 1138 이미지 선명하게 (다양한 방법) 1139 Shift + drag mouse across image \nto indicate blur direction 1139 블러 방향을 나타내려면 \nShift + 마우스 드래그 1140 Shift Colors 1140 색상 전환 1141 Shift/convert image colors into other colors 1141 이미지 색상을 다른 색상으로 전환/변환 1142 Short List 1142 간단 목록 1143 Show 1143 표시 1144 Show (outline) selected areas 1144 선택한 영역 표시 (윤곽선) 1145 Show CIM Files 1145 CIM 파일 표시 1146 Show Diffs 1146 차이점 표시 1147 Show Fotocx installed version and author contact 1147 설치된 Fotocx 버전 및 작성자 연락처 표시 1148 Show Fotocx updates for recent releases 1148 최근 릴리스의 Fotocx 업데이트 표시 1149 Show Hidden 1149 숨김 항목 표시 1150 Show Log File 1150 로그 파일 표시 1151 Show RGB 1151 RGB 표시 1152 Show RGB levels at mouse position 1152 마우스 위치의 RGB 레벨 표시 1153 Show Resources 1153 리소스 표시 1154 Show folder hierarchy, click folder for gallery view 1154 폴더 계층 구조 표시, 폴더 클릭 시 갤러리 보기 1155 Show image counts in year/month table, select, report 1155 연/월 표에 이미지 개수 표시, 선택, 보고 1156 Show image description (overlap) 1156 이미지 설명 표시 (겹침) 1157 Show image differences on the image 1157 이미지의 차이점을 이미지 위에 표시 1158 Show image file name (overlap) 1158 이미지 파일 이름 표시 (겹침) 1159 Show image title (overlap) 1159 이미지 제목 표시 (겹침) 1160 Show input files used in combine function 1160 결합 기능에 사용된 입력 파일 표시 1161 Show key metadata for current image or clicked thumbnail 1161 현재 이미지 또는 클릭한 thumbnail의 주요 metadata 표시 1162 Show map position of the current image file 1162 현재 이미지 파일의 지도 위치 표시 1163 Show memory and CPU resources used 1163 사용 중인 메모리 및 CPU 리소스 표시 1164 Show on Map 1164 지도에 표시 1165 Show or make Keyboard Shortcuts 1165 키보드 단축키 표시 또는 만들기 1166 Show the current (last used) album 1166 현재(마지막으로 사용한) 앨범 표시 1167 Show the current log file 1167 현재 로그 파일 표시 1168 Size 1168 크기 1169 Sketch1 1169 스케치1 1170 Sketch2 1170 스케치2 1171 Slide Show 1171 슬라이드 쇼 1172 Smart Erase 1172 스마트 지우기 1173 Soft Focus 1173 소프트 포커스 1174 Sphere 1174 구 1175 Spherical Projection 1175 구형 투영 1176 Split-Screen 1176 분할 화면 1177 Stack/Layers 1177 스택/레이어 1178 Stack/Noise 1178 스택/노이즈 1179 Stack/Paint 1179 스택/페인트 1180 Stacking Order 1180 스택 순서 1181 Start 1181 시작 1182 Start a slide show 1182 슬라이드 쇼 시작 1183 Start of gallery 1183 갤러리 시작 1184 Startup View 1184 시작 화면 1185 Stop 1185 중지 1186 Stretch 1186 늘이기 1187 Stretch: 1187 늘이기: 1188 Suppress JPEG compression artifacts 1188 JPEG 압축 아티팩트 억제 1189 Suppress Ringing 1189 링잉 억제 1190 Suppress fine details while retaining sharpness 1190 선명도를 유지하면서 미세한 세부 사항 억제 1191 Suppress noise from low-light photos 1191 저조도 사진의 노이즈 억제 1192 Survey all files 1192 모든 파일 조사 1193 TEXTURE 1193 텍스처 1194 THUMB VIEW 1194 Thumb 보기 1195 TILES1 1195 타일1 1196 TILES2 1196 타일2 1197 TIMELINE 1197 타임라인 1198 TINY PLANET 1198 타이니 플래닛 1199 TOOLS MENU 1199 도구 메뉴 1200 TRANSLATIONS 1200 번역 1201 TWIST 1201 트위스트 1202 Temperature 1202 색온도 1203 Text 1203 텍스트 1204 Text File: 1204 텍스트 파일: 1205 Texture 1205 텍스처 1206 Threshold 1206 임계값 1207 Threshold: Low 1207 임계값: 낮음 1208 Thumbnail View 1208 Thumbnail 보기 1209 Thumbnail size 1209 Thumbnail 크기 1210 Thumbnails folder 1210 Thumbnails 폴더 1211 Thumbnails folder: %s \nPlease remove. 1211 Thumbnails 폴더: %s \n제거해 주세요. 1212 Thumbnails folder: \n %s \nmust be named .../thumbnails 1212 Thumbnails 폴더: \n %s \n이름이 .../thumbnails여야 합니다 1213 Thumbnails: 1213 Thumbnails: 1214 Tile 1214 타일 1215 Tile blending 1215 타일 블렌드 1216 Tile image with a repeating pattern 1216 반복 패턴으로 이미지 타일링 1217 Tiles 1217 타일 1218 Tiles1 1218 타일1 1219 Tiles2 1219 타일2 1220 Timeline 1220 타임라인 1221 Tiny Planet 1221 타이니 플래닛 1222 Title 1222 제목 1223 Title: %s\n 1223 제목: %s\n 1224 To Location 1224 이동할 위치 1225 Toggle Captions 1225 캡션 전환 1226 Toggle Grid 1226 격자 전환 1227 Toggle grid lines on and off 1227 격자선 켜기/끄기 1228 Toggle image metadata display ON/OFF 1228 이미지 metadata 표시 켜기/끄기 1229 Too little overlap, cannot align 1229 겹침이 너무 적어 정렬할 수 없습니다 1230 Too many edits, please save image 1230 편집이 너무 많습니다, 이미지를 저장하세요 1231 Tools 1231 도구 1232 Tools: image index, settings, shortcuts, grid, find duplicates 1232 도구: 이미지 색인, 설정, 단축키, 격자, 중복 찾기 1233 Top 1233 위쪽 1234 Total Colors 1234 전체 색상 수 1235 Trace 1235 추적 1236 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1236 마우스 클릭으로 위/아래 곡선을 \n추적한 다음 [평탄화]하세요. 1237 Transient Objects 1237 일시적 물체 1238 Transition Preferences 1238 전환 환경설정 1239 Transition to next image 1239 다음 이미지로 전환 1240 Transitions File 1240 전환 파일 1241 Transp. 1241 투명도 1242 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1242 투명도 맵이 손실됩니다 \n(유지하려면 TIFF|PNG|JXL로 저장) \n그래도 저장할까요? 1243 Trash 1243 휴지통 1244 Trash read-only file? 1244 읽기 전용 파일을 휴지통으로 보낼까요? 1245 Turn an image inside-out 1245 이미지를 인사이드아웃으로 변환 1246 Twist 1246 트위스트 1247 Twist image centered at mouse position 1247 마우스 위치를 중심으로 이미지 트위스트 1248 UNBEND 1248 펴기 1249 UNDO/REDO BUTTON 1249 실행 취소/다시 실행 버튼 1250 UNWARP CLOSEUP 1250 클로즈업 왜곡 펴기 1251 UPDATE ALBUMS 1251 앨범 업데이트 1252 UPRIGHT 1252 업라이트 1253 USER GUIDE 1253 사용자 안내서 1254 Unable to copy metadata 1254 metadata를 복사할 수 없습니다 1255 Unbend 1255 펴기 1256 Undo 1256 실행 취소 1257 Undo All 1257 모두 실행 취소 1258 Undo Last 1258 마지막 실행 취소 1259 Undo/Redo 1259 실행 취소/다시 실행 1260 Uninstall 1260 제거 1261 Unwarp Closeup 1261 클로즈업 왜곡 펴기 1262 Update Albums 1262 앨범 업데이트 1263 Update albums for new file versions 1263 새 파일 버전에 맞춰 앨범 업데이트 1264 Upright 1264 업라이트 1265 Upright Image 1265 이미지 업라이트 1266 Upright or mirror-flip an image 1266 이미지 업라이트 또는 좌우 반전 1267 Upright rotated image files, selected set or ALL 1267 회전된 이미지 파일 업라이트, 선택한 세트 또는 전체 1268 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1268 얼굴을 선택하려면 영역 선택을 사용하세요. \n왜곡의 중심을 클릭하세요. \n슬라이더를 움직이세요. \n 1269 Use [Select] to add files to an empty album 1269 [선택]을 사용해 빈 앨범에 파일을 추가하세요 1270 Use metadata photo date or file modification date? 1270 metadata의 촬영 날짜를 사용할까요, 파일 수정 날짜를 사용할까요? 1271 Use metadata tag 1271 metadata tag 사용 1272 Use settings file 1272 설정 파일 사용 1273 User Guide 1273 사용자 안내서 1274 User preferences and settings 1274 사용자 환경설정 및 설정 1275 VIDEO press P to play 1275 VIDEO 재생하려면 P를 누르세요 1276 VIEW 360° PANO 1276 360° 파노라마 보기 1277 VIEW ALL META 1277 모든 metadata 보기 1278 VIEW MAIN META 1278 주 metadata 보기 1279 VIGNETTE 1279 비네트 1280 Var. Transparency 1280 가변 투명도 1281 Vert 1281 세로 1282 Video Files 1282 비디오 파일 1283 Video Tutorial 1283 동영상 튜토리얼 1284 Video command 1284 비디오 명령 1285 View 360 degree panorama image 1285 360도 파노라마 이미지 보기 1286 View 360° Pano 1286 360° 파노라마 보기 1287 View All Meta 1287 모든 metadata 보기 1288 View All Metadata 1288 모든 metadata 보기 1289 View Main Meta 1289 주 metadata 보기 1290 View Main Metadata 1290 주 metadata 보기 1291 View before/after images using split-screen 1291 분할 화면으로 전/후 이미지 보기 1292 View/edit metadata, image report and search functions 1292 metadata 보기/편집, 이미지 보고 및 검색 기능 1293 Vignette 1293 비네트 1294 W/H Ratio: 1294 가로/세로 비율: 1295 WARP AFFINE 1295 어파인 왜곡 1296 WARP AREA 1296 영역 왜곡 1297 WARP CURVED 1297 곡선 왜곡 1298 WARP IMAGE 1298 이미지 왜곡 1299 WARP MENU 1299 왜곡 메뉴 1300 WARP RADIAL 1300 방사형 왜곡 1301 WINDOW VIEWS AND MENUS 1301 창 보기 및 메뉴 1302 WORLD MAP 1302 세계 지도 1303 Wait after zoom 1303 zoom 후 대기 1304 Wait before filename/title/description 1304 파일 이름/제목/설명 전 대기 1305 Wait before zoom 1305 zoom 전 대기 1306 Warp 1306 왜곡 1307 Warp Affine 1307 어파인 왜곡 1308 Warp Area 1308 영역 왜곡 1309 Warp Curved 1309 곡선 왜곡 1310 Warp Image 1310 이미지 왜곡 1311 Warp Linear1 1311 선형 왜곡1 1312 Warp Linear2 1312 선형 왜곡2 1313 Warp Radial 1313 방사형 왜곡 1314 Warp an image with a wave pattern 1314 물결 패턴으로 이미지 왜곡 1315 Warp image (affine) using the mouse 1315 마우스로 이미지 왜곡 (어파인) 1316 Warp image (curved) using the mouse 1316 마우스로 이미지 왜곡 (곡선) 1317 Warp image (linear 1) using the mouse 1317 마우스로 이미지 왜곡 (선형 1) 1318 Warp image (linear 2) using the mouse 1318 마우스로 이미지 왜곡 (선형 2) 1319 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1319 왜곡: 펴기, 원근 보정, 왜곡, 클로즈업 왜곡 펴기, 평탄화, 이미지 변형 1320 White 1320 흰색 1321 Widen: 1321 넓히기: 1322 Width 1322 너비 1323 Width % 1323 너비 % 1324 X-size 1324 X 크기 1325 Yes 1325 예 1326 ZOOM 1326 ZOOM 1327 Zoom 1327 Zoom 1328 Zoom Center 1328 Zoom 중심 1329 Zoom Speed 1329 Zoom 속도 1330 Zoom-in 1330 Zoom-in 1331 Zoom-out 1331 Zoom-out 1332 \n %d-bits/color 1332 \n %d비트/색상 1333 \n *** CANCELED \n 1333 \n *** 취소됨 \n 1334 \n *** COMPLETED \n 1334 \n *** 완료됨 \n 1335 \n *** Delete Originals *** 1335 \n *** 원본 삭제 *** 1336 \n *** Keep Originals *** 1336 \n *** 원본 유지 *** 1337 \n *** Replace Originals *** 1337 \n *** 원본 대체 *** 1338 \n Convert to %s 1338 \n %s(으)로 변환 1339 \n Copy Metadata 1339 \n metadata 복사 1340 \n Downsize within %dx%d 1340 \n %dx%d 이내로 축소 1341 \n New Location: %s 1341 \n 새 위치: %s 1342 \n Output to %s 1342 \n %s(으)로 출력 1343 \n PROCEED? 1343 \n 계속하시겠습니까? 1344 \n Rename to %s 1344 \n %s(으)로 이름 바꾸기 1345 \n Replace text: %s --> %s 1345 \n 텍스트 바꾸기: %s --> %s 1346 \n Rescale to %sx 1346 \n %sx로 크기 조정 1347 \n Update Albums 1347 \n 앨범 업데이트 1348 \n Upsize within %dx%d 1348 \n %dx%d 이내로 확대 1349 \n*** CANCELED \n 1349 \n*** 취소됨 \n 1350 \n*** COMPLETED \n 1350 \n*** 완료됨 \n 1351 \n\nPROCEED? 1351 \n\n계속하시겠습니까? 1352 add 1352 추가 1353 add after old 1353 이전 항목 뒤에 추가 1354 add all gallery files to list 1354 모든 갤러리 파일을 목록에 추가 1355 add current file to list 1355 현재 파일을 목록에 추가 1356 add entered text to layout 1356 입력한 텍스트를 레이아웃에 추가 1357 add images to layout 1357 레이아웃에 이미지 추가 1358 add line/arrow to layout 1358 레이아웃에 선/화살표 추가 1359 add new keyword 1359 새 keyword 추가 1360 add or edit images 1360 이미지 추가 또는 편집 1361 add or edit lines/arrows 1361 선/화살표 추가 또는 편집 1362 add or edit text 1362 텍스트 추가 또는 편집 1363 add to set 1363 세트에 추가 1364 adder 1364 adder 1365 adjust brightness of selected image 1365 선택한 이미지의 밝기 조정 1366 after removal of missing files: %d \n 1366 누락된 파일 제거 후: %d개 \n 1367 album %s: deleted 1367 앨범 %s: 삭제됨 1368 album already exists: %s 1368 앨범이 이미 존재합니다: %s 1369 album mass update 1369 앨범 일괄 업데이트 1370 albums folder missing 1370 앨범 폴더가 없습니다 1371 align and trim color chart 1371 색상 차트 정렬 및 자르기 1372 all files 1372 모든 파일 1373 all image files, including unmounted folders: %d \n 1373 마운트되지 않은 폴더를 포함한 모든 이미지 파일: %d개 \n 1374 all images 1374 모든 이미지 1375 all versions 1375 모든 버전 1376 amplify contrast 1376 대비 증폭 1377 amplitude 1377 진폭 1378 angle 1378 각도 1379 apply 1379 적용 1380 area edge creep 1380 영역 경계 밀림 1381 area is not finished 1381 영역이 완료되지 않았습니다 1382 area outline color: 1382 영역 윤곽선 색상: 1383 array width is too large: %d x %d 1383 배열 너비가 너무 큽니다: %d x %d 1384 ascending 1384 오름차순 1385 auto color 1385 자동 색상 1386 background colors for file and gallery view windows 1386 파일 및 갤러리 보기 창의 배경 색상 1387 backing 1387 배경 1388 bad category name 1388 잘못된 카테고리 이름 1389 bad keyword name 1389 잘못된 keyword 이름 1390 bad pattern file: %s 1390 잘못된 패턴 파일: %s 1391 base 1391 base 1392 base and adder need $s plugin 1392 base와 adder에는 $s 플러그인이 필요합니다 1393 base size 1393 기본 크기 1394 begin making a script file 1394 스크립트 파일 만들기 시작 1395 black/white 1395 흑백 1396 black/white negative 1396 흑백 네거티브 1397 black/white positive 1397 흑백 포지티브 1398 blend 1398 블렌드 1399 blend edges: blend width: 1399 경계 블렌드: 블렌드 너비: 1400 blend image overlaps over pixel width 1400 이미지 겹침을 픽셀 너비만큼 블렌드 1401 blend rate: center: 1401 블렌드 비율: 중심: 1402 blocking function: %s 1402 차단 기능: %s 1403 blocksize 1403 블록 크기 1404 blur edges: blur width: 1404 가장자리 블러: 블러 너비: 1405 blur radius 1405 블러 반경 1406 borders 1406 테두리 1407 both 'All Files' and specific files were selected 1407 '모든 파일'과 특정 파일이 모두 선택되었습니다 1408 bright halo 1408 밝은 헤일로 1409 brightness rescale 1409 밝기 재조정 1410 browse 1410 찾아보기 1411 brush size 1411 브러시 크기 1412 build index, old files only 1412 색인 생성, 이전 파일만 1413 cancel project 1413 프로젝트 취소 1414 cancel project? 1414 프로젝트를 취소할까요? 1415 cannot allocate %d MB memory 1415 %d MB 메모리를 할당할 수 없습니다 1416 cannot be determined 1416 확인할 수 없습니다 1417 cannot copy a file to itself 1417 파일을 자기 자신에게 복사할 수 없습니다 1418 cannot copy current file 1418 현재 파일을 복사할 수 없습니다 1419 cannot create output file 1419 출력 파일을 만들 수 없습니다 1420 cannot create pixbuf 1420 pixbuf를 만들 수 없습니다 1421 cannot find area outline 1421 영역 윤곽선을 찾을 수 없습니다 1422 cannot find output file 1422 출력 파일을 찾을 수 없습니다 1423 cannot load input file 1423 입력 파일을 불러올 수 없습니다 1424 cannot open file %s 1424 파일을 열 수 없습니다: %s 1425 cannot parse current file 1425 현재 파일을 분석할 수 없습니다 1426 cannot parse file 1426 파일을 분석할 수 없습니다 1427 cannot read pluging output file 1427 플러그인 출력 파일을 읽을 수 없습니다 1428 cannot replace %s file 1428 %s 파일을 바꿀 수 없습니다 1429 cannot save as RAW type 1429 RAW 형식으로 저장할 수 없습니다 1430 cannot save layout file: %s 1430 레이아웃 파일을 저장할 수 없습니다: %s 1431 cannot write image folders file: %s 1431 이미지 폴더 파일을 쓸 수 없습니다: %s 1432 category %s has too many keywords 1432 카테고리 %s에 keyword가 너무 많습니다 1433 category %s is too big 1433 카테고리 %s가 너무 큽니다 1434 center 1434 중심 1435 change project scale 1435 프로젝트 배율 변경 1436 choose 1-8 clicks or [+] keys for 2x image zoom 1436 이미지를 2배로 확대하려면 1~8회 클릭 또는 [+] 키를 선택하세요 1437 choose a better spot 1437 더 나은 지점을 선택하세요 1438 choose an image file 1438 이미지 파일 선택 1439 choose file 1439 파일 선택 1440 choose files 1440 파일 선택 1441 choose folder 1441 폴더 선택 1442 choose folders 1442 폴더 선택 1443 choose location 1443 위치 선택 1444 circle 1444 원 1445 clear area selections 1445 영역 선택 지우기 1446 clear entered text 1446 입력한 텍스트 지우기 1447 clear inputs 1447 입력 내용 지우기 1448 clear text 1448 텍스트 지우기 1449 click a defined keyword (below) to add a search keyword 1449 검색 keyword를 추가하려면 아래의 정의된 keyword를 클릭하세요 1450 click bright point 1450 밝은 지점 클릭 1451 click dark point 1451 어두운 지점 클릭 1452 click on desired color 1452 원하는 색상 클릭 1453 click on image to get source color 1453 이미지를 클릭해 원본 색상 가져오기 1454 click on image to set matching color 1454 이미지를 클릭해 일치시킬 색상 설정 1455 click on thumbnail to set zoom center 1455 thumbnail을 클릭해 zoom 중심 설정 1456 click position to add line 1456 선을 추가할 위치 클릭 1457 click position to add text 1457 텍스트를 추가할 위치 클릭 1458 click to select 1458 클릭해서 선택 1459 click to unselect 1459 클릭해서 선택 해제 1460 clicks per 2x image increase 1460 이미지를 2배로 확대하는 데 필요한 클릭 수 1461 color 1461 색상 1462 color depth 1462 색상 심도 1463 color depth: 1463 색상 심도: 1464 color match level % 1464 색상 일치 수준 % 1465 color negative 1465 컬러 네거티브 1466 column difference: %d pixels 1466 열 차이: %d픽셀 1467 column difference: %d pixels \nMake columns even? 1467 열 차이: %d픽셀 \n열을 맞출까요? 1468 combined image files 1468 결합된 이미지 파일 1469 command: 1469 명령: 1470 commit all changes, close dialog 1470 모든 변경 사항 커밋, 대화 상자 닫기 1471 complete file selection first 1471 먼저 파일 선택을 완료하세요 1472 completed 1472 완료됨 1473 condense into color blobs 1473 색상 덩어리로 압축 1474 condition 1474 조건 1475 confirm Fotocx exit 1475 Fotocx 종료 확인 1476 constant blur 1476 일정한 블러 1477 continue? 1477 계속하시겠습니까? 1478 converting colors... 1478 색상 변환 중... 1479 converting files 1479 파일 변환 중 1480 copy (duplicate file) 1480 복사 (파일 복제) 1481 copy and paste commands 1481 명령 복사 및 붙여넣기 1482 copy files to %s 1482 파일을 %s(으)로 복사 1483 copy metadata from Nth file: 1483 N번째 파일에서 metadata 복사: 1484 copy to Desktop failed: %s 1484 데스크톱으로 복사 실패: %s 1485 count: 0 1485 개수: 0 1486 create folder 1486 폴더 만들기 1487 create folder %s 1487 폴더 %s 만들기 1488 current gallery 1488 현재 갤러리 1489 current image files found: %d \n 1489 찾은 현재 이미지 파일: %d개 \n 1490 current set only 1490 현재 세트만 1491 current set: 1491 현재 세트: 1492 curve file is invalid 1492 곡선 파일이 잘못되었습니다 1493 custom command to play video files 1493 비디오 파일 재생용 사용자 지정 명령 1494 dark 1494 어둡게 1495 dark halo 1495 어두운 헤일로 1496 dark pixels 1496 어두운 픽셀 1497 data is incomplete, proceed? 1497 데이터가 불완전합니다, 계속하시겠습니까? 1498 date format is yyyy:mm:dd [hh:mm:ss] 1498 날짜 형식은 yyyy:mm:dd [hh:mm:ss]입니다 1499 date range 1499 날짜 범위 1500 days 1500 일 1501 delete 1501 삭제 1502 delete %s \n%s 1502 %s 삭제 \n%s 1503 delete Mashup project files? 1503 Mashup 프로젝트 파일을 삭제할까요? 1504 delete failed: \n%s 1504 삭제 실패: \n%s 1505 delete originals specified but no new name given 1505 원본 삭제가 지정되었지만 새 이름이 주어지지 않았습니다 1506 delete selected text from layout 1506 레이아웃에서 선택한 텍스트 삭제 1507 deleting orphan thumbnails ... \n 1507 고아 thumbnails 삭제 중 ... \n 1508 depth 1508 깊이 1509 descending 1509 내림차순 1510 direction of light and shadows 1510 빛과 그림자의 방향 1511 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1511 팝업 메뉴 등을 활성화하려면 thumbnail 선택을 비활성화하세요. \nthumbnail 선택을 재개하려면 [사용]을 사용하세요 1512 discard changes? 1512 변경 사항을 버릴까요? 1513 do not warp images during auto-alignment 1513 자동 정렬 중에는 이미지를 왜곡하지 않음 1514 do nothing 1514 아무것도 하지 않음 1515 dot size 1515 점 크기 1516 downsize 1516 축소 1517 drag image 1517 이미지 드래그 1518 drag mouse along an edge to follow the edge 1518 가장자리를 따라가려면 마우스를 드래그하세요 1519 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1519 아래오른쪽으로 마우스를 드래그해 타원을 그리세요 \nShift + 중심 드래그로 타원 이동 \nShift + 오른쪽 아래 가장자리 드래그로 변경 1520 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1520 마우스를 드래그해 상자를 그리세요 \nShift + 중심 드래그로 상자 이동 \nShift + 가장자리 드래그로 가장자리 이동 1521 drag mouse to outline an area 1521 마우스를 드래그해 영역 윤곽 그리기 1522 drag mouse to select circular or elliptical area 1522 마우스를 드래그해 원형 또는 타원형 영역 선택 1523 drag mouse to select rectangular area 1523 마우스를 드래그해 직사각형 영역 선택 1524 drag mouse to show selected image 1524 마우스를 드래그해 선택한 이미지 표시 1525 duplicate keyword 1525 중복된 keyword 1526 edge distance calculation 1526 가장자리 거리 계산 1527 edge: 1527 가장자리: 1528 edit 1528 편집 1529 edit commands 1529 명령 편집 1530 edit custom shell commands, match colors to embedded jpeg image 1530 사용자 지정 셸 명령 편집, 내장 jpeg 이미지에 색상 맞추기 1531 edit this menu 1531 이 메뉴 편집 1532 ellipse 1532 타원 1533 embedded numbers will sort by value 1533 숫자가 포함된 이름은 값 기준으로 정렬됩니다 1534 emboss 1534 엠보싱 1535 enter 2-character language code: en, de, fr ... 1535 2자리 언어 코드를 입력하세요: en, de, fr ... 1536 enter a project name 1536 프로젝트 이름 입력 1537 enter an album name 1537 앨범 이름 입력 1538 enter cities/locations, countries 1538 도시/장소, 국가 입력 1539 enter project name 1539 프로젝트 이름 입력 1540 enter tag name 1540 tag 이름 입력 1541 enter tag names 1541 tag 이름 입력 1542 erase 1542 지우기 1543 error compensation 1543 오차 보정 1544 exceed %d edits 1544 편집 횟수가 %d개를 초과했습니다 1545 exceed %d images 1545 이미지가 %d개를 초과했습니다 1546 exceed %d max files, cannot continue 1546 최대 파일 수 %d개를 초과해 계속할 수 없습니다 1547 exceed %d rows 1547 행이 %d개를 초과했습니다 1548 exceed %d selected files 1548 선택한 파일이 %d개를 초과했습니다 1549 exceed %d shortcuts 1549 단축키가 %d개를 초과했습니다 1550 exceeded %d line entries 1550 줄 항목이 %d개를 초과했습니다 1551 exceeded %d text entries 1551 텍스트 항목이 %d개를 초과했습니다 1552 exceeded max. images: %d 1552 최대 이미지 수(%d개)를 초과했습니다 1553 exceeded max. tiles: %d 1553 최대 타일 수(%d개)를 초과했습니다 1554 exit split-screen 1554 분할 화면 종료 1555 expand to these limits if smaller 1555 이보다 작으면 다음 한계까지 확대 1556 exporting files 1556 파일 내보내는 중 1557 extra indexed metadata tags > %d 1557 색인된 추가 metadata tags > %d 1558 extra metadata tags to include in index 1558 색인에 포함할 추가 metadata tags 1559 extra metadata tags: \n 1559 추가 metadata tags: \n 1560 fetch 1560 가져오기 1561 file 1561 파일 1562 file .ext names to recognize RAW files 1562 RAW 파일로 인식할 파일 확장자 1563 file .ext names to recognize video files 1563 비디오 파일로 인식할 파일 확장자 1564 file close error 1564 파일 닫기 오류 1565 file color 1565 파일 색상 1566 file error: %s 1566 파일 오류: %s 1567 file format error 1567 파일 형식 오류 1568 file format error: %s 1568 파일 형식 오류: %s 1569 file included: %s \n 1569 포함된 파일: %s \n 1570 file metadata update failed 1570 파일 metadata 업데이트 실패 1571 file name 1571 파일 이름 1572 file names 1572 파일 이름 1573 file not found 1573 파일을 찾을 수 없습니다 1574 file not found \n 1574 파일을 찾을 수 없습니다 \n 1575 file not found: %s 1575 파일을 찾을 수 없습니다: %s 1576 file not found: %s %s 1576 파일을 찾을 수 없습니다: %s %s 1577 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1577 파일 형식: .jp2 .heic .avif .webp \n.jpg로 변환됩니다 - 계속할까요? 1578 file: %s \nexceed 99 versions 1578 파일: %s \n버전이 99개를 초과했습니다 1579 filename text 1579 파일 이름 텍스트 1580 files in %s can be deleted 1580 %s의 파일을 삭제할 수 있습니다 1581 fill from current gallery 1581 현재 갤러리에서 채우기 1582 fill from selected files 1582 선택한 파일에서 채우기 1583 fill selected areas 1583 선택한 영역 채우기 1584 fill transparent areas 1584 투명한 영역 채우기 1585 find all image files ...\n 1585 모든 이미지 파일 찾는 중 ...\n 1586 find and report all unreadable image files 1586 읽을 수 없는 모든 이미지 파일 찾아 보고 1587 find outline gap 1587 윤곽선 빈틈 찾기 1588 find via table lookup 1588 표 조회를 통해 찾기 1589 find_imagefiles() failure \n 1589 find_imagefiles() 실패 \n 1590 find_imagefiles() failure: %s \n 1590 find_imagefiles() 실패: %s \n 1591 finish current edit first 1591 먼저 현재 편집을 완료하세요 1592 finish making a script file 1592 스크립트 파일 만들기 완료 1593 finish or cancel pending edit 1593 대기 중인 편집을 완료하거나 취소하세요 1594 fix box in layout and start new box 1594 레이아웃의 상자를 고정하고 새 상자 시작 1595 fix line in layout and start new line 1595 레이아웃의 선을 고정하고 새 선 시작 1596 fix motion blur 1596 모션 블러 보정 1597 fix oval in layout and start new oval 1597 레이아웃의 타원을 고정하고 새 타원 시작 1598 follow edge 1598 가장자리 따라가기 1599 font name and size for menus and dilogs 1599 메뉴 및 대화 상자의 글꼴 이름과 크기 1600 force a full re-index of all image files 1600 모든 이미지 파일을 완전히 다시 색인 1601 format: yyyy:mm:dd [hh:mm:ss] 1601 형식: yyyy:mm:dd [hh:mm:ss] 1602 fotocx will exit 1602 Fotocx가 종료됩니다 1603 found %d pixels 1603 %d픽셀을 찾았습니다 1604 free disk space: %d GB \n 1604 여유 디스크 공간: %d GB \n 1605 freehand draw 1605 자유형 그리기 1606 ftruncate() failure: %s 1606 ftruncate() 실패: %s 1607 full image index: reports will be complete \n 1607 전체 이미지 색인: 보고서가 완전해집니다 \n 1608 function canceled 1608 기능이 취소되었습니다 1609 gallery 1609 갤러리 1610 gallery is empty 1610 갤러리가 비어 있습니다 1611 gallery truncated to %d images 1611 갤러리가 %d개 이미지로 축소되었습니다 1612 get images having text in filename (comma separated) 1612 파일 이름에 텍스트가 포함된 이미지 가져오기 (쉼표로 구분) 1613 get images with matching keywords (comma separated) 1613 일치하는 keywords가 있는 이미지 가져오기 (쉼표로 구분) 1614 get images within rating range 1614 평점 범위 내 이미지 가져오기 1615 gradual paint 1615 점진적 페인트 1616 grid counts not 0-100: %s 1616 격자 수가 0~100이 아닙니다: %s 1617 grid picklist file error: %s 1617 격자 선택 목록 파일 오류: %s 1618 grid size 1618 격자 크기 1619 group 1619 그룹 1620 height 1620 높이 1621 hide area outlines 1621 영역 윤곽선 숨기기 1622 hide transient objects 1622 일시적 물체 숨기기 1623 high 1623 높음 1624 home folder was not changed 1624 홈 폴더가 변경되지 않았습니다 1625 horizontal 1625 가로 1626 hours 1626 시간 1627 icons only, text only, or both 1627 아이콘만, 텍스트만, 또는 둘 다 1628 if image < window, center or shift left or right 1628 이미지가 창보다 작으면 중앙 정렬 또는 좌우 이동 1629 ignore differences above limit 1629 한계를 초과하는 차이는 무시 1630 image blend 1630 이미지 블렌드 1631 image files 1631 이미지 파일 1632 image for source color 1632 원본 색상용 이미지 1633 image index records found: %d \n 1633 찾은 이미지 색인 레코드: %d개 \n 1634 image index required 1634 이미지 색인이 필요합니다 1635 image index write error: %s 1635 이미지 색인 쓰기 오류: %s 1636 image is too large to edit: %d x %d 1636 이미지가 너무 커서 편집할 수 없습니다: %d x %d 1637 image is too large: %dx%d, %lld megapix 1637 이미지가 너무 큽니다: %dx%d, %lld메가픽셀 1638 image is too small to edit: %d x %d 1638 이미지가 너무 작아서 편집할 수 없습니다: %d x %d 1639 image scale 1639 이미지 배율 1640 image to set matching color 1640 일치시킬 색상용 이미지 1641 image width must be greater than height 1641 이미지 너비는 높이보다 커야 합니다 1642 images to report 1642 보고할 이미지 1643 include all files 1643 모든 파일 포함 1644 include edited versions 1644 편집된 버전 포함 1645 include last versions only 1645 마지막 버전만 포함 1646 include original files 1646 원본 파일 포함 1647 include transparent areas 1647 투명한 영역 포함 1648 include: 1648 포함: 1649 increase blur with distance 1649 거리에 따라 블러 증가 1650 index completed, %.1f seconds \n 1650 색인 완료, %.1f초 \n 1651 index config file error: %s 1651 색인 설정 파일 오류: %s 1652 index updates needed: %d thumbnails: %d \n 1652 필요한 색인 업데이트: %d개, thumbnails: %d개 \n 1653 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1653 색인 업데이트: %d개 제목/설명 업데이트: %d개 \nthumbnail 업데이트: %d개, 삭제: %d개 \n 1654 input 1654 입력 1655 input file: %s \n 1655 입력 파일: %s \n 1656 insufficient memory, cannot proceed 1656 메모리가 부족해 계속할 수 없습니다 1657 insufficient overlap for color matching 1657 색상 일치를 위한 겹침이 부족합니다 1658 invalid GPS data 1658 잘못된 GPS 데이터 1659 invalid GPS data: %s 1659 잘못된 GPS 데이터: %s 1660 invalid album 1660 잘못된 앨범 1661 invalid date range: %s %s 1661 잘못된 날짜 범위: %s %s 1662 invalid date/time format 1662 잘못된 날짜/시간 형식 1663 invalid file 1663 잘못된 파일 1664 invalid plugin: %s 1664 잘못된 플러그인: %s 1665 invalid rating range 1665 잘못된 평점 범위 1666 invalid source file: %s 1666 잘못된 원본 파일: %s 1667 invert area 1667 영역 반전 1668 jpeg quality level - 70+ for good image quality 1668 jpeg 품질 수준 - 좋은 이미지 품질을 위해 70 이상 1669 keyboard 1669 키보드 1670 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1670 키보드 조작: \nEsc: 실행 중인 슬라이드 쇼 종료 \n방향키: 이전/다음 이미지 \nB: 창 비우기/비우기 해제 \nN: 다음 이미지로 전환 \nP: 일시 정지/재개 \nX: 마우스 위치에서 확대 1671 keyword names 1671 keyword 이름 1672 keywords to add 1672 추가할 keywords 1673 keywords to remove 1673 제거할 keywords 1674 keywords_defined file error: %s 1674 keywords_defined 파일 오류: %s 1675 last search 1675 마지막 검색 1676 last version 1676 마지막 버전 1677 last versions 1677 마지막 버전들 1678 layout exceeds 4 gigabytes 1678 레이아웃이 4기가바이트를 초과합니다 1679 layout file missing: %s 1679 레이아웃 파일이 없습니다: %s 1680 left 1680 왼쪽 1681 left click on image for selected color 1681 이미지를 왼쪽 클릭해 선택 색상 지정 1682 left click: set image source location \nright click: set corresponding destination 1682 왼쪽 클릭: 이미지 원본 위치 설정 \n오른쪽 클릭: 해당 대상 위치 설정 1683 left drag: add transparency \nright drag: add opacity 1683 왼쪽 드래그: 투명도 추가 \n오른쪽 드래그: 불투명도 추가 1684 left drag: copy image to mouse position \nright drag: restore original image 1684 왼쪽 드래그: 마우스 위치로 이미지 복사 \n오른쪽 드래그: 원본 이미지 복원 1685 left drag: reduce halo, right drag: undo 1685 왼쪽 드래그: 헤일로 줄이기, 오른쪽 드래그: 실행 취소 1686 lens mm 1686 렌즈 mm 1687 level based on EXIF roll angle 1687 EXIF 롤 각도 기반 수평 맞춤 1688 light 1688 밝게 1689 light pixels 1689 밝은 픽셀 1690 line 1690 선 1691 line color 1691 선 색상 1692 line width 1692 선 너비 1693 load 1693 불러오기 1694 load text data from a file 1694 파일에서 텍스트 데이터 불러오기 1695 load widgets failed: %s 1695 위젯 불러오기 실패: %s 1696 loading palette ... 1696 팔레트 불러오는 중 ... 1697 location is not a folder 1697 위치가 폴더가 아닙니다 1698 locations 1698 위치 1699 lock width/height ratio 1699 너비/높이 비율 고정 1700 log file is in a terminal 1700 로그 파일이 터미널에 있습니다 1701 low 1701 낮음 1702 low contrast 1702 낮은 대비 1703 lower 1703 낮추기 1704 make an initially empty album 1704 처음에 빈 앨범 만들기 1705 make new version 1705 새 버전 만들기 1706 manual align 1706 수동 정렬 1707 map marker (red dot) diameter, pixels 1707 지도 마커(빨간 점) 지름, 픽셀 1708 map selected areas and verify 1708 선택한 영역을 지도에 표시하고 확인 1709 mashup project 1709 매시업 프로젝트 1710 match embedded image color 1710 내장 이미지 색상 맞추기 1711 match image color to base image (repeat) 1711 기본 이미지에 이미지 색상 맞추기 (반복) 1712 match values 1712 값 일치 1713 matches 1713 일치 항목 1714 max keywords exceeded 1714 최대 keyword 수를 초과했습니다 1715 max. Width 1715 최대 너비 1716 max. album count exceeded: %d 1716 최대 앨범 수(%d개)를 초과했습니다 1717 max. album files reached, results truncated 1717 최대 앨범 파일 수에 도달해 결과가 잘렸습니다 1718 max. album size exceeded: %d 1718 최대 앨범 크기(%d개)를 초과했습니다 1719 max. blur radius 1719 최대 블러 반경 1720 max. brightness 1720 최대 밝기 1721 max. image limit reached: %d 1721 최대 이미지 한계(%d개)에 도달했습니다 1722 max. width or height is not reasonable 1722 너비 또는 높이 값이 적절하지 않습니다 1723 maximum clip allowed to fit window 1723 창에 맞추기 위한 최대 클립 1724 mean RGB: %5.0f %5.0f %5.0f 1724 평균 RGB: %5.0f %5.0f %5.0f 1725 mean noise: %5.2f %5.2f %5.2f 1725 평균 노이즈: %5.2f %5.2f %5.2f 1726 median 1726 중앙값 1727 median diff 1727 중앙값 차이 1728 menu text and background colors 1728 메뉴 텍스트 및 배경 색상 1729 metadata 1729 metadata 1730 metadata copy failed 1730 metadata 복사 실패 1731 metadata from Search Function, metadata report 1731 검색 기능의 metadata, metadata 보고서 1732 metadata picklist file not found %s 1732 metadata 선택 목록 파일을 찾을 수 없습니다: %s 1733 metadata tags to report 1733 보고할 metadata tags 1734 metadata update error 1734 metadata 업데이트 오류 1735 metadata update error \n 1735 metadata 업데이트 오류 \n 1736 metadata update error: %s 1736 metadata 업데이트 오류: %s 1737 metadata update failed \n 1737 metadata 업데이트 실패 \n 1738 min. blur radius 1738 최소 블러 반경 1739 min. contrast 1739 최소 대비 1740 min. edit curve node separation, % of scale length 1740 최소 편집 곡선 노드 간격, 배율 길이의 % 1741 min. separation, %c of scale 1741 최소 간격, 배율의 %c 1742 minutes 1742 분 1743 mmap() failure: %s 1743 mmap() 실패: %s 1744 months 1744 개월 1745 more than %d categories 1745 카테고리가 %d개를 초과했습니다 1746 more than 20 matches 1746 일치 항목이 20개를 초과했습니다 1747 mouse radius 1747 마우스 반경 1748 mouse radius for color sample 1748 색상 샘플용 마우스 반경 1749 mouse radius: 1749 마우스 반경: 1750 move (delete original) 1750 이동 (원본 삭제) 1751 move area boundary in/out in 1-pixel steps 1751 영역 경계를 1픽셀 단위로 안팎으로 이동 1752 move to next input file 1752 다음 입력 파일로 이동 1753 move to trash failed \n 1753 휴지통으로 이동 실패 \n 1754 move to trash failed: %s 1754 휴지통으로 이동 실패: %s 1755 multiply 1755 곱하기 1756 must have 4 corners 1756 모서리가 4개 있어야 합니다 1757 need numeric match value: %s 1757 숫자 일치 값이 필요합니다: %s 1758 negative 1758 네거티브 1759 new album created 1759 새 앨범이 생성되었습니다 1760 new album name 1760 새 앨범 이름 1761 new file 1761 새 파일 1762 new file ... 1762 새 파일 ... 1763 new file name is invalid 1763 새 파일 이름이 잘못되었습니다 1764 new file type 1764 새 파일 형식 1765 new home folder contains a blank 1765 새 홈 폴더에 공백이 포함되어 있습니다 1766 new location 1766 새 위치 1767 new location is not a folder 1767 새 위치가 폴더가 아닙니다 1768 new version 1768 새 버전 1769 newest files 1769 최신 파일 1770 no EXIF orientation data 1770 EXIF 방향 데이터가 없습니다 1771 no active Select Area 1771 활성화된 영역 선택이 없습니다 1772 no albums selected 1772 선택된 앨범이 없습니다 1773 no auto warp 1773 자동 왜곡 없음 1774 no change 1774 변경 없음 1775 no current album 1775 현재 앨범이 없습니다 1776 no current edit image 1776 현재 편집 중인 이미지가 없습니다 1777 no current file 1777 현재 파일이 없습니다 1778 no curve (scanned image) 1778 곡선 없음 (스캔된 이미지) 1779 no description 1779 설명 없음 1780 no file selected 1780 선택된 파일이 없습니다 1781 no files found 1781 파일을 찾을 수 없습니다 1782 no files selected 1782 선택된 파일이 없습니다 1783 no host files selected 1783 선택된 호스트 파일이 없습니다 1784 no image index: reports disabled \n 1784 이미지 색인 없음: 보고서 사용 안 함 \n 1785 no images 1785 이미지 없음 1786 no images found 1786 이미지를 찾을 수 없습니다 1787 no input files available 1787 사용 가능한 입력 파일이 없습니다 1788 no matching files found 1788 일치하는 파일을 찾을 수 없습니다 1789 no matching locations 1789 일치하는 위치가 없습니다 1790 no metadata level data 1790 metadata 수준 데이터가 없습니다 1791 no metadata tags to report 1791 보고할 metadata tags가 없습니다 1792 no option selected 1792 선택된 옵션이 없습니다 1793 no overlay file selected 1793 선택된 오버레이 파일이 없습니다 1794 no photo date, skipped 1794 촬영 날짜가 없어 건너뜀 1795 no plugin output file found 1795 플러그인 출력 파일을 찾을 수 없습니다 1796 no prior edit 1796 이전 편집 없음 1797 no prior edit image 1797 이전 편집 이미지 없음 1798 no saved folders 1798 저장된 폴더가 없습니다 1799 no script file was started 1799 시작된 스크립트 파일이 없습니다 1800 no script files found 1800 스크립트 파일을 찾을 수 없습니다 1801 no select area 1801 선택된 영역이 없습니다 1802 no selection 1802 선택 없음 1803 no title 1803 제목 없음 1804 no write permission 1804 쓰기 권한이 없습니다 1805 no write permission \n 1805 쓰기 권한이 없습니다 \n 1806 no write permission: %s 1806 쓰기 권한이 없습니다: %s 1807 none 1807 없음 1808 not a known image file 1808 알려진 이미지 파일이 아닙니다 1809 not an image file 1809 이미지 파일이 아닙니다 1810 not an indexed image file \n 1810 색인되지 않은 이미지 파일입니다 \n 1811 nothing found 1811 찾은 항목이 없습니다 1812 nothing left, no change made 1812 남은 것이 없어 변경되지 않았습니다 1813 old file 1813 이전 파일 1814 old image index: reports will omit new files \n 1814 이전 이미지 색인: 보고서에서 새 파일이 제외됩니다 \n 1815 old keyword name >> new keyword name 1815 이전 keyword 이름 >> 새 keyword 이름 1816 omit high pixel 1816 높은 픽셀 제외 1817 omit low pixel 1817 낮은 픽셀 제외 1818 only %d tile images found 1818 타일 이미지를 %d개만 찾았습니다 1819 opacity center 1819 불투명도 중심 1820 opacity edge 1820 불투명도 가장자리 1821 open album 1821 앨범 열기 1822 open and process color chart 1822 색상 차트 열기 및 처리 1823 open as new current file 1823 새 현재 파일로 열기 1824 optional deselect color 1824 선택적 색상 선택 해제 1825 original 1825 원본 1826 originals 1826 원본들 1827 other 1827 기타 1828 out of space for temp files \nsave your edits and quit Fotocx 1828 임시 파일을 위한 공간이 부족합니다 \n편집 내용을 저장하고 Fotocx를 종료하세요 1829 outline 1829 윤곽선 1830 output file exists 1830 출력 파일이 이미 존재합니다 1831 output file exists, overwrite? 1831 출력 파일이 이미 존재합니다, 덮어쓸까요? 1832 output file size change, cannot use select area 1832 출력 파일 크기가 변경되어 영역 선택을 사용할 수 없습니다 1833 output file: 1833 출력 파일: 1834 output file: %s \n 1834 출력 파일: %s \n 1835 oval 1835 타원 1836 overlay file missing: %s 1836 오버레이 파일이 없습니다: %s 1837 owner 1837 소유자 1838 paint 1838 페인트 1839 paint color 1839 페인트 색상 1840 paint edits cannot be used for this method 1840 이 방법에는 페인트 편집을 사용할 수 없습니다 1841 paint over transparent areas 1841 투명한 영역 위에 페인트 1842 paint radius 1842 페인트 반경 1843 palette 1843 팔레트 1844 palette exceeds %d color limit 1844 팔레트가 색상 한계(%d개)를 초과합니다 1845 palette file 1845 팔레트 파일 1846 palette has %d colors 1846 팔레트에 색상 %d개가 있습니다 1847 palette loaded, %d colors 1847 팔레트가 불러와졌습니다, 색상 %d개 1848 palette: 1848 팔레트: 1849 patch area goal 1849 패치 영역 목표 1850 percent 1850 퍼센트 1851 perform edits to include in the script file 1851 스크립트 파일에 포함할 편집 수행 1852 permissions: 1852 권한: 1853 perspective 1853 원근 1854 photo 1854 사진 1855 picklist file not found: %s 1855 선택 목록 파일을 찾을 수 없습니다: %s 1856 pixel = mean of best match neighbors 1856 픽셀 = 가장 잘 맞는 인접 픽셀의 평균 1857 pixel = median of all neighbors 1857 픽셀 = 모든 인접 픽셀의 중앙값 1858 please make a choice 1858 선택해 주세요 1859 plugin command failed 1859 플러그인 명령 실패 1860 plugin menu not found %s 1860 플러그인 메뉴를 찾을 수 없습니다: %s 1861 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1861 플러그인: (연 월 일 이전 이름 순서) $yyyy $mm $dd $oldname $s 1862 popup_choose: empty list 1862 popup_choose: 빈 목록 1863 position with mouse click/drag 1863 마우스 클릭/드래그로 위치 지정 1864 position: 50 50 1864 위치: 50 50 1865 position: x=%02d y=%02d 1865 위치: x=%02d y=%02d 1866 power 1866 파워 1867 power center 1867 파워 중심 1868 power edge 1868 파워 가장자리 1869 power: center 1869 파워: 중심 1870 pref 1870 환경설정 1871 previous file 1871 이전 파일 1872 previous name 1872 이전 이름 1873 print color chart 1873 색상 차트 인쇄 1874 print select area(s) only? 1874 선택 영역만 인쇄할까요? 1875 prior edit step 1875 이전 편집 단계 1876 project complete 1876 프로젝트 완료 1877 project file is defective 1877 프로젝트 파일이 손상되었습니다 1878 project name cannot have quote characters 1878 프로젝트 이름에는 따옴표 문자를 사용할 수 없습니다 1879 pure RGB or black/white dots 1879 순수 RGB 또는 흑백 점 1880 quality 1880 품질 1881 quality level (70+) 1881 품질 수준 (70 이상) 1882 radius 1882 반경 1883 radius: 1883 반경: 1884 random 1884 무작위 1885 random position 1885 무작위 위치 1886 rating range 1886 평점 범위 1887 reading image index file ...\n 1887 이미지 색인 파일 읽는 중 ...\n 1888 recent files 1888 최근 파일 1889 reduce bright 1889 밝은 부분 줄이기 1890 reduce dark 1890 어두운 부분 줄이기 1891 reduce to these limits if larger 1891 이보다 크면 이 한계까지 축소 1892 refresh 1892 새로 고침 1893 remove %d duplicates? 1893 중복 %d개를 제거할까요? 1894 remove all files in list 1894 목록의 모든 파일 제거 1895 remove duplicate 1895 중복 제거 1896 remove from set 1896 세트에서 제거 1897 remove panorama image curving 1897 파노라마 이미지 곡률 제거 1898 remove selected file from list 1898 목록에서 선택한 파일 제거 1899 rename keywords 1899 keywords 이름 바꾸기 1900 repair metadata for %s 1900 %s의 metadata 복구 1901 replace 1901 바꾸기 1902 replace album %s ? 1902 앨범 %s을(를) 바꿀까요? 1903 replace file 1903 파일 바꾸기 1904 replace old 1904 이전 항목 바꾸기 1905 replace old file (OVERWRITE) 1905 이전 파일 바꾸기 (덮어쓰기) 1906 replace substring within file name 1906 파일 이름 내 부분 문자열 바꾸기 1907 report type: 1907 보고서 유형: 1908 req. color match 1908 필요한 색상 일치도 1909 reset 1909 재설정 1910 resolution 1910 해상도 1911 resume from current image 1911 현재 이미지에서 재개 1912 right 1912 오른쪽 1913 right click on image for deselected color 1913 선택 해제 색상을 지정하려면 이미지를 오른쪽 클릭하세요 1914 sample % 1914 샘플 % 1915 save 1915 저장 1916 save Mashup output file 1916 Mashup 출력 파일 저장 1917 save Mashup project? 1917 Mashup 프로젝트를 저장할까요? 1918 save area as a PNG file 1918 영역을 PNG 파일로 저장 1919 save as new file name or type 1919 새 파일 이름 또는 형식으로 저장 1920 save as new file version 1920 새 파일 버전으로 저장 1921 save edit, start new text 1921 편집 저장, 새 텍스트 시작 1922 save metadata to image file 1922 이미지 파일에 metadata 저장 1923 save text data to a file 1923 텍스트 데이터를 파일로 저장 1924 save to .heic/.avif file not supported 1924 .heic/.avif 파일로 저장은 지원되지 않습니다 1925 save to .jp2 file not supported 1925 .jp2 파일로 저장은 지원되지 않습니다 1926 save to .webp file not supported 1926 .webp 파일로 저장은 지원되지 않습니다 1927 scan and save color chart 1927 색상 차트 스캔 및 저장 1928 scanned color chart file 1928 스캔된 색상 차트 파일 1929 scope of neighbor pixels 1929 인접 픽셀의 범위 1930 script already started 1930 스크립트가 이미 시작되었습니다 1931 script complete 1931 스크립트 완료 1932 script error: %s, %s 1932 스크립트 오류: %s, %s 1933 script file closed 1933 스크립트 파일이 닫혔습니다 1934 script file error 1934 스크립트 파일 오류 1935 script file format error: %s 1935 스크립트 파일 형식 오류: %s 1936 script file name too big 1936 스크립트 파일 이름이 너무 깁니다 1937 script file to run 1937 실행할 스크립트 파일 1938 search for names in image location metadata 1938 이미지 위치 metadata에서 이름 검색 1939 search for text within file folders or file name 1939 파일 폴더 또는 파일 이름 내 텍스트 검색 1940 search for text within image title or description 1940 이미지 제목 또는 설명 내 텍스트 검색 1941 search known locations 1941 알려진 위치 검색 1942 search range 1942 검색 범위 1943 search: 1943 검색: 1944 seconds 1944 초 1945 seconds to show with text 1945 텍스트와 함께 표시할 시간(초) 1946 seconds to show without text 1946 텍스트 없이 표시할 시간(초) 1947 select all 1947 모두 선택 1948 select all colors within mouse (flood) 1948 마우스 내 모든 색상 선택 (플러드) 1949 select area missing or not finished 1949 선택 영역이 없거나 완료되지 않았습니다 1950 select area within mouse 1950 마우스 내 영역 선택 1951 select area within mouse circle 1951 마우스 원 내 영역 선택 1952 select base image for color matching 1952 색상 맞추기용 기본 이미지 선택 1953 select by color, required match level 1953 색상으로 선택, 필요한 일치 수준 1954 select by color, search range 1954 색상으로 선택, 검색 범위 1955 select font 1955 글꼴 선택 1956 select image to show with mouse paint 1956 마우스 페인트로 표시할 이미지 선택 1957 select images randomly 1957 이미지를 무작위로 선택 1958 select initial files 1958 초기 파일 선택 1959 select line color 1959 선 색상 선택 1960 select one color within mouse 1960 마우스 내 색상 하나 선택 1961 select rectangle 1961 직사각형 선택 1962 select source image color first 1962 먼저 원본 이미지 색상 선택 1963 select surrounding areas matching colors in mouse 1963 마우스 내 색상과 일치하는 주변 영역 선택 1964 selection exceeds %d tags 1964 선택 항목이 %d개의 tags를 초과합니다 1965 sepia 1965 세피아 1966 set a new date/time: 1966 새 날짜/시간 설정: 1967 set all 1967 모두 설정 1968 set current window size 1968 현재 창 크기 설정 1969 set image color from input files 1969 입력 파일에서 이미지 색상 설정 1970 set location from world map 1970 세계 지도에서 위치 설정 1971 set maximum crop 1971 최대 자르기 설정 1972 shadow 1972 그림자 1973 shell command used for converting RAW files to RGB 1973 RAW 파일을 RGB로 변환하는 데 사용되는 셸 명령 1974 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1974 Shift + 왼쪽 클릭: 이미지에서 색상 선택 \n왼쪽 드래그: 이미지에 색상 페인트 \n오른쪽 드래그: 원본 이미지 복원 1975 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1975 Shift + 왼쪽 클릭: 복사 위치 동기화 \n왼쪽 드래그: 원본 이미지를 마우스로 복사 \n오른쪽 드래그: 원본 이미지 복원 1976 shift existing date/time (+/–): 1976 기존 날짜/시간 이동 (+/–): 1977 shift+click on image to select color 1977 Shift+클릭으로 이미지에서 색상 선택 1978 shortcut function not found: %s 1978 단축키 기능을 찾을 수 없습니다: %s 1979 shortcut key: 1979 단축키: 1980 shortcut not found: %s 1980 단축키를 찾을 수 없습니다: %s 1981 show area outlines 1981 영역 윤곽선 표시 1982 show hidden files and folders 1982 숨김 파일 및 폴더 표시 1983 show transient objects 1983 일시적 물체 표시 1984 size of mouse selection circle 1984 마우스 선택 원의 크기 1985 smooth 1985 매끄럽게 1986 source file: 1986 원본 파일: 1987 source image failure (scale too big?) 1987 원본 이미지 실패 (배율이 너무 큼?) 1988 source image scale 1988 원본 이미지 배율 1989 specify a thumbnail folder 1989 thumbnail 폴더를 지정하세요 1990 specify at least 1 top image folder 1990 최소 1개의 최상위 이미지 폴더를 지정하세요 1991 specify background size and color 1991 배경 크기와 색상을 지정하세요 1992 specify files and keywords 1992 파일과 keywords를 지정하세요 1993 spot size limit 1993 반점 크기 한계 1994 start 1994 시작 1995 start a new script file 1995 새 스크립트 파일 시작 1996 start album 1996 앨범 시작 1997 start blob condensation process 1997 덩어리 압축 프로세스 시작 1998 start file 1998 시작 파일 1999 start folder 1999 시작 폴더 2000 start from first image in album 2000 앨범의 첫 이미지부터 시작 2001 start fusion process 2001 퓨전 프로세스 시작 2002 start over at end of album 2002 앨범 끝에서 다시 시작 2003 start warp 2003 왜곡 시작 2004 start with previous image file, gallery of recent files, etc. 2004 이전 이미지 파일, 최근 파일 갤러리 등으로 시작 2005 startup album is invalid 2005 시작 앨범이 잘못되었습니다 2006 startup file is invalid 2006 시작 파일이 잘못되었습니다 2007 startup folder is invalid 2007 시작 폴더가 잘못되었습니다 2008 status: %s \n 2008 상태: %s \n 2009 status: completed \n 2009 상태: 완료됨 \n 2010 stay open 2010 열어 둔 상태 유지 2011 step 2011 단계 2012 stop 2012 중지 2013 stop blob condensation process 2013 덩어리 압축 프로세스 중지 2014 stop fusion process 2014 퓨전 프로세스 중지 2015 supply a file name 2015 파일 이름을 입력하세요 2016 tag name 2016 tag 이름 2017 tag name %s not in xmeta tag list 2017 tag 이름 %s이(가) xmeta tag 목록에 없습니다 2018 tag value 2018 tag 값 2019 target file: 2019 대상 파일: 2020 template 2020 템플릿 2021 test: show changes, do not update files 2021 테스트: 변경 사항 표시, 파일은 업데이트하지 않음 2022 text 2022 텍스트 2023 text file is defective 2023 텍스트 파일이 손상되었습니다 2024 text time 2024 텍스트 표시 시간 2025 this function cannot be scripted 2025 이 기능은 스크립트로 만들 수 없습니다 2026 thumbnail file 2026 thumbnail 파일 2027 thumbnails deleted: %d \n 2027 삭제된 thumbnails: %d개 \n 2028 thumbnails folder: %s \n 2028 thumbnails 폴더: %s \n 2029 tile area goal 2029 타일 영역 목표 2030 tile gap 2030 타일 간격 2031 tile size 2031 타일 크기 2032 time 2032 시간 2033 title/desc. 2033 제목/설명 2034 to add images to current set, \nsearch all images 2034 현재 세트에 이미지를 추가하려면 \n모든 이미지를 검색하세요 2035 to remove images from current set, \nsearch current set 2035 현재 세트에서 이미지를 제거하려면 \n현재 세트를 검색하세요 2036 too many categories 2036 카테고리가 너무 많습니다 2037 too many files, cannot continue 2037 파일이 너무 많아 계속할 수 없습니다 2038 too many keywords in a category 2038 카테고리에 keyword가 너무 많습니다 2039 top image folders: \n 2039 최상위 이미지 폴더: \n 2040 transition 2040 전환 2041 transitions 2041 전환 2042 trash 2042 휴지통 2043 trimmed color chart file 2043 자른 색상 차트 파일 2044 unable to save bookmarks file 2044 북마크 파일을 저장할 수 없습니다 2045 unknown edit function: %s 2045 알 수 없는 편집 기능: %s 2046 unknown file type 2046 알 수 없는 파일 형식 2047 unknown or empty album: %s 2047 알 수 없거나 비어 있는 앨범: %s 2048 unsharp mask 2048 언샤프 마스크 2049 update 2049 업데이트 2050 updating albums ...\n 2050 앨범 업데이트 중 ...\n 2051 upper 2051 위쪽 2052 upsize 2052 확대 2053 use 2053 사용 2054 use a saved Mashup project 2054 저장된 Mashup 프로젝트 사용 2055 use average 2055 평균 사용 2056 use custom color palette 2056 사용자 지정 색상 팔레트 사용 2057 use median 2057 중앙값 사용 2058 use option to stop accidental quit 2058 실수로 종료되는 것을 막으려면 옵션 사용 2059 use previous input 2059 이전 입력 사용 2060 use previous location 2060 이전 위치 사용 2061 use prior edit step: 2061 이전 편집 단계 사용: 2062 use the current image file 2062 현재 이미지 파일 사용 2063 variance 2063 분산 2064 versions 2064 버전 2065 vertical 2065 세로 2066 video files not supported (install ffmpeg) 2066 비디오 파일은 지원되지 않습니다 (ffmpeg 설치 필요) 2067 view album 2067 앨범 보기 2068 waiting 2068 대기 중 2069 warp 2069 왜곡 2070 warp and align selected image with mouse drags 2070 마우스 드래그로 선택한 이미지 왜곡 및 정렬 2071 warp and fine-align selected image with neighbor 2071 인접 이미지와 선택한 이미지 왜곡 및 정밀 정렬 2072 warp span 2072 왜곡 범위 2073 wavelength 2073 파장 2074 width 2074 너비 2075 writing updated image index file \n 2075 업데이트된 이미지 색인 파일 쓰는 중 \n 2076 x-count 2076 X 개수 2077 x-offset 2077 X 오프셋 2078 y-count 2078 Y 개수 2079 y-offset 2079 Y 오프셋 2080 years 2080 년 2081 you can close this window now \n 2081 이제 이 창을 닫을 수 있습니다 \n 2082 you cannot use new name and replace text together 2082 새 이름과 텍스트 바꾸기를 함께 사용할 수 없습니다 2083 you must use either $s or $oldname 2083 $s 또는 $oldname 중 하나를 사용해야 합니다 2084 zoom image 2084 이미지 확대 2085 zoom via mouse wheel or Keys +/=/-/↑/↓ 2085 마우스 휠 또는 +/=/-/↑/↓ 키로 zoom 2086 zoom-in 2086 zoom-in 2087 zoom-out 2087 zoom-out fotocx/data/translations/ug_it0000664000175000017500000104624115247006657015532 0ustar micomico- ^FOTOCX GUIDA UTENTE^ v.26.8 Visualizzala tramite il menu Fotocx Aiuto > Guida Utente - {UTILIZZO DI FOTOCX} {PRIMO AVVIO} - individuazione e indicizzazione dei file immagine per una ricerca veloce {GUIDA UTENTE} ← ^clicca qui^ - come usare questo browser della guida utente {VISTE E MENU FINESTRA} - finestre di primo livello e menu associati {VISUALIZZA FILE} - finestra Vista File (visualizza un singolo file immagine) {VISUALIZZAZIONE GALLERIA} - finestra Vista Galleria (visualizza una cartella come thumbnails) {VISTA MAPPA} - finestra vista mappa (visualizza una mappa con i marcatori di posizione delle immagini) {TRASCINA E RILASCIA} - metodi di trascinamento e rilascio dei file {MODIFICA PROCEDURE} - come modificare i file immagine {MODIFICA WORKFLOW} - metodi di modifica alternativi - semplice e complesso {PROPRIETÀ MOUSE} - controllo e interazione mouse-dialogo {MOUSE ALT-TASTO DESTRO} - tasto destro del mouse per touchpad/schermi {PULSANTI DIALOGO} - opzioni di completamento del dialogo {TASTO ESC TASTIERA} - funzioni del tasto Esc {WIDGET DI DIALOGO NON STANDARD} - come usare i widget di dialogo non standard {MODIFICA CURVA} - come manipolare le curve usate nelle funzioni di modifica {MOUSE PAINTING} - modifica locale di un'immagine usando il mouse {ELABORAZIONE BATCH} - panoramica delle funzioni di elaborazione batch {SELEZIONA FILE IMMAGINE} - procedura di selezione dei file immagine {SCORCIATOIE} - menu popup, scorciatoie da tastiera, menu utente personalizzato {FUNZIONI MOUSE} - funzioni del mouse per le viste file/galleria/mappa {PARAMETRI COMANDO} - parametri della riga di comando di Fotocx - {MENU FILE} {NUOVA SESSIONE} - avvia una nuova sessione di Fotocx in una finestra separata {APRI FILE IMMAGINE} - apri un file immagine per la visualizzazione o la modifica {CICLO 2 FILE} - alterna tra gli ultimi due file immagine visualizzati {CICLO 3 FILE} - alterna tra gli ultimi tre file immagine visualizzati {VISUALIZZA PANO 360°} - immagine panoramica a 360° con punto di vista rotante {IMMAGINE VUOTA} - crea un'immagine vuota con dimensioni e colore specificati {IMMAGINE VUOTA} - crea una nuova immagine vuota {COPIA/SPOSTA} - copia o sposta un file immagine in un'altra cartella {COPIA SUL DESKTOP} - copia un file immagine sul desktop {COPIA NEGLI APPUNTI} - copia un file immagine negli appunti {ELIMINA/CESTINA} - elimina o cestina un file immagine {IMPOSTA SFONDO DESKTOP} - imposta lo sfondo del desktop dal file immagine corrente {STAMPA IMMAGINE} - stampa un file immagine {STAMPA CALIBRATA} - stampa usando i dati di calibrazione colore {CALIBRA STAMPANTE} - calibra il colore della stampante - compensa le variazioni di colore - {MENU GALLERIA} {PANORAMICA GALLERIA} {VISTA MINIATURE} - Vista Galleria con thumbnails e nomi dei file {VISTA METADATA} - Vista Galleria con thumbnail e metadata di base {FILE RECENTI} - Vista Galleria dei file immagine visti più di recente {FILE PIÙ RECENTI} - Vista Galleria dei file immagine più recenti {ORDINAMENTO GALLERIA} - cambia l'ordine di ordinamento di una galleria {FILTRO GALLERIA} - seleziona i più recenti, i più vecchi, corrispondenti a un modello ... {HOME GALLERIA} - salta all'inizio della galleria {FINE GALLERIA} - salta alla fine della galleria {CARTELLA FILE CORRENTE} - imposta la galleria corrente dalla cartella del file corrente {CARTELLE RECENTI} - visualizza l'elenco delle cartelle viste di recente, seleziona {ALBERO CARTELLE} - visualizza le cartelle dei file immagine in una struttura ad albero, seleziona {SELEZIONA FILE} - seleziona i file come input per batch, script o album {SEGNALIBRI} - visualizza l'elenco dei segnalibri, vai a un segnalibro {MODIFICA SEGNALIBRI} - aggiungi, rimuovi, riordina i segnalibri - {MAPS MENU} {MAPPA DEL MONDO} - panoramica della mappa del mondo via internet {MOSTRA SULLA MAPPA} - mostra la posizione dell'immagine corrente sulla mappa - {MENU ALBUM} {ALBUM} - crea e organizza raccolte di immagini {CREA ALBUM} - crea un nuovo album (galleria di immagini scelte) {RINOMINA ALBUM} - rinomina un album esistente {ELIMINA ALBUM} - elimina un album esistente {SCEGLI ALBUM} - scegli un album e visualizza la galleria delle immagini {ALBUM CORRENTE} - mostra l'album corrente (l'ultimo usato) {DA GALLERIA AD ALBUM} - salva la galleria corrente come album con nome {MODIFICA ALBUM} - aggiungi, rimuovi, riordina i file immagine in una galleria album {AGGIORNA ALBUM} - aggiorna gli album per i file immagine aggiornati (nuove versioni) {AGGIORNAMENTO MASSIVO ALBUM} aggiornamento massivo degli album (aggiunta/rimozione/sostituzione file membri) {PRESENTAZIONE} - presentazione con transizioni animate e pan/zoom delle immagini - {MENU PERSONALIZZATO} - menu utente personalizzato per le funzioni usate di frequente {FILE SCRIPT} - panoramica dei file di script {MODIFICA SCRIPT} - registra le modifiche in uno script per creare una funzione di modifica personalizzata {ESEGUI SCRIPT} - esegui lo script sull'immagine corrente {SCRIPT BATCH} - esegui lo script sui file immagine selezionati {PLUGIN} - avvia una funzione di modifica plugin, apri il file di output del plugin - {ZOOM} - zoom dell'immagine o dei thumbnails avanti/indietro tramite mouse o tastiera - {PREC/SUCC} - vai all'immagine precedente o successiva tramite mouse o tastiera - {SALVA FILE} - salva il file immagine (sostituisci, nuova versione, nuovo nome file) - {MENU METADATA} {VISUALIZZA META PRINCIPALI} - elenca i metadata principali dell'immagine {VISUALIZZA TUTTI I META} - elenca tutti i metadata dell'immagine {PANORAMICA KEYWORDS} - keyword usate per la ricerca delle immagini {GEOTAGS OVERVIEW} - nomi di posizione e geocoordinate per la ricerca {MODIFICA META PRINCIPALI} - modifica i metadata usati comunemente {MODIFICA QUALSIASI META} - modifica qualsiasi metadata (aggiungi, rimuovi, cambia) {ELIMINA META} - elimina metadata specificati o tutti i metadata {COPIA META} - copia i metadata da un file immagine a un altro {CORREGGI META} - ripara metadata malformati che impediscono le modifiche ai metadata {GESTISCI KEYWORDS} - gestisci le keyword definite dall'utente {DIDASCALIE} - mostra il nome del file, il titolo, la descrizione nell'angolo dell'immagine {LUOGHI/DATE} - elenca posizioni/date delle immagini, clicca per la galleria {CRONOLOGIA} - mostra il conteggio delle immagini per anno/mese, clicca per la galleria {TAG METADATA} - mostra il conteggio delle immagini per valore di tag, clicca per la galleria {RICERCA AUTOMATICA} - funzione Cerca scriptata per trovare i file {CERCA IMMAGINI} - cerca usando qualsiasi metadata o nome di cartella/file - {MENU SELEZIONA} {PANORAMICA AREA} - seleziona area - concetti e utilizzo {SELEZIONA AREA} - seleziona una caratteristica o un'area dell'immagine per modificarla separatamente {TROVA INTERRUZIONE AREA} - trova un'interruzione nel contorno di un'area disegnata a mano {SFUMATURA AREA} - fondi con il mouse le modifiche fatte all'interno di un'area selezionata {MOSTRA/NASCONDI AREA} - mostra o nascondi i contorni delle aree {ABILITA/DISABILITA AREA} - abilita o disabilita un'area per la modifica {INVERTI AREA} - inverti un'area (scambia le aree esterna/interna) {CANCELLA AREA} - rimuovi un'area {COPIA/INCOLLA AREA} - copia un'area o incolla un'area nell'immagine corrente {CARICA/SALVA AREA} - carica un'area da un file o salvala in un file - {PULSANTE ANNULLA/RIPRISTINA} - annulla o ripeti in sequenza le modifiche all'immagine corrente - {MENU MODIFICA} {RUOTA} - ruota o livella un'immagine {RADDRIZZAMENTO} - raddrizza un'immagine ruotata o specchiata {RITAGLIA} - ritaglia (rifila) i margini dell'immagine {RITOCCA} - modifica luminosità, contrasto, colore, saturazione {RIDIMENSIONA} - cambia le dimensioni in pixel dell'immagine {SCHERMO DIVISO} - visualizza le modifiche prima/dopo usando lo schermo diviso {MOSTRA DIFFERENZE} - evidenzia le modifiche durante la modifica (o due immagini qualsiasi) {MARGINI} - aggiungi margini a un'immagine, di qualsiasi colore o trasparenza {MARKUP} - disegna sull'immagine: testo, linea/freccia, rettangolo, ovale {MODALITÀ COLORE} - converti in bianco e nero, colore, negativo, positivo {MODIFICHE PITTURA} - dipingi con il mouse una funzione di modifica localmente e gradualmente {DIPINGI IMMAGINE} - dipingi con il mouse usando un colore, una dimensione del pennello e un'opacità {DIPINGI TRASPARENZA} - dipingi trasparenza crescente usando il mouse {RIEMPIMENTO AREA} - riempi le aree selezionate o le aree trasparenti con un colore {COPIA IN IMMAGINE} - copia pixel all'interno di un'immagine usando il mouse {COPIA DA IMMAGINE} - copia pixel da un'altra immagine usando il mouse {COPIA MODIFICA PRECEDENTE} - copia pixel da modifiche precedenti usando il mouse - {MENU RIPARA} {NITIDEZZA} - aumenta la nitidezza di un'immagine sfocata, più metodi {SFOCATURA} - sfoca un'immagine o un'area dell'immagine, più metodi {RIDUZIONE RUMORE} - riduci il rumore dell'immagine (piccole macchie casuali) {DEFOG} - aggiungi o rimuovi foschia/nebbia da un'immagine o area selezionata {OCCHI ROSSI} - rimuovi gli occhi rossi dalle foto con flash {CANCELLAZIONE INTELLIGENTE} - rimuovi linee elettriche, cartelli, altri piccoli elementi di disturbo {RIMUOVI ALONE} - rimuovi gli aloni lasciati dalla nitidezza e da altre funzioni {ARTEFATTI JPEG} - riduci gli artefatti nei file altamente compressi {ANTIALIASING} - riduci la pixelizzazione (scalettatura) lungo i bordi delle caratteristiche {REGOLA RGB} - regola i colori dell'immagine usando i colori RGB o CMY {REGOLA HSL} - seleziona e cambia i colori usando il modello colore HSL {RIMUOVI POLVERE} - rimuovi macchie di polvere dalle immagini di vecchie foto {FRANGE} - correggi le frange di colore periferiche (aberrazione cromatica) - {MENU RAFFINA} {APPIATTISCI ISTOGRAMMA} - appiattisci l'istogramma di luminosità per un dettaglio migliore {CONTRASTO LOCALE} - aggiungi contrasto adattato alla luminosità dell'area locale {AMPLIFICA CONTRASTO} - amplifica il contrasto esistente per migliorare i dettagli {RETINEX GLOBALE} - riscala i valori RGB per una gamma maggiore {RETINEX LOCALE} - riscala i valori RGB per una gamma maggiore {SATURAZIONE} - regola la saturazione del colore in base alla luminosità {MESSA A FUOCO MORBIDA} - applica il classico effetto "messa a fuoco morbida" a un'immagine {GRADAZIONE LUMINOSITÀ} - aggiungi una rampa di luminosità/colore attraverso un'immagine {VIGNETTATURA} - cambia la luminosità/colore radialmente intorno a un centro scelto - {MENU EFFETTI} {CONTORNI} - converti un'immagine in un disegno a contorni {SCHIZZO1} - converti un'immagine in uno schizzo simulato (1) {SCHIZZO2} - converti un'immagine in uno schizzo simulato (2) {CARTONE ANIMATO} - converti un'immagine in un disegno stile cartone animato {RILIEVO} - converti un'immagine in un rilievo simulato (effetto 3D) {TESSERE1} - converti un'immagine in tessere quadrate con effetto 3D {TESSERE2} - converti un'immagine in tessere irregolari corrispondenti all'immagine {PITTURA} - converti un'immagine in un dipinto simulato {TEXTURE} - aggiungi una trama a un'immagine o a un'area selezionata {FUSIONE} - riduci i dettagli fini mantenendo la nitidezza {ABBINA COLORI} - abbina i colori di un'immagine a un'altra immagine {MOTIVO} - aggiungi un motivo di sfondo a un'immagine {TRATTEGGIO INCROCIATO} - converti in uno schizzo usando linee parallele incrociate {DITHERING} - diversi modi per pixelizzare o posterizzare un'immagine {INCISIONE} - converti un'immagine in linee bianco e nero {AGGIUNGI RIFLESSO} - aggiungi un bagliore intorno agli oggetti luminosi nell'immagine {MOSAICO} - converti l'immagine in un mosaico usando tessere fatte da immagini {AGGIUNGI RUMORE} - aggiungi rumore casuale a un'immagine {IMPOSTA COLORI} - riduci il numero di colori (posterizza) {SPOSTA COLORI} - sposta gradualmente i colori RGB in GBR o BRG {COLORI ALIENI} - aggiungi colori strani casuali a un'immagine {KERNEL PERSONALIZZATO} - modifica e applica un kernel di convoluzione personalizzato - {MENU DEFORMAZIONE} {RADDRIZZA} - raddrizza immagini con linee curve, specialmente panoramiche {PROSPETTIVA} - raddrizza un oggetto fotografato da un'angolazione obliqua {DEFORMA AREA} - deforma un'area selezionata dell'immagine trascinando con il mouse {WARP LINEAR1} - deforma l'immagine con trascinamento del mouse - deformazione lineare 1 {WARP LINEAR2} - deforma l'immagine con trascinamento del mouse - deformazione lineare 2 {DEFORMAZIONE CURVA} - deforma l'immagine con trascinamento del mouse - deformazione curva {DEFORMAZIONE AFFINE} - deforma l'immagine con trascinamento del mouse - le linee parallele restano tali {DEFORMAZIONE RADIALE} - aggiungi o rimuovi distorsione a barile o a cuscino {RIMUOVI DEFORMAZIONE RAVVICINATA} - rimuovi la distorsione da foto in primo piano del viso (naso grande) {CREA ONDE} - deforma un'immagine con un motivo ondulato {TORSIONE} - torci un'immagine intorno a un centro scelto {SFERA} - curva un'immagine in una forma sferoidale {DA DENTRO A FUORI} - inverti la distanza centro-bordo di ciascun pixel {TINY PLANET} - avvolgi un'immagine panoramica intorno a un cerchio {SPIRALE ESCHER} - trasforma un'immagine in una spirale infinita verso l'interno {APPIATTISCI FOTO} - appiattisci la foto di una superficie curva - {MENU COMBINA} {HDR} - combina immagini scure/chiare per una gamma di luminosità estesa {HDF} - combina immagini a fuoco vicino/lontano per una profondità di campo estesa {STACK/PITTURA} - combina immagini per rimuovere auto, turisti e altri elementi transitori {STACK/RUMORE} - combina immagini per ridurre il rumore mediante media {STACK/LIVELLI} - combina versioni dell'immagine, seleziona/dipingi area/versione {PANORAMA} - combina una serie di immagini orizzontalmente {MOSTRA FILE CIM} - mostra i file di input per l'immagine combinata corrente/più recente {MASHUP} - organizza immagini e testo formattato in un layout personalizzato {ARRAY DI IMMAGINI} - unisci molte immagini in un formato a matrice compatto - {MENU BATCH} {CONVERSIONE BATCH} - copia, sposta, ridimensiona, rinomina, converti, aggiungi testo ... {COPIA/SPOSTA BATCH} - copia/sposta i file immagine selezionati in una nuova cartella {RADDRIZZAMENTO BATCH} - cerca file immagine ruotati e raddrizzali {ELIMINA/CESTINA BATCH} - elimina o cestina i file immagine selezionati {SOVRAPPOSIZIONE BATCH} - aggiungi un'immagine overlay (copyright ...) alle immagini selezionate {KEYWORDS BATCH} - aggiungi o rimuovi keyword per i file immagine selezionati {RINOMINA KEYWORDS BATCH} - rinomina o elimina le keyword per tutti i file immagine {ELIMINA KEYWORDS BATCH} - elimina le keyword indesiderate da tutti i file immagine {DATA FOTO BATCH} - cambia le date o gli orari delle foto, o sposta il fuso orario {MODIFICA META BATCH} - aggiungi o correggi i metadata per i file immagine selezionati {REPORT META BATCH} - genera un report dei metadata per i file selezionati o per tutti {GEOTAG BATCH} - aggiungi o correggi i geotag per i file selezionati o per tutti {ESPORTA FILE} - esporta i file selezionati in una cartella (es. caricamento sul web) - {MENU STRUMENTI} {INDICIZZA FILE} - operazione una tantum per trovare e indicizzare tutti i file immagine {SPOSTA HOME FOTOCX} - sposta la cartella home di Fotocx (dati utente e impostazioni) {IMPOSTAZIONI} - preferenze e impostazioni utente per il funzionamento di Fotocx {SCORCIATOIE DA TASTIERA} - mostra e modifica le scorciatoie da tastiera per le funzioni dei menu {ISTOGRAMMA RGB} - grafico dell'istogramma di luminosità per l'immagine corrente {INGRANDISCI IMMAGINE} - trasforma il mouse in una lente d'ingrandimento sull'immagine {MISURA IMMAGINE} - misura le distanze in pixel all'interno dell'immagine (clic del mouse) {MOSTRA RGB} - mostra i valori RGB nella posizione del mouse o per i punti selezionati {IMPOSTAZIONI GRIGLIA} - mostra o rimuovi le linee della griglia, imposta numero o spaziatura delle linee {COLORE LINEA} - imposta il colore per i contorni delle aree selezionate {PIXEL SCURI/CHIARI} - strumento per evidenziare il clipping {COLORE MONITOR} - regola luminosità e contrasto del monitor {TROVA DUPLICATI} - trova immagini duplicate in una galleria o in tutte le immagini {TROVA FILE DANNEGGIATI} - trova file immagine illeggibili, elimina/sposta/ripara {MOSTRA RISORSE} - mostra il tempo CPU e l'utilizzo attuale della memoria {TRADUZIONI} - crea o modifica le traduzioni dell'interfaccia grafica - {MENU AIUTO} - guida utente, tutorial, changelog, informazioni su Fotocx, disinstalla - {ALTRI ARGOMENTI} {VIDEO FILES} - file video, thumbnails, riproduzione video {DIAPOSITIVE E NEGATIVI} - come acquisire diapositive e negativi fotografici {LIMITAZIONI DI FOTOCX} - limiti di dimensione e prestazioni {FOTOCX PER WINDOWS 11} - installazione di Fotocx su Windows 11 WSL {PRIVACY} - politica sulla privacy e la protezione dei dati di Fotocx {PROBLEM, QUESTION, SUGGESTION} - contatta l'autore di Fotocx - - TOPIC: UTILIZZO DI FOTOCX - - TOPIC: PRIMO AVVIO - ^Programmi Esterni Fotocx segnala i programmi esterni richiesti e opzionali e la funzione fornita da ciascuno. Se manca qualche programma richiesto, installalo e avvia di nuovo Fotocx. - ^Prima Indicizzazione Fotocx indicizzerà i tuoi file immagine. Questo rende veloce la visualizzazione delle pagine della galleria (thumbnails), abilita la ricerca veloce basata sui metadata indicizzati, e abilita i marcatori cliccabili sulla mappa per visualizzare le immagini per posizione. Devi inserire una o più cartelle immagine 'principali' (es. /home//Immagini). Le sottocartelle sono incluse automaticamente. I file non immagine in queste cartelle vengono ignorati. Usa il pulsante [select] per individuare e aggiungere le tue cartelle immagine principali. Un limite pratico è di circa 30 cartelle principali. Ognuna può avere centinaia di sottocartelle. - ^Thumbnails Questa è la cartella in cui verranno posizionati i file thumbnail. Usa quella predefinita fornita o scegline un'altra. - ^Tempo di Indicizzazione La velocità di indicizzazione può variare da poche centinaia a oltre 10K file/minuto, a seconda del tipo e delle dimensioni dei tuoi file immagine e della velocità del tuo computer. Quando aggiungi nuovi file immagine alla tua raccolta, il prossimo avvio di Fotocx indicizzerà i nuovi file. Se ci sono molti nuovi file, l'avvio richiederà del tempo per indicizzarli. - ^Consolidamento di titolo e descrizione dell'immagine La funzione di indicizzazione immagini di Fotocx sostituisce il titolo e la descrizione mancanti nei metadata con uno dei tanti tag di metadata alternativi, se disponibile: headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. Questo viene fatto in modo che tu possa sempre visualizzare/modificare/cercare usando solo 'title' e 'description'. Questo processo di conversione è relativamente lento (2200 file/minuto sul mio computer potente). Viene eseguito quando i nuovi file immagine vengono indicizzati per la prima volta. Non viene cancellato nulla. - - TOPIC: GUIDA UTENTE Apri la guida utente dal menu Aiuto > Guida Utente. Mentre usi Fotocx, puoi premere F1 per visualizzare l'argomento della guida utente per la funzione di menu corrente o più recente. - Per scorrere il testo, usa i tasti freccia su/giù e pagina su/giù. Il pulsante [Trova] apre un dialogo per una ricerca di testo. Premi di nuovo [Trova] per l'occorrenza successiva. - Il testo in grassetto maiuscolo è un link cliccabile a un argomento, es. {INDICIZZA FILE}. Usa i pulsanti [<] e [>] per andare avanti e indietro tra gli argomenti visti di recente. Il pulsante [Recent] presenta un elenco cliccabile degli argomenti visti di recente. - - TOPIC: VISTE E MENU FINESTRA +image: fotocx-views.jpg - ^Pulsanti Menu Quando si clicca su un menu, appare un sotto-menu popup. I primi tre menu (File, Galleria, Mappe) impostano la modalità di visualizzazione corrispondente. Si possono usare anche i tasti F/G/M. - - TOPIC: VISUALIZZA FILE Un'immagine riempie l'intera finestra di Fotocx. Zoom avanti/indietro con clic del mouse sinistro/destro. Il tasto Z alterna tra adatta-alla-finestra e dimensione immagine 1x (1 pixel immagine = 1 pixel di visualizzazione). Per spostare un'immagine ingrandita, trascina il mouse tenendo premuto il tasto sinistro sull'immagine. Anche la rotellina del mouse può ingrandire o rimpicciolire un'immagine. Usa i pulsanti del menu (Modifica, Ripara, ecc.) per modificare l'immagine. Usa il pulsante Salva File per salvare un file modificato: sostituisci, crea una nuova versione, o crea un nuovo file (nuovo nome). - ^Tasti freccia sinistra/destra della tastiera Visualizza il file immagine precedente o successivo nella galleria corrente. - ^tasti freccia su/giù Come sopra, ma vengono mostrate solo le ultime versioni, o l'originale se non esistono versioni. - - TOPIC: VISUALIZZAZIONE GALLERIA Tutti i file immagine nella galleria corrente sono mostrati come una matrice di thumbnails. - ^Tipi di Galleria • Cartella: tutti i file immagine e le sottocartelle in una singola cartella (directory) • Album: file immagine da varie cartelle, organizzati dall'utente • File Recenti: i file immagine visualizzati o modificati più di recente • File Più Recenti: i file immagine aggiunti o modificati più di recente • Risultati Ricerca: immagini trovate dalla funzione Cerca. Anche questo è un album. - ^Funzioni Galleria • clic sinistro sul thumbnail dell'immagine: apri l'immagine in modalità Vista File • clic destro sul thumbnail dell'immagine: menu popup delle funzioni comuni • clic sul thumbnail della cartella: apri quella cartella in modalità Galleria • barra SUPERIORE della galleria cartella: cartelle superiori - clicca per andarci • pulsante [TOP]: elenco delle cartelle di primo livello - clicca per andarci • barre di scorrimento: scorri su/giù all'interno della galleria • tasti freccia su/giù: scorri la galleria di una riga • tasti pagina su/giù: scorri la galleria di una pagina • tasti home/fine: vai all'inizio (in alto) e alla fine (in basso) della galleria • rotellina del mouse: scorri la galleria su e giù • tasti [+] e [-]: aumenta/diminuisci la dimensione del thumbnail - ^Immagini Popup della Galleria • Clicca sul thumbnail con il pulsante centrale del mouse per l'immagine popup • Clicca sul thumbnail con shift + clic sinistro del mouse per l'immagine popup • Clic sinistro sull'immagine popup: ingrandisci l'immagine • Clic destro sull'immagine popup: chiudi l'immagine popup • Rotellina di scorrimento del mouse: ingrandisci o rimpicciolisci l'immagine popup • Tasto F11: rendi l'immagine popup a schermo intero • Tasto Esc: chiudi l'immagine popup • Si possono usare più popup per confrontare le immagini - - TOPIC: VISTA MAPPA Visualizza mappe contenenti marcatori corrispondenti alle posizioni delle immagini. Clicca su un marcatore per una galleria delle immagini corrispondenti. Questo dipende dal fatto che i tuoi file immagine abbiano geocoordinate incorporate (latitude, longitude). Le fotocamere moderne inseriscono questo automaticamente, e puoi anche aggiungere tu stesso questi dati. Inizialmente viene visualizzata una mappa del mondo. Usa la rotellina del mouse per ingrandire/rimpicciolire in qualsiasi posizione. Trascina per spostare il centro della mappa. L'intero mondo può essere visualizzato a qualsiasi scala fino al livello strada. - - TOPIC: TRASCINA E RILASCIA Se apri due sessioni di Fotocx, puoi trascinare e rilasciare i file da una all'altra. Trascina un thumbnail della galleria da una finestra all'altra. Se è Vista File, il file viene aperto. Se è Vista Galleria, il risultato dipende dal tipo di galleria. Se la galleria è una cartella, il file viene aggiunto alla cartella e la galleria mostrerà il nuovo file nella sua posizione ordinata. Se la galleria è un album, il file viene aggiunto all'album nella posizione in cui viene rilasciato. - - TOPIC: MODIFICA PROCEDURE L'immagine in modalità Vista File (l'immagine corrente) può essere modificata con le funzioni di modifica nei menu Modifica, Ripara, Perfeziona, Effetti, Deforma e Combina. Queste funzioni modificano l'immagine corrente in memoria e nella finestra. Man mano che usi queste funzioni, le modifiche si accumulano. Quando hai finito di modificare, usa il pulsante di menu [Salva] per salvare l'immagine modificata nello stesso file, in una nuova versione (es. nomefile.v01.jpg), o in un nuovo file e/o cartella. I dialoghi di modifica immagine hanno cursori, pulsanti, pulsanti a incremento, o curve modificabili che aggiornano immediatamente l'immagine. - Clicca con il tasto sinistro o destro sul pulsante Annulla/Ripeti per annullare o ripetere la funzione di modifica attualmente attiva. Dopo che un'immagine ha avuto una o più modifiche applicate, il pulsante annulla/ripeti può essere usato per avanzare e retrocedere attraverso tutti i passaggi completati per visualizzare lo stato dell'immagine dopo ogni passaggio. Il pulsante centrale del mouse mostra un elenco popup di tutte le modifiche fatte all'immagine corrente, e puoi selezionare qualsiasi passaggio per tornare indietro. L'immagine può essere modificata di nuovo da qualsiasi passaggio precedente. Questo scarterà le modifiche fatte dopo quel passaggio, poiché sono state derivate da quel passaggio. Questa capacità di annulla/ripeti rimane finché l'immagine modificata rimane l'immagine corrente. Se viene aperta un'altra immagine, la cronologia delle modifiche viene scartata. Se vuoi mantenere la possibilità di tornare allo stato attuale dell'immagine, allora salva l'immagine come nuova versione prima di continuare con un'altra modifica. - - TOPIC: MODIFICA WORKFLOW - ^Flusso di Lavoro Semplice Il più delle volte puoi semplicemente modificare il file JPEG che esce dalla fotocamera. Usa la seguente procedura più complessa solo se vedi bande di colore dopo modifiche che hanno esteso la gamma di luminosità in alcune aree dell'immagine, rendendo i gradini di luminosità abbastanza grandi da vedersi. - ^Flusso di Lavoro Complesso Per modificare con colore profondo (oltre 8 bit per colore RGB), inizia dal file RAW della fotocamera. Un file RAW può essere modificato come qualsiasi altro file immagine. Le funzioni di modifica di Fotocx lavorano con 24 bit per colore, quindi la profondità di colore completa del file RAW viene preservata. Quando apri un file RAW, viene usato il loader RAW scelto - vedi {IMPOSTAZIONI}. Puoi anche usare Conversione Batch per convertire più file RAW in file TIFF, PNG, o JXL con 16 bit per colore. - Dcraw è il loader RAW predefinito. Puoi anche usare un editor RAW più complesso come Rawtherapee - vedi {IMPOSTAZIONI}. Dcraw è semplice e veloce in confronto. Le funzioni di modifica in un editor RAW possono di solito essere eseguite più facilmente con Fotocx. - - TOPIC: PROPRIETÀ MOUSE Alcuni dialoghi di modifica usano il mouse per fare riferimento o alterare l'immagine nella finestra principale. Potrebbe esserci più di un dialogo di questo tipo attivo contemporaneamente. Il mouse viene usato anche per ingrandire e scorrere l'immagine, e potresti aver bisogno di farlo mentre usi un dialogo di modifica. Perciò è importante capire quale dialogo o finestra possiede il mouse, e come cambiare la proprietà: • Se un dialogo ha il focus della tastiera, le azioni del mouse sull'immagine sono input per questo dialogo e non ingrandiscono né scorrono l'immagine. • Se tieni premuto il tasto CTRL mentre clicchi o trascini il mouse sull'immagine, l'immagine si ingrandirà o si sposterà/scorrerà. I dialoghi aperti non sono interessati. • La rotellina del mouse può ingrandire/rimpicciolire in qualsiasi posizione dell'immagine. - - TOPIC: MOUSE ALT-TASTO DESTRO Per touchpad o touchscreen, i clic con il tasto destro del mouse possono essere scomodi. Se il tasto ALT viene tenuto premuto mentre si preme il tasto sinistro del mouse, questo viene interpretato come il tasto destro del mouse. - - TOPIC: PULSANTI DIALOGO Questi funzionano per lo più come segue: • [Reimposta] - annulla la modifica corrente, riporta l'immagine allo stato iniziale • [Applica] - applica le impostazioni del dialogo all'immagine, lascia il dialogo attivo • [OK] - come [Applica], ma il dialogo viene chiuso • [Annulla] - scarta le modifiche all'immagine e chiudi il dialogo • [Procedi] - procedi con l'operazione lunga in base agli input del dialogo • [X] - chiudi il dialogo senza alcuna azione - - TOPIC: TASTO ESC TASTIERA La finestra principale ha il focus: • se una funzione di lunga durata è ancora in esecuzione, terminala • se la finestra principale è massimizzata, ripristina la dimensione precedente • se la vista corrente è galleria o mappa, cambia alla vista file • nessuno dei precedenti: esci da Fotocx La finestra di dialogo ha il focus: chiudi il dialogo (come il pulsante [X]) Altri: annulla l'immagine popup, esci dal visualizzatore panorama 360, metti in pausa o esci dalla Presentazione. - - TOPIC: WIDGET DI DIALOGO NON STANDARD +image: custom-widgets.png - Alcuni widget non standard vengono usati per ridurre la dimensione del dialogo o migliorare la facilità d'uso. Funzionano quasi come i widget GTK standard. Il widget dei dati numerici funziona come un pulsante a incremento GTK: la rotellina del mouse e i tasti freccia su/giù della tastiera possono essere usati per far salire o scendere rapidamente il valore. Se usi un touchpad, tocca il campo per posizionare il cursore, poi usa la tastiera per inserire un valore, oppure usa i tasti freccia su/giù della tastiera per passare rapidamente a un nuovo valore. Se il tasto viene tenuto premuto, la velocità di cambiamento accelera nel tempo. Il tasto shift può essere usato per aumentare la velocità di 10x. Un cursore non lineare espande la scala intorno al valore neutro, in modo che piccoli cambiamenti possano essere controllati più precisamente, specialmente con un touchpad. Alcuni widget GTK standard sono stati ridotti di dimensione rimuovendo il padding in eccesso. Questo è controllato dal file 'widgets.css' nella cartella home di Fotocx. Puoi modificare questo file se lo desideri. Puoi eliminare gli elementi o contrassegnarli come commenti, ma non eliminare il file - verrebbe sostituito automaticamente. - - TOPIC: MODIFICA CURVA +image: retouch.png - Alcune funzioni di modifica immagine usano curve modificabili. Puoi manipolare le curve per cambiare qualche proprietà dell'immagine in base a qualche altra proprietà. Le curve possono essere spostate (tirate) con il mouse. Un punto di ancoraggio (punto nero) viene aggiunto alla curva ovunque venga tirata, e questo punto rimane fisso - la curva continuerà a passare per questo punto mentre altre parti della curva vengono tirate. Un punto di ancoraggio può essere spostato trascinandolo, o eliminato cliccando con il tasto destro. - - TOPIC: MOUSE PAINTING Il mouse può essere usato per modificare un'immagine localmente. Un cerchio intorno alla posizione del mouse racchiude un'area dell'immagine che viene modificata mentre il mouse viene trascinato con il tasto sinistro sull'immagine. La sorgente della modifica può essere una funzione di modifica, un colore scelto, o pixel presi da un'altra parte della stessa immagine o da un'altra immagine. I pixel dell'immagine all'interno del cerchio del mouse vengono modificati per corrispondere alla sorgente. La velocità di cambiamento può essere veloce o graduale, a seconda dei fattori di potenza per il centro e il bordo del mouse. Se il fattore centrale è alto e quello del bordo basso, l'immagine viene modificata più velocemente al centro del mouse e gradualmente meno dal centro al bordo. Trascina ripetutamente il mouse con il tasto sinistro sulla stessa area dell'immagine per accumulare le modifiche, finché i pixel non corrispondono completamente al colore o all'immagine sorgente, o la funzione di modifica sorgente non viene applicata completamente. Trascina con il tasto destro per annullare gradualmente le modifiche, ripristinando l'immagine originale. - Esempio: se la funzione di modifica è Ritocca, e la luminosità viene aumentata, allora l'immagine si schiarirà all'interno dell'area del mouse mentre il mouse viene trascinato con il tasto sinistro. Usa il trascinamento con il tasto destro per ripristinare gradualmente l'immagine originale. - Il pulsante [undo-last] inverte l'ultima operazione di pittura o cancellazione, e questo può essere ripetuto per rimuovere molte modifiche recenti. Ogni nuova operazione di trascinamento del mouse è un'unità di lavoro che può essere annullata separatamente. La memoria per l'annullamento è limitata, quindi vengono mantenuti solo i passaggi recenti di pittura e cancellazione. [undo all] riporterà l'immagine alla sua condizione iniziale. - Usa il pulsante [undo/redo] per verificare le modifiche durante le modifiche. - Se un {SELEZIONA AREA} è attivo, la pittura è confinata all'interno dell'area. - NOTA: Ingrandisci l'immagine al 100% o più quando usi un raggio molto piccolo (es. quando disegni linee sull'immagine). I passi di movimento del mouse sono in pixel dello schermo. Se questo copre molti pixel dell'immagine e viene usato un raggio piccolo, alcuni pixel potrebbero essere saltati dal mouse e non vengono elaborati. - - TOPIC: ELABORAZIONE BATCH Ci sono diverse funzioni batch nel {MENU BATCH} per velocizzare alcune attività comuni. Puoi selezionare molti file immagine ed eseguire la funzione batch per tutti loro. Le funzioni batch possono essere usate per cambiare nome o tipo di file, raddrizzare, ridimensionare, copiare o spostare, eliminare, correggere tag, keyword, posizione/geocoordinate, date delle foto. - - TOPIC: SELEZIONA FILE IMMAGINE +image: select-image-files.jpg - Questa procedura viene usata per tutte le funzioni che operano su più file immagine. La procedura è spiegata qui, e questo argomento è collegato da ogni funzione che usa la procedura. • clic sinistro sul thumbnail: aggiungi all'elenco di selezione • clic destro: rimuovi • aggiungi più elementi: clicca sul primo thumbnail, shift-clic sull'ultimo • pulsante [Aggiungi tutto]: aggiungi l'intera galleria • pulsante [Aggiungi corrente]: aggiungi il file corrente • un file può essere aggiunto più volte all'elenco • naviga verso altre gallerie per selezionare altri file secondo necessità • pulsante [Rimuovi]: rimuovi la posizione selezionata dall'elenco • pulsante [Cancella]: cancella l'intero elenco • tasti freccia su/giù: scorri l'elenco, visualizza i thumbnails • tasti home/fine: vai all'inizio/fine dell'elenco - Il pulsante [Disabilita] disabiliterà il clic sui thumbnails per selezionare i file. Il pulsante viene quindi rinominato in [Abilita] - premilo per ripristinare il clic sui thumbnails. Lo scopo di questo è abilitare i normali menu popup dei thumbnails e il clic sinistro per visualizzare un file a piena dimensione, cosa non possibile se i clic sui thumbnails vengono usati per la selezione dei file. Potresti averne bisogno per decidere le selezioni. Puoi anche rimanere in modalità vista file e scorrere le immagini usando i tasti freccia, mentre usi il pulsante [Aggiungi corrente] per aggiungere file all'elenco di selezione. - - TOPIC: SCORCIATOIE Ci sono tre metodi di scorciatoia per le funzioni usate di frequente: • Clicca con il tasto destro sulla finestra principale o sul thumbnail della galleria. Un menu popup mostra alcune funzioni usate comunemente. • Puoi cambiare le scorciatoie da tastiera e aggiungerne di nuove. Vedi {SCORCIATOIE DA TASTIERA}. • Raccogli le funzioni usate di frequente in un menu personalizzato. Vedi {MENU PERSONALIZZATO}. - Le scorciatoie da tastiera sono disponibili per le funzioni più comuni. Usa il menu Strumenti > Scorciatoie da Tastiera per visualizzarle o cambiarle. - Le seguenti scorciatoie da tastiera sono fisse e non possono essere cambiate: • tasto [+] [=]: ingrandisci l'immagine o i thumbnails • tasto [-]: rimpicciolisci l'immagine o i thumbnails • tasto Z: alterna lo zoom: 1x <--> adatta alla finestra • tasto F1: mostra la guida utente per la funzione corrente • tasto F10: alterna la finestra principale a schermo intero e viceversa • tasto F11: come F10, senza menu, barra del titolo, pannello superiore • tasto Esc: termina la funzione in esecuzione, esci dal dialogo attivo • tasto Canc: dialogo per eliminare o cestinare il file corrente • Freccia sinistra/destra: mostra l'immagine precedente/successiva nella galleria • Freccia su/giù: come sopra, ma mostra solo le ultime versioni • Pagina su/giù: vista galleria: scorri di una pagina su/giù • Home/Fine: vista galleria: vai alla prima/ultima pagina della galleria - Le seguenti scorciatoie da tastiera sono predefinite e possono essere cambiate dall'utente: • F: Vista File - cambia alla modalità vista file • G: Vista Galleria - cambia alla modalità vista galleria • M: Vista Mappa - cambia alla modalità vista mappa • 2: Alterna 2 File - alterna la visualizzazione degli ultimi due file • 3: Alterna 3 File - alterna la visualizzazione degli ultimi tre file • A: Album Corrente - mostra l'album visualizzato più di recente • T: Ritocca - avvia la funzione di modifica Ritocca • C: Ritaglia - avvia la funzione di modifica Ritaglia • K: Scorciatoie da Tastiera - avvia il dialogo delle scorciatoie da tastiera • P: Stampa Immagine - apri il dialogo di stampa immagine • R: Ruota - avvia la funzione di modifica Ruota • U: Annulla - annulla la modifica corrente o l'ultima di una serie • Shift+U: Ripeti - ripeti la modifica corrente o la successiva di una serie • Ctrl+C: Copia negli Appunti - copia il file corrente negli appunti • Shift+C: Alterna Didascalie - alterna mostra/nascondi didascalie • Ctrl+G: Mostra la galleria della cartella per il file corrente • Shift+G: Alterna Griglia - attiva/disattiva le linee della griglia • Ctrl+S: Salva - avvia il dialogo di salvataggio file - - TOPIC: FUNZIONI MOUSE - ^Vista File • clic sinistro - Zoom avanti: ingrandisce l'immagine, centrata sul mouse • clic destro - Se l'immagine è ingrandita: ripristina alla dimensione della finestra Altrimenti, menu popup con le funzioni comuni • rotellina del mouse - Ingrandisci o rimpicciolisci l'immagine • trascinamento sinistro sull'immagine - Sposta l'immagine ingrandita • Ctrl + mouse - Il mouse agisce sull'immagine, non sul dialogo attivo - ^Vista Galleria • clic sinistro sul thumbnail - Cambia alla Vista File • clic destro sul thumbnail - Mostra il menu popup con le funzioni comuni • clic centrale sul thumbnail - Immagine grande popup, zoom con la rotellina del mouse • rotellina del mouse - Scorri la pagina della galleria su o giù - ^Vista Mappa • trascinamento sinistro - Trascina la mappa, seguendo il mouse • rotellina del mouse - Ingrandisci o rimpicciolisci la mappa • clic sinistro su un marcatore - Mostra la galleria delle immagini in quella posizione • se il dialogo di modifica metadata è attivo, un clic sinistro imposta le geocoordinate - - TOPIC: PARAMETRI COMANDO Questi parametri possono essere usati se Fotocx viene avviato da un terminale. -help mostra la guida utente -home /cartella posizione home alternativa di Fotocx (vedi sotto) -lang xx imposta la lingua dal codice a 2 caratteri -recent mostra la galleria dei file immagine recenti -new mostra la galleria dei file immagine più recenti -album nomealbum album (galleria) da aprire -prev mostra l'ultimo file visualizzato nella sessione precedente -blank mostra una finestra vuota -dev mostra il menu sviluppatore normalmente nascosto -menu nomemenu Fotocx si avvierà con questo menu attivo -cwp nnn nome cicla lo sfondo (vedi sotto) -x0 -x1 -x2 imposta il livello di indice a 0, 1 o 2 (vedi sotto) - ^parametro -x0 -x1 -x2^ (imposta il livello di indice all'avvio) Questi parametri possono essere usati per sovrascrivere il valore di {IMPOSTAZIONI} -x0 avvio molto veloce, nessun indice immagine -x1 avvio veloce, indicizza solo i file vecchi -x2 file vecchi + cerca file nuovi/modificati - ^parametro -home^ (cartella home alternativa di Fotocx) Cartella home predefinita di Fotocx: /home//.fotocx. Qui vengono conservate le impostazioni utente e l'indice delle immagini. Il comando "$ fotocx -home " usa la cartella designata. Questo permette di gestire separatamente più raccolte di immagini. Vedi anche {SPOSTA HOME FOTOCX}. - ^parametro -cwp^ (ciclo sfondo desktop) La riga di comando completa è: $ fotocx -cwp secondi contenitore Usa questo comando per ciclare l'immagine del desktop da un insieme selezionato. 'secondi' è l'intervallo tra le immagini. 'contenitore' è un nome di album Fotocx oppure una cartella contenente file immagine. Aggiungi questo comando al tuo elenco di avvio al login per ottenere un nuovo sfondo agli intervalli specificati. Usa un intervallo di un giorno o più per ottenere una nuova immagine di sfondo a ogni login. Fotocx viene eseguito in background senza interfaccia grafica. Se 'secondi' è zero, verrà effettuato un solo aggiornamento dello sfondo e poi Fotocx terminerà. Ogni distribuzione Linux ha un comando diverso. In teoria sono coperte le seguenti: Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: MENU FILE - - TOPIC: NUOVA SESSIONE Avvia una nuova sessione di Fotocx in una nuova finestra. Se un file immagine viene modificato in entrambe le finestre, nessuna delle due istanze vedrà le modifiche fatte dall'altra, e il risultato finale sarà l'ultimo file salvato. - - TOPIC: APRI FILE IMMAGINE Seleziona un file immagine da visualizzare o modificare, usando un dialogo convenzionale di apertura file con cartelle ed elenchi di file. Questo è utile nel caso in cui i file non siano indicizzati e la visualizzazione della galleria sia molto lenta, es. leggendo da una scheda SD di una fotocamera contenente migliaia di file immagine. - - TOPIC: CICLO 2 FILE Ripetendo questo menu si alternerà tra gli ultimi due file aperti di recente. Questa funzione mantiene la dimensione e la posizione dello zoom dell'immagine corrente, il che è ideale per confrontare rapidamente due versioni modificate dello stesso file immagine. - - TOPIC: CICLO 3 FILE Funziona allo stesso modo di Alterna 2 File, ma alterna gli ultimi 3 file aperti. - - TOPIC: VISUALIZZA PANO 360° Il file corrente viene aperto con un visualizzatore speciale per file panoramici a 360°. Si presume che la larghezza dell'immagine sia di 360°. Usa questa funzione per visualizzare le immagini 'photosphere' di Google. Sposta l'immagine trascinando il mouse o con i tasti freccia sinistra/destra. Ingrandisci con clic sinistro/destro del mouse. Usa Esc per uscire dal visualizzatore speciale. - - TOPIC: RINOMINA Rinomina il file corrente (Vista File), o il file di un thumbnail cliccato (Vista Galleria). Inserisci un nuovo nome e premi [applica]. Questa funzione può anche automatizzare il processo di rinomina di una serie di file immagine usando un nome radice e un numero di sequenza. Apri il primo file immagine della serie, inserisci un nuovo nome, e premi il pulsante [applica]. Usa il pulsante [next] per passare al file successivo se lo desideri. Puoi usare di nuovo lo stesso nome premendo il pulsante [nome precedente] e poi aggiungere un suffisso o un numero di sequenza. Premi il pulsante [add 1] per incrementare il numero di sequenza. - - TOPIC: IMMAGINE VUOTA Crea un'immagine vuota con dimensioni in pixel e colore specificati. Questa può essere usata come sfondo per ritagli presi da altre immagini (tramite {SELEZIONA AREA}) e testo di annotazione (tramite {MARKUP} disegna testo). - - TOPIC: COPIA/SPOSTA Il file corrente (Vista File) o il file di un thumbnail cliccato (Vista Galleria) viene copiato nella posizione indicata. Seleziona l'opzione copia per copiare il file e lasciare il file sorgente al suo posto, creando un duplicato. Seleziona l'opzione sposta per spostare il file dalla posizione originale alla nuova posizione. Un gruppo di file può essere elaborato rapidamente cliccando ogni thumbnail seguito da [applica]. Il pulsante [Prec] può essere usato per copiare il nome file usato in precedenza. Aggiungi un numero di versione o qualcos'altro per evitare un file duplicato. - - TOPIC: COPIA SUL DESKTOP Il file corrente (Vista File) o il file di un thumbnail cliccato (Vista Galleria) viene copiato nella cartella desktop (/home//Desktop). - - TOPIC: COPIA NEGLI APPUNTI Il file corrente (Vista File) o il file di un thumbnail cliccato (Vista Galleria) viene copiato negli appunti, da cui altre applicazioni possono incollare. - - TOPIC: ELIMINA/CESTINA Il file corrente (Vista File) o il file di un thumbnail cliccato (Vista Galleria) viene eliminato o spostato nel cestino, a seconda dell'opzione selezionata. Fotocx presume lo standard per il cestino (~/.local/share/Trash). - - TOPIC: IMPOSTA SFONDO DESKTOP Lo sfondo del desktop viene impostato dal file immagine corrente. - - TOPIC: STAMPA IMMAGINE Il menu stampa immagine apre un dialogo standard di Impostazione Pagina dove puoi selezionare una stampante, un formato carta e l'orientamento. Dopo aver usato il pulsante [applica], si apre un altro dialogo per inserire i margini della carta e la scala dell'immagine. - Se l'immagine ha aree selezionate, ti viene chiesto se stampare solo le aree. Queste verranno stampate usando il rettangolo minimo necessario per racchiudere le aree, e le aree al di fuori delle selezioni non vengono stampate. - - TOPIC: STAMPA CALIBRATA Questa funzione funziona come Stampa Immagine descritta sopra, ma prima di stampare ti viene chiesto di fornire un file di calibrazione che viene usato per regolare i colori dell'immagine prima della stampa. Lo scopo è compensare le variazioni di colore causate dalla stampante e dal tipo di carta. - - TOPIC: CALIBRA STAMPANTE +image: printer-calibrate-chart.png +image: calibrate-printer.png - Questa utility può essere in grado di migliorare l'accuratezza del colore delle immagini stampate. - ^Come Funziona Un grafico di colori viene stampato sulla stampante di destinazione. Alcuni dei colori stampati saranno leggermente sbagliati a causa di imperfezioni della stampante. Questa pagina stampata viene scansionata in un file, e i colori in questo file vengono confrontati con i colori originali che sono stati stampati. Eventuali differenze sono errori ora noti (supponendo che il tuo scanner sia più accurato della tua stampante - generalmente vero). Quando un file immagine viene stampato, questi errori vengono sottratti dai colori dell'immagine prima della stampa. La stampante riaggiunge gli errori, lasciando un risultato che è teoricamente corretto. Il mio test personale ha mostrato un modesto miglioramento, dettagliato di seguito. - Esegui i seguenti passaggi in sequenza, come elencati nella finestra di dialogo. Tutti i file si trovano nella cartella /printer_color. • Genera e stampa il file del grafico di colori (printchart.png). Usa un formato carta grande, orientamento verticale, nessun margine. • Scansiona il grafico stampato in un file PNG. Usa 300 dpi o più. • Modifica l'immagine PNG per ritagliare i margini lasciati dallo scanner. Salva il file immagine modificato. • Elabora il file immagine modificato per creare un file di mappa colore. - Ora puoi stampare usando il menu {STAMPA CALIBRATA}, che richiederà il nome del file di mappa colore per la stampante e la carta che stai usando. - Gli scanner possono deformare un'immagine scansionata in una forma leggermente non rettangolare. Se questo accade, lo noterai quando provi a ritagliare i margini: le spesse linee verdi del margine non si allineeranno perfettamente con il rettangolo di ritaglio. Se questo accade, usa {PROSPETTIVA} per squadrare prima l'immagine, poi ritaglia i margini. - Quando modifichi l'immagine del grafico scansionato, assicurati che la riga più scura sia in alto. Ritaglia i margini che circondano le tessere di colore. Usa la spessa linea verde del margine che circonda le tessere di colore come guida: taglia esattamente questa linea, lasciando solo le tessere. Lavora con un ingrandimento 2x mentre regoli il rettangolo di ritaglio. Un ritaglio accurato è importante. Se il ritaglio non è accurato, le posizioni calcolate delle tessere saranno sfalsate, e i colori misurati potrebbero essere sbagliati. Un piccolo errore è tollerato. Puoi usare i tasti freccia della tastiera per movimenti di 1 pixel nel rettangolo di ritaglio. L'ultimo angolo trascinato con il mouse è l'angolo che i tasti freccia sposteranno. - Il file di mappa colore in uscita può essere usato solo per le impostazioni di carta e stampante usate per la calibrazione. Qualsiasi altra combinazione necessita della propria calibrazione e file di mappa colore. - ^Risultati^ (la mia stampante Canon) +image: printer-calibrate.jpg +image: printer-cal-study.png - Il grafico sopra è una foto di tre immagini: in alto a sinistra: stampa di una foto del grafico colore in alto a destra: stampa calibrata della stessa foto in basso: il grafico colore stesso Poiché tutte e 3 le immagini sono state fotografate insieme, gli errori della fotocamera sono uguali, rendendo validi i confronti. - - TOPIC: MENU GALLERIA - - TOPIC: PANORAMICA GALLERIA +image: image-management.jpg - Una galleria di immagini in miniatura può rappresentare una cartella di file, l'output di una ricerca immagini, una delle gallerie integrate (file recenti, file più recenti), o un album (un elenco ordinato di file immagine con un nome dato). Le cartelle dovrebbero essere limitate a poche migliaia di file per ragioni pratiche e di prestazioni, ma non viene imposto alcun limite. - ^Scorrimento della Galleria La galleria può essere scorsa su e giù usando i tasti freccia su e giù della tastiera, i tasti pagina su e pagina giù, o le barre di scorrimento. Possono essere usati anche i tasti [home] e [end]. Clicca con il tasto sinistro e tieni premuto sulla barra di scorrimento, e la galleria scorrerà rapidamente fino alla posizione del clic. Clicca con il tasto destro e tieni premuto sulla barra di scorrimento per far scorrere la galleria lentamente fino alla posizione del clic. Continua a tenere premuto il pulsante del mouse e spostati lateralmente per aumentare la velocità di scorrimento. - - TOPIC: VISTA MINIATURE I file immagine nella galleria corrente sono mostrati come una matrice di thumbnails. Usa il pulsante del menu Zoom o i tasti [+] [-] per cambiare la dimensione del thumbnail. - - TOPIC: VISTA METADATA I file immagine nella galleria corrente sono mostrati insieme ai metadata di base usati da Fotocx. Se sono definiti tag di metadata personalizzati indicizzati, questi vengono mostrati dopo i tag standard. Vedi {INDICIZZA FILE}. - - TOPIC: FILE RECENTI I 1000 file immagine visti più di recente sono mostrati in una galleria, da cui puoi selezionare i file da visualizzare o modificare. - - TOPIC: FILE PIÙ RECENTI I 1000 file immagine aggiunti o modificati più di recente sono mostrati in una galleria, da cui puoi selezionare i file da visualizzare o modificare. Ti viene data la scelta di usare la data foto EXIF o la data di modifica del file per determinare le immagini più recenti. - - TOPIC: ORDINAMENTO GALLERIA Scegli il criterio di ordinamento e l'ordine crescente o decrescente. La casella Reset ripristina tutte le gallerie all'ordine crescente per nome file. - Se viene ordinata una galleria Album, l'output non sostituisce l'album ma crea un nuovo album chiamato -sorted. - ^Nome/Numero File Questo è un ordinamento modificato per nome file. Se più file hanno nomi che differiscono solo per numeri incorporati nella stessa posizione, questo gruppo di file verrà ordinato nell'ordine dei numeri incorporati. L'esempio qui illustra la differenza: ordine alfabetico: xxx1xx xxx11xx xxx123xx xxx3xx ordine numerico: xxx1xx xxx3xx xxx11xx xxx123xx - ^Metadata dalla Funzione di Ricerca Se la galleria è stata generata dall'opzione 'report metadata' di {CERCA IMMAGINI}, e se hai aggiunto tag di metadata opzionali al report standard, puoi ordinare la galleria in base a questi tag di metadata. Puoi ordinare la galleria per marca fotocamera, informazioni obiettivo, livello ISO, tempo di esposizione ... qualsiasi metadata disponibile. - - TOPIC: FILTRO GALLERIA Seleziona un sottoinsieme della galleria corrente per creare un album chiamato "gallery_filter" contenente i file immagine selezionati. ^Opzioni di selezione: • tutti i file: seleziona tutti i file immagine • originali: file originali (nessun numero di versione) • versioni: file con versione (sono stati modificati) • ultime versioni: ultime versioni (o originali se non ci sono versioni) • intervallo valutazione: file con valutazione all'interno dell'intervallo dato • nomi keyword: file con una delle keyword date (separate da virgola) • testo nome file: file con una delle stringhe di testo date (separate da virgola) - - TOPIC: HOME GALLERIA TOPIC: FINE GALLERIA Salta al primo o all'ultimo thumbnail nella galleria corrente. - - TOPIC: CARTELLA FILE CORRENTE Imposta la galleria corrente dal file immagine corrente. Questo è comodo se vuoi tornare alla galleria del file corrente dopo aver fatto qualcos'altro. - - TOPIC: CARTELLE RECENTI Imposta la galleria corrente da una galleria usata di recente. Questo ti permette di andare avanti e indietro più facilmente tra le gallerie recenti. - - TOPIC: ALBERO CARTELLE +image: folder-tree.png - Tutte le cartelle immagine PRINCIPALI sono mostrate inizialmente. Clicca su [+] per espandere le sottocartelle, o su [-] per richiuderle. Puoi cliccare su qualsiasi cartella per ottenere una galleria delle immagini in quella cartella. Tieni la finestra aperta per navigare ovunque nella tua raccolta di immagini. Questa funzione è disponibile anche usando il pulsante [TOP] nel pannello superiore della galleria. - - TOPIC: SELEZIONA FILE Preseleziona i file immagine da usare come input per creare album o per funzioni batch. Queste funzioni useranno di default i file preselezionati, ma puoi anche modificarli o ricominciare. Vedi la procedura {SELEZIONA FILE IMMAGINE}. - - TOPIC: SEGNALIBRI Visualizza i segnalibri esistenti. I segnalibri sono posizioni scelte (nomi di cartelle/file) con nomi assegnati dall'utente. Clicca su un segnalibro per mostrare una galleria di thumbnails a partire da quella posizione. Seleziona [Modifica segnalibri] per aggiungere, eliminare o rinominare un segnalibro. - - TOPIC: MODIFICA SEGNALIBRI Dopo aver avviato Modifica Segnalibri, clicca su un thumbnail della galleria per aggiungere questa posizione all'elenco dei segnalibri. Il nome del segnalibro assegnato sarà inizialmente il nome del file per il thumbnail. Puoi modificare il nome. Se selezioni un segnalibro esistente con un clic del mouse, il suo nome viene mostrato nel campo di input. Puoi cambiare il nome o premere [elimina] per rimuovere il segnalibro. I nuovi segnalibri vengono inseriti dopo l'ultima posizione di segnalibro selezionata. Per cambiare l'ordine, modifica il file "bookmarks" nella cartella home di Fotocx. - - TOPIC: MAPS MENU - - TOPIC: MAPPA DEL MONDO +image: map-click.jpg - Questa è una mappa del mondo via internet che può essere scalata (ingrandita e rimpicciolita) dal livello strada al livello continentale. Usa la rotellina del mouse per ingrandire/rimpicciolire la mappa. Trascina la mappa per cambiare il centro. La mappa ha marcatori (puntini rossi) corrispondenti alle immagini che hanno geocoordinate nei loro metadata. Clicca su un marcatore per ottenere una Vista Galleria delle immagini in quella posizione. Vengono selezionate le immagini situate all'interno dell'area del marcatore sulla mappa. L'area effettiva del marcatore si scala con la scala della mappa. Ingrandisci per espandere la scala e possibilmente separare un marcatore in più marcatori vicini. - - TOPIC: MOSTRA SULLA MAPPA Mostra la posizione del file immagine corrente sulla mappa del mondo. Se più marcatori si sovrappongono, ingrandisci finché un singolo marcatore non è al centro. - - TOPIC: MENU ALBUM - - TOPIC: ALBUM Un album è un insieme arbitrario di immagini assemblato manualmente da immagini esistenti. Un album è un elenco dei suoi file immagine membri. I file immagine stessi non vengono copiati o modificati. Un dato file immagine può essere membro di più album, oppure può essere presente più di una volta all'interno di un album. Puoi aggiungere e rimuovere immagini in un album o riordinarle. Una volta creato un album, puoi selezionarlo per nome e viene mostrato come galleria. - - TOPIC: CREA ALBUM Inserisci un nome per un nuovo album. Puoi creare un album vuoto, un album con file immagine preselezionati da {SELEZIONA FILE}, un album con le immagini della galleria corrente, oppure puoi selezionare le immagini iniziali per l'album. - - TOPIC: RINOMINA ALBUM Scegli un album esistente e inserisci un nuovo nome. - - TOPIC: ELIMINA ALBUM Scegli un album esistente ed eliminalo permanentemente. - - TOPIC: SCEGLI ALBUM Viene presentato un elenco degli album disponibili. Scegli dall'elenco. - - TOPIC: ALBUM CORRENTE Imposta la galleria dall'album corrente (l'ultimo usato). - - TOPIC: DA GALLERIA AD ALBUM Salva la galleria corrente come album. Seleziona un nome di album esistente [Sfoglia], oppure inserisci un nuovo nome. - - TOPIC: MODIFICA ALBUM Clicca con il tasto destro su un thumbnail dell'album e seleziona dal menu popup: • Aggiungi qui i file selezionati - i file precedentemente selezionati vengono aggiunti qui (clicca sul lato sinistro/destro del thumbnail per aggiungere prima/dopo il thumbnail). • Aggiungi qui il file corrente (Vista File) - funziona allo stesso modo. • Rimuovi dall'album - il file cliccato viene rimosso dall'album. - ^Trascina e Rilascia Puoi riordinare le immagini in un album trascinando i thumbnails con il mouse. Trascina il thumbnail finché il cursore del mouse non cambia in una piccola immagine thumbnail. Continua a trascinare questa immagine fino alla posizione in cui dovrebbe essere inserita, e rilascia il pulsante del mouse. Posiziona il mouse approssimativamente tra i thumbnails dove deve essere inserita l'immagine trascinata. Se il trascinamento si avvicina al bordo superiore o inferiore della finestra, la galleria scorrerà per mostrare altre immagini. Puoi usare due sessioni di Fotocx per rendere più veloce la selezione o lo spostamento di molte immagini. Trascina e rilascia le immagini da qualsiasi galleria sorgente in una posizione dell'album di destinazione. - Se rinomini o sposti un file usando Fotocx, tutti i link dell'album vengono aggiornati e il file rimane negli album che lo contengono. Se lo fai al di fuori di Fotocx, i link dell'album vengono persi e il file scompare dall'album. - Se i file immagine vengono rinominati o spostati usando Conversione Batch o Copia/Sposta Batch, assicurati di selezionare l'opzione per sostituire i file dell'album, se lo desideri. Altrimenti dovrai sostituirli uno alla volta. - Non rinominare le cartelle se contengono immagini presenti negli album. I link dell'album andranno persi. Invece, usa Conversione Batch o Copia/Sposta Batch per spostare i file immagine nella nuova cartella, poi elimina la vecchia cartella se vuota. Per eliminare i file immagine, usa Elimina/Cestina Batch. Questo eliminerà anche i file cancellati dagli album. - - TOPIC: AGGIORNA ALBUM +image: album-replace-file.png - Sostituisci i file specificati dell'album con le sostituzioni specificate, oppure aggiungi nuovi file specificati dopo file esistenti specificati. Seleziona uno o più album da elaborare. In vista galleria, clicca su due thumbnails per specificare 'vecchio file' e 'nuovo file' nel dialogo sopra. Seleziona l'opzione: 'nuovo file' sostituisce 'vecchio file' ovunque venga trovato, oppure 'nuovo file' viene aggiunto agli album dopo 'vecchio file'. Premi [proceed] per elaborare gli album. Dopo l'elaborazione, il dialogo si ripete con gli stessi album selezionati e la stessa opzione 'sostituisci o aggiungi'. Puoi selezionare altri due file e premere [proceed]. - - TOPIC: AGGIORNAMENTO MASSIVO ALBUM +image: album-mass-update.png - Questa è un'utility per aggiornamenti massivi che potrebbe servirti dopo aver creato nuove versioni per molti file immagine e aver bisogno di aggiornare uno o più album alle nuove versioni. Questo non copre ogni esigenza, il che è probabilmente impossibile, ma si spera riduca la necessità di cambiare un file alla volta. - Seleziona uno o più album e poi seleziona una delle opzioni di elaborazione: • Sostituisci tutto solo con la versione più recente: gli album vengono aggiornati per avere solo le versioni file più recenti. • Sostituisci tutte le versioni con la versione più recente: tutte le versioni file vengono sostituite con solo la versione più recente. Il file originale, se presente, NON viene sostituito. • Aggiungi le versioni più recenti alle versioni esistenti: la versione più recente viene aggiunta alle versioni esistenti, se mancante. • Sostituisci tutto con l'originale e tutte le versioni: tutti i file vengono sostituiti con il file originale e tutte le versioni. • Sostituisci tutto con la versione originale e la versione più recente: tutti i file vengono sostituiti con il file originale e la versione più recente. • Sostituisci tutto con le versioni selezionate (*): tutti i file vengono sostituiti solo con le versioni selezionate. Questo include il file originale (senza versione). • Sostituisci tutte le versioni con le versioni selezionate (*): tutte le versioni file vengono sostituite solo con le versioni selezionate. Il file originale, se presente, NON viene sostituito. • Aggiungi le versioni selezionate alle versioni esistenti (*): la versione selezionata viene aggiunta alle versioni esistenti, se mancante. • Sostituisci tutto con l'originale e le versioni selezionate (*): tutti i file vengono sostituiti con i file originali e le versioni selezionate. - (*) Le quattro opzioni che usano i file selezionati: l'elenco dei file selezionati proviene dalla funzione {SELEZIONA FILE}. I file dell'album che non corrispondono a nessun file selezionato vengono lasciati nell'album. Vengono modificati solo i file che corrispondono a un file selezionato, secondo le regole precedenti. La corrispondenza si basa sul nome del file senza versione o estensione: 'asdfg.png' e 'asdfg.v01.jpg' sono una corrispondenza. - Esempio: Sostituisci tutte le versioni con le versioni selezionate: Se l'album ha filename.jpg e filename.v02.png, e l'elenco dei file selezionati contiene filename.v04.jpg, il risultato nell'album aggiornato sarà: filename.jpg e filename.v04.jpg - - TOPIC: PRESENTAZIONE +image: slide-show.jpg - ^Scalatura Frazionaria del Monitor Per alcuni sistemi, la scalatura frazionaria causa problemi di prestazioni per le animazioni della presentazione di Fotocx. Disabilitala e usa altri mezzi per aumentare la dimensione del carattere per le applicazioni, se necessario. Per Fotocx, la dimensione del carattere è nel menu {IMPOSTAZIONI}. - Nel dialogo della presentazione (in alto a sinistra), premi [Seleziona album] e scegli un album dall'elenco fornito. Cambia le altre impostazioni nel dialogo come desiderato, poi premi il pulsante [Avvia] per avviare la presentazione con la prima immagine nell'album, oppure [Riprendi] per riprendere una presentazione in pausa, oppure un'altra immagine selezionata cliccando sul suo thumbnail. Usa il tasto Esc per uscire dalla presentazione e tornare al dialogo. - Controlli del Dialogo Principale • Tempo Didascalia: secondi per mostrare titolo e descrizione. • Tempo Immagine: secondi per mostrare solo l'immagine. • % Limite Ritaglio: ritaglia le immagini fino a questa quantità per eliminare i margini. • Schermo Intero: se selezionato, le immagini vengono mostrate a schermo intero senza menu, ecc. • Riproduzione Automatica: se selezionato, la presentazione ricomincerà dopo la fine. • Immagine Casuale: se selezionato, usa un ordine casuale delle immagini. Altrimenti l'ordine dell'album. - Si possono usare i tasti della tastiera per controllare la presentazione. Premi [tastiera] per visualizzarli. - I seguenti tasti della tastiera sono assegnati ad azioni e non possono essere cambiati: • Esc: interrompi la presentazione e torna al dialogo principale. • Tasti freccia sinistra/destra: puoi andare avanti e indietro in qualsiasi momento e la presentazione continuerà da lì. - Le transizioni animate tra le immagini, e i tempi di visualizzazione e il comportamento dello zoom delle singole immagini, possono essere personalizzati usando i dialoghi spiegati di seguito. - Premi [transizioni] per avviare un dialogo per selezionare e personalizzare le transizioni tra le immagini. Queste includono molti metodi animati di sostituzione dell'immagine (es. la nuova immagine si espande dal centro per sostituire la vecchia immagine). Seleziona le transizioni da usare e se vengono usate casualmente o in sequenza. Il parametro tempo imposta la durata della transizione. I parametri di preferenza specificano una preferenza relativa che influenzerà la frequenza con cui la transizione viene usata quando è selezionata la sequenza casuale. - I pulsanti [carica] e [salva] ti permettono di salvare le impostazioni delle transizioni in un file e caricarle successivamente. Questi file sono indipendenti dai file della presentazione. Una presentazione userà per default le impostazioni delle transizioni usate l'ultima volta per quella presentazione (nome album), ma puoi sempre sostituirle usando il pulsante [carica] per caricare altre impostazioni, oppure cambiandole nel dialogo. - Premi [file immagine] per avviare un dialogo per le Preferenze Immagine (in alto a destra). Queste sono opzionali. Un'immagine viene selezionata per la personalizzazione cliccando sul suo thumbnail nella visualizzazione album/galleria. Il dialogo viene compilato con le impostazioni predefinite o le impostazioni precedenti per questa immagine in questa presentazione. Inserisci le modifiche e premi [done], oppure clicca sull'immagine successiva da personalizzare. - Preferenza: se viene scelta la sequenza casuale delle immagini, questo numero fornisce una preferenza relativa per l'immagine. Il valore neutro è 10. Inserisci un nuovo valore per aumentare o diminuire la probabilità che questo file venga scelto nella sequenza casuale delle immagini, es. un valore di 20 renderebbe la probabilità 2 volte maggiore. Un valore pari a zero impedirebbe la visualizzazione dell'immagine. L'immagine viene anche bloccata per un conteggio pari a 1/3 delle immagini nell'album, o 10, a seconda di quale sia minore. - Il dialogo mostra gli eventi immagine personalizzabili in ordine temporale: • attendi un tempo specificato (può essere zero). • mostra i seguenti tag di testo in parallelo: nome immagine (nome base del file) per un tempo specificato, titolo dell'immagine, se presente, per un tempo specificato, descrizione dell'immagine, se presente, per un tempo specificato. • attendi un tempo specificato prima di avviare uno zoom dell'immagine (può essere zero). • ingrandisci l'immagine da normale a ingrandita o viceversa, nel tempo specificato. Se non viene selezionata nessuna delle due opzioni, non c'è zoom. • zoom-in: inizia a dimensione normale, ingrandisci l'immagine spostando il centro dello zoom nella posizione specificata. • zoom-out: inizia a dimensione ingrandita nel centro di zoom specificato, riduci l'immagine di nuovo alla dimensione normale. • [zoom center] - premi questo pulsante, poi clicca sul thumbnail dell'immagine per specificare il centro di zoom per l'immagine. • attendi un tempo specificato dopo lo zoom (può essere zero) (il valore predefinito è l'impostazione 'tempo immagine' del dialogo principale). • transizione all'immagine successiva, usando la transizione specificata o 'successiva' per indicare nessuna preferenza (selezionata casualmente). - - TOPIC: MENU PERSONALIZZATO +image: custom-menu.png - Questo ti permette di raccogliere le funzioni usate di frequente da più menu in un unico menu personalizzato. Puoi anche aggiungere voci per aprire file immagine o album specifici. Il menu include anche funzioni di script e funzioni plugin (vedi sotto). - L'ultima voce nel menu, Modifica Menu, apre un editor di testo per modificare l'elenco del menu stesso. I nomi dei menu devono corrispondere esattamente ai nomi nei menu di Fotocx, ma le maiuscole/minuscole non sono significative. - Le voci del menu possono avere i seguenti formati: • # testo commento: un commento che non fa nulla • nomemenu # suggerimento popup: nome menu Fotocx e suggerimento popup opzionale • file : apri il file con nome • album : apri l'album con nome come galleria - Le seguenti voci sono presenti per default e non dovresti cambiarle o rimuoverle: Modifica Script, Esegui Script, Script Batch, Plugin, Modifica Menu. I dettagli sono spiegati di seguito. - - TOPIC: FILE SCRIPT Funzioni Menu: • Modifica Script - esegui una serie di modifiche su un file immagine, registrando tutte le funzioni e le impostazioni in un file di script con nome. • Esegui Script - esegui un file di script usando il file immagine corrente, come una funzione di modifica. • Script Batch - seleziona un numero qualsiasi di file immagine ed esegui un file di script su tutti loro, in modalità batch. - I file di script ti permettono di definire una serie di modifiche una volta sola, e ripeterle su uno o più file immagine in un secondo momento. - ^Funzioni di Modifica Scriptabili Alcune funzioni di modifica usano trascinamenti del mouse sull'immagine, es. tutte le funzioni di deformazione. Queste non sono scriptabili perché i trascinamenti del mouse non vengono registrati. L'uso di queste funzioni è bloccato. - Le seguenti funzioni sono attualmente scriptabili: • Modifica: Ritocca, Margini, Modalità Colore, Riempi Area • Ripara: Nitidezza, Sfoca Normale, Sfoca Graduale, Riduci Rumore, Rimuovi Foschia, Artefatti JPEG, Anti-Aliasing, Regola RGB • Perfeziona: Appiattisci Istogramma, Contrasto Locale, Amplifica Contrasto, Retinex Globale, Retinex Locale, Contrasto Locale, Saturazione, Messa a Fuoco Morbida, Rampa di Luminosità • Effetti: Contorni, Schizzo, Cartone Animato, Rilievo, Tessere1, Tessere2, Dipinto, Trama, Motivo, Dither, Incisione, Imposta Colori, Sposta Colori, Kernel Personalizzato - - TOPIC: MODIFICA SCRIPT Nel dialogo, premi [avvia]. Scegli un nome file per lo script. Inizia a modificare il file immagine corrente. Usa le funzioni di modifica desiderate in qualsiasi sequenza. Ogni modifica viene registrata nel file di script insieme a tutte le impostazioni del dialogo usate. Quando hai finito, premi [close] per chiudere il file di script e salvarlo con il nome dato. - - TOPIC: ESEGUI SCRIPT Scegli uno dei tuoi file di script salvati dal menu popup. Lo script viene eseguito usando il file immagine corrente, come una normale funzione di modifica. - - TOPIC: SCRIPT BATCH Nel dialogo, premi [Seleziona file]. Seleziona i file da modificare usando il dialogo standard di selezione file {SELEZIONA FILE IMMAGINE}. Quando hai finito, premi [Seleziona script]. Scegli un file di script dal menu popup. Lo script viene ora eseguito su tutti i file scelti. Tutte le immagini modificate vengono salvate come nuove versioni. Se vengono elaborati file RAW, gli output corrispondenti sono file TIFF-16. - - TOPIC: PLUGIN +image: plugins.png - Le funzioni plugin sono un modo per usare altri editor di immagini all'interno di Fotocx, es. Gimp. Puoi usare un editor RAW come Rawtherapee e poi eseguire modifiche aggiuntive usando Fotocx. - ^Procedura di utilizzo: • Apri il file da elaborare in Fotocx • Avvia il menu plugin e seleziona il programma desiderato, es. Gimp • Il programma plugin si avvia e apre il file passato da Fotocx • Esegui le modifiche desiderate usando il programma plugin • Quando hai finito, salva il file di output con lo stesso nome del file di input. L'estensione .ext può cambiare. • Chiudi il programma plugin. • Fotocx apre il file di output del plugin come versione modificata del file corrente. • Esegui modifiche aggiuntive, oppure salva il file modificato come nuova versione o nuovo file. - Un esempio di menu Plugin è a sinistra. L'ultima voce "Modifica Plugin" avvia l'applicazione di modifica testo a destra. Usa l'editor di testo per definire i nomi del menu plugin e i comandi per avviare i corrispondenti programmi plugin. Il formato è: nomemenu = comando-plugin %s TIP = spiegazione del comando sopra Il 'comando-plugin' è il comando di shell per la funzione plugin, e '%s' è il punto in cui il nome del file corrente viene inserito nel comando. Non mettere virgolette intorno a '%s' perché queste vengono aggiunte automaticamente, permettendo l'elaborazione di nomi file con spazi o altri caratteri speciali. L'esempio in alto mostrato è un menu chiamato "Gimp" che avvia il comando "gimp %s". Il testo TIP è opzionale. Se presente, si trova sulla riga seguente il nome del menu. Passando il mouse sopra la voce del menu verrà mostrato questo testo accanto al testo del menu. - Alcuni comandi potrebbero richiedere che siano specificati sia i file di input che quelli di output. In questo caso fornisci '%s' in entrambe le posizioni. Ometti '%s' se il comando non elabora un file immagine. - ^Seleziona Area Se il file di input ha un'area selezionata, verrà modificata solo questa area. La funzione plugin modifica l'intera immagine, ma quando il risultato viene elaborato da Fotocx, vengono mantenute solo le modifiche nell'area selezionata. - - TOPIC: ZOOM - ^Pulsante Zoom Clicca con il tasto sinistro o destro sul pulsante per aumentare o diminuire la dimensione dell'immagine in {VISUALIZZA FILE} o la dimensione del thumbnail in {VISUALIZZAZIONE GALLERIA}. Questo si applica solo se la modalità vista galleria è {VISTA MINIATURE}. Se {VISTA METADATA}, non viene fatto nulla. - - TOPIC: PREC/SUCC - Clicca con il tasto sinistro o destro sul pulsante per aprire il file precedente o successivo nella galleria corrente. Puoi anche usare i tasti freccia sinistra/destra. - - TOPIC: SALVA FILE - +image: file-save.png - +image: file-save-as.jpg - Nel primo dialogo, seleziona 'nuova versione', 'nuovo file', o 'sostituisci file'. - ^Nuova Versione Salva il file immagine corrente con un nuovo numero di versione. I nomi file con numeri di versione sono formattati "nomefile.vNN.ext" dove NN è un numero da 01 a 99. Se il nome file non ha versioni, verrà creata la versione .v01. Se sono già presenti versioni del file sul disco, viene usato il numero di versione superiore successivo. Se il file è un file JPEG, viene usata la qualità predefinita - vedi {IMPOSTAZIONI}. - ^Nuovo File Si aprirà il secondo dialogo mostrato sopra per salvare l'immagine corrente in un file selezionato, che può essere il file originale, un altro file esistente, o un nuovo file. Un file può essere salvato nei formati JPEG, PNG, JXL e TIFF. - Per JPEG, puoi scegliere un valore di qualità nell'intervallo 1-100. Valori più bassi danno file più piccoli e minore qualità dell'immagine. I valori sopra 70 sono difficili da distinguere da 100 (qualità più alta, dimensione file maggiore). Viene usata la qualità JPEG predefinita a meno che tu non cambi il valore nel dialogo. Il valore predefinito proviene da {IMPOSTAZIONI}. Non sarai in grado di vedere una differenza tra un file salvato con qualità 70 e uno con 100, ma la differenza nello spazio del file è enorme. Le aree trasparenti saranno nere. JPEG non supporta la trasparenza. - I file PNG e TIFF vengono compressi senza perdita di qualità e sono molto più grandi di JPEG. Possono essere salvati con 8 o 16 bit per colore. - Se 'imposta come corrente' è selezionato, il file salvato (nuovo nome file) diventerà il file corrente. - ^Sostituisci File Salva il file immagine corrente sovrascrivendo se stesso. - I ^permessi^ vengono copiati dal file di input. Premi il pulsante [Cambia] per modificare i permessi. - - TOPIC: MENU METADATA - - I metadata sono dati testuali memorizzati all'interno di un file immagine. Le fotocamere digitali creano automaticamente alcuni metadata, come data e ora, dati tecnici sulla fotocamera e i parametri della foto, e dati di posizione (se la fotocamera ha un ricevitore GPS). Altri dati possono essere aggiunti dall'utente, es. un titolo, una descrizione, una valutazione, keywords. Fotocx può cercare nella tua raccolta di immagini usando qualsiasi metadata, insieme a nomi di cartelle e file o nomi parziali, producendo una galleria di immagini corrispondenti. Nella maggior parte dei casi, la ricerca è quasi istantanea. - - TOPIC: VISUALIZZA META PRINCIPALI TOPIC: VISUALIZZA TUTTI I META +image: view-metadata.jpg - La funzione Visualizza Metadata Principali mostra i metadata comunemente utili per il file immagine corrente. Questo include la data e l'ora di una foto, la velocità dell'otturatore, la lunghezza focale, la dimensione dell'immagine, l'ISO, ecc. Le fotocamere digitali memorizzano questi dati nell'immagine. I metadata possono anche contenere dati aggiunti da un utente: keywords, titolo o didascalia, descrizione, commenti aggiunti dal fotografo o da un editor successivo (a volte presenti nelle immagini pubblicate). - Se un'immagine viene modificata, una registrazione della modifica viene salvata nei metadata. Visualizza Metadata Principali mostra la cronologia delle modifiche effettuate. - Visualizza Tutti i Metadata mostra tutti i metadata disponibili, e può includere oltre 100 elementi che probabilmente non ti interessano. - Il pulsante [Extras] nella finestra Visualizza Metadata Principali apre il dialogo mostrato a destra, dove puoi aggiungere tag extra al report. Qualsiasi tag disponibile nel report Visualizza Tutti i Metadata può essere aggiunto al report breve. Clicca su un tag nella colonna sinistra per aggiungerlo alla colonna destra e al report. Clicca su un tag nella colonna destra per rimuoverlo. Clicca sulla voce "Altro Tag ..." per digitare qualsiasi nome di tag non contenuto nell'elenco predefinito, che è limitato ai tag più probabilmente necessari. - Fotocx usa questi tag di metadata per la modifica e la ricerca delle immagini: • Titolo - breve titolo dell'immagine • Descrizione - descrizione dell'immagine • Data/Ora Originale - data/ora della foto • Valutazione - da 0 a 5 stelle • Paese - dal GPS della fotocamera o aggiunto manualmente • Posizione - il nome EXIF è la città • Geotag - latitude/longitude • Keywords - identificatori dell'immagine forniti dall'utente • Dati fotocamera - marca, modello, obiettivo • Dati di esposizione - tempo, numero F, lunghezza focale, ISO Questi tag vengono modificati usando la funzione {MODIFICA META PRINCIPALI}. Anche qualsiasi altro tag può essere modificato e cercato, usando metodi meno comodi spiegati di seguito. - Ci sono anche diverse funzioni batch per aggiungere dati a molti file immagine contemporaneamente. Vedi {MENU BATCH}. - - TOPIC: PANORAMICA KEYWORDS I file immagine possono avere keywords di identificazione o classificazione. Queste possono essere usate per cercare in una grande raccolta di immagini le immagini che hanno le keywords desiderate. Keywords tipiche: soggetto, evento, posizione, persone o cose, ecc. Le keywords risiedono all'interno dei metadata dell'immagine. Le keywords sono normalmente una singola parola, ma può essere usata una breve frase con spazi o altri delimitatori incorporati. Virgole e punti e virgola vengono usati come delimitatori tra le keywords, e quindi non possono essere usati all'interno di una keyword (uno standard esterno). Una keyword composta come "arizona scenery" è consentita, ma dovresti usare invece due keywords per maggiore flessibilità: puoi cercare immagini che hanno una delle due keywords o entrambe. - Tutte le immagini che hanno una o più keywords desiderate possono essere trovate rapidamente e visualizzate in una finestra galleria. Se hai usato i nomi di cartelle e file in modo significativo, puoi anche cercare le immagini usando questi nomi. Puoi anche cercare le immagini per data, valutazione, posizione, e altri tag di metadata. Questi non devono essere duplicati nelle keywords. Vedi {CERCA IMMAGINI} sotto. - ^Sistema di Keyword Gestito Questo è appropriato se desideri pianificare il tuo sistema di keywords prima di aggiungere keywords alle tue immagini. In questo sistema, crei un numero limitato di categorie di keywords (es. persone, luoghi, cose, eventi, arte, paesaggi ...). Le keywords possono essere create e assegnate a una categoria secondo necessità quando le keywords vengono assegnate alle immagini. A un'immagine viene assegnata una keyword puntando e cliccando sull'elenco delle keywords disponibili, che è organizzato per categoria e alfabeticamente all'interno della categoria. Se è necessaria una nuova keyword, questa viene creata quando viene assegnata per la prima volta a un'immagine. Il numero di keywords all'interno di una categoria dovrebbe idealmente essere inferiore a circa 200, in modo che la localizzazione visiva da un elenco di selezione sia ragionevolmente veloce. - ^Vantaggi del sistema di keyword gestito • previene nomi di keyword incoerenti (es. 'paesaggio' e 'panorama') • previene grafie alternative e errori di battitura (es. susan, susy, susna) • previene keywords che includono altre keywords (es. paesaggio, lago) • la ricerca è più affidabile perché le keywords non hanno gli errori sopra indicati • quando assegni le keywords, hai una panoramica delle keywords disponibili, invece di migliaia di keywords caotiche in un sistema non gestito - Scegliere keywords da un elenco lungo può essere lento. Questo viene mitigato in 3 modi: • Fino a circa 10 keywords usate più di recente vengono mostrate nel dialogo di modifica metadata, dove possono essere facilmente viste e scelte. Poiché una serie di foto scattate nello stesso momento condividerà probabilmente molte keywords, aggiungere keywords risulta più facile e veloce. • Puoi semplicemente iniziare a digitare il nome di una keyword desiderata. Un elenco popup di keywords corrispondenti appare non appena ci sono solo poche possibili corrispondenze. Puoi quindi cliccare sulla keyword desiderata per aggiungerla all'immagine. Se non ci sono keywords corrispondenti, hai l'opzione di aggiungere la nuova keyword all'elenco delle keywords definite. • Puoi scegliere una categoria per visualizzare un elenco di selezione più piccolo. - Se le keywords sono definite in modo ampio e sono meno numerose, i risultati di ricerca per le keywords saranno più numerosi, ma trovare le immagini desiderate visivamente può essere piuttosto veloce. L'ordine fisico dei file viene preservato: i file immagine situati insieme nelle loro cartelle appariranno insieme anche nei risultati di ricerca. - Le immagini scaricate da internet spesso contengono keywords. Queste ovviamente non hanno organizzazione e sono collettivamente caotiche. Se usi un sistema di keyword gestito, è meglio esaminare tali immagini e ripulire le keywords per conformarle al tuo sistema, oppure eliminarle. Qualsiasi nuova keyword presente verrà aggiunta automaticamente sotto la categoria "nocatg". Se noti keywords indesiderate nel tuo elenco di keywords, usa {CERCA IMMAGINI} per keyword per trovare le immagini con keywords indesiderate in modo da poterle correggere o rimuovere. - ^Sistema di Keyword Casuale Potresti preferire inventare keywords secondo necessità senza un sistema particolare in mente. Oppure potresti già avere migliaia di keywords, rendendo difficile una conversione a un sistema di keyword gestito (ma non impossibile: Fotocx può convertire in massa i nomi delle keywords). In questo caso, puoi semplicemente digitare le keywords nelle tue immagini, creando nuove keywords secondo necessità. C'è comunque una certa capacità di mantenere le keywords organizzate: le keywords esistenti che corrispondono ai caratteri inseriti vengono mostrate non appena ci sono solo poche possibili corrispondenze. Esempio: digiti "new" e viene mostrato un elenco di keywords: New York, New Delhi, Newman ... Se una di queste è quella che intendevi, clicca su di essa per selezionare la keyword. In caso contrario, continui a digitare e alla fine premi Invio per creare una nuova keyword. Quando cerchi immagini per keywords, puoi digitare i nomi delle keywords desiderate o sceglierle dall'elenco delle keywords disponibili. Vengono mostrate le keywords disponibili che corrispondono alle prime lettere digitate, e puoi scegliere da questo elenco. Non puoi inserire una keyword di ricerca che non esiste da nessuna parte nelle tue immagini. Un sistema di keyword casuale probabilmente risulterà in migliaia di keywords. Questo potrebbe non essere molto utile. - - TOPIC: GEOTAGS OVERVIEW Le fotocamere moderne possono registrare la posizione di ogni foto, usando un ricevitore GPS interno. Latitude, longitude (e possibilmente città/posizione e paese) vengono registrate nei metadata EXIF del file immagine. La funzione {MODIFICA META PRINCIPALI} permette anche di inserire o correggere i dati di posizione. Le posizioni possono anche essere specificate cliccando su una mappa del mondo zoomabile. Funzioni per trovare immagini per una posizione o regione specificata: • {CERCA IMMAGINI}: cerca per nome di posizione (anche nomi multipli, corrispondenze parziali). • {LUOGHI/DATE}: cerca per gruppi di paese, posizione e data • Immagini per Posizione sulla Mappa: clicca su un marcatore della mappa per mostrare tutte le immagini in quella posizione. - I nomi di posizione (città o altro nome di luogo, e paese) dal GPS della fotocamera non sono standardizzati e possono essere caotici (es. Munich, München, MONACO). Come gestire questo è discusso di seguito. - - TOPIC: MODIFICA META PRINCIPALI +image: edit-meta.jpg - La funzione Modifica Metadata Principali viene usata per aggiungere metadata di base a un'immagine. Leggi {PANORAMICA KEYWORDS} e {GEOTAGS OVERVIEW} (sopra) prima di usare Modifica Metadata Principali. - Modifica Metadata Principali viene usata per modificare i metadata usati più di frequente: data e ora dell'immagine, valutazione, titolo, descrizione, dati di posizione, e keywords. Il dialogo mostra inizialmente i dati per l'immagine corrente. Dopo aver apportato aggiunte o modifiche, premi [Applica] per aggiornare il file immagine. Non esiste un versionamento automatico del file per le modifiche ai metadata, ma puoi usare Salva File > Nuova Versione se lo desideri. - Il dialogo mostra i metadata per l'immagine corrente in Vista File, oppure per un thumbnail cliccato in Vista Galleria. Il dialogo di modifica si aggiorna quando viene aperta una nuova immagine o viene cliccato un nuovo thumbnail. - La data dell'immagine, se disponibile, viene mostrata come Data Immagine. Questa può essere inserita se mancante, o modificata. Puoi inserire una data completa nel formato aaaa:mm:gg o un formato più breve aaaa o aaaa:mm. Un mese/giorno mancante è logicamente equivalente a 01:01 quando confrontato con un limite basso per la ricerca, o a 12:31 quando confrontato con un limite alto. Il pulsante [Prec] compila la data dai dati inseriti in precedenza. Questo per permettere di datare facilmente una serie di immagini. Se l'ora è importante, puoi aggiungere un'ora usando il formato hh:mm[.ss]. Il formato di inserimento completo è: aaaa:mm:gg hh:mm:ss - Puoi inserire un titolo, una descrizione, e una valutazione (0-5 stelle) per l'immagine. Per modificare il titolo o la descrizione, premi il pulsante [modifica] corrispondente. Questo aprirà un editor di testo con un ampio limite sulla dimensione del testo. Puoi usare il tasto [enter] per un'interruzione di riga deliberata. In Fotocx, queste interruzioni di riga funzioneranno; in altri visualizzatori di immagini, potrebbero essere sostituite con punti. - Le keywords esistenti sono mostrate in Keywords Immagine. Le keywords disponibili sono mostrate nella finestra Keywords Definite sottostante. Una di queste keywords può essere aggiunta all'immagine cliccandoci sopra. Una keyword può essere eliminata dall'immagine cliccandoci sopra in Keywords Immagine. Le keywords aggiunte di recente sono mostrate in Keywords Recenti. Questo è una comodità per rendere più facile l'aggiunta di keywords a un nuovo gruppo di immagini, poiché molte delle stesse keywords verranno usate di nuovo. Punta e clicca allo stesso modo. - Se l'elenco delle keywords definite è lungo, potrebbe essere più facile digitare la keyword desiderata in Inserisci Keyword. Le keywords esistenti che corrispondono a quanto digitato finora appaiono in Keywords Corrispondenti, e puoi cliccare su una di queste per aggiungere la keyword all'immagine. Se la keyword inserita è nuova (non viene mostrata nessuna keyword corrispondente), premi [aggiungi nuova keyword] quando la keyword è completa. Verrà aggiunta all'immagine e all'elenco delle keywords definite con categoria "nocatg". - Se stai usando categorie di keywords, puoi selezionare una categoria, e solo quelle keywords verranno mostrate nell'elenco delle keywords definite. - Il pulsante [Applica] scrive i dati nel file immagine e nel file indice dei metadata usato per la ricerca delle immagini. - Il pulsante [Prec] (in basso nel dialogo) può essere usato per caricare tutti i dati disponibili dall'immagine precedentemente visualizzata o modificata. Questo può essere usato per velocizzare l'elaborazione di un gruppo di immagini che condividono gran parte degli stessi dati. - ^Aggiunta di Geotag Ci sono diversi modi per aggiungere nomi di posizione e geocoordinate nel dialogo {MODIFICA META PRINCIPALI}. - GPS della Fotocamera Il sensore GPS della tua fotocamera potrebbe aver inserito nomi di posizione e geocoordinate. La lingua potrebbe non essere quella desiderata, oppure potrebbero essere usate lettere tutte maiuscole, o altro caos. Usa il pulsante [clear] per ricominciare, e inserisci il nuovo testo. - Pulsante [Trova] Cerca una posizione presente ovunque nei tuoi file immagine o in un enorme elenco di posizioni conosciute (worldcities.txt). Inserisci alcuni caratteri iniziali in Posizione e premi [Trova]. Se viene mostrato un elenco di selezione di posizioni corrispondenti, scegline una. Se non viene mostrato nulla, usa [Mappa] per cliccare su una posizione della mappa. Correggi i nomi di posizione e paese se necessario. Questa posizione è ora conosciuta e disponibile per la scelta. - Pulsante [Precedente] Se l'immagine in modifica ha gli stessi dati di posizione dell'immagine modificata in precedenza, premi [Precedente] per compilare i dati di posizione usati in precedenza. - Puoi usare {GEOTAG BATCH} per aggiungere dati di posizione a molti file immagine contemporaneamente. - - TOPIC: MODIFICA QUALSIASI META +image: edit-any-metadata.png - Questo è un dialogo per modificare qualsiasi metadata per il file immagine corrente. I tag più comuni per la modifica sono elencati a sinistra. Premi il pulsante [Elenco completo] per ottenere un elenco di tutti i tag disponibili per il file immagine corrente (potrebbero essercene centinaia). Premi [Elenco breve] per tornare all'elenco dei tag comuni. Clicca su un tag nell'elenco per recuperare il valore attuale del tag. Cambia il valore se lo desideri e premi [aggiorna]. Per modificare un nome di tag non presente nell'elenco, inserisci il nome del tag e premi [recupera] per ottenere il valore attuale, se presente. Poi inserisci o cambia il valore e premi [aggiorna]. Per eliminare un tag, premi [elimina]. Puoi inserire il nome del tag in minuscolo e con o senza spazi, es. "Subject Distance" e "subjectdistance" funzioneranno entrambi. Alcuni tag non possono essere cambiati, es. 'image width' è la larghezza in pixel dell'immagine, che può essere cambiata solo cambiando la larghezza in pixel dell'immagine. La sorgente per l'elenco breve è il file di testo /meta_picklist. Puoi aggiungere o rimuovere tag da questo elenco. - - TOPIC: ELIMINA META Specifica il nome del tag da eliminare, oppure seleziona Tutti. Il metadata viene eliminato. Usa Tutti per ripulire un'immagine da qualsiasi informazione identificativa che potrebbe essere presente. Alcuni tag non sono eliminabili, es. Nome File. - - TOPIC: COPIA META Le immagini combinate create con Fotocx (HDR, panorama, mashup ...) non conterranno metadata per default. Usa questa funzione per copiare i metadata da una delle immagini di input, o da qualsiasi altra immagine. Usa i pulsanti [Sfoglia] per scegliere un file da cui prendere i metadata e un file che riceverà i metadata ("file di destinazione" nel dialogo). - - TOPIC: CORREGGI META Usa questa funzione se hai un file immagine che produce un messaggio di errore quando provi a modificare i metadata. Eliminerà i metadata malformati e conserverà il resto. - - TOPIC: GESTISCI KEYWORDS +image: manage-keywords.png - Crea keywords e opzionalmente raggruppale in categorie. Puoi assegnare categorie alle keywords per aiutare a organizzarle e individuarle più rapidamente quando aggiungi keywords alle immagini. Sono opzionali e non hanno alcun ruolo nella ricerca per keyword: nell'immagine viene memorizzata solo la keyword, non la sua categoria. Le categorie tipiche sono persone, luoghi, cose, eventi, paesaggi, edifici, arte, ecc. Per aggiungere una nuova keyword con una nuova categoria, inserisci la categoria e la keyword, poi clicca [create]. Se la categoria è vuota, la keyword verrà assegnata a "nocatg". Per assegnare una keyword a una categoria diversa, clicca su una categoria (testo in grassetto) o inseriscine una nuova, clicca sulla keyword, e premi [create]. La keyword si sposterà dalla vecchia alla nuova categoria. Per eliminare una keyword, clicca sulla keyword e premi [elimina]. Le keywords usate nelle immagini ma non assegnate a una categoria appariranno sotto "nocatg". Una Categoria senza keywords assegnate può essere eliminata - clicca sulla categoria, cancella il nome della keyword se presente, premi [elimina]. - Nota: una keyword appena creata viene aggiunta alla fine dell'elenco delle keywords per la sua categoria. Al prossimo avvio di Fotocx, tutte le categorie e i loro elenchi di keywords vengono ordinati alfabeticamente, tranne che "nocatg" è sempre l'ultima. - - TOPIC: DIDASCALIE +image: choose-captions.png - ^Menu Scegli Didascalie Scegli quali tag di metadata usare per le didascalie di testo visualizzate nell'angolo in alto a sinistra dell'immagine in modalità vista file. - ^Menu Alterna Didascalie Attiva o disattiva la visualizzazione delle didascalie. Assegna una scorciatoia da tastiera per abilitare o disabilitare rapidamente la visualizzazione delle didascalie. - ^Nota:^ spostando il mouse nell'angolo in alto a sinistra di un'immagine in vista file verranno mostrati il titolo e la descrizione in un'immagine popup. L'immagine scompare quando il mouse viene spostato altrove. - - TOPIC: LUOGHI/DATE +image: image-locations.jpg - Questo è un modo veloce per trovare tutte le foto scattate in una data posizione o intervallo di posizione e data. Nel dialogo, scegli tra le due opzioni: includi tutte le immagini nel report, oppure includi solo le immagini trovate dalla precedente funzione Cerca. Poi seleziona il livello di raggruppamento desiderato: paese paese e posizione paese e data paese e posizione e data data e paese data e paese e posizione - Se la data è inclusa, seleziona un intervallo di giorni per il consolidamento: le foto con date all'interno dell'intervallo verranno raggruppate insieme sotto la prima data. Premi [proceed] per ottenere un report che mostra il conteggio delle immagini in ogni gruppo: per paese, paese e posizione, ecc. Questo è anche l'ordine di ordinamento. Nell'esempio sopra, 28 foto sono dalla Nuova Zelanda del 02.11.2004. Clicca su una riga nel report per ottenere una galleria di thumbnails di quelle immagini. - - TOPIC: CRONOLOGIA +image: timeline-report.jpg - Questo report produce una cronologia del conteggio delle immagini per mese. Scegli tra le due opzioni: includi tutte le immagini nel report, oppure includi solo le immagini trovate dalla precedente funzione Cerca. Clicca su un anno e mese nel report risultante per ottenere una galleria di thumbnails di tutte le immagini con una data foto (EXIF) nel mese selezionato. L'esempio sopra mostra 208 immagini per ott. 2017. L'anno 'null' è per le immagini senza data foto. - - TOPIC: TAG METADATA Questa funzione trova tutti i file immagine che usano un tag di metadata e valore specificati. Seleziona un tag dall'elenco popup: valutazione, keywords, titolo, descrizione, fotocamera, metadata extra indicizzati - vedi {INDICIZZA FILE}. Viene mostrato un elenco dei valori disponibili per il tag, insieme al numero di file immagine che usano questo valore di tag. Per 'titolo' e 'descrizione', vengono mostrati solo i primi 60 caratteri, e vengono riportati tutti i file che usano valori di tag corrispondenti a questi 60 caratteri iniziali. Per 'fotocamera' il valore di corrispondenza è una combinazione di marca, modello e obiettivo. - - TOPIC: RICERCA AUTOMATICA Questa funzione può essere usata da file di script shell per estrarre i file immagine che soddisfano uno qualsiasi dei criteri di selezione disponibili quando si usa la funzione Cerca Immagini (vedi sotto). Prima, usa la funzione Cerca Immagini per impostare i criteri di selezione desiderati (es. nomi di cartelle/file, date, keywords, o altri metadata). Usa il pulsante [salva] per salvare i criteri in un file di impostazioni. Usa il seguente comando per avviare Fotocx ed eseguire la ricerca: $ fotocx -m autosearch . L'output va in /search_results. - - TOPIC: CERCA IMMAGINI Usa la funzione Cerca Immagini per trovare immagini con qualsiasi metadata desiderato (data, keywords, posizione ...). Per la ricerca viene usato un file indice dei metadata, che rende possibile cercare migliaia di immagini al secondo. - Ci sono due formati di report: una galleria di thumbnails che mostra tutte le immagini corrispondenti ai criteri di ricerca, oppure un report metadata che combina i thumbnails con testo di metadata. Ecco un esempio del formato report metadata: +image: search-images-metadata.jpg - ^Dialogo di Ricerca +image: search-images.jpg - Nel dialogo, seleziona quali immagini cercare, sia tutte (tutte le immagini) sia l'insieme corrente, ovvero le immagini nella galleria corrente, che può essere una cartella, un album, o i risultati di una ricerca immagini precedente. - Successivamente, scegli cosa fare con le immagini corrispondenti trovate: 'nuovo insieme' significa sostituire l'insieme corrente con le immagini trovate, 'aggiungi' significa aggiungerle all'insieme corrente (galleria), e 'rimuovi' significa rimuoverle dall'insieme corrente. Per rimuovere immagini, devi cercare nell'insieme corrente. - Per i file che corrispondono ai criteri di selezione, puoi specificare inoltre quali versioni sono selezionate: originale, ultima versione, o tutte le versioni. 'originale' significa l'immagine originale o non modificata (o la prima versione se l'originale non è stato salvato). 'ultima versione' significa la versione più recente o modificata per ultima disponibile. 'tutte le versioni' significa che verranno recuperate l'originale e tutte le versioni. - Seleziona il tipo di report desiderato. Il report galleria è una pagina di immagini thumbnail, lunga quanto necessario per contenere tutte le immagini corrispondenti ai criteri di ricerca. Il report metadata ha sia immagini thumbnail sia un elenco di tag di metadata accanto a ogni thumbnail. Questi includono i tag standard (data, valutazione, keywords, geotag, titolo, descrizione) e qualsiasi altro tag di metadata aggiunto nell'elenco di selezione tag (vedi sotto). - Inserisci i tuoi criteri di ricerca. Seleziona le keywords desiderate, date, valutazioni a stelle, parole contenute nel testo (titolo o descrizione dell'immagine), nomi di file o cartelle, e nomi di posizione. Vedi ulteriori dettagli sotto. - Le keywords disponibili sono mostrate in Keywords Definite e possono essere scelte con punta e clicca. Se l'elenco delle keywords definite è lungo, potrebbe essere più facile iniziare a digitare una keyword in 'inserisci keyword'. Le keywords esistenti che corrispondono a quanto digitato finora appariranno nell'elenco 'corrispondenze', e puoi cliccare su una di queste per aggiungere la keyword all'elenco di ricerca. - Se stai usando categorie di keywords, puoi selezionare una categoria, e solo quelle keywords verranno mostrate nell'elenco delle keywords definite. - Un intervallo di date può essere inserito per limitare la ricerca alle immagini all'interno dell'intervallo di date. Scegli la data foto (dalla fotocamera) o la data file (data di creazione o ultima modifica). Il formato è aaaa:mm:gg. Vengono selezionate le immagini che hanno una data uguale o successiva alla prima data, se presente, e uguale o precedente alla seconda data, se presente. Il mese/giorno mancante ha come default 01/01 per il limite basso della data e 12/31 per il limite alto. Gli orari possono opzionalmente essere specificati usando il formato aaaa:mm:gg hh:mm. Gli orari mancanti hanno come default 00:00 e 23:59. - Per cercare immagini senza una data foto EXIF (es. immagini scansionate), usa "null" nel primo campo data. - Una coppia di valutazioni a stelle può essere inserita per limitare i risultati alle immagini con una valutazione all'interno dell'intervallo dato. Un valore basso mancante implica 0 stelle, e un valore alto mancante significa la valutazione più alta, 5 stelle. - Si possono cercare nomi di cartelle e file. Nel campo cerca nomi file, inserisci un numero qualsiasi di nomi usati per le tue cartelle e file immagine, separati da virgole. Un inserimento di "egypt cairo" corrisponderebbe a tutte le cartelle immagine o nomi file che contengono una di queste stringhe. Corrisponderanno anche le sottostringhe. Le maiuscole/minuscole non contano. - Si possono cercare titolo e descrizione dell'immagine. Inserisci le parole da cercare nel campo cerca titolo/desc, separate da virgole. Queste verranno confrontate con ogni parola nel titolo e nella descrizione di tutte le immagini, e le immagini corrispondenti vengono selezionate. Le maiuscole/minuscole non contano. - Per cercare posizioni, inserisci uno o più nomi di città/posizione o paese nel campo cerca posizioni, separati da virgole. Verranno selezionati solo i file immagine con geotag corrispondenti a una delle posizioni inserite. Una posizione può essere una città, un parco o un altro nome geografico (qualsiasi cosa sia memorizzata nei campi metadata 'City' e 'Country'). Le maiuscole/minuscole non contano. - I pulsanti radio 'tutti' e 'qualsiasi' si applicano a keywords, testo, nomi file e posizioni. Puoi selezionare immagini che hanno TUTTE le stringhe inserite, o QUALSIASI delle stringhe inserite. Esempio: se il campo di ricerca posizione è "new york" ed è selezionato "qualsiasi", verrebbero incluse immagini da New Zealand e York, Inghilterra. Se è selezionato "tutti", verrebbero incluse solo le immagini situate a New York. - Se desideri trovare immagini con dati mancanti, puoi inserire "null" come valore di corrispondenza. - ^Cerca Metadata Aggiuntivi Usando gli input del dialogo 'nometag', 'condizione', e 'valori di corrispondenza' puoi specificare tag di metadata aggiuntivi da usare come criteri di selezione, o da aggiungere all'output del report se viene scelto il tipo di report "metadata". I tag disponibili per un dato file immagine possono essere mostrati con {VISUALIZZA TUTTI I META}. Questi includono molti tag non presenti nel dialogo principale. L'elenco di selezione proviene dal file di testo /meta_picklist. Puoi aggiungere tag a questo file se lo desideri. Puoi usare tag che sono presenti anche nel dialogo principale. Il vantaggio qui è che si può usare una logica di corrispondenza più flessibile. - La logica di corrispondenza può essere selezionata per ciascun tag di metadata. ^metodo di corrispondenza valore di corrispondenza per la selezione • report qualsiasi valore, anche mancante • reportx valore non mancante • matches valori di testo separati da virgola • contains lo stesso, con corrispondenza di sottostringa • number = valori uguali • number => valori uguali o maggiori • number <= valori uguali o minori - I pulsanti [X] sul lato destro possono essere usati per cancellare singoli tag di ricerca metadata. - ^Pulsanti del Dialogo [Carica] e [Salva] possono essere usati per caricare o salvare i criteri di ricerca da un file. [Cancella] cancellerà tutti i dati nel dialogo. [Procedi] avvierà il processo di ricerca. - Premi il pulsante [proceed] per eseguire la ricerca. L'output è una galleria standard di thumbnails, oppure il formato report metadata mostrato sopra. Puoi salvare le immagini cercate come album permanente - vedi {ALBUM}. - ^Prestazioni La ricerca e il report dei metadata indicizzati è quasi istantanea. La velocità per i metadata non indicizzati dipende dalla velocità del computer e del disco. Un computer potente con disco SSD può cercare oltre 100K file al minuto. - ^search_results^ (album) L'output di Cerca Immagini viene salvato nell'album "search_results". Rinomina questo album se vuoi evitare che una ricerca successiva lo sostituisca. - Limitazione: la funzione di ricerca è limitata a 40.000 risultati (immagini trovate che soddisfano i criteri di ricerca). Se questo limite viene superato, vieni avvisato e la ricerca viene troncata. Questo limite esiste perché la dimensione di una finestra scorrevole in GTK è limitata, e un tentativo di creare una finestra più grande potrebbe causare un crash o un blocco. - - TOPIC: MENU SELEZIONA - - TOPIC: PANORAMICA AREA Le funzioni di modifica normalmente si applicano all'intera immagine, ma è possibile modificare parte di un'immagine (un'"area") e lasciare invariato il resto. Se è stata selezionata un'area dell'immagine, allora la maggior parte delle funzioni di modifica funzionerà solo all'interno di questa area. Alcune funzioni (es. Ridimensiona) ignorano un'area selezionata. Un'area può essere selezionata prima di avviare una funzione di modifica, o mentre una funzione di modifica è in uso. L'area selezionata è immediatamente attiva, le modifiche precedenti vengono mantenute, e le modifiche future si applicheranno solo all'interno dell'area. Se viene avviata un'altra modifica, l'area selezionata rimane attiva, quindi è possibile eseguire una serie di modifiche all'interno di un'area. Un'area può anche essere costituita da più aree non collegate nell'immagine. - Fotocx usa 'aree' invece di 'livelli'. Invece di selezionare qualcosa dall'immagine, creare un livello separato dalla selezione, modificare il livello e infine unire il livello, selezioni qualcosa nell'immagine, esegui funzioni di modifica sulla selezione, e vedi immediatamente il risultato finale. Le aree possono anche essere salvate, incollate in un'altra immagine, spostate e ridimensionate, e ulteriormente modificate. - +image: edit-selection.jpg - Modificare un'area selezionata a volte può risultare in confini visibili ai bordi dell'area (a volte questi corrispondono a bordi di caratteristiche nell'immagine, e quindi non sono un problema). Puoi fondere i bordi usando {SFUMATURA AREA}: le modifiche possono essere applicate gradualmente dal bordo dell'area verso l'interno, e puoi selezionare quali bordi vengono fusi. - - TOPIC: SELEZIONA AREA +image: select-area.jpg - Il dialogo Seleziona Area inizia con il menu Selezione > Seleziona Area. Seleziona uno dei metodi spiegati sotto. Ogni metodo seleziona le aree dell'immagine in un modo diverso. Puoi cambiare metodo in qualsiasi momento, e le aree selezionate si accumulano. Un contorno dell'area/e dell'immagine selezionata viene mostrato mentre aggiungi o rimuovi aree dalla selezione. Il pulsante [Termina] viene usato per mappare i pixel dell'immagine all'interno dei contorni dell'area, rendendoli pronti per applicare le successive funzioni di modifica. Il pulsante [Nascondi] nasconde il contorno dell'area, dandoti una migliore visibilità delle modifiche e dei possibili effetti sui bordi dell'area. Usa il pulsante [Mostra] per mostrare il contorno dell'area. Il pulsante [Cancella] rimuove tutte le selezioni di area. Il dialogo seleziona area può essere annullato e riavviato più tardi per modificare le aree esistenti o aggiungerne di nuove. - ^Metodi I seguenti metodi vengono usati per racchiudere uno o più spazi dell'immagine che apparterranno all'area finale. Questi metodi possono essere usati in qualsiasi sequenza per definire spazi che sono uniti o separati. • Rettangolo - trascina per delineare un'area rettangolare • Ellisse - trascina per delineare un'area circolare o ellittica • Disegno a Mano Libera - delinea un'area disegnando con il mouse • Segui Bordo - delinea seguendo i bordi delle caratteristiche dell'immagine • Seleziona area entro il mouse - trascina per selezionare i pixel entro un cerchio intorno al puntatore del mouse. • Seleziona un colore entro il mouse - seleziona solo i pixel che corrispondono a un dato colore, corrispondenza 0-100%. • Seleziona tutti i colori entro il mouse - seleziona tutti i pixel entro il mouse, estendi la selezione nelle aree adiacenti con colori corrispondenti ai colori entro il mouse (a volte chiamato 'flood'). - I seguenti paragrafi spiegano i dettagli di ciascun metodo. - ^Rettangolo Trascina il mouse da un angolo all'angolo opposto di un'area rettangolare da selezionare. Viene disegnato un rettangolo per racchiudere l'area. Clicca con il tasto destro per eliminare e ricominciare. Ripeti il processo per selezionare più aree rettangolari. - ^Ellisse Funziona allo stesso modo della selezione rettangolo, tranne che l'area racchiusa è un cerchio o un'ellisse. La posizione iniziale del trascinamento è il centro dell'ellisse risultante. L'angolo del trascinamento determina la forma dell'ellisse. - ^Disegno a Mano Libera Trascina il mouse (tasto sinistro premuto) per disegnare una linea a mano libera, oppure clicca con il tasto sinistro per collegare una linea retta dall'ultimo punto disegnato al punto cliccato. Continua intorno all'area target finché non è circondata da curve e linee collegate. Clicca con il tasto destro per rimuovere le linee precedenti (errori). Un clic con il tasto destro rimuoverà la linea precedentemente cliccata o trascinata, fino a 50 pixel. Clicca ripetutamente con il tasto destro per rimuoverne di più. Una nuova linea cliccata si collegherà sempre alla fine della linea precedente. Una nuova linea trascinata si collegherà alla linea precedente se viene iniziata vicino alla fine di quella linea. Se viene iniziata altrove, verrà disegnata una linea disconnessa. Puoi iniziare un nuovo trascinamento da lontano e disegnare all'indietro per incontrare la linea precedente. Se una linea cliccata si collega a un punto indesiderato (cioè non vuoi collegarti all'ultima linea disegnata), clicca con il tasto destro per cancellarla e poi usa il trascinamento per iniziare una nuova sequenza di linee. Un trascinamento con il tasto destro può essere usato per cancellare segmenti di linea: trascina con il tasto destro vicino a una linea per cancellarla, poi trascina con il tasto sinistro per ridisegnare la linea. Alla fine, un'area deve essere completamente racchiusa, senza spazi vuoti. Le linee che si sovrappongono un po' alle estremità vanno bene. Gli spazi vuoti possono essere difficili da trovare e correggere, quindi lavora al 100% della dimensione dell'immagine o superiore e fai attenzione. Una serie di linee automaticamente collegate con clic sinistri non lascerà spazi vuoti, ma la deviazione da questa sequenza è probabile che crei spazi vuoti. Per ridurre la possibilità di spazi vuoti, usa sovrapposizioni deliberate quando colleghi manualmente le linee. C'è un'utility di rilevamento degli spazi vuoti descritta sotto - {TROVA INTERRUZIONE AREA}. Se un bordo dell'area è anche un bordo dell'immagine, non devi disegnare questa porzione dell'area. Disegna la linea fuori dal bordo dell'immagine, e ridisegnala sull'immagine in un'altra posizione lungo il bordo dell'immagine. - ^Segui Bordo I pixel ad alto contrasto (probabili bordi di caratteristiche dell'immagine) tra l'ultimo punto disegnato e una nuova posizione cliccata vengono trovati e collegati. Questo è efficace per bordi chiari che non sono troppo irregolari. I bordi sfumati e frastagliati potrebbero non funzionare bene e sarà necessario il disegno a mano libera se è richiesta un'alta precisione. Le regole per collegare le linee sono le stesse spiegate sopra. Trascinare il mouse invece di cliccare funziona come il disegno a mano libera, ma con una tendenza a seguire i bordi delle caratteristiche da una posizione leggermente dietro al mouse. Per bordi molto irregolari (capelli, fogliame), vedi 'colore da deselezionare', sotto. - ^Raggio del Mouse e Livello di Corrispondenza Colore Questi due controlli si applicano solo ai metodi 'seleziona entro il mouse' descritti sotto. Il raggio del mouse definisce la dimensione di un cerchio intorno al puntatore del mouse. I pixel all'interno del cerchio vengono selezionati, oppure forniscono un insieme di colori per la corrispondenza e la selezione dei pixel dal cerchio del mouse verso l'esterno. Il livello di corrispondenza definisce un livello di corrispondenza richiesto (0-100%) per selezionare i pixel in base al loro colore e luminosità. '0' significa che tutto corrisponde, e '100' significa che è richiesta una corrispondenza perfetta. - ^Seleziona area entro il mouse Il clic sinistro o il trascinamento selezionerà i pixel racchiusi dal cerchio del mouse. Un clic destro deselezionerà l'ultima selezione (ripeti per deselezionare di più). Un trascinamento con il tasto destro deselezionerà i pixel racchiusi. - ^Seleziona un colore entro il mouse Clicca sull'immagine per selezionare un colore. Il colore viene mostrato sul pulsante colore. Puoi anche usare il pulsante per impostare direttamente un colore. Trascina con il tasto sinistro/destro per selezionare/deselezionare i pixel entro il cerchio del mouse che corrispondono al colore selezionato entro il livello di corrispondenza. Regola il livello di corrispondenza verso il basso o l'alto per far corrispondere una gamma di colori maggiore o minore. Clicca secondo necessità sull'immagine per cambiare il colore da far corrispondere. - ^Colore opzionale da deselezionare Questo si applica solo a 'seleziona un colore' sopra. Clicca con il tasto sinistro sull'immagine per impostare un colore da deselezionare. Quando la casella è selezionata, il colore da deselezionare è attivo. Se un pixel corrisponde al colore da deselezionare meglio del colore da selezionare, il pixel viene deselezionato. Quando selezioni lungo il bordo di una caratteristica con basso contrasto di colore rispetto a un'area adiacente che dovrebbe rimanere deselezionata, imposta il colore da deselezionare dall'area adiacente. Questo è utile per la selezione accurata di un bordo complesso, come capelli o fogliame. - ^Seleziona tutti i colori entro il mouse Questo è chiamato 'flood' in alcuni editor. Trascina con il tasto sinistro/destro per selezionare/deselezionare i pixel all'interno del cerchio del mouse. Vengono inclusi anche i pixel oltre il cerchio del mouse se soddisfano queste due condizioni: 1) il loro colore corrisponde a qualsiasi colore all'interno del cerchio del mouse, entro il livello di corrispondenza corrente. 2) sono all'interno dell'intervallo di ricerca del puntatore del mouse. Questo è un fattore del raggio del mouse, es. se il raggio del mouse è 20 e l'intervallo di ricerca è 3, allora l'intervallo di ricerca è di 60 pixel dal puntatore del mouse. Trascina il mouse su nuove aree che vuoi includere. Osserva l'area selezionata espandersi nelle aree con colori corrispondenti a quelli all'interno del cerchio del mouse. Se vai troppo oltre, clicca con il tasto destro per rimuovere l'ultima selezione. Ripeti se necessario per rimuovere altre selezioni precedenti. Riduci il raggio o aumenta il livello di corrispondenza per ottenere un controllo più fine - la selezione si espanderà più lentamente e rimarrà più vicina al cerchio del mouse. Un raggio piccolo e un livello di corrispondenza alto possono essere usati per seguire il bordo di una caratteristica dell'immagine e selezionare i pixel fino al bordo con buona precisione. Dopo che il lavoro sui bordi è completato, usa il metodo seleziona area entro il mouse per selezionare il resto. Il trascinamento con il tasto destro agisce come una deselezione: i pixel all'interno del cerchio del mouse e i pixel corrispondenti entro l'intervallo di ricerca vengono deselezionati. Se una selezione va troppo oltre, spesso è più facile correggerla deselezionando dall'esterno dell'area selezionata invece di selezionare dall'interno. Potrebbe servirti un po' di pratica per acquisire familiarità con questo e riuscire a lavorare in modo efficiente. - ^Seleziona tutti i colori entro il mouse - riepilogo • trascinamento sinistro - seleziona i pixel nel mouse e i pixel corrispondenti nell'intervallo • clic destro - annulla la selezione precedente, ripeti per deselezionare di più • trascinamento destro - deseleziona i pixel nel mouse e i pixel corrispondenti nell'intervallo - ^Avanzamento del bordo Un'area che è stata terminata (vedi sotto) può essere espansa o contratta in passi di 1 pixel. Questo può essere utile per ridurre gli effetti di bordo quando un'area selezionata per corrispondenza di colore viene modificata in un modo che ne cambia la luminosità. La selezione per colore può lasciare una stretta banda di pixel sotto-selezionati o sovra-selezionati lungo un bordo dove il colore della caratteristica transita verso lo sfondo. Espandere o contrarre l'area di 1-2 pixel può produrre un bordo dall'aspetto più pulito. L'area rimane terminata (vedi sotto) dopo l'avanzamento. - ^Colore del contorno dell'area Il colore usato per il cerchio di selezione del mouse e il contorno dell'area può essere cambiato in qualsiasi momento cliccando su uno dei pulsanti colore. Questo permette una buona visibilità rispetto a vari colori dell'immagine. - ^Mostra/Nascondi Usa [Nascondi] per nascondere i contorni dell'area. Questo è utile per vedere meglio gli effetti delle modifiche all'area senza interferenze dal contorno dell'area. Usa [Mostra] per mostrare i contorni e riprendere a modificare l'area. - ^Termina +image: select-area-finish.png - Un'area non è efficace per le modifiche finché non viene terminata con successo. Termina convalida i contorni disegnati e colora i pixel racchiusi per la verifica visiva. Quando hai finito di delineare le aree, usa il pulsante [Termina] per completare il processo. Il dialogo popup mostrato sopra riassume due metodi che puoi usare per terminare. - Metodo 1: clicca con il tasto sinistro del mouse all'interno delle aree che sono state delineate a mano. Le aree racchiuse vengono colorate temporaneamente in modo da poter verificare che il risultato finale sia quello previsto. Qualsiasi area racchiusa può essere selezionata, anche quelle non esplicitamente delineate: se hai una ciambella con un buco, puoi selezionare la ciambella, il buco, o entrambi. Premi [keep] quando tutte le aree sono state cliccate e colorate correttamente. Se il contorno di un'area disegnata a mano ha un'interruzione, il processo di colorazione "fuoriuscirà" e verranno colorate le aree al di fuori del racchiudimento. In questo caso, premi [Annulla] nel dialogo Termina, che ripristina il contorno dell'area originale. Trova l'interruzione nel contorno e chiudila, poi prova di nuovo [Termina]. Un'interruzione di 1 pixel in un'area grande può essere difficile da trovare. Ingrandisci per vedere meglio. Vedi la funzione {TROVA INTERRUZIONE AREA} sotto per un metodo veloce per trovare piccole interruzioni. - Metodo 2: clicca con il tasto destro da qualche parte al di fuori di tutte le aree racchiuse. Tutte le aree racchiuse verranno colorate per la verifica visiva. Se c'è un'interruzione, i risultati e la correzione sono gli stessi descritti nel metodo 1. Questo metodo ha senso se hai molte aree delineate a mano e non vuoi controllarle una alla volta usando il metodo 1. - Le aree selezionate usando i metodi 'seleziona entro il mouse' vengono terminate automaticamente. Queste aree vengono mappate durante il processo di selezione, mentre le aree selezionate con rettangolo, ellisse, o uno dei metodi di disegno linea vengono mappate solo quando ci clicchi dentro. Se usi solo i metodi 'seleziona nel mouse', puoi premere [keep] senza cliccare su nessuna delle aree selezionate. - Se disegni una linea da un lato dell'immagine all'altro, puoi cliccare su entrambi i lati della linea per creare un'area di tutti i pixel su quel lato della linea. Esempio: disegna una linea orizzontale sul confine tra cielo e terra. Clicca sopra la linea per selezionare il cielo, sotto la linea per selezionare la terra. Le linee disegnate devono raggiungere completamente i bordi dell'immagine. - ^Cancella Scarta permanentemente l'area corrente. - - TOPIC: TROVA INTERRUZIONE AREA Se un contorno di area è stato creato disegnando a mano libera usando più tratti, è facile lasciare piccole interruzioni nel contorno che non sono visibili sotto uno zoom 4x. Un tentativo di terminare tale area fallirà perché la mappatura dei pixel interni fuoriuscirà attraverso l'interruzione e coprirà aree al di fuori dell'area prevista. Se la funzione Termina fallisce, questa funzione può trovare l'interruzione. Clicca da qualche parte sul contorno dell'area fallita. Il contorno verrà ridisegnato lentamente in una direzione dalla posizione cliccata, finché non viene trovato un "pixel finale". Questo è dove si trova l'interruzione. Il contorno viene poi disegnato nella direzione opposta finché non si incontra l'interruzione (o un'altra). L'interruzione è dove si è fermato il disegno. Ingrandisci sull'interruzione e chiudila usando il disegno a mano libera, poi prova di nuovo per vedere se il contorno completo può essere disegnato senza fermarsi. Questa funzione può essere usata in parallelo con la funzione Seleziona Area - entrambi i dialoghi possono essere attivi. - - TOPIC: SFUMATURA AREA +image: area-blend.jpg - Sono presenti due funzioni in questo strumento: Fusione Area e Fusione Bordo Area. Entrambe le funzioni possono gradualmente 'annullare' una modifica fatta all'interno di un'area selezionata, mescolando una modifica precedente o l'immagine originale. Nell'esempio sopra, i quattro uomini sullo sfondo sono stati schiariti senza alcuna evidenza di un confine tra i pixel schiariti e quelli invariati. - ^Fusione Area Qualsiasi parte di un'area selezionata modificata può essere fusa con l'immagine originale. Usa trascinamenti con il tasto sinistro del mouse sulle regioni da fondere. Ogni trascinamento del mouse all'interno dell'area fonderà gradualmente l'immagine precedente selezionata, riducendo o rimuovendo efficacemente la modifica fatta all'interno dell'area. La velocità di fusione è determinata dal 'tasso di fusione', che può essere impostato separatamente per il centro e il bordo del cerchio del mouse. Imposta il raggio del mouse e i tassi di fusione (es. 50/0 per centro/bordo del mouse). Trascina il mouse sulle regioni dell'area da fondere. Usa il trascinamento con il tasto sinistro per fondere, il trascinamento con il tasto destro per annullare la fusione o ripristinare. Puoi usare questo metodo per fondere selettivamente i bordi dell'area: usa un raggio piccolo e trascina il centro del mouse sui bordi da fondere. Questo risulterà in una fusione graduale dal bordo verso l'interno. - ^Fusione Bordo Area A volte un'area modificata avrà bordi dall'aspetto innaturale, a causa di un confine netto tra l'area modificata e l'immagine circostante (specialmente se l'area è stata schiarita). Questo può essere efficacemente reso invisibile fondendo gradualmente la modifica dell'area per una striscia lungo i bordi. La modifica dell'area può essere rimossa al 100% dal bordo dell'area, diminuendo fino allo 0% verso l'interno per la larghezza della striscia. Ci sono due modi per fondere i bordi dell'area, 'fusione' e 'sfocatura'. Fusione mescola la striscia del bordo con la modifica precedente scelta o l'immagine originale. Sfocatura mescola la striscia con i pixel vicini dall'esterno della striscia. Imposta la larghezza della fusione con l'input 'larghezza fusione' o 'larghezza sfocatura'. - Il bordo dell'area 'Fusione' e 'Sfocatura' richiedono un calcolo della distanza dal bordo: la distanza da ogni pixel dell'area al bordo dell'area più vicino. Questa distanza viene usata per calcolare la fusione relativa per il pixel: 100% sul bordo dell'area e 0% per i pixel oltre la 'larghezza fusione' dal bordo. Per un'area grande con un bordo complesso, questo può richiedere del tempo. Un indicatore di avanzamento viene mostrato nel pannello superiore. - - TOPIC: MOSTRA/NASCONDI AREA Mostra o nascondi il contorno dell'area corrente. Nascondere l'area è utile quando l'area viene modificata con una funzione di modifica. Questo rende più facile giudicare gli effetti della modifica. Questi sono disponibili anche come pulsanti nel dialogo Seleziona Area. - - TOPIC: ABILITA/DISABILITA AREA Disabilita l'area corrente e mantieni i dati in modo che possa essere riattivata più tardi (menu Abilita). Questo ti permette di alternare le modifiche all'interno di un'area selezionata e le modifiche per l'intera immagine. - - TOPIC: INVERTI AREA Inverti un'area esistente: viene selezionata l'intera immagine eccetto l'area esistente. Usando la funzione due volte si ottiene di nuovo l'area selezionata originale. Invertire un'area selezionata invalida il calcolo del bordo, che deve essere ripetuto se si desidera la fusione del bordo dell'area. - - TOPIC: CANCELLA AREA Scarta permanentemente l'area corrente. Questo è disponibile anche come pulsante nel dialogo Seleziona Area. - - TOPIC: COPIA/INCOLLA AREA Un'area selezionata può essere salvata in un file cache usando il menu Aree > Copia. Questa area può essere incollata nella stessa immagine o in un'altra usando Aree > Incolla. Clicca e trascina per posizionare l'area incollata. I controlli del dialogo possono essere usati per ridimensionare e ruotare l'area incollata. - - TOPIC: CARICA/SALVA AREA Un'area selezionata può essere salvata in un file usando il menu Aree > Salva. Ti viene chiesto di fornire un nome file. Viene creato un file PNG. Il file PNG ha un canale alfa per le informazioni di trasparenza. L'immagine è un rettangolo che racchiude l'area selezionata. I pixel selezionati sono opachi, e gli altri sono trasparenti. - Questi file risiedono per default in /saved_areas, ma puoi salvarli ovunque. Usa il menu Aree > Carica per caricare un'area salvata da un file e incollarla nel file immagine corrente. L'immagine di sfondo apparirà attraverso le parti trasparenti dell'area incollata. Clicca e trascina per posizionare l'area. I controlli del dialogo possono essere usati per ridimensionare e ruotare l'area incollata. - - TOPIC: PULSANTE ANNULLA/RIPRISTINA Se una funzione di modifica è attiva e l'immagine è stata cambiata: • il clic sinistro del mouse annullerà la modifica corrente • il clic destro del mouse ripeterà la modifica Questo ti permette di confrontare rapidamente le immagini "prima" e "dopo" per la funzione di modifica corrente. - Se NESSUNA funzione di modifica è attiva, ma sono state fatte alcune modifiche all'immagine corrente: • il clic sinistro del mouse annullerà un passaggio di modifica per clic • il clic destro del mouse ripeterà un passaggio di modifica per clic • il clic centrale del mouse apre un elenco popup di tutti i passaggi di modifica. Puoi tornare a qualsiasi passaggio di modifica o all'immagine originale - Se apri un altro file, i passaggi di modifica salvati per il file corrente vengono scartati. - - TOPIC: MENU MODIFICA - - TOPIC: RUOTA Per livellare un'immagine inclinata, usa il mouse per trascinare il lato destro o sinistro dell'immagine su o giù finché l'immagine non appare livellata. Un clic sinistro sull'immagine aggiungerà linee guida verticali e orizzontali per aiutare a livellare l'immagine. Usa il clic destro per rimuoverle. - Il pulsante [Livello automatico] può livellare automaticamente l'immagine se la fotocamera ha registrato l'"angolo di rollio" nei metadata EXIF. Il pulsante [Auto Upright] può raddrizzare automaticamente un'immagine fatta con la fotocamera ruotata di 90º, se l'"orientamento" è presente nei metadata EXIF. - - TOPIC: RADDRIZZAMENTO Questa è una correzione a 1 pulsante per un'immagine ruotata di 90/180 gradi o invertita (specchiata). Non c'è perdita di risoluzione poiché i pixel vengono copiati 1:1 nel nuovo layout dell'immagine. Vedi anche la funzione {RADDRIZZAMENTO BATCH}. - - TOPIC: RITAGLIA +image: crop-image.jpg +image: crop-buttons.jpg - Taglia via le aree indesiderate dai bordi dell'immagine. Quando il dialogo si apre, un rettangolo di selezione viene posizionato sopra l'immagine. Le aree al di fuori di questo rettangolo vengono scurite e rappresentano le parti dell'immagine che verranno rimosse. Trascina un qualsiasi lato o angolo del rettangolo per spostare quel lato o angolo. La finestra di dialogo mostra il rapporto larghezza/altezza corrente del rettangolo di selezione. Se "Blocca" è selezionato, allora spostare un lato o angolo causerà lo spostamento di un altro lato o angolo, in modo che il rapporto larghezza/altezza fisso venga mantenuto. Trascina dal centro (contrassegnato da un piccolo cerchio) per spostare l'intero rettangolo senza cambiare le dimensioni. Usa i pulsanti a incremento larghezza e altezza per regolare direttamente le dimensioni in pixel dell'immagine. oppure inserisci i valori desiderati. Il rettangolo di selezione si adeguerà a questi valori. - Usa i tasti freccia della tastiera per spostare il rettangolo di selezione in passi di 1 pixel. L'ultimo lato o angolo spostato con il mouse è quello che viene spostato con i tasti freccia. - Il pulsante [Max] ripristina il rettangolo di ritaglio alla dimensione completa dell'immagine. Se una modifica precedente (Ruota, Deforma ...) ha lasciato margini trasparenti intorno all'immagine, il rettangolo di ritaglio rifletterà la dimensione massima che si adatta entro questi margini. - Il pulsante [Prec] recupera un elenco dei valori di larghezza e altezza usati in precedenza. Seleziona dall'elenco per usarne uno. - I cinque pulsanti rapporto ti permettono di scegliere un rapporto larghezza/altezza preimpostato. Il pulsante [invert] inverte il rapporto larghezza/altezza corrente. - Puoi cambiare i pulsanti rapporto con il pulsante [customize], che avvia un nuovo dialogo mostrato a destra. Clicca su un pulsante per modificarlo. Inserisci il rapporto larghezza/altezza desiderato usando il formato "ll:aa" come nell'esempio mostrato. - - TOPIC: RITOCCA +image: retouch.png - Regola la luminosità e il colore dell'immagine. • livello nero automatico - imposta il punto nero usando la % dei pixel più scuri • bilanciamento bianco automatico - imposta il punto bianco usando la % dei pixel più chiari • clicca punto grigio per bilanciamento del bianco - clicca un punto grigio sull'immagine • clicca punto scuro per livello nero - clicca un punto scuro sull'immagine • clicca per grafico popup degli istogrammi RGB • luminosità - sposta la curva 'tutti' su o giù (tutti i colori cambiano) • contrasto - cambia la pendenza della curva 'tutti' • saturazione colore - bianco/nero <--> colori intensi • temperatura colore - bilanciamento illuminazione (caldo <--> freddo) - Dopo aver fatto le regolazioni iniziali usando i cursori, puoi affinare luminosità e contrasto modificando le curve con il mouse per cambiare quali parti dell'immagine cambiano di più o di meno. La curva TUTTI regola tutti i colori, e le 3 curve RGB regolano i singoli colori. Usa prima TUTTI, poi apporta revisioni usando RGB. - ^Pulsanti Reset - riporta tutti i controlli a una posizione neutra - anche l'immagine viene ripristinata Prec - imposta tutti i controlli ai valori usati per l'immagine precedente Fatto - termina la modifica, chiudi il dialogo, salva le impostazioni dei controlli Annulla - annulla la modifica, ripristina l'immagine, chiudi il dialogo - Usa il pulsante [Prec] quando elabori più immagini che necessitano di regolazioni simili. - - TOPIC: RIDIMENSIONA +image: rescale.png - Questa funzione ridimensiona l'immagine a una nuova larghezza e altezza in pixel. Puoi inserire direttamente le nuove dimensioni o scegliere una variazione percentuale. Sono presenti pulsanti per impostare la nuova dimensione a un semplice rapporto della dimensione originale. Usarne uno minimizzerà la perdita di risoluzione. Il pulsante [Precedente] richiama la dimensione precedente, una comodità se più immagini vengono impostate alla stessa dimensione. Se la casella blocca rapporto è selezionata, il rapporto larghezza/altezza corrente verrà preservato se la larghezza o l'altezza vengono cambiate. - - TOPIC: SCHERMO DIVISO +image: split-screen1.jpg +image: split-screen2.png - Durante una funzione di modifica, visualizza le immagini prima e dopo usando il metodo schermo diviso. Trascina la linea di confine con il mouse. Quando esci da Schermo Diviso, puoi continuare normalmente la funzione di modifica. - Se nessuna funzione di modifica è attiva, scegli due immagini da mostrare usando lo schermo diviso. Devono avere le stesse dimensioni in pixel. - - TOPIC: MOSTRA DIFFERENZE Durante una funzione di modifica, evidenzia le modifiche scurendo le aree invariate. Usa il cursore per regolare l'oscurità delle aree invariate. Quando esci da Mostra Differenze, puoi continuare normalmente la funzione di modifica. - Se nessuna funzione di modifica è attiva, scegli due immagini per evidenziare le loro differenze. Devono avere la stessa dimensione in pixel. - - TOPIC: MARGINI +image: margins.png - Usa questa funzione per aggiungere margini intorno a un'immagine. Puoi usare qualsiasi colore e impostazione alfa (trasparenza) per i margini. Imposta ogni margine separatamente, oppure usa i controlli 'Tutti±1' e 'Tutti±10' per regolare tutti i margini su o giù della stessa quantità, 1 o 10 pixel. Usa la rotellina del mouse o i tasti freccia su/giù per la velocità. - Puoi usare questa funzione per aggiungere margini intorno alle immagini che intendi deformare, per evitare che alcune aree escano dai bordi. - - TOPIC: MARKUP +image: markup.jpg - Questo è un menu contenente le funzioni di annotazione dell'immagine: disegna testo, disegna linea/freccia, disegna rettangolo, disegna ovale Tutte queste funzioni hanno un pulsante [commit] che conferma la modifica corrente e ti permette di iniziarne una nuova (nuovo testo/linea/rettangolo/ovale) all'interno dello stesso dialogo di modifica. - ^Disegna Testo Questa funzione disegna testo direttamente sull'immagine. Inserisci il testo nel dialogo. Si possono usare più righe. Dopo aver inserito il testo, clicca con il tasto sinistro del mouse dove vuoi il testo sull'immagine. Trascina per spostare il testo altrove. Clicca con il tasto destro per rimuovere il testo. Usa il pulsante [Font] per selezionare un carattere diverso. Usa il controllo [Dimensione] per aumentare o diminuire la dimensione del testo. Usa il controllo [Angolo] per cambiare l'angolo di inclinazione del testo. Gli altri controlli ti permettono di fornire un colore di sfondo intorno al testo, un colore di contorno del testo, e un effetto ombra. Puoi selezionare il colore e la trasparenza per tutti questi. Il controllo larghezza regola la larghezza dei contorni e delle ombre. Il controllo angolo ombra imposta l'angolo dell'ombra. Usa i controlli rilievo per dare al testo un aspetto 3D. - Puoi inizializzare il testo da qualsiasi metadata disponibile nel file immagine. Inserisci il tag di metadata (es. "commenti utente") e premi [Recupera]. Puoi abbreviare i nomi dei tag, es. "usercomments" invece di "User Comments". - I pulsanti [Apri] e [Salva] avviano un dialogo di selezione file con cui puoi caricare o salvare tutti i dati testuali da o verso un file. Tutti gli elementi nel dialogo vengono caricati o salvati, quindi puoi mantenere una raccolta di stringhe di testo e impostazioni usate di frequente. - I pulsanti in basso funzionano come segue: • Cancella - svuota i campi testo e metadata • Sostituisci - l'immagine con il testo aggiunto sostituisce l'immagine corrente • +Versione - l'immagine con il testo aggiunto viene salvata come nuova versione • Successivo - apri il file successivo, metti lo stesso testo nella stessa posizione • Applica - conferma la modifica corrente e ripristina per un nuovo inserimento di testo • Fatto - completa la modifica corrente - l'immagine è pronta per essere salvata • Annulla - abbandona la modifica corrente - Per aggiungere lo stesso testo a una serie di immagini: prepara e posiziona il testo, premi [Sostituisci] o [+Version], poi [Successivo], poi [Sostituisci] o [+Version], poi [Successivo] ... - Crea una filigrana: usa una trasparenza del testo del 70% o più e una trasparenza dello sfondo del 100%. Il testo dovrebbe essere leggibile debolmente. Usa i controlli rilievo per far apparire il testo come incassato nell'immagine. - ^Disegna Linea Questa funzione disegna linee o frecce direttamente sull'immagine. Inserisci una lunghezza e larghezza della linea nel dialogo, e seleziona una punta a freccia se lo desideri. Clicca con il tasto sinistro del mouse dove vuoi posizionarla sull'immagine. Trascina le estremità della linea/freccia per posizionarla sull'immagine. Clicca con il tasto destro per rimuoverla. Trascina dal centro della linea per spostarla senza cambiare l'angolo o la lunghezza. I controlli del dialogo ti permettono di fornire un colore di sfondo, un colore di contorno, e un effetto ombra. Puoi selezionare il colore e la trasparenza per tutti questi. Il controllo larghezza regola la larghezza dei contorni e delle ombre. Il controllo angolo ombra imposta l'angolo di inclinazione dell'ombra. Per mantenere una linea disegnata e iniziarne un'altra, premi [applica]. - ^Disegna Rettangolo Scegli un colore e una larghezza per il contorno del rettangolo. Posiziona il cursore nella posizione in cui vuoi un angolo del rettangolo, e trascina per aprire il rettangolo nella direzione desiderata. Per sostituire il rettangolo, trascina di nuovo. Per spostare il rettangolo, tieni premuto il tasto shift e trascina il rettangolo dal centro. Per spostare uno dei bordi, tieni premuto il tasto shift e trascina il bordo. Per mantenere un rettangolo disegnato e iniziarne un altro, premi [applica]. - ^Disegna Ovale Scegli la casella ovale (ellisse) o cerchio. Scegli un colore e una larghezza per il contorno. Posiziona il cursore al centro desiderato. Trascina per disegnare l'ovale/cerchio. L'angolo del trascinamento determina la forma dell'ovale, da cerchio a ellisse estrema, larga o alta. Per sostituire l'ovale/cerchio, trascina di nuovo. Per spostare l'ovale/cerchio, tieni premuto il tasto shift e trascina dal centro. Per cambiare la dimensione o la forma, tieni premuto il tasto shift e trascina dal bordo in basso a destra. Per mantenere un ovale/cerchio disegnato e iniziarne un altro, premi [applica]. Per un ovale, puoi inserire un angolo 0-90 gradi per assi inclinati, come nell'esempio. - - TOPIC: MODALITÀ COLORE +image: color-mode.png +image: color-mode2.jpg - Usa questa funzione per creare un negativo bianco e nero o a colori, oppure convertire un'immagine negativa in un'immagine positiva, oppure convertire in colorazione seppia (per un effetto foto invecchiata). Il cursore può essere usato per applicare l'effetto in modo incrementale, dallo 0% al 100%. - - TOPIC: MODIFICHE PITTURA Usa questa funzione in combinazione con qualche altra funzione di modifica. Avvia una funzione di modifica e lascia i controlli in una posizione neutra. Poi avvia Dipingi Modifiche. Dipingi la funzione di modifica dove desiderato usando il mouse. Vedi {MOUSE PAINTING} per come applicare modifiche localmente usando il mouse. - Questo metodo per "dipingere" modifiche in modo incrementale può migliorare aree selezionate di un'immagine in modo rapido e semplice. Funziona con le seguenti funzioni di modifica: • Modifica > Ritocca, Modalità Colore • Ripara > Nitidezza, Sfoca, Riduci Rumore, Rimuovi Foschia, Regola RGB, Regola HSL • Perfeziona > Appiattisci Istogramma, Contrasto Locale, Amplifica Contrasto, Retinex Locale, Saturazione, Messa a Fuoco Morbida • Effetti > Contorni, Schizzo2, Rilievo, Trama, Aggiungi Bagliore, Imposta Colori, Sposta Colori, Kernel Personalizzato - - TOPIC: DIPINGI IMMAGINE +image: paint-image.jpg - Questa funzione dipinge sopra l'immagine con colori selezionati, usando il mouse. Vedi {MOUSE PAINTING} per come applicare modifiche localmente usando il mouse. - Il pulsante Colore Pittura mostra il colore corrente. Clicca questo pulsante per scegliere un colore usando il dialogo standard di selezione colore di Gnome. Puoi anche fare shift + clic sinistro sull'immagine per scegliere un colore dall'immagine. - Il pulsante tavolozza apre il dialogo mostrato al centro. Clicca sull'immagine per selezionare il colore in quella posizione. Il colore scelto si riflette nel pulsante colore del dialogo principale. L'immagine mostrata sopra è quella predefinita. Puoi usare qualsiasi immagine come sorgente colore. Premi il pulsante [sfoglia] e seleziona un'immagine dove hai salvato colori da richiamare. Questa scelta rimane in vigore finché non viene cambiata. - Il pulsante HSL apre un selettore di colore HSL mostrato a destra. Questo dialogo può rappresentare qualsiasi colore possibile. Sposta i cursori per ottenere il colore desiderato. Il colore scelto si riflette nel pulsante colore del dialogo principale. - Se è selezionato dipingi sopra le aree trasparenti, dipingere sopra le aree trasparenti ridurrà o eliminerà la trasparenza, a seconda dei controlli di opacità. Se questa opzione non è selezionata, vengono dipinte solo le aree opache dell'immagine. - ^Funzionamento con Tavoletta Wacom Con Dipingi Immagine, puoi usare una tavoletta Wacom invece di un mouse. Trascinare la penna a contatto con la superficie della tavoletta dipingerà come descritto sopra. Se uno dei pulsanti della penna viene tenuto premuto durante il trascinamento, l'operazione sarà cancellazione invece di pittura. Puoi anche impostare la modalità pittura o cancellazione usando i pulsanti radio nel dialogo. Tenere premuto un pulsante della penna è scomodo, ed è per questo che ci sono i pulsanti radio. Aggiungere pressione alla penna aumenterà l'opacità, quindi puoi fare tratti più chiari e più scuri senza regolare i controlli di opacità. - - TOPIC: DIPINGI TRASPARENZA +image: paint-transp.png +image: paint-transp2.jpg - Dipingi aree trasparenti o semi-trasparenti su un'immagine. Vedi {MOUSE PAINTING} per come applicare modifiche localmente usando il mouse. - - TOPIC: RIEMPIMENTO AREA Riempi tutte le aree selezionate o tutte le aree trasparenti con un colore di sovrapposizione scelto. Se un'area è parzialmente trasparente, il colore di sovrapposizione sostituirà la frazione trasparente dell'immagine. Il cursore 'Fusione' può essere usato per selezionare qualsiasi mix dell'immagine originale e del colore di sovrapposizione. - - TOPIC: COPIA IN IMMAGINE Dipingi sopra le aree dell'immagine copiando da un'altra parte della stessa immagine. Questo metodo può essere usato per duplicare oggetti all'interno di un'immagine, o eliminare un oggetto indesiderato sostituendolo con lo sfondo preso da un'altra parte. Clicca con il tasto sinistro sull'immagine per selezionare una posizione sorgente, poi clicca con il tasto destro per selezionare la destinazione corrispondente. Vedi {MOUSE PAINTING} per come applicare modifiche localmente usando il mouse. - Se è selezionato dipingi sopra le aree trasparenti, dipingere sopra le aree trasparenti ridurrà o eliminerà la trasparenza. Se questa opzione non è selezionata, vengono dipinte solo le aree opache dell'immagine. - - TOPIC: COPIA DA IMMAGINE Dipingi sopra le aree dell'immagine copiando da un'altra immagine. L'immagine di destinazione viene "dipinta" trascinando il mouse sull'area da modificare. Una posizione precedentemente selezionata nell'immagine sorgente viene copiata sull'immagine di destinazione. Sia l'area copiata sia l'area dipinta sono racchiuse in cerchi che si muovono con il mouse. Nell'esempio sopra, la barca nell'immagine di destra è stata copiata nell'immagine di sinistra. - Inizia aprendo l'immagine di destinazione. Seleziona il menu 'Copia da Immagine'. Viene avviata una 2ª sessione di Fotocx che mostra la stessa immagine. In questa 2ª sessione, naviga verso l'immagine sorgente e aprila. Disponi le due finestre in modo da poterle tenere entrambe in vista (almeno le aree da copiare). Shift + clic sinistro sull'immagine sorgente per stabilire una posizione sorgente. Shift + clic sinistro sull'immagine di destinazione nella posizione di destinazione. - Trascina con il tasto sinistro il mouse sull'area dell'immagine di destinazione. I pixel dall'immagine sorgente vengono copiati sull'immagine di destinazione. Ingrandisci le immagini alla dimensione massima se è necessaria un'alta precisione per le posizioni di riferimento. La posizione di riferimento iniziale è (0,0) (angolo NW) per entrambe le immagini. Vedi {MOUSE PAINTING} per come applicare modifiche localmente usando il mouse. - Il valore di scala dell'immagine sorgente viene usato per scalare l'immagine sorgente all'immagine di destinazione. Inizia facendo una copia di prova per verificare la scala. Se troppo grande o troppo piccola, usa [undo all] per cancellare la prova, cambia il valore di scala, e riprova. - Se è selezionato dipingi sopra le aree trasparenti, dipingere sopra le aree trasparenti ridurrà o eliminerà la trasparenza, a seconda dei controlli di opacità del mouse. Se questa opzione non è selezionata, vengono dipinte solo le aree opache dell'immagine. - - TOPIC: COPIA MODIFICA PRECEDENTE L'immagine da un passaggio di modifica precedente può essere applicata all'immagine corrente localmente e gradualmente, "dipingendo" con il mouse. La modifica precedente deve essere una delle modifiche fatte all'immagine corrente mentre è ancora aperta - le modifiche non salvate vengono perse quando viene aperta una nuova immagine. Puoi applicare qualsiasi modifica precedente a qualsiasi area dell'immagine corrente in fase di modifica, finché l'immagine rimane aperta come immagine corrente. Seleziona una modifica precedente usando l'elenco a discesa che mostra tutti i passaggi di modifica precedenti fatti sull'immagine corrente, in sequenza, e identificati dalla funzione di modifica usata. Vedi {MOUSE PAINTING} per come applicare modifiche localmente usando il mouse. - - TOPIC: MENU RIPARA - - TOPIC: NITIDEZZA +image: sharpen.png - Questa funzione ha cinque metodi per aumentare la nitidezza di un'immagine sfocata, e un metodo per correggere la sfocatura da movimento della fotocamera o del soggetto durante l'esposizione. - Scegli il metodo, imposta i parametri, premi [applica] e attendi qualche secondo per vedere il risultato. Apporta modifiche e ripeti il processo finché non sei soddisfatto. Usa {SELEZIONA AREA} per operare su diverse parti di un'immagine con metodi e parametri diversi. - Per tutti i metodi, scegli un raggio piccolo per immagini leggermente sfocate e valori maggiori per immagini più scadenti. Quantità controlla l'intensità della modifica. Soglia sopprime le modifiche ai pixel a basso contrasto: un valore più alto riduce l'amplificazione delle irregolarità di basso livello (rumore dell'immagine, tonalità della pelle irregolari, ecc.). - Maschera di contrasto: un metodo classico presente nella maggior parte degli editor di immagini. Una descrizione tecnica può essere trovata con una ricerca su internet. Questo metodo può creare 'aloni' visibili intorno ai bordi ad alto contrasto. - Amplifica Contrasto: amplifica il contrasto esistente. L'efficacia è paragonabile alla maschera di contrasto, ma gli 'aloni' sono ridotti. - Kuwahara: piccoli vicinati intorno a ogni pixel vengono confrontati tra loro. Al pixel viene assegnato il colore medio del vicinato con la differenza minore. Questo forza i pixel su un bordo sfocato a corrispondere a un lato o all'altro del bordo. I bordi vengono resi molto nitidi. L'immagine può apparire "a blocchi" se viene usato un raggio grande. I dettagli sottili possono andare persi. - Diff mediana: la luminosità del pixel viene confrontata con la mediana dei pixel entro il raggio. La luminosità viene aumentata o diminuita per i pixel rispettivamente più chiari o più scuri della media del vicinato. L'efficacia è paragonabile alla maschera di contrasto, ma gli 'aloni' sono notevolmente ridotti. Questo è l'unico metodo che lavora su ciascun colore RGB separatamente. Può rendere nitida una transizione di colore anche se c'è poco cambiamento di luminosità. - Richardson-Lucy: l'immagine viene resa nitida usando il metodo di deconvoluzione Richardson-Lucy. Questo metodo può produrre i migliori risultati, ma è anche piuttosto lento. Per velocizzare le cose, inizia selezionando una piccola ma dettagliata area dell'immagine usando {SELEZIONA AREA}. Cerca il raggio e il numero di iterazioni ottimali usando questa piccola area. Poi usa le stesse impostazioni per l'immagine intera. Il rumore nell'immagine ostacolerà l'efficacia. In tal caso, usa {RIDUZIONE RUMORE} prima. - Un'immagine ingrandita esattamente 2x può essere resa nitida con Richardson-Lucy, usando un raggio di 2.0 e 4 o più iterazioni. I risultati sono notevolmente buoni. - ^Correggi Sfocatura da Movimento +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - Ottimizza manualmente immagini con leggera sfocatura da movimento della fotocamera o dell'oggetto. La sfocatura da un oggetto in movimento in un'immagine altrimenti nitida può essere elaborata usando {SELEZIONA AREA} per isolare l'oggetto. Si presume che la sfocatura sia lineare e a velocità costante. Gli input sono 'estensione sfocatura' in pixel e 'angolo sfocatura' in gradi. La stima iniziale dell'angolo può essere specificata con shift + trascinamento del mouse sull'immagine nella direzione della sfocatura (può essere uguale o opposta al movimento effettivo). Inserisci una stima dell'estensione della sfocatura usando Strumenti > Mostra RGB per misurare la larghezza della sfocatura lungo qualche bordo luminoso di una caratteristica dell'immagine. Regola gli input, premi [applica], e ispeziona l'immagine per trovare le impostazioni ottimali. Il tempo di risposta può essere lento per un'immagine grande. Puoi velocizzare il processo se usi {SELEZIONA AREA} per selezionare una piccola area sfocata per ottimizzare estensione e angolo, poi cancella l'area per elaborare l'intera immagine usando le stesse impostazioni. L'algoritmo può produrre rumore "a squillo" (ringing), che può essere soppresso usando l'input 'sopprimi ringing'. Funziona meglio lasciare il valore di soppressione basso per trovare l'estensione e l'angolo ottimali, e poi aggiungere soppressione secondo necessità per ridurre il ringing. Il metodo di deconvoluzione Richardson-Lucy viene usato in una dimensione. - ^Sfocatura da Movimento della Fotocamera Digitale Non tutte le foto sfocate hanno la sfocatura a velocità costante più adatta a questo metodo. L'immagine potrebbe essere una sovrapposizione di più esposizioni più brevi. L'intera immagine potrebbe non essere esposta nello stesso momento e avere la stessa sfocatura (otturatore meccanico o elettronico in movimento). Questo metodo potrebbe comunque produrre risultati migliori rispetto agli strumenti di nitidezza che lavorano in due dimensioni. Dovrebbe funzionare meglio su vecchie foto fatte con fotocamere a pellicola, dove la sfocatura da movimento è più vicina alla velocità costante. - - TOPIC: SFOCATURA +image: blur.jpg - Scegli un metodo con la corrispondente casella di controllo, inserisci i parametri richiesti, premi [applica]. Se {SELEZIONA AREA} è attivo, vengono interessate solo le aree selezionate. - ^Sfocatura Normale Mescola ogni pixel con i pixel circostanti entro il raggio. I pixel più vicini hanno un peso maggiore. Puoi impostare il raggio a 1 e premere [applica] ripetutamente per aumentare lentamente la sfocatura mentre monitori il risultato dell'immagine. - Puoi opzionalmente sfocare di quantità diverse nelle direzioni orizzontale e verticale se inserisci valori orizzontali e verticali separati. L'input [raggio] forzerà gli stessi valori per entrambi. - ^Sfocatura Radiale Mescola ogni pixel con i pixel lungo una linea da un centro scelto. Il raggio definisce un'area centrale che non viene sfocata. La lunghezza imposta l'intervallo della linea di sfocatura: da 0 a lunghezza, dal centro al bordo. Scegli il centro cliccando sull'immagine. - ^Sfocatura Direzionata Trascina una posizione sull'immagine usando il mouse. L'area intorno al mouse verrà sfocata in questa direzione. L'estensione determina la dimensione dell'area sfocata. L'intensità determina la forza della sfocatura. - ^Sfocatura Graduata Solo i pixel con meno contrasto del limite di contrasto dato vengono sfocati, e il raggio di sfocatura varia da 1 al valore dato per i pixel con un contrasto corrispondente che varia dal limite dato a zero. In breve: i pixel a basso contrasto vengono sfocati più dei pixel ad alto contrasto. Questo può essere usato per ammorbidire i toni della pelle senza sfocare i capelli o ridurre la brillantezza negli occhi. Portato all'estremo, produce un effetto "cartone animato". - ^Sfocatura dello Sfondo (Bokeh) Sfoca le aree dell'immagine di sfondo lasciando nitido il primo piano. Seleziona una o più aree che devono rimanere nitide {SELEZIONA AREA}. Dopo aver selezionato le aree in primo piano, inverti la selezione in modo che ora sia selezionato lo sfondo {INVERTI AREA}. Questa è l'area che verrà sfocata. Sono disponibili due metodi di sfocatura: Sfocatura costante: viene usato un raggio di sfocatura costante per tutte le aree sfocate. Aumenta sfocatura con la distanza: usa il raggio di sfocatura minimo per i pixel adiacenti al primo piano e il raggio di sfocatura massimo per i pixel alla distanza massima dal primo piano. Questo richiede che venga calcolata la distanza dal bordo per tutti i pixel dello sfondo, il che può richiedere un tempo significativo. Il raggio di sfocatura può essere variato senza ricalcolare le distanze dal bordo. - - TOPIC: RIDUZIONE RUMORE +image: denoise.jpg - Riduci il rumore nelle foto scattate in condizioni di scarsa illuminazione (ISO alto), che fa apparire le superfici uniformi come chiazzate. Sono forniti due metodi, Mediana e Smorza. Il metodo migliore varia con il rumore e le caratteristiche dell'immagine. Mescolare i metodi (usarne uno e poi un altro) può essere utile. Il valore Raggio definisce il vicinato di pixel che verrà usato per confrontare e regolare un dato pixel. Un valore grande (Raggio > 2) ridurrà il rumore in modo più efficace ma può anche causare perdita di dettaglio. Il valore limite farà sì che i pixel con valori di luminosità RGB che differiscono dalla mediana del vicinato di più di questa quantità vengano ignorati. Questo è necessario per alcune immagini per evitare che minuscoli dettagli luminosi vengano trattati come rumore - es. foto astronomiche. - Imposta un valore Raggio e premi uno dei pulsanti metodo. Ogni iterazione usa l'immagine precedente come punto di partenza, quindi più iterazioni sopprimeranno gradualmente il rumore e potrebbero sfocare alcuni dettagli. Usa [reimposta] per ricominciare. Mediana con Raggio 1, seguita da Mediana con Raggio 2, è un buon compromesso tra soppressione del rumore e conservazione dei dettagli. - Il cursore Aree può essere usato per limitare l'elaborazione solo alle aree scure, o a una gamma più ampia di aree. Le aree scure tendono ad avere un problema di rumore più delle aree chiare. - Se vedi persistere alcune minuscole chiazze di rumore, aumenta il valore limite, usa il pulsante [reimposta], e continua con [mediana] o [morbido]. - Puoi applicare elaborazioni diverse in diverse aree dell'immagine - vedi {SELEZIONA AREA}, e puoi "dipingere" l'immagine usando elaborazioni diverse in diverse aree - vedi {MODIFICHE PITTURA}. - Ogni colore RGB viene elaborato indipendentemente. Non c'è elaborazione separata della crominanza o della luminosità. - Il pulsante [measure] avvia il dialogo sul lato destro per misurare il livello effettivo di rumore dell'immagine. Sposta il mouse sull'immagine per mostrare i livelli di rumore RGB all'interno del cerchio del mouse (raggio 10, circa 300 pixel). Deve essere un'area priva di dettagli in modo che il rumore sia l'unica variazione presente. Ispeziona l'immagine a dimensione 4X per essere sicuro di vedere rumore e non trama. I punti mostrano i valori RGB dei singoli pixel rispetto alla media dei circostanti 5x5 pixel, rappresentata dalla linea continua centrale. I numeri in basso mostrano la luminosità media RGB e i livelli di rumore sulla scala 0-255. La scala del grafico va da -10 a +10 e le linee tratteggiate sono a -5 e +5, rispetto a un intervallo totale di 0-255. Il rumore nel 9° o 10° bit RGB è 0.5 o 0.25 su questa scala. - ^Rumore immagine RAW Per misurare il rumore del sensore della fotocamera, usa un'immagine RAW. Le immagini JPEG vengono elaborate all'interno della fotocamera per ridurre il rumore. Potresti sorprenderti dei livelli di rumore tipicamente alti nelle immagini RAW. Anche fotocamere costose con sensori grandi possono avere meno di 8 bit di colore a basso rumore. Quando filtri il rumore da un'immagine RAW, stai competendo con l'elettronica e il software che producono il JPEG della fotocamera. Potrebbe essere una sfida fare di meglio. - - TOPIC: DEFOG +image: defog.png +image: defog2.jpg - Rimuovi la foschia/nebbia in un'immagine o area selezionata. Ci sono altri strumenti per questo (appiattisci istogramma, contrasto locale, amplifica contrasto, retinex, saturazione), ma la rimozione di foschia/nebbia è secondaria alla loro funzione principale. Questa funzione attacca direttamente la foschia/nebbia: rimuove quantità uguali di colore R/G/B (riducendo la luminosità e aumentando la saturazione), e opzionalmente riaggiunge la luminosità persa. Può anche ridurre il blu se questo diventa troppo dominante, come spesso accade con la foschia distante. Potresti aver bisogno di usare {SELEZIONA AREA} o {MODIFICHE PITTURA} per mirare e ottimizzare con precisione le aree desiderate. L'esempio sopra ha usato due aree, le colline in primo piano e la montagna sullo sfondo. - - TOPIC: OCCHI ROSSI +image: red-eyes1.png +image: red-eyes2.png - Riduci l'effetto occhi rossi dalle foto con flash. Sono forniti due metodi. Il primo è più veloce ma potrebbe non gestire casi difficili. Il secondo metodo è più robusto ma richiede anche più tempo e attenzione. Per usare la prima funzione, clicca con il tasto sinistro su un occhio rosso una o più volte finché non sei soddisfatto. Se l'area scurita è troppo piccola o decentrata, clicca con il tasto destro per annullare la modifica e poi clicca con il tasto sinistro più precisamente sul centro dell'occhio rosso. Se un occhio rosso non può essere corretto correttamente, clicca con il tasto destro per annullare la modifica e poi usa il secondo metodo. Il secondo metodo può gestire meglio i casi più difficili in cui l'occhio rosso è solo leggermente rosso e la differenza di colore con le palpebre è troppo piccola perché l'algoritmo automatico la distingua. Posiziona il cursore sul centro dell'occhio rosso. Tieni premuto il tasto sinistro del mouse e trascina il cursore verso il basso e verso destra. Apparirà un'ellisse tratteggiata che racchiude l'occhio rosso. Ripeti se necessario per ottenere l'occhio rosso centrato nell'ellisse (approssimativamente). Nota che la forma dell'ellisse dipende dalla direzione del trascinamento, il che può permettere un racchiudimento più preciso solo dell'occhio rosso. Clicca con il tasto sinistro all'interno dell'ellisse ripetutamente mentre osservi l'occhio rosso scurirsi, e fermati quando è abbastanza scuro. Se vai troppo oltre, le palpebre potrebbero iniziare a scurirsi. Clicca con il tasto destro per annullare e ripeti se necessario. - - TOPIC: CANCELLAZIONE INTELLIGENTE +image: smart-erase.png +image: smart-erase2.jpg - Cancella piccoli oggetti che possono rovinare una buona foto, come linee elettriche, rifiuti a terra, un cartello, ecc. L'oggetto indesiderato viene sostituito con pixel presi dall'area circostante. Questo a volte è molto efficace (effetti collaterali quasi invisibili), e a volte no. Funziona meglio per oggetti piccoli o stretti nella foto. Raggio controlla la dimensione di un cerchio intorno al puntatore del mouse, definendo l'area da selezionare e cancellare. Trascina il mouse per racchiudere l'oggetto da rimuovere. Il trascinamento sinistro seleziona e il trascinamento destro deseleziona. Premi [Cancella] per cancellare l'area selezionata, sostituendo i pixel con i pixel più vicini dall'esterno della selezione. Se la selezione non era abbastanza precisa, usa [Annulla], regola l'area selezionata, e [Cancella] di nuovo. Le selezioni e cancellazioni ripetute si accumuleranno finché non usi [New_Area] per iniziare una nuova selezione. Le aree precedentemente cancellate sono ora fisse e [Annulla] funzionerà solo per le selezioni successive. È meglio lavorare con un'immagine ingrandita al 200% o più. Il controllo Sfocatura aggiunge sfocatura ai pixel di sostituzione. Questo può ridurre gli effetti collaterali visibili, poiché i pixel di sostituzione potrebbero essere più nitidi dei circostanti. Cambia l'impostazione Sfocatura e ripeti il pulsante [Cancella]. I pulsanti [show] e [hide] possono essere usati per mostrare il contorno della selezione corrente o nasconderlo per giudicare meglio i risultati dopo la cancellazione. - Per oggetti lunghi e sottili (es. linee elettriche), puoi cliccare su due posizioni e tutto ciò che sta in mezzo verrà selezionato. La selezione funziona in linea retta, quindi per oggetti curvi dovrai cliccare a intervalli per seguire la curva. - - TOPIC: RIMUOVI ALONE +image: remove-halo.png +image: remove-halo2.png - Rimuovi gli aloni lasciati da alcune funzioni di modifica. Seleziona il tipo di alone: chiaro (più comune) o scuro. Trascina con il tasto sinistro il mouse sull'area dell'alone per alterare i pixel all'interno del mouse, come mostrato nell'esempio. Per un alone chiaro, i pixel più chiari si scureranno mentre il mouse viene trascinato su di essi. Per un alone scuro, i pixel più scuri si schiariranno. Usa un raggio del mouse più grande della larghezza dell'alone, come mostrato nell'esempio. Trascina con il tasto destro il mouse per ripristinare i pixel originali. - - TOPIC: ARTEFATTI JPEG +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - Le immagini JPEG che sono state altamente compresse (con un'impostazione di bassa qualità) possono mostrare artefatti di compressione sotto forma di piccoli blocchi rettangolari. Se alcune aree di una foto hanno avuto la loro gamma di luminosità espansa, tali blocchi potrebbero diventare più visibili perché i gradini di luminosità sono più grandi (es. valori RGB di 11/12/13 schiariti 5x a 55/60/65). Questa funzione sfoca i bordi tra i blocchi per renderli meno visibili. - 'Limite Corrispondenza' determina quando i pixel adiacenti vengono trattati come membri dello stesso blocco di pixel. Il Limite Corrispondenza può essere impostato a un valore più basso per ottenere tali blocchi mappati più completamente. 'Limite Contrasto' serve a prevenire la fusione dei bordi dove il contrasto è alto, causando perdita di dettaglio. Cambia le due impostazioni e premi [applica]. Visualizza l'immagine risultante a dimensione >2x e prova impostazioni diverse se l'ottimizzazione è importante. Questa funzione sarà meno efficace su un'immagine che è stata ridimensionata. Usa {SELEZIONA AREA} per elaborare selettivamente le aree problematiche. - - TOPIC: ANTIALIASING +image: anti-alias.jpg - A volte le foto mostrano pixelizzazione ('scalettatura') lungo alcuni bordi di caratteristiche ad alto contrasto. Nell'esempio sopra, puoi vederlo intorno all'occhio dell'uccello. Lo strumento anti-aliasing può ridurre questo. L'effetto è minore sulla maggior parte delle foto, dove l'elaborazione interna alla fotocamera potrebbe aver già risolto il problema. Un effetto secondario è che gli artefatti jpeg nelle immagini altamente compresse vengono in qualche modo attenuati. Le immagini che sono state ingrandite in dimensione avranno pixelizzazioni più evidenti. Queste possono essere aiutate, specialmente nel caso di un ingrandimento 2x. - Usa il pulsante [applica] per sopprimere i pixel, più volte se sembra utile. 'Soglia' può essere usata per escludere i pixel a basso contrasto dall'elaborazione. Un valore di 0.1 o meno è di solito il migliore. - Fotocx usa l'algoritmo Scale3x, modificato per usare toni di colore "simili" e "diversi" al posto di "uguali" e "non uguali". - - TOPIC: REGOLA RGB +image: adjust-RGB.png - Cambia la luminosità e il contrasto complessivi, o quelli dei colori selezionati. • Luminosità - aumenta o diminuisce la luminosità complessiva dell'immagine • +Rosso -Ciano ecc. - cambia la luminosità del colore e cambia il colore complementare nella direzione opposta • Contrasto Tutti - aumenta o diminuisce il contrasto complessivo dell'immagine • Contrasto Rosso Verde Blu - elabora i singoli colori RGB - - TOPIC: REGOLA HSL +image: adjust-HSL.png - Cambia una gamma selezionata di colori in un'immagine usando HSL (Tonalità, Saturazione, Luminosità). Questa funzione può essere usata per correggere una dominante di colore o cambiare un colore in un altro (es. un cielo sovraesposto - troppo bianco). Se non conosci il modello colore HSL, leggi l'articolo di Wikipedia a riguardo. - Inizia selezionando un colore target dell'immagine da abbinare e regolare, usando shift + clic sinistro sull'immagine. Questo colore sarà il centro di una gamma di colori che verrà selezionata per la regolazione. Seleziona quali attributi del colore verranno abbinati usando le caselle di controllo per tonalità, saturazione e luminosità. Ciascuno di questi restringerà la gamma di colori selezionati. Se nessuno è selezionato, vengono selezionati tutti i colori. Il Livello di Corrispondenza può essere usato per ampliare ulteriormente la gamma di colori selezionati. 100% significa che vengono selezionati solo i colori strettamente corrispondenti. - I controlli Colore Output (tonalità, saturazione, luminosità) vengono usati per impostare il nuovo colore di output che sostituirà o si fonderà con i colori di input selezionati. Puoi anche impostare questo colore dall'immagine, usando shift + clic destro. Il colore risultante sarà un mix del colore originale e del nuovo colore. La frazione del nuovo colore è impostata dal cursore Regolazione, che può essere impostato da 0 a 100%. Usa le caselle HSL per determinare quali componenti HSL del colore di input vengono sostituite con i componenti HSL corrispondenti del colore di output. Usa i cursori per l'HSL del colore di output per regolare il nuovo colore. Il colore di output è mostrato nel riquadro più piccolo a sinistra, che si aggiorna man mano che sposti i cursori. - Sposta i cursori e osserva gli aggiornamenti in tempo reale dell'immagine per ottimizzare il risultato. Questo non è molto intuitivo, e la pratica aiuterà. Suggerimento: inizia abbinando tonalità e saturazione, e sostituendo solo la tonalità - questo significa che saturazione e luminosità del colore di output verranno copiate dai colori dell'immagine originale, e verrà sostituita solo la tonalità. - - TOPIC: RIMUOVI POLVERE +image: remove-dust.png +image: remove-dust2.jpg - Le immagini fatte da diapositive scansionate polverose possono avere molte piccole macchie scure - ombre della polvere sulle diapositive. Le foto storiche da internet spesso hanno un problema simile. Questa funzione può rimuovere la maggior parte di tali macchie. Sposta i tre cursori finché il numero massimo di macchie di polvere non viene colorato di rosso, poi premi il pulsante [cancella] per cancellarle. Premi [red] per ripristinare la vista rossa, poi puoi regolare di nuovo i cursori e premere [cancella]. Il cursore "limite dimensione macchia" limita la dimensione delle macchie che verranno cancellate. Il cursore "luminosità max." imposta una soglia per ignorare le macchie che non sono abbastanza scure. Il cursore "contrasto min." filtra le macchie che hanno basso contrasto con i loro dintorni. Questo processo è di solito un compromesso. Se le impostazioni non sono ottimali, piccole caratteristiche come foglie di alberi possono essere cancellate, oppure grandi macchie possono rimanere al loro posto. Diverse parti dell'immagine potrebbero aver bisogno di impostazioni diverse, es. il cielo può essere trattato più aggressivamente di un muro di edificio. Puoi semplicemente usare Rimuovi Polvere più volte con impostazioni diverse secondo necessità per eliminare tutte le macchie di polvere. Oppure puoi usare {SELEZIONA AREA} per elaborare l'immagine in sezioni. Se alcune macchie sono persistenti, puoi trattarle manualmente con {CANCELLAZIONE INTELLIGENTE}. Imposta un piccolo raggio del mouse e clicca su ciascuna macchia per rimuoverla. Le macchie da fibre (lunghe e sottili) di solito non vengono rimosse automaticamente, ma Cancellazione Intelligente può essere efficace qui. Se la polvere è chiara, come nell'esempio sopra, usa {MODALITÀ COLORE} per fare un negativo colore, elabora la polvere, e poi ripeti negativo colore per ripristinare l'immagine normale. - - TOPIC: FRANGE +image: fringes.png +image: fringesA.jpg - Correggi le frange di colore periferiche (aberrazione cromatica laterale) - dove le frange di colore appaiono principalmente nelle aree esterne dell'immagine. - L'immagine a sinistra sopra è un ritaglio ingrandito dell'angolo in alto a sinistra di una foto con aberrazione cromatica laterale. Questa è stata per lo più eliminata nell'immagine elaborata a destra. Le frange di colore possono apparire lungo bordi ad alto contrasto, specialmente nelle aree esterne dell'immagine dove le distorsioni dell'obiettivo sono di solito maggiori. Per eliminarle, ingrandisci l'immagine alla dimensione massima e centra su un'area con frange di colore. Premi il pulsante [search]. I piani di colore rosso e blu vengono riscalati per allinearsi meglio con il piano verde, e i fattori usati vengono inseriti nella finestra di dialogo. Potresti essere in grado di migliorare il risultato rivedendo i fattori direttamente nel dialogo: cambia i fattori mentre osservi le frange di colore sull'immagine. - Questa funzione sarà meno efficace se l'immagine è stata ritagliata in modo che il centro dell'immagine non sia più lo stesso del centro della fotografia originale. - - TOPIC: MENU RAFFINA - - TOPIC: APPIATTISCI ISTOGRAMMA +image: flatten1.jpg +image: flatten2.jpg - Aumenta il dettaglio visibile nelle aree con scarso contrasto. La luminosità del pixel viene regolata su o giù per rendere più uniforme la distribuzione di luminosità (istogramma) per l'area intorno al pixel. Un raggio più piccolo (area più piccola) intensificherà l'effetto. Ci sono 5 zone di luminosità dalla più scura (1) alla più chiara (5). Sposta un cursore per aumentare l'effetto per la zona corrispondente. Usa il cursore zona A per spostare tutti e 5 i cursori insieme e impostare rapidamente un risultato iniziale. Poi usa gli altri cursori individualmente per affinare l'immagine. - - TOPIC: CONTRASTO LOCALE +image: localcon1.jpg +image: localcon2.jpg - Aumenta il contrasto in ogni area di un'immagine. La luminosità di ciascun pixel viene confrontata con la luminosità media dell'area circostante. La luminosità del pixel viene regolata per aumentare questa differenza. Questa funzione implementa un metodo classico ampiamente usato. Il raggio determina la dimensione dell'area intorno a ciascun pixel usata per la luminosità media. La potenza determina la quantità di cambiamento di luminosità. Il colore viene usato per aumentare la saturazione del colore. Puoi usare la curva modificabile per schiarire l'immagine di output per livelli di luminosità selezionati. L'esempio mostra lo schiarimento delle aree più scure dell'immagine. - Il Contrasto Locale può creare "aloni" in alcune circostanze: +image: localcon3.jpg - L'immagine originale è a sinistra. All'immagine centrale è stato applicato Contrasto Locale alla massima potenza. Si può vedere un alone lungo il confine tra le colline scure e il cielo più chiaro. Questo può essere corretto con un semplice trucco (immagine a destra). Seleziona separatamente le aree del cielo, usando {SELEZIONA AREA}. Applica Contrasto Locale a questa area. Inverti la selezione e applica Contrasto Locale al resto dell'immagine. - - TOPIC: AMPLIFICA CONTRASTO +image: amplify-contrast.png +image: amplify-contrast2.jpg - Aumenta la gamma di luminosità apparente di un'immagine aumentando il contrasto locale. Può aumentare le aree a basso contrasto senza cambiare le aree ad alto contrasto. Puoi anche usare la curva di modifica per variare l'amplificazione del contrasto in base alla quantità iniziale di contrasto. - Il cursore Amplifica sotto la curva regola il calcolo, dall'assenza di amplificazione del contrasto all'amplificazione completa. Se spostato troppo a destra, l'immagine potrebbe mostrare artefatti sgradevoli, quindi riportalo indietro finché non scompaiono. Se aree uniformi (es. il cielo) diventano chiazzate, tira verso il basso l'estremità sinistra della curva per ridurre l'amplificazione per le aree a basso contrasto. In alcuni casi sarà meglio selezionare aree diverse dell'immagine ed elaborarle separatamente, es. conservativo per il cielo, più aggressivo per superfici con trama come muri di pietra. - - TOPIC: RETINEX GLOBALE +image: global-retx.png +image: global-retx2.jpg - Migliora colore e contrasto per immagini con foschia/nebbia estrema o dominante di colore (es. una foto di 100 anni fa). Prova prima il pulsante [Auto]. L'immagine viene esaminata per trovare i colori RGB più chiari e più scuri presenti. I valori RGB più scuri vengono sottratti da tutti i pixel e i valori RGB risultanti vengono riscalati in modo che i valori RGB massimi siano vicini a 255. Ovviamente questo potrebbe non essere inizialmente ottimale. I pulsanti a incremento sono impostati sui limiti RGB scuro e chiaro trovati, e puoi cambiarli per ottimizzare l'immagine risultante. Puoi scegliere i tuoi punti scuro e chiaro selezionando l'opzione corrispondente nel dialogo e cliccando sull'immagine. I pulsanti a incremento del moltiplicatore sono impostati a 1.0 per default, e puoi cambiare questi valori per regolare la luminosità relativa di ciascun colore RGB. Nell'esempio sopra, la 1ª immagine è l'originale, la 2ª immagine è stata fatta usando il pulsante [Auto]. La colonna più a destra dei pulsanti a incremento regolerà tutti i pulsanti nella stessa riga insieme - usa la rotellina del mouse o i tasti freccia su/giù della tastiera. - Il cursore fusione viene usato per mescolare l'immagine di input e l'immagine retinex in qualsiasi rapporto. Il cursore riduci chiaro viene usato per attenuare l'effetto per le aree più chiare dell'immagine, specialmente il cielo, dove Retinex può produrre risultati dall'aspetto strano. - L'algoritmo è stato derivato da concetti pubblicati per la prima volta da Edwin Land negli anni '70. Cerca su internet 'retinex' per maggiori informazioni. - - TOPIC: RETINEX LOCALE +image: local-retx.png +image: local-retx2.jpg - Aumenta i dettagli visibili nelle aree scure dell'immagine e in altre aree con basso contrasto. La gamma di luminosità di una zona intorno a ciascun pixel viene usata per riscalare la luminosità del pixel come se l'intera zona fosse riscalata per coprire l'intera gamma di luminosità 0-255. Il Retinex Locale può produrre risultati drammatici dove il Retinex Globale è debole. - L'input raggio determina la dimensione approssimativa della zona intorno a ciascun pixel. Il cursore fusione viene usato per mescolare l'immagine di input e l'immagine retinex in qualsiasi rapporto. Il cursore riduci chiaro viene usato per attenuare l'effetto per le aree più chiare dell'immagine, specialmente il cielo, dove Retinex può produrre risultati strani. Il cursore riduci scuro fa lo stesso per le aree più scure dell'immagine. L'esempio sopra è circa 60% immagine originale + 40% retinex. - - TOPIC: SATURAZIONE +image: saturation.png - Regola la saturazione del colore in base alla luminosità del pixel. L'asse Y della curva di modifica è la saturazione del colore, da colore zero (tutti i valori RGB uguali) a colore massimo (il valore RGB più basso è zero). L'asse X della curva è la luminosità del pixel, da scuro a luminosità massima. La posizione neutra (nessun cambiamento di colore) è il valore intermedio, che è anche il valore iniziale. Esempio: per aumentare l'intensità del colore delle aree scure nell'immagine, alza l'estremità sinistra della curva. Il cursore Saturazione sposta l'intera curva su o giù senza cambiarne la forma. - - TOPIC: MESSA A FUOCO MORBIDA +image: soft-focus2.jpg +image: soft-focus.png - Applica il classico effetto "messa a fuoco morbida" a una foto. Questo è un mix di un'immagine nitida e un'immagine leggermente sfocata. L'impostazione raggio determina l'estensione della sfocatura (intervallo pixel), e l'impostazione mix imposta la porzione dell'immagine sfocata nell'immagine di output mescolata, da 0 a 100 percento. Puoi usare {MODIFICHE PITTURA} con questa funzione, per variare l'effetto per diverse aree dell'immagine. - - TOPIC: GRADAZIONE LUMINOSITÀ +image: brite-ramp1.png +image: brite-ramp2.png - Varia la luminosità o il colore attraverso un'immagine. Puoi usare questo per compensare un'illuminazione irregolare o una dominante di colore che varia attraverso l'immagine. La direzione del cambiamento è determinata disegnando una linea sull'immagine. Crea la linea cliccando sull'immagine, poi trascina un'estremità qualsiasi per impostare la direzione desiderata. Nell'esempio sopra, il verde è stato aumentato nella direzione della linea. Modifica prima la curva Tutti per regolare la luminosità complessiva (tutti i colori), poi regola le singole curve di colore RGB se necessario. - - TOPIC: VIGNETTATURA +image: vignette.png +image: vignette2.jpg - Correggi lo scurimento a volte visto negli angoli di una foto. Può anche essere usato per evidenziare o colorare un oggetto o area all'interno di un'immagine. - Clicca o trascina il mouse sull'immagine per cambiare il centro della vignettatura, che inizialmente è al centro dell'immagine. - Seleziona 'Luminosità' per cambiare la luminosità dell'immagine in un motivo radiale: regola l'estremità sinistra o destra della curva per cambiare rispettivamente la luminosità del centro e dei bordi dell'immagine. Puoi dare uno sfondo scuro al viso di un ritratto, oppure puoi correggere un'immagine con angoli scuriti. Il livello medio della curva corrisponde a nessun cambiamento. Usa valori più bassi per scurire e valori più alti per schiarire. L'esempio sopra scurisce gradualmente la periferia dell'immagine lasciando invariata un'ampia area centrale. - Seleziona 'Colore' per aggiungere un colore scelto all'immagine in un motivo radiale. I valori della curva pari a zero rappresentano nessun cambiamento, e valori più alti aggiungono il colore scelto all'immagine. Il valore più alto corrisponde al 100% del colore. Usa questa funzione per aggiungere un contorno colorato a un'immagine, es. circonda un viso con un colore che aumenta gradualmente. - - TOPIC: MENU EFFETTI - - TOPIC: CONTORNI +image: outlines1.png +image: outlines2.jpg - Trasforma una foto in un disegno a contorni. I pixel ad alto contrasto vengono intensificati e i pixel a basso contrasto vengono soppressi. L'impostazione soglia imposta le soglie di contrasto. Le linee sotto il minimo non vengono mostrate, e quelle superiori al massimo avranno la luminosità massima. La casella 'bianco/nero' converte le linee colorate in nero su bianco o bianco su nero, a seconda della casella 'negativo'. Usa 'Amplifica Basso' per schiarire le linee sbiadite se lo desideri. 'Modalità B' produce una luminosità delle linee più uniforme rispetto a 'Modalità A'. - - TOPIC: SCHIZZO1 +image: sketch1.jpg - Trasforma una foto in qualcosa di simile a uno schizzo. I pixel scuri vengono aggregati in meno pixel, lasciando le aree liberate più chiare. Il contrasto può anche essere usato come proxy per i pixel scuri. La soglia può essere usata per filtrare l'immagine di input in base alla luminosità. Il Livello di Clip viene usato per filtrare l'output per ridurre ulteriormente i pixel scuri isolati o marginali. Scegli i colori per primo piano e sfondo. Ridurre la dimensione dell'immagine di input può dare risultati interessanti. Se il risultato appare "sporco", usa {RIDUZIONE RUMORE} o {FUSIONE} per ammorbidire l'immagine prima di elaborarla qui. - - TOPIC: SCHIZZO2 +image: sketch2.png +image: sketch2b.jpg - Trasforma una foto in qualcosa di simile a uno schizzo. Usa un metodo diverso: i pixel a contrasto basso ... alto vengono convertiti rispettivamente in pixel chiari ... scuri. La curva può essere usata per aumentare o diminuire la forza della conversione del contrasto. La scala dell'asse x è il contrasto del pixel, da basso ad alto, e il valore y determina la forza della conversione. L'esempio mostra la soppressione dei pixel a basso contrasto (resi più chiari). L'immagine di input può essere fusa in qualsiasi rapporto. Se il risultato appare "sporco", usa {RIDUZIONE RUMORE} o {FUSIONE} per ammorbidire l'immagine prima di elaborarla qui. - - TOPIC: CARTONE ANIMATO +image: cartoon.jpg - Trasforma una foto in un disegno stile cartone animato. Vengono disegnate linee nere sopra i bordi delle caratteristiche nell'immagine, ovunque la luminosità o il colore cambino bruscamente. Soglia Linea imposta la sensibilità per il rilevamento dei bordi e il disegno delle linee, causando il disegno di più o meno linee. Larghezza Linea rende le linee più spesse o più sottili. Profondità Kuwahara controlla una funzione di nitidezza che può rafforzare i bordi delle caratteristiche all'interno dell'immagine. - - TOPIC: RILIEVO +image: emboss2.jpg +image: emboss.png - Trasforma un'immagine in un rilievo simulato o immagine in rilievo (un effetto 3D). I bordi delle caratteristiche vengono resi più chiari su un lato e più scuri sul lato opposto, come se fossero sollevati e illuminati lateralmente. L'impostazione raggio determina la larghezza dell'effetto, e l'impostazione profondità determina l'intensità. L'impostazione Fonte Luce determina l'angolo da cui proviene l'illuminazione apparente. Questo può essere variato per massimizzare l'effetto per i bordi delle caratteristiche più perpendicolari a questo angolo. - - TOPIC: TESSERE1 Trasforma un'immagine in una matrice di tessere monocolore. Puoi controllare la dimensione delle tessere e lo spessore dello spazio tra le tessere. Questo è anche chiamato 'pixelizzazione'. Usa Seleziona Area per confinare la trasformazione a un'area limitata, es. un viso. - - TOPIC: TESSERE2 +image: tiles2a.png +image: tiles2b.png - Trasforma un'immagine in tessere irregolari che si conformano approssimativamente ai colori e ai contorni dell'immagine. ^dimensione base:^ La dimensione base della tessera, che è l'unità di dimensione tessera usata per fare tessere più grandi. ^profondità colore:^ Numero di colori da usare: 1 = 8 colori, 2 = 64 colori ... 8 = 16 milioni di colori. ^obiettivo area tessera^: Il limite superiore della dimensione della tessera (area in pixel). ^corrispondenza colore richiesta^: Imposta la corrispondenza minima di colore richiesta affinché un'area più piccola venga consolidata in un'area adiacente più grande: 0 = non importa (massimo consolidamento), 100 = richiesta corrispondenza perfetta (minimo consolidamento). - - TOPIC: PITTURA +image: painting1.png +image: painting2.png - Trasforma un'immagine in qualcosa di simile a un dipinto. Riduce il numero di colori, mappa ogni area di pixel contigui con lo stesso colore, e poi consolida le aree più piccole in aree adiacenti più grandi con la migliore corrispondenza di colore. - ^raggio sfocatura^: Sfoca l'immagine prima dell'elaborazione. Questo produce confini più morbidi. ^profondità colore^: Numero di colori da usare: 1 = 8 colori, 2 = 64 colori ... 8 = 16 milioni di colori. ^obiettivo area patch^: Imposta un limite inferiore per le aree che avranno il proprio colore: le aree più piccole di questo numero di pixel verranno assorbite in un'area adiacente con la corrispondenza di colore più vicina. ^corrispondenza colore richiesta^: Imposta la corrispondenza minima di colore richiesta affinché un'area più piccola venga consolidata in un'area adiacente più grande: 0 = non importa (massimo consolidamento), 100 = richiesta corrispondenza perfetta (minimo consolidamento). ^bordi^: Determina se le aree colorate verranno delineate con un sottile bordo nero, come tessere irregolari in un mosaico. Dopo aver usato questa funzione, usare {RILIEVO} può aggiungere una trama interessante all'immagine. - - TOPIC: TEXTURE +image: texture2.jpg +image: texture.png - Aggiungi una superficie con trama a un'immagine o alle aree selezionate all'interno di un'immagine. Il raggio determina la dimensione del motivo della trama. La forza determina l'intensità del motivo, da quasi invisibile a dominante. - - TOPIC: FUSIONE +image: fusion.png +image: fusion2.jpg - Sopprimi piccoli dettagli a basso contrasto in un'immagine mantenendo la nitidezza per le caratteristiche più grandi dell'immagine. Premi [avvia] e osserva attentamente l'immagine. Il processo funziona continuamente finché non viene fermato con il pulsante [ferma]. I piccoli dettagli svaniranno lentamente. L'etichetta 'conteggio' nella finestra di dialogo mostra il numero di iterazioni. Puoi [ferma] il processo per ispezionare l'immagine e poi riprendere l'elaborazione con [avvia]. Usa il pulsante Annulla/Ripeti per confrontare lo stato dell'immagine prima/dopo. Riprendi l'elaborazione con [avvia]. Il pulsante [passo] può essere usato per elaborare un passo alla volta. - - TOPIC: ABBINA COLORI +image: match-colors.png - Abbina i colori in un'immagine a quelli in un'altra. Un piccolo punto, selezionato con un clic del mouse, viene campionato da ciascuna immagine. Il punto sulla 2ª immagine verrà reso con lo stesso colore medio (valori RGB) del punto dalla 1ª immagine. I fattori usati per rendere uguali i valori RGB vengono poi applicati a tutti i pixel nella 2ª immagine. Un uso comune è rimuovere una dominante di colore da un'immagine segnando un punto sull'immagine che corrisponderà a un colore da un'altra immagine. - Procedura: il dialogo elenca 5 passaggi da seguire in sequenza. • Imposta un raggio per l'area campione del punto. Il cerchio del mouse risultante è l'area del punto da campionare. • Apri la 1ª immagine premendo il pulsante [open]. • Clicca sull'immagine per prendere un campione di colore. • Apri la 2ª immagine premendo il pulsante [open]. • Clicca sull'immagine nel punto in cui vuoi abbinare la 1ª immagine. I colori dell'immagine cambieranno entro un secondo o due. - - TOPIC: MOTIVO +image: pattern2.jpg +image: pattern1.png - Aggiungi un motivo di sfondo a un'immagine. Un piccolo file immagine (file motivo) viene usato per coprire l'immagine corrente duplicando il file, come una parete piastrellata. Questo file può essere un motivo reale (es. un'immagine di tessuto di tela, un muro di mattoni, una geometria ripetuta ...), o qualsiasi altro tipo di immagine. Il motivo viene reso semi-trasparente, in modo che l'immagine base appaia stampata sopra il motivo, o il motivo sopra l'immagine. Molti file motivo possono essere trovati usando una ricerca web per "pattern image". Scarica alcuni di questi e ritagliali se necessario a una dimensione intorno a 200-500 pixel. Per comodità, aggiungi questi ai file motivo forniti in ~/.fotocx/patterns. - Usa il pulsante [Sfoglia] per selezionare un file motivo. Il motivo selezionato verrà piastrellato per coprire l'immagine base. Il motivo è parzialmente trasparente in modo che l'immagine base traspaia. Usa Zoom per ingrandire o rimpicciolire la dimensione del motivo. Ci sono due metodi per mescolare il motivo con l'immagine base. L'opacità del motivo può essere impostata 0-100%. L'immagine base viene usata per riempire l'opacità non usata. Il contrasto viene usato per modificare la luminosità dell'immagine base usando la luminosità del motivo come modello. I due parametri possono essere mescolati in qualsiasi rapporto. - Se il file motivo contiene un'immagine che si ripete a intervalli fissi sia orizzontalmente sia verticalmente, il pulsante [Calcola] può essere usato per impostare larghezza e altezza per creare un motivo continuo senza giunture visibili. - Se il motivo è irregolare e le giunture sono visibili, potresti riuscire a migliorarlo. I due valori di Sovrapposizione determinano quanto i motivi duplicati si sovrappongono ai bordi, orizzontalmente e verticalmente. Aggiungi un po' di sovrapposizione per mascherare gli effetti di bordo. - Seleziona Area può essere usato per applicare un motivo a parte di un'immagine, o motivi diversi a parti diverse. Dopo aver applicato un motivo a un'immagine, potrebbe essere interessante usare {RILIEVO} per aggiungere un effetto 3D al motivo. - La casella "Scala di Grigi" convertirà un motivo colorato in scala di grigi. - - TOPIC: TRATTEGGIO INCROCIATO +image: crosshatch2.jpg +image: crosshatch1.png - Converti un'immagine in un disegno usando linee parallele incrociate. Inserisci una dimensione griglia e premi [applica]. - - TOPIC: DITHERING +image: dither1.png - +image: dither2.jpg - Questa funzione fornisce diversi modi per applicare il dither a un'immagine - convertirla in punti. 0 - punti colorati nello stile di Roy Lichtenstein 1 - R/G/B puro o bianco/nero con distribuzione spaziale casuale o ottimizzata 2 - mix RGB usando una data profondità di bit 3 - dither classico usando una tavolozza di colori personalizzata 4 - condensa l'immagine in macchie con il colore medio dei pixel condensati - I dither classici usano il metodo Floyd-Steinberg di compensazione degli errori di colore: la discrepanza tra il colore di un'immagine di input e il colore più vicino dalla tavolozza. I punti con colori vicini vengono mescolati secondo necessità in modo che la media su un'area corrisponda più strettamente al colore di input. La compensazione dell'errore può essere disattivata se lo desideri, per ottenere bande o contorni di colore distinti. - Macchie: i pixel dell'immagine subiscono una sorta di "collasso gravitazionale", convergendo in ammassi intorno a centri di massa locali. 'Massa' è definita come la luminosità del pixel. Il controllo 'raggio' definisce approssimativamente la gamma di attrazione. Premi [avvia] per iniziare il collasso. Osserva l'immagine cambiare lentamente in macchie di dimensione approssimativamente pari all'input 'raggio'. Quando le macchie sono belle e rotonde e cambiano molto poco, premi [ferma] per terminare il processo. - - TOPIC: INCISIONE +image: engrave.png +image: engrave2.png - Converti un'immagine in linee bianco e nero. L'input Dimensione determina lo spessore della linea e quanti pixel verticali dell'immagine vengono usati per ciascuna colonna di pixel verticale nelle linee di output. Le colonne di pixel della linea vengono divise in parti bianche e nere con la loro proporzione che corrisponde approssimativamente alla luminosità media dei pixel di input. L'input Bias può essere usato per ottimizzare la luminosità complessiva. Valori negativi/positivi rendono l'immagine più scura/chiara. L'input Colore (0-100%) può essere usato per aggiungere colore alle parti bianche. - - TOPIC: AGGIUNGI RIFLESSO +image: addglare.png +image: addglare2.jpg - Aggiungi un bagliore che si irradia dai punti luminosi in un'immagine. Potenza: determina la luminosità relativa del bagliore Limite: soglia di luminosità del pixel per emettere bagliore Intervallo: intervallo in pixel del bagliore dai pixel emittenti I pixel con luminosità superiore al limite (200-255) emetteranno bagliore. Luminosità qui significa la luminosità del colore RGB più luminoso in un pixel. Il bagliore emesso è nel colore del pixel emittente. L'intervallo è in unità di pixel. Il bagliore sarà massimo al pixel emittente e diminuirà fino a zero al limite dell'intervallo. - - TOPIC: MOSAICO +image: mosaic1.png +image: mosaic2.jpg - Crea un'immagine a mosaico usando tessere fatte da tutte le tue immagini. - Specifica la dimensione della tessera in pixel (es. 36 x 24) e premi [Tessere]. Le tessere verranno create da tutte le tue immagini (in realtà vengono usate le immagini thumbnail, per velocità). Se cambi le dimensioni della tessera, premi di nuovo [Tessere] per rigenerare le tessere. Dopo che le tessere sono state create, premi [Immagine] per convertire l'immagine corrente in un mosaico usando queste tessere. Le tessere vengono scelte abbinando il colore medio della tessera al colore medio dell'immagine nella posizione della tessera. Se sono disponibili migliaia di immagini e se la gamma di colori è sufficientemente buona, il mosaico risulterà piuttosto buono. Ingrandisci su qualsiasi parte dell'immagine per vedere le immagini delle tessere. - Il cursore Fusione Tessere farà sì che l'immagine venga fusa con le tessere, facendola apparire migliore se le tessere hanno una corrispondenza di colore scadente. Se la fusione è inferiore a circa il 50%, le tessere rimangono quasi chiare come prima, perché l'occhio compensa la falsa tinta. - Dopo che un mosaico è stato creato, puoi cliccare su qualsiasi tessera per ottenere un'immagine popup più grande. Se viene aperto un mosaico salvato, cliccare le tessere per un'immagine più grande non funzionerà. Rigenerare il mosaico è piuttosto veloce, quindi fallo se vuoi che i popup funzionino. - - TOPIC: AGGIUNGI RUMORE +image: add-noise.png - Aggiungi rumore colore casuale a un'immagine. Imposta una dimensione target del punto 1-10 e un livello di rumore 0-100%. Al 100%, viene aggiunto rumore casuale nell'intervallo -127 a +127 a ciascun valore RGB di ciascun pixel. Il valore medio è zero. Gli overflow al di fuori dell'intervallo 0-255 vengono troncati. Il colore medio su un'area grande viene preservato, con il rumore sovrapposto. Puoi usare Aggiungi Rumore con Seleziona Area o Dipingi Modifiche per aggiungere rumore ad aree selezionate. - ^Soppressione del 'banding' Nelle aree dell'immagine dove la distribuzione di luminosità è stata 'estesa', può verificarsi un 'banding' visibile nelle aree di luminosità e colore quasi uniformi. Puoi ridurre questo problema aggiungendo rumore (o sfocatura) alle aree interessate. - - TOPIC: IMPOSTA COLORI +image: set-colors1.jpg +image: set-colors2.jpg - Puoi ridurre il numero di colori usati nell'immagine per creare un effetto poster. Imposta ogni colore RGB separatamente, oppure regola il conteggio totale dei colori. La profondità di bit del colore non viene usata per questo. Alcune funzioni in Fotocx usano la profondità di bit, limitando i colori disponibili a 2, 4, 8 ... per ciascun colore RGB. Questa funzione non è limitata a questo riguardo. L'esempio sopra usa 8 colori rossi, 5 verdi, e 3 blu. - - TOPIC: SPOSTA COLORI +image: shift-colors.png - Questa funzione può essere usata per correggere i colori o convertire un'immagine in falsi colori. Scegli uno qualsiasi dei tre colori RGB e sposta il cursore a sinistra o a destra dal centro. Uno degli altri due colori verrà sostituito in modo graduale. Ad esempio, puoi sostituire gradualmente verde o blu per il colore rosso. Il cursore Tutti sposta tutti i colori insieme. Fai questo prima per trovare un primo ottimo, poi sposta i colori RGB individualmente. - - TOPIC: COLORI ALIENI +image: alien-colors2.jpg +image: alien-colors1.png - Ridipingi un'immagine o area selezionata con colori alieni casuali. Puoi controllare la dimensione approssimativa del motivo e l'intensità (da appena visibile a dominante). Premi [Applica] per ottenere una nuova distribuzione di colore. - - TOPIC: KERNEL PERSONALIZZATO +image: custom-kernel.png - Applica un kernel di convoluzione personalizzato a un'immagine. La tecnologia sottostante è spiegata su Wikipedia. Inserisci una dimensione del kernel, un fattore di moltiplicazione, un fattore di addizione, e compila i valori della tabella. [Applica] applica il kernel all'immagine. [Reimposta] ripristina lo stato originale dell'immagine. I valori possono essere salvati in un file e recuperati più tardi usando i pulsanti [Salva] e [Carica]. Sono disponibili inizialmente diversi file di esempio del kernel. Puoi modificarli e salvarli con un nome personalizzato. - Matematica: i valori di luminosità per ciascun blocco di pixel N per N nell'immagine vengono moltiplicati per i valori corrispondenti nella matrice del kernel e sommati insieme. Questo numero viene moltiplicato per il fattore di moltiplicazione, e il fattore di addizione viene aggiunto ad esso. Questo valore finale diventa il nuovo livello di luminosità per il pixel dell'immagine al centro del blocco N x N. - - TOPIC: MENU DEFORMAZIONE - - TOPIC: RADDRIZZA +image: unbend1.png +image: unbend2.jpg - I panorami di soggetti vicini (tipicamente edifici o stanze interne) possono mostrare linee rette che appaiono curve, o edifici che appaiono inclinati. Deformare le immagini era necessario nel processo di creazione del panorama affinché le immagini si unissero correttamente. La funzione Raddrizza Curve può essere usata successivamente per raddrizzare l'immagine panoramica se necessario. Linee tratteggiate verticali e orizzontali vengono disegnate sopra l'immagine, mostrando gli assi di raddrizzamento. Clicca o trascina il mouse vicino alla fine di una linea per spostarla. Se i valori nei quattro controlli di input vengono cambiati, l'immagine viene deformata nel modo indicato dalle quattro immagini corrispondenti. Aumenta o diminuisci i valori e ripeti finché non sei soddisfatto. Sposta gli assi per cambiare i centri di deformazione. - Vedi anche {DEFORMA IMMAGINE} per un altro metodo di correzione della curvatura e della prospettiva dell'immagine. - - TOPIC: PROSPETTIVA +image: perspective2.jpg +image: perspective1.png - Questa funzione può essere usata per raddrizzare una foto fatta da un'angolazione decentrata. L'immagine a sinistra è la foto originale, scattata da destra del centro per evitare riflessi. L'immagine a destra è la versione raddrizzata. Questa funzione può anche essere usata per raddrizzare un edificio alto fotografato a livello strada o di lato. - Clicca sui quattro angoli del tetraedro che vuoi trasformare in un rettangolo (nel caso sopra, i quattro angoli del dipinto o della cornice), poi seleziona [Applica]. Gli angoli cliccati sono contrassegnati con piccoli riquadri bianchi contenenti "A, B, C, D". L'angolo in alto a sinistra di ciascun riquadro segna precisamente la posizione dell'immagine. Cliccare vicino a un riquadro lo sposterà nella nuova posizione. Puoi usare i tasti freccia della tastiera per spostare i marcatori degli angoli in passi di 1 pixel. I tasti freccia agiscono sull'ultimo angolo cliccato o spostato. - - TOPIC: DEFORMA IMMAGINE +image: warps4.jpg - - TOPIC: DEFORMA AREA Questa funzione può essere usata per creare distorsioni all'interno di un'immagine. Puoi selezionare un'area dell'immagine e trascinare il mouse per allungare quest'area rispetto al resto dell'immagine. L'immagine è come gomma. Se il trascinamento del mouse inizia all'interno dell'area selezionata, allora l'area viene deformata entro i suoi confini attuali - il movimento è massimo al puntatore del mouse e diminuisce a zero ai bordi dell'area. Se il trascinamento del mouse inizia al di fuori dell'area selezionata, i bordi dell'area vicino al mouse possono essere tirati oltre il confine originale dell'area. Molti trascinamenti del mouse di lunghezze e direzioni diverse possono essere combinati per ottenere i risultati desiderati. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - Questa funzione è utile per correggere problemi di prospettiva. Trascina l'immagine da vicino a un angolo, usando il mouse. L'immagine viene tirata elasticamente da questo angolo mentre gli altri angoli rimangono fissi. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - Questa funzione è utile per correggere problemi di prospettiva. Trascina l'immagine dall'interno, usando il mouse. L'interno dell'immagine viene tirato elasticamente mentre i bordi rimangono fissi. - - TOPIC: DEFORMAZIONE CURVA Questa funzione è utile per correggere problemi di prospettiva (vedi anche {RADDRIZZA}). Trascina l'immagine da qualsiasi posizione, usando il mouse. L'intera immagine verrà tirata o spinta nella direzione del mouse, ma le aree vicino al mouse si muovono più delle aree più distanti. Puoi raddrizzare linee curve o curvare deliberatamente l'immagine. Il controllo 'estensione deformazione' determina il raggio di deformazione intorno al mouse. 1.0 significa che l'intera immagine viene deformata, e valori più piccoli confinano la deformazione ad aree più piccole intorno al mouse. - - TOPIC: DEFORMAZIONE AFFINE Questa funzione può essere usata per deformare un'immagine in modi interessanti. Trascina l'immagine da un angolo o bordo usando il mouse. I cambiamenti sono puramente lineari quindi le linee rette rimangono rette. Questa trasformazione è chiamata "affine". I dettagli possono essere trovati con una ricerca web. - - TOPIC: DEFORMAZIONE RADIALE +image: warp_radial.png - Aggiungi o rimuovi distorsione a barile o a cuscino. La distorsione a barile è spesso osservata in immagini RAW che non sono state elaborate per rimuovere questa distorsione. Clicca con il tasto sinistro per scegliere un punto centrale intorno al quale saranno centrati i cambiamenti - normalmente il centro dell'immagine. Questo è il default. Sposta il cursore 'estensione' per piegare l'immagine. - - TOPIC: RIMUOVI DEFORMAZIONE RAVVICINATA +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - Le foto in primo piano del viso sono spesso distorte, perché le aree più vicine alla fotocamera sono più grandi nella foto rispetto alle aree più lontane. Questa funzione può essere usata per invertire la distorsione. Usa {SELEZIONA AREA} per selezionare prima il viso (non deve essere accurato). Clicca sull'immagine vicino al centro della distorsione (esempio sopra: guancia destra). Sposta il cursore per ottimizzare. - - TOPIC: CREA ONDE +image: make-waves2.jpg +image: make-waves1.png - Questa funzione distorce un'immagine in un motivo ondulato, come se vista attraverso acqua turbolenta. Il dialogo ti permette di cambiare la lunghezza d'onda media orizzontale e verticale, l'ampiezza e la varianza. L'input "prospettiva" permette alle lunghezze d'onda di allungarsi gradualmente dall'alto verso il basso. - - TOPIC: TORSIONE +image: twist1.png +image: twist2.png - Questa funzione torce l'immagine intorno a un punto scelto con un clic o trascinamento del mouse. Clicca sulla posizione desiderata e sposta il cursore Torsione della quantità desiderata. Puoi anche trascinare il mouse intorno all'immagine per cambiare il centro della torsione. Il cursore Centro distorce l'area centrale rispetto al resto. Il cursore Angolo ruota l'immagine. - - TOPIC: SFERA +image: sphere2.jpg +image: sphere.png - Crea una proiezione sferica di un'immagine. Trascina il mouse sull'immagine per cambiare il centro della proiezione (default al punto medio). Il controllo appiattisci modifica la proiezione gradualmente da una sfera (destra) a un'immagine piatta (sinistra). Il cursore ingrandisci ingrandisce l'immagine risultante fino a 2x. - - TOPIC: DA DENTRO A FUORI +image: inside-out2.jpg +image: inside-out1.png - Questa funzione inverte le distanze centro-bordo di ciascun pixel. Puoi cliccare o trascinare il mouse per variare il punto centrale. - - TOPIC: TINY PLANET +image: tiny-planet.jpg - Avvolgi un'immagine intorno a un cerchio. Se l'immagine è un panorama a 360 gradi, non ci sarà nessuna giuntura visibile. • Buco Centrale: l'immagine viene avvolta intorno a un buco centrale. • Taglia Alto: rimuovi un margine superiore dall'immagine di input. • Taglia Basso: rimuovi un margine inferiore dall'immagine di input. • Inverti R: rifletti verticalmente l'immagine di input. • Inverti Theta: rifletti orizzontalmente l'immagine di input. • Ruota: gira l'immagine di output intorno al centro. - - TOPIC: SPIRALE ESCHER +image: escher-spiral.png +image: escher-spiralA.png - Trasforma un'immagine in una spirale infinita verso l'interno come il famoso orologio di M.C.Escher. Larghezza determina la larghezza iniziale dello strato più esterno. Bordo determina la larghezza iniziale del bordo che separa gli strati, e Colore determina il suo colore. Il centro predefinito è il centro dell'immagine. Clicca sull'immagine per impostare un nuovo centro. - - TOPIC: APPIATTISCI FOTO +image: flatten-photo1.png +image: flatten-photo2.jpg - ^Pagina di libro o altra superficie curva Appiattisci una foto di un'immagine su una superficie curva, es. intorno a una colonna, o una pagina di un libro spesso aperto, dove le pagine si curvano verso l'interno alla rilegatura centrale. La curvatura dei bordi superiore e inferiore della superficie fornisce informazioni sulla quantità di curvatura e sulla quantità di allungamento necessaria per apparire piatta. L'esempio sopra è un libro spesso. Altre superfici arrotondate possono essere corrette, es. un poster su una colonna rotonda. - Seleziona l'opzione traccia superiore per tracciare il bordo superiore della pagina curva. Clicca il mouse lungo il bordo, creando un punto marcatore a ciascun punto cliccato. Dopo che sono disponibili 4 punti, viene disegnata una linea curva attraverso i punti. Aggiungi altri punti e trascina i punti secondo necessità per far conformare strettamente la linea alla curva dell'immagine. Seleziona l'opzione traccia inferiore e traccia il bordo inferiore allo stesso modo. Quando entrambi sono completati, premi [flatten] per appiattire la pagina. I bordi dovrebbero ora essere dritti (o abbastanza dritti). Usa il cursore [stretch] per allungare i lati dell'immagine secondo necessità, per compensare la compressione laterale causata dalla curvatura. Usa il controllo Allarga per allargare l'immagine secondo necessità per ripristinare il corretto rapporto larghezza/altezza. Il pulsante [undo] ripristina l'immagine non modificata, mantenendo i punti marcatori, che possono poi essere regolati per un nuovo tentativo. - +image: flatten-photo3.jpg - ^Orizzonte curvo Un panorama ampio, o una foto da un obiettivo grandangolare, potrebbe avere un orizzonte che non è dritto o orizzontale. L'immagine può essere raddrizzata (o altrimenti spostata) tracciando una curva attraverso l'orizzonte o altre aree che devono essere allineate lungo una linea retta. Seleziona l'opzione traccia superiore o inferiore, a seconda che l'orizzonte (o un'altra parte dell'immagine) si trovi principalmente sopra o sotto il centro dell'immagine. L'immagine verrà deformata per rendere dritta questa curva. Una curva è sufficiente. L'altra curva viene aggiunta automaticamente al bordo opposto (superiore o inferiore) dell'immagine. Se il risultato non è soddisfacente, usa il pulsante [undo], regola i marcatori su entrambe le curve, e riprova. Puoi anche salvare l'immagine e applicare la funzione una seconda volta, usando l'immagine salvata come punto di partenza. - - TOPIC: MENU COMBINA Queste sono funzioni che combinano più file immagine. Nel caso di immagini sovrapposte, le caratteristiche corrispondenti in ciascuna immagine vengono allineate per coincidere, con precisione a livello di singolo pixel. Il tempo di allineamento è tipicamente di 10-30 secondi per immagine. Se vedi questo processo di allineamento andare male, puoi usare il tasto Esc per terminare il processo. - - TOPIC: HDR ^Alta Gamma Dinamica +image: HDR.jpg +image: HDR-adjust.png - Combina (sovrapponi) più immagini dello stesso soggetto con diversi livelli di esposizione. L'immagine combinata può mostrare una visibilità migliorata dei dettagli sia nelle aree più scure sia in quelle più chiare, usando di fatto i pixel dalle immagini più chiare per le aree scure, e dalle immagini più scure per le aree chiare. Se la fotocamera viene regolata manualmente tra gli scatti, fai attenzione a tenerla livellata e a puntarla verso lo stesso punto distante. Un certo disallineamento delle immagini di input può essere tollerato. Se persone o cose si muovono tra uno scatto e l'altro, il fantasma (ghosting) non può essere evitato. - Seleziona la funzione menu HDR e seleziona fino a 9 immagini ({SELEZIONA FILE IMMAGINE}), che devono avere tutte quasi le stesse dimensioni in pixel. Le immagini vengono allineate e combinate automaticamente. Quando terminato, viene mostrata l'immagine combinata, insieme a un dialogo per le regolazioni. I contributi delle immagini di input sono mostrati come una serie di curve modificabili. La scala orizzontale rappresenta la luminosità del pixel, da scuro a chiaro. Ogni curva rappresenta un'immagine che contribuisce ai pixel di output. Il contributo dell'immagine a un dato livello di luminosità è proporzionale all'altezza della sua curva a quel livello. La curva iniziale per l'immagine più chiara sarà alta a sinistra e bassa a destra, il che significa un alto contributo ai pixel scuri e un basso contributo ai pixel chiari. L'immagine più scura sarà bassa a sinistra e alta a destra, e le immagini rimanenti nel mezzo. Le curve possono essere modificate trascinandole con il mouse. I contributi delle immagini corrispondenti cambiano di conseguenza, e puoi vedere i risultati in tempo reale nell'immagine di output. L'immagine sopra mostra due immagini di input e la loro immagine di output. Il dialogo di esempio mostra tre curve regolate per ottimizzare tre immagini di input. - - TOPIC: HDF ^Alta Profondità di Campo Combina (sovrapponi) più foto dello stesso soggetto con diverse impostazioni di messa a fuoco, da vicino a distante. Diverse parti del soggetto sono nitide in ciascuna immagine. Combina le immagini in modo che tutte le parti del soggetto siano nitide. - Fare le foto: scegli un punto per il centro dell'immagine. Punta la fotocamera verso un oggetto vicino e premi il pulsante di scatto a metà corsa per impostare la messa a fuoco su questo oggetto. Tieni il pulsante in posizione a metà corsa, punta la fotocamera verso il centro scelto, e scatta la foto. Ora scegli un oggetto più lontano e fai lo stesso. Ripeti con distanza di messa a fuoco crescente. Speriamo che ogni parte del soggetto sia nitida in almeno una foto. La posizione della fotocamera dovrebbe essere quasi la stessa per tutte le foto, il che può essere una sfida se il soggetto è molto vicino. Il movimento della fotocamera può causare problemi di scala e parallasse (oggetti vicini spostati rispetto a oggetti distanti). Tali problemi potrebbero essere risolvibili più tardi in Fotocx, ma questo potrebbe richiedere tempo considerevole. È meglio evitare i problemi. - +image: HDF-paint.png - Elaborare le foto: scegli la funzione menu HDF e seleziona fino a 9 immagini ({SELEZIONA FILE IMMAGINE}). Le immagini verranno ora allineate nel miglior modo possibile. L'immagine di output è un mix uniforme delle immagini di input allineate. Una piccola quantità di movimento della fotocamera tra le foto viene compensata, ma questo è limitato, e gli spostamenti di parallasse non vengono compensati affatto. Quando l'allineamento è completo, si apre un dialogo. Puoi selezionare qualsiasi immagine di input e "dipingerla" con il mouse su qualsiasi area dell'immagine di output. Questo converte il mix originale dell'immagine nella singola immagine selezionata per l'area in fase di pittura. Per ciascuna area o oggetto nell'immagine, scegli un'immagine di input che sia nitida in quell'area. Il raggio del pennello può essere impostato più grande o più piccolo, in modo da poter dipingere rapidamente aree grandi e controllare i dettagli fini quando necessario. Se hai oggetti vicini e lontani sovrapposti, servirà tempo e pazienza per rendere tutti nitidi. I disallineamenti possono essere corretti selezionando l'opzione deforma nel dialogo. Le immagini sottostanti possono quindi essere trascinate e deformate con il mouse, e l'immagine combinata di output cambia di conseguenza. La deformazione è limitata all'area intorno al mouse. Quando un'area dipinta viene trascinata, l'immagine di input corrispondente viene automaticamente selezionata e trascinata, mentre le aree dipinte con altre immagini rimangono fisse. Le aree che non sono state dipinte non possono essere trascinate. Spostati in diverse aree e fai trascinamenti incrementali finché tutte non sono allineate. - Flusso di Lavoro Suggerito: usando la modalità pittura, scegli ciascuna immagine in sequenza e dipingi tutte le aree che appaiono nitide in quell'immagine. Eventuali confini che non sono ben allineati appariranno chiaramente come spostamenti nei bordi delle caratteristiche dell'immagine. Alcuni di questi possono essere resi non importanti cambiando l'immagine usata per la pittura (se più di un'immagine è abbastanza nitida). Usando la modalità deforma, apporta regolazioni fini secondo necessità per eliminare gli spostamenti visibili. - - TOPIC: STACK/PITTURA +image: stack-paint.png - +image: stack-paint2.jpg - Sovrapponi (stack) più foto dello stesso soggetto scattate in momenti diversi. Rimuovi turisti e auto che vanno e vengono tra uno scatto e l'altro. - Fare le foto: punta la fotocamera verso lo stesso punto distante e scatta più foto mentre turisti o auto si muovono davanti al soggetto. Cerca di ottenere due o più foto per ciascuna area del soggetto non ostruita dagli oggetti transitori. Tieni ferma la fotocamera e punta verso lo stesso punto, in modo che le immagini si allineino accuratamente. - Elaborare le foto: scegli la funzione menu Stack/Dipingi e seleziona fino a 9 immagini ({SELEZIONA FILE IMMAGINE}). Le immagini verranno ora allineate nel miglior modo possibile. L'immagine di output (in basso a sinistra) è un mix uniforme delle immagini di input allineate (riga superiore). Quando l'allineamento è completo, si avvia il dialogo mostrato sopra. Puoi selezionare qualsiasi immagine di input e "dipingere" con il mouse su qualsiasi area dell'immagine di output. La singola immagine selezionata viene usata per l'area in fase di pittura. Per ciascuna area nell'immagine, scegli un'immagine di input libera dagli oggetti transitori. Il raggio del pennello può essere impostato più grande o più piccolo, in modo da poter dipingere rapidamente aree grandi e controllare i dettagli fini quando necessario. - Funzionamento automatico: premi il pulsante [Nascondi] per vedere se gli oggetti transitori possono essere rimossi automaticamente. Questo funzionerà per le aree dell'immagine dove sono disponibili più foto dello sfondo non ostruito (immagine centrale in basso). Per mostrare tutti gli oggetti transitori, premi il pulsante [Mostra] (immagine in basso a destra). Questo generalmente funziona, ma non perfettamente. Leggeri disallineamenti dell'immagine o differenze di illuminazione (specialmente ombre in movimento) possono causare all'algoritmo di selezionare pixel di sfondo invece di pixel di primo piano. Puoi usare il metodo di pittura descritto sopra per correggere manualmente gli errori. - - TOPIC: STACK/RUMORE +image: stack-noise2.jpg +image: stack-noise.png - Questa funzione combina 2-9 foto dello stesso soggetto. Le foto dovrebbero essere quasi identiche, tranne piccoli spostamenti causati da una fotocamera tenuta in mano. Se le foto sono state fatte con un'impostazione ISO molto alta (condizioni di scarsa illuminazione), i pixel avranno un rumore considerevole. Facendo molte foto e mediandole, il rumore può essere in gran parte eliminato. - Elaborare le foto: scegli la funzione Stack/Rumore e seleziona fino a 9 immagini ({SELEZIONA FILE IMMAGINE}). Verranno combinate automaticamente e mostrate, e si aprirà un dialogo. L'immagine di output iniziale è una combinazione di tutte le immagini di input selezionate, mediate insieme. Questo significa che i valori RGB per ciascun pixel di output sono la media dei valori RGB per i pixel di input corrispondenti. Il pulsante mediana cambierà i pixel di output nella mediana dei pixel di input (1-3 valori RGB centrali vengono mediati, a seconda del numero di immagini). Questo potrebbe essere migliore o no, quindi alterna per confrontare. Le caselle di controllo per ometti pixel basso e ometti pixel alto faranno sì che i valori RGB di input più bassi e più alti vengano scartati prima della media. Questo può far rimuovere i picchi di rumore dal mix. Questo non ha effetto se viene selezionato il metodo mediana. - - TOPIC: STACK/LIVELLI +image: stack-layers.png - Usa questa funzione per combinare diverse versioni modificate di un'immagine, dove puoi determinare quale versione viene mostrata nelle aree dell'immagine selezionate. Possono essere combinate immagini qualsiasi che abbiano le stesse dimensioni in pixel. - Seleziona fino a 9 immagini di dimensione identica. L'immagine di output iniziale è una miscela uguale di tutte le immagini di input. I Rapporti Immagine sono i pesi relativi delle immagini miscelate. Questi possono essere regolati per variare il peso di ciascuna immagine. Esempio: se 3 immagini vengono combinate con pesi relativi di 3, 5, 7, allora l'immagine combinata è 3/15 dall'immagine n.1, 5/15 dalla n.2, e 7/15 dalla n.3. Se è selezionata l'opzione "Dipingi l'intera immagine", i pesi possono essere regolati e l'immagine di output risponde immediatamente. Se è selezionata l'opzione "Dipingi entro il mouse", allora il mouse può essere trascinato e viene dipinta solo l'area entro il cerchio del mouse, usando i rapporti immagine attualmente attivi. La velocità di pittura è controllata dalle impostazioni Potenza per il centro e il bordo del mouse. Usa numeri bassi per dipingere gradualmente. - - TOPIC: PANORAMA +image: pano-align1.jpg +image: pano-align2.jpg - Questa funzione unisce 2-6 immagini per creare un'immagine grandangolare o panorama. Le immagini devono sovrapporsi del 10% o più, in modo che il programma possa trovare dove corrispondono e unirle insieme. Inizia selezionando 2-6 file immagine ({SELEZIONA FILE IMMAGINE}). È utile selezionare le immagini in ordine da sinistra a destra, per rendere più facile l'allineamento approssimativo iniziale. Le immagini vengono inizialmente unite e mostrate con una piccola sovrapposizione trasparente. Un dialogo di pre-allineamento (sopra) ti chiede di trascinare le immagini in un allineamento approssimativo. Trascina le immagini nel corretto ordine da sinistra a destra. L'immagine da trascinare potrebbe sovrapporsi ad altre immagini. Per essere chiaro su quale immagine viene trascinata, trascina da vicino al centro dell'immagine. Dopo che le immagini sono nell'ordine corretto, allinea ciascuna immagine con il suo vicino a sinistra. Funziona meglio procedere da sinistra a destra. Sposta un'immagine orizzontalmente e verticalmente in allineamento approssimativo con il suo vicino a sinistra, poi ruota l'immagine se necessario trascinando il bordo inferiore a sinistra o a destra - l'immagine ruota intorno al punto medio della sua sovrapposizione con l'immagine a sinistra. Il metodo più veloce è allineare prima la regione centrale della sovrapposizione, poi ruotare l'immagine destra se necessario per portare in allineamento le regioni di sovrapposizione superiore e inferiore. Un'estrema precisione NON è necessaria. Le immagini dovrebbero essere correttamente curvate e adattarsi bene insieme. Se non lo fanno, allora 'lens mm' (lunghezza focale, equivalente 35mm) necessita di regolazione. La curvatura dell'immagine cambia man mano che lens mm viene regolato. Il valore iniziale viene ottenuto dai metadata EXIF se disponibili, e questo è normalmente sufficiente. Se le immagini non hanno curvatura (es. immagini scansionate), usa la casella 'no curve' per impostare 'lens mm' effettivamente all'infinito. - Se una qualsiasi delle immagini è stata ritagliata, la matematica che dipende dalla lunghezza focale EXIF non funziona. Potresti riuscire a compensare aumentando la lunghezza focale in 'lens_mm'. - La casella 'manual align' userà il pre-allineamento manuale come allineamento finale. Questo è per immagini che non hanno caratteristiche chiare necessarie per allineare le immagini. Questa opzione permette anche alle immagini di avere sovrapposizione zero. - Premi [proceed] quando il pre-allineamento è terminato, e il programma eseguirà l'allineamento fine e unirà le immagini. Internamente, le immagini vengono spostate e ruotate e viene valutato il grado di corrispondenza. Questo viene fatto con dimensioni dell'immagine crescenti finché non viene trovato il miglior allineamento. Questo potrebbe richiedere un minuto o più, a seconda della velocità della CPU e della dimensione dell'immagine. Puoi velocizzare notevolmente il processo se riduci le immagini di input a 2/3 o 1/2 della dimensione. Fai questo anche se il processo fallisce per mancanza di memoria. - +image: pano-adjust.jpg - Quando l'allineamento fine è completo, viene visualizzata l'immagine combinata. Il dialogo sopra viene avviato per regolazioni fini della luminosità. Potresti vedere un bordo tra le immagini se non hanno la stessa luminosità. Seleziona un'immagine usando i pulsanti radio in alto. Usa il pulsante [colore automatico] ripetutamente per migliorare automaticamente la corrispondenza di luminosità/colore delle immagini. L'immagine di base è quella attualmente selezionata. Prova basi diverse per vedere quale funziona meglio. Se le immagini sono gravemente non corrispondenti in luminosità, seleziona l'anomalia più grande e usa il controllo luminosità per cambiare la luminosità in modo che corrisponda alle altre, seguito da [colore automatico]. La corrispondenza non deve essere molto buona, poiché 'Larghezza Fusione' (successivo) mascererà le differenze rimanenti. Usa il pulsante 'Colore File' per ripristinare i livelli di luminosità dai file immagine di input. - Il controllo 'Larghezza Fusione' regola come le immagini vengono fuse insieme: alle sovrapposizioni dell'immagine, la luminosità viene cambiata su questo numero di pixel, per mascherare gli squilibri che non possono essere completamente corretti. Il valore predefinito è 1 pixel, che rende evidente qualsiasi differenza di luminosità. - Se le immagini non si allineano perfettamente, potresti riuscire a migliorare l'allineamento usando il mouse per spingere le immagini in allineamento. Seleziona 'Deforma con Mouse' e seleziona una delle immagini con i pulsanti radio. Poi trascina il mouse lungo il bordo dell'immagine dove dovrebbe allinearsi con il suo vicino, spostando l'immagine in allineamento. L'immagine viene spostata localmente intorno al mouse mentre le parti più distanti rimangono fisse. Le immagini con spostamento di parallasse richiederanno un compromesso, poiché è impossibile mantenere sia il primo piano sia lo sfondo in allineamento. - Il controllo appiattisci immagine può essere usato per "raddrizzare" l'immagine, il che raddrizzerà le linee curve (es. edifici curvi). Un valore di zero non ha effetto e un valore di 1.0 appiattirà completamente l'immagine. - Quando terminato, usa {RADDRIZZA}, {DEFORMA IMMAGINE}, {RITAGLIA} ecc. per le regolazioni finali. - ^Immagini scansionate Le immagini scansionate possono essere combinate se c'è sufficiente sovrapposizione. Seleziona 'no curve' poiché non c'è curvatura. - ^Deformazione Automatica Le immagini vengono leggermente deformate in varie direzioni durante l'allineamento per trovare la migliore corrispondenza. Questo serve a compensare gli spostamenti nell'orizzonte della fotocamera o nella rotazione, che causano distorsioni dell'immagine che riducono la qualità dell'adattamento. Se l'area di sovrapposizione di due immagini include un grande oggetto che si è mosso tra le due foto, il processo di allineamento potrebbe impazzire cercando di far corrispondere le immagini, rendendo l'allineamento molto scarso. Selezionando 'no auto warp' potresti riuscire a far avere successo all'allineamento o avere un errore minore. Un'altra opzione è selezionare allineamento manuale. - ^Combinare Panorami Puoi fare un panorama fino a 6 immagini in un solo passaggio. Puoi anche combinare panorami che si adattano insieme ai lati, es. combinare un panorama a 4 immagini con un altro panorama a 4 immagini per fare un panorama a 8 immagini. Devi fermare la normale curvatura dell'immagine quando combini panorami, poiché le immagini panoramiche sono già curvate (assumendo che tu non abbia usato l'opzione 'appiattisci' nel dialogo panorama finale). Ferma la curvatura dell'immagine selezionando la casella 'no curve' nel dialogo di pre-allineamento. - ^Limitazioni del Panorama I panorami che includono oggetti vicini possono essere complicati: quando fai le foto, fai attenzione a ruotare la fotocamera su un asse attraverso l'obiettivo, con movimento laterale minimo, altrimenti le immagini potrebbero allinearsi male perché gli oggetti in primo piano sono spostati rispetto allo sfondo (parallasse). Questo non è un problema quando il soggetto è a 50+ metri di distanza, poiché un piccolo movimento laterale ha poco impatto sull'immagine. Tieni la fotocamera livellata per evitare un grande spostamento verticale (spostamento dell'orizzonte), che può causare distorsioni dell'immagine che potrebbero non essere completamente corrette. Evita di ruotare la fotocamera per la stessa ragione. - ^Panorama Verticale Questo può essere fatto ruotando le immagini di input di 90°. In Panorama, scegli le immagini in ordine dall'alto verso il basso, in modo che l'immagine superiore sia a sinistra e quella inferiore a destra. Fai il panorama normalmente. Ruota l'immagine di output in modo che sinistra diventi alto. - - TOPIC: MOSTRA FILE CIM Mostra i file di input per l'immagine combinata corrente o più recente, in una finestra popup. Viene ricordato solo l'insieme corrente o più recente. - - TOPIC: MASHUP +image: mashup.jpg - Organizza più immagini e testo in un layout. Le immagini possono essere aggiunte, ridimensionate, ruotate e spostate trascinandole con il mouse. Le immagini possono essere rese interamente o parzialmente trasparenti in aree selezionate. Il testo può essere aggiunto, spostato, ridimensionato e ruotato. Gli attributi del testo possono essere specificati: font, dimensione, colore, contorno, ombra, trasparenza. Possono essere aggiunte linee e frecce. L'esempio qui mostra alcune delle possibilità. - +image: mashup1.png - Nel primo dialogo Mashup, scegli un'immagine di sfondo o layout dove verranno posizionate altre immagini. Scegli un'immagine esistente o crea una nuova immagine monocolore con dimensione e colore specificati. Puoi anche aprire un progetto mashup salvato in precedenza e continuare a modificarlo. - +image: mashup2.png - Il 2° dialogo Mashup è una scelta: modifica immagini, modifica testo, modifica linee e frecce, ridimensiona a una dimensione più grande, salva l'immagine combinata completata (Fatto) o abbandona l'immagine (Annulla). Le prime tre scelte portano a dialoghi per eseguire le rispettive modifiche. Ognuna di queste torna a questo dialogo quando terminata, quindi puoi aggiungere o modificare immagini, testo, e linee/frecce in qualsiasi sequenza. Ridimensiona è spiegato sotto. - +image: mashup3.jpg - Usa questo dialogo per selezionare e posizionare immagini nel layout e rivedere il loro aspetto: dimensione, rotazione, posizione, trasparenza. Un'immagine può essere parzialmente o completamente trasparente, complessivamente o in aree specificate. Questo significa che l'immagine di sfondo o l'immagine sovrapposta può traspaure attraverso le aree trasparenti. Il pulsante Aggiungi Immagine porta a un dialogo di selezione file galleria ({SELEZIONA FILE IMMAGINE}). Le immagini selezionate vengono posizionate nel layout. Dopo che le immagini sono state aggiunte, clicca su qualsiasi immagine per selezionarla per le modifiche. Trascina l'immagine dal centro per posizionare l'immagine nel layout. Trascina l'angolo in basso a destra per ridimensionare l'immagine. Usa i controlli del dialogo per regolare l'immagine. I controlli del dialogo operano sull'ultima immagine aggiunta, cliccata o trascinata. I pulsanti 'Prec' e 'Succ' scorrono le immagini una alla volta, facendo lampeggiare l'immagine selezionata. Questo può essere usato quando le immagini sovrapposte rendono difficile selezionare l'immagine desiderata cliccandoci sopra. Scala ridimensiona l'immagine. Angolo ruota l'immagine. I pulsanti Ordine di Sovrapposizione alzano o abbassano un'immagine rispetto ad altre immagini - questo determina quale immagine sovrapposta sarà in cima. Trasparenza Base viene usata per rendere un'intera immagine parzialmente trasparente. Il pulsante [pittura] viene usato per rendere qualsiasi parte di un'immagine parzialmente o completamente trasparente, usando il dialogo Dipingi mostrato sotto. Il pulsante [deforma] viene usato per piegare o deformare un'immagine, usando il dialogo Deforma mostrato sotto. La casella 'margini neri' può essere usata per rimuovere margini neri lasciati da altre funzioni di modifica, es. deforma. Questi verranno resi trasparenti. Il pulsante 'Immagine è fissa' impedirà che l'immagine venga spostata dal mouse o dalla tastiera. Questo è utile quando le immagini vengono allineate con precisione e il movimento accidentale dovrebbe essere prevenuto. I controlli Margini possono essere usati per rendere trasparenti i bordi dell'immagine. I Margini Netti tagliano via i bordi dell'immagine. I Margini Fusi rendono i bordi parzialmente trasparenti per fonderli nello sfondo o in altre immagini sovrapposte. - +image: mashup4.png - "Dipingi" più o meno trasparenza per le aree dell'immagine selezionate. Clicca su un'immagine per selezionarla. Il puntatore del mouse è un cerchio che mostra il raggio d'azione. Usa raggio per regolare la dimensione. Trascina con il tasto sinistro il mouse sull'immagine per renderla trasparente nelle aree coperte dal cerchio. Trascina con il tasto destro per renderla opaca. Se Graduale è selezionato, i cambiamenti di trasparenza vengono fatti lentamente man mano che il mouse viene trascinato. Specifica un valore di potenza per il centro e i bordi del mouse per regolare la velocità di cambiamento. - +image: mashup5.png - Il dialogo deforma viene usato per deformare un'immagine. Clicca su un'immagine per selezionarla. Trascina l'immagine con il mouse - l'immagine si deformerà o allungherà localmente nella direzione del mouse (come gomma in foglio). L'area di deformazione è approssimativamente data dall'estensione deformazione, che è una frazione della dimensione dell'immagine. Ogni trascinamento è un passo che si aggiunge ai passi precedenti. I passi recenti possono essere invertiti con [undo last], e l'immagine non deformata può essere ripristinata con [undo all]. - +image: mashup6.png - Il dialogo Modifica Testo viene usato per posizionare testo sul layout. Inserisci del testo e premi [Applica]. Ti viene chiesto di cliccare sul layout dove verrà aggiunto il testo. Trascinalo in posizione, poi usa i controlli del dialogo per impostare font, dimensione, colore, angolo, colore di sfondo, dimensione e colore del contorno, dimensione e colore dell'ombra, e trasparenze per ciascuno di questi. Trascina il testo in una nuova posizione in qualsiasi momento. Clicca su qualsiasi testo esistente per mostrare le sue proprietà nel dialogo e rivederle. Clicca su un testo e premi Canc per rimuoverlo. Quando hai finito di modificare, premi [OK] per tornare al 2° dialogo Mashup. - +image: mashup7.png - Il dialogo Modifica Linea/Freccia viene usato per posizionare linee o frecce sul layout. Funziona in modo molto simile all'aggiunta di testo. Inserisci una lunghezza e larghezza e premi [Aggiungi]. Ti viene chiesto di cliccare sul layout dove verrà aggiunta la linea. Una linea viene posizionata sul layout, oppure una freccia se una delle opzioni punta a freccia è selezionata. Trascina la linea/freccia nella posizione desiderata. Regola lunghezza, larghezza, angolo e attributi (sfondo, contorno, ombra) usando il dialogo. Puoi anche trascinare una delle estremità della linea/freccia per impostare la posizione di quella estremità, lasciando fissa l'altra estremità. - Puoi usare il mouse per spostare e ridimensionare gli oggetti nel layout: • clicca sull'oggetto per selezionarlo - lampeggia per confermare la selezione. • trascina dal centro approssimativo per posizionare l'oggetto. • trascina l'angolo in basso a destra per ridimensionare l'oggetto. • per una linea/freccia, trascina una delle estremità per spostare solo quella estremità. - I tasti freccia della tastiera possono anche essere usati per spostare l'oggetto attualmente selezionato in passi di 1 pixel. - Puoi aggiungere immagini salvate da {SELEZIONA AREA}. Nel dialogo Modifica Immagini, premi [Aggiungi] per avviare il dialogo di selezione file. Usa il pulsante [Alto] nella finestra galleria, seleziona 'saved_areas'. Apri una qualsiasi delle immagini .png trovate lì. Viene usato il contorno dell'area originale, e la fusione dell'area funziona da questi bordi. - ^File di progetto Mashup Puoi salvare un progetto e aprirlo più tardi per continuare a modificarlo. Il progetto Mashup viene ricostruito usando queste immagini e alcuni dati salvati nel file di progetto: posizioni di immagini e testo, scale, trasparenza, ecc. - ^Ridimensionamento Mashup Lavorare con un layout molto grande (oltre 20 megapixel) può essere piuttosto lento. Trascinare una grande immagine sovrapposta può essere lento e a scatti. Puoi lavorare molto più velocemente se usi un layout più piccolo per costruire il progetto, e poi lo ingrandisci dopo aver finito. Non c'è perdita di risoluzione nell'immagine finale, poiché le immagini sovrapposte e il testo vengono rigenerati dagli input. Il pulsante Ridimensiona ti permette di ingrandire il progetto di 2x, 3x o 4x. C'è anche un'opzione reset per ripristinare la dimensione originale più piccola del progetto. Con questo metodo, puoi lavorare con un layout da 10 megapixel e ridimensionarlo fino a 160 megapixel quando hai finito. Il layout più grande può ancora essere lavorato direttamente in seguito, ma sarà più lento. - - TOPIC: ARRAY DI IMMAGINI +image: image-array.jpg - Seleziona molte immagini e uniscile in un formato a matrice compatto all'interno di una cornice colorata. - Il primo dialogo è mostrato in alto a sinistra. Colore Sfondo è il colore della cornice del contorno e degli spazi tra le immagini contenute. Larghezza Matrice è la larghezza complessiva della matrice di output, e Margine è la larghezza del margine esterno che circonda tutte le immagini. L'altezza della matrice è determinata dal numero di file immagine selezionati e dallo spazio richiesto per adattarli nella cornice. Colonne Immagine specifica il numero di colonne di immagini (6 nell'esempio sopra). Il numero di righe dipende dal numero di file immagine selezionati. I valori di Separazione impostano lo spazio orizzontale e verticale tra le immagini contenute. - Seleziona i file immagine ({SELEZIONA FILE IMMAGINE}), poi premi [Procedi] quando hai finito. L'immagine risultante verrà creata in pochi secondi (o minuti per centinaia di immagini). Questa immagine avrà tipicamente un margine inferiore molto irregolare, come mostrato dall'immagine in alto a destra sopra. La sequenza delle immagini nella matrice è determinata dall'ordine di selezione. La riga superiore viene riempita per prima, da sinistra a destra, poi la 2ª riga, ecc. - Il dialogo Ottimizza inizia automaticamente. Può riorganizzare le immagini in modo che il margine inferiore sia più uniforme. Premi [Avvia] e attendi che l'immagine si ottimizzi. Puoi osservare l'avanzamento. La funzione uscirà se viene trovato un ottimo che rende il margine inferiore uniforme entro 2 pixel. Potrebbe continuare a cercare indefinitamente se questo obiettivo non viene raggiunto. Premi [Ferma] per forzare la funzione di ottimizzazione a uscire con la migliore soluzione trovata finora. Se l'ottimizzazione ha successo, otterrai colonne uniformi come mostrato nell'immagine in basso a destra. Se il bordo inferiore è ancora irregolare dopo l'ottimizzazione, ti viene chiesto se vuoi aggiungere margini ad alcune delle immagini per rendere uniforme il bordo inferiore. Questo risulterà in un bordo inferiore uniforme, ma le spaziature verticali non saranno più uguali. - SUGGERIMENTO: l'ottimizzazione funziona meglio se il numero di immagini per colonna è almeno quattro (meglio di più). Questo dà all'ottimizzatore abbastanza flessibilità per trovare una soluzione con un bordo inferiore uniforme. - Appare l'ultimo dialogo, mostrato in basso a sinistra. Ora devi assegnare un nome file alla tua matrice. Viene avviato un dialogo di salvataggio file, e puoi salvare il nuovo file matrice ovunque. Se viene scelta l'opzione copia metadata, i metadata vengono copiati dal file di input scelto al file di output. Questo è utile se le immagini sono versioni modificate e vuoi che la matrice contenga la cronologia delle modifiche per l'ultima versione (o qualsiasi versione). - - TOPIC: MENU BATCH Queste sono funzioni che elaborano più file immagine selezionati, pochi o migliaia. Queste funzioni possono essere annullate a metà processo usando il tasto Esc, ma questo lascerà alcuni file elaborati e altri no. Un report popup mostra i nomi dei file man mano che vengono elaborati. - - TOPIC: CONVERSIONE BATCH +image: batch-convert.jpg - Questa funzione viene usata per rinominare, convertire, ridimensionare e spostare più file immagine. I file RAW possono anche essere convertiti in file immagine. La funzione viene eseguita in più thread paralleli per la massima velocità. - ^Input del Dialogo • Seleziona File - file da convertire ({SELEZIONA FILE IMMAGINE}). • Sostituisci Testo - sostituisci testo nei nomi file (vedi sotto). • Nuovo Nome - nuovo nome opzionale, testo inserito (vedi sotto). • Numeri di Sequenza - numero base e incremento per i nomi file di output. • Nuova Posizione - nuova cartella opzionale di posizione per i file di output. • Nuovo Tipo - tipo di file per i file di output, o "nessun cambiamento". • Profondità Colore - specifica 8 o 16 bit per output tif o png. • Larghezza Max., Altezza - limiti opzionali per i file di output (usati solo se è selezionato riduci o ingrandisci) • Ridimensiona - fattore di ridimensionamento opzionale per i file di output • Elimina Originali - elimina i file di input dopo la conversione riuscita. • Copia Metadata - copia tutti i metadata nei file di output. • Aggiorna Album - sostituisci i file dell'album con i file di output convertiti - ^Sostituisci Testo Se qui viene inserito del testo, i nomi dei file vengono scansionati per questo testo, e se trovato, viene sostituito il testo di sostituzione dato. Il testo di sostituzione può avere una lunghezza diversa e può anche essere vuoto, nel qual caso il testo viene rimosso dal nome del file. - ^Nuovo Nome e Plugin Il nuovo nome file può avere testo inserito: una data foto (dai metadata EXIF), un numero di sequenza, o il nome file originale. Specifica cosa e dove inserire come segue: • $oldname - il nome file originale viene inserito qui • $sss - un numero di sequenza progressivo viene inserito qui. Vedi sotto. • $yyyy $mm $dd - la data foto viene inserita in queste posizioni. - Esempio: San Francisco $yyyy:$mm:$dd $oldname $sss Il file di input "Golden Gate Bridge.jpg", con una data foto del 12 maggio 2014, verrebbe convertito nel nome file di output "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg". - Per "$sss", specifica la lunghezza del campo con il numero di caratteri 's', es. "$ss" sarà adeguato per numeri di sequenza fino a 99. Vengono aggiunti zeri iniziali per i numeri di sequenza con meno cifre. I numeri di sequenza che non si adattano alla lunghezza specificata vengono resi lunghi quanto necessario. Tieni presente che l'ordine di ordinamento dei nomi file nelle gallerie è strettamente ordine ascii, quindi la sequenza di numeri 1, 2 ... 9, 10 verrà ordinata come 1, 10, 2 ... 9. Puoi mantenere l'ordine numerico specificando una lunghezza di campo di 2 ($ss), risultando nella sequenza 01, 02 ... 09, 10. - Deve essere presente "$oldname" oppure "$sss" per assicurare che i nomi dei file di output siano unici. Se Nuova Posizione è mancante o invariata, elimina originali viene ignorato. Se un file di output esiste già, il file di input non viene convertito. - ^Larghezza e Altezza Max. Se sono selezionati riduci e/o ingrandisci, allora i file di output verranno ridimensionati entro questi limiti, mantenendo il rapporto larghezza/altezza originale. Se è selezionato riduci, i file più grandi di questi limiti vengono ridotti per rimanere entro i limiti. Se è selezionato ingrandisci, i file più piccoli di questi limiti vengono ingranditi in modo che la larghezza o l'altezza sia al limite corrispondente. Questo non può essere usato con l'opzione Ridimensiona. - ^Ridimensiona Se uno dei pulsanti è selezionato, i file di output vengono ridimensionati secondo il fattore scelto. Questo non può essere usato con l'opzione Larghezza e Altezza Max. - ^Elimina Originali Se selezionato, i file di input vengono eliminati, ma solo dopo che il file di output è stato creato con successo. - ^Copia Metadata Tutti i metadata vengono copiati dal file di input a quello di output. Ometti questa opzione per rimuovere i metadata. - ^Aggiorna Album Se selezionato, tutti gli album contenenti uno qualsiasi dei file di input vengono aggiornati ai file di output convertiti. - ^Preservare la Sequenza dei File Se specifichi un numero di sequenza iniziale ($sss), la sequenza di selezione dei file di input verrà preservata nella posizione di output. Così puoi selezionare i file immagine nell'ordine desiderato, o selezionare da un album con immagini ordinate, e preservare questa sequenza nell'output. - - TOPIC: COPIA/SPOSTA BATCH Copia o sposta il file immagine selezionato in una nuova posizione. Seleziona i file di input ({SELEZIONA FILE IMMAGINE}) da qualsiasi cartella conosciuta da Fotocx. Se è selezionato "Elimina Originali", allora i file di input verranno eliminati dopo averli spostati con successo nella nuova cartella. In questo caso, tutti gli album che fanno riferimento ai file di input ora eliminati vengono aggiornati con le nuove posizioni dei file. - - TOPIC: RADDRIZZAMENTO BATCH Questa funzione raddrizza i file immagine ruotati o capovolti (specchiati). Dipende dai dati EXIF per sapere se un file è ruotato/capovolto e in quale direzione. È molto più veloce di Conversione Batch. Puoi semplicemente selezionare tutti i file candidati e lasciare che trovi quelli che necessitano di una correzione. La velocità di ricerca è di circa 3000 file immagine al minuto su un computer potente. Ci sono due opzioni per specificare i file da cercare. Il pulsante [Seleziona file] porta a un dialogo di selezione file galleria ({SELEZIONA FILE IMMAGINE}). Se 'Esamina tutti i file' è selezionato, verranno cercati tutti i file immagine nelle tue cartelle principali. - - TOPIC: ELIMINA/CESTINA BATCH Seleziona i file ({SELEZIONA FILE IMMAGINE}). Seleziona l'opzione: elimina o sposta nel cestino. [Procedi]. I file vengono elencati in un report popup man mano che vengono eliminati o spostati nel cestino. Dopo che tutti i file sono stati eliminati/cestinati, gli album vengono scansionati e i file eliminati vengono rimossi. - - TOPIC: SOVRAPPOSIZIONE BATCH +image: batch-overlay.png - Una piccola immagine overlay può essere aggiunta in una posizione selezionata sulle immagini di input selezionate. Questo può essere usato per aggiungere una didascalia di credito, copyright, ecc. sopra le immagini. - Prepara l'immagine overlay come segue: usa Immagine Vuota per creare un'immagine base che conterrà il testo. La scala non importa, quindi rendila più grande del necessario. Usa Dipingi Trasparenza per dipingere l'intera immagine base trasparente. Usa {MARKUP} > disegna testo per mettere il testo desiderato sull'immagine base, usando font, colore, e altri attributi desiderati. Scala il testo per riempire la maggior parte dell'immagine base. L'immagine base (sfondo) è trasparente. Rimuovi i margini in eccesso con {RITAGLIA} se necessario. Salva l'immagine finale. Una posizione comoda è /saved_areas, ma può essere usata qualsiasi cartella. Questa immagine può ora essere usata come immagine overlay per Overlay Batch. - Usa il pulsante ^Seleziona i file immagine host^ per selezionare i file immagine host che riceveranno l'immagine overlay. Usa il pulsante ^Seleziona file overlay^ per selezionare il file immagine overlay. - I due input ^Posizione overlay^ determinano dove l'immagine overlay viene posizionata sull'immagine host, da 1-99% della distanza dall'alto al basso, e 1-99% della distanza da sinistra a destra. 0/0 significa l'angolo in alto a sinistra, 99/99 significa l'angolo in basso a destra. L'immagine overlay verrà posizionata in modo da non estendersi oltre i bordi dell'immagine host. - Specifica ^Larghezza overlay^ come percentuale della larghezza dell'immagine host. L'altezza verrà impostata per conservare il rapporto larghezza/altezza. Se ^Rendi costante la larghezza per la dimensione finestra^ è selezionato, la dimensione visiva dell'immagine overlay verrà resa costante per la dimensione finestra specificata sotto. Senza questo, un'immagine "alta" che viene visualizzata con grandi margini sinistro e destro avrebbe un'immagine overlay visivamente più piccola. La dimensione iniziale della finestra è la finestra corrente. Puoi inserire qualsiasi dimensione. Premi ^aggiorna^ per impostare la finestra corrente se questa è cambiata. - Se ^Sostituisci file host^ è selezionato, i file host di input vengono sostituiti con i file host di output con overlay. Se ^Crea nuove versioni^ è selezionato, vengono create nuove versioni dei file host di input. - - TOPIC: KEYWORDS BATCH +image: batch-keywords.jpg - Aggiungi, rimuovi, o cambia le keyword per un gran numero di file immagine contemporaneamente. - Usa il pulsante [select files] per selezionare i file immagine ({SELEZIONA FILE IMMAGINE}). - Il dialogo mostra due elenchi di keyword: quelle da aggiungere ai file selezionati, e quelle da rimuovere. Le keyword disponibili sono mostrate nella finestra Keyword Definite sottostante. Una di queste può essere aggiunta all'elenco keyword attualmente selezionato (aggiungi o rimuovi) cliccandoci sopra. Una keyword può essere eliminata da entrambi gli elenchi keyword cliccandoci sopra. Per sostituire le keyword, specifica le nuove keyword nell'elenco aggiungi keyword e le vecchie keyword nell'elenco rimuovi keyword. - Se l'elenco delle keyword definite è lungo, potrebbe essere più facile digitare la keyword desiderata in Inserisci Nuova Keyword. Le keyword esistenti che corrispondono a quanto digitato finora appariranno in Keyword Corrispondenti, e puoi puntare e cliccare su una di queste per aggiungere la keyword all'immagine. Se la keyword inserita è nuova (non viene mostrata nessuna keyword corrispondente), premi [Aggiungi] quando la keyword è completa. Verrà aggiunta all'elenco keyword selezionato e all'elenco delle keyword definite sotto la categoria "nocatg". - Se stai usando categorie di keyword, puoi selezionare una categoria, e solo quelle keyword verranno mostrate nell'elenco delle keyword definite. Se il tuo elenco di keyword è enorme, questo può ridurre l'elenco a una dimensione gestibile per puntare e cliccare. - Per ottenere un elenco di immagini con keyword specifiche che vuoi rimuovere o sostituire, usa {CERCA IMMAGINI} per trovare le immagini, poi avvia questa funzione e usa [select files] per aggiungere tutti i file immagine che hai appena trovato, oppure seleziona un qualsiasi sottoinsieme. - - TOPIC: RINOMINA KEYWORDS BATCH +image: batch-rename-keywords.png - Rinomina un numero qualsiasi di keyword e applica questi cambiamenti all'intera raccolta di immagini. Clicca su una keyword da rinominare dall'elenco delle keyword definite, inserisci un nuovo nome nel campo Rinomina in, poi clicca sul pulsante freccia per aggiungere questa coppia di nomi all'elenco sul lato destro. Ripeti per ciascuna keyword da rinominare. Clicca sulla coppia di nomi nell'elenco per rimuoverli. Premi [Procedi] quando hai finito. Se vuoi eliminare una keyword senza rinominarla, usa 'delete' come nuovo nome. - Una finestra popup mostra il numero di file immagine contenenti i nomi keyword interessati. Premi [Sì] per procedere. La velocità di aggiornamento è di circa 500/minuto su un computer potente. Al prossimo avvio di Fotocx, la funzione file indice aggiornerà tutti i thumbnail per le stesse immagini, poiché la data di modifica del file è cambiata. - - TOPIC: ELIMINA KEYWORDS BATCH +image: batch-purge-keywords.jpg - Elimina le keyword indesiderate da tutti i file immagine. Questo è particolarmente utile per eliminare keyword indesiderate che sono state aggiunte da file immagine scaricati. Clicca sulle keyword indesiderate sul lato sinistro del dialogo per aggiungerle all'elenco di eliminazione sul lato destro del dialogo. Premi [proceed] quando hai finito. - - TOPIC: DATA FOTO BATCH +image: batch-photo-date1.png +image: batch-photo-date2.png - Correggi rapidamente un gruppo di foto che non hanno data/ora foto o ne hanno una errata. Usa il pulsante [select files] per aprire una finestra galleria dove puoi selezionare i file immagine da elaborare ({SELEZIONA FILE IMMAGINE}). - Ci sono due modi per cambiare data/ora foto: • Imposta una nuova data/ora (immagine a destra sopra): inserisci solo un nuovo anno (aaaa) - solo l'anno viene sostituito nei file. Inserisci solo una data (aaaa:mm:gg) - la data viene sostituita ma non l'ora. Inserisci una data/ora completa (aaaa:mm:gg hh:mm:ss) - entrambe vengono sostituite. • Sposta data/ora esistente (immagine a sinistra): inserisci valori + o - in uno qualsiasi dei 6 campi: anni, mesi, giorni, ore, minuti, secondi. Le date/ore verranno spostate dei valori inseriti. - I valori di data/ora spostati si propagano al valore superiore successivo quando necessario: L'ora 08:30 spostata di -50 minuti risulta in 07:40 La data 2016-10-20 spostata di +6 mesi e -30 giorni risulta in 2017-03-21 (marzo ha 31 giorni). - Se la casella 'test' è selezionata, viene prodotto un report delle vecchie e nuove date/ore per i file selezionati per l'ispezione. Non vengono apportate modifiche ai file. Se sei soddisfatto che i risultati siano corretti, deseleziona la casella ed esegui di nuovo per aggiornare i file. - - TOPIC: MODIFICA META BATCH +image: batch-change-meta.png - Rivedi i metadata per più file immagine. Puoi aggiungere nuovi metadata, rivedere metadata esistenti, ed eliminare metadata. Usa il pulsante [select files] per aprire una finestra galleria da cui selezionare i file da elaborare {SELEZIONA FILE IMMAGINE}. Inserisci i nomi dei tag di metadata e i valori da assegnare, oppure lascia vuoto il valore per eliminare il tag. Premi [applica]. Riceverai un messaggio di conferma e puoi procedere o annullare a questo punto. Un elenco di nomi di tag comunemente usati è fornito a sinistra. Clicca su uno di questi per inserirlo nel primo campo nome tag vuoto nel dialogo. Questo elenco proviene dal file /metadata_picklist, che puoi modificare per aggiungere altri tag all'elenco. Il pulsante [Elenco completo] fornisce informazioni su come ottenere un elenco di tutti i nomi di tag disponibili. - - TOPIC: REPORT META BATCH +image: add-meta-tags.png +image: batch-report-meta.png - Genera un report di qualsiasi metadata per un numero qualsiasi di immagini. L'output è un file di testo che viene visualizzato nell'editor di testo predefinito del tuo sistema. Puoi usare le funzioni di ricerca dell'editor di testo per trovare immagini corrispondenti ai metadata desiderati, oppure puoi usare il file di testo come input per altri programmi. Usa il pulsante [select files] per aprire una finestra galleria per selezionare i file da elaborare ({SELEZIONA FILE IMMAGINE}). Il pulsante [modifica] apre un nuovo dialogo (a destra) dove puoi selezionare i tag di metadata da riportare. Clicca su un tag nella colonna sinistra per aggiungerlo alla colonna destra e al report. Clicca su un tag nella colonna destra per rimuoverlo. Clicca sull'ultimo tag nella colonna sinistra, "Altro tag ...", per digitare qualsiasi nome di tag non presente nell'elenco, che contiene solo i tag più probabilmente necessari. - - TOPIC: GEOTAG BATCH +image: batch-geotags.png - Seleziona molte immagini e aggiungi a tutte gli stessi dati di posizione. Usa il pulsante [select files] per selezionare i file immagine da una finestra galleria ({SELEZIONA FILE IMMAGINE}). Poi ottieni i dati di posizione come descritto in {MODIFICA META PRINCIPALI}, usando il pulsante [Trova] o cliccando su un marcatore della mappa. Usa questa funzione anche per correggere incoerenze nell'ortografia della posizione o nei dati latitude/longitude. Se posizione e/o paese vengono lasciati vuoti, non vengono aggiornati. Per cancellare posizione o paese, inserisci il nome "null". Se latitude e longitude vengono lasciate vuote, non vengono aggiornate. Per cancellare latitude e longitude, inserisci "0" per entrambi i valori. Puoi aggiornare solo posizione/paese, solo latitude/longitude, oppure entrambi. In pratica, potresti scoprire che il GPS della fotocamera inserisce latitude e longitude senza posizione e paese, oppure usa una lingua indesiderata, o tutte lettere maiuscole, o qualche altro valore che necessita di riparazione. - - TOPIC: ESPORTA FILE Copia i file immagine selezionati in un'altra cartella. L'uso previsto è per copiare file da condividere con altri, es. caricare file su un sito web. I file di output sono JPEG. Puoi opzionalmente ridurre le immagini. Seleziona i file immagine cliccando sui thumbnail della galleria ({SELEZIONA FILE IMMAGINE}). Seleziona una cartella dove i file immagine verranno copiati. Se è selezionato 'esporta metadata', viene copiato anche un insieme limitato di metadata. Questi sono: data foto, keyword, copyright, titolo, descrizione. - - TOPIC: MENU STRUMENTI - - TOPIC: INDICIZZA FILE +image: index-files1.png - Fotocx deve conoscere tutti i nomi delle tue cartelle e file immagine e i metadata incorporati (date, tag, geotag, titoli, descrizioni, valutazioni). Questi dati vengono indicizzati per una ricerca veloce. Fotocx crea anche immagini thumbnail in modo che le finestre galleria (pagine thumbnail) vengano visualizzate velocemente. Fotocx non modifica né copia i tuoi file immagine. Lo spazio richiesto è tipicamente il 2% dello spazio dei tuoi file immagine. - La funzione Indicizza File viene eseguita ogni volta che Fotocx viene avviato. Questa funzione creerà i thumbnail mancanti, sostituirà quelli obsoleti, e aggiornerà l'indice dei metadata usando i dati attuali dai tuoi file immagine. Questo potrebbe richiedere tempo significativo se hai molte migliaia di nuovi file. - I file immagine modificati o spostati all'interno di Fotocx vengono gestiti automaticamente. La funzione Indicizza viene usata solo per nuovi file immagine creati dall'esterno di Fotocx (es. è stato aggiunto un nuovo gruppo di foto), e per file modificati o spostati dall'esterno di Fotocx. - Inserisci le tue cartelle immagine principali (es. /home//Immagini). Usa il pulsante [sfoglia] per individuare e aggiungere cartelle. Queste cartelle e qualsiasi sottocartella contenuta verranno elaborate. Non importa se altri file sono mescolati con le immagini. Elimina una voce cliccando sulla 'X' corrispondente. - Inserisci la cartella thumbnail dove verranno memorizzati i file thumbnail. Usa quella predefinita fornita o imposta la tua posizione. - Se hai usato nomi di cartelle o file per classificare le tue immagini, puoi farne uso immediato nella funzione {CERCA IMMAGINI}. Se hai salvato date, keyword, geotag, titoli, o valutazioni nei metadata delle tue immagini, questi saranno anch'essi ricercabili. Dopo che le immagini sono indicizzate, la ricerca per uno qualsiasi di questi è quasi istantanea. - ^Tag Metadata I seguenti metadata sono inclusi nell'indice immagine per default: • nomi di cartelle e file • data/ora foto • data/ora modifica file • titolo e descrizione (metadata exif) • valutazione (0-5 stelle) • keyword (etichette utente) • geotag (nomi di paese e posizione e latitude/longitude) • fotocamera: marca, modello, obiettivo • esposizione: tempo, numero f, lunghezza focale, ISO - ^Tag Metadata Extra +image: index-files2.png - Puoi aggiungere fino a 20 altri tag di metadata all'indice dei file immagine. I metadata in questo elenco possono essere cercati velocemente quanto i tag standard. Potresti non averne bisogno, ma se a volte hai bisogno di cercare tag di metadata non standard, puoi aggiungerli qui e la velocità di ricerca sarà quasi istantanea. Premi il pulsante [select] per "metadata extra" per ottenere il dialogo sopra. Clicca sui tag nell'elenco sinistro per aggiungerli all'elenco destro - i tag da aggiungere all'indice. Clicca su un tag nell'elenco destro per rimuoverlo. Premi [done] per confermare i cambiamenti. L'intera tua raccolta di immagini verrà indicizzata di nuovo. Questo procederà più velocemente dell'indicizzazione iniziale poiché i thumbnail non vengono ricreati. - ^Accesso a File e Cartelle non Indicizzati Un file immagine o cartella non indicizzato è uno che non è incluso nelle tue cartelle immagine principali dichiarate (le sottocartelle delle tue cartelle immagine dichiarate sono sempre incluse). Puoi navigare verso tale cartella e visualizzare i thumbnail normalmente, e puoi visualizzare e modificare tali file normalmente. Ci sono limitazioni che dovresti capire: • Questi file mancheranno da qualsiasi risultato di ricerca e vista mappa. • I thumbnail vengono creati al momento della visualizzazione - le gallerie saranno lente. Se accedi a un dispositivo di archiviazione portatile (lento) (es. scheda SD della fotocamera), noterai le prestazioni lente. I thumbnail verranno creati secondo necessità, e rimarranno dopo che il dispositivo viene rimosso. Suggerimento: copia i file in una cartella dichiarata di Fotocx, poi fai qualsiasi elaborazione necessaria da questa posizione. Le prestazioni saranno molto migliori. - ^Archiviazione Rimovibile (unità USB) Se le tue cartelle immagine principali includono cartelle su un'unità rimovibile, ed esegui Fotocx senza l'unità montata, i dati indice e i thumbnail vengono comunque preservati, anche se i file rimovibili sono scomparsi. Quando l'unità rimovibile viene montata di nuovo, e Fotocx viene avviato, viene ripristinato l'ultimo stato. Se nel frattempo sono stati aggiunti o modificati dei file, i dati indice e i thumbnail vengono aggiornati. - - TOPIC: SPOSTA HOME FOTOCX La cartella home di Fotocx contiene tutte le impostazioni e i dati dell'utente, inclusi alcuni file dal pacchetto Fotocx che possono essere personalizzati dall'utente. Posizione predefinita: /home//.fotocx. Se sono installate più versioni o release di Linux, potrebbe essere desiderabile avere una cartella home Fotocx condivisa invece di una per ciascuna release. Lo stesso potrebbe valere se più utenti hanno bisogno di accedere alla stessa istanza di Fotocx. - Usa questa funzione per spostare altrove la cartella home di Fotocx. La cartella selezionata dovrebbe includere "fotocx" nel nome del percorso, oppure "/fotocx" verrà aggiunto se non presente. - Vedi {PARAMETRI COMANDO} parametro -home se vuoi più raccolte di immagini Fotocx, gestite separatamente. - - TOPIC: IMPOSTAZIONI +image: settings.jpg - Varie preferenze e impostazioni utente vengono raccolte e salvate nel file /parameters. La maggior parte dei cambiamenti viene applicata immediatamente. Alcuni faranno riavviare Fotocx. - • Seleziona il codice lingua a 2 caratteri desiderato. Fotocx si riavvierà nella lingua selezionata. • Vista di Avvio - visualizzazione iniziale quando Fotocx viene avviato. File Recenti: i file immagine visti più di recente File Più Recenti: file aggiunti/modificati più di recente Galleria Specifica: la galleria cartella specificata Galleria Album: la galleria album specificata Galleria Precedente: galleria usata l'ultima volta nella sessione precedente File Precedente: file visualizzato l'ultima volta nella sessione precedente File Specifico: il file immagine specificato Pulsante Sfoglia: seleziona una cartella, album, o file immagine • Sfondo - colori di sfondo per le finestre Vista File e Vista Galleria • Stile Menu - stile di visualizzazione del menu: icone, testo, o entrambi • Colori Menu - colore del testo e colore di sfondo del menu • Font Dialogo - font per menu e dialoghi • Mostra Nascosti - se selezionato, mostra file e cartelle nascosti • Velocità Zoom - scegli 1-8 clic o tasti [+] per ogni raddoppio dell'immagine • File JPEG - livello di qualità, predefinito 90, usa 70+ per buona qualità • Nodo Curva - separazione minima dei nodi per le curve di modifica, % della scala. Il predefinito è 5% della scala. Usa un valore più alto per i touchpad. • Posizione Immagine - l'immagine è a sinistra/centro/destra all'interno di una finestra più larga • Conferma Uscita - opzione dialogo popup: vuoi davvero uscire? • Livello Indice - vedi sotto • Loader RAW - vedi sotto • Opzioni RAW - vedi sotto • File RAW - elenco dei tipi di file RAW usati • File Video - elenco dei tipi di file video usati • App Video - vedi sotto - ^Qualità e Compressione File Livello di qualità file JPEG: usa 70 o superiore per una buona qualità dell'immagine (predefinito 90). Il metodo di compressione dei file TIFF è DEFLATE (migliore per immagini a colori). Il livello di compressione dei file PNG è '1'. Valori più alti sembrano solo aumentare il tempo di salvataggio del file (libpng). - ^Posizione Immagine Se la finestra è più larga dell'immagine (cioè il rapporto larghezza/altezza della finestra > immagine), l'immagine può essere spostata sul lato sinistro, centrata, o sul lato destro. Se sinistra o destra, il margine non usato viene massimizzato, il che può essere più comodo per posizionare le finestre di dialogo. - ^Livello Indice Immagine Questi due parametri governano un compromesso tra il tempo di avvio e la completezza dell'indice immagine. • $ fotocx: si applica quando fotocx viene avviato usando un comando shell, menu di sistema, o icona/launcher di sistema. Il valore consigliato di '2' significa indicizzazione completa: carica il vecchio file indice, cerca nuovi file (non ancora indicizzati) e aggiorna il file indice fotocx. • $ fotocx : si applica quando fotocx viene avviato cliccando su un nome file in un elenco del file manager. Il valore consigliato di '1' significa carica il vecchio file indice ma non cercare nuovi file per aggiornare l'indice. L'avvio è moderatamente veloce. Le funzioni di ricerca immagini e mappa funzionano normalmente, ma qualsiasi nuovo file immagine (non ancora indicizzato) non è incluso. • Alternativa: '0' significa nessuna indicizzazione. L'avvio è molto veloce. L'uso successivo di una funzione di ricerca immagini o mappa avvierà la funzione di indicizzazione file solo per i vecchi file (nessuna ricerca di file nuovi/modificati). Usa questa opzione se la tua raccolta di immagini è gigantesca e il tempo di avvio supera qualche secondo. Puoi avviare la funzione di indicizzazione più tardi se necessario. - ^Loader RAW Il loader RAW è il comando usato per leggere un file RAW e convertirlo in TIFF con profondità colore a 16 bit. Viene usato quando un file RAW viene visualizzato. Puoi usare le funzioni di modifica di Fotocx per modificare e ottimizzare il file. Il loader RAW predefinito è dcraw usando lo spazio colore sRGB. Alcune altre opzioni che usano dcraw o rawtherapee sono fornite nell'elenco di selezione. Questi comandi sono conservati nel file 'raw_commands_*' nella cartella home di Fotocx. Modifica questo file per cambiare o aggiungere nuove opzioni (vedi sotto). Potresti voler preparare più comandi per più fotocamere o più opzioni di elaborazione. Se preferisci usare un editor RAW in modo interattivo, crea un comando plugin per questo - vedi {PLUGIN}. - ^Opzioni RAW • modifica comandi: premi il pulsante per modificare l'elenco dei comandi loader RAW. Si avvierà un editor di testo in una nuova finestra, con l'elenco attuale dei comandi. • abbina colore immagine incorporata: usa l'immagine incorporata nel file RAW come guida per mappare i colori dell'immagine RAW all'immagine TIFF convertita. Questa è l'interpretazione del produttore della fotocamera dei dati RAW - un buon punto di partenza se il file RAW necessita di ulteriore modifica. L'immagine incorporata è di solito la stessa del file JPEG dalla fotocamera. - ^App Video Inserisci un comando shell per avviare un'app di riproduzione video. Usa '%s' per segnare dove viene inserito il nome del file video nella riga di comando. Ecco alcuni esempi: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: SCORCIATOIE DA TASTIERA +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - Visualizza o cambia le scorciatoie da tastiera personalizzate. Le scorciatoie attualmente assegnate sono mostrate nella prima finestra. Se premi il pulsante [Modifica], viene mostrato il secondo dialogo, dove puoi aggiungere e cambiare le scorciatoie da tastiera. Inserisci una nuova scorciatoia usando la tastiera. Puoi usare i tasti A-Z, 0-9, F2-F9, e la maggior parte dei simboli (% $ & * < ecc.). Puoi combinare un tasto con uno di Ctrl/Alt/Shift: premi e tieni premuto UNO tra Ctrl/Alt/Shift, poi premi il tasto, poi rilascia entrambi. Seleziona una delle assegnazioni di menu disponibili dall'elenco a destra, poi premi [Aggiungi] e [OK]. Rimuovi una scorciatoia selezionandola e premendo [Elimina]. - - TOPIC: ISTOGRAMMA RGB +image: RGB-hist.png - Una piccola finestra mostra un grafico istogramma di luminosità dell'immagine corrente in Vista File, oppure dell'area attualmente selezionata dell'immagine. Questo grafico si aggiorna in modo sincrono man mano che le funzioni di modifica cambiano l'immagine. Usa i pulsanti [Tutto] [Rosso] [Verde] [Blu] per selezionare i colori da mostrare. - - TOPIC: INGRANDISCI IMMAGINE +image: magnify-image.jpg - Ingrandisci l'immagine in un'area intorno al puntatore del mouse. Trascina con il tasto sinistro il mouse intorno all'immagine per ingrandire aree diverse, analogamente alla visualizzazione di un'immagine stampata con una lente d'ingrandimento. Usa il dialogo per regolare il raggio dell'area e la quantità di ingrandimento. - - TOPIC: MISURA IMMAGINE Clicca due posizioni qualsiasi all'interno di un'immagine per misurare la distanza in pixel tra i punti. Le posizioni cliccate sono etichettate A e B sull'immagine. Queste etichette mostrano sempre gli ultimi due punti cliccati. Il dialogo viene aggiornato con le distanze che separano questi due punti: Distanza-X (distanza orizzontale) Distanza-Y (distanza verticale) Distanza-H (distanza totale) - - TOPIC: MOSTRA RGB +image: show-RGB.png - Quando viene cliccato un punto sull'immagine, i valori RGB vengono mostrati in una finestra di dialogo. Vengono visualizzati gli ultimi 9 punti cliccati. I valori hanno il formato xxx.dd, dove xxx sono gli 8 bit superiori del valore colore e .dd sono gli 8 bit inferiori. L'intervallo va da 0.00 a 255.99. Gli 8 bit inferiori sono zero a meno che l'immagine non sia in fase di modifica o abbia più di 8 bit di profondità colore. Gli output vengono aggiornati in tempo reale se l'immagine è in fase di modifica. Se "etichette" è selezionato, i punti vengono etichettati sull'immagine con lettere corrispondenti alle lettere nella finestra di dialogo. Se "delta" è selezionato e l'immagine è in fase di modifica, allora vengono mostrati i cambiamenti RGB invece dei valori assoluti. - Se apri un'altra immagine (es. per confrontarla con l'immagine precedente), le posizioni vengono mantenute e aggiornate se sono all'interno dei confini della nuova immagine. Questo facilita il confronto delle immagini a livello di valori RGB dei pixel. - - TOPIC: IMPOSTAZIONI GRIGLIA +image: grid-settings.jpg - Ci sono due funzioni di linee griglia: Impostazioni Griglia imposta tutti i parametri della griglia. Alterna Griglia attiva o disattiva le linee della griglia. Le linee della griglia sono linee orizzontali e verticali a intervalli regolari attraverso l'immagine. Queste linee possono essere utili guide di allineamento quando un'immagine viene raddrizzata o deformata per raddrizzare pareti o altri oggetti nell'immagine. Usa gli input conteggio-x e conteggio-y per impostare rispettivamente il numero di linee verticali e orizzontali. I controlli offset-x e offset-y possono essere usati per spostare le linee della griglia in modo che intersechino una posizione desiderata nell'immagine. Una scorciatoia da tastiera (predefinita shift+G) può essere assegnata ad Alterna Griglia, così le linee della griglia possono essere attivate o disattivate con un solo tasto. - - TOPIC: COLORE LINEA Alcune funzioni disegnano linee sopra l'immagine (Ritaglia, Seleziona Area, altre). Puoi cambiare il colore di queste linee per massimizzare il contrasto rispetto all'immagine di sfondo. Il piccolo dialogo può essere lasciato aperto durante la modifica, per passare comodamente tra i colori disponibili (nero, bianco, rosso, verde). - - TOPIC: PIXEL SCURI/CHIARI Evidenzia i pixel più scuri e più chiari in un'immagine. Regola i due controlli a incremento per impostare le soglie di luminosità, che sono inizialmente 0 per i pixel scuri e 255 per i pixel chiari. I pixel con una luminosità inferiore alla soglia scura o superiore alla soglia chiara vengono fatti "lampeggiare" per farli risaltare. Usa questa funzione per rilevare il clipping dopo aver modificato luminosità o colore. - - TOPIC: COLORE MONITOR +image: moncolor-small.png - Otto bande di colore vengono scritte sullo schermo con luminosità da zero (nero) a 100%. Puoi usare questo per regolare la luminosità e il contrasto del tuo monitor. Non dovrebbero esserci regioni invariate a nessuna delle due estremità delle bande. - - TOPIC: TROVA DUPLICATI +image: find-dups.png - Trova file immagine duplicati ovunque nel tuo database di immagini. Un file duplicato può essere un file che duplica esattamente o "quasi" un altro file. Per motivi di velocità, le immagini thumbnail vengono confrontate in memoria. È possibile che vengano trovati thumbnail corrispondenti per immagini principali con piccole differenze non riflesse nei thumbnail. Una copia di un'immagine che è stata ridotta di dimensione probabilmente verrà classificata come duplicato. La dimensione del thumbnail può essere impostata da 32 a 512 pixel. Una dimensione maggiore riduce la probabilità di falsi positivi. La dimensione del thumbnail influisce notevolmente sulla quantità di memoria principale richiesta - es. per 100K immagini, la dimensione 64 richiede circa 880 MB, mentre la dimensione 256 richiede circa 14 GB. Premi il pulsante [calculate] per calcolare la dimensione massima del thumbnail che può stare nella memoria libera disponibile. - Due parametri vengono usati per impostare la sensibilità per il rilevamento di immagini identiche o quasi identiche: differenza pixel è la differenza di valore RGB al di sotto della quale i pixel sono considerati uguali. Conteggio pixel è il numero di pixel diversi al di sotto del quale due immagini vengono classificate come duplicati. Esempio: se differenza pixel = 2 e conteggio pixel = 10, allora le immagini vengono classificate come duplicati se meno di 10 pixel differiscono di 2 o meno. - L'output è una galleria che mostra ciascun insieme di immagini duplicate. La galleria di output viene salvata come album "Immagini Duplicate". Puoi usare Elimina/Cestina Batch insieme a questo album per scegliere quali duplicati eliminare. - - TOPIC: TROVA FILE DANNEGGIATI Tutti i file immagine all'interno delle tue cartelle principali dichiarate vengono letti. Per ciascun file che non può essere letto, hai tre opzioni: • elimina il file • correggi un tipo di file errato (vedi sotto) • sposta il file da qualche parte fuori dalle tue cartelle immagine principali Ho spesso visto file .png con estensione .jpg. I browser web e alcune altre app gestiscono questo silenziosamente. Qui, il tipo di file corretto viene riportato e puoi cambiare l'estensione in quella corretta. - - TOPIC: MOSTRA RISORSE Riporta le risorse del computer usate da Fotocx: • Tempo CPU: utilizzo dall'avvio di Fotocx o dall'ultimo campione • Memoria reale: la memoria reale attualmente in uso (esclusa la swap) • Cache mappe: MB di spazio disco usato per i tile mappa in cache • Cancella cache: elimina tutti i tile mappa in cache • Pulsante [Sample]: prendi un nuovo campione e riporta i dati - Il pulsante [Sample] azzera il tempo CPU. Il prossimo campione mostrerà solo il nuovo tempo CPU accumulato. Il tempo CPU è la somma per tutti i thread di processo. - - TOPIC: TRADUZIONI Le traduzioni per diverse lingue sono incluse nel pacchetto Fotocx. Queste traduzioni AI non sono perfette. Gli errori di traduzione possono essere corretti modificando i file di traduzione. - ^Cambiare la lingua della GUI Il menu {IMPOSTAZIONI} può essere usato per cambiare la lingua. La lingua può anche essere impostata quando Fotocx viene avviato: $ fotocx -lang xx # lingua xx (de fr zh ecc.) $ fotocx -lang en # inglese - ^Modificare una traduzione della GUI Modifica il file /translations/gui_xx Le coppie di righe di testo hanno numeri iniziali a 4 cifre che devono corrispondere. La prima riga è in inglese, la 2ª riga è nella lingua xx. Modifica solo la riga xx, mai la riga inglese. I caratteri speciali per inserire parametri nel testo devono rimanere nella stessa sequenza. Questi sono '%d' (parametro intero), '%f' (decimale), '%s' (testo). - ^Modificare una traduzione della guida utente Modifica il file /translations/ug_xx Modifica ug_xx per correggere la traduzione. Non aggiungere o rimuovere righe di testo né cambiare la sequenza. Le righe di testo devono corrispondere 1:1 con la guida utente inglese, ug_en. - Invia i file rivisti per l'inclusione nella prossima release di Fotocx: mkornelix@gmail.com - - TOPIC: MENU AIUTO • Guida Utente - mostra l'indice • Tutorial Video - mostra un tutorial video di Fotocx su YouTube • Programmi Esterni - elenca i programmi esterni e le loro funzioni • Mostra File di Log - visualizza le informazioni registrate e i messaggi di errore • Parametri da Riga di Comando - mostra i parametri disponibili da riga di comando • Changelog - mostra le aggiunte e le correzioni di bug nelle release recenti • Copyright - mostra i copyright e le licenze rilevanti per Fotocx • Privacy - mostra la politica sulla privacy (regole) per Fotocx • Informazioni - mostra il numero di release, la posizione dell'eseguibile, il contatto • Home Page - mostra la home page di Fotocx su kornelix.net • Disinstalla - come disinstallare Fotocx - - TOPIC: ALTRI ARGOMENTI I seguenti argomenti non sono collegati ai menu di Fotocx. - - TOPIC: VIDEO FILES I file video (.mpeg, .mp4, ecc.) possono essere mescolati con i tuoi file immagine. Verranno mostrati come file immagine sia in Vista File sia in Vista Galleria. Il tasto 'P' avvierà, metterà in pausa, e riprenderà il video, o riprodurrà di nuovo un video che è terminato. Il tasto 'Q' chiuderà il video. Usa il menu {IMPOSTAZIONI} per selezionare l'applicazione per riprodurre i file video. - - TOPIC: DIAPOSITIVE E NEGATIVI +image: color-negative.jpg - Puoi usare una fotocamera con capacità macro per catturare diapositive o negativi fotografici. Usa un tavolo luminoso per l'illuminazione, oppure usa il cielo (esempio sopra). Per elaborare un negativo a colori, prima crea un positivo - vedi {MODALITÀ COLORE}. Se l'immagine è velata, seleziona solo l'area dell'immagine, escludendo i bordi della pellicola, e poi usa {RETINEX GLOBALE} per eliminare la velatura. Imposta i punti bianco e nero cliccando sull'immagine se necessario per ridurre ulteriormente la velatura. - - TOPIC: LIMITAZIONI DI FOTOCX • C'è un limite fisso di un milione di file. • versioni immagine - fino a 99 versioni per annulla/ripeti e denominazione versione. • keyword immagine - 10K keyword totali. 1000 caratteri per una singola immagine. • Le gallerie sono limitate a 40K file immagine. • le dimensioni massime dell'immagine sono 40K x 20K pixel. - - TOPIC: FOTOCX PER WINDOWS 11 Fotocx può essere usato in Windows 11 installando Windows Subsystem for Linux 2, o WSL2. C'è ampia documentazione su internet su come farlo. - Se i tuoi file immagine sono nel file system Windows (NTFS), Fotocx sarà molto lento. Perciò sposta i tuoi file immagine nel file system Linux. Puoi ancora accedervi usando Windows File Explorer e altre app Windows, quindi non si perde nulla. Microsoft raccomanda anche il file system Linux per prestazioni migliori. Usa l'icona 'Linux' in File Explorer per accedere alla tua cartella home nel file system Linux. Aggiungi una cartella Immagini se necessario, e sposta lì i tuoi file immagine. - Se è disponibile un pacchetto Fotocx, installalo. Altrimenti, fai quanto segue: Scarica il file del pacchetto binario Fotocx da ^https://kornelix.net. Nel terminale Linux: $ cd /mnt/c/Users//Downloads # vai alla cartella download di Windows $ tar -xzf fotocx-xxx-bin.tar.gz # decomprimi il pacchetto nella cartella fotocx $ cd fotocx # vai alla cartella fotocx $ chmod u+x install.sh # rendi eseguibile lo script di installazione $ ./install.sh # esegui lo script, installa fotocx $ fotocx # avvia Fotocx Potresti dover riavviare la finestra Linux affinché l'ultimo passaggio funzioni. - Leggi le parti introduttive di questa guida utente. Fotocx ha funzionalità approfondite. Non aspettarti di padroneggiare Fotocx in pochi minuti. - - TOPIC: PRIVACY Fotocx non conserva alcun dato utente oltre ai file immagine e ai loro metadata. I metadata dovrebbero essere rimossi dai file immagine prima di caricarli su internet, e Fotocx fornisce un metodo semplice per farlo. - - TOPIC: PROBLEM, QUESTION, SUGGESTION Invia un'email a mkornelix@gmail.com. Se c'è un dump di crash (file zappcrash) invia anche questo. - fotocx/data/translations/gui_ja0000664000175000017500000042137615247006657015666 0ustar micomico0000 + Zoom-in \n 0000 + ズームイン \n 0001 - Zoom-out \n 0001 - ズームアウト \n 0002 = Zoom-in \n 0002 = ズームイン \n 0003 Arrow keys Previous/Next file \n 0003 矢印キー 前/次のファイル \n 0004 Delete Delete/Trash file \n 0004 Delete 削除/ゴミ箱へ \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Escape ダイアログを閉じる / Fotocx を終了 \n 0006 F1 User Guide, Context Help \n 0006 F1 ユーザーガイド、コンテキストヘルプ \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 全画面表示 / メニュー非表示 \n 0008 Home/End Gallery start/end \n 0008 Home/End ギャラリーの先頭/末尾 \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 インデックス作成にかかる時間は、画像ファイルの数・種類・サイズや \n コンピューターの速度によって異なります。1分間に数百枚から \n 1万枚以上まで幅があります。 \n インデックスのオプションは後から次のメニューで変更できます: \n ツール > インデックス、ツール > 設定。 \n 0010 Page keys Gallery page up/down \n 0010 Page keys ギャラリーのページ送り/戻し \n 0011 Z 1x <--> fit to window \n 0011 Z 等倍 <--> ウィンドウに合わせる \n 0012 $s plugin needs base and adder 0012 $s プラグインには base と adder が必要です 0013 % from left: 0013 左からの%: 0014 % from top: 0014 上からの%: 0015 %d albums selected 0015 %d 個のアルバムを選択 0016 %d image files selected 0016 %d 個の画像ファイルを選択 0017 %d images 0017 %d 枚の画像 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 %d 個の keyword を \n%d 個の画像ファイルから削除します。 \n続行しますか? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 %d 個の keyword を \n%d 個の画像ファイルで名前変更します。 \n続行しますか? 0020 %d max images exceeded 0020 最大画像数 %d を超えました 0021 %d red-eye limit reached 0021 赤目上限数 %d に達しました 0022 %s %s %d folders %d files 0022 %s %s %d フォルダー %d ファイル 0023 %s *** date/time conversion failed \n 0023 %s *** 日付/時刻の変換に失敗しました \n 0024 %s ALBUM %s %d files 0024 %s アルバム %s %d ファイル 0025 %s NEWEST FILES 0025 %s 最新ファイル 0026 %s RECENT FILES 0026 %s 最近使用したファイル 0027 %s SEARCH RESULTS %d files 0027 %s 検索結果 %d ファイル 0028 %s UNKNOWN 0028 %s 不明 0029 %s added to script 0029 %s をスクリプトに追加しました 0030 %s is already indexed 0030 %s は既にインデックス済みです 0031 %s renamed: %s 0031 %s の名前を変更: %s 0032 %s: metadata update failed 0032 %s: metadata の更新に失敗しました 0033 %s: no write permission 0033 %s: 書き込み権限がありません 0034 %s: reserved, cannot be used 0034 %s: 予約済みのため使用できません 0035 %s: too many keywords 0035 %s: keyword が多すぎます 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\n撮影日: %s ファイル日付: %s \n評価: %s サイズ: %s %.2fmb \n場所: %s %s %s \nkeywords: %s \nタイトル: %s \n説明: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\n撮影日: %s ファイル日付: %s \n評価: %s サイズ: %s %.2fmb \n場所: %s %s %s \nkeywords: %s \nタイトル: %s \n説明: %s \n----------------------- \n%s 0038 (click below) 0038 (下をクリック) 0039 (no selection) 0039 (選択されていません) 0040 (pixels) 0040 (ピクセル) 0041 (press key) 0041 (キーを押してください) 0042 (select function) 0042 (機能を選択) 0043 *** bad utf8 detected *** \n 0043 *** 不正な utf8 を検出しました *** \n 0044 *** cannot create new file \n 0044 *** 新規ファイルを作成できません \n 0045 *** cannot get real path of input file \n 0045 *** 入力ファイルの実パスを取得できません \n 0046 *** cannot load input file \n 0046 *** 入力ファイルを読み込めません \n 0047 *** cannot make new version of input file \n 0047 *** 入力ファイルの新しいバージョンを作成できません \n 0048 *** cannot open input file 0048 *** 入力ファイルを開けません 0049 *** cannot read input file 0049 *** 入力ファイルを読み取れません 0050 *** cannot save output file \n 0050 *** 出力ファイルを保存できません \n 0051 *** completed \n 0051 *** 完了しました \n 0052 *** file date/time invalid \n 0052 *** ファイルの日付/時刻が無効です \n 0053 *** file type not supported \n 0053 *** ファイル形式に対応していません \n 0054 *** invalid file \n 0054 *** 無効なファイルです \n 0055 *** metadata update error \n 0055 *** metadata の更新エラー \n 0056 *** no date/time available \n 0056 *** 日付/時刻が取得できません \n 0057 + bright 0057 + 明るく 0058 +Blue -Yellow 0058 +青 -黄 0059 +Brightness 0059 +明るさ 0060 +Green -Magenta 0060 +緑 -マゼンタ 0061 +Red -Cyan 0061 +赤 -シアン 0062 - blue 0062 - 青 0063 - fog/haze 0063 - 霧/かすみ 0064 .heic/.avif files not supported (install heif_convert) 0064 .heic/.avif ファイルには対応していません(heif_convert をインストールしてください) 0065 .jp2 files not supported (install opj_decompress) 0065 .jp2 ファイルには対応していません(opj_decompress をインストールしてください) 0066 .webp files not supported (install dwebp) 0066 .webp ファイルには対応していません(dwebp をインストールしてください) 0067 0 albums selected 0067 0 個のアルバムを選択 0068 0 duplicates 0068 重複 0 件 0069 0-5 stars 0069 0~5 つ星 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = インデックスなし、旧インデックスのみ、旧+新規/更新分を追加 0071 2-character code 0071 2文字コード 0072 3D depth 0072 3D 深度 0073 <2 images 0073 <2 枚の画像 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 新しい Fotocx のリリースをインストールしています。 \nカスタム設定の復元が必要な場合があります。 0075 ADD GLARE 0075 グレアを追加 0076 ADD NOISE 0076 ノイズを追加 0077 ADJUST HSL 0077 HSL を調整 0078 ADJUST RGB 0078 RGB を調整 0079 ALBUM MASS UPDATE 0079 アルバム一括更新 0080 ALBUMS 0080 アルバム 0081 ALBUMS MENU 0081 アルバムメニュー 0082 ALIEN COLORS 0082 エイリアンカラー 0083 AMPLIFY CONTRAST 0083 コントラストを強調 0084 ANTI-ALIAS 0084 アンチエイリアス 0085 AREA BLEND 0085 エリアブレンド 0086 AREA FILL 0086 エリア塗りつぶし 0087 AREA OVERVIEW 0087 エリア概要 0088 AUTOSEARCH 0088 自動検索 0089 About 0089 このアプリについて 0090 Action 0090 動作 0091 Add 0091 追加 0092 Add 1 0092 1件追加 0093 Add All 0093 すべて追加 0094 Add Current 0094 現在の項目を追加 0095 Add Current File Here 0095 現在のファイルをここに追加 0096 Add Glare 0096 グレアを追加 0097 Add Image 0097 画像を追加 0098 Add Line 0098 線を追加 0099 Add Margins 0099 余白を追加 0100 Add Noise 0100 ノイズを追加 0101 Add Random Noise 0101 ランダムノイズを追加 0102 Add Selected Files Here 0102 選択したファイルをここに追加 0103 Add Texture 0103 テクスチャを追加 0104 Add a brightness/color ramp across an image 0104 画像全体に明るさ/色のグラデーションを追加 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 ブックマーク追加:ギャラリーのthumbnailをクリック。 \nブックマーク名変更:クリックして[名前変更]を押す 0106 Add glare around bright objects 0106 明るい被写体の周りにグレアを追加 0107 Add margins around an image 0107 画像の周囲に余白を追加 0108 Add newest version to existing versions 0108 最新バージョンを既存バージョンに追加 0109 Add overlay image (e.g. copyright) to selected images 0109 選択した画像にオーバーレイ画像(著作権表示など)を追加 0110 Add random noise to an image 0110 画像にランダムノイズを追加 0111 Add selected versions to existing versions 0111 選択したバージョンを既存バージョンに追加 0112 Add texture to an image 0112 画像にテクスチャを追加 0113 Add to Selection 0113 選択範囲に追加 0114 Add/change/delete metadata for selected image files 0114 選択した画像ファイルの metadata を追加/変更/削除 0115 Add/remove barrel/pincushion distortion 0115 樽型/糸巻き型のゆがみを追加/除去 0116 Add/remove brightness/color radially from chosen center 0116 選択した中心から放射状に明るさ/色を追加/除去 0117 Add/remove keywords for selected image files 0117 選択した画像ファイルの keywords を追加/削除 0118 Add/revise location/geocoordinates for selected image files 0118 選択した画像ファイルの位置/geotags を追加/修正 0119 Adjust HSL 0119 HSL を調整 0120 Adjust Image Contributions 0120 画像合成の割合を調整 0121 Adjust Pixel Composition 0121 ピクセル合成を調整 0122 Adjust RGB 0122 RGB を調整 0123 Adjust brightness, contrast, color 0123 明るさ、コントラスト、色を調整 0124 Adjust color saturation based on brightness 0124 明るさに基づいて彩度を調整 0125 Adjust color using HSL color model 0125 HSL カラーモデルで色を調整 0126 Adjust color using RGB or CMY colors 0126 RGB または CMY カラーで色を調整 0127 Adjustment 0127 調整 0128 Album Mass Update 0128 アルバム一括更新 0129 Album Name 0129 アルバム名 0130 Albums 0130 アルバム 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 アルバム:選んだ画像のギャラリー。ドラッグ&ドロップで並べ替え 0132 Algorithm Iterations 0132 アルゴリズムの反復回数 0133 Alien Colors 0133 エイリアンカラー 0134 All 0134 すべて 0135 All Areas 0135 すべてのエリア 0136 All files 0136 すべてのファイル 0137 All image files will be re-indexed. \nContinue? 0137 すべての画像ファイルを再インデックスします。 \n続行しますか? 0138 All±1 0138 全て±1 0139 All±10 0139 全て±10 0140 Alpha 0140 アルファ 0141 Amount 0141 量 0142 Amplify 0142 増幅 0143 Amplify Contrast 0143 コントラストを強調 0144 Amplify area contrast to enhance visibility of details 0144 エリアのコントラストを強調して細部を見やすくする 0145 Angle 0145 角度 0146 Anti-Alias 0146 アンチエイリアス 0147 Apply 0147 適用 0148 Apply a soft focus effect to an image 0148 画像にソフトフォーカス効果を適用 0149 Apply repeatedly while watching the image. 0149 画像を見ながら繰り返し適用してください。 0150 Area Blend 0150 エリアブレンド 0151 Area Edge Blend 0151 エリアエッジブレンド 0152 Area Fill 0152 エリア塗りつぶし 0153 Arrange images and text in a layout (photo-montage) 0153 画像とテキストをレイアウトに配置(フォトモンタージュ) 0154 Array Complete 0154 配列完了 0155 Array Width 0155 配列の幅 0156 Arrow head 0156 矢印の先端 0157 Auto Level 0157 オートレベル 0158 Auto black level 0158 自動黒レベル 0159 Auto crop: 0159 自動クロップ: 0160 Auto white balance 0160 オートホワイトバランス 0161 Auto-replay 0161 自動再生 0162 BATCH CHANGE META 0162 metadata の一括変更 0163 BATCH CONVERT 0163 一括変換 0164 BATCH COPY/MOVE 0164 一括コピー/移動 0165 BATCH DELETE/TRASH 0165 一括削除/ゴミ箱へ 0166 BATCH GEOTAGS 0166 geotags の一括設定 0167 BATCH KEYWORDS 0167 keywords の一括設定 0168 BATCH MENU 0168 一括処理メニュー 0169 BATCH OVERLAY 0169 オーバーレイの一括適用 0170 BATCH PHOTO DATE 0170 撮影日の一括設定 0171 BATCH PROCESSING 0171 一括処理 0172 BATCH PURGE KEYWORDS 0172 keywords の一括削除 0173 BATCH RENAME KEYWORDS 0173 keywords の一括名前変更 0174 BATCH REPORT META 0174 metadata の一括レポート 0175 BATCH SCRIPT 0175 一括スクリプト 0176 BATCH UPRIGHT 0176 upright の一括処理 0177 BLANK IMAGE 0177 空白画像 0178 BLUR 0178 ぼかし 0179 BOOKMARKS 0179 ブックマーク 0180 BRIGHTNESS RAMP 0180 明るさグラデーション 0181 Background 0181 背景 0182 Background Blur - blur relative to distance from foreground 0182 背景ぼかし - 前景からの距離に応じてぼかす 0183 Background Color 0183 背景色 0184 Background Pattern 0184 背景パターン 0185 Base Transparency 0185 基本の透明度 0186 Batch 0186 一括 0187 Batch Add/Change Metadata 0187 metadata の一括追加/変更 0188 Batch Add/Remove Keywords 0188 keywords の一括追加/削除 0189 Batch Change Meta 0189 metadata の一括変更 0190 Batch Convert 0190 一括変換 0191 Batch Copy/Move 0191 一括コピー/移動 0192 Batch Delete/Trash 0192 一括削除/ゴミ箱へ 0193 Batch Geotags 0193 geotags の一括設定 0194 Batch Keywords 0194 keywords の一括設定 0195 Batch Metadata 0195 metadata の一括設定 0196 Batch Overlay 0196 オーバーレイの一括適用 0197 Batch Photo Date 0197 撮影日の一括設定 0198 Batch Photo Date/Time 0198 撮影日/時刻の一括設定 0199 Batch Purge Keywords 0199 keywords の一括削除 0200 Batch Rename Keywords 0200 keywords の一括名前変更 0201 Batch Report Meta 0201 metadata の一括レポート 0202 Batch Report Metadata 0202 metadata の一括レポート 0203 Batch Set Geotags 0203 geotags の一括設定 0204 Batch Upright 0204 upright の一括処理 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 一括処理:コピー、移動、変換、RAW 変換、metadata の追加/変更 0206 Bend and fine-align 0206 曲げて微調整 0207 Bias 0207 バイアス 0208 Black 0208 黒 0209 Blank Image 0209 空白画像 0210 Blend 0210 ブレンド 0211 Blend 0% 0211 ブレンド 0% 0212 Blend Width 0212 ブレンド幅 0213 Blend area edits/edges using the mouse 0213 マウスでエリアの編集/エッジをブレンド 0214 Blend: 0% 0214 ブレンド: 0% 0215 Blue 0215 青 0216 Blue Factors 0216 青係数 0217 Blur 0217 ぼかし 0218 Blur Angle (degrees) 0218 ぼかし角度(度) 0219 Blur Background 0219 背景をぼかす 0220 Blur Image 0220 画像をぼかす 0221 Blur Mix 0221 ぼかしミックス 0222 Blur Normal 0222 標準ぼかし 0223 Blur Radius 0223 ぼかし半径 0224 Blur Span 0224 ぼかしの範囲 0225 Blur Span (pixels) 0225 ぼかしの範囲(ピクセル) 0226 Blur the image (various methods) 0226 画像をぼかす(各種方式) 0227 Bookmarks 0227 ブックマーク 0228 Both 0228 両方 0229 Bottom 0229 下 0230 Bright Limit 0230 明部の上限 0231 Bright Point 0231 明部の基準点 0232 Brightness 0232 明るさ 0233 Brightness Histogram 0233 明るさヒストグラム 0234 Brightness Ramp 0234 明るさグラデーション 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 明るさは端まで滑らかに \nグラデーションになっているはずです。 0236 Browse 0236 参照 0237 CALIBRATE PRINTER 0237 プリンターのキャリブレーション 0238 CAPTIONS 0238 キャプション 0239 CARTOON 0239 カートゥーン 0240 CHOOSE ALBUM 0240 アルバムを選択 0241 CLEAR AREA 0241 エリアをクリア 0242 CLOSE 0242 閉じる 0243 COLOR MODE 0243 カラーモード 0244 COMBINE MENU 0244 結合メニュー 0245 COMMAND PARAMETERS 0245 コマンドパラメーター 0246 COMPLETED 0246 完了 0247 COPY FROM IMAGE 0247 画像からコピー 0248 COPY IN IMAGE 0248 画像内でコピー 0249 COPY META 0249 metadata をコピー 0250 COPY PRIOR EDIT 0250 前回の編集をコピー 0251 COPY TO CLIPBOARD 0251 クリップボードにコピー 0252 COPY TO DESKTOP 0252 デスクトップにコピー 0253 COPY/MOVE 0253 コピー/移動 0254 COPY/PASTE AREA 0254 エリアのコピー/貼り付け 0255 CREATE ALBUM 0255 アルバムを作成 0256 CROP 0256 クロップ 0257 CROSSHATCH 0257 クロスハッチ 0258 CURRENT ALBUM 0258 現在のアルバム 0259 CURRENT FILE FOLDER 0259 現在のファイルのフォルダー 0260 CURVE EDITING 0260 カーブ編集 0261 CUSTOM KERNEL 0261 カスタムカーネル 0262 CUSTOM MENU 0262 カスタムメニュー 0263 CYCLE 2 FILES 0263 2ファイルを切り替え 0264 CYCLE 3 FILES 0264 3ファイルを切り替え 0265 Calculate 0265 計算 0266 Calculate Geometry 0266 ジオメトリを計算 0267 Calibrate Printer 0267 プリンターのキャリブレーション 0268 Cancel 0268 キャンセル 0269 Cartoon 0269 カートゥーン 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 注意:関連する更新が確実に行われるよう、 \n利用可能な tags を変更するには \nメイン metadata の編集機能を使用してください。 0271 Center 0271 中心 0272 Center Hole 0272 中心の穴 0273 Change 0273 変更 0274 Change Log 0274 変更履歴 0275 Change file name 0275 ファイル名を変更 0276 Change gallery sort order 0276 ギャラリーの並び順を変更 0277 Change image colors using an algorithm 0277 アルゴリズムで画像の色を変更 0278 Change image pixel dimensions 0278 画像のピクセルサイズを変更 0279 Chart to adjust monitor color 0279 モニターの色を調整するためのチャート 0280 Choose 0280 選択 0281 Choose Album 0281 アルバムを選択 0282 Choose Albums 0282 アルバムを選択 0283 Choose Captions 0283 キャプションを選択 0284 Choose an album and show as gallery of images 0284 アルバムを選んで画像のギャラリーとして表示 0285 Choose metadata shown on image captions 0285 画像のキャプションに表示する metadata を選択 0286 Choose new Fotocx home folder 0286 新しい Fotocx のホームフォルダーを選択 0287 Choose thumbnail folder 0287 thumbnail のフォルダーを選択 0288 Choose top image folders 0288 トップの画像フォルダーを選択 0289 Clear 0289 クリア 0290 Clear All 0290 すべてクリア 0291 Click dark spot for black level 0291 黒レベル用に暗い箇所をクリック 0292 Click for RGB histogram 0292 RGB ヒストグラムを表示するにはクリック 0293 Click gray spot for white balance 0293 ホワイトバランス用にグレーの箇所をクリック 0294 Click image to select pixels 0294 画像をクリックしてピクセルを選択 0295 Click image to select, drag image to move. 0295 画像をクリックで選択、ドラッグで移動。 0296 Click mouse to change center 0296 マウスをクリックして中心を変更 0297 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0297 エリアの輪郭付近をクリックしてください。 \n輪郭の隙間があれば見つかります。 \nF1 でヘルプを表示 0298 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0298 四角形エリアの4つの角をクリックし、[適用]を押してください。 \n画像は四角形が長方形になるようにゆがみ補正されます。 0299 Click thumbnail to select file 0299 thumbnail をクリックしてファイルを選択 0300 Clip Level 0300 クリップレベル 0301 Clip Limit % 0301 クリップ制限 % 0302 Color 0302 色 0303 Color Chooser 0303 カラーチューザー 0304 Color Depth: 0304 色深度: 0305 Color Fringes 0305 色収差 0306 Color Hue 0306 色相 0307 Color Map File 0307 カラーマップファイル 0308 Color Match Images 0308 画像の色を合わせる 0309 Color Mode 0309 カラーモード 0310 Color calibration tool for printer and paper type 0310 プリンターと用紙タイプの色キャリブレーションツール 0311 Color map file to use 0311 使用するカラーマップファイル 0312 Combine 0312 結合 0313 Combine 2-6 images into a wide panorama image 0313 2~6枚の画像を結合してワイドパノラマ画像に 0314 Combine many images into an array of images 0314 多数の画像を結合して画像配列に 0315 Combine multiple images in layers, select and expose layers 0315 複数の画像をレイヤーとして結合し、レイヤーを選択・表示 0316 Combine multiple noisy photos into a low-noise image 0316 ノイズの多い複数の写真を結合して低ノイズ画像に 0317 Combine multiple photos to erase passing people, etc. 0317 複数の写真を結合して通行人などを消去 0318 Combine within 0318 結合範囲 0319 Combine: HDR, HDF, stack, panorama, mashup, image array 0319 結合:HDR、HDF、スタック、パノラマ、マッシュアップ、画像配列 0320 Command Params 0320 コマンドパラメーター 0321 Commit 0321 コミット 0322 Confirm Exit 0322 終了の確認 0323 Contrast 0323 コントラスト 0324 Contrast All 0324 全体コントラスト 0325 Contrast Blue 0325 青コントラスト 0326 Contrast Green 0326 緑コントラスト 0327 Contrast Limit 0327 コントラスト制限 0328 Contrast Red 0328 赤コントラスト 0329 Convert %d image files 0329 %d 個の画像ファイルを変換 0330 Convert an image into a Tiny Planet image 0330 画像を Tiny Planet 画像に変換 0331 Convert image into a cartoon drawing 0331 画像をカートゥーン風の絵に変換 0332 Convert image into a crosshatch sketch 0332 画像をクロスハッチのスケッチに変換 0333 Convert image into a line drawing 0333 画像を線画に変換 0334 Convert image into a simulated painting 0334 画像を模擬絵画風に変換 0335 Convert image into a simulated sketch (1) 0335 画像を模擬スケッチ(1)に変換 0336 Convert image into a simulated sketch (2) 0336 画像を模擬スケッチ(2)に変換 0337 Convert image into black/white lines 0337 画像を白黒の線画に変換 0338 Convert image into dithered dots 0338 画像をディザードットに変換 0339 Convert image into square tiles with 3D effect 0339 画像を3D効果のある正方形タイルに変換 0340 Convert image into tiles matching feature contours 0340 画像を輪郭に沿ったタイルに変換 0341 Copy 0341 コピー 0342 Copy %d image files 0342 %d 個の画像ファイルをコピー 0343 Copy From Image 0343 画像からコピー 0344 Copy Meta 0344 metadata をコピー 0345 Copy Metadata 0345 metadata をコピー 0346 Copy Prior Edit 0346 前回の編集をコピー 0347 Copy Within Image 0347 画像内でコピー 0348 Copy area for later pasting into image 0348 後で貼り付けるためエリアをコピー 0349 Copy areas from another image using the mouse 0349 マウスで別の画像からエリアをコピー 0350 Copy areas from prior edits using the mouse 0350 マウスで前回の編集からエリアをコピー 0351 Copy areas within an image using the mouse 0351 マウスで画像内のエリアをコピー 0352 Copy image file to the clipboard 0352 画像ファイルをクリップボードにコピー 0353 Copy image file to the desktop 0353 画像ファイルをデスクトップにコピー 0354 Copy in Image 0354 画像内でコピー 0355 Copy metadata from one image to another 0355 metadata を別の画像にコピー 0356 Copy or Move Image File 0356 画像ファイルのコピーまたは移動 0357 Copy or Move image file to new location 0357 画像ファイルを新しい場所にコピーまたは移動 0358 Copy to Clipboard 0358 クリップボードにコピー 0359 Copy to Desktop 0359 デスクトップにコピー 0360 Copy without unsaved changes? 0360 未保存の変更を保存せずにコピーしますか? 0361 Copy/Move 0361 コピー/移動 0362 Copy/move selected image files to a new folder 0362 選択した画像ファイルを新しいフォルダーにコピー/移動 0363 Copyright 0363 著作権 0364 Create 0364 作成 0365 Create Album 0365 アルバムを作成 0366 Create Blank Image 0366 空白画像を作成 0367 Create Mosaic 0367 モザイクを作成 0368 Create a blank image 0368 空白画像を作成 0369 Create a mosaic with tiles made from all images 0369 すべての画像から作ったタイルでモザイクを作成 0370 Create a new album (ordered set of image files) 0370 新しいアルバムを作成(画像ファイルの順序セット) 0371 Create an embossed or 3D appearance 0371 エンボスまたは3D風の外観を作成 0372 Create or replace an album 0372 アルバムを作成または置き換え 0373 Crop 0373 クロップ 0374 Crop (trim) image margins 0374 画像の余白をクロップ(トリミング) 0375 Crop Buttons 0375 クロップボタン 0376 Crop Image 0376 画像をクロップ 0377 Crosshatch 0377 クロスハッチ 0378 Crosshatch Sketch 0378 クロスハッチスケッチ 0379 Current Album 0379 現在のアルバム 0380 Current File Folder 0380 現在のファイルのフォルダー 0381 Current gallery 0381 現在のギャラリー 0382 Current image: 0382 現在の画像: 0383 Curve Node 0383 カーブノード 0384 Curve lines need at least 4 points 0384 カーブの線には少なくとも4つの点が必要です 0385 Custom 0385 カスタム 0386 Custom Kernel 0386 カスタムカーネル 0387 Custom Shortcuts \n 0387 カスタムショートカット \n 0388 Custom menu: favorite/frequent functions, scripts, plugins 0388 カスタムメニュー:よく使う機能、スクリプト、プラグイン 0389 Customize 0389 カスタマイズ 0390 Customize: 0390 カスタマイズ: 0391 Cut Bottom 0391 下部をカット 0392 Cut Top 0392 上部をカット 0393 Cycle 2 Files 0393 2ファイルを切り替え 0394 Cycle 2 Prior Files 0394 前の2ファイルを切り替え 0395 Cycle 3 Files 0395 3ファイルを切り替え 0396 Cycle 3 Prior Files 0396 前の3ファイルを切り替え 0397 Cycle through images: 0397 画像を切り替え: 0398 DARK/BRIGHT PIXELS 0398 暗部/明部のピクセル 0399 DEFOG 0399 霧除去 0400 DELETE ALBUM 0400 アルバムを削除 0401 DELETE META 0401 metadata を削除 0402 DELETE/TRASH 0402 削除/ゴミ箱へ 0403 DENOISE 0403 ノイズ除去 0404 DIALOG BUTTONS 0404 ダイアログボタン 0405 DITHER 0405 ディザ 0406 DRAG AND DROP 0406 ドラッグ&ドロップ 0407 Dark Areas 0407 暗い部分 0408 Dark Limit 0408 暗部の下限 0409 Dark Point 0409 暗部の基準点 0410 Dark/Bright Pixels 0410 暗部/明部のピクセル 0411 Data file 0411 データファイル 0412 Define keywords used for searching images 0412 画像検索に使う keywords を定義 0413 Defined Keywords: 0413 定義済み keywords: 0414 Defog 0414 霧除去 0415 Delete 0415 削除 0416 Delete Album 0416 アルバムを削除 0417 Delete Meta 0417 metadata を削除 0418 Delete Metadata 0418 metadata を削除 0419 Delete Originals 0419 オリジナルを削除 0420 Delete an album 0420 アルバムを削除 0421 Delete or Trash selected image files 0421 選択した画像ファイルを削除またはゴミ箱へ 0422 Delete or trash an image file 0422 画像ファイルを削除またはゴミ箱へ 0423 Delete read-only file? 0423 読み取り専用のファイルを削除しますか? 0424 Delete/Trash 0424 削除/ゴミ箱へ 0425 Denoise 0425 ノイズ除去 0426 Depth 0426 深度 0427 Desc. 0427 説明 0428 Description: %s\n 0428 説明: %s\n 0429 Desktop 0429 デスクトップ 0430 Dialog Font 0430 ダイアログのフォント 0431 Diffs 0431 差分 0432 Directed Blur 0432 方向指定ぼかし 0433 Directed Blur - blur locally in direction of mouse drag 0433 方向指定ぼかし - マウスでドラッグした方向に局所的にぼかす 0434 Disable 0434 無効化 0435 Disable areas for editing 0435 編集用エリアを無効化 0436 Discard unsaved changes? 0436 未保存の変更を破棄しますか? 0437 Discard unsaved edits? 0437 未保存の編集を破棄しますか? 0438 Distort image areas using the mouse 0438 マウスで画像エリアをゆがませる 0439 Dither 0439 ディザ 0440 Dither Image 0440 画像をディザ 0441 Dither0 0441 ディザ0 0442 Dither1 0442 ディザ1 0443 Dither2 0443 ディザ2 0444 Dither3 0444 ディザ3 0445 Dither4 0445 ディザ4 0446 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0446 画像をドラッグしておおよそ位置を合わせます。\n回転するには下端からドラッグしてください。 0447 Drag margin box middle or edges 0447 余白ボックスの中央または端をドラッグ 0448 Drag mouse on image. \nLeft click to cancel. 0448 画像上でマウスをドラッグ。 \n左クリックでキャンセル。 0449 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0449 マウスをドラッグして選択。消去。繰り返し。 \nクリック:マウス位置まで選択範囲を拡張。 0450 Drag mouse to set center 0450 マウスをドラッグして中心を設定 0451 Drag near an image corner using the mouse 0451 マウスで画像の角付近をドラッグ 0452 Drag on image to level image.\nClick on image for level lines. 0452 画像上でドラッグして水平にします。\n画像をクリックすると水準線が表示されます。 0453 Drag within image using the mouse 0453 マウスで画像内をドラッグ 0454 Draw a line across the image in \ndirection of brightness change. 0454 明るさの変化する方向に \n画像上で線を引いてください。 0455 Draw box on image 0455 画像上に四角形を描く 0456 Draw line or arrow on image 0456 画像上に線または矢印を描く 0457 Draw on image: text, line/arrow, box, circle, ellipse 0457 画像に描画:テキスト、線/矢印、四角形、円、楕円 0458 Draw oval on image 0458 画像上に楕円を描く 0459 Draw text on image 0459 画像上にテキストを描く 0460 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0460 重複または入れ子になったフォルダー: \n %s \n %s \n削除してください。 0461 Duplicates: 0461 重複: 0462 EDIT ALBUM 0462 アルバムを編集 0463 EDIT ANY META 0463 任意の metadata を編集 0464 EDIT BOOKMARKS 0464 ブックマークを編集 0465 EDIT MAIN META 0465 メイン metadata を編集 0466 EDIT MENU 0466 編集メニュー 0467 EDIT PROCEDURES 0467 手順を編集 0468 EDIT SCRIPT 0468 スクリプトを編集 0469 EDIT WORKFLOW 0469 ワークフローを編集 0470 EFFECTS MENU 0470 効果メニュー 0471 EMBOSS 0471 エンボス 0472 ENABLE/DISABLE AREA 0472 エリアの有効化/無効化 0473 ENGRAVE 0473 彫刻風 0474 ESCHER SPIRAL 0474 エッシャー螺旋 0475 EXPORT FILES 0475 ファイルをエクスポート 0476 Edge 0476 エッジ 0477 Edit 0477 編集 0478 Edit Any Meta 0478 任意の metadata を編集 0479 Edit Any Metadata 0479 任意の metadata を編集 0480 Edit Bookmarks 0480 ブックマークを編集 0481 Edit Images 0481 画像を編集 0482 Edit Keyboard Shortcuts 0482 キーボードショートカットを編集 0483 Edit Line 0483 線を編集 0484 Edit Line/Arrow 0484 線/矢印を編集 0485 Edit Main Meta 0485 メイン metadata を編集 0486 Edit Main Metadata 0486 メイン metadata を編集 0487 Edit Menu 0487 編集メニュー 0488 Edit Metadata 0488 metadata を編集 0489 Edit Plugins 0489 プラグインを編集 0490 Edit Text 0490 テキストを編集 0491 Edit any metadata tag 0491 任意の metadata tag を編集 0492 Edit function can not use Paint Edits 0492 編集機能では Paint Edits を使用できません 0493 Edit function must be active 0493 編集機能が有効になっている必要があります 0494 Edit key metadata: keywords/geotags/description/rating ... 0494 主要な metadata を編集:keywords/geotags/説明/評価 ... 0495 Edit plugins menu 0495 プラグインメニューを編集 0496 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0496 編集:クロップ、回転、レタッチ、リスケール、マークアップ、ペイント編集、エリアコピー 0497 Effects 0497 効果 0498 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0498 効果:カートゥーン、スケッチ、絵画風、エンボス、ディザ、テクスチャ、色、カスタム畳み込み 0499 Emboss 0499 エンボス 0500 Enable 0500 有効化 0501 Enable areas for editing 0501 編集用エリアを有効化 0502 End of gallery 0502 ギャラリーの末尾 0503 Engrave 0503 彫刻風 0504 Enter Keyword 0504 keyword を入力 0505 Enter New Keyword 0505 新しい keyword を入力 0506 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0506 ダイアログで線や矢印のプロパティを入力し、 \n画像上でクリック/ドラッグ、削除は右クリック 0507 Enter text, [Add] to layout, edit properties. 0507 テキストを入力し、[追加]でレイアウトに配置、編集。 0508 Enter text, click/drag on image, right click to remove 0508 テキストを入力し、画像上でクリック/ドラッグ、削除は右クリック 0509 Erase 0509 消去 0510 Erase existing areas 0510 既存のエリアを消去 0511 Escher Spiral 0511 エッシャー螺旋 0512 Exceed 50 anchor points 0512 アンカーポイントが50を超えています 0513 Export Files 0513 ファイルをエクスポート 0514 Export selected image files to another folder 0514 選択した画像ファイルを別のフォルダーにエクスポート 0515 FILE MENU 0515 ファイルメニュー 0516 FILE SAVE 0516 ファイル保存 0517 FILE VIEW 0517 ファイル表示 0518 FIND AREA GAP 0518 エリアの隙間を検索 0519 FIND BAD FILES 0519 不正なファイルを検索 0520 FIND DUPLICATES 0520 重複を検索 0521 FIRST INDEX 0521 初回インデックス 0522 FIRST STARTUP 0522 初回起動 0523 FIX META 0523 metadata を修復 0524 FLATTEN HISTOGRAM 0524 ヒストグラムをフラット化 0525 FLATTEN PHOTO 0525 写真をフラット化 0526 FOLDER TREE 0526 フォルダーツリー 0527 FOTOCX FOR WINDOWS 11 0527 Windows 11 版 Fotocx 0528 FOTOCX LIMITATIONS 0528 Fotocx の制限事項 0529 FOTOCX USAGE 0529 Fotocx の使い方 0530 FRINGES 0530 色収差 0531 FUSION 0531 フュージョン 0532 Fetch 0532 取得 0533 File 0533 ファイル 0534 File Mod Date/Time 0534 ファイル変更日時 0535 File Name 0535 ファイル名 0536 File Name/Number 0536 ファイル名/番号 0537 File Name: %s \n 0537 ファイル名: %s \n 0538 File Size (bytes) 0538 ファイルサイズ(バイト) 0539 File View 0539 ファイル表示 0540 File count: 0540 ファイル数: 0541 File type cannot be edited 0541 このファイル形式は編集できません 0542 File1 0542 ファイル1 0543 File2 0543 ファイル2 0544 File: 0544 ファイル: 0545 File: new session, open, rename, copy/move, delete, print 0545 ファイル:新規セッション、開く、名前変更、コピー/移動、削除、印刷 0546 Fill selected areas or transparent areas with a color 0546 選択したエリアまたは透明なエリアを色で塗りつぶす 0547 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0547 選択したエリアを目視確認用に色で塗りつぶす。 \n方法1:まだ塗りつぶされていない選択エリアを左クリック。 \n方法2:すべての選択エリアの外側を右クリック。 \n詳細は[ヘルプ]ボタンを押してください 0548 Find 0548 検索 0549 Find Bad Files 0549 不正なファイルを検索 0550 Find Duplicate Images 0550 重複画像を検索 0551 Find Duplicates 0551 重複を検索 0552 Find Gap 0552 隙間を検索 0553 Find a gap in an area outline 0553 エリアの輪郭の隙間を検索 0554 Find all images for a location [date range] 0554 場所[日付範囲]に該当するすべての画像を検索 0555 Find all images for a selected tag name and value 0555 選択した tag 名と値に該当するすべての画像を検索 0556 Find images meeting multiple search criteria 0556 複数の検索条件に該当する画像を検索 0557 Find optimum factors: 0557 最適な係数を検索: 0558 Finish 0558 完了 0559 Finish Area 0559 エリアを完了 0560 Fix Bad File 0560 不正なファイルを修復 0561 Fix Broken Metadata 0561 破損した metadata を修復 0562 Fix Meta 0562 metadata を修復 0563 Fix Motion Blur 0563 モーションブラーを補正 0564 Fix Perspective 0564 パースを補正 0565 Fix color fringes (chromatic aberration) 0565 色収差(色収差)を補正 0566 Fix perspective for object photographed from an angle 0566 斜めから撮影した被写体のパースを補正 0567 Fix red-eyes from flash photo 0567 フラッシュ撮影による赤目を補正 0568 Flatten 0568 フラット化 0569 Flatten Histogram 0569 ヒストグラムをフラット化 0570 Flatten Pano 0570 パノラマをフラット化 0571 Flatten Photo 0571 写真をフラット化 0572 Flatten brightness histogram to enhance details 0572 明るさヒストグラムをフラット化して細部を強調 0573 Flatten curved surface. 0573 湾曲した面をフラット化。 0574 Flatten photo of a curved image (e.g. poster on round column 0574 湾曲した画像(例:円柱状のポスター)の写真をフラット化 0575 Flip 0575 反転 0576 Folder Tree 0576 フォルダーツリー 0577 Folders 0577 フォルダー 0578 Folders for image files (subfolders included automatically) 0578 画像ファイル用のフォルダー(サブフォルダーも自動的に含む) 0579 Font 0579 フォント 0580 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0580 ランダム画像シーケンスでは、この値は \n画像を表示する相対頻度です。 \n基準値は10。20 --> 2倍の頻度で表示。 0581 Foreground 0581 前景 0582 Fotocx copyright notice 0582 Fotocx の著作権表示 0583 Fotocx home 0583 Fotocx ホーム 0584 Fotocx privacy policy 0584 Fotocx のプライバシーポリシー 0585 Fotocx video tutorial on YouTube 0585 YouTube の Fotocx 動画チュートリアル 0586 Fotocx web site (information and downloads) 0586 Fotocx ウェブサイト(情報とダウンロード) 0587 FreeSans 0587 FreeSans 0588 Full List 0588 全リスト 0589 Full Screen 0589 全画面表示 0590 Fusion 0590 フュージョン 0591 GALLERY END 0591 ギャラリーの末尾 0592 GALLERY FILTER 0592 ギャラリーフィルター 0593 GALLERY HOME 0593 ギャラリーホーム 0594 GALLERY MENU 0594 ギャラリーメニュー 0595 GALLERY OVERVIEW 0595 ギャラリー概要 0596 GALLERY SORT 0596 ギャラリーの並び替え 0597 GALLERY TO ALBUM 0597 ギャラリーからアルバムへ 0598 GALLERY VIEW 0598 ギャラリー表示 0599 GDK pixbuf: cannot save file 0599 GDK pixbuf: ファイルを保存できません 0600 GLOBAL RETINEX 0600 グローバルレティネックス 0601 GRID SETTINGS 0601 グリッド設定 0602 Gallery 0602 ギャラリー 0603 Gallery End 0603 ギャラリーの末尾 0604 Gallery Filter 0604 ギャラリーフィルター 0605 Gallery Home 0605 ギャラリーホーム 0606 Gallery Sort 0606 ギャラリーの並び替え 0607 Gallery View 0607 ギャラリー表示 0608 Gallery of newest image files 0608 最新の画像ファイルのギャラリー 0609 Gallery of recently viewed image files 0609 最近閲覧した画像ファイルのギャラリー 0610 Gallery to Album 0610 ギャラリーからアルバムへ 0611 Gallery view with thumbnails and basic metadata 0611 thumbnail と基本 metadata によるギャラリー表示 0612 Gallery view with thumbnails and file data 0612 thumbnail とファイルデータによるギャラリー表示 0613 Gallery: thumbnails, new/recent, sort, select, bookmarks 0613 ギャラリー:thumbnails、新着/最近、並び替え、選択、ブックマーク 0614 Generate an inward spiraling repeating image 0614 内側に渦を巻く繰り返し画像を生成 0615 Global Retinex 0615 グローバルレティネックス 0616 Gradual 0616 グラデーション 0617 Graduated Blur 0617 グラデーションぼかし 0618 Graduated Blur - blur relative to pixel contrast 0618 グラデーションぼかし - ピクセルのコントラストに応じてぼかす 0619 Grayscale 0619 グレースケール 0620 Green 0620 緑 0621 Grid Settings 0621 グリッド設定 0622 Group by country 0622 国別にグループ化 0623 Group by country/date 0623 国/日付別にグループ化 0624 Group by country/location 0624 国/場所別にグループ化 0625 Group by country/location/date 0625 国/場所/日付別にグループ化 0626 Group by date/country 0626 日付/国別にグループ化 0627 Group by date/country/location 0627 日付/国/場所別にグループ化 0628 HDF 0628 HDF 0629 HDR 0629 HDR 0630 HELP MENU 0630 ヘルプメニュー 0631 Hard 0631 硬い 0632 Height 0632 高さ 0633 Height: 0633 高さ: 0634 Help 0634 ヘルプ 0635 Help: user guide, tutorial, change log, licenses, privacy, about 0635 ヘルプ:ユーザーガイド、チュートリアル、変更履歴、ライセンス、プライバシー、このアプリについて 0636 Hide 0636 非表示 0637 Hide selected areas 0637 選択したエリアを非表示 0638 High 0638 高 0639 High Depth of Field - combine near/far focus images for deeper focus 0639 被写界深度合成 - 近景/遠景のピント画像を結合してより深いピントに 0640 High Dynamic Range - combine bright/dark images for better detail 0640 ハイダイナミックレンジ - 明暗画像を結合してより高精細に 0641 Highlight darkest and brightest pixels 0641 最も暗い/明るいピクセルをハイライト表示 0642 Home Folder 0642 ホームフォルダー 0643 Home Page 0643 ホームページ 0644 Horz 0644 水平 0645 How to remove Fotocx application and user files 0645 Fotocx アプリケーションとユーザーファイルの削除方法 0646 Hue 0646 色相 0647 IMAGE ARRAY 0647 画像配列 0648 INDEX FILES 0648 ファイルをインデックス 0649 INSIDE-OUT 0649 内側と外側を反転 0650 INVERT AREA 0650 エリアを反転 0651 Icon size 0651 アイコンサイズ 0652 Icons 0652 アイコン 0653 Image 0653 画像 0654 Image Array 0654 画像配列 0655 Image Columns 0655 画像列 0656 Image Differences 0656 画像の差分 0657 Image File 0657 画像ファイル 0658 Image File: 0658 画像ファイル: 0659 Image Keywords 0659 画像 keywords 0660 Image Locations 0660 画像の場所 0661 Image Markup 0661 画像マークアップ 0662 Image Position 0662 画像の位置 0663 Image Preferences 0663 画像設定 0664 Image Ratios 0664 画像の比率 0665 Image Size (pixels) 0665 画像サイズ(ピクセル) 0666 Image Time 0666 撮影時刻 0667 Image Timeline 0667 画像タイムライン 0668 Image colors are converted for printing. 0668 印刷用に画像の色を変換します。 0669 Image dimensions have changed \nCopy Prior Edit cannot be used 0669 画像サイズが変更されたため \n前回の編集のコピーは使用できません 0670 Image dimensions have changed, \nArea Blend cannot be used 0670 画像サイズが変更されたため、 \nエリアブレンドは使用できません 0671 Image dimensions have changed, \nthis prior image cannot be used 0671 画像サイズが変更されたため、 \nこの前の画像は使用できません 0672 Image is fixed, unmovable 0672 画像は固定されており、移動できません 0673 Images sizes are not compatible 0673 画像サイズに互換性がありません 0674 Include: 0674 含める: 0675 Index Files 0675 ファイルをインデックス 0676 Index Level 0676 インデックスレベル 0677 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0677 インデックス機能が終了しました。 \n検索およびマップ機能、また thumbnail ギャラリー \nページの高速表示にはインデックス作成が必要です。 0678 Index new image files and make thumbnails 0678 新しい画像ファイルをインデックスし、thumbnails を作成 0679 Input color to match and adjust: 0679 一致させて調整する入力色: 0680 Inside-out 0680 内側と外側を反転 0681 Install following programs using your package manager: \n 0681 パッケージマネージャーで以下のプログラムをインストールしてください: \n 0682 Intensity 0682 強度 0683 Invert 0683 反転 0684 Invert selected areas (selected ↔ not selected) 0684 選択したエリアを反転(選択 ↔ 非選択) 0685 Irregular Tiles 0685 不規則なタイル 0686 Iterations 0686 反復回数 0687 JPEG ARTIFACTS 0687 JPEG アーティファクト 0688 JPEG Artifacts 0688 JPEG アーティファクト 0689 JPEG files 0689 JPEG ファイル 0690 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0690 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 0691 Jump to gallery beginning [home] 0691 ギャラリーの先頭へ移動 [home] 0692 Jump to gallery end [end] 0692 ギャラリーの末尾へ移動 [end] 0693 KEYBOARD ESCAPE KEY 0693 キーボードの Escape キー 0694 KEYBOARD SHORTCUTS 0694 キーボードショートカット 0695 KEYWORDS OVERVIEW 0695 keywords 概要 0696 Keep 0696 保持 0697 Kernel size 0697 カーネルサイズ 0698 Keyboard Shortcuts 0698 キーボードショートカット 0699 Keywords Category 0699 keywords のカテゴリー 0700 Kill active dialog? 0700 実行中のダイアログを終了しますか? 0701 Kill busy function? 0701 実行中の機能を終了しますか? 0702 Kuwahara 0702 桑原フィルター 0703 Kuwahara Depth 0703 桑原フィルターの深度 0704 LINE COLOR 0704 線の色 0705 LOAD/SAVE AREA 0705 エリアの読込/保存 0706 LOCAL CONTRAST 0706 局所コントラスト 0707 LOCAL RETINEX 0707 局所レティネックス 0708 Language 0708 言語 0709 Layout and background image 0709 レイアウトと背景画像 0710 Left 0710 左 0711 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0711 マウスをエリア内で左ドラッグすると \n徐々にエリアの編集を元に戻します。 \n右ドラッグで編集を復元。 \nエリアの端に沿ってドラッグするとエッジがブレンドされます。 0712 Left/right click: previous/next image (also arrow keys) 0712 左/右クリック:前/次の画像(矢印キーも使用可) 0713 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0713 左/右クリック:編集を1ステップ元に戻す/やり直す \n中央クリック:選択した編集ステップに戻る 0714 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0714 左/右クリック:画像/thumbnail をズームイン/アウト(+/-キーも使用可) 0715 Length 0715 長さ 0716 Level 0716 レベル 0717 Licenses 0717 ライセンス 0718 Light Source 0718 光源 0719 Lightness 0719 明度 0720 Limit 0720 上限 0721 Line Color 0721 線の色 0722 Line Threshold 0722 線のしきい値 0723 Line Width 0723 線の太さ 0724 Line length 0724 線の長さ 0725 List Fotocx command line parameters 0725 Fotocx のコマンドラインパラメーターを一覧表示 0726 List all metadata for current image or clicked thumbnail 0726 現在の画像またはクリックした thumbnail のすべての metadata を一覧表示 0727 List outboard programs and functions 0727 外部プログラムと機能を一覧表示 0728 Load 0728 読み込み 0729 Load settings from file 0729 ファイルから設定を読み込み 0730 Local Contrast 0730 局所コントラスト 0731 Local Retinex 0731 局所レティネックス 0732 Location 0732 場所 0733 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0733 場所と国は現在の値を置き換えます。\nGPS データは新しい値がある場合のみ置き換えられます。 0734 Lock 0734 ロック 0735 Low Amplify 0735 弱い増幅 0736 MAGNIFY IMAGE 0736 画像を拡大表示 0737 MAKE WAVES 0737 波を作成 0738 MANAGE KEYWORDS 0738 keywords を管理 0739 MAP MENU 0739 マップメニュー 0740 MAP VIEW 0740 マップ表示 0741 MARGINS 0741 余白 0742 MARKUP 0742 マークアップ 0743 MASHUP 0743 マッシュアップ 0744 MATCH COLORS 0744 色を合わせる 0745 MEASURE IMAGE 0745 画像を計測 0746 MENU SHORTCUTS 0746 メニューショートカット 0747 METADATA MENU 0747 metadata メニュー 0748 METADATA TAGS 0748 metadata tags 0749 METADATA VIEW 0749 metadata 表示 0750 MONITOR COLOR 0750 モニターの色 0751 MOSAIC 0751 モザイク 0752 MOUSE ALT-RIGHT-BUTTON 0752 マウス Alt+右ボタン 0753 MOUSE FUNCTIONS 0753 マウス操作 0754 MOUSE OWNERSHIP 0754 マウスの所有権 0755 MOVE FOTOCX HOME 0755 Fotocx ホームを移動 0756 Magnify 0756 拡大表示 0757 Magnify Image 0757 画像を拡大表示 0758 Magnify image around the mouse position 0758 マウス位置周辺を拡大表示 0759 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0759 メインメモリが不足しているため Fotocx を実行できません。 \nそれでも試すことはできます。 \n続行しますか? 0760 Make Layout Image 0760 レイアウト画像を作成 0761 Make Square Tiles 0761 正方形タイルを作成 0762 Make Waves 0762 波を作成 0763 Make a spherical projection of an image 0763 画像を球面投影に変換 0764 Make black margins transparent 0764 黒い余白を透明にする 0765 Make new versions 0765 新しいバージョンを作成 0766 Make width constant for window size 0766 ウィンドウサイズに合わせて幅を一定にする 0767 Manage Keywords 0767 keywords を管理 0768 Map 0768 マップ 0769 Map View 0769 マップ表示 0770 Maps 0770 マップ 0771 Maps: view images by map location 0771 マップ:地図上の場所で画像を表示 0772 Margin 0772 余白 0773 Margins 0773 余白 0774 Markup 0774 マークアップ 0775 Mashup 0775 マッシュアップ 0776 Mass update album files 0776 アルバムファイルを一括更新 0777 Match Brightness 0777 明るさを合わせる 0778 Match Colors 0778 色を合わせる 0779 Match Level 0779 マッチレベル 0780 Match Limit 0780 マッチの上限 0781 Match image colors to colors of another image 0781 別の画像の色に合わせる 0782 Match using: 0782 マッチに使用: 0783 Matching Keywords 0783 一致する keywords 0784 Max 0784 最大 0785 Max. Width 0785 最大幅 0786 Measure Image 0786 画像を計測 0787 Measure Noise 0787 ノイズを計測 0788 Measure pixel distances within an image 0788 画像内のピクセル間距離を計測 0789 Menu Colors 0789 メニューの色 0790 Menu Style 0790 メニュースタイル 0791 Metadata 0791 metadata 0792 Metadata Tags 0792 metadata tags 0793 Metadata View 0793 metadata 表示 0794 Metadata from Search Function 0794 検索機能からの metadata 0795 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0795 方法1:\n赤目を左クリックで暗くします。\n方法2:\n右下方向にドラッグして赤目を囲みます。\n赤目を左クリックで暗くします。\n赤目を元に戻す:\n赤目を右クリック。 0796 Mirror: 0796 ミラー: 0797 Mode: 0797 モード: 0798 Monitor Color 0798 モニターの色 0799 Mosaic 0799 モザイク 0800 Mouse Radius 0800 マウス半径 0801 Mouse Warp (drag image) 0801 マウスでゆがみ補正(画像をドラッグ) 0802 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0802 マウスドラッグ:画像を360°パン \n左/右クリック:ズームイン/アウト \nEscape:パノラマ表示を終了 0803 Move %d image files 0803 %d 個の画像ファイルを移動 0804 Move Fotocx Home 0804 Fotocx ホームを移動 0805 Move Fotocx Home Folder 0805 Fotocx ホームフォルダーを移動 0806 Move Fotocx home folder to chosen folder 0806 Fotocx ホームフォルダーを選択したフォルダーへ移動 0807 Move mouse in a monotone image area. 0807 単調な画像エリアでマウスを動かしてください。 0808 Multiplier 0808 乗数 0809 NEW SESSION 0809 新規セッション 0810 NEWEST FILES 0810 最新ファイル 0811 NEWLINE CHARACTERS IN METADATA 0811 metadata 内の改行文字 0812 NON-STANDARD DIALOG WIDGETS 0812 非標準のダイアログウィジェット 0813 New Area 0813 新しいエリア 0814 New File Name: 0814 新しいファイル名: 0815 New Location 0815 新しい場所 0816 New Location: 0816 新しい場所: 0817 New Name 0817 新しい名前 0818 New Session 0818 新規セッション 0819 New Type: 0819 新しい種類: 0820 New Version 0820 新しいバージョン 0821 Newest 0821 最新 0822 Newest Files 0822 最新ファイル 0823 Next 0823 次へ 0824 Next gallery 0824 次のギャラリー 0825 No 0825 いいえ 0826 No curve lines found 0826 カーブ線が見つかりません 0827 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0827 画像ファイルのインデックスが見つかりませんでした。\n画像ファイルのインデックスを作成します。\n画像ファイル自体は変更されません。\n数千枚以上の画像ファイルがある場合、\nかなりの時間がかかることがあります。 0828 No images found 0828 画像が見つかりません 0829 Noise Reduction 0829 ノイズ低減 0830 Noise Size 0830 ノイズサイズ 0831 None 0831 なし 0832 Normal Blur 0832 標準ぼかし 0833 Normal Blur - mix pixels with all neighbor pixels 0833 標準ぼかし - 隣接するすべてのピクセルと混合 0834 OPEN IMAGE FILE 0834 画像ファイルを開く 0835 OTHER TOPICS 0835 その他のトピック 0836 OUTLINES 0836 輪郭線 0837 Old Name 0837 元の名前 0838 One Tag: 0838 tag 1つ: 0839 Opacity 0839 不透明度 0840 Open 0840 開く 0841 Open Image File 0841 画像ファイルを開く 0842 Open a file and paste as selected area into an image 0842 ファイルを開いて画像内の選択エリアとして貼り付け 0843 Open a parallel Fotocx session 0843 並行して Fotocx セッションを開く 0844 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0844 スキャンしたカラーチャートファイルを開いて編集。 \nスキャン時の傾きや回転を除去。 \n(これには Fix Perspective 機能を使用)。 \n薄い緑の余白を正確に切り取る。 \nカラーチャートファイルを保存(上書き)。 0845 Open the trimmed color chart file 0845 トリミングしたカラーチャートファイルを開く 0846 Optimize 0846 最適化 0847 Other Tag ... 0847 その他の tag ... 0848 Outboard Programs 0848 外部プログラム 0849 Outline Drawing 0849 輪郭線描画 0850 Outlines 0850 輪郭線 0851 Output Color 0851 出力色 0852 Overlap 0852 重なり 0853 Overlay position in host image: 0853 ホスト画像内のオーバーレイ位置: 0854 Overlay width, % host image width: 0854 オーバーレイ幅、ホスト画像幅に対する%: 0855 Overwrite file? \n%s 0855 ファイルを上書きしますか? \n%s 0856 PAINT EDITS 0856 ペイント編集 0857 PAINT IMAGE 0857 画像をペイント 0858 PAINT TRANSPARENCY 0858 透明度をペイント 0859 PAINTING 0859 絵画風 0860 PANORAMA 0860 パノラマ 0861 PATTERN 0861 パターン 0862 PERSPECTIVE 0862 パースペクティブ 0863 PLACES/DATES 0863 場所/日付 0864 PLUGINS 0864 プラグイン 0865 PREV/NEXT 0865 前/次 0866 PRINT CALIBRATED 0866 キャリブレーション印刷 0867 PRINT IMAGE 0867 画像を印刷 0868 PRIVACY 0868 プライバシー 0869 PROBLEM FILES 0869 問題のあるファイル 0870 PROBLEM REPORTING 0870 問題の報告 0871 Paint Edits 0871 ペイント編集 0872 Paint Edits already active 0872 ペイント編集は既に有効です 0873 Paint Image 0873 画像をペイント 0874 Paint Image Transparencies 0874 画像の透明度をペイント 0875 Paint Radius 0875 ペイント半径 0876 Paint Transparency 0876 透明度をペイント 0877 Paint and Warp Image 0877 画像をペイントしてゆがみ補正 0878 Paint current edit function gradually using the mouse 0878 マウスで現在の編集機能を徐々にペイント 0879 Paint entire image 0879 画像全体をペイント 0880 Paint image transparency using the mouse 0880 マウスで画像の透明度をペイント 0881 Paint on Image 0881 画像上にペイント 0882 Paint on image using the mouse 0882 マウスで画像上にペイント 0883 Paint transparency 0883 透明度をペイント 0884 Paint within mouse 0884 マウス範囲内でペイント 0885 Painting 0885 絵画風 0886 Panorama 0886 パノラマ 0887 Paste 0887 貼り付け 0888 Paste Image 0888 画像を貼り付け 0889 Paste previously copied area into image 0889 以前コピーしたエリアを画像に貼り付け 0890 Pattern 0890 パターン 0891 Pattern File: 0891 パターンファイル: 0892 Pattern Width 0892 パターン幅 0893 Percent 0893 パーセント 0894 Permissions 0894 権限 0895 Perspective 0895 パースペクティブ 0896 Photo Date 0896 撮影日 0897 Photo Date/Time 0897 撮影日/時刻 0898 Photo Date/Time (metadata) 0898 撮影日/時刻(metadata) 0899 Photo Date: %s File Date: %s \n 0899 撮影日: %s ファイル日付: %s \n 0900 Pixel count 0900 ピクセル数 0901 Pixel difference 0901 ピクセルの差分 0902 Pixels 0902 ピクセル 0903 Places/Dates 0903 場所/日付 0904 Plugin working ... 0904 プラグイン実行中 ... 0905 Popup Image 0905 ポップアップ画像 0906 Power 0906 パワー 0907 Power Center 0907 パワー:中心 0908 Power: Center 0908 パワー:中心 0909 Pre-align Images 0909 画像の事前位置合わせ 0910 Preference: 0910 設定: 0911 Press F1 for help 0911 F1 でヘルプを表示 0912 Prev 0912 前へ 0913 Prev/Next 0913 前/次 0914 Previous 0914 前へ 0915 Previous gallery 0915 前のギャラリー 0916 Print Calibrated 0916 キャリブレーション印刷 0917 Print Image 0917 画像を印刷 0918 Print chart in vertical orientation without margins. 0918 チャートを余白なしで縦向きに印刷。 0919 Print current image file with calibrated colors 0919 現在の画像ファイルをキャリブレーションされた色で印刷 0920 Print the current image file 0920 現在の画像ファイルを印刷 0921 Privacy 0921 プライバシー 0922 Proceed 0922 続行 0923 Proceed? 0923 続行しますか? 0924 Process album files matching selected files: 0924 選択したファイルに一致するアルバムファイルを処理: 0925 Process an image using a custom convolution kernel 0925 カスタム畳み込みカーネルで画像を処理 0926 Process selected album files: 0926 選択したアルバムファイルを処理: 0927 Processing files 0927 ファイルを処理中 0928 Project name 0928 プロジェクト名 0929 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0929 マウスで画像の位置を引っ張ってください。 \n満足いくまで複数回マウスで引っ張ってください。 \n完了したら[OK]を押してください。 0930 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0930 マウスで画像の角を引っ張ってください。 \n満足いくまで複数回マウスで引っ張ってください。 \n完了したら[OK]を押してください。 0931 Pull on the image with the mouse. 0931 マウスで画像を引っ張ってください。 0932 Purge unwanted keywords from all image files 0932 すべての画像ファイルから不要な keywords を削除 0933 QUESTIONS, SUGGESTIONS 0933 質問・提案 0934 Quit 0934 終了 0935 Quit Fotocx 0935 Fotocx を終了 0936 Quit Fotocx? 0936 Fotocx を終了しますか? 0937 RAW Files 0937 RAW ファイル 0938 RAW Options 0938 RAW オプション 0939 RAW conversion failed: %s %s 0939 RAW 変換に失敗しました: %s %s 0940 RAW loader 0940 RAW ローダー 0941 RECENT FILES 0941 最近使用したファイル 0942 RECENT FOLDERS 0942 最近使用したフォルダー 0943 RED EYES 0943 赤目 0944 REFINE MENU 0944 リファインメニュー 0945 REMOVE DUST 0945 ほこりを除去 0946 REMOVE HALO 0946 ハローを除去 0947 RENAME 0947 名前変更 0948 RENAME ALBUM 0948 アルバム名を変更 0949 REPAIR MENU 0949 修復メニュー 0950 RESCALE 0950 リスケール 0951 RETOUCH 0951 レタッチ 0952 RGB -> BRG 0952 RGB -> BRG 0953 RGB -> GBR 0953 RGB -> GBR 0954 RGB HISTOGRAM 0954 RGB ヒストグラム 0955 RGB Histogram 0955 RGB ヒストグラム 0956 RGB brightness histogram graph 0956 RGB 明るさヒストグラムグラフ 0957 RGB color 0957 RGB カラー 0958 RGB mix with given bit-depth 0958 指定ビット深度での RGB ミックス 0959 ROTATE 0959 回転 0960 RUN SCRIPT 0960 スクリプトを実行 0961 Radial Blur 0961 放射状ぼかし 0962 Radial Blur - mix pixels in radial lines from chosen center 0962 放射状ぼかし - 選択した中心から放射状の線でピクセルを混合 0963 Radius 0963 半径 0964 Random Image 0964 ランダム画像 0965 Range 0965 範囲 0966 Rating: 0966 評価: 0967 Rating: %s Size: %s %.2fmb \n 0967 評価: %s サイズ: %s %.2fmb \n 0968 Read or search the user guide 0968 ユーザーガイドを読む・検索する 0969 Recent Files 0969 最近使用したファイル 0970 Recent Folders 0970 最近使用したフォルダー 0971 Recent Keywords 0971 最近使用した keywords 0972 Rectify closeup face photo (balloon face) 0972 クローズアップの顔写真を補正(風船顔) 0973 Red 0973 赤 0974 Red Eye Reduction 0974 赤目軽減 0975 Red Eyes 0975 赤目 0976 Red Factors 0976 赤係数 0977 Redo 0977 やり直し 0978 Reduce Fog/Haze 0978 霧/かすみを軽減 0979 Reduce fog/haze in an image or selected areas 0979 画像または選択エリアの霧/かすみを軽減 0980 Refine 0980 リファイン 0981 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0981 リファイン:ヒストグラムフラット化、局所コントラスト、コントラスト強調、レティネックス、彩度 0982 Remove 0982 削除 0983 Remove Dust 0983 ほこりを除去 0984 Remove Halo 0984 ハローを除去 0985 Remove dust spots from old scanned photos 0985 古いスキャン写真からほこりを除去 0986 Remove from Album 0986 アルバムから削除 0987 Remove halos left by some edit functions 0987 一部の編集機能で残るハローを除去 0988 Remove image curvature, especially in panoramas 0988 画像の湾曲(特にパノラマ)を除去 0989 Remove jaggies on hard image feature edges 0989 硬いエッジのジャギーを除去 0990 Remove selected image metadata 0990 選択した画像の metadata を削除 0991 Remove unwanted objects in an image 0991 画像内の不要な被写体を除去 0992 Rename 0992 名前変更 0993 Rename Album 0993 アルバム名を変更 0994 Rename Image File 0994 画像ファイル名を変更 0995 Rename an existing album 0995 既存のアルバムの名前を変更 0996 Rename or delete keywords for all image files 0996 すべての画像ファイルの keywords を名前変更または削除 0997 Rename to 0997 名前変更先: 0998 Rename/convert/rescale/move selected image or RAW files 0998 選択した画像または RAW ファイルの名前変更/変換/リスケール/移動 0999 Repair 0999 修復 1000 Repair malformed metadata preventing metadata edits 1000 metadata の編集を妨げる不正な metadata を修復 1001 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 1001 修復:シャープ化、ぼかし、ノイズ除去、霧除去、赤目、スマート消去、色調整 1002 Replace 1002 置換 1003 Replace Text 1003 テキストを置換 1004 Replace all versions with newest version 1004 すべてのバージョンを最新バージョンに置き換え 1005 Replace all versions with selected versions 1005 すべてのバージョンを選択したバージョンに置き換え 1006 Replace all with newest version only 1006 すべてを最新バージョンのみに置き換え 1007 Replace all with original + newest version 1007 すべてをオリジナル+最新バージョンに置き換え 1008 Replace all with original + selected versions 1008 すべてをオリジナル+選択したバージョンに置き換え 1009 Replace all with original and all versions 1009 すべてをオリジナルとすべてのバージョンに置き換え 1010 Replace all with selected versions 1010 すべてを選択したバージョンに置き換え 1011 Replace host files 1011 ホストファイルを置き換え 1012 Report Image Places/Dates 1012 画像の場所/日付をレポート 1013 Report selected metadata for selected image files 1013 選択した画像ファイルの選択した metadata をレポート 1014 Required programs are installed. \n 1014 必要なプログラムはインストールされています。 \n 1015 Rescale 1015 リスケール 1016 Rescale Image 1016 画像をリスケール 1017 Rescale RGB levels to reduce color caste and fog/haze 1017 RGB レベルをリスケールして色かぶりや霧/かすみを軽減 1018 Rescale brightness levels to increase local contrast 1018 明るさレベルをリスケールして局所コントラストを高める 1019 Rescale: 1019 リスケール: 1020 Reserved Shortcuts \n 1020 予約済みショートカット \n 1021 Reserved shortcut ignored: %s 1021 予約済みショートカットのため無視されました: %s 1022 Reset 1022 リセット 1023 Reset all galleries to file name ascending 1023 すべてのギャラリーをファイル名昇順にリセット 1024 Resolution 1024 解像度 1025 Resources 1025 リソース 1026 Resume 1026 再開 1027 Retouch 1027 レタッチ 1028 Reverse R 1028 R を反転 1029 Richardson-Lucy 1029 リチャードソン・ルーシー 1030 Right 1030 右 1031 Rim % 1031 縁 % 1032 Rotate 1032 回転 1033 Rotate Image 1033 画像を回転 1034 Rotate or level an image 1034 画像を回転または水平/垂直に補正 1035 Rotate: 1035 回転: 1036 Roy Lichtenstein effect 1036 ロイ・リキテンスタイン風効果 1037 SATURATION 1037 彩度 1038 SCRIPT FILES 1038 スクリプトファイル 1039 SEARCH IMAGES 1039 画像を検索 1040 SELECT AREA 1040 エリアを選択 1041 SELECT FILES 1041 ファイルを選択 1042 SELECT IMAGE FILES 1042 画像ファイルを選択 1043 SELECT MENU 1043 選択メニュー 1044 SET COLORS 1044 色を設定 1045 SET WALLPAPER 1045 壁紙に設定 1046 SETTINGS 1046 設定 1047 SHARPEN 1047 シャープ化 1048 SHIFT COLORS 1048 色をシフト 1049 SHORTCUTS 1049 ショートカット 1050 SHOW CIM FILES 1050 CIM ファイルを表示 1051 SHOW DIFFS 1051 差分を表示 1052 SHOW ON MAP 1052 マップで表示 1053 SHOW RESOURCES 1053 リソースを表示 1054 SHOW RGB 1054 RGB を表示 1055 SHOW/HIDE AREA 1055 エリアを表示/非表示 1056 SKETCH1 1056 スケッチ1 1057 SKETCH2 1057 スケッチ2 1058 SLIDE SHOW 1058 スライドショー 1059 SLIDES AND NEGATIVES 1059 スライドとネガ 1060 SLIDESHOW END 1060 スライドショー終了 1061 SMART ERASE 1061 スマート消去 1062 SOFT FOCUS 1062 ソフトフォーカス 1063 SPHERE 1063 球体 1064 SPLIT-SCREEN 1064 分割画面 1065 STACK/LAYERS 1065 スタック/レイヤー 1066 STACK/NOISE 1066 スタック/ノイズ 1067 STACK/PAINT 1067 スタック/ペイント 1068 Saturation 1068 彩度 1069 Save 1069 保存 1070 Save Gallery as Album 1070 ギャラリーをアルバムとして保存 1071 Save Image File 1071 画像ファイルを保存 1072 Save as new file name or type 1072 新しいファイル名または種類で保存 1073 Save current gallery as album 1073 現在のギャラリーをアルバムとして保存 1074 Save modified image as new file or new file version 1074 変更した画像を新しいファイルまたは新しいバージョンとして保存 1075 Save selected area to a file with transparency 1075 選択したエリアを透明度付きでファイルに保存 1076 Saved Areas 1076 保存済みエリア 1077 Scale 1077 スケール 1078 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1078 印刷したカラーチャートをスキャンし、最も暗い行を上にしてください。 \nプリンターと用紙の名前を使って .png ファイルとして保存してください \n(例:%s/Epson_glossy.png)。 \n 1079 Search 1079 検索 1080 Search Images 1080 画像を検索 1081 Search Results 1081 検索結果 1082 Search all image files and report duplicates 1082 すべての画像ファイルを検索して重複をレポート 1083 Searching - use ESC key to terminate 1083 検索中 - ESC キーで中止 1084 Seconds 1084 秒 1085 Select 1085 選択 1086 Select %d to %d files 1086 %d ~ %d 個のファイルを選択 1087 Select Album 1087 アルバムを選択 1088 Select Albums 1088 アルバムを選択 1089 Select Area 1089 エリアを選択 1090 Select Area for Edits 1090 編集用エリアを選択 1091 Select Area not supported \nby this edit function 1091 選択エリアはこの編集機能では \n使用できません 1092 Select Files 1092 ファイルを選択 1093 Select Image 1093 画像を選択 1094 Select Image Files 1094 画像ファイルを選択 1095 Select Metadata tags 1095 metadata tags を選択 1096 Select Script 1096 スクリプトを選択 1097 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1097 選択エリア機能を使ってゆがみ補正するエリアを選択してください。 \n[start warp]を押してマウスでエリアを引っ張ってください。 \n満足いくまで複数回マウスで引っ張ってください。 \n完了したら別のエリアを選択するか[OK]を押してください。 1098 Select and Paint Image 1098 画像を選択してペイント 1099 Select and view an image file 1099 画像ファイルを選択して表示 1100 Select area cannot be kept.\nContinue? 1100 選択エリアは保持できません。\n続行しますか? 1101 Select area disabled, Continue? 1101 選択エリアが無効になります、続行しますか? 1102 Select area not finished, Continue? 1102 選択エリアが未完了です、続行しますか? 1103 Select area will be ignored. \nContinue? 1103 選択エリアは無視されます。 \n続行しますか? 1104 Select folder 1104 フォルダーを選択 1105 Select host image files 1105 ホスト画像ファイルを選択 1106 Select image areas to edit separately, copy/paste selections 1106 別々に編集する画像エリアを選択、選択範囲をコピー/貼り付け 1107 Select image objects or areas for separate editing 1107 別々に編集する画像の被写体やエリアを選択 1108 Select input files for subsequent function 1108 続く機能の入力ファイルを選択 1109 Select overlay file 1109 オーバーレイファイルを選択 1110 Select startup album 1110 起動時のアルバムを選択 1111 Select startup folder 1111 起動時のフォルダーを選択 1112 Select startup image file 1112 起動時の画像ファイルを選択 1113 Select the image file to print. 1113 印刷する画像ファイルを選択してください。 1114 Select to add, click on X to delete. 1114 選択して追加、削除は X をクリック。 1115 Select two files 1115 2つのファイルを選択 1116 Select versions, ratings, keywords, filename text 1116 バージョン、評価、keywords、ファイル名テキストを選択 1117 Separation Horz 1117 水平方向の分離 1118 Sequence Numbers 1118 連番 1119 Set Colors 1119 色を設定 1120 Set No. of Colors 1120 色数を設定 1121 Set Ratio: 1121 比率を設定: 1122 Set Wallpaper 1122 壁紙に設定 1123 Set Width: 1123 幅を設定: 1124 Set and view bookmarks, select for gallery view 1124 ブックマークの設定と表示、ギャラリー表示用に選択 1125 Set black-white/color, negative/positive, sepia 1125 白黒/カラー、ネガ/ポジ、セピアを設定 1126 Set foreground line color (crop, grid, select, warp) 1126 前景線の色を設定(クロップ、グリッド、選択、ゆがみ補正) 1127 Set gallery from latest search results 1127 最新の検索結果からギャラリーを設定 1128 Set gallery from recent folders list 1128 最近使用したフォルダー一覧からギャラリーを設定 1129 Set gallery to folder of current file 1129 現在のファイルのフォルダーにギャラリーを設定 1130 Set horizontal/vertical grid line counts 1130 水平/垂直グリッド線の本数を設定 1131 Set image file as desktop wallpaper 1131 画像ファイルをデスクトップの壁紙に設定 1132 Set line properties, [Add] to layout, edit. 1132 線のプロパティを設定、[追加]でレイアウトに、編集。 1133 Set number of colors for each R/G/B or total 1133 各 R/G/B または合計の色数を設定 1134 Set or shift photo date/time for selected image files 1134 選択した画像ファイルの撮影日/時刻を設定またはシフト 1135 Set the name for the output calibration file \n[your calibration name].dat 1135 出力キャリブレーションファイル名を設定してください \n[キャリブレーション名].dat 1136 Settings 1136 設定 1137 Sharpen 1137 シャープ化 1138 Sharpen the image (various methods) 1138 画像をシャープ化(各種方式) 1139 Shift + drag mouse across image \nto indicate blur direction 1139 Shift を押しながら画像上でマウスをドラッグ \nしてぼかし方向を指定 1140 Shift Colors 1140 色をシフト 1141 Shift/convert image colors into other colors 1141 画像の色を別の色にシフト/変換 1142 Short List 1142 簡易リスト 1143 Show 1143 表示 1144 Show (outline) selected areas 1144 選択したエリアを表示(輪郭表示) 1145 Show CIM Files 1145 CIM ファイルを表示 1146 Show Diffs 1146 差分を表示 1147 Show Fotocx installed version and author contact 1147 Fotocx のインストール済みバージョンと作者連絡先を表示 1148 Show Fotocx updates for recent releases 1148 最近のリリースの Fotocx アップデートを表示 1149 Show Hidden 1149 隠しファイルを表示 1150 Show Log File 1150 ログファイルを表示 1151 Show RGB 1151 RGB を表示 1152 Show RGB levels at mouse position 1152 マウス位置の RGB レベルを表示 1153 Show Resources 1153 リソースを表示 1154 Show folder hierarchy, click folder for gallery view 1154 フォルダー階層を表示、フォルダーをクリックでギャラリー表示 1155 Show image counts in year/month table, select, report 1155 年/月別のテーブルで画像数を表示、選択、レポート 1156 Show image description (overlap) 1156 画像の説明を表示(オーバーラップ) 1157 Show image differences on the image 1157 画像上に差分を表示 1158 Show image file name (overlap) 1158 画像ファイル名を表示(オーバーラップ) 1159 Show image title (overlap) 1159 画像タイトルを表示(オーバーラップ) 1160 Show input files used in combine function 1160 結合機能で使用された入力ファイルを表示 1161 Show key metadata for current image or clicked thumbnail 1161 現在の画像またはクリックした thumbnail の主要 metadata を表示 1162 Show map position of the current image file 1162 現在の画像ファイルの地図上の位置を表示 1163 Show memory and CPU resources used 1163 使用中のメモリと CPU リソースを表示 1164 Show on Map 1164 マップで表示 1165 Show or make Keyboard Shortcuts 1165 キーボードショートカットを表示または作成 1166 Show the current (last used) album 1166 現在(最後に使用した)アルバムを表示 1167 Show the current log file 1167 現在のログファイルを表示 1168 Size 1168 サイズ 1169 Sketch1 1169 スケッチ1 1170 Sketch2 1170 スケッチ2 1171 Slide Show 1171 スライドショー 1172 Smart Erase 1172 スマート消去 1173 Soft Focus 1173 ソフトフォーカス 1174 Sphere 1174 球体 1175 Spherical Projection 1175 球面投影 1176 Split-Screen 1176 分割画面 1177 Stack/Layers 1177 スタック/レイヤー 1178 Stack/Noise 1178 スタック/ノイズ 1179 Stack/Paint 1179 スタック/ペイント 1180 Stacking Order 1180 スタック順序 1181 Start 1181 開始 1182 Start a slide show 1182 スライドショーを開始 1183 Start of gallery 1183 ギャラリーの先頭 1184 Startup View 1184 起動時の表示 1185 Stop 1185 停止 1186 Stretch 1186 ストレッチ 1187 Stretch: 1187 ストレッチ: 1188 Suppress JPEG compression artifacts 1188 JPEG 圧縮アーティファクトを抑制 1189 Suppress Ringing 1189 リンギングを抑制 1190 Suppress fine details while retaining sharpness 1190 シャープさを保ちながら細部を抑制 1191 Suppress noise from low-light photos 1191 低照度写真のノイズを抑制 1192 Survey all files 1192 すべてのファイルを調査 1193 TEXTURE 1193 テクスチャ 1194 THUMB VIEW 1194 thumbnail 表示 1195 TILES1 1195 タイル1 1196 TILES2 1196 タイル2 1197 TIMELINE 1197 タイムライン 1198 TINY PLANET 1198 タイニープラネット 1199 TOOLS MENU 1199 ツールメニュー 1200 TRANSLATIONS 1200 翻訳 1201 TWIST 1201 ツイスト 1202 Temperature 1202 色温度 1203 Text 1203 テキスト 1204 Text File: 1204 テキストファイル: 1205 Texture 1205 テクスチャ 1206 Threshold 1206 しきい値 1207 Threshold: Low 1207 しきい値:下限 1208 Thumbnail View 1208 thumbnail 表示 1209 Thumbnail size 1209 thumbnail サイズ 1210 Thumbnails folder 1210 thumbnails フォルダー 1211 Thumbnails folder: %s \nPlease remove. 1211 thumbnails フォルダー: %s \n削除してください。 1212 Thumbnails folder: \n %s \nmust be named .../thumbnails 1212 thumbnails フォルダー: \n %s \nは .../thumbnails という名前である必要があります 1213 Thumbnails: 1213 thumbnails: 1214 Tile 1214 タイル 1215 Tile blending 1215 タイルのブレンド 1216 Tile image with a repeating pattern 1216 繰り返しパターンで画像をタイル状に 1217 Tiles 1217 タイル 1218 Tiles1 1218 タイル1 1219 Tiles2 1219 タイル2 1220 Timeline 1220 タイムライン 1221 Tiny Planet 1221 タイニープラネット 1222 Title 1222 タイトル 1223 Title: %s\n 1223 タイトル: %s\n 1224 To Location 1224 場所へ 1225 Toggle Captions 1225 キャプションの切り替え 1226 Toggle Grid 1226 グリッドの切り替え 1227 Toggle grid lines on and off 1227 グリッド線の表示/非表示を切り替え 1228 Toggle image metadata display ON/OFF 1228 画像 metadata 表示の ON/OFF を切り替え 1229 Too little overlap, cannot align 1229 重なりが少なすぎて位置合わせできません 1230 Too many edits, please save image 1230 編集が多すぎます、画像を保存してください 1231 Tools 1231 ツール 1232 Tools: image index, settings, shortcuts, grid, find duplicates 1232 ツール:画像インデックス、設定、ショートカット、グリッド、重複検索 1233 Top 1233 上 1234 Total Colors 1234 総色数 1235 Trace 1235 トレース 1236 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1236 マウスクリックで上下のカーブをトレースし、 \nその後[flatten]。 1237 Transient Objects 1237 一時的な被写体 1238 Transition Preferences 1238 遷移の設定 1239 Transition to next image 1239 次の画像への遷移 1240 Transitions File 1240 遷移ファイル 1241 Transp. 1241 透過 1242 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1242 透明度マップは失われます \n(保持するには TIFF|PNG|JXL として保存) \nそれでも保存しますか? 1243 Trash 1243 ゴミ箱 1244 Trash read-only file? 1244 読み取り専用ファイルをゴミ箱に入れますか? 1245 Turn an image inside-out 1245 画像を裏返す 1246 Twist 1246 ツイスト 1247 Twist image centered at mouse position 1247 マウス位置を中心に画像をツイスト 1248 UNBEND 1248 曲げ補正 1249 UNDO/REDO BUTTON 1249 元に戻す/やり直すボタン 1250 UNWARP CLOSEUP 1250 クローズアップのゆがみ補正 1251 UPDATE ALBUMS 1251 アルバムを更新 1252 UPRIGHT 1252 upright 補正 1253 USER GUIDE 1253 ユーザーガイド 1254 Unable to copy metadata 1254 metadata をコピーできません 1255 Unbend 1255 曲げ補正 1256 Undo 1256 元に戻す 1257 Undo All 1257 すべて元に戻す 1258 Undo Last 1258 最後の操作を元に戻す 1259 Undo/Redo 1259 元に戻す/やり直す 1260 Uninstall 1260 アンインストール 1261 Unwarp Closeup 1261 クローズアップのゆがみ補正 1262 Update Albums 1262 アルバムを更新 1263 Update albums for new file versions 1263 新しいファイルバージョン用にアルバムを更新 1264 Upright 1264 upright 補正 1265 Upright Image 1265 画像の upright 補正 1266 Upright or mirror-flip an image 1266 画像を upright 補正またはミラー反転 1267 Upright rotated image files, selected set or ALL 1267 回転した画像ファイルを upright 補正、選択セットまたはすべて 1268 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1268 選択エリア機能を使って顔を選択してください。 \n歪みの中心をクリックしてください。 \nスライダーを動かしてください。 \n 1269 Use [Select] to add files to an empty album 1269 [選択]を使って空のアルバムにファイルを追加 1270 Use metadata photo date or file modification date? 1270 撮影日とファイル更新日、どちらを使用しますか? 1271 Use metadata tag 1271 metadata tag を使用 1272 Use settings file 1272 設定ファイルを使用 1273 User Guide 1273 ユーザーガイド 1274 User preferences and settings 1274 ユーザー設定と環境設定 1275 VIDEO press P to play 1275 動画:P キーで再生 1276 VIEW 360° PANO 1276 360° パノラマを表示 1277 VIEW ALL META 1277 すべての metadata を表示 1278 VIEW MAIN META 1278 主要な metadata を表示 1279 VIGNETTE 1279 ビネット 1280 Var. Transparency 1280 透明度の変化 1281 Vert 1281 垂直 1282 Video Files 1282 動画ファイル 1283 Video Tutorial 1283 動画チュートリアル 1284 Video command 1284 動画コマンド 1285 View 360 degree panorama image 1285 360度パノラマ画像を表示 1286 View 360° Pano 1286 360° パノラマを表示 1287 View All Meta 1287 すべての metadata を表示 1288 View All Metadata 1288 すべての metadata を表示 1289 View Main Meta 1289 主要な metadata を表示 1290 View Main Metadata 1290 主要な metadata を表示 1291 View before/after images using split-screen 1291 分割画面で前後の画像を表示 1292 View/edit metadata, image report and search functions 1292 metadata の表示/編集、画像レポート・検索機能 1293 Vignette 1293 ビネット 1294 W/H Ratio: 1294 幅/高さ比: 1295 WARP AFFINE 1295 アフィンゆがみ補正 1296 WARP AREA 1296 エリアのゆがみ補正 1297 WARP CURVED 1297 曲面ゆがみ補正 1298 WARP IMAGE 1298 画像のゆがみ補正 1299 WARP MENU 1299 ゆがみ補正メニュー 1300 WARP RADIAL 1300 放射状ゆがみ補正 1301 WINDOW VIEWS AND MENUS 1301 ウィンドウ表示とメニュー 1302 WORLD MAP 1302 世界地図 1303 Wait after zoom 1303 ズーム後の待機 1304 Wait before filename/title/description 1304 ファイル名/タイトル/説明の表示前の待機 1305 Wait before zoom 1305 ズーム前の待機 1306 Warp 1306 ゆがみ補正 1307 Warp Affine 1307 アフィンゆがみ補正 1308 Warp Area 1308 エリアのゆがみ補正 1309 Warp Curved 1309 曲面ゆがみ補正 1310 Warp Image 1310 画像のゆがみ補正 1311 Warp Linear1 1311 線形ゆがみ補正1 1312 Warp Linear2 1312 線形ゆがみ補正2 1313 Warp Radial 1313 放射状ゆがみ補正 1314 Warp an image with a wave pattern 1314 画像を波状パターンでゆがみ補正 1315 Warp image (affine) using the mouse 1315 マウスで画像をゆがみ補正(アフィン) 1316 Warp image (curved) using the mouse 1316 マウスで画像をゆがみ補正(曲面) 1317 Warp image (linear 1) using the mouse 1317 マウスで画像をゆがみ補正(線形1) 1318 Warp image (linear 2) using the mouse 1318 マウスで画像をゆがみ補正(線形2) 1319 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1319 ゆがみ補正:曲げ補正、パース補正、ゆがみ補正、クローズアップのゆがみ補正解除、フラット化、画像変形 1320 White 1320 白 1321 Widen: 1321 拡張: 1322 Width 1322 幅 1323 Width % 1323 幅 % 1324 X-size 1324 X サイズ 1325 Yes 1325 はい 1326 ZOOM 1326 ズーム 1327 Zoom 1327 ズーム 1328 Zoom Center 1328 ズームの中心 1329 Zoom Speed 1329 ズーム速度 1330 Zoom-in 1330 ズームイン 1331 Zoom-out 1331 ズームアウト 1332 \n %d-bits/color 1332 \n %d ビット/色 1333 \n *** CANCELED \n 1333 \n *** キャンセルされました \n 1334 \n *** COMPLETED \n 1334 \n *** 完了しました \n 1335 \n *** Delete Originals *** 1335 \n *** オリジナルを削除 *** 1336 \n *** Keep Originals *** 1336 \n *** オリジナルを保持 *** 1337 \n *** Replace Originals *** 1337 \n *** オリジナルを置き換え *** 1338 \n Convert to %s 1338 \n %s に変換 1339 \n Copy Metadata 1339 \n metadata をコピー 1340 \n Downsize within %dx%d 1340 \n %dx%d 以内に縮小 1341 \n New Location: %s 1341 \n 新しい場所: %s 1342 \n Output to %s 1342 \n %s に出力 1343 \n PROCEED? 1343 \n 続行しますか? 1344 \n Rename to %s 1344 \n %s に名前変更 1345 \n Replace text: %s --> %s 1345 \n テキストを置換: %s --> %s 1346 \n Rescale to %sx 1346 \n %sx にリスケール 1347 \n Update Albums 1347 \n アルバムを更新 1348 \n Upsize within %dx%d 1348 \n %dx%d 以内に拡大 1349 \n*** CANCELED \n 1349 \n*** キャンセルされました \n 1350 \n*** COMPLETED \n 1350 \n*** 完了しました \n 1351 \n\nPROCEED? 1351 \n\n続行しますか? 1352 add 1352 追加 1353 add after old 1353 古い項目の後に追加 1354 add all gallery files to list 1354 ギャラリーのすべてのファイルをリストに追加 1355 add current file to list 1355 現在のファイルをリストに追加 1356 add entered text to layout 1356 入力したテキストをレイアウトに追加 1357 add images to layout 1357 画像をレイアウトに追加 1358 add line/arrow to layout 1358 線/矢印をレイアウトに追加 1359 add new keyword 1359 新しい keyword を追加 1360 add or edit images 1360 画像を追加または編集 1361 add or edit lines/arrows 1361 線/矢印を追加または編集 1362 add or edit text 1362 テキストを追加または編集 1363 add to set 1363 セットに追加 1364 adder 1364 adder 1365 adjust brightness of selected image 1365 選択した画像の明るさを調整 1366 after removal of missing files: %d \n 1366 欠落ファイル削除後: %d \n 1367 album %s: deleted 1367 アルバム %s: 削除しました 1368 album already exists: %s 1368 アルバムは既に存在します: %s 1369 album mass update 1369 アルバム一括更新 1370 albums folder missing 1370 albums フォルダーがありません 1371 align and trim color chart 1371 カラーチャートの位置合わせとトリミング 1372 all files 1372 すべてのファイル 1373 all image files, including unmounted folders: %d \n 1373 マウントされていないフォルダーを含むすべての画像ファイル: %d \n 1374 all images 1374 すべての画像 1375 all versions 1375 すべてのバージョン 1376 amplify contrast 1376 コントラストを強調 1377 amplitude 1377 振幅 1378 angle 1378 角度 1379 apply 1379 適用 1380 area edge creep 1380 エリアのエッジのずれ 1381 area is not finished 1381 エリアが未完了です 1382 area outline color: 1382 エリアの輪郭の色: 1383 array width is too large: %d x %d 1383 配列の幅が大きすぎます: %d x %d 1384 ascending 1384 昇順 1385 auto color 1385 自動カラー 1386 background colors for file and gallery view windows 1386 ファイル表示・ギャラリー表示ウィンドウの背景色 1387 backing 1387 裏地 1388 bad category name 1388 不正なカテゴリー名 1389 bad keyword name 1389 不正な keyword 名 1390 bad pattern file: %s 1390 不正なパターンファイル: %s 1391 base 1391 base 1392 base and adder need $s plugin 1392 base と adder には $s プラグインが必要です 1393 base size 1393 基本サイズ 1394 begin making a script file 1394 スクリプトファイルの作成を開始 1395 black/white 1395 白黒 1396 black/white negative 1396 白黒ネガ 1397 black/white positive 1397 白黒ポジ 1398 blend 1398 ブレンド 1399 blend edges: blend width: 1399 エッジをブレンド: ブレンド幅: 1400 blend image overlaps over pixel width 1400 ピクセル幅で画像の重なりをブレンド 1401 blend rate: center: 1401 ブレンド率: 中心: 1402 blocking function: %s 1402 ブロック処理中の機能: %s 1403 blocksize 1403 ブロックサイズ 1404 blur edges: blur width: 1404 エッジをぼかす: ぼかし幅: 1405 blur radius 1405 ぼかし半径 1406 borders 1406 境界 1407 both 'All Files' and specific files were selected 1407 「すべてのファイル」と個別ファイルの両方が選択されています 1408 bright halo 1408 明るいハロー 1409 brightness rescale 1409 明るさのリスケール 1410 browse 1410 参照 1411 brush size 1411 ブラシサイズ 1412 build index, old files only 1412 インデックスを構築(古いファイルのみ) 1413 cancel project 1413 プロジェクトをキャンセル 1414 cancel project? 1414 プロジェクトをキャンセルしますか? 1415 cannot allocate %d MB memory 1415 %d MB のメモリを確保できません 1416 cannot be determined 1416 判定できません 1417 cannot copy a file to itself 1417 ファイルを自分自身にコピーできません 1418 cannot copy current file 1418 現在のファイルをコピーできません 1419 cannot create output file 1419 出力ファイルを作成できません 1420 cannot create pixbuf 1420 pixbuf を作成できません 1421 cannot find area outline 1421 エリアの輪郭が見つかりません 1422 cannot find output file 1422 出力ファイルが見つかりません 1423 cannot load input file 1423 入力ファイルを読み込めません 1424 cannot open file %s 1424 ファイル %s を開けません 1425 cannot parse current file 1425 現在のファイルを解析できません 1426 cannot parse file 1426 ファイルを解析できません 1427 cannot read pluging output file 1427 プラグインの出力ファイルを読み取れません 1428 cannot replace %s file 1428 %s ファイルを置き換えられません 1429 cannot save as RAW type 1429 RAW 形式として保存できません 1430 cannot save layout file: %s 1430 レイアウトファイルを保存できません: %s 1431 cannot write image folders file: %s 1431 画像フォルダーファイルを書き込めません: %s 1432 category %s has too many keywords 1432 カテゴリー %s の keywords が多すぎます 1433 category %s is too big 1433 カテゴリー %s が大きすぎます 1434 center 1434 中心 1435 change project scale 1435 プロジェクトの縮尺を変更 1436 choose 1-8 clicks or [+] keys for 2x image zoom 1436 2倍ズームには1~8クリックまたは[+]キーを選択 1437 choose a better spot 1437 別の場所を選んでください 1438 choose an image file 1438 画像ファイルを選択 1439 choose file 1439 ファイルを選択 1440 choose files 1440 ファイルを選択 1441 choose folder 1441 フォルダーを選択 1442 choose folders 1442 フォルダーを選択 1443 choose location 1443 場所を選択 1444 circle 1444 円 1445 clear area selections 1445 選択したエリアをクリア 1446 clear entered text 1446 入力したテキストをクリア 1447 clear inputs 1447 入力をクリア 1448 clear text 1448 テキストをクリア 1449 click a defined keyword (below) to add a search keyword 1449 検索 keyword を追加するには、下の定義済み keyword をクリック 1450 click bright point 1450 明部を基準点としてクリック 1451 click dark point 1451 暗部を基準点としてクリック 1452 click on desired color 1452 目的の色をクリック 1453 click on image to get source color 1453 画像をクリックして元の色を取得 1454 click on image to set matching color 1454 画像をクリックして合わせる色を設定 1455 click on thumbnail to set zoom center 1455 thumbnail をクリックしてズームの中心を設定 1456 click position to add line 1456 位置をクリックして線を追加 1457 click position to add text 1457 位置をクリックしてテキストを追加 1458 click to select 1458 クリックで選択 1459 click to unselect 1459 クリックで選択解除 1460 clicks per 2x image increase 1460 2倍ズームあたりのクリック数 1461 color 1461 色 1462 color depth 1462 色深度 1463 color depth: 1463 色深度: 1464 color match level % 1464 色の一致レベル % 1465 color negative 1465 カラーネガ 1466 column difference: %d pixels 1466 列の差: %d ピクセル 1467 column difference: %d pixels \nMake columns even? 1467 列の差: %d ピクセル \n列を揃えますか? 1468 combined image files 1468 結合した画像ファイル 1469 command: 1469 コマンド: 1470 commit all changes, close dialog 1470 すべての変更を確定してダイアログを閉じる 1471 complete file selection first 1471 まずファイル選択を完了してください 1472 completed 1472 完了 1473 condense into color blobs 1473 色の塊にまとめる 1474 condition 1474 条件 1475 confirm Fotocx exit 1475 Fotocx の終了を確認 1476 constant blur 1476 一定のぼかし 1477 continue? 1477 続行しますか? 1478 converting colors... 1478 色を変換中... 1479 converting files 1479 ファイルを変換中 1480 copy (duplicate file) 1480 コピー(複製ファイル) 1481 copy and paste commands 1481 コピー&貼り付けコマンド 1482 copy files to %s 1482 %s にファイルをコピー 1483 copy metadata from Nth file: 1483 N番目のファイルから metadata をコピー: 1484 copy to Desktop failed: %s 1484 デスクトップへのコピーに失敗しました: %s 1485 count: 0 1485 件数: 0 1486 create folder 1486 フォルダーを作成 1487 create folder %s 1487 フォルダー %s を作成 1488 current gallery 1488 現在のギャラリー 1489 current image files found: %d \n 1489 見つかった現在の画像ファイル数: %d \n 1490 current set only 1490 現在のセットのみ 1491 current set: 1491 現在のセット: 1492 curve file is invalid 1492 カーブファイルが無効です 1493 custom command to play video files 1493 動画ファイル再生用のカスタムコマンド 1494 dark 1494 暗い 1495 dark halo 1495 暗いハロー 1496 dark pixels 1496 暗いピクセル 1497 data is incomplete, proceed? 1497 データが不完全です、続行しますか? 1498 date format is yyyy:mm:dd [hh:mm:ss] 1498 日付形式は yyyy:mm:dd [hh:mm:ss] です 1499 date range 1499 日付範囲 1500 days 1500 日 1501 delete 1501 削除 1502 delete %s \n%s 1502 削除 %s \n%s 1503 delete Mashup project files? 1503 Mashup プロジェクトファイルを削除しますか? 1504 delete failed: \n%s 1504 削除に失敗しました: \n%s 1505 delete originals specified but no new name given 1505 オリジナル削除が指定されましたが、新しい名前が指定されていません 1506 delete selected text from layout 1506 選択したテキストをレイアウトから削除 1507 deleting orphan thumbnails ... \n 1507 孤立した thumbnails を削除中 ... \n 1508 depth 1508 深度 1509 descending 1509 降順 1510 direction of light and shadows 1510 光と影の方向 1511 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1511 ポップアップメニューなどを有効にするには thumbnail 選択を無効化 \n thumbnail 選択を再開するには[有効化]を使用 1512 discard changes? 1512 変更を破棄しますか? 1513 do not warp images during auto-alignment 1513 自動位置合わせ中に画像をゆがみ補正しない 1514 do nothing 1514 何もしない 1515 dot size 1515 ドットサイズ 1516 downsize 1516 縮小 1517 drag image 1517 画像をドラッグ 1518 drag mouse along an edge to follow the edge 1518 マウスをエッジに沿ってドラッグして追従 1519 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1519 マウスを下/右にドラッグして楕円を描く \nShift+ドラッグで中心を移動 \nShift+右下端をドラッグして変更 1520 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1520 マウスをドラッグして四角形を描く \nShift+ドラッグで中心を移動 \nShift+端をドラッグしてエッジを移動 1521 drag mouse to outline an area 1521 マウスをドラッグしてエリアを輪郭取り 1522 drag mouse to select circular or elliptical area 1522 マウスをドラッグして円形または楕円形のエリアを選択 1523 drag mouse to select rectangular area 1523 マウスをドラッグして四角形のエリアを選択 1524 drag mouse to show selected image 1524 マウスをドラッグして選択した画像を表示 1525 duplicate keyword 1525 keyword が重複しています 1526 edge distance calculation 1526 エッジ距離の計算 1527 edge: 1527 エッジ: 1528 edit 1528 編集 1529 edit commands 1529 コマンドを編集 1530 edit custom shell commands, match colors to embedded jpeg image 1530 カスタムシェルコマンドを編集、埋め込み jpeg 画像に色を合わせる 1531 edit this menu 1531 このメニューを編集 1532 ellipse 1532 楕円 1533 embedded numbers will sort by value 1533 埋め込まれた数値は値でソートされます 1534 emboss 1534 エンボス 1535 enter 2-character language code: en, de, fr ... 1535 2文字の言語コードを入力: en, de, fr ... 1536 enter a project name 1536 プロジェクト名を入力 1537 enter an album name 1537 アルバム名を入力 1538 enter cities/locations, countries 1538 都市/場所、国を入力 1539 enter project name 1539 プロジェクト名を入力 1540 enter tag name 1540 tag 名を入力 1541 enter tag names 1541 tag 名を入力 1542 erase 1542 消去 1543 error compensation 1543 誤差補正 1544 exceed %d edits 1544 %d 個の編集を超えています 1545 exceed %d images 1545 %d 枚の画像を超えています 1546 exceed %d max files, cannot continue 1546 最大 %d ファイルを超えているため続行できません 1547 exceed %d rows 1547 %d 行を超えています 1548 exceed %d selected files 1548 選択ファイル数 %d を超えています 1549 exceed %d shortcuts 1549 %d 個のショートカットを超えています 1550 exceeded %d line entries 1550 行数 %d を超えています 1551 exceeded %d text entries 1551 テキスト数 %d を超えています 1552 exceeded max. images: %d 1552 最大画像数を超えました: %d 1553 exceeded max. tiles: %d 1553 最大タイル数を超えました: %d 1554 exit split-screen 1554 分割画面を終了 1555 expand to these limits if smaller 1555 これより小さい場合はこの上限まで拡大 1556 exporting files 1556 ファイルをエクスポート中 1557 extra indexed metadata tags > %d 1557 追加でインデックスする metadata tags が %d を超えています 1558 extra metadata tags to include in index 1558 インデックスに含める追加の metadata tags 1559 extra metadata tags: \n 1559 追加の metadata tags: \n 1560 fetch 1560 取得 1561 file 1561 ファイル 1562 file .ext names to recognize RAW files 1562 RAW ファイルとして認識する拡張子 1563 file .ext names to recognize video files 1563 動画ファイルとして認識する拡張子 1564 file close error 1564 ファイルのクローズエラー 1565 file color 1565 ファイルの色 1566 file error: %s 1566 ファイルエラー: %s 1567 file format error 1567 ファイル形式エラー 1568 file format error: %s 1568 ファイル形式エラー: %s 1569 file included: %s \n 1569 ファイルが含まれています: %s \n 1570 file metadata update failed 1570 ファイルの metadata 更新に失敗しました 1571 file name 1571 ファイル名 1572 file names 1572 ファイル名 1573 file not found 1573 ファイルが見つかりません 1574 file not found \n 1574 ファイルが見つかりません \n 1575 file not found: %s 1575 ファイルが見つかりません: %s 1576 file not found: %s %s 1576 ファイルが見つかりません: %s %s 1577 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1577 ファイル形式: .jp2 .heic .avif .webp \nは .jpg になります - 続行しますか? 1578 file: %s \nexceed 99 versions 1578 ファイル: %s \n99バージョンを超えています 1579 filename text 1579 ファイル名テキスト 1580 files in %s can be deleted 1580 %s 内のファイルは削除できます 1581 fill from current gallery 1581 現在のギャラリーから取得 1582 fill from selected files 1582 選択したファイルから取得 1583 fill selected areas 1583 選択したエリアを塗りつぶす 1584 fill transparent areas 1584 透明なエリアを塗りつぶす 1585 find all image files ...\n 1585 すべての画像ファイルを検索中 ...\n 1586 find and report all unreadable image files 1586 読み込めないすべての画像ファイルを検索してレポート 1587 find outline gap 1587 輪郭の隙間を検索 1588 find via table lookup 1588 テーブル検索で検索 1589 find_imagefiles() failure \n 1589 find_imagefiles() が失敗しました \n 1590 find_imagefiles() failure: %s \n 1590 find_imagefiles() が失敗しました: %s \n 1591 finish current edit first 1591 まず現在の編集を完了してください 1592 finish making a script file 1592 スクリプトファイルの作成を完了 1593 finish or cancel pending edit 1593 保留中の編集を完了またはキャンセル 1594 fix box in layout and start new box 1594 レイアウト内の四角形を確定し、新しい四角形を開始 1595 fix line in layout and start new line 1595 レイアウト内の線を確定し、新しい線を開始 1596 fix motion blur 1596 モーションブラーを補正 1597 fix oval in layout and start new oval 1597 レイアウト内の楕円を確定し、新しい楕円を開始 1598 follow edge 1598 エッジに追従 1599 font name and size for menus and dilogs 1599 メニューとダイアログのフォント名とサイズ 1600 force a full re-index of all image files 1600 すべての画像ファイルを強制的に完全再インデックス 1601 format: yyyy:mm:dd [hh:mm:ss] 1601 形式: yyyy:mm:dd [hh:mm:ss] 1602 fotocx will exit 1602 Fotocx を終了します 1603 found %d pixels 1603 %d 個のピクセルが見つかりました 1604 free disk space: %d GB \n 1604 空きディスク容量: %d GB \n 1605 freehand draw 1605 フリーハンド描画 1606 ftruncate() failure: %s 1606 ftruncate() が失敗しました: %s 1607 full image index: reports will be complete \n 1607 完全な画像インデックス:レポートは完全になります \n 1608 function canceled 1608 機能がキャンセルされました 1609 gallery 1609 ギャラリー 1610 gallery is empty 1610 ギャラリーが空です 1611 gallery truncated to %d images 1611 ギャラリーを %d 枚に切り詰めました 1612 get images having text in filename (comma separated) 1612 ファイル名にテキストを含む画像を取得(カンマ区切り) 1613 get images with matching keywords (comma separated) 1613 一致する keywords を持つ画像を取得(カンマ区切り) 1614 get images within rating range 1614 評価範囲内の画像を取得 1615 gradual paint 1615 段階的ペイント 1616 grid counts not 0-100: %s 1616 グリッド数が 0~100 の範囲外です: %s 1617 grid picklist file error: %s 1617 グリッド選択リストファイルのエラー: %s 1618 grid size 1618 グリッドサイズ 1619 group 1619 グループ 1620 height 1620 高さ 1621 hide area outlines 1621 エリアの輪郭を非表示 1622 hide transient objects 1622 一時的な被写体を非表示 1623 high 1623 高 1624 home folder was not changed 1624 ホームフォルダーは変更されませんでした 1625 horizontal 1625 水平 1626 hours 1626 時間 1627 icons only, text only, or both 1627 アイコンのみ、テキストのみ、または両方 1628 if image < window, center or shift left or right 1628 画像がウィンドウより小さい場合、中央または左右にシフト 1629 ignore differences above limit 1629 上限を超える差分を無視 1630 image blend 1630 画像ブレンド 1631 image files 1631 画像ファイル 1632 image for source color 1632 元の色を取得する画像 1633 image index records found: %d \n 1633 見つかった画像インデックスレコード数: %d \n 1634 image index required 1634 画像インデックスが必要です 1635 image index write error: %s 1635 画像インデックスの書き込みエラー: %s 1636 image is too large to edit: %d x %d 1636 編集するには画像が大きすぎます: %d x %d 1637 image is too large: %dx%d, %lld megapix 1637 画像が大きすぎます: %dx%d、%lld メガピクセル 1638 image is too small to edit: %d x %d 1638 編集するには画像が小さすぎます: %d x %d 1639 image scale 1639 画像の縮尺 1640 image to set matching color 1640 色を合わせる画像 1641 image width must be greater than height 1641 画像の幅は高さより大きくする必要があります 1642 images to report 1642 レポートする画像 1643 include all files 1643 すべてのファイルを含める 1644 include edited versions 1644 編集済みバージョンを含める 1645 include last versions only 1645 最新バージョンのみを含める 1646 include original files 1646 オリジナルファイルを含める 1647 include transparent areas 1647 透明なエリアを含める 1648 include: 1648 含める: 1649 increase blur with distance 1649 距離に応じてぼかしを増やす 1650 index completed, %.1f seconds \n 1650 インデックス完了、%.1f 秒 \n 1651 index config file error: %s 1651 インデックス設定ファイルのエラー: %s 1652 index updates needed: %d thumbnails: %d \n 1652 インデックス更新が必要な件数: %d thumbnails: %d \n 1653 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1653 インデックス更新: %d タイトル/説明の更新: %d \nthumbnail 更新: %d、削除: %d \n 1654 input 1654 入力 1655 input file: %s \n 1655 入力ファイル: %s \n 1656 insufficient memory, cannot proceed 1656 メモリが不足しているため続行できません 1657 insufficient overlap for color matching 1657 色合わせに十分な重なりがありません 1658 invalid GPS data 1658 無効な GPS データです 1659 invalid GPS data: %s 1659 無効な GPS データ: %s 1660 invalid album 1660 無効なアルバムです 1661 invalid date range: %s %s 1661 無効な日付範囲です: %s %s 1662 invalid date/time format 1662 無効な日付/時刻形式です 1663 invalid file 1663 無効なファイルです 1664 invalid plugin: %s 1664 無効なプラグイン: %s 1665 invalid rating range 1665 無効な評価範囲です 1666 invalid source file: %s 1666 無効な入力ファイル: %s 1667 invert area 1667 エリアを反転 1668 jpeg quality level - 70+ for good image quality 1668 jpeg 品質レベル - 良好な画質には70以上 1669 keyboard 1669 キーボード 1670 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1670 キーボード操作: \nEsc: 実行中のスライドショーを終了 \n矢印キー: 前/次の画像 \nB: ウィンドウの表示/非表示 \nN: 次の画像へ遷移 \nP: 一時停止/再開 \nX: マウス位置を拡大表示 1671 keyword names 1671 keyword 名 1672 keywords to add 1672 追加する keywords 1673 keywords to remove 1673 削除する keywords 1674 keywords_defined file error: %s 1674 keywords_defined ファイルのエラー: %s 1675 last search 1675 最後の検索 1676 last version 1676 最新バージョン 1677 last versions 1677 最新バージョン 1678 layout exceeds 4 gigabytes 1678 レイアウトが4ギガバイトを超えています 1679 layout file missing: %s 1679 レイアウトファイルがありません: %s 1680 left 1680 左 1681 left click on image for selected color 1681 画像を左クリックして選択した色を取得 1682 left click: set image source location \nright click: set corresponding destination 1682 左クリック:画像の元の位置を設定 \n右クリック:対応する目的の位置を設定 1683 left drag: add transparency \nright drag: add opacity 1683 左ドラッグ:透明度を追加 \n右ドラッグ:不透明度を追加 1684 left drag: copy image to mouse position \nright drag: restore original image 1684 左ドラッグ:画像をマウス位置にコピー \n右ドラッグ:元の画像に戻す 1685 left drag: reduce halo, right drag: undo 1685 左ドラッグ:ハローを軽減、右ドラッグ:元に戻す 1686 lens mm 1686 レンズ mm 1687 level based on EXIF roll angle 1687 EXIF のロール角に基づいて水平補正 1688 light 1688 明るい 1689 light pixels 1689 明るいピクセル 1690 line 1690 線 1691 line color 1691 線の色 1692 line width 1692 線の太さ 1693 load 1693 読み込み 1694 load text data from a file 1694 ファイルからテキストデータを読み込み 1695 load widgets failed: %s 1695 ウィジェットの読み込みに失敗しました: %s 1696 loading palette ... 1696 パレットを読み込み中 ... 1697 location is not a folder 1697 場所がフォルダーではありません 1698 locations 1698 場所 1699 lock width/height ratio 1699 幅/高さ比を固定 1700 log file is in a terminal 1700 ログファイルはターミナルにあります 1701 low 1701 低 1702 low contrast 1702 低コントラスト 1703 lower 1703 下限 1704 make an initially empty album 1704 最初は空のアルバムを作成 1705 make new version 1705 新しいバージョンを作成 1706 manual align 1706 手動位置合わせ 1707 map marker (red dot) diameter, pixels 1707 マップマーカー(赤い点)の直径(ピクセル) 1708 map selected areas and verify 1708 選択したエリアをマップに表示して確認 1709 mashup project 1709 Mashup プロジェクト 1710 match embedded image color 1710 埋め込み画像の色に合わせる 1711 match image color to base image (repeat) 1711 ベース画像に色を合わせる(繰り返し) 1712 match values 1712 値を一致させる 1713 matches 1713 一致数 1714 max keywords exceeded 1714 keywords の最大数を超えました 1715 max. Width 1715 最大幅 1716 max. album count exceeded: %d 1716 アルバム数の上限を超えました: %d 1717 max. album files reached, results truncated 1717 アルバムファイルの上限に達しました、結果が切り詰められました 1718 max. album size exceeded: %d 1718 アルバムサイズの上限を超えました: %d 1719 max. blur radius 1719 最大ぼかし半径 1720 max. brightness 1720 最大の明るさ 1721 max. image limit reached: %d 1721 画像数の上限に達しました: %d 1722 max. width or height is not reasonable 1722 幅または高さが適切ではありません 1723 maximum clip allowed to fit window 1723 ウィンドウに収まる最大クリップ量 1724 mean RGB: %5.0f %5.0f %5.0f 1724 平均 RGB: %5.0f %5.0f %5.0f 1725 mean noise: %5.2f %5.2f %5.2f 1725 平均ノイズ: %5.2f %5.2f %5.2f 1726 median 1726 中央値 1727 median diff 1727 中央値の差 1728 menu text and background colors 1728 メニューのテキストと背景の色 1729 metadata 1729 metadata 1730 metadata copy failed 1730 metadata のコピーに失敗しました 1731 metadata from Search Function, metadata report 1731 検索機能からの metadata、metadata レポート 1732 metadata picklist file not found %s 1732 metadata 選択リストファイルが見つかりません %s 1733 metadata tags to report 1733 レポートする metadata tags 1734 metadata update error 1734 metadata の更新エラー 1735 metadata update error \n 1735 metadata の更新エラー \n 1736 metadata update error: %s 1736 metadata の更新エラー: %s 1737 metadata update failed \n 1737 metadata の更新に失敗しました \n 1738 min. blur radius 1738 最小ぼかし半径 1739 min. contrast 1739 最小コントラスト 1740 min. edit curve node separation, % of scale length 1740 編集カーブのノード間の最小間隔、スケール長に対する% 1741 min. separation, %c of scale 1741 最小間隔、スケールに対する%c 1742 minutes 1742 分 1743 mmap() failure: %s 1743 mmap() が失敗しました: %s 1744 months 1744 月 1745 more than %d categories 1745 %d カテゴリーを超えています 1746 more than 20 matches 1746 20 件を超える一致 1747 mouse radius 1747 マウス半径 1748 mouse radius for color sample 1748 色サンプル用のマウス半径 1749 mouse radius: 1749 マウス半径: 1750 move (delete original) 1750 移動(元ファイルを削除) 1751 move area boundary in/out in 1-pixel steps 1751 エリアの境界を1ピクセル単位で内側/外側に移動 1752 move to next input file 1752 次の入力ファイルに移動 1753 move to trash failed \n 1753 ゴミ箱への移動に失敗しました \n 1754 move to trash failed: %s 1754 ゴミ箱への移動に失敗しました: %s 1755 multiply 1755 乗算 1756 must have 4 corners 1756 4つの角が必要です 1757 need numeric match value: %s 1757 数値の一致値が必要です: %s 1758 negative 1758 ネガ 1759 new album created 1759 新しいアルバムを作成しました 1760 new album name 1760 新しいアルバム名 1761 new file 1761 新しいファイル 1762 new file ... 1762 新しいファイル ... 1763 new file name is invalid 1763 新しいファイル名が無効です 1764 new file type 1764 新しいファイルの種類 1765 new home folder contains a blank 1765 新しいホームフォルダーに空白が含まれています 1766 new location 1766 新しい場所 1767 new location is not a folder 1767 新しい場所はフォルダーではありません 1768 new version 1768 新しいバージョン 1769 newest files 1769 最新ファイル 1770 no EXIF orientation data 1770 EXIF の向きデータがありません 1771 no active Select Area 1771 有効な選択エリアがありません 1772 no albums selected 1772 アルバムが選択されていません 1773 no auto warp 1773 自動ゆがみ補正なし 1774 no change 1774 変更なし 1775 no current album 1775 現在のアルバムがありません 1776 no current edit image 1776 現在の編集画像がありません 1777 no current file 1777 現在のファイルがありません 1778 no curve (scanned image) 1778 カーブがありません(スキャン画像) 1779 no description 1779 説明がありません 1780 no file selected 1780 ファイルが選択されていません 1781 no files found 1781 ファイルが見つかりません 1782 no files selected 1782 ファイルが選択されていません 1783 no host files selected 1783 ホストファイルが選択されていません 1784 no image index: reports disabled \n 1784 画像インデックスがありません:レポートは無効です \n 1785 no images 1785 画像がありません 1786 no images found 1786 画像が見つかりません 1787 no input files available 1787 入力ファイルがありません 1788 no matching files found 1788 一致するファイルが見つかりません 1789 no matching locations 1789 一致する場所がありません 1790 no metadata level data 1790 metadata レベルデータがありません 1791 no metadata tags to report 1791 レポートする metadata tags がありません 1792 no option selected 1792 オプションが選択されていません 1793 no overlay file selected 1793 オーバーレイファイルが選択されていません 1794 no photo date, skipped 1794 撮影日がないためスキップしました 1795 no plugin output file found 1795 プラグインの出力ファイルが見つかりません 1796 no prior edit 1796 前回の編集がありません 1797 no prior edit image 1797 前回の編集画像がありません 1798 no saved folders 1798 保存されたフォルダーがありません 1799 no script file was started 1799 スクリプトファイルは開始されていません 1800 no script files found 1800 スクリプトファイルが見つかりません 1801 no select area 1801 選択エリアがありません 1802 no selection 1802 選択がありません 1803 no title 1803 タイトルがありません 1804 no write permission 1804 書き込み権限がありません 1805 no write permission \n 1805 書き込み権限がありません \n 1806 no write permission: %s 1806 書き込み権限がありません: %s 1807 none 1807 なし 1808 not a known image file 1808 認識できる画像ファイルではありません 1809 not an image file 1809 画像ファイルではありません 1810 not an indexed image file \n 1810 インデックスされた画像ファイルではありません \n 1811 nothing found 1811 見つかりませんでした 1812 nothing left, no change made 1812 変更する内容がありません 1813 old file 1813 古いファイル 1814 old image index: reports will omit new files \n 1814 古い画像インデックス:レポートには新しいファイルが含まれません \n 1815 old keyword name >> new keyword name 1815 古い keyword 名 >> 新しい keyword 名 1816 omit high pixel 1816 明部を除外 1817 omit low pixel 1817 暗部を除外 1818 only %d tile images found 1818 %d 枚のタイル画像しか見つかりません 1819 opacity center 1819 中心の不透明度 1820 opacity edge 1820 エッジの不透明度 1821 open album 1821 アルバムを開く 1822 open and process color chart 1822 カラーチャートを開いて処理 1823 open as new current file 1823 新しい現在のファイルとして開く 1824 optional deselect color 1824 選択解除する色(任意) 1825 original 1825 オリジナル 1826 originals 1826 オリジナル 1827 other 1827 その他 1828 out of space for temp files \nsave your edits and quit Fotocx 1828 一時ファイル用の容量が不足しています \n編集内容を保存して Fotocx を終了してください 1829 outline 1829 輪郭 1830 output file exists 1830 出力ファイルが既に存在します 1831 output file exists, overwrite? 1831 出力ファイルが既に存在します、上書きしますか? 1832 output file size change, cannot use select area 1832 出力ファイルのサイズが変更されるため、選択エリアは使用できません 1833 output file: 1833 出力ファイル: 1834 output file: %s \n 1834 出力ファイル: %s \n 1835 oval 1835 楕円 1836 overlay file missing: %s 1836 オーバーレイファイルがありません: %s 1837 owner 1837 所有者 1838 paint 1838 ペイント 1839 paint color 1839 ペイントの色 1840 paint edits cannot be used for this method 1840 この方法ではペイント編集を使用できません 1841 paint over transparent areas 1841 透明なエリアの上にペイント 1842 paint radius 1842 ペイント半径 1843 palette 1843 パレット 1844 palette exceeds %d color limit 1844 パレットが %d 色の上限を超えています 1845 palette file 1845 パレットファイル 1846 palette has %d colors 1846 パレットには %d 色あります 1847 palette loaded, %d colors 1847 パレットを読み込みました、%d 色 1848 palette: 1848 パレット: 1849 patch area goal 1849 パッチエリアの目標 1850 percent 1850 パーセント 1851 perform edits to include in the script file 1851 スクリプトファイルに含める編集を実行 1852 permissions: 1852 権限: 1853 perspective 1853 パースペクティブ 1854 photo 1854 写真 1855 picklist file not found: %s 1855 選択リストファイルが見つかりません: %s 1856 pixel = mean of best match neighbors 1856 ピクセル = 最も一致する近傍の平均 1857 pixel = median of all neighbors 1857 ピクセル = すべての近傍の中央値 1858 please make a choice 1858 選択してください 1859 plugin command failed 1859 プラグインコマンドが失敗しました 1860 plugin menu not found %s 1860 プラグインメニューが見つかりません %s 1861 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1861 プラグイン: (年 月 日 旧名 連番) $yyyy $mm $dd $oldname $s 1862 popup_choose: empty list 1862 popup_choose: リストが空です 1863 position with mouse click/drag 1863 マウスのクリック/ドラッグで位置を指定 1864 position: 50 50 1864 位置: 50 50 1865 position: x=%02d y=%02d 1865 位置: x=%02d y=%02d 1866 power 1866 パワー 1867 power center 1867 パワーの中心 1868 power edge 1868 パワーのエッジ 1869 power: center 1869 パワー:中心 1870 pref 1870 pref 1871 previous file 1871 前のファイル 1872 previous name 1872 以前の名前 1873 print color chart 1873 カラーチャートを印刷 1874 print select area(s) only? 1874 選択エリアのみ印刷しますか? 1875 prior edit step 1875 前回の編集ステップ 1876 project complete 1876 プロジェクト完了 1877 project file is defective 1877 プロジェクトファイルが破損しています 1878 project name cannot have quote characters 1878 プロジェクト名に引用符は使用できません 1879 pure RGB or black/white dots 1879 純粋な RGB または白黒のドット 1880 quality 1880 品質 1881 quality level (70+) 1881 品質レベル(70以上) 1882 radius 1882 半径 1883 radius: 1883 半径: 1884 random 1884 ランダム 1885 random position 1885 ランダムな位置 1886 rating range 1886 評価範囲 1887 reading image index file ...\n 1887 画像インデックスファイルを読み込み中 ...\n 1888 recent files 1888 最近使用したファイル 1889 reduce bright 1889 明部を軽減 1890 reduce dark 1890 暗部を軽減 1891 reduce to these limits if larger 1891 これより大きい場合はこの上限まで縮小 1892 refresh 1892 更新 1893 remove %d duplicates? 1893 %d 件の重複を削除しますか? 1894 remove all files in list 1894 リスト内のすべてのファイルを削除 1895 remove duplicate 1895 重複を削除 1896 remove from set 1896 セットから削除 1897 remove panorama image curving 1897 パノラマ画像の湾曲を除去 1898 remove selected file from list 1898 リストから選択したファイルを削除 1899 rename keywords 1899 keywords を名前変更 1900 repair metadata for %s 1900 %s の metadata を修復 1901 replace 1901 置換 1902 replace album %s ? 1902 アルバム %s を置き換えますか? 1903 replace file 1903 ファイルを置換 1904 replace old 1904 古いファイルを置換 1905 replace old file (OVERWRITE) 1905 古いファイルを置換(上書き) 1906 replace substring within file name 1906 ファイル名内の文字列を置換 1907 report type: 1907 レポートの種類: 1908 req. color match 1908 必要な色の一致 1909 reset 1909 リセット 1910 resolution 1910 解像度 1911 resume from current image 1911 現在の画像から再開 1912 right 1912 右 1913 right click on image for deselected color 1913 画像を右クリックして選択解除する色 1914 sample % 1914 サンプル % 1915 save 1915 保存 1916 save Mashup output file 1916 Mashup の出力ファイルを保存 1917 save Mashup project? 1917 Mashup プロジェクトを保存しますか? 1918 save area as a PNG file 1918 エリアを PNG ファイルとして保存 1919 save as new file name or type 1919 新しいファイル名または種類で保存 1920 save as new file version 1920 新しいファイルバージョンとして保存 1921 save edit, start new text 1921 編集を保存して新しいテキストを開始 1922 save metadata to image file 1922 metadata を画像ファイルに保存 1923 save text data to a file 1923 テキストデータをファイルに保存 1924 save to .heic/.avif file not supported 1924 .heic/.avif ファイルへの保存には対応していません 1925 save to .jp2 file not supported 1925 .jp2 ファイルへの保存には対応していません 1926 save to .webp file not supported 1926 .webp ファイルへの保存には対応していません 1927 scan and save color chart 1927 カラーチャートをスキャンして保存 1928 scanned color chart file 1928 スキャンしたカラーチャートファイル 1929 scope of neighbor pixels 1929 近傍ピクセルの範囲 1930 script already started 1930 スクリプトは既に開始されています 1931 script complete 1931 スクリプト完了 1932 script error: %s, %s 1932 スクリプトエラー: %s、%s 1933 script file closed 1933 スクリプトファイルを閉じました 1934 script file error 1934 スクリプトファイルのエラー 1935 script file format error: %s 1935 スクリプトファイルの形式エラー: %s 1936 script file name too big 1936 スクリプトファイル名が長すぎます 1937 script file to run 1937 実行するスクリプトファイル 1938 search for names in image location metadata 1938 画像の場所 metadata 内の名前を検索 1939 search for text within file folders or file name 1939 ファイルフォルダーまたはファイル名内のテキストを検索 1940 search for text within image title or description 1940 画像のタイトルまたは説明内のテキストを検索 1941 search known locations 1941 既知の場所を検索 1942 search range 1942 検索範囲 1943 search: 1943 検索: 1944 seconds 1944 秒 1945 seconds to show with text 1945 テキスト付きで表示する秒数 1946 seconds to show without text 1946 テキストなしで表示する秒数 1947 select all 1947 すべて選択 1948 select all colors within mouse (flood) 1948 マウス位置周辺のすべての色を選択(フラッド) 1949 select area missing or not finished 1949 選択エリアがないか未完了です 1950 select area within mouse 1950 マウス範囲内を選択 1951 select area within mouse circle 1951 マウスの円内を選択 1952 select base image for color matching 1952 色合わせの基準画像を選択 1953 select by color, required match level 1953 色で選択、必要な一致レベル 1954 select by color, search range 1954 色で選択、検索範囲 1955 select font 1955 フォントを選択 1956 select image to show with mouse paint 1956 マウスペイントで表示する画像を選択 1957 select images randomly 1957 画像をランダムに選択 1958 select initial files 1958 初期ファイルを選択 1959 select line color 1959 線の色を選択 1960 select one color within mouse 1960 マウス範囲内の1色を選択 1961 select rectangle 1961 四角形を選択 1962 select source image color first 1962 まず元の画像の色を選択 1963 select surrounding areas matching colors in mouse 1963 マウス範囲内の色に一致する周辺エリアを選択 1964 selection exceeds %d tags 1964 選択範囲が %d tags を超えています 1965 sepia 1965 セピア 1966 set a new date/time: 1966 新しい日付/時刻を設定: 1967 set all 1967 すべて設定 1968 set current window size 1968 現在のウィンドウサイズを設定 1969 set image color from input files 1969 入力ファイルから画像の色を設定 1970 set location from world map 1970 世界地図から場所を設定 1971 set maximum crop 1971 最大クロップを設定 1972 shadow 1972 影 1973 shell command used for converting RAW files to RGB 1973 RAW ファイルを RGB に変換するシェルコマンド 1974 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1974 Shift+左クリック:画像から色を取得 \n左ドラッグ:画像に色をペイント \n右ドラッグ:元の画像に戻す 1975 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1975 Shift+左クリック:コピー位置を同期 \n左ドラッグ:ソース画像をマウス位置にコピー \n右ドラッグ:元の画像に戻す 1976 shift existing date/time (+/–): 1976 既存の日付/時刻をシフト(+/–): 1977 shift+click on image to select color 1977 Shift+クリックで画像の色を選択 1978 shortcut function not found: %s 1978 ショートカット機能が見つかりません: %s 1979 shortcut key: 1979 ショートカットキー: 1980 shortcut not found: %s 1980 ショートカットが見つかりません: %s 1981 show area outlines 1981 エリアの輪郭を表示 1982 show hidden files and folders 1982 隠しファイルとフォルダーを表示 1983 show transient objects 1983 一時的な被写体を表示 1984 size of mouse selection circle 1984 マウス選択円のサイズ 1985 smooth 1985 なめらか 1986 source file: 1986 ソースファイル: 1987 source image failure (scale too big?) 1987 ソース画像の失敗(スケールが大きすぎる?) 1988 source image scale 1988 ソース画像のスケール 1989 specify a thumbnail folder 1989 thumbnail フォルダーを指定してください 1990 specify at least 1 top image folder 1990 少なくとも1つのトップ画像フォルダーを指定してください 1991 specify background size and color 1991 背景のサイズと色を指定 1992 specify files and keywords 1992 ファイルと keywords を指定 1993 spot size limit 1993 スポットサイズの上限 1994 start 1994 開始 1995 start a new script file 1995 新しいスクリプトファイルを開始 1996 start album 1996 開始アルバム 1997 start blob condensation process 1997 塊化処理を開始 1998 start file 1998 開始ファイル 1999 start folder 1999 開始フォルダー 2000 start from first image in album 2000 アルバムの最初の画像から開始 2001 start fusion process 2001 フュージョン処理を開始 2002 start over at end of album 2002 アルバムの末尾で最初に戻る 2003 start warp 2003 ゆがみ補正を開始 2004 start with previous image file, gallery of recent files, etc. 2004 前回のファイル、最近使用したファイルのギャラリーなどから開始 2005 startup album is invalid 2005 起動アルバムが無効です 2006 startup file is invalid 2006 起動ファイルが無効です 2007 startup folder is invalid 2007 起動フォルダーが無効です 2008 status: %s \n 2008 ステータス: %s \n 2009 status: completed \n 2009 ステータス: 完了 \n 2010 stay open 2010 開いたままにする 2011 step 2011 ステップ 2012 stop 2012 停止 2013 stop blob condensation process 2013 塊化処理を停止 2014 stop fusion process 2014 フュージョン処理を停止 2015 supply a file name 2015 ファイル名を入力してください 2016 tag name 2016 tag 名 2017 tag name %s not in xmeta tag list 2017 tag 名 %s は xmeta tag リストにありません 2018 tag value 2018 tag の値 2019 target file: 2019 対象ファイル: 2020 template 2020 テンプレート 2021 test: show changes, do not update files 2021 テスト:変更内容を表示、ファイルは更新しません 2022 text 2022 テキスト 2023 text file is defective 2023 テキストファイルが破損しています 2024 text time 2024 テキストの表示時間 2025 this function cannot be scripted 2025 この機能はスクリプト化できません 2026 thumbnail file 2026 thumbnail ファイル 2027 thumbnails deleted: %d \n 2027 削除した thumbnails: %d \n 2028 thumbnails folder: %s \n 2028 thumbnails フォルダー: %s \n 2029 tile area goal 2029 タイルエリアの目標 2030 tile gap 2030 タイルの間隔 2031 tile size 2031 タイルサイズ 2032 time 2032 時刻 2033 title/desc. 2033 タイトル/説明 2034 to add images to current set, \nsearch all images 2034 現在のセットに画像を追加するには、 \nすべての画像を検索してください 2035 to remove images from current set, \nsearch current set 2035 現在のセットから画像を削除するには、 \n現在のセットを検索してください 2036 too many categories 2036 カテゴリーが多すぎます 2037 too many files, cannot continue 2037 ファイルが多すぎて続行できません 2038 too many keywords in a category 2038 カテゴリー内の keywords が多すぎます 2039 top image folders: \n 2039 トップ画像フォルダー: \n 2040 transition 2040 遷移 2041 transitions 2041 遷移 2042 trash 2042 ゴミ箱 2043 trimmed color chart file 2043 トリミングしたカラーチャートファイル 2044 unable to save bookmarks file 2044 ブックマークファイルを保存できません 2045 unknown edit function: %s 2045 不明な編集機能: %s 2046 unknown file type 2046 不明なファイル形式 2047 unknown or empty album: %s 2047 不明または空のアルバム: %s 2048 unsharp mask 2048 アンシャープマスク 2049 update 2049 更新 2050 updating albums ...\n 2050 アルバムを更新中 ...\n 2051 upper 2051 上限 2052 upsize 2052 拡大 2053 use 2053 使用 2054 use a saved Mashup project 2054 保存済みの Mashup プロジェクトを使用 2055 use average 2055 平均を使用 2056 use custom color palette 2056 カスタムカラーパレットを使用 2057 use median 2057 中央値を使用 2058 use option to stop accidental quit 2058 誤って終了しないようにオプションを使用 2059 use previous input 2059 前回の入力を使用 2060 use previous location 2060 前回の場所を使用 2061 use prior edit step: 2061 使用する前回の編集ステップ: 2062 use the current image file 2062 現在の画像ファイルを使用 2063 variance 2063 分散 2064 versions 2064 バージョン 2065 vertical 2065 垂直 2066 video files not supported (install ffmpeg) 2066 動画ファイルには対応していません(ffmpeg をインストールしてください) 2067 view album 2067 アルバムを表示 2068 waiting 2068 待機中 2069 warp 2069 ゆがみ補正 2070 warp and align selected image with mouse drags 2070 マウスドラッグで選択した画像を位置合わせ・ゆがみ補正 2071 warp and fine-align selected image with neighbor 2071 隣接画像を使って選択した画像を位置合わせ・微調整 2072 warp span 2072 ゆがみ補正の範囲 2073 wavelength 2073 波長 2074 width 2074 幅 2075 writing updated image index file \n 2075 更新した画像インデックスファイルを書き込み中 \n 2076 x-count 2076 x 個数 2077 x-offset 2077 x オフセット 2078 y-count 2078 y 個数 2079 y-offset 2079 y オフセット 2080 years 2080 年 2081 you can close this window now \n 2081 このウィンドウを閉じてもかまいません \n 2082 you cannot use new name and replace text together 2082 新しい名前とテキスト置換は同時に使用できません 2083 you must use either $s or $oldname 2083 $s または $oldname のいずれかを使用してください 2084 zoom image 2084 画像をズーム 2085 zoom via mouse wheel or Keys +/=/-/↑/↓ 2085 マウスホイールまたはキー +/=/-/↑/↓ でズーム 2086 zoom-in 2086 ズームイン 2087 zoom-out 2087 ズームアウト fotocx/data/translations/ug_fi0000664000175000017500000101356715247006657015521 0ustar micomico- ^FOTOCX-KÄYTTÖOPAS^ v.26.8 Näytä Fotocx-valikosta Ohje > Käyttöopas - {FOTOCX-KÄYTTÖ} {ENSIMMÄINEN KÄYNNISTYS} - kuvatiedostojen paikannus ja indeksointi nopeaa hakua varten {KÄYTTÖOPAS} ← ^napsauta tästä^ - miten käyttää tätä käyttöoppaan selainta {IKKUNANÄKYMÄT JA VALIKOT} - ylätason ikkunat ja niihin liittyvät valikot {TIEDOSTONÄKYMÄ} - Tiedostonäkymä-ikkuna (yksittäisen kuvatiedoston katselu) {GALLERIANÄKYMÄ} - Gallerianäkymä-ikkuna (kansion katselu thumbnaileina) {KARTTANÄKYMÄ} - karttanäkymä-ikkuna (kartan katselu kuvien sijaintimerkeillä) {VEDÄ JA PUDOTA} - tiedostojen veto- ja pudotusmenetelmät {MUOKKAA MENETTELYJÄ} - miten kuvatiedostoja muokataan {MUOKKAA TYÖNKULKUA} - vaihtoehtoiset muokkaustavat - yksinkertainen ja monimutkainen {HIIREN OMISTAJUUS} - valintaikkunan hiirenohjaus ja vuorovaikutus {HIIREN ALT+OIKEA-PAINIKE} - hiiren oikea painike kosketuslevyille/-näytöille {VALINTAIKKUNAN PAINIKKEET} - valintaikkunan päätösvaihtoehdot {NÄPPÄIMISTÖN ESC-NÄPPÄIN} - Esc-näppäimen toiminnot {EI-STANDARDIT VALINTAIKKUNAN WIDGETIT} - miten käyttää ei-standardeja valintaikkunan widgetejä {KÄYRÄN MUOKKAUS} - miten käsitellä muokkaustoiminnoissa käytettäviä käyriä {MOUSE PAINTING} - kuvan paikallinen muokkaus hiirellä {ERÄKÄSITTELY} - yleiskatsaus eräkäsittelytoimintoihin {VALITSE KUVATIEDOSTOT} - kuvatiedostojen valintamenettely {PIKANÄPPÄIMET} - ponnahdusvalikot, pikanäppäimet, mukautettu käyttäjävalikko {HIIRITOIMINNOT} - hiiritoiminnot tiedosto-/galleria-/karttanäkymissä {KOMENTOPARAMETRIT} - Fotocxin komentorivin parametrit - {TIEDOSTOVALIKKO} {UUSI ISTUNTO} - käynnistä uusi Fotocx-istunto erillisessä ikkunassa {AVAA KUVATIEDOSTO} - avaa kuvatiedosto katselua tai muokkausta varten {KIERRÄTÄ 2 TIEDOSTOA} - selaa kahta viimeksi katsottua kuvatiedostoa {KIERRÄTÄ 3 TIEDOSTOA} - selaa kolmea viimeksi katsottua kuvatiedostoa {KATSELE 360° PANORAAMAA} - 360° panoraamakuva pyörivällä katselukulmalla {TYHJÄ KUVA} - luo tyhjä kuva määritetyllä koolla ja värillä {TYHJÄ KUVA} - luo uusi tyhjä kuva {KOPIOI/SIIRRÄ} - kopioi tai siirrä kuvatiedosto toiseen kansioon {KOPIOI TYÖPÖYDÄLLE} - kopioi kuvatiedosto työpöydälle {KOPIOI LEIKEPÖYDÄLLE} - kopioi kuvatiedosto leikepöydälle {POISTA/ROSKAKORIIN} - poista kuvatiedosto tai siirrä se roskakoriin {ASETA TAUSTAKUVA} - aseta työpöydän taustakuva nykyisestä kuvatiedostosta {TULOSTA KUVA} - tulosta kuvatiedosto {TULOSTA KALIBROITUNA} - tulosta värikalibrointitietoja käyttäen {KALIBROI TULOSTIN} - kalibroi tulostimen värit - kompensoi värisiirtymät - {GALLERIAVALIKKO} {GALLERIAN YLEISKATSAUS} {THUMB-NÄKYMÄ} - Gallerianäkymä thumbnaileilla ja tiedostonimillä {METADATANÄKYMÄ} - Gallerianäkymä thumbnailin ja perusmetadatan kanssa {VIIMEAIKAISET TIEDOSTOT} - Gallerianäkymä viimeksi katsotuista kuvatiedostoista {UUSIMMAT TIEDOSTOT} - Gallerianäkymä uusimmista kuvatiedostoista {GALLERIAN LAJITTELU} - muuta gallerian lajittelujärjestystä {GALLERIAN SUODATIN} - valitse uusimmat, vanhimmat, kaavaa vastaavat ... {GALLERIAN KOTI} - siirry gallerian alkuun {GALLERIAN LOPPU} - siirry gallerian loppuun {NYKYISEN TIEDOSTON KANSIO} - aseta nykyinen galleria nykyisen tiedoston kansiosta {VIIMEAIKAISET KANSIOT} - näytä luettelo viimeksi katsotuista kansioista, valitse {KANSIOPUU} - näytä kuvatiedostojen kansiot puurakenteessa, valitse {VALITSE TIEDOSTOT} - valitse tiedostot eräajon, skriptin tai albumin syötteeksi {KIRJANMERKIT} - näytä kirjanmerkkien luettelo, siirry kirjanmerkkiin {MUOKKAA KIRJANMERKKEJÄ} - lisää, poista, järjestä kirjanmerkkejä - {MAPS MENU} {MAAILMANKARTTA} - internetin maailmankartan yleiskatsaus {NÄYTÄ KARTALLA} - näytä nykyisen kuvan sijainti kartalla - {ALBUMIT-VALIKKO} {ALBUMIT} - luo ja järjestä kuvakokoelmia {LUO ALBUMI} - luo uusi albumi (valittujen kuvien galleria) {NIMEÄ ALBUMI UUDELLEEN} - nimeä olemassa oleva albumi uudelleen {POISTA ALBUMI} - poista olemassa oleva albumi {VALITSE ALBUMI} - valitse albumi ja näytä kuvien galleria {NYKYINEN ALBUMI} - näytä nykyinen (viimeksi käytetty) albumi {GALLERIASTA ALBUMIKSI} - tallenna nykyinen galleria nimettynä albumina {MUOKKAA ALBUMIA} - lisää, poista, järjestä uudelleen kuvatiedostoja albumin galleriassa {PÄIVITÄ ALBUMIT} - päivitä albumit päivitettyjä kuvatiedostoja varten (uudet versiot) {ALBUMIN MASSAPÄIVITYS} albumien massapäivitys (jäsentiedostojen lisäys/poisto/korvaus) {DIAESITYS} - diaesitys animoiduilla kuvasiirtymillä ja panoroinnilla/zoomauksella - {MUKAUTETTU VALIKKO} - mukautettu käyttäjävalikko usein käytetyille toiminnoille {SKRIPTITIEDOSTOT} - yleiskatsaus skriptitiedostoihin {MUOKKAA SKRIPTIÄ} - tallenna muokkaukset skriptiin mukautetun muokkaustoiminnon luomiseksi {SUORITA SKRIPTI} - suorita skripti nykyiselle kuvalle {ERÄSKRIPTI} - suorita skripti valituille kuvatiedostoille {LISÄOSAT} - käynnistä liitännäisen muokkaustoiminto, avaa liitännäisen tulostiedosto - {ZOOM} - zoomaa kuvaa tai thumbnaileja hiirellä tai näppäimistöllä - {EDELLINEN/SEURAAVA} - siirry edelliseen tai seuraavaan kuvaan hiirellä tai näppäimistöllä - {TALLENNA TIEDOSTO} - tallenna kuvatiedosto (korvaa, uusi versio, uusi tiedostonimi) - {METADATAVALIKKO} {KATSELE PÄÄMETADATAA} - listaa kuvan päämetadata {KATSELE KAIKKEA METADATAA} - listaa kaikki kuvan metadata {KEYWORDIEN YLEISKATSAUS} - kuvien hakuun käytetyt avainsanat {GEOTAGS OVERVIEW} - hakuun käytetyt paikannimet ja geokoordinaatit {MUOKKAA PÄÄMETADATAA} - muokkaa yleisesti käytettyä metadataa {MUOKKAA MITÄ TAHANSA METADATAA} - muokkaa mitä tahansa metadataa (lisää, poista, muuta) {POISTA METADATA} - poista määritetty metadata tai kaikki metadata {KOPIOI METADATA} - kopioi metadata yhdestä kuvatiedostosta toiseen {KORJAA METADATA} - korjaa virheellinen metadata, joka estää metadatan muokkauksen {HALLITSE KEYWORDEJA} - hallinnoi käyttäjän määrittämiä avainsanoja {KUVATEKSTIT} - näytä tiedostonimi, otsikko ja kuvaus kuvan kulmassa {PAIKAT/PÄIVÄMÄÄRÄT} - listaa kuvien sijainnit/päivämäärät, napsauta galleriaa varten {AIKAJANA} - näytä kuvien määrä vuosittain/kuukausittain, napsauta galleriaa varten {METADATA-TAGIT} - näytä kuvien määrä tag-arvon mukaan, napsauta galleriaa varten {AUTOMAATTIHAKU} - skriptattu Haku-toiminto tiedostojen löytämiseksi {HAE KUVIA} - hae millä tahansa metadatalla tai kansio-/tiedostonimillä - {VALINTAVALIKKO} {ALUEEN YLEISKATSAUS} - alueen valinta - käsitteet ja käyttö {VALITSE ALUE} - valitse kuvan kohde tai alue erillistä muokkausta varten {ETSI ALUEEN AUKKO} - etsi aukko käsin piirretyssä alueen ääriviivassa {ALUEEN SEKOITUS} - sekoita hiirellä valitun alueen sisällä tehtyjä muokkauksia {NÄYTÄ/PIILOTA ALUE} - näytä tai piilota alueen ääriviivat {OTA ALUE KÄYTTÖÖN/POIS KÄYTÖSTÄ} - ota alue käyttöön tai poista käytöstä muokkausta varten {KÄÄNNÄ ALUE} - käännä alue (vaihda ulko-/sisäpuoli keskenään) {TYHJENNÄ ALUE} - poista alue {KOPIOI/LIITÄ ALUE} - kopioi alue tai liitä alue nykyiseen kuvaan {LATAA/TALLENNA ALUE} - lataa alue tiedostosta tai tallenna tiedostoon - {KUMOA/TEE UUDELLEEN -PAINIKE} - kumoa tai tee uudelleen nykyisen kuvan muokkauksia peräkkäin - {MUOKKAUSVALIKKO} {KIERRÄ} - kierrä tai suorista kuva {OIKAISU} - oikaise kiertynyt tai peilikuvana oleva kuva {RAJAA} - rajaa (leikkaa) kuvan reunat {RETUSOI} - muokkaa kirkkautta, kontrastia, väriä, kylläisyyttä {SKAALAA} - muuta kuvan pikselimittoja {JAETTU NÄYTTÖ} - katsele ennen/jälkeen-muutoksia jaetulla näytöllä {NÄYTÄ EROT} - korosta muutokset muokkauksen aikana (tai minkä tahansa kahden kuvan välillä) {MARGINAALIT} - lisää kuvaan reunuksia, mikä tahansa väri tai läpinäkyvyys {MERKINTÄ} - piirrä kuvaan: teksti, viiva/nuoli, laatikko, soikio {VÄRITILA} - muunna mustavalkoiseksi, väriksi, negatiiviksi, positiiviksi {MAALAUSMUOKKAUKSET} - maalaa muokkaustoimintoa hiirellä paikallisesti ja asteittain {MAALAA KUVA} - maalaa hiirellä värillä, sivellinkoolla ja peittävyydellä {MAALAA LÄPINÄKYVYYS} - maalaa lisääntyvää läpinäkyvyyttä hiirellä {ALUEEN TÄYTTÖ} - täytä valitut alueet tai läpinäkyvät alueet värillä {KOPIOI KUVASSA} - kopioi pikseleitä kuvan sisällä hiirellä {KOPIOI KUVASTA} - kopioi pikseleitä toisesta kuvasta hiirellä {KOPIOI EDELLINEN MUOKKAUS} - kopioi pikseleitä aiemmista muokkauksista hiirellä - {KORJAUSVALIKKO} {TERÄVÖITÄ} - terävöitä sumea kuva, useita menetelmiä {SUMENNUS} - sumenna kuva tai kuvan alue, useita menetelmiä {POISTA KOHINA} - vähennä kuvan kohinaa (pieniä satunnaisia pilkkuja) {POISTA SUMU} - lisää tai poista sumua/utua kuvasta tai valitusta alueesta {PUNASILMÄT} - poista punasilmäisyys salamakuvista {ÄLYKÄS POISTO} - poista sähkölinjat, kyltit ja muut pienet häiriötekijät {POISTA HALO} - poista terävöinnin ja muiden toimintojen jättämät halot {JPEG-ARTEFAKTIT} - vaimenna artefakteja voimakkaasti pakatuissa tiedostoissa {REUNANPEHMENNYS} - vaimenna pikselöitymistä (sahalaitaisuutta) kohteiden reunoilla {SÄÄDÄ RGB} - säädä kuvan värejä RGB- tai CMY-värien avulla {SÄÄDÄ HSL} - valitse ja muuta värejä HSL-värimallilla {POISTA PÖLY} - poista pölypilkkuja vanhojen valokuvien kuvista {REUNUKSET} - korjaa reunojen värivirheet (kromaattinen aberraatio) - {HIENOSÄÄTÖVALIKKO} {TASOITA HISTOGRAMMI} - tasoita kirkkaushistogrammi paremman yksityiskohdan saamiseksi {PAIKALLINEN KONTRASTI} - lisää kontrastia, joka mukautuu paikalliseen kirkkauteen {VAHVISTA KONTRASTI} - voimista olemassa olevaa kontrastia yksityiskohtien korostamiseksi {GLOBAALI RETINEX} - skaalaa RGB-arvot uudelleen laajemman alueen saamiseksi {PAIKALLINEN RETINEX} - skaalaa RGB-arvot uudelleen laajemman alueen saamiseksi {KYLLÄISYYS} - säädä värikylläisyyttä kirkkauden perusteella {PEHMEÄ FOKUS} - lisää kuvaan klassinen "pehmeä fokus" -tehoste {KIRKKAUSLIUKU} - lisää kuvan yli kirkkaus-/väriliuku {VINJETTI} - muuta kirkkautta/väriä säteittäin valitun keskipisteen ympärillä - {TEHOSTEVALIKKO} {ÄÄRIVIIVAT} - muunna kuva ääriviivapiirrokseksi {LUONNOS1} - muunna kuva simuloiduksi luonnokseksi (1) {LUONNOS2} - muunna kuva simuloiduksi luonnokseksi (2) {SARJAKUVA} - muunna kuva sarjakuvamaiseksi piirrokseksi {KOHOKUVIO} - muunna kuva simuloiduksi kohokuvioinniksi (3D-tehoste) {LAATAT1} - muunna kuva neliölaatoiksi 3D-tehosteella {LAATAT2} - muunna kuva kuvaa mukaileviksi epäsäännöllisiksi laatoiksi {MAALAUS} - muunna kuva simuloiduksi maalaukseksi {TEKSTUURI} - lisää tekstuuria kuvaan tai valittuun alueeseen {FUUSIO} - vaimenna hienoja yksityiskohtia säilyttäen terävyyden {SOVITA VÄRIT} - sovita yhden kuvan värit toiseen kuvaan {KUVIO} - lisää kuvaan taustakuvio {RISTIVIIVOITUS} - muunna luonnokseksi risteävillä yhdensuuntaisilla viivoilla {RASTEROINTI} - eri tapoja pikselöidä tai posterisoida kuva {KAIVERRUS} - muunna kuva mustavalkoisiksi viivoiksi {LISÄÄ HEIJASTUS} - lisää kiiltoa kuvan kirkkaiden kohteiden ympärille {MOSAIIKKI} - muunna kuva mosaiikiksi käyttäen kuvista tehtyjä laattoja {LISÄÄ KOHINAA} - lisää kuvaan satunnaista kohinaa {ASETA VÄRIT} - vähennä värien määrää (posterisointi) {SIIRRÄ VÄREJÄ} - siirrä RGB-värit asteittain muotoon GBR tai BRG {VIERAAT VÄRIT} - lisää kuvaan satunnaisia outoja värejä {MUKAUTETTU YDIN} - muokkaa ja käytä mukautettua konvoluutioydintä - {VÄÄRISTYSVALIKKO} {OIKAISE} - suorista kuvia, joissa on kaarevia viivoja, erityisesti panoraamoja {PERSPEKTIIVI} - suorista tylpästä kulmasta kuvattu kohde {VÄÄRISTÄ ALUE} - väännä valittua kuva-aluetta vetämällä hiirellä {WARP LINEAR1} - väännä kuvaa hiirellä vetämällä - lineaarinen väännös 1 {WARP LINEAR2} - väännä kuvaa hiirellä vetämällä - lineaarinen väännös 2 {KAAREVA VÄÄRISTYS} - väännä kuvaa hiirellä vetämällä - kaareva väännös {AFFIININEN VÄÄRISTYS} - väännä kuvaa hiirellä vetämällä - yhdensuuntaiset viivat säilyvät {SÄTEITTÄINEN VÄÄRISTYS} - lisää tai poista tynnyri- tai neulatyynyvääristymää {POISTA LÄHIKUVAN VÄÄRISTYMÄ} - poista lähikuvan kasvokuvan vääristymä (iso nenä) {LUO AALTOJA} - väännä kuvaa aaltokuvion avulla {KIERTO} - kierrä kuvaa valitun keskipisteen ympäri {PALLO} - kaarra kuva pallomaiseen muotoon {SISÄPUOLI ULOS} - käännä kunkin pikselin etäisyys keskipisteestä reunaan {PIKKUPLANEETTA} - kääri panoraamakuva ympyrän muotoon {ESCHER-SPIRAALI} - muunna kuva loputtomaksi sisäänpäin kiertyväksi spiraaliksi {TASOITA VALOKUVA} - tasoita kaarevasta pinnasta otettu valokuva - {YHDISTÄ-VALIKKO} {HDR} - yhdistä tummia/vaaleita kuvia laajennetun kirkkausalueen saamiseksi {HDF} - yhdistä läheltä/kaukaa tarkennettuja kuvia laajennetun syväterävyysalueen saamiseksi {PINO/MAALAUS} - yhdistä kuvia poistaaksesi ohikulkevat autot, turistit yms. {PINO/KOHINA} - yhdistä kuvia vähentääksesi kohinaa keskiarvoistamalla {PINO/TASOT} - yhdistä kuvaversioita, valitse/maalaa alue/versio {PANORAAMA} - yhdistä kuvasarja vaakasuunnassa {NÄYTÄ CIM-TIEDOSTOT} - näytä nykyisen/viimeisimmän yhdistetyn kuvan syötetiedostot {MASHUP} - järjestä kuvia ja muotoiltua tekstiä mukautettuun asetteluun {KUVARYHMÄ} - yhdistä useita kuvia kompaktiin taulukkomuotoon - {ERÄVALIKKO} {ERÄMUUNNA} - kopioi, siirrä, muuta kokoa, nimeä uudelleen, muunna, lisää tekstiä ... {ERÄKOPIOI/SIIRRÄ} - kopioi/siirrä valitut kuvatiedostot uuteen kansioon {ERÄOIKAISU} - etsi kiertyneet kuvatiedostot ja oikaise ne {ERÄPOISTA/ROSKAKORIIN} - poista valitut kuvatiedostot tai siirrä ne roskakoriin {ERÄPEITEKUVA} - lisää peitekuva (tekijänoikeus ...) valittuihin kuviin {ERÄ-KEYWORDIT} - lisää tai poista avainsanoja valituille kuvatiedostoille {ERÄNIMEÄ KEYWORDIT UUDELLEEN} - nimeä uudelleen tai poista avainsanoja kaikista kuvatiedostoista {ERÄPOISTA KEYWORDIT} - poista ei-toivotut avainsanat kaikista kuvatiedostoista {ERÄ KUVAN PÄIVÄMÄÄRÄ} - muuta kuvien päivämääriä tai aikoja, tai siirrä aikavyöhykettä {ERÄMUUTA METADATA} - lisää tai muokkaa metadataa valituille kuvatiedostoille {ERÄRAPORTOI METADATA} - raportoi metadata valituista tai kaikista kuvatiedostoista {ERÄ-GEOTAGIT} - lisää tai muokkaa geotageja valituille tai kaikille kuvatiedostoille {VIE TIEDOSTOT} - vie valitut tiedostot kansioon (esim. verkkoon lataamista varten) - {TYÖKALUVALIKKO} {INDEKSOI TIEDOSTOT} - kertaluonteinen tehtävä kaikkien kuvatiedostojen löytämiseksi ja indeksoimiseksi {SIIRRÄ FOTOCX-KOTI} - siirrä Fotocxin kotikansio (käyttäjätiedot ja asetukset) {ASETUKSET} - käyttäjän asetukset ja Fotocxin toiminta-asetukset {PIKANÄPPÄIMET} - näytä ja muokkaa valikkotoimintojen pikanäppäimiä {RGB-HISTOGRAMMI} - nykyisen kuvan kirkkaushistogrammikaavio {SUURENNA KUVA} - muuta hiiri suurennuslasiksi kuvan päällä {MITTAA KUVA} - mittaa pikselietäisyyksiä kuvan sisällä (hiiren napsautuksilla) {NÄYTÄ RGB} - näytä RGB-arvot hiiren kohdalla tai valituissa pisteissä {RUUDUKON ASETUKSET} - näytä tai poista ruudukkoviivat, aseta viivojen määrä tai väli {VIIVAN VÄRI} - aseta väri valitun alueen ääriviivoille {TUMMAT/KIRKKAAT PIKSELIT} - työkalu leikkautumisen korostamiseen {NÄYTÖN VÄRI} - säädä näytön kirkkautta ja kontrastia {ETSI KAKSOISKAPPALEET} - etsi kaksoiskappaleita galleriasta tai kaikista kuvista {ETSI VIRHEELLISET TIEDOSTOT} - etsi lukukelvottomat kuvatiedostot, poista/siirrä/korjaa {NÄYTÄ RESURSSIT} - näytä suoritinaika ja nykyinen muistinkäyttö {KÄÄNNÖKSET} - luo tai muokkaa käyttöliittymän käännöksiä - {OHJEVALIKKO} - käyttöopas, opastus, muutosloki, tietoja Fotocxista, asennuksen poisto - {MUUT AIHEET} {VIDEO FILES} - videotiedostot, thumbnailit, videoiden toisto {DIAT JA NEGATIIVIT} - miten kuvata diat ja filmin negatiivit {FOTOCX-RAJOITUKSET} - koko- ja suorituskykyrajat {FOTOCX WINDOWS 11:LLE} - Fotocxin asentaminen Windows 11 WSL:ään {TIETOSUOJA} - Fotocxin tietosuoja- ja tietoturvakäytäntö {PROBLEM, QUESTION, SUGGESTION} - ota yhteyttä Fotocxin tekijään - - TOPIC: FOTOCX-KÄYTTÖ - - TOPIC: ENSIMMÄINEN KÄYNNISTYS - ^Ulkoiset ohjelmat Fotocx ilmoittaa vaadittavat ja valinnaiset ulkoiset ohjelmat sekä kunkin tarjoaman toiminnon. Jos joku vaadittu ohjelma puuttuu, asenna se ja käynnistä Fotocx uudelleen. - ^Ensimmäinen indeksointi Fotocx indeksoi kuvatiedostosi. Tämä nopeuttaa galleriasivujen (thumbnailien) näyttämistä, mahdollistaa nopean haun indeksoidun metadatan perusteella ja mahdollistaa napsautettavat karttamerkit kuvien katseluun sijainnin mukaan. Sinun täytyy syöttää yksi tai useampi 'ylätason' kuvakansio (esim. /home//Pictures). Alikansiot sisällytetään automaattisesti. Näiden kansioiden ei-kuvatiedostot jätetään huomiotta. Käytä [select]-painiketta ylätason kuvakansioiden paikantamiseen ja lisäämiseen. Käytännön raja on noin 30 ylätason kansiota. Kullakin voi olla satoja alikansioita. - ^Thumbnailit Tämä on kansio, johon thumbnail-tiedostot sijoitetaan. Käytä oletusarvoista kansiota tai valitse toinen sijainti. - ^Indeksointiaika Indeksointinopeus voi vaihdella muutamasta sadasta yli 10 000 tiedostoon minuutissa riippuen kuvatiedostojesi tyypistä ja koosta sekä tietokoneesi nopeudesta. Kun lisäät kokoelmaasi uusia kuvatiedostoja, seuraava Fotocxin käynnistys indeksoi uudet tiedostot. Jos uusia tiedostoja on paljon, käynnistys tarvitsee aikaa niiden indeksointiin. - ^Kuvan otsikon ja kuvauksen yhdistäminen Fotocxin kuvien indeksointitoiminto korvaa puuttuvan otsikko- ja kuvausmetadatan jollakin useista vaihtoehtoisista metadatatageista, jos sellainen on saatavilla: headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. Tämä tehdään, jotta voit aina katsella/muokata/hakea käyttäen ainoastaan kenttiä 'title' ja 'description'. Tämä muunnosprosessi on suhteellisen hidas (2200 tiedostoa minuutissa tekijän tehokkaalla tietokoneella). Tämä tehdään, kun uudet kuvatiedostot indeksoidaan ensimmäistä kertaa. Mitään ei poisteta. - - TOPIC: KÄYTTÖOPAS Avaa käyttöopas valikosta Ohje > Käyttöopas. Fotocxia käyttäessäsi voit painaa F1 nähdäksesi käyttöoppaan aiheen nykyiselle tai viimeksi käytetylle valikkotoiminnolle. - Vieritä tekstiä nuoli ylös/alas- ja page up/down -näppäimillä. [Etsi]-painike avaa valintaikkunan tekstihakua varten. Paina [Etsi] uudelleen siirtyäksesi seuraavaan osumaan. - Lihavoitu, isoilla kirjaimilla kirjoitettu teksti on napsautettava linkki aiheeseen, esim. {INDEKSOI TIEDOSTOT}. Käytä painikkeita [<] ja [>] siirtyäksesi edestakaisin viimeksi katsottujen aiheiden välillä. Painike [Recent] näyttää napsautettavan luettelon viimeksi katsotuista aiheista. - - TOPIC: IKKUNANÄKYMÄT JA VALIKOT +image: fotocx-views.jpg - ^Valikkopainikkeet Kun valikkoa napsautetaan, näkyviin tulee ponnahdusalivalikko. Kolme ylintä valikkoa (Tiedosto, Galleria, Kartat) asettavat vastaavan näkymätilan. Myös näppäimiä F/G/M voidaan käyttää. - - TOPIC: TIEDOSTONÄKYMÄ Yksi kuva täyttää koko Fotocx-ikkunan. Zoomaa sisään/ulos hiiren vasemmalla/oikealla napsautuksella. Z-näppäin vaihtaa ikkunaan sovittamisen ja 1x-kuvakoon (1 kuvapikseli = 1 näyttöpikseli) välillä. Panoroidaksesi zoomattua kuvaa, vedä hiirtä vasemmalla painikkeella kuvan yli. Myös hiiren rullalla voi zoomata kuvaa sisään tai ulos. Käytä valikkopainikkeita (Muokkaa, Korjaa jne.) kuvan muokkaamiseen. Käytä Tallenna tiedosto -painiketta muokatun tiedoston tallentamiseen: korvaa, luo uusi versio tai luo uusi tiedosto (uusi nimi). - ^Näppäimistön nuoli vasen/oikea -näppäimet Näytä edellinen tai seuraava kuvatiedosto nykyisessä galleriassa. - ^nuoli ylös/alas -näppäimet Kuten yllä, mutta näytetään vain viimeisimmät versiot, tai alkuperäinen, jos versioita ei ole. - - TOPIC: GALLERIANÄKYMÄ Kaikki nykyisen gallerian kuvatiedostot näytetään thumbnaileina taulukkona. - ^Gallerian tyypit • Kansio: kaikki yhden kansion (hakemiston) kuvatiedostot ja alikansiot • Albumi: eri kansioiden kuvatiedostoja, käyttäjän järjestäminä • Viimeisimmät tiedostot: viimeksi katsotut tai muokatut kuvatiedostot • Uusimmat tiedostot: viimeksi lisätyt tai muokatut kuvatiedostot • Hakutulokset: Haku-toiminnolla löydetyt kuvat. Myös albumi. - ^Gallerian toiminnot • vasen napsautus kuvan thumbnailiin: avaa kuva Tiedostonäkymä-tilassa • oikea napsautus kuvan thumbnailiin: yleisten toimintojen ponnahdusvalikko • napsautus kansion thumbnailiin: avaa kyseinen kansio Galleria-tilassa • kansiogallerian YLÄ-palkki: ylemmät kansiot - napsauta siirtyäksesi sinne • [TOP]-painike: luettelo ylätason kansioista - napsauta siirtyäksesi sinne • vierityspalkit: vieritä ylös/alas gallerian sisällä • nuoli ylös/alas -näppäimet: vieritä galleriaa yhden rivin verran • page up/down -näppäimet: vieritä galleriaa yhden sivun verran • home/end-näppäimet: siirry gallerian alkuun (ylös) ja loppuun (alas) • hiiren rulla: vieritä galleriaa ylös ja alas • [+]- ja [-]-näppäimet: suurenna/pienennä thumbnailin kokoa - ^Gallerian ponnahduskuvat • Napsauta thumbnailia hiiren keskipainikkeella ponnahduskuvaa varten • Napsauta thumbnailia shift + hiiren vasen -yhdistelmällä ponnahduskuvaa varten • Vasen napsautus ponnahduskuvaan: zoomaa kuva suuremmaksi • Oikea napsautus ponnahduskuvaan: sulje ponnahduskuva • Hiiren rulla: zoomaa ponnahduskuvaa suuremmaksi tai pienemmäksi • Näppäin F11: näytä ponnahduskuva koko näytöllä • Esc-näppäin: sulje ponnahduskuva • Useita ponnahduskuvia voidaan käyttää kuvien vertailuun - - TOPIC: KARTTANÄKYMÄ Katsele karttoja, jotka sisältävät kuvien sijainteja vastaavia merkkejä. Napsauta merkkiä nähdäksesi vastaavien kuvien gallerian. Tämä edellyttää, että kuvatiedostoihisi on upotettu geokoordinaatit (latitude, longitude). Nykyaikaiset kamerat lisäävät nämä automaattisesti, ja voit lisätä tämän tiedon myös itse. Aluksi näytetään maailmankartta. Käytä hiiren rullaa zoomataksesi sisään/ulos missä tahansa sijainnissa. Vedä siirtääksesi kartan keskipistettä. Koko maailmaa voi katsella missä tahansa mittakaavassa aina katutasolle asti. - - TOPIC: VEDÄ JA PUDOTA Jos avaat kaksi Fotocx-istuntoa, voit vetää ja pudottaa tiedostoja toisesta toiseen. Vedä gallerian thumbnail yhdestä ikkunasta toiseen. Jos kyseessä on Tiedostonäkymä, tiedosto avataan. Jos kyseessä on Gallerianäkymä, tulos riippuu gallerian tyypistä. Jos galleria on kansio, tiedosto lisätään kansioon ja galleria näyttää uuden tiedoston sen lajitellussa paikassa. Jos galleria on albumi, tiedosto lisätään albumiin kohtaan, johon se pudotettiin. - - TOPIC: MUOKKAA MENETTELYJÄ Tiedostonäkymä-tilassa olevaa kuvaa (nykyistä kuvaa) voidaan muokata valikkojen Muokkaa, Korjaa, Hienosäätö, Tehosteet, Väännä ja Yhdistä muokkaustoiminnoilla. Nämä toiminnot muokkaavat nykyistä kuvaa muistissa ja ikkunassa. Näitä toimintoja käytettäessä muokkaukset kertyvät. Kun olet valmis muokkaamaan, käytä [Tallenna]-valikkopainiketta tallentaaksesi muokatun kuvan takaisin samaan tiedostoon, uuteen versioon (esim. filename.v01.jpg) tai uuteen tiedostoon ja/tai kansioon. Kuvan muokkausvalintaikkunoissa on liukusäätimiä, painikkeita, spin-painikkeita tai muokattavia käyriä, jotka päivittävät kuvan välittömästi. - Napsauta Kumoa/Tee uudelleen -painiketta vasemmalla tai oikealla painikkeella kumotaksesi tai tehdäksesi uudelleen parhaillaan aktiivisen muokkaustoiminnon. Kun kuvaan on tehty yksi tai useampi muokkaus, kumoa/tee uudelleen -painikkeella voi askeltaa edestakaisin kaikkien valmiiden vaiheiden läpi nähdäkseen kuvan tilan jokaisen vaiheen jälkeen. Hiiren keskipainike näyttää ponnahdusluettelon kaikista nykyiseen kuvaan tehdyistä muokkauksista, ja voit valita minkä tahansa vaiheen, johon palata. Kuvaa voidaan muokata uudelleen mistä tahansa aiemmasta vaiheesta lähtien. Tämä hylkää kyseisen vaiheen jälkeen tehdyt muokkaukset, koska ne johdettiin siitä vaiheesta. Tämä kumoa/tee uudelleen -ominaisuus säilyy niin kauan kuin muokattu kuva pysyy nykyisenä kuvana. Jos toinen kuva avataan, muokkaushistoria hylätään. Jos haluat säilyttää mahdollisuuden palata nykyisen kuvan tilaan, tallenna kuva uutena versiona ennen kuin jatkat toisella muokkauksella. - - TOPIC: MUOKKAA TYÖNKULKUA - ^Yksinkertainen työnkulku Useimmiten voit vain muokata kamerasta tulevaa JPEG-tiedostoa. Käytä seuraavaa monimutkaisempaa menetelmää vain, jos näet väriraitoja muokkausten jälkeen, jotka ovat laajentaneet kirkkausaluetta joissakin kuvan osissa niin, että kirkkausaskeleet ovat riittävän suuria näkyäkseen. - ^Monimutkainen työnkulku Muokataksesi syvävärillä (yli 8 bittiä per RGB-väri), aloita kameran RAW-tiedostosta. RAW-tiedostoa voidaan muokata kuten mitä tahansa muuta kuvatiedostoa. Fotocxin muokkaustoiminnot toimivat 24 bitillä per väri, joten RAW-tiedoston täysi värisyvyys säilyy. Kun avaat RAW-tiedoston, käytetään valittua RAW-latainta - katso {ASETUKSET}. Voit myös käyttää Erämuunnos-toimintoa muuntaaksesi useita RAW-tiedostoja TIFF-, PNG- tai JXL-tiedostoiksi, joissa on 16 bittiä per väri. - Dcraw on oletusarvoinen RAW-tiedoston latain. Voit myös käyttää monimutkaisempaa RAW-editoria, kuten Rawtherapeeta - katso {ASETUKSET}. Dcraw on vertailussa yksinkertainen ja nopea. RAW-editorin muokkaustoiminnot voidaan yleensä tehdä helpommin Fotocxilla. - - TOPIC: HIIREN OMISTAJUUS Jotkut muokkausvalintaikkunat käyttävät hiirtä pääikkunan kuvan viittaamiseen tai muuttamiseen. Useampi tällainen valintaikkuna voi olla aktiivisena samanaikaisesti. Hiirtä käytetään myös kuvan zoomaamiseen ja vierittämiseen, ja saatat tarvita tätä myös muokkausvalintaikkunaa käyttäessäsi. Siksi on tärkeää ymmärtää, mikä valintaikkuna tai ikkuna omistaa hiiren, ja miten omistajuutta voi vaihtaa: • Jos valintaikkunalla on näppäimistön kohdistus, hiiritoiminnot kuvassa ovat syötteitä tälle valintaikkunalle eivätkä zoomaa tai vieritä kuvaa. • Jos pidät CTRL-näppäintä pohjassa napsauttaessasi tai vetäessäsi hiirtä kuvan päällä, kuva zoomaa tai panoroi/vierittää. Avoimet valintaikkunat eivät vaikutu. • Hiiren rulla voi zoomata sisään/ulos missä tahansa kuvan kohdassa. - - TOPIC: HIIREN ALT+OIKEA-PAINIKE Kosketuslevyillä tai kosketusnäytöillä hiiren oikea napsautus voi olla hankala. Jos ALT-näppäintä pidetään pohjassa hiiren vasenta painiketta painettaessa, se tulkitaan hiiren oikeaksi painikkeeksi. - - TOPIC: VALINTAIKKUNAN PAINIKKEET Nämä toimivat pääasiassa seuraavasti: • [Nollaa] - kumoaa nykyisen muokkauksen, palauttaa kuvan alkutilaan • [Käytä] - ottaa valintaikkunan asetukset käyttöön kuvassa, jättää valintaikkunan aktiiviseksi • [OK] - sama kuin [Käytä], mutta valintaikkuna suljetaan • [Peruuta] - hylkää kuvan muutokset ja sulkee valintaikkunan • [Jatka] - jatkaa pitkäkestoista tehtävää valintaikkunan syötteiden perusteella • [X] - sulkee valintaikkunan ilman toimintoa - - TOPIC: NÄPPÄIMISTÖN ESC-NÄPPÄIN Pääikkunalla on kohdistus: • jos pitkäkestoinen toiminto on vielä käynnissä, keskeytä se • jos pääikkuna on suurennettu, palauta aiempi koko • jos nykyinen näkymä on galleria tai kartta, vaihda tiedostonäkymään • jos mikään yllä olevista ei päde: sulje Fotocx Valintaikkunalla on kohdistus: sulkee valintaikkunan (sama kuin [X]-painike) Muut: peruuttaa ponnahduskuvan, poistuu 360-panoraamakatselimesta, keskeyttää tai poistuu diaesityksestä. - - TOPIC: EI-STANDARDIT VALINTAIKKUNAN WIDGETIT +image: custom-widgets.png - Joitakin ei-standardeja widgetejä käytetään valintaikkunan koon pienentämiseen tai käytön helpottamiseen. Ne toimivat lähes kuten standardit GTK-widgetit. Numeerinen tietowidget toimii kuten GTK-spin-painike: hiiren rullaa ja näppäimistön nuoli ylös/alas -näppäimiä voidaan käyttää arvon nopeaan kasvattamiseen tai pienentämiseen. Jos käytät kosketuslevyä, napauta kenttää kohdistimen asettamiseksi, ja käytä sitten näppäimistöä arvon syöttämiseen, tai käytä näppäimistön nuoli ylös/alas -näppäimiä uuden arvon nopeaan asettamiseen. Jos näppäin pidetään pohjassa, muutosnopeus kiihtyy ajan myötä. Shift-näppäintä voidaan käyttää nopeuden 10-kertaistamiseen. Epälineaarinen liukusäädin laajentaa asteikkoa neutraalin arvon ympärillä, jotta pieniä muutoksia voidaan hallita tarkemmin, erityisesti kosketuslevyllä. Muutamien standardien GTK-widgetien kokoa on pienennetty poistamalla ylimääräistä täytettä. Tätä ohjaa tiedosto 'widgets.css' Fotocxin kotikansiossa. Voit muokata tätä tiedostoa halutessasi. Voit poistaa kohteita tai merkitä ne kommenteiksi, mutta älä poista itse tiedostoa - se korvattaisiin automaattisesti. - - TOPIC: KÄYRÄN MUOKKAUS +image: retouch.png - Jotkut kuvan muokkaustoiminnot käyttävät muokattavia käyriä. Voit käsitellä käyriä muuttaaksesi jotain kuvan ominaisuutta jonkin toisen ominaisuuden perusteella. Käyriä voidaan siirtää (vetää) hiirellä. Ankkuripiste (musta piste) lisätään käyrälle sinne, missä sitä vedetään, ja tämä piste pysyy paikallaan - käyrä kulkee edelleen tämän pisteen kautta, kun käyrän muita osia vedetään. Ankkuripistettä voi siirtää vetämällä, tai poistaa oikealla napsautuksella. - - TOPIC: MOUSE PAINTING Hiirtä voidaan käyttää kuvan paikalliseen muokkaamiseen. Hiiren sijainnin ympärillä oleva ympyrä rajaa kuva-alueen, jota muokataan, kun hiirtä vedetään vasemmalla painikkeella kuvan yli. Muokkauksen lähde voi olla muokkaustoiminto, valittu väri tai pikselit saman kuvan muualta tai toisesta kuvasta. Hiiriympyrän sisällä olevat kuvan pikselit muokataan vastaamaan lähdettä. Muutosnopeus voi olla nopea tai asteittainen riippuen hiiren keskustan ja reunan tehokertoimista. Jos keskustan kerroin on korkea ja reunan kerroin matala, kuvaa muokataan nopeammin hiiren keskustassa ja asteittain vähemmän keskustasta reunaan siirryttäessä. Vedä hiirtä toistuvasti vasemmalla painikkeella saman kuva-alueen yli kerätäksesi muutoksia, kunnes pikselit vastaavat täysin lähdeväriä tai -kuvaa, tai lähteen muokkaustoiminto on täysin käytetty. Vedä oikealla painikkeella kumotaksesi muutokset asteittain, palauttaen alkuperäisen kuvan. - Esimerkki: jos muokkaustoiminto on Retusointi ja kirkkautta lisätään, kuva kirkastuu hiirialueella, kun hiirtä vedetään vasemmalla painikkeella. Käytä oikealla vetämistä palauttaaksesi alkuperäisen kuvan asteittain. - [undo-last] -painike kumoaa viimeisen maalaus- tai pyyhkimistoiminnon, ja tätä voi toistaa useiden viimeaikaisten muokkausten poistamiseksi. Jokainen uusi hiiren vetotoiminto on työyksikkö, joka voidaan kumota erikseen. Kumoamiseen käytettävä muisti on rajallinen, joten vain viimeisimmät maalaus- ja pyyhkimisvaiheet säilytetään. [undo all] palauttaa kuvan alkuperäiseen tilaansa. - Käytä [undo/redo] -painiketta muutosten tarkasteluun muokkausten aikana. - Jos {VALITSE ALUE} on aktiivinen, maalaus rajoittuu alueen sisään. - HUOMAA: Zoomaa kuva 100 %:iin tai suuremmaksi, kun käytät hyvin pientä sädettä (esim. viivoja piirrettäessä kuvaan). Hiiren liikeaskeleet ovat näyttöpikseleinä. Jos tämä kattaa monta kuvapikseliä ja käytössä on pieni säde, hiiri voi ohittaa joitakin pikseleitä, joita ei silloin käsitellä. - - TOPIC: ERÄKÄSITTELY Valikossa {ERÄVALIKKO} on useita eräkäsittelytoimintoja, jotka nopeuttavat joitakin yleisiä tehtäviä. Voit valita useita kuvatiedostoja ja suorittaa eräkäsittelytoiminnon kaikille niille. Eräkäsittelytoimintoja voidaan käyttää tiedostonimen tai -tyypin muuttamiseen, oikaisuun, koon muuttamiseen, kopiointiin tai siirtoon, poistoon, tagien, avainsanojen, sijainnin/geokoordinaattien ja kuvauspäivämäärien muokkaamiseen. - - TOPIC: VALITSE KUVATIEDOSTOT +image: select-image-files.jpg - Tätä menettelyä käytetään kaikissa toiminnoissa, jotka käsittelevät useita kuvatiedostoja. Menettely on selitetty tässä, ja tämä aihe on linkitetty jokaisesta toiminnosta, joka käyttää menettelyä. • vasen napsautus thumbnailiin: lisää valintaluetteloon • oikea napsautus: poista • lisää useita: napsauta ensimmäistä thumbnailia, shift-napsauta viimeistä • [Lisää kaikki] -painike: lisää koko galleria • [Lisää nykyinen] -painike: lisää nykyinen tiedosto • tiedosto voidaan lisätä luetteloon useita kertoja • siirry muihin gallerioihin valitaksesi lisää tiedostoja tarpeen mukaan • [Poista]-painike: poistaa valitun luettelokohdan • [Tyhjennä]-painike: tyhjentää koko luettelon • nuoli ylös/alas -näppäimet: askella luettelossa, katsele thumbnaileja • home/end-näppäimet: siirry luettelon alkuun/loppuun - [Poista käytöstä] -painike poistaa thumbnailien napsauttamisen käytöstä tiedostojen valitsemiseksi. Painike nimetään tämän jälkeen uudelleen [Ota käyttöön] -painikkeeksi - paina sitä palauttaaksesi thumbnailien napsautuksen. Tämän tarkoituksena on mahdollistaa normaalit thumbnailien ponnahdusvalikot ja vasen napsautus tiedoston katselemiseksi täydessä koossa, mikä ei ole mahdollista, jos thumbnailien napsautuksia käytetään tiedostojen valintaan. Saatat tarvita tätä valintojen tekemiseen. Voit myös pysyä tiedostonäkymä-tilassa ja selata kuvia nuolinäppäimillä käyttäen samalla [Lisää nykyinen] -painiketta tiedostojen lisäämiseksi valintaluetteloon. - - TOPIC: PIKANÄPPÄIMET Usein käytetyille toiminnoille on kolme pikavalintamenetelmää: • Napsauta pääikkunaa tai gallerian thumbnailia oikealla painikkeella. Ponnahdusvalikko näyttää joitakin yleisesti käytettyjä toimintoja. • Voit vaihtaa pikanäppäimiä ja lisätä uusia pikavalintoja. Katso {PIKANÄPPÄIMET}. • Kokoa usein käytetyt toiminnot mukautettuun valikkoon. Katso {MUKAUTETTU VALIKKO}. - Pikanäppäimet ovat käytettävissä yleisimmille toiminnoille. Käytä valikkoa Työkalut > Pikanäppäimet niiden katseluun tai muuttamiseen. - Seuraavat pikanäppäimet ovat kiinteitä eikä niitä voi muuttaa: • [+] [=] -näppäin: zoomaa kuvaa tai thumbnaileja suuremmaksi • [-]-näppäin: zoomaa kuvaa tai thumbnaileja pienemmäksi • Z-näppäin: vaihtaa zoomausta: 1x <--> sovita ikkunaan • F1-näppäin: näytä käyttöopas nykyiselle toiminnolle • F10-näppäin: vaihtaa pääikkunan koko näytön tilaan ja takaisin • F11-näppäin: kuten F10, mutta ilman valikkoja, otsikkopalkkia ja ylätason paneelia • Esc-näppäin: keskeyttää käynnissä olevan toiminnon, sulkee aktiivisen valintaikkunan • Delete-näppäin: avaa valintaikkunan nykyisen tiedoston poistamiseksi tai siirtämiseksi roskakoriin • Nuoli vasen/oikea: näyttää edellisen/seuraavan kuvan galleriassa • Nuoli ylös/alas: sama, mutta näyttää vain viimeisimmät versiot • Page Up/Down: Gallerianäkymä: vierittää yhden sivun ylös/alas • Home/End: Gallerianäkymä: siirtyy gallerian ensimmäiselle/viimeiselle sivulle - Seuraavat pikanäppäimet ovat oletusarvoja, joita käyttäjä voi muuttaa: • F: Tiedostonäkymä - vaihda tiedostonäkymä-tilaan • G: Gallerianäkymä - vaihda gallerianäkymä-tilaan • M: Karttanäkymä - vaihda karttanäkymä-tilaan • 2: Kierrä 2 tiedostoa - näytä vuorotellen kaksi viimeisintä tiedostoa • 3: Kierrä 3 tiedostoa - näytä vuorotellen kolme viimeisintä tiedostoa • A: Nykyinen albumi - näytä viimeksi katsottu albumi • T: Retusointi - käynnistä Retusointi-muokkaustoiminto • C: Rajaa - käynnistä Rajaa-muokkaustoiminto • K: Näppäimistön pikanäppäimet - käynnistä pikanäppäinten valintaikkuna • P: Tulosta kuva - avaa kuvan tulostuksen valintaikkuna • R: Kierrä - käynnistä Kierrä-muokkaustoiminto • U: Kumoa - kumoaa nykyisen muokkauksen tai sarjan viimeisimmän • Shift+U: Tee uudelleen - tekee uudelleen nykyisen muokkauksen tai sarjan seuraavan • Ctrl+C: Kopioi leikepöydälle - kopioi nykyisen tiedoston leikepöydälle • Shift+C: Vaihda kuvatekstit - näytä/piilota kuvatekstit vuorotellen • Ctrl+G: näytä nykyisen tiedoston kansiogalleria • Shift+G: Vaihda ruudukko - kytkee ruudukkoviivat päälle/pois • Ctrl+S: Tallenna - käynnistää tiedoston tallennuksen valintaikkunan - - TOPIC: HIIRITOIMINNOT - ^Tiedostonäkymä • vasen napsautus - zoomaa sisään: suurentaa kuvaa hiiren kohdalta • oikea napsautus - jos kuva on zoomattu: palauttaa ikkunan kokoon Jos ei, ponnahdusvalikko yleisillä toiminnoilla • hiiren rulla - zoomaa kuvaa sisään tai ulos • vasen vetäminen kuvassa - panoroi zoomattua kuvaa • Ctrl + hiiri - hiiri vaikuttaa kuvaan, ei aktiiviseen valintaikkunaan - ^Gallerianäkymä • vasen napsautus thumbnailiin - vaihtaa Tiedostonäkymään • oikea napsautus thumbnailiin - näyttää ponnahdusvalikon yleisillä toiminnoilla • keskipainikkeen napsautus thumbnailiin - ponnahduttaa ison kuvan, zoomaa hiiren rullalla • hiiren rulla - vierittää galleriasivua ylös tai alas - ^Karttanäkymä • vasen vetäminen - vetää karttaa hiiren mukana • hiiren rulla - zoomaa karttaa suuremmaksi tai pienemmäksi • vasen napsautus merkkiin - näyttää sijainnin kuvien gallerian • jos metadatan muokkauksen valintaikkuna on aktiivinen, vasen napsautus asettaa geokoordinaatit - - TOPIC: KOMENTOPARAMETRIT Näitä parametrejä voidaan käyttää, jos Fotocx käynnistetään päätteestä. -help näytä käyttöopas -home /kansio vaihtoehtoinen Fotocxin kotisijainti (katso alla) -lang xx aseta kieli 2-merkkisellä koodilla -recent näytä viimeisimpien kuvatiedostojen galleria -new näytä uusimpien kuvatiedostojen galleria -album albuminnimi avattava albumi (galleria) -prev näytä edellisessä istunnossa viimeksi katsottu tiedosto -blank näytä tyhjä ikkuna -dev näytä normaalisti piilotettu kehittäjävalikko -menu valikonnimi Fotocx käynnistyy tämä valikko aktiivisena -cwp nnn nimi kierrätä taustakuvaa (katso alla) -x0 -x1 -x2 aseta indeksointitaso arvoon 0, 1 tai 2 (katso alla) - ^-x0 -x1 -x2 parametri^ (aseta indeksointitaso käynnistyksessä) Näitä parametrejä voidaan käyttää ohittamaan {ASETUKSET}-arvo -x0 erittäin nopea käynnistys, ei kuvaindeksiä -x1 nopea käynnistys, indeksoi vain vanhat tiedostot -x2 vanhat tiedostot + etsi uusia/muutettuja tiedostoja - ^-home^ parametri (vaihtoehtoinen Fotocxin kotikansio) Fotocxin oletuskotikansio: /home//.fotocx. Tänne tallennetaan käyttäjän asetukset ja kuvaindeksi. Komento "$ fotocx -home " käyttää määritettyä kansiota. Tämä mahdollistaa useiden kuvakokoelmien hallinnan erikseen. Katso myös {SIIRRÄ FOTOCX-KOTI}. - ^-cwp^ parametri (kierrätä työpöydän taustakuvaa) Koko komentorivi on: $ fotocx -cwp secs container Käytä tätä komentoa kierrättämään työpöydän kuvaa valitusta joukosta. 'secs' on kuvien välinen aikaväli. 'container' on joko Fotocx-albumin nimi tai kuvatiedostoja sisältävä kansio. Lisää tämä komento kirjautumisen käynnistysluetteloosi saadaksesi uuden taustakuvan määrätyin väliajoin. Käytä yhden päivän tai pidempää aikaväliä saadaksesi uuden taustakuvan jokaisella kirjautumiskerralla. Fotocx toimii taustalla ilman graafista käyttöliittymää. Jos 'secs' on nolla, tehdään yksi taustakuvan päivitys, minkä jälkeen Fotocx sulkeutuu. Jokaisella Linux-jakelulla on oma komentonsa. Teoriassa seuraavat on katettu: Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: TIEDOSTOVALIKKO - - TOPIC: UUSI ISTUNTO Käynnistä uusi Fotocx-istunto uudessa ikkunassa. Jos kuvatiedostoa muokataan molemmissa ikkunoissa, kumpikaan istunto ei näe toisen tekemiä muutoksia, ja lopputulos on viimeksi tallennettu tiedosto. - - TOPIC: AVAA KUVATIEDOSTO Valitse kuvatiedosto katselua tai muokkausta varten tavanomaisen tiedoston avaamisen valintaikkunan avulla, jossa on kansioita ja tiedostoluetteloita. Tämä on hyödyllistä tapauksissa, joissa tiedostoja ei ole indeksoitu ja gallerian näyttäminen on hyvin hidasta, esim. luettaessa kamerasta SD-kortilta, jolla on tuhansia kuvatiedostoja. - - TOPIC: KIERRÄTÄ 2 TIEDOSTOA Tämän valikon toistaminen vaihtaa kahden viimeksi avatun tiedoston välillä. Tämä toiminto säilyttää nykyisen kuvan zoomauskoon ja -sijainnin, mikä sopii erinomaisesti saman kuvatiedoston kahden muokatun version nopeaan vertailuun. - - TOPIC: KIERRÄTÄ 3 TIEDOSTOA Tämä toimii samalla tavalla kuin Kierrä 2 tiedostoa, mutta vaihtaen kolmen viimeksi avatun tiedoston välillä. - - TOPIC: KATSELE 360° PANORAAMAA Nykyinen tiedosto avataan 360° panoraamatiedostojen erikoiskatselimella. Kuvan leveyden oletetaan olevan 360°. Käytä tätä toimintoa Googlen 'photosphere'-kuvien katseluun. Panoroi kuvaa hiirellä vetämällä tai nuoli vasen/oikea -näppäimillä. Zoomaa hiiren vasemmalla/oikealla napsautuksella. Käytä Esc-näppäintä erikoiskatselimesta poistumiseen. - - TOPIC: NIMEÄ UUDELLEEN Nimeä uudelleen nykyinen tiedosto (Tiedostonäkymä) tai napsautetun thumbnailin tiedosto (Gallerianäkymä). Syötä uusi nimi ja paina [käytä]. Tämä toiminto voi myös automatisoida kuvatiedostosarjan uudelleennimeämisen käyttäen juurinimeä ja järjestysnumeroa. Avaa sarjan ensimmäinen kuvatiedosto, syötä uusi nimi ja paina [käytä]-painiketta. Käytä [next]-painiketta siirtyäksesi seuraavaan tiedostoon, jos haluat. Voit käyttää samaa nimeä uudelleen painamalla [edellinen nimi] -painiketta ja lisäämällä sitten päätteen tai järjestysnumeron. Paina [add 1] -painiketta kasvattaaksesi järjestysnumeroa. - - TOPIC: TYHJÄ KUVA Luo tyhjä kuva määritetyillä pikselimitoilla ja värillä. Tätä voidaan käyttää taustana muista kuvista otetuille leikkeille (toiminnon {VALITSE ALUE} kautta) ja merkintätekstille (toiminnon {MERKINTÄ} piirrä teksti kautta). - - TOPIC: KOPIOI/SIIRRÄ Nykyinen tiedosto (Tiedostonäkymä) tai napsautetun thumbnailin tiedosto (Gallerianäkymä) kopioidaan annettuun sijaintiin. Valitse kopiointivaihtoehto kopioidaksesi tiedoston ja jättääksesi lähdetiedoston paikoilleen, jolloin syntyy kaksoiskappale. Valitse siirtovaihtoehto siirtääksesi tiedoston alkuperäisestä sijainnista uuteen sijaintiin. Tiedostoryhmä voidaan käsitellä nopeasti napsauttamalla kutakin thumbnailia ja sen jälkeen [käytä]. [Edellinen]-painiketta voidaan käyttää aiemmin käytetyn tiedostonimen kopioimiseen. Lisää versionumero tai jokin muu välttääksesi kaksoiskappaleen syntymisen. - - TOPIC: KOPIOI TYÖPÖYDÄLLE Nykyinen tiedosto (Tiedostonäkymä) tai napsautetun thumbnailin tiedosto (Gallerianäkymä) kopioidaan työpöytäkansioon (/home//Desktop). - - TOPIC: KOPIOI LEIKEPÖYDÄLLE Nykyinen tiedosto (Tiedostonäkymä) tai napsautetun thumbnailin tiedosto (Gallerianäkymä) kopioidaan leikepöydälle, josta muut sovellukset voivat liittää sen. - - TOPIC: POISTA/ROSKAKORIIN Nykyinen tiedosto (Tiedostonäkymä) tai napsautetun thumbnailin tiedosto (Gallerianäkymä) poistetaan tai siirretään roskakoriin valitun vaihtoehdon mukaan. Fotocx olettaa roskakorin standardisijainnin (~/.local/share/Trash). - - TOPIC: ASETA TAUSTAKUVA Työpöydän taustakuva asetetaan nykyisestä kuvatiedostosta. - - TOPIC: TULOSTA KUVA Tulosta kuva -valikko avaa vakiomuotoisen sivun asetukset -valintaikkunan, jossa voit valita tulostimen, paperikoon ja suunnan. [käytä]-painikkeen käytön jälkeen käynnistyy toinen valintaikkuna paperin reunusten ja kuvan mittakaavan syöttämistä varten. - Jos kuvassa on valittuja alueita, sinulta kysytään, tulostetaanko vain kyseiset alueet. Ne tulostetaan käyttäen pienintä alueet sisältävää suorakulmiota, eikä valintojen ulkopuolisia alueita tulosteta. - - TOPIC: TULOSTA KALIBROITUNA Tämä toiminto toimii kuten yllä kuvattu Tulosta kuvatiedosto, mutta ennen tulostusta sinua pyydetään antamaan kalibrointitiedosto, jota käytetään kuvan värien säätämiseen ennen tulostusta. Tarkoituksena on kompensoida tulostimen ja paperityypin aiheuttamia värisiirtymiä. - - TOPIC: KALIBROI TULOSTIN +image: printer-calibrate-chart.png +image: calibrate-printer.png - Tämä apuohjelma voi parantaa tulostettujen kuvien värien tarkkuutta. - ^Miten se toimii Väritaulukko tulostetaan kohdetulostimella. Osa tulostetuista väreistä on hieman vääriä tulostimen epätarkkuuksien vuoksi. Tämä tulostettu sivu skannataan tiedostoksi, ja tämän tiedoston värejä verrataan alkuperäisiin tulostettuihin väreihin. Kaikki erot ovat nyt tunnettuja virheitä (olettaen, että skannerisi on tarkempi kuin tulostimesi - yleensä totta). Kun kuvatiedosto tulostetaan, nämä virheet vähennetään kuvan väreistä ennen tulostusta. Tulostin lisää virheet takaisin, jolloin lopputulos on teoriassa oikea. Tekijän oma testi osoitti kohtalaisen parannuksen, tarkemmin kuvattuna alla. - Suorita seuraavat vaiheet järjestyksessä, kuten valintaikkunassa on lueteltu. Kaikki tiedostot sijaitsevat kansiossa /printer_color. • Luo ja tulosta väritaulukkotiedosto (printchart.png). Käytä suurta paperikokoa, pystysuuntaa, ei reunuksia. • Skannaa tulostettu taulukko PNG-tiedostoksi. Käytä 300 dpi tai enemmän. • Muokkaa PNG-kuvaa rajataksesi pois skannerin jättämät reunukset. Tallenna muokattu kuvatiedosto. • Käsittele muokattu kuvatiedosto luodaksesi värikarttatiedoston. - Voit nyt tulostaa valikon {TULOSTA KALIBROITUNA} avulla, joka pyytää käytettävän tulostimen ja paperin värikarttatiedoston nimeä. - Skannerit voivat vääristää skannatun kuvan hieman ei-suorakulmaiseen muotoon. Jos näin käy, huomaat sen yrittäessäsi rajata reunuksia: paksut vihreät reunusviivat eivät kohdistu täydellisesti rajaussuorakulmion kanssa. Jos näin käy, käytä ensin toimintoa {PERSPEKTIIVI} kuvan suoristamiseen ja rajaa sitten reunukset. - Kun muokkaat skannattua taulukkokuvaa, varmista, että tummin rivi on ylimpänä. Rajaa väritaulujen ympärillä olevat reunukset. Käytä väritaulujen ympärillä olevaa paksua vihreää reunusviivaa apuna: leikkaa tämä viiva täsmälleen pois, jättäen jäljelle vain taulut. Käytä 2x suurennusta säätäessäsi rajaussuorakulmiota. Tarkka rajaus on tärkeää. Jos rajaus ei ole tarkka, lasketut taulujen sijainnit siirtyvät, ja mitatut värit voivat olla vääriä. Pieni virhe on sallittu. Voit käyttää näppäimistön nuolinäppäimiä rajaussuorakulmion 1 pikselin siirtoihin. Nuolinäppäimet siirtävät sitä kulmaa, jota viimeksi vedettiin hiirellä. - Tuloksena syntyvää värikarttatiedostoa voidaan käyttää vain kalibroinnissa käytetylle paperille ja tulostinasetuksille. Mikä tahansa muu yhdistelmä tarvitsee oman kalibrointinsa ja värikarttatiedostonsa. - ^Tulokset^ (tekijän Canon-tulostin) +image: printer-calibrate.jpg +image: printer-cal-study.png - Yllä oleva kaavio on valokuva kolmesta kuvasta: vasen yläkulma: väritaulukkovalokuvan tuloste oikea yläkulma: saman valokuvan kalibroitu tuloste alaosa: itse väritaulukko Koska kaikki 3 kuvaa kuvattiin yhdessä, kameran aiheuttamat virheet ovat samat, mikä tekee vertailuista päteviä. - - TOPIC: GALLERIAVALIKKO - - TOPIC: GALLERIAN YLEISKATSAUS +image: image-management.jpg - Thumbnail-kuvien galleria voi edustaa tiedostokansiota, kuvahaun tulosta, jotakin sisäänrakennetuista gallerioista (viimeisimmät tiedostot, uusimmat tiedostot) tai albumia (nimetty järjestetty luettelo kuvatiedostoista). Kansiot kannattaa käytännön ja suorituskyvyn vuoksi rajoittaa muutamaan tuhanteen tiedostoon, mutta rajaa ei ole pakotettu. - ^Gallerian vierittäminen Galleriaa voi vierittää ylös ja alas näppäimistön nuoli ylös- ja alas-näppäimillä, page up- ja page down -näppäimillä tai vierityspalkeilla. Myös [home]- ja [end]-näppäimiä voidaan käyttää. Napsauta vierityspalkkia vasemmalla painikkeella ja pidä pohjassa, niin galleria vierii nopeasti napsautuskohtaan. Napsauta vierityspalkkia oikealla painikkeella ja pidä pohjassa, niin galleria vierii hitaasti napsautuskohtaan. Jatka hiiren painikkeen pitämistä pohjassa ja siirrä sivulle lisätäksesi vieritysnopeutta. - - TOPIC: THUMB-NÄKYMÄ Nykyisen gallerian kuvatiedostot näytetään thumbnail-taulukkona. Käytä Zoom-valikkopainiketta tai [+] [-] -näppäimiä thumbnailin koon muuttamiseen. - - TOPIC: METADATANÄKYMÄ Nykyisen gallerian kuvatiedostot näytetään yhdessä Fotocxin käyttämän perusmetadatan kanssa. Jos mukautettuja indeksoituja metadatatageja on määritetty, ne näytetään standarditagien jälkeen. Katso {INDEKSOI TIEDOSTOT}. - - TOPIC: VIIMEAIKAISET TIEDOSTOT 1000 viimeksi katsottua kuvatiedostoa näytetään galleriassa, josta voit valita tiedostoja katseltavaksi tai muokattavaksi. - - TOPIC: UUSIMMAT TIEDOSTOT 1000 viimeksi lisättyä tai muokattua kuvatiedostoa näytetään galleriassa, josta voit valita tiedostoja katseltavaksi tai muokattavaksi. Sinulle annetaan mahdollisuus valita, käytetäänkö uusimpien kuvien määrittämiseen EXIF-kuvauspäivämäärää vai tiedoston muokkauspäivämäärää. - - TOPIC: GALLERIAN LAJITTELU Valitse lajitteluperuste sekä nouseva tai laskeva järjestys. Nollaa-valintaruutu palauttaa kaikki galleriat tiedostonimen mukaan nousevaan järjestykseen. - Jos albumigalleria lajitellaan, tulos ei korvaa albumia, vaan luo uuden albumin nimeltä -sorted. - ^Tiedostonimi/numero Tämä on muunneltu lajittelu tiedostonimen mukaan. Jos useiden tiedostojen nimet eroavat toisistaan vain samassa kohdassa olevien upotettujen numeroiden osalta, tämä tiedostoryhmä lajitellaan upotettujen numeroiden järjestyksessä. Tämä esimerkki havainnollistaa eroa: aakkosjärjestys: xxx1xx xxx11xx xxx123xx xxx3xx numeerinen järjestys: xxx1xx xxx3xx xxx11xx xxx123xx - ^Hakutoiminnon metadata Jos galleria luotiin {HAE KUVIA}-toiminnon 'metadataraportti'-vaihtoehdolla ja lisäsit valinnaisia metadatatageja vakioraporttiin, voit lajitella gallerian näiden metadatatagien mukaan. Voit lajitella gallerian kameran merkin, objektiivitietojen, ISO-tason, valotusajan ... minkä tahansa saatavilla olevan metadatan mukaan. - - TOPIC: GALLERIAN SUODATIN Valitse osajoukko nykyisestä galleriasta luodaksesi albumin nimeltä "gallery_filter", joka sisältää valitut kuvatiedostot. ^Valintavaihtoehdot: • kaikki tiedostot: valitse kaikki kuvatiedostot • alkuperäiset: alkuperäiset tiedostot (ei versionumeroa) • versiot: versioidut tiedostot (on muokattu) • viimeisimmät versiot: viimeisimmät versiot (tai alkuperäiset, jos versioita ei ole) • arvosana-alue: tiedostot, joiden arvosana on annetulla alueella • avainsanat: tiedostot, joilla on jokin annetuista avainsanoista (pilkulla erotettu) • tiedostonimen teksti: tiedostot, joissa on jokin annetuista tekstijonoista (pilkulla erotettu) - - TOPIC: GALLERIAN KOTI TOPIC: GALLERIAN LOPPU Siirry nykyisen gallerian ensimmäiseen tai viimeiseen thumbnailiin. - - TOPIC: NYKYISEN TIEDOSTON KANSIO Aseta nykyinen galleria nykyisestä kuvatiedostosta. Tämä on kätevää, jos haluat palata nykyisen tiedoston galleriaan tehtyäsi jotain muuta. - - TOPIC: VIIMEAIKAISET KANSIOT Aseta nykyinen galleria viimeksi käytetystä galleriasta. Tämä helpottaa siirtymistä edestakaisin viimeisimpien galleriöiden välillä. - - TOPIC: KANSIOPUU +image: folder-tree.png - Kaikki YLÄ-kuvakansiot näytetään aluksi. Napsauta [+] avataksesi alikansiot, tai [-] sulkeaksesi ne takaisin. Voit napsauttaa mitä tahansa kansiota saadaksesi galleriaan kyseisen kansion kuvat. Pidä ikkuna auki navigoidaksesi missä tahansa kuvakokoelmassasi. Tämä toiminto on käytettävissä myös gallerian yläpaneelin [TOP]-painikkeella. - - TOPIC: VALITSE TIEDOSTOT Esivalitse kuvatiedostoja käytettäväksi syötteinä albumien luomisessa tai eräkäsittelytoiminnoissa. Nämä toiminnot käyttävät esivalittuja tiedostoja oletuksena, mutta voit myös muokata niitä tai aloittaa alusta. Katso menettely {VALITSE KUVATIEDOSTOT}. - - TOPIC: KIRJANMERKIT Katsele olemassa olevia kirjanmerkkejä. Kirjanmerkit ovat valittuja sijainteja (kansio-/tiedostonimiä), joilla on käyttäjän antamat nimet. Napsauta kirjanmerkkiä näyttääksesi thumbnail-gallerian, joka alkaa kyseisestä sijainnista. Valitse [Muokkaa kirjanmerkkejä] lisätäksesi, poistaaksesi tai nimetäksesi kirjanmerkin uudelleen. - - TOPIC: MUOKKAA KIRJANMERKKEJÄ Kun olet käynnistänyt Muokkaa kirjanmerkkejä -toiminnon, napsauta gallerian thumbnailia lisätäksesi tämän sijainnin kirjanmerkkiluetteloon. Annettu kirjanmerkin nimi on aluksi thumbnailin tiedostonimi. Voit muokata nimeä. Jos valitset olemassa olevan kirjanmerkin hiiren napsautuksella, sen nimi näytetään syöttökentässä. Voit muuttaa nimeä tai painaa [poista] poistaaksesi kirjanmerkin. Uudet kirjanmerkit lisätään viimeksi valitun kirjanmerkkisijainnin jälkeen. Vaihtaaksesi järjestystä, muokkaa tiedostoa "bookmarks" Fotocxin kotikansiossa. - - TOPIC: MAPS MENU - - TOPIC: MAAILMANKARTTA +image: map-click.jpg - Tämä on internetin maailmankartta, jota voidaan skaalata (zoomata sisään ja ulos) katutasolta mannertasolle. Käytä hiiren rullaa kartan zoomaamiseen sisään/ulos. Vedä karttaa muuttaaksesi sen keskipistettä. Kartalla on merkkejä (punaisia pisteitä), jotka vastaavat kuvia, joiden metadatassa on geokoordinaatit. Napsauta merkkiä saadaksesi Gallerianäkymän tämän sijainnin kuvista. Kartan merkkialueen sisällä sijaitsevat kuvat valitaan. Tehokas merkkialue skaalautuu kartan mittakaavan mukana. Zoomaa sisään laajentaaksesi mittakaavaa ja mahdollisesti erottaaksesi yhden merkin useiksi lähekkäisiksi merkeiksi. - - TOPIC: NÄYTÄ KARTALLA Näytä nykyisen kuvatiedoston sijainti maailmankartalla. Jos useita merkkejä on päällekkäin, zoomaa sisään, kunnes yksittäinen merkki on keskellä. - - TOPIC: ALBUMIT-VALIKKO - - TOPIC: ALBUMIT Albumi on mielivaltainen kuvajoukko, joka kootaan manuaalisesti olemassa olevista kuvista. Albumi on luettelo sen jäsenkuvatiedostoista. Itse kuvatiedostoja ei kopioida tai muuteta. Tietty kuvatiedosto voi olla useamman albumin jäsen tai esiintyä albumissa useammin kuin kerran. Voit lisätä ja poistaa kuvia albumista tai järjestää niiden järjestyksen uudelleen. Kun albumi on luotu, voit valita sen nimen perusteella ja se näkyy galleriana. - - TOPIC: LUO ALBUMI Syötä uuden albumin nimi. Voit luoda tyhjän albumin, albumin, jossa on esivalittuja kuvatiedostoja toiminnosta {VALITSE TIEDOSTOT}, albumin, jossa on kuvia nykyisestä galleriasta, tai voit valita albumin alkukuvat. - - TOPIC: NIMEÄ ALBUMI UUDELLEEN Valitse olemassa oleva albumi ja syötä uusi nimi. - - TOPIC: POISTA ALBUMI Valitse olemassa oleva albumi ja poista se pysyvästi. - - TOPIC: VALITSE ALBUMI Luettelo käytettävissä olevista albumeista näytetään. Valitse luettelosta. - - TOPIC: NYKYINEN ALBUMI Aseta galleria nykyisestä (viimeksi käytetystä) albumista. - - TOPIC: GALLERIASTA ALBUMIKSI Tallenna nykyinen galleria albumina. Valitse olemassa olevan albumin nimi [Selaa], tai syötä uusi nimi. - - TOPIC: MUOKKAA ALBUMIA Napsauta albumin thumbnailia oikealla painikkeella ja valitse ponnahdusvalikosta: • Lisää valitut tiedostot tähän - aiemmin valitut tiedostot lisätään tähän (napsauta thumbnailin vasenta/oikeaa puolta lisätäksesi ennen/jälkeen thumbnailin). • Lisää nykyinen tiedosto (Tiedostonäkymä) tähän - toimii samalla tavalla. • Poista albumista - napsautettu tiedosto poistetaan albumista. - ^Vedä ja pudota Voit järjestää albumin kuvia uudelleen vetämällä thumbnaileja hiirellä. Vedä thumbnailia, kunnes hiiren kohdistin muuttuu pieneksi thumbnail-kuvaksi. Jatka tämän kuvan vetämistä sijaintiin, johon se tulisi lisätä, ja vapauta hiiren painike. Aseta hiiri suunnilleen niiden thumbnailien väliin, joiden kohdalle vedetty kuva halutaan lisätä. Jos veto lähestyy ikkunan ylä- tai alareunaa, galleria vierii tuodakseen lisää kuvia näkyviin. Voit käyttää kahta Fotocx-istuntoa nopeuttaaksesi monien kuvien valintaa tai siirtämistä. Vedä ja pudota kuvia mistä tahansa lähdegalleriasta kohdealbumin sijaintiin. - Jos nimeät tiedoston uudelleen tai siirrät sen Fotocxilla, kaikki albumilinkit päivittyvät ja tiedosto pysyy niissä albumeissa, joihin se kuuluu. Jos teet tämän Fotocxin ulkopuolella, albumilinkit menetetään ja tiedosto katoaa albumista. - Jos kuvatiedostoja nimetään uudelleen tai siirretään Erämuunnos- tai Eräkopiointi/-siirto-toiminnolla, muista valita vaihtoehto albumitiedostojen korvaamiseksi, jos näin halutaan. Muutoin joudut korvaamaan ne yksitellen. - Älä nimeä kansioita uudelleen, jos ne sisältävät albumeissa olevia kuvia. Albumilinkit menetetään. Käytä sen sijaan Erämuunnos- tai Eräkopiointi/-siirto-toimintoa siirtääksesi kuvatiedostot uuteen kansioon, ja poista sitten vanha kansio, jos se on tyhjä. Poistaaksesi kuvatiedostoja käytä Eräpoisto/Roskakori-toimintoa. Tämä myös puhdistaa poistetut tiedostot albumeista. - - TOPIC: PÄIVITÄ ALBUMIT +image: album-replace-file.png - Korvaa määritetyt albumitiedostot määritetyillä korvaavilla tiedostoilla, tai lisää määritetyt uudet tiedostot määritettyjen olemassa olevien tiedostojen jälkeen. Valitse yksi tai useampi käsiteltävä albumi. Gallerianäkymässä napsauta kahta thumbnailia määrittääksesi 'vanha tiedosto' ja 'uusi tiedosto' yllä olevassa valintaikkunassa. Valitse vaihtoehto: 'uusi tiedosto' korvaa 'vanhan tiedoston' aina kun se löytyy, tai 'uusi tiedosto' lisätään albumeihin 'vanhan tiedoston' jälkeen. Paina [proceed] käsitelläksesi albumit. Käsittelyn jälkeen valintaikkuna toistuu samat albumit valittuina ja sama 'korvaa tai lisää' -vaihtoehto. Voit valita kaksi lisää tiedostoa ja painaa [proceed]. - - TOPIC: ALBUMIN MASSAPÄIVITYS +image: album-mass-update.png - Tämä on apuohjelma massapäivityksiin, joita saatat tarvita luotuasi uusia versioita monille kuvatiedostoille ja tarvitessasi päivittää yhden tai useamman albumin uusiin versioihin. Tämä ei kata kaikkia tarpeita, mikä on todennäköisesti mahdotonta, mutta toivottavasti vähentää tarvetta muuttaa tiedostoja yksitellen. - Valitse yksi tai useampi albumi ja valitse sitten yksi käsittelyvaihtoehdoista: • Korvaa kaikki vain uusimmalla versiolla: Albumit päivitetään sisältämään vain uusimmat tiedostoversiot. • Korvaa kaikki versiot uusimmalla versiolla: Kaikki tiedostoversiot korvataan vain uusimmalla versiolla. Alkuperäistä tiedostoa, jos sellainen on, EI korvata. • Lisää uusimmat versiot olemassa oleviin versioihin: Uusin versio lisätään olemassa oleviin versioihin, jos se puuttuu. • Korvaa kaikki alkuperäisellä ja kaikilla versioilla: Kaikki tiedostot korvataan alkuperäisellä tiedostolla ja kaikilla versioilla. • Korvaa kaikki alkuperäisellä versiolla ja uusimmalla versiolla: Kaikki tiedostot korvataan alkuperäisellä tiedostolla ja uusimmalla versiolla. • Korvaa kaikki valituilla versioilla (*): Kaikki tiedostot korvataan vain valituilla versioilla. Tämä sisältää alkuperäisen (versioimattoman) tiedoston. • Korvaa kaikki versiot valituilla versioilla (*): Kaikki tiedostoversiot korvataan vain valituilla versioilla. Alkuperäistä tiedostoa, jos sellainen on, EI korvata. • Lisää valitut versiot olemassa oleviin versioihin (*): Valittu versio lisätään olemassa oleviin versioihin, jos se puuttuu. • Korvaa kaikki alkuperäisellä ja valituilla versioilla (*): Kaikki tiedostot korvataan alkuperäisillä tiedostoilla ja valituilla versioilla. - (*) Neljä valittuja tiedostoja käyttävää vaihtoehtoa: valittujen tiedostojen luettelo on toiminnosta {VALITSE TIEDOSTOT}. Albumitiedostot, jotka eivät vastaa mitään valittua tiedostoa, jätetään albumiin. Vain valittua tiedostoa vastaavat tiedostot muutetaan yllä olevien sääntöjen mukaisesti. Vastaavuus perustuu tiedostonimeen ilman versiota tai tiedostopäätettä: 'asdfg.png' ja 'asdfg.v01.jpg' vastaavat toisiaan. - Esimerkki: Korvaa kaikki versiot valituilla versioilla: Jos albumissa on filename.jpg ja filename.v02.png, ja valittujen tiedostojen luettelo sisältää tiedoston filename.v04.jpg, päivitetyn albumin tulos on: filename.jpg ja filename.v04.jpg - - TOPIC: DIAESITYS +image: slide-show.jpg - ^Näytön murtolukuskaalaus Joissakin järjestelmissä murtolukuskaalaus aiheuttaa suorituskykyongelmia Fotocxin diaesitysanimaatioille. Poista tämä käytöstä ja käytä muita keinoja sovellusten fonttikoon suurentamiseen, jos tarpeen. Fotocxissa fonttikoko löytyy valikosta {ASETUKSET}. - Diaesityksen valintaikkunassa (vasemmassa yläkulmassa) paina [Valitse albumi] ja valitse albumi tarjotusta luettelosta. Muuta muita valintaikkunan asetuksia haluamallasi tavalla, ja paina sitten [Aloita]-painiketta käynnistääksesi diaesityksen albumin ensimmäisestä kuvasta, tai [Jatka] jatkaaksesi keskeytettyä diaesitystä, tai valitse toinen kuva napsauttamalla sen thumbnailia. Käytä Esc-näppäintä poistuaksesi diaesityksestä ja palataksesi valintaikkunaan. - Päävalintaikkunan säätimet • Kuvatekstin aika: sekunnit, joina otsikko ja kuvaus näytetään. • Kuvan aika: sekunnit, joina pelkkä kuva näytetään. • Rajausraja %: rajaa kuvia tähän määrään asti reunusten poistamiseksi. • Koko näyttö: Jos valittu, kuvat näytetään koko näytöllä ilman valikkoa jne. • Automaattinen toisto: Jos valittu, diaesitys alkaa uudelleen lopun jälkeen. • Satunnainen kuva: Jos valittu, käytä satunnaista kuvajärjestystä. Muuten albumin järjestystä. - Näppäimistön näppäimiä voidaan käyttää diaesityksen hallintaan. Paina [näppäimistö] nähdäksesi ne. - Seuraavat näppäimet on osoitettu toiminnoille eikä niitä voi muuttaa: • Esc: keskeyttää diaesityksen ja palaa päävalintaikkunaan. • Nuoli vasen/oikea: Voit siirtyä taaksepäin tai eteenpäin milloin tahansa, ja diaesitys jatkuu siitä. - Kuvien väliset animoidut siirtymät sekä yksittäisten kuvien näyttöajat ja zoomauskäyttäytyminen voidaan mukauttaa alla selitettyjen valintaikkunoiden avulla. - Paina [siirtymät] käynnistääksesi valintaikkunan, jossa voit valita ja mukauttaa kuvien väliset siirtymät. Näihin kuuluu monia animoituja kuvan vaihtomenetelmiä (esim. uusi kuva laajenee keskeltä korvaten vanhan kuvan). Valitse käytettävät siirtymät ja käytetäänkö niitä satunnaisesti vai järjestyksessä. Aikaparametri asettaa siirtymän keston. Etusijaparametrit määrittävät suhteellisen etusijan, joka vaikuttaa siihen, kuinka usein siirtymää käytetään, kun satunnainen järjestys on valittu. - Painikkeet [lataa] ja [tallenna] mahdollistavat siirtymäasetusten tallentamisen tiedostoon ja niiden lataamisen myöhemmin. Nämä tiedostot ovat riippumattomia diaesitystiedostoista. Diaesitys käyttää oletuksena kyseiselle diaesitykselle (albumin nimi) viimeksi käytettyjä siirtymäasetuksia, mutta voit aina korvata ne käyttämällä [lataa]-painiketta muiden asetusten lataamiseen tai muuttamalla niitä valintaikkunassa. - Paina [kuvatiedostot] käynnistääksesi Kuva-asetukset-valintaikkunan (oikeassa yläkulmassa). Nämä ovat valinnaisia. Kuva valitaan mukautettavaksi napsauttamalla sen thumbnailia albumi-/galleriaikkunassa. Valintaikkuna täytetään oletusasetuksilla tai tämän kuvan aiemmilla asetuksilla tässä diaesityksessä. Syötä muutokset ja paina [done], tai napsauta seuraavaa mukautettavaa kuvaa. - Etusija: Jos satunnainen kuvajärjestys on valittu, tämä luku antaa kuvalle suhteellisen etusijan. Neutraali arvo on 10. Syötä uusi arvo lisätäksesi tai vähentääksesi todennäköisyyttä, että tämä tiedosto valitaan kuvien satunnaisessa järjestyksessä, esim. arvo 20 tekisi todennäköisyydestä 2 kertaa suuremman. Arvo nolla estäisi kuvan näyttämisen. Kuva on myös estetty 1/3 albumin kuvista vastaavan määrän ajan, tai 10 kuvan ajan, kumpi näistä on pienempi. - Valintaikkuna näyttää mukautettavat kuvatapahtumat aikajärjestyksessä: • odota määritettyä aikaa (voi olla nolla). • näytä seuraavat teksti-tagit rinnakkain: kuvan nimi (tiedoston perusnimi) määritetyn ajan, kuvan otsikko, jos sellainen on, määritetyn ajan, kuvan kuvaus, jos sellainen on, määritetyn ajan. • odota määritetty aika ennen kuvan zoomauksen aloittamista (voi olla nolla). • zoomaa kuva normaalista suurennettuun tai päinvastoin määritetyn ajan kuluessa. Jos kumpaakaan vaihtoehtoa ei ole valittu, zoomausta ei tapahdu. • zoomaa sisään: aloita normaalikoosta, suurenna kuvaa samalla siirtäen zoomauksen keskipistettä määritettyyn sijaintiin. • zoomaa ulos: aloita suurennetusta koosta määritetyssä zoomauksen keskipisteessä, pienennä kuva takaisin normaalikokoon. • [zoom center] - paina tätä painiketta ja napsauta sitten kuvan thumbnailia määrittääksesi kuvan zoomauksen keskipisteen. • odota määritetty aika zoomauksen jälkeen (voi olla nolla) (oletusarvo on päävalintaikkunan 'kuvan aika' -asetus). • siirry seuraavaan kuvaan käyttäen määritettyä siirtymää tai 'next' osoittaakseen, ettei etusijaa ole (valitaan satunnaisesti). - - TOPIC: MUKAUTETTU VALIKKO +image: custom-menu.png - Tämän avulla voit koota usein käytettyjä toimintoja useista valikoista yhteen mukautettuun valikkoon. Voit myös lisätä merkintöjä tiettyjen kuvatiedostojen tai albumien avaamiseksi. Valikko sisältää myös skriptitoimintoja ja liitännäistoimintoja (katso alla). - Valikon viimeinen merkintä, Muokkaa valikkoa, avaa tekstieditorin itse valikkoluettelon muokkaamista varten. Valikkonimien on vastattava tarkalleen Fotocxin valikoiden nimiä, mutta kirjainkoolla ei ole merkitystä. - Valikon merkinnät voivat olla seuraavissa muodoissa: • # kommenttiteksti: kommentti, joka ei tee mitään • valikonnimi # ponnahdusvihje: Fotocxin valikon nimi ja valinnainen ponnahdusvihje • file : avaa nimetty tiedosto • album : avaa nimetty albumi galleriana - Seuraavat merkinnät ovat oletuksena mukana, eikä niitä pidä muuttaa tai poistaa: Muokkaa skriptiä, Suorita skripti, Eräskripti, Liitännäiset, Muokkaa valikkoa. Yksityiskohdat selitetään alla. - - TOPIC: SKRIPTITIEDOSTOT Valikkotoiminnot: • Muokkaa skriptiä - Suorita joukko muokkauksia yhdelle kuvatiedostolle tallentaen kaikki toiminnot ja asetukset nimettyyn skriptitiedostoon. • Suorita skripti - Suorita skriptitiedosto nykyiselle kuvatiedostolle, kuten muokkaustoiminto. • Eräskripti - Valitse mikä tahansa määrä kuvatiedostoja ja suorita skriptitiedosto kaikille niille eräajotilassa. - Skriptitiedostojen avulla voit määrittää joukon muokkauksia kerran ja toistaa ne myöhemmin yhdelle tai useammalle kuvatiedostolle. - ^Skriptattavat muokkaustoiminnot Jotkut muokkaustoiminnot käyttävät hiirellä vetämistä kuvassa, esim. kaikki vääristystoiminnot. Näitä ei voi skriptata, koska hiiren vetoja ei tallenneta. Näiden toimintojen käyttö on estetty. - Seuraavat toiminnot ovat tällä hetkellä skriptattavissa: • Muokkaa: Retusointi, Reunukset, Väritila, Alueen täyttö • Korjaa: Terävöinti, Sumennus normaali, Sumennus asteittainen, Kohinanpoisto, Poista sumu, JPEG-artefaktit, Reunan pehmennys, Säädä RGB • Hienosäätö: Tasoita histogrammi, Paikallinen kontrasti, Voimista kontrastia, Globaali Retinex, Paikallinen Retinex, Paikallinen kontrasti, Kylläisyys, Pehmeä fokus, Kirkkausliuku • Tehosteet: Ääriviivat, Luonnos, Sarjakuva, Kohokuviointi, Laatat1, Laatat2, Maalaus, Tekstuuri, Kuvio, Rasterointi, Kaiverrus, Aseta värit, Siirrä värejä, Mukautettu ydin - - TOPIC: MUOKKAA SKRIPTIÄ Paina valintaikkunassa [aloita]. Valitse skriptille tiedostonimi. Aloita nykyisen kuvatiedoston muokkaaminen. Käytä haluttuja muokkaustoimintoja missä tahansa järjestyksessä. Jokainen muokkaus tallennetaan skriptitiedostoon yhdessä kaikkien käytettyjen valintaikkunan asetusten kanssa. Kun olet valmis, paina [close] sulkeaksesi skriptitiedoston ja tallentaaksesi sen annetulla tiedostonimellä. - - TOPIC: SUORITA SKRIPTI Valitse yksi tallennetuista skriptitiedostoistasi ponnahdusvalikosta. Skripti suoritetaan nykyiselle kuvatiedostolle, kuten normaali muokkaustoiminto. - - TOPIC: ERÄSKRIPTI Paina valintaikkunassa [Valitse tiedostot]. Valitse muokattavat tiedostot vakiomuotoisella tiedostovalinnan valintaikkunalla {VALITSE KUVATIEDOSTOT}. Kun olet valmis, paina [Valitse skripti]. Valitse skriptitiedosto ponnahdusvalikosta. Skripti suoritetaan nyt kaikille valituille tiedostoille. Kaikki muokatut kuvat tallennetaan uusina versioina. Jos RAW-tiedostoja käsitellään, vastaavat tulostiedostot ovat TIFF-16-tiedostoja. - - TOPIC: LISÄOSAT +image: plugins.png - Liitännäistoiminnot ovat tapa käyttää muita kuvaeditoreita Fotocxin sisällä, esim. Gimpiä. Voit käyttää RAW-kuvaeditoria kuten Rawtherapeeta ja suorittaa sitten lisämuokkauksia Fotocxilla. - ^Käyttömenettely: • Avaa käsiteltävä tiedosto Fotocxissa • Käynnistä liitännäisvalikko ja valitse haluttu ohjelma, esim. Gimp • Liitännäisohjelma käynnistyy ja avaa Fotocxista välitetyn tiedoston • Suorita halutut muokkaukset liitännäisohjelmalla • Kun olet valmis, tallenna tulostiedosto samalla nimellä kuin syötetiedosto. Tiedostopääte .ext voi muuttua. • Sulje liitännäisohjelma. • Fotocx avaa liitännäisen tulostiedoston nykyisen tiedoston muokattuna versiona. • Suorita lisämuokkauksia tai tallenna muokattu tiedosto uutena versiona tai uutena tiedostona. - Esimerkki Liitännäiset-valikosta on vasemmalla. Viimeinen merkintä "Muokkaa liitännäisiä" käynnistää tekstinmuokkaussovelluksen oikealla. Käytä tekstieditoria määrittääksesi liitännäisvalikon nimet ja komennot vastaavien liitännäisohjelmien käynnistämiseksi. Muoto on: valikonnimi = liitännäiskomento %s TIP = yllä olevan komennon selitys 'liitännäiskomento' on liitännäistoiminnon shell-komento, ja '%s' on kohta, johon nykyisen tiedoston nimi lisätään komentoon. Älä laita lainausmerkkejä '%s':n ympärille, koska ne lisätään automaattisesti, mikä mahdollistaa tiedostonimien käsittelyn välilyönteineen tai muine erikoismerkkeineen. Yllä näkyvä ensimmäinen esimerkki on valikko nimeltä "Gimp", joka käynnistää komennon "gimp %s". TIP-teksti on valinnainen. Jos se on mukana, se on valikonnimen jälkeisellä rivillä. Hiiren vieminen valikkomerkinnän päälle näyttää tämän tekstin valikkotekstin vieressä. - Jotkin komennot voivat edellyttää sekä syöte- että tulostetiedoston määrittämistä. Tässä tapauksessa anna '%s' molempiin kohtiin. Jätä '%s' pois, jos komento ei käsittele kuvatiedostoa. - ^Valitse alue Jos syötetiedostossa on valittu alue, vain tätä aluetta muokataan. Liitännäistoiminto muokkaa koko kuvaa, mutta kun Fotocx käsittelee tuloksen, vain valitun alueen muutokset säilytetään. - - TOPIC: ZOOM - ^Zoom-painike Napsauta painiketta vasemmalla tai oikealla painikkeella suurentaaksesi tai pienentääksesi kuvan kokoa näkymässä {TIEDOSTONÄKYMÄ} tai thumbnailin kokoa näkymässä {GALLERIANÄKYMÄ}. Tämä koskee vain tilannetta, jossa gallerianäkymän tila on {THUMB-NÄKYMÄ}. Jos tilassa on {METADATANÄKYMÄ}, mitään ei tapahdu. - - TOPIC: EDELLINEN/SEURAAVA - Napsauta painiketta vasemmalla tai oikealla painikkeella avataksesi nykyisen gallerian edellisen tai seuraavan tiedoston. Voit käyttää myös nuoli vasen/oikea -näppäimiä. - - TOPIC: TALLENNA TIEDOSTO - +image: file-save.png - +image: file-save-as.jpg - Valitse ensimmäisessä valintaikkunassa 'uusi versio', 'uusi tiedosto' tai 'korvaa tiedosto'. - ^Uusi versio Tallenna nykyinen kuvatiedosto uudella versionumerolla. Versionumeroidut tiedostonimet ovat muotoa "filename.vNN.ext", jossa NN on numero 01-99. Jos tiedostonimellä ei ole versioita, luodaan versio .v01. Jos tiedostoversioita on jo levyllä, käytetään seuraavaa suurempaa versionumeroa. Jos tiedosto on JPEG-tiedosto, käytetään oletuslaatua - katso {ASETUKSET}. - ^Uusi tiedosto Yllä näkyvä toinen valintaikkuna avautuu tallentamaan nykyisen kuvan valittuun tiedostoon, joka voi olla alkuperäinen tiedosto, toinen olemassa oleva tiedosto tai uusi tiedosto. Tiedosto voidaan tallentaa muodoissa JPEG, PNG, JXL ja TIFF. - JPEG-muodossa voit valita laatuarvon väliltä 1-100. Pienemmät arvot antavat pienempiä tiedostoja ja huonompaa kuvanlaatua. Arvoja yli 70 on vaikea erottaa arvosta 100 (paras laatu, suurin tiedostokoko). Oletusarvoista JPEG-laatua käytetään, ellet muuta arvoa valintaikkunassa. Oletusarvo tulee kohdasta {ASETUKSET}. Et pysty näkemään eroa laadulla 70 tallennetun tiedoston ja laadulla 100 tallennetun tiedoston välillä, mutta ero tiedostokoossa on valtava. Läpinäkyvät alueet näkyvät mustina. JPEG ei tue läpinäkyvyyttä. - PNG- ja TIFF-tiedostot pakataan ilman laadun heikkenemistä ja ovat paljon suurempia kuin JPEG. Ne voidaan tallentaa 8 tai 16 bitillä per väri. - Jos 'aseta nykyiseksi' on valittu, tallennetusta tiedostosta (uusi tiedostonimi) tulee nykyinen tiedosto. - ^Korvaa tiedosto Tallenna nykyinen kuvatiedosto takaisin itseensä. - ^Oikeudet^ kopioidaan syötetiedostosta. Paina [Muuta]-painiketta muokataksesi oikeuksia. - - TOPIC: METADATAVALIKKO - - Metadata on tekstimuotoista tietoa, joka tallennetaan kuvatiedoston sisään. Digitaalikamerat luovat osan metadatasta automaattisesti, kuten päivämäärän ja ajan, teknisiä tietoja kamerasta ja kuvausparametreista, sekä sijaintitietoja (jos kamerassa on GPS-vastaanotin). Muuta tietoa voi lisätä käyttäjä, esim. otsikon, kuvauksen, arvosanan, avainsanoja. Fotocx voi hakea kuvakokoelmastasi minkä tahansa metadatan perusteella, yhdessä kansio- ja tiedostonimien tai niiden osien kanssa, tuottaen gallerian vastaavista kuvista. Useimmissa tapauksissa haku on lähes välitön. - - TOPIC: KATSELE PÄÄMETADATAA TOPIC: KATSELE KAIKKEA METADATAA +image: view-metadata.jpg - Näytä päämetadata -toiminto näyttää nykyisen kuvatiedoston yleisesti hyödyllisen metadatan. Tähän kuuluu kuvan päivämäärä ja aika, suljinaika, polttoväli, kuvan koko, ISO jne. Digitaalikamerat tallentavat nämä tiedot kuvaan. Metadata voi sisältää myös käyttäjän lisäämää tietoa: avainsanoja, otsikon tai kuvatekstin, kuvauksen, valokuvaajan tai myöhemmän muokkaajan lisäämiä kommentteja (joita joskus löytyy julkaistuista kuvista). - Jos kuvaa muokataan, muokkauksesta tallennetaan tieto metadataan. Näytä päämetadata näyttää tehtyjen muokkausten historian. - Näytä kaikki metadata raportoi kaiken saatavilla olevan metadatan, ja se voi sisältää yli 100 kohtaa, joista et todennäköisesti välitä. - [Extras]-painike Näytä päämetadata -ikkunassa avaa oikealla näkyvän valintaikkunan, jossa voit lisätä lisätageja raporttiin. Mikä tahansa Näytä kaikki metadata -raportissa saatavilla oleva tagi voidaan lisätä lyhyeen raporttiin. Napsauta vasemman sarakkeen tagia lisätäksesi sen oikeaan sarakkeeseen ja raporttiin. Napsauta oikean sarakkeen tagia poistaaksesi sen. Napsauta merkintää "Muu tagi ..." kirjoittaaksesi minkä tahansa tagin nimen, jota ei ole oletusluettelossa, joka on rajattu todennäköisimmin tarvittaviin tageihin. - Fotocx käyttää näitä metadatatageja kuvien muokkaukseen ja hakuun: • Title - kuvan lyhyt otsikko • Description - kuvan kuvaus • Date/Time Original - kuvauksen päivämäärä/aika • Rating - 0-5 tähteä • Country - kameran GPS:stä tai manuaalisesti lisätty • Location - EXIF-nimi on kaupunki • Geotags - latitude/longitude • Keywords - käyttäjän antamia kuvan tunnisteita • Camera data - merkki, malli, objektiivi • Exposure data - aika, F-luku, polttoväli, ISO Näitä tageja muokataan toiminnolla {MUOKKAA PÄÄMETADATAA}. Myös mitä tahansa muita tageja voidaan muokata ja hakea vähemmän kätevillä menetelmillä, jotka selitetään alla. - On myös useita eräkäsittelytoimintoja, joilla voi lisätä tietoja moneen kuvatiedostoon kerralla. Katso {ERÄVALIKKO}. - - TOPIC: KEYWORDIEN YLEISKATSAUS Kuvatiedostoilla voi olla tunniste- tai luokitteluavainsanoja. Näitä voidaan käyttää hakemaan suuresta kuvakokoelmasta kuvia, joilla on halutut avainsanat. Tyypillisiä avainsanoja: aihe, tapahtuma, sijainti, henkilöt tai asiat jne. Avainsanat sijaitsevat kuvan metadatassa. Avainsanat ovat yleensä yksi sana, mutta lyhyttä välilyönnillisiä tai muita erottimia sisältävää ilmausta voidaan myös käyttää. Pilkkuja ja puolipisteitä käytetään erottimina avainsanojen välillä, joten niitä ei voi käyttää avainsanan sisällä (ulkoinen standardi). Yhdistelmäavainsana kuten "arizona scenery" on sallittu, mutta sen sijaan kannattaa käyttää kahta avainsanaa joustavuuden vuoksi: voit hakea kuvia, joilla on jompikumpi avainsana tai molemmat. - Kaikki kuvat, joilla on haluttu avainsana tai avainsanoja, voidaan löytää nopeasti ja näyttää galleriaikkunassa. Jos olet käyttänyt kansio- ja tiedostonimiä mielekkäästi, voit hakea kuvia myös näiden nimien perusteella. Voit hakea kuvia myös päivämäärän, arvosanan, sijainnin ja muiden metadatatagien perusteella. Näitä ei tarvitse toistaa avainsanoissa. Katso {HAE KUVIA} alla. - ^Hallittu avainsanajärjestelmä Tämä sopii, jos haluat suunnitella avainsanajärjestelmäsi ennen avainsanojen lisäämistä kuviisi. Tässä järjestelmässä luot rajallisen määrän avainsanakategorioita (esim. ihmiset, paikat, esineet, tapahtumat, taide, maisemat ...). Avainsanoja voidaan luoda ja osoittaa kategoriaan tarpeen mukaan, kun avainsanoja liitetään kuviin. Kuvalle annetaan avainsana osoittamalla ja napsauttamalla käytettävissä olevien avainsanojen luetteloa, joka on järjestetty kategorioittain ja kategorian sisällä aakkosjärjestyksessä. Jos tarvitaan uusi avainsana, se luodaan, kun se ensimmäisen kerran liitetään kuvaan. Kategoriassa olevien avainsanojen määrän tulisi ihanteellisesti olla alle noin 200, jotta visuaalinen paikannus valintaluettelosta on riittävän nopeaa. - ^Hallitun avainsanajärjestelmän edut • estää epäjohdonmukaiset avainsananimet (esim. 'landscape' ja 'scenery') • estää vaihtoehtoiset kirjoitusasut ja kirjoitusvirheet (esim. susan, susy, susna) • estää avainsanat, jotka sisältävät toisia avainsanoja (esim. scenery, lake) • haku on luotettavampi, koska avainsanoissa ei ole yllä mainittuja virheitä • avainsanoja liittäessäsi sinulla on yleiskuva käytettävissä olevista avainsanoista, sen sijaan että käytössä olisi tuhansia kaoottisia avainsanoja hallitsemattomassa järjestelmässä - Avainsanojen valitseminen suuresta luettelosta voi olla hidasta. Tätä lievennetään kolmella tavalla: • Jopa noin 10 viimeksi käytettyä avainsanaa näytetään metadatan muokkauksen valintaikkunassa, jossa ne on helppo nähdä ja valita. Koska samaan aikaan otettu kuvasarja jakaa todennäköisesti monia avainsanoja, avainsanojen lisääminen on helpompaa ja nopeampaa. • Voit yksinkertaisesti alkaa kirjoittaa haluamaasi avainsanan nimeä. Ponnahdusluettelo vastaavista avainsanoista tulee näkyviin heti, kun mahdollisia osumia on vain muutama. Voit sitten napsauttaa haluttua avainsanaa lisätäksesi sen kuvaan. Jos vastaavia avainsanoja ei ole, voit lisätä uuden avainsanan määriteltyjen avainsanojen luetteloon. • Voit valita kategorian näyttääksesi pienemmän valintaluettelon. - Jos avainsanat on määritelty laajasti ja niitä on vähemmän, avainsanojen hakutulokset ovat suurempia, mutta haluttujen kuvien löytäminen visuaalisesti voi olla varsin nopeaa. Fyysinen tiedostojärjestys säilyy: kansioissa yhdessä sijaitsevat kuvatiedostot näkyvät myös yhdessä hakutuloksissa. - Internetistä ladatut kuvat sisältävät usein avainsanoja. Näillä ei tietenkään ole mitään järjestystä ja ne ovat yhdessä kaoottisia. Jos käytät hallittua avainsanajärjestelmää, on parasta tarkistaa tällaiset kuvat ja siistiä avainsanat vastaamaan järjestelmääsi, tai poistaa ne. Kaikki uudet avainsanat lisätään automaattisesti kategorian "nocatg" alle. Jos huomaat ei-toivottuja avainsanoja avainsanaluettelossasi, käytä toimintoa {HAE KUVIA} avainsanan mukaan löytääksesi kuvat, joissa on ei-toivottuja avainsanoja, jotta ne voidaan korjata tai poistaa. - ^Satunnainen avainsanajärjestelmä Saatat mieluummin keksiä avainsanoja tarpeen mukaan ilman tiettyä järjestelmää mielessä. Tai sinulla saattaa jo olla tuhansia avainsanoja, mikä tekee siirtymisestä hallittuun avainsanajärjestelmään vaikeaa (mutta ei mahdotonta: Fotocx voi massakonvertoida avainsananimiä). Tässä tapauksessa voit yksinkertaisesti kirjoittaa avainsanoja kuviisi, luoden uusia avainsanoja tarpeen mukaan. Avainsanojen järjestyksen ylläpitämiseen on edelleen jonkin verran kykyä: kirjoittamiasi merkkejä vastaavat olemassa olevat avainsanat näytetään heti, kun mahdollisia osumia on vain muutama. Esimerkki: kirjoitat "new" ja näkyviin tulee avainsanaluettelo: New York, New Delhi, Newman ... Jos jokin näistä on tarkoituksesi, napsauta sitä valitaksesi avainsanan. Jos ei, jatka kirjoittamista ja paina lopulta Enter luodaksesi uuden avainsanan. Kun haet kuvia avainsanoilla, voit kirjoittaa haluamasi avainsananimet tai valita ne käytettävissä olevien avainsanojen luettelosta. Kirjoittamiasi ensimmäisiä kirjaimia vastaavat käytettävissä olevat avainsanat näytetään, ja voit valita tästä luettelosta. Et voi syöttää hakuavainsanaa, jota ei ole olemassa missään kuvissasi. Satunnainen avainsanajärjestelmä johtaa todennäköisesti tuhansiin avainsanoihin. Tämä ei välttämättä ole kovin hyödyllistä. - - TOPIC: GEOTAGS OVERVIEW Nykyaikaiset kamerat voivat tallentaa kunkin valokuvan sijainnin sisäisen GPS-vastaanottimen avulla. Latitude, longitude (ja mahdollisesti kaupunki/sijainti ja maa) tallennetaan kuvatiedoston EXIF-metadataan. {MUOKKAA PÄÄMETADATAA}-toiminto mahdollistaa myös sijaintitietojen syöttämisen tai muokkaamisen. Sijainnit voidaan määrittää myös napsauttamalla zoomattavaa maailmankarttaa. Toiminnot tietyn sijainnin tai alueen kuvien löytämiseksi: • {HAE KUVIA}: Hae sijainnin nimellä (myös useita nimiä, osittaiset osumat). • {PAIKAT/PÄIVÄMÄÄRÄT}: Hae maan, sijainnin ja päivämääräryhmien mukaan • Kuvat karttasijainnin mukaan: Napsauta karttamerkkiä näyttääksesi kaikki kuvat merkin sijainnista. - Kameran GPS:stä saadut sijaintinimet (kaupunki tai muu paikannimi, ja maa) eivät ole standardoituja ja voivat olla kaoottisia (esim. Munich, München, MONACO). Tämän käsittelyä käsitellään alla. - - TOPIC: MUOKKAA PÄÄMETADATAA +image: edit-meta.jpg - Muokkaa päämetadataa -toimintoa käytetään perusmetadatan lisäämiseen kuvaan. Lue {KEYWORDIEN YLEISKATSAUS} ja {GEOTAGS OVERVIEW} (yllä) ennen Muokkaa päämetadataa -toiminnon käyttöä. - Muokkaa päämetadataa -toimintoa käytetään yleisimmin käytetyn metadatan muokkaamiseen: kuvan päivämäärä ja aika, arvosana, otsikko, kuvaus, sijaintitiedot ja avainsanat. Valintaikkuna näyttää aluksi nykyisen kuvan tiedot. Kun olet tehnyt lisäyksiä tai muutoksia, paina [Käytä] päivittääksesi kuvatiedoston. Metadatamuutoksille ei ole automaattista tiedostoversiointia, mutta voit käyttää Tallenna tiedosto > Uusi versio, jos haluat. - Valintaikkuna näyttää nykyisen kuvan metadatan Tiedostonäkymässä, tai napsautetun thumbnailin metadatan Gallerianäkymässä. Muokkausvalintaikkuna päivittyy itsestään, kun uusi kuva avataan tai uutta thumbnailia napsautetaan. - Kuvan päivämäärä, jos saatavilla, näytetään kohdassa Image Date. Sen voi syöttää, jos se puuttuu, tai muuttaa. Voit syöttää täyden päivämäärän muodossa yyyy:mm:dd tai lyhyemmässä muodossa yyyy tai yyyy:mm. Puuttuva kuukausi/päivä vastaa loogisesti arvoa 01:01, kun sitä verrataan hakuun alarajaan, tai arvoa 12:31, kun sitä verrataan ylärajaan. [Edellinen]-painike täyttää päivämäärän edellisestä syötetystä tiedosta. Tämä helpottaa kuvasarjan päivämäärien syöttämistä. Jos aika on tärkeä, voit lisätä ajan muodossa hh:mm[.ss]. Koko syöttömuoto on: yyyy:mm:dd hh:mm:ss - Voit syöttää kuvalle otsikon, kuvauksen ja arvosanan (0-5 tähteä). Muokataksesi otsikkoa tai kuvausta, paina vastaavaa [muokkaa]-painiketta. Tämä avaa ponnahtavan tekstieditorin, jossa tekstin koolla on suuri raja. Voit käyttää [enter]-näppäintä tarkoituksellisen rivinvaihdon tekemiseen. Fotocxissa nämä rivinvaihdot toimivat; muissa kuvankatseluohjelmissa ne saatetaan korvata pisteillä. - Olemassa olevat avainsanat näytetään kohdassa Image Keywords. Käytettävissä olevat avainsanat näytetään alla olevassa Defined Keywords -ikkunassa. Yksi näistä avainsanoista voidaan lisätä kuvaan napsauttamalla sitä. Avainsana voidaan poistaa kuvasta napsauttamalla sitä kohdassa Image Keywords. Äskettäin lisätyt avainsanat näytetään kohdassa Recent Keywords. Tämä helpottaa avainsanojen lisäämistä uuteen kuvaerään, koska monia samoja avainsanoja käytetään uudelleen. Osoita ja napsauta samalla tavalla. - Jos määriteltyjen avainsanojen luettelo on pitkä, voi olla helpompaa kirjoittaa haluttu avainsana kohtaan Enter Keyword. Kirjoittamaasi tekstiä vastaavat olemassa olevat avainsanat näkyvät kohdassa Matching Keywords, ja voit napsauttaa yhtä niistä lisätäksesi avainsanan kuvaan. Jos syötetty avainsana on uusi (vastaavaa avainsanaa ei näytetä), paina [lisää uusi keyword], kun avainsana on valmis. Se lisätään kuvaan ja määriteltyjen avainsanojen luetteloon kategorialla "nocatg". - Jos käytät avainsanakategorioita, voit valita kategorian, jolloin määriteltyjen avainsanojen luettelossa näytetään vain kyseisen kategorian avainsanat. - [Käytä]-painike kirjoittaa tiedot kuvatiedostoon ja kuvien hakuun käytettävään metadataindeksitiedostoon. - [Edellinen]-painiketta (valintaikkunan alaosassa) voidaan käyttää lataamaan kaikki saatavilla olevat tiedot edellisestä katsotusta tai muokatusta kuvasta. Tätä voidaan käyttää nopeuttamaan sellaisen kuvaryhmän käsittelyä, jolla on paljon samoja tietoja. - ^Geotagien lisääminen {MUOKKAA PÄÄMETADATAA}-valintaikkunassa on useita tapoja lisätä sijaintinimiä ja geokoordinaatteja. - Kameran GPS Kamerasi GPS-anturi on saattanut lisätä sijaintinimiä ja geokoordinaatteja. Kieli ei ehkä ole haluamasi, tai käytössä saattaa olla kaikki isot kirjaimet, tai jotain muuta kaoottista. Käytä [clear]-painiketta aloittaaksesi alusta, ja syötä uusi teksti. - [Etsi]-painike Etsi sijaintia, joka esiintyy jossakin kuvatiedostoissasi tai valtavassa tunnettujen sijaintien luettelossa (worldcities.txt). Syötä muutama alkukirjain kohtaan Location ja paina [Etsi]. Jos vastaavien sijaintien valintaluettelo näytetään, valitse yksi. Jos mitään ei näytetä, käytä [Kartta]-painiketta napsauttaaksesi karttasijaintia. Muokkaa sijainti- ja maanimiä tarpeen mukaan. Tämä sijainti on nyt tunnettu ja valittavissa. - [Edellinen]-painike Jos muokattavana olevalla kuvalla on samat sijaintitiedot kuin edellisellä muokatulla kuvalla, paina [Edellinen] täyttääksesi aiemmin käytetyt sijaintitiedot. - Voit käyttää toimintoa {ERÄ-GEOTAGIT} lisätäksesi sijaintitietoja moneen kuvatiedostoon kerralla. - - TOPIC: MUOKKAA MITÄ TAHANSA METADATAA +image: edit-any-metadata.png - Tämä on valintaikkuna minkä tahansa nykyisen kuvatiedoston metadatan muokkaamiseen. Yleisimmät muokattavat tagit on lueteltu vasemmalla. Paina [Koko luettelo] -painiketta saadaksesi luettelon kaikista nykyisen kuvatiedoston saatavilla olevista tageista (niitä voi olla satoja). Paina [Lyhyt luettelo] palataksesi yleisten tagien luetteloon. Napsauta luettelon tagia hakeaksesi nykyisen tagin arvon. Muuta arvoa halutessasi ja paina [päivitä]. Muokataksesi tagia, jota ei ole luettelossa, syötä tagin nimi ja paina [nouda] hakeaksesi nykyisen arvon, jos sellainen on. Syötä tai muuta sitten arvo ja paina [päivitä]. Poistaaksesi tagin, paina [poista]. Voit syöttää tagin nimen pienillä kirjaimilla ja välilyönnein tai ilman, esim. "Subject Distance" ja "subjectdistance" toimivat molemmat. Joitakin tageja ei voi muuttaa, esim. 'image width' on kuvan pikselileveys, jota voi muuttaa vain muuttamalla kuvan pikselileveyttä. Lyhyen luettelon lähde on tekstitiedosto /meta_picklist. Voit lisätä tai poistaa tageja tästä luettelosta. - - TOPIC: POISTA METADATA Määritä poistettavan tagin nimi, tai valitse All. Metadata poistetaan. Käytä All-vaihtoehtoa puhdistaaksesi kuvasta kaikki mahdolliset tunnistetiedot. Joitakin tageja ei voi poistaa, esim. File Name. - - TOPIC: KOPIOI METADATA Fotocxilla luodut yhdistetyt kuvat (HDR, panoraama, yhdistelmäkuva ...) eivät oletuksena sisällä metadataa. Käytä tätä toimintoa kopioidaksesi metadatan jostakin syötekuvasta tai mistä tahansa muusta kuvasta. Käytä [Selaa]-painikkeita valitaksesi tiedoston, josta metadata haetaan, ja tiedoston, joka vastaanottaa metadatan ("target file" valintaikkunassa). - - TOPIC: KORJAA METADATA Käytä tätä toimintoa, jos sinulla on kuvatiedosto, joka tuottaa virheilmoituksen, kun yrität muokata metadataa. Se poistaa virheellisen metadatan ja säilyttää loput. - - TOPIC: HALLITSE KEYWORDEJA +image: manage-keywords.png - Luo avainsanoja ja ryhmittele ne halutessasi kategorioihin. Voit osoittaa avainsanoille kategorioita, jotta ne on helpompi järjestää ja löytää nopeammin, kun avainsanoja lisätään kuviin. Ne ovat valinnaisia eivätkä vaikuta avainsanahakuun: vain avainsana tallennetaan kuvaan, ei sen kategoriaa. Tyypillisiä kategorioita ovat ihmiset, paikat, esineet, tapahtumat, maisemat, rakennukset, taide jne. Lisätäksesi uuden avainsanan uudella kategorialla, syötä kategoria ja avainsana, ja napsauta sitten [create]. Jos kategoria on tyhjä, avainsana osoitetaan kategoriaan "nocatg". Osoittaaksesi avainsanan toiseen kategoriaan, napsauta kategoriaa (lihavoitu teksti) tai syötä uusi, napsauta avainsanaa ja paina [create]. Avainsana siirtyy vanhasta kategoriasta uuteen. Poistaaksesi avainsanan, napsauta avainsanaa ja paina [poista]. Kuvissa käytetyt mutta kategoriaan osoittamattomat avainsanat näkyvät kohdassa "nocatg". Kategoria, jolla ei ole osoitettuja avainsanoja, voidaan poistaa - napsauta kategoriaa, tyhjennä avainsanan nimi, jos sellainen on, paina [poista]. - Huomaa: äskettäin luotu avainsana lisätään sen kategorian avainsanaluettelon loppuun. Seuraavan kerran, kun Fotocx käynnistetään, kaikki kategoriat ja niiden avainsanaluettelot lajitellaan aakkosjärjestykseen, paitsi että "nocatg" on aina viimeisenä. - - TOPIC: KUVATEKSTIT +image: choose-captions.png - ^Valitse kuvatekstit -valikko Valitse, mitä metadatatageja käytetään tekstuaalisina kuvateksteinä, jotka näytetään kuvan vasemmassa yläkulmassa tiedostonäkymä-tilassa. - ^Vaihda kuvatekstit -valikko Kytke kuvatekstien näyttö PÄÄLLE tai POIS. Määritä pikanäppäin ottaaksesi kuvatekstien näytön nopeasti käyttöön tai pois käytöstä. - ^Huomaa:^ hiiren siirtäminen kuvan vasempaan yläkulmaan tiedostonäkymässä näyttää otsikon ja kuvauksen ponnahduskuvassa. Kuva katoaa, kun hiiri siirretään pois. - - TOPIC: PAIKAT/PÄIVÄMÄÄRÄT +image: image-locations.jpg - Tämä on nopea tapa löytää kaikki tietyssä sijainnissa tai sijainnin ja päivämääräalueen mukaan otetut valokuvat. Valitse valintaikkunassa kahdesta vaihtoehdosta: sisällytä kaikki kuvat raporttiin, tai sisällytä vain edellisen Haku-toiminnon löytämät kuvat. Valitse sitten haluttu ryhmittelytaso: maa maa ja sijainti maa ja päivämäärä maa ja sijainti ja päivämäärä päivämäärä ja maa päivämäärä ja maa ja sijainti - Jos päivämäärä on mukana, valitse yhdistämiseen käytettävä päiväväli: väliin osuvat päivämäärät ryhmitellään yhteen ensimmäisen päivämäärän alle. Paina [proceed] saadaksesi raportin, joka näyttää kuvien määrän kussakin ryhmässä: maan, maan ja sijainnin mukaan jne. Tämä on myös lajittelujärjestys. Yllä olevassa esimerkissä 28 valokuvaa on Uudesta-Seelannista päivältä 2004.11.02. Napsauta raportin riviä saadaksesi thumbnail-gallerian näistä kuvista. - - TOPIC: AIKAJANA +image: timeline-report.jpg - Tämä raportti tuottaa aikajanan kuvien määristä kuukausittain. Valitse kahdesta vaihtoehdosta: sisällytä kaikki kuvat raporttiin, tai sisällytä vain edellisen Haku-toiminnon löytämät kuvat. Napsauta tuloksena syntyvässä raportissa vuotta ja kuukautta saadaksesi thumbnail-gallerian kaikista kuvista, joilla on kuvauspäivämäärä (EXIF) valitussa kuukaudessa. Yllä oleva esimerkki näyttää 208 kuvaa lokakuulta 2017. Vuosi 'null' on kuville, joilla ei ole kuvauspäivämäärää. - - TOPIC: METADATA-TAGIT Tämä toiminto löytää kaikki kuvatiedostot, jotka käyttävät määritettyä metadatatagia ja arvoa. Valitse tagi ponnahdusluettelosta: rating, keywords, title, description, camera, lisäindeksoitu metadata - katso {INDEKSOI TIEDOSTOT}. Käytettävissä olevien tagiarvojen luettelo näytetään yhdessä kyseistä tagiarvoa käyttävien kuvatiedostojen määrän kanssa. Kohdissa 'title' ja 'description' näytetään vain ensimmäiset 60 merkkiä, ja kaikki tiedostot raportoidaan, jotka käyttävät näitä ensimmäisiä 60 merkkiä vastaavia tagiarvoja. Kohdassa 'camera' vastaavuusarvo on merkin, mallin ja objektiivin yhdistelmä. - - TOPIC: AUTOMAATTIHAKU Tätä toimintoa voivat käyttää shell-skriptitiedostot poimimaan kuvatiedostoja, jotka täyttävät minkä tahansa Hae kuvia -toiminnossa käytettävissä olevan valintaperusteen (katso alla). Käytä ensin Hae kuvia -toimintoa asettaaksesi halutut valintaperusteet (esim. kansio-/tiedostonimet, päivämäärät, avainsanat tai muu metadata). Käytä [tallenna]-painiketta tallentaaksesi perusteet asetustiedostoon. Käytä seuraavaa komentoa Fotocxin käynnistämiseen ja haun suorittamiseen: $ fotocx -m autosearch . Tulos tallentuu kansioon /search_results. - - TOPIC: HAE KUVIA Käytä Hae kuvia -toimintoa löytääksesi kuvia, joilla on haluttua metadataa (päivämäärä, avainsanat, sijainti ...). Hakuun käytetään metadataindeksitiedostoa, mikä mahdollistaa tuhansien kuvien haun sekunnissa. - Raporttimuotoja on kaksi: hakuehdot täyttäviä kuvia näyttävä thumbnail-galleria, tai metadataraportti, joka yhdistää thumbnailit metadatatekstiin. Tässä on esimerkki metadataraportin muodosta: +image: search-images-metadata.jpg - ^Hakuvalintaikkuna +image: search-images.jpg - Valitse valintaikkunassa, mitä kuvia haetaan, joko kaikki (all images) tai nykyinen joukko, eli nykyisen gallerian kuvat, joka voi olla kansio, albumi tai edellisen kuvahaun tulos. - Valitse seuraavaksi, mitä tehdä löydetyille vastaaville kuville: 'new set' tarkoittaa nykyisen joukon korvaamista löydetyillä kuvilla, 'add' tarkoittaa niiden lisäämistä nykyiseen joukkoon (galleriaan), ja 'remove' tarkoittaa niiden poistamista nykyisestä joukosta. Poistaaksesi kuvia, sinun täytyy hakea nykyisestä joukosta. - Valintaperusteet täyttäville tiedostoille voit lisäksi määrittää, mitkä versiot valitaan: original, last version, tai all versions. 'original' tarkoittaa alkuperäistä tai muokkaamatonta kuvaa (tai ensimmäistä versiota, jos alkuperäistä ei tallennettu). 'last version' tarkoittaa uusinta tai viimeksi muokattua käytettävissä olevaa versiota. 'all versions' tarkoittaa, että alkuperäinen ja kaikki versiot noudetaan. - Valitse haluttu raporttityyppi. Galleriaraportti on sivu thumbnail-kuvia, niin pitkä kuin tarvitaan kaikkien hakuehdot täyttävien kuvien sisällyttämiseksi. Metadataraportissa on sekä thumbnail-kuvat että luettelo metadatatageista kunkin thumbnailin vieressä. Näihin kuuluvat standarditagit (date, rating, keywords, geotags, title, description) ja mahdolliset muut metadatatagit, jotka lisäsit tagien valintaluetteloon (katso alla). - Syötä hakuperusteesi. Valitse halutut avainsanat, päivämäärät, tähtiluokitukset, tekstissä (kuvan otsikossa tai kuvauksessa) esiintyvät sanat, tiedosto- tai kansionimet ja sijaintinimet. Katso lisätietoja alla. - Käytettävissä olevat avainsanat näytetään kohdassa Defined Keywords ja ne voidaan valita osoittamalla ja napsauttamalla. Jos määriteltyjen avainsanojen luettelo on pitkä, voi olla helpompaa alkaa kirjoittaa avainsanaa kohtaan 'enter keyword'. Kirjoitettua tekstiä vastaavat olemassa olevat avainsanat näkyvät 'matches'-luettelossa, ja voit napsauttaa yhtä niistä lisätäksesi avainsanan hakuluetteloon. - Jos käytät avainsanakategorioita, voit valita kategorian, jolloin määriteltyjen avainsanojen luettelossa näytetään vain kyseisen kategorian avainsanat. - Päivämääräalue voidaan syöttää rajoittamaan haku päivämääräalueen sisällä oleviin kuviin. Valitse kuvauspäivämäärä (kamerasta) tai tiedostopäivämäärä (luonti- tai viimeisin muokkauspäivämäärä). Muoto on yyyy:mm:dd. Valitaan kuvat, joiden päivämäärä on ensimmäisenä päivämääränä tai sen jälkeen, jos annettu, ja toisena päivämääränä tai sitä ennen, jos annettu. Puuttuva kuukausi/päivä oletuksena on 01/01 alarajalle ja 12/31 ylärajalle. Ajat voidaan valinnaisesti määrittää muodossa yyyy:mm:dd hh:mm. Puuttuvat ajat oletuksena ovat 00:00 ja 23:59. - Etsiäksesi kuvia, joilla ei ole EXIF-kuvauspäivämäärää (esim. skannatut kuvat), käytä arvoa "null" ensimmäisessä päivämääräkentässä. - Tähtiluokitusten pari voidaan syöttää rajoittamaan tulokset kuviin, joiden arvosana on annetulla alueella. Puuttuva alaraja tarkoittaa 0 tähteä, ja puuttuva yläraja tarkoittaa korkeinta arvosanaa, 5 tähteä. - Kansio- ja tiedostonimiä voidaan hakea. Syötä kenttään search file names mikä tahansa määrä kuvakansioissasi ja tiedostonimissäsi käytettyjä nimiä, pilkuilla erotettuna. Syöte "egypt cairo" vastaisi kaikkia kuvakansio- tai tiedostonimiä, jotka sisältävät jommankumman näistä merkkijonoista. Myös osamerkkijonot vastaavat. Kirjainkoolla ei ole merkitystä. - Kuvan otsikkoa ja kuvausta voidaan hakea. Syötä haettavat sanat kenttään search title/desc, pilkuilla erotettuna. Nämä täsmäytetään kaikkien kuvien otsikon ja kuvauksen jokaiseen sanaan, ja vastaavat kuvat valitaan. Kirjainkoolla ei ole merkitystä. - Hakeaksesi sijainteja, syötä yksi tai useampi kaupungin/sijainnin tai maan nimi kenttään search locations, pilkuilla erotettuna. Vain kuvatiedostot, joiden geotagit vastaavat jotakin syötetyistä sijainneista, valitaan. Sijainti voi olla kaupunki, puisto tai muu maantieteellinen nimi (mitä tahansa on tallennettu metadatan 'City'- ja 'Country'-kenttiin). Kirjainkoolla ei ole merkitystä. - Valintanapit 'all' ja 'any' koskevat avainsanoja, tekstiä, tiedostonimiä ja sijainteja. Voit valita kuvia, joilla on KAIKKI syötetyt merkkijonot, tai JOKIN syötetyistä merkkijonoista. Esimerkki: jos sijaintihakukenttä on "new york" ja "any" on valittu, mukaan tulisivat kuvat Uudesta-Seelannista ja Yorkista, Englannista. Jos "all" on valittu, mukaan tulisivat vain New Yorkissa sijaitsevat kuvat. - Jos haluat löytää kuvia, joista puuttuu tietoa, voit syöttää "null" täsmäysarvoksi. - ^Hae lisämetadataa Valintaikkunan syötteillä 'tagname', 'condition' ja 'match values' voit määrittää lisämetadatatageja käytettäväksi valintaperusteina, tai lisättäväksi raporttitulosteeseen, jos "metadata"-raporttityyppi on valittu. Tietylle kuvatiedostolle käytettävissä olevat tagit voidaan näyttää toiminnolla {KATSELE KAIKKEA METADATAA}. Näihin kuuluu monia tageja, joita ei ole päävalintaikkunassa. Valintaluettelo tulee tekstitiedostosta /meta_picklist. Voit lisätä tageja tähän tiedostoon halutessasi. Voit käyttää myös tageja, jotka ovat mukana päävalintaikkunassa. Etuna tässä on, että voidaan käyttää joustavampaa täsmäyslogiikkaa. - Täsmäyslogiikka voidaan valita kullekin metadatatagille. ^täsmäysmenetelmä täsmäysarvo valintaa varten • report mikä tahansa arvo, myös puuttuva • reportx arvo ei puutu • matches pilkulla erotetut tekstiarvot • contains sama, osamerkkijonotäsmäyksellä • number = yhtäsuuret arvot • number => yhtäsuuri tai suurempi arvo • number <= yhtäsuuri tai pienempi arvo - Oikealla puolella olevia [X]-painikkeita voidaan käyttää yksittäisten metadatan hakutagien tyhjentämiseen. - ^Valintaikkunan painikkeet [Lataa] ja [Tallenna] voidaan käyttää hakuperusteiden lataamiseen tai tallentamiseen tiedostosta. [Tyhjennä] tyhjentää kaikki tiedot valintaikkunasta. [Jatka] käynnistää hakuprosessin. - Paina [proceed]-painiketta suorittaaksesi haun. Tuloste on vakiomuotoinen thumbnail-galleria tai yllä näkyvä metadataraporttimuoto. Voit tallentaa haetut kuvat pysyvänä albumina - katso {ALBUMIT}. - ^Suorituskyky Indeksoidun metadatan haku ja raportointi on lähes välitöntä. Indeksoimattoman metadatan nopeus riippuu tietokoneen ja levyn nopeudesta. Tehokas tietokone SSD-levyllä voi hakea yli 100 000 tiedostoa minuutissa. - ^search_results^ (albumi) Hae kuvia -toiminnon tuloste tallennetaan albumiin "search_results". Nimeä tämä albumi uudelleen, jos haluat estää myöhemmän haun korvaamasta sitä. - Rajoitus: Hakutoiminto on rajattu 40 000 tulokseen (hakuehdot täyttäviä löydettyjä kuvia). Jos tämä raja ylittyy, sinulle ilmoitetaan ja haku katkaistaan. Tämä raja johtuu siitä, että GTK:n vieritettävän ikkunan koko on rajallinen, ja suuremman ikkunan luomisyritys voi johtaa kaatumiseen tai jumiutumiseen. - - TOPIC: VALINTAVALIKKO - - TOPIC: ALUEEN YLEISKATSAUS Muokkaustoiminnot koskevat normaalisti koko kuvaa, mutta on mahdollista muokata osaa kuvasta ("aluetta") ja jättää loput ennalleen. Jos kuva-alue on valittu, useimmat muokkaustoiminnot toimivat vain tämän alueen sisällä. Jotkut toiminnot (esim. Muuta kokoa) jättävät valitun alueen huomiotta. Alue voidaan valita ennen muokkaustoiminnon aloittamista tai muokkaustoimintoa käytettäessä. Valittu alue on välittömästi aktiivinen, aiemmat muokkaukset säilyvät, ja tulevat muokkaukset koskevat vain aluetta. Jos toinen muokkaus aloitetaan, valittu alue pysyy aktiivisena, joten alueen sisällä voidaan tehdä sarja muokkauksia. Alue voi olla myös useita toisiinsa liittymättömiä alueita kuvassa. - Fotocx käyttää 'alueita' 'tasojen' sijaan. Sen sijaan, että valitsisit jotain kuvasta, tekisit valinnasta erillisen tason, muokkaisit tasoa ja lopulta yhdistäisit tason, valitset jotain kuvasta, suoritat muokkaustoimintoja valinnalle, ja näet lopputuloksen välittömästi. Alueet voidaan myös tallentaa, liittää toiseen kuvaan, siirtää ja skaalata, ja muokata edelleen. - +image: edit-selection.jpg - Valitun alueen muokkaaminen voi joskus johtaa näkyviin reunoihin alueen reunoilla (joskus nämä vastaavat kuvan kohteiden reunoja, eivätkä siksi ole ongelma). Voit sekoittaa reunoja toiminnolla {ALUEEN SEKOITUS}: muokkauksia voidaan soveltaa asteittain alueen reunasta sisäänpäin, ja voit valita, mitkä reunat sekoitetaan. - - TOPIC: VALITSE ALUE +image: select-area.jpg - Valitse alue -valintaikkuna käynnistyy valikosta Valinta > Valitse alue. Valitse yksi alla selitetyistä menetelmistä. Jokainen menetelmä valitsee kuva-alueita eri tavalla. Voit vaihtaa menetelmää milloin tahansa, ja valitut alueet kertyvät. Valitun kuva-alueen (tai alueiden) ääriviiva näytetään, kun lisäät tai poistat alueita valinnasta. [Lopeta]-painiketta käytetään alueen ääriviivan sisällä olevien kuvapikselien kartoittamiseen, jotta ne ovat valmiita seuraavien muokkaustoimintojen soveltamiseen. [Piilota]-painike piilottaa alueen ääriviivan, mikä antaa paremman näkyvyyden muokkauksille ja mahdollisille alueen reunavaikutuksille. Käytä [Näytä]-painiketta näyttääksesi alueen ääriviivan. [Tyhjennä]-painike poistaa kaikki alueen valinnat. Valitse alue -valintaikkuna voidaan peruuttaa ja käynnistää myöhemmin uudelleen olemassa olevien alueiden muokkaamiseksi tai uusien lisäämiseksi. - ^Menetelmät Seuraavia menetelmiä käytetään yhden tai useamman kuva-alueen rajaamiseen, jotka kuuluvat lopulliseen alueeseen. Näitä menetelmiä voidaan käyttää missä tahansa järjestyksessä määrittämään tiloja, jotka ovat joko yhdistettyjä tai erillisiä. • Rectangle - vedä rajataksesi suorakulmaisen alueen • Ellipse - vedä rajataksesi pyöreän tai soikean alueen • Freehand Draw - rajaa alue piirtämällä hiirellä • Follow Edge - rajaa seuraamalla kuvan kohteiden reunoja • Select area within mouse - vedä valitaksesi pikselit hiiren osoittimen ympärillä olevasta ympyrästä. • Select one color within mouse - valitse vain pikselit, jotka vastaavat annettua väriä, 0-100 % täsmäys. • Select all colors within mouse - valitse kaikki pikselit hiiren sisällä, laajenna valinta viereisiin alueisiin, joiden värit vastaavat hiiren sisällä olevia värejä (kutsutaan joskus nimellä 'flood'). - Seuraavat kappaleet selittävät kunkin menetelmän yksityiskohdat. - ^Rectangle Vedä hiirtä valittavan suorakulmaisen alueen kulmasta vastakkaiseen kulmaan. Alueen ympärille piirretään suorakulmio. Napsauta oikealla poistaaksesi ja aloittaaksesi alusta. Toista prosessi valitaksesi lisää suorakulmaisia alueita. - ^Ellipse Tämä toimii samoin kuin suorakulmion valinta, paitsi että rajattu alue on ympyrä tai soikio. Vedon aloituskohta on tuloksena olevan soikion keskipiste. Vedon kulma määrittää soikion muodon. - ^Freehand Draw Vedä hiirtä (vasen painike pohjassa) piirtääksesi vapaan käden viivan, tai napsauta vasemmalla yhdistääksesi suoran viivan viimeksi piirretystä pisteestä napsautettuun pisteeseen. Jatka kohdealueen ympäri, kunnes se on ympäröity yhdistetyillä käyrillä ja viivoilla. Napsauta oikealla poistaaksesi edelliset viivat (virheet). Oikea napsautus poistaa edellisen napsautetun tai vedetyn viivan, jopa 50 pikseliä. Napsauta oikealla toistuvasti poistaaksesi lisää. Uusi napsautettu viiva yhdistyy aina edellisen viivan päähän. Uusi vedetty viiva yhdistyy edelliseen viivaan, jos se aloitetaan lähellä kyseisen viivan päätä. Jos se aloitetaan muualla, piirretään erillinen viiva. Voit aloittaa uuden vedon kaukaa ja piirtää takaisin kohtaamaan edellisen viivan. Jos napsautettu viiva yhdistyy ei-toivottuun pisteeseen (eli et halua yhdistää viimeksi piirrettyyn viivaan), napsauta oikealla poistaaksesi sen ja käytä sitten vetoa aloittaaksesi uuden viivasarjan. Oikean painikkeen vetoa voidaan käyttää viivasegmenttien poistamiseen: vedä oikealla lähellä viivaa poistaaksesi sen, ja vedä sitten vasemmalla piirtääksesi viivan uudelleen. Lopussa alueen on oltava täysin suljettu ilman aukkoja. Viivat, jotka menevät hieman päällekkäin päistään, ovat kunnossa. Aukkoja voi olla vaikea löytää ja korjata, joten työskentele 100 %:n kuvakoolla tai suuremmalla ja ole huolellinen. Vasemmalla napsauttamalla automaattisesti yhdistetty viivasarja ei jätä aukkoja, mutta poikkeaminen tästä järjestyksestä todennäköisesti luo aukkoja. Vähentääksesi aukkojen mahdollisuutta, käytä tarkoituksellisia päällekkäisyyksiä yhdistäessäsi viivoja manuaalisesti. Alla on kuvattu aukon tunnistustyökalu - {ETSI ALUEEN AUKKO}. Jos alueen reuna on myös kuvan reuna, tätä alueen osaa ei tarvitse piirtää. Piirrä viiva kuvan reunan ulkopuolelle, ja piirrä se takaisin kuvaan toiseen kohtaan kuvan reunaa pitkin. - ^Follow Edge Korkeakontrastiset pikselit (todennäköisesti kuvan kohteiden reunoja) viimeksi piirretyn pisteen ja äskettäin napsautetun kohdan välillä löydetään ja yhdistetään. Tämä toimii hyvin selkeille reunoille, jotka eivät ole liian epäsäännöllisiä. Sumeat ja rosoiset reunat eivät ehkä toimi hyvin, ja vapaan käden piirtoa tarvitaan, jos vaaditaan suurta tarkkuutta. Viivojen yhdistämissäännöt ovat samat kuin yllä on selitetty. Hiiren vetäminen napsauttamisen sijaan toimii kuten vapaan käden piirto, mutta sillä on taipumus seurata kohteiden reunoja hieman hiiren takana olevasta kohdasta. Erittäin epäsäännöllisille reunoille (hiukset, kasvillisuus) katso 'deselect color' alla. - ^Hiiren säde ja värin täsmäystaso Nämä kaksi säädintä koskevat vain alla kuvattuja 'select within mouse' -menetelmiä. Hiiren säde määrittää hiiren osoittimen ympärillä olevan ympyrän koon. Ympyrän sisällä olevat pikselit valitaan, tai ne tarjoavat joukon värejä pikselien täsmäämiseen ja valitsemiseen hiiriympyrästä ulospäin. Täsmäystaso määrittää vaaditun täsmäystason (0-100 %) pikselien valitsemiseksi niiden värin ja kirkkauden perusteella. '0' tarkoittaa, että mikä tahansa täsmää, ja '100' tarkoittaa, että täydellinen täsmäys vaaditaan. - ^Select area within mouse Vasen napsautus tai veto valitsee hiiriympyrän sisällä olevat pikselit. Oikea napsautus poistaa valinnan viimeisimmästä valinnasta (toista poistaaksesi lisää). Oikea veto poistaa valinnan suljetuista pikseleistä. - ^Select one color within mouse Napsauta kuvaa valitaksesi värin. Väri näytetään väripainikkeessa. Voit myös käyttää painiketta asettaaksesi värin suoraan. Vedä vasemmalla/oikealla valitaksesi/poistaaksesi valinnan hiiriympyrän sisällä olevista pikseleistä, jotka vastaavat valittua väriä täsmäystason sisällä. Säädä täsmäystasoa alas tai ylös vastaamaan laajempaa tai suppeampaa väriväliä. Napsauta kuvaa tarpeen mukaan vaihtaaksesi täsmäytettävää väriä. - ^Valinnainen deselect color Tämä koskee vain yllä olevaa 'select one color' -menetelmää. Napsauta kuvaa vasemmalla asettaaksesi deselect color -värin. Kun ruutu on valittu, deselect color on aktiivinen. Jos pikseli vastaa deselect color -väriä paremmin kuin select color -väriä, pikselin valinta poistetaan. Kun valitaan kohteen reunaa pitkin, jonka värikontrasti on matala verrattuna viereiseen alueeseen, joka pitäisi jättää valitsematta, aseta deselect color viereisestä alueesta. Tämä auttaa monimutkaisen reunan, kuten hiusten tai kasvillisuuden, tarkassa valinnassa. - ^Select all colors within mouse Tätä kutsutaan joissakin editoreissa nimellä 'flood'. Vedä vasemmalla/oikealla valitaksesi/poistaaksesi valinnan hiiriympyrän sisällä olevista pikseleistä. Myös hiiriympyrän ulkopuoliset pikselit sisällytetään, jos ne täyttävät nämä kaksi ehtoa: 1) niiden väri vastaa mitä tahansa hiiriympyrän sisällä olevaa väriä nykyisen täsmäystason puitteissa. 2) ne ovat hiiren osoittimen hakualueella. Tämä on hiiren säteen kerroin, esim. jos hiiren säde on 20 ja hakualue on 3, hakualue on 60 pikseliä hiiren osoittimesta. Vedä hiirtä uusien alueiden yli, jotka haluat sisällyttää. Katso, kuinka valittu alue laajenee alueisiin, joiden värit vastaavat hiiriympyrän sisällä olevia värejä. Jos menet liian pitkälle, napsauta oikealla poistaaksesi viimeisen valinnan. Toista tarvittaessa poistaaksesi lisää aiempia valintoja. Pienennä sädettä tai suurenna täsmäystasoa saadaksesi tarkemman hallinnan - valinta laajenee hitaammin ja pysyy lähempänä hiiriympyrää. Pientä sädettä ja korkeaa täsmäystasoa voidaan käyttää kuvan kohteen reunan seuraamiseen ja pikselien valitsemiseen reunaan asti hyvällä tarkkuudella. Kun reunatyö on valmis, käytä select area within mouse -menetelmää valitaksesi loput. Oikea veto toimii valinnan poistona: hiiriympyrän sisällä olevat ja hakualueella vastaavat pikselit poistetaan valinnasta. Jos valinta menee liian pitkälle, sen korjaaminen on usein helpompaa poistamalla valinta valitun alueen ulkopuolelta sen sijaan, että valittaisiin sisältä. Saatat tarvita hieman harjoitusta saadaksesi tuntuman tähän ja pystyäksesi työskentelemään tehokkaasti. - ^Select all colors within mouse - yhteenveto • vasen veto - valitsee hiiren sisällä olevat pikselit ja vastaavat pikselit alueelta • oikea napsautus - kumoaa edellisen valinnan, toista poistaaksesi lisää valintaa • oikea veto - poistaa valinnan hiiren sisällä olevista pikseleistä ja vastaavista pikseleistä alueelta - ^Edge creep Valmiiksi merkittyä aluetta (katso alla) voidaan laajentaa tai supistaa 1 pikselin askelin. Tästä voi olla hyötyä reunavaikutusten vähentämisessä, kun väreillä täsmäämällä valittua aluetta muokataan tavalla, joka muuttaa sen kirkkautta. Värillä valinta saattaa jättää kapean alivalitun tai ylivalitun pikselivyön reunaan, jossa kohteen väri siirtyy taustaan. Alueen laajentaminen tai supistaminen 1-2 pikseliä voi tuottaa siistimmän näköisen reunan. Alue pysyy valmiina (katso alla) creepin jälkeen. - ^Alueen ääriviivan väri Hiiren valintaympyrässä ja alueen ääriviivassa käytettyä väriä voidaan vaihtaa milloin tahansa napsauttamalla jotakin väripainikkeista. Tämä mahdollistaa hyvän näkyvyyden erilaisia kuvavärejä vasten. - ^Show/Hide Käytä [Piilota] piilottaaksesi alueen ääriviivat. Tämä on hyödyllistä, jotta näet paremmin alueen muokkausten vaikutukset ilman alueen ääriviivan häiriötä. Käytä [Näytä] näyttääksesi ääriviivat ja jatkaaksesi alueen muokkausta. - ^Finish +image: select-area-finish.png - Alue ei ole tehokas muokkauksille ennen kuin se on onnistuneesti viimeistelty. Finish tarkistaa piirretyt ääriviivat ja värittää suljetut pikselit visuaalista tarkistusta varten. Kun olet lopettanut alueiden rajaamisen, käytä [Lopeta]-painiketta prosessin saattamiseksi loppuun. Yllä näkyvä ponnahdusvalintaikkuna esittää yhteenvedon kahdesta menetelmästä, joita voit käyttää viimeistelyyn. - Menetelmä 1: Napsauta hiirtä vasemmalla käsin rajattujen alueiden sisällä. Suljetut alueet väritetään väliaikaisesti, jotta voit varmistaa lopputuloksen olevan aiottu. Mikä tahansa suljettu alue voidaan valita, myös ne, joita ei ole nimenomaisesti rajattu: jos sinulla on donitsi, jossa on reikä, voit valita donitsin, reiän tai molemmat. Paina [keep], kun kaikkia alueita on napsautettu ja ne on väritetty oikein. Jos käsin piirretyn alueen ääriviivassa on aukko, väritysprosessi "vuotaa ulos" ja rajauksen ulkopuoliset alueet väritetään. Tässä tapauksessa paina [Kumoa] Finish-valintaikkunassa, mikä palauttaa alkuperäisen alueen ääriviivan. Etsi aukko ääriviivasta ja sulje se, ja yritä sitten [Lopeta] uudelleen. 1 pikselin aukkoa suuressa alueessa voi olla vaikea löytää. Zoomaa sisään nähdäksesi paremmin. Katso toiminto {ETSI ALUEEN AUKKO} alla, jolla löydät pienet aukot nopeasti. - Menetelmä 2: Napsauta oikealla jossain kaikkien suljettujen alueiden ulkopuolella. Kaikki suljetut alueet väritetään visuaalista tarkistusta varten. Jos aukko on olemassa, tulokset ja korjaus ovat samat kuin menetelmässä 1 kuvattu. Tämä menetelmä on järkevä, jos sinulla on monta käsin rajattua aluetta etkä halua tarkistaa niitä yksitellen menetelmällä 1. - 'select within mouse' -menetelmillä valitut alueet viimeistellään automaattisesti. Nämä alueet kartoitetaan valintaprosessin aikana, kun taas suorakulmiolla, soikiolla tai jollakin viivanpiirtomenetelmällä valitut alueet kartoitetaan vasta, kun napsautat niiden sisällä. Jos käytät vain 'select in mouse' -menetelmiä, voit painaa [keep] napsauttamatta mitään valituista alueista. - Jos piirrät viivan kuvan yhdeltä sivulta toiselle, voit napsauttaa kumpaa tahansa viivan puolta luodaksesi alueen kaikista kyseisellä puolella olevista pikseleistä. Esimerkki: piirrä vaakasuora viiva taivaan ja maan rajalle. Napsauta viivan yläpuolelta valitaksesi taivaan, alapuolelta valitaksesi maan. Piirrettyjen viivojen on ulotuttava kuvan reunoihin täysin. - ^Clear Hylkää nykyinen alue pysyvästi. - - TOPIC: ETSI ALUEEN AUKKO Jos alueen ääriviiva luotiin vapaan käden piirrolla useilla vedoilla, ääriviivaan on helppo jättää pieniä aukkoja, jotka eivät näy alle 4x zoomauksella. Tällaisen alueen viimeistelyyritys epäonnistuu, koska sisäpikselien kartoitus vuotaa aukon läpi ja peittää alueita aiotun alueen ulkopuolella. Jos Finish-toiminto epäonnistuu, tämä toiminto voi löytää aukon. Napsauta jotakin epäonnistuneen alueen ääriviivan kohtaa. Ääriviiva piirretään hitaasti uudelleen yhteen suuntaan napsautetusta kohdasta, kunnes "päätepikseli" löytyy. Siinä kohtaa aukko on. Ääriviiva piirretään sitten vastakkaiseen suuntaan, kunnes aukko (tai toinen sellainen) kohdataan. Aukko on siinä, mihin piirtäminen pysähtyi. Zoomaa sisään aukkoon ja sulje se vapaan käden piirrolla, ja testaa sitten uudelleen nähdäksesi, voidaanko koko ääriviiva piirtää pysähtymättä. Tätä toimintoa voidaan käyttää rinnakkain Valitse alue -toiminnon kanssa - molemmat valintaikkunat voivat olla aktiivisia. - - TOPIC: ALUEEN SEKOITUS +image: area-blend.jpg - Tässä työkalussa on kaksi toimintoa: Area Blend ja Area Edge Blend. Molemmat toiminnot voivat asteittain 'kumota' valitun alueen sisällä tehdyn muokkauksen sekoittamalla aiemman muokkauksen tai alkuperäisen kuvan. Yllä olevassa esimerkissä taustalla olevat neljä miestä kirkastettiin ilman mitään merkkiä rajasta kirkastettujen ja muuttumattomien pikselien välillä. - ^Area Blend Mitä tahansa muokatun valitun alueen osaa voidaan sekoittaa alkuperäiseen kuvaan. Käytä hiiren vasenta vetoa sekoitettavien alueiden yli. Jokainen hiiren veto alueen sisällä sekoittaa asteittain valitun aiemman kuvan, mikä käytännössä vähentää tai poistaa alueen sisällä tehdyn muokkauksen. Sekoitumisnopeuden määrittää 'blend rate', joka voidaan asettaa erikseen hiiriympyrän keskustalle ja reunalle. Aseta hiiren säde ja sekoitusnopeudet (esim. 50/0 hiiren keskustalle/reunalle). Vedä hiirtä sekoitettavien alueosien yli. Käytä vasenta vetoa sekoittamiseen, oikeaa vetoa sekoituksen poistamiseen tai palauttamiseen. Voit käyttää tätä menetelmää sekoittaaksesi alueen reunoja valikoivasti: käytä pientä sädettä ja vedä hiiren keskustaa sekoitettavien reunojen yli. Tämä johtaa liukuvaan sekoitukseen reunasta sisäänpäin. - ^Area Edge Blend Joskus muokatulla alueella on luonnottoman näköisiä reunoja, koska muokatun alueen ja ympäröivän kuvan välillä on terävä raja (erityisesti, jos aluetta kirkastettiin). Tämä voidaan tehokkaasti tehdä näkymättömäksi sekoittamalla alueen muokkaus asteittain pois kapealta kaistaleelta reunoja pitkin. Alueen muokkaus voidaan poistaa 100 % alueen reunasta, vähentyen 0 %:iin sisäänpäin kaistaleen leveydeltä. Alueen reunojen sekoittamiseen on kaksi tapaa, 'blend' ja 'blur'. Blend sekoittaa reunakaistaleen valitun aiemman muokkauksen tai alkuperäisen kuvan kanssa. Blur sekoittaa kaistaleen kaistaleen ulkopuolisten naapuripikselien kanssa. Aseta sekoituksen leveys syötteellä 'blend width' tai 'blur width'. - Alueen reunan 'Blend' ja 'Blur' vaativat reunaetäisyyslaskennan: etäisyys kustakin alueen pikselistä lähimpään alueen reunaan. Tätä etäisyyttä käytetään laskemaan pikselin suhteellinen sekoitus: 100 % alueen reunalla ja 0 % pikseleille, jotka ovat 'blend width' -etäisyyttä kauempana reunasta. Suurella ja monimutkaisella reunalla varustetulla alueella tämä voi kestää jonkin aikaa. Edistymispalkki näytetään ylätason paneelissa. - - TOPIC: NÄYTÄ/PIILOTA ALUE Näytä tai piilota nykyisen alueen ääriviiva. Alueen piilottaminen on hyödyllistä, kun aluetta muokataan muokkaustoiminnolla. Tämä helpottaa muokkauksen vaikutusten arviointia. Nämä ovat käytettävissä myös painikkeina Valitse alue -valintaikkunassa. - - TOPIC: OTA ALUE KÄYTTÖÖN/POIS KÄYTÖSTÄ Poista nykyinen alue käytöstä ja säilytä tiedot, jotta se voidaan aktivoida uudelleen myöhemmin (Ota käyttöön -valikko). Tämän avulla voit vaihdella valitun alueen sisäisten muokkausten ja koko kuvan muokkausten välillä. - - TOPIC: KÄÄNNÄ ALUE Käännä olemassa oleva alue: koko kuva valitaan lukuun ottamatta olemassa olevaa aluetta. Toiminnon käyttäminen kahdesti palauttaa alkuperäisen valitun alueen. Valitun alueen kääntäminen mitätöi reunalaskennan, joka on toistettava, jos alueen reunan sekoitusta halutaan. - - TOPIC: TYHJENNÄ ALUE Hylkää nykyinen alue pysyvästi. Tämä on käytettävissä myös painikkeena Valitse alue -valintaikkunassa. - - TOPIC: KOPIOI/LIITÄ ALUE Valittu alue voidaan tallentaa välimuistitiedostoon valikosta Areas > Copy. Tämä alue voidaan liittää samaan tai toiseen kuvaan käyttäen Areas > Paste. Napsauta ja vedä sijoittaaksesi liitetyn alueen. Valintaikkunan säätimillä voidaan skaalata ja kiertää liitettyä aluetta. - - TOPIC: LATAA/TALLENNA ALUE Valittu alue voidaan tallentaa tiedostoon valikosta Areas > Save. Sinua pyydetään antamaan tiedostonimi. PNG-tiedosto luodaan. PNG-tiedostossa on alfakanava läpinäkyvyystietoa varten. Kuva on suorakulmio, joka rajaa valitun alueen. Valitut pikselit ovat läpinäkymättömiä, ja muut läpinäkyviä. - Nämä tiedostot sijaitsevat oletuksena kansiossa /saved_areas, mutta voit tallentaa ne mihin tahansa. Käytä valikkoa Areas > Load ladataksesi tallennetun alueen tiedostosta ja liittääksesi sen nykyiseen kuvatiedostoon. Taustakuva näkyy liitetyn alueen läpinäkyvien osien läpi. Napsauta ja vedä sijoittaaksesi alueen. Valintaikkunan säätimillä voidaan skaalata ja kiertää liitettyä aluetta. - - TOPIC: KUMOA/TEE UUDELLEEN -PAINIKE Jos muokkaustoiminto on aktiivinen ja kuvaa on muutettu: • vasen napsautus kumoaa nykyisen muokkauksen • oikea napsautus tekee muokkauksen uudelleen Tämän avulla voit nopeasti vertailla nykyisen muokkaustoiminnon "ennen" ja "jälkeen" -kuvia. - Jos MIKÄÄN muokkaustoiminto ei ole aktiivinen, mutta nykyiseen kuvaan on tehty muokkauksia: • vasen napsautus kumoaa yhden muokkausvaiheen napsautusta kohden • oikea napsautus tekee uudelleen yhden muokkausvaiheen napsautusta kohden • keskipainikkeen napsautus avaa ponnahdusluettelon kaikista muokkausvaiheista. Voit palata mihin tahansa muokkausvaiheeseen tai alkuperäiseen kuvaan - Jos avaat toisen tiedoston, nykyisen tiedoston tallennetut muokkausvaiheet hylätään. - - TOPIC: MUOKKAUSVALIKKO - - TOPIC: KIERRÄ Suoristaaksesi vinon kuvan, vedä hiirellä kuvan oikeaa tai vasenta puolta ylös tai alas, kunnes kuva näyttää suoralta. Kuvan vasen napsautus lisää pysty- ja vaakasuoria apuviivoja kuvan suoristamisen avuksi. Poista ne oikealla napsautuksella. - [Automaattitaso] -painike voi suoristaa kuvan automaattisesti, jos kamera on tallentanut 'roll angle' -tiedon EXIF-metadataan. [Auto Upright] -painike voi automaattisesti oikaista kuvan, joka on otettu kamera 90° käännettynä, jos 'orientation' on läsnä EXIF-metadatassa. - - TOPIC: OIKAISU Tämä on yhden painikkeen korjaus kuvalle, joka on kierretty 90/180 astetta tai käännetty (peilattu). Resoluutiota ei menetetä, koska pikselit kopioidaan 1:1 uuteen kuva-asetteluun. Katso myös toiminto {ERÄOIKAISU}. - - TOPIC: RAJAA +image: crop-image.jpg +image: crop-buttons.jpg - Leikkaa pois ei-toivotut alueet kuvan reunoilta. Kun valintaikkuna avautuu, kuvan päälle asetetaan valintasuorakulmio. Tämän suorakulmion ulkopuoliset alueet tummennetaan ja edustavat kuvan osia, jotka poistetaan. Vedä mitä tahansa suorakulmion sivua tai kulmaa siirtääksesi kyseistä sivua tai kulmaa. Valintaikkuna näyttää valintasuorakulmion nykyisen leveys/korkeus-suhteen. Jos "Lock" on valittu, sivun tai kulman siirtäminen aiheuttaa toisen sivun tai kulman siirtymisen niin, että kiinteä leveys/korkeus-suhde säilyy. Vedä keskeltä (merkitty pienellä ympyrällä) siirtääksesi koko suorakulmion muuttamatta mittoja. Käytä leveyden ja korkeuden spin-painikkeita säätääksesi kuvan pikselimittoja suoraan, tai syötä halutut arvot. Valintasuorakulmio mukautuu näihin arvoihin. - Käytä näppäimistön nuolinäppäimiä siirtääksesi valintasuorakulmiota 1 pikselin askelin. Nuolinäppäimet siirtävät sitä sivua tai kulmaa, jota viimeksi siirrettiin hiirellä. - [Maks]-painike palauttaa rajaussuorakulmion koko kuvan kokoon. Jos aiempi muokkaus (Kierrä, Väännä ...) on jättänyt läpinäkyviä reunuksia kuvan ympärille, rajaussuorakulmio heijastaa suurinta kokoa, joka mahtuu näiden reunusten sisään. - [Edellinen]-painike hakee luettelon aiemmin käytetyistä leveys- ja korkeusarvoista. Valitse luettelosta käyttääksesi yhtä niistä. - Viisi suhdepainiketta mahdollistavat esiasetetun leveys/korkeus-suhteen valitsemisen. [invert]-painike kääntää nykyisen leveys/korkeus-suhteen. - Voit muuttaa suhdepainikkeita [customize]-painikkeella, joka käynnistää uuden oikealla näkyvän valintaikkunan. Napsauta painiketta muokataksesi sitä. Syötä haluttu leveys-korkeus-suhde muodossa "ww:hh" kuten esimerkissä on näytetty. - - TOPIC: RETUSOI +image: retouch.png - Säädä kuvan kirkkautta ja väriä. • auto black level - aseta mustapiste käyttäen % tummimmista pikseleistä • auto white balance - aseta valkopiste käyttäen % kirkkaimmista pikseleistä • click gray spot for white balance - napsauta harmaata kohtaa kuvassa • click dark spot for black level - napsauta tummaa kohtaa kuvassa • napsauta saadaksesi ponnahtavan RGB-histogrammikaavion • brightness - siirtää 'all'-käyrää ylös tai alas (kaikki värit muuttuvat) • contrast - muuttaa 'all'-käyrän kaltevuutta • color saturation - musta/valkoinen <--> voimakkaat värit • color temperature - valaistuksen tasapaino (lämmin <--> kylmä) - Kun olet tehnyt alkusäädöt liukusäätimillä, voit hienosäätää kirkkautta ja kontrastia muokkaamalla käyriä hiirellä muuttaaksesi, mitkä kuvan osat muuttuvat enemmän tai vähemmän. ALL-käyrä säätää kaikkia värejä, ja 3 RGB-käyrää säätävät yksittäisiä värejä. Käytä ensin ALL-käyrää, ja tee sitten tarkennuksia RGB-käyrillä. - ^Painikkeet Reset - palauttaa kaikki säätimet neutraaliin asentoon - myös kuva palautuu Prev - asettaa kaikki säätimet edellisessä kuvassa käytettyihin arvoihin Done - lopettaa muokkauksen, sulkee valintaikkunan, tallentaa säädinasetukset Cancel - peruuttaa muokkauksen, palauttaa kuvan, sulkee valintaikkunan - Käytä [Edellinen]-painiketta käsitellessäsi useita kuvia, jotka tarvitsevat samanlaisia säätöjä. - - TOPIC: SKAALAA +image: rescale.png - Tämä toiminto muuttaa kuvan koon uuteen pikselileveyteen ja -korkeuteen. Voit syöttää uudet mitat suoraan tai valita prosentuaalisen muutoksen. Painikkeet ovat käytettävissä uuden koon asettamiseksi yksinkertaiseen suhteeseen alkuperäisestä koosta. Jonkin näistä käyttäminen minimoi resoluution menetyksen. [Edellinen]-painike palauttaa edellisen koon, mikä on kätevää, jos useita kuvia asetetaan samaan kokoon. Jos lock ratio -ruutu on valittu, nykyinen leveys/korkeus-suhde säilyy, jos joko leveyttä tai korkeutta muutetaan. - - TOPIC: JAETTU NÄYTTÖ +image: split-screen1.jpg +image: split-screen2.png - Muokkaustoiminnon aikana katsele ennen- ja jälkeen-kuvia jaetun näytön menetelmällä. Vedä rajaviivaa hiirellä. Kun poistut Jaettu näyttö -toiminnosta, voit jatkaa muokkaustoimintoa normaalisti. - Jos mikään muokkaustoiminto ei ole aktiivinen, valitse kaksi kuvaa näytettäväksi jaetulla näytöllä. Niillä on oltava samat pikselimitat. - - TOPIC: NÄYTÄ EROT Muokkaustoiminnon aikana korosta muutokset tummentamalla muuttumattomat alueet. Käytä liukusäädintä säätääksesi muuttumattomien alueiden tummuutta. Kun poistut Näytä erot -toiminnosta, voit jatkaa muokkaustoimintoa normaalisti. - Jos mikään muokkaustoiminto ei ole aktiivinen, valitse kaksi kuvaa niiden erojen korostamiseksi. Niillä on oltava sama pikselikoko. - - TOPIC: MARGINAALIT +image: margins.png - Käytä tätä toimintoa lisätäksesi reunuksia kuvan ympärille. Voit käyttää mitä tahansa väriä ja alfa- (läpinäkyvyys)asetusta reunuksille. Aseta kukin reunus erikseen, tai käytä säätimiä 'All±1' ja 'All±10' säätääksesi kaikkia reunuksia ylös tai alas saman verran, 1 tai 10 pikseliä. Käytä hiiren rullaa tai nuoli ylös/alas -näppäimiä nopeuttamiseen. - Voit käyttää tätä toimintoa lisätäksesi reunuksia kuviin, joita aiot vääristää, estääksesi joidenkin alueiden putoamisen reunojen yli. - - TOPIC: MERKINTÄ +image: markup.jpg - Tämä on valikko, joka sisältää kuvan merkintätoiminnot: piirrä teksti, piirrä viiva/nuoli, piirrä laatikko, piirrä soikio Kaikissa näissä toiminnoissa on [commit]-painike, joka vahvistaa nykyisen muokkauksen ja antaa aloittaa uuden (uusi teksti/viiva/laatikko/soikio) samassa muokkausvalintaikkunassa. - ^Piirrä teksti Tämä toiminto piirtää tekstiä suoraan kuvaan. Syötä teksti valintaikkunaan. Useita rivejä voidaan käyttää. Kun olet syöttänyt tekstin, napsauta hiirtä vasemmalla kohtaan, johon haluat tekstin kuvassa. Vedä siirtääksesi tekstiä muualle. Napsauta oikealla poistaaksesi tekstin. Käytä [Fontti]-painiketta valitaksesi toisen fontin. Käytä [Koko]-säädintä suurentaaksesi tai pienentääksesi tekstin kokoa. Käytä [Kulma]-säädintä muuttaaksesi tekstin kallistuskulmaa. Muut säätimet mahdollistavat taustavärin antamisen tekstin ympärille, tekstin ääriviivavärin ja varjostustehosteen. Voit valita värin ja läpinäkyvyyden kaikille näistä. Leveyssäädin säätää ääriviivojen ja varjojen leveyttä. Varjon kulmasäädin asettaa varjon kulman. Käytä kohokuviosäätimiä antaaksesi tekstille 3D-ilmeen. - Voit alustaa tekstin mistä tahansa kuvatiedoston saatavilla olevasta metadatasta. Syötä metadatatagi (esim. "user comments") ja paina [Nouda]. Voit lyhentää tagien nimiä, esim. "usercomments" muodon "User Comments" sijaan. - [Avaa]- ja [Tallenna]-painikkeet käynnistävät tiedostonvalintaikkunan, jolla voit ladata tai tallentaa kaiken tekstidatan tiedostosta tai tiedostoon. Kaikki valintaikkunan kohteet ladataan tai tallennetaan, joten voit pitää kokoelman usein käytettyjä tekstijonoja ja asetuksia. - Alaosan painikkeet toimivat seuraavasti: • Clear - tyhjentää teksti- ja metadatakentät • Replace - kuva, johon on lisätty teksti, korvaa nykyisen kuvan • +Version - kuva, johon on lisätty teksti, tallennetaan uutena versiona • Next - avaa seuraavan tiedoston, sijoittaa saman tekstin samaan kohtaan • Apply - vahvistaa nykyisen muokkauksen ja nollaa uutta tekstisyötettä varten • Done - viimeistelee nykyisen muokkauksen - kuva on valmis tallennettavaksi • Cancel - hylkää nykyisen muokkauksen - Lisätäksesi saman tekstin kuvasarjaan: valmistele ja sijoita teksti, paina [Korvaa] tai [+Version], sitten [Seuraava], sitten [Korvaa] tai [+Version], sitten [Seuraava] ... - Tee vesileima: Käytä vähintään 70 %:n tekstin läpinäkyvyyttä ja 100 %:n taustan läpinäkyvyyttä. Tekstin tulisi olla heikosti luettavissa. Käytä kohokuviosäätimiä saadaksesi tekstin näyttämään uponneelta kuvaan. - ^Piirrä viiva Tämä toiminto piirtää viivoja tai nuolia suoraan kuvaan. Syötä viivan pituus ja leveys valintaikkunaan, ja valitse nuolenkärki, jos haluat. Napsauta hiirtä vasemmalla kohtaan, johon haluat sijoittaa sen kuvassa. Vedä viivan/nuolen päitä sijoittaaksesi sen kuvaan. Napsauta oikealla poistaaksesi sen. Vedä viivan keskeltä siirtääksesi sitä muuttamatta kulmaa tai pituutta. Valintaikkunan säätimet mahdollistavat taustavärin, ääriviivavärin ja varjostustehosteen antamisen. Voit valita värin ja läpinäkyvyyden kaikille näistä. Leveyssäädin säätää ääriviivojen ja varjojen leveyttä. Varjon kulmasäädin asettaa varjon kallistuskulman. Säilyttääksesi piirretyn viivan ja aloittaaksesi toisen, paina [käytä]. - ^Piirrä laatikko Valitse väri ja leveys laatikon ääriviivalle. Aseta kohdistin kohtaan, johon haluat laatikon kulman, ja vedä avataksesi laatikon haluttuun suuntaan. Korvataksesi laatikon, vedä uudelleen. Siirtääksesi laatikkoa, pidä shift-näppäintä pohjassa ja vedä laatikkoa keskeltä. Siirtääksesi yhtä reunoista, pidä shift-näppäintä pohjassa ja vedä reunaa. Säilyttääksesi piirretyn laatikon ja aloittaaksesi toisen, paina [käytä]. - ^Piirrä soikio Valitse joko soikio (ellipsi) tai ympyrä -valintaruutu. Valitse väri ja leveys ääriviivalle. Aseta kohdistin haluttuun keskipisteeseen. Vedä piirtääksesi soikion/ympyrän. Vedon kulma määrittää soikion muodon, ympyrästä äärimmäiseen ellipsiin, leveään tai korkeaan. Korvataksesi soikion/ympyrän, vedä uudelleen. Siirtääksesi soikiota/ympyrää, pidä shift-näppäintä pohjassa ja vedä keskeltä. Muuttaaksesi kokoa tai muotoa, pidä shift-näppäintä pohjassa ja vedä alaoikealta reunalta. Säilyttääksesi piirretyn soikion/ympyrän ja aloittaaksesi toisen, paina [käytä]. Soikiolle voit syöttää kulman 0-90 astetta kallistetuille akseleille, kuten esimerkissä. - - TOPIC: VÄRITILA +image: color-mode.png +image: color-mode2.jpg - Käytä tätä toimintoa tehdäksesi mustavalkoisen tai värillisen negatiivin, muuntaaksesi negatiivikuvan positiiviseksi kuvaksi, tai muuntaaksesi seepiavärjäykseksi (vanhentuneen valokuvan tehosteeksi). Liukusäädintä voidaan käyttää tehosteen soveltamiseen asteittain, 0 %:sta 100 %:iin. - - TOPIC: MAALAUSMUOKKAUKSET Käytä tätä toimintoa yhdessä jonkin toisen muokkaustoiminnon kanssa. Käynnistä muokkaustoiminto ja jätä säätimet neutraaliin asentoon. Käynnistä sitten Maalaa muokkauksia. Maalaa muokkaustoiminto halutulla alueella hiirellä. Katso {MOUSE PAINTING} kuinka muokkauksia sovelletaan paikallisesti hiirellä. - Tämä menetelmä muokkausten asteittaiseen "maalaamiseen" voi parantaa kuvan valittuja alueita nopeasti ja helposti. Se toimii seuraavien muokkaustoimintojen kanssa: • Muokkaa > Retusointi, Väritila • Korjaa > Terävöinti, Sumennus, Kohinanpoisto, Poista sumu, Säädä RGB, Säädä HSL • Hienosäätö > Tasoita histogrammi, Paikallinen kontrasti, Voimista kontrastia, Paikallinen Retinex, Kylläisyys, Pehmeä fokus • Tehosteet > Ääriviivat, Luonnos2, Kohokuviointi, Tekstuuri, Lisää kiilto, Aseta värit, Siirrä värejä, Mukautettu ydin - - TOPIC: MAALAA KUVA +image: paint-image.jpg - Tämä toiminto maalaa kuvan päälle valituilla väreillä hiirellä. Katso {MOUSE PAINTING} kuinka muokkauksia sovelletaan paikallisesti hiirellä. - Paint Color -painike näyttää nykyisen värin. Napsauta tätä painiketta valitaksesi värin vakiomuotoisella Gnomen värinvalintaikkunalla. Voit myös tehdä shift + vasen napsautus kuvassa valitaksesi värin kuvasta. - Paletti-painike avaa keskellä näkyvän valintaikkunan. Napsauta kuvaa valitaksesi värin kyseisestä kohdasta. Valittu väri näkyy päävalintaikkunan väripainikkeessa. Yllä näkyvä kuva on oletusarvo. Voit käyttää mitä tahansa kuvaa värilähteenä. Paina [selaa]-painiketta ja valitse kuva, johon olet tallentanut värejä muistiin haettavaksi. Tämä valinta pysyy voimassa, kunnes se muutetaan. - HSL-painike avaa oikealla näkyvän HSL-värinvalitsimen. Tämä valintaikkuna voi esittää minkä tahansa mahdollisen värin. Siirrä liukusäätimiä saadaksesi haluamasi värin. Valittu väri näkyy päävalintaikkunan väripainikkeessa. - Jos paint over transparent areas on valittu, läpinäkyvien alueiden yli maalaaminen vähentää tai poistaa läpinäkyvyyden peittävyyssäätimien mukaan. Jos tätä vaihtoehtoa ei ole valittu, vain kuvan läpinäkymättömät alueet maalataan. - ^Wacom-piirtopöydän käyttö Maalaa kuvaa -toiminnossa voit käyttää Wacom-piirtopöytää hiiren sijaan. Kynän vetäminen kosketuksissa piirtopöydän pintaan maalaa kuten yllä on kuvattu. Jos jotakin kynän painikkeista pidetään pohjassa vedettäessä, toiminto on pyyhkiminen maalaamisen sijaan. Voit myös asettaa maalaus- tai pyyhkimistilan valintaikkunan valintanapeilla. Kynän painikkeen pitäminen pohjassa on hankalaa, minkä vuoksi valintanapit ovat olemassa. Painetta lisäämällä kynään peittävyys kasvaa, joten voit tehdä vaaleampia ja tummempia vetoja säätämättä peittävyyssäätimiä. - - TOPIC: MAALAA LÄPINÄKYVYYS +image: paint-transp.png +image: paint-transp2.jpg - Maalaa läpinäkyviä tai puoliläpinäkyviä alueita kuvaan. Katso {MOUSE PAINTING} kuinka muokkauksia sovelletaan paikallisesti hiirellä. - - TOPIC: ALUEEN TÄYTTÖ Täytä kaikki valitut alueet tai kaikki läpinäkyvät alueet valitulla peitevärillä. Jos alue on osittain läpinäkyvä, peiteväri korvaa kuvan läpinäkyvän osan. 'Blend'-liukusäädintä voidaan käyttää valitsemaan mikä tahansa sekoitus alkuperäistä kuvaa ja peiteväriä. - - TOPIC: KOPIOI KUVASSA Maalaa kuvan alueiden yli kopioimalla saman kuvan muualta. Tätä menetelmää voidaan käyttää kuvan sisäisten kohteiden monistamiseen, tai ei-toivotun kohteen poistamiseen korvaamalla se muualta otetulla taustalla. Napsauta kuvaa vasemmalla valitaksesi lähdesijainnin, ja napsauta sitten oikealla valitaksesi vastaavan kohteen. Katso {MOUSE PAINTING} kuinka muokkauksia sovelletaan paikallisesti hiirellä. - Jos paint over transparent areas on valittu, läpinäkyvien alueiden yli maalaaminen vähentää tai poistaa läpinäkyvyyden. Jos tätä vaihtoehtoa ei ole valittu, vain kuvan läpinäkymättömät alueet maalataan. - - TOPIC: KOPIOI KUVASTA Maalaa kuvan alueiden yli kopioimalla toisesta kuvasta. Kohdekuvaa 'maalataan' vetämällä hiirtä muokattavan alueen yli. Aiemmin valittu sijainti lähdekuvassa kopioidaan kohdekuvaan. Sekä kopioitava alue että maalattava alue ovat ympyröiden sisällä, jotka liikkuvat hiiren mukana. Yllä olevassa esimerkissä oikeanpuoleisen kuvan vene kopioitiin vasemmanpuoleiseen kuvaan. - Aloita avaamalla kohdekuva. Valitse valikko 'Copy From Image'. Toinen Fotocx-istunto käynnistyy näyttäen saman kuvan. Siirry tässä toisessa istunnossa lähdekuvaan ja avaa se. Järjestä molemmat ikkunat niin, että näet molemmat (ainakin kopioitavat alueet). Tee shift + vasen napsautus lähdekuvassa määrittääksesi lähdesijainnin. Tee shift + vasen napsautus kohdekuvassa kohdesijainnissa. - Vedä hiirtä vasemmalla kohdekuvan alueen yli. Pikselit lähdekuvasta kopioidaan kohdekuvaan. Zoomaa kuvat maksimikokoon, jos viitesijainneille tarvitaan suurta tarkkuutta. Alkuperäinen viitesijainti on (0,0) (luoteiskulma) molemmissa kuvissa. Katso {MOUSE PAINTING} kuinka muokkauksia sovelletaan paikallisesti hiirellä. - Lähdekuvan skaala-arvoa käytetään lähdekuvan skaalaamiseen kohdekuvaan. Aloita tekemällä koekopio tarkistaaksesi skaalan. Jos se on liian iso tai liian pieni, käytä [undo all] poistaaksesi kokeilun, muuta skaala-arvoa ja yritä uudelleen. - Jos paint over transparent areas on valittu, läpinäkyvien alueiden yli maalaaminen vähentää tai poistaa läpinäkyvyyden hiiren peittävyyssäätimien mukaan. Jos tätä vaihtoehtoa ei ole valittu, vain kuvan läpinäkymättömät alueet maalataan. - - TOPIC: KOPIOI EDELLINEN MUOKKAUS Edellisen muokkausvaiheen kuva voidaan soveltaa nykyiseen kuvaan paikallisesti ja asteittain "maalaamalla" hiirellä. Edellisen muokkauksen on oltava jokin niistä muokkauksista, jotka on tehty nykyiseen kuvaan sen ollessa vielä avoinna - tallentamattomat muokkaukset menetetään, kun uusi kuva avataan. Voit soveltaa mitä tahansa aiempaa muokkausta mihin tahansa muokattavan nykyisen kuvan alueeseen niin kauan kuin kuva pysyy avoinna nykyisenä kuvana. Valitse aiempi muokkaus pudotusvalikosta, joka näyttää kaikki nykyiseen kuvaan tehdyt aiemmat muokkausvaiheet järjestyksessä, tunnistettuna käytetyn muokkaustoiminnon mukaan. Katso {MOUSE PAINTING} kuinka muokkauksia sovelletaan paikallisesti hiirellä. - - TOPIC: KORJAUSVALIKKO - - TOPIC: TERÄVÖITÄ +image: sharpen.png - Tässä toiminnossa on viisi menetelmää sumean kuvan terävöittämiseen, ja yksi menetelmä kameran tai kohteen liikkeestä valotuksen aikana johtuvan liike-epäterävyyden terävöittämiseen. - Valitse menetelmä, aseta parametrit, paina [käytä] ja odota muutama sekunti nähdäksesi tuloksen. Tee muutoksia ja toista prosessi, kunnes olet tyytyväinen. Käytä {VALITSE ALUE} käsitelläksesi kuvan eri osia eri menetelmillä ja parametreilla. - Kaikissa menetelmissä valitse pieni säde kuville, jotka ovat vain hieman sumeita, ja suurempi arvo huonommille kuville. Amount säätelee muutoksen voimakkuutta. Threshold vaimentaa muutoksia matalakontrastisiin pikseleihin: suurempi arvo vähentää matalan tason epäsäännöllisyyksien (kuvan kohina, epätasainen ihonväri jne.) vahvistumista. - Unsharp mask: klassinen menetelmä, joka löytyy useimmista kuvaeditoreista. Tekninen kuvaus löytyy internet-haulla. Tämä menetelmä voi tehdä 'haloja' näkyviksi korkeakontrastisten reunojen ympärille. - Amplify Contrast: voimistaa olemassa olevaa kontrastia. Tehokkuus on verrattavissa unsharp maskiin, mutta 'halot' vähenevät. - Kuwahara: kunkin pikselin ympärillä olevia pieniä naapurustoja verrataan toisiinsa. Pikselille annetaan sen naapuruston keskiarvoväri, jolla on pienin ero. Tämä pakottaa sumean reunan pikselit vastaamaan jompaakumpaa reunan puolta. Reunoista tulee hyvin teräviä. Kuva voi näyttää 'lohkomaiselta', jos käytetään suurta sädettä. Hienovaraisia yksityiskohtia voi kadota. - Median diff: pikselin kirkkautta verrataan säteen sisällä olevien pikselien mediaaniin. Kirkkautta lisätään tai vähennetään pikseleille, jotka ovat vastaavasti kirkkaampia tai tummempia kuin naapuruston keskiarvo. Tehokkuus on verrattavissa unsharp maskiin, mutta 'halot' vähenevät huomattavasti. Tämä on ainoa menetelmä, joka toimii kullekin RGB-värille erikseen. Se voi terävöittää värisiirtymän, vaikka kirkkausmuutos olisi pieni. - Richardson-Lucy: kuva terävöitetään Richardson-Lucy-dekonvoluutiomenetelmällä. Tämä menetelmä voi tuottaa parhaat tulokset, mutta on myös melko hidas. Nopeuttaaksesi toimintaa, aloita valitsemalla pieni mutta yksityiskohtainen kuvan alue toiminnolla {VALITSE ALUE}. Etsi optimaalinen säde ja iteraatioiden määrä tällä pienellä alueella. Käytä sitten samoja asetuksia koko kuvaan. Kuvan kohina heikentää tehokkuutta. Jos näin on, käytä {POISTA KOHINA} ensin. - Kuva, joka on suurennettu tarkalleen 2x, voidaan terävöittää Richardson-Lucy-menetelmällä käyttäen sädettä 2.0 ja vähintään 4 iteraatiota. Tulokset ovat huomattavan hyviä. - ^Korjaa liike-epäterävyys +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - Optimoi käsin kuvia, joissa on lievää epäterävyyttä kameran tai kohteen liikkeestä. Muuten terävässä kuvassa liikkuvasta kohteesta johtuvaa epäterävyyttä voidaan käsitellä toiminnolla {VALITSE ALUE} kohteen eristämiseksi. Epäterävyyden oletetaan olevan lineaarista ja tasanopeuksista. Syötteet ovat 'blur span' pikseleinä ja 'blur angle' asteina. Alustava kulma-arvio voidaan määrittää shift + hiiren vedolla kuvan yli epäterävyyden suuntaan (voi olla sama tai vastakkainen kuin todellinen liike). Syötä arvio epäterävyyden laajuudesta käyttämällä Työkalut > Näytä RGB mittaamaan epäterävyyden leveyttä jonkin kirkkaan kuvakohteen reunaa pitkin. Säädä syötteitä, paina [käytä] ja tarkasta kuva löytääksesi optimaaliset asetukset. Vasteaika voi olla hidas suurelle kuvalle. Voit nopeuttaa prosessia käyttämällä {VALITSE ALUE} valitaksesi pienen epäterävän alueen laajuuden ja kulman optimoimiseksi, ja sitten tyhjentämällä alueen käsitelläksesi koko kuvaa samoilla asetuksilla. Algoritmi saattaa tuottaa "soivaa" kohinaa, jota voidaan vaimentaa syötteellä 'suppress ringing'. Parhaiten toimii, kun suppress-arvo jätetään matalaksi optimaalisen laajuuden ja kulman löytämiseksi, ja lisätään sitten vaimennusta tarpeen mukaan soinnin vähentämiseksi. Richardson-Lucy-dekonvoluutiomenetelmää käytetään yhdessä ulottuvuudessa. - ^Digitaalikameran liike-epäterävyys Kaikilla epäterävillä valokuvilla ei ole tasanopeuksista epäterävyyttä, joka sopii parhaiten tälle menetelmälle. Kuva voi olla useamman lyhyemmän valotuksen päällekkäisasettelu. Koko kuvaa ei ehkä valoteta samaan aikaan eikä sillä ole samaa epäterävyyttä (mekaaninen tai elektroninen liikkuva suljin). Tämä menetelmä voi silti tuottaa parempia tuloksia kuin kaksiulotteisesti toimivat terävöitystyökalut. Sen pitäisi toimia paremmin vanhoissa filmikameralla otetuissa valokuvissa, joissa liike-epäterävyys on lähempänä tasanopeuksista. - - TOPIC: SUMENNUS +image: blur.jpg - Valitse menetelmä vastaavalla valintaruudulla, syötä vaaditut parametrit, paina [käytä]. Jos {VALITSE ALUE} on aktiivinen, vain valitut alueet vaikuttuvat. - ^Normaali sumennus Sekoita kukin pikseli säteen sisällä olevien ympäröivien pikselien kanssa. Lähempänä olevilla pikseleillä on suurempi paino. Voit asettaa säteeksi 1 ja painaa [käytä] toistuvasti lisätäksesi sumennusta hitaasti samalla, kun tarkkailet kuvan tulosta. - Voit valinnaisesti sumentaa eri määriä vaaka- ja pystysuunnassa, jos syötät erilliset vaaka- ja pystyarvot. [säde]-syöte pakottaa samat arvot molemmille. - ^Säteittäinen sumennus Sekoita kukin pikseli valitusta keskipisteestä lähtevän viivan pikselien kanssa. Radius määrittää keskialueen, jota ei sumenneta. Length asettaa sumennusviivan alueen: 0:sta length-arvoon, keskeltä reunaan. Valitse keskipiste napsauttamalla kuvaa. - ^Suunnattu sumennus Vedä kohtaa kuvassa hiirellä. Hiiren ympärillä oleva alue sumennetaan tähän suuntaan. Span määrittää sumennetun alueen koon. Intensity määrittää sumennuksen voimakkuuden. - ^Asteittainen sumennus Vain pikselit, joiden kontrasti on pienempi kuin annettu kontrastiraja, sumennetaan, ja sumennuksen säde vaihtelee 1:stä annettuun arvoon pikseleille, joiden vastaava kontrasti vaihtelee annetusta rajasta nollaan. Lyhyesti: matalakontrastisia pikseleitä sumennetaan enemmän kuin korkeakontrastisia pikseleitä. Tätä voidaan käyttää ihonsävyjen tasoittamiseen sumentamatta hiuksia tai vähentämättä silmien kiiltoa. Äärimmilleen vietynä se tuottaa "sarjakuva"-tehosteen. - ^Taustan sumennus (bokeh) Sumenna taustan kuva-alueet jättäen etuala terävänä. Valitse yksi tai useampi alue, joiden tulee pysyä terävinä {VALITSE ALUE}. Kun olet valinnut etualan alueet, käännä valinta niin, että tausta on nyt valittu {KÄÄNNÄ ALUE}. Tämä on alue, joka sumennetaan. Käytettävissä on kaksi sumennusmenetelmää: Constant blur: kaikille sumennettaville alueille käytetään vakiosumennussädettä. Increase blur with distance: käytä pienintä sumennussädettä etualaa lähinnä oleville pikseleille ja suurinta sumennussädettä pikseleille, jotka ovat kauimpana etualasta. Tämä vaatii kaikkien taustapikselien reunaetäisyyden laskemisen, mikä voi kestää huomattavan ajan. Sumennussädettä voidaan vaihdella laskematta reunaetäisyyksiä uudelleen. - - TOPIC: POISTA KOHINA +image: denoise.jpg - Vähennä kohinaa valokuvissa, jotka on otettu heikossa valaistuksessa (korkea ISO), mikä saa tasaiset pinnat näyttämään pilkulliselta. Kaksi menetelmää on käytettävissä, Median ja Smooth. Paras menetelmä vaihtelee kohinan ja kuvan ominaisuuksien mukaan. Menetelmien sekoittaminen (yhden käyttäminen ja sitten toisen) voi olla hyödyllistä. Radius-arvo määrittää pikselinaapuruston, jota käytetään tietyn pikselin vertailuun ja säätöön. Suuri arvo (Radius > 2) vähentää kohinaa tehokkaammin, mutta voi myös aiheuttaa yksityiskohtien katoamista. Raja-arvo aiheuttaa sen, että pikselit, joiden RGB-kirkkausarvot poikkeavat naapuruston mediaanista enemmän kuin tämän verran, jätetään huomiotta. Tämä on tarpeen joillekin kuville estämään pienten kirkkaiden yksityiskohtien käsittelyn kohinana - esim. tähtitieteelliset valokuvat. - Aseta Radius-arvo ja paina yhtä menetelmäpainikkeista. Jokainen iteraatio käyttää edellistä kuvaa lähtökohtana, joten useat iteraatiot vaimentavat asteittain kohinaa ja saattavat sumentaa joitakin yksityiskohtia. Käytä [nollaa] aloittaaksesi alusta. Median säteellä 1, jota seuraa Median säteellä 2, on hyvä kompromissi kohinan vaimentamisen ja yksityiskohtien säilyttämisen välillä. - Areas-liukusäädintä voidaan käyttää rajoittamaan käsittely vain tummiin alueisiin, tai laajempaan alueiden joukkoon. Tummilla alueilla on yleensä enemmän kohinaongelmia kuin vaaleilla alueilla. - Jos näet pieniä kohinapilkkuja, jotka säilyvät, kasvata raja-arvoa, käytä [nollaa]-painiketta ja jatka [mediaani]- tai [pehmeä]-toiminnolla. - Voit soveltaa eri käsittelyä kuvan eri alueilla - katso {VALITSE ALUE}, ja voit "maalata" kuvaa käyttäen eri käsittelyä eri alueilla - katso {MAALAUSMUOKKAUKSET}. - Kutakin RGB-väriä käsitellään erikseen. Kromaa tai vaaleutta ei käsitellä erikseen. - [measure]-painike käynnistää oikealla olevan valintaikkunan todellisen kuvan kohinatason mittaamiseksi. Siirrä hiirtä kuvan yli näyttääksesi RGB-kohinatasot hiiriympyrän sisällä (säde 10, noin 300 pikseliä). Tämän täytyy olla piirteetön alue, jotta kohina on ainoa läsnä oleva vaihtelu. Tarkasta kuva 4X-koossa varmistaaksesi, että näet kohinaa etkä tekstuuria. Pisteet näyttävät yksittäiset pikselien RGB-arvot suhteessa ympäröivien 5x5 pikselin keskiarvoon, jota edustaa keskellä oleva yhtenäinen viiva. Alaosan numerot näyttävät keskimääräisen RGB-kirkkauden ja kohinatasot asteikolla 0-255. Kaavion asteikko on -10:stä +10:een ja pisteviivat ovat kohdissa -5 ja +5, suhteessa kokonaisalueeseen 0-255. Kohina 9. tai 10. RGB-bitissä on 0,5 tai 0,25 tällä asteikolla. - ^RAW-kuvan kohina Mitataksesi kameran anturin kohinaa, käytä RAW-kuvaa. JPEG-kuvat käsitellään kameran sisällä kohinan vähentämiseksi. Saatat yllättyä RAW-kuvien tyypillisen korkeista kohinatasoista. Jopa kalliilla kameroilla, joissa on suuret anturit, voi olla alle 8 bittiä matalakohinaista väriä. Kun suodatat kohinaa RAW-kuvasta, kilpailet elektroniikkaa ja ohjelmistoa vastaan, joka tuottaa kameran JPEG:in. Voi olla haastavaa tehdä sitä paremmin. - - TOPIC: POISTA SUMU +image: defog.png +image: defog2.jpg - Poista sumu/utu kuvasta tai valitusta alueesta. Tähän on olemassa muitakin työkaluja (tasoita histogrammi, paikallinen kontrasti, voimista kontrastia, retinex, kylläisyys), mutta sumun/udun poisto on niiden ensisijaiseen toimintoon nähden toissijainen. Tämä toiminto käsittelee sumua/utua suoraan: se poistaa yhtä suuret määrät R/G/B-väriä (vähentäen kirkkautta ja lisäten kylläisyyttä), ja lisää valinnaisesti menetetyn kirkkauden takaisin. Se voi myös vähentää sinistä, jos siitä tulee liian hallitseva, kuten usein tapahtuu kaukaisen udun kanssa. Saatat tarvita toimintoa {VALITSE ALUE} tai {MAALAUSMUOKKAUKSET} kohdistaaksesi ja optimoidaksesi halutut alueet tarkasti. Yllä olevassa esimerkissä käytettiin kahta aluetta, etualan kukkuloita ja taustan vuorta. - - TOPIC: PUNASILMÄT +image: red-eyes1.png +image: red-eyes2.png - Vähennä punasilmäisyystehostetta salamakuvista. Kaksi menetelmää on käytettävissä. Ensimmäinen on nopeampi, mutta ei ehkä käsittele vaikeita tapauksia. Toinen menetelmä on vankempi, mutta vaatii myös enemmän aikaa ja huolellisuutta. Käyttääksesi ensimmäistä toimintoa, napsauta punasilmää vasemmalla kerran tai useamman kerran, kunnes olet tyytyväinen. Jos tummennettu alue on liian pieni tai epäkeskinen, napsauta oikealla kumotaksesi muutoksen ja napsauta sitten vasemmalla tarkemmin punasilmän keskelle. Jos punasilmää ei voida korjata oikein, napsauta oikealla kumotaksesi muutoksen ja käytä sitten toista menetelmää. Toinen menetelmä voi käsitellä paremmin vaikeampia tapauksia, joissa punasilmä on vain hieman punainen ja värierotus silmäluomiin on liian pieni automaattisen algoritmin erottamiseksi. Aseta kohdistin punasilmän keskelle. Pidä hiiren vasenta painiketta pohjassa ja vedä kohdistinta alas ja oikealle. Pisteviivainen ellipsi ilmestyy ympäröimään punasilmää. Toista tarvittaessa saadaksesi punasilmän suunnilleen ellipsin keskelle. Huomaa, että ellipsin muoto riippuu vedon suunnasta, mikä voi mahdollistaa tarkemman vain punasilmän ympäröinnin. Napsauta ellipsin sisällä vasemmalla toistuvasti samalla kun tarkkailet punasilmän tummumista, ja pysähdy, kun se on tarpeeksi tumma. Jos menet liian pitkälle, silmäluomet saattavat alkaa tummua. Napsauta oikealla kumotaksesi ja toista tarvittaessa. - - TOPIC: ÄLYKÄS POISTO +image: smart-erase.png +image: smart-erase2.jpg - Poista pieniä kohteita, jotka voivat pilata hyvän valokuvan, kuten sähkölinjoja, maassa olevaa roskaa, kylttejä jne. Ei-toivottu kohde korvataan ympäröivältä alueelta otetuilla pikseleillä. Tämä on joskus erittäin tehokasta (sivuvaikutukset lähes näkymättömiä), joskus ei. Se toimii parhaiten pienille tai kapeille kohteille valokuvassa. Radius säätelee hiiren osoittimen ympärillä olevan ympyrän kokoa, joka määrittää valittavan ja poistettavan alueen. Vedä hiirtä ympäröidäksesi poistettava kohde. Vasen veto valitsee ja oikea veto poistaa valinnan. Paina [Pyyhi] poistaaksesi valitun alueen, korvaten pikselit lähimmillä pikseleillä valinnan ulkopuolelta. Jos valinta ei ollut tarpeeksi tarkka, käytä [Kumoa], säädä valittua aluetta, ja [Pyyhi] uudelleen. Toistuvat valinnat ja poistot kertyvät, kunnes käytät [New_Area] uuden valinnan aloittamiseksi. Aiemmat poistetut alueet ovat nyt kiinteitä, ja [Kumoa] toimii vain seuraaville valinnoille. On parasta työskennellä kuvan ollessa zoomattu 200 %:iin tai enemmän. Blur-säädin lisää sumennusta korvaaviin pikseleihin. Tämä voi vähentää näkyviä sivuvaikutuksia, koska korvaavat pikselit voivat olla terävämpiä kuin ympäristö. Muuta Blur-asetusta ja toista [Pyyhi]-painike. [show]- ja [hide]-painikkeita voidaan käyttää näyttämään nykyisen valinnan ääriviiva tai piilottamaan se tulosten paremman arvioimiseksi poiston jälkeen. - Pitkille kapeille kohteille (esim. sähkölinjat) voit napsauttaa kahta kohtaa, ja kaikki niiden välissä oleva valitaan. Valinta toimii suorassa linjassa, joten kaartuvien kohteiden kohdalla sinun täytyy napsauttaa väliajoin seurataksesi kaarta. - - TOPIC: POISTA HALO +image: remove-halo.png +image: remove-halo2.png - Poista joidenkin muokkaustoimintojen jättämiä haloja. Valitse halon tyyppi: kirkas (yleisin) tai tumma. Vedä hiirtä vasemmalla halon alueen yli muuttaaksesi hiiren sisällä olevia pikseleitä, kuten esimerkissä näytetään. Kirkkaalle halolle kirkkaimmat pikselit tummuvat, kun hiirtä vedetään niiden yli. Tummalle halolle tummimmat pikselit kirkastuvat. Käytä halon leveyttä suurempaa hiiren sädettä, kuten esimerkissä näytetään. Vedä hiirtä oikealla palauttaaksesi alkuperäiset pikselit. - - TOPIC: JPEG-ARTEFAKTIT +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - Voimakkaasti pakatuissa JPEG-kuvissa (matalalla laatuasetuksella) voi näkyä pakkausartefakteja pienten suorakulmaisten lohkojen muodossa. Jos valokuvan joidenkin alueiden kirkkausaluetta on laajennettu, tällaiset lohkot voivat tulla näkyvämmiksi, koska kirkkausaskeleet ovat suurempia (esim. RGB-arvot 11/12/13 kirkastettuna 5x arvoiksi 55/60/65). Tämä toiminto sumentaa lohkojen väliset rajat tehden ne vähemmän näkyviksi. - 'Match Limit' määrittää, milloin vierekkäisiä pikseleitä käsitellään saman pikselilohkon jäseninä. Match Limit voidaan asettaa pienemmäksi, jotta tällaiset lohkot kartoitetaan täydellisemmin. 'Contrast Limit' estää reunojen sekoittumisen kohdissa, joissa kontrasti on korkea, mikä aiheuttaisi yksityiskohtien katoamisen. Muuta molempia asetuksia ja paina [käytä]. Katso tuloskuvaa yli 2x koossa ja kokeile eri asetuksia, jos optimointi on tärkeää. Tämä toiminto on vähemmän tehokas kuvalle, jonka kokoa on muutettu. Käytä {VALITSE ALUE} käsitelläksesi ongelma-alueita valikoivasti. - - TOPIC: REUNANPEHMENNYS +image: anti-alias.jpg - Joskus valokuvissa näkyy pikselöitymistä ('sahalaitaisuutta') joidenkin korkeakontrastisten kohteiden reunoilla. Yllä olevassa esimerkissä tämän näkee linnun silmän ympärillä. Reunan pehmennys -työkalu voi vähentää tätä. Vaikutus on vähäinen useimmissa valokuvissa, joissa kameran sisäinen käsittely on saattanut jo hoitaa ongelman. Toissijainen vaikutus on, että voimakkaasti pakattujen kuvien jpeg-artefaktit tasoittuvat jonkin verran. Kuvilla, joiden kokoa on suurennettu, on näkyvämpää pikselöitymistä. Näitä voidaan auttaa, erityisesti 2x-suurennuksen tapauksessa. - Käytä [käytä]-painiketta pikselien vaimentamiseen, useita kertoja, jos se näyttää auttavan. 'Threshold' voidaan käyttää matalakontrastisten pikselien sulkemiseen pois käsittelystä. Arvo 0,1 tai vähemmän on yleensä paras. - Fotocx käyttää Scale3x-algoritmia, muokattuna käyttämään "samankaltaisia" ja "erilaisia" värisävyjä "yhtäläisten" ja "erilaisten" sijaan. - - TOPIC: SÄÄDÄ RGB +image: adjust-RGB.png - Muuta yleistä kirkkautta ja kontrastia, tai valittujen värien kirkkautta ja kontrastia. • Brightness - lisää tai vähennä kuvan yleistä kirkkautta • +Red -Cyan jne. - muuttaa värin kirkkautta ja muuttaa vastaväriä vastakkaiseen suuntaan • Contrast All - lisää tai vähentää kuvan yleistä kontrastia • Contrast Red Green Blue - käsittelee yksittäisiä RGB-värejä - - TOPIC: SÄÄDÄ HSL +image: adjust-HSL.png - Muuta valittua värialuetta kuvassa käyttäen HSL-mallia (Hue, Saturation, Lightness - sävy, kylläisyys, vaaleus). Tätä toimintoa voidaan käyttää värivirheen korjaamiseen tai yhden värin muuttamiseen toiseksi (esim. ylivalottunut taivas - liian valkoinen). Jos et tunne HSL-värimallia, lue siitä Wikipedia-artikkeli. - Aloita valitsemalla kohdeväri kuvasta täsmäystä ja säätöä varten, käyttäen shift + vasen napsautus kuvassa. Tästä väristä tulee säätöön valittavan värialueen keskipiste. Valitse, mitkä väriominaisuudet täsmäytetään käyttäen hue-, saturation- ja lightness-valintaruutuja. Kukin näistä kaventaa valittujen värien aluetta. Jos yhtäkään ei ole valittu, kaikki värit valitaan. Match Level -arvoa voidaan käyttää valittujen värien alueen edelleen laajentamiseen. 100 % tarkoittaa, että vain läheisesti täsmäävät värit valitaan. - Lähtövärin säätimillä (sävy, kylläisyys, vaaleus) asetetaan uusi lähtöväri, joka korvaa valitut tulovärit tai sekoittuu niihin. Voit myös asettaa tämän värin kuvasta käyttämällä yhdistelmää shift + hiiren oikea painike. Tuloksena oleva väri on sekoitus alkuperäisestä ja uudesta väristä. Uuden värin osuus asetetaan Adjustment-liukusäätimellä, jonka arvo voi olla 0–100 %. Käytä HSL-valintaruutuja määrittämään, mitkä tulovärin HSL-komponentit korvataan lähtövärin vastaavilla HSL-komponenteilla. Käytä lähtövärin HSL-liukusäätimiä uuden värin säätämiseen. Lähtöväri näkyy pienemmässä laatikossa vasemmalla, ja se päivittyy liukusäätimiä siirrettäessä. - Siirrä liukusäätimiä ja seuraa kuvan reaaliaikaisia päivityksiä tuloksen optimoimiseksi. Tämä ei ole kovin intuitiivista, ja harjoittelu auttaa. Vihje: aloita sovittamalla sävy ja kylläisyys, ja korvaa vain sävy – tämä tarkoittaa, että lähtövärin kylläisyys ja vaaleus kopioidaan alkuperäisen kuvan väreistä, ja vain sävy korvataan. - - TOPIC: POISTA PÖLY +image: remove-dust.png +image: remove-dust2.jpg - Pölyisistä skannatuista diakuvista tehdyissä kuvissa voi olla paljon pieniä tummia pisteitä – diojen pölyn varjoja. Internetistä löytyvillä historiallisilla valokuvilla on usein samanlainen ongelma. Tällä toiminnolla voidaan poistaa suurin osa tällaisista pisteistä. Siirrä kolmea liukusäädintä, kunnes mahdollisimman moni pölypiste on maalattu punaiseksi, ja paina sitten [pyyhi]-painiketta poistaaksesi ne. Paina [red] palauttaaksesi punaisen näkymän, jonka jälkeen voit säätää liukusäätimiä uudelleen ja painaa [pyyhi]. "spot size limit" -liukusäädin rajoittaa poistettavien pisteiden kokoa. "max. brightness" -liukusäädin asettaa kynnysarvon, jonka alle jäävät liian vaaleat pisteet jätetään huomiotta. "min. contrast" -liukusäädin suodattaa pois pisteet, joiden kontrasti ympäristöönsä on alhainen. Tämä prosessi on yleensä kompromissi. Jos asetukset eivät ole optimaaliset, pieniä yksityiskohtia, kuten puun lehtiä, voi poistua, tai suuria pisteitä voi jäädä paikoilleen. Kuvan eri osat saattavat tarvita erilaisia asetuksia, esim. taivasta voi käsitellä aggressiivisemmin kuin rakennuksen seinää. Voit yksinkertaisesti käyttää Erase Dust -toimintoa useita kertoja eri asetuksilla tarpeen mukaan saadaksesi kaikki pölypisteet pois. Tai voit käyttää toimintoa {VALITSE ALUE} kuvan käsittelyyn osissa. Jos jotkin pisteet ovat sitkeitä, voit käsitellä ne manuaalisesti toiminnolla {ÄLYKÄS POISTO}. Aseta pieni hiiren säde ja napsauta kutakin pistettä poistaaksesi sen. Kuiduista syntyviä pisteitä (pitkiä ja ohuita) ei yleensä poisteta automaattisesti, mutta Älykäs poisto voi toimia tehokkaasti tässä. Jos pöly on vaaleaa, kuten yllä olevassa esimerkissä, käytä toimintoa {VÄRITILA} tehdäksesi väri-negatiivin, käsittele pöly, ja toista sitten väri-negatiivi palauttaaksesi kuvan normaaliksi. - - TOPIC: REUNUKSET +image: fringes.png +image: fringesA.jpg - Korjaa reuna-alueiden väririvat (lateraalinen kromaattinen aberraatio) – joissa väririvat esiintyvät pääasiassa kuvan ulko-osissa. - Yllä oleva vasen kuva on suurennettu leike valokuvan vasemmasta yläkulmasta, jossa on lateraalista kromaattista aberraatiota. Tämä on suurelta osin poistettu oikealla olevasta käsitellystä kuvasta. Väririvoja voi esiintyä korkeakontrastisten reunojen kohdalla, erityisesti kuvan ulko-osissa, joissa objektiivin vääristymät ovat yleensä suurimmat. Päästäksesi niistä eroon, zoomaa kuva maksimikokoon ja keskitä näkymä väririvojen kohdalle. Paina [search]-painiketta. Punainen ja sininen väritaso skaalataan uudelleen kohdistumaan paremmin vihreään tasoon, ja käytetyt kertoimet näytetään valintaikkunassa. Voit ehkä parantaa tulosta muuttamalla kertoimia suoraan valintaikkunassa: muuta kertoimia samalla kun tarkkailet väririvoja kuvassa. - Tämä toiminto on tehottomampi, jos kuvaa on rajattu niin, että kuvan keskikohta ei enää vastaa alkuperäisen valokuvan keskikohtaa. - - TOPIC: HIENOSÄÄTÖVALIKKO - - TOPIC: TASOITA HISTOGRAMMI +image: flatten1.jpg +image: flatten2.jpg - Lisää näkyvää yksityiskohtaa alueilla, joilla on huono kontrasti. Pikselin kirkkautta säädetään ylös- tai alaspäin, jotta pikselin ympärillä olevan alueen kirkkausjakauma (histogrammi) tasoittuu. Pienempi säde (pienempi alue) voimistaa vaikutusta. Kirkkausvyöhykkeitä on 5, tummimmasta (1) vaaleimpaan (5). Siirrä liukusäädintä lisätäksesi vaikutusta vastaavalla vyöhykkeellä. Käytä vyöhyke A -liukusäädintä siirtääksesi kaikkia 5 liukusäädintä yhdessä ja asettaaksesi nopeasti alustavan tuloksen. Käytä sitten muita liukusäätimiä yksitellen kuvan hienosäätöön. - - TOPIC: PAIKALLINEN KONTRASTI +image: localcon1.jpg +image: localcon2.jpg - Lisää kontrastia kuvan jokaisella alueella. Kunkin pikselin kirkkautta verrataan ympäröivän alueen keskimääräiseen kirkkauteen. Pikselin kirkkautta säädetään tämän eron kasvattamiseksi. Tämä toiminto toteuttaa laajalti käytetyn oppikirjamenetelmän. Säde määrittää kunkin pikselin ympärillä olevan alueen koon, jota käytetään keskikirkkauden laskemiseen. Power (teho) määrittää kirkkauden muutoksen määrän. Color (väri) lisää värikylläisyyttä. Voit käyttää muokattavaa käyrää kirkastaaksesi lähtökuvaa valituilla kirkkaustasoilla. Esimerkki näyttää kuvan tummempien alueiden kirkastamisen. - Paikallinen kontrasti voi joissakin tapauksissa aiheuttaa "haloja": +image: localcon3.jpg - Alkuperäinen kuva on vasemmalla. Keskimmäiseen kuvaan on sovellettu Paikallista kontrastia maksimiteholla. Halo näkyy tummien kukkuloiden ja vaaleamman taivaan rajalla. Tämä voidaan korjata yksinkertaisella temppulla (oikea kuva). Valitse taivasalueet erikseen käyttämällä toimintoa {VALITSE ALUE}. Käytä Paikallista kontrastia tähän alueeseen. Käännä valinta ja käytä Paikallista kontrastia kuvan loppuosaan. - - TOPIC: VAHVISTA KONTRASTI +image: amplify-contrast.png +image: amplify-contrast2.jpg - Lisää kuvan näennäistä kirkkausaluetta kasvattamalla paikallista kontrastia. Se voi lisätä matalakontrastisten alueiden kontrastia muuttamatta korkeakontrastisia alueita. Voit myös käyttää muokkauskäyrää vaihtelemaan kontrastin vahvistusta alkuperäisen kontrastimäärän mukaan. - Käyrän alla oleva Amplify-liukusäädin säätelee laskentaa, ei lainkaan kontrastin vahvistuksesta täyteen vahvistukseen. Jos sitä siirretään liian pitkälle oikealle, kuvassa voi näkyä rumia virheitä, joten siirrä sitä takaisin, kunnes ne katoavat. Jos tasaiset alueet (esim. taivas) muuttuvat läiskikkäiksi, vedä käyrän vasenta päätä alaspäin vähentääksesi matalakontrastisten alueiden vahvistusta. Joissakin tapauksissa on parasta valita kuvan eri alueet ja käsitellä ne erikseen, esim. maltillisesti taivas, aggressiivisemmin tekstuuripinnat kuten kivimuurit. - - TOPIC: GLOBAALI RETINEX +image: global-retx.png +image: global-retx2.jpg - Paranna väriä ja kontrastia kuvissa, joissa on voimakasta sumua/utua tai värivirettä (esim. 100 vuotta vanha valokuva). Kokeile ensin [Auto]-painiketta. Kuvasta etsitään sen sisältämät kirkkaimmat ja tummimmat RGB-värit. Tummimmat RGB-arvot vähennetään kaikista pikseleistä, ja tuloksena saadut RGB-arvot skaalataan ylöspäin niin, että suurimmat RGB-arvot ovat lähellä arvoa 255. Tämä ei tietenkään välttämättä ole aluksi optimaalinen. Kiertopainikkeet asetetaan löydettyihin tummiin ja vaaleisiin RGB-rajoihin, ja voit muuttaa näitä optimoidaksesi lopputuloksen. Voit valita omat tummat ja vaaleat pisteesi valitsemalla vastaavan vaihtoehdon valintaikkunasta ja napsauttamalla kuvaa. Kertoimen kiertopainikkeet on oletuksena asetettu arvoon 1.0, ja voit muuttaa näitä arvoja säätääksesi kunkin RGB-värin suhteellista kirkkautta. Yllä olevassa esimerkissä 1. kuva on alkuperäinen, ja 2. kuva on tehty [Auto]-painikkeella. Kiertopainikkeiden oikeanpuoleisin sarake säätää kaikkia saman rivin painikkeita yhdessä – käytä hiiren rullaa tai näppäimistön ylös/alas-nuolinäppäimiä. - Blend-liukusäädintä käytetään tulokuvan ja retinex-kuvan sekoittamiseen missä tahansa suhteessa. Reduce bright -liukusäädintä käytetään vaikutuksen vaimentamiseen kuvan vaaleammilla alueilla, erityisesti taivaalla, jossa Retinex voi tuottaa oudon näköisiä tuloksia. - Algoritmi on johdettu käsitteistä, jotka Edwin Land julkaisi ensimmäisen kerran 1970-luvulla. Etsi lisätietoja internetistä hakusanalla 'retinex'. - - TOPIC: PAIKALLINEN RETINEX +image: local-retx.png +image: local-retx2.jpg - Lisää näkyviä yksityiskohtia kuvan tummilla alueilla ja muilla matalakontrastisilla alueilla. Kunkin pikselin ympärillä olevan vyöhykkeen kirkkausaluetta käytetään pikselin kirkkauden uudelleenskaalaamiseen ikään kuin koko vyöhyke skaalattaisiin kattamaan koko kirkkausalue 0–255. Paikallinen Retinex voi tuottaa dramaattisia tuloksia siellä, missä Globaali Retinex on heikko. - Säde-syöte määrittää kunkin pikselin ympärillä olevan vyöhykkeen likimääräisen koon. Blend-liukusäädintä käytetään tulokuvan ja retinex-kuvan sekoittamiseen missä tahansa suhteessa. Reduce bright -liukusäädintä käytetään vaikutuksen vaimentamiseen kuvan vaaleammilla alueilla, erityisesti taivaalla, jossa Retinex voi tuottaa outoja tuloksia. Reduce dark -liukusäädin tekee saman kuvan tummemmilla alueilla. Yllä oleva esimerkki on noin 60 % alkuperäistä kuvaa + 40 % retinexiä. - - TOPIC: KYLLÄISYYS +image: saturation.png - Säädä värikylläisyyttä pikselin kirkkauden perusteella. Muokkauskäyrän Y-akseli on värikylläisyys, nollaväristä (kaikki RGB-arvot yhtä suuret) maksimiväriin (pienin RGB-arvo on nolla). Käyrän X-akseli on pikselin kirkkaus, tummasta maksimikirkkauteen. Neutraali asento (ei värimuutosta) on keskiarvo, joka on myös alkuarvo. Esimerkki: lisätäksesi kuvan tummien alueiden värivoimakkuutta, nosta käyrän vasenta päätä. Saturation-liukusäädin siirtää koko käyrää ylös tai alas muuttamatta sen muotoa. - - TOPIC: PEHMEÄ FOKUS +image: soft-focus2.jpg +image: soft-focus.png - Käytä klassista "pehmeä fokus" -tehostetta valokuvaan. Tämä on sekoitus tarkkaa kuvaa ja hieman sumennettua kuvaa. Säde-asetus määrittää sumennuksen laajuuden (pikselialue), ja mix-asetus määrittää sumennetun kuvan osuuden sekoitetussa lähtökuvassa, 0–100 prosenttia. Voit käyttää tämän toiminnon kanssa toimintoa {MAALAUSMUOKKAUKSET} vaihdellaksesi vaikutusta kuvan eri alueilla. - - TOPIC: KIRKKAUSLIUKU +image: brite-ramp1.png +image: brite-ramp2.png - Vaihtele kirkkautta tai väriä kuvan poikki. Voit käyttää tätä kompensoidaksesi epätasaista valaistusta tai kuvan poikki vaihtelevaa värivirettä. Muutoksen suunta määritetään piirtämällä viiva kuvaan. Luo viiva napsauttamalla kuvaa ja vedä sitten kumpaakin päätä asettaaksesi halutun suunnan. Yllä olevassa esimerkissä vihreää on lisätty viivan suuntaan. Muokkaa ensin All-käyrää säätääksesi kokonaiskirkkautta (kaikki värit), ja säädä tarvittaessa yksittäisiä RGB-värikäyriä. - - TOPIC: VINJETTI +image: vignette.png +image: vignette2.jpg - Korjaa valokuvan kulmissa joskus näkyvä tummeneminen. Sitä voidaan käyttää myös kuvan sisällä olevan kohteen tai alueen korostamiseen tai värjäämiseen. - Napsauta tai vedä hiirtä kuvassa muuttaaksesi vinjetin keskikohtaa, joka on aluksi kuvan keskellä. - Valitse 'Brightness' muuttaaksesi kuvan kirkkautta säteittäisesti: säädä käyrän vasenta tai oikeaa päätä muuttaaksesi vastaavasti kuvan keskikohdan ja reunojen kirkkautta. Voit antaa muotokuvan kasvoille tumman ympäristön, tai voit korjata kuvan, jonka kulmat ovat tummuneet. Käyrän keskitaso vastaa ei muutosta. Käytä pienempiä arvoja tummentamiseen ja suurempia arvoja kirkastamiseen. Yllä oleva esimerkki tummentaa asteittain kuvan reuna-alueita jättäen laajan keskusalueen muuttumattomaksi. - Valitse 'Color' lisätäksesi valitun värin kuvaan säteittäisesti. Käyrän nolla-arvot tarkoittavat ei muutosta, ja suuremmat arvot lisäävät valitun värin kuvaan. Korkein arvo vastaa 100 % väriä. Käytä tätä toimintoa lisätäksesi kuvaan värillisen ympäristön, esim. ympäröi kasvot asteittain voimistuvalla värillä. - - TOPIC: TEHOSTEVALIKKO - - TOPIC: ÄÄRIVIIVAT +image: outlines1.png +image: outlines2.jpg - Muunna valokuva ääriviivapiirrokseksi. Korkeakontrastiset pikselit voimistetaan ja matalakontrastiset pikselit vaimennetaan. Threshold-asetus määrittää kontrastin kynnysarvot. Vähimmäisarvon alittavia viivoja ei näytetä, ja enimmäisarvon ylittävillä on maksimikirkkaus. 'black/white'-valintaruutu muuntaa väriviivat mustaksi valkoisella tai valkoiseksi mustalla, riippuen 'negative'-valintaruudusta. Käytä 'Low Amplify' -toimintoa kirkastaaksesi haalistuneita viivoja tarvittaessa. 'Mode B' tuottaa tasaisemman viivan kirkkauden verrattuna 'Mode A':han. - - TOPIC: LUONNOS1 +image: sketch1.jpg - Muunna valokuva luonnoksen kaltaiseksi. Tummat pikselit kootaan harvemmiksi pikseleiksi, jolloin vapautuneet alueet jäävät vaaleammiksi. Kontrastia voidaan käyttää myös tummien pikseleiden korvikkeena. Threshold-asetusta voidaan käyttää tulokuvan suodattamiseen kirkkauden perusteella. Clip Level -asetusta käytetään lähtökuvan suodattamiseen, jotta eristyneet tai lievästi tummat pikselit vähenevät edelleen. Valitse värit etu- ja taustalle. Tulokuvan koon pienentäminen saattaa antaa mielenkiintoisia tuloksia. Jos tulos näyttää "likaiselta", käytä toimintoa {POISTA KOHINA} tai {FUUSIO} tasoittaaksesi kuvaa ennen tämän käsittelyä. - - TOPIC: LUONNOS2 +image: sketch2.png +image: sketch2b.jpg - Muunna valokuva luonnoksen kaltaiseksi. Tässä käytetään eri menetelmää: matala ... korkea kontrastiset pikselit muunnetaan vastaavasti vaaleiksi ... tummiksi pikseleiksi. Käyrää voidaan käyttää kontrastimuunnoksen voimakkuuden lisäämiseen tai vähentämiseen. X-akselin asteikko on pikselikontrasti, matalasta korkeaan, ja y-arvo määrittää muunnoksen voimakkuuden. Esimerkki näyttää matalakontrastisten pikselien vaimentamisen (vaalennettuina). Tulokuva voidaan sekoittaa mukaan missä tahansa suhteessa. Jos tulos näyttää "likaiselta", käytä toimintoa {POISTA KOHINA} tai {FUUSIO} tasoittaaksesi kuvaa ennen tämän käsittelyä. - - TOPIC: SARJAKUVA +image: cartoon.jpg - Muunna valokuva sarjakuvamaiseksi piirrokseksi. Mustia viivoja piirretään kuvan piirteiden reunojen päälle aina, kun kirkkaus tai väri muuttuu äkillisesti. Line Threshold määrittää herkkyyden reunantunnistukselle ja viivan piirtämiselle, jolloin viivoja piirretään vähemmän tai enemmän. Line Width tekee viivoista paksumpia tai ohuempia. Kuwahara Depth ohjaa terävöitystoimintoa, joka voi vahvistaa kuvan piirteiden reunoja. - - TOPIC: KOHOKUVIO +image: emboss2.jpg +image: emboss.png - Muunna kuva simuloiduksi kohokuvaksi tai kohokuvioiduksi kuvaksi (3D-tehoste). Piirteiden reunat tehdään vaaleammiksi toiselta puolelta ja tummemmiksi toiselta, ikään kuin ne olisi kohotettu ja valaistu sivulta. Säde-asetus määrittää tehosteen leveyden, ja depth-asetus määrittää voimakkuuden. Light Source -asetus määrittää kulman, josta näennäinen valaistus tulee. Tätä voidaan vaihdella maksimoimaan vaikutus piirteiden reunoille, jotka ovat kohtisuorimmin tähän kulmaan nähden. - - TOPIC: LAATAT1 Muunna kuva yksiväristen laattojen ryhmäksi. Voit hallita laatan kokoa ja laattojen välisen raon paksuutta. Tätä kutsutaan myös nimellä 'pikselöinti'. Käytä Select Area -toimintoa rajataksesi muunnoksen rajattuun alueeseen, esim. kasvoihin. - - TOPIC: LAATAT2 +image: tiles2a.png +image: tiles2b.png - Muunna kuva epäsäännöllisiksi laatoiksi, jotka noudattavat suurin piirtein kuvan värejä ja ääriviivoja. ^peruskoko:^ Laatan peruskoko, joka on yksikkölaatan koko, jota käytetään suurempien laattojen tekemiseen. ^värisyvyys:^ Käytettävien värien määrä: 1 = 8 väriä, 2 = 64 väriä ... 8 = 16 miljoonaa väriä. ^laatan pinta-alatavoite^: Laatan koon yläraja (pinta-ala pikseleinä). ^vaad. värivastaavuus^: Aseta vähimmäisvärivastaavuus, joka vaaditaan, jotta pienempi alue yhdistetään viereiseen suurempaan alueeseen: 0 = ei väliä (maksimiyhdistäminen), 100 = täydellinen vastaavuus vaadittu (minimiyhdistäminen). - - TOPIC: MAALAUS +image: painting1.png +image: painting2.png - Muunna kuva maalausta muistuttavaksi. Se vähentää värien määrää, kartoittaa jokaisen yhtenäisen samanvärisen pikselialueen, ja yhdistää sitten pienemmät alueet viereisiin suurempiin alueisiin, joilla on paras värivastaavuus. - ^sumennussäde^: Sumenna kuva ennen käsittelyä. Tämä tuottaa sulavampia rajoja. ^värisyvyys^: Käytettävien värien määrä: 1 = 8 väriä, 2 = 64 väriä ... 8 = 16 miljoonaa väriä. ^laikun pinta-alatavoite^: Aseta alaraja alueille, joilla on oma värinsä: tätä pikselimäärää pienemmät alueet sulautetaan viereiseen alueeseen, jolla on lähin värivastaavuus. ^vaadittu värivastaavuus^: Aseta vähimmäisvärivastaavuus, joka vaaditaan, jotta pienempi alue yhdistetään viereiseen suurempaan alueeseen: 0 = ei väliä (maksimiyhdistäminen), 100 = täydellinen vastaavuus vaadittu (minimiyhdistäminen). ^reunat^: Määrittää, rajataanko väritetyt alueet ohuella mustalla reunalla, kuten epäsäännölliset laatat mosaiikissa. Tämän toiminnon käytön jälkeen toiminnon {KOHOKUVIO} käyttäminen voi lisätä kuvaan mielenkiintoista tekstuuria. - - TOPIC: TEKSTUURI +image: texture2.jpg +image: texture.png - Lisää tekstuuripinta kuvaan tai kuvan valittuihin alueisiin. Säde määrittää tekstuurikuvion koon. Strength (voimakkuus) määrittää kuvion intensiteetin, lähes näkymättömästä hallitsevaan. - - TOPIC: FUUSIO +image: fusion.png +image: fusion2.jpg - Vaimenna pieniä, matalakontrastisia yksityiskohtia kuvassa säilyttäen samalla terävyys suuremmille kuvan piirteille. Paina [aloita] ja tarkkaile kuvaa läheltä. Prosessi jatkuu jatkuvasti, kunnes se pysäytetään [pysäytä]-painikkeella. Pienet yksityiskohdat häviävät hitaasti. Valintaikkunan 'count'-merkintä näyttää iteraatioiden määrän. Voit [pysäytä] prosessin tarkastellaksesi kuvaa ja jatkaa sitten käsittelyä painikkeella [aloita]. Käytä Undo/Redo-painiketta vertaillaksesi kuvan tilaa ennen/jälkeen. Jatka käsittelyä painikkeella [aloita]. [vaihe]-painiketta voidaan käyttää yhden vaiheen käsittelyyn kerrallaan. - - TOPIC: SOVITA VÄRIT +image: match-colors.png - Sovita yhden kuvan värit toisen kuvan väreihin. Kummastakin kuvasta otetaan näyte pienestä hiiren napsautuksella valitusta kohdasta. 2. kuvan kohta muutetaan siten, että sillä on sama keskiväri (RGB-arvot) kuin 1. kuvan kohdalla. RGB-arvojen yhtäläistämiseen käytetyt kertoimet sovelletaan sitten kaikkiin 2. kuvan pikseleihin. Yleinen käyttötapa on poistaa värivire kuvasta merkitsemällä kuvaan kohta, joka sovitetaan toisen kuvan väriin. - Menettely: Valintaikkuna luettelee 5 vaihetta suoritettavaksi järjestyksessä. • Aseta säde näytealueelle. Tuloksena oleva hiiriympyrä on näytteistettävä alue. • Avaa 1. kuva painamalla [open]-painiketta. • Napsauta kuvaa ottaaksesi värinäytteen. • Avaa 2. kuva painamalla [open]-painiketta. • Napsauta kuvaa kohdasta, jonka haluat sovittaa 1. kuvaan. Kuvan värit muuttuvat sekunnin tai kahden kuluessa. - - TOPIC: KUVIO +image: pattern2.jpg +image: pattern1.png - Lisää taustakuvio kuvaan. Pientä kuvatiedostoa (kuviotiedosto) käytetään peittämään nykyinen kuva toistamalla tiedosto, kuten laatoitettu seinä. Tämä tiedosto voi olla todellinen kuvio (esim. kuva kangaspinnasta, tiiliseinästä, toistuvasta geometriasta ...) tai mikä tahansa muu kuvatyyppi. Kuvio tehdään puoliläpinäkyväksi, jolloin peruskuva näyttää olevan painettu kuvion päälle, tai kuvio kuvan päälle. Monia kuviotiedostoja löytyy verkkohaulla "pattern image". Lataa joitakin näistä ja rajaa ne tarvittaessa noin 200–500 pikselin kokoisiksi. Käytännöllisyyden vuoksi lisää nämä toimitettujen kuviotiedostojen joukkoon kansiossa ~/.fotocx/patterns. - Käytä [Selaa]-painiketta valitaksesi kuviotiedoston. Valittu kuvio laatoitetaan peittämään peruskuva. Kuvio on osittain läpinäkyvä, jolloin peruskuva näkyy läpi. Käytä Zoom-toimintoa kuvion koon kasvattamiseen tai pienentämiseen. Kuvion ja peruskuvan sekoittamiseen on kaksi menetelmää. Kuvion peittävyys voidaan asettaa 0–100 %. Peruskuvaa käytetään täyttämään käyttämätön peittävyys. Contrast-toimintoa käytetään muuttamaan peruskuvan kirkkautta käyttäen kuvion kirkkautta mallina. Näitä kahta parametria voidaan sekoittaa missä tahansa suhteessa. - Jos kuviotiedosto sisältää kuvan, joka toistuu kiinteinä väliajoin sekä vaaka- että pystysuunnassa, [Laske]-painiketta voidaan käyttää leveyden ja korkeuden asettamiseen jatkuvan, saumattoman kuvion luomiseksi. - Jos kuvio on epäsäännöllinen ja saumat näkyvät, voit ehkä parantaa tilannetta. Kaksi Overlap-arvoa määrittävät, kuinka paljon toistetut kuviot menevät päällekkäin reunoilla, vaaka- ja pystysuunnassa. Lisää hieman päällekkäisyyttä peittääksesi reunavaikutukset. - Select Area -toimintoa voidaan käyttää kuvion soveltamiseen kuvan osaan, tai eri kuvioiden soveltamiseen eri osiin. Kuvion soveltamisen jälkeen kuvaan voi olla mielenkiintoista käyttää toimintoa {KOHOKUVIO} lisätäksesi kuvioon 3D-tehosteen. - Valintaruutu "Grayscale" muuntaa väriteemaisen kuvion harmaasävyiseksi. - - TOPIC: RISTIVIIVOITUS +image: crosshatch2.jpg +image: crosshatch1.png - Muunna kuva piirrokseksi käyttäen risteäviä yhdensuuntaisia viivoja. Syötä ruudukon koko ja paina [käytä]. - - TOPIC: RASTEROINTI +image: dither1.png - +image: dither2.jpg - Tämä toiminto tarjoaa useita tapoja sirottaa kuva – muuntaa se pisteiksi. 0 - värillisiä pisteitä Roy Lichtensteinin tyyliin 1 - puhdas R/G/B tai musta/valkoinen satunnaisella tai optimoidulla tilajakaumalla 2 - RGB-sekoitus annetulla bittisyvyydellä 3 - klassinen sirotus mukautetulla väripaletilla 4 - tiivistä kuva möykyiksi, joilla on tiivistettyjen pikseleiden keskiväri - Klassiset sirotukset käyttävät Floyd-Steinberg-menetelmää värivirheiden kompensoimiseen: tulokuvan värin ja paletin lähimmän värin välinen poikkeama. Läheisiä värejä olevia pisteitä sekoitetaan mukaan tarpeen mukaan, jotta alueen keskiarvo vastaa tarkemmin tulokuvan väriä. Virhekompensaatio voidaan tarvittaessa kytkeä pois päältä selkeiden värivyöhykkeiden tai ääriviivojen saamiseksi. - Blobs (möykyt): Kuvan pikselit käyvät läpi eräänlaisen "painovoimaromahduksen" ja kokoontuvat möykyiksi paikallisten massakeskipisteiden ympärille. 'Massa' määritellään pikselin kirkkautena. 'radius'-säädin määrittää suunnilleen vetovoiman kantaman. Paina [aloita] aloittaaksesi romahduksen. Seuraa, kuinka kuva muuttuu hitaasti möykyiksi, jotka ovat suunnilleen 'radius'-syötteen kokoisia. Kun möykyt ovat mukavan pyöreitä ja muuttuvat hyvin vähän, paina [pysäytä] päättääksesi prosessin. - - TOPIC: KAIVERRUS +image: engrave.png +image: engrave2.png - Muunna kuva mustavalkoisiksi viivoiksi. Size-syöte määrittää viivan paksuuden ja kuinka monta pystysuoraa kuvapikseliä käytetään kutakin lähtöviivojen pystysuoraa pikselisaraketta kohti. Viivan pikselisarakkeet jaetaan mustiin ja valkoisiin osiin, joiden suhde vastaa suunnilleen tulopikseleiden keskikirkkautta. Bias-syötettä voidaan käyttää kokonaiskirkkauden optimointiin. Negatiiviset/positiiviset arvot tekevät kuvasta tummemman/vaaleamman. Color-syötettä (0–100 %) voidaan käyttää värin lisäämiseen valkoisiin osiin. - - TOPIC: LISÄÄ HEIJASTUS +image: addglare.png +image: addglare2.jpg - Lisää häikäisyä säteilemään kuvan kirkkaista kohdista. Power: määrittää häikäisyn suhteellisen kirkkauden Limit: kynnyspikselikirkkaus häikäisyn säteilemiseksi Range: häikäisyn pikselikantama säteilevistä pikseleistä Pikselit, joiden kirkkaus ylittää rajan (200–255), säteilevät häikäisyä. Kirkkaus tarkoittaa tässä pikselin kirkkaimman RGB-värin kirkkautta. Säteilty häikäisy on säteilevän pikselin väristä. Range on pikseliyksikköinä. Häikäisy on voimakkaimmillaan säteilevässä pikselissä ja heikkenee nollaan kantaman rajalla. - - TOPIC: MOSAIIKKI +image: mosaic1.png +image: mosaic2.jpg - Luo mosaiikkikuva käyttäen laattoja, jotka on tehty kaikista kuvistasi. - Määritä laatan koko pikseleinä (esim. 36 x 24) ja paina [Laatat]. Laatat luodaan kaikista kuvistasi (itse asiassa käytetään thumbnail-kuvia nopeuden vuoksi). Jos muutat laatan mittoja, paina [Laatat] uudelleen luodaksesi laatat uudelleen. Kun laatat on luotu, paina [Kuva] muuntaaksesi nykyisen kuvan mosaiikiksi näitä laattoja käyttäen. Laatat valitaan sovittamalla laatan keskiväri kuvan keskiväriin laatan sijainnissa. Jos käytettävissä on tuhansia kuvia ja värivalikoima on riittävän hyvä, mosaiikista tulee melko hyvä. Zoomaa mihin tahansa kuvan osaan nähdäksesi laattakuvat. - Tile blending -liukusäädin sekoittaa kuvan laattoihin, mikä saa sen näyttämään paremmalta, jos laatat sopivat huonosti väriltään. Jos sekoitus on alle noin 50 %, laatat pysyvät lähes yhtä selkeinä kuin ennen, koska silmä kompensoi väärän sävyn. - Kun mosaiikki on luotu, voit napsauttaa mitä tahansa laattaa saadaksesi suuremman ponnahduskuvan. Jos tallennettu mosaiikki avataan, laattojen napsauttaminen suuremman kuvan saamiseksi ei toimi. Mosaiikin uudelleenluonti on melko nopeaa, joten tee se, jos haluat ponnahdusikkunoiden toimivan. - - TOPIC: LISÄÄ KOHINAA +image: add-noise.png - Lisää satunnaista värikohinaa kuvaan. Aseta kohteen pistekoko 1–10 ja kohinataso 0–100 %. Arvolla 100 % kuhunkin pikselin RGB-arvoon lisätään satunnaista kohinaa väliltä -127 – +127. Keskiarvo on nolla. Alueen 0–255 ulkopuolelle jäävät ylivuotoarvot katkaistaan. Suurella alueella keskiväri säilyy, kohina päällekkäin. Voit käyttää Add Noise -toimintoa yhdessä Select Arean tai Paint Editsin kanssa lisätäksesi kohinaa valittuihin alueisiin. - ^'Vyöhykkeisyyden' vaimentaminen Kuva-alueilla, joilla kirkkausjakaumaa on 'venytetty', voi esiintyä näkyvää 'vyöhykkeisyyttä' lähes tasaisen kirkkauden ja värin alueilla. Voit vähentää tätä ongelmaa lisäämällä kohinaa (tai sumennusta) kyseisille alueille. - - TOPIC: ASETA VÄRIT +image: set-colors1.jpg +image: set-colors2.jpg - Voit vähentää kuvassa käytettyjen värien määrää julistetehosteen luomiseksi. Aseta kukin RGB-väri erikseen, tai säädä värien kokonaismäärää. Värin bittisyvyyttä ei käytetä tähän. Jotkin Fotocxin toiminnot käyttävät bittisyvyyttä, mikä rajoittaa käytettävissä olevat värit arvoihin 2, 4, 8 ... kullekin RGB-värille. Tämä toiminto ei ole tässä suhteessa rajoitettu. Yllä oleva esimerkki käyttää 8 punaista, 5 vihreää ja 3 sinistä väriä. - - TOPIC: SIIRRÄ VÄREJÄ +image: shift-colors.png - Tätä toimintoa voidaan käyttää värien korjaamiseen tai kuvan muuntamiseen väärävärikuvaksi. Valitse mikä tahansa kolmesta RGB-väristä ja siirrä liukusäädintä vasemmalle tai oikealle keskeltä. Toinen kahdesta muusta väristä korvataan asteittain. Voit esimerkiksi asteittain korvata punaisen värin vihreällä tai sinisellä. All-liukusäädin siirtää kaikkia värejä yhdessä. Tee tämä ensin löytääksesi ensimmäisen optimin, ja siirrä sitten RGB-värejä yksitellen. - - TOPIC: VIERAAT VÄRIT +image: alien-colors2.jpg +image: alien-colors1.png - Maalaa kuva tai valittu alue uudelleen satunnaisilla vieraiden värien avulla. Voit hallita karkeaa kuvion kokoa ja voimakkuutta (tuskin näkyvästä hallitsevaan). Paina [Käytä] saadaksesi uuden värijakauman. - - TOPIC: MUKAUTETTU YDIN +image: custom-kernel.png - Käytä mukautettua konvoluutioydintä kuvaan. Taustalla oleva tekniikka on selitetty Wikipediassa. Syötä ytimen koko, kertokerroin, lisäyskerroin ja täytä taulukon arvot. [Käytä] käyttää ydintä kuvaan. [Nollaa] palauttaa kuvan alkuperäisen tilan. Arvot voidaan tallentaa tiedostoon ja hakea myöhemmin [Tallenna]- ja [Lataa]-painikkeilla. Aluksi käytettävissä on useita ytimen esimerkkitiedostoja. Voit muokata näitä ja tallentaa mukautetulla nimellä. - Matematiikka: kuvan kunkin N×N-pikselilohkon kirkkausarvot kerrotaan ytimen matriisin vastaavilla arvoilla ja lasketaan yhteen. Tämä luku kerrotaan kertokertoimella, ja siihen lisätään lisäyskerroin. Tästä lopullisesta arvosta tulee N×N-lohkon keskellä olevan kuvapikselin uusi kirkkaustaso. - - TOPIC: VÄÄRISTYSVALIKKO - - TOPIC: OIKAISE +image: unbend1.png +image: unbend2.jpg - Läheisten kohteiden (tyypillisesti rakennusten tai sisätilojen) panoraamat voivat näyttää suoria viivoja kaarevina, tai rakennukset voivat näyttää vinoina. Kuvien vääristäminen oli tarpeen panoraamaprosessissa, jotta kuvat sopisivat yhteen. Unbend-toimintoa voidaan käyttää jälkikäteen panoraamakuvan suoristamiseen tarvittaessa. Kuvan päälle piirretään pystysuoria ja vaakasuoria pistekatkoviivoja, jotka näyttävät suoristusakselit. Napsauta tai vedä hiirtä viivan päätä lähellä siirtääksesi sitä. Jos neljän syöttökentän arvoja muutetaan, kuva vääristetään vastaavien neljän kuvan osoittamalla tavalla. Lisää tai vähennä arvoja ja toista, kunnes olet tyytyväinen. Siirrä akseleita muuttaaksesi vääristyksen keskikohtia. - Katso myös {VÄÄRISTÄ KUVA} toisesta menetelmästä kuvan kaartumisen ja perspektiivin korjaamiseen. - - TOPIC: PERSPEKTIIVI +image: perspective2.jpg +image: perspective1.png - Tätä toimintoa voidaan käyttää korjaamaan valokuva, joka on otettu vinosta kulmasta. Vasemmalla oleva kuva on alkuperäinen valokuva, otettu keskikohdasta oikealle heijastusten välttämiseksi. Oikealla oleva kuva on suoristettu versio. Tätä toimintoa voidaan käyttää myös korkean rakennuksen suoristamiseen, kun se on kuvattu katutasolta tai sivulta. - Napsauta tetraedrin, jonka haluat muuttaa suorakulmioksi, neljää kulmaa (yllä olevassa tapauksessa maalauksen tai kehyksen neljä kulmaa), ja valitse sitten [Käytä]. Napsautetut kulmat merkitään pienillä valkoisilla laatikoilla, joissa on kirjaimet "A, B, C, D". Kunkin laatikon vasen yläkulma osoittaa tarkalleen kuvan sijainnin. Laatikon lähelle napsauttaminen siirtää sen uuteen sijaintiin. Voit käyttää näppäimistön nuolinäppäimiä siirtääksesi kulmamerkkejä 1 pikselin askelin. Nuolinäppäimet vaikuttavat viimeksi napsautettuun tai siirrettyyn kulmaan. - - TOPIC: VÄÄRISTÄ KUVA +image: warps4.jpg - - TOPIC: VÄÄRISTÄ ALUE Tätä toimintoa voidaan käyttää vääristymien tekemiseen kuvan sisällä. Voit valita kuva-alueen ja vetää hiirtä venyttääksesi tätä aluetta suhteessa kuvan muihin osiin. Kuva on kuin kumia. Jos hiiren veto alkaa valitun alueen sisältä, alue vääristyy nykyisten rajojensa sisällä – liike on suurimmillaan hiiren osoittimen kohdalla ja pienenee nollaan alueen reunoilla. Jos hiiren veto alkaa valitun alueen ulkopuolelta, hiiren lähellä olevat alueen reunat voidaan vetää alkuperäisen alueen rajan ulkopuolelle. Monia erimittaisia ja -suuntaisia hiiren vetoja voidaan yhdistää halutun tuloksen saavuttamiseksi. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - Tämä toiminto on hyödyllinen perspektiiviongelmien korjaamiseen. Vedä kuvaa kulman läheltä hiirellä. Kuvaa venytetään joustavasti tästä kulmasta, kun taas muut kulmat pysyvät paikoillaan. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - Tämä toiminto on hyödyllinen perspektiiviongelmien korjaamiseen. Vedä kuvaa sen sisäosasta hiirellä. Kuvan sisäosa venytetään joustavasti, kun taas reunat pysyvät paikoillaan. - - TOPIC: KAAREVA VÄÄRISTYS Tämä toiminto on hyödyllinen perspektiiviongelmien korjaamiseen (katso myös {OIKAISE}). Vedä kuvaa mistä tahansa kohdasta hiirellä. Koko kuvaa vedetään tai työnnetään hiiren suuntaan, mutta hiiren lähellä olevat alueet liikkuvat enemmän kuin kauempana olevat alueet. Voit suoristaa kaarevia viivoja tai kaarruttaa kuvaa tarkoituksella. Säädin 'warp span' määrittää vääristymän säteen hiiren ympärillä. Arvo 1.0 tarkoittaa, että koko kuva vääristyy, ja pienemmät arvot rajaavat vääristymän pienemmälle alueelle hiiren ympärillä. - - TOPIC: AFFIININEN VÄÄRISTYS Tätä toimintoa voidaan käyttää kuvan vääristämiseen mielenkiintoisilla tavoilla. Vedä kuvaa kulmasta tai reunasta hiirellä. Muutokset ovat puhtaasti lineaarisia, joten suorat viivat pysyvät suorina. Tätä muunnosta kutsutaan nimellä "affiininen". Lisätietoja löytyy verkkohaulla. - - TOPIC: SÄTEITTÄINEN VÄÄRISTYS +image: warp_radial.png - Lisää tai poista tynnyri- tai tyynyvääristymä. Tynnyrivääristymää nähdään usein RAW-kuvissa, joita ei ole käsitelty tämän vääristymän poistamiseksi. Napsauta hiiren vasenta painiketta valitaksesi keskipisteen, jonka ympärille muutokset keskitetään – normaalisti kuvan keskikohta. Tämä on oletusarvo. Siirrä 'stretch'-liukusäädintä taivuttaaksesi kuvaa. - - TOPIC: POISTA LÄHIKUVAN VÄÄRISTYMÄ +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - Lähikuvat kasvoista ovat usein vääristyneitä, koska kameraa lähempänä olevat alueet näkyvät valokuvassa suurempina kuin kauempana olevat alueet. Tätä toimintoa voidaan käyttää vääristymän kumoamiseen. Käytä ensin toimintoa {VALITSE ALUE} kasvojen valitsemiseen (ei tarvitse olla tarkka). Napsauta kuvaa vääristymän keskikohdan lähellä (yllä olevassa esimerkissä: oikea poski). Siirrä liukusäädintä optimoidaksesi. - - TOPIC: LUO AALTOJA +image: make-waves2.jpg +image: make-waves1.png - Tämä toiminto vääristää kuvan aaltokuvioksi, ikään kuin sitä katsottaisiin levottoman veden läpi. Valintaikkunassa voit muuttaa keskimääräistä vaaka- ja pystysuuntaista aallonpituutta, amplitudia ja varianssia. "perspective"-syöte mahdollistaa aallonpituuksien asteittaisen pitenemisen ylhäältä alas. - - TOPIC: KIERTO +image: twist1.png +image: twist2.png - Tämä toiminto kiertää kuvaa hiiren napsautuksella tai vedolla valitun pisteen ympäri. Napsauta haluttua kohtaa ja siirrä Twist-liukusäädintä halutun määrän verran. Voit myös vetää hiirtä kuvan ympäri muuttaaksesi kierron keskikohtaa. Center-liukusäädin poistaa kierron keskialueelta suhteessa muuhun kuvaan. Angle-liukusäädin kääntää kuvaa. - - TOPIC: PALLO +image: sphere2.jpg +image: sphere.png - Tee kuvasta pallomainen projektio. Vedä hiirtä kuvassa muuttaaksesi projektion keskikohtaa (oletuksena keskipiste). Flatten-säädin muuttaa projektiota asteittain pallosta (oikea) tasaiseksi kuvaksi (vasen). Magnify-liukusäädin suurentaa tuloskuvan enintään 2-kertaiseksi. - - TOPIC: SISÄPUOLI ULOS +image: inside-out2.jpg +image: inside-out1.png - Tämä toiminto kääntää kunkin pikselin keskikohta–reuna-etäisyyden. Voit napsauttaa tai vetää hiirtä muuttaaksesi keskipistettä. - - TOPIC: PIKKUPLANEETTA +image: tiny-planet.jpg - Kääri kuva ympyrän muotoon. Jos kuva on 360 asteen panoraama, näkyvää saumaa ei synny. • Center Hole: kuva kääritään keskellä olevan reiän ympärille. • Cut Top: poista tulokuvan yläreunus. • Cut Bottom: poista tulokuvan alareunus. • Reverse R: peilaa tulokuva pystysuunnassa. • Reverse Theta: peilaa tulokuva vaakasuunnassa. • Rotate: käännä tuloskuvaa keskipisteen ympäri. - - TOPIC: ESCHER-SPIRAALI +image: escher-spiral.png +image: escher-spiralA.png - Muunna kuva loputtomaksi sisäänpäin kiertyväksi spiraaliksi, kuten M.C. Escherin kuuluisassa kellossa. Width määrittää uloimman kerroksen alkuleveyden. Rim määrittää kerroksia erottavan reunuksen alkuleveyden, ja Color määrittää sen värin. Oletuskeskipiste on kuvan keskikohta. Napsauta kuvaa asettaaksesi uuden keskipisteen. - - TOPIC: TASOITA VALOKUVA +image: flatten-photo1.png +image: flatten-photo2.jpg - ^Kirjan sivu tai muu kaareva pinta Tasoita valokuva kuvasta kaarevalla pinnalla, esim. pylvään ympärillä, tai sivu avonaisesta paksusta kirjasta, jossa sivut kaartuvat sisäänpäin keskisidonnan kohdalla. Pinnan ylä- ja alareunan kaarevuus antaa tietoa kaarevuuden määrästä ja tarvittavasta venytyksestä, jotta kuva näyttää tasaiselta. Yllä oleva esimerkki on paksu kirja. Muitakin pyöreitä pintoja voidaan korjata, esim. juliste pyöreällä pylväällä. - Valitse yläreunan jäljitysvaihtoehto jäljittääksesi kaarevan sivun yläreunan. Napsauta hiirellä pitkin reunaa, jolloin jokaiseen napsautettuun kohtaan luodaan merkkipiste. Kun pisteitä on saatavilla 4, pisteiden kautta piirretään kaareva viiva. Lisää tarvittaessa lisää pisteitä ja vedä pisteitä, jotta viiva noudattaa tarkasti kuvan kaarevuutta. Valitse alareunan jäljitysvaihtoehto ja jäljitä alareuna samalla tavalla. Kun molemmat on tehty, paina [flatten] tasoittaaksesi sivun. Reunojen tulisi nyt olla suorat (tai riittävän suorat). Käytä [stretch]-liukusäädintä venyttääksesi kuvan sivuja tarpeen mukaan, kompensoidaksesi kaarevuuden aiheuttaman lateraalisen puristumisen. Käytä Widen-säädintä levittääksesi kuvaa tarpeen mukaan oikean leveys/korkeus-suhteen palauttamiseksi. [undo]-painike palauttaa muokkaamattoman kuvan säilyttäen merkkipisteet, joita voidaan sitten säätää uutta yritystä varten. - +image: flatten-photo3.jpg - ^Kaareva horisontti Leveässä panoraamassa tai laajakulmaobjektiivilla otetussa valokuvassa horisontti ei välttämättä ole suora tai vaakasuora. Kuva voidaan suoristaa (tai muuten siirtää) jäljittämällä käyrä horisontin tai muiden suoraksi tasattavien alueiden kautta. Valitse joko yläreunan tai alareunan jäljitysvaihtoehto sen mukaan, sijaitseeko horisontti (tai muu kuvan osa) enimmäkseen kuvan keskikohdan ylä- vai alapuolella. Kuva vääristetään niin, että tämä käyrä suoristuu. Yksi käyrä riittää. Toinen käyrä lisätään automaattisesti kuvan vastakkaiselle reunalle (ylä- tai alareunaan). Jos tulos ei ole tyydyttävä, käytä [undo]-painiketta, säädä kummankin käyrän merkkejä ja yritä uudelleen. Voit myös tallentaa kuvan ja käyttää toimintoa toisen kerran, käyttäen tallennettua kuvaa lähtökohtana. - - TOPIC: YHDISTÄ-VALIKKO Nämä ovat toimintoja, jotka yhdistävät useita kuvatiedostoja. Päällekkäisten kuvien tapauksessa kunkin kuvan vastaavat piirteet kohdistetaan yhteneviksi yhden pikselin tarkkuudella. Kohdistusaika on tyypillisesti 10–30 sekuntia kuvaa kohden. Jos huomaat tämän kohdistusprosessin menevän pieleen, voit käyttää Escape-näppäintä prosessin lopettamiseen. - - TOPIC: HDR ^Suuri dynamiikka-alue +image: HDR.jpg +image: HDR-adjust.png - Yhdistä (aseta päällekkäin) useita samasta kohteesta eri valotustasoilla otettuja kuvia. Yhdistetty kuva voi näyttää parannettuja yksityiskohtia sekä tummemmilla että vaaleammilla alueilla, käyttäen käytännössä vaaleampien kuvien pikseleitä tummille alueille ja tummempien kuvien pikseleitä vaaleille alueille. Jos kameraa säädetään manuaalisesti kuvien välillä, pidä huoli, että se pysyy vaakasuorassa ja tähtää samaan kaukaiseen pisteeseen. Tulokuvien pientä kohdistusvirhettä voidaan sietää. Jos ihmiset tai esineet liikkuvat kuvien välillä, haamukuvia ei voida välttää. - Valitse HDR-valikkotoiminto ja valitse enintään 9 kuvaa ({VALITSE KUVATIEDOSTOT}), joiden pikselimittojen tulee olla lähes samat. Kuvat kohdistetaan ja yhdistetään automaattisesti. Kun tämä on tehty, yhdistetty kuva näytetään yhdessä säätöjen valintaikkunan kanssa. Tulokuvien osuudet näytetään sarjana muokattavia käyriä. Vaaka-asteikko edustaa pikselin kirkkautta, tummasta vaaleaan. Kukin käyrä edustaa kuvaa, joka vaikuttaa tuloksen pikseleihin. Kuvan osuus tietyllä kirkkaustasolla on suhteessa sen käyrän korkeuteen kyseisellä tasolla. Vaaleimman kuvan alkukäyrä on korkealla vasemmalla ja matalalla oikealla, mikä tarkoittaa suurta osuutta tummissa pikseleissä ja pientä osuutta vaaleissa pikseleissä. Tummin kuva on matalalla vasemmalla ja korkealla oikealla, ja loput kuvat ovat siltä väliltä. Käyriä voidaan muokata vetämällä niitä hiirellä. Vastaavat kuvien osuudet muuttuvat sen mukaisesti, ja tulokset näkyvät reaaliajassa tuloskuvassa. Yllä oleva kuva näyttää kaksi tulokuvaa ja niiden tuloskuvan. Esimerkkivalintaikkuna näyttää kolme käyrää, jotka on säädetty optimoimaan kolme tulokuvaa. - - TOPIC: HDF ^Suuri syväterävyysalue Yhdistä (aseta päällekkäin) useita samasta kohteesta otettuja valokuvia, joissa tarkennus vaihtelee lähikuvasta kaukokuvaan. Kohteen eri osat ovat tarkkoja kussakin kuvassa. Yhdistä kuvat niin, että kohteen kaikki osat ovat tarkkoja. - Valokuvien ottaminen: Valitse piste kuvan keskikohdaksi. Tähtää kamera lähellä olevaan kohteeseen ja paina laukaisinta puoliväliin asettaaksesi tarkennuksen tähän kohteeseen. Pidä painiketta puolivälissä, tähtää kamera valittuun keskikohtaan ja ota kuva. Valitse nyt kauempana oleva kohde ja tee sama. Toista kasvattaen tarkennusetäisyyttä. Toivottavasti kohteen jokainen osa on tarkka ainakin yhdessä kuvassa. Kameran sijainnin tulisi olla lähes sama kaikissa kuvissa, mikä voi olla haastavaa, jos kohde on hyvin lähellä. Kameran liike voi aiheuttaa skaalaus- ja parallaksiongelmia (lähellä olevat kohteet siirtyvät suhteessa kaukana oleviin kohteisiin). Tällaiset ongelmat voivat olla korjattavissa myöhemmin Fotocxissa, mutta tämä voi vaatia huomattavasti aikaa. On parempi välttää ongelmat. - +image: HDF-paint.png - Valokuvien käsittely: Valitse HDF-valikkotoiminto ja valitse enintään 9 kuvaa ({VALITSE KUVATIEDOSTOT}). Kuvat kohdistetaan nyt mahdollisimman hyvin. Tuloskuva on tasainen sekoitus kohdistetuista tulokuvista. Pieni kameran liike kuvien välillä kompensoidaan, mutta tämä on rajallista, eikä parallaksisiirtymiä kompensoida lainkaan. Kun kohdistus on valmis, valintaikkuna avautuu. Voit valita minkä tahansa tulokuvan ja "maalata" sitä hiirellä mihin tahansa tuloskuvan alueeseen. Tämä muuntaa alkuperäisen kuvasekoituksen yhdeksi valituksi kuvaksi maalattavalla alueella. Valitse kutakin kuvan aluetta tai kohdetta varten tulokuva, joka on tarkka kyseisellä alueella. Sivellintä voidaan säätää suuremmaksi tai pienemmäksi säteeltään, jotta voit maalata suuria alueita nopeasti ja hallita hienoja yksityiskohtia tarvittaessa. Jos sinulla on päällekkäisiä lähellä ja kaukana olevia kohteita, kaikkien saaminen tarkoiksi vaatii aikaa ja kärsivällisyyttä. Kohdistusvirheet voidaan korjata valitsemalla vääristystoiminto valintaikkunassa. Taustalla olevia kuvia voidaan sitten vetää ja vääristää hiirellä, ja yhdistetty tuloskuva muuttuu sen mukaisesti. Vääristys rajoittuu hiiren ympärillä olevaan alueeseen. Kun maalattua aluetta vedetään, vastaava tulokuva valitaan ja sitä vedetään automaattisesti, kun taas muilla kuvilla maalatut alueet pysyvät paikoillaan. Alueita, joita ei ole maalattu, ei voida vetää. Siirry eri alueille ja tee asteittaisia vetoja, kunnes kaikki on kohdistettu. - Ehdotettu työnkulku: Käytä maalaustilaa, valitse kukin kuva vuorollaan ja maalaa kaikki alueet, jotka näyttävät tarkoilta kyseisessä kuvassa. Huonosti kohdistetut rajat näkyvät selvästi kuvan piirteiden reunojen siirtyminä. Osa näistä voidaan tehdä merkityksettömiksi vaihtamalla maalaukseen käytettyä kuvaa (jos useampi kuin yksi kuva on riittävän tarkka). Käytä vääristystilaa tekemään hienosäätöjä tarvittaessa näkyvien siirtymien poistamiseksi. - - TOPIC: PINO/MAALAUS +image: stack-paint.png - +image: stack-paint2.jpg - Pinoa (aseta päällekkäin) useita samasta kohteesta eri aikoina otettuja valokuvia. Poista turistit ja autot, jotka tulevat ja menevät kuvien välillä. - Valokuvien ottaminen: Tähtää kamera samaan kaukaiseen pisteeseen ja ota useita valokuvia, kun turistit tai autot liikkuvat kohteen edessä. Yritä saada kaksi tai useampi valokuva kustakin kohteen alueesta, jota tilapäiset kohteet eivät peitä. Pidä kamera vakaana ja tähtää samaan pisteeseen, jotta kuvat kohdistuvat tarkasti. - Valokuvien käsittely: Valitse Stack/Paint-valikkotoiminto ja valitse enintään 9 kuvaa ({VALITSE KUVATIEDOSTOT}). Kuvat kohdistetaan nyt mahdollisimman hyvin. Tuloskuva (alavasen) on tasainen sekoitus kohdistetuista tulokuvista (ylärivi). Kun kohdistus on valmis, yllä näkyvä valintaikkuna käynnistyy. Voit valita minkä tahansa tulokuvan ja "maalata" sitä hiirellä mihin tahansa tuloskuvan alueeseen. Yhtä valittua kuvaa käytetään maalattavalla alueella. Valitse kutakin kuvan aluetta varten tulokuva, joka on vapaa tilapäisistä kohteista. Sivellintä voidaan säätää suuremmaksi tai pienemmäksi säteeltään, jotta voit maalata suuria alueita nopeasti ja hallita hienoja yksityiskohtia tarvittaessa. - Automaattinen toiminto: paina [Piilota]-painiketta nähdäksesi, voidaanko tilapäiset kohteet poistaa automaattisesti. Tämä toimii kuvan alueilla, joilla on saatavilla useita valokuvia esteettömästä taustasta (alakeskikuva). Näyttääksesi kaikki tilapäiset kohteet, paina [Näytä]-painiketta (alaoikea kuva). Tämä toimii yleensä, mutta ei täydellisesti. Pienet kuvien kohdistusvirheet tai valaistuserot (erityisesti liikkuvat varjot) voivat saada algoritmin valitsemaan taustapikseleitä etualan pikseleiden sijaan. Voit käyttää yllä kuvattua maalausmenetelmää virheiden korjaamiseen käsin. - - TOPIC: PINO/KOHINA +image: stack-noise2.jpg +image: stack-noise.png - Tämä toiminto yhdistää 2–9 valokuvaa samasta kohteesta. Valokuvien tulisi olla lähes samanlaisia, lukuun ottamatta käsivaralla kuvaamisen aiheuttamia pieniä siirtymiä. Jos valokuvat on otettu hyvin korkealla ISO-asetuksella (heikko valaistus), pikseleissä on huomattavasti kohinaa. Ottamalla monta valokuvaa ja keskiarvoistamalla ne, kohina voidaan pääosin poistaa. - Valokuvien käsittely: Valitse Stack/Noise-toiminto ja valitse enintään 9 kuvaa ({VALITSE KUVATIEDOSTOT}). Ne yhdistetään automaattisesti ja näytetään, ja valintaikkuna avautuu. Alkuperäinen tuloskuva on kaikkien valittujen tulokuvien yhdistelmä, keskiarvoistettuna. Tämä tarkoittaa, että kunkin tuloksen pikselin RGB-arvot ovat vastaavien tulopikseleiden RGB-arvojen keskiarvo. Median-painike muuttaa tuloksen pikselit tulopikseleiden mediaaniksi (1–3 keskimmäistä RGB-arvoa keskiarvoistetaan kuvien määrästä riippuen). Tämä voi olla parempi tai huonompi, joten vaihtele niiden välillä vertaillaksesi. Valintaruudut omit low pixel ja omit high pixel saavat pienimmät ja suurimmat RGB-tuloarvot hylätyiksi ennen keskiarvoistusta. Tämä voi poistaa kohinapiikkejä sekoituksesta. Tällä ei ole vaikutusta, jos median-menetelmä on valittuna. - - TOPIC: PINO/TASOT +image: stack-layers.png - Käytä tätä toimintoa yhdistämään kuvan eri muokattuja versioita, joissa voit määrittää, mikä versio näytetään valituilla kuva-alueilla. Mitä tahansa kuvia, joilla on samat pikselimitat, voidaan yhdistää. - Valitse enintään 9 samankokoista kuvaa. Alkuperäinen tuloskuva on kaikkien tulokuvien tasainen sekoitus. Image Ratios ovat sekoitettujen kuvien suhteelliset painot. Näitä voidaan säätää kunkin kuvan painon vaihtelemiseksi. Esimerkki: jos 3 kuvaa yhdistetään suhteellisilla painoilla 3, 5, 7, yhdistetty kuva on 3/15 kuvasta #1, 5/15 kuvasta #2 ja 7/15 kuvasta #3. Jos vaihtoehto "Paint entire image" on valittuna, painoja voidaan säätää ja tuloskuva reagoi välittömästi. Jos vaihtoehto "Paint within mouse" on valittuna, hiirtä voidaan vetää ja vain hiiriympyrän sisällä oleva alue maalataan käyttäen tällä hetkellä aktiivisia kuvasuhteita. Maalausnopeutta ohjataan Power-asetuksilla hiiren keskikohdalle ja reunalle. Käytä pieniä lukuja maalataksesi asteittain. - - TOPIC: PANORAAMA +image: pano-align1.jpg +image: pano-align2.jpg - Tämä toiminto yhdistää 2–6 kuvaa laajakulmakuvaksi tai panoraamaksi. Kuvien tulee olla päällekkäin vähintään 10 %, jotta ohjelma löytää, missä ne täsmäävät, ja liittää ne yhteen. Aloita valitsemalla 2–6 kuvatiedostoa ({VALITSE KUVATIEDOSTOT}). On hyödyllistä valita kuvat vasemmalta oikealle -järjestyksessä, jotta alustava karkea kohdistus on helpompaa. Kuvat liitetään aluksi yhteen ja näytetään pienellä läpinäkyvällä päällekkäisyydellä. Esikohdistuksen valintaikkuna (yllä) pyytää sinua vetämään kuvat karkeaan kohdistukseen. Vedä kuvat oikeaan vasemmalta oikealle -järjestykseen. Vedettävä kuva voi olla päällekkäin muiden kuvien kanssa. Jotta olisi selvää, mitä kuvaa vedetään, vedä kuvan keskikohdan läheltä. Kun kuvat ovat oikeassa järjestyksessä, kohdista kukin kuva vasempaan naapuriinsa. Parhaiten toimii eteneminen vasemmalta oikealle. Siirrä kuvaa vaaka- ja pystysuunnassa karkeaan kohdistukseen vasemman naapurinsa kanssa, ja käännä sitten kuvaa tarvittaessa vetämällä alareunaa vasemmalle tai oikealle – kuva kääntyy sen ja vasemmanpuoleisen kuvan päällekkäisyyden keskipisteen ympäri. Nopein menetelmä on kohdistaa päällekkäisyyden keskialue ensin, ja kääntää sitten oikeanpuoleista kuvaa tarvittaessa tuomaan ylä- ja alapäällekkäisyysalueet kohdistukseen. Äärimmäistä tarkkuutta EI tarvita. Kuvien tulisi olla oikein kaarevia ja sopia hyvin yhteen. Jos näin ei ole, 'lens mm' (polttoväli, 35 mm vastaava) tarvitsee säätöä. Kuvan kaarevuus muuttuu, kun lens mm -arvoa säädetään. Alkuarvo saadaan EXIF-metatiedoista, jos saatavilla, ja tämä on yleensä riittävän hyvä. Jos kuvissa ei ole kaarevuutta (esim. skannatut kuvat), käytä 'no curve' -valintaruutua asettaaksesi 'lens mm' käytännössä äärettömäksi. - Jos jokin kuvista on rajattu, EXIF-polttovälistä riippuva matematiikka ei toimi. Voit ehkä kompensoida tätä kasvattamalla polttoväliä kohdassa 'lens_mm'. - 'manual align' -valintaruutu käyttää manuaalista esikohdistusta lopullisena kohdistuksena. Tämä on tarkoitettu kuville, joissa ei ole selkeitä piirteitä, joita tarvitaan kuvien kohdistamiseen. Tämä vaihtoehto sallii myös sen, että kuvilla on nolla päällekkäisyyttä. - Paina [proceed], kun esikohdistus on valmis, ja ohjelma tekee hienokohdistuksen ja liittää kuvat. Sisäisesti kuvia siirretään ja käännetään, ja täsmäävyyden astetta arvioidaan. Tämä tehdään kasvavilla kuvakoilla, kunnes paras kohdistus löytyy. Tämä voi kestää minuutin tai enemmän, riippuen suorittimen nopeudesta ja kuvan koosta. Voit nopeuttaa prosessia huomattavasti, jos pienennät tulokuvat 2/3- tai 1/2-kokoon. Tee tämä myös, jos prosessi epäonnistuu muistin puutteen vuoksi. - +image: pano-adjust.jpg - Kun hienokohdistus on valmis, yhdistetty kuva näytetään. Yllä oleva valintaikkuna käynnistetään kirkkauden hienosäätöä varten. Saatat nähdä rajan kuvien välillä, jos niillä ei ole samaa kirkkautta. Valitse kuva yläreunan valintanapeilla. Käytä [automaattinen väri] -painiketta toistuvasti parantaaksesi automaattisesti kuvien kirkkaus-/värivastaavuutta. Perustakuva on tällä hetkellä valittu kuva. Kokeile eri perustakuvia nähdäksesi, mikä toimii parhaiten. Jos kuvat ovat pahasti epäsuhtaisia kirkkaudeltaan, valitse suurin poikkeava ja käytä kirkkaussäädintä muuttaaksesi kirkkautta vastaamaan muita, ja käytä sitten [automaattinen väri]. Vastaavuuden ei tarvitse olla kovin hyvä, koska 'Blend Width' (seuraavaksi) peittää jäljellä olevat erot. Käytä 'File Color' -painiketta palauttaaksesi kirkkaustasot tulokuvatiedostoista. - 'Blend Width' -säädin määrittää, miten kuvat sekoitetaan yhteen: kuvien päällekkäisyyksissä kirkkautta muutetaan tämän monen pikselin matkalla, jotta peitetään epätasapainot, joita ei voida täysin korjata. Oletusarvo on 1 pikseli, mikä tekee kirkkauseroista ilmeisiä. - Jos kuvat eivät kohdistu täydellisesti, voit ehkä parantaa kohdistusta työntämällä kuvia hiirellä kohdistukseen. Valitse 'Mouse Warp' ja valitse jokin kuvista valintanapeilla. Vedä sitten hiirtä pitkin kuvan reunaa, jonka tulisi kohdistua naapurinsa kanssa, siirtäen kuvaa kohdistukseen. Kuvaa siirretään paikallisesti hiiren ympärillä, kun taas kauempana olevat osat pysyvät paikoillaan. Kuvat, joissa on parallaksisiirtymää, vaativat kompromissin, koska sekä etualaa että taustaa on mahdotonta pitää kohdistuksessa samanaikaisesti. - Flatten image -säädintä voidaan käyttää kuvan "suoristamiseen", mikä suoristaa kaarevia viivoja (esim. kaarevia rakennuksia). Arvolla nolla ei ole vaikutusta, ja arvo 1.0 tasoittaa kuvan täysin. - Kun olet valmis, käytä toimintoja {OIKAISE}, {VÄÄRISTÄ KUVA}, {RAJAA} jne. lopullisiin säätöihin. - ^Skannatut kuvat Skannatut kuvat voidaan yhdistää, jos päällekkäisyyttä on riittävästi. Valitse 'no curve', koska kaarevuutta ei ole. - ^Automaattinen vääristys Kuvia vääristetään hieman eri suuntiin kohdistuksen aikana parhaan vastaavuuden löytämiseksi. Tämä kompensoi kameran horisontin siirtymiä tai kiertoa, jotka aiheuttavat kuvan vääristymiä ja heikentävät sovituksen laatua. Jos kahden kuvan päällekkäisyysalueella on suuri kohde, joka on liikkunut kuvien välillä, kohdistusprosessi voi mennä sekaisin yrittäessään sovittaa kuvia, mikä tekee kohdistuksesta hyvin huonon. Valitsemalla 'no auto warp' voit ehkä saada kohdistuksen onnistumaan tai pienemmän virheen. Toinen vaihtoehto on valita manuaalinen kohdistus. - ^Panoraamojen yhdistäminen Voit tehdä panoraaman enintään 6 kuvasta yhdellä kertaa. Voit myös yhdistää panoraamoja, jotka sopivat yhteen sivuiltaan, esim. yhdistää 4 kuvan panoraaman toisen 4 kuvan panoraaman kanssa 8 kuvan panoraaman tekemiseksi. Sinun on pysäytettävä normaali kuvan kaarevoituminen, kun yhdistät panoraamoja, koska panoraamakuvat ovat jo kaarevia (olettaen, ettet ole käyttänyt 'flatten'-vaihtoehtoa lopullisessa panoraaman valintaikkunassa). Pysäytä kuvan kaarevoituminen valitsemalla 'no curve' -ruutu esikohdistuksen valintaikkunassa. - ^Panoraaman rajoitukset Lähellä olevia kohteita sisältävät panoraamat voivat olla hankalia: valokuvia otettaessa varo kääntämästä kameraa objektiivin läpi kulkevan akselin ympäri mahdollisimman vähäisellä sivuttaisliikkeellä, muuten kuvat saattavat kohdistua huonosti, koska etualan kohteet siirtyvät suhteessa taustaan (parallaksi). Tämä ei ole ongelma, kun kohde on 50+ metrin päässä, koska pieni sivuttaisliike vaikuttaa kuvaan vain vähän. Pidä kamera vaakasuorassa välttääksesi suuren pystysuuntaisen siirtymän (horisontin siirtymän), joka voi aiheuttaa kuvan vääristymiä, joita ei voida täysin korjata. Vältä kameran kiertämistä samasta syystä. - ^Pystysuuntainen panoraama Tämä voidaan tehdä kääntämällä tulokuvat 90°. Panoraamassa valitse kuvat järjestyksessä ylhäältä alas, jotta ylin kuva on vasemmalla ja alin oikealla. Tee panoraama normaalisti. Käännä tuloskuvaa niin, että vasemmasta tulee ylä. - - TOPIC: NÄYTÄ CIM-TIEDOSTOT Näytä nykyisen tai viimeisimmän yhdistetyn kuvan tulotiedostot ponnahdusikkunassa. Vain nykyinen tai viimeisin joukko muistetaan. - - TOPIC: MASHUP +image: mashup.jpg - Järjestä useita kuvia ja tekstiä asetteluun. Kuvia voidaan lisätä, muuttaa kokoa, kääntää ja siirtää vetämällä hiirellä. Kuvat voidaan tehdä kokonaan tai osittain läpinäkyviksi valituilla alueilla. Tekstiä voidaan lisätä, siirtää, muuttaa kokoa ja kääntää. Tekstin ominaisuuksia voidaan määrittää: fontti, koko, väri, ääriviiva, varjo, läpinäkyvyys. Viivoja ja nuolia voidaan lisätä. Tämän esimerkki näyttää joitakin mahdollisuuksista. - +image: mashup1.png - Ensimmäisessä Mashup-valintaikkunassa valitse tausta- tai asettelukuva, johon muut kuvat sijoitetaan. Valitse olemassa oleva kuva tai luo uusi yksivärinen kuva, jolla on määritetty koko ja väri. Voit myös avata aiemmin tallennetun mashup-projektin ja jatkaa muokkausta. - +image: mashup2.png - Toinen Mashup-valintaikkuna on valinta: muokkaa kuvia, muokkaa tekstiä, muokkaa viivoja ja nuolia, skaalaa suuremmaksi, tallenna valmis yhdistetty kuva (Done) tai hylkää kuva (Cancel). Kolme ensimmäistä vaihtoehtoa johtavat valintaikkunoihin, joissa vastaavat muokkaukset tehdään. Kukin näistä palaa tähän valintaikkunaan, kun se on valmis, joten voit lisätä tai muokata kuvia, tekstiä ja viivoja/nuolia missä tahansa järjestyksessä. Rescale selitetään alla. - +image: mashup3.jpg - Käytä tätä valintaikkunaa valitaksesi ja sijoittaaksesi kuvia asetteluun ja muuttaaksesi niiden ulkoasua: koko, kierto, sijainti, läpinäkyvyys. Kuva voi olla osittain tai kokonaan läpinäkyvä, joko kokonaisuudessaan tai määritetyillä alueilla. Tämä tarkoittaa, että taustakuva tai päällekkäinen kuva voi näkyä läpi läpinäkyvien alueiden läpi. Add Image -painike johtaa galleriatiedoston valintaikkunaan ({VALITSE KUVATIEDOSTOT}). Valitut kuvat sijoitetaan asetteluun. Kun kuvat on lisätty, napsauta mitä tahansa kuvaa valitaksesi sen muokattavaksi. Vedä kuvaa keskeltä sijoittaaksesi kuvan asetteluun. Vedä oikeaa alakulmaa muuttaaksesi kuvan kokoa. Käytä valintaikkunan säätimiä kuvan säätämiseen. Valintaikkunan säätimet vaikuttavat viimeksi lisättyyn, napsautettuun tai vedettyyn kuvaan. 'Prev'- ja 'Next'-painikkeet käyvät läpi kuvia yksitellen, vilkuttaen valittua kuvaa. Tätä voidaan käyttää, kun päällekkäiset kuvat vaikeuttavat halutun kuvan valitsemista napsauttamalla. Scale skaalaa kuvan uudelleen. Angle kääntää kuvaa. Stacking Order -painikkeet nostavat tai laskevat kuvaa suhteessa muihin kuviin – tämä määrittää, mikä päällekkäisistä kuvista on päällimmäisenä. Base Transparency tekee koko kuvasta osittain läpinäkyvän. [maalaa]-painiketta käytetään tekemään mikä tahansa osa kuvasta osittain tai kokonaan läpinäkyväksi käyttäen alla näkyvää Paint-valintaikkunaa. [vääristä]-painiketta käytetään kuvan taivuttamiseen tai vääristämiseen käyttäen alla näkyvää Warp-valintaikkunaa. 'black margins' -valintaruutua voidaan käyttää poistamaan muiden muokkaustoimintojen, esim. vääristyksen, jättämät mustat reunukset. Nämä tehdään läpinäkyviksi. 'Image is fixed' -painike estää kuvan siirtämisen hiirellä tai näppäimistöllä. Tämä on hyödyllistä, kun kuvia hienokohdistetaan ja vahingossa tapahtuva liike halutaan estää. Margins-säätimiä voidaan käyttää tekemään kuvan reunat läpinäkyviksi. Hard margins leikkaa kuvan reunat pois. Blend margins tekee reunoista osittain läpinäkyviä sulauttaakseen ne taustaan tai muihin päällekkäisiin kuviin. - +image: mashup4.png - "Maalaa" enemmän tai vähemmän läpinäkyvyyttä valituille kuva-alueille. Napsauta kuvaa valitaksesi sen. Hiiren osoitin on ympyrä, joka näyttää vaikutusalueen. Käytä radius-arvoa koon säätämiseen. Vedä hiirtä vasemmalla painikkeella kuvan yli tehdäksesi siitä läpinäkyvän ympyrän peittämillä alueilla. Vedä oikealla painikkeella tehdäksesi siitä läpinäkymättömän. Jos Gradual on valittuna, läpinäkyvyysmuutokset tehdään hitaasti hiirtä vedettäessä. Määritä power-arvo hiiren keskikohdalle ja reunoille säätääksesi muutosnopeutta. - +image: mashup5.png - Warp-valintaikkunaa käytetään kuvan vääristämiseen. Napsauta kuvaa valitaksesi sen. Vedä kuvaa hiirellä – kuva vääristyy tai venyy paikallisesti hiiren suuntaan (kuin kumilevy). Vääristyksen alue määräytyy suunnilleen warp span -arvon mukaan, joka on murto-osa kuvan koosta. Jokainen veto on askel, joka lisätään edellisiin askeliin. Viimeisimmät askeleet voidaan peruuttaa painikkeella [undo last], ja suoristamaton kuva voidaan palauttaa painikkeella [undo all]. - +image: mashup6.png - Edit Text -valintaikkunaa käytetään tekstin sijoittamiseen asetteluun. Kirjoita tekstiä ja paina [Käytä]. Sinua pyydetään napsauttamaan asettelua kohdasta, johon teksti lisätään. Vedä se paikalleen, ja käytä sitten valintaikkunan säätimiä asettaaksesi fontin, koon, värin, kulman, taustavärin, ääriviivan koon ja värin, varjon koon ja värin sekä kunkin näiden läpinäkyvyyden. Vedä tekstiä uuteen sijaintiin milloin tahansa. Napsauta mitä tahansa olemassa olevaa tekstiä näyttääksesi sen ominaisuudet valintaikkunassa ja muokataksesi niitä. Napsauta tekstiä ja paina Delete poistaaksesi sen. Kun muokkaus on valmis, paina [OK] palataksesi toiseen Mashup-valintaikkunaan. - +image: mashup7.png - Edit Line/Arrow -valintaikkunaa käytetään viivojen tai nuolien sijoittamiseen asetteluun. Se toimii hyvin samalla tavalla kuin tekstin lisääminen. Syötä pituus ja leveys ja paina [Lisää]. Sinua pyydetään napsauttamaan asettelua kohdasta, johon viiva lisätään. Asetteluun sijoitetaan viiva, tai nuoli, jos jokin Arrow head -vaihtoehdoista on valittuna. Vedä viiva/nuoli haluttuun sijaintiin. Säädä pituutta, leveyttä, kulmaa ja ominaisuuksia (tausta, ääriviiva, varjo) valintaikkunan avulla. Voit myös vetää viivan/nuolen jompaakumpaa päätä asettaaksesi kyseisen pään sijainnin, jättäen toisen pään paikoilleen. - Voit käyttää hiirtä asettelun kohteiden siirtämiseen ja koon muuttamiseen: • napsauta kohdetta valitaksesi sen – se vilkkuu vahvistaakseen valinnan. • vedä suunnilleen keskeltä sijoittaaksesi kohteen. • vedä oikeaa alakulmaa muuttaaksesi kohteen kokoa. • viivan/nuolen tapauksessa vedä jompaakumpaa päätä siirtääksesi vain sitä päätä. - Näppäimistön nuolinäppäimiä voidaan myös käyttää parhaillaan valitun kohteen siirtämiseen 1 pikselin askelin. - Voit lisätä kuvia, jotka on tallennettu toiminnolla {VALITSE ALUE}. Edit Images -valintaikkunassa paina [Lisää] käynnistääksesi tiedoston valintaikkunan. Käytä galleriaikkunan [Ylä]-painiketta, valitse 'saved_areas'. Avaa mikä tahansa sieltä löytyvä .png-kuva. Alkuperäistä alueen ääriviivaa käytetään, ja alueen sekoitus toimii näistä reunoista. - ^Mashup-projektitiedostot Voit tallentaa projektin ja avata sen myöhemmin jatkaaksesi muokkausta. Mashup-projekti rakennetaan uudelleen käyttäen näitä kuvia ja projektitiedostoon tallennettua dataa: kuvien ja tekstin sijainnit, skaalaukset, läpinäkyvyys jne. - ^Mashup-uudelleenskaalaus Hyvin suuren asettelun (yli 20 megapikseliä) kanssa työskentely voi olla melko hidasta. Suuren peitekuvan vetäminen voi olla hidasta ja nykivää. Voit työskennellä paljon nopeammin, jos käytät pienempää asettelua projektin rakentamiseen, ja suurennat sen vasta lopuksi. Lopullisessa kuvassa ei menetetä resoluutiota, koska peitekuvat ja teksti luodaan uudelleen lähtötiedoista. Rescale-painike mahdollistaa projektin suurentamisen 2-, 3- tai 4-kertaiseksi. Käytettävissä on myös nollausvaihtoehto alkuperäisen pienemmän projektikoon palauttamiseksi. Tällä menetelmällä voit työskennellä 10 megapikselin asettelun kanssa ja skaalata sen jopa 160 megapikseliin, kun olet valmis. Suurempaa asettelua voidaan silti muokata suoraan jälkikäteen, mutta se on hitaampaa. - - TOPIC: KUVARYHMÄ +image: image-array.jpg - Valitse useita kuvia ja yhdistä ne kompaktiksi taulukoksi väritetyn kehyksen sisään. - Ensimmäinen valintaikkuna näkyy ylävasemmalla. Background Color on ääriviivakehyksen ja sisältyvien kuvien välisten tilojen väri. Array Width on tulostaulukon kokonaisleveys, ja Margin on kaikkia kuvia ympäröivän ulkoreunuksen leveys. Taulukon korkeus määräytyy valittujen kuvatiedostojen määrän ja niiden kehykseen sovittamiseen tarvittavan tilan mukaan. Image Columns määrittää kuvasarakkeiden määrän (6 yllä olevassa esimerkissä). Rivien määrä riippuu valittujen kuvatiedostojen määrästä. Separation-arvot asettavat sisältyvien kuvien välisen vaaka- ja pystysuuntaisen tilan. - Valitse kuvatiedostot ({VALITSE KUVATIEDOSTOT}), ja paina sitten [Jatka], kun olet valmis. Tuloskuva tehdään muutamassa sekunnissa (tai minuuteissa satojen kuvien tapauksessa). Tällä kuvalla on tyypillisesti hyvin epätasainen alareunus, kuten yllä olevassa oikeassa yläkuvassa näkyy. Kuvien järjestys taulukossa määräytyy valintajärjestyksen mukaan. Ylin rivi täytetään ensin, vasemmalta oikealle, sitten toinen rivi jne. - Optimize-valintaikkuna käynnistyy automaattisesti. Se voi järjestää kuvat uudelleen niin, että alareunus on tasaisempi. Paina [Aloita] ja odota kuvan optimointia. Voit seurata edistymistä. Toiminto lopettaa, kun löydetään optimi, joka tekee alareunuksesta tasaisen 2 pikselin tarkkuudella. Se voi jatkaa hakua loputtomiin, jos tätä tavoitetta ei saavuteta. Paina [Pysäytä] pakottaaksesi optimointitoiminnon lopettamaan parhaalla tähän mennessä löydetyllä ratkaisulla. Jos optimointi onnistuu, saat tasaiset sarakkeet, kuten alaoikeassa kuvassa näkyy. Jos alareuna on edelleen epätasainen optimoinnin jälkeen, sinulta kysytään, haluatko lisätä reunuksia joihinkin kuviin tehdäksesi alareunasta tasaisen. Tämä johtaa tasaiseen alareunaan, mutta pystysuuntaiset välit eivät enää ole yhtä suuret. - VIHJE: Optimointi toimii parhaiten, jos kuvia saraketta kohden on vähintään neljä (mieluummin enemmän). Tämä antaa optimoijalle riittävästi joustavuutta löytää ratkaisu, jossa alareuna on tasainen. - Viimeinen valintaikkuna ilmestyy, näkyy alavasemmalla. Sinun on nyt annettava tiedostonimi taulukollesi. Tiedoston tallennusvalintaikkuna käynnistyy, ja voit tallentaa uuden taulukkotiedoston mihin tahansa. Jos copy metadata -vaihtoehto on valittu, metadata kopioidaan valitusta tulotiedostosta tulostiedostoon. Tämä on hyödyllistä, jos kuvat ovat muokattuja versioita ja haluat taulukon sisältävän muokkaushistorian viimeisimmälle versiolle (tai millä tahansa versiolle). - - TOPIC: ERÄVALIKKO Nämä ovat toimintoja, jotka käsittelevät useita valittuja kuvatiedostoja, muutamasta tuhansiin. Nämä toiminnot voidaan peruuttaa kesken prosessin Escape-näppäimellä, mutta tämä jättää osan tiedostoista käsitellyiksi ja osan ei. Ponnahdusraportti näyttää tiedostonimet niitä käsiteltäessä. - - TOPIC: ERÄMUUNNA +image: batch-convert.jpg - Tätä toimintoa käytetään useiden kuvatiedostojen nimeämiseen uudelleen, muuntamiseen, skaalaamiseen ja siirtämiseen. Myös RAW-tiedostoja voidaan muuntaa kuvatiedostoiksi. Toiminto suoritetaan useissa rinnakkaisissa säikeissä maksiminopeuden saavuttamiseksi. - ^Valintaikkunan syötteet • Select Files - muunnettavat tiedostot ({VALITSE KUVATIEDOSTOT}). • Replace Text - korvaa tekstiä tiedostonimissä (katso alla). • New Name - valinnainen uusi nimi, lisätty teksti (katso alla). • Sequence Numbers - tulostiedostojen nimien perusluku ja lisäys. • New Location - valinnainen uusi kansiosijainti tulostiedostoille. • New Type - tulostiedostojen tiedostotyyppi, tai "no change". • Color Depth - määritä 8 tai 16 bittiä tif- tai png-tulosteelle. • Max. Width, Height - valinnaiset rajat tulostiedostoille (käytetään vain, jos downsize tai upsize on valittu) • Rescale - valinnainen skaalauskerroin tulostiedostoille • Delete Originals - Poista tulotiedostot onnistuneen muunnoksen jälkeen. • Copy Metadata - Kopioi kaikki metadata tulostiedostoihin. • Update Albums - korvaa albumitiedostot muunnetuilla tulostiedostoilla - ^Korvaa teksti Jos tähän syötetään tekstiä, tiedostonimet tarkistetaan tämän tekstin varalta, ja jos se löytyy, annettu korvaava teksti asetetaan tilalle. Korvaavalla tekstillä voi olla eri pituus, ja se voi olla myös tyhjä, jolloin teksti poistetaan tiedostonimestä. - ^Uusi nimi ja lisäosat Uudessa tiedostonimessä voi olla lisättyä tekstiä: valokuvan päivämäärä (EXIF-metatiedoista), juokseva numero tai alkuperäinen tiedostonimi. Määritä, mitä ja mihin lisätään, seuraavasti: • $oldname - Tähän lisätään alkuperäinen tiedostonimi • $sss - Tähän lisätään juokseva numero. Katso alla. • $yyyy $mm $dd - Valokuvan päivämäärä lisätään näihin kohtiin. - Esimerkki: San Francisco $yyyy:$mm:$dd $oldname $sss Tulotiedosto "Golden Gate Bridge.jpg", jonka valokuvan päivämäärä on 12. toukokuuta 2014, muuntuisi tulostiedoston nimeksi "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg". - Kohdassa "$sss" määritä kentän pituus 's'-merkkien lukumäärällä, esim. "$ss" riittää juokseville numeroille arvoon 99 asti. Etunollat lisätään juokseville numeroille, joissa on vähemmän numeroita. Juoksevat numerot, jotka eivät mahdu määritettyyn pituuteen, tehdään tarvittavan pituisiksi. Muista, että tiedostonimien lajittelujärjestys gallerioissa on tarkasti ascii-järjestys, joten numerosarja 1, 2 ... 9, 10 lajittuu järjestykseen 1, 10, 2 ... 9. Voit säilyttää numeerisen järjestyksen määrittämällä kentän pituudeksi 2 ($ss), jolloin saadaan sarja 01, 02 ... 09, 10. - Joko "$oldname" tai "$sss" on oltava läsnä varmistaakseen tulostiedostojen nimien yksilöllisyyden. Jos New Location puuttuu tai on muuttumaton, delete originals -asetus jätetään huomiotta. Jos tulostiedosto on jo olemassa, tulotiedostoa ei muunneta. - ^Enimmäisleveys ja -korkeus Jos downsize ja/tai upsize on valittu, tulostiedostojen kokoa muutetaan näiden rajojen sisällä, säilyttäen alkuperäinen leveys/korkeus-suhde. Jos downsize on valittu, näitä rajoja suuremmat tiedostot pienennetään pysyäkseen rajojen sisällä. Jos upsize on valittu, näitä rajoja pienemmät tiedostot suurennetaan niin, että joko leveys tai korkeus on vastaavassa rajassa. Tätä ei voida käyttää yhdessä Rescale-vaihtoehdon kanssa. - ^Uudelleenskaalaus Jos jokin painikkeista on valittu, tulostiedostot skaalataan valitulla kertoimella. Tätä ei voida käyttää yhdessä Max. Width and Height -vaihtoehdon kanssa. - ^Poista alkuperäiset Jos valittu, tulotiedostot poistetaan, mutta vasta sen jälkeen, kun tulostiedosto on luotu onnistuneesti. - ^Kopioi metadata Kaikki metadata kopioidaan tulotiedostosta tulostiedostoon. Jätä tämä vaihtoehto pois poistaaksesi metadatan. - ^Päivitä albumit Jos valittu, kaikki albumit, jotka sisältävät jonkin tulotiedostoista, päivitetään käyttämään muunnettuja tulostiedostoja. - ^Tiedostojärjestyksen säilyttäminen Jos määrität etunollatun juoksevan numeron ($sss), tulotiedostojen valintajärjestys säilytetään tulossijainnissa. Näin voit valita kuvatiedostoja halutussa järjestyksessä tai valita albumista, jossa kuvat ovat järjestyksessä, ja säilyttää tämän järjestyksen tuloksessa. - - TOPIC: ERÄKOPIOI/SIIRRÄ Kopioi tai siirrä valitut kuvatiedostot uuteen sijaintiin. Valitse tulotiedostot ({VALITSE KUVATIEDOSTOT}) mistä tahansa Fotocxin tuntemasta kansiosta. Jos "Delete Originals" on valittu, tulotiedostot poistetaan sen jälkeen, kun ne on siirretty onnistuneesti uuteen kansioon. Tässä tapauksessa kaikki albumit, jotka viittaavat nyt poistettuihin tulotiedostoihin, päivitetään uusilla tiedostosijainneilla. - - TOPIC: ERÄOIKAISU Tämä toiminto oikaisee kierrettyjä tai käännettyjä (peilattuja) kuvatiedostoja. Se perustuu EXIF-tietoihin selvittääkseen, onko tiedosto kierretty/käännetty ja mihin suuntaan. Se on paljon nopeampi kuin Batch Convert. Voit yksinkertaisesti valita kaikki mahdolliset tiedostot ja antaa toiminnon löytää ne, jotka tarvitsevat korjausta. Hakunopeus on noin 3000 kuvatiedostoa minuutissa tehokkaalla tietokoneella. Tiedostojen etsimiseen on kaksi vaihtoehtoa. [Valitse tiedostot]-painike johtaa galleriatiedoston valintaikkunaan ({VALITSE KUVATIEDOSTOT}). Jos 'Survey all files' on valittu, kaikki kuvatiedostot ylätason kansioissasi haetaan. - - TOPIC: ERÄPOISTA/ROSKAKORIIN Valitse tiedostot ({VALITSE KUVATIEDOSTOT}). Valitse vaihtoehto: poista tai siirrä roskakoriin. [Jatka]. Tiedostot luetellaan ponnahdusraportissa niitä poistettaessa tai siirrettäessä roskakoriin. Kun kaikki tiedostot on poistettu/siirretty roskakoriin, albumit tarkistetaan ja poistetut tiedostot poistetaan niistä. - - TOPIC: ERÄPEITEKUVA +image: batch-overlay.png - Pieni peitekuva voidaan lisätä valittuun kohtaan valituissa tulokuvissa. Tätä voidaan käyttää lisäämään tekijätiedot, tekijänoikeusmerkintä jne. kuvien päälle. - Valmistele peitekuva seuraavasti: Käytä Blank Image -toimintoa luodaksesi pohjakuvan tekstiä varten. Skaalalla ei ole väliä, joten tee siitä tarvittua suurempi. Käytä Paint Transparency -toimintoa maalataksesi koko pohjakuvan läpinäkyväksi. Käytä toimintoa {MERKINTÄ} > draw text sijoittaaksesi halutun tekstin pohjakuvaan, käyttäen fonttia, väriä ja muita ominaisuuksia halutulla tavalla. Skaalaa teksti täyttämään suurin osa pohjakuvasta. Pohjakuva (tausta) on läpinäkyvä. Poista ylimääräiset reunukset toiminnolla {RAJAA} tarvittaessa. Tallenna lopullinen kuva. Kätevä sijainti on /saved_areas, mutta mitä tahansa kansiota voidaan käyttää. Tätä kuvaa voidaan nyt käyttää peitekuvana Batch Overlay -toiminnossa. - Käytä ^Valitse isäntäkuvatiedostot^ -painiketta valitaksesi isäntäkuvatiedostot, jotka saavat peitekuvan. Käytä ^Valitse peitekuvatiedosto^ -painiketta valitaksesi peitekuvatiedoston. - Kaksi ^Peitekuvan sijainti^ -syötettä määrittävät, mihin kohtaan isäntäkuvaa peitekuva sijoitetaan, 1–99 % etäisyydestä ylhäältä alas, ja 1–99 % etäisyydestä vasemmalta oikealle. 0/0 tarkoittaa vasenta yläkulmaa, 99/99 tarkoittaa oikeaa alakulmaa. Peitekuva sijoitetaan niin, ettei se ulotu isäntäkuvan reunojen ulkopuolelle. - Määritä ^Peitekuvan leveys^ prosenttiosuutena isäntäkuvan leveydestä. Korkeus asetetaan säilyttämään leveys/korkeus-suhde. Jos ^Pidä leveys vakiona ikkunan koolle^ on valittu, peitekuvan visuaalinen koko pidetään vakiona alla määritetylle ikkunakoolle. Ilman tätä "korkealla" kuvalla, joka näytetään suurin vasen ja oikea reunuksin, olisi visuaalisesti pienempi peitekuva. Alkuperäinen ikkunakoko on nykyinen ikkuna. Voit syöttää minkä tahansa koon. Paina ^päivitä^ asettaaksesi nykyisen ikkunan, jos se on muuttunut. - Jos ^Korvaa isäntätiedostot^ on valittu, tulon isäntätiedostot korvataan peitekuvalla varustetuilla tulostiedostoilla. Jos ^Tee uusia versioita^ on valittu, tulon isäntätiedostoista luodaan uusia versioita. - - TOPIC: ERÄ-KEYWORDIT +image: batch-keywords.jpg - Lisää, poista tai muuta useiden kuvatiedostojen keywords kerralla. - Käytä [select files]-painiketta valitaksesi kuvatiedostot ({VALITSE KUVATIEDOSTOT}). - Valintaikkuna näyttää kaksi listaa keywords-arvoista: ne, jotka lisätään valittuihin tiedostoihin, ja ne, jotka poistetaan. Käytettävissä olevat keywords näkyvät alla olevassa Defined Keywords -ikkunassa. Yksi näistä voidaan lisätä nykyiseen valittuun listaan (add tai remove) napsauttamalla sitä. Keyword voidaan poistaa kummasta tahansa listasta napsauttamalla sitä. Korvataksesi keywords-arvoja, määritä uudet keywords add-listaan ja vanhat keywords remove-listaan. - Jos määriteltyjen keywords-arvojen lista on pitkä, voi olla helpompaa kirjoittaa haluttu keyword kohtaan Enter New Keyword. Olemassa olevat keywords, jotka vastaavat tähän mennessä kirjoitettua, näkyvät kohdassa Matching Keywords, ja voit osoittaa ja napsauttaa jotakin näistä lisätäksesi keywordin kuvaan. Jos syötetty keyword on uusi (vastaavaa keywordia ei näytetä), paina [Lisää], kun keyword on valmis. Se lisätään valittuun keyword-listaan ja määriteltyjen keywords-arvojen listaan category-luokan "nocatg" alle. - Jos käytät keyword categories -luokkia, voit valita category-luokan, jolloin määriteltyjen keywords-arvojen listassa näytetään vain kyseiset keywords. Jos keywords-listasi on valtava, tämä voi pienentää listan hallittavaan kokoon osoittamista ja napsauttamista varten. - Saadaksesi listan kuvista, joilla on tietyt keywords, jotka haluat poistaa tai korvata, käytä toimintoa {HAE KUVIA} löytääksesi kuvat, käynnistä sitten tämä toiminto ja käytä [select files] lisätäksesi kaikki juuri löytämäsi kuvatiedostot, tai valitse mikä tahansa osajoukko. - - TOPIC: ERÄNIMEÄ KEYWORDIT UUDELLEEN +image: batch-rename-keywords.png - Nimeä uudelleen minkä tahansa määrän keywords-arvoja ja sovella nämä muutokset koko kuvakokoelmaasi. Napsauta keywordia, jonka haluat nimetä uudelleen, määriteltyjen keywords-arvojen listasta, syötä uusi nimi Rename to -kenttään, ja napsauta sitten nuolipainiketta lisätäksesi tämän nimiparin oikeanpuoleiseen listaan. Toista jokaiselle uudelleennimettävälle keywordille. Napsauta nimiparia listassa poistaaksesi sen. Paina [Jatka], kun olet valmis. Jos haluat poistaa keywordin nimeämättä sitä uudelleen, käytä uutena nimenä sanaa 'delete'. - Ponnahdusikkuna näyttää niiden kuvatiedostojen määrän, jotka sisältävät vaikutuksen alaiset keyword-nimet. Paina [Kyllä] jatkaaksesi. Päivitysnopeus on noin 500/minuutti tehokkaalla tietokoneella. Kun Fotocx käynnistetään seuraavan kerran, tiedostojen indeksointitoiminto päivittää kaikki thumbnails samoille kuville, koska tiedoston muokkauspäivämäärä on muuttunut. - - TOPIC: ERÄPOISTA KEYWORDIT +image: batch-purge-keywords.jpg - Poista (delete) ei-toivotut keywords kaikista kuvatiedostoista. Tämä on erityisen hyödyllistä päästäkseen eroon ei-toivotuista keywords-arvoista, jotka on lisätty ladatuista kuvatiedostoista. Napsauta ei-toivottuja keywords-arvoja valintaikkunan vasemmalla puolella lisätäksesi ne poistolistaan valintaikkunan oikealle puolelle. Paina [proceed], kun olet valmis. - - TOPIC: ERÄ KUVAN PÄIVÄMÄÄRÄ +image: batch-photo-date1.png +image: batch-photo-date2.png - Korjaa nopeasti erä valokuvia, joilla ei ole valokuvan päivämäärää/aikaa tai joilla on virheellinen sellainen. Käytä [select files]-painiketta avataksesi galleriaikkunan, josta voit valita käsiteltävät kuvatiedostot ({VALITSE KUVATIEDOSTOT}). - Valokuvan päivämäärää/aikaa voidaan muuttaa kahdella tavalla: • Aseta uusi päivämäärä/aika (yllä oikea kuva): Syötä vain uusi vuosi (yyyy) – tiedostoissa korvataan vain vuosi. Syötä vain päivämäärä (yyyy:mm:dd) – päivämäärä korvataan, mutta ei aikaa. Syötä täysi päivämäärä/aika (yyyy:mm:dd hh:mm:ss) – molemmat korvataan. • Siirrä olemassa olevaa päivämäärää/aikaa (vasen kuva): Syötä + tai - arvoja mihin tahansa kuudesta kentästä: vuodet, kuukaudet, päivät, tunnit, minuutit, sekunnit. Päivämääriä/aikoja siirretään syötettyjen arvojen mukaan. - Siirretyt päivämäärä-/aika-arvot siirtyvät tarvittaessa seuraavaan korkeampaan arvoon: Aika 08:30 siirrettynä -50 minuuttia johtaa arvoon 07:40 Päivämäärä 2016-10-20 siirrettynä +6 kuukautta ja -30 päivää johtaa arvoon 2017-03-21 (Maaliskuussa on 31 päivää). - Jos valintaruutu 'test' on valittu, tuotetaan raportti valittujen tiedostojen vanhoista ja uusista päivämääristä/ajoista tarkastelua varten. Tiedostoihin ei tehdä muutoksia. Jos olet tyytyväinen tulosten oikeellisuuteen, poista valintaruutu ja aja uudelleen päivittääksesi tiedostot. - - TOPIC: ERÄMUUTA METADATA +image: batch-change-meta.png - Muokkaa metadataa useille kuvatiedostoille. Voit lisätä uutta metadataa, muokata olemassa olevaa metadataa ja poistaa metadataa. Käytä [select files]-painiketta avataksesi galleriaikkunan, josta valitset käsiteltävät tiedostot {VALITSE KUVATIEDOSTOT}. Syötä tag-nimet ja niille asetettavat arvot, tai jätä arvo tyhjäksi poistaaksesi tagin. Paina [käytä]. Saat vahvistusviestin, ja voit tässä vaiheessa jatkaa tai peruuttaa. Vasemmalla on lueteltu yleisesti käytettyjä tag-nimiä. Napsauta jotakin näistä lisätäksesi sen ensimmäiseen tyhjään tag-nimikenttään valintaikkunassa. Tämä lista tulee tiedostosta /metadata_picklist, jota voit muokata lisätäksesi muita tageja listaan. [Koko luettelo]-painike antaa tietoa siitä, miten saada lista kaikista käytettävissä olevista tag-nimistä. - - TOPIC: ERÄRAPORTOI METADATA +image: add-meta-tags.png +image: batch-report-meta.png - Raportoi mitä tahansa metadataa mille tahansa määrälle kuvia. Tulos on tekstitiedosto, joka näytetään järjestelmäsi oletustekstieditorissa. Voit käyttää tekstieditorin hakutoimintoja löytääksesi kuvia, jotka vastaavat haluttua metadataa, tai voit käyttää tekstitiedostoa syötteenä muille ohjelmille. Käytä [select files]-painiketta avataksesi galleriaikkunan käsiteltävien tiedostojen valitsemiseksi ({VALITSE KUVATIEDOSTOT}). [muokkaa]-painike avaa uuden valintaikkunan (oikealla), jossa voit valita raportoitavat metadata-tagit. Napsauta tagia vasemmassa sarakkeessa lisätäksesi sen oikeaan sarakkeeseen ja raporttiin. Napsauta tagia oikeassa sarakkeessa poistaaksesi sen. Napsauta viimeistä tagia vasemmassa sarakkeessa, "Other tag ...", kirjoittaaksesi minkä tahansa tag-nimen, joka ei näy listassa, joka sisältää vain todennäköisimmin tarvittavat tagit. - - TOPIC: ERÄ-GEOTAGIT +image: batch-geotags.png - Valitse useita kuvia ja lisää sama sijaintitieto niihin kaikkiin. Käytä [select files]-painiketta valitaksesi kuvatiedostot galleriaikkunasta ({VALITSE KUVATIEDOSTOT}). Hae sitten sijaintitiedot toiminnossa {MUOKKAA PÄÄMETADATAA} kuvatulla tavalla, käyttäen [Etsi]-painiketta tai napsauttamalla karttamerkkiä. Käytä tätä toimintoa myös korjaamaan epäjohdonmukaisuuksia sijainnin kirjoitusasussa tai latitude/longitude-tiedoissa. Jos location ja/tai country jätetään tyhjäksi, niitä ei päivitetä. Poistaaksesi location- tai country-tiedon, syötä nimeksi "null". Jos latitude ja longitude jätetään tyhjäksi, niitä ei päivitetä. Poistaaksesi latitude- ja longitude-arvot, syötä "0" molempiin arvoihin. Voit päivittää vain location/country, vain latitude/longitude, tai molemmat. Käytännössä saatat huomata, että kameran GPS lisää latitude- ja longitude-arvot ilman location- ja country-tietoja, tai se käyttää ei-toivottua kieltä, tai kaikki kirjaimet isolla, tai jotain muuta korjausta vaativaa arvoa. - - TOPIC: VIE TIEDOSTOT Kopioi valitut kuvatiedostot toiseen kansioon. Tarkoitettu käyttö on tiedostojen kopioiminen jaettavaksi muiden kanssa, esim. tiedostojen lataaminen verkkosivustolle. Tulostiedostot ovat JPEG-muodossa. Voit valinnaisesti pienentää kuvia. Valitse kuvatiedostot napsauttamalla gallerian thumbnails-kuvia ({VALITSE KUVATIEDOSTOT}). Valitse kansio, johon kuvatiedostot kopioidaan. Jos 'export metadata' on valittu, myös rajattu joukko metadataa kopioidaan. Nämä ovat: valokuvan päivämäärä, keywords, tekijänoikeus, otsikko, kuvaus. - - TOPIC: TYÖKALUVALIKKO - - TOPIC: INDEKSOI TIEDOSTOT +image: index-files1.png - Fotocx tarvitsee tiedon kaikista kuvatiedostojesi kansio- ja tiedostonimistä sekä upotetusta metadatasta (päivämäärät, tags, geotags, otsikot, kuvaukset, arviot). Tämä data indeksoidaan nopeaa hakua varten. Fotocx luo myös thumbnail-kuvia, jotta galleriaikkunat (thumbnail-sivut) näytetään nopeasti. Fotocx ei muokkaa tai kopioi kuvatiedostojasi. Tarvittava tila on tyypillisesti 2 % kuvatiedostojesi tilasta. - Index Files -toiminto suoritetaan aina, kun Fotocx käynnistetään. Tämä toiminto luo puuttuvat thumbnails, korvaa vanhentuneet, ja päivittää metadataindeksin käyttäen kuvatiedostojesi nykyistä dataa. Tämä voi vaatia huomattavasti aikaa, jos sinulla on tuhansia uusia tiedostoja. - Fotocxin sisällä muokatut tai siirretyt kuvatiedostot hoidetaan automaattisesti. Index-toimintoa käytetään vain uusille kuvatiedostoille, jotka on luotu Fotocxin ulkopuolella (esim. uusi erä valokuvia on lisätty), sekä tiedostoille, joita on muokattu tai siirretty Fotocxin ulkopuolella. - Syötä ylätason kuvakansiosi (esim. /home//Pictures). Käytä [selaa]-painiketta paikantaaksesi ja lisätäksesi kansioita. Nämä kansiot ja niiden sisältämät alikansiot käsitellään. Ei ole väliä, jos muita tiedostoja on sekoittunut kuvien joukkoon. Poista merkintä napsauttamalla vastaavaa 'X':ää. - Syötä thumbnails-kansio, johon thumbnail-tiedostot tallennetaan. Käytä toimitettua oletusta tai aseta oma sijaintisi. - Jos olet käyttänyt kansio- tai tiedostonimiä kuviesi luokitteluun, voit hyödyntää näitä heti toiminnossa {HAE KUVIA}. Jos olet tallentanut päivämääriä, keywords, geotags, otsikoita tai arvioita kuviesi metadataan, myös nämä ovat haettavissa. Kun kuvat on indeksoitu, haku minkä tahansa näistä perusteella on lähes välitöntä. - ^Metadata Tags Seuraava metadata sisällytetään kuvaindeksiin oletuksena: • kansio- ja tiedostonimet • valokuvan päivämäärä/aika • tiedoston muokkauspäivämäärä/aika • otsikko ja kuvaus (exif-metadata) • arvio (0–5 tähteä) • keywords (käyttäjän merkinnät) • geotags (maan ja sijainnin nimet sekä latitude/longitude) • kamera: valmistaja, malli, objektiivi • valotus: aika, aukkoluku, polttoväli, ISO - ^Lisä Metadata tags +image: index-files2.png - Voit lisätä enintään 20 muuta metadata-tagia kuvatiedostoindeksiin. Tässä listassa olevaa metadataa voidaan hakea yhtä nopeasti kuin standarditageja. Et välttämättä tarvitse tätä, mutta jos sinun täytyy joskus hakea ei-standardeja metadata-tageja, voit lisätä ne tänne, jolloin hakunopeus on lähes välitön. Paina [select]-painiketta kohdassa "extra metadata" saadaksesi yllä olevan valintaikkunan. Napsauta tageja vasemmassa listassa lisätäksesi ne oikeaan listaan – indeksiin lisättävät tagit. Napsauta tagia oikeassa listassa poistaaksesi sen. Paina [done] vahvistaaksesi muutokset. Koko kuvakokoelmasi indeksoidaan uudelleen. Tämä sujuu nopeammin kuin alkuperäinen indeksointi, koska thumbnails-kuvia ei luoda uudelleen. - ^Indeksoimattomien tiedostojen ja kansioiden käyttö Indeksoimaton kuvatiedosto tai kansio on sellainen, jota ei sisälly ilmoittamiisi ylätason kuvakansioihin (ilmoittamiesi kuvakansioiden alikansiot sisältyvät aina). Voit siirtyä tällaiseen kansioon ja katsella thumbnails-kuvia normaalisti, ja voit katsella ja muokata tällaisia tiedostoja normaalisti. On olemassa rajoituksia, jotka sinun tulisi ymmärtää: • Nämä tiedostot puuttuvat kaikista hakutuloksista ja karttanäkymistä. • Thumbnails luodaan katseluhetkellä – galleriat ovat hitaita. Jos käytät kannettavaa (hidasta) tallennuslaitetta (esim. kameran SD-kortti), huomaat kankean suorituskyvyn. Thumbnails luodaan tarpeen mukaan, ja ne säilyvät laitteen poistamisen jälkeen. Ehdotus: kopioi tiedostot ilmoitettuun Fotocx-kansioon, ja tee sitten tarvitsemasi käsittelyt tästä sijainnista. Suorituskyky on paljon parempi. - ^Irrotettava tallennusväline (USB-asema) Jos ylätason kuvakansiosi sisältävät kansioita irrotettavalta asemalta, ja käytät Fotocxia ilman asemaa liitettynä, indeksidata ja thumbnails säilyvät silti, vaikka irrotettavat tiedostot ovat kadonneet. Kun irrotettava asema liitetään uudelleen ja Fotocx käynnistetään, viimeisin tila palautetaan. Jos tiedostoja on lisätty tai muokattu välillä, indeksidata ja thumbnails päivitetään. - - TOPIC: SIIRRÄ FOTOCX-KOTI Fotocx-kotikansio sisältää kaikki käyttäjän asetukset ja datan, mukaan lukien joitakin Fotocx-paketin tiedostoja, joita käyttäjä voi mukauttaa. Oletussijainti: /home//.fotocx. Jos useita Linux-versioita tai -julkaisuja on asennettu, voi olla suositeltavaa käyttää yhtä jaettua Fotocx-kotikansiota jokaiselle julkaisulle erikseen olevan sijaan. Sama voi päteä, jos useat käyttäjät tarvitsevat pääsyn samaan Fotocx-instanssiin. - Käytä tätä toimintoa siirtääksesi Fotocx-kotikansion johonkin muualle. Valitun kansion tulisi sisältää "fotocx" polun nimessä, tai "/fotocx" lisätään perään, jos ei sisällä. - Katso {KOMENTOPARAMETRIT} -home-parametri, jos haluat useita Fotocx-kuvakokoelmia, joita hallitaan erikseen. - - TOPIC: ASETUKSET +image: settings.jpg - Erilaiset käyttäjän asetukset ja mieltymykset kerätään ja tallennetaan tiedostoon /parameters. Useimmat muutokset tehdään välittömästi. Jotkin aiheuttavat Fotocxin uudelleenkäynnistymisen. - • Valitse haluttu 2-merkkinen kielikoodi. Fotocx käynnistyy uudelleen valitulla kielellä. • Startup View - Fotocxin käynnistyksen alkunäkymä. Recent Files: viimeksi katsotut kuvatiedostot Newest Files: viimeksi lisätyt/muokatut tiedostot Specific Gallery: määritetty kansiogalleria Album Gallery: määritetty albumigalleria Previous Gallery: edellisessä istunnossa viimeksi käytetty galleria Previous File: edellisessä istunnossa viimeksi katsottu tiedosto Specific File: määritetty kuvatiedosto Browse-painike: valitse kansio, albumi tai kuvatiedosto • Background - Tiedosto- ja Gallerianäkymä-ikkunoiden taustavärit • Menu Style - valikon näyttötyyli: kuvakkeet, teksti tai molemmat • Menu Colors - valikon tekstin väri ja taustaväri • Dialog Font - valikkojen ja valintaikkunoiden fontti • Show Hidden - jos valittu, näytä piilotetut tiedostot ja kansiot • Zoom Speed - Valitse 1–8 napsautusta tai [+]-näppäintä 2-kertaista kuvan suurennusta kohden • JPEG files - laatutaso, oletus 90, käytä 70+ hyvälle laadulle • Curve Node - muokkauskäyrien solmujen vähimmäisväli, % asteikosta. Oletus on 5 % asteikosta. Käytä suurempaa arvoa kosketuslevyille. • Image Position - kuva on vasemmalla/keskellä/oikealla leveämmässä ikkunassa • Confirm Exit - ponnahdusvalintaikkunan vaihtoehto: haluatko todella lopettaa? • Index Level - katso alla • RAW Loader - katso alla • RAW Options - katso alla • RAW Files - käytettyjen RAW-tiedostotyyppien lista • Video Files - käytettyjen videotiedostotyyppien lista • Video App - katso alla - ^Tiedoston laatu ja pakkaus JPEG-tiedoston laatutaso: käytä 70 tai korkeampaa hyvälle kuvanlaadulle (oletus 90). TIFF-tiedoston pakkausmenetelmä on DEFLATE (paras värikuville). PNG-tiedoston pakkaustaso on '1'. Korkeammat arvot eivät näytä tekevän muuta kuin kasvattavan tiedoston tallennusaikaa (libpng). - ^Kuvan sijainti Jos ikkuna on leveämpi kuin kuva (eli ikkunan leveys/korkeus-suhde > kuvan), kuva voidaan siirtää vasemmalle puolelle, keskittää tai siirtää oikealle puolelle. Jos vasemmalle tai oikealle, käyttämätön reunus maksimoituu, mikä voi olla kätevämpää valintaikkunoiden sijoittamiseen. - ^Kuvaindeksin taso Nämä kaksi parametria säätelevät kompromissia käynnistysajan ja kuvaindeksin täydellisyyden välillä. • $ fotocx: Koskee tilannetta, jossa fotocx käynnistetään shell-komennolla, järjestelmävalikosta tai järjestelmän kuvakkeesta/käynnistimestä. Suositeltu arvo '2' tarkoittaa täyttä indeksointia: lataa vanha indeksitiedosto, etsi uudet tiedostot (ei vielä indeksoidut) ja päivitä fotocx-indeksitiedosto. • $ fotocx : Koskee tilannetta, jossa fotocx käynnistetään napsauttamalla tiedostonimeä tiedostonhallinnan listassa. Suositeltu arvo '1' tarkoittaa, että vanha indeksitiedosto ladataan, mutta uusia tiedostoja ei etsitä indeksin päivittämiseksi. Käynnistys on kohtalaisen nopea. Kuvahaku- ja karttatoiminnot toimivat normaalisti, mutta uudet (ei vielä indeksoidut) kuvatiedostot eivät sisälly. • Vaihtoehto: '0' tarkoittaa ei indeksointia. Käynnistys on erittäin nopea. Myöhempi kuvahaku- tai karttatoiminnon käyttö käynnistää tiedostojen indeksointitoiminnon vain vanhoille tiedostoille (ei hakua uusista/muokatuista tiedostoista). Käytä tätä vaihtoehtoa, jos kuvakokoelmasi on jättimäinen ja käynnistysaika ylittää muutaman sekunnin. Voit käynnistää indeksointitoiminnon myöhemmin tarvittaessa. - ^RAW-lataaja RAW-lataaja on komento, jota käytetään RAW-tiedoston lukemiseen ja sen muuntamiseen TIFF-muotoon 16-bittisellä värisyvyydellä. Sitä käytetään, kun RAW-tiedostoa katsellaan. Voit käyttää Fotocxin muokkaustoimintoja tiedoston muokkaamiseen ja optimointiin. Oletus-RAW-lataaja on dcraw käyttäen sRGB-väriavaruutta. Muutamia muita vaihtoehtoja käyttäen dcraw:ta tai rawtherapeeta on tarjolla valintalistassa. Nämä komennot säilytetään tiedostossa 'raw_commands_*' Fotocx-kotikansiossa. Muokkaa tätä tiedostoa muuttaaksesi tai lisätäksesi uusia vaihtoehtoja (katso alla). Saatat haluta valmistella useita komentoja useille kameroille tai useille käsittelyvaihtoehdoille. Jos haluat mieluummin käyttää RAW-editoria interaktiivisesti, luo tätä varten liitännäiskomento – katso {LISÄOSAT}. - ^RAW-vaihtoehdot • edit commands: paina painiketta muokataksesi RAW-lataajan komentojen listaa. Tekstieditori käynnistyy uudessa ikkunassa nykyisen komentolistan kanssa. • match embedded image color: käytä RAW-tiedostoon upotettua kuvaa ohjeena RAW-kuvan värien yhdistämiseen muunnettuun TIFF-kuvaan. Tämä on kameravalmistajan tulkinta RAW-datasta – hyvä lähtökohta, jos RAW-tiedosto tarvitsee lisämuokkausta. Upotettu kuva on yleensä sama kuin kameran JPEG-tiedosto. - ^Video-sovellus Syötä shell-komento videotoistosovelluksen käynnistämiseksi. Käytä '%s' merkitsemään, mihin kohtaan komentorivillä videotiedoston nimi lisätään. Tässä muutamia esimerkkejä: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: PIKANÄPPÄIMET +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - Katso tai muuta mukautettuja näppäimistöpikanäppäimiä. Tällä hetkellä määritetyt pikanäppäimet näkyvät ensimmäisessä ikkunassa. Jos painat [Muokkaa]-painiketta, näytetään toinen valintaikkuna, jossa voit lisätä ja muuttaa näppäimistöpikanäppäimiä. Syötä uusi pikanäppäin näppäimistöllä. Voit käyttää näppäimiä A–Z, 0–9, F2–F9, ja useimpia symboleja (% $ & * < jne.). Voit yhdistää näppäimen johonkin näppäimistä Ctrl/Alt/Shift: pidä pohjassa YKSI näppäimistä Ctrl/Alt/Shift, paina sitten näppäintä, ja vapauta molemmat. Valitse jokin käytettävissä olevista valikkomäärityksistä oikealla olevasta listasta, ja paina sitten [Lisää] ja [OK]. Poista pikanäppäin valitsemalla se ja painamalla [Poista]. - - TOPIC: RGB-HISTOGRAMMI +image: RGB-hist.png - Pieni ikkuna näyttää nykyisen kuvan tai kuvan parhaillaan valitun alueen kirkkaushistogrammikäyrän Tiedostonäkymässä. Tämä käyrä päivittyy synkronisesti, kun muokkaustoiminnot muuttavat kuvaa. Käytä painikkeita [Kaikki] [Punainen] [Vihreä] [Sininen] valitaksesi näytettävät värit. - - TOPIC: SUURENNA KUVA +image: magnify-image.jpg - Suurenna kuvaa hiiren osoittimen ympärillä olevalla alueella. Vedä hiirtä vasemmalla painikkeella kuvan ympäri suurentaaksesi eri alueita, samaan tapaan kuin painetun kuvan katselu suurennuslasilla. Käytä valintaikkunaa säätääksesi alueen sädettä ja suurennuksen määrää. - - TOPIC: MITTAA KUVA Napsauta kahta mitä tahansa kohtaa kuvassa mitataksesi pikselietäisyyden pisteiden välillä. Napsautetut kohdat merkitään kuvaan kirjaimin A ja B. Nämä merkinnät näyttävät aina kaksi viimeksi napsautettua pistettä. Valintaikkuna päivittyy näiden kahden pisteen välisillä etäisyyksillä: X-distance (vaakaetäisyys) Y-distance (pystyetäisyys) H-distance (kokonaisetäisyys) - - TOPIC: NÄYTÄ RGB +image: show-RGB.png - Kun kuvasta napsautetaan pistettä, RGB-arvot näytetään valintaikkunassa. Viimeiset 9 napsautettua pistettä näytetään. Arvot ovat muodossa xxx.dd, jossa xxx on värin ylemmät 8 bittiä ja .dd on alemmat 8 bittiä. Alue on 0.00–255.99. Alemmat 8 bittiä ovat nolla, ellei kuvaa muokata tai sillä ole yli 8 bitin värisyvyys. Tulokset päivittyvät reaaliajassa, jos kuvaa muokataan. Jos "labels" on valittu, pisteet merkitään kuvaan kirjaimin, jotka vastaavat valintaikkunan kirjaimia. Jos "delta" on valittu ja kuvaa muokataan, näytetään RGB-muutokset absoluuttisten arvojen sijaan. - Jos avaat toisen kuvan (esim. vertaillaksesi sitä edelliseen kuvaan), sijainnit säilytetään ja päivitetään, jos ne ovat uuden kuvan rajojen sisällä. Tämä helpottaa kuvien vertailua pikselin RGB-arvojen tasolla. - - TOPIC: RUUDUKON ASETUKSET +image: grid-settings.jpg - Ruudukkoviivatoimintoja on kaksi: Grid Settings asettaa kaikki ruudukon parametrit. Toggle Grid kytkee ruudukkoviivat päälle tai pois. Ruudukkoviivat ovat vaaka- ja pystysuoria viivoja säännöllisin välein kuvan poikki. Nämä viivat voivat olla hyödyllisiä kohdistusapuja, kun kuvaa suoristetaan tai vääristetään suoristaakseen seiniä tai muita kohteita kuvassa. Käytä x-count- ja y-count-syötteitä asettaaksesi pystysuorien ja vaakasuorien viivojen määrän. X- ja y-offset-säätimiä voidaan käyttää siirtämään ruudukkoviivoja leikkaamaan halutun kohdan kuvassa. Näppäimistöpikanäppäin (oletus shift+G) voidaan määrittää Toggle Grid -toiminnolle, jotta ruudukkoviivat voidaan kytkeä päälle tai pois yhdellä näppäinpainalluksella. - - TOPIC: VIIVAN VÄRI Jotkin toiminnot piirtävät viivoja kuvan päälle (Crop, Select Area, muut). Voit muuttaa näiden viivojen väriä maksimoidaksesi kontrastin taustakuvaa vasten. Pieni valintaikkuna voidaan jättää auki muokkauksen ajaksi, jotta voit kätevästi vaihtaa käytettävissä olevien värien (musta, valkoinen, punainen, vihreä) välillä. - - TOPIC: TUMMAT/KIRKKAAT PIKSELIT Korosta kuvan tummimmat ja vaaleimmat pikselit. Säädä kahta kiertopainiketta asettaaksesi kirkkauskynnykset, jotka ovat aluksi 0 tummille pikseleille ja 255 vaaleille pikseleille. Pikselit, joiden kirkkaus on pienempi kuin tumma kynnys tai suurempi kuin vaalea kynnys, "vilkkuvat" erottuakseen. Käytä tätä toimintoa havaitaksesi leikkautumista kirkkauden tai värin muokkauksen jälkeen. - - TOPIC: NÄYTÖN VÄRI +image: moncolor-small.png - Kahdeksan väripalkkia piirretään näytön poikki kirkkaudella nollasta (musta) 100 %:iin. Voit käyttää tätä säätääksesi näyttösi kirkkautta ja kontrastia. Palkkien kummassakaan päässä ei pitäisi olla muuttumattomia alueita. - - TOPIC: ETSI KAKSOISKAPPALEET +image: find-dups.png - Etsi kaksoiskappaleina olevia kuvatiedostoja mistä tahansa kuvatietokannastasi. Kaksoiskappale voi olla tiedosto, joka on täysin tai "lähes" identtinen toisen tiedoston kanssa. Nopeuden vuoksi thumbnail-kuvia verrataan muistissa. On mahdollista, että vastaavia thumbnails löytyy pääkuville, joissa on pieniä eroja, jotka eivät näy thumbnails-kuvissa. Kooltaan pienennetty kuvakopio luokitellaan todennäköisesti kaksoiskappaleeksi. Thumbnail-koko voidaan asettaa 32–512 pikseliin. Suurempi koko vähentää väärien positiivisten todennäköisyyttä. Thumbnail-koko vaikuttaa suuresti tarvittavan päämuistin määrään – esim. 100K kuvalle koko 64 tarvitsee noin 880 Mt, kun taas koko 256 tarvitsee noin 14 Gt. Paina [calculate]-painiketta laskeaksesi suurimman thumbnail-koon, joka mahtuu käytettävissä olevaan vapaaseen muistiin. - Kahta parametria käytetään asettamaan identtisten tai lähes identtisten kuvien tunnistusherkkyys: pixel difference on RGB-arvon ero, jonka alapuolella pikseleitä pidetään samana. Pixel count on erilaisten pikselien määrä, jonka alapuolella kaksi kuvaa luokitellaan kaksoiskappaleiksi. Esimerkki: jos pixel difference = 2 ja pixel count = 10, kuvat luokitellaan kaksoiskappaleiksi, jos alle 10 pikseliä eroaa 2:lla tai vähemmän. - Tulos on galleria, joka näyttää kunkin kaksoiskappalejoukon. Tulosgalleria tallennetaan albumina "Duplicate Images". Voit käyttää Batch Delete/Trash -toimintoa yhdessä tämän albumin kanssa valitaksesi, mitkä kaksoiskappaleet poistetaan. - - TOPIC: ETSI VIRHEELLISET TIEDOSTOT Kaikki kuvatiedostot ilmoittamissasi ylätason kansioissa luetaan. Jokaiselle tiedostolle, jota ei voida lukea, sinulla on kolme vaihtoehtoa: • poista tiedosto • korjaa virheellinen tiedostotyyppi (katso alla) • siirrä tiedosto jonnekin ylätason kuvakansioidesi ulkopuolelle Olen usein nähnyt .png-tiedostoja, joilla on .jpg-tarkenne. Verkkoselaimet ja jotkin muut sovellukset käsittelevät tämän huomaamatta. Tässä oikea tiedostotyyppi raportoidaan, ja voit muuttaa tarkenteen oikeaksi. - - TOPIC: NÄYTÄ RESURSSIT Raportoi Fotocxin käyttämät tietokoneresurssit: • CPU time: käyttö Fotocxin käynnistyksestä tai viimeisimmästä näytteestä lähtien • Real memory: tällä hetkellä käytössä oleva todellinen muisti (pois lukien swap) • Maps cache: levytilaa megatavuina, jota käytetään välimuistiin tallennettuihin karttalaattoihin • Clear cache: poista kaikki välimuistiin tallennetut karttalaatat • [Sample]-painike: ota uusi näyte ja raportoi data - [Sample]-painike nollaa CPU-ajan. Seuraava näyte näyttää vain uuden kertyneen CPU-ajan. CPU-aika on kaikkien prosessisäikeiden summa. - - TOPIC: KÄÄNNÖKSET Fotocx-pakettiin sisältyy käännöksiä useille kielille. Nämä tekoälykäännökset eivät ole täydellisiä. Käännösvirheet voidaan korjata muokkaamalla käännöstiedostoja. - ^Käyttöliittymän kielen vaihtaminen {ASETUKSET}-valikkoa voidaan käyttää kielen vaihtamiseen. Kieli voidaan asettaa myös Fotocxia käynnistettäessä: $ fotocx -lang xx # kieli xx (de fr zh jne.) $ fotocx -lang en # englanti - ^Käyttöliittymäkäännöksen muokkaaminen Muokkaa tiedostoa /translations/gui_xx Tekstirivipareilla on alussa 4-numeroiset numerot, joiden on täsmättävä. Ensimmäinen rivi on englanniksi, toinen rivi on kielellä xx. Muokkaa vain xx-riviä, älä koskaan englanninkielistä riviä. Tekstiin parametrien lisäämiseen käytettävien erikoismerkkien on pysyttävä samassa järjestyksessä. Nämä ovat '%d' (kokonaislukuparametri), '%f' (desimaali), '%s' (teksti). - ^Käyttöoppaan käännöksen muokkaaminen Muokkaa tiedostoa /translations/ug_xx Muokkaa tiedostoa ug_xx korjataksesi käännöksen. Älä lisää tai poista tekstirivejä äläkä muuta järjestystä. Tekstirivien on vastattava 1:1 englanninkielistä käyttöopasta, ug_en. - Lähetä korjatut tiedostot sisällytettäväksi seuraavaan Fotocx-julkaisuun: mkornelix@gmail.com - - TOPIC: OHJEVALIKKO • User Guide - Näytä sisällysluettelo • Video Tutorial - Näytä Fotocxin video-opetusohjelma YouTubessa • Outboard Programs - Luettele ulkoiset ohjelmat ja niiden toiminnot • Show Log File - Näytä kirjattu tieto ja virheilmoitukset • Command Parameters - Näytä käytettävissä olevat komentoriviparametrit • Change Log - Näytä lisäykset ja virhekorjaukset viimeaikaisissa julkaisuissa • Copyright - Näytä Fotocxiin liittyvät tekijänoikeudet ja lisenssit • Privacy - Näytä Fotocxin tietosuojakäytäntö (säännöt) • About - Näytä julkaisunumero, suoritustiedoston sijainti, yhteystiedot • Home Page - Näytä Fotocxin kotisivu osoitteessa kornelix.net • Uninstall - Kuinka Fotocx poistetaan - - TOPIC: MUUT AIHEET Seuraavat aiheet eivät liity Fotocxin valikkoihin. - - TOPIC: VIDEO FILES Videotiedostoja (.mpeg, .mp4 jne.) voi olla sekoittuneena kuvatiedostojesi joukkoon. Ne näkyvät kuvatiedostoina sekä Tiedosto- että Gallerianäkymässä. 'P'-näppäin käynnistää, keskeyttää ja jatkaa videota, tai toistaa uudelleen videon, joka on päättynyt. 'Q'-näppäin lopettaa videon. Käytä {ASETUKSET}-valikkoa valitaksesi sovelluksen videotiedostojen toistamiseen. - - TOPIC: DIAT JA NEGATIIVIT +image: color-negative.jpg - Voit käyttää lähikuvauskykyistä kameraa diojen tai filminegatiivien kuvaamiseen. Käytä valotauluvaloa, tai käytä taivasta (esimerkki yllä). Käsitelläksesi värinegatiivin, tee ensin positiivi – katso {VÄRITILA}. Jos kuva on sumuinen, valitse vain kuva-alue, jättäen filmin reunat pois, ja käytä sitten toimintoa {GLOBAALI RETINEX} sumun poistamiseen. Aseta valko- ja mustapisteet napsauttamalla kuvaa tarvittaessa sumun vähentämiseksi edelleen. - - TOPIC: FOTOCX-RAJOITUKSET • Tiukka raja on miljoona tiedostoa. • kuvaversiot - enintään 99 versiota kumoamista/uudelleentekoa ja versionimeämistä varten. • kuvan keywords - yhteensä 10K keywords. 1000 merkkiä yksittäistä kuvaa kohden. • Galleriat on rajoitettu 40K kuvatiedostoon. • kuvien enimmäismitat ovat 40K x 20K pikseliä. - - TOPIC: FOTOCX WINDOWS 11:LLE Fotocxia voidaan käyttää Windows 11:ssä asentamalla Windows Subsystem for Linux 2, eli WSL2. Internetistä löytyy runsaasti dokumentaatiota siitä, miten tämä tehdään. - Jos kuvatiedostosi ovat Windowsin tiedostojärjestelmässä (NTFS), Fotocx on hyvin hidas. Siirrä siksi kuvatiedostosi Linuxin tiedostojärjestelmään. Voit silti käyttää niitä Windowsin Resurssienhallinnalla ja muilla Windows-sovelluksilla, joten mitään ei menetetä. Microsoft suosittelee myös Linux-tiedostojärjestelmää paremman suorituskyvyn vuoksi. Käytä Resurssienhallinnan 'Linux'-kuvaketta päästäksesi kotikansioosi Linuxin tiedostojärjestelmässä. Lisää Pictures-kansio tarvittaessa, ja siirrä kuvatiedostosi sinne. - Jos Fotocx-paketti on saatavilla, asenna se. Muussa tapauksessa tee seuraavaa: Lataa Fotocxin binääripakettitiedosto osoitteesta ^https://kornelix.net. Linux-terminaalissa: $ cd /mnt/c/Users//Downloads # siirry Windowsin latauskansioon $ tar -xzf fotocx-xxx-bin.tar.gz # pura paketti kansioon fotocx $ cd fotocx # siirry kansioon fotocx $ chmod u+x install.sh # tee asennusskriptistä suoritettava $ ./install.sh # aja skripti, asenna fotocx $ fotocx # käynnistä Fotocx Saatat joutua käynnistämään Linux-ikkunan uudelleen, jotta viimeinen vaihe toimii. - Lue tämän käyttöoppaan johdanto-osat. Fotocxilla on syvällinen toiminnallisuus. Älä odota hallitsevasi Fotocxia muutamassa minuutissa. - - TOPIC: TIETOSUOJA Fotocx ei säilytä mitään käyttäjädataa kuvatiedostojen ja niiden metadatan lisäksi. Metadata tulisi poistaa kuvatiedostoista ennen niiden lataamista internetiin, ja Fotocx tarjoaa yksinkertaisen tavan tehdä tämä. - - TOPIC: PROBLEM, QUESTION, SUGGESTION Lähetä sähköpostia osoitteeseen mkornelix@gmail.com. Jos kaatumisraportti (zappcrash-tiedosto) on saatavilla, lähetä myös se. - fotocx/data/translations/gui_es0000664000175000017500000037654415247006657015711 0ustar micomico0000 + Zoom-in \n 0000 + Acercar \n 0001 - Zoom-out \n 0001 - Alejar \n 0002 = Zoom-in \n 0002 = Acercar \n 0003 Arrow keys Previous/Next file \n 0003 Teclas de flecha Archivo anterior/siguiente \n 0004 Delete Delete/Trash file \n 0004 Supr Eliminar/enviar a la papelera el archivo \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Esc Salir del diálogo / Salir de Fotocx \n 0006 F1 User Guide, Context Help \n 0006 F1 Guía del usuario, ayuda contextual \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 Pantalla completa / sin menús \n 0008 Home/End Gallery start/end \n 0008 Inicio/Fin Inicio/fin de la galería \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 El tiempo de indexado depende del número, tipo y tamaño de \n tus archivos de imagen y de la velocidad de tu ordenador. Esto \n puede variar entre unos pocos cientos y más de 10 mil por minuto. \n Puedes cambiar las opciones de índice más tarde, usando estos menús: \n Herramientas > Índice, Herramientas > Configuración. \n 0010 Page keys Gallery page up/down \n 0010 Av/Re Pág Página anterior/siguiente de la galería \n 0011 Z 1x <--> fit to window \n 0011 Z 1x <--> ajustar a la ventana \n 0012 $s plugin needs base and adder 0012 el plugin $s necesita base y adder 0013 % from left: 0013 % desde la izquierda: 0014 % from top: 0014 % desde arriba: 0015 %d albums selected 0015 %d álbumes seleccionados 0016 %d image files selected 0016 %d archivos de imagen seleccionados 0017 %d images 0017 %d imágenes 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 %d keywords a purgar \nen %d archivos de imagen. \n¿Continuar? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 %d keywords a renombrar \nen %d archivos de imagen. \n¿Continuar? 0020 %d max images exceeded 0020 %d imágenes máximas superadas 0021 %d red-eye limit reached 0021 %d límite de ojos rojos alcanzado 0022 %s %s %d folders %d files 0022 %s %s %d carpetas %d archivos 0023 %s *** date/time conversion failed \n 0023 %s *** conversión de fecha/hora fallida \n 0024 %s ALBUM %s %d files 0024 %s ÁLBUM %s %d archivos 0025 %s NEWEST FILES 0025 %s ARCHIVOS MÁS RECIENTES 0026 %s RECENT FILES 0026 %s ARCHIVOS RECIENTES 0027 %s SEARCH RESULTS %d files 0027 %s RESULTADOS DE BÚSQUEDA %d archivos 0028 %s UNKNOWN 0028 %s DESCONOCIDO 0029 %s added to script 0029 %s añadido al script 0030 %s is already indexed 0030 %s ya está indexado 0031 %s renamed: %s 0031 %s renombrado: %s 0032 %s: metadata update failed 0032 %s: fallo al actualizar metadata 0033 %s: no write permission 0033 %s: sin permiso de escritura 0034 %s: reserved, cannot be used 0034 %s: reservado, no se puede usar 0035 %s: too many keywords 0035 %s: demasiadas keywords 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\nFecha de foto: %s Fecha de archivo: %s \nValoración: %s Tamaño: %s %.2fmb \nUbicación: %s %s %s \nKeywords: %s \nTítulo: %s \nDescripción: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\nFecha de foto: %s Fecha de archivo: %s \nValoración: %s Tamaño: %s %.2fmb \nUbicación: %s %s %s \nKeywords: %s \nTítulo: %s \nDescripción: %s \n----------------------- \n%s 0038 (click below) 0038 (clic abajo) 0039 (no selection) 0039 (sin selección) 0040 (pixels) 0040 (píxeles) 0041 (press key) 0041 (pulsa una tecla) 0042 (select function) 0042 (selecciona función) 0043 *** bad utf8 detected *** \n 0043 *** utf8 no válido detectado *** \n 0044 *** cannot create new file \n 0044 *** no se puede crear el archivo nuevo \n 0045 *** cannot get real path of input file \n 0045 *** no se puede obtener la ruta real del archivo de entrada \n 0046 *** cannot load input file \n 0046 *** no se puede cargar el archivo de entrada \n 0047 *** cannot make new version of input file \n 0047 *** no se puede crear una nueva versión del archivo de entrada \n 0048 *** cannot open input file 0048 *** no se puede abrir el archivo de entrada 0049 *** cannot read input file 0049 *** no se puede leer el archivo de entrada 0050 *** cannot save output file \n 0050 *** no se puede guardar el archivo de salida \n 0051 *** completed \n 0051 *** completado \n 0052 *** file date/time invalid \n 0052 *** fecha/hora de archivo no válida \n 0053 *** file type not supported \n 0053 *** tipo de archivo no compatible \n 0054 *** invalid file \n 0054 *** archivo no válido \n 0055 *** metadata update error \n 0055 *** error al actualizar metadata \n 0056 *** no date/time available \n 0056 *** no hay fecha/hora disponible \n 0057 + bright 0057 + brillo 0058 +Blue -Yellow 0058 +Azul -Amarillo 0059 +Brightness 0059 +Brillo 0060 +Green -Magenta 0060 +Verde -Magenta 0061 +Red -Cyan 0061 +Rojo -Cian 0062 - blue 0062 - azul 0063 - fog/haze 0063 - niebla/bruma 0064 .heic/.avif files not supported (install heif_convert) 0064 los archivos .heic/.avif no son compatibles (instala heif_convert) 0065 .jp2 files not supported (install opj_decompress) 0065 los archivos .jp2 no son compatibles (instala opj_decompress) 0066 .webp files not supported (install dwebp) 0066 los archivos .webp no son compatibles (instala dwebp) 0067 0 albums selected 0067 0 álbumes seleccionados 0068 0 duplicates 0068 0 duplicados 0069 0-5 stars 0069 0-5 estrellas 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = sin índice de imágenes, solo índice antiguo, antiguo + actualizar nuevo/modificado 0071 2-character code 0071 código de 2 caracteres 0072 3D depth 0072 profundidad 3D 0073 <2 images 0073 <2 imágenes 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 Se está instalando una nueva versión de Fotocx. \nEs posible que debas restaurar la configuración personalizada. 0075 ADD GLARE 0075 AÑADIR DESTELLO 0076 ADD NOISE 0076 AÑADIR RUIDO 0077 ADJUST HSL 0077 AJUSTAR HSL 0078 ADJUST RGB 0078 AJUSTAR RGB 0079 ALBUM MASS UPDATE 0079 ACTUALIZACIÓN MASIVA DE ÁLBUM 0080 ALBUMS 0080 ÁLBUMES 0081 ALBUMS MENU 0081 MENÚ DE ÁLBUMES 0082 ALIEN COLORS 0082 COLORES ALIENÍGENAS 0083 AMPLIFY CONTRAST 0083 AMPLIFICAR CONTRASTE 0084 ANTI-ALIAS 0084 ANTIALIAS 0085 AREA BLEND 0085 MEZCLA DE ÁREA 0086 AREA FILL 0086 RELLENO DE ÁREA 0087 AREA OVERVIEW 0087 VISTA GENERAL DE ÁREA 0088 AUTOSEARCH 0088 BÚSQUEDA AUTOMÁTICA 0089 About 0089 Acerca de 0090 Action 0090 Acción 0091 Add 0091 Añadir 0092 Add 1 0092 Añadir 1 0093 Add All 0093 Añadir todo 0094 Add Current 0094 Añadir actual 0095 Add Current File Here 0095 Añadir archivo actual aquí 0096 Add Glare 0096 Añadir destello 0097 Add Image 0097 Añadir imagen 0098 Add Line 0098 Añadir línea 0099 Add Margins 0099 Añadir márgenes 0100 Add Noise 0100 Añadir ruido 0101 Add Random Noise 0101 Añadir ruido aleatorio 0102 Add Selected Files Here 0102 Añadir archivos seleccionados aquí 0103 Add Texture 0103 Añadir textura 0104 Add a brightness/color ramp across an image 0104 Añadir una rampa de brillo/color a través de una imagen 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 Añadir marcador: haz clic en una miniatura de la galería. \nRenombrar marcador: haz clic en él y pulsa [Renombrar] 0106 Add glare around bright objects 0106 Añadir destello alrededor de objetos brillantes 0107 Add margins around an image 0107 Añadir márgenes alrededor de una imagen 0108 Add newest version to existing versions 0108 Añadir la versión más reciente a las versiones existentes 0109 Add overlay image (e.g. copyright) to selected images 0109 Añadir imagen superpuesta (p. ej. copyright) a las imágenes seleccionadas 0110 Add random noise to an image 0110 Añadir ruido aleatorio a una imagen 0111 Add selected versions to existing versions 0111 Añadir versiones seleccionadas a las versiones existentes 0112 Add texture to an image 0112 Añadir textura a una imagen 0113 Add to Selection 0113 Añadir a la selección 0114 Add/change/delete metadata for selected image files 0114 Añadir/cambiar/eliminar metadata para los archivos de imagen seleccionados 0115 Add/remove barrel/pincushion distortion 0115 Añadir/eliminar distorsión de barril/cojín 0116 Add/remove brightness/color radially from chosen center 0116 Añadir/eliminar brillo/color radialmente desde un centro elegido 0117 Add/remove keywords for selected image files 0117 Añadir/eliminar keywords para los archivos de imagen seleccionados 0118 Add/revise location/geocoordinates for selected image files 0118 Añadir/revisar ubicación/geocoordenadas para los archivos de imagen seleccionados 0119 Adjust HSL 0119 Ajustar HSL 0120 Adjust Image Contributions 0120 Ajustar contribuciones de la imagen 0121 Adjust Pixel Composition 0121 Ajustar composición de píxeles 0122 Adjust RGB 0122 Ajustar RGB 0123 Adjust brightness, contrast, color 0123 Ajustar brillo, contraste, color 0124 Adjust color saturation based on brightness 0124 Ajustar la saturación del color según el brillo 0125 Adjust color using HSL color model 0125 Ajustar el color usando el modelo de color HSL 0126 Adjust color using RGB or CMY colors 0126 Ajustar el color usando colores RGB o CMY 0127 Adjustment 0127 Ajuste 0128 Album Mass Update 0128 Actualización masiva de álbum 0129 Album Name 0129 Nombre del álbum 0130 Albums 0130 Álbumes 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 Álbumes: galería de imágenes elegidas, organízalas arrastrando y soltando 0132 Algorithm Iterations 0132 Iteraciones del algoritmo 0133 Alien Colors 0133 Colores alienígenas 0134 All 0134 Todo 0135 All Areas 0135 Todas las áreas 0136 All files 0136 Todos los archivos 0137 All image files will be re-indexed. \nContinue? 0137 Todos los archivos de imagen se reindexarán. \n¿Continuar? 0138 All±1 0138 Todo±1 0139 All±10 0139 Todo±10 0140 Alpha 0140 Alfa 0141 Amount 0141 Cantidad 0142 Amplify 0142 Amplificar 0143 Amplify Contrast 0143 Amplificar contraste 0144 Amplify area contrast to enhance visibility of details 0144 Amplificar el contraste de área para mejorar la visibilidad de los detalles 0145 Angle 0145 Ángulo 0146 Anti-Alias 0146 Antialias 0147 Apply 0147 Aplicar 0148 Apply a soft focus effect to an image 0148 Aplicar un efecto de enfoque suave a una imagen 0149 Apply repeatedly while watching the image. 0149 Aplicar repetidamente mientras observas la imagen. 0150 Area Blend 0150 Mezcla de área 0151 Area Edge Blend 0151 Mezcla de borde de área 0152 Area Fill 0152 Relleno de área 0153 Arrange images and text in a layout (photo-montage) 0153 Organizar imágenes y texto en un diseño (foto-montaje) 0154 Array Complete 0154 Matriz completa 0155 Array Width 0155 Ancho de la matriz 0156 Arrow head 0156 Punta de flecha 0157 Auto Level 0157 Nivel automático 0158 Auto black level 0158 Nivel de negro automático 0159 Auto crop: 0159 Recorte automático: 0160 Auto white balance 0160 Balance de blancos automático 0161 Auto-replay 0161 Reproducción automática 0162 BATCH CHANGE META 0162 CAMBIO MASIVO DE META 0163 BATCH CONVERT 0163 CONVERSIÓN MASIVA 0164 BATCH COPY/MOVE 0164 COPIAR/MOVER MASIVO 0165 BATCH DELETE/TRASH 0165 ELIMINAR/PAPELERA MASIVO 0166 BATCH GEOTAGS 0166 GEOTAGS MASIVOS 0167 BATCH KEYWORDS 0167 KEYWORDS MASIVAS 0168 BATCH MENU 0168 MENÚ MASIVO 0169 BATCH OVERLAY 0169 SUPERPOSICIÓN MASIVA 0170 BATCH PHOTO DATE 0170 FECHA DE FOTO MASIVA 0171 BATCH PROCESSING 0171 PROCESAMIENTO MASIVO 0172 BATCH PURGE KEYWORDS 0172 PURGA MASIVA DE KEYWORDS 0173 BATCH RENAME KEYWORDS 0173 RENOMBRAR KEYWORDS MASIVO 0174 BATCH REPORT META 0174 INFORME MASIVO DE META 0175 BATCH SCRIPT 0175 SCRIPT MASIVO 0176 BATCH UPRIGHT 0176 ENDEREZADO MASIVO 0177 BLANK IMAGE 0177 IMAGEN EN BLANCO 0178 BLUR 0178 DESENFOQUE 0179 BOOKMARKS 0179 MARCADORES 0180 BRIGHTNESS RAMP 0180 RAMPA DE BRILLO 0181 Background 0181 Fondo 0182 Background Blur - blur relative to distance from foreground 0182 Desenfoque de fondo: desenfoque relativo a la distancia del primer plano 0183 Background Color 0183 Color de fondo 0184 Background Pattern 0184 Patrón de fondo 0185 Base Transparency 0185 Transparencia base 0186 Batch 0186 Masivo 0187 Batch Add/Change Metadata 0187 Añadir/cambiar metadata masivamente 0188 Batch Add/Remove Keywords 0188 Añadir/eliminar keywords masivamente 0189 Batch Change Meta 0189 Cambio masivo de meta 0190 Batch Convert 0190 Conversión masiva 0191 Batch Copy/Move 0191 Copiar/mover masivo 0192 Batch Delete/Trash 0192 Eliminar/papelera masivo 0193 Batch Geotags 0193 Geotags masivos 0194 Batch Keywords 0194 Keywords masivas 0195 Batch Metadata 0195 Metadata masiva 0196 Batch Overlay 0196 Superposición masiva 0197 Batch Photo Date 0197 Fecha de foto masiva 0198 Batch Photo Date/Time 0198 Fecha/hora de foto masiva 0199 Batch Purge Keywords 0199 Purga masiva de keywords 0200 Batch Rename Keywords 0200 Renombrar keywords masivo 0201 Batch Report Meta 0201 Informe masivo de meta 0202 Batch Report Metadata 0202 Informe masivo de metadata 0203 Batch Set Geotags 0203 Establecer geotags masivo 0204 Batch Upright 0204 Enderezado masivo 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 Masivo: copiar, mover, convertir, convertir RAW, añadir/cambiar metadata 0206 Bend and fine-align 0206 Curvar y ajustar finamente 0207 Bias 0207 Sesgo 0208 Black 0208 Negro 0209 Blank Image 0209 Imagen en blanco 0210 Blend 0210 Mezclar 0211 Blend 0% 0211 Mezcla 0% 0212 Blend Width 0212 Ancho de mezcla 0213 Blend area edits/edges using the mouse 0213 Mezclar ediciones/bordes de área usando el ratón 0214 Blend: 0% 0214 Mezcla: 0% 0215 Blue 0215 Azul 0216 Blue Factors 0216 Factores de azul 0217 Blur 0217 Desenfoque 0218 Blur Angle (degrees) 0218 Ángulo de desenfoque (grados) 0219 Blur Background 0219 Desenfocar fondo 0220 Blur Image 0220 Desenfocar imagen 0221 Blur Mix 0221 Mezcla de desenfoque 0222 Blur Normal 0222 Desenfoque normal 0223 Blur Radius 0223 Radio de desenfoque 0224 Blur Span 0224 Extensión de desenfoque 0225 Blur Span (pixels) 0225 Extensión de desenfoque (píxeles) 0226 Blur the image (various methods) 0226 Desenfocar la imagen (varios métodos) 0227 Bookmarks 0227 Marcadores 0228 Both 0228 Ambos 0229 Bottom 0229 Inferior 0230 Bright Limit 0230 Límite de brillo 0231 Bright Point 0231 Punto de brillo 0232 Brightness 0232 Brillo 0233 Brightness Histogram 0233 Histograma de brillo 0234 Brightness Ramp 0234 Rampa de brillo 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 El brillo debe mostrar una rampa gradual \nque se extienda hasta los bordes. 0236 Browse 0236 Explorar 0237 CALIBRATE PRINTER 0237 CALIBRAR IMPRESORA 0238 CAPTIONS 0238 SUBTÍTULOS 0239 CARTOON 0239 CARICATURA 0240 CHOOSE ALBUM 0240 ELEGIR ÁLBUM 0241 CLEAR AREA 0241 BORRAR ÁREA 0242 CLOSE 0242 CERRAR 0243 COLOR MODE 0243 MODO DE COLOR 0244 COMBINE MENU 0244 MENÚ DE COMBINAR 0245 COMMAND PARAMETERS 0245 PARÁMETROS DE COMANDO 0246 COMPLETED 0246 COMPLETADO 0247 COPY FROM IMAGE 0247 COPIAR DESDE IMAGEN 0248 COPY IN IMAGE 0248 COPIAR DENTRO DE LA IMAGEN 0249 COPY META 0249 COPIAR META 0250 COPY PRIOR EDIT 0250 COPIAR EDICIÓN ANTERIOR 0251 COPY TO CLIPBOARD 0251 COPIAR AL PORTAPAPELES 0252 COPY TO DESKTOP 0252 COPIAR AL ESCRITORIO 0253 COPY/MOVE 0253 COPIAR/MOVER 0254 COPY/PASTE AREA 0254 COPIAR/PEGAR ÁREA 0255 CREATE ALBUM 0255 CREAR ÁLBUM 0256 CROP 0256 RECORTAR 0257 CROSSHATCH 0257 ENTRECRUZADO 0258 CURRENT ALBUM 0258 ÁLBUM ACTUAL 0259 CURRENT FILE FOLDER 0259 CARPETA DEL ARCHIVO ACTUAL 0260 CURVE EDITING 0260 EDICIÓN DE CURVAS 0261 CUSTOM KERNEL 0261 KERNEL PERSONALIZADO 0262 CUSTOM MENU 0262 MENÚ PERSONALIZADO 0263 CYCLE 2 FILES 0263 CICLO 2 ARCHIVOS 0264 CYCLE 3 FILES 0264 CICLO 3 ARCHIVOS 0265 Calculate 0265 Calcular 0266 Calculate Geometry 0266 Calcular geometría 0267 Calibrate Printer 0267 Calibrar impresora 0268 Cancel 0268 Cancelar 0269 Cartoon 0269 Caricatura 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 Precaución: usa la función Editar meta principal \npara cambiar los tags disponibles allí, para asegurar \nque se realicen las actualizaciones relacionadas. 0271 Center 0271 Centro 0272 Center Hole 0272 Agujero central 0273 Change 0273 Cambiar 0274 Change Log 0274 Registro de cambios 0275 Change file name 0275 Cambiar nombre de archivo 0276 Change gallery sort order 0276 Cambiar el orden de clasificación de la galería 0277 Change image colors using an algorithm 0277 Cambiar los colores de la imagen usando un algoritmo 0278 Change image pixel dimensions 0278 Cambiar las dimensiones en píxeles de la imagen 0279 Chart to adjust monitor color 0279 Gráfico para ajustar el color del monitor 0280 Choose 0280 Elegir 0281 Choose Album 0281 Elegir álbum 0282 Choose Albums 0282 Elegir álbumes 0283 Choose Captions 0283 Elegir subtítulos 0284 Choose an album and show as gallery of images 0284 Elegir un álbum y mostrarlo como galería de imágenes 0285 Choose metadata shown on image captions 0285 Elegir la metadata mostrada en los subtítulos de la imagen 0286 Choose new Fotocx home folder 0286 Elegir nueva carpeta de inicio de Fotocx 0287 Choose thumbnail folder 0287 Elegir carpeta de thumbnails 0288 Choose top image folders 0288 Elegir las carpetas de imágenes principales 0289 Clear 0289 Borrar 0290 Click dark spot for black level 0290 Haz clic en un punto oscuro para el nivel de negro 0291 Click for RGB histogram 0291 Haz clic para el histograma RGB 0292 Click gray spot for white balance 0292 Haz clic en un punto gris para el balance de blancos 0293 Click image to select pixels 0293 Haz clic en la imagen para seleccionar píxeles 0294 Click image to select, drag image to move. 0294 Haz clic en la imagen para seleccionar, arrastra la imagen para mover. 0295 Click mouse to change center 0295 Haz clic con el ratón para cambiar el centro 0296 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0296 Haz clic cerca de cualquier posición en el contorno del área. \nSe encontrarán posibles huecos en el contorno. \nPulsa F1 para ayuda 0297 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0297 Haz clic en las cuatro esquinas de un área tetragonal. Pulsa [aplicar]. \nLa imagen se deforma para convertir el tetrágono en un rectángulo. 0298 Click thumbnail to select file 0298 Haz clic en el thumbnail para seleccionar el archivo 0299 Clip Level 0299 Nivel de recorte 0300 Clip Limit % 0300 Límite de recorte % 0301 Color 0301 Color 0302 Color Chooser 0302 Selector de color 0303 Color Depth: 0303 Profundidad de color: 0304 Color Fringes 0304 Franjas de color 0305 Color Hue 0305 Matiz de color 0306 Color Map File 0306 Archivo de mapa de color 0307 Color Match Images 0307 Igualar colores de imágenes 0308 Color Mode 0308 Modo de color 0309 Color calibration tool for printer and paper type 0309 Herramienta de calibración de color para impresora y tipo de papel 0310 Color map file to use 0310 Archivo de mapa de color a usar 0311 Combine 0311 Combinar 0312 Combine 2-6 images into a wide panorama image 0312 Combinar de 2 a 6 imágenes en una panorámica amplia 0313 Combine many images into an array of images 0313 Combinar muchas imágenes en una matriz de imágenes 0314 Combine multiple images in layers, select and expose layers 0314 Combinar varias imágenes en capas, seleccionar y mostrar capas 0315 Combine multiple noisy photos into a low-noise image 0315 Combinar varias fotos con ruido en una imagen de bajo ruido 0316 Combine multiple photos to erase passing people, etc. 0316 Combinar varias fotos para borrar personas que pasan, etc. 0317 Combine within 0317 Combinar dentro de 0318 Combine: HDR, HDF, stack, panorama, mashup, image array 0318 Combinar: HDR, HDF, apilado, panorámica, mashup, matriz de imágenes 0319 Command Params 0319 Parámetros de comando 0320 Commit 0320 Confirmar 0321 Confirm Exit 0321 Confirmar salida 0322 Contrast 0322 Contraste 0323 Contrast All 0323 Contraste total 0324 Contrast Blue 0324 Contraste de azul 0325 Contrast Green 0325 Contraste de verde 0326 Contrast Limit 0326 Límite de contraste 0327 Contrast Red 0327 Contraste de rojo 0328 Convert %d image files 0328 Convertir %d archivos de imagen 0329 Convert an image into a Tiny Planet image 0329 Convertir una imagen en una imagen de Planeta Diminuto 0330 Convert image into a cartoon drawing 0330 Convertir imagen en un dibujo de caricatura 0331 Convert image into a crosshatch sketch 0331 Convertir imagen en un boceto entrecruzado 0332 Convert image into a line drawing 0332 Convertir imagen en un dibujo lineal 0333 Convert image into a simulated painting 0333 Convertir imagen en una pintura simulada 0334 Convert image into a simulated sketch (1) 0334 Convertir imagen en un boceto simulado (1) 0335 Convert image into a simulated sketch (2) 0335 Convertir imagen en un boceto simulado (2) 0336 Convert image into black/white lines 0336 Convertir imagen en líneas en blanco y negro 0337 Convert image into dithered dots 0337 Convertir imagen en puntos con tramado 0338 Convert image into square tiles with 3D effect 0338 Convertir imagen en mosaicos cuadrados con efecto 3D 0339 Convert image into tiles matching feature contours 0339 Convertir imagen en mosaicos que siguen los contornos de las formas 0340 Copy 0340 Copiar 0341 Copy %d image files 0341 Copiar %d archivos de imagen 0342 Copy From Image 0342 Copiar desde imagen 0343 Copy Meta 0343 Copiar meta 0344 Copy Metadata 0344 Copiar metadata 0345 Copy Prior Edit 0345 Copiar edición anterior 0346 Copy Within Image 0346 Copiar dentro de la imagen 0347 Copy area for later pasting into image 0347 Copiar área para pegarla más tarde en la imagen 0348 Copy areas from another image using the mouse 0348 Copiar áreas de otra imagen usando el ratón 0349 Copy areas from prior edits using the mouse 0349 Copiar áreas de ediciones anteriores usando el ratón 0350 Copy areas within an image using the mouse 0350 Copiar áreas dentro de una imagen usando el ratón 0351 Copy image file to the clipboard 0351 Copiar el archivo de imagen al portapapeles 0352 Copy image file to the desktop 0352 Copiar el archivo de imagen al escritorio 0353 Copy in Image 0353 Copiar dentro de la imagen 0354 Copy metadata from one image to another 0354 Copiar metadata de una imagen a otra 0355 Copy or Move Image File 0355 Copiar o mover archivo de imagen 0356 Copy or Move image file to new location 0356 Copiar o mover archivo de imagen a una nueva ubicación 0357 Copy to Clipboard 0357 Copiar al portapapeles 0358 Copy to Desktop 0358 Copiar al escritorio 0359 Copy without unsaved changes? 0359 ¿Copiar sin los cambios no guardados? 0360 Copy/Move 0360 Copiar/mover 0361 Copy/move selected image files to a new folder 0361 Copiar/mover los archivos de imagen seleccionados a una nueva carpeta 0362 Copyright 0362 Copyright 0363 Create 0363 Crear 0364 Create Album 0364 Crear álbum 0365 Create Blank Image 0365 Crear imagen en blanco 0366 Create Mosaic 0366 Crear mosaico 0367 Create a blank image 0367 Crear una imagen en blanco 0368 Create a mosaic with tiles made from all images 0368 Crear un mosaico con mosaicos hechos de todas las imágenes 0369 Create a new album (ordered set of image files) 0369 Crear un nuevo álbum (conjunto ordenado de archivos de imagen) 0370 Create an embossed or 3D appearance 0370 Crear una apariencia en relieve o 3D 0371 Create or replace an album 0371 Crear o reemplazar un álbum 0372 Crop 0372 Recortar 0373 Crop (trim) image margins 0373 Recortar (ajustar) los márgenes de la imagen 0374 Crop Buttons 0374 Botones de recorte 0375 Crop Image 0375 Recortar imagen 0376 Crosshatch 0376 Entrecruzado 0377 Crosshatch Sketch 0377 Boceto entrecruzado 0378 Current Album 0378 Álbum actual 0379 Current File Folder 0379 Carpeta del archivo actual 0380 Current gallery 0380 Galería actual 0381 Current image: 0381 Imagen actual: 0382 Curve Node 0382 Nodo de curva 0383 Curve lines need at least 4 points 0383 Las líneas de curva necesitan al menos 4 puntos 0384 Custom 0384 Personalizado 0385 Custom Kernel 0385 Kernel personalizado 0386 Custom Shortcuts \n 0386 Atajos personalizados \n 0387 Custom menu: favorite/frequent functions, scripts, plugins 0387 Menú personalizado: funciones favoritas/frecuentes, scripts, plugins 0388 Customize 0388 Personalizar 0389 Customize: 0389 Personalizar: 0390 Cut Bottom 0390 Cortar abajo 0391 Cut Top 0391 Cortar arriba 0392 Cycle 2 Files 0392 Ciclo 2 archivos 0393 Cycle 2 Prior Files 0393 Ciclo 2 archivos anteriores 0394 Cycle 3 Files 0394 Ciclo 3 archivos 0395 Cycle 3 Prior Files 0395 Ciclo 3 archivos anteriores 0396 Cycle through images: 0396 Ciclo a través de imágenes: 0397 DARK/BRIGHT PIXELS 0397 PÍXELES OSCUROS/BRILLANTES 0398 DEFOG 0398 QUITAR NIEBLA 0399 DELETE ALBUM 0399 ELIMINAR ÁLBUM 0400 DELETE META 0400 ELIMINAR META 0401 DELETE/TRASH 0401 ELIMINAR/PAPELERA 0402 DENOISE 0402 REDUCIR RUIDO 0403 DIALOG BUTTONS 0403 BOTONES DE DIÁLOGO 0404 DITHER 0404 TRAMADO 0405 DRAG AND DROP 0405 ARRASTRAR Y SOLTAR 0406 Dark Areas 0406 Áreas oscuras 0407 Dark Limit 0407 Límite oscuro 0408 Dark Point 0408 Punto oscuro 0409 Dark/Bright Pixels 0409 Píxeles oscuros/brillantes 0410 Data file 0410 Archivo de datos 0411 Define keywords used for searching images 0411 Definir keywords usadas para buscar imágenes 0412 Defined Keywords: 0412 Keywords definidas: 0413 Defog 0413 Quitar niebla 0414 Delete 0414 Eliminar 0415 Delete Album 0415 Eliminar álbum 0416 Delete Meta 0416 Eliminar meta 0417 Delete Metadata 0417 Eliminar metadata 0418 Delete Originals 0418 Eliminar originales 0419 Delete an album 0419 Eliminar un álbum 0420 Delete or Trash selected image files 0420 Eliminar o enviar a la papelera los archivos de imagen seleccionados 0421 Delete or trash an image file 0421 Eliminar o enviar a la papelera un archivo de imagen 0422 Delete read-only file? 0422 ¿Eliminar archivo de solo lectura? 0423 Delete/Trash 0423 Eliminar/papelera 0424 Denoise 0424 Reducir ruido 0425 Depth 0425 Profundidad 0426 Description: %s\n 0426 Descripción: %s\n 0427 Desktop 0427 Escritorio 0428 Dialog Font 0428 Fuente del diálogo 0429 Diffs 0429 Diferencias 0430 Directed Blur 0430 Desenfoque dirigido 0431 Directed Blur - blur locally in direction of mouse drag 0431 Desenfoque dirigido - desenfoque local en dirección del arrastre del ratón 0432 Disable 0432 Desactivar 0433 Disable areas for editing 0433 Desactivar áreas para edición 0434 Discard unsaved changes? 0434 ¿Descartar cambios no guardados? 0435 Discard unsaved edits? 0435 ¿Descartar ediciones no guardadas? 0436 Distort image areas using the mouse 0436 Distorsionar áreas de la imagen usando el ratón 0437 Dither 0437 Tramado 0438 Dither Image 0438 Tramar imagen 0439 Dither0 0439 Tramado0 0440 Dither1 0440 Tramado1 0441 Dither2 0441 Tramado2 0442 Dither3 0442 Tramado3 0443 Dither4 0443 Tramado4 0444 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0444 Arrastra las imágenes hasta una alineación aproximada.\nPara rotar, arrastra desde el borde inferior. 0445 Drag margin box middle or edges 0445 Arrastra el centro o los bordes del cuadro de margen 0446 Drag mouse on image. \nLeft click to cancel. 0446 Arrastra el ratón sobre la imagen. \nClic izquierdo para cancelar. 0447 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0447 Arrastra el ratón para seleccionar. Borra. Repite. \nClic: extiende la selección hasta el ratón. 0448 Drag mouse to set center 0448 Arrastra el ratón para fijar el centro 0449 Drag near an image corner using the mouse 0449 Arrastra cerca de una esquina de la imagen usando el ratón 0450 Drag on image to level image.\nClick on image for level lines. 0450 Arrastra sobre la imagen para nivelarla.\nHaz clic en la imagen para líneas de nivel. 0451 Drag within image using the mouse 0451 Arrastra dentro de la imagen usando el ratón 0452 Draw a line across the image in \ndirection of brightness change. 0452 Dibuja una línea a través de la imagen en \ndirección del cambio de brillo. 0453 Draw box on image 0453 Dibujar un cuadro en la imagen 0454 Draw line or arrow on image 0454 Dibujar línea o flecha en la imagen 0455 Draw on image: text, line/arrow, box, circle, ellipse 0455 Dibujar en la imagen: texto, línea/flecha, cuadro, círculo, elipse 0456 Draw oval on image 0456 Dibujar un óvalo en la imagen 0457 Draw text on image 0457 Dibujar texto en la imagen 0458 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0458 Carpetas duplicadas o anidadas: \n %s \n %s \nPor favor, elimínalas. 0459 Duplicates: 0459 Duplicados: 0460 EDIT ALBUM 0460 EDITAR ÁLBUM 0461 EDIT ANY META 0461 EDITAR CUALQUIER META 0462 EDIT BOOKMARKS 0462 EDITAR MARCADORES 0463 EDIT MAIN META 0463 EDITAR META PRINCIPAL 0464 EDIT MENU 0464 MENÚ DE EDICIÓN 0465 EDIT PROCEDURES 0465 EDITAR PROCEDIMIENTOS 0466 EDIT SCRIPT 0466 EDITAR SCRIPT 0467 EDIT WORKFLOW 0467 EDITAR FLUJO DE TRABAJO 0468 EFFECTS MENU 0468 MENÚ DE EFECTOS 0469 EMBOSS 0469 RELIEVE 0470 ENABLE/DISABLE AREA 0470 ACTIVAR/DESACTIVAR ÁREA 0471 ENGRAVE 0471 GRABADO 0472 ESCHER SPIRAL 0472 ESPIRAL DE ESCHER 0473 EXPORT FILES 0473 EXPORTAR ARCHIVOS 0474 Edge 0474 Borde 0475 Edit 0475 Editar 0476 Edit Any Meta 0476 Editar cualquier meta 0477 Edit Any Metadata 0477 Editar cualquier metadata 0478 Edit Bookmarks 0478 Editar marcadores 0479 Edit Images 0479 Editar imágenes 0480 Edit Line 0480 Editar línea 0481 Edit Line/Arrow 0481 Editar línea/flecha 0482 Edit Main Meta 0482 Editar meta principal 0483 Edit Main Metadata 0483 Editar metadata principal 0484 Edit Menu 0484 Menú de edición 0485 Edit Metadata 0485 Editar metadata 0486 Edit Text 0486 Editar texto 0487 Edit any metadata tag 0487 Editar cualquier tag de metadata 0488 Edit function can not use Paint Edits 0488 La función Editar no puede usar Pintar ediciones 0489 Edit function must be active 0489 La función Editar debe estar activa 0490 Edit key metadata: keywords/geotags/description/rating ... 0490 Editar metadata clave: keywords/geotags/descripción/valoración ... 0491 Edit plugins menu 0491 Editar menú de plugins 0492 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0492 Editar: recortar, rotar, retocar, reescalar, marcar, pintar ediciones, copiar áreas 0493 Effects 0493 Efectos 0494 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0494 Efectos: caricatura, boceto, pintura, relieve, tramado, textura, colores, convolución personalizada 0495 Emboss 0495 Relieve 0496 Enable 0496 Activar 0497 Enable areas for editing 0497 Activar áreas para edición 0498 End of gallery 0498 Fin de la galería 0499 Engrave 0499 Grabado 0500 Enter Keyword 0500 Introducir keyword 0501 Enter New Keyword 0501 Introducir nueva keyword 0502 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0502 Introduce las propiedades de línea o flecha en el diálogo, \nhaz clic/arrastra en la imagen, clic derecho para eliminar 0503 Enter text, [Add] to layout, edit properties. 0503 Introduce texto, [Añadir] al diseño, edita propiedades. 0504 Enter text, click/drag on image, right click to remove 0504 Introduce texto, haz clic/arrastra en la imagen, clic derecho para eliminar 0505 Erase 0505 Borrar 0506 Erase existing areas 0506 Borrar áreas existentes 0507 Escher Spiral 0507 Espiral de Escher 0508 Exceed 50 anchor points 0508 Se superan los 50 puntos de anclaje 0509 Export Files 0509 Exportar archivos 0510 Export selected image files to another folder 0510 Exportar los archivos de imagen seleccionados a otra carpeta 0511 FILE MENU 0511 MENÚ DE ARCHIVO 0512 FILE SAVE 0512 GUARDAR ARCHIVO 0513 FILE VIEW 0513 VISTA DE ARCHIVO 0514 FIND AREA GAP 0514 BUSCAR HUECO EN ÁREA 0515 FIND BAD FILES 0515 BUSCAR ARCHIVOS DAÑADOS 0516 FIND DUPLICATES 0516 BUSCAR DUPLICADOS 0517 FIRST INDEX 0517 PRIMER ÍNDICE 0518 FIRST STARTUP 0518 PRIMER INICIO 0519 FIX META 0519 CORREGIR META 0520 FLATTEN HISTOGRAM 0520 APLANAR HISTOGRAMA 0521 FLATTEN PHOTO 0521 APLANAR FOTO 0522 FOLDER TREE 0522 ÁRBOL DE CARPETAS 0523 FOTOCX FOR WINDOWS 11 0523 FOTOCX PARA WINDOWS 11 0524 FOTOCX LIMITATIONS 0524 LIMITACIONES DE FOTOCX 0525 FOTOCX USAGE 0525 USO DE FOTOCX 0526 FRINGES 0526 FRANJAS 0527 FUSION 0527 FUSIÓN 0528 Fetch 0528 Obtener 0529 File 0529 Archivo 0530 File Mod Date/Time 0530 Fecha/hora de modificación del archivo 0531 File Name 0531 Nombre de archivo 0532 File Name/Number 0532 Nombre/número de archivo 0533 File Name: %s \n 0533 Nombre de archivo: %s \n 0534 File Size (bytes) 0534 Tamaño de archivo (bytes) 0535 File View 0535 Vista de archivo 0536 File count: 0536 Cantidad de archivos: 0537 File type cannot be edited 0537 El tipo de archivo no se puede editar 0538 File1 0538 Archivo1 0539 File2 0539 Archivo2 0540 File: 0540 Archivo: 0541 File: new session, open, rename, copy/move, delete, print 0541 Archivo: nueva sesión, abrir, renombrar, copiar/mover, eliminar, imprimir 0542 Fill selected areas or transparent areas with a color 0542 Rellenar áreas seleccionadas o áreas transparentes con un color 0543 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0543 Rellenar áreas seleccionadas con color para verificación visual. \nMétodo 1: clic izquierdo en cada área seleccionada aún no rellenada. \nMétodo 2: clic derecho FUERA de todas las áreas seleccionadas. \nPulsa el botón [ayuda] para más detalles 0544 Find 0544 Buscar 0545 Find Bad Files 0545 Buscar archivos dañados 0546 Find Duplicate Images 0546 Buscar imágenes duplicadas 0547 Find Duplicates 0547 Buscar duplicados 0548 Find Gap 0548 Buscar hueco 0549 Find a gap in an area outline 0549 Buscar un hueco en un contorno de área 0550 Find all images for a location [date range] 0550 Buscar todas las imágenes de una ubicación [rango de fechas] 0551 Find all images for a selected tag name and value 0551 Buscar todas las imágenes de un nombre y valor de tag seleccionado 0552 Find images meeting multiple search criteria 0552 Buscar imágenes que cumplan varios criterios de búsqueda 0553 Find optimum factors: 0553 Buscar factores óptimos: 0554 Finish 0554 Terminar 0555 Finish Area 0555 Terminar área 0556 Fix Bad File 0556 Corregir archivo dañado 0557 Fix Broken Metadata 0557 Corregir metadata dañada 0558 Fix Meta 0558 Corregir meta 0559 Fix Motion Blur 0559 Corregir desenfoque de movimiento 0560 Fix Perspective 0560 Corregir perspectiva 0561 Fix color fringes (chromatic aberration) 0561 Corregir franjas de color (aberración cromática) 0562 Fix perspective for object photographed from an angle 0562 Corregir la perspectiva de un objeto fotografiado en ángulo 0563 Fix red-eyes from flash photo 0563 Corregir ojos rojos de foto con flash 0564 Flatten 0564 Aplanar 0565 Flatten Histogram 0565 Aplanar histograma 0566 Flatten Pano 0566 Aplanar panorámica 0567 Flatten Photo 0567 Aplanar foto 0568 Flatten brightness histogram to enhance details 0568 Aplanar el histograma de brillo para mejorar los detalles 0569 Flatten curved surface. 0569 Aplanar superficie curva. 0570 Flatten photo of a curved image (e.g. poster on round column 0570 Aplanar foto de una imagen curva (p. ej. cartel en columna redonda 0571 Flip 0571 Voltear 0572 Folder Tree 0572 Árbol de carpetas 0573 Folders 0573 Carpetas 0574 Folders for image files (subfolders included automatically) 0574 Carpetas para archivos de imagen (las subcarpetas se incluyen automáticamente) 0575 Font 0575 Fuente 0576 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0576 Para una secuencia de imágenes aleatoria, este valor es \nla frecuencia relativa para mostrar la imagen. \nEl valor base es 10. 20 --> mostrarla 2 veces más a menudo. 0577 Foreground 0577 Primer plano 0578 Fotocx copyright notice 0578 Aviso de copyright de Fotocx 0579 Fotocx home 0579 Inicio de Fotocx 0580 Fotocx privacy policy 0580 Política de privacidad de Fotocx 0581 Fotocx video tutorial on YouTube 0581 Tutorial en vídeo de Fotocx en YouTube 0582 Fotocx web site (information and downloads) 0582 Sitio web de Fotocx (información y descargas) 0583 FreeSans 0583 FreeSans 0584 Full List 0584 Lista completa 0585 Full Screen 0585 Pantalla completa 0586 Fusion 0586 Fusión 0587 GALLERY END 0587 FIN DE LA GALERÍA 0588 GALLERY FILTER 0588 FILTRO DE GALERÍA 0589 GALLERY HOME 0589 INICIO DE GALERÍA 0590 GALLERY MENU 0590 MENÚ DE GALERÍA 0591 GALLERY OVERVIEW 0591 VISTA GENERAL DE GALERÍA 0592 GALLERY SORT 0592 ORDEN DE GALERÍA 0593 GALLERY TO ALBUM 0593 GALERÍA A ÁLBUM 0594 GALLERY VIEW 0594 VISTA DE GALERÍA 0595 GDK pixbuf: cannot save file 0595 GDK pixbuf: no se puede guardar el archivo 0596 GLOBAL RETINEX 0596 RETINEX GLOBAL 0597 GRID SETTINGS 0597 CONFIGURACIÓN DE CUADRÍCULA 0598 Gallery 0598 Galería 0599 Gallery End 0599 Fin de la galería 0600 Gallery Filter 0600 Filtro de galería 0601 Gallery Home 0601 Inicio de galería 0602 Gallery Sort 0602 Orden de galería 0603 Gallery View 0603 Vista de galería 0604 Gallery of newest image files 0604 Galería de los archivos de imagen más recientes 0605 Gallery of recently viewed image files 0605 Galería de archivos de imagen vistos recientemente 0606 Gallery to Album 0606 Galería a álbum 0607 Gallery view with thumbnails and basic metadata 0607 Vista de galería con thumbnails y metadata básica 0608 Gallery view with thumbnails and file data 0608 Vista de galería con thumbnails y datos de archivo 0609 Gallery: thumbnails, new/recent, sort, select, bookmarks 0609 Galería: thumbnails, nuevo/reciente, ordenar, seleccionar, marcadores 0610 Generate an inward spiraling repeating image 0610 Generar una imagen repetitiva en espiral hacia el interior 0611 Global Retinex 0611 Retinex global 0612 Gradual 0612 Gradual 0613 Graduated Blur 0613 Desenfoque graduado 0614 Graduated Blur - blur relative to pixel contrast 0614 Desenfoque graduado - desenfoque relativo al contraste de píxeles 0615 Grayscale 0615 Escala de grises 0616 Green 0616 Verde 0617 Grid Settings 0617 Configuración de cuadrícula 0618 Group by country 0618 Agrupar por país 0619 Group by country/date 0619 Agrupar por país/fecha 0620 Group by country/location 0620 Agrupar por país/ubicación 0621 Group by country/location/date 0621 Agrupar por país/ubicación/fecha 0622 Group by date/country 0622 Agrupar por fecha/país 0623 Group by date/country/location 0623 Agrupar por fecha/país/ubicación 0624 HDF 0624 HDF 0625 HDR 0625 HDR 0626 HELP MENU 0626 MENÚ DE AYUDA 0627 Hard 0627 Duro 0628 Height 0628 Altura 0629 Height: 0629 Altura: 0630 Help 0630 Ayuda 0631 Help: user guide, tutorial, change log, licenses, privacy, about 0631 Ayuda: guía del usuario, tutorial, registro de cambios, licencias, privacidad, acerca de 0632 Hide 0632 Ocultar 0633 Hide selected areas 0633 Ocultar áreas seleccionadas 0634 High 0634 Alto 0635 High Depth of Field - combine near/far focus images for deeper focus 0635 Alta profundidad de campo - combina imágenes de enfoque cercano/lejano para mayor profundidad de foco 0636 High Dynamic Range - combine bright/dark images for better detail 0636 Alto rango dinámico - combina imágenes claras/oscuras para más detalle 0637 Highlight darkest and brightest pixels 0637 Resaltar los píxeles más oscuros y más brillantes 0638 Home Folder 0638 Carpeta de inicio 0639 Home Page 0639 Página de inicio 0640 Horz 0640 Horiz 0641 How to remove Fotocx application and user files 0641 Cómo eliminar la aplicación Fotocx y los archivos de usuario 0642 Hue 0642 Matiz 0643 IMAGE ARRAY 0643 MATRIZ DE IMÁGENES 0644 INDEX FILES 0644 INDEXAR ARCHIVOS 0645 INSIDE-OUT 0645 INVERSO 0646 INVERT AREA 0646 INVERTIR ÁREA 0647 Icon size 0647 Tamaño de icono 0648 Icons 0648 Iconos 0649 Image 0649 Imagen 0650 Image Array 0650 Matriz de imágenes 0651 Image Columns 0651 Columnas de imagen 0652 Image Differences 0652 Diferencias de imagen 0653 Image File 0653 Archivo de imagen 0654 Image File: 0654 Archivo de imagen: 0655 Image Keywords 0655 Keywords de imagen 0656 Image Locations 0656 Ubicaciones de imagen 0657 Image Markup 0657 Marcado de imagen 0658 Image Position 0658 Posición de imagen 0659 Image Preferences 0659 Preferencias de imagen 0660 Image Ratios 0660 Proporciones de imagen 0661 Image Size (pixels) 0661 Tamaño de imagen (píxeles) 0662 Image Time 0662 Hora de imagen 0663 Image Timeline 0663 Línea de tiempo de imágenes 0664 Image colors are converted for printing. 0664 Los colores de la imagen se convierten para impresión. 0665 Image dimensions have changed \nCopy Prior Edit cannot be used 0665 Las dimensiones de la imagen han cambiado \nCopiar edición anterior no se puede usar 0666 Image dimensions have changed, \nArea Blend cannot be used 0666 Las dimensiones de la imagen han cambiado, \nMezcla de área no se puede usar 0667 Image dimensions have changed, \nthis prior image cannot be used 0667 Las dimensiones de la imagen han cambiado, \nesta imagen anterior no se puede usar 0668 Image is fixed, unmovable 0668 La imagen está fija, no se puede mover 0669 Images sizes are not compatible 0669 Los tamaños de las imágenes no son compatibles 0670 Include: 0670 Incluir: 0671 Index Files 0671 Indexar archivos 0672 Index Level 0672 Nivel de índice 0673 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0673 La función de índice terminó. \nEs necesario indexar para las funciones de búsqueda y mapa \ny para que las páginas de galería de thumbnails se muestren rápido. 0674 Index new image files and make thumbnails 0674 Indexar nuevos archivos de imagen y crear thumbnails 0675 Input color to match and adjust: 0675 Color de entrada a igualar y ajustar: 0676 Inside-out 0676 Inverso 0677 Intensity 0677 Intensidad 0678 Invert 0678 Invertir 0679 Invert selected areas (selected ↔ not selected) 0679 Invertir áreas seleccionadas (seleccionada ↔ no seleccionada) 0680 Irregular Tiles 0680 Mosaicos irregulares 0681 Iterations 0681 Iteraciones 0682 JPEG ARTIFACTS 0682 ARTEFACTOS JPEG 0683 JPEG Artifacts 0683 Artefactos JPEG 0684 JPEG files 0684 Archivos JPEG 0685 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0685 Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic 0686 Jump to gallery beginning [home] 0686 Saltar al inicio de la galería [inicio] 0687 Jump to gallery end [end] 0687 Saltar al final de la galería [fin] 0688 KEYBOARD ESCAPE KEY 0688 TECLA ESCAPE DEL TECLADO 0689 KEYBOARD SHORTCUTS 0689 ATAJOS DE TECLADO 0690 KEYWORDS OVERVIEW 0690 VISTA GENERAL DE KEYWORDS 0691 Keep 0691 Mantener 0692 Kernel size 0692 Tamaño del kernel 0693 Keyboard Shortcuts 0693 Atajos de teclado 0694 Keywords Category 0694 Categoría de keywords 0695 Kill active dialog? 0695 ¿Cerrar el diálogo activo? 0696 Kill busy function? 0696 ¿Detener la función en curso? 0697 Kuwahara 0697 Kuwahara 0698 Kuwahara Depth 0698 Profundidad de Kuwahara 0699 LINE COLOR 0699 COLOR DE LÍNEA 0700 LOAD/SAVE AREA 0700 CARGAR/GUARDAR ÁREA 0701 LOCAL CONTRAST 0701 CONTRASTE LOCAL 0702 LOCAL RETINEX 0702 RETINEX LOCAL 0703 Language 0703 Idioma 0704 Layout and background image 0704 Diseño e imagen de fondo 0705 Left 0705 Izquierda 0706 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0706 Arrastra con el botón izquierdo dentro del área \npara deshacer gradualmente las ediciones del área. \nArrastra con el derecho para restaurar las ediciones. \nArrastra a lo largo del borde del área para mezclar el borde. 0707 Left/right click: previous/next image (also arrow keys) 0707 Clic izquierdo/derecho: imagen anterior/siguiente (también teclas de flecha) 0708 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0708 Clic izquierdo/derecho: deshacer/rehacer un paso de edición \nClic central: volver al paso de edición seleccionado 0709 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0709 Clic izquierdo/derecho: acercar/alejar imagen/thumbnail (también teclas +/-) 0710 Length 0710 Longitud 0711 Level 0711 Nivel 0712 Licenses 0712 Licencias 0713 Light Source 0713 Fuente de luz 0714 Lightness 0714 Luminosidad 0715 Limit 0715 Límite 0716 Line Color 0716 Color de línea 0717 Line Threshold 0717 Umbral de línea 0718 Line Width 0718 Ancho de línea 0719 Line length 0719 Longitud de línea 0720 List Fotocx command line parameters 0720 Listar los parámetros de línea de comandos de Fotocx 0721 List all metadata for current image or clicked thumbnail 0721 Listar toda la metadata de la imagen actual o el thumbnail pulsado 0722 List outboard programs and functions 0722 Listar programas y funciones externos 0723 Load 0723 Cargar 0724 Load settings from file 0724 Cargar configuración desde archivo 0725 Local Contrast 0725 Contraste local 0726 Local Retinex 0726 Retinex local 0727 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0727 La ubicación y el país reemplazarán los valores actuales.\nLos datos GPS se reemplazan solo si hay un nuevo valor presente. 0728 Lock 0728 Bloquear 0729 Low Amplify 0729 Amplificación baja 0730 MAGNIFY IMAGE 0730 AMPLIAR IMAGEN 0731 MAKE WAVES 0731 CREAR OLAS 0732 MANAGE KEYWORDS 0732 GESTIONAR KEYWORDS 0733 MAP MENU 0733 MENÚ DE MAPA 0734 MAP VIEW 0734 VISTA DE MAPA 0735 MARGINS 0735 MÁRGENES 0736 MARKUP 0736 MARCADO 0737 MASHUP 0737 MASHUP 0738 MATCH COLORS 0738 IGUALAR COLORES 0739 MEASURE IMAGE 0739 MEDIR IMAGEN 0740 MENU SHORTCUTS 0740 ATAJOS DE MENÚ 0741 METADATA MENU 0741 MENÚ DE METADATA 0742 METADATA TAGS 0742 TAGS DE METADATA 0743 METADATA VIEW 0743 VISTA DE METADATA 0744 MONITOR COLOR 0744 COLOR DE MONITOR 0745 MOSAIC 0745 MOSAICO 0746 MOUSE ALT-RIGHT-BUTTON 0746 RATÓN ALT-BOTÓN DERECHO 0747 MOUSE FUNCTIONS 0747 FUNCIONES DEL RATÓN 0748 MOUSE OWNERSHIP 0748 PROPIEDAD DEL RATÓN 0749 MOVE FOTOCX HOME 0749 MOVER INICIO DE FOTOCX 0750 Magnify 0750 Ampliar 0751 Magnify Image 0751 Ampliar imagen 0752 Magnify image around the mouse position 0752 Ampliar la imagen alrededor de la posición del ratón 0753 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0753 La memoria principal es demasiado pequeña para ejecutar Fotocx. \nPuedes intentarlo de todos modos si lo deseas. \n ¿Continuar? 0754 Make Layout Image 0754 Crear imagen de diseño 0755 Make Square Tiles 0755 Crear mosaicos cuadrados 0756 Make Waves 0756 Crear olas 0757 Make a spherical projection of an image 0757 Crear una proyección esférica de una imagen 0758 Make black margins transparent 0758 Hacer transparentes los márgenes negros 0759 Make new versions 0759 Crear nuevas versiones 0760 Make width constant for window size 0760 Mantener el ancho constante según el tamaño de la ventana 0761 Manage Keywords 0761 Gestionar keywords 0762 Map 0762 Mapa 0763 Map View 0763 Vista de mapa 0764 Maps 0764 Mapas 0765 Maps: view images by map location 0765 Mapas: ver imágenes por ubicación en el mapa 0766 Margin 0766 Margen 0767 Margins 0767 Márgenes 0768 Markup 0768 Marcado 0769 Mashup 0769 Mashup 0770 Mass update album files 0770 Actualizar masivamente los archivos del álbum 0771 Match Brightness 0771 Igualar brillo 0772 Match Colors 0772 Igualar colores 0773 Match Level 0773 Nivel de igualación 0774 Match Limit 0774 Límite de igualación 0775 Match image colors to colors of another image 0775 Igualar los colores de la imagen con los colores de otra imagen 0776 Match using: 0776 Igualar usando: 0777 Matching Keywords 0777 Keywords coincidentes 0778 Max 0778 Máx 0779 Max. Width 0779 Ancho máx. 0780 Measure Image 0780 Medir imagen 0781 Measure Noise 0781 Medir ruido 0782 Measure pixel distances within an image 0782 Medir distancias de píxeles dentro de una imagen 0783 Menu Colors 0783 Colores del menú 0784 Menu Style 0784 Estilo del menú 0785 Metadata 0785 Metadata 0786 Metadata Tags 0786 Tags de metadata 0787 Metadata View 0787 Vista de metadata 0788 Metadata from Search Function 0788 Metadata de la función de búsqueda 0789 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0789 Método 1:\nClic izquierdo sobre el ojo rojo para oscurecerlo.\nMétodo 2:\nArrastra hacia abajo y a la derecha para encerrar el ojo rojo.\nClic izquierdo sobre el ojo rojo para oscurecerlo.\nDeshacer ojo rojo:\nClic derecho sobre el ojo rojo. 0790 Mirror: 0790 Espejo: 0791 Mode: 0791 Modo: 0792 Monitor Color 0792 Color de monitor 0793 Mosaic 0793 Mosaico 0794 Mouse Radius 0794 Radio del ratón 0795 Mouse Warp (drag image) 0795 Deformación con el ratón (arrastrar imagen) 0796 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0796 Arrastrar con el ratón: desplazar imagen 360° \nClic izquierdo/derecho del ratón: acercar/alejar \nEscape: salir de la vista panorámica 0797 Move %d image files 0797 Mover %d archivos de imagen 0798 Move Fotocx Home 0798 Mover inicio de Fotocx 0799 Move Fotocx Home Folder 0799 Mover carpeta de inicio de Fotocx 0800 Move Fotocx home folder to chosen folder 0800 Mover la carpeta de inicio de Fotocx a la carpeta elegida 0801 Move mouse in a monotone image area. 0801 Mueve el ratón en un área de imagen monótona. 0802 Multiplier 0802 Multiplicador 0803 NEW SESSION 0803 NUEVA SESIÓN 0804 NEWEST FILES 0804 ARCHIVOS MÁS RECIENTES 0805 NEWLINE CHARACTERS IN METADATA 0805 CARACTERES DE NUEVA LÍNEA EN METADATA 0806 NON-STANDARD DIALOG WIDGETS 0806 WIDGETS DE DIÁLOGO NO ESTÁNDAR 0807 New Area 0807 Área nueva 0808 New File Name: 0808 Nuevo nombre de archivo: 0809 New Location 0809 Nueva ubicación 0810 New Location: 0810 Nueva ubicación: 0811 New Name 0811 Nuevo nombre 0812 New Session 0812 Nueva sesión 0813 New Type: 0813 Nuevo tipo: 0814 New Version 0814 Nueva versión 0815 Newest 0815 Más reciente 0816 Newest Files 0816 Archivos más recientes 0817 Next 0817 Siguiente 0818 Next gallery 0818 Siguiente galería 0819 No 0819 No 0820 No curve lines found 0820 No se encontraron líneas de curva 0821 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0821 No se encontró ningún índice de archivos de imagen.\nSe creará un índice de archivos de imagen.\nTus archivos de imagen no se modificarán.\nEsto puede necesitar bastante tiempo si \ntienes muchos miles de archivos de imagen. 0822 No images found 0822 No se encontraron imágenes 0823 Noise Reduction 0823 Reducción de ruido 0824 Noise Size 0824 Tamaño de ruido 0825 None 0825 Ninguno 0826 Normal Blur 0826 Desenfoque normal 0827 Normal Blur - mix pixels with all neighbor pixels 0827 Desenfoque normal - mezcla píxeles con todos los píxeles vecinos 0828 OPEN IMAGE FILE 0828 ABRIR ARCHIVO DE IMAGEN 0829 OTHER TOPICS 0829 OTROS TEMAS 0830 OUTLINES 0830 CONTORNOS 0831 Old Name 0831 Nombre anterior 0832 One Tag: 0832 Un tag: 0833 Opacity 0833 Opacidad 0834 Open 0834 Abrir 0835 Open Image File 0835 Abrir archivo de imagen 0836 Open a file and paste as selected area into an image 0836 Abrir un archivo y pegarlo como área seleccionada en una imagen 0837 Open a parallel Fotocx session 0837 Abrir una sesión paralela de Fotocx 0838 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0838 Abrir y editar el archivo de carta de colores escaneado. \nElimina cualquier inclinación o rotación del escaneo. \n(Usa la función Corregir perspectiva para esto). \nRecorta el fino margen verde con PRECISIÓN. \nGuarda (reemplaza) el archivo de carta de colores. 0839 Open the trimmed color chart file 0839 Abrir el archivo de carta de colores recortado 0840 Optimize 0840 Optimizar 0841 Other Tag ... 0841 Otro tag ... 0842 Outboard Programs 0842 Programas externos 0843 Outline Drawing 0843 Dibujo de contornos 0844 Outlines 0844 Contornos 0845 Output Color 0845 Color de salida 0846 Overlap 0846 Superposición 0847 Overlay position in host image: 0847 Posición de la superposición en la imagen anfitriona: 0848 Overlay width, % host image width: 0848 Ancho de la superposición, % del ancho de la imagen anfitriona: 0849 Overwrite file? \n%s 0849 ¿Sobrescribir archivo? \n%s 0850 PAINT EDITS 0850 PINTAR EDICIONES 0851 PAINT IMAGE 0851 PINTAR IMAGEN 0852 PAINT TRANSPARENCY 0852 PINTAR TRANSPARENCIA 0853 PAINTING 0853 PINTURA 0854 PANORAMA 0854 PANORÁMICA 0855 PATTERN 0855 PATRÓN 0856 PERSPECTIVE 0856 PERSPECTIVA 0857 PLACES/DATES 0857 LUGARES/FECHAS 0858 PLUGINS 0858 PLUGINS 0859 PREV/NEXT 0859 ANTERIOR/SIGUIENTE 0860 PRINT CALIBRATED 0860 IMPRIMIR CALIBRADO 0861 PRINT IMAGE 0861 IMPRIMIR IMAGEN 0862 PRIVACY 0862 PRIVACIDAD 0863 PROBLEM FILES 0863 ARCHIVOS PROBLEMÁTICOS 0864 PROBLEM REPORTING 0864 REPORTE DE PROBLEMAS 0865 Paint Edits 0865 Pintar ediciones 0866 Paint Edits already active 0866 Pintar ediciones ya está activo 0867 Paint Image 0867 Pintar imagen 0868 Paint Image Transparencies 0868 Pintar transparencias de imagen 0869 Paint Radius 0869 Radio de pintura 0870 Paint Transparency 0870 Pintar transparencia 0871 Paint and Warp Image 0871 Pintar y deformar imagen 0872 Paint current edit function gradually using the mouse 0872 Pintar la función de edición actual gradualmente usando el ratón 0873 Paint entire image 0873 Pintar la imagen completa 0874 Paint image transparency using the mouse 0874 Pintar la transparencia de la imagen usando el ratón 0875 Paint on Image 0875 Pintar en la imagen 0876 Paint on image using the mouse 0876 Pintar en la imagen usando el ratón 0877 Paint transparency 0877 Pintar transparencia 0878 Paint within mouse 0878 Pintar dentro del ratón 0879 Painting 0879 Pintura 0880 Panorama 0880 Panorámica 0881 Paste 0881 Pegar 0882 Paste Image 0882 Pegar imagen 0883 Paste previously copied area into image 0883 Pegar el área copiada previamente en la imagen 0884 Pattern 0884 Patrón 0885 Pattern File: 0885 Archivo de patrón: 0886 Pattern Width 0886 Ancho del patrón 0887 Percent 0887 Porcentaje 0888 Permissions 0888 Permisos 0889 Perspective 0889 Perspectiva 0890 Photo Date/Time 0890 Fecha/hora de foto 0891 Photo Date/Time (metadata) 0891 Fecha/hora de foto (metadata) 0892 Photo Date: %s File Date: %s \n 0892 Fecha de foto: %s Fecha de archivo: %s \n 0893 Pixel count 0893 Recuento de píxeles 0894 Pixel difference 0894 Diferencia de píxeles 0895 Pixels 0895 Píxeles 0896 Places/Dates 0896 Lugares/fechas 0897 Plugin working ... 0897 Plugin trabajando ... 0898 Popup Image 0898 Imagen emergente 0899 Power 0899 Potencia 0900 Power Center 0900 Potencia centro 0901 Power: Center 0901 Potencia: centro 0902 Pre-align Images 0902 Prealinear imágenes 0903 Preference: 0903 Preferencia: 0904 Press F1 for help 0904 Pulsa F1 para ayuda 0905 Prev 0905 Ant 0906 Prev/Next 0906 Anterior/siguiente 0907 Previous 0907 Anterior 0908 Previous gallery 0908 Galería anterior 0909 Print Calibrated 0909 Imprimir calibrado 0910 Print Image 0910 Imprimir imagen 0911 Print chart in vertical orientation without margins. 0911 Imprimir la carta en orientación vertical sin márgenes. 0912 Print current image file with calibrated colors 0912 Imprimir el archivo de imagen actual con colores calibrados 0913 Print the current image file 0913 Imprimir el archivo de imagen actual 0914 Privacy 0914 Privacidad 0915 Proceed 0915 Continuar 0916 Proceed? 0916 ¿Continuar? 0917 Process album files matching selected files: 0917 Procesar archivos de álbum que coincidan con los archivos seleccionados: 0918 Process an image using a custom convolution kernel 0918 Procesar una imagen usando un kernel de convolución personalizado 0919 Process selected album files: 0919 Procesar los archivos de álbum seleccionados: 0920 Processing files 0920 Procesando archivos 0921 Project name 0921 Nombre del proyecto 0922 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0922 Arrastra una posición de la imagen usando el ratón. \nRealiza varios arrastres hasta quedar satisfecho. \nAl terminar, pulsa [OK]. 0923 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0923 Arrastra una esquina de la imagen usando el ratón. \nRealiza varios arrastres hasta quedar satisfecho. \nAl terminar, pulsa [OK]. 0924 Pull on the image with the mouse. 0924 Arrastra la imagen con el ratón. 0925 Purge unwanted keywords from all image files 0925 Purgar keywords no deseadas de todos los archivos de imagen 0926 QUESTIONS, SUGGESTIONS 0926 PREGUNTAS, SUGERENCIAS 0927 Quit 0927 Salir 0928 Quit Fotocx 0928 Salir de Fotocx 0929 Quit Fotocx? 0929 ¿Salir de Fotocx? 0930 RAW Files 0930 Archivos RAW 0931 RAW Options 0931 Opciones RAW 0932 RAW conversion failed: %s %s 0932 Fallo en la conversión RAW: %s %s 0933 RAW loader 0933 Cargador RAW 0934 RECENT FILES 0934 ARCHIVOS RECIENTES 0935 RECENT FOLDERS 0935 CARPETAS RECIENTES 0936 RED EYES 0936 OJOS ROJOS 0937 REFINE MENU 0937 MENÚ DE REFINAMIENTO 0938 REMOVE DUST 0938 ELIMINAR POLVO 0939 REMOVE HALO 0939 ELIMINAR HALO 0940 RENAME 0940 RENOMBRAR 0941 RENAME ALBUM 0941 RENOMBRAR ÁLBUM 0942 REPAIR MENU 0942 MENÚ DE REPARACIÓN 0943 RESCALE 0943 REESCALAR 0944 RETOUCH 0944 RETOCAR 0945 RGB -> BRG 0945 RGB -> BRG 0946 RGB -> GBR 0946 RGB -> GBR 0947 RGB HISTOGRAM 0947 HISTOGRAMA RGB 0948 RGB Histogram 0948 Histograma RGB 0949 RGB brightness histogram graph 0949 Gráfico de histograma de brillo RGB 0950 RGB color 0950 Color RGB 0951 RGB mix with given bit-depth 0951 Mezcla RGB con la profundidad de bits indicada 0952 ROTATE 0952 ROTAR 0953 RUN SCRIPT 0953 EJECUTAR SCRIPT 0954 Radial Blur 0954 Desenfoque radial 0955 Radial Blur - mix pixels in radial lines from chosen center 0955 Desenfoque radial - mezcla píxeles en líneas radiales desde un centro elegido 0956 Radius 0956 Radio 0957 Random Image 0957 Imagen aleatoria 0958 Range 0958 Rango 0959 Rating: %s Size: %s %.2fmb \n 0959 Valoración: %s Tamaño: %s %.2fmb \n 0960 Read or search the user guide 0960 Leer o buscar en la guía del usuario 0961 Recent Files 0961 Archivos recientes 0962 Recent Folders 0962 Carpetas recientes 0963 Recent Keywords 0963 Keywords recientes 0964 Rectify closeup face photo (balloon face) 0964 Rectificar foto de primer plano de cara (efecto globo) 0965 Red 0965 Rojo 0966 Red Eye Reduction 0966 Reducción de ojos rojos 0967 Red Eyes 0967 Ojos rojos 0968 Red Factors 0968 Factores de rojo 0969 Redo 0969 Rehacer 0970 Reduce Fog/Haze 0970 Reducir niebla/bruma 0971 Reduce fog/haze in an image or selected areas 0971 Reducir niebla/bruma en una imagen o áreas seleccionadas 0972 Refine 0972 Refinar 0973 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0973 Refinar: aplanar histograma, contraste local, amplificar contraste, retinex, saturación 0974 Remove 0974 Eliminar 0975 Remove Dust 0975 Eliminar polvo 0976 Remove Halo 0976 Eliminar halo 0977 Remove dust spots from old scanned photos 0977 Eliminar manchas de polvo de fotos escaneadas antiguas 0978 Remove from Album 0978 Quitar del álbum 0979 Remove halos left by some edit functions 0979 Eliminar halos dejados por algunas funciones de edición 0980 Remove image curvature, especially in panoramas 0980 Eliminar la curvatura de la imagen, especialmente en panorámicas 0981 Remove jaggies on hard image feature edges 0981 Eliminar dentado en bordes de formas duras de la imagen 0982 Remove selected image metadata 0982 Eliminar la metadata seleccionada de la imagen 0983 Remove unwanted objects in an image 0983 Eliminar objetos no deseados en una imagen 0984 Rename 0984 Renombrar 0985 Rename Album 0985 Renombrar álbum 0986 Rename Image File 0986 Renombrar archivo de imagen 0987 Rename an existing album 0987 Renombrar un álbum existente 0988 Rename or delete keywords for all image files 0988 Renombrar o eliminar keywords para todos los archivos de imagen 0989 Rename to 0989 Renombrar a 0990 Rename/convert/rescale/move selected image or RAW files 0990 Renombrar/convertir/reescalar/mover la imagen o los archivos RAW seleccionados 0991 Repair 0991 Reparar 0992 Repair malformed metadata preventing metadata edits 0992 Reparar metadata malformada que impide editar la metadata 0993 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 0993 Reparar: enfocar, desenfocar, reducir ruido, quitar niebla, ojos rojos, borrado inteligente, ajustar color 0994 Replace 0994 Reemplazar 0995 Replace Text 0995 Reemplazar texto 0996 Replace all versions with newest version 0996 Reemplazar todas las versiones con la versión más reciente 0997 Replace all versions with selected versions 0997 Reemplazar todas las versiones con las versiones seleccionadas 0998 Replace all with newest version only 0998 Reemplazar todo solo con la versión más reciente 0999 Replace all with original + newest version 0999 Reemplazar todo con original + versión más reciente 1000 Replace all with original + selected versions 1000 Reemplazar todo con original + versiones seleccionadas 1001 Replace all with original and all versions 1001 Reemplazar todo con original y todas las versiones 1002 Replace all with selected versions 1002 Reemplazar todo con versiones seleccionadas 1003 Replace host files 1003 Reemplazar archivos anfitriones 1004 Report Image Places/Dates 1004 Informe de lugares/fechas de imagen 1005 Report selected metadata for selected image files 1005 Informar de la metadata seleccionada para los archivos de imagen seleccionados 1006 Rescale 1006 Reescalar 1007 Rescale Image 1007 Reescalar imagen 1008 Rescale RGB levels to reduce color caste and fog/haze 1008 Reescalar niveles RGB para reducir el tinte de color y la niebla/bruma 1009 Rescale brightness levels to increase local contrast 1009 Reescalar los niveles de brillo para aumentar el contraste local 1010 Rescale: 1010 Reescalar: 1011 Reserved Shortcuts \n 1011 Atajos reservados \n 1012 Reserved shortcut ignored: %s 1012 Atajo reservado ignorado: %s 1013 Reset 1013 Restablecer 1014 Reset all galleries to file name ascending 1014 Restablecer todas las galerías a nombre de archivo ascendente 1015 Resolution 1015 Resolución 1016 Resources 1016 Recursos 1017 Resume 1017 Reanudar 1018 Retouch 1018 Retocar 1019 Reverse R 1019 Invertir R 1020 Richardson-Lucy 1020 Richardson-Lucy 1021 Right 1021 Derecha 1022 Rim % 1022 Borde % 1023 Rotate 1023 Rotar 1024 Rotate Image 1024 Rotar imagen 1025 Rotate or level an image 1025 Rotar o nivelar una imagen 1026 Rotate: 1026 Rotar: 1027 Roy Lichtenstein effect 1027 Efecto Roy Lichtenstein 1028 SATURATION 1028 SATURACIÓN 1029 SCRIPT FILES 1029 ARCHIVOS DE SCRIPT 1030 SEARCH IMAGES 1030 BUSCAR IMÁGENES 1031 SELECT AREA 1031 SELECCIONAR ÁREA 1032 SELECT FILES 1032 SELECCIONAR ARCHIVOS 1033 SELECT IMAGE FILES 1033 SELECCIONAR ARCHIVOS DE IMAGEN 1034 SELECT MENU 1034 MENÚ DE SELECCIÓN 1035 SET COLORS 1035 ESTABLECER COLORES 1036 SET WALLPAPER 1036 ESTABLECER FONDO DE ESCRITORIO 1037 SETTINGS 1037 CONFIGURACIÓN 1038 SHARPEN 1038 ENFOCAR 1039 SHIFT COLORS 1039 DESPLAZAR COLORES 1040 SHORTCUTS 1040 ATAJOS 1041 SHOW CIM FILES 1041 MOSTRAR ARCHIVOS CIM 1042 SHOW DIFFS 1042 MOSTRAR DIFERENCIAS 1043 SHOW ON MAP 1043 MOSTRAR EN MAPA 1044 SHOW RESOURCES 1044 MOSTRAR RECURSOS 1045 SHOW RGB 1045 MOSTRAR RGB 1046 SHOW/HIDE AREA 1046 MOSTRAR/OCULTAR ÁREA 1047 SKETCH1 1047 BOCETO1 1048 SKETCH2 1048 BOCETO2 1049 SLIDE SHOW 1049 PRESENTACIÓN DE DIAPOSITIVAS 1050 SLIDES AND NEGATIVES 1050 DIAPOSITIVAS Y NEGATIVOS 1051 SLIDESHOW END 1051 FIN DE LA PRESENTACIÓN 1052 SMART ERASE 1052 BORRADO INTELIGENTE 1053 SOFT FOCUS 1053 ENFOQUE SUAVE 1054 SPHERE 1054 ESFERA 1055 SPLIT-SCREEN 1055 PANTALLA DIVIDIDA 1056 STACK/LAYERS 1056 PILA/CAPAS 1057 STACK/NOISE 1057 PILA/RUIDO 1058 STACK/PAINT 1058 PILA/PINTURA 1059 Saturation 1059 Saturación 1060 Save 1060 Guardar 1061 Save Gallery as Album 1061 Guardar galería como álbum 1062 Save Image File 1062 Guardar archivo de imagen 1063 Save as new file name or type 1063 Guardar como nuevo nombre o tipo de archivo 1064 Save current gallery as album 1064 Guardar la galería actual como álbum 1065 Save modified image as new file or new file version 1065 Guardar la imagen modificada como archivo nuevo o nueva versión de archivo 1066 Save selected area to a file with transparency 1066 Guardar el área seleccionada en un archivo con transparencia 1067 Saved Areas 1067 Áreas guardadas 1068 Scale 1068 Escala 1069 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1069 Escanea la carta de colores impresa, la fila más oscura arriba. \nGuarda como archivo .png usando los nombres de impresora y papel \n(p. ej. %s/Epson_glossy.png). \n 1070 Search 1070 Buscar 1071 Search Images 1071 Buscar imágenes 1072 Search Results 1072 Resultados de búsqueda 1073 Search all image files and report duplicates 1073 Buscar en todos los archivos de imagen e informar de duplicados 1074 Searching - use ESC key to terminate 1074 Buscando - usa la tecla ESC para detener 1075 Seconds 1075 Segundos 1076 Select 1076 Seleccionar 1077 Select %d to %d files 1077 Seleccionar de %d a %d archivos 1078 Select Album 1078 Seleccionar álbum 1079 Select Albums 1079 Seleccionar álbumes 1080 Select Area 1080 Seleccionar área 1081 Select Area for Edits 1081 Seleccionar área para ediciones 1082 Select Area not supported \nby this edit function 1082 Seleccionar área no compatible \ncon esta función de edición 1083 Select Files 1083 Seleccionar archivos 1084 Select Image 1084 Seleccionar imagen 1085 Select Image Files 1085 Seleccionar archivos de imagen 1086 Select Metadata tags 1086 Seleccionar tags de metadata 1087 Select Script 1087 Seleccionar script 1088 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1088 Selecciona un área para deformar usando la función seleccionar área. \nPulsa [iniciar deformación] y arrastra el área con el ratón. \nRealiza varios arrastres hasta quedar satisfecho. \nAl terminar, selecciona otra área o pulsa [OK]. 1089 Select and Paint Image 1089 Seleccionar y pintar imagen 1090 Select and view an image file 1090 Seleccionar y ver un archivo de imagen 1091 Select area cannot be kept.\nContinue? 1091 El área seleccionada no se puede conservar.\n¿Continuar? 1092 Select area disabled, Continue? 1092 Área seleccionada desactivada, ¿continuar? 1093 Select area not finished, Continue? 1093 Área seleccionada no terminada, ¿continuar? 1094 Select area will be ignored. \nContinue? 1094 El área seleccionada se ignorará. \n¿Continuar? 1095 Select folder 1095 Seleccionar carpeta 1096 Select host image files 1096 Seleccionar archivos de imagen anfitriones 1097 Select image areas to edit separately, copy/paste selections 1097 Seleccionar áreas de imagen para editar por separado, copiar/pegar selecciones 1098 Select image objects or areas for separate editing 1098 Seleccionar objetos o áreas de imagen para edición por separado 1099 Select input files for subsequent function 1099 Seleccionar archivos de entrada para la siguiente función 1100 Select overlay file 1100 Seleccionar archivo de superposición 1101 Select startup album 1101 Seleccionar álbum de inicio 1102 Select startup folder 1102 Seleccionar carpeta de inicio 1103 Select startup image file 1103 Seleccionar archivo de imagen de inicio 1104 Select the image file to print. 1104 Selecciona el archivo de imagen a imprimir. 1105 Select to add, click on X to delete. 1105 Selecciona para añadir, haz clic en X para eliminar. 1106 Select two files 1106 Selecciona dos archivos 1107 Select versions, ratings, keywords, filename text 1107 Selecciona versiones, valoraciones, keywords, texto del nombre de archivo 1108 Separation Horz 1108 Separación horiz. 1109 Sequence Numbers 1109 Números de secuencia 1110 Set Colors 1110 Establecer colores 1111 Set No. of Colors 1111 Establecer número de colores 1112 Set Ratio: 1112 Establecer proporción: 1113 Set Wallpaper 1113 Establecer fondo de escritorio 1114 Set Width: 1114 Establecer ancho: 1115 Set and view bookmarks, select for gallery view 1115 Establecer y ver marcadores, seleccionar para vista de galería 1116 Set black-white/color, negative/positive, sepia 1116 Establecer blanco y negro/color, negativo/positivo, sepia 1117 Set foreground line color (crop, grid, select, warp) 1117 Establecer color de línea de primer plano (recorte, cuadrícula, selección, deformación) 1118 Set gallery from latest search results 1118 Establecer galería a partir de los resultados de búsqueda más recientes 1119 Set gallery from recent folders list 1119 Establecer galería a partir de la lista de carpetas recientes 1120 Set gallery to folder of current file 1120 Establecer galería a la carpeta del archivo actual 1121 Set horizontal/vertical grid line counts 1121 Establecer número de líneas de cuadrícula horizontal/vertical 1122 Set image file as desktop wallpaper 1122 Establecer el archivo de imagen como fondo de escritorio 1123 Set line properties, [Add] to layout, edit. 1123 Establecer propiedades de línea, [Añadir] al diseño, editar. 1124 Set number of colors for each R/G/B or total 1124 Establecer número de colores para cada R/G/B o total 1125 Set or shift photo date/time for selected image files 1125 Establecer o desplazar la fecha/hora de la foto de los archivos de imagen seleccionados 1126 Set the name for the output calibration file \n[your calibration name].dat 1126 Establecer el nombre del archivo de calibración de salida \n[tu nombre de calibración].dat 1127 Settings 1127 Configuración 1128 Sharpen 1128 Enfocar 1129 Sharpen the image (various methods) 1129 Enfocar la imagen (varios métodos) 1130 Shift + drag mouse across image \nto indicate blur direction 1130 Mayús + arrastra el ratón por la imagen \npara indicar la dirección del desenfoque 1131 Shift Colors 1131 Desplazar colores 1132 Shift/convert image colors into other colors 1132 Desplazar/convertir los colores de la imagen a otros colores 1133 Short List 1133 Lista corta 1134 Show 1134 Mostrar 1135 Show (outline) selected areas 1135 Mostrar (contorno) áreas seleccionadas 1136 Show CIM Files 1136 Mostrar archivos CIM 1137 Show Diffs 1137 Mostrar diferencias 1138 Show Fotocx installed version and author contact 1138 Mostrar la versión instalada de Fotocx y el contacto del autor 1139 Show Fotocx updates for recent releases 1139 Mostrar las actualizaciones de Fotocx de versiones recientes 1140 Show Hidden 1140 Mostrar ocultos 1141 Show Log File 1141 Mostrar archivo de registro 1142 Show RGB 1142 Mostrar RGB 1143 Show RGB levels at mouse position 1143 Mostrar niveles RGB en la posición del ratón 1144 Show Resources 1144 Mostrar recursos 1145 Show folder hierarchy, click folder for gallery view 1145 Mostrar jerarquía de carpetas, haz clic en una carpeta para vista de galería 1146 Show image counts in year/month table, select, report 1146 Mostrar recuento de imágenes en tabla de año/mes, seleccionar, informar 1147 Show image description (overlap) 1147 Mostrar descripción de la imagen (superpuesta) 1148 Show image differences on the image 1148 Mostrar diferencias de imagen en la imagen 1149 Show image file name (overlap) 1149 Mostrar nombre del archivo de imagen (superpuesto) 1150 Show image title (overlap) 1150 Mostrar título de la imagen (superpuesto) 1151 Show input files used in combine function 1151 Mostrar archivos de entrada usados en la función combinar 1152 Show key metadata for current image or clicked thumbnail 1152 Mostrar la metadata clave de la imagen actual o el thumbnail pulsado 1153 Show map position of the current image file 1153 Mostrar la posición en el mapa del archivo de imagen actual 1154 Show memory and CPU resources used 1154 Mostrar los recursos de memoria y CPU usados 1155 Show on Map 1155 Mostrar en mapa 1156 Show or make Keyboard Shortcuts 1156 Mostrar o crear atajos de teclado 1157 Show the current (last used) album 1157 Mostrar el álbum actual (usado por última vez) 1158 Show the current log file 1158 Mostrar el archivo de registro actual 1159 Size 1159 Tamaño 1160 Sketch1 1160 Boceto1 1161 Sketch2 1161 Boceto2 1162 Slide Show 1162 Presentación de diapositivas 1163 Smart Erase 1163 Borrado inteligente 1164 Soft Focus 1164 Enfoque suave 1165 Sphere 1165 Esfera 1166 Spherical Projection 1166 Proyección esférica 1167 Split-Screen 1167 Pantalla dividida 1168 Stack/Layers 1168 Pila/capas 1169 Stack/Noise 1169 Pila/ruido 1170 Stack/Paint 1170 Pila/pintura 1171 Stacking Order 1171 Orden de apilado 1172 Start 1172 Iniciar 1173 Start a slide show 1173 Iniciar una presentación de diapositivas 1174 Start of gallery 1174 Inicio de la galería 1175 Startup View 1175 Vista de inicio 1176 Stop 1176 Detener 1177 Stretch 1177 Estirar 1178 Stretch: 1178 Estirar: 1179 Suppress JPEG compression artifacts 1179 Suprimir artefactos de compresión JPEG 1180 Suppress Ringing 1180 Suprimir zumbido (ringing) 1181 Suppress fine details while retaining sharpness 1181 Suprimir detalles finos manteniendo la nitidez 1182 Suppress noise from low-light photos 1182 Suprimir ruido de fotos con poca luz 1183 Survey all files 1183 Inspeccionar todos los archivos 1184 TEXTURE 1184 TEXTURA 1185 THUMB VIEW 1185 VISTA DE THUMBNAILS 1186 TILES1 1186 MOSAICOS1 1187 TILES2 1187 MOSAICOS2 1188 TIMELINE 1188 LÍNEA DE TIEMPO 1189 TINY PLANET 1189 PLANETA DIMINUTO 1190 TOOLS MENU 1190 MENÚ DE HERRAMIENTAS 1191 TRANSLATIONS 1191 TRADUCCIONES 1192 TWIST 1192 TORSIÓN 1193 Temperature 1193 Temperatura 1194 Text 1194 Texto 1195 Text File: 1195 Archivo de texto: 1196 Texture 1196 Textura 1197 Threshold 1197 Umbral 1198 Threshold: Low 1198 Umbral: bajo 1199 Thumbnail View 1199 Vista de thumbnails 1200 Thumbnail size 1200 Tamaño de thumbnail 1201 Thumbnails folder 1201 Carpeta de thumbnails 1202 Thumbnails folder: %s \nPlease remove. 1202 Carpeta de thumbnails: %s \nPor favor, elimínala. 1203 Thumbnails folder: \n %s \nmust be named .../thumbnails 1203 La carpeta de thumbnails: \n %s \ndebe llamarse .../thumbnails 1204 Thumbnails: 1204 Thumbnails: 1205 Tile 1205 Mosaico 1206 Tile blending 1206 Mezcla de mosaicos 1207 Tile image with a repeating pattern 1207 Cubrir la imagen con un patrón repetido 1208 Tiles 1208 Mosaicos 1209 Tiles1 1209 Mosaicos1 1210 Tiles2 1210 Mosaicos2 1211 Timeline 1211 Línea de tiempo 1212 Tiny Planet 1212 Planeta diminuto 1213 Title: %s\n 1213 Título: %s\n 1214 To Location 1214 A ubicación 1215 Toggle Captions 1215 Alternar subtítulos 1216 Toggle Grid 1216 Alternar cuadrícula 1217 Toggle grid lines on and off 1217 Alternar las líneas de cuadrícula (activar/desactivar) 1218 Toggle image metadata display ON/OFF 1218 Alternar visualización de metadata de la imagen ACTIVADO/DESACTIVADO 1219 Too little overlap, cannot align 1219 Muy poca superposición, no se puede alinear 1220 Too many edits, please save image 1220 Demasiadas ediciones, por favor guarda la imagen 1221 Tools 1221 Herramientas 1222 Tools: image index, settings, shortcuts, grid, find duplicates 1222 Herramientas: índice de imágenes, configuración, atajos, cuadrícula, buscar duplicados 1223 Top 1223 Superior 1224 Total Colors 1224 Colores totales 1225 Trace 1225 Trazar 1226 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1226 Traza las curvas superior e inferior con \nclics del ratón, luego [aplanar]. 1227 Transient Objects 1227 Objetos transitorios 1228 Transition Preferences 1228 Preferencias de transición 1229 Transition to next image 1229 Transición a la siguiente imagen 1230 Transitions File 1230 Archivo de transiciones 1231 Transp. 1231 Transp. 1232 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1232 El mapa de transparencia se perderá \n(guarda como TIFF|PNG|JXL para conservarlo) \n¿Guardar de todos modos? 1233 Trash 1233 Papelera 1234 Trash read-only file? 1234 ¿Enviar a la papelera el archivo de solo lectura? 1235 Turn an image inside-out 1235 Convertir una imagen del revés 1236 Twist 1236 Torsión 1237 Twist image centered at mouse position 1237 Torsionar la imagen centrada en la posición del ratón 1238 UNBEND 1238 ENDEREZAR CURVATURA 1239 UNDO/REDO BUTTON 1239 BOTÓN DESHACER/REHACER 1240 UNWARP CLOSEUP 1240 DESDEFORMAR PRIMER PLANO 1241 UPDATE ALBUMS 1241 ACTUALIZAR ÁLBUMES 1242 UPRIGHT 1242 ENDEREZAR 1243 USER GUIDE 1243 GUÍA DEL USUARIO 1244 Unable to copy metadata 1244 No se puede copiar la metadata 1245 Unbend 1245 Enderezar curvatura 1246 Undo 1246 Deshacer 1247 Undo All 1247 Deshacer todo 1248 Undo Last 1248 Deshacer último 1249 Undo/Redo 1249 Deshacer/rehacer 1250 Uninstall 1250 Desinstalar 1251 Unwarp Closeup 1251 Desdeformar primer plano 1252 Update Albums 1252 Actualizar álbumes 1253 Update albums for new file versions 1253 Actualizar álbumes para las nuevas versiones de archivo 1254 Upright 1254 Enderezar 1255 Upright Image 1255 Enderezar imagen 1256 Upright or mirror-flip an image 1256 Enderezar o voltear una imagen en espejo 1257 Upright rotated image files, selected set or ALL 1257 Enderezar archivos de imagen rotados, el conjunto seleccionado o TODOS 1258 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1258 Usa Seleccionar área para seleccionar una cara. \nHaz clic en el centro de la distorsión. \nMueve el control deslizante. \n 1259 Use [Select] to add files to an empty album 1259 Usa [Seleccionar] para añadir archivos a un álbum vacío 1260 Use metadata photo date or file modification date? 1260 ¿Usar la fecha de foto de la metadata o la fecha de modificación del archivo? 1261 Use metadata tag 1261 Usar tag de metadata 1262 Use settings file 1262 Usar archivo de configuración 1263 User Guide 1263 Guía del usuario 1264 User preferences and settings 1264 Preferencias y configuración del usuario 1265 VIDEO press P to play 1265 VÍDEO pulsa P para reproducir 1266 VIEW 360° PANO 1266 VER PANORÁMICA 360° 1267 VIEW ALL META 1267 VER TODA LA META 1268 VIEW MAIN META 1268 VER META PRINCIPAL 1269 VIGNETTE 1269 VIÑETA 1270 Var. Transparency 1270 Transparencia var. 1271 Vert 1271 Vert. 1272 Video Files 1272 Archivos de vídeo 1273 Video Tutorial 1273 Tutorial en vídeo 1274 Video command 1274 Comando de vídeo 1275 View 360 degree panorama image 1275 Ver imagen panorámica de 360 grados 1276 View 360° Pano 1276 Ver panorámica 360° 1277 View All Meta 1277 Ver toda la meta 1278 View All Metadata 1278 Ver toda la metadata 1279 View Main Meta 1279 Ver meta principal 1280 View Main Metadata 1280 Ver metadata principal 1281 View before/after images using split-screen 1281 Ver imágenes antes/después usando pantalla dividida 1282 View/edit metadata, image report and search functions 1282 Ver/editar metadata, informe de imagen y funciones de búsqueda 1283 Vignette 1283 Viñeta 1284 W/H Ratio: 1284 Proporción A/A: 1285 WARP AFFINE 1285 DEFORMACIÓN AFÍN 1286 WARP AREA 1286 DEFORMAR ÁREA 1287 WARP CURVED 1287 DEFORMACIÓN CURVA 1288 WARP IMAGE 1288 DEFORMAR IMAGEN 1289 WARP MENU 1289 MENÚ DE DEFORMACIÓN 1290 WARP RADIAL 1290 DEFORMACIÓN RADIAL 1291 WINDOW VIEWS AND MENUS 1291 VISTAS DE VENTANA Y MENÚS 1292 WORLD MAP 1292 MAPA MUNDIAL 1293 Wait after zoom 1293 Esperar tras el zoom 1294 Wait before filename/title/description 1294 Esperar antes del nombre de archivo/título/descripción 1295 Wait before zoom 1295 Esperar antes del zoom 1296 Warp 1296 Deformar 1297 Warp Affine 1297 Deformación afín 1298 Warp Area 1298 Deformar área 1299 Warp Curved 1299 Deformación curva 1300 Warp Image 1300 Deformar imagen 1301 Warp Linear1 1301 Deformación lineal1 1302 Warp Linear2 1302 Deformación lineal2 1303 Warp Radial 1303 Deformación radial 1304 Warp an image with a wave pattern 1304 Deformar una imagen con un patrón de olas 1305 Warp image (affine) using the mouse 1305 Deformar imagen (afín) usando el ratón 1306 Warp image (curved) using the mouse 1306 Deformar imagen (curva) usando el ratón 1307 Warp image (linear 1) using the mouse 1307 Deformar imagen (lineal 1) usando el ratón 1308 Warp image (linear 2) using the mouse 1308 Deformar imagen (lineal 2) usando el ratón 1309 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1309 Deformar: enderezar curvatura, corregir perspectiva, deformar, desdeformar primer plano, aplanar, transformaciones de imagen 1310 White 1310 Blanco 1311 Widen: 1311 Ampliar: 1312 Width 1312 Ancho 1313 Width % 1313 Ancho % 1314 X-size 1314 Tamaño X 1315 Yes 1315 Sí 1316 ZOOM 1316 ZOOM 1317 Zoom 1317 Zoom 1318 Zoom Center 1318 Centro de zoom 1319 Zoom Speed 1319 Velocidad de zoom 1320 Zoom-in 1320 Acercar 1321 Zoom-out 1321 Alejar 1322 \n %d-bits/color 1322 \n %d bits/color 1323 \n *** CANCELED \n 1323 \n *** CANCELADO \n 1324 \n *** COMPLETED \n 1324 \n *** COMPLETADO \n 1325 \n *** Delete Originals *** 1325 \n *** Eliminar originales *** 1326 \n *** Keep Originals *** 1326 \n *** Conservar originales *** 1327 \n *** Replace Originals *** 1327 \n *** Reemplazar originales *** 1328 \n Convert to %s 1328 \n Convertir a %s 1329 \n Copy Metadata 1329 \n Copiar metadata 1330 \n Downsize within %dx%d 1330 \n Reducir tamaño dentro de %dx%d 1331 \n New Location: %s 1331 \n Nueva ubicación: %s 1332 \n Output to %s 1332 \n Salida a %s 1333 \n PROCEED? 1333 \n ¿CONTINUAR? 1334 \n Rename to %s 1334 \n Renombrar a %s 1335 \n Replace text: %s --> %s 1335 \n Reemplazar texto: %s --> %s 1336 \n Rescale to %sx 1336 \n Reescalar a %sx 1337 \n Update Albums 1337 \n Actualizar álbumes 1338 \n Upsize within %dx%d 1338 \n Aumentar tamaño dentro de %dx%d 1339 \n*** CANCELED \n 1339 \n*** CANCELADO \n 1340 \n*** COMPLETED \n 1340 \n*** COMPLETADO \n 1341 \n\nPROCEED? 1341 \n\n¿CONTINUAR? 1342 add 1342 añadir 1343 add after old 1343 añadir después del anterior 1344 add all gallery files to list 1344 añadir todos los archivos de la galería a la lista 1345 add current file to list 1345 añadir el archivo actual a la lista 1346 add entered text to layout 1346 añadir el texto introducido al diseño 1347 add images to layout 1347 añadir imágenes al diseño 1348 add line/arrow to layout 1348 añadir línea/flecha al diseño 1349 add new keyword 1349 añadir nueva keyword 1350 add or edit images 1350 añadir o editar imágenes 1351 add or edit lines/arrows 1351 añadir o editar líneas/flechas 1352 add or edit text 1352 añadir o editar texto 1353 add to set 1353 añadir al conjunto 1354 adder 1354 adder 1355 adjust brightness of selected image 1355 ajustar el brillo de la imagen seleccionada 1356 after removal of missing files: %d \n 1356 tras eliminar los archivos que faltan: %d \n 1357 album %s: deleted 1357 álbum %s: eliminado 1358 album already exists: %s 1358 el álbum ya existe: %s 1359 album mass update 1359 actualización masiva de álbum 1360 albums folder missing 1360 falta la carpeta de álbumes 1361 align and trim color chart 1361 alinear y recortar carta de colores 1362 all files 1362 todos los archivos 1363 all image files, including unmounted folders: %d \n 1363 todos los archivos de imagen, incluidas carpetas no montadas: %d \n 1364 all images 1364 todas las imágenes 1365 all versions 1365 todas las versiones 1366 amplify contrast 1366 amplificar contraste 1367 amplitude 1367 amplitud 1368 angle 1368 ángulo 1369 apply 1369 aplicar 1370 area edge creep 1370 desplazamiento del borde de área 1371 area is not finished 1371 el área no está terminada 1372 area outline color: 1372 color de contorno de área: 1373 array width is too large: %d x %d 1373 el ancho de la matriz es demasiado grande: %d x %d 1374 ascending 1374 ascendente 1375 auto color 1375 color automático 1376 background colors for file and gallery view windows 1376 colores de fondo para las ventanas de vista de archivo y galería 1377 backing 1377 respaldo 1378 bad category name 1378 nombre de categoría incorrecto 1379 bad keyword name 1379 nombre de keyword incorrecto 1380 bad pattern file: %s 1380 archivo de patrón incorrecto: %s 1381 base 1381 base 1382 base and adder need $s plugin 1382 base y adder necesitan el plugin $s 1383 base size 1383 tamaño base 1384 begin making a script file 1384 empezar a crear un archivo de script 1385 black/white 1385 blanco y negro 1386 black/white negative 1386 negativo en blanco y negro 1387 black/white positive 1387 positivo en blanco y negro 1388 blend 1388 mezclar 1389 blend edges: blend width: 1389 mezclar bordes: ancho de mezcla: 1390 blend image overlaps over pixel width 1390 mezclar solapamientos de imagen sobre ancho de píxeles 1391 blend rate: center: 1391 tasa de mezcla: centro: 1392 blocking function: %s 1392 función de bloqueo: %s 1393 blocksize 1393 tamaño de bloque 1394 blur edges: blur width: 1394 desenfocar bordes: ancho de desenfoque: 1395 blur radius 1395 radio de desenfoque 1396 borders 1396 bordes 1397 both 'All Files' and specific files were selected 1397 se seleccionaron tanto 'Todos los archivos' como archivos específicos 1398 bright halo 1398 halo brillante 1399 brightness rescale 1399 reescalar brillo 1400 browse 1400 explorar 1401 brush size 1401 tamaño del pincel 1402 build index, old files only 1402 crear índice, solo archivos antiguos 1403 cancel project 1403 cancelar proyecto 1404 cancel project? 1404 ¿cancelar proyecto? 1405 cannot allocate %d MB memory 1405 no se pueden asignar %d MB de memoria 1406 cannot be determined 1406 no se puede determinar 1407 cannot copy a file to itself 1407 no se puede copiar un archivo a sí mismo 1408 cannot copy current file 1408 no se puede copiar el archivo actual 1409 cannot create output file 1409 no se puede crear el archivo de salida 1410 cannot create pixbuf 1410 no se puede crear pixbuf 1411 cannot find area outline 1411 no se puede encontrar el contorno del área 1412 cannot find output file 1412 no se puede encontrar el archivo de salida 1413 cannot load input file 1413 no se puede cargar el archivo de entrada 1414 cannot open file %s 1414 no se puede abrir el archivo %s 1415 cannot parse current file 1415 no se puede analizar el archivo actual 1416 cannot parse file 1416 no se puede analizar el archivo 1417 cannot read pluging output file 1417 no se puede leer el archivo de salida del plugin 1418 cannot replace %s file 1418 no se puede reemplazar el archivo %s 1419 cannot save as RAW type 1419 no se puede guardar como tipo RAW 1420 cannot save layout file: %s 1420 no se puede guardar el archivo de diseño: %s 1421 cannot write image folders file: %s 1421 no se puede escribir el archivo de carpetas de imagen: %s 1422 category %s has too many keywords 1422 la categoría %s tiene demasiadas keywords 1423 category %s is too big 1423 la categoría %s es demasiado grande 1424 center 1424 centro 1425 change project scale 1425 cambiar escala del proyecto 1426 choose 1-8 clicks or [+] keys for 2x image zoom 1426 elige de 1 a 8 clics o teclas [+] para zoom de imagen 2x 1427 choose a better spot 1427 elige un punto mejor 1428 choose an image file 1428 elige un archivo de imagen 1429 choose file 1429 elige archivo 1430 choose files 1430 elige archivos 1431 choose folder 1431 elige carpeta 1432 choose folders 1432 elige carpetas 1433 choose location 1433 elige ubicación 1434 circle 1434 círculo 1435 clear area selections 1435 borrar selecciones de área 1436 clear entered text 1436 borrar texto introducido 1437 clear inputs 1437 borrar entradas 1438 clear text 1438 borrar texto 1439 click a defined keyword (below) to add a search keyword 1439 haz clic en una keyword definida (abajo) para añadir una keyword de búsqueda 1440 click bright point 1440 haz clic en el punto brillante 1441 click dark point 1441 haz clic en el punto oscuro 1442 click on desired color 1442 haz clic en el color deseado 1443 click on image to get source color 1443 haz clic en la imagen para obtener el color de origen 1444 click on image to set matching color 1444 haz clic en la imagen para establecer el color coincidente 1445 click on thumbnail to set zoom center 1445 haz clic en el thumbnail para establecer el centro de zoom 1446 click position to add line 1446 haz clic en la posición para añadir una línea 1447 click position to add text 1447 haz clic en la posición para añadir texto 1448 click to select 1448 haz clic para seleccionar 1449 click to unselect 1449 haz clic para deseleccionar 1450 clicks per 2x image increase 1450 clics por cada aumento de imagen 2x 1451 color 1451 color 1452 color depth 1452 profundidad de color 1453 color depth: 1453 profundidad de color: 1454 color match level % 1454 nivel de igualación de color % 1455 color negative 1455 negativo de color 1456 column difference: %d pixels 1456 diferencia de columnas: %d píxeles 1457 column difference: %d pixels \nMake columns even? 1457 diferencia de columnas: %d píxeles \n¿Igualar las columnas? 1458 combined image files 1458 archivos de imagen combinados 1459 command: 1459 comando: 1460 commit all changes, close dialog 1460 confirmar todos los cambios, cerrar el diálogo 1461 complete file selection first 1461 completa primero la selección de archivos 1462 completed 1462 completado 1463 condense into color blobs 1463 condensar en manchas de color 1464 condition 1464 condición 1465 confirm Fotocx exit 1465 confirmar salida de Fotocx 1466 constant blur 1466 desenfoque constante 1467 continue? 1467 ¿continuar? 1468 converting colors... 1468 convirtiendo colores... 1469 converting files 1469 convirtiendo archivos 1470 copy (duplicate file) 1470 copiar (duplicar archivo) 1471 copy and paste commands 1471 comandos de copiar y pegar 1472 copy files to %s 1472 copiar archivos a %s 1473 copy metadata from Nth file: 1473 copiar metadata del archivo N.º: 1474 copy to Desktop failed: %s 1474 error al copiar al escritorio: %s 1475 count: 0 1475 recuento: 0 1476 create folder 1476 crear carpeta 1477 create folder %s 1477 crear carpeta %s 1478 current gallery 1478 galería actual 1479 current image files found: %d \n 1479 archivos de imagen actuales encontrados: %d \n 1480 current set only 1480 solo el conjunto actual 1481 current set: 1481 conjunto actual: 1482 curve file is invalid 1482 el archivo de curva no es válido 1483 custom command to play video files 1483 comando personalizado para reproducir archivos de vídeo 1484 dark 1484 oscuro 1485 dark halo 1485 halo oscuro 1486 dark pixels 1486 píxeles oscuros 1487 data is incomplete, proceed? 1487 los datos están incompletos, ¿continuar? 1488 date format is yyyy:mm:dd [hh:mm:ss] 1488 el formato de fecha es aaaa:mm:dd [hh:mm:ss] 1489 date range 1489 rango de fechas 1490 days 1490 días 1491 delete 1491 eliminar 1492 delete %s \n%s 1492 eliminar %s \n%s 1493 delete Mashup project files? 1493 ¿eliminar los archivos del proyecto Mashup? 1494 delete failed: \n%s 1494 fallo al eliminar: \n%s 1495 delete originals specified but no new name given 1495 se especificó eliminar originales pero no se dio un nuevo nombre 1496 delete selected text from layout 1496 eliminar el texto seleccionado del diseño 1497 deleting orphan thumbnails ... \n 1497 eliminando thumbnails huérfanos ... \n 1498 depth 1498 profundidad 1499 descending 1499 descendente 1500 direction of light and shadows 1500 dirección de la luz y las sombras 1501 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1501 desactivar la selección de thumbnails para habilitar menús emergentes, etc. \nusa [Activar] para reanudar la selección de thumbnails 1502 discard changes? 1502 ¿descartar cambios? 1503 do not warp images during auto-alignment 1503 no deformar las imágenes durante la autoalineación 1504 do nothing 1504 no hacer nada 1505 dot size 1505 tamaño del punto 1506 downsize 1506 reducir tamaño 1507 drag image 1507 arrastrar imagen 1508 drag mouse along an edge to follow the edge 1508 arrastra el ratón a lo largo de un borde para seguir el borde 1509 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1509 arrastra el ratón abajo/derecha para dibujar un óvalo \nmayús + arrastra el centro para mover el óvalo \nmayús + arrastra el borde inferior derecho para cambiar 1510 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1510 arrastra el ratón para dibujar un cuadro \nmayús + arrastra el centro para mover el cuadro \nmayús + arrastra el borde para mover el borde 1511 drag mouse to outline an area 1511 arrastra el ratón para delinear un área 1512 drag mouse to select circular or elliptical area 1512 arrastra el ratón para seleccionar un área circular o elíptica 1513 drag mouse to select rectangular area 1513 arrastra el ratón para seleccionar un área rectangular 1514 drag mouse to show selected image 1514 arrastra el ratón para mostrar la imagen seleccionada 1515 duplicate keyword 1515 keyword duplicada 1516 edge distance calculation 1516 cálculo de distancia de borde 1517 edge: 1517 borde: 1518 edit 1518 editar 1519 edit commands 1519 editar comandos 1520 edit custom shell commands, match colors to embedded jpeg image 1520 editar comandos de shell personalizados, igualar colores con la imagen jpeg incrustada 1521 edit this menu 1521 editar este menú 1522 ellipse 1522 elipse 1523 embedded numbers will sort by value 1523 los números incrustados se ordenarán por valor 1524 emboss 1524 relieve 1525 enter 2-character language code: en, de, fr ... 1525 introduce el código de idioma de 2 caracteres: en, de, fr ... 1526 enter a project name 1526 introduce un nombre de proyecto 1527 enter an album name 1527 introduce un nombre de álbum 1528 enter cities/locations, countries 1528 introduce ciudades/ubicaciones, países 1529 enter project name 1529 introduce el nombre del proyecto 1530 enter tag name 1530 introduce el nombre del tag 1531 enter tag names 1531 introduce los nombres de los tags 1532 erase 1532 borrar 1533 error compensation 1533 compensación de error 1534 exceed %d edits 1534 se superan %d ediciones 1535 exceed %d images 1535 se superan %d imágenes 1536 exceed %d max files, cannot continue 1536 se supera el máximo de %d archivos, no se puede continuar 1537 exceed %d rows 1537 se superan %d filas 1538 exceed %d selected files 1538 se superan %d archivos seleccionados 1539 exceed %d shortcuts 1539 se superan %d atajos 1540 exceeded %d line entries 1540 se superaron %d entradas de línea 1541 exceeded %d text entries 1541 se superaron %d entradas de texto 1542 exceeded max. images: %d 1542 se superó el máximo de imágenes: %d 1543 exceeded max. tiles: %d 1543 se superó el máximo de mosaicos: %d 1544 exit split-screen 1544 salir de pantalla dividida 1545 expand to these limits if smaller 1545 expandir a estos límites si es más pequeño 1546 exporting files 1546 exportando archivos 1547 extra indexed metadata tags > %d 1547 tags de metadata indexados extra > %d 1548 extra metadata tags to include in index 1548 tags de metadata extra a incluir en el índice 1549 extra metadata tags: \n 1549 tags de metadata extra: \n 1550 fetch 1550 obtener 1551 file 1551 archivo 1552 file .ext names to recognize RAW files 1552 extensiones de archivo a reconocer como archivos RAW 1553 file .ext names to recognize video files 1553 extensiones de archivo a reconocer como archivos de vídeo 1554 file close error 1554 error al cerrar el archivo 1555 file color 1555 color de archivo 1556 file error: %s 1556 error de archivo: %s 1557 file format error 1557 error de formato de archivo 1558 file format error: %s 1558 error de formato de archivo: %s 1559 file included: %s \n 1559 archivo incluido: %s \n 1560 file metadata update failed 1560 fallo al actualizar la metadata del archivo 1561 file name 1561 nombre de archivo 1562 file names 1562 nombres de archivo 1563 file not found 1563 archivo no encontrado 1564 file not found \n 1564 archivo no encontrado \n 1565 file not found: %s 1565 archivo no encontrado: %s 1566 file not found: %s %s 1566 archivo no encontrado: %s %s 1567 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1567 los tipos de archivo: .jp2 .heic .avif .webp \nse convertirán en: .jpg - ¿CONTINUAR? 1568 file: %s \nexceed 99 versions 1568 archivo: %s \nsupera las 99 versiones 1569 filename text 1569 texto del nombre de archivo 1570 files in %s can be deleted 1570 los archivos en %s se pueden eliminar 1571 fill from current gallery 1571 rellenar desde la galería actual 1572 fill from selected files 1572 rellenar desde los archivos seleccionados 1573 fill selected areas 1573 rellenar áreas seleccionadas 1574 fill transparent areas 1574 rellenar áreas transparentes 1575 find all image files ...\n 1575 buscando todos los archivos de imagen ...\n 1576 find and report all unreadable image files 1576 buscar e informar de todos los archivos de imagen ilegibles 1577 find outline gap 1577 buscar hueco en el contorno 1578 find via table lookup 1578 buscar mediante consulta de tabla 1579 find_imagefiles() failure \n 1579 fallo de find_imagefiles() \n 1580 find_imagefiles() failure: %s \n 1580 fallo de find_imagefiles(): %s \n 1581 finish current edit first 1581 termina primero la edición actual 1582 finish making a script file 1582 terminar de crear un archivo de script 1583 finish or cancel pending edit 1583 terminar o cancelar la edición pendiente 1584 fix box in layout and start new box 1584 fijar el cuadro en el diseño e iniciar un cuadro nuevo 1585 fix line in layout and start new line 1585 fijar la línea en el diseño e iniciar una línea nueva 1586 fix motion blur 1586 corregir desenfoque de movimiento 1587 fix oval in layout and start new oval 1587 fijar el óvalo en el diseño e iniciar un óvalo nuevo 1588 follow edge 1588 seguir el borde 1589 font name and size for menus and dilogs 1589 nombre de fuente y tamaño para menús y diálogos 1590 force a full re-index of all image files 1590 forzar un reindexado completo de todos los archivos de imagen 1591 format: yyyy:mm:dd [hh:mm:ss] 1591 formato: aaaa:mm:dd [hh:mm:ss] 1592 fotocx will exit 1592 Fotocx se cerrará 1593 found %d pixels 1593 se encontraron %d píxeles 1594 free disk space: %d GB \n 1594 espacio libre en disco: %d GB \n 1595 freehand draw 1595 dibujo a mano alzada 1596 ftruncate() failure: %s 1596 fallo de ftruncate(): %s 1597 full image index: reports will be complete \n 1597 índice de imágenes completo: los informes estarán completos \n 1598 function canceled 1598 función cancelada 1599 gallery 1599 galería 1600 gallery is empty 1600 la galería está vacía 1601 gallery truncated to %d images 1601 galería truncada a %d imágenes 1602 get images having text in filename (comma separated) 1602 obtener imágenes con texto en el nombre de archivo (separadas por comas) 1603 get images with matching keywords (comma separated) 1603 obtener imágenes con keywords coincidentes (separadas por comas) 1604 get images within rating range 1604 obtener imágenes dentro del rango de valoración 1605 gradual paint 1605 pintura gradual 1606 grid counts not 0-100: %s 1606 recuentos de cuadrícula fuera de 0-100: %s 1607 grid picklist file error: %s 1607 error de archivo de lista de cuadrícula: %s 1608 grid size 1608 tamaño de cuadrícula 1609 group 1609 grupo 1610 height 1610 altura 1611 hide area outlines 1611 ocultar contornos de área 1612 hide transient objects 1612 ocultar objetos transitorios 1613 high 1613 alto 1614 home folder was not changed 1614 la carpeta de inicio no se cambió 1615 horizontal 1615 horizontal 1616 hours 1616 horas 1617 icons only, text only, or both 1617 solo iconos, solo texto, o ambos 1618 if image < window, center or shift left or right 1618 si la imagen < ventana, centrar o desplazar a la izquierda o derecha 1619 ignore differences above limit 1619 ignorar diferencias por encima del límite 1620 image blend 1620 mezcla de imagen 1621 image files 1621 archivos de imagen 1622 image for source color 1622 imagen para color de origen 1623 image index records found: %d \n 1623 registros de índice de imágenes encontrados: %d \n 1624 image index required 1624 se requiere índice de imágenes 1625 image index write error: %s 1625 error de escritura del índice de imágenes: %s 1626 image is too large to edit: %d x %d 1626 la imagen es demasiado grande para editar: %d x %d 1627 image is too large: %dx%d, %lld megapix 1627 la imagen es demasiado grande: %dx%d, %lld megapíxeles 1628 image is too small to edit: %d x %d 1628 la imagen es demasiado pequeña para editar: %d x %d 1629 image scale 1629 escala de imagen 1630 image to set matching color 1630 imagen para establecer el color coincidente 1631 image width must be greater than height 1631 el ancho de la imagen debe ser mayor que la altura 1632 images to report 1632 imágenes a informar 1633 include all files 1633 incluir todos los archivos 1634 include edited versions 1634 incluir versiones editadas 1635 include last versions only 1635 incluir solo las últimas versiones 1636 include original files 1636 incluir archivos originales 1637 include transparent areas 1637 incluir áreas transparentes 1638 include: 1638 incluir: 1639 increase blur with distance 1639 aumentar el desenfoque con la distancia 1640 index completed, %.1f seconds \n 1640 índice completado, %.1f segundos \n 1641 index config file error: %s 1641 error de archivo de configuración de índice: %s 1642 index updates needed: %d thumbnails: %d \n 1642 actualizaciones de índice necesarias: %d thumbnails: %d \n 1643 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1643 actualizaciones de índice: %d actualizaciones de título/desc: %d \nactualizaciones de thumbnail: %d, eliminaciones: %d \n 1644 input 1644 entrada 1645 input file: %s \n 1645 archivo de entrada: %s \n 1646 insufficient memory, cannot proceed 1646 memoria insuficiente, no se puede continuar 1647 insufficient overlap for color matching 1647 superposición insuficiente para igualar colores 1648 invalid GPS data 1648 datos GPS no válidos 1649 invalid GPS data: %s 1649 datos GPS no válidos: %s 1650 invalid album 1650 álbum no válido 1651 invalid date range: %s %s 1651 rango de fechas no válido: %s %s 1652 invalid date/time format 1652 formato de fecha/hora no válido 1653 invalid file 1653 archivo no válido 1654 invalid plugin: %s 1654 plugin no válido: %s 1655 invalid rating range 1655 rango de valoración no válido 1656 invalid source file: %s 1656 archivo de origen no válido: %s 1657 invert area 1657 invertir área 1658 jpeg quality level - 70+ for good image quality 1658 nivel de calidad jpeg - 70+ para buena calidad de imagen 1659 keyboard 1659 teclado 1660 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1660 controles de teclado: \nEsc: salir de la presentación en curso \nteclas de flecha: imagen anterior/siguiente \nB: oscurecer/iluminar ventana \nN: transición a la siguiente imagen \nP: pausar/reanudar \nX: ampliar en la posición del ratón 1661 keyword names 1661 nombres de keywords 1662 keywords to add 1662 keywords a añadir 1663 keywords to remove 1663 keywords a eliminar 1664 keywords_defined file error: %s 1664 error de archivo keywords_defined: %s 1665 last search 1665 última búsqueda 1666 last version 1666 última versión 1667 last versions 1667 últimas versiones 1668 layout exceeds 4 gigabytes 1668 el diseño supera los 4 gigabytes 1669 layout file missing: %s 1669 falta el archivo de diseño: %s 1670 left 1670 izquierda 1671 left click on image for selected color 1671 clic izquierdo en la imagen para el color seleccionado 1672 left click: set image source location \nright click: set corresponding destination 1672 clic izquierdo: fijar ubicación de origen de la imagen \nclic derecho: fijar destino correspondiente 1673 left drag: add transparency \nright drag: add opacity 1673 arrastre izquierdo: añadir transparencia \narrastre derecho: añadir opacidad 1674 left drag: copy image to mouse position \nright drag: restore original image 1674 arrastre izquierdo: copiar imagen a la posición del ratón \narrastre derecho: restaurar imagen original 1675 left drag: reduce halo, right drag: undo 1675 arrastre izquierdo: reducir halo, arrastre derecho: deshacer 1676 lens mm 1676 mm de lente 1677 level based on EXIF roll angle 1677 nivelar según el ángulo de giro EXIF 1678 light 1678 claro 1679 light pixels 1679 píxeles claros 1680 line 1680 línea 1681 line color 1681 color de línea 1682 line width 1682 ancho de línea 1683 load 1683 cargar 1684 load text data from a file 1684 cargar datos de texto desde un archivo 1685 load widgets failed: %s 1685 fallo al cargar widgets: %s 1686 loading palette ... 1686 cargando paleta ... 1687 location is not a folder 1687 la ubicación no es una carpeta 1688 locations 1688 ubicaciones 1689 lock width/height ratio 1689 bloquear proporción de ancho/alto 1690 log file is in a terminal 1690 el archivo de registro está en una terminal 1691 low 1691 bajo 1692 low contrast 1692 bajo contraste 1693 lower 1693 inferior 1694 make an initially empty album 1694 crear un álbum inicialmente vacío 1695 make new version 1695 crear nueva versión 1696 manual align 1696 alineación manual 1697 map marker (red dot) diameter, pixels 1697 diámetro del marcador de mapa (punto rojo), píxeles 1698 map selected areas and verify 1698 mapear áreas seleccionadas y verificar 1699 mashup project 1699 proyecto mashup 1700 match embedded image color 1700 igualar color de imagen incrustada 1701 match image color to base image (repeat) 1701 igualar el color de la imagen con la imagen base (repetir) 1702 match values 1702 igualar valores 1703 matches 1703 coincidencias 1704 max keywords exceeded 1704 se superó el máximo de keywords 1705 max. Width 1705 ancho máx. 1706 max. album count exceeded: %d 1706 se superó el recuento máx. de álbumes: %d 1707 max. album files reached, results truncated 1707 se alcanzó el máx. de archivos de álbum, resultados truncados 1708 max. album size exceeded: %d 1708 se superó el tamaño máx. de álbum: %d 1709 max. blur radius 1709 radio máx. de desenfoque 1710 max. brightness 1710 brillo máx. 1711 max. image limit reached: %d 1711 se alcanzó el límite máx. de imágenes: %d 1712 max. width or height is not reasonable 1712 el ancho o alto máx. no es razonable 1713 maximum clip allowed to fit window 1713 recorte máximo permitido para ajustar a la ventana 1714 mean RGB: %5.0f %5.0f %5.0f 1714 RGB medio: %5.0f %5.0f %5.0f 1715 mean noise: %5.2f %5.2f %5.2f 1715 ruido medio: %5.2f %5.2f %5.2f 1716 median 1716 mediana 1717 median diff 1717 diferencia de mediana 1718 menu text and background colors 1718 colores de texto y fondo del menú 1719 metadata 1719 metadata 1720 metadata copy failed 1720 fallo al copiar la metadata 1721 metadata from Search Function, metadata report 1721 metadata de la función de búsqueda, informe de metadata 1722 metadata picklist file not found %s 1722 archivo de lista de metadata no encontrado %s 1723 metadata tags to report 1723 tags de metadata a informar 1724 metadata update error 1724 error de actualización de metadata 1725 metadata update error \n 1725 error de actualización de metadata \n 1726 metadata update error: %s 1726 error de actualización de metadata: %s 1727 metadata update failed \n 1727 fallo en la actualización de metadata \n 1728 min. blur radius 1728 radio mín. de desenfoque 1729 min. contrast 1729 contraste mín. 1730 min. edit curve node separation, % of scale length 1730 separación mín. de nodo de curva de edición, % de la longitud de escala 1731 min. separation, %c of scale 1731 separación mín., %c de la escala 1732 minutes 1732 minutos 1733 mmap() failure: %s 1733 fallo de mmap(): %s 1734 months 1734 meses 1735 more than %d categories 1735 más de %d categorías 1736 more than 20 matches 1736 más de 20 coincidencias 1737 mouse radius 1737 radio del ratón 1738 mouse radius for color sample 1738 radio del ratón para muestra de color 1739 mouse radius: 1739 radio del ratón: 1740 move (delete original) 1740 mover (eliminar original) 1741 move area boundary in/out in 1-pixel steps 1741 mover el límite del área hacia dentro/fuera en pasos de 1 píxel 1742 move to next input file 1742 pasar al siguiente archivo de entrada 1743 move to trash failed \n 1743 fallo al mover a la papelera \n 1744 move to trash failed: %s 1744 fallo al mover a la papelera: %s 1745 multiply 1745 multiplicar 1746 must have 4 corners 1746 debe tener 4 esquinas 1747 need numeric match value: %s 1747 se necesita un valor numérico de igualación: %s 1748 negative 1748 negativo 1749 new album created 1749 álbum nuevo creado 1750 new album name 1750 nombre del nuevo álbum 1751 new file 1751 archivo nuevo 1752 new file ... 1752 archivo nuevo ... 1753 new file name is invalid 1753 el nuevo nombre de archivo no es válido 1754 new file type 1754 nuevo tipo de archivo 1755 new home folder contains a blank 1755 la nueva carpeta de inicio contiene un espacio en blanco 1756 new location 1756 nueva ubicación 1757 new location is not a folder 1757 la nueva ubicación no es una carpeta 1758 new version 1758 nueva versión 1759 newest files 1759 archivos más recientes 1760 no EXIF orientation data 1760 sin datos de orientación EXIF 1761 no active Select Area 1761 sin área de selección activa 1762 no albums selected 1762 no hay álbumes seleccionados 1763 no auto warp 1763 sin autodeformación 1764 no change 1764 sin cambios 1765 no current album 1765 sin álbum actual 1766 no current edit image 1766 sin imagen de edición actual 1767 no current file 1767 sin archivo actual 1768 no curve (scanned image) 1768 sin curva (imagen escaneada) 1769 no description 1769 sin descripción 1770 no file selected 1770 no hay archivo seleccionado 1771 no files found 1771 no se encontraron archivos 1772 no files selected 1772 no hay archivos seleccionados 1773 no host files selected 1773 no hay archivos anfitriones seleccionados 1774 no image index: reports disabled \n 1774 sin índice de imágenes: informes desactivados \n 1775 no images 1775 sin imágenes 1776 no images found 1776 no se encontraron imágenes 1777 no input files available 1777 no hay archivos de entrada disponibles 1778 no matching files found 1778 no se encontraron archivos coincidentes 1779 no matching locations 1779 no hay ubicaciones coincidentes 1780 no metadata level data 1780 sin datos de nivel de metadata 1781 no metadata tags to report 1781 no hay tags de metadata que informar 1782 no option selected 1782 no hay opción seleccionada 1783 no overlay file selected 1783 no se seleccionó archivo de superposición 1784 no photo date, skipped 1784 sin fecha de foto, omitido 1785 no plugin output file found 1785 no se encontró archivo de salida del plugin 1786 no prior edit 1786 sin edición anterior 1787 no prior edit image 1787 sin imagen de edición anterior 1788 no saved folders 1788 no hay carpetas guardadas 1789 no script file was started 1789 no se inició ningún archivo de script 1790 no script files found 1790 no se encontraron archivos de script 1791 no select area 1791 sin área de selección 1792 no selection 1792 sin selección 1793 no title 1793 sin título 1794 no write permission 1794 sin permiso de escritura 1795 no write permission \n 1795 sin permiso de escritura \n 1796 no write permission: %s 1796 sin permiso de escritura: %s 1797 none 1797 ninguno 1798 not a known image file 1798 no es un archivo de imagen conocido 1799 not an image file 1799 no es un archivo de imagen 1800 not an indexed image file \n 1800 no es un archivo de imagen indexado \n 1801 nothing found 1801 no se encontró nada 1802 nothing left, no change made 1802 no queda nada, no se realizó ningún cambio 1803 old file 1803 archivo antiguo 1804 old image index: reports will omit new files \n 1804 índice de imágenes antiguo: los informes omitirán los archivos nuevos \n 1805 old keyword name >> new keyword name 1805 nombre de keyword antiguo >> nombre de keyword nuevo 1806 omit high pixel 1806 omitir píxel alto 1807 omit low pixel 1807 omitir píxel bajo 1808 only %d tile images found 1808 solo se encontraron %d imágenes de mosaico 1809 opacity center 1809 opacidad del centro 1810 opacity edge 1810 opacidad del borde 1811 open album 1811 abrir álbum 1812 open and process color chart 1812 abrir y procesar la carta de colores 1813 open as new current file 1813 abrir como nuevo archivo actual 1814 optional deselect color 1814 color de deselección opcional 1815 original 1815 original 1816 originals 1816 originales 1817 other 1817 otro 1818 out of space for temp files \nsave your edits and quit Fotocx 1818 sin espacio para archivos temporales \nguarda tus ediciones y cierra Fotocx 1819 outline 1819 contorno 1820 output file exists 1820 el archivo de salida ya existe 1821 output file exists, overwrite? 1821 el archivo de salida ya existe, ¿sobrescribir? 1822 output file size change, cannot use select area 1822 cambio de tamaño del archivo de salida, no se puede usar seleccionar área 1823 output file: 1823 archivo de salida: 1824 output file: %s \n 1824 archivo de salida: %s \n 1825 oval 1825 óvalo 1826 overlay file missing: %s 1826 falta el archivo de superposición: %s 1827 owner 1827 propietario 1828 paint 1828 pintar 1829 paint color 1829 color de pintura 1830 paint edits cannot be used for this method 1830 pintar ediciones no se puede usar con este método 1831 paint over transparent areas 1831 pintar sobre áreas transparentes 1832 paint radius 1832 radio de pintura 1833 palette 1833 paleta 1834 palette exceeds %d color limit 1834 la paleta supera el límite de %d colores 1835 palette file 1835 archivo de paleta 1836 palette has %d colors 1836 la paleta tiene %d colores 1837 palette loaded, %d colors 1837 paleta cargada, %d colores 1838 palette: 1838 paleta: 1839 patch area goal 1839 objetivo del área del parche 1840 percent 1840 porcentaje 1841 perform edits to include in the script file 1841 realizar ediciones para incluir en el archivo de script 1842 permissions: 1842 permisos: 1843 perspective 1843 perspectiva 1844 photo 1844 foto 1845 picklist file not found: %s 1845 archivo de lista no encontrado: %s 1846 pixel = mean of best match neighbors 1846 píxel = media de los vecinos con mejor coincidencia 1847 pixel = median of all neighbors 1847 píxel = mediana de todos los vecinos 1848 please make a choice 1848 por favor, elige una opción 1849 plugin command failed 1849 fallo en el comando del plugin 1850 plugin menu not found %s 1850 menú de plugin no encontrado %s 1851 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1851 plugins: (año mes día nombre-anterior secuencia) $yyyy $mm $dd $oldname $s 1852 popup_choose: empty list 1852 popup_choose: lista vacía 1853 position with mouse click/drag 1853 posición con clic/arrastre del ratón 1854 position: 50 50 1854 posición: 50 50 1855 position: x=%02d y=%02d 1855 posición: x=%02d y=%02d 1856 power 1856 potencia 1857 power center 1857 potencia centro 1858 power edge 1858 potencia borde 1859 power: center 1859 potencia: centro 1860 pref 1860 pref 1861 previous file 1861 archivo anterior 1862 previous name 1862 nombre anterior 1863 print color chart 1863 imprimir carta de colores 1864 print select area(s) only? 1864 ¿imprimir solo el/las área(s) seleccionada(s)? 1865 prior edit step 1865 paso de edición anterior 1866 project complete 1866 proyecto completado 1867 project file is defective 1867 el archivo del proyecto está dañado 1868 project name cannot have quote characters 1868 el nombre del proyecto no puede tener comillas 1869 pure RGB or black/white dots 1869 puntos RGB puros o en blanco y negro 1870 quality 1870 calidad 1871 quality level (70+) 1871 nivel de calidad (70+) 1872 radius 1872 radio 1873 radius: 1873 radio: 1874 random 1874 aleatorio 1875 random position 1875 posición aleatoria 1876 rating range 1876 rango de valoración 1877 reading image index file ...\n 1877 leyendo archivo de índice de imágenes ...\n 1878 recent files 1878 archivos recientes 1879 reduce bright 1879 reducir brillo 1880 reduce dark 1880 reducir oscuridad 1881 reduce to these limits if larger 1881 reducir a estos límites si es mayor 1882 refresh 1882 actualizar 1883 remove %d duplicates? 1883 ¿eliminar %d duplicados? 1884 remove all files in list 1884 eliminar todos los archivos de la lista 1885 remove duplicate 1885 eliminar duplicado 1886 remove from set 1886 eliminar del conjunto 1887 remove panorama image curving 1887 eliminar la curvatura de la panorámica 1888 remove selected file from list 1888 eliminar el archivo seleccionado de la lista 1889 rename keywords 1889 renombrar keywords 1890 repair metadata for %s 1890 reparar metadata de %s 1891 replace 1891 reemplazar 1892 replace album %s ? 1892 ¿reemplazar el álbum %s? 1893 replace file 1893 reemplazar archivo 1894 replace old 1894 reemplazar antiguo 1895 replace old file (OVERWRITE) 1895 reemplazar archivo antiguo (SOBRESCRIBIR) 1896 replace substring within file name 1896 reemplazar subcadena dentro del nombre de archivo 1897 report type: 1897 tipo de informe: 1898 req. color match 1898 igualación de color requerida 1899 reset 1899 restablecer 1900 resolution 1900 resolución 1901 resume from current image 1901 reanudar desde la imagen actual 1902 right 1902 derecha 1903 right click on image for deselected color 1903 clic derecho en la imagen para el color deseleccionado 1904 sample % 1904 muestra % 1905 save 1905 guardar 1906 save Mashup output file 1906 guardar el archivo de salida de Mashup 1907 save Mashup project? 1907 ¿guardar el proyecto Mashup? 1908 save area as a PNG file 1908 guardar el área como un archivo PNG 1909 save as new file name or type 1909 guardar como nuevo nombre o tipo de archivo 1910 save as new file version 1910 guardar como nueva versión de archivo 1911 save edit, start new text 1911 guardar edición, empezar texto nuevo 1912 save metadata to image file 1912 guardar metadata en el archivo de imagen 1913 save text data to a file 1913 guardar datos de texto en un archivo 1914 save to .heic/.avif file not supported 1914 guardar como archivo .heic/.avif no compatible 1915 save to .jp2 file not supported 1915 guardar como archivo .jp2 no compatible 1916 save to .webp file not supported 1916 guardar como archivo .webp no compatible 1917 scan and save color chart 1917 escanear y guardar carta de colores 1918 scanned color chart file 1918 archivo de carta de colores escaneado 1919 scope of neighbor pixels 1919 alcance de píxeles vecinos 1920 script already started 1920 el script ya se ha iniciado 1921 script complete 1921 script completado 1922 script error: %s, %s 1922 error de script: %s, %s 1923 script file closed 1923 archivo de script cerrado 1924 script file error 1924 error de archivo de script 1925 script file format error: %s 1925 error de formato de archivo de script: %s 1926 script file name too big 1926 el nombre del archivo de script es demasiado grande 1927 script file to run 1927 archivo de script a ejecutar 1928 search for names in image location metadata 1928 buscar nombres en la metadata de ubicación de la imagen 1929 search for text within file folders or file name 1929 buscar texto dentro de las carpetas de archivos o el nombre de archivo 1930 search for text within image title or description 1930 buscar texto dentro del título o la descripción de la imagen 1931 search known locations 1931 buscar ubicaciones conocidas 1932 search range 1932 rango de búsqueda 1933 search: 1933 buscar: 1934 seconds 1934 segundos 1935 seconds to show with text 1935 segundos a mostrar con texto 1936 seconds to show without text 1936 segundos a mostrar sin texto 1937 select all 1937 seleccionar todo 1938 select all colors within mouse (flood) 1938 seleccionar todos los colores dentro del ratón (inundación) 1939 select area missing or not finished 1939 falta el área de selección o no está terminada 1940 select area within mouse 1940 seleccionar área dentro del ratón 1941 select area within mouse circle 1941 seleccionar área dentro del círculo del ratón 1942 select base image for color matching 1942 seleccionar imagen base para igualar colores 1943 select by color, required match level 1943 seleccionar por color, nivel de igualación requerido 1944 select by color, search range 1944 seleccionar por color, rango de búsqueda 1945 select font 1945 seleccionar fuente 1946 select image to show with mouse paint 1946 seleccionar imagen a mostrar con pintura del ratón 1947 select images randomly 1947 seleccionar imágenes aleatoriamente 1948 select initial files 1948 seleccionar archivos iniciales 1949 select line color 1949 seleccionar color de línea 1950 select one color within mouse 1950 seleccionar un color dentro del ratón 1951 select rectangle 1951 seleccionar rectángulo 1952 select source image color first 1952 seleccionar primero el color de la imagen de origen 1953 select surrounding areas matching colors in mouse 1953 seleccionar áreas circundantes con colores coincidentes en el ratón 1954 selection exceeds %d tags 1954 la selección supera %d tags 1955 sepia 1955 sepia 1956 set a new date/time: 1956 fijar una nueva fecha/hora: 1957 set all 1957 fijar todo 1958 set current window size 1958 fijar el tamaño de ventana actual 1959 set image color from input files 1959 fijar el color de la imagen a partir de los archivos de entrada 1960 set location from world map 1960 fijar la ubicación desde el mapa mundial 1961 set maximum crop 1961 fijar el recorte máximo 1962 shadow 1962 sombra 1963 shell command used for converting RAW files to RGB 1963 comando de shell usado para convertir archivos RAW a RGB 1964 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1964 mayús + clic izquierdo: tomar color de la imagen \narrastre izquierdo: pintar color en la imagen \narrastre derecho: restaurar imagen original 1965 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1965 mayús + clic izquierdo: sincronizar posición de copia \narrastre izquierdo: copiar imagen de origen al ratón \narrastre derecho: restaurar imagen original 1966 shift existing date/time (+/–): 1966 desplazar fecha/hora existente (+/–): 1967 shift+click on image to select color 1967 mayús+clic en la imagen para seleccionar color 1968 shortcut function not found: %s 1968 función de atajo no encontrada: %s 1969 shortcut key: 1969 tecla de atajo: 1970 shortcut not found: %s 1970 atajo no encontrado: %s 1971 show area outlines 1971 mostrar contornos de área 1972 show hidden files and folders 1972 mostrar archivos y carpetas ocultos 1973 show transient objects 1973 mostrar objetos transitorios 1974 size of mouse selection circle 1974 tamaño del círculo de selección del ratón 1975 smooth 1975 suave 1976 source file: 1976 archivo de origen: 1977 source image failure (scale too big?) 1977 fallo en la imagen de origen (¿escala demasiado grande?) 1978 source image scale 1978 escala de la imagen de origen 1979 specify a thumbnail folder 1979 especifica una carpeta de thumbnails 1980 specify at least 1 top image folder 1980 especifica al menos 1 carpeta de imágenes principal 1981 specify background size and color 1981 especifica el tamaño y color de fondo 1982 specify files and keywords 1982 especifica archivos y keywords 1983 spot size limit 1983 límite de tamaño de mancha 1984 start 1984 iniciar 1985 start a new script file 1985 iniciar un nuevo archivo de script 1986 start album 1986 álbum inicial 1987 start blob condensation process 1987 iniciar proceso de condensación de manchas 1988 start file 1988 archivo inicial 1989 start folder 1989 carpeta inicial 1990 start from first image in album 1990 empezar desde la primera imagen del álbum 1991 start fusion process 1991 iniciar proceso de fusión 1992 start over at end of album 1992 volver a empezar al final del álbum 1993 start warp 1993 iniciar deformación 1994 start with previous image file, gallery of recent files, etc. 1994 empezar con el archivo de imagen anterior, galería de archivos recientes, etc. 1995 startup album is invalid 1995 el álbum de inicio no es válido 1996 startup file is invalid 1996 el archivo de inicio no es válido 1997 startup folder is invalid 1997 la carpeta de inicio no es válida 1998 status: %s \n 1998 estado: %s \n 1999 status: completed \n 1999 estado: completado \n 2000 stay open 2000 mantener abierto 2001 step 2001 paso 2002 stop 2002 detener 2003 stop blob condensation process 2003 detener el proceso de condensación de manchas 2004 stop fusion process 2004 detener el proceso de fusión 2005 supply a file name 2005 proporciona un nombre de archivo 2006 tag name 2006 nombre del tag 2007 tag name %s not in xmeta tag list 2007 el nombre del tag %s no está en la lista de tags xmeta 2008 tag value 2008 valor del tag 2009 target file: 2009 archivo objetivo: 2010 template 2010 plantilla 2011 test: show changes, do not update files 2011 prueba: mostrar cambios, no actualizar archivos 2012 text 2012 texto 2013 text file is defective 2013 el archivo de texto está dañado 2014 text time 2014 hora de texto 2015 this function cannot be scripted 2015 esta función no se puede usar en un script 2016 thumbnail file 2016 archivo de thumbnail 2017 thumbnails deleted: %d \n 2017 thumbnails eliminados: %d \n 2018 thumbnails folder: %s \n 2018 carpeta de thumbnails: %s \n 2019 tile area goal 2019 objetivo del área de mosaico 2020 tile gap 2020 espacio entre mosaicos 2021 tile size 2021 tamaño de mosaico 2022 time 2022 hora 2023 title/desc. 2023 título/desc. 2024 to add images to current set, \nsearch all images 2024 para añadir imágenes al conjunto actual, \nbuscar en todas las imágenes 2025 to remove images from current set, \nsearch current set 2025 para eliminar imágenes del conjunto actual, \nbuscar en el conjunto actual 2026 too many categories 2026 demasiadas categorías 2027 too many files, cannot continue 2027 demasiados archivos, no se puede continuar 2028 too many keywords in a category 2028 demasiadas keywords en una categoría 2029 top image folders: \n 2029 carpetas de imágenes principales: \n 2030 transition 2030 transición 2031 transitions 2031 transiciones 2032 trash 2032 papelera 2033 trimmed color chart file 2033 archivo de carta de colores recortado 2034 unable to save bookmarks file 2034 no se puede guardar el archivo de marcadores 2035 unknown edit function: %s 2035 función de edición desconocida: %s 2036 unknown file type 2036 tipo de archivo desconocido 2037 unknown or empty album: %s 2037 álbum desconocido o vacío: %s 2038 unsharp mask 2038 máscara de desenfoque (unsharp mask) 2039 update 2039 actualizar 2040 updating albums ...\n 2040 actualizando álbumes ...\n 2041 upper 2041 superior 2042 upsize 2042 aumentar tamaño 2043 use 2043 usar 2044 use a saved Mashup project 2044 usar un proyecto Mashup guardado 2045 use average 2045 usar promedio 2046 use custom color palette 2046 usar paleta de color personalizada 2047 use median 2047 usar mediana 2048 use option to stop accidental quit 2048 usar opción para evitar cierre accidental 2049 use previous input 2049 usar entrada anterior 2050 use previous location 2050 usar ubicación anterior 2051 use prior edit step: 2051 usar paso de edición anterior: 2052 use the current image file 2052 usar el archivo de imagen actual 2053 variance 2053 varianza 2054 versions 2054 versiones 2055 vertical 2055 vertical 2056 video files not supported (install ffmpeg) 2056 archivos de vídeo no compatibles (instala ffmpeg) 2057 view album 2057 ver álbum 2058 waiting 2058 esperando 2059 warp 2059 deformar 2060 warp and align selected image with mouse drags 2060 deformar y alinear la imagen seleccionada con arrastres del ratón 2061 warp and fine-align selected image with neighbor 2061 deformar y ajustar finamente la imagen seleccionada con la vecina 2062 warp span 2062 extensión de deformación 2063 wavelength 2063 longitud de onda 2064 width 2064 ancho 2065 writing updated image index file \n 2065 escribiendo archivo de índice de imágenes actualizado \n 2066 x-count 2066 recuento-x 2067 x-offset 2067 desplazamiento-x 2068 y-count 2068 recuento-y 2069 y-offset 2069 desplazamiento-y 2070 years 2070 años 2071 you can close this window now \n 2071 ya puedes cerrar esta ventana \n 2072 you cannot use new name and replace text together 2072 no puedes usar nuevo nombre y reemplazar texto a la vez 2073 you must use either $s or $oldname 2073 debes usar $s o $oldname 2074 zoom image 2074 acercar imagen 2075 zoom via mouse wheel or Keys +/=/-/↑/↓ 2075 acercar/alejar con la rueda del ratón o teclas +/=/-/↑/↓ 2076 zoom-in 2076 acercar 2077 zoom-out 2077 alejar fotocx/data/translations/gui_fi0000664000175000017500000036371515247006657015674 0ustar micomico0000 + Zoom-in \n 0000 + Zoomaa sisään \n 0001 - Zoom-out \n 0001 - Zoomaa ulos \n 0002 = Zoom-in \n 0002 = Zoomaa sisään \n 0003 Arrow keys Previous/Next file \n 0003 Arrow keys Edellinen/seuraava tiedosto \n 0004 Delete Delete/Trash file \n 0004 Delete Poista/roskakoriin tiedosto \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Escape Sulje ikkuna / Sulje Fotocx \n 0006 F1 User Guide, Context Help \n 0006 F1 Käyttöopas, kontekstiohje \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 Koko näyttö / ei valikoita \n 0008 Home/End Gallery start/end \n 0008 Home/End Gallerian alku/loppu \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 Indeksoinnin kesto riippuu kuvatiedostojen määrästä, \n tyypistä ja koosta sekä tietokoneesi nopeudesta. Tämä voi \n vaihdella muutamasta sadasta yli 10 tuhanteen minuutissa. \n Voit muuttaa indeksointiasetuksia myöhemmin näistä valikoista: \n Työkalut > Indeksi, Työkalut > Asetukset. \n 0010 Page keys Gallery page up/down \n 0010 Page keys Gallerian sivu ylös/alas \n 0011 Z 1x <--> fit to window \n 0011 Z 1x <--> sovita ikkunaan \n 0012 $s plugin needs base and adder 0012 $s-lisäosa tarvitsee perustan ja lisäimen 0013 % from left: 0013 % vasemmalta: 0014 % from top: 0014 % ylhäältä: 0015 %d albums selected 0015 %d albumia valittu 0016 %d image files selected 0016 %d kuvatiedostoa valittu 0017 %d images 0017 %d kuvaa 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 %d keyword poistettavaksi \n%d kuvatiedostosta. \nJatketaanko? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 %d keyword nimettäväksi uudelleen \n%d kuvatiedostossa. \nJatketaanko? 0020 %d max images exceeded 0020 %d kuvan enimmäismäärä ylitetty 0021 %d red-eye limit reached 0021 %d punasilmäisyyden raja saavutettu 0022 %s %s %d folders %d files 0022 %s %s %d kansiota %d tiedostoa 0023 %s *** date/time conversion failed \n 0023 %s *** päivämäärän/ajan muunnos epäonnistui \n 0024 %s ALBUM %s %d files 0024 %s ALBUMI %s %d tiedostoa 0025 %s NEWEST FILES 0025 %s UUSIMMAT TIEDOSTOT 0026 %s RECENT FILES 0026 %s VIIMEAIKAISET TIEDOSTOT 0027 %s SEARCH RESULTS %d files 0027 %s HAKUTULOKSET %d tiedostoa 0028 %s UNKNOWN 0028 %s TUNTEMATON 0029 %s added to script 0029 %s lisätty skriptiin 0030 %s is already indexed 0030 %s on jo indeksoitu 0031 %s renamed: %s 0031 %s nimetty uudelleen: %s 0032 %s: metadata update failed 0032 %s: metadata-päivitys epäonnistui 0033 %s: no write permission 0033 %s: ei kirjoitusoikeutta 0034 %s: reserved, cannot be used 0034 %s: varattu, ei voida käyttää 0035 %s: too many keywords 0035 %s: liian monta keywordia 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\nKuvan pvm: %s Tiedoston pvm: %s \nArvostelu: %s Koko: %s %.2fmb \nSijainti: %s %s %s \nKeywordit: %s \nOtsikko: %s \nKuvaus: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\nKuvan pvm: %s Tiedoston pvm: %s \nArvostelu: %s Koko: %s %.2fmb \nSijainti: %s %s %s \nKeywordit: %s \nOtsikko: %s \nKuvaus: %s \n----------------------- \n%s 0038 (click below) 0038 (klikkaa alla) 0039 (no selection) 0039 (ei valintaa) 0040 (pixels) 0040 (pikseliä) 0041 (press key) 0041 (paina näppäintä) 0042 (select function) 0042 (valitse toiminto) 0043 *** bad utf8 detected *** \n 0043 *** virheellinen utf8 havaittu *** \n 0044 *** cannot create new file \n 0044 *** uutta tiedostoa ei voitu luoda \n 0045 *** cannot get real path of input file \n 0045 *** syötetiedoston todellista polkua ei saatu \n 0046 *** cannot load input file \n 0046 *** syötetiedostoa ei voitu ladata \n 0047 *** cannot make new version of input file \n 0047 *** syötetiedostosta ei voitu luoda uutta versiota \n 0048 *** cannot open input file 0048 *** syötetiedostoa ei voitu avata 0049 *** cannot read input file 0049 *** syötetiedostoa ei voitu lukea 0050 *** cannot save output file \n 0050 *** tulostetiedostoa ei voitu tallentaa \n 0051 *** completed \n 0051 *** valmis \n 0052 *** file date/time invalid \n 0052 *** tiedoston pvm/aika virheellinen \n 0053 *** file type not supported \n 0053 *** tiedostotyyppiä ei tueta \n 0054 *** invalid file \n 0054 *** virheellinen tiedosto \n 0055 *** metadata update error \n 0055 *** metadatan päivitysvirhe \n 0056 *** no date/time available \n 0056 *** pvm/aikatietoa ei saatavilla \n 0057 + bright 0057 + kirkkaus 0058 +Blue -Yellow 0058 +Sininen -Keltainen 0059 +Brightness 0059 +Kirkkaus 0060 +Green -Magenta 0060 +Vihreä -Magenta 0061 +Red -Cyan 0061 +Punainen -Syaani 0062 - blue 0062 - sininen 0063 - fog/haze 0063 - sumu/usva 0064 .heic/.avif files not supported (install heif_convert) 0064 .heic-/.avif-tiedostoja ei tueta (asenna heif_convert) 0065 .jp2 files not supported (install opj_decompress) 0065 .jp2-tiedostoja ei tueta (asenna opj_decompress) 0066 .webp files not supported (install dwebp) 0066 .webp-tiedostoja ei tueta (asenna dwebp) 0067 0 albums selected 0067 0 albumia valittu 0068 0 duplicates 0068 0 kaksoiskappaletta 0069 0-5 stars 0069 0-5 tähteä 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = ei kuvaindeksiä, vain vanha indeksi, vanha + päivitä uudet/muutetut 0071 2-character code 0071 2-merkkinen koodi 0072 3D depth 0072 3D-syvyys 0073 <2 images 0073 <2 kuvaa 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 Uutta Fotocx-julkaisua asennetaan. \nSaatat joutua palauttamaan mukautetut asetukset. 0075 ADD GLARE 0075 LISÄÄ HEIJASTUS 0076 ADD NOISE 0076 LISÄÄ KOHINAA 0077 ADJUST HSL 0077 SÄÄDÄ HSL 0078 ADJUST RGB 0078 SÄÄDÄ RGB 0079 ALBUM MASS UPDATE 0079 ALBUMIN MASSAPÄIVITYS 0080 ALBUMS 0080 ALBUMIT 0081 ALBUMS MENU 0081 ALBUMIT-VALIKKO 0082 ALIEN COLORS 0082 VIERAAT VÄRIT 0083 AMPLIFY CONTRAST 0083 VAHVISTA KONTRASTI 0084 ANTI-ALIAS 0084 REUNANPEHMENNYS 0085 AREA BLEND 0085 ALUEEN SEKOITUS 0086 AREA FILL 0086 ALUEEN TÄYTTÖ 0087 AREA OVERVIEW 0087 ALUEEN YLEISKATSAUS 0088 AUTOSEARCH 0088 AUTOMAATTIHAKU 0089 About 0089 Tietoja 0090 Action 0090 Toiminto 0091 Add 0091 Lisää 0092 Add 1 0092 Lisää 1 0093 Add All 0093 Lisää kaikki 0094 Add Current 0094 Lisää nykyinen 0095 Add Current File Here 0095 Lisää nykyinen tiedosto tähän 0096 Add Glare 0096 Lisää heijastus 0097 Add Image 0097 Lisää kuva 0098 Add Line 0098 Lisää viiva 0099 Add Margins 0099 Lisää marginaalit 0100 Add Noise 0100 Lisää kohinaa 0101 Add Random Noise 0101 Lisää satunnaista kohinaa 0102 Add Selected Files Here 0102 Lisää valitut tiedostot tähän 0103 Add Texture 0103 Lisää tekstuuri 0104 Add a brightness/color ramp across an image 0104 Lisää kirkkaus-/väriliuku kuvan poikki 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 Lisää kirjanmerkki: klikkaa gallerian thumbia. \nNimeä kirjanmerkki uudelleen: klikkaa sitä ja paina [Nimeä uudelleen] 0106 Add glare around bright objects 0106 Lisää heijastus kirkkaiden kohteiden ympärille 0107 Add margins around an image 0107 Lisää marginaalit kuvan ympärille 0108 Add newest version to existing versions 0108 Lisää uusin versio olemassa oleviin versioihin 0109 Add overlay image (e.g. copyright) to selected images 0109 Lisää peitekuva (esim. tekijänoikeus) valittuihin kuviin 0110 Add random noise to an image 0110 Lisää satunnaista kohinaa kuvaan 0111 Add selected versions to existing versions 0111 Lisää valitut versiot olemassa oleviin versioihin 0112 Add texture to an image 0112 Lisää tekstuuri kuvaan 0113 Add to Selection 0113 Lisää valintaan 0114 Add/change/delete metadata for selected image files 0114 Lisää/muuta/poista metadata valituille kuvatiedostoille 0115 Add/remove barrel/pincushion distortion 0115 Lisää/poista tynnyri-/tyynyvääristymä 0116 Add/remove brightness/color radially from chosen center 0116 Lisää/poista kirkkautta/väriä säteittäisesti valitusta keskipisteestä 0117 Add/remove keywords for selected image files 0117 Lisää/poista keywordit valituille kuvatiedostoille 0118 Add/revise location/geocoordinates for selected image files 0118 Lisää/muokkaa sijaintia/geokoordinaatteja valituille kuvatiedostoille 0119 Adjust HSL 0119 Säädä HSL 0120 Adjust Image Contributions 0120 Säädä kuvien osuuksia 0121 Adjust Pixel Composition 0121 Säädä pikselikoostumusta 0122 Adjust RGB 0122 Säädä RGB 0123 Adjust brightness, contrast, color 0123 Säädä kirkkautta, kontrastia, väriä 0124 Adjust color saturation based on brightness 0124 Säädä värikylläisyyttä kirkkauden perusteella 0125 Adjust color using HSL color model 0125 Säädä väriä HSL-värimallilla 0126 Adjust color using RGB or CMY colors 0126 Säädä väriä RGB- tai CMY-väreillä 0127 Adjustment 0127 Säätö 0128 Album Mass Update 0128 Albumin massapäivitys 0129 Album Name 0129 Albumin nimi 0130 Albums 0130 Albumit 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 Albumit: valittujen kuvien galleria, järjestä vetämällä ja pudottamalla 0132 Algorithm Iterations 0132 Algoritmin iteraatiot 0133 Alien Colors 0133 Vieraat värit 0134 All 0134 Kaikki 0135 All Areas 0135 Kaikki alueet 0136 All files 0136 Kaikki tiedostot 0137 All image files will be re-indexed. \nContinue? 0137 Kaikki kuvatiedostot indeksoidaan uudelleen. \nJatketaanko? 0138 All±1 0138 Kaikki±1 0139 All±10 0139 Kaikki±10 0140 Alpha 0140 Alfa 0141 Amount 0141 Määrä 0142 Amplify 0142 Vahvista 0143 Amplify Contrast 0143 Vahvista kontrastia 0144 Amplify area contrast to enhance visibility of details 0144 Vahvista alueen kontrastia yksityiskohtien näkyvyyden parantamiseksi 0145 Angle 0145 Kulma 0146 Anti-Alias 0146 Reunanpehmennys 0147 Apply 0147 Käytä 0148 Apply a soft focus effect to an image 0148 Lisää kuvaan pehmeän fokuksen efekti 0149 Apply repeatedly while watching the image. 0149 Käytä toistuvasti kuvaa katsellen. 0150 Area Blend 0150 Alueen sekoitus 0151 Area Edge Blend 0151 Alueen reunan sekoitus 0152 Area Fill 0152 Alueen täyttö 0153 Arrange images and text in a layout (photo-montage) 0153 Järjestä kuvat ja teksti asetteluun (valokuvamontaasi) 0154 Array Complete 0154 Ryhmä valmis 0155 Array Width 0155 Ryhmän leveys 0156 Arrow head 0156 Nuolenpää 0157 Auto Level 0157 Automaattitaso 0158 Auto black level 0158 Automaattinen mustan taso 0159 Auto crop: 0159 Automaattinen rajaus: 0160 Auto white balance 0160 Automaattinen valkotasapaino 0161 Auto-replay 0161 Automaattinen toisto 0162 BATCH CHANGE META 0162 ERÄMUUTA METADATA 0163 BATCH CONVERT 0163 ERÄMUUNNA 0164 BATCH COPY/MOVE 0164 ERÄKOPIOI/SIIRRÄ 0165 BATCH DELETE/TRASH 0165 ERÄPOISTA/ROSKAKORIIN 0166 BATCH GEOTAGS 0166 ERÄ-GEOTAGIT 0167 BATCH KEYWORDS 0167 ERÄ-KEYWORDIT 0168 BATCH MENU 0168 ERÄVALIKKO 0169 BATCH OVERLAY 0169 ERÄPEITEKUVA 0170 BATCH PHOTO DATE 0170 ERÄ KUVAN PÄIVÄMÄÄRÄ 0171 BATCH PROCESSING 0171 ERÄKÄSITTELY 0172 BATCH PURGE KEYWORDS 0172 ERÄPOISTA KEYWORDIT 0173 BATCH RENAME KEYWORDS 0173 ERÄNIMEÄ KEYWORDIT UUDELLEEN 0174 BATCH REPORT META 0174 ERÄRAPORTOI METADATA 0175 BATCH SCRIPT 0175 ERÄSKRIPTI 0176 BATCH UPRIGHT 0176 ERÄOIKAISU 0177 BLANK IMAGE 0177 TYHJÄ KUVA 0178 BLUR 0178 SUMENNUS 0179 BOOKMARKS 0179 KIRJANMERKIT 0180 BRIGHTNESS RAMP 0180 KIRKKAUSLIUKU 0181 Background 0181 Tausta 0182 Background Blur - blur relative to distance from foreground 0182 Taustan sumennus - sumennus suhteessa etäisyyteen etualasta 0183 Background Color 0183 Taustaväri 0184 Background Pattern 0184 Taustakuvio 0185 Base Transparency 0185 Perusläpinäkyvyys 0186 Batch 0186 Erä 0187 Batch Add/Change Metadata 0187 Eräkäsittele metadatan lisäys/muutos 0188 Batch Add/Remove Keywords 0188 Eräkäsittele keywordien lisäys/poisto 0189 Batch Change Meta 0189 Eräpäivitä metadata 0190 Batch Convert 0190 Eräkäsittele muunnos 0191 Batch Copy/Move 0191 Eräkopioi/siirrä 0192 Batch Delete/Trash 0192 Eräpoista/roskakoriin 0193 Batch Geotags 0193 Erä-geotagit 0194 Batch Keywords 0194 Erä-keywordit 0195 Batch Metadata 0195 Erämetadata 0196 Batch Overlay 0196 Eräpeitekuva 0197 Batch Photo Date 0197 Erä kuvan päivämäärä 0198 Batch Photo Date/Time 0198 Erä kuvan päivämäärä/aika 0199 Batch Purge Keywords 0199 Eräpoista keywordit 0200 Batch Rename Keywords 0200 Eränimeä keywordit uudelleen 0201 Batch Report Meta 0201 Eräraportoi metadata 0202 Batch Report Metadata 0202 Eräraportoi metadata 0203 Batch Set Geotags 0203 Eräaseta geotagit 0204 Batch Upright 0204 Eräoikaisu 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 Erä: kopioi, siirrä, muunna, RAW-muunnos, lisää/muuta metadata 0206 Bend and fine-align 0206 Taivuta ja hienosäädä kohdistus 0207 Bias 0207 Poikkeama 0208 Black 0208 Musta 0209 Blank Image 0209 Tyhjä kuva 0210 Blend 0210 Sekoitus 0211 Blend 0% 0211 Sekoitus 0 % 0212 Blend Width 0212 Sekoituksen leveys 0213 Blend area edits/edges using the mouse 0213 Sekoita alueen muokkauksia/reunoja hiirellä 0214 Blend: 0% 0214 Sekoitus: 0 % 0215 Blue 0215 Sininen 0216 Blue Factors 0216 Sinisen kertoimet 0217 Blur 0217 Sumennus 0218 Blur Angle (degrees) 0218 Sumennuksen kulma (astetta) 0219 Blur Background 0219 Sumenna tausta 0220 Blur Image 0220 Sumenna kuva 0221 Blur Mix 0221 Sumennuksen sekoitus 0222 Blur Normal 0222 Normaali sumennus 0223 Blur Radius 0223 Sumennuksen säde 0224 Blur Span 0224 Sumennuksen laajuus 0225 Blur Span (pixels) 0225 Sumennuksen laajuus (pikseliä) 0226 Blur the image (various methods) 0226 Sumenna kuva (eri menetelmillä) 0227 Bookmarks 0227 Kirjanmerkit 0228 Both 0228 Molemmat 0229 Bottom 0229 Alaosa 0230 Bright Limit 0230 Kirkkauden raja 0231 Bright Point 0231 Kirkas piste 0232 Brightness 0232 Kirkkaus 0233 Brightness Histogram 0233 Kirkkaushistogrammi 0234 Brightness Ramp 0234 Kirkkausliuku 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 Kirkkauden tulisi näyttää tasainen liuku \nkoko matkalta reunoihin asti. 0236 Browse 0236 Selaa 0237 CALIBRATE PRINTER 0237 KALIBROI TULOSTIN 0238 CAPTIONS 0238 KUVATEKSTIT 0239 CARTOON 0239 SARJAKUVA 0240 CHOOSE ALBUM 0240 VALITSE ALBUMI 0241 CLEAR AREA 0241 TYHJENNÄ ALUE 0242 CLOSE 0242 SULJE 0243 COLOR MODE 0243 VÄRITILA 0244 COMBINE MENU 0244 YHDISTÄ-VALIKKO 0245 COMMAND PARAMETERS 0245 KOMENTOPARAMETRIT 0246 COMPLETED 0246 VALMIS 0247 COPY FROM IMAGE 0247 KOPIOI KUVASTA 0248 COPY IN IMAGE 0248 KOPIOI KUVASSA 0249 COPY META 0249 KOPIOI METADATA 0250 COPY PRIOR EDIT 0250 KOPIOI EDELLINEN MUOKKAUS 0251 COPY TO CLIPBOARD 0251 KOPIOI LEIKEPÖYDÄLLE 0252 COPY TO DESKTOP 0252 KOPIOI TYÖPÖYDÄLLE 0253 COPY/MOVE 0253 KOPIOI/SIIRRÄ 0254 COPY/PASTE AREA 0254 KOPIOI/LIITÄ ALUE 0255 CREATE ALBUM 0255 LUO ALBUMI 0256 CROP 0256 RAJAA 0257 CROSSHATCH 0257 RISTIVIIVOITUS 0258 CURRENT ALBUM 0258 NYKYINEN ALBUMI 0259 CURRENT FILE FOLDER 0259 NYKYISEN TIEDOSTON KANSIO 0260 CURVE EDITING 0260 KÄYRÄN MUOKKAUS 0261 CUSTOM KERNEL 0261 MUKAUTETTU YDIN 0262 CUSTOM MENU 0262 MUKAUTETTU VALIKKO 0263 CYCLE 2 FILES 0263 KIERRÄTÄ 2 TIEDOSTOA 0264 CYCLE 3 FILES 0264 KIERRÄTÄ 3 TIEDOSTOA 0265 Calculate 0265 Laske 0266 Calculate Geometry 0266 Laske geometria 0267 Calibrate Printer 0267 Kalibroi tulostin 0268 Cancel 0268 Peruuta 0269 Cartoon 0269 Sarjakuva 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 Huomio: Käytä toimintoa Muokkaa päämetadataa \nmuuttaaksesi siellä käytettävissä olevia tageja, jotta \nvarmistat että liittyvät päivitykset tehdään. 0271 Center 0271 Keskipiste 0272 Center Hole 0272 Keskiaukko 0273 Change 0273 Muuta 0274 Change Log 0274 Muutosloki 0275 Change file name 0275 Muuta tiedoston nimeä 0276 Change gallery sort order 0276 Muuta gallerian lajittelujärjestystä 0277 Change image colors using an algorithm 0277 Muuta kuvan värejä algoritmilla 0278 Change image pixel dimensions 0278 Muuta kuvan pikselimittoja 0279 Chart to adjust monitor color 0279 Kaavio näytön värin säätämiseksi 0280 Choose 0280 Valitse 0281 Choose Album 0281 Valitse albumi 0282 Choose Albums 0282 Valitse albumeja 0283 Choose Captions 0283 Valitse kuvatekstit 0284 Choose an album and show as gallery of images 0284 Valitse albumi ja näytä kuvagalleriana 0285 Choose metadata shown on image captions 0285 Valitse kuvateksteissä näytettävä metadata 0286 Choose new Fotocx home folder 0286 Valitse uusi Fotocx-kotikansio 0287 Choose thumbnail folder 0287 Valitse thumbnail-kansio 0288 Choose top image folders 0288 Valitse ylimmät kuvakansiot 0289 Clear 0289 Tyhjennä 0290 Click dark spot for black level 0290 Klikkaa tummaa kohtaa mustan tason määrittämiseksi 0291 Click for RGB histogram 0291 Klikkaa RGB-histogrammia varten 0292 Click gray spot for white balance 0292 Klikkaa harmaata kohtaa valkotasapainoa varten 0293 Click image to select pixels 0293 Klikkaa kuvaa valitaksesi pikseleitä 0294 Click image to select, drag image to move. 0294 Klikkaa kuvaa valitaksesi, vedä kuvaa siirtääksesi. 0295 Click mouse to change center 0295 Klikkaa hiirellä vaihtaaksesi keskipistettä 0296 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0296 Klikkaa lähellä mitä tahansa kohtaa alueen ääriviivalla. \nMahdolliset aukot ääriviivassa löydetään. \nPaina F1 saadaksesi ohjeen 0297 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0297 Klikkaa nelikulmion alueen neljää kulmaa. Paina [käytä]. \nKuva vääristetään niin, että nelikulmiosta tulee suorakulmio. 0298 Click thumbnail to select file 0298 Klikkaa thumbnailia valitaksesi tiedoston 0299 Clip Level 0299 Leikkaustaso 0300 Clip Limit % 0300 Leikkausraja % 0301 Color 0301 Väri 0302 Color Chooser 0302 Värinvalitsin 0303 Color Depth: 0303 Värisyvyys: 0304 Color Fringes 0304 Värireunukset 0305 Color Hue 0305 Värisävy 0306 Color Map File 0306 Värikarttatiedosto 0307 Color Match Images 0307 Sovita kuvien värit 0308 Color Mode 0308 Väritila 0309 Color calibration tool for printer and paper type 0309 Värikalibrointityökalu tulostimelle ja paperityypille 0310 Color map file to use 0310 Käytettävä värikarttatiedosto 0311 Combine 0311 Yhdistä 0312 Combine 2-6 images into a wide panorama image 0312 Yhdistä 2-6 kuvaa laajaksi panoraamakuvaksi 0313 Combine many images into an array of images 0313 Yhdistä monta kuvaa kuvaryhmäksi 0314 Combine multiple images in layers, select and expose layers 0314 Yhdistä useita kuvia tasoina, valitse ja paljasta tasoja 0315 Combine multiple noisy photos into a low-noise image 0315 Yhdistä useita kohinaisia valokuvia vähäkohinaiseksi kuvaksi 0316 Combine multiple photos to erase passing people, etc. 0316 Yhdistä useita valokuvia poistaaksesi ohikulkevia ihmisiä yms. 0317 Combine within 0317 Yhdistä sisällä 0318 Combine: HDR, HDF, stack, panorama, mashup, image array 0318 Yhdistä: HDR, HDF, pino, panoraama, mashup, kuvaryhmä 0319 Command Params 0319 Komentoparametrit 0320 Commit 0320 Vahvista 0321 Confirm Exit 0321 Vahvista poistuminen 0322 Contrast 0322 Kontrasti 0323 Contrast All 0323 Kontrasti kaikki 0324 Contrast Blue 0324 Kontrasti sininen 0325 Contrast Green 0325 Kontrasti vihreä 0326 Contrast Limit 0326 Kontrastin raja 0327 Contrast Red 0327 Kontrasti punainen 0328 Convert %d image files 0328 Muunna %d kuvatiedostoa 0329 Convert an image into a Tiny Planet image 0329 Muunna kuva pikkuplaneettakuvaksi 0330 Convert image into a cartoon drawing 0330 Muunna kuva sarjakuvapiirrokseksi 0331 Convert image into a crosshatch sketch 0331 Muunna kuva ristiviivoitusluonnokseksi 0332 Convert image into a line drawing 0332 Muunna kuva viivapiirrokseksi 0333 Convert image into a simulated painting 0333 Muunna kuva simuloiduksi maalaukseksi 0334 Convert image into a simulated sketch (1) 0334 Muunna kuva simuloiduksi luonnokseksi (1) 0335 Convert image into a simulated sketch (2) 0335 Muunna kuva simuloiduksi luonnokseksi (2) 0336 Convert image into black/white lines 0336 Muunna kuva mustavalkoisiksi viivoiksi 0337 Convert image into dithered dots 0337 Muunna kuva rasteripisteiksi 0338 Convert image into square tiles with 3D effect 0338 Muunna kuva neliölaatoiksi 3D-tehosteella 0339 Convert image into tiles matching feature contours 0339 Muunna kuva piirteiden ääriviivoja mukaileviksi laatoiksi 0340 Copy 0340 Kopioi 0341 Copy %d image files 0341 Kopioi %d kuvatiedostoa 0342 Copy From Image 0342 Kopioi kuvasta 0343 Copy Meta 0343 Kopioi metadata 0344 Copy Metadata 0344 Kopioi metadata 0345 Copy Prior Edit 0345 Kopioi edellinen muokkaus 0346 Copy Within Image 0346 Kopioi kuvan sisällä 0347 Copy area for later pasting into image 0347 Kopioi alue myöhempää liittämistä varten kuvaan 0348 Copy areas from another image using the mouse 0348 Kopioi alueita toisesta kuvasta hiirellä 0349 Copy areas from prior edits using the mouse 0349 Kopioi alueita edellisistä muokkauksista hiirellä 0350 Copy areas within an image using the mouse 0350 Kopioi alueita kuvan sisällä hiirellä 0351 Copy image file to the clipboard 0351 Kopioi kuvatiedosto leikepöydälle 0352 Copy image file to the desktop 0352 Kopioi kuvatiedosto työpöydälle 0353 Copy in Image 0353 Kopioi kuvassa 0354 Copy metadata from one image to another 0354 Kopioi metadata kuvasta toiseen 0355 Copy or Move Image File 0355 Kopioi tai siirrä kuvatiedosto 0356 Copy or Move image file to new location 0356 Kopioi tai siirrä kuvatiedosto uuteen sijaintiin 0357 Copy to Clipboard 0357 Kopioi leikepöydälle 0358 Copy to Desktop 0358 Kopioi työpöydälle 0359 Copy without unsaved changes? 0359 Kopioidaanko ilman tallentamattomia muutoksia? 0360 Copy/Move 0360 Kopioi/siirrä 0361 Copy/move selected image files to a new folder 0361 Kopioi/siirrä valitut kuvatiedostot uuteen kansioon 0362 Copyright 0362 Tekijänoikeus 0363 Create 0363 Luo 0364 Create Album 0364 Luo albumi 0365 Create Blank Image 0365 Luo tyhjä kuva 0366 Create Mosaic 0366 Luo mosaiikki 0367 Create a blank image 0367 Luo tyhjä kuva 0368 Create a mosaic with tiles made from all images 0368 Luo mosaiikki kaikista kuvista tehdyillä laatoilla 0369 Create a new album (ordered set of image files) 0369 Luo uusi albumi (järjestetty joukko kuvatiedostoja) 0370 Create an embossed or 3D appearance 0370 Luo kohokuvio- tai 3D-ulkoasu 0371 Create or replace an album 0371 Luo tai korvaa albumi 0372 Crop 0372 Rajaa 0373 Crop (trim) image margins 0373 Rajaa (leikkaa) kuvan marginaalit 0374 Crop Buttons 0374 Rajauspainikkeet 0375 Crop Image 0375 Rajaa kuva 0376 Crosshatch 0376 Ristiviivoitus 0377 Crosshatch Sketch 0377 Ristiviivoitusluonnos 0378 Current Album 0378 Nykyinen albumi 0379 Current File Folder 0379 Nykyisen tiedoston kansio 0380 Current gallery 0380 Nykyinen galleria 0381 Current image: 0381 Nykyinen kuva: 0382 Curve Node 0382 Käyrän solmu 0383 Curve lines need at least 4 points 0383 Käyräviivat tarvitsevat vähintään 4 pistettä 0384 Custom 0384 Mukautettu 0385 Custom Kernel 0385 Mukautettu ydin 0386 Custom Shortcuts \n 0386 Mukautetut pikanäppäimet \n 0387 Custom menu: favorite/frequent functions, scripts, plugins 0387 Mukautettu valikko: suosikki-/usein käytetyt toiminnot, skriptit, lisäosat 0388 Customize 0388 Mukauta 0389 Customize: 0389 Mukauta: 0390 Cut Bottom 0390 Leikkaa alaosa 0391 Cut Top 0391 Leikkaa yläosa 0392 Cycle 2 Files 0392 Kierrätä 2 tiedostoa 0393 Cycle 2 Prior Files 0393 Kierrätä 2 edellistä tiedostoa 0394 Cycle 3 Files 0394 Kierrätä 3 tiedostoa 0395 Cycle 3 Prior Files 0395 Kierrätä 3 edellistä tiedostoa 0396 Cycle through images: 0396 Selaa kuvia kierrättäen: 0397 DARK/BRIGHT PIXELS 0397 TUMMAT/KIRKKAAT PIKSELIT 0398 DEFOG 0398 POISTA SUMU 0399 DELETE ALBUM 0399 POISTA ALBUMI 0400 DELETE META 0400 POISTA METADATA 0401 DELETE/TRASH 0401 POISTA/ROSKAKORIIN 0402 DENOISE 0402 POISTA KOHINA 0403 DIALOG BUTTONS 0403 VALINTAIKKUNAN PAINIKKEET 0404 DITHER 0404 RASTEROINTI 0405 DRAG AND DROP 0405 VEDÄ JA PUDOTA 0406 Dark Areas 0406 Tummat alueet 0407 Dark Limit 0407 Tummuuden raja 0408 Dark Point 0408 Tumma piste 0409 Dark/Bright Pixels 0409 Tummat/kirkkaat pikselit 0410 Data file 0410 Datatiedosto 0411 Define keywords used for searching images 0411 Määritä kuvien hakuun käytettävät keywordit 0412 Defined Keywords: 0412 Määritetyt keywordit: 0413 Defog 0413 Poista sumu 0414 Delete 0414 Poista 0415 Delete Album 0415 Poista albumi 0416 Delete Meta 0416 Poista metadata 0417 Delete Metadata 0417 Poista metadata 0418 Delete Originals 0418 Poista alkuperäiset 0419 Delete an album 0419 Poista albumi 0420 Delete or Trash selected image files 0420 Poista tai siirrä roskakoriin valitut kuvatiedostot 0421 Delete or trash an image file 0421 Poista tai siirrä kuvatiedosto roskakoriin 0422 Delete read-only file? 0422 Poistetaanko kirjoitussuojattu tiedosto? 0423 Delete/Trash 0423 Poista/roskakoriin 0424 Denoise 0424 Poista kohina 0425 Depth 0425 Syvyys 0426 Description: %s\n 0426 Kuvaus: %s\n 0427 Desktop 0427 Työpöytä 0428 Dialog Font 0428 Valintaikkunan fontti 0429 Diffs 0429 Erot 0430 Directed Blur 0430 Suunnattu sumennus 0431 Directed Blur - blur locally in direction of mouse drag 0431 Suunnattu sumennus - sumenna paikallisesti hiiren vetosuuntaan 0432 Disable 0432 Poista käytöstä 0433 Disable areas for editing 0433 Poista alueet käytöstä muokkausta varten 0434 Discard unsaved changes? 0434 Hylätäänkö tallentamattomat muutokset? 0435 Discard unsaved edits? 0435 Hylätäänkö tallentamattomat muokkaukset? 0436 Distort image areas using the mouse 0436 Vääristä kuvan alueita hiirellä 0437 Dither 0437 Rasterointi 0438 Dither Image 0438 Rasteroi kuva 0439 Dither0 0439 Rasterointi0 0440 Dither1 0440 Rasterointi1 0441 Dither2 0441 Rasterointi2 0442 Dither3 0442 Rasterointi3 0443 Dither4 0443 Rasterointi4 0444 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0444 Vedä kuvat suurin piirtein kohdalleen.\nKierrä vetämällä alareunasta. 0445 Drag margin box middle or edges 0445 Vedä marginaalilaatikon keskeltä tai reunoilta 0446 Drag mouse on image. \nLeft click to cancel. 0446 Vedä hiirtä kuvan päällä. \nVasen klikkaus peruuttaa. 0447 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0447 Vedä hiirtä valitaksesi. Pyyhi. Toista. \nKlikkaus: laajenna valintaa hiiren kohdalle. 0448 Drag mouse to set center 0448 Vedä hiirtä asettaaksesi keskipisteen 0449 Drag near an image corner using the mouse 0449 Vedä lähellä kuvan kulmaa hiirellä 0450 Drag on image to level image.\nClick on image for level lines. 0450 Vedä kuvalla suoristaaksesi kuvan.\nKlikkaa kuvaa saadaksesi suoristusviivat. 0451 Drag within image using the mouse 0451 Vedä kuvan sisällä hiirellä 0452 Draw a line across the image in \ndirection of brightness change. 0452 Piirrä viiva kuvan poikki \nkirkkauden muutoksen suuntaan. 0453 Draw box on image 0453 Piirrä laatikko kuvaan 0454 Draw line or arrow on image 0454 Piirrä viiva tai nuoli kuvaan 0455 Draw on image: text, line/arrow, box, circle, ellipse 0455 Piirrä kuvaan: teksti, viiva/nuoli, laatikko, ympyrä, ellipsi 0456 Draw oval on image 0456 Piirrä soikio kuvaan 0457 Draw text on image 0457 Piirrä teksti kuvaan 0458 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0458 Kaksoiskappale- tai sisäkkäiset kansiot: \n %s \n %s \nPoista jompikumpi. 0459 Duplicates: 0459 Kaksoiskappaleet: 0460 EDIT ALBUM 0460 MUOKKAA ALBUMIA 0461 EDIT ANY META 0461 MUOKKAA MITÄ TAHANSA METADATAA 0462 EDIT BOOKMARKS 0462 MUOKKAA KIRJANMERKKEJÄ 0463 EDIT MAIN META 0463 MUOKKAA PÄÄMETADATAA 0464 EDIT MENU 0464 MUOKKAUSVALIKKO 0465 EDIT PROCEDURES 0465 MUOKKAA MENETTELYJÄ 0466 EDIT SCRIPT 0466 MUOKKAA SKRIPTIÄ 0467 EDIT WORKFLOW 0467 MUOKKAA TYÖNKULKUA 0468 EFFECTS MENU 0468 TEHOSTEVALIKKO 0469 EMBOSS 0469 KOHOKUVIO 0470 ENABLE/DISABLE AREA 0470 OTA ALUE KÄYTTÖÖN/POIS KÄYTÖSTÄ 0471 ENGRAVE 0471 KAIVERRUS 0472 ESCHER SPIRAL 0472 ESCHER-SPIRAALI 0473 EXPORT FILES 0473 VIE TIEDOSTOT 0474 Edge 0474 Reuna 0475 Edit 0475 Muokkaa 0476 Edit Any Meta 0476 Muokkaa mitä tahansa metadataa 0477 Edit Any Metadata 0477 Muokkaa mitä tahansa metadataa 0478 Edit Bookmarks 0478 Muokkaa kirjanmerkkejä 0479 Edit Images 0479 Muokkaa kuvia 0480 Edit Line 0480 Muokkaa viivaa 0481 Edit Line/Arrow 0481 Muokkaa viivaa/nuolta 0482 Edit Main Meta 0482 Muokkaa päämetadataa 0483 Edit Main Metadata 0483 Muokkaa päämetadataa 0484 Edit Menu 0484 Muokkausvalikko 0485 Edit Metadata 0485 Muokkaa metadataa 0486 Edit Text 0486 Muokkaa tekstiä 0487 Edit any metadata tag 0487 Muokkaa mitä tahansa metadata-tagia 0488 Edit function can not use Paint Edits 0488 Muokkaustoiminto ei voi käyttää maalausmuokkauksia 0489 Edit function must be active 0489 Muokkaustoiminnon on oltava käytössä 0490 Edit key metadata: keywords/geotags/description/rating ... 0490 Muokkaa keskeistä metadataa: keywordit/geotagit/kuvaus/arvostelu ... 0491 Edit plugins menu 0491 Muokkaa lisäosavalikkoa 0492 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0492 Muokkaa: rajaa, kierrä, retusoi, skaalaa, merkitse, maalausmuokkaukset, kopioi alueita 0493 Effects 0493 Tehosteet 0494 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0494 Tehosteet: sarjakuva, luonnos, maalaus, kohokuvio, rasterointi, tekstuuri, värit, mukautettu konvoluutio 0495 Emboss 0495 Kohokuvio 0496 Enable 0496 Ota käyttöön 0497 Enable areas for editing 0497 Ota alueet käyttöön muokkausta varten 0498 End of gallery 0498 Gallerian loppu 0499 Engrave 0499 Kaiverrus 0500 Enter Keyword 0500 Anna keyword 0501 Enter New Keyword 0501 Anna uusi keyword 0502 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0502 Anna viivan tai nuolen ominaisuudet valintaikkunassa, \nklikkaa/vedä kuvassa, poista oikealla klikkauksella 0503 Enter text, [Add] to layout, edit properties. 0503 Kirjoita teksti, [Lisää] asetteluun, muokkaa ominaisuuksia. 0504 Enter text, click/drag on image, right click to remove 0504 Kirjoita teksti, klikkaa/vedä kuvassa, poista oikealla klikkauksella 0505 Erase 0505 Pyyhi 0506 Erase existing areas 0506 Pyyhi olemassa olevat alueet 0507 Escher Spiral 0507 Escher-spiraali 0508 Exceed 50 anchor points 0508 Yli 50 ankkuripistettä 0509 Export Files 0509 Vie tiedostot 0510 Export selected image files to another folder 0510 Vie valitut kuvatiedostot toiseen kansioon 0511 FILE MENU 0511 TIEDOSTOVALIKKO 0512 FILE SAVE 0512 TALLENNA TIEDOSTO 0513 FILE VIEW 0513 TIEDOSTONÄKYMÄ 0514 FIND AREA GAP 0514 ETSI ALUEEN AUKKO 0515 FIND BAD FILES 0515 ETSI VIRHEELLISET TIEDOSTOT 0516 FIND DUPLICATES 0516 ETSI KAKSOISKAPPALEET 0517 FIRST INDEX 0517 ENSIMMÄINEN INDEKSOINTI 0518 FIRST STARTUP 0518 ENSIMMÄINEN KÄYNNISTYS 0519 FIX META 0519 KORJAA METADATA 0520 FLATTEN HISTOGRAM 0520 TASOITA HISTOGRAMMI 0521 FLATTEN PHOTO 0521 TASOITA VALOKUVA 0522 FOLDER TREE 0522 KANSIOPUU 0523 FOTOCX FOR WINDOWS 11 0523 FOTOCX WINDOWS 11:LLE 0524 FOTOCX LIMITATIONS 0524 FOTOCX-RAJOITUKSET 0525 FOTOCX USAGE 0525 FOTOCX-KÄYTTÖ 0526 FRINGES 0526 REUNUKSET 0527 FUSION 0527 FUUSIO 0528 Fetch 0528 Nouda 0529 File 0529 Tiedosto 0530 File Mod Date/Time 0530 Tiedoston muutospäivä/-aika 0531 File Name 0531 Tiedoston nimi 0532 File Name/Number 0532 Tiedoston nimi/numero 0533 File Name: %s \n 0533 Tiedoston nimi: %s \n 0534 File Size (bytes) 0534 Tiedoston koko (tavua) 0535 File View 0535 Tiedostonäkymä 0536 File count: 0536 Tiedostojen määrä: 0537 File type cannot be edited 0537 Tiedostotyyppiä ei voi muokata 0538 File1 0538 Tiedosto1 0539 File2 0539 Tiedosto2 0540 File: 0540 Tiedosto: 0541 File: new session, open, rename, copy/move, delete, print 0541 Tiedosto: uusi istunto, avaa, nimeä uudelleen, kopioi/siirrä, poista, tulosta 0542 Fill selected areas or transparent areas with a color 0542 Täytä valitut alueet tai läpinäkyvät alueet värillä 0543 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0543 Täytä valitut alueet värillä visuaalista tarkistusta varten. \nMenetelmä 1: vasen klikkaus jokaisessa valitussa alueessa, jota ei ole vielä täytetty. \nMenetelmä 2: oikea klikkaus KAIKKIEN valittujen alueiden ULKOPUOLELLA. \nPaina [ohje]-painiketta lisätietoja varten 0544 Find 0544 Etsi 0545 Find Bad Files 0545 Etsi virheelliset tiedostot 0546 Find Duplicate Images 0546 Etsi kaksoiskappalekuvat 0547 Find Duplicates 0547 Etsi kaksoiskappaleet 0548 Find Gap 0548 Etsi aukko 0549 Find a gap in an area outline 0549 Etsi aukko alueen ääriviivasta 0550 Find all images for a location [date range] 0550 Etsi kaikki kuvat sijainnille [aikaväli] 0551 Find all images for a selected tag name and value 0551 Etsi kaikki kuvat valitulle tag-nimelle ja -arvolle 0552 Find images meeting multiple search criteria 0552 Etsi kuvat, jotka täyttävät useita hakuehtoja 0553 Find optimum factors: 0553 Etsi optimaaliset kertoimet: 0554 Finish 0554 Lopeta 0555 Finish Area 0555 Viimeistele alue 0556 Fix Bad File 0556 Korjaa virheellinen tiedosto 0557 Fix Broken Metadata 0557 Korjaa rikkoutunut metadata 0558 Fix Meta 0558 Korjaa metadata 0559 Fix Motion Blur 0559 Korjaa liike-epäterävyys 0560 Fix Perspective 0560 Korjaa perspektiivi 0561 Fix color fringes (chromatic aberration) 0561 Korjaa värireunukset (kromaattinen aberraatio) 0562 Fix perspective for object photographed from an angle 0562 Korjaa perspektiivi kulmasta kuvatulle kohteelle 0563 Fix red-eyes from flash photo 0563 Korjaa punasilmäisyys salamakuvasta 0564 Flatten 0564 Tasoita 0565 Flatten Histogram 0565 Tasoita histogrammi 0566 Flatten Pano 0566 Tasoita panoraama 0567 Flatten Photo 0567 Tasoita valokuva 0568 Flatten brightness histogram to enhance details 0568 Tasoita kirkkaushistogrammi yksityiskohtien parantamiseksi 0569 Flatten curved surface. 0569 Tasoita kaareva pinta. 0570 Flatten photo of a curved image (e.g. poster on round column 0570 Tasoita valokuva kaarevasta kuvasta (esim. juliste pyöreällä pilarilla 0571 Flip 0571 Peilaa 0572 Folder Tree 0572 Kansiopuu 0573 Folders 0573 Kansiot 0574 Folders for image files (subfolders included automatically) 0574 Kansiot kuvatiedostoille (alikansiot mukana automaattisesti) 0575 Font 0575 Fontti 0576 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0576 Satunnaisessa kuvasarjassa tämä arvo on \nsuhteellinen taajuus, jolla kuva näytetään. \nPerusarvo on 10. 20 --> näytä 2x useammin. 0577 Foreground 0577 Etuala 0578 Fotocx copyright notice 0578 Fotocxin tekijänoikeusilmoitus 0579 Fotocx home 0579 Fotocx-koti 0580 Fotocx privacy policy 0580 Fotocxin tietosuojakäytäntö 0581 Fotocx video tutorial on YouTube 0581 Fotocx-videokoulutus YouTubessa 0582 Fotocx web site (information and downloads) 0582 Fotocxin verkkosivusto (tietoa ja latauksia) 0583 FreeSans 0583 FreeSans 0584 Full List 0584 Koko luettelo 0585 Full Screen 0585 Koko näyttö 0586 Fusion 0586 Fuusio 0587 GALLERY END 0587 GALLERIAN LOPPU 0588 GALLERY FILTER 0588 GALLERIAN SUODATIN 0589 GALLERY HOME 0589 GALLERIAN KOTI 0590 GALLERY MENU 0590 GALLERIAVALIKKO 0591 GALLERY OVERVIEW 0591 GALLERIAN YLEISKATSAUS 0592 GALLERY SORT 0592 GALLERIAN LAJITTELU 0593 GALLERY TO ALBUM 0593 GALLERIASTA ALBUMIKSI 0594 GALLERY VIEW 0594 GALLERIANÄKYMÄ 0595 GDK pixbuf: cannot save file 0595 GDK pixbuf: tiedostoa ei voi tallentaa 0596 GLOBAL RETINEX 0596 GLOBAALI RETINEX 0597 GRID SETTINGS 0597 RUUDUKON ASETUKSET 0598 Gallery 0598 Galleria 0599 Gallery End 0599 Gallerian loppu 0600 Gallery Filter 0600 Gallerian suodatin 0601 Gallery Home 0601 Gallerian koti 0602 Gallery Sort 0602 Gallerian lajittelu 0603 Gallery View 0603 Gallerianäkymä 0604 Gallery of newest image files 0604 Uusimpien kuvatiedostojen galleria 0605 Gallery of recently viewed image files 0605 Viimeksi katsottujen kuvatiedostojen galleria 0606 Gallery to Album 0606 Galleriasta albumiksi 0607 Gallery view with thumbnails and basic metadata 0607 Gallerianäkymä thumbnaileilla ja perusmetadatalla 0608 Gallery view with thumbnails and file data 0608 Gallerianäkymä thumbnaileilla ja tiedostotiedoilla 0609 Gallery: thumbnails, new/recent, sort, select, bookmarks 0609 Galleria: thumbnailit, uudet/viimeaikaiset, lajittelu, valinta, kirjanmerkit 0610 Generate an inward spiraling repeating image 0610 Luo sisäänpäin kiertyvä toistuva kuva 0611 Global Retinex 0611 Globaali Retinex 0612 Gradual 0612 Asteittainen 0613 Graduated Blur 0613 Asteittainen sumennus 0614 Graduated Blur - blur relative to pixel contrast 0614 Asteittainen sumennus - sumennus suhteessa pikselikontrastiin 0615 Grayscale 0615 Harmaasävy 0616 Green 0616 Vihreä 0617 Grid Settings 0617 Ruudukon asetukset 0618 Group by country 0618 Ryhmittele maan mukaan 0619 Group by country/date 0619 Ryhmittele maan/päivämäärän mukaan 0620 Group by country/location 0620 Ryhmittele maan/sijainnin mukaan 0621 Group by country/location/date 0621 Ryhmittele maan/sijainnin/päivämäärän mukaan 0622 Group by date/country 0622 Ryhmittele päivämäärän/maan mukaan 0623 Group by date/country/location 0623 Ryhmittele päivämäärän/maan/sijainnin mukaan 0624 HDF 0624 HDF 0625 HDR 0625 HDR 0626 HELP MENU 0626 OHJEVALIKKO 0627 Hard 0627 Kova 0628 Height 0628 Korkeus 0629 Height: 0629 Korkeus: 0630 Help 0630 Ohje 0631 Help: user guide, tutorial, change log, licenses, privacy, about 0631 Ohje: käyttöopas, opetusohjelma, muutosloki, lisenssit, tietosuoja, tietoja 0632 Hide 0632 Piilota 0633 Hide selected areas 0633 Piilota valitut alueet 0634 High 0634 Korkea 0635 High Depth of Field - combine near/far focus images for deeper focus 0635 Suuri syväterävyys - yhdistä lähi-/kaukotarkennuskuvat syvemmän tarkennuksen saamiseksi 0636 High Dynamic Range - combine bright/dark images for better detail 0636 Suuri dynamiikka-alue - yhdistä vaaleat/tummat kuvat parempien yksityiskohtien saamiseksi 0637 Highlight darkest and brightest pixels 0637 Korosta tummimmat ja kirkkaimmat pikselit 0638 Home Folder 0638 Kotikansio 0639 Home Page 0639 Kotisivu 0640 Horz 0640 Vaaka 0641 How to remove Fotocx application and user files 0641 Miten Fotocx-sovellus ja käyttäjätiedostot poistetaan 0642 Hue 0642 Sävy 0643 IMAGE ARRAY 0643 KUVARYHMÄ 0644 INDEX FILES 0644 INDEKSOI TIEDOSTOT 0645 INSIDE-OUT 0645 SISÄPUOLI ULOS 0646 INVERT AREA 0646 KÄÄNNÄ ALUE 0647 Icon size 0647 Kuvakkeen koko 0648 Icons 0648 Kuvakkeet 0649 Image 0649 Kuva 0650 Image Array 0650 Kuvaryhmä 0651 Image Columns 0651 Kuvasarakkeet 0652 Image Differences 0652 Kuvien erot 0653 Image File 0653 Kuvatiedosto 0654 Image File: 0654 Kuvatiedosto: 0655 Image Keywords 0655 Kuvan keywordit 0656 Image Locations 0656 Kuvien sijainnit 0657 Image Markup 0657 Kuvan merkintä 0658 Image Position 0658 Kuvan sijainti 0659 Image Preferences 0659 Kuva-asetukset 0660 Image Ratios 0660 Kuvasuhteet 0661 Image Size (pixels) 0661 Kuvan koko (pikseliä) 0662 Image Time 0662 Kuvan aika 0663 Image Timeline 0663 Kuvan aikajana 0664 Image colors are converted for printing. 0664 Kuvan värit muunnetaan tulostusta varten. 0665 Image dimensions have changed \nCopy Prior Edit cannot be used 0665 Kuvan mitat ovat muuttuneet \nKopioi edellinen muokkaus -toimintoa ei voi käyttää 0666 Image dimensions have changed, \nArea Blend cannot be used 0666 Kuvan mitat ovat muuttuneet, \nAlueen sekoitus -toimintoa ei voi käyttää 0667 Image dimensions have changed, \nthis prior image cannot be used 0667 Kuvan mitat ovat muuttuneet, \ntätä edellistä kuvaa ei voi käyttää 0668 Image is fixed, unmovable 0668 Kuva on kiinnitetty, sitä ei voi siirtää 0669 Images sizes are not compatible 0669 Kuvien koot eivät ole yhteensopivia 0670 Include: 0670 Sisällytä: 0671 Index Files 0671 Indeksoi tiedostot 0672 Index Level 0672 Indeksointitaso 0673 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0673 Indeksointitoiminto keskeytyi. \nIndeksointi vaaditaan haku- ja karttatoimintoja varten \nja jotta thumbnail-gallerian sivut näkyisivät nopeasti. 0674 Index new image files and make thumbnails 0674 Indeksoi uudet kuvatiedostot ja luo thumbnailit 0675 Input color to match and adjust: 0675 Syötä sovitettava ja säädettävä väri: 0676 Inside-out 0676 Sisäpuoli ulos 0677 Intensity 0677 Voimakkuus 0678 Invert 0678 Käännä 0679 Invert selected areas (selected ↔ not selected) 0679 Käännä valitut alueet (valittu ↔ ei valittu) 0680 Irregular Tiles 0680 Epäsäännölliset laatat 0681 Iterations 0681 Iteraatiot 0682 JPEG ARTIFACTS 0682 JPEG-ARTEFAKTIT 0683 JPEG Artifacts 0683 JPEG-artefaktit 0684 JPEG files 0684 JPEG-tiedostot 0685 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0685 Tam Hel Maa Huh Tou Kes Hei Elo Syy Lok Mar Jou 0686 Jump to gallery beginning [home] 0686 Siirry gallerian alkuun [home] 0687 Jump to gallery end [end] 0687 Siirry gallerian loppuun [end] 0688 KEYBOARD ESCAPE KEY 0688 NÄPPÄIMISTÖN ESC-NÄPPÄIN 0689 KEYBOARD SHORTCUTS 0689 PIKANÄPPÄIMET 0690 KEYWORDS OVERVIEW 0690 KEYWORDIEN YLEISKATSAUS 0691 Keep 0691 Säilytä 0692 Kernel size 0692 Ytimen koko 0693 Keyboard Shortcuts 0693 Pikanäppäimet 0694 Keywords Category 0694 Keywordien kategoria 0695 Kill active dialog? 0695 Suljetaanko aktiivinen valintaikkuna? 0696 Kill busy function? 0696 Keskeytetäänkö käynnissä oleva toiminto? 0697 Kuwahara 0697 Kuwahara 0698 Kuwahara Depth 0698 Kuwahara-syvyys 0699 LINE COLOR 0699 VIIVAN VÄRI 0700 LOAD/SAVE AREA 0700 LATAA/TALLENNA ALUE 0701 LOCAL CONTRAST 0701 PAIKALLINEN KONTRASTI 0702 LOCAL RETINEX 0702 PAIKALLINEN RETINEX 0703 Language 0703 Kieli 0704 Layout and background image 0704 Asettelu ja taustakuva 0705 Left 0705 Vasen 0706 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0706 Vedä hiirtä vasemmalla alueen sisällä \nkumotaksesi alueen muokkaukset asteittain. \nVedä oikealla palauttaaksesi muokkaukset. \nVedä alueen reunaa pitkin sekoittaaksesi reunan. 0707 Left/right click: previous/next image (also arrow keys) 0707 Vasen/oikea klikkaus: edellinen/seuraava kuva (myös nuolinäppäimet) 0708 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0708 Vasen/oikea klikkaus: kumoa/tee uudelleen yksi muokkausvaihe \nKeskiklikkaus: palaa valittuun muokkausvaiheeseen 0709 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0709 Vasen/oikea klikkaus: zoomaa kuvaa/thumbnailia sisään/ulos (myös +/- näppäimet) 0710 Length 0710 Pituus 0711 Level 0711 Taso 0712 Licenses 0712 Lisenssit 0713 Light Source 0713 Valonlähde 0714 Lightness 0714 Vaaleus 0715 Limit 0715 Raja 0716 Line Color 0716 Viivan väri 0717 Line Threshold 0717 Viivan kynnysarvo 0718 Line Width 0718 Viivan leveys 0719 Line length 0719 Viivan pituus 0720 List Fotocx command line parameters 0720 Listaa Fotocxin komentorivin parametrit 0721 List all metadata for current image or clicked thumbnail 0721 Listaa kaikki metadata nykyiselle kuvalle tai klikatulle thumbnailille 0722 List outboard programs and functions 0722 Listaa ulkoiset ohjelmat ja toiminnot 0723 Load 0723 Lataa 0724 Load settings from file 0724 Lataa asetukset tiedostosta 0725 Local Contrast 0725 Paikallinen kontrasti 0726 Local Retinex 0726 Paikallinen Retinex 0727 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0727 Sijainti ja maa korvaavat nykyiset arvot.\nGPS-tiedot korvataan vain, jos uusi arvo on annettu. 0728 Lock 0728 Lukitse 0729 Low Amplify 0729 Vähäinen vahvistus 0730 MAGNIFY IMAGE 0730 SUURENNA KUVA 0731 MAKE WAVES 0731 LUO AALTOJA 0732 MANAGE KEYWORDS 0732 HALLITSE KEYWORDEJA 0733 MAP MENU 0733 KARTTAVALIKKO 0734 MAP VIEW 0734 KARTTANÄKYMÄ 0735 MARGINS 0735 MARGINAALIT 0736 MARKUP 0736 MERKINTÄ 0737 MASHUP 0737 MASHUP 0738 MATCH COLORS 0738 SOVITA VÄRIT 0739 MEASURE IMAGE 0739 MITTAA KUVA 0740 MENU SHORTCUTS 0740 VALIKON PIKANÄPPÄIMET 0741 METADATA MENU 0741 METADATAVALIKKO 0742 METADATA TAGS 0742 METADATA-TAGIT 0743 METADATA VIEW 0743 METADATANÄKYMÄ 0744 MONITOR COLOR 0744 NÄYTÖN VÄRI 0745 MOSAIC 0745 MOSAIIKKI 0746 MOUSE ALT-RIGHT-BUTTON 0746 HIIREN ALT+OIKEA-PAINIKE 0747 MOUSE FUNCTIONS 0747 HIIRITOIMINNOT 0748 MOUSE OWNERSHIP 0748 HIIREN OMISTAJUUS 0749 MOVE FOTOCX HOME 0749 SIIRRÄ FOTOCX-KOTI 0750 Magnify 0750 Suurenna 0751 Magnify Image 0751 Suurenna kuva 0752 Magnify image around the mouse position 0752 Suurenna kuvaa hiiren sijainnin ympäriltä 0753 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0753 Keskusmuisti on liian pieni Fotocxin ajamiseen. \nVoit yrittää silti halutessasi. \n Jatketaanko? 0754 Make Layout Image 0754 Luo asettelukuva 0755 Make Square Tiles 0755 Luo neliölaatat 0756 Make Waves 0756 Luo aaltoja 0757 Make a spherical projection of an image 0757 Luo pallomainen projektio kuvasta 0758 Make black margins transparent 0758 Tee mustista marginaaleista läpinäkyviä 0759 Make new versions 0759 Luo uusia versioita 0760 Make width constant for window size 0760 Pidä leveys vakiona ikkunan koolle 0761 Manage Keywords 0761 Hallitse keywordeja 0762 Map 0762 Kartta 0763 Map View 0763 Karttanäkymä 0764 Maps 0764 Kartat 0765 Maps: view images by map location 0765 Kartat: katsele kuvia karttasijainnin mukaan 0766 Margin 0766 Marginaali 0767 Margins 0767 Marginaalit 0768 Markup 0768 Merkintä 0769 Mashup 0769 Mashup 0770 Mass update album files 0770 Massapäivitä albumin tiedostot 0771 Match Brightness 0771 Sovita kirkkaus 0772 Match Colors 0772 Sovita värit 0773 Match Level 0773 Sovitustaso 0774 Match Limit 0774 Sovituksen raja 0775 Match image colors to colors of another image 0775 Sovita kuvan värit toisen kuvan väreihin 0776 Match using: 0776 Sovita käyttäen: 0777 Matching Keywords 0777 Vastaavat keywordit 0778 Max 0778 Maks 0779 Max. Width 0779 Maks. leveys 0780 Measure Image 0780 Mittaa kuva 0781 Measure Noise 0781 Mittaa kohina 0782 Measure pixel distances within an image 0782 Mittaa pikselietäisyyksiä kuvan sisällä 0783 Menu Colors 0783 Valikon värit 0784 Menu Style 0784 Valikon tyyli 0785 Metadata 0785 Metadata 0786 Metadata Tags 0786 Metadata-tagit 0787 Metadata View 0787 Metadatanäkymä 0788 Metadata from Search Function 0788 Hakutoiminnon metadata 0789 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0789 Menetelmä 1:\nVasen klikkaus punasilmään tummentaaksesi.\nMenetelmä 2:\nVedä alas ja oikealle ympäröidäksesi punasilmän.\nVasen klikkaus punasilmään tummentaaksesi.\nKumoa punasilmäisyys:\nOikea klikkaus punasilmään. 0790 Mirror: 0790 Peilaa: 0791 Mode: 0791 Tila: 0792 Monitor Color 0792 Näytön väri 0793 Mosaic 0793 Mosaiikki 0794 Mouse Radius 0794 Hiiren säde 0795 Mouse Warp (drag image) 0795 Hiirivääristys (vedä kuvaa) 0796 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0796 Hiiren veto: panoroi kuvaa 360° \nVasen/oikea hiiriklikkaus: zoomaa sisään/ulos \nEscape: sulje panoraamanäkymä 0797 Move %d image files 0797 Siirrä %d kuvatiedostoa 0798 Move Fotocx Home 0798 Siirrä Fotocx-koti 0799 Move Fotocx Home Folder 0799 Siirrä Fotocx-kotikansio 0800 Move Fotocx home folder to chosen folder 0800 Siirrä Fotocx-kotikansio valittuun kansioon 0801 Move mouse in a monotone image area. 0801 Siirrä hiirtä yksivärisellä kuva-alueella. 0802 Multiplier 0802 Kerroin 0803 NEW SESSION 0803 UUSI ISTUNTO 0804 NEWEST FILES 0804 UUSIMMAT TIEDOSTOT 0805 NEWLINE CHARACTERS IN METADATA 0805 RIVINVAIHTOMERKIT METADATASSA 0806 NON-STANDARD DIALOG WIDGETS 0806 EI-STANDARDIT VALINTAIKKUNAN WIDGETIT 0807 New Area 0807 Uusi alue 0808 New File Name: 0808 Uusi tiedostonimi: 0809 New Location 0809 Uusi sijainti 0810 New Location: 0810 Uusi sijainti: 0811 New Name 0811 Uusi nimi 0812 New Session 0812 Uusi istunto 0813 New Type: 0813 Uusi tyyppi: 0814 New Version 0814 Uusi versio 0815 Newest 0815 Uusin 0816 Newest Files 0816 Uusimmat tiedostot 0817 Next 0817 Seuraava 0818 Next gallery 0818 Seuraava galleria 0819 No 0819 Ei 0820 No curve lines found 0820 Käyräviivoja ei löytynyt 0821 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0821 Kuvatiedostoindeksiä ei löytynyt.\nKuvatiedostoindeksi luodaan.\nKuvatiedostojasi ei muuteta.\nTämä voi kestää huomattavan kauan, jos \nsinulla on useita tuhansia kuvatiedostoja. 0822 No images found 0822 Kuvia ei löytynyt 0823 Noise Reduction 0823 Kohinan vähennys 0824 Noise Size 0824 Kohinan koko 0825 None 0825 Ei mitään 0826 Normal Blur 0826 Normaali sumennus 0827 Normal Blur - mix pixels with all neighbor pixels 0827 Normaali sumennus - sekoita pikselit kaikkien naapuripikselien kanssa 0828 OPEN IMAGE FILE 0828 AVAA KUVATIEDOSTO 0829 OTHER TOPICS 0829 MUUT AIHEET 0830 OUTLINES 0830 ÄÄRIVIIVAT 0831 Old Name 0831 Vanha nimi 0832 One Tag: 0832 Yksi tag: 0833 Opacity 0833 Peittävyys 0834 Open 0834 Avaa 0835 Open Image File 0835 Avaa kuvatiedosto 0836 Open a file and paste as selected area into an image 0836 Avaa tiedosto ja liitä se valittuna alueena kuvaan 0837 Open a parallel Fotocx session 0837 Avaa rinnakkainen Fotocx-istunto 0838 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0838 Avaa ja muokkaa skannattua värikarttatiedostoa. \nPoista skannauksesta johtuva vinous tai kierto. \n(Käytä tähän toimintoa Korjaa perspektiivi). \nLeikkaa ohut vihreä marginaali TARKASTI pois. \nTallenna (korvaa) värikarttatiedosto. 0839 Open the trimmed color chart file 0839 Avaa rajattu värikarttatiedosto 0840 Optimize 0840 Optimoi 0841 Other Tag ... 0841 Muu tag ... 0842 Outboard Programs 0842 Ulkoiset ohjelmat 0843 Outline Drawing 0843 Ääriviivapiirros 0844 Outlines 0844 Ääriviivat 0845 Output Color 0845 Tulostusväri 0846 Overlap 0846 Päällekkäisyys 0847 Overlay position in host image: 0847 Peitekuvan sijainti isäntäkuvassa: 0848 Overlay width, % host image width: 0848 Peitekuvan leveys, % isäntäkuvan leveydestä: 0849 Overwrite file? \n%s 0849 Korvataanko tiedosto? \n%s 0850 PAINT EDITS 0850 MAALAUSMUOKKAUKSET 0851 PAINT IMAGE 0851 MAALAA KUVA 0852 PAINT TRANSPARENCY 0852 MAALAA LÄPINÄKYVYYS 0853 PAINTING 0853 MAALAUS 0854 PANORAMA 0854 PANORAAMA 0855 PATTERN 0855 KUVIO 0856 PERSPECTIVE 0856 PERSPEKTIIVI 0857 PLACES/DATES 0857 PAIKAT/PÄIVÄMÄÄRÄT 0858 PLUGINS 0858 LISÄOSAT 0859 PREV/NEXT 0859 EDELLINEN/SEURAAVA 0860 PRINT CALIBRATED 0860 TULOSTA KALIBROITUNA 0861 PRINT IMAGE 0861 TULOSTA KUVA 0862 PRIVACY 0862 TIETOSUOJA 0863 PROBLEM FILES 0863 ONGELMATIEDOSTOT 0864 PROBLEM REPORTING 0864 ONGELMISTA ILMOITTAMINEN 0865 Paint Edits 0865 Maalausmuokkaukset 0866 Paint Edits already active 0866 Maalausmuokkaukset on jo käytössä 0867 Paint Image 0867 Maalaa kuva 0868 Paint Image Transparencies 0868 Maalaa kuvan läpinäkyvyydet 0869 Paint Radius 0869 Maalauksen säde 0870 Paint Transparency 0870 Maalaa läpinäkyvyys 0871 Paint and Warp Image 0871 Maalaa ja vääristä kuva 0872 Paint current edit function gradually using the mouse 0872 Maalaa nykyinen muokkaustoiminto asteittain hiirellä 0873 Paint entire image 0873 Maalaa koko kuva 0874 Paint image transparency using the mouse 0874 Maalaa kuvan läpinäkyvyyttä hiirellä 0875 Paint on Image 0875 Maalaa kuvaan 0876 Paint on image using the mouse 0876 Maalaa kuvaan hiirellä 0877 Paint transparency 0877 Maalaa läpinäkyvyys 0878 Paint within mouse 0878 Maalaa hiiren kohdalla 0879 Painting 0879 Maalaus 0880 Panorama 0880 Panoraama 0881 Paste 0881 Liitä 0882 Paste Image 0882 Liitä kuva 0883 Paste previously copied area into image 0883 Liitä aiemmin kopioitu alue kuvaan 0884 Pattern 0884 Kuvio 0885 Pattern File: 0885 Kuviotiedosto: 0886 Pattern Width 0886 Kuvion leveys 0887 Percent 0887 Prosentti 0888 Permissions 0888 Käyttöoikeudet 0889 Perspective 0889 Perspektiivi 0890 Photo Date/Time 0890 Kuvan päivämäärä/aika 0891 Photo Date/Time (metadata) 0891 Kuvan päivämäärä/aika (metadata) 0892 Photo Date: %s File Date: %s \n 0892 Kuvan pvm: %s Tiedoston pvm: %s \n 0893 Pixel count 0893 Pikselimäärä 0894 Pixel difference 0894 Pikseliero 0895 Pixels 0895 Pikselit 0896 Places/Dates 0896 Paikat/päivämäärät 0897 Plugin working ... 0897 Lisäosa käynnissä ... 0898 Popup Image 0898 Ponnahduskuva 0899 Power 0899 Teho 0900 Power Center 0900 Tehon keskipiste 0901 Power: Center 0901 Teho: keskipiste 0902 Pre-align Images 0902 Esikohdista kuvat 0903 Preference: 0903 Asetus: 0904 Press F1 for help 0904 Paina F1 saadaksesi ohjeen 0905 Prev 0905 Edellinen 0906 Prev/Next 0906 Edellinen/seuraava 0907 Previous 0907 Edellinen 0908 Previous gallery 0908 Edellinen galleria 0909 Print Calibrated 0909 Tulosta kalibroituna 0910 Print Image 0910 Tulosta kuva 0911 Print chart in vertical orientation without margins. 0911 Tulosta kaavio pystysuunnassa ilman marginaaleja. 0912 Print current image file with calibrated colors 0912 Tulosta nykyinen kuvatiedosto kalibroiduilla väreillä 0913 Print the current image file 0913 Tulosta nykyinen kuvatiedosto 0914 Privacy 0914 Tietosuoja 0915 Proceed 0915 Jatka 0916 Proceed? 0916 Jatketaanko? 0917 Process album files matching selected files: 0917 Käsittele albumin tiedostot, jotka vastaavat valittuja tiedostoja: 0918 Process an image using a custom convolution kernel 0918 Käsittele kuva mukautetulla konvoluutioytimellä 0919 Process selected album files: 0919 Käsittele valitut albumin tiedostot: 0920 Processing files 0920 Käsitellään tiedostoja 0921 Project name 0921 Projektin nimi 0922 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0922 Vedä kuvan sijaintia hiirellä. \nTee useita hiirivetoja kunnes olet tyytyväinen. \nKun olet valmis, paina [OK]. 0923 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0923 Vedä kuvan kulmaa hiirellä. \nTee useita hiirivetoja kunnes olet tyytyväinen. \nKun olet valmis, paina [OK]. 0924 Pull on the image with the mouse. 0924 Vedä kuvaa hiirellä. 0925 Purge unwanted keywords from all image files 0925 Poista ei-toivotut keywordit kaikista kuvatiedostoista 0926 QUESTIONS, SUGGESTIONS 0926 KYSYMYKSET, EHDOTUKSET 0927 Quit 0927 Lopeta 0928 Quit Fotocx 0928 Sulje Fotocx 0929 Quit Fotocx? 0929 Suljetaanko Fotocx? 0930 RAW Files 0930 RAW-tiedostot 0931 RAW Options 0931 RAW-asetukset 0932 RAW conversion failed: %s %s 0932 RAW-muunnos epäonnistui: %s %s 0933 RAW loader 0933 RAW-lataaja 0934 RECENT FILES 0934 VIIMEAIKAISET TIEDOSTOT 0935 RECENT FOLDERS 0935 VIIMEAIKAISET KANSIOT 0936 RED EYES 0936 PUNASILMÄT 0937 REFINE MENU 0937 HIENOSÄÄTÖVALIKKO 0938 REMOVE DUST 0938 POISTA PÖLY 0939 REMOVE HALO 0939 POISTA HALO 0940 RENAME 0940 NIMEÄ UUDELLEEN 0941 RENAME ALBUM 0941 NIMEÄ ALBUMI UUDELLEEN 0942 REPAIR MENU 0942 KORJAUSVALIKKO 0943 RESCALE 0943 SKAALAA 0944 RETOUCH 0944 RETUSOI 0945 RGB -> BRG 0945 RGB -> BRG 0946 RGB -> GBR 0946 RGB -> GBR 0947 RGB HISTOGRAM 0947 RGB-HISTOGRAMMI 0948 RGB Histogram 0948 RGB-histogrammi 0949 RGB brightness histogram graph 0949 RGB-kirkkaushistogrammikaavio 0950 RGB color 0950 RGB-väri 0951 RGB mix with given bit-depth 0951 RGB-sekoitus annetulla bittisyvyydellä 0952 ROTATE 0952 KIERRÄ 0953 RUN SCRIPT 0953 SUORITA SKRIPTI 0954 Radial Blur 0954 Säteittäinen sumennus 0955 Radial Blur - mix pixels in radial lines from chosen center 0955 Säteittäinen sumennus - sekoita pikselit säteittäisillä viivoilla valitusta keskipisteestä 0956 Radius 0956 Säde 0957 Random Image 0957 Satunnainen kuva 0958 Range 0958 Alue 0959 Rating: %s Size: %s %.2fmb \n 0959 Arvostelu: %s Koko: %s %.2fmb \n 0960 Read or search the user guide 0960 Lue tai hae käyttöoppaasta 0961 Recent Files 0961 Viimeaikaiset tiedostot 0962 Recent Folders 0962 Viimeaikaiset kansiot 0963 Recent Keywords 0963 Viimeaikaiset keywordit 0964 Rectify closeup face photo (balloon face) 0964 Oikaise lähikuva kasvoista (pallomainen vääristymä) 0965 Red 0965 Punainen 0966 Red Eye Reduction 0966 Punasilmäisyyden vähennys 0967 Red Eyes 0967 Punasilmät 0968 Red Factors 0968 Punaisen kertoimet 0969 Redo 0969 Tee uudelleen 0970 Reduce Fog/Haze 0970 Vähennä sumua/usvaa 0971 Reduce fog/haze in an image or selected areas 0971 Vähennä sumua/usvaa kuvassa tai valituilla alueilla 0972 Refine 0972 Hienosäädä 0973 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0973 Hienosäätö: tasoita histogrammi, paikallinen kontrasti, vahvista kontrastia, retinex, kylläisyys 0974 Remove 0974 Poista 0975 Remove Dust 0975 Poista pöly 0976 Remove Halo 0976 Poista halo 0977 Remove dust spots from old scanned photos 0977 Poista pölypilkkuja vanhoista skannatuista valokuvista 0978 Remove from Album 0978 Poista albumista 0979 Remove halos left by some edit functions 0979 Poista joidenkin muokkaustoimintojen jättämät halot 0980 Remove image curvature, especially in panoramas 0980 Poista kuvan kaarevuus, erityisesti panoraamoissa 0981 Remove jaggies on hard image feature edges 0981 Poista sahalaitaisuus terävien kuvapiirteiden reunoilta 0982 Remove selected image metadata 0982 Poista valitun kuvan metadata 0983 Remove unwanted objects in an image 0983 Poista ei-toivottuja kohteita kuvasta 0984 Rename 0984 Nimeä uudelleen 0985 Rename Album 0985 Nimeä albumi uudelleen 0986 Rename Image File 0986 Nimeä kuvatiedosto uudelleen 0987 Rename an existing album 0987 Nimeä olemassa oleva albumi uudelleen 0988 Rename or delete keywords for all image files 0988 Nimeä uudelleen tai poista keywordit kaikista kuvatiedostoista 0989 Rename to 0989 Nimeä uudelleen nimelle 0990 Rename/convert/rescale/move selected image or RAW files 0990 Nimeä uudelleen/muunna/skaalaa/siirrä valitut kuva- tai RAW-tiedostot 0991 Repair 0991 Korjaa 0992 Repair malformed metadata preventing metadata edits 0992 Korjaa virheellinen metadata, joka estää metadatan muokkaamisen 0993 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 0993 Korjaus: terävöitä, sumenna, poista kohina, poista sumu, punasilmät, älykäs poisto, säädä väriä 0994 Replace 0994 Korvaa 0995 Replace Text 0995 Korvaa teksti 0996 Replace all versions with newest version 0996 Korvaa kaikki versiot uusimmalla versiolla 0997 Replace all versions with selected versions 0997 Korvaa kaikki versiot valituilla versioilla 0998 Replace all with newest version only 0998 Korvaa kaikki vain uusimmalla versiolla 0999 Replace all with original + newest version 0999 Korvaa kaikki alkuperäisellä + uusimmalla versiolla 1000 Replace all with original + selected versions 1000 Korvaa kaikki alkuperäisellä + valituilla versioilla 1001 Replace all with original and all versions 1001 Korvaa kaikki alkuperäisellä ja kaikilla versioilla 1002 Replace all with selected versions 1002 Korvaa kaikki valituilla versioilla 1003 Replace host files 1003 Korvaa isäntätiedostot 1004 Report Image Places/Dates 1004 Raportoi kuvien paikat/päivämäärät 1005 Report selected metadata for selected image files 1005 Raportoi valittu metadata valituille kuvatiedostoille 1006 Rescale 1006 Skaalaa 1007 Rescale Image 1007 Skaalaa kuva 1008 Rescale RGB levels to reduce color caste and fog/haze 1008 Skaalaa RGB-tasot vähentääksesi värivinoumaa ja sumua/usvaa 1009 Rescale brightness levels to increase local contrast 1009 Skaalaa kirkkaustasot paikallisen kontrastin lisäämiseksi 1010 Rescale: 1010 Skaalaa: 1011 Reserved Shortcuts \n 1011 Varatut pikanäppäimet \n 1012 Reserved shortcut ignored: %s 1012 Varattu pikanäppäin ohitettu: %s 1013 Reset 1013 Nollaa 1014 Reset all galleries to file name ascending 1014 Nollaa kaikki galleriat tiedostonimen mukaan nousevaan järjestykseen 1015 Resolution 1015 Resoluutio 1016 Resources 1016 Resurssit 1017 Resume 1017 Jatka 1018 Retouch 1018 Retusoi 1019 Reverse R 1019 Käänteinen R 1020 Richardson-Lucy 1020 Richardson-Lucy 1021 Right 1021 Oikea 1022 Rim % 1022 Reunus % 1023 Rotate 1023 Kierrä 1024 Rotate Image 1024 Kierrä kuvaa 1025 Rotate or level an image 1025 Kierrä tai suorista kuva 1026 Rotate: 1026 Kierrä: 1027 Roy Lichtenstein effect 1027 Roy Lichtenstein -tehoste 1028 SATURATION 1028 KYLLÄISYYS 1029 SCRIPT FILES 1029 SKRIPTITIEDOSTOT 1030 SEARCH IMAGES 1030 HAE KUVIA 1031 SELECT AREA 1031 VALITSE ALUE 1032 SELECT FILES 1032 VALITSE TIEDOSTOT 1033 SELECT IMAGE FILES 1033 VALITSE KUVATIEDOSTOT 1034 SELECT MENU 1034 VALINTAVALIKKO 1035 SET COLORS 1035 ASETA VÄRIT 1036 SET WALLPAPER 1036 ASETA TAUSTAKUVA 1037 SETTINGS 1037 ASETUKSET 1038 SHARPEN 1038 TERÄVÖITÄ 1039 SHIFT COLORS 1039 SIIRRÄ VÄREJÄ 1040 SHORTCUTS 1040 PIKANÄPPÄIMET 1041 SHOW CIM FILES 1041 NÄYTÄ CIM-TIEDOSTOT 1042 SHOW DIFFS 1042 NÄYTÄ EROT 1043 SHOW ON MAP 1043 NÄYTÄ KARTALLA 1044 SHOW RESOURCES 1044 NÄYTÄ RESURSSIT 1045 SHOW RGB 1045 NÄYTÄ RGB 1046 SHOW/HIDE AREA 1046 NÄYTÄ/PIILOTA ALUE 1047 SKETCH1 1047 LUONNOS1 1048 SKETCH2 1048 LUONNOS2 1049 SLIDE SHOW 1049 DIAESITYS 1050 SLIDES AND NEGATIVES 1050 DIAT JA NEGATIIVIT 1051 SLIDESHOW END 1051 DIAESITYKSEN LOPPU 1052 SMART ERASE 1052 ÄLYKÄS POISTO 1053 SOFT FOCUS 1053 PEHMEÄ FOKUS 1054 SPHERE 1054 PALLO 1055 SPLIT-SCREEN 1055 JAETTU NÄYTTÖ 1056 STACK/LAYERS 1056 PINO/TASOT 1057 STACK/NOISE 1057 PINO/KOHINA 1058 STACK/PAINT 1058 PINO/MAALAUS 1059 Saturation 1059 Kylläisyys 1060 Save 1060 Tallenna 1061 Save Gallery as Album 1061 Tallenna galleria albumiksi 1062 Save Image File 1062 Tallenna kuvatiedosto 1063 Save as new file name or type 1063 Tallenna uudella tiedostonimellä tai -tyypillä 1064 Save current gallery as album 1064 Tallenna nykyinen galleria albumiksi 1065 Save modified image as new file or new file version 1065 Tallenna muokattu kuva uutena tiedostona tai uutena tiedostoversiona 1066 Save selected area to a file with transparency 1066 Tallenna valittu alue tiedostoon läpinäkyvyyden kanssa 1067 Saved Areas 1067 Tallennetut alueet 1068 Scale 1068 Skaala 1069 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1069 Skannaa tulostettu värikartta, tummin rivi ylimpänä. \nTallenna .png-tiedostona käyttäen tulostimen ja paperin nimiä \n(esim. %s/Epson_glossy.png). \n 1070 Search 1070 Hae 1071 Search Images 1071 Hae kuvia 1072 Search Results 1072 Hakutulokset 1073 Search all image files and report duplicates 1073 Hae kaikista kuvatiedostoista ja raportoi kaksoiskappaleet 1074 Searching - use ESC key to terminate 1074 Haetaan - lopeta ESC-näppäimellä 1075 Seconds 1075 Sekuntia 1076 Select 1076 Valitse 1077 Select %d to %d files 1077 Valitse %d - %d tiedostoa 1078 Select Album 1078 Valitse albumi 1079 Select Albums 1079 Valitse albumeja 1080 Select Area 1080 Valitse alue 1081 Select Area for Edits 1081 Valitse alue muokkauksia varten 1082 Select Area not supported \nby this edit function 1082 Valitse alue ei ole tuettu \ntällä muokkaustoiminnolla 1083 Select Files 1083 Valitse tiedostot 1084 Select Image 1084 Valitse kuva 1085 Select Image Files 1085 Valitse kuvatiedostot 1086 Select Metadata tags 1086 Valitse metadata-tagit 1087 Select Script 1087 Valitse skripti 1088 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1088 Valitse vääristettävä alue Valitse alue -toiminnolla. \nPaina [aloita vääristys] ja vedä aluetta hiirellä. \nTee useita hiirivetoja kunnes olet tyytyväinen. \nKun olet valmis, valitse toinen alue tai paina [OK]. 1089 Select and Paint Image 1089 Valitse ja maalaa kuva 1090 Select and view an image file 1090 Valitse ja katsele kuvatiedosto 1091 Select area cannot be kept.\nContinue? 1091 Valittua aluetta ei voida säilyttää.\nJatketaanko? 1092 Select area disabled, Continue? 1092 Alueen valinta pois käytöstä, jatketaanko? 1093 Select area not finished, Continue? 1093 Alueen valinta ei ole valmis, jatketaanko? 1094 Select area will be ignored. \nContinue? 1094 Alueen valinta ohitetaan. \nJatketaanko? 1095 Select folder 1095 Valitse kansio 1096 Select host image files 1096 Valitse isäntäkuvatiedostot 1097 Select image areas to edit separately, copy/paste selections 1097 Valitse kuva-alueita muokattavaksi erikseen, kopioi/liitä valinnat 1098 Select image objects or areas for separate editing 1098 Valitse kuvan kohteita tai alueita erilliseen muokkaukseen 1099 Select input files for subsequent function 1099 Valitse syötetiedostot seuraavaa toimintoa varten 1100 Select overlay file 1100 Valitse peitekuvatiedosto 1101 Select startup album 1101 Valitse käynnistysalbumi 1102 Select startup folder 1102 Valitse käynnistyskansio 1103 Select startup image file 1103 Valitse käynnistyskuvatiedosto 1104 Select the image file to print. 1104 Valitse tulostettava kuvatiedosto. 1105 Select to add, click on X to delete. 1105 Valitse lisätäksesi, klikkaa X poistaaksesi. 1106 Select two files 1106 Valitse kaksi tiedostoa 1107 Select versions, ratings, keywords, filename text 1107 Valitse versiot, arvostelut, keywordit, tiedostonimen teksti 1108 Separation Horz 1108 Vaakaerotus 1109 Sequence Numbers 1109 Järjestysnumerot 1110 Set Colors 1110 Aseta värit 1111 Set No. of Colors 1111 Aseta värien määrä 1112 Set Ratio: 1112 Aseta suhde: 1113 Set Wallpaper 1113 Aseta taustakuva 1114 Set Width: 1114 Aseta leveys: 1115 Set and view bookmarks, select for gallery view 1115 Aseta ja katsele kirjanmerkkejä, valitse gallerianäkymää varten 1116 Set black-white/color, negative/positive, sepia 1116 Aseta mustavalko/väri, negatiivi/positiivi, seepia 1117 Set foreground line color (crop, grid, select, warp) 1117 Aseta etualan viivan väri (rajaus, ruudukko, valinta, vääristys) 1118 Set gallery from latest search results 1118 Aseta galleria viimeisimmistä hakutuloksista 1119 Set gallery from recent folders list 1119 Aseta galleria viimeaikaisten kansioiden listasta 1120 Set gallery to folder of current file 1120 Aseta galleria nykyisen tiedoston kansioon 1121 Set horizontal/vertical grid line counts 1121 Aseta vaaka-/pystyruudukon viivamäärät 1122 Set image file as desktop wallpaper 1122 Aseta kuvatiedosto työpöydän taustakuvaksi 1123 Set line properties, [Add] to layout, edit. 1123 Aseta viivan ominaisuudet, [Lisää] asetteluun, muokkaa. 1124 Set number of colors for each R/G/B or total 1124 Aseta värien määrä kullekin R/G/B:lle tai yhteensä 1125 Set or shift photo date/time for selected image files 1125 Aseta tai siirrä kuvan päivämäärää/aikaa valituille kuvatiedostoille 1126 Set the name for the output calibration file \n[your calibration name].dat 1126 Aseta tulostuskalibrointitiedoston nimi \n[kalibrointinimesi].dat 1127 Settings 1127 Asetukset 1128 Sharpen 1128 Terävöitä 1129 Sharpen the image (various methods) 1129 Terävöitä kuva (eri menetelmillä) 1130 Shift + drag mouse across image \nto indicate blur direction 1130 Shift + vedä hiirtä kuvan poikki \nosoittaaksesi sumennuksen suunnan 1131 Shift Colors 1131 Siirrä värejä 1132 Shift/convert image colors into other colors 1132 Siirrä/muunna kuvan värit toisiksi väreiksi 1133 Short List 1133 Lyhyt luettelo 1134 Show 1134 Näytä 1135 Show (outline) selected areas 1135 Näytä (ääriviivoina) valitut alueet 1136 Show CIM Files 1136 Näytä CIM-tiedostot 1137 Show Diffs 1137 Näytä erot 1138 Show Fotocx installed version and author contact 1138 Näytä asennettu Fotocx-versio ja tekijän yhteystiedot 1139 Show Fotocx updates for recent releases 1139 Näytä Fotocxin päivitykset viimeaikaisille julkaisuille 1140 Show Hidden 1140 Näytä piilotetut 1141 Show Log File 1141 Näytä lokitiedosto 1142 Show RGB 1142 Näytä RGB 1143 Show RGB levels at mouse position 1143 Näytä RGB-tasot hiiren sijainnissa 1144 Show Resources 1144 Näytä resurssit 1145 Show folder hierarchy, click folder for gallery view 1145 Näytä kansiohierarkia, klikkaa kansiota gallerianäkymää varten 1146 Show image counts in year/month table, select, report 1146 Näytä kuvamäärät vuosi/kuukausi-taulukossa, valitse, raportoi 1147 Show image description (overlap) 1147 Näytä kuvan kuvaus (päällekkäin) 1148 Show image differences on the image 1148 Näytä kuvien erot kuvassa 1149 Show image file name (overlap) 1149 Näytä kuvatiedoston nimi (päällekkäin) 1150 Show image title (overlap) 1150 Näytä kuvan otsikko (päällekkäin) 1151 Show input files used in combine function 1151 Näytä yhdistämistoiminnossa käytetyt syötetiedostot 1152 Show key metadata for current image or clicked thumbnail 1152 Näytä keskeinen metadata nykyiselle kuvalle tai klikatulle thumbnailille 1153 Show map position of the current image file 1153 Näytä nykyisen kuvatiedoston sijainti kartalla 1154 Show memory and CPU resources used 1154 Näytä käytetty muisti ja CPU-resurssit 1155 Show on Map 1155 Näytä kartalla 1156 Show or make Keyboard Shortcuts 1156 Näytä tai luo pikanäppäimet 1157 Show the current (last used) album 1157 Näytä nykyinen (viimeksi käytetty) albumi 1158 Show the current log file 1158 Näytä nykyinen lokitiedosto 1159 Size 1159 Koko 1160 Sketch1 1160 Luonnos1 1161 Sketch2 1161 Luonnos2 1162 Slide Show 1162 Diaesitys 1163 Smart Erase 1163 Älykäs poisto 1164 Soft Focus 1164 Pehmeä fokus 1165 Sphere 1165 Pallo 1166 Spherical Projection 1166 Pallomainen projektio 1167 Split-Screen 1167 Jaettu näyttö 1168 Stack/Layers 1168 Pino/tasot 1169 Stack/Noise 1169 Pino/kohina 1170 Stack/Paint 1170 Pino/maalaus 1171 Stacking Order 1171 Pinoamisjärjestys 1172 Start 1172 Aloita 1173 Start a slide show 1173 Aloita diaesitys 1174 Start of gallery 1174 Gallerian alku 1175 Startup View 1175 Käynnistysnäkymä 1176 Stop 1176 Pysäytä 1177 Stretch 1177 Venytä 1178 Stretch: 1178 Venytä: 1179 Suppress JPEG compression artifacts 1179 Vaimenna JPEG-pakkausartefaktit 1180 Suppress Ringing 1180 Vaimenna rengasilmiö 1181 Suppress fine details while retaining sharpness 1181 Vaimenna hienoja yksityiskohtia säilyttäen terävyys 1182 Suppress noise from low-light photos 1182 Vaimenna kohinaa hämärissä valokuvissa 1183 Survey all files 1183 Kartoita kaikki tiedostot 1184 TEXTURE 1184 TEKSTUURI 1185 THUMB VIEW 1185 THUMB-NÄKYMÄ 1186 TILES1 1186 LAATAT1 1187 TILES2 1187 LAATAT2 1188 TIMELINE 1188 AIKAJANA 1189 TINY PLANET 1189 PIKKUPLANEETTA 1190 TOOLS MENU 1190 TYÖKALUVALIKKO 1191 TRANSLATIONS 1191 KÄÄNNÖKSET 1192 TWIST 1192 KIERTO 1193 Temperature 1193 Lämpötila 1194 Text 1194 Teksti 1195 Text File: 1195 Tekstitiedosto: 1196 Texture 1196 Tekstuuri 1197 Threshold 1197 Kynnysarvo 1198 Threshold: Low 1198 Kynnysarvo: matala 1199 Thumbnail View 1199 Thumbnail-näkymä 1200 Thumbnail size 1200 Thumbnailin koko 1201 Thumbnails folder 1201 Thumbnails-kansio 1202 Thumbnails folder: %s \nPlease remove. 1202 Thumbnails-kansio: %s \nPoista se. 1203 Thumbnails folder: \n %s \nmust be named .../thumbnails 1203 Thumbnails-kansio: \n %s \non nimettävä .../thumbnails 1204 Thumbnails: 1204 Thumbnailit: 1205 Tile 1205 Laatta 1206 Tile blending 1206 Laattojen sekoitus 1207 Tile image with a repeating pattern 1207 Laatoita kuva toistuvalla kuviolla 1208 Tiles 1208 Laatat 1209 Tiles1 1209 Laatat1 1210 Tiles2 1210 Laatat2 1211 Timeline 1211 Aikajana 1212 Tiny Planet 1212 Pikkuplaneetta 1213 Title: %s\n 1213 Otsikko: %s\n 1214 To Location 1214 Kohdesijaintiin 1215 Toggle Captions 1215 Vaihda kuvatekstit 1216 Toggle Grid 1216 Vaihda ruudukko 1217 Toggle grid lines on and off 1217 Kytke ruudukon viivat päälle/pois 1218 Toggle image metadata display ON/OFF 1218 Kytke kuvan metadatan näyttö PÄÄLLE/POIS 1219 Too little overlap, cannot align 1219 Liian vähän päällekkäisyyttä, ei voida kohdistaa 1220 Too many edits, please save image 1220 Liian monta muokkausta, tallenna kuva 1221 Tools 1221 Työkalut 1222 Tools: image index, settings, shortcuts, grid, find duplicates 1222 Työkalut: kuvaindeksi, asetukset, pikanäppäimet, ruudukko, etsi kaksoiskappaleet 1223 Top 1223 Ylä 1224 Total Colors 1224 Värien kokonaismäärä 1225 Trace 1225 Jäljitä 1226 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1226 Jäljitä ylä- ja alakäyrät \nhiiriklikkauksilla, sitten [tasoita]. 1227 Transient Objects 1227 Väliaikaiset kohteet 1228 Transition Preferences 1228 Siirtymäasetukset 1229 Transition to next image 1229 Siirtymä seuraavaan kuvaan 1230 Transitions File 1230 Siirtymätiedosto 1231 Transp. 1231 Läpin. 1232 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1232 Läpinäkyvyyskartta menetetään \n(tallenna TIFF|PNG|JXL-muodossa säilyttääksesi) \nTallennetaanko silti? 1233 Trash 1233 Roskakori 1234 Trash read-only file? 1234 Siirretäänkö kirjoitussuojattu tiedosto roskakoriin? 1235 Turn an image inside-out 1235 Käännä kuva sisäpuoli ulos 1236 Twist 1236 Kierto 1237 Twist image centered at mouse position 1237 Kierrä kuvaa hiiren sijainnin ympäri 1238 UNBEND 1238 OIKAISE 1239 UNDO/REDO BUTTON 1239 KUMOA/TEE UUDELLEEN -PAINIKE 1240 UNWARP CLOSEUP 1240 POISTA LÄHIKUVAN VÄÄRISTYMÄ 1241 UPDATE ALBUMS 1241 PÄIVITÄ ALBUMIT 1242 UPRIGHT 1242 OIKAISU 1243 USER GUIDE 1243 KÄYTTÖOPAS 1244 Unable to copy metadata 1244 Metadataa ei voitu kopioida 1245 Unbend 1245 Oikaise 1246 Undo 1246 Kumoa 1247 Undo All 1247 Kumoa kaikki 1248 Undo Last 1248 Kumoa viimeisin 1249 Undo/Redo 1249 Kumoa/tee uudelleen 1250 Uninstall 1250 Poista asennus 1251 Unwarp Closeup 1251 Poista lähikuvan vääristymä 1252 Update Albums 1252 Päivitä albumit 1253 Update albums for new file versions 1253 Päivitä albumit uusia tiedostoversioita varten 1254 Upright 1254 Oikaisu 1255 Upright Image 1255 Oikaise kuva 1256 Upright or mirror-flip an image 1256 Oikaise tai peilaa kuva 1257 Upright rotated image files, selected set or ALL 1257 Oikaise kierretyt kuvatiedostot, valittu joukko tai KAIKKI 1258 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1258 Käytä Valitse alue -toimintoa valitaksesi kasvot. \nKlikkaa vääristymän keskikohtaa. \nSiirrä liukusäädintä. \n 1259 Use [Select] to add files to an empty album 1259 Käytä [Valitse] lisätäksesi tiedostoja tyhjään albumiin 1260 Use metadata photo date or file modification date? 1260 Käytetäänkö metadatan kuvan päivämäärää vai tiedoston muutospäivää? 1261 Use metadata tag 1261 Käytä metadata-tagia 1262 Use settings file 1262 Käytä asetustiedostoa 1263 User Guide 1263 Käyttöopas 1264 User preferences and settings 1264 Käyttäjän asetukset ja preferenssit 1265 VIDEO press P to play 1265 VIDEO paina P toistaaksesi 1266 VIEW 360° PANO 1266 KATSELE 360° PANORAAMAA 1267 VIEW ALL META 1267 KATSELE KAIKKEA METADATAA 1268 VIEW MAIN META 1268 KATSELE PÄÄMETADATAA 1269 VIGNETTE 1269 VINJETTI 1270 Var. Transparency 1270 Vaihteleva läpinäkyvyys 1271 Vert 1271 Pysty 1272 Video Files 1272 Videotiedostot 1273 Video Tutorial 1273 Videokoulutus 1274 Video command 1274 Videokomento 1275 View 360 degree panorama image 1275 Katsele 360 asteen panoraamakuvaa 1276 View 360° Pano 1276 Katsele 360° panoraamaa 1277 View All Meta 1277 Katsele kaikkea metadataa 1278 View All Metadata 1278 Katsele kaikkea metadataa 1279 View Main Meta 1279 Katsele päämetadataa 1280 View Main Metadata 1280 Katsele päämetadataa 1281 View before/after images using split-screen 1281 Katsele ennen/jälkeen-kuvia jaetulla näytöllä 1282 View/edit metadata, image report and search functions 1282 Katsele/muokkaa metadataa, kuvaraportti- ja hakutoimintoja 1283 Vignette 1283 Vinjetti 1284 W/H Ratio: 1284 L/K-suhde: 1285 WARP AFFINE 1285 AFFIININEN VÄÄRISTYS 1286 WARP AREA 1286 VÄÄRISTÄ ALUE 1287 WARP CURVED 1287 KAAREVA VÄÄRISTYS 1288 WARP IMAGE 1288 VÄÄRISTÄ KUVA 1289 WARP MENU 1289 VÄÄRISTYSVALIKKO 1290 WARP RADIAL 1290 SÄTEITTÄINEN VÄÄRISTYS 1291 WINDOW VIEWS AND MENUS 1291 IKKUNANÄKYMÄT JA VALIKOT 1292 WORLD MAP 1292 MAAILMANKARTTA 1293 Wait after zoom 1293 Odota zoomin jälkeen 1294 Wait before filename/title/description 1294 Odota ennen tiedostonimeä/otsikkoa/kuvausta 1295 Wait before zoom 1295 Odota ennen zoomia 1296 Warp 1296 Vääristä 1297 Warp Affine 1297 Affininen vääristys 1298 Warp Area 1298 Vääristä alue 1299 Warp Curved 1299 Kaareva vääristys 1300 Warp Image 1300 Vääristä kuva 1301 Warp Linear1 1301 Lineaarinen vääristys1 1302 Warp Linear2 1302 Lineaarinen vääristys2 1303 Warp Radial 1303 Säteittäinen vääristys 1304 Warp an image with a wave pattern 1304 Vääristä kuva aaltokuviolla 1305 Warp image (affine) using the mouse 1305 Vääristä kuva (affininen) hiirellä 1306 Warp image (curved) using the mouse 1306 Vääristä kuva (kaareva) hiirellä 1307 Warp image (linear 1) using the mouse 1307 Vääristä kuva (lineaarinen 1) hiirellä 1308 Warp image (linear 2) using the mouse 1308 Vääristä kuva (lineaarinen 2) hiirellä 1309 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1309 Vääristys: oikaise, korjaa perspektiivi, vääristä, poista lähikuvan vääristymä, tasoita, kuvamuunnokset 1310 White 1310 Valkoinen 1311 Widen: 1311 Levennä: 1312 Width 1312 Leveys 1313 Width % 1313 Leveys % 1314 X-size 1314 X-koko 1315 Yes 1315 Kyllä 1316 ZOOM 1316 ZOOM 1317 Zoom 1317 Zoom 1318 Zoom Center 1318 Zoomin keskipiste 1319 Zoom Speed 1319 Zoomin nopeus 1320 Zoom-in 1320 Zoomaa sisään 1321 Zoom-out 1321 Zoomaa ulos 1322 \n %d-bits/color 1322 \n %d-bittiä/väri 1323 \n *** CANCELED \n 1323 \n *** PERUUTETTU \n 1324 \n *** COMPLETED \n 1324 \n *** VALMIS \n 1325 \n *** Delete Originals *** 1325 \n *** Poista alkuperäiset *** 1326 \n *** Keep Originals *** 1326 \n *** Säilytä alkuperäiset *** 1327 \n *** Replace Originals *** 1327 \n *** Korvaa alkuperäiset *** 1328 \n Convert to %s 1328 \n Muunna muotoon %s 1329 \n Copy Metadata 1329 \n Kopioi metadata 1330 \n Downsize within %dx%d 1330 \n Pienennä kokoon %dx%d 1331 \n New Location: %s 1331 \n Uusi sijainti: %s 1332 \n Output to %s 1332 \n Tulostus kohteeseen %s 1333 \n PROCEED? 1333 \n JATKETAANKO? 1334 \n Rename to %s 1334 \n Nimeä uudelleen: %s 1335 \n Replace text: %s --> %s 1335 \n Korvaa teksti: %s --> %s 1336 \n Rescale to %sx 1336 \n Skaalaa kokoon %sx 1337 \n Update Albums 1337 \n Päivitä albumit 1338 \n Upsize within %dx%d 1338 \n Suurenna kokoon %dx%d 1339 \n*** CANCELED \n 1339 \n*** PERUUTETTU \n 1340 \n*** COMPLETED \n 1340 \n*** VALMIS \n 1341 \n\nPROCEED? 1341 \n\nJATKETAANKO? 1342 add 1342 lisää 1343 add after old 1343 lisää vanhan jälkeen 1344 add all gallery files to list 1344 lisää kaikki gallerian tiedostot listaan 1345 add current file to list 1345 lisää nykyinen tiedosto listaan 1346 add entered text to layout 1346 lisää kirjoitettu teksti asetteluun 1347 add images to layout 1347 lisää kuvat asetteluun 1348 add line/arrow to layout 1348 lisää viiva/nuoli asetteluun 1349 add new keyword 1349 lisää uusi keyword 1350 add or edit images 1350 lisää tai muokkaa kuvia 1351 add or edit lines/arrows 1351 lisää tai muokkaa viivoja/nuolia 1352 add or edit text 1352 lisää tai muokkaa tekstiä 1353 add to set 1353 lisää joukkoon 1354 adder 1354 lisäin 1355 adjust brightness of selected image 1355 säädä valitun kuvan kirkkautta 1356 after removal of missing files: %d \n 1356 puuttuvien tiedostojen poiston jälkeen: %d \n 1357 album %s: deleted 1357 albumi %s: poistettu 1358 album already exists: %s 1358 albumi on jo olemassa: %s 1359 album mass update 1359 albumin massapäivitys 1360 albums folder missing 1360 albumit-kansio puuttuu 1361 align and trim color chart 1361 kohdista ja rajaa värikartta 1362 all files 1362 kaikki tiedostot 1363 all image files, including unmounted folders: %d \n 1363 kaikki kuvatiedostot, mukaan lukien liittämättömät kansiot: %d \n 1364 all images 1364 kaikki kuvat 1365 all versions 1365 kaikki versiot 1366 amplify contrast 1366 vahvista kontrastia 1367 amplitude 1367 amplitudi 1368 angle 1368 kulma 1369 apply 1369 käytä 1370 area edge creep 1370 alueen reunan liuku 1371 area is not finished 1371 alue ei ole valmis 1372 area outline color: 1372 alueen ääriviivan väri: 1373 array width is too large: %d x %d 1373 ryhmän leveys on liian suuri: %d x %d 1374 ascending 1374 nouseva 1375 auto color 1375 automaattinen väri 1376 background colors for file and gallery view windows 1376 taustavärit tiedosto- ja gallerianäkymäikkunoille 1377 backing 1377 tausta 1378 bad category name 1378 virheellinen kategorian nimi 1379 bad keyword name 1379 virheellinen keyword-nimi 1380 bad pattern file: %s 1380 virheellinen kuviotiedosto: %s 1381 base 1381 perusta 1382 base and adder need $s plugin 1382 perusta ja lisäin tarvitsevat $s-lisäosan 1383 base size 1383 perustan koko 1384 begin making a script file 1384 aloita skriptitiedoston luonti 1385 black/white 1385 mustavalko 1386 black/white negative 1386 mustavalko negatiivi 1387 black/white positive 1387 mustavalko positiivi 1388 blend 1388 sekoitus 1389 blend edges: blend width: 1389 sekoita reunat: sekoituksen leveys: 1390 blend image overlaps over pixel width 1390 sekoita kuvan päällekkäisyydet pikselileveyden yli 1391 blend rate: center: 1391 sekoitusnopeus: keskipiste: 1392 blocking function: %s 1392 estävä toiminto: %s 1393 blocksize 1393 lohkon koko 1394 blur edges: blur width: 1394 sumenna reunat: sumennuksen leveys: 1395 blur radius 1395 sumennuksen säde 1396 borders 1396 reunukset 1397 both 'All Files' and specific files were selected 1397 sekä 'Kaikki tiedostot' että tietyt tiedostot oli valittu 1398 bright halo 1398 kirkas halo 1399 brightness rescale 1399 kirkkauden skaalaus 1400 browse 1400 selaa 1401 brush size 1401 siveltimen koko 1402 build index, old files only 1402 rakenna indeksi, vain vanhat tiedostot 1403 cancel project 1403 peruuta projekti 1404 cancel project? 1404 peruutetaanko projekti? 1405 cannot allocate %d MB memory 1405 muistia ei voida varata %d MB 1406 cannot be determined 1406 ei voida määrittää 1407 cannot copy a file to itself 1407 tiedostoa ei voi kopioida itseensä 1408 cannot copy current file 1408 nykyistä tiedostoa ei voi kopioida 1409 cannot create output file 1409 tulostetiedostoa ei voi luoda 1410 cannot create pixbuf 1410 pixbufia ei voi luoda 1411 cannot find area outline 1411 alueen ääriviivaa ei löydy 1412 cannot find output file 1412 tulostetiedostoa ei löydy 1413 cannot load input file 1413 syötetiedostoa ei voi ladata 1414 cannot open file %s 1414 tiedostoa %s ei voi avata 1415 cannot parse current file 1415 nykyistä tiedostoa ei voi jäsentää 1416 cannot parse file 1416 tiedostoa ei voi jäsentää 1417 cannot read pluging output file 1417 lisäosan tulostetiedostoa ei voi lukea 1418 cannot replace %s file 1418 tiedostoa %s ei voi korvata 1419 cannot save as RAW type 1419 ei voi tallentaa RAW-tyyppinä 1420 cannot save layout file: %s 1420 asettelutiedostoa ei voi tallentaa: %s 1421 cannot write image folders file: %s 1421 kuvakansiotiedostoa ei voi kirjoittaa: %s 1422 category %s has too many keywords 1422 kategoriassa %s on liikaa keywordeja 1423 category %s is too big 1423 kategoria %s on liian suuri 1424 center 1424 keskipiste 1425 change project scale 1425 muuta projektin skaalaa 1426 choose 1-8 clicks or [+] keys for 2x image zoom 1426 valitse 1-8 klikkausta tai [+] näppäintä 2x kuvan zoomaukselle 1427 choose a better spot 1427 valitse parempi kohta 1428 choose an image file 1428 valitse kuvatiedosto 1429 choose file 1429 valitse tiedosto 1430 choose files 1430 valitse tiedostot 1431 choose folder 1431 valitse kansio 1432 choose folders 1432 valitse kansiot 1433 choose location 1433 valitse sijainti 1434 circle 1434 ympyrä 1435 clear area selections 1435 tyhjennä aluevalinnat 1436 clear entered text 1436 tyhjennä kirjoitettu teksti 1437 clear inputs 1437 tyhjennä syötteet 1438 clear text 1438 tyhjennä teksti 1439 click a defined keyword (below) to add a search keyword 1439 klikkaa määritettyä keywordia (alla) lisätäksesi hakukeywordin 1440 click bright point 1440 klikkaa kirkasta pistettä 1441 click dark point 1441 klikkaa tummaa pistettä 1442 click on desired color 1442 klikkaa haluttua väriä 1443 click on image to get source color 1443 klikkaa kuvaa saadaksesi lähdeväri 1444 click on image to set matching color 1444 klikkaa kuvaa asettaaksesi sovitusväri 1445 click on thumbnail to set zoom center 1445 klikkaa thumbnailia asettaaksesi zoomin keskipisteen 1446 click position to add line 1446 klikkaa sijaintia lisätäksesi viivan 1447 click position to add text 1447 klikkaa sijaintia lisätäksesi tekstin 1448 click to select 1448 klikkaa valitaksesi 1449 click to unselect 1449 klikkaa poistaaksesi valinnan 1450 clicks per 2x image increase 1450 klikkauksia per 2x kuvan suurennus 1451 color 1451 väri 1452 color depth 1452 värisyvyys 1453 color depth: 1453 värisyvyys: 1454 color match level % 1454 värin sovitustaso % 1455 color negative 1455 värinegatiivi 1456 column difference: %d pixels 1456 sarakkeen ero: %d pikseliä 1457 column difference: %d pixels \nMake columns even? 1457 sarakkeen ero: %d pikseliä \nTasoitetaanko sarakkeet? 1458 combined image files 1458 yhdistetyt kuvatiedostot 1459 command: 1459 komento: 1460 commit all changes, close dialog 1460 vahvista kaikki muutokset, sulje valintaikkuna 1461 complete file selection first 1461 täytä tiedostovalinta ensin 1462 completed 1462 valmis 1463 condense into color blobs 1463 tiivistä väripaloiksi 1464 condition 1464 ehto 1465 confirm Fotocx exit 1465 vahvista Fotocxin sulkeminen 1466 constant blur 1466 vakiosumennus 1467 continue? 1467 jatketaanko? 1468 converting colors... 1468 muunnetaan värejä... 1469 converting files 1469 muunnetaan tiedostoja 1470 copy (duplicate file) 1470 kopioi (kaksoiskappale tiedostosta) 1471 copy and paste commands 1471 kopioi ja liitä -komennot 1472 copy files to %s 1472 kopioi tiedostot kohteeseen %s 1473 copy metadata from Nth file: 1473 kopioi metadata N:nnestä tiedostosta: 1474 copy to Desktop failed: %s 1474 kopiointi työpöydälle epäonnistui: %s 1475 count: 0 1475 määrä: 0 1476 create folder 1476 luo kansio 1477 create folder %s 1477 luo kansio %s 1478 current gallery 1478 nykyinen galleria 1479 current image files found: %d \n 1479 nykyisiä kuvatiedostoja löytyi: %d \n 1480 current set only 1480 vain nykyinen joukko 1481 current set: 1481 nykyinen joukko: 1482 curve file is invalid 1482 käyrätiedosto on virheellinen 1483 custom command to play video files 1483 mukautettu komento videotiedostojen toistoon 1484 dark 1484 tumma 1485 dark halo 1485 tumma halo 1486 dark pixels 1486 tummat pikselit 1487 data is incomplete, proceed? 1487 data on puutteellista, jatketaanko? 1488 date format is yyyy:mm:dd [hh:mm:ss] 1488 päivämäärämuoto on vvvv:kk:pp [tt:mm:ss] 1489 date range 1489 aikaväli 1490 days 1490 päivää 1491 delete 1491 poista 1492 delete %s \n%s 1492 poista %s \n%s 1493 delete Mashup project files? 1493 poistetaanko Mashup-projektin tiedostot? 1494 delete failed: \n%s 1494 poisto epäonnistui: \n%s 1495 delete originals specified but no new name given 1495 alkuperäisten poisto määritetty, mutta uutta nimeä ei annettu 1496 delete selected text from layout 1496 poista valittu teksti asettelusta 1497 deleting orphan thumbnails ... \n 1497 poistetaan orpoja thumbnaileja ... \n 1498 depth 1498 syvyys 1499 descending 1499 laskeva 1500 direction of light and shadows 1500 valon ja varjojen suunta 1501 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1501 poista thumbnail-valinta käytöstä ottaaksesi käyttöön ponnahdusvalikot yms. \nkäytä [Ota käyttöön] jatkaaksesi thumbnail-valintaa 1502 discard changes? 1502 hylätäänkö muutokset? 1503 do not warp images during auto-alignment 1503 älä vääristä kuvia automaattisen kohdistuksen aikana 1504 do nothing 1504 älä tee mitään 1505 dot size 1505 pisteen koko 1506 downsize 1506 pienennä 1507 drag image 1507 vedä kuvaa 1508 drag mouse along an edge to follow the edge 1508 vedä hiirtä reunaa pitkin seurataksesi reunaa 1509 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1509 vedä hiirtä alas/oikealle piirtääksesi soikion \nshift + vedä keskeltä siirtääksesi soikiota \nshift + vedä oikeasta alareunasta muuttaaksesi 1510 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1510 vedä hiirtä piirtääksesi laatikon \nshift + vedä keskeltä siirtääksesi laatikkoa \nshift + vedä reunasta siirtääksesi reunaa 1511 drag mouse to outline an area 1511 vedä hiirtä ääriviivoittaaksesi alueen 1512 drag mouse to select circular or elliptical area 1512 vedä hiirtä valitaksesi pyöreän tai soikean alueen 1513 drag mouse to select rectangular area 1513 vedä hiirtä valitaksesi suorakulmaisen alueen 1514 drag mouse to show selected image 1514 vedä hiirtä näyttääksesi valitun kuvan 1515 duplicate keyword 1515 kaksoiskappale keyword 1516 edge distance calculation 1516 reunaetäisyyden laskenta 1517 edge: 1517 reuna: 1518 edit 1518 muokkaa 1519 edit commands 1519 muokkaa komentoja 1520 edit custom shell commands, match colors to embedded jpeg image 1520 muokkaa mukautettuja shell-komentoja, sovita värit upotettuun jpeg-kuvaan 1521 edit this menu 1521 muokkaa tätä valikkoa 1522 ellipse 1522 ellipsi 1523 embedded numbers will sort by value 1523 upotetut numerot lajitellaan arvon mukaan 1524 emboss 1524 kohokuvio 1525 enter 2-character language code: en, de, fr ... 1525 anna 2-merkkinen kielikoodi: en, de, fr ... 1526 enter a project name 1526 anna projektin nimi 1527 enter an album name 1527 anna albumin nimi 1528 enter cities/locations, countries 1528 anna kaupungit/sijainnit, maat 1529 enter project name 1529 anna projektin nimi 1530 enter tag name 1530 anna tag-nimi 1531 enter tag names 1531 anna tag-nimet 1532 erase 1532 pyyhi 1533 error compensation 1533 virheenkompensointi 1534 exceed %d edits 1534 ylittää %d muokkausta 1535 exceed %d images 1535 ylittää %d kuvaa 1536 exceed %d max files, cannot continue 1536 ylittää %d enimmäistiedostoa, ei voida jatkaa 1537 exceed %d rows 1537 ylittää %d riviä 1538 exceed %d selected files 1538 ylittää %d valittua tiedostoa 1539 exceed %d shortcuts 1539 ylittää %d pikanäppäintä 1540 exceeded %d line entries 1540 ylitti %d viivamerkintää 1541 exceeded %d text entries 1541 ylitti %d tekstimerkintää 1542 exceeded max. images: %d 1542 ylitti enimmäiskuvamäärän: %d 1543 exceeded max. tiles: %d 1543 ylitti enimmäislaattamäärän: %d 1544 exit split-screen 1544 poistu jaetusta näytöstä 1545 expand to these limits if smaller 1545 laajenna näihin rajoihin, jos pienempi 1546 exporting files 1546 viedään tiedostoja 1547 extra indexed metadata tags > %d 1547 ylimääräisiä indeksoituja metadata-tageja > %d 1548 extra metadata tags to include in index 1548 ylimääräiset indeksiin sisällytettävät metadata-tagit 1549 extra metadata tags: \n 1549 ylimääräiset metadata-tagit: \n 1550 fetch 1550 nouda 1551 file 1551 tiedosto 1552 file .ext names to recognize RAW files 1552 tiedostopäätteet RAW-tiedostojen tunnistamiseen 1553 file .ext names to recognize video files 1553 tiedostopäätteet videotiedostojen tunnistamiseen 1554 file close error 1554 tiedoston sulkemisvirhe 1555 file color 1555 tiedoston väri 1556 file error: %s 1556 tiedostovirhe: %s 1557 file format error 1557 tiedostomuotovirhe 1558 file format error: %s 1558 tiedostomuotovirhe: %s 1559 file included: %s \n 1559 tiedosto sisällytetty: %s \n 1560 file metadata update failed 1560 tiedoston metadatan päivitys epäonnistui 1561 file name 1561 tiedoston nimi 1562 file names 1562 tiedostojen nimet 1563 file not found 1563 tiedostoa ei löydy 1564 file not found \n 1564 tiedostoa ei löydy \n 1565 file not found: %s 1565 tiedostoa ei löydy: %s 1566 file not found: %s %s 1566 tiedostoa ei löydy: %s %s 1567 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1567 tiedostotyypit: .jp2 .heic .avif .webp \nmuuttuvat muotoon: .jpg - JATKETAANKO? 1568 file: %s \nexceed 99 versions 1568 tiedosto: %s \nylittää 99 versiota 1569 filename text 1569 tiedostonimen teksti 1570 files in %s can be deleted 1570 tiedostot kohteessa %s voidaan poistaa 1571 fill from current gallery 1571 täytä nykyisestä galleriasta 1572 fill from selected files 1572 täytä valituista tiedostoista 1573 fill selected areas 1573 täytä valitut alueet 1574 fill transparent areas 1574 täytä läpinäkyvät alueet 1575 find all image files ...\n 1575 etsi kaikki kuvatiedostot ...\n 1576 find and report all unreadable image files 1576 etsi ja raportoi kaikki lukukelvottomat kuvatiedostot 1577 find outline gap 1577 etsi ääriviivan aukko 1578 find via table lookup 1578 etsi taulukkohaulla 1579 find_imagefiles() failure \n 1579 find_imagefiles()-virhe \n 1580 find_imagefiles() failure: %s \n 1580 find_imagefiles()-virhe: %s \n 1581 finish current edit first 1581 viimeistele nykyinen muokkaus ensin 1582 finish making a script file 1582 viimeistele skriptitiedoston luonti 1583 finish or cancel pending edit 1583 viimeistele tai peruuta odottava muokkaus 1584 fix box in layout and start new box 1584 kiinnitä laatikko asetteluun ja aloita uusi laatikko 1585 fix line in layout and start new line 1585 kiinnitä viiva asetteluun ja aloita uusi viiva 1586 fix motion blur 1586 korjaa liike-epäterävyys 1587 fix oval in layout and start new oval 1587 kiinnitä soikio asetteluun ja aloita uusi soikio 1588 follow edge 1588 seuraa reunaa 1589 font name and size for menus and dilogs 1589 fontin nimi ja koko valikoille ja valintaikkunoille 1590 force a full re-index of all image files 1590 pakota kaikkien kuvatiedostojen täydellinen uudelleenindeksointi 1591 format: yyyy:mm:dd [hh:mm:ss] 1591 muoto: vvvv:kk:pp [tt:mm:ss] 1592 fotocx will exit 1592 Fotocx sulkeutuu 1593 found %d pixels 1593 löytyi %d pikseliä 1594 free disk space: %d GB \n 1594 vapaata levytilaa: %d GB \n 1595 freehand draw 1595 vapaakäden piirto 1596 ftruncate() failure: %s 1596 ftruncate()-virhe: %s 1597 full image index: reports will be complete \n 1597 täysi kuvaindeksi: raportit ovat täydellisiä \n 1598 function canceled 1598 toiminto peruutettu 1599 gallery 1599 galleria 1600 gallery is empty 1600 galleria on tyhjä 1601 gallery truncated to %d images 1601 galleria katkaistu %d kuvaan 1602 get images having text in filename (comma separated) 1602 hae kuvat, joiden tiedostonimessä on tekstiä (pilkulla erotettu) 1603 get images with matching keywords (comma separated) 1603 hae kuvat, joissa on vastaavia keywordeja (pilkulla erotettu) 1604 get images within rating range 1604 hae kuvat arvosteluvälillä 1605 gradual paint 1605 asteittainen maalaus 1606 grid counts not 0-100: %s 1606 ruudukon määrät eivät ole 0-100: %s 1607 grid picklist file error: %s 1607 ruudukon valintalistatiedoston virhe: %s 1608 grid size 1608 ruudukon koko 1609 group 1609 ryhmä 1610 height 1610 korkeus 1611 hide area outlines 1611 piilota alueiden ääriviivat 1612 hide transient objects 1612 piilota väliaikaiset kohteet 1613 high 1613 korkea 1614 home folder was not changed 1614 kotikansiota ei muutettu 1615 horizontal 1615 vaakasuora 1616 hours 1616 tuntia 1617 icons only, text only, or both 1617 vain kuvakkeet, vain teksti, tai molemmat 1618 if image < window, center or shift left or right 1618 jos kuva < ikkuna, keskitä tai siirrä vasemmalle tai oikealle 1619 ignore differences above limit 1619 ohita rajan ylittävät erot 1620 image blend 1620 kuvan sekoitus 1621 image files 1621 kuvatiedostot 1622 image for source color 1622 kuva lähdeväriä varten 1623 image index records found: %d \n 1623 kuvaindeksin tietueita löytyi: %d \n 1624 image index required 1624 kuvaindeksi vaaditaan 1625 image index write error: %s 1625 kuvaindeksin kirjoitusvirhe: %s 1626 image is too large to edit: %d x %d 1626 kuva on liian suuri muokattavaksi: %d x %d 1627 image is too large: %dx%d, %lld megapix 1627 kuva on liian suuri: %dx%d, %lld megapikseliä 1628 image is too small to edit: %d x %d 1628 kuva on liian pieni muokattavaksi: %d x %d 1629 image scale 1629 kuvan skaala 1630 image to set matching color 1630 kuva sovitusvärin asettamiseen 1631 image width must be greater than height 1631 kuvan leveyden on oltava suurempi kuin korkeus 1632 images to report 1632 raportoitavat kuvat 1633 include all files 1633 sisällytä kaikki tiedostot 1634 include edited versions 1634 sisällytä muokatut versiot 1635 include last versions only 1635 sisällytä vain viimeisimmät versiot 1636 include original files 1636 sisällytä alkuperäiset tiedostot 1637 include transparent areas 1637 sisällytä läpinäkyvät alueet 1638 include: 1638 sisällytä: 1639 increase blur with distance 1639 lisää sumennusta etäisyyden mukaan 1640 index completed, %.1f seconds \n 1640 indeksointi valmis, %.1f sekuntia \n 1641 index config file error: %s 1641 indeksin asetustiedoston virhe: %s 1642 index updates needed: %d thumbnails: %d \n 1642 indeksipäivityksiä tarvitaan: %d thumbnaileja: %d \n 1643 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1643 indeksipäivityksiä: %d otsikko/kuvauspäivityksiä: %d \nthumbnail-päivityksiä: %d, poistoja: %d \n 1644 input 1644 syöte 1645 input file: %s \n 1645 syötetiedosto: %s \n 1646 insufficient memory, cannot proceed 1646 riittämätön muisti, ei voida jatkaa 1647 insufficient overlap for color matching 1647 riittämätön päällekkäisyys värin sovitukseen 1648 invalid GPS data 1648 virheellinen GPS-data 1649 invalid GPS data: %s 1649 virheellinen GPS-data: %s 1650 invalid album 1650 virheellinen albumi 1651 invalid date range: %s %s 1651 virheellinen aikaväli: %s %s 1652 invalid date/time format 1652 virheellinen päivämäärä-/aikamuoto 1653 invalid file 1653 virheellinen tiedosto 1654 invalid plugin: %s 1654 virheellinen lisäosa: %s 1655 invalid rating range 1655 virheellinen arvosteluväli 1656 invalid source file: %s 1656 virheellinen lähdetiedosto: %s 1657 invert area 1657 käännä alue 1658 jpeg quality level - 70+ for good image quality 1658 jpeg-laatutaso - 70+ hyvälle kuvanlaadulle 1659 keyboard 1659 näppäimistö 1660 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1660 näppäimistön ohjaimet: \nEsc: sulje käynnissä oleva diaesitys \nnuolinäppäimet: edellinen/seuraava kuva \nB: tyhjennä/palauta ikkuna \nN: siirtymä seuraavaan kuvaan \nP: keskeytä/jatka \nX: suurenna hiiren sijainnissa 1661 keyword names 1661 keyword-nimet 1662 keywords to add 1662 lisättävät keywordit 1663 keywords to remove 1663 poistettavat keywordit 1664 keywords_defined file error: %s 1664 keywords_defined-tiedoston virhe: %s 1665 last search 1665 viimeisin haku 1666 last version 1666 viimeisin versio 1667 last versions 1667 viimeisimmät versiot 1668 layout exceeds 4 gigabytes 1668 asettelu ylittää 4 gigatavua 1669 layout file missing: %s 1669 asettelutiedosto puuttuu: %s 1670 left 1670 vasen 1671 left click on image for selected color 1671 vasen klikkaus kuvaan valitulle värille 1672 left click: set image source location \nright click: set corresponding destination 1672 vasen klikkaus: aseta kuvan lähdesijainti \noikea klikkaus: aseta vastaava kohde 1673 left drag: add transparency \nright drag: add opacity 1673 vasen veto: lisää läpinäkyvyyttä \noikea veto: lisää peittävyyttä 1674 left drag: copy image to mouse position \nright drag: restore original image 1674 vasen veto: kopioi kuva hiiren sijaintiin \noikea veto: palauta alkuperäinen kuva 1675 left drag: reduce halo, right drag: undo 1675 vasen veto: vähennä haloa, oikea veto: kumoa 1676 lens mm 1676 objektiivin mm 1677 level based on EXIF roll angle 1677 suorista EXIF-kallistuskulman perusteella 1678 light 1678 vaalea 1679 light pixels 1679 vaaleat pikselit 1680 line 1680 viiva 1681 line color 1681 viivan väri 1682 line width 1682 viivan leveys 1683 load 1683 lataa 1684 load text data from a file 1684 lataa tekstidataa tiedostosta 1685 load widgets failed: %s 1685 widgettien lataus epäonnistui: %s 1686 loading palette ... 1686 ladataan palettia ... 1687 location is not a folder 1687 sijainti ei ole kansio 1688 locations 1688 sijainnit 1689 lock width/height ratio 1689 lukitse leveys/korkeus-suhde 1690 log file is in a terminal 1690 lokitiedosto on päätteessä 1691 low 1691 matala 1692 low contrast 1692 matala kontrasti 1693 lower 1693 alempi 1694 make an initially empty album 1694 luo aluksi tyhjä albumi 1695 make new version 1695 luo uusi versio 1696 manual align 1696 manuaalinen kohdistus 1697 map marker (red dot) diameter, pixels 1697 karttamerkin (punainen piste) halkaisija, pikseliä 1698 map selected areas and verify 1698 kartoita valitut alueet ja vahvista 1699 mashup project 1699 mashup-projekti 1700 match embedded image color 1700 sovita upotetun kuvan väri 1701 match image color to base image (repeat) 1701 sovita kuvan väri perustakuvaan (toista) 1702 match values 1702 sovita arvot 1703 matches 1703 osumat 1704 max keywords exceeded 1704 keywordien enimmäismäärä ylitetty 1705 max. Width 1705 maks. leveys 1706 max. album count exceeded: %d 1706 albumien enimmäismäärä ylitetty: %d 1707 max. album files reached, results truncated 1707 albumin tiedostojen enimmäismäärä saavutettu, tulokset katkaistu 1708 max. album size exceeded: %d 1708 albumin enimmäiskoko ylitetty: %d 1709 max. blur radius 1709 sumennuksen enimmäissäde 1710 max. brightness 1710 enimmäiskirkkaus 1711 max. image limit reached: %d 1711 kuvien enimmäisraja saavutettu: %d 1712 max. width or height is not reasonable 1712 enimmäisleveys tai -korkeus ei ole järkevä 1713 maximum clip allowed to fit window 1713 suurin sallittu leikkaus ikkunaan sovittamiseksi 1714 mean RGB: %5.0f %5.0f %5.0f 1714 keskiarvo RGB: %5.0f %5.0f %5.0f 1715 mean noise: %5.2f %5.2f %5.2f 1715 keskiarvo kohina: %5.2f %5.2f %5.2f 1716 median 1716 mediaani 1717 median diff 1717 mediaaniero 1718 menu text and background colors 1718 valikon teksti- ja taustavärit 1719 metadata 1719 metadata 1720 metadata copy failed 1720 metadatan kopiointi epäonnistui 1721 metadata from Search Function, metadata report 1721 metadata hakutoiminnosta, metadataraportti 1722 metadata picklist file not found %s 1722 metadatan valintalistatiedostoa ei löydy %s 1723 metadata tags to report 1723 raportoitavat metadata-tagit 1724 metadata update error 1724 metadatan päivitysvirhe 1725 metadata update error \n 1725 metadatan päivitysvirhe \n 1726 metadata update error: %s 1726 metadatan päivitysvirhe: %s 1727 metadata update failed \n 1727 metadatan päivitys epäonnistui \n 1728 min. blur radius 1728 sumennuksen vähimmäissäde 1729 min. contrast 1729 vähimmäiskontrasti 1730 min. edit curve node separation, % of scale length 1730 muokkauskäyrän solmujen vähimmäisväli, % skaalan pituudesta 1731 min. separation, %c of scale 1731 vähimmäisväli, %c skaalasta 1732 minutes 1732 minuuttia 1733 mmap() failure: %s 1733 mmap()-virhe: %s 1734 months 1734 kuukautta 1735 more than %d categories 1735 enemmän kuin %d kategoriaa 1736 more than 20 matches 1736 enemmän kuin 20 osumaa 1737 mouse radius 1737 hiiren säde 1738 mouse radius for color sample 1738 hiiren säde värinäytteelle 1739 mouse radius: 1739 hiiren säde: 1740 move (delete original) 1740 siirrä (poista alkuperäinen) 1741 move area boundary in/out in 1-pixel steps 1741 siirrä alueen rajaa sisään/ulos 1 pikselin askelin 1742 move to next input file 1742 siirry seuraavaan syötetiedostoon 1743 move to trash failed \n 1743 siirto roskakoriin epäonnistui \n 1744 move to trash failed: %s 1744 siirto roskakoriin epäonnistui: %s 1745 multiply 1745 kerro 1746 must have 4 corners 1746 täytyy olla 4 kulmaa 1747 need numeric match value: %s 1747 tarvitaan numeerinen sovitusarvo: %s 1748 negative 1748 negatiivi 1749 new album created 1749 uusi albumi luotu 1750 new album name 1750 uusi albumin nimi 1751 new file 1751 uusi tiedosto 1752 new file ... 1752 uusi tiedosto ... 1753 new file name is invalid 1753 uusi tiedostonimi on virheellinen 1754 new file type 1754 uusi tiedostotyyppi 1755 new home folder contains a blank 1755 uusi kotikansio sisältää välilyönnin 1756 new location 1756 uusi sijainti 1757 new location is not a folder 1757 uusi sijainti ei ole kansio 1758 new version 1758 uusi versio 1759 newest files 1759 uusimmat tiedostot 1760 no EXIF orientation data 1760 ei EXIF-suuntatietoa 1761 no active Select Area 1761 ei aktiivista Valitse alue -toimintoa 1762 no albums selected 1762 albumeja ei valittu 1763 no auto warp 1763 ei automaattista vääristystä 1764 no change 1764 ei muutosta 1765 no current album 1765 ei nykyistä albumia 1766 no current edit image 1766 ei nykyistä muokattavaa kuvaa 1767 no current file 1767 ei nykyistä tiedostoa 1768 no curve (scanned image) 1768 ei käyrää (skannattu kuva) 1769 no description 1769 ei kuvausta 1770 no file selected 1770 tiedostoa ei valittu 1771 no files found 1771 tiedostoja ei löytynyt 1772 no files selected 1772 tiedostoja ei valittu 1773 no host files selected 1773 isäntätiedostoja ei valittu 1774 no image index: reports disabled \n 1774 ei kuvaindeksiä: raportit pois käytöstä \n 1775 no images 1775 ei kuvia 1776 no images found 1776 kuvia ei löytynyt 1777 no input files available 1777 syötetiedostoja ei ole saatavilla 1778 no matching files found 1778 vastaavia tiedostoja ei löytynyt 1779 no matching locations 1779 vastaavia sijainteja ei löytynyt 1780 no metadata level data 1780 ei metadatatasotietoa 1781 no metadata tags to report 1781 ei raportoitavia metadata-tageja 1782 no option selected 1782 vaihtoehtoa ei valittu 1783 no overlay file selected 1783 peitekuvatiedostoa ei valittu 1784 no photo date, skipped 1784 ei kuvan päivämäärää, ohitettu 1785 no plugin output file found 1785 lisäosan tulostetiedostoa ei löytynyt 1786 no prior edit 1786 ei edellistä muokkausta 1787 no prior edit image 1787 ei edellistä muokattua kuvaa 1788 no saved folders 1788 ei tallennettuja kansioita 1789 no script file was started 1789 skriptitiedostoa ei aloitettu 1790 no script files found 1790 skriptitiedostoja ei löytynyt 1791 no select area 1791 ei aluevalintaa 1792 no selection 1792 ei valintaa 1793 no title 1793 ei otsikkoa 1794 no write permission 1794 ei kirjoitusoikeutta 1795 no write permission \n 1795 ei kirjoitusoikeutta \n 1796 no write permission: %s 1796 ei kirjoitusoikeutta: %s 1797 none 1797 ei mitään 1798 not a known image file 1798 ei tunnettu kuvatiedosto 1799 not an image file 1799 ei kuvatiedosto 1800 not an indexed image file \n 1800 ei indeksoitu kuvatiedosto \n 1801 nothing found 1801 ei löytynyt mitään 1802 nothing left, no change made 1802 ei jäljellä mitään, muutoksia ei tehty 1803 old file 1803 vanha tiedosto 1804 old image index: reports will omit new files \n 1804 vanha kuvaindeksi: raportit jättävät uudet tiedostot pois \n 1805 old keyword name >> new keyword name 1805 vanha keyword-nimi >> uusi keyword-nimi 1806 omit high pixel 1806 jätä pois korkea pikseli 1807 omit low pixel 1807 jätä pois matala pikseli 1808 only %d tile images found 1808 vain %d laattakuvaa löytyi 1809 opacity center 1809 peittävyyden keskipiste 1810 opacity edge 1810 peittävyyden reuna 1811 open album 1811 avaa albumi 1812 open and process color chart 1812 avaa ja käsittele värikartta 1813 open as new current file 1813 avaa uutena nykyisenä tiedostona 1814 optional deselect color 1814 valinnainen valinnan poistoväri 1815 original 1815 alkuperäinen 1816 originals 1816 alkuperäiset 1817 other 1817 muu 1818 out of space for temp files \nsave your edits and quit Fotocx 1818 tilaa ei riitä väliaikaistiedostoille \ntallenna muokkauksesi ja sulje Fotocx 1819 outline 1819 ääriviiva 1820 output file exists 1820 tulostetiedosto on jo olemassa 1821 output file exists, overwrite? 1821 tulostetiedosto on jo olemassa, korvataanko? 1822 output file size change, cannot use select area 1822 tulostetiedoston koko muuttuu, alueen valintaa ei voi käyttää 1823 output file: 1823 tulostetiedosto: 1824 output file: %s \n 1824 tulostetiedosto: %s \n 1825 oval 1825 soikio 1826 overlay file missing: %s 1826 peitekuvatiedosto puuttuu: %s 1827 owner 1827 omistaja 1828 paint 1828 maalaa 1829 paint color 1829 maalausväri 1830 paint edits cannot be used for this method 1830 maalausmuokkauksia ei voi käyttää tällä menetelmällä 1831 paint over transparent areas 1831 maalaa läpinäkyvien alueiden päälle 1832 paint radius 1832 maalauksen säde 1833 palette 1833 paletti 1834 palette exceeds %d color limit 1834 paletti ylittää %d värin rajan 1835 palette file 1835 palettitiedosto 1836 palette has %d colors 1836 paletissa on %d väriä 1837 palette loaded, %d colors 1837 paletti ladattu, %d väriä 1838 palette: 1838 paletti: 1839 patch area goal 1839 paikka-alueen tavoite 1840 percent 1840 prosenttia 1841 perform edits to include in the script file 1841 tee muokkaukset sisällytettäväksi skriptitiedostoon 1842 permissions: 1842 käyttöoikeudet: 1843 perspective 1843 perspektiivi 1844 photo 1844 valokuva 1845 picklist file not found: %s 1845 valintalistatiedostoa ei löydy: %s 1846 pixel = mean of best match neighbors 1846 pikseli = parhaiten sopivien naapureiden keskiarvo 1847 pixel = median of all neighbors 1847 pikseli = kaikkien naapureiden mediaani 1848 please make a choice 1848 tee valinta 1849 plugin command failed 1849 lisäosan komento epäonnistui 1850 plugin menu not found %s 1850 lisäosavalikkoa ei löydy %s 1851 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1851 lisäosat: (vuosi kuukausi päivä vanha-nimi järjestysnumero) $yyyy $mm $dd $oldname $s 1852 popup_choose: empty list 1852 popup_choose: tyhjä lista 1853 position with mouse click/drag 1853 sijainti hiiren klikkauksella/vedolla 1854 position: 50 50 1854 sijainti: 50 50 1855 position: x=%02d y=%02d 1855 sijainti: x=%02d y=%02d 1856 power 1856 teho 1857 power center 1857 tehon keskipiste 1858 power edge 1858 tehon reuna 1859 power: center 1859 teho: keskipiste 1860 pref 1860 asetus 1861 previous file 1861 edellinen tiedosto 1862 previous name 1862 edellinen nimi 1863 print color chart 1863 tulosta värikartta 1864 print select area(s) only? 1864 tulosta vain valitut alueet? 1865 prior edit step 1865 edellinen muokkausvaihe 1866 project complete 1866 projekti valmis 1867 project file is defective 1867 projektitiedosto on viallinen 1868 project name cannot have quote characters 1868 projektin nimessä ei voi olla lainausmerkkejä 1869 pure RGB or black/white dots 1869 puhdas RGB tai mustavalkopisteet 1870 quality 1870 laatu 1871 quality level (70+) 1871 laatutaso (70+) 1872 radius 1872 säde 1873 radius: 1873 säde: 1874 random 1874 satunnainen 1875 random position 1875 satunnainen sijainti 1876 rating range 1876 arvosteluväli 1877 reading image index file ...\n 1877 luetaan kuvaindeksitiedostoa ...\n 1878 recent files 1878 viimeaikaiset tiedostot 1879 reduce bright 1879 vähennä kirkkautta 1880 reduce dark 1880 vähennä tummuutta 1881 reduce to these limits if larger 1881 pienennä näihin rajoihin, jos suurempi 1882 refresh 1882 päivitä 1883 remove %d duplicates? 1883 poistetaanko %d kaksoiskappaletta? 1884 remove all files in list 1884 poista kaikki tiedostot listasta 1885 remove duplicate 1885 poista kaksoiskappale 1886 remove from set 1886 poista joukosta 1887 remove panorama image curving 1887 poista panoraamakuvan kaarevuus 1888 remove selected file from list 1888 poista valittu tiedosto listasta 1889 rename keywords 1889 nimeä keywordit uudelleen 1890 repair metadata for %s 1890 korjaa metadata kohteelle %s 1891 replace 1891 korvaa 1892 replace album %s ? 1892 korvataanko albumi %s? 1893 replace file 1893 korvaa tiedosto 1894 replace old 1894 korvaa vanha 1895 replace old file (OVERWRITE) 1895 korvaa vanha tiedosto (YLIKIRJOITA) 1896 replace substring within file name 1896 korvaa merkkijono tiedostonimen sisällä 1897 report type: 1897 raporttityyppi: 1898 req. color match 1898 vaadittu värin sovitus 1899 reset 1899 nollaa 1900 resolution 1900 resoluutio 1901 resume from current image 1901 jatka nykyisestä kuvasta 1902 right 1902 oikea 1903 right click on image for deselected color 1903 oikea klikkaus kuvaan valinnan poistoväriä varten 1904 sample % 1904 näyte % 1905 save 1905 tallenna 1906 save Mashup output file 1906 tallenna Mashup-tulostetiedosto 1907 save Mashup project? 1907 tallennetaanko Mashup-projekti? 1908 save area as a PNG file 1908 tallenna alue PNG-tiedostona 1909 save as new file name or type 1909 tallenna uudella tiedostonimellä tai -tyypillä 1910 save as new file version 1910 tallenna uutena tiedostoversiona 1911 save edit, start new text 1911 tallenna muokkaus, aloita uusi teksti 1912 save metadata to image file 1912 tallenna metadata kuvatiedostoon 1913 save text data to a file 1913 tallenna tekstidata tiedostoon 1914 save to .heic/.avif file not supported 1914 tallennus .heic-/.avif-tiedostoon ei ole tuettu 1915 save to .jp2 file not supported 1915 tallennus .jp2-tiedostoon ei ole tuettu 1916 save to .webp file not supported 1916 tallennus .webp-tiedostoon ei ole tuettu 1917 scan and save color chart 1917 skannaa ja tallenna värikartta 1918 scanned color chart file 1918 skannattu värikarttatiedosto 1919 scope of neighbor pixels 1919 naapuripikselien laajuus 1920 script already started 1920 skripti on jo aloitettu 1921 script complete 1921 skripti valmis 1922 script error: %s, %s 1922 skriptivirhe: %s, %s 1923 script file closed 1923 skriptitiedosto suljettu 1924 script file error 1924 skriptitiedostovirhe 1925 script file format error: %s 1925 skriptitiedoston muotovirhe: %s 1926 script file name too big 1926 skriptitiedoston nimi on liian pitkä 1927 script file to run 1927 suoritettava skriptitiedosto 1928 search for names in image location metadata 1928 hae nimiä kuvan sijaintimetadatasta 1929 search for text within file folders or file name 1929 hae tekstiä tiedostokansioista tai tiedostonimestä 1930 search for text within image title or description 1930 hae tekstiä kuvan otsikosta tai kuvauksesta 1931 search known locations 1931 hae tunnetuista sijainneista 1932 search range 1932 hakualue 1933 search: 1933 haku: 1934 seconds 1934 sekuntia 1935 seconds to show with text 1935 sekuntia näytettäväksi tekstin kanssa 1936 seconds to show without text 1936 sekuntia näytettäväksi ilman tekstiä 1937 select all 1937 valitse kaikki 1938 select all colors within mouse (flood) 1938 valitse kaikki värit hiiren kohdalta (täyttö) 1939 select area missing or not finished 1939 aluevalinta puuttuu tai ei ole valmis 1940 select area within mouse 1940 valitse alue hiiren kohdalta 1941 select area within mouse circle 1941 valitse alue hiiren ympyrän sisältä 1942 select base image for color matching 1942 valitse perustakuva värin sovitusta varten 1943 select by color, required match level 1943 valitse värin mukaan, vaadittu sovitustaso 1944 select by color, search range 1944 valitse värin mukaan, hakualue 1945 select font 1945 valitse fontti 1946 select image to show with mouse paint 1946 valitse näytettävä kuva hiirimaalauksella 1947 select images randomly 1947 valitse kuvat satunnaisesti 1948 select initial files 1948 valitse alkutiedostot 1949 select line color 1949 valitse viivan väri 1950 select one color within mouse 1950 valitse yksi väri hiiren kohdalta 1951 select rectangle 1951 valitse suorakulmio 1952 select source image color first 1952 valitse ensin lähdekuvan väri 1953 select surrounding areas matching colors in mouse 1953 valitse ympäröivät alueet, jotka vastaavat hiiren kohdan värejä 1954 selection exceeds %d tags 1954 valinta ylittää %d tagia 1955 sepia 1955 seepia 1956 set a new date/time: 1956 aseta uusi päivämäärä/aika: 1957 set all 1957 aseta kaikki 1958 set current window size 1958 aseta nykyinen ikkunan koko 1959 set image color from input files 1959 aseta kuvan väri syötetiedostoista 1960 set location from world map 1960 aseta sijainti maailmankartalta 1961 set maximum crop 1961 aseta enimmäisrajaus 1962 shadow 1962 varjo 1963 shell command used for converting RAW files to RGB 1963 shell-komento RAW-tiedostojen muuntamiseen RGB:ksi 1964 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1964 shift + vasen klikkaus: poimi väri kuvasta \nvasen veto: maalaa väri kuvaan \noikea veto: palauta alkuperäinen kuva 1965 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1965 shift + vasen klikkaus: synkronoi kopiosijainti \nvasen veto: kopioi lähdekuva hiiren kohdalle \noikea veto: palauta alkuperäinen kuva 1966 shift existing date/time (+/–): 1966 siirrä olemassa olevaa päivämäärää/aikaa (+/–): 1967 shift+click on image to select color 1967 shift+klikkaus kuvaan valitaksesi värin 1968 shortcut function not found: %s 1968 pikanäppäimen toimintoa ei löydy: %s 1969 shortcut key: 1969 pikanäppäin: 1970 shortcut not found: %s 1970 pikanäppäintä ei löydy: %s 1971 show area outlines 1971 näytä alueiden ääriviivat 1972 show hidden files and folders 1972 näytä piilotetut tiedostot ja kansiot 1973 show transient objects 1973 näytä väliaikaiset kohteet 1974 size of mouse selection circle 1974 hiiren valintaympyrän koko 1975 smooth 1975 pehmeä 1976 source file: 1976 lähdetiedosto: 1977 source image failure (scale too big?) 1977 lähdekuvan virhe (skaala liian suuri?) 1978 source image scale 1978 lähdekuvan skaala 1979 specify a thumbnail folder 1979 määritä thumbnail-kansio 1980 specify at least 1 top image folder 1980 määritä vähintään 1 ylin kuvakansio 1981 specify background size and color 1981 määritä taustan koko ja väri 1982 specify files and keywords 1982 määritä tiedostot ja keywordit 1983 spot size limit 1983 pisteen kokoraja 1984 start 1984 aloita 1985 start a new script file 1985 aloita uusi skriptitiedosto 1986 start album 1986 aloitusalbumi 1987 start blob condensation process 1987 aloita väripalan tiivistysprosessi 1988 start file 1988 aloitustiedosto 1989 start folder 1989 aloituskansio 1990 start from first image in album 1990 aloita albumin ensimmäisestä kuvasta 1991 start fusion process 1991 aloita fuusioprosessi 1992 start over at end of album 1992 aloita alusta albumin lopussa 1993 start warp 1993 aloita vääristys 1994 start with previous image file, gallery of recent files, etc. 1994 aloita edellisestä kuvatiedostosta, viimeaikaisten tiedostojen galleriasta jne. 1995 startup album is invalid 1995 käynnistysalbumi on virheellinen 1996 startup file is invalid 1996 käynnistystiedosto on virheellinen 1997 startup folder is invalid 1997 käynnistyskansio on virheellinen 1998 status: %s \n 1998 tila: %s \n 1999 status: completed \n 1999 tila: valmis \n 2000 stay open 2000 pysy avoinna 2001 step 2001 vaihe 2002 stop 2002 pysäytä 2003 stop blob condensation process 2003 pysäytä väripalan tiivistysprosessi 2004 stop fusion process 2004 pysäytä fuusioprosessi 2005 supply a file name 2005 anna tiedostonimi 2006 tag name 2006 tag-nimi 2007 tag name %s not in xmeta tag list 2007 tag-nimi %s ei ole xmeta-tagilistassa 2008 tag value 2008 tag-arvo 2009 target file: 2009 kohdetiedosto: 2010 template 2010 malli 2011 test: show changes, do not update files 2011 testi: näytä muutokset, älä päivitä tiedostoja 2012 text 2012 teksti 2013 text file is defective 2013 tekstitiedosto on viallinen 2014 text time 2014 tekstin aika 2015 this function cannot be scripted 2015 tätä toimintoa ei voi skriptata 2016 thumbnail file 2016 thumbnail-tiedosto 2017 thumbnails deleted: %d \n 2017 thumbnaileja poistettu: %d \n 2018 thumbnails folder: %s \n 2018 thumbnails-kansio: %s \n 2019 tile area goal 2019 laatta-alueen tavoite 2020 tile gap 2020 laatan väli 2021 tile size 2021 laatan koko 2022 time 2022 aika 2023 title/desc. 2023 otsikko/kuvaus 2024 to add images to current set, \nsearch all images 2024 lisätäksesi kuvia nykyiseen joukkoon, \nhae kaikista kuvista 2025 to remove images from current set, \nsearch current set 2025 poistaaksesi kuvia nykyisestä joukosta, \nhae nykyisestä joukosta 2026 too many categories 2026 liikaa kategorioita 2027 too many files, cannot continue 2027 liikaa tiedostoja, ei voida jatkaa 2028 too many keywords in a category 2028 liikaa keywordeja kategoriassa 2029 top image folders: \n 2029 ylimmät kuvakansiot: \n 2030 transition 2030 siirtymä 2031 transitions 2031 siirtymät 2032 trash 2032 roskakori 2033 trimmed color chart file 2033 rajattu värikarttatiedosto 2034 unable to save bookmarks file 2034 kirjanmerkkitiedostoa ei voitu tallentaa 2035 unknown edit function: %s 2035 tuntematon muokkaustoiminto: %s 2036 unknown file type 2036 tuntematon tiedostotyyppi 2037 unknown or empty album: %s 2037 tuntematon tai tyhjä albumi: %s 2038 unsharp mask 2038 epäterävä maski 2039 update 2039 päivitä 2040 updating albums ...\n 2040 päivitetään albumeja ...\n 2041 upper 2041 ylempi 2042 upsize 2042 suurenna 2043 use 2043 käytä 2044 use a saved Mashup project 2044 käytä tallennettua Mashup-projektia 2045 use average 2045 käytä keskiarvoa 2046 use custom color palette 2046 käytä mukautettua väripalettia 2047 use median 2047 käytä mediaania 2048 use option to stop accidental quit 2048 käytä asetusta estääksesi vahinkosulkemisen 2049 use previous input 2049 käytä edellistä syötettä 2050 use previous location 2050 käytä edellistä sijaintia 2051 use prior edit step: 2051 käytä edellistä muokkausvaihetta: 2052 use the current image file 2052 käytä nykyistä kuvatiedostoa 2053 variance 2053 varianssi 2054 versions 2054 versiot 2055 vertical 2055 pystysuora 2056 video files not supported (install ffmpeg) 2056 videotiedostoja ei tueta (asenna ffmpeg) 2057 view album 2057 katsele albumia 2058 waiting 2058 odotetaan 2059 warp 2059 vääristä 2060 warp and align selected image with mouse drags 2060 vääristä ja kohdista valittu kuva hiirivedoilla 2061 warp and fine-align selected image with neighbor 2061 vääristä ja hienokohdista valittu kuva naapurin kanssa 2062 warp span 2062 vääristyksen laajuus 2063 wavelength 2063 aallonpituus 2064 width 2064 leveys 2065 writing updated image index file \n 2065 kirjoitetaan päivitettyä kuvaindeksitiedostoa \n 2066 x-count 2066 x-määrä 2067 x-offset 2067 x-siirtymä 2068 y-count 2068 y-määrä 2069 y-offset 2069 y-siirtymä 2070 years 2070 vuotta 2071 you can close this window now \n 2071 voit sulkea tämän ikkunan nyt \n 2072 you cannot use new name and replace text together 2072 et voi käyttää uutta nimeä ja tekstin korvausta yhdessä 2073 you must use either $s or $oldname 2073 sinun täytyy käyttää joko $s tai $oldname 2074 zoom image 2074 zoomaa kuvaa 2075 zoom via mouse wheel or Keys +/=/-/↑/↓ 2075 zoomaa hiiren rullalla tai näppäimillä +/=/-/↑/↓ 2076 zoom-in 2076 zoomaa sisään 2077 zoom-out 2077 zoomaa ulos fotocx/data/translations/ug_pl0000664000175000017500000102740515247006657015532 0ustar micomico- ^PODRĘCZNIK UŻYTKOWNIKA FOTOCX^ v.26.8 Wyświetl za pomocą menu Fotocx Pomoc > Podręcznik użytkownika - {UŻYTKOWANIE FOTOCX} {PIERWSZE URUCHOMIENIE} - lokalizowanie i indeksowanie plików obrazów dla szybkiego wyszukiwania {PODRĘCZNIK UŻYTKOWNIKA} ← ^kliknij tutaj^ - jak korzystać z przeglądarki tego podręcznika użytkownika {WIDOKI I MENU OKNA} - okna najwyższego poziomu i powiązane menu {WIDOK PLIKU} - okno Widok pliku (wyświetlanie pojedynczego pliku obrazu) {WIDOK GALERII} - okno Widok galerii (wyświetlanie folderu jako thumbnails) {WIDOK MAPY} - okno widoku mapy (wyświetlanie mapy ze znacznikami lokalizacji obrazów) {PRZECIĄGNIJ I UPUŚĆ} - metody przeciągania i upuszczania plików {EDYTUJ PROCEDURY} - jak edytować pliki obrazów {EDYTUJ WORKFLOW} - alternatywne metody edycji - proste i złożone {WŁASNOŚĆ MYSZY} - kontrola i interakcja myszy z oknem dialogowym {MYSZ ALT-PRAWY-PRZYCISK} - prawy przycisk myszy dla touchpadów/ekranów {PRZYCISKI OKNA DIALOGOWEGO} - opcje zakończenia okna dialogowego {KLAWISZ ESCAPE} - funkcje klawisza Escape {NIESTANDARDOWE WIDGETY OKIEN DIALOGOWYCH} - jak używać niestandardowych widgetów okna dialogowego {EDYCJA KRZYWEJ} - jak manipulować krzywymi używanymi w funkcjach edycji {MOUSE PAINTING} - lokalna edycja obrazu za pomocą myszy {PRZETWARZANIE MASOWE} - przegląd funkcji przetwarzania masowego {WYBIERZ PLIKI OBRAZÓW} - procedura wyboru plików obrazów {SKRÓTY} - menu podręczne, skróty klawiszowe, niestandardowe menu użytkownika {FUNKCJE MYSZY} - funkcje myszy dla widoków pliku/galerii/mapy {PARAMETRY POLECENIA} - parametry wiersza poleceń Fotocx - {MENU PLIKU} {NOWA SESJA} - rozpocznij nową sesję Fotocx w osobnym oknie {OTWÓRZ PLIK OBRAZU} - otwórz plik obrazu do wyświetlenia lub edycji {PRZEŁĄCZAJ 2 PLIKI} - przełączaj między dwoma ostatnio wyświetlanymi plikami obrazów {PRZEŁĄCZAJ 3 PLIKI} - przełączaj między trzema ostatnio wyświetlanymi plikami obrazów {WIDOK PANORAMY 360°} - obraz panoramy 360° z obracającym się punktem widzenia {PUSTY OBRAZ} - utwórz pusty obraz o określonym rozmiarze i kolorze {PUSTY OBRAZ} - utwórz nowy pusty obraz {KOPIUJ/PRZENIEŚ} - skopiuj lub przenieś plik obrazu do innego folderu {KOPIUJ NA PULPIT} - skopiuj plik obrazu na pulpit {KOPIUJ DO SCHOWKA} - skopiuj plik obrazu do schowka {USUŃ/KOSZ} - usuń lub wyrzuć do kosza plik obrazu {USTAW TAPETĘ} - ustaw tapetę pulpitu z bieżącego pliku obrazu {DRUKUJ OBRAZ} - wydrukuj plik obrazu {DRUKUJ SKALIBROWANE} - drukuj używając danych kalibracji koloru {KALIBRACJA DRUKARKI} - skalibruj kolor drukarki - skompensuj przesunięcia koloru - {MENU GALERII} {PRZEGLĄD GALERII} {WIDOK THUMB} - Widok galerii z thumbnails i nazwami plików {WIDOK METADATA} - Widok galerii z thumbnail i podstawowymi metadata {OSTATNIE PLIKI} - Widok galerii ostatnio wyświetlanych plików obrazów {NAJNOWSZE PLIKI} - Widok galerii najnowszych plików obrazów {SORTOWANIE GALERII} - zmień kolejność sortowania galerii {FILTR GALERII} - wybierz najnowsze, najstarsze, pasujący wzorzec ... {GALERIA - START} - przejdź do początku galerii {KONIEC GALERII} - przejdź do końca galerii {FOLDER BIEŻĄCEGO PLIKU} - ustaw bieżącą galerię z folderu bieżącego pliku {OSTATNIE FOLDERY} - wyświetl listę ostatnio przeglądanych folderów, wybierz {DRZEWO FOLDERÓW} - wyświetl foldery plików obrazów w strukturze drzewa, wybierz {WYBIERZ PLIKI} - wybierz pliki jako wejście do funkcji masowej, skryptu lub albumu {ZAKŁADKI} - wyświetl listę zakładek, przejdź do zakładki {EDYTUJ ZAKŁADKI} - dodaj, usuń, uporządkuj zakładki - {MAPS MENU} {MAPA ŚWIATA} - przegląd internetowej mapy świata {POKAŻ NA MAPIE} - pokaż pozycję bieżącego obrazu na mapie - {MENU ALBUMÓW} {ALBUMY} - twórz i porządkuj kolekcje obrazów {UTWÓRZ ALBUM} - utwórz nowy album (galerię wybranych obrazów) {ZMIEŃ NAZWĘ ALBUMU} - zmień nazwę istniejącego albumu {USUŃ ALBUM} - usuń istniejący album {WYBIERZ ALBUM} - wybierz album i wyświetl galerię obrazów {BIEŻĄCY ALBUM} - pokaż bieżący (ostatnio używany) album {GALERIA DO ALBUMU} - zapisz bieżącą galerię jako nazwany album {EDYTUJ ALBUM} - dodaj, usuń, uporządkuj pliki obrazów w galerii albumu {AKTUALIZUJ ALBUMY} - aktualizuj albumy dla zaktualizowanych plików obrazów (nowe wersje) {MASOWA AKTUALIZACJA ALBUMU} masowa aktualizacja albumów (dodawanie/usuwanie/zastępowanie plików członkowskich) {POKAZ SLAJDÓW} - pokaz slajdów z animowanymi przejściami obrazów i przesuwaniem/zoom - {MENU NIESTANDARDOWE} - niestandardowe menu użytkownika dla często używanych funkcji {PLIKI SKRYPTÓW} - przegląd plików skryptów {EDYTUJ SKRYPT} - nagrywaj edycje w skrypcie, aby utworzyć niestandardową funkcję edycji {URUCHOM SKRYPT} - wykonaj skrypt na bieżącym obrazie {SKRYPT MASOWY} - wykonaj skrypt na wybranych plikach obrazów {WTYCZKI} - uruchom funkcję edycji wtyczki, otwórz plik wyjściowy wtyczki - {ZOOM} - zoom obrazu lub thumbnails za pomocą myszy lub klawiatury - {POPRZ./NAST.} - przejdź do poprzedniego lub następnego obrazu za pomocą myszy lub klawiatury - {ZAPIS PLIKU} - zapisz plik obrazu (zastąp, nowa wersja, nowa nazwa pliku) - {MENU METADATA} {POKAŻ META GŁÓWNE} - wyświetl listę głównych metadata obrazu {POKAŻ WSZYSTKIE META} - wyświetl listę wszystkich metadata obrazu {PRZEGLĄD KEYWORDS} - keywords używane do wyszukiwania obrazów {GEOTAGS OVERVIEW} - nazwy lokalizacji i geowspółrzędne do wyszukiwania {EDYTUJ META GŁÓWNE} - edytuj powszechnie używane metadata {EDYTUJ DOWOLNE META} - edytuj dowolne metadata (dodaj, usuń, zmień) {USUŃ META} - usuń określone metadata lub wszystkie metadata {KOPIUJ META} - skopiuj metadata z jednego pliku obrazu do drugiego {NAPRAW META} - napraw nieprawidłowo sformułowane metadata uniemożliwiające edycję metadata {ZARZĄDZAJ KEYWORDS} - zarządzaj keywords zdefiniowanymi przez użytkownika {PODPISY} - pokaż nazwę pliku, tytuł, opis w rogu obrazu {MIEJSCA/DATY} - wyświetl listę lokalizacji/dat obrazów, kliknij, aby zobaczyć galerię {OŚ CZASU} - pokaż liczbę obrazów według roku/miesiąca, kliknij, aby zobaczyć galerię {TAGS METADATA} - pokaż liczbę obrazów według wartości tag, kliknij, aby zobaczyć galerię {AUTOWYSZUKIWANIE} - zeskryptowana funkcja wyszukiwania do znajdowania plików {WYSZUKAJ OBRAZY} - szukaj używając dowolnych metadata lub nazw folderów/plików - {MENU WYBORU} {PRZEGLĄD OBSZARU} - wybór obszaru - koncepcje i zastosowanie {WYBIERZ OBSZAR} - wybierz element lub obszar obrazu do osobnej edycji {ZNAJDŹ LUKĘ W OBSZARZE} - znajdź lukę w ręcznie narysowanym obrysie obszaru {MIESZANIE OBSZARU} - mieszaj myszą edycje wykonane w obrębie wybranego obszaru {POKAŻ/UKRYJ OBSZAR} - pokaż lub ukryj obrysy obszarów {WŁĄCZ/WYŁĄCZ OBSZAR} - włącz lub wyłącz obszar do edycji {ODWRÓĆ OBSZAR} - odwróć obszar (zamień obszary zewnętrzne/wewnętrzne) {WYCZYŚĆ OBSZAR} - usuń obszar {KOPIUJ/WKLEJ OBSZAR} - skopiuj obszar lub wklej obszar do bieżącego obrazu {WCZYTAJ/ZAPISZ OBSZAR} - wczytaj obszar z pliku lub zapisz do pliku - {PRZYCISK COFNIJ/PONÓW} - sekwencyjne cofanie lub ponawianie edycji bieżącego obrazu - {MENU EDYCJI} {OBRÓĆ} - obróć lub wypoziomuj obraz {PROSTUJ} - wyprostuj obrócony lub odbity lustrzanie obraz {KADRUJ} - kadruj (przytnij) marginesy obrazu {RETUSZ} - edytuj jasność, kontrast, kolor, nasycenie {PRZESKALUJ} - zmień wymiary pikseli obrazu {PODZIELONY EKRAN} - wyświetl zmiany przed/po za pomocą podzielonego ekranu {POKAŻ RÓŻNICE} - podświetl zmiany podczas edycji (lub dowolnych dwóch obrazów) {MARGINESY} - dodaj marginesy do obrazu, dowolny kolor lub przezroczystość {OZNACZENIA} - rysuj na obrazie: tekst, linia/strzałka, prostokąt, owal {TRYB KOLORU} - konwertuj na czarno-biały, kolor, negatyw, pozytyw {MALOWANE EDYCJE} - maluj myszą funkcję edycji lokalnie i stopniowo {MALUJ OBRAZ} - maluj myszą kolorem, o określonym rozmiarze pędzla i kryciu {MALUJ PRZEZROCZYSTOŚĆ} - maluj rosnącą przezroczystość za pomocą myszy {WYPEŁNIENIE OBSZARU} - wypełnij wybrane obszary lub przezroczyste obszary kolorem {KOPIUJ W OBRAZIE} - kopiuj piksele w obrębie obrazu za pomocą myszy {KOPIUJ Z OBRAZU} - kopiuj piksele z innego obrazu za pomocą myszy {KOPIUJ POPRZEDNIĄ EDYCJĘ} - kopiuj piksele z poprzednich edycji za pomocą myszy - {MENU NAPRAWY} {WYOSTRZ} - wyostrz rozmyty obraz, wiele metod {ROZMYCIE} - rozmyj obraz lub obszar obrazu, wiele metod {REDUKCJA SZUMU} - zredukuj szum obrazu (drobne losowe plamki) {USUŃ MGŁĘ} - dodaj lub usuń mgłę/zamglenie z obrazu lub wybranego obszaru {CZERWONE OCZY} - usuń czerwone oczy ze zdjęć z lampą błyskową {INTELIGENTNE USUWANIE} - usuń linie energetyczne, znaki, inne drobne elementy zakłócające {USUŃ HALO} - usuń halo pozostawione przez wyostrzanie i inne funkcje {ARTEFAKTY JPEG} - tłum artefakty w mocno skompresowanych plikach {WYGŁADZANIE KRAWĘDZI} - tłum pikselizację (schodkowanie) wzdłuż krawędzi elementów {DOSTOSUJ RGB} - dostosuj kolory obrazu za pomocą kolorów RGB lub CMY {DOSTOSUJ HSL} - wybierz i zmień kolory za pomocą modelu koloru HSL {USUŃ KURZ} - usuń plamki kurzu na obrazach ze starych zdjęć {OBWÓDKI} - napraw obwódki koloru na krawędziach (aberrację chromatyczną) - {MENU DOPRACOWANIA} {SPŁASZCZ HISTOGRAM} - spłaszcz histogram jasności dla lepszych szczegółów {KONTRAST LOKALNY} - dodaj kontrast dostosowany do lokalnej jasności obszaru {WZMOCNIJ KONTRAST} - wzmocnij istniejący kontrast, aby uwydatnić szczegóły {RETINEX GLOBALNY} - przeskaluj wartości RGB dla większego zakresu {RETINEX LOKALNY} - przeskaluj wartości RGB dla większego zakresu {NASYCENIE} - dostosuj nasycenie koloru na podstawie jasności {MIĘKKA OSTROŚĆ} - zastosuj klasyczny efekt "miękkiej ostrości" do obrazu {GRADIENT JASNOŚCI} - dodaj gradient jasności/koloru na obrazie {WINIETA} - zmień jasność/kolor promieniście wokół wybranego środka - {MENU EFEKTÓW} {OBRYSY} - przekształć obraz w rysunek konturowy {SZKIC1} - przekształć obraz w symulowany szkic (1) {SZKIC2} - przekształć obraz w symulowany szkic (2) {KARYKATURA} - przekształć obraz w rysunek przypominający karykaturę {WYTŁOCZENIE} - przekształć obraz w symulowane wytłoczenie (efekt 3D) {KAFELKI1} - przekształć obraz w kwadratowe kafelki z efektem 3D {KAFELKI2} - przekształć obraz w nieregularne kafelki dopasowane do obrazu {MALARSTWO} - przekształć obraz w symulowany obraz malarski {TEKSTURA} - dodaj teksturę do obrazu lub wybranego obszaru {FUZJA} - tłum drobne szczegóły, zachowując ostrość {DOPASUJ KOLORY} - dopasuj kolory w jednym obrazie do innego obrazu {WZÓR} - dodaj wzór tła do obrazu {KRATKOWANIE} - przekształć w szkic używając krzyżujących się równoległych linii {DITHERING} - różne sposoby pikselizacji lub posteryzacji obrazu {GRAWEROWANIE} - przekształć obraz w czarno-białe linie {DODAJ POŚWIATĘ} - dodaj poświatę wokół jasnych obiektów na obrazie {MOZAIKA} - przekształć obraz w mozaikę z kafelków utworzonych z obrazów {DODAJ SZUM} - dodaj losowy szum do obrazu {USTAW KOLORY} - zredukuj liczbę kolorów (posteryzacja) {PRZESUŃ KOLORY} - stopniowo przesuń kolory RGB na GBR lub BRG {OBCE KOLORY} - dodaj losowe dziwne kolory do obrazu {WŁASNE JĄDRO} - edytuj i zastosuj własne jądro konwolucji - {MENU WYPACZANIA} {WYGNIJ} - wyprostuj obrazy z zakrzywionymi liniami, zwłaszcza panoramy {PERSPEKTYWA} - wyprostuj obiekt sfotografowany pod rozwartym kątem {WYPACZ OBSZAR} - wypacz wybrany obszar obrazu, przeciągając myszą {WARP LINEAR1} - wypacz obraz przeciągnięciem myszy - wypaczenie liniowe 1 {WARP LINEAR2} - wypacz obraz przeciągnięciem myszy - wypaczenie liniowe 2 {WYPACZ ZAKRZYWIENIE} - wypacz obraz przeciągnięciem myszy - wypaczenie krzywe {WYPACZ AFINICZNIE} - wypacz obraz przeciągnięciem myszy - linie równoległe zachowane {WYPACZ RADIALNIE} - dodaj lub usuń dystorsję beczkową lub poduszkową {ROZWYPACZ ZBLIŻENIE} - usuń zniekształcenie zbliżenia zdjęcia twarzy (duży nos) {TWÓRZ FALE} - wypacz obraz wzorem fali {SKRĘĆ} - skręć obraz wokół wybranego punktu środkowego {SFERA} - zakrzyw obraz w kształt sferoidalny {NA LEWĄ STRONĘ} - odwróć odległość środek-krawędź każdego piksela {TINY PLANET} - owiń obraz panoramy wokół koła {SPIRALA ESCHERA} - przekształć obraz w niekończącą się spiralę do wewnątrz {SPŁASZCZ ZDJĘCIE} - spłaszcz zdjęcie zakrzywionej powierzchni - {MENU ŁĄCZENIA} {HDR} - połącz ciemne/jasne obrazy dla rozszerzonego zakresu jasności {HDF} - połącz obrazy ostre z bliska/z daleka dla rozszerzonej głębi ostrości {STOS/MALOWANIE} - połącz obrazy, aby usunąć przejeżdżające samochody, turystów itp. {STOS/SZUM} - połącz obrazy, aby zredukować szum poprzez uśrednianie {STOS/WARSTWY} - połącz wersje obrazu, wybierz/maluj obszar/wersję {PANORAMA} - połącz serię obrazów poziomo {POKAŻ PLIKI CIM} - pokaż pliki wejściowe dla bieżącego/najnowszego połączonego obrazu {MASHUP} - uporządkuj obrazy i sformatowany tekst w niestandardowym układzie {TABLICA OBRAZÓW} - połącz wiele obrazów w kompaktowy format tablicy - {MENU MASOWE} {MASOWA KONWERSJA} - kopiuj, przenoś, przeskaluj, zmień nazwę, konwertuj, dodaj tekst ... {MASOWE KOPIOWANIE/PRZENOSZENIE} - kopiuj/przenoś wybrane pliki obrazów do nowego folderu {MASOWE PROSTOWANIE} - skanuj w poszukiwaniu obróconych plików obrazów i wyprostuj je {MASOWE USUWANIE/KOSZ} - usuń lub wyrzuć do kosza wybrane pliki obrazów {MASOWA NAKŁADKA} - dodaj obraz nakładki (prawa autorskie ...) do wybranych obrazów {MASOWE KEYWORDS} - dodaj lub usuń keywords dla wybranych plików obrazów {MASOWA ZMIANA NAZW KEYWORDS} - zmień nazwę lub usuń keywords dla wszystkich plików obrazów {MASOWE USUWANIE KEYWORDS} - usuń niechciane keywords ze wszystkich plików obrazów {MASOWA DATA ZDJĘCIA} - zmień daty lub czasy zdjęć, lub przesuń strefę czasową {MASOWA ZMIANA META} - dodaj lub popraw metadata dla wybranych plików obrazów {MASOWY RAPORT META} - zgłoś metadata dla wybranych lub wszystkich plików obrazów {MASOWE GEOTAGS} - dodaj lub popraw geotags dla wybranych lub wszystkich plików obrazów {EKSPORTUJ PLIKI} - eksportuj wybrane pliki do folderu (np. przesyłanie na stronę www) - {MENU NARZĘDZI} {INDEKSUJ PLIKI} - jednorazowe zadanie znajdowania i indeksowania wszystkich plików obrazów {PRZENIEŚ FOLDER DOMOWY FOTOCX} - przenieś folder domowy Fotocx (dane i ustawienia użytkownika) {USTAWIENIA} - preferencje i ustawienia użytkownika dla działania Fotocx {SKRÓTY KLAWISZOWE} - pokaż i zmień skróty klawiszowe dla funkcji menu {HISTOGRAM RGB} - wykres histogramu jasności dla bieżącego obrazu {POWIĘKSZ OBRAZ} - zamień mysz w szkło powiększające nad obrazem {MIERZ OBRAZ} - mierz odległości pikseli w obrębie obrazu (kliknięcia myszy) {POKAŻ RGB} - pokaż wartości RGB w pozycji myszy lub dla wybranych punktów {USTAWIENIA SIATKI} - pokaż lub usuń linie siatki, ustaw liczbę linii lub odstęp {KOLOR LINII} - ustaw kolor dla obrysów wybranego obszaru {CIEMNE/JASNE PIKSELE} - narzędzie do podświetlania obcięcia {KOLOR MONITORA} - dostosuj jasność i kontrast monitora {ZNAJDŹ DUPLIKATY} - znajdź zduplikowane obrazy w galerii lub wszystkich obrazach {ZNAJDŹ USZKODZONE PLIKI} - znajdź nieodczytywalne pliki obrazów, usuń/przenieś/napraw {POKAŻ ZASOBY} - pokaż czas CPU i bieżące użycie pamięci {TŁUMACZENIA} - twórz lub modyfikuj tłumaczenia GUI - {MENU POMOCY} - podręcznik użytkownika, samouczek, dziennik zmian, o programie Fotocx, odinstaluj - {INNE TEMATY} {VIDEO FILES} - pliki wideo, thumbnails, odtwarzanie wideo {SLAJDY I NEGATYWY} - jak przechwytywać slajdy i negatywy filmowe {OGRANICZENIA FOTOCX} - limity rozmiaru i wydajności {FOTOCX DLA WINDOWS 11} - instalacja Fotocx na Windows 11 WSL {PRYWATNOŚĆ} - polityka prywatności i ochrony danych Fotocx {PROBLEM, QUESTION, SUGGESTION} - skontaktuj się z autorem Fotocx - - TOPIC: UŻYTKOWANIE FOTOCX - - TOPIC: PIERWSZE URUCHOMIENIE - ^Programy zewnętrzne Fotocx zgłasza wymagane i opcjonalne programy zewnętrzne oraz funkcję, jaką każdy z nich zapewnia. Jeśli brakuje jakichś wymaganych programów, zainstaluj je i uruchom Fotocx ponownie. - ^Pierwszy indeks Fotocx zindeksuje twoje pliki obrazów. Dzięki temu strony galerii (thumbnails) wyświetlają się szybko, umożliwia to szybkie wyszukiwanie na podstawie zindeksowanych metadata oraz umożliwia klikalne znaczniki mapy do przeglądania obrazów według lokalizacji. Musisz wprowadzić jeden lub więcej 'głównych' folderów obrazów (np. /home//Pictures). Podfoldery są uwzględniane automatycznie. Pliki nieobrazowe w tych folderach są ignorowane. Użyj przycisku [select], aby zlokalizować i dodać główne foldery obrazów. Praktyczny limit to około 30 folderów głównych. Każdy może mieć setki podfolderów. - ^Thumbnails To jest folder, w którym będą umieszczane pliki thumbnail. Użyj dostarczonej wartości domyślnej lub wybierz inną lokalizację. - ^Czas indeksowania Szybkość indeksowania może wynosić od kilkuset do >10 tys. plików/minutę, w zależności od typu i rozmiaru twoich plików obrazów oraz szybkości komputera. Gdy dodasz nowe pliki obrazów do swojej kolekcji, następne uruchomienie Fotocx zindeksuje nowe pliki. Jeśli jest wiele nowych plików, uruchomienie będzie potrzebować czasu, aby je zindeksować. - ^Konsolidacja tytułu i opisu obrazu Funkcja indeksowania obrazów Fotocx zastępuje brakujące metadata tytułu i opisu jednym z wielu alternatywnych tags metadata, jeśli są dostępne: headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. Odbywa się to po to, abyś zawsze mógł przeglądać/edytować/wyszukiwać, używając tylko 'title' i 'description'. Ten proces konwersji jest stosunkowo wolny (2200 plików/minutę na moim mocnym komputerze). Odbywa się to, gdy nowe pliki obrazów są indeksowane po raz pierwszy. Nic nie jest usuwane. - - TOPIC: PODRĘCZNIK UŻYTKOWNIKA Otwórz podręcznik użytkownika z menu Pomoc > Podręcznik użytkownika. Podczas korzystania z Fotocx możesz nacisnąć F1, aby wyświetlić temat podręcznika użytkownika dla bieżącej lub ostatnio używanej funkcji menu. - Aby przewijać tekst, użyj klawiszy strzałka-góra/dół i page-up/down. Przycisk [Znajdź] otwiera okno dialogowe do wyszukiwania tekstu. Naciśnij [Znajdź] ponownie, aby przejść do następnego wystąpienia. - Pogrubiony tekst pisany wielkimi literami jest klikalnym odnośnikiem do tematu, np. {INDEKSUJ PLIKI}. Użyj przycisków [<] i [>], aby przechodzić tam i z powrotem między ostatnio przeglądanymi tematami. Przycisk [Recent] przedstawia klikalną listę ostatnio przeglądanych tematów. - - TOPIC: WIDOKI I MENU OKNA +image: fotocx-views.jpg - ^Przyciski menu Po kliknięciu menu pojawia się podręczne podmenu. Trzy górne menu (Plik, Galeria, Mapy) ustawiają odpowiedni tryb widoku. Można także użyć klawiszy F/G/M. - - TOPIC: WIDOK PLIKU Jeden obraz wypełnia całe okno Fotocx. Zoom za pomocą kliknięcia lewym/prawym przyciskiem myszy. Klawisz Z przełącza między dopasowaniem do okna a rozmiarem 1x obrazu (1 piksel obrazu = 1 piksel wyświetlacza). Aby przesunąć powiększony obraz, przeciągnij lewym przyciskiem myszy po obrazie. Kółko myszy również może przybliżać lub oddalać obraz (zoom). Użyj przycisków menu (Edytuj, Napraw itp.), aby zmodyfikować obraz. Użyj przycisku Zapis pliku, aby zapisać zmodyfikowany plik: zastąp, utwórz nową wersję lub utwórz nowy plik (nowa nazwa). - ^Klawiaturowe strzałki lewo/prawo Wyświetl poprzedni lub następny plik obrazu w bieżącej galerii. - ^strzałki góra/dół Jak wyżej, ale pokazywane są tylko ostatnie wersje, lub oryginał, jeśli nie istnieją żadne wersje. - - TOPIC: WIDOK GALERII Wszystkie pliki obrazów w bieżącej galerii są pokazane jako tablica thumbnails. - ^Typy galerii • Folder: wszystkie pliki obrazów i podfoldery w pojedynczym folderze (katalogu) • Album: pliki obrazów z różnych folderów, uporządkowane przez użytkownika • Ostatnie pliki: ostatnio przeglądane lub edytowane pliki obrazów • Najnowsze pliki: pliki obrazów ostatnio dodane lub zmodyfikowane • Wyniki wyszukiwania: obrazy znalezione przez funkcję wyszukiwania. Również album. - ^Funkcje galerii • kliknięcie lewym przyciskiem na thumbnail obrazu: otwórz obraz w trybie Widok pliku • kliknięcie prawym przyciskiem na thumbnail obrazu: menu podręczne z popularnymi funkcjami • kliknięcie na thumbnail folderu: otwórz ten folder w trybie Galeria • Pasek TOP galerii folderu: foldery nadrzędne - kliknij, aby tam przejść • przycisk [TOP]: lista folderów najwyższego poziomu - kliknij, aby tam przejść • paski przewijania: przewijaj w górę/w dół w obrębie galerii • strzałki góra/dół: przewiń galerię o jeden wiersz • klawisze page up/down: przewiń galerię o jedną stronę • klawisze home/end: przejdź do początku (góra) i końca (dół) galerii • kółko myszy: przewijaj galerię w górę i w dół • klawisze [+] i [-]: zwiększ/zmniejsz rozmiar thumbnail - ^Wyskakujące obrazy galerii • Kliknij thumbnail środkowym przyciskiem myszy, aby uzyskać wyskakujący obraz • Kliknij thumbnail za pomocą shift + lewy przycisk myszy, aby uzyskać wyskakujący obraz • Kliknięcie lewym na wyskakującym obrazie: powiększ obraz (zoom) • Kliknięcie prawym na wyskakującym obrazie: zamknij wyskakujący obraz • Kółko przewijania myszy: zoom wyskakującego obrazu, większy lub mniejszy • Klawisz F11: ustaw wyskakujący obraz na pełny ekran • Klawisz Escape: zamknij wyskakujący obraz • Można użyć wielu wyskakujących okien, aby porównać obrazy - - TOPIC: WIDOK MAPY Wyświetl mapy zawierające znaczniki odpowiadające lokalizacjom obrazów. Kliknij znacznik, aby uzyskać galerię odpowiadających obrazów. Zależy to od tego, czy twoje pliki obrazów mają osadzone geowspółrzędne (latitude, longitude). Nowoczesne aparaty wstawiają to automatycznie, a ty również możesz dodać te dane samodzielnie. Początkowo wyświetlana jest mapa świata. Użyj kółka myszy, aby przybliżyć/oddalić (zoom) w dowolnej lokalizacji. Przeciągnij, aby przesunąć środek mapy. Cały świat można przeglądać w dowolnej skali, aż do poziomu ulicy. - - TOPIC: PRZECIĄGNIJ I UPUŚĆ Jeśli otworzysz dwie sesje Fotocx, możesz przeciągać i upuszczać pliki z jednej do drugiej. Przeciągnij thumbnail galerii z jednego okna do drugiego. Jeśli jest to Widok pliku, plik zostaje otwarty. Jeśli jest to Widok galerii, wynik zależy od typu galerii. Jeśli galeria jest folderem, plik zostaje dodany do folderu, a galeria pokaże nowy plik na jego posortowanej pozycji. Jeśli galeria jest albumem, plik zostaje dodany do albumu w miejscu, w którym został upuszczony. - - TOPIC: EDYTUJ PROCEDURY Obraz w trybie Widok pliku (bieżący obraz) można modyfikować za pomocą funkcji edycji w menu Edytuj, Napraw, Dopracuj, Efekty, Wypaczanie i Łączenie. Funkcje te modyfikują bieżący obraz w pamięci i w oknie. W miarę korzystania z tych funkcji edycje są akumulowane. Po zakończeniu edycji użyj przycisku menu [Zapisz], aby zapisać zmodyfikowany obraz z powrotem do tego samego pliku, do nowej wersji (np. filename.v01.jpg) lub do nowego pliku i/lub folderu. Okna dialogowe edycji obrazu zawierają suwaki, przyciski, przyciski liczbowe (spin) lub edytowalne krzywe, które natychmiast aktualizują obraz. - Kliknij lewym lub prawym przyciskiem przycisk Cofnij/Ponów, aby cofnąć lub ponowić obecnie aktywną funkcję edycji. Po zastosowaniu do obrazu jednej lub więcej edycji, przycisku cofnij/ponów można użyć, aby przechodzić tam i z powrotem przez wszystkie wykonane kroki, aby zobaczyć stan obrazu po każdym kroku. Środkowy przycisk myszy pokazuje wyskakującą listę wszystkich edycji wykonanych na bieżącym obrazie, a ty możesz wybrać dowolny krok, do którego chcesz wrócić. Obraz można ponownie edytować od dowolnego wcześniejszego kroku. Spowoduje to odrzucenie edycji wykonanych po tym kroku, ponieważ zostały one wyprowadzone z tego kroku. Ta możliwość cofania/ponawiania pozostaje dostępna tak długo, jak edytowany obraz pozostaje bieżącym obrazem. Jeśli zostanie otwarty inny obraz, historia edycji zostanie odrzucona. Jeśli chcesz zachować możliwość powrotu do bieżącego stanu obrazu, zapisz obraz jako nową wersję przed kontynuowaniem z kolejną edycją. - - TOPIC: EDYTUJ WORKFLOW - ^Prosty workflow Przez większość czasu możesz po prostu edytować plik JPEG, który pochodzi z aparatu. Użyj poniższej bardziej złożonej procedury tylko wtedy, gdy widzisz pasy koloru po edycjach, które rozszerzyły zakres jasności w niektórych obszarach obrazu, sprawiając, że kroki jasności są wystarczająco duże, aby je zobaczyć. - ^Złożony workflow Aby edytować z głęboką głębią koloru (ponad 8 bitów na kolor RGB), zacznij od pliku RAW z aparatu. Plik RAW można edytować jak każdy inny plik obrazu. Funkcje edycji Fotocx działają z 24 bitami na kolor, więc pełna głębia koloru pliku RAW jest zachowana. Gdy otwierasz plik RAW, używany jest wybrany loader RAW - zobacz {USTAWIENIA}. Możesz też użyć Masowej konwersji, aby przekonwertować wiele plików RAW na pliki TIFF, PNG lub JXL z 16 bitami na kolor. - Dcraw jest domyślnym loaderem plików RAW. Możesz też użyć bardziej złożonego edytora RAW, takiego jak Rawtherapee - zobacz {USTAWIENIA}. Dcraw jest w porównaniu prosty i szybki. Funkcje edycji w edytorze RAW zwykle można łatwiej wykonać za pomocą Fotocx. - - TOPIC: WŁASNOŚĆ MYSZY Niektóre okna dialogowe edycji używają myszy do odwoływania się do obrazu w oknie głównym lub jego zmiany. W tym samym czasie może być aktywnych więcej niż jedno takie okno dialogowe. Mysz jest również używana do powiększania (zoom) i przewijania obrazu, a może być potrzebne robienie tego podczas korzystania z okna dialogowego edycji. Dlatego ważne jest, aby rozumieć, które okno dialogowe lub okno posiada mysz i jak zmienić tę własność: • Jeśli okno dialogowe ma fokus klawiatury, działania myszy na obrazie są wejściami do tego okna dialogowego i nie powiększają (zoom) ani nie przewijają obrazu. • Jeśli przytrzymasz klawisz CTRL podczas klikania lub przeciągania myszą po obrazie, obraz zostanie powiększony (zoom) lub przesunięty/przewinięty. Otwarte okna dialogowe nie są tym objęte. • Kółko myszy może przybliżać/oddalać (zoom) w dowolnym miejscu obrazu. - - TOPIC: MYSZ ALT-PRAWY-PRZYCISK W przypadku touchpadów lub ekranów dotykowych kliknięcia prawym przyciskiem myszy mogą być niewygodne. Jeśli klawisz ALT jest przytrzymany podczas naciskania lewego przycisku myszy, jest to interpretowane jako prawy przycisk myszy. - - TOPIC: PRZYCISKI OKNA DIALOGOWEGO Działają one zazwyczaj w następujący sposób: • [Resetuj] - cofnij bieżącą edycję, przywróć obraz do stanu początkowego • [Zastosuj] - zastosuj ustawienia okna dialogowego do obrazu, pozostaw okno dialogowe aktywne • [OK] - to samo co [Zastosuj], ale okno dialogowe zostaje zamknięte • [Anuluj] - odrzuć zmiany obrazu i zamknij okno dialogowe • [Kontynuuj] - kontynuuj długotrwałe zadanie na podstawie danych wejściowych okna dialogowego • [X] - zamknij okno dialogowe bez żadnej akcji - - TOPIC: KLAWISZ ESCAPE Okno główne ma fokus: • jeśli długo działająca funkcja nadal jest uruchomiona, przerwij ją • jeśli okno główne jest zmaksymalizowane, przywróć poprzedni rozmiar • jeśli bieżący widok to galeria lub mapa, zmień na widok pliku • żadne z powyższych: zamknij Fotocx Okno dialogowe ma fokus: zamknij okno dialogowe (to samo co przycisk [X]) Inne: anuluj wyskakujący obraz, zakończ przeglądarkę panoramy 360, wstrzymaj lub zakończ pokaz slajdów. - - TOPIC: NIESTANDARDOWE WIDGETY OKIEN DIALOGOWYCH +image: custom-widgets.png - Niektóre niestandardowe widgety są używane, aby zmniejszyć rozmiar okna dialogowego lub poprawić łatwość użycia. Działają niemal jak standardowe widgety GTK. Widget danych liczbowych działa jak spin-button GTK: kółko myszy oraz klawiszowe strzałki góra/dół mogą być używane do szybkiego zwiększania lub zmniejszania wartości. Jeśli używasz touchpada, stuknij w pole, aby ustawić kursor, a następnie użyj klawiatury, aby wprowadzić wartość, lub użyj klawiszowych strzałek góra/dół, aby szybko przejść do nowej wartości. Jeśli klawisz jest przytrzymany, tempo zmiany przyspiesza z czasem. Klawisz shift może być użyty, aby zwiększyć tempo 10x. Nieliniowy suwak rozszerza skalę wokół wartości neutralnej, dzięki czemu małe zmiany można kontrolować precyzyjniej, szczególnie za pomocą touchpada. Kilka standardowych widgetów GTK zostało zmniejszonych poprzez usunięcie nadmiarowego marginesu wewnętrznego. Jest to kontrolowane przez plik 'widgets.css' w folderze domowym Fotocx. Możesz zmodyfikować ten plik, jeśli chcesz. Możesz usuwać elementy lub oznaczać je jako komentarze, ale nie usuwaj pliku - zostałby on automatycznie zastąpiony. - - TOPIC: EDYCJA KRZYWEJ +image: retouch.png - Niektóre funkcje edycji obrazu używają edytowalnych krzywych. Możesz manipulować krzywymi, aby zmienić jakąś właściwość obrazu w zależności od innej właściwości. Krzywe można przesuwać (przeciągać) myszą. Punkt zakotwiczenia (czarna kropka) jest dodawany do krzywej w miejscu, gdzie jest ona przeciągana, i ten punkt pozostaje ustalony - krzywa będzie nadal przechodzić przez ten punkt, gdy inne części krzywej są przeciągane. Punkt zakotwiczenia można przesunąć, przeciągając go, lub usunąć, klikając prawym przyciskiem. - - TOPIC: MOUSE PAINTING Mysz może być użyta do lokalnej edycji obrazu. Koło wokół pozycji myszy obejmuje obszar obrazu, który jest modyfikowany podczas przeciągania myszy lewym przyciskiem po obrazie. Źródłem modyfikacji może być funkcja edycji, wybrany kolor lub piksele z innego miejsca tego samego obrazu lub z innego obrazu. Piksele obrazu wewnątrz koła myszy są modyfikowane tak, aby pasowały do źródła. Tempo zmiany może być szybkie lub stopniowe, w zależności od współczynników mocy dla środka i krawędzi myszy. Jeśli współczynnik środka jest wysoki, a współczynnik krawędzi niski, obraz jest modyfikowany szybciej w środku myszy i stopniowo mniej od środka do krawędzi. Przeciągaj myszą lewym przyciskiem wielokrotnie nad tym samym obszarem obrazu, aby zakumulować zmiany, aż piksele w pełni będą pasować do koloru źródłowego lub obrazu źródłowego, lub funkcja edycji źródłowej zostanie w pełni zastosowana. Przeciągnij prawym przyciskiem, aby stopniowo cofnąć zmiany, przywracając oryginalny obraz. - Przykład: jeśli funkcją edycji jest Retusz, a jasność jest zwiększona, wtedy obraz będzie się rozjaśniał w obrębie obszaru myszy, gdy mysz jest przeciągana lewym przyciskiem. Użyj przeciągnięcia prawym przyciskiem, aby stopniowo przywrócić oryginalny obraz. - Przycisk [undo-last] odwraca ostatnią operację malowania lub usuwania, i można to powtarzać, aby usunąć wiele ostatnich edycji. Każda nowa operacja przeciągnięcia myszą jest jednostką pracy, którą można osobno odwrócić. Pamięć dla cofania jest ograniczona, więc przechowywane są tylko ostatnie kroki malowania i usuwania. [undo all] przywróci obraz do stanu początkowego. - Użyj przycisku [undo/redo], aby prześledzić zmiany podczas edycji. - Jeśli aktywny jest {WYBIERZ OBSZAR}, malowanie jest ograniczone do tego obszaru. - UWAGA: Ustaw zoom obrazu na 100% lub więcej, gdy używasz bardzo małego promienia (np. podczas rysowania linii na obrazie). Kroki ruchu myszy są wyrażone w pikselach ekranu. Jeśli obejmuje to wiele pikseli obrazu i używany jest mały promień, niektóre piksele mogą zostać pominięte przez mysz i nie zostaną przetworzone. - - TOPIC: PRZETWARZANIE MASOWE W {MENU MASOWE} znajduje się kilka funkcji masowych, które przyspieszają niektóre popularne zadania. Możesz wybrać wiele plików obrazów i wykonać funkcję masową dla wszystkich z nich. Funkcje masowe mogą być używane do zmiany nazwy lub typu pliku, prostowania, przeskalowania, kopiowania lub przenoszenia, usuwania, poprawiania tags, keywords, lokalizacji/geowspółrzędnych, dat zdjęć. - - TOPIC: WYBIERZ PLIKI OBRAZÓW +image: select-image-files.jpg - Ta procedura jest używana dla wszystkich funkcji działających na wielu plikach obrazów. Procedura jest wyjaśniona tutaj, a ten temat jest linkowany z każdej funkcji korzystającej z tej procedury. • kliknięcie lewym przyciskiem na thumbnail: dodaj do listy wyboru • kliknięcie prawym przyciskiem: usuń • dodaj wiele: kliknij pierwszy thumbnail, shift-kliknij ostatni • przycisk [Dodaj wszystko]: dodaj całą galerię • przycisk [Dodaj bieżący]: dodaj bieżący plik • plik może być dodany do listy wielokrotnie • przejdź do innych galerii, aby w razie potrzeby wybrać więcej plików • przycisk [Usuń]: usuń wybraną pozycję listy • przycisk [Wyczyść]: wyczyść całą listę • strzałki góra/dół: przechodź przez listę, przeglądaj thumbnails • klawisze home/end: przejdź do początku/końca listy - Przycisk [Wyłącz] wyłączy klikanie thumbnails do wybierania plików. Przycisk zostaje wtedy przemianowany na [Włącz] - naciśnij, aby przywrócić klikanie thumbnails. Celem tego jest umożliwienie normalnych menu podręcznych thumbnails oraz kliknięcia lewym przyciskiem, aby wyświetlić plik w pełnym rozmiarze, co nie jest możliwe, gdy kliknięcia thumbnails są używane do wyboru plików. Możesz tego potrzebować przy podejmowaniu decyzji o wyborach. Możesz również pozostać w trybie widoku pliku i przechodzić przez obrazy za pomocą strzałek, jednocześnie używając przycisku [Dodaj bieżący], aby dodawać pliki do listy wyboru. - - TOPIC: SKRÓTY Istnieją trzy metody skrótów dla często używanych funkcji: • Kliknij prawym przyciskiem okno główne lub thumbnail galerii. Menu podręczne pokazuje niektóre powszechnie używane funkcje. • Możesz zmienić klawisze skrótów i dodać nowe skróty. Zobacz {SKRÓTY KLAWISZOWE}. • Zbierz często używane funkcje w niestandardowym menu. Zobacz {MENU NIESTANDARDOWE}. - Skróty klawiszowe są dostępne dla najczęściej używanych funkcji. Użyj menu Narzędzia > Skróty klawiszowe, aby je wyświetlić lub zmienić. - Poniższe skróty klawiszowe są stałe i nie można ich zmienić: • klawisz [+] [=]: Zoom obrazu lub thumbnails - powiększ • klawisz [-]: Zoom obrazu lub thumbnails - pomniejsz • klawisz Z: Przełącz zoom: 1x <--> dopasuj do okna • klawisz F1: Wyświetl podręcznik użytkownika dla bieżącej funkcji • klawisz F10: Przełącz okno główne na pełny ekran i z powrotem • klawisz F11: Jak F10, bez menu, paska tytułu, górnego panelu • klawisz Escape: Zakończ działającą funkcję, Wyjdź z aktywnego okna dialogowego • klawisz Delete: Okno dialogowe do usunięcia lub wyrzucenia do kosza bieżącego pliku • Strzałka lewo/prawo: Pokaż poprzedni/następny obraz w galerii • Strzałka góra/dół: To samo, ale pokazuj tylko ostatnie wersje • Page Up/Down: Widok galerii: przewiń o jedną stronę w górę/w dół • Home/End: Widok galerii: przejdź do pierwszej/ostatniej strony galerii - Poniższe skróty klawiszowe są domyślne i mogą być zmienione przez użytkownika: • F: Widok pliku - zmień na tryb widoku pliku • G: Widok galerii - zmień na tryb widoku galerii • M: Widok mapy - zmień na tryb widoku mapy • 2: Przełączaj 2 pliki - na przemian pokazuj dwa ostatnie pliki • 3: Przełączaj 3 pliki - na przemian pokazuj trzy ostatnie pliki • A: Bieżący album - pokaż ostatnio przeglądany album • T: Retusz - uruchom funkcję edycji Retusz • C: Kadruj - uruchom funkcję edycji Kadruj • K: Skróty klawiszowe - uruchom okno dialogowe skrótów klawiszowych • P: Drukuj obraz - otwórz okno dialogowe drukowania obrazu • R: Obróć - uruchom funkcję edycji obrotu • U: Cofnij - cofnij bieżącą edycję lub ostatnią w serii • Shift+U: Ponów - ponów bieżącą edycję lub następną w serii • Ctrl+C: Kopiuj do schowka - skopiuj bieżący plik do schowka • Shift+C: Przełącz podpisy - na przemian pokazuj / ukrywaj podpisy • Ctrl+G: Pokaż galerię folderu dla bieżącego pliku • Shift+G: Przełącz siatkę - włącz/wyłącz linie siatki • Ctrl+S: Zapisz - uruchom okno dialogowe zapisu pliku - - TOPIC: FUNKCJE MYSZY - ^Widok pliku • kliknięcie lewym - Zoom-in: powiększ obraz, wyśrodkowany na myszy • kliknięcie prawym - Jeśli obraz jest powiększony (zoom): przywróć do rozmiaru okna Jeśli nie, menu podręczne z popularnymi funkcjami • kółko myszy - Zoom obrazu, przybliż lub oddal • przeciągnięcie lewym po obrazie - Przesuń powiększony obraz (zoom) • Ctrl + mysz - Mysz działa na obrazie, a nie na aktywnym oknie dialogowym - ^Widok galerii • kliknięcie lewym na thumbnail - Zmień na Widok pliku • kliknięcie prawym na thumbnail - Pokaż menu podręczne z popularnymi funkcjami • kliknięcie środkowym na thumbnail - Wyskakujący duży obraz, zoom kółkiem myszy • kółko myszy - Przewiń stronę galerii w górę lub w dół - ^Widok mapy • przeciągnięcie lewym - Przeciągnij mapę, podążając za myszą • kółko myszy - Zoom mapy, powiększ lub pomniejsz • kliknięcie lewym na znaczniku - Pokaż galerię obrazów w tej lokalizacji • jeśli aktywne jest okno dialogowe edycji metadata, kliknięcie lewym ustawia geowspółrzędne - - TOPIC: PARAMETRY POLECENIA Tych parametrów można używać, jeśli Fotocx jest uruchamiany z terminala. -help pokaż podręcznik użytkownika -home /folder alternatywna lokalizacja domowa Fotocx (zobacz poniżej) -lang xx ustaw język z 2-znakowego kodu -recent pokaż galerię ostatnich plików obrazów -new pokaż galerię najnowszych plików obrazów -album albumname album (galeria) do otwarcia -prev pokaż ostatni plik przeglądany w poprzedniej sesji -blank pokaż puste okno -dev pokaż zwykle ukryte menu deweloperskie -menu manuname Fotocx uruchomi się z tym menu aktywnym -cwp nnn name cyklicznie zmieniaj tapetę (zobacz poniżej) -x0 -x1 -x2 ustaw poziom indeksowania na 0, 1 lub 2 (zobacz poniżej) - ^parametr -x0 -x1 -x2^ (ustaw poziom indeksowania przy starcie) Tych parametrów można używać, aby nadpisać wartość {USTAWIENIA} -x0 bardzo szybki start, brak indeksu obrazów -x1 szybki start, indeksuj tylko stare pliki -x2 stare pliki + szukaj nowych/zmodyfikowanych plików - ^-home^ parametr (alternatywny folder domowy Fotocx) Domyślny folder domowy Fotocx: /home//.fotocx. Tutaj przechowywane są ustawienia użytkownika i indeks obrazów. Polecenie "$ fotocx -home " używa wskazanego folderu. Umożliwia to osobne zarządzanie wieloma kolekcjami obrazów. Zobacz też {PRZENIEŚ FOLDER DOMOWY FOTOCX}. - ^-cwp^ parametr (cykliczna zmiana tapety pulpitu) Pełny wiersz poleceń to: $ fotocx -cwp secs container Użyj tego polecenia, aby cyklicznie zmieniać obraz pulpitu z wybranego zestawu. 'secs' to odstęp między obrazami. 'container' to albo nazwa albumu Fotocx, albo folder zawierający pliki obrazów. Dodaj to polecenie do listy startowej logowania, aby uzyskiwać nową tapetę w określonych odstępach czasu. Użyj odstępu jednego dnia lub więcej, aby uzyskiwać nowy obraz tapety przy każdym logowaniu. Fotocx działa w tle bez GUI. Jeśli 'secs' wynosi zero, zostanie wykonana jedna aktualizacja tapety, a następnie Fotocx zakończy działanie. Każda dystrybucja Linuksa ma inne polecenie. Teoretycznie obsługiwane są następujące: Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: MENU PLIKU - - TOPIC: NOWA SESJA Rozpocznij nową sesję Fotocx w nowym oknie. Jeśli plik obrazu jest edytowany w obu oknach, żadna z instancji nie zobaczy zmian wprowadzonych przez drugą, a końcowym wynikiem jest ostatnio zapisany plik. - - TOPIC: OTWÓRZ PLIK OBRAZU Wybierz plik obrazu do wyświetlenia lub edycji, używając konwencjonalnego okna dialogowego otwierania pliku z folderami i listami plików. Jest to przydatne w przypadku, gdy pliki nie są zindeksowane, a wyświetlanie galerii jest bardzo wolne, np. odczyt z karty SD aparatu zawierającej tysiące plików obrazów. - - TOPIC: PRZEŁĄCZAJ 2 PLIKI Powtórzenie tego menu spowoduje przełączanie między dwoma ostatnio otwartymi plikami. Ta funkcja zachowuje bieżący rozmiar zoom obrazu i pozycję, co jest idealne do szybkiego porównywania dwóch edytowanych wersji tego samego pliku obrazu. - - TOPIC: PRZEŁĄCZAJ 3 PLIKI Działa to tak samo jak Przełączaj 2 pliki, ale przełączając między ostatnimi 3 otwartymi plikami. - - TOPIC: WIDOK PANORAMY 360° Bieżący plik jest otwierany za pomocą specjalnej przeglądarki dla plików panoramy 360°. Zakłada się, że szerokość obrazu wynosi 360°. Użyj tej funkcji, aby przeglądać obrazy Google 'photosphere'. Przesuwaj obraz, przeciągając myszą lub za pomocą strzałek lewo/prawo. Zoom za pomocą kliknięcia lewym/prawym przyciskiem myszy. Użyj Escape, aby wyjść ze specjalnej przeglądarki. - - TOPIC: ZMIEŃ NAZWĘ Zmień nazwę bieżącego pliku (Widok pliku) lub pliku klikniętego thumbnail (Widok galerii). Wprowadź nową nazwę i naciśnij [zastosuj]. Ta funkcja może również zautomatyzować proces zmiany nazwy serii plików obrazów, używając nazwy podstawowej i numeru sekwencji. Otwórz pierwszy plik obrazu w serii, wprowadź nową nazwę i naciśnij przycisk [zastosuj]. Użyj przycisku [next], aby przejść do następnego pliku, jeśli chcesz. Możesz użyć tej samej nazwy ponownie, naciskając przycisk [poprzednia nazwa], a następnie dodać przyrostek lub numer sekwencji. Naciśnij przycisk [add 1], aby zwiększyć numer sekwencji. - - TOPIC: PUSTY OBRAZ Utwórz pusty obraz o określonych wymiarach pikseli i kolorze. Można go użyć jako tła dla wycinków pobranych z innych obrazów (za pomocą {WYBIERZ OBSZAR}) i tekstu adnotacji (za pomocą rysowania tekstu {OZNACZENIA}). - - TOPIC: KOPIUJ/PRZENIEŚ Bieżący plik (Widok pliku) lub plik klikniętego thumbnail (Widok galerii) jest kopiowany do podanej lokalizacji. Wybierz opcję kopiowania, aby skopiować plik i pozostawić plik źródłowy na miejscu, tworząc duplikat. Wybierz opcję przenoszenia, aby przenieść plik z pierwotnej lokalizacji do nowej lokalizacji. Grupę plików można szybko przetworzyć, klikając każdy thumbnail, a następnie [zastosuj]. Przycisku [Wstecz] można użyć, aby skopiować poprzednio użytą nazwę pliku. Dodaj numer wersji lub coś innego, aby uniknąć zduplikowanego pliku. - - TOPIC: KOPIUJ NA PULPIT Bieżący plik (Widok pliku) lub plik klikniętego thumbnail (Widok galerii) jest kopiowany do folderu pulpitu (/home//Desktop). - - TOPIC: KOPIUJ DO SCHOWKA Bieżący plik (Widok pliku) lub plik klikniętego thumbnail (Widok galerii) jest kopiowany do schowka, z którego inne aplikacje mogą wklejać. - - TOPIC: USUŃ/KOSZ Bieżący plik (Widok pliku) lub plik klikniętego thumbnail (Widok galerii) jest usuwany lub przenoszony do kosza, w zależności od wybranej opcji. Fotocx przyjmuje standardową lokalizację kosza (~/.local/share/Trash). - - TOPIC: USTAW TAPETĘ Tapeta pulpitu jest ustawiana z bieżącego pliku obrazu. - - TOPIC: DRUKUJ OBRAZ Menu drukowania obrazu wywołuje standardowe okno dialogowe Ustawienia strony, w którym możesz wybrać drukarkę, rozmiar papieru i orientację. Po użyciu przycisku [zastosuj] uruchamia się kolejne okno dialogowe do wprowadzenia marginesów papieru i skali obrazu. - Jeśli obraz ma wybrane obszary, jesteś pytany, czy powinny być wydrukowane tylko te obszary. Zostaną one wydrukowane przy użyciu minimalnego prostokąta potrzebnego do objęcia obszarów, a obszary poza zaznaczeniami nie są drukowane. - - TOPIC: DRUKUJ SKALIBROWANE Ta funkcja działa jak Drukuj plik obrazu opisana powyżej, ale przed wydrukiem jesteś proszony o podanie pliku kalibracji, który jest używany do dostosowania kolorów obrazu przed wydrukiem. Celem jest skompensowanie przesunięć koloru spowodowanych przez drukarkę i typ papieru. - - TOPIC: KALIBRACJA DRUKARKI +image: printer-calibrate-chart.png +image: calibrate-printer.png - To narzędzie może poprawić dokładność kolorów drukowanych obrazów. - ^Jak to działa Wykres kolorów jest drukowany na docelowej drukarce. Niektóre z wydrukowanych kolorów będą nieznacznie nieprawidłowe z powodu niedoskonałości drukarki. Ta wydrukowana strona jest skanowana do pliku, a kolory w tym pliku są porównywane z oryginalnymi kolorami, które zostały wydrukowane. Wszelkie różnice to błędy, które są teraz znane (zakładając, że twój skaner jest dokładniejszy niż twoja drukarka - zazwyczaj prawda). Gdy plik obrazu jest drukowany, błędy te są odejmowane od kolorów obrazu przed drukiem. Drukarka dodaje błędy z powrotem, pozostawiając wynik, który jest teoretycznie poprawny. Mój własny test wykazał umiarkowaną poprawę, opisaną szczegółowo poniżej. - Wykonaj poniższe kroki po kolei, zgodnie z listą w oknie dialogowym. Wszystkie pliki znajdują się w folderze /printer_color. • Wygeneruj i wydrukuj plik wykresu kolorów (printchart.png). Użyj dużego rozmiaru papieru, orientacji pionowej, bez marginesów. • Zeskanuj wydrukowany wykres do pliku PNG. Użyj 300 dpi lub więcej. • Edytuj obraz PNG, aby przyciąć marginesy pozostawione przez skaner. Zapisz zedytowany plik obrazu. • Przetwórz zedytowany plik obrazu, aby utworzyć plik mapy kolorów. - Możesz teraz drukować, używając menu {DRUKUJ SKALIBROWANE}, które poprosi o nazwę pliku mapy kolorów dla drukarki i papieru, którego używasz. - Skanery mogą przekrzywić zeskanowany obraz w nieco nieprostokątną formę. Jeśli tak się stanie, zauważysz to podczas próby przycięcia marginesów: grube zielone linie marginesu nie będą idealnie wyrównane z prostokątem kadrowania. Jeśli tak się stanie, użyj {PERSPEKTYWA}, aby najpierw wyprostować obraz, a następnie przytnij marginesy. - Podczas edytowania zeskanowanego obrazu wykresu upewnij się, że najciemniejszy wiersz znajduje się na górze. Przytnij marginesy otaczające kafelki kolorów. Użyj grubej zielonej linii marginesu otaczającej kafelki kolorów jako przewodnika: odetnij dokładnie tę linię, pozostawiając tylko kafelki. Pracuj z 2x powiększeniem podczas dostosowywania prostokąta kadrowania. Dokładne kadrowanie jest ważne. Jeśli kadrowanie nie jest dokładne, obliczone pozycje kafelków będą przesunięte, a zmierzone kolory mogą być nieprawidłowe. Niewielki błąd jest tolerowany. Możesz użyć klawiszowych strzałek do przesunięć o 1 piksel w prostokącie kadrowania. Ostatni narożnik przeciągnięty myszą jest narożnikiem, który będą przesuwać strzałki. - Wyjściowy plik mapy kolorów może być używany tylko dla ustawień papieru i drukarki użytych do kalibracji. Każda inna kombinacja wymaga własnej kalibracji i pliku mapy kolorów. - ^Wyniki^ (moja drukarka Canon) +image: printer-calibrate.jpg +image: printer-cal-study.png - Powyższy wykres to zdjęcie trzech obrazów: góra lewo: wydruk zdjęcia wykresu kolorów góra prawo: skalibrowany wydruk tego samego zdjęcia dół: sam wykres kolorów Ponieważ wszystkie 3 obrazy zostały sfotografowane razem, błędy z aparatu są takie same, co czyni porównania ważnymi. - - TOPIC: MENU GALERII - - TOPIC: PRZEGLĄD GALERII +image: image-management.jpg - Galeria obrazów thumbnail może reprezentować folder plików, wynik wyszukiwania obrazów, jedną z wbudowanych galerii (ostatnie pliki, najnowsze pliki) lub album (uporządkowaną listę plików obrazów o podanej nazwie). Foldery powinny być ograniczone do kilku tysięcy plików ze względów praktycznych i wydajnościowych, ale żaden limit nie jest wymuszany. - ^Przewijanie galerii Galerię można przewijać w górę i w dół za pomocą klawiszowych strzałek góra i dół, klawiszy page-up i page-down lub pasków przewijania. Można też użyć klawiszy [home] i [end]. Kliknij lewym przyciskiem i przytrzymaj na pasku przewijania, a galeria przewinie się szybko do pozycji kliknięcia. Kliknij prawym przyciskiem i przytrzymaj na pasku przewijania, aby galeria przewijała się powoli do pozycji kliknięcia. Kontynuuj przytrzymywanie przycisku myszy i przesuń na bok, aby zwiększyć szybkość przewijania. - - TOPIC: WIDOK THUMB Pliki obrazów w bieżącej galerii są pokazane jako tablica thumbnails. Użyj przycisku menu Zoom lub klawiszy [+] [-], aby zmienić rozmiar thumbnail. - - TOPIC: WIDOK METADATA Pliki obrazów w bieżącej galerii są pokazane razem z podstawowymi metadata używanymi przez Fotocx. Jeśli zdefiniowane są niestandardowe zindeksowane tags metadata, są one pokazywane po standardowych tags. Zobacz {INDEKSUJ PLIKI}. - - TOPIC: OSTATNIE PLIKI 1000 ostatnio przeglądanych plików obrazów jest pokazywanych w galerii, z której możesz wybierać pliki do wyświetlenia lub edycji. - - TOPIC: NAJNOWSZE PLIKI 1000 ostatnio dodanych lub zmodyfikowanych plików obrazów jest pokazywanych w galerii, z której możesz wybierać pliki do wyświetlenia lub edycji. Masz możliwość wyboru użycia daty zdjęcia EXIF lub daty modyfikacji pliku do określenia najnowszych obrazów. - - TOPIC: SORTOWANIE GALERII Wybierz klucz sortowania oraz kolejność rosnącą lub malejącą. Pole wyboru Resetuj resetuje wszystkie galerie do sortowania rosnąco według nazwy pliku. - Jeśli galeria Albumu jest sortowana, wynik nie zastępuje albumu, lecz tworzy nowy album o nazwie -sorted. - ^Nazwa/numer pliku Jest to zmodyfikowane sortowanie według nazwy pliku. Jeśli wiele plików ma nazwy różniące się tylko osadzonymi liczbami w tej samej pozycji, ta grupa plików zostanie posortowana w kolejności osadzonych liczb. Poniższy przykład ilustruje różnicę: kolejność alfabetyczna: xxx1xx xxx11xx xxx123xx xxx3xx kolejność liczbowa: xxx1xx xxx3xx xxx11xx xxx123xx - ^Metadata z funkcji wyszukiwania Jeśli galeria została wygenerowana przez opcję 'raport metadata' funkcji {WYSZUKAJ OBRAZY}, i jeśli dodałeś opcjonalne tags metadata do standardowego raportu, możesz sortować galerię według tych tags metadata. Możesz sortować galerię według marki aparatu, informacji o obiektywie, poziomu ISO, czasu ekspozycji ... dowolnych dostępnych metadata. - - TOPIC: FILTR GALERII Wybierz podzbiór bieżącej galerii, aby utworzyć album o nazwie "gallery_filter" zawierający wybrane pliki obrazów. ^Opcje wyboru: • wszystkie pliki: wybierz wszystkie pliki obrazów • oryginały: pliki oryginalne (bez numeru wersji) • wersje: pliki z wersjami (zostały edytowane) • ostatnie wersje: ostatnie wersje (lub oryginały, jeśli brak wersji) • zakres ocen: pliki z oceną w podanym zakresie • nazwy keywords: pliki mające którykolwiek z podanych keywords (rozdzielonych przecinkami) • tekst nazwy pliku: pliki z którymkolwiek z podanych ciągów tekstu (rozdzielonych przecinkami) - - TOPIC: GALERIA - START TOPIC: KONIEC GALERII Przejdź do pierwszego lub ostatniego thumbnail w bieżącej galerii. - - TOPIC: FOLDER BIEŻĄCEGO PLIKU Ustaw bieżącą galerię z bieżącego pliku obrazu. Jest to przydatne, jeśli chcesz wrócić do galerii bieżącego pliku po zrobieniu czegoś innego. - - TOPIC: OSTATNIE FOLDERY Ustaw bieżącą galerię z ostatnio używanej galerii. Umożliwia to łatwiejsze przechodzenie tam i z powrotem między ostatnimi galeriami. - - TOPIC: DRZEWO FOLDERÓW +image: folder-tree.png - Początkowo pokazywane są wszystkie foldery główne (TOP) obrazów. Kliknij [+], aby rozwinąć podfoldery, lub [-], aby je zwinąć z powrotem. Możesz kliknąć dowolny folder, aby uzyskać galerię obrazów w tym folderze. Zostaw okno otwarte, aby nawigować w dowolne miejsce swojej kolekcji obrazów. Ta funkcja jest również dostępna za pomocą przycisku [TOP] w górnym panelu galerii. - - TOPIC: WYBIERZ PLIKI Wstępnie wybierz pliki obrazów do użycia jako dane wejściowe do tworzenia albumów lub dla funkcji masowych. Funkcje te będą domyślnie używać wstępnie wybranych plików, ale możesz je również zmodyfikować lub zacząć od nowa. Zobacz procedurę {WYBIERZ PLIKI OBRAZÓW}. - - TOPIC: ZAKŁADKI Wyświetl istniejące zakładki. Zakładki to wybrane lokalizacje (nazwy folderów/plików) z nazwami przypisanymi przez użytkownika. Kliknij zakładkę, aby pokazać galerię thumbnails zaczynającą się od tej lokalizacji. Wybierz [Edytuj zakładki], aby dodać, usunąć lub zmienić nazwę zakładki. - - TOPIC: EDYTUJ ZAKŁADKI Po uruchomieniu Edytuj zakładki kliknij thumbnail galerii, aby dodać tę lokalizację do listy zakładek. Przypisana nazwa zakładki będzie początkowo nazwą pliku dla thumbnail. Możesz edytować nazwę. Jeśli wybierzesz istniejącą zakładkę kliknięciem myszy, jej nazwa zostanie pokazana w polu wprowadzania. Możesz zmienić nazwę lub nacisnąć [usuń], aby usunąć zakładkę. Nowe zakładki są wstawiane po ostatniej wybranej lokalizacji zakładki. Aby zmienić kolejność, edytuj plik "bookmarks" w folderze domowym Fotocx. - - TOPIC: MAPS MENU - - TOPIC: MAPA ŚWIATA +image: map-click.jpg - Jest to internetowa mapa świata, którą można skalować (przybliżać i oddalać - zoom) od poziomu ulicy do poziomu kontynentu. Użyj kółka myszy, aby przybliżyć/oddalić (zoom) mapę. Przeciągnij mapę, aby zmienić środek. Mapa ma znaczniki (czerwone kropki) odpowiadające obrazom mającym geowspółrzędne w swoich metadata. Kliknij znacznik, aby uzyskać Widok galerii obrazów w tej lokalizacji. Wybierane są obrazy znajdujące się w obrębie obszaru znacznika na mapie. Efektywny obszar znacznika skaluje się wraz ze skalą mapy. Powiększ (zoom-in), aby rozszerzyć skalę i ewentualnie rozdzielić jeden znacznik na wiele pobliskich znaczników. - - TOPIC: POKAŻ NA MAPIE Pokaż pozycję bieżącego pliku obrazu na mapie świata. Jeśli wiele znaczników się nakłada, powiększaj (zoom-in), aż pojedynczy znacznik znajdzie się na środku. - - TOPIC: MENU ALBUMÓW - - TOPIC: ALBUMY Album to dowolny zestaw obrazów, który jest ręcznie tworzony z istniejących obrazów. Album jest listą jego plików obrazów członkowskich. Same pliki obrazów nie są kopiowane ani zmieniane. Dany plik obrazu może być członkiem wielu albumów lub może występować więcej niż raz w obrębie albumu. Możesz dodawać i usuwać obrazy w albumie lub zmieniać ich kolejność. Gdy album zostanie utworzony, możesz go wybrać po nazwie, a wtedy pokazuje się jako galeria. - - TOPIC: UTWÓRZ ALBUM Wprowadź nazwę dla nowego albumu. Możesz utworzyć pusty album, album z wstępnie wybranymi plikami obrazów z {WYBIERZ PLIKI}, album z obrazami z bieżącej galerii, lub możesz wybrać obrazy początkowe dla albumu. - - TOPIC: ZMIEŃ NAZWĘ ALBUMU Wybierz istniejący album i wprowadź nową nazwę. - - TOPIC: USUŃ ALBUM Wybierz istniejący album i usuń go trwale. - - TOPIC: WYBIERZ ALBUM Prezentowana jest lista dostępnych albumów. Wybierz z listy. - - TOPIC: BIEŻĄCY ALBUM Ustaw galerię z bieżącego (ostatnio używanego) albumu. - - TOPIC: GALERIA DO ALBUMU Zapisz bieżącą galerię jako album. Wybierz istniejącą nazwę albumu [Przeglądaj] lub wprowadź nową nazwę. - - TOPIC: EDYTUJ ALBUM Kliknij prawym przyciskiem thumbnail albumu i wybierz z menu podręcznego: • Dodaj tutaj wybrane pliki - wcześniej wybrane pliki są dodawane tutaj (kliknij lewą/prawą stronę thumbnail, aby dodać przed/po thumbnail). • Dodaj tutaj bieżący plik (Widok pliku) - działa w ten sam sposób. • Usuń z albumu - kliknięty plik jest usuwany z albumu. - ^Przeciągnij i upuść Możesz zmieniać kolejność obrazów w albumie, przeciągając thumbnails myszą. Przeciągnij thumbnail, aż kursor myszy zmieni się w mały obraz thumbnail. Kontynuuj przeciąganie tego obrazu do pozycji, w której ma zostać wstawiony, i zwolnij przycisk myszy. Ustaw mysz mniej więcej między thumbnails, gdzie ma zostać wstawiony przeciągany obraz. Jeśli przeciąganie zbliża się do górnej lub dolnej krawędzi okna, galeria przewinie się, aby pokazać więcej obrazów. Możesz użyć dwóch sesji Fotocx, aby przyspieszyć wybieranie lub przenoszenie wielu obrazów. Przeciągaj i upuszczaj obrazy z dowolnej galerii źródłowej do docelowej pozycji albumu. - Jeśli zmienisz nazwę lub przeniesiesz plik za pomocą Fotocx, wszystkie linki albumu są aktualizowane, a plik pozostaje w albumach, które go zawierają. Jeśli zrobisz to poza Fotocx, linki albumu zostaną utracone, a plik zniknie z albumu. - Jeśli pliki obrazów są zmieniane nazwą lub przenoszone za pomocą Masowej konwersji lub Masowego kopiowania/przenoszenia, upewnij się, że wybrałeś opcję zastąpienia plików albumu, jeśli jest to potrzebne. W przeciwnym razie będziesz musiał zastępować je pojedynczo. - Nie zmieniaj nazw folderów, jeśli zawierają obrazy w albumach. Linki albumu zostaną utracone. Zamiast tego użyj Masowej konwersji lub Masowego kopiowania/przenoszenia, aby przenieść pliki obrazów do nowego folderu, a następnie usuń stary folder, jeśli jest pusty. Aby usunąć pliki obrazów, użyj Masowego usuwania/kosza. Spowoduje to również usunięcie usuniętych plików z albumów. - - TOPIC: AKTUALIZUJ ALBUMY +image: album-replace-file.png - Zastąp określone pliki albumu określonymi zamiennikami lub dodaj określone nowe pliki po określonych istniejących plikach. Wybierz jeden lub więcej albumów do przetworzenia. W widoku galerii kliknij dwa thumbnails, aby określić 'stary plik' i 'nowy plik' w powyższym oknie dialogowym. Wybierz opcję: 'nowy plik' zastępuje 'stary plik' wszędzie tam, gdzie zostanie znaleziony, lub 'nowy plik' jest dodawany do albumów po 'starym pliku'. Naciśnij [proceed], aby przetworzyć albumy. Po przetworzeniu okno dialogowe powtarza się z tymi samymi wybranymi albumami i tą samą opcją 'zastąp lub dodaj'. Możesz wybrać dwa kolejne pliki i nacisnąć [proceed]. - - TOPIC: MASOWA AKTUALIZACJA ALBUMU +image: album-mass-update.png - Jest to narzędzie do masowych aktualizacji, którego możesz potrzebować po utworzeniu nowych wersji dla wielu plików obrazów i potrzebie zaktualizowania jednego lub więcej albumów do nowych wersji. Nie obejmuje to każdej potrzeby, co jest prawdopodobnie niemożliwe, ale miejmy nadzieję zredukuje potrzebę zmiany jednego pliku na raz. - Wybierz jeden lub więcej albumów, a następnie wybierz jedną z opcji przetwarzania: • Zastąp wszystko tylko najnowszą wersją: Albumy są aktualizowane, aby zawierały tylko najnowsze wersje plików. • Zastąp wszystkie wersje najnowszą wersją: Wszystkie wersje plików są zastępowane tylko najnowszą wersją. Plik oryginalny, jeśli jest obecny, NIE jest zastępowany. • Dodaj najnowsze wersje do istniejących wersji: Najnowsza wersja jest dodawana do istniejących wersji, jeśli brakuje. • Zastąp wszystko oryginałem i wszystkimi wersjami: Wszystkie pliki są zastępowane plikiem oryginalnym i wszystkimi wersjami. • Zastąp wszystko oryginalną wersją i najnowszą wersją: Wszystkie pliki są zastępowane plikiem oryginalnym i najnowszą wersją. • Zastąp wszystko wybranymi wersjami (*): Wszystkie pliki są zastępowane tylko wybranymi wersjami. Obejmuje to plik oryginalny (bez wersji). • Zastąp wszystkie wersje wybranymi wersjami (*): Wszystkie wersje plików są zastępowane tylko wybranymi wersjami. Plik oryginalny, jeśli jest obecny, NIE jest zastępowany. • Dodaj wybrane wersje do istniejących wersji (*): Wybrana wersja jest dodawana do istniejących wersji, jeśli brakuje. • Zastąp wszystko oryginałem i wybranymi wersjami (*): Wszystkie pliki są zastępowane plikami oryginalnymi i wybranymi wersjami. - (*) Cztery opcje używające wybranych plików: lista wybranych plików pochodzi z funkcji {WYBIERZ PLIKI}. Pliki albumu, które nie pasują do żadnych wybranych plików, pozostają w albumie. Tylko pliki pasujące do wybranego pliku są zmieniane zgodnie z powyższymi zasadami. Dopasowanie jest oparte na nazwie pliku bez wersji lub rozszerzenia: 'asdfg.png' i 'asdfg.v01.jpg' są dopasowaniem. - Przykład: Zastąp wszystkie wersje wybranymi wersjami: Jeśli album zawiera filename.jpg i filename.v02.png, a lista wybranych plików zawiera filename.v04.jpg, wynikiem w zaktualizowanym albumie będzie: filename.jpg i filename.v04.jpg - - TOPIC: POKAZ SLAJDÓW +image: slide-show.jpg - ^Ułamkowe skalowanie monitora W niektórych systemach ułamkowe skalowanie powoduje problemy z wydajnością animacji pokazu slajdów Fotocx. Wyłącz to i, jeśli to potrzebne, użyj innych sposobów, aby zwiększyć rozmiar czcionki dla aplikacji. Dla Fotocx rozmiar czcionki znajduje się w menu {USTAWIENIA}. - W oknie dialogowym pokazu slajdów (góra lewo) naciśnij [Wybierz album] i wybierz album z podanej listy. Zmień pozostałe ustawienia w oknie dialogowym według potrzeb, a następnie naciśnij przycisk [Start], aby rozpocząć pokaz slajdów od pierwszego obrazu w albumie, lub [Wznów], aby wznowić wstrzymany pokaz slajdów, lub inny obraz wybrany przez kliknięcie jego thumbnail. Użyj klawisza escape, aby wyjść z pokazu slajdów i wrócić do okna dialogowego. - Kontrolki głównego okna dialogowego • Czas podpisu: sekundy pokazywania tytułu i opisu. • Czas obrazu: sekundy pokazywania samego obrazu. • Limit obcięcia %: obetnij obrazy do tej wartości, aby wyeliminować marginesy. • Pełny ekran: Jeśli zaznaczone, obrazy są pokazywane na pełnym ekranie bez menu itp. • Automatyczne odtwarzanie: Jeśli zaznaczone, pokaz slajdów zacznie się od nowa po zakończeniu. • Losowy obraz: Jeśli zaznaczone, użyj losowej kolejności obrazów. W przeciwnym razie kolejność albumu. - Klawisze klawiatury mogą być używane do sterowania pokazem slajdów. Naciśnij [klawiatura], aby zobaczyć. - Poniższe klawisze są przypisane do akcji i nie można ich zmienić: • Escape: przerwij pokaz slajdów i wróć do głównego okna dialogowego. • Strzałki lewo/prawo: Możesz w dowolnym momencie przejść wstecz i do przodu, a pokaz slajdów będzie kontynuowany od tego miejsca. - Animowane przejścia między obrazami oraz czasy wyświetlania i zachowanie zoom poszczególnych obrazów można dostosować za pomocą okien dialogowych opisanych poniżej. - Naciśnij [przejścia], aby uruchomić okno dialogowe do wybierania i dostosowywania przejść między obrazami. Obejmują one wiele animowanych metod zastępowania obrazu (np. nowy obraz rozszerza się od środka, aby zastąpić stary obraz). Wybierz przejścia, które mają być używane, i czy są używane losowo czy w kolejności. Parametr czasu ustawia czas trwania przejścia. Parametry preferencji określają względną preferencję, która wpłynie na to, jak często przejście jest używane, gdy wybrana jest losowa kolejność. - Przyciski [wczytaj] i [zapisz] umożliwiają zapisanie ustawień przejść w pliku i wczytanie ich później. Te pliki są niezależne od plików pokazu slajdów. Pokaz slajdów domyślnie użyje ustawień przejść ostatnio użytych dla tego pokazu slajdów (nazwa albumu), ale zawsze możesz je zastąpić, używając przycisku [wczytaj], aby wczytać inne ustawienia, lub zmieniając je w oknie dialogowym. - Naciśnij [pliki obrazów], aby uruchomić okno dialogowe Preferencji obrazu (góra prawo). Są one opcjonalne. Obraz jest wybierany do dostosowania przez kliknięcie jego thumbnail w wyświetlaniu albumu/galerii. Okno dialogowe jest wypełnione ustawieniami domyślnymi lub poprzednimi ustawieniami dla tego obrazu w tym pokazie slajdów. Wprowadź poprawki i naciśnij [done], lub kliknij następny obraz do dostosowania. - Preferencja: Jeśli wybrana jest losowa sekwencja obrazów, ta liczba określa względną preferencję dla obrazu. Wartość neutralna to 10. Wprowadź nową wartość, aby zwiększyć lub zmniejszyć prawdopodobieństwo, że ten plik zostanie wybrany w losowej sekwencji obrazów, np. wartość 20 sprawiłaby, że prawdopodobieństwo byłoby 2x większe. Wartość zero uniemożliwiłaby pokazanie obrazu. Obraz jest również blokowany na liczbę równą 1/3 obrazów w albumie lub 10, w zależności od tego, która wartość jest mniejsza. - Okno dialogowe pokazuje konfigurowalne zdarzenia obrazu w kolejności czasowej: • czekaj przez określony czas (może wynosić zero). • pokaż następujące tags tekstowe równolegle: nazwa obrazu (podstawowa nazwa pliku) przez określony czas, tytuł obrazu, jeśli istnieje, przez określony czas, opis obrazu, jeśli istnieje, przez określony czas. • czekaj określony czas przed rozpoczęciem zoom obrazu (może wynosić zero). • zoom obrazu z normalnego do powiększonego lub odwrotnie, przez określony czas. Jeśli żadna opcja nie jest wybrana, nie ma zoom. • zoom-in: zacznij od normalnego rozmiaru, powiększaj obraz, przesuwając środek zoom do określonej pozycji. • zoom-out: zacznij od powiększonego rozmiaru w określonym środku zoom, zmniejsz obraz z powrotem do normalnego rozmiaru. • [zoom center] - naciśnij ten przycisk, a następnie kliknij thumbnail obrazu, aby określić środek zoom dla obrazu. • czekaj przez określony czas po zoom (może wynosić zero) (wartość domyślna to ustawienie 'czas obrazu' głównego okna dialogowego). • przejście do następnego obrazu, używając określonego przejścia lub 'next', aby wskazać brak preferencji (wybierane losowo). - - TOPIC: MENU NIESTANDARDOWE +image: custom-menu.png - Umożliwia to zebranie często używanych funkcji z wielu menu w jedno niestandardowe menu. Możesz również dodać wpisy, aby otwierać konkretne pliki obrazów lub albumy. Menu zawiera również funkcje skryptów i funkcje wtyczek (zobacz poniżej). - Ostatni wpis w menu, Menu edycji, otwiera edytor tekstu do edycji samej listy menu. Nazwy menu muszą dokładnie odpowiadać nazwom w menu Fotocx, ale wielkość liter nie ma znaczenia. - Wpisy menu mogą przyjmować następujące formaty: • # tekst komentarza: komentarz, który nic nie robi • menuname # podpowiedź: nazwa menu Fotocx i opcjonalna podpowiedź podręczna • file : otwórz nazwany plik • album : otwórz nazwany album jako galerię - Poniższe wpisy są obecne domyślnie i nie powinieneś ich zmieniać ani usuwać: Edytuj skrypt, Uruchom skrypt, Skrypt masowy, Wtyczki, Menu edycji. Szczegóły są wyjaśnione poniżej. - - TOPIC: PLIKI SKRYPTÓW Funkcje menu: • Edytuj skrypt - Wykonaj zestaw edycji na jednym pliku obrazu, nagrywając wszystkie funkcje i ustawienia w nazwanym pliku skryptu. • Uruchom skrypt - Uruchom plik skryptu, używając bieżącego pliku obrazu, jak funkcję edycji. • Skrypt masowy - Wybierz dowolną liczbę plików obrazów i uruchom plik skryptu na wszystkich z nich, w trybie masowym. - Pliki skryptów umożliwiają jednorazowe zdefiniowanie zestawu edycji i powtarzanie ich na pojedynczych lub wielu plikach obrazów w późniejszym czasie. - ^Funkcje edycji możliwe do skryptowania Niektóre funkcje edycji używają przeciągnięć myszy po obrazie, np. wszystkie funkcje wypaczania. Nie można ich skryptować, ponieważ przeciągnięcia myszy nie są nagrywane. Używanie tych funkcji jest zablokowane. - Poniższe funkcje można obecnie skryptować: • Edytuj: Retusz, Marginesy, Tryb koloru, Wypełnienie obszaru • Napraw: Wyostrz, Rozmycie normalne, Rozmycie stopniowane, Redukcja szumu, Usuń mgłę, Artefakty JPEG, Wygładzanie krawędzi, Dostosuj RGB • Dopracuj: Spłaszcz histogram, Kontrast lokalny, Wzmocnij kontrast, Retinex globalny, Retinex lokalny, Kontrast lokalny, Nasycenie, Miękka ostrość, Gradient jasności • Efekty: Obrysy, Szkic, Karykatura, Wytłoczenie, Kafelki1, Kafelki2, Malarstwo, Tekstura, Wzór, Dithering, Grawerowanie, Ustaw kolory, Przesuń kolory, Własne jądro - - TOPIC: EDYTUJ SKRYPT W oknie dialogowym naciśnij [start]. Wybierz nazwę pliku dla skryptu. Rozpocznij edycję bieżącego pliku obrazu. Użyj żądanych funkcji edycji w dowolnej kolejności. Każda edycja jest nagrywana w pliku skryptu wraz ze wszystkimi użytymi ustawieniami okna dialogowego. Po zakończeniu naciśnij [close], aby zamknąć plik skryptu i zapisać go z podaną nazwą pliku. - - TOPIC: URUCHOM SKRYPT Wybierz jeden z zapisanych plików skryptów z menu podręcznego. Skrypt jest wykonywany, używając bieżącego pliku obrazu, jak zwykła funkcja edycji. - - TOPIC: SKRYPT MASOWY W oknie dialogowym naciśnij [Wybierz pliki]. Wybierz pliki do edycji, używając standardowego okna dialogowego wyboru pliku {WYBIERZ PLIKI OBRAZÓW}. Po zakończeniu naciśnij [Wybierz skrypt]. Wybierz plik skryptu z menu podręcznego. Skrypt jest teraz wykonywany na wszystkich wybranych plikach. Wszystkie zmodyfikowane obrazy są zapisywane jako nowe wersje. Jeśli przetwarzane są pliki RAW, odpowiadające im pliki wyjściowe to pliki TIFF-16. - - TOPIC: WTYCZKI +image: plugins.png - Funkcje wtyczek to sposób na używanie innych edytorów obrazów w obrębie Fotocx, np. Gimp. Możesz użyć edytora obrazów RAW, takiego jak Rawtherapee, a następnie wykonać dodatkowe edycje za pomocą Fotocx. - ^Procedura użycia: • Otwórz plik do przetworzenia w Fotocx • Uruchom menu wtyczek i wybierz żądany program, np. Gimp • Program wtyczki uruchamia się i otwiera plik przekazany z Fotocx • Wykonaj żądane edycje za pomocą programu wtyczki • Po zakończeniu zapisz plik wyjściowy pod tą samą nazwą co plik wejściowy. Rozszerzenie pliku .ext może się zmienić. • Zamknij program wtyczki. • Fotocx otwiera plik wyjściowy wtyczki jako edytowaną wersję bieżącego pliku. • Wykonaj dodatkowe edycje lub zapisz edytowany plik jako nową wersję lub nowy plik. - Przykładowe menu Wtyczki znajduje się po lewej stronie. Ostatni wpis "Edytuj wtyczki" uruchamia aplikację edycji tekstu po prawej stronie. Użyj edytora tekstu, aby zdefiniować nazwy menu wtyczek i polecenia uruchamiające odpowiadające programy wtyczek. Format to: menuname = plugin-command %s TIP = wyjaśnienie powyższego polecenia 'plugin-command' to polecenie powłoki dla funkcji wtyczki, a '%s' to miejsce, w którym nazwa bieżącego pliku jest wstawiana do polecenia. Nie umieszczaj cudzysłowów wokół '%s', ponieważ są one dodawane automatycznie, umożliwiając przetwarzanie nazw plików ze spacjami lub innymi znakami specjalnymi. Powyższy przykład to menu o nazwie "Gimp", które uruchamia polecenie "gimp %s". Tekst TIP jest opcjonalny. Jeśli jest obecny, znajduje się w wierszu po nazwie menu. Najechanie myszą na wpis menu pokaże ten tekst obok tekstu menu. - Niektóre polecenia mogą wymagać podania zarówno pliku wejściowego, jak i wyjściowego. W takim przypadku podaj '%s' w obu pozycjach. Pomiń '%s', jeśli polecenie nie przetwarza pliku obrazu. - ^Wybierz obszar Jeśli plik wejściowy ma wybrany obszar, tylko ten obszar zostanie zmodyfikowany. Funkcja wtyczki edytuje cały obraz, ale gdy wynik jest przetwarzany przez Fotocx, zachowywane są tylko zmiany w wybranym obszarze. - - TOPIC: ZOOM - ^Przycisk zoom Kliknij przycisk lewym lub prawym przyciskiem, aby zwiększyć lub zmniejszyć rozmiar obrazu w {WIDOK PLIKU} lub rozmiar thumbnail w {WIDOK GALERII}. Ma to zastosowanie tylko wtedy, gdy tryb widoku galerii to {WIDOK THUMB}. Jeśli {WIDOK METADATA}, nic nie jest robione. - - TOPIC: POPRZ./NAST. - Kliknij przycisk lewym lub prawym przyciskiem, aby otworzyć poprzedni lub następny plik w bieżącej galerii. Możesz też użyć strzałek lewo/prawo. - - TOPIC: ZAPIS PLIKU - +image: file-save.png - +image: file-save-as.jpg - W pierwszym oknie dialogowym wybierz 'nowa wersja', 'nowy plik' lub 'zastąp plik'. - ^Nowa wersja Zapisz bieżący plik obrazu z nowym numerem wersji. Nazwy plików z numerami wersji są formatowane jako "filename.vNN.ext", gdzie NN to liczba od 01 do 99. Jeśli nazwa pliku nie ma wersji, zostanie utworzona wersja .v01. Jeśli wersje pliku są już obecne na dysku, używany jest kolejny wyższy numer wersji. Jeśli plik jest plikiem JPEG, używana jest domyślna jakość - zobacz {USTAWIENIA}. - ^Nowy plik Otworzy się 2. okno dialogowe pokazane powyżej, aby zapisać bieżący obraz do wybranego pliku, którym może być plik oryginalny, inny istniejący plik lub nowy plik. Plik można zapisać w formatach JPEG, PNG, JXL i TIFF. - Dla JPEG możesz wybrać wartość jakości w zakresie 1-100. Niższe wartości dają mniejsze pliki i niższą jakość obrazu. Wartości powyżej 70 są trudne do odróżnienia od 100 (najwyższa jakość, największy rozmiar pliku). Domyślna jakość JPEG jest używana, chyba że zmienisz wartość w oknie dialogowym. Wartość domyślna pochodzi z {USTAWIENIA}. Nie będziesz w stanie zobaczyć różnicy między plikiem zapisanym z jakością 70 a plikiem z jakością 100, ale różnica w rozmiarze pliku jest ogromna. Przezroczyste obszary będą czarne. JPEG nie obsługuje przezroczystości. - Pliki PNG i TIFF są kompresowane bez utraty jakości i są znacznie większe niż JPEG. Mogą być zapisane z 8 lub 16 bitami na kolor. - Jeśli zaznaczone jest 'ustaw jako bieżący', zapisany plik (nowa nazwa pliku) stanie się bieżącym plikiem. - ^Zastąp plik Zapisz bieżący plik obrazu z powrotem do niego samego. - ^Uprawnienia^ są kopiowane z pliku wejściowego. Naciśnij przycisk [Zmień], aby edytować uprawnienia. - - TOPIC: MENU METADATA - - Metadata to dane tekstowe przechowywane wewnątrz pliku obrazu. Aparaty cyfrowe tworzą niektóre metadata automatycznie, takie jak data i czas, dane techniczne o aparacie i parametrach zdjęcia oraz dane lokalizacji (jeśli aparat ma odbiornik GPS). Inne dane mogą być dodane przez użytkownika, np. tytuł, opis, ocena, keywords. Fotocx może przeszukiwać twoją kolekcję obrazów, używając dowolnych metadata, wraz z nazwami folderów i plików lub ich częściami, tworząc galerię pasujących obrazów. W większości przypadków wyszukiwanie jest niemal natychmiastowe. - - TOPIC: POKAŻ META GŁÓWNE TOPIC: POKAŻ WSZYSTKIE META +image: view-metadata.jpg - Funkcja Pokaż meta główne wyświetla powszechnie przydatne metadata dla bieżącego pliku obrazu. Obejmuje to datę i czas zdjęcia, czas otwarcia migawki, ogniskową, rozmiar obrazu, ISO itd. Aparaty cyfrowe przechowują te dane w obrazie. Metadata mogą również zawierać dane dodane przez użytkownika: keywords, tytuł lub podpis, opis, komentarze dodane przez fotografa lub późniejszego edytora (czasami spotykane w opublikowanych obrazach). - Jeśli obraz jest edytowany, zapis edycji jest zapisywany w metadata. Pokaż meta główne pokazuje historię wykonanych edycji. - Pokaż wszystkie meta zgłasza wszystkie dostępne metadata i może obejmować ponad 100 elementów, którymi prawdopodobnie się nie interesujesz. - Przycisk [Extras] w oknie Pokaż meta główne otwiera okno dialogowe pokazane po prawej stronie, gdzie możesz dodać dodatkowe tags do raportu. Dowolny tag dostępny w raporcie Pokaż wszystkie meta może zostać dodany do krótkiego raportu. Kliknij tag w lewej kolumnie, aby dodać go do prawej kolumny i do raportu. Kliknij tag w prawej kolumnie, aby go usunąć. Kliknij wpis "Inny tag ...", aby wpisać dowolną nazwę tag nieznajdującą się na domyślnej liście, która jest ograniczona do najbardziej prawdopodobnie potrzebnych tags. - Fotocx używa tych tags metadata do edycji i wyszukiwania obrazów: • Tytuł - krótki tytuł obrazu • Opis - opis obrazu • Data/czas oryginalny - data/czas zdjęcia • Ocena - od 0 do 5 gwiazdek • Kraj - z GPS aparatu lub dodany ręcznie • Lokalizacja - nazwa EXIF to miasto • Geotags - latitude/longitude • Keywords - identyfikatory obrazu od użytkownika • Dane aparatu - marka, model, obiektyw • Dane ekspozycji - czas, liczba F, ogniskowa, ISO Te tags są edytowane za pomocą funkcji {EDYTUJ META GŁÓWNE}. Wszystkie inne tags mogą być również edytowane i przeszukiwane, przy użyciu mniej wygodnych metod opisanych poniżej. - Istnieje również kilka funkcji masowych do dodawania danych do wielu plików obrazów naraz. Zobacz {MENU MASOWE}. - - TOPIC: PRZEGLĄD KEYWORDS Pliki obrazów mogą mieć keywords identyfikacyjne lub klasyfikacyjne. Mogą one być używane do przeszukiwania dużej kolekcji obrazów w poszukiwaniu obrazów mających żądane keywords. Typowe keywords: temat, wydarzenie, lokalizacja, osoby lub rzeczy itd. Keywords znajdują się wewnątrz metadata obrazu. Keywords to zazwyczaj jedno słowo, ale można użyć krótkiej frazy z osadzonymi spacjami lub innymi separatorami. Przecinki i średniki są używane jako separatory między keywords, i dlatego nie mogą być używane wewnątrz keyword (standard zewnętrzny). Złożony keyword, taki jak "arizona scenery", jest dozwolony, ale zamiast tego powinieneś użyć dwóch keywords dla większej elastyczności: możesz wyszukiwać obrazy mające którykolwiek z keywords lub oba keywords. - Wszystkie obrazy mające żądany keyword lub keywords można szybko znaleźć i wyświetlić w oknie galerii. Jeśli używałeś nazw folderów i plików w sensowny sposób, możesz również wyszukiwać obrazy, używając tych nazw. Możesz też wyszukiwać obrazy według daty, oceny, lokalizacji i innych tags metadata. Nie muszą one być powielane w keywords. Zobacz {WYSZUKAJ OBRAZY} poniżej. - ^Zarządzany system keywords Jest to odpowiednie, jeśli chcesz zaplanować swój system keywords przed dodaniem keywords do swoich obrazów. W tym systemie tworzysz ograniczoną liczbę kategorii keywords (np. ludzie, miejsca, rzeczy, wydarzenia, sztuka, krajobrazy ...). Keywords mogą być tworzone i przypisywane do kategorii w miarę potrzeb, gdy keywords są przypisywane do obrazów. Obrazowi nadaje się keyword, wskazując i klikając na liście dostępnych keywords, która jest zorganizowana według kategorii i alfabetycznie w obrębie kategorii. Jeśli potrzebny jest nowy keyword, jest tworzony przy pierwszym przypisaniu do obrazu. Liczba keywords w obrębie kategorii powinna idealnie wynosić mniej niż około 200, aby wizualna lokalizacja z listy wyboru była wystarczająco szybka. - ^Zalety zarządzanego systemu keywords • zapobiega niespójnym nazwom keywords (np. 'landscape' i 'scenery') • zapobiega alternatywnym pisowniom i literówkom (np. susan, susy, susna) • zapobiega keywords, które zawierają inne keywords (np. scenery, lake) • wyszukiwanie jest bardziej niezawodne, ponieważ keywords nie mają powyższych błędów • podczas przypisywania keywords masz przegląd dostępnych keywords, zamiast tysięcy chaotycznych keywords w niezarządzanym systemie - Wybieranie keywords z długiej listy może być wolne. Jest to łagodzone na 3 sposoby: • Do około 10 ostatnio używanych keywords jest pokazywanych w oknie dialogowym edycji metadata, gdzie mogą być łatwo widoczne i wybierane. Ponieważ seria zdjęć zrobionych w tym samym czasie prawdopodobnie będzie miała wiele wspólnych keywords, dodawanie keywords jest łatwiejsze i szybsze. • Możesz po prostu zacząć wpisywać żądaną nazwę keyword. Wyskakująca lista pasujących keywords pojawia się, gdy tylko istnieje kilka możliwych dopasowań. Możesz następnie kliknąć żądany keyword, aby dodać go do obrazu. Jeśli nie ma pasujących keywords, masz możliwość dodania nowego keyword do listy zdefiniowanych keywords. • Możesz wybrać kategorię, aby wyświetlić mniejszą listę wyboru. - Jeśli keywords są szeroko zdefiniowane i mniej liczne, wyniki wyszukiwania dla keywords będą większe, ale znajdowanie żądanych obrazów wizualnie może być dość szybkie. Fizyczna kolejność plików jest zachowana: pliki obrazów znajdujące się razem w swoich folderach będą również pojawiać się razem w wynikach wyszukiwania. - Obrazy pobrane z internetu często zawierają keywords. Oczywiście nie mają one żadnej organizacji i są zbiorczo chaotyczne. Jeśli używasz zarządzanego systemu keywords, najlepiej przejrzeć takie obrazy i uporządkować keywords, aby były zgodne z twoim systemem, lub je usunąć. Wszelkie nowe keywords, które są obecne, zostaną automatycznie dodane pod kategorią "nocatg". Jeśli zauważysz niechciane keywords na swojej liście keywords, użyj {WYSZUKAJ OBRAZY} według keyword, aby znaleźć obrazy z niechcianymi keywords, aby można je było naprawić lub usunąć. - ^Losowy system keywords Możesz woleć wymyślać keywords w miarę potrzeb, bez żadnego konkretnego systemu na myśli. Albo możesz już mieć tysiące keywords, co utrudnia konwersję do zarządzanego systemu keywords (ale nie jest niemożliwe: Fotocx może masowo konwertować nazwy keywords). W takim przypadku możesz po prostu wpisywać keywords do swoich obrazów, tworząc nowe keywords w miarę potrzeb. Wciąż istnieje pewna możliwość utrzymania porządku keywords: istniejące keywords pasujące do wpisanych znaków są pokazywane, gdy tylko istnieje kilka możliwych dopasowań. Przykład: wpisujesz "new" i pokazywana jest lista keywords: New York, New Delhi, Newman ... Jeśli jeden z nich jest twoim zamiarem, klikasz go, aby wybrać keyword. Jeśli nie, kontynuujesz pisanie i w końcu naciskasz Enter, aby utworzyć nowy keyword. Podczas wyszukiwania obrazów dla keywords możesz wpisywać żądane nazwy keywords lub wybierać je z listy dostępnych keywords. Pokazywane są dostępne keywords pasujące do pierwszych kilku wpisanych liter, i możesz wybrać z tej listy. Nie możesz wprowadzić keyword wyszukiwania, który nigdzie nie istnieje w twoich obrazach. Losowy system keywords prawdopodobnie zaowocuje tysiącami keywords. Może to nie być zbyt użyteczne. - - TOPIC: GEOTAGS OVERVIEW Nowoczesne aparaty mogą rejestrować lokalizację każdego zdjęcia, używając wewnętrznego odbiornika GPS. Latitude, longitude (i ewentualnie miasto/lokalizacja i kraj) są rejestrowane w metadata EXIF pliku obrazu. Funkcja {EDYTUJ META GŁÓWNE} umożliwia również wprowadzenie lub poprawienie danych lokalizacji. Lokalizacje mogą być również określone przez kliknięcie na skalowalnej mapie świata. Funkcje do znajdowania obrazów dla określonej lokalizacji lub regionu: • {WYSZUKAJ OBRAZY}: Szukaj według nazwy lokalizacji (również wiele nazw, częściowe dopasowania). • {MIEJSCA/DATY}: Szukaj według kraju, lokalizacji i grup dat • Obrazy według lokalizacji na mapie: Kliknij znacznik mapy, aby pokazać wszystkie obrazy w lokalizacji znacznika. - Nazwy lokalizacji (miasto lub inna nazwa miejsca oraz kraj) z GPS aparatu nie są ustandaryzowane i mogą być chaotyczne (np. Munich, München, MONACO). Jak sobie z tym poradzić, omówiono poniżej. - - TOPIC: EDYTUJ META GŁÓWNE +image: edit-meta.jpg - Funkcja Edytuj meta główne służy do dodawania podstawowych metadata do obrazu. Przeczytaj {PRZEGLĄD KEYWORDS} i {GEOTAGS OVERVIEW} (powyżej) przed użyciem Edytuj meta główne. - Edytuj meta główne służy do edycji najczęściej używanych metadata: daty i czasu obrazu, oceny, tytułu, opisu, danych lokalizacji i keywords. Okno dialogowe początkowo pokazuje dane dla bieżącego obrazu. Po wprowadzeniu dodatków lub zmian naciśnij [Zastosuj], aby zaktualizować plik obrazu. Nie ma automatycznego wersjonowania plików dla zmian metadata, ale możesz użyć Zapis pliku > Nowa wersja, jeśli chcesz. - Okno dialogowe pokazuje metadata dla bieżącego obrazu w Widoku pliku lub dla klikniętego thumbnail w Widoku galerii. Okno dialogowe edycji aktualizuje się samo, gdy otwierany jest nowy obraz lub klikany jest nowy thumbnail. - Data obrazu, jeśli dostępna, jest pokazywana jako Data obrazu. Może zostać wprowadzona, jeśli brakuje, lub zmieniona. Możesz wprowadzić pełną datę w formacie yyyy:mm:dd lub krótszy format yyyy lub yyyy:mm. Brakujący miesiąc/dzień jest logicznie równoważny 01:01 przy porównaniu z dolnym limitem wyszukiwania, lub 12:31 przy porównaniu z górnym limitem. Przycisk [Wstecz] wypełnia datę z poprzednio wprowadzonych danych. Ma to na celu umożliwienie łatwego datowania serii obrazów. Jeśli czas jest ważny, możesz dodać czas, używając formatu hh:mm[.ss]. Cały format wpisu to: yyyy:mm:dd hh:mm:ss - Możesz wprowadzić tytuł, opis i ocenę (0-5 gwiazdek) dla obrazu. Aby edytować tytuł lub opis, naciśnij odpowiedni przycisk [edytuj]. Spowoduje to wyskoczenie edytora tekstu z dużym limitem rozmiaru tekstu. Możesz użyć klawisza [enter] do celowego złamania linii. W Fotocx te złamania linii będą działać; w innych przeglądarkach obrazów mogą zostać zastąpione kropkami. - Istniejące keywords są pokazywane w Keywords obrazu. Dostępne keywords są pokazywane w oknie Zdefiniowane keywords poniżej. Jeden z tych keywords można dodać do obrazu, klikając go. Keyword można usunąć z obrazu, klikając go w Keywords obrazu. Ostatnio dodane keywords są pokazywane w Ostatnie keywords. Jest to udogodnienie, które ułatwia dodawanie keywords do nowej partii obrazów, ponieważ wiele z tych samych keywords będzie ponownie użytych. Wskazuj i klikaj w ten sam sposób. - Jeśli lista zdefiniowanych keywords jest długa, może być łatwiej wpisać żądany keyword w Wprowadź keyword. Istniejące keywords pasujące do tego, co wpisałeś dotychczas, pojawiają się w Pasujące keywords, i możesz kliknąć jeden z nich, aby dodać keyword do obrazu. Jeśli wprowadzony keyword jest nowy (nie jest pokazywany żaden pasujący keyword), naciśnij [dodaj nowy keyword], gdy keyword jest kompletny. Zostanie dodany do obrazu i do listy zdefiniowanych keywords z kategorią "nocatg". - Jeśli używasz kategorii keywords, możesz wybrać kategorię, a wtedy tylko te keywords będą pokazane na liście zdefiniowanych keywords. - Przycisk [Zastosuj] zapisuje dane do pliku obrazu i do pliku indeksu metadata używanego do wyszukiwania obrazów. - Przycisk [Wstecz] (na dole okna dialogowego) może być użyty do wczytania wszystkich dostępnych danych z poprzedniego przeglądanego lub edytowanego obrazu. Może to być użyte do przyspieszenia przetwarzania grupy obrazów mających wiele wspólnych danych. - ^Dodawanie geotags Istnieje kilka sposobów dodawania nazw lokalizacji i geowspółrzędnych w oknie dialogowym {EDYTUJ META GŁÓWNE}. - GPS aparatu Czujnik GPS twojego aparatu mógł wstawić nazwy lokalizacji i geowspółrzędne. Język może nie być tym, którego chcesz, lub mogą być użyte wielkie litery, lub jakiś inny chaos. Użyj przycisku [clear], aby zacząć od nowa, i wprowadź nowy tekst. - Przycisk [Znajdź] Wyszukaj lokalizację obecną gdziekolwiek w twoich plikach obrazów lub w ogromnej liście znanych lokalizacji (worldcities.txt). Wprowadź kilka początkowych znaków do Lokalizacji i naciśnij [Znajdź]. Jeśli pokazana zostanie lista wyboru pasujących lokalizacji, wybierz jedną. Jeśli nic nie zostanie pokazane, użyj [Mapa], aby kliknąć lokalizację na mapie. Popraw nazwy lokalizacji i kraju, jeśli to potrzebne. Ta lokalizacja jest teraz znana i dostępna do wyboru. - Przycisk [Poprzedni] Jeśli edytowany obraz ma te same dane lokalizacji co poprzednio edytowany obraz, naciśnij [Poprzedni], aby wypełnić dane lokalizacji użyte wcześniej. - Możesz użyć {MASOWE GEOTAGS}, aby dodać dane lokalizacji do wielu plików obrazów naraz. - - TOPIC: EDYTUJ DOWOLNE META +image: edit-any-metadata.png - Jest to okno dialogowe do edycji dowolnych metadata dla bieżącego pliku obrazu. Najczęstsze tags do edycji są wymienione po lewej stronie. Naciśnij przycisk [Pełna lista], aby uzyskać listę wszystkich dostępnych tags dla bieżącego pliku obrazu (może ich być setki). Naciśnij [Krótka lista], aby wrócić do listy popularnych tags. Kliknij tag na liście, aby pobrać bieżącą wartość tag. Zmień wartość, jeśli chcesz, i naciśnij [aktualizuj]. Aby edytować nazwę tag nieznajdującą się na liście, wprowadź nazwę tag i naciśnij [pobierz], aby pobrać obecną wartość, jeśli istnieje. Następnie wprowadź lub zmień wartość i naciśnij [aktualizuj]. Aby usunąć tag, naciśnij [usuń]. Możesz wprowadzić nazwę tag małymi literami i ze spacjami lub bez nich, np. "Subject Distance" i "subjectdistance" oba zadziałają. Niektórych tags nie można zmienić, np. 'szerokość obrazu' to szerokość pikseli obrazu, którą można zmienić tylko poprzez zmianę szerokości pikseli obrazu. Źródłem krótkiej listy jest plik tekstowy /meta_picklist. Możesz dodawać lub usuwać tags z tej listy. - - TOPIC: USUŃ META Podaj nazwę tag do usunięcia lub wybierz Wszystko. Metadata zostają usunięte. Użyj Wszystko, aby wyczyścić obraz z wszelkich informacji identyfikujących, które mogą być obecne. Niektórych tags nie można usunąć, np. Nazwa pliku. - - TOPIC: KOPIUJ META Połączone obrazy utworzone za pomocą Fotocx (HDR, panorama, mashup ...) domyślnie nie będą zawierać metadata. Użyj tej funkcji, aby skopiować metadata z jednego z obrazów wejściowych lub dowolnego innego obrazu. Użyj przycisków [Przeglądaj], aby wybrać plik źródłowy dla metadata oraz plik do otrzymania metadata ("plik docelowy" w oknie dialogowym). - - TOPIC: NAPRAW META Użyj tej funkcji, jeśli masz plik obrazu, który generuje komunikat o błędzie podczas próby edycji metadata. Usunie ona nieprawidłowo sformułowane metadata i zachowa resztę. - - TOPIC: ZARZĄDZAJ KEYWORDS +image: manage-keywords.png - Twórz keywords i opcjonalnie grupuj je w kategorie. Możesz przypisywać kategorie do keywords, aby pomóc je uporządkować i szybciej je zlokalizować podczas dodawania keywords do obrazów. Są one opcjonalne i nie odgrywają żadnej roli w wyszukiwaniu keyword: w obrazie przechowywany jest tylko keyword, nie jego kategoria. Typowe kategorie to ludzie, miejsca, rzeczy, wydarzenia, krajobrazy, budynki, sztuka itd. Aby dodać nowy keyword z nową kategorią, wprowadź kategorię i keyword, a następnie kliknij [create]. Jeśli kategoria jest pusta, keyword zostanie przypisany do "nocatg". Aby przypisać keyword do innej kategorii, kliknij kategorię (pogrubiony tekst) lub wprowadź nową, kliknij keyword i naciśnij [create]. Keyword przeniesie się ze starej do nowej kategorii. Aby usunąć keyword, kliknij go i naciśnij [usuń]. Keywords używane w obrazach, ale nieprzypisane do kategorii, pojawią się pod "nocatg". Kategorię bez przypisanych keywords można usunąć - kliknij kategorię, wyczyść nazwę keyword, jeśli jest obecna, naciśnij [usuń]. - Uwaga: nowo utworzony keyword jest dodawany na końcu listy keywords dla swojej kategorii. Przy następnym uruchomieniu Fotocx wszystkie kategorie i ich listy keywords są sortowane alfabetycznie, z wyjątkiem tego, że "nocatg" jest zawsze na końcu. - - TOPIC: PODPISY +image: choose-captions.png - ^Menu Wybierz podpisy Wybierz, które tags metadata mają być używane do podpisów tekstowych wyświetlanych w lewym górnym rogu obrazu w trybie widoku pliku. - ^Menu Przełącz podpisy Przełącz wyświetlanie podpisów WŁ. lub WYŁ. Przypisz skrót klawiszowy, aby szybko włączać lub wyłączać wyświetlanie podpisów. - ^Uwaga:^ przesunięcie myszy do lewego górnego rogu obrazu w widoku pliku pokaże tytuł i opis w wyskakującym obrazie. Obraz znika, gdy mysz zostanie przesunięta w inne miejsce. - - TOPIC: MIEJSCA/DATY +image: image-locations.jpg - Jest to szybki sposób na znalezienie wszystkich zdjęć zrobionych w danej lokalizacji lub w danej lokalizacji i zakresie dat. W oknie dialogowym wybierz jedną z dwóch opcji: uwzględnij wszystkie obrazy w raporcie lub uwzględnij tylko obrazy znalezione przez poprzednią funkcję wyszukiwania. Następnie wybierz żądany poziom grupowania: kraj kraj i lokalizacja kraj i data kraj i lokalizacja i data data i kraj data i kraj i lokalizacja - Jeśli data jest uwzględniona, wybierz zakres dni do konsolidacji: zdjęcia z datami w zakresie zostaną zgrupowane razem pod pierwszą datą. Naciśnij [proceed], aby uzyskać raport pokazujący liczbę obrazów w każdej grupie: według kraju, kraju i lokalizacji itd. Jest to również kolejność sortowania. W powyższym przykładzie 28 zdjęć pochodzi z Nowej Zelandii z dnia 2004.11.02. Kliknij wiersz w raporcie, aby uzyskać galerię thumbnails tych obrazów. - - TOPIC: OŚ CZASU +image: timeline-report.jpg - Ten raport tworzy oś czasu liczby obrazów według miesiąca. Wybierz jedną z dwóch opcji: uwzględnij wszystkie obrazy w raporcie lub uwzględnij tylko obrazy znalezione przez poprzednią funkcję wyszukiwania. Kliknij rok i miesiąc w wynikowym raporcie, aby uzyskać galerię thumbnails wszystkich obrazów z datą zdjęcia (EXIF) w wybranym miesiącu. Powyższy przykład pokazuje 208 obrazów dla października 2017. Rok 'null' oznacza obrazy bez daty zdjęcia. - - TOPIC: TAGS METADATA Ta funkcja znajduje wszystkie pliki obrazów używające określonego tag metadata i wartości. Wybierz tag z listy podręcznej: ocena, keywords, tytuł, opis, aparat, dodatkowe zindeksowane metadata - zobacz {INDEKSUJ PLIKI}. Pokazywana jest lista dostępnych wartości tag, wraz z liczbą plików obrazów używających tej wartości tag. Dla 'tytułu' i 'opisu' pokazywane jest tylko pierwsze 60 znaków, i zgłaszane są wszystkie pliki, które używają wartości tag pasujących do tych początkowych 60 znaków. Dla 'aparatu' wartość dopasowania to kombinacja marki, modelu i obiektywu. - - TOPIC: AUTOWYSZUKIWANIE Ta funkcja może być używana przez pliki skryptów powłoki do wyodrębniania plików obrazów spełniających którekolwiek z kryteriów wyboru dostępnych podczas korzystania z funkcji Wyszukaj obrazy (zobacz poniżej). Najpierw użyj funkcji Wyszukaj obrazy, aby ustawić żądane kryteria wyboru (np. nazwy folderów/plików, daty, keywords lub inne metadata). Użyj przycisku [zapisz], aby zapisać kryteria w pliku ustawień. Użyj następującego polecenia, aby uruchomić Fotocx i wykonać wyszukiwanie: $ fotocx -m autosearch . Wynik trafia do /search_results. - - TOPIC: WYSZUKAJ OBRAZY Użyj funkcji Wyszukaj obrazy, aby znaleźć obrazy mające dowolne żądane metadata (data, keywords, lokalizacja ...). Do wyszukiwania używany jest plik indeksu metadata, co umożliwia przeszukiwanie tysięcy obrazów na sekundę. - Istnieją dwa formaty raportu: galeria thumbnails pokazująca wszystkie obrazy pasujące do kryteriów wyszukiwania, lub raport metadata, który łączy thumbnails z tekstem metadata. Oto przykład formatu raportu metadata: +image: search-images-metadata.jpg - ^Okno dialogowe wyszukiwania +image: search-images.jpg - W oknie dialogowym wybierz, które obrazy przeszukać, albo wszystkie (wszystkie obrazy), albo bieżący zestaw, oznaczający obrazy w bieżącej galerii, która może być folderem, albumem lub wynikami poprzedniego wyszukiwania obrazów. - Następnie wybierz, co zrobić ze znalezionymi pasującymi obrazami: 'nowy zestaw' oznacza zastąpienie bieżącego zestawu znalezionymi obrazami, 'dodaj' oznacza dodanie ich do bieżącego zestawu (galerii), a 'usuń' oznacza usunięcie ich z bieżącego zestawu. Aby usunąć obrazy, musisz przeszukać bieżący zestaw. - Dla plików pasujących do kryteriów wyboru możesz dodatkowo określić, które wersje są wybierane: oryginał, ostatnia wersja lub wszystkie wersje. 'oryginał' oznacza oryginalny lub niezmodyfikowany obraz (lub pierwszą wersję, jeśli oryginał nie został zapisany). 'ostatnia wersja' oznacza najnowszą lub ostatnio edytowaną dostępną wersję. 'wszystkie wersje' oznacza, że zostanie pobrany oryginał i wszystkie wersje. - Wybierz żądany typ raportu. Raport galerii to strona obrazów thumbnail, tak długa, jak potrzeba, aby pomieścić wszystkie obrazy pasujące do kryteriów wyszukiwania. Raport metadata zawiera zarówno obrazy thumbnail, jak i listę tags metadata obok każdego thumbnail. Obejmują one standardowe tags (data, ocena, keywords, geotags, tytuł, opis) oraz wszelkie inne tags metadata, które dodałeś na liście wyboru tags (zobacz poniżej). - Wprowadź swoje kryteria wyszukiwania. Wybierz żądane keywords, daty, oceny gwiazdkowe, słowa zawarte w tekście (tytuł lub opis obrazu), nazwy plików lub folderów oraz nazwy lokalizacji. Zobacz więcej szczegółów poniżej. - Dostępne keywords są pokazywane w Zdefiniowane keywords i można je wybierać, wskazując i klikając. Jeśli lista zdefiniowanych keywords jest długa, może być łatwiej zacząć wpisywać keyword w 'wprowadź keyword'. Istniejące keywords pasujące do tego, co wpisano dotychczas, pojawią się na liście 'dopasowania', i możesz kliknąć jeden z nich, aby dodać keyword do listy wyszukiwania. - Jeśli używasz kategorii keywords, możesz wybrać kategorię, a wtedy tylko te keywords będą pokazane na liście zdefiniowanych keywords. - Można wprowadzić zakres dat, aby ograniczyć wyszukiwanie do obrazów w tym zakresie dat. Wybierz datę zdjęcia (z aparatu) lub datę pliku (data utworzenia lub ostatniej modyfikacji). Format to yyyy:mm:dd. Wybierane są obrazy, które mają datę w pierwszej dacie lub później, jeśli jest podana, i w drugiej dacie lub wcześniej, jeśli jest podana. Brakujący miesiąc/dzień domyślnie przyjmuje 01/01 dla dolnego limitu daty i 12/31 dla górnego limitu. Czasy mogą być opcjonalnie określone przy użyciu formatu yyyy:mm:dd hh:mm. Brakujące czasy domyślnie przyjmują 00:00 i 23:59. - Aby wyszukać obrazy bez daty zdjęcia EXIF (np. zeskanowane obrazy), użyj "null" w pierwszym polu daty. - Można wprowadzić parę ocen gwiazdkowych, aby ograniczyć wyniki do obrazów mających ocenę w podanym zakresie. Brakująca dolna wartość oznacza 0 gwiazdek, a brakująca górna wartość oznacza najwyższą ocenę, 5 gwiazdek. - Można przeszukiwać nazwy folderów i plików. W polu szukaj nazw plików wprowadź dowolną liczbę nazw używanych dla folderów i plików obrazów, rozdzielonych przecinkami. Wpis "egypt cairo" dopasuje wszystkie foldery obrazów lub nazwy plików zawierające którykolwiek z tych ciągów. Podciągi również będą dopasowywane. Wielkość liter nie ma znaczenia. - Można przeszukiwać tytuł i opis obrazu. Wprowadź słowa do wyszukania w polu szukaj tytułu/opisu, rozdzielone przecinkami. Będą one dopasowywane do każdego słowa w tytule i opisie wszystkich obrazów, a pasujące obrazy są wybierane. Wielkość liter nie ma znaczenia. - Aby wyszukać lokalizacje, wprowadź jedną lub więcej nazw miast/lokalizacji lub krajów w polu szukaj lokalizacji, rozdzielonych przecinkami. Wybierane będą tylko pliki obrazów z geotags pasującymi do jednej z wprowadzonych lokalizacji. Lokalizacją może być miasto, park lub inna nazwa geograficzna (cokolwiek jest przechowywane w polach metadata 'City' i 'Country'). Wielkość liter nie ma znaczenia. - Przyciski opcji 'wszystkie' i 'dowolne' odnoszą się do keywords, tekstu, nazw plików i lokalizacji. Możesz wybrać obrazy mające WSZYSTKIE wprowadzone ciągi lub DOWOLNY z wprowadzonych ciągów. Przykład: jeśli pole wyszukiwania lokalizacji to "new york" i wybrane jest "dowolne", uwzględnione zostaną obrazy z Nowej Zelandii i z York w Anglii. Jeśli wybrane jest "wszystkie", uwzględnione zostaną tylko obrazy zlokalizowane w Nowym Jorku. - Jeśli chcesz znaleźć obrazy z brakującymi danymi, możesz wprowadzić "null" jako wartość dopasowania. - ^Szukaj dodatkowych metadata Używając pól wejściowych okna dialogowego 'tagname', 'condition' i 'match values', możesz określić dodatkowe tags metadata do użycia jako kryteria wyboru lub do dodania do wyniku raportu, jeśli wybrany jest typ raportu "metadata". Tags dostępne dla danego pliku obrazu można pokazać za pomocą {POKAŻ WSZYSTKIE META}. Obejmują one wiele tags nieobecnych w głównym oknie dialogowym. Lista wyboru pochodzi z pliku tekstowego /meta_picklist. Możesz dodać tags do tego pliku, jeśli chcesz. Możesz używać tags, które są również obecne w głównym oknie dialogowym. Zaletą tutaj jest to, że można użyć bardziej elastycznej logiki dopasowania. - Logikę dopasowania można wybrać dla każdego tag metadata. ^metoda dopasowania wartość dopasowania do wyboru • report dowolna wartość, także brakująca • reportx wartość nie brakująca • matches wartości tekstowe rozdzielone przecinkami • contains to samo, z dopasowaniem podciągów • number = wartości równe • number => wartości równe lub większe • number <= wartości równe lub mniejsze - Przyciski [X] po prawej stronie mogą być użyte do wyczyszczenia pojedynczych tags wyszukiwania metadata. - ^Przyciski okna dialogowego [Wczytaj] i [Zapisz] mogą być użyte do wczytania lub zapisania kryteriów wyszukiwania z pliku. [Wyczyść] wyczyści wszystkie dane w oknie dialogowym. [Kontynuuj] rozpocznie proces wyszukiwania. - Naciśnij przycisk [proceed], aby wykonać wyszukiwanie. Wynikiem jest standardowa galeria thumbnails lub format raportu metadata pokazany powyżej. Możesz zapisać wyszukane obrazy jako trwały album - zobacz {ALBUMY}. - ^Wydajność Wyszukiwanie i raportowanie zindeksowanych metadata jest niemal natychmiastowe. Szybkość dla niezindeksowanych metadata zależy od szybkości komputera i dysku. Mocny komputer z dyskiem SSD może przeszukiwać ponad 100 tys. plików na minutę. - ^search_results^ (album) Wynik funkcji Wyszukaj obrazy jest zapisywany w albumie "search_results". Zmień nazwę tego albumu, jeśli chcesz zapobiec zastąpieniu go przez późniejsze wyszukiwanie. - Ograniczenie: Funkcja wyszukiwania jest ograniczona do 40 000 wyników (znalezionych obrazów spełniających kryteria wyszukiwania). Jeśli ten limit zostanie przekroczony, jesteś powiadamiany, a wyszukiwanie zostaje obcięte. Ten limit istnieje, ponieważ rozmiar przewijanego okna w GTK jest ograniczony, a próba utworzenia większego okna może spowodować awarię lub zawieszenie. - - TOPIC: MENU WYBORU - - TOPIC: PRZEGLĄD OBSZARU Funkcje edycji zazwyczaj dotyczą całego obrazu, ale możliwa jest edycja części obrazu ("obszaru") i pozostawienie reszty bez zmian. Jeśli wybrano obszar obrazu, wtedy większość funkcji edycji będzie działać tylko w obrębie tego obszaru. Niektóre funkcje (np. Przeskaluj) ignorują wybrany obszar. Obszar można wybrać przed rozpoczęciem funkcji edycji lub w trakcie korzystania z funkcji edycji. Wybrany obszar jest natychmiast aktywny, poprzednie edycje są zachowane, a przyszłe edycje będą stosowane tylko w obrębie obszaru. Jeśli rozpoczyna się kolejna edycja, wybrany obszar pozostaje aktywny, więc możliwe jest wykonanie serii edycji w obrębie obszaru. Obszar może być również wieloma niepołączonymi obszarami na obrazie. - Fotocx używa 'obszarów' zamiast 'warstw'. Zamiast wybierać coś z obrazu, tworzyć osobną warstwę z zaznaczenia, edytować warstwę i na koniec scalać warstwę, wybierasz coś na obrazie, wykonujesz funkcje edycji na zaznaczeniu i od razu widzisz efekt końcowy. Obszary mogą być również zapisywane, wklejane do innego obrazu, przenoszone i przeskalowywane oraz dalej edytowane. - +image: edit-selection.jpg - Edycja wybranego obszaru może czasami skutkować widocznymi granicami na krawędziach obszaru (czasami odpowiadają one krawędziom elementów obrazu, więc nie stanowi to problemu). Możesz mieszać krawędzie za pomocą {MIESZANIE OBSZARU}: edycje mogą być stosowane stopniowo od krawędzi obszaru do wewnątrz, i możesz wybrać, które krawędzie są mieszane. - - TOPIC: WYBIERZ OBSZAR +image: select-area.jpg - Okno dialogowe Wybierz obszar uruchamia się z menu Wybór > Wybierz obszar. Wybierz jedną z metod wyjaśnionych poniżej. Każda metoda wybiera obszary obrazu w inny sposób. Możesz zmieniać metody w dowolnym momencie, a wybrane obszary się kumulują. Obrys wybranego obszaru (obszarów) obrazu jest pokazywany podczas dodawania lub usuwania obszarów z zaznaczenia. Przycisk [Zakończ] jest używany do mapowania pikseli obrazu w obrębie obrysów obszaru, przygotowując je do zastosowania kolejnych funkcji edycji. Przycisk [Ukryj] ukrywa obrys obszaru, dając lepszą widoczność edycji i możliwych efektów krawędzi obszaru. Użyj przycisku [Pokaż], aby pokazać obrys obszaru. Przycisk [Wyczyść] usuwa wszystkie zaznaczenia obszarów. Okno dialogowe wyboru obszaru można anulować i ponownie uruchomić później, aby zmodyfikować istniejące obszary lub dodać nowe. - ^Metody Poniższe metody są używane do objęcia jednej lub więcej przestrzeni obrazu, które będą należeć do ostatecznego obszaru. Te metody mogą być używane w dowolnej kolejności, aby definiować przestrzenie, które są albo połączone, albo odłączone. • Prostokąt - przeciągnij, aby obrysować obszar prostokątny • Elipsa - przeciągnij, aby obrysować obszar kołowy lub eliptyczny • Rysowanie odręczne - obrysuj obszar, rysując myszą • Podążaj za krawędzią - obrysuj, podążając za krawędziami elementów obrazu • Wybierz obszar w obrębie myszy - przeciągnij, aby wybrać piksele w obrębie koła wokół wskaźnika myszy. • Wybierz jeden kolor w obrębie myszy - wybierz tylko piksele pasujące do podanego koloru, dopasowanie 0-100%. • Wybierz wszystkie kolory w obrębie myszy - wybierz wszystkie piksele w obrębie myszy, rozszerz zaznaczenie na sąsiednie obszary o kolorach pasujących do kolorów w obrębie myszy (czasami nazywane 'flood'). - Poniższe akapity wyjaśniają szczegóły każdej metody. - ^Prostokąt Przeciągnij myszą od jednego narożnika do przeciwległego narożnika prostokątnego obszaru do wyboru. Rysowany jest prostokąt obejmujący obszar. Kliknij prawym przyciskiem, aby usunąć i zacząć od nowa. Powtórz proces, aby wybrać więcej prostokątnych obszarów. - ^Elipsa Działa to tak samo jak wybór prostokąta, z tym że obejmowany obszar to koło lub elipsa. Miejsce rozpoczęcia przeciągnięcia jest środkiem powstałej elipsy. Kąt przeciągnięcia określa kształt elipsy. - ^Rysowanie odręczne Przeciągnij myszą (z wciśniętym lewym przyciskiem), aby narysować odręczną linię, lub kliknij lewym przyciskiem, aby połączyć prostą linię od ostatniego narysowanego punktu do klikniętego punktu. Kontynuuj wokół docelowego obszaru, aż zostanie otoczony połączonymi krzywymi i liniami. Kliknij prawym przyciskiem, aby usunąć poprzednie linie (pomyłki). Kliknięcie prawym przyciskiem usunie poprzednio klikniętą lub przeciągniętą linię, do 50 pikseli. Kliknij prawym przyciskiem wielokrotnie, aby usunąć więcej. Nowa klikana linia zawsze połączy się z końcem poprzedniej linii. Nowa przeciągana linia połączy się z poprzednią linią, jeśli zostanie rozpoczęta blisko końca tej linii. Jeśli zostanie rozpoczęta gdzie indziej, zostanie narysowana odłączona linia. Możesz rozpocząć nowe przeciągnięcie z daleka i narysować z powrotem, aby połączyć się z poprzednią linią. Jeśli kliknięta linia łączy się z niepożądanym punktem (tzn. nie chcesz połączyć się z ostatnią narysowaną linią), kliknij prawym przyciskiem, aby ją usunąć, a następnie użyj przeciągnięcia, aby rozpocząć nową sekwencję linii. Przeciągnięcie prawym przyciskiem może być użyte do usuwania fragmentów linii: przeciągnij prawym przyciskiem blisko wzdłuż linii, aby ją usunąć, a następnie przeciągnij lewym przyciskiem, aby ponownie narysować linię. Na koniec obszar musi być w pełni objęty, bez luk. Linie, które nieznacznie nakładają się na końcach, są OK. Luki mogą być trudne do znalezienia i poprawienia, więc pracuj przy rozmiarze obrazu 100% lub większym i zachowaj ostrożność. Seria linii automatycznie połączonych kliknięciami lewym przyciskiem nie pozostawi luk, ale odstępstwo od tej sekwencji prawdopodobnie utworzy luki. Aby zmniejszyć możliwość powstania luk, używaj celowych nakładek podczas ręcznego łączenia linii. Poniżej opisano narzędzie wykrywania luk - {ZNAJDŹ LUKĘ W OBSZARZE}. Jeśli krawędź obszaru jest również krawędzią obrazu, nie musisz rysować tej części obszaru. Narysuj linię poza krawędź obrazu i narysuj ją z powrotem na obraz w innym miejscu wzdłuż krawędzi obrazu. - ^Podążaj za krawędzią Piksele o wysokim kontraście (prawdopodobnie krawędzie elementów obrazu) między ostatnim narysowanym punktem a nowo klikniętą pozycją są znajdowane i łączone. Jest to skuteczne dla wyraźnych krawędzi, które nie są zbyt nieregularne. Rozmyte i postrzępione krawędzie mogą nie działać dobrze, i rysowanie odręczne będzie potrzebne, jeśli konieczna jest wysoka precyzja. Zasady łączenia linii są takie same jak wyjaśniono powyżej. Przeciąganie myszą zamiast klikania działa jak rysowanie odręczne, ale z tendencją do podążania za krawędziami elementów z pozycji nieco za myszą. Dla bardzo nieregularnych krawędzi (włosy, listowie), zobacz 'kolor odznaczenia' poniżej. - ^Promień myszy i poziom dopasowania koloru Te dwie kontrolki dotyczą tylko metod 'wybierz w obrębie myszy' opisanych poniżej. Promień myszy określa rozmiar koła wokół wskaźnika myszy. Piksele w obrębie koła są wybierane, lub dostarczają zestaw kolorów do dopasowania i wybierania pikseli od koła myszy na zewnątrz. Poziom dopasowania określa wymagany poziom dopasowania (0-100%) do wyboru pikseli na podstawie ich koloru i jasności. '0' oznacza, że wszystko pasuje, a '100' oznacza, że wymagane jest idealne dopasowanie. - ^Wybierz obszar w obrębie myszy Kliknięcie lewym przyciskiem lub przeciągnięcie wybierze piksele objęte kołem myszy. Kliknięcie prawym przyciskiem odznaczy ostatnie zaznaczenie (powtórz, aby odznaczyć więcej). Przeciągnięcie prawym przyciskiem odznaczy objęte piksele. - ^Wybierz jeden kolor w obrębie myszy Kliknij obraz, aby wybrać kolor. Kolor jest pokazywany na przycisku koloru. Możesz też użyć przycisku, aby ustawić kolor bezpośrednio. Przeciągnięcie lewym/prawym przyciskiem, aby wybrać/odznaczyć piksele w obrębie koła myszy, które pasują do wybranego koloru w ramach poziomu dopasowania. Dostosuj poziom dopasowania w dół lub w górę, aby dopasować większy lub mniejszy zakres kolorów. Klikaj według potrzeb na obrazie, aby zmienić dopasowywany kolor. - ^Opcjonalny kolor odznaczenia Dotyczy to tylko powyższego 'wybierz jeden kolor'. Kliknij lewym przyciskiem na obrazie, aby ustawić kolor odznaczenia. Gdy pole jest zaznaczone, kolor odznaczenia jest aktywny. Jeśli piksel pasuje lepiej do koloru odznaczenia niż do koloru wyboru, piksel zostaje odznaczony. Podczas wybierania wzdłuż krawędzi elementu o niskim kontraście koloru w porównaniu z sąsiednim obszarem, który powinien pozostać niewybrany, ustaw kolor odznaczenia z sąsiedniego obszaru. Jest to pomocne przy dokładnym wybieraniu złożonej krawędzi, takiej jak włosy lub listowie. - ^Wybierz wszystkie kolory w obrębie myszy Jest to nazywane 'flood' w niektórych edytorach. Przeciągnięcie lewym/prawym przyciskiem, aby wybrać/odznaczyć piksele wewnątrz koła myszy. Piksele poza kołem myszy są również uwzględniane, jeśli spełniają te dwa warunki: 1) ich kolor pasuje do dowolnego koloru wewnątrz koła myszy, w ramach bieżącego poziomu dopasowania. 2) znajdują się w zasięgu wyszukiwania wskaźnika myszy. Jest to współczynnik promienia myszy, np. jeśli promień myszy wynosi 20, a zasięg wyszukiwania wynosi 3, wtedy zasięg wyszukiwania wynosi 60 pikseli od wskaźnika myszy. Przeciągnij myszą po nowych obszarach, które chcesz uwzględnić. Obserwuj, jak wybrany obszar rozszerza się na obszary o kolorach pasujących do tych wewnątrz koła myszy. Jeśli posuniesz się za daleko, kliknij prawym przyciskiem, aby usunąć ostatnie zaznaczenie. Powtórz, jeśli to potrzebne, aby usunąć więcej poprzednich zaznaczeń. Zmniejsz promień lub zwiększ poziom dopasowania, aby uzyskać dokładniejszą kontrolę - zaznaczenie będzie rozszerzać się wolniej i pozostawać bliżej koła myszy. Mały promień i wysoki poziom dopasowania mogą być użyte do podążania wzdłuż krawędzi elementu obrazu i wybierania pikseli aż do krawędzi z dobrą precyzją. Po zakończeniu pracy nad krawędzią, użyj metody wybierz obszar w obrębie myszy, aby wybrać resztę. Przeciągnięcie prawym przyciskiem działa jak odznaczenie: piksele wewnątrz koła myszy i pasujące piksele w zasięgu wyszukiwania są odznaczane. Jeśli zaznaczenie posunie się za daleko, często łatwiej jest to poprawić, odznaczając od zewnątrz wybranego obszaru zamiast wybierać od wewnątrz. Może być potrzebna pewna praktyka, aby to wyczuć i móc pracować efektywnie. - ^Wybierz wszystkie kolory w obrębie myszy - podsumowanie • przeciągnięcie lewym - wybierz piksele w myszy i pasujące piksele w zasięgu • kliknięcie prawym - cofnij poprzednie zaznaczenie, powtórz, aby odznaczyć więcej • przeciągnięcie prawym - odznacz piksele w myszy i pasujące piksele w zasięgu - ^Pełzanie krawędzi Obszar, który został zakończony (zobacz poniżej), można rozszerzyć lub zwęzić w krokach 1-pikselowych. Może to być pomocne, aby zredukować efekty krawędziowe, gdy obszar wybrany poprzez dopasowanie kolorów jest edytowany w sposób zmieniający jego jasność. Wybór według koloru może pozostawić wąski pas niedowybranych lub przewybranych pikseli wzdłuż krawędzi, gdzie kolor elementu przechodzi w tło. Rozszerzenie lub zwężenie obszaru o 1-2 piksele może dać czyściej wyglądającą krawędź. Obszar pozostaje zakończony (zobacz poniżej) po pełzaniu. - ^Kolor obrysu obszaru Kolor używany dla koła wyboru myszy i obrysu obszaru można zmienić w dowolnym momencie, klikając jeden z przycisków koloru. Umożliwia to dobrą widoczność na tle różnych kolorów obrazu. - ^Pokaż/Ukryj Użyj [Ukryj], aby ukryć obrysy obszarów. Jest to przydatne, aby lepiej zobaczyć efekty edycji obszaru bez zakłóceń ze strony obrysu obszaru. Użyj [Pokaż], aby pokazać obrysy i wznowić edycję obszaru. - ^Zakończ +image: select-area-finish.png - Obszar nie jest skuteczny do edycji, dopóki nie zostanie pomyślnie zakończony. Zakończ waliduje narysowane obrysy i koloruje objęte piksele w celu wizualnej weryfikacji. Gdy skończysz obrysowywać obszary, użyj przycisku [Zakończ], aby ukończyć proces. Wyskakujące okno dialogowe pokazane powyżej podsumowuje dwie metody, których możesz użyć, aby zakończyć. - Metoda 1: Kliknij lewym przyciskiem myszy wewnątrz obszarów, które zostały obrysowane ręcznie. Objęte obszary są tymczasowo kolorowane, abyś mógł zweryfikować, czy końcowy wynik jest taki, jak zamierzałeś. Można wybrać dowolny objęty obszar, nawet te niebezpośrednio obrysowane: jeśli masz pączek z dziurą, możesz wybrać pączek, dziurę lub oba. Naciśnij [keep], gdy wszystkie obszary zostały kliknięte i poprawnie pokolorowane. Jeśli obrys ręcznie narysowanego obszaru ma lukę, proces kolorowania "wycieknie" i obszary poza obrysowaniem zostaną pokolorowane. W takim przypadku naciśnij [Cofnij] w oknie dialogowym Zakończ, co przywraca pierwotny obrys obszaru. Znajdź lukę w obrysie i zamknij ją, a następnie spróbuj ponownie [Zakończ]. Luka 1-pikselowa w dużym obszarze może być trudna do znalezienia. Powiększ (zoom-in), aby lepiej widzieć. Zobacz funkcję {ZNAJDŹ LUKĘ W OBSZARZE} poniżej, aby uzyskać szybką metodę znajdowania drobnych luk. - Metoda 2: Kliknij prawym przyciskiem gdzieś poza wszystkimi objętymi obszarami. Wszystkie objęte obszary zostaną pokolorowane w celu wizualnej weryfikacji. Jeśli jest luka, wyniki i poprawka są takie same jak opisano w metodzie 1. Ta metoda ma sens, jeśli masz wiele ręcznie obrysowanych obszarów i nie chcesz sprawdzać ich pojedynczo, używając metody 1. - Obszary wybrane za pomocą metod 'wybierz w obrębie myszy' są automatycznie kończone. Obszary te są mapowane podczas procesu wyboru, natomiast obszary wybrane za pomocą prostokąta, elipsy lub jednej z metod rysowania linii są mapowane tylko wtedy, gdy klikniesz wewnątrz nich. Jeśli używasz tylko metod 'wybierz w myszy', możesz nacisnąć [keep] bez klikania żadnego z wybranych obszarów. - Jeśli narysujesz linię od jednej strony obrazu do drugiej, możesz kliknąć po dowolnej stronie linii, aby utworzyć obszar ze wszystkich pikseli po tej stronie linii. Przykład: narysuj poziomą linię na granicy między niebem a lądem. Kliknij powyżej linii, aby wybrać niebo, poniżej linii, aby wybrać ląd. Narysowane linie muszą całkowicie sięgać krawędzi obrazu. - ^Wyczyść Trwale odrzuć bieżący obszar. - - TOPIC: ZNAJDŹ LUKĘ W OBSZARZE Jeśli obrys obszaru został utworzony przez rysowanie odręczne za pomocą wielu pociągnięć, łatwo jest pozostawić małe luki w obrysie, które nie są widoczne poniżej 4x zoom. Próba zakończenia takiego obszaru nie powiedzie się, ponieważ mapowanie pikseli wewnętrznych wycieknie przez lukę i pokryje obszary poza zamierzonym obszarem. Jeśli funkcja Zakończ zawiedzie, ta funkcja może znaleźć lukę. Kliknij gdzieś na obrysie nieudanego obszaru. Obrys będzie powoli ponownie rysowany w jednym kierunku od klikniętej pozycji, aż znaleziony zostanie "piksel końcowy". Tutaj jest luka. Obrys jest następnie rysowany w przeciwnym kierunku, aż napotkana zostanie luka (lub inna). Luka jest tam, gdzie rysowanie się zatrzymało. Powiększ (zoom-in) na lukę i zamknij ją, używając rysowania odręcznego, a następnie przetestuj ponownie, aby zobaczyć, czy pełny obrys można narysować bez zatrzymywania się. Ta funkcja może być używana równolegle z funkcją Wybierz obszar - oba okna dialogowe mogą być aktywne. - - TOPIC: MIESZANIE OBSZARU +image: area-blend.jpg - W tym narzędziu obecne są dwie funkcje: Mieszanie obszaru i Mieszanie krawędzi obszaru. Obie funkcje mogą stopniowo 'cofać' edycję wykonaną w obrębie wybranego obszaru, mieszając poprzednią edycję lub oryginalny obraz. W powyższym przykładzie czterej mężczyźni w tle zostali rozjaśnieni bez żadnego śladu granicy między rozjaśnionymi a niezmienionymi pikselami. - ^Mieszanie obszaru Dowolną część edytowanego wybranego obszaru można zmieszać z oryginalnym obrazem. Użyj przeciągnięć lewym przyciskiem myszy nad regionami do zmieszania. Każde przeciągnięcie myszą w obrębie obszaru będzie stopniowo mieszać wybrany poprzedni obraz, skutecznie redukując lub usuwając edycję, która została wykonana w obrębie obszaru. Tempo mieszania jest określane przez 'poziom mieszania', który można ustawić osobno dla środka i krawędzi koła myszy. Ustaw promień myszy i poziomy mieszania (np. 50/0 dla środka/krawędzi myszy). Przeciągnij myszą nad regionami obszaru do zmieszania. Użyj przeciągnięcia lewym przyciskiem, aby mieszać, przeciągnięcia prawym przyciskiem, aby cofnąć mieszanie lub przywrócić. Możesz użyć tej metody, aby selektywnie mieszać krawędzie obszaru: użyj małego promienia i przeciągnij środek myszy nad krawędziami do zmieszania. Spowoduje to stopniowe mieszanie od krawędzi do wewnątrz. - ^Mieszanie krawędzi obszaru Czasami edytowany obszar będzie miał nienaturalnie wyglądające krawędzie, z powodu ostrej granicy między edytowanym obszarem a otaczającym obrazem (zwłaszcza jeśli obszar został rozjaśniony). Można to skutecznie uczynić niewidocznym, stopniowo wygaszając edycję obszaru dla pasa wzdłuż krawędzi. Edycja obszaru może zostać usunięta w 100% z krawędzi obszaru, zmniejszając się do 0% w głąb na szerokości pasa. Istnieją dwa sposoby mieszania krawędzi obszaru, 'blend' i 'blur'. Blend miesza pas krawędzi z wybraną poprzednią edycją lub oryginalnym obrazem. Blur miesza pas z sąsiednimi pikselami spoza pasa. Ustaw szerokość mieszania za pomocą pola wejściowego 'szerokość mieszania' lub 'szerokość rozmycia'. - Krawędź obszaru 'Blend' i 'Blur' wymagają obliczenia odległości od krawędzi: odległości od każdego piksela obszaru do najbliższej krawędzi obszaru. Ta odległość jest używana do obliczenia względnego mieszania dla piksela: 100% na krawędzi obszaru i 0% dla pikseli poza 'szerokością mieszania' od krawędzi. Dla dużego obszaru ze złożoną krawędzią może to zająć trochę czasu. Miernik postępu jest pokazywany na górnym panelu. - - TOPIC: POKAŻ/UKRYJ OBSZAR Pokaż lub ukryj obrys bieżącego obszaru. Ukrycie obszaru jest przydatne, gdy obszar jest modyfikowany za pomocą funkcji edycji. Ułatwia to ocenę efektów edycji. Są one również dostępne jako przyciski w oknie dialogowym Wybierz obszar. - - TOPIC: WŁĄCZ/WYŁĄCZ OBSZAR Wyłącz bieżący obszar i zachowaj dane, aby można je było ponownie aktywować później (menu Włącz). Umożliwia to przełączanie między edycjami w obrębie wybranego obszaru a edycjami całego obrazu. - - TOPIC: ODWRÓĆ OBSZAR Odwróć istniejący obszar: wybierany jest cały obraz oprócz istniejącego obszaru. Dwukrotne użycie funkcji przywraca oryginalny wybrany obszar. Odwrócenie wybranego obszaru unieważnia obliczenie krawędzi, które musi zostać powtórzone, jeśli pożądane jest mieszanie krawędzi obszaru. - - TOPIC: WYCZYŚĆ OBSZAR Trwale odrzuć bieżący obszar. Jest to również dostępne jako przycisk w oknie dialogowym Wybierz obszar. - - TOPIC: KOPIUJ/WKLEJ OBSZAR Wybrany obszar można zapisać do pliku pamięci podręcznej za pomocą menu Obszary > Kopiuj. Ten obszar można wkleić do tego samego lub innego obrazu za pomocą Obszary > Wklej. Kliknij i przeciągnij, aby ustawić pozycję wklejonego obszaru. Kontrolki okna dialogowego mogą być użyte do przeskalowania i obrócenia wklejonego obszaru. - - TOPIC: WCZYTAJ/ZAPISZ OBSZAR Wybrany obszar można zapisać do pliku za pomocą menu Obszary > Zapisz. Jesteś proszony o podanie nazwy pliku. Tworzony jest plik PNG. Plik PNG ma kanał alfa dla informacji o przezroczystości. Obraz to prostokąt obejmujący wybrany obszar. Wybrane piksele są nieprzezroczyste, a pozostałe są przezroczyste. - Te pliki domyślnie znajdują się w /saved_areas, ale możesz je zapisać w dowolnym miejscu. Użyj menu Obszary > Wczytaj, aby wczytać zapisany obszar z pliku i wkleić do bieżącego pliku obrazu. Obraz tła będzie widoczny przez przezroczyste części wklejonego obszaru. Kliknij i przeciągnij, aby ustawić pozycję obszaru. Kontrolki okna dialogowego mogą być użyte do przeskalowania i obrócenia wklejonego obszaru. - - TOPIC: PRZYCISK COFNIJ/PONÓW Jeśli funkcja edycji jest aktywna i obraz został zmieniony: • kliknięcie lewym przyciskiem myszy cofnie bieżącą edycję • kliknięcie prawym przyciskiem myszy ponowi edycję Umożliwia to szybkie porównanie obrazów "przed" i "po" dla bieżącej funkcji edycji. - Jeśli ŻADNA funkcja edycji nie jest aktywna, ale w bieżącym obrazie wykonano jakieś edycje: • kliknięcie lewym przyciskiem myszy cofnie jeden krok edycji na kliknięcie • kliknięcie prawym przyciskiem myszy ponowi jeden krok edycji na kliknięcie • kliknięcie środkowym przyciskiem myszy pokazuje listę wszystkich kroków edycji. Możesz wrócić do dowolnego kroku edycji lub oryginalnego obrazu - Jeśli otworzysz inny plik, zapisane kroki edycji dla bieżącego pliku zostaną odrzucone. - - TOPIC: MENU EDYCJI - - TOPIC: OBRÓĆ Aby wypoziomować przekrzywiony obraz, użyj myszy, aby przeciągnąć prawą lub lewą stronę obrazu w górę lub w dół, aż obraz będzie wyglądał na wypoziomowany. Kliknięcie lewym przyciskiem na obrazie doda pionowe i poziome linie prowadzące, które pomogą w poziomowaniu obrazu. Użyj kliknięcia prawym przyciskiem, aby je usunąć. - Przycisk [Automatyczny poziom] może automatycznie wypoziomować obraz, jeśli aparat zarejestrował 'kąt przechyłu' w metadata EXIF. Przycisk [Auto Upright] może automatycznie wyprostować obraz zrobiony przy aparacie obróconym o 90º, jeśli 'orientacja' jest obecna w metadata EXIF. - - TOPIC: PROSTUJ Jest to poprawka jednym przyciskiem dla obrazu, który jest obrócony o 90/180 stopni lub odwrócony (odbity lustrzanie). Nie ma utraty rozdzielczości, ponieważ piksele są kopiowane 1:1 do nowego układu obrazu. Zobacz też funkcję {MASOWE PROSTOWANIE}. - - TOPIC: KADRUJ +image: crop-image.jpg +image: crop-buttons.jpg - Odetnij niechciane obszary z krawędzi obrazu. Gdy okno dialogowe się otwiera, prostokąt zaznaczenia jest umieszczany nad obrazem. Obszary poza tym prostokątem są przyciemnione i reprezentują części obrazu, które zostaną usunięte. Przeciągnij dowolną stronę lub narożnik prostokąta, aby przesunąć tę stronę lub narożnik. Okno dialogowe pokazuje bieżącą proporcję szerokości/wysokości prostokąta zaznaczenia. Jeśli zaznaczone jest "Zablokuj", wtedy przesunięcie strony lub narożnika spowoduje przesunięcie innej strony lub narożnika, tak aby zachować stałą proporcję szerokości/wysokości. Przeciągnij ze środka (oznaczonego małym kółkiem), aby przesunąć cały prostokąt bez zmiany wymiarów. Użyj przycisków liczbowych szerokości i wysokości, aby bezpośrednio dostosować wymiary pikseli obrazu, lub wprowadź żądane wartości. Prostokąt zaznaczenia dostosuje się do tych wartości. - Użyj klawiszowych strzałek, aby przesuwać prostokąt zaznaczenia w krokach 1-pikselowych. Ostatnia strona lub narożnik przesunięty myszą jest tym, który jest przesuwany za pomocą strzałek. - Przycisk [Maks.] resetuje prostokąt kadrowania do pełnego rozmiaru obrazu. Jeśli poprzednia edycja (Obróć, Wypacz ...) pozostawiła przezroczyste marginesy wokół obrazu, prostokąt kadrowania będzie odzwierciedlać maksymalny rozmiar mieszczący się w tych marginesach. - Przycisk [Wstecz] pobiera listę poprzednio używanych wartości szerokości i wysokości. Wybierz z listy, aby użyć jednej z nich. - Pięć przycisków proporcji umożliwia wybór wstępnie ustawionej proporcji szerokości/wysokości. Przycisk [invert] odwraca bieżącą proporcję szerokości/wysokości. - Możesz zmienić przyciski proporcji za pomocą przycisku [customize], który uruchamia nowe okno dialogowe pokazane po prawej stronie. Kliknij przycisk, aby go edytować. Wprowadź żądaną proporcję szerokości do wysokości, używając formatu "ww:hh", jak w pokazanym przykładzie. - - TOPIC: RETUSZ +image: retouch.png - Dostosuj jasność i kolor obrazu. • automatyczny poziom czerni - ustaw punkt czerni, używając % najciemniejszych pikseli • automatyczny balans bieli - ustaw punkt bieli, używając % najjaśniejszych pikseli • kliknij szary punkt dla balansu bieli - kliknij szary punkt na obrazie • kliknij ciemny punkt dla poziomu czerni - kliknij ciemny punkt na obrazie • kliknij, aby uzyskać wyskakujący wykres histogramów RGB • jasność - przesuwa krzywą 'wszystko' w górę lub w dół (zmieniają się wszystkie kolory) • kontrast - zmienia nachylenie krzywej 'wszystko' • nasycenie koloru - czarno-białe <--> intensywne kolory • temperatura koloru - balans oświetlenia (ciepłe <--> zimne) - Po dokonaniu wstępnych ustawień za pomocą suwaków możesz doprecyzować jasność i kontrast, edytując krzywe myszą, aby zmienić, które części obrazu zmieniają się bardziej lub mniej. Krzywa ALL dostosowuje wszystkie kolory, a 3 krzywe RGB dostosowują poszczególne kolory. Użyj najpierw ALL, a następnie wprowadź poprawki za pomocą RGB. - ^Przyciski Resetuj - ustaw wszystkie kontrolki z powrotem w pozycji neutralnej - obraz również jest resetowany Wstecz - ustaw wszystkie kontrolki na wartości użyte dla poprzedniego obrazu Gotowe - zakończ edycję, zamknij okno dialogowe, zapisz ustawienia kontrolek Anuluj - anuluj edycję, zresetuj obraz, zamknij okno dialogowe - Użyj przycisku [Wstecz] podczas przetwarzania wielu obrazów wymagających podobnych dostosowań. - - TOPIC: PRZESKALUJ +image: rescale.png - Ta funkcja przeskalowuje obraz do nowej szerokości i wysokości pikseli. Możesz wprowadzić nowe wymiary bezpośrednio lub wybrać zmianę procentową. Dostępne są przyciski do ustawienia nowego rozmiaru na prostą proporcję oryginalnego rozmiaru. Użycie jednego z nich zminimalizuje utratę rozdzielczości. Przycisk [Poprzedni] przywołuje poprzedni rozmiar, co jest wygodne, jeśli wiele obrazów jest ustawianych na ten sam rozmiar. Jeśli zaznaczone jest pole blokady proporcji, bieżąca proporcja szerokości/wysokości zostanie zachowana, jeśli zmieniona zostanie szerokość lub wysokość. - - TOPIC: PODZIELONY EKRAN +image: split-screen1.jpg +image: split-screen2.png - Podczas funkcji edycji wyświetlaj obrazy przed i po za pomocą metody podzielonego ekranu. Przeciągnij linię graniczną myszą. Gdy wyjdziesz z Podzielonego ekranu, możesz normalnie kontynuować funkcję edycji. - Jeśli żadna funkcja edycji nie jest aktywna, wybierz dwa obrazy do pokazania za pomocą podzielonego ekranu. Muszą mieć te same wymiary pikseli. - - TOPIC: POKAŻ RÓŻNICE Podczas funkcji edycji podświetl zmiany, przyciemniając niezmienione obszary. Użyj suwaka, aby dostosować przyciemnienie niezmienionych obszarów. Gdy wyjdziesz z Pokaż różnice, możesz normalnie kontynuować funkcję edycji. - Jeśli żadna funkcja edycji nie jest aktywna, wybierz dwa obrazy, aby podświetlić ich różnice. Muszą mieć ten sam wymiar pikseli. - - TOPIC: MARGINESY +image: margins.png - Użyj tej funkcji, aby dodać marginesy wokół obrazu. Możesz użyć dowolnego koloru i ustawień alfa (przezroczystości) dla marginesów. Ustaw każdy margines osobno, lub użyj kontrolek 'Wszystko±1' i 'Wszystko±10', aby dostosować wszystkie marginesy w górę lub w dół o tę samą wartość, 1 lub 10 pikseli. Użyj kółka myszy lub strzałek góra/dół, aby przyspieszyć. - Możesz użyć tej funkcji, aby dodać marginesy wokół obrazów, które planujesz wypaczyć, aby zapobiec wypadnięciu niektórych obszarów poza krawędzie. - - TOPIC: OZNACZENIA +image: markup.jpg - Jest to menu zawierające funkcje oznaczeń obrazu: rysuj tekst, rysuj linię/strzałkę, rysuj prostokąt, rysuj owal Wszystkie te funkcje mają przycisk [commit], który zatwierdza bieżącą edycję i pozwala rozpocząć nową (nowy tekst/linię/prostokąt/owal) w obrębie tego samego okna dialogowego edycji. - ^Rysuj tekst Ta funkcja rysuje tekst bezpośrednio na obrazie. Wprowadź tekst do okna dialogowego. Można użyć wielu linii. Po wprowadzeniu tekstu kliknij lewym przyciskiem myszy w miejscu, gdzie chcesz umieścić tekst na obrazie. Przeciągnij, aby przenieść tekst gdzie indziej. Kliknij prawym przyciskiem, aby usunąć tekst. Użyj przycisku [Czcionka], aby wybrać inną czcionkę. Użyj kontrolki [Rozmiar], aby zwiększyć lub zmniejszyć rozmiar tekstu. Użyj kontrolki [Kąt], aby zmienić kąt pochylenia tekstu. Pozostałe kontrolki umożliwiają podanie koloru tła wokół tekstu, koloru obrysu tekstu i efektu cienia. Możesz wybrać kolor i przezroczystość dla wszystkich tych elementów. Kontrolka szerokości dostosowuje szerokość obrysów i cieni. Kontrolka kąta cienia ustawia kąt cienia. Użyj kontrolek wytłoczenia, aby nadać tekstowi wygląd 3D. - Możesz zainicjować tekst z dowolnych dostępnych metadata w pliku obrazu. Wprowadź tag metadata (np. "user comments") i naciśnij [Pobierz]. Możesz skracać nazwy tags, np. "usercomments" zamiast "User Comments". - Przyciski [Otwórz] i [Zapisz] uruchamiają okno dialogowe wyboru pliku, za pomocą którego możesz wczytać lub zapisać wszystkie dane tekstowe z pliku lub do pliku. Wszystkie elementy okna dialogowego są wczytywane lub zapisywane, więc możesz przechowywać kolekcję często używanych ciągów tekstowych i ustawień. - Przyciski na dole działają w następujący sposób: • Wyczyść - wyczyść pola tekstu i metadata do pustych • Zastąp - obraz z dodanym tekstem zastępuje bieżący obraz • +Wersja - obraz z dodanym tekstem jest zapisywany jako nowa wersja • Dalej - otwórz następny plik, umieść ten sam tekst w tej samej pozycji • Zastosuj - zatwierdź bieżącą edycję i zresetuj do wprowadzenia nowego tekstu • Gotowe - zakończ bieżącą edycję - obraz jest gotowy do zapisu • Anuluj - porzuć bieżącą edycję - Aby dodać ten sam tekst do serii obrazów: przygotuj i ustaw pozycję tekstu, naciśnij [Zastąp] lub [+Version], następnie [Dalej], następnie [Zastąp] lub [+Version], następnie [Dalej] ... - Utwórz znak wodny: Użyj przezroczystości tekstu 70% lub więcej i przezroczystości tła 100%. Tekst powinien być słabo czytelny. Użyj kontrolek wytłoczenia, aby tekst wyglądał, jakby był wgłębiony w obraz. - ^Rysuj linię Ta funkcja rysuje linie lub strzałki bezpośrednio na obrazie. Wprowadź długość i szerokość linii do okna dialogowego i wybierz grot strzałki, jeśli chcesz. Kliknij lewym przyciskiem myszy w miejscu, gdzie chcesz ją umieścić na obrazie. Przeciągnij końce linii/strzałki, aby ustawić jej pozycję na obrazie. Kliknij prawym przyciskiem, aby ją usunąć. Przeciągnij ze środka linii, aby przesunąć bez zmiany kąta lub długości. Kontrolki okna dialogowego umożliwiają podanie koloru tła, koloru obrysu i efektu cienia. Możesz wybrać kolor i przezroczystość dla wszystkich tych elementów. Kontrolka szerokości dostosowuje szerokość obrysów i cieni. Kontrolka kąta cienia ustawia kąt pochylenia cienia. Aby zachować narysowaną linię i rozpocząć kolejną, naciśnij [zastosuj]. - ^Rysuj prostokąt Wybierz kolor i szerokość dla obrysu prostokąta. Umieść kursor w pozycji, w której chcesz narożnik prostokąta, i przeciągnij, aby otworzyć prostokąt w żądanym kierunku. Aby zastąpić prostokąt, przeciągnij ponownie. Aby przesunąć prostokąt, przytrzymaj klawisz shift i przeciągnij prostokąt ze środka. Aby przesunąć jedną z krawędzi, przytrzymaj klawisz shift i przeciągnij krawędź. Aby zachować narysowany prostokąt i rozpocząć kolejny, naciśnij [zastosuj]. - ^Rysuj owal Wybierz pole wyboru owalu (elipsa) lub koła. Wybierz kolor i szerokość dla obrysu. Umieść kursor w żądanym środku. Przeciągnij, aby narysować owal/koło. Kąt przeciągnięcia określa kształt owalu, od koła do skrajnej elipsy, szerokiej lub wysokiej. Aby zastąpić owal/koło, przeciągnij ponownie. Aby przesunąć owal/koło, przytrzymaj klawisz shift i przeciągnij ze środka. Aby zmienić rozmiar lub kształt, przytrzymaj klawisz shift i przeciągnij od dolnego prawego rogu. Aby zachować narysowany owal/koło i rozpocząć kolejny, naciśnij [zastosuj]. Dla owalu możesz wprowadzić kąt 0-90 stopni dla pochylonych osi, jak w przykładzie. - - TOPIC: TRYB KOLORU +image: color-mode.png +image: color-mode2.jpg - Użyj tej funkcji, aby utworzyć czarno-biały lub kolorowy negatyw, lub przekształcić obraz negatywowy w obraz pozytywowy, lub przekonwertować na kolorystykę sepii (dla efektu postarzonego zdjęcia). Suwak może być użyty do stopniowego zastosowania efektu, od 0% do 100%. - - TOPIC: MALOWANE EDYCJE Użyj tej funkcji w połączeniu z jakąś inną funkcją edycji. Rozpocznij funkcję edycji i zostaw kontrolki w pozycji neutralnej. Następnie uruchom Malowane edycje. Maluj funkcję edycji tam, gdzie chcesz, za pomocą myszy. Zobacz {MOUSE PAINTING}, aby dowiedzieć się, jak stosować edycje lokalnie za pomocą myszy. - Ta metoda stopniowego "malowania" edycji może szybko i łatwo poprawić wybrane obszary obrazu. Działa z następującymi funkcjami edycji: • Edytuj > Retusz, Tryb koloru • Napraw > Wyostrz, Rozmycie, Redukcja szumu, Usuń mgłę, Dostosuj RGB, Dostosuj HSL • Dopracuj > Spłaszcz histogram, Kontrast lokalny, Wzmocnij kontrast, Retinex lokalny, Nasycenie, Miękka ostrość • Efekty > Obrysy, Szkic2, Wytłoczenie, Tekstura, Dodaj poświatę, Ustaw kolory, Przesuń kolory, Własne jądro - - TOPIC: MALUJ OBRAZ +image: paint-image.jpg - Ta funkcja maluje po obrazie wybranymi kolorami, używając myszy. Zobacz {MOUSE PAINTING}, aby dowiedzieć się, jak stosować edycje lokalnie za pomocą myszy. - Przycisk Kolor malowania pokazuje bieżący kolor. Kliknij ten przycisk, aby wybrać kolor za pomocą standardowego okna dialogowego wyboru koloru Gnome. Możesz też shift + kliknięcie lewym przyciskiem na obrazie, aby wybrać kolor z obrazu. - Przycisk palety otwiera okno dialogowe pokazane na środku. Kliknij obraz, aby wybrać kolor w tej pozycji. Wybrany kolor jest odzwierciedlony w przycisku koloru głównego okna dialogowego. Obraz pokazany powyżej jest domyślny. Możesz użyć dowolnego obrazu jako źródła koloru. Naciśnij przycisk [przeglądaj] i wybierz obraz, w którym zapisałeś kolory do przywołania. Ten wybór pozostaje w mocy, dopóki nie zostanie zmieniony. - Przycisk HSL otwiera okno wyboru koloru HSL pokazane po prawej stronie. To okno dialogowe może przedstawiać dowolny możliwy kolor. Przesuń suwaki, aby uzyskać żądany kolor. Wybrany kolor jest odzwierciedlony w przycisku koloru głównego okna dialogowego. - Jeśli wybrane jest malowanie nad przezroczystymi obszarami, malowanie nad przezroczystymi obszarami zredukuje lub wyeliminuje przezroczystość, w zależności od kontrolek krycia. Jeśli ta opcja nie jest wybrana, malowane są tylko nieprzezroczyste obszary obrazu. - ^Obsługa tabletu Wacom Z Maluj obraz możesz użyć tabletu Wacom zamiast myszy. Przeciąganie rysika w kontakcie z powierzchnią tabletu będzie malować, jak opisano powyżej. Jeśli jeden z przycisków rysika jest przytrzymany podczas przeciągania, operacja będzie usuwaniem zamiast malowania. Możesz też ustawić tryb malowania lub usuwania za pomocą przycisków opcji w oknie dialogowym. Przytrzymywanie przycisku rysika jest niewygodne, dlatego są tam przyciski opcji. Dodanie nacisku na rysik zwiększy krycie, więc możesz tworzyć jaśniejsze i ciemniejsze pociągnięcia bez dostosowywania kontrolek krycia. - - TOPIC: MALUJ PRZEZROCZYSTOŚĆ +image: paint-transp.png +image: paint-transp2.jpg - Maluj przezroczyste lub półprzezroczyste obszary na obrazie. Zobacz {MOUSE PAINTING}, aby dowiedzieć się, jak stosować edycje lokalnie za pomocą myszy. - - TOPIC: WYPEŁNIENIE OBSZARU Wypełnij wszystkie wybrane obszary lub wszystkie przezroczyste obszary wybranym kolorem nakładki. Jeśli obszar jest częściowo przezroczysty, kolor nakładki zastąpi przezroczystą część obrazu. Suwak 'Blend' może być użyty do wybrania dowolnego mieszania oryginalnego obrazu i koloru nakładki. - - TOPIC: KOPIUJ W OBRAZIE Maluj po obszarach obrazu, kopiując z innego miejsca w tym samym obrazie. Ta metoda może być użyta do duplikowania obiektów w obrębie obrazu lub usuwania niechcianego obiektu, zastępując go tłem pobranym z innego miejsca. Kliknij lewym przyciskiem na obrazie, aby wybrać lokalizację źródłową, a następnie kliknij prawym przyciskiem, aby wybrać odpowiadającą lokalizację docelową. Zobacz {MOUSE PAINTING}, aby dowiedzieć się, jak stosować edycje lokalnie za pomocą myszy. - Jeśli wybrane jest malowanie nad przezroczystymi obszarami, malowanie nad przezroczystymi obszarami zredukuje lub wyeliminuje przezroczystość. Jeśli ta opcja nie jest wybrana, malowane są tylko nieprzezroczyste obszary obrazu. - - TOPIC: KOPIUJ Z OBRAZU Maluj po obszarach obrazu, kopiując z innego obrazu. Obraz docelowy jest 'malowany' przez przeciąganie myszą po obszarze do zmodyfikowania. Wcześniej wybrana pozycja w obrazie źródłowym jest kopiowana do obrazu docelowego. Obszar kopiowany i obszar malowany są oba objęte kołami, które poruszają się wraz z myszą. W powyższym przykładzie łódka z prawego obrazu została skopiowana do lewego obrazu. - Zacznij od otwarcia obrazu docelowego. Wybierz menu 'Kopiuj z obrazu'. Uruchamiana jest 2. sesja Fotocx pokazująca ten sam obraz. W tej 2. sesji przejdź do obrazu źródłowego i otwórz go. Ustaw oba okna tak, aby oba były widoczne (przynajmniej obszary do skopiowania). Shift + kliknięcie lewym przyciskiem na obrazie źródłowym, aby ustalić pozycję źródłową. Shift + kliknięcie lewym przyciskiem na obrazie docelowym w pozycji docelowej. - Przeciągnij myszą lewym przyciskiem po obszarze obrazu docelowego. Piksele z obrazu źródłowego są kopiowane do obrazu docelowego. Powiększ (zoom) obrazy do maks. rozmiaru, jeśli potrzebna jest wysoka precyzja pozycji odniesienia. Początkowa pozycja odniesienia to (0,0) (narożnik NW) dla obu obrazów. Zobacz {MOUSE PAINTING}, aby dowiedzieć się, jak stosować edycje lokalnie za pomocą myszy. - Wartość skali obrazu źródłowego jest używana do przeskalowania obrazu źródłowego do obrazu docelowego. Zacznij od wykonania próbnej kopii, aby sprawdzić skalę. Jeśli za duża lub za mała, użyj [undo all], aby usunąć próbę, zmień wartość skali i spróbuj ponownie. - Jeśli wybrane jest malowanie nad przezroczystymi obszarami, malowanie nad przezroczystymi obszarami zredukuje lub wyeliminuje przezroczystość, w zależności od kontrolek krycia myszy. Jeśli ta opcja nie jest wybrana, malowane są tylko nieprzezroczyste obszary obrazu. - - TOPIC: KOPIUJ POPRZEDNIĄ EDYCJĘ Obraz z poprzedniego kroku edycji można zastosować do bieżącego obrazu lokalnie i stopniowo, "malując" myszą. Poprzednia edycja musi być jedną z edycji wykonanych na bieżącym obrazie, gdy jest on wciąż otwarty - niezapisane edycje są tracone, gdy otwierany jest nowy obraz. Możesz zastosować dowolną poprzednią edycję do dowolnego obszaru bieżącego edytowanego obrazu, dopóki obraz pozostaje otwarty jako bieżący obraz. Wybierz poprzednią edycję za pomocą rozwijanej listy, która pokazuje wszystkie poprzednie kroki edycji wykonane na bieżącym obrazie, w kolejności, i zidentyfikowane przez użytą funkcję edycji. Zobacz {MOUSE PAINTING}, aby dowiedzieć się, jak stosować edycje lokalnie za pomocą myszy. - - TOPIC: MENU NAPRAWY - - TOPIC: WYOSTRZ +image: sharpen.png - Ta funkcja ma pięć metod wyostrzania rozmytego obrazu oraz metodę wyostrzania rozmycia ruchu spowodowanego ruchem aparatu lub obiektu podczas naświetlania. - Wybierz metodę, ustaw parametry, naciśnij [zastosuj] i poczekaj kilka sekund, aby zobaczyć wynik. Wprowadź zmiany i powtórz proces, aż będziesz zadowolony. Użyj {WYBIERZ OBSZAR}, aby działać na różnych częściach obrazu za pomocą różnych metod i parametrów. - Dla wszystkich metod wybierz mały promień dla obrazów, które są lekko rozmyte, i większe wartości dla gorszych obrazów. Ilość kontroluje siłę modyfikacji. Próg tłumi zmiany dla pikseli o niskim kontraście: wyższe wartości redukują wzmocnienie nieregularności niskiego poziomu (szum obrazu, nierówne odcienie skóry itd.). - Maska wyostrzająca: klasyczna metoda spotykana w większości edytorów obrazów. Opis techniczny można znaleźć, przeszukując internet. Ta metoda może uczynić widocznymi 'halo' wokół krawędzi o wysokim kontraście. - Wzmocnij kontrast: wzmocnij istniejący kontrast. Skuteczność jest porównywalna z maską wyostrzającą, ale 'halo' są zredukowane. - Kuwahara: małe sąsiedztwa wokół każdego piksela są ze sobą porównywane. Pikselowi nadawany jest średni kolor sąsiedztwa o najmniejszej różnicy. Wymusza to, aby piksele na rozmytej krawędzi dopasowały się do jednej lub drugiej strony krawędzi. Krawędzie stają się bardzo ostre. Obraz może wyglądać na 'blokowaty', jeśli używany jest duży promień. Subtelne szczegóły mogą zostać utracone. - Różnica medianowa: jasność piksela jest porównywana z medianą pikseli w obrębie promienia. Jasność jest zwiększana lub zmniejszana dla pikseli odpowiednio jaśniejszych lub ciemniejszych niż średnia sąsiedztwa. Skuteczność jest porównywalna z maską wyostrzającą, ale 'halo' są znacznie zredukowane. Jest to jedyna metoda, która działa na każdym kolorze RGB osobno. Może wyostrzyć przejście koloru, nawet jeśli zmiana jasności jest niewielka. - Richardson-Lucy: obraz jest wyostrzany za pomocą metody dekonwolucji Richardson-Lucy. Ta metoda może dać najlepsze wyniki, ale jest też dość wolna. Aby przyspieszyć, zacznij od wybrania małego, ale ruchliwego obszaru obrazu za pomocą {WYBIERZ OBSZAR}. Poszukaj optymalnego promienia i liczby iteracji, używając tego małego obszaru. Następnie użyj tych samych ustawień dla całego obrazu. Szum w obrazie utrudni skuteczność. Jeśli tak, użyj wcześniej {REDUKCJA SZUMU}. - Obraz powiększony dokładnie 2x można wyostrzyć za pomocą Richardson-Lucy, używając promienia 2.0 i 4 lub więcej iteracji. Wyniki są niezwykle dobre. - ^Napraw rozmycie ruchu +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - Ręcznie optymalizuj obrazy z niewielkim rozmyciem spowodowanym ruchem aparatu lub obiektu. Rozmycie od poruszającego się obiektu na poza tym ostrym obrazie można przetworzyć, używając {WYBIERZ OBSZAR}, aby wyizolować obiekt. Zakłada się, że rozmycie jest liniowe i o stałej prędkości. Danymi wejściowymi są 'rozpiętość rozmycia' w pikselach i 'kąt rozmycia' w stopniach. Początkowe oszacowanie kąta można określić przez shift + przeciągnięcie myszą po obrazie w kierunku rozmycia (może być takie samo lub przeciwne do rzeczywistego ruchu). Wprowadź oszacowanie rozpiętości rozmycia, używając Narzędzia > Pokaż RGB, aby zmierzyć szerokość rozmycia wzdłuż jakiejś jasnej krawędzi elementu obrazu. Dostosuj dane wejściowe, naciśnij [zastosuj] i sprawdź obraz, aby znaleźć optymalne ustawienia. Czas reakcji może być wolny dla dużego obrazu. Możesz przyspieszyć proces, jeśli użyjesz {WYBIERZ OBSZAR}, aby wybrać mały rozmyty obszar do optymalizacji rozpiętości i kąta, a następnie wyczyścić obszar, aby przetworzyć cały obraz, używając tych samych ustawień. Algorytm może wytwarzać szum "dzwonienia", który można stłumić za pomocą pola wejściowego 'tłum efekt dzwonienia'. Najlepiej jest pozostawić niską wartość tłumienia, aby znaleźć optymalną rozpiętość i kąt, a następnie dodać tłumienie w miarę potrzeb, aby zredukować dzwonienie. Metoda dekonwolucji Richardson-Lucy jest używana w jednym wymiarze. - ^Rozmycie ruchu aparatu cyfrowego Nie wszystkie rozmyte zdjęcia mają rozmycie o stałej prędkości najlepiej pasujące do tej metody. Obraz może być superpozycją wielu krótszych naświetleń. Cały obraz może nie być naświetlany w tym samym czasie i mieć to samo rozmycie (mechaniczna lub elektroniczna migawka ruchoma). Ta metoda może mimo to dawać lepsze wyniki niż narzędzia wyostrzające działające w dwóch wymiarach. Powinna działać lepiej na starych zdjęciach zrobionych aparatami na film, gdzie rozmycie ruchu jest bliższe stałej prędkości. - - TOPIC: ROZMYCIE +image: blur.jpg - Wybierz metodę za pomocą odpowiedniego pola wyboru, wprowadź wymagane parametry, naciśnij [zastosuj]. Jeśli {WYBIERZ OBSZAR} jest aktywne, dotyczy to tylko wybranych obszarów. - ^Rozmycie normalne Zmieszaj każdy piksel z otaczającymi pikselami w obrębie promienia. Bliższe piksele mają wyższą wagę. Możesz ustawić promień na 1 i naciskać [zastosuj] wielokrotnie, aby powoli zwiększać rozmycie, obserwując wynik obrazu. - Możesz opcjonalnie rozmywać o różne wartości w kierunku poziomym i pionowym, jeśli wprowadzisz osobne wartości poziome i pionowe. Pole wejściowe [promień] wymusi te same wartości dla obu. - ^Rozmycie radialne Zmieszaj każdy piksel z pikselami wzdłuż linii od wybranego środka. Promień określa centralny obszar, który nie jest rozmywany. Długość ustawia zasięg linii rozmycia: od 0 do długości, od środka do krawędzi. Wybierz środek, klikając obraz. - ^Rozmycie kierunkowe Przeciągnij pozycję na obrazie za pomocą myszy. Obszar wokół myszy zostanie rozmyty w tym kierunku. Zasięg określa rozmiar rozmywanego obszaru. Intensywność określa siłę rozmycia. - ^Rozmycie stopniowane Rozmywane są tylko piksele o kontraście mniejszym niż podany limit kontrastu, a promień rozmycia waha się od 1 do podanej wartości dla pikseli o odpowiadającym kontraście wahającym się od podanego limitu do zera. Krótko mówiąc: piksele o niskim kontraście są rozmywane bardziej niż piksele o wysokim kontraście. Może to być użyte do wygładzenia odcieni skóry bez rozmywania włosów lub redukowania blasku w oczach. Doprowadzone do skrajności, daje efekt "kreskówki". - ^Rozmycie tła (Bokeh) Rozmyj obszary tła obrazu, pozostawiając pierwszy plan ostry. Wybierz jeden lub więcej obszarów, które mają pozostać ostre {WYBIERZ OBSZAR}. Po wybraniu obszarów pierwszego planu odwróć zaznaczenie, tak aby teraz wybrane było tło {ODWRÓĆ OBSZAR}. To jest obszar, który zostanie rozmyty. Dostępne są dwie metody rozmycia: Stałe rozmycie: dla wszystkich rozmywanych obszarów używany jest stały promień rozmycia. Zwiększaj rozmycie wraz z odległością: użyj minimalnego promienia rozmycia dla pikseli sąsiadujących z pierwszym planem i maksymalnego promienia rozmycia dla pikseli w maksymalnej odległości od pierwszego planu. Wymaga to obliczenia odległości od krawędzi dla wszystkich pikseli tła, co może zająć znaczną ilość czasu. Promień rozmycia można zmieniać bez ponownego obliczania odległości od krawędzi. - - TOPIC: REDUKCJA SZUMU +image: denoise.jpg - Zredukuj szum na zdjęciach zrobionych w warunkach słabego oświetlenia (wysokie ISO), przez co jednolite powierzchnie wyglądają na nakrapiane. Dostępne są dwie metody, Mediana i Wygładzanie. Najlepsza metoda różni się w zależności od szumu i charakterystyki obrazu. Mieszanie metod (użycie jednej, a potem drugiej) może być pomocne. Wartość Promień określa sąsiedztwo pikseli, które będzie użyte do porównania i dostosowania danego piksela. Duża wartość (Promień > 2) zredukuje szum skuteczniej, ale może też spowodować utratę szczegółów. Wartość limitu spowoduje, że piksele o wartościach jasności RGB różniących się od mediany sąsiedztwa o więcej niż ta wartość zostaną zignorowane. Jest to konieczne dla niektórych obrazów, aby zapobiec traktowaniu drobnych jasnych szczegółów jako szumu - np. zdjęcia astronomiczne. - Ustaw wartość Promień i naciśnij jeden z przycisków metody. Każda iteracja używa poprzedniego obrazu jako punktu wyjścia, więc wielokrotne iteracje będą stopniowo tłumić szum i ewentualnie rozmywać niektóre szczegóły. Użyj [resetuj], aby zacząć od nowa. Mediana z Promieniem 1, po której następuje Mediana z Promieniem 2, jest dobrym kompromisem między tłumieniem szumu a zachowaniem szczegółów. - Suwak Obszary może być użyty, aby ograniczyć przetwarzanie tylko do ciemnych obszarów, lub do szerszego zakresu obszarów. Ciemne obszary mają zwykle większy problem z szumem niż jasne obszary. - Jeśli widzisz drobne plamki szumu, które się utrzymują, zwiększ wartość limitu, użyj przycisku [resetuj] i kontynuuj z [mediana] lub [wygładź]. - Możesz zastosować różne przetwarzanie w różnych obszarach obrazu - zobacz {WYBIERZ OBSZAR}, i możesz "malować" obraz, używając różnego przetwarzania w różnych obszarach - zobacz {MALOWANE EDYCJE}. - Każdy kolor RGB jest przetwarzany niezależnie. Nie ma osobnego przetwarzania chrominancji ani jasności. - Przycisk [measure] uruchamia okno dialogowe po prawej stronie, aby zmierzyć rzeczywisty poziom szumu obrazu. Przesuń mysz nad obrazem, aby pokazać poziomy szumu RGB w obrębie koła myszy (promień 10, około 300 pikseli). Musi to być obszar pozbawiony detali, tak aby szum był jedyną obecną zmiennością. Sprawdź obraz przy powiększeniu 4X, aby upewnić się, że widzisz szum, a nie teksturę. Kropki pokazują poszczególne wartości RGB pikseli względem średniej otaczających 5x5 pikseli, reprezentowanej przez centralną linię ciągłą. Liczby na dole pokazują średnią jasność RGB i poziomy szumu w skali 0-255. Skala wykresu wynosi od -10 do +10, a linie kropkowane znajdują się na -5 i +5, względem całkowitego zakresu 0-255. Szum w 9. lub 10. bicie RGB wynosi 0.5 lub 0.25 w tej skali. - ^Szum obrazu RAW Aby zmierzyć szum matrycy aparatu, użyj obrazu RAW. Obrazy JPEG są przetwarzane wewnątrz aparatu, aby zredukować szum. Możesz być zaskoczony typowo wysokimi poziomami szumu w obrazach RAW. Nawet drogie aparaty z dużymi matrycami mogą mieć mniej niż 8 bitów koloru o niskim szumie. Gdy filtrujesz szum z obrazu RAW, konkurujesz z elektroniką i oprogramowaniem, które tworzą JPEG aparatu. Zrobienie tego lepiej może być wyzwaniem. - - TOPIC: USUŃ MGŁĘ +image: defog.png +image: defog2.jpg - Usuń mgłę/zamglenie na obrazie lub w wybranym obszarze. Istnieją inne narzędzia do tego (spłaszcz histogram, kontrast lokalny, wzmocnij kontrast, retinex, nasycenie), ale usuwanie mgły/zamglenia jest drugorzędne wobec ich podstawowej funkcji. Ta funkcja atakuje mgłę/zamglenie bezpośrednio: usuwa równe ilości koloru R/G/B (redukując jasność i zwiększając nasycenie) i opcjonalnie dodaje z powrotem utraconą jasność. Może również zredukować niebieski, jeśli stanie się on zbyt dominujący, co często zdarza się przy odległym zamgleniu. Może być potrzebne użycie {WYBIERZ OBSZAR} lub {MALOWANE EDYCJE}, aby precyzyjnie ukierunkować i zoptymalizować żądane obszary. Powyższy przykład wykorzystał dwa obszary, wzgórza na pierwszym planie i górę w tle. - - TOPIC: CZERWONE OCZY +image: red-eyes1.png +image: red-eyes2.png - Zredukuj efekt czerwonych oczu ze zdjęć z lampą błyskową. Dostępne są dwie metody. Pierwsza jest szybsza, ale może nie radzić sobie z trudnymi przypadkami. Druga metoda jest bardziej solidna, ale wymaga też więcej czasu i staranności. Aby użyć pierwszej funkcji, kliknij lewym przyciskiem na czerwone oko jeden lub więcej razy, aż będziesz zadowolony. Jeśli przyciemniony obszar jest za mały lub przesunięty ze środka, kliknij prawym przyciskiem, aby cofnąć zmianę, a następnie kliknij lewym przyciskiem dokładniej na środku czerwonego oka. Jeśli czerwonego oka nie można poprawnie naprawić, kliknij prawym przyciskiem, aby cofnąć zmianę, a następnie użyj drugiej metody. Druga metoda może lepiej radzić sobie z trudniejszymi przypadkami, gdzie czerwone oko jest tylko lekko czerwone, a różnica koloru z powiekami jest zbyt mała, aby automatyczny algorytm mógł ją odróżnić. Umieść kursor nad środkiem czerwonego oka. Przytrzymaj lewy przycisk myszy i przeciągnij kursor w dół i w prawo. Pojawi się kropkowana elipsa obejmująca czerwone oko. Powtórz, jeśli to potrzebne, aby wyśrodkować (mniej więcej) czerwone oko w elipsie. Zauważ, że kształt elipsy zależy od kierunku przeciągnięcia, co może umożliwić precyzyjniejsze objęcie tylko czerwonego oka. Klikaj lewym przyciskiem wewnątrz elipsy wielokrotnie, obserwując, jak czerwone oko ciemnieje, i zatrzymaj się, gdy będzie wystarczająco ciemne. Jeśli posuniesz się za daleko, powieki mogą zacząć ciemnieć. Kliknij prawym przyciskiem, aby cofnąć, i powtórz w razie potrzeby. - - TOPIC: INTELIGENTNE USUWANIE +image: smart-erase.png +image: smart-erase2.jpg - Usuń małe obiekty, które mogą zepsuć dobre zdjęcie, takie jak linie energetyczne, śmieci na ziemi, znak itd. Niechciany obiekt jest zastępowany pikselami pobranymi z otaczającego obszaru. Jest to czasami bardzo skuteczne (efekty uboczne prawie niewidoczne), a czasami nie. Działa najlepiej dla małych lub wąskich obiektów na zdjęciu. Promień kontroluje rozmiar koła wokół wskaźnika myszy, określając obszar do wyboru i usunięcia. Przeciągnij myszą, aby objąć obiekt do usunięcia. Przeciągnięcie lewym przyciskiem wybiera, a przeciągnięcie prawym przyciskiem odznacza. Naciśnij [Usuń], aby usunąć wybrany obszar, zastępując piksele najbliższymi pikselami spoza zaznaczenia. Jeśli zaznaczenie nie było wystarczająco precyzyjne, użyj [Cofnij], dostosuj wybrany obszar i ponownie [Usuń]. Powtarzane zaznaczenia i usunięcia będą się kumulować, dopóki nie użyjesz [New_Area], aby rozpocząć nowe zaznaczenie. Poprzednio usunięte obszary są teraz utrwalone, a [Cofnij] będzie działać tylko dla kolejnych zaznaczeń. Najlepiej pracować z obrazem powiększonym do 200% lub więcej. Kontrolka Rozmycie dodaje rozmycie do pikseli zastępczych. Może to zredukować widoczne efekty uboczne, ponieważ piksele zastępcze mogą być ostrzejsze niż otoczenie. Zmień ustawienie Rozmycie i powtórz przycisk [Usuń]. Przyciski [show] i [hide] mogą być użyte, aby pokazać obrys bieżącego zaznaczenia lub ukryć go, aby lepiej ocenić wyniki po usunięciu. - Dla długich, cienkich obiektów (np. linii energetycznych) możesz kliknąć dwie pozycje, a wszystko pomiędzy zostanie wybrane. Zaznaczenie działa w linii prostej, więc dla zakrzywionych obiektów będziesz musiał klikać w odstępach, aby podążać za krzywizną. - - TOPIC: USUŃ HALO +image: remove-halo.png +image: remove-halo2.png - Usuń halo pozostawione przez niektóre funkcje edycji. Wybierz typ halo: jasne (najczęstsze) lub ciemne. Przeciągnij myszą lewym przyciskiem po obszarze halo, aby zmienić piksele wewnątrz myszy, jak pokazano w przykładzie. Dla jasnego halo najjaśniejsze piksele będą ciemnieć, gdy mysz jest po nich przeciągana. Dla ciemnego halo najciemniejsze piksele będą jaśnieć. Użyj promienia myszy większego niż szerokość halo, jak pokazano w przykładzie. Przeciągnij myszą prawym przyciskiem, aby przywrócić oryginalne piksele. - - TOPIC: ARTEFAKTY JPEG +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - Obrazy JPEG, które zostały mocno skompresowane (z niskim ustawieniem jakości), mogą wykazywać artefakty kompresji w postaci małych prostokątnych bloków. Jeśli niektóre obszary zdjęcia miały rozszerzony zakres jasności, takie bloki mogą stać się bardziej widoczne, ponieważ kroki jasności są większe (np. wartości RGB 11/12/13 rozjaśnione 5x do 55/60/65). Ta funkcja rozmywa granice między blokami, aby uczynić je mniej widocznymi. - 'Limit dopasowania' określa, kiedy sąsiednie piksele są traktowane jako członkowie tego samego bloku pikseli. Limit dopasowania można ustawić na niższą wartość, aby uzyskać pełniejsze zmapowanie takich bloków. 'Limit kontrastu' służy do zapobiegania mieszaniu krawędzi tam, gdzie kontrast jest wysoki, co powoduje utratę szczegółów. Zmień oba ustawienia i naciśnij [zastosuj]. Obejrzyj wynikowy obraz przy powiększeniu >2x i wypróbuj różne ustawienia, jeśli optymalizacja jest ważna. Ta funkcja będzie mniej skuteczna na obrazie, który został przeskalowany. Użyj {WYBIERZ OBSZAR}, aby selektywnie przetworzyć problematyczne obszary. - - TOPIC: WYGŁADZANIE KRAWĘDZI +image: anti-alias.jpg - Czasami zdjęcia wykazują pikselizację ('schodkowanie') wzdłuż niektórych krawędzi elementów o wysokim kontraście. W powyższym przykładzie widać to wokół oka ptaka. Narzędzie wygładzania krawędzi może to zredukować. Efekt jest niewielki na większości zdjęć, gdzie przetwarzanie w aparacie mogło już zająć się tym problemem. Efektem wtórnym jest to, że artefakty jpeg w mocno skompresowanych obrazach są nieco wygładzone. Obrazy, które zostały powiększone, będą miały bardziej widoczne pikselizacje. Można temu pomóc, zwłaszcza w przypadku powiększenia 2x. - Użyj przycisku [zastosuj], aby stłumić piksele, wielokrotnie, jeśli wydaje się to pomagać. 'Próg' może być użyty, aby wykluczyć piksele o niskim kontraście z przetwarzania. Zwykle najlepsza jest wartość 0.1 lub mniejsza. - Fotocx używa algorytmu Scale3x, zmodyfikowanego, aby używać odcieni koloru "podobny" i "różny" zamiast "równy" i "nierówny". - - TOPIC: DOSTOSUJ RGB +image: adjust-RGB.png - Zmień ogólną jasność i kontrast, lub jasność i kontrast wybranych kolorów. • Jasność - zwiększ lub zmniejsz ogólną jasność obrazu • +Czerwony -Cyjan itd. - zmień jasność koloru i zmień kolor dopełniający w przeciwnym kierunku • Kontrast - wszystko - zwiększ lub zmniejsz ogólny kontrast obrazu • Kontrast czerwonego zielonego niebieskiego - przetwórz poszczególne kolory RGB - - TOPIC: DOSTOSUJ HSL +image: adjust-HSL.png - Zmień wybrany zakres kolorów w obrazie za pomocą HSL (Hue, Saturation, Lightness - odcień, nasycenie, jasność). Ta funkcja może być użyta do naprawienia odcienia koloru lub zmiany jednego koloru na inny (np. prześwietlone niebo - zbyt białe). Jeśli nie znasz modelu koloru HSL, przeczytaj artykuł na Wikipedii na ten temat. - Zacznij od wybrania docelowego koloru obrazu do dopasowania i dostosowania, używając shift + kliknięcie lewym przyciskiem na obrazie. Ten kolor będzie środkiem zakresu kolorów, które zostaną wybrane do dostosowania. Wybierz, które atrybuty koloru będą dopasowywane, za pomocą pól wyboru dla odcienia, nasycenia i jasności. Każdy z nich zawęzi zakres wybranych kolorów. Jeśli żadne nie jest zaznaczone, wybierane są wszystkie kolory. Poziom dopasowania może być użyty, aby dodatkowo poszerzyć zakres wybranych kolorów. 100% oznacza, że wybierane są tylko ściśle dopasowane kolory. - Kontrolki Kolor wyjściowy (odcień, nasycenie, jasność) są używane do ustawienia nowego koloru wyjściowego, który zastąpi lub zmiesza się z wybranymi kolorami wejściowymi. Możesz też ustawić ten kolor z obrazu, używając shift + kliknięcie prawym przyciskiem. Wynikowy kolor będzie mieszanką oryginalnego koloru i nowego koloru. Frakcja nowego koloru jest ustawiana przez suwak Dostosowanie, który można ustawić od 0 do 100%. Użyj pól wyboru HSL, aby określić, które komponenty HSL koloru wejściowego są zastępowane odpowiadającymi komponentami HSL koloru wyjściowego. Użyj suwaków dla HSL koloru wyjściowego, aby dostosować nowy kolor. Kolor wyjściowy jest pokazywany w mniejszym polu po lewej stronie, które jest aktualizowane w miarę przesuwania suwaków. - Przesuwaj suwaki i obserwuj aktualizacje obrazu na żywo, aby zoptymalizować wynik. Nie jest to bardzo intuicyjne, a praktyka pomoże. Wskazówka: zacznij od dopasowania odcienia i nasycenia, i zastępowania tylko odcienia - oznacza to, że nasycenie i jasność koloru wyjściowego zostaną skopiowane z oryginalnych kolorów obrazu, a zastąpiony zostanie tylko odcień. - - TOPIC: USUŃ KURZ +image: remove-dust.png +image: remove-dust2.jpg - Obrazy zrobione z zapylonych zeskanowanych slajdów mogą mieć wiele małych ciemnych plamek - cieni kurzu na slajdach. Historyczne zdjęcia z internetu często mają podobny problem. Ta funkcja może usunąć większość takich plamek. Przesuwaj trzy suwaki, aż maksymalna liczba plamek kurzu zostanie pomalowana na czerwono, a następnie naciśnij przycisk [usuń], aby je usunąć. Naciśnij [red], aby przywrócić czerwony widok, następnie możesz ponownie dostosować suwaki i nacisnąć [usuń]. Suwak "limit rozmiaru plamki" ogranicza rozmiar plamek, które zostaną usunięte. Suwak "maks. jasność" ustawia próg ignorowania plamek, które nie są wystarczająco ciemne. Suwak "min. kontrast" odfiltrowuje plamki o niskim kontraście z ich otoczeniem. Ten proces jest zwykle kompromisem. Jeśli ustawienia nie są optymalne, drobne elementy, takie jak liście drzew, mogą zostać usunięte, lub duże plamki mogą pozostać na miejscu. Różne części obrazu mogą wymagać różnych ustawień, np. niebo można potraktować bardziej agresywnie niż ścianę budynku. Możesz po prostu użyć Usuń kurz wielokrotnie z różnymi ustawieniami, w miarę potrzeb, aby usunąć wszystkie plamki kurzu. Lub możesz użyć {WYBIERZ OBSZAR}, aby przetworzyć obraz w sekcjach. Jeśli niektóre plamki są uporczywe, możesz potraktować je ręcznie za pomocą {INTELIGENTNE USUWANIE}. Ustaw mały promień myszy i kliknij każdą plamkę, aby ją usunąć. Plamki z włókien (długie i cienkie) zwykle nie są usuwane automatycznie, ale Inteligentne usuwanie może być tutaj skuteczne. Jeśli kurz jest jasny, jak w powyższym przykładzie, użyj {TRYB KOLORU}, aby utworzyć negatyw koloru, przetwórz kurz, a następnie powtórz negatyw koloru, aby przywrócić normalny obraz. - - TOPIC: OBWÓDKI +image: fringes.png +image: fringesA.jpg - Napraw obwódki koloru na krawędziach (boczną aberrację chromatyczną) - gdzie obwódki koloru pojawiają się głównie w zewnętrznych obszarach obrazu. - Lewy obraz powyżej to powiększony wycinek lewego górnego rogu zdjęcia z boczną aberracją chromatyczną. Została ona w większości wyeliminowana w przetworzonym obrazie po prawej. Obwódki koloru mogą pojawiać się wzdłuż krawędzi o wysokim kontraście, zwłaszcza w zewnętrznych obszarach obrazu, gdzie zniekształcenia obiektywu są zwykle największe. Aby się ich pozbyć, powiększ (zoom) obraz do maksymalnego rozmiaru i wyśrodkuj na obszarze z obwódkami koloru. Naciśnij przycisk [search]. Płaszczyzny koloru czerwonego i niebieskiego są przeskalowywane, aby lepiej dopasować się do płaszczyzny zielonej, a użyte współczynniki są wstawiane do okna dialogowego. Możesz być w stanie poprawić wynik, zmieniając współczynniki bezpośrednio w oknie dialogowym: zmieniaj współczynniki, obserwując obwódki koloru na obrazie. - Ta funkcja będzie mniej skuteczna, jeśli obraz został przycięty, tak że środek obrazu nie jest już taki sam jak środek oryginalnego zdjęcia. - - TOPIC: MENU DOPRACOWANIA - - TOPIC: SPŁASZCZ HISTOGRAM +image: flatten1.jpg +image: flatten2.jpg - Zwiększ widoczne szczegóły w obszarach o słabym kontraście. Jasność piksela jest dostosowywana w górę lub w dół, aby rozkład jasności (histogram) dla obszaru wokół piksela był bardziej jednolity. Mniejszy promień (mniejszy obszar) zintensyfikuje efekt. Istnieje 5 stref jasności od najciemniejszej (1) do najjaśniejszej (5). Przesuń suwak, aby zwiększyć efekt dla odpowiadającej strefy. Użyj suwaka strefy A, aby przesunąć wszystkie 5 suwaków razem i szybko ustawić wynik początkowy. Następnie użyj pozostałych suwaków indywidualnie, aby doprecyzować obraz. - - TOPIC: KONTRAST LOKALNY +image: localcon1.jpg +image: localcon2.jpg - Zwiększ kontrast w każdym obszarze obrazu. Jasność każdego piksela jest porównywana ze średnią jasnością otaczającego obszaru. Jasność piksela jest dostosowywana, aby zwiększyć tę różnicę. Ta funkcja implementuje szeroko stosowaną metodę podręcznikową. Promień określa rozmiar obszaru wokół każdego piksela, który jest używany do średniej jasności. Moc określa ilość zmiany jasności. Kolor jest używany do zwiększenia nasycenia koloru. Możesz użyć edytowalnej krzywej, aby rozjaśnić obraz wyjściowy dla wybranych poziomów jasności. Przykład pokazuje rozjaśnienie ciemniejszych obszarów obrazu. - Kontrast lokalny może tworzyć "halo" w pewnych okolicznościach: +image: localcon3.jpg - Oryginalny obraz jest po lewej. Środkowy obraz miał zastosowany Kontrast lokalny przy maks. mocy. Wzdłuż granicy między ciemnymi wzgórzami a jaśniejszym niebem widać halo. Można to naprawić prostym trikiem (prawy obraz). Wybierz obszary nieba osobno, używając {WYBIERZ OBSZAR}. Zastosuj Kontrast lokalny do tego obszaru. Odwróć zaznaczenie i zastosuj Kontrast lokalny do reszty obrazu. - - TOPIC: WZMOCNIJ KONTRAST +image: amplify-contrast.png +image: amplify-contrast2.jpg - Zwiększ pozorny zakres jasności obrazu, zwiększając kontrast lokalny. Może zwiększyć obszary o niskim kontraście, nie zmieniając obszarów o wysokim kontraście. Możesz też użyć krzywej edycji, aby różnicować wzmocnienie kontrastu w zależności od początkowej ilości kontrastu. - Suwak Wzmocnij poniżej krzywej reguluje obliczenia, od braku wzmocnienia kontrastu do pełnego wzmocnienia. Jeśli przesunięty zbyt daleko w prawo, obraz może pokazywać brzydkie artefakty, więc cofnij go, aż znikną. Jeśli jednolite obszary (np. niebo) staną się cętkowane, przeciągnij lewy koniec krzywej w dół, aby zredukować wzmocnienie dla obszarów o niskim kontraście. W niektórych przypadkach najlepiej będzie wybrać różne obszary obrazu i przetworzyć je osobno, np. zachowawczo dla nieba, bardziej agresywnie dla powierzchni teksturowanych, takich jak kamienne ściany. - - TOPIC: RETINEX GLOBALNY +image: global-retx.png +image: global-retx2.jpg - Popraw kolor i kontrast dla obrazów z ekstremalną mgłą/zamgleniem lub odcieniem koloru (np. 100-letnie zdjęcie). Wypróbuj najpierw przycisk [Auto]. Obraz jest przeszukiwany, aby znaleźć najjaśniejsze i najciemniejsze obecne kolory RGB. Najciemniejsze wartości RGB są odejmowane od wszystkich pikseli, a wynikowe wartości RGB są przeskalowywane w górę, tak aby maksymalne wartości RGB były blisko 255. Oczywiście może to nie być początkowo optymalne. Przyciski liczbowe są ustawiane na znalezione limity RGB ciemności i bieli, i możesz zmienić te wartości, aby zoptymalizować wynikowy obraz. Możesz wybrać własne punkty ciemne i jasne, wybierając odpowiednią opcję w oknie dialogowym i klikając na obrazie. Przyciski liczbowe mnożnika są domyślnie ustawione na 1.0, i możesz zmienić te wartości, aby dostosować względną jasność każdego koloru RGB. W powyższym przykładzie, 1. obraz to oryginał, 2. obraz został utworzony za pomocą przycisku [Auto]. Skrajnie prawa kolumna przycisków liczbowych dostosuje wszystkie przyciski w tym samym wierszu razem - użyj kółka myszy lub klawiszowych strzałek góra/dół. - Suwak mieszania jest używany do mieszania obrazu wejściowego i obrazu retinex w dowolnej proporcji. Suwak redukcji jasności jest używany do osłabienia efektu dla jaśniejszych obszarów obrazu, zwłaszcza nieba, gdzie Retinex może dawać dziwnie wyglądające wyniki. - Algorytm został wyprowadzony z koncepcji po raz pierwszy opublikowanych przez Edwina Landa w latach 70. Przeszukaj internet w poszukiwaniu 'retinex', aby uzyskać więcej informacji. - - TOPIC: RETINEX LOKALNY +image: local-retx.png +image: local-retx2.jpg - Zwiększ widoczne szczegóły w ciemnych obszarach obrazu i innych obszarach o niskim kontraście. Zakres jasności strefy wokół każdego piksela jest używany do przeskalowania jasności piksela, tak jakby cała strefa została przeskalowana, aby pokryć cały zakres jasności 0-255. Retinex lokalny może dawać dramatyczne wyniki tam, gdzie Retinex globalny jest słaby. - Pole wejściowe promień określa przybliżony rozmiar strefy wokół każdego piksela. Suwak mieszania jest używany do mieszania obrazu wejściowego i obrazu retinex w dowolnej proporcji. Suwak redukcji jasności jest używany do osłabienia efektu dla jaśniejszych obszarów obrazu, zwłaszcza nieba, gdzie Retinex może dawać dziwne wyniki. Suwak redukcji ciemności robi to samo dla ciemniejszych obszarów obrazu. Powyższy przykład to około 60% oryginalnego obrazu + 40% retinex. - - TOPIC: NASYCENIE +image: saturation.png - Dostosuj nasycenie koloru na podstawie jasności piksela. Oś Y krzywej edycji to nasycenie koloru, od zerowego koloru (wszystkie wartości RGB równe) do maksymalnego koloru (najniższa wartość RGB wynosi zero). Oś X krzywej to jasność piksela, od ciemnej do maksymalnej jasności. Pozycja neutralna (brak zmiany koloru) to wartość środkowa, która jest również wartością początkową. Przykład: aby zwiększyć intensywność koloru w ciemnych obszarach obrazu, podnieś lewy koniec krzywej. Suwak Nasycenie przesuwa całą krzywą w górę lub w dół bez zmiany jej kształtu. - - TOPIC: MIĘKKA OSTROŚĆ +image: soft-focus2.jpg +image: soft-focus.png - Zastosuj klasyczny efekt "miękkiej ostrości" do zdjęcia. Jest to mieszanka ostrego obrazu i lekko rozmytego obrazu. Ustawienie promienia określa zasięg rozmycia (rozpiętość pikseli), a ustawienie mieszania określa udział rozmytego obrazu w wynikowym obrazie wyjściowym, od 0 do 100 procent. Możesz użyć {MALOWANE EDYCJE} z tą funkcją, aby różnicować efekt dla różnych obszarów obrazu. - - TOPIC: GRADIENT JASNOŚCI +image: brite-ramp1.png +image: brite-ramp2.png - Zróżnicuj jasność lub kolor na obrazie. Możesz to użyć do skompensowania nierównomiernego oświetlenia lub odcienia koloru zmieniającego się na obrazie. Kierunek zmiany jest określany przez narysowanie linii na obrazie. Utwórz linię, klikając na obrazie, a następnie przeciągnij dowolny koniec, aby ustawić żądany kierunek. W powyższym przykładzie zielony został zwiększony w kierunku linii. Najpierw edytuj krzywą All, aby dostosować ogólną jasność (wszystkie kolory), a następnie w razie potrzeby dostosuj poszczególne krzywe kolorów RGB. - - TOPIC: WINIETA +image: vignette.png +image: vignette2.jpg - Popraw przyciemnienie czasami widoczne w narożnikach zdjęcia. Może być również użyte do podświetlenia lub pokolorowania obiektu lub obszaru w obrębie obrazu. - Kliknij lub przeciągnij myszą po obrazie, aby zmienić środek winiety, który początkowo znajduje się w środku obrazu. - Wybierz 'Jasność', aby zmienić jasność obrazu we wzorze promienistym: Dostosuj lewy lub prawy koniec krzywej, aby zmienić jasność odpowiednio środka i krawędzi obrazu. Możesz nadać ciemne otoczenie twarzy portretowej lub naprawić obraz z przyciemnionymi narożnikami. Środkowy poziom krzywej odpowiada brakowi zmiany. Użyj niższych wartości, aby przyciemnić, i wyższych, aby rozjaśnić. Powyższy przykład stopniowo przyciemnia obrzeża obrazu, pozostawiając szeroki centralny obszar bez zmian. - Wybierz 'Kolor', aby dodać wybrany kolor do obrazu we wzorze promienistym. Wartości krzywej równe zero oznaczają brak zmiany, a wyższe wartości dodają wybrany kolor do obrazu. Najwyższa wartość odpowiada 100% koloru. Użyj tej funkcji, aby dodać kolorowe otoczenie do obrazu, np. otoczyć twarz stopniowo zwiększającym się kolorem. - - TOPIC: MENU EFEKTÓW - - TOPIC: OBRYSY +image: outlines1.png +image: outlines2.jpg - Przekształć zdjęcie w rysunek konturowy. Piksele o wysokim kontraście są wzmacniane, a piksele o niskim kontraście są tłumione. Ustawienie progu ustawia progi kontrastu. Linie poniżej minimum nie są pokazywane, a te powyżej maksimum będą miały maksymalną jasność. Pole wyboru 'czarno/białe' konwertuje kolorowe linie na czarne na białym lub białe na czarnym, w zależności od pola wyboru 'negatyw'. Użyj 'Niskie wzmocnienie', aby rozjaśnić wyblakłe linie, jeśli chcesz. 'Tryb B' daje bardziej jednolitą jasność linii w porównaniu z 'Trybem A'. - - TOPIC: SZKIC1 +image: sketch1.jpg - Przekształć zdjęcie w coś przypominającego szkic. Ciemne piksele są agregowane w mniejszą liczbę pikseli, pozostawiając opróżnione obszary jaśniejszymi. Kontrast może być również użyty jako zastępstwo dla ciemnych pikseli. Próg może być użyty do filtrowania obrazu wejściowego według jasności. Poziom obcięcia jest używany do filtrowania wyjścia, aby dodatkowo zredukować odizolowane lub marginalnie ciemne piksele. Wybierz kolory dla pierwszego planu i tła. Zmniejszenie rozmiaru obrazu wejściowego może dać interesujące wyniki. Jeśli wynik wygląda "brudno", użyj {REDUKCJA SZUMU} lub {FUZJA}, aby wygładzić obraz przed przetworzeniem tutaj. - - TOPIC: SZKIC2 +image: sketch2.png +image: sketch2b.jpg - Przekształć zdjęcie w coś przypominającego szkic. Używa innej metody: piksele o niskim ... wysokim kontraście są konwertowane odpowiednio na jasne ... ciemne piksele. Krzywa może być użyta do zwiększenia lub zmniejszenia mocy konwersji kontrastu. Skala osi X to kontrast piksela, od niskiego do wysokiego, a wartość Y określa siłę konwersji. Przykład pokazuje tłumienie pikseli o niskim kontraście (rozjaśnianie). Obraz wejściowy może być zmieszany w dowolnej proporcji. Jeśli wynik wygląda "brudno", użyj {REDUKCJA SZUMU} lub {FUZJA}, aby wygładzić obraz przed przetworzeniem tutaj. - - TOPIC: KARYKATURA +image: cartoon.jpg - Przekształć zdjęcie w rysunek przypominający karykaturę. Czarne linie są rysowane nad krawędziami elementów na obrazie, gdziekolwiek jasność lub kolor zmieniają się gwałtownie. Próg linii ustawia czułość wykrywania krawędzi i rysowania linii, powodując rysowanie mniejszej lub większej liczby linii. Szerokość linii sprawia, że linie są grubsze lub cieńsze. Głębia Kuwahara kontroluje funkcję wyostrzania, która może wzmocnić krawędzie elementów w obrębie obrazu. - - TOPIC: WYTŁOCZENIE +image: emboss2.jpg +image: emboss.png - Przekształć obraz w symulowany relief lub wytłoczony obraz (efekt 3D). Krawędzie elementów są rozjaśniane po jednej stronie i przyciemniane po przeciwnej, jak gdyby zostały uniesione i oświetlone z boku. Ustawienie promienia określa szerokość efektu, a ustawienie głębi określa intensywność. Ustawienie Źródło światła określa kąt, z którego pochodzi pozorne oświetlenie. Można je zmieniać, aby zmaksymalizować efekt dla krawędzi elementów najbardziej prostopadłych do tego kąta. - - TOPIC: KAFELKI1 Przekształć obraz w tablicę jednokolorowych kafelków. Możesz kontrolować rozmiar kafelka i grubość odstępu między kafelkami. Jest to również nazywane 'pikselizacją'. Użyj Wybierz obszar, aby ograniczyć przekształcenie do ograniczonego obszaru, np. twarzy. - - TOPIC: KAFELKI2 +image: tiles2a.png +image: tiles2b.png - Przekształć obraz w nieregularne kafelki, które w przybliżeniu dopasowują się do kolorów i konturów obrazu. ^rozmiar bazowy:^ Bazowy rozmiar kafelka, czyli rozmiar kafelka jednostkowego używanego do tworzenia większych kafelków. ^głębia koloru:^ Liczba kolorów do użycia: 1 = 8 kolorów, 2 = 64 kolory ... 8 = 16 milionów kolorów. ^docelowy obszar kafelka^: Górny limit rozmiaru kafelka (obszar w pikselach). ^wym. dopasowanie koloru^: Ustaw minimalne wymagane dopasowanie koloru, aby mniejszy obszar został scalony z sąsiednim większym obszarem: 0 = nieważne (maksymalna konsolidacja), 100 = wymagane idealne dopasowanie (minimalna konsolidacja). - - TOPIC: MALARSTWO +image: painting1.png +image: painting2.png - Przekształć obraz w coś przypominającego obraz malarski. Redukuje liczbę kolorów, mapuje każdy ciągły obszar pikseli o tym samym kolorze, a następnie konsoliduje mniejsze obszary z sąsiednimi większymi obszarami mającymi najlepsze dopasowanie koloru. - ^promień rozmycia^: Rozmyj obraz przed przetworzeniem. Daje to gładsze granice. ^głębia koloru^: Liczba kolorów do użycia: 1 = 8 kolorów, 2 = 64 kolory ... 8 = 16 milionów kolorów. ^docelowy obszar łaty^: Ustaw dolny limit dla obszarów, które będą miały własny kolor: obszary mniejsze niż ta liczba pikseli zostaną wchłonięte przez sąsiedni obszar z najbliższym dopasowaniem koloru. ^wymagane dopasowanie koloru^: Ustaw minimalne wymagane dopasowanie koloru, aby mniejszy obszar został scalony z sąsiednim większym obszarem: 0 = nieważne (maksymalna konsolidacja), 100 = wymagane idealne dopasowanie (minimalna konsolidacja). ^obramowania^: Określa, czy kolorowe obszary będą wyznaczone cienkim czarnym obramowaniem, jak nieregularne kafelki w mozaice. Po użyciu tej funkcji, użycie {WYTŁOCZENIE} może dodać interesującą teksturę do obrazu. - - TOPIC: TEKSTURA +image: texture2.jpg +image: texture.png - Dodaj teksturowaną powierzchnię do obrazu lub wybranych obszarów w obrębie obrazu. Promień określa rozmiar wzoru tekstury. Siła określa intensywność wzoru, od prawie niewidocznego do dominującego. - - TOPIC: FUZJA +image: fusion.png +image: fusion2.jpg - Tłum drobne szczegóły o niskim kontraście na obrazie, zachowując ostrość dla większych elementów obrazu. Naciśnij [start] i obserwuj obraz uważnie. Proces działa ciągle, dopóki nie zostanie zatrzymany przyciskiem [stop]. Drobne szczegóły będą powoli zanikać. Etykieta 'count' okna dialogowego pokazuje liczbę iteracji. Możesz [stop], aby zatrzymać proces i sprawdzić obraz, a następnie wznowić przetwarzanie za pomocą [start]. Użyj przycisku Cofnij/Ponów, aby porównać stan obrazu przed/po. Wznów przetwarzanie za pomocą [start]. Przycisk [krok] może być użyty do przetworzenia jednego kroku na raz. - - TOPIC: DOPASUJ KOLORY +image: match-colors.png - Dopasuj kolory w jednym obrazie do kolorów w drugim. Mały punkt, wybrany kliknięciem myszy, jest próbkowany z każdego obrazu. Punkt na 2. obrazie zostanie ustawiony tak, aby miał ten sam średni kolor (wartości RGB) co punkt z 1. obrazu. Współczynniki użyte do zrównania wartości RGB są następnie stosowane do wszystkich pikseli w 2. obrazie. Typowym zastosowaniem jest usunięcie odcienia koloru z obrazu przez oznaczenie punktu na obrazie, który będzie dopasowany do koloru z innego obrazu. - Procedura: Okno dialogowe wymienia 5 kroków do wykonania po kolei. • Ustaw promień dla obszaru próbki punktu. Wynikowe koło myszy to obszar punktu do próbkowania. • Otwórz 1. obraz, naciskając przycisk [open]. • Kliknij obraz, aby pobrać próbkę koloru. • Otwórz 2. obraz, naciskając przycisk [open]. • Kliknij obraz w punkcie, który chcesz dopasować do 1. obrazu. Kolory obrazu zmienią się w ciągu sekundy lub dwóch. - - TOPIC: WZÓR +image: pattern2.jpg +image: pattern1.png - Dodaj wzór tła do obrazu. Mały plik obrazu (plik wzoru) jest używany do pokrycia bieżącego obrazu przez powielenie pliku, jak wyłożona kafelkami ściana. Ten plik może być prawdziwym wzorem (np. obraz płótna, ściany z cegły, powtarzającej się geometrii ...) lub dowolnym innym rodzajem obrazu. Wzór jest uczyniony półprzezroczystym, tak aby obraz bazowy wyglądał na wydrukowany nad wzorem, lub wzór nad obrazem. Wiele plików wzorów można znaleźć, przeszukując internet w poszukiwaniu "pattern image". Pobierz niektóre z nich i przytnij je w razie potrzeby do rozmiaru około 200-500 pikseli. Dla wygody dodaj je do dostarczonych plików wzorów w ~/.fotocx/patterns. - Użyj przycisku [Przeglądaj], aby wybrać plik wzoru. Wybrany wzór zostanie ułożony kafelkowo, aby pokryć obraz bazowy. Wzór jest częściowo przezroczysty, tak aby obraz bazowy był widoczny przez niego. Użyj Zoom, aby zwiększyć lub zmniejszyć rozmiar wzoru. Istnieją dwie metody mieszania wzoru z obrazem bazowym. Krycie wzoru można ustawić na 0-100%. Obraz bazowy jest używany do wypełnienia niewykorzystanego krycia. Kontrast jest używany do modyfikacji jasności obrazu bazowego, używając jasności wzoru jako szablonu. Oba parametry można mieszać w dowolnej proporcji. - Jeśli plik wzoru zawiera obraz, który powtarza się w stałych odstępach zarówno poziomo, jak i pionowo, przycisk [Oblicz] może być użyty do ustawienia szerokości i wysokości, aby utworzyć ciągły wzór bez widocznych szwów. - Jeśli wzór jest nieregularny i szwy są widoczne, możesz to poprawić. Dwie wartości Nakładanie się określają, jak bardzo powielone wzory nakładają się na krawędziach, poziomo i pionowo. Dodaj trochę nakładania się, aby zamaskować efekty krawędziowe. - Wybierz obszar może być użyty, aby zastosować wzór do części obrazu, lub różne wzory do różnych części. Po zastosowaniu wzoru do obrazu może być interesujące użycie {WYTŁOCZENIE}, aby dodać efekt 3D do wzoru. - Pole wyboru "Skala szarości" przekonwertuje kolorowy wzór na skalę szarości. - - TOPIC: KRATKOWANIE +image: crosshatch2.jpg +image: crosshatch1.png - Przekonwertuj obraz w rysunek za pomocą krzyżujących się równoległych linii. Wprowadź rozmiar siatki i naciśnij [zastosuj]. - - TOPIC: DITHERING +image: dither1.png - +image: dither2.jpg - Ta funkcja zapewnia kilka sposobów ditheringu obrazu - konwersji na kropki. 0 - kolorowe kropki w stylu Roya Lichtensteina 1 - czyste R/G/B lub czarno-białe z losowym lub zoptymalizowanym rozkładem przestrzennym 2 - mieszanie RGB z zadaną głębią bitową 3 - klasyczny dithering z niestandardową paletą kolorów 4 - kondensuj obraz w plamy o średnim kolorze skondensowanych pikseli - Klasyczne ditheringi używają metody Floyda-Steinberga kompensacji błędów koloru: niedopasowania między kolorem obrazu wejściowego a najbliższym kolorem z palety. Kropki o pobliskich kolorach są w miarę potrzeb domieszywane, tak aby średnia dla obszaru ściślej odpowiadała kolorowi wejściowemu. Kompensację błędów można wyłączyć, jeśli chcesz, aby uzyskać wyraźne pasy koloru lub kontury. - Plamy: Piksele obrazu przechodzą rodzaj "grawitacyjnego zapadania się", zbiegając się w grupy wokół lokalnych środków masy. 'Masa' jest zdefiniowana jako jasność piksela. Kontrolka 'promień' w przybliżeniu określa zasięg przyciągania. Naciśnij [start], aby rozpocząć zapadanie się. Obserwuj, jak obraz powoli zmienia się w plamy o rozmiarze mniej więcej odpowiadającym polu wejściowemu 'promień'. Gdy plamy są ładne i okrągłe i zmieniają się bardzo mało, naciśnij [stop], aby zakończyć proces. - - TOPIC: GRAWEROWANIE +image: engrave.png +image: engrave2.png - Przekonwertuj obraz na czarno-białe linie. Pole wejściowe Rozmiar określa grubość linii i ile pionowych pikseli obrazu jest używanych dla każdej pionowej kolumny pikseli w liniach wyjściowych. Kolumny pikseli linii są dzielone na czarne i białe części, których proporcja w przybliżeniu odpowiada średniej jasności pikseli wejściowych. Pole wejściowe Odchylenie może być użyte do optymalizacji ogólnej jasności. Wartości ujemne/dodatnie sprawiają, że obraz jest ciemniejszy/jaśniejszy. Pole wejściowe Kolor (0-100%) może być użyte do dodania koloru do białych części. - - TOPIC: DODAJ POŚWIATĘ +image: addglare.png +image: addglare2.jpg - Dodaj poświatę promieniującą z jasnych punktów na obrazie. Moc: określa względną jasność poświaty Limit: progowa jasność piksela do emitowania poświaty Zasięg: zasięg pikselowy poświaty od emitujących pikseli Piksele o jasności powyżej limitu (200-255) będą emitować poświatę. Jasność oznacza tutaj jasność najjaśniejszego koloru RGB w pikselu. Emitowana poświata ma kolor emitującego piksela. Zasięg jest wyrażony w jednostkach pikseli. Poświata będzie maksymalna przy emitującym pikselu i będzie zanikać do zera przy limicie zasięgu. - - TOPIC: MOZAIKA +image: mosaic1.png +image: mosaic2.jpg - Utwórz obraz mozaiki, używając kafelków utworzonych ze wszystkich twoich obrazów. - Podaj rozmiar kafelka w pikselach (np. 36 x 24) i naciśnij [Kafelki]. Kafelki zostaną utworzone ze wszystkich twoich obrazów (w rzeczywistości dla szybkości używane są obrazy thumbnail). Jeśli zmienisz wymiary kafelka, naciśnij [Kafelki] ponownie, aby zregenerować kafelki. Po utworzeniu kafelków naciśnij [Obraz], aby przekonwertować bieżący obraz w mozaikę, używając tych kafelków. Kafelki są wybierane przez dopasowanie średniego koloru kafelka do średniego koloru obrazu w pozycji kafelka. Jeśli dostępne są tysiące obrazów i jeśli zakres kolorów jest wystarczająco dobry, mozaika wyjdzie całkiem dobrze. Powiększ (zoom-in) dowolną część obrazu, aby zobaczyć obrazy kafelków. - Suwak Mieszanie kafelków spowoduje zmieszanie obrazu z kafelkami, sprawiając, że wygląda lepiej, jeśli kafelki mają złe dopasowanie koloru. Jeśli mieszanie wynosi mniej niż około 50%, kafelki pozostają niemal tak wyraźne jak wcześniej, ponieważ oko kompensuje fałszywy odcień. - Po utworzeniu mozaiki możesz kliknąć dowolny kafelek, aby uzyskać większy wyskakujący obraz. Jeśli otwarta zostanie zapisana mozaika, klikanie kafelków w celu uzyskania większego obrazu nie zadziała. Regeneracja mozaiki jest dość szybka, więc zrób to, jeśli chcesz, aby wyskakujące obrazy działały. - - TOPIC: DODAJ SZUM +image: add-noise.png - Dodaj losowy szum koloru do obrazu. Ustaw docelowy rozmiar plamki 1-10 i poziom szumu 0-100%. Przy 100% losowy szum w zakresie -127 do +127 jest dodawany do każdej wartości RGB każdego piksela. Wartość średnia wynosi zero. Przepełnienia poza zakresem 0-255 są obcinane. Średni kolor na dużym obszarze jest zachowany, z nałożonym szumem. Możesz użyć Dodaj szum z Wybierz obszar lub Malowanymi edycjami, aby dodać szum do wybranych obszarów. - ^Tłumienie 'pasmowania' W obszarach obrazu, gdzie rozkład jasności został 'rozciągnięty', widoczne 'pasmowanie' może wystąpić w obszarach o niemal jednolitej jasności i kolorze. Możesz zredukować ten problem, dodając szum (lub rozmycie) do dotkniętych obszarów. - - TOPIC: USTAW KOLORY +image: set-colors1.jpg +image: set-colors2.jpg - Możesz zredukować liczbę kolorów używanych w obrazie, aby utworzyć efekt plakatu. Ustaw każdy kolor RGB osobno, lub dostosuj łączną liczbę kolorów. Głębia bitowa koloru nie jest do tego używana. Niektóre funkcje w Fotocx używają głębi bitowej, ograniczając dostępne kolory do 2, 4, 8 ... dla każdego koloru RGB. Ta funkcja nie jest ograniczona pod tym względem. Powyższy przykład używa 8 czerwonych, 5 zielonych i 3 niebieskich kolorów. - - TOPIC: PRZESUŃ KOLORY +image: shift-colors.png - Ta funkcja może być użyta do poprawienia kolorów lub przekonwertowania obrazu na fałszywe kolory. Wybierz dowolny z trzech kolorów RGB i przesuń suwak w lewo lub w prawo od środka. Jeden z dwóch pozostałych kolorów zostanie podstawiony w sposób stopniowy. Na przykład możesz stopniowo podstawić zielony lub niebieski za kolor czerwony. Suwak All przesuwa wszystkie kolory razem. Zrób to najpierw, aby znaleźć pierwsze optimum, a następnie przesuń kolory RGB indywidualnie. - - TOPIC: OBCE KOLORY +image: alien-colors2.jpg +image: alien-colors1.png - Przemaluj obraz lub wybrany obszar losowymi obcymi kolorami. Możesz kontrolować przybliżony rozmiar wzoru i intensywność (od ledwo widocznej do dominującej). Naciśnij [Zastosuj], aby uzyskać nowy rozkład kolorów. - - TOPIC: WŁASNE JĄDRO +image: custom-kernel.png - Zastosuj własne jądro konwolucji do obrazu. Leżąca u podstaw technologia jest wyjaśniona w Wikipedii. Wprowadź rozmiar jądra, współczynnik mnożenia, współczynnik dodawania i wypełnij wartości tabeli. [Zastosuj] stosuje jądro do obrazu. [Resetuj] przywraca oryginalny stan obrazu. Wartości można zapisać do pliku i pobrać później za pomocą przycisków [Zapisz] i [Wczytaj]. Początkowo dostępnych jest kilka przykładowych plików jądra. Możesz je modyfikować i zapisywać pod niestandardową nazwą. - Matematyka: wartości jasności dla każdego bloku pikseli N na N na obrazie są mnożone przez odpowiadające wartości w macierzy jądra i sumowane. Ta liczba jest mnożona przez współczynnik mnożenia, i dodawany jest do niej współczynnik dodawania. Ta końcowa wartość staje się nowym poziomem jasności dla piksela obrazu w środku bloku N x N. - - TOPIC: MENU WYPACZANIA - - TOPIC: WYGNIJ +image: unbend1.png +image: unbend2.jpg - Panoramy bliskich obiektów (zazwyczaj budynków lub wnętrz pomieszczeń) mogą pokazywać proste linie, które są zakrzywione, lub budynki, które są pochylone. Wypaczenie obrazów było konieczne w procesie panoramy, aby obrazy do siebie pasowały. Funkcja Wygnij może być następnie użyta, aby wyprostować obraz panoramy, jeśli to potrzebne. Pionowe i poziome linie kropkowane są rysowane nad obrazem, pokazując osie wygięcia. Kliknij lub przeciągnij myszą blisko końca linii, aby ją przesunąć. Jeśli zmienione zostaną wartości w czterech kontrolkach wejściowych, obraz jest wypaczany w sposób wskazany przez odpowiadające cztery obrazy. Zwiększaj lub zmniejszaj wartości i powtarzaj, aż będziesz zadowolony. Przesuń osie, aby zmienić środki wypaczania. - Zobacz też {WYPACZ OBRAZ}, aby poznać inną metodę poprawiania krzywizny obrazu i perspektywy. - - TOPIC: PERSPEKTYWA +image: perspective2.jpg +image: perspective1.png - Ta funkcja może być użyta do wyprostowania zdjęcia zrobionego pod przesuniętym kątem. Obraz po lewej to oryginalne zdjęcie, zrobione z prawej strony środka, aby uniknąć odbić. Obraz po prawej to wyprostowana wersja. Ta funkcja może być również użyta do wyprostowania wysokiego budynku sfotografowanego z poziomu ulicy lub z boku. - Kliknij cztery narożniki czworościanu, który chcesz zamienić w prostokąt (w powyższym przypadku cztery narożniki obrazu lub ramy), a następnie wybierz [Zastosuj]. Kliknięte narożniki są oznaczone małymi białymi polami zawierającymi "A, B, C, D". Lewy górny róg każdego pola precyzyjnie oznacza pozycję obrazu. Kliknięcie blisko pola przesunie je do nowej pozycji. Możesz użyć klawiszowych strzałek, aby przesuwać znaczniki narożników w krokach 1-pikselowych. Strzałki działają na ostatnim klikniętym lub przesuniętym narożniku. - - TOPIC: WYPACZ OBRAZ +image: warps4.jpg - - TOPIC: WYPACZ OBSZAR Ta funkcja może być użyta do tworzenia zniekształceń w obrębie obrazu. Możesz wybrać obszar obrazu i przeciągnąć myszą, aby rozciągnąć ten obszar względem reszty obrazu. Obraz jest jak guma. Jeśli przeciągnięcie myszą zaczyna się w obrębie wybranego obszaru, wtedy obszar jest wypaczany w obrębie swoich bieżących granic - ruch jest maksymalny przy wskaźniku myszy i maleje do zera przy krawędziach obszaru. Jeśli przeciągnięcie myszą zaczyna się poza wybranym obszarem, krawędzie obszaru blisko myszy mogą zostać wyciągnięte poza pierwotną granicę obszaru. Wiele przeciągnięć myszą o różnych długościach i kierunkach można łączyć, aby osiągnąć żądane wyniki. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - Ta funkcja jest przydatna do poprawiania problemów z perspektywą. Przeciągnij obraz od miejsca blisko narożnika, używając myszy. Obraz jest elastycznie przeciągany od tego narożnika, podczas gdy pozostałe narożniki pozostają ustalone. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - Ta funkcja jest przydatna do poprawiania problemów z perspektywą. Przeciągnij obraz od wewnątrz, używając myszy. Wnętrze obrazu jest elastycznie przeciągane, podczas gdy granice pozostają ustalone. - - TOPIC: WYPACZ ZAKRZYWIENIE Ta funkcja jest przydatna do poprawiania problemów z perspektywą (zobacz też {WYGNIJ}). Przeciągnij obraz z dowolnej pozycji, używając myszy. Cały obraz będzie ciągnięty lub pchany w kierunku myszy, ale obszary blisko myszy są przesuwane bardziej niż bardziej odległe obszary. Możesz wyprostować zakrzywione linie lub celowo zakrzywić obraz. Kontrolka 'zasięg wypaczania' określa promień wypaczania wokół myszy. 1.0 oznacza, że wypaczany jest cały obraz, a mniejsze wartości ograniczają wypaczanie do mniejszych obszarów wokół myszy. - - TOPIC: WYPACZ AFINICZNIE Ta funkcja może być użyta do wypaczania obrazu na interesujące sposoby. Przeciągnij obraz od narożnika lub krawędzi, używając myszy. Zmiany są czysto liniowe, więc proste linie pozostają proste. To przekształcenie nazywane jest "afinicznym". Szczegóły można znaleźć, przeszukując internet. - - TOPIC: WYPACZ RADIALNIE +image: warp_radial.png - Dodaj lub usuń dystorsję beczkową lub poduszkową. Dystorsja beczkowa jest często widoczna w obrazach RAW, które nie zostały przetworzone, aby usunąć tę dystorsję. Kliknij lewym przyciskiem, aby wybrać centralny punkt, wokół którego wyśrodkowane będą zmiany - zazwyczaj środek obrazu. Jest to wartość domyślna. Przesuń suwak 'rozciągnięcie', aby wygiąć obraz. - - TOPIC: ROZWYPACZ ZBLIŻENIE +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - Zdjęcia twarzy w zbliżeniu są często zniekształcone, ponieważ obszary bliższe aparatowi są większe na zdjęciu niż obszary dalsze. Ta funkcja może być użyta do odwrócenia zniekształcenia. Użyj {WYBIERZ OBSZAR}, aby najpierw wybrać twarz (nie musi być dokładne). Kliknij obraz blisko środka zniekształcenia (powyższy przykład: prawy policzek). Przesuń suwak, aby zoptymalizować. - - TOPIC: TWÓRZ FALE +image: make-waves2.jpg +image: make-waves1.png - Ta funkcja zniekształca obraz we wzór fali, jak gdyby oglądany przez wzburzoną wodę. Okno dialogowe umożliwia zmianę średniej długości fali poziomej i pionowej, amplitudy i wariancji. Pole wejściowe "perspektywa" umożliwia stopniowe wydłużanie długości fal od góry do dołu. - - TOPIC: SKRĘĆ +image: twist1.png +image: twist2.png - Ta funkcja skręca obraz wokół punktu wybranego kliknięciem lub przeciągnięciem myszy. Kliknij żądaną pozycję i przesuń suwak Skręć o żądaną wartość. Możesz też przeciągnąć myszą po obrazie, aby zmienić środek skręcenia. Suwak Środek rozkręca centralny obszar względem reszty. Suwak Kąt obraca obraz. - - TOPIC: SFERA +image: sphere2.jpg +image: sphere.png - Utwórz projekcję sferyczną obrazu. Przeciągnij myszą po obrazie, aby zmienić środek projekcji (domyślnie punkt środkowy). Kontrolka spłaszczenia stopniowo modyfikuje projekcję od sfery (prawo) do płaskiego obrazu (lewo). Suwak powiększenia powiększa wynikowy obraz do 2x. - - TOPIC: NA LEWĄ STRONĘ +image: inside-out2.jpg +image: inside-out1.png - Ta funkcja odwraca odległości środek-krawędź każdego piksela. Możesz kliknąć lub przeciągnąć myszą, aby zmienić punkt środkowy. - - TOPIC: TINY PLANET +image: tiny-planet.jpg - Owiń obraz wokół koła. Jeśli obraz jest panoramą 360 stopni, nie będzie widocznego szwu. • Środkowy otwór: obraz jest owinięty wokół centralnego otworu. • Przytnij górę: usuń górny margines z obrazu wejściowego. • Przytnij dół: usuń dolny margines z obrazu wejściowego. • Odwróć R: odbij lustrzanie obraz wejściowy pionowo. • Odwróć Theta: odbij lustrzanie obraz wejściowy poziomo. • Obróć: obróć obraz wyjściowy wokół środka. - - TOPIC: SPIRALA ESCHERA +image: escher-spiral.png +image: escher-spiralA.png - Przekształć obraz w niekończącą się spiralę do wewnątrz, jak słynny zegar M.C. Eschera. Szerokość określa początkową szerokość najbardziej zewnętrznej warstwy. Obwódka określa początkową szerokość obramowania oddzielającego warstwy, a Kolor określa jego kolor. Domyślny środek to środek obrazu. Kliknij obraz, aby ustawić nowy środek. - - TOPIC: SPŁASZCZ ZDJĘCIE +image: flatten-photo1.png +image: flatten-photo2.jpg - ^Strona książki lub inna zakrzywiona powierzchnia Spłaszcz zdjęcie obrazu na powierzchni, która jest zakrzywiona, np. wokół kolumny, lub stronę z otwartej grubej książki, gdzie strony zakrzywiają się do wewnątrz przy grzbiecie na środku. Krzywizna górnej i dolnej krawędzi powierzchni dostarcza informacji o wielkości krzywizny i ilości rozciągnięcia potrzebnego, aby wyglądać płasko. Powyższy przykład to gruba książka. Inne zaokrąglone powierzchnie mogą być poprawione, np. plakat na okrągłej kolumnie. - Wybierz opcję śledzenia górnego, aby śledzić górną krawędź zakrzywionej strony. Klikaj myszą wzdłuż krawędzi, tworząc kropkę znacznika w każdym klikniętym punkcie. Gdy dostępne są 4 punkty, linia krzywej jest rysowana przez punkty. Dodaj więcej punktów i przeciągaj punkty w miarę potrzeb, aby linia ściśle dopasowała się do krzywizny obrazu. Wybierz opcję śledzenia dolnego i śledź dolną krawędź w ten sam sposób. Gdy obie są gotowe, naciśnij [flatten], aby spłaszczyć stronę. Krawędzie powinny być teraz proste (lub wystarczająco proste). Użyj suwaka [stretch], aby w miarę potrzeb rozciągnąć boki obrazu, aby skompensować boczną kompresję spowodowaną krzywizną. Użyj kontrolki Rozszerz, aby w miarę potrzeb rozszerzyć obraz, aby przywrócić poprawną proporcję szerokości/wysokości. Przycisk [undo] przywraca niezmodyfikowany obraz, zachowując kropki znaczników, które można następnie dostosować do poprawionej próby. - +image: flatten-photo3.jpg - ^Zakrzywiony horyzont Szeroka panorama lub zdjęcie z obiektywu szerokokątnego może mieć horyzont, który nie jest prosty lub poziomy. Obraz można wyprostować (lub inaczej przesunąć), śledząc krzywą przez horyzont lub inne obszary, które muszą być wyrównane wzdłuż prostej linii. Wybierz opcję śledzenia górnego lub dolnego, w zależności od tego, czy horyzont (lub inna część obrazu) leży głównie powyżej lub poniżej środka obrazu. Obraz zostanie wypaczony, aby ta krzywa stała się prosta. Jedna krzywa wystarczy. Druga krzywa jest dodawana automatycznie do przeciwnej krawędzi (góra lub dół) obrazu. Jeśli wynik nie jest zadowalający, użyj przycisku [undo], dostosuj znaczniki na dowolnej krzywej i spróbuj ponownie. Możesz też zapisać obraz i zastosować funkcję po raz drugi, używając zapisanego obrazu jako punktu wyjścia. - - TOPIC: MENU ŁĄCZENIA Są to funkcje, które łączą wiele plików obrazów. W przypadku nakładających się obrazów odpowiadające sobie elementy w każdym obrazie są wyrównywane, aby się pokrywały, z dokładnością do pojedynczego piksela. Czas wyrównania to zazwyczaj 10-30 sekund na obraz. Jeśli widzisz, że ten proces wyrównywania przebiega źle, możesz użyć klawisza Escape, aby przerwać proces. - - TOPIC: HDR ^Wysoki zakres dynamiki +image: HDR.jpg +image: HDR-adjust.png - Połącz (nałóż) wiele obrazów tego samego obiektu o różnych poziomach ekspozycji. Połączony obraz może pokazywać lepszą widoczność szczegółów zarówno w ciemniejszych, jak i jaśniejszych obszarach, efektywnie używając pikseli z jaśniejszych obrazów dla ciemniejszych obszarów, i z ciemniejszych obrazów dla jaśniejszych obszarów. Jeśli aparat jest dostosowywany ręcznie między ujęciami, uważaj, aby utrzymać go w poziomie i celować w ten sam odległy punkt. Pewne niedopasowanie obrazów wejściowych jest tolerowane. Jeśli ludzie lub rzeczy poruszają się między ujęciami, nie da się uniknąć duchów (ghosting). - Wybierz funkcję menu HDR i wybierz do 9 obrazów ({WYBIERZ PLIKI OBRAZÓW}), które muszą mieć niemal te same wymiary pikseli. Obrazy są wyrównywane i łączone automatycznie. Po zakończeniu pokazywany jest połączony obraz wraz z oknem dialogowym do dostosowań. Wkłady z obrazów wejściowych są pokazywane jako seria edytowalnych krzywych. Skala pozioma reprezentuje jasność piksela, od ciemnej do jasnej. Każda krzywa reprezentuje obraz, który wnosi wkład do pikseli wyjściowych. Wkład obrazu przy danym poziomie jasności jest proporcjonalny do wysokości jego krzywej na tym poziomie. Początkowa krzywa dla najjaśniejszego obrazu będzie wysoka po lewej i niska po prawej, co oznacza wysoki wkład w ciemne piksele i niski wkład w jasne piksele. Najciemniejszy obraz będzie niski po lewej i wysoki po prawej, a pozostałe obrazy pomiędzy. Krzywe można edytować, przeciągając je myszą. Odpowiadające wkłady obrazów zmieniają się w związku z tym, i możesz zobaczyć wyniki w czasie rzeczywistym w obrazie wyjściowym. Powyższy obraz pokazuje dwa obrazy wejściowe i ich obraz wyjściowy. Przykładowe okno dialogowe pokazuje trzy krzywe dostosowane, aby zoptymalizować trzy obrazy wejściowe. - - TOPIC: HDF ^Duża głębia ostrości Połącz (nałóż) wiele zdjęć tego samego obiektu z różnymi ustawieniami ostrości od bliskiej do dalekiej. Różne części obiektu są ostre na każdym obrazie. Połącz obrazy, tak aby wszystkie części obiektu były ostre. - Robienie zdjęć: Wybierz punkt na środek obrazu. Wyceluj aparat w bliski obiekt i wciśnij przycisk migawki do połowy, aby ustawić ostrość na tym obiekcie. Przytrzymaj przycisk w pozycji do połowy, wyceluj aparat w wybrany środek i zrób zdjęcie. Teraz wybierz dalszy obiekt i zrób to samo. Powtarzaj, zwiększając odległość ostrości. Miejmy nadzieję, że każda część obiektu jest ostra przynajmniej na jednym zdjęciu. Pozycja aparatu powinna być niemal taka sama dla wszystkich zdjęć, co może być wyzwaniem, jeśli obiekt jest bardzo blisko. Ruch aparatu może powodować problemy ze skalowaniem i paralaksą (bliskie obiekty przesunięte względem dalekich obiektów). Takie problemy mogą być naprawialne później w Fotocx, ale może to wymagać sporo czasu. Lepiej jest unikać tych problemów. - +image: HDF-paint.png - Przetwarzanie zdjęć: Wybierz funkcję menu HDF i wybierz do 9 obrazów ({WYBIERZ PLIKI OBRAZÓW}). Obrazy zostaną teraz wyrównane najlepiej, jak to możliwe. Obraz wyjściowy to równomierna mieszanka wyrównanych obrazów wejściowych. Niewielki ruch aparatu między zdjęciami jest kompensowany, ale jest to ograniczone, a przesunięcia paralaksy nie są kompensowane wcale. Gdy wyrównanie jest zakończone, otwiera się okno dialogowe. Możesz wybrać dowolny obraz wejściowy i "malować" nim myszą na dowolnym obszarze obrazu wyjściowego. Przekształca to oryginalną mieszankę obrazów w pojedynczy wybrany obraz dla malowanego obszaru. Dla każdego obszaru lub obiektu na obrazie wybierz obraz wejściowy, który jest ostry w tym obszarze. Promień pędzla można ustawić większy lub mniejszy, więc możesz szybko malować duże obszary i kontrolować drobne szczegóły, gdy jest to potrzebne. Jeśli masz nakładające się bliskie i dalekie obiekty, potrzebny będzie czas i cierpliwość, aby uczynić je wszystkie ostrymi. Niedopasowania można poprawić, wybierając opcję wypaczania w oknie dialogowym. Obrazy leżące u podstaw można wtedy przeciągać i wypaczać myszą, a połączony obraz wyjściowy zmienia się odpowiednio. Wypaczanie jest ograniczone do obszaru wokół myszy. Gdy pomalowany obszar jest przeciągany, odpowiadający obraz wejściowy jest automatycznie wybierany i przeciągany, podczas gdy obszary pomalowane innymi obrazami pozostają ustalone. Obszarów, które nie zostały pomalowane, nie można przeciągać. Przemieszczaj się między różnymi obszarami i wykonuj przyrostowe przeciągnięcia, aż wszystkie będą wyrównane. - Sugerowany workflow: Używając trybu malowania, wybierz każdy obraz po kolei i pomaluj wszystkie obszary, które wyglądają na ostre na tym obrazie. Wszelkie granice, które nie są dobrze wyrównane, będą wyraźnie widoczne jako przesunięcia na krawędziach elementów obrazu. Niektóre z nich można uczynić nieistotnymi, zmieniając obraz używany do malowania (jeśli więcej niż jeden obraz jest wystarczająco ostry). Używając trybu wypaczania, wprowadzaj drobne poprawki w miarę potrzeb, aby wyeliminować widoczne przesunięcia. - - TOPIC: STOS/MALOWANIE +image: stack-paint.png - +image: stack-paint2.jpg - Ułóż w stos (nałóż) wiele zdjęć tego samego obiektu zrobionych w różnym czasie. Usuń turystów i samochody, które pojawiają się i znikają między ujęciami. - Robienie zdjęć: Wyceluj aparat w ten sam odległy punkt i zrób wiele zdjęć, gdy turyści lub samochody przemieszczają się przed obiektem. Postaraj się uzyskać dwa lub więcej zdjęć dla każdego obszaru obiektu niezasłoniętego przez przemieszczające się obiekty. Trzymaj aparat stabilnie i celuj w ten sam punkt, aby obrazy dokładnie się wyrównały. - Przetwarzanie zdjęć: Wybierz funkcję menu Stos/Malowanie i wybierz do 9 obrazów ({WYBIERZ PLIKI OBRAZÓW}). Obrazy zostaną teraz wyrównane najlepiej, jak to możliwe. Obraz wyjściowy (dół lewo) to równomierna mieszanka wyrównanych obrazów wejściowych (górny wiersz). Gdy wyrównanie jest zakończone, uruchamia się okno dialogowe pokazane powyżej. Możesz wybrać dowolny obraz wejściowy i "malować" myszą na dowolnym obszarze obrazu wyjściowego. Pojedynczy wybrany obraz jest używany dla malowanego obszaru. Dla każdego obszaru na obrazie wybierz obraz wejściowy wolny od przemieszczających się obiektów. Promień pędzla można ustawić większy lub mniejszy, więc możesz szybko malować duże obszary i kontrolować drobne szczegóły, gdy jest to potrzebne. - Działanie automatyczne: naciśnij przycisk [Ukryj], aby zobaczyć, czy przemieszczające się obiekty mogą zostać usunięte automatycznie. Zadziała to dla obszarów na obrazie, gdzie dostępnych jest wiele zdjęć niezasłoniętego tła (dolny środkowy obraz). Aby pokazać wszystkie przemieszczające się obiekty, naciśnij przycisk [Pokaż] (dolny prawy obraz). Zwykle działa to, ale nie idealnie. Niewielkie niedopasowania obrazu lub różnice oświetlenia (zwłaszcza poruszające się cienie) mogą sprawić, że algorytm wybierze piksele tła zamiast pikseli pierwszego planu. Możesz użyć metody malowania opisanej powyżej, aby ręcznie naprawić błędy. - - TOPIC: STOS/SZUM +image: stack-noise2.jpg +image: stack-noise.png - Ta funkcja łączy 2-9 zdjęć tego samego obiektu. Zdjęcia powinny być niemal takie same, z wyjątkiem małych przesunięć spowodowanych trzymaniem aparatu w ręku. Jeśli zdjęcia zostały zrobione z bardzo wysokim ustawieniem ISO (warunki słabego oświetlenia), piksele będą miały znaczny szum. Poprzez zrobienie wielu zdjęć i ich uśrednienie szum można w większości wyeliminować. - Przetwarzanie zdjęć: Wybierz funkcję Stos/Szum i wybierz do 9 obrazów ({WYBIERZ PLIKI OBRAZÓW}). Zostaną one automatycznie połączone i pokazane, i otworzy się okno dialogowe. Początkowy obraz wyjściowy to kombinacja wszystkich wybranych obrazów wejściowych, uśrednionych razem. Oznacza to, że wartości RGB dla każdego piksela wyjściowego są średnią wartości RGB dla odpowiadających pikseli wejściowych. Przycisk mediany zmieni piksele wyjściowe na medianę pikseli wejściowych (uśredniane są 1-3 środkowe wartości RGB, w zależności od liczby obrazów). Może to być lepsze lub nie, więc przełączaj się tam i z powrotem, aby porównać. Pola wyboru pomiń niski piksel i pomiń wysoki piksel spowodują odrzucenie najniższych i najwyższych wartości wejściowych RGB przed uśrednieniem. Może to usunąć skoki szumu z mieszanki. Nie ma to wpływu, jeśli wybrana jest metoda mediany. - - TOPIC: STOS/WARSTWY +image: stack-layers.png - Użyj tej funkcji, aby połączyć różne edytowane wersje obrazu, gdzie możesz określić, która wersja jest pokazywana w wybranych obszarach obrazu. Można łączyć dowolne obrazy, które mają te same wymiary pikseli. - Wybierz do 9 obrazów o identycznym rozmiarze. Początkowy obraz wyjściowy to równa mieszanka wszystkich obrazów wejściowych. Proporcje obrazów to względne wagi mieszanych obrazów. Można je dostosować, aby zróżnicować wagę każdego obrazu. Przykład: jeśli 3 obrazy są połączone z względnymi wagami 3, 5, 7, wtedy połączony obraz to 3/15 z obrazu #1, 5/15 z #2 i 7/15 z #3. Jeśli wybrana jest opcja "Maluj cały obraz", wagi można dostosować, a obraz wyjściowy reaguje natychmiast. Jeśli wybrana jest opcja "Maluj w obrębie myszy", wtedy można przeciągnąć myszą, a malowany jest tylko obszar w obrębie koła myszy, używając aktualnie aktywnych proporcji obrazu. Szybkość malowania jest kontrolowana przez ustawienia Mocy dla środka i krawędzi myszy. Użyj niskich liczb, aby malować stopniowo. - - TOPIC: PANORAMA +image: pano-align1.jpg +image: pano-align2.jpg - Ta funkcja zszywa 2-6 obrazów razem, aby utworzyć obraz szerokokątny lub panoramę. Obrazy muszą nakładać się o 10% lub więcej, aby program mógł znaleźć, gdzie się dopasowują, i połączyć je razem. Zacznij od wybrania 2-6 plików obrazów ({WYBIERZ PLIKI OBRAZÓW}). Pomocne jest wybieranie obrazów w kolejności od lewej do prawej, aby ułatwić wstępne zgrubne wyrównanie. Obrazy są początkowo połączone i pokazane z małym przezroczystym nakładaniem się. Okno dialogowe wstępnego wyrównania (powyżej) prosi o przeciągnięcie obrazów do zgrubnego wyrównania. Przeciągnij obrazy do prawidłowej kolejności od lewej do prawej. Przeciągany obraz może nakładać się na inne obrazy. Aby było jasne, który obraz jest przeciągany, przeciągaj od miejsca blisko środka obrazu. Po ustawieniu obrazów w prawidłowej kolejności wyrównaj każdy obraz do jego lewego sąsiada. Najlepiej jest postępować od lewej do prawej. Przesuń obraz poziomo i pionowo do zgrubnego wyrównania z sąsiadem po lewej, a następnie obróć obraz, jeśli to potrzebne, przeciągając dolną krawędź w lewo lub w prawo - obraz obraca się wokół środkowego punktu jego nakładania się z obrazem po lewej. Najszybszą metodą jest wyrównanie najpierw środkowego regionu nakładania się, a następnie obrócenie prawego obrazu, jeśli to potrzebne, aby wyrównać górny i dolny region nakładania się. Ekstremalna dokładność NIE jest konieczna. Obrazy powinny być poprawnie zakrzywione i dobrze do siebie pasować. Jeśli nie, wtedy 'lens mm' (ogniskowa, odpowiednik 35mm) wymaga dostosowania. Krzywizna obrazu zmienia się w miarę dostosowywania lens mm. Wartość początkowa jest pobierana z metadata EXIF, jeśli są dostępne, i zazwyczaj jest to wystarczająco dobre. Jeśli obrazy nie mają krzywizny (np. zeskanowane obrazy), użyj pola wyboru 'no curve', aby ustawić 'lens mm' efektywnie na nieskończoność. - Jeśli którykolwiek z obrazów został przycięty, matematyka zależna od ogniskowej EXIF nie działa. Możesz być w stanie to skompensować, zwiększając ogniskową w 'lens_mm'. - Pole wyboru 'manual align' użyje ręcznego wstępnego wyrównania jako ostatecznego wyrównania. Jest to przeznaczone dla obrazów, które nie mają wyraźnych cech potrzebnych do wyrównania obrazów. Ta opcja umożliwia również, aby obrazy miały zerowe nakładanie się. - Naciśnij [proceed], gdy wstępne wyrównanie jest zakończone, a program wykona precyzyjne wyrównanie i połączy obrazy. Wewnętrznie obrazy są przesuwane i obracane, a stopień dopasowania jest oceniany. Odbywa się to przy zwiększających się rozmiarach obrazu, aż znalezione zostanie najlepsze wyrównanie. Może to wymagać minuty lub więcej, w zależności od szybkości CPU i rozmiaru obrazu. Możesz znacznie przyspieszyć proces, jeśli zmniejszysz obrazy wejściowe do 2/3 lub 1/2 rozmiaru. Zrób to również, jeśli proces zawiedzie z powodu braku pamięci. - +image: pano-adjust.jpg - Gdy precyzyjne wyrównanie jest zakończone, wyświetlany jest połączony obraz. Powyższe okno dialogowe uruchamia się dla precyzyjnych dostosowań jasności. Możesz zobaczyć granicę między obrazami, jeśli nie mają tej samej jasności. Wybierz obraz za pomocą przycisków opcji na górze. Użyj przycisku [automatyczny kolor] wielokrotnie, aby automatycznie poprawić dopasowanie jasności/koloru obrazów. Obrazem bazowym jest obecnie wybrany. Wypróbuj różne obrazy bazowe, aby zobaczyć, który działa najlepiej. Jeśli obrazy są mocno niedopasowane pod względem jasności, wybierz największe odstępstwo i użyj kontrolki jasności, aby zmienić jasność, dopasowując ją do pozostałych, a następnie [automatyczny kolor]. Dopasowanie nie musi być bardzo dobre, ponieważ 'Szerokość mieszania' (dalej) zamaskuje pozostałe różnice. Użyj przycisku 'File Color', aby zresetować poziomy jasności z plików obrazów wejściowych. - Kontrolka 'Szerokość mieszania' reguluje sposób mieszania obrazów: przy nakładaniu się obrazów jasność jest zmieniana na tylu pikselach, aby zamaskować nierównowagi, których nie można w pełni skorygować. Wartość domyślna to 1 piksel, co czyni oczywistą wszelką różnicę jasności. - Jeśli obrazy nie wyrównują się idealnie, możesz być w stanie poprawić wyrównanie, używając myszy, aby wepchnąć obrazy w wyrównanie. Wybierz 'Mouse Warp' i wybierz jeden z obrazów za pomocą przycisków opcji. Następnie przeciągnij myszą wzdłuż krawędzi obrazu, gdzie powinien się wyrównać ze swoim sąsiadem, przesuwając obraz w wyrównanie. Obraz jest przesuwany lokalnie wokół myszy, podczas gdy bardziej odległe części pozostają ustalone. Obrazy z przesunięciem paralaksy będą wymagać kompromisu, ponieważ nie można utrzymać zarówno pierwszego planu, jak i tła w wyrównaniu. - Kontrolka spłaszczenia obrazu może być użyta, aby "wygiąć" obraz, co wyprostuje zakrzywione linie (np. zakrzywione budynki). Wartość zero nie ma wpływu, a wartość 1.0 w pełni spłaszczy obraz. - Po zakończeniu użyj {WYGNIJ}, {WYPACZ OBRAZ}, {KADRUJ} itd. do ostatecznych dostosowań. - ^Zeskanowane obrazy Zeskanowane obrazy można łączyć, jeśli jest wystarczające nakładanie się. Zaznacz 'no curve', ponieważ nie ma krzywizny. - ^Automatyczne wypaczanie Obrazy są lekko wypaczane w różnych kierunkach podczas wyrównywania, aby znaleźć najlepsze dopasowanie. Ma to na celu skompensowanie przesunięć horyzontu aparatu lub obrotu, powodujących zniekształcenia obrazu, które obniżają jakość dopasowania. Jeśli obszar nakładania się dwóch obrazów zawiera duży obiekt, który poruszył się między dwoma zdjęciami, proces wyrównywania może 'oszaleć', próbując dopasować obrazy, czyniąc wyrównanie bardzo słabym. Wybierając 'no auto warp', możesz być w stanie sprawić, że wyrównanie się powiedzie, lub mieć mniejszy błąd. Inną opcją jest wybranie ręcznego wyrównania. - ^Łączenie panoram Możesz utworzyć panoramę z do 6 obrazów za jednym razem. Możesz też łączyć panoramy, które pasują do siebie po bokach, np. połączyć 4-obrazową panoramę z inną 4-obrazową panoramą, aby utworzyć 8-obrazową panoramę. Musisz zatrzymać normalne zakrzywianie obrazu, gdy łączysz panoramy, ponieważ obrazy panoramy są już zakrzywione (zakładając, że nie użyłeś opcji 'spłaszcz' w ostatecznym oknie dialogowym panoramy). Zatrzymaj zakrzywianie obrazu, zaznaczając pole 'no curve' w oknie dialogowym wstępnego wyrównania. - ^Ograniczenia panoramy Panoramy obejmujące bliskie obiekty mogą być trudne: podczas robienia zdjęć uważaj, aby obracać aparat wokół osi przechodzącej przez obiektyw, z minimalnym ruchem bocznym, w przeciwnym razie obrazy mogą się słabo wyrównać, ponieważ obiekty pierwszego planu są przesunięte względem tła (paralaksa). Nie jest to problem, gdy obiekt jest oddalony o 50+ metrów, ponieważ mały ruch boczny ma niewielki wpływ na obraz. Trzymaj aparat w poziomie, aby uniknąć dużego przesunięcia pionowego (przesunięcia horyzontu), które może spowodować zniekształcenia obrazu, które mogą nie zostać w pełni skorygowane. Unikaj obracania aparatu z tego samego powodu. - ^Panorama pionowa Można to zrobić, obracając obrazy wejściowe o 90°. W Panoramie wybierz obrazy w kolejności od góry do dołu, tak aby górny obraz był po lewej, a dolny po prawej. Wykonaj panoramę normalnie. Obróć obraz wyjściowy, tak aby lewa strona stała się górą. - - TOPIC: POKAŻ PLIKI CIM Pokaż pliki wejściowe dla bieżącego lub najnowszego połączonego obrazu, w wyskakującym oknie. Zapamiętywany jest tylko bieżący lub najnowszy zestaw. - - TOPIC: MASHUP +image: mashup.jpg - Uporządkuj wiele obrazów i tekst w układzie. Obrazy można dodawać, zmieniać ich rozmiar, obracać i przemieszczać, przeciągając myszą. Obrazy można uczynić całkowicie lub częściowo przezroczystymi w wybranych obszarach. Tekst można dodawać, przesuwać, zmieniać jego rozmiar i obracać. Można określić atrybuty tekstu: czcionkę, rozmiar, kolor, obrys, cień, przezroczystość. Można dodawać linie i strzałki. Przykład tutaj pokazuje niektóre z możliwości. - +image: mashup1.png - W pierwszym oknie dialogowym Mashup wybierz obraz tła lub układu, na którym umieszczone zostaną inne obrazy. Wybierz istniejący obraz lub utwórz nowy jednokolorowy obraz o określonym rozmiarze i kolorze. Możesz też otworzyć wcześniej zapisany projekt mashup i kontynuować edycję. - +image: mashup2.png - 2. okno dialogowe Mashup to wybór: edytuj obrazy, edytuj tekst, edytuj linie i strzałki, przeskaluj do większego rozmiaru, zapisz ukończony połączony obraz (Gotowe) lub porzuć obraz (Anuluj). Pierwsze trzy wybory prowadzą do okien dialogowych do wykonania odpowiednich edycji. Każde z nich wraca do tego okna dialogowego po zakończeniu, więc możesz dodawać lub modyfikować obrazy, tekst i linie/strzałki w dowolnej kolejności. Przeskaluj jest wyjaśnione poniżej. - +image: mashup3.jpg - Użyj tego okna dialogowego, aby wybrać i umieścić obrazy w układzie oraz zmienić ich wygląd: rozmiar, obrót, pozycję, przezroczystość. Obraz może być częściowo lub całkowicie przezroczysty, w całości lub w określonych obszarach. Oznacza to, że obraz tła lub nakładający się obraz może być widoczny przez przezroczyste obszary. Przycisk Dodaj obraz prowadzi do okna dialogowego wyboru pliku galerii ({WYBIERZ PLIKI OBRAZÓW}). Wybrane obrazy są umieszczane w układzie. Po dodaniu obrazów kliknij dowolny obraz, aby wybrać go do modyfikacji. Przeciągnij obraz ze środka, aby ustawić pozycję obrazu w układzie. Przeciągnij dolny prawy narożnik, aby zmienić rozmiar obrazu. Użyj kontrolek okna dialogowego, aby dostosować obraz. Kontrolki okna dialogowego działają na ostatnio dodanym, kliknięciu lub przeciągniętym obrazie. Przyciski 'Wstecz' i 'Dalej' przechodzą przez obrazy pojedynczo, migając wybranym obrazem. Może to być użyte, gdy nakładające się obrazy utrudniają wybranie żądanego obrazu kliknięciem go. Skala przeskalowuje obraz. Kąt obraca obraz. Przyciski Kolejność stosu podnoszą lub obniżają obraz względem innych obrazów - określa to, który nakładający się obraz będzie na wierzchu. Przezroczystość bazowa jest używana, aby uczynić cały obraz częściowo przezroczystym. Przycisk [maluj] jest używany, aby uczynić dowolną część obrazu częściowo lub w pełni przezroczystą, używając okna dialogowego Maluj pokazanego poniżej. Przycisk [wypacz] jest używany do wyginania lub wypaczania obrazu, używając okna dialogowego Wypacz pokazanego poniżej. Pole wyboru 'czarne marginesy' może być użyte do usunięcia czarnych marginesów pozostawionych przez inne funkcje edycji, np. wypaczanie. Zostaną one uczynione przezroczystymi. Przycisk 'Obraz jest zablokowany' uniemożliwi przesuwanie obrazu myszą lub klawiaturą. Jest to pomocne, gdy obrazy są precyzyjnie wyrównywane, a przypadkowy ruch powinien być zapobiegnięty. Kontrolki Marginesy mogą być użyte, aby uczynić krawędzie obrazu przezroczystymi. Twarde marginesy odcinają krawędzie obrazu. Marginesy mieszania czynią krawędzie częściowo przezroczystymi, aby wmieszać je w tło lub inne nakładające się obrazy. - +image: mashup4.png - "Maluj" mniejszą lub większą przezroczystość dla wybranych obszarów obrazu. Kliknij obraz, aby go wybrać. Wskaźnik myszy to koło pokazujące zasięg działania. Użyj promienia, aby dostosować rozmiar. Przeciągnij myszą lewym przyciskiem po obrazie, aby uczynić go przezroczystym w obszarach objętych kołem. Przeciągnij prawym przyciskiem, aby uczynić go nieprzezroczystym. Jeśli zaznaczone jest Stopniowe, zmiany przezroczystości są wykonywane powoli w miarę przeciągania myszy. Podaj wartość mocy dla środka i krawędzi myszy, aby regulować tempo zmiany. - +image: mashup5.png - Okno dialogowe wypaczania jest używane do wypaczania obrazu. Kliknij obraz, aby go wybrać. Przeciągnij obraz myszą - obraz wypaczy się lub rozciągnie lokalnie w kierunku myszy (jak arkusz gumy). Obszar wypaczania jest w przybliżeniu określony przez zasięg wypaczania, który jest ułamkiem rozmiaru obrazu. Każde przeciągnięcie jest krokiem, który dodaje się do poprzednich kroków. Ostatnie kroki można cofnąć za pomocą [undo last], a niewygięty obraz można przywrócić za pomocą [undo all]. - +image: mashup6.png - Okno dialogowe Edytuj tekst jest używane do umieszczania tekstu w układzie. Wprowadź jakiś tekst i naciśnij [Zastosuj]. Jesteś proszony o kliknięcie w układzie, gdzie tekst zostanie dodany. Przeciągnij go na pozycję, a następnie użyj kontrolek okna dialogowego, aby ustawić czcionkę, rozmiar, kolor, kąt, kolor tła, rozmiar i kolor obrysu, rozmiar i kolor cienia, oraz przezroczystości dla każdego z nich. Przeciągnij tekst do nowej pozycji w dowolnym momencie. Kliknij dowolny istniejący tekst, aby pokazać jego właściwości w oknie dialogowym i je zmienić. Kliknij tekst i naciśnij Delete, aby go usunąć. Po zakończeniu edycji naciśnij [OK], aby wrócić do 2. okna dialogowego Mashup. - +image: mashup7.png - Okno dialogowe Edytuj linię/strzałkę jest używane do umieszczania linii lub strzałek w układzie. Działa bardzo podobnie do dodawania tekstu. Wprowadź długość i szerokość i naciśnij [Dodaj]. Jesteś proszony o kliknięcie w układzie, gdzie linia zostanie dodana. Linia jest umieszczana w układzie, lub strzałka, jeśli zaznaczona jest jedna z opcji grotu strzałki. Przeciągnij linię/strzałkę do żądanej pozycji. Dostosuj długość, szerokość, kąt i atrybuty (tło, obrys, cień), używając okna dialogowego. Możesz też przeciągnąć dowolny koniec linii/strzałki, aby ustawić pozycję tego końca, pozostawiając drugi koniec ustalony. - Możesz użyć myszy, aby przesuwać i zmieniać rozmiar obiektów w układzie: • kliknij obiekt, aby go wybrać - miga, aby potwierdzić wybór. • przeciągnij od przybliżonego środka, aby ustawić pozycję obiektu. • przeciągnij dolny prawy narożnik, aby zmienić rozmiar obiektu. • dla linii/strzałki przeciągnij dowolny koniec, aby przesunąć tylko ten koniec. - Klawiszowe strzałki mogą być również użyte do przesuwania obecnie wybranego obiektu w krokach 1-pikselowych. - Możesz dodać obrazy zapisane przez {WYBIERZ OBSZAR}. W oknie dialogowym Edytuj obrazy naciśnij [Dodaj], aby uruchomić okno dialogowe wyboru pliku. Użyj przycisku [Góra] w oknie galerii, wybierz 'saved_areas'. Otwórz dowolny ze znalezionych tam obrazów .png. Używany jest oryginalny obrys obszaru, a mieszanie obszaru działa od tych krawędzi. - ^Pliki projektu mashup Możesz zapisać projekt i otworzyć go później, aby kontynuować edycję. Projekt Mashup jest odbudowywany, używając tych obrazów i pewnych danych zapisanych w pliku projektu: lokalizacji obrazów i tekstu, skal, przezroczystości itd. - ^Przeskaluj mashup Praca z bardzo dużym układem (ponad 20 megapikseli) może być dość wolna. Przeciąganie dużego obrazu nakładki może być wolne i szarpane. Możesz pracować znacznie szybciej, jeśli użyjesz mniejszego układu do zbudowania projektu, a następnie powiększysz go po zakończeniu. Nie ma utraty rozdzielczości w ostatecznym obrazie, ponieważ obrazy nakładki i tekst są regenerowane z danych wejściowych. Przycisk Przeskaluj umożliwia powiększenie projektu 2x, 3x lub 4x. Istnieje również opcja resetowania, aby przywrócić oryginalny mniejszy rozmiar projektu. Za pomocą tej metody możesz pracować z układem 10 megapikseli, a następnie przeskalować go do 160 megapikseli po zakończeniu. Nad większym układem można nadal pracować bezpośrednio potem, ale będzie to wolniejsze. - - TOPIC: TABLICA OBRAZÓW +image: image-array.jpg - Wybierz wiele obrazów i połącz je w kompaktowy format tablicy w obrębie kolorowej ramki. - Pierwsze okno dialogowe pokazane jest w górnym lewym rogu. Kolor tła to kolor ramki obrysu i przestrzeni między zawartymi obrazami. Szerokość tablicy to całkowita szerokość tablicy wyjściowej, a Margines to szerokość zewnętrznego marginesu otaczającego wszystkie obrazy. Wysokość tablicy jest określana przez liczbę wybranych plików obrazów i przestrzeń potrzebną, aby je zmieścić w ramce. Kolumny obrazów określają liczbę kolumn obrazów (6 w powyższym przykładzie). Liczba wierszy zależy od liczby wybranych plików obrazów. Wartości Odstępu ustawiają przestrzeń poziomą i pionową między zawartymi obrazami. - Wybierz pliki obrazów ({WYBIERZ PLIKI OBRAZÓW}), a następnie naciśnij [Kontynuuj], gdy skończysz. Wynikowy obraz zostanie utworzony w kilka sekund (lub minut dla setek obrazów). Ten obraz będzie zazwyczaj miał bardzo nierówny dolny margines, jak pokazano na powyższym obrazie w górnym prawym rogu. Kolejność obrazów w tablicy jest określana przez kolejność wyboru. Górny wiersz jest wypełniany pierwszy, od lewej do prawej, następnie 2. wiersz itd. - Okno dialogowe Optymalizuj rozpoczyna się automatycznie. Może ono przeorganizować obrazy, tak aby dolny margines był bardziej równy. Naciśnij [Start] i poczekaj na optymalizację obrazu. Możesz obserwować postęp. Funkcja zakończy działanie, jeśli znalezione zostanie optimum, które sprawia, że dolny margines jest równy w granicach 2 pikseli. Może kontynuować wyszukiwanie w nieskończoność, jeśli ten cel nie zostanie osiągnięty. Naciśnij [Stop], aby zmusić funkcję optymalizacji do zakończenia z najlepszym dotychczas znalezionym rozwiązaniem. Jeśli optymalizacja się powiedzie, uzyskasz równe kolumny, jak pokazano na dolnym prawym obrazie. Jeśli dolna krawędź jest nadal nierówna po optymalizacji, jesteś pytany, czy chcesz dodać marginesy do niektórych obrazów, aby wyrównać dolną krawędź. Spowoduje to równą dolną krawędź, ale pionowe odstępy nie będą już równe. - WSKAZÓWKA: Optymalizacja działa najlepiej, jeśli liczba obrazów na kolumnę wynosi co najmniej cztery (lepiej więcej). Daje to optymalizatorowi wystarczającą elastyczność, aby znaleźć rozwiązanie z równą dolną krawędzią. - Pojawia się ostatnie okno dialogowe, pokazane w dolnym lewym rogu. Musisz teraz przypisać nazwę pliku do swojej tablicy. Uruchamiane jest okno dialogowe zapisu pliku, i możesz zapisać nowy plik tablicy w dowolnym miejscu. Jeśli wybrana jest opcja kopiuj metadata, metadata są kopiowane z wybranego pliku wejściowego do pliku wyjściowego. Jest to przydatne, jeśli obrazy są edytowanymi wersjami, i chcesz, aby tablica zawierała historię edycji dla ostatniej wersji (lub dowolnej wersji). - - TOPIC: MENU MASOWE Są to funkcje, które przetwarzają wiele wybranych plików obrazów, kilka lub tysiące. Te funkcje można anulować w trakcie procesu za pomocą klawisza Escape, ale pozostawi to niektóre pliki przetworzone, a niektóre nie. Wyskakujący raport pokazuje nazwy plików w miarę ich przetwarzania. - - TOPIC: MASOWA KONWERSJA +image: batch-convert.jpg - Ta funkcja jest używana do zmiany nazwy, konwersji, przeskalowania i przenoszenia wielu plików obrazów. Pliki RAW mogą być również konwertowane na pliki obrazów. Funkcja działa w wielu równoległych wątkach dla maksymalnej szybkości. - ^Pola wejściowe okna dialogowego • Wybierz pliki - pliki do konwersji ({WYBIERZ PLIKI OBRAZÓW}). • Zamień tekst - zamień tekst w nazwach plików (zobacz poniżej). • Nowa nazwa - opcjonalna nowa nazwa, wstawiony tekst (zobacz poniżej). • Numery sekwencji - liczba bazowa i adder dla nazw plików wyjściowych. • Nowa lokalizacja - opcjonalna nowa lokalizacja folderu dla plików wyjściowych. • Nowy typ - typ pliku dla plików wyjściowych, lub "bez zmian". • Głębia koloru - określ 8 lub 16 bitów dla wyjścia tif lub png. • Maks. szerokość, wysokość - opcjonalne limity dla plików wyjściowych (używane tylko, jeśli zaznaczono zmniejszenie lub zwiększenie) • Przeskaluj - opcjonalny współczynnik przeskalowania dla plików wyjściowych • Usuń oryginały - Usuń pliki wejściowe po pomyślnej konwersji. • Kopiuj metadata - Skopiuj wszystkie metadata do plików wyjściowych. • Aktualizuj albumy - zastąp pliki albumu przekonwertowanymi plikami wyjściowymi - ^Zamień tekst Jeśli tekst zostanie tutaj wprowadzony, nazwy plików są skanowane pod kątem tego tekstu, i jeśli zostanie znaleziony, podstawiany jest podany tekst zastępczy. Tekst zastępczy może mieć inną długość, a także może być pusty, w którym to przypadku tekst jest usuwany z nazwy pliku. - ^Nowa nazwa i wtyczki Nowa nazwa pliku może mieć wstawiony tekst: datę zdjęcia (z metadata EXIF), numer sekwencji lub oryginalną nazwę pliku. Określ co i gdzie wstawić w następujący sposób: • $oldname - Tutaj wstawiana jest oryginalna nazwa pliku • $sss - Tutaj wstawiany jest bieżący numer sekwencji. Zobacz poniżej. • $yyyy $mm $dd - Data zdjęcia jest wstawiana w tych pozycjach. - Przykład: San Francisco $yyyy:$mm:$dd $oldname $sss Plik wejściowy "Golden Gate Bridge.jpg", z datą zdjęcia 12 maja 2014, zostałby przekonwertowany na nazwę pliku wyjściowego "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg". - Dla "$sss" określ długość pola liczbą znaków 's', np. "$ss" będzie odpowiednie dla numerów sekwencji do 99. Zera wiodące są dodawane dla numerów sekwencji z mniejszą liczbą cyfr. Numery sekwencji niemieszczące się w określonej długości są wydłużane w miarę potrzeb. Pamiętaj, że kolejność sortowania nazw plików w galeriach jest ściśle kolejnością ascii, więc sekwencja liczb 1, 2 ... 9, 10 zostanie posortowana jako 1, 10, 2 ... 9. Możesz zachować kolejność liczbową, określając długość pola 2 ($ss), co daje sekwencję 01, 02 ... 09, 10. - Musi być obecne albo "$oldname", albo "$sss", aby zapewnić unikalność nazw plików wyjściowych. Jeśli Nowa lokalizacja jest brakująca lub niezmieniona, usuń oryginały jest ignorowane. Jeśli plik wyjściowy już istnieje, plik wejściowy nie jest konwertowany. - ^Maks. szerokość i wysokość Jeśli zaznaczone jest zmniejszenie i/lub zwiększenie, wtedy pliki wyjściowe zostaną zmienione w rozmiarze w obrębie tych limitów, zachowując oryginalną proporcję szerokości/wysokości. Jeśli zaznaczone jest zmniejszenie, pliki większe niż te limity są zmniejszane, aby zmieścić się w limitach. Jeśli zaznaczone jest zwiększenie, pliki mniejsze niż te limity są zwiększane, tak aby szerokość lub wysokość osiągnęła odpowiedni limit. Nie można tego używać z opcją Przeskaluj. - ^Przeskaluj Jeśli zaznaczony jest jeden z przycisków, pliki wyjściowe są przeskalowywane o wybrany współczynnik. Nie można tego używać z opcją Maks. szerokość i wysokość. - ^Usuń oryginały Jeśli zaznaczone, pliki wejściowe są usuwane, ale tylko po pomyślnym utworzeniu pliku wyjściowego. - ^Kopiuj metadata Wszystkie metadata są kopiowane z pliku wejściowego do wyjściowego. Pomiń tę opcję, aby usunąć metadata. - ^Aktualizuj albumy Jeśli zaznaczone, wszystkie albumy zawierające którykolwiek z plików wejściowych są aktualizowane do przekonwertowanych plików wyjściowych. - ^Zachowanie kolejności plików Jeśli określisz wiodący numer sekwencji ($sss), kolejność wyboru plików wejściowych zostanie zachowana w lokalizacji wyjściowej. W ten sposób możesz wybrać pliki obrazów w żądanej kolejności, lub wybrać z albumu z uporządkowanymi obrazami, i zachować tę kolejność w wyjściu. - - TOPIC: MASOWE KOPIOWANIE/PRZENOSZENIE Skopiuj lub przenieś wybrany plik obrazu do nowej lokalizacji. Wybierz pliki wejściowe ({WYBIERZ PLIKI OBRAZÓW}) z dowolnych folderów znanych Fotocx. Jeśli wybrane jest "Usuń oryginały", pliki wejściowe zostaną usunięte po pomyślnym przeniesieniu ich do nowego folderu. W tym przypadku wszelkie albumy odwołujące się do teraz usuniętych plików wejściowych są aktualizowane o nowe lokalizacje plików. - - TOPIC: MASOWE PROSTOWANIE Ta funkcja prostuje pliki obrazów obrócone lub odbite (lustrzanie). Polega na danych EXIF, aby wiedzieć, czy plik jest obrócony/odbity i w którym kierunku. Jest znacznie szybsza niż Masowa konwersja. Możesz po prostu wybrać wszystkie kandydujące pliki i pozwolić jej znaleźć te, które wymagają poprawki. Szybkość wyszukiwania wynosi około 3000 plików obrazów na minutę na mocnym komputerze. Istnieją dwie opcje określania plików do wyszukania. Przycisk [Wybierz pliki] prowadzi do okna dialogowego wyboru pliku galerii ({WYBIERZ PLIKI OBRAZÓW}). Jeśli zaznaczone jest 'Przeskanuj wszystkie pliki', przeszukane zostaną wszystkie pliki obrazów w twoich folderach głównych. - - TOPIC: MASOWE USUWANIE/KOSZ Wybierz pliki ({WYBIERZ PLIKI OBRAZÓW}). Wybierz opcję: usuń lub przenieś do kosza. [Kontynuuj]. Pliki są wymieniane w wyskakującym raporcie w miarę ich usuwania lub przenoszenia do kosza. Po usunięciu/wyrzuceniu do kosza wszystkich plików albumy są skanowane, a usunięte pliki są z nich usuwane. - - TOPIC: MASOWA NAKŁADKA +image: batch-overlay.png - Mały obraz nakładki może zostać dodany w wybranej pozycji na wybranych obrazach wejściowych. Może to być użyte do dodania linii autorskiej, praw autorskich itd. na wierzchu obrazów. - Przygotuj obraz nakładki w następujący sposób: Użyj Pusty obraz, aby utworzyć obraz bazowy do przechowania tekstu. Skala nie ma znaczenia, więc zrób go większym niż potrzeba. Użyj Maluj przezroczystość, aby pomalować cały obraz bazowy jako przezroczysty. Użyj {OZNACZENIA} > rysuj tekst, aby umieścić żądany tekst na obrazie bazowym, używając czcionki, koloru i innych atrybutów według uznania. Przeskaluj tekst, aby wypełnić większość obrazu bazowego. Obraz bazowy (tło) jest przezroczysty. Usuń nadmiarowe marginesy za pomocą {KADRUJ}, jeśli to potrzebne. Zapisz ostateczny obraz. Wygodną lokalizacją jest /saved_areas, ale można użyć dowolnego folderu. Ten obraz może teraz być użyty jako obraz nakładki dla Masowej nakładki. - Użyj przycisku ^Wybierz pliki obrazów bazowych^, aby wybrać pliki obrazów bazowych, które mają otrzymać obraz nakładki. Użyj przycisku ^Wybierz plik nakładki^, aby wybrać plik obrazu nakładki. - Dwa pola wejściowe ^Pozycja nakładki^ określają, gdzie obraz nakładki jest umieszczony na obrazie bazowym, od 1-99% odległości od góry do dołu, i 1-99% odległości od lewej do prawej. 0/0 oznacza lewy górny róg, 99/99 oznacza prawy dolny róg. Obraz nakładki zostanie umieszczony tak, aby nie wykraczał poza krawędzie obrazu bazowego. - Podaj ^Szerokość nakładki^ jako procent szerokości obrazu bazowego. Wysokość zostanie ustawiona, aby zachować proporcję szerokości/wysokości. Jeśli zaznaczone jest ^Zachowaj stałą szerokość dla rozmiaru okna^, wizualny rozmiar obrazu nakładki będzie stały dla rozmiaru okna podanego poniżej. Bez tego "wysoki" obraz, który wyświetla się z dużymi lewym i prawym marginesem, miałby wizualnie mniejszy obraz nakładki. Początkowy rozmiar okna to bieżące okno. Możesz wprowadzić dowolny rozmiar. Naciśnij ^odśwież^, aby ustawić bieżące okno, jeśli się zmieniło. - Jeśli wybrane jest ^Zastąp pliki bazowe^, pliki bazowe wejściowe są zastępowane wyjściowymi plikami bazowymi z nałożoną nakładką. Jeśli wybrane jest ^Utwórz nowe wersje^, tworzone są nowe wersje plików bazowych wejściowych. - - TOPIC: MASOWE KEYWORDS +image: batch-keywords.jpg - Dodaj, usuń lub zmień keywords dla dużej liczby plików obrazów naraz. - Użyj przycisku [select files], aby wybrać pliki obrazów ({WYBIERZ PLIKI OBRAZÓW}). - Okno dialogowe pokazuje dwie listy keywords: te do dodania do wybranych plików, i te do usunięcia. Dostępne keywords są pokazywane w oknie Zdefiniowane keywords poniżej. Jeden z nich można dodać do aktualnie wybranej listy keywords (dodaj lub usuń), klikając go. Keyword można usunąć z dowolnej listy keywords, klikając go. Aby zastąpić keywords, podaj nowe keywords na liście dodawania keywords, a stare keywords na liście usuwania keywords. - Jeśli lista zdefiniowanych keywords jest długa, może być łatwiej wpisać żądany keyword w Wprowadź nowy keyword. Istniejące keywords pasujące do tego, co wpisałeś dotychczas, pojawią się w Pasujące keywords, i możesz wskazać i kliknąć jeden z nich, aby dodać keyword do obrazu. Jeśli wprowadzony keyword jest nowy (nie jest pokazywany żaden pasujący keyword), naciśnij [Dodaj], gdy keyword jest kompletny. Zostanie dodany do wybranej listy keywords i do listy zdefiniowanych keywords pod kategorią "nocatg". - Jeśli używasz kategorii keywords, możesz wybrać kategorię, a wtedy tylko te keywords będą pokazane na liście zdefiniowanych keywords. Jeśli twoja lista keywords jest ogromna, może to zredukować listę do rozmiaru wygodnego do wskazywania i klikania. - Aby uzyskać listę obrazów mających określone keywords, które chcesz usunąć lub zastąpić, użyj {WYSZUKAJ OBRAZY}, aby znaleźć obrazy, a następnie uruchom tę funkcję i użyj [select files], aby dodać wszystkie właśnie znalezione pliki obrazów, lub wybierz dowolny podzbiór. - - TOPIC: MASOWA ZMIANA NAZW KEYWORDS +image: batch-rename-keywords.png - Zmień nazwę dowolnej liczby keywords i zastosuj te zmiany do całej swojej kolekcji obrazów. Kliknij keyword do zmiany nazwy z listy zdefiniowanych keywords, wprowadź nową nazwę w polu Zmień nazwę na, a następnie kliknij przycisk strzałki, aby dodać tę parę nazw do listy po prawej stronie. Powtórz dla każdego keyword do zmiany nazwy. Kliknij parę nazw na liście, aby je usunąć. Naciśnij [Kontynuuj], gdy skończysz. Jeśli chcesz usunąć keyword bez zmiany jego nazwy, użyj 'delete' jako nowej nazwy. - Wyskakujące okno pokazuje liczbę plików obrazów zawierających zmienione nazwy keywords. Naciśnij [Tak], aby kontynuować. Tempo aktualizacji wynosi około 500/minutę na mocnym komputerze. Przy następnym uruchomieniu Fotocx funkcja pliku indeksu zaktualizuje wszystkie thumbnails dla tych samych obrazów, ponieważ data modyfikacji pliku się zmieniła. - - TOPIC: MASOWE USUWANIE KEYWORDS +image: batch-purge-keywords.jpg - Usuń niechciane keywords ze wszystkich plików obrazów. Jest to szczególnie przydatne, aby pozbyć się niechcianych keywords, które zostały dodane z pobranych plików obrazów. Kliknij niechciane keywords po lewej stronie okna dialogowego, aby dodać je do listy usuwania po prawej stronie okna dialogowego. Naciśnij [proceed], gdy skończysz. - - TOPIC: MASOWA DATA ZDJĘCIA +image: batch-photo-date1.png +image: batch-photo-date2.png - Szybko napraw partię zdjęć, które nie mają daty/czasu zdjęcia lub mają nieprawidłową. Użyj przycisku [select files], aby otworzyć okno galerii, w którym możesz wybrać pliki obrazów do przetworzenia ({WYBIERZ PLIKI OBRAZÓW}). - Istnieją dwa sposoby zmiany dat/czasów zdjęć: • Ustaw nową datę/czas (prawy obraz powyżej): Wprowadź tylko nowy rok (yyyy) - w plikach zastępowany jest tylko rok. Wprowadź tylko datę (yyyy:mm:dd) - data jest zastępowana, ale nie czas. Wprowadź pełną datę/czas (yyyy:mm:dd hh:mm:ss) - oba są zastępowane. • Przesuń istniejącą datę/czas (lewy obraz): Wprowadź wartości + lub - do dowolnego z 6 pól: lata, miesiące, dni, godziny, minuty, sekundy. Daty/czasy zostaną przesunięte o wprowadzone wartości. - Przesunięte wartości daty/czasu przechodzą na kolejną wyższą wartość, gdy to konieczne: Czas 08:30 przesunięty o -50 minut daje 07:40 Data 2016-10-20 przesunięta o +6 miesięcy i -30 dni daje 2017-03-21 (Marzec ma 31 dni). - Jeśli zaznaczone jest pole wyboru 'test', tworzony jest raport starych i nowych dat/czasów dla wybranych plików do sprawdzenia. Nie są wprowadzane żadne zmiany w plikach. Jeśli jesteś zadowolony, że wyniki są poprawne, usuń zaznaczenie pola wyboru i uruchom ponownie, aby zaktualizować pliki. - - TOPIC: MASOWA ZMIANA META +image: batch-change-meta.png - Popraw metadata dla wielu plików obrazów. Możesz dodawać nowe metadata, poprawiać istniejące metadata i usuwać metadata. Użyj przycisku [select files], aby otworzyć okno galerii, z którego wybierasz pliki do przetworzenia {WYBIERZ PLIKI OBRAZÓW}. Wprowadź nazwy tags metadata i wartości do przypisania, lub pozostaw wartość pustą, aby usunąć tag. Naciśnij [zastosuj]. Otrzymasz komunikat potwierdzający i możesz w tym momencie kontynuować lub anulować. Lista popularnie używanych nazw tags jest podana po lewej stronie. Kliknij jedną z nich, aby wstawić ją do pierwszego pustego pola nazwy tag w oknie dialogowym. Ta lista pochodzi z pliku /metadata_picklist, który możesz edytować, aby dodać inne tags do listy. Przycisk [Pełna lista] dostarcza informacji o tym, jak uzyskać listę wszystkich dostępnych nazw tags. - - TOPIC: MASOWY RAPORT META +image: add-meta-tags.png +image: batch-report-meta.png - Zgłoś dowolne metadata dla dowolnej liczby obrazów. Wynikiem jest plik tekstowy, który jest wyświetlany w domyślnym edytorze tekstu dla twojego systemu. Możesz użyć funkcji wyszukiwania edytora tekstu, aby znaleźć obrazy pasujące do żądanych metadata, lub możesz użyć pliku tekstowego jako danych wejściowych do innych programów. Użyj przycisku [select files], aby otworzyć okno galerii do wyboru plików do przetworzenia ({WYBIERZ PLIKI OBRAZÓW}). Przycisk [edytuj] otwiera nowe okno dialogowe (po prawej), w którym możesz wybrać tags metadata do zgłoszenia. Kliknij tag w lewej kolumnie, aby dodać go do prawej kolumny i do raportu. Kliknij tag w prawej kolumnie, aby go usunąć. Kliknij ostatni tag w lewej kolumnie, "Inny tag ...", aby wpisać dowolną nazwę tag nieznajdującą się na liście, która zawiera tylko najbardziej prawdopodobnie potrzebne tags. - - TOPIC: MASOWE GEOTAGS +image: batch-geotags.png - Wybierz wiele obrazów i dodaj te same dane lokalizacji do wszystkich z nich. Użyj przycisku [select files], aby wybrać pliki obrazów z okna galerii ({WYBIERZ PLIKI OBRAZÓW}). Następnie uzyskaj dane lokalizacji, jak opisano w {EDYTUJ META GŁÓWNE}, używając przycisku [Znajdź] lub klikając znacznik mapy. Użyj tej funkcji również, aby naprawić niespójności w pisowni lokalizacji lub danych latitude/longitude. Jeśli lokalizacja i/lub kraj pozostaną puste, nie są aktualizowane. Aby usunąć lokalizację lub kraj, wprowadź nazwę "null". Jeśli latitude i longitude pozostaną puste, nie są aktualizowane. Aby usunąć latitude i longitude, wprowadź "0" dla obu wartości. Możesz aktualizować tylko lokalizację/kraj, tylko latitude/longitude, lub oba. W praktyce możesz zauważyć, że GPS aparatu wstawia latitude i longitude bez lokalizacji i kraju, lub używa niechcianego języka, lub wszystkich wielkich liter, lub jakiejś innej wartości wymagającej naprawy. - - TOPIC: EKSPORTUJ PLIKI Skopiuj wybrane pliki obrazów do innego folderu. Zamierzone zastosowanie to kopiowanie plików do udostępnienia innym, np. przesyłanie plików na stronę www. Pliki wyjściowe to JPEG. Możesz opcjonalnie zmniejszyć obrazy. Wybierz pliki obrazów, klikając thumbnails galerii ({WYBIERZ PLIKI OBRAZÓW}). Wybierz folder, do którego zostaną skopiowane pliki obrazów. Jeśli wybrane jest 'eksportuj metadata', kopiowany jest również ograniczony zestaw metadata. Są to: data zdjęcia, keywords, prawa autorskie, tytuł, opis. - - TOPIC: MENU NARZĘDZI - - TOPIC: INDEKSUJ PLIKI +image: index-files1.png - Fotocx musi znać wszystkie nazwy folderów i plików twoich obrazów oraz osadzone metadata (daty, tags, geotags, tytuły, opisy, oceny). Te dane są indeksowane dla szybkiego wyszukiwania. Fotocx tworzy również obrazy thumbnail, aby okna galerii (strony thumbnails) wyświetlały się szybko. Fotocx nie modyfikuje ani nie kopiuje twoich plików obrazów. Wymagana przestrzeń to zazwyczaj 2% przestrzeni twoich plików obrazów. - Funkcja Indeksuj pliki działa za każdym razem, gdy Fotocx jest uruchamiany. Ta funkcja utworzy brakujące thumbnails, zastąpi nieaktualne i odświeży indeks metadata, używając bieżących danych z twoich plików obrazów. Może to wymagać znacznego czasu, jeśli masz wiele tysięcy nowych plików. - Pliki obrazów zmodyfikowane lub przeniesione w obrębie Fotocx są obsługiwane automatycznie. Funkcja Indeksuj jest używana tylko dla nowych plików obrazów utworzonych spoza Fotocx (np. dodano nową partię zdjęć), oraz dla plików zmodyfikowanych lub przeniesionych spoza Fotocx. - Wprowadź swoje główne foldery obrazów (np. /home//Pictures). Użyj przycisku [przeglądaj], aby zlokalizować i dodać foldery. Te foldery i wszelkie zawarte w nich podfoldery zostaną przetworzone. Nie ma znaczenia, czy inne pliki są zmieszane z obrazami. Usuń wpis, klikając odpowiadające 'X'. - Wprowadź folder thumbnails, w którym będą przechowywane pliki thumbnail. Użyj dostarczonej wartości domyślnej lub ustaw własną lokalizację. - Jeśli używałeś nazw folderów lub plików do klasyfikacji swoich obrazów, możesz natychmiast wykorzystać je w funkcji {WYSZUKAJ OBRAZY}. Jeśli zapisałeś daty, keywords, geotags, tytuły lub oceny w metadata swoich obrazów, będą one również przeszukiwalne. Po zindeksowaniu obrazów wyszukiwanie według dowolnego z nich jest niemal natychmiastowe. - ^Tags metadata Domyślnie w indeksie obrazów uwzględniane są następujące metadata: • nazwy folderów i plików • data/czas zdjęcia • data/czas modyfikacji pliku • tytuł i opis (metadata exif) • ocena (0-5 gwiazdek) • keywords (etykiety użytkownika) • geotags (nazwy kraju i lokalizacji oraz latitude/longitude) • aparat: marka, model, obiektyw • ekspozycja: czas, liczba f, ogniskowa, ISO - ^Dodatkowe tags metadata +image: index-files2.png - Możesz dodać do 20 innych tags metadata do indeksu plików obrazów. Metadata na tej liście mogą być przeszukiwane tak szybko jak standardowe tags. Możesz tego nie potrzebować, ale jeśli czasami musisz przeszukiwać niestandardowe tags metadata, możesz je dodać tutaj, a szybkość wyszukiwania będzie niemal natychmiastowa. Naciśnij przycisk [select] dla "extra metadata", aby uzyskać powyższe okno dialogowe. Kliknij tags na lewej liście, aby dodać je do prawej listy - tags do dodania do indeksu. Kliknij tag na prawej liście, aby go usunąć. Naciśnij [done], aby zatwierdzić zmiany. Cała twoja kolekcja obrazów zostanie ponownie zindeksowana. Odbędzie się to szybciej niż początkowe indeksowanie, ponieważ thumbnails nie są ponownie tworzone. - ^Dostęp do niezindeksowanych plików i folderów Niezindeksowany plik obrazu lub folder to taki, który nie jest uwzględniony w twoich zadeklarowanych głównych folderach obrazów (podfoldery twoich zadeklarowanych folderów obrazów są zawsze uwzględniane). Możesz przejść do takiego folderu i normalnie wyświetlać thumbnails, oraz normalnie wyświetlać i edytować takie pliki. Istnieją ograniczenia, które powinieneś zrozumieć: • Tych plików będzie brakować w wynikach wyszukiwania i widokach mapy. • Thumbnails są tworzone w momencie wyświetlania - galerie będą wolne. Jeśli uzyskujesz dostęp do przenośnego (wolnego) urządzenia pamięci masowej (np. karty SD aparatu), zauważysz opieszałą wydajność. Thumbnails będą tworzone w miarę potrzeb i pozostaną po odłączeniu urządzenia. Sugestia: skopiuj pliki do zadeklarowanego folderu Fotocx, a następnie wykonaj z tej lokalizacji dowolne potrzebne przetwarzanie. Wydajność będzie znacznie lepsza. - ^Pamięć wymienna (dysk USB) Jeśli twoje główne foldery obrazów obejmują foldery na dysku wymiennym, a uruchamiasz Fotocx bez zamontowanego dysku, dane indeksu i thumbnails są nadal zachowane, mimo że pliki wymienne zniknęły. Gdy dysk wymienny zostanie ponownie zamontowany, a Fotocx uruchomiony, przywracany jest ostatni stan. Jeśli w międzyczasie jakiekolwiek pliki zostały dodane lub zmodyfikowane, dane indeksu i thumbnails są aktualizowane. - - TOPIC: PRZENIEŚ FOLDER DOMOWY FOTOCX Folder domowy Fotocx zawiera wszystkie ustawienia i dane użytkownika, w tym niektóre pliki z pakietu Fotocx, które mogą być dostosowane przez użytkownika. Lokalizacja domyślna: /home//.fotocx. Jeśli zainstalowanych jest wiele wersji lub wydań Linuksa, może być pożądane posiadanie jednego wspólnego folderu domowego Fotocx zamiast jednego dla każdego wydania. To samo może dotyczyć sytuacji, gdy wielu użytkowników potrzebuje dostępu do tej samej instancji Fotocx. - Użyj tej funkcji, aby przenieść folder domowy Fotocx gdzie indziej. Wybrany folder powinien zawierać "fotocx" w nazwie ścieżki, w przeciwnym razie zostanie dołączone "/fotocx". - Zobacz parametr -home w {PARAMETRY POLECENIA}, jeśli chcesz mieć wiele kolekcji obrazów Fotocx, zarządzanych osobno. - - TOPIC: USTAWIENIA +image: settings.jpg - Różne preferencje i ustawienia użytkownika są zbierane i zapisywane w pliku /parameters. Większość zmian jest wprowadzana natychmiast. Niektóre spowodują ponowne uruchomienie Fotocx. - • Wybierz żądany 2-znakowy kod języka. Fotocx uruchomi się ponownie w wybranym języku. • Widok startowy - początkowy widok przy uruchomieniu Fotocx. Ostatnie pliki: ostatnio przeglądane pliki obrazów Najnowsze pliki: pliki ostatnio dodane/zmodyfikowane Konkretna galeria: podana galeria folderu Galeria albumu: podana galeria albumu Poprzednia galeria: galeria ostatnio używana w poprzedniej sesji Poprzedni plik: plik ostatnio przeglądany w poprzedniej sesji Konkretny plik: podany plik obrazu Przycisk przeglądaj: wybierz folder, album lub plik obrazu • Tło - kolory tła dla okien Widok pliku i Widok galerii • Styl menu - styl wyświetlania menu: ikony, tekst lub oba • Kolory menu - kolor tekstu menu i kolor tła • Czcionka okna dialogowego - czcionka dla menu i okien dialogowych • Pokaż ukryte - jeśli zaznaczone, pokaż ukryte pliki i foldery • Szybkość zoom - Wybierz 1-8 kliknięć lub klawiszy [+] na 2x powiększenie obrazu • Pliki JPEG - poziom jakości, domyślnie 90, użyj 70+ dla dobrej jakości • Węzeł krzywej - minimalny odstęp węzłów dla krzywych edycji, % skali. Wartość domyślna to 5% skali. Użyj wyższej wartości dla touchpadów. • Pozycja obrazu - obraz jest po lewej/na środku/po prawej w szerszym oknie • Potwierdź wyjście - opcja wyskakującego okna dialogowego: czy naprawdę chcesz zamknąć? • Poziom indeksowania - zobacz poniżej • Loader RAW - zobacz poniżej • Opcje RAW - zobacz poniżej • Pliki RAW - lista używanych typów plików RAW • Pliki wideo - lista używanych typów plików wideo • Aplikacja wideo - zobacz poniżej - ^Jakość pliku i kompresja Poziom jakości pliku JPEG: użyj 70 lub wyżej dla dobrej jakości obrazu (domyślnie 90). Metoda kompresji pliku TIFF to DEFLATE (najlepsza dla kolorowych obrazów). Poziom kompresji pliku PNG to '1'. Wyższe wartości wydają się jedynie wydłużać czas zapisu pliku (libpng). - ^Pozycja obrazu Jeśli okno jest szersze niż obraz (tj. proporcja szerokości/wysokości okna > obrazu), obraz może być przesunięty w lewą stronę, wyśrodkowany lub w prawą stronę. Jeśli lewo lub prawo, niewykorzystany margines jest maksymalizowany, co może być wygodniejsze do pozycjonowania okien dialogowych. - ^Poziom indeksu obrazu Te dwa parametry regulują kompromis między czasem uruchomienia a kompletnością indeksu obrazów. • $ fotocx: Ma zastosowanie, gdy fotocx jest uruchamiany za pomocą polecenia powłoki, menu systemowego lub ikony/launchera systemowego. Zalecana wartość '2' oznacza pełne indeksowanie: wczytaj stary plik indeksu, szukaj nowych plików (jeszcze niezindeksowanych) i zaktualizuj plik indeksu fotocx. • $ fotocx : Ma zastosowanie, gdy fotocx jest uruchamiany przez kliknięcie nazwy pliku na liście menedżera plików. Zalecana wartość '1' oznacza wczytanie starego pliku indeksu, ale bez szukania nowych plików do aktualizacji indeksu. Uruchomienie jest umiarkowanie szybkie. Funkcje wyszukiwania obrazów i mapy działają normalnie, ale wszelkie nowe (jeszcze niezindeksowane) pliki obrazów nie są uwzględnione. • Alternatywa: '0' oznacza brak indeksowania. Uruchomienie jest bardzo szybkie. Późniejsze użycie funkcji wyszukiwania obrazów lub mapy uruchomi funkcję indeksu plików tylko dla starych plików (bez wyszukiwania nowych/zmodyfikowanych plików). Użyj tej opcji, jeśli twoja kolekcja obrazów jest gigantyczna, a czas uruchomienia przekracza kilka sekund. Możesz uruchomić funkcję indeksowania później, jeśli to potrzebne. - ^Loader RAW Loader RAW to polecenie używane do odczytu pliku RAW i konwersji go na TIFF z 16-bitową głębią koloru. Jest używane, gdy przeglądany jest plik RAW. Możesz użyć funkcji edycji Fotocx, aby edytować i optymalizować plik. Domyślnym loaderem RAW jest dcraw używający przestrzeni kolorów sRGB. Kilka innych opcji używających dcraw lub rawtherapee jest dostarczonych na liście wyboru. Te polecenia są przechowywane w pliku 'raw_commands_*' w folderze domowym Fotocx. Edytuj ten plik, aby zmienić lub dodać nowe opcje (zobacz poniżej). Możesz chcieć przygotować wiele poleceń dla wielu aparatów lub wielu opcji przetwarzania. Jeśli wolisz interaktywnie korzystać z edytora RAW, utwórz dla tego polecenie wtyczki - zobacz {WTYCZKI}. - ^Opcje RAW • edytuj polecenia: naciśnij przycisk, aby edytować listę poleceń loadera RAW. Edytor tekstu uruchomi się w nowym oknie, z bieżącą listą poleceń. • dopasuj kolor osadzonego obrazu: użyj osadzonego obrazu pliku RAW jako przewodnika do zmapowania kolorów obrazu RAW na przekonwertowany obraz TIFF. Jest to interpretacja danych RAW producenta aparatu - dobre miejsce na start, jeśli plik RAW wymaga dalszej edycji. Osadzony obraz jest zwykle taki sam jak plik JPEG z aparatu. - ^Aplikacja wideo Wprowadź polecenie powłoki, aby uruchomić aplikację odtwarzania wideo. Użyj '%s', aby oznaczyć, gdzie nazwa pliku wideo jest wstawiana w wierszu poleceń. Oto kilka przykładów: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: SKRÓTY KLAWISZOWE +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - Wyświetl lub zmień niestandardowe skróty klawiszowe. Obecnie przypisane skróty są pokazane w pierwszym oknie. Jeśli naciśniesz przycisk [Edytuj], pokazane zostanie drugie okno dialogowe, w którym możesz dodawać i zmieniać skróty klawiszowe. Wprowadź nowy skrót za pomocą klawiatury. Możesz używać klawiszy A-Z, 0-9, F2-F9 i większości symboli (% $ & * < itd.). Możesz łączyć klawisz z jednym z Ctrl/Alt/Shift: Naciśnij i przytrzymaj JEDEN z Ctrl/Alt/Shift, następnie naciśnij klawisz, następnie zwolnij oba. Wybierz jedno z dostępnych przypisań menu z listy po prawej, następnie naciśnij [Dodaj] i [OK]. Usuń skrót, wybierając go i naciskając [Usuń]. - - TOPIC: HISTOGRAM RGB +image: RGB-hist.png - Małe okno pokazuje wykres histogramu jasności bieżącego obrazu w Widoku pliku, lub aktualnie wybranego obszaru obrazu. Ten wykres aktualizuje się synchronicznie w miarę zmiany obrazu przez funkcje edycji. Użyj przycisków [Wszystko] [Czerwony] [Zielony] [Niebieski], aby wybrać kolory do pokazania. - - TOPIC: POWIĘKSZ OBRAZ +image: magnify-image.jpg - Powiększ obraz w obszarze wokół wskaźnika myszy. Przeciągnij myszą lewym przyciskiem po obrazie, aby powiększyć różne obszary, analogicznie do oglądania wydrukowanego obrazu przez lupę. Użyj okna dialogowego, aby dostosować promień obszaru i wielkość powiększenia. - - TOPIC: MIERZ OBRAZ Kliknij dowolne dwie pozycje w obrębie obrazu, aby zmierzyć odległość pikselową między punktami. Kliknięte pozycje są oznaczone A i B na obrazie. Te etykiety zawsze pokazują ostatnie dwa kliknięte punkty. Okno dialogowe jest aktualizowane odległościami dzielącymi te dwa punkty: Odległość X (odległość pozioma) Odległość Y (odległość pionowa) Odległość H (odległość całkowita) - - TOPIC: POKAŻ RGB +image: show-RGB.png - Gdy klikany jest punkt na obrazie, wartości RGB są pokazywane w oknie dialogowym. Wyświetlanych jest ostatnich 9 klikniętych punktów. Wartości mają format xxx.dd, gdzie xxx to górne 8 bitów wartości koloru, a .dd to dolne 8 bitów. Zakres wynosi od 0.00 do 255.99. Dolne 8 bitów wynosi zero, chyba że obraz jest edytowany lub ma ponad 8 bitów głębi koloru. Wyjścia są aktualizowane w czasie rzeczywistym, jeśli obraz jest edytowany. Jeśli zaznaczone jest "labels", punkty są oznaczane na obrazie literami odpowiadającymi literom w oknie dialogowym. Jeśli zaznaczone jest "delta" i obraz jest edytowany, wtedy pokazywane są zmiany RGB zamiast wartości bezwzględnych. - Jeśli otworzysz inny obraz (np. aby porównać z poprzednim obrazem), pozycje są zachowane i aktualizowane, jeśli mieszczą się w granicach nowego obrazu. Ułatwia to porównywanie obrazów na poziomie wartości RGB pikseli. - - TOPIC: USTAWIENIA SIATKI +image: grid-settings.jpg - Istnieją dwie funkcje linii siatki: Ustawienia siatki ustawia wszystkie parametry siatki. Przełącz siatkę włącza lub wyłącza linie siatki. Linie siatki to poziome i pionowe linie w regularnych odstępach na obrazie. Te linie mogą być przydatnymi prowadnicami wyrównania, gdy obraz jest wyginany lub wypaczany, aby wyprostować ściany lub inne obiekty na obrazie. Użyj pól wejściowych liczba-x i liczba-y, aby ustawić odpowiednio liczbę linii pionowych i poziomych. Kontrolki przesunięcia-x i przesunięcia-y mogą być użyte do przesunięcia linii siatki, aby przecinały żądaną pozycję na obrazie. Skrót klawiszowy (domyślnie shift+G) można przypisać do Przełącz siatkę, więc linie siatki można włączyć lub wyłączyć jednym naciśnięciem klawisza. - - TOPIC: KOLOR LINII Niektóre funkcje rysują linie na obrazie (Kadruj, Wybierz obszar, inne). Możesz zmienić kolor tych linii, aby zmaksymalizować kontrast względem obrazu tła. Małe okno dialogowe można pozostawić otwarte podczas edycji, aby wygodnie przełączać się między dostępnymi kolorami (czarny, biały, czerwony, zielony). - - TOPIC: CIEMNE/JASNE PIKSELE Podświetl najciemniejsze i najjaśniejsze piksele na obrazie. Dostosuj dwie kontrolki liczbowe, aby ustawić progi jasności, które początkowo wynoszą 0 dla ciemnych pikseli i 255 dla jasnych pikseli. Piksele o jasności mniejszej niż próg ciemności lub większej niż próg jasności są "migane", aby je wyróżnić. Użyj tej funkcji, aby wykryć obcięcie po edycji jasności lub koloru. - - TOPIC: KOLOR MONITORA +image: moncolor-small.png - Osiem pasów koloru jest wypisywanych na ekranie z jasnością od zera (czerń) do 100%. Możesz to użyć do dostosowania jasności i kontrastu twojego monitora. Na żadnym końcu pasów nie powinno być niezmieniających się obszarów. - - TOPIC: ZNAJDŹ DUPLIKATY +image: find-dups.png - Znajdź zduplikowane pliki obrazów gdziekolwiek w twojej bazie obrazów. Zduplikowany plik może być plikiem, który dokładnie lub "niemal" duplikuje inny plik. Dla szybkości obrazy thumbnail są porównywane w pamięci. Możliwe jest, że pasujące thumbnails zostaną znalezione dla głównych obrazów mających niewielkie różnice nieodzwierciedlone w thumbnails. Kopia obrazu, która została zmniejszona, jest prawdopodobnie klasyfikowana jako duplikat. Rozmiar thumbnail można ustawić od 32 do 512 pikseli. Większy rozmiar redukuje prawdopodobieństwo fałszywych trafień. Rozmiar thumbnail znacznie wpływa na ilość wymaganej pamięci głównej - np. dla 100 tys. obrazów rozmiar 64 wymaga około 880 MB, podczas gdy rozmiar 256 wymaga około 14 GB. Naciśnij przycisk [calculate], aby obliczyć największy rozmiar thumbnail, który zmieści się w dostępnej wolnej pamięci. - Dwa parametry są używane do ustawienia czułości wykrywania identycznych lub niemal identycznych obrazów: różnica pikseli to różnica wartości RGB, poniżej której piksele są uznawane za równe. Liczba pikseli to liczba różnych pikseli, poniżej której dwa obrazy są klasyfikowane jako duplikaty. Przykład: jeśli różnica pikseli = 2, a liczba pikseli = 10, wtedy obrazy są klasyfikowane jako duplikaty, jeśli mniej niż 10 pikseli różni się o 2 lub mniej. - Wynikiem jest galeria pokazująca każdy zestaw zduplikowanych obrazów. Galeria wyjściowa jest zapisywana jako album "Duplicate Images". Możesz użyć Masowego usuwania/kosza razem z tym albumem, aby wybrać, które duplikaty usunąć. - - TOPIC: ZNAJDŹ USZKODZONE PLIKI Wszystkie pliki obrazów w twoich zadeklarowanych folderach głównych są odczytywane. Dla każdego pliku, którego nie można odczytać, masz trzy opcje: • usuń plik • napraw nieprawidłowy typ pliku (zobacz poniżej) • przenieś plik gdzieś poza twoje główne foldery obrazów Często widziałem pliki .png z rozszerzeniem .jpg. Przeglądarki internetowe i niektóre inne aplikacje radzą sobie z tym po cichu. Tutaj poprawny typ pliku jest zgłaszany, i możesz zmienić rozszerzenie na poprawne. - - TOPIC: POKAŻ ZASOBY Zgłoś zasoby komputera używane przez Fotocx: • Czas CPU: użycie od uruchomienia Fotocx lub od ostatniej próbki • Pamięć rzeczywista: pamięć rzeczywista obecnie używana (z wyłączeniem swap) • Pamięć podręczna map: MB przestrzeni dyskowej używanej dla buforowanych kafelków mapy • Wyczyść pamięć podręczną: usuń wszystkie buforowane kafelki mapy • przycisk [Sample]: pobierz nową próbkę i zgłoś dane - Przycisk [Sample] resetuje czas CPU. Następna próbka pokaże tylko nowo zakumulowany czas CPU. Czas CPU to suma dla wszystkich wątków procesu. - - TOPIC: TŁUMACZENIA Tłumaczenia dla kilku języków są dołączone do pakietu Fotocx. Te tłumaczenia AI nie są idealne. Błędy tłumaczenia można poprawić, edytując pliki tłumaczeń. - ^Zmiana języka GUI Menu {USTAWIENIA} może być użyte do zmiany języka. Język można również ustawić przy uruchamianiu Fotocx: $ fotocx -lang xx # język xx (de fr zh itd.) $ fotocx -lang en # angielski - ^Modyfikuj tłumaczenie GUI Edytuj plik /translations/gui_xx Pary wierszy tekstu mają wiodące 4-cyfrowe numery, które muszą się zgadzać. Pierwszy wiersz to angielski, 2. wiersz to język xx. Modyfikuj tylko wiersz xx, nigdy wiersz angielski. Znaki specjalne do wstawiania parametrów do tekstu muszą pozostać w tej samej kolejności. Są to '%d' (parametr liczby całkowitej), '%f' (dziesiętny), '%s' (tekst). - ^Modyfikuj tłumaczenie podręcznika użytkownika Edytuj plik /translations/ug_xx Edytuj ug_xx, aby naprawić tłumaczenie. Nie dodawaj ani nie usuwaj żadnych wierszy tekstu ani nie zmieniaj kolejności. Wiersze tekstu muszą odpowiadać 1:1 angielskiemu podręcznikowi użytkownika, ug_en. - Wyślij poprawione pliki do uwzględnienia w następnym wydaniu Fotocx: mkornelix@gmail.com - - TOPIC: MENU POMOCY • Podręcznik użytkownika - Pokaż spis treści • Samouczek wideo - Pokaż samouczek wideo Fotocx na YouTube • Programy zewnętrzne - Wymień programy zewnętrzne i ich funkcje • Pokaż plik dziennika - Wyświetl zarejestrowane informacje i komunikaty błędów • Parametry polecenia - Pokaż dostępne parametry wiersza poleceń • Dziennik zmian - Pokaż dodatki i poprawki błędów w ostatnich wydaniach • Prawa autorskie - Pokaż prawa autorskie i licencje odnoszące się do Fotocx • Prywatność - Pokaż politykę prywatności (zasady) dla Fotocx • O programie - Pokaż numer wydania, lokalizację pliku wykonywalnego, kontakt • Strona domowa - Pokaż stronę domową Fotocx na kornelix.net • Odinstaluj - Jak odinstalować Fotocx - - TOPIC: INNE TEMATY Poniższe tematy nie są związane z menu Fotocx. - - TOPIC: VIDEO FILES Pliki wideo (.mpeg, .mp4 itd.) mogą być zmieszane z twoimi plikami obrazów. Będą pokazywane jako pliki obrazów zarówno w Widoku pliku, jak i Widoku galerii. Klawisz 'P' rozpocznie, wstrzyma i wznowi wideo, lub odtworzy ponownie wideo, które się zakończyło. Klawisz 'Q' zakończy wideo. Użyj menu {USTAWIENIA}, aby wybrać aplikację do odtwarzania plików wideo. - - TOPIC: SLAJDY I NEGATYWY +image: color-negative.jpg - Możesz użyć aparatu z możliwością robienia zbliżeń, aby przechwycić slajdy lub negatywy filmowe. Użyj podświetlacza do oświetlenia, lub użyj nieba (przykład powyżej). Aby przetworzyć negatyw koloru, najpierw zrób pozytyw - zobacz {TRYB KOLORU}. Jeśli obraz jest zamglony, wybierz tylko obszar obrazu, wykluczając krawędzie filmu, a następnie użyj {RETINEX GLOBALNY}, aby wyeliminować mgłę. Ustaw punkty bieli i czerni, klikając obraz, jeśli to potrzebne, aby dodatkowo zredukować mgłę. - - TOPIC: OGRANICZENIA FOTOCX • Istnieje twardy limit miliona plików. • wersje obrazu - do 99 wersji dla cofania/ponawiania i nazewnictwa wersji. • keywords obrazu - łącznie 10 tys. keywords. 1000 znaków na pojedynczy obraz. • Galerie są ograniczone do 40 tys. plików obrazów. • maks. wymiary obrazu to 40 tys. x 20 tys. pikseli. - - TOPIC: FOTOCX DLA WINDOWS 11 Fotocx można używać w Windows 11, instalując Windows Subsystem for Linux 2, czyli WSL2. W internecie jest obszerna dokumentacja o tym, jak to zrobić. - Jeśli twoje pliki obrazów znajdują się w systemie plików Windows (NTFS), Fotocx będzie bardzo wolny. Dlatego przenieś swoje pliki obrazów do systemu plików Linux. Nadal będziesz mógł uzyskiwać do nich dostęp za pomocą Eksploratora plików Windows i innych aplikacji Windows, więc nic nie zostanie utracone. Microsoft również zaleca system plików Linux dla lepszej wydajności. Użyj ikony 'Linux' w Eksploratorze plików, aby uzyskać dostęp do swojego folderu domowego w systemie plików Linux. Dodaj folder Pictures, jeśli to potrzebne, i przenieś tam swoje pliki obrazów. - Jeśli dostępny jest pakiet Fotocx, zainstaluj go. W przeciwnym razie wykonaj następujące czynności: Pobierz plik pakietu binarnego Fotocx z ^https://kornelix.net. W terminalu Linux: $ cd /mnt/c/Users//Downloads # przejdź do folderu pobranych Windows $ tar -xzf fotocx-xxx-bin.tar.gz # rozpakuj pakiet do folderu fotocx $ cd fotocx # przejdź do folderu fotocx $ chmod u+x install.sh # nadaj skryptowi instalacyjnemu prawa wykonywania $ ./install.sh # uruchom skrypt, zainstaluj fotocx $ fotocx # uruchom Fotocx Może być konieczne ponowne uruchomienie okna Linux, aby ostatni krok zadziałał. - Przeczytaj wprowadzające części tego podręcznika użytkownika. Fotocx ma rozbudowaną funkcjonalność. Nie oczekuj opanowania Fotocx w kilka minut. - - TOPIC: PRYWATNOŚĆ Fotocx nie przechowuje żadnych danych użytkownika oprócz plików obrazów i ich metadata. Metadata powinny zostać usunięte z plików obrazów przed przesłaniem do internetu, a Fotocx zapewnia prostą metodę, aby to zrobić. - - TOPIC: PROBLEM, QUESTION, SUGGESTION Wyślij e-mail na mkornelix@gmail.com. Jeśli jest zrzut awaryjny (plik zappcrash), wyślij go również. - fotocx/data/translations/$ language codes0000644000175000017500000000024615247006657017360 0ustar micomicode German el Greek en English es Spanish fi Finnish fr French hu Hungarian it Italian ja Japanese ko Korean po Polish pt Portuguese ru Russian tr Turkish zh Chinese fotocx/data/translations/gui_ru0000664000175000017500000052704515247006657015722 0ustar micomico0000 + Zoom-in \n 0000 + Увеличить \n 0001 - Zoom-out \n 0001 - Уменьшить \n 0002 = Zoom-in \n 0002 = Увеличить \n 0003 Arrow keys Previous/Next file \n 0003 Стрелки Предыдущий/следующий файл \n 0004 Delete Delete/Trash file \n 0004 Delete Удалить/в корзину файл \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Escape Закрыть диалог / выйти из Fotocx \n 0006 F1 User Guide, Context Help \n 0006 F1 Руководство пользователя, контекстная справка \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 Полный экран / без меню \n 0008 Home/End Gallery start/end \n 0008 Home/End Начало/конец галереи \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 Время индексирования зависит от количества, типа и размера \n ваших файлов изображений и скорости вашего компьютера. Оно \n может составлять от нескольких сотен до более 10 тысяч в минуту. \n Позже вы можете изменить параметры индексирования через меню: \n Инструменты > Индексация, Инструменты > Настройки. \n 0010 Page keys Gallery page up/down \n 0010 Page Up/Down Страница галереи вверх/вниз \n 0011 Z 1x <--> fit to window \n 0011 Z 1x <--> по размеру окна \n 0012 $s plugin needs base and adder 0012 $s требуется base и adder плагину 0013 % from left: 0013 % слева: 0014 % from top: 0014 % сверху: 0015 %d albums selected 0015 %d альбомов выбрано 0016 %d image files selected 0016 %d файлов изображений выбрано 0017 %d images 0017 %d изображений 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 %d keywords для очистки \nв %d файлах изображений. \nПродолжить? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 %d keywords для переименования \nв %d файлах изображений. \nПродолжить? 0020 %d max images exceeded 0020 превышено максимальное количество изображений: %d 0021 %d red-eye limit reached 0021 достигнут предел устранения красных глаз: %d 0022 %s %s %d folders %d files 0022 %s %s %d папок %d файлов 0023 %s *** date/time conversion failed \n 0023 %s *** ошибка преобразования даты/времени \n 0024 %s ALBUM %s %d files 0024 %s АЛЬБОМ %s %d файлов 0025 %s NEWEST FILES 0025 %s НОВЕЙШИЕ ФАЙЛЫ 0026 %s RECENT FILES 0026 %s НЕДАВНИЕ ФАЙЛЫ 0027 %s SEARCH RESULTS %d files 0027 %s РЕЗУЛЬТАТЫ ПОИСКА %d файлов 0028 %s UNKNOWN 0028 %s НЕИЗВЕСТНО 0029 %s added to script 0029 %s добавлен в сценарий 0030 %s is already indexed 0030 %s уже проиндексирован 0031 %s renamed: %s 0031 %s переименован: %s 0032 %s: metadata update failed 0032 %s: не удалось обновить metadata 0033 %s: no write permission 0033 %s: нет прав на запись 0034 %s: reserved, cannot be used 0034 %s: зарезервировано, использовать нельзя 0035 %s: too many keywords 0035 %s: слишком много keywords 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\nДата съёмки: %s Дата файла: %s \nРейтинг: %s Размер: %s %.2fmb \nМестоположение: %s %s %s \nKeywords: %s \nЗаголовок: %s \nОписание: %s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\nДата съёмки: %s Дата файла: %s \nРейтинг: %s Размер: %s %.2fmb \nМестоположение: %s %s %s \nKeywords: %s \nЗаголовок: %s \nОписание: %s \n----------------------- \n%s 0038 (click below) 0038 (нажмите ниже) 0039 (no selection) 0039 (нет выбора) 0040 (pixels) 0040 (пикселей) 0041 (press key) 0041 (нажмите клавишу) 0042 (select function) 0042 (выберите функцию) 0043 *** bad utf8 detected *** \n 0043 *** обнаружен некорректный utf8 *** \n 0044 *** cannot create new file \n 0044 *** не удалось создать новый файл \n 0045 *** cannot get real path of input file \n 0045 *** не удалось получить реальный путь к входному файлу \n 0046 *** cannot load input file \n 0046 *** не удалось загрузить входной файл \n 0047 *** cannot make new version of input file \n 0047 *** не удалось создать новую версию входного файла \n 0048 *** cannot open input file 0048 *** не удалось открыть входной файл 0049 *** cannot read input file 0049 *** не удалось прочитать входной файл 0050 *** cannot save output file \n 0050 *** не удалось сохранить выходной файл \n 0051 *** completed \n 0051 *** завершено \n 0052 *** file date/time invalid \n 0052 *** недопустимая дата/время файла \n 0053 *** file type not supported \n 0053 *** тип файла не поддерживается \n 0054 *** invalid file \n 0054 *** недопустимый файл \n 0055 *** metadata update error \n 0055 *** ошибка обновления metadata \n 0056 *** no date/time available \n 0056 *** дата/время недоступны \n 0057 + bright 0057 + ярче 0058 +Blue -Yellow 0058 +Синий -Жёлтый 0059 +Brightness 0059 +Яркость 0060 +Green -Magenta 0060 +Зелёный -Пурпурный 0061 +Red -Cyan 0061 +Красный -Голубой 0062 - blue 0062 - синий 0063 - fog/haze 0063 - дымка/туман 0064 .heic/.avif files not supported (install heif_convert) 0064 файлы .heic/.avif не поддерживаются (установите heif_convert) 0065 .jp2 files not supported (install opj_decompress) 0065 файлы .jp2 не поддерживаются (установите opj_decompress) 0066 .webp files not supported (install dwebp) 0066 файлы .webp не поддерживаются (установите dwebp) 0067 0 albums selected 0067 0 альбомов выбрано 0068 0 duplicates 0068 0 дубликатов 0069 0-5 stars 0069 0-5 звёзд 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = без индекса изображений, только старый индекс, старый + обновление новых/изменённых 0071 2-character code 0071 2-символьный код 0072 3D depth 0072 3D-глубина 0073 <2 images 0073 <2 изображений 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 Устанавливается новый выпуск Fotocx. \nВозможно, потребуется восстановить пользовательские настройки. 0075 ADD GLARE 0075 ДОБАВИТЬ БЛИКИ 0076 ADD NOISE 0076 ДОБАВИТЬ ШУМ 0077 ADJUST HSL 0077 НАСТРОЙКА HSL 0078 ADJUST RGB 0078 НАСТРОЙКА RGB 0079 ALBUM MASS UPDATE 0079 МАССОВОЕ ОБНОВЛЕНИЕ АЛЬБОМА 0080 ALBUMS 0080 АЛЬБОМЫ 0081 ALBUMS MENU 0081 МЕНЮ АЛЬБОМОВ 0082 ALIEN COLORS 0082 ЧУЖЕРОДНЫЕ ЦВЕТА 0083 AMPLIFY CONTRAST 0083 УСИЛЕНИЕ КОНТРАСТА 0084 ANTI-ALIAS 0084 СГЛАЖИВАНИЕ 0085 AREA BLEND 0085 СМЕШИВАНИЕ ОБЛАСТИ 0086 AREA FILL 0086 ЗАЛИВКА ОБЛАСТИ 0087 AREA OVERVIEW 0087 ОБЗОР ОБЛАСТИ 0088 AUTOSEARCH 0088 АВТОПОИСК 0089 About 0089 О программе 0090 Action 0090 Действие 0091 Add 0091 Добавить 0092 Add 1 0092 Добавить 1 0093 Add All 0093 Добавить все 0094 Add Current 0094 Добавить текущий 0095 Add Current File Here 0095 Добавить текущий файл сюда 0096 Add Glare 0096 Добавить блики 0097 Add Image 0097 Добавить изображение 0098 Add Line 0098 Добавить линию 0099 Add Margins 0099 Добавить поля 0100 Add Noise 0100 Добавить шум 0101 Add Random Noise 0101 Добавить случайный шум 0102 Add Selected Files Here 0102 Добавить выбранные файлы сюда 0103 Add Texture 0103 Добавить текстуру 0104 Add a brightness/color ramp across an image 0104 Добавить градиент яркости/цвета по изображению 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 Добавить закладку: щёлкните по миниатюре в галерее. \nПереименовать закладку: щёлкните по ней и нажмите [Переименовать] 0106 Add glare around bright objects 0106 Добавить блики вокруг ярких объектов 0107 Add margins around an image 0107 Добавить поля вокруг изображения 0108 Add newest version to existing versions 0108 Добавить новейшую версию к существующим версиям 0109 Add overlay image (e.g. copyright) to selected images 0109 Добавить накладываемое изображение (например, копирайт) на выбранные изображения 0110 Add random noise to an image 0110 Добавить случайный шум к изображению 0111 Add selected versions to existing versions 0111 Добавить выбранные версии к существующим версиям 0112 Add texture to an image 0112 Добавить текстуру к изображению 0113 Add to Selection 0113 Добавить к выбранному 0114 Add/change/delete metadata for selected image files 0114 Добавить/изменить/удалить metadata для выбранных файлов изображений 0115 Add/remove barrel/pincushion distortion 0115 Добавить/удалить бочкообразную/подушкообразную дисторсию 0116 Add/remove brightness/color radially from chosen center 0116 Добавить/удалить яркость/цвет радиально от выбранного центра 0117 Add/remove keywords for selected image files 0117 Добавить/удалить keywords для выбранных файлов изображений 0118 Add/revise location/geocoordinates for selected image files 0118 Добавить/изменить местоположение/геокоординаты для выбранных файлов изображений 0119 Adjust HSL 0119 Настройка HSL 0120 Adjust Image Contributions 0120 Настройка вклада изображений 0121 Adjust Pixel Composition 0121 Настройка пиксельного состава 0122 Adjust RGB 0122 Настройка RGB 0123 Adjust brightness, contrast, color 0123 Настройка яркости, контраста, цвета 0124 Adjust color saturation based on brightness 0124 Настройка насыщенности цвета в зависимости от яркости 0125 Adjust color using HSL color model 0125 Настройка цвета с использованием цветовой модели HSL 0126 Adjust color using RGB or CMY colors 0126 Настройка цвета с использованием цветов RGB или CMY 0127 Adjustment 0127 Настройка 0128 Album Mass Update 0128 Массовое обновление альбома 0129 Album Name 0129 Название альбома 0130 Albums 0130 Альбомы 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 Альбомы: галерея выбранных изображений, упорядочивание перетаскиванием 0132 Algorithm Iterations 0132 Итерации алгоритма 0133 Alien Colors 0133 Чужеродные цвета 0134 All 0134 Все 0135 All Areas 0135 Все области 0136 All files 0136 Все файлы 0137 All image files will be re-indexed. \nContinue? 0137 Все файлы изображений будут переиндексированы. \nПродолжить? 0138 All±1 0138 Все±1 0139 All±10 0139 Все±10 0140 Alpha 0140 Альфа 0141 Amount 0141 Величина 0142 Amplify 0142 Усилить 0143 Amplify Contrast 0143 Усиление контраста 0144 Amplify area contrast to enhance visibility of details 0144 Усилить контраст области для повышения видимости деталей 0145 Angle 0145 Угол 0146 Anti-Alias 0146 Сглаживание 0147 Apply 0147 Применить 0148 Apply a soft focus effect to an image 0148 Применить эффект мягкого фокуса к изображению 0149 Apply repeatedly while watching the image. 0149 Применяйте многократно, наблюдая за изображением. 0150 Area Blend 0150 Смешивание области 0151 Area Edge Blend 0151 Смешивание края области 0152 Area Fill 0152 Заливка области 0153 Arrange images and text in a layout (photo-montage) 0153 Расположить изображения и текст в макете (фотомонтаж) 0154 Array Complete 0154 Массив завершён 0155 Array Width 0155 Ширина массива 0156 Arrow head 0156 Наконечник стрелки 0157 Auto Level 0157 Автоуровень 0158 Auto black level 0158 Автоматический уровень чёрного 0159 Auto crop: 0159 Автообрезка: 0160 Auto white balance 0160 Автобаланс белого 0161 Auto-replay 0161 Автовоспроизведение 0162 BATCH CHANGE META 0162 МАССОВОЕ ИЗМЕНЕНИЕ META 0163 BATCH CONVERT 0163 МАССОВОЕ ПРЕОБРАЗОВАНИЕ 0164 BATCH COPY/MOVE 0164 МАССОВОЕ КОПИРОВАНИЕ/ПЕРЕМЕЩЕНИЕ 0165 BATCH DELETE/TRASH 0165 МАССОВОЕ УДАЛЕНИЕ/КОРЗИНА 0166 BATCH GEOTAGS 0166 МАССОВЫЕ GEOTAGS 0167 BATCH KEYWORDS 0167 МАССОВЫЕ KEYWORDS 0168 BATCH MENU 0168 МЕНЮ МАССОВЫХ ОПЕРАЦИЙ 0169 BATCH OVERLAY 0169 МАССОВОЕ НАЛОЖЕНИЕ 0170 BATCH PHOTO DATE 0170 МАССОВАЯ ДАТА СЪЁМКИ 0171 BATCH PROCESSING 0171 МАССОВАЯ ОБРАБОТКА 0172 BATCH PURGE KEYWORDS 0172 МАССОВАЯ ОЧИСТКА KEYWORDS 0173 BATCH RENAME KEYWORDS 0173 МАССОВОЕ ПЕРЕИМЕНОВАНИЕ KEYWORDS 0174 BATCH REPORT META 0174 МАССОВЫЙ ОТЧЁТ META 0175 BATCH SCRIPT 0175 МАССОВЫЙ СЦЕНАРИЙ 0176 BATCH UPRIGHT 0176 МАССОВОЕ ВЫПРЯМЛЕНИЕ 0177 BLANK IMAGE 0177 ПУСТОЕ ИЗОБРАЖЕНИЕ 0178 BLUR 0178 РАЗМЫТИЕ 0179 BOOKMARKS 0179 ЗАКЛАДКИ 0180 BRIGHTNESS RAMP 0180 ГРАДИЕНТ ЯРКОСТИ 0181 Background 0181 Фон 0182 Background Blur - blur relative to distance from foreground 0182 Размытие фона — размытие в зависимости от расстояния от переднего плана 0183 Background Color 0183 Цвет фона 0184 Background Pattern 0184 Узор фона 0185 Base Transparency 0185 Базовая прозрачность 0186 Batch 0186 Массовые операции 0187 Batch Add/Change Metadata 0187 Массовое добавление/изменение metadata 0188 Batch Add/Remove Keywords 0188 Массовое добавление/удаление keywords 0189 Batch Change Meta 0189 Массовое изменение Meta 0190 Batch Convert 0190 Массовое преобразование 0191 Batch Copy/Move 0191 Массовое копирование/перемещение 0192 Batch Delete/Trash 0192 Массовое удаление/в корзину 0193 Batch Geotags 0193 Массовые Geotags 0194 Batch Keywords 0194 Массовые Keywords 0195 Batch Metadata 0195 Массовые Metadata 0196 Batch Overlay 0196 Массовое наложение 0197 Batch Photo Date 0197 Массовая дата съёмки 0198 Batch Photo Date/Time 0198 Массовая дата/время съёмки 0199 Batch Purge Keywords 0199 Массовая очистка Keywords 0200 Batch Rename Keywords 0200 Массовое переименование Keywords 0201 Batch Report Meta 0201 Массовый отчёт Meta 0202 Batch Report Metadata 0202 Массовый отчёт Metadata 0203 Batch Set Geotags 0203 Массовая установка Geotags 0204 Batch Upright 0204 Массовое выпрямление 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 Массовые операции: копирование, перемещение, преобразование, преобразование RAW, добавление/изменение metadata 0206 Bend and fine-align 0206 Изгиб и точная выравнивание 0207 Bias 0207 Смещение 0208 Black 0208 Чёрный 0209 Blank Image 0209 Пустое изображение 0210 Blend 0210 Смешение 0211 Blend 0% 0211 Смешение 0% 0212 Blend Width 0212 Ширина смешения 0213 Blend area edits/edges using the mouse 0213 Смешивание правок/краёв области с помощью мыши 0214 Blend: 0% 0214 Смешение: 0% 0215 Blue 0215 Синий 0216 Blue Factors 0216 Коэффициенты синего 0217 Blur 0217 Размытие 0218 Blur Angle (degrees) 0218 Угол размытия (градусы) 0219 Blur Background 0219 Размытие фона 0220 Blur Image 0220 Размытие изображения 0221 Blur Mix 0221 Смешение размытия 0222 Blur Normal 0222 Обычное размытие 0223 Blur Radius 0223 Радиус размытия 0224 Blur Span 0224 Протяжённость размытия 0225 Blur Span (pixels) 0225 Протяжённость размытия (пикселей) 0226 Blur the image (various methods) 0226 Размыть изображение (различными методами) 0227 Bookmarks 0227 Закладки 0228 Both 0228 Оба 0229 Bottom 0229 Снизу 0230 Bright Limit 0230 Предел яркого 0231 Bright Point 0231 Яркая точка 0232 Brightness 0232 Яркость 0233 Brightness Histogram 0233 Гистограмма яркости 0234 Brightness Ramp 0234 Градиент яркости 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 Яркость должна показывать плавный градиент \nдо самых краёв. 0236 Browse 0236 Обзор 0237 CALIBRATE PRINTER 0237 КАЛИБРОВКА ПРИНТЕРА 0238 CAPTIONS 0238 ПОДПИСИ 0239 CARTOON 0239 МУЛЬТФИЛЬМ 0240 CHOOSE ALBUM 0240 ВЫБОР АЛЬБОМА 0241 CLEAR AREA 0241 ОЧИСТИТЬ ОБЛАСТЬ 0242 CLOSE 0242 ЗАКРЫТЬ 0243 COLOR MODE 0243 ЦВЕТОВОЙ РЕЖИМ 0244 COMBINE MENU 0244 МЕНЮ ОБЪЕДИНЕНИЯ 0245 COMMAND PARAMETERS 0245 ПАРАМЕТРЫ КОМАНДЫ 0246 COMPLETED 0246 ЗАВЕРШЕНО 0247 COPY FROM IMAGE 0247 КОПИРОВАТЬ ИЗ ИЗОБРАЖЕНИЯ 0248 COPY IN IMAGE 0248 КОПИРОВАТЬ ВНУТРИ ИЗОБРАЖЕНИЯ 0249 COPY META 0249 КОПИРОВАТЬ META 0250 COPY PRIOR EDIT 0250 КОПИРОВАТЬ ПРЕДЫДУЩУЮ ПРАВКУ 0251 COPY TO CLIPBOARD 0251 КОПИРОВАТЬ В БУФЕР ОБМЕНА 0252 COPY TO DESKTOP 0252 КОПИРОВАТЬ НА РАБОЧИЙ СТОЛ 0253 COPY/MOVE 0253 КОПИРОВАНИЕ/ПЕРЕМЕЩЕНИЕ 0254 COPY/PASTE AREA 0254 КОПИРОВАТЬ/ВСТАВИТЬ ОБЛАСТЬ 0255 CREATE ALBUM 0255 СОЗДАТЬ АЛЬБОМ 0256 CROP 0256 ОБРЕЗКА 0257 CROSSHATCH 0257 ШТРИХОВКА 0258 CURRENT ALBUM 0258 ТЕКУЩИЙ АЛЬБОМ 0259 CURRENT FILE FOLDER 0259 ПАПКА ТЕКУЩЕГО ФАЙЛА 0260 CURVE EDITING 0260 РЕДАКТИРОВАНИЕ КРИВОЙ 0261 CUSTOM KERNEL 0261 ПОЛЬЗОВАТЕЛЬСКОЕ ЯДРО 0262 CUSTOM MENU 0262 ПОЛЬЗОВАТЕЛЬСКОЕ МЕНЮ 0263 CYCLE 2 FILES 0263 ЦИКЛ 2 ФАЙЛА 0264 CYCLE 3 FILES 0264 ЦИКЛ 3 ФАЙЛА 0265 Calculate 0265 Вычислить 0266 Calculate Geometry 0266 Вычислить геометрию 0267 Calibrate Printer 0267 Калибровка принтера 0268 Cancel 0268 Отмена 0269 Cartoon 0269 Мультфильм 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 Внимание: используйте функцию «Редактировать основные Metadata» \nдля изменения tags, доступных там, чтобы обеспечить \nвнесение связанных обновлений. 0271 Center 0271 Центр 0272 Center Hole 0272 Центральное отверстие 0273 Change 0273 Изменить 0274 Change Log 0274 Журнал изменений 0275 Change file name 0275 Изменить имя файла 0276 Change gallery sort order 0276 Изменить порядок сортировки галереи 0277 Change image colors using an algorithm 0277 Изменить цвета изображения с помощью алгоритма 0278 Change image pixel dimensions 0278 Изменить размеры изображения в пикселях 0279 Chart to adjust monitor color 0279 Диаграмма для настройки цвета монитора 0280 Choose 0280 Выбрать 0281 Choose Album 0281 Выбрать альбом 0282 Choose Albums 0282 Выбрать альбомы 0283 Choose Captions 0283 Выбрать подписи 0284 Choose an album and show as gallery of images 0284 Выбрать альбом и показать в виде галереи изображений 0285 Choose metadata shown on image captions 0285 Выбрать metadata, отображаемые в подписях изображений 0286 Choose new Fotocx home folder 0286 Выбрать новую домашнюю папку Fotocx 0287 Choose thumbnail folder 0287 Выбрать папку миниатюр 0288 Choose top image folders 0288 Выбрать верхние папки изображений 0289 Clear 0289 Очистить 0290 Clear All 0290 Очистить всё 0291 Click dark spot for black level 0291 Щёлкните тёмную точку для уровня чёрного 0292 Click for RGB histogram 0292 Щёлкните для гистограммы RGB 0293 Click gray spot for white balance 0293 Щёлкните серую точку для баланса белого 0294 Click image to select pixels 0294 Щёлкните изображение, чтобы выбрать пиксели 0295 Click image to select, drag image to move. 0295 Щёлкните изображение, чтобы выбрать, перетащите изображение, чтобы переместить. 0296 Click mouse to change center 0296 Щёлкните мышью, чтобы изменить центр 0297 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0297 Щёлкните рядом с любой точкой контура области. \nВозможные разрывы в контуре будут найдены. \nНажмите F1 для справки 0298 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0298 Щёлкните четыре угла четырёхугольной области. Нажмите [применить]. \nИзображение искажается так, чтобы превратить четырёхугольник в прямоугольник. 0299 Click thumbnail to select file 0299 Щёлкните миниатюру, чтобы выбрать файл 0300 Clip Level 0300 Уровень отсечения 0301 Clip Limit % 0301 Предел отсечения % 0302 Color 0302 Цвет 0303 Color Chooser 0303 Выбор цвета 0304 Color Depth: 0304 Цветовая глубина: 0305 Color Fringes 0305 Цветовые окантовки 0306 Color Hue 0306 Цветовой тон 0307 Color Map File 0307 Файл цветовой карты 0308 Color Match Images 0308 Соответствие цветов изображений 0309 Color Mode 0309 Цветовой режим 0310 Color calibration tool for printer and paper type 0310 Инструмент цветовой калибровки принтера и типа бумаги 0311 Color map file to use 0311 Файл цветовой карты для использования 0312 Combine 0312 Объединить 0313 Combine 2-6 images into a wide panorama image 0313 Объединить 2-6 изображений в широкую панораму 0314 Combine many images into an array of images 0314 Объединить множество изображений в массив изображений 0315 Combine multiple images in layers, select and expose layers 0315 Объединить несколько изображений в слои, выбор и проявление слоёв 0316 Combine multiple noisy photos into a low-noise image 0316 Объединить несколько зашумлённых фото в изображение с низким уровнем шума 0317 Combine multiple photos to erase passing people, etc. 0317 Объединить несколько фото, чтобы удалить проходящих людей и т. д. 0318 Combine within 0318 Объединить в пределах 0319 Combine: HDR, HDF, stack, panorama, mashup, image array 0319 Объединение: HDR, HDF, стек, панорама, монтаж, массив изображений 0320 Command Params 0320 Параметры команды 0321 Commit 0321 Подтвердить 0322 Confirm Exit 0322 Подтвердить выход 0323 Contrast 0323 Контраст 0324 Contrast All 0324 Контраст (все) 0325 Contrast Blue 0325 Контраст синего 0326 Contrast Green 0326 Контраст зелёного 0327 Contrast Limit 0327 Предел контраста 0328 Contrast Red 0328 Контраст красного 0329 Convert %d image files 0329 Преобразовать %d файлов изображений 0330 Convert an image into a Tiny Planet image 0330 Преобразовать изображение в «Маленькую планету» 0331 Convert image into a cartoon drawing 0331 Преобразовать изображение в мультипликационный рисунок 0332 Convert image into a crosshatch sketch 0332 Преобразовать изображение в штриховой набросок 0333 Convert image into a line drawing 0333 Преобразовать изображение в линейный рисунок 0334 Convert image into a simulated painting 0334 Преобразовать изображение в имитацию живописи 0335 Convert image into a simulated sketch (1) 0335 Преобразовать изображение в имитацию наброска (1) 0336 Convert image into a simulated sketch (2) 0336 Преобразовать изображение в имитацию наброска (2) 0337 Convert image into black/white lines 0337 Преобразовать изображение в чёрно-белые линии 0338 Convert image into dithered dots 0338 Преобразовать изображение в дизеринг-точки 0339 Convert image into square tiles with 3D effect 0339 Преобразовать изображение в квадратные плитки с 3D-эффектом 0340 Convert image into tiles matching feature contours 0340 Преобразовать изображение в плитки по контурам деталей 0341 Copy 0341 Копировать 0342 Copy %d image files 0342 Копировать %d файлов изображений 0343 Copy From Image 0343 Копировать из изображения 0344 Copy Meta 0344 Копировать Meta 0345 Copy Metadata 0345 Копировать Metadata 0346 Copy Prior Edit 0346 Копировать предыдущую правку 0347 Copy Within Image 0347 Копировать внутри изображения 0348 Copy area for later pasting into image 0348 Скопировать область для последующей вставки в изображение 0349 Copy areas from another image using the mouse 0349 Копировать области из другого изображения с помощью мыши 0350 Copy areas from prior edits using the mouse 0350 Копировать области из предыдущих правок с помощью мыши 0351 Copy areas within an image using the mouse 0351 Копировать области внутри изображения с помощью мыши 0352 Copy image file to the clipboard 0352 Скопировать файл изображения в буфер обмена 0353 Copy image file to the desktop 0353 Скопировать файл изображения на рабочий стол 0354 Copy in Image 0354 Копировать внутри изображения 0355 Copy metadata from one image to another 0355 Скопировать metadata из одного изображения в другое 0356 Copy or Move Image File 0356 Копировать или переместить файл изображения 0357 Copy or Move image file to new location 0357 Копировать или переместить файл изображения в новое место 0358 Copy to Clipboard 0358 Копировать в буфер обмена 0359 Copy to Desktop 0359 Копировать на рабочий стол 0360 Copy without unsaved changes? 0360 Копировать без несохранённых изменений? 0361 Copy/Move 0361 Копирование/перемещение 0362 Copy/move selected image files to a new folder 0362 Копировать/переместить выбранные файлы изображений в новую папку 0363 Copyright 0363 Копирайт 0364 Create 0364 Создать 0365 Create Album 0365 Создать альбом 0366 Create Blank Image 0366 Создать пустое изображение 0367 Create Mosaic 0367 Создать мозаику 0368 Create a blank image 0368 Создать пустое изображение 0369 Create a mosaic with tiles made from all images 0369 Создать мозаику из плиток, составленных из всех изображений 0370 Create a new album (ordered set of image files) 0370 Создать новый альбом (упорядоченный набор файлов изображений) 0371 Create an embossed or 3D appearance 0371 Создать эффект тиснения или 3D 0372 Create or replace an album 0372 Создать или заменить альбом 0373 Crop 0373 Обрезка 0374 Crop (trim) image margins 0374 Обрезать (подрезать) поля изображения 0375 Crop Buttons 0375 Кнопки обрезки 0376 Crop Image 0376 Обрезать изображение 0377 Crosshatch 0377 Штриховка 0378 Crosshatch Sketch 0378 Штриховой набросок 0379 Current Album 0379 Текущий альбом 0380 Current File Folder 0380 Папка текущего файла 0381 Current gallery 0381 Текущая галерея 0382 Current image: 0382 Текущее изображение: 0383 Curve Node 0383 Узел кривой 0384 Curve lines need at least 4 points 0384 Линиям кривой требуется как минимум 4 точки 0385 Custom 0385 Пользовательский 0386 Custom Kernel 0386 Пользовательское ядро 0387 Custom Shortcuts \n 0387 Пользовательские сочетания клавиш \n 0388 Custom menu: favorite/frequent functions, scripts, plugins 0388 Пользовательское меню: избранные/часто используемые функции, сценарии, плагины 0389 Customize 0389 Настроить 0390 Customize: 0390 Настроить: 0391 Cut Bottom 0391 Обрезать снизу 0392 Cut Top 0392 Обрезать сверху 0393 Cycle 2 Files 0393 Цикл 2 файла 0394 Cycle 2 Prior Files 0394 Цикл 2 предыдущих файла 0395 Cycle 3 Files 0395 Цикл 3 файла 0396 Cycle 3 Prior Files 0396 Цикл 3 предыдущих файла 0397 Cycle through images: 0397 Циклический просмотр изображений: 0398 DARK/BRIGHT PIXELS 0398 ТЁМНЫЕ/ЯРКИЕ ПИКСЕЛИ 0399 DEFOG 0399 УДАЛЕНИЕ ДЫМКИ 0400 DELETE ALBUM 0400 УДАЛИТЬ АЛЬБОМ 0401 DELETE META 0401 УДАЛИТЬ META 0402 DELETE/TRASH 0402 УДАЛИТЬ/В КОРЗИНУ 0403 DENOISE 0403 ШУМОПОДАВЛЕНИЕ 0404 DIALOG BUTTONS 0404 КНОПКИ ДИАЛОГА 0405 DITHER 0405 ДИЗЕРИНГ 0406 DRAG AND DROP 0406 ПЕРЕТАСКИВАНИЕ 0407 Dark Areas 0407 Тёмные области 0408 Dark Limit 0408 Предел тёмного 0409 Dark Point 0409 Тёмная точка 0410 Dark/Bright Pixels 0410 Тёмные/яркие пиксели 0411 Data file 0411 Файл данных 0412 Define keywords used for searching images 0412 Определить keywords, используемые для поиска изображений 0413 Defined Keywords: 0413 Определённые Keywords: 0414 Defog 0414 Удаление дымки 0415 Delete 0415 Удалить 0416 Delete Album 0416 Удалить альбом 0417 Delete Meta 0417 Удалить Meta 0418 Delete Metadata 0418 Удалить Metadata 0419 Delete Originals 0419 Удалить оригиналы 0420 Delete an album 0420 Удалить альбом 0421 Delete or Trash selected image files 0421 Удалить или переместить в корзину выбранные файлы изображений 0422 Delete or trash an image file 0422 Удалить или переместить файл изображения в корзину 0423 Delete read-only file? 0423 Удалить файл только для чтения? 0424 Delete/Trash 0424 Удалить/в корзину 0425 Denoise 0425 Шумоподавление 0426 Depth 0426 Глубина 0427 Desc. 0427 Опис. 0428 Description: %s\n 0428 Описание: %s\n 0429 Desktop 0429 Рабочий стол 0430 Dialog Font 0430 Шрифт диалога 0431 Diffs 0431 Различия 0432 Directed Blur 0432 Направленное размытие 0433 Directed Blur - blur locally in direction of mouse drag 0433 Направленное размытие — размытие локально в направлении перетаскивания мыши 0434 Disable 0434 Отключить 0435 Disable areas for editing 0435 Отключить области для редактирования 0436 Discard unsaved changes? 0436 Отменить несохранённые изменения? 0437 Discard unsaved edits? 0437 Отменить несохранённые правки? 0438 Distort image areas using the mouse 0438 Искажать области изображения с помощью мыши 0439 Dither 0439 Дизеринг 0440 Dither Image 0440 Дизеринг изображения 0441 Dither0 0441 Дизеринг0 0442 Dither1 0442 Дизеринг1 0443 Dither2 0443 Дизеринг2 0444 Dither3 0444 Дизеринг3 0445 Dither4 0445 Дизеринг4 0446 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0446 Перетащите изображения для примерного выравнивания.\nЧтобы повернуть, перетаскивайте от нижнего края. 0447 Drag margin box middle or edges 0447 Перетащите середину или края рамки полей 0448 Drag mouse on image. \nLeft click to cancel. 0448 Перетащите мышь по изображению. \nЛевый щелчок для отмены. 0449 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0449 Перетащите мышь, чтобы выбрать. Сотрите. Повторите. \nЩелчок: расширить выделение до положения мыши. 0450 Drag mouse to set center 0450 Перетащите мышь, чтобы задать центр 0451 Drag near an image corner using the mouse 0451 Перетащите рядом с углом изображения с помощью мыши 0452 Drag on image to level image.\nClick on image for level lines. 0452 Перетащите по изображению, чтобы выровнять изображение.\nЩёлкните по изображению для линий уровня. 0453 Drag within image using the mouse 0453 Перетащите внутри изображения с помощью мыши 0454 Draw a line across the image in \ndirection of brightness change. 0454 Проведите линию по изображению в \nнаправлении изменения яркости. 0455 Draw box on image 0455 Нарисовать прямоугольник на изображении 0456 Draw line or arrow on image 0456 Нарисовать линию или стрелку на изображении 0457 Draw on image: text, line/arrow, box, circle, ellipse 0457 Рисовать на изображении: текст, линия/стрелка, прямоугольник, круг, эллипс 0458 Draw oval on image 0458 Нарисовать овал на изображении 0459 Draw text on image 0459 Нарисовать текст на изображении 0460 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0460 Дублирующиеся или вложенные папки: \n %s \n %s \nПожалуйста, удалите. 0461 Duplicates: 0461 Дубликаты: 0462 EDIT ALBUM 0462 ИЗМЕНИТЬ АЛЬБОМ 0463 EDIT ANY META 0463 РЕДАКТИРОВАТЬ ЛЮБЫЕ META 0464 EDIT BOOKMARKS 0464 РЕДАКТИРОВАТЬ ЗАКЛАДКИ 0465 EDIT MAIN META 0465 РЕДАКТИРОВАТЬ ОСНОВНЫЕ META 0466 EDIT MENU 0466 МЕНЮ РЕДАКТИРОВАНИЯ 0467 EDIT PROCEDURES 0467 РЕДАКТИРОВАТЬ ПРОЦЕДУРЫ 0468 EDIT SCRIPT 0468 РЕДАКТИРОВАТЬ СЦЕНАРИЙ 0469 EDIT WORKFLOW 0469 РЕДАКТИРОВАТЬ РАБОЧИЙ ПРОЦЕСС 0470 EFFECTS MENU 0470 МЕНЮ ЭФФЕКТОВ 0471 EMBOSS 0471 ТИСНЕНИЕ 0472 ENABLE/DISABLE AREA 0472 ВКЛЮЧИТЬ/ОТКЛЮЧИТЬ ОБЛАСТЬ 0473 ENGRAVE 0473 ГРАВИРОВКА 0474 ESCHER SPIRAL 0474 СПИРАЛЬ ЭШЕРА 0475 EXPORT FILES 0475 ЭКСПОРТ ФАЙЛОВ 0476 Edge 0476 Край 0477 Edit 0477 Правка 0478 Edit Any Meta 0478 Редактировать любые Meta 0479 Edit Any Metadata 0479 Редактировать любые Metadata 0480 Edit Bookmarks 0480 Редактировать закладки 0481 Edit Images 0481 Редактировать изображения 0482 Edit Keyboard Shortcuts 0482 Редактировать сочетания клавиш 0483 Edit Line 0483 Редактировать линию 0484 Edit Line/Arrow 0484 Редактировать линию/стрелку 0485 Edit Main Meta 0485 Редактировать основные Meta 0486 Edit Main Metadata 0486 Редактировать основные Metadata 0487 Edit Menu 0487 Меню редактирования 0488 Edit Metadata 0488 Редактировать Metadata 0489 Edit Plugins 0489 Редактировать плагины 0490 Edit Text 0490 Редактировать текст 0491 Edit any metadata tag 0491 Редактировать любой tag metadata 0492 Edit function can not use Paint Edits 0492 Функция редактирования не может использовать «Правки кистью» 0493 Edit function must be active 0493 Функция редактирования должна быть активна 0494 Edit key metadata: keywords/geotags/description/rating ... 0494 Редактировать ключевые metadata: keywords/geotags/описание/рейтинг ... 0495 Edit plugins menu 0495 Меню редактирования плагинов 0496 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0496 Редактирование: обрезка, поворот, ретушь, изменение масштаба, разметка, правки кистью, копирование областей 0497 Effects 0497 Эффекты 0498 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0498 Эффекты: мультфильм, набросок, живопись, тиснение, дизеринг, текстура, цвета, пользовательская свёртка 0499 Emboss 0499 Тиснение 0500 Enable 0500 Включить 0501 Enable areas for editing 0501 Включить области для редактирования 0502 End of gallery 0502 Конец галереи 0503 Engrave 0503 Гравировка 0504 Enter Keyword 0504 Введите keyword 0505 Enter New Keyword 0505 Введите новый keyword 0506 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0506 Введите параметры линии или стрелки в диалоге, \nщёлкните/перетащите по изображению, щелчок правой кнопкой для удаления 0507 Enter text, [Add] to layout, edit properties. 0507 Введите текст, [Добавить] в макет, редактировать. 0508 Enter text, click/drag on image, right click to remove 0508 Введите текст, щёлкните/перетащите по изображению, щелчок правой кнопкой для удаления 0509 Erase 0509 Стереть 0510 Erase existing areas 0510 Удалить существующие области 0511 Escher Spiral 0511 Спираль Эшера 0512 Exceed 50 anchor points 0512 Превышено 50 опорных точек 0513 Export Files 0513 Экспорт файлов 0514 Export selected image files to another folder 0514 Экспортировать выбранные файлы изображений в другую папку 0515 FILE MENU 0515 МЕНЮ ФАЙЛА 0516 FILE SAVE 0516 СОХРАНЕНИЕ ФАЙЛА 0517 FILE VIEW 0517 ПРОСМОТР ФАЙЛА 0518 FIND AREA GAP 0518 НАЙТИ РАЗРЫВ ОБЛАСТИ 0519 FIND BAD FILES 0519 НАЙТИ ПОВРЕЖДЁННЫЕ ФАЙЛЫ 0520 FIND DUPLICATES 0520 НАЙТИ ДУБЛИКАТЫ 0521 FIRST INDEX 0521 ПЕРВОЕ ИНДЕКСИРОВАНИЕ 0522 FIRST STARTUP 0522 ПЕРВЫЙ ЗАПУСК 0523 FIX META 0523 ИСПРАВИТЬ META 0524 FLATTEN HISTOGRAM 0524 ВЫРОВНЯТЬ ГИСТОГРАММУ 0525 FLATTEN PHOTO 0525 ВЫРОВНЯТЬ ФОТО 0526 FOLDER TREE 0526 ДЕРЕВО ПАПОК 0527 FOTOCX FOR WINDOWS 11 0527 FOTOCX ДЛЯ WINDOWS 11 0528 FOTOCX LIMITATIONS 0528 ОГРАНИЧЕНИЯ FOTOCX 0529 FOTOCX USAGE 0529 ИСПОЛЬЗОВАНИЕ FOTOCX 0530 FRINGES 0530 ОКАНТОВКИ 0531 FUSION 0531 СЛИЯНИЕ 0532 Fetch 0532 Получить 0533 File 0533 Файл 0534 File Mod Date/Time 0534 Дата/время изменения файла 0535 File Name 0535 Имя файла 0536 File Name/Number 0536 Имя/номер файла 0537 File Name: %s \n 0537 Имя файла: %s \n 0538 File Size (bytes) 0538 Размер файла (байт) 0539 File View 0539 Просмотр файла 0540 File count: 0540 Количество файлов: 0541 File type cannot be edited 0541 Тип файла нельзя редактировать 0542 File1 0542 Файл1 0543 File2 0543 Файл2 0544 File: 0544 Файл: 0545 File: new session, open, rename, copy/move, delete, print 0545 Файл: новый сеанс, открыть, переименовать, копировать/переместить, удалить, печать 0546 Fill selected areas or transparent areas with a color 0546 Заполнить выбранные или прозрачные области цветом 0547 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0547 Заполнить выбранные области цветом для визуальной проверки. \nСпособ 1: щёлкните левой кнопкой в каждой ещё не заполненной выбранной области. \nСпособ 2: щёлкните правой кнопкой ВНЕ всех выбранных областей. \nНажмите кнопку [справка] для уточнения 0548 Find 0548 Найти 0549 Find Bad Files 0549 Найти повреждённые файлы 0550 Find Duplicate Images 0550 Найти повторяющиеся изображения 0551 Find Duplicates 0551 Найти дубликаты 0552 Find Gap 0552 Найти разрыв 0553 Find a gap in an area outline 0553 Найти разрыв в контуре области 0554 Find all images for a location [date range] 0554 Найти все изображения по местоположению [диапазон дат] 0555 Find all images for a selected tag name and value 0555 Найти все изображения по выбранному имени и значению tag 0556 Find images meeting multiple search criteria 0556 Найти изображения, соответствующие нескольким условиям поиска 0557 Find optimum factors: 0557 Найти оптимальные коэффициенты: 0558 Finish 0558 Завершить 0559 Finish Area 0559 Завершить область 0560 Fix Bad File 0560 Исправить повреждённый файл 0561 Fix Broken Metadata 0561 Исправить повреждённые Metadata 0562 Fix Meta 0562 Исправить Meta 0563 Fix Motion Blur 0563 Исправить смазанность движения 0564 Fix Perspective 0564 Исправить перспективу 0565 Fix color fringes (chromatic aberration) 0565 Исправить цветовые окантовки (хроматическую аберрацию) 0566 Fix perspective for object photographed from an angle 0566 Исправить перспективу объекта, снятого под углом 0567 Fix red-eyes from flash photo 0567 Исправить эффект красных глаз от вспышки 0568 Flatten 0568 Выровнять 0569 Flatten Histogram 0569 Выровнять гистограмму 0570 Flatten Pano 0570 Выровнять панораму 0571 Flatten Photo 0571 Выровнять фото 0572 Flatten brightness histogram to enhance details 0572 Выровнять гистограмму яркости для повышения детализации 0573 Flatten curved surface. 0573 Выровнять изогнутую поверхность. 0574 Flatten photo of a curved image (e.g. poster on round column 0574 Выровнять фото изогнутого изображения (например, плакат на круглой колонне) 0575 Flip 0575 Отразить 0576 Folder Tree 0576 Дерево папок 0577 Folders 0577 Папки 0578 Folders for image files (subfolders included automatically) 0578 Папки с файлами изображений (подпапки включаются автоматически) 0579 Font 0579 Шрифт 0580 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0580 Для случайной последовательности изображений это значение — \nотносительная частота показа изображения. \nБазовое значение — 10. 20 --> показывать в 2 раза чаще. 0581 Foreground 0581 Передний план 0582 Fotocx copyright notice 0582 Уведомление об авторских правах Fotocx 0583 Fotocx home 0583 Домашняя страница Fotocx 0584 Fotocx privacy policy 0584 Политика конфиденциальности Fotocx 0585 Fotocx video tutorial on YouTube 0585 Видеоурок Fotocx на YouTube 0586 Fotocx web site (information and downloads) 0586 Веб-сайт Fotocx (информация и загрузки) 0587 FreeSans 0587 FreeSans 0588 Full List 0588 Полный список 0589 Full Screen 0589 Полный экран 0590 Fusion 0590 Слияние 0591 GALLERY END 0591 КОНЕЦ ГАЛЕРЕИ 0592 GALLERY FILTER 0592 ФИЛЬТР ГАЛЕРЕИ 0593 GALLERY HOME 0593 ГЛАВНАЯ ГАЛЕРЕЯ 0594 GALLERY MENU 0594 МЕНЮ ГАЛЕРЕИ 0595 GALLERY OVERVIEW 0595 ОБЗОР ГАЛЕРЕИ 0596 GALLERY SORT 0596 СОРТИРОВКА ГАЛЕРЕИ 0597 GALLERY TO ALBUM 0597 ГАЛЕРЕЯ В АЛЬБОМ 0598 GALLERY VIEW 0598 ПРОСМОТР ГАЛЕРЕИ 0599 GDK pixbuf: cannot save file 0599 GDK pixbuf: не удалось сохранить файл 0600 GLOBAL RETINEX 0600 ГЛОБАЛЬНЫЙ RETINEX 0601 GRID SETTINGS 0601 НАСТРОЙКИ СЕТКИ 0602 Gallery 0602 Галерея 0603 Gallery End 0603 Конец галереи 0604 Gallery Filter 0604 Фильтр галереи 0605 Gallery Home 0605 Главная галерея 0606 Gallery Sort 0606 Сортировка галереи 0607 Gallery View 0607 Просмотр галереи 0608 Gallery of newest image files 0608 Галерея новейших файлов изображений 0609 Gallery of recently viewed image files 0609 Галерея недавно просмотренных файлов изображений 0610 Gallery to Album 0610 Галерея в альбом 0611 Gallery view with thumbnails and basic metadata 0611 Просмотр галереи с миниатюрами и базовыми metadata 0612 Gallery view with thumbnails and file data 0612 Просмотр галереи с миниатюрами и данными файлов 0613 Gallery: thumbnails, new/recent, sort, select, bookmarks 0613 Галерея: миниатюры, новые/недавние, сортировка, выбор, закладки 0614 Generate an inward spiraling repeating image 0614 Создать спиралевидное изображение, закручивающееся внутрь 0615 Global Retinex 0615 Глобальный Retinex 0616 Gradual 0616 Плавный 0617 Graduated Blur 0617 Плавное размытие 0618 Graduated Blur - blur relative to pixel contrast 0618 Плавное размытие — размытие в зависимости от контраста пикселей 0619 Grayscale 0619 Оттенки серого 0620 Green 0620 Зелёный 0621 Grid Settings 0621 Настройки сетки 0622 Group by country 0622 Группировать по стране 0623 Group by country/date 0623 Группировать по стране/дате 0624 Group by country/location 0624 Группировать по стране/местоположению 0625 Group by country/location/date 0625 Группировать по стране/местоположению/дате 0626 Group by date/country 0626 Группировать по дате/стране 0627 Group by date/country/location 0627 Группировать по дате/стране/местоположению 0628 HDF 0628 HDF 0629 HDR 0629 HDR 0630 HELP MENU 0630 МЕНЮ СПРАВКИ 0631 Hard 0631 Жёсткий 0632 Height 0632 Высота 0633 Height: 0633 Высота: 0634 Help 0634 Справка 0635 Help: user guide, tutorial, change log, licenses, privacy, about 0635 Справка: руководство пользователя, обучение, журнал изменений, лицензии, конфиденциальность, о программе 0636 Hide 0636 Скрыть 0637 Hide selected areas 0637 Скрыть выбранные области 0638 High 0638 Высокий 0639 High Depth of Field - combine near/far focus images for deeper focus 0639 Высокая глубина резкости — объединение изображений с ближним/дальним фокусом для большей глубины резкости 0640 High Dynamic Range - combine bright/dark images for better detail 0640 Высокий динамический диапазон — объединение светлых/тёмных изображений для лучшей детализации 0641 Highlight darkest and brightest pixels 0641 Выделить самые тёмные и самые яркие пиксели 0642 Home Folder 0642 Домашняя папка 0643 Home Page 0643 Главная страница 0644 Horz 0644 По горизонтали 0645 How to remove Fotocx application and user files 0645 Как удалить приложение Fotocx и файлы пользователя 0646 Hue 0646 Тон 0647 IMAGE ARRAY 0647 МАССИВ ИЗОБРАЖЕНИЙ 0648 INDEX FILES 0648 ИНДЕКСИРОВАНИЕ ФАЙЛОВ 0649 INSIDE-OUT 0649 НАИЗНАНКУ 0650 INVERT AREA 0650 ИНВЕРТИРОВАТЬ ОБЛАСТЬ 0651 Icon size 0651 Размер значков 0652 Icons 0652 Значки 0653 Image 0653 Изображение 0654 Image Array 0654 Массив изображений 0655 Image Columns 0655 Столбцы изображений 0656 Image Differences 0656 Различия изображений 0657 Image File 0657 Файл изображения 0658 Image File: 0658 Файл изображения: 0659 Image Keywords 0659 Keywords изображения 0660 Image Locations 0660 Местоположения изображений 0661 Image Markup 0661 Разметка изображения 0662 Image Position 0662 Позиция изображения 0663 Image Preferences 0663 Настройки изображения 0664 Image Ratios 0664 Соотношения сторон изображения 0665 Image Size (pixels) 0665 Размер изображения (пикселей) 0666 Image Time 0666 Время изображения 0667 Image Timeline 0667 Хронология изображений 0668 Image colors are converted for printing. 0668 Цвета изображения преобразуются для печати. 0669 Image dimensions have changed \nCopy Prior Edit cannot be used 0669 Размеры изображения изменились \n«Копировать предыдущую правку» использовать нельзя 0670 Image dimensions have changed, \nArea Blend cannot be used 0670 Размеры изображения изменились, \n«Смешивание области» использовать нельзя 0671 Image dimensions have changed, \nthis prior image cannot be used 0671 Размеры изображения изменились, \nэто предыдущее изображение использовать нельзя 0672 Image is fixed, unmovable 0672 Изображение зафиксировано, неподвижно 0673 Images sizes are not compatible 0673 Размеры изображений несовместимы 0674 Include: 0674 Включить: 0675 Index Files 0675 Индексирование файлов 0676 Index Level 0676 Уровень индексирования 0677 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0677 Функция индексирования прервана. \nИндексирование необходимо для функций поиска и карты \nи для быстрого отображения страниц галереи миниатюр. 0678 Index new image files and make thumbnails 0678 Проиндексировать новые файлы изображений и создать миниатюры 0679 Input color to match and adjust: 0679 Входной цвет для сопоставления и настройки: 0680 Inside-out 0680 Наизнанку 0681 Install following programs using your package manager: \n 0681 Установите следующие программы с помощью вашего пакетного менеджера: \n 0682 Intensity 0682 Интенсивность 0683 Invert 0683 Инвертировать 0684 Invert selected areas (selected ↔ not selected) 0684 Инвертировать выбранные области (выбрано ↔ не выбрано) 0685 Irregular Tiles 0685 Неправильные плитки 0686 Iterations 0686 Итерации 0687 JPEG ARTIFACTS 0687 АРТЕФАКТЫ JPEG 0688 JPEG Artifacts 0688 Артефакты JPEG 0689 JPEG files 0689 Файлы JPEG 0690 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0690 Янв Фев Мар Апр Май Июн Июл Авг Сен Окт Ноя Дек 0691 Jump to gallery beginning [home] 0691 Перейти к началу галереи [Home] 0692 Jump to gallery end [end] 0692 Перейти к концу галереи [End] 0693 KEYBOARD ESCAPE KEY 0693 КЛАВИША ESCAPE 0694 KEYBOARD SHORTCUTS 0694 СОЧЕТАНИЯ КЛАВИШ 0695 KEYWORDS OVERVIEW 0695 ОБЗОР KEYWORDS 0696 Keep 0696 Оставить 0697 Kernel size 0697 Размер ядра 0698 Keyboard Shortcuts 0698 Сочетания клавиш 0699 Keywords Category 0699 Категория Keywords 0700 Kill active dialog? 0700 Закрыть активный диалог? 0701 Kill busy function? 0701 Прервать выполняющуюся функцию? 0702 Kuwahara 0702 Кувахара 0703 Kuwahara Depth 0703 Глубина Кувахара 0704 LINE COLOR 0704 ЦВЕТ ЛИНИИ 0705 LOAD/SAVE AREA 0705 ЗАГРУЗИТЬ/СОХРАНИТЬ ОБЛАСТЬ 0706 LOCAL CONTRAST 0706 ЛОКАЛЬНЫЙ КОНТРАСТ 0707 LOCAL RETINEX 0707 ЛОКАЛЬНЫЙ RETINEX 0708 Language 0708 Язык 0709 Layout and background image 0709 Макет и фоновое изображение 0710 Left 0710 Слева 0711 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0711 Перетаскивайте мышь левой кнопкой внутри области, \nчтобы постепенно отменить правки области. \nПеретаскивайте правой кнопкой, чтобы восстановить правки. \nПеретащите вдоль края области, чтобы смешать край. 0712 Left/right click: previous/next image (also arrow keys) 0712 Щелчок слева/справа: предыдущее/следующее изображение (также стрелки) 0713 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0713 Щелчок слева/справа: отменить/повторить один шаг правки \nЩелчок средней кнопкой: вернуться к выбранному шагу правки 0714 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0714 Щелчок слева/справа: увеличить/уменьшить изображение/миниатюру (также клавиши +/-) 0715 Length 0715 Длина 0716 Level 0716 Уровень 0717 Licenses 0717 Лицензии 0718 Light Source 0718 Источник света 0719 Lightness 0719 Светлота 0720 Limit 0720 Предел 0721 Line Color 0721 Цвет линии 0722 Line Threshold 0722 Порог линии 0723 Line Width 0723 Ширина линии 0724 Line length 0724 Длина линии 0725 List Fotocx command line parameters 0725 Показать параметры командной строки Fotocx 0726 List all metadata for current image or clicked thumbnail 0726 Показать все metadata для текущего изображения или выбранной миниатюры 0727 List outboard programs and functions 0727 Список внешних программ и функций 0728 Load 0728 Загрузить 0729 Load settings from file 0729 Загрузить настройки из файла 0730 Local Contrast 0730 Локальный контраст 0731 Local Retinex 0731 Локальный Retinex 0732 Location 0732 Местоположение 0733 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0733 Местоположение и страна заменят текущие значения.\nДанные GPS заменяются только при наличии нового значения. 0734 Lock 0734 Блокировать 0735 Low Amplify 0735 Слабое усиление 0736 MAGNIFY IMAGE 0736 УВЕЛИЧЕНИЕ ИЗОБРАЖЕНИЯ 0737 MAKE WAVES 0737 СОЗДАТЬ ВОЛНЫ 0738 MANAGE KEYWORDS 0738 УПРАВЛЕНИЕ KEYWORDS 0739 MAP MENU 0739 МЕНЮ КАРТЫ 0740 MAP VIEW 0740 ПРОСМОТР КАРТЫ 0741 MARGINS 0741 ПОЛЯ 0742 MARKUP 0742 РАЗМЕТКА 0743 MASHUP 0743 МОНТАЖ 0744 MATCH COLORS 0744 СОПОСТАВЛЕНИЕ ЦВЕТОВ 0745 MEASURE IMAGE 0745 ИЗМЕРЕНИЕ ИЗОБРАЖЕНИЯ 0746 MENU SHORTCUTS 0746 СОЧЕТАНИЯ КЛАВИШ МЕНЮ 0747 METADATA MENU 0747 МЕНЮ METADATA 0748 METADATA TAGS 0748 TAGS METADATA 0749 METADATA VIEW 0749 ПРОСМОТР METADATA 0750 MONITOR COLOR 0750 ЦВЕТ МОНИТОРА 0751 MOSAIC 0751 МОЗАИКА 0752 MOUSE ALT-RIGHT-BUTTON 0752 МЫШЬ ALT+ПРАВАЯ КНОПКА 0753 MOUSE FUNCTIONS 0753 ФУНКЦИИ МЫШИ 0754 MOUSE OWNERSHIP 0754 ВЛАДЕНИЕ МЫШЬЮ 0755 MOVE FOTOCX HOME 0755 ПЕРЕНОС ДОМАШНЕЙ ПАПКИ FOTOCX 0756 Magnify 0756 Увеличить 0757 Magnify Image 0757 Увеличение изображения 0758 Magnify image around the mouse position 0758 Увеличить изображение вокруг положения мыши 0759 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0759 Основной памяти недостаточно для запуска Fotocx. \nВы можете попробовать всё равно, если хотите. \n Продолжить? 0760 Make Layout Image 0760 Создать изображение макета 0761 Make Square Tiles 0761 Создать квадратные плитки 0762 Make Waves 0762 Создать волны 0763 Make a spherical projection of an image 0763 Создать сферическую проекцию изображения 0764 Make black margins transparent 0764 Сделать чёрные поля прозрачными 0765 Make new versions 0765 Создать новые версии 0766 Make width constant for window size 0766 Сделать ширину постоянной для размера окна 0767 Manage Keywords 0767 Управление Keywords 0768 Map 0768 Карта 0769 Map View 0769 Просмотр карты 0770 Maps 0770 Карты 0771 Maps: view images by map location 0771 Карты: просмотр изображений по местоположению на карте 0772 Margin 0772 Поле 0773 Margins 0773 Поля 0774 Markup 0774 Разметка 0775 Mashup 0775 Монтаж 0776 Mass update album files 0776 Массовое обновление файлов альбома 0777 Match Brightness 0777 Соответствие яркости 0778 Match Colors 0778 Сопоставление цветов 0779 Match Level 0779 Уровень соответствия 0780 Match Limit 0780 Предел соответствия 0781 Match image colors to colors of another image 0781 Сопоставить цвета изображения с цветами другого изображения 0782 Match using: 0782 Сопоставление с использованием: 0783 Matching Keywords 0783 Соответствующие Keywords 0784 Max 0784 Макс. 0785 Max. Width 0785 Макс. ширина 0786 Measure Image 0786 Измерение изображения 0787 Measure Noise 0787 Измерение шума 0788 Measure pixel distances within an image 0788 Измерить расстояния между пикселями внутри изображения 0789 Menu Colors 0789 Цвета меню 0790 Menu Style 0790 Стиль меню 0791 Metadata 0791 Metadata 0792 Metadata Tags 0792 Tags Metadata 0793 Metadata View 0793 Просмотр Metadata 0794 Metadata from Search Function 0794 Metadata из функции поиска 0795 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0795 Способ 1:\nЩелчок левой кнопкой по красному глазу для затемнения.\nСпособ 2:\nПеретащите вниз-вправо, чтобы охватить красный глаз.\nЩелчок левой кнопкой по красному глазу для затемнения.\nОтменить исправление красных глаз:\nЩелчок правой кнопкой по красному глазу. 0796 Mirror: 0796 Отражение: 0797 Mode: 0797 Режим: 0798 Monitor Color 0798 Цвет монитора 0799 Mosaic 0799 Мозаика 0800 Mouse Radius 0800 Радиус мыши 0801 Mouse Warp (drag image) 0801 Искажение мышью (перетаскивание изображения) 0802 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0802 Перетаскивание мышью: поворот изображения на 360° \nЩелчок Л/П кнопкой мыши: увеличение/уменьшение \nEscape: выйти из панорамного просмотра 0803 Move %d image files 0803 Переместить %d файлов изображений 0804 Move Fotocx Home 0804 Перенос домашней папки Fotocx 0805 Move Fotocx Home Folder 0805 Перенос домашней папки Fotocx 0806 Move Fotocx home folder to chosen folder 0806 Перенести домашнюю папку Fotocx в выбранную папку 0807 Move mouse in a monotone image area. 0807 Переместите мышь в однотонную область изображения. 0808 Multiplier 0808 Множитель 0809 NEW SESSION 0809 НОВЫЙ СЕАНС 0810 NEWEST FILES 0810 НОВЕЙШИЕ ФАЙЛЫ 0811 NEWLINE CHARACTERS IN METADATA 0811 СИМВОЛЫ ПЕРЕВОДА СТРОКИ В METADATA 0812 NON-STANDARD DIALOG WIDGETS 0812 НЕСТАНДАРТНЫЕ ЭЛЕМЕНТЫ ДИАЛОГА 0813 New Area 0813 Новая область 0814 New File Name: 0814 Новое имя файла: 0815 New Location 0815 Новое местоположение 0816 New Location: 0816 Новое местоположение: 0817 New Name 0817 Новое имя 0818 New Session 0818 Новый сеанс 0819 New Type: 0819 Новый тип: 0820 New Version 0820 Новая версия 0821 Newest 0821 Новейшие 0822 Newest Files 0822 Новейшие файлы 0823 Next 0823 Далее 0824 Next gallery 0824 Следующая галерея 0825 No 0825 Нет 0826 No curve lines found 0826 Линии кривой не найдены 0827 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0827 Индекс файлов изображений не найден.\nБудет создан индекс файлов изображений.\nВаши файлы изображений не будут изменены.\nЭто может занять значительное время, если у вас \nмного тысяч файлов изображений. 0828 No images found 0828 Изображения не найдены 0829 Noise Reduction 0829 Шумоподавление 0830 Noise Size 0830 Размер шума 0831 None 0831 Нет 0832 Normal Blur 0832 Обычное размытие 0833 Normal Blur - mix pixels with all neighbor pixels 0833 Обычное размытие — смешение пикселей со всеми соседними пикселями 0834 OPEN IMAGE FILE 0834 ОТКРЫТЬ ФАЙЛ ИЗОБРАЖЕНИЯ 0835 OTHER TOPICS 0835 ДРУГИЕ ТЕМЫ 0836 OUTLINES 0836 КОНТУРЫ 0837 Old Name 0837 Старое имя 0838 One Tag: 0838 Один tag: 0839 Opacity 0839 Непрозрачность 0840 Open 0840 Открыть 0841 Open Image File 0841 Открыть файл изображения 0842 Open a file and paste as selected area into an image 0842 Открыть файл и вставить как выбранную область в изображение 0843 Open a parallel Fotocx session 0843 Открыть параллельный сеанс Fotocx 0844 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0844 Открыть и отредактировать файл отсканированной цветовой таблицы. \nУдалите любой перекос или поворот от сканирования. \n(Используйте для этого функцию «Исправить перспективу»). \nТОЧНО обрежьте тонкое зелёное поле. \nСохраните (замените) файл цветовой таблицы. 0845 Open the trimmed color chart file 0845 Открыть обрезанный файл цветовой таблицы 0846 Optimize 0846 Оптимизировать 0847 Other Tag ... 0847 Другой tag ... 0848 Outboard Programs 0848 Внешние программы 0849 Outline Drawing 0849 Контурный рисунок 0850 Outlines 0850 Контуры 0851 Output Color 0851 Выходной цвет 0852 Overlap 0852 Перекрытие 0853 Overlay position in host image: 0853 Положение накладываемого изображения в основном изображении: 0854 Overlay width, % host image width: 0854 Ширина накладываемого изображения, % ширины основного изображения: 0855 Overwrite file? \n%s 0855 Перезаписать файл? \n%s 0856 PAINT EDITS 0856 ПРАВКИ КИСТЬЮ 0857 PAINT IMAGE 0857 РИСОВАНИЕ ПО ИЗОБРАЖЕНИЮ 0858 PAINT TRANSPARENCY 0858 РИСОВАНИЕ ПРОЗРАЧНОСТИ 0859 PAINTING 0859 ЖИВОПИСЬ 0860 PANORAMA 0860 ПАНОРАМА 0861 PATTERN 0861 УЗОР 0862 PERSPECTIVE 0862 ПЕРСПЕКТИВА 0863 PLACES/DATES 0863 МЕСТА/ДАТЫ 0864 PLUGINS 0864 ПЛАГИНЫ 0865 PREV/NEXT 0865 ПРЕДЫД./СЛЕД. 0866 PRINT CALIBRATED 0866 ПЕЧАТЬ С КАЛИБРОВКОЙ 0867 PRINT IMAGE 0867 ПЕЧАТЬ ИЗОБРАЖЕНИЯ 0868 PRIVACY 0868 КОНФИДЕНЦИАЛЬНОСТЬ 0869 PROBLEM FILES 0869 ПРОБЛЕМНЫЕ ФАЙЛЫ 0870 PROBLEM REPORTING 0870 СООБЩЕНИЕ О ПРОБЛЕМЕ 0871 Paint Edits 0871 Правки кистью 0872 Paint Edits already active 0872 «Правки кистью» уже активны 0873 Paint Image 0873 Рисование по изображению 0874 Paint Image Transparencies 0874 Рисование прозрачности изображения 0875 Paint Radius 0875 Радиус кисти 0876 Paint Transparency 0876 Рисование прозрачности 0877 Paint and Warp Image 0877 Рисование и искажение изображения 0878 Paint current edit function gradually using the mouse 0878 Постепенно наносить текущую функцию правки с помощью мыши 0879 Paint entire image 0879 Закрасить всё изображение 0880 Paint image transparency using the mouse 0880 Рисовать прозрачность изображения с помощью мыши 0881 Paint on Image 0881 Рисовать на изображении 0882 Paint on image using the mouse 0882 Рисовать на изображении с помощью мыши 0883 Paint transparency 0883 Рисовать прозрачность 0884 Paint within mouse 0884 Рисовать в пределах мыши 0885 Painting 0885 Живопись 0886 Panorama 0886 Панорама 0887 Paste 0887 Вставить 0888 Paste Image 0888 Вставить изображение 0889 Paste previously copied area into image 0889 Вставить ранее скопированную область в изображение 0890 Pattern 0890 Узор 0891 Pattern File: 0891 Файл узора: 0892 Pattern Width 0892 Ширина узора 0893 Percent 0893 Процент 0894 Permissions 0894 Разрешения 0895 Perspective 0895 Перспектива 0896 Photo Date 0896 Дата съёмки 0897 Photo Date/Time 0897 Дата/время съёмки 0898 Photo Date/Time (metadata) 0898 Дата/время съёмки (metadata) 0899 Photo Date: %s File Date: %s \n 0899 Дата съёмки: %s Дата файла: %s \n 0900 Pixel count 0900 Количество пикселей 0901 Pixel difference 0901 Разница пикселей 0902 Pixels 0902 Пикселей 0903 Places/Dates 0903 Места/Даты 0904 Plugin working ... 0904 Плагин работает ... 0905 Popup Image 0905 Всплывающее изображение 0906 Power 0906 Мощность 0907 Power Center 0907 Мощность: Центр 0908 Power: Center 0908 Мощность: Центр 0909 Pre-align Images 0909 Предварительное выравнивание изображений 0910 Preference: 0910 Настройка: 0911 Press F1 for help 0911 Нажмите F1 для справки 0912 Prev 0912 Пред. 0913 Prev/Next 0913 Пред./След. 0914 Previous 0914 Предыдущий 0915 Previous gallery 0915 Предыдущая галерея 0916 Print Calibrated 0916 Печать с калибровкой 0917 Print Image 0917 Печать изображения 0918 Print chart in vertical orientation without margins. 0918 Печать таблицы в вертикальной ориентации без полей. 0919 Print current image file with calibrated colors 0919 Напечатать текущий файл изображения с калиброванными цветами 0920 Print the current image file 0920 Напечатать текущий файл изображения 0921 Privacy 0921 Конфиденциальность 0922 Proceed 0922 Продолжить 0923 Proceed? 0923 Продолжить? 0924 Process album files matching selected files: 0924 Обработать файлы альбома, соответствующие выбранным файлам: 0925 Process an image using a custom convolution kernel 0925 Обработать изображение с помощью пользовательского ядра свёртки 0926 Process selected album files: 0926 Обработать выбранные файлы альбома: 0927 Processing files 0927 Обработка файлов 0928 Project name 0928 Название проекта 0929 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0929 Перетаскивайте положение изображения с помощью мыши. \nДелайте несколько перетаскиваний, пока не будете удовлетворены. \nПо завершении нажмите [OK]. 0930 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0930 Перетаскивайте угол изображения с помощью мыши. \nДелайте несколько перетаскиваний, пока не будете удовлетворены. \nПо завершении нажмите [OK]. 0931 Pull on the image with the mouse. 0931 Перетащите изображение мышью. 0932 Purge unwanted keywords from all image files 0932 Удалить ненужные keywords из всех файлов изображений 0933 QUESTIONS, SUGGESTIONS 0933 ВОПРОСЫ, ПРЕДЛОЖЕНИЯ 0934 Quit 0934 Выход 0935 Quit Fotocx 0935 Выйти из Fotocx 0936 Quit Fotocx? 0936 Выйти из Fotocx? 0937 RAW Files 0937 Файлы RAW 0938 RAW Options 0938 Параметры RAW 0939 RAW conversion failed: %s %s 0939 Ошибка преобразования RAW: %s %s 0940 RAW loader 0940 Загрузчик RAW 0941 RECENT FILES 0941 НЕДАВНИЕ ФАЙЛЫ 0942 RECENT FOLDERS 0942 НЕДАВНИЕ ПАПКИ 0943 RED EYES 0943 КРАСНЫЕ ГЛАЗА 0944 REFINE MENU 0944 МЕНЮ УЛУЧШЕНИЯ 0945 REMOVE DUST 0945 УДАЛИТЬ ПЫЛЬ 0946 REMOVE HALO 0946 УДАЛИТЬ ОРЕОЛ 0947 RENAME 0947 ПЕРЕИМЕНОВАТЬ 0948 RENAME ALBUM 0948 ПЕРЕИМЕНОВАТЬ АЛЬБОМ 0949 REPAIR MENU 0949 МЕНЮ ВОССТАНОВЛЕНИЯ 0950 RESCALE 0950 ИЗМЕНЕНИЕ МАСШТАБА 0951 RETOUCH 0951 РЕТУШЬ 0952 RGB -> BRG 0952 RGB -> BRG 0953 RGB -> GBR 0953 RGB -> GBR 0954 RGB HISTOGRAM 0954 ГИСТОГРАММА RGB 0955 RGB Histogram 0955 Гистограмма RGB 0956 RGB brightness histogram graph 0956 График гистограммы яркости RGB 0957 RGB color 0957 Цвет RGB 0958 RGB mix with given bit-depth 0958 Смешение RGB с заданной битовой глубиной 0959 ROTATE 0959 ПОВОРОТ 0960 RUN SCRIPT 0960 ЗАПУСТИТЬ СЦЕНАРИЙ 0961 Radial Blur 0961 Радиальное размытие 0962 Radial Blur - mix pixels in radial lines from chosen center 0962 Радиальное размытие — смешение пикселей по радиальным линиям от выбранного центра 0963 Radius 0963 Радиус 0964 Random Image 0964 Случайное изображение 0965 Range 0965 Диапазон 0966 Rating: 0966 Рейтинг: 0967 Rating: %s Size: %s %.2fmb \n 0967 Рейтинг: %s Размер: %s %.2fmb \n 0968 Read or search the user guide 0968 Прочитать или найти в руководстве пользователя 0969 Recent Files 0969 Недавние файлы 0970 Recent Folders 0970 Недавние папки 0971 Recent Keywords 0971 Недавние Keywords 0972 Rectify closeup face photo (balloon face) 0972 Выпрямить фото крупного плана лица (эффект «воздушного шара») 0973 Red 0973 Красный 0974 Red Eye Reduction 0974 Устранение красных глаз 0975 Red Eyes 0975 Красные глаза 0976 Red Factors 0976 Коэффициенты красного 0977 Redo 0977 Повторить 0978 Reduce Fog/Haze 0978 Уменьшить дымку/туман 0979 Reduce fog/haze in an image or selected areas 0979 Уменьшить дымку/туман на изображении или в выбранных областях 0980 Refine 0980 Улучшение 0981 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0981 Улучшение: выравнивание гистограммы, локальный контраст, усиление контраста, retinex, насыщенность 0982 Remove 0982 Удалить 0983 Remove Dust 0983 Удалить пыль 0984 Remove Halo 0984 Удалить ореол 0985 Remove dust spots from old scanned photos 0985 Удалить пятна пыли со старых сканированных фото 0986 Remove from Album 0986 Удалить из альбома 0987 Remove halos left by some edit functions 0987 Удалить ореолы, оставленные некоторыми функциями правки 0988 Remove image curvature, especially in panoramas 0988 Удалить искривление изображения, особенно на панорамах 0989 Remove jaggies on hard image feature edges 0989 Удалить зазубрины на жёстких краях элементов изображения 0990 Remove selected image metadata 0990 Удалить выбранные metadata изображения 0991 Remove unwanted objects in an image 0991 Удалить нежелательные объекты на изображении 0992 Rename 0992 Переименовать 0993 Rename Album 0993 Переименовать альбом 0994 Rename Image File 0994 Переименовать файл изображения 0995 Rename an existing album 0995 Переименовать существующий альбом 0996 Rename or delete keywords for all image files 0996 Переименовать или удалить keywords для всех файлов изображений 0997 Rename to 0997 Переименовать в 0998 Rename/convert/rescale/move selected image or RAW files 0998 Переименовать/преобразовать/изменить масштаб/переместить выбранные изображения или файлы RAW 0999 Repair 0999 Восстановить 1000 Repair malformed metadata preventing metadata edits 1000 Исправить повреждённые metadata, мешающие редактированию metadata 1001 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 1001 Восстановление: резкость, размытие, шумоподавление, удаление дымки, красные глаза, умное удаление, коррекция цвета 1002 Replace 1002 Заменить 1003 Replace Text 1003 Заменить текст 1004 Replace all versions with newest version 1004 Заменить все версии новейшей версией 1005 Replace all versions with selected versions 1005 Заменить все версии выбранными версиями 1006 Replace all with newest version only 1006 Заменить всё только новейшей версией 1007 Replace all with original + newest version 1007 Заменить всё оригиналом + новейшей версией 1008 Replace all with original + selected versions 1008 Заменить всё оригиналом + выбранными версиями 1009 Replace all with original and all versions 1009 Заменить всё оригиналом и всеми версиями 1010 Replace all with selected versions 1010 Заменить всё выбранными версиями 1011 Replace host files 1011 Заменить файлы-носители 1012 Report Image Places/Dates 1012 Отчёт по местам/датам изображений 1013 Report selected metadata for selected image files 1013 Отчёт по выбранным metadata для выбранных файлов изображений 1014 Required programs are installed. \n 1014 Необходимые программы установлены. \n 1015 Rescale 1015 Изменить масштаб 1016 Rescale Image 1016 Изменить масштаб изображения 1017 Rescale RGB levels to reduce color caste and fog/haze 1017 Изменить масштаб уровней RGB для уменьшения цветового оттенка и дымки/тумана 1018 Rescale brightness levels to increase local contrast 1018 Изменить масштаб уровней яркости для повышения локального контраста 1019 Rescale: 1019 Масштаб: 1020 Reserved Shortcuts \n 1020 Зарезервированные сочетания клавиш \n 1021 Reserved shortcut ignored: %s 1021 Зарезервированное сочетание клавиш проигнорировано: %s 1022 Reset 1022 Сброс 1023 Reset all galleries to file name ascending 1023 Сбросить все галереи к сортировке по имени файла (по возрастанию) 1024 Resolution 1024 Разрешение 1025 Resources 1025 Ресурсы 1026 Resume 1026 Продолжить 1027 Retouch 1027 Ретушь 1028 Reverse R 1028 Обратный R 1029 Richardson-Lucy 1029 Ричардсон-Люси 1030 Right 1030 Справа 1031 Rim % 1031 Кайма % 1032 Rotate 1032 Повернуть 1033 Rotate Image 1033 Повернуть изображение 1034 Rotate or level an image 1034 Повернуть или выровнять изображение 1035 Rotate: 1035 Поворот: 1036 Roy Lichtenstein effect 1036 Эффект Роя Лихтенштейна 1037 SATURATION 1037 НАСЫЩЕННОСТЬ 1038 SCRIPT FILES 1038 ФАЙЛЫ СЦЕНАРИЯ 1039 SEARCH IMAGES 1039 ПОИСК ИЗОБРАЖЕНИЙ 1040 SELECT AREA 1040 ВЫБОР ОБЛАСТИ 1041 SELECT FILES 1041 ВЫБОР ФАЙЛОВ 1042 SELECT IMAGE FILES 1042 ВЫБОР ФАЙЛОВ ИЗОБРАЖЕНИЙ 1043 SELECT MENU 1043 МЕНЮ ВЫБОРА 1044 SET COLORS 1044 УСТАНОВИТЬ ЦВЕТА 1045 SET WALLPAPER 1045 УСТАНОВИТЬ ОБОИ 1046 SETTINGS 1046 НАСТРОЙКИ 1047 SHARPEN 1047 РЕЗКОСТЬ 1048 SHIFT COLORS 1048 СМЕЩЕНИЕ ЦВЕТОВ 1049 SHORTCUTS 1049 СОЧЕТАНИЯ КЛАВИШ 1050 SHOW CIM FILES 1050 ПОКАЗАТЬ ФАЙЛЫ CIM 1051 SHOW DIFFS 1051 ПОКАЗАТЬ РАЗЛИЧИЯ 1052 SHOW ON MAP 1052 ПОКАЗАТЬ НА КАРТЕ 1053 SHOW RESOURCES 1053 ПОКАЗАТЬ РЕСУРСЫ 1054 SHOW RGB 1054 ПОКАЗАТЬ RGB 1055 SHOW/HIDE AREA 1055 ПОКАЗАТЬ/СКРЫТЬ ОБЛАСТЬ 1056 SKETCH1 1056 НАБРОСОК1 1057 SKETCH2 1057 НАБРОСОК2 1058 SLIDE SHOW 1058 СЛАЙД-ШОУ 1059 SLIDES AND NEGATIVES 1059 СЛАЙДЫ И НЕГАТИВЫ 1060 SLIDESHOW END 1060 КОНЕЦ СЛАЙД-ШОУ 1061 SMART ERASE 1061 УМНОЕ УДАЛЕНИЕ 1062 SOFT FOCUS 1062 МЯГКИЙ ФОКУС 1063 SPHERE 1063 СФЕРА 1064 SPLIT-SCREEN 1064 РАЗДЕЛЁННЫЙ ЭКРАН 1065 STACK/LAYERS 1065 СТЕК/СЛОИ 1066 STACK/NOISE 1066 СТЕК/ШУМ 1067 STACK/PAINT 1067 СТЕК/ЖИВОПИСЬ 1068 Saturation 1068 Насыщенность 1069 Save 1069 Сохранить 1070 Save Gallery as Album 1070 Сохранить галерею как альбом 1071 Save Image File 1071 Сохранить файл изображения 1072 Save as new file name or type 1072 Сохранить под новым именем или типом файла 1073 Save current gallery as album 1073 Сохранить текущую галерею как альбом 1074 Save modified image as new file or new file version 1074 Сохранить изменённое изображение как новый файл или новую версию файла 1075 Save selected area to a file with transparency 1075 Сохранить выбранную область в файл с прозрачностью 1076 Saved Areas 1076 Сохранённые области 1077 Scale 1077 Масштаб 1078 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1078 Отсканируйте напечатанную цветовую таблицу, самый тёмный ряд сверху. \nСохраните как файл .png, используя названия принтера и бумаги \n(например, %s/Epson_glossy.png). \n 1079 Search 1079 Поиск 1080 Search Images 1080 Поиск изображений 1081 Search Results 1081 Результаты поиска 1082 Search all image files and report duplicates 1082 Найти во всех файлах изображений и сообщить о дубликатах 1083 Searching - use ESC key to terminate 1083 Идёт поиск — нажмите ESC для остановки 1084 Seconds 1084 Секунды 1085 Select 1085 Выбрать 1086 Select %d to %d files 1086 Выбрать от %d до %d файлов 1087 Select Album 1087 Выбрать альбом 1088 Select Albums 1088 Выбрать альбомы 1089 Select Area 1089 Выбрать область 1090 Select Area for Edits 1090 Выбрать область для правок 1091 Select Area not supported \nby this edit function 1091 «Выбор области» не поддерживается \nэтой функцией правки 1092 Select Files 1092 Выбрать файлы 1093 Select Image 1093 Выбрать изображение 1094 Select Image Files 1094 Выбрать файлы изображений 1095 Select Metadata tags 1095 Выбрать tags metadata 1096 Select Script 1096 Выбрать сценарий 1097 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1097 Выберите область для искажения с помощью функции выбора области. \nНажмите [начать искажение] и потяните область мышью. \nСделайте несколько перетаскиваний мышью, пока не будете удовлетворены. \nПо завершении выберите другую область или нажмите [OK]. 1098 Select and Paint Image 1098 Выбрать и раскрасить изображение 1099 Select and view an image file 1099 Выбрать и просмотреть файл изображения 1100 Select area cannot be kept.\nContinue? 1100 Выбранную область нельзя сохранить.\nПродолжить? 1101 Select area disabled, Continue? 1101 Выбор области отключён, продолжить? 1102 Select area not finished, Continue? 1102 Выбор области не завершён, продолжить? 1103 Select area will be ignored. \nContinue? 1103 Выбранная область будет проигнорирована. \nПродолжить? 1104 Select folder 1104 Выбрать папку 1105 Select host image files 1105 Выбрать основные файлы изображений 1106 Select image areas to edit separately, copy/paste selections 1106 Выбрать области изображения для раздельного редактирования, копирования/вставки выделений 1107 Select image objects or areas for separate editing 1107 Выбрать объекты или области изображения для раздельного редактирования 1108 Select input files for subsequent function 1108 Выбрать входные файлы для следующей функции 1109 Select overlay file 1109 Выбрать файл наложения 1110 Select startup album 1110 Выбрать стартовый альбом 1111 Select startup folder 1111 Выбрать стартовую папку 1112 Select startup image file 1112 Выбрать стартовый файл изображения 1113 Select the image file to print. 1113 Выберите файл изображения для печати. 1114 Select to add, click on X to delete. 1114 Выберите, чтобы добавить, щёлкните X, чтобы удалить. 1115 Select two files 1115 Выбрать два файла 1116 Select versions, ratings, keywords, filename text 1116 Выбрать версии, рейтинги, keywords, текст имени файла 1117 Separation Horz 1117 Разделение по горизонтали 1118 Sequence Numbers 1118 Порядковые номера 1119 Set Colors 1119 Установить цвета 1120 Set No. of Colors 1120 Установить количество цветов 1121 Set Ratio: 1121 Задать соотношение: 1122 Set Wallpaper 1122 Установить обои 1123 Set Width: 1123 Задать ширину: 1124 Set and view bookmarks, select for gallery view 1124 Задать и просмотреть закладки, выбрать для просмотра галереи 1125 Set black-white/color, negative/positive, sepia 1125 Задать чёрно-белый/цветной, негатив/позитив, сепию 1126 Set foreground line color (crop, grid, select, warp) 1126 Задать цвет линии переднего плана (обрезка, сетка, выбор, искажение) 1127 Set gallery from latest search results 1127 Задать количество линий сетки по горизонтали/вертикали 1128 Set gallery from recent folders list 1128 Установить файл изображения как обои рабочего стола 1129 Set gallery to folder of current file 1129 Задать галерею по последним результатам поиска 1130 Set horizontal/vertical grid line counts 1130 Задать галерею по списку недавних папок 1131 Set image file as desktop wallpaper 1131 Задать галерею как папку текущего файла 1132 Set line properties, [Add] to layout, edit. 1132 Задать количество горизонтальных/вертикальных линий сетки 1133 Set number of colors for each R/G/B or total 1133 Задать свойства линии, [Добавить] в макет, редактировать. 1134 Set or shift photo date/time for selected image files 1134 Задать количество цветов для каждого R/G/B или всего 1135 Set the name for the output calibration file \n[your calibration name].dat 1135 Задать или сдвинуть дату/время съёмки для выбранных файлов изображений 1136 Settings 1136 Задайте имя для выходного файла калибровки \n[имя вашей калибровки].dat 1137 Sharpen 1137 Настройки 1138 Sharpen the image (various methods) 1138 Резкость 1139 Shift + drag mouse across image \nto indicate blur direction 1139 Повысить резкость изображения (различными методами) 1140 Shift Colors 1140 Удерживайте Shift и перетащите мышь по изображению, \nчтобы указать направление размытия 1141 Shift/convert image colors into other colors 1141 Смещение цветов 1142 Short List 1142 Сдвинуть/преобразовать цвета изображения в другие цвета 1143 Show 1143 Краткий список 1144 Show (outline) selected areas 1144 Показать 1145 Show CIM Files 1145 Показать (контур) выбранные области 1146 Show Diffs 1146 Показать файлы CIM 1147 Show Fotocx installed version and author contact 1147 Показать различия 1148 Show Fotocx updates for recent releases 1148 Показать установленную версию Fotocx и контакты автора 1149 Show Hidden 1149 Показать обновления Fotocx для последних выпусков 1150 Show Log File 1150 Показать скрытые 1151 Show RGB 1151 Показать файл журнала 1152 Show RGB levels at mouse position 1152 Показать RGB 1153 Show Resources 1153 Показать уровни RGB в положении мыши 1154 Show folder hierarchy, click folder for gallery view 1154 Показать ресурсы 1155 Show image counts in year/month table, select, report 1155 Показать иерархию папок, щёлкните папку для просмотра галереи 1156 Show image description (overlap) 1156 Показать количество изображений в таблице год/месяц, выбрать, отчёт 1157 Show image differences on the image 1157 Показать описание изображения (наложение) 1158 Show image file name (overlap) 1158 Показать различия изображения на изображении 1159 Show image title (overlap) 1159 Показать имя файла изображения (наложение) 1160 Show input files used in combine function 1160 Показать заголовок изображения (наложение) 1161 Show key metadata for current image or clicked thumbnail 1161 Показать входные файлы, использованные в функции объединения 1162 Show map position of the current image file 1162 Показать ключевые metadata для текущего изображения или выбранной миниатюры 1163 Show memory and CPU resources used 1163 Показать положение на карте текущего файла изображения 1164 Show on Map 1164 Показать используемые ресурсы памяти и процессора 1165 Show or make Keyboard Shortcuts 1165 Показать на карте 1166 Show the current (last used) album 1166 Показать или создать сочетания клавиш 1167 Show the current log file 1167 Показать текущий (последний использованный) альбом 1168 Size 1168 Показать текущий файл журнала 1169 Sketch1 1169 Размер 1170 Sketch2 1170 Набросок1 1171 Slide Show 1171 Набросок2 1172 Smart Erase 1172 Слайд-шоу 1173 Soft Focus 1173 Умное удаление 1174 Sphere 1174 Мягкий фокус 1175 Spherical Projection 1175 Сфера 1176 Split-Screen 1176 Сферическая проекция 1177 Stack/Layers 1177 Разделённый экран 1178 Stack/Noise 1178 Стек/слои 1179 Stack/Paint 1179 Стек/шум 1180 Stacking Order 1180 Стек/живопись 1181 Start 1181 Порядок наложения 1182 Start a slide show 1182 Начать 1183 Start of gallery 1183 Начать слайд-шоу 1184 Startup View 1184 Начало галереи 1185 Stop 1185 Начальный вид 1186 Stretch 1186 Стоп 1187 Stretch: 1187 Растянуть 1188 Suppress JPEG compression artifacts 1188 Растяжение: 1189 Suppress Ringing 1189 Подавить артефакты сжатия JPEG 1190 Suppress fine details while retaining sharpness 1190 Подавление звона 1191 Suppress noise from low-light photos 1191 Подавить мелкие детали, сохраняя резкость 1192 Survey all files 1192 Подавить шум от фото при слабом освещении 1193 TEXTURE 1193 Обследовать все файлы 1194 THUMB VIEW 1194 ТЕКСТУРА 1195 TILES1 1195 ПРОСМОТР МИНИАТЮР 1196 TILES2 1196 ПЛИТКИ1 1197 TIMELINE 1197 ПЛИТКИ2 1198 TINY PLANET 1198 ХРОНОЛОГИЯ 1199 TOOLS MENU 1199 КРОШЕЧНАЯ ПЛАНЕТА 1200 TRANSLATIONS 1200 МЕНЮ ИНСТРУМЕНТОВ 1201 TWIST 1201 ЗАКРУЧИВАНИЕ 1202 Temperature 1202 Температура 1203 Text 1203 Текст 1204 Text File: 1204 Текстовый файл: 1205 Texture 1205 Текстура 1206 Threshold 1206 Порог 1207 Threshold: Low 1207 Порог: низкий 1208 Thumbnail View 1208 Просмотр миниатюр 1209 Thumbnail size 1209 Размер миниатюры 1210 Thumbnails folder 1210 Папка миниатюр 1211 Thumbnails folder: %s \nPlease remove. 1211 Папка миниатюр: %s \nПожалуйста, удалите. 1212 Thumbnails folder: \n %s \nmust be named .../thumbnails 1212 Папка миниатюр: \n %s \nдолжна называться .../thumbnails 1213 Thumbnails: 1213 Миниатюры: 1214 Tile 1214 Плитка 1215 Tile blending 1215 Смешение плиток 1216 Tile image with a repeating pattern 1216 Замостить изображение повторяющимся узором 1217 Tiles 1217 Плитки 1218 Tiles1 1218 Плитки1 1219 Tiles2 1219 Плитки2 1220 Timeline 1220 Хронология 1221 Tiny Planet 1221 Крошечная планета 1222 Title 1222 Заголовок 1223 Title: %s\n 1223 Заголовок: %s\n 1224 To Location 1224 К местоположению 1225 Toggle Captions 1225 Переключить подписи 1226 Toggle Grid 1226 Переключить сетку 1227 Toggle grid lines on and off 1227 Включить/выключить линии сетки 1228 Toggle image metadata display ON/OFF 1228 Включить/выключить отображение metadata изображения 1229 Too little overlap, cannot align 1229 Слишком мало перекрытия, выравнивание невозможно 1230 Too many edits, please save image 1230 Слишком много правок, сохраните изображение 1231 Tools 1231 Инструменты 1232 Tools: image index, settings, shortcuts, grid, find duplicates 1232 Инструменты: индекс изображений, настройки, сочетания клавиш, сетка, поиск дубликатов 1233 Top 1233 Сверху 1234 Total Colors 1234 Всего цветов 1235 Trace 1235 Трассировка 1236 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1236 Трассируйте верхнюю и нижнюю кривые \nщелчками мыши, затем [выровнять]. 1237 Transient Objects 1237 Временные объекты 1238 Transition Preferences 1238 Настройки перехода 1239 Transition to next image 1239 Переход к следующему изображению 1240 Transitions File 1240 Файл переходов 1241 Transp. 1241 Прозр. 1242 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1242 Карта прозрачности будет утеряна \n(сохраните как TIFF|PNG|JXL, чтобы сохранить) \nВсё равно сохранить? 1243 Trash 1243 Корзина 1244 Trash read-only file? 1244 Удалить в корзину файл только для чтения? 1245 Turn an image inside-out 1245 Вывернуть изображение наизнанку 1246 Twist 1246 Закручивание 1247 Twist image centered at mouse position 1247 Закрутить изображение вокруг положения мыши 1248 UNBEND 1248 ВЫПРЯМИТЬ 1249 UNDO/REDO BUTTON 1249 КНОПКА ОТМЕНИТЬ/ПОВТОРИТЬ 1250 UNWARP CLOSEUP 1250 РАСКРУТИТЬ КРУПНЫЙ ПЛАН 1251 UPDATE ALBUMS 1251 ОБНОВИТЬ АЛЬБОМЫ 1252 UPRIGHT 1252 ВЫПРЯМЛЕНИЕ 1253 USER GUIDE 1253 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ 1254 Unable to copy metadata 1254 Не удалось скопировать metadata 1255 Unbend 1255 Выпрямить 1256 Undo 1256 Отменить 1257 Undo All 1257 Отменить всё 1258 Undo Last 1258 Отменить последнее 1259 Undo/Redo 1259 Отменить/повторить 1260 Uninstall 1260 Удалить программу 1261 Unwarp Closeup 1261 Раскрутить крупный план 1262 Update Albums 1262 Обновить альбомы 1263 Update albums for new file versions 1263 Обновить альбомы для новых версий файлов 1264 Upright 1264 Выпрямление 1265 Upright Image 1265 Выпрямление изображения 1266 Upright or mirror-flip an image 1266 Выпрямить или отразить изображение 1267 Upright rotated image files, selected set or ALL 1267 Выпрямить файлы повёрнутых изображений, выбранный набор или ВСЕ 1268 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1268 Используйте «Выбор области», чтобы выбрать лицо. \nЩёлкните по центру искажения. \nПередвиньте ползунок. \n 1269 Use [Select] to add files to an empty album 1269 Используйте [Выбрать], чтобы добавить файлы в пустой альбом 1270 Use metadata photo date or file modification date? 1270 Использовать дату съёмки из metadata или дату изменения файла? 1271 Use metadata tag 1271 Использовать tag metadata 1272 Use settings file 1272 Использовать файл настроек 1273 User Guide 1273 Руководство пользователя 1274 User preferences and settings 1274 Пользовательские настройки и параметры 1275 VIDEO press P to play 1275 ВИДЕО нажмите P для воспроизведения 1276 VIEW 360° PANO 1276 ПРОСМОТР 360° ПАНОРАМЫ 1277 VIEW ALL META 1277 ПРОСМОТР ВСЕХ META 1278 VIEW MAIN META 1278 ПРОСМОТР ОСНОВНЫХ META 1279 VIGNETTE 1279 ВИНЬЕТКА 1280 Var. Transparency 1280 Перем. прозрачность 1281 Vert 1281 По верт. 1282 Video Files 1282 Видеофайлы 1283 Video Tutorial 1283 Видеоурок 1284 Video command 1284 Команда видео 1285 View 360 degree panorama image 1285 Просмотреть панорамное изображение 360 градусов 1286 View 360° Pano 1286 Просмотр 360° панорамы 1287 View All Meta 1287 Просмотр всех Meta 1288 View All Metadata 1288 Просмотр всех Metadata 1289 View Main Meta 1289 Просмотр основных Meta 1290 View Main Metadata 1290 Просмотр основных Metadata 1291 View before/after images using split-screen 1291 Просмотр изображений до/после в режиме разделённого экрана 1292 View/edit metadata, image report and search functions 1292 Просмотр/редактирование metadata, отчёт по изображениям и функции поиска 1293 Vignette 1293 Виньетка 1294 W/H Ratio: 1294 Соотношение Ш/В: 1295 WARP AFFINE 1295 ИСКАЖЕНИЕ АФФИННОЕ 1296 WARP AREA 1296 ИСКАЖЕНИЕ ОБЛАСТИ 1297 WARP CURVED 1297 ИСКРИВЛЁННОЕ ИСКАЖЕНИЕ 1298 WARP IMAGE 1298 ИСКАЖЕНИЕ ИЗОБРАЖЕНИЯ 1299 WARP MENU 1299 МЕНЮ ИСКАЖЕНИЯ 1300 WARP RADIAL 1300 РАДИАЛЬНОЕ ИСКАЖЕНИЕ 1301 WINDOW VIEWS AND MENUS 1301 ВИД ОКОН И МЕНЮ 1302 WORLD MAP 1302 КАРТА МИРА 1303 Wait after zoom 1303 Пауза после zoom 1304 Wait before filename/title/description 1304 Пауза перед именем файла/заголовком/описанием 1305 Wait before zoom 1305 Пауза перед zoom 1306 Warp 1306 Искажение 1307 Warp Affine 1307 Аффинное искажение 1308 Warp Area 1308 Искажение области 1309 Warp Curved 1309 Искривлённое искажение 1310 Warp Image 1310 Искажение изображения 1311 Warp Linear1 1311 Линейное искажение 1 1312 Warp Linear2 1312 Линейное искажение 2 1313 Warp Radial 1313 Радиальное искажение 1314 Warp an image with a wave pattern 1314 Исказить изображение волновым узором 1315 Warp image (affine) using the mouse 1315 Исказить изображение (аффинно) с помощью мыши 1316 Warp image (curved) using the mouse 1316 Исказить изображение (искривлённо) с помощью мыши 1317 Warp image (linear 1) using the mouse 1317 Исказить изображение (линейно 1) с помощью мыши 1318 Warp image (linear 2) using the mouse 1318 Исказить изображение (линейно 2) с помощью мыши 1319 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1319 Искажение: выпрямить, исправить перспективу, исказить, раскрутить крупный план, выровнять, трансформации изображения 1320 White 1320 Белый 1321 Widen: 1321 Расширить: 1322 Width 1322 Ширина 1323 Width % 1323 Ширина % 1324 X-size 1324 Размер по X 1325 Yes 1325 Да 1326 ZOOM 1326 ZOOM 1327 Zoom 1327 Zoom 1328 Zoom Center 1328 Центр zoom 1329 Zoom Speed 1329 Скорость zoom 1330 Zoom-in 1330 Увеличить (zoom-in) 1331 Zoom-out 1331 Уменьшить (zoom-out) 1332 \n %d-bits/color 1332 \n %d бит/цвет 1333 \n *** CANCELED \n 1333 \n *** ОТМЕНЕНО \n 1334 \n *** COMPLETED \n 1334 \n *** ЗАВЕРШЕНО \n 1335 \n *** Delete Originals *** 1335 \n *** Удалить оригиналы *** 1336 \n *** Keep Originals *** 1336 \n *** Оставить оригиналы *** 1337 \n *** Replace Originals *** 1337 \n *** Заменить оригиналы *** 1338 \n Convert to %s 1338 \n Преобразовать в %s 1339 \n Copy Metadata 1339 \n Копировать Metadata 1340 \n Downsize within %dx%d 1340 \n Уменьшить в пределах %dx%d 1341 \n New Location: %s 1341 \n Новое местоположение: %s 1342 \n Output to %s 1342 \n Вывод в %s 1343 \n PROCEED? 1343 \n ПРОДОЛЖИТЬ? 1344 \n Rename to %s 1344 \n Переименовать в %s 1345 \n Replace text: %s --> %s 1345 \n Заменить текст: %s --> %s 1346 \n Rescale to %sx 1346 \n Изменить масштаб до %sx 1347 \n Update Albums 1347 \n Обновить альбомы 1348 \n Upsize within %dx%d 1348 \n Увеличить в пределах %dx%d 1349 \n*** CANCELED \n 1349 \n*** ОТМЕНЕНО \n 1350 \n*** COMPLETED \n 1350 \n*** ЗАВЕРШЕНО \n 1351 \n\nPROCEED? 1351 \n\nПРОДОЛЖИТЬ? 1352 add 1352 добавить 1353 add after old 1353 добавить после старого 1354 add all gallery files to list 1354 добавить все файлы галереи в список 1355 add current file to list 1355 добавить текущий файл в список 1356 add entered text to layout 1356 добавить введённый текст в макет 1357 add images to layout 1357 добавить изображения в макет 1358 add line/arrow to layout 1358 добавить линию/стрелку в макет 1359 add new keyword 1359 добавить новый keyword 1360 add or edit images 1360 добавить или изменить изображения 1361 add or edit lines/arrows 1361 добавить или изменить линии/стрелки 1362 add or edit text 1362 добавить или изменить текст 1363 add to set 1363 добавить в набор 1364 adder 1364 adder 1365 adjust brightness of selected image 1365 настроить яркость выбранного изображения 1366 after removal of missing files: %d \n 1366 после удаления отсутствующих файлов: %d \n 1367 album %s: deleted 1367 альбом %s: удалён 1368 album already exists: %s 1368 альбом уже существует: %s 1369 album mass update 1369 массовое обновление альбома 1370 albums folder missing 1370 отсутствует папка альбомов 1371 align and trim color chart 1371 выровнять и обрезать цветовую таблицу 1372 all files 1372 все файлы 1373 all image files, including unmounted folders: %d \n 1373 все файлы изображений, включая неподключённые папки: %d \n 1374 all images 1374 все изображения 1375 all versions 1375 все версии 1376 amplify contrast 1376 усилить контраст 1377 amplitude 1377 амплитуда 1378 angle 1378 угол 1379 apply 1379 применить 1380 area edge creep 1380 смещение края области 1381 area is not finished 1381 область не завершена 1382 area outline color: 1382 цвет контура области: 1383 array width is too large: %d x %d 1383 ширина массива слишком велика: %d x %d 1384 ascending 1384 по возрастанию 1385 auto color 1385 автоцвет 1386 background colors for file and gallery view windows 1386 цвета фона окон просмотра файлов и галереи 1387 backing 1387 подложка 1388 bad category name 1388 недопустимое имя категории 1389 bad keyword name 1389 недопустимое имя keyword 1390 bad pattern file: %s 1390 недопустимый файл узора: %s 1391 base 1391 base 1392 base and adder need $s plugin 1392 base и adder требуют плагин $s 1393 base size 1393 базовый размер 1394 begin making a script file 1394 начать создание файла сценария 1395 black/white 1395 чёрно-белое 1396 black/white negative 1396 чёрно-белый негатив 1397 black/white positive 1397 чёрно-белый позитив 1398 blend 1398 смешение 1399 blend edges: blend width: 1399 смешение краёв: ширина смешения: 1400 blend image overlaps over pixel width 1400 смешение перекрытий изображения по ширине в пикселях 1401 blend rate: center: 1401 степень смешения: центр: 1402 blocking function: %s 1402 блокирующая функция: %s 1403 blocksize 1403 размер блока 1404 blur edges: blur width: 1404 размытие краёв: ширина размытия: 1405 blur radius 1405 радиус размытия 1406 borders 1406 границы 1407 both 'All Files' and specific files were selected 1407 выбраны и «Все файлы», и отдельные файлы 1408 bright halo 1408 яркий ореол 1409 brightness rescale 1409 масштабирование яркости 1410 browse 1410 обзор 1411 brush size 1411 размер кисти 1412 build index, old files only 1412 построить индекс только для старых файлов 1413 cancel project 1413 отменить проект 1414 cancel project? 1414 отменить проект? 1415 cannot allocate %d MB memory 1415 не удалось выделить %d МБ памяти 1416 cannot be determined 1416 не удалось определить 1417 cannot copy a file to itself 1417 нельзя скопировать файл в самого себя 1418 cannot copy current file 1418 нельзя скопировать текущий файл 1419 cannot create output file 1419 не удалось создать выходной файл 1420 cannot create pixbuf 1420 не удалось создать pixbuf 1421 cannot find area outline 1421 не удалось найти контур области 1422 cannot find output file 1422 не удалось найти выходной файл 1423 cannot load input file 1423 не удалось загрузить входной файл 1424 cannot open file %s 1424 не удалось открыть файл %s 1425 cannot parse current file 1425 не удалось разобрать текущий файл 1426 cannot parse file 1426 не удалось разобрать файл 1427 cannot read pluging output file 1427 не удалось прочитать выходной файл плагина 1428 cannot replace %s file 1428 не удалось заменить файл %s 1429 cannot save as RAW type 1429 нельзя сохранить в формате RAW 1430 cannot save layout file: %s 1430 не удалось сохранить файл макета: %s 1431 cannot write image folders file: %s 1431 не удалось записать файл папок изображений: %s 1432 category %s has too many keywords 1432 в категории %s слишком много keywords 1433 category %s is too big 1433 категория %s слишком большая 1434 center 1434 центр 1435 change project scale 1435 изменить масштаб проекта 1436 choose 1-8 clicks or [+] keys for 2x image zoom 1436 выберите 1-8 щелчков или клавиши [+] для 2-кратного zoom изображения 1437 choose a better spot 1437 выберите точку получше 1438 choose an image file 1438 выберите файл изображения 1439 choose file 1439 выбрать файл 1440 choose files 1440 выбрать файлы 1441 choose folder 1441 выбрать папку 1442 choose folders 1442 выбрать папки 1443 choose location 1443 выбрать местоположение 1444 circle 1444 круг 1445 clear area selections 1445 очистить выбор областей 1446 clear entered text 1446 очистить введённый текст 1447 clear inputs 1447 очистить ввод 1448 clear text 1448 очистить текст 1449 click a defined keyword (below) to add a search keyword 1449 щёлкните по определённому keyword (ниже), чтобы добавить keyword для поиска 1450 click bright point 1450 щёлкните по яркой точке 1451 click dark point 1451 щёлкните по тёмной точке 1452 click on desired color 1452 щёлкните по нужному цвету 1453 click on image to get source color 1453 щёлкните по изображению, чтобы взять исходный цвет 1454 click on image to set matching color 1454 щёлкните по изображению, чтобы задать соответствующий цвет 1455 click on thumbnail to set zoom center 1455 щёлкните по миниатюре, чтобы задать центр zoom 1456 click position to add line 1456 щёлкните по позиции, чтобы добавить линию 1457 click position to add text 1457 щёлкните по позиции, чтобы добавить текст 1458 click to select 1458 щёлкните, чтобы выбрать 1459 click to unselect 1459 щёлкните, чтобы снять выбор 1460 clicks per 2x image increase 1460 щелчков на 2-кратное увеличение изображения 1461 color 1461 цвет 1462 color depth 1462 глубина цвета 1463 color depth: 1463 глубина цвета: 1464 color match level % 1464 уровень соответствия цвета % 1465 color negative 1465 цветной негатив 1466 column difference: %d pixels 1466 разница столбцов: %d пикселей 1467 column difference: %d pixels \nMake columns even? 1467 разница столбцов: %d пикселей \nВыровнять столбцы? 1468 combined image files 1468 объединённые файлы изображений 1469 command: 1469 команда: 1470 commit all changes, close dialog 1470 подтвердить все изменения, закрыть диалог 1471 complete file selection first 1471 сначала завершите выбор файлов 1472 completed 1472 завершено 1473 condense into color blobs 1473 сгруппировать в цветовые пятна 1474 condition 1474 условие 1475 confirm Fotocx exit 1475 подтвердить выход из Fotocx 1476 constant blur 1476 постоянное размытие 1477 continue? 1477 продолжить? 1478 converting colors... 1478 преобразование цветов... 1479 converting files 1479 преобразование файлов 1480 copy (duplicate file) 1480 копировать (дублировать файл) 1481 copy and paste commands 1481 команды копирования и вставки 1482 copy files to %s 1482 копировать файлы в %s 1483 copy metadata from Nth file: 1483 копировать metadata из N-го файла: 1484 copy to Desktop failed: %s 1484 не удалось скопировать на рабочий стол: %s 1485 count: 0 1485 количество: 0 1486 create folder 1486 создать папку 1487 create folder %s 1487 создать папку %s 1488 current gallery 1488 текущая галерея 1489 current image files found: %d \n 1489 найдено текущих файлов изображений: %d \n 1490 current set only 1490 только текущий набор 1491 current set: 1491 текущий набор: 1492 curve file is invalid 1492 файл кривой недопустим 1493 custom command to play video files 1493 пользовательская команда для воспроизведения видеофайлов 1494 dark 1494 тёмный 1495 dark halo 1495 тёмный ореол 1496 dark pixels 1496 тёмные пиксели 1497 data is incomplete, proceed? 1497 данные неполные, продолжить? 1498 date format is yyyy:mm:dd [hh:mm:ss] 1498 формат даты: yyyy:mm:dd [hh:mm:ss] 1499 date range 1499 диапазон дат 1500 days 1500 дней 1501 delete 1501 удалить 1502 delete %s \n%s 1502 удалить %s \n%s 1503 delete Mashup project files? 1503 удалить файлы проекта Mashup? 1504 delete failed: \n%s 1504 ошибка удаления: \n%s 1505 delete originals specified but no new name given 1505 указано удаление оригиналов, но новое имя не задано 1506 delete selected text from layout 1506 удалить выбранный текст из макета 1507 deleting orphan thumbnails ... \n 1507 удаление лишних миниатюр ... \n 1508 depth 1508 глубина 1509 descending 1509 по убыванию 1510 direction of light and shadows 1510 направление света и теней 1511 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1511 отключить выбор миниатюр, чтобы включить всплывающие меню и т. д. \nиспользуйте [Включить], чтобы возобновить выбор миниатюр 1512 discard changes? 1512 отменить изменения? 1513 do not warp images during auto-alignment 1513 не искажать изображения при автовыравнивании 1514 do nothing 1514 ничего не делать 1515 dot size 1515 размер точки 1516 downsize 1516 уменьшить 1517 drag image 1517 перетащить изображение 1518 drag mouse along an edge to follow the edge 1518 перетащите мышь вдоль края, чтобы следовать по краю 1519 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1519 перетащите мышь вниз-вправо, чтобы нарисовать овал \nshift + перетаскивание центра для перемещения овала \nshift + перетаскивание нижнего правого края для изменения 1520 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1520 перетащите мышь, чтобы нарисовать прямоугольник \nshift + перетаскивание центра для перемещения прямоугольника \nshift + перетаскивание края для перемещения края 1521 drag mouse to outline an area 1521 перетащите мышь, чтобы обвести область 1522 drag mouse to select circular or elliptical area 1522 перетащите мышь, чтобы выбрать круглую или эллиптическую область 1523 drag mouse to select rectangular area 1523 перетащите мышь, чтобы выбрать прямоугольную область 1524 drag mouse to show selected image 1524 перетащите мышь, чтобы показать выбранное изображение 1525 duplicate keyword 1525 повторяющийся keyword 1526 edge distance calculation 1526 вычисление расстояния до края 1527 edge: 1527 край: 1528 edit 1528 правка 1529 edit commands 1529 команды правки 1530 edit custom shell commands, match colors to embedded jpeg image 1530 редактировать пользовательские команды оболочки, сопоставлять цвета со встроенным jpeg-изображением 1531 edit this menu 1531 редактировать это меню 1532 ellipse 1532 эллипс 1533 embedded numbers will sort by value 1533 встроенные числа будут сортироваться по значению 1534 emboss 1534 тиснение 1535 enter 2-character language code: en, de, fr ... 1535 введите 2-символьный код языка: en, de, fr ... 1536 enter a project name 1536 введите название проекта 1537 enter an album name 1537 введите название альбома 1538 enter cities/locations, countries 1538 введите города/местоположения, страны 1539 enter project name 1539 введите название проекта 1540 enter tag name 1540 введите имя tag 1541 enter tag names 1541 введите имена tags 1542 erase 1542 стереть 1543 error compensation 1543 компенсация ошибки 1544 exceed %d edits 1544 превышено %d правок 1545 exceed %d images 1545 превышено %d изображений 1546 exceed %d max files, cannot continue 1546 превышено максимум файлов: %d, продолжение невозможно 1547 exceed %d rows 1547 превышено %d строк 1548 exceed %d selected files 1548 превышено %d выбранных файлов 1549 exceed %d shortcuts 1549 превышено %d сочетаний клавиш 1550 exceeded %d line entries 1550 превышено %d строковых записей 1551 exceeded %d text entries 1551 превышено %d текстовых записей 1552 exceeded max. images: %d 1552 превышен максимум изображений: %d 1553 exceeded max. tiles: %d 1553 превышен максимум плиток: %d 1554 exit split-screen 1554 выйти из разделённого экрана 1555 expand to these limits if smaller 1555 расширить до этих пределов, если меньше 1556 exporting files 1556 экспорт файлов 1557 extra indexed metadata tags > %d 1557 дополнительные индексируемые tags metadata > %d 1558 extra metadata tags to include in index 1558 дополнительные tags metadata для включения в индекс 1559 extra metadata tags: \n 1559 дополнительные tags metadata: \n 1560 fetch 1560 получить 1561 file 1561 файл 1562 file .ext names to recognize RAW files 1562 расширения имён файлов для распознавания файлов RAW 1563 file .ext names to recognize video files 1563 расширения имён файлов для распознавания видеофайлов 1564 file close error 1564 ошибка закрытия файла 1565 file color 1565 цвет файла 1566 file error: %s 1566 ошибка файла: %s 1567 file format error 1567 ошибка формата файла 1568 file format error: %s 1568 ошибка формата файла: %s 1569 file included: %s \n 1569 файл включён: %s \n 1570 file metadata update failed 1570 не удалось обновить metadata файла 1571 file name 1571 имя файла 1572 file names 1572 имена файлов 1573 file not found 1573 файл не найден 1574 file not found \n 1574 файл не найден \n 1575 file not found: %s 1575 файл не найден: %s 1576 file not found: %s %s 1576 файл не найден: %s %s 1577 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1577 типы файлов: .jp2 .heic .avif .webp \nбудут преобразованы в: .jpg - ПРОДОЛЖИТЬ? 1578 file: %s \nexceed 99 versions 1578 файл: %s \nпревышает 99 версий 1579 filename text 1579 текст имени файла 1580 files in %s can be deleted 1580 файлы в %s можно удалить 1581 fill from current gallery 1581 заполнить из текущей галереи 1582 fill from selected files 1582 заполнить из выбранных файлов 1583 fill selected areas 1583 заполнить выбранные области 1584 fill transparent areas 1584 заполнить прозрачные области 1585 find all image files ...\n 1585 поиск всех файлов изображений ...\n 1586 find and report all unreadable image files 1586 найти и сообщить обо всех нечитаемых файлах изображений 1587 find outline gap 1587 найти разрыв контура 1588 find via table lookup 1588 найти через поиск по таблице 1589 find_imagefiles() failure \n 1589 сбой find_imagefiles() \n 1590 find_imagefiles() failure: %s \n 1590 сбой find_imagefiles(): %s \n 1591 finish current edit first 1591 сначала завершите текущую правку 1592 finish making a script file 1592 завершить создание файла сценария 1593 finish or cancel pending edit 1593 завершить или отменить ожидающую правку 1594 fix box in layout and start new box 1594 зафиксировать прямоугольник в макете и начать новый прямоугольник 1595 fix line in layout and start new line 1595 зафиксировать линию в макете и начать новую линию 1596 fix motion blur 1596 исправить смазанность движения 1597 fix oval in layout and start new oval 1597 зафиксировать овал в макете и начать новый овал 1598 follow edge 1598 следовать по краю 1599 font name and size for menus and dilogs 1599 название и размер шрифта для меню и диалогов 1600 force a full re-index of all image files 1600 принудительно выполнить полную переиндексацию всех файлов изображений 1601 format: yyyy:mm:dd [hh:mm:ss] 1601 формат: yyyy:mm:dd [hh:mm:ss] 1602 fotocx will exit 1602 Fotocx завершит работу 1603 found %d pixels 1603 найдено %d пикселей 1604 free disk space: %d GB \n 1604 свободное место на диске: %d ГБ \n 1605 freehand draw 1605 рисование от руки 1606 ftruncate() failure: %s 1606 сбой ftruncate(): %s 1607 full image index: reports will be complete \n 1607 полный индекс изображений: отчёты будут полными \n 1608 function canceled 1608 функция отменена 1609 gallery 1609 галерея 1610 gallery is empty 1610 галерея пуста 1611 gallery truncated to %d images 1611 галерея сокращена до %d изображений 1612 get images having text in filename (comma separated) 1612 получить изображения с текстом в имени файла (через запятую) 1613 get images with matching keywords (comma separated) 1613 получить изображения с совпадающими keywords (через запятую) 1614 get images within rating range 1614 получить изображения в диапазоне рейтинга 1615 gradual paint 1615 постепенное рисование 1616 grid counts not 0-100: %s 1616 количество линий сетки не 0-100: %s 1617 grid picklist file error: %s 1617 ошибка файла списка выбора сетки: %s 1618 grid size 1618 размер сетки 1619 group 1619 группа 1620 height 1620 высота 1621 hide area outlines 1621 скрыть контуры областей 1622 hide transient objects 1622 скрыть временные объекты 1623 high 1623 высокий 1624 home folder was not changed 1624 домашняя папка не была изменена 1625 horizontal 1625 по горизонтали 1626 hours 1626 часов 1627 icons only, text only, or both 1627 только значки, только текст или оба варианта 1628 if image < window, center or shift left or right 1628 если изображение < окна, центрировать или сдвинуть влево или вправо 1629 ignore differences above limit 1629 игнорировать различия выше предела 1630 image blend 1630 смешение изображений 1631 image files 1631 файлы изображений 1632 image for source color 1632 изображение для исходного цвета 1633 image index records found: %d \n 1633 найдено записей индекса изображений: %d \n 1634 image index required 1634 требуется индекс изображений 1635 image index write error: %s 1635 ошибка записи индекса изображений: %s 1636 image is too large to edit: %d x %d 1636 изображение слишком велико для редактирования: %d x %d 1637 image is too large: %dx%d, %lld megapix 1637 изображение слишком велико: %dx%d, %lld мегапикс. 1638 image is too small to edit: %d x %d 1638 изображение слишком мало для редактирования: %d x %d 1639 image scale 1639 масштаб изображения 1640 image to set matching color 1640 изображение для задания соответствующего цвета 1641 image width must be greater than height 1641 ширина изображения должна быть больше высоты 1642 images to report 1642 изображения для отчёта 1643 include all files 1643 включить все файлы 1644 include edited versions 1644 включить отредактированные версии 1645 include last versions only 1645 включить только последние версии 1646 include original files 1646 включить исходные файлы 1647 include transparent areas 1647 включить прозрачные области 1648 include: 1648 включить: 1649 increase blur with distance 1649 увеличивать размытие с расстоянием 1650 index completed, %.1f seconds \n 1650 индексирование завершено, %.1f с \n 1651 index config file error: %s 1651 ошибка файла конфигурации индекса: %s 1652 index updates needed: %d thumbnails: %d \n 1652 требуется обновление индекса: %d миниатюр: %d \n 1653 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1653 обновления индекса: %d обновления заголовка/описания: %d \nобновления миниатюр: %d, удалено: %d \n 1654 input 1654 ввод 1655 input file: %s \n 1655 входной файл: %s \n 1656 insufficient memory, cannot proceed 1656 недостаточно памяти, продолжение невозможно 1657 insufficient overlap for color matching 1657 недостаточно перекрытия для сопоставления цветов 1658 invalid GPS data 1658 недопустимые данные GPS 1659 invalid GPS data: %s 1659 недопустимые данные GPS: %s 1660 invalid album 1660 недопустимый альбом 1661 invalid date range: %s %s 1661 недопустимый диапазон дат: %s %s 1662 invalid date/time format 1662 недопустимый формат даты/времени 1663 invalid file 1663 недопустимый файл 1664 invalid plugin: %s 1664 недопустимый плагин: %s 1665 invalid rating range 1665 недопустимый диапазон рейтинга 1666 invalid source file: %s 1666 недопустимый исходный файл: %s 1667 invert area 1667 инвертировать область 1668 jpeg quality level - 70+ for good image quality 1668 уровень качества jpeg — 70+ для хорошего качества изображения 1669 keyboard 1669 клавиатура 1670 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1670 управление с клавиатуры: \nEsc: выйти из запущенного слайд-шоу \nстрелки: предыдущее/следующее изображение \nB: погасить/включить окно \nN: переход к следующему изображению \nP: пауза/продолжить \nX: увеличить в позиции мыши 1671 keyword names 1671 имена keywords 1672 keywords to add 1672 keywords для добавления 1673 keywords to remove 1673 keywords для удаления 1674 keywords_defined file error: %s 1674 ошибка файла keywords_defined: %s 1675 last search 1675 последний поиск 1676 last version 1676 последняя версия 1677 last versions 1677 последние версии 1678 layout exceeds 4 gigabytes 1678 макет превышает 4 гигабайта 1679 layout file missing: %s 1679 отсутствует файл макета: %s 1680 left 1680 слева 1681 left click on image for selected color 1681 щелчок левой кнопкой по изображению для выбранного цвета 1682 left click: set image source location \nright click: set corresponding destination 1682 щелчок левой кнопкой: задать исходное положение изображения \nщелчок правой кнопкой: задать соответствующее назначение 1683 left drag: add transparency \nright drag: add opacity 1683 перетаскивание левой кнопкой: добавить прозрачность \nперетаскивание правой кнопкой: добавить непрозрачность 1684 left drag: copy image to mouse position \nright drag: restore original image 1684 перетаскивание левой кнопкой: скопировать изображение в позицию мыши \nперетаскивание правой кнопкой: восстановить исходное изображение 1685 left drag: reduce halo, right drag: undo 1685 перетаскивание левой кнопкой: уменьшить ореол, перетаскивание правой кнопкой: отменить 1686 lens mm 1686 объектив, мм 1687 level based on EXIF roll angle 1687 выровнять по углу крена EXIF 1688 light 1688 светлый 1689 light pixels 1689 светлые пиксели 1690 line 1690 линия 1691 line color 1691 цвет линии 1692 line width 1692 ширина линии 1693 load 1693 загрузить 1694 load text data from a file 1694 загрузить текстовые данные из файла 1695 load widgets failed: %s 1695 не удалось загрузить виджеты: %s 1696 loading palette ... 1696 загрузка палитры ... 1697 location is not a folder 1697 местоположение не является папкой 1698 locations 1698 местоположения 1699 lock width/height ratio 1699 зафиксировать соотношение ширины/высоты 1700 log file is in a terminal 1700 файл журнала находится в терминале 1701 low 1701 низкий 1702 low contrast 1702 низкий контраст 1703 lower 1703 ниже 1704 make an initially empty album 1704 создать изначально пустой альбом 1705 make new version 1705 создать новую версию 1706 manual align 1706 выравнивание вручную 1707 map marker (red dot) diameter, pixels 1707 диаметр маркера карты (красная точка), пикселей 1708 map selected areas and verify 1708 отобразить выбранные области на карте и проверить 1709 mashup project 1709 проект Mashup 1710 match embedded image color 1710 сопоставить цвет встроенного изображения 1711 match image color to base image (repeat) 1711 сопоставить цвет изображения с базовым изображением (повторить) 1712 match values 1712 сопоставить значения 1713 matches 1713 совпадений 1714 max keywords exceeded 1714 превышено максимальное количество keywords 1715 max. Width 1715 макс. ширина 1716 max. album count exceeded: %d 1716 превышено макс. количество альбомов: %d 1717 max. album files reached, results truncated 1717 достигнут максимум файлов альбома, результаты усечены 1718 max. album size exceeded: %d 1718 превышен макс. размер альбома: %d 1719 max. blur radius 1719 макс. радиус размытия 1720 max. brightness 1720 макс. яркость 1721 max. image limit reached: %d 1721 достигнут предел изображений: %d 1722 max. width or height is not reasonable 1722 макс. ширина или высота недопустимы 1723 maximum clip allowed to fit window 1723 максимальное отсечение, допустимое для размещения в окне 1724 mean RGB: %5.0f %5.0f %5.0f 1724 средний RGB: %5.0f %5.0f %5.0f 1725 mean noise: %5.2f %5.2f %5.2f 1725 средний шум: %5.2f %5.2f %5.2f 1726 median 1726 медиана 1727 median diff 1727 разница медианы 1728 menu text and background colors 1728 цвета текста и фона меню 1729 metadata 1729 metadata 1730 metadata copy failed 1730 не удалось скопировать metadata 1731 metadata from Search Function, metadata report 1731 metadata из функции поиска, отчёт metadata 1732 metadata picklist file not found %s 1732 файл списка выбора metadata не найден %s 1733 metadata tags to report 1733 tags metadata для отчёта 1734 metadata update error 1734 ошибка обновления metadata 1735 metadata update error \n 1735 ошибка обновления metadata \n 1736 metadata update error: %s 1736 ошибка обновления metadata: %s 1737 metadata update failed \n 1737 не удалось обновить metadata \n 1738 min. blur radius 1738 мин. радиус размытия 1739 min. contrast 1739 мин. контраст 1740 min. edit curve node separation, % of scale length 1740 мин. расстояние между узлами кривой правки, % длины шкалы 1741 min. separation, %c of scale 1741 мин. расстояние, %c от шкалы 1742 minutes 1742 минут 1743 mmap() failure: %s 1743 сбой mmap(): %s 1744 months 1744 месяцев 1745 more than %d categories 1745 более %d категорий 1746 more than 20 matches 1746 более 20 совпадений 1747 mouse radius 1747 радиус мыши 1748 mouse radius for color sample 1748 радиус мыши для образца цвета 1749 mouse radius: 1749 радиус мыши: 1750 move (delete original) 1750 переместить (удалить оригинал) 1751 move area boundary in/out in 1-pixel steps 1751 переместить границу области внутрь/наружу шагами по 1 пикселю 1752 move to next input file 1752 перейти к следующему входному файлу 1753 move to trash failed \n 1753 не удалось переместить в корзину \n 1754 move to trash failed: %s 1754 не удалось переместить в корзину: %s 1755 multiply 1755 умножить 1756 must have 4 corners 1756 требуется 4 угла 1757 need numeric match value: %s 1757 требуется числовое значение соответствия: %s 1758 negative 1758 негатив 1759 new album created 1759 новый альбом создан 1760 new album name 1760 название нового альбома 1761 new file 1761 новый файл 1762 new file ... 1762 новый файл ... 1763 new file name is invalid 1763 новое имя файла недопустимо 1764 new file type 1764 новый тип файла 1765 new home folder contains a blank 1765 в имени новой домашней папки есть пробел 1766 new location 1766 новое местоположение 1767 new location is not a folder 1767 новое местоположение не является папкой 1768 new version 1768 новая версия 1769 newest files 1769 новейшие файлы 1770 no EXIF orientation data 1770 нет данных ориентации EXIF 1771 no active Select Area 1771 нет активного выбора области 1772 no albums selected 1772 не выбрано ни одного альбома 1773 no auto warp 1773 без автоискажения 1774 no change 1774 без изменений 1775 no current album 1775 нет текущего альбома 1776 no current edit image 1776 нет текущего редактируемого изображения 1777 no current file 1777 нет текущего файла 1778 no curve (scanned image) 1778 нет кривой (сканированное изображение) 1779 no description 1779 нет описания 1780 no file selected 1780 файл не выбран 1781 no files found 1781 файлы не найдены 1782 no files selected 1782 файлы не выбраны 1783 no host files selected 1783 не выбраны основные файлы 1784 no image index: reports disabled \n 1784 нет индекса изображений: отчёты отключены \n 1785 no images 1785 нет изображений 1786 no images found 1786 изображения не найдены 1787 no input files available 1787 нет доступных входных файлов 1788 no matching files found 1788 совпадающих файлов не найдено 1789 no matching locations 1789 совпадающих местоположений не найдено 1790 no metadata level data 1790 нет данных уровня metadata 1791 no metadata tags to report 1791 нет tags metadata для отчёта 1792 no option selected 1792 не выбран параметр 1793 no overlay file selected 1793 не выбран файл наложения 1794 no photo date, skipped 1794 нет даты съёмки, пропущено 1795 no plugin output file found 1795 не найден выходной файл плагина 1796 no prior edit 1796 нет предыдущей правки 1797 no prior edit image 1797 нет изображения предыдущей правки 1798 no saved folders 1798 нет сохранённых папок 1799 no script file was started 1799 файл сценария не был запущен 1800 no script files found 1800 файлы сценариев не найдены 1801 no select area 1801 нет выбора области 1802 no selection 1802 нет выбора 1803 no title 1803 нет заголовка 1804 no write permission 1804 нет прав на запись 1805 no write permission \n 1805 нет прав на запись \n 1806 no write permission: %s 1806 нет прав на запись: %s 1807 none 1807 нет 1808 not a known image file 1808 неизвестный файл изображения 1809 not an image file 1809 это не файл изображения 1810 not an indexed image file \n 1810 непроиндексированный файл изображения \n 1811 nothing found 1811 ничего не найдено 1812 nothing left, no change made 1812 ничего не осталось, изменений не внесено 1813 old file 1813 старый файл 1814 old image index: reports will omit new files \n 1814 старый индекс изображений: отчёты не будут включать новые файлы \n 1815 old keyword name >> new keyword name 1815 старое имя keyword >> новое имя keyword 1816 omit high pixel 1816 отсечь верхний пиксель 1817 omit low pixel 1817 отсечь нижний пиксель 1818 only %d tile images found 1818 найдено только %d плиточных изображений 1819 opacity center 1819 непрозрачность центра 1820 opacity edge 1820 непрозрачность края 1821 open album 1821 открыть альбом 1822 open and process color chart 1822 открыть и обработать цветовую таблицу 1823 open as new current file 1823 открыть как новый текущий файл 1824 optional deselect color 1824 дополнительный цвет для снятия выбора 1825 original 1825 исходный 1826 originals 1826 оригиналы 1827 other 1827 другое 1828 out of space for temp files \nsave your edits and quit Fotocx 1828 недостаточно места для временных файлов \nсохраните ваши правки и завершите работу Fotocx 1829 outline 1829 контур 1830 output file exists 1830 выходной файл существует 1831 output file exists, overwrite? 1831 выходной файл существует, перезаписать? 1832 output file size change, cannot use select area 1832 изменение размера выходного файла, нельзя использовать выбор области 1833 output file: 1833 выходной файл: 1834 output file: %s \n 1834 выходной файл: %s \n 1835 oval 1835 овал 1836 overlay file missing: %s 1836 отсутствует файл наложения: %s 1837 owner 1837 владелец 1838 paint 1838 рисовать 1839 paint color 1839 цвет рисования 1840 paint edits cannot be used for this method 1840 «Правки кистью» нельзя использовать для этого метода 1841 paint over transparent areas 1841 рисовать поверх прозрачных областей 1842 paint radius 1842 радиус кисти 1843 palette 1843 палитра 1844 palette exceeds %d color limit 1844 палитра превышает предел в %d цветов 1845 palette file 1845 файл палитры 1846 palette has %d colors 1846 в палитре %d цветов 1847 palette loaded, %d colors 1847 палитра загружена, %d цветов 1848 palette: 1848 палитра: 1849 patch area goal 1849 цель области заплатки 1850 percent 1850 процент 1851 perform edits to include in the script file 1851 выполнить правки для включения в файл сценария 1852 permissions: 1852 права доступа: 1853 perspective 1853 перспектива 1854 photo 1854 фото 1855 picklist file not found: %s 1855 файл списка выбора не найден: %s 1856 pixel = mean of best match neighbors 1856 пиксель = среднее ближайших совпадающих соседей 1857 pixel = median of all neighbors 1857 пиксель = медиана всех соседей 1858 please make a choice 1858 пожалуйста, сделайте выбор 1859 plugin command failed 1859 сбой команды плагина 1860 plugin menu not found %s 1860 меню плагина не найдено %s 1861 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1861 плагины: (год месяц день старое-имя порядковый номер) $yyyy $mm $dd $oldname $s 1862 popup_choose: empty list 1862 popup_choose: пустой список 1863 position with mouse click/drag 1863 позиция щелчком/перетаскиванием мыши 1864 position: 50 50 1864 позиция: 50 50 1865 position: x=%02d y=%02d 1865 позиция: x=%02d y=%02d 1866 power 1866 мощность 1867 power center 1867 мощность центра 1868 power edge 1868 мощность края 1869 power: center 1869 мощность: центр 1870 pref 1870 pref 1871 previous file 1871 предыдущий файл 1872 previous name 1872 предыдущее имя 1873 print color chart 1873 напечатать цветовую таблицу 1874 print select area(s) only? 1874 печатать только выбранные области? 1875 prior edit step 1875 предыдущий шаг правки 1876 project complete 1876 проект завершён 1877 project file is defective 1877 файл проекта повреждён 1878 project name cannot have quote characters 1878 в названии проекта не должно быть кавычек 1879 pure RGB or black/white dots 1879 чистые точки RGB или чёрно-белые 1880 quality 1880 качество 1881 quality level (70+) 1881 уровень качества (70+) 1882 radius 1882 радиус 1883 radius: 1883 радиус: 1884 random 1884 случайно 1885 random position 1885 случайная позиция 1886 rating range 1886 диапазон рейтинга 1887 reading image index file ...\n 1887 чтение файла индекса изображений ...\n 1888 recent files 1888 недавние файлы 1889 reduce bright 1889 уменьшить яркие участки 1890 reduce dark 1890 уменьшить тёмные участки 1891 reduce to these limits if larger 1891 уменьшить до этих пределов, если больше 1892 refresh 1892 обновить 1893 remove %d duplicates? 1893 удалить %d дубликатов? 1894 remove all files in list 1894 удалить все файлы из списка 1895 remove duplicate 1895 удалить дубликат 1896 remove from set 1896 удалить из набора 1897 remove panorama image curving 1897 убрать искривление панорамного изображения 1898 remove selected file from list 1898 удалить выбранный файл из списка 1899 rename keywords 1899 переименовать keywords 1900 repair metadata for %s 1900 исправить metadata для %s 1901 replace 1901 заменить 1902 replace album %s ? 1902 заменить альбом %s? 1903 replace file 1903 заменить файл 1904 replace old 1904 заменить старый 1905 replace old file (OVERWRITE) 1905 заменить старый файл (ПЕРЕЗАПИСЬ) 1906 replace substring within file name 1906 заменить подстроку в имени файла 1907 report type: 1907 тип отчёта: 1908 req. color match 1908 требуемое соответствие цвета 1909 reset 1909 сброс 1910 resolution 1910 разрешение 1911 resume from current image 1911 продолжить с текущего изображения 1912 right 1912 справа 1913 right click on image for deselected color 1913 щелчок правой кнопкой по изображению для снятия выбора цвета 1914 sample % 1914 выборка % 1915 save 1915 сохранить 1916 save Mashup output file 1916 сохранить выходной файл Mashup 1917 save Mashup project? 1917 сохранить проект Mashup? 1918 save area as a PNG file 1918 сохранить область как файл PNG 1919 save as new file name or type 1919 сохранить под новым именем или типом файла 1920 save as new file version 1920 сохранить как новую версию файла 1921 save edit, start new text 1921 сохранить правку, начать новый текст 1922 save metadata to image file 1922 сохранить metadata в файл изображения 1923 save text data to a file 1923 сохранить текстовые данные в файл 1924 save to .heic/.avif file not supported 1924 сохранение в .heic/.avif не поддерживается 1925 save to .jp2 file not supported 1925 сохранение в .jp2 не поддерживается 1926 save to .webp file not supported 1926 сохранение в .webp не поддерживается 1927 scan and save color chart 1927 сканировать и сохранить цветовую таблицу 1928 scanned color chart file 1928 файл отсканированной цветовой таблицы 1929 scope of neighbor pixels 1929 область соседних пикселей 1930 script already started 1930 сценарий уже запущен 1931 script complete 1931 сценарий завершён 1932 script error: %s, %s 1932 ошибка сценария: %s, %s 1933 script file closed 1933 файл сценария закрыт 1934 script file error 1934 ошибка файла сценария 1935 script file format error: %s 1935 ошибка формата файла сценария: %s 1936 script file name too big 1936 имя файла сценария слишком длинное 1937 script file to run 1937 файл сценария для запуска 1938 search for names in image location metadata 1938 искать имена в metadata местоположения изображения 1939 search for text within file folders or file name 1939 искать текст в папках файлов или имени файла 1940 search for text within image title or description 1940 искать текст в заголовке или описании изображения 1941 search known locations 1941 искать известные местоположения 1942 search range 1942 диапазон поиска 1943 search: 1943 поиск: 1944 seconds 1944 секунд 1945 seconds to show with text 1945 секунд показа с текстом 1946 seconds to show without text 1946 секунд показа без текста 1947 select all 1947 выбрать все 1948 select all colors within mouse (flood) 1948 выбрать все цвета в пределах мыши (заливка) 1949 select area missing or not finished 1949 выбор области отсутствует или не завершён 1950 select area within mouse 1950 выбрать область в пределах мыши 1951 select area within mouse circle 1951 выбрать область в пределах круга мыши 1952 select base image for color matching 1952 выбрать базовое изображение для сопоставления цветов 1953 select by color, required match level 1953 выбрать по цвету, требуемый уровень соответствия 1954 select by color, search range 1954 выбрать по цвету, диапазон поиска 1955 select font 1955 выбрать шрифт 1956 select image to show with mouse paint 1956 выбрать изображение для показа при рисовании мышью 1957 select images randomly 1957 выбрать изображения случайным образом 1958 select initial files 1958 выбрать начальные файлы 1959 select line color 1959 выбрать цвет линии 1960 select one color within mouse 1960 выбрать один цвет в пределах мыши 1961 select rectangle 1961 выбрать прямоугольник 1962 select source image color first 1962 сначала выбрать исходный цвет изображения 1963 select surrounding areas matching colors in mouse 1963 выбрать окружающие области с совпадающими цветами в пределах мыши 1964 selection exceeds %d tags 1964 выбор превышает %d tags 1965 sepia 1965 сепия 1966 set a new date/time: 1966 задать новую дату/время: 1967 set all 1967 задать всё 1968 set current window size 1968 задать текущий размер окна 1969 set image color from input files 1969 задать цвет изображения из входных файлов 1970 set location from world map 1970 задать местоположение по карте мира 1971 set maximum crop 1971 задать максимальную обрезку 1972 shadow 1972 тень 1973 shell command used for converting RAW files to RGB 1973 команда оболочки для преобразования файлов RAW в RGB 1974 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1974 shift + щелчок левой кнопкой: взять цвет с изображения \nперетаскивание левой кнопкой: рисовать цветом по изображению \nперетаскивание правой кнопкой: восстановить исходное изображение 1975 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1975 shift + щелчок левой кнопкой: синхронизировать позицию копирования \nперетаскивание левой кнопкой: скопировать исходное изображение в позицию мыши \nперетаскивание правой кнопкой: восстановить исходное изображение 1976 shift existing date/time (+/–): 1976 сдвинуть существующую дату/время (+/–): 1977 shift+click on image to select color 1977 shift+щелчок по изображению, чтобы выбрать цвет 1978 shortcut function not found: %s 1978 функция сочетания клавиш не найдена: %s 1979 shortcut key: 1979 клавиша сочетания: 1980 shortcut not found: %s 1980 сочетание клавиш не найдено: %s 1981 show area outlines 1981 показать контуры областей 1982 show hidden files and folders 1982 показать скрытые файлы и папки 1983 show transient objects 1983 показать временные объекты 1984 size of mouse selection circle 1984 размер круга выбора мыши 1985 smooth 1985 сглаживание 1986 source file: 1986 исходный файл: 1987 source image failure (scale too big?) 1987 сбой исходного изображения (слишком большой масштаб?) 1988 source image scale 1988 масштаб исходного изображения 1989 specify a thumbnail folder 1989 укажите папку миниатюр 1990 specify at least 1 top image folder 1990 укажите хотя бы 1 верхнюю папку изображений 1991 specify background size and color 1991 укажите размер и цвет фона 1992 specify files and keywords 1992 укажите файлы и keywords 1993 spot size limit 1993 предел размера пятна 1994 start 1994 начать 1995 start a new script file 1995 начать новый файл сценария 1996 start album 1996 начальный альбом 1997 start blob condensation process 1997 начать процесс сгущения в пятна 1998 start file 1998 начальный файл 1999 start folder 1999 начальная папка 2000 start from first image in album 2000 начать с первого изображения в альбоме 2001 start fusion process 2001 начать процесс слияния 2002 start over at end of album 2002 начать заново в конце альбома 2003 start warp 2003 начать искажение 2004 start with previous image file, gallery of recent files, etc. 2004 начать с предыдущего файла изображения, галереи недавних файлов и т. д. 2005 startup album is invalid 2005 стартовый альбом недопустим 2006 startup file is invalid 2006 стартовый файл недопустим 2007 startup folder is invalid 2007 стартовая папка недопустима 2008 status: %s \n 2008 статус: %s \n 2009 status: completed \n 2009 статус: завершено \n 2010 stay open 2010 оставаться открытым 2011 step 2011 шаг 2012 stop 2012 стоп 2013 stop blob condensation process 2013 остановить процесс сгущения в пятна 2014 stop fusion process 2014 остановить процесс слияния 2015 supply a file name 2015 укажите имя файла 2016 tag name 2016 имя tag 2017 tag name %s not in xmeta tag list 2017 имя tag %s отсутствует в списке xmeta tag 2018 tag value 2018 значение tag 2019 target file: 2019 целевой файл: 2020 template 2020 шаблон 2021 test: show changes, do not update files 2021 тест: показать изменения, не обновлять файлы 2022 text 2022 текст 2023 text file is defective 2023 текстовый файл повреждён 2024 text time 2024 время текста 2025 this function cannot be scripted 2025 эту функцию нельзя записать в сценарий 2026 thumbnail file 2026 файл миниатюры 2027 thumbnails deleted: %d \n 2027 удалено миниатюр: %d \n 2028 thumbnails folder: %s \n 2028 папка миниатюр: %s \n 2029 tile area goal 2029 цель области плитки 2030 tile gap 2030 зазор плитки 2031 tile size 2031 размер плитки 2032 time 2032 время 2033 title/desc. 2033 заголовок/опис. 2034 to add images to current set, \nsearch all images 2034 чтобы добавить изображения в текущий набор, \nищите среди всех изображений 2035 to remove images from current set, \nsearch current set 2035 чтобы удалить изображения из текущего набора, \nищите в текущем наборе 2036 too many categories 2036 слишком много категорий 2037 too many files, cannot continue 2037 слишком много файлов, продолжение невозможно 2038 too many keywords in a category 2038 слишком много keywords в категории 2039 top image folders: \n 2039 верхние папки изображений: \n 2040 transition 2040 переход 2041 transitions 2041 переходы 2042 trash 2042 корзина 2043 trimmed color chart file 2043 обрезанный файл цветовой таблицы 2044 unable to save bookmarks file 2044 не удалось сохранить файл закладок 2045 unknown edit function: %s 2045 неизвестная функция правки: %s 2046 unknown file type 2046 неизвестный тип файла 2047 unknown or empty album: %s 2047 неизвестный или пустой альбом: %s 2048 unsharp mask 2048 нерезкое маскирование 2049 update 2049 обновить 2050 updating albums ...\n 2050 обновление альбомов ...\n 2051 upper 2051 верхний 2052 upsize 2052 увеличить 2053 use 2053 использовать 2054 use a saved Mashup project 2054 использовать сохранённый проект Mashup 2055 use average 2055 использовать среднее значение 2056 use custom color palette 2056 использовать пользовательскую цветовую палитру 2057 use median 2057 использовать медиану 2058 use option to stop accidental quit 2058 использовать параметр для предотвращения случайного выхода 2059 use previous input 2059 использовать предыдущий ввод 2060 use previous location 2060 использовать предыдущее местоположение 2061 use prior edit step: 2061 использовать предыдущий шаг правки: 2062 use the current image file 2062 использовать текущий файл изображения 2063 variance 2063 дисперсия 2064 versions 2064 версии 2065 vertical 2065 по вертикали 2066 video files not supported (install ffmpeg) 2066 видеофайлы не поддерживаются (установите ffmpeg) 2067 view album 2067 просмотреть альбом 2068 waiting 2068 ожидание 2069 warp 2069 искажение 2070 warp and align selected image with mouse drags 2070 исказить и выровнять выбранное изображение перетаскиванием мыши 2071 warp and fine-align selected image with neighbor 2071 исказить и точно выровнять выбранное изображение с соседним 2072 warp span 2072 диапазон искажения 2073 wavelength 2073 длина волны 2074 width 2074 ширина 2075 writing updated image index file \n 2075 запись обновлённого файла индекса изображений \n 2076 x-count 2076 количество по X 2077 x-offset 2077 смещение по X 2078 y-count 2078 количество по Y 2079 y-offset 2079 смещение по Y 2080 years 2080 лет 2081 you can close this window now \n 2081 теперь вы можете закрыть это окно \n 2082 you cannot use new name and replace text together 2082 нельзя одновременно использовать новое имя и замену текста 2083 you must use either $s or $oldname 2083 необходимо использовать либо $s, либо $oldname 2084 zoom image 2084 масштабировать (zoom) изображение 2085 zoom via mouse wheel or Keys +/=/-/↑/↓ 2085 zoom колёсиком мыши или клавишами +/=/-/↑/↓ 2086 zoom-in 2086 zoom-in (увеличить) 2087 zoom-out 2087 zoom-out (уменьшить) fotocx/data/translations/ug_es0000664000175000017500000105635215247006657015531 0ustar micomico- ^GUÍA DEL USUARIO DE FOTOCX^ v.26.8 Consúltala usando el menú de Fotocx Ayuda > Guía del usuario - {USO DE FOTOCX} {PRIMER INICIO} - localizar e indexar archivos de imagen para búsquedas rápidas {GUÍA DEL USUARIO} ← ^haz clic aquí^ - cómo usar este navegador de la guía del usuario {VISTAS DE VENTANA Y MENÚS} - ventanas de nivel superior y sus menús asociados {VISTA DE ARCHIVO} - ventana Vista de archivo (ver un solo archivo de imagen) {VISTA DE GALERÍA} - ventana Vista de galería (ver carpeta como thumbnails) {VISTA DE MAPA} - ventana de vista de mapa (ver mapa con marcadores de ubicación de imagen) {ARRASTRAR Y SOLTAR} - métodos de arrastrar y soltar archivos {EDITAR PROCEDIMIENTOS} - cómo editar archivos de imagen {EDITAR FLUJO DE TRABAJO} - métodos de edición alternativos - simple y complejo {PROPIEDAD DEL RATÓN} - control e interacción de diálogo-ratón {RATÓN ALT-BOTÓN DERECHO} - botón derecho del ratón para touchpads/pantallas {BOTONES DE DIÁLOGO} - opciones para completar diálogos {TECLA ESCAPE DEL TECLADO} - funciones de la tecla Escape {WIDGETS DE DIÁLOGO NO ESTÁNDAR} - cómo usar widgets de diálogo no estándar {EDICIÓN DE CURVAS} - cómo manipular curvas usadas en funciones de edición {MOUSE PAINTING} - editar una imagen localmente usando el ratón {PROCESAMIENTO MASIVO} - vista general de las funciones de procesamiento masivo {SELECCIONAR ARCHIVOS DE IMAGEN} - procedimiento de selección de archivos de imagen {ATAJOS} - menús emergentes, atajos de teclado, menú de usuario personalizado {FUNCIONES DEL RATÓN} - funciones del ratón para vistas de archivo/galería/mapa {PARÁMETROS DE COMANDO} - parámetros de línea de comandos de Fotocx - {MENÚ DE ARCHIVO} {NUEVA SESIÓN} - iniciar una nueva sesión de Fotocx en una ventana separada {ABRIR ARCHIVO DE IMAGEN} - abrir un archivo de imagen para ver o editar {CICLO 2 ARCHIVOS} - recorrer los dos archivos de imagen vistos más recientemente {CICLO 3 ARCHIVOS} - recorrer los tres archivos de imagen vistos más recientemente {VER PANORÁMICA 360°} - imagen panorámica de 360° con punto de vista giratorio {IMAGEN EN BLANCO} - crear una imagen en blanco con tamaño y color especificados {IMAGEN EN BLANCO} - crear una nueva imagen en blanco {COPIAR/MOVER} - copiar o mover un archivo de imagen a otra carpeta {COPIAR AL ESCRITORIO} - copiar un archivo de imagen al escritorio {COPIAR AL PORTAPAPELES} - copiar un archivo de imagen al portapapeles {ELIMINAR/PAPELERA} - eliminar o enviar a la papelera un archivo de imagen {ESTABLECER FONDO DE ESCRITORIO} - establecer el fondo de escritorio a partir del archivo de imagen actual {IMPRIMIR IMAGEN} - imprimir un archivo de imagen {IMPRIMIR CALIBRADO} - imprimir usando datos de calibración de color {CALIBRAR IMPRESORA} - calibrar el color de la impresora - compensar desviaciones de color - {MENÚ DE GALERÍA} {VISTA GENERAL DE GALERÍA} {VISTA DE THUMBNAILS} - Vista de galería con thumbnails y nombres de archivo {VISTA DE METADATA} - Vista de galería con thumbnail y metadata básica {ARCHIVOS RECIENTES} - Vista de galería de los archivos de imagen vistos más recientemente {ARCHIVOS MÁS RECIENTES} - Vista de galería de los archivos de imagen más recientes {ORDEN DE GALERÍA} - cambiar el orden de clasificación de una galería {FILTRO DE GALERÍA} - seleccionar más reciente, más antiguo, patrón coincidente ... {INICIO DE GALERÍA} - saltar al inicio de la galería {FIN DE LA GALERÍA} - saltar al final de la galería {CARPETA DEL ARCHIVO ACTUAL} - establecer la galería actual a partir de la carpeta del archivo actual {CARPETAS RECIENTES} - ver la lista de carpetas vistas recientemente, seleccionar {ÁRBOL DE CARPETAS} - ver las carpetas de archivos de imagen en una estructura de árbol, seleccionar {SELECCIONAR ARCHIVOS} - seleccionar archivos como entrada para lote, script o álbum {MARCADORES} - ver la lista de marcadores, ir a un marcador {EDITAR MARCADORES} - añadir, eliminar, organizar marcadores - {MAPS MENU} {MAPA MUNDIAL} - vista general del mapa mundial de internet {MOSTRAR EN MAPA} - mostrar la posición de la imagen actual en el mapa - {MENÚ DE ÁLBUMES} {ÁLBUMES} - crear y organizar colecciones de imágenes {CREAR ÁLBUM} - crear un nuevo álbum (galería de imágenes elegidas) {RENOMBRAR ÁLBUM} - renombrar un álbum existente {ELIMINAR ÁLBUM} - eliminar un álbum existente {ELEGIR ÁLBUM} - elegir un álbum y mostrar la galería de imágenes {ÁLBUM ACTUAL} - mostrar el álbum actual (usado por última vez) {GALERÍA A ÁLBUM} - guardar la galería actual como un álbum con nombre {EDITAR ÁLBUM} - añadir, eliminar, reorganizar archivos de imagen en la galería de un álbum {ACTUALIZAR ÁLBUMES} - actualizar álbumes para archivos de imagen actualizados (nuevas versiones) {ACTUALIZACIÓN MASIVA DE ÁLBUM} actualización masiva de álbumes (añadir/eliminar/reemplazar archivos miembros) {PRESENTACIÓN DE DIAPOSITIVAS} - presentación de diapositivas con transiciones animadas y desplazamiento/zoom - {MENÚ PERSONALIZADO} - menú de usuario personalizado para funciones de uso frecuente {ARCHIVOS DE SCRIPT} - vista general de archivos de script {EDITAR SCRIPT} - grabar ediciones en un script para crear una función de edición personalizada {EJECUTAR SCRIPT} - ejecutar un script en la imagen actual {SCRIPT MASIVO} - ejecutar un script en los archivos de imagen seleccionados {PLUGINS} - iniciar una función de edición de plugin, abrir el archivo de salida del plugin - {ZOOM} - acercar o alejar imagen o thumbnails con el ratón o el teclado - {ANTERIOR/SIGUIENTE} - ir a la imagen anterior o siguiente con el ratón o el teclado - {GUARDAR ARCHIVO} - guardar el archivo de imagen (reemplazar, nueva versión, nuevo nombre de archivo) - {MENÚ DE METADATA} {VER META PRINCIPAL} - listar la metadata principal de la imagen {VER TODA LA META} - listar toda la metadata de la imagen {VISTA GENERAL DE KEYWORDS} - keywords usadas para la búsqueda de imágenes {GEOTAGS OVERVIEW} - nombres de ubicación y geocoordenadas para la búsqueda {EDITAR META PRINCIPAL} - editar la metadata de uso común {EDITAR CUALQUIER META} - editar cualquier metadata (añadir, eliminar, cambiar) {ELIMINAR META} - eliminar la metadata especificada o toda la metadata {COPIAR META} - copiar metadata de un archivo de imagen a otro {CORREGIR META} - reparar metadata malformada que impide editar la metadata {GESTIONAR KEYWORDS} - gestionar keywords definidas por el usuario {SUBTÍTULOS} - mostrar nombre de archivo, título, descripción en la esquina de la imagen {LUGARES/FECHAS} - listar ubicaciones/fechas de imágenes, clic para galería {LÍNEA DE TIEMPO} - mostrar el recuento de imágenes por año/mes, clic para galería {TAGS DE METADATA} - mostrar el recuento de imágenes por valor de tag, clic para galería {BÚSQUEDA AUTOMÁTICA} - función de Búsqueda guionizada para encontrar archivos {BUSCAR IMÁGENES} - buscar usando cualquier metadata o nombres de carpeta/archivo - {MENÚ DE SELECCIÓN} {VISTA GENERAL DE ÁREA} - seleccionar área - conceptos y uso {SELECCIONAR ÁREA} - seleccionar una característica o área de la imagen para editar por separado {BUSCAR HUECO EN ÁREA} - buscar un hueco en un contorno de área dibujado a mano {MEZCLA DE ÁREA} - mezclar con el ratón las ediciones hechas dentro de un área seleccionada {MOSTRAR/OCULTAR ÁREA} - mostrar u ocultar contornos de área {ACTIVAR/DESACTIVAR ÁREA} - activar o desactivar un área para edición {INVERTIR ÁREA} - invertir un área (intercambiar áreas dentro/fuera) {BORRAR ÁREA} - eliminar un área {COPIAR/PEGAR ÁREA} - copiar un área o pegar un área en la imagen actual {CARGAR/GUARDAR ÁREA} - cargar un área desde un archivo o guardarla en un archivo - {BOTÓN DESHACER/REHACER} - deshacer o rehacer secuencialmente ediciones de la imagen actual - {MENÚ DE EDICIÓN} {ROTAR} - rotar o nivelar una imagen {ENDEREZAR} - enderezar una imagen rotada o reflejada {RECORTAR} - recortar (ajustar) los márgenes de la imagen {RETOCAR} - editar brillo, contraste, color, saturación {REESCALAR} - cambiar las dimensiones en píxeles de la imagen {PANTALLA DIVIDIDA} - ver cambios antes/después usando pantalla dividida {MOSTRAR DIFERENCIAS} - resaltar cambios durante la edición (o entre dos imágenes cualquiera) {MÁRGENES} - añadir márgenes a una imagen, de cualquier color o transparencia {MARCADO} - dibujar en la imagen: texto, línea/flecha, cuadro, óvalo {MODO DE COLOR} - convertir a blanco y negro, color, negativo, positivo {PINTAR EDICIONES} - pintar con el ratón una función de edición de forma local y gradual {PINTAR IMAGEN} - pintar con el ratón usando un color, tamaño de pincel y opacidad {PINTAR TRANSPARENCIA} - pintar transparencia creciente usando el ratón {RELLENO DE ÁREA} - rellenar áreas seleccionadas o áreas transparentes con un color {COPIAR DENTRO DE LA IMAGEN} - copiar píxeles dentro de una imagen usando el ratón {COPIAR DESDE IMAGEN} - copiar píxeles desde otra imagen usando el ratón {COPIAR EDICIÓN ANTERIOR} - copiar píxeles de ediciones anteriores usando el ratón - {MENÚ DE REPARACIÓN} {ENFOCAR} - enfocar una imagen borrosa, varios métodos {DESENFOQUE} - desenfocar una imagen o un área de la imagen, varios métodos {REDUCIR RUIDO} - reducir el ruido de la imagen (pequeñas motas aleatorias) {QUITAR NIEBLA} - añadir o quitar niebla/bruma de una imagen o área seleccionada {OJOS ROJOS} - eliminar ojos rojos de fotos con flash {BORRADO INTELIGENTE} - eliminar cables de electricidad, carteles y otros pequeños defectos {ELIMINAR HALO} - eliminar halos dejados por enfocar y otras funciones {ARTEFACTOS JPEG} - suprimir artefactos en archivos muy comprimidos {ANTIALIAS} - suprimir la pixelación (dentado) a lo largo de los bordes de las formas {AJUSTAR RGB} - ajustar los colores de la imagen usando colores RGB o CMY {AJUSTAR HSL} - seleccionar y cambiar colores usando el modelo de color HSL {ELIMINAR POLVO} - eliminar manchas de polvo en imágenes de fotos antiguas {FRANJAS} - corregir franjas de color periféricas (aberración cromática) - {MENÚ DE REFINAMIENTO} {APLANAR HISTOGRAMA} - aplanar el histograma de brillo para mejores detalles {CONTRASTE LOCAL} - añadir contraste adaptado al brillo del área local {AMPLIFICAR CONTRASTE} - amplificar el contraste existente para realzar detalles {RETINEX GLOBAL} - reescalar los valores RGB para un rango mayor {RETINEX LOCAL} - reescalar los valores RGB para un rango mayor {SATURACIÓN} - ajustar la saturación del color según el brillo {ENFOQUE SUAVE} - aplicar el efecto clásico de "enfoque suave" a una imagen {RAMPA DE BRILLO} - añadir una rampa de brillo/color a través de una imagen {VIÑETA} - cambiar el brillo/color radialmente alrededor de un centro elegido - {MENÚ DE EFECTOS} {CONTORNOS} - convertir una imagen en un dibujo de contornos {BOCETO1} - convertir una imagen en un boceto simulado (1) {BOCETO2} - convertir una imagen en un boceto simulado (2) {CARICATURA} - convertir una imagen en un dibujo tipo caricatura {RELIEVE} - convertir una imagen en un relieve simulado (efecto 3D) {MOSAICOS1} - convertir una imagen en mosaicos cuadrados con efecto 3D {MOSAICOS2} - convertir una imagen en mosaicos irregulares que siguen la imagen {PINTURA} - convertir una imagen en una pintura simulada {TEXTURA} - añadir textura a una imagen o área seleccionada {FUSIÓN} - suprimir detalles finos manteniendo la nitidez {IGUALAR COLORES} - igualar los colores de una imagen con los de otra imagen {PATRÓN} - añadir un patrón de fondo a una imagen {ENTRECRUZADO} - convertir en un boceto usando líneas paralelas entrecruzadas {TRAMADO} - diferentes formas de pixelar o posterizar una imagen {GRABADO} - convertir una imagen en líneas en blanco y negro {AÑADIR DESTELLO} - añadir destello alrededor de objetos brillantes en la imagen {MOSAICO} - convertir una imagen en un mosaico usando mosaicos hechos de imágenes {AÑADIR RUIDO} - añadir ruido aleatorio a una imagen {ESTABLECER COLORES} - reducir el número de colores (posterizar) {DESPLAZAR COLORES} - desplazar gradualmente los colores RGB a GBR o BRG {COLORES ALIENÍGENAS} - añadir colores extraños aleatorios a una imagen {KERNEL PERSONALIZADO} - editar y aplicar un kernel de convolución personalizado - {MENÚ DE DEFORMACIÓN} {ENDEREZAR CURVATURA} - enderezar imágenes con líneas curvas, especialmente panorámicas {PERSPECTIVA} - enderezar un objeto fotografiado en un ángulo obtuso {DEFORMAR ÁREA} - deformar un área de la imagen seleccionada arrastrando con el ratón {WARP LINEAR1} - deformar la imagen arrastrando con el ratón - deformación lineal 1 {WARP LINEAR2} - deformar la imagen arrastrando con el ratón - deformación lineal 2 {DEFORMACIÓN CURVA} - deformar la imagen arrastrando con el ratón - deformación curva {DEFORMACIÓN AFÍN} - deformar la imagen arrastrando con el ratón - se conservan las líneas paralelas {DEFORMACIÓN RADIAL} - añadir o eliminar distorsión de barril o cojín {DESDEFORMAR PRIMER PLANO} - eliminar la distorsión de fotos de cara en primer plano (nariz grande) {CREAR OLAS} - deformar una imagen con un patrón de olas {TORSIÓN} - torsionar una imagen alrededor de un centro elegido {ESFERA} - curvar una imagen en forma esferoidal {INVERSO} - invertir la distancia centro-borde de cada píxel {PLANETA DIMINUTO} - envolver una imagen panorámica alrededor de un círculo {ESPIRAL DE ESCHER} - transformar una imagen en una espiral infinita hacia el interior {APLANAR FOTO} - aplanar una foto de una superficie curva - {MENÚ DE COMBINAR} {HDR} - combinar imágenes oscuras/claras para un rango de brillo extendido {HDF} - combinar imágenes con enfoque cercano/lejano para una profundidad de campo extendida {PILA/PINTURA} - combinar imágenes para eliminar coches, turistas, etc. en tránsito {PILA/RUIDO} - combinar imágenes para reducir el ruido mediante promediado {PILA/CAPAS} - combinar versiones de imagen, seleccionar/pintar área/versión {PANORÁMICA} - combinar una serie de imágenes horizontalmente {MOSTRAR ARCHIVOS CIM} - mostrar los archivos de entrada de la imagen combinada actual/más reciente {MASHUP} - organizar imágenes y texto con formato en un diseño personalizado {MATRIZ DE IMÁGENES} - unir muchas imágenes en un formato de matriz compacto - {MENÚ MASIVO} {CONVERSIÓN MASIVA} - copiar, mover, reescalar, renombrar, convertir, añadir texto ... {COPIAR/MOVER MASIVO} - copiar/mover los archivos de imagen seleccionados a una nueva carpeta {ENDEREZADO MASIVO} - buscar archivos de imagen rotados y enderezarlos {ELIMINAR/PAPELERA MASIVO} - eliminar o enviar a la papelera los archivos de imagen seleccionados {SUPERPOSICIÓN MASIVA} - añadir imagen de superposición (copyright ...) a las imágenes seleccionadas {KEYWORDS MASIVAS} - añadir o eliminar keywords para los archivos de imagen seleccionados {RENOMBRAR KEYWORDS MASIVO} - renombrar o eliminar keywords para todos los archivos de imagen {PURGA MASIVA DE KEYWORDS} - purgar keywords no deseadas de todos los archivos de imagen {FECHA DE FOTO MASIVA} - cambiar fechas u horas de foto, o desplazar la zona horaria {CAMBIO MASIVO DE META} - añadir o revisar metadata para los archivos de imagen seleccionados {INFORME MASIVO DE META} - informar de la metadata de los archivos de imagen seleccionados o todos {GEOTAGS MASIVOS} - añadir o revisar geotags para los archivos de imagen seleccionados o todos {EXPORTAR ARCHIVOS} - exportar los archivos seleccionados a una carpeta (p. ej. subida web) - {MENÚ DE HERRAMIENTAS} {INDEXAR ARCHIVOS} - tarea de una sola vez para buscar e indexar todos los archivos de imagen {MOVER INICIO DE FOTOCX} - mover la carpeta de inicio de Fotocx (datos de usuario y configuración) {CONFIGURACIÓN} - preferencias y configuración de usuario para el funcionamiento de Fotocx {ATAJOS DE TECLADO} - mostrar y revisar los atajos de teclado para funciones de menú {HISTOGRAMA RGB} - gráfico de histograma de brillo para la imagen actual {AMPLIAR IMAGEN} - convertir el ratón en una lupa sobre la imagen {MEDIR IMAGEN} - medir distancias de píxeles dentro de la imagen (clics del ratón) {MOSTRAR RGB} - mostrar valores RGB en la posición del ratón o de puntos seleccionados {CONFIGURACIÓN DE CUADRÍCULA} - mostrar o quitar líneas de cuadrícula, fijar número de líneas o espaciado {COLOR DE LÍNEA} - fijar el color para los contornos de área seleccionada {PÍXELES OSCUROS/BRILLANTES} - herramienta para resaltar el recorte (clipping) {COLOR DE MONITOR} - ajustar el brillo y contraste del monitor {BUSCAR DUPLICADOS} - buscar imágenes duplicadas en una galería o en todas las imágenes {BUSCAR ARCHIVOS DAÑADOS} - buscar archivos de imagen ilegibles, eliminar/mover/corregir {MOSTRAR RECURSOS} - mostrar el tiempo de CPU y el uso actual de memoria {TRADUCCIONES} - crear o modificar traducciones de la interfaz - {MENÚ DE AYUDA} - guía del usuario, tutorial, registro de cambios, acerca de Fotocx, desinstalar - {OTROS TEMAS} {VIDEO FILES} - archivos de vídeo, thumbnails, reproducir vídeos {DIAPOSITIVAS Y NEGATIVOS} - cómo capturar diapositivas y negativos de película {LIMITACIONES DE FOTOCX} - límites de tamaño y rendimiento {FOTOCX PARA WINDOWS 11} - instalar Fotocx en Windows 11 WSL {PRIVACIDAD} - política de privacidad y protección de datos de Fotocx {PROBLEM, QUESTION, SUGGESTION} - contactar con el autor de Fotocx - - TOPIC: USO DE FOTOCX - - TOPIC: PRIMER INICIO - ^Programas externos Fotocx informa de los programas externos requeridos y opcionales y la función que cumple cada uno. Si falta algún programa requerido, instálalo e inicia Fotocx de nuevo. - ^Primer índice Fotocx indexará tus archivos de imagen. Esto hace que las páginas de galería (thumbnails) se muestren rápido, permite la búsqueda rápida basada en metadata indexada, y habilita marcadores de mapa en los que se puede hacer clic para ver imágenes por ubicación. Debes indicar una o más carpetas de imágenes "principales" (p. ej. /home//Imágenes). Las subcarpetas se incluyen automáticamente. Los archivos que no son de imagen en estas carpetas se ignoran. Usa el botón [select] para localizar y añadir tus carpetas de imágenes principales. Un límite práctico es de unas 30 carpetas principales. Cada una puede tener cientos de subcarpetas. - ^Thumbnails Esta es la carpeta donde se colocarán los archivos de thumbnails. Usa la predeterminada o elige otra ubicación. - ^Tiempo de indexado La velocidad de indexado puede variar entre unos pocos cientos y más de 10 mil archivos por minuto, según el tipo y tamaño de tus archivos de imagen y la velocidad de tu ordenador. Cuando añadas nuevos archivos de imagen a tu colección, el próximo inicio de Fotocx indexará los archivos nuevos. Si hay muchos archivos nuevos, el inicio necesitará tiempo para indexarlos. - ^Consolidación de título y descripción de imagen La función de índice de imágenes de Fotocx reemplaza la metadata de título y descripción que falta con uno de los muchos tags de metadata alternativos, si está disponible: headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. Esto se hace para que siempre puedas ver/editar/buscar usando solo "título" y "descripción". Este proceso de conversión es relativamente lento (2200 archivos/minuto en mi ordenador potente). Esto se hace cuando los archivos de imagen nuevos se indexan por primera vez. No se borra nada. - - TOPIC: GUÍA DEL USUARIO Abre la guía del usuario desde el menú Ayuda > Guía del usuario. Mientras usas Fotocx, puedes pulsar F1 para ver el tema de la guía del usuario correspondiente a la función de menú actual o más reciente. - Para desplazar el texto, usa las teclas de flecha arriba/abajo y Av Pág/Re Pág. El botón [Buscar] abre un diálogo para una búsqueda de texto. Pulsa [Buscar] de nuevo para la siguiente coincidencia. - El texto en negrita y mayúsculas es un enlace en el que se puede hacer clic hacia un tema, p. ej. {INDEXAR ARCHIVOS}. Usa los botones [<] y [>] para ir hacia atrás y hacia adelante entre los temas vistos recientemente. El botón [Recent] presenta una lista, en la que se puede hacer clic, de los temas vistos recientemente. - - TOPIC: VISTAS DE VENTANA Y MENÚS +image: fotocx-views.jpg - ^Botones de menú Al hacer clic en un menú, aparece un submenú emergente. Los tres menús superiores (Archivo, Galería, Mapas) establecen el modo de vista correspondiente. También se pueden usar las teclas F/G/M. - - TOPIC: VISTA DE ARCHIVO Una imagen llena toda la ventana de Fotocx. Acerca/aleja el zoom con el clic izquierdo/derecho del ratón. La tecla Z alterna entre ajustar a la ventana y tamaño de imagen 1x (1 píxel de imagen = 1 píxel de pantalla). Para desplazar una imagen ampliada, arrastra el ratón con el botón izquierdo sobre la imagen. La rueda del ratón también puede acercar o alejar el zoom de una imagen. Usa los botones de menú (Editar, Reparar, etc.) para modificar la imagen. Usa el botón Guardar archivo para guardar un archivo modificado: reemplazar, crear una nueva versión, o crear un nuevo archivo (nuevo nombre). - ^Teclas de flecha izquierda/derecha del teclado Ver el archivo de imagen anterior o siguiente en la galería actual. - ^teclas de flecha arriba/abajo Como arriba, pero solo se muestran las últimas versiones, o el original si no existen versiones. - - TOPIC: VISTA DE GALERÍA Todos los archivos de imagen de la galería actual se muestran como una matriz de thumbnails. - ^Tipos de galería • Carpeta: todos los archivos de imagen y subcarpetas en una sola carpeta (directorio) • Álbum: archivos de imagen de varias carpetas, organizados por el usuario • Archivos recientes: los archivos de imagen vistos o editados más recientemente • Archivos más recientes: archivos de imagen añadidos o modificados más recientemente • Resultados de búsqueda: imágenes encontradas por la función Buscar. También es un álbum. - ^Funciones de galería • clic izquierdo en un thumbnail de imagen: abrir la imagen en modo Vista de archivo • clic derecho en un thumbnail de imagen: menú emergente de funciones comunes • clic en el thumbnail de una carpeta: abrir esa carpeta en modo Galería • barra SUPERIOR de la galería de carpetas: carpetas superiores - clic para ir allí • botón [TOP]: lista de carpetas de nivel superior - clic para ir allí • barras de desplazamiento: desplazarse arriba/abajo dentro de la galería • teclas de flecha arriba/abajo: desplazar la galería una fila • teclas Av Pág/Re Pág: desplazar la galería una página • teclas inicio/fin: ir al principio (arriba) y al final (abajo) de la galería • rueda del ratón: desplazar la galería arriba y abajo • teclas [+] y [-]: aumentar/disminuir el tamaño de los thumbnails - ^Imágenes emergentes de la galería • Haz clic en un thumbnail con el botón central del ratón para una imagen emergente • Haz clic en un thumbnail con mayús + clic izquierdo del ratón para una imagen emergente • Clic izquierdo en la imagen emergente: ampliar la imagen • Clic derecho en la imagen emergente: cerrar la imagen emergente • Rueda del ratón: ampliar o reducir la imagen emergente • Tecla F11: poner la imagen emergente en pantalla completa • Tecla Escape: cerrar la imagen emergente • Se pueden usar varias imágenes emergentes para comparar imágenes - - TOPIC: VISTA DE MAPA Ver mapas que contienen marcadores correspondientes a ubicaciones de imágenes. Haz clic en un marcador para ver una galería de las imágenes correspondientes. Esto depende de que tus archivos de imagen tengan geocoordenadas incrustadas (latitude, longitude). Las cámaras modernas insertan esto automáticamente, y también puedes añadir estos datos tú mismo. Inicialmente se muestra un mapa mundial. Usa la rueda del ratón para acercar/alejar en cualquier ubicación. Arrastra para desplazar el centro del mapa. Se puede ver el mundo entero a cualquier escala, hasta el nivel de calle. - - TOPIC: ARRASTRAR Y SOLTAR Si abres dos sesiones de Fotocx, puedes arrastrar y soltar archivos de una a la otra. Arrastra un thumbnail de galería de una ventana a la otra. Si es Vista de archivo, el archivo se abre. Si es Vista de galería, el resultado depende del tipo de galería. Si la galería es una carpeta, el archivo se añade a la carpeta y la galería mostrará el archivo nuevo en su posición ordenada. Si la galería es un álbum, el archivo se añade al álbum en la posición donde se suelta. - - TOPIC: EDITAR PROCEDIMIENTOS La imagen en modo Vista de archivo (la imagen actual) se puede modificar con las funciones de edición de los menús Editar, Reparar, Refinar, Efectos, Deformar y Combinar. Estas funciones modifican la imagen actual en memoria y en la ventana. A medida que usas estas funciones, las ediciones se van acumulando. Cuando termines de editar, usa el botón de menú [Guardar] para guardar la imagen modificada de nuevo en el mismo archivo, en una nueva versión (p. ej. filename.v01.jpg), o en un nuevo archivo y/o carpeta. Los diálogos de edición de imagen tienen controles deslizantes, botones, botones giratorios, o curvas editables que actualizan la imagen inmediatamente. - Haz clic izquierdo o derecho en el botón Deshacer/Rehacer para deshacer o rehacer la función de edición actualmente activa. Después de que se hayan aplicado una o más ediciones a una imagen, el botón deshacer/rehacer se puede usar para avanzar y retroceder por todos los pasos completados y ver el estado de la imagen tras cada paso. El botón central del ratón muestra una lista emergente de todas las ediciones hechas a la imagen actual, y puedes seleccionar cualquier paso para volver a él. La imagen se puede reeditar desde cualquier paso anterior. Esto descartará las ediciones hechas después de ese paso, ya que se derivaban de él. Esta capacidad de deshacer/rehacer se mantiene mientras la imagen editada siga siendo la imagen actual. Si se abre otra imagen, se descarta el historial de edición. Si quieres conservar la posibilidad de volver al estado actual de la imagen, guarda la imagen como una nueva versión antes de continuar con otra edición. - - TOPIC: EDITAR FLUJO DE TRABAJO - ^Flujo de trabajo simple La mayoría de las veces puedes simplemente editar el archivo JPEG que sale de la cámara. Usa el siguiente procedimiento, más complejo, solo si ves bandas de color después de ediciones que hayan expandido el rango de brillo en algunas áreas de la imagen, haciendo que los escalones de brillo sean lo bastante grandes como para verse. - ^Flujo de trabajo complejo Para editar con color profundo (más de 8 bits por color RGB), empieza con el archivo RAW de la cámara. Un archivo RAW se puede editar como cualquier otro archivo de imagen. Las funciones de edición de Fotocx trabajan con 24 bits por color, por lo que se conserva toda la profundidad de color del archivo RAW. Cuando abres un archivo RAW, se usa el cargador RAW elegido - consulta {CONFIGURACIÓN}. También puedes usar Conversión masiva para convertir varios archivos RAW a archivos TIFF, PNG o JXL con 16 bits por color. - Dcraw es el cargador de archivos RAW predeterminado. También puedes usar un editor RAW más complejo como Rawtherapee - consulta {CONFIGURACIÓN}. Dcraw es simple y rápido en comparación. Las funciones de edición de un editor RAW normalmente se pueden hacer más fácilmente con Fotocx. - - TOPIC: PROPIEDAD DEL RATÓN Algunos diálogos de edición usan el ratón para referenciar o modificar la imagen en la ventana principal. Puede haber más de uno de estos diálogos activo al mismo tiempo. El ratón también se usa para acercar/alejar y desplazar la imagen, y es posible que necesites hacer esto mientras usas un diálogo de edición. Por lo tanto, es importante entender qué diálogo o ventana tiene el control del ratón, y cómo cambiar ese control: • Si un diálogo tiene el foco de teclado, las acciones del ratón sobre la imagen son entradas para ese diálogo y no acercan/alejan ni desplazan la imagen. • Si mantienes pulsada la tecla CTRL mientras haces clic o arrastras el ratón sobre la imagen, la imagen se acercará/alejará o se desplazará. Los diálogos abiertos no se ven afectados. • La rueda del ratón puede acercar/alejar en cualquier ubicación de la imagen. - - TOPIC: RATÓN ALT-BOTÓN DERECHO Para touchpads o pantallas táctiles, los clics con el botón derecho del ratón pueden ser incómodos. Si se mantiene pulsada la tecla ALT mientras se pulsa el botón izquierdo del ratón, esto se interpreta como el botón derecho del ratón. - - TOPIC: BOTONES DE DIÁLOGO Estos funcionan mayormente de la siguiente manera: • [Restablecer] - deshace la edición actual, devuelve la imagen a su estado inicial • [Aplicar] - aplica la configuración del diálogo a la imagen, deja el diálogo activo • [OK] - igual que [Aplicar], pero el diálogo se cierra • [Cancelar] - descarta los cambios de la imagen y cierra el diálogo • [Continuar] - continúa con una tarea larga basada en las entradas del diálogo • [X] - cierra el diálogo sin realizar ninguna acción - - TOPIC: TECLA ESCAPE DEL TECLADO La ventana principal tiene el foco: • si una función de larga duración todavía se está ejecutando, la termina • si la ventana principal está maximizada, restaura el tamaño anterior • si la vista actual es galería o mapa, cambia a vista de archivo • ninguno de los anteriores: cierra Fotocx La ventana de diálogo tiene el foco: cierra el diálogo (igual que el botón [X]) Otros: cancela la imagen emergente, sale del visor de panorama 360, pausa o sale de la Presentación de diapositivas. - - TOPIC: WIDGETS DE DIÁLOGO NO ESTÁNDAR +image: custom-widgets.png - Se usan algunos widgets no estándar para reducir el tamaño del diálogo o mejorar la facilidad de uso. Funcionan casi como los widgets estándar de GTK. El widget de datos numéricos funciona como un botón giratorio (spin-button) de GTK: la rueda del ratón y las teclas de flecha arriba/abajo del teclado se pueden usar para aumentar o disminuir el valor rápidamente. Si usas un touchpad, toca la entrada para posicionar el cursor, luego usa el teclado para introducir un valor, o usa las teclas de flecha arriba/abajo del teclado para pasar rápidamente a un nuevo valor. Si se mantiene pulsada la tecla, la velocidad del cambio se acelera con el tiempo. La tecla mayús se puede usar para aumentar la velocidad 10 veces. Un control deslizante no lineal expande la escala alrededor del valor neutro, de modo que los cambios pequeños se puedan controlar con más precisión, especialmente con un touchpad. Algunos widgets estándar de GTK se han reducido de tamaño eliminando el relleno excesivo. Esto se controla mediante el archivo 'widgets.css' en la carpeta de inicio de Fotocx. Puedes modificar este archivo si lo deseas. Puedes eliminar elementos o marcarlos como comentarios, pero no elimines el archivo - se reemplazaría automáticamente. - - TOPIC: EDICIÓN DE CURVAS +image: retouch.png - Algunas funciones de edición de imagen usan curvas editables. Puedes manipular las curvas para cambiar alguna propiedad de la imagen en función de otra propiedad. Las curvas se pueden mover (arrastrar) con el ratón. Se añade un punto de anclaje (punto negro) a la curva donde sea que se arrastre, y este punto permanece fijo - la curva seguirá pasando por este punto mientras se arrastran otras partes de la curva. Un punto de anclaje se puede mover arrastrándolo, o eliminar haciendo clic derecho. - - TOPIC: MOUSE PAINTING El ratón se puede usar para editar una imagen localmente. Un círculo alrededor de la posición del ratón encierra un área de la imagen que se modifica a medida que el ratón se arrastra con el botón izquierdo sobre la imagen. El origen de la modificación puede ser una función de edición, un color elegido, o píxeles de otro lugar de la misma imagen o de otra imagen. Los píxeles de la imagen dentro del círculo del ratón se modifican para coincidir con el origen. La velocidad del cambio puede ser rápida o gradual, según los factores de potencia para el centro y el borde del ratón. Si el factor del centro es alto y el del borde bajo, la imagen se modifica más rápido en el centro del ratón y gradualmente menos desde el centro hacia el borde. Arrastra el ratón con el botón izquierdo repetidamente sobre la misma área de la imagen para acumular los cambios, hasta que los píxeles coincidan completamente con el color o imagen de origen, o la función de edición de origen se aplique por completo. Arrastra con el botón derecho para deshacer gradualmente los cambios, restaurando la imagen original. - Ejemplo: si la función de edición es Retocar, y se aumenta el brillo, entonces la imagen se aclarará dentro del área del ratón a medida que el ratón se arrastra con el botón izquierdo. Usa el arrastre con el botón derecho para restaurar gradualmente la imagen original. - El botón [undo-last] revierte la última operación de pintar o borrar, y esto se puede repetir para eliminar muchas ediciones recientes. Cada nueva operación de arrastre del ratón es una unidad de trabajo que se puede revertir por separado. La memoria para deshacer es limitada, por lo que solo se conservan los pasos recientes de pintar y borrar. [undo all] devolverá la imagen a su estado inicial. - Usa el botón [undo/redo] para revisar los cambios durante las ediciones. - Si hay un {SELECCIONAR ÁREA} activo, la pintura se confina dentro del área. - NOTA: Amplía (zoom) la imagen al 100% o más cuando uses un radio muy pequeño (p. ej. al dibujar líneas en la imagen). Los pasos de movimiento del ratón están en píxeles de pantalla. Si esto abarca muchos píxeles de imagen y se usa un radio pequeño, es posible que el ratón se salte algunos píxeles y no se procesen. - - TOPIC: PROCESAMIENTO MASIVO Hay varias funciones masivas en el {MENÚ MASIVO} para agilizar algunas tareas comunes. Puedes seleccionar muchos archivos de imagen y ejecutar la función masiva para todos ellos. Las funciones masivas se pueden usar para cambiar el nombre o tipo de archivo, enderezar, reescalar, copiar o mover, eliminar, revisar tags, keywords, ubicación/geocoordenadas, fechas de foto. - - TOPIC: SELECCIONAR ARCHIVOS DE IMAGEN +image: select-image-files.jpg - Este procedimiento se usa para todas las funciones que operan sobre varios archivos de imagen. El procedimiento se explica aquí, y este tema está enlazado desde cada función que usa el procedimiento. • clic izquierdo en un thumbnail: añadir a la lista de selección • clic derecho: eliminar • añadir varios: haz clic en el primer thumbnail, mayús + clic en el último • botón [Añadir todo]: añadir toda la galería • botón [Añadir actual]: añadir el archivo actual • un archivo se puede añadir varias veces a la lista • navega a otras galerías para seleccionar más archivos según sea necesario • botón [Eliminar]: eliminar la posición seleccionada de la lista • botón [Borrar]: borrar toda la lista • teclas de flecha arriba/abajo: recorrer la lista, ver thumbnails • teclas inicio/fin: ir al principio/final de la lista - El botón [Desactivar] desactivará el clic en thumbnails para seleccionar archivos. El botón se renombra entonces a [Activar] - púlsalo para restaurar el clic en thumbnails. El propósito de esto es habilitar los menús emergentes normales de thumbnails y el clic izquierdo para ver un archivo a tamaño completo, lo cual no es posible si los clics en thumbnails se están usando para la selección de archivos. Puede que necesites esto para decidir las selecciones. También puedes permanecer en modo de vista de archivo y recorrer las imágenes usando las teclas de flecha, mientras usas el botón [Añadir actual] para añadir archivos a la lista de selección. - - TOPIC: ATAJOS Hay tres métodos abreviados para las funciones de uso frecuente: • Haz clic derecho en la ventana principal o en un thumbnail de la galería. Aparece un menú emergente con algunas funciones de uso común. • Puedes cambiar las teclas de atajo y añadir nuevos atajos. Consulta {ATAJOS DE TECLADO}. • Reúne las funciones de uso frecuente en un menú personalizado. Consulta {MENÚ PERSONALIZADO}. - Hay atajos de teclado disponibles para las funciones más comunes. Usa el menú Herramientas > Atajos de teclado para verlos o cambiarlos. - Los siguientes atajos de teclado son fijos y no se pueden cambiar: • Tecla [+] [=]: acercar el zoom de la imagen o los thumbnails • Tecla [-]: alejar el zoom de la imagen o los thumbnails • Tecla Z: alternar zoom: 1x <--> ajustar a la ventana • Tecla F1: mostrar la guía del usuario para la función actual • Tecla F10: alternar la ventana principal a pantalla completa y volver • Tecla F11: como F10, sin menús, barra de título, panel superior • Tecla Escape: detener la función en ejecución, salir del diálogo activo • Tecla Supr: diálogo para eliminar o enviar a la papelera el archivo actual • Flecha izquierda/derecha: mostrar la imagen anterior/siguiente en la galería • Flecha arriba/abajo: igual, pero mostrando solo las últimas versiones • Av Pág/Re Pág: vista de galería: desplazar una página arriba/abajo • Inicio/Fin: vista de galería: ir a la primera/última página de la galería - Los siguientes atajos de teclado son predeterminados y el usuario puede cambiarlos: • F: Vista de archivo - cambiar al modo de vista de archivo • G: Vista de galería - cambiar al modo de vista de galería • M: Vista de mapa - cambiar al modo de vista de mapa • 2: Ciclo 2 archivos - alternar mostrando los dos archivos más recientes • 3: Ciclo 3 archivos - alternar mostrando los tres archivos más recientes • A: Álbum actual - mostrar el álbum visto más recientemente • T: Retocar - iniciar la función de edición Retocar • C: Recortar - iniciar la función de edición Recortar • K: Atajos de teclado - iniciar el diálogo de atajos de teclado • P: Imprimir imagen - abrir el diálogo de imprimir imagen • R: Rotar - iniciar la función de edición Rotar • U: Deshacer - deshacer la edición actual o la última de una serie • Mayús+U: Rehacer - rehacer la edición actual o la siguiente de una serie • Ctrl+C: Copiar al portapapeles - copiar el archivo actual al portapapeles • Mayús+C: Alternar subtítulos - alternar mostrar/ocultar subtítulos • Ctrl+G: mostrar la galería de la carpeta del archivo actual • Mayús+G: Alternar cuadrícula - alternar las líneas de cuadrícula activadas/desactivadas • Ctrl+S: Guardar - iniciar el diálogo de guardar archivo - - TOPIC: FUNCIONES DEL RATÓN - ^Vista de archivo • clic izquierdo - Acercar: ampliar la imagen, centrada en el ratón • clic derecho - si la imagen está ampliada: restaurar al tamaño de la ventana si no, menú emergente con funciones comunes • rueda del ratón - acercar o alejar el zoom de la imagen • arrastrar la imagen con el botón izquierdo - desplazar la imagen ampliada • Ctrl + ratón - el ratón actúa sobre la imagen, no sobre el diálogo activo - ^Vista de galería • clic izquierdo en el thumbnail - cambiar a Vista de archivo • clic derecho en el thumbnail - mostrar menú emergente con funciones comunes • clic central en el thumbnail - imagen emergente grande, zoom con la rueda del ratón • rueda del ratón - desplazar la página de la galería arriba o abajo - ^Vista de mapa • arrastrar con el botón izquierdo - arrastrar el mapa, siguiendo al ratón • rueda del ratón - acercar o alejar el mapa • clic izquierdo en un marcador - mostrar galería de imágenes en esa ubicación • si el diálogo de editar metadata está activo, un clic izquierdo fija las geocoordenadas - - TOPIC: PARÁMETROS DE COMANDO Estos parámetros se pueden usar si Fotocx se inicia desde una terminal. -help muestra la guía del usuario -home /carpeta ubicación alternativa de inicio de Fotocx (ver abajo) -lang xx fija el idioma a partir del código de 2 caracteres -recent muestra la galería de archivos de imagen recientes -new muestra la galería de archivos de imagen más nuevos -album nombrealbum álbum (galería) a abrir -prev muestra el último archivo visto en la sesión anterior -blank muestra una ventana en blanco -dev muestra el menú de desarrollador normalmente oculto -menu nombremenu Fotocx se iniciará con este menú activo -cwp nnn nombre ciclar fondo de escritorio (ver abajo) -x0 -x1 -x2 fija el nivel de índice en 0, 1 o 2 (ver abajo) - ^parámetro -x0 -x1 -x2^ (fija el nivel de índice al iniciar) Estos parámetros se pueden usar para anular el valor de {CONFIGURACIÓN} -x0 inicio muy rápido, sin índice de imágenes -x1 inicio rápido, indexa solo archivos antiguos -x2 archivos antiguos + buscar archivos nuevos/modificados - ^parámetro -home^ (carpeta de inicio alternativa de Fotocx) Carpeta de inicio de Fotocx predeterminada: /home//.fotocx. Aquí es donde se guardan la configuración de usuario y el índice de imágenes. El comando "$ fotocx -home " usa la carpeta indicada. Esto permite gestionar por separado varias colecciones de imágenes. Consulta también {MOVER INICIO DE FOTOCX}. - ^parámetro -cwp^ (ciclar fondo de escritorio) La línea de comando completa es: $ fotocx -cwp segundos contenedor Usa este comando para ciclar la imagen de fondo de escritorio a partir de un conjunto seleccionado. 'segundos' es el intervalo entre imágenes. 'contenedor' es un nombre de álbum de Fotocx o una carpeta que contiene archivos de imagen. Añade este comando a tu lista de inicio de sesión para obtener un nuevo fondo de escritorio a intervalos especificados. Usa un intervalo de un día o más para obtener una nueva imagen de fondo con cada inicio de sesión. Fotocx se ejecuta en segundo plano sin interfaz gráfica. Si 'segundos' es cero, se realizará una actualización del fondo de escritorio y luego Fotocx se cerrará. Cada distribución de Linux tiene un comando diferente. Teóricamente, están cubiertas las siguientes: Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: MENÚ DE ARCHIVO - - TOPIC: NUEVA SESIÓN Inicia una nueva sesión de Fotocx en una ventana nueva. Si un archivo de imagen se edita en ambas ventanas, ninguna instancia verá los cambios hechos por la otra, y el resultado final es el último archivo guardado. - - TOPIC: ABRIR ARCHIVO DE IMAGEN Selecciona un archivo de imagen para ver o editar, usando un diálogo convencional de abrir archivo con carpetas y listas de archivos. Esto es útil para el caso en que los archivos no están indexados y la visualización de la galería es muy lenta, p. ej. al leer desde una tarjeta SD de cámara que contiene miles de archivos de imagen. - - TOPIC: CICLO 2 ARCHIVOS Repetir este menú alternará entre los dos archivos abiertos más recientemente. Esta función conserva el tamaño y la posición de zoom de la imagen actual, lo cual es ideal para comparar rápidamente dos versiones editadas del mismo archivo de imagen. - - TOPIC: CICLO 3 ARCHIVOS Esto funciona igual que Ciclo 2 archivos, pero alternando entre los últimos 3 archivos abiertos. - - TOPIC: VER PANORÁMICA 360° El archivo actual se abre con un visor especial para archivos panorámicos de 360°. Se asume que el ancho de la imagen es de 360°. Usa esta función para ver imágenes 'photosphere' de Google. Desplaza la imagen arrastrando con el ratón o con las teclas de flecha izquierda/derecha. Acerca o aleja el zoom con el clic izquierdo/derecho del ratón. Usa Escape para salir del visor especial. - - TOPIC: RENOMBRAR Renombra el archivo actual (Vista de archivo), o el archivo de un thumbnail pulsado (Vista de galería). Introduce un nuevo nombre y pulsa [aplicar]. Esta función también puede automatizar el proceso de renombrar una serie de archivos de imagen usando un nombre raíz y un número de secuencia. Abre el primer archivo de imagen de la serie, introduce un nuevo nombre, y pulsa el botón [aplicar]. Usa el botón [next] para pasar al siguiente archivo si lo deseas. Puedes usar el mismo nombre otra vez pulsando el botón [nombre anterior] y luego añadir un sufijo o número de secuencia. Pulsa el botón [add 1] para incrementar el número de secuencia. - - TOPIC: IMAGEN EN BLANCO Crea una imagen en blanco con las dimensiones en píxeles y el color especificados. Esto se puede usar como fondo para recortes tomados de otras imágenes (mediante {SELECCIONAR ÁREA}) y texto de anotación (mediante {MARCADO}, dibujar texto). - - TOPIC: COPIAR/MOVER El archivo actual (Vista de archivo) o el archivo de un thumbnail pulsado (Vista de galería) se copia a la ubicación indicada. Selecciona la opción de copiar para copiar el archivo y dejar el archivo de origen en su sitio, creando un duplicado. Selecciona la opción de mover para mover el archivo de la ubicación original a la nueva ubicación. Se puede procesar rápidamente un grupo de archivos haciendo clic en cada thumbnail seguido de [aplicar]. El botón [Ant] se puede usar para copiar el nombre de archivo usado anteriormente. Añade un número de versión u otra cosa para evitar un archivo duplicado. - - TOPIC: COPIAR AL ESCRITORIO El archivo actual (Vista de archivo) o el archivo de un thumbnail pulsado (Vista de galería) se copia a la carpeta de escritorio (/home//Desktop). - - TOPIC: COPIAR AL PORTAPAPELES El archivo actual (Vista de archivo) o el archivo de un thumbnail pulsado (Vista de galería) se copia al portapapeles, desde donde otras aplicaciones pueden pegarlo. - - TOPIC: ELIMINAR/PAPELERA El archivo actual (Vista de archivo) o el archivo de un thumbnail pulsado (Vista de galería) se elimina o se mueve a la papelera, según la opción seleccionada. Fotocx usa la ubicación estándar de la papelera (~/.local/share/Trash). - - TOPIC: ESTABLECER FONDO DE ESCRITORIO El fondo de escritorio se establece a partir del archivo de imagen actual. - - TOPIC: IMPRIMIR IMAGEN El menú imprimir imagen abre un diálogo estándar de Configurar página donde puedes seleccionar una impresora, un tamaño de papel y la orientación. Después de usar el botón [aplicar], se inicia otro diálogo para introducir los márgenes de papel y la escala de la imagen. - Si la imagen tiene área(s) seleccionada(s), se te pregunta si solo se debe(n) imprimir la(s) área(s). Estas se imprimirán usando el rectángulo mínimo necesario para encerrar las áreas, y las áreas fuera de las selecciones no se imprimen. - - TOPIC: IMPRIMIR CALIBRADO Esta función funciona como Imprimir archivo de imagen descrita arriba, pero antes de imprimir se te pide que proporciones un archivo de calibración que se usa para ajustar los colores de la imagen antes de imprimir. El propósito es compensar las desviaciones de color causadas por la impresora y el tipo de papel. - - TOPIC: CALIBRAR IMPRESORA +image: printer-calibrate-chart.png +image: calibrate-printer.png - Esta utilidad puede mejorar la precisión del color de las imágenes impresas. - ^Cómo funciona Se imprime una carta de colores en la impresora de destino. Algunos de los colores impresos serán ligeramente incorrectos debido a imperfecciones de la impresora. Esta página impresa se escanea a un archivo, y los colores de este archivo se comparan con los colores originales que se imprimieron. Cualquier diferencia son errores que ahora se conocen (suponiendo que tu escáner sea más preciso que tu impresora - generalmente cierto). Cuando se imprime un archivo de imagen, estos errores se restan de los colores de la imagen antes de imprimir. La impresora vuelve a añadir los errores, dejando un resultado que teóricamente es correcto. Mi propia prueba mostró una mejora modesta, detallada abajo. - Realiza los siguientes pasos en secuencia, tal como se indican en la ventana de diálogo. Todos los archivos están en la carpeta /printer_color. • Genera e imprime el archivo de carta de colores (printchart.png). Usa un tamaño de papel grande, orientación vertical, sin márgenes. • Escanea la carta impresa a un archivo PNG. Usa 300 ppp o más. • Edita la imagen PNG para recortar los márgenes dejados por el escáner. Guarda el archivo de imagen editado. • Procesa el archivo de imagen editado para crear un archivo de mapa de color. - Ahora puedes imprimir usando el menú {IMPRIMIR CALIBRADO}, que pedirá el nombre del archivo de mapa de color para la impresora y el papel que estás usando. - Los escáneres pueden inclinar una imagen escaneada dándole una forma ligeramente no rectangular. Si esto ocurre, lo notarás al intentar recortar los márgenes: las gruesas líneas de margen verdes no se alinearán perfectamente con el rectángulo de recorte. Si esto ocurre, usa {PERSPECTIVA} para escuadrar la imagen primero, y luego recorta los márgenes. - Al editar la imagen de la carta escaneada, asegúrate de que la fila más oscura esté arriba. Recorta los márgenes que rodean los mosaicos de color. Usa la gruesa línea de margen verde que rodea los mosaicos de color como guía: corta esta línea exactamente, dejando solo los mosaicos. Trabaja con 2x de ampliación mientras ajustas el rectángulo de recorte. Un recorte preciso es importante. Si el recorte no es preciso, las posiciones calculadas de los mosaicos quedarán desplazadas, y los colores medidos podrían ser incorrectos. Se tolera un pequeño error. Puedes usar las teclas de flecha del teclado para movimientos de 1 píxel en el rectángulo de recorte. La última esquina arrastrada con el ratón es la esquina que moverán las teclas de flecha. - El archivo de mapa de color de salida solo se puede usar para la configuración de papel e impresora usada en la calibración. Cualquier otra combinación necesita su propia calibración y archivo de mapa de color. - ^Resultados^ (mi impresora Canon) +image: printer-calibrate.jpg +image: printer-cal-study.png - La carta de arriba es una foto de tres imágenes: arriba izquierda: impresión de una foto de carta de colores arriba derecha: impresión calibrada de la misma foto abajo: la carta de colores en sí Dado que las 3 imágenes se fotografiaron juntas, los errores de la cámara son iguales, lo que hace válidas las comparaciones. - - TOPIC: MENÚ DE GALERÍA - - TOPIC: VISTA GENERAL DE GALERÍA +image: image-management.jpg - Una galería de imágenes en miniatura puede representar una carpeta de archivos, el resultado de una búsqueda de imágenes, una de las galerías integradas (archivos recientes, archivos más nuevos), o un álbum (una lista ordenada de archivos de imagen con un nombre dado). Las carpetas deberían limitarse a unos pocos miles de archivos por razones prácticas y de rendimiento, pero no se impone ningún límite. - ^Desplazamiento de la galería La galería se puede desplazar arriba y abajo usando las teclas de flecha arriba y abajo del teclado, las teclas Av Pág y Re Pág, o las barras de desplazamiento. También se pueden usar las teclas [home] y [end]. Haz clic izquierdo y mantenlo pulsado en la barra de desplazamiento, y la galería se desplazará rápidamente hasta la posición del clic. Haz clic derecho y mantenlo pulsado en la barra de desplazamiento para que la galería se desplace lentamente hasta la posición del clic. Sigue manteniendo pulsado el botón del ratón y muévelo hacia el lado para aumentar la velocidad de desplazamiento. - - TOPIC: VISTA DE THUMBNAILS Los archivos de imagen de la galería actual se muestran como una matriz de thumbnails. Usa el botón de menú Zoom o las teclas [+] [-] para cambiar el tamaño de los thumbnails. - - TOPIC: VISTA DE METADATA Los archivos de imagen de la galería actual se muestran junto con la metadata básica usada por Fotocx. Si se han definido tags de metadata indexados personalizados, estos se muestran a continuación de los tags estándar. Consulta {INDEXAR ARCHIVOS}. - - TOPIC: ARCHIVOS RECIENTES Los 1000 archivos de imagen vistos más recientemente se muestran en una galería, desde la cual puedes seleccionar archivos para ver o editar. - - TOPIC: ARCHIVOS MÁS RECIENTES Los 1000 archivos de imagen añadidos o modificados más recientemente se muestran en una galería, desde la cual puedes seleccionar archivos para ver o editar. Se te da la opción de usar la fecha de foto EXIF o la fecha de modificación del archivo para determinar las imágenes más recientes. - - TOPIC: ORDEN DE GALERÍA Elige la clave de ordenación y el orden ascendente o descendente. La casilla Restablecer restablece todas las galerías a nombre de archivo ascendente. - Si se ordena una galería de Álbum, el resultado no reemplaza el álbum, sino que crea un nuevo álbum llamado -sorted. - ^Nombre/número de archivo Esta es una ordenación modificada por nombre de archivo. Si varios archivos tienen nombres que difieren solo en números incrustados en la misma posición, este grupo de archivos se ordenará según el valor de los números incrustados. El siguiente ejemplo ilustra la diferencia: orden alfabético: xxx1xx xxx11xx xxx123xx xxx3xx orden numérico: xxx1xx xxx3xx xxx11xx xxx123xx - ^Metadata de la función de búsqueda Si la galería se generó mediante la opción de "informe de metadata" de {BUSCAR IMÁGENES}, y si añadiste tags de metadata opcionales al informe estándar, puedes ordenar la galería por estos tags de metadata. Puedes ordenar la galería por marca de cámara, información del objetivo, nivel ISO, tiempo de exposición... cualquier metadata disponible. - - TOPIC: FILTRO DE GALERÍA Selecciona un subconjunto de la galería actual para crear un álbum llamado "gallery_filter" que contenga los archivos de imagen seleccionados. ^Opciones de selección: • todos los archivos: selecciona todos los archivos de imagen • originales: archivos originales (sin número de versión) • versiones: archivos con versión (que han sido editados) • últimas versiones: últimas versiones (u originales si no hay versiones) • rango de valoración: archivos con valoración dentro del rango dado • nombres de keywords: archivos que tengan alguna de las keywords dadas (separadas por comas) • texto del nombre de archivo: archivos con alguna de las cadenas de texto dadas (separadas por comas) - - TOPIC: INICIO DE GALERÍA TOPIC: FIN DE LA GALERÍA Saltar al primer o al último thumbnail de la galería actual. - - TOPIC: CARPETA DEL ARCHIVO ACTUAL Establece la galería actual a partir del archivo de imagen actual. Esto es útil si quieres volver a la galería del archivo actual después de hacer otra cosa. - - TOPIC: CARPETAS RECIENTES Establece la galería actual a partir de una galería usada recientemente. Esto te permite ir y venir más fácilmente entre galerías recientes. - - TOPIC: ÁRBOL DE CARPETAS +image: folder-tree.png - Inicialmente se muestran todas las carpetas SUPERIORES de imágenes. Haz clic en [+] para desplegar subcarpetas, o en [-] para volver a plegarlas. Puedes hacer clic en cualquier carpeta para obtener una galería de las imágenes de esa carpeta. Mantén la ventana abierta para navegar a cualquier lugar de tu colección de imágenes. Esta función también está disponible usando el botón [TOP] en el panel superior de la galería. - - TOPIC: SELECCIONAR ARCHIVOS Preselecciona archivos de imagen para usarlos como entrada para crear álbumes o para funciones masivas. Estas funciones usarán los archivos preseleccionados por defecto, pero también puedes modificarlos o empezar de nuevo. Consulta el procedimiento {SELECCIONAR ARCHIVOS DE IMAGEN}. - - TOPIC: MARCADORES Ver los marcadores existentes. Los marcadores son ubicaciones elegidas (nombres de carpeta/archivo) con nombres asignados por el usuario. Haz clic en un marcador para mostrar una galería de thumbnails empezando en esa ubicación. Selecciona [Editar marcadores] para añadir, eliminar o renombrar un marcador. - - TOPIC: EDITAR MARCADORES Después de iniciar Editar marcadores, haz clic en un thumbnail de la galería para añadir esta ubicación a la lista de marcadores. El nombre de marcador asignado será inicialmente el nombre de archivo del thumbnail. Puedes editar el nombre. Si seleccionas un marcador existente con un clic del ratón, su nombre se muestra en el campo de entrada. Puedes cambiar el nombre o pulsar [eliminar] para quitar el marcador. Los marcadores nuevos se insertan después de la última ubicación de marcador seleccionada. Para cambiar el orden, edita el archivo "bookmarks" en la carpeta de inicio de Fotocx. - - TOPIC: MAPS MENU - - TOPIC: MAPA MUNDIAL +image: map-click.jpg - Este es un mapa mundial de internet que se puede escalar (acercar y alejar) desde el nivel de calle hasta el nivel de continente. Usa la rueda del ratón para acercar/alejar el mapa. Arrastra el mapa para cambiar el centro. El mapa tiene marcadores (puntos rojos) que corresponden a imágenes que tienen geocoordenadas en su metadata. Haz clic en un marcador para obtener una Vista de galería de las imágenes en esa ubicación. Se seleccionan las imágenes ubicadas dentro del área del marcador en el mapa. El área efectiva del marcador se escala con la escala del mapa. Acerca el zoom para ampliar la escala y posiblemente separar un marcador en varios marcadores cercanos. - - TOPIC: MOSTRAR EN MAPA Muestra la posición del archivo de imagen actual en el mapa mundial. Si varios marcadores se solapan, acerca el zoom hasta que un solo marcador quede en el centro. - - TOPIC: MENÚ DE ÁLBUMES - - TOPIC: ÁLBUMES Un álbum es un conjunto arbitrario de imágenes ensamblado manualmente a partir de imágenes existentes. Un álbum es una lista de sus archivos de imagen miembros. Los propios archivos de imagen no se copian ni se modifican. Un archivo de imagen dado puede ser miembro de varios álbumes, o puede estar presente más de una vez dentro de un álbum. Puedes añadir y eliminar imágenes en un álbum o reorganizar su orden. Una vez creado un álbum, puedes seleccionarlo por nombre y se muestra como una galería. - - TOPIC: CREAR ÁLBUM Introduce un nombre para un álbum nuevo. Puedes crear un álbum vacío, un álbum con archivos de imagen preseleccionados de {SELECCIONAR ARCHIVOS}, un álbum con imágenes de la galería actual, o puedes seleccionar las imágenes iniciales del álbum. - - TOPIC: RENOMBRAR ÁLBUM Elige un álbum existente e introduce un nuevo nombre. - - TOPIC: ELIMINAR ÁLBUM Elige un álbum existente y elimínalo permanentemente. - - TOPIC: ELEGIR ÁLBUM Se presenta una lista de álbumes disponibles. Elige de la lista. - - TOPIC: ÁLBUM ACTUAL Establece la galería a partir del álbum actual (usado por última vez). - - TOPIC: GALERÍA A ÁLBUM Guarda la galería actual como un álbum. Selecciona un nombre de álbum existente [Explorar], o introduce un nombre nuevo. - - TOPIC: EDITAR ÁLBUM Haz clic derecho en un thumbnail de álbum y selecciona del menú emergente: • Añadir archivos seleccionados aquí - los archivos previamente seleccionados se añaden aquí (haz clic en el lado izquierdo/derecho del thumbnail para añadir antes/después del thumbnail). • Añadir el archivo actual (Vista de archivo) aquí - funciona de la misma manera. • Quitar del álbum - el archivo pulsado se elimina del álbum. - ^Arrastrar y soltar Puedes reorganizar imágenes en un álbum arrastrando thumbnails con el ratón. Arrastra el thumbnail hasta que el cursor del ratón cambie a una pequeña imagen de thumbnail. Continúa arrastrando esta imagen hasta la posición donde debería insertarse, y suelta el botón del ratón. Coloca el ratón aproximadamente entre los thumbnails donde se va a insertar la imagen arrastrada. Si el arrastre se acerca al borde superior o inferior de la ventana, la galería se desplazará para mostrar más imágenes. Puedes usar dos sesiones de Fotocx para hacer más rápida la selección o el movimiento de muchas imágenes. Arrastra y suelta imágenes desde cualquier galería de origen hasta una posición del álbum de destino. - Si renombras o mueves un archivo usando Fotocx, se actualizan los enlaces del álbum y el archivo permanece en los álbumes que lo contienen. Si haces esto fuera de Fotocx, se pierden los enlaces del álbum y el archivo desaparece del álbum. - Si se renombran o mueven archivos de imagen usando Conversión masiva o Copiar/mover masivo, asegúrate de seleccionar la opción de reemplazar los archivos del álbum si eso es lo que quieres. De lo contrario, tendrás que reemplazarlos uno por uno. - No renombres carpetas si contienen imágenes que están en álbumes. Se perderán los enlaces del álbum. En su lugar, usa Conversión masiva o Copiar/mover masivo para mover los archivos de imagen a la nueva carpeta, y luego elimina la carpeta antigua si queda vacía. Para eliminar archivos de imagen, usa Eliminar/papelera masivo. Esto también purgará los archivos eliminados de los álbumes. - - TOPIC: ACTUALIZAR ÁLBUMES +image: album-replace-file.png - Reemplaza los archivos de álbum especificados con los reemplazos especificados, o añade nuevos archivos especificados después de archivos existentes especificados. Selecciona uno o más álbumes a procesar. En vista de galería, haz clic en dos thumbnails para especificar el 'archivo antiguo' y el 'archivo nuevo' en el diálogo anterior. Selecciona la opción: el 'archivo nuevo' reemplaza al 'archivo antiguo' donde sea que se encuentre, o el 'archivo nuevo' se añade a los álbumes después del 'archivo antiguo'. Pulsa [proceed] para procesar los álbumes. Después de procesar, el diálogo se repite con los mismos álbumes seleccionados y la misma opción de 'reemplazar o añadir'. Puedes seleccionar dos archivos más y pulsar [proceed]. - - TOPIC: ACTUALIZACIÓN MASIVA DE ÁLBUM +image: album-mass-update.png - Esta es una utilidad para actualizaciones masivas que puede que necesites después de crear nuevas versiones para muchos archivos de imagen y necesitar actualizar uno o más álbumes a las nuevas versiones. Esto no cubre todas las necesidades, lo cual probablemente sea imposible, pero es de esperar que reduzca la necesidad de cambiar los archivos de uno en uno. - Selecciona uno o más álbumes y luego selecciona una de las opciones de procesamiento: • Reemplazar todo solo con la versión más reciente: los álbumes se actualizan para tener solo las versiones de archivo más recientes. • Reemplazar todas las versiones con la versión más reciente: todas las versiones de archivo se reemplazan solo con la versión más reciente. El archivo original, si está presente, NO se reemplaza. • Añadir la versión más reciente a las versiones existentes: la versión más reciente se añade a las versiones existentes, si falta. • Reemplazar todo con el original y todas las versiones: todos los archivos se reemplazan con el archivo original y todas las versiones. • Reemplazar todo con la versión original y la más reciente: todos los archivos se reemplazan con el archivo original y la versión más reciente. • Reemplazar todo con las versiones seleccionadas (*): todos los archivos se reemplazan solo con las versiones seleccionadas. Esto incluye el archivo original (sin versión). • Reemplazar todas las versiones con las versiones seleccionadas (*): todas las versiones de archivo se reemplazan solo con las versiones seleccionadas. El archivo original, si está presente, NO se reemplaza. • Añadir las versiones seleccionadas a las versiones existentes (*): la versión seleccionada se añade a las versiones existentes, si falta. • Reemplazar todo con el original y las versiones seleccionadas (*): todos los archivos se reemplazan con los archivos originales y las versiones seleccionadas. - (*) Las cuatro opciones que usan archivos seleccionados: la lista de archivos seleccionados proviene de la función {SELECCIONAR ARCHIVOS}. Los archivos de álbum que no coinciden con ningún archivo seleccionado se dejan en el álbum. Solo se cambian, según las reglas anteriores, los archivos que coinciden con un archivo seleccionado. La coincidencia se basa en el nombre de archivo sin versión ni extensión: 'asdfg.png' y 'asdfg.v01.jpg' son una coincidencia. - Ejemplo: Reemplazar todas las versiones con las versiones seleccionadas: si el álbum tiene filename.jpg y filename.v02.png, y la lista de archivos seleccionados contiene filename.v04.jpg, el resultado en el álbum actualizado será: filename.jpg y filename.v04.jpg - - TOPIC: PRESENTACIÓN DE DIAPOSITIVAS +image: slide-show.jpg - ^Escalado fraccional del monitor En algunos sistemas, el escalado fraccional causa problemas de rendimiento en las animaciones de la presentación de diapositivas de Fotocx. Desactívalo y usa otros medios para aumentar el tamaño de fuente de las aplicaciones, si es necesario. Para Fotocx, el tamaño de fuente está en el menú {CONFIGURACIÓN}. - En el diálogo de la presentación de diapositivas (arriba a la izquierda), pulsa [Seleccionar álbum] y elige un álbum de la lista proporcionada. Cambia los demás ajustes del diálogo como desees, luego pulsa el botón [Iniciar] para empezar la presentación con la primera imagen del álbum, o [Reanudar] para reanudar una presentación en pausa, u otra imagen seleccionada haciendo clic en su thumbnail. Usa la tecla escape para salir de la presentación y volver al diálogo. - Controles del diálogo principal • Tiempo de subtítulo: segundos para mostrar el título y la descripción. • Tiempo de imagen: segundos para mostrar solo la imagen. • Límite de recorte %: recorta las imágenes hasta esta cantidad para eliminar los márgenes. • Pantalla completa: si está marcado, las imágenes se muestran a pantalla completa sin menú, etc. • Reproducción automática: si está marcado, la presentación empezará de nuevo tras el final. • Imagen aleatoria: si está marcado, usa un orden aleatorio de imágenes. Si no, el orden del álbum. - Se pueden usar teclas del teclado para controlar la presentación. Pulsa [teclado] para verlas. - Las siguientes teclas de teclado están asignadas a acciones y no se pueden cambiar: • Escape: interrumpe la presentación y vuelve al diálogo principal. • Teclas de flecha izquierda/derecha: puedes retroceder y avanzar en cualquier momento y la presentación continuará desde ahí. - Las transiciones animadas entre imágenes, y los tiempos de visualización y el comportamiento de zoom de las imágenes individuales, se pueden personalizar usando los diálogos explicados abajo. - Pulsa [transiciones] para iniciar un diálogo para seleccionar y personalizar las transiciones entre imágenes. Estas incluyen muchos métodos animados de sustitución de imagen (p. ej. la imagen nueva se expande desde el centro para reemplazar a la antigua). Selecciona las transiciones a usar y si se usan aleatoriamente o en secuencia. El parámetro de tiempo fija la duración de la transición. Los parámetros de preferencia especifican una preferencia relativa que influirá en la frecuencia con la que se usa la transición cuando se selecciona la secuencia aleatoria. - Los botones [cargar] y [guardar] te permiten guardar la configuración de transiciones en un archivo y cargarla más tarde. Estos archivos son independientes de los archivos de la presentación. Una presentación usará por defecto la configuración de transiciones usada por última vez para esa presentación (nombre de álbum), pero siempre puedes reemplazarla usando el botón [cargar] para cargar otra configuración, o cambiándola en el diálogo. - Pulsa [archivos de imagen] para iniciar un diálogo de Preferencias de imagen (arriba a la derecha). Estas son opcionales. Se selecciona una imagen para personalizarla haciendo clic en su thumbnail en la visualización del álbum/galería. El diálogo se rellena con la configuración predeterminada o la configuración anterior para esta imagen en esta presentación. Introduce las revisiones y pulsa [done], o haz clic en la siguiente imagen a personalizar. - Preferencia: si se elige la secuencia aleatoria de imágenes, este número indica una preferencia relativa para la imagen. El valor neutro es 10. Introduce un nuevo valor para aumentar o disminuir la probabilidad de que este archivo se elija en la secuencia aleatoria de imágenes, p. ej. un valor de 20 haría la probabilidad 2 veces mayor. Un valor de cero impediría que la imagen se mostrara. La imagen también se bloquea durante un recuento de 1/3 de las imágenes del álbum, o 10, lo que sea menor. - El diálogo muestra los eventos de imagen personalizables en orden de tiempo: • esperar un tiempo especificado (puede ser cero). • mostrar los siguientes tags de texto en paralelo: nombre de imagen (nombre base del archivo) durante un tiempo especificado, título de la imagen, si lo hay, durante un tiempo especificado, descripción de la imagen, si la hay, durante un tiempo especificado. • esperar un tiempo especificado antes de iniciar un zoom de imagen (puede ser cero). • acercar el zoom de la imagen de normal a ampliada o al revés, durante el tiempo especificado. Si no se selecciona ninguna opción, no hay zoom. • acercar: empieza en tamaño normal, amplía la imagen mientras mueve el centro de zoom a la posición especificada. • alejar: empieza en tamaño ampliado en el centro de zoom especificado, reduce la imagen de vuelta al tamaño normal. • [zoom center] - pulsa este botón, luego haz clic en el thumbnail de la imagen para especificar el centro de zoom de la imagen. • esperar un tiempo especificado después del zoom (puede ser cero) (el valor predeterminado es la configuración 'tiempo de imagen' del diálogo principal). • transición a la siguiente imagen, usando la transición especificada o 'siguiente' para indicar que no hay preferencia (se selecciona aleatoriamente). - - TOPIC: MENÚ PERSONALIZADO +image: custom-menu.png - Esto te permite reunir funciones de uso frecuente de varios menús en un único menú personalizado. También puedes añadir entradas para abrir archivos de imagen o álbumes específicos. El menú también incluye funciones de script y funciones de plugin (ver abajo). - La última entrada del menú, Editar menú, abre un editor de texto para editar la propia lista del menú. Los nombres de menú deben coincidir exactamente con los nombres de los menús de Fotocx, pero las mayúsculas/minúsculas no importan. - Las entradas del menú pueden tener los siguientes formatos: • # texto de comentario: un comentario que no hace nada • nombremenu # consejo emergente: nombre de menú de Fotocx y consejo emergente opcional • file : abre el archivo indicado • album : abre el álbum indicado como galería - Las siguientes entradas están presentes por defecto y no deberías cambiarlas ni eliminarlas: Editar script, Ejecutar script, Script masivo, Plugins, Editar menú. Los detalles se explican abajo. - - TOPIC: ARCHIVOS DE SCRIPT Funciones del menú: • Editar script - realiza un conjunto de ediciones en un archivo de imagen, registrando todas las funciones y ajustes en un archivo de script con nombre. • Ejecutar script - ejecuta un archivo de script usando el archivo de imagen actual, como una función de edición. • Script masivo - selecciona cualquier número de archivos de imagen y ejecuta un archivo de script en todos ellos, en modo masivo. - Los archivos de script te permiten definir un conjunto de ediciones una vez, y repetirlas en uno o varios archivos de imagen más tarde. - ^Funciones de edición que se pueden usar en script Algunas funciones de edición usan arrastres del ratón sobre la imagen, p. ej. todas las funciones de deformación. Estas no se pueden usar en script porque los arrastres del ratón no se graban. El uso de estas funciones está bloqueado. - Las siguientes funciones se pueden usar actualmente en script: • Editar: Retocar, Márgenes, Modo de color, Relleno de área • Reparar: Enfocar, Desenfoque normal, Desenfoque graduado, Reducir ruido, Quitar niebla, Artefactos JPEG, Antialias, Ajustar RGB • Refinar: Aplanar histograma, Contraste local, Amplificar contraste, Retinex global, Retinex local, Contraste local, Saturación, Enfoque suave, Rampa de brillo • Efectos: Contornos, Boceto, Caricatura, Relieve, Mosaicos1, Mosaicos2, Pintura, Textura, Patrón, Tramado, Grabado, Establecer colores, Desplazar colores, Kernel personalizado - - TOPIC: EDITAR SCRIPT En el diálogo, pulsa [iniciar]. Elige un nombre de archivo para el script. Empieza a editar el archivo de imagen actual. Usa las funciones de edición deseadas en cualquier secuencia. Cada edición se graba en el archivo de script junto con todos los ajustes del diálogo usados. Cuando termines, pulsa [close] para cerrar el archivo de script y guardarlo con el nombre de archivo indicado. - - TOPIC: EJECUTAR SCRIPT Elige uno de tus archivos de script guardados en el menú emergente. El script se ejecuta usando el archivo de imagen actual, como una función de edición normal. - - TOPIC: SCRIPT MASIVO En el diálogo, pulsa [Seleccionar archivos]. Selecciona los archivos a editar usando el diálogo estándar de selección de archivos {SELECCIONAR ARCHIVOS DE IMAGEN}. Cuando termines, pulsa [Seleccionar script]. Elige un archivo de script del menú emergente. El script se ejecuta ahora en todos los archivos elegidos. Todas las imágenes modificadas se guardan como nuevas versiones. Si se procesan archivos RAW, los archivos de salida correspondientes son archivos TIFF-16. - - TOPIC: PLUGINS +image: plugins.png - Las funciones de plugin son una forma de usar otros editores de imagen dentro de Fotocx, p. ej. Gimp. Puedes usar un editor de imágenes RAW como Rawtherapee y luego realizar ediciones adicionales usando Fotocx. - ^Procedimiento de uso: • Abre en Fotocx el archivo que se va a procesar • Inicia el menú de plugins y selecciona el programa deseado, p. ej. Gimp • El programa del plugin se inicia y abre el archivo pasado desde Fotocx • Realiza las ediciones deseadas usando el programa del plugin • Cuando termines, guarda el archivo de salida con el mismo nombre que el archivo de entrada. La extensión del archivo puede cambiar. • Cierra el programa del plugin. • Fotocx abre el archivo de salida del plugin como una versión editada del archivo actual. • Realiza ediciones adicionales, o guarda el archivo editado como una nueva versión o un archivo nuevo. - A la izquierda hay un ejemplo del menú de Plugins. La última entrada "Editar plugins" inicia la aplicación de edición de texto a la derecha. Usa el editor de texto para definir los nombres del menú de plugins y los comandos para iniciar los programas de plugin correspondientes. El formato es: nombremenu = comando-plugin %s TIP = explicación del comando anterior El 'comando-plugin' es el comando de shell para la función del plugin, y '%s' es donde se inserta el nombre del archivo actual en el comando. No pongas comillas alrededor de '%s' porque se añaden automáticamente, lo que permite procesar nombres de archivo con espacios u otros caracteres especiales. El ejemplo superior mostrado es un menú llamado "Gimp" que inicia el comando "gimp %s". El texto TIP es opcional. Si está presente, va en la línea siguiente al nombre del menú. Al pasar el ratón sobre la entrada del menú se mostrará este texto junto al texto del menú. - Algunos comandos pueden esperar que se especifiquen tanto el archivo de entrada como el de salida. En este caso, proporciona '%s' en ambas posiciones. Omite '%s' si el comando no procesa un archivo de imagen. - ^Seleccionar área Si el archivo de entrada tiene un área seleccionada, solo se modificará esta área. La función de plugin edita la imagen entera, pero cuando el resultado es procesado por Fotocx, solo se conservan los cambios en el área seleccionada. - - TOPIC: ZOOM - ^Botón de zoom Haz clic izquierdo o derecho en el botón para aumentar o disminuir el tamaño de la imagen en {VISTA DE ARCHIVO} o el tamaño de los thumbnails en {VISTA DE GALERÍA}. Esto solo se aplica si el modo de vista de galería es {VISTA DE THUMBNAILS}. Si es {VISTA DE METADATA}, no se hace nada. - - TOPIC: ANTERIOR/SIGUIENTE - Haz clic izquierdo o derecho en el botón para abrir el archivo anterior o siguiente en la galería actual. También puedes usar las teclas de flecha izquierda/derecha. - - TOPIC: GUARDAR ARCHIVO - +image: file-save.png - +image: file-save-as.jpg - En el primer diálogo, selecciona 'nueva versión', 'nuevo archivo', o 'reemplazar archivo'. - ^Nueva versión Guarda el archivo de imagen actual con un nuevo número de versión. Los nombres de archivo con números de versión tienen el formato "nombrearchivo.vNN.ext" donde NN es un número del 01 al 99. Si el nombre de archivo no tiene versiones, se creará la versión .v01. Si ya existen versiones del archivo en disco, se usa el siguiente número de versión superior. Si el archivo es un archivo JPEG, se usa la calidad predeterminada - consulta {CONFIGURACIÓN}. - ^Nuevo archivo Se abrirá el segundo diálogo mostrado arriba para guardar la imagen actual en un archivo seleccionado, que puede ser el archivo original, otro archivo existente, o un archivo nuevo. Un archivo se puede guardar en los formatos JPEG, PNG, JXL y TIFF. - Para JPEG, puedes elegir un valor de calidad en el rango de 1 a 100. Valores más bajos dan archivos más pequeños y menos calidad de imagen. Los valores por encima de 70 son difíciles de distinguir de 100 (calidad más alta, tamaño de archivo más grande). Se usa la calidad JPEG predeterminada a menos que cambies el valor en el diálogo. El valor predeterminado proviene de {CONFIGURACIÓN}. No podrás ver diferencia entre un archivo guardado con calidad 70 y uno con 100, pero la diferencia en espacio de archivo es enorme. Las áreas transparentes serán negras. JPEG no admite transparencia. - PNG y TIFF se comprimen sin pérdida de calidad y son mucho más grandes que JPEG. Se pueden guardar con 8 o 16 bits por color. - Si 'hacer actual' está marcado, el archivo guardado (nuevo nombre de archivo) se convertirá en el archivo actual. - ^Reemplazar archivo Guarda el archivo de imagen actual sobre sí mismo. - Los ^permisos^ se copian del archivo de entrada. Pulsa el botón [Cambiar] para editar los permisos. - - TOPIC: MENÚ DE METADATA - - La metadata es texto que se almacena dentro de un archivo de imagen. Las cámaras digitales crean automáticamente parte de la metadata, como fecha y hora, datos técnicos sobre la cámara y los parámetros de la foto, y datos de ubicación (si la cámara tiene receptor GPS). El usuario puede añadir otros datos, p. ej. un título, descripción, valoración, keywords. Fotocx puede buscar en tu colección de imágenes usando cualquier metadata, junto con nombres de carpeta y archivo o nombres parciales, produciendo una galería de imágenes coincidentes. En la mayoría de los casos, la búsqueda es casi instantánea. - - TOPIC: VER META PRINCIPAL TOPIC: VER TODA LA META +image: view-metadata.jpg - La función Ver meta principal muestra la metadata de uso común para el archivo de imagen actual. Esto incluye la fecha y hora de una foto, velocidad de obturación, distancia focal, tamaño de imagen, ISO, etc. Las cámaras digitales almacenan estos datos en la imagen. La metadata también puede contener datos añadidos por un usuario: keywords, título o leyenda, descripción, comentarios añadidos por el fotógrafo o un editor posterior (a veces presentes en imágenes publicadas). - Si se edita una imagen, se guarda un registro de la edición en la metadata. Ver meta principal muestra el historial de ediciones realizadas. - Ver toda la meta informa de toda la metadata disponible, y puede incluir más de 100 elementos que probablemente no te interesen. - El botón [Extras] en la ventana Ver meta principal abre el diálogo mostrado a la derecha, donde puedes añadir tags extra al informe. Cualquier tag disponible en el informe Ver toda la meta se puede añadir al informe corto. Haz clic en un tag de la columna izquierda para añadirlo a la columna derecha y al informe. Haz clic en un tag de la columna derecha para eliminarlo. Haz clic en la entrada "Otro tag ..." para escribir cualquier nombre de tag no incluido en la lista predeterminada, que se limita a los tags más probablemente necesarios. - Fotocx usa estos tags de metadata para editar y buscar imágenes: • Título - título corto de la imagen • Descripción - descripción de la imagen • Fecha/hora original - fecha/hora de la foto • Valoración - de 0 a 5 estrellas • País - del GPS de la cámara o añadido manualmente • Ubicación - el nombre EXIF es la ciudad • Geotags - latitude/longitude • Keywords - identificadores de imagen del usuario • Datos de cámara - marca, modelo, objetivo • Datos de exposición - tiempo, número F, distancia focal, ISO Estos tags se editan usando la función {EDITAR META PRINCIPAL}. También se pueden editar y buscar otros tags, usando métodos menos cómodos explicados abajo. - También hay varias funciones masivas para añadir datos a muchos archivos de imagen a la vez. Consulta {MENÚ MASIVO}. - - TOPIC: VISTA GENERAL DE KEYWORDS Los archivos de imagen pueden tener keywords de identificación o clasificación. Estas se pueden usar para buscar en una gran colección de imágenes las que tengan las keywords deseadas. Keywords típicas: tema, evento, ubicación, personas o cosas, etc. Las keywords residen dentro de la metadata de la imagen. Las keywords normalmente son una sola palabra, pero se puede usar una frase corta con espacios u otros delimitadores incrustados. Las comas y los puntos y coma se usan como delimitadores entre keywords, y por lo tanto no se pueden usar dentro de una keyword (un estándar externo). Se permite una keyword compuesta como "paisaje arizona", pero deberías usar dos keywords en su lugar para mayor flexibilidad: puedes buscar imágenes que tengan cualquiera de las dos keywords o ambas. - Todas las imágenes que tengan una o varias keywords deseadas se pueden encontrar rápidamente y mostrar en una ventana de galería. Si has usado los nombres de carpeta y archivo de forma significativa, también puedes buscar imágenes usando estos nombres. También puedes buscar imágenes por fecha, valoración, ubicación y otros tags de metadata. Estos no necesitan estar duplicados en las keywords. Consulta {BUSCAR IMÁGENES} más abajo. - ^Sistema de keywords gestionado Esto es apropiado si quieres planificar tu sistema de keywords antes de añadir keywords a tus imágenes. En este sistema, creas un número limitado de categorías de keywords (p. ej. personas, lugares, cosas, eventos, arte, paisajes ...). Las keywords se pueden crear y asignar a una categoría según sea necesario al asignar keywords a las imágenes. Una imagen recibe una keyword señalando y haciendo clic en la lista de keywords disponibles, que está organizada por categoría y alfabéticamente dentro de cada categoría. Si se necesita una keyword nueva, se crea al asignarla por primera vez a una imagen. El número de keywords dentro de una categoría idealmente debería ser inferior a unas 200, para que la localización visual desde una lista sea razonablemente rápida. - ^Ventajas del sistema de keywords gestionado • evita nombres de keywords inconsistentes (p. ej. 'paisaje' y 'panorama') • evita variantes ortográficas y errores tipográficos (p. ej. susan, susy, susna) • evita keywords que incluyen otras keywords (p. ej. paisaje, lago) • la búsqueda es más fiable porque las keywords no tienen los errores anteriores • al asignar keywords, tienes una vista general de las keywords disponibles, en lugar de miles de keywords caóticas en un sistema no gestionado - Elegir keywords de una lista larga puede ser lento. Esto se mitiga de 3 maneras: • Se muestran hasta unas 10 keywords usadas más recientemente en el diálogo de editar metadata, donde se pueden ver y elegir fácilmente. Como una serie de fotos hechas al mismo tiempo probablemente compartan muchas keywords, añadir keywords se hace más fácil y rápido. • Simplemente puedes empezar a escribir el nombre de la keyword deseada. Aparece una lista emergente de keywords coincidentes en cuanto solo quedan unas pocas coincidencias posibles. Entonces puedes hacer clic en la keyword deseada para añadirla a la imagen. Si no hay keywords coincidentes, tienes la opción de añadir la nueva keyword a la lista de keywords definidas. • Puedes elegir una categoría para mostrar una lista más pequeña. - Si las keywords están definidas de forma amplia y son menos en número, los resultados de búsqueda por keywords serán mayores, pero encontrar las imágenes deseadas visualmente puede ser bastante rápido. Se conserva el orden físico de los archivos: los archivos de imagen ubicados juntos en sus carpetas también aparecerán juntos en los resultados de búsqueda. - Las imágenes descargadas de internet a menudo contienen keywords. Estas, por supuesto, no tienen ninguna organización y son colectivamente caóticas. Si usas un sistema de keywords gestionado, es mejor revisar esas imágenes y limpiar las keywords para que se ajusten a tu sistema, o eliminarlas. Cualquier keyword nueva presente se añadirá automáticamente bajo la categoría "nocatg". Si notas keywords no deseadas en tu lista de keywords, usa {BUSCAR IMÁGENES} por keyword para encontrar las imágenes con keywords no deseadas para poder corregirlas o eliminarlas. - ^Sistema de keywords aleatorio Puede que prefieras inventar keywords según se necesiten sin ningún sistema particular en mente. O puede que ya tengas miles de keywords, lo que hace difícil una conversión a un sistema de keywords gestionado (pero no imposible: Fotocx puede convertir masivamente nombres de keywords). En este caso, simplemente puedes escribir keywords en tus imágenes, creando nuevas keywords según sea necesario. Aun así, hay cierta capacidad de mantener las keywords organizadas: las keywords existentes que coinciden con los caracteres que introduces se muestran en cuanto solo quedan unas pocas coincidencias posibles. Ejemplo: escribes "new" y se muestra una lista de keywords: New York, New Delhi, Newman ... Si una de estas es tu intención, haces clic en ella para seleccionar la keyword. Si no, sigues escribiendo y finalmente pulsas Intro para crear una keyword nueva. Al buscar imágenes por keywords, puedes escribir los nombres de keyword deseados o elegirlos de la lista de keywords disponibles. Se muestran las keywords disponibles que coinciden con las primeras letras que escribes, y puedes elegir de esta lista. No puedes introducir una keyword de búsqueda que no exista en ninguna parte de tus imágenes. Un sistema de keywords aleatorio probablemente dará como resultado miles de keywords. Esto puede no ser muy útil. - - TOPIC: GEOTAGS OVERVIEW Las cámaras modernas pueden registrar la ubicación de cada foto, usando un receptor GPS interno. Latitude, longitude (y posiblemente ciudad/ubicación y país) se registran en la metadata EXIF del archivo de imagen. La función {EDITAR META PRINCIPAL} también permite introducir o revisar datos de ubicación. Las ubicaciones también se pueden especificar haciendo clic en un mapa mundial ampliable. Funciones para encontrar imágenes de una ubicación o región especificada: • {BUSCAR IMÁGENES}: buscar por nombre de ubicación (también varios nombres, coincidencias parciales). • {LUGARES/FECHAS}: buscar por grupos de país, ubicación y fecha • Imágenes por ubicación en el mapa: haz clic en un marcador del mapa para mostrar todas las imágenes en la ubicación del marcador. - Los nombres de ubicación (ciudad u otro nombre de lugar, y país) del GPS de la cámara no están estandarizados y pueden ser caóticos (p. ej. Munich, München, MONACO). Cómo tratar esto se explica abajo. - - TOPIC: EDITAR META PRINCIPAL +image: edit-meta.jpg - La función Editar meta principal se usa para añadir metadata básica a una imagen. Por favor, lee {VISTA GENERAL DE KEYWORDS} y {GEOTAGS OVERVIEW} (arriba) antes de usar Editar meta principal. - Editar meta principal se usa para editar la metadata de uso más frecuente: fecha y hora de la imagen, valoración, título, descripción, datos de ubicación y keywords. El diálogo muestra inicialmente los datos de la imagen actual. Después de hacer adiciones o cambios, pulsa [Aplicar] para actualizar el archivo de imagen. No hay versionado automático de archivo para los cambios de metadata, pero puedes usar Guardar archivo > Nueva versión si lo deseas. - El diálogo muestra la metadata de la imagen actual en Vista de archivo, o de un thumbnail pulsado en Vista de galería. El diálogo de edición se actualiza a sí mismo cuando se abre una nueva imagen o se pulsa un nuevo thumbnail. - La fecha de la imagen, si está disponible, se muestra como Fecha de imagen. Se puede introducir si falta, o cambiar. Puedes introducir una fecha completa en el formato aaaa:mm:dd o un formato más corto aaaa o aaaa:mm. Un mes/día que falta es lógicamente equivalente a 01:01 al compararlo con un límite bajo para búsqueda, o a 12:31 al compararlo con un límite alto. El botón [Ant] rellena la fecha a partir de los datos introducidos anteriormente. Esto es para permitir fechar fácilmente una serie de imágenes. Si la hora es importante, puedes añadir una hora usando el formato hh:mm[.ss]. El formato de entrada completo es: aaaa:mm:dd hh:mm:ss - Puedes introducir un título, una descripción y una valoración (0-5 estrellas) para la imagen. Para editar el título o la descripción, pulsa el botón [editar] correspondiente. Esto abrirá un editor de texto emergente con un límite grande en el tamaño del texto. Puedes usar la tecla [enter] para un salto de línea deliberado. En Fotocx, estos saltos de línea funcionarán; en otros visores de imágenes, pueden ser reemplazados por puntos. - Las keywords existentes se muestran en Keywords de imagen. Las keywords disponibles se muestran en la ventana Keywords definidas de abajo. Se puede añadir una de estas keywords a la imagen haciendo clic en ella. Se puede eliminar una keyword de la imagen haciendo clic en ella dentro de Keywords de imagen. Las keywords añadidas recientemente se muestran en Keywords recientes. Esto es una comodidad para facilitar la adición de keywords a un nuevo lote de imágenes, ya que muchas de las mismas keywords se volverán a usar. Señala y haz clic de la misma manera. - Si la lista de keywords definidas es larga, puede ser más fácil escribir la keyword deseada en Introducir keyword. Las keywords existentes que coinciden con lo que has escrito hasta ahora aparecen en Keywords coincidentes, y puedes hacer clic en una de ellas para añadir la keyword a la imagen. Si la keyword introducida es nueva (no se muestra ninguna keyword coincidente), pulsa [añadir nueva keyword] cuando la keyword esté completa. Se añadirá a la imagen y a la lista de keywords definidas con la categoría "nocatg". - Si estás usando categorías de keywords, puedes seleccionar una categoría, y solo se mostrarán esas keywords en la lista de keywords definidas. - El botón [Aplicar] escribe los datos en el archivo de imagen y en el archivo de índice de metadata usado para buscar imágenes. - El botón [Ant] (en la parte inferior del diálogo) se puede usar para cargar todos los datos disponibles de la imagen anterior vista o editada. Esto se puede usar para acelerar el procesamiento de un grupo de imágenes que comparten gran parte de los mismos datos. - ^Añadir geotags Hay varias formas de añadir nombres de ubicación y geocoordenadas en el diálogo {EDITAR META PRINCIPAL}. - GPS de la cámara El sensor GPS de tu cámara puede haber insertado nombres de ubicación y geocoordenadas. Puede que el idioma no sea el que quieres, o que se usen letras todas en mayúsculas, u otro tipo de caos. Usa el botón [clear] para empezar de nuevo, e introduce el texto nuevo. - [Buscar] Botón Busca una ubicación presente en cualquier parte de tus archivos de imagen o en una enorme lista de ubicaciones conocidas (worldcities.txt). Introduce unos pocos caracteres iniciales en Ubicación y pulsa [Buscar]. Si se muestra una lista de ubicaciones coincidentes, elige una. Si no se muestra nada, usa [Mapa] para hacer clic en una ubicación del mapa. Revisa los nombres de ubicación y país si es necesario. Esta ubicación ya se conoce y está disponible para elegir. - [Anterior] Botón Si la imagen que se está editando tiene los mismos datos de ubicación que la imagen editada anteriormente, pulsa [Anterior] para rellenar los datos de ubicación usados antes. - Puedes usar {GEOTAGS MASIVOS} para añadir datos de ubicación a muchos archivos de imagen a la vez. - - TOPIC: EDITAR CUALQUIER META +image: edit-any-metadata.png - Este es un diálogo para editar cualquier metadata del archivo de imagen actual. Los tags más comunes para editar se listan a la izquierda. Pulsa el botón [Lista completa] para obtener una lista de todos los tags disponibles para el archivo de imagen actual (puede haber cientos de ellos). Pulsa [Lista corta] para volver a la lista de tags comunes. Haz clic en un tag de la lista para obtener el valor actual del tag. Cambia el valor si lo deseas y pulsa [actualizar]. Para editar un nombre de tag que no está en la lista, introduce el nombre del tag y pulsa [obtener] para recuperar el valor actual, si lo hay. Luego introduce o cambia el valor y pulsa [actualizar]. Para eliminar un tag, pulsa [eliminar]. Puedes introducir el nombre del tag en minúsculas y con o sin espacios, p. ej. "Subject Distance" y "subjectdistance" funcionarán ambos. Algunos tags no se pueden cambiar, p. ej. 'image width' es el ancho en píxeles de la imagen, que solo se puede cambiar cambiando el ancho en píxeles de la imagen. La fuente de la lista corta es el archivo de texto /meta_picklist. Puedes añadir o quitar tags de esta lista. - - TOPIC: ELIMINAR META Especifica el nombre del tag a eliminar, o selecciona Todo. Se elimina la metadata. Usa Todo para limpiar una imagen de cualquier información identificativa que pueda estar presente. Algunos tags no se pueden eliminar, p. ej. Nombre de archivo. - - TOPIC: COPIAR META Las imágenes combinadas creadas con Fotocx (HDR, panorámica, mashup ...) no contendrán metadata por defecto. Usa esta función para copiar metadata desde una de las imágenes de entrada, o desde cualquier otra imagen. Usa los botones [Explorar] para elegir un archivo de origen de la metadata y un archivo que reciba la metadata ("archivo objetivo" en el diálogo). - - TOPIC: CORREGIR META Usa esta función si tienes un archivo de imagen que produce un mensaje de error al intentar editar la metadata. Eliminará la metadata malformada y conservará el resto. - - TOPIC: GESTIONAR KEYWORDS +image: manage-keywords.png - Crea keywords y, opcionalmente, agrúpalas en categorías. Puedes asignar categorías a las keywords para ayudar a organizarlas y localizarlas más rápido al añadir keywords a las imágenes. Son opcionales y no juegan ningún papel en la búsqueda por keywords: solo la keyword se almacena en una imagen, no su categoría. Las categorías típicas son personas, lugares, cosas, eventos, paisajes, edificios, arte, etc. Para añadir una nueva keyword con una categoría nueva, introduce la categoría y la keyword, luego haz clic en [create]. Si la categoría está en blanco, la keyword se asignará a "nocatg". Para asignar una keyword a una categoría diferente, haz clic en una categoría (texto en negrita) o introduce una nueva, haz clic en la keyword, y pulsa [create]. La keyword se moverá de la categoría antigua a la nueva. Para eliminar una keyword, haz clic en la keyword y pulsa [eliminar]. Las keywords usadas en imágenes pero no asignadas a una categoría aparecerán bajo "nocatg". Una categoría sin keywords asignadas se puede eliminar - haz clic en la categoría, borra el nombre de la keyword si lo hay, pulsa [eliminar]. - Nota: una keyword recién creada se añade al final de la lista de keywords de su categoría. La próxima vez que se inicie Fotocx, todas las categorías y sus listas de keywords se ordenan alfabéticamente, excepto que "nocatg" siempre va al final. - - TOPIC: SUBTÍTULOS +image: choose-captions.png - ^Menú Elegir subtítulos Elige qué tags de metadata usar para los subtítulos de texto mostrados en la esquina superior izquierda de la imagen en modo vista de archivo. - ^Menú Alternar subtítulos Activa o desactiva la visualización de subtítulos. Asigna un atajo de teclado para activar o desactivar rápidamente la visualización de subtítulos. - ^Nota:^ al mover el ratón a la esquina superior izquierda de una imagen en vista de archivo se mostrará el título y la descripción en una imagen emergente. La imagen desaparece cuando se aparta el ratón. - - TOPIC: LUGARES/FECHAS +image: image-locations.jpg - Esta es una forma rápida de encontrar todas las fotos hechas en una ubicación dada o en un rango de ubicación y fecha. En el diálogo, elige entre las dos opciones: incluir todas las imágenes en el informe, o incluir solo las imágenes encontradas por la función Buscar anterior. Luego selecciona el nivel de agrupación deseado: país país y ubicación país y fecha país y ubicación y fecha fecha y país fecha y país y ubicación - Si se incluye la fecha, selecciona un rango de días para la consolidación: las fotos con fechas dentro del rango se agruparán bajo la primera fecha. Pulsa [proceed] para obtener un informe que muestra el recuento de imágenes en cada grupo: por país, país y ubicación, etc. Este también es el orden de clasificación. En el ejemplo anterior, hay 28 fotos de Nueva Zelanda del 02.11.2004. Haz clic en una línea del informe para obtener una galería de thumbnails de esas imágenes. - - TOPIC: LÍNEA DE TIEMPO +image: timeline-report.jpg - Este informe produce una línea de tiempo del recuento de imágenes por mes. Elige entre las dos opciones: incluir todas las imágenes en el informe, o incluir solo las imágenes encontradas por la función Buscar anterior. Haz clic en un año y mes en el informe resultante para obtener una galería de thumbnails de todas las imágenes con una fecha de foto (EXIF) en el mes seleccionado. El ejemplo anterior muestra 208 imágenes para oct. de 2017. El año 'null' es para imágenes sin fecha de foto. - - TOPIC: TAGS DE METADATA Esta función encuentra todos los archivos de imagen que usan un tag de metadata y valor especificados. Selecciona un tag de la lista emergente: valoración, keywords, título, descripción, cámara, metadata indexada extra - consulta {INDEXAR ARCHIVOS}. Se muestra una lista de los valores de tag disponibles, junto con el número de archivos de imagen que usan este valor de tag. Para 'título' y 'descripción', solo se muestran los primeros 60 caracteres, y se informa de todos los archivos que usan valores de tag que coinciden con estos 60 caracteres iniciales. Para 'cámara' el valor de coincidencia es una combinación de marca, modelo y objetivo. - - TOPIC: BÚSQUEDA AUTOMÁTICA Esta función se puede usar mediante archivos de script de shell para extraer archivos de imagen que cumplan cualquiera de los criterios de selección disponibles al usar la función Buscar imágenes (ver abajo). Primero, usa la función Buscar imágenes para fijar los criterios de selección deseados (p. ej. nombres de carpeta/archivo, fechas, keywords, u otra metadata). Usa el botón [guardar] para guardar los criterios en un archivo de configuración. Usa el siguiente comando para iniciar Fotocx y realizar la búsqueda: $ fotocx -m autosearch . La salida va a /search_results. - - TOPIC: BUSCAR IMÁGENES Usa la función Buscar imágenes para encontrar imágenes que tengan cualquier metadata deseada (fecha, keywords, ubicación ...). Se usa un archivo de índice de metadata para la búsqueda, lo que permite buscar miles de imágenes por segundo. - Hay dos formatos de informe: una galería de thumbnails que muestra todas las imágenes que coinciden con los criterios de búsqueda, o un informe de metadata que combina thumbnails con texto de metadata. Aquí hay un ejemplo del formato de informe de metadata: +image: search-images-metadata.jpg - ^Diálogo de búsqueda +image: search-images.jpg - En el diálogo, selecciona qué imágenes buscar, ya sea todas (todas las imágenes) o el conjunto actual, es decir, las imágenes de la galería actual, que puede ser una carpeta, un álbum, o los resultados de una búsqueda de imágenes anterior. - A continuación, elige qué hacer con las imágenes coincidentes encontradas: 'conjunto nuevo' significa reemplazar el conjunto actual con las imágenes encontradas, 'añadir' significa añadirlas al conjunto actual (galería), y 'eliminar' significa eliminarlas del conjunto actual. Para eliminar imágenes, debes buscar en el conjunto actual. - Para los archivos que coincidan con los criterios de selección, también puedes especificar qué versiones se seleccionan: original, última versión, o todas las versiones. 'original' significa la imagen original o sin modificar (o la primera versión si no se guardó el original). 'última versión' significa la versión más reciente o la última editada disponible. 'todas las versiones' significa que se recuperarán el original y todas las versiones. - Selecciona el tipo de informe deseado. El informe de galería es una página de imágenes en miniatura, tan larga como sea necesario para contener todas las imágenes que coincidan con los criterios de búsqueda. El informe de metadata tiene tanto imágenes en miniatura como una lista de tags de metadata junto a cada thumbnail. Estos incluyen los tags estándar (fecha, valoración, keywords, geotags, título, descripción) y cualquier otro tag de metadata que hayas añadido en la lista de selección de tags (ver abajo). - Introduce tus criterios de búsqueda. Selecciona las keywords, fechas, valoraciones en estrellas, palabras contenidas en el texto (título o descripción de la imagen), nombres de archivo o carpeta, y nombres de ubicación deseados. Consulta más detalles abajo. - Las keywords disponibles se muestran en Keywords definidas y se pueden elegir señalando y haciendo clic. Si la lista de keywords definidas es larga, puede ser más fácil empezar a escribir una keyword en 'introducir keyword'. Las keywords existentes que coincidan con lo escrito hasta el momento aparecerán en la lista 'coincidencias', y puedes hacer clic en una de ellas para añadir la keyword a la lista de búsqueda. - Si estás usando categorías de keywords, puedes seleccionar una categoría, y solo se mostrarán esas keywords en la lista de keywords definidas. - Se puede introducir un rango de fechas para restringir la búsqueda a imágenes dentro de ese rango. Elige fecha de foto (de la cámara) o fecha de archivo (fecha de creación o última modificación). El formato es aaaa:mm:dd. Se seleccionan las imágenes que tienen una fecha igual o posterior a la primera fecha, si está presente, e igual o anterior a la segunda fecha, si está presente. Un mes/día que falta se toma por defecto como 01/01 para el límite de fecha bajo y como 12/31 para el límite alto. Las horas se pueden especificar opcionalmente usando el formato aaaa:mm:dd hh:mm. Las horas que faltan se toman por defecto como 00:00 y 23:59. - Para buscar imágenes sin fecha de foto EXIF (p. ej. imágenes escaneadas), usa "null" en la primera entrada de fecha. - Se puede introducir un par de valoraciones en estrellas para restringir los resultados a imágenes con una valoración dentro del rango dado. Un valor bajo que falta implica 0 estrellas, y un valor alto que falta significa la valoración más alta, 5 estrellas. - Se pueden buscar nombres de carpeta y archivo. En el campo buscar nombres de archivo, introduce cualquier número de nombres usados para tus carpetas de imágenes y nombres de archivo, separados por comas. Una entrada de "egipto cairo" coincidiría con todos los nombres de carpeta o archivo de imagen que contengan cualquiera de estas cadenas. Las subcadenas también coincidirán. Las mayúsculas/minúsculas no importan. - Se puede buscar el título y la descripción de la imagen. Introduce las palabras a buscar en el campo buscar título/desc, separadas por comas. Estas se compararán con cada palabra del título y la descripción de todas las imágenes, y se seleccionan las imágenes coincidentes. Las mayúsculas/minúsculas no importan. - Para buscar ubicaciones, introduce uno o más nombres de ciudad/ubicación o país en el campo buscar ubicaciones, separados por comas. Solo se seleccionarán los archivos de imagen con geotags que coincidan con una de las ubicaciones introducidas. Una ubicación puede ser una ciudad, parque u otro nombre geográfico (lo que sea que esté almacenado en los campos de metadata 'City' y 'Country'). Las mayúsculas/minúsculas no importan. - Los botones de opción 'todas' y 'cualquiera' se aplican a keywords, texto, nombres de archivo y ubicaciones. Puedes seleccionar imágenes que tengan TODAS las cadenas introducidas, o CUALQUIERA de las cadenas introducidas. Ejemplo: si el campo de búsqueda de ubicación es "nueva york" y se selecciona "cualquiera", se incluirían imágenes de Nueva Zelanda y de York, Inglaterra. Si se selecciona "todas", solo se incluirían imágenes ubicadas en Nueva York. - Si deseas encontrar imágenes con datos faltantes, puedes introducir "null" como valor de coincidencia. - ^Buscar metadata adicional Usando las entradas del diálogo 'nombre de tag', 'condición' y 'valores de coincidencia' puedes especificar tags de metadata adicionales para usar como criterios de selección, o para añadirlos a la salida del informe si se elige el tipo de informe "metadata". Los tags disponibles para un archivo de imagen dado se pueden mostrar con {VER TODA LA META}. Estos incluyen muchos tags no presentes en el diálogo principal. La lista de selección proviene del archivo de texto /meta_picklist. Puedes añadir tags a este archivo si lo deseas. Puedes usar tags que también estén presentes en el diálogo principal. La ventaja aquí es que se puede usar una lógica de coincidencia más flexible. - La lógica de coincidencia se puede seleccionar para cada tag de metadata. ^método de coincidencia valor de coincidencia para la selección • report cualquier valor, incluso si falta • reportx valor no faltante • matches valores de texto separados por comas • contains igual, con coincidencia de subcadena • number = valores iguales • number => valores iguales o mayores • number <= valores iguales o menores - Los botones [X] del lado derecho se pueden usar para borrar tags de búsqueda de metadata individuales. - ^Botones del diálogo [Cargar] y [Guardar] se pueden usar para cargar o guardar los criterios de búsqueda desde un archivo. [Borrar] borrará todos los datos del diálogo. [Continuar] iniciará el proceso de búsqueda. - Pulsa el botón [proceed] para realizar la búsqueda. La salida es una galería estándar de thumbnails, o el formato de informe de metadata mostrado arriba. Puedes guardar las imágenes buscadas como un álbum permanente - consulta {ÁLBUMES}. - ^Rendimiento La búsqueda e informe de metadata indexada es casi instantánea. La velocidad para metadata no indexada depende de la velocidad del ordenador y del disco. Un ordenador potente con disco SSD puede buscar más de 100 mil archivos por minuto. - ^search_results^ (álbum) La salida de Buscar imágenes se guarda en el álbum "search_results". Renombra este álbum si quieres evitar que una búsqueda posterior lo reemplace. - Limitación: la función de búsqueda está limitada a 40.000 resultados (imágenes encontradas que cumplen los criterios de búsqueda). Si se supera este límite, se te notifica y la búsqueda se trunca. Este límite existe porque el tamaño de una ventana con desplazamiento en GTK es limitado, y un intento de crear una ventana más grande podría provocar un fallo o bloqueo. - - TOPIC: MENÚ DE SELECCIÓN - - TOPIC: VISTA GENERAL DE ÁREA Las funciones de edición normalmente se aplican a toda la imagen, pero es posible editar parte de una imagen (un "área") y dejar el resto sin cambios. Si se ha seleccionado un área de la imagen, entonces la mayoría de las funciones de edición funcionarán solo dentro de esta área. Algunas funciones (p. ej. Reescalar) ignoran un área seleccionada. Un área se puede seleccionar antes de iniciar una función de edición, o mientras se usa una función de edición. El área seleccionada está activa de inmediato, se conservan las ediciones anteriores, y las ediciones futuras se aplicarán solo dentro del área. Si se inicia otra edición, el área seleccionada permanece activa, por lo que es posible realizar una serie de ediciones dentro de un área. Un área también puede ser varias áreas no conectadas dentro de la imagen. - Fotocx usa "áreas" en lugar de "capas". En lugar de seleccionar algo de la imagen, crear una capa separada a partir de la selección, editar la capa y finalmente combinarla, seleccionas algo en la imagen, realizas funciones de edición sobre la selección, y ves el resultado final inmediatamente. Las áreas también se pueden guardar, pegar en otra imagen, mover y reescalar, y editar más. - +image: edit-selection.jpg - Editar un área seleccionada a veces puede dar como resultado bordes visibles en los límites del área (a veces estos corresponden a bordes de formas en la imagen, y por lo tanto no son un problema). Puedes mezclar los bordes usando {MEZCLA DE ÁREA}: las ediciones se pueden aplicar gradualmente desde el borde del área hacia el interior, y puedes seleccionar qué bordes se mezclan. - - TOPIC: SELECCIONAR ÁREA +image: select-area.jpg - El diálogo Seleccionar área se inicia con el menú Seleccionar > Seleccionar área. Selecciona uno de los métodos explicados abajo. Cada método selecciona áreas de la imagen de una manera diferente. Puedes cambiar de método en cualquier momento, y las áreas seleccionadas se acumulan. Se muestra un contorno de las áreas de imagen seleccionadas a medida que añades o quitas áreas de la selección. El botón [Terminar] se usa para mapear los píxeles de la imagen dentro de los contornos del área, dejándolos listos para aplicar las siguientes funciones de edición. El botón [Ocultar] oculta el contorno del área, dándote mejor visibilidad de las ediciones y de posibles efectos en el borde del área. Usa el botón [Mostrar] para mostrar el contorno del área. El botón [Borrar] elimina todas las selecciones de área. El diálogo de seleccionar área se puede cancelar y reiniciar más tarde para modificar áreas existentes o añadir nuevas. - ^Métodos Los siguientes métodos se usan para encerrar uno o más espacios de imagen que pertenecerán al área final. Estos métodos se pueden usar en cualquier secuencia para definir espacios que estén unidos o separados. • Rectángulo - arrastra para delinear un área rectangular • Elipse - arrastra para delinear un área circular o elíptica • Dibujo a mano alzada - delinea un área dibujando con el ratón • Seguir borde - delinea siguiendo los bordes de las formas de la imagen • Seleccionar área dentro del ratón - arrastra para seleccionar los píxeles dentro de un círculo alrededor del puntero del ratón. • Seleccionar un color dentro del ratón - selecciona solo los píxeles que coincidan con un color dado, coincidencia del 0 al 100%. • Seleccionar todos los colores dentro del ratón - selecciona todos los píxeles dentro del ratón, extiende la selección a áreas adyacentes con colores que coincidan con los colores dentro del ratón (a veces llamado "inundación"). - Los siguientes párrafos explican los detalles de cada método. - ^Rectángulo Arrastra el ratón desde una esquina hasta la esquina opuesta de un área rectangular a seleccionar. Se dibuja un rectángulo para encerrar el área. Haz clic derecho para eliminar y empezar de nuevo. Repite el proceso para seleccionar más áreas rectangulares. - ^Elipse Esto funciona igual que la selección de rectángulo, excepto que el área encerrada es un círculo o una elipse. La posición inicial del arrastre es el centro de la elipse resultante. El ángulo del arrastre determina la forma de la elipse. - ^Dibujo a mano alzada Arrastra el ratón (con el botón izquierdo pulsado) para dibujar una línea a mano alzada, o haz clic izquierdo para conectar una línea recta desde el último punto dibujado hasta el punto pulsado. Continúa alrededor del área objetivo hasta que quede rodeada de curvas y líneas conectadas. Haz clic derecho para eliminar líneas anteriores (errores). Un clic derecho eliminará la última línea pulsada o arrastrada, hasta 50 píxeles. Haz clic derecho repetidamente para eliminar más. Una nueva línea pulsada siempre se conectará al final de la línea anterior. Una nueva línea arrastrada se conectará a la línea anterior si se inicia cerca del final de esa línea. Si se inicia en otro lugar, se dibujará una línea desconectada. Puedes iniciar un nuevo arrastre desde lejos y dibujar de vuelta hasta encontrar la línea anterior. Si una línea pulsada se conecta a un punto no deseado (es decir, no quieres conectarla a la última línea dibujada), haz clic derecho para borrarla y luego usa el arrastre para iniciar una nueva secuencia de líneas. Un arrastre con el botón derecho se puede usar para borrar segmentos de línea: arrastra con el botón derecho muy cerca de una línea para borrarla, luego arrastra con el botón izquierdo para volver a dibujar la línea. Al final, un área debe quedar completamente encerrada, sin huecos. Las líneas que se solapan un poco en los extremos están bien. Los huecos pueden ser difíciles de encontrar y corregir, así que trabaja al 100% del tamaño de la imagen o más y ten cuidado. Una serie de líneas conectadas automáticamente con clics izquierdos no dejará huecos, pero desviarse de esta secuencia probablemente creará huecos. Para reducir la posibilidad de huecos, usa solapamientos deliberados al conectar líneas manualmente. Hay una utilidad de detección de huecos descrita abajo - {BUSCAR HUECO EN ÁREA}. Si un borde del área es también un borde de la imagen, no tienes que dibujar esta parte del área. Dibuja la línea fuera del borde de la imagen, y vuelve a dibujarla sobre la imagen en otra posición a lo largo del borde de la imagen. - ^Seguir borde Se encuentran y conectan los píxeles de alto contraste (probablemente bordes de formas de la imagen) entre el último punto dibujado y una posición recién pulsada. Esto es efectivo para bordes claros que no son demasiado irregulares. Los bordes difusos e irregulares pueden no funcionar bien y se necesitará el dibujo a mano alzada si se requiere alta precisión. Las reglas para conectar líneas son las mismas explicadas arriba. Arrastrar el ratón en lugar de hacer clic funciona como el dibujo a mano alzada, pero con tendencia a seguir los bordes de las formas desde una posición ligeramente detrás del ratón. Para bordes muy irregulares (pelo, follaje), consulta "deseleccionar color", abajo. - ^Radio del ratón y nivel de igualación de color Estos dos controles se aplican solo a los métodos de "seleccionar dentro del ratón" descritos abajo. El radio del ratón define el tamaño de un círculo alrededor del puntero del ratón. Los píxeles dentro del círculo se seleccionan, o proporcionan un conjunto de colores para igualar y seleccionar píxeles desde el círculo del ratón hacia afuera. El nivel de igualación define un nivel de coincidencia requerido (0-100%) para seleccionar píxeles según su color y brillo. "0" significa que cualquier cosa coincide, y "100" significa que se requiere una coincidencia perfecta. - ^Seleccionar área dentro del ratón Un clic o arrastre izquierdo seleccionará los píxeles encerrados por el círculo del ratón. Un clic derecho deseleccionará la última selección (repite para deseleccionar más). Un arrastre derecho deseleccionará los píxeles encerrados. - ^Seleccionar un color dentro del ratón Haz clic en la imagen para seleccionar un color. El color se muestra en el botón de color. También puedes usar el botón para fijar un color directamente. Arrastra con el botón izquierdo/derecho para seleccionar/deseleccionar píxeles dentro del círculo del ratón que coincidan con el color seleccionado dentro del nivel de igualación. Ajusta el nivel de igualación hacia abajo o hacia arriba para igualar un rango de colores mayor o menor. Haz clic según sea necesario en la imagen para cambiar el color a igualar. - ^Deseleccionar color opcional Esto se aplica solo a "seleccionar un color" arriba. Haz clic izquierdo en la imagen para fijar un color de deselección. Cuando la casilla está marcada, el color de deselección está activo. Si un píxel coincide mejor con el color de deselección que con el color de selección, el píxel se deselecciona. Al seleccionar a lo largo de un borde de forma con bajo contraste de color en comparación con un área adyacente que debe permanecer sin seleccionar, fija el color de deselección desde el área adyacente. Esto es útil para la selección precisa de un borde complejo, como pelo o follaje. - ^Seleccionar todos los colores dentro del ratón Esto se llama "inundación" en algunos editores. Arrastra con el botón izquierdo/derecho para seleccionar/deseleccionar píxeles dentro del círculo del ratón. Los píxeles fuera del círculo del ratón también se incluyen si cumplen estas dos condiciones: 1) su color coincide con cualquier color dentro del círculo del ratón, dentro del nivel de igualación actual. 2) están dentro del rango de búsqueda del puntero del ratón. Esto es un factor del radio del ratón, p. ej. si el radio del ratón es 20 y el rango de búsqueda es 3, entonces el rango de búsqueda es de 60 píxeles desde el puntero del ratón. Arrastra el ratón sobre nuevas áreas que quieras incluir. Observa cómo el área seleccionada se expande hacia áreas con colores que coinciden con los del interior del círculo del ratón. Si te pasas, haz clic derecho para eliminar la última selección. Repite si es necesario para eliminar más selecciones anteriores. Reduce el radio o aumenta el nivel de igualación para obtener un control más fino - la selección se expandirá más lentamente y se mantendrá más cerca del círculo del ratón. Se puede usar un radio pequeño y un nivel de igualación alto para seguir un borde de forma de la imagen y seleccionar píxeles hasta el borde con buena precisión. Después de terminar el trabajo del borde, usa el método seleccionar área dentro del ratón para seleccionar el resto. El arrastre derecho actúa como una deselección: se deseleccionan los píxeles dentro del círculo del ratón y los píxeles coincidentes dentro del rango de búsqueda. Si una selección se extiende demasiado, a menudo es más fácil corregirlo deseleccionando desde fuera del área seleccionada en lugar de seleccionar desde dentro. Puede que necesites algo de práctica para adquirir soltura con esto y poder trabajar de forma eficiente. - ^Seleccionar todos los colores dentro del ratón - resumen • arrastre izquierdo - selecciona píxeles en el ratón y píxeles coincidentes en el rango • clic derecho - deshace la selección anterior, repite para deseleccionar más • arrastre derecho - deselecciona píxeles en el ratón y píxeles coincidentes en el rango - ^Desplazamiento del borde Un área que se ha terminado (ver abajo) se puede expandir o contraer en pasos de 1 píxel. Esto puede ser útil para reducir efectos de borde cuando un área seleccionada por igualación de colores se edita de una manera que cambia su brillo. La selección por color puede dejar una banda estrecha de píxeles infra o sobreseleccionados a lo largo de un borde donde el color de la forma transiciona al fondo. Expandir o contraer el área 1-2 píxeles puede producir un borde de aspecto más limpio. El área permanece terminada (ver abajo) después del desplazamiento. - ^Color de contorno de área El color usado para el círculo de selección del ratón y el contorno del área se puede cambiar en cualquier momento haciendo clic en uno de los botones de color. Esto permite buena visibilidad contra varios colores de imagen. - ^Mostrar/Ocultar Usa [Ocultar] para ocultar los contornos del área. Esto es útil para ver mejor los efectos de las ediciones del área sin interferencia del contorno del área. Usa [Mostrar] para mostrar los contornos y reanudar la edición del área. - ^Terminar +image: select-area-finish.png - Un área no es efectiva para ediciones hasta que se termina correctamente. Terminar valida los contornos dibujados y colorea los píxeles encerrados para verificación visual. Cuando termines de delinear áreas, usa el botón [Terminar] para completar el proceso. El diálogo emergente mostrado arriba resume dos métodos que puedes usar para terminar. - Método 1: haz clic izquierdo con el ratón dentro de las áreas que se delinearon a mano. Las áreas encerradas se colorean temporalmente para que puedas verificar que el resultado final es el que pretendías. Se puede seleccionar cualquier área encerrada, incluso las no delineadas explícitamente: si tienes una rosquilla con un agujero, puedes seleccionar la rosquilla, el agujero, o ambos. Pulsa [keep] cuando todas las áreas se hayan pulsado y coloreado correctamente. Si el contorno de un área dibujada a mano tiene un hueco, el proceso de coloreado "se saldrá" y se colorearán áreas fuera del cerramiento. En este caso, pulsa [Deshacer] en el diálogo Terminar, que restaura el contorno de área original. Encuentra el hueco en el contorno y ciérralo, luego intenta [Terminar] de nuevo. Un hueco de 1 píxel en un área grande puede ser difícil de encontrar. Acerca el zoom para ver mejor. Consulta la función {BUSCAR HUECO EN ÁREA} abajo para un método rápido de encontrar huecos diminutos. - Método 2: haz clic derecho en algún lugar fuera de todas las áreas encerradas. Todas las áreas encerradas se colorearán para verificación visual. Si hay un hueco, los resultados y la solución son los mismos que se describieron en el método 1. Este método tiene sentido si tienes muchas áreas delineadas a mano y no quieres comprobarlas una por una usando el método 1. - Las áreas seleccionadas usando los métodos "seleccionar dentro del ratón" se terminan automáticamente. Estas áreas se mapean durante el proceso de selección, mientras que las áreas seleccionadas con rectángulo, elipse, o uno de los métodos de dibujo de línea se mapean solo cuando haces clic dentro de ellas. Si usas solo los métodos "seleccionar en el ratón", puedes pulsar [keep] sin hacer clic en ninguna de las áreas seleccionadas. - Si dibujas una línea de un lado de la imagen a otro, puedes hacer clic en cualquier lado de la línea para hacer un área de todos los píxeles de ese lado de la línea. Ejemplo: dibuja una línea horizontal en el límite entre cielo y tierra. Haz clic arriba de la línea para seleccionar el cielo, debajo de la línea para seleccionar la tierra. Las líneas dibujadas deben llegar completamente hasta los bordes de la imagen. - ^Borrar Descarta el área actual permanentemente. - - TOPIC: BUSCAR HUECO EN ÁREA Si un contorno de área se creó mediante dibujo a mano alzada usando varios trazos, es fácil dejar pequeños huecos en el contorno que no son visibles por debajo de 4x de zoom. Un intento de terminar tal área fallará porque el mapeo de los píxeles interiores se saldrá a través del hueco y cubrirá áreas fuera del área pretendida. Si la función Terminar falla, esta función puede encontrar el hueco. Haz clic en algún lugar del contorno del área fallida. El contorno se volverá a dibujar lentamente en una dirección desde la posición pulsada, hasta que se encuentre un "píxel final". Ahí es donde está el hueco. Luego el contorno se dibuja en la dirección opuesta hasta que se encuentra el hueco (u otro). El hueco es donde se detuvo el dibujo. Acerca el zoom sobre el hueco y ciérralo usando el dibujo a mano alzada, luego prueba de nuevo para ver si se puede dibujar el contorno completo sin detenerse. Esta función se puede usar en paralelo con la función Seleccionar área - ambos diálogos pueden estar activos. - - TOPIC: MEZCLA DE ÁREA +image: area-blend.jpg - Esta herramienta tiene dos funciones: Mezcla de área y Mezcla de borde de área. Ambas funciones pueden "deshacer" gradualmente una edición hecha dentro de un área seleccionada, mezclando una edición anterior o la imagen original. En el ejemplo anterior, los cuatro hombres del fondo se aclararon sin ninguna evidencia de un límite entre los píxeles aclarados y los sin cambios. - ^Mezcla de área Cualquier parte de un área seleccionada editada se puede mezclar con la imagen original. Usa arrastres con el botón izquierdo del ratón sobre las regiones a mezclar. Cada arrastre del ratón dentro del área mezclará gradualmente la imagen anterior seleccionada, reduciendo o eliminando efectivamente la edición que se hizo dentro del área. La velocidad de mezcla se determina por la "tasa de mezcla", que se puede fijar por separado para el centro y el borde del círculo del ratón. Fija el radio del ratón y las tasas de mezcla (p. ej. 50/0 para centro/borde del ratón). Arrastra el ratón sobre las regiones del área a mezclar. Usa el arrastre izquierdo para mezclar, el arrastre derecho para desmezclar o restaurar. Puedes usar este método para mezclar los bordes del área selectivamente: usa un radio pequeño y arrastra el centro del ratón sobre los bordes a mezclar. Esto dará como resultado una mezcla gradual desde el borde hacia el interior. - ^Mezcla de borde de área A veces un área editada tendrá bordes de aspecto antinatural, debido a un límite marcado entre el área editada y la imagen circundante (especialmente si el área se aclaró). Esto se puede hacer invisible de manera efectiva mezclando gradualmente hacia afuera la edición del área en una franja a lo largo de los bordes. La edición del área se puede eliminar al 100% en el borde del área, disminuyendo hasta el 0% hacia el interior a lo largo del ancho de la franja. Hay dos formas de mezclar los bordes del área, "mezclar" y "desenfocar". Mezclar combina la franja del borde con la edición anterior elegida o la imagen original. Desenfocar combina la franja con los píxeles vecinos de fuera de la franja. Fija el ancho de la mezcla con la entrada "ancho de mezcla" o "ancho de desenfoque". - El "Mezclar" y "Desenfocar" del borde de área requieren un cálculo de distancia de borde: la distancia desde cada píxel del área hasta el borde de área más cercano. Esta distancia se usa para calcular la mezcla relativa para el píxel: 100% en el borde del área y 0% para píxeles más allá del "ancho de mezcla" desde el borde. Para un área grande con un borde complejo, esto puede tardar algo de tiempo. Se muestra un medidor de progreso en el panel superior. - - TOPIC: MOSTRAR/OCULTAR ÁREA Muestra u oculta el contorno del área actual. Ocultar el área es útil cuando el área se está modificando con una función de edición. Esto facilita juzgar los efectos de la edición. Estos también están disponibles como botones en el diálogo Seleccionar área. - - TOPIC: ACTIVAR/DESACTIVAR ÁREA Desactiva el área actual y conserva los datos para que se pueda reactivar más tarde (menú Activar). Esto te permite alternar entre ediciones dentro de un área seleccionada y ediciones para toda la imagen. - - TOPIC: INVERTIR ÁREA Invierte un área existente: se selecciona toda la imagen excepto el área existente. Usar la función dos veces devuelve el área seleccionada original. Invertir un área seleccionada invalida el cálculo de borde, que debe repetirse si se desea mezclar el borde del área. - - TOPIC: BORRAR ÁREA Descarta permanentemente el área actual. Esto también está disponible como un botón en el diálogo Seleccionar área. - - TOPIC: COPIAR/PEGAR ÁREA Un área seleccionada se puede guardar en un archivo de caché usando el menú Áreas > Copiar. Esta área se puede pegar en la misma imagen u otra usando Áreas > Pegar. Haz clic y arrastra para posicionar el área pegada. Los controles del diálogo se pueden usar para reescalar y rotar el área pegada. - - TOPIC: CARGAR/GUARDAR ÁREA Un área seleccionada se puede guardar en un archivo usando el menú Áreas > Guardar. Se te pide que proporciones un nombre de archivo. Se crea un archivo PNG. El archivo PNG tiene un canal alfa para información de transparencia. La imagen es un rectángulo que encierra el área seleccionada. Los píxeles seleccionados son opacos, y los demás son transparentes. - Estos archivos residen en /saved_areas por defecto, pero puedes guardarlos donde quieras. Usa el menú Áreas > Cargar para cargar un área guardada desde un archivo y pegarla en el archivo de imagen actual. La imagen de fondo se mostrará a través de las partes transparentes del área pegada. Haz clic y arrastra para posicionar el área. Los controles del diálogo se pueden usar para reescalar y rotar el área pegada. - - TOPIC: BOTÓN DESHACER/REHACER Si una función de edición está activa y la imagen ha sido cambiada: • un clic izquierdo del ratón deshará la edición actual • un clic derecho del ratón rehará la edición Esto te permite comparar rápidamente las imágenes de "antes" y "después" de la función de edición actual. - Si NO hay ninguna función de edición activa, pero se han hecho algunas ediciones a la imagen actual: • un clic izquierdo del ratón deshará un paso de edición por clic • un clic derecho del ratón rehará un paso de edición por clic • un clic central del ratón muestra una lista emergente de todos los pasos de edición. Puedes volver a cualquier paso de edición o a la imagen original - Si abres otro archivo, se descartan los pasos de edición guardados para el archivo actual. - - TOPIC: MENÚ DE EDICIÓN - - TOPIC: ROTAR Para nivelar una imagen inclinada, usa el ratón para arrastrar el lado derecho o izquierdo de la imagen hacia arriba o hacia abajo hasta que la imagen se vea nivelada. Un clic izquierdo en la imagen añadirá líneas guía verticales y horizontales para ayudar a nivelar la imagen. Usa el clic derecho para eliminarlas. - El botón [Nivel automático] puede nivelar automáticamente la imagen si la cámara ha registrado el "ángulo de giro" en la metadata EXIF. El botón [Auto Upright] puede enderezar automáticamente una imagen tomada con la cámara girada 90º, si "orientation" está presente en la metadata EXIF. - - TOPIC: ENDEREZAR Esta es una corrección de un solo botón para una imagen que está rotada 90/180 grados o invertida (reflejada). No hay pérdida de resolución ya que los píxeles se copian 1:1 al nuevo diseño de la imagen. Consulta también la función {ENDEREZADO MASIVO}. - - TOPIC: RECORTAR +image: crop-image.jpg +image: crop-buttons.jpg - Corta las áreas no deseadas de los bordes de la imagen. Cuando se abre el diálogo, se coloca un rectángulo de selección sobre la imagen. Las áreas fuera de este rectángulo se oscurecen y representan las partes de la imagen que se eliminarán. Arrastra cualquier lado o esquina del rectángulo para mover ese lado o esquina. El cuadro de diálogo muestra la relación ancho/alto actual del rectángulo de selección. Si "Bloquear" está marcado, mover un lado o esquina hará que otro lado o esquina se mueva, de modo que se mantenga la relación ancho/alto fija. Arrastra desde el centro (marcado por un pequeño círculo) para desplazar todo el rectángulo sin cambiar las dimensiones. Usa los botones giratorios de ancho y alto para ajustar directamente las dimensiones en píxeles de la imagen, o introduce los valores deseados. El rectángulo de selección se ajustará a estos valores. - Usa las teclas de flecha del teclado para mover el rectángulo de selección en pasos de 1 píxel. El último lado o esquina movido con el ratón es el que se mueve con las teclas de flecha. - El botón [Máx] restablece el rectángulo de recorte al tamaño completo de la imagen. Si una edición anterior (Rotar, Deformar ...) ha dejado márgenes transparentes alrededor de la imagen, el rectángulo de recorte reflejará el tamaño máximo que cabe dentro de estos márgenes. - El botón [Ant] recupera una lista de valores de ancho y alto usados anteriormente. Selecciona de la lista para usar uno de estos. - Los cinco botones de proporción te permiten elegir una relación ancho/alto predefinida. El botón [invert] invierte la relación ancho/alto actual. - Puedes cambiar los botones de proporción con el botón [customize], que inicia un nuevo diálogo mostrado a la derecha. Haz clic en un botón para editarlo. Introduce la relación ancho a alto deseada usando el formato "aa:al" como en el ejemplo mostrado. - - TOPIC: RETOCAR +image: retouch.png - Ajusta el brillo y el color de la imagen. • nivel de negro automático - fija el punto negro usando el % de píxeles más oscuros • balance de blancos automático - fija el punto blanco usando el % de píxeles más brillantes • haz clic en un punto gris para el balance de blancos - haz clic en un punto gris de la imagen • haz clic en un punto oscuro para el nivel de negro - haz clic en un punto oscuro de la imagen • haz clic para un gráfico emergente de histogramas RGB • brillo - mueve la curva "todo" hacia arriba o abajo (cambian todos los colores) • contraste - cambia la pendiente de la curva "todo" • saturación de color - blanco/negro <--> colores intensos • temperatura de color - balance de iluminación (cálido <--> frío) - Después de hacer los ajustes iniciales usando los controles deslizantes, puedes ajustar finamente el brillo y el contraste editando las curvas con el ratón para cambiar qué partes de la imagen cambian más o menos. La curva TODO ajusta todos los colores, y las 3 curvas RGB ajustan colores individuales. Usa TODO primero, luego haz revisiones usando RGB. - ^Botones Restablecer - devuelve todos los controles a una posición neutra - la imagen también se restablece Ant - fija todos los controles a los valores usados para la imagen anterior Hecho - termina la edición, cierra el diálogo, guarda la configuración de los controles Cancelar - cancela la edición, restablece la imagen, cierra el diálogo - Usa el botón [Ant] al procesar varias imágenes que necesitan ajustes similares. - - TOPIC: REESCALAR +image: rescale.png - Esta función reescala la imagen a un nuevo ancho y alto en píxeles. Puedes introducir las nuevas dimensiones directamente o elegir un cambio porcentual. Hay botones para fijar el nuevo tamaño a una proporción simple del tamaño original. Usar uno de estos minimizará la pérdida de resolución. El botón [Anterior] recupera el tamaño anterior, una comodidad si se están fijando varias imágenes al mismo tamaño. Si la casilla de bloquear proporción está marcada, se conservará la relación ancho/alto actual si se cambia el ancho o el alto. - - TOPIC: PANTALLA DIVIDIDA +image: split-screen1.jpg +image: split-screen2.png - Durante una función de edición, ve las imágenes de antes y después usando el método de pantalla dividida. Arrastra la línea límite usando el ratón. Cuando salgas de Pantalla dividida, puedes continuar la función de edición normalmente. - Si no hay ninguna función de edición activa, elige dos imágenes para mostrar usando pantalla dividida. Deben tener las mismas dimensiones en píxeles. - - TOPIC: MOSTRAR DIFERENCIAS Durante una función de edición, resalta los cambios oscureciendo las áreas sin cambios. Usa el control deslizante para ajustar la oscuridad de las áreas sin cambios. Cuando salgas de Mostrar diferencias, puedes continuar la función de edición normalmente. - Si no hay ninguna función de edición activa, elige dos imágenes para resaltar sus diferencias. Deben tener las mismas dimensiones en píxeles. - - TOPIC: MÁRGENES +image: margins.png - Usa esta función para añadir márgenes alrededor de una imagen. Puedes usar cualquier color y configuración de alfa (transparencia) para los márgenes. Fija cada margen por separado, o usa los controles "Todo±1" y "Todo±10" para ajustar todos los márgenes hacia arriba o hacia abajo por la misma cantidad, 1 o 10 píxeles. Usa la rueda del ratón o las teclas de flecha arriba/abajo para mayor rapidez. - Puedes usar esta función para añadir márgenes alrededor de imágenes que planeas deformar, para evitar que algunas áreas se salgan de los bordes. - - TOPIC: MARCADO +image: markup.jpg - Este es un menú que contiene las funciones de marcado de imagen: dibujar texto, dibujar línea/flecha, dibujar cuadro, dibujar óvalo Todas estas funciones tienen un botón [commit] que confirma la edición actual y te permite comenzar una nueva (nuevo texto/línea/cuadro/óvalo) dentro del mismo diálogo de edición. - ^Dibujar texto Esta función dibuja texto directamente sobre la imagen. Introduce el texto en el diálogo. Se pueden usar varias líneas. Después de introducir el texto, haz clic izquierdo con el ratón donde quieras el texto en la imagen. Arrastra para mover el texto a otro lugar. Haz clic derecho para eliminar el texto. Usa el botón [Fuente] para seleccionar una fuente diferente. Usa el control [Tamaño] para aumentar o disminuir el tamaño del texto. Usa el control [Ángulo] para cambiar el ángulo de inclinación del texto. Los demás controles te permiten proporcionar un color de fondo alrededor del texto, un color de contorno del texto, y un efecto de sombra. Puedes seleccionar el color y la transparencia para todos estos. El control de ancho ajusta el ancho de los contornos y las sombras. El control de ángulo de sombra fija el ángulo de la sombra. Usa los controles de relieve para dar al texto un aspecto 3D. - Puedes inicializar el texto a partir de cualquier metadata disponible en el archivo de imagen. Introduce el tag de metadata (p. ej. "user comments") y pulsa [Obtener]. Puedes abreviar los nombres de tag, p. ej. "usercomments" en lugar de "User Comments". - Los botones [Abrir] y [Guardar] inician un diálogo de selección de archivo con el que puedes cargar o guardar todos los datos de texto desde o hacia un archivo. Se cargan o guardan todos los elementos del diálogo, así que puedes mantener una colección de cadenas de texto y ajustes usados frecuentemente. - Los botones de abajo funcionan así: • Borrar - deja en blanco los campos de texto y metadata • Reemplazar - la imagen con el texto añadido reemplaza a la imagen actual • +Versión - la imagen con el texto añadido se guarda como una nueva versión • Siguiente - abre el siguiente archivo, coloca el mismo texto en la misma posición • Aplicar - confirma la edición actual y reinicia para una nueva entrada de texto • Hecho - completa la edición actual - la imagen está lista para guardar • Cancelar - abandona la edición actual - Para añadir el mismo texto a una serie de imágenes: prepara y posiciona el texto, pulsa [Reemplazar] o [+Version], luego [Siguiente], luego [Reemplazar] o [+Version], luego [Siguiente] ... - Crear una marca de agua: usa una transparencia de texto del 70% o más y una transparencia de fondo del 100%. El texto debería ser tenuemente legible. Usa los controles de relieve para hacer que el texto parezca hundido en la imagen. - ^Dibujar línea Esta función dibuja líneas o flechas directamente sobre la imagen. Introduce una longitud y un ancho de línea en el diálogo, y selecciona una punta de flecha si lo deseas. Haz clic izquierdo con el ratón donde quieras colocarla en la imagen. Arrastra los extremos de la línea/flecha para posicionarla en la imagen. Haz clic derecho para eliminarla. Arrastra desde el medio de la línea para moverla sin cambiar el ángulo ni la longitud. Los controles del diálogo te permiten proporcionar un color de fondo, un color de contorno y un efecto de sombra. Puedes seleccionar el color y la transparencia para todos estos. El control de ancho ajusta el ancho de los contornos y las sombras. El control de ángulo de sombra fija el ángulo de inclinación de la sombra. Para conservar una línea dibujada y comenzar otra, pulsa [aplicar]. - ^Dibujar cuadro Elige un color y un ancho para el contorno del cuadro. Coloca el cursor en la posición donde quieras una esquina del cuadro, y arrastra para abrir el cuadro en la dirección deseada. Para reemplazar el cuadro, arrastra de nuevo. Para mover el cuadro, mantén pulsada la tecla mayús y arrastra el cuadro desde el centro. Para mover uno de los bordes, mantén pulsada la tecla mayús y arrastra el borde. Para conservar un cuadro dibujado y comenzar otro, pulsa [aplicar]. - ^Dibujar óvalo Elige la casilla de óvalo (elipse) o círculo. Elige un color y un ancho para el contorno. Coloca el cursor en el centro deseado. Arrastra para dibujar el óvalo/círculo. El ángulo del arrastre determina la forma del óvalo, desde círculo hasta elipse extrema, ancha o alta. Para reemplazar el óvalo/círculo, arrastra de nuevo. Para mover el óvalo/círculo, mantén pulsada la tecla mayús y arrastra desde el centro. Para cambiar el tamaño o la forma, mantén pulsada la tecla mayús y arrastra desde el borde inferior derecho. Para conservar un óvalo/círculo dibujado y comenzar otro, pulsa [aplicar]. Para un óvalo, puedes introducir un ángulo de 0 a 90 grados para ejes inclinados, como en el ejemplo. - - TOPIC: MODO DE COLOR +image: color-mode.png +image: color-mode2.jpg - Usa esta función para crear un negativo en blanco y negro o en color, o convertir una imagen negativa en una imagen positiva, o convertir a coloración sepia (para un efecto de foto envejecida). El control deslizante se puede usar para aplicar el efecto de forma incremental, del 0% al 100%. - - TOPIC: PINTAR EDICIONES Usa esta función en combinación con alguna otra función de edición. Inicia una función de edición y deja los controles en una posición neutra. Luego inicia Pintar ediciones. Pinta la función de edición donde desees usando el ratón. Consulta {MOUSE PAINTING} para saber cómo aplicar ediciones localmente usando el ratón. - Este método de "pintar" ediciones de forma incremental puede mejorar áreas seleccionadas de una imagen de forma rápida y sencilla. Funciona con las siguientes funciones de edición: • Editar > Retocar, Modo de color • Reparar > Enfocar, Desenfoque, Reducir ruido, Quitar niebla, Ajustar RGB, Ajustar HSL • Refinar > Aplanar histograma, Contraste local, Amplificar contraste, Retinex local, Saturación, Enfoque suave • Efectos > Contornos, Boceto2, Relieve, Textura, Añadir destello, Establecer colores, Desplazar colores, Kernel personalizado - - TOPIC: PINTAR IMAGEN +image: paint-image.jpg - Esta función pinta sobre la imagen con los colores seleccionados, usando el ratón. Consulta {MOUSE PAINTING} para saber cómo aplicar ediciones localmente usando el ratón. - El botón Color de pintura muestra el color actual. Haz clic en este botón para elegir un color usando el diálogo estándar de selección de color de Gnome. También puedes hacer mayús + clic izquierdo en la imagen para elegir un color de la imagen. - El botón de paleta abre el diálogo mostrado en el medio. Haz clic en la imagen para seleccionar el color en esa posición. El color elegido se refleja en el botón de color del diálogo principal. La imagen mostrada arriba es la predeterminada. Puedes usar cualquier imagen como fuente de color. Pulsa el botón [explorar] y selecciona una imagen donde hayas guardado colores para recuperar. Esta elección permanece vigente hasta que se cambie. - El botón HSL abre un selector de color HSL mostrado a la derecha. Este diálogo puede representar cualquier color posible. Mueve los controles deslizantes para obtener el color que quieres. El color elegido se refleja en el botón de color del diálogo principal. - Si se selecciona pintar sobre áreas transparentes, pintar sobre áreas transparentes reducirá o eliminará la transparencia, según los controles de opacidad. Si esta opción no está seleccionada, solo se pintan las áreas opacas de la imagen. - ^Uso de tableta Wacom Con Pintar imagen, puedes usar una tableta Wacom en lugar de un ratón. Arrastrar el lápiz en contacto con la superficie de la tableta pintará como se describió arriba. Si se mantiene pulsado uno de los botones del lápiz mientras se arrastra, la operación será borrar en lugar de pintar. También puedes fijar el modo de pintar o borrar usando los botones de opción del diálogo. Mantener pulsado un botón del lápiz es incómodo, por eso están ahí los botones de opción. Añadir presión al lápiz aumentará la opacidad, así que puedes hacer trazos más claros y más oscuros sin ajustar los controles de opacidad. - - TOPIC: PINTAR TRANSPARENCIA +image: paint-transp.png +image: paint-transp2.jpg - Pinta áreas transparentes o semitransparentes en una imagen. Consulta {MOUSE PAINTING} para saber cómo aplicar ediciones localmente usando el ratón. - - TOPIC: RELLENO DE ÁREA Rellena todas las áreas seleccionadas o todas las áreas transparentes con un color de superposición elegido. Si un área es parcialmente transparente, el color de superposición reemplazará la fracción transparente de la imagen. El control deslizante "Mezcla" se puede usar para seleccionar cualquier combinación de la imagen original y el color de superposición. - - TOPIC: COPIAR DENTRO DE LA IMAGEN Pinta sobre áreas de la imagen copiando desde otro lugar de la misma imagen. Este método se puede usar para duplicar objetos dentro de una imagen, o eliminar un objeto no deseado reemplazándolo con fondo tomado de otro lugar. Haz clic izquierdo en la imagen para seleccionar una ubicación de origen, luego haz clic derecho para seleccionar el destino correspondiente. Consulta {MOUSE PAINTING} para saber cómo aplicar ediciones localmente usando el ratón. - Si se selecciona pintar sobre áreas transparentes, pintar sobre áreas transparentes reducirá o eliminará la transparencia. Si esta opción no está seleccionada, solo se pintan las áreas opacas de la imagen. - - TOPIC: COPIAR DESDE IMAGEN Pinta sobre áreas de la imagen copiando desde otra imagen. La imagen destino se "pinta" arrastrando el ratón sobre el área a modificar. Una posición previamente seleccionada en la imagen de origen se copia sobre la imagen destino. Tanto el área que se copia como el área que se pinta están encerradas en círculos que se mueven con el ratón. En el ejemplo anterior, el barco de la imagen derecha se copió a la imagen izquierda. - Empieza abriendo la imagen destino. Selecciona el menú "Copiar desde imagen". Se inicia una segunda sesión de Fotocx mostrando la misma imagen. En esta segunda sesión, navega hasta la imagen de origen y ábrela. Organiza las dos ventanas para poder mantener ambas a la vista (al menos las áreas a copiar). Mayús + clic izquierdo en la imagen de origen para establecer una posición de origen. Mayús + clic izquierdo en la imagen destino en la posición de destino. - Arrastra el ratón con el botón izquierdo sobre el área de la imagen destino. Los píxeles de la imagen de origen se copian a la imagen destino. Amplía las imágenes al tamaño máximo si se necesita alta precisión para las posiciones de referencia. La posición de referencia inicial es (0,0) (esquina NO) para ambas imágenes. Consulta {MOUSE PAINTING} para saber cómo aplicar ediciones localmente usando el ratón. - El valor de escala de la imagen de origen se usa para escalar la imagen de origen a la imagen destino. Empieza haciendo una copia de prueba para comprobar la escala. Si es demasiado grande o demasiado pequeña, usa [undo all] para borrar la prueba, cambia el valor de escala, e inténtalo de nuevo. - Si se selecciona pintar sobre áreas transparentes, pintar sobre áreas transparentes reducirá o eliminará la transparencia, según los controles de opacidad del ratón. Si esta opción no está seleccionada, solo se pintan las áreas opacas de la imagen. - - TOPIC: COPIAR EDICIÓN ANTERIOR La imagen de un paso de edición anterior se puede aplicar a la imagen actual de forma local y gradual, "pintando" con el ratón. La edición anterior debe ser una de las ediciones hechas a la imagen actual mientras sigue abierta - las ediciones sin guardar se pierden cuando se abre una imagen nueva. Puedes aplicar cualquier edición anterior a cualquier área de la imagen actual que se está editando, siempre que la imagen permanezca abierta como la imagen actual. Selecciona una edición anterior usando la lista desplegable que muestra todos los pasos de edición anteriores hechos a la imagen actual, en secuencia, e identificados por la función de edición usada. Consulta {MOUSE PAINTING} para saber cómo aplicar ediciones localmente usando el ratón. - - TOPIC: MENÚ DE REPARACIÓN - - TOPIC: ENFOCAR +image: sharpen.png - Esta función tiene cinco métodos para enfocar una imagen borrosa, y un método para corregir el desenfoque de movimiento de la cámara o del sujeto durante la exposición. - Elige el método, fija los parámetros, pulsa [aplicar] y espera unos segundos para ver el resultado. Haz cambios y repite el proceso hasta quedar satisfecho. Usa {SELECCIONAR ÁREA} para operar en diferentes partes de una imagen con diferentes métodos y parámetros. - Para todos los métodos, elige un radio pequeño para imágenes ligeramente borrosas y valores más grandes para imágenes más deficientes. Cantidad controla la fuerza de la modificación. Umbral suprime los cambios en píxeles de bajo contraste: un valor más alto reduce la amplificación de irregularidades de bajo nivel (ruido de imagen, tonos de piel desiguales, etc.). - Máscara de desenfoque (unsharp mask): un método clásico presente en la mayoría de los editores de imagen. Se puede encontrar una descripción técnica con una búsqueda en internet. Este método puede producir "halos" visibles alrededor de bordes de alto contraste. - Amplificar contraste: amplifica el contraste existente. La efectividad es comparable a la máscara de desenfoque, pero los "halos" se reducen. - Kuwahara: se comparan entre sí pequeños vecindarios alrededor de cada píxel. Al píxel se le asigna el color medio del vecindario con la menor diferencia. Esto obliga a los píxeles en un borde borroso a coincidir con un lado del borde o el otro. Los bordes quedan muy nítidos. La imagen puede parecer "en bloques" si se usa un radio grande. Se pueden perder detalles sutiles. - Diferencia de mediana: el brillo del píxel se compara con la mediana de los píxeles dentro del radio. El brillo se aumenta o disminuye para los píxeles respectivamente más claros o más oscuros que la media del vecindario. La efectividad es comparable a la máscara de desenfoque, pero los "halos" se reducen mucho. Este es el único método que trabaja cada color RGB por separado. Puede enfocar una transición de color incluso si hay poco cambio de brillo. - Richardson-Lucy: la imagen se enfoca usando el método de deconvolución Richardson-Lucy. Este método puede producir los mejores resultados, pero también es bastante lento. Para acelerar el proceso, empieza seleccionando un área pequeña pero con mucho detalle de la imagen usando {SELECCIONAR ÁREA}. Busca el radio y número de iteraciones óptimos usando esta área pequeña. Luego usa los mismos ajustes para la imagen completa. El ruido en la imagen dificultará la efectividad. Si es así, usa {REDUCIR RUIDO} de antemano. - Una imagen ampliada exactamente 2x se puede enfocar con Richardson-Lucy, usando un radio de 2.0 y 4 o más iteraciones. Los resultados son notablemente buenos. - ^Corregir desenfoque de movimiento +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - Optimiza manualmente imágenes con desenfoque leve por movimiento de la cámara o del objeto. El desenfoque de un objeto en movimiento en una imagen por lo demás nítida se puede procesar usando {SELECCIONAR ÁREA} para aislar el objeto. Se asume que el desenfoque es lineal y de velocidad constante. Las entradas son "extensión de desenfoque" en píxeles y "ángulo de desenfoque" en grados. La estimación del ángulo inicial se puede especificar mediante mayús + arrastre del ratón sobre la imagen en la dirección del desenfoque (puede ser igual u opuesta al movimiento real). Introduce una estimación de la extensión de desenfoque usando Herramientas > Mostrar RGB para medir el ancho del desenfoque a lo largo de algún borde brillante de una forma de la imagen. Ajusta las entradas, pulsa [aplicar], e inspecciona la imagen para encontrar los ajustes óptimos. El tiempo de respuesta puede ser lento para una imagen grande. Puedes acelerar el proceso si usas {SELECCIONAR ÁREA} para seleccionar una pequeña área borrosa para optimizar la extensión y el ángulo, luego borra el área para procesar toda la imagen usando los mismos ajustes. El algoritmo puede producir ruido de "zumbido" (ringing), que se puede suprimir usando la entrada "suprimir zumbido". Funciona mejor dejar el valor de supresión bajo para encontrar la extensión y el ángulo óptimos, y luego añadir supresión según sea necesario para reducir el zumbido. Se usa el método de deconvolución Richardson-Lucy en una dimensión. - ^Desenfoque de movimiento de cámara digital No todas las fotos borrosas tienen el desenfoque de velocidad constante mejor adaptado a este método. La imagen puede ser una superposición de varias exposiciones más cortas. Puede que toda la imagen no se haya expuesto al mismo tiempo ni tenga el mismo desenfoque (obturador mecánico o electrónico en movimiento). Este método puede producir mejores resultados que las herramientas de enfoque que trabajan en dos dimensiones. Debería funcionar mejor en fotos antiguas hechas con cámaras de película, donde el desenfoque de movimiento se acerca más a la velocidad constante. - - TOPIC: DESENFOQUE +image: blur.jpg - Elige un método con la casilla correspondiente, introduce los parámetros necesarios, pulsa [aplicar]. Si {SELECCIONAR ÁREA} está activo, solo se ven afectadas las áreas seleccionadas. - ^Desenfoque normal Mezcla cada píxel con los píxeles circundantes dentro del radio. Los píxeles más cercanos tienen mayor peso. Puedes fijar el radio en 1 y pulsar [aplicar] repetidamente para aumentar el desenfoque lentamente mientras observas el resultado en la imagen. - Opcionalmente puedes desenfocar en diferentes cantidades en las direcciones horizontal y vertical si introduces valores horizontal y vertical separados. La entrada [radio] forzará los mismos valores para ambos. - ^Desenfoque radial Mezcla cada píxel con los píxeles a lo largo de una línea desde un centro elegido. Radio define un área central que no se desenfoca. Longitud fija el rango de la línea de desenfoque: de 0 a longitud, desde el centro hasta el borde. Elige el centro haciendo clic en la imagen. - ^Desenfoque dirigido Arrastra una posición en la imagen usando el ratón. El área alrededor del ratón se desenfocará en esta dirección. Extensión determina el tamaño del área desenfocada. Intensidad determina la fuerza del desenfoque. - ^Desenfoque graduado Solo se desenfocan los píxeles con menos contraste que el límite de contraste dado, y el radio de desenfoque varía de 1 al valor dado para píxeles con un contraste correspondiente que varía desde el límite dado hasta cero. En resumen: los píxeles de bajo contraste se desenfocan más que los de alto contraste. Esto se puede usar para suavizar los tonos de piel sin desenfocar el pelo ni reducir el brillo de los ojos. Llevado al extremo, produce un efecto de "caricatura". - ^Desenfoque de fondo (Bokeh) Desenfoca las áreas de fondo de la imagen dejando nítido el primer plano. Selecciona una o más áreas que deban permanecer nítidas {SELECCIONAR ÁREA}. Después de seleccionar las áreas del primer plano, invierte la selección para que ahora quede seleccionado el fondo {INVERTIR ÁREA}. Esta es el área que se desenfocará. Hay dos métodos de desenfoque disponibles: Desenfoque constante: se usa un radio de desenfoque constante para todas las áreas desenfocadas. Aumentar desenfoque con la distancia: usa el radio de desenfoque mínimo para los píxeles adyacentes al primer plano y el radio de desenfoque máximo para los píxeles a la distancia máxima del primer plano. Esto requiere que se calcule la distancia al borde para todos los píxeles de fondo, lo cual puede tardar un tiempo considerable. El radio de desenfoque se puede variar sin recalcular las distancias al borde. - - TOPIC: REDUCIR RUIDO +image: denoise.jpg - Reduce el ruido en fotos tomadas con poca luz (ISO alto), lo que hace que las superficies uniformes aparezcan moteadas. Se ofrecen dos métodos, Mediana y Suave. El mejor método varía según el ruido y las características de la imagen. Mezclar métodos (usar uno y luego otro) puede ser útil. El valor de Radio define el vecindario de píxeles que se usará para comparar y ajustar un píxel dado. Un valor grande (Radio > 2) reducirá el ruido más eficazmente, pero también puede causar pérdida de detalle. El valor límite hará que se ignoren los píxeles cuyos valores de brillo RGB difieran de la mediana del vecindario en más de esta cantidad. Esto es necesario en algunas imágenes para evitar que pequeños detalles brillantes se traten como ruido - p. ej. fotos astronómicas. - Fija un valor de Radio y pulsa uno de los botones de método. Cada iteración usa la imagen anterior como punto de partida, así que varias iteraciones suprimirán el ruido gradualmente y posiblemente desenfocarán algunos detalles. Usa [restablecer] para empezar de nuevo. Mediana con Radio 1, seguida de Mediana con Radio 2, es un buen compromiso entre suprimir el ruido y conservar el detalle. - El control deslizante Áreas se puede usar para restringir el procesamiento solo a áreas oscuras, o a un rango más amplio de áreas. Las áreas oscuras tienden a tener un problema de ruido mayor que las áreas claras. - Si ves algunas motas de ruido diminutas que persisten, aumenta el valor límite, usa el botón [restablecer], y continúa con [mediana] o [suave]. - Puedes aplicar diferente procesamiento en diferentes áreas de la imagen - consulta {SELECCIONAR ÁREA}, y puedes "pintar" la imagen usando diferente procesamiento en diferentes áreas - consulta {PINTAR EDICIONES}. - Cada color RGB se procesa de forma independiente. No hay procesamiento separado de crominancia o luminosidad. - El botón [measure] inicia el diálogo del lado derecho para medir el nivel de ruido real de la imagen. Mueve el ratón sobre la imagen para mostrar los niveles de ruido RGB dentro del círculo del ratón (radio 10, unos 300 píxeles). Esta debe ser un área sin rasgos, de modo que el ruido sea la única variación presente. Inspecciona la imagen a 4X de tamaño para asegurarte de que estás viendo ruido y no textura. Los puntos muestran los valores RGB de píxeles individuales en relación con la media de los 5x5 píxeles circundantes, representada por la línea sólida central. Los números de abajo muestran el brillo RGB medio y los niveles de ruido en la escala 0-255. La escala del gráfico es de -10 a +10 y las líneas punteadas están en -5 y +5, en relación con un rango total de 0-255. El ruido en el noveno o décimo bit RGB es 0.5 o 0.25 en esta escala. - ^Ruido de imagen RAW Para medir el ruido del sensor de la cámara, usa una imagen RAW. Las imágenes JPEG se procesan dentro de la cámara para reducir el ruido. Puede que te sorprendan los niveles de ruido típicamente altos en las imágenes RAW. Incluso cámaras caras con sensores grandes pueden tener menos de 8 bits de color de bajo ruido. Cuando filtras el ruido de una imagen RAW, estás compitiendo con la electrónica y el software que producen el JPEG de la cámara. Podría ser un desafío hacerlo mejor. - - TOPIC: QUITAR NIEBLA +image: defog.png +image: defog2.jpg - Elimina la niebla/bruma en una imagen o área seleccionada. Hay otras herramientas para esto (aplanar histograma, contraste local, amplificar contraste, retinex, saturación), pero la eliminación de niebla/bruma es secundaria a su función principal. Esta función ataca la niebla/bruma directamente: elimina cantidades iguales de color R/G/B (reduciendo el brillo y aumentando la saturación), y opcionalmente devuelve el brillo perdido. También puede reducir el azul si este se vuelve demasiado dominante, como suele ocurrir con la bruma distante. Es posible que necesites usar {SELECCIONAR ÁREA} o {PINTAR EDICIONES} para dirigir y optimizar con precisión las áreas deseadas. El ejemplo anterior usó dos áreas, las colinas del primer plano y la montaña del fondo. - - TOPIC: OJOS ROJOS +image: red-eyes1.png +image: red-eyes2.png - Reduce el efecto de ojos rojos de las fotos con flash. Se ofrecen dos métodos. El primero es más rápido pero puede no manejar casos difíciles. El segundo método es más robusto pero también necesita más tiempo y cuidado. Para usar la primera función, haz clic izquierdo en un ojo rojo una o más veces hasta quedar satisfecho. Si el área oscurecida es demasiado pequeña o está descentrada, haz clic derecho para deshacer el cambio y luego haz clic izquierdo más precisamente en el centro del ojo rojo. Si un ojo rojo no se puede corregir correctamente, haz clic derecho para deshacer el cambio y luego usa el segundo método. El segundo método puede manejar mejor los casos más difíciles donde el ojo rojo es solo ligeramente rojo y la diferencia de color con los párpados es demasiado pequeña para que el algoritmo automático la distinga. Coloca el cursor sobre el centro del ojo rojo. Mantén pulsado el botón izquierdo del ratón y arrastra el cursor hacia abajo y a la derecha. Aparecerá una elipse punteada que encierra el ojo rojo. Repite si es necesario para que el ojo rojo quede centrado en la elipse (aproximadamente). Ten en cuenta que la forma de la elipse depende de la dirección del arrastre, lo que puede permitir un cierre más preciso de solo el ojo rojo. Haz clic izquierdo repetidamente dentro de la elipse mientras observas cómo se oscurece el ojo rojo, y detente cuando esté lo bastante oscuro. Si te pasas, los párpados pueden empezar a oscurecerse. Haz clic derecho para deshacer y repite si es necesario. - - TOPIC: BORRADO INTELIGENTE +image: smart-erase.png +image: smart-erase2.jpg - Borra objetos pequeños que pueden estropear una buena foto, como cables eléctricos, basura en el suelo, un cartel, etc. El objeto no deseado se reemplaza con píxeles tomados del área circundante. A veces esto es muy efectivo (efectos secundarios casi invisibles), y a veces no. Funciona mejor para objetos pequeños o estrechos en la foto. Radio controla el tamaño de un círculo alrededor del puntero del ratón, definiendo el área a seleccionar y borrar. Arrastra el ratón para encerrar el objeto a eliminar. El arrastre izquierdo selecciona y el arrastre derecho deselecciona. Pulsa [Borrar] para borrar el área seleccionada, reemplazando los píxeles con los píxeles más cercanos de fuera de la selección. Si la selección no fue lo bastante precisa, usa [Deshacer], ajusta el área seleccionada, y [Borrar] de nuevo. Las selecciones y borrados repetidos se acumularán hasta que uses [New_Area] para iniciar una nueva selección. Las áreas borradas anteriores ahora quedan fijas y [Deshacer] solo funcionará para las selecciones siguientes. Es mejor trabajar con una imagen ampliada al 200% o más. El control Desenfoque añade desenfoque a los píxeles de reemplazo. Esto puede reducir efectos secundarios visibles, ya que los píxeles de reemplazo pueden ser más nítidos que el entorno. Cambia el ajuste de Desenfoque y repite el botón [Borrar]. Los botones [show] y [hide] se pueden usar para mostrar el contorno de la selección actual u ocultarlo para juzgar mejor los resultados después de borrar. - Para objetos largos y delgados (p. ej. cables eléctricos), puedes hacer clic en dos posiciones y todo lo que hay entre medias se seleccionará. La selección funciona en línea recta, así que para objetos curvos necesitarás hacer clic a intervalos para seguir la curva. - - TOPIC: ELIMINAR HALO +image: remove-halo.png +image: remove-halo2.png - Elimina halos dejados por algunas funciones de edición. Selecciona el tipo de halo: brillante (el más común) u oscuro. Arrastra el ratón con el botón izquierdo sobre el área del halo para alterar los píxeles dentro del ratón, como se muestra en el ejemplo. Para un halo brillante, los píxeles más brillantes se oscurecerán a medida que se arrastra el ratón sobre ellos. Para un halo oscuro, los píxeles más oscuros se aclararán. Usa un radio de ratón mayor que el ancho del halo, como se muestra en el ejemplo. Arrastra el ratón con el botón derecho para restaurar los píxeles originales. - - TOPIC: ARTEFACTOS JPEG +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - Las imágenes JPEG que se han comprimido mucho (con un ajuste de calidad bajo) pueden mostrar artefactos de compresión en forma de pequeños bloques rectangulares. Si algunas áreas de una foto han tenido su rango de brillo expandido, estos bloques pueden volverse más visibles porque los escalones de brillo son mayores (p. ej. valores RGB de 11/12/13 aclarados 5x a 55/60/65). Esta función desenfoca los bordes entre los bloques para hacerlos menos visibles. - "Límite de igualación" determina cuándo los píxeles adyacentes se tratan como miembros del mismo bloque de píxeles. El Límite de igualación se puede fijar a un valor más bajo para que estos bloques queden mapeados más completamente. "Límite de contraste" sirve para evitar la mezcla de bordes donde el contraste es alto, lo que causaría pérdida de detalle. Cambia los dos ajustes y pulsa [aplicar]. Ve la imagen resultante a un tamaño >2x e intenta diferentes ajustes si la optimización es importante. Esta función será menos efectiva en una imagen que se ha reescalado. Usa {SELECCIONAR ÁREA} para procesar selectivamente las áreas problemáticas. - - TOPIC: ANTIALIAS +image: anti-alias.jpg - A veces las fotos muestran pixelación ("dentado") a lo largo de algunos bordes de formas de alto contraste. En el ejemplo anterior, puedes ver esto alrededor del ojo del pájaro. La herramienta antialias puede reducir esto. El efecto es menor en la mayoría de las fotos, donde el procesamiento dentro de la cámara puede haber ya solucionado el problema. Un efecto secundario es que los artefactos jpeg en imágenes muy comprimidas se suavizan algo. Las imágenes que se han ampliado de tamaño tendrán pixelaciones más prominentes. Estas se pueden mejorar, especialmente en el caso de una ampliación 2x. - Usa el botón [aplicar] para suprimir los píxeles, varias veces si parece ayudar. "Umbral" se puede usar para excluir del procesamiento los píxeles de bajo contraste. Un valor de 0.1 o menos suele ser el mejor. - Fotocx usa el algoritmo Scale3x, modificado para usar tonos de color "similares" y "diferentes" en lugar de "iguales" y "no iguales". - - TOPIC: AJUSTAR RGB +image: adjust-RGB.png - Cambia el brillo y el contraste generales, o los de colores seleccionados. • Brillo - aumenta o disminuye el brillo general de la imagen • +Rojo -Cian etc. - cambia el brillo del color y cambia el color complementario en la dirección opuesta • Contraste total - aumenta o disminuye el contraste general de la imagen • Contraste rojo verde azul - procesa colores RGB individuales - - TOPIC: AJUSTAR HSL +image: adjust-HSL.png - Cambia un rango seleccionado de colores en una imagen usando HSL (Tono, Saturación, Luminosidad). Esta función se puede usar para corregir un tinte de color o cambiar un color por otro (p. ej. un cielo sobreexpuesto - demasiado blanco). Si no estás familiarizado con el modelo de color HSL, lee el artículo de Wikipedia sobre esto. - Empieza seleccionando un color objetivo de la imagen para igualar y ajustar, usando mayús + clic izquierdo en la imagen. Este color será el centro de un rango de colores que se seleccionará para el ajuste. Selecciona qué atributos de color se igualarán usando las casillas de tono, saturación y luminosidad. Cada una de estas reducirá el rango de colores seleccionados. Si ninguna está marcada, se seleccionan todos los colores. El Nivel de igualación se puede usar para ampliar aún más el rango de colores seleccionados. 100% significa que solo se seleccionan colores que coinciden estrechamente. - Los controles de Color de salida (tono, saturación, luminosidad) se usan para fijar el nuevo color de salida que reemplazará o se mezclará con los colores de entrada seleccionados. También puedes fijar este color desde la imagen, usando mayús + clic derecho. El color resultante será una mezcla del color original y el color nuevo. La fracción del color nuevo se fija con el control deslizante Ajuste, que se puede fijar del 0 al 100%. Usa las casillas HSL para determinar qué componentes HSL del color de entrada se reemplazan con los componentes HSL correspondientes del color de salida. Usa los controles deslizantes del color de salida HSL para ajustar el color nuevo. El color de salida se muestra en el cuadro más pequeño de la izquierda, que se actualiza a medida que mueves los controles deslizantes. - Mueve los controles deslizantes y observa las actualizaciones en vivo de la imagen para optimizar el resultado. Esto no es muy intuitivo, y la práctica ayudará. Consejo: empieza igualando por tono y saturación, y reemplazando solo el tono - esto significa que la saturación y la luminosidad del color de salida se copiarán de los colores originales de la imagen, y solo se reemplazará el tono. - - TOPIC: ELIMINAR POLVO +image: remove-dust.png +image: remove-dust2.jpg - Las imágenes hechas a partir de diapositivas escaneadas con polvo pueden tener muchas manchas oscuras pequeñas - sombras del polvo en las diapositivas. Las fotos históricas de internet a menudo tienen un problema similar. Esta función puede eliminar la mayoría de esas manchas. Mueve los tres controles deslizantes hasta que se pinte de rojo el número máximo de manchas de polvo, luego pulsa el botón [borrar] para eliminarlas. Pulsa [red] para volver a la vista roja, luego puedes ajustar los controles deslizantes de nuevo y pulsar [borrar]. El control deslizante "límite de tamaño de mancha" limita el tamaño de las manchas que se borrarán. El control deslizante "brillo máx." fija un umbral para ignorar manchas que no sean lo bastante oscuras. El control deslizante "contraste mín." filtra las manchas con bajo contraste respecto a su entorno. Este proceso suele ser un compromiso. Si los ajustes no son óptimos, se pueden borrar detalles pequeños como hojas de árboles, o pueden quedar manchas grandes sin borrar. Diferentes partes de la imagen pueden necesitar diferentes ajustes, p. ej. el cielo se puede tratar más agresivamente que la pared de un edificio. Simplemente puedes usar Eliminar polvo varias veces con diferentes ajustes según sea necesario para conseguir todas las manchas de polvo. O puedes usar {SELECCIONAR ÁREA} para procesar la imagen por secciones. Si algunas manchas persisten, puedes tratarlas manualmente con {BORRADO INTELIGENTE}. Fija un radio de ratón pequeño y haz clic en cada mancha para eliminarla. Las manchas de fibras (largas y delgadas) normalmente no se eliminan automáticamente, pero Borrado inteligente puede ser efectivo aquí. Si el polvo es brillante, como en el ejemplo anterior, usa {MODO DE COLOR} para crear un negativo en color, procesa el polvo, y luego repite el negativo en color para restaurar la imagen normal. - - TOPIC: FRANJAS +image: fringes.png +image: fringesA.jpg - Corrige las franjas de color periféricas (aberración cromática lateral) - donde las franjas de color aparecen principalmente en las áreas exteriores de la imagen. - La imagen izquierda de arriba es un recorte ampliado de la esquina superior izquierda de una foto con aberración cromática lateral. Esto se eliminó en su mayor parte en la imagen procesada de la derecha. Las franjas de color pueden aparecer a lo largo de bordes de alto contraste, especialmente en las áreas exteriores de la imagen donde las distorsiones del objetivo suelen ser mayores. Para eliminarlas, amplía la imagen al tamaño máximo y céntrate en un área con franjas de color. Pulsa el botón [search]. Los planos de color rojo y azul se reescalan para alinearse mejor con el plano verde, y los factores usados se colocan en el cuadro de diálogo. Puede que puedas mejorar el resultado revisando los factores directamente en el diálogo: cambia los factores mientras observas las franjas de color en la imagen. - Esta función será menos efectiva si la imagen se ha recortado de modo que el centro de la imagen ya no coincida con el centro de la fotografía original. - - TOPIC: MENÚ DE REFINAMIENTO - - TOPIC: APLANAR HISTOGRAMA +image: flatten1.jpg +image: flatten2.jpg - Aumenta el detalle visible en áreas con poco contraste. El brillo del píxel se ajusta hacia arriba o hacia abajo para hacer más uniforme la distribución de brillo (histograma) del área alrededor del píxel. Un radio más pequeño (área más pequeña) intensificará el efecto. Hay 5 zonas de brillo desde la más oscura (1) hasta la más brillante (5). Mueve un control deslizante para aumentar el efecto en la zona correspondiente. Usa el control deslizante de zona A para mover los 5 controles deslizantes juntos y fijar rápidamente un resultado inicial. Luego usa los demás controles deslizantes individualmente para ajustar finamente la imagen. - - TOPIC: CONTRASTE LOCAL +image: localcon1.jpg +image: localcon2.jpg - Aumenta el contraste en cada área de una imagen. El brillo de cada píxel se compara con el brillo medio del área circundante. El brillo del píxel se ajusta para aumentar esta diferencia. Esta función implementa un método muy usado y descrito en libros de texto. Radio determina el tamaño del área alrededor de cada píxel que se usa para el brillo medio. Potencia determina la cantidad de cambio de brillo. Color se usa para aumentar la saturación del color. Puedes usar la curva editable para aclarar la imagen de salida en niveles de brillo seleccionados. El ejemplo muestra el aclarado de las áreas más oscuras de la imagen. - Contraste local puede crear "halos" en algunas circunstancias: +image: localcon3.jpg - La imagen original está a la izquierda. A la imagen del medio se le aplicó Contraste local a máxima potencia. Se puede ver un halo a lo largo del límite entre las colinas oscuras y el cielo más claro. Esto se puede corregir con un truco sencillo (imagen derecha). Selecciona las áreas de cielo por separado, usando {SELECCIONAR ÁREA}. Aplica Contraste local a esta área. Invierte la selección y aplica Contraste local al resto de la imagen. - - TOPIC: AMPLIFICAR CONTRASTE +image: amplify-contrast.png +image: amplify-contrast2.jpg - Aumenta el rango de brillo aparente de una imagen aumentando el contraste local. Puede aumentar las áreas de bajo contraste sin cambiar las áreas de alto contraste. También puedes usar la curva de edición para variar la amplificación de contraste según la cantidad inicial de contraste. - El control deslizante Amplificar debajo de la curva regula el cálculo, desde ninguna amplificación de contraste hasta amplificación completa. Si se mueve demasiado a la derecha, la imagen puede mostrar artefactos desagradables, así que retrocédelo hasta que desaparezcan. Si las áreas uniformes (p. ej. el cielo) se vuelven moteadas, baja el extremo izquierdo de la curva para reducir la amplificación en áreas de bajo contraste. En algunos casos será mejor seleccionar diferentes áreas de la imagen y procesarlas por separado, p. ej. conservador para el cielo, más agresivo para superficies con textura como paredes de piedra. - - TOPIC: RETINEX GLOBAL +image: global-retx.png +image: global-retx2.jpg - Mejora el color y el contraste en imágenes con niebla/bruma extrema o tinte de color (p. ej. una foto de 100 años). Prueba primero el botón [Auto]. Se busca en la imagen para encontrar los colores RGB más claros y más oscuros presentes. Los valores RGB más oscuros se restan de todos los píxeles y los valores RGB resultantes se escalan hacia arriba para que los valores RGB máximos estén cerca de 255. Por supuesto, esto puede no ser inicialmente óptimo. Los botones giratorios se fijan en los límites RGB oscuro y blanco encontrados, y puedes cambiarlos para optimizar la imagen resultante. Puedes elegir tus propios puntos oscuro y claro seleccionando la opción correspondiente en el diálogo y haciendo clic en la imagen. Los botones giratorios multiplicador se fijan en 1.0 por defecto, y puedes cambiar estos valores para ajustar el brillo relativo de cada color RGB. En el ejemplo anterior, la primera imagen es la original, la segunda imagen se hizo usando el botón [Auto]. La columna de botones giratorios más a la derecha ajustará todos los botones de la misma fila juntos - usa la rueda del ratón o las teclas de flecha arriba/abajo del teclado. - El control deslizante de mezcla se usa para mezclar la imagen de entrada y la imagen retinex en cualquier proporción. El control deslizante reducir brillo se usa para atenuar el efecto en las áreas más brillantes de la imagen, especialmente el cielo, donde Retinex puede producir resultados de aspecto extraño. - El algoritmo se derivó de conceptos publicados por primera vez por Edwin Land en los años 70. Busca en internet "retinex" para más información. - - TOPIC: RETINEX LOCAL +image: local-retx.png +image: local-retx2.jpg - Aumenta los detalles visibles en áreas oscuras de la imagen y otras áreas con bajo contraste. El rango de brillo de una zona alrededor de cada píxel se usa para reescalar el brillo del píxel como si toda la zona se reescalara para cubrir todo el rango de brillo 0-255. Retinex local puede producir resultados dramáticos donde Retinex global es débil. - La entrada de radio determina el tamaño aproximado de la zona alrededor de cada píxel. El control deslizante de mezcla se usa para mezclar la imagen de entrada y la imagen retinex en cualquier proporción. El control deslizante reducir brillo se usa para atenuar el efecto en las áreas más brillantes de la imagen, especialmente el cielo, donde Retinex puede producir resultados extraños. El control deslizante reducir oscuridad hace lo mismo para las áreas más oscuras de la imagen. El ejemplo anterior es aproximadamente 60% imagen original + 40% retinex. - - TOPIC: SATURACIÓN +image: saturation.png - Ajusta la saturación del color según el brillo del píxel. El eje Y de la curva de edición es la saturación del color, desde ningún color (todos los valores RGB iguales) hasta el color máximo (el valor RGB más bajo es cero). El eje X de la curva es el brillo del píxel, de oscuro a brillo máximo. La posición neutra (sin cambio de color) es el valor intermedio, que también es el valor inicial. Ejemplo: para aumentar la intensidad del color de las áreas oscuras de la imagen, sube el extremo izquierdo de la curva. El control deslizante Saturación mueve toda la curva hacia arriba o hacia abajo sin cambiar su forma. - - TOPIC: ENFOQUE SUAVE +image: soft-focus2.jpg +image: soft-focus.png - Aplica el efecto clásico de "enfoque suave" a una foto. Esto es una mezcla de una imagen nítida y una imagen ligeramente desenfocada. El ajuste de radio determina el alcance del desenfoque (extensión en píxeles), y el ajuste de mezcla fija la proporción de la imagen desenfocada en la imagen de salida mezclada, del 0 al 100 por ciento. Puedes usar {PINTAR EDICIONES} con esta función, para variar el efecto en diferentes áreas de la imagen. - - TOPIC: RAMPA DE BRILLO +image: brite-ramp1.png +image: brite-ramp2.png - Varía el brillo o el color a través de una imagen. Puedes usar esto para compensar una iluminación desigual o un tinte de color que varía a través de la imagen. La dirección del cambio se determina dibujando una línea sobre la imagen. Crea la línea haciendo clic en la imagen, luego arrastra cualquiera de los extremos para fijar la dirección deseada. En el ejemplo anterior, se aumentó el verde en la dirección de la línea. Edita primero la curva Todo para ajustar el brillo general (todos los colores), luego ajusta las curvas de color RGB individuales si es necesario. - - TOPIC: VIÑETA +image: vignette.png +image: vignette2.jpg - Corrige el oscurecimiento que a veces se ve en las esquinas de una foto. También se puede usar para resaltar o colorear un objeto o área dentro de una imagen. - Haz clic o arrastra el ratón sobre la imagen para cambiar el centro de la viñeta, que inicialmente está en el centro de la imagen. - Selecciona "Brillo" para cambiar el brillo de la imagen en un patrón radial: ajusta el extremo izquierdo o derecho de la curva para cambiar el brillo del centro y los bordes de la imagen respectivamente. Puedes dar un entorno oscuro a la cara de un retrato, o puedes corregir una imagen con las esquinas oscurecidas. El nivel medio de la curva corresponde a ningún cambio. Usa valores más bajos para oscurecer y valores más altos para aclarar. El ejemplo anterior oscurece gradualmente la periferia de la imagen dejando sin cambios una amplia área central. - Selecciona "Color" para añadir un color elegido a la imagen en un patrón radial. Los valores de curva de cero representan ningún cambio, y valores más altos añaden el color elegido a la imagen. El valor más alto corresponde al 100% de color. Usa esta función para añadir un entorno de color a una imagen, p. ej. rodear una cara con un color gradualmente creciente. - - TOPIC: MENÚ DE EFECTOS - - TOPIC: CONTORNOS +image: outlines1.png +image: outlines2.jpg - Transforma una foto en un dibujo de contornos. Los píxeles de alto contraste se intensifican y los de bajo contraste se suprimen. El ajuste de umbral fija los umbrales de contraste. Las líneas por debajo del mínimo no se muestran, y las superiores al máximo tendrán el brillo máximo. La casilla "blanco/negro" convierte las líneas de color en negro sobre blanco o blanco sobre negro, según la casilla "negativo". Usa "Amplificación baja" para aclarar líneas desvanecidas si lo deseas. "Modo B" produce un brillo de línea más uniforme comparado con "Modo A". - - TOPIC: BOCETO1 +image: sketch1.jpg - Transforma una foto en algo parecido a un boceto. Los píxeles oscuros se agregan en menos píxeles, dejando más brillantes las áreas vaciadas. El contraste también se puede usar como sustituto de los píxeles oscuros. El umbral se puede usar para filtrar la imagen de entrada por brillo. El nivel de recorte se usa para filtrar la salida y reducir aún más los píxeles oscuros aislados o marginales. Elige colores para el primer plano y el fondo. Reducir el tamaño de la imagen de entrada puede dar resultados interesantes. Si el resultado se ve "sucio", usa {REDUCIR RUIDO} o {FUSIÓN} para suavizar la imagen antes de procesarla aquí. - - TOPIC: BOCETO2 +image: sketch2.png +image: sketch2b.jpg - Transforma una foto en algo parecido a un boceto. Usa un método diferente: los píxeles de contraste bajo ... alto se convierten en píxeles claros ... oscuros respectivamente. La curva se puede usar para aumentar o disminuir la potencia de la conversión de contraste. La escala del eje X es el contraste del píxel, de bajo a alto, y el valor Y determina la fuerza de la conversión. El ejemplo muestra la supresión de los píxeles de bajo contraste (aclarados). La imagen de entrada se puede mezclar en cualquier proporción. Si el resultado se ve "sucio", usa {REDUCIR RUIDO} o {FUSIÓN} para suavizar la imagen antes de procesarla aquí. - - TOPIC: CARICATURA +image: cartoon.jpg - Transforma una foto en un dibujo tipo caricatura. Se dibujan líneas negras sobre los bordes de las formas de la imagen, dondequiera que el brillo o el color cambien abruptamente. Umbral de línea fija la sensibilidad para la detección de bordes y el dibujo de líneas, causando que se dibujen menos o más líneas. Ancho de línea hace las líneas más gruesas o más finas. Profundidad de Kuwahara controla una función de enfoque que puede reforzar los bordes de las formas dentro de la imagen. - - TOPIC: RELIEVE +image: emboss2.jpg +image: emboss.png - Transforma una imagen en un relieve simulado o imagen en relieve (un efecto 3D). Los bordes de las formas se hacen más brillantes en un lado y más oscuros en el opuesto, como si estuvieran elevados e iluminados desde el lateral. El ajuste de radio determina el ancho del efecto, y el ajuste de profundidad determina la intensidad. El ajuste Fuente de luz determina el ángulo desde el cual parece venir la iluminación. Esto se puede variar para maximizar el efecto en los bordes de formas más perpendiculares a este ángulo. - - TOPIC: MOSAICOS1 Transforma una imagen en una matriz de mosaicos monocolor. Puedes controlar el tamaño del mosaico y el grosor del espacio entre mosaicos. Esto también se llama "pixelar". Usa Seleccionar área para confinar la transformación a un área limitada, p. ej. una cara. - - TOPIC: MOSAICOS2 +image: tiles2a.png +image: tiles2b.png - Transforma una imagen en mosaicos irregulares que se ajustan aproximadamente a los colores y contornos de la imagen. ^tamaño base:^ El tamaño base del mosaico, que es el tamaño de mosaico unitario usado para hacer mosaicos más grandes. ^profundidad de color:^ Número de colores a usar: 1 = 8 colores, 2 = 64 colores ... 8 = 16 millones de colores. ^objetivo del área de mosaico^: El límite superior del tamaño del mosaico (área en píxeles). ^igualación de color requerida^: Fija la igualación de color mínima requerida para que un área más pequeña se consolide en un área adyacente más grande: 0 = sin importancia (consolidación máxima), 100 = se requiere igualación perfecta (consolidación mínima). - - TOPIC: PINTURA +image: painting1.png +image: painting2.png - Transforma una imagen en algo similar a una pintura. Reduce el número de colores, mapea cada área de píxeles contigua que tenga el mismo color, y luego consolida las áreas más pequeñas en áreas adyacentes más grandes con la mejor igualación de color. - ^radio de desenfoque^: Desenfoca la imagen antes de procesarla. Esto produce límites más suaves. ^profundidad de color^: Número de colores a usar: 1 = 8 colores, 2 = 64 colores ... 8 = 16 millones de colores. ^objetivo del área del parche^: Fija un límite inferior para las áreas que tendrán su propio color: las áreas más pequeñas que este número de píxeles se absorberán en un área adyacente con la igualación de color más cercana. ^igualación de color requerida^: Fija la igualación de color mínima requerida para que un área más pequeña se consolide en un área adyacente más grande: 0 = sin importancia (consolidación máxima), 100 = se requiere igualación perfecta (consolidación mínima). ^bordes^: Determina si las áreas coloreadas se delinearán con un borde negro fino, como mosaicos irregulares en un mosaico. Después de usar esta función, usar {RELIEVE} puede añadir una textura interesante a la imagen. - - TOPIC: TEXTURA +image: texture2.jpg +image: texture.png - Añade una superficie con textura a una imagen o a áreas seleccionadas dentro de una imagen. Radio determina el tamaño del patrón de textura. Fuerza determina la intensidad del patrón, desde casi invisible hasta dominante. - - TOPIC: FUSIÓN +image: fusion.png +image: fusion2.jpg - Suprime pequeños detalles de bajo contraste en una imagen mientras conserva la nitidez de las formas más grandes de la imagen. Pulsa [iniciar] y observa la imagen de cerca. El proceso se ejecuta continuamente hasta que se detiene con el botón [detener]. Los detalles pequeños se desvanecerán lentamente. La etiqueta "recuento" del cuadro de diálogo muestra el número de iteraciones. Puedes [detener] el proceso para inspeccionar la imagen y luego reanudar el procesamiento con [iniciar]. Usa el botón Deshacer/Rehacer para comparar el estado de la imagen antes/después. Reanuda el procesamiento con [iniciar]. El botón [paso] se puede usar para procesar un paso a la vez. - - TOPIC: IGUALAR COLORES +image: match-colors.png - Iguala los colores de una imagen con los de otra. Se toma una muestra de un pequeño punto, seleccionado con un clic del ratón, de cada imagen. El punto de la segunda imagen se hará tener el mismo color medio (valores RGB) que el punto de la primera imagen. Los factores usados para igualar los valores RGB se aplican luego a todos los píxeles de la segunda imagen. Un uso común es eliminar un tinte de color de una imagen marcando un punto en la imagen que coincidirá con un color de otra imagen. - Procedimiento: el diálogo enumera 5 pasos a seguir en secuencia. • Fija un radio para el área de muestra del punto. El círculo del ratón resultante es el área del punto que se muestreará. • Abre la primera imagen pulsando el botón [open]. • Haz clic en la imagen para tomar una muestra de color. • Abre la segunda imagen pulsando el botón [open]. • Haz clic en la imagen en el punto que quieres que coincida con la primera imagen. Los colores de la imagen cambiarán en uno o dos segundos. - - TOPIC: PATRÓN +image: pattern2.jpg +image: pattern1.png - Añade un patrón de fondo a una imagen. Se usa un pequeño archivo de imagen (archivo de patrón) para cubrir la imagen actual duplicando el archivo, como una pared de azulejos. Este archivo puede ser un patrón real (p. ej. una imagen de tela de lienzo, una pared de ladrillos, una geometría repetitiva ...), o cualquier otro tipo de imagen. El patrón se hace semitransparente, de modo que la imagen base parezca estar impresa sobre el patrón, o el patrón sobre la imagen. Se pueden encontrar muchos archivos de patrón buscando en la web "pattern image". Descarga algunos de estos y recórtalos si es necesario a un tamaño de alrededor de 200-500 píxeles. Por comodidad, añade estos a los archivos de patrón proporcionados en ~/.fotocx/patterns. - Usa el botón [Explorar] para seleccionar un archivo de patrón. El patrón seleccionado se repetirá en mosaico para cubrir la imagen base. El patrón es parcialmente transparente para que se vea la imagen base a través. Usa Zoom para agrandar o reducir el tamaño del patrón. Hay dos métodos para mezclar el patrón con la imagen base. La opacidad del patrón se puede fijar del 0 al 100%. La imagen base se usa para rellenar la opacidad no usada. Contraste se usa para modificar el brillo de la imagen base usando el brillo del patrón como plantilla. Los dos parámetros se pueden mezclar en cualquier proporción. - Si el archivo de patrón contiene una imagen que se repite a intervalos fijos tanto horizontal como verticalmente, el botón [Calcular] se puede usar para fijar el ancho y el alto y hacer un patrón continuo sin costuras visibles. - Si el patrón es irregular y las costuras son evidentes, es posible que puedas mejorar esto. Los dos valores de Superposición determinan cuánto se superponen los patrones duplicados en los bordes, horizontal y verticalmente. Añade algo de superposición para enmascarar los efectos de borde. - Seleccionar área se puede usar para aplicar un patrón a parte de una imagen, o diferentes patrones a diferentes partes. Después de aplicar un patrón a una imagen, puede ser interesante usar {RELIEVE} para añadir un efecto 3D al patrón. - La casilla "Escala de grises" convertirá un patrón de color a escala de grises. - - TOPIC: ENTRECRUZADO +image: crosshatch2.jpg +image: crosshatch1.png - Convierte una imagen en un dibujo usando líneas paralelas entrecruzadas. Introduce un tamaño de cuadrícula y pulsa [aplicar]. - - TOPIC: TRAMADO +image: dither1.png - +image: dither2.jpg - Esta función ofrece varias formas de tramar una imagen - convertirla en puntos. 0 - puntos coloreados al estilo de Roy Lichtenstein 1 - R/G/B puro o blanco/negro con distribución espacial aleatoria u optimizada 2 - mezcla RGB usando una profundidad de bits dada 3 - tramado clásico usando una paleta de color personalizada 4 - condensar la imagen en manchas con el color medio de los píxeles condensados - Los tramados clásicos usan el método Floyd-Steinberg de compensación de errores de color: la discrepancia entre un color de la imagen de entrada y el color más cercano de la paleta. Se mezclan puntos de colores cercanos según sea necesario para que el promedio en un área coincida más estrechamente con el color de entrada. La compensación de errores se puede desactivar si se desea, para obtener bandas o contornos de color diferenciados. - Manchas: los píxeles de la imagen sufren una especie de "colapso gravitacional", convergiendo en grumos alrededor de centros locales de masa. "Masa" se define como el brillo del píxel. El control "radio" define aproximadamente el rango de atracción. Pulsa [iniciar] para empezar el colapso. Observa cómo la imagen se transforma lentamente en manchas de un tamaño aproximado al de la entrada "radio". Cuando las manchas queden bonitas y redondas y cambien muy poco, pulsa [detener] para terminar el proceso. - - TOPIC: GRABADO +image: engrave.png +image: engrave2.png - Convierte una imagen en líneas en blanco y negro. La entrada Tamaño determina el grosor de línea y cuántos píxeles verticales de la imagen se usan para cada columna de píxeles verticales en las líneas de salida. Las columnas de píxeles de línea se dividen en partes blancas y negras con su proporción ajustándose aproximadamente al brillo medio de los píxeles de entrada. La entrada Sesgo se puede usar para optimizar el brillo general. Los valores negativos/positivos hacen la imagen más oscura/más clara. La entrada Color (0-100%) se puede usar para añadir color a las partes blancas. - - TOPIC: AÑADIR DESTELLO +image: addglare.png +image: addglare2.jpg - Añade destello irradiando desde puntos brillantes de una imagen. Potencia: determina el brillo relativo del destello Límite: umbral de brillo de píxel para emitir destello Rango: rango de píxeles del destello desde los píxeles emisores Los píxeles con brillo por encima del límite (200-255) emitirán destello. Brillo aquí significa el brillo del color RGB más brillante en un píxel. El destello emitido tiene el color del píxel emisor. Rango está en unidades de píxeles. El destello será máximo en el píxel emisor y disminuirá hasta cero en el límite del rango. - - TOPIC: MOSAICO +image: mosaic1.png +image: mosaic2.jpg - Crea una imagen de mosaico usando mosaicos hechos a partir de todas tus imágenes. - Especifica el tamaño del mosaico en píxeles (p. ej. 36 x 24) y pulsa [Mosaicos]. Se crearán mosaicos a partir de todas tus imágenes (en realidad se usan las imágenes en miniatura, por rapidez). Si cambias las dimensiones del mosaico, pulsa [Mosaicos] de nuevo para regenerarlos. Después de crear los mosaicos, pulsa [Imagen] para convertir la imagen actual en un mosaico usando estos mosaicos. Los mosaicos se eligen igualando el color medio del mosaico con el color medio de la imagen en la posición del mosaico. Si hay miles de imágenes disponibles y si el rango de colores es lo bastante bueno, el mosaico saldrá bastante bien. Amplía el zoom en cualquier parte de la imagen para ver las imágenes de los mosaicos. - El control deslizante Mezcla de mosaicos hará que la imagen se mezcle con los mosaicos, haciendo que se vea mejor si los mosaicos tienen una mala coincidencia de color. Si la mezcla es inferior a aproximadamente el 50%, los mosaicos permanecen casi tan claros como antes, porque el ojo compensa el falso tinte. - Después de crear un mosaico, puedes hacer clic en cualquier mosaico para obtener una imagen emergente más grande. Si se abre un mosaico guardado, hacer clic en los mosaicos para obtener una imagen más grande no funcionará. Regenerar el mosaico es bastante rápido, así que hazlo si quieres que las imágenes emergentes funcionen. - - TOPIC: AÑADIR RUIDO +image: add-noise.png - Añade ruido de color aleatorio a una imagen. Fija un tamaño de mancha objetivo de 1 a 10 y un nivel de ruido del 0 al 100%. Al 100%, se añade ruido aleatorio en el rango de -127 a +127 a cada valor RGB de cada píxel. El valor medio es cero. Los desbordamientos fuera del rango 0-255 se truncan. El color medio en un área grande se conserva, con el ruido superpuesto. Puedes usar Añadir ruido con Seleccionar área o Pintar ediciones para añadir ruido a áreas seleccionadas. - ^Supresión de "bandas" En áreas de la imagen donde la distribución de brillo se ha "estirado", puede aparecer un "bandeado" visible en áreas de brillo y color casi uniformes. Puedes reducir este problema añadiendo ruido (o desenfoque) a las áreas afectadas. - - TOPIC: ESTABLECER COLORES +image: set-colors1.jpg +image: set-colors2.jpg - Puedes reducir el número de colores usados en la imagen para crear un efecto de póster. Fija cada color RGB por separado, o ajusta el recuento total de colores. La profundidad de bits de color no se usa para esto. Algunas funciones de Fotocx usan profundidad de bits, limitando los colores disponibles a 2, 4, 8 ... para cada color RGB. Esta función no está limitada en este aspecto. El ejemplo anterior usa 8 rojos, 5 verdes y 3 azules. - - TOPIC: DESPLAZAR COLORES +image: shift-colors.png - Esta función se puede usar para corregir colores o convertir una imagen en colores falsos. Elige cualquiera de los tres colores RGB y mueve el control deslizante a la izquierda o a la derecha desde el centro. Uno de los otros dos colores se sustituirá de forma graduada. Por ejemplo, puedes sustituir gradualmente verde o azul por el color rojo. El control deslizante Todo desplaza todos los colores juntos. Haz esto primero para encontrar un óptimo inicial, luego desplaza los colores RGB individualmente. - - TOPIC: COLORES ALIENÍGENAS +image: alien-colors2.jpg +image: alien-colors1.png - Repinta una imagen o área seleccionada con colores alienígenas aleatorios. Puedes controlar el tamaño aproximado del patrón y la intensidad (desde apenas visible hasta dominante). Pulsa [Aplicar] para obtener una nueva distribución de color. - - TOPIC: KERNEL PERSONALIZADO +image: custom-kernel.png - Aplica un kernel de convolución personalizado a una imagen. La tecnología subyacente se explica en Wikipedia. Introduce un tamaño de kernel, un factor multiplicador, un factor de suma, y rellena los valores de la tabla. [Aplicar] aplica el kernel a la imagen. [Restablecer] restaura el estado original de la imagen. Los valores se pueden guardar en un archivo y recuperar más tarde usando los botones [Guardar] y [Cargar]. Hay varios archivos de ejemplo de kernel disponibles inicialmente. Puedes modificarlos y guardarlos con un nombre personalizado. - Matemática: los valores de brillo de cada bloque de N por N píxeles en la imagen se multiplican por los valores correspondientes en la matriz del kernel y se suman. Este número se multiplica por el factor multiplicador, y se le suma el factor de suma. Este valor final se convierte en el nuevo nivel de brillo para el píxel de la imagen en el centro del bloque N x N. - - TOPIC: MENÚ DE DEFORMACIÓN - - TOPIC: ENDEREZAR CURVATURA +image: unbend1.png +image: unbend2.jpg - Las panorámicas de sujetos cercanos (normalmente edificios o habitaciones interiores) pueden mostrar líneas rectas que aparecen curvadas, o edificios inclinados. Deformar las imágenes fue necesario en el proceso de panorámica para que las imágenes encajaran entre sí. La función Enderezar curvatura se puede usar después para enderezar la imagen panorámica si es necesario. Se dibujan líneas punteadas verticales y horizontales sobre la imagen, mostrando los ejes de enderezado. Haz clic o arrastra el ratón cerca del extremo de una línea para moverla. Si se cambian los valores en los cuatro controles de entrada, la imagen se deforma de la manera indicada por las cuatro imágenes correspondientes. Aumenta o disminuye los valores y repite hasta quedar satisfecho. Mueve los ejes para cambiar los centros de deformación. - Consulta también {DEFORMAR IMAGEN} para otro método de corregir la curvatura y la perspectiva de la imagen. - - TOPIC: PERSPECTIVA +image: perspective2.jpg +image: perspective1.png - Esta función se puede usar para enderezar una foto tomada desde un ángulo desplazado. La imagen de la izquierda es la foto original, tomada desde la derecha del centro para evitar reflejos. La imagen de la derecha es la versión enderezada. Esta función también se puede usar para enderezar un edificio alto fotografiado desde el nivel de la calle o desde el lateral. - Haz clic en las cuatro esquinas del tetraedro que quieres convertir en un rectángulo (en el caso anterior, las cuatro esquinas del cuadro o marco), luego selecciona [Aplicar]. Las esquinas pulsadas se marcan con pequeños cuadros blancos que contienen "A, B, C, D". La esquina superior izquierda de cada cuadro marca con precisión la posición de la imagen. Hacer clic cerca de un cuadro lo moverá a la nueva posición. Puedes usar las teclas de flecha del teclado para mover los marcadores de esquina en pasos de 1 píxel. Las teclas de flecha actúan sobre la última esquina pulsada o movida. - - TOPIC: DEFORMAR IMAGEN +image: warps4.jpg - - TOPIC: DEFORMAR ÁREA Esta función se puede usar para hacer distorsiones dentro de una imagen. Puedes seleccionar un área de la imagen y arrastrar el ratón para estirar esta área con respecto al resto de la imagen. La imagen es como goma. Si el arrastre del ratón comienza dentro del área seleccionada, entonces el área se deforma dentro de sus límites actuales - el movimiento es máximo en el puntero del ratón y disminuye a cero en los bordes del área. Si el arrastre del ratón comienza fuera del área seleccionada, los bordes del área cercanos al ratón se pueden estirar más allá del límite original del área. Se pueden combinar muchos arrastres del ratón de diferentes longitudes y direcciones para lograr los resultados deseados. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - Esta función es útil para corregir problemas de perspectiva. Arrastra la imagen desde cerca de una esquina, usando el ratón. La imagen se estira elásticamente desde esta esquina mientras las otras esquinas permanecen fijas. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - Esta función es útil para corregir problemas de perspectiva. Arrastra la imagen desde el interior, usando el ratón. El interior de la imagen se estira elásticamente mientras los bordes permanecen fijos. - - TOPIC: DEFORMACIÓN CURVA Esta función es útil para corregir problemas de perspectiva (consulta también {ENDEREZAR CURVATURA}). Arrastra la imagen desde cualquier posición, usando el ratón. Toda la imagen se estirará o empujará en la dirección del ratón, pero las áreas cercanas al ratón se mueven más que las áreas más distantes. Puedes enderezar líneas curvas o curvar la imagen deliberadamente. El control "extensión de deformación" determina el radio de deformación alrededor del ratón. 1.0 significa que se deforma toda la imagen, y valores más pequeños confinan la deformación a áreas más pequeñas alrededor del ratón. - - TOPIC: DEFORMACIÓN AFÍN Esta función se puede usar para deformar una imagen de formas interesantes. Arrastra la imagen desde una esquina o borde usando el ratón. Los cambios son puramente lineales, así que las líneas rectas permanecen rectas. Esta transformación se llama "afín". Se pueden encontrar detalles con una búsqueda en la web. - - TOPIC: DEFORMACIÓN RADIAL +image: warp_radial.png - Añade o elimina distorsión de barril o de cojín. La distorsión de barril se ve a menudo en imágenes RAW que no se han procesado para eliminar esta distorsión. Haz clic izquierdo para elegir un punto central donde se centrarán los cambios - normalmente el centro de la imagen. Este es el valor predeterminado. Mueve el control deslizante "estirar" para curvar la imagen. - - TOPIC: DESDEFORMAR PRIMER PLANO +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - Las fotos de caras en primer plano a menudo están distorsionadas, porque las áreas más cercanas a la cámara son más grandes en la foto que las áreas más lejanas. Esta función se puede usar para revertir la distorsión. Usa {SELECCIONAR ÁREA} para seleccionar primero la cara (no necesita ser precisa). Haz clic en la imagen cerca del centro de la distorsión (ejemplo anterior: mejilla derecha). Mueve el control deslizante para optimizar. - - TOPIC: CREAR OLAS +image: make-waves2.jpg +image: make-waves1.png - Esta función distorsiona una imagen en un patrón de olas, como si se viera a través de agua turbulenta. El diálogo te permite cambiar la longitud de onda, amplitud y varianza media horizontal y vertical. La entrada "perspectiva" permite que las longitudes de onda se alarguen gradualmente de arriba a abajo. - - TOPIC: TORSIÓN +image: twist1.png +image: twist2.png - Esta función tuerce la imagen alrededor de un punto elegido con un clic o arrastre del ratón. Haz clic en la posición deseada y mueve el control deslizante Torsión la cantidad deseada. También puedes arrastrar el ratón alrededor de la imagen para cambiar el centro de la torsión. El control deslizante Centro destuerce el área central en relación con el resto. El control deslizante Ángulo rota la imagen. - - TOPIC: ESFERA +image: sphere2.jpg +image: sphere.png - Crea una proyección esférica de una imagen. Arrastra el ratón sobre la imagen para cambiar el centro de la proyección (por defecto, el punto medio). El control aplanar modifica la proyección gradualmente desde una esfera (derecha) hasta una imagen plana (izquierda). El control deslizante ampliar amplía la imagen resultante hasta 2x. - - TOPIC: INVERSO +image: inside-out2.jpg +image: inside-out1.png - Esta función invierte las distancias centro-borde de cada píxel. Puedes hacer clic o arrastrar el ratón para variar el punto central. - - TOPIC: PLANETA DIMINUTO +image: tiny-planet.jpg - Envuelve una imagen alrededor de un círculo. Si la imagen es una panorámica de 360 grados, no habrá costura visible. • Agujero central: la imagen se envuelve alrededor de un agujero central. • Cortar arriba: elimina un margen superior de la imagen de entrada. • Cortar abajo: elimina un margen inferior de la imagen de entrada. • Invertir R: refleja verticalmente la imagen de entrada. • Invertir Theta: refleja horizontalmente la imagen de entrada. • Rotar: gira la imagen de salida alrededor del centro. - - TOPIC: ESPIRAL DE ESCHER +image: escher-spiral.png +image: escher-spiralA.png - Transforma una imagen en una espiral infinita hacia el interior como el famoso reloj de M.C. Escher. Ancho determina el ancho inicial de la capa más externa. Borde determina el ancho inicial del borde que separa las capas, y Color determina su color. El centro predeterminado es el centro de la imagen. Haz clic en la imagen para fijar un nuevo centro. - - TOPIC: APLANAR FOTO +image: flatten-photo1.png +image: flatten-photo2.jpg - ^Página de libro u otra superficie curva Aplana una foto de una imagen sobre una superficie curva, p. ej. alrededor de una columna, o una página de un libro grueso abierto, donde las páginas se curvan hacia dentro en la encuadernación central. La curvatura de los bordes superior e inferior de la superficie proporciona información sobre la cantidad de curvatura y la cantidad de estiramiento necesario para que parezca plana. El ejemplo anterior es un libro grueso. Se pueden corregir otras superficies redondeadas, p. ej. un cartel en una columna redonda. - Selecciona la opción de trazado superior para trazar el borde superior de la página curva. Haz clic con el ratón a lo largo del borde, creando un punto marcador en cada punto pulsado. Después de tener 4 puntos disponibles, se dibuja una línea curva a través de los puntos. Añade más puntos y arrastra los puntos según sea necesario para que la línea se ajuste bien a la curva de la imagen. Selecciona la opción de trazado inferior y traza el borde inferior de la misma manera. Cuando ambos estén hechos, pulsa [flatten] para aplanar la página. Los bordes ahora deberían estar rectos (o lo bastante rectos). Usa el control deslizante [stretch] para estirar los lados de la imagen según sea necesario, para compensar la compresión lateral causada por la curvatura. Usa el control Ensanchar para ensanchar la imagen según sea necesario y restaurar la relación ancho/alto correcta. El botón [undo] restaura la imagen sin modificar, conservando los puntos marcadores, que luego se pueden ajustar para un nuevo intento. - +image: flatten-photo3.jpg - ^Horizonte curvo Una panorámica amplia, o una foto de un objetivo gran angular, puede tener un horizonte que no está recto u horizontal. La imagen se puede enderezar (o mover de otra manera) trazando una curva a través del horizonte u otras áreas que necesiten alinearse a lo largo de una línea recta. Selecciona la opción de trazado superior o inferior, según si el horizonte (u otra parte de la imagen) se encuentra principalmente por encima o por debajo de la mitad de la imagen. La imagen se deformará para hacer recta esta curva. Una curva es suficiente. La otra curva se añade automáticamente al borde opuesto (superior o inferior) de la imagen. Si el resultado no es satisfactorio, usa el botón [undo], ajusta los marcadores de cualquiera de las curvas, e inténtalo de nuevo. También puedes guardar la imagen y aplicar la función una segunda vez, usando la imagen guardada como punto de partida. - - TOPIC: MENÚ DE COMBINAR Estas son funciones que combinan varios archivos de imagen. En el caso de imágenes superpuestas, las características correspondientes en cada imagen se alinean para coincidir, con precisión de un solo píxel. El tiempo de alineación es típicamente de 10 a 30 segundos por imagen. Si ves que este proceso de alineación va mal, puedes usar la tecla Escape para detener el proceso. - - TOPIC: HDR ^Alto rango dinámico +image: HDR.jpg +image: HDR-adjust.png - Combina (superpone) varias imágenes del mismo sujeto con diferentes niveles de exposición. La imagen combinada puede mostrar una mejor visibilidad de los detalles tanto en las áreas más oscuras como en las más claras, usando en efecto píxeles de las imágenes más claras para las áreas oscuras, y de las imágenes más oscuras para las áreas claras. Si la cámara se ajusta manualmente entre tomas, ten cuidado de mantenerla nivelada y apuntar al mismo punto distante. Se puede tolerar cierta desalineación de las imágenes de entrada. Si personas u objetos se mueven entre tomas, no se puede evitar el efecto fantasma. - Selecciona la función de menú HDR y selecciona hasta 9 imágenes ({SELECCIONAR ARCHIVOS DE IMAGEN}), que deben tener casi las mismas dimensiones en píxeles. Las imágenes se alinean y combinan automáticamente. Al terminar, se muestra la imagen combinada, junto con un diálogo para ajustes. Las contribuciones de las imágenes de entrada se muestran como una serie de curvas editables. La escala horizontal representa el brillo del píxel, de oscuro a claro. Cada curva representa una imagen que contribuye a los píxeles de salida. La contribución de la imagen en un nivel de brillo dado es proporcional a la altura de su curva en ese nivel. La curva inicial para la imagen más clara será alta a la izquierda y baja a la derecha, lo que significa alta contribución a los píxeles oscuros y baja contribución a los píxeles claros. La imagen más oscura será baja a la izquierda y alta a la derecha, y las imágenes restantes quedarán en medio. Las curvas se pueden editar arrastrándolas con el ratón. Las contribuciones de imagen correspondientes cambian en consecuencia, y puedes ver los resultados en tiempo real en la imagen de salida. La imagen de arriba muestra dos imágenes de entrada y su imagen de salida. El diálogo de ejemplo muestra tres curvas ajustadas para optimizar tres imágenes de entrada. - - TOPIC: HDF ^Alta profundidad de campo Combina (superpone) varias fotos del mismo sujeto con diferentes ajustes de enfoque, de cerca a lejos. Diferentes partes del sujeto están enfocadas con nitidez en cada imagen. Combina las imágenes de modo que todas las partes del sujeto queden nítidas. - Hacer las fotos: elige un punto para el centro de la imagen. Apunta la cámara a un objeto cercano y pulsa el botón del obturador hasta la mitad para fijar el enfoque en ese objeto. Mantén el botón en la posición de mitad de recorrido, apunta la cámara al centro elegido, y toma la foto. Ahora elige un objeto más lejano y haz lo mismo. Repite con distancia de enfoque creciente. Es de esperar que cada parte del sujeto esté nítida en al menos una foto. La posición de la cámara debería ser muy similar en todas las fotos, lo cual puede ser un reto si el sujeto está muy cerca. El movimiento de la cámara puede causar problemas de escala y paralaje (objetos cercanos desplazados respecto a objetos distantes). Estos problemas pueden corregirse más tarde en Fotocx, pero puede requerir bastante tiempo. Es mejor evitar los problemas. - +image: HDF-paint.png - Procesar las fotos: elige la función de menú HDF y selecciona hasta 9 imágenes ({SELECCIONAR ARCHIVOS DE IMAGEN}). Las imágenes se alinearán ahora lo mejor posible. La imagen de salida es una mezcla equitativa de las imágenes de entrada alineadas. Se compensa una pequeña cantidad de movimiento de cámara entre las fotos, pero esto es limitado, y los desplazamientos de paralaje no se compensan en absoluto. Cuando la alineación esté completa, se abre un diálogo. Puedes seleccionar cualquier imagen de entrada y "pintarla" con el ratón en cualquier área de la imagen de salida. Esto convierte la mezcla de imagen original en la única imagen seleccionada para el área que se está pintando. Para cada área u objeto de la imagen, elige una imagen de entrada que esté nítida en esa área. El radio del pincel se puede fijar más grande o más pequeño, así que puedes pintar grandes áreas rápidamente y controlar el detalle fino cuando sea necesario. Si tienes objetos cercanos y lejanos superpuestos, se necesitará tiempo y paciencia para que todos queden nítidos. Los desalineamientos se pueden corregir seleccionando la opción de deformación en el diálogo. Las imágenes subyacentes se pueden entonces arrastrar y deformar con el ratón, y la imagen de salida combinada cambia en consecuencia. La deformación se limita al área alrededor del ratón. Cuando se arrastra un área pintada, la imagen de entrada correspondiente se selecciona y arrastra automáticamente, mientras que las áreas pintadas con otras imágenes permanecen fijas. Las áreas que no se han pintado no se pueden arrastrar. Muévete a diferentes áreas y haz arrastres incrementales hasta que todas estén alineadas. - Flujo de trabajo sugerido: usando el modo de pintura, elige cada imagen en secuencia y pinta todas las áreas que se vean nítidas en esa imagen. Cualquier límite que no esté bien alineado se mostrará claramente como desplazamientos en los bordes de las formas de la imagen. Algunos de estos se pueden hacer poco importantes cambiando la imagen usada para pintar (si más de una imagen es lo bastante nítida). Usando el modo de deformación, haz ajustes finos según sea necesario para eliminar los desplazamientos visibles. - - TOPIC: PILA/PINTURA +image: stack-paint.png - +image: stack-paint2.jpg - Apila (superpone) varias fotos del mismo sujeto tomadas en diferentes momentos. Elimina turistas y coches que van y vienen entre tomas. - Hacer las fotos: apunta la cámara al mismo punto distante y toma varias fotos mientras turistas o coches se mueven delante del sujeto. Intenta conseguir dos o más fotos de cada área del sujeto no obstruida por los objetos transitorios. Mantén la cámara firme y apunta al mismo punto, para que las imágenes se alineen con precisión. - Procesar las fotos: elige la función de menú Pila/pintura y selecciona hasta 9 imágenes ({SELECCIONAR ARCHIVOS DE IMAGEN}). Las imágenes se alinearán ahora lo mejor posible. La imagen de salida (abajo a la izquierda) es una mezcla equitativa de las imágenes de entrada alineadas (fila superior). Cuando la alineación esté completa, se inicia el diálogo mostrado arriba. Puedes seleccionar cualquier imagen de entrada y "pintar" con el ratón en cualquier área de la imagen de salida. La única imagen seleccionada se usa para el área que se está pintando. Para cada área de la imagen, elige una imagen de entrada libre de los objetos transitorios. El radio del pincel se puede fijar más grande o más pequeño, así que puedes pintar grandes áreas rápidamente y controlar el detalle fino cuando sea necesario. - Operación automática: pulsa el botón [Ocultar] para ver si los objetos transitorios se pueden eliminar automáticamente. Esto funcionará en las áreas de la imagen donde haya varias fotos disponibles del fondo sin obstruir (imagen inferior del medio). Para mostrar todos los objetos transitorios, pulsa el botón [Mostrar] (imagen inferior derecha). Esto generalmente funciona, pero no perfectamente. Pequeñas desalineaciones de imagen o diferencias de iluminación (especialmente sombras en movimiento) pueden hacer que el algoritmo seleccione píxeles de fondo en lugar de píxeles de primer plano. Puedes usar el método de pintura descrito arriba para corregir los errores manualmente. - - TOPIC: PILA/RUIDO +image: stack-noise2.jpg +image: stack-noise.png - Esta función combina de 2 a 9 fotos del mismo sujeto. Las fotos deberían ser casi iguales, excepto por pequeños desplazamientos causados por sostener la cámara con la mano. Si las fotos se hicieron con un ajuste de ISO muy alto (condiciones de poca luz), los píxeles tendrán un ruido considerable. Al hacer muchas fotos y promediarlas, el ruido se puede eliminar en su mayor parte. - Procesar las fotos: elige la función Pila/ruido y selecciona hasta 9 imágenes ({SELECCIONAR ARCHIVOS DE IMAGEN}). Se combinarán automáticamente y se mostrarán, y se abrirá un diálogo. La imagen de salida inicial es una combinación de todas las imágenes de entrada seleccionadas, promediadas juntas. Esto significa que los valores RGB de cada píxel de salida son el promedio de los valores RGB de los píxeles de entrada correspondientes. El botón mediana cambiará los píxeles de salida a la mediana de los píxeles de entrada (se promedian de 1 a 3 valores RGB centrales, según el número de imágenes). Esto puede ser mejor o no, así que alterna entre ambos para comparar. Las casillas omitir píxel bajo y omitir píxel alto harán que se descarten los valores RGB de entrada más bajos y más altos antes de promediar. Esto puede eliminar picos de ruido de la mezcla. Esto no tiene efecto si se selecciona el método de mediana. - - TOPIC: PILA/CAPAS +image: stack-layers.png - Usa esta función para combinar diferentes versiones editadas de una imagen, donde puedes determinar qué versión se muestra en áreas seleccionadas de la imagen. Se pueden combinar cualquier imágenes que tengan las mismas dimensiones en píxeles. - Selecciona hasta 9 imágenes de tamaño idéntico. La imagen de salida inicial es una mezcla equitativa de todas las imágenes de entrada. Proporciones de imagen son los pesos relativos de las imágenes mezcladas. Estos se pueden ajustar para variar el peso de cada imagen. Ejemplo: si se combinan 3 imágenes con pesos relativos de 3, 5, 7, entonces la imagen combinada es 3/15 de la imagen n.º 1, 5/15 de la n.º 2, y 7/15 de la n.º 3. Si se selecciona la opción "Pintar la imagen completa", los pesos se pueden ajustar y la imagen de salida responde inmediatamente. Si se selecciona la opción "Pintar dentro del ratón", entonces se puede arrastrar el ratón y solo se pinta el área dentro del círculo del ratón, usando las proporciones de imagen actualmente activas. La velocidad de pintura se controla con los ajustes de Potencia para el centro y el borde del ratón. Usa números bajos para pintar gradualmente. - - TOPIC: PANORÁMICA +image: pano-align1.jpg +image: pano-align2.jpg - Esta función une de 2 a 6 imágenes para hacer una imagen de ángulo amplio o panorámica. Las imágenes deben superponerse un 10% o más, para que el programa pueda encontrar dónde coinciden y unirlas. Empieza seleccionando de 2 a 6 archivos de imagen ({SELECCIONAR ARCHIVOS DE IMAGEN}). Es útil seleccionar las imágenes en orden de izquierda a derecha, para facilitar la alineación inicial aproximada. Las imágenes se unen inicialmente y se muestran con una pequeña superposición transparente. Un diálogo de prealineación (arriba) te pide que arrastres las imágenes hasta una alineación aproximada. Arrastra las imágenes hasta el orden correcto de izquierda a derecha. La imagen a arrastrar puede superponerse con otras imágenes. Para que quede claro qué imagen se está arrastrando, arrastra desde cerca del centro de la imagen. Después de que las imágenes estén en el orden correcto, alinea cada imagen con su vecina de la izquierda. Funciona mejor proceder de izquierda a derecha. Mueve una imagen horizontal y verticalmente hasta una alineación aproximada con su vecina de la izquierda, luego rota la imagen si es necesario arrastrando el borde inferior hacia la izquierda o la derecha - la imagen gira alrededor del punto medio de su superposición con la imagen de la izquierda. El método más rápido es alinear primero la región media de superposición, y luego rotar la imagen derecha si es necesario para llevar las regiones de superposición superior e inferior a la alineación. NO se necesita una precisión extrema. Las imágenes deberían estar correctamente curvadas y encajar bien. Si no es así, entonces "lens mm" (distancia focal, equivalente a 35mm) necesita ajuste. La curvatura de la imagen cambia a medida que se ajusta lens mm. El valor inicial se obtiene de la metadata EXIF si está disponible, y esto normalmente es suficiente. Si las imágenes no tienen curvatura (p. ej. imágenes escaneadas), usa la casilla "sin curva" para fijar "lens mm" efectivamente a infinito. - Si alguna de las imágenes se ha recortado, el cálculo que depende de la distancia focal EXIF no funciona. Puede que puedas compensarlo aumentando la distancia focal en "lens_mm". - La casilla "alineación manual" usará la prealineación manual como la alineación final. Esto es para imágenes que no tienen características claras necesarias para alinear las imágenes. Esta opción también permite que las imágenes tengan superposición cero. - Pulsa [proceed] cuando termine la prealineación, y el programa hará la alineación fina y unirá las imágenes. Internamente, las imágenes se desplazan y rotan y se evalúa el grado de coincidencia. Esto se hace con tamaños de imagen crecientes hasta encontrar la mejor alineación. Esto puede necesitar un minuto o más, según la velocidad de la CPU y el tamaño de la imagen. Puedes acelerar mucho el proceso si reduces las imágenes de entrada a 2/3 o 1/2 de su tamaño. Haz esto también si el proceso falla por falta de memoria. - +image: pano-adjust.jpg - Cuando la alineación fina esté completa, se muestra la imagen combinada. Se inicia el diálogo de arriba para ajustes finos de brillo. Puede que veas un borde entre imágenes si no tienen el mismo brillo. Selecciona una imagen usando los botones de opción de arriba. Usa el botón [color automático] repetidamente para mejorar automáticamente la coincidencia de brillo/color de las imágenes. La imagen base es la seleccionada actualmente. Prueba diferentes imágenes base para ver cuál funciona mejor. Si las imágenes están muy desajustadas en brillo, selecciona la más discrepante y usa el control de brillo para cambiar el brillo y que coincida con las demás, seguido de [color automático]. La coincidencia no tiene que ser muy buena, ya que "Ancho de mezcla" (siguiente) enmascarará las diferencias restantes. Usa el botón "Color de archivo" para restablecer los niveles de brillo a partir de los archivos de imagen de entrada. - El control "Ancho de mezcla" gobierna cómo se mezclan las imágenes entre sí: en las superposiciones de imagen, el brillo se cambia a lo largo de esta cantidad de píxeles, para enmascarar desequilibrios que no se pueden corregir completamente. El valor predeterminado es 1 píxel, lo que hace evidente cualquier diferencia de brillo. - Si las imágenes no se alinean perfectamente, puede que puedas mejorar la alineación usando el ratón para empujar las imágenes hasta alinearlas. Selecciona "Deformación con el ratón" y selecciona una de las imágenes con los botones de opción. Luego arrastra el ratón a lo largo del borde de la imagen donde debería alinearse con su vecina, moviendo la imagen hasta la alineación. La imagen se mueve localmente alrededor del ratón mientras las partes más distantes permanecen fijas. Las imágenes con desplazamiento de paralaje requerirán un compromiso, ya que es imposible mantener alineados tanto el primer plano como el fondo. - El control aplanar imagen se puede usar para "enderezar la curvatura" de la imagen, lo que enderezará las líneas curvas (p. ej. edificios curvados). Un valor de cero no tiene efecto y un valor de 1.0 aplanará completamente la imagen. - Cuando termines, usa {ENDEREZAR CURVATURA}, {DEFORMAR IMAGEN}, {RECORTAR} etc. para los ajustes finales. - ^Imágenes escaneadas Las imágenes escaneadas se pueden combinar si hay suficiente superposición. Marca "sin curva" ya que no hay curvatura. - ^Deformación automática Las imágenes se deforman ligeramente en varias direcciones durante la alineación para encontrar la mejor coincidencia. Esto es para compensar cambios en el horizonte de la cámara o rotación, que causan distorsiones de imagen que reducen la calidad del ajuste. Si el área de superposición de dos imágenes incluye un objeto grande que se movió entre las dos fotos, el proceso de alineación puede volverse errático intentando hacer coincidir las imágenes, haciendo la alineación muy deficiente. Al seleccionar "sin deformación automática" puede que consigas que la alineación tenga éxito o tenga un error menor. Otra opción es seleccionar alineación manual. - ^Combinar panorámicas Puedes hacer una panorámica de hasta 6 imágenes en una sola pasada. También puedes combinar panorámicas que encajen entre sí por los lados, p. ej. combinar una panorámica de 4 imágenes con otra panorámica de 4 imágenes para hacer una panorámica de 8 imágenes. Debes detener la curvatura normal de la imagen cuando combinas panorámicas, ya que las imágenes panorámicas ya están curvadas (suponiendo que no hayas usado la opción "aplanar" en el diálogo panorámico final). Detén la curvatura de la imagen marcando la casilla "sin curva" en el diálogo de prealineación. - ^Limitaciones de la panorámica Las panorámicas que incluyen objetos cercanos pueden ser complicadas: al hacer las fotos, ten cuidado de girar la cámara sobre un eje que pase por el objetivo, con el mínimo movimiento lateral, de lo contrario las imágenes pueden alinearse mal porque los objetos en primer plano se desplazan respecto al fondo (paralaje). Esto no es un problema cuando el sujeto está a 50 o más metros de distancia, ya que un pequeño movimiento lateral tiene poco impacto en la imagen. Mantén la cámara nivelada para evitar un gran desplazamiento vertical (desplazamiento del horizonte), que puede causar distorsiones de imagen que quizá no se corrijan del todo. Evita rotar la cámara por la misma razón. - ^Panorámica vertical Esto se puede hacer rotando las imágenes de entrada 90°. En Panorámica, elige las imágenes en orden de arriba a abajo, de modo que la imagen superior quede a la izquierda y la inferior a la derecha. Haz la panorámica normalmente. Rota la imagen de salida para que la izquierda se convierta en la parte superior. - - TOPIC: MOSTRAR ARCHIVOS CIM Muestra los archivos de entrada de la imagen combinada actual o más reciente, en una ventana emergente. Solo se recuerda el conjunto actual o más reciente. - - TOPIC: MASHUP +image: mashup.jpg - Organiza varias imágenes y texto en un diseño. Se pueden añadir, redimensionar, rotar y mover imágenes arrastrándolas con el ratón. Las imágenes se pueden hacer total o parcialmente transparentes en áreas seleccionadas. Se puede añadir, mover, redimensionar y rotar texto. Se pueden especificar atributos de texto: fuente, tamaño, color, contorno, sombra, transparencia. Se pueden añadir líneas y flechas. El ejemplo aquí muestra algunas de las posibilidades. - +image: mashup1.png - En el primer diálogo de Mashup, elige una imagen de fondo o de diseño donde se colocarán otras imágenes. Elige una imagen existente o crea una nueva imagen monocolor con un tamaño y color especificados. También puedes abrir un proyecto mashup guardado previamente y continuar editando. - +image: mashup2.png - El segundo diálogo de Mashup es una elección: editar imágenes, editar texto, editar líneas y flechas, reescalar a un tamaño mayor, guardar la imagen combinada completada (Hecho) o abandonar la imagen (Cancelar). Las tres primeras opciones llevan a diálogos para realizar las ediciones respectivas. Cada una de estas vuelve a este diálogo cuando termina, así que puedes añadir o modificar imágenes, texto, y líneas/flechas en cualquier secuencia. Reescalar se explica abajo. - +image: mashup3.jpg - Usa este diálogo para seleccionar y colocar imágenes en el diseño y revisar su apariencia: tamaño, rotación, posición, transparencia. Una imagen puede ser parcial o totalmente transparente, en general o dentro de áreas especificadas. Esto significa que la imagen de fondo o la imagen superpuesta pueden verse a través de las áreas transparentes. El botón Añadir imagen lleva a un diálogo de selección de archivos de galería ({SELECCIONAR ARCHIVOS DE IMAGEN}). Las imágenes seleccionadas se colocan en el diseño. Después de añadir las imágenes, haz clic en cualquier imagen para seleccionarla para modificaciones. Arrastra la imagen desde el medio para posicionarla en el diseño. Arrastra la esquina inferior derecha para redimensionar la imagen. Usa los controles del diálogo para ajustar la imagen. Los controles del diálogo actúan sobre la última imagen añadida, pulsada o arrastrada. Los botones "Ant" y "Siguiente" recorren las imágenes una a una, resaltando la imagen seleccionada. Esto se puede usar cuando las imágenes superpuestas dificultan seleccionar la imagen deseada haciendo clic en ella. Escala reescala la imagen. Ángulo rota la imagen. Los botones de Orden de apilado suben o bajan una imagen en relación con otras imágenes - esto determina qué imagen superpuesta quedará arriba. Transparencia base se usa para hacer parcialmente transparente una imagen entera. El botón [pintar] se usa para hacer que cualquier parte de una imagen sea parcial o totalmente transparente, usando el diálogo Pintar mostrado abajo. El botón [deformar] se usa para curvar o deformar una imagen, usando el diálogo Deformar mostrado abajo. La casilla "márgenes negros" se puede usar para eliminar los márgenes negros dejados por otras funciones de edición, p. ej. deformar. Estos se harán transparentes. El botón "La imagen está fija" evitará que la imagen se mueva con el ratón o el teclado. Esto es útil cuando las imágenes se están alineando finamente y se debe evitar un movimiento accidental. Los controles de Márgenes se pueden usar para hacer transparentes los bordes de la imagen. Los márgenes Duros cortan los bordes de la imagen. Los márgenes de Mezcla hacen los bordes parcialmente transparentes para mezclarlos con el fondo u otras imágenes superpuestas. - +image: mashup4.png - "Pinta" más o menos transparencia en áreas de imagen seleccionadas. Haz clic en una imagen para seleccionarla. El puntero del ratón es un círculo que muestra el rango de acción. Usa radio para ajustar el tamaño. Arrastra el ratón con el botón izquierdo sobre la imagen para hacerla transparente en las áreas cubiertas por el círculo. Arrastra con el botón derecho para hacerla opaca. Si Gradual está marcado, los cambios de transparencia se hacen lentamente mientras se arrastra el ratón. Especifica un valor de potencia para el centro y los bordes del ratón para regular la velocidad de cambio. - +image: mashup5.png - El diálogo de deformación se usa para deformar una imagen. Haz clic en una imagen para seleccionarla. Arrastra la imagen con el ratón - la imagen se deformará o estirará localmente en la dirección del ratón (como una lámina de goma). El área de deformación viene dada aproximadamente por la extensión de deformación, que es una fracción del tamaño de la imagen. Cada arrastre es un paso que se suma a los pasos anteriores. Los pasos recientes se pueden revertir con [undo last], y la imagen sin deformar se puede restaurar con [undo all]. - +image: mashup6.png - El diálogo Editar texto se usa para colocar texto en el diseño. Introduce algo de texto y pulsa [Aplicar]. Se te pide que hagas clic en el diseño donde se añadirá el texto. Arrástralo hasta su posición, luego usa los controles del diálogo para fijar fuente, tamaño, color, ángulo, color de fondo, tamaño y color de contorno, tamaño y color de sombra, y las transparencias de cada uno de estos. Arrastra el texto a una nueva posición en cualquier momento. Haz clic en cualquier texto existente para mostrar sus propiedades en el diálogo y revisarlas. Haz clic en un texto y pulsa Supr para eliminarlo. Cuando termines de editar, pulsa [OK] para volver al segundo diálogo de Mashup. - +image: mashup7.png - El diálogo Editar línea/flecha se usa para colocar líneas o flechas en el diseño. Funciona de forma muy parecida a añadir texto. Introduce una longitud y un ancho y pulsa [Añadir]. Se te pide que hagas clic en el diseño donde se añadirá la línea. Se coloca una línea en el diseño, o una flecha si se marca una de las opciones de punta de flecha. Arrastra la línea/flecha hasta la posición deseada. Ajusta la longitud, el ancho, el ángulo y los atributos (fondo, contorno, sombra) usando el diálogo. También puedes arrastrar cualquiera de los extremos de la línea/flecha para fijar la posición de ese extremo, dejando el otro extremo fijo. - Puedes usar el ratón para mover y redimensionar objetos en el diseño: • haz clic en el objeto para seleccionarlo - parpadea para confirmar la selección. • arrastra desde aproximadamente el centro para posicionar el objeto. • arrastra la esquina inferior derecha para redimensionar el objeto. • para una línea/flecha, arrastra cualquiera de los extremos para mover solo ese extremo. - Las teclas de flecha del teclado también se pueden usar para mover el objeto actualmente seleccionado en pasos de 1 píxel. - Puedes añadir imágenes guardadas por {SELECCIONAR ÁREA}. En el diálogo Editar imágenes, pulsa [Añadir] para iniciar el diálogo de selección de archivo. Usa el botón [Superior] en la ventana de galería, selecciona "saved_areas". Abre cualquiera de las imágenes .png que encuentres allí. Se usa el contorno de área original, y la mezcla de área funciona a partir de estos bordes. - ^Archivos de proyecto Mashup Puedes guardar un proyecto y abrirlo más tarde para continuar editando. El proyecto Mashup se reconstruye usando estas imágenes y algunos datos guardados en el archivo de proyecto: ubicaciones de imagen y texto, escalas, transparencia, etc. - ^Reescalar Mashup Trabajar con un diseño muy grande (más de 20 megapíxeles) puede ser bastante lento. Arrastrar una imagen de superposición grande puede ser lento y a saltos. Puedes trabajar mucho más rápido si usas un diseño más pequeño para construir el proyecto, y luego lo agrandas cuando termines. No hay pérdida de resolución en la imagen final, ya que las imágenes y el texto de superposición se regeneran a partir de las entradas. El botón Reescalar te permite ampliar el proyecto 2x, 3x o 4x. También hay una opción de restablecer para volver al tamaño original más pequeño del proyecto. Con este método, puedes trabajar con un diseño de 10 megapíxeles y reescalarlo hasta 160 megapíxeles al terminar. El diseño más grande se puede seguir trabajando directamente después, pero será más lento. - - TOPIC: MATRIZ DE IMÁGENES +image: image-array.jpg - Selecciona muchas imágenes y únelas en un formato de matriz compacto dentro de un marco de color. - El primer diálogo se muestra arriba a la izquierda. Color de fondo es el color del marco de contorno y los espacios entre las imágenes contenidas. Ancho de la matriz es el ancho total de la matriz de salida, y Margen es el ancho del margen exterior que rodea todas las imágenes. La altura de la matriz se determina por el número de archivos de imagen seleccionados y el espacio necesario para colocarlos en el marco. Columnas de imagen especifica el número de columnas de imagen (6 en el ejemplo anterior). El número de filas depende del número de archivos de imagen seleccionados. Los valores de Separación fijan el espacio horizontal y vertical entre las imágenes contenidas. - Selecciona los archivos de imagen ({SELECCIONAR ARCHIVOS DE IMAGEN}), luego pulsa [Continuar] cuando termines. La imagen resultante se hará en unos segundos (o minutos para cientos de imágenes). Esta imagen típicamente tendrá un margen inferior muy desigual, como se muestra en la imagen superior derecha de arriba. La secuencia de imágenes en la matriz se determina por el orden de selección. La fila superior se llena primero, de izquierda a derecha, luego la segunda fila, etc. - El diálogo Optimizar comienza automáticamente. Puede reorganizar las imágenes para que el margen inferior sea más uniforme. Pulsa [Iniciar] y espera a que la imagen se optimice. Puedes observar el progreso. La función terminará si se encuentra un óptimo que haga que el margen inferior sea uniforme dentro de 2 píxeles. Puede continuar buscando indefinidamente si no se alcanza este objetivo. Pulsa [Detener] para forzar que la función de optimización termine con la mejor solución encontrada hasta ese momento. Si la optimización tiene éxito, obtendrás columnas uniformes como se muestra en la imagen inferior derecha. Si el borde inferior sigue siendo desigual después de la optimización, se te pregunta si quieres añadir márgenes a algunas de las imágenes para hacer uniforme el borde inferior. Esto dará como resultado un borde inferior uniforme, pero los espacios verticales ya no serán iguales. - CONSEJO: la optimización funciona mejor si el número de imágenes por columna es de al menos cuatro (mejor más). Esto le da al optimizador suficiente flexibilidad para encontrar una solución con un borde inferior uniforme. - Aparece el último diálogo, mostrado abajo a la izquierda. Ahora debes asignar un nombre de archivo a tu matriz. Se inicia un diálogo de guardar archivo, y puedes guardar el nuevo archivo de matriz en cualquier lugar. Si se elige la opción copiar metadata, la metadata se copia del archivo de entrada elegido al archivo de salida. Esto es útil si las imágenes son versiones editadas y quieres que la matriz contenga el historial de edición de la última versión (o de cualquier versión). - - TOPIC: MENÚ MASIVO Estas son funciones que procesan varios archivos de imagen seleccionados, unos pocos o miles. Estas funciones se pueden cancelar en mitad del proceso usando la tecla Escape, pero esto dejará algunos archivos procesados y otros no. Un informe emergente muestra los nombres de archivo a medida que se procesan. - - TOPIC: CONVERSIÓN MASIVA +image: batch-convert.jpg - Esta función se usa para renombrar, convertir, reescalar y mover varios archivos de imagen. Los archivos RAW también se pueden convertir en archivos de imagen. La función se ejecuta en varios hilos paralelos para máxima velocidad. - ^Entradas del diálogo • Seleccionar archivos - archivos a convertir ({SELECCIONAR ARCHIVOS DE IMAGEN}). • Reemplazar texto - reemplazar texto en los nombres de archivo (ver abajo). • Nuevo nombre - nuevo nombre opcional, texto insertado (ver abajo). • Números de secuencia - número base y adder para los nombres de archivo de salida. • Nueva ubicación - ubicación de carpeta nueva opcional para los archivos de salida. • Nuevo tipo - tipo de archivo para los archivos de salida, o "sin cambio". • Profundidad de color - especifica 8 o 16 bits para salida tif o png. • Ancho máx., Altura - límites opcionales para los archivos de salida (solo se usa si está marcado reducir o aumentar tamaño) • Reescalar - factor de reescalado opcional para los archivos de salida • Eliminar originales - elimina los archivos de entrada después de una conversión exitosa. • Copiar metadata - copia toda la metadata a los archivos de salida. • Actualizar álbumes - reemplaza los archivos de álbum con los archivos de salida convertidos - ^Reemplazar texto Si se introduce texto aquí, se examinan los nombres de archivo en busca de este texto, y si se encuentra, se sustituye por el texto de reemplazo dado. El texto de reemplazo puede tener una longitud diferente y también puede estar vacío, en cuyo caso el texto se elimina del nombre de archivo. - ^Nuevo nombre y plugins El nuevo nombre de archivo puede tener texto insertado: una fecha de foto (de la metadata EXIF), un número de secuencia, o el nombre de archivo original. Especifica qué y dónde insertar de la siguiente manera: • $oldname - aquí se inserta el nombre de archivo original • $sss - aquí se inserta un número de secuencia consecutivo. Ver abajo. • $yyyy $mm $dd - la fecha de foto se inserta en estas posiciones. - Ejemplo: San Francisco $yyyy:$mm:$dd $oldname $sss El archivo de entrada "Golden Gate Bridge.jpg", con una fecha de foto del 12 de mayo de 2014, se convertiría en el nombre de archivo de salida "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg". - Para "$sss", especifica la longitud del campo con el número de caracteres "s", p. ej. "$ss" será adecuado para números de secuencia de hasta 99. Se añaden ceros iniciales para números de secuencia con menos dígitos. Los números de secuencia que no caben en la longitud especificada se hacen tan largos como sea necesario. Ten en cuenta que el orden de clasificación de nombres de archivo en las galerías es estrictamente orden ascii, así que la secuencia de números 1, 2 ... 9, 10 se ordenará como 1, 10, 2 ... 9. Puedes mantener el orden numérico especificando una longitud de campo de 2 ($ss), lo que da la secuencia 01, 02 ... 09, 10. - Debe estar presente "$oldname" o "$sss" para asegurar que los nombres de archivo de salida sean únicos. Si Nueva ubicación falta o no se cambia, se ignora eliminar originales. Si ya existe un archivo de salida, el archivo de entrada no se convierte. - ^Ancho y alto máx. Si se marca reducir y/o aumentar tamaño, entonces los archivos de salida se redimensionarán dentro de estos límites, conservando la relación ancho/alto original. Si se marca reducir tamaño, los archivos más grandes que estos límites se reducen para mantenerse dentro de los límites. Si se marca aumentar tamaño, los archivos más pequeños que estos límites se amplían de modo que el ancho o el alto quede en el límite correspondiente. Esto no se puede usar con la opción Reescalar. - ^Reescalar Si se marca uno de los botones, los archivos de salida se reescalan por el factor elegido. Esto no se puede usar con la opción Ancho y alto máx. - ^Eliminar originales Si está marcado, los archivos de entrada se eliminan, pero solo después de que el archivo de salida se haya creado correctamente. - ^Copiar metadata Toda la metadata se copia del archivo de entrada al de salida. Omite esta opción para eliminar la metadata. - ^Actualizar álbumes Si está marcado, todos los álbumes que contengan cualquiera de los archivos de entrada se actualizan a los archivos de salida convertidos. - ^Conservar la secuencia de archivos Si especificas un número de secuencia inicial ($sss), la secuencia de selección de archivos de entrada se conservará en la ubicación de salida. Así puedes seleccionar archivos de imagen en el orden deseado, o seleccionar de un álbum con imágenes ordenadas, y conservar esta secuencia en la salida. - - TOPIC: COPIAR/MOVER MASIVO Copia o mueve los archivos de imagen seleccionados a una nueva ubicación. Selecciona los archivos de entrada ({SELECCIONAR ARCHIVOS DE IMAGEN}) de cualquier carpeta conocida por Fotocx. Si se selecciona "Eliminar originales", entonces los archivos de entrada se eliminarán después de moverlos correctamente a la nueva carpeta. En este caso, cualquier álbum que haga referencia a los archivos de entrada ahora eliminados se actualiza con las nuevas ubicaciones de archivo. - - TOPIC: ENDEREZADO MASIVO Esta función endereza archivos de imagen rotados o volteados (reflejados). Depende de los datos EXIF para saber si un archivo está rotado/volteado y en qué dirección. Es mucho más rápido que Conversión masiva. Simplemente puedes seleccionar todos los archivos candidatos y dejar que encuentre los que necesitan corrección. La velocidad de búsqueda es de unos 3000 archivos de imagen por minuto en un ordenador potente. Hay dos opciones para especificar los archivos a buscar. El botón [Seleccionar archivos] lleva a un diálogo de selección de archivos de galería ({SELECCIONAR ARCHIVOS DE IMAGEN}). Si se marca "Inspeccionar todos los archivos", se buscarán todos los archivos de imagen bajo tus carpetas principales. - - TOPIC: ELIMINAR/PAPELERA MASIVO Selecciona los archivos ({SELECCIONAR ARCHIVOS DE IMAGEN}). Selecciona la opción: eliminar o enviar a la papelera. [Continuar]. Los archivos se listan en un informe emergente a medida que se eliminan o se envían a la papelera. Después de que todos los archivos se eliminen/envíen a la papelera, se examinan los álbumes y se eliminan los archivos borrados. - - TOPIC: SUPERPOSICIÓN MASIVA +image: batch-overlay.png - Se puede añadir una pequeña imagen de superposición en una posición seleccionada de las imágenes de entrada seleccionadas. Esto se puede usar para añadir un crédito, copyright, etc. sobre las imágenes. - Prepara la imagen de superposición de la siguiente manera: usa Imagen en blanco para crear una imagen base que contenga el texto. La escala no importa, así que hazla más grande de lo necesario. Usa Pintar transparencia para pintar transparente toda la imagen base. Usa {MARCADO} > dibujar texto para poner el texto deseado en la imagen base, usando la fuente, el color y otros atributos que desees. Escala el texto para llenar la mayor parte de la imagen base. La imagen base (fondo) es transparente. Elimina los márgenes sobrantes con {RECORTAR} si es necesario. Guarda la imagen final. Una ubicación conveniente es /saved_areas, pero se puede usar cualquier carpeta. Esta imagen ahora se puede usar como imagen de superposición para Superposición masiva. - Usa el botón ^Seleccionar archivos de imagen anfitriones^ para seleccionar los archivos de imagen anfitriones que recibirán la imagen de superposición. Usa el botón ^Seleccionar archivo de superposición^ para seleccionar el archivo de imagen de superposición. - Las dos entradas ^Posición de superposición^ determinan dónde se posiciona la imagen de superposición sobre la imagen anfitriona, del 1 al 99% de la distancia de arriba a abajo, y del 1 al 99% de la distancia de izquierda a derecha. 0/0 significa la esquina superior izquierda, 99/99 significa la esquina inferior derecha. La imagen de superposición se posicionará de modo que no se extienda más allá de los bordes de la imagen anfitriona. - Especifica ^Ancho de superposición^ como un porcentaje del ancho de la imagen anfitriona. La altura se fijará para conservar la relación ancho/alto. Si se marca ^Hacer el ancho constante para el tamaño de ventana^, el tamaño visual de la imagen de superposición se hará constante para el tamaño de ventana especificado abajo. Sin esto, una imagen "alta" que se muestra con grandes márgenes izquierdo y derecho tendría una imagen de superposición visualmente más pequeña. El tamaño de ventana inicial es la ventana actual. Puedes introducir cualquier tamaño. Pulsa ^actualizar^ para fijar la ventana actual si esta ha cambiado. - Si se selecciona ^Reemplazar archivos anfitriones^, los archivos anfitriones de entrada se reemplazan con los archivos anfitriones de salida con la superposición. Si se selecciona ^Crear nuevas versiones^, se crean nuevas versiones de los archivos anfitriones de entrada. - - TOPIC: KEYWORDS MASIVAS +image: batch-keywords.jpg - Añade, elimina o cambia las keywords de un gran número de archivos de imagen a la vez. - Usa el botón [select files] para seleccionar los archivos de imagen ({SELECCIONAR ARCHIVOS DE IMAGEN}). - El diálogo muestra dos listas de keywords: las que se añadirán a los archivos seleccionados, y las que se eliminarán. Las keywords disponibles se muestran en la ventana Keywords definidas de abajo. Una de estas se puede añadir a la lista de keywords actualmente seleccionada (añadir o eliminar) haciendo clic en ella. Una keyword se puede eliminar de cualquiera de las listas de keywords haciendo clic en ella. Para reemplazar keywords, especifica las keywords nuevas en la lista de añadir keywords y las keywords antiguas en la lista de eliminar keywords. - Si la lista de keywords definidas es larga, puede ser más fácil escribir la keyword deseada en Introducir nueva keyword. Las keywords existentes que coincidan con lo que has escrito hasta el momento aparecerán en Keywords coincidentes, y puedes señalar y hacer clic en una de ellas para añadir la keyword a la imagen. Si la keyword introducida es nueva (no se muestra ninguna keyword coincidente), pulsa [Añadir] cuando la keyword esté completa. Se añadirá a la lista de keywords seleccionada y a la lista de keywords definidas bajo la categoría "nocatg". - Si estás usando categorías de keywords, puedes seleccionar una categoría, y solo se mostrarán esas keywords en la lista de keywords definidas. Si tu lista de keywords es enorme, esto puede reducir la lista a un tamaño manejable para señalar y hacer clic. - Para obtener una lista de imágenes con keywords específicas que quieres eliminar o reemplazar, usa {BUSCAR IMÁGENES} para encontrar las imágenes, luego inicia esta función y usa [select files] para añadir todos los archivos de imagen que acabas de encontrar, o selecciona cualquier subconjunto. - - TOPIC: RENOMBRAR KEYWORDS MASIVO +image: batch-rename-keywords.png - Renombra cualquier número de keywords y aplica estos cambios a toda tu colección de imágenes. Haz clic en una keyword a renombrar de la lista de keywords definidas, introduce un nuevo nombre en el cuadro Renombrar a, luego haz clic en el botón de flecha para añadir este par de nombres a la lista del lado derecho. Repite para cada keyword a renombrar. Haz clic en el par de nombres en la lista para eliminarlos. Pulsa [Continuar] cuando termines. Si quieres eliminar una keyword sin renombrarla, usa "delete" como el nuevo nombre. - Una ventana emergente muestra el número de archivos de imagen que contienen los nombres de keyword afectados. Pulsa [Sí] para continuar. La tasa de actualización es de unos 500/minuto en un ordenador potente. La próxima vez que se inicie Fotocx, la función de archivo de índice actualizará todos los thumbnails de las mismas imágenes, porque la fecha de modificación del archivo ha cambiado. - - TOPIC: PURGA MASIVA DE KEYWORDS +image: batch-purge-keywords.jpg - Purga (elimina) keywords no deseadas de todos los archivos de imagen. Esto es especialmente útil para deshacerse de keywords no deseadas que se añadieron desde archivos de imagen descargados. Haz clic en las keywords no deseadas en el lado izquierdo del diálogo para añadirlas a la lista de purga en el lado derecho del diálogo. Pulsa [proceed] cuando termines. - - TOPIC: FECHA DE FOTO MASIVA +image: batch-photo-date1.png +image: batch-photo-date2.png - Corrige rápidamente un lote de fotos que no tienen fecha/hora de foto o la tienen incorrecta. Usa el botón [select files] para abrir una ventana de galería donde puedes seleccionar los archivos de imagen a procesar ({SELECCIONAR ARCHIVOS DE IMAGEN}). - Hay dos formas de cambiar la fecha/hora de foto: • Fijar una nueva fecha/hora (imagen derecha arriba): introduce solo un año nuevo (aaaa) - solo se reemplaza el año en los archivos. Introduce solo una fecha (aaaa:mm:dd) - se reemplaza la fecha pero no la hora. Introduce una fecha/hora completa (aaaa:mm:dd hh:mm:ss) - se reemplazan ambas. • Desplazar fecha/hora existente (imagen izquierda): introduce valores + o - en cualquiera de los 6 campos: años, meses, días, horas, minutos, segundos. Las fechas/horas se desplazarán según los valores introducidos. - Los valores de fecha/hora desplazados se propagan al siguiente valor superior cuando es necesario: La hora 08:30 desplazada -50 minutos da como resultado 07:40 La fecha 2016-10-20 desplazada +6 meses y -30 días da como resultado 2017-03-21 (marzo tiene 31 días). - Si se marca la casilla "prueba", se produce un informe de las fechas/horas antiguas y nuevas de los archivos seleccionados para inspección. No se hace ningún cambio a los archivos. Si estás satisfecho de que los resultados son correctos, desmarca la casilla y ejecuta de nuevo para actualizar los archivos. - - TOPIC: CAMBIO MASIVO DE META +image: batch-change-meta.png - Revisa la metadata de varios archivos de imagen. Puedes añadir metadata nueva, revisar metadata existente, y eliminar metadata. Usa el botón [select files] para abrir una ventana de galería desde la que seleccionas los archivos a procesar {SELECCIONAR ARCHIVOS DE IMAGEN}. Introduce los nombres de tag de metadata y los valores a asignar, o deja el valor en blanco para eliminar el tag. Pulsa [aplicar]. Recibirás un mensaje de confirmación y puedes continuar o cancelar en ese momento. Se proporciona a la izquierda una lista de nombres de tag de uso común. Haz clic en uno de estos para insertarlo en el primer campo de nombre de tag vacío del diálogo. Esta lista proviene del archivo /metadata_picklist, que puedes editar para añadir otros tags a la lista. El botón [Lista completa] proporciona información sobre cómo obtener una lista de todos los nombres de tag disponibles. - - TOPIC: INFORME MASIVO DE META +image: add-meta-tags.png +image: batch-report-meta.png - Informa de cualquier metadata para cualquier número de imágenes. La salida es un archivo de texto que se muestra en el editor de texto predeterminado de tu sistema. Puedes usar las funciones de búsqueda del editor de texto para encontrar imágenes que coincidan con la metadata deseada, o puedes usar el archivo de texto como entrada para otros programas. Usa el botón [select files] para abrir una ventana de galería y seleccionar los archivos a procesar ({SELECCIONAR ARCHIVOS DE IMAGEN}). El botón [editar] abre un nuevo diálogo (derecha) donde puedes seleccionar los tags de metadata a informar. Haz clic en un tag de la columna izquierda para añadirlo a la columna derecha y al informe. Haz clic en un tag de la columna derecha para eliminarlo. Haz clic en el último tag de la columna izquierda, "Otro tag ...", para escribir cualquier nombre de tag que no aparezca en la lista, la cual contiene solo los tags más probablemente necesarios. - - TOPIC: GEOTAGS MASIVOS +image: batch-geotags.png - Selecciona muchas imágenes y añade los mismos datos de ubicación a todas ellas. Usa el botón [select files] para seleccionar los archivos de imagen desde una ventana de galería ({SELECCIONAR ARCHIVOS DE IMAGEN}). Luego obtén los datos de ubicación como se describe en {EDITAR META PRINCIPAL}, usando el botón [Buscar] o haciendo clic en un marcador del mapa. Usa esta función también para corregir inconsistencias en la ortografía de la ubicación o en los datos de latitude/longitude. Si la ubicación y/o el país se dejan en blanco, no se actualizan. Para borrar la ubicación o el país, introduce el nombre "null". Si latitude y longitude se dejan en blanco, no se actualizan. Para borrar latitude y longitude, introduce "0" para ambos valores. Puedes actualizar solo ubicación/país, solo latitude/longitude, o ambos. En la práctica, puede que encuentres que el GPS de la cámara inserta latitude y longitude sin ubicación ni país, o usa un idioma no deseado, o todas las letras en mayúsculas, o algún otro valor que necesite corrección. - - TOPIC: EXPORTAR ARCHIVOS Copia los archivos de imagen seleccionados a otra carpeta. El uso previsto es para copiar archivos y compartirlos con otros, p. ej. subir archivos a un sitio web. Los archivos de salida son JPEG. Opcionalmente puedes reducir el tamaño de las imágenes. Selecciona los archivos de imagen haciendo clic en los thumbnails de la galería ({SELECCIONAR ARCHIVOS DE IMAGEN}). Selecciona una carpeta donde se copiarán los archivos de imagen. Si se selecciona "exportar metadata", también se copia un conjunto limitado de metadata. Estos son: fecha de foto, keywords, copyright, título, descripción. - - TOPIC: MENÚ DE HERRAMIENTAS - - TOPIC: INDEXAR ARCHIVOS +image: index-files1.png - Fotocx necesita conocer todas tus carpetas de archivos de imagen, los nombres de archivo y la metadata incrustada (fechas, tags, geotags, títulos, descripciones, valoraciones). Estos datos se indexan para una búsqueda rápida. Fotocx también crea imágenes en miniatura para que las ventanas de galería (páginas de thumbnails) se muestren rápido. Fotocx no modifica ni copia tus archivos de imagen. El espacio necesario es típicamente un 2% del espacio de tus archivos de imagen. - La función Indexar archivos se ejecuta cada vez que se inicia Fotocx. Esta función creará los thumbnails que falten, reemplazará los desactualizados, y actualizará el índice de metadata usando los datos actuales de tus archivos de imagen. Esto puede necesitar un tiempo significativo si tienes muchos miles de archivos nuevos. - Los archivos de imagen modificados o movidos dentro de Fotocx se gestionan automáticamente. La función Índice solo se usa para archivos de imagen nuevos creados desde fuera de Fotocx (p. ej. se añadió un nuevo lote de fotos), y para archivos modificados o movidos desde fuera de Fotocx. - Introduce tus carpetas de imágenes principales (p. ej. /home//Imágenes). Usa el botón [explorar] para localizar y añadir carpetas. Estas carpetas y cualquier subcarpeta contenida se procesarán. No importa si hay otros archivos mezclados con las imágenes. Elimina una entrada haciendo clic en la "X" correspondiente. - Introduce la carpeta de thumbnails donde se almacenarán los archivos de thumbnail. Usa la predeterminada proporcionada o fija tu propia ubicación. - Si has usado nombres de carpeta o archivo para clasificar tus imágenes, puedes hacer uso inmediato de estos en la función {BUSCAR IMÁGENES}. Si has guardado fechas, keywords, geotags, títulos o valoraciones en la metadata de tus imágenes, estos también serán buscables. Después de indexar las imágenes, la búsqueda por cualquiera de estos es casi instantánea. - ^Tags de metadata Por defecto se incluye la siguiente metadata en el índice de imágenes: • nombres de carpeta y archivo • fecha/hora de foto • fecha/hora de modificación del archivo • título y descripción (metadata exif) • valoración (0-5 estrellas) • keywords (etiquetas del usuario) • geotags (nombres de país y ubicación y latitude/longitude) • cámara: marca, modelo, objetivo • exposición: tiempo, número f, distancia focal, ISO - ^Tags de metadata extra +image: index-files2.png - Puedes añadir hasta 20 tags de metadata adicionales al índice de archivos de imagen. La metadata de esta lista se puede buscar tan rápido como los tags estándar. Puede que no necesites esto, pero si a veces necesitas buscar tags de metadata no estándar, puedes añadirlos aquí y la velocidad de búsqueda será casi instantánea. Pulsa el botón [select] para "metadata extra" para obtener el diálogo de arriba. Haz clic en los tags de la lista izquierda para añadirlos a la lista derecha - los tags que se añadirán al índice. Haz clic en un tag de la lista derecha para eliminarlo. Pulsa [done] para confirmar los cambios. Toda tu colección de imágenes se indexará de nuevo. Esto avanzará más rápido que el indexado inicial porque no se vuelven a crear los thumbnails. - ^Acceso a archivos y carpetas no indexados Un archivo o carpeta de imagen no indexado es uno que no está incluido dentro de tus carpetas de imágenes principales declaradas (las subcarpetas de tus carpetas de imágenes declaradas siempre se incluyen). Puedes navegar a esa carpeta y ver los thumbnails normalmente, y puedes ver y editar esos archivos normalmente. Hay limitaciones que debes entender: • Estos archivos faltarán en cualquier resultado de búsqueda y vista de mapa. • Los thumbnails se crean en el momento de la visualización - las galerías serán lentas. Si accedes a un dispositivo de almacenamiento portátil (lento) (p. ej. una tarjeta SD de cámara), notarás el rendimiento deficiente. Los thumbnails se crearán según sea necesario, y permanecerán después de retirar el dispositivo. Sugerencia: copia los archivos a una carpeta declarada de Fotocx, y luego haz el procesamiento que necesites desde esa ubicación. El rendimiento será mucho mejor. - ^Almacenamiento extraíble (unidad USB) Si tus carpetas de imágenes principales incluyen carpetas en una unidad extraíble, y ejecutas Fotocx sin la unidad montada, los datos de índice y los thumbnails se conservan de todos modos, aunque los archivos extraíbles hayan desaparecido. Cuando la unidad extraíble se monta de nuevo, y se inicia Fotocx, se restaura el último estado. Si se añadieron o modificaron archivos mientras tanto, los datos de índice y los thumbnails se actualizan. - - TOPIC: MOVER INICIO DE FOTOCX La carpeta de inicio de Fotocx contiene toda la configuración y datos de usuario, incluyendo algunos archivos del paquete de Fotocx que el usuario puede personalizar. Ubicación predeterminada: /home//.fotocx. Si hay instaladas varias versiones o distribuciones de Linux, puede ser conveniente tener una carpeta de inicio de Fotocx compartida en lugar de una para cada distribución. Lo mismo podría aplicarse si varios usuarios necesitan acceder a la misma instancia de Fotocx. - Usa esta función para mover la carpeta de inicio de Fotocx a otro lugar. La carpeta seleccionada debería incluir "fotocx" dentro del nombre de la ruta, o se añadirá "/fotocx" si no lo incluye. - Consulta el parámetro -home de {PARÁMETROS DE COMANDO} si quieres varias colecciones de imágenes de Fotocx, gestionadas por separado. - - TOPIC: CONFIGURACIÓN +image: settings.jpg - Varias preferencias y ajustes de usuario se recopilan y guardan en el archivo /parameters. La mayoría de los cambios se aplican inmediatamente. Algunos harán que Fotocx se reinicie. - • Selecciona el código de idioma de 2 caracteres deseado. Fotocx se reiniciará en el idioma seleccionado. • Vista de inicio - visualización inicial al iniciar Fotocx. Archivos recientes: los archivos de imagen vistos más recientemente Archivos más recientes: archivos añadidos/modificados más recientemente Galería específica: la galería de carpeta especificada Galería de álbum: la galería de álbum especificada Galería anterior: galería usada por última vez en la sesión anterior Archivo anterior: archivo visto por última vez en la sesión anterior Archivo específico: el archivo de imagen especificado Botón Explorar: selecciona una carpeta, álbum o archivo de imagen • Fondo - colores de fondo para las ventanas Vista de archivo y Vista de galería • Estilo de menú - estilo de visualización del menú: iconos, texto, o ambos • Colores del menú - color de texto y color de fondo del menú • Fuente del diálogo - fuente para menús y diálogos • Mostrar ocultos - si está seleccionado, muestra archivos y carpetas ocultos • Velocidad de zoom - elige de 1 a 8 clics o teclas [+] por cada aumento de imagen 2x • Archivos JPEG - nivel de calidad, predeterminado 90, usa 70+ para buena calidad • Nodo de curva - separación mínima de nodos para curvas de edición, % de la escala. El valor predeterminado es 5% de la escala. Usa un valor más alto para touchpads. • Posición de imagen - la imagen está a la izquierda/centro/derecha dentro de una ventana más ancha • Confirmar salida - opción de diálogo emergente: ¿de verdad quieres salir? • Nivel de índice - ver abajo • Cargador RAW - ver abajo • Opciones RAW - ver abajo • Archivos RAW - lista de tipos de archivo RAW usados • Archivos de vídeo - lista de tipos de archivo de vídeo usados • App de vídeo - ver abajo - ^Calidad y compresión de archivo Nivel de calidad de archivo JPEG: usa 70 o superior para buena calidad de imagen (predeterminado 90). El método de compresión de archivo TIFF es DEFLATE (mejor para imágenes en color). El nivel de compresión de archivo PNG es "1". Los valores más altos parecen no hacer nada excepto aumentar el tiempo de guardado del archivo (libpng). - ^Posición de imagen Si la ventana es más ancha que la imagen (es decir, la relación ancho/alto de la ventana > la de la imagen), la imagen se puede desplazar al lado izquierdo, centrar, o desplazar al lado derecho. Si es izquierda o derecha, el margen no usado se maximiza, lo que puede ser más conveniente para posicionar cuadros de diálogo. - ^Nivel de índice de imágenes Estos dos parámetros gobiernan un compromiso entre el tiempo de inicio y la completitud del índice de imágenes. • $ fotocx: se aplica cuando fotocx se inicia usando un comando de shell, menú del sistema, o icono/lanzador del sistema. El valor recomendado de "2" significa indexado completo: carga el archivo de índice antiguo, busca archivos nuevos (aún no indexados) y actualiza el archivo de índice de fotocx. • $ fotocx : se aplica cuando fotocx se inicia haciendo clic en un nombre de archivo en una lista de un gestor de archivos. El valor recomendado de "1" significa cargar el archivo de índice antiguo pero no buscar archivos nuevos para actualizar el índice. El inicio es moderadamente rápido. Las funciones de búsqueda de imágenes y mapa funcionan normalmente, pero no se incluyen los archivos de imagen nuevos (aún no indexados). • Alternativa: "0" significa sin indexado. El inicio es muy rápido. El uso posterior de una función de búsqueda de imágenes o mapa iniciará la función de índice de archivos solo para los archivos antiguos (sin búsqueda de archivos nuevos/modificados). Usa esta opción si tu colección de imágenes es gigantesca y el tiempo de inicio supera unos pocos segundos. Puedes iniciar la función de índice más tarde si es necesario. - ^Cargador RAW El cargador RAW es el comando usado para leer un archivo RAW y convertirlo a TIFF con una profundidad de color de 16 bits. Se usa cuando se visualiza un archivo RAW. Puedes usar las funciones de edición de Fotocx para editar y optimizar el archivo. El cargador RAW predeterminado es dcraw usando el espacio de color sRGB. Se proporcionan algunas otras opciones usando dcraw o rawtherapee en la lista de selección. Estos comandos se guardan en el archivo 'raw_commands_*' en la carpeta de inicio de Fotocx. Edita este archivo para cambiar o añadir nuevas opciones (ver abajo). Puede que quieras preparar varios comandos para varias cámaras o varias opciones de procesamiento. Si prefieres usar un editor RAW de forma interactiva, crea un comando de plugin para esto - consulta {PLUGINS}. - ^Opciones RAW • editar comandos: pulsa el botón para editar la lista de comandos del cargador RAW. Se iniciará un editor de texto en una nueva ventana, con la lista actual de comandos. • igualar color de imagen incrustada: usa la imagen incrustada del archivo RAW como guía para mapear los colores de la imagen RAW a la imagen TIFF convertida. Esta es la interpretación del fabricante de la cámara de los datos RAW - un buen punto de partida si el archivo RAW necesita más edición. La imagen incrustada suele ser la misma que el archivo JPEG de la cámara. - ^App de vídeo Introduce un comando de shell para iniciar una app de reproducción de vídeo. Usa "%s" para marcar dónde se inserta el nombre del archivo de vídeo en la línea de comando. Aquí hay algunos ejemplos: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: ATAJOS DE TECLADO +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - Ver o cambiar los atajos de teclado personalizados. Los atajos asignados actualmente se muestran en la primera ventana. Si pulsas el botón [Editar], se muestra el segundo diálogo, donde puedes añadir y cambiar atajos de teclado. Introduce un nuevo atajo usando el teclado. Puedes usar las teclas A-Z, 0-9, F2-F9, y la mayoría de los símbolos (% $ & * < etc.). Puedes combinar una tecla con una de Ctrl/Alt/Mayús: mantén pulsada UNA de Ctrl/Alt/Mayús, luego pulsa la tecla, luego suelta ambas. Selecciona una de las asignaciones de menú disponibles de la lista de la derecha, luego pulsa [Añadir] y [OK]. Elimina un atajo seleccionándolo y pulsando [Eliminar]. - - TOPIC: HISTOGRAMA RGB +image: RGB-hist.png - Una pequeña ventana muestra un gráfico de histograma de brillo de la imagen actual en Vista de archivo, o del área actualmente seleccionada de la imagen. Este gráfico se actualiza de forma sincrónica a medida que las funciones de edición cambian la imagen. Usa los botones [Todo] [Rojo] [Verde] [Azul] para seleccionar los colores a mostrar. - - TOPIC: AMPLIAR IMAGEN +image: magnify-image.jpg - Amplía la imagen en un área alrededor del puntero del ratón. Arrastra el ratón con el botón izquierdo alrededor de la imagen para ampliar diferentes áreas, de forma análoga a ver una imagen impresa con una lupa. Usa el diálogo para ajustar el radio del área y la cantidad de ampliación. - - TOPIC: MEDIR IMAGEN Haz clic en dos posiciones cualesquiera dentro de una imagen para medir la distancia en píxeles entre los puntos. Las posiciones pulsadas se etiquetan A y B en la imagen. Estas etiquetas siempre muestran los dos últimos puntos pulsados. El diálogo se actualiza con las distancias que separan estos dos puntos: distancia X (distancia horizontal) distancia Y (distancia vertical) distancia H (distancia total) - - TOPIC: MOSTRAR RGB +image: show-RGB.png - Cuando se hace clic en un punto de la imagen, los valores RGB se muestran en una ventana de diálogo. Se muestran los últimos 9 puntos pulsados. Los valores tienen el formato xxx.dd, donde xxx son los 8 bits superiores del valor de color y .dd son los 8 bits inferiores. El rango es de 0.00 a 255.99. Los 8 bits inferiores son cero a menos que la imagen se esté editando o tenga más de 8 bits de profundidad de color. Las salidas se actualizan en tiempo real si la imagen se está editando. Si "etiquetas" está marcado, los puntos se etiquetan en la imagen con letras correspondientes a las letras de la ventana de diálogo. Si "delta" está marcado y la imagen se está editando, entonces se muestran los cambios RGB en lugar de los valores absolutos. - Si abres otra imagen (p. ej. para compararla con la imagen anterior), las posiciones se conservan y se actualizan si están dentro de los límites de la nueva imagen. Esto facilita la comparación de imágenes al nivel de los valores RGB de los píxeles. - - TOPIC: CONFIGURACIÓN DE CUADRÍCULA +image: grid-settings.jpg - Hay dos funciones de líneas de cuadrícula: Configuración de cuadrícula fija todos los parámetros de la cuadrícula. Alternar cuadrícula activa o desactiva las líneas de cuadrícula. Las líneas de cuadrícula son líneas horizontales y verticales a intervalos regulares a través de la imagen. Estas líneas pueden ser útiles como guías de alineación cuando una imagen se endereza o deforma para enderezar paredes u otros objetos en la imagen. Usa las entradas recuento-x y recuento-y para fijar el número de líneas verticales y horizontales respectivamente. Los controles desplazamiento-x y desplazamiento-y se pueden usar para desplazar las líneas de cuadrícula y que intersecten una posición deseada en la imagen. Se puede asignar un atajo de teclado (por defecto mayús+G) a Alternar cuadrícula, así las líneas de cuadrícula se pueden activar o desactivar con una sola pulsación de tecla. - - TOPIC: COLOR DE LÍNEA Algunas funciones dibujan líneas sobre la imagen (Recortar, Seleccionar área, otras). Puedes cambiar el color de estas líneas para maximizar el contraste con la imagen de fondo. El pequeño diálogo se puede dejar abierto mientras editas, para cambiar cómodamente entre los colores disponibles (negro, blanco, rojo, verde). - - TOPIC: PÍXELES OSCUROS/BRILLANTES Resalta los píxeles más oscuros y más brillantes de una imagen. Ajusta los dos controles giratorios para fijar los umbrales de brillo, que inicialmente son 0 para píxeles oscuros y 255 para píxeles brillantes. Los píxeles con un brillo menor que el umbral oscuro o mayor que el umbral brillante "parpadean" para hacerlos destacar. Usa esta función para detectar el recorte (clipping) después de editar el brillo o el color. - - TOPIC: COLOR DE MONITOR +image: moncolor-small.png - Se escriben ocho bandas de color en la pantalla con brillo desde cero (negro) hasta 100%. Puedes usar esto para ajustar el brillo y el contraste de tu monitor. No debería haber regiones sin cambios en ningún extremo de las bandas. - - TOPIC: BUSCAR DUPLICADOS +image: find-dups.png - Encuentra archivos de imagen duplicados en cualquier parte de tu base de datos de imágenes. Un archivo duplicado puede ser un archivo que duplica exacta o "casi" exactamente a otro archivo. Por razones de velocidad, las imágenes en miniatura se comparan en memoria. Es posible que se encuentren thumbnails coincidentes para imágenes principales que tengan diferencias menores no reflejadas en los thumbnails. Es probable que una copia de imagen reducida de tamaño se clasifique como duplicado. El tamaño del thumbnail se puede fijar de 32 a 512 píxeles. Un tamaño mayor reduce la probabilidad de falsos positivos. El tamaño del thumbnail afecta enormemente a la cantidad de memoria principal necesaria - p. ej. para 100 mil imágenes, el tamaño 64 necesita unos 880 MB, mientras que el tamaño 256 necesita unos 14 GB. Pulsa el botón [calculate] para calcular el tamaño de thumbnail más grande que cabe dentro de la memoria libre disponible. - Se usan dos parámetros para fijar la sensibilidad de detección de imágenes idénticas o casi idénticas: diferencia de píxeles es la diferencia de valor RGB por debajo de la cual los píxeles se consideran iguales. Recuento de píxeles es el número de píxeles diferentes por debajo del cual dos imágenes se clasifican como duplicados. Ejemplo: si diferencia de píxeles = 2 y recuento de píxeles = 10, entonces las imágenes se clasifican como duplicados si menos de 10 píxeles difieren en 2 o menos. - La salida es una galería que muestra cada conjunto de imágenes duplicadas. La galería de salida se guarda como el álbum "Duplicate Images". Puedes usar Eliminar/papelera masivo junto con este álbum para elegir qué duplicados eliminar. - - TOPIC: BUSCAR ARCHIVOS DAÑADOS Se leen todos los archivos de imagen dentro de tus carpetas principales declaradas. Para cada archivo que no se pueda leer, tienes tres opciones: • eliminar el archivo • corregir un tipo de archivo incorrecto (ver abajo) • mover el archivo a algún lugar fuera de tus carpetas de imágenes principales He visto a menudo archivos .png con extensión .jpg. Los navegadores web y otras aplicaciones manejan esto silenciosamente. Aquí, se informa del tipo de archivo correcto y puedes cambiar la extensión a la correcta. - - TOPIC: MOSTRAR RECURSOS Informa de los recursos del ordenador usados por Fotocx: • Tiempo de CPU: uso desde el inicio de Fotocx o desde la última muestra • Memoria real: la memoria real actualmente en uso (excluyendo swap) • Caché de mapas: MB de almacenamiento en disco usado para los mosaicos de mapa en caché • Borrar caché: elimina todos los mosaicos de mapa en caché • Botón [Sample]: toma una nueva muestra e informa de los datos - El botón [Sample] restablece el tiempo de CPU. La siguiente muestra mostrará solo el nuevo tiempo de CPU acumulado. El tiempo de CPU es la suma de todos los hilos del proceso. - - TOPIC: TRADUCCIONES El paquete de Fotocx incluye traducciones para varios idiomas. Estas traducciones hechas por IA no son perfectas. Los errores de traducción se pueden corregir editando los archivos de traducción. - ^Cambiar el idioma de la interfaz El menú {CONFIGURACIÓN} se puede usar para cambiar el idioma. El idioma también se puede fijar al iniciar Fotocx: $ fotocx -lang xx # idioma xx (de fr zh etc.) $ fotocx -lang en # inglés - ^Modificar una traducción de la interfaz Edita el archivo /translations/gui_xx Los pares de líneas de texto tienen números iniciales de 4 dígitos que deben coincidir. La primera línea es en inglés, la segunda línea es el idioma xx. Modifica solo la línea xx, nunca la línea en inglés. Los caracteres especiales para insertar parámetros en el texto deben permanecer en la misma secuencia. Estos son "%d" (parámetro entero), "%f" (decimal), "%s" (texto). - ^Modificar una traducción de la guía del usuario Edita el archivo /translations/ug_xx Edita ug_xx para corregir la traducción. No añadas ni elimines líneas de texto ni cambies la secuencia. Las líneas de texto deben corresponder 1:1 con la guía del usuario en inglés, ug_en. - Envía los archivos revisados para incluirlos en la próxima versión de Fotocx: mkornelix@gmail.com - - TOPIC: MENÚ DE AYUDA • Guía del usuario - muestra la tabla de contenidos • Tutorial en vídeo - muestra un tutorial en vídeo de Fotocx en YouTube • Programas externos - lista los programas externos y sus funciones • Mostrar archivo de registro - muestra información registrada y mensajes de error • Parámetros de comando - muestra los parámetros de línea de comandos disponibles • Registro de cambios - muestra las adiciones y correcciones de errores en versiones recientes • Copyright - muestra los copyrights y licencias relevantes para Fotocx • Privacidad - muestra la política de privacidad (normas) de Fotocx • Acerca de - muestra el número de versión, la ubicación del ejecutable, contacto • Página de inicio - muestra la página de inicio de Fotocx en kornelix.net • Desinstalar - cómo desinstalar Fotocx - - TOPIC: OTROS TEMAS Los siguientes temas no están conectados a los menús de Fotocx. - - TOPIC: VIDEO FILES Los archivos de vídeo (.mpeg, .mp4, etc.) se pueden mezclar con tus archivos de imagen. Se mostrarán como archivos de imagen tanto en Vista de archivo como en Vista de galería. La tecla "P" iniciará, pausará y reanudará el vídeo, o reproducirá de nuevo un vídeo que haya terminado. La tecla "Q" cerrará el vídeo. Usa el menú {CONFIGURACIÓN} para seleccionar la aplicación para reproducir archivos de vídeo. - - TOPIC: DIAPOSITIVAS Y NEGATIVOS +image: color-negative.jpg - Puedes usar una cámara con capacidad de primer plano para capturar diapositivas o negativos de película. Usa una caja de luz para iluminación, o usa el cielo (ejemplo anterior). Para procesar un negativo en color, primero haz un positivo - consulta {MODO DE COLOR}. Si la imagen tiene niebla, selecciona solo el área de la imagen, excluyendo los bordes de la película, y luego usa {RETINEX GLOBAL} para eliminar la niebla. Fija los puntos blanco y negro haciendo clic en la imagen si es necesario para reducir más la niebla. - - TOPIC: LIMITACIONES DE FOTOCX • hay un límite estricto de un millón de archivos. • versiones de imagen - hasta 99 versiones para deshacer/rehacer y nomenclatura de versiones. • keywords de imagen - 10 mil keywords en total. 1000 caracteres para una sola imagen. • las galerías están limitadas a 40 mil archivos de imagen. • las dimensiones máx. de imagen son 40 mil x 20 mil píxeles. - - TOPIC: FOTOCX PARA WINDOWS 11 Fotocx se puede usar en Windows 11 instalando Windows Subsystem for Linux 2, o WSL2. Hay abundante documentación en internet sobre cómo hacer esto. - Si tus archivos de imagen están en el sistema de archivos de Windows (NTFS), Fotocx será muy lento. Por lo tanto, mueve tus archivos de imagen al sistema de archivos de Linux. Todavía puedes acceder a ellos usando el Explorador de archivos de Windows y otras apps de Windows, así que no se pierde nada. Microsoft también recomienda el sistema de archivos de Linux para mejorar el rendimiento. Usa el icono "Linux" en el Explorador de archivos para acceder a tu carpeta de inicio en el sistema de archivos de Linux. Añade una carpeta Pictures si es necesario, y mueve allí tus archivos de imagen. - Si hay un paquete de Fotocx disponible, instálalo. De lo contrario, haz lo siguiente: Descarga el archivo de paquete binario de Fotocx desde ^https://kornelix.net. En la terminal de Linux: $ cd /mnt/c/Users//Downloads # ve a la carpeta de descargas de Windows $ tar -xzf fotocx-xxx-bin.tar.gz # descomprime el paquete a la carpeta fotocx $ cd fotocx # ve a la carpeta fotocx $ chmod u+x install.sh # haz ejecutable el script de instalación $ ./install.sh # ejecuta el script, instala fotocx $ fotocx # inicia Fotocx Puede que necesites reiniciar la ventana de Linux para que funcione el último paso. - Lee las partes introductorias de esta guía del usuario. Fotocx tiene una funcionalidad profunda. No esperes dominar Fotocx en unos minutos. - - TOPIC: PRIVACIDAD Fotocx no conserva ningún dato de usuario aparte de los archivos de imagen y su metadata. La metadata debería eliminarse de los archivos de imagen antes de subirlos a internet, y Fotocx proporciona un método sencillo para hacer esto. - - TOPIC: PROBLEM, QUESTION, SUGGESTION Envía un correo electrónico a mkornelix@gmail.com. Si hay un volcado de fallo (archivo zappcrash) envíalo también. - fotocx/data/translations/$ translation procedures0000644000175000017500000000336515247006657021216 0ustar micomicoTRANSLATION PROCEDURES All files are in /home//.fotocx/translations GUI Translation --------------- 1. Develop > Capture GUI capture translatable texts from source code output: gui_en - numbered english text strings 2. Develop > Slice GUI slice gui_en into smaller pieces for AI translator output: gui_en_01, gui_en_02 ... 3. AI translation process: input: gui_en_01, gui_en_02 ... - numbered en text strings output gui_xx_01, gui_xx_02 ... - numbered xx text strings 4. Concatenate the files gui_xx_01, gui_xx_02 ... $ cat gui_xx_* > gui_xx 5. Develop > Transtab GUI combine gui_en and gui_xx to make the final translation table output: gui_xx - numbered pairs of en and xx text strings 6. Develop > Audit GUI audit gui_xx - check matching text pairs and format codes Userguide Translation --------------------- 1. Develop > Slice UG slice ug_en into smaller pieces for AI translator output: ug_en_01, ug_en_02 ... 2. AI translation process: input: gui_en_01, gui_en_02 ... - en text strings output gui_xx_01, gui_xx_02 ... - corresponding xx text strings 3. Concatenate the files ug_xx.01, ug_xx.02 ... $ cat ug_xx_* > ug_xx 4. Develop > Sync UG 1. read ug_en and ug_xx in parallel 2. match pairs of TOPIC: xxxxx, {xxxxx}, and [xxxxx] 3. for each xxxxx in ug_xx, get matching english eeeee from ug_en, translate via TX(eeeee), replace xxxxx output: ug_xx_new 4. delete old ug_xx, rename ug_xx_new to ug_xx 5. Develop > Audit UG start fotocx in language xx: $ fotocx -dev -lang xx check that all F1 topics are present check that all userguide internal links are valid inputs: source files *.cc and ug_xx 6. Inspect UG tables and improve formatting if needed. fotocx/data/translations/ug_pt0000664000175000017500000104567415247006657015552 0ustar micomico- ^GUIA DO USUÁRIO DO FOTOCX^ v.26.8 Veja usando o menu do Fotocx Ajuda > Guia do Usuário - {USO DO FOTOCX} {PRIMEIRA INICIALIZAÇÃO} - localizar e indexar arquivos de imagem para busca rápida {GUIA DO USUÁRIO} ← ^clique aqui^ - como usar este navegador do guia do usuário {VISUALIZAÇÕES DE JANELA E MENUS} - janelas de nível superior e menus associados {VISUALIZAÇÃO DE ARQUIVO} - janela Visualização de Arquivo (ver um único arquivo de imagem) {VISUALIZAÇÃO DA GALERIA} - janela Visualização da Galeria (ver pasta como thumbnails) {VISUALIZAÇÃO DE MAPA} - janela de visualização de mapa (ver mapa com marcadores de localização de imagem) {ARRASTAR E SOLTAR} - métodos de arrastar e soltar arquivos {EDITAR PROCEDIMENTOS} - como editar arquivos de imagem {EDITAR FLUXO DE TRABALHO} - métodos alternativos de edição - simples e complexos {PROPRIEDADE DO MOUSE} - controle e interação de diálogo-mouse {MOUSE ALT+BOTÃO DIREITO} - botão direito do mouse para touchpads/telas {BOTÕES DE DIÁLOGO} - opções de conclusão de diálogo {TECLA ESC DO TECLADO} - funções da tecla Escape {WIDGETS DE DIÁLOGO NÃO PADRÃO} - como usar widgets de diálogo não padrão {EDIÇÃO DE CURVA} - como manipular curvas usadas em funções de edição {MOUSE PAINTING} - editar uma imagem localmente usando o mouse {PROCESSAMENTO EM LOTE} - visão geral das funções de processamento em lote {SELECIONAR ARQUIVOS DE IMAGEM} - procedimento de seleção de arquivo de imagem {ATALHOS} - menus popup, atalhos de teclado, menu personalizado do usuário {FUNÇÕES DO MOUSE} - funções do mouse para visualizações de arquivo/galeria/mapa {PARÂMETROS DE COMANDO} - parâmetros de linha de comando do Fotocx - {MENU DE ARQUIVO} {NOVA SESSÃO} - iniciar nova sessão do Fotocx em uma janela separada {ABRIR ARQUIVO DE IMAGEM} - abrir um arquivo de imagem para visualizar ou editar {CICLAR 2 ARQUIVOS} - ciclar entre os dois arquivos de imagem vistos mais recentemente {CICLAR 3 ARQUIVOS} - ciclar entre os três arquivos de imagem vistos mais recentemente {VER PANORAMA 360°} - imagem de panorama 360° com ponto de vista rotativo {IMAGEM EM BRANCO} - criar imagem em branco com tamanho e cor especificados {IMAGEM EM BRANCO} - criar uma nova imagem em branco {COPIAR/MOVER} - copiar ou mover um arquivo de imagem para outra pasta {COPIAR PARA A ÁREA DE TRABALHO} - copiar um arquivo de imagem para a área de trabalho {COPIAR PARA A ÁREA DE TRANSFERÊNCIA} - copiar um arquivo de imagem para a área de transferência {EXCLUIR/LIXEIRA} - excluir ou descartar um arquivo de imagem {DEFINIR PAPEL DE PAREDE} - definir papel de parede da área de trabalho a partir do arquivo de imagem atual {IMPRIMIR IMAGEM} - imprimir um arquivo de imagem {IMPRIMIR CALIBRADO} - imprimir usando dados de calibração de cor {CALIBRAR IMPRESSORA} - calibrar cor da impressora - compensar desvios de cor - {MENU DA GALERIA} {VISÃO GERAL DA GALERIA} {VISUALIZAÇÃO EM THUMBNAILS} - Visualização da Galeria com thumbnails e nomes de arquivo {VISUALIZAÇÃO DE METADATA} - Visualização da Galeria com thumbnail e metadata básica {ARQUIVOS RECENTES} - Visualização da Galeria dos arquivos de imagem vistos mais recentemente {ARQUIVOS MAIS NOVOS} - Visualização da Galeria dos arquivos de imagem mais novos {CLASSIFICAÇÃO DA GALERIA} - alterar a ordem de classificação de uma galeria {FILTRO DA GALERIA} - selecionar mais novos, mais antigos, padrão correspondente ... {INÍCIO DA GALERIA} - ir para o início da galeria {FIM DA GALERIA} - ir para o fim da galeria {PASTA DO ARQUIVO ATUAL} - definir galeria atual a partir da pasta do arquivo atual {PASTAS RECENTES} - ver lista de pastas vistas recentemente, selecionar {ÁRVORE DE PASTAS} - ver pastas de arquivos de imagem em uma estrutura de árvore, selecionar {SELECIONAR ARQUIVOS} - selecionar arquivos para entrada em lote, script ou álbum {MARCADORES} - ver lista de marcadores, ir para marcador {EDITAR MARCADORES} - adicionar, remover, organizar marcadores - {MAPS MENU} {MAPA MUNDIAL} - visão geral do mapa mundial pela internet {MOSTRAR NO MAPA} - mostrar a posição da imagem atual no mapa - {MENU DE ÁLBUNS} {ÁLBUNS} - criar e organizar coleções de imagens {CRIAR ÁLBUM} - criar um novo álbum (galeria de imagens escolhidas) {RENOMEAR ÁLBUM} - renomear um álbum existente {EXCLUIR ÁLBUM} - excluir um álbum existente {ESCOLHER ÁLBUM} - escolher um álbum e exibir a galeria de imagens {ÁLBUM ATUAL} - mostrar o álbum atual (usado por último) {GALERIA PARA ÁLBUM} - salvar a galeria atual como um álbum nomeado {EDITAR ÁLBUM} - adicionar, remover, reorganizar arquivos de imagem em uma galeria de álbum {ATUALIZAR ÁLBUNS} - atualizar álbuns para arquivos de imagem atualizados (novas versões) {ATUALIZAÇÃO EM MASSA DE ÁLBUM} atualização em massa de álbuns (adicionar/remover/substituir arquivos membros) {APRESENTAÇÃO DE SLIDES} - apresentação de slides com transições de imagem animadas e pan/zoom - {MENU PERSONALIZADO} - menu personalizado do usuário para funções usadas com frequência {ARQUIVOS DE SCRIPT} - visão geral de arquivos de script {EDITAR SCRIPT} - registrar edições em um script para criar uma função de edição personalizada {EXECUTAR SCRIPT} - executar script na imagem atual {SCRIPT EM LOTE} - executar script nos arquivos de imagem selecionados {PLUGINS} - iniciar uma função de edição de plugin, abrir arquivo de saída do plugin - {ZOOM} - dar zoom na imagem ou thumbnails para dentro/fora via mouse ou teclado - {ANTERIOR/PRÓXIMO} - avançar para a imagem anterior ou próxima via mouse ou teclado - {SALVAR ARQUIVO} - salvar arquivo de imagem (substituir, nova versão, novo nome de arquivo) - {MENU DE METADATA} {VER META PRINCIPAL} - listar a metadata principal da imagem {VER TODA A META} - listar toda a metadata da imagem {VISÃO GERAL DE KEYWORDS} - keywords usadas para busca de imagens {GEOTAGS OVERVIEW} - nomes de localização e geocoordenadas para busca {EDITAR META PRINCIPAL} - editar a metadata comumente usada {EDITAR QUALQUER META} - editar qualquer metadata (adicionar, remover, alterar) {EXCLUIR META} - excluir metadata especificada ou toda a metadata {COPIAR META} - copiar metadata de um arquivo de imagem para outro {CORRIGIR META} - reparar metadata malformada que impede edições de metadata {GERENCIAR KEYWORDS} - gerenciar keywords definidas pelo usuário {LEGENDAS} - mostrar nome do arquivo, título, descrição no canto da imagem {LOCAIS/DATAS} - listar localizações/datas das imagens, clique para galeria {LINHA DO TEMPO} - mostrar contagem de imagens por ano/mês, clique para galeria {TAGS DE METADATA} - mostrar contagem de imagens por valor de tag, clique para galeria {BUSCA AUTOMÁTICA} - função de Busca roteirizada para encontrar arquivos {BUSCAR IMAGENS} - buscar usando qualquer metadata ou nomes de pasta/arquivo - {MENU DE SELEÇÃO} {VISÃO GERAL DA ÁREA} - selecionar área - conceitos e uso {SELECIONAR ÁREA} - selecionar característica ou área da imagem para edição separada {ENCONTRAR LACUNA NA ÁREA} - encontrar lacuna em contorno de área desenhado à mão {MESCLAR ÁREA} - mesclar com o mouse edições feitas dentro de uma área selecionada {MOSTRAR/OCULTAR ÁREA} - mostrar ou ocultar contornos de área {ATIVAR/DESATIVAR ÁREA} - ativar ou desativar uma área para edição {INVERTER ÁREA} - inverter uma área (trocar áreas externa/interna) {LIMPAR ÁREA} - remover uma área {COPIAR/COLAR ÁREA} - copiar uma área ou colar área na imagem atual {CARREGAR/SALVAR ÁREA} - carregar uma área de um arquivo ou salvar em um arquivo - {BOTÃO DESFAZER/REFAZER} - desfazer ou refazer sequencialmente edições na imagem atual - {MENU DE EDIÇÃO} {GIRAR} - girar ou nivelar uma imagem {ENDIREITAR} - endireitar uma imagem girada ou espelhada {CORTAR} - cortar (aparar) margens da imagem {RETOCAR} - editar brilho, contraste, cor, saturação {REDIMENSIONAR} - alterar as dimensões de pixel da imagem {TELA DIVIDIDA} - ver alterações antes/depois usando tela dividida {MOSTRAR DIFERENÇAS} - realçar alterações durante a edição (ou quaisquer duas imagens) {MARGENS} - adicionar margens a uma imagem, qualquer cor ou transparência {MARCAÇÃO} - desenhar na imagem: texto, linha/seta, caixa, oval {MODO DE COR} - converter para preto e branco, cor, negativo, positivo {PINTAR EDIÇÕES} - pintar com o mouse uma função de edição local e gradualmente {PINTAR IMAGEM} - pintar com o mouse com uma cor, tamanho de pincel e opacidade {PINTAR TRANSPARÊNCIA} - pintar transparência crescente usando o mouse {PREENCHER ÁREA} - preencher áreas selecionadas ou áreas transparentes com uma cor {COPIAR NA IMAGEM} - copiar pixels dentro de uma imagem usando o mouse {COPIAR DA IMAGEM} - copiar pixels de outra imagem usando o mouse {COPIAR EDIÇÃO ANTERIOR} - copiar pixels de edições anteriores usando o mouse - {MENU DE REPARO} {NITIDEZ} - aplicar nitidez em uma imagem desfocada, vários métodos {DESFOQUE} - desfocar uma imagem ou área da imagem, vários métodos {REDUZIR RUÍDO} - reduzir ruído da imagem (pequenas manchas aleatórias) {REMOVER NÉVOA} - adicionar ou remover névoa/neblina de uma imagem ou área selecionada {OLHOS VERMELHOS} - remover olhos vermelhos de fotos com flash {APAGAR INTELIGENTE} - remover fios de energia, placas, outros pequenos estragos {REMOVER HALO} - remover halos deixados por nitidez e outras funções {ARTEFATOS JPEG} - suprimir artefatos em arquivos altamente comprimidos {ANTI-SERRILHADO} - suprimir pixelização (serrilhado) ao longo de bordas de características {AJUSTAR RGB} - ajustar cores da imagem usando cores RGB ou CMY {AJUSTAR HSL} - selecionar e alterar cores usando o modelo de cor HSL {REMOVER POEIRA} - remover manchas de poeira em imagens de fotos antigas {FRANJAS} - corrigir franjas de cor periféricas (aberração cromática) - {MENU DE REFINAMENTO} {ACHATAR HISTOGRAMA} - achatar o histograma de brilho para melhor detalhe {CONTRASTE LOCAL} - adicionar contraste adaptado ao brilho da área local {AMPLIFICAR CONTRASTE} - amplificar o contraste existente para realçar detalhes {RETINEX GLOBAL} - redimensionar valores RGB para maior faixa {RETINEX LOCAL} - redimensionar valores RGB para maior faixa {SATURAÇÃO} - ajustar a saturação de cor com base no brilho {FOCO SUAVE} - aplicar o efeito clássico de "foco suave" a uma imagem {GRADAÇÃO DE BRILHO} - adicionar uma gradação de brilho/cor por uma imagem {VINHETA} - alterar brilho/cor radialmente ao redor de um centro escolhido - {MENU DE EFEITOS} {CONTORNOS} - converter uma imagem em um desenho de contornos {ESBOÇO1} - converter uma imagem em um esboço simulado (1) {ESBOÇO2} - converter uma imagem em um esboço simulado (2) {DESENHO ANIMADO} - converter uma imagem em um desenho estilo desenho animado {RELEVO} - converter uma imagem em um relevo simulado (efeito 3D) {LADRILHOS1} - converter uma imagem em ladrilhos quadrados com efeito 3D {LADRILHOS2} - converter uma imagem em ladrilhos irregulares que seguem a imagem {PINTURA} - converter uma imagem em uma pintura simulada {TEXTURA} - adicionar textura a uma imagem ou área selecionada {FUSÃO} - suprimir detalhes finos mantendo a nitidez {COMBINAR CORES} - combinar as cores de uma imagem com outra imagem {PADRÃO} - adicionar um padrão de fundo a uma imagem {CRUZAMENTO DE LINHAS} - converter em um esboço usando linhas paralelas cruzadas {DITHERING} - diferentes formas de pixelizar ou posterizar uma imagem {GRAVURA} - converter uma imagem em linhas preto e branco {ADICIONAR BRILHO INTENSO} - adicionar brilho intenso ao redor de objetos claros na imagem {MOSAICO} - converter imagem em um mosaico usando ladrilhos feitos de imagens {ADICIONAR RUÍDO} - adicionar ruído aleatório a uma imagem {DEFINIR CORES} - reduzir o número de cores (posterizar) {DESLOCAR CORES} - deslocar gradualmente cores RGB para GBR ou BRG {CORES ALIENÍGENAS} - adicionar cores estranhas aleatórias a uma imagem {KERNEL PERSONALIZADO} - editar e aplicar um kernel de convolução personalizado - {MENU DE DISTORÇÃO} {DESCURVAR} - endireitar imagens com linhas curvas, especialmente panoramas {PERSPECTIVA} - endireitar objeto fotografado de um ângulo obtuso {DISTORCER ÁREA} - distorcer uma área selecionada da imagem puxando com o mouse {WARP LINEAR1} - distorcer imagem por arraste do mouse - distorção linear 1 {WARP LINEAR2} - distorcer imagem por arraste do mouse - distorção linear 2 {DISTORÇÃO CURVA} - distorcer imagem por arraste do mouse - distorção curva {DISTORÇÃO AFIM} - distorcer imagem por arraste do mouse - linhas paralelas preservadas {DISTORÇÃO RADIAL} - adicionar ou remover distorção de barril ou almofada {DESFAZER DISTORÇÃO DE CLOSE-UP} - remover distorção de foto de rosto em close-up (nariz grande) {CRIAR ONDAS} - distorcer uma imagem com um padrão de ondas {TORCER} - torcer uma imagem ao redor de um centro escolhido {ESFERA} - curvar uma imagem em formato esferoide {DE DENTRO PARA FORA} - inverter a distância centro-borda de cada pixel {PLANETA MINÚSCULO} - envolver uma imagem de panorama em um círculo {ESPIRAL DE ESCHER} - transformar uma imagem em uma espiral interminável para dentro {ACHATAR FOTO} - achatar uma foto de uma superfície curva - {MENU DE COMBINAÇÃO} {HDR} - combinar imagens escuras/claras para uma faixa de brilho estendida {HDF} - combinar imagens com foco próximo/distante para profundidade de campo estendida {EMPILHAMENTO/PINTURA} - combinar imagens para remover carros, turistas etc. passageiros {EMPILHAMENTO/RUÍDO} - combinar imagens para reduzir ruído por média {EMPILHAMENTO/CAMADAS} - combinar versões de imagem, selecionar/pintar área/versão {PANORAMA} - combinar uma série de imagens horizontalmente {MOSTRAR ARQUIVOS CIM} - mostrar arquivos de entrada da imagem combinada atual/mais recente {MASHUP} - organizar imagens e texto formatado em um layout personalizado {ARRAY DE IMAGENS} - unir várias imagens em um formato de array compacto - {MENU DE LOTE} {CONVERSÃO EM LOTE} - copiar, mover, redimensionar, renomear, converter, adicionar texto ... {CÓPIA/MOVIMENTAÇÃO EM LOTE} - copiar/mover arquivos de imagem selecionados para uma nova pasta {ENDIREITAMENTO EM LOTE} - buscar arquivos de imagem girados e endireitá-los {EXCLUSÃO/LIXEIRA EM LOTE} - excluir ou descartar arquivos de imagem selecionados {SOBREPOSIÇÃO EM LOTE} - adicionar imagem sobreposta (direitos autorais ...) às imagens selecionadas {KEYWORDS EM LOTE} - adicionar ou remover keywords dos arquivos de imagem selecionados {RENOMEAÇÃO EM LOTE DE KEYWORDS} - renomear ou excluir keywords de todos os arquivos de imagem {REMOÇÃO EM LOTE DE KEYWORDS} - remover keywords indesejadas de todos os arquivos de imagem {DATA DA FOTO EM LOTE} - alterar datas ou horários das fotos, ou deslocar fuso horário {ALTERAÇÃO EM LOTE DE META} - adicionar ou revisar metadata dos arquivos de imagem selecionados {RELATÓRIO DE META EM LOTE} - relatar metadata dos arquivos de imagem selecionados ou de todos {GEOTAGS EM LOTE} - adicionar ou revisar geotags dos arquivos de imagem selecionados ou de todos {EXPORTAR ARQUIVOS} - exportar arquivos selecionados para uma pasta (ex.: upload para a web) - {MENU DE FERRAMENTAS} {INDEXAR ARQUIVOS} - tarefa única para encontrar e indexar todos os arquivos de imagem {MOVER PASTA HOME DO FOTOCX} - mover a pasta home do Fotocx (dados e configurações do usuário) {CONFIGURAÇÕES} - preferências e configurações do usuário para a operação do Fotocx {ATALHOS DE TECLADO} - mostrar e revisar atalhos de teclado para funções do menu {HISTOGRAMA RGB} - gráfico do histograma de brilho para a imagem atual {AMPLIAR IMAGEM} - transformar o mouse em uma lupa sobre a imagem {MEDIR IMAGEM} - medir distâncias de pixel dentro da imagem (cliques do mouse) {MOSTRAR RGB} - mostrar valores RGB na posição do mouse ou para pontos selecionados {CONFIGURAÇÕES DE GRADE} - mostrar ou remover linhas de grade, definir contagem ou espaçamento de linhas {COR DA LINHA} - definir a cor para contornos de área selecionada {PIXELS ESCUROS/CLAROS} - ferramenta para realçar corte (clipping) {COR DO MONITOR} - ajustar brilho e contraste do monitor {ENCONTRAR DUPLICATAS} - encontrar imagens duplicadas em uma galeria ou em todas as imagens {ENCONTRAR ARQUIVOS COM DEFEITO} - encontrar arquivos de imagem ilegíveis, excluir/mover/corrigir {MOSTRAR RECURSOS} - mostrar tempo de CPU e uso atual de memória {TRADUÇÕES} - criar ou modificar traduções da interface - {MENU DE AJUDA} - guia do usuário, tutorial, registro de alterações, sobre o Fotocx, desinstalar - {OUTROS TÓPICOS} {VIDEO FILES} - arquivos de vídeo, thumbnails, reprodução de vídeos {SLIDES E NEGATIVOS} - como capturar slides e negativos de filme {LIMITAÇÕES DO FOTOCX} - limites de tamanho e desempenho {FOTOCX PARA WINDOWS 11} - instalar o Fotocx no Windows 11 WSL {PRIVACIDADE} - política de privacidade e proteção de dados do Fotocx {PROBLEM, QUESTION, SUGGESTION} - entre em contato com o autor do Fotocx - - TOPIC: USO DO FOTOCX - - TOPIC: PRIMEIRA INICIALIZAÇÃO - ^Programas Externos O Fotocx relata os programas externos necessários e opcionais, e a função fornecida por cada um. Se algum programa necessário estiver ausente, instale-o e inicie o Fotocx novamente. - ^Primeira Indexação O Fotocx indexará seus arquivos de imagem. Isso faz com que as páginas de galeria (thumbnails) sejam exibidas rapidamente, permite busca rápida com base na metadata indexada, e permite marcadores de mapa clicáveis para ver imagens por localização. Você deve informar uma ou mais pastas de imagem "principais" (ex.: /home//Pictures). As subpastas são incluídas automaticamente. Arquivos que não são de imagem nessas pastas são ignorados. Use o botão [select] para localizar e adicionar suas pastas principais de imagem. Um limite prático é de cerca de 30 pastas principais. Cada uma pode ter centenas de subpastas. - ^Thumbnails Esta é a pasta onde os arquivos de thumbnail serão colocados. Use o padrão fornecido ou escolha outro local. - ^Tempo de Indexação A velocidade de indexação pode variar de algumas centenas a mais de 10 mil arquivos/minuto, dependendo do tipo e tamanho dos seus arquivos de imagem e da velocidade do seu computador. Quando você adiciona novos arquivos de imagem à sua coleção, a próxima inicialização do Fotocx indexará os novos arquivos. Se houver muitos arquivos novos, a inicialização precisará de tempo para indexá-los. - ^Consolidação de título e descrição da imagem A função de indexação de imagens do Fotocx substitui a metadata ausente de título e descrição por uma das várias tags de metadata alternativas, se disponível: headline, event, abstract, imagedescription, caption-abstract, subject, comment, usercomment, caption. Isso é feito para que você possa sempre visualizar/editar/buscar usando apenas "título" e "descrição". Este processo de conversão é relativamente lento (2200 arquivos/minuto no meu computador potente). Isso é feito quando novos arquivos de imagem são indexados pela primeira vez. Nada é apagado. - - TOPIC: GUIA DO USUÁRIO Abra o guia do usuário pelo menu Ajuda > Guia do Usuário. Enquanto usa o Fotocx, você pode pressionar F1 para ver o tópico do Guia do Usuário para a função de menu atual ou mais recente. - Para rolar o texto, use as teclas seta para cima/baixo e page up/down. O botão [Buscar] abre uma caixa de diálogo para busca de texto. Pressione [Buscar] novamente para a próxima ocorrência. - Texto em negrito e maiúsculas é um link clicável para um tópico, ex.: {INDEXAR ARQUIVOS}. Use os botões [<] e [>] para ir e voltar entre os tópicos vistos recentemente. O botão [Recent] apresenta uma lista clicável de tópicos vistos recentemente. - - TOPIC: VISUALIZAÇÕES DE JANELA E MENUS +image: fotocx-views.jpg - ^Botões de Menu Quando um menu é clicado, um submenu popup aparece. Os três menus principais (Arquivo, Galeria, Mapas) definem o modo de visualização correspondente. As teclas F/G/M também podem ser usadas. - - TOPIC: VISUALIZAÇÃO DE ARQUIVO Uma imagem preenche toda a janela do Fotocx. Dê zoom para dentro/fora com clique do mouse esquerdo/direito. A tecla Z alterna entre ajustar à janela e tamanho 1x da imagem (1 pixel de imagem = 1 pixel de exibição). Para deslocar uma imagem com zoom, arraste o mouse com o botão esquerdo pela imagem. A roda do mouse também pode dar zoom para dentro ou fora de uma imagem. Use os botões de menu (Editar, Reparar etc.) para modificar a imagem. Use o botão Salvar Arquivo para salvar um arquivo modificado: substituir, criar uma nova versão, ou criar um novo arquivo (novo nome). - ^Teclas de seta esquerda/direita do teclado Veja o arquivo de imagem anterior ou próximo na galeria atual. - ^teclas de seta para cima/baixo Como acima, mas apenas as últimas versões são mostradas, ou o original se não houver versões. - - TOPIC: VISUALIZAÇÃO DA GALERIA Todos os arquivos de imagem na galeria atual são mostrados como um array de thumbnails. - ^Tipos de Galeria • Pasta: todos os arquivos de imagem e subpastas em uma única pasta (diretório) • Álbum: arquivos de imagem de várias pastas, organizados pelo usuário • Arquivos Recentes: os arquivos de imagem vistos ou editados mais recentemente • Arquivos Mais Novos: arquivos de imagem adicionados ou modificados mais recentemente • Resultados da Busca: imagens encontradas pela função de Busca. Também um álbum. - ^Funções da Galeria • clique esquerdo na thumbnail da imagem: abrir imagem no modo Visualização de Arquivo • clique direito na thumbnail da imagem: menu popup de funções comuns • clique na thumbnail da pasta: abrir essa pasta no modo Galeria • barra TOP da galeria de pasta: pastas superiores - clique para ir até lá • botão [TOP]: lista de pastas de nível superior - clique para ir até lá • barras de rolagem: rolar para cima/baixo dentro da galeria • teclas de seta para cima/baixo: rolar a galeria uma linha • teclas page up/down: rolar a galeria uma página • teclas home/end: ir para o início (topo) e fim (final) da galeria • roda do mouse: rolar a galeria para cima e para baixo • teclas [+] e [-]: aumentar/diminuir o tamanho da thumbnail - ^Imagens Popup da Galeria • Clique na thumbnail com o botão do meio do mouse para imagem popup • Clique na thumbnail com shift + botão esquerdo do mouse para imagem popup • Clique esquerdo na imagem popup: ampliar a imagem • Clique direito na imagem popup: fechar a imagem popup • Roda de rolagem do mouse: ampliar ou reduzir a imagem popup • Tecla F11: tornar a imagem popup em tela cheia • Tecla Escape: fechar a imagem popup • Vários popups podem ser usados para comparar imagens - - TOPIC: VISUALIZAÇÃO DE MAPA Veja mapas contendo marcadores correspondentes às localizações das imagens. Clique em um marcador para ver a galeria das imagens correspondentes. Isso depende dos seus arquivos de imagem terem geocoordenadas incorporadas (latitude, longitude). Câmeras modernas inserem isso automaticamente, e você também pode adicionar esses dados você mesmo. Inicialmente um mapa mundial é exibido. Use a roda do mouse para dar zoom para dentro/fora em qualquer local. Arraste para deslocar o centro do mapa. O mundo inteiro pode ser visualizado em qualquer escala, até o nível de rua. - - TOPIC: ARRASTAR E SOLTAR Se você abrir duas sessões do Fotocx, você pode arrastar e soltar arquivos de uma para a outra. Arraste uma thumbnail da galeria de uma janela para a outra. Se for Visualização de Arquivo, o arquivo é aberto. Se for Visualização da Galeria, o resultado depende do tipo de galeria. Se a galeria for uma pasta, o arquivo é adicionado à pasta e a galeria mostrará o novo arquivo em sua posição classificada. Se a galeria for um álbum, o arquivo é adicionado ao álbum na posição onde foi solto. - - TOPIC: EDITAR PROCEDIMENTOS A imagem no modo Visualização de Arquivo (a imagem atual) pode ser modificada com as funções de edição nos menus Editar, Reparar, Refinar, Efeitos, Distorção e Combinação. Essas funções modificam a imagem atual na memória e na janela. Conforme você usa essas funções, as edições vão se acumulando. Quando terminar de editar, use o botão de menu [Salvar] para salvar a imagem modificada de volta no mesmo arquivo, em uma nova versão (ex.: nomedoarquivo.v01.jpg), ou em um novo arquivo e/ou pasta. As caixas de diálogo de edição de imagem têm sliders, botões, spin buttons, ou curvas editáveis que atualizam a imagem imediatamente. - Clique com o botão esquerdo ou direito no botão Desfazer/Refazer para desfazer ou refazer a função de edição ativa no momento. Depois que uma imagem tiver uma ou mais edições aplicadas, o botão desfazer/refazer pode ser usado para avançar e retroceder por todas as etapas concluídas, para ver o status da imagem após cada etapa. O botão do meio do mouse mostra uma lista popup de todas as edições feitas na imagem atual, e você pode selecionar qualquer etapa para voltar a ela. A imagem pode ser reeditada a partir de qualquer etapa anterior. Isso descartará as edições feitas após essa etapa, já que elas foram derivadas dela. Esta capacidade de desfazer/refazer permanece enquanto a imagem editada continuar sendo a imagem atual. Se outra imagem for aberta, o histórico de edições é descartado. Se você quiser manter a possibilidade de retornar ao status atual da imagem, salve a imagem como uma nova versão antes de continuar com outra edição. - - TOPIC: EDITAR FLUXO DE TRABALHO - ^Fluxo de Trabalho Simples Na maioria das vezes, você pode simplesmente editar o arquivo JPEG que vem direto da câmera. Use o procedimento mais complexo a seguir apenas se você notar faixas de cor após edições que expandiram a faixa de brilho em algumas áreas da imagem, tornando os degraus de brilho grandes o suficiente para serem vistos. - ^Fluxo de Trabalho Complexo Para editar com cor profunda (mais de 8 bits por cor RGB), comece com o arquivo RAW da câmera. Um arquivo RAW pode ser editado como qualquer outro arquivo de imagem. As funções de edição do Fotocx trabalham com 24 bits por cor, então a profundidade de cor completa do arquivo RAW é preservada. Quando você abre um arquivo RAW, o carregador RAW escolhido é usado - veja {CONFIGURAÇÕES}. Você também pode usar Conversão em Lote para converter vários arquivos RAW em arquivos TIFF, PNG ou JXL com 16 bits por cor. - Dcraw é o carregador de arquivo RAW padrão. Você também pode usar um editor RAW mais complexo, como o Rawtherapee - veja {CONFIGURAÇÕES}. O Dcraw é simples e rápido em comparação. As funções de edição em um editor RAW geralmente podem ser feitas mais facilmente com o Fotocx. - - TOPIC: PROPRIEDADE DO MOUSE Algumas caixas de diálogo de edição usam o mouse para referenciar ou alterar a imagem na janela principal. Pode haver mais de uma dessas caixas de diálogo ativa ao mesmo tempo. O mouse também é usado para dar zoom e rolar a imagem, e você pode precisar fazer isso enquanto usa uma caixa de diálogo de edição. Portanto, é importante entender qual caixa de diálogo ou janela possui o mouse, e como alterar essa propriedade: • Se uma caixa de diálogo tiver o foco do teclado, as ações do mouse na imagem são entradas para essa caixa de diálogo e não dão zoom nem rolam a imagem. • Se você mantiver a tecla CTRL pressionada enquanto clica ou arrasta o mouse na imagem, a imagem dará zoom ou fará pan/rolagem. As caixas de diálogo abertas não são afetadas. • A roda do mouse pode dar zoom para dentro/fora em qualquer local da imagem. - - TOPIC: MOUSE ALT+BOTÃO DIREITO Para touchpads ou telas sensíveis ao toque, cliques com o botão direito do mouse podem ser difíceis. Se a tecla ALT for mantida pressionada enquanto se pressiona o botão esquerdo do mouse, isso é interpretado como o botão direito do mouse. - - TOPIC: BOTÕES DE DIÁLOGO Estes geralmente funcionam da seguinte forma: • [Redefinir] - desfazer a edição atual, retornar a imagem ao status inicial • [Aplicar] - aplicar as configurações da caixa de diálogo à imagem, manter a caixa de diálogo ativa • [OK] - o mesmo que [Aplicar], mas a caixa de diálogo é fechada • [Cancelar] - descartar as alterações da imagem e fechar a caixa de diálogo • [Continuar] - continuar com uma tarefa demorada com base nas entradas da caixa de diálogo • [X] - fechar a caixa de diálogo sem executar nenhuma ação - - TOPIC: TECLA ESC DO TECLADO Quando a janela principal está com o foco: • se uma função de longa duração ainda estiver em execução, encerrá-la • se a janela principal estiver maximizada, restaurar o tamanho anterior • se a visualização atual for galeria ou mapa, mudar para visualização de arquivo • nenhum dos anteriores: sair do Fotocx Quando a janela de diálogo está com o foco: encerrar a caixa de diálogo (o mesmo que o botão [X]) Outros: cancelar imagem popup, sair do visualizador de panorama 360, pausar ou sair da Apresentação de Slides. - - TOPIC: WIDGETS DE DIÁLOGO NÃO PADRÃO +image: custom-widgets.png - Alguns widgets não padrão são usados para reduzir o tamanho da caixa de diálogo ou melhorar a facilidade de uso. Eles funcionam quase como widgets GTK padrão. O widget de dados numéricos funciona como um spin-button do GTK: a roda do mouse e as teclas de seta para cima/baixo do teclado podem ser usadas para alterar rapidamente o valor para mais ou para menos. Se estiver usando um touchpad, toque na entrada para posicionar o cursor, e então use o teclado para digitar um valor, ou use as teclas de seta para cima/baixo do teclado para navegar rapidamente até um novo valor. Se a tecla for mantida pressionada, a taxa de alteração acelera com o tempo. A tecla shift pode ser usada para aumentar a taxa em 10x. Um slider não linear expande a escala ao redor do valor neutro, para que pequenas alterações possam ser controladas com mais precisão, especialmente com um touchpad. Alguns widgets GTK padrão tiveram seu tamanho reduzido pela remoção de espaçamento excedente. Isso é controlado pelo arquivo 'widgets.css' na pasta home do Fotocx. Você pode modificar esse arquivo se desejar. Você pode excluir itens ou marcá-los como comentários, mas não exclua o arquivo - ele seria automaticamente substituído. - - TOPIC: EDIÇÃO DE CURVA +image: retouch.png - Algumas funções de edição de imagem usam curvas editáveis. Você pode manipular as curvas para alterar alguma propriedade da imagem dependendo de alguma outra propriedade. As curvas podem ser movidas (puxadas) com o mouse. Um ponto de ancoragem (ponto preto) é adicionado à curva onde quer que ela seja puxada, e esse ponto permanece fixo - a curva continuará passando por esse ponto conforme outras partes da curva são puxadas. Um ponto de ancoragem pode ser movido arrastando-o, ou excluído clicando com o botão direito. - - TOPIC: MOUSE PAINTING O mouse pode ser usado para editar uma imagem localmente. Um círculo ao redor da posição do mouse envolve uma área da imagem que é modificada conforme o mouse é arrastado com o botão esquerdo pela imagem. A origem da modificação pode ser uma função de edição, uma cor escolhida, ou pixels de outro local na mesma imagem ou de outra imagem. Os pixels da imagem dentro do círculo do mouse são modificados para corresponder à origem. A taxa de alteração pode ser rápida ou gradual, dependendo de fatores de potência para o centro e a borda do mouse. Se o fator do centro for alto e o fator da borda baixo, a imagem é modificada mais rapidamente no centro do mouse e gradualmente menos do centro para a borda. Arraste o mouse com o botão esquerdo repetidamente sobre a mesma área da imagem para acumular as alterações, até que os pixels correspondam totalmente à cor ou imagem de origem, ou a função de edição de origem esteja totalmente aplicada. Arraste com o botão direito para desfazer gradualmente as alterações, restaurando a imagem original. - Exemplo: se a função de edição for Retocar, e o brilho for aumentado, então a imagem clareará dentro da área do mouse conforme o mouse é arrastado com o botão esquerdo. Use o arraste com o botão direito para restaurar gradualmente a imagem original. - O botão [undo-last] reverte a última operação de pintura ou apagamento, e isso pode ser repetido para remover muitas edições recentes. Cada nova operação de arraste do mouse é uma unidade de trabalho que pode ser revertida separadamente. A memória para desfazer é limitada, então apenas as etapas recentes de pintura e apagamento são mantidas. [undo all] colocará a imagem de volta em sua condição inicial. - Use o botão [undo/redo] para auditar as alterações durante as edições. - Se uma {SELECIONAR ÁREA} estiver ativa, a pintura fica confinada dentro da área. - NOTA: Dê zoom na imagem para 100% ou mais ao usar um raio muito pequeno (ex.: ao desenhar linhas na imagem). Os passos de movimento do mouse são em pixels de tela. Se isso abranger muitos pixels de imagem e um raio pequeno estiver sendo usado, alguns pixels podem ser ignorados pelo mouse e não serão processados. - - TOPIC: PROCESSAMENTO EM LOTE Existem várias funções em lote no {MENU DE LOTE} para agilizar algumas tarefas comuns. Você pode selecionar vários arquivos de imagem e executar a função em lote para todos eles. As funções em lote podem ser usadas para alterar nome ou tipo de arquivo, endireitar, redimensionar, copiar ou mover, excluir, revisar tags, keywords, localização/geocoordenadas, datas das fotos. - - TOPIC: SELECIONAR ARQUIVOS DE IMAGEM +image: select-image-files.jpg - Este procedimento é usado por todas as funções que operam em vários arquivos de imagem. O procedimento é explicado aqui, e este tópico é vinculado a partir de cada função que usa o procedimento. • clique esquerdo na thumbnail: adicionar à lista de seleção • clique direito: remover • adicionar múltiplos: clique na primeira thumbnail, shift-clique na última • botão [Adicionar Tudo]: adicionar a galeria inteira • botão [Adicionar Atual]: adicionar o arquivo atual • um arquivo pode ser adicionado várias vezes à lista • navegue para outras galerias para selecionar mais arquivos conforme necessário • botão [Remover]: remover a posição selecionada da lista • botão [Limpar]: limpar toda a lista • teclas de seta para cima/baixo: percorrer a lista, ver thumbnails • teclas home/end: ir para o início/fim da lista - O botão [Desativar] desativará o clique na thumbnail para selecionar arquivos. O botão então é renomeado para [Ativar] - pressione para restaurar o clique na thumbnail. O propósito disso é permitir os menus popup normais da thumbnail e o clique esquerdo para visualizar um arquivo em tamanho real, o que não é possível se os cliques na thumbnail estiverem sendo usados para seleção de arquivo. Você pode precisar disso para decidir as seleções. Você também pode permanecer no modo de visualização de arquivo e percorrer as imagens usando as teclas de seta, enquanto usa o botão [Adicionar Atual] para adicionar arquivos à lista de seleção. - - TOPIC: ATALHOS Existem três métodos de atalho para funções usadas com frequência: • Clique com o botão direito na janela principal ou na thumbnail da galeria. Um menu popup mostra algumas funções comumente usadas. • Você pode alterar teclas de atalho e adicionar novos atalhos. Veja {ATALHOS DE TECLADO}. • Colete funções usadas com frequência em um menu personalizado. Veja {MENU PERSONALIZADO}. - Atalhos de teclado estão disponíveis para as funções mais comuns. Use o menu Ferramentas > Atalhos de Teclado para ver ou alterar esses atalhos. - Os seguintes atalhos de teclado são fixos e não podem ser alterados: • tecla [+] [=]: Dá zoom para aumentar a imagem ou thumbnails • tecla [-]: Dá zoom para diminuir a imagem ou thumbnails • tecla Z: Alterna o zoom: 1x <--> ajustar à janela • tecla F1: Exibe o guia do usuário para a função atual • tecla F10: Alterna a janela principal para tela cheia e volta • tecla F11: Como F10, sem menus, barra de título, painel superior • tecla Escape: Encerra a função em execução, Sai da caixa de diálogo ativa • tecla Delete: Caixa de diálogo para excluir ou descartar o arquivo atual • Seta Esquerda/Direita: Mostra a imagem anterior/próxima na galeria • Seta Cima/Baixo: O mesmo, mas mostra apenas as últimas versões • Page Up/Down: Visualização da galeria: rola uma página para cima/baixo • Home/End: Visualização da galeria: vai para a primeira/última página da galeria - Os seguintes atalhos de teclado são padrões que podem ser alterados pelo usuário: • F: Visualização de Arquivo - muda para o modo de visualização de arquivo • G: Visualização da Galeria - muda para o modo de visualização de galeria • M: Visualização de Mapa - muda para o modo de visualização de mapa • 2: Ciclar 2 Arquivos - alterna a exibição dos dois arquivos mais recentes • 3: Ciclar 3 Arquivos - alterna a exibição dos três arquivos mais recentes • A: Álbum Atual - mostra o álbum visualizado mais recentemente • T: Retocar - inicia a função de edição Retocar • C: Cortar - inicia a função de edição Cortar • K: Atalhos de Teclado - inicia a caixa de diálogo de atalhos de teclado • P: Imprimir Imagem - abre a caixa de diálogo de impressão de imagem • R: Girar - inicia a função de edição Girar • U: Desfazer - desfaz a edição atual ou a última de uma série • Shift+U: Refazer - refaz a edição atual ou a próxima de uma série • Ctrl+C: Copiar para a Área de Transferência - copia o arquivo atual para a área de transferência • Shift+C: Alternar Legendas - alterna mostrar/ocultar legendas • Ctrl+G: Mostra a galeria da pasta do arquivo atual • Shift+G: Alternar Grade - liga/desliga as linhas de grade • Ctrl+S: Salvar - inicia a caixa de diálogo de salvar arquivo - - TOPIC: FUNÇÕES DO MOUSE - ^Visualização de Arquivo • clique esquerdo - Zoom-in: amplia a imagem, centralizado no mouse • clique direito - Se a imagem estiver com zoom: restaura ao tamanho da janela Se não, menu popup com funções comuns • roda do mouse - Dá zoom na imagem para dentro ou fora • arrastar imagem com o botão esquerdo - Desloca a imagem com zoom • Ctrl + mouse - O mouse age sobre a imagem, não sobre a caixa de diálogo ativa - ^Visualização da Galeria • clique esquerdo na thumbnail - Muda para Visualização de Arquivo • clique direito na thumbnail - Mostra menu popup com funções comuns • clique do meio na thumbnail - Imagem popup, dê zoom com a roda do mouse • roda do mouse - Rola a página da galeria para cima ou para baixo - ^Visualização de Mapa • arrastar com o botão esquerdo - Arrasta o mapa, seguindo o mouse • roda do mouse - Dá zoom no mapa para aumentar ou diminuir • clique esquerdo em um marcador - Mostra a galeria de imagens no local • se a caixa de diálogo de edição de metadata estiver ativa, um clique esquerdo define as geocoordenadas - - TOPIC: PARÂMETROS DE COMANDO Estes parâmetros podem ser usados se o Fotocx for iniciado a partir de um terminal. -help mostra o guia do usuário -home /pasta local alternativo da pasta home do Fotocx (veja abaixo) -lang xx define o idioma a partir do código de 2 caracteres -recent mostra a galeria de arquivos de imagem recentes -new mostra a galeria de arquivos de imagem mais novos -album nomedoalbum álbum (galeria) a ser aberto -prev mostra o último arquivo visualizado na sessão anterior -blank mostra uma janela em branco -dev mostra o menu de desenvolvedor normalmente oculto -menu nomedomenu o Fotocx iniciará com este menu ativo -cwp nnn nome cicla o papel de parede (veja abaixo) -x0 -x1 -x2 define o nível de índice como 0, 1 ou 2 (veja abaixo) - ^parâmetro -x0 -x1 -x2^ (define o nível de índice na inicialização) Estes parâmetros podem ser usados para substituir o valor de {CONFIGURAÇÕES} -x0 inicialização muito rápida, sem índice de imagem -x1 inicialização rápida, indexa apenas arquivos antigos -x2 arquivos antigos + busca por arquivos novos/modificados - ^parâmetro -home^ (pasta home alternativa do Fotocx) Pasta home padrão do Fotocx: /home//.fotocx. É aqui que as configurações do usuário e o índice de imagens são mantidos. O comando "$ fotocx -home " usa a pasta designada. Isso permite que várias coleções de imagens sejam gerenciadas separadamente. Veja também {MOVER PASTA HOME DO FOTOCX}. - ^parâmetro -cwp^ (ciclar papel de parede da área de trabalho) A linha de comando completa é: $ fotocx -cwp segs container Use este comando para ciclar a imagem da área de trabalho a partir de um conjunto selecionado. 'segs' é o intervalo entre as imagens. 'container' é o nome de um álbum do Fotocx ou uma pasta contendo arquivos de imagem. Adicione este comando à sua lista de inicialização de login para obter um novo papel de parede em intervalos especificados. Use um intervalo de um dia ou mais para obter uma nova imagem de papel de parede a cada login. O Fotocx roda em segundo plano sem uma interface gráfica. Se 'segs' for zero, uma atualização de papel de parede será feita e então o Fotocx será encerrado. Cada distribuição Linux tem um comando diferente. Teoricamente, as seguintes são cobertas: Gnome, KDE, XFCE, Mate, LXDE. - - TOPIC: MENU DE ARQUIVO - - TOPIC: NOVA SESSÃO Inicia uma nova sessão do Fotocx em uma nova janela. Se um arquivo de imagem for editado em ambas as janelas, nenhuma das instâncias verá as alterações feitas pela outra, e o resultado final é o do último arquivo salvo. - - TOPIC: ABRIR ARQUIVO DE IMAGEM Selecione um arquivo de imagem para visualizar ou editar, usando uma caixa de diálogo convencional de abertura de arquivo com pastas e listas de arquivos. Isso é útil para o caso em que os arquivos não estão indexados e a exibição da galeria é muito lenta, ex.: leitura de um cartão SD de câmera contendo milhares de arquivos de imagem. - - TOPIC: CICLAR 2 ARQUIVOS Repetir este menu alternará entre os dois arquivos abertos mais recentemente. Esta função mantém o tamanho e a posição de zoom atuais da imagem, o que é ideal para comparar rapidamente duas versões editadas do mesmo arquivo de imagem. - - TOPIC: CICLAR 3 ARQUIVOS Isso funciona da mesma forma que Ciclar 2 Arquivos, mas alternando entre os últimos 3 arquivos abertos. - - TOPIC: VER PANORAMA 360° O arquivo atual é aberto com um visualizador especial para arquivos de panorama 360°. Assume-se que a largura da imagem seja 360°. Use esta função para visualizar imagens 'photosphere' do Google. Desloque a imagem arrastando o mouse ou com as teclas de seta esquerda/direita. Dê zoom com o clique esquerdo/direito do mouse. Use Escape para sair do visualizador especial. - - TOPIC: RENOMEAR Renomeia o arquivo atual (Visualização de Arquivo), ou o arquivo de uma thumbnail clicada (Visualização da Galeria). Digite um novo nome e pressione [aplicar]. Esta função também pode automatizar o processo de renomear uma série de arquivos de imagem usando um nome raiz e um número de sequência. Abra o primeiro arquivo de imagem da série, digite um novo nome e pressione o botão [aplicar]. Use o botão [next] para ir para o próximo arquivo, se desejado. Você pode usar o mesmo nome novamente pressionando o botão [nome anterior] e então adicionar um sufixo ou número de sequência. Pressione o botão [add 1] para incrementar o número de sequência. - - TOPIC: IMAGEM EM BRANCO Cria uma imagem em branco com dimensões de pixel e cor especificadas. Isso pode ser usado como plano de fundo para recortes obtidos de outras imagens (via {SELECIONAR ÁREA}) e texto de anotação (via {MARCAÇÃO} desenhar texto). - - TOPIC: COPIAR/MOVER O arquivo atual (Visualização de Arquivo) ou o arquivo de uma thumbnail clicada (Visualização da Galeria) é copiado para o local indicado. Selecione a opção copiar para copiar o arquivo e deixar o arquivo de origem no lugar, criando uma duplicata. Selecione a opção mover para mover o arquivo do local original para o novo local. Um grupo de arquivos pode ser processado rapidamente clicando em cada thumbnail seguido de [aplicar]. O botão [Anterior] pode ser usado para copiar o nome de arquivo usado anteriormente. Adicione um número de versão ou outra coisa para evitar um arquivo duplicado. - - TOPIC: COPIAR PARA A ÁREA DE TRABALHO O arquivo atual (Visualização de Arquivo) ou o arquivo de uma thumbnail clicada (Visualização da Galeria) é copiado para a pasta da área de trabalho (/home//Desktop). - - TOPIC: COPIAR PARA A ÁREA DE TRANSFERÊNCIA O arquivo atual (Visualização de Arquivo) ou o arquivo de uma thumbnail clicada (Visualização da Galeria) é copiado para a área de transferência, de onde outros aplicativos podem colar. - - TOPIC: EXCLUIR/LIXEIRA O arquivo atual (Visualização de Arquivo) ou o arquivo de uma thumbnail clicada (Visualização da Galeria) é excluído ou movido para a lixeira, dependendo da opção selecionada. O Fotocx assume o padrão para a lixeira (~/.local/share/Trash). - - TOPIC: DEFINIR PAPEL DE PAREDE O papel de parede da área de trabalho é definido a partir do arquivo de imagem atual. - - TOPIC: IMPRIMIR IMAGEM O menu imprimir imagem abre uma caixa de diálogo padrão de Configuração de Página, onde você pode selecionar uma impressora, um tamanho de papel e a orientação. Após usar o botão [aplicar], outra caixa de diálogo é iniciada para inserir as margens do papel e a escala da imagem. - Se a imagem tiver área(s) selecionada(s), você será perguntado se apenas a(s) área(s) deve(m) ser impressa(s). Elas serão impressas usando o retângulo mínimo necessário para envolver as áreas, e as áreas fora das seleções não são impressas. - - TOPIC: IMPRIMIR CALIBRADO Esta função funciona como Imprimir Arquivo de Imagem descrita acima, mas antes de imprimir você é solicitado a fornecer um arquivo de calibração, que é usado para ajustar as cores da imagem antes da impressão. O objetivo é compensar desvios de cor causados pela impressora e pelo tipo de papel. - - TOPIC: CALIBRAR IMPRESSORA +image: printer-calibrate-chart.png +image: calibrate-printer.png - Este utilitário pode ser capaz de melhorar a precisão de cor das imagens impressas. - ^Como Funciona Uma tabela de cores é impressa na impressora alvo. Algumas das cores impressas estarão levemente incorretas devido a imperfeições da impressora. Esta página impressa é escaneada para um arquivo, e as cores nesse arquivo são comparadas às cores originais que foram impressas. Quaisquer diferenças são erros agora conhecidos (assumindo que seu scanner seja mais preciso que sua impressora - geralmente verdadeiro). Quando um arquivo de imagem é impresso, esses erros são subtraídos das cores da imagem antes da impressão. A impressora adiciona os erros de volta, deixando um resultado que é teoricamente correto. Meu próprio teste mostrou uma modesta melhoria, detalhada abaixo. - Realize os seguintes passos em sequência, conforme listado na janela de diálogo. Todos os arquivos estão na pasta /printer_color. • Gere e imprima o arquivo da tabela de cores (printchart.png). Use tamanho de papel grande, orientação vertical, sem margens. • Escaneie a tabela impressa em um arquivo PNG. Use 300 dpi ou mais. • Edite a imagem PNG para cortar as margens deixadas pelo scanner. Salve o arquivo de imagem editado. • Processe o arquivo de imagem editado para criar um arquivo de mapa de cores. - Agora você pode imprimir usando o menu {IMPRIMIR CALIBRADO}, que solicitará o nome do arquivo de mapa de cores para a impressora e o papel que você está usando. - Scanners podem inclinar uma imagem escaneada em uma forma levemente não retangular. Se isso acontecer, você notará ao tentar cortar as margens: as linhas de margem verde grossa não se alinharão perfeitamente com o retângulo de corte. Se isso acontecer, use {PERSPECTIVA} para esquadrejar a imagem primeiro, depois corte as margens. - Ao editar a imagem da tabela escaneada, certifique-se de que a fileira mais escura esteja no topo. Corte as margens ao redor dos blocos de cor. Use a linha de margem verde grossa ao redor dos blocos de cor como guia: corte exatamente essa linha, deixando apenas os blocos. Trabalhe com ampliação de 2x ao ajustar o retângulo de corte. O corte preciso é importante. Se o corte não for preciso, as posições calculadas dos blocos ficarão deslocadas, e as cores medidas podem estar erradas. Um pequeno erro é tolerado. Você pode usar as teclas de seta do teclado para movimentos de 1 pixel no retângulo de corte. O último canto puxado com o mouse é o canto que as teclas de seta moverão. - O arquivo de mapa de cores de saída só pode ser usado para as configurações de papel e impressora usadas na calibração. Qualquer outra combinação precisa de sua própria calibração e arquivo de mapa de cores. - ^Resultados^ (minha impressora Canon) +image: printer-calibrate.jpg +image: printer-cal-study.png - A tabela acima é uma foto de três imagens: superior esquerda: impressão de uma foto da tabela de cores superior direita: impressão calibrada da mesma foto inferior: a própria tabela de cores Como as 3 imagens foram fotografadas juntas, os erros da câmera são iguais, tornando as comparações válidas. - - TOPIC: MENU DA GALERIA - - TOPIC: VISÃO GERAL DA GALERIA +image: image-management.jpg - Uma galeria de imagens em thumbnail pode representar uma pasta de arquivos, o resultado de uma busca de imagens, uma das galerias integradas (arquivos recentes, arquivos mais novos), ou um álbum (uma lista ordenada de arquivos de imagem com um nome dado). As pastas devem ser limitadas a alguns milhares de arquivos por razões práticas e de desempenho, mas nenhum limite é imposto. - ^Rolando a Galeria A galeria pode ser rolada para cima e para baixo usando as teclas de seta para cima e para baixo do teclado, as teclas page-up e page-down, ou as barras de rolagem. As teclas [home] e [end] também podem ser usadas. Clique com o botão esquerdo e segure na barra de rolagem, e a galeria rolará rapidamente até a posição do clique. Clique com o botão direito e segure na barra de rolagem para fazer a galeria rolar lentamente até a posição do clique. Continue segurando o botão do mouse e mova para o lado para aumentar a velocidade de rolagem. - - TOPIC: VISUALIZAÇÃO EM THUMBNAILS Os arquivos de imagem na galeria atual são mostrados como um array de thumbnails. Use o botão de menu Zoom ou as teclas [+] [-] para alterar o tamanho da thumbnail. - - TOPIC: VISUALIZAÇÃO DE METADATA Os arquivos de imagem na galeria atual são mostrados junto com a metadata básica usada pelo Fotocx. Se tags de metadata personalizadas indexadas estiverem definidas, elas são mostradas após as tags padrão. Veja {INDEXAR ARQUIVOS}. - - TOPIC: ARQUIVOS RECENTES Os 1000 arquivos de imagem vistos mais recentemente são mostrados em uma galeria, a partir da qual você pode selecionar arquivos para visualizar ou editar. - - TOPIC: ARQUIVOS MAIS NOVOS Os 1000 arquivos de imagem adicionados ou modificados mais recentemente são mostrados em uma galeria, a partir da qual você pode selecionar arquivos para visualizar ou editar. Você pode escolher entre usar a data da foto EXIF ou a data de modificação do arquivo para determinar as imagens mais novas. - - TOPIC: CLASSIFICAÇÃO DA GALERIA Escolha a chave de classificação e a ordem crescente ou decrescente. A caixa de seleção Redefinir redefine todas as galerias para ordem crescente de nome de arquivo. - Se uma galeria de Álbum for classificada, a saída não substitui o álbum, mas cria um novo álbum chamado -sorted. - ^Nome/Número do Arquivo Esta é uma classificação modificada por nome de arquivo. Se vários arquivos tiverem nomes que diferem apenas por números incorporados na mesma posição, esse grupo de arquivos será classificado na ordem dos números incorporados. O exemplo aqui ilustra a diferença: ordem alfabética: xxx1xx xxx11xx xxx123xx xxx3xx ordem numérica: xxx1xx xxx3xx xxx11xx xxx123xx - ^Metadata da Função de Busca Se a galeria foi gerada pela opção 'relatório de metadata' de {BUSCAR IMAGENS}, e se você adicionou tags de metadata opcionais ao relatório padrão, você pode classificar a galeria por essas tags de metadata. Você pode classificar a galeria por marca da câmera, informações da lente, nível ISO, tempo de exposição ... qualquer metadata disponível. - - TOPIC: FILTRO DA GALERIA Selecione um subconjunto da galeria atual para criar um álbum chamado "gallery_filter" contendo os arquivos de imagem selecionados. ^Opções de seleção: • todos os arquivos: seleciona todos os arquivos de imagem • originais: arquivos originais (sem número de versão) • versões: arquivos versionados (que foram editados) • últimas versões: últimas versões (ou originais se não houver versões) • intervalo de avaliação: arquivos com avaliação dentro do intervalo dado • nomes de keywords: arquivos com quaisquer das keywords dadas (separadas por vírgula) • texto do nome do arquivo: arquivos com qualquer um dos textos dados (separados por vírgula) - - TOPIC: INÍCIO DA GALERIA TOPIC: FIM DA GALERIA Vai para a primeira ou última thumbnail na galeria atual. - - TOPIC: PASTA DO ARQUIVO ATUAL Define a galeria atual a partir do arquivo de imagem atual. Isso é útil se você quiser voltar à galeria do arquivo atual depois de fazer outra coisa. - - TOPIC: PASTAS RECENTES Define a galeria atual a partir de uma galeria usada recentemente. Isso permite que você navegue mais facilmente entre galerias recentes. - - TOPIC: ÁRVORE DE PASTAS +image: folder-tree.png - Todas as pastas TOP de imagem são mostradas inicialmente. Clique em [+] para desdobrar subpastas, ou em [-] para dobrá-las novamente. Você pode clicar em qualquer pasta para obter uma galeria das imagens nessa pasta. Mantenha a janela aberta para navegar em qualquer lugar da sua coleção de imagens. Esta função também está disponível usando o botão [TOP] no painel superior da galeria. - - TOPIC: SELECIONAR ARQUIVOS Pré-selecione arquivos de imagem para uso como entradas na criação de álbuns ou para funções em lote. Essas funções usarão os arquivos pré-selecionados por padrão, mas você também pode modificá-los ou recomeçar. Veja o procedimento {SELECIONAR ARQUIVOS DE IMAGEM}. - - TOPIC: MARCADORES Veja os marcadores existentes. Marcadores são locais escolhidos (nomes de pasta/arquivo) com nomes atribuídos pelo usuário. Clique em um marcador para mostrar uma galeria de thumbnails começando por esse local. Selecione [Editar Marcadores] para adicionar, excluir ou renomear um marcador. - - TOPIC: EDITAR MARCADORES Depois de iniciar Editar Marcadores, clique em uma thumbnail da galeria para adicionar esse local à lista de marcadores. O nome de marcador atribuído será inicialmente o nome do arquivo da thumbnail. Você pode editar o nome. Se você selecionar um marcador existente com um clique do mouse, seu nome é mostrado no campo de entrada. Você pode alterar o nome ou pressionar [excluir] para remover o marcador. Novos marcadores são inseridos após o último local de marcador selecionado. Para alterar a ordem, edite o arquivo "bookmarks" na pasta home do Fotocx. - - TOPIC: MAPS MENU - - TOPIC: MAPA MUNDIAL +image: map-click.jpg - Este é um mapa mundial da internet que pode ser escalado (zoom para dentro e fora) do nível de rua até o nível de continente. Use a roda do mouse para dar zoom no mapa para dentro/fora. Arraste o mapa para alterar o centro. O mapa tem marcadores (pontos vermelhos) correspondentes a imagens que têm geocoordenadas em sua metadata. Clique em um marcador para obter uma Visualização da Galeria das imagens nesse local. Imagens localizadas dentro da área do marcador no mapa são selecionadas. A área efetiva do marcador é escalada com a escala do mapa. Aumente o zoom para expandir a escala e possivelmente separar um marcador em vários marcadores próximos. - - TOPIC: MOSTRAR NO MAPA Mostra a posição do arquivo de imagem atual no mapa mundial. Se vários marcadores estiverem sobrepostos, aumente o zoom até que um único marcador fique no centro. - - TOPIC: MENU DE ÁLBUNS - - TOPIC: ÁLBUNS Um álbum é um conjunto arbitrário de imagens montado manualmente a partir de imagens existentes. Um álbum é uma lista de seus arquivos de imagem membros. Os próprios arquivos de imagem não são copiados ou alterados. Um determinado arquivo de imagem pode ser membro de vários álbuns, ou pode estar presente mais de uma vez dentro de um álbum. Você pode adicionar e remover imagens em um álbum ou reorganizar sua ordem. Depois que um álbum é criado, você pode selecioná-lo pelo nome e ele é exibido como uma galeria. - - TOPIC: CRIAR ÁLBUM Digite um nome para um novo álbum. Você pode criar um álbum vazio, um álbum com arquivos de imagem pré-selecionados de {SELECIONAR ARQUIVOS}, um álbum com imagens da galeria atual, ou você pode selecionar as imagens iniciais para o álbum. - - TOPIC: RENOMEAR ÁLBUM Escolha um álbum existente e digite um novo nome. - - TOPIC: EXCLUIR ÁLBUM Escolha um álbum existente e exclua-o permanentemente. - - TOPIC: ESCOLHER ÁLBUM Uma lista de álbuns disponíveis é apresentada. Escolha na lista. - - TOPIC: ÁLBUM ATUAL Define a galeria a partir do álbum atual (usado por último). - - TOPIC: GALERIA PARA ÁLBUM Salva a galeria atual como um álbum. Selecione um nome de álbum existente [Procurar], ou digite um novo nome. - - TOPIC: EDITAR ÁLBUM Clique com o botão direito em uma thumbnail de álbum e selecione no menu popup: • Adicionar arquivos selecionados aqui - os arquivos previamente selecionados são adicionados aqui (clique no lado esquerdo/direito da thumbnail para adicionar antes/depois da thumbnail). • Adicionar o arquivo atual (Visualização de Arquivo) aqui - funciona da mesma forma. • Remover do álbum - o arquivo clicado é removido do álbum. - ^Arrastar e Soltar Você pode reorganizar imagens em um álbum arrastando thumbnails com o mouse. Arraste a thumbnail até que o cursor do mouse mude para uma pequena imagem de thumbnail. Continue arrastando essa imagem até a posição onde ela deve ser inserida, e solte o botão do mouse. Posicione o mouse aproximadamente entre as thumbnails onde a imagem arrastada deve ser inserida. Se o arraste se aproximar da borda superior ou inferior da janela, a galeria rolará para trazer mais imagens à vista. Você pode usar duas sessões do Fotocx para tornar a seleção ou movimentação de muitas imagens mais rápida. Arraste e solte imagens de qualquer galeria de origem para uma posição de álbum alvo. - Se você renomear ou mover um arquivo usando o Fotocx, quaisquer links de álbum são atualizados e o arquivo permanece nos álbuns que o contêm. Se você fizer isso fora do Fotocx, os links de álbum são perdidos e o arquivo desaparece do álbum. - Se arquivos de imagem forem renomeados ou movidos usando Conversão em Lote ou Cópia/Movimentação em Lote, certifique-se de selecionar a opção para substituir arquivos de álbum, se isso for desejado. Caso contrário, você terá que substituí-los um de cada vez. - Não renomeie pastas se elas contiverem imagens em álbuns. Os links de álbum serão perdidos. Em vez disso, use Conversão em Lote ou Cópia/Movimentação em Lote para mover os arquivos de imagem para a nova pasta, e depois exclua a pasta antiga se estiver vazia. Para excluir arquivos de imagem, use Exclusão/Lixeira em Lote. Isso também removerá os arquivos excluídos dos álbuns. - - TOPIC: ATUALIZAR ÁLBUNS +image: album-replace-file.png - Substitui arquivos de álbum especificados por substitutos especificados, ou adiciona novos arquivos especificados após arquivos existentes especificados. Selecione um ou mais álbuns a serem processados. Na visualização de galeria, clique em duas thumbnails para especificar 'arquivo antigo' e 'arquivo novo' na caixa de diálogo acima. Selecione a opção: 'arquivo novo' substitui 'arquivo antigo' onde for encontrado, ou 'arquivo novo' é adicionado aos álbuns após 'arquivo antigo'. Pressione [proceed] para processar os álbuns. Após o processamento, a caixa de diálogo é repetida com os mesmos álbuns selecionados e a mesma opção 'substituir ou adicionar'. Você pode selecionar mais dois arquivos e pressionar [proceed]. - - TOPIC: ATUALIZAÇÃO EM MASSA DE ÁLBUM +image: album-mass-update.png - Este é um utilitário para atualizações em massa que você pode precisar após criar novas versões para muitos arquivos de imagem e precisar atualizar um ou mais álbuns para as novas versões. Isso não cobre todas as necessidades, o que provavelmente é impossível, mas espera-se que reduza a necessidade de alterar um arquivo de cada vez. - Selecione um ou mais álbuns e então selecione uma das opções de processamento: • Substituir tudo apenas pela versão mais recente: Os álbuns são atualizados para conter apenas as versões mais recentes dos arquivos. • Substituir todas as versões pela versão mais recente: Todas as versões de arquivo são substituídas apenas pela versão mais recente. O arquivo original, se presente, NÃO é substituído. • Adicionar versões mais recentes às versões existentes: A versão mais recente é adicionada às versões existentes, se estiver ausente. • Substituir tudo pelo original e todas as versões: Todos os arquivos são substituídos pelo arquivo original e todas as versões. • Substituir tudo pela versão original e a mais recente: Todos os arquivos são substituídos pelo arquivo original e a versão mais recente. • Substituir tudo pelas versões selecionadas (*): Todos os arquivos são substituídos apenas pelas versões selecionadas. Isso inclui o arquivo original (sem versão). • Substituir todas as versões pelas versões selecionadas (*): Todas as versões de arquivo são substituídas apenas pelas versões selecionadas. O arquivo original, se presente, NÃO é substituído. • Adicionar versões selecionadas às versões existentes (*): A versão selecionada é adicionada às versões existentes, se estiver ausente. • Substituir tudo pelo original e versões selecionadas (*): Todos os arquivos são substituídos pelos arquivos originais e versões selecionadas. - (*) As quatro opções que usam arquivos selecionados: a lista de arquivos selecionados vem da função {SELECIONAR ARQUIVOS}. Arquivos de álbum que não correspondem a nenhum arquivo selecionado permanecem no álbum. Apenas os arquivos que correspondem a um arquivo selecionado são alterados de acordo com as regras acima. A correspondência é baseada no nome do arquivo sem versão ou extensão: 'asdfg.png' e 'asdfg.v01.jpg' são uma correspondência. - Exemplo: Substituir todas as versões pelas versões selecionadas: Se o álbum tiver filename.jpg e filename.v02.png, e a lista de arquivos selecionados contiver filename.v04.jpg, o resultado no álbum atualizado será: filename.jpg e filename.v04.jpg - - TOPIC: APRESENTAÇÃO DE SLIDES +image: slide-show.jpg - ^Escalonamento Fracionário do Monitor Para alguns sistemas, o escalonamento fracionário causa problemas de desempenho nas animações da apresentação de slides do Fotocx. Desative isso e use outros meios para aumentar o tamanho da fonte para aplicativos, se necessário. Para o Fotocx, o tamanho da fonte está no menu {CONFIGURAÇÕES}. - Na caixa de diálogo da apresentação de slides (canto superior esquerdo), pressione [Selecionar Álbum] e escolha um álbum da lista fornecida. Altere as outras configurações na caixa de diálogo conforme desejado, então pressione o botão [Iniciar] para iniciar a apresentação de slides com a primeira imagem do álbum, ou [Retomar] para retomar uma apresentação de slides pausada, ou outra imagem selecionada clicando em sua thumbnail. Use a tecla escape para sair da apresentação de slides e retornar à caixa de diálogo. - Controles do Diálogo Principal • Tempo da Legenda: segundos para mostrar o título e a descrição. • Tempo da Imagem: segundos para mostrar apenas a imagem. • Limite de Corte %: corta as imagens até esse valor para eliminar margens. • Tela Cheia: Se marcado, as imagens são mostradas em tela cheia sem menu, etc. • Reprodução Automática: Se marcado, a apresentação de slides recomeçará após o fim. • Imagem Aleatória: Se marcado, usa ordem aleatória de imagens. Caso contrário, ordem do álbum. - Teclas do teclado podem ser usadas para controlar a apresentação de slides. Pressione [teclado] para ver. - As seguintes teclas do teclado são atribuídas a ações e não podem ser alteradas: • Escape: interrompe a apresentação de slides e retorna à caixa de diálogo principal. • Teclas de seta esquerda/direita: Você pode voltar e avançar a qualquer momento e a apresentação de slides continuará a partir dali. - As transições animadas entre imagens, e os tempos de exibição e comportamento de zoom das imagens individuais, podem ser personalizados usando as caixas de diálogo explicadas abaixo. - Pressione [transições] para iniciar uma caixa de diálogo para selecionar e personalizar as transições entre imagens. Estas incluem muitos métodos animados de substituição de imagem (ex.: a nova imagem se expande a partir do centro para substituir a imagem antiga). Selecione as transições a serem usadas e se elas são usadas aleatoriamente ou em sequência. O parâmetro de tempo define a duração da transição. Os parâmetros de preferência especificam uma preferência relativa que influenciará a frequência com que a transição é usada quando a sequência aleatória é selecionada. - Os botões [carregar] e [salvar] permitem que você salve as configurações de transição em um arquivo e as carregue posteriormente. Esses arquivos são independentes dos arquivos da apresentação de slides. Uma apresentação de slides usará por padrão as configurações de transição usadas pela última vez para essa apresentação (nome do álbum), mas você sempre pode substituí-las usando o botão [carregar] para carregar outras configurações, ou alterando-as na caixa de diálogo. - Pressione [arquivos de imagem] para iniciar uma caixa de diálogo para Preferências de Imagem (canto superior direito). Estas são opcionais. Uma imagem é selecionada para personalização clicando em sua thumbnail na exibição do álbum/galeria. A caixa de diálogo é preenchida com as configurações padrão ou as configurações anteriores para essa imagem nessa apresentação de slides. Digite as revisões e pressione [done], ou clique na próxima imagem a ser personalizada. - Preferência: Se a sequência de imagem aleatória for escolhida, este número dá uma preferência relativa para a imagem. O valor neutro é 10. Digite um novo valor para aumentar ou diminuir a probabilidade de este arquivo ser escolhido na sequência aleatória de imagens, ex.: um valor de 20 tornaria a probabilidade 2x maior. Um valor zero impediria a imagem de ser mostrada. A imagem também fica bloqueada por uma contagem de 1/3 das imagens no álbum, ou 10, o que for menor. - A caixa de diálogo mostra os eventos de imagem personalizáveis em ordem de tempo: • espera por um tempo especificado (pode ser zero). • mostra as seguintes tags de texto em paralelo: nome da imagem (nome base do arquivo) por tempo especificado, título da imagem, se houver, por um tempo especificado, descrição da imagem, se houver, por um tempo especificado. • espera um tempo especificado antes de iniciar um zoom de imagem (pode ser zero). • dá zoom na imagem do tamanho normal para ampliado ou o inverso, ao longo do tempo especificado. Se nenhuma opção for selecionada, não há zoom. • zoom-in: começa no tamanho normal, amplia a imagem enquanto move o centro do zoom para a posição especificada. • zoom-out: começa no tamanho ampliado no centro de zoom especificado, reduz a imagem de volta ao tamanho normal. • [zoom center] - pressione este botão, então clique na thumbnail da imagem para especificar o centro do zoom para a imagem. • espera por um tempo especificado após o zoom (pode ser zero) (o valor padrão é a configuração 'tempo da imagem' do diálogo principal). • transição para a próxima imagem, usando a transição especificada ou 'próxima' para indicar nenhuma preferência (selecionada aleatoriamente). - - TOPIC: MENU PERSONALIZADO +image: custom-menu.png - Isso permite que você reúna funções usadas com frequência de vários menus em um único menu personalizado. Você também pode adicionar entradas para abrir arquivos de imagem ou álbuns específicos. O menu também inclui funções de script e funções de plugin (veja abaixo). - A última entrada no menu, Editar Menu, abre um editor de texto para editar a própria lista de menu. Os nomes de menu devem corresponder exatamente aos nomes nos menus do Fotocx, mas a caixa (maiúsculas/minúsculas) não é significativa. - As entradas de menu podem ter os seguintes formatos: • # texto de comentário: um comentário que não faz nada • nomedomenu # dica popup: nome do menu do Fotocx e dica popup opcional • file : abre o arquivo nomeado • album : abre o álbum nomeado como galeria - As seguintes entradas estão presentes por padrão e você não deve alterá-las ou removê-las: Editar Script, Executar Script, Script em Lote, Plugins, Editar Menu. Os detalhes são explicados abaixo. - - TOPIC: ARQUIVOS DE SCRIPT Funções do Menu: • Editar Script - Realiza um conjunto de edições em um arquivo de imagem, registrando todas as funções e configurações em um arquivo de script nomeado. • Executar Script - Executa um arquivo de script usando o arquivo de imagem atual, como uma função de edição. • Script em Lote - Seleciona qualquer número de arquivos de imagem e executa um arquivo de script em todos eles, em modo de lote. - Arquivos de script permitem que você defina um conjunto de edições uma vez, e as repita em um ou vários arquivos de imagem posteriormente. - ^Funções de Edição Roteirizáveis Algumas funções de edição usam arrastos do mouse na imagem, ex.: todas as funções de distorção. Estas não são roteirizáveis porque os arrastos do mouse não são registrados. O uso dessas funções é bloqueado. - As seguintes funções são atualmente roteirizáveis: • Editar: Retocar, Margens, Modo de Cor, Preencher Área • Reparar: Nitidez, Desfoque Normal, Desfoque Gradual, Reduzir Ruído, Remover Névoa, Artefatos JPEG, Anti-Serrilhado, Ajustar RGB • Refinar: Achatar Histograma, Contraste Local, Amplificar Contraste, Retinex Global, Retinex Local, Contraste Local, Saturação, Foco Suave, Gradação de Brilho • Efeitos: Contornos, Esboço, Desenho Animado, Relevo, Ladrilhos1, Ladrilhos2, Pintura, Textura, Padrão, Dithering, Gravura, Definir Cores, Deslocar Cores, Kernel Personalizado - - TOPIC: EDITAR SCRIPT Na caixa de diálogo, pressione [iniciar]. Escolha um nome de arquivo para o script. Comece a editar o arquivo de imagem atual. Use as funções de edição desejadas em qualquer sequência. Cada edição é registrada no arquivo de script junto com todas as configurações de diálogo usadas. Quando terminar, pressione [close] para fechar o arquivo de script e salvá-lo com o nome de arquivo dado. - - TOPIC: EXECUTAR SCRIPT Escolha um dos seus arquivos de script salvos no menu popup. O script é executado usando o arquivo de imagem atual, como uma função de edição normal. - - TOPIC: SCRIPT EM LOTE Na caixa de diálogo, pressione [Selecionar Arquivos]. Selecione os arquivos a editar usando a caixa de diálogo padrão de seleção de arquivos {SELECIONAR ARQUIVOS DE IMAGEM}. Quando terminar, pressione [Selecionar Script]. Escolha um arquivo de script no menu popup. O script agora é executado em todos os arquivos escolhidos. Todas as imagens modificadas são salvas como novas versões. Se arquivos RAW forem processados, as saídas correspondentes são arquivos TIFF-16. - - TOPIC: PLUGINS +image: plugins.png - Funções de plugin são uma forma de usar outros editores de imagem dentro do Fotocx, ex.: Gimp. Você pode usar um editor de imagem RAW como o Rawtherapee e então realizar edições adicionais usando o Fotocx. - ^Procedimento de uso: • Abra o arquivo a ser processado no Fotocx • Inicie o menu de plugins e selecione o programa desejado, ex.: Gimp • O programa de plugin inicia e abre o arquivo passado pelo Fotocx • Realize as edições desejadas usando o programa de plugin • Quando terminar, salve o arquivo de saída com o mesmo nome do arquivo de entrada. A extensão do arquivo pode mudar. • Feche o programa de plugin. • O Fotocx abre o arquivo de saída do plugin como uma versão editada do arquivo atual. • Realize edições adicionais, ou salve o arquivo editado como uma nova versão ou novo arquivo. - Um exemplo de menu Plugins está à esquerda. A última entrada "Editar Plugins" inicia o aplicativo de edição de texto à direita. Use o editor de texto para definir os nomes do menu de plugins e os comandos para iniciar os programas de plugin correspondentes. O formato é: nomedomenu = comando-do-plugin %s TIP = explicação do comando acima O 'comando-do-plugin' é o comando shell para a função de plugin, e '%s' é onde o nome do arquivo atual é inserido no comando. Não coloque aspas ao redor do '%s' porque isso é adicionado automaticamente, permitindo que nomes de arquivo com espaços ou outros caracteres especiais sejam processados. O exemplo superior mostrado é um menu chamado "Gimp" que inicia o comando "gimp %s". O texto TIP é opcional. Se presente, está na linha seguinte ao nome do menu. Passar o mouse sobre a entrada do menu mostrará esse texto ao lado do texto do menu. - Alguns comandos podem esperar que tanto o arquivo de entrada quanto o de saída sejam especificados. Nesse caso, forneça '%s' em ambas as posições. Omita '%s' se o comando não processar um arquivo de imagem. - ^Selecionar Área Se o arquivo de entrada tiver uma área selecionada, apenas essa área será modificada. A função de plugin edita a imagem inteira, mas quando o resultado é processado pelo Fotocx, apenas as alterações na área selecionada são mantidas. - - TOPIC: ZOOM - ^Botão Zoom Clique com o botão esquerdo ou direito no botão para aumentar ou diminuir o tamanho da imagem em {VISUALIZAÇÃO DE ARQUIVO} ou o tamanho da thumbnail em {VISUALIZAÇÃO DA GALERIA}. Isso se aplica apenas se o modo de visualização da galeria for {VISUALIZAÇÃO EM THUMBNAILS}. Se for {VISUALIZAÇÃO DE METADATA}, nada é feito. - - TOPIC: ANTERIOR/PRÓXIMO - Clique com o botão esquerdo ou direito no botão para abrir o arquivo anterior ou o próximo na galeria atual. Você também pode usar as teclas de seta esquerda/direita. - - TOPIC: SALVAR ARQUIVO - +image: file-save.png - +image: file-save-as.jpg - Na primeira caixa de diálogo, selecione 'nova versão', 'novo arquivo', ou 'substituir arquivo'. - ^Nova Versão Salva o arquivo de imagem atual com um novo número de versão. Nomes de arquivo com números de versão são formatados "nomedoarquivo.vNN.ext" onde NN é um número de 01 a 99. Se o nome do arquivo não tiver versões, a versão .v01 será criada. Se versões do arquivo já estiverem presentes no disco, então o próximo número de versão superior é usado. Se o arquivo for um arquivo JPEG, a qualidade padrão é usada - veja {CONFIGURAÇÕES}. - ^Novo Arquivo A 2ª caixa de diálogo mostrada acima será aberta para salvar a imagem atual em um arquivo selecionado, que pode ser o arquivo original, outro arquivo existente, ou um novo arquivo. Um arquivo pode ser salvo nos formatos JPEG, PNG, JXL e TIFF. - Para JPEG, você pode escolher um valor de qualidade no intervalo de 1 a 100. Valores mais baixos geram arquivos menores e menor qualidade de imagem. Valores acima de 70 são difíceis de distinguir de 100 (qualidade máxima, maior tamanho de arquivo). A qualidade JPEG padrão é usada, a menos que você altere o valor na caixa de diálogo. O padrão vem de {CONFIGURAÇÕES}. Você não conseguirá ver diferença entre um arquivo salvo com qualidade 70 e um com 100, mas a diferença no espaço do arquivo é enorme. Áreas transparentes ficarão pretas. O JPEG não suporta transparência. - Arquivos PNG e TIFF são comprimidos sem perda de qualidade e são muito maiores que JPEG. Podem ser salvos com 8 ou 16 bits por cor. - Se 'tornar atual' estiver marcado, o arquivo salvo (novo nome de arquivo) se tornará o arquivo atual. - ^Substituir Arquivo Salva o arquivo de imagem atual de volta nele mesmo. - As ^permissões^ são copiadas do arquivo de entrada. Pressione o botão [Alterar] para editar as permissões. - - TOPIC: MENU DE METADATA - - Metadata é um dado em texto armazenado dentro de um arquivo de imagem. Câmeras digitais criam automaticamente alguma metadata, como data e hora, dados técnicos sobre a câmera e parâmetros da foto, e dados de localização (se a câmera tiver um receptor GPS). Outros dados podem ser adicionados pelo usuário, ex.: um título, descrição, avaliação, keywords. O Fotocx pode buscar em sua coleção de imagens usando qualquer metadata, junto com nomes de pasta e arquivo ou nomes parciais, produzindo uma galeria de imagens correspondentes. Na maioria dos casos, a busca é quase instantânea. - - TOPIC: VER META PRINCIPAL TOPIC: VER TODA A META +image: view-metadata.jpg - A função Ver Meta Principal exibe a metadata comumente útil para o arquivo de imagem atual. Isso inclui a data e hora de uma foto, velocidade do obturador, distância focal, tamanho da imagem, ISO, etc. Câmeras digitais armazenam esses dados na imagem. A metadata também pode conter dados adicionados por um usuário: keywords, título ou legenda, descrição, comentários adicionados pelo fotógrafo ou por um editor posterior (às vezes encontrados em imagens publicadas). - Se uma imagem for editada, um registro da edição é salvo na metadata. Ver Meta Principal mostra o histórico das edições feitas. - Ver Toda a Meta relata toda a metadata disponível, e pode incluir mais de 100 itens dos quais você provavelmente não se importa. - O botão [Extras] na janela Ver Meta Principal abre a caixa de diálogo mostrada à direita, onde você pode adicionar tags extras ao relatório. Qualquer tag disponível no relatório Ver Toda a Meta pode ser adicionada ao relatório resumido. Clique em uma tag na coluna esquerda para adicioná-la à coluna direita e ao relatório. Clique em uma tag na coluna direita para removê-la. Clique na entrada "Outra Tag ..." para digitar qualquer nome de tag não contido na lista padrão, que é limitada às tags mais prováveis de serem necessárias. - O Fotocx usa estas tags de metadata para edição e busca de imagens: • Título - título curto da imagem • Descrição - descrição da imagem • Data/Hora Original - data/hora da foto • Avaliação - de 0 a 5 estrelas • País - do GPS da câmera ou adicionado manualmente • Localização - o nome EXIF é a cidade • Geotags - latitude/longitude • Keywords - identificadores de imagem definidos pelo usuário • Dados da câmera - marca, modelo, lente • Dados de exposição - tempo, número F, distância focal, ISO Essas tags são editadas usando a função {EDITAR META PRINCIPAL}. Quaisquer outras tags também podem ser editadas e buscadas, usando métodos menos convenientes explicados abaixo. - Também existem várias funções em lote para adicionar dados a muitos arquivos de imagem de uma vez. Veja {MENU DE LOTE}. - - TOPIC: VISÃO GERAL DE KEYWORDS Arquivos de imagem podem ter keywords de identificação ou classificação. Elas podem ser usadas para buscar em uma grande coleção de imagens por imagens que tenham as keywords desejadas. Keywords típicas: assunto, evento, localização, pessoas ou coisas, etc. As keywords residem dentro da metadata da imagem. As keywords são normalmente uma única palavra, mas uma frase curta com espaços incorporados ou outros delimitadores pode ser usada. Vírgulas e ponto e vírgula são usados como delimitadores entre keywords, e portanto não podem ser usados dentro de uma keyword (um padrão externo). Uma keyword composta como "paisagem do arizona" é permitida, mas você deveria usar duas keywords em vez disso para maior flexibilidade: você pode buscar imagens que tenham qualquer uma das keywords ou ambas as keywords. - Todas as imagens que tenham uma keyword ou keywords desejadas podem ser encontradas rapidamente e exibidas em uma janela de galeria. Se você tiver usado nomes de pasta e arquivo de forma significativa, você também pode buscar imagens usando esses nomes. Você também pode buscar imagens por data, avaliação, localização, e outras tags de metadata. Estas não precisam estar duplicadas nas keywords. Veja {BUSCAR IMAGENS} abaixo. - ^Sistema de Keywords Gerenciado Isso é apropriado se você deseja planejar seu sistema de keywords antes de adicionar keywords às suas imagens. Neste sistema, você cria um número limitado de categorias de keywords (ex.: pessoas, lugares, coisas, eventos, arte, paisagens ...). Keywords podem ser criadas e atribuídas a uma categoria conforme necessário quando as keywords são atribuídas às imagens. Uma imagem recebe uma keyword apontando e clicando na lista de keywords disponíveis, que é organizada por categoria e alfabeticamente dentro da categoria. Se uma nova keyword for necessária, ela é criada quando atribuída pela primeira vez a uma imagem. O número de keywords dentro de uma categoria idealmente deve ser inferior a cerca de 200, para que a localização visual em uma lista de seleção seja razoavelmente rápida. - ^Vantagens do sistema de keywords gerenciado • evita nomes de keywords inconsistentes (ex.: 'paisagem' e 'cenário') • evita grafias alternativas e erros de digitação (ex.: susan, susy, susna) • evita keywords que incluem outras keywords (ex.: cenário, lago) • a busca é mais confiável porque as keywords não têm os erros acima • ao atribuir keywords, você tem uma visão geral das keywords disponíveis, em vez de milhares de keywords caóticas em um sistema não gerenciado - Escolher keywords de uma lista grande pode ser lento. Isso é mitigado de 3 formas: • Até cerca de 10 keywords usadas mais recentemente são mostradas na caixa de diálogo de edição de metadata, onde podem ser facilmente vistas e escolhidas. Como uma série de fotos feitas ao mesmo tempo provavelmente compartilhará muitas keywords, adicionar keywords fica mais fácil e rápido. • Você pode simplesmente começar a digitar o nome de uma keyword desejada. Uma lista popup de keywords correspondentes aparece assim que houver apenas algumas poucas correspondências possíveis. Você pode então clicar na keyword desejada para adicioná-la à imagem. Se não houver keywords correspondentes, você tem a opção de adicionar a nova keyword à lista de keywords definidas. • Você pode escolher uma categoria para exibir uma lista de seleção menor. - Se as keywords forem amplamente definidas e em menor número, os resultados de busca para keywords serão maiores, mas encontrar as imagens desejadas visualmente pode ser bem rápido. A ordem física dos arquivos é preservada: arquivos de imagem localizados juntos em suas pastas também aparecerão juntos nos resultados da busca. - Imagens baixadas da internet frequentemente contêm keywords. Estas, é claro, não têm organização e são coletivamente caóticas. Se você usa um sistema de keywords gerenciado, o melhor é revisar essas imagens e organizar as keywords para que estejam de acordo com seu sistema, ou excluí-las. Quaisquer novas keywords presentes serão automaticamente adicionadas sob a categoria "nocatg". Se você notar keywords indesejadas em sua lista de keywords, use {BUSCAR IMAGENS} por keyword para encontrar as imagens com keywords indesejadas para que possam ser corrigidas ou removidas. - ^Sistema de Keywords Aleatório Você pode preferir inventar keywords conforme necessário, sem nenhum sistema específico em mente. Ou você já pode ter milhares de keywords, tornando difícil a conversão para um sistema de keywords gerenciado (mas não impossível: o Fotocx pode converter nomes de keywords em massa). Nesse caso, você pode simplesmente digitar keywords em suas imagens, criando novas keywords conforme necessário. Ainda há alguma capacidade de manter as keywords organizadas: keywords existentes que correspondem aos caracteres digitados são mostradas assim que houver apenas algumas poucas correspondências possíveis. Exemplo: você digita "new" e uma lista de keywords é mostrada: New York, New Delhi, Newman ... Se uma dessas for sua intenção, clique nela para selecionar a keyword. Se não, continue digitando e eventualmente pressione Enter para criar uma nova keyword. Ao buscar imagens por keywords, você pode digitar os nomes de keywords desejados ou escolhê-los na lista de keywords disponíveis. As keywords disponíveis que correspondem às primeiras letras digitadas são mostradas, e você pode escolher nessa lista. Você não pode inserir uma keyword de busca que não exista em algum lugar em suas imagens. Um sistema de keywords aleatório provavelmente resultará em milhares de keywords. Isso pode não ser muito útil. - - TOPIC: GEOTAGS OVERVIEW Câmeras modernas podem registrar a localização de cada foto, usando um receptor GPS interno. Latitude, longitude (e possivelmente cidade/local e país) são registrados na metadata EXIF do arquivo de imagem. A função {EDITAR META PRINCIPAL} também permite que os dados de localização sejam inseridos ou revisados. Localizações também podem ser especificadas clicando em um mapa mundial com zoom. Funções para encontrar imagens de uma localização ou região especificada: • {BUSCAR IMAGENS}: Busca por nome de local (também múltiplos nomes, correspondências parciais). • {LOCAIS/DATAS}: Busca por país, local e grupos de data • Imagens por Localização no Mapa: Clique em um marcador do mapa para mostrar todas as imagens naquele local. - Nomes de localização (cidade ou outro nome de lugar, e país) do GPS da câmera não são padronizados e podem ser caóticos (ex.: Munich, München, MONACO). Como lidar com isso é discutido abaixo. - - TOPIC: EDITAR META PRINCIPAL +image: edit-meta.jpg - A função Editar Meta Principal é usada para adicionar metadata básica a uma imagem. Por favor, leia {VISÃO GERAL DE KEYWORDS} e {GEOTAGS OVERVIEW} (acima) antes de usar Editar Meta Principal. - Editar Meta Principal é usado para editar a metadata mais frequentemente usada: data e hora da imagem, avaliação, título, descrição, dados de localização, e keywords. A caixa de diálogo inicialmente mostra os dados da imagem atual. Após fazer adições ou alterações, pressione [Aplicar] para atualizar o arquivo de imagem. Não há versionamento automático de arquivo para alterações de metadata, mas você pode usar Salvar Arquivo > Nova Versão se desejar. - A caixa de diálogo mostra a metadata da imagem atual na Visualização de Arquivo, ou de uma thumbnail clicada na Visualização da Galeria. A caixa de diálogo de edição se atualiza quando uma nova imagem é aberta ou uma nova thumbnail é clicada. - A data da imagem, se disponível, é mostrada como Data da Imagem. Ela pode ser inserida se estiver ausente, ou alterada. Você pode inserir uma data completa no formato aaaa:mm:dd ou um formato mais curto aaaa ou aaaa:mm. Um mês/dia ausente é logicamente equivalente a 01:01 quando comparado com um limite inferior para busca, ou 12:31 quando comparado com um limite superior. O botão [Anterior] preenche a data a partir do dado inserido anteriormente. Isso é para permitir a datação fácil de uma série de imagens. Se o horário for importante, você pode adicionar um horário usando o formato hh:mm[.ss]. O formato completo de entrada é: aaaa:mm:dd hh:mm:ss - Você pode inserir um título, descrição, e uma avaliação (0-5 estrelas) para a imagem. Para editar o título ou a descrição, pressione o botão [editar] correspondente. Isso abrirá um editor de texto com um limite grande para o tamanho do texto. Você pode usar a tecla [enter] para uma quebra de linha deliberada. No Fotocx, essas quebras de linha funcionarão; em outros visualizadores de imagem, elas podem ser substituídas por pontos. - As keywords existentes são mostradas em Keywords da Imagem. As keywords disponíveis são mostradas na janela Keywords Definidas abaixo. Uma dessas keywords pode ser adicionada à imagem clicando nela. Uma keyword pode ser excluída da imagem clicando nela em Keywords da Imagem. Keywords adicionadas recentemente são mostradas em Keywords Recentes. Isso é uma conveniência para facilitar a adição de keywords a um novo lote de imagens, já que muitas das mesmas keywords serão usadas novamente. Aponte e clique da mesma forma. - Se a lista de keywords definidas for longa, pode ser mais fácil digitar a keyword desejada em Digite a Keyword. As keywords existentes que correspondem ao que você digitou até agora aparecem em Keywords Correspondentes, e você pode clicar em uma delas para adicionar a keyword à imagem. Se a keyword inserida for nova (nenhuma keyword correspondente é mostrada), pressione [adicionar nova keyword] quando a keyword estiver completa. Ela será adicionada à imagem e à lista de keywords definidas com a categoria "nocatg". - Se você estiver usando categorias de keywords, você pode selecionar uma categoria, e apenas essas keywords serão mostradas na lista de keywords definidas. - O botão [Aplicar] grava os dados no arquivo de imagem e no arquivo de índice de metadata usado para buscar imagens. - O botão [Anterior] (na parte inferior da caixa de diálogo) pode ser usado para carregar todos os dados disponíveis da imagem visualizada ou editada anteriormente. Isso pode ser usado para acelerar o processamento de um grupo de imagens que compartilham muitos dos mesmos dados. - ^Adicionando Geotags Existem várias maneiras de adicionar nomes de localização e geocoordenadas na caixa de diálogo {EDITAR META PRINCIPAL}. - GPS da Câmera O sensor GPS da sua câmera pode ter inserido nomes de localização e geocoordenadas. O idioma pode não ser o que você deseja, ou letras totalmente maiúsculas podem ser usadas, ou algum outro caos. Use o botão [clear] para recomeçar, e insira o novo texto. - Botão [Buscar] Busca por uma localização presente em qualquer lugar em seus arquivos de imagem ou em uma enorme lista de localizações conhecidas (worldcities.txt). Digite alguns caracteres iniciais em Localização e pressione [Buscar]. Se uma lista de seleção de localizações correspondentes for mostrada, escolha uma. Se nada for mostrado, use [Mapa] para clicar em um local no mapa. Revise os nomes de localização e país se necessário. Esta localização agora é conhecida e está disponível para escolha. - Botão [Anterior] Se a imagem sendo editada tiver os mesmos dados de localização que a imagem editada anteriormente, pressione [Anterior] para preencher os dados de localização usados antes. - Você pode usar {GEOTAGS EM LOTE} para adicionar dados de localização a muitos arquivos de imagem de uma vez. - - TOPIC: EDITAR QUALQUER META +image: edit-any-metadata.png - Esta é uma caixa de diálogo para editar qualquer metadata do arquivo de imagem atual. As tags mais comuns para edição estão listadas à esquerda. Pressione o botão [Lista Completa] para obter uma lista de todas as tags disponíveis para o arquivo de imagem atual (pode haver centenas delas). Pressione [Lista Curta] para voltar à lista de tags comuns. Clique em uma tag na lista para recuperar o valor atual da tag. Altere o valor se desejado e pressione [atualizar]. Para editar um nome de tag que não está na lista, digite o nome da tag e pressione [buscar] para recuperar o valor atual, se houver. Então digite ou altere o valor e pressione [atualizar]. Para excluir uma tag, pressione [excluir]. Você pode digitar o nome da tag em minúsculas e com ou sem espaços, ex.: "Subject Distance" e "subjectdistance" funcionarão ambos. Algumas tags não podem ser alteradas, ex.: 'largura da imagem' é a largura em pixels da imagem, que só pode ser alterada mudando a largura em pixels da imagem. A fonte para a lista curta é o arquivo de texto /meta_picklist. Você pode adicionar ou remover tags dessa lista. - - TOPIC: EXCLUIR META Especifique o nome da tag a excluir, ou selecione Tudo. A metadata é excluída. Use Tudo para limpar uma imagem de qualquer informação de identificação que possa estar presente. Algumas tags não podem ser excluídas, ex.: Nome do Arquivo. - - TOPIC: COPIAR META Imagens combinadas criadas com o Fotocx (HDR, panorama, mashup ...) não conterão metadata por padrão. Use esta função para copiar metadata de uma das imagens de entrada, ou de qualquer outra imagem. Use os botões [Procurar] para escolher um arquivo de origem da metadata e um arquivo para receber a metadata ("arquivo de destino" na caixa de diálogo). - - TOPIC: CORRIGIR META Use esta função se você tiver um arquivo de imagem que produz uma mensagem de erro ao tentar editar a metadata. Ela excluirá a metadata malformada e manterá o restante. - - TOPIC: GERENCIAR KEYWORDS +image: manage-keywords.png - Crie keywords e, opcionalmente, agrupe-as em categorias. Você pode atribuir categorias a keywords para ajudar a organizá-las e localizá-las mais rapidamente ao adicionar keywords a imagens. Elas são opcionais e não desempenham nenhum papel na busca por keywords: apenas a keyword é armazenada em uma imagem, não sua categoria. Categorias típicas são pessoas, lugares, coisas, eventos, paisagens, edifícios, arte, etc. Para adicionar uma nova keyword com uma nova categoria, digite a categoria e a keyword, então clique em [create]. Se a categoria estiver em branco, a keyword será atribuída a "nocatg". Para atribuir uma keyword a uma categoria diferente, clique em uma categoria (texto em negrito) ou digite uma nova, clique na keyword, e pressione [create]. A keyword será movida da categoria antiga para a nova. Para excluir uma keyword, clique na keyword e pressione [excluir]. Keywords usadas em imagens mas não atribuídas a uma categoria aparecerão sob "nocatg". Uma Categoria sem keywords atribuídas pode ser excluída - clique na categoria, limpe o nome da keyword se presente, pressione [excluir]. - Nota: uma keyword recém-criada é adicionada ao final da lista de keywords de sua categoria. Na próxima vez que o Fotocx for iniciado, todas as categorias e suas listas de keywords são classificadas em ordem alfabética, exceto que "nocatg" está sempre por último. - - TOPIC: LEGENDAS +image: choose-captions.png - ^Menu Escolher Legendas Escolha quais tags de metadata usar para as legendas de texto exibidas no canto superior esquerdo da imagem no modo de visualização de arquivo. - ^Menu Alternar Legendas Alterna a exibição de legendas LIGADO ou DESLIGADO. Atribua um atalho de teclado para ativar ou desativar rapidamente a exibição de legendas. - ^Nota:^ mover o mouse para o canto superior esquerdo de uma imagem na visualização de arquivo mostrará o título e a descrição em uma imagem popup. A imagem desaparece quando o mouse é afastado. - - TOPIC: LOCAIS/DATAS +image: image-locations.jpg - Esta é uma forma rápida de encontrar todas as fotos feitas em um determinado local ou local e intervalo de datas. Na caixa de diálogo, escolha entre as duas opções: incluir todas as imagens no relatório, ou incluir apenas imagens encontradas pela função de Busca anterior. Então selecione o nível de agrupamento desejado: país país e local país e data país e local e data data e país data e país e local - Se a data estiver incluída, selecione um intervalo de dias para consolidação: fotos com datas dentro do intervalo serão agrupadas sob a primeira data. Pressione [proceed] para obter um relatório mostrando a contagem de imagens em cada grupo: por país, país e local, etc. Esta também é a ordem de classificação. No exemplo acima, 28 fotos são da Nova Zelândia em 02.11.2004. Clique em uma linha no relatório para obter uma galeria de thumbnails dessas imagens. - - TOPIC: LINHA DO TEMPO +image: timeline-report.jpg - Este relatório produz uma linha do tempo de contagens de imagens por mês. Escolha entre as duas opções: incluir todas as imagens no relatório, ou incluir apenas imagens encontradas pela função de Busca anterior. Clique em um ano e mês no relatório resultante para obter uma galeria de thumbnails de todas as imagens com uma data de foto (EXIF) no mês selecionado. O exemplo acima mostra 208 imagens para out. de 2017. O ano 'null' é para imagens sem data de foto. - - TOPIC: TAGS DE METADATA Esta função encontra todos os arquivos de imagem que usam uma tag e valor de metadata especificados. Selecione uma tag na lista popup: avaliação, keywords, título, descrição, câmera, metadata extra indexada - veja {INDEXAR ARQUIVOS}. Uma lista dos valores de tag disponíveis é mostrada, junto com o número de arquivos de imagem que usam esse valor de tag. Para 'título' e 'descrição', apenas os primeiros 60 caracteres são mostrados, e todos os arquivos são relatados que usam valores de tag correspondentes a esses 60 caracteres iniciais. Para 'câmera' o valor de correspondência é uma combinação de marca, modelo e lente. - - TOPIC: BUSCA AUTOMÁTICA Esta função pode ser usada por arquivos de script shell para extrair arquivos de imagem que atendam a qualquer um dos critérios de seleção disponíveis ao usar a função Buscar Imagens (veja abaixo). Primeiro, use a função Buscar Imagens para definir os critérios de seleção desejados (ex.: nomes de pasta/arquivo, datas, keywords, ou outra metadata). Use o botão [salvar] para salvar os critérios em um arquivo de configurações. Use o seguinte comando para iniciar o Fotocx e realizar a busca: $ fotocx -m autosearch . A saída vai para /search_results. - - TOPIC: BUSCAR IMAGENS Use a função Buscar Imagens para encontrar imagens com qualquer metadata desejada (data, keywords, localização ...). Um arquivo de índice de metadata é usado para a busca, o que torna possível buscar milhares de imagens por segundo. - Existem dois formatos de relatório: uma galeria de thumbnails mostrando todas as imagens que correspondem aos critérios de busca, ou um relatório de metadata que combina thumbnails com texto de metadata. Aqui está um exemplo do formato de relatório de metadata: +image: search-images-metadata.jpg - ^Caixa de Diálogo de Busca +image: search-images.jpg - Na caixa de diálogo, selecione quais imagens buscar, todas (todas as imagens) ou o conjunto atual, ou seja, as imagens na galeria atual, que pode ser uma pasta, álbum, ou os resultados de uma busca de imagem anterior. - Em seguida, escolha o que fazer com as imagens correspondentes encontradas: 'novo conjunto' significa substituir o conjunto atual pelas imagens encontradas, 'adicionar' significa adicioná-las ao conjunto atual (galeria), e 'remover' significa removê-las do conjunto atual. Para remover imagens, você deve buscar no conjunto atual. - Para arquivos que correspondem aos critérios de seleção, você pode adicionalmente especificar quais versões são selecionadas: original, última versão, ou todas as versões. 'original' significa a imagem original ou não modificada (ou a primeira versão se o original não foi salvo). 'última versão' significa a versão mais recente ou última editada disponível. 'todas as versões' significa que o original e todas as versões serão recuperados. - Selecione o tipo de relatório desejado. O relatório de galeria é uma página de imagens em thumbnail, tão longa quanto necessário para conter todas as imagens que correspondem aos critérios de busca. O relatório de metadata tem tanto imagens em thumbnail quanto uma lista de tags de metadata ao lado de cada thumbnail. Isso inclui as tags padrão (data, avaliação, keywords, geotags, título, descrição) e quaisquer outras tags de metadata que você adicionou na lista de seleção de tags (veja abaixo). - Insira seus critérios de busca. Selecione as keywords desejadas, datas, avaliações em estrelas, palavras contidas no texto (título ou descrição da imagem), nomes de arquivo ou pasta, e nomes de localização. Veja mais detalhes abaixo. - As keywords disponíveis são mostradas em Keywords Definidas e podem ser escolhidas com apontar e clicar. Se a lista de keywords definidas for longa, pode ser mais fácil começar a digitar uma keyword em 'digite a keyword'. As keywords existentes que correspondem ao que foi digitado até agora aparecerão na lista de 'correspondências', e você pode clicar em uma delas para adicionar a keyword à lista de busca. - Se você estiver usando categorias de keywords, você pode selecionar uma categoria, e apenas essas keywords serão mostradas na lista de keywords definidas. - Um intervalo de datas pode ser inserido para restringir a busca a imagens dentro do intervalo de datas. Escolha data da foto (da câmera) ou data do arquivo (data de criação ou última modificação). O formato é aaaa:mm:dd. São selecionadas as imagens que têm uma data igual ou posterior à primeira data, se presente, e igual ou anterior à segunda data, se presente. Mês/dia ausentes assumem o padrão 01/01 para o limite inferior de data e 12/31 para o limite superior. Horários podem opcionalmente ser especificados usando o formato aaaa:mm:dd hh:mm. Horários ausentes assumem o padrão 00:00 e 23:59. - Para buscar imagens sem data de foto EXIF (ex.: imagens escaneadas), use "null" na primeira entrada de data. - Um par de avaliações em estrelas pode ser inserido para restringir os resultados a imagens com uma avaliação dentro do intervalo dado. Um valor mínimo ausente implica 0 estrelas, e um valor máximo ausente significa a avaliação mais alta, 5 estrelas. - Nomes de pasta e arquivo podem ser buscados. No campo buscar nomes de arquivo, digite qualquer número de nomes usados para suas pastas e arquivos de imagem, separados por vírgulas. Uma entrada "egypt cairo" corresponderia a todos os nomes de pasta ou arquivo de imagem contendo qualquer uma dessas strings. Substrings também corresponderão. A caixa (maiúsculas/minúsculas) não importa. - Título e descrição da imagem podem ser buscados. Digite as palavras a buscar no campo buscar título/desc, separadas por vírgulas. Estas serão comparadas a cada palavra no título e descrição de todas as imagens, e as imagens correspondentes são selecionadas. A caixa (maiúsculas/minúsculas) não importa. - Para buscar localizações, digite um ou mais nomes de cidade/local ou país no campo buscar localizações, separados por vírgulas. Apenas arquivos de imagem com geotags correspondentes a uma das localizações inseridas serão selecionados. Uma localização pode ser uma cidade, parque ou outro nome geográfico (o que estiver armazenado nos campos de metadata 'Cidade' e 'País'). A caixa (maiúsculas/minúsculas) não importa. - Os botões de opção 'todos' e 'qualquer' se aplicam a keywords, texto, nomes de arquivo, e localizações. Você pode selecionar imagens que tenham TODAS as strings inseridas, ou QUALQUER uma das strings inseridas. Exemplo: se o campo de busca de localização for "new york" e "qualquer" estiver selecionado, imagens de New Zealand e York, Inglaterra seriam incluídas. Se "todos" estiver selecionado, apenas imagens localizadas em New York seriam incluídas. - Se você deseja encontrar imagens com dados ausentes, você pode digitar "null" como um valor de correspondência. - ^Buscar Metadata Adicional Usando as entradas de diálogo 'nome da tag', 'condição', e 'valores de correspondência' você pode especificar tags de metadata adicionais para usar como critérios de seleção, ou para serem adicionadas à saída do relatório se o tipo de relatório "metadata" for escolhido. As tags disponíveis para um determinado arquivo de imagem podem ser mostradas com {VER TODA A META}. Estas incluem muitas tags não presentes na caixa de diálogo principal. A lista de seleção vem do arquivo de texto /meta_picklist. Você pode adicionar tags a este arquivo se desejar. Você pode usar tags que também estão presentes na caixa de diálogo principal. A vantagem aqui é que uma lógica de correspondência mais flexível pode ser usada. - A lógica de correspondência pode ser selecionada para cada tag de metadata. ^método de correspondência valor de correspondência para seleção • report qualquer valor, também ausente • reportx valor não ausente • matches valores de texto separados por vírgula • contains o mesmo, com correspondência de substring • number = valores iguais • number => valores iguais ou maiores • number <= valores iguais ou menores - Os botões [X] no lado direito podem ser usados para limpar tags de busca de metadata individuais. - ^Botões da Caixa de Diálogo [Carregar] e [Salvar] podem ser usados para carregar ou salvar critérios de busca de um arquivo. [Limpar] limpará todos os dados na caixa de diálogo. [Continuar] iniciará o processo de busca. - Pressione o botão [proceed] para realizar a busca. A saída é uma galeria padrão de thumbnails, ou o formato de relatório de metadata mostrado acima. Você pode salvar as imagens buscadas como um álbum permanente - veja {ÁLBUNS}. - ^Desempenho A busca e o relatório de metadata indexada são quase instantâneos. A velocidade para metadata não indexada depende da velocidade do computador e do disco. Um computador potente com disco SSD pode buscar mais de 100 mil arquivos por minuto. - ^search_results^ (álbum) A saída de Buscar Imagens é salva no álbum "search_results". Renomeie este álbum se você quiser evitar que uma busca posterior o substitua. - Limitação: A função de busca é limitada a 40.000 resultados (imagens encontradas que atendem aos critérios de busca). Se esse limite for excedido, você é notificado e a busca é truncada. Esse limite existe porque o tamanho de uma janela com rolagem no GTK é limitado, e uma tentativa de criar uma janela maior pode resultar em uma falha ou travamento. - - TOPIC: MENU DE SELEÇÃO - - TOPIC: VISÃO GERAL DA ÁREA As funções de edição normalmente se aplicam à imagem inteira, mas é possível editar parte de uma imagem (uma "área") e deixar o restante inalterado. Se uma área da imagem foi selecionada, então a maioria das funções de edição funcionará apenas dentro dessa área. Algumas funções (ex.: Redimensionar) ignoram uma área selecionada. Uma área pode ser selecionada antes de iniciar uma função de edição, ou enquanto uma função de edição está sendo usada. A área selecionada é imediatamente ativa, as edições anteriores são mantidas, e futuras edições se aplicarão apenas dentro da área. Se outra edição for iniciada, a área selecionada permanece ativa, então é possível realizar uma série de edições dentro de uma área. Uma área também pode ser múltiplas áreas desconectadas na imagem. - O Fotocx usa 'áreas' em vez de 'camadas'. Em vez de selecionar algo da imagem, criar uma camada separada a partir da seleção, editar a camada e finalmente mesclar a camada, você seleciona algo na imagem, realiza funções de edição na seleção, e você vê o resultado final imediatamente. Áreas também podem ser salvas, coladas em outra imagem, movidas e redimensionadas, e editadas ainda mais. - +image: edit-selection.jpg - Editar uma área selecionada às vezes pode resultar em bordas visíveis nas margens da área (às vezes essas correspondem a bordas de características na imagem, e portanto não são um problema). Você pode mesclar bordas usando {MESCLAR ÁREA}: as edições podem ser aplicadas gradualmente da borda da área para dentro, e você pode selecionar quais bordas são mescladas. - - TOPIC: SELECIONAR ÁREA +image: select-area.jpg - A caixa de diálogo Selecionar Área começa com o menu Selecionar > Selecionar Área. Selecione um dos métodos explicados abaixo. Cada método seleciona áreas da imagem de uma forma diferente. Você pode mudar de método a qualquer momento, e as áreas selecionadas se acumulam. Um contorno da(s) área(s) de imagem selecionada(s) é mostrado conforme você adiciona ou remove áreas da seleção. O botão [Concluir] é usado para mapear os pixels da imagem dentro dos contornos da área, deixando-os prontos para aplicar funções de edição subsequentes. O botão [Ocultar] oculta o contorno da área, dando a você melhor visibilidade das edições e possíveis efeitos de borda da área. Use o botão [Mostrar] para mostrar o contorno da área. O botão [Limpar] remove todas as seleções de área. A caixa de diálogo de seleção de área pode ser cancelada e reiniciada mais tarde para modificar áreas existentes ou adicionar novas. - ^Métodos Os seguintes métodos são usados para envolver um ou mais espaços da imagem que pertencerão à área final. Esses métodos podem ser usados em qualquer sequência para definir espaços que sejam unidos ou separados. • Retângulo - arraste para contornar uma área retangular • Elipse - arraste para contornar uma área circular ou elíptica • Desenho à Mão Livre - contorne uma área desenhando com o mouse • Seguir Borda - contorne seguindo as bordas de características da imagem • Selecionar área dentro do mouse - arraste para selecionar pixels dentro de um círculo ao redor do ponteiro do mouse. • Selecionar uma cor dentro do mouse - selecione apenas pixels que correspondam a uma cor dada, correspondência de 0-100%. • Selecionar todas as cores dentro do mouse - selecione todos os pixels dentro do mouse, estenda a seleção para áreas adjacentes com cores correspondentes às cores dentro do mouse (às vezes chamado de 'preenchimento'). - Os parágrafos a seguir explicam os detalhes de cada método. - ^Retângulo Arraste o mouse de um canto ao canto oposto de uma área retangular a selecionar. Um retângulo é desenhado para envolver a área. Clique com o botão direito para excluir e recomeçar. Repita o processo para selecionar mais áreas retangulares. - ^Elipse Isso funciona da mesma forma que a seleção de retângulo, exceto que a área envolvida é um círculo ou elipse. O local onde o arraste começa é o centro da elipse resultante. O ângulo do arraste determina o formato da elipse. - ^Desenho à Mão Livre Arraste o mouse (botão esquerdo pressionado) para desenhar uma linha à mão livre, ou clique com o botão esquerdo para conectar uma linha reta do último ponto desenhado ao ponto clicado. Continue ao redor da área alvo até que ela esteja cercada por curvas e linhas conectadas. Clique com o botão direito para remover linhas anteriores (erros). Um clique com o botão direito removerá a última linha clicada ou arrastada, até 50 pixels. Clique com o botão direito repetidamente para remover mais. Uma nova linha clicada sempre se conectará ao final da linha anterior. Uma nova linha arrastada se conectará à linha anterior se for iniciada perto do final dessa linha. Se for iniciada em outro lugar, uma linha desconectada será desenhada. Você pode iniciar um novo arraste de longe e desenhar de volta para encontrar a linha anterior. Se uma linha clicada se conectar a um ponto indesejado (ou seja, você não quer se conectar à última linha desenhada), clique com o botão direito para apagá-la e então use o arraste para iniciar uma nova sequência de linhas. Um arraste com o botão direito pode ser usado para apagar segmentos de linha: arraste com o botão direito próximo a uma linha para apagá-la, então arraste com o botão esquerdo para redesenhar a linha. No final, uma área deve estar totalmente envolvida, sem lacunas. Linhas que se sobrepõem um pouco nas extremidades estão OK. Lacunas podem ser difíceis de encontrar e corrigir, então trabalhe com o tamanho de imagem de 100% ou maior e seja cuidadoso. Uma série de linhas automaticamente conectadas com cliques esquerdos não deixará lacunas, mas o desvio dessa sequência provavelmente criará lacunas. Para reduzir a possibilidade de lacunas, use sobreposições deliberadas ao conectar linhas manualmente. Existe um utilitário de detecção de lacunas descrito abaixo - {ENCONTRAR LACUNA NA ÁREA}. Se uma borda de área também for uma borda da imagem, você não precisa desenhar essa parte da área. Desenhe a linha para fora da borda da imagem, e desenhe-a de volta para a imagem em outra posição ao longo da borda da imagem. - ^Seguir Borda Pixels de alto contraste (provavelmente bordas de características da imagem) entre o último ponto desenhado e uma posição recém-clicada são encontrados e conectados. Isso é eficaz para bordas nítidas que não são muito irregulares. Bordas difusas e irregulares podem não funcionar bem e o desenho à mão livre será necessário se alta precisão for necessária. As regras para conectar linhas são as mesmas explicadas acima. Arrastar o mouse em vez de clicar funciona como desenho à mão livre, mas com uma tendência a seguir bordas de características a partir de uma posição ligeiramente atrás do mouse. Para bordas muito irregulares (cabelo, folhagem), veja 'cor de deseleção', abaixo. - ^Raio do Mouse e Nível de Combinação de Cor Estes dois controles se aplicam apenas aos métodos 'selecionar dentro do mouse' descritos abaixo. O raio do mouse define o tamanho de um círculo ao redor do ponteiro do mouse. Pixels dentro do círculo são selecionados, ou eles fornecem um conjunto de cores para combinar e selecionar pixels a partir do círculo do mouse para fora. O nível de combinação define um nível de correspondência necessário (0-100%) para selecionar pixels com base em sua cor e brilho. '0' significa que qualquer coisa corresponde, e '100' significa que uma correspondência perfeita é necessária. - ^Selecionar área dentro do mouse Clicar ou arrastar com o botão esquerdo selecionará os pixels envolvidos pelo círculo do mouse. Um clique com o botão direito desmarcará a última seleção (repita para desmarcar mais). Um arraste com o botão direito desmarcará os pixels envolvidos. - ^Selecionar uma cor dentro do mouse Clique na imagem para selecionar uma cor. A cor é mostrada no botão de cor. Você também pode usar o botão para definir uma cor diretamente. Arraste com o botão esquerdo/direito para selecionar/desmarcar pixels dentro do círculo do mouse que correspondam à cor selecionada dentro do nível de combinação. Ajuste o nível de combinação para baixo ou para cima para corresponder a uma faixa maior ou menor de cores. Clique conforme necessário na imagem para alterar a cor a ser correspondida. - ^Cor de deseleção opcional Isso se aplica apenas a 'selecionar uma cor' acima. Clique com o botão esquerdo na imagem para definir uma cor de deseleção. Quando a caixa está marcada, a cor de deseleção está ativa. Se um pixel corresponder melhor à cor de deseleção do que à cor de seleção, o pixel é desmarcado. Ao selecionar ao longo de uma borda de característica com baixo contraste de cor em comparação com uma área adjacente que deve permanecer não selecionada, defina a cor de deseleção a partir da área adjacente. Isso é útil para seleção precisa de uma borda complexa, como cabelo ou folhagem. - ^Selecionar todas as cores dentro do mouse Isso é chamado de 'preenchimento' (flood) em alguns editores. Arraste com o botão esquerdo/direito para selecionar/desmarcar pixels dentro do círculo do mouse. Pixels além do círculo do mouse também são incluídos se atenderem a estas duas condições: 1) sua cor corresponde a qualquer cor dentro do círculo do mouse, dentro do nível de combinação atual. 2) eles estão dentro do intervalo de busca do ponteiro do mouse. Isso é um fator do raio do mouse, ex.: se o raio do mouse for 20 e o intervalo de busca for 3, então o intervalo de busca é 60 pixels a partir do ponteiro do mouse. Arraste o mouse sobre novas áreas que você deseja incluir. Observe a área selecionada se expandir para áreas com cores que correspondem às cores dentro do círculo do mouse. Se você for longe demais, clique com o botão direito para remover a última seleção. Repita se necessário para remover mais seleções anteriores. Reduza o raio ou aumente o nível de combinação para obter controle mais fino - a seleção se expandirá mais lentamente e permanecerá mais próxima do círculo do mouse. Um raio pequeno e um nível de combinação alto podem ser usados para seguir ao longo de uma borda de característica da imagem e selecionar pixels até a borda com boa precisão. Após o trabalho de borda estar completo, use o método selecionar área dentro do mouse para selecionar o restante. Um arraste com o botão direito atua como uma desmarcação: pixels dentro do círculo do mouse e pixels correspondentes dentro do intervalo de busca são desmarcados. Se uma seleção for longe demais, geralmente é mais fácil corrigir isso desmarcando de fora da área selecionada em vez de selecionar de dentro. Você pode precisar de alguma prática para ter uma sensação disso e conseguir trabalhar de forma eficiente. - ^Selecionar todas as cores dentro do mouse - resumo • arraste com o botão esquerdo - seleciona pixels no mouse e pixels correspondentes no intervalo • clique com o botão direito - desfaz a seleção anterior, repita para desmarcar mais • arraste com o botão direito - desmarca pixels no mouse e pixels correspondentes no intervalo - ^Deslocamento de borda Uma área que foi concluída (veja abaixo) pode ser expandida ou contraída em passos de 1 pixel. Isso pode ser útil para reduzir efeitos de borda quando uma área selecionada por correspondência de cores é editada de uma forma que altera seu brilho. A seleção por cor pode deixar uma faixa estreita de pixels sub-selecionados ou sobre-selecionados ao longo de uma borda onde a cor da característica transita para o fundo. Expandir ou contrair a área em 1-2 pixels pode produzir uma borda com aparência mais limpa. A área permanece concluída (veja abaixo) após o deslocamento. - ^Cor do contorno da área A cor usada para o círculo de seleção do mouse e o contorno da área pode ser alterada a qualquer momento clicando em um dos botões de cor. Isso permite boa visibilidade contra várias cores de imagem. - ^Mostrar/Ocultar Use [Ocultar] para ocultar os contornos da área. Isso é útil para ver melhor os efeitos das edições da área sem interferência do contorno da área. Use [Mostrar] para mostrar os contornos e retomar a edição da área. - ^Concluir +image: select-area-finish.png - Uma área não é efetiva para edições até que seja concluída com sucesso. Concluir valida os contornos desenhados e colore os pixels envolvidos para verificação visual. Quando você terminar de contornar áreas, use o botão [Concluir] para completar o processo. A caixa de diálogo popup mostrada acima resume dois métodos que você pode usar para concluir. - Método 1: Clique com o botão esquerdo do mouse dentro das áreas que foram contornadas manualmente. As áreas envolvidas são temporariamente coloridas para que você possa verificar se o resultado final é o que você pretendia. Qualquer área envolvida pode ser selecionada, mesmo aquelas não explicitamente contornadas: se você tiver uma rosquinha com um buraco, você pode selecionar a rosquinha, o buraco, ou ambos. Pressione [keep] quando todas as áreas tiverem sido clicadas e coloridas corretamente. Se o contorno de uma área desenhada à mão tiver uma lacuna, o processo de coloração vai "vazar" e áreas fora do envolvimento serão coloridas. Nesse caso, pressione [Desfazer] na caixa de diálogo Concluir, que restaura o contorno de área original. Encontre a lacuna no contorno e feche-a, então tente [Concluir] novamente. Uma lacuna de 1 pixel em uma área grande pode ser difícil de encontrar. Aumente o zoom para ver melhor. Veja a função {ENCONTRAR LACUNA NA ÁREA} abaixo para um método rápido de encontrar pequenas lacunas. - Método 2: Clique com o botão direito em algum lugar fora de todas as áreas envolvidas. Todas as áreas envolvidas serão coloridas para verificação visual. Se houver uma lacuna, os resultados e a correção são os mesmos descritos no método 1. Este método faz sentido se você tiver muitas áreas contornadas à mão e não quiser verificá-las uma de cada vez usando o método 1. - Áreas selecionadas usando os métodos 'selecionar dentro do mouse' são automaticamente concluídas. Essas áreas são mapeadas durante o processo de seleção, enquanto áreas selecionadas com retângulo, elipse, ou um dos métodos de desenho de linha são mapeadas apenas quando você clica dentro delas. Se você usar apenas os métodos 'selecionar no mouse', você pode pressionar [keep] sem clicar em nenhuma das áreas selecionadas. - Se você desenhar uma linha de um lado da imagem até o outro, você pode clicar em qualquer lado da linha para criar uma área de todos os pixels desse lado da linha. Exemplo: desenhe uma linha horizontal na fronteira entre o céu e a terra. Clique acima da linha para selecionar o céu, abaixo da linha para selecionar a terra. As linhas desenhadas devem alcançar completamente as bordas da imagem. - ^Limpar Descarta a área atual permanentemente. - - TOPIC: ENCONTRAR LACUNA NA ÁREA Se um contorno de área foi criado por desenho à mão livre usando múltiplos traços, é fácil deixar pequenas lacunas no contorno que não são visíveis abaixo de 4x de zoom. Uma tentativa de concluir tal área falhará porque o mapeamento dos pixels internos vazará através da lacuna e cobrirá áreas fora da área pretendida. Se a função Concluir falhar, esta função pode encontrar a lacuna. Clique em algum lugar no contorno da área que falhou. O contorno será redesenhado lentamente em uma direção a partir da posição clicada, até que um "pixel final" seja encontrado. É aí que está a lacuna. O contorno é então desenhado na direção oposta até que a lacuna (ou outra) seja encontrada. A lacuna é onde o desenho parou. Aumente o zoom na lacuna e feche-a usando desenho à mão livre, então teste novamente para ver se o contorno completo pode ser desenhado sem parar. Esta função pode ser usada em paralelo com a função Selecionar Área - ambas as caixas de diálogo podem estar ativas. - - TOPIC: MESCLAR ÁREA +image: area-blend.jpg - Duas funções estão presentes nesta ferramenta: Mesclar Área e Mesclar Borda de Área. Ambas as funções podem gradualmente 'desfazer' uma edição feita dentro de uma área selecionada, misturando uma edição anterior ou a imagem original. No exemplo acima, os quatro homens ao fundo foram clareados sem nenhuma evidência de uma fronteira entre pixels clareados e inalterados. - ^Mesclar Área Qualquer parte de uma área selecionada editada pode ser mesclada com a imagem original. Use arrastos com o botão esquerdo do mouse sobre as regiões a serem mescladas. Cada arraste do mouse dentro da área mesclará gradualmente a imagem anterior selecionada, efetivamente reduzindo ou removendo a edição que foi feita dentro da área. A taxa de mesclagem é determinada pela 'taxa de mesclagem', que pode ser definida separadamente para o centro e a borda do círculo do mouse. Defina o raio do mouse e as taxas de mesclagem (ex.: 50/0 para centro/borda do mouse). Arraste o mouse sobre as regiões da área a serem mescladas. Use arraste com o botão esquerdo para mesclar, arraste com o botão direito para desmesclar ou restaurar. Você pode usar este método para mesclar bordas de área seletivamente: use um raio pequeno e arraste o centro do mouse sobre as bordas a serem mescladas. Isso resultará em uma mesclagem gradual da borda para dentro. - ^Mesclar Borda de Área Às vezes uma área editada terá bordas com aparência não natural, devido a uma fronteira nítida entre a área editada e a imagem ao redor (especialmente se a área foi clareada). Isso pode ser efetivamente tornado invisível mesclando gradualmente para fora a edição da área em uma faixa ao longo das bordas. A edição da área pode ser 100% removida da borda da área, diminuindo para 0% para dentro ao longo da largura da faixa. Existem duas formas de mesclar bordas de área, 'mesclar' e 'desfocar'. Mesclar mistura a faixa da borda com a edição anterior escolhida ou a imagem original. Desfocar mistura a faixa com os pixels vizinhos de fora da faixa. Defina a largura da mesclagem com a entrada 'largura da mesclagem' ou 'largura do desfoque'. - As opções 'Mesclar' e 'Desfocar' de borda de área exigem um cálculo de distância de borda: a distância de cada pixel da área até a borda mais próxima da área. Essa distância é usada para calcular a mesclagem relativa do pixel: 100% na borda da área e 0% para pixels além da 'largura da mesclagem' a partir da borda. Para uma área grande com uma borda complexa, isso pode levar algum tempo. Um medidor de progresso é mostrado no painel superior. - - TOPIC: MOSTRAR/OCULTAR ÁREA Mostra ou oculta o contorno da área atual. Ocultar a área é útil quando a área está sendo modificada com uma função de edição. Isso facilita julgar os efeitos da edição. Estes também estão disponíveis como botões na caixa de diálogo Selecionar Área. - - TOPIC: ATIVAR/DESATIVAR ÁREA Desativa a área atual e mantém os dados para que possa ser reativada mais tarde (menu Ativar). Isso permite alternar entre edições dentro de uma área selecionada e edições para a imagem inteira. - - TOPIC: INVERTER ÁREA Inverte uma área existente: a imagem inteira é selecionada, exceto pela área existente. Usar a função duas vezes retorna à área selecionada original. Inverter uma área selecionada invalida o cálculo de borda, que deve ser refeito se a mesclagem de borda de área for desejada. - - TOPIC: LIMPAR ÁREA Descarta permanentemente a área atual. Isso também está disponível como um botão na caixa de diálogo Selecionar Área. - - TOPIC: COPIAR/COLAR ÁREA Uma área selecionada pode ser salva em um arquivo de cache usando o menu Áreas > Copiar. Essa área pode ser colada na mesma imagem ou em outra usando Áreas > Colar. Clique e arraste para posicionar a área colada. Os controles da caixa de diálogo podem ser usados para redimensionar e girar a área colada. - - TOPIC: CARREGAR/SALVAR ÁREA Uma área selecionada pode ser salva em um arquivo usando o menu Áreas > Salvar. É solicitado que você forneça um nome de arquivo. Um arquivo PNG é criado. O arquivo PNG tem um canal alfa para informações de transparência. A imagem é um retângulo que envolve a área selecionada. Os pixels selecionados são opacos, e os outros são transparentes. - Esses arquivos residem em /saved_areas por padrão, mas você pode salvá-los em qualquer lugar. Use o menu Áreas > Carregar para carregar uma área salva de um arquivo e colá-la na imagem atual. A imagem de fundo aparecerá através das partes transparentes da área colada. Clique e arraste para posicionar a área. Os controles da caixa de diálogo podem ser usados para redimensionar e girar a área colada. - - TOPIC: BOTÃO DESFAZER/REFAZER Se uma função de edição estiver ativa e a imagem tiver sido alterada: • clique com o botão esquerdo desfará a edição atual • clique com o botão direito refará a edição Isso permite comparar rapidamente as imagens "antes" e "depois" da função de edição atual. - Se NENHUMA função de edição estiver ativa, mas algumas edições foram feitas na imagem atual: • clique com o botão esquerdo desfará uma etapa de edição por clique • clique com o botão direito refará uma etapa de edição por clique • clique com o botão do meio abre uma lista popup de todas as etapas de edição. Você pode voltar a qualquer etapa de edição ou à imagem original - Se você abrir outro arquivo, as etapas de edição salvas para o arquivo atual são descartadas. - - TOPIC: MENU DE EDIÇÃO - - TOPIC: GIRAR Para nivelar uma imagem inclinada, use o mouse para arrastar o lado direito ou esquerdo da imagem para cima ou para baixo até que a imagem pareça nivelada. Um clique com o botão esquerdo na imagem adicionará linhas guia verticais e horizontais para ajudar no nivelamento da imagem. Use o clique com o botão direito para removê-las. - O botão [Nivelamento Automático] pode nivelar automaticamente a imagem se a câmera tiver registrado o 'ângulo de rotação' na metadata EXIF. O botão [Auto Upright] pode endireitar automaticamente uma imagem feita com a câmera girada 90º, se 'orientação' estiver presente na metadata EXIF. - - TOPIC: ENDIREITAR Esta é uma correção com 1 botão para uma imagem que está girada 90/180 graus ou invertida (espelhada). Não há perda de resolução, já que os pixels são copiados 1:1 para o novo layout da imagem. Veja também a função {ENDIREITAMENTO EM LOTE}. - - TOPIC: CORTAR +image: crop-image.jpg +image: crop-buttons.jpg - Corta áreas indesejadas das bordas da imagem. Quando a caixa de diálogo abre, um retângulo de seleção é colocado sobre a imagem. Áreas fora desse retângulo são escurecidas e representam as partes da imagem que serão removidas. Arraste qualquer lado ou canto do retângulo para mover esse lado ou canto. A caixa de diálogo mostra a proporção largura/altura atual do retângulo de seleção. Se "Travar" estiver marcado, então mover um lado ou canto fará com que outro lado ou canto se mova, para que a proporção fixa largura/altura seja mantida. Arraste a partir do meio (marcado por um pequeno círculo) para deslocar o retângulo inteiro sem alterar as dimensões. Use os spin buttons de largura e altura para ajustar diretamente as dimensões em pixels da imagem, ou digite os valores desejados. O retângulo de seleção se ajustará a esses valores. - Use as teclas de seta do teclado para mover o retângulo de seleção em passos de 1 pixel. O último lado ou canto movido com o mouse é aquele que é movido com as teclas de seta. - O botão [Máx.] redefine o retângulo de corte para o tamanho total da imagem. Se uma edição anterior (Girar, Distorcer ...) deixou margens transparentes ao redor da imagem, o retângulo de corte refletirá o tamanho máximo que cabe dentro dessas margens. - O botão [Anterior] recupera uma lista de valores de largura e altura usados anteriormente. Selecione na lista para usar um desses. - Os cinco botões de proporção permitem escolher uma proporção largura/altura predefinida. O botão [invert] inverte a proporção largura/altura atual. - Você pode alterar os botões de proporção com o botão [customize], que inicia uma nova caixa de diálogo mostrada à direita. Clique em um botão para editá-lo. Digite a proporção largura/altura desejada usando o formato "ll:aa" como no exemplo mostrado. - - TOPIC: RETOCAR +image: retouch.png - Ajusta o brilho e a cor da imagem. • nível de preto automático - define o ponto preto usando % dos pixels mais escuros • balanço de branco automático - define o ponto branco usando % dos pixels mais claros • clique no ponto cinza para balanço de branco - clique no ponto cinza na imagem • clique no ponto escuro para nível de preto - clique no ponto escuro na imagem • clique para gráfico popup dos histogramas RGB • brilho - move a curva 'todas' para cima ou para baixo (todas as cores mudam) • contraste - altera a inclinação da curva 'todas' • saturação de cor - preto/branco <--> cores intensas • temperatura de cor - balanço de iluminação (quente <--> frio) - Após fazer os ajustes iniciais usando os sliders, você pode ajustar finamente o brilho e o contraste editando as curvas com o mouse para alterar quais partes da imagem mudam mais ou menos. A curva TODAS ajusta todas as cores, e as 3 curvas RGB ajustam cores individuais. Use TODAS primeiro, depois faça revisões usando RGB. - ^Botões Redefinir - retorna todos os controles a uma posição neutra - a imagem também é redefinida Anterior - define todos os controles com os valores usados para a imagem anterior Concluído - finaliza a edição, fecha a caixa de diálogo, salva as configurações de controle Cancelar - cancela a edição, redefine a imagem, fecha a caixa de diálogo - Use o botão [Anterior] ao processar várias imagens que precisam de ajustes semelhantes. - - TOPIC: REDIMENSIONAR +image: rescale.png - Esta função redimensiona a imagem para uma nova largura e altura em pixels. Você pode inserir as novas dimensões diretamente ou escolher uma alteração percentual. Botões estão presentes para definir o novo tamanho como uma proporção simples do tamanho original. Usar um destes minimizará a perda de resolução. O botão [Anterior] recupera o tamanho anterior, uma conveniência se várias imagens estiverem sendo definidas para o mesmo tamanho. Se a caixa de travamento de proporção estiver marcada, a proporção largura/altura atual será preservada se a largura ou a altura for alterada. - - TOPIC: TELA DIVIDIDA +image: split-screen1.jpg +image: split-screen2.png - Durante uma função de edição, veja as imagens antes e depois usando o método de tela dividida. Arraste a linha de divisão usando o mouse. Quando você sair da Tela Dividida, pode continuar a função de edição normalmente. - Se nenhuma função de edição estiver ativa, escolha duas imagens para mostrar usando tela dividida. Elas devem ter as mesmas dimensões em pixels. - - TOPIC: MOSTRAR DIFERENÇAS Durante uma função de edição, realça as alterações escurecendo as áreas inalteradas. Use o slider para ajustar a escuridão das áreas inalteradas. Quando você sair de Mostrar Diferenças, pode continuar a função de edição normalmente. - Se nenhuma função de edição estiver ativa, escolha duas imagens para realçar suas diferenças. Elas devem ter a mesma dimensão em pixels. - - TOPIC: MARGENS +image: margins.png - Use esta função para adicionar margens ao redor de uma imagem. Você pode usar qualquer cor e configuração de alfa (transparência) para as margens. Defina cada margem separadamente, ou use os controles 'Tudo±1' e 'Tudo±10' para ajustar todas as margens para cima ou para baixo pela mesma quantidade, 1 ou 10 pixels. Use a roda do mouse ou as teclas de seta para cima/baixo para velocidade. - Você pode usar esta função para adicionar margens ao redor de imagens que você planeja distorcer, para evitar que algumas áreas caiam fora das bordas. - - TOPIC: MARCAÇÃO +image: markup.jpg - Este é um menu contendo as funções de marcação de imagem: desenhar texto, desenhar linha/seta, desenhar caixa, desenhar oval Todas essas funções têm um botão [commit] que confirma a edição atual e permite iniciar uma nova (novo texto/linha/caixa/oval) dentro da mesma caixa de diálogo de edição. - ^Desenhar Texto Esta função desenha texto diretamente na imagem. Digite o texto na caixa de diálogo. Várias linhas podem ser usadas. Após digitar o texto, clique com o botão esquerdo do mouse onde você quer o texto na imagem. Arraste para mover o texto para outro lugar. Clique com o botão direito para remover o texto. Use o botão [Fonte] para selecionar uma fonte diferente. Use o controle [Tamanho] para aumentar ou diminuir o tamanho do texto. Use o controle [Ângulo] para alterar o ângulo de inclinação do texto. Os outros controles permitem fornecer uma cor de fundo ao redor do texto, uma cor de contorno do texto, e um efeito de sombra. Você pode selecionar a cor e a transparência para todos estes. O controle de largura ajusta a largura dos contornos e sombras. O controle de ângulo da sombra define o ângulo da sombra. Use os controles de relevo para dar ao texto uma aparência 3D. - Você pode inicializar o texto a partir de qualquer metadata disponível no arquivo de imagem. Digite a tag de metadata (ex.: "user comments") e pressione [Buscar]. Você pode abreviar nomes de tags, ex.: "usercomments" em vez de "User Comments". - Os botões [Abrir] e [Salvar] iniciam uma caixa de diálogo de seleção de arquivo com a qual você pode carregar ou salvar todos os dados de texto de ou para um arquivo. Todos os itens na caixa de diálogo são carregados ou salvos, então você pode manter uma coleção de strings de texto e configurações usadas com frequência. - Os botões na parte inferior funcionam da seguinte forma: • Limpar - limpa os campos de texto e metadata, deixando-os em branco • Substituir - a imagem com o texto adicionado substitui a imagem atual • +Versão - a imagem com o texto adicionado é salva como uma nova versão • Próximo - abre o próximo arquivo, coloca o mesmo texto na mesma posição • Aplicar - confirma a edição atual e reinicia para nova entrada de texto • Concluído - completa a edição atual - a imagem está pronta para salvar • Cancelar - abandona a edição atual - Para adicionar o mesmo texto a uma série de imagens: prepare e posicione o texto, pressione [Substituir] ou [+Version], então [Próximo], então [Substituir] ou [+Version], então [Próximo] ... - Fazer uma marca d'água: Use uma transparência de texto de 70% ou mais e uma transparência de fundo de 100%. O texto deve ser levemente legível. Use os controles de relevo para fazer o texto parecer estar recuado na imagem. - ^Desenhar Linha Esta função desenha linhas ou setas diretamente na imagem. Digite um comprimento e largura de linha na caixa de diálogo, e selecione uma ponta de seta se desejado. Clique com o botão esquerdo do mouse onde você quer colocá-la na imagem. Arraste as extremidades da linha/seta para posicioná-la na imagem. Clique com o botão direito para removê-la. Arraste a partir do meio da linha para mover sem alterar o ângulo ou o comprimento. Os controles da caixa de diálogo permitem fornecer uma cor de fundo, uma cor de contorno, e um efeito de sombra. Você pode selecionar cor e transparência para todos estes. O controle de largura ajusta a largura dos contornos e sombras. O controle de ângulo da sombra define o ângulo de inclinação da sombra. Para manter uma linha desenhada e iniciar outra, pressione [aplicar]. - ^Desenhar Caixa Escolha uma cor e largura para o contorno da caixa. Posicione o cursor onde você quer um canto da caixa, e arraste para abrir a caixa na direção desejada. Para substituir a caixa, arraste novamente. Para mover a caixa, segure a tecla shift e arraste a caixa a partir do centro. Para mover uma das bordas, segure a tecla shift e arraste a borda. Para manter uma caixa desenhada e iniciar outra, pressione [aplicar]. - ^Desenhar Oval Escolha a caixa de seleção oval (elipse) ou círculo. Escolha uma cor e largura para o contorno. Posicione o cursor no centro desejado. Arraste para desenhar a oval/círculo. O ângulo do arraste determina o formato da oval, de círculo a elipse extrema, larga ou alta. Para substituir a oval/círculo, arraste novamente. Para mover a oval/círculo, segure a tecla shift e arraste a partir do centro. Para alterar o tamanho ou formato, segure a tecla shift e arraste a partir da borda inferior direita. Para manter uma oval/círculo desenhado e iniciar outro, pressione [aplicar]. Para uma oval, você pode inserir um ângulo de 0-90 graus para eixos inclinados, como no exemplo. - - TOPIC: MODO DE COR +image: color-mode.png +image: color-mode2.jpg - Use esta função para criar um negativo em preto e branco ou colorido, ou converter uma imagem negativa em uma imagem positiva, ou converter para coloração sépia (para um efeito de foto envelhecida). O slider pode ser usado para aplicar o efeito incrementalmente, de 0% a 100%. - - TOPIC: PINTAR EDIÇÕES Use esta função em combinação com alguma outra função de edição. Inicie uma função de edição e deixe os controles em uma posição neutra. Então inicie Pintar Edições. Pinte a função de edição onde desejado usando o mouse. Veja {MOUSE PAINTING} para saber como aplicar edições localmente usando o mouse. - Este método de "pintar" edições incrementalmente pode melhorar áreas selecionadas de uma imagem de forma rápida e fácil. Funciona com as seguintes funções de edição: • Editar > Retocar, Modo de Cor • Reparar > Nitidez, Desfoque, Reduzir Ruído, Remover Névoa, Ajustar RGB, Ajustar HSL • Refinar > Achatar Histograma, Contraste Local, Amplificar Contraste, Retinex Local, Saturação, Foco Suave • Efeitos > Contornos, Esboço2, Relevo, Textura, Adicionar Brilho Intenso, Definir Cores, Deslocar Cores, Kernel Personalizado - - TOPIC: PINTAR IMAGEM +image: paint-image.jpg - Esta função pinta sobre a imagem com cores selecionadas, usando o mouse. Veja {MOUSE PAINTING} para saber como aplicar edições localmente usando o mouse. - O botão Cor de Pintura mostra a cor atual. Clique neste botão para escolher uma cor usando a caixa de diálogo padrão de seleção de cores do Gnome. Você também pode usar shift + clique esquerdo na imagem para escolher uma cor da imagem. - O botão de paleta abre a caixa de diálogo mostrada no meio. Clique na imagem para selecionar a cor naquela posição. A cor escolhida é refletida no botão de cor da caixa de diálogo principal. A imagem mostrada acima é o padrão. Você pode usar qualquer imagem como fonte de cor. Pressione o botão [procurar] e selecione uma imagem onde você salvou cores para recuperação. Essa escolha permanece em vigor até ser alterada. - O botão HSL abre um seletor de cor HSL mostrado à direita. Esta caixa de diálogo pode representar qualquer cor possível. Mova os sliders para obter a cor que você deseja. A cor escolhida é refletida no botão de cor da caixa de diálogo principal. - Se pintar sobre áreas transparentes estiver selecionado, pintar sobre áreas transparentes reduzirá ou eliminará a transparência, dependendo dos controles de opacidade. Se esta opção não estiver selecionada, apenas as áreas opacas da imagem são pintadas. - ^Operação com Tablet Wacom Com Pintar Imagem, você pode usar um tablet Wacom em vez de um mouse. Arrastar a caneta em contato com a superfície do tablet pintará como descrito acima. Se um dos botões da caneta for mantido pressionado enquanto se arrasta, a operação será apagar em vez de pintar. Você também pode definir o modo pintar ou apagar usando os botões de opção na caixa de diálogo. Manter um botão da caneta pressionado é incômodo, por isso os botões de opção existem. Adicionar pressão à caneta aumentará a opacidade, então você pode fazer traços mais claros e mais escuros sem ajustar os controles de opacidade. - - TOPIC: PINTAR TRANSPARÊNCIA +image: paint-transp.png +image: paint-transp2.jpg - Pinte áreas transparentes ou semitransparentes em uma imagem. Veja {MOUSE PAINTING} para saber como aplicar edições localmente usando o mouse. - - TOPIC: PREENCHER ÁREA Preenche todas as áreas selecionadas ou todas as áreas transparentes com uma cor de sobreposição escolhida. Se uma área for parcialmente transparente, a cor de sobreposição substituirá a fração transparente da imagem. O slider 'Mesclar' pode ser usado para selecionar qualquer mistura da imagem original e da cor de sobreposição. - - TOPIC: COPIAR NA IMAGEM Pinta sobre áreas da imagem copiando de outro lugar na mesma imagem. Este método pode ser usado para duplicar objetos dentro de uma imagem, ou apagar um objeto indesejado substituindo-o por fundo obtido de outro lugar. Clique com o botão esquerdo na imagem para selecionar um local de origem, então clique com o botão direito para selecionar o destino correspondente. Veja {MOUSE PAINTING} para saber como aplicar edições localmente usando o mouse. - Se pintar sobre áreas transparentes estiver selecionado, pintar sobre áreas transparentes reduzirá ou eliminará a transparência. Se esta opção não estiver selecionada, apenas as áreas opacas da imagem são pintadas. - - TOPIC: COPIAR DA IMAGEM Pinta sobre áreas da imagem copiando de outra imagem. A imagem alvo é 'pintada' arrastando o mouse sobre a área a ser modificada. Uma posição previamente selecionada na imagem de origem é copiada para a imagem alvo. A área sendo copiada e a área sendo pintada estão ambas envolvidas em círculos que se movem com o mouse. No exemplo acima, o barco na imagem à direita foi copiado para a imagem à esquerda. - Comece abrindo a imagem alvo. Selecione o menu 'Copiar da Imagem'. Uma 2ª sessão do Fotocx é iniciada mostrando a mesma imagem. Nesta 2ª sessão, navegue até a imagem de origem e abra-a. Organize as duas janelas para que você possa manter ambas visíveis (pelo menos as áreas a serem copiadas). Shift + clique esquerdo na imagem de origem para estabelecer uma posição de origem. Shift + clique esquerdo na imagem alvo na posição de destino. - Arraste com o botão esquerdo sobre a área da imagem alvo. Os pixels da imagem de origem são copiados para a imagem alvo. Dê zoom nas imagens até o tamanho máximo se alta precisão for necessária para as posições de referência. A posição de referência inicial é (0,0) (canto NO) para ambas as imagens. Veja {MOUSE PAINTING} para saber como aplicar edições localmente usando o mouse. - O valor de escala da imagem de origem é usado para escalar a imagem de origem para a imagem alvo. Comece fazendo uma cópia de teste para verificar a escala. Se estiver muito grande ou muito pequena, use [undo all] para apagar o teste, altere o valor de escala, e tente novamente. - Se pintar sobre áreas transparentes estiver selecionado, pintar sobre áreas transparentes reduzirá ou eliminará a transparência, dependendo dos controles de opacidade do mouse. Se esta opção não estiver selecionada, apenas as áreas opacas da imagem são pintadas. - - TOPIC: COPIAR EDIÇÃO ANTERIOR A imagem de uma etapa de edição anterior pode ser aplicada à imagem atual local e gradualmente, "pintando" com o mouse. A edição anterior deve ser uma das edições feitas na imagem atual enquanto ela ainda está aberta - edições não salvas são perdidas quando uma nova imagem é aberta. Você pode aplicar qualquer edição anterior a qualquer área da imagem atual sendo editada, desde que a imagem permaneça aberta como a imagem atual. Selecione uma edição anterior usando a lista suspensa que mostra todas as etapas de edição anteriores feitas na imagem atual, em sequência, e identificadas pela função de edição usada. Veja {MOUSE PAINTING} para saber como aplicar edições localmente usando o mouse. - - TOPIC: MENU DE REPARO - - TOPIC: NITIDEZ +image: sharpen.png - Esta função tem cinco métodos para aplicar nitidez em uma imagem borrada, e um método para corrigir desfoque de movimento causado pela câmera ou pelo movimento do sujeito durante a exposição. - Escolha o método, defina os parâmetros, pressione [aplicar] e aguarde alguns segundos para ver o resultado. Faça alterações e repita o processo até ficar satisfeito. Use {SELECIONAR ÁREA} para operar em diferentes partes de uma imagem com diferentes métodos e parâmetros. - Para todos os métodos, escolha um raio pequeno para imagens levemente borradas e valores maiores para imagens mais problemáticas. Quantidade controla a intensidade da modificação. Limite suprime alterações em pixels de baixo contraste: valores mais altos reduzem a amplificação de irregularidades de baixo nível (ruído de imagem, tons de pele desiguais, etc.). - Máscara de nitidez: um método clássico encontrado na maioria dos editores de imagem. Uma descrição técnica pode ser encontrada com uma busca na internet. Este método pode criar 'halos' visíveis ao redor de bordas de alto contraste. - Amplificar Contraste: amplifica o contraste existente. A eficácia é comparável à máscara de nitidez, mas os 'halos' são reduzidos. - Kuwahara: pequenas vizinhanças ao redor de cada pixel são comparadas entre si. O pixel recebe a cor média da vizinhança com a menor diferença. Isso força os pixels em uma borda borrada a corresponder a um lado da borda ou ao outro. As bordas ficam muito nítidas. A imagem pode parecer 'em blocos' se um raio grande for usado. Detalhes sutis podem ser perdidos. - Diferença mediana: o brilho do pixel é comparado à mediana dos pixels dentro do raio. O brilho é aumentado ou diminuído para pixels respectivamente mais claros ou mais escuros que a média da vizinhança. A eficácia é comparável à máscara de nitidez, mas os 'halos' são bastante reduzidos. Este é o único método que funciona em cada cor RGB separadamente. Ele pode aplicar nitidez em uma transição de cor mesmo que haja pouca mudança de brilho. - Richardson-Lucy: a imagem recebe nitidez usando o método de deconvolução Richardson-Lucy. Este método pode produzir os melhores resultados, mas também é bastante lento. Para acelerar o processo, comece selecionando uma área pequena, mas com muitos detalhes, da imagem usando {SELECIONAR ÁREA}. Procure o raio e a contagem de iterações ideais usando essa pequena área. Depois use as mesmas configurações para a imagem inteira. O ruído na imagem prejudicará a eficácia. Se assim for, use {REDUZIR RUÍDO} antes. - Uma imagem ampliada exatamente 2x pode receber nitidez com Richardson-Lucy, usando um raio de 2.0 e 4 ou mais iterações. Os resultados são notavelmente bons. - ^Corrigir Desfoque de Movimento +image: fix-motion-blur.png +image: fix-motion-blur1.jpg - Otimize manualmente imagens com leve desfoque causado pelo movimento da câmera ou do objeto. O desfoque de um objeto em movimento em uma imagem, do contrário nítida, pode ser processado usando {SELECIONAR ÁREA} para isolar o objeto. Assume-se que o desfoque seja linear e com velocidade constante. As entradas são 'extensão do desfoque' em pixels e 'ângulo do desfoque' em graus. A estimativa inicial do ângulo pode ser especificada por shift + arrastar o mouse pela imagem na direção do desfoque (pode ser a mesma ou oposta ao movimento real). Insira uma estimativa da extensão do desfoque usando Ferramentas > Mostrar RGB para medir a largura do desfoque ao longo de alguma borda de característica clara da imagem. Ajuste as entradas, pressione [aplicar], e inspecione a imagem para encontrar as configurações ideais. O tempo de resposta pode ser lento para uma imagem grande. Você pode acelerar o processo se usar {SELECIONAR ÁREA} para selecionar uma pequena área borrada para otimizar a extensão e o ângulo, depois limpe a área para processar a imagem inteira usando as mesmas configurações. O algoritmo pode produzir ruído de "ringing" (ondulação), que pode ser suprimido usando a entrada 'suprimir ringing'. Funciona melhor deixar o valor de supressão baixo para encontrar a extensão e o ângulo ideais, e então adicionar supressão conforme necessário para reduzir o ringing. O método de deconvolução Richardson-Lucy é usado em uma dimensão. - ^Desfoque de Movimento de Câmera Digital Nem todas as fotos borradas têm o desfoque de velocidade constante mais adequado para este método. A imagem pode ser uma superposição de múltiplas exposições mais curtas. A imagem inteira pode não ter sido exposta ao mesmo tempo e ter o mesmo desfoque (obturador mecânico ou eletrônico em movimento). Este método ainda pode produzir melhores resultados do que ferramentas de nitidez que funcionam em duas dimensões. Deve funcionar melhor em fotos antigas feitas com câmeras de filme, onde o desfoque de movimento é mais próximo de velocidade constante. - - TOPIC: DESFOQUE +image: blur.jpg - Escolha um método com a caixa de seleção correspondente, insira os parâmetros necessários, pressione [aplicar]. Se {SELECIONAR ÁREA} estiver ativa, apenas as áreas selecionadas são afetadas. - ^Desfoque Normal Mistura cada pixel com os pixels ao redor dentro do raio. Pixels mais próximos têm um peso maior. Você pode definir o raio como 1 e pressionar [aplicar] repetidamente para aumentar o desfoque lentamente enquanto observa o resultado da imagem. - Você pode opcionalmente desfocar em quantidades diferentes nas direções horizontal e vertical se inserir valores horizontal e vertical separados. A entrada [raio] forçará os mesmos valores para ambos. - ^Desfoque Radial Mistura cada pixel com pixels ao longo de uma linha a partir de um centro escolhido. Raio define uma área central que não é desfocada. Comprimento define o intervalo da linha de desfoque: 0 até o comprimento, do centro até a borda. Escolha o centro clicando na imagem. - ^Desfoque Direcionado Puxe uma posição na imagem usando o mouse. A área ao redor do mouse será desfocada nessa direção. Extensão determina o tamanho da área desfocada. Intensidade determina a força do desfoque. - ^Desfoque Gradual Apenas pixels com menos contraste que o limite de contraste dado são desfocados, e o raio do desfoque varia de 1 até o valor dado para pixels com um contraste correspondente variando do limite dado até zero. Em resumo: pixels de baixo contraste são desfocados mais que pixels de alto contraste. Isso pode ser usado para suavizar tons de pele sem desfocar o cabelo ou reduzir o brilho nos olhos. Levado ao extremo, produz um efeito de "desenho animado". - ^Desfoque de Fundo (Bokeh) Desfoca áreas de fundo da imagem, mantendo o primeiro plano nítido. Selecione uma ou mais áreas que devem permanecer nítidas {SELECIONAR ÁREA}. Após selecionar as áreas do primeiro plano, inverta a seleção para que o fundo agora esteja selecionado {INVERTER ÁREA}. Esta é a área que será desfocada. Existem dois métodos de desfoque disponíveis: Desfoque constante: um raio de desfoque constante é usado para todas as áreas desfocadas. Aumentar desfoque com a distância: usa o raio de desfoque mínimo para pixels adjacentes ao primeiro plano e o raio de desfoque máximo para pixels na distância máxima do primeiro plano. Isso requer que a distância de borda para todos os pixels de fundo seja calculada, o que pode levar um tempo significativo. O raio de desfoque pode ser variado sem recalcular as distâncias de borda. - - TOPIC: REDUZIR RUÍDO +image: denoise.jpg - Reduz o ruído em fotos tiradas em condições de pouca luz (ISO alto), fazendo com que superfícies uniformes pareçam manchadas. Dois métodos são fornecidos, Mediana e Suave. O melhor método varia com o ruído e as características da imagem. Misturar métodos (usar um e depois outro) pode ser útil. O valor Raio define a vizinhança de pixels que será usada para comparar e ajustar um determinado pixel. Um valor grande (Raio > 2) reduzirá o ruído de forma mais eficaz, mas também pode causar perda de detalhes. O valor de limite fará com que pixels com valores de brilho RGB que diferem da mediana da vizinhança por mais que essa quantidade sejam ignorados. Isso é necessário para algumas imagens para evitar que pequenos detalhes brilhantes sejam tratados como ruído - ex.: fotos astronômicas. - Defina um valor de Raio e pressione um dos botões de método. Cada iteração usa a imagem anterior como ponto de partida, então múltiplas iterações suprimirão gradualmente o ruído e possivelmente desfocarão alguns detalhes. Use [redefinir] para recomeçar. Mediana com Raio 1, seguida de Mediana com Raio 2, é um bom equilíbrio entre suprimir ruído e preservar detalhes. - O slider de Áreas pode ser usado para restringir o processamento apenas a áreas escuras, ou a uma faixa mais ampla de áreas. Áreas escuras tendem a ter mais problemas de ruído do que áreas claras. - Se você ver algumas pequenas manchas de ruído persistentes, aumente o valor de limite, use o botão [redefinir], e continue com [mediana] ou [suave]. - Você pode aplicar processamento diferente em diferentes áreas da imagem - veja {SELECIONAR ÁREA}, e você pode "pintar" a imagem usando processamento diferente em diferentes áreas - veja {PINTAR EDIÇÕES}. - Cada cor RGB é processada independentemente. Não há processamento separado de crominância ou luminosidade. - O botão [measure] inicia a caixa de diálogo do lado direito para medir o nível real de ruído da imagem. Mova o mouse sobre a imagem para mostrar os níveis de ruído RGB dentro do círculo do mouse (raio 10, cerca de 300 pixels). Isso deve ser uma área sem características, para que o ruído seja a única variação presente. Inspecione a imagem em tamanho 4X para ter certeza de que está vendo ruído e não textura. Os pontos mostram os valores RGB de pixels individuais em relação à média dos 5x5 pixels ao redor, representada pela linha sólida central. Os números na parte inferior mostram o brilho RGB médio e os níveis de ruído na escala 0-255. A escala do gráfico é de -10 a +10 e as linhas pontilhadas estão em -5 e +5, em relação a uma faixa total de 0-255. O ruído no 9º ou 10º bit RGB é 0,5 ou 0,25 nesta escala. - ^Ruído de imagem RAW Para medir o ruído do sensor da câmera, use uma imagem RAW. As imagens JPEG são processadas dentro da câmera para reduzir o ruído. Você pode se surpreender com os níveis de ruído tipicamente altos em imagens RAW. Mesmo câmeras caras com sensores grandes podem ter menos de 8 bits de cor com baixo ruído. Quando você filtra o ruído de uma imagem RAW, você está competindo com a eletrônica e o software que produzem o JPEG da câmera. Pode ser um desafio fazer melhor. - - TOPIC: REMOVER NÉVOA +image: defog.png +image: defog2.jpg - Remove névoa/neblina em uma imagem ou área selecionada. Existem outras ferramentas para isso (achatar histograma, contraste local, amplificar contraste, retinex, saturação), mas a remoção de névoa/neblina é secundária à sua função principal. Esta função ataca a névoa/neblina diretamente: ela remove quantidades iguais de cor R/G/B (reduzindo o brilho e aumentando a saturação), e opcionalmente adiciona de volta o brilho perdido. Ela também pode reduzir o azul se este se tornar muito dominante, como frequentemente acontece com névoa distante. Você pode precisar usar {SELECIONAR ÁREA} ou {PINTAR EDIÇÕES} para direcionar e otimizar precisamente as áreas desejadas. O exemplo acima usou duas áreas, as colinas em primeiro plano e a montanha ao fundo. - - TOPIC: OLHOS VERMELHOS +image: red-eyes1.png +image: red-eyes2.png - Reduz o efeito de olhos vermelhos de fotos com flash. Dois métodos são fornecidos. O primeiro é mais rápido, mas pode não lidar bem com casos difíceis. O segundo método é mais robusto, mas também precisa de mais tempo e cuidado. Para usar a primeira função, clique com o botão esquerdo em um olho vermelho uma ou mais vezes até ficar satisfeito. Se a área escurecida for muito pequena ou descentralizada, clique com o botão direito para desfazer a alteração e então clique com o botão esquerdo mais precisamente no centro do olho vermelho. Se um olho vermelho não puder ser corrigido corretamente, clique com o botão direito para desfazer a alteração e então use o segundo método. O segundo método pode lidar melhor com casos mais difíceis, onde o olho vermelho é apenas levemente vermelho e a diferença de cor com as pálpebras é pequena demais para o algoritmo automático distinguir. Posicione o cursor sobre o centro do olho vermelho. Segure o botão esquerdo do mouse e arraste o cursor para baixo e para a direita. Uma elipse pontilhada aparecerá envolvendo o olho vermelho. Repita se necessário para deixar o olho vermelho centralizado na elipse (aproximadamente). Note que o formato da elipse depende da direção do arraste, o que permite um envolvimento mais preciso apenas do olho vermelho. Clique com o botão esquerdo dentro da elipse repetidamente enquanto observa o olho vermelho escurecer, e pare quando estiver escuro o suficiente. Se você for longe demais, as pálpebras podem começar a escurecer. Clique com o botão direito para desfazer e repita se necessário. - - TOPIC: APAGAR INTELIGENTE +image: smart-erase.png +image: smart-erase2.jpg - Apaga pequenos objetos que podem estragar uma boa foto, como fios de energia, lixo no chão, uma placa, etc. O objeto indesejado é substituído por pixels obtidos da área ao redor. Isso às vezes é muito eficaz (efeitos colaterais quase invisíveis), e às vezes não. Funciona melhor para objetos pequenos ou estreitos na foto. Raio controla o tamanho de um círculo ao redor do ponteiro do mouse, definindo a área a selecionar e apagar. Arraste o mouse para envolver o objeto a ser removido. Arraste com o botão esquerdo seleciona e arraste com o botão direito desmarca. Pressione [Apagar] para apagar a área selecionada, substituindo os pixels pelos pixels mais próximos de fora da seleção. Se a seleção não foi precisa o suficiente, use [Desfazer], ajuste a área selecionada, e [Apagar] novamente. Seleções e apagamentos repetidos se acumularão até que você use [New_Area] para iniciar uma nova seleção. As áreas apagadas anteriormente agora estão fixas e [Desfazer] só funcionará para as seleções seguintes. É melhor trabalhar com uma imagem com zoom em 200% ou mais. O controle Desfoque adiciona desfoque aos pixels de substituição. Isso pode reduzir efeitos colaterais visíveis, já que os pixels de substituição podem ser mais nítidos que o entorno. Altere a configuração de Desfoque e repita o botão [Apagar]. Os botões [show] e [hide] podem ser usados para mostrar o contorno da seleção atual ou ocultá-lo para julgar melhor os resultados após apagar. - Para objetos longos e finos (ex.: fios de energia), você pode clicar em duas posições e tudo entre elas será selecionado. A seleção funciona em linha reta, então para objetos curvos você precisará clicar em intervalos para seguir a curva. - - TOPIC: REMOVER HALO +image: remove-halo.png +image: remove-halo2.png - Remove halos deixados por algumas funções de edição. Selecione o tipo de halo: claro (mais comum) ou escuro. Arraste com o botão esquerdo o mouse sobre a área do halo para alterar os pixels dentro do mouse, como mostrado no exemplo. Para um halo claro, os pixels mais claros escurecerão conforme o mouse é arrastado sobre eles. Para um halo escuro, os pixels mais escuros clarearão. Use um raio de mouse maior que a largura do halo, como mostrado no exemplo. Arraste com o botão direito o mouse para restaurar os pixels originais. - - TOPIC: ARTEFATOS JPEG +image: jpeg-artifacts.png +image: jpeg-artifacts1.jpg - Imagens JPEG que foram altamente comprimidas (com uma configuração de baixa qualidade) podem mostrar artefatos de compressão na forma de pequenos blocos retangulares. Se algumas áreas de uma foto tiveram sua faixa de brilho expandida, tais blocos podem se tornar mais visíveis porque os degraus de brilho são maiores (ex.: valores RGB de 11/12/13 clareados 5x para 55/60/65). Esta função desfoca as bordas entre os blocos para torná-los menos visíveis. - 'Limite de Combinação' determina quando pixels adjacentes são tratados como membros do mesmo bloco de pixels. Limite de Combinação pode ser definido com um valor mais baixo para obter tais blocos mapeados de forma mais completa. 'Limite de Contraste' serve para evitar a mesclagem de bordas onde o contraste é alto, causando perda de detalhes. Altere as duas configurações e pressione [aplicar]. Veja a imagem resultante em tamanho >2x e experimente diferentes configurações se a otimização for importante. Esta função será menos eficaz em uma imagem que foi redimensionada. Use {SELECIONAR ÁREA} para processar seletivamente áreas problemáticas. - - TOPIC: ANTI-SERRILHADO +image: anti-alias.jpg - Às vezes as fotos mostram pixelização ('serrilhado') ao longo de algumas bordas de características de alto contraste. No exemplo acima, você pode ver isso ao redor do olho do pássaro. A ferramenta anti-serrilhado pode reduzir isso. O efeito é pequeno na maioria das fotos, onde o processamento na câmera pode já ter cuidado do problema. Um efeito secundário é que os artefatos jpeg em imagens altamente comprimidas são um pouco suavizados. Imagens que foram ampliadas em tamanho terão pixelizações mais proeminentes. Estas podem ser ajudadas, especialmente no caso de uma ampliação de 2x. - Use o botão [aplicar] para suprimir os pixels, várias vezes se isso parecer ajudar. 'Limite' pode ser usado para excluir pixels de baixo contraste do processamento. Um valor de 0,1 ou menos geralmente é o melhor. - O Fotocx usa o algoritmo Scale3x, modificado para usar tons de cor "semelhantes" e "diferentes" em vez de "iguais" e "não iguais". - - TOPIC: AJUSTAR RGB +image: adjust-RGB.png - Altera o brilho e o contraste gerais, ou os das cores selecionadas. • Brilho - aumenta ou diminui o brilho geral da imagem • +Vermelho -Ciano etc. - altera o brilho da cor e altera a cor complementar na direção oposta • Contraste Total - aumenta ou diminui o contraste geral da imagem • Contraste Vermelho Verde Azul - processa cores RGB individuais - - TOPIC: AJUSTAR HSL +image: adjust-HSL.png - Altera um intervalo selecionado de cores em uma imagem usando HSL (Matiz, Saturação, Luminosidade). Esta função pode ser usada para corrigir um tom de cor ou mudar uma cor para outra (ex.: um céu superexposto - muito branco). Se você não estiver familiarizado com o modelo de cor HSL, leia o artigo da Wikipedia sobre isso. - Comece selecionando uma cor de imagem alvo para combinar e ajustar, usando shift + clique esquerdo na imagem. Esta cor será o centro de um intervalo de cores que será selecionado para ajuste. Selecione quais atributos de cor serão combinados usando as caixas de seleção de matiz, saturação e luminosidade. Cada uma delas estreitará o intervalo de cores selecionadas. Se nenhuma estiver marcada, todas as cores são selecionadas. Nível de Combinação pode ser usado para ampliar ainda mais o intervalo de cores selecionadas. 100% significa que apenas cores muito próximas são selecionadas. - Os controles de Cor de Saída (matiz, saturação, luminosidade) são usados para definir a nova cor de saída que substituirá ou se misturará com as cores de entrada selecionadas. Você também pode definir esta cor a partir da imagem, usando shift + clique direito. A cor resultante será uma mistura da cor original e da nova cor. A fração da nova cor é definida pelo slider Ajuste, que pode ser definido de 0 a 100%. Use as caixas de seleção HSL para determinar quais componentes HSL da cor de entrada são substituídos pelos componentes HSL correspondentes da cor de saída. Use os sliders da cor de saída HSL para ajustar a nova cor. A cor de saída é mostrada na caixa menor à esquerda, que é atualizada conforme você move os sliders. - Mova os sliders e observe as atualizações da imagem em tempo real para otimizar o resultado. Isso não é muito intuitivo, e a prática ajudará. Dica: comece combinando por matiz e saturação, e substituindo apenas o matiz - isso significa que a saturação e a luminosidade da cor de saída serão copiadas das cores da imagem original, e apenas o matiz será substituído. - - TOPIC: REMOVER POEIRA +image: remove-dust.png +image: remove-dust2.jpg - Imagens feitas a partir de slides escaneados empoeirados podem ter muitas pequenas manchas escuras - sombras da poeira nos slides. Fotos históricas da internet frequentemente têm um problema semelhante. Esta função pode remover a maioria dessas manchas. Mova os três sliders até que o número máximo de manchas de poeira seja pintado de vermelho, depois pressione o botão [apagar] para apagá-las. Pressione [red] para trazer de volta a visualização vermelha, então você pode ajustar os sliders novamente e pressionar [apagar]. O slider "limite do tamanho da mancha" limita o tamanho das manchas que serão apagadas. O slider "brilho máx." define um limiar para ignorar manchas que não são escuras o suficiente. O slider "contraste mín." filtra manchas com baixo contraste em relação ao seu entorno. Este processo geralmente é um compromisso. Se as configurações não forem ideais, pequenas características como folhas de árvores podem ser apagadas, ou manchas grandes podem permanecer no lugar. Diferentes partes da imagem podem precisar de configurações diferentes, ex.: o céu pode ser tratado de forma mais agressiva do que a parede de um edifício. Você pode simplesmente usar Apagar Poeira várias vezes com configurações diferentes conforme necessário para obter todas as manchas de poeira. Ou você pode usar {SELECIONAR ÁREA} para processar a imagem em seções. Se algumas manchas persistirem, você pode tratá-las manualmente com {APAGAR INTELIGENTE}. Defina um raio de mouse pequeno e clique em cada mancha para removê-la. Manchas de fibras (longas e finas) geralmente não são removidas automaticamente, mas o Apagar Inteligente pode ser eficaz aqui. Se a poeira for clara, como no exemplo acima, use {MODO DE COR} para criar um negativo colorido, processe a poeira, e então repita o negativo colorido para restaurar a imagem normal. - - TOPIC: FRANJAS +image: fringes.png +image: fringesA.jpg - Corrige franjas de cor periféricas (aberração cromática lateral) - onde franjas de cor aparecem principalmente nas áreas externas da imagem. - A imagem à esquerda acima é um recorte ampliado do canto superior esquerdo de uma foto com aberração cromática lateral. Isso foi majoritariamente eliminado na imagem processada à direita. Franjas de cor podem aparecer ao longo de bordas de alto contraste, especialmente nas áreas externas da imagem, onde as distorções de lente costumam ser maiores. Para eliminá-las, dê zoom na imagem até o tamanho máximo e centralize em uma área com franjas de cor. Pressione o botão [search]. Os planos de cor vermelho e azul são redimensionados para se alinhar melhor com o plano verde, e os fatores usados são inseridos na caixa de diálogo. Você pode conseguir melhorar o resultado revisando os fatores diretamente na caixa de diálogo: altere os fatores enquanto observa as franjas de cor na imagem. - Esta função será menos eficaz se a imagem tiver sido cortada de forma que o centro da imagem não seja mais o mesmo que o centro da fotografia original. - - TOPIC: MENU DE REFINAMENTO - - TOPIC: ACHATAR HISTOGRAMA +image: flatten1.jpg +image: flatten2.jpg - Aumenta o detalhe visível em áreas com contraste ruim. O brilho do pixel é ajustado para cima ou para baixo para tornar a distribuição de brilho (histograma) da área ao redor do pixel mais uniforme. Um raio menor (área menor) intensificará o efeito. Existem 5 zonas de brilho, da mais escura (1) à mais clara (5). Mova um slider para aumentar o efeito na zona correspondente. Use o slider da zona A para mover todos os 5 sliders juntos e definir rapidamente um resultado inicial. Depois use os outros sliders individualmente para ajustar finamente a imagem. - - TOPIC: CONTRASTE LOCAL +image: localcon1.jpg +image: localcon2.jpg - Aumenta o contraste em cada área de uma imagem. O brilho de cada pixel é comparado ao brilho médio da área ao redor. O brilho do pixel é ajustado para aumentar essa diferença. Esta função implementa um método amplamente usado, encontrado em livros didáticos. Raio determina o tamanho da área ao redor de cada pixel usada para o brilho médio. Potência determina a quantidade de mudança de brilho. Cor é usado para aumentar a saturação de cor. Você pode usar a curva editável para clarear a imagem de saída para níveis de brilho selecionados. O exemplo mostra o clareamento das áreas mais escuras da imagem. - Contraste Local pode criar "halos" em algumas circunstâncias: +image: localcon3.jpg - A imagem original está à esquerda. A imagem do meio teve Contraste Local aplicado na potência máxima. Um halo pode ser visto ao longo da fronteira entre as colinas escuras e o céu mais claro. Isso pode ser corrigido com um truque simples (imagem à direita). Selecione as áreas do céu separadamente, usando {SELECIONAR ÁREA}. Aplique Contraste Local a esta área. Inverta a seleção e aplique Contraste Local ao restante da imagem. - - TOPIC: AMPLIFICAR CONTRASTE +image: amplify-contrast.png +image: amplify-contrast2.jpg - Aumenta a faixa de brilho aparente de uma imagem aumentando o contraste local. Pode aumentar áreas de baixo contraste sem alterar áreas de alto contraste. Você também pode usar a curva de edição para variar a amplificação do contraste pela quantidade inicial de contraste. - O slider Amplificar abaixo da curva regula o cálculo, de nenhuma amplificação de contraste até amplificação total. Se movido longe demais para a direita, a imagem pode mostrar artefatos feios, então recue até que estes desapareçam. Se áreas uniformes (ex.: céu) ficarem manchadas, puxe a extremidade esquerda da curva para baixo para reduzir a amplificação em áreas de baixo contraste. Em alguns casos, será melhor selecionar diferentes áreas da imagem e processá-las separadamente, ex.: conservador para o céu, mais agressivo para superfícies com textura como paredes de pedra. - - TOPIC: RETINEX GLOBAL +image: global-retx.png +image: global-retx2.jpg - Melhora a cor e o contraste de imagens com névoa/neblina extrema ou tom de cor (ex.: uma foto de 100 anos). Experimente o botão [Auto] primeiro. A imagem é buscada para encontrar as cores RGB mais claras e mais escuras presentes. Os valores RGB mais escuros são subtraídos de todos os pixels e os valores RGB resultantes são escalados para que os valores RGB máximos fiquem próximos de 255. Claro que isso pode não ser inicialmente ideal. Os spin buttons são definidos com os limites RGB escuro e claro encontrados, e você pode alterá-los para otimizar a imagem resultante. Você pode escolher seus próprios pontos escuro e claro selecionando a opção correspondente na caixa de diálogo e clicando na imagem. Os spin buttons de multiplicador são definidos como 1.0 por padrão, e você pode alterar esses valores para ajustar o brilho relativo de cada cor RGB. No exemplo acima, a 1ª imagem é a original, a 2ª imagem foi feita usando o botão [Auto]. A coluna mais à direita dos spin buttons ajustará todos os botões na mesma linha juntos - use a roda do mouse ou as teclas de seta para cima/baixo do teclado. - O slider de mesclagem é usado para misturar a imagem de entrada e a imagem retinex em qualquer proporção. O slider reduzir claro é usado para atenuar o efeito em áreas mais claras da imagem, especialmente o céu, onde o Retinex pode produzir resultados de aparência estranha. - O algoritmo foi derivado de conceitos publicados pela primeira vez por Edwin Land na década de 1970. Busque na internet por 'retinex' para mais informações. - - TOPIC: RETINEX LOCAL +image: local-retx.png +image: local-retx2.jpg - Aumenta os detalhes visíveis em áreas escuras da imagem e outras áreas com baixo contraste. A faixa de brilho de uma zona ao redor de cada pixel é usada para redimensionar o brilho do pixel como se toda a zona fosse redimensionada para cobrir toda a faixa de brilho 0-255. Retinex Local pode produzir resultados dramáticos onde o Retinex Global é fraco. - A entrada de raio determina o tamanho aproximado da zona ao redor de cada pixel. O slider de mesclagem é usado para misturar a imagem de entrada e a imagem retinex em qualquer proporção. O slider reduzir claro é usado para atenuar o efeito em áreas mais claras da imagem, especialmente o céu, onde o Retinex pode produzir resultados estranhos. O slider reduzir escuro faz o mesmo para áreas mais escuras da imagem. O exemplo acima é cerca de 60% imagem original + 40% retinex. - - TOPIC: SATURAÇÃO +image: saturation.png - Ajusta a saturação de cor com base no brilho do pixel. O eixo Y da curva de edição é a saturação de cor, de nenhuma cor (todos os valores RGB iguais) até cor máxima (o menor valor RGB é zero). O eixo X da curva é o brilho do pixel, do escuro ao brilho máximo. A posição neutra (sem mudança de cor) é o valor intermediário, que também é o valor inicial. Exemplo: para aumentar a intensidade de cor das áreas escuras na imagem, eleve a extremidade esquerda da curva. O slider Saturação move a curva inteira para cima ou para baixo sem alterar seu formato. - - TOPIC: FOCO SUAVE +image: soft-focus2.jpg +image: soft-focus.png - Aplica o clássico efeito de "foco suave" a uma foto. Esta é uma mistura de uma imagem nítida e uma imagem levemente desfocada. A configuração de raio determina a extensão do desfoque (extensão de pixels), e a configuração de mistura define a proporção da imagem desfocada na imagem de saída mista, de 0 a 100 por cento. Você pode usar {PINTAR EDIÇÕES} com esta função, para variar o efeito em diferentes áreas da imagem. - - TOPIC: GRADAÇÃO DE BRILHO +image: brite-ramp1.png +image: brite-ramp2.png - Varia o brilho ou a cor em uma imagem. Você pode usar isso para compensar iluminação desigual ou um tom de cor que varia pela imagem. A direção da mudança é determinada desenhando uma linha na imagem. Crie a linha clicando na imagem, depois arraste qualquer extremidade para definir a direção desejada. No exemplo acima, o verde foi aumentado na direção da linha. Edite a curva Todas primeiro para ajustar o brilho geral (todas as cores), depois ajuste as curvas de cor RGB individuais se necessário. - - TOPIC: VINHETA +image: vignette.png +image: vignette2.jpg - Corrige o escurecimento às vezes visto nos cantos de uma foto. Também pode ser usado para realçar ou colorir um objeto ou área dentro de uma imagem. - Clique ou arraste o mouse na imagem para alterar o centro da vinheta, que está inicialmente no centro da imagem. - Selecione 'Brilho' para alterar o brilho da imagem em um padrão radial: Ajuste a extremidade esquerda ou direita da curva para alterar o brilho do centro e das bordas da imagem, respectivamente. Você pode dar um entorno escuro a um rosto em retrato, ou pode corrigir uma imagem com cantos escurecidos. O nível médio da curva corresponde a nenhuma mudança. Use valores mais baixos para escurecer e valores mais altos para clarear. O exemplo acima escurece gradualmente a periferia da imagem enquanto deixa uma ampla área central inalterada. - Selecione 'Cor' para adicionar uma cor escolhida à imagem em um padrão radial. Valores da curva iguais a zero representam nenhuma mudança, e valores mais altos adicionam a cor escolhida à imagem. O valor mais alto corresponde a 100% de cor. Use esta função para adicionar um entorno colorido a uma imagem, ex.: rodear um rosto com uma cor gradualmente crescente. - - TOPIC: MENU DE EFEITOS - - TOPIC: CONTORNOS +image: outlines1.png +image: outlines2.jpg - Transforma uma foto em um desenho de contornos. Pixels de alto contraste são intensificados e pixels de baixo contraste são suprimidos. A configuração de limite define os limiares de contraste. Linhas abaixo do mínimo não são mostradas, e aquelas acima do máximo terão brilho máximo. A caixa de seleção 'preto/branco' converte linhas coloridas em preto sobre branco ou branco sobre preto, dependendo da caixa de seleção 'negativo'. Use 'Amplificação Baixa' para clarear linhas desbotadas se desejado. 'Modo B' resulta em um brilho de linha mais uniforme em comparação com 'Modo A'. - - TOPIC: ESBOÇO1 +image: sketch1.jpg - Transforma uma foto em algo parecido com um esboço. Pixels escuros são agregados em menos pixels, deixando as áreas esvaziadas mais claras. O contraste também pode ser usado como um substituto para pixels escuros. Limite pode ser usado para filtrar a imagem de entrada por brilho. Nível de Corte é usado para filtrar a saída para reduzir ainda mais pixels escuros isolados ou marginalmente escuros. Escolha cores para o primeiro plano e o fundo. Reduzir o tamanho da imagem de entrada pode gerar resultados interessantes. Se o resultado parecer "sujo", use {REDUZIR RUÍDO} ou {FUSÃO} para suavizar a imagem antes de processar aqui. - - TOPIC: ESBOÇO2 +image: sketch2.png +image: sketch2b.jpg - Transforma uma foto em algo parecido com um esboço. Usa um método diferente: pixels de contraste baixo ... alto são convertidos em pixels claros ... escuros, respectivamente. A curva pode ser usada para aumentar ou diminuir a potência da conversão de contraste. A escala do eixo X é o contraste do pixel, de baixo a alto, e o valor Y determina a intensidade da conversão. O exemplo mostra pixels de baixo contraste sendo suprimidos (tornados mais claros). A imagem de entrada pode ser mesclada em qualquer proporção. Se o resultado parecer "sujo", use {REDUZIR RUÍDO} ou {FUSÃO} para suavizar a imagem antes de processar aqui. - - TOPIC: DESENHO ANIMADO +image: cartoon.jpg - Transforma uma foto em um desenho estilo desenho animado. Linhas pretas são desenhadas sobre bordas de características na imagem, sempre que o brilho ou a cor mudam abruptamente. Limite de Linha define a sensibilidade para detecção de bordas e desenho de linhas, causando o desenho de menos ou mais linhas. Largura de Linha torna as linhas mais grossas ou mais finas. Profundidade Kuwahara controla uma função de nitidez que pode fortalecer bordas de características dentro da imagem. - - TOPIC: RELEVO +image: emboss2.jpg +image: emboss.png - Transforma uma imagem em um relevo simulado ou imagem em relevo (um efeito 3D). Bordas de características são tornadas mais claras de um lado e mais escuras do lado oposto, como se estivessem elevadas e iluminadas de lado. A configuração de raio determina a largura do efeito, e a configuração de profundidade determina a intensidade. A configuração Fonte de Luz determina o ângulo de onde a iluminação aparente está vindo. Isso pode ser variado para maximizar o efeito para bordas de características mais perpendiculares a esse ângulo. - - TOPIC: LADRILHOS1 Transforma uma imagem em um array de ladrilhos monocromáticos. Você pode controlar o tamanho do ladrilho e a espessura do espaço entre os ladrilhos. Isso também é chamado de 'pixelizar'. Use Selecionar Área para confinar a transformação a uma área limitada, ex.: um rosto. - - TOPIC: LADRILHOS2 +image: tiles2a.png +image: tiles2b.png - Transforma uma imagem em ladrilhos irregulares que se ajustam aproximadamente às cores e contornos da imagem. ^tamanho base:^ O tamanho base do ladrilho, que é o tamanho unitário de ladrilho usado para fazer ladrilhos maiores. ^profundidade de cor:^ Número de cores a usar: 1 = 8 cores, 2 = 64 cores ... 8 = 16 milhões de cores. ^meta da área do ladrilho^: O limite superior do tamanho do ladrilho (área em pixels). ^combinação de cor necessária^: Define a combinação de cor mínima necessária para que uma área menor seja consolidada em uma área maior adjacente: 0 = não importa (consolidação máxima), 100 = correspondência perfeita necessária (consolidação mínima). - - TOPIC: PINTURA +image: painting1.png +image: painting2.png - Transforma uma imagem em algo semelhante a uma pintura. Reduz o número de cores, mapeia cada área contígua de pixels com a mesma cor, e então consolida áreas menores em áreas maiores adjacentes com a melhor correspondência de cor. - ^raio de desfoque^: Desfoca a imagem antes do processamento. Isso resulta em bordas mais suaves. ^profundidade de cor^: Número de cores a usar: 1 = 8 cores, 2 = 64 cores ... 8 = 16 milhões de cores. ^meta da área do bloco^: Define um limite inferior para áreas que terão sua própria cor: áreas menores que esse número de pixels serão absorvidas em uma área adjacente com a correspondência de cor mais próxima. ^combinação de cor necessária^: Define a combinação de cor mínima necessária para que uma área menor seja consolidada em uma área maior adjacente: 0 = não importa (consolidação máxima), 100 = correspondência perfeita necessária (consolidação mínima). ^bordas^: Determina se as áreas coloridas serão delineadas com uma fina borda preta, como ladrilhos irregulares em um mosaico. Após usar esta função, usar {RELEVO} pode adicionar textura interessante à imagem. - - TOPIC: TEXTURA +image: texture2.jpg +image: texture.png - Adiciona uma superfície texturizada a uma imagem ou áreas selecionadas dentro de uma imagem. Raio determina o tamanho do padrão de textura. Intensidade determina a intensidade do padrão, de quase invisível a dominante. - - TOPIC: FUSÃO +image: fusion.png +image: fusion2.jpg - Suprime pequenos detalhes de baixo contraste em uma imagem, mantendo a nitidez para características maiores da imagem. Pressione [iniciar] e observe a imagem de perto. O processo é executado continuamente até ser interrompido com o botão [parar]. Pequenos detalhes desaparecerão lentamente. O rótulo 'contagem' da caixa de diálogo mostra a contagem de iterações. Você pode [parar] o processo para inspecionar a imagem e depois retomar o processamento com [iniciar]. Use o botão Desfazer/Refazer para comparar o status da imagem antes/depois. Retome o processamento com [iniciar]. O botão [etapa] pode ser usado para processar uma etapa de cada vez. - - TOPIC: COMBINAR CORES +image: match-colors.png - Combina as cores de uma imagem com as de outra. Um pequeno ponto, selecionado com um clique do mouse, é amostrado de cada imagem. O ponto na 2ª imagem será feito para ter a mesma cor média (valores RGB) que o ponto da 1ª imagem. Os fatores usados para tornar os valores RGB iguais são então aplicados a todos os pixels na 2ª imagem. Um uso comum é remover um tom de cor de uma imagem marcando um ponto na imagem que corresponderá a uma cor de outra imagem. - Procedimento: A caixa de diálogo lista 5 etapas a serem seguidas em sequência. • Defina um raio para a área de amostra do ponto. O círculo do mouse resultante é a área do ponto a ser amostrada. • Abra a 1ª imagem pressionando o botão [open]. • Clique na imagem para tirar uma amostra de cor. • Abra a 2ª imagem pressionando o botão [open]. • Clique na imagem no ponto que você quer que corresponda à 1ª imagem. As cores da imagem mudarão em um ou dois segundos. - - TOPIC: PADRÃO +image: pattern2.jpg +image: pattern1.png - Adiciona um padrão de fundo a uma imagem. Um pequeno arquivo de imagem (arquivo de padrão) é usado para cobrir a imagem atual duplicando o arquivo, como uma parede de ladrilhos. Este arquivo pode ser um padrão real (ex.: uma imagem de tecido de lona, uma parede de tijolos, uma geometria repetitiva ...), ou qualquer outro tipo de imagem. O padrão é tornado semitransparente, de forma que a imagem base pareça estar impressa sobre o padrão, ou o padrão sobre a imagem. Muitos arquivos de padrão podem ser encontrados usando uma busca na web por "pattern image". Baixe alguns destes e corte-os se necessário para um tamanho de cerca de 200-500 pixels. Por conveniência, adicione-os aos arquivos de padrão fornecidos em ~/.fotocx/patterns. - Use o botão [Procurar] para selecionar um arquivo de padrão. O padrão selecionado será organizado em blocos para cobrir a imagem base. O padrão é parcialmente transparente para que a imagem base apareça através dele. Use Zoom para aumentar ou diminuir o tamanho do padrão. Existem dois métodos para misturar o padrão com a imagem base. A opacidade do padrão pode ser definida de 0-100%. A imagem base é usada para preencher a opacidade não utilizada. Contraste é usado para modificar o brilho da imagem base usando o brilho do padrão como modelo. Os dois parâmetros podem ser misturados em qualquer proporção. - Se o arquivo de padrão contiver uma imagem que se repete em intervalos fixos tanto horizontal quanto verticalmente, o botão [Calcular] pode ser usado para definir a largura e a altura de forma a criar um padrão contínuo sem costuras visíveis. - Se o padrão for irregular e as costuras forem aparentes, você pode conseguir melhorar isso. Os dois valores de Sobreposição determinam quanto os padrões duplicados se sobrepõem nas bordas, horizontal e verticalmente. Adicione alguma sobreposição para mascarar efeitos de borda. - Selecionar Área pode ser usado para aplicar um padrão a parte de uma imagem, ou padrões diferentes a partes diferentes. Após aplicar um padrão a uma imagem, pode ser interessante usar {RELEVO} para adicionar um efeito 3D ao padrão. - A caixa de seleção "Escala de Cinza" converterá um padrão colorido para escala de cinza. - - TOPIC: CRUZAMENTO DE LINHAS +image: crosshatch2.jpg +image: crosshatch1.png - Converte uma imagem em um desenho usando linhas paralelas cruzadas. Digite um tamanho de grade e pressione [aplicar]. - - TOPIC: DITHERING +image: dither1.png - +image: dither2.jpg - Esta função oferece várias formas de aplicar dithering em uma imagem - converter em pontos. 0 - pontos coloridos no estilo de Roy Lichtenstein 1 - R/G/B puro ou preto/branco com distribuição espacial aleatória ou otimizada 2 - mistura RGB usando uma profundidade de bits dada 3 - dithering clássico usando uma paleta de cores personalizada 4 - condensa a imagem em manchas com a cor média dos pixels condensados - Os ditherings clássicos usam o método Floyd-Steinberg de compensar erros de cor: incompatibilidade entre a cor de uma imagem de entrada e a cor mais próxima da paleta. Pontos com cores próximas são misturados conforme necessário para que a média sobre uma área corresponda mais de perto à cor de entrada. A compensação de erro pode ser desativada se desejado, para obter faixas ou contornos de cor distintos. - Manchas: Os pixels da imagem passam por uma espécie de "colapso gravitacional", convergindo em aglomerados ao redor de centros locais de massa. 'Massa' é definida como o brilho do pixel. O controle 'raio' define aproximadamente o alcance de atração. Pressione [iniciar] para começar o colapso. Observe a imagem mudar lentamente em manchas com aproximadamente o tamanho da entrada 'raio'. Quando as manchas estiverem bonitas e redondas e mudando muito pouco, pressione [parar] para finalizar o processo. - - TOPIC: GRAVURA +image: engrave.png +image: engrave2.png - Converte uma imagem em linhas preto e branco. A entrada Tamanho determina a espessura da linha e quantos pixels verticais da imagem são usados para cada coluna de pixel vertical nas linhas de saída. As colunas de pixel de linha são divididas em partes pretas e brancas, com sua proporção correspondendo aproximadamente ao brilho médio dos pixels de entrada. A entrada Viés pode ser usada para otimizar o brilho geral. Valores negativos/positivos tornam a imagem mais escura/clara. A entrada Cor (0-100%) pode ser usada para adicionar cor às partes brancas. - - TOPIC: ADICIONAR BRILHO INTENSO +image: addglare.png +image: addglare2.jpg - Adiciona brilho intenso irradiando de pontos claros em uma imagem. Potência: determina o brilho relativo do brilho intenso Limite: brilho de pixel limiar para emitir brilho intenso Alcance: alcance de pixels do brilho intenso a partir dos pixels emissores Pixels com brilho acima do limite (200-255) emitirão brilho intenso. Brilho aqui significa o brilho da cor RGB mais clara em um pixel. O brilho intenso emitido tem a cor do pixel emissor. Alcance é em unidades de pixel. O brilho intenso será máximo no pixel emissor e diminuirá gradualmente até zero no limite de alcance. - - TOPIC: MOSAICO +image: mosaic1.png +image: mosaic2.jpg - Cria uma imagem em mosaico usando ladrilhos feitos de todas as suas imagens. - Especifique o tamanho do ladrilho em pixels (ex.: 36 x 24) e pressione [Ladrilhos]. Ladrilhos serão criados a partir de todas as suas imagens (na verdade, as imagens em thumbnail são usadas, por velocidade). Se você alterar as dimensões do ladrilho, pressione [Ladrilhos] novamente para regenerar os ladrilhos. Depois que os ladrilhos forem criados, pressione [Imagem] para converter a imagem atual em um mosaico usando esses ladrilhos. Os ladrilhos são escolhidos combinando a cor média do ladrilho com a cor média da imagem na posição do ladrilho. Se milhares de imagens estiverem disponíveis e se o intervalo de cores for bom o suficiente, o mosaico ficará bastante bom. Dê zoom em qualquer parte da imagem para ver as imagens dos ladrilhos. - O slider Mesclagem de ladrilhos fará com que a imagem seja mesclada com os ladrilhos, fazendo com que fique melhor se os ladrilhos tiverem uma correspondência de cor ruim. Se a mesclagem for menor que cerca de 50%, os ladrilhos permanecem quase tão nítidos quanto antes, porque o olho compensa a falsa tonalidade. - Depois que um mosaico é criado, você pode clicar em qualquer ladrilho para obter uma imagem popup maior. Se um mosaico salvo for aberto, clicar nos ladrilhos para uma imagem maior não funcionará. Regenerar o mosaico é bastante rápido, então faça isso se quiser que os popups funcionem. - - TOPIC: ADICIONAR RUÍDO +image: add-noise.png - Adiciona ruído de cor aleatório a uma imagem. Defina um tamanho de ponto alvo de 1-10 e um nível de ruído de 0-100%. A 100%, ruído aleatório no intervalo de -127 a +127 é adicionado a cada valor RGB de cada pixel. O valor médio é zero. Estouros fora do intervalo 0-255 são truncados. A cor média em uma área grande é preservada, com o ruído sobreposto. Você pode usar Adicionar Ruído com Selecionar Área ou Pintar Edições para adicionar ruído a áreas selecionadas. - ^Supressão de 'faixamento' Em áreas da imagem onde a distribuição de brilho foi 'esticada', um 'faixamento' visível pode ocorrer em áreas de brilho e cor quase uniformes. Você pode reduzir esse problema adicionando ruído (ou desfoque) às áreas afetadas. - - TOPIC: DEFINIR CORES +image: set-colors1.jpg +image: set-colors2.jpg - Você pode reduzir o número de cores usadas na imagem para criar um efeito de pôster. Defina cada cor RGB separadamente, ou ajuste a contagem total de cores. A profundidade de bits de cor não é usada para isso. Algumas funções no Fotocx usam profundidade de bits, limitando as cores disponíveis a 2, 4, 8 ... para cada cor RGB. Esta função não é limitada nesse aspecto. O exemplo acima usa 8 vermelhos, 5 verdes e 3 azuis. - - TOPIC: DESLOCAR CORES +image: shift-colors.png - Esta função pode ser usada para corrigir cores ou converter uma imagem em cores falsas. Escolha qualquer uma das três cores RGB e mova o slider para a esquerda ou direita a partir do centro. Uma das outras duas cores será substituída de forma gradual. Por exemplo, você pode substituir gradualmente verde ou azul pela cor vermelho. O slider Todas desloca todas as cores juntas. Faça isso primeiro para encontrar um primeiro ideal, depois desloque as cores RGB individualmente. - - TOPIC: CORES ALIENÍGENAS +image: alien-colors2.jpg +image: alien-colors1.png - Repinta uma imagem ou área selecionada com cores alienígenas aleatórias. Você pode controlar o tamanho aproximado do padrão e a intensidade (de quase invisível a dominante). Pressione [Aplicar] para obter uma nova distribuição de cores. - - TOPIC: KERNEL PERSONALIZADO +image: custom-kernel.png - Aplica um kernel de convolução personalizado a uma imagem. A tecnologia subjacente é explicada na Wikipedia. Digite um tamanho de kernel, um fator de multiplicação, um fator de adição, e preencha os valores da tabela. [Aplicar] aplica o kernel à imagem. [Redefinir] restaura o status original da imagem. Os valores podem ser salvos em um arquivo e recuperados depois usando os botões [Salvar] e [Carregar]. Vários arquivos de exemplo de kernel estão disponíveis inicialmente. Você pode modificá-los e salvar com um nome personalizado. - Matemática: os valores de brilho de cada bloco N por N de pixels na imagem são multiplicados pelos valores correspondentes na matriz do kernel e somados. Este número é multiplicado pelo fator de multiplicação, e o fator de adição é somado a ele. Este valor final se torna o novo nível de brilho para o pixel da imagem no centro do bloco N x N. - - TOPIC: MENU DE DISTORÇÃO - - TOPIC: DESCURVAR +image: unbend1.png +image: unbend2.jpg - Panoramas de assuntos próximos (geralmente edifícios ou ambientes internos) podem mostrar linhas retas que aparecem curvas, ou edifícios inclinados. Distorcer as imagens foi necessário no processo de panorama para que as imagens se encaixassem. A função Descurvar pode ser usada depois para endireitar a imagem do panorama, se necessário. Linhas pontilhadas verticais e horizontais são desenhadas sobre a imagem, mostrando os eixos de descurvamento. Clique ou arraste o mouse próximo à extremidade de uma linha para movê-la. Se os valores nos quatro controles de entrada forem alterados, a imagem é distorcida da maneira indicada pelas quatro imagens correspondentes. Aumente ou diminua os valores e repita até ficar satisfeito. Mova os eixos para alterar os centros de distorção. - Veja também {DISTORCER IMAGEM} para outro método de corrigir a curvatura e a perspectiva da imagem. - - TOPIC: PERSPECTIVA +image: perspective2.jpg +image: perspective1.png - Esta função pode ser usada para endireitar uma foto tirada de um ângulo deslocado. A imagem à esquerda é a foto original, tirada da direita do centro para evitar reflexos. A imagem à direita é a versão endireitada. Esta função também pode ser usada para endireitar um edifício alto fotografado do nível da rua ou de lado. - Clique nos quatro cantos do tetraedro que você quer transformar em um retângulo (no caso acima, os quatro cantos do quadro ou da moldura), então selecione [Aplicar]. Os cantos clicados são marcados com pequenas caixas brancas contendo "A, B, C, D". O canto superior esquerdo de cada caixa marca precisamente a posição na imagem. Clicar perto de uma caixa a moverá para a nova posição. Você pode usar as teclas de seta do teclado para mover os marcadores de canto em passos de 1 pixel. As teclas de seta funcionam no último canto clicado ou movido. - - TOPIC: DISTORCER IMAGEM +image: warps4.jpg - - TOPIC: DISTORCER ÁREA Esta função pode ser usada para criar distorções dentro de uma imagem. Você pode selecionar uma área da imagem e arrastar o mouse para esticar essa área em relação ao resto da imagem. A imagem é como borracha. Se o arraste do mouse começar dentro da área selecionada, então a área é distorcida dentro de seus limites atuais - o movimento é máximo no ponteiro do mouse e diminui para zero nas bordas da área. Se o arraste do mouse começar fora da área selecionada, as bordas da área próximas ao mouse podem ser puxadas para além do limite original da área. Muitos arrastos de mouse de diferentes comprimentos e direções podem ser combinados para alcançar os resultados desejados. - - TOPIC: WARP LINEAR1 +image: warp-linear1.jpg - Esta função é útil para corrigir problemas de perspectiva. Arraste a imagem a partir de perto de um canto, usando o mouse. A imagem é puxada elasticamente a partir desse canto enquanto os outros cantos permanecem fixos. - - TOPIC: WARP LINEAR2 +image: warp-linear2.jpg - Esta função é útil para corrigir problemas de perspectiva. Arraste a imagem a partir do interior, usando o mouse. O interior da imagem é puxado elasticamente enquanto as bordas permanecem fixas. - - TOPIC: DISTORÇÃO CURVA Esta função é útil para corrigir problemas de perspectiva (veja também {DESCURVAR}). Arraste a imagem a partir de qualquer posição, usando o mouse. A imagem inteira será puxada ou empurrada na direção do mouse, mas áreas próximas ao mouse são movidas mais que áreas mais distantes. Você pode endireitar linhas curvas ou deliberadamente curvar a imagem. O controle 'extensão da distorção' determina o raio de distorção ao redor do mouse. 1.0 significa que a imagem inteira é distorcida, e valores menores confinam a distorção a áreas menores ao redor do mouse. - - TOPIC: DISTORÇÃO AFIM Esta função pode ser usada para distorcer uma imagem de formas interessantes. Arraste a imagem a partir de um canto ou borda usando o mouse. As alterações são puramente lineares, então as linhas retas permanecem retas. Esta transformação é chamada de "afim". Detalhes podem ser encontrados com uma busca na web. - - TOPIC: DISTORÇÃO RADIAL +image: warp_radial.png - Adiciona ou remove distorção de barril ou almofada. A distorção de barril é frequentemente vista em imagens RAW que não foram processadas para remover essa distorção. Clique com o botão esquerdo para escolher um ponto central onde as mudanças serão centralizadas - normalmente o centro da imagem. Este é o padrão. Mova o slider 'esticar' para curvar a imagem. - - TOPIC: DESFAZER DISTORÇÃO DE CLOSE-UP +image: unwarp-closeup1.png +image: unwarp-closeup2.jpg - Fotos de rosto em close-up são frequentemente distorcidas, porque áreas mais próximas da câmera são maiores na foto do que áreas mais distantes. Esta função pode ser usada para reverter a distorção. Use {SELECIONAR ÁREA} para selecionar o rosto primeiro (não precisa ser preciso). Clique na imagem perto do centro da distorção (exemplo acima: bochecha direita). Mova o slider para otimizar. - - TOPIC: CRIAR ONDAS +image: make-waves2.jpg +image: make-waves1.png - Esta função distorce uma imagem em um padrão de ondas, como se vista através de água turbulenta. A caixa de diálogo permite alterar o comprimento de onda médio horizontal e vertical, a amplitude e a variância. A entrada "perspectiva" permite que os comprimentos de onda se alonguem gradualmente de cima para baixo. - - TOPIC: TORCER +image: twist1.png +image: twist2.png - Esta função torce a imagem ao redor de um ponto escolhido com um clique ou arraste do mouse. Clique na posição desejada e mova o slider Torcer na quantidade desejada. Você também pode arrastar o mouse ao redor da imagem para alterar o centro da torção. O slider Centro destorce a área central em relação ao resto. O slider Ângulo gira a imagem. - - TOPIC: ESFERA +image: sphere2.jpg +image: sphere.png - Cria uma projeção esférica de uma imagem. Arraste o mouse na imagem para alterar o centro da projeção (o padrão é o ponto médio). O controle achatar modifica a projeção gradualmente de uma esfera (direita) para uma imagem plana (esquerda). O slider ampliar amplia a imagem resultante em até 2x. - - TOPIC: DE DENTRO PARA FORA +image: inside-out2.jpg +image: inside-out1.png - Esta função inverte as distâncias centro-borda de cada pixel. Você pode clicar ou arrastar o mouse para variar o ponto central. - - TOPIC: PLANETA MINÚSCULO +image: tiny-planet.jpg - Envolve uma imagem ao redor de um círculo. Se a imagem for um panorama de 360 graus, não haverá costura visível. • Furo Central: a imagem é envolvida ao redor de um furo central. • Cortar Superior: remove uma margem superior da imagem de entrada. • Cortar Inferior: remove uma margem inferior da imagem de entrada. • Inverter R: espelha a imagem de entrada verticalmente. • Inverter Theta: espelha a imagem de entrada horizontalmente. • Girar: gira a imagem de saída ao redor do centro. - - TOPIC: ESPIRAL DE ESCHER +image: escher-spiral.png +image: escher-spiralA.png - Transforma uma imagem em uma espiral interminável para dentro, como o famoso relógio de M.C.Escher. Largura determina a largura inicial da camada mais externa. Borda determina a largura inicial da borda que separa as camadas, e Cor determina sua cor. O centro padrão é o centro da imagem. Clique na imagem para definir um novo centro. - - TOPIC: ACHATAR FOTO +image: flatten-photo1.png +image: flatten-photo2.jpg - ^Página de livro ou outra superfície curva Achata uma foto de uma imagem em uma superfície curva, ex.: ao redor de uma coluna, ou uma página de um livro grosso aberto, onde as páginas se curvam para dentro na encadernação central. A curvatura das bordas superior e inferior da superfície fornece informações sobre a quantidade de curvatura e a quantidade de estiramento necessária para parecer plana. O exemplo acima é um livro grosso. Outras superfícies arredondadas podem ser corrigidas, ex.: um pôster em uma coluna redonda. - Selecione a opção de traço superior para traçar a borda superior da página curva. Clique com o mouse ao longo da borda, criando um ponto marcador em cada ponto clicado. Depois que 4 pontos estiverem disponíveis, uma linha curva é desenhada através dos pontos. Adicione mais pontos e arraste os pontos conforme necessário para fazer a linha se ajustar de perto à curva da imagem. Selecione a opção de traço inferior e trace a borda inferior da mesma forma. Quando ambos estiverem concluídos, pressione [flatten] para achatar a página. As bordas agora devem estar retas (ou retas o suficiente). Use o slider [stretch] para esticar as laterais da imagem conforme necessário, para compensar a compressão lateral causada pela curvatura. Use o controle Alargar para alargar a imagem conforme necessário para restaurar a proporção correta de largura/altura. O botão [undo] restaura a imagem não modificada, mantendo os pontos marcadores, que podem então ser ajustados para uma nova tentativa revisada. - +image: flatten-photo3.jpg - ^Horizonte curvo Um panorama amplo, ou uma foto de uma lente grande angular, pode ter um horizonte que não é reto ou horizontal. A imagem pode ser endireitada (ou movida de outra forma) traçando uma curva através do horizonte ou de outras áreas que precisam ser alinhadas ao longo de uma linha reta. Selecione a opção de traço superior ou inferior, dependendo se o horizonte (ou outra parte da imagem) fica principalmente acima ou abaixo do meio da imagem. A imagem será distorcida para tornar essa curva reta. Uma curva é suficiente. A outra curva é adicionada automaticamente à borda oposta (superior ou inferior) da imagem. Se o resultado não for satisfatório, use o botão [undo], ajuste os marcadores em qualquer uma das curvas, e tente novamente. Você também pode salvar a imagem e aplicar a função uma segunda vez, usando a imagem salva como ponto de partida. - - TOPIC: MENU DE COMBINAÇÃO Estas são funções que combinam vários arquivos de imagem. No caso de imagens sobrepostas, características correspondentes em cada imagem são alinhadas para coincidir, com precisão de um único pixel. O tempo de alinhamento é tipicamente de 10-30 segundos por imagem. Se você notar que esse processo de alinhamento está dando errado, você pode usar a tecla Escape para encerrar o processo. - - TOPIC: HDR ^Alta Faixa Dinâmica +image: HDR.jpg +image: HDR-adjust.png - Combina (sobrepõe) várias imagens do mesmo assunto com diferentes níveis de exposição. A imagem combinada pode mostrar visibilidade melhorada de detalhes tanto nas áreas mais escuras quanto nas mais claras, na prática usando pixels das imagens mais claras para as áreas escuras, e das imagens mais escuras para as áreas claras. Se a câmera for ajustada manualmente entre as fotos, tenha cuidado para mantê-la nivelada e mirar no mesmo ponto distante. Algum desalinhamento das imagens de entrada pode ser tolerado. Se pessoas ou objetos se moverem entre as fotos, o efeito fantasma não pode ser evitado. - Selecione a função de menu HDR e selecione até 9 imagens ({SELECIONAR ARQUIVOS DE IMAGEM}), que devem ter todas quase as mesmas dimensões em pixels. As imagens são alinhadas e combinadas automaticamente. Quando concluído, a imagem combinada é mostrada, junto com uma caixa de diálogo para ajustes. As contribuições das imagens de entrada são mostradas como uma série de curvas editáveis. A escala horizontal representa o brilho do pixel, do escuro ao claro. Cada curva representa uma imagem que contribui para os pixels de saída. A contribuição da imagem em um determinado nível de brilho é proporcional à altura de sua curva nesse nível. A curva inicial para a imagem mais clara será alta à esquerda e baixa à direita, significando alta contribuição para pixels escuros e baixa contribuição para pixels claros. A imagem mais escura será baixa à esquerda e alta à direita, e as imagens restantes ficarão no meio. As curvas podem ser editadas arrastando-as com o mouse. As contribuições de imagem correspondentes são alteradas de acordo, e você pode ver os resultados em tempo real na imagem de saída. A imagem acima mostra duas imagens de entrada e sua imagem de saída. A caixa de diálogo de exemplo mostra três curvas ajustadas para otimizar três imagens de entrada. - - TOPIC: HDF ^Alta Profundidade de Campo Combina (sobrepõe) várias fotos do mesmo assunto com diferentes configurações de foco, de próximo a distante. Partes diferentes do assunto ficam em foco nítido em cada imagem. Combine as imagens para que todas as partes do assunto fiquem nítidas. - Fazendo as fotos: Escolha um ponto para o centro da imagem. Aponte a câmera para um objeto próximo e pressione o botão do obturador até a metade para definir o foco nesse objeto. Mantenha o botão na posição de metade, aponte a câmera para o centro escolhido, e tire a foto. Agora escolha um objeto mais distante e faça o mesmo. Repita com distância de foco crescente. Espera-se que cada parte do assunto fique nítida em pelo menos uma foto. A posição da câmera deve ser quase a mesma para todas as fotos, o que pode ser um desafio se o assunto estiver muito próximo. O movimento da câmera pode causar problemas de escala e paralaxe (objetos próximos deslocados em relação a objetos distantes). Esses problemas podem ser corrigíveis mais tarde no Fotocx, mas isso pode exigir bastante tempo. É melhor evitar os problemas. - +image: HDF-paint.png - Processando as fotos: Escolha a função de menu HDF e selecione até 9 imagens ({SELECIONAR ARQUIVOS DE IMAGEM}). As imagens agora serão alinhadas da melhor forma possível. A imagem de saída é uma mistura uniforme das imagens de entrada alinhadas. Uma pequena quantidade de movimento da câmera entre as fotos é compensada, mas isso é limitado, e os deslocamentos de paralaxe não são compensados de forma alguma. Quando o alinhamento estiver completo, uma caixa de diálogo abre. Você pode selecionar qualquer imagem de entrada e "pintá-la" com o mouse em qualquer área da imagem de saída. Isso converte a mistura de imagem original para a única imagem selecionada para a área sendo pintada. Para cada área ou objeto na imagem, escolha uma imagem de entrada que esteja nítida nessa área. O raio do pincel pode ser definido maior ou menor, então você pode pintar áreas grandes rapidamente e controlar detalhes finos quando necessário. Se você tiver objetos próximos e distantes sobrepostos, tempo e paciência serão necessários para deixar todos nítidos. Desalinhamentos podem ser corrigidos selecionando a opção de distorção na caixa de diálogo. As imagens subjacentes podem então ser arrastadas e distorcidas com o mouse, e a imagem de saída combinada é alterada de acordo. A distorção é limitada à área ao redor do mouse. Quando uma área pintada é arrastada, a imagem de entrada correspondente é automaticamente selecionada e arrastada, enquanto as áreas pintadas com outras imagens permanecem fixas. Áreas que não foram pintadas não podem ser arrastadas. Mova-se para diferentes áreas e faça arrastos incrementais até que todas estejam alinhadas. - Fluxo de Trabalho Sugerido: Usando o modo de pintura, escolha cada imagem em sequência e pinte todas as áreas que parecem nítidas nessa imagem. Quaisquer fronteiras que não estejam bem alinhadas aparecerão claramente como deslocamentos nas bordas das características da imagem. Algumas dessas podem se tornar sem importância mudando a imagem usada para pintura (se mais de uma imagem estiver nítida o suficiente). Usando o modo de distorção, faça ajustes finos conforme necessário para eliminar deslocamentos visíveis. - - TOPIC: EMPILHAMENTO/PINTURA +image: stack-paint.png - +image: stack-paint2.jpg - Empilha (sobrepõe) várias fotos do mesmo assunto tiradas em momentos diferentes. Remove turistas e carros que aparecem e desaparecem entre as fotos. - Fazendo as fotos: Aponte a câmera para o mesmo ponto distante e tire várias fotos enquanto turistas ou carros se movem na frente do assunto. Tente obter duas ou mais fotos para cada área do assunto não obstruída pelos objetos transitórios. Mantenha a câmera firme e aponte para o mesmo ponto, para que as imagens se alinhem com precisão. - Processando as fotos: Escolha a função de menu Empilhamento/Pintura e selecione até 9 imagens ({SELECIONAR ARQUIVOS DE IMAGEM}). As imagens agora serão alinhadas da melhor forma possível. A imagem de saída (inferior esquerda) é uma mistura uniforme das imagens de entrada alinhadas (linha superior). Quando o alinhamento estiver completo, a caixa de diálogo mostrada acima inicia. Você pode selecionar qualquer imagem de entrada e "pintar" com o mouse em qualquer área da imagem de saída. A única imagem selecionada é usada para a área sendo pintada. Para cada área na imagem, escolha uma imagem de entrada livre dos objetos transitórios. O raio do pincel pode ser definido maior ou menor, então você pode pintar áreas grandes rapidamente e controlar detalhes finos quando necessário. - Operação automática: pressione o botão [Ocultar] para ver se objetos transitórios podem ser removidos automaticamente. Isso funcionará para áreas na imagem onde múltiplas fotos do fundo desobstruído estão disponíveis (imagem inferior do meio). Para mostrar todos os objetos transitórios, pressione o botão [Mostrar] (imagem inferior direita). Isso geralmente funciona, mas não perfeitamente. Pequenos desalinhamentos de imagem ou diferenças de iluminação (especialmente sombras em movimento) podem fazer com que o algoritmo selecione pixels de fundo em vez de pixels de primeiro plano. Você pode usar o método de pintura descrito acima para corrigir os erros manualmente. - - TOPIC: EMPILHAMENTO/RUÍDO +image: stack-noise2.jpg +image: stack-noise.png - Esta função combina 2-9 fotos do mesmo assunto. As fotos devem ser quase iguais, exceto por pequenos deslocamentos causados por uma câmera segurada à mão. Se as fotos foram feitas com uma configuração de ISO muito alta (condições de pouca luz), os pixels terão ruído considerável. Ao fazer muitas fotos e calcular a média entre elas, o ruído pode ser majoritariamente eliminado. - Processando as fotos: Escolha a função Empilhamento/Ruído e selecione até 9 imagens ({SELECIONAR ARQUIVOS DE IMAGEM}). Elas serão combinadas automaticamente e mostradas, e uma caixa de diálogo abrirá. A imagem de saída inicial é uma combinação de todas as imagens de entrada selecionadas, com a média calculada entre elas. Isso significa que os valores RGB para cada pixel de saída são a média dos valores RGB dos pixels de entrada correspondentes. O botão mediana mudará os pixels de saída para a mediana dos pixels de entrada (1-3 valores RGB do meio têm sua média calculada, dependendo do número de imagens). Isso pode ou não ser melhor, então alterne entre os dois para comparar. As caixas de seleção omitir pixel baixo e omitir pixel alto farão com que os valores RGB de entrada mais baixos e mais altos sejam descartados antes de calcular a média. Isso pode remover picos de ruído da mistura. Isso não tem efeito se o método mediana for selecionado. - - TOPIC: EMPILHAMENTO/CAMADAS +image: stack-layers.png - Use esta função para combinar diferentes versões editadas de uma imagem, onde você pode determinar qual versão é mostrada em áreas de imagem selecionadas. Quaisquer imagens podem ser combinadas se tiverem as mesmas dimensões em pixels. - Selecione até 9 imagens de tamanho idêntico. A imagem de saída inicial é uma mistura igual de todas as imagens de entrada. Proporções da Imagem são os pesos relativos das imagens mescladas. Estes podem ser ajustados para variar o peso de cada imagem. Exemplo: se 3 imagens forem combinadas com pesos relativos de 3, 5, 7, então a imagem combinada é 3/15 da imagem nº 1, 5/15 da nº 2, e 7/15 da nº 3. Se a opção "Pintar imagem inteira" estiver selecionada, os pesos podem ser ajustados e a imagem de saída responde imediatamente. Se a opção "Pintar dentro do mouse" estiver selecionada, então o mouse pode ser arrastado e apenas a área dentro do círculo do mouse é pintada, usando as proporções de imagem atualmente ativas. A velocidade de pintura é controlada pelas configurações de Potência para o centro e a borda do mouse. Use números baixos para pintar gradualmente. - - TOPIC: PANORAMA +image: pano-align1.jpg +image: pano-align2.jpg - Esta função costura 2-6 imagens juntas para criar uma imagem grande angular ou panorama. As imagens devem se sobrepor em 10% ou mais, para que o programa possa encontrar onde correspondem e uni-las. Comece selecionando 2-6 arquivos de imagem ({SELECIONAR ARQUIVOS DE IMAGEM}). É útil selecionar as imagens em ordem da esquerda para a direita, para facilitar o alinhamento aproximado inicial. As imagens são inicialmente unidas e mostradas com uma pequena sobreposição transparente. Uma caixa de diálogo de pré-alinhamento (acima) pede que você arraste as imagens para um alinhamento aproximado. Arraste as imagens para a ordem correta da esquerda para a direita. A imagem sendo arrastada pode se sobrepor a outras imagens. Para deixar claro qual imagem está sendo arrastada, arraste a partir de perto do centro da imagem. Depois que as imagens estiverem na ordem correta, alinhe cada imagem com sua vizinha à esquerda. Funciona melhor proceder da esquerda para a direita. Mova uma imagem horizontal e verticalmente para um alinhamento aproximado com sua vizinha à esquerda, depois gire a imagem se necessário arrastando a borda inferior para a esquerda ou direita - a imagem gira ao redor do ponto médio de sua sobreposição com a imagem à esquerda. O método mais rápido é alinhar primeiro a região média da sobreposição, depois girar a imagem à direita se necessário para trazer as regiões superior e inferior da sobreposição ao alinhamento. Precisão extrema NÃO é necessária. As imagens devem estar corretamente curvadas e se encaixar bem. Se não estiverem, então 'mm da lente' (distância focal, equivalente a 35mm) precisa de ajuste. A curvatura da imagem muda conforme o mm da lente é ajustado. O valor inicial é obtido da metadata EXIF se disponível, e isso normalmente é bom o suficiente. Se as imagens não tiverem curvatura (ex.: imagens escaneadas), use a caixa de seleção 'sem curva' para definir o 'mm da lente' efetivamente como infinito. - Se alguma das imagens foi cortada, a matemática que depende da distância focal EXIF não funciona. Você pode conseguir compensar aumentando a distância focal em 'mm_da_lente'. - A caixa de seleção 'alinhamento manual' usará o pré-alinhamento manual como o alinhamento final. Isso é para imagens que não têm características claras necessárias para alinhar as imagens. Esta opção também permite que as imagens tenham sobreposição zero. - Pressione [proceed] quando o pré-alinhamento estiver concluído, e o programa fará o alinhamento fino e unirá as imagens. Internamente, as imagens são deslocadas e giradas e o grau de correspondência é avaliado. Isso é feito com tamanhos de imagem crescentes até que o melhor alinhamento seja encontrado. Isso pode levar um minuto ou mais, dependendo da velocidade da CPU e do tamanho da imagem. Você pode acelerar bastante o processo se reduzir as imagens de entrada para 2/3 ou 1/2 do tamanho. Faça isso também se o processo falhar por falta de memória. - +image: pano-adjust.jpg - Quando o alinhamento fino estiver completo, a imagem combinada é exibida. A caixa de diálogo acima é iniciada para ajustes finos de brilho. Você pode ver uma borda entre as imagens se elas não tiverem o mesmo brilho. Selecione uma imagem usando os botões de opção na parte superior. Use o botão [cor automática] repetidamente para melhorar automaticamente a correspondência de brilho/cor das imagens. A imagem base é a atualmente selecionada. Experimente diferentes imagens base para ver qual funciona melhor. Se as imagens estiverem muito desiguais em brilho, selecione a maior discrepante e use o controle de brilho para alterar o brilho para corresponder às outras, seguido de [cor automática]. A correspondência não precisa ser muito boa, já que a 'Largura da Mesclagem' (a seguir) mascarará as diferenças remanescentes. Use o botão 'Cor do Arquivo' para redefinir os níveis de brilho a partir dos arquivos de imagem de entrada. - O controle 'Largura da Mesclagem' governa como as imagens são mescladas juntas: nas sobreposições da imagem, o brilho é alterado ao longo desse número de pixels, para mascarar desequilíbrios que não podem ser totalmente corrigidos. O padrão é 1 pixel, o que torna qualquer diferença de brilho óbvia. - Se as imagens não se alinharem perfeitamente, você pode conseguir melhorar o alinhamento usando o mouse para empurrar as imagens para o alinhamento. Selecione 'Distorção com Mouse' e selecione uma das imagens com os botões de opção. Então arraste o mouse ao longo da borda da imagem onde ela deve se alinhar com sua vizinha, movendo a imagem para o alinhamento. A imagem é movida localmente ao redor do mouse enquanto partes mais distantes permanecem fixas. Imagens com deslocamento de paralaxe exigirão um compromisso, já que é impossível manter tanto o primeiro plano quanto o fundo alinhados. - O controle de achatar imagem pode ser usado para "descurvar" a imagem, o que endireitará linhas curvas (ex.: edifícios curvos). Um valor de zero não tem efeito e um valor de 1.0 achatará totalmente a imagem. - Quando terminar, use {DESCURVAR}, {DISTORCER IMAGEM}, {CORTAR} etc. para ajustes finais. - ^Imagens escaneadas Imagens escaneadas podem ser combinadas se houver sobreposição suficiente. Marque 'sem curva' já que não há curvatura. - ^Distorção Automática As imagens são levemente distorcidas em várias direções durante o alinhamento para encontrar a melhor correspondência. Isso é para compensar deslocamentos no horizonte da câmera ou rotação, causando distorções de imagem que reduzem a qualidade do ajuste. Se a área de sobreposição de duas imagens incluir um objeto grande que se moveu entre as duas fotos, o processo de alinhamento pode enlouquecer tentando combinar as imagens, tornando o alinhamento muito ruim. Ao selecionar 'sem distorção automática' você pode conseguir que o alinhamento tenha sucesso ou tenha um erro menor. Outra opção é selecionar alinhamento manual. - ^Combinando Panoramas Você pode fazer um panorama de até 6 imagens em uma única passagem. Você também pode combinar panoramas que se encaixam nas laterais, ex.: combinar um panorama de 4 imagens com outro panorama de 4 imagens para fazer um panorama de 8 imagens. Você deve parar a curvatura normal de imagem ao combinar panoramas, já que as imagens do panorama já estão curvadas (assumindo que você não usou a opção 'achatar' na caixa de diálogo final do panorama). Pare a curvatura da imagem marcando a caixa 'sem curva' na caixa de diálogo de pré-alinhamento. - ^Limitações do Panorama Panoramas incluindo objetos próximos podem ser complicados: ao fazer as fotos, tenha cuidado para girar a câmera em um eixo através da lente, com o mínimo de movimento lateral, caso contrário as imagens podem se alinhar mal porque objetos em primeiro plano são deslocados em relação ao fundo (paralaxe). Isso não é um problema quando o assunto está a 50+ metros de distância, já que um pequeno movimento lateral tem pouco impacto na imagem. Mantenha a câmera nivelada para evitar um grande deslocamento vertical (deslocamento do horizonte), que pode causar distorções de imagem que podem não ser totalmente corrigidas. Evite girar a câmera pelo mesmo motivo. - ^Panorama Vertical Isso pode ser feito girando as imagens de entrada 90°. Em Panorama, escolha as imagens em ordem de cima para baixo, para que a imagem superior fique à esquerda e a inferior à direita. Faça o panorama normalmente. Gire a imagem de saída para que a esquerda se torne o topo. - - TOPIC: MOSTRAR ARQUIVOS CIM Mostra os arquivos de entrada para a imagem combinada atual ou mais recente, em uma janela popup. Apenas o conjunto atual ou mais recente é lembrado. - - TOPIC: MASHUP +image: mashup.jpg - Organiza várias imagens e texto em um layout. Imagens podem ser adicionadas, redimensionadas, giradas e movidas arrastando com o mouse. Imagens podem ser tornadas total ou parcialmente transparentes em áreas selecionadas. Texto pode ser adicionado, movido, redimensionado e girado. Atributos de texto podem ser especificados: fonte, tamanho, cor, contorno, sombra, transparência. Linhas e setas podem ser adicionadas. O exemplo aqui mostra algumas das possibilidades. - +image: mashup1.png - Na primeira caixa de diálogo do Mashup, escolha uma imagem de fundo ou layout onde outras imagens serão colocadas. Escolha uma imagem existente ou crie uma nova imagem monocromática com um tamanho e cor especificados. Você também pode abrir um projeto mashup salvo anteriormente e continuar editando. - +image: mashup2.png - A 2ª caixa de diálogo do Mashup é uma escolha: editar imagens, editar texto, editar linhas e setas, redimensionar para um tamanho maior, salvar a imagem combinada concluída (Concluído) ou abandonar a imagem (Cancelar). As três primeiras escolhas levam a caixas de diálogo para realizar as respectivas edições. Cada uma dessas retorna a esta caixa de diálogo quando concluída, então você pode adicionar ou modificar imagens, texto, e linhas/setas em qualquer sequência. Redimensionar é explicado abaixo. - +image: mashup3.jpg - Use esta caixa de diálogo para selecionar e posicionar imagens no layout e revisar sua aparência: tamanho, rotação, posição, transparência. Uma imagem pode ser parcial ou totalmente transparente, no geral ou dentro de áreas especificadas. Isso significa que a imagem de fundo ou a imagem sobreposta pode aparecer através de áreas transparentes. O botão Adicionar Imagem leva a uma caixa de diálogo de seleção de arquivo de galeria ({SELECIONAR ARQUIVOS DE IMAGEM}). As imagens selecionadas são colocadas no layout. Depois que as imagens são adicionadas, clique em qualquer imagem para selecioná-la para modificações. Arraste a imagem a partir do meio para posicioná-la no layout. Arraste o canto inferior direito para redimensionar a imagem. Use os controles da caixa de diálogo para ajustar a imagem. Os controles da caixa de diálogo operam na última imagem adicionada, clicada ou arrastada. Os botões 'Anterior' e 'Próximo' percorrem as imagens uma de cada vez, piscando a imagem selecionada. Isso pode ser usado quando imagens sobrepostas dificultam a seleção da imagem desejada clicando nela. Escala redimensiona a imagem. Ângulo gira a imagem. Os botões de Ordem de Empilhamento elevam ou rebaixam uma imagem em relação a outras imagens - isso determina qual imagem sobreposta ficará no topo. Transparência Base é usada para tornar uma imagem inteira parcialmente transparente. O botão [pintar] é usado para tornar qualquer parte de uma imagem parcial ou totalmente transparente, usando a caixa de diálogo Pintar mostrada abaixo. O botão [distorcer] é usado para dobrar ou distorcer uma imagem, usando a caixa de diálogo Distorção mostrada abaixo. A caixa de seleção 'margens pretas' pode ser usada para remover margens pretas deixadas por outras funções de edição, ex.: distorção. Estas serão tornadas transparentes. O botão 'A imagem está fixa' impedirá que a imagem seja movida pelo mouse ou teclado. Isso é útil quando as imagens estão sendo alinhadas com precisão e o movimento acidental deve ser evitado. Os controles de Margens podem ser usados para tornar as bordas da imagem transparentes. As margens Rígidas cortam as bordas da imagem. As margens de Mesclagem tornam as bordas parcialmente transparentes para mesclá-las com o fundo ou outras imagens sobrepostas. - +image: mashup4.png - "Pintar" mais ou menos transparência em áreas de imagem selecionadas. Clique em uma imagem para selecioná-la. O ponteiro do mouse é um círculo mostrando o alcance da ação. Use raio para ajustar o tamanho. Arraste com o botão esquerdo o mouse sobre a imagem para torná-la transparente nas áreas cobertas pelo círculo. Arraste com o botão direito para torná-la opaca. Se Gradual estiver marcado, as mudanças de transparência são feitas lentamente conforme o mouse é arrastado. Especifique um valor de potência para o centro e as bordas do mouse para regular a taxa de mudança. - +image: mashup5.png - A caixa de diálogo de distorção é usada para distorcer uma imagem. Clique em uma imagem para selecioná-la. Arraste a imagem com o mouse - a imagem se distorcerá ou esticará localmente na direção do mouse (como uma borracha em folha). A área de distorção é dada aproximadamente pela extensão da distorção, que é uma fração do tamanho da imagem. Cada arraste é uma etapa que se soma às etapas anteriores. Etapas recentes podem ser revertidas com [undo last], e a imagem não distorcida pode ser restaurada com [undo all]. - +image: mashup6.png - A caixa de diálogo Editar Texto é usada para colocar texto no layout. Digite algum texto e pressione [Aplicar]. É solicitado que você clique no layout onde o texto será adicionado. Arraste-o para a posição, então use os controles da caixa de diálogo para definir fonte, tamanho, cor, ângulo, cor de fundo, tamanho e cor do contorno, tamanho e cor da sombra, e transparências para cada um destes. Arraste o texto para uma nova posição a qualquer momento. Clique em qualquer texto existente para mostrar suas propriedades na caixa de diálogo e revisá-las. Clique em um texto e pressione Delete para removê-lo. Quando terminar de editar, pressione [OK] para voltar à 2ª caixa de diálogo do Mashup. - +image: mashup7.png - A caixa de diálogo Editar Linha/Seta é usada para colocar linhas ou setas no layout. Funciona de forma muito parecida com adicionar texto. Digite um comprimento e largura e pressione [Adicionar]. É solicitado que você clique no layout onde a linha será adicionada. Uma linha é colocada no layout, ou uma seta se uma das opções de ponta de seta estiver marcada. Arraste a linha/seta para a posição desejada. Ajuste comprimento, largura, ângulo e atributos (fundo, contorno, sombra) usando a caixa de diálogo. Você também pode arrastar qualquer extremidade da linha/seta para definir a posição dessa extremidade, deixando a outra extremidade fixa. - Você pode usar o mouse para mover e redimensionar objetos no layout: • clique no objeto para selecioná-lo - ele pisca para confirmar a seleção. • arraste a partir do centro aproximado para posicionar o objeto. • arraste o canto inferior direito para redimensionar o objeto. • para uma linha/seta, arraste qualquer extremidade para mover apenas essa extremidade. - As teclas de seta do teclado também podem ser usadas para mover o objeto atualmente selecionado em passos de 1 pixel. - Você pode adicionar imagens salvas por {SELECIONAR ÁREA}. Na caixa de diálogo Editar Imagens, pressione [Adicionar] para iniciar a caixa de diálogo de seleção de arquivo. Use o botão [Topo] na janela da galeria, selecione 'saved_areas'. Abra qualquer uma das imagens .png encontradas lá. O contorno de área original é usado, e a mesclagem de área funciona a partir dessas bordas. - ^Arquivos de projeto Mashup Você pode salvar um projeto e abri-lo depois para continuar editando. O projeto Mashup é reconstruído usando essas imagens e alguns dados salvos no arquivo do projeto: locais de imagem e texto, escalas, transparência, etc. - ^Redimensionar Mashup Trabalhar com um layout muito grande (mais de 20 megapixels) pode ser bem lento. Arrastar uma grande imagem sobreposta pode ser lento e irregular. Você pode trabalhar muito mais rápido se usar um layout menor para construir o projeto, e depois torná-lo maior quando terminar. Não há perda de resolução na imagem final, já que as imagens sobrepostas e o texto são regenerados a partir das entradas. O botão Redimensionar permite ampliar o projeto em 2x, 3x ou 4x. Também há uma opção de redefinir para restaurar o tamanho original menor do projeto. Com este método, você pode trabalhar com um layout de 10 megapixels e redimensioná-lo para até 160 megapixels quando terminar. O layout maior ainda pode ser trabalhado diretamente depois, mas será mais lento. - - TOPIC: ARRAY DE IMAGENS +image: image-array.jpg - Selecione várias imagens e una-as em um formato de array compacto dentro de uma moldura colorida. - A primeira caixa de diálogo é mostrada no canto superior esquerdo. Cor de Fundo é a cor da moldura de contorno e dos espaços entre as imagens contidas. Largura do Array é a largura total do array de saída, e Margem é a largura da margem externa que envolve todas as imagens. A altura do array é determinada pelo número de arquivos de imagem selecionados e o espaço necessário para encaixá-los na moldura. Colunas da Imagem especifica o número de colunas de imagem (6 no exemplo acima). O número de linhas depende do número de arquivos de imagem selecionados. Os valores de Separação definem o espaço horizontal e vertical entre as imagens contidas. - Selecione os arquivos de imagem ({SELECIONAR ARQUIVOS DE IMAGEM}), depois pressione [Continuar] quando terminar. A imagem resultante será criada em alguns segundos (ou minutos para centenas de imagens). Esta imagem tipicamente terá uma margem inferior bem irregular, como mostrado pela imagem superior direita acima. A sequência de imagens no array é determinada pela ordem de seleção. A linha superior é preenchida primeiro, da esquerda para a direita, depois a 2ª linha, etc. - A caixa de diálogo Otimizar começa automaticamente. Ela pode reorganizar as imagens para que a margem inferior fique mais uniforme. Pressione [Iniciar] e aguarde a imagem otimizar. Você pode acompanhar o progresso. A função será encerrada se um ótimo for encontrado que torne a margem inferior uniforme dentro de 2 pixels. Ela pode continuar buscando indefinidamente se essa meta não for alcançada. Pressione [Parar] para forçar a função de otimização a encerrar com a melhor solução encontrada até o momento. Se a otimização for bem-sucedida, você obterá colunas uniformes como mostrado na imagem inferior direita. Se a borda inferior ainda estiver irregular após a otimização, você é perguntado se deseja adicionar margens a algumas das imagens para tornar a borda inferior uniforme. Isso resultará em uma borda inferior uniforme, mas os espaçamentos verticais não serão mais iguais. - DICA: A otimização funciona melhor se o número de imagens por coluna for de pelo menos quatro (de preferência mais). Isso dá ao otimizador flexibilidade suficiente para encontrar uma solução com uma borda inferior uniforme. - A última caixa de diálogo aparece, mostrada no canto inferior esquerdo. Você deve agora atribuir um nome de arquivo ao seu array. Uma caixa de diálogo de salvar arquivo é iniciada, e você pode salvar o novo arquivo de array em qualquer lugar. Se a opção copiar metadata for escolhida, a metadata é copiada do arquivo de entrada escolhido para o arquivo de saída. Isso é útil se as imagens são versões editadas e você quer que o array contenha o histórico de edição da última versão (ou qualquer versão). - - TOPIC: MENU DE LOTE Estas são funções que processam vários arquivos de imagem selecionados, alguns ou milhares. Essas funções podem ser canceladas no meio do processo usando a tecla Escape, mas isso deixará alguns arquivos processados e outros não. Um relatório popup mostra os nomes dos arquivos conforme são processados. - - TOPIC: CONVERSÃO EM LOTE +image: batch-convert.jpg - Esta função é usada para renomear, converter, redimensionar e mover vários arquivos de imagem. Arquivos RAW também podem ser convertidos em arquivos de imagem. A função é executada em múltiplas threads paralelas para máxima velocidade. - ^Entradas da Caixa de Diálogo • Selecionar Arquivos - arquivos a converter ({SELECIONAR ARQUIVOS DE IMAGEM}). • Substituir Texto - substituir texto nos nomes de arquivo (veja abaixo). • Novo Nome - novo nome opcional, texto inserido (veja abaixo). • Números de Sequência - número base e adder para nomes de arquivo de saída. • Novo Local - novo local de pasta opcional para arquivos de saída. • Novo Tipo - tipo de arquivo para arquivos de saída, ou "sem alteração". • Profundidade de Cor - especifique 8 ou 16 bits para saída tif ou png. • Largura, Altura Máx. - limites opcionais para arquivos de saída (usado apenas se reduzir ou aumentar estiver marcado) • Redimensionar - fator de redimensionamento opcional para arquivos de saída • Excluir Originais - Exclui os arquivos de entrada após conversão bem-sucedida. • Copiar Metadata - Copia toda a metadata para os arquivos de saída. • Atualizar Álbuns - substitui arquivos de álbum pelos arquivos de saída convertidos - ^Substituir Texto Se um texto for inserido aqui, os nomes de arquivo são verificados em busca desse texto, e se encontrado, o texto de substituição dado é aplicado. O texto de substituição pode ter um comprimento diferente e também pode ser vazio, caso em que o texto é removido do nome do arquivo. - ^Novo Nome e Plugins O novo nome de arquivo pode ter texto inserido: uma data da foto (da metadata EXIF), um número de sequência, ou o nome de arquivo original. Especifique o quê e onde inserir da seguinte forma: • $oldname - O nome de arquivo original é inserido aqui • $sss - Um número de sequência corrente é inserido aqui. Veja abaixo. • $yyyy $mm $dd - A data da foto é inserida nessas posições. - Exemplo: San Francisco $yyyy:$mm:$dd $oldname $sss O arquivo de entrada "Golden Gate Bridge.jpg", com uma data da foto de 12 de maio de 2014, seria convertido para o nome de arquivo de saída "San Francisco 2014-05-12 Golden Gate Bridge 123.jpg". - Para "$sss", especifique o comprimento do campo com o número de caracteres 's', ex.: "$ss" será adequado para números de sequência até 99. Zeros à esquerda são adicionados para números de sequência com menos dígitos. Números de sequência que não cabem no comprimento especificado são feitos tão longos quanto necessário. Tenha em mente que a ordem de classificação de nomes de arquivo nas galerias é estritamente ordem ascii, então a sequência de números 1, 2 ... 9, 10 será classificada como 1, 10, 2 ... 9. Você pode manter a ordem numérica especificando um comprimento de campo de 2 ($ss), resultando na sequência 01, 02 ... 09, 10. - Ou "$oldname" ou "$sss" devem estar presentes para garantir que os nomes de arquivo de saída sejam únicos. Se Novo Local estiver ausente ou inalterado, excluir originais é ignorado. Se um arquivo de saída já existir, o arquivo de entrada não é convertido. - ^Largura e Altura Máx. Se reduzir e/ou aumentar estiver marcado, então os arquivos de saída serão redimensionados dentro desses limites, mantendo a proporção original largura/altura. Se reduzir estiver marcado, arquivos maiores que esses limites são reduzidos para ficarem dentro dos limites. Se aumentar estiver marcado, arquivos menores que esses limites são aumentados para que a largura ou a altura fique no limite correspondente. Isso não pode ser usado com a opção Redimensionar. - ^Redimensionar Se um dos botões estiver marcado, os arquivos de saída são redimensionados pelo fator escolhido. Isso não pode ser usado com a opção Largura e Altura Máx. - ^Excluir Originais Se marcado, os arquivos de entrada são excluídos, mas apenas depois que o arquivo de saída for criado com sucesso. - ^Copiar Metadata Toda a metadata é copiada do arquivo de entrada para o arquivo de saída. Omita esta opção para remover a metadata. - ^Atualizar Álbuns Se marcado, todos os álbuns contendo qualquer um dos arquivos de entrada são atualizados para os arquivos de saída convertidos. - ^Preservando a Sequência de Arquivos Se você especificar um número de sequência inicial ($sss), a sequência de seleção de arquivo de entrada será preservada no local de saída. Assim você pode selecionar arquivos de imagem em uma ordem desejada, ou selecionar de um álbum com imagens ordenadas, e preservar essa sequência na saída. - - TOPIC: CÓPIA/MOVIMENTAÇÃO EM LOTE Copia ou move o arquivo de imagem selecionado para um novo local. Selecione os arquivos de entrada ({SELECIONAR ARQUIVOS DE IMAGEM}) de quaisquer pastas conhecidas pelo Fotocx. Se "Excluir Originais" estiver selecionado, então os arquivos de entrada serão excluídos após serem movidos com sucesso para a nova pasta. Neste caso, quaisquer álbuns que referenciam os arquivos de entrada agora excluídos são atualizados com os novos locais dos arquivos. - - TOPIC: ENDIREITAMENTO EM LOTE Esta função endireita arquivos de imagem girados ou invertidos (espelhados). Depende de dados EXIF para saber se um arquivo está girado/invertido e em que direção. É muito mais rápido que Conversão em Lote. Você pode simplesmente selecionar todos os arquivos candidatos e deixar que a função encontre os que precisam de correção. A velocidade de busca é de cerca de 3000 arquivos de imagem por minuto em um computador potente. Existem duas opções para especificar os arquivos a buscar. O botão [Selecionar Arquivos] leva a uma caixa de diálogo de seleção de arquivo de galeria ({SELECIONAR ARQUIVOS DE IMAGEM}). Se 'Pesquisar todos os arquivos' estiver marcado, todos os arquivos de imagem sob suas pastas principais serão buscados. - - TOPIC: EXCLUSÃO/LIXEIRA EM LOTE Selecione os arquivos ({SELECIONAR ARQUIVOS DE IMAGEM}). Selecione a opção: excluir ou mover para a lixeira. [Continuar]. Os arquivos são listados em um relatório popup conforme são excluídos ou movidos para a lixeira. Depois que todos os arquivos são excluídos/descartados, os álbuns são verificados e os arquivos excluídos são removidos. - - TOPIC: SOBREPOSIÇÃO EM LOTE +image: batch-overlay.png - Uma pequena imagem de sobreposição pode ser adicionada em uma posição selecionada nas imagens de entrada selecionadas. Isso pode ser usado para adicionar uma linha de crédito, direitos autorais, etc. sobre as imagens. - Prepare a imagem de sobreposição da seguinte forma: Use Imagem em Branco para criar uma imagem base para conter o texto. A escala não importa, então faça-a maior do que o necessário. Use Pintar Transparência para pintar toda a imagem base transparente. Use {MARCAÇÃO} > desenhar texto para colocar o texto desejado na imagem base, usando fonte, cor, e outros atributos conforme desejado. Redimensione o texto para preencher a maior parte da imagem base. A imagem base (fundo) é transparente. Remova margens excedentes com {CORTAR} se necessário. Salve a imagem final. Um local conveniente é /saved_areas, mas qualquer pasta pode ser usada. Esta imagem agora pode ser usada como uma imagem de sobreposição para Sobreposição em Lote. - Use o botão ^Selecionar arquivos de imagem hospedeiros^ para selecionar os arquivos de imagem hospedeiros que receberão a imagem de sobreposição. Use o botão ^Selecionar arquivo de sobreposição^ para selecionar o arquivo de imagem de sobreposição. - As duas entradas ^Posição da sobreposição^ determinam onde a imagem de sobreposição é posicionada na imagem hospedeira, de 1-99% da distância de cima para baixo, e 1-99% da distância da esquerda para a direita. 0/0 significa o canto superior esquerdo, 99/99 significa o canto inferior direito. A imagem de sobreposição será posicionada para não se estender além das bordas da imagem hospedeira. - Especifique ^Largura da sobreposição^ como uma porcentagem da largura da imagem hospedeira. A altura será definida para conservar a proporção largura/altura. Se ^Tornar largura constante para o tamanho da janela^ estiver marcado, o tamanho visual da imagem de sobreposição será tornado constante para o tamanho de janela especificado abaixo. Sem isso, uma imagem "alta" que é exibida com grandes margens esquerda e direita teria uma imagem de sobreposição visualmente menor. O tamanho de janela inicial é a janela atual. Você pode inserir qualquer tamanho. Pressione ^atualizar^ para definir a janela atual se isso tiver mudado. - Se ^Substituir arquivos hospedeiros^ estiver selecionado, os arquivos hospedeiros de entrada são substituídos pelos arquivos hospedeiros de saída com sobreposição. Se ^Criar novas versões^ estiver selecionado, novas versões dos arquivos hospedeiros de entrada são criadas. - - TOPIC: KEYWORDS EM LOTE +image: batch-keywords.jpg - Adiciona, remove, ou altera as keywords de um grande número de arquivos de imagem de uma vez. - Use o botão [select files] para selecionar os arquivos de imagem ({SELECIONAR ARQUIVOS DE IMAGEM}). - A caixa de diálogo mostra duas listas de keywords: aquelas a adicionar aos arquivos selecionados, e aquelas a remover. As keywords disponíveis são mostradas na janela Keywords Definidas abaixo. Uma dessas pode ser adicionada à lista de keywords atualmente selecionada (adicionar ou remover) clicando nela. Uma keyword pode ser excluída de qualquer uma das listas de keywords clicando nela. Para substituir keywords, especifique as novas keywords na lista de adicionar keywords e as keywords antigas na lista de remover keywords. - Se a lista de keywords definidas for longa, pode ser mais fácil digitar a keyword desejada em Digite Nova Keyword. As keywords existentes que correspondem ao que você digitou até agora aparecerão em Keywords Correspondentes, e você pode apontar e clicar em uma delas para adicionar a keyword à imagem. Se a keyword inserida for nova (nenhuma keyword correspondente é mostrada), pressione [Adicionar] quando a keyword estiver completa. Ela será adicionada à lista de keywords selecionada e à lista de keywords definidas sob a categoria "nocatg". - Se você estiver usando categorias de keywords, você pode selecionar uma categoria, e apenas essas keywords serão mostradas na lista de keywords definidas. Se sua lista de keywords for enorme, isso pode reduzir a lista a um tamanho gerenciável para apontar e clicar. - Para obter uma lista de imagens com keywords específicas que você deseja remover ou substituir, use {BUSCAR IMAGENS} para encontrar as imagens, então inicie esta função e use [select files] para adicionar todos os arquivos de imagem que você acabou de encontrar, ou selecione qualquer subconjunto. - - TOPIC: RENOMEAÇÃO EM LOTE DE KEYWORDS +image: batch-rename-keywords.png - Renomeia qualquer número de keywords e aplica essas alterações a toda a sua coleção de imagens. Clique em uma keyword para renomear na lista de keywords definidas, digite um novo nome na caixa Renomear para, então clique no botão de seta para adicionar esse par de nomes à lista do lado direito. Repita para cada keyword a renomear. Clique no par de nomes na lista para removê-los. Pressione [Continuar] quando terminar. Se você quiser excluir uma keyword sem renomeá-la, use 'delete' como o novo nome. - Uma janela popup mostra o número de arquivos de imagem contendo os nomes de keyword afetados. Pressione [Sim] para continuar. A taxa de atualização é de cerca de 500/minuto em um computador potente. Na próxima vez que o Fotocx for iniciado, a função de arquivo de índice atualizará todas as thumbnails para as mesmas imagens, porque a data de modificação do arquivo mudou. - - TOPIC: REMOÇÃO EM LOTE DE KEYWORDS +image: batch-purge-keywords.jpg - Remove keywords indesejadas de todos os arquivos de imagem. Isso é especialmente útil para se livrar de keywords indesejadas que foram adicionadas a partir de arquivos de imagem baixados. Clique nas keywords indesejadas no lado esquerdo da caixa de diálogo para adicioná-las à lista de remoção no lado direito da caixa de diálogo. Pressione [proceed] quando terminar. - - TOPIC: DATA DA FOTO EM LOTE +image: batch-photo-date1.png +image: batch-photo-date2.png - Corrija rapidamente um lote de fotos que não têm data/hora da foto ou têm uma incorreta. Use o botão [select files] para abrir uma janela de galeria onde você pode selecionar os arquivos de imagem a processar ({SELECIONAR ARQUIVOS DE IMAGEM}). - Existem duas maneiras de alterar as datas/horas da foto: • Definir uma nova data/hora (imagem à direita acima): Digite apenas um novo ano (aaaa) - apenas o ano é substituído nos arquivos. Digite apenas uma data (aaaa:mm:dd) - a data é substituída, mas não a hora. Digite uma data/hora completa (aaaa:mm:dd hh:mm:ss) - ambas são substituídas. • Deslocar data/hora existente (imagem à esquerda): Digite valores + ou - em qualquer um dos 6 campos: anos, meses, dias, horas, minutos, segundos. Datas/horas serão deslocadas pelos valores inseridos. - Valores de data/hora deslocados se propagam para o próximo valor superior quando necessário: Hora 08:30 deslocada em -50 minutos resulta em 07:40 Data 2016-10-20 deslocada em +6 meses e -30 dias resulta em 2017-03-21 (março tem 31 dias). - Se a caixa de seleção 'teste' estiver selecionada, um relatório das datas/horas antigas e novas dos arquivos selecionados é gerado para inspeção. Nenhuma alteração é feita nos arquivos. Se você estiver satisfeito de que os resultados estão corretos, remova a marcação e execute novamente para atualizar os arquivos. - - TOPIC: ALTERAÇÃO EM LOTE DE META +image: batch-change-meta.png - Revisa a metadata de vários arquivos de imagem. Você pode adicionar nova metadata, revisar metadata existente, e excluir metadata. Use o botão [select files] para abrir uma janela de galeria a partir da qual você seleciona os arquivos a processar {SELECIONAR ARQUIVOS DE IMAGEM}. Digite os nomes e valores das tags de metadata a atribuir, ou deixe o valor em branco para excluir a tag. Pressione [aplicar]. Você receberá uma mensagem de confirmação e pode continuar ou cancelar neste momento. Uma lista de nomes de tags comumente usados é fornecida à esquerda. Clique em uma delas para inseri-la no primeiro campo de nome de tag vazio na caixa de diálogo. Esta lista vem do arquivo /metadata_picklist, que você pode editar para adicionar outras tags à lista. O botão [Lista Completa] fornece informações sobre como obter uma lista de todos os nomes de tags disponíveis. - - TOPIC: RELATÓRIO DE META EM LOTE +image: add-meta-tags.png +image: batch-report-meta.png - Relata qualquer metadata para qualquer número de imagens. A saída é um arquivo de texto que é exibido no editor de texto padrão do seu sistema. Você pode usar os recursos de busca do editor de texto para encontrar imagens que correspondam à metadata desejada, ou você pode usar o arquivo de texto como entrada para outros programas. Use o botão [select files] para abrir uma janela de galeria para selecionar os arquivos a processar ({SELECIONAR ARQUIVOS DE IMAGEM}). O botão [editar] abre uma nova caixa de diálogo (à direita) onde você pode selecionar as tags de metadata a serem relatadas. Clique em uma tag na coluna esquerda para adicioná-la à coluna direita e ao relatório. Clique em uma tag na coluna direita para removê-la. Clique na última tag da coluna esquerda, "Outra tag ...", para digitar qualquer nome de tag que não apareça na lista, que contém apenas as tags mais prováveis de serem necessárias. - - TOPIC: GEOTAGS EM LOTE +image: batch-geotags.png - Selecione várias imagens e adicione os mesmos dados de localização a todas elas. Use o botão [select files] para selecionar os arquivos de imagem em uma janela de galeria ({SELECIONAR ARQUIVOS DE IMAGEM}). Então obtenha os dados de localização conforme descrito em {EDITAR META PRINCIPAL}, usando o botão [Buscar] ou clicando em um marcador do mapa. Use esta função também para corrigir inconsistências na grafia de localização ou dados de latitude/longitude. Se localização e/ou país forem deixados em branco, eles não são atualizados. Para apagar localização ou país, digite o nome "null". Se latitude e longitude forem deixadas em branco, elas não são atualizadas. Para apagar latitude e longitude, digite "0" para ambos os valores. Você pode atualizar apenas localização/país, apenas latitude/longitude, ou ambos. Na prática, você pode descobrir que o GPS da câmera insere latitude e longitude sem localização e país, ou usa um idioma indesejado, ou todas as letras maiúsculas, ou algum outro valor que precise de correção. - - TOPIC: EXPORTAR ARQUIVOS Copia arquivos de imagem selecionados para outra pasta. O uso pretendido é para copiar arquivos para compartilhar com outras pessoas, ex.: fazer upload de arquivos para um site. Os arquivos de saída são JPEG. Você pode opcionalmente reduzir o tamanho das imagens. Selecione arquivos de imagem clicando nas thumbnails da galeria ({SELECIONAR ARQUIVOS DE IMAGEM}). Selecione uma pasta onde os arquivos de imagem serão copiados. Se 'exportar metadata' estiver selecionado, um conjunto limitado de metadata também é copiado. São eles: data da foto, keywords, direitos autorais, título, descrição. - - TOPIC: MENU DE FERRAMENTAS - - TOPIC: INDEXAR ARQUIVOS +image: index-files1.png - O Fotocx precisa conhecer todos os seus nomes de pasta e arquivo de imagem e a metadata incorporada (datas, tags, geotags, títulos, descrições, avaliações). Esses dados são indexados para busca rápida. O Fotocx também cria imagens em thumbnail para que as janelas de galeria (páginas de thumbnails) sejam exibidas rapidamente. O Fotocx não modifica nem copia seus arquivos de imagem. O espaço necessário é tipicamente 2% do espaço de seus arquivos de imagem. - A função Indexar Arquivos é executada sempre que o Fotocx é iniciado. Esta função criará thumbnails ausentes, substituirá as desatualizadas, e atualizará o índice de metadata usando os dados atuais dos seus arquivos de imagem. Isso pode precisar de tempo significativo se você tiver muitos milhares de arquivos novos. - Arquivos de imagem modificados ou movidos dentro do Fotocx são tratados automaticamente. A função Indexar é usada apenas para novos arquivos de imagem criados fora do Fotocx (ex.: um novo lote de fotos foi adicionado), e para arquivos modificados ou movidos de fora do Fotocx. - Digite suas pastas principais de imagem (ex.: /home//Pictures). Use o botão [procurar] para localizar e adicionar pastas. Essas pastas e quaisquer subpastas contidas serão processadas. Não importa se outros arquivos estão misturados com as imagens. Exclua uma entrada clicando no 'X' correspondente. - Digite a pasta de thumbnails onde os arquivos de thumbnail serão armazenados. Use o padrão fornecido ou defina seu próprio local. - Se você usou nomes de pasta ou arquivo para classificar suas imagens, você pode fazer uso imediato deles na função {BUSCAR IMAGENS}. Se você salvou datas, keywords, geotags, títulos, ou avaliações na metadata de suas imagens, elas também serão pesquisáveis. Depois que as imagens forem indexadas, a busca por qualquer uma delas é quase instantânea. - ^Tags de Metadata A seguinte metadata é incluída no índice de imagens por padrão: • nomes de pasta e arquivo • data/hora da foto • data/hora de modificação do arquivo • título e descrição (metadata exif) • avaliação (0-5 estrelas) • keywords (rótulos do usuário) • geotags (nomes de país e localização e latitude/longitude) • câmera: marca, modelo, lente • exposição: tempo, número f, distância focal, ISO - ^Tags de Metadata Extras +image: index-files2.png - Você pode adicionar até 20 outras tags de metadata ao índice de arquivo de imagem. A metadata nesta lista pode ser buscada tão rápido quanto as tags padrão. Você pode não precisar disso, mas se às vezes você precisar buscar tags de metadata não padrão, você pode adicioná-las aqui e a velocidade de busca será quase instantânea. Pressione o botão [select] para "metadata extra" para obter a caixa de diálogo acima. Clique nas tags na lista esquerda para adicioná-las à lista direita - as tags a serem adicionadas ao índice. Clique em uma tag na lista direita para removê-la. Pressione [done] para confirmar as alterações. Toda a sua coleção de imagens será indexada novamente. Isso será mais rápido que a indexação inicial porque as thumbnails não são recriadas. - ^Acessando Arquivos e Pastas Não Indexados Um arquivo ou pasta de imagem não indexado é aquele que não está incluído em suas pastas principais de imagem declaradas (subpastas de suas pastas de imagem declaradas estão sempre incluídas). Você pode navegar até tal pasta e ver as thumbnails normalmente, e você pode ver e editar tais arquivos normalmente. Existem limitações que você deve entender: • Esses arquivos ficarão ausentes de quaisquer resultados de busca e visualizações de mapa. • As thumbnails são criadas no momento da visualização - as galerias serão lentas. Se você acessar um dispositivo de armazenamento portátil (lento) (ex.: cartão SD de câmera), você notará o desempenho relutante. As thumbnails serão criadas conforme necessário, e permanecerão após a remoção do dispositivo. Sugestão: copie os arquivos para uma pasta declarada do Fotocx, então faça qualquer processamento que você precise a partir deste local. O desempenho será muito melhor. - ^Armazenamento Removível (unidade USB) Se suas pastas principais de imagem incluírem pastas em uma unidade removível, e você executar o Fotocx sem a unidade montada, os dados de índice e thumbnails ainda são preservados, mesmo que os arquivos removíveis tenham desaparecido. Quando a unidade removível é montada novamente, e o Fotocx é iniciado, o último status é restaurado. Se algum arquivo foi adicionado ou modificado nesse meio tempo, os dados de índice e thumbnails são atualizados. - - TOPIC: MOVER PASTA HOME DO FOTOCX A pasta home do Fotocx contém todas as configurações e dados do usuário, incluindo alguns arquivos do pacote Fotocx que podem ser personalizados pelo usuário. Local padrão: /home//.fotocx. Se várias versões ou distribuições do Linux estiverem instaladas, pode ser desejável ter uma pasta home do Fotocx compartilhada em vez de uma para cada distribuição. O mesmo poderia valer se vários usuários precisarem acessar a mesma instância do Fotocx. - Use esta função para mover a pasta home do Fotocx para outro lugar. A pasta selecionada deve incluir "fotocx" no nome do caminho, ou "/fotocx" será anexado se não incluir. - Veja o parâmetro -home de {PARÂMETROS DE COMANDO} se você quiser várias coleções de imagens do Fotocx, gerenciadas separadamente. - - TOPIC: CONFIGURAÇÕES +image: settings.jpg - Várias preferências e configurações do usuário são coletadas e salvas no arquivo /parameters. A maioria das alterações é feita imediatamente. Algumas farão com que o Fotocx reinicie. - • Selecione o código de idioma de 2 caracteres desejado. O Fotocx reiniciará no idioma selecionado. • Visualização Inicial - exibição inicial quando o Fotocx é iniciado. Arquivos Recentes: os arquivos de imagem vistos mais recentemente Arquivos Mais Novos: arquivos adicionados/modificados mais recentemente Galeria Específica: a galeria de pasta especificada Galeria de Álbum: a galeria de álbum especificada Galeria Anterior: galeria usada por último na sessão anterior Arquivo Anterior: arquivo visto por último na sessão anterior Arquivo Específico: o arquivo de imagem especificado Botão Procurar: seleciona uma pasta, álbum, ou arquivo de imagem • Plano de Fundo - cores de fundo para as janelas de Visualização de Arquivo e Galeria • Estilo do Menu - estilo de exibição do menu: ícones, texto, ou ambos • Cores do Menu - cor do texto do menu e cor de fundo • Fonte do Diálogo - fonte para menus e caixas de diálogo • Mostrar Ocultos - se selecionado, mostra arquivos e pastas ocultos • Velocidade do Zoom - Escolha de 1-8 cliques ou teclas [+] por aumento de imagem em 2x • arquivos JPEG - nível de qualidade, padrão 90, use 70+ para boa qualidade • Nó da Curva - separação mínima de nó para curvas de edição, % da escala. O padrão é 5% da escala. Use um valor mais alto para touchpads. • Posição da Imagem - a imagem fica à esquerda/centro/direita dentro de uma janela mais larga • Confirmar Saída - opção de caixa de diálogo popup: você realmente quer sair? • Nível de Índice - veja abaixo • Carregador RAW - veja abaixo • Opções RAW - veja abaixo • Arquivos RAW - lista dos tipos de arquivo RAW usados • Arquivos de Vídeo - lista dos tipos de arquivo de vídeo usados • App de Vídeo - veja abaixo - ^Qualidade e Compressão de Arquivo Nível de qualidade do arquivo JPEG: use 70 ou superior para boa qualidade de imagem (padrão 90). O método de compressão de arquivo TIFF é DEFLATE (melhor para imagens coloridas). O nível de compressão de arquivo PNG é '1'. Valores mais altos parecem não fazer nada além de aumentar o tempo de salvamento do arquivo (libpng). - ^Posição da Imagem Se a janela for mais larga que a imagem (ou seja, proporção largura/altura da janela > imagem), a imagem pode ser deslocada para o lado esquerdo, centralizada, ou para o lado direito. Se esquerda ou direita, a margem não utilizada é maximizada, o que pode ser mais conveniente para posicionar caixas de diálogo. - ^Nível de Índice de Imagem Estes dois parâmetros regem uma compensação entre o tempo de inicialização e a completude do índice de imagem. • $ fotocx: Aplica-se quando o fotocx é iniciado usando um comando shell, menu do sistema, ou ícone/lançador do sistema. O valor recomendado de '2' significa indexação completa: carrega o arquivo de índice antigo, busca por arquivos novos (ainda não indexados) e atualiza o arquivo de índice do fotocx. • $ fotocx : Aplica-se quando o fotocx é iniciado clicando em um nome de arquivo em uma lista do gerenciador de arquivos. O valor recomendado de '1' significa carregar o arquivo de índice antigo, mas não buscar novos arquivos para atualizar o índice. A inicialização é moderadamente rápida. As funções de busca de imagem e mapa funcionam normalmente, mas quaisquer novos arquivos de imagem (ainda não indexados) não são incluídos. • Alternativa: '0' significa nenhuma indexação. A inicialização é muito rápida. O uso posterior de uma função de busca de imagem ou mapa iniciará a função de índice de arquivo apenas para arquivos antigos (sem busca de arquivos novos/modificados). Use esta opção se sua coleção de imagens for gigantesca e o tempo de inicialização exceder alguns segundos. Você pode iniciar a função de índice mais tarde, se necessário. - ^Carregador RAW O carregador RAW é o comando usado para ler um arquivo RAW e convertê-lo para TIFF com profundidade de cor de 16 bits. É usado quando um arquivo RAW é visualizado. Você pode usar as funções de edição do Fotocx para editar e otimizar o arquivo. O carregador RAW padrão é o dcraw usando o espaço de cores sRGB. Algumas outras opções usando dcraw ou rawtherapee são fornecidas na lista de seleção. Esses comandos são mantidos no arquivo 'raw_commands_*' na pasta home do Fotocx. Edite este arquivo para alterar ou adicionar novas opções (veja abaixo). Você pode querer preparar vários comandos para várias câmeras ou várias opções de processamento. Se você preferir usar um editor RAW interativamente, crie um comando de plugin para isso - veja {PLUGINS}. - ^Opções RAW • editar comandos: pressione o botão para editar a lista de comandos do carregador RAW. Um editor de texto será iniciado em uma nova janela, com a lista atual de comandos. • combinar com a cor da imagem incorporada: usa a imagem incorporada do arquivo RAW como guia para mapear as cores da imagem RAW para a imagem TIFF convertida. Esta é a interpretação do fabricante da câmera dos dados RAW - um bom ponto de partida se o arquivo RAW precisar de mais edição. A imagem incorporada geralmente é a mesma que o arquivo JPEG da câmera. - ^App de Vídeo Digite um comando shell para iniciar um app de reprodução de vídeo. Use '%s' para marcar onde o nome do arquivo de vídeo é inserido na linha de comando. Aqui estão alguns exemplos: ffplay -loglevel 8 -autoexit %s mpv -really-quiet %s totem %s vlc -q %s firefox %s - - TOPIC: ATALHOS DE TECLADO +image: KB-shortcuts.jpg +image: KB-shortcuts2.jpg - Ver ou alterar atalhos de teclado personalizados. Os atalhos atualmente atribuídos são mostrados na primeira janela. Se você pressionar o botão [Editar], a segunda caixa de diálogo é mostrada, onde você pode adicionar e alterar atalhos de teclado. Digite um novo atalho usando o teclado. Você pode usar as teclas A-Z, 0-9, F2-F9, e a maioria dos símbolos (% $ & * < etc.). Você pode combinar uma tecla com uma das Ctrl/Alt/Shift: Pressione e segure UMA das Ctrl/Alt/Shift, então pressione a tecla, então solte ambas. Selecione uma das atribuições de menu disponíveis na lista à direita, então pressione [Adicionar] e [OK]. Remova um atalho selecionando-o e pressionando [Excluir]. - - TOPIC: HISTOGRAMA RGB +image: RGB-hist.png - Uma pequena janela mostra um gráfico de histograma de brilho da imagem atual na Visualização de Arquivo, ou da área atualmente selecionada da imagem. Este gráfico se atualiza de forma síncrona conforme as funções de edição alteram a imagem. Use os botões [Tudo] [Vermelho] [Verde] [Azul] para selecionar cores a mostrar. - - TOPIC: AMPLIAR IMAGEM +image: magnify-image.jpg - Amplia a imagem em uma área ao redor do ponteiro do mouse. Arraste com o botão esquerdo o mouse ao redor da imagem para ampliar diferentes áreas, de forma análoga a visualizar uma imagem impressa com uma lupa. Use a caixa de diálogo para ajustar o raio da área e a quantidade de ampliação. - - TOPIC: MEDIR IMAGEM Clique em quaisquer duas posições dentro de uma imagem para medir a distância em pixels entre os pontos. As posições clicadas são rotuladas A e B na imagem. Esses rótulos sempre mostram os últimos dois pontos clicados. A caixa de diálogo é atualizada com as distâncias que separam esses dois pontos: Distância-X (distância horizontal) Distância-Y (distância vertical) Distância-H (distância total) - - TOPIC: MOSTRAR RGB +image: show-RGB.png - Quando um ponto na imagem é clicado, os valores RGB são mostrados em uma janela de diálogo. Os últimos 9 pontos clicados são exibidos. Os valores têm o formato xxx.dd, onde xxx são os 8 bits superiores do valor de cor e .dd são os 8 bits inferiores. O intervalo é de 0.00 a 255.99. Os 8 bits inferiores são zero, a menos que a imagem esteja sendo editada ou tenha mais de 8 bits de profundidade de cor. As saídas são atualizadas em tempo real se a imagem estiver sendo editada. Se "rótulos" estiver marcado, os pontos são rotulados na imagem com letras correspondentes às letras na janela de diálogo. Se "delta" estiver marcado e a imagem estiver sendo editada, então as alterações RGB são mostradas em vez dos valores absolutos. - Se você abrir outra imagem (ex.: para comparar com a imagem anterior), as posições são mantidas e atualizadas se estiverem dentro dos limites da nova imagem. Isso facilita a comparação de imagens no nível dos valores RGB de pixel. - - TOPIC: CONFIGURAÇÕES DE GRADE +image: grid-settings.jpg - Existem duas funções de linhas de grade: Configurações de Grade define todos os parâmetros da grade. Alternar Grade liga ou desliga as linhas de grade. Linhas de grade são linhas horizontais e verticais em intervalos regulares pela imagem. Essas linhas podem ser guias de alinhamento úteis quando uma imagem é descurvada ou distorcida para endireitar paredes ou outros objetos na imagem. Use as entradas contagem-x e contagem-y para definir o número de linhas verticais e horizontais respectivamente. Os controles deslocamento-x e deslocamento-y podem ser usados para deslocar as linhas de grade para cruzar uma posição desejada na imagem. Um atalho de teclado (padrão shift+G) pode ser atribuído a Alternar Grade, para que as linhas de grade possam ser ligadas ou desligadas com uma única tecla. - - TOPIC: COR DA LINHA Algumas funções desenham linhas sobre a imagem (Cortar, Selecionar Área, outras). Você pode alterar a cor dessas linhas para maximizar o contraste com a imagem de fundo. A pequena caixa de diálogo pode ser deixada aberta durante a edição, para alternar convenientemente entre as cores disponíveis (preto, branco, vermelho, verde). - - TOPIC: PIXELS ESCUROS/CLAROS Realça os pixels mais escuros e mais claros de uma imagem. Ajuste os dois controles giratórios para definir os limiares de brilho, que são inicialmente 0 para pixels escuros e 255 para pixels claros. Pixels com brilho menor que o limiar escuro ou maior que o limiar claro são "piscados" para se destacarem. Use esta função para detectar corte (clipping) após editar brilho ou cor. - - TOPIC: COR DO MONITOR +image: moncolor-small.png - Oito faixas de cor são escritas na tela com brilho de zero (preto) a 100%. Você pode usar isso para ajustar o brilho e o contraste do seu monitor. Não deve haver regiões inalteradas em nenhuma das extremidades das faixas. - - TOPIC: ENCONTRAR DUPLICATAS +image: find-dups.png - Encontra arquivos de imagem duplicados em qualquer lugar dentro do seu banco de dados de imagens. Um arquivo duplicado pode ser um arquivo que duplica exata ou "quase" exatamente outro arquivo. Para maior velocidade, as imagens em thumbnail são comparadas na memória. É possível que thumbnails correspondentes sejam encontradas para imagens principais com pequenas diferenças não refletidas nas thumbnails. É provável que uma cópia de imagem reduzida em tamanho seja classificada como duplicata. O tamanho da thumbnail pode ser definido de 32 a 512 pixels. Um tamanho maior reduz a probabilidade de falsos positivos. O tamanho da thumbnail afeta muito a quantidade de memória principal necessária - ex.: para 100 mil imagens, o tamanho 64 precisa de cerca de 880 MB, enquanto o tamanho 256 precisa de cerca de 14 GB. Pressione o botão [calculate] para calcular o maior tamanho de thumbnail que cabe dentro da memória livre disponível. - Dois parâmetros são usados para definir a sensibilidade de detecção de imagens idênticas ou quase idênticas: diferença de pixels é a diferença de valor RGB abaixo da qual os pixels são considerados iguais. Contagem de pixels é o número de pixels diferentes abaixo do qual duas imagens são classificadas como duplicatas. Exemplo: se diferença de pixels = 2 e contagem de pixels = 10, então as imagens são classificadas como duplicatas se menos de 10 pixels diferirem em 2 ou menos. - A saída é uma galeria mostrando cada conjunto de imagens duplicadas. A galeria de saída é salva como o álbum "Duplicate Images". Você pode usar Exclusão/Lixeira em Lote junto com este álbum para escolher quais duplicatas excluir. - - TOPIC: ENCONTRAR ARQUIVOS COM DEFEITO Todos os arquivos de imagem dentro de suas pastas principais declaradas são lidos. Para cada arquivo que não pode ser lido, você tem três opções: • excluir o arquivo • corrigir um tipo de arquivo incorreto (veja abaixo) • mover o arquivo para fora de suas pastas principais de imagem Frequentemente vejo arquivos .png com extensão .jpg. Navegadores web e alguns outros aplicativos lidam com isso silenciosamente. Aqui, o tipo de arquivo correto é relatado e você pode alterar a extensão para a correta. - - TOPIC: MOSTRAR RECURSOS Relata os recursos do computador usados pelo Fotocx: • Tempo de CPU: uso desde a inicialização do Fotocx ou desde a última amostra • Memória real: a memória real atualmente em uso (excluindo swap) • Cache de mapas: MB de armazenamento em disco usado para ladrilhos de mapa em cache • Limpar cache: exclui todos os ladrilhos de mapa em cache • botão [Sample]: coleta uma nova amostra e relata os dados - O botão [Sample] redefine o tempo de CPU. A próxima amostra mostrará apenas o novo tempo de CPU acumulado. O tempo de CPU é a soma de todas as threads de processo. - - TOPIC: TRADUÇÕES Traduções para vários idiomas estão incluídas no pacote do Fotocx. Essas traduções por IA não são perfeitas. Erros de tradução podem ser corrigidos editando os arquivos de tradução. - ^Alterando o idioma da interface O menu {CONFIGURAÇÕES} pode ser usado para alterar o idioma. O idioma também pode ser definido quando o Fotocx é iniciado: $ fotocx -lang xx # idioma xx (de fr zh etc.) $ fotocx -lang en # inglês - ^Modificar uma tradução da interface (GUI) Edite o arquivo /translations/gui_xx Os pares de linhas de texto têm números de 4 dígitos no início, que devem corresponder. A primeira linha é em inglês, a 2ª linha é o idioma xx. Modifique apenas a linha xx, nunca a linha em inglês. Os caracteres especiais para inserir parâmetros no texto devem permanecer na mesma sequência. Estes são '%d' (parâmetro inteiro), '%f' (decimal), '%s' (texto). - ^Modificar uma tradução do guia do usuário Edite o arquivo /translations/ug_xx Edite ug_xx para corrigir a tradução. Não adicione ou remova nenhuma linha de texto nem altere a sequência. As linhas de texto devem corresponder 1:1 com o guia do usuário em inglês, ug_en. - Envie os arquivos revisados para inclusão na próxima versão do Fotocx: mkornelix@gmail.com - - TOPIC: MENU DE AJUDA • Guia do Usuário - Mostra o índice • Tutorial em Vídeo - Mostra um tutorial em vídeo do Fotocx no YouTube • Programas Externos - Lista programas externos e suas funções • Mostrar Arquivo de Registro - Exibe informações registradas e mensagens de erro • Parâmetros de Comando - Mostra os parâmetros de linha de comando disponíveis • Registro de Alterações - Mostra adições e correções de bugs em versões recentes • Direitos Autorais - Mostra direitos autorais e licenças relevantes para o Fotocx • Privacidade - Mostra a política de privacidade (regras) do Fotocx • Sobre - Mostra o número da versão, local do executável, contato • Página Inicial - Mostra a página inicial do Fotocx em kornelix.net • Desinstalar - Como desinstalar o Fotocx - - TOPIC: OUTROS TÓPICOS Os seguintes tópicos não estão conectados aos menus do Fotocx. - - TOPIC: VIDEO FILES Arquivos de vídeo (.mpeg, .mp4, etc.) podem estar misturados com seus arquivos de imagem. Eles aparecerão como arquivos de imagem tanto na Visualização de Arquivo quanto na Visualização da Galeria. A tecla 'P' iniciará, pausará, e retomará o vídeo, ou reproduzirá novamente um vídeo que terminou. A tecla 'Q' encerrará o vídeo. Use o menu {CONFIGURAÇÕES} para selecionar o aplicativo para reproduzir arquivos de vídeo. - - TOPIC: SLIDES E NEGATIVOS +image: color-negative.jpg - Você pode usar uma câmera com capacidade de close-up para capturar slides ou negativos de filme. Use uma caixa de luz para iluminação, ou use o céu (exemplo acima). Para processar um negativo colorido, primeiro faça um positivo - veja {MODO DE COR}. Se a imagem estiver enevoada, selecione apenas a área da imagem, excluindo as bordas do filme, e então use {RETINEX GLOBAL} para eliminar a névoa. Defina os pontos branco e preto clicando na imagem, se necessário, para reduzir ainda mais a névoa. - - TOPIC: LIMITAÇÕES DO FOTOCX • Há um limite rígido de um milhão de arquivos. • versões de imagem - até 99 versões para desfazer/refazer e nomenclatura de versão. • keywords de imagem - 10 mil keywords no total. 1000 caracteres para uma única imagem. • As galerias são limitadas a 40 mil arquivos de imagem. • as dimensões máximas de imagem são 40 mil x 20 mil pixels. - - TOPIC: FOTOCX PARA WINDOWS 11 O Fotocx pode ser usado no Windows 11 instalando o Windows Subsystem for Linux 2, ou WSL2. Há ampla documentação na internet sobre como fazer isso. - Se seus arquivos de imagem estiverem no sistema de arquivos do Windows (NTFS), o Fotocx será muito lento. Portanto, mova seus arquivos de imagem para o sistema de arquivos do Linux. Você ainda pode acessá-los usando o Windows File Explorer e outros aplicativos do Windows, então nada é perdido. A Microsoft também recomenda o sistema de arquivos do Linux para melhor desempenho. Use o ícone 'Linux' no File Explorer para acessar sua pasta home no sistema de arquivos do Linux. Adicione uma pasta Pictures se necessário, e mova seus arquivos de imagem para lá. - Se um pacote do Fotocx estiver disponível, instale-o. Caso contrário, faça o seguinte: Baixe o arquivo do pacote binário do Fotocx em ^https://kornelix.net. No terminal Linux: $ cd /mnt/c/Users//Downloads # vá para a pasta de downloads do Windows $ tar -xzf fotocx-xxx-bin.tar.gz # descompacte o pacote na pasta fotocx $ cd fotocx # vá para a pasta fotocx $ chmod u+x install.sh # torne o script de instalação executável $ ./install.sh # execute o script, instale o fotocx $ fotocx # inicie o Fotocx Você pode precisar reiniciar a janela do Linux para que a última etapa funcione. - Leia as partes introdutórias deste guia do usuário. O Fotocx tem funcionalidade profunda. Não espere dominar o Fotocx em alguns minutos. - - TOPIC: PRIVACIDADE O Fotocx não retém nenhum dado do usuário além dos arquivos de imagem e sua metadata. A metadata deve ser removida dos arquivos de imagem antes de fazer upload para a internet, e o Fotocx fornece um método simples para fazer isso. - - TOPIC: PROBLEM, QUESTION, SUGGESTION Envie um e-mail para mkornelix@gmail.com. Se houver um despejo de falha (arquivo zappcrash), envie isso também. - fotocx/data/translations/gui_zh0000664000175000017500000034272315247006657015713 0ustar micomico0000 + Zoom-in \n 0000 + Zoom 放大 \n 0001 - Zoom-out \n 0001 - Zoom 缩小 \n 0002 = Zoom-in \n 0002 = Zoom 放大 \n 0003 Arrow keys Previous/Next file \n 0003 方向键 上一个/下一个文件 \n 0004 Delete Delete/Trash file \n 0004 Delete 删除/回收文件 \n 0005 Escape Quit dialog / Quit Fotocx \n 0005 Esc 关闭对话框 / 退出 Fotocx \n 0006 F1 User Guide, Context Help \n 0006 F1 用户指南,上下文帮助 \n 0007 F10/F11 Full Screen / no menus \n 0007 F10/F11 全屏 / 无菜单 \n 0008 Home/End Gallery start/end \n 0008 Home/End 图库开始/结束 \n 0009 Indexing time depends on the number, type, and size of \n your image files and the speed of your computer. This can \n range from a few hundred to over 10 thousand per minute. \n You can change index options later, using these menus: \n Tools > Index, Tools > Settings. \n 0009 索引所需时间取决于图像文件的数量、类型和大小 \n 以及计算机的速度。这个速度 \n 大约从每分钟几百张到超过一万张不等。 \n 您可以稍后使用以下菜单更改索引选项: \n 工具 > 索引,工具 > 设置。 \n 0010 Page keys Gallery page up/down \n 0010 翻页键 图库上一页/下一页 \n 0011 Z 1x <--> fit to window \n 0011 Z 1x <--> 适应窗口 \n 0012 $s plugin needs base and adder 0012 $s 插件需要 base 和 adder 0013 % from left: 0013 距左边: 0014 % from top: 0014 距顶部: 0015 %d albums selected 0015 已选择 %d 个相册 0016 %d image files selected 0016 已选择 %d 个图像文件 0017 %d images 0017 %d 张图像 0018 %d keywords to purge \nin %d image files. \nProceed? 0018 要清除 %d 个keywords \n共 %d 个图像文件。 \n是否继续? 0019 %d keywords to rename \nin %d image files. \nProceed? 0019 要重命名 %d 个keywords \n共 %d 个图像文件。 \n是否继续? 0020 %d max images exceeded 0020 超出最大图像数 %d 0021 %d red-eye limit reached 0021 已达到红眼限制 %d 0022 %s %s %d folders %d files 0022 %s %s %d 个文件夹 %d 个文件 0023 %s *** date/time conversion failed \n 0023 %s *** 日期/时间转换失败 \n 0024 %s ALBUM %s %d files 0024 %s 相册 %s %d 个文件 0025 %s NEWEST FILES 0025 %s 最新文件 0026 %s RECENT FILES 0026 %s 最近文件 0027 %s SEARCH RESULTS %d files 0027 %s 搜索结果 %d 个文件 0028 %s UNKNOWN 0028 %s 未知 0029 %s added to script 0029 %s 已添加到脚本 0030 %s is already indexed 0030 %s 已被索引 0031 %s renamed: %s 0031 %s 已重命名:%s 0032 %s: metadata update failed 0032 %s:metadata 更新失败 0033 %s: no write permission 0033 %s:无写入权限 0034 %s: reserved, cannot be used 0034 %s:已保留,无法使用 0035 %s: too many keywords 0035 %s:keywords 过多 0036 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s 0036 %s\n拍摄日期:%s 文件日期:%s \n评分:%s 大小:%s %.2fmb \n位置:%s %s %s \nKeywords:%s \n标题:%s \n描述:%s 0037 %s\nPhoto Date: %s File Date: %s \nRating: %s Size: %s %.2fmb \nLocation: %s %s %s \nKeywords: %s \nTitle: %s \nDescription: %s \n----------------------- \n%s 0037 %s\n拍摄日期:%s 文件日期:%s \n评分:%s 大小:%s %.2fmb \n位置:%s %s %s \nKeywords:%s \n标题:%s \n描述:%s \n----------------------- \n%s 0038 (click below) 0038 (点击下方) 0039 (no selection) 0039 (未选择) 0040 (pixels) 0040 (像素) 0041 (press key) 0041 (按键) 0042 (select function) 0042 (选择功能) 0043 *** bad utf8 detected *** \n 0043 *** 检测到无效的 utf8 *** \n 0044 *** cannot create new file \n 0044 *** 无法创建新文件 \n 0045 *** cannot get real path of input file \n 0045 *** 无法获取输入文件的真实路径 \n 0046 *** cannot load input file \n 0046 *** 无法加载输入文件 \n 0047 *** cannot make new version of input file \n 0047 *** 无法创建输入文件的新版本 \n 0048 *** cannot open input file 0048 *** 无法打开输入文件 0049 *** cannot read input file 0049 *** 无法读取输入文件 0050 *** cannot save output file \n 0050 *** 无法保存输出文件 \n 0051 *** completed \n 0051 *** 已完成 \n 0052 *** file date/time invalid \n 0052 *** 文件日期/时间无效 \n 0053 *** file type not supported \n 0053 *** 不支持的文件类型 \n 0054 *** invalid file \n 0054 *** 无效文件 \n 0055 *** metadata update error \n 0055 *** metadata 更新错误 \n 0056 *** no date/time available \n 0056 *** 没有可用的日期/时间 \n 0057 + bright 0057 + 提亮 0058 +Blue -Yellow 0058 +蓝 -黄 0059 +Brightness 0059 +亮度 0060 +Green -Magenta 0060 +绿 -洋红 0061 +Red -Cyan 0061 +红 -青 0062 - blue 0062 - 变蓝 0063 - fog/haze 0063 - 雾/霾 0064 .heic/.avif files not supported (install heif_convert) 0064 不支持 .heic/.avif 文件(请安装 heif_convert) 0065 .jp2 files not supported (install opj_decompress) 0065 不支持 .jp2 文件(请安装 opj_decompress) 0066 .webp files not supported (install dwebp) 0066 不支持 .webp 文件(请安装 dwebp) 0067 0 albums selected 0067 已选择 0 个相册 0068 0 duplicates 0068 0 个重复项 0069 0-5 stars 0069 0-5 星 0070 0/1/2 = no image index, old index only, old + update new/modified 0070 0/1/2 = 无图像索引,仅旧索引,旧索引+更新新/已修改内容 0071 2-character code 0071 2 字符代码 0072 3D depth 0072 3D 深度 0073 <2 images 0073 <2 张图像 0074 A new Fotocx release is being installed. \nYou may need to restore custom settings. 0074 正在安装新的 Fotocx 版本。 \n您可能需要恢复自定义设置。 0075 ADD GLARE 0075 添加眩光 0076 ADD NOISE 0076 添加噪点 0077 ADJUST HSL 0077 调整 HSL 0078 ADJUST RGB 0078 调整 RGB 0079 ALBUM MASS UPDATE 0079 相册批量更新 0080 ALBUMS 0080 相册 0081 ALBUMS MENU 0081 相册菜单 0082 ALIEN COLORS 0082 异色变换 0083 AMPLIFY CONTRAST 0083 增强对比度 0084 ANTI-ALIAS 0084 抗锯齿 0085 AREA BLEND 0085 区域混合 0086 AREA FILL 0086 区域填充 0087 AREA OVERVIEW 0087 区域概览 0088 AUTOSEARCH 0088 自动搜索 0089 About 0089 关于 0090 Action 0090 操作 0091 Add 0091 添加 0092 Add 1 0092 添加 1 0093 Add All 0093 全部添加 0094 Add Current 0094 添加当前 0095 Add Current File Here 0095 在此添加当前文件 0096 Add Glare 0096 添加眩光 0097 Add Image 0097 添加图像 0098 Add Line 0098 添加线条 0099 Add Margins 0099 添加边距 0100 Add Noise 0100 添加噪点 0101 Add Random Noise 0101 添加随机噪点 0102 Add Selected Files Here 0102 在此添加选定的文件 0103 Add Texture 0103 添加纹理 0104 Add a brightness/color ramp across an image 0104 在图像上添加亮度/颜色渐变 0105 Add bookmark: click on a gallery thumbnail. \nRename bookmark: click it and press [Rename] 0105 添加书签:点击图库缩略图。\n重命名书签:点击书签后按[重命名] 0106 Add glare around bright objects 0106 在明亮物体周围添加眩光 0107 Add margins around an image 0107 在图像周围添加边距 0108 Add newest version to existing versions 0108 将最新版本添加到现有版本 0109 Add overlay image (e.g. copyright) to selected images 0109 在选定图像上添加叠加图像(例如版权信息) 0110 Add random noise to an image 0110 为图像添加随机噪点 0111 Add selected versions to existing versions 0111 将选定版本添加到现有版本 0112 Add texture to an image 0112 为图像添加纹理 0113 Add to Selection 0113 添加到选择 0114 Add/change/delete metadata for selected image files 0114 为选定图像文件添加/更改/删除 metadata 0115 Add/remove barrel/pincushion distortion 0115 添加/移除桶形/枕形畸变 0116 Add/remove brightness/color radially from chosen center 0116 从所选中心径向添加/移除亮度/颜色 0117 Add/remove keywords for selected image files 0117 为选定图像文件添加/移除keywords 0118 Add/revise location/geocoordinates for selected image files 0118 为选定图像文件添加/修改位置/地理坐标 0119 Adjust HSL 0119 调整 HSL 0120 Adjust Image Contributions 0120 调整图像贡献度 0121 Adjust Pixel Composition 0121 调整像素构成 0122 Adjust RGB 0122 调整 RGB 0123 Adjust brightness, contrast, color 0123 调整亮度、对比度、颜色 0124 Adjust color saturation based on brightness 0124 根据亮度调整颜色饱和度 0125 Adjust color using HSL color model 0125 使用 HSL 颜色模型调整颜色 0126 Adjust color using RGB or CMY colors 0126 使用 RGB 或 CMY 颜色调整颜色 0127 Adjustment 0127 调整 0128 Album Mass Update 0128 相册批量更新 0129 Album Name 0129 相册名称 0130 Albums 0130 相册 0131 Albums: gallery of chosen images, arrange via drag & drop 0131 相册:所选图像的图库,可通过拖放排列 0132 Algorithm Iterations 0132 算法迭代次数 0133 Alien Colors 0133 异色变换 0134 All 0134 全部 0135 All Areas 0135 所有区域 0136 All files 0136 所有文件 0137 All image files will be re-indexed. \nContinue? 0137 所有图像文件将被重新索引。 \n是否继续? 0138 All±1 0138 全部±1 0139 All±10 0139 全部±10 0140 Alpha 0140 Alpha 0141 Amount 0141 数量 0142 Amplify 0142 增强 0143 Amplify Contrast 0143 增强对比度 0144 Amplify area contrast to enhance visibility of details 0144 增强区域对比度以提升细节可见度 0145 Angle 0145 角度 0146 Anti-Alias 0146 抗锯齿 0147 Apply 0147 应用 0148 Apply a soft focus effect to an image 0148 为图像应用柔焦效果 0149 Apply repeatedly while watching the image. 0149 反复应用并观察图像。 0150 Area Blend 0150 区域混合 0151 Area Edge Blend 0151 区域边缘混合 0152 Area Fill 0152 区域填充 0153 Arrange images and text in a layout (photo-montage) 0153 在版面中排列图像和文本(照片蒙太奇) 0154 Array Complete 0154 阵列已完成 0155 Array Width 0155 阵列宽度 0156 Arrow head 0156 箭头头部 0157 Auto Level 0157 自动色阶 0158 Auto black level 0158 自动黑场 0159 Auto crop: 0159 自动裁剪: 0160 Auto white balance 0160 自动白平衡 0161 Auto-replay 0161 自动回放 0162 BATCH CHANGE META 0162 批量更改 metadata 0163 BATCH CONVERT 0163 批量转换 0164 BATCH COPY/MOVE 0164 批量复制/移动 0165 BATCH DELETE/TRASH 0165 批量删除/回收 0166 BATCH GEOTAGS 0166 批量地理标记 0167 BATCH KEYWORDS 0167 批量keywords 0168 BATCH MENU 0168 批量菜单 0169 BATCH OVERLAY 0169 批量叠加 0170 BATCH PHOTO DATE 0170 批量拍摄日期 0171 BATCH PROCESSING 0171 批量处理 0172 BATCH PURGE KEYWORDS 0172 批量清除keywords 0173 BATCH RENAME KEYWORDS 0173 批量重命名keywords 0174 BATCH REPORT META 0174 批量报告 metadata 0175 BATCH SCRIPT 0175 批量脚本 0176 BATCH UPRIGHT 0176 批量校正 0177 BLANK IMAGE 0177 空白图像 0178 BLUR 0178 模糊 0179 BOOKMARKS 0179 书签 0180 BRIGHTNESS RAMP 0180 亮度渐变 0181 Background 0181 背景 0182 Background Blur - blur relative to distance from foreground 0182 背景模糊 - 根据与前景的距离进行模糊 0183 Background Color 0183 背景颜色 0184 Background Pattern 0184 背景图案 0185 Base Transparency 0185 基础透明度 0186 Batch 0186 批量 0187 Batch Add/Change Metadata 0187 批量添加/更改 metadata 0188 Batch Add/Remove Keywords 0188 批量添加/移除keywords 0189 Batch Change Meta 0189 批量更改 metadata 0190 Batch Convert 0190 批量转换 0191 Batch Copy/Move 0191 批量复制/移动 0192 Batch Delete/Trash 0192 批量删除/回收 0193 Batch Geotags 0193 批量地理标记 0194 Batch Keywords 0194 批量keywords 0195 Batch Metadata 0195 批量 metadata 0196 Batch Overlay 0196 批量叠加 0197 Batch Photo Date 0197 批量拍摄日期 0198 Batch Photo Date/Time 0198 批量拍摄日期/时间 0199 Batch Purge Keywords 0199 批量清除keywords 0200 Batch Rename Keywords 0200 批量重命名keywords 0201 Batch Report Meta 0201 批量报告 metadata 0202 Batch Report Metadata 0202 批量报告 metadata 0203 Batch Set Geotags 0203 批量设置地理标记 0204 Batch Upright 0204 批量校正 0205 Batch: copy, move, convert, RAW convert, add/change metadata 0205 批量:复制、移动、转换、RAW 转换、添加/更改 metadata 0206 Bend and fine-align 0206 弯曲并精细对齐 0207 Bias 0207 偏移量 0208 Black 0208 黑色 0209 Blank Image 0209 空白图像 0210 Blend 0210 混合 0211 Blend 0% 0211 混合 0% 0212 Blend Width 0212 混合宽度 0213 Blend area edits/edges using the mouse 0213 使用鼠标混合区域编辑/边缘 0214 Blend: 0% 0214 混合:0% 0215 Blue 0215 蓝色 0216 Blue Factors 0216 蓝色系数 0217 Blur 0217 模糊 0218 Blur Angle (degrees) 0218 模糊角度(度) 0219 Blur Background 0219 背景模糊 0220 Blur Image 0220 图像模糊 0221 Blur Mix 0221 模糊混合 0222 Blur Normal 0222 普通模糊 0223 Blur Radius 0223 模糊半径 0224 Blur Span 0224 模糊跨度 0225 Blur Span (pixels) 0225 模糊跨度(像素) 0226 Blur the image (various methods) 0226 对图像进行模糊处理(多种方法) 0227 Bookmarks 0227 书签 0228 Both 0228 两者 0229 Bottom 0229 底部 0230 Bright Limit 0230 亮度上限 0231 Bright Point 0231 亮点 0232 Brightness 0232 亮度 0233 Brightness Histogram 0233 亮度直方图 0234 Brightness Ramp 0234 亮度渐变 0235 Brightness should show a gradual ramp \nextending all the way to the edges. 0235 亮度应显示为渐变, \n一直延伸到边缘。 0236 Browse 0236 浏览 0237 CALIBRATE PRINTER 0237 校准打印机 0238 CAPTIONS 0238 说明文字 0239 CARTOON 0239 卡通 0240 CHOOSE ALBUM 0240 选择相册 0241 CLEAR AREA 0241 清除区域 0242 CLOSE 0242 关闭 0243 COLOR MODE 0243 颜色模式 0244 COMBINE MENU 0244 合成菜单 0245 COMMAND PARAMETERS 0245 命令参数 0246 COMPLETED 0246 已完成 0247 COPY FROM IMAGE 0247 从图像复制 0248 COPY IN IMAGE 0248 图像内复制 0249 COPY META 0249 复制 metadata 0250 COPY PRIOR EDIT 0250 复制之前的编辑 0251 COPY TO CLIPBOARD 0251 复制到剪贴板 0252 COPY TO DESKTOP 0252 复制到桌面 0253 COPY/MOVE 0253 复制/移动 0254 COPY/PASTE AREA 0254 复制/粘贴区域 0255 CREATE ALBUM 0255 创建相册 0256 CROP 0256 裁剪 0257 CROSSHATCH 0257 交叉排线 0258 CURRENT ALBUM 0258 当前相册 0259 CURRENT FILE FOLDER 0259 当前文件文件夹 0260 CURVE EDITING 0260 曲线编辑 0261 CUSTOM KERNEL 0261 自定义卷积核 0262 CUSTOM MENU 0262 自定义菜单 0263 CYCLE 2 FILES 0263 循环 2 个文件 0264 CYCLE 3 FILES 0264 循环 3 个文件 0265 Calculate 0265 计算 0266 Calculate Geometry 0266 计算几何 0267 Calibrate Printer 0267 校准打印机 0268 Cancel 0268 取消 0269 Cartoon 0269 卡通 0270 Caution: Use the function Edit Main Metadata \nto changed tags available there, to insure \nrelated updates are made. 0270 注意:请使用“编辑主 metadata”功能 \n来更改那里可用的标签,以确保 \n相关内容同步更新。 0271 Center 0271 居中 0272 Center Hole 0272 中心孔 0273 Change 0273 更改 0274 Change Log 0274 更新日志 0275 Change file name 0275 更改文件名 0276 Change gallery sort order 0276 更改图库排序方式 0277 Change image colors using an algorithm 0277 使用算法更改图像颜色 0278 Change image pixel dimensions 0278 更改图像像素尺寸 0279 Chart to adjust monitor color 0279 用于调整显示器颜色的图表 0280 Choose 0280 选择 0281 Choose Album 0281 选择相册 0282 Choose Albums 0282 选择相册 0283 Choose Captions 0283 选择说明文字 0284 Choose an album and show as gallery of images 0284 选择一个相册并以图库形式显示图像 0285 Choose metadata shown on image captions 0285 选择图像标题上显示的 metadata 0286 Choose new Fotocx home folder 0286 选择新的 Fotocx 主文件夹 0287 Choose thumbnail folder 0287 选择缩略图文件夹 0288 Choose top image folders 0288 选择顶层图像文件夹 0289 Clear 0289 清除 0290 Clear All 0290 全部清除 0291 Click dark spot for black level 0291 点击暗部以设置黑场 0292 Click for RGB histogram 0292 点击以查看 RGB 直方图 0293 Click gray spot for white balance 0293 点击灰点以进行白平衡 0294 Click image to select pixels 0294 点击图像以选择像素 0295 Click image to select, drag image to move. 0295 点击图像进行选择,拖动图像进行移动。 0296 Click mouse to change center 0296 点击鼠标以更改中心 0297 Click near any position on the area outline. \nPossible gaps in the outline will be found. \nPress F1 for help 0297 在区域轮廓附近的任意位置点击。 \n将查找轮廓中可能存在的间隙。 \n按 F1 获取帮助 0298 Click the four corners of a tetragon area. Press [apply]. \nThe image is warped to make the tetragon into a rectangle. 0298 点击四边形区域的四个角。按[应用]。 \n图像将被扭曲,使四边形变为矩形。 0299 Click thumbnail to select file 0299 点击缩略图以选择文件 0300 Clip Level 0300 剪切上限 0301 Clip Limit % 0301 剪切限制 % 0302 Color 0302 颜色 0303 Color Chooser 0303 颜色选择器 0304 Color Depth: 0304 颜色深度: 0305 Color Fringes 0305 色边 0306 Color Hue 0306 色相 0307 Color Map File 0307 颜色映射文件 0308 Color Match Images 0308 匹配图像颜色 0309 Color Mode 0309 颜色模式 0310 Color calibration tool for printer and paper type 0310 用于打印机和纸张类型的颜色校准工具 0311 Color map file to use 0311 要使用的颜色映射文件 0312 Combine 0312 合成 0313 Combine 2-6 images into a wide panorama image 0313 将 2-6 张图像合成为宽幅全景图像 0314 Combine many images into an array of images 0314 将多张图像合成为图像阵列 0315 Combine multiple images in layers, select and expose layers 0315 分层合成多张图像,选择并显示图层 0316 Combine multiple noisy photos into a low-noise image 0316 合成多张有噪点的照片以生成低噪点图像 0317 Combine multiple photos to erase passing people, etc. 0317 合成多张照片以消除路过的行人等 0318 Combine within 0318 合成范围 0319 Combine: HDR, HDF, stack, panorama, mashup, image array 0319 合成:HDR、HDF、堆叠、全景、Mashup、图像阵列 0320 Command Params 0320 命令参数 0321 Commit 0321 提交 0322 Confirm Exit 0322 确认退出 0323 Contrast 0323 对比度 0324 Contrast All 0324 全部对比度 0325 Contrast Blue 0325 蓝色对比度 0326 Contrast Green 0326 绿色对比度 0327 Contrast Limit 0327 对比度限制 0328 Contrast Red 0328 红色对比度 0329 Convert %d image files 0329 转换 %d 个图像文件 0330 Convert an image into a Tiny Planet image 0330 将图像转换为微缩星球图像 0331 Convert image into a cartoon drawing 0331 将图像转换为卡通画 0332 Convert image into a crosshatch sketch 0332 将图像转换为交叉排线素描 0333 Convert image into a line drawing 0333 将图像转换为线条画 0334 Convert image into a simulated painting 0334 将图像转换为模拟油画 0335 Convert image into a simulated sketch (1) 0335 将图像转换为模拟素描(1) 0336 Convert image into a simulated sketch (2) 0336 将图像转换为模拟素描(2) 0337 Convert image into black/white lines 0337 将图像转换为黑白线条 0338 Convert image into dithered dots 0338 将图像转换为抖动点阵 0339 Convert image into square tiles with 3D effect 0339 将图像转换为带 3D 效果的方形瓷砖 0340 Convert image into tiles matching feature contours 0340 将图像转换为符合特征轮廓的瓷砖 0341 Copy 0341 复制 0342 Copy %d image files 0342 复制 %d 个图像文件 0343 Copy From Image 0343 从图像复制 0344 Copy Meta 0344 复制 metadata 0345 Copy Metadata 0345 复制 metadata 0346 Copy Prior Edit 0346 复制之前的编辑 0347 Copy Within Image 0347 图像内复制 0348 Copy area for later pasting into image 0348 复制区域以便稍后粘贴到图像中 0349 Copy areas from another image using the mouse 0349 使用鼠标从另一图像复制区域 0350 Copy areas from prior edits using the mouse 0350 使用鼠标从之前的编辑中复制区域 0351 Copy areas within an image using the mouse 0351 使用鼠标在图像内复制区域 0352 Copy image file to the clipboard 0352 将图像文件复制到剪贴板 0353 Copy image file to the desktop 0353 将图像文件复制到桌面 0354 Copy in Image 0354 图像内复制 0355 Copy metadata from one image to another 0355 将 metadata 从一张图像复制到另一张图像 0356 Copy or Move Image File 0356 复制或移动图像文件 0357 Copy or Move image file to new location 0357 将图像文件复制或移动到新位置 0358 Copy to Clipboard 0358 复制到剪贴板 0359 Copy to Desktop 0359 复制到桌面 0360 Copy without unsaved changes? 0360 是否在不保存更改的情况下复制? 0361 Copy/Move 0361 复制/移动 0362 Copy/move selected image files to a new folder 0362 将选定图像文件复制/移动到新文件夹 0363 Copyright 0363 版权 0364 Create 0364 创建 0365 Create Album 0365 创建相册 0366 Create Blank Image 0366 创建空白图像 0367 Create Mosaic 0367 创建马赛克拼图 0368 Create a blank image 0368 创建空白图像 0369 Create a mosaic with tiles made from all images 0369 使用所有图像的瓷砖创建马赛克拼图 0370 Create a new album (ordered set of image files) 0370 创建新相册(有序图像文件集) 0371 Create an embossed or 3D appearance 0371 创建浮雕或 3D 效果外观 0372 Create or replace an album 0372 创建或替换相册 0373 Crop 0373 裁剪 0374 Crop (trim) image margins 0374 裁剪(修剪)图像边距 0375 Crop Buttons 0375 裁剪按钮 0376 Crop Image 0376 裁剪图像 0377 Crosshatch 0377 交叉排线 0378 Crosshatch Sketch 0378 交叉排线素描 0379 Current Album 0379 当前相册 0380 Current File Folder 0380 当前文件文件夹 0381 Current gallery 0381 当前图库 0382 Current image: 0382 当前图像: 0383 Curve Node 0383 曲线节点 0384 Curve lines need at least 4 points 0384 曲线至少需要 4 个点 0385 Custom 0385 自定义 0386 Custom Kernel 0386 自定义卷积核 0387 Custom Shortcuts \n 0387 自定义快捷键 \n 0388 Custom menu: favorite/frequent functions, scripts, plugins 0388 自定义菜单:常用/常见功能、脚本、插件 0389 Customize 0389 自定义 0390 Customize: 0390 自定义: 0391 Cut Bottom 0391 底部裁切 0392 Cut Top 0392 顶部裁切 0393 Cycle 2 Files 0393 循环 2 个文件 0394 Cycle 2 Prior Files 0394 循环 2 个之前的文件 0395 Cycle 3 Files 0395 循环 3 个文件 0396 Cycle 3 Prior Files 0396 循环 3 个之前的文件 0397 Cycle through images: 0397 循环浏览图像: 0398 DARK/BRIGHT PIXELS 0398 暗/亮像素 0399 DEFOG 0399 去雾 0400 DELETE ALBUM 0400 删除相册 0401 DELETE META 0401 删除 metadata 0402 DELETE/TRASH 0402 删除/回收 0403 DENOISE 0403 降噪 0404 DIALOG BUTTONS 0404 对话框按钮 0405 DITHER 0405 抖动 0406 DRAG AND DROP 0406 拖放 0407 Dark Areas 0407 暗部区域 0408 Dark Limit 0408 暗度下限 0409 Dark Point 0409 暗点 0410 Dark/Bright Pixels 0410 暗/亮像素 0411 Data file 0411 数据文件 0412 Define keywords used for searching images 0412 定义用于搜索图像的keywords 0413 Defined Keywords: 0413 已定义的keywords: 0414 Defog 0414 去雾 0415 Delete 0415 删除 0416 Delete Album 0416 删除相册 0417 Delete Meta 0417 删除 metadata 0418 Delete Metadata 0418 删除 metadata 0419 Delete Originals 0419 删除原始文件 0420 Delete an album 0420 删除相册 0421 Delete or Trash selected image files 0421 删除或回收选定图像文件 0422 Delete or trash an image file 0422 删除或回收图像文件 0423 Delete read-only file? 0423 是否删除只读文件? 0424 Delete/Trash 0424 删除/回收 0425 Denoise 0425 降噪 0426 Depth 0426 深度 0427 Desc. 0427 描述. 0428 Description: %s\n 0428 描述:%s\n 0429 Desktop 0429 桌面 0430 Dialog Font 0430 对话框字体 0431 Diffs 0431 差异 0432 Directed Blur 0432 定向模糊 0433 Directed Blur - blur locally in direction of mouse drag 0433 定向模糊 - 根据鼠标拖动方向局部模糊 0434 Disable 0434 禁用 0435 Disable areas for editing 0435 禁用区域编辑 0436 Discard unsaved changes? 0436 是否放弃未保存的更改? 0437 Discard unsaved edits? 0437 是否放弃未保存的编辑? 0438 Distort image areas using the mouse 0438 使用鼠标扭曲图像区域 0439 Dither 0439 抖动 0440 Dither Image 0440 抖动图像 0441 Dither0 0441 抖动0 0442 Dither1 0442 抖动1 0443 Dither2 0443 抖动2 0444 Dither3 0444 抖动3 0445 Dither4 0445 抖动4 0446 Drag images into rough alignment.\nTo rotate, drag from lower edge. 0446 拖动图像使其大致对齐。\n若要旋转,请从下边缘拖动。 0447 Drag margin box middle or edges 0447 拖动边距框的中间或边缘 0448 Drag mouse on image. \nLeft click to cancel. 0448 在图像上拖动鼠标。 \n左键点击取消。 0449 Drag mouse to select. Erase. Repeat. \nClick: extend selection to mouse. 0449 拖动鼠标以选择。擦除。重复。 \n点击:将选择扩展到鼠标位置。 0450 Drag mouse to set center 0450 拖动鼠标以设置中心 0451 Drag near an image corner using the mouse 0451 使用鼠标在图像角落附近拖动 0452 Drag on image to level image.\nClick on image for level lines. 0452 在图像上拖动以校平图像。\n点击图像以显示水平线。 0453 Drag within image using the mouse 0453 使用鼠标在图像内拖动 0454 Draw a line across the image in \ndirection of brightness change. 0454 沿亮度变化方向 \n在图像上画一条线。 0455 Draw box on image 0455 在图像上绘制方框 0456 Draw line or arrow on image 0456 在图像上绘制线条或箭头 0457 Draw on image: text, line/arrow, box, circle, ellipse 0457 在图像上绘制:文本、线条/箭头、方框、圆形、椭圆 0458 Draw oval on image 0458 在图像上绘制椭圆 0459 Draw text on image 0459 在图像上绘制文本 0460 Duplicate or nested folders: \n %s \n %s \nPlease remove. 0460 重复或嵌套的文件夹: \n %s \n %s \n请移除。 0461 Duplicates: 0461 重复项: 0462 EDIT ALBUM 0462 编辑相册 0463 EDIT ANY META 0463 编辑任意 metadata 0464 EDIT BOOKMARKS 0464 编辑书签 0465 EDIT MAIN META 0465 编辑主 metadata 0466 EDIT MENU 0466 编辑菜单 0467 EDIT PROCEDURES 0467 编辑流程 0468 EDIT SCRIPT 0468 编辑脚本 0469 EDIT WORKFLOW 0469 编辑工作流 0470 EFFECTS MENU 0470 效果菜单 0471 EMBOSS 0471 浮雕 0472 ENABLE/DISABLE AREA 0472 启用/禁用区域 0473 ENGRAVE 0473 雕刻 0474 ESCHER SPIRAL 0474 埃舍尔螺旋 0475 EXPORT FILES 0475 导出文件 0476 Edge 0476 边缘 0477 Edit 0477 编辑 0478 Edit Any Meta 0478 编辑任意 metadata 0479 Edit Any Metadata 0479 编辑任意 metadata 0480 Edit Bookmarks 0480 编辑书签 0481 Edit Images 0481 编辑图像 0482 Edit Keyboard Shortcuts 0482 编辑键盘快捷键 0483 Edit Line 0483 编辑线条 0484 Edit Line/Arrow 0484 编辑线条/箭头 0485 Edit Main Meta 0485 编辑主 metadata 0486 Edit Main Metadata 0486 编辑主 metadata 0487 Edit Menu 0487 编辑菜单 0488 Edit Metadata 0488 编辑 metadata 0489 Edit Plugins 0489 编辑插件 0490 Edit Text 0490 编辑文本 0491 Edit any metadata tag 0491 编辑任意 metadata 标签 0492 Edit function can not use Paint Edits 0492 编辑功能无法使用绘制编辑 0493 Edit function must be active 0493 必须先启用编辑功能 0494 Edit key metadata: keywords/geotags/description/rating ... 0494 编辑关键 metadata:keywords/地理标记/描述/评分 ... 0495 Edit plugins menu 0495 编辑插件菜单 0496 Edit: crop, rotate, retouch, rescale, markup, paint edits, copy areas 0496 编辑:裁剪、旋转、修饰、缩放、标注、绘制编辑、复制区域 0497 Effects 0497 效果 0498 Effects: cartoon, sketch, paint, emboss, dither, texture, colors, custom convolution 0498 效果:卡通、素描、油画、浮雕、抖动、纹理、颜色、自定义卷积 0499 Emboss 0499 浮雕 0500 Enable 0500 启用 0501 Enable areas for editing 0501 启用区域编辑 0502 End of gallery 0502 图库结束 0503 Engrave 0503 雕刻 0504 Enter Keyword 0504 输入keyword 0505 Enter New Keyword 0505 输入新keyword 0506 Enter line or arrow properties in dialog, \nclick/drag on image, right click to remove 0506 在对话框中输入线条或箭头属性, \n在图像上点击/拖动,右键点击移除 0507 Enter text, [Add] to layout, edit properties. 0507 输入文本,[添加]到版面,编辑。 0508 Enter text, click/drag on image, right click to remove 0508 输入文本,在图像上点击/拖动,右键点击移除 0509 Erase 0509 擦除 0510 Erase existing areas 0510 擦除现有区域 0511 Escher Spiral 0511 埃舍尔螺旋 0512 Exceed 50 anchor points 0512 超过 50 个锚点 0513 Export Files 0513 导出文件 0514 Export selected image files to another folder 0514 将选定图像文件导出到其他文件夹 0515 FILE MENU 0515 文件菜单 0516 FILE SAVE 0516 文件保存 0517 FILE VIEW 0517 文件视图 0518 FIND AREA GAP 0518 查找区域间隙 0519 FIND BAD FILES 0519 查找损坏文件 0520 FIND DUPLICATES 0520 查找重复项 0521 FIRST INDEX 0521 首次索引 0522 FIRST STARTUP 0522 首次启动 0523 FIX META 0523 修复 metadata 0524 FLATTEN HISTOGRAM 0524 展平直方图 0525 FLATTEN PHOTO 0525 展平照片 0526 FOLDER TREE 0526 文件夹树 0527 FOTOCX FOR WINDOWS 11 0527 适用于 Windows 11 的 Fotocx 0528 FOTOCX LIMITATIONS 0528 Fotocx 限制 0529 FOTOCX USAGE 0529 Fotocx 用法 0530 FRINGES 0530 色边 0531 FUSION 0531 融合 0532 Fetch 0532 获取 0533 File 0533 文件 0534 File Mod Date/Time 0534 文件修改日期/时间 0535 File Name 0535 文件名 0536 File Name/Number 0536 文件名/编号 0537 File Name: %s \n 0537 文件名:%s \n 0538 File Size (bytes) 0538 文件大小(字节) 0539 File View 0539 文件视图 0540 File count: 0540 文件数: 0541 File type cannot be edited 0541 该文件类型无法编辑 0542 File1 0542 文件1 0543 File2 0543 文件2 0544 File: 0544 文件: 0545 File: new session, open, rename, copy/move, delete, print 0545 文件:新建会话、打开、重命名、复制/移动、删除、打印 0546 Fill selected areas or transparent areas with a color 0546 用颜色填充选定区域或透明区域 0547 Fill selected areas with color for visual verification. \nMethod 1: left-click in each selected area not already filled. \nMethod 2: right-click OUTSIDE all selected areas. \nPress [help] button for clarification 0547 用颜色填充选定区域以便直观核对。 \n方法 1:左键点击每个尚未填充的选定区域。 \n方法 2:在所有选定区域之外右键点击。 \n按[帮助]按钮查看说明 0548 Find 0548 查找 0549 Find Bad Files 0549 查找损坏文件 0550 Find Duplicate Images 0550 查找重复图像 0551 Find Duplicates 0551 查找重复项 0552 Find Gap 0552 查找间隙 0553 Find a gap in an area outline 0553 在区域轮廓中查找间隙 0554 Find all images for a location [date range] 0554 查找某位置的所有图像 [日期范围] 0555 Find all images for a selected tag name and value 0555 查找具有指定标签名称和值的所有图像 0556 Find images meeting multiple search criteria 0556 查找符合多个搜索条件的图像 0557 Find optimum factors: 0557 查找最佳系数: 0558 Finish 0558 完成 0559 Finish Area 0559 完成区域 0560 Fix Bad File 0560 修复损坏文件 0561 Fix Broken Metadata 0561 修复损坏的 metadata 0562 Fix Meta 0562 修复 metadata 0563 Fix Motion Blur 0563 修正运动模糊 0564 Fix Perspective 0564 修正透视 0565 Fix color fringes (chromatic aberration) 0565 修正色边(色差) 0566 Fix perspective for object photographed from an angle 0566 修正从某角度拍摄物体的透视 0567 Fix red-eyes from flash photo 0567 修正闪光拍照造成的红眼 0568 Flatten 0568 展平 0569 Flatten Histogram 0569 展平直方图 0570 Flatten Pano 0570 展平全景图 0571 Flatten Photo 0571 展平照片 0572 Flatten brightness histogram to enhance details 0572 展平亮度直方图以增强细节 0573 Flatten curved surface. 0573 展平弯曲表面。 0574 Flatten photo of a curved image (e.g. poster on round column 0574 展平弯曲图像的照片(例如圆柱上的海报) 0575 Flip 0575 翻转 0576 Folder Tree 0576 文件夹树 0577 Folders 0577 文件夹 0578 Folders for image files (subfolders included automatically) 0578 图像文件所在的文件夹(自动包含子文件夹) 0579 Font 0579 字体 0580 For random image sequence, this value is \nthe relative frequency to show the image. \nBase value is 10. 20 --> show 2x as often. 0580 对于随机图像序列,此值为 \n显示该图像的相对频率。 \n基准值为 10。20 --> 显示频率为 2 倍。 0581 Foreground 0581 前景 0582 Fotocx copyright notice 0582 Fotocx 版权声明 0583 Fotocx home 0583 Fotocx 主页 0584 Fotocx privacy policy 0584 Fotocx 隐私政策 0585 Fotocx video tutorial on YouTube 0585 YouTube 上的 Fotocx 视频教程 0586 Fotocx web site (information and downloads) 0586 Fotocx 官网(信息与下载) 0587 FreeSans 0587 FreeSans 0588 Full List 0588 完整列表 0589 Full Screen 0589 全屏 0590 Fusion 0590 融合 0591 GALLERY END 0591 图库结束 0592 GALLERY FILTER 0592 图库过滤器 0593 GALLERY HOME 0593 图库首页 0594 GALLERY MENU 0594 图库菜单 0595 GALLERY OVERVIEW 0595 图库概览 0596 GALLERY SORT 0596 图库排序 0597 GALLERY TO ALBUM 0597 图库转相册 0598 GALLERY VIEW 0598 图库视图 0599 GDK pixbuf: cannot save file 0599 GDK pixbuf:无法保存文件 0600 GLOBAL RETINEX 0600 全局 Retinex 0601 GRID SETTINGS 0601 网格设置 0602 Gallery 0602 图库 0603 Gallery End 0603 图库结束 0604 Gallery Filter 0604 图库过滤器 0605 Gallery Home 0605 图库首页 0606 Gallery Sort 0606 图库排序 0607 Gallery View 0607 图库视图 0608 Gallery of newest image files 0608 最新图像文件图库 0609 Gallery of recently viewed image files 0609 最近查看图像文件图库 0610 Gallery to Album 0610 图库转相册 0611 Gallery view with thumbnails and basic metadata 0611 带缩略图和基本 metadata 的图库视图 0612 Gallery view with thumbnails and file data 0612 带缩略图和文件数据的图库视图 0613 Gallery: thumbnails, new/recent, sort, select, bookmarks 0613 图库:缩略图、新建/最近、排序、选择、书签 0614 Generate an inward spiraling repeating image 0614 生成向内螺旋的重复图像 0615 Global Retinex 0615 全局 Retinex 0616 Gradual 0616 渐变 0617 Graduated Blur 0617 渐变模糊 0618 Graduated Blur - blur relative to pixel contrast 0618 渐变模糊 - 根据像素对比度进行模糊 0619 Grayscale 0619 灰度 0620 Green 0620 绿色 0621 Grid Settings 0621 网格设置 0622 Group by country 0622 按国家分组 0623 Group by country/date 0623 按国家/日期分组 0624 Group by country/location 0624 按国家/位置分组 0625 Group by country/location/date 0625 按国家/位置/日期分组 0626 Group by date/country 0626 按日期/国家分组 0627 Group by date/country/location 0627 按日期/国家/位置分组 0628 HDF 0628 HDF 0629 HDR 0629 HDR 0630 HELP MENU 0630 帮助菜单 0631 Hard 0631 强 0632 Height 0632 高度 0633 Height: 0633 高度: 0634 Help 0634 帮助 0635 Help: user guide, tutorial, change log, licenses, privacy, about 0635 帮助:用户指南、教程、更新日志、许可证、隐私、关于 0636 Hide 0636 隐藏 0637 Hide selected areas 0637 隐藏选定区域 0638 High 0638 高 0639 High Depth of Field - combine near/far focus images for deeper focus 0639 高景深 - 合成近/远对焦图像以获得更大景深 0640 High Dynamic Range - combine bright/dark images for better detail 0640 高动态范围 - 合成明暗图像以获得更好细节 0641 Highlight darkest and brightest pixels 0641 突出显示最暗和最亮的像素 0642 Home Folder 0642 主文件夹 0643 Home Page 0643 主页 0644 Horz 0644 水平 0645 How to remove Fotocx application and user files 0645 如何移除 Fotocx 应用程序及用户文件 0646 Hue 0646 色相 0647 IMAGE ARRAY 0647 图像阵列 0648 INDEX FILES 0648 索引文件 0649 INSIDE-OUT 0649 内外翻转 0650 INVERT AREA 0650 反转区域 0651 Icon size 0651 图标大小 0652 Icons 0652 图标 0653 Image 0653 图像 0654 Image Array 0654 图像阵列 0655 Image Columns 0655 图像列数 0656 Image Differences 0656 图像差异 0657 Image File 0657 图像文件 0658 Image File: 0658 图像文件: 0659 Image Keywords 0659 图像keywords 0660 Image Locations 0660 图像位置 0661 Image Markup 0661 图像标注 0662 Image Position 0662 图像位置 0663 Image Preferences 0663 图像首选项 0664 Image Ratios 0664 图像比例 0665 Image Size (pixels) 0665 图像大小(像素) 0666 Image Time 0666 图像时间 0667 Image Timeline 0667 图像时间线 0668 Image colors are converted for printing. 0668 图像颜色已为打印进行转换。 0669 Image dimensions have changed \nCopy Prior Edit cannot be used 0669 图像尺寸已更改 \n无法使用“复制之前的编辑” 0670 Image dimensions have changed, \nArea Blend cannot be used 0670 图像尺寸已更改, \n无法使用“区域混合” 0671 Image dimensions have changed, \nthis prior image cannot be used 0671 图像尺寸已更改, \n此前一张图像无法使用 0672 Image is fixed, unmovable 0672 图像已固定,无法移动 0673 Images sizes are not compatible 0673 图像尺寸不兼容 0674 Include: 0674 包含: 0675 Index Files 0675 索引文件 0676 Index Level 0676 索引级别 0677 Index function terminated. \nIndexing is required for search and map functions \nand to make thumbnail gallery pages display fast. 0677 索引功能已终止。 \n搜索和地图功能都需要索引, \n且索引可使缩略图图库页面显示更快。 0678 Index new image files and make thumbnails 0678 索引新图像文件并生成缩略图 0679 Input color to match and adjust: 0679 要匹配和调整的输入颜色: 0680 Inside-out 0680 内外翻转 0681 Install following programs using your package manager: \n 0681 请使用您的包管理器安装以下程序: \n 0682 Intensity 0682 强度 0683 Invert 0683 反转 0684 Invert selected areas (selected ↔ not selected) 0684 反转选定区域(已选 ↔ 未选) 0685 Irregular Tiles 0685 不规则瓷砖 0686 Iterations 0686 迭代次数 0687 JPEG ARTIFACTS 0687 JPEG 伪影 0688 JPEG Artifacts 0688 JPEG 伪影 0689 JPEG files 0689 JPEG 文件 0690 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0690 一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月 0691 Jump to gallery beginning [home] 0691 跳转到图库开头 [home] 0692 Jump to gallery end [end] 0692 跳转到图库末尾 [end] 0693 KEYBOARD ESCAPE KEY 0693 键盘 Esc 键 0694 KEYBOARD SHORTCUTS 0694 键盘快捷键 0695 KEYWORDS OVERVIEW 0695 keywords 概览 0696 Keep 0696 保留 0697 Kernel size 0697 卷积核大小 0698 Keyboard Shortcuts 0698 键盘快捷键 0699 Keywords Category 0699 keywords 分类 0700 Kill active dialog? 0700 是否关闭当前对话框? 0701 Kill busy function? 0701 是否终止正在运行的功能? 0702 Kuwahara 0702 Kuwahara 0703 Kuwahara Depth 0703 Kuwahara 深度 0704 LINE COLOR 0704 线条颜色 0705 LOAD/SAVE AREA 0705 加载/保存区域 0706 LOCAL CONTRAST 0706 局部对比度 0707 LOCAL RETINEX 0707 局部 Retinex 0708 Language 0708 语言 0709 Layout and background image 0709 版面与背景图像 0710 Left 0710 左 0711 Left-drag mouse within the area \nto gradually undo area edits. \nRight-drag to restore edits. \nDrag along area edge to blend edge. 0711 在区域内左键拖动鼠标 \n以逐渐撤销区域编辑。 \n右键拖动以恢复编辑。 \n沿区域边缘拖动以混合边缘。 0712 Left/right click: previous/next image (also arrow keys) 0712 左/右键点击:上一张/下一张图像(也可用方向键) 0713 Left/right click: undo/redo one edit step \nMiddle click: go back to selected edit step 0713 左/右键点击:撤销/重做一步编辑 \n中键点击:返回所选编辑步骤 0714 Left/right click: zoom image/thumbnail in/out (also +/- keys) 0714 左/右键点击:放大/缩小图像/缩略图(也可用 +/- 键) 0715 Length 0715 长度 0716 Level 0716 级别 0717 Licenses 0717 许可证 0718 Light Source 0718 光源 0719 Lightness 0719 亮度 0720 Limit 0720 限制 0721 Line Color 0721 线条颜色 0722 Line Threshold 0722 线条阈值 0723 Line Width 0723 线条宽度 0724 Line length 0724 线条长度 0725 List Fotocx command line parameters 0725 列出 Fotocx 命令行参数 0726 List all metadata for current image or clicked thumbnail 0726 列出当前图像或所点击缩略图的所有 metadata 0727 List outboard programs and functions 0727 列出外部程序及功能 0728 Load 0728 加载 0729 Load settings from file 0729 从文件加载设置 0730 Local Contrast 0730 局部对比度 0731 Local Retinex 0731 局部 Retinex 0732 Location 0732 位置 0733 Location and country will replace current values.\nGPS data is replaced only if new value is present. 0733 位置和国家将替换当前值。\n仅当存在新值时才会替换 GPS 数据。 0734 Lock 0734 锁定 0735 Low Amplify 0735 低增强 0736 MAGNIFY IMAGE 0736 放大图像 0737 MAKE WAVES 0737 制造波浪 0738 MANAGE KEYWORDS 0738 管理keywords 0739 MAP MENU 0739 地图菜单 0740 MAP VIEW 0740 地图视图 0741 MARGINS 0741 边距 0742 MARKUP 0742 标注 0743 MASHUP 0743 Mashup 0744 MATCH COLORS 0744 匹配颜色 0745 MEASURE IMAGE 0745 测量图像 0746 MENU SHORTCUTS 0746 菜单快捷键 0747 METADATA MENU 0747 metadata 菜单 0748 METADATA TAGS 0748 metadata 标签 0749 METADATA VIEW 0749 metadata 视图 0750 MONITOR COLOR 0750 显示器颜色 0751 MOSAIC 0751 马赛克拼图 0752 MOUSE ALT-RIGHT-BUTTON 0752 鼠标 Alt+右键 0753 MOUSE FUNCTIONS 0753 鼠标功能 0754 MOUSE OWNERSHIP 0754 鼠标所有权 0755 MOVE FOTOCX HOME 0755 移动 Fotocx 主文件夹 0756 Magnify 0756 放大 0757 Magnify Image 0757 放大图像 0758 Magnify image around the mouse position 0758 在鼠标位置周围放大图像 0759 Main memory is too small to run Fotocx. \nYou can try anyway if you wish. \n Continue? 0759 主内存太小,无法运行 Fotocx。 \n如果愿意,您仍可以尝试运行。 \n 是否继续? 0760 Make Layout Image 0760 制作版面图像 0761 Make Square Tiles 0761 制作方形瓷砖 0762 Make Waves 0762 制造波浪 0763 Make a spherical projection of an image 0763 制作图像的球形投影 0764 Make black margins transparent 0764 使黑色边距透明 0765 Make new versions 0765 制作新版本 0766 Make width constant for window size 0766 使宽度与窗口大小一致 0767 Manage Keywords 0767 管理keywords 0768 Map 0768 地图 0769 Map View 0769 地图视图 0770 Maps 0770 地图 0771 Maps: view images by map location 0771 地图:按地图位置查看图像 0772 Margin 0772 边距 0773 Margins 0773 边距 0774 Markup 0774 标注 0775 Mashup 0775 Mashup 0776 Mass update album files 0776 批量更新相册文件 0777 Match Brightness 0777 匹配亮度 0778 Match Colors 0778 匹配颜色 0779 Match Level 0779 匹配级别 0780 Match Limit 0780 匹配限制 0781 Match image colors to colors of another image 0781 将图像颜色匹配到另一图像的颜色 0782 Match using: 0782 匹配方式: 0783 Matching Keywords 0783 匹配的keywords 0784 Max 0784 最大 0785 Max. Width 0785 最大宽度 0786 Measure Image 0786 测量图像 0787 Measure Noise 0787 测量噪点 0788 Measure pixel distances within an image 0788 测量图像内的像素距离 0789 Menu Colors 0789 菜单颜色 0790 Menu Style 0790 菜单样式 0791 Metadata 0791 metadata 0792 Metadata Tags 0792 metadata 标签 0793 Metadata View 0793 metadata 视图 0794 Metadata from Search Function 0794 来自搜索功能的 metadata 0795 Method 1:\nLeft-click on red-eye to darken.\nMethod 2:\nDrag down and right to enclose red-eye.\nLeft-click on red-eye to darken.\nUndo red-eye:\nRight-click on red-eye. 0795 方法 1:\n左键点击红眼以使其变暗。\n方法 2:\n向右下方拖动以框住红眼。\n左键点击红眼以使其变暗。\n撤销红眼处理:\n右键点击红眼。 0796 Mirror: 0796 镜像: 0797 Mode: 0797 模式: 0798 Monitor Color 0798 显示器颜色 0799 Mosaic 0799 马赛克拼图 0800 Mouse Radius 0800 鼠标半径 0801 Mouse Warp (drag image) 0801 鼠标扭曲(拖动图像) 0802 Mouse drag: pan image 360° \nL/R mouse click: zoom in/out \nEscape: quit panorama view 0802 鼠标拖动:360° 环视图像 \n左/右键点击:放大/缩小 \nEsc:退出全景视图 0803 Move %d image files 0803 移动 %d 个图像文件 0804 Move Fotocx Home 0804 移动 Fotocx 主文件夹 0805 Move Fotocx Home Folder 0805 移动 Fotocx 主文件夹 0806 Move Fotocx home folder to chosen folder 0806 将 Fotocx 主文件夹移动到所选文件夹 0807 Move mouse in a monotone image area. 0807 在图像的单色区域内移动鼠标。 0808 Multiplier 0808 倍增系数 0809 NEW SESSION 0809 新建会话 0810 NEWEST FILES 0810 最新文件 0811 NEWLINE CHARACTERS IN METADATA 0811 metadata 中的换行符 0812 NON-STANDARD DIALOG WIDGETS 0812 非标准对话框控件 0813 New Area 0813 新建区域 0814 New File Name: 0814 新文件名: 0815 New Location 0815 新位置 0816 New Location: 0816 新位置: 0817 New Name 0817 新名称 0818 New Session 0818 新建会话 0819 New Type: 0819 新类型: 0820 New Version 0820 新版本 0821 Newest 0821 最新 0822 Newest Files 0822 最新文件 0823 Next 0823 下一个 0824 Next gallery 0824 下一个图库 0825 No 0825 否 0826 No curve lines found 0826 未找到曲线 0827 No image file index was found.\nAn image file index will be created.\nYour image files will not be changed.\nThis may need considerable time if you \nhave many thousands of image files. 0827 未找到图像文件索引。\n将创建图像文件索引。\n您的图像文件不会被更改。\n如果您有数千个图像文件,\n此过程可能需要较长时间。 0828 No images found 0828 未找到图像 0829 Noise Reduction 0829 降噪 0830 Noise Size 0830 噪点大小 0831 None 0831 无 0832 Normal Blur 0832 普通模糊 0833 Normal Blur - mix pixels with all neighbor pixels 0833 普通模糊 - 与所有相邻像素混合 0834 OPEN IMAGE FILE 0834 打开图像文件 0835 OTHER TOPICS 0835 其他主题 0836 OUTLINES 0836 轮廓 0837 Old Name 0837 旧名称 0838 One Tag: 0838 单个标签: 0839 Opacity 0839 不透明度 0840 Open 0840 打开 0841 Open Image File 0841 打开图像文件 0842 Open a file and paste as selected area into an image 0842 打开文件并作为选定区域粘贴到图像中 0843 Open a parallel Fotocx session 0843 打开一个并行的 Fotocx 会话 0844 Open and edit the scanned color chart file. \nRemove any skew or rotation from scanning. \n(Use the Fix Perspective function for this). \nCut off the thin green margin ACCURATELY. \nSave (replace) the color chart file. 0844 打开并编辑已扫描的色卡文件。 \n消除扫描产生的倾斜或旋转。 \n(可使用“修正透视”功能)。 \n精确裁去薄薄的绿色边缘。 \n保存(替换)色卡文件。 0845 Open the trimmed color chart file 0845 打开裁剪后的色卡文件 0846 Optimize 0846 优化 0847 Other Tag ... 0847 其他标签…… 0848 Outboard Programs 0848 外部程序 0849 Outline Drawing 0849 轮廓画 0850 Outlines 0850 轮廓 0851 Output Color 0851 输出颜色 0852 Overlap 0852 重叠 0853 Overlay position in host image: 0853 叠加图像在主图像中的位置: 0854 Overlay width, % host image width: 0854 叠加宽度,占主图像宽度的百分比: 0855 Overwrite file? \n%s 0855 是否覆盖文件? \n%s 0856 PAINT EDITS 0856 绘制编辑 0857 PAINT IMAGE 0857 绘制图像 0858 PAINT TRANSPARENCY 0858 绘制透明度 0859 PAINTING 0859 绘画 0860 PANORAMA 0860 全景图 0861 PATTERN 0861 图案 0862 PERSPECTIVE 0862 透视 0863 PLACES/DATES 0863 位置/日期 0864 PLUGINS 0864 插件 0865 PREV/NEXT 0865 上一个/下一个 0866 PRINT CALIBRATED 0866 校准打印 0867 PRINT IMAGE 0867 打印图像 0868 PRIVACY 0868 隐私 0869 PROBLEM FILES 0869 问题文件 0870 PROBLEM REPORTING 0870 问题报告 0871 Paint Edits 0871 绘制编辑 0872 Paint Edits already active 0872 绘制编辑已处于激活状态 0873 Paint Image 0873 绘制图像 0874 Paint Image Transparencies 0874 绘制图像透明度 0875 Paint Radius 0875 绘制半径 0876 Paint Transparency 0876 绘制透明度 0877 Paint and Warp Image 0877 绘制并扭曲图像 0878 Paint current edit function gradually using the mouse 0878 使用鼠标逐渐应用当前编辑功能 0879 Paint entire image 0879 绘制整个图像 0880 Paint image transparency using the mouse 0880 使用鼠标绘制图像透明度 0881 Paint on Image 0881 在图像上绘制 0882 Paint on image using the mouse 0882 使用鼠标在图像上绘制 0883 Paint transparency 0883 绘制透明度 0884 Paint within mouse 0884 在鼠标范围内绘制 0885 Painting 0885 绘画 0886 Panorama 0886 全景图 0887 Paste 0887 粘贴 0888 Paste Image 0888 粘贴图像 0889 Paste previously copied area into image 0889 将之前复制的区域粘贴到图像中 0890 Pattern 0890 图案 0891 Pattern File: 0891 图案文件: 0892 Pattern Width 0892 图案宽度 0893 Percent 0893 百分比 0894 Permissions 0894 权限 0895 Perspective 0895 透视 0896 Photo Date 0896 拍摄日期 0897 Photo Date/Time 0897 拍摄日期/时间 0898 Photo Date/Time (metadata) 0898 拍摄日期/时间(metadata) 0899 Photo Date: %s File Date: %s \n 0899 拍摄日期:%s 文件日期:%s \n 0900 Pixel count 0900 像素数 0901 Pixel difference 0901 像素差异 0902 Pixels 0902 像素 0903 Places/Dates 0903 位置/日期 0904 Plugin working ... 0904 插件运行中…… 0905 Popup Image 0905 弹出图像 0906 Power 0906 强度 0907 Power Center 0907 中心强度 0908 Power: Center 0908 强度:中心 0909 Pre-align Images 0909 预对齐图像 0910 Preference: 0910 首选项: 0911 Press F1 for help 0911 按 F1 获取帮助 0912 Prev 0912 上一个 0913 Prev/Next 0913 上一个/下一个 0914 Previous 0914 上一个 0915 Previous gallery 0915 上一个图库 0916 Print Calibrated 0916 校准打印 0917 Print Image 0917 打印图像 0918 Print chart in vertical orientation without margins. 0918 以纵向打印色卡,不留边距。 0919 Print current image file with calibrated colors 0919 使用校准颜色打印当前图像文件 0920 Print the current image file 0920 打印当前图像文件 0921 Privacy 0921 隐私 0922 Proceed 0922 继续 0923 Proceed? 0923 是否继续? 0924 Process album files matching selected files: 0924 处理与所选文件匹配的相册文件: 0925 Process an image using a custom convolution kernel 0925 使用自定义卷积核处理图像 0926 Process selected album files: 0926 处理所选相册文件: 0927 Processing files 0927 正在处理文件 0928 Project name 0928 项目名称 0929 Pull an image position using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0929 使用鼠标拖动图像位置。 \n可多次拖动直到满意。 \n完成后按[OK]。 0930 Pull on an image corner using the mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, press [OK]. 0930 使用鼠标拖动图像角落。 \n可多次拖动直到满意。 \n完成后按[OK]。 0931 Pull on the image with the mouse. 0931 用鼠标拖动图像。 0932 Purge unwanted keywords from all image files 0932 清除所有图像文件中不需要的keywords 0933 QUESTIONS, SUGGESTIONS 0933 问题与建议 0934 Quit 0934 退出 0935 Quit Fotocx 0935 退出 Fotocx 0936 Quit Fotocx? 0936 是否退出 Fotocx? 0937 RAW Files 0937 RAW 文件 0938 RAW Options 0938 RAW 选项 0939 RAW conversion failed: %s %s 0939 RAW 转换失败:%s %s 0940 RAW loader 0940 RAW 加载器 0941 RECENT FILES 0941 最近文件 0942 RECENT FOLDERS 0942 最近文件夹 0943 RED EYES 0943 红眼 0944 REFINE MENU 0944 优化菜单 0945 REMOVE DUST 0945 移除灰尘 0946 REMOVE HALO 0946 移除光晕 0947 RENAME 0947 重命名 0948 RENAME ALBUM 0948 重命名相册 0949 REPAIR MENU 0949 修复菜单 0950 RESCALE 0950 缩放 0951 RETOUCH 0951 修饰 0952 RGB -> BRG 0952 RGB -> BRG 0953 RGB -> GBR 0953 RGB -> GBR 0954 RGB HISTOGRAM 0954 RGB 直方图 0955 RGB Histogram 0955 RGB 直方图 0956 RGB brightness histogram graph 0956 RGB 亮度直方图图表 0957 RGB color 0957 RGB 颜色 0958 RGB mix with given bit-depth 0958 具有指定位深度的 RGB 混合 0959 ROTATE 0959 旋转 0960 RUN SCRIPT 0960 运行脚本 0961 Radial Blur 0961 径向模糊 0962 Radial Blur - mix pixels in radial lines from chosen center 0962 径向模糊 - 从所选中心沿径向线混合像素 0963 Radius 0963 半径 0964 Random Image 0964 随机图像 0965 Range 0965 范围 0966 Rating: 0966 评分: 0967 Rating: %s Size: %s %.2fmb \n 0967 评分:%s 大小:%s %.2fmb \n 0968 Read or search the user guide 0968 阅读或搜索用户指南 0969 Recent Files 0969 最近文件 0970 Recent Folders 0970 最近文件夹 0971 Recent Keywords 0971 最近keywords 0972 Rectify closeup face photo (balloon face) 0972 校正近距离人脸照片(球面畸变脸) 0973 Red 0973 红色 0974 Red Eye Reduction 0974 红眼消除 0975 Red Eyes 0975 红眼 0976 Red Factors 0976 红色系数 0977 Redo 0977 重做 0978 Reduce Fog/Haze 0978 减少雾/霾 0979 Reduce fog/haze in an image or selected areas 0979 减少图像或选定区域中的雾/霾 0980 Refine 0980 优化 0981 Refine: flatten histogram, local contrast, amplify contrast, retinex, saturation 0981 优化:展平直方图、局部对比度、增强对比度、retinex、饱和度 0982 Remove 0982 移除 0983 Remove Dust 0983 移除灰尘 0984 Remove Halo 0984 移除光晕 0985 Remove dust spots from old scanned photos 0985 移除灰尘,清理老旧扫描照片 0986 Remove from Album 0986 从相册中移除 0987 Remove halos left by some edit functions 0987 移除某些编辑功能留下的光晕 0988 Remove image curvature, especially in panoramas 0988 消除图像弯曲,尤其是全景图像 0989 Remove jaggies on hard image feature edges 0989 消除硬性图像特征边缘上的锯齿 0990 Remove selected image metadata 0990 移除选定图像的 metadata 0991 Remove unwanted objects in an image 0991 移除图像中不需要的对象 0992 Rename 0992 重命名 0993 Rename Album 0993 重命名相册 0994 Rename Image File 0994 重命名图像文件 0995 Rename an existing album 0995 重命名现有相册 0996 Rename or delete keywords for all image files 0996 重命名或删除所有图像文件的keywords 0997 Rename to 0997 重命名为 0998 Rename/convert/rescale/move selected image or RAW files 0998 重命名/转换/缩放/移动选定的图像或 RAW 文件 0999 Repair 0999 修复 1000 Repair malformed metadata preventing metadata edits 1000 修复妨碍 metadata 编辑的损坏 metadata 1001 Repair: sharpen, blur, denoise, defog, red eyes, smart erase, adjust color 1001 修复:锐化、模糊、降噪、去雾、红眼、智能擦除、调整颜色 1002 Replace 1002 替换 1003 Replace Text 1003 替换文本 1004 Replace all versions with newest version 1004 用最新版本替换所有版本 1005 Replace all versions with selected versions 1005 用选定版本替换所有版本 1006 Replace all with newest version only 1006 仅用最新版本替换全部 1007 Replace all with original + newest version 1007 用原始版本+最新版本替换全部 1008 Replace all with original + selected versions 1008 用原始版本+选定版本替换全部 1009 Replace all with original and all versions 1009 用原始版本及所有版本替换全部 1010 Replace all with selected versions 1010 用选定版本替换全部 1011 Replace host files 1011 替换主文件 1012 Report Image Places/Dates 1012 报告图像地点/日期 1013 Report selected metadata for selected image files 1013 报告选定图像文件的选定 metadata 1014 Required programs are installed. \n 1014 所需程序已安装。 \n 1015 Rescale 1015 缩放 1016 Rescale Image 1016 缩放图像 1017 Rescale RGB levels to reduce color caste and fog/haze 1017 缩放 RGB 级别以减少色偏和雾/霾 1018 Rescale brightness levels to increase local contrast 1018 缩放亮度级别以增强局部对比度 1019 Rescale: 1019 缩放: 1020 Reserved Shortcuts \n 1020 保留的快捷键 \n 1021 Reserved shortcut ignored: %s 1021 忽略保留的快捷键:%s 1022 Reset 1022 重置 1023 Reset all galleries to file name ascending 1023 将所有图库重置为按文件名升序排列 1024 Resolution 1024 分辨率 1025 Resources 1025 资源 1026 Resume 1026 恢复 1027 Retouch 1027 修饰 1028 Reverse R 1028 反转 R 1029 Richardson-Lucy 1029 Richardson-Lucy 1030 Right 1030 右 1031 Rim % 1031 边缘 % 1032 Rotate 1032 旋转 1033 Rotate Image 1033 旋转图像 1034 Rotate or level an image 1034 旋转或校平图像 1035 Rotate: 1035 旋转: 1036 Roy Lichtenstein effect 1036 罗伊·利希滕斯坦效果 1037 SATURATION 1037 饱和度 1038 SCRIPT FILES 1038 脚本文件 1039 SEARCH IMAGES 1039 搜索图像 1040 SELECT AREA 1040 选择区域 1041 SELECT FILES 1041 选择文件 1042 SELECT IMAGE FILES 1042 选择图像文件 1043 SELECT MENU 1043 选择菜单 1044 SET COLORS 1044 设置颜色 1045 SET WALLPAPER 1045 设置壁纸 1046 SETTINGS 1046 设置 1047 SHARPEN 1047 锐化 1048 SHIFT COLORS 1048 移色 1049 SHORTCUTS 1049 快捷键 1050 SHOW CIM FILES 1050 显示 CIM 文件 1051 SHOW DIFFS 1051 显示差异 1052 SHOW ON MAP 1052 在地图上显示 1053 SHOW RESOURCES 1053 显示资源 1054 SHOW RGB 1054 显示 RGB 1055 SHOW/HIDE AREA 1055 显示/隐藏区域 1056 SKETCH1 1056 素描1 1057 SKETCH2 1057 素描2 1058 SLIDE SHOW 1058 幻灯片放映 1059 SLIDES AND NEGATIVES 1059 幻灯片与底片 1060 SLIDESHOW END 1060 幻灯片放映结束 1061 SMART ERASE 1061 智能擦除 1062 SOFT FOCUS 1062 柔焦 1063 SPHERE 1063 球体 1064 SPLIT-SCREEN 1064 分屏 1065 STACK/LAYERS 1065 堆叠/图层 1066 STACK/NOISE 1066 堆叠/噪点 1067 STACK/PAINT 1067 堆叠/绘画 1068 Saturation 1068 饱和度 1069 Save 1069 保存 1070 Save Gallery as Album 1070 将图库另存为相册 1071 Save Image File 1071 保存图像文件 1072 Save as new file name or type 1072 另存为新文件名或类型 1073 Save current gallery as album 1073 将当前图库保存为相册 1074 Save modified image as new file or new file version 1074 将修改后的图像保存为新文件或新文件版本 1075 Save selected area to a file with transparency 1075 将选定区域保存为带透明度的文件 1076 Saved Areas 1076 已保存的区域 1077 Scale 1077 缩放比例 1078 Scan the printed color chart, darkest row on top. \nSave as .png file using printer and paper names \n(e.g. %s/Epson_glossy.png). \n 1078 扫描打印出的色卡,最暗一行在上方。 \n使用打印机和纸张名称保存为 .png 文件 \n(例如 %s/Epson_glossy.png)。 \n 1079 Search 1079 搜索 1080 Search Images 1080 搜索图像 1081 Search Results 1081 搜索结果 1082 Search all image files and report duplicates 1082 搜索所有图像文件并报告重复项 1083 Searching - use ESC key to terminate 1083 搜索中 - 按 ESC 键终止 1084 Seconds 1084 秒 1085 Select 1085 选择 1086 Select %d to %d files 1086 选择 %d 到 %d 个文件 1087 Select Album 1087 选择相册 1088 Select Albums 1088 选择相册 1089 Select Area 1089 选择区域 1090 Select Area for Edits 1090 选择编辑区域 1091 Select Area not supported \nby this edit function 1091 该编辑功能不支持选择区域 1092 Select Files 1092 选择文件 1093 Select Image 1093 选择图像 1094 Select Image Files 1094 选择图像文件 1095 Select Metadata tags 1095 选择 metadata 标签 1096 Select Script 1096 选择脚本 1097 Select an area to warp using select area function. \nPress [start warp] and pull area with mouse. \nMake multiple mouse pulls until satisfied. \nWhen finished, select another area or press [OK]. 1097 使用选择区域功能选择要扭曲的区域。 \n按[开始扭曲]并用鼠标拖动区域。 \n可多次用鼠标拖动直至满意。 \n完成后,选择其他区域或按[OK]。 1098 Select and Paint Image 1098 选择并绘制图像 1099 Select and view an image file 1099 选择并查看图像文件 1100 Select area cannot be kept.\nContinue? 1100 无法保留选定区域。\n是否继续? 1101 Select area disabled, Continue? 1101 选择区域已禁用,是否继续? 1102 Select area not finished, Continue? 1102 选择区域尚未完成,是否继续? 1103 Select area will be ignored. \nContinue? 1103 选定区域将被忽略。 \n是否继续? 1104 Select folder 1104 选择文件夹 1105 Select host image files 1105 选择主图像文件 1106 Select image areas to edit separately, copy/paste selections 1106 选择要分别编辑的图像区域,复制/粘贴选区 1107 Select image objects or areas for separate editing 1107 选择图像对象或区域以便分别编辑 1108 Select input files for subsequent function 1108 为后续功能选择输入文件 1109 Select overlay file 1109 选择叠加文件 1110 Select startup album 1110 选择启动相册 1111 Select startup folder 1111 选择启动文件夹 1112 Select startup image file 1112 选择启动图像文件 1113 Select the image file to print. 1113 选择要打印的图像文件。 1114 Select to add, click on X to delete. 1114 点击选择添加,点击 X 删除。 1115 Select two files 1115 选择两个文件 1116 Select versions, ratings, keywords, filename text 1116 选择版本、评分、keywords、文件名文本 1117 Separation Horz 1117 水平间距 1118 Sequence Numbers 1118 序列号 1119 Set Colors 1119 设置颜色 1120 Set No. of Colors 1120 设置颜色数量 1121 Set Ratio: 1121 设置比例: 1122 Set Wallpaper 1122 设置壁纸 1123 Set Width: 1123 设置宽度: 1124 Set and view bookmarks, select for gallery view 1124 设置并查看书签,选择以在图库中查看 1125 Set black-white/color, negative/positive, sepia 1125 设置黑白/彩色、负片/正片、褐色 1126 Set foreground line color (crop, grid, select, warp) 1126 设置前景线条颜色(裁剪、网格、选择、扭曲) 1127 Set gallery from latest search results 1127 从最新搜索结果设置图库 1128 Set gallery from recent folders list 1128 从最近文件夹列表设置图库 1129 Set gallery to folder of current file 1129 将图库设置为当前文件所在文件夹 1130 Set horizontal/vertical grid line counts 1130 设置水平/垂直网格线数量 1131 Set image file as desktop wallpaper 1131 将图像文件设置为桌面壁纸 1132 Set line properties, [Add] to layout, edit. 1132 设置线条属性,[添加]到版面,编辑。 1133 Set number of colors for each R/G/B or total 1133 为每个 R/G/B 或总计设置颜色数量 1134 Set or shift photo date/time for selected image files 1134 为选定图像文件设置或调整拍摄日期/时间 1135 Set the name for the output calibration file \n[your calibration name].dat 1135 设置输出校准文件的名称 \n[您的校准名称].dat 1136 Settings 1136 设置 1137 Sharpen 1137 锐化 1138 Sharpen the image (various methods) 1138 对图像进行锐化处理(多种方法) 1139 Shift + drag mouse across image \nto indicate blur direction 1139 按住 Shift 并在图像上拖动鼠标 \n以指示模糊方向 1140 Shift Colors 1140 移色 1141 Shift/convert image colors into other colors 1141 将图像颜色转换/移位为其他颜色 1142 Short List 1142 简要列表 1143 Show 1143 显示 1144 Show (outline) selected areas 1144 显示(轮廓)选定区域 1145 Show CIM Files 1145 显示 CIM 文件 1146 Show Diffs 1146 显示差异 1147 Show Fotocx installed version and author contact 1147 显示已安装的 Fotocx 版本及作者联系方式 1148 Show Fotocx updates for recent releases 1148 显示最近版本的 Fotocx 更新内容 1149 Show Hidden 1149 显示隐藏项 1150 Show Log File 1150 显示日志文件 1151 Show RGB 1151 显示 RGB 1152 Show RGB levels at mouse position 1152 显示鼠标位置处的 RGB 级别 1153 Show Resources 1153 显示资源 1154 Show folder hierarchy, click folder for gallery view 1154 显示文件夹层级,点击文件夹以图库形式查看 1155 Show image counts in year/month table, select, report 1155 按年/月表格显示图像数量,可选择并报告 1156 Show image description (overlap) 1156 显示图像描述(叠加显示) 1157 Show image differences on the image 1157 在图像上显示图像差异 1158 Show image file name (overlap) 1158 显示图像文件名(叠加显示) 1159 Show image title (overlap) 1159 显示图像标题(叠加显示) 1160 Show input files used in combine function 1160 显示合成功能中使用的输入文件 1161 Show key metadata for current image or clicked thumbnail 1161 显示当前图像或所点击缩略图的关键 metadata 1162 Show map position of the current image file 1162 显示当前图像文件的地图位置 1163 Show memory and CPU resources used 1163 显示已使用的内存和 CPU 资源 1164 Show on Map 1164 在地图上显示 1165 Show or make Keyboard Shortcuts 1165 显示或制作键盘快捷键 1166 Show the current (last used) album 1166 显示当前(最近使用的)相册 1167 Show the current log file 1167 显示当前日志文件 1168 Size 1168 大小 1169 Sketch1 1169 素描1 1170 Sketch2 1170 素描2 1171 Slide Show 1171 幻灯片放映 1172 Smart Erase 1172 智能擦除 1173 Soft Focus 1173 柔焦 1174 Sphere 1174 球体 1175 Spherical Projection 1175 球形投影 1176 Split-Screen 1176 分屏 1177 Stack/Layers 1177 堆叠/图层 1178 Stack/Noise 1178 堆叠/噪点 1179 Stack/Paint 1179 堆叠/绘画 1180 Stacking Order 1180 堆叠顺序 1181 Start 1181 开始 1182 Start a slide show 1182 开始幻灯片放映 1183 Start of gallery 1183 图库开头 1184 Startup View 1184 启动视图 1185 Stop 1185 停止 1186 Stretch 1186 拉伸 1187 Stretch: 1187 拉伸: 1188 Suppress JPEG compression artifacts 1188 消除 JPEG 压缩伪影 1189 Suppress Ringing 1189 抑制振铃效应 1190 Suppress fine details while retaining sharpness 1190 在保持锐度的同时抑制细节 1191 Suppress noise from low-light photos 1191 抑制低光照片的噪点 1192 Survey all files 1192 检查所有文件 1193 TEXTURE 1193 纹理 1194 THUMB VIEW 1194 缩略图视图 1195 TILES1 1195 瓷砖1 1196 TILES2 1196 瓷砖2 1197 TIMELINE 1197 时间线 1198 TINY PLANET 1198 微缩星球 1199 TOOLS MENU 1199 工具菜单 1200 TRANSLATIONS 1200 翻译 1201 TWIST 1201 扭曲 1202 Temperature 1202 色温 1203 Text 1203 文本 1204 Text File: 1204 文本文件: 1205 Texture 1205 纹理 1206 Threshold 1206 阈值 1207 Threshold: Low 1207 阈值:低 1208 Thumbnail View 1208 缩略图视图 1209 Thumbnail size 1209 缩略图大小 1210 Thumbnails folder 1210 缩略图文件夹 1211 Thumbnails folder: %s \nPlease remove. 1211 缩略图文件夹:%s \n请移除。 1212 Thumbnails folder: \n %s \nmust be named .../thumbnails 1212 缩略图文件夹: \n %s \n必须命名为 .../thumbnails 1213 Thumbnails: 1213 缩略图: 1214 Tile 1214 瓷砖 1215 Tile blending 1215 瓷砖混合 1216 Tile image with a repeating pattern 1216 用重复图案铺满图像 1217 Tiles 1217 瓷砖 1218 Tiles1 1218 瓷砖1 1219 Tiles2 1219 瓷砖2 1220 Timeline 1220 时间线 1221 Tiny Planet 1221 微缩星球 1222 Title 1222 标题 1223 Title: %s\n 1223 标题:%s\n 1224 To Location 1224 到位置 1225 Toggle Captions 1225 切换说明文字 1226 Toggle Grid 1226 切换网格 1227 Toggle grid lines on and off 1227 打开/关闭网格线 1228 Toggle image metadata display ON/OFF 1228 切换图像 metadata 显示的开/关 1229 Too little overlap, cannot align 1229 重叠区域太小,无法对齐 1230 Too many edits, please save image 1230 编辑次数过多,请保存图像 1231 Tools 1231 工具 1232 Tools: image index, settings, shortcuts, grid, find duplicates 1232 工具:图像索引、设置、快捷键、网格、查找重复项 1233 Top 1233 顶部 1234 Total Colors 1234 总颜色数 1235 Trace 1235 描摹 1236 Trace upper and lower curves with \nmouse clicks, then [flatten]. 1236 用鼠标点击描摹上下曲线, \n然后按[展平]。 1237 Transient Objects 1237 瞬态对象 1238 Transition Preferences 1238 过渡首选项 1239 Transition to next image 1239 过渡到下一张图像 1240 Transitions File 1240 过渡文件 1241 Transp. 1241 透明度. 1242 Transparency map will be lost \n(save as TIFF|PNG|JXL to retain) \nSave anyway? 1242 透明度贴图将丢失 \n(另存为 TIFF|PNG|JXL 以保留) \n是否仍要保存? 1243 Trash 1243 回收站 1244 Trash read-only file? 1244 是否回收只读文件? 1245 Turn an image inside-out 1245 将图像内外翻转 1246 Twist 1246 扭曲 1247 Twist image centered at mouse position 1247 以鼠标位置为中心扭曲图像 1248 UNBEND 1248 展平弯曲 1249 UNDO/REDO BUTTON 1249 撤销/重做按钮 1250 UNWARP CLOSEUP 1250 展开特写 1251 UPDATE ALBUMS 1251 更新相册 1252 UPRIGHT 1252 校正 1253 USER GUIDE 1253 用户指南 1254 Unable to copy metadata 1254 无法复制 metadata 1255 Unbend 1255 展平弯曲 1256 Undo 1256 撤销 1257 Undo All 1257 撤销全部 1258 Undo Last 1258 撤销上一步 1259 Undo/Redo 1259 撤销/重做 1260 Uninstall 1260 卸载 1261 Unwarp Closeup 1261 展开特写 1262 Update Albums 1262 更新相册 1263 Update albums for new file versions 1263 为新文件版本更新相册 1264 Upright 1264 校正 1265 Upright Image 1265 校正图像 1266 Upright or mirror-flip an image 1266 校正或镜像翻转图像 1267 Upright rotated image files, selected set or ALL 1267 校正旋转的图像文件,可选定集合或全部 1268 Use Select Area to select a face. \nClick on the center of distortion. \nMove the slider. \n 1268 使用“选择区域”选择一张人脸。 \n点击畸变中心。 \n移动滑块。 \n 1269 Use [Select] to add files to an empty album 1269 使用[选择]将文件添加到空相册 1270 Use metadata photo date or file modification date? 1270 使用 metadata 拍摄日期还是文件修改日期? 1271 Use metadata tag 1271 使用 metadata 标签 1272 Use settings file 1272 使用设置文件 1273 User Guide 1273 用户指南 1274 User preferences and settings 1274 用户首选项和设置 1275 VIDEO press P to play 1275 视频 按 P 播放 1276 VIEW 360° PANO 1276 查看 360° 全景 1277 VIEW ALL META 1277 查看所有 metadata 1278 VIEW MAIN META 1278 查看主 metadata 1279 VIGNETTE 1279 晕影 1280 Var. Transparency 1280 可变透明度 1281 Vert 1281 垂直 1282 Video Files 1282 视频文件 1283 Video Tutorial 1283 视频教程 1284 Video command 1284 视频命令 1285 View 360 degree panorama image 1285 查看 360 度全景图像 1286 View 360° Pano 1286 查看 360° 全景 1287 View All Meta 1287 查看所有 metadata 1288 View All Metadata 1288 查看所有 metadata 1289 View Main Meta 1289 查看主 metadata 1290 View Main Metadata 1290 查看主 metadata 1291 View before/after images using split-screen 1291 使用分屏查看前后对比图像 1292 View/edit metadata, image report and search functions 1292 查看/编辑 metadata、图像报告及搜索功能 1293 Vignette 1293 晕影 1294 W/H Ratio: 1294 宽/高比例: 1295 WARP AFFINE 1295 仿射扭曲 1296 WARP AREA 1296 区域扭曲 1297 WARP CURVED 1297 弯曲扭曲 1298 WARP IMAGE 1298 图像扭曲 1299 WARP MENU 1299 扭曲菜单 1300 WARP RADIAL 1300 径向扭曲 1301 WINDOW VIEWS AND MENUS 1301 窗口视图与菜单 1302 WORLD MAP 1302 世界地图 1303 Wait after zoom 1303 zoom 后等待 1304 Wait before filename/title/description 1304 文件名/标题/描述前等待 1305 Wait before zoom 1305 zoom 前等待 1306 Warp 1306 扭曲 1307 Warp Affine 1307 仿射扭曲 1308 Warp Area 1308 区域扭曲 1309 Warp Curved 1309 弯曲扭曲 1310 Warp Image 1310 图像扭曲 1311 Warp Linear1 1311 线性扭曲1 1312 Warp Linear2 1312 线性扭曲2 1313 Warp Radial 1313 径向扭曲 1314 Warp an image with a wave pattern 1314 用波浪图案扭曲图像 1315 Warp image (affine) using the mouse 1315 使用鼠标扭曲图像(仿射) 1316 Warp image (curved) using the mouse 1316 使用鼠标扭曲图像(弯曲) 1317 Warp image (linear 1) using the mouse 1317 使用鼠标扭曲图像(线性1) 1318 Warp image (linear 2) using the mouse 1318 使用鼠标扭曲图像(线性2) 1319 Warp: unbend, fix perspective, warp, unwarp closeup, flatten, image transforms 1319 扭曲:展平弯曲、修正透视、扭曲、展开特写、展平、图像变换 1320 White 1320 白色 1321 Widen: 1321 加宽: 1322 Width 1322 宽度 1323 Width % 1323 宽度 % 1324 X-size 1324 X 尺寸 1325 Yes 1325 是 1326 ZOOM 1326 ZOOM 1327 Zoom 1327 Zoom 1328 Zoom Center 1328 Zoom 中心 1329 Zoom Speed 1329 Zoom 速度 1330 Zoom-in 1330 Zoom 放大 1331 Zoom-out 1331 Zoom 缩小 1332 \n %d-bits/color 1332 \n %d 位/颜色 1333 \n *** CANCELED \n 1333 \n *** 已取消 \n 1334 \n *** COMPLETED \n 1334 \n *** 已完成 \n 1335 \n *** Delete Originals *** 1335 \n *** 删除原始文件 *** 1336 \n *** Keep Originals *** 1336 \n *** 保留原始文件 *** 1337 \n *** Replace Originals *** 1337 \n *** 替换原始文件 *** 1338 \n Convert to %s 1338 \n 转换为 %s 1339 \n Copy Metadata 1339 \n 复制 metadata 1340 \n Downsize within %dx%d 1340 \n 缩小到 %dx%d 以内 1341 \n New Location: %s 1341 \n 新位置:%s 1342 \n Output to %s 1342 \n 输出到 %s 1343 \n PROCEED? 1343 \n 是否继续? 1344 \n Rename to %s 1344 \n 重命名为 %s 1345 \n Replace text: %s --> %s 1345 \n 替换文本:%s --> %s 1346 \n Rescale to %sx 1346 \n 缩放到 %sx 1347 \n Update Albums 1347 \n 更新相册 1348 \n Upsize within %dx%d 1348 \n 放大到 %dx%d 以内 1349 \n*** CANCELED \n 1349 \n*** 已取消 \n 1350 \n*** COMPLETED \n 1350 \n*** 已完成 \n 1351 \n\nPROCEED? 1351 \n\n是否继续? 1352 add 1352 添加 1353 add after old 1353 添加到旧的之后 1354 add all gallery files to list 1354 将所有图库文件添加到列表 1355 add current file to list 1355 将当前文件添加到列表 1356 add entered text to layout 1356 将输入的文本添加到版面 1357 add images to layout 1357 将图像添加到版面 1358 add line/arrow to layout 1358 将线条/箭头添加到版面 1359 add new keyword 1359 添加新keyword 1360 add or edit images 1360 添加或编辑图像 1361 add or edit lines/arrows 1361 添加或编辑线条/箭头 1362 add or edit text 1362 添加或编辑文本 1363 add to set 1363 添加到集合 1364 adder 1364 adder 1365 adjust brightness of selected image 1365 调整选定图像的亮度 1366 after removal of missing files: %d \n 1366 移除缺失文件后:%d \n 1367 album %s: deleted 1367 相册 %s:已删除 1368 album already exists: %s 1368 相册已存在:%s 1369 album mass update 1369 相册批量更新 1370 albums folder missing 1370 相册文件夹缺失 1371 align and trim color chart 1371 对齐并裁剪色卡 1372 all files 1372 所有文件 1373 all image files, including unmounted folders: %d \n 1373 所有图像文件,包括未挂载的文件夹:%d \n 1374 all images 1374 所有图像 1375 all versions 1375 所有版本 1376 amplify contrast 1376 增强对比度 1377 amplitude 1377 振幅 1378 angle 1378 角度 1379 apply 1379 应用 1380 area edge creep 1380 区域边缘蔓延 1381 area is not finished 1381 区域未完成 1382 area outline color: 1382 区域轮廓颜色: 1383 array width is too large: %d x %d 1383 阵列宽度过大:%d x %d 1384 ascending 1384 升序 1385 auto color 1385 自动颜色 1386 background colors for file and gallery view windows 1386 文件和图库视图窗口的背景颜色 1387 backing 1387 衬底 1388 bad category name 1388 类别名称无效 1389 bad keyword name 1389 keyword 名称无效 1390 bad pattern file: %s 1390 图案文件无效:%s 1391 base 1391 base 1392 base and adder need $s plugin 1392 base 和 adder 需要 $s 插件 1393 base size 1393 基础大小 1394 begin making a script file 1394 开始创建脚本文件 1395 black/white 1395 黑白 1396 black/white negative 1396 黑白负片 1397 black/white positive 1397 黑白正片 1398 blend 1398 混合 1399 blend edges: blend width: 1399 混合边缘:混合宽度: 1400 blend image overlaps over pixel width 1400 按像素宽度混合图像重叠部分 1401 blend rate: center: 1401 混合比例:中心: 1402 blocking function: %s 1402 阻塞功能:%s 1403 blocksize 1403 块大小 1404 blur edges: blur width: 1404 模糊边缘:模糊宽度: 1405 blur radius 1405 模糊半径 1406 borders 1406 边框 1407 both 'All Files' and specific files were selected 1407 同时选择了“所有文件”和特定文件 1408 bright halo 1408 亮光晕 1409 brightness rescale 1409 亮度缩放 1410 browse 1410 浏览 1411 brush size 1411 画笔大小 1412 build index, old files only 1412 建立索引,仅限旧文件 1413 cancel project 1413 取消项目 1414 cancel project? 1414 是否取消项目? 1415 cannot allocate %d MB memory 1415 无法分配 %d MB 内存 1416 cannot be determined 1416 无法确定 1417 cannot copy a file to itself 1417 无法将文件复制到自身 1418 cannot copy current file 1418 无法复制当前文件 1419 cannot create output file 1419 无法创建输出文件 1420 cannot create pixbuf 1420 无法创建 pixbuf 1421 cannot find area outline 1421 找不到区域轮廓 1422 cannot find output file 1422 找不到输出文件 1423 cannot load input file 1423 无法加载输入文件 1424 cannot open file %s 1424 无法打开文件 %s 1425 cannot parse current file 1425 无法解析当前文件 1426 cannot parse file 1426 无法解析文件 1427 cannot read pluging output file 1427 无法读取插件输出文件 1428 cannot replace %s file 1428 无法替换 %s 文件 1429 cannot save as RAW type 1429 无法保存为 RAW 类型 1430 cannot save layout file: %s 1430 无法保存版面文件:%s 1431 cannot write image folders file: %s 1431 无法写入图像文件夹文件:%s 1432 category %s has too many keywords 1432 类别 %s 的keywords 过多 1433 category %s is too big 1433 类别 %s 过大 1434 center 1434 中心 1435 change project scale 1435 更改项目比例 1436 choose 1-8 clicks or [+] keys for 2x image zoom 1436 选择 1-8 次点击或 [+] 键进行 2 倍图像放大 1437 choose a better spot 1437 请选择更合适的位置 1438 choose an image file 1438 选择图像文件 1439 choose file 1439 选择文件 1440 choose files 1440 选择文件 1441 choose folder 1441 选择文件夹 1442 choose folders 1442 选择文件夹 1443 choose location 1443 选择位置 1444 circle 1444 圆形 1445 clear area selections 1445 清除区域选择 1446 clear entered text 1446 清除输入的文本 1447 clear inputs 1447 清除输入内容 1448 clear text 1448 清除文本 1449 click a defined keyword (below) to add a search keyword 1449 点击下方已定义的keyword以添加搜索keyword 1450 click bright point 1450 点击亮点 1451 click dark point 1451 点击暗点 1452 click on desired color 1452 点击所需颜色 1453 click on image to get source color 1453 点击图像以获取源颜色 1454 click on image to set matching color 1454 点击图像以设置匹配颜色 1455 click on thumbnail to set zoom center 1455 点击缩略图以设置 zoom 中心 1456 click position to add line 1456 点击位置以添加线条 1457 click position to add text 1457 点击位置以添加文本 1458 click to select 1458 点击以选择 1459 click to unselect 1459 点击以取消选择 1460 clicks per 2x image increase 1460 每次点击 2 倍图像放大 1461 color 1461 颜色 1462 color depth 1462 颜色深度 1463 color depth: 1463 颜色深度: 1464 color match level % 1464 颜色匹配级别 % 1465 color negative 1465 彩色负片 1466 column difference: %d pixels 1466 列差:%d 像素 1467 column difference: %d pixels \nMake columns even? 1467 列差:%d 像素 \n是否使列数相同? 1468 combined image files 1468 已合成的图像文件 1469 command: 1469 命令: 1470 commit all changes, close dialog 1470 提交所有更改,关闭对话框 1471 complete file selection first 1471 请先完成文件选择 1472 completed 1472 已完成 1473 condense into color blobs 1473 压缩为色块 1474 condition 1474 条件 1475 confirm Fotocx exit 1475 确认退出 Fotocx 1476 constant blur 1476 恒定模糊 1477 continue? 1477 是否继续? 1478 converting colors... 1478 正在转换颜色…… 1479 converting files 1479 正在转换文件 1480 copy (duplicate file) 1480 复制(生成副本文件) 1481 copy and paste commands 1481 复制与粘贴命令 1482 copy files to %s 1482 将文件复制到 %s 1483 copy metadata from Nth file: 1483 从第 N 个文件复制 metadata: 1484 copy to Desktop failed: %s 1484 复制到桌面失败:%s 1485 count: 0 1485 计数:0 1486 create folder 1486 创建文件夹 1487 create folder %s 1487 创建文件夹 %s 1488 current gallery 1488 当前图库 1489 current image files found: %d \n 1489 找到的当前图像文件:%d \n 1490 current set only 1490 仅当前集合 1491 current set: 1491 当前集合: 1492 curve file is invalid 1492 曲线文件无效 1493 custom command to play video files 1493 播放视频文件的自定义命令 1494 dark 1494 暗 1495 dark halo 1495 暗光晕 1496 dark pixels 1496 暗像素 1497 data is incomplete, proceed? 1497 数据不完整,是否继续? 1498 date format is yyyy:mm:dd [hh:mm:ss] 1498 日期格式为 yyyy:mm:dd [hh:mm:ss] 1499 date range 1499 日期范围 1500 days 1500 天 1501 delete 1501 删除 1502 delete %s \n%s 1502 删除 %s \n%s 1503 delete Mashup project files? 1503 是否删除 Mashup 项目文件? 1504 delete failed: \n%s 1504 删除失败: \n%s 1505 delete originals specified but no new name given 1505 指定了删除原始文件但未提供新名称 1506 delete selected text from layout 1506 从版面中删除选定文本 1507 deleting orphan thumbnails ... \n 1507 正在删除孤立缩略图 ... \n 1508 depth 1508 深度 1509 descending 1509 降序 1510 direction of light and shadows 1510 光线与阴影方向 1511 disable thumbnail selection to enable popup menus etc. \nuse [Enable] to resume thumbnail selection 1511 禁用缩略图选择以启用弹出菜单等 \n使用[启用]恢复缩略图选择 1512 discard changes? 1512 是否放弃更改? 1513 do not warp images during auto-alignment 1513 自动对齐时不扭曲图像 1514 do nothing 1514 不执行任何操作 1515 dot size 1515 点大小 1516 downsize 1516 缩小 1517 drag image 1517 拖动图像 1518 drag mouse along an edge to follow the edge 1518 沿边缘拖动鼠标以跟随该边缘 1519 drag mouse down/right to draw oval \nshift + drag center to move oval \nshift + drag lower right edge to change 1519 向下/向右拖动鼠标以绘制椭圆 \n按住 shift 拖动中心以移动椭圆 \n按住 shift 拖动右下边缘以改变大小 1520 drag mouse to draw box \nshift + drag center to move box \nshift + drag edge to move edge 1520 拖动鼠标以绘制方框 \n按住 shift 拖动中心以移动方框 \n按住 shift 拖动边缘以移动边缘 1521 drag mouse to outline an area 1521 拖动鼠标以勾勒区域轮廓 1522 drag mouse to select circular or elliptical area 1522 拖动鼠标以选择圆形或椭圆形区域 1523 drag mouse to select rectangular area 1523 拖动鼠标以选择矩形区域 1524 drag mouse to show selected image 1524 拖动鼠标以显示选定图像 1525 duplicate keyword 1525 keyword 重复 1526 edge distance calculation 1526 边缘距离计算 1527 edge: 1527 边缘: 1528 edit 1528 编辑 1529 edit commands 1529 编辑命令 1530 edit custom shell commands, match colors to embedded jpeg image 1530 编辑自定义 shell 命令,将颜色匹配到嵌入的 jpeg 图像 1531 edit this menu 1531 编辑此菜单 1532 ellipse 1532 椭圆 1533 embedded numbers will sort by value 1533 嵌入的数字将按数值排序 1534 emboss 1534 浮雕 1535 enter 2-character language code: en, de, fr ... 1535 输入 2 字符语言代码:en、de、fr…… 1536 enter a project name 1536 输入项目名称 1537 enter an album name 1537 输入相册名称 1538 enter cities/locations, countries 1538 输入城市/地点、国家 1539 enter project name 1539 输入项目名称 1540 enter tag name 1540 输入标签名称 1541 enter tag names 1541 输入标签名称 1542 erase 1542 擦除 1543 error compensation 1543 误差补偿 1544 exceed %d edits 1544 超过 %d 次编辑 1545 exceed %d images 1545 超过 %d 张图像 1546 exceed %d max files, cannot continue 1546 超过最大文件数 %d,无法继续 1547 exceed %d rows 1547 超过 %d 行 1548 exceed %d selected files 1548 超过 %d 个选定文件 1549 exceed %d shortcuts 1549 超过 %d 个快捷键 1550 exceeded %d line entries 1550 超过 %d 条线条条目 1551 exceeded %d text entries 1551 超过 %d 条文本条目 1552 exceeded max. images: %d 1552 超出最大图像数:%d 1553 exceeded max. tiles: %d 1553 超出最大瓷砖数:%d 1554 exit split-screen 1554 退出分屏 1555 expand to these limits if smaller 1555 如果尺寸更小则扩展到这些限制 1556 exporting files 1556 正在导出文件 1557 extra indexed metadata tags > %d 1557 额外索引的 metadata 标签 > %d 1558 extra metadata tags to include in index 1558 要包含在索引中的额外 metadata 标签 1559 extra metadata tags: \n 1559 额外的 metadata 标签: \n 1560 fetch 1560 获取 1561 file 1561 文件 1562 file .ext names to recognize RAW files 1562 用于识别 RAW 文件的文件扩展名 1563 file .ext names to recognize video files 1563 用于识别视频文件的文件扩展名 1564 file close error 1564 文件关闭错误 1565 file color 1565 文件颜色 1566 file error: %s 1566 文件错误:%s 1567 file format error 1567 文件格式错误 1568 file format error: %s 1568 文件格式错误:%s 1569 file included: %s \n 1569 已包含文件:%s \n 1570 file metadata update failed 1570 文件 metadata 更新失败 1571 file name 1571 文件名 1572 file names 1572 文件名 1573 file not found 1573 未找到文件 1574 file not found \n 1574 未找到文件 \n 1575 file not found: %s 1575 未找到文件:%s 1576 file not found: %s %s 1576 未找到文件:%s %s 1577 file types: .jp2 .heic .avif .webp \nwill become: .jpg - CONTINUE? 1577 文件类型 .jp2 .heic .avif .webp \n将转换为 .jpg - 是否继续? 1578 file: %s \nexceed 99 versions 1578 文件:%s \n超过 99 个版本 1579 filename text 1579 文件名文本 1580 files in %s can be deleted 1580 %s 中的文件可被删除 1581 fill from current gallery 1581 从当前图库填充 1582 fill from selected files 1582 从选定文件填充 1583 fill selected areas 1583 填充选定区域 1584 fill transparent areas 1584 填充透明区域 1585 find all image files ...\n 1585 正在查找所有图像文件……\n 1586 find and report all unreadable image files 1586 查找并报告所有无法读取的图像文件 1587 find outline gap 1587 查找轮廓间隙 1588 find via table lookup 1588 通过表格查找 1589 find_imagefiles() failure \n 1589 find_imagefiles() 失败 \n 1590 find_imagefiles() failure: %s \n 1590 find_imagefiles() 失败:%s \n 1591 finish current edit first 1591 请先完成当前编辑 1592 finish making a script file 1592 完成创建脚本文件 1593 finish or cancel pending edit 1593 完成或取消待处理的编辑 1594 fix box in layout and start new box 1594 固定版面中的方框并开始新方框 1595 fix line in layout and start new line 1595 固定版面中的线条并开始新线条 1596 fix motion blur 1596 修正运动模糊 1597 fix oval in layout and start new oval 1597 固定版面中的椭圆并开始新椭圆 1598 follow edge 1598 跟随边缘 1599 font name and size for menus and dilogs 1599 菜单和对话框的字体名称及大小 1600 force a full re-index of all image files 1600 强制对所有图像文件进行完整重新索引 1601 format: yyyy:mm:dd [hh:mm:ss] 1601 格式:yyyy:mm:dd [hh:mm:ss] 1602 fotocx will exit 1602 Fotocx 将退出 1603 found %d pixels 1603 找到 %d 个像素 1604 free disk space: %d GB \n 1604 可用磁盘空间:%d GB \n 1605 freehand draw 1605 手绘 1606 ftruncate() failure: %s 1606 ftruncate() 失败:%s 1607 full image index: reports will be complete \n 1607 完整图像索引:报告将完整 \n 1608 function canceled 1608 功能已取消 1609 gallery 1609 图库 1610 gallery is empty 1610 图库为空 1611 gallery truncated to %d images 1611 图库已截断为 %d 张图像 1612 get images having text in filename (comma separated) 1612 获取文件名中含有指定文本的图像(以逗号分隔) 1613 get images with matching keywords (comma separated) 1613 获取具有匹配keywords的图像(以逗号分隔) 1614 get images within rating range 1614 获取评分范围内的图像 1615 gradual paint 1615 渐进绘制 1616 grid counts not 0-100: %s 1616 网格数量不在 0-100 范围内:%s 1617 grid picklist file error: %s 1617 网格选择列表文件错误:%s 1618 grid size 1618 网格大小 1619 group 1619 组 1620 height 1620 高度 1621 hide area outlines 1621 隐藏区域轮廓 1622 hide transient objects 1622 隐藏瞬态对象 1623 high 1623 高 1624 home folder was not changed 1624 主文件夹未更改 1625 horizontal 1625 水平 1626 hours 1626 小时 1627 icons only, text only, or both 1627 仅图标、仅文本或两者都显示 1628 if image < window, center or shift left or right 1628 若图像小于窗口,居中或向左/右偏移 1629 ignore differences above limit 1629 忽略超过限制的差异 1630 image blend 1630 图像混合 1631 image files 1631 图像文件 1632 image for source color 1632 用于源颜色的图像 1633 image index records found: %d \n 1633 找到的图像索引记录:%d \n 1634 image index required 1634 需要图像索引 1635 image index write error: %s 1635 图像索引写入错误:%s 1636 image is too large to edit: %d x %d 1636 图像过大,无法编辑:%d x %d 1637 image is too large: %dx%d, %lld megapix 1637 图像过大:%dx%d,%lld 百万像素 1638 image is too small to edit: %d x %d 1638 图像过小,无法编辑:%d x %d 1639 image scale 1639 图像比例 1640 image to set matching color 1640 用于设置匹配颜色的图像 1641 image width must be greater than height 1641 图像宽度必须大于高度 1642 images to report 1642 要报告的图像 1643 include all files 1643 包含所有文件 1644 include edited versions 1644 包含已编辑版本 1645 include last versions only 1645 仅包含最新版本 1646 include original files 1646 包含原始文件 1647 include transparent areas 1647 包含透明区域 1648 include: 1648 包含: 1649 increase blur with distance 1649 随距离增加模糊 1650 index completed, %.1f seconds \n 1650 索引已完成,用时 %.1f 秒 \n 1651 index config file error: %s 1651 索引配置文件错误:%s 1652 index updates needed: %d thumbnails: %d \n 1652 需要更新的索引:%d 个,thumbnails:%d \n 1653 index updates: %d title/desc updates: %d \nthumbnail updates: %d, deletes: %d \n 1653 索引更新:%d 个,标题/描述更新:%d 个 \nthumbnail 更新:%d 个,删除:%d 个 \n 1654 input 1654 输入 1655 input file: %s \n 1655 输入文件:%s \n 1656 insufficient memory, cannot proceed 1656 内存不足,无法继续 1657 insufficient overlap for color matching 1657 重叠区域不足,无法进行颜色匹配 1658 invalid GPS data 1658 GPS 数据无效 1659 invalid GPS data: %s 1659 GPS 数据无效:%s 1660 invalid album 1660 相册无效 1661 invalid date range: %s %s 1661 日期范围无效:%s %s 1662 invalid date/time format 1662 日期/时间格式无效 1663 invalid file 1663 文件无效 1664 invalid plugin: %s 1664 插件无效:%s 1665 invalid rating range 1665 评分范围无效 1666 invalid source file: %s 1666 源文件无效:%s 1667 invert area 1667 反转区域 1668 jpeg quality level - 70+ for good image quality 1668 JPEG 质量级别 - 70 以上可获得良好图像质量 1669 keyboard 1669 键盘 1670 keyboard controls: \nEsc: exit running slide show \narrow keys: prev/next image \nB: blank / unblank window \nN: transition to next image \nP: pause / resume \nX: magnify at mouse position 1670 键盘控制: \nEsc:退出正在运行的幻灯片放映 \n方向键:上一张/下一张图像 \nB:使窗口变黑/恢复 \nN:过渡到下一张图像 \nP:暂停/继续 \nX:在鼠标位置放大 1671 keyword names 1671 keyword 名称 1672 keywords to add 1672 要添加的keywords 1673 keywords to remove 1673 要移除的keywords 1674 keywords_defined file error: %s 1674 keywords_defined 文件错误:%s 1675 last search 1675 上次搜索 1676 last version 1676 最新版本 1677 last versions 1677 最新版本 1678 layout exceeds 4 gigabytes 1678 版面超过 4 GB 1679 layout file missing: %s 1679 版面文件缺失:%s 1680 left 1680 左 1681 left click on image for selected color 1681 左键点击图像以选取颜色 1682 left click: set image source location \nright click: set corresponding destination 1682 左键点击:设置图像源位置 \n右键点击:设置对应目标位置 1683 left drag: add transparency \nright drag: add opacity 1683 左键拖动:增加透明度 \n右键拖动:增加不透明度 1684 left drag: copy image to mouse position \nright drag: restore original image 1684 左键拖动:将图像复制到鼠标位置 \n右键拖动:恢复原始图像 1685 left drag: reduce halo, right drag: undo 1685 左键拖动:减少光晕,右键拖动:撤销 1686 lens mm 1686 镜头 mm 1687 level based on EXIF roll angle 1687 根据 EXIF 横滚角校平 1688 light 1688 亮 1689 light pixels 1689 亮像素 1690 line 1690 线条 1691 line color 1691 线条颜色 1692 line width 1692 线条宽度 1693 load 1693 加载 1694 load text data from a file 1694 从文件加载文本数据 1695 load widgets failed: %s 1695 加载控件失败:%s 1696 loading palette ... 1696 正在加载调色板…… 1697 location is not a folder 1697 该位置不是文件夹 1698 locations 1698 位置 1699 lock width/height ratio 1699 锁定宽/高比例 1700 log file is in a terminal 1700 日志文件位于终端中 1701 low 1701 低 1702 low contrast 1702 低对比度 1703 lower 1703 较低 1704 make an initially empty album 1704 创建一个初始为空的相册 1705 make new version 1705 制作新版本 1706 manual align 1706 手动对齐 1707 map marker (red dot) diameter, pixels 1707 地图标记(红点)直径,像素 1708 map selected areas and verify 1708 标注选定区域并核实 1709 mashup project 1709 Mashup 项目 1710 match embedded image color 1710 匹配嵌入图像的颜色 1711 match image color to base image (repeat) 1711 将图像颜色匹配到基准图像(重复) 1712 match values 1712 匹配数值 1713 matches 1713 匹配项 1714 max keywords exceeded 1714 超过最大keywords 数 1715 max. Width 1715 最大宽度 1716 max. album count exceeded: %d 1716 超出最大相册数:%d 1717 max. album files reached, results truncated 1717 已达到最大相册文件数,结果已截断 1718 max. album size exceeded: %d 1718 超出最大相册大小:%d 1719 max. blur radius 1719 最大模糊半径 1720 max. brightness 1720 最大亮度 1721 max. image limit reached: %d 1721 已达到最大图像数限制:%d 1722 max. width or height is not reasonable 1722 最大宽度或高度不合理 1723 maximum clip allowed to fit window 1723 适应窗口所允许的最大裁剪 1724 mean RGB: %5.0f %5.0f %5.0f 1724 平均 RGB:%5.0f %5.0f %5.0f 1725 mean noise: %5.2f %5.2f %5.2f 1725 平均噪点:%5.2f %5.2f %5.2f 1726 median 1726 中值 1727 median diff 1727 中值差 1728 menu text and background colors 1728 菜单文本与背景颜色 1729 metadata 1729 metadata 1730 metadata copy failed 1730 metadata 复制失败 1731 metadata from Search Function, metadata report 1731 来自搜索功能的 metadata,metadata 报告 1732 metadata picklist file not found %s 1732 未找到 metadata 选择列表文件 %s 1733 metadata tags to report 1733 要报告的 metadata 标签 1734 metadata update error 1734 metadata 更新错误 1735 metadata update error \n 1735 metadata 更新错误 \n 1736 metadata update error: %s 1736 metadata 更新错误:%s 1737 metadata update failed \n 1737 metadata 更新失败 \n 1738 min. blur radius 1738 最小模糊半径 1739 min. contrast 1739 最小对比度 1740 min. edit curve node separation, % of scale length 1740 编辑曲线节点最小间距,占比例长度的百分比 1741 min. separation, %c of scale 1741 最小间距,占比例的 %c 1742 minutes 1742 分钟 1743 mmap() failure: %s 1743 mmap() 失败:%s 1744 months 1744 月 1745 more than %d categories 1745 超过 %d 个类别 1746 more than 20 matches 1746 超过 20 个匹配项 1747 mouse radius 1747 鼠标半径 1748 mouse radius for color sample 1748 用于颜色采样的鼠标半径 1749 mouse radius: 1749 鼠标半径: 1750 move (delete original) 1750 移动(删除原始文件) 1751 move area boundary in/out in 1-pixel steps 1751 以 1 像素为步长移动区域边界 1752 move to next input file 1752 移动到下一个输入文件 1753 move to trash failed \n 1753 移至回收站失败 \n 1754 move to trash failed: %s 1754 移至回收站失败:%s 1755 multiply 1755 相乘 1756 must have 4 corners 1756 必须有 4 个角 1757 need numeric match value: %s 1757 需要数值匹配值:%s 1758 negative 1758 负片 1759 new album created 1759 已创建新相册 1760 new album name 1760 新相册名称 1761 new file 1761 新文件 1762 new file ... 1762 新文件…… 1763 new file name is invalid 1763 新文件名无效 1764 new file type 1764 新文件类型 1765 new home folder contains a blank 1765 新主文件夹包含空格 1766 new location 1766 新位置 1767 new location is not a folder 1767 新位置不是文件夹 1768 new version 1768 新版本 1769 newest files 1769 最新文件 1770 no EXIF orientation data 1770 无 EXIF 方向数据 1771 no active Select Area 1771 无激活的选择区域 1772 no albums selected 1772 未选择相册 1773 no auto warp 1773 无自动扭曲 1774 no change 1774 无更改 1775 no current album 1775 无当前相册 1776 no current edit image 1776 无当前编辑图像 1777 no current file 1777 无当前文件 1778 no curve (scanned image) 1778 无曲线(扫描图像) 1779 no description 1779 无描述 1780 no file selected 1780 未选择文件 1781 no files found 1781 未找到文件 1782 no files selected 1782 未选择文件 1783 no host files selected 1783 未选择主文件 1784 no image index: reports disabled \n 1784 无图像索引:报告已禁用 \n 1785 no images 1785 无图像 1786 no images found 1786 未找到图像 1787 no input files available 1787 没有可用的输入文件 1788 no matching files found 1788 未找到匹配的文件 1789 no matching locations 1789 没有匹配的位置 1790 no metadata level data 1790 无 metadata 级别数据 1791 no metadata tags to report 1791 没有要报告的 metadata 标签 1792 no option selected 1792 未选择选项 1793 no overlay file selected 1793 未选择叠加文件 1794 no photo date, skipped 1794 无拍摄日期,已跳过 1795 no plugin output file found 1795 未找到插件输出文件 1796 no prior edit 1796 无先前编辑 1797 no prior edit image 1797 无先前编辑图像 1798 no saved folders 1798 无已保存文件夹 1799 no script file was started 1799 未启动脚本文件 1800 no script files found 1800 未找到脚本文件 1801 no select area 1801 无选择区域 1802 no selection 1802 无选择 1803 no title 1803 无标题 1804 no write permission 1804 无写入权限 1805 no write permission \n 1805 无写入权限 \n 1806 no write permission: %s 1806 无写入权限:%s 1807 none 1807 无 1808 not a known image file 1808 不是已知的图像文件 1809 not an image file 1809 不是图像文件 1810 not an indexed image file \n 1810 不是已索引的图像文件 \n 1811 nothing found 1811 未找到任何内容 1812 nothing left, no change made 1812 没有剩余内容,未做任何更改 1813 old file 1813 旧文件 1814 old image index: reports will omit new files \n 1814 旧图像索引:报告将省略新文件 \n 1815 old keyword name >> new keyword name 1815 旧keyword名称 >> 新keyword名称 1816 omit high pixel 1816 忽略高像素 1817 omit low pixel 1817 忽略低像素 1818 only %d tile images found 1818 只找到 %d 张瓷砖图像 1819 opacity center 1819 不透明度中心 1820 opacity edge 1820 不透明度边缘 1821 open album 1821 打开相册 1822 open and process color chart 1822 打开并处理色卡 1823 open as new current file 1823 作为新的当前文件打开 1824 optional deselect color 1824 可选的取消选择颜色 1825 original 1825 原始 1826 originals 1826 原始文件 1827 other 1827 其他 1828 out of space for temp files \nsave your edits and quit Fotocx 1828 临时文件空间不足 \n请保存您的编辑并退出 Fotocx 1829 outline 1829 轮廓 1830 output file exists 1830 输出文件已存在 1831 output file exists, overwrite? 1831 输出文件已存在,是否覆盖? 1832 output file size change, cannot use select area 1832 输出文件大小已更改,无法使用选择区域 1833 output file: 1833 输出文件: 1834 output file: %s \n 1834 输出文件:%s \n 1835 oval 1835 椭圆 1836 overlay file missing: %s 1836 叠加文件缺失:%s 1837 owner 1837 所有者 1838 paint 1838 绘画 1839 paint color 1839 绘画颜色 1840 paint edits cannot be used for this method 1840 此方法无法使用绘制编辑 1841 paint over transparent areas 1841 在透明区域上绘制 1842 paint radius 1842 绘制半径 1843 palette 1843 调色板 1844 palette exceeds %d color limit 1844 调色板超过 %d 种颜色限制 1845 palette file 1845 调色板文件 1846 palette has %d colors 1846 调色板有 %d 种颜色 1847 palette loaded, %d colors 1847 已加载调色板,%d 种颜色 1848 palette: 1848 调色板: 1849 patch area goal 1849 拼块区域目标 1850 percent 1850 百分比 1851 perform edits to include in the script file 1851 要包含在脚本文件中的编辑操作 1852 permissions: 1852 权限: 1853 perspective 1853 透视 1854 photo 1854 照片 1855 picklist file not found: %s 1855 未找到选择列表文件:%s 1856 pixel = mean of best match neighbors 1856 像素 = 最佳匹配邻居的平均值 1857 pixel = median of all neighbors 1857 像素 = 所有邻居的中值 1858 please make a choice 1858 请做出选择 1859 plugin command failed 1859 插件命令失败 1860 plugin menu not found %s 1860 未找到插件菜单 %s 1861 plugins: (year month day old-name sequence) $yyyy $mm $dd $oldname $s 1861 插件:(年 月 日 旧名称 序号)$yyyy $mm $dd $oldname $s 1862 popup_choose: empty list 1862 popup_choose:空列表 1863 position with mouse click/drag 1863 使用鼠标点击/拖动定位 1864 position: 50 50 1864 位置:50 50 1865 position: x=%02d y=%02d 1865 位置:x=%02d y=%02d 1866 power 1866 强度 1867 power center 1867 中心强度 1868 power edge 1868 边缘强度 1869 power: center 1869 强度:中心 1870 pref 1870 首选项 1871 previous file 1871 上一个文件 1872 previous name 1872 旧名称 1873 print color chart 1873 打印色卡 1874 print select area(s) only? 1874 是否仅打印选定区域? 1875 prior edit step 1875 上一编辑步骤 1876 project complete 1876 项目已完成 1877 project file is defective 1877 项目文件已损坏 1878 project name cannot have quote characters 1878 项目名称不能包含引号字符 1879 pure RGB or black/white dots 1879 纯 RGB 或黑白点 1880 quality 1880 质量 1881 quality level (70+) 1881 质量级别(70 以上) 1882 radius 1882 半径 1883 radius: 1883 半径: 1884 random 1884 随机 1885 random position 1885 随机位置 1886 rating range 1886 评分范围 1887 reading image index file ...\n 1887 正在读取图像索引文件……\n 1888 recent files 1888 最近文件 1889 reduce bright 1889 减少亮部 1890 reduce dark 1890 减少暗部 1891 reduce to these limits if larger 1891 如果尺寸更大则缩减到这些限制 1892 refresh 1892 刷新 1893 remove %d duplicates? 1893 是否移除 %d 个重复项? 1894 remove all files in list 1894 移除列表中所有文件 1895 remove duplicate 1895 移除重复项 1896 remove from set 1896 从集合中移除 1897 remove panorama image curving 1897 消除全景图像弯曲 1898 remove selected file from list 1898 从列表中移除选定文件 1899 rename keywords 1899 重命名keywords 1900 repair metadata for %s 1900 修复 %s 的 metadata 1901 replace 1901 替换 1902 replace album %s ? 1902 是否替换相册 %s? 1903 replace file 1903 替换文件 1904 replace old 1904 替换旧的 1905 replace old file (OVERWRITE) 1905 替换旧文件(覆盖) 1906 replace substring within file name 1906 替换文件名中的子字符串 1907 report type: 1907 报告类型: 1908 req. color match 1908 所需颜色匹配度 1909 reset 1909 重置 1910 resolution 1910 分辨率 1911 resume from current image 1911 从当前图像继续 1912 right 1912 右 1913 right click on image for deselected color 1913 右键点击图像以取消选择颜色 1914 sample % 1914 采样 % 1915 save 1915 保存 1916 save Mashup output file 1916 保存 Mashup 输出文件 1917 save Mashup project? 1917 是否保存 Mashup 项目? 1918 save area as a PNG file 1918 将区域保存为 PNG 文件 1919 save as new file name or type 1919 另存为新文件名或类型 1920 save as new file version 1920 另存为新文件版本 1921 save edit, start new text 1921 保存编辑,开始新文本 1922 save metadata to image file 1922 将 metadata 保存到图像文件 1923 save text data to a file 1923 将文本数据保存到文件 1924 save to .heic/.avif file not supported 1924 不支持保存为 .heic/.avif 文件 1925 save to .jp2 file not supported 1925 不支持保存为 .jp2 文件 1926 save to .webp file not supported 1926 不支持保存为 .webp 文件 1927 scan and save color chart 1927 扫描并保存色卡 1928 scanned color chart file 1928 已扫描的色卡文件 1929 scope of neighbor pixels 1929 邻近像素范围 1930 script already started 1930 脚本已开始 1931 script complete 1931 脚本已完成 1932 script error: %s, %s 1932 脚本错误:%s,%s 1933 script file closed 1933 脚本文件已关闭 1934 script file error 1934 脚本文件错误 1935 script file format error: %s 1935 脚本文件格式错误:%s 1936 script file name too big 1936 脚本文件名过长 1937 script file to run 1937 要运行的脚本文件 1938 search for names in image location metadata 1938 在图像位置 metadata 中搜索名称 1939 search for text within file folders or file name 1939 在文件夹或文件名中搜索文本 1940 search for text within image title or description 1940 在图像标题或描述中搜索文本 1941 search known locations 1941 搜索已知位置 1942 search range 1942 搜索范围 1943 search: 1943 搜索: 1944 seconds 1944 秒 1945 seconds to show with text 1945 显示带文字的秒数 1946 seconds to show without text 1946 显示不带文字的秒数 1947 select all 1947 全选 1948 select all colors within mouse (flood) 1948 选择鼠标范围内的所有颜色(泛选) 1949 select area missing or not finished 1949 选择区域缺失或未完成 1950 select area within mouse 1950 选择鼠标范围内的区域 1951 select area within mouse circle 1951 选择鼠标圆圈范围内的区域 1952 select base image for color matching 1952 选择用于颜色匹配的基准图像 1953 select by color, required match level 1953 按颜色选择,所需匹配级别 1954 select by color, search range 1954 按颜色选择,搜索范围 1955 select font 1955 选择字体 1956 select image to show with mouse paint 1956 选择随鼠标绘制显示的图像 1957 select images randomly 1957 随机选择图像 1958 select initial files 1958 选择初始文件 1959 select line color 1959 选择线条颜色 1960 select one color within mouse 1960 选择鼠标范围内的一种颜色 1961 select rectangle 1961 选择矩形 1962 select source image color first 1962 请先选择源图像颜色 1963 select surrounding areas matching colors in mouse 1963 选择鼠标周围颜色匹配的区域 1964 selection exceeds %d tags 1964 所选内容超过 %d 个标签 1965 sepia 1965 褐色 1966 set a new date/time: 1966 设置新日期/时间: 1967 set all 1967 全部设置 1968 set current window size 1968 设置当前窗口大小 1969 set image color from input files 1969 从输入文件设置图像颜色 1970 set location from world map 1970 从世界地图设置位置 1971 set maximum crop 1971 设置最大裁剪 1972 shadow 1972 阴影 1973 shell command used for converting RAW files to RGB 1973 用于将 RAW 文件转换为 RGB 的 shell 命令 1974 shift + left click: pick color from image \nleft drag: paint color on image \nright drag: restore original image 1974 shift + 左键点击:从图像中拾取颜色 \n左键拖动:在图像上绘制颜色 \n右键拖动:恢复原始图像 1975 shift + left click: synchronize copy position \nleft drag: copy source image to mouse \nright drag: restore original image 1975 shift + 左键点击:同步复制位置 \n左键拖动:将源图像复制到鼠标处 \n右键拖动:恢复原始图像 1976 shift existing date/time (+/–): 1976 调整现有日期/时间(+/–): 1977 shift+click on image to select color 1977 shift+点击图像以选择颜色 1978 shortcut function not found: %s 1978 未找到快捷键功能:%s 1979 shortcut key: 1979 快捷键: 1980 shortcut not found: %s 1980 未找到快捷键:%s 1981 show area outlines 1981 显示区域轮廓 1982 show hidden files and folders 1982 显示隐藏的文件和文件夹 1983 show transient objects 1983 显示瞬态对象 1984 size of mouse selection circle 1984 鼠标选择圆圈的大小 1985 smooth 1985 平滑 1986 source file: 1986 源文件: 1987 source image failure (scale too big?) 1987 源图像失败(比例是否过大?) 1988 source image scale 1988 源图像比例 1989 specify a thumbnail folder 1989 指定一个缩略图文件夹 1990 specify at least 1 top image folder 1990 至少指定 1 个顶层图像文件夹 1991 specify background size and color 1991 指定背景大小和颜色 1992 specify files and keywords 1992 指定文件和keywords 1993 spot size limit 1993 光斑大小限制 1994 start 1994 开始 1995 start a new script file 1995 开始新的脚本文件 1996 start album 1996 起始相册 1997 start blob condensation process 1997 开始色块压缩处理 1998 start file 1998 起始文件 1999 start folder 1999 起始文件夹 2000 start from first image in album 2000 从相册中的第一张图像开始 2001 start fusion process 2001 开始融合处理 2002 start over at end of album 2002 从相册末尾重新开始 2003 start warp 2003 开始扭曲 2004 start with previous image file, gallery of recent files, etc. 2004 从上一图像文件、最近文件图库等开始 2005 startup album is invalid 2005 启动相册无效 2006 startup file is invalid 2006 启动文件无效 2007 startup folder is invalid 2007 启动文件夹无效 2008 status: %s \n 2008 状态:%s \n 2009 status: completed \n 2009 状态:已完成 \n 2010 stay open 2010 保持打开 2011 step 2011 步骤 2012 stop 2012 停止 2013 stop blob condensation process 2013 停止色块压缩处理 2014 stop fusion process 2014 停止融合处理 2015 supply a file name 2015 请提供文件名 2016 tag name 2016 标签名称 2017 tag name %s not in xmeta tag list 2017 标签名称 %s 不在 xmeta 标签列表中 2018 tag value 2018 标签值 2019 target file: 2019 目标文件: 2020 template 2020 模板 2021 test: show changes, do not update files 2021 测试:显示更改,不更新文件 2022 text 2022 文本 2023 text file is defective 2023 文本文件已损坏 2024 text time 2024 文本显示时间 2025 this function cannot be scripted 2025 此功能无法编写脚本 2026 thumbnail file 2026 缩略图文件 2027 thumbnails deleted: %d \n 2027 已删除的 thumbnails:%d \n 2028 thumbnails folder: %s \n 2028 thumbnails 文件夹:%s \n 2029 tile area goal 2029 瓷砖区域目标 2030 tile gap 2030 瓷砖间隙 2031 tile size 2031 瓷砖大小 2032 time 2032 时间 2033 title/desc. 2033 标题/描述. 2034 to add images to current set, \nsearch all images 2034 要将图像添加到当前集合, \n请搜索所有图像 2035 to remove images from current set, \nsearch current set 2035 要从当前集合中移除图像, \n请搜索当前集合 2036 too many categories 2036 类别过多 2037 too many files, cannot continue 2037 文件过多,无法继续 2038 too many keywords in a category 2038 某类别中的keywords 过多 2039 top image folders: \n 2039 顶层图像文件夹: \n 2040 transition 2040 过渡 2041 transitions 2041 过渡效果 2042 trash 2042 回收站 2043 trimmed color chart file 2043 已裁剪的色卡文件 2044 unable to save bookmarks file 2044 无法保存书签文件 2045 unknown edit function: %s 2045 未知编辑功能:%s 2046 unknown file type 2046 未知文件类型 2047 unknown or empty album: %s 2047 未知或空相册:%s 2048 unsharp mask 2048 USM 锐化 2049 update 2049 更新 2050 updating albums ...\n 2050 正在更新相册……\n 2051 upper 2051 上限 2052 upsize 2052 放大 2053 use 2053 使用 2054 use a saved Mashup project 2054 使用已保存的 Mashup 项目 2055 use average 2055 使用平均值 2056 use custom color palette 2056 使用自定义调色板 2057 use median 2057 使用中值 2058 use option to stop accidental quit 2058 使用选项以防止意外退出 2059 use previous input 2059 使用之前的输入 2060 use previous location 2060 使用之前的位置 2061 use prior edit step: 2061 使用之前的编辑步骤: 2062 use the current image file 2062 使用当前图像文件 2063 variance 2063 方差 2064 versions 2064 版本 2065 vertical 2065 垂直 2066 video files not supported (install ffmpeg) 2066 不支持视频文件(请安装 ffmpeg) 2067 view album 2067 查看相册 2068 waiting 2068 等待中 2069 warp 2069 扭曲 2070 warp and align selected image with mouse drags 2070 使用鼠标拖动扭曲并对齐选定图像 2071 warp and fine-align selected image with neighbor 2071 使用相邻图像扭曲并精细对齐选定图像 2072 warp span 2072 扭曲跨度 2073 wavelength 2073 波长 2074 width 2074 宽度 2075 writing updated image index file \n 2075 正在写入更新后的图像索引文件 \n 2076 x-count 2076 x 计数 2077 x-offset 2077 x 偏移 2078 y-count 2078 y 计数 2079 y-offset 2079 y 偏移 2080 years 2080 年 2081 you can close this window now \n 2081 您现在可以关闭此窗口 \n 2082 you cannot use new name and replace text together 2082 不能同时使用新名称和替换文本 2083 you must use either $s or $oldname 2083 您必须使用 $s 或 $oldname 其中之一 2084 zoom image 2084 zoom 图像 2085 zoom via mouse wheel or Keys +/=/-/↑/↓ 2085 通过鼠标滚轮或按键 +/=/-/↑/↓ 进行 zoom 2086 zoom-in 2086 zoom 放大 2087 zoom-out 2087 zoom 缩小 fotocx/data/custom_scripts/0000775000175000017500000000000015247006660015022 5ustar micomicofotocx/data/custom_scripts/emboss0000664000175000017500000000013415247006660016233 0ustar micomicoscript name: emboss-test menu: Emboss radius == 9 depth == 11 angle == 180 end menu: end fotocx/data/custom_scripts/mosaic0000664000175000017500000000064015247006660016220 0ustar micomicoscript name: mosaic menu: Sharpen UM == 0 radiusUM == 2 amountUM == 100 threshUM == 0 AC == 0 amountAC == 100 threshAC == 0 KH == 1 radiusKH == 8 MD == 0 radiusMD == 10 darkMD == 17 lightMD == 19 RL == 0 radiusRL == 6.7 itersRL == 5 end menu: Painting blurrad == 6 colordepth == 4 area_goal == 500 colormatch == 59 borders == 1 end menu: Emboss radius == 2 depth == 8 angle == 0 end menu: endfotocx/data/custom_scripts/sharpen-tiles2-emboss0000664000175000017500000000064115247006660021074 0ustar micomicoscript name: sharpen-tiles2-emboss menu: Sharpen UM == 0 radiusUM == 2 amountUM == 100 threshUM == 0 AC == 0 amountAC == 100 threshAC == 0 KH == 1 radiusKH == 4 MD == 0 radiusMD == 3 darkMD == 1 lightMD == 1 RL == 0 radiusRL == 1 itersRL == 10 end menu: Tiles2 base_size == 10 color_depth == 4 area_goal == 1000 color_match == 83 end menu: Emboss radius == 2 depth == 9 angle == 0 end menu: endfotocx/data/custom_scripts/cartoon-emboss0000664000175000017500000000025315247006660017700 0ustar micomicoscript name: cartoon-emboss menu: Cartoon line_threshold == 40 line_width == 2 kuwahara_depth == 3 end menu: Emboss radius == 9 depth == 10 angle == 44 end menu: endfotocx/data/custom_scripts/kuwahara-amplifyContrast0000664000175000017500000000056415247006660021732 0ustar micomicoscript name: kuwahara-amplifyContrast menu: Sharpen UM == 0 radiusUM == 2 amountUM == 100 threshUM == 0 AC == 0 amountAC == 100 threshAC == 0 KH == 1 radiusKH == 5 MD == 0 radiusMD == 3 darkMD == 1 lightMD == 1 RL == 0 radiusRL == 1 itersRL == 10 end menu: Amplify Contrast amplify == 0.897143 curves 1 1 0 2 0.0032/0.2570 0.9778/0.2514 end menu: endfotocx/data/custom_scripts/painting-texture0000664000175000017500000000027115247006660020254 0ustar micomicoscript name: painting-texture menu: Painting blurrad == 4 colordepth == 5 area_goal == 2890 colormatch == 84 borders == 0 end menu: Texture radius == 10 power == 20 end menu: endfotocx/data/custom_scripts/brightness and white point0000664000175000017500000000072415247006660022056 0ustar micomicoscript name: brightness and white point menu: Retouch all == 1 red == 0 green == 0 blue == 0 sampBL == 1 sampWB == 1 spotWB == 1 spotBL == 0 brightness == 0.0722118 contrast == 0 colorsat == 0.408023 colortemp == 6440.53 curves 4 1 0 3 0.0100/0.5361 0.5000/0.5361 0.9900/0.5361 0 0 3 0.0100/0.5000 0.5000/0.5000 0.9900/0.5000 0 0 3 0.0100/0.5000 0.5000/0.5000 0.9900/0.5000 0 0 3 0.0100/0.5000 0.5000/0.5000 0.9900/0.5000 end menu: endfotocx/data/custom_scripts/voodoo0000664000175000017500000000037515247006660016257 0ustar micomicoscript name: voodoo menu: Local Contrast power == 0.4 Zrad == 60 color == 0.6 curves 1 1 0 3 0.0100/0.5000 0.5000/0.5000 0.9900/0.5000 end menu: Amplify Contrast amplify == 0.697664 curves 1 1 0 2 0.0203/0.2358 0.9971/0.0325 end menu: endfotocx/data/capstags0000664000175000017500000000002215247006660013463 0ustar micomicoTitle Description fotocx/f.combine.cc0000664000175000017500000064127215247006660013213 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit functions - Combine menu functions m_HDR combine and adjust images with different exposures m_HDF combine and adjust images with different focus depth m_stack_paint combine multiple photos to eliminate transient objects m_stack_noise combine multiple photos to reduce noise m_stack_layers combine multiple image layers, select and paint areas m_panorama combine overlapped images horizontally m_cim_show_files show input files for prior combine edit function ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) using namespace zfuncs; /**************************************************************************************/ // File scope variables and functions for combine images // used by HDR, HDF, STP, STN, Panorama. int cimNF; // image count, <= 10 int cimLF; // index of alphabetically last input file ch *cimFile[10]; // input image files PXM *cimPXMf[10]; // original image pixmaps PXM *cimPXMs[10]; // alignment images, scaled and curved (pano) PXM *cimPXMw[10]; // alignment images, warped struct cimoffs { // image alignment offsets float xf, yf, tf; // x, y, theta offsets float wx[4], wy[4]; // x/y corner warps, 0=NW, 1=NE, 2=SE, 3=SW }; cimoffs cimOffs[10]; // image alignment data in E3 output image int pixcc = 4 * sizeof(float); // RGB pixel cc with alpha channel float cimSampSize = 1000; // alignment, pixel sample size 25.1 float cimAlignSize; // alignment image size (max ww/hh) float cimImageIncrease; // increase image size per align stage float cimScale; // alignment image size relative to full image float cimBlend; // image blend width at overlap, pixels (pano) float cimSearchRange; // alignment search range, pixels float cimMinSearchRange; // minimum search range float cimSearchStep; // alignment search step, vpixels float cimWarpRange; // alignment corner warp range, pixels float cimMinWarpRange; // minimum warp range float cimWarpStep; // alignment corner warp step, vpixels int cim_manualwarp; // alignment manual warping instead of auto int cim_manualalign; // alignment is manual instead of auto int cimOv1xlo, cimOv1xhi, cimOv1ylo, cimOv1yhi; // rectangle enclosing overlap area, int cimOv2xlo, cimOv2xhi, cimOv2ylo, cimOv2yhi; // image 1 and image2 coordinates float cimRGBmf1[3][256]; // RGB matching factors for image 1/2 compare: float cimRGBmf2[3][256]; // cimRGBmf1[*][pix1[*]] == cimRGBmf2[*][pix2[*]] ch *cimRedpix = 0; // maps high-contrast pixels for alignment int cimRedImage; // which image has red pixels int cimNsearch; // alignment search counter int cimShowIm1, cimShowIm2; // two images for cim_show_images() int cimShowAll; // if > 0, show all images int cimPano; // pano mode flag for cim_align_images() int cim_get_files(int min, int max); // get list of input files, load PXM images int cim_load_files(); // load input files int cim_check_files(float maxdiff); // check input files are compatible void cim_free_memory(); // free image memory after completion void cim_scale_image(int im, PXM **); // scale image, 1.0 to cimScale (normally < 1) float cim_get_overlap(int im1, int im2, PXM **); // get overlap area for images (horiz or vert) void cim_match_colors(int im1, int im2, PXM **); // match image RGB levels >> match data void cim_adjust_colors(PXM *pxm, int fwhich); // adjust RGB levels from match data void cim_get_redpix(int im1); // find high-contrast pixels in overlap area void cim_warp_image(int im); // warp image corners: cimPXMs[im] >> cimPXMw[im] void cim_warp_image_pano(int im, int fblend); // pano version, all / left side / blend stripe void cim_align_images(int im1, int im2); // align image im2 to im1, modify im2 offsets float cim_match_images(int im1, int im2); // compute match for overlapped images void cim_show_images(int fnew, int fblend); // combine images >> E3pxm >> main window void cim_trim(); // cut-off edges where all images do not overlap void cim_add_meta_hist(); // add list of files used to edit history void cim_dump_offsets(ch *label); // diagnostic tool /************************************************************************************** Make an HDR (high dynamic range) image from several images of the same subject with different exposure levels. The combined image has better visibility of detail in both the brightest and darkest areas. ***************************************************************************************/ int HDR_stat; // 1 = OK, 0 = failed or canceled float *HDR_bright = 0; // maps brightness per pixel float HDR_respfac[10][1000]; // contribution / image / pixel brightness void *HDR_align(void *); // align 2 images void HDR_brightness(); // compute pixel brightness levels void HDR_adjust_dialog(); // adjust image contribution curves void *HDR_adjust_weights(void *); // combine images per contribution curves editfunc EFhdr; // edit function data // menu function void m_HDR(GtkWidget *, ch *menu) { ch *ftemp; int imx, jj, err, px, py, ww, hh; float cimbrite[10], btemp; double pixsum, fnorm = 1.0 / 768.0; float *pixel; PXM *pxmtemp; F1_help_topic = TX("HDR"); printf("m_HDR \n"); if (CEF) { zmessageACK(Mwin,TX("finish or cancel pending edit")); return; } if (Fblock("HDR")) return; // check for blocking function Fblock(0); cimNF = cim_get_files(2,10); // get 2-10 files if (! cimNF) return; if (! cim_load_files()) return; // load and check all files if (! cim_check_files(0.02)) return; // check files are compatible free_resources(); // ready to commit HDR_bright = 0; cim_manualwarp = 0; err = f_open(cimFile[cimLF]); // curr_file = alphabetically last if (err) goto cleanup; EFhdr.menufunc = m_HDR; EFhdr.menuname = "HDR"; if (! edit_setup(EFhdr)) goto cleanup; // setup edit (will lock) for (imx = 0; imx < cimNF; imx++) // compute image brightness levels { ww = cimPXMf[imx]->ww; hh = cimPXMf[imx]->hh; // image sizes can vary a little pixsum = 0; for (py = 0; py < hh; py++) for (px = 0; px < ww; px++) { pixel = PXMpix(cimPXMf[imx],px,py); pixsum += fnorm * (pixel[0] + pixel[1] + pixel[2]); } cimbrite[imx] = pixsum / (ww * hh); // image mean brightness, 0.0 - 1.0 } for (imx = 0; imx < cimNF; imx++) // sort file and pixmap lists for (jj = imx+1; jj < cimNF; jj++) // by decreasing brightness { if (cimbrite[jj] > cimbrite[imx]) { // bubble sort btemp = cimbrite[jj]; cimbrite[jj] = cimbrite[imx]; cimbrite[imx] = btemp; ftemp = cimFile[jj]; cimFile[jj] = cimFile[imx]; cimFile[imx] = ftemp; pxmtemp = cimPXMf[jj]; cimPXMf[jj] = cimPXMf[imx]; cimPXMf[imx] = pxmtemp; } } Fescape = 0; HDR_align(0); if (HDR_stat != 1) goto cancel; if (Fescape) { // user cancel zmessage_post(Mwin,"parent",3,TX("function canceled")); goto cancel; } HDR_brightness(); // compute pixel brightness levels if (HDR_stat != 1) goto cancel; HDR_adjust_dialog(); // combine images based on user inputs if (HDR_stat != 1) goto cancel; CEF->Fmods++; // done CEF->Fsaved = 0; cim_add_meta_hist(); edit_done(0); goto cleanup; cancel: edit_cancel(0); cleanup: cim_free_memory(); // free memory for input files if (HDR_bright) zfree(HDR_bright); Fescape = 0; return; } // HDR align each pair of input images, output combined image to E3pxm // cimPXMf[*] original image // cimPXMs[*] scaled and color adjusted for pixel comparisons // cimPXMw[*] warped for display void * HDR_align(void *) { int imx, im1, im2, ww, hh, ii, nn; float R, maxtf, mintf, midtf; float xoff, yoff, toff, dxoff, dyoff; cimoffs offsets[10]; // x/y/t offsets after alignment Fbusy(+1); cimPano = 0; // no pano mode for (imx = 0; imx < cimNF; imx++) memset(&offsets[imx],0,sizeof(cimoffs)); for (im1 = 0; im1 < cimNF-1; im1++) // loop each pair of images { im2 = im1 + 1; cimAlignSize = 200; // initial alignment image size cimImageIncrease = 1.6; // size increase per align stage cimSearchRange = 16; // initial alignment search range cimMinSearchRange = 4; // minimum search range cimSearchStep = 1; // alignment search step cimWarpRange = 16; // initial alignment warp range cimMinWarpRange = 4; // minimum warp range cimWarpStep = 1; // alignment warp step memset(&cimOffs[im1],0,sizeof(cimoffs)); // initial image offsets = 0 memset(&cimOffs[im2],0,sizeof(cimoffs)); ww = cimPXMf[im1]->ww; // image dimensions hh = cimPXMf[im1]->hh; nn = ww; // use larger of ww, hh if (hh > ww) nn = hh; cimScale = cimAlignSize / nn; // initial align image size if (cimScale > 1.0) cimScale = 1.0; cimBlend = 0; // no blend width (use all) cim_get_overlap(im1,im2,cimPXMf); // get overlap area cim_match_colors(im1,im2,cimPXMf); // get color matching factors cimNsearch = 0; // align search counter while (true) // loop, increasing image size { cim_scale_image(im1,cimPXMs); // scale images to cimScale cim_scale_image(im2,cimPXMs); cim_adjust_colors(cimPXMs[im1],1); // apply color adjustments cim_adjust_colors(cimPXMs[im2],2); cim_warp_image(im1); // make warped images to show cim_warp_image(im2); cim_get_overlap(im1,im2,cimPXMs); // get overlap area cim_get_redpix(im1); // get high-contrast pixels cimShowIm1 = im1; // show two images with 50/50 blend cimShowIm2 = im2; cimShowAll = 0; cim_show_images(1,0); // (x/y offsets can change) cim_align_images(im1,im2); // align im2 to im1 if (Fescape) goto finish; // user kill zfree(cimRedpix); // clear red pixels cimRedpix = 0; if (cimScale == 1.0) break; // done R = cimImageIncrease; // next larger image size cimScale = cimScale * R; if (cimScale > 0.85) { // if close to end, jump to end R = R / cimScale; cimScale = 1.0; } cimOffs[im1].xf *= R; // scale offsets for larger image cimOffs[im1].yf *= R; cimOffs[im2].xf *= R; cimOffs[im2].yf *= R; for (ii = 0; ii < 4; ii++) { cimOffs[im1].wx[ii] *= R; cimOffs[im1].wy[ii] *= R; cimOffs[im2].wx[ii] *= R; cimOffs[im2].wy[ii] *= R; } cimSearchRange = cimSearchRange / cimImageIncrease + 0.5; if (cimSearchRange < cimMinSearchRange) cimSearchRange = cimMinSearchRange; cimWarpRange = cimWarpRange / cimImageIncrease + 0.5; if (cimWarpRange < cimMinWarpRange) cimWarpRange = cimMinWarpRange; } offsets[im2].xf = cimOffs[im2].xf - cimOffs[im1].xf; // save im2 offsets from im1 offsets[im2].yf = cimOffs[im2].yf - cimOffs[im1].yf; offsets[im2].tf = cimOffs[im2].tf - cimOffs[im1].tf; for (ii = 0; ii < 4; ii++) { offsets[im2].wx[ii] = cimOffs[im2].wx[ii] - cimOffs[im1].wx[ii]; offsets[im2].wy[ii] = cimOffs[im2].wy[ii] - cimOffs[im1].wy[ii]; } } for (imx = 0; imx < cimNF; imx++) // offsets[*] >> cimOffs[*] cimOffs[imx] = offsets[imx]; cimOffs[0].xf = cimOffs[0].yf = cimOffs[0].tf = 0; // image 0 at (0,0,0) for (im1 = 0; im1 < cimNF-1; im1++) // absolute offsets for image 1 to last { im2 = im1 + 1; cimOffs[im2].xf += cimOffs[im1].xf; // x/y/t offsets are additive cimOffs[im2].yf += cimOffs[im1].yf; cimOffs[im2].tf += cimOffs[im1].tf; for (ii = 0; ii < 4; ii++) { // corner warps are additive cimOffs[im2].wx[ii] += cimOffs[im1].wx[ii]; cimOffs[im2].wy[ii] += cimOffs[im1].wy[ii]; } } for (imx = 1; imx < cimNF; imx++) // re-warp to absolute cim_warp_image(imx); toff = cimOffs[0].tf; // balance +/- thetas maxtf = mintf = toff; for (imx = 1; imx < cimNF; imx++) { toff = cimOffs[imx].tf; if (toff > maxtf) maxtf = toff; if (toff < mintf) mintf = toff; } midtf = 0.5 * (maxtf + mintf); for (imx = 0; imx < cimNF; imx++) cimOffs[imx].tf -= midtf; for (im1 = 0; im1 < cimNF-1; im1++) // adjust x/y offsets for images after im1 for (im2 = im1+1; im2 < cimNF; im2++) // due to im1 theta offset { toff = cimOffs[im1].tf; xoff = cimOffs[im2].xf - cimOffs[im1].xf; yoff = cimOffs[im2].yf - cimOffs[im1].yf; dxoff = yoff * sinf(toff); dyoff = xoff * sinf(toff); cimOffs[im2].xf -= dxoff; cimOffs[im2].yf += dyoff; } finish: Fbusy(-1); HDR_stat = 1; return 0; } // Compute mean image pixel brightness levels. // (basis for setting image contributions per brightness level) void HDR_brightness() { int px3, py3, ww, hh, imx, kk, vstat; float px, py, red, green, blue; float bright, maxbright, minbright; float xoff, yoff, sintf[10], costf[10]; float norm, fnorm = 1.0 / 256.0; float vpix[4], *pix3; Fbusy(+1); cimScale = 1.0; for (imx = 0; imx < cimNF; imx++) // replace alignment images { // (color adjusted for pixel matching) PXM_free(cimPXMs[imx]); // with the original images cimPXMs[imx] = PXM_copy(cimPXMf[imx]); cim_warp_image(imx); // re-apply warps } for (imx = 0; imx < cimNF; imx++) // pre-calculate trig functions { sintf[imx] = sinf(cimOffs[imx].tf); costf[imx] = cosf(cimOffs[imx].tf); } ww = E3pxm->ww; hh = E3pxm->hh; HDR_bright = (float *) zmalloc(ww * hh * sizeof(int),"cim HDR"); // get memory for brightness array minbright = 1.0; maxbright = 0.0; for (py3 = 0; py3 < hh; py3++) // step through all output pixels for (px3 = 0; px3 < ww; px3++) { red = green = blue = 0; vstat = 0; for (imx = 0; imx < cimNF; imx++) // step through all input images { xoff = cimOffs[imx].xf; yoff = cimOffs[imx].yf; px = costf[imx] * (px3 - xoff) + sintf[imx] * (py3 - yoff); // image N pixel, after offsets py = costf[imx] * (py3 - yoff) - sintf[imx] * (px3 - xoff); vstat = vpixel(cimPXMw[imx],px,py,vpix); if (! vstat) break; red += fnorm * vpix[0]; // sum input pixels green += fnorm * vpix[1]; blue += fnorm * vpix[2]; } if (! vstat) { // pixel outside some image pix3 = PXMpix(E3pxm,px3,py3); // output pixel = black pix3[0] = pix3[1] = pix3[2] = pix3[3] = 0; // alpha = 0 kk = py3 * ww + px3; HDR_bright[kk] = 0; continue; } bright = (red + green + blue) / (3 * cimNF); // mean pixel brightness, 0.0 to 1.0 kk = py3 * ww + px3; HDR_bright[kk] = bright; if (bright > maxbright) maxbright = bright; if (bright < minbright) minbright = bright; pix3 = PXMpix(E3pxm,px3,py3); // output pixel pix3[0] = red * 255.0 / cimNF; pix3[1] = green * 255.0 / cimNF; pix3[2] = blue * 255.0 / cimNF; } norm = 0.999 / (maxbright - minbright); // normalize to range 0.0 to 0.999 for (int ii = 0; ii < ww * hh; ii++) HDR_bright[ii] = (HDR_bright[ii] - minbright) * norm; Fbusy(-1); Fpaint2(); // update window return; } // Dialog for user to control the contributions of each input image // while watching the output image which is updated in real time. void HDR_adjust_dialog() { int HDR_adjust_dialog_event(zdialog *zd, ch *event); void HDR_curvedit(int); int imx; float cww = 1.0 / (cimNF-1); /*** _____________________________________________________ | Adjust Image Contributions | | _________________________________________________ | | | | | | | | | | | | | | | curve drawing area | | | | | | | | | | | | | | | |_________________________________________________| | | dark pixels light pixels | | press F1 for help | | [OK] [X] | |_____________________________________________________| ***/ zdialog *zd = zdialog_new(TX("Adjust Image Contributions"),Mwin,"OK","X",null); zdialog_add_widget(zd,"frame","brframe","dialog",0,"expand|space=2"); zdialog_add_widget(zd,"hbox","hb1","dialog",0); zdialog_add_widget(zd,"label","lab11","hb1",TX("dark pixels"),"space=3"); zdialog_add_widget(zd,"label","lab12","hb1",0,"expand"); zdialog_add_widget(zd,"label","lab13","hb1",TX("light pixels"),"space=3"); zdialog_add_widget(zd,"hbox","hbf1","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labf1","hbf1",TX("Press F1 for help"),"space=5"); GtkWidget *brframe = zdialog_gtkwidget(zd,"brframe"); // set up curve edit spldat *sd = splcurve_init(brframe,HDR_curvedit); EFhdr.sd = sd; sd->Nspc = cimNF; // no. curves = no. files for (imx = 0; imx < cimNF; imx++) // set up initial response curve { sd->fact[imx] = 1; sd->vert[imx] = 0; sd->nap[imx] = 2; sd->apx[imx][0] = 0.01; sd->apx[imx][1] = 0.99; sd->apy[imx][0] = 0.9 - imx * 0.8 * cww; sd->apy[imx][1] = 0.1 + imx * 0.8 * cww; splcurve_generate(sd,imx); } zdialog_resize(zd,300,250); zdialog_run(zd,HDR_adjust_dialog_event,"save"); // run dialog zdialog_wait(zd); // wait for completion zdialog_free(zd); return; } // dialog event and completion callback function int HDR_adjust_dialog_event(zdialog *zd, ch *event) // add file open dialog { if (zd->zstat) // dialog complete { if (zd->zstat == 1) HDR_stat = 1; else HDR_stat = 0; if (HDR_stat == 1) cim_trim(); // cut-off edges } return 1; } // this function is called when a curve is edited void HDR_curvedit(int spc) { HDR_adjust_weights(0); return; } // Combine all input images >> E3pxm based on image response curves. void * HDR_adjust_weights(void *) { void * HDR_adjust_wthread(void *arg); int imx, ii, kk; float xval, yval, sumrf; spldat *sd = EFhdr.sd; for (imx = 0; imx < cimNF; imx++) // loop input images { for (ii = 0; ii < 1000; ii++) // loop all brightness levels { HDR_respfac[imx][ii] = 0; // remove range limits xval = 0.001 * ii; kk = 1000 * xval; yval = sd->yval[imx][kk]; HDR_respfac[imx][ii] = yval; // contribution of this input image } } for (ii = 0; ii < 1000; ii++) // normalize the factors so that { // they sum to 1.0 sumrf = 0; for (imx = 0; imx < cimNF; imx++) sumrf += HDR_respfac[imx][ii]; if (! sumrf) continue; for (imx = 0; imx < cimNF; imx++) HDR_respfac[imx][ii] = HDR_respfac[imx][ii] / sumrf; } paintlock(1); // block window paint do_wthreads(HDR_adjust_wthread,NSMP); // worker threads paintlock(-1); // unblock window paint Fpaint2(); // update window return 0; } void * HDR_adjust_wthread(void *arg) // working thread { int index = *((int *) (arg)); int imx, ww, hh, ii, px3, py3, vstat; float sintf[10], costf[10], xoff, yoff; float px, py, red, green, blue, bright, factor; float vpix[4], *pix3; for (imx = 0; imx < cimNF; imx++) // pre-calculate trig functions { sintf[imx] = sinf(cimOffs[imx].tf); costf[imx] = cosf(cimOffs[imx].tf); } ww = E3pxm->ww; hh = E3pxm->hh; for (py3 = index; py3 < hh; py3 += NSMP) // step through all output pixels for (px3 = 0; px3 < ww; px3++) { ii = py3 * ww + px3; bright = HDR_bright[ii]; // mean brightness, 0.0 to 1.0 ii = 1000 * bright; if (ii < 0) ii = 0; if (ii > 999) ii = 999; red = green = blue = 0; for (imx = 0; imx < cimNF; imx++) // loop input images { factor = HDR_respfac[imx][ii]; // image contribution to this pixel if (! factor) continue; // none xoff = cimOffs[imx].xf; yoff = cimOffs[imx].yf; px = costf[imx] * (px3 - xoff) + sintf[imx] * (py3 - yoff); // input virtual pixel mapping to py = costf[imx] * (py3 - yoff) - sintf[imx] * (px3 - xoff); // this output pixel vstat = vpixel(cimPXMw[imx],px,py,vpix); // get input pixel if (! vstat) continue; red += factor * vpix[0]; // accumulate brightness contribution green += factor * vpix[1]; blue += factor * vpix[2]; } pix3 = PXMpix(E3pxm,px3,py3); // output pixel pix3[0] = red; // = sum of input pixel contributions pix3[1] = green; pix3[2] = blue; } return 0; } /************************************************************************************** Make an HDF (high depth of field) image from several images of the same subject with different focus settings. Combine the images and allow the user to "paint" the output combined image using the mouse and choosing the sharpest input image for each area of the output image. The result is an image with a depth of field that exceeds the camera capability. The images are aligned at the center, but small differences in camera position (hand-held photos) will cause parallax errors that prevent perfect alignment of the images. Also, the images with nearer focus will be slightly larger than those with farther focus. These problems can be compensated by dragging and warping the images using the mouse. **************************************************************************************/ int HDF_stat; // 1 = OK, 0 = failed or canceled void * HDF_align(void *); void HDF_adjust_dialog(); void HDF_mousefunc(); void * HDF_map_pixels(void *); editfunc EFhdf; // edit function data // menu function void m_HDF(GtkWidget *, ch *menu) { int err; F1_help_topic = TX("HDF"); printf("m_HDF \n"); if (CEF) { zmessageACK(Mwin,TX("finish or cancel pending edit")); return; } if (Fblock("HDF")) return; // check for blocking function Fblock(0); cimNF = cim_get_files(2,10); // get 2-10 files if (! cimNF) return; if (! cim_load_files()) return; // load and check all files if (! cim_check_files(0.02)) return; // check files are compatible free_resources(); // ready to commit cim_manualwarp = 0; err = f_open(cimFile[cimLF]); // curr_file = alphabetically last if (err) goto cleanup; EFhdf.menufunc = m_HDF; EFhdf.menuname = "HDF"; EFhdf.mousefunc = HDF_mousefunc; if (! edit_setup(EFhdf)) goto cleanup; // setup edit (will lock) Fescape = 0; HDF_align(0); // align each pair of images if (HDF_stat != 1) goto cancel; if (Fescape) { // user cancel zmessage_post(Mwin,"parent",3,TX("function canceled")); goto cancel; } HDF_adjust_dialog(); // combine images based on user inputs if (HDF_stat != 1) goto cancel; CEF->Fmods++; // done CEF->Fsaved = 0; cim_add_meta_hist(); edit_done(0); goto cleanup; cancel: edit_cancel(0); cleanup: cim_free_memory(); // free memory for input files Fescape = 0; return; } // align each image 2nd-last to 1st image // cimPXMf[*] original image // cimPXMs[*] scaled and color adjusted for pixel comparisons // cimPXMw[*] warped for display void * HDF_align(void *) { int imx, im1, im2, ww, hh, ii, nn; float R; Fbusy(+1); cimPano = 0; // no pano mode for (imx = 1; imx < cimNF; imx++) // loop 2nd to last image { im1 = 0; // images to align im2 = imx; cimAlignSize = 200; // initial alignment image size cimImageIncrease = 1.6; // size increase per align stage cimSearchRange = 16; // initial alignment search range cimMinSearchRange = 4; // minimum search range cimSearchStep = 1; // alignment search step cimWarpRange = 16; // initial alignment warp range cimMinWarpRange = 4; // minimum warp range cimWarpStep = 1; // alignment warp step memset(&cimOffs[im1],0,sizeof(cimoffs)); // initial image offsets = 0 memset(&cimOffs[im2],0,sizeof(cimoffs)); ww = cimPXMf[im1]->ww; // image dimensions hh = cimPXMf[im1]->hh; nn = ww; // use larger of ww, hh if (hh > ww) nn = hh; cimScale = cimAlignSize / nn; // initial align image size if (cimScale > 1.0) cimScale = 1.0; cimBlend = 0; // no blend width (use all) cim_get_overlap(im1,im2,cimPXMf); // get overlap area cim_match_colors(im1,im2,cimPXMf); // get color matching factors cimNsearch = 0; // align search counter while (true) // loop, increasing image size { cim_scale_image(im1,cimPXMs); // scale images to cimScale cim_scale_image(im2,cimPXMs); cim_adjust_colors(cimPXMs[im1],1); // apply color adjustments cim_adjust_colors(cimPXMs[im2],2); cim_warp_image(im1); // warp images for show cim_warp_image(im2); cim_get_overlap(im1,im2,cimPXMs); // get overlap area cim_get_redpix(im1); // get high-contrast pixels cimShowIm1 = im1; // show these two images cimShowIm2 = im2; // with 50/50 blend cimShowAll = 0; cim_show_images(1,0); // (x/y offsets can change) cim_align_images(im1,im2); // align im2 to im1 if (Fescape) goto finish; // user kill zfree(cimRedpix); // clear red pixels cimRedpix = 0; if (cimScale == 1.0) break; // done R = cimImageIncrease; // next larger image size cimScale = cimScale * R; if (cimScale > 0.85) { // if close to end, jump to end R = R / cimScale; cimScale = 1.0; } cimOffs[im1].xf *= R; // scale offsets for larger image cimOffs[im1].yf *= R; cimOffs[im2].xf *= R; cimOffs[im2].yf *= R; for (ii = 0; ii < 4; ii++) { cimOffs[im1].wx[ii] *= R; cimOffs[im1].wy[ii] *= R; cimOffs[im2].wx[ii] *= R; cimOffs[im2].wy[ii] *= R; } cimSearchRange = cimSearchRange / cimImageIncrease + 0.5; if (cimSearchRange < cimMinSearchRange) cimSearchRange = cimMinSearchRange; cimWarpRange = cimWarpRange / cimImageIncrease + 0.5; if (cimWarpRange < cimMinWarpRange) cimWarpRange = cimMinWarpRange; } cimOffs[im2].xf = cimOffs[im2].xf - cimOffs[im1].xf; // save im2 offsets from im1 cimOffs[im2].yf = cimOffs[im2].yf - cimOffs[im1].yf; cimOffs[im2].tf = cimOffs[im2].tf - cimOffs[im1].tf; } memset(&cimOffs[0],0,sizeof(cimoffs)); finish: Fbusy(-1); HDF_stat = 1; return 0; } // paint and warp output image zdialog *HDF_adjustzd = 0; // paint/warp dialog int HDF_mode; // mode: paint or warp int HDF_image; // current image (0 based) int HDF_radius; // paint mode radius ch *HDF_pixmap = 0; // map input image per output pixel float *HDF_warpx[10], *HDF_warpy[10]; // warp memory, pixel displacements void HDF_adjust_dialog() { ch imageN[8] = "imageN", labN[4] = "0"; int cc, imx, ww, hh; int HDF_adjust_dialog_event(zdialog *zd, ch *event); /*** ______________________________________ | Paint and Warp Image | | | | Image (o) 1 (o) 2 (o) 3 ... | | (o) paint Radius [____] | | (o) warp | | [OK] [X] | |______________________________________| ***/ HDF_adjustzd = zdialog_new(TX("Paint and Warp Image"),Mwin,"OK","X",null); zdialog *zd = HDF_adjustzd; zdialog_add_widget(zd,"hbox","hbim","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labim","hbim",TX("Image"),"space=5"); zdialog_add_widget(zd,"hbox","hbpw","dialog",0,"space=3"); zdialog_add_widget(zd,"vbox","vbpw1","hbpw",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbpw2","hbpw",0,"homog|space=5"); zdialog_add_widget(zd,"radio","paint","vbpw1",TX("paint")); zdialog_add_widget(zd,"radio","warp","vbpw1",TX("warp")); zdialog_add_widget(zd,"hbox","hbp","vbpw2"); zdialog_add_widget(zd,"label","labpr","hbp",TX("Radius"),"space=5"); zdialog_add_widget(zd,"zspin","radius","hbp","1|400|1|300"); zdialog_add_widget(zd,"label","space","vbpw2"); zdialog_add_widget(zd,"hbox","hbf1","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labf1","hbf1",TX("Press F1 for help"),"space=5"); for (imx = 0; imx < cimNF; imx++) { // add radio button for each image imageN[5] = '1' + imx; labN[0] = '1' + imx; zdialog_add_widget(zd,"radio",imageN,"hbim",labN); } zdialog_stuff(zd,"paint",1); // paint button on zdialog_stuff(zd,"warp",0); // warp button off zdialog_stuff(zd,"image1",1); // initial image = 1st zdialog_add_ttip(zd,"paint",TX("drag mouse to show selected image")); zdialog_add_ttip(zd,"warp",TX("warp and align selected image with mouse drags")); HDF_mode = 0; // start in paint mode HDF_image = 0; // initial image HDF_radius = 300; // paint radius takeMouse(HDF_mousefunc,0); // connect mouse function cc = E3pxm->ww * E3pxm->hh; // allocate pixel map HDF_pixmap = (ch *) zmalloc(cc,"cim HDF"); memset(HDF_pixmap,cimNF,cc); // initial state, blend all images for (imx = 0; imx < cimNF; imx++) { // allocate warp memory ww = cimPXMw[imx]->ww; hh = cimPXMw[imx]->hh; HDF_warpx[imx] = (float *) zmalloc(ww * hh * sizeof(float),"cim HDF"); HDF_warpy[imx] = (float *) zmalloc(ww * hh * sizeof(float),"cim HDF"); } zdialog_resize(zd,250,0); // stretch a bit zdialog_run(zd,HDF_adjust_dialog_event,"save"); // run dialog, parallel zdialog_wait(zd); // wait for completion zdialog_free(zd); return; } // dialog event and completion callback function int HDF_adjust_dialog_event(zdialog *zd, ch *event) { int imx, nn; if (zd->zstat) // dialog finish { freeMouse(); // disconnect mouse function if (zd->zstat == 1) HDF_stat = 1; else HDF_stat = 0; if (HDF_stat == 1) cim_trim(); // cut-off edges HDF_mode = 0; zfree(HDF_pixmap); // free pixel map for (imx = 0; imx < cimNF; imx++) { zfree(HDF_warpx[imx]); // free warp memory zfree(HDF_warpy[imx]); } return 1; } if (strmatch(event,"paint")) { // set paint mode zdialog_fetch(zd,"paint",nn); if (! nn) return 1; HDF_mode = 0; gdk_window_set_cursor(Fgdkwin,0); // no drag cursor } if (strmatch(event,"warp")) { // set warp mode zdialog_fetch(zd,"warp",nn); if (! nn) return 1; HDF_mode = 1; draw_mousecircle(0,0,0,1,0); // stop mouse circle gdk_window_set_cursor(Fgdkwin,dragcursor); // set drag cursor } if (strmatchN(event,"image",5)) { // image radio button nn = event[5] - '0'; // 1 to cimNF if (nn > 0 && nn <= cimNF) HDF_image = nn - 1; // 0 to cimNF-1 HDF_map_pixels(0); } if (strmatch(event,"radius")) // change paint radius zdialog_fetch(zd,"radius",HDF_radius); if (strmatch(event,"focus")) { // toggle mouse capture takeMouse(HDF_mousefunc,0); // connect mouse function if (HDF_mode == 1) gdk_window_set_cursor(Fgdkwin,dragcursor); // warp mode, drag cursor HDF_map_pixels(0); } return 1; } // HDF dialog mouse function // paint: during drag, selected image >> HDF_pixmap (within paint radius) >> E3 // warp: for selected image, cimPXMs >> warp >> cimPXMw >> E3 void HDF_mousefunc() { float vpix1[4], *pix2, *pix3; int imx, radius, rect, radius2, vstat1; int mx, my, dx, dy, px3, py3; ch imageN[8] = "imageN"; float px1, py1; float xoff, yoff, sintf[10], costf[10]; int ii, px, py, ww, hh; float mag, dispx, dispy, d1, d2; PXM *pxm1, *pxm2; if (LMclick || RMclick) // mouse click return; // process zooms normally if (HDF_mode == 0) goto paint; else if (HDF_mode == 1) goto warp; else return; paint: radius = HDF_radius; // paintbrush radius radius2 = radius * radius; draw_mousecircle(Mxposn,Myposn,radius,0,0); // draw mouse selection circle if (! Mxdrag && ! Mydrag) return; mx = Mxdrag; // mouse drag my = Mydrag; Mxdrag = Mydrag = 0; if (mx < 0 || mx > E3pxm->ww-1 || my < 0 || my > E3pxm->hh-1) // mouse outside image area return; for (imx = 0; imx < cimNF; imx++) // pre-calculate trig funcs { sintf[imx] = sinf(cimOffs[imx].tf); costf[imx] = cosf(cimOffs[imx].tf); } for (dy = -radius; dy <= radius; dy++) // loop pixels around mouse for (dx = -radius; dx <= radius; dx++) { if (dx*dx + dy*dy > radius2) continue; // outside radius px3 = mx + dx; // output pixel py3 = my + dy; if (px3 < 0 || px3 > E3pxm->ww-1) continue; // outside image if (py3 < 0 || py3 > E3pxm->hh-1) continue; pix3 = PXMpix(E3pxm,px3,py3); // output pixel imx = py3 * E3pxm->ww + px3; // update pixmap to selected image HDF_pixmap[imx] = HDF_image; imx = HDF_image; xoff = cimOffs[imx].xf; yoff = cimOffs[imx].yf; px1 = costf[imx] * (px3 - xoff) + sintf[imx] * (py3 - yoff); // input virtual pixel py1 = costf[imx] * (py3 - yoff) - sintf[imx] * (px3 - xoff); vstat1 = vpixel(cimPXMw[imx],px1,py1,vpix1); if (vstat1) memcpy(pix3,vpix1,pixcc); else memset(pix3,0,pixcc); // voided pixel } rect = 2 * radius; Fpaint3(mx-radius,my-radius,rect,rect,0); // update window draw_mousecircle(mx,my,radius,0,0); // draw mouse selection circle return; warp: if (! Mxdrag && ! Mydrag) return; mx = Mxdrag; // mouse drag my = Mydrag; if (mx < 0 || mx > E3pxm->ww-1 || my < 0 || my > E3pxm->hh-1) // mouse outside image area return; imx = my * E3pxm->ww + mx; // if pixel has been painted, imx = HDF_pixmap[imx]; // select corresp. image to warp if (imx == cimNF) return; // else no action if (imx != HDF_image) { HDF_image = imx; // update selected image and imageN[5] = '1' + imx; // dialog radio button zdialog_stuff(HDF_adjustzd,imageN,1); } pxm1 = cimPXMs[imx]; // input image pxm2 = cimPXMw[imx]; // output image ww = pxm2->ww; hh = pxm2->hh; mx = Mxdown; // drag origin, image coordinates my = Mydown; dx = Mxdrag - Mxdown; // drag increment dy = Mydrag - Mydown; Mxdown = Mxdrag; // next drag origin Mydown = Mydrag; Mxdrag = Mydrag = 0; d1 = ww * ww + hh * hh; for (py = 0; py < hh; py++) // process all output pixels for (px = 0; px < ww; px++) { d2 = (px-mx)*(px-mx) + (py-my)*(py-my); mag = (1.0 - d2 / d1); mag = mag * mag * mag * mag; mag = mag * mag * mag * mag; mag = mag * mag * mag * mag; dispx = -dx * mag; // displacement = drag * mag dispy = -dy * mag; ii = py * ww + px; HDF_warpx[imx][ii] += dispx; // add this drag to prior sum HDF_warpy[imx][ii] += dispy; dispx = HDF_warpx[imx][ii]; dispy = HDF_warpy[imx][ii]; vstat1 = vpixel(pxm1,px+dispx,py+dispy,vpix1); // input virtual pixel pix2 = PXMpix(pxm2,px,py); // output pixel if (vstat1) memcpy(pix2,vpix1,pixcc); else memset(pix2,0,pixcc); // voided pixel } HDF_map_pixels(0); // combine images >> E3 >> main window return; } // Combine images in E3pxm (not reallocated). Update main window. void * HDF_map_pixels(void *) { void * HDF_map_wthread(void *); do_wthreads(HDF_map_wthread,NSMP); // worker threads Fpaint2(); return 0; } void * HDF_map_wthread(void *arg) // worker thread { int index = *((int *) (arg)); // no more paint and warp modes int px3, py3, vstat1, imx; float red, green, blue; // float float px, py; float xoff, yoff, sintf[10], costf[10]; float vpix1[4], *pix3; for (imx = 0; imx < cimNF; imx++) // pre-calculate trig funcs { sintf[imx] = sinf(cimOffs[imx].tf); costf[imx] = cosf(cimOffs[imx].tf); } for (py3 = index+1; py3 < E3pxm->hh-1; py3 += NSMP) // step through output pixels for (px3 = 1; px3 < E3pxm->ww-1; px3++) { pix3 = PXMpix(E3pxm,px3,py3); imx = py3 * E3pxm->ww + px3; imx = HDF_pixmap[imx]; if (imx < cimNF) // specific image maps to pixel { xoff = cimOffs[imx].xf; yoff = cimOffs[imx].yf; px = costf[imx] * (px3 - xoff) + sintf[imx] * (py3 - yoff); py = costf[imx] * (py3 - yoff) - sintf[imx] * (px3 - xoff); vstat1 = vpixel(cimPXMw[imx],px,py,vpix1); // corresp. input vpixel if (vstat1) memcpy(pix3,vpix1,pixcc); else memset(pix3,0,pixcc); // voided pixel } else // use blend of all images { red = green = blue = 0; for (imx = 0; imx < cimNF; imx++) { xoff = cimOffs[imx].xf; yoff = cimOffs[imx].yf; px = costf[imx] * (px3 - xoff) + sintf[imx] * (py3 - yoff); py = costf[imx] * (py3 - yoff) - sintf[imx] * (px3 - xoff); vstat1 = vpixel(cimPXMw[imx],px,py,vpix1); if (vstat1) { red += vpix1[0]; green += vpix1[1]; blue += vpix1[2]; } } pix3[0] = red / cimNF; pix3[1] = green / cimNF; pix3[2] = blue / cimNF; } } return 0; } /************************************************************************************** Stack/Paint function Combine multiple images of one subject taken at different times from (almost) the same camera position. Align the images and allow the user to choose which input image to use for each area of the output image, by "painting" with the mouse. Use this to remove tourists and cars that move in and out of a scene being photographed. **************************************************************************************/ int STP_stat; // 1 = OK, 0 = failed or canceled void * STP_align(void *); void STP_adjust_dialog(); void STP_mousefunc(); void * STP_map_pixels(void *); void STP_setpixel(int px, int py, int source); editfunc EFstp; // edit function data // menu function void m_stack_paint(GtkWidget *, ch *menu) { int err; F1_help_topic = TX("STACK/PAINT"); printf("m_stack_paint \n"); if (CEF) { zmessageACK(Mwin,TX("finish or cancel pending edit")); return; } if (Fblock("stack/paint")) return; // check for blocking function Fblock(0); cimNF = cim_get_files(2,10); // get 2-10 files if (! cimNF) return; if (! cim_load_files()) return; // load and check all files if (! cim_check_files(0.02)) return; // check files are compatible free_resources(); // ready to commit cim_manualwarp = 0; err = f_open(cimFile[cimLF]); // curr_file = alphabetically last if (err) goto cleanup; EFstp.menufunc = m_stack_paint; EFstp.menuname = "Stack/Paint"; EFstp.mousefunc = STP_mousefunc; if (! edit_setup(EFstp)) goto cleanup; // setup edit (will lock) Fescape = 0; STP_align(0); // align each pair of images if (STP_stat != 1) goto cancel; if (Fescape) { // user cancel zmessage_post(Mwin,"parent",3,TX("function canceled")); goto cancel; } STP_adjust_dialog(); // combine images based on user inputs if (STP_stat != 1) goto cancel; CEF->Fmods++; // done CEF->Fsaved = 0; cim_add_meta_hist(); edit_done(0); goto cleanup; cancel: edit_cancel(0); cleanup: cim_free_memory(); // free memory for input files Fescape = 0; return; } // align each image 2nd-last to 1st image // cimPXMf[*] original image // cimPXMs[*] scaled and color adjusted for pixel comparisons // cimPXMw[*] warped for display void * STP_align(void *) { int imx, im1, im2, ww, hh, ii, nn; float R; Fbusy(+1); cimPano = 0; // no pano mode for (imx = 1; imx < cimNF; imx++) // loop 2nd to last image { im1 = 0; // images to align im2 = imx; cimAlignSize = 200; // initial alignment image size cimImageIncrease = 1.6; // size increase per align stage cimSearchRange = 16; // initial alignment search range cimMinSearchRange = 4; // minimum search range cimSearchStep = 1; // alignment search step cimWarpRange = 16; // initial alignment warp range cimMinWarpRange = 4; // minimum warp range cimWarpStep = 1; // alignment warp step memset(&cimOffs[im1],0,sizeof(cimoffs)); // initial image offsets = 0 memset(&cimOffs[im2],0,sizeof(cimoffs)); ww = cimPXMf[im1]->ww; // image dimensions hh = cimPXMf[im1]->hh; nn = ww; // use larger of ww, hh if (hh > ww) nn = hh; cimScale = cimAlignSize / nn; // initial align image size if (cimScale > 1.0) cimScale = 1.0; cimBlend = 0; // no blend width (use all) cim_get_overlap(im1,im2,cimPXMf); // get overlap area cim_match_colors(im1,im2,cimPXMf); // get color matching factors cimNsearch = 0; // align search counter while (true) // loop, increasing image size { cim_scale_image(im1,cimPXMs); // scale images to cimScale cim_scale_image(im2,cimPXMs); cim_adjust_colors(cimPXMs[im1],1); // apply color adjustments cim_adjust_colors(cimPXMs[im2],2); cim_warp_image(im1); // warp images for show cim_warp_image(im2); cim_get_overlap(im1,im2,cimPXMs); // get overlap area cim_get_redpix(im1); // get high-contrast pixels cimShowIm1 = im1; // show these two images cimShowIm2 = im2; // with 50/50 blend cimShowAll = 0; cim_show_images(1,0); // (x/y offsets can change) cim_align_images(im1,im2); // align im2 to im1 if (Fescape) goto finish; // user kill zfree(cimRedpix); // clear red pixels cimRedpix = 0; if (cimScale == 1.0) break; // done R = cimImageIncrease; // next larger image size cimScale = cimScale * R; if (cimScale > 0.85) { // if close to end, jump to end R = R / cimScale; cimScale = 1.0; } cimOffs[im1].xf *= R; // scale offsets for larger image cimOffs[im1].yf *= R; cimOffs[im2].xf *= R; cimOffs[im2].yf *= R; for (ii = 0; ii < 4; ii++) { cimOffs[im1].wx[ii] *= R; cimOffs[im1].wy[ii] *= R; cimOffs[im2].wx[ii] *= R; cimOffs[im2].wy[ii] *= R; } cimSearchRange = cimSearchRange / cimImageIncrease + 0.5; if (cimSearchRange < cimMinSearchRange) cimSearchRange = cimMinSearchRange; cimWarpRange = cimWarpRange / cimImageIncrease + 0.5; if (cimWarpRange < cimMinWarpRange) cimWarpRange = cimMinWarpRange; } cimOffs[im2].xf = cimOffs[im2].xf - cimOffs[im1].xf; // save im2 offsets from im1 cimOffs[im2].yf = cimOffs[im2].yf - cimOffs[im1].yf; cimOffs[im2].tf = cimOffs[im2].tf - cimOffs[im1].tf; } memset(&cimOffs[0],0,sizeof(cimoffs)); // image 0, no offsets finish: Fbusy(-1); STP_stat = 1; return 0; } // dialog to selectively paint output image int STP_image; // current image (0 based) int STP_radius; // paint mode radius int STP_mode; // 1/2 = show/hide float STP_show_adjust; // contrast adjustment float STP_hide_adjust; // contrast adjustment void STP_adjust_dialog() { zdialog *zd; ch imageN[8] = "imageN", labN[4] = "0"; int imx; int STP_adjust_dialog_event(zdialog *zd, ch *event); /*** _________________________________________ | Select and Paint Image | | | | image (o) 1 (o) 2 (o) 3 ... | | paint radius [___] | | | | transient objects | | show (o) =========[]================= | | hide (o) ==============[]============ | | | | [OK] [X] | |_________________________________________| ***/ zd = zdialog_new(TX("Select and Paint Image"),Mwin,"OK","X",null); zdialog_add_widget(zd,"hbox","hbim","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labim","hbim",TX("Image"),"space=5"); zdialog_add_widget(zd,"hbox","hbmr","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labr","hbmr",TX("Paint Radius"),"space=5"); zdialog_add_widget(zd,"zspin","radius","hbmr","1|400|1|100"); zdialog_add_widget(zd,"hbox","hbtrob","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labtob","hbtrob",TX("Transient Objects"),"space=5"); zdialog_add_widget(zd,"hbox","hbshow","dialog"); zdialog_add_widget(zd,"vbox","vbshow1","hbshow",0,"space=5"); zdialog_add_widget(zd,"vbox","vbshow2","hbshow",0,"expand"); zdialog_add_widget(zd,"radio","show","vbshow1",TX("Show")); zdialog_add_widget(zd,"radio","hide","vbshow1",TX("Hide")); zdialog_add_widget(zd,"hscale","show-adjust","vbshow2","0.0|1.0|0.001|0.9","expand"); zdialog_add_widget(zd,"hscale","hide-adjust","vbshow2","0.0|1.0|0.001|0.9","expand"); zdialog_add_widget(zd,"hbox","hbf1","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labf1","hbf1",TX("Press F1 for help"),"space=5"); zdialog_add_ttip(zd,"labim",TX("select image to show with mouse paint")); zdialog_add_ttip(zd,"show",TX("show transient objects")); zdialog_add_ttip(zd,"hide",TX("hide transient objects")); for (imx = 0; imx < cimNF; imx++) { // add radio button for each image imageN[5] = '1' + imx; labN[0] = '1' + imx; zdialog_add_widget(zd,"radio",imageN,"hbim",labN); } zdialog_stuff(zd,"image1",1); // initial image = 1st STP_image = 0; // initial image STP_radius = 100; // paint radius zdialog_stuff(zd,"show",1); // initial mode, show zdialog_stuff(zd,"hide",0); STP_mode = 1; STP_show_adjust = 0.9; // contrast adjustments STP_hide_adjust = 0.9; STP_map_pixels(0); takeMouse(STP_mousefunc,0); // connect mouse function zdialog_resize(zd,250,0); zdialog_run(zd,STP_adjust_dialog_event,"save"); // run dialog, parallel zdialog_wait(zd); // wait for completion zdialog_free(zd); return; } // dialog event and completion callback function int STP_adjust_dialog_event(zdialog *zd, ch *event) { int nn; if (zd->zstat) // dialog finish { freeMouse(); if (zd->zstat == 1) STP_stat = 1; else STP_stat = 0; if (STP_stat == 1) cim_trim(); // cut-off edges return 1; } if (strmatchN(event,"image",5)) { // image radio button nn = event[5] - '0'; // 1 to cimNF if (nn > 0 && nn <= cimNF) STP_image = nn - 1; // 0 to cimNF-1 } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(STP_mousefunc,0); // connect mouse function if (strmatch(event,"radius")) // change paint radius zdialog_fetch(zd,"radius",STP_radius); if (strmatch(event,"show-adjust")) { // contrast adjustment zdialog_fetch(zd,"show-adjust",STP_show_adjust); STP_map_pixels(0); } if (strmatch(event,"hide-adjust")) { // contrast adjustment zdialog_fetch(zd,"hide-adjust",STP_hide_adjust); STP_map_pixels(0); } if (zstrstr("show hide",event)) { // set show/hide mode zdialog_fetch(zd,"show",nn); if (nn) STP_mode = 1; zdialog_fetch(zd,"hide",nn); if (nn) STP_mode = 2; STP_map_pixels(0); } return 1; } // STP dialog mouse function void STP_mousefunc() { int radius, rect, radius2; int mx, my, dx, dy, px3, py3; radius = STP_radius; // paintbrush radius radius2 = radius * radius; rect = 2 * radius; // draw mouse selection circle draw_mousecircle(Mxposn,Myposn,radius,0,0); if (LMclick || RMclick) // mouse click return; // handle zoom normally if (! Mxdrag && ! Mydrag) return; mx = Mxdrag; // mouse drag my = Mydrag; Mxdrag = Mydrag = 0; if (mx < 0 || mx > E3pxm->ww-1 || my < 0 || my > E3pxm->hh-1) // mouse outside image area return; for (dy = -radius; dy <= radius; dy++) // loop pixels around mouse for (dx = -radius; dx <= radius; dx++) { if (dx*dx + dy*dy > radius2) continue; // outside radius px3 = mx + dx; // output pixel py3 = my + dy; if (px3 < 0 || px3 > E3pxm->ww-1) continue; // outside image if (py3 < 0 || py3 > E3pxm->hh-1) continue; if (Mbutton == 1) // left button STP_setpixel(px3,py3,STP_image); // paint chosen input image if (Mbutton == 3) // right button, set background STP_setpixel(px3,py3,-3); } Fpaint3(mx-radius,my-radius,rect,rect,0); // update window draw_mousecircle(mx,my,radius,0,0); // draw mouse selection circle return; } // show or suppress transient objects on top of background void * STP_map_pixels(void *) { void * STP_map_wthread(void *); STP_setpixel(0,0,-1); // initialization do_wthreads(STP_map_wthread,NSMP); // worker threads Fpaint2(); return 0; } void * STP_map_wthread(void *arg) // worker thread { int index = *((int *) arg); int px3, py3; for (py3 = index+1; py3 < E3pxm->hh-1; py3 += NSMP) // step through output pixels for (px3 = 1; px3 < E3pxm->ww-1; px3++) { if (STP_mode == 0) STP_setpixel(px3,py3,-2); // blend, all images equal if (STP_mode == 1) STP_setpixel(px3,py3,-4); // show, foreground + background if (STP_mode == 2) STP_setpixel(px3,py3,-3); // hide, background only } return 0; } // Set E3 image pixel for given pixel location and input source // source: -1 initialize: pre-calculate trig functions // -2 mix of all input images (blend) // -3 background only (median pixels) // -4 foreground (outlier pixels) + background // 0 - cimNF-1 specific input image (paint) void STP_setpixel(int px3, int py3, int source) { int imx, vstat; int ii, ns, ns1, ns2; int Rlist[10], Glist[10], Blist[10]; uint8 rl, gl, bl; float px, py, xoff, yoff; float *pix3, pix1[4], vpix[4]; float R, G, B, R2, G2, B2; float match, worstmatch; // sorted colors [N] --> low-hi range for central group // for 9 colors [xxxxxxxxx], the central group is ---xxx--- or range 3-5 from 0-8 // 0 1 2 3 4 5 6 7 8 9 10 int nsx[11][2] = { {0,0}, {0,0}, {0,0}, {1,1}, {1,2}, {2,2}, {2,3}, {3,3}, {3,4}, {4,4}, {4,5} }; static float sintf[10], costf[10]; pix3 = PXMpix(E3pxm,px3,py3); // output pixel if (source >= 0 && source < cimNF) // specific input image { imx = source; xoff = cimOffs[imx].xf; yoff = cimOffs[imx].yf; px = costf[imx] * (px3 - xoff) + sintf[imx] * (py3 - yoff); // input virtual pixel py = costf[imx] * (py3 - yoff) - sintf[imx] * (px3 - xoff); vstat = vpixel(cimPXMw[imx],px,py,vpix); if (vstat) memcpy(pix3,vpix,pixcc); return; } if (source == -1) { // pre-calculate trig funcs for (imx = 0; imx < cimNF; imx++) { sintf[imx] = sinf(cimOffs[imx].tf); costf[imx] = cosf(cimOffs[imx].tf); } return; } if (source == -2) // blend all input images { R = G = B = 0; ns = 0; for (imx = 0; imx < cimNF; imx++) { xoff = cimOffs[imx].xf; yoff = cimOffs[imx].yf; px = costf[imx] * (px3 - xoff) + sintf[imx] * (py3 - yoff); py = costf[imx] * (py3 - yoff) - sintf[imx] * (px3 - xoff); vstat = vpixel(cimPXMw[imx],px,py,vpix); if (vstat) { R += vpix[0]; G += vpix[1]; B += vpix[2]; ns++; } } pix3[0] = R / ns; pix3[1] = G / ns; pix3[2] = B / ns; return; } if (source == -3) // background only { if (cimNF < 3) return; for (imx = ns = 0; imx < cimNF; imx++) // get aligned input pixels { xoff = cimOffs[imx].xf; yoff = cimOffs[imx].yf; px = costf[imx] * (px3 - xoff) + sintf[imx] * (py3 - yoff); py = costf[imx] * (py3 - yoff) - sintf[imx] * (px3 - xoff); vstat = vpixel(cimPXMw[imx],px,py,vpix); if (vstat) { Rlist[ns] = vpix[0]; // add pixel RGB values to list Glist[ns] = vpix[1]; Blist[ns] = vpix[2]; ns++; } } if (ns < 3) return; HeapSort(Rlist,ns); // sort RGB values HeapSort(Glist,ns); HeapSort(Blist,ns); R = G = B = 0; ns1 = nsx[ns][0]; // middle group of pixels ns2 = nsx[ns][1]; for (ii = ns1; ii <= ns2; ii++) { R += Rlist[ii]; G += Glist[ii]; B += Blist[ii]; } ns = ns2 - ns1 + 1; // sample count R = R / ns; // middle group average G = G / ns; B = B / ns; R2 = G2 = B2 = 0; ns2 = 0; for (ii = 0; ii < ns; ii++) // get pixels matching middle group { rl = Rlist[ii]; gl = Glist[ii]; bl = Blist[ii]; match = RGBmatch(R,G,B,rl,gl,bl); if (match > STP_hide_adjust) { // match threshold R2 += Rlist[ii]; G2 += Glist[ii]; B2 += Blist[ii]; ns2++; } } pix3[0] = (R * ns + R2) / (ns + ns2); // mean background pixel pix3[1] = (G * ns + G2) / (ns + ns2); pix3[2] = (B * ns + B2) / (ns + ns2); return; } if (source == -4) // show foreground pixel { STP_setpixel(px3,py3,-3); // set pix3 to background worstmatch = 1.0; for (imx = 0; imx < cimNF; imx++) // loop aligned input pixels { xoff = cimOffs[imx].xf; yoff = cimOffs[imx].yf; px = costf[imx] * (px3 - xoff) + sintf[imx] * (py3 - yoff); py = costf[imx] * (py3 - yoff) - sintf[imx] * (px3 - xoff); vstat = vpixel(cimPXMw[imx],px,py,vpix); if (! vstat) continue; match = PIXmatch(vpix,pix3); // find worst match to background if (match < worstmatch) { worstmatch = match; memcpy(pix1,vpix,pixcc); } } if (worstmatch < STP_show_adjust) memcpy(pix3,pix1,pixcc); return; } } /************************************************************************************** Stack/Noise function Combine multiple photos of the same subject and average the pixels for noise reduction. **************************************************************************************/ int STN_stat; // 1 = OK, 0 = failed or canceled int STN_average = 1, STN_median = 0; // use average/median of input pixels int STN_exlow = 0, STN_exhigh = 0; // exclude low/high pixel void * STN_align(void *); void STN_adjust_dialog(); void * STN_combine(void *); editfunc EFstn; // edit function data // menu function void m_stack_noise(GtkWidget *, ch *menu) { int err; F1_help_topic = TX("STACK/NOISE"); printf("m_stack_noise \n"); if (CEF) { zmessageACK(Mwin,TX("finish or cancel pending edit")); return; } if (Fblock("stack/noise")) return; // check for blocking function Fblock(0); cimNF = cim_get_files(2,10); // get 2-10 files if (! cimNF) return; if (! cim_load_files()) return; // load and check all files if (! cim_check_files(0.02)) return; // check files are compatible free_resources(); // ready to commit cim_manualwarp = 0; err = f_open(cimFile[cimLF]); // curr_file = alphabetically last if (err) goto cleanup; EFstn.menufunc = m_stack_noise; EFstn.menuname = "Stack/Noise"; if (! edit_setup(EFstn)) goto cleanup; // setup edit (will lock) Fescape = 0; STN_align(0); // align each pair of images if (STN_stat != 1) goto cancel; if (Fescape) { // user cancel zmessage_post(Mwin,"parent",3,TX("function canceled")); goto cancel; } STN_adjust_dialog(); // combine images based on user inputs if (STN_stat != 1) goto cancel; CEF->Fmods++; // done CEF->Fsaved = 0; cim_add_meta_hist(); edit_done(0); goto cleanup; cancel: edit_cancel(0); cleanup: cim_free_memory(); // free memory for input files Fescape = 0; return; } // align each image 2nd-last to 1st image // cimPXMf[*] original image // cimPXMs[*] scaled and color adjusted for pixel comparisons // cimPXMw[*] warped for display void * STN_align(void *) { int imx, im1, im2, ww, hh, ii, nn; float R; Fbusy(+1); cimPano = 0; // no pano mode for (imx = 1; imx < cimNF; imx++) // loop 2nd to last image { im1 = 0; // images to align im2 = imx; cimAlignSize = 200; // initial alignment image size cimImageIncrease = 1.6; // size increase per align stage cimSearchRange = 16; // initial alignment search range cimMinSearchRange = 4; // minimum search range cimSearchStep = 1; // alignment search step cimWarpRange = 16; // initial alignment warp range cimMinWarpRange = 4; // minimum warp range cimWarpStep = 1; // alignment warp step memset(&cimOffs[im1],0,sizeof(cimoffs)); // initial image offsets = 0 memset(&cimOffs[im2],0,sizeof(cimoffs)); ww = cimPXMf[im1]->ww; // image dimensions hh = cimPXMf[im1]->hh; nn = ww; // use larger of ww, hh if (hh > ww) nn = hh; cimScale = cimAlignSize / nn; // initial align image size if (cimScale > 1.0) cimScale = 1.0; cimBlend = 0; // no blend width (use all) cim_get_overlap(im1,im2,cimPXMf); // get overlap area cim_match_colors(im1,im2,cimPXMf); // get color matching factors while (true) // loop, increasing image size { cim_scale_image(im1,cimPXMs); // scale images to cimScale cim_scale_image(im2,cimPXMs); cim_adjust_colors(cimPXMs[im1],1); // apply color adjustments cim_adjust_colors(cimPXMs[im2],2); cim_warp_image(im1); // warp images for show cim_warp_image(im2); cim_get_overlap(im1,im2,cimPXMs); // get overlap area cim_get_redpix(im1); // get high-contrast pixels cimShowIm1 = im1; // show these two images cimShowIm2 = im2; // with 50/50 blend cimShowAll = 0; cim_show_images(1,0); // (x/y offsets can change) cim_align_images(im1,im2); // align im2 to im1 if (Fescape) goto finish; // user kill zfree(cimRedpix); // clear red pixels cimRedpix = 0; if (cimScale == 1.0) break; // done R = cimImageIncrease; // next larger image size cimScale = cimScale * R; if (cimScale > 0.85) { // if close to end, jump to end R = R / cimScale; cimScale = 1.0; } cimOffs[im1].xf *= R; // scale offsets for larger image cimOffs[im1].yf *= R; cimOffs[im2].xf *= R; cimOffs[im2].yf *= R; for (ii = 0; ii < 4; ii++) { cimOffs[im1].wx[ii] *= R; cimOffs[im1].wy[ii] *= R; cimOffs[im2].wx[ii] *= R; cimOffs[im2].wy[ii] *= R; } cimSearchRange = cimSearchRange / cimImageIncrease + 0.5; if (cimSearchRange < cimMinSearchRange) cimSearchRange = cimMinSearchRange; cimWarpRange = cimWarpRange / cimImageIncrease + 0.5; if (cimWarpRange < cimMinWarpRange) cimWarpRange = cimMinWarpRange; } cimOffs[im2].xf = cimOffs[im2].xf - cimOffs[im1].xf; // save im2 offsets from im1 cimOffs[im2].yf = cimOffs[im2].yf - cimOffs[im1].yf; cimOffs[im2].tf = cimOffs[im2].tf - cimOffs[im1].tf; } memset(&cimOffs[0],0,sizeof(cimoffs)); finish: Fbusy(-1); STN_stat = 1; return 0; } // change pixel combination according to user input void STN_adjust_dialog() { zdialog *zd; int STN_adjust_dialog_event(zdialog *zd, ch *event); /*** _________________________________________ | Adjust Pixel Composition | | | | (o) use average (o) use median | | [x] omit low pixel [x] omit high pixel | | | | [OK] [X] | |_________________________________________| ***/ zd = zdialog_new(TX("Adjust Pixel Composition"),Mwin,"OK","X",null); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"radio","average","hb1",TX("use average"),"space=3"); zdialog_add_widget(zd,"radio","median","hb1",TX("use median"),"space=3"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=3"); zdialog_add_widget(zd,"check","exlow","hb2",TX("omit low pixel"),"space=3"); zdialog_add_widget(zd,"check","exhigh","hb2",TX("omit high pixel"),"space=3"); zdialog_stuff(zd,"average",1); // default = average zdialog_stuff(zd,"median",0); zdialog_stuff(zd,"exlow",0); zdialog_stuff(zd,"exhigh",0); STN_average = 1; STN_median = 0; STN_exlow = 0; STN_exhigh = 0; STN_combine(0); zdialog_resize(zd,250,0); zdialog_run(zd,STN_adjust_dialog_event,"save"); // run dialog, parallel zdialog_wait(zd); // wait for completion zdialog_free(zd); return; } // dialog event and completion callback function int STN_adjust_dialog_event(zdialog *zd, ch *event) { if (zd->zstat) { // dialog finish if (zd->zstat == 1) STN_stat = 1; else STN_stat = 0; if (STN_stat == 1) cim_trim(); // trim edges return 1; } if (strmatch(event,"average")) { zdialog_fetch(zd,"average",STN_average); STN_combine(0); } if (strmatch(event,"median")) { zdialog_fetch(zd,"median",STN_median); STN_combine(0); } if (strmatch(event,"exlow")) { zdialog_fetch(zd,"exlow",STN_exlow); STN_combine(0); } if (strmatch(event,"exhigh")) { zdialog_fetch(zd,"exhigh",STN_exhigh); STN_combine(0); } return 1; } // compute mean/median mix for each output pixel and update E3 image void * STN_combine(void *) { void * STN_combine_wthread(void *arg); // worker thread do_wthreads(STN_combine_wthread,NSMP); // worker threads Fpaint2(); // update window return 0; } // worker thread void * STN_combine_wthread(void *arg) { int index = *((int *) arg); int imx, vstat, px3, py3; float red, green, blue; // float int ii, ns, ns1, ns2; int Rlist[10], Glist[10], Blist[10]; float px, py; float xoff, yoff, sintf[10], costf[10]; float *pix3, vpix[4]; // sorted colors [N] --> low-hi range for median group // 0 1 2 3 4 5 6 7 8 9 10 int nsx[11][2] = { {0,0}, {0,0}, {0,1}, {1,1}, {1,2}, {2,2}, {2,3}, {3,3}, {3,4}, {4,4}, {4,5} }; for (imx = 0; imx < cimNF; imx++) // pre-calculate trig funcs { sintf[imx] = sinf(cimOffs[imx].tf); costf[imx] = cosf(cimOffs[imx].tf); } for (py3 = index+1; py3 < E3pxm->hh-1; py3 += NSMP) // step through output pixels for (px3 = 1; px3 < E3pxm->ww-1; px3++) { for (imx = ns = 0; imx < cimNF; imx++) // get aligned input pixels { xoff = cimOffs[imx].xf; yoff = cimOffs[imx].yf; px = costf[imx] * (px3 - xoff) + sintf[imx] * (py3 - yoff); py = costf[imx] * (py3 - yoff) - sintf[imx] * (px3 - xoff); vstat = vpixel(cimPXMw[imx],px,py,vpix); if (vstat) { Rlist[ns] = vpix[0]; // add pixel RGB values to list Glist[ns] = vpix[1]; Blist[ns] = vpix[2]; ns++; } } if (! ns) continue; if (STN_exlow || STN_exhigh || STN_median) { // RGB values must be sorted HeapSort(Rlist,ns); HeapSort(Glist,ns); HeapSort(Blist,ns); } red = green = blue = 0; if (STN_average) // average the input pixels { ns1 = 0; // low and high RGB values ns2 = ns - 1; if (STN_exlow) { // exclude low ns1++; if (ns1 > ns2) ns1--; } if (STN_exhigh) { // exclude high ns2--; if (ns1 > ns2) ns2++; } for (ii = ns1; ii <= ns2; ii++) // sum remaining RGB levels { red += Rlist[ii]; green += Glist[ii]; blue += Blist[ii]; } ns = ns2 - ns1 + 1; // sample count red = red / ns; // output RGB = average green = green / ns; blue = blue / ns; } if (STN_median) // use median input pixels { ns1 = nsx[ns][0]; // middle group of pixels ns2 = nsx[ns][1]; for (ii = ns1; ii <= ns2; ii++) { red += Rlist[ii]; green += Glist[ii]; blue += Blist[ii]; } ns = ns2 - ns1 + 1; // sample count red = red / ns; // output RGB = average green = green / ns; blue = blue / ns; } pix3 = PXMpix(E3pxm,px3,py3); // output pixel pix3[0] = red; pix3[1] = green; pix3[2] = blue; } return 0; } /************************************************************************************** Stack/layers function Stack images of exactly the same size with no automatic alignment. Choose images and mix ratios to use for each output area by mouse painting. **************************************************************************************/ namespace STL_names { float imageR[10]; // image blend ratios float imageC[10]; // image coefficients (sum = 1) int STL_mode; // 1/2 = all/mouse area int mouseRad; // mouse radius int powerCen, powerEdge; // mouse opacity, center and edge int STL_stat; editfunc EFSTL; // edit function data } // menu function void m_stack_layers(GtkWidget *, ch *menu) { using namespace STL_names; void STL_mousefunc(); void STL_paint(); int err; F1_help_topic = TX("STACK/LAYERS"); printf("m_stack_layers \n"); if (CEF) { zmessageACK(Mwin,TX("finish or cancel pending edit")); return; } if (Fblock("stack/layers")) return; // check for blocking function Fblock(0); cimNF = cim_get_files(2,10); // get 2-10 files if (! cimNF) return; if (! cim_load_files()) return; // load and check all files if (! cim_check_files(0.0)) return; // check files are compatible free_resources(); // ready to commit err = f_open(cimFile[cimLF]); // curr_file = alphabetically last if (err) goto cleanup; EFSTL.menufunc = m_stack_layers; EFSTL.menuname = "Stack/layers"; EFSTL.mousefunc = STL_mousefunc; if (! edit_setup(EFSTL)) goto cleanup; // setup edit (will lock) STL_paint(); // combine images based on user inputs if (STL_stat != 1) goto cancel; CEF->Fmods++; // done CEF->Fsaved = 0; cim_add_meta_hist(); edit_done(0); goto cleanup; cancel: edit_cancel(0); cleanup: cim_free_memory(); // free memory for input files return; } // dialog to paint output image areas with selected input images void STL_paint() { using namespace STL_names; void STL_paintall(); int STL_paint_dialog_event(zdialog *zd, ch *event); void STL_mousefunc(); zdialog *zd; ch imageN[8]; int imx; float sum; /*** ______________________________________ | Select and Paint Image | | | | Image Ratios [10] [40] [20] ... | // imageR[] blend ratios | (o) Paint entire image | // STL_mode 1 | (o) Paint within mouse | // STL_mode 2 | Mouse Radius [___] | // mouseRad | Power Center [__] Edge [__] | // powerCen, powerEdge | | | [OK] [X] | |______________________________________| ***/ zd = zdialog_new(TX("Select and Paint Image"),Mwin,"OK","X",null); // image ratio spin buttons zdialog_add_widget(zd,"hbox","hbim","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labim","hbim",TX("Image Ratios"),"space=3"); for (imx = 0; imx < cimNF; imx++) { // button name = image0, image1 ... snprintf(imageN,8,"image%d",imx); zdialog_add_widget(zd,"zspin",imageN,"hbim","0|100|1|10","space=5"); imageR[imx] = 10; // initial value } zdialog_add_widget(zd,"radio","mode1","dialog", // paint all radio button TX("Paint entire image"),"space=5"); zdialog_add_widget(zd,"radio","mode2","dialog", // paint within mouse radio button TX("Paint within mouse"),"space=1"); zdialog_add_widget(zd,"hbox","hbrad","dialog",0,"space=1"); // mouse radius spin button zdialog_add_widget(zd,"label","space","hbrad",0,"space=10"); zdialog_add_widget(zd,"label","labrad","hbrad",TX("Mouse Radius"),"space=3"); zdialog_add_widget(zd,"zspin","mouseRad","hbrad","0|500|1|100","space=3"); zdialog_add_widget(zd,"hbox","hbpow","dialog",0,"space=1"); // power center spin button zdialog_add_widget(zd,"label","space","hbpow",0,"space=10"); zdialog_add_widget(zd,"label","labcen","hbpow",TX("Power Center"),"space=3"); zdialog_add_widget(zd,"zspin","powerCen","hbpow","0|100|1|100","space=3"); zdialog_add_widget(zd,"label","space","hbpow",0,"space=10"); // power edge spin button zdialog_add_widget(zd,"label","labedge","hbpow",TX("Edge"),"space=3"); zdialog_add_widget(zd,"zspin","powerEdge","hbpow","0|100|1|10","space=3"); zdialog_stuff(zd,"mode1",1); // select STL_mode 1 zdialog_stuff(zd,"mode2",0); STL_mode = 1; // initially blend all images mouseRad = 100; // initial mouse radius powerCen = 100; // initial mouse power powerEdge = 10; for (sum = imx = 0; imx < cimNF; imx++) // sum image blend factors sum += imageR[imx]; if (sum < 1) sum = 1; for (imx = 0; imx < cimNF; imx++) // image coefficients (sum = 1) imageC[imx] = imageR[imx] / sum; STL_paintall(); // initial output image takeMouse(STL_mousefunc,0); // connect mouse function zdialog_run(zd,STL_paint_dialog_event,"save"); // run dialog, parallel zdialog_wait(zd); // wait for completion zdialog_free(zd); return; } // dialog event and completion callback function int STL_paint_dialog_event(zdialog *zd, ch *event) { using namespace STL_names; void STL_mousefunc(); void STL_paintall(); int nn, imx; float sum; if (zd->zstat) // dialog finish { freeMouse(); if (zd->zstat == 1) STL_stat = 1; // user OK or cancel else STL_stat = 0; return 1; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(STL_mousefunc,0); // connect mouse function if (strmatchN(event,"image",5)) { // image spin button nn = event[5] - '0'; // 0 - N zdialog_fetch(zd,event,imageR[nn]); // new image blend ratio } zdialog_fetch(zd,"mouseRad",mouseRad); // mouse radius zdialog_fetch(zd,"powerCen",powerCen); // power center zdialog_fetch(zd,"powerEdge",powerEdge); // power edge for (sum = imx = 0; imx < cimNF; imx++) // sum image blend factors sum += imageR[imx]; if (sum < 1) sum = 1; for (imx = 0; imx < cimNF; imx++) // set image coefficients (sum = 1) imageC[imx] = imageR[imx] / sum; zdialog_fetch(zd,"mode1",nn); if (nn) STL_mode = 1; // paint entire image else STL_mode = 2; // paint within mouse if (STL_mode == 1) // paint entire image { Fbusy(+1); STL_paintall(); Fbusy(-1); } return 1; } // function for painting entire image void STL_paintall() { using namespace STL_names; void * STL_paintall_thread(void *); do_wthreads(STL_paintall_thread,NSMP); Fpaint2(); return; } // working threads void * STL_paintall_thread(void *arg) { using namespace STL_names; void STL_setpixel(int px, int py, float opacity); int index = *((int *) arg); int px, py; for (py = index; py < Ehh; py += NSMP) for (px = 0; px < Eww; px++) STL_setpixel(px,py,1.0); return 0; } // STL dialog mouse function void STL_mousefunc() { using namespace STL_names; void STL_setpixel(int px, int py, float opacity); int rect; int mx, my, dx, dy, px, py; float radius, pixrad; float opacity, slope; if (STL_mode != 2) return; // not mouse paint mode if (LMclick || RMclick) return; // mouse click, handle zoom normally radius = mouseRad; // paintbrush radius draw_mousecircle(Mxposn,Myposn,radius,0,0); // draw mouse circle if (! Mxdrag && ! Mydrag) return; // motion event slope = 0.01 * (powerCen - powerEdge) / radius; // 100 .. 50 --> m = -0.5/radius mx = Mxdrag; // mouse drag my = Mydrag; Mxdrag = Mydrag = 0; for (dy = -radius; dy <= radius; dy++) // loop pixels around mouse for (dx = -radius; dx <= radius; dx++) { pixrad = sqrtf(dx*dx + dy*dy); if (pixrad > radius) continue; // outside radius px = mx + dx; // output pixel py = my + dy; if (px < 0 || px > Eww-1) continue; // outside image if (py < 0 || py > Ehh-1) continue; opacity = 0.01 * powerCen - slope * pixrad; // opacity at pixel radius opacity *= 0.1; // slow down STL_setpixel(px,py,opacity); } rect = 2 * radius; // draw mouse selection circle Fpaint3(mx-radius,my-radius,rect,rect,0); // update window draw_mousecircle(mx,my,radius,0,0); // draw mouse selection circle return; } // Set E3 image pixel for given pixel location and input source void STL_setpixel(int px, int py, float opacity) { using namespace STL_names; int imx; float *pix3, *pix1; float R1, G1, B1; R1 = G1 = B1 = 0; for (imx = 0; imx < cimNF; imx++) // loop input images { pix1 = PXMpix(cimPXMf[imx],px,py); // pixel for input image R1 += imageC[imx] * pix1[0]; // sum RGB part for this image G1 += imageC[imx] * pix1[1]; B1 += imageC[imx] * pix1[2]; } pix3 = PXMpix(E3pxm,px,py); // output pixel if (opacity == 1.0) { pix3[0] = R1; pix3[1] = G1; pix3[2] = B1; } else { pix3[0] = opacity * R1 + (1.0 - opacity) * pix3[0]; pix3[1] = opacity * G1 + (1.0 - opacity) * pix3[1]; pix3[2] = opacity * B1 + (1.0 - opacity) * pix3[2]; } return; } /************************************************************************************** Panorama function: join 2-6 images horizontally ***************************************************************************************/ int panStat; // 1 = OK zdialog *panozd = 0; // pre-align dialog float pano_lens_mm = 30; // lens focal length (35mm equiv.) (default) float pano_image_mm; // lens focal length at image scale int FpanoNC; // pano no-curve flag (scanned image) float panPreAlignSize = 1400; // pre-align image size (ww) float panPreAlignBlend = 0.20; // pre-align blend width * ww float panInitBlend = 0.20; // initial auto-align blend width float panFinalBlend = 0.08; // min. final blend width * ww float panBlendDecrease = 0.7; // blend width reduction per align cycle float pano_adjust_brite[6]; // user brightness adjustments per image int pano_mousewarp = 0; // use mouse to warp/align images int pano_currimage = 0; // curr. image for color/warp adjustments float *panowarpx[6], *panowarpy[6]; // warp memory, pixel displacements PXM *cimPXMwdup[6]; // copies of images before mouse warps PXM *preflatPXM; // copy of E3pxm before flatten void pano_prealign(); // manual pre-align void pano_align(); // auto fine-align void pano_curve_image(int im); // curve images using pano_lens_mm void pano_adjust(); // user color adjust dialog void pano_adjust_colors(PXM *pxm, int fwhich); // adjust pano colors from match data void pano_flatten_image(float F); // flatten panorama image void panowarp_mousefunc(); // image warp mouse function void panowarp_dowarps(int imx); editfunc EFpano; // edit function data // menu function void m_panorama(GtkWidget *, ch *menu) { int err; F1_help_topic = TX("PANORAMA"); printf("m_panorama \n"); if (CEF) { zmessageACK(Mwin,TX("finish or cancel pending edit")); return; } if (Fblock("panorama")) return; // check for blocking function Fblock(0); cimNF = cim_get_files(2,6); // get 2-6 files if (! cimNF) return; if (! cim_load_files()) return; // load and check all files free_resources(); // ready to commit cim_manualwarp = 0; pano_mousewarp = 0; cim_manualalign = 0; err = f_open(cimFile[cimLF]); // curr_file = alphabetically last if (err) goto cleanup; EFpano.menufunc = m_panorama; EFpano.menuname = "Panorama"; EFpano.mousefunc = panowarp_mousefunc; if (! edit_setup(EFpano)) goto cleanup; // setup edit (will lock) cimShowAll = 1; // for cim_show_images(), show all cimPano = 1; // horizontal pano mode Fescape = 0; pano_prealign(); // manual pre-alignment if (panStat != 1) goto cancel; pano_align(); // auto full alignment if (panStat != 1) goto cancel; pano_adjust(); // manual color adjustment if (panStat != 1) goto cancel; CEF->Fmods++; // done CEF->Fsaved = 0; cim_add_meta_hist(); edit_done(0); goto cleanup; cancel: // failed or canceled edit_cancel(0); if (Fescape) // user cancel zmessage_post(Mwin,"parent",3,TX("function canceled")); cleanup: cim_free_memory(); // free memory for input files Fescape = 0; return; } // perform manual pre-align of all images // returns alignment data in cimOffs[*] // pano_lens_mm may also be altered void pano_prealign() { int pano_prealign_event(zdialog *zd, ch *event); // dialog event function void pano_prealign_mousefunc(); int imx, ww, err = 0; ch *metatag[2] = { meta_fl35_tag, meta_flen_tag }; ch *pp[2] = { 0, 0 }; ch *lens_source; float temp; ch *align_mess = TX("Drag images into rough alignment.\n" "To rotate, drag from lower edge."); ch *scan_mess = TX("no curve (scanned image)"); err = 1; lens_source = "(no metadata)"; meta_get(curr_file,(ch **) metatag,pp,2); // get lens mm from metadata if available if (pp[0]) err = convSF(pp[0], temp, 20, 1000); // try both tags else if (pp[1]) err = convSF(pp[1], temp, 20, 1000); if (! err) { pano_lens_mm = temp; lens_source = "(metadata)"; } for (imx = 0; imx < 10; imx++) // set all alignment offsets = 0 memset(&cimOffs[imx],0,sizeof(cimoffs)); for (imx = ww = 0; imx < cimNF; imx++) // sum image widths ww += cimPXMf[imx]->ww; cimScale = 1.4 * panPreAlignSize / ww; // set alignment image scale if (cimScale > 1.0) cimScale = 1.0; // (* 0.7 after overlaps) for (imx = 0; imx < cimNF; imx++) // scale images > cimPXMs[*] cim_scale_image(imx,cimPXMs); for (imx = 0; imx < cimNF; imx++) { // curve images, cimPXMs[*] replaced pano_curve_image(imx); cimPXMw[imx] = PXM_copy(cimPXMs[imx]); // copy to cimPXMw[*] for display } cimOffs[0].xf = cimOffs[0].yf = 0; // first image at (0,0) for (imx = 1; imx < cimNF; imx++) // position images with 30% overlap { // in horizontal row cimOffs[imx].xf = cimOffs[imx-1].xf + 0.7 * cimPXMw[imx-1]->ww; cimOffs[imx].yf = cimOffs[imx-1].yf; } cimBlend = panPreAlignBlend * cimPXMw[1]->ww; // overlap in align window cim_show_images(1,0); // combine and show images in main window /* ______________________________________ | Pre-align Images | | | | Drag images into rough alignment. | | To rotate, drag from lower edge. | | | | [ 35.5 ] lens mm (metadata) | | [x] no curve (scanned image) | | [x] no auto warp | | [x] manual align | | Press F1 for help | | | | [Proceed] [X] | |______________________________________| */ panozd = zdialog_new(TX("Pre-align Images"),Mwin,TX("Proceed"),"X",null); // start pre-align dialog zdialog_add_widget(panozd,"label","lab1","dialog",align_mess,"space=3"); zdialog_add_widget(panozd,"hbox","hb1","dialog",0); zdialog_add_widget(panozd,"zspin","spmm","hb1","20|999|0.1|35","space=5"); zdialog_add_widget(panozd,"label","labmm","hb1",TX("lens mm")); zdialog_add_widget(panozd,"label","labsorc","hb1","","space=5"); zdialog_add_widget(panozd,"hbox","hbnc","dialog"); zdialog_add_widget(panozd,"check","nocurve","hbnc",scan_mess,"space=5"); zdialog_add_widget(panozd,"hbox","hbmw","dialog"); zdialog_add_widget(panozd,"check","manwarp","hbmw",TX("no auto warp"),"space=5"); zdialog_add_widget(panozd,"hbox","hbma","dialog"); zdialog_add_widget(panozd,"check","manalign","hbma",TX("manual align"),"space=5"); zdialog_add_widget(panozd,"hbox","hbf1","dialog",0,"space=5"); zdialog_add_widget(panozd,"label","labf1","hbf1",TX("Press F1 for help"),"space=5"); zdialog_add_ttip(panozd,"manwarp",TX("do not warp images during auto-alignment")); zdialog_stuff(panozd,"spmm",pano_lens_mm); // stuff lens data zdialog_stuff(panozd,"labsorc",lens_source); // show source of lens data zdialog_stuff(panozd,"nocurve",FpanoNC); zdialog_stuff(panozd,"manwarp",0); panStat = -1; // busy status zdialog_run(panozd,pano_prealign_event,"save"); // start dialog takeMouse(pano_prealign_mousefunc,dragcursor); // connect mouse zdialog_wait(panozd); // wait for dialog completion zdialog_free(panozd); // free dialog freeMouse(); return; } // pre-align dialog event function int pano_prealign_event(zdialog *zd, ch *event) { int imx, fchange = 0; float overlap; ch *metatag[1] = { meta_fl35_tag }; ch *metadata[1]; ch lensdata[8]; if (strmatch(event,"spmm")) { zdialog_fetch(zd,"spmm",pano_lens_mm); // get revised lens data fchange = 1; } if (strmatch(event,"nocurve")) { zdialog_fetch(zd,"nocurve",FpanoNC); // get "no-curve" option fchange = 1; } if (fchange) // re-curve images { for (imx = 0; imx < cimNF; imx++) { cim_scale_image(imx,cimPXMs); pano_curve_image(imx); PXM_free(cimPXMw[imx]); cimPXMw[imx] = PXM_copy(cimPXMs[imx]); } cim_show_images(1,0); // combine and show images return 1; } if (strmatch(event,"manwarp")) // get auto/manual warp option zdialog_fetch(zd,"manwarp",cim_manualwarp); if (strmatch(event,"manalign")) // get auto/manual align option zdialog_fetch(zd,"manalign",cim_manualalign); if (strmatch(event,"save")) { // put lens data into dialog zdialog_stuff(zd,"spmm",pano_lens_mm); snprintf(lensdata,8,"%d",int(pano_lens_mm)); metadata[0] = lensdata; for (imx = 0; imx < cimNF; imx++) // save lens mm in metadata meta_put(cimFile[imx],(ch **) metatag,metadata,1); } if (zd->zstat) // dialog complete { if (zd->zstat != 1) { // cancel or other panStat = 0; return 1; } m_zoom(0,"fit"); // reset poss. user zoom-in for (imx = 0; imx < cimNF-1; imx++) // check for enough overlap { overlap = cim_get_overlap(imx,imx+1,cimPXMs); if (overlap < panFinalBlend && ! cim_manualalign) { zmessageACK(Mwin,TX("Too little overlap, cannot align")); panStat = 0; return 1; } } panStat = 1; } return 1; } // pre-align mouse function // convert mouse and KB events into image movements void pano_prealign_mousefunc() { cimoffs offstemp; PXM *pxmtemp; ch *ftemp; static int im1, im2, imm, imx; static int mx0, my0, mx, my; // mouse drag origin, position static int xoff, yoff, lox, hix; static int hh, rotate, midx; int sepx, minsep = 9999; float dx, dy, t1, t2, dt; cimBlend = 0; // full blend during pre-align if (! Mxdrag && ! Mydrag) // no drag underway mx0 = my0 = 0; // reset drag origin if (Mxdrag || Mydrag) // mouse drag underway { mx = Mxdrag; // mouse position in image my = Mydrag; Mxdrag = Mydrag = 0; if (! mx0 && ! my0) // new drag { mx0 = mx; // set drag origin my0 = my; for (imx = 0; imx < cimNF; imx++) // find image with midpoint { // closest to mouse x lox = cimOffs[imx].xf; hix = lox + cimPXMw[imx]->ww; midx = (lox + hix) / 2; sepx = abs(midx - mx0); if (sepx < minsep) { minsep = sepx; imm = imx; // image to drag or rotate } } xoff = cimOffs[imm].xf; yoff = cimOffs[imm].yf; hh = cimPXMw[imm]->hh; rotate = 0; // if drag at bottom edge, if (my0 > yoff + 0.85 * hh) rotate = 1; // set rotate flag } if (mx != mx0 || my != my0) // drag is progressing { dx = mx - mx0; // mouse movement dy = my - my0; if (rotate && my0 > yoff && my > yoff) // rotation { if (imm > 0) { lox = cimOffs[imm].xf; // if there is an image to the left, hix = cimOffs[imm-1].xf + cimPXMw[imm-1]->ww; // midx = midpoint of overlap midx = (lox + hix) / 2; } else midx = 0; // this is the leftmost image t1 = atan(1.0 * (mx0-xoff) / (my0-yoff)); t2 = atan(1.0 * (mx-xoff) / (my-yoff)); dt = t1 - t2; // angle change dx = dt * (hh/2 + yoff); // pivot = middle of overlap on left dy = -dt * (midx-xoff); } else dt = 0; // x/y drag cimOffs[imm].xf += dx; // update image cimOffs[imm].yf += dy; cimOffs[imm].tf += dt; xoff = cimOffs[imm].xf; yoff = cimOffs[imm].yf; mx0 = mx; // next drag origin = current mouse my0 = my; cim_show_images(0,0); // show combined images } } for (im1 = 0; im1 < cimNF-1; im1++) // track image order changes { im2 = im1 + 1; if (cimOffs[im2].xf < cimOffs[im1].xf) { ftemp = cimFile[im2]; // switch filespecs cimFile[im2] = cimFile[im1]; cimFile[im1] = ftemp; pxmtemp = cimPXMf[im2]; // switch images cimPXMf[im2] = cimPXMf[im1]; cimPXMf[im1] = pxmtemp; pxmtemp = cimPXMs[im2]; // scaled images cimPXMs[im2] = cimPXMs[im1]; cimPXMs[im1] = pxmtemp; pxmtemp = cimPXMw[im2]; // warped images cimPXMw[im2] = cimPXMw[im1]; cimPXMw[im1] = pxmtemp; offstemp = cimOffs[im2]; // offsets cimOffs[im2] = cimOffs[im1]; cimOffs[im1] = offstemp; if (imm == im1) imm = im2; // current drag image else if (imm == im2) imm = im1; break; } } return; } // fine-alignment // start with very small image size // search around offset values for best match // increase image size and loop until full-size void pano_align() { int imx, im1, im2, ww; float R, dx, dy, dt; float overlap; cimoffs offsets0; Fbusy(+1); cimAlignSize = 200; // initial alignment image size for (imx = 0; imx < cimNF; imx++) { cimOffs[imx].xf = cimOffs[imx].xf / cimScale; // scale x/y offsets for full-size images cimOffs[imx].yf = cimOffs[imx].yf / cimScale; } cimScale = 1.0; // full-size for (imx = 0; imx < cimNF; imx++) { PXM_free(cimPXMs[imx]); cimPXMs[imx] = PXM_copy(cimPXMf[imx]); // copy full-size images zmainloop(); pano_curve_image(imx); // curve them PXMs > PXMs } cimBlend = 0.3 * cimPXMs[0]->ww; cim_get_overlap(0,1,cimPXMs); // match images 0 & 1 in overlap area cim_match_colors(0,1,cimPXMs); pano_adjust_colors(cimPXMf[0],1); // image 0 << profile 1 pano_adjust_colors(cimPXMf[1],2); // image 1 << profile 2 if (cimNF > 2) { cimBlend = 0.3 * cimPXMs[1]->ww; cim_get_overlap(1,2,cimPXMs); cim_match_colors(1,2,cimPXMs); pano_adjust_colors(cimPXMf[0],1); pano_adjust_colors(cimPXMf[1],1); pano_adjust_colors(cimPXMf[2],2); } if (cimNF > 3) { cimBlend = 0.3 * cimPXMs[2]->ww; cim_get_overlap(2,3,cimPXMs); cim_match_colors(2,3,cimPXMs); pano_adjust_colors(cimPXMf[0],1); pano_adjust_colors(cimPXMf[1],1); pano_adjust_colors(cimPXMf[2],1); pano_adjust_colors(cimPXMf[3],2); } if (cimNF > 4) { cimBlend = 0.3 * cimPXMs[3]->ww; cim_get_overlap(3,4,cimPXMs); cim_match_colors(3,4,cimPXMs); pano_adjust_colors(cimPXMf[0],1); pano_adjust_colors(cimPXMf[1],1); pano_adjust_colors(cimPXMf[2],1); pano_adjust_colors(cimPXMf[3],1); pano_adjust_colors(cimPXMf[4],2); } if (cimNF > 5) { cimBlend = 0.3 * cimPXMs[4]->ww; cim_get_overlap(4,5,cimPXMs); cim_match_colors(4,5,cimPXMs); pano_adjust_colors(cimPXMf[0],1); pano_adjust_colors(cimPXMf[1],1); pano_adjust_colors(cimPXMf[2],1); pano_adjust_colors(cimPXMf[3],1); pano_adjust_colors(cimPXMf[4],1); pano_adjust_colors(cimPXMf[5],2); } cimScale = cimAlignSize / cimPXMf[1]->hh; // initial align image scale if (cimScale > 1.0) cimScale = 1.0; if (cim_manualalign) cimScale = 1.0; // manual alignment, full size for (imx = 0; imx < cimNF; imx++) { // scale offsets for image scale cimOffs[imx].xf = cimOffs[imx].xf * cimScale; cimOffs[imx].yf = cimOffs[imx].yf * cimScale; } cimImageIncrease = 1.6; // size increase per align stage cimSearchRange = 16; // initial alignment search range cimMinSearchRange = 4; // minimum search range cimSearchStep = 1; // alignment search step cimWarpRange = 16; // initial alignment warp range cimMinWarpRange = 4; // minimum warp range cimWarpStep = 1; // alignment warp step ww = cimPXMf[0]->ww * cimScale; // initial align image width cimBlend = ww * panInitBlend; // initial align blend width cimNsearch = 0; // align search counter while (true) // loop, increasing image size { for (imx = 0; imx < cimNF; imx++) { // prepare images cim_scale_image(imx,cimPXMs); // scale to new size PXMf > PXMs pano_curve_image(imx); // curve based on lens_mm PXMs > PXMs cim_warp_image_pano(imx,1); // apply corner warps PXMs > PXMw } m_zoom(0,"fit"); // fit window cim_show_images(1,0); // show with 50/50 blend in overlaps for (im1 = 0; im1 < cimNF-1; im1++) // fine-align each image with left neighbor { im2 = im1 + 1; offsets0 = cimOffs[im2]; // save initial alignment offsets overlap = cim_get_overlap(im1,im2,cimPXMs); // get overlap area if (overlap < panFinalBlend-3 && ! cim_manualalign) { // extra margin for align steps zmessageACK(Mwin,TX("Too little overlap, cannot align")); goto fail; } if (cim_manualalign) cim_show_images(0,0); else { cim_get_redpix(im1); // get high-contrast pixels cim_show_images(0,0); // show with 50/50 blend in overlaps cim_align_images(im1,im2); // search for best offsets and warps zfree(cimRedpix); // clear red pixels cimRedpix = 0; if (Fescape) goto fail; // user kill } dx = cimOffs[im2].xf - offsets0.xf; // changes from initial offsets dy = cimOffs[im2].yf - offsets0.yf; dt = cimOffs[im2].tf - offsets0.tf; for (imx = im2+1; imx < cimNF; imx++) // propagate to following images { cimOffs[imx].xf += dx; cimOffs[imx].yf += dy; cimOffs[imx].tf += dt; ww = cimOffs[imx].xf - cimOffs[im2].xf; cimOffs[imx].yf += ww * dt; } } if (cimScale == 1.0) goto success; // done R = cimImageIncrease; // next larger image size cimScale = cimScale * R; if (cimScale > 0.85) { // if close to end, jump to end R = R / cimScale; cimScale = 1.0; } for (imx = 0; imx < cimNF; imx++) // scale offsets for new size { cimOffs[imx].xf *= R; cimOffs[imx].yf *= R; for (int ii = 0; ii < 4; ii++) { cimOffs[imx].wx[ii] *= R; cimOffs[imx].wy[ii] *= R; } } cimSearchRange = cimSearchRange / cimImageIncrease + 0.5; if (cimSearchRange < cimMinSearchRange) cimSearchRange = cimMinSearchRange; cimWarpRange = cimWarpRange / cimImageIncrease + 0.5; if (cimWarpRange < cimMinWarpRange) cimWarpRange = cimMinWarpRange; cimBlend = cimBlend * panBlendDecrease * R; // blend width, reduced ww = cimPXMf[0]->ww * cimScale; if (cimBlend < panFinalBlend * ww) cimBlend = panFinalBlend * ww; // stay above minimum } success: panStat = 1; goto align_done; fail: panStat = 0; align_done: cimBlend = 1; // tiny blend (increase in adjust) Fbusy(-1); cim_show_images(0,0); return; } // curve image based on pano_lens_mm // replaces cimPXMs[im] with curved version void pano_curve_image(int im) { int px, py, ww, hh, vstat; float ww2, hh2; float dx, dy; float sx, sy; float tx, ty; float F = pano_lens_mm; // lens focal length, 35mm equivalent float S = 35.0; // corresponding image width PXM *pxmin, *pxmout; float vpix[4], *pix; if (FpanoNC) return; // no-curve flag pxmin = cimPXMs[im]; // input and output image ww = pxmin->ww; hh = pxmin->hh; ww2 = ww / 2; hh2 = hh / 2; if (ww > hh) F = F / S * ww; else F = F / S * hh; pxmout = PXM_make(ww,hh,4); // temp. output PXM for (py = 0; py < hh; py++) // cylindrical projection for (px = 0; px < ww; px++) { sx = px - ww2; sy = py - hh2; tx = sx / F; ty = sy / F; dx = F * tanf(tx); dy = F * tanf(ty) / cosf(tx); dx += ww2; dy += hh2; vstat = vpixel(pxmin,dx,dy,vpix); // input virtual pixel pix = PXMpix(pxmout,px,py); // output real pixel if (vstat) memcpy(pix,vpix,pixcc); else memset(pix,0,pixcc); // voided pixels are (0,0,0,0) } PXM_free(pxmin); // replace input with output PXM cimPXMs[im] = pxmout; pano_image_mm = F; // save focal length globally zmainloop(); // 25.1 return; } // get user inputs for RGB changes and blend width, update cimPXMw[*] void pano_adjust() { int pano_adjust_event(zdialog *zd, ch *event); // dialog event function ch *adjusttitle = TX("Match Brightness"); ch imageN[8] = "imageN"; int ww, hh, cc, imx; for (imx = 0; imx < cimNF; imx++) // neutral color adjustments pano_adjust_brite[imx] = 100; for (imx = 0; imx < cimNF; imx++) { // allocate warp memory ww = cimPXMw[imx]->ww; hh = cimPXMw[imx]->hh; cc = ww * hh * sizeof(float); panowarpx[imx] = (float *) zmalloc(cc,"cim pano"); panowarpy[imx] = (float *) zmalloc(cc,"cim pano"); cimPXMwdup[imx] = PXM_copy(cimPXMw[imx]); } /*** ___________________________________ | Match Brightness | | | | Select Image (o) (o) (o) (o) | image0 image1 ... | Brightness [____] [apply] | setbrite applybrite | [auto color] [file color] | autocolor filecolor | Blend Width [____] [apply] | blendwidth applyblend | Flatten Pano [___] [apply] | setflatten applyflatten | [x] Mouse Warp (drag image) | mousewarp | | | [OK] [X] | |___________________________________| ***/ panozd = zdialog_new(adjusttitle,Mwin,"OK","X",null); zdialog_add_widget(panozd,"hbox","hbsel","dialog",0,"space=3"); zdialog_add_widget(panozd,"label","labsel","hbsel",TX("Select Image"),"space=3"); zdialog_add_widget(panozd,"hbox","hbbri","dialog",0,"space=1"); zdialog_add_widget(panozd,"label","labbr","hbbri",TX("Brightness"),"space=3"); zdialog_add_widget(panozd,"zspin","setbrite","hbbri","50|200|1|100"); zdialog_add_widget(panozd,"button","applybrite","hbbri",TX("apply"),"space=10"); zdialog_add_widget(panozd,"hsep","hsep","dialog",0,"space=3"); zdialog_add_widget(panozd,"hbox","hbcolor","dialog",0,"space=3"); zdialog_add_widget(panozd,"button","autocolor","hbcolor",TX("auto color"),"space=5"); zdialog_add_widget(panozd,"button","filecolor","hbcolor",TX("file color"),"space=5"); zdialog_add_widget(panozd,"hbox","hbblend","dialog",0,"space=1"); zdialog_add_widget(panozd,"label","labblend","hbblend",TX("Blend Width"),"space=3"); zdialog_add_widget(panozd,"zspin","blendwidth","hbblend","1|999|1|1"); zdialog_add_widget(panozd,"button","applyblend","hbblend",TX("apply"),"space=10"); zdialog_add_widget(panozd,"hbox","hbflat","dialog",0,"space=1"); zdialog_add_widget(panozd,"label","labflat","hbflat",TX("Flatten Pano"),"space=3"); zdialog_add_widget(panozd,"zspin","setflatten","hbflat","0|1|0.1|0","space=3"); zdialog_add_widget(panozd,"button","applyflatten","hbflat",TX("apply"),"space=10"); zdialog_add_widget(panozd,"hbox","hbwarp","dialog",0,"space=1"); zdialog_add_widget(panozd,"check","mousewarp","hbwarp",TX("Mouse Warp (drag image)"),"space=3"); zdialog_add_ttip(panozd,"labsel",TX("select base image for color matching")); zdialog_add_ttip(panozd,"labbr",TX("adjust brightness of selected image")); zdialog_add_ttip(panozd,"autocolor",TX("match image color to base image (repeat)")); zdialog_add_ttip(panozd,"filecolor",TX("set image color from input files")); zdialog_add_ttip(panozd,"labblend",TX("blend image overlaps over pixel width")); zdialog_add_ttip(panozd,"labflat",TX("remove panorama image curving")); zdialog_add_ttip(panozd,"mousewarp",TX("warp and fine-align selected image with neighbor")); for (imx = 0; imx < cimNF; imx++) { // add radio button per image imageN[5] = '0' + imx; zdialog_add_widget(panozd,"radio",imageN,"hbsel",0,"space=3"); } zdialog_stuff(panozd,"image0",1); // pre-select 1st image pano_currimage = 0; zdialog_stuff(panozd,"mousewarp",0); // default mouse warp off cimBlend = 1; zdialog_stuff(panozd,"blendwidth",cimBlend); preflatPXM = 0; panStat = -1; // busy status zdialog_resize(panozd,400,0); zdialog_run(panozd,pano_adjust_event,"save"); // run dialog, parallel zdialog_wait(panozd); // wait for dialog completion zdialog_free(panozd); // free dialog return; } // dialog event function int pano_adjust_event(zdialog *zd, ch *event) { ch imageN[8] = "imageN"; int imS, imx, im1, im2; int ww, hh, px, py, nn; float F, brite, R, G, B; float *pixel; if (zd->zstat) // dialog complete { if (zd->zstat == 1) panStat = 1; // done else panStat = 0; // cancel freeMouse(); for (imx = 0; imx < cimNF; imx++) { // free memory PXM_free(cimPXMwdup[imx]); zfree(panowarpx[imx]); zfree(panowarpy[imx]); } if (preflatPXM) PXM_free(preflatPXM); // free memory preflatPXM = 0; return 1; } if (strstr(event,"image")) // new image selected { imx = event[5] - '0'; // image 0 - cimNF-1 if (imx < 0 || imx >= cimNF) return 1; brite = pano_adjust_brite[imx]; // set image brightness in dialog zdialog_stuff(zd,"setbrite",brite); pano_currimage = imx; } for (imx = 0; imx < cimNF; imx++) { // get currently selected image imageN[5] = '0' + imx; // from radio buttons zdialog_fetch(zd,imageN,nn); if (nn) break; } if (imx == cimNF) return 1; // none selected pano_currimage = imx; if (strmatch(event,"applybrite")) // new image brightness adjustment { zdialog_fetch(zd,"setbrite",brite); // new brightness value pano_adjust_brite[imx] = brite; // update image brightness if (preflatPXM) { // unflatten image if needed PXM_free(E3pxm); E3pxm = preflatPXM; preflatPXM = 0; } cim_warp_image_pano(imx,0); // refresh cimPXMw from cimPXMs F = brite / 100; // normalize 0.5 - 2.0 ww = cimPXMw[imx]->ww; hh = cimPXMw[imx]->hh; for (py = 0; py < hh; py++) // loop all image pixels for (px = 0; px < ww; px++) { pixel = PXMpix(cimPXMw[imx],px,py); R = F * pixel[0]; // apply brightness factor G = F * pixel[1]; B = F * pixel[2]; RGBfix(R,G,B); pixel[0] = R; pixel[1] = G; pixel[2] = B; } cimBlend = 1; // set blendwidth = 1 zdialog_stuff(zd,"blendwidth",cimBlend); cim_show_images(0,0); // combine and show with 50/50 blend } if (strmatch(event,"autocolor")) { Fbusy(+1); if (preflatPXM) { PXM_free(E3pxm); E3pxm = preflatPXM; preflatPXM = 0; } imS = pano_currimage; // last image selected for (im1 = imS; im1 < cimNF-1; im1++) // from selected image to last image { im2 = im1 + 1; cimBlend = 0.3 * cimPXMw[im2]->ww; cim_get_overlap(im1,im2,cimPXMw); // match images in overlap area cim_match_colors(im1,im2,cimPXMw); pano_adjust_colors(cimPXMw[im1],1); // image im1 << profile 1 pano_adjust_colors(cimPXMw[im2],2); // image im2 << profile 2 for (imx = im1-1; imx >= imS; imx--) pano_adjust_colors(cimPXMw[imx],1); } for (im1 = imS-1; im1 >= 0; im1--) // from selected image to 1st image { im2 = im1 + 1; cimBlend = 0.3 * cimPXMw[im2]->ww; cim_get_overlap(im1,im2,cimPXMw); // match images in overlap area cim_match_colors(im1,im2,cimPXMw); pano_adjust_colors(cimPXMw[im1],1); // image im1 << profile 1 pano_adjust_colors(cimPXMw[im2],2); // image im2 << profile 2 for (imx = im2+1; imx < cimNF; imx++) pano_adjust_colors(cimPXMw[imx],2); } cimBlend = 1; zdialog_stuff(zd,"blendwidth",cimBlend); cim_show_images(0,0); Fbusy(-1); } if (strmatch(event,"filecolor")) // use original file colors { Fbusy(+1); if (preflatPXM) { PXM_free(E3pxm); E3pxm = preflatPXM; preflatPXM = 0; } if (! cim_load_files()) return 1; for (imx = 0; imx < cimNF; imx++) { PXM_free(cimPXMs[imx]); cimPXMs[imx] = PXM_copy(cimPXMf[imx]); pano_curve_image(imx); // curve and warp cim_warp_image_pano(imx,0); PXM_free(cimPXMwdup[imx]); cimPXMwdup[imx] = PXM_copy(cimPXMw[imx]); panowarp_dowarps(imx); // re-apply mouse warps } cimBlend = 1; zdialog_stuff(zd,"blendwidth",cimBlend); cim_show_images(0,0); Fbusy(-1); } if (strmatch(event,"applyblend")) // apply new blend width { if (preflatPXM) { // unflatten image if needed PXM_free(E3pxm); E3pxm = preflatPXM; preflatPXM = 0; } zdialog_fetch(zd,"blendwidth",cimBlend); // can be zero cim_show_images(0,1); // show with gradual blend } if (strmatch(event,"mousewarp")) // engage mouse warp/align { if (preflatPXM) { // unflatten image if needed PXM_free(E3pxm); E3pxm = preflatPXM; preflatPXM = 0; } cimBlend = 1; zdialog_stuff(zd,"blendwidth",cimBlend); // set blendwidth = 1 cim_show_images(0,0); zdialog_fetch(zd,"mousewarp",pano_mousewarp); if (pano_mousewarp) takeMouse(panowarp_mousefunc,dragcursor); // connect mouse function else freeMouse(); } if (strmatch(event,"applyflatten")) { Fbusy(+1); // 25.1 if (preflatPXM) { // E3 = flattened image PXM_free(E3pxm); E3pxm = PXM_copy(preflatPXM); } else preflatPXM = PXM_copy(E3pxm); // flattened image = E3 zdialog_fetch(zd,"setflatten",F); // 0 ... 0.40 0.50 0.60 0.70 0.80 0.90 1.0 F = sqrtf(F); // 0 ... 0.63 0.71 0.77 0.84 0.89 0.95 1.0 pano_flatten_image(F); // flatten image Fpaint2(); Fbusy(-1); } return 1; } // uncurve the combined panorama image // input F = 0.0 - 1.0 = no unbend - full unbend void pano_flatten_image(float F) { PXM *pxmout; int ww, hh, vstat; float ww2, hh2; int px, py, rx, ry; int xlo, xhi, ylo, yhi; float dx, dy; float sx, sy; float tx, ty; float *pix, vpix[4]; float *pix1, *pix2; Fbusy(+1); // F = 0.0 0.2 0.4 0.6 0.8 1.0 F = 1.0 - F; // 1.0 0.8 0.6 0.4 0.2 0.0 F = F * 3.0; // 3.0 2.4 1.8 1.2 0.6 0.0 F = pow(2,F); // 8.0 5.3 3.5 1.7 1.5 1.0 F = F * pano_image_mm; // 8*FL (min flat) to 1*FL (max flat) ww = E3pxm->ww; hh = E3pxm->hh; ww2 = ww * 1.4; hh2 = hh * 1.2; pxmout = PXM_make(ww2,hh2,4); // larger image space for (ry = 0; ry < hh; ry++) // copy image to middle for (rx = 0; rx < ww; rx++) { px = rx + 0.2 * ww; if (px > ww2-1) continue; py = ry + 0.1 * hh; if (py > hh2-1) continue; pix1 = PXMpix(E3pxm,rx,ry); pix2 = PXMpix(pxmout,px,py); memcpy(pix2,pix1,pixcc); } PXM_free(E3pxm); E3pxm = pxmout; // new image with bigger margins ww = E3pxm->ww; hh = E3pxm->hh; pxmout = PXM_make(ww,hh,4); // flattened image space ww2 = ww/2; hh2 = hh/2; for (py = 0; py < hh; py++) // copy and flatten image for (px = 0; px < ww; px++) { dx = px - ww2; dy = py - hh2; tx = atanf(dx / F); ty = atanf(dy / F * cosf(tx)); sx = F * tx; sy = F * ty; sy += hh2; sx += ww2; vstat = vpixel(E3pxm,sx,sy,vpix); // input virtual pixel pix = PXMpix(pxmout,px,py); // output real pixel if (vstat) memcpy(pix,vpix,pixcc); else memset(pix,0,pixcc); // voided pixel } PXM_free(E3pxm); // replace input with output PXM E3pxm = pxmout; ww = E3pxm->ww; // cut off excess margins hh = E3pxm->hh; xlo = ww; xhi = 0; ylo = hh; yhi = 0; for (py = 0; py < hh; py += 2) // find extent of empty margins for (px = 0; px < ww; px += 2) { pix = PXMpix(E3pxm,px,py); if (pix[3] == 0) continue; if (px < xlo) xlo = px; if (px > xhi) xhi = px; if (py < ylo) ylo = py; if (py > yhi) yhi = py; } ww = xhi - xlo; // make new image just large enough hh = yhi - ylo; pxmout = PXM_make(ww,hh,4); for (py = 0; py < hh; py++) // copy pixels into new image for (px = 0; px < ww; px++) { pix1 = PXMpix(E3pxm,px+xlo,py+ylo); pix2 = PXMpix(pxmout,px,py); memcpy(pix2,pix1,pixcc); } PXM_free(E3pxm); // replace input with output PXM E3pxm = pxmout; Fbusy(-1); return; } // panorama dialog mouse warp function // for selected image, cimPXMs >> warp >> cimPXMw >> E3 void panowarp_mousefunc() { int imx; int mx, my, dx, dy; int ii, px, py, ww, hh; float mag, dispx, dispy, d1, d2; PXM *pxm; if (LMclick || RMclick) return; // mouse click if (! Mxdrag && ! Mydrag) return; if (! pano_mousewarp) return; mx = Mxdrag; // mouse drag my = Mydrag; if (mx < 0 || mx > E3pxm->ww-1 || my < 0 || my > E3pxm->hh-1) // mouse outside image area return; imx = pano_currimage; pxm = cimPXMw[imx]; // output image ww = pxm->ww; hh = pxm->hh; mx = Mxdown; // drag origin, image coordinates my = Mydown; dx = Mxdrag - Mxdown; // drag increment dy = Mydrag - Mydown; Mxdown = Mxdrag; // next drag origin Mydown = Mydrag; Mxdrag = Mydrag = 0; mx = mx - cimOffs[imx].xf; // mouse position relative my = my - cimOffs[imx].yf; // to image origin d1 = ww * ww + hh * hh; for (py = 0; py < hh; py++) // process all output pixels for (px = 0; px < ww; px++) { d2 = (px-mx)*(px-mx) + (py-my)*(py-my); mag = (1.0 - d2 / d1); mag = pow(mag,50); dispx = -dx * mag; // displacement = drag * mag dispy = -dy * mag; ii = py * ww + px; panowarpx[imx][ii] += dispx; // add this drag to prior sum panowarpy[imx][ii] += dispy; } panowarp_dowarps(imx); // do accumulated warps cim_show_images(0,0); return; } // warp the image using the accumulated mouse drags void panowarp_dowarps(int imx) { float vpix1[4], *pix2; int ii, px, py, ww, hh, vstat1; float dispx, dispy; PXM *pxm1, *pxm2; pxm1 = cimPXMwdup[imx]; // input image pxm2 = cimPXMw[imx]; // output image ww = pxm2->ww; hh = pxm2->hh; for (py = 0; py < hh; py++) // process all output pixels for (px = 0; px < ww; px++) { ii = py * ww + px; dispx = panowarpx[imx][ii]; dispy = panowarpy[imx][ii]; vstat1 = vpixel(pxm1,px+dispx,py+dispy,vpix1); // input virtual pixel pix2 = PXMpix(pxm2,px,py); // output pixel if (vstat1) memcpy(pix2,vpix1,pixcc); else memset(pix2,0,pixcc); // voided pixel } return; } /**************************************************************************************/ // show files selected for present or last combine edit function void m_cim_show_files(GtkWidget *, ch *) { F1_help_topic = TX("SHOW CIM FILES"); zdialog *zd; if (! cimNF) { zmessageACK(Mwin,TX("no input files available")); return; } zd = popup_report_open(TX("combined image files"),Mwin,600,200,0,0,0,"X",null); for (int im = 0; im < cimNF; im++) popup_report_write(zd,0,"%s\n",cimFile[im]); return; } /**************************************************************************************/ // select input files for combine image function // returns count of files selected and loaded int cim_get_files(int min, int max) { int im; cimNF = 0; for (im = 0; im < 10; im++) // clear previous file list { if (cimFile[im]) zfree(cimFile[im]); cimFile[im] = 0; } select_files(1); // get new list if (SFcount == 0) return 0; if (SFcount < min || SFcount > max) { zmessageACK(Mwin,TX("Select %d to %d files"),min,max); return 0; } cimNF = SFcount; // file count for (im = 0; im < cimNF; im++) cimFile[im] = zstrdup(SelFiles[im],"cim get files"); // set up file list cimLF = 0; // find alphabetically last file for (int im = 1; im < cimNF; im++) if (strcmp(cimFile[im],cimFile[cimLF]) > 0) cimLF = im; return cimNF; } // load image files into pixmaps cimPXMf[*] and check for errors // returns 0 if error int cim_load_files() { PXM *pxm; for (int im = 0; im < cimNF; im++) { PXM_free(cimPXMf[im]); pxm = PXM_load(cimFile[im],1); // ACK errors if (! pxm) { cim_free_memory(); return 0; } PXM_addalpha(pxm); cimPXMf[im] = pxm; zmainloop(); // deter GTK "not responding" } return 1; } // check input files for compatibility // returns 0 if not compatible int cim_check_files(float maxdiff) { int ww, hh, im; float diffw, diffh; ww = cimPXMf[0]->ww; hh = cimPXMf[0]->hh; for (im = 1; im < cimNF; im++) { diffw = abs(ww - cimPXMf[im]->ww); diffw = diffw / ww; diffh = abs(hh - cimPXMf[im]->hh); diffh = diffh / hh; if (diffw > maxdiff || diffh > maxdiff) { zmessageACK(Mwin,TX("Images sizes are not compatible")); cim_free_memory(); return 0; } } return 1; } // free memory used by cim file PXM images // file names are not freed - for use by m_cim_files() void cim_free_memory() { for (int im = 0; im < 10; im++) { if (cimPXMf[im]) PXM_free(cimPXMf[im]); if (cimPXMs[im]) PXM_free(cimPXMs[im]); if (cimPXMw[im]) PXM_free(cimPXMw[im]); cimPXMf[im] = cimPXMs[im] = cimPXMw[im] = 0; } return; } // scale image from full size to cimScale (normally < 1.0) void cim_scale_image(int im, PXM** pxmout) { int ww, hh; ww = cimScale * cimPXMf[im]->ww; hh = cimScale * cimPXMf[im]->hh; PXM_free(pxmout[im]); pxmout[im] = PXM_rescale(cimPXMf[im],ww,hh); zmainloop(); return; } // get overlap area for a pair of images im1 and im2 // outputs are coordinates of overlap area in im1 and in im2 // returns overlap width as fraction of image width <= 1.0 float cim_get_overlap(int im1, int im2, PXM **pxmx) { float x1, y1, t1, x2, y2, t2; float xoff, yoff, toff, costf, sintf; int ww1, ww2, hh1, hh2, pxM; PXM *pxm1, *pxm2; x1 = cimOffs[im1].xf; // im1, im2 absolute offsets y1 = cimOffs[im1].yf; t1 = cimOffs[im1].tf; x2 = cimOffs[im2].xf; y2 = cimOffs[im2].yf; t2 = cimOffs[im2].tf; xoff = (x2 - x1) * cosf(t1) + (y2 - y1) * sinf(t1); // offset of im2 relative to im1 yoff = (y2 - y1) * cosf(t1) - (x2 - x1) * sinf(t1); toff = t2 - t1; costf = cosf(toff); sintf = sinf(toff); pxm1 = pxmx[im1]; pxm2 = pxmx[im2]; ww1 = pxm1->ww; hh1 = pxm1->hh; ww2 = pxm2->ww; hh2 = pxm2->hh; cimOv1xlo = 0; // lowest x overlap if (xoff > 0) cimOv1xlo = xoff; cimOv1xhi = ww1-1; // highest x overlap if (cimOv1xhi > xoff + ww2-1) cimOv1xhi = xoff + ww2-1; cimOv1ylo = 0; // lowest y overlap if (yoff > 0) cimOv1ylo = yoff; cimOv1yhi = hh1-1; // highest y overlap if (cimOv1yhi > yoff + hh2-1) cimOv1yhi = yoff + hh2-1; if (toff < 0) cimOv1xlo -= toff * (cimOv1yhi - cimOv1ylo); // reduce for theta offset if (toff < 0) cimOv1yhi += toff * (cimOv1xhi - cimOv1xlo); if (toff > 0) cimOv1xhi -= toff * (cimOv1yhi - cimOv1ylo); if (toff > 0) cimOv1ylo += toff * (cimOv1xhi - cimOv1xlo); if (cimBlend && cimBlend < (cimOv1xhi - cimOv1xlo)) { // reduce x range to cimBlend pxM = (cimOv1xhi + cimOv1xlo) / 2; cimOv1xlo = pxM - cimBlend / 2; cimOv1xhi = pxM + cimBlend / 2; } cimOv2xlo = costf * (cimOv1xlo - xoff) + sintf * (cimOv1ylo - yoff); // overlap area in im2 coordinates cimOv2xhi = costf * (cimOv1xhi - xoff) + sintf * (cimOv1yhi - yoff); cimOv2ylo = costf * (cimOv1ylo - yoff) + sintf * (cimOv1xlo - xoff); cimOv2yhi = costf * (cimOv1yhi - yoff) + sintf * (cimOv1xhi - xoff); if (cimOv1xlo < 0) cimOv1xlo = 0; // take care of limits if (cimOv1ylo < 0) cimOv1ylo = 0; if (cimOv2xlo < 0) cimOv2xlo = 0; if (cimOv2ylo < 0) cimOv2ylo = 0; if (cimOv1xhi > ww1-1) cimOv1xhi = ww1-1; if (cimOv1yhi > hh1-1) cimOv1yhi = hh1-1; if (cimOv2xhi > ww2-1) cimOv2xhi = ww2-1; if (cimOv2yhi > hh2-1) cimOv2yhi = hh2-1; return 1.0 * (cimOv1xhi - cimOv1xlo) / ww1; // return overlap width <= 1.0 } // Get the RGB brightness histogram in the overlap area for each image. // Compute matching factors to compare pixels within the overlap area. // compare cimRGBmf1[rgb][pix1[rgb]] to cimRGBmf2[rgb][pix2[rgb]]. void cim_match_colors(int im1, int im2, PXM **pxmx) { float Bratios1[3][256]; // image2/image1 brightness ratio per color per level float Bratios2[3][256]; // image1/image2 brightness ratio per color per level float *pix1, vpix2[4]; int vstat2, px1, py1; int ii, jj, rgb; int npix, npix1, npix2, npix3; int brhist1[3][256], brhist2[3][256]; float x1, y1, t1, x2, y2, t2; float xoff, yoff, toff, costf, sintf; float px2, py2; float brlev1[3][256], brlev2[3][256]; float a1, a2, b1, b2, bratio = 1; PXM *pxm1, *pxm2; pxm1 = pxmx[im1]; pxm2 = pxmx[im2]; x1 = cimOffs[im1].xf; // im1, im2 absolute offsets y1 = cimOffs[im1].yf; t1 = cimOffs[im1].tf; x2 = cimOffs[im2].xf; y2 = cimOffs[im2].yf; t2 = cimOffs[im2].tf; xoff = (x2 - x1) * cosf(t1) + (y2 - y1) * sinf(t1); // offset of im2 relative to im1 yoff = (y2 - y1) * cosf(t1) - (x2 - x1) * sinf(t1); toff = t2 - t1; costf = cosf(toff); sintf = sinf(toff); for (rgb = 0; rgb < 3; rgb++) // clear histograms for (ii = 0; ii < 256; ii++) brhist1[rgb][ii] = brhist2[rgb][ii] = 0; npix = 0; for (py1 = cimOv1ylo; py1 < cimOv1yhi; py1++) // loop overlapped rows for (px1 = cimOv1xlo; px1 < cimOv1xhi; px1++) // loop overlapped columns { pix1 = PXMpix(pxm1,px1,py1); // image1 pixel if (pix1[3] < 254) continue; // ignore void pixels px2 = costf * (px1 - xoff) + sintf * (py1 - yoff); // corresponding image2 pixel py2 = costf * (py1 - yoff) - sintf * (px1 - xoff); vstat2 = vpixel(pxm2,px2,py2,vpix2); if (! vstat2) continue; // does not exist if (vpix2[3] < 254) continue; // ignore void pixels ++npix; // count overlapping pixels for (rgb = 0; rgb < 3; rgb++) // accumulate histogram { // by color in 256 bins ++brhist1[rgb][int(pix1[rgb])]; ++brhist2[rgb][int(vpix2[rgb])]; } } if (npix < 2560) { zmessageACK(Mwin,TX("insufficient overlap for color matching")); for (ii = 0; ii < 256; ii++) for (rgb = 0; rgb < 3; rgb++) // neutralize color match data cimRGBmf1[rgb][ii] = cimRGBmf2[rgb][ii] = ii; return; } npix1 = npix / 256; // 1/256th of overlapping pixels for (rgb = 0; rgb < 3; rgb++) // get brlev1[rgb][N] = mean bright for (ii = jj = 0; jj < 256; jj++) // for Nth group of image1 pixels { // for color rgb brlev1[rgb][jj] = 0; npix2 = npix1; // 1/256th of total pixels while (npix2 > 0 && ii < 256) // next 1/256th group from histogram { npix3 = brhist1[rgb][ii]; if (npix3 == 0) { ++ii; continue; } if (npix3 > npix2) npix3 = npix2; brlev1[rgb][jj] += ii * npix3; // brightness * (pixels with) brhist1[rgb][ii] -= npix3; npix2 -= npix3; } brlev1[rgb][jj] = brlev1[rgb][jj] / npix1; // mean brightness for group, 0-255 } for (rgb = 0; rgb < 3; rgb++) // do same for image2 for (ii = jj = 0; jj < 256; jj++) { brlev2[rgb][jj] = 0; npix2 = npix1; while (npix2 > 0 && ii < 256) { npix3 = brhist2[rgb][ii]; if (npix3 == 0) { ++ii; continue; } if (npix3 > npix2) npix3 = npix2; brlev2[rgb][jj] += ii * npix3; brhist2[rgb][ii] -= npix3; npix2 -= npix3; } brlev2[rgb][jj] = brlev2[rgb][jj] / npix1; } for (rgb = 0; rgb < 3; rgb++) // color for (ii = jj = 0; ii < 256; ii++) // brlev1 brightness, 0 to 255 { if (ii == 0) bratio = 1; while (jj < 256 && ii > brlev2[rgb][jj]) jj++; // find matching brlev2 brightness if (jj == 256) jj = 255; a2 = brlev2[rgb][jj]; // next higher value b2 = brlev1[rgb][jj]; if (a2 > 0 && b2 > 0) { if (jj > 0) { a1 = brlev2[rgb][jj-1]; // next lower value b1 = brlev1[rgb][jj-1]; } else a1 = b1 = 0; if (ii == 0) bratio = b2 / a2; else bratio = (b1 + (ii-a1)/(a2-a1) * (b2-b1)) / ii; // interpolate } if (isnan(bratio)) bratio = 1; // NAN detector if (bratio < 0.2) bratio = 0.2; // contain outliers if (bratio > 5) bratio = 5; Bratios2[rgb][ii] = bratio; } for (rgb = 0; rgb < 3; rgb++) // color for (ii = jj = 0; ii < 256; ii++) // brlev2 brightness, 0 to 255 { if (ii == 0) bratio = 1; while (jj < 256 && ii > brlev1[rgb][jj]) jj++; // find matching brlev1 brightness if (jj == 256) jj = 255; a2 = brlev1[rgb][jj]; // next higher value b2 = brlev2[rgb][jj]; if (a2 > 0 && b2 > 0) { if (jj > 0) { a1 = brlev1[rgb][jj-1]; // next lower value b1 = brlev2[rgb][jj-1]; } else a1 = b1 = 0; if (ii == 0) bratio = b2 / a2; else bratio = (b1 + (ii-a1)/(a2-a1) * (b2-b1)) / ii; // interpolate } if (isnan(bratio)) bratio = 1; // NAN detector if (bratio < 0.2) bratio = 0.2; // contain outliers if (bratio > 5) bratio = 5; Bratios1[rgb][ii] = bratio; } for (ii = 0; ii < 256; ii++) // convert brightness ratios for (rgb = 0; rgb < 3; rgb++) // to conversion factors { cimRGBmf1[rgb][ii] = sqrt(Bratios1[rgb][ii]) * ii; // use sqrt(ratio) so that adjustment cimRGBmf2[rgb][ii] = sqrt(Bratios2[rgb][ii]) * ii; // can be applied to both images } return; } // Use color match data from cim_match_colors() to // modify images so the colors match. void cim_adjust_colors(PXM *pxm, int fwhich) { int ww, hh, px, py; float red, green, blue; float *pix; ww = pxm->ww; hh = pxm->hh; for (py = 0; py < hh; py++) for (px = 0; px < ww; px++) { pix = PXMpix(pxm,px,py); red = pix[0]; green = pix[1]; blue = pix[2]; if (fwhich == 1) { red = cimRGBmf1[0][int(red)]; green = cimRGBmf1[1][int(green)]; blue = cimRGBmf1[2][int(blue)]; } else { red = cimRGBmf2[0][int(red)]; green = cimRGBmf2[1][int(green)]; blue = cimRGBmf2[2][int(blue)]; } if (red > 255) red = 255; if (green > 255) green = 255; if (blue > 255) blue = 255; pix[0] = red; pix[1] = green; pix[2] = blue; } return; } // Use color match data from cim_match_colors() to // modify images so the colors match. // fwhich = 1/2 = left/right image void pano_adjust_colors(PXM *pxm, int fwhich) { int ww, hh, ww2, px, py; int pxlo, pxhi; float red1, green1, blue1; float red2, green2, blue2; float *pix; float f1, f2; ww = pxm->ww; hh = pxm->hh; ww2 = ww / 2; if (fwhich == 1) { // scan half the image pxlo = ww2; pxhi = ww; } else { pxlo = 0; pxhi = ww2; } for (py = 0; py < hh; py++) for (px = pxlo; px < pxhi; px++) { pix = PXMpix(pxm,px,py); red1 = pix[0]; green1 = pix[1]; blue1 = pix[2]; if (fwhich == 1) { red2 = cimRGBmf1[0][int(red1)]; green2 = cimRGBmf1[1][int(green1)]; blue2 = cimRGBmf1[2][int(blue1)]; } else { red2 = cimRGBmf2[0][int(red1)]; green2 = cimRGBmf2[1][int(green1)]; blue2 = cimRGBmf2[2][int(blue1)]; } if (fwhich == 1) { // taper color adjustment over distance f2 = 1.0 * (px - pxlo) / ww2; f1 = 1.0 - f2; } else { f1 = 1.0 * px / ww2; f2 = 1.0 - f1; } red2 = f2 * red2 + f1 * red1; green2 = f2 * green2 + f1 * green1; blue2 = f2 * blue2 + f1 * blue1; if (red2 > 255) red2 = 255; // instead of RGBFIX if (red2 < 0) red2 = 0; // add < 0 check 26.4 if (green2 > 255) green2 = 255; if (green2 < 0) green2 = 0; if (blue2 > 255) blue2 = 255; if (blue2 < 0) blue2 = 0; pix[0] = red2; pix[1] = green2; pix[2] = blue2; } return; } // find pixels of greatest contrast within overlap area // flag high-contrast pixels to use in each image compare region void cim_get_redpix(int im1) { int ww, hh, samp, xzone, yzone; int pxL, pxH, pyL, pyH; int px, py, ii, jj, npix; int ov1xlo, ov1xhi, ov1ylo, ov1yhi; int Hhist[256], Vhist[256], Hmin, Vmin; float zsamp[16] = { 5,5,5,5, 7,8,8,7, 7,8,8,7, 5,5,5,5 }; // % sample per zone, sum = 100 uch *Hcon, *Vcon; float *pix1, *pix2; PXM *pxm; pxm = cimPXMs[im1]; ww = pxm->ww; hh = pxm->hh; if (cimRedpix) zfree(cimRedpix); // clear prior cimRedpix = (ch *) zmalloc(ww * hh,"cim redpix"); cimRedImage = im1; // image with red pixels ov1xlo = cimOv1xlo + cimSearchRange; // stay within x/y search range ov1xhi = cimOv1xhi - cimSearchRange; // so that red pixels persist ov1ylo = cimOv1ylo + cimSearchRange; // over offset changes ov1yhi = cimOv1yhi - cimSearchRange; for (yzone = 0; yzone < 4; yzone++) // loop 16 zones for (xzone = 0; xzone < 4; xzone++) { pxL = ov1xlo + 0.25 * xzone * (ov1xhi - ov1xlo); // px and py zone limits pxH = ov1xlo + 0.25 * (xzone+1) * (ov1xhi - ov1xlo); pyL = ov1ylo + 0.25 * yzone * (ov1yhi - ov1ylo); pyH = ov1ylo + 0.25 * (yzone+1) * (ov1yhi - ov1ylo); npix = (pxH - pxL) * (pyH - pyL); // zone pixels if (npix < 1) continue; Hcon = (uch *) zmalloc(npix,"cim redpix"); // horizontal pixel contrast 0-255 Vcon = (uch *) zmalloc(npix,"cim redpix"); // vertical pixel contrast 0-255 ii = 4 * yzone + xzone; samp = cimSampSize * 0.01 * zsamp[ii]; // sample size for zone if (samp > 0.1 * npix) samp = 0.1 * npix; // limit to 10% of zone pixels if (samp > 500) samp = 500; for (py = pyL; py < pyH; py++) // scan image pixels in zone for (px = pxL; px < pxH; px++) { ii = (py-pyL) * (pxH-pxL) + (px-pxL); Hcon[ii] = Vcon[ii] = 0; // horiz. = vert. contrast = 0 if (py < 8 || py > hh-9) continue; // keep away from image edges if (px < 8 || px > ww-9) continue; pix1 = PXMpix(pxm,px,py-6); // verify not near void areas if (pix1[3] < 254) continue; // avoid void pixels pix1 = PXMpix(pxm,px+6,py); if (pix1[3] < 254) continue; pix1 = PXMpix(pxm,px,py+6); if (pix1[3] < 254) continue; pix1 = PXMpix(pxm,px-6,py); if (pix1[3] < 254) continue; pix1 = PXMpix(pxm,px,py); // candidate red pixel pix2 = PXMpix(pxm,px+2,py); // 2 pixels to right Hcon[ii] = 255 * (1.0 - PIXmatch(pix1,pix2)); // horz. contrast 0-255 pix2 = PXMpix(pxm,px,py+2); // 2 pixels below Vcon[ii] = 255 * (1.0 - PIXmatch(pix1,pix2)); // vert. contrast } for (ii = 0; ii < 256; ii++) // clear contrast histogram Hhist[ii] = Vhist[ii] = 0; for (py = pyL; py < pyH; py++) // scan image pixels for (px = pxL; px < pxH; px++) { // build contrast histogram ii = (py-pyL) * (pxH-pxL) + (px-pxL); ++Hhist[Hcon[ii]]; ++Vhist[Vcon[ii]]; } for (npix = 0, ii = 255; ii > 0; ii--) // find minimum contrast needed to get { // enough pixels for sample size npix += Hhist[ii]; // (horizontal contrast pixels) if (npix > samp) break; } Hmin = ii; for (npix = 0, ii = 255; ii > 0; ii--) // (vertical contrast pixels) { npix += Vhist[ii]; if (npix > samp) break; } Vmin = ii; for (py = pyL; py < pyH; py++) // scan zone pixels for (px = pxL; px < pxH; px++) { ii = (py-pyL) * (pxH-pxL) + (px-pxL); jj = py * ww + px; if (Hcon[ii] + Vcon[ii] < 20) continue; // ignore low contrast pixels if (Hcon[ii] > Hmin) cimRedpix[jj] = 1; // flag pixels above min. contrast if (Vcon[ii] > Vmin) cimRedpix[jj] = 1; } zfree(Hcon); zfree(Vcon); for (py = pyL; py < pyH; py++) // scan zone pixels for (px = pxL; px < pxH; px++) { ii = (py-pyL) * (pxH-pxL) + (px-pxL); jj = py * ww + px; if (! cimRedpix[jj]) continue; npix = cimRedpix[jj-1] + cimRedpix[jj+1]; // eliminate flagged pixels with no npix += cimRedpix[jj-ww] + cimRedpix[jj+ww]; // neighboring flagged pixels npix += cimRedpix[jj-ww-1] + cimRedpix[jj+ww-1]; npix += cimRedpix[jj-ww+1] + cimRedpix[jj+ww+1]; if (npix < 2) cimRedpix[jj] = 0; } for (py = pyL; py < pyH; py++) // scan zone pixels for (px = pxL; px < pxH; px++) { ii = (py-pyL) * (pxH-pxL) + (px-pxL); jj = py * ww + px; if (cimRedpix[jj] == 1) { // flag horizontal group of 3 cimRedpix[jj+1] = 2; cimRedpix[jj+2] = 2; cimRedpix[jj+ww] = 2; // and vertical group of 3 cimRedpix[jj+2*ww] = 2; } } } return; } // Warp 4 image corners according to cimOffs[im].wx[ii] and .wy[ii] // corner = 0 = NW, 1 = NE, 2 = SE, 3 = SW // 4 corners move by these pixel amounts and center does not move. // input: cimPXMs[im] (flat or curved) output: cimPXMw[im] namespace cim_warp_image_names { PXM *pxmin, *pxmout; float ww, hh, wwi, hhi; float wx0, wy0, wx1, wy1, wx2, wy2, wx3, wy3; } void cim_warp_image(int im) // caller function { using namespace cim_warp_image_names; void * cim_warp_image_wthread(void *arg); pxmin = cimPXMs[im]; // input and output pixmaps pxmout = cimPXMw[im]; PXM_free(pxmout); pxmout = PXM_copy(pxmin); cimPXMw[im] = pxmout; ww = pxmin->ww; hh = pxmin->hh; wwi = 1.0 / ww; hhi = 1.0 / hh; wx0 = cimOffs[im].wx[0]; // corner warps wy0 = cimOffs[im].wy[0]; wx1 = cimOffs[im].wx[1]; wy1 = cimOffs[im].wy[1]; wx2 = cimOffs[im].wx[2]; wy2 = cimOffs[im].wy[2]; wx3 = cimOffs[im].wx[3]; wy3 = cimOffs[im].wy[3]; do_wthreads(cim_warp_image_wthread,NSMP); // worker threads zmainloop(); // 25.1 return; } void * cim_warp_image_wthread(void *arg) // worker thread function { using namespace cim_warp_image_names; int index = *((int *) arg); int pxm, pym, vstat; float vpix[4], *pixm; float px, py, dx, dy, coeff; for (pym = index; pym < hh; pym += NSMP) // loop all pixels for this thread for (pxm = 0; pxm < ww; pxm++) { dx = dy = 0.0; coeff = (1.0 - pym * hhi - pxm * wwi); // corner 0 NW if (coeff > 0) { dx += coeff * wx0; dy += coeff * wy0; } coeff = (1.0 - pym * hhi - (ww - pxm) * wwi); // corner 1 NE if (coeff > 0) { dx += coeff * wx1; dy += coeff * wy1; } coeff = (1.0 - (hh - pym) * hhi - (ww - pxm) * wwi); // corner 2 SE if (coeff > 0) { dx += coeff * wx2; dy += coeff * wy2; } coeff = (1.0 - (hh - pym) * hhi - pxm * wwi); // corner 3 SW if (coeff > 0) { dx += coeff * wx3; dy += coeff * wy3; } px = pxm + dx; // source pixel location py = pym + dy; vstat = vpixel(pxmin,px,py,vpix); // input virtual pixel pixm = PXMpix(pxmout,pxm,pym); // output real pixel if (vstat) memcpy(pixm,vpix,pixcc); else memset(pixm,0,pixcc); // voided pixel } return 0; } // warp image for pano, left side corners only, reduced warp range // input: cimPXMs[im] (curved) // output: cimPXMw[im] (warped) // fblend: 0 = process entire image // 1 = process left half only // 2 = process blend stripe only void cim_warp_image_pano(int im, int fblend) { int ww, hh, ww2, hh2, pxL, pxH; int pxm, pym, vstat; float vpix[4], *pixm; float ww2i, hh2i, pxs, pys, xdisp, ydisp; float wx0, wy0, wx3, wy3; PXM *pxmin, *pxmout; pxmin = cimPXMs[im]; // input and output pixmaps pxmout = cimPXMw[im]; PXM_free(pxmout); pxmout = PXM_copy(pxmin); cimPXMw[im] = pxmout; ww = pxmin->ww; hh = pxmin->hh; ww2 = ww / 2; hh2 = hh / 2; ww2i = 1.0 / ww2; hh2i = 1.0 / hh2; wx0 = cimOffs[im].wx[0]; // NW corner warp wy0 = cimOffs[im].wy[0]; wx3 = cimOffs[im].wx[3]; // SW corner warp wy3 = cimOffs[im].wy[3]; pxL = 0; // entire image pxH = ww; if (fblend == 1) // left half pxH = ww2; if (fblend == 2) { pxL = cimOv2xlo; // limit to overlap/blend width pxH = cimOv2xhi; } for (pym = 0; pym < hh; pym++) // loop all output pixels for (pxm = pxL; pxm < pxH; pxm++) { pixm = PXMpix(pxmout,pxm,pym); // output pixel xdisp = (pxm - ww2) * ww2i; // -1 ... 0 ... +1 ydisp = (pym - hh2) * hh2i; if (xdisp > 0) { // right half, no warp pxs = pxm; pys = pym; } else if (ydisp < 0) { // use NW corner warp pxs = pxm + wx0 * xdisp * ydisp; pys = pym + wy0 * xdisp * ydisp; } else { // use SW corner warp pxs = pxm + wx3 * xdisp * ydisp; pys = pym + wy3 * xdisp * ydisp; } vstat = vpixel(pxmin,pxs,pys,vpix); // input virtual pixel if (vstat) memcpy(pixm,vpix,pixcc); else memset(pixm,0,pixcc); // voided pixel } return; } // fine-align a pair of images im1 and im2 // cimPXMs[im2] is aligned with cimPXMs[im1] // inputs are cimOffs[im1] and cimOffs[im2] (x/y/t and corner offsets) // output is adjusted offsets and corner warp values for im2 only // (im1 is used as-is without corner warps) void cim_align_images(int im1, int im2) { int ii, corner1, cornerstep, cornerN, pass; float xyrange, xystep, trange, tstep, wrange, wstep; float xfL, xfH, yfL, yfH, tfL, tfH; float wxL, wxH, wyL, wyH; float match, matchB; cimoffs offsets0, offsetsB; offsets0 = cimOffs[im2]; // initial offsets offsetsB = offsets0; // = best offsets so far matchB = cim_match_images(im1,im2); // = best image match level for (pass = 1; pass <=2; pass++) // main pass and 2nd pass { xyrange = cimSearchRange; // x/y search range and step xystep = cimSearchStep; trange = xyrange / (cimOv1yhi - cimOv1ylo); // angle range, radians tstep = trange * xystep / xyrange; if (pass == 2) { xyrange = 0.5 * xyrange; // 2nd pass, reduce range and step xystep = 0.5 * xystep; trange = 0.5 * trange; tstep = 0.5 * tstep; } // search x/y/t range for best match xfL = cimOffs[im2].xf - xyrange; xfH = cimOffs[im2].xf + xyrange + 0.5 * xystep; yfL = cimOffs[im2].yf - xyrange; yfH = cimOffs[im2].yf + xyrange + 0.5 * xystep; tfL = cimOffs[im2].tf - trange; tfH = cimOffs[im2].tf + trange + 0.5 * tstep; for (cimOffs[im2].xf = xfL; cimOffs[im2].xf < xfH; cimOffs[im2].xf += xystep) for (cimOffs[im2].yf = yfL; cimOffs[im2].yf < yfH; cimOffs[im2].yf += xystep) for (cimOffs[im2].tf = tfL; cimOffs[im2].tf < tfH; cimOffs[im2].tf += tstep) { match = cim_match_images(im1,im2); // get match level if (match > matchB) { matchB = match; // save best match offsetsB = cimOffs[im2]; } panelmessage(0,1,"align: %d match: %.5f",cimNsearch++,matchB); // 25.1 if (Fescape) return; // user kill } cimOffs[im2] = offsetsB; // restore best match if (cim_manualwarp) continue; // skip auto warp // warp corners and search for best match wrange = cimWarpRange; // corner warp range and step wstep = cimWarpStep; if (! wrange) continue; if (pass == 2) { // 2nd pass, 1/4 range and 1/2 step wrange = wrange / 4; wstep = wstep / 2; } corner1 = 0; // process all 4 corners cornerN = 3; cornerstep = 1; if (cimPano) { corner1 = 0; // left side corners 0, 3 cornerN = 3; cornerstep = 3; } matchB = cim_match_images(im1,im2); // initial image match level for (ii = corner1; ii <= cornerN; ii += cornerstep) // modify one corner at a time { wxL = cimOffs[im2].wx[ii] - wrange; wxH = cimOffs[im2].wx[ii] + wrange + 0.5 * wstep; wyL = cimOffs[im2].wy[ii] - wrange; wyH = cimOffs[im2].wy[ii] + wrange + 0.5 * wstep; for (cimOffs[im2].wy[ii] = wyL; cimOffs[im2].wy[ii] < wyH; cimOffs[im2].wy[ii] += wstep) for (cimOffs[im2].wx[ii] = wxL; cimOffs[im2].wx[ii] < wxH; cimOffs[im2].wx[ii] += wstep) { match = cim_match_images(im1,im2); // get match level if (match > matchB) { matchB = match; // save best match offsetsB = cimOffs[im2]; } panelmessage(0,1,"warp: %d match: %.5f",cimNsearch++,matchB); // 25.1 if (Fescape) return; // user kill } cimOffs[im2] = offsetsB; // restore best match if (cimPano) cim_warp_image_pano(im2,1); // apply corner warps else cim_warp_image(im2); } } return; } // Compare two images in overlapping areas. // Use the high-contrast pixels from cim_get_redpix() // return: 1 = perfect match, 0 = total mismatch (black/white) // cimPXMs[im1] is matched to cimPXMs[im2] + virtual corner warps float cim_match_images(int im1, int im2) { float *pix1, vpix2[4]; int ww, hh, ww2, hh2; int px1, py1, ii, vstat; float wwi, hhi, ww2i, hh2i, xdisp, ydisp; float wx0, wy0, wx1, wy1, wx2, wy2, wx3, wy3; float dx, dy, px2, py2; float x1, y1, t1, x2, y2, t2; float xoff, yoff, toff, costf, sintf, coeff; float match, cmatch, maxcmatch; PXM *pxm1, *pxm2; x1 = cimOffs[im1].xf; // im1, im2 absolute offsets y1 = cimOffs[im1].yf; t1 = cimOffs[im1].tf; x2 = cimOffs[im2].xf; y2 = cimOffs[im2].yf; t2 = cimOffs[im2].tf; xoff = (x2 - x1) * cosf(t1) + (y2 - y1) * sinf(t1); // offset of im2 relative to im1 yoff = (y2 - y1) * cosf(t1) - (x2 - x1) * sinf(t1); toff = t2 - t1; costf = cosf(toff); sintf = sinf(toff); wx0 = cimOffs[im2].wx[0]; // im2 corner warps wy0 = cimOffs[im2].wy[0]; wx1 = cimOffs[im2].wx[1]; wy1 = cimOffs[im2].wy[1]; wx2 = cimOffs[im2].wx[2]; wy2 = cimOffs[im2].wy[2]; wx3 = cimOffs[im2].wx[3]; wy3 = cimOffs[im2].wy[3]; pxm1 = cimPXMs[im1]; // base image pxm2 = cimPXMs[im2]; // comparison image (virtual warps) ww = pxm1->ww; hh = pxm1->hh; ww2 = ww / 2; hh2 = hh / 2; wwi = 1.0 / ww; hhi = 1.0 / hh; ww2i = 1.0 / ww2; hh2i = 1.0 / hh2; cmatch = 0; maxcmatch = 1; if (cimPano) { for (py1 = cimOv1ylo; py1 < cimOv1yhi; py1++) // loop overlapping pixels for (px1 = cimOv1xlo; px1 < cimOv1xhi; px1++) { ii = py1 * ww + px1; // skip low-contrast pixels if (! cimRedpix[ii]) continue; pix1 = PXMpix(pxm1,px1,py1); // image1 pixel if (pix1[3] < 254) continue; // ignore void pixels px2 = costf * (px1 - xoff) + sintf * (py1 - yoff); // corresponding image2 pixel py2 = costf * (py1 - yoff) - sintf * (px1 - xoff); dx = dy = 0.0; // corner warp xdisp = (px2 - ww2) * ww2i; // -1 ... 0 ... +1 ydisp = (py2 - hh2) * hh2i; if (xdisp > 0) // right half, no warp dx = dy = 0; else if (ydisp < 0) { // use NW corner warp dx = wx0 * xdisp * ydisp; dy = wy0 * xdisp * ydisp; } else { // use SW corner warp dx = wx3 * xdisp * ydisp; dy = wy3 * xdisp * ydisp; } px2 += dx; // source pixel location py2 += dy; // after corner warps vstat = vpixel(pxm2,px2,py2,vpix2); // get virtual pixel if (! vstat) continue; match = PIXmatch(pix1,vpix2); // compare, brightness adjusted cmatch += match; // accumulate total match maxcmatch += 1.0; } } else { for (py1 = cimOv1ylo; py1 < cimOv1yhi; py1++) // loop overlapping pixels for (px1 = cimOv1xlo; px1 < cimOv1xhi; px1++) { ii = py1 * ww + px1; // skip low-contrast pixels if (! cimRedpix[ii]) continue; pix1 = PXMpix(pxm1,px1,py1); // image1 pixel if (pix1[3] < 254) continue; // ignore void pixels px2 = costf * (px1 - xoff) + sintf * (py1 - yoff); // corresponding image2 pixel py2 = costf * (py1 - yoff) - sintf * (px1 - xoff); dx = dy = 0.0; // corner warp coeff = (1.0 - py2 * hhi - px2 * wwi); // corner 0 NW if (coeff > 0) { dx += coeff * wx0; dy += coeff * wy0; } coeff = (1.0 - py2 * hhi - (ww - px2) * wwi); // corner 1 NE if (coeff > 0) { dx += coeff * wx1; dy += coeff * wy1; } coeff = (1.0 - (hh - py2) * hhi - (ww - px2) * wwi); // corner 2 SE if (coeff > 0) { dx += coeff * wx2; dy += coeff * wy2; } coeff = (1.0 - (hh - py2) * hhi - px2 * wwi); // corner 3 SW if (coeff > 0) { dx += coeff * wx3; dy += coeff * wy3; } px2 += dx; // source pixel location py2 += dy; // after corner warps vstat = vpixel(pxm2,px2,py2,vpix2); if (! vstat) continue; match = PIXmatch(pix1,vpix2); // compare pixels cmatch += match; // accumulate total match maxcmatch += 1.0; } } return cmatch / maxcmatch; } // combine and show all images // used for all combine image functions except Vpano. // fnew >> make new E3 output image and adjust x and y offsets // cimPXMw[*] >> E3pxm >> main window // fblend: 0 > 50/50 blend, 1 > gradual blend // CALLED FROM THREADS as well as from main() namespace cim_show_images_names { int im1, im2, iminc, fblendd; int wwlo[10], wwhi[10]; int hhlo[10], hhhi[10]; float costf[10], sintf[10]; } void cim_show_images(int fnew, int fblend) { using namespace cim_show_images_names; void * cim_show_images_wthread(void *arg); int imx, pxr, pyr, ii, px3, py3; int ww, hh, wwmin, wwmax, hhmin, hhmax, bmid; float xf, yf, tf; float *pix3; paintlock(1); // block window paint fblendd = fblend; // blend 50/50 or gradual ramp im1 = cimShowIm1; // two images to show im2 = cimShowIm2; iminc = im2 - im1; if (cimShowAll) { // show all images im1 = 0; im2 = cimNF-1; iminc = 1; } for (imx = 0; imx < cimNF; imx++) { // pre-calculate costf[imx] = cosf(cimOffs[imx].tf); sintf[imx] = sinf(cimOffs[imx].tf); } if (fnew) PXM_free(E3pxm); // force new output pixmap if (! E3pxm) // allocate output pixmap { wwmin = hhmin = 9999; // initial values wwmax = cimPXMw[im2]->ww; hhmax = cimPXMw[im2]->hh; for (imx = im1; imx <= im2; imx += iminc) // find min and max ww and hh extents { xf = cimOffs[imx].xf; yf = cimOffs[imx].yf; tf = cimOffs[imx].tf; ww = cimPXMw[imx]->ww; hh = cimPXMw[imx]->hh; if (xf < wwmin) wwmin = xf; if (xf - tf * hh < wwmin) wwmin = xf + tf * hh; if (xf + ww > wwmax) wwmax = xf + ww; if (xf + ww - tf * hh > wwmax) wwmax = xf + ww - tf * hh; if (yf < hhmin) hhmin = yf; if (yf + tf * ww < hhmin) hhmin = yf + tf * ww; if (yf + hh > hhmax) hhmax = yf + hh; if (yf + hh + tf * ww > hhmax) hhmax = yf + hh + tf * ww; } for (imx = im1; imx <= im2; imx += iminc) { // align to top and left edges cimOffs[imx].xf -= wwmin; cimOffs[imx].yf -= hhmin; } wwmax = wwmax - wwmin; hhmax = hhmax - hhmin; wwmin = hhmin = 0; if (cimPano) { for (imx = im1; imx <= im2; imx += iminc) // deliberate margins cimOffs[imx].yf += 10; hhmax += 20; } E3pxm = PXM_make(wwmax,hhmax,4); // allocate output image Eww = wwmax; Ehh = hhmax; } for (imx = im1; imx <= im2; imx += iminc) // get ww range of each image { ww = cimPXMw[imx]->ww; hh = cimPXMw[imx]->hh; tf = cimOffs[imx].tf; wwlo[imx] = cimOffs[imx].xf; wwhi[imx] = wwlo[imx] + ww; wwlo[imx] -= 0.5 * tf * hh; // use midpoint of sloping edges wwhi[imx] -= 0.5 * tf * hh; } if (cimBlend) { // blend width active for (imx = im1; imx <= im2-1; imx += iminc) // reduce for blend width { if (wwhi[imx] - wwlo[imx+1] > cimBlend) { bmid = (wwhi[imx] + wwlo[imx+1]) / 2; wwlo[imx+1] = bmid - cimBlend / 2; wwhi[imx] = bmid + cimBlend / 2; } } } do_wthreads(cim_show_images_wthread,NSMP); // worker threads zmainloop(); // 25.1 if (cimRedpix) { imx = cimRedImage; // paint red pixels for current image ww = cimPXMw[imx]->ww; // being aligned hh = cimPXMw[imx]->hh; for (ii = 0; ii < ww * hh; ii++) { if (cimRedpix[ii]) { pyr = ii / ww; // red pixel pxr = ii - pyr * ww; px3 = cimOffs[imx].xf + pxr * costf[imx] - pyr * sintf[imx] + 0.5; py3 = cimOffs[imx].yf + pyr * costf[imx] + pxr * sintf[imx] + 0.5; if (px3 < 0 || px3 > E3pxm->ww-1) continue; // off top/bottom edge if (py3 < 0 || py3 > E3pxm->hh-1) continue; pix3 = PXMpix(E3pxm,px3,py3); pix3[0] = 255; pix3[1] = pix3[2] = 0; } } } paintlock(-1); // unblock window paint Fpaint2(); // update window return; } void * cim_show_images_wthread(void *arg) // working thread { using namespace cim_show_images_names; int index = *((int *) (arg)); int imx, imy; int px3, py3; int vstat, vstat1, vstat2; float red1, green1, blue1; float red2, green2, blue2; float red3, green3, blue3, alpha3; float f1, f2, px, py; float vpix[4], *pix3; red1 = green1 = blue1 = 0; f1 = f2 = 0.5; // to use if no fblend flag for (py3 = index; py3 < E3pxm->hh; py3 += NSMP) // loop E3 rows for (px3 = 0; px3 < E3pxm->ww; px3++) // loop E3 columns { vstat1 = vstat2 = 0; for (imx = imy = im1; imx <= im2; imx += iminc) // find which images overlap this pixel { if (px3 < wwlo[imx] || px3 > wwhi[imx]) continue; px = costf[imx] * (px3 - cimOffs[imx].xf) + sintf[imx] * (py3 - cimOffs[imx].yf); py = costf[imx] * (py3 - cimOffs[imx].yf) - sintf[imx] * (px3 - cimOffs[imx].xf); vstat = vpixel(cimPXMw[imx],px,py,vpix); if (! vstat) continue; if (vpix[3] < 250) continue; // voided pixel if (! vstat1) { // first overlapping image vstat1 = 1; imy = imx; red1 = vpix[0]; green1 = vpix[1]; blue1 = vpix[2]; } else { // second image vstat2 = 1; red2 = vpix[0]; green2 = vpix[1]; blue2 = vpix[2]; break; } } imx = imy; // first of 1 or 2 overlapping images if (vstat1) { if (! vstat2) { red3 = red1; // use image1 pixel green3 = green1; blue3 = blue1; } else { // use blended image1 + image2 pixels if (fblendd) { f1 = wwhi[imx] - px3; // gradual blend f2 = px3 - wwlo[imx+1]; f1 = f1 / (f1 + f2); f2 = 1.0 - f1; } red3 = f1 * red1 + f2 * red2; green3 = f1 * green1 + f2 * green2; blue3 = f1 * blue1 + f2 * blue2; } alpha3 = 255; } else red3 = green3 = blue3 = alpha3 = 0; // no overlapping image, pixel void pix3 = PXMpix(E3pxm,px3,py3); // output pixel pix3[0] = red3; pix3[1] = green3; pix3[2] = blue3; pix3[3] = alpha3; } return 0; } // cut-off edges of output image where all input images do not overlap // (HDR HDF Stack) void cim_trim() { int edgex[8] = { 0, 1, 2, 2, 2, 1, 0, 0 }; // 4 corners and 4 midpoints of rectangle int edgey[8] = { 0, 0, 0, 1, 2, 2, 2, 1 }; // 0 and 2 mark corners, 1 marks midpoints int edgewx[4] = { +1, -1, -1, +1 }; int edgewy[4] = { +1, +1, -1, -1 }; int imx, ii, jj, ww, hh, px3, py3, px9, py9; int wwmin, wwmax, hhmin, hhmax; float xf, yf, tf, sintf, costf, px, py, wx, wy; float *pix3, *pix9; wwmin = hhmin = 0; wwmax = E3pxm->ww; hhmax = E3pxm->hh; for (imx = 0; imx < cimNF; imx++) // loop all images { ww = cimPXMw[imx]->ww; // image size hh = cimPXMw[imx]->hh; xf = cimOffs[imx].xf; // alignment offsets yf = cimOffs[imx].yf; tf = cimOffs[imx].tf; sintf = sinf(tf); costf = cosf(tf); for (ii = 0; ii < 8; ii++) // 8 points around image rectangle { px = ww * edgex[ii] / 2; // coordinates before warping py = hh * edgey[ii] / 2; if (edgex[ii] != 1 && edgey[ii] != 1) { // if a corner jj = ii / 2; wx = cimOffs[imx].wx[jj]; // corner warp wy = cimOffs[imx].wy[jj]; if (edgewx[jj] > 0 && wx < 0) px -= wx; // if warp direction inwards, if (edgewx[jj] < 0 && wx > 0) px -= wx; // reduce px/py by warp if (edgewy[jj] > 0 && wy < 0) py -= wy; if (edgewy[jj] < 0 && wy > 0) py -= wy; } px3 = xf + px * costf - py * sintf; // map px/py to output image px3/py3 py3 = yf + py * costf + px * sintf; if (edgex[ii] != 1) { if (px3 < ww/2 && px3 > wwmin) wwmin = px3; // remember px3/py3 extremes if (px3 > ww/2 && px3 < wwmax) wwmax = px3; } if (edgey[ii] != 1) { if (py3 < hh/2 && py3 > hhmin) hhmin = py3; if (py3 > hh/2 && py3 < hhmax) hhmax = py3; } } } wwmin += 2; // compensate rounding wwmax -= 2; hhmin += 2; hhmax -= 2; ww = wwmax - wwmin; // new image size hh = hhmax - hhmin; if (ww < 0.7 * E3pxm->ww) return; // sanity check if (hh < 0.7 * E3pxm->hh) return; E9pxm = PXM_make(ww,hh,4); for (py3 = hhmin; py3 < hhmax; py3++) // E9 = trimmed E3 for (px3 = wwmin; px3 < wwmax; px3++) { px9 = px3 - wwmin; py9 = py3 - hhmin; pix3 = PXMpix(E3pxm,px3,py3); pix9 = PXMpix(E9pxm,px9,py9); memcpy(pix9,pix3,pixcc); } PXM_free(E3pxm); // E3 = E9 E3pxm = E9pxm; E9pxm = 0; E3pxm->ww = ww; E3pxm->hh = hh; return; } // add list of used image files to metadata history void cim_add_meta_hist() { int ii, hcc, pcc; ch *pp, imagenames[1000]; for (ii = hcc = 0; ii < cimNF; ii++) { pp = strrchr(cimFile[ii],'/'); if (! pp) zappcrash("cim file missing: %d",ii); pp++; pcc = strlen(pp); if (hcc + pcc >= 998) printf("*** cannot add meta history \n"); strcpy(imagenames+hcc,pp); hcc += pcc; strcpy(imagenames+hcc," "); hcc++; } edit_addhist(imagenames); return; } // dump offsets to stdout - diagnostic tool void cim_dump_offsets(ch *label) { printf("\n offsets: %s \n",label); for (int imx = 0; imx < cimNF; imx++) { printf(" imx %d x/y/t: %.1f %.1f %.4f w0: %.1f %.1f w1: %.1f %.1f w2: %.1f %.1f w3: %.1f %.1f \n", imx, cimOffs[imx].xf, cimOffs[imx].yf, cimOffs[imx].tf, cimOffs[imx].wx[0], cimOffs[imx].wy[0], cimOffs[imx].wx[1], cimOffs[imx].wy[1], cimOffs[imx].wx[2], cimOffs[imx].wy[2], cimOffs[imx].wx[3], cimOffs[imx].wy[3]); } return; } fotocx/f.warp.cc0000664000175000017500000054351315247006660012547 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit - warp menu functions m_unbend straighten curved image or improve perspective m_perspective select a tetragon and convert into a rectangle m_warp_area select an area and warp interior with mouse drags m_warp_linear1 warp an image using a linear transform 1 m_warp_linear2 warp an image using a linear transform 2 m_warp_curved warp an image using a curved transform m_warp_affine warp an image using an affine transform m_warp_radial add or remove barrel or pincushion distortion m_unwarp_closeup close-up face photo, remove "balloon face" distortioin m_makewaves distort an image with a wave pattern m_twist twist image centered at mouse position m_sphere sphere projection, image shrinks from center to edge m_inside_out turn an image inside-out m_tiny_planet wrap a panorama image around a circle m_escher_spiral generate inward-spiraling recursive image m_flatphoto flatten photo of a curved surface ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) /**************************************************************************************/ // unbend an image // straighten curvature added by pano or improve perspective namespace unbend_names { float ub_lin_horz, ub_lin_vert; // unbend values from dialog float ub_cur_horz, ub_cur_vert; float ub_x1, ub_x2, ub_y1, ub_y2; // unbend axes scaled 0 to 1 int ub_hx1, ub_hy1, ub_hx2, ub_hy2; int ub_vx1, ub_vy1, ub_vx2, ub_vy2; editfunc EFunbend; } // menu function void m_unbend(GtkWidget *, ch *menu) { using namespace unbend_names; int unbend_dialog_event(zdialog* zd, ch *event); void * unbend_thread(void *); void unbend_mousefunc(); F1_help_topic = TX("UNBEND"); printf("m_unbend \n"); EFunbend.menuname = "Unbend"; EFunbend.FprevReq = 1; // use preview EFunbend.threadfunc = unbend_thread; // thread function EFunbend.mousefunc = unbend_mousefunc; // mouse function if (! edit_setup(EFunbend)) return; // setup edit PXM_addalpha(E0pxm); PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); /*** _______________________ | Unbend | | _____ | | | | [____] | | |_____| | | _____ | | | | [____] | | |_____| | | _____ | | | | [____] | | |_____| | | _____ | | | | [____] | | |_____| | | | | [OK] [X] | |_______________________| ***/ zdialog *zd = zdialog_new(TX("Unbend"),Mwin,"OK","X",null); EFunbend.zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"space=10|homog"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"space=10|homog"); zdialog_add_widget(zd,"icon","VL","vb1","unbend vert linear.png","size=64"); zdialog_add_widget(zd,"icon","VC","vb1","unbend vert curved.png","size=64"); zdialog_add_widget(zd,"icon","HL","vb1","unbend horz linear.png","size=64"); zdialog_add_widget(zd,"icon","HC","vb1","unbend horz curved.png","size=64"); zdialog_add_widget(zd,"zspin","splinvert","vb2","-300|300|1|0"); // finer steps zdialog_add_widget(zd,"zspin","spcurvert","vb2","-300|300|1|0"); zdialog_add_widget(zd,"zspin","splinhorz","vb2","-300|300|1|0"); zdialog_add_widget(zd,"zspin","spcurhorz","vb2","-300|300|1|0"); ub_x1 = ub_x2 = ub_y1 = ub_y2 = 0.5; // initial axes thru image middle ub_lin_horz = ub_lin_vert = 0; ub_cur_horz = ub_cur_vert = 0; takeMouse(unbend_mousefunc,dragcursor); // connect mouse function thread_signal(); zdialog_run(zd,unbend_dialog_event,"save"); // run dialog, parallel return; } // dialog event and completion callback function int unbend_dialog_event(zdialog *zd, ch *event) { using namespace unbend_names; void unbend_mousefunc(); if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) // dialog complete { if (zd->zstat == 1) { // done CEF->Fmods = 0; if (ub_cur_vert || ub_cur_horz || // image3 modified ub_lin_vert || ub_lin_horz) { CEF->Fmods = 1; CEF->Fsaved = 0; // done } edit_fullsize(); // get full size image if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } edit_addhist("%.0f %.0f %.0f %.0f",ub_lin_vert,ub_cur_vert, // edit parms > edit hist ub_lin_horz, ub_cur_horz); draw_toplines(2,0); // erase axes-lines edit_done(0); // commit edit } else edit_cancel(0); // discard edit draw_toplines(2,0); // erase axes-lines return 1; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(unbend_mousefunc,dragcursor); if (strmatch(event,"splinvert")) { // get new unbend value zdialog_fetch(zd,"splinvert",ub_lin_vert); thread_signal(); // trigger thread } if (strmatch(event,"spcurvert")) { zdialog_fetch(zd,"spcurvert",ub_cur_vert); thread_signal(); } if (strmatch(event,"splinhorz")) { zdialog_fetch(zd,"splinhorz",ub_lin_horz); thread_signal(); } if (strmatch(event,"spcurhorz")) { zdialog_fetch(zd,"spcurhorz",ub_cur_horz); thread_signal(); } return 1; } // unbend mouse function // adjustable axes void unbend_mousefunc() { using namespace unbend_names; ch *close; float dist1, dist2; float mpx = 0, mpy = 0; if (LMclick) { // left mouse click mpx = Mxclick; mpy = Myclick; } if (Mxdrag || Mydrag) { // mouse dragged mpx = Mxdrag; mpy = Mydrag; } if (! mpx && ! mpy) return; mpx = 1.0 * mpx / Eww; // scale mouse position 0 to 1 mpy = 1.0 * mpy / Ehh; if (mpx < 0.2 || mpx > 0.8 ) { // check reasonable position if (mpy < 0.1 || mpy > 0.9) return; } else if (mpy < 0.2 || mpy > 0.8) { if (mpx < 0.1 || mpx > 0.9) return; } else return; close = "?"; // find closest axis end-point dist1 = 2; dist2 = mpx * mpx + (mpy-ub_y1) * (mpy-ub_y1); if (dist2 < dist1) { dist1 = dist2; close = "left"; } dist2 = (1-mpx) * (1-mpx) + (mpy-ub_y2) * (mpy-ub_y2); if (dist2 < dist1) { dist1 = dist2; close = "right"; } dist2 = (mpx-ub_x1) * (mpx-ub_x1) + mpy * mpy; if (dist2 < dist1) { dist1 = dist2; close = "top"; } dist2 = (mpx-ub_x2) * (mpx-ub_x2) + (1-mpy) * (1-mpy); if (dist2 < dist1) { dist1 = dist2; close = "bottom"; } if (strmatch(close,"left")) ub_y1 = mpy; // set new axis end-point if (strmatch(close,"right")) ub_y2 = mpy; if (strmatch(close,"top")) ub_x1 = mpx; if (strmatch(close,"bottom")) ub_x2 = mpx; thread_signal(); // trigger thread LMclick = Mxdrag = Mydrag = 0; return; } // unbend thread function void * unbend_thread(void *arg) { using namespace unbend_names; void * unbend_wthread(void *); ub_hx1 = 0; // scale axes to Eww/hh ub_hy1 = ub_y1 * Ehh; ub_hx2 = Eww; ub_hy2 = ub_y2 * Ehh; ub_vx1 = ub_x1 * Eww; ub_vy1 = 0; ub_vx2 = ub_x2 * Eww; ub_vy2 = Ehh; Ntoplines = 2; toplines[0].x1 = ub_hx1; // lines on window toplines[0].y1 = ub_hy1; toplines[0].x2 = ub_hx2; toplines[0].y2 = ub_hy2; toplines[0].type = 3; // black/white pair toplines[1].x1 = ub_vx1; toplines[1].y1 = ub_vy1; toplines[1].x2 = ub_vx2; toplines[1].y2 = ub_vy2; toplines[1].type = 3; do_wthreads(unbend_wthread,NSMP); // worker threads CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); // update window return 0; } void * unbend_wthread(void *arg) // worker thread function { using namespace unbend_names; int index = *((int *) arg); int vstat, px3, py3, cx3, cy3; float dispx, dispy, dispx2, dispy2; float px1, py1, vx1, vx2, hy1, hy2; float curvert, curhorz, linvert, linhorz; float vpix[4], *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); curvert = int(ub_cur_vert * 0.0033 * Ehh); // -0.99 to +0.99 curhorz = int(ub_cur_horz * 0.0033 * Eww); linvert = int(ub_lin_vert * 0.00043 * Ehh); // -0.13 to +0.13 linhorz = int(ub_lin_horz * 0.00043 * Eww); vx1 = ub_vx1; vx2 = ub_vx2; hy1 = ub_hy1; hy2 = ub_hy2; for (py3 = index; py3 < Ehh; py3 += NSMP) // step through F3 pixels for (px3 = 0; px3 < Eww; px3++) { cx3 = vx1 + (vx2 - vx1) * py3 / Ehh; // center of unbend cy3 = hy1 + (hy2 - hy1) * px3 / Eww; dispx = 2.0 * (px3 - cx3) / Eww; // -1.0 .. 0.0 .. +1.0 (roughly) dispy = 2.0 * (py3 - cy3) / Ehh; // -1.0 .. 0.0 .. +1.0 dispx2 = -cosf(0.8 * dispx) + 1; // curved dispy2 = -cosf(0.8 * dispy) + 1; pix3 = PXMpix(E3pxm,px3,py3); // output pixel px1 = px3; // input pixel = output py1 = py3; px1 += dispx * dispy * linhorz; // move input pixel py1 += dispy * dispx * linvert; px1 -= dispx * dispy2 * curhorz; // change sign py1 -= dispy * dispx2 * curvert; vstat = vpixel(E1pxm,px1,py1,vpix); if (vstat) memcpy(pix3,vpix,pcc); else memset(pix3,0,pcc); } return 0; } /**************************************************************************************/ // Convert a selected tetragon area into a rectangle, converting the // rest of the image to match and keeping straight lines straight. namespace perspective { int PSP_pixel[4][2]; // last 0-4 pixels clicked int PSP_npix; // count of pixels ch PSP_pixlab[4][4] = { " A ", " B ", " C ", " D " }; int PSP_corner = 0; editfunc EFperspective; } // menu function void m_perspective(GtkWidget *, ch *menu) { using namespace perspective; int perspective_dialog_event(zdialog *zd, ch *event); void perspective_mousefunc(void); ch *PSP_message = TX("Click the four corners of a tetragon area. Press [apply]. \n" "The image is warped to make the tetragon into a rectangle."); F1_help_topic = TX("PERSPECTIVE"); printf("m_perspective \n"); EFperspective.menufunc = m_perspective; EFperspective.menuname = "Perspective"; EFperspective.mousefunc = perspective_mousefunc; // mouse function if (! edit_setup(EFperspective)) return; // setup edit PXM_addalpha(E0pxm); PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); PSP_npix = 0; // no pixels yet zdialog *zd = zdialog_new(TX("Fix Perspective"),Mwin,TX("Apply"), TX("Reset"),TX("Crop"),"OK",null); zdialog_add_widget(zd,"label","lab1","dialog",PSP_message,"space=3"); EFperspective.zd = zd; zdialog_run(zd,perspective_dialog_event,"save"); // run dialog, parallel takeMouse(perspective_mousefunc,dragcursor); // connect mouse function return; } // dialog completion callback function int perspective_dialog_event(zdialog *zd, ch *event) { using namespace perspective; void perspective_warpfunc(void); void perspective_mousefunc(); int ii, px, py; if (strmatch(event,"done")) zd->zstat = 3; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 4; // from f_open() if (strmatch(event,"focus")) // toggle mouse capture takeMouse(perspective_mousefunc,dragcursor); if (! zd->zstat) return 1; // wait for completion if (zd->zstat == 1) // apply { erase_toptext(102); // erase points perspective_warpfunc(); // do the warp zd->zstat = 0; // keep dialog active } else if (zd->zstat == 2) // reset { edit_reset(); zd->zstat = 0; for (ii = 0; ii < PSP_npix; ii++) // show pixel labels on image { px = PSP_pixel[ii][0]; py = PSP_pixel[ii][1]; add_toptext(102,px,py,PSP_pixlab[ii],"Sans 8"); } Fpaint2(); } else if (zd->zstat == 3) { // crop erase_toptext(102); edit_done(0); m_crop(0,0); } else if (zd->zstat == 4) { // done erase_toptext(102); // erase labels edit_done(0); // commit edit } else { // cancel erase_toptext(102); // erase labels edit_cancel(0); // discard edit } return 1; } // mouse function - click on 4 corners of tetragon void perspective_mousefunc() { using namespace perspective; int ii, minii, jj, px, py; float dist, distx, disty, mindist; if (LMclick) // left click { for (ii = 0; ii < PSP_npix; ii++) // check if very near a previous corner { if (abs(PSP_pixel[ii][0] - Mxclick) < 0.07 * Eww && abs(PSP_pixel[ii][1] - Myclick) < 0.07 * Ehh) { PSP_pixel[ii][0] = Mxclick; // yes, set new corner position PSP_pixel[ii][1] = Myclick; PSP_corner = ii; goto showcorners; } } if (PSP_npix < 4) // if < 4 corners, add a new one { ii = PSP_npix; // next corner to fill PSP_pixel[ii][0] = Mxclick; // save newest corner position PSP_pixel[ii][1] = Myclick; PSP_corner = ii; PSP_npix++; goto showcorners; } mindist = 99999; // all 4 corners already specified minii = -1; for (ii = 0; ii < 4; ii++) // find closest corner to click position { distx = (Mxclick - PSP_pixel[ii][0]); disty = (Myclick - PSP_pixel[ii][1]); dist = sqrt(distx*distx + disty*disty); if (dist < mindist) { mindist = dist; minii = ii; } } if (minii >= 0) { // set new corner position ii = minii; PSP_pixel[ii][0] = Mxclick; PSP_pixel[ii][1] = Myclick; PSP_corner = ii; goto showcorners; } } else if (RMclick) // right click { mindist = 99999; minii = -1; for (ii = 0; ii < PSP_npix; ii++) // find closest corner to click position { distx = (Mxclick - PSP_pixel[ii][0]); disty = (Myclick - PSP_pixel[ii][1]); dist = sqrt(distx*distx + disty*disty); if (dist < mindist) { mindist = dist; minii = ii; } } if (minii >= 0) { // replace deleted corner with ii = minii; // last corner jj = PSP_npix - 1; PSP_pixel[ii][0] = PSP_pixel[jj][0]; PSP_pixel[ii][1] = PSP_pixel[jj][1]; PSP_corner = ii; --PSP_npix; // reduce corner count goto showcorners; } } showcorners: // show corner labels on image erase_toptext(102); for (ii = 0; ii < PSP_npix; ii++) { px = PSP_pixel[ii][0]; py = PSP_pixel[ii][1]; add_toptext(102,px,py,PSP_pixlab[ii],"Sans 8"); } LMclick = RMclick = 0; Fpaint2(); return; } // perspective warp function - make input tetragon into a rectangle void perspective_warpfunc() { using namespace perspective; int ii, jj, tempx, tempy, vstat; float px3, py3, trpx[4], trpy[4]; float sqpx0, sqpy0, sqpx1, sqpy1, sqpx2, sqpy2, sqpx3, sqpy3; float cdx0, cdy0, cdx1, cdy1, cdx2, cdy2, cdx3, cdy3; float px1, py1, dispx, dispy, sqww, sqhh; float f0, f1, f2, f3; float vpix1[4], *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); if (PSP_npix != 4) { zmessageACK(Mwin,TX("must have 4 corners")); return; } for (ii = 0; ii < 4; ii++) { // get 4 selected tetragon points trpx[ii] = PSP_pixel[ii][0]; trpy[ii] = PSP_pixel[ii][1]; } // sort 4 points in clockwise order NW, NE, SE, SW for (ii = 0; ii < 4; ii++) { // sort top to bottom (y order) for (jj = ii; jj < 4; jj++) { if (trpy[jj] < trpy[ii]) { tempx = trpx[ii]; tempy = trpy[ii]; trpx[ii] = trpx[jj]; trpy[ii] = trpy[jj]; trpx[jj] = tempx; trpy[jj] = tempy; } } } if (trpx[1] < trpx[0]) { // sort upper two left, right tempx = trpx[0]; tempy = trpy[0]; trpx[0] = trpx[1]; trpy[0] = trpy[1]; trpx[1] = tempx; trpy[1] = tempy; } if (trpx[2] < trpx[3]) { // sort lower two right, left tempx = trpx[2]; tempy = trpy[2]; trpx[2] = trpx[3]; trpy[2] = trpy[3]; trpx[3] = tempx; trpy[3] = tempy; } if (trpx[0] < trpx[3]) sqpx0 = sqpx3 = trpx[0]; // rectangle enclosing tetragon else sqpx0 = sqpx3 = trpx[3]; if (trpx[1] > trpx[2]) sqpx1 = sqpx2 = trpx[1]; else sqpx1 = sqpx2 = trpx[2]; if (trpy[0] < trpy[1]) sqpy0 = sqpy1 = trpy[0]; else sqpy0 = sqpy1 = trpy[1]; if (trpy[2] > trpy[3]) sqpy2 = sqpy3 = trpy[2]; else sqpy2 = sqpy3 = trpy[3]; /*** sqpx0 = sqpx3 = 0.5 * (trpx[0] + trpx[3]); // rectangle bisecting tetragon sides sqpx1 = sqpx2 = 0.5 * (trpx[1] + trpx[2]); sqpy0 = sqpy1 = 0.5 * (trpy[0] + trpy[1]); sqpy2 = sqpy3 = 0.5 * (trpy[2] + trpy[3]); ***/ cdx0 = sqpx0 - trpx[0]; // displacement of tetragon corner cdy0 = sqpy0 - trpy[0]; // to corresponding rectangle corner cdx1 = sqpx1 - trpx[1]; cdy1 = sqpy1 - trpy[1]; cdx2 = sqpx2 - trpx[2]; cdy2 = sqpy2 - trpy[2]; cdx3 = sqpx3 - trpx[3]; cdy3 = sqpy3 - trpy[3]; sqww = 1.0 / (sqpx1 - sqpx0); // rectangle width and height sqhh = 1.0 / (sqpy3 - sqpy0); Fbusy(+1); for (py3 = 0; py3 < Ehh; py3++) // loop all output pixels for (px3 = 0; px3 < Eww; px3++) { f0 = (1.0 - (px3 - sqpx0) * sqww) * (1.0 - (py3 - sqpy0) * sqhh); f1 = (px3 - sqpx0) * sqww * (1.0 - (py3 - sqpy0) * sqhh); f2 = (px3 - sqpx0) * sqww * (py3 - sqpy0) * sqhh; f3 = (1.0 - (px3 - sqpx0) * sqww) * (py3 - sqpy0) * sqhh; dispx = cdx0 * f0 + cdx1 * f1 + cdx2 * f2 + cdx3 * f3; dispy = cdy0 * f0 + cdy1 * f1 + cdy2 * f2 + cdy3 * f3; px1 = px3 - dispx; // input virtual pixel for px3/py3 py1 = py3 - dispy; pix3 = PXMpix(E3pxm,int(px3),int(py3)); // output pixel vstat = vpixel(E1pxm,px1,py1,vpix1); // output pixel = input virtual pixel if (vstat) memcpy(pix3,vpix1,pcc); else memset(pix3,0,pcc); // voided pixel } Fbusy(-1); CEF->Fmods++; // image is modified CEF->Fsaved = 0; Fpaint2(); // update window return; } /**************************************************************************************/ // warp/distort area - select image area and pull with mouse namespace warp_area { float *dragx, *dragy; // memory for pixel warp vectors int wacc, Fexpand; int Fstarted; int area_num; editfunc EFwarparea; } // menu function void m_warp_area(GtkWidget *, ch *menu) { using namespace warp_area; int warp_area_dialog_event(zdialog *zd, ch *event); void warp_area_mousefunc(); ch *warp_area_message = TX("Select an area to warp using select area function. \n" "Press [start warp] and pull area with mouse. \n" "Make multiple mouse pulls until satisfied. \n" "When finished, select another area or press [OK]."); F1_help_topic = TX("WARP AREA"); printf("m_warp_area \n"); EFwarparea.menufunc = m_warp_area; EFwarparea.menuname = "Warp Area"; EFwarparea.Farea = 2; // select area usable EFwarparea.mousefunc = warp_area_mousefunc; // mouse function if (! edit_setup(EFwarparea)) return; // setup edit zdialog *zd = zdialog_new("Warp Area",Mwin,"OK","X",null); EFwarparea.zd = zd; zdialog_add_widget(zd,"label","lab1","dialog",warp_area_message,"space=3"); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=5"); zdialog_add_widget(zd,"button","start","hb1",TX("start warp"),"space=5"); zdialog_add_widget(zd,"button","reset","hb1",TX("Reset"),"space=5"); wacc = Eww * Ehh; dragx = (float *) zmalloc(wacc * sizeof(float),"warp area"); // get memory for pixel warp vectors dragy = (float *) zmalloc(wacc * sizeof(float),"warp area"); Fstarted = 0; area_num = 0; Fexpand = 0; zdialog_run(zd,warp_area_dialog_event,"save"); // run dialog, parallel return; } // dialog event and completion callback function int warp_area_dialog_event(zdialog * zd, ch *event) { using namespace warp_area; void warp_area_mousefunc(); int init = 0; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat == 1) edit_done(0); // commit edit else edit_cancel(0); // discard edit zfree(dragx); // release memory zfree(dragy); return 1; } if (! sa_validate()) init = 1; // area invalid for curr. image file if (sa_stat != sa_stat_fini) // no select area active init = 1; if (Fstarted && area_num != areanumber) // select area changed init = 1; if (init) { memset(dragx,0,wacc); memset(dragy,0,wacc); Fstarted = 0; area_num = 0; return 1; } if (strmatch(event,"start")) // start warp { if (sa_stat != sa_stat_fini) { // no select area active zmessageACK(Mwin,TX("no active Select Area")); return 1; } sa_edgecalc(); // calculate area edge distances takeMouse(warp_area_mousefunc,dragcursor); // connect mouse function Fstarted = 1; area_num = areanumber; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(warp_area_mousefunc,dragcursor); if (strmatch(event,"reset")) { // undo all warps edit_reset(); memset(dragx,0,wacc); // clear warp vectors memset(dragy,0,wacc); } return 1; } // warp mouse function void warp_area_mousefunc() { using namespace warp_area; void warp_area_warpfunc(float mdx, float mdy, float mdw, float mdh, int acc); void warp_area_expand(); static float mdx, mdy, mdw, mdh; static int warped = 0; if (! Fstarted) return; if (Mxdrag || Mydrag) // mouse drag underway { mdx = Mxdown; // drag origin, image coordinates mdy = Mydown; // int ii = mdy * Fpxb->ww + mdx; // disable drag outside area // if (! sa_pixmap[ii]) return; mdw = Mxdrag - Mxdown; // drag increment mdh = Mydrag - Mydown; warp_area_warpfunc(mdx,mdy,mdw,mdh,0); // warp image warped = 1; Mxdrag = Mydrag = 0; return; } else if (warped) { warped = 0; warp_area_warpfunc(mdx,mdy,mdw,mdh,1); // drag done, update warp vectors if (Fexpand) warp_area_expand(); } return; } // warp image and accumulate warp memory // mdx/y = mouse initial position // mdw/h = mouse drag vector void warp_area_warpfunc(float mdx, float mdy, float mdw, float mdh, int acc) { using namespace warp_area; void warp_area_warpfunc2(float mdx, float mdy, float mdw, float mdh, int acc); int ii, px, py, ww, hh, vstat; float ddx, ddy, dpe, dpm1, dpm2, dpm; float mag, dispx, dispy; float vpix[4], *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); if (sa_stat != sa_stat_fini) return; // area erased ww = E1pxm->ww; hh = E1pxm->hh; ii = mdy * ww + mdx; if (! sa_pixmap[ii]) { // if mouse drag outside select area warp_area_warpfunc2(mdx,mdy,mdw,mdh,acc); // then use alternate function return; } for (py = sa_miny; py < sa_maxy; py++) // loop all pixels in area for (px = sa_minx; px < sa_maxx; px++) { ii = py * ww + px; dpe = sa_pixmap[ii]; // distance from area edge if (dpe < 1) continue; // outside area dpe -= 1; // rebase edge = 0 ddx = (px - mdx); // pixel distance to mouse position ddy = (py - mdy); // before drag dpm1 = sqrt(ddx*ddx + ddy*ddy); ddx -= mdw; // pixel distance to mouse position ddy -= mdh; // after drag dpm2 = sqrt(ddx*ddx + ddy*ddy); dpm = 0.5 * (dpm1 + dpm2); // mean mag = (dpe / (dpm + dpe)); // 1...0 for pixel at mouse...edge dispx = -mdw * mag; // pixel movement from drag movement dispy = -mdh * mag; dispx += dragx[ii]; // add this warp to prior dispy += dragy[ii]; if (acc) { // mouse drag done, dragx[ii] = dispx; // accumulate warp memory dragy[ii] = dispy; continue; } vstat = vpixel(E1pxm,px+dispx,py+dispy,vpix); // input virtual pixel if (vstat) { pix3 = PXMpix(E3pxm,px,py); // output pixel memcpy(pix3,vpix,pcc); } } ww = sa_maxx - sa_minx; // update window hh = sa_maxy - sa_miny; Fpaint3(sa_minx,sa_miny,ww,hh,0); CEF->Fmods++; CEF->Fsaved = 0; return; } // warp function when mouse is dragged outside select area void warp_area_warpfunc2(float mdx, float mdy, float mdw, float mdh, int acc) { using namespace warp_area; int ii, jj, px, py, dpx, dpy, dpe; int xlo, xhi, ylo, yhi; int ww, hh, vstat; float ddx, ddy, dpm1, dpm2, dpm; float mag, dispx, dispy; float mdmax, mdmax2; float vpix[4], *pix1, *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); #define distance(px1,py1,px2,py2) \ sqrtf((px2-px1)*(px2-px1)+(py2-py1)*(py2-py1)) Fexpand = 1; // note select area will expand ww = E1pxm->ww; hh = E1pxm->hh; ylo = sa_miny; // select area enclosing rectangle yhi = sa_maxy; xlo = sa_minx; xhi = sa_maxx; if (mdy < ylo) ylo = mdy - 200; // extend area to mouse posn + more if (mdy > yhi) yhi = mdy + 200; if (mdx < xlo) xlo = mdx - 200; if (mdx > xhi) xhi = mdx + 200; if (ylo < 0) ylo = 0; if (yhi > hh) yhi = hh; if (xlo < 0) xlo = 0; if (xhi > ww) xhi = ww; mdmax = distance(mdx,mdy,xlo,ylo); // find max. mouse distance from mdmax2 = distance(mdx,mdy,xhi,ylo); // enclosing rectangle corners if (mdmax2 > mdmax) mdmax = mdmax2; mdmax2 = distance(mdx,mdy,xhi,yhi); if (mdmax2 > mdmax) mdmax = mdmax2; mdmax2 = distance(mdx,mdy,xlo,yhi); if (mdmax2 > mdmax) mdmax = mdmax2; for (py = ylo; py < yhi; py++) // loop all pixels in enclosing rectangle for (px = xlo; px < xhi; px++) { ddx = (px - mdx); // pixel distance to mouse initial position ddy = (py - mdy); dpm1 = sqrt(ddx*ddx + ddy*ddy); ddx -= mdw; // pixel distance to mouse curr. position ddy -= mdh; dpm2 = sqrt(ddx*ddx + ddy*ddy); dpm = 0.5 * (dpm1 + dpm2); // mean mag = 1.0 - dpm / mdmax; // 1...0 for pixel-mouse 0...mdmax dispx = -mdw * mag; dispy = -mdh * mag; // pixel movement from drag movement ii = py * ww + px; dispx += dragx[ii]; // add this warp to prior dispy += dragy[ii]; dpx = px + dispx; // source virtual pixel dpy = py + dispy; // (nearest real pixel) if (dpx < 0) dpx = 0; if (dpx > ww-1) dpx = ww-1; if (dpy < 0) dpy = 0; if (dpy > hh-1) dpy = hh-1; jj = dpy * ww + dpx; dpe = sa_pixmap[jj]; // distance from area edge if (dpe < 1) // outside area dispx = dispy = 0; if (acc) { // mouse drag done, dragx[ii] = dispx; // accumulate warp memory dragy[ii] = dispy; continue; } if (dpe) { // source pixel inside area vstat = vpixel(E1pxm,px+dispx,py+dispy,vpix); // = input virtual pixel if (vstat) { pix3 = PXMpix(E3pxm,px,py); // output pixel memcpy(pix3,vpix,pcc); continue; } } pix1 = PXMpix(E1pxm,px,py); // pixel is unchanged pix3 = PXMpix(E3pxm,px,py); memcpy(pix3,pix1,pcc); } ww = xhi - xlo; // update window hh = yhi - ylo; Fpaint3(xlo,ylo,ww,hh,0); CEF->Fmods++; CEF->Fsaved = 0; return; } // expand select area if pulled outside the original bounds void warp_area_expand() { using namespace warp_area; int ii, px, py, ww, hh; ww = E1pxm->ww; hh = E1pxm->hh; for (py = 0; py < hh; py++) // loop all pixels for (px = 0; px < ww; px++) { ii = py * ww + px; // find pixels that have moved if (! dragx[ii] && ! dragy[ii]) continue; sa_pixmap[ii] = 1; // mark within area } sa_map_pixels(); sa_finish_auto(); area_num = areanumber; Fexpand = 0; return; } /********************************************************************************/ // warp/distort whole image with linear transform 1 // fix perspective problems (e.g. leaning buildings) namespace warp_linear1 { float *WarpLx, *WarpLy; // memory of all dragged pixels float WarpLmem[4][100]; // undo memory, last 100 drags int NWarpL; // WarpLmem count int WarpLdrag; int Pww, Phh; float $mdx, $mdy, $mdw, $mdh; // warpL1_warpfunc() and warpL1_wthread() int $D, $Dx, $Dy, $acc; // use these $ args editfunc EFwarpL1; } // menu function void m_warp_linear1(GtkWidget *, ch *menu) // 26.8 { using namespace warp_linear1; int WarpL1_dialog_event(zdialog * zd, ch *event); void WarpL1_mousefunc(); ch *WarpL1_message = TX("Drag near an image corner using the mouse"); int px, py, ii; int64 cc64; F1_help_topic = "WARP LINEAR1"; printf("m_warp_linear1 \n"); EFwarpL1.menufunc = m_warp_linear1; EFwarpL1.menuname = "Warp Linear1"; EFwarpL1.FprevReq = 1; // use preview EFwarpL1.mousefunc = WarpL1_mousefunc; // mouse function if (! edit_setup(EFwarpL1)) return; // setup edit PXM_addalpha(E0pxm); PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); zdialog *zd = zdialog_new("Warp Linear1",Mwin,"OK","Cancel",null); EFwarpL1.zd = zd; zdialog_add_widget(zd,"label","lab1","dialog",WarpL1_message,"space=3"); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=10"); zdialog_add_widget(zd,"button","undolast","hb1","Undo Last","space=5"); zdialog_add_widget(zd,"button","undoall","hb1","Undo All","space=5"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=6"); NWarpL = WarpLdrag = 0; // no drag data cc64 = imagesize(Eww, Ehh, sizeof(float),1); WarpLx = (float *) zmalloc(cc64,"warp linear1"); // get memory for pixel displacements WarpLy = (float *) zmalloc(cc64,"warp linear1"); for (py = 0; py < Ehh; py++) // no pixel displacements for (px = 0; px < Eww; px++) { ii = py * Eww + px; WarpLx[ii] = WarpLy[ii] = 0.0; } Pww = Eww; // save preview dimensions Phh = Ehh; zdialog_run(zd,WarpL1_dialog_event,"save"); // run dialog, parallel takeMouse(WarpL1_mousefunc,dragcursor); // connect mouse function return; } // dialog event and completion callback function int WarpL1_dialog_event(zdialog * zd, ch *event) { using namespace warp_linear1; void WarpL1_warpfunc(); int px, py, ii; int fpx, fpy, epx, epy, vstat; float scale, dispx, dispy; float vpix[4], *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) goto complete; if (strmatch(event,"undolast")) { if (NWarpL == 1) event = "undoall"; else if (NWarpL) { // undo most recent drag ii = --NWarpL; $mdx = WarpLmem[0][ii]; $mdy = WarpLmem[1][ii]; $mdw = -WarpLmem[2][ii]; $mdh = -WarpLmem[3][ii]; $acc = 0; WarpL1_warpfunc(); // undrag image $acc = 1; WarpL1_warpfunc(); // undrag memory } } if (strmatch(event,"undoall")) // undo all drags { NWarpL = 0; // erase undo memory for (py = 0; py < Ehh; py++) // reset pixel displacements for (px = 0; px < Eww; px++) { ii = py * Eww + px; WarpLx[ii] = WarpLy[ii] = 0.0; } edit_reset(); // restore image 1 } return 1; complete: if (zd->zstat != 1 || NWarpL == 0) // cancel or no warps made edit_cancel(0); else { edit_fullsize(); // get full-size E1/E3 scale = 1.0 * (Eww + Ehh) / (Pww + Phh); // full size / preview size for (fpy = 0; fpy < Ehh; fpy++) // scale net pixel displacements for (fpx = 0; fpx < Eww; fpx++) // to full image size { epx = Pww * fpx / Eww; epy = Phh * fpy / Ehh; ii = epy * Pww + epx; dispx = WarpLx[ii] * scale; dispy = WarpLy[ii] * scale; vstat = vpixel(E1pxm,fpx+dispx,fpy+dispy,vpix); // input virtual pixel pix3 = PXMpix(E3pxm,fpx,fpy); // output pixel if (vstat) memcpy(pix3,vpix,pcc); else memset(pix3,0,pcc); // voided pixel } Fpaint2(); edit_done(0); } zfree(WarpLx); // release memory zfree(WarpLy); return 1; } // WarpL1 mouse function void WarpL1_mousefunc() { using namespace warp_linear1; void WarpL1_warpfunc(); int ii; if (Mxdrag || Mydrag) // mouse drag underway { $mdx = Mxdown; // drag origin, window coordinates $mdy = Mydown; $mdw = Mxdrag - Mxdown; // drag increment $mdh = Mydrag - Mydown; $acc = 0; WarpL1_warpfunc(); // drag image WarpLdrag = 1; Mxdrag = Mydrag = 0; return; } else if (WarpLdrag) { WarpLdrag = 0; $acc = 1; WarpL1_warpfunc(); // drag done, add to memory if (NWarpL == 100) // if full, throw away oldest { NWarpL = 99; for (ii = 0; ii < NWarpL; ii++) { WarpLmem[0][ii] = WarpLmem[0][ii+1]; WarpLmem[1][ii] = WarpLmem[1][ii+1]; WarpLmem[2][ii] = WarpLmem[2][ii+1]; WarpLmem[3][ii] = WarpLmem[3][ii+1]; } } ii = NWarpL; WarpLmem[0][ii] = $mdx; // save drag for undo WarpLmem[1][ii] = $mdy; WarpLmem[2][ii] = $mdw; WarpLmem[3][ii] = $mdh; NWarpL++; } return; } // warp image and accumulate warp memory // mouse at ($mdx,$mdy) is moved ($mdw,$mdh) pixels void WarpL1_warpfunc() { using namespace warp_linear1; void * WarpL1_wthread(void *arg); float d1, d2, d3, d4; d1 = ($mdx-0) * ($mdx-0) + ($mdy-0) * ($mdy-0); // distance, mouse to 4 corners d2 = (Eww-$mdx) * (Eww-$mdx) + ($mdy-0) * ($mdy-0); d3 = (Eww-$mdx) * (Eww-$mdx) + (Ehh-$mdy) * (Ehh-$mdy); d4 = ($mdx-0) * ($mdx-0) + (Ehh-$mdy) * (Ehh-$mdy); $D = d1; if (d2 > $D) $D = d2; // find greatest corner distance if (d3 > $D) $D = d3; if (d4 > $D) $D = d4; if ($D == d1) { // NW corner $D = 1; $Dx = $mdx; // x/y distance, mouse to edges $Dy = $mdy; } if ($D == d2) { // NE $D = 2; $Dx = Eww - $mdx; $Dy = $mdy; } if ($D == d3) { // SE $D = 3; $Dx = Eww - $mdx; $Dy = Ehh - $mdy; } if ($D == d4) { // SW $D = 4; $Dx = $mdx; $Dy = Ehh - $mdy; } do_wthreads(WarpL1_wthread,NSMP); // worker threads CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return; } // working thread to process the pixels void * WarpL1_wthread(void *arg) { using namespace warp_linear1; int index = *((int *) arg); int ii, px, py, vstat; float dx, dy, mag, dispx, dispy; float vpix[4], *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); for (py = index; py < Ehh; py += NSMP) // process all pixels for (px = 0; px < Eww; px++) { if ($D == 1) { dx = $mdx - px; // x/y distance, pixel to mouse dy = $mdy - py; } else if ($D == 2) { dx = px - $mdx; dy = $mdy - py; } else if ($D == 3) { dx = px - $mdx; dy = py - $mdy; } else /* $D == 4 */ { dx = $mdx - px; dy = py - $mdy; } mag = (1.0 - dx / $Dx) * (1.0 - dy / $Dy); // pixel movement / mouse drag dispx = -$mdw * mag; // displacement = drag * mag dispy = -$mdh * mag; ii = py * Eww + px; if ($acc) { // drag done, accumulate drag sum WarpLx[ii] += dispx; WarpLy[ii] += dispy; continue; } dispx += WarpLx[ii]; // add this drag to prior sum dispy += WarpLy[ii]; vstat = vpixel(E1pxm,px+dispx,py+dispy,vpix); // input virtual pixel pix3 = PXMpix(E3pxm,px,py); // output pixel if (vstat) memcpy(pix3,vpix,pcc); else memset(pix3,0,pcc); // voided pixel } return 0; // exit thread } /********************************************************************************/ // warp/distort whole image with linear transform 2 // fix perspective problems (e.g. near/far areas of an object) namespace warp_linear2 { float *WarpLx, *WarpLy; // memory of all dragged pixels float WarpLmem[4][100]; // undo memory, last 100 drags int NWarpL; // WarpLmem count int WarpLdrag; int ww, hh; // image dimensions float mx1, my1, mdx1, mdy1; // mouse origin and drag increment int Facc; // flag, accumulate drag memory editfunc EFwarpL2; } // menu function void m_warp_linear2(GtkWidget *, ch *menu) // 26.8 { using namespace warp_linear2; int WarpL2_dialog_event(zdialog * zd, ch *event); void WarpL2_mousefunc(); ch *WarpL2_message = TX("Drag within image using the mouse"); int px, py, ii; int64 cc64; F1_help_topic = "WARP LINEAR2"; printf("m_warp_linear2 \n"); EFwarpL2.menufunc = m_warp_linear2; EFwarpL2.menuname = "Warp Linear2"; EFwarpL2.FprevReq = 1; // use preview EFwarpL2.mousefunc = WarpL2_mousefunc; // mouse function if (! edit_setup(EFwarpL2)) return; // setup edit PXM_addalpha(E0pxm); PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); zdialog *zd = zdialog_new("Warp Linear2",Mwin,"OK","Cancel",null); EFwarpL2.zd = zd; zdialog_add_widget(zd,"label","lab1","dialog",WarpL2_message,"space=3"); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=10"); zdialog_add_widget(zd,"button","undolast","hb1","Undo Last","space=5"); zdialog_add_widget(zd,"button","undoall","hb1","Undo All","space=5"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=6"); NWarpL = WarpLdrag = 0; // no drag data cc64 = imagesize(Eww, Ehh, sizeof(float),1); WarpLx = (float *) zmalloc(cc64,"warp linear2"); // get memory for pixel displacements WarpLy = (float *) zmalloc(cc64,"warp linear2"); for (py = 0; py < Ehh; py++) // all pixel displacements = 0 for (px = 0; px < Eww; px++) { ii = py * Eww + px; WarpLx[ii] = WarpLy[ii] = 0.0; } ww = Eww; // save preview dimensions hh = Ehh; zdialog_run(zd,WarpL2_dialog_event,"save"); // run dialog, parallel takeMouse(WarpL2_mousefunc,dragcursor); // connect mouse function return; } // dialog event and completion callback function int WarpL2_dialog_event(zdialog * zd, ch *event) { using namespace warp_linear2; void WarpL2_warpfunc(); int px, py, ii; int fpx, fpy, epx, epy, vstat; float scale, dispx, dispy; float vpix[4], *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) goto complete; if (strmatch(event,"undolast")) { if (NWarpL == 1) event = "undoall"; else if (NWarpL) { // undo most recent drag ii = --NWarpL; mx1 = WarpLmem[0][ii]; my1 = WarpLmem[1][ii]; mdx1 = -WarpLmem[2][ii]; mdy1 = -WarpLmem[3][ii]; Facc = 0; WarpL2_warpfunc(); // undrag image Facc = 1; WarpL2_warpfunc(); // undrag memory } } if (strmatch(event,"undoall")) // undo all drags { NWarpL = 0; // erase undo memory for (py = 0; py < Ehh; py++) // reset pixel displacements for (px = 0; px < Eww; px++) { ii = py * Eww + px; WarpLx[ii] = WarpLy[ii] = 0.0; } edit_reset(); // restore image 1 } return 1; complete: if (zd->zstat != 1 || NWarpL == 0) // cancel or no warps made edit_cancel(0); else { edit_fullsize(); // get full-size E1/E3 scale = 1.0 * (Eww + Ehh) / (ww + hh); // full size / preview size for (fpy = 0; fpy < Ehh; fpy++) // scale net pixel displacements for (fpx = 0; fpx < Eww; fpx++) // to full image size { epx = ww * fpx / Eww; epy = hh * fpy / Ehh; ii = epy * ww + epx; dispx = WarpLx[ii] * scale; dispy = WarpLy[ii] * scale; vstat = vpixel(E1pxm,fpx+dispx,fpy+dispy,vpix); // input virtual pixel pix3 = PXMpix(E3pxm,fpx,fpy); // output pixel if (vstat) memcpy(pix3,vpix,pcc); else memset(pix3,0,pcc); // voided pixel } Fpaint2(); edit_done(0); } zfree(WarpLx); // release memory zfree(WarpLy); return 1; } // WarpL2 mouse function void WarpL2_mousefunc() { using namespace warp_linear2; void WarpL2_warpfunc(); int ii; if (Mxdrag || Mydrag) // mouse drag underway { mx1 = Mxdown; // drag origin, image space my1 = Mydown; mdx1 = Mxdrag - Mxdown; // drag vector mdy1 = Mydrag - Mydown; Facc = 0; WarpL2_warpfunc(); // drag image WarpLdrag = 1; Mxdrag = Mydrag = 0; return; } else if (WarpLdrag) // drag done { WarpLdrag = 0; Facc = 1; WarpL2_warpfunc(); // add to memory if (NWarpL == 100) // if full, throw away oldest { NWarpL = 99; for (ii = 0; ii < NWarpL; ii++) { WarpLmem[0][ii] = WarpLmem[0][ii+1]; WarpLmem[1][ii] = WarpLmem[1][ii+1]; WarpLmem[2][ii] = WarpLmem[2][ii+1]; WarpLmem[3][ii] = WarpLmem[3][ii+1]; } } ii = NWarpL; WarpLmem[0][ii] = mx1; // save drag for undo WarpLmem[1][ii] = my1; WarpLmem[2][ii] = mdx1; WarpLmem[3][ii] = mdy1; NWarpL++; } return; } // warp image and accumulate warp memory // mouse at (mx1,my1) is moved (mdx1,mdy1) pixels void WarpL2_warpfunc() { using namespace warp_linear2; void * WarpL2_wthread(void *arg); do_wthreads(WarpL2_wthread,NSMP); // worker threads CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return; } // working thread to process the pixels void * WarpL2_wthread(void *arg) { using namespace warp_linear2; int index = *((int *) arg); int ii, px, py, vstat; float x1, y1, x2, y2; float dx1, dy1, dx2, dy2; float vpix[4], *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); for (py = index; py < Ehh; py += NSMP) // process all pixels for (px = 0; px < Eww; px++) { x1 = mx1; // drag origin (pixel) y1 = my1; dx1 = mdx1; // drag vector dy1 = mdy1; x2 = px; // this pixel y2 = py; if (x2 > x1) dx2 = - dx1 * (1.0 - (x2 - x1) / (ww - x1)); else if (x2 < x1) dx2 = - dx1 * (1.0 - (x1 - x2) / x1); else dx2 = - dx1; if (y2 > y1) dy2 = - dy1 * (1.0 - (y2 - y1) / (hh - y1)); else if (y2 < y1) dy2 = - dy1 * (1.0 - (y1 - y2) / y1); else dy2 = - dy1; ii = py * Eww + px; if (Facc) { // drag done, accumulate drag sum WarpLx[ii] += dx2; WarpLy[ii] += dy2; continue; } dx2 += WarpLx[ii]; // add this drag to prior sum dy2 += WarpLy[ii]; vstat = vpixel(E1pxm,px+dx2,py+dy2,vpix); // input virtual pixel pix3 = PXMpix(E3pxm,px,py); // output pixel if (vstat) memcpy(pix3,vpix,pcc); else memset(pix3,0,pcc); // voided pixel } return 0; // exit thread } /**************************************************************************************/ // warp/distort whole image with a curved transform // fix perspective problems (e.g. curved walls, leaning buildings) namespace warp_curved { float *dragx, *dragy; // memory of all dragged pixels float dragmem[5][100]; // undo memory, last 100 drags int Ndrag; // dragmem count int Fdrag; int Pww, Phh; float $mdx, $mdy, $mdw, $mdh; // warp_curved_warpfunc() and float $D, $span; // warp_curved_wthread() use these $args int $acc; editfunc EFwarp_curved; } // menu function void m_warp_curved(GtkWidget *, ch *menu) { using namespace warp_curved; int warp_curved_dialog_event(zdialog *zd, ch *event); void warp_curved_mousefunc(void); ch *warp_curved_message = TX("Pull an image position using the mouse. \n" "Make multiple mouse pulls until satisfied. \n" "When finished, press [OK]."); int px, py, ii; int64 cc64; F1_help_topic = TX("WARP CURVED"); printf("m_warp_curved \n"); EFwarp_curved.menufunc = m_warp_curved; EFwarp_curved.menuname = "Warp Curved"; EFwarp_curved.FprevReq = 1; // use preview EFwarp_curved.mousefunc = warp_curved_mousefunc; // mouse function if (! edit_setup(EFwarp_curved)) return; // setup edit PXM_addalpha(E0pxm); PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); zdialog *zd = zdialog_new(TX("Warp Curved"),Mwin,"OK","X",null); EFwarp_curved.zd = zd; zdialog_add_widget(zd,"label","lab1","dialog",warp_curved_message,"space=3"); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=8"); zdialog_add_widget(zd,"button","undolast","hb1",TX("Undo Last"),"space=8"); zdialog_add_widget(zd,"button","undoall","hb1",TX("Undo All"),"space=2"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=4"); zdialog_add_widget(zd,"label","lab2","hb2",TX("warp span"),"space=8"); zdialog_add_widget(zd,"zspin","span","hb2","0.01|2.0|0.01|0.1","space=1"); Ndrag = Fdrag = 0; // no drag data cc64 = imagesize(Eww, Ehh, sizeof(float),1); if (! cc64) return; // 26.3 dragx = (float *) zmalloc(cc64,"warp curved"); // get memory for pixel displacements dragy = (float *) zmalloc(cc64,"warp curved"); for (py = 0; py < Ehh; py++) // no pixel displacements for (px = 0; px < Eww; px++) { ii = py * Eww + px; dragx[ii] = dragy[ii] = 0.0; } Pww = Eww; // save preview dimensions Phh = Ehh; zdialog_load_inputs(zd); // restore previous inputs zdialog_fetch(zd,"span",$span); // save span value zdialog_run(zd,warp_curved_dialog_event,"save"); // run dialog, parallel takeMouse(warp_curved_mousefunc,dragcursor); // connect mouse function return; } // dialog event and completion callback function int warp_curved_dialog_event(zdialog * zd, ch *event) { using namespace warp_curved; void warp_curved_warpfunc(); void warp_curved_mousefunc(); int px, py, ii; int fpx, fpy, epx, epy, vstat; float scale, dispx, dispy; float vpix[4], *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) goto complete; if (strmatch(event,"focus")) // toggle mouse capture takeMouse(warp_curved_mousefunc,dragcursor); if (strmatch(event,"undolast")) { if (Ndrag == 1) event = "undoall"; else if (Ndrag) { // undo most recent drag ii = --Ndrag; $mdx = dragmem[0][ii]; $mdy = dragmem[1][ii]; $mdw = -dragmem[2][ii]; $mdh = -dragmem[3][ii]; $span = dragmem[4][ii]; zdialog_stuff(zd,"span",$span); $acc = 0; warp_curved_warpfunc(); // undrag image $acc = 1; warp_curved_warpfunc(); // undrag memory } } if (strmatch(event,"undoall")) // undo all drags { Ndrag = 0; // erase undo memory for (py = 0; py < Ehh; py++) // reset pixel displacements for (px = 0; px < Eww; px++) { ii = py * Eww + px; dragx[ii] = dragy[ii] = 0.0; } edit_reset(); // restore image 1 } if (strmatch(event,"span")) zdialog_fetch(zd,"span",$span); return 1; complete: if (zd->zstat) { if (Ndrag == 0) zd->zstat = 2; // no warps, cancel if (zd->zstat == 1) // done { edit_fullsize(); // get full size image scale = 1.0 * (Eww + Ehh) / (Pww + Phh); // full size / preview size for (fpy = 0; fpy < Ehh; fpy++) // scale net pixel displacements for (fpx = 0; fpx < Eww; fpx++) // to full image size { epx = Pww * fpx / Eww; epy = Phh * fpy / Ehh; ii = epy * Pww + epx; dispx = dragx[ii] * scale; dispy = dragy[ii] * scale; vstat = vpixel(E1pxm,fpx+dispx,fpy+dispy,vpix); // input virtual pixel pix3 = PXMpix(E3pxm,fpx,fpy); // output pixel if (vstat) memcpy(pix3,vpix,pcc); else memset(pix3,0,pcc); // voided pixel } Fpaint2(); edit_done(0); // commit edit } else edit_cancel(0); // discard edit zfree(dragx); // release memory zfree(dragy); } return 1; } // warp_curved mouse function void warp_curved_mousefunc() { using namespace warp_curved; void warp_curved_warpfunc(); int ii; if (Mxdrag || Mydrag) // mouse drag underway { $mdx = Mxdown; // drag origin $mdy = Mydown; $mdw = Mxdrag - Mxdown; // drag increment $mdh = Mydrag - Mydown; $acc = 0; warp_curved_warpfunc(); // drag image Fdrag = 1; Mxdrag = Mydrag = 0; return; } else if (Fdrag) { Fdrag = 0; $acc = 1; warp_curved_warpfunc(); // drag done, add to memory if (Ndrag == 100) // if full, throw away oldest { Ndrag = 99; for (ii = 0; ii < Ndrag; ii++) { dragmem[0][ii] = dragmem[0][ii+1]; dragmem[1][ii] = dragmem[1][ii+1]; dragmem[2][ii] = dragmem[2][ii+1]; dragmem[3][ii] = dragmem[3][ii+1]; dragmem[4][ii] = dragmem[4][ii+1]; } } ii = Ndrag; dragmem[0][ii] = $mdx; // save drag for undo dragmem[1][ii] = $mdy; dragmem[2][ii] = $mdw; dragmem[3][ii] = $mdh; dragmem[4][ii] = $span; Ndrag++; } return; } // warp image and accumulate warp memory // mouse at (mx,my) is moved (mw,mh) pixels void warp_curved_warpfunc() { using namespace warp_curved; void * warp_curved_wthread(void *arg); float D, d1, d2, d3, d4; d1 = ($mdx-0) * ($mdx-0) + ($mdy-0) * ($mdy-0); // distance, mouse to 4 corners d2 = (Eww-$mdx) * (Eww-$mdx) + ($mdy-0) * ($mdy-0); d3 = (Eww-$mdx) * (Eww-$mdx) + (Ehh-$mdy) * (Ehh-$mdy); d4 = ($mdx-0) * ($mdx-0) + (Ehh-$mdy) * (Ehh-$mdy); D = d1; if (d2 > D) D = d2; // find greatest corner distance if (d3 > D) D = d3; if (d4 > D) D = d4; $D = D * $span * $span; do_wthreads(warp_curved_wthread,NSMP); // worker threads CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return; } // working thread to process the pixels void * warp_curved_wthread(void *arg) { using namespace warp_curved; int index = *((int *) arg); int ii, px, py, vstat; float d, mag, dispx, dispy; float vpix[4], *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); for (py = index; py < Ehh; py += NSMP) // process all pixels for (px = 0; px < Eww; px++) { d = (px-$mdx)*(px-$mdx) + (py-$mdy)*(py-$mdy); mag = (1.0 - d / $D); if (mag < 0) continue; mag = mag * mag; // faster than pow(mag,4); mag = mag * mag; dispx = -$mdw * mag; // displacement = drag * mag dispy = -$mdh * mag; ii = py * Eww + px; if ($acc) { // drag done, accumulate drag sum dragx[ii] += dispx; dragy[ii] += dispy; continue; } dispx += dragx[ii]; // add this drag to prior sum dispy += dragy[ii]; vstat = vpixel(E1pxm,px+dispx,py+dispy,vpix); // input virtual pixel pix3 = PXMpix(E3pxm,px,py); // output pixel if (vstat) memcpy(pix3,vpix,pcc); else memset(pix3,0,pcc); // voided pixel } return 0; // exit thread } /**************************************************************************************/ // warp/distort whole image using affine transform // (straight lines remain straight) namespace warp_affine { float waf_old[3][2]; // 3 original image points float waf_new[3][2]; // corresponding warped points float waf_coeff[6]; // transform coefficients float waf_Icoeff[6]; // inverse transform coefficients int waf_ftf; // first time flag editfunc EFwarpareaF; } // menu function void m_warp_affine(GtkWidget *, ch *menu) { using namespace warp_affine; int warp_affine_dialog_event(zdialog *zd, ch *event); void warp_affine_mousefunc(void); ch *warp_affine_message = TX("Pull on an image corner using the mouse. \n" "Make multiple mouse pulls until satisfied. \n" "When finished, press [OK]."); F1_help_topic = TX("WARP AFFINE"); printf("m_warp_affine \n"); EFwarpareaF.menufunc = m_warp_affine; EFwarpareaF.menuname = "Warp Affine"; EFwarpareaF.FprevReq = 1; // use preview EFwarpareaF.mousefunc = warp_affine_mousefunc; // mouse function if (! edit_setup(EFwarpareaF)) return; // setup edit PXM_addalpha(E0pxm); PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); zdialog *zd = zdialog_new(TX("Warp Affine"),Mwin,"OK","X",null); EFwarpareaF.zd = zd; zdialog_add_widget(zd,"label","lab1","dialog",warp_affine_message,"space=3"); waf_ftf = 1; // 1st warp flag zdialog_run(zd,warp_affine_dialog_event,"save"); // run dialog, parallel takeMouse(warp_affine_mousefunc,dragcursor); // connect mouse function return; } // dialog event and completion callback function int warp_affine_dialog_event(zdialog *zd, ch *event) { using namespace warp_affine; void warp_affine_warpfunc(); // image warp function void warp_affine_mousefunc(); float scale; int Pww, Phh; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (strmatch(event,"focus")) // toggle mouse capture takeMouse(warp_affine_mousefunc,dragcursor); if (! zd->zstat) return 1; // wait for completion if (zd->zstat != 1 || ! CEF->Fmods) { edit_cancel(0); return 1; } Pww = Eww; // preview image dimensions Phh = Ehh; edit_fullsize(); // get full-size images scale = 1.0 * (Eww + Ehh) / (Pww + Phh); // preview to full-size scale factor waf_old[0][0] = waf_old[0][0] * scale; // re-scale new and old points waf_old[0][1] = waf_old[0][1] * scale; waf_old[1][0] = waf_old[1][0] * scale; waf_old[1][1] = waf_old[1][1] * scale; waf_old[2][0] = waf_old[2][0] * scale; waf_old[2][1] = waf_old[2][1] * scale; waf_new[0][0] = waf_new[0][0] * scale; waf_new[0][1] = waf_new[0][1] * scale; waf_new[1][0] = waf_new[1][0] * scale; waf_new[1][1] = waf_new[1][1] * scale; waf_new[2][0] = waf_new[2][0] * scale; waf_new[2][1] = waf_new[2][1] * scale; warp_affine_warpfunc(); // warp full-size image edit_done(0); return 1; } // warpAF mouse function void warp_affine_mousefunc() { using namespace warp_affine; void warp_affine_warpfunc(); // image warp function void warp_affine_invert(float coeff[6], float Icoeff[6]); // compute reverse transform coefficients int mdx1, mdy1, mdx2, mdy2; float x1o, y1o, x2o, y2o, x3o, y3o; float x1n, y1n, x2n, y2n, x3n, y3n; float a, b, c, d, e, f; if (! Mxdrag && ! Mydrag) return; mdx1 = Mxdown; // mouse drag origin mdy1 = Mydown; mdx2 = Mxdrag; // mouse drag position mdy2 = Mydrag; Mxdown = Mxdrag; // reset origin for next time Mydown = Mydrag; x1n = mdx1; // point 1 = drag origin y1n = mdy1; x2n = Eww - x1n; // point 2 = mirror of point1 y2n = Ehh - y1n; x3n = Eww * (y2n / Ehh); y3n = Ehh * (1.0 - (x2n / Eww)); if (waf_ftf) // first warp { waf_ftf = 0; x1o = x1n; // old = current positions y1o = y1n; x2o = x2n; y2o = y2n; x3o = x3n; y3o = y3n; } else { warp_affine_invert(waf_coeff,waf_Icoeff); // get inverse coefficients a = waf_Icoeff[0]; b = waf_Icoeff[1]; c = waf_Icoeff[2]; d = waf_Icoeff[3]; e = waf_Icoeff[4]; f = waf_Icoeff[5]; x1o = a * x1n + b * y1n + c; // compute old from current positions y1o = d * x1n + e * y1n + f; x2o = a * x2n + b * y2n + c; y2o = d * x2n + e * y2n + f; x3o = a * x3n + b * y3n + c; y3o = d * x3n + e * y3n + f; } waf_old[0][0] = x1o; // set up 3 old points and corresponding waf_old[0][1] = y1o; // new points for affine translation waf_old[1][0] = x2o; waf_old[1][1] = y2o; waf_old[2][0] = x3o; waf_old[2][1] = y3o; x1n = mdx2; // point 1 new position = drag position y1n = mdy2; x2n = Eww - x1n; // point 2 new = mirror of point1 new y2n = Ehh - y1n; waf_new[0][0] = x1n; // 3 new points waf_new[0][1] = y1n; waf_new[1][0] = x2n; waf_new[1][1] = y2n; waf_new[2][0] = x3n; waf_new[2][1] = y3n; warp_affine_warpfunc(); // do the warp Mxdrag = Mydrag = 0; return; } // warp image and accumulate warp memory void warp_affine_warpfunc() { using namespace warp_affine; void warp_affine_affine(float po[3][2], float pn[3][2], float coeff[6]); // compute affine transform coefficients void warp_affine_invert(float coeff[6], float Icoeff[6]); // compute reverse transform coefficients void * warp_affine_wthread(void *); warp_affine_affine(waf_old, waf_new, waf_coeff); // get coefficients for forward transform warp_affine_invert(waf_coeff, waf_Icoeff); // get coefficients for reverse transform do_wthreads(warp_affine_wthread,NSMP); // worker threads CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return; } // working thread to process the pixels void * warp_affine_wthread(void *arg) { using namespace warp_affine; int index = *((int *) arg); float a, b, c, d, e, f; int px3, py3, vstat; float px1, py1; float vpix1[4], *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); a = waf_Icoeff[0]; // coefficients to map output pixels b = waf_Icoeff[1]; // to corresponding input pixels c = waf_Icoeff[2]; d = waf_Icoeff[3]; e = waf_Icoeff[4]; f = waf_Icoeff[5]; for (py3 = index; py3 < Ehh; py3 += NSMP) // process all pixels for (px3 = 0; px3 < Eww; px3++) { px1 = a * px3 + b * py3 + c; // corresponding input pixel py1 = d * px3 + e * py3 + f; vstat = vpixel(E1pxm,px1,py1,vpix1); // input virtual pixel pix3 = PXMpix(E3pxm,px3,py3); // output pixel if (vstat) memcpy(pix3,vpix1,pcc); else memset(pix3,0,pcc); // voided pixel } return 0; // exit thread } /************************************************************************************** Compute affine transformation of an image (warp image). Given 3 new (warped) positions for 3 image points, derive the coefficients of the translation function to warp the entire image. Inputs: pold[3][2] (x,y) coordinates for 3 points in original image pnew[3][2] (x,y) coordinates for same points in warped image Output: coeff[6] coefficients of translation function which can be used to convert all image points to their warped positions If coeff[6] = (a, b, c, d, e, f) then the following formula can be used to convert an image point to its warped position: Xnew = a * Xold + b * Yold + c Ynew = d * Xold + e * Yold + f ***************************************************************************************/ void warp_affine_affine(float pold[3][2], float pnew[3][2], float coeff[6]) { float x11, y11, x12, y12, x13, y13; // original points float x21, y21, x22, y22, x23, y23; // moved points float a, b, c, d, e, f; // coefficients float A1, A2, B1, B2, C1, C2; x11 = pold[0][0]; y11 = pold[0][1]; x12 = pold[1][0]; y12 = pold[1][1]; x13 = pold[2][0]; y13 = pold[2][1]; x21 = pnew[0][0]; y21 = pnew[0][1]; x22 = pnew[1][0]; y22 = pnew[1][1]; x23 = pnew[2][0]; y23 = pnew[2][1]; A1 = x11 - x12; A2 = x12 - x13; B1 = y11 - y12; B2 = y12 - y13; C1 = x21 - x22; C2 = x22 - x23; a = (B1 * C2 - B2 * C1) / (A2 * B1 - A1 * B2); b = (A1 * C2 - A2 * C1) / (A1 * B2 - A2 * B1); c = x23 - a * x13 - b * y13; C1 = y21 - y22; C2 = y22 - y23; d = (B1 * C2 - B2 * C1) / (A2 * B1 - A1 * B2); e = (A1 * C2 - A2 * C1) / (A1 * B2 - A2 * B1); f = y23 - d * x13 - e * y13; coeff[0] = a; coeff[1] = b; coeff[2] = c; coeff[3] = d; coeff[4] = e; coeff[5] = f; return; } /************************************************************************************** Invert affine transform Input: coeff[6] coefficients of translation function to convert image points to their warped positions Output: Icoeff[6] coefficients of translation function to convert warped image points to their original positions If Icoeff[6] = (a, b, c, d, e, f) then the following formula can be used to translate a warped image point to its original position: Xold = a * Xnew + b * Ynew + c Yold = d * Xnew + e * Ynew + f ***************************************************************************************/ void warp_affine_invert(float coeff[6], float Icoeff[6]) { float a, b, c, d, e, f, Z; a = coeff[0]; b = coeff[1]; c = coeff[2]; d = coeff[3]; e = coeff[4]; f = coeff[5]; Z = 1.0 / (a * e - b * d); Icoeff[0] = e * Z; Icoeff[1] = - b * Z; Icoeff[2] = Z * (b * f - c * e); Icoeff[3] = - d * Z; Icoeff[4] = a * Z; Icoeff[5] = Z * (c * d - a * f); return; } /**************************************************************************************/ // Add or remove barrel or pincushion distortion. namespace warp_radial_names { int Pww, Phh; // preview dimensions int Xcen, Ycen; // image center (mouse select) float R; // max. center - edge distance float stretch; // stretch parameter editfunc EFwarp_radial; // edit function data } // menu function void m_warp_radial(GtkWidget *, ch *menu) // rename "stretch" { using namespace warp_radial_names; int warp_radial_dialog_event(zdialog* zd, ch *event); void warp_radial_mousefunc(void); void * warp_radial_thread(void *); ch *title = TX("Add/remove barrel/pincushion distortion"); F1_help_topic = TX("WARP RADIAL"); printf("m_warp_radial \n"); m_zoom(0,"fit"); // zoom to fit window EFwarp_radial.menufunc = m_warp_radial; EFwarp_radial.menuname = "Warp Radial"; EFwarp_radial.FprevReq = 1; // use preview edit mode EFwarp_radial.mousefunc = warp_radial_mousefunc; // mouse function EFwarp_radial.threadfunc = warp_radial_thread; // thread function if (! edit_setup(EFwarp_radial)) return; // setup edit PXM_addalpha(E0pxm); // add alpha channel if missing PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); Pww = Eww; // save preview dimensions Phh = Ehh; Xcen = Eww / 2; // set dialog defaults Ycen = Ehh / 2; /*** _________________________________________ | Add/Remove barrel/pincushion distortion | | | | Drag mouse to set center | | | | Stretch ============[]================= | | | | [OK] [X] | |_________________________________________| ***/ zdialog *zd = zdialog_new(title,Mwin,"OK","X",null); // warp_radial dialog CEF->zd = zd; zdialog_add_widget(zd,"label","labtip","dialog",TX("Drag mouse to set center")); zdialog_add_widget(zd,"hbox","hbstr","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labstr","hbstr",TX("Stretch"),"space=5"); zdialog_add_widget(zd,"hscale","stretch","hbstr","-200|+200|0.5|0","expand"); R = Xcen; // R = greatest center-edge distance if (Ycen > R) R = Ycen; if (Eww - Xcen > R) R = Eww - Xcen; if (Ehh - Ycen > R) R = Ehh - Ycen; stretch = 0; // default zdialog_resize(zd,300,0); zdialog_run(zd,warp_radial_dialog_event,"save"); // run dialog - parallel takeMouse(warp_radial_mousefunc,0); // connect mouse function thread_signal(); // trigger update thread return; } // warp_radial dialog event and completion function int warp_radial_dialog_event(zdialog *zd, ch *event) { using namespace warp_radial_names; void warp_radial_mousefunc(); float scale; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (strmatch(event,"focus")) // toggle mouse capture takeMouse(warp_radial_mousefunc,dragcursor); if (zd->zstat) { if (zd->zstat == 1) // done { edit_fullsize(); // get full size image scale = 1.0 * (Eww + Ehh) / (Pww + Phh); // scale up the parameters Xcen = scale * Xcen; Ycen = scale * Ycen; stretch = scale * stretch; thread_signal(); // recalculate image edit_done(0); // commit edit } else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"stretch")) { zdialog_fetch(zd,"stretch",stretch); thread_signal(); // trigger update thread } return 1; } // mouse function - get new center from mouse click or drag void warp_radial_mousefunc() { using namespace warp_radial_names; if (! LMclick && ! Mdrag) return; LMclick = Mxdrag = Mydrag = 0; if (Mxposn < 0.1 * Eww || Mxposn > 0.9 * Eww) return; // ignore if near image edge if (Myposn < 0.1 * Ehh || Myposn > 0.9 * Ehh) return; Xcen = Mxposn; // new center Ycen = Myposn; thread_signal(); return; } // thread function - multiple working threads to update image void * warp_radial_thread(void *) { using namespace warp_radial_names; void * warp_radial_wthread(void *arg); // worker thread PXM_clear(E3pxm,0); // clear E3 to black/transparent R = Xcen; // R = greatest center-edge distance if (Ycen > R) R = Ycen; if (Eww - Xcen > R) R = Eww - Xcen; if (Ehh - Ycen > R) R = Ehh - Ycen; do_wthreads(warp_radial_wthread,NSMP); // worker threads CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); // update window return 0; } void * warp_radial_wthread(void *arg) // worker thread function { using namespace warp_radial_names; int index = *((int *) (arg)); int px3, py3, dx, dy, vstat; float s, d, px1, py1, *pix3, vpix[4]; int nc = E1pxm->nc, pcc = nc * sizeof(float); for (py3 = index; py3 < Ehh; py3 += NSMP) // loop output pixels for (px3 = 0; px3 < Eww; px3++) { dx = px3 - Xcen; // distance from mouse center dy = py3 - Ycen; d = sqrtf(dx*dx + dy*dy); // center to output pixel s = d - stretch * sinf(PI * d/R); // center to input pixel px1 = Xcen + dx * s/d; // input virtual pixel py1 = Ycen + dy * s/d; vstat = vpixel(E1pxm,px1,py1,vpix); if (! vstat) continue; pix3 = PXMpix(E3pxm,px3,py3); // input --> output pixel memcpy(pix3,vpix,pcc); } return 0; // exit thread } /**************************************************************************************/ // Unwarp closeup face photo - shrink magnified areas closest to camera namespace unwarp_closeup { int Fstarted; int unwarp_area; float warpval; int centerX, centerY; editfunc EFunwarp_closeup; } // menu function void m_unwarp_closeup(GtkWidget *, ch *menu) { using namespace unwarp_closeup; int unwarp_closeup_dialog_event(zdialog *zd, ch *event); void unwarp_closeup_mousefunc(); ch *unwarp_closeup_message = TX("Use Select Area to select a face. \n" "Click on the center of distortion. \n" "Move the slider. \n"); F1_help_topic = TX("UNWARP CLOSEUP"); printf("m_unwarp_closeup \n"); EFunwarp_closeup.menufunc = m_unwarp_closeup; EFunwarp_closeup.menuname = "Unwarp Closeup"; EFunwarp_closeup.Farea = 2; // select area usable EFunwarp_closeup.mousefunc = unwarp_closeup_mousefunc; // mouse function if (! edit_setup(EFunwarp_closeup)) return; // setup edit /*** ______________________________________ | Unwarp Closeup | | | | Use Select Area to select a face. | | Click on the center of distortion. | | Move the slider. | | | | [===============[]================] | | | | [OK] [X] | |______________________________________| ***/ zdialog *zd = zdialog_new(TX("Unwarp Closeup"),Mwin,"OK","X",null); EFunwarp_closeup.zd = zd; zdialog_add_widget(zd,"label","lab1","dialog",unwarp_closeup_message,"space=3"); zdialog_add_widget(zd,"hbox","hbw","dialog",0,"space=5"); zdialog_add_widget(zd,"hscale","warpval","hbw","0.0|1.0|0.01|0.0","space=5|expand"); takeMouse(unwarp_closeup_mousefunc,dragcursor); // connect mouse function Fstarted = 0; unwarp_area = 0; zdialog_run(zd,unwarp_closeup_dialog_event,"save"); // run dialog, parallel return; } // dialog event and completion callback function int unwarp_closeup_dialog_event(zdialog * zd, ch *event) { using namespace unwarp_closeup; void unwarp_closeup_warpfunc(); void unwarp_closeup_mousefunc(); int init = 0; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat == 1) edit_done(0); // commit edit else edit_cancel(0); // discard edit return 1; } if (! sa_validate()) init = 1; // area invalid for curr. image file if (sa_stat != sa_stat_fini) // no select area active init = 1; if (Fstarted && unwarp_area != areanumber) // select area changed init = 1; if (init) { Fstarted = 0; unwarp_area = 0; return 1; } if (strmatch(event,"focus")) // reconnect mouse takeMouse(unwarp_closeup_mousefunc,dragcursor); if (strmatch(event,"warpval")) { // slider movement zdialog_fetch(zd,"warpval",warpval); unwarp_closeup_warpfunc(); } return 1; } // mouse function void unwarp_closeup_mousefunc() { using namespace unwarp_closeup; void unwarp_closeup_warpfunc(); if (LMclick) { centerX = Mxclick; // capture central point centerY = Myclick; } else if (Mxdrag || Mydrag) { centerX = Mxdrag; centerY = Mydrag; } else return; LMclick = Mxdrag = Mydrag = 0; if (sa_stat != sa_stat_fini) { // no select area active zmessageACK(Mwin,TX("no active Select Area")); Fstarted = 0; Mdrag = 0; return; } Fstarted = 1; // unwarp can proceed unwarp_area = areanumber; sa_edgecalc(); // calculate area edge distances unwarp_closeup_warpfunc(); return; } // warp image according to slider position void unwarp_closeup_warpfunc() { using namespace unwarp_closeup; int ii, px, py, ww, vstat; float hsize, vsize, hpos, vpos; float ed, cx, cy, dx, dy; float vpix[4], *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); if (sa_stat != sa_stat_fini) return; // area erased hsize = sa_maxx - sa_minx; // area size vsize = sa_maxy - sa_miny; cx = centerX; // unwarp center (nose tip) cy = centerY; ww = E1pxm->ww; for (py = sa_miny; py < sa_maxy; py++) // loop all pixels in area for (px = sa_minx; px < sa_maxx; px++) { ii = py * ww + px; if (sa_pixmap[ii] < 1) continue; // pixel outside area hpos = 2.0 * (px - cx) / hsize; // horizontal pixel position, -1 ... +1 vpos = 2.0 * (py - cy) / vsize; // vertical pixel position, -1 ... +1 ed = sa_pixmap[ii]; // pixel edge distance hpos = hpos * ed / hsize; // scale pixel position vpos = vpos * ed / vsize; dx = sinf(PI * hpos); // pixel displacement, -1 ... +1 dy = sinf(PI * vpos); dx = dx * 0.2 * warpval * hsize; // pixel displacement, -10% ... +10% dy = dy * 0.2 * warpval * vsize; vstat = vpixel(E1pxm,px+dx,py+dy,vpix); // input virtual pixel if (vstat) { pix3 = PXMpix(E3pxm,px,py); // output pixel memcpy(pix3,vpix,pcc); } } Fpaint3(sa_minx,sa_miny,hsize,vsize,0); CEF->Fmods++; CEF->Fsaved = 0; return; } /**************************************************************************************/ // make waves menu function // distort the image with a wave pattern // independent horizontal and vertical wavelengths // variance option: make waves more or less irregular // perspective option: wavelengths lengthen going down namespace makewaves_names { editfunc EFmakewaves; int WLV, WLH; // vertical and horizontal wavelengths int AMPV, AMPH; // vertical and horizontal amplitudes int VARV, VARH; // vertical and horizontal variance int PERSP; // perspective 0-100 } // menu function void m_makewaves(GtkWidget *, ch *menu) { using namespace makewaves_names; int makewaves_dialog_event(zdialog* zd, ch *event); void * makewaves_thread(void *); F1_help_topic = TX("MAKE WAVES"); printf("m_makewaves \n"); EFmakewaves.menufunc = m_makewaves; EFmakewaves.menuname = "Make Waves"; EFmakewaves.Farea = 2; // select area usable EFmakewaves.threadfunc = makewaves_thread; if (! edit_setup(EFmakewaves)) return; /*** ___________________________________ | Make waves | | | | Horizontal Vertical | | wavelength [___] [___] | | amplitude [___] [___] | | variance [___] [___] | | | | perspective [___] | | | | [Apply] [OK] [X] | |___________________________________| ***/ zdialog *zd = zdialog_new(TX("Make Waves"),Mwin,TX("Apply"),"OK","X",null); EFmakewaves.zd = zd; zdialog_add_widget(zd,"hbox","hbw","dialog",0,"space=3"); zdialog_add_widget(zd,"vbox","vbw1","hbw",0,"space=3"); zdialog_add_widget(zd,"vbox","vbw2","hbw",0,"space=3"); zdialog_add_widget(zd,"vbox","vbw3","hbw",0,"space=3"); zdialog_add_widget(zd,"label","space","vbw1"," ","space=1"); zdialog_add_widget(zd,"label","labwl","vbw1",TX("wavelength"),"expand"); zdialog_add_widget(zd,"label","labamp","vbw1",TX("amplitude"),"expand"); zdialog_add_widget(zd,"label","labamp","vbw1",TX("variance"),"expand"); zdialog_add_widget(zd,"label","labh","vbw2",TX("horizontal"),"space=1"); zdialog_add_widget(zd,"zspin","wlh","vbw2","3|500|1|50","expand"); zdialog_add_widget(zd,"zspin","amph","vbw2","0|100|1|20","expand"); zdialog_add_widget(zd,"zspin","varh","vbw2","0|100|1|20","expand"); zdialog_add_widget(zd,"label","labh","vbw3",TX("vertical"),"space=1"); zdialog_add_widget(zd,"zspin","wlv","vbw3","3|500|1|50","expand"); zdialog_add_widget(zd,"zspin","ampv","vbw3","0|100|1|20","expand"); zdialog_add_widget(zd,"zspin","varv","vbw3","0|100|1|20","expand"); zdialog_add_widget(zd,"hsep","sepp","dialog",0,"space=3"); zdialog_add_widget(zd,"hbox","hbp","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labp","hbp",TX("perspective"),"space=3"); zdialog_add_widget(zd,"zspin","persp","hbp","0|100|1|0","space=5"); zdialog_load_inputs(zd); // restore previous inputs zdialog_run(zd,makewaves_dialog_event,"save"); // run dialog - parallel return; } // makewaves dialog event and completion function int makewaves_dialog_event(zdialog *zd, ch *event) { using namespace makewaves_names; if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (zd->zstat) { if (zd->zstat == 1) { // apply zd->zstat = 0; // keep dialog active edit_reset(); zdialog_fetch(zd,"wlv",WLV); // get user inputs zdialog_fetch(zd,"wlh",WLH); zdialog_fetch(zd,"ampv",AMPV); zdialog_fetch(zd,"amph",AMPH); zdialog_fetch(zd,"varv",VARV); zdialog_fetch(zd,"varh",VARH); zdialog_fetch(zd,"persp",PERSP); thread_signal(); // calculate return 1; } if (zd->zstat == 2) edit_done(0); // commit edit else edit_cancel(0); // discard edit } return 1; } // thread function - multiple working threads to update image void * makewaves_thread(void *) { using namespace makewaves_names; void * makewaves_wthread(void *); do_wthreads(makewaves_wthread,NSMP); // worker threads CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); // update window return 0; } void * makewaves_wthread(void *arg) // working threads { using namespace makewaves_names; int index = *((int *) (arg)); float wlv, wlh, ampv, amph, varv, varh, persp; int py, px, pylo, pyhi; int ii, edist = 0; float dx, dy, *pix3, vpix[4]; float ffv, ffh, red, green, blue; wlv = WLV; // vertical and horizontal wavelengths wlh = WLH; ampv = 0.01 * AMPV * wlv; // vertical and horizoneal amplitudes amph = 0.01 * AMPH * wlh; varv = 0.01 * VARV; // vertical and horizontal variance varh = 0.01 * VARH; persp = 0.01 * PERSP; // perspective 0 to 1.0 pylo = 0; // py range pyhi = Ehh; if (sa_stat == sa_stat_fini) { pylo = sa_miny - wlv; // rescale to select area height if (pylo < 0) pylo = 0; pyhi = sa_maxy + wlv; if (pyhi > Ehh) pyhi = Ehh; } for (py = pylo + index; py < pyhi; py += NSMP) { if (persp == 0) ffv = ffh = 1.0; else { ffv = 2.0 * persp * (py - pylo) / (pyhi - pylo); // 0 ... 2.0 ffv = 1.0 + ffv * ffv; // 1 ... 5.0 ffh = sqrtf(ffv); // 1 ... 2.23 } dx = ampv * sin(2.0 * PI * py / (ffv * wlv)); if (varv > 0) dx += ampv * varv * sin(2.0 * PI * py / (1.37 * ffv * wlv)); // make irregular wave for (px = 0; px < Eww; px++) { if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; edist = sa_pixmap[ii]; // distance from edge if (! edist) continue; // pixel outside area } dy = amph * sin(2.0 * PI * px / (ffh * wlh)); if (varh > 0) dy += amph * varh * sin(2.0 * PI * px / (1.37 * ffh * wlh)); // make irregular wave vpixel(E1pxm,px+dx,py+dy,vpix); // source pixel, displaced red = vpix[0]; green = vpix[1]; blue = vpix[2]; pix3 = PXMpix(E3pxm,px,py); // destination pixel pix3[0] = red; pix3[1] = green; pix3[2] = blue; } } return 0; // exit thread } /**************************************************************************************/ // Twist the image with max. rotation at mouse center and none at farthest edge namespace twist_names { editfunc EFtwist; int cx, cy; float twist; float center; float rotate; } // menu function void m_twist(GtkWidget *, ch *menu) { using namespace twist_names; int twist_dialog_event(zdialog *zd, ch *event); void * twist_thread(void *); void twist_mousefunc(); F1_help_topic = TX("TWIST"); printf("m_twist \n"); m_zoom(0,"fit"); // zoom to fit window EFtwist.menufunc = m_twist; EFtwist.menuname = "Twist"; EFtwist.FprevReq = 1; // use preview image EFtwist.threadfunc = twist_thread; // thread function EFtwist.mousefunc = twist_mousefunc; // mouse function if (! edit_setup(EFtwist)) return; // setup edit PXM_addalpha(E0pxm); // add alpha channel if missing PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); /*** _________________________________________ | Twist | | | | Drag mouse to set center | | | | Twist ==============[]============= | | Center ==========[]================= | | Rotate ======[]===================== | | | | [Reset] [OK] [X] | |_________________________________________| ***/ zdialog *zd = zdialog_new(TX("Twist"),Mwin,TX("Reset"),"OK","X",null); EFtwist.zd = zd; zdialog_add_widget(zd,"label","labtip","dialog",TX("Drag mouse to set center")); zdialog_add_widget(zd,"hbox","hba","dialog",0,"space=3"); zdialog_add_widget(zd,"label","laba","hba",TX("Twist"),"space=3"); zdialog_add_widget(zd,"hscale","twist","hba","-1.0|+1.0|0.01|0.0","space=5|expand"); zdialog_add_widget(zd,"hbox","hbp","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labp","hbp",TX("Center"),"space=3"); zdialog_add_widget(zd,"hscale","center","hbp","1.0|3.0|0.1|1.0","space=5|expand"); zdialog_add_widget(zd,"hbox","hbc","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labc","hbc",TX("Rotate"),"space=3"); zdialog_add_widget(zd,"hscale","rotate","hbc","-4.0|4.0|0.01|0.0","space=5|expand"); cx = Eww / 2; // initial data cy = Ehh / 2; twist = 0.0; center = 1.0; rotate = 0.0; thread_signal(); zdialog_resize(zd,300,0); zdialog_run(zd,twist_dialog_event,"save"); // run dialog - parallel takeMouse(twist_mousefunc,dragcursor); // connect mouse function return; } // dialog event and completion callback function int twist_dialog_event(zdialog *zd, ch *event) { using namespace twist_names; void twist_mousefunc(); if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (strmatch(event,"fullsize")) { // from select area edit_fullsize(); if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } return 1; } if (zd->zstat) { if (zd->zstat == 1) { // reset zd->zstat = 0; twist = 0.0; center = 1.0; rotate = 0.0; zdialog_stuff(zd,"twist",0.0); zdialog_stuff(zd,"center",1.0); zdialog_stuff(zd,"rotate",0.0); thread_signal(); } else if (zd->zstat == 2) { // done thread_wait(); // insure thread done float R = 1.0 * (E0pxm->ww + E0pxm->hh) / (Eww + Ehh); cx = R * cx; // scale geometries to full size cy = R * cy; edit_fullsize(); // get full size image if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } edit_done(0); // commit edit } else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(twist_mousefunc,dragcursor); // connect mouse function if (strmatch(event,"twist")) { zdialog_fetch(zd,"twist",twist); thread_signal(); } if (strmatch(event,"center")) { zdialog_fetch(zd,"center",center); thread_signal(); } if (strmatch(event,"rotate")) { zdialog_fetch(zd,"rotate",rotate); thread_signal(); } return 1; } // get mouse position and set new center for twist void twist_mousefunc() { using namespace twist_names; if (! LMclick && ! Mdrag) return; cx = Mxposn; // new twist center = mouse position cy = Myposn; thread_signal(); // trigger image update LMclick = Mxdrag = Mydrag = 0; return; } // thread function void * twist_thread(void *) { using namespace twist_names; void * twist_wthread(void *arg); PXM_clear(E3pxm,0); // clear E3 to black/transparent do_wthreads(twist_wthread,NSMP); // worker threads CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); return 0; } // working thread void * twist_wthread(void *arg) { using namespace twist_names; int index, vstat; int px3, py3, px33, py33; float qx, qy; float vpix[4], *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); int Dx, Dy, Dnw, Dne, Dse, Dsw; float D, DN, Dmax; float T, Tp, Tq, Tmax; Dnw = cx * cx + cy * cy; // get distance from center Dne = (Eww-cx) * (Eww-cx) + cy * cy; // to nearestest corner Dse = (Eww-cx) * (Eww-cx) + (Ehh-cy) * (Ehh-cy); Dsw = cx * cx + (Ehh-cy) * (Ehh - cy); Dmax = Dnw; if (Dne > Dmax) Dmax = Dne; if (Dse > Dmax) Dmax = Dse; if (Dsw > Dmax) Dmax = Dsw; Dmax = sqrtf(Dmax); Tmax = 6 * PI * twist; // twist angle index = *((int *) arg); for (py3 = index; py3 < Ehh; py3 += NSMP) // loop all output pixels for (px3 = 0; px3 < Eww; px3++) { Dx = px3 - cx; // px/py relative to cx/cy Dy = py3 - cy; D = Dx * Dx + Dy * Dy; // distance pixel to center if (D == 0) continue; D = sqrtf(D); Tp = asinf(Dy/D); // angle of pixel line to center if (Dx < 0) { if (Dy > 0) Tp = PI - Tp; else Tp = - PI - Tp; } DN = pow((D/Dmax),center); // distance normalized, 0.0 ... 1.0 T = Tmax * DN; // rotation at distance from center T = T + rotate; Tq = Tp + T; // rotated pixel angle qx = D * cosf(Tq); // rotated pixel position qy = D * sinf(Tq); qx = 2.0 * qx + cx; qy = 2.0 * qy + cy; vstat = vpixel(E1pxm,qx,qy,vpix); // input pixel px33 = px3 - (cx - Eww/2); // move output image to center py33 = py3 - (cy - Ehh/2); if (px33 < 0 || px33 > Eww-1) continue; if (py33 < 0 || py33 > Ehh-1) continue; pix3 = PXMpix(E3pxm,px33,py33); // output pixel if (vstat) memcpy(pix3,vpix,pcc); else memset(pix3,0,pcc); } return 0; } /**************************************************************************************/ // project image on to a sphere with adjustable radius (flatness) // image shrinks with increasing radius namespace sphere_names { int Pww, Phh; // preview dimensions int Xcen, Ycen, D1; // center and diameter of sphere float flatten; // flatten parameter float magnify; // magnify parameter editfunc EFsphere; // edit function data } // menu function void m_sphere(GtkWidget *, ch *menu) { using namespace sphere_names; int sphere_dialog_event(zdialog* zd, ch *event); void sphere_mousefunc(void); void * sphere_thread(void *); F1_help_topic = TX("SPHERE"); printf("m_sphere \n"); m_zoom(0,"fit"); // zoom to fit window EFsphere.menufunc = m_sphere; EFsphere.menuname = "Sphere"; EFsphere.FprevReq = 1; // use preview edit mode EFsphere.mousefunc = sphere_mousefunc; // mouse function EFsphere.threadfunc = sphere_thread; // thread function if (! edit_setup(EFsphere)) return; // setup edit PXM_addalpha(E0pxm); // add alpha channel if missing PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); Pww = Eww; // save preview dimensions Phh = Ehh; Xcen = Eww / 2; // set dialog defaults Ycen = Ehh / 2; D1 = Eww; if (Ehh < Eww) D1 = Ehh; flatten = 0; magnify = 1.0; /*** _____________________________ | Spherical Projection | | | | Drag mouse to set center | | | | Flatten ======[]========== | | Magnify ==========[]====== | | | | [OK] [X] | |_____________________________| ***/ zdialog *zd = zdialog_new(TX("Spherical Projection"),Mwin,"OK","X",null); // sphere dialog CEF->zd = zd; zdialog_add_widget(zd,"label","labtip","dialog",TX("Drag mouse to set center")); zdialog_add_widget(zd,"hbox","hbflat","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labflat","hbflat",TX("Flatten"),"space=5"); zdialog_add_widget(zd,"hscale","flatten","hbflat","0.0|0.999|0.001|0.0","expand"); zdialog_add_widget(zd,"hbox","hbmag","dialog"); zdialog_add_widget(zd,"label","labmag","hbmag",TX("Magnify"),"space=5"); zdialog_add_widget(zd,"hscale","magnify","hbmag","1.0|2.0|0.001|1.0","expand"); zdialog_resize(zd,250,0); zdialog_run(zd,sphere_dialog_event,"save"); // run dialog - parallel takeMouse(sphere_mousefunc,0); // connect mouse function thread_signal(); // trigger update thread return; } // sphere dialog event and completion function int sphere_dialog_event(zdialog *zd, ch *event) { using namespace sphere_names; void sphere_mousefunc(); float scale; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (strmatch(event,"focus")) // toggle mouse capture takeMouse(sphere_mousefunc,dragcursor); if (zd->zstat) { if (zd->zstat == 1) // done { edit_fullsize(); // get full size image scale = 1.0 * (Eww + Ehh) / (Pww + Phh); // scale up the parameters Xcen = scale * Xcen; Ycen = scale * Ycen; D1 = scale * D1; if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } edit_done(0); // commit edit } else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"flatten")) { zdialog_fetch(zd,"flatten",flatten); thread_signal(); // trigger update thread } if (strmatch(event,"magnify")) { zdialog_fetch(zd,"magnify",magnify); thread_signal(); // trigger update thread } return 1; } // mouse function - get new center from mouse click or drag void sphere_mousefunc() { using namespace sphere_names; int edist; if (! LMclick && ! Mdrag) return; LMclick = Mxdrag = Mydrag = 0; if (Mxposn < 0.1 * Eww || Mxposn > 0.9 * Eww) return; // ignore if near image edge if (Myposn < 0.1 * Ehh || Myposn > 0.9 * Ehh) return; Xcen = Mxposn; // new center Ycen = Myposn; edist = Xcen; // find nearest edge distance if (Ycen < edist) edist = Ycen; if (Eww - Xcen < edist) edist = Eww - Xcen; if (Ehh - Ycen < edist) edist = Ehh - Ycen; D1 = 2 * edist; // new sphere diameter thread_signal(); return; } // thread function - multiple working threads to update image void * sphere_thread(void *) { using namespace sphere_names; void * sphere_wthread(void *arg); // worker thread PXM_clear(E3pxm,0); // clear E3 to black/transparent do_wthreads(sphere_wthread,NSMP); // worker threads CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); // update window return 0; } void * sphere_wthread(void *arg) // worker thread function { using namespace sphere_names; int index = *((int *) (arg)); int px3, py3, px33, py33, dx, dy, vstat; float px1, py1, *pix3, vpix[4]; float s1, s2, D2, T; int nc = E1pxm->nc, pcc = nc * sizeof(float); D2 = D1 / (1.0 - flatten); // image diameter for (py3 = index; py3 < Ehh; py3 += NSMP) // loop output pixels for (px3 = 0; px3 < Eww; px3++) { dx = px3 - Xcen; // distance from mouse center dy = py3 - Ycen; s1 = sqrtf(dx*dx + dy*dy); // dist. from center to output pixel T = s1 * PI / D2 / magnify; // sine of subtended angle if (T > 1.0) continue; T = asinf(T); // subtended angle, 0 - PI/2 s2 = D2 * T / PI; // corresp. dist. on sphere px1 = Xcen + dx * s2 / s1; // input virtual pixel py1 = Ycen + dy * s2 / s1; vstat = vpixel(E1pxm,px1,py1,vpix); if (! vstat) continue; px33 = px3 - (Xcen - Eww/2); // move to image center py33 = py3 - (Ycen - Ehh/2); if (px33 < 0 || px33 > Eww-1) continue; if (py33 < 0 || py33 > Ehh-1) continue; pix3 = PXMpix(E3pxm,px33,py33); // output pixel memcpy(pix3,vpix,pcc); } return 0; // exit thread } /**************************************************************************************/ // Turn an image inside-out. // Convert pixels within the largest circle fitting within the image. // Replace each pixel having distance R from center with a pixel on the // same center to edge line having distance R from edge of circle. namespace inside_out_names { editfunc EFinsideout; int Pww, Phh, cx, cy, pixcc; float R, T, hole; // radius, theta } // menu function void m_inside_out(GtkWidget *, ch *menu) { using namespace inside_out_names; int inside_out_dialog_event(zdialog *zd, ch *event); void * inside_out_thread(void *); void inside_out_mousefunc(); F1_help_topic = TX("INSIDE-OUT"); printf("m_inside_out \n"); m_zoom(0,"fit"); // zoom to fit window EFinsideout.menuname = "Inside-out"; EFinsideout.menufunc = m_inside_out; EFinsideout.FprevReq = 1; // use preview image EFinsideout.threadfunc = inside_out_thread; // thread function EFinsideout.mousefunc = inside_out_mousefunc; // mouse function if (! edit_setup(EFinsideout)) return; // open edit function PXM_addalpha(E0pxm); // add an alpha channel if missing PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); Pww = Eww; // previewdimensions Phh = Ehh; cx = Pww / 2; cy = Phh / 2; T = 0.0; hole = 100; pixcc = E3pxm->nc * sizeof(float); // RGBA pixel size /*** ________________________________ | Inside-out | | Drag mouse to set center | | | | Rotate ===========[]========= | | Center Hole ====++==[]======= | | | | [OK] [X] | |________________________________| ***/ zdialog *zd = zdialog_new(TX("Inside-out"),Mwin,"OK","X",null); EFinsideout.zd = zd; zdialog_add_widget(zd,"label","labtip","dialog",TX("Drag mouse to set center")); zdialog_add_widget(zd,"hbox","hbrot","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labrot","hbrot",TX("Rotate"),"space=3"); zdialog_add_widget(zd,"hscale","rotate","hbrot","-4.0|4.0|0.01|0.0","space=5|expand"); zdialog_add_widget(zd,"hbox","hbhole","dialog"); zdialog_add_widget(zd,"label","labhole","hbhole",TX("Center Hole"),"space=3"); zdialog_add_widget(zd,"hscale","hole","hbhole","0|1000|1|100","space=5|expand"); takeMouse(inside_out_mousefunc,dragcursor); zdialog_run(zd,inside_out_dialog_event,"save"); thread_signal(); return; } // dialog event and completion callback function int inside_out_dialog_event(zdialog *zd, ch *event) { using namespace inside_out_names; void inside_out_mousefunc(); if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (strmatch(event,"focus")) // toggle mouse capture takeMouse(inside_out_mousefunc,dragcursor); // connect mouse function if (strmatch(event,"rotate")) { zdialog_fetch(zd,"rotate",T); thread_signal(); } if (strmatch(event,"hole")) { zdialog_fetch(zd,"hole",hole); thread_signal(); } if (zd->zstat) { if (zd->zstat == 1) { // done thread_wait(); // insure thread done edit_fullsize(); // get full size image float S = 1.0 * Eww / Pww; cx = S * cx; // scale params to full size cy = S * cy; hole = S * hole; if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } edit_done(0); // commit edit } else edit_cancel(0); // discard edit } return 1; } // mouse function void inside_out_mousefunc() { using namespace inside_out_names; if (! LMclick && ! Mdrag) return; // wait for click or drag cx = Mxposn; // mouse position = new center cy = Myposn; thread_signal(); // convert image LMclick = Mxdrag = Mydrag = 0; return; } // main thread function void * inside_out_thread(void *) { using namespace inside_out_names; void * inside_out_wthread(void *arg); R = cx; // R = minimum center - edge distance if (cy < cx) R = cy; if (Eww - cx < R) R = Eww - cx; if (Ehh - cy < R) R = Ehh - cy; if (R < 50) return 0; // ignore absurd center PXM_clear(E3pxm,0); // clear E3 to black/transparent do_wthreads(inside_out_wthread,NSMP); // do worker threads CEF->Fmods++; // E3 modified, not saved CEF->Fsaved = 0; Fpaint2(); // update output image return 0; } // worker thread function void * inside_out_wthread(void *arg) { using namespace inside_out_names; int index = *((int *) arg); float px1, py1, px3, py3, px33, py33; float dx1, dy1, dx3, dy3, r1, r3, T1, T3; float pix1[4], *pix3; for (py3 = index; py3 < Ehh; py3 += NSMP) // loop target pixels for (px3 = 0; px3 < Eww; px3++) { px33 = px3 - (cx - Eww/2); // move to image center py33 = py3 - (cy - Ehh/2); if (px33 < 0 || px33 > Eww-1) continue; if (py33 < 0 || py33 > Ehh-1) continue; dx3 = px3 - cx; // target pixel relative to center dy3 = py3 - cy; r3 = sqrtf(dx3*dx3 + dy3*dy3); // target pixel distance from center if (r3 < hole) continue; if (r3 > R) continue; // outside image circle T3 = asinf(dy3 / r3); // target pixel angle from center if (dx3 < 0) T3 = PI - T3; if (T3 > PI) T3 -= 2 * PI; if (T3 < PI) T3 += 2 * PI; T1 = T3 + T; // source pixel angle from center if (T1 > PI) T1 -= 2 * PI; // + user rotate if (T1 < PI) T1 += 2 * PI; r1 = R * (1 + (r3 - hole) / (hole - R)); // r3: hole >> R r1: R >> 0 dx1 = r1 * cosf(T1); // source pixel relative to center dy1 = r1 * sinf(T1); px1 = dx1 + cx; // add center py1 = dy1 + cy; if (! vpixel(E1pxm,px1,py1,pix1)) continue; // get source pixel pix3 = PXMpix(E3pxm,int(px33),int(py33)); // output pixel if (px33 < 0 || px33 > Eww-1) continue; if (py33 < 0 || py33 > Ehh-1) continue; memcpy(pix3,pix1,pixcc); } return 0; } /**************************************************************************************/ // Convert image to 'tiny planet' format. namespace tiny_planet_names { editfunc EFtinyplanet; int Pww, Phh; int ww3, hh3, ww9, hh9; int cx9, cy9, cx3, cy3, pixcc; int cuttop, cutbott, rotate; float hole, R1, R2; int revR, revT; } // menu function void m_tiny_planet(GtkWidget *, ch *menu) { using namespace tiny_planet_names; int tiny_planet_dialog_event(zdialog *zd, ch *event); void tiny_planet_process(); ch texthole[20], texttop[20], textbott[20]; F1_help_topic = TX("TINY PLANET"); printf("m_tiny_planet \n"); if (Fpxb->ww < Fpxb->hh) { zmessageACK(Mwin,TX("image width must be greater than height")); return; } EFtinyplanet.menuname = "Tiny Planet"; EFtinyplanet.menufunc = m_tiny_planet; EFtinyplanet.FprevReq = 1; // use preview image if (! edit_setup(EFtinyplanet)) return; // open edit function PXM_addalpha(E0pxm); // add alpha channel if missing PXM_addalpha(E1pxm); PXM_addalpha(E3pxm); Pww = Eww; // preview dimensions Phh = Ehh; pixcc = 4 * sizeof(float); // RGBA pixel size /*** ___________________________________ | Tiny Planet | | | | Center Hole ==========[]========= | | Cut Top ======[]================= | | Cut Bottom =[]=================== | | Rotate =========[]=============== | | [ ] Reverse R [ ] Angle | | | | [Reset] [OK] [X] | |___________________________________| hh is image height in pixels blank image area blank |-------------|-----------------|--------- center R1 R2 < 0.4*hh 0.5*hh = hole fixed ***/ zdialog *zd = zdialog_new(TX("Tiny Planet"),Mwin,"OK","X",null); EFtinyplanet.zd = zd; snprintf(texthole,20,"0|%.0f|1|%.0f", 0.4 * Ehh, 0.1 * Ehh); // hole range and default zdialog_add_widget(zd,"hbox","hbhole","dialog"); zdialog_add_widget(zd,"label","labhole","hbhole",TX("Center Hole"),"space=3"); zdialog_add_widget(zd,"hscale","hole","hbhole",texthole,"space=3|expand"); snprintf(texttop,20,"0|%.0f|1|0", 0.3 * Ehh); // cut-off top range zdialog_add_widget(zd,"hbox","hbtop","dialog"); zdialog_add_widget(zd,"label","labcuttop","hbtop",TX("Cut Top"),"space=3"); zdialog_add_widget(zd,"hscale","cuttop","hbtop",texttop,"space=3|expand"); snprintf(textbott,20,"0|%.0f|1|0", 0.3 * Ehh); // cut-off bottom range zdialog_add_widget(zd,"hbox","hbbott","dialog"); zdialog_add_widget(zd,"label","labcutbott","hbbott",TX("Cut Bottom"),"space=3"); zdialog_add_widget(zd,"hscale","cutbott","hbbott",textbott,"space=3|expand"); zdialog_add_widget(zd,"hbox","hbrotate","dialog"); // rotate range zdialog_add_widget(zd,"label","labrotate","hbrotate",TX("Rotate"),"space=3"); zdialog_add_widget(zd,"hscale","rotate","hbrotate","0|360|1|0","space=3|expand"); zdialog_add_widget(zd,"hbox","hbrev","dialog"); zdialog_add_widget(zd,"zbutton","revR","hbrev",TX("Reverse R"),"space=3"); zdialog_add_widget(zd,"zbutton","revT","hbrev",TX("Angle"),"space=8"); hole = 0.1 * Ehh; // default settings revR = revT = 0; cuttop = cutbott = 0; zdialog_run(zd,tiny_planet_dialog_event,"save"); tiny_planet_process(); // make initial image return; } // dialog event and completion callback function int tiny_planet_dialog_event(zdialog *zd, ch *event) { using namespace tiny_planet_names; void tiny_planet_process(); if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat != 1) edit_cancel(0); // cancel else // done { edit_fullsize(); // get full size input image float R = 1.0 * Eww / Pww; // scale params to full size cuttop = R * cuttop; cutbott = R * cutbott; hole = R * hole; tiny_planet_process(); // make full size output image PXM_free(E9pxm); edit_done(0); } return 1; } if (strmatch(event,"focus")) return 1; zdialog_fetch(zd,"hole",hole); zdialog_fetch(zd,"cuttop",cuttop); // get dialog inputs zdialog_fetch(zd,"cutbott",cutbott); zdialog_fetch(zd,"rotate",rotate); if (strmatch(event,"revR")) revR = 1 - revR; if (strmatch(event,"revT")) revT = 1 - revT; zmainloop(); tiny_planet_process(); // make image return 1; } void tiny_planet_process() { using namespace tiny_planet_names; int py; uint cc; float *pix1, *pix9; void * tiny_planet_wthread(void *arg); ww9 = Eww; // make input image with cuttoffs hh9 = Ehh - cuttop - cutbott; if (E9pxm) PXM_free(E9pxm); E9pxm = PXM_make(ww9,hh9,4); for (py = 0; py < hh9; py++) { pix1 = PXMpix(E1pxm,0,py + cuttop); pix9 = PXMpix(E9pxm,0,py); memcpy(pix9,pix1, Eww * pixcc); } ww3 = hh3 = hh9 + 2; // make square output image PXM_free(E3pxm); E3pxm = PXM_make(ww3,hh3,4); cc = ww3 * hh3 * pixcc; memset(E3pxm->pixels,0,cc); // all pixels black and transparent cx9 = ww9 / 2; // input image center cy9 = hh9 / 2; cx3 = ww3 / 2; // output image center cy3 = hh3 / 2; if (hole > 0.4 * hh9) hole = 0.4 * hh9; // sanity limit R1 = hole; // image range, R1 to R2 R2 = hh9 / 2; do_wthreads(tiny_planet_wthread,NSMP); // do worker threads CEF->Fmods++; // E3 modified, not saved CEF->Fsaved = 0; Fpaint2(); // update output image return; } // worker thread function void * tiny_planet_wthread(void *arg) { using namespace tiny_planet_names; int index = *((int *) arg); int px3, py3, dx, dy; float px9, py9, R, theta, pix9[4], *pix3; for (py3 = index; py3 < hh3; py3 += NSMP) // loop output pixels for (px3 = 0; px3 < ww3; px3++) { dx = px3 - cx3; dy = py3 - cy3; R = sqrtf(dx*dx + dy*dy); // pixel distance from center if (R < 1) continue; if (R > R2) continue; // outside R2 circle if (R < R1) continue; // inside R1 circle if (dx >= 0 && dy >= 0) theta = asinf(dy/R); // 0 to 90 deg. else if (dx < 0 && dy >= 0) theta = PI - asinf(dy/R); // 90 to 180 else if (dx < 0 && dy < 0) theta = PI + asinf(-dy/R); // 180 to 270 else theta = 2 * PI - asinf(-dy/R); // 270 to 360 theta = theta + rotate / 57.296; // apply user rotation if (theta < 0) theta = 2 * PI - theta; if (theta >= 2 * PI) theta = theta - 2 * PI; px9 = ww9 * 0.5 * theta / PI; // R, theta --> input pixel py9 = hh9 * (R - R1) / (R2 - R1); if (revT) px9 = ww9-1 - px9; // if reverse theta if (revR) py9 = hh9-1 - py9; // if reverse R pix3 = PXMpix(E3pxm,px3,py3); // interpolate nearest 4 pixels if (vpixel(E9pxm,px9,py9,pix9)) memcpy(pix3,pix9,pixcc); } return 0; } /**************************************************************************************/ // generate an image that repeats itself spiraling inward namespace escher_spiral_names { editfunc EFescher_spiral; int cx, cy; int width; float rim; float color[3]; } // menu function void m_escher_spiral(GtkWidget *, ch *menu) { using namespace escher_spiral_names; int escher_spiral_dialog_event(zdialog *zd, ch *event); void * escher_spiral_thread(void *); void escher_spiral_mousefunc(); F1_help_topic = TX("ESCHER SPIRAL"); printf("m_escher_spiral \n"); m_zoom(0,"fit"); // zoom to fit window EFescher_spiral.menuname = "Escher Spiral"; EFescher_spiral.menufunc = m_escher_spiral; EFescher_spiral.threadfunc = escher_spiral_thread; // thread function EFescher_spiral.mousefunc = escher_spiral_mousefunc; // mouse function if (! edit_setup(EFescher_spiral)) return; // open edit function cx = Eww / 2; // initial center cy = Ehh / 2; PXM_subalpha(E3pxm); // remove dest. image alpha channel /*** ________________________________ | Escher Spiral | | | | Click mouse to change center | | Width % [ 40 ] | | Rim % [ 1 ] Color [#####] | | | | [Apply] [OK] [X] | |________________________________| ***/ zdialog *zd = zdialog_new(TX("Escher Spiral"),Mwin,TX("Apply"),"OK","X",null); EFescher_spiral.zd = zd; zdialog_add_widget(zd,"label","labtip","dialog",TX("Click mouse to change center")); zdialog_add_widget(zd,"hbox","hbw","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labw","hbw",TX("Width %"),"space=3"); zdialog_add_widget(zd,"zspin","width","hbw","10|80|1|40","space=5"); zdialog_add_widget(zd,"hbox","hbr","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labr","hbr",TX("Rim %"),"space=3"); zdialog_add_widget(zd,"zspin","rim","hbr","0|9|0.1|2","space=5"); zdialog_add_widget(zd,"label","space","hbr",0,"space=6"); zdialog_add_widget(zd,"label","labc","hbr",TX("Color"),"space=3"); zdialog_add_widget(zd,"colorbutt","color","hbr","0|0|0","space=3"); width = 40; rim = 2; color[0] = color[1] = color[2] = 0; zdialog_run(zd,escher_spiral_dialog_event,"save"); takeMouse(escher_spiral_mousefunc,dragcursor); return; } // dialog event and completion callback function int escher_spiral_dialog_event(zdialog *zd, ch *event) { using namespace escher_spiral_names; void escher_spiral_mousefunc(); ch text[20]; ch *pp; if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (strmatch(event,"focus")) // toggle mouse capture takeMouse(escher_spiral_mousefunc,dragcursor); // connect mouse function if (zd->zstat) { if (zd->zstat == 1) // apply { zd->zstat = 0; thread_signal(); return 1; } if (zd->zstat == 2) edit_done(0); // done else edit_cancel(0); // discard edit return 1; } if (zstrstr("width rim color",event)) { zdialog_fetch(zd,"width",width); zdialog_fetch(zd,"rim",rim); zdialog_fetch(zd,"color",text,20); pp = substring(text,"|",1); if (pp) color[0] = atoi(pp); pp = substring(text,"|",2); if (pp) color[1] = atoi(pp); pp = substring(text,"|",3); if (pp) color[2] = atoi(pp); } return 1; } // mouse function void escher_spiral_mousefunc() { using namespace escher_spiral_names; if (! LMclick) return; // wait for left click cx = Mxposn; // mouse position = new center cy = Myposn; LMclick = Mxdrag = Mydrag = 0; thread_signal(); return; } // main thread function void * escher_spiral_thread(void *) { using namespace escher_spiral_names; void escher_spiral_function(); escher_spiral_function(); // transform image CEF->Fmods++; // E3 modified, not saved CEF->Fsaved = 0; Fpaint2(); // update output image return 0; } void escher_spiral_function() { using namespace escher_spiral_names; float revs, rad, step; float sr, sr1, sr2, dr, dr1, dr2; float T, W, F; float dx, dy, sx, sy; float *dpix, spix[4]; int px, py, ii, *Npix; int pcc = 3 * sizeof(float); uint cc; int64 cc64; cc64 = imagesize(Eww,Ehh,pcc,1); if (! cc64) return; // 26.3 memset(E3pxm->pixels,0,cc64); cc = Eww * Ehh * sizeof(int); // clear dest. image pixel counts Npix = (int *) zmalloc(cc,"escher spiral"); revs = 0; // source image sweeps (revolutions) rad = cx; // radius is nearest edge if (Eww - cx < rad) rad = Eww - cx; // from designated center if (cy < rad) rad = cy; if (Ehh - cy < rad) rad = Ehh - cy; W = 0.01 * (100 - width); // width = 25% >> W = 0.75 sr2 = rad; // source image segment outer radius sr1 = sr2 * W; // inner radius dr2 = rad; // initial dest. segment outer radius dr1 = dr2 * W; // inner radius revs = 0; // sections revolutions while (true) { step = 0.7 / dr2; // 0.7 pixels at radius dr2 revs += step / (2 * PI); // rotate segments by tiny step F = pow(W,revs); // 1.0 0.75 0.56 0.42 0.32 ... dr2 = rad * F; // dest. image segment outer radius dr1 = dr2 * W; // inner radius if (dr1 < 2) break; T = 2 * PI * revs - 0.5 * PI; // segment angle for (sr = sr1; sr <= sr2; sr++) // loop source image segment position { dr = dr1 + (dr2 - dr1) * (sr - sr1) / (sr2 - sr1); // corresp. dest. image segment position if (100 * (sr2 - sr) / (sr2 - sr1) <= rim) // source pixel > rim threshold memcpy(spix,color,pcc); else { sx = sr * cos(T) + cx; // source image virtual pixel sy = sr * sin(T) + cy; vpixel(E1pxm,sx,sy,spix); } dx = dr * cos(T) + cx; // dest. image pixel dy = dr * sin(T) + cy; px = int(dx); py = int(dy); dpix = PXMpix(E3pxm,px,py); dpix[0] += spix[0]; // add source to dest. pixel dpix[1] += spix[1]; dpix[2] += spix[2]; ii = py * Eww + px; // count pixels added. ++Npix[ii]; } } for (py = 0; py < Ehh; py++) // loop dest. pixels for (px = 0; px < Eww; px++) { ii = py * Eww + px; // get count of accumulated dest. pixels ii = Npix[ii]; if (ii > 1) { // > 1: make average pixel dpix = PXMpix(E3pxm,px,py); dpix[0] = dpix[0] / ii; dpix[1] = dpix[1] / ii; dpix[2] = dpix[2] / ii; } else if (ii == 0) // 0: copy source pixel memcpy(PXMpix(E3pxm,px,py),PXMpix(E1pxm,px,py),pcc); } zfree(Npix); return; } /**************************************************************************************/ // Flatten a photo of a curved surface, e.g. a page in an open thick book. // Compensate for the curvature, make an image of the flattened surface. editfunc EFflatphoto; // edit function data namespace flatphoto { int Tmx[20], Tmy[20], Bmx[20], Bmy[20]; // upper/lower curve points int Fupper, Flower; // current curved line, upper or lower int prad; // point size on image (radius) int Tnm = 0, Bnm = 0; // upper/lower point counts int Tbase, Bbase; // upper/lower points, low values int Eww1, Ehh1; // original image dimensions int Eww2; // widened image width int Ml, Mr; // left and right crop margins int Fcrop, Fwarp; // flags, E3 already cropped, warped double *Tfy, *Bfy; // derived upper/lower y-shifts [hh] double *Tfx, *Bfx; // derived upper/lower x-shifts [ww] double stretch; // text stretch factor double widen; // image widen factor } // menu function void m_flatphoto(GtkWidget *, ch *menu) { using namespace flatphoto; int flatphoto_dialog_event(zdialog* zd, ch *event); void flatphoto_mousefunc(); void flatphoto_drawlines(); ch *title = TX("Flatten curved surface."); ch *guide = TX("Trace upper and lower curves with \n" "mouse clicks, then [flatten]."); zdialog *zd; F1_help_topic = TX("FLATTEN PHOTO"); printf("m_flatphoto \n"); EFflatphoto.menufunc = m_flatphoto; EFflatphoto.menuname = "Flatten Photo"; EFflatphoto.mousefunc = flatphoto_mousefunc; if (! edit_setup(EFflatphoto)) return; // setup edit if (Eww != Eww1) Tnm = Bnm = 0; // clear prior points if image if (Ehh != Ehh1) Tnm = Bnm = 0; // size different from prior Eww1 = Eww; // save original image size Ehh1 = Ehh; prad = 1 + 0.001 * Eww; // point size scaled to image size if (prad < 2) prad = 2; int cc = Eww * sizeof(double); // allocate memory Tfy = (double *) zmalloc(cc,"flat photo"); Bfy = (double *) zmalloc(cc,"flat photo"); Tfx = (double *) zmalloc(cc,"flat photo"); Bfx = (double *) zmalloc(cc,"flat photo"); Fcrop = Fwarp = 0; // E3 not cropped or warped yet /*** _____________________________________ | Flatten curved surface | | | | Trace upper and lower curves with | | mouse clicks, then [flatten]. | | | | Trace (o) upper (o) lower | | | | [Clear] [Flatten] [Undo] | | | | Stretch: ========[]=============== | | Widen: =========[]============== | | | | [OK] [X] | |_____________________________________| ***/ zd = zdialog_new(title,Mwin,"OK","X",null); // flatphoto dialog EFflatphoto.zd = zd; zdialog_add_widget(zd,"hbox","hbg","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labg","hbg",guide,"space=3"); zdialog_add_widget(zd,"hbox","hbtr","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labtr","hbtr",TX("Trace"),"space=5"); zdialog_add_widget(zd,"radio","upper","hbtr",TX("upper"),"space=5"); zdialog_add_widget(zd,"radio","lower","hbtr",TX("lower"),"space=10"); zdialog_add_widget(zd,"hbox","hbf","dialog",0,"space=3"); zdialog_add_widget(zd,"button","clear","hbf",TX("Clear"),"space=10"); zdialog_add_widget(zd,"button","flatten","hbf",TX("Flatten"),"space=10"); zdialog_add_widget(zd,"button","undo","hbf",TX("Undo"),"space=10"); zdialog_add_widget(zd,"hbox","space","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbstr","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labstr","hbstr",TX("Stretch:"),"space=8"); zdialog_add_widget(zd,"hscale","stretch","hbstr","1|30|0.01|1","expand"); zdialog_add_widget(zd,"hbox","hbwid","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labwid","hbwid",TX("Widen:"),"space=8"); zdialog_add_widget(zd,"hscale","widen","hbwid","1|2|0.01|1","expand"); zdialog_stuff(zd,"upper",1); // start with upper curve zdialog_stuff(zd,"lower",0); Fupper = 1; Flower = 0; if (Tnm > 0) zdialog_load_inputs(zd); // restore prior inputs if same size zdialog_run(zd,flatphoto_dialog_event,"save"); // run dialog - parallel if (Tnm || Bnm) flatphoto_drawlines(); // draw lines if points available takeMouse(flatphoto_mousefunc,dragcursor); // connect mouse function return; } // flatphoto dialog event and completion function int flatphoto_dialog_event(zdialog *zd, ch *event) // flatphoto dialog event function { using namespace flatphoto; void flatphoto_drawlines(); void flatphoto_crop(); void flatphoto_warp(); void flatphoto_mousefunc(); if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (strmatch(event,"focus")) // toggle mouse capture takeMouse(flatphoto_mousefunc,dragcursor); if (zd->zstat) { zfree(Tfy); // free memory zfree(Bfy); zfree(Tfx); zfree(Bfx); if (zd->zstat == 1 && Fwarp) edit_done(0); // commit edit else edit_cancel(0); // cancel return 1; } if (zstrstr("upper lower",event)) // set current drawing curve { // upper or lower zdialog_fetch(zd,"upper",Fupper); zdialog_fetch(zd,"lower",Flower); } if (zstrstr("flatten stretch widen",event)) // control widget changed { if (! Tnm && ! Bnm) { zmessageACK(Mwin,TX("No curve lines found")); return 1; } if ((Tnm && Tnm < 4) || (Bnm && Bnm < 4)) { zmessageACK(Mwin,TX("Curve lines need at least 4 points")); return 1; } if (! Tnm) { // upper curve missing, create Tmx[0] = prad; Tmx[1] = 0.33 * Eww1; Tmx[2] = 0.67 * Eww1; Tmx[3] = Eww1-prad-1; Tmy[0] = Tmy[1] = Tmy[2] = Tmy[3] = prad; Tnm = 4; } if (! Bnm) { // lower curve missing, create Bmx[0] = prad; Bmx[1] = 0.33 * Eww1; Bmx[2] = 0.67 * Eww1; Bmx[3] = Eww1-prad-1; Bmy[0] = Bmy[1] = Bmy[2] = Bmy[3] = Ehh1-prad-1; Bnm = 4; } zdialog_fetch(zd,"stretch",stretch); zdialog_fetch(zd,"widen",widen); flatphoto_crop(); // crop image flatphoto_warp(); // flatten image } if (strmatch(event,"clear")) { // undo all changes, clear points Tnm = Bnm = 0; edit_undo(); Fcrop = Fwarp = 0; Eww = Eww1; } if (strmatch(event,"undo")) { // undo all changed, keep points edit_reset(); Fcrop = Fwarp = 0; Eww = Eww1; flatphoto_drawlines(); } if (strmatch(event,"line_color")) flatphoto_drawlines(); // refresh lines after color change return 1; } // flatphoto mouse function // save clicked image points void flatphoto_mousefunc() { using namespace flatphoto; void flatphoto_drawlines(); int ii, jj, mx, my, dist; int Fadd = 0, close; close = 0.01 * Eww; // 1% of image size if (Fwarp) return; // E3 image warped, ignore mouse if (! (LMclick || RMclick || Mxdrag || Mydrag)) return; // ignore mouse movement if (LMclick || RMclick) { // left or right mouse click mx = Mxclick; my = Myclick; if (LMclick) Fadd = 1; LMclick = RMclick = 0; } else { // mouse drag mx = Mxdrag; my = Mydrag; Mxdrag = Mydrag = 0; Fadd = 1; } if (Fupper) { for (ii = 0; ii < Tnm; ii++) { // compare mouse position with dist = abs(mx-Tmx[ii]); // existing upper curve points if (dist < close) { Tnm--; // delete any too close for (jj = ii--; jj < Tnm; jj++) { Tmx[jj] = Tmx[jj+1]; Tmy[jj] = Tmy[jj+1]; } } } } if (Flower) { for (ii = 0; ii < Bnm; ii++) { // same for lower curve points dist = abs(mx-Bmx[ii]); if (dist < close) { Bnm--; for (jj = ii--; jj < Bnm; jj++) { Bmx[jj] = Bmx[jj+1]; Bmy[jj] = Bmy[jj+1]; } } } } if (Fadd) // add new mouse position { if (Fupper) { // add to upper curve points if (Tnm == 20) return; for (ii = 0; ii < Tnm; ii++) if (mx < Tmx[ii]) break; for (jj = Tnm; jj > ii; jj--) { Tmx[jj] = Tmx[jj-1]; Tmy[jj] = Tmy[jj-1]; } Tmx[ii] = mx; Tmy[ii] = my; Tnm++; } if (Flower) { // add to lower curve points if (Bnm == 20) return; for (ii = 0; ii < Bnm; ii++) if (mx < Bmx[ii]) break; for (jj = Bnm; jj > ii; jj--) { Bmx[jj] = Bmx[jj-1]; Bmy[jj] = Bmy[jj-1]; } Bmx[ii] = mx; Bmy[ii] = my; Bnm++; } } flatphoto_drawlines(); // draw curve through points return; } // generate spline curves from mouse points and draw on the image void flatphoto_drawlines() { using namespace flatphoto; void flatphoto_drawpoint(int px, int py, int R); float Tnx[20], Tny[20], Bnx[20], Bny[20]; // upper/lower spline nodes int topmax, topmin, bottmax, bottmin; // limits of image update areas int ii, px, py, qx, qy, npq; int R; if (Fwarp) return; // E3 image warped edit_reset(); R = prad; // point size topmax = topmin = bottmax = bottmin = 0; npq = 3; // pixel block for drawing nodes if (Tnm > 0) topmax = topmin = Tmy[0]; for (ii = 0; ii < Tnm; ii++) // draw upper curve points { px = Tmx[ii]; py = Tmy[ii]; for (qy = py-npq; qy <= py+npq; qy++) for (qx = px-npq; qx <= px+npq; qx++) { if (qx < 0 || qx > Eww-1) continue; if (qy < 0 || qy > Ehh-1) continue; flatphoto_drawpoint(qx,qy,R); if (qy > topmax) topmax = qy; if (qy < topmin) topmin = qy; } } if (Bnm > 0) bottmax = bottmin = Bmy[0]; for (ii = 0; ii < Bnm; ii++) // draw lower curve points { px = Bmx[ii]; py = Bmy[ii]; for (qy = py-npq; qy <= py+npq; qy++) for (qx = px-npq; qx <= px+npq; qx++) { if (qx < 0 || qx > Eww-1) continue; if (qy < 0 || qy > Ehh-1) continue; flatphoto_drawpoint(qx,qy,R); if (qy > bottmax) bottmax = qy; if (qy < bottmin) bottmin = qy; } } R= prad/2; // line thickness if (Tnm > 3) // upper curve points { Tbase = Tmy[0]; // find lowest upper point for (ii = 0; ii < Tnm; ii++) if (Tmy[ii] < Tbase) Tbase = Tmy[ii]; for (ii = 0; ii < Tnm; ii++) { // copy upper points to spline nodes Tnx[ii] = Tmx[ii]; // and convert to 0 base Tny[ii] = Tmy[ii] - Tbase; } spline1(Tnm,Tnx,Tny); // generate spline curve for (px = 0; px < Eww; px++) // generate upper curve y shifts Tfy[px] = spline2(px); for (px = Tmx[0]; px < Tmx[Tnm-1]; px++) { // draw upper curve over image py = Tfy[px] + Tbase; if (py < 0 || py > Ehh-1) continue; flatphoto_drawpoint(px,py,R); if (py < topmin) topmin = py; if (py > topmax) topmax = py; } } if (Bnm > 3) // lower curve points { Bbase = Bmy[0]; // find lowest lower point for (ii = 0; ii < Bnm; ii++) if (Bmy[ii] < Bbase) Bbase = Bmy[ii]; for (ii = 0; ii < Bnm; ii++) { // copy lower points to spline nodes Bnx[ii] = Bmx[ii]; // and convert to 0 base Bny[ii] = Bmy[ii] - Bbase; } spline1(Bnm,Bnx,Bny); // generate spline curve for (px = 0; px < Eww; px++) // generate lower curve y shifts Bfy[px] = spline2(px); for (px = Bmx[0]; px < Bmx[Bnm-1]; px++) { // draw lower curve over image py = Bfy[px] + Bbase; if (py < 0 || py > Ehh-1) continue; flatphoto_drawpoint(px,py,R); if (py < bottmin) bottmin = py; if (py > bottmax) bottmax = py; } } if (Tnm) Fpaint3(0,topmin,Eww,topmax-topmin,0); // paint modified areas if (Bnm) Fpaint3(0,bottmin,Eww,bottmax-bottmin,0); CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved return; } // draw one fat point on image void flatphoto_drawpoint(int px, int py, int R) { using namespace flatphoto; float *pix; int qx, qy, nn; if (px < R) px = R; if (px > Eww-R-1) px = Eww-R-1; if (py < R) py = R; if (py > Ehh-R-1) py = Ehh-R-1; for (qy = py-R; qy <= py+R; qy++) for (qx = px-R; qx <= px+R; qx++) { pix = PXMpix(E3pxm,qx,qy); pix[0] = LINE_COLOR[0]; pix[1] = LINE_COLOR[1]; pix[2] = LINE_COLOR[2]; } nn = 2 * R + 1; Fpaint3(px-R,py-R,nn,nn,0); return; } // crop image left and right margins using 4 outermost mouse points void flatphoto_crop() { using namespace flatphoto; int ii, ww; if (Fcrop) return; // already cropped if (Tmx[0] < Bmx[0]) Ml = Tmx[0]; // left margin else Ml = Bmx[0]; if (Tmx[Tnm-1] > Bmx[Bnm-1]) Mr = Tmx[Tnm-1]; // right margin else Mr = Bmx[Bnm-1]; ww = Mr - Ml; // rectangle width E9pxm = PXM_copy_area(E1pxm,Ml,0,ww,Ehh); // E9 = cropped E1 PXM_free(E3pxm); E3pxm = PXM_copy(E9pxm); // E9 preserves E3 for use by warp() Eww = ww; // new E3 image width for (ii = 0; ii < Eww; ii++) // shift upper/lower curve points { // for removed left margin Tfy[ii] = Tfy[ii+Ml]; Bfy[ii] = Bfy[ii+Ml]; } Fcrop = 1; // crop was done CEF->Fmods++; // image is modified CEF->Fsaved = 0; Fpaint2(); // update window return; } // warp image based on upper and lower curves void flatphoto_warp() { using namespace flatphoto; int px, py, vstat; int d1, d2, d3, d4, vl, vr; double Tslope, Bslope, slope; double Rt, Rb, Rl, Rr; float *pix3, vpix[4], vpx, vpy; int nc = E1pxm->nc, pcc = nc * sizeof(float); PXM *tempxm; Fbusy(+1); PXM_free(E3pxm); E3pxm = PXM_copy(E9pxm); d1 = Tmx[0] - Ml; // NW gaps at 4 corners d2 = Eww - (Tmx[Tnm-1] - Ml); // NE from page rotation d3 = Bmx[0] - Ml; // SW d4 = Eww - (Bmx[Bnm-1] - Ml); // SE Tfx[0] = Bfx[0] = 0; for (px = 1; px < Eww; px++) // loop page width { Tslope = fabs(Tfy[px] - Tfy[px-1]); // slope of upper function Bslope = fabs(Bfy[px] - Bfy[px-1]); // slope of lower function slope = Tslope * stretch; // mean slope, stretched slope = cos(atan(slope)); Tfx[px] = Tfx[px-1] + slope; // resulting pixel x-shift slope = Bslope * stretch; slope = cos(atan(slope)); Bfx[px] = Bfx[px-1] + slope; } Rt = (Eww-1) / Tfx[Eww-1]; // make overall width the same Rb = (Eww-1) / Bfx[Eww-1]; for (px = 0; px < Eww; px++) { Tfx[px] = Rt * Tfx[px]; // using separate loops causes Bfx[px] = Rb * Bfx[px]; // GCC optimization bug } for (py = 0; py < Ehh; py++) // loop from upper to lower { Rt = 1.0 - 1.0 * py / Ehh; // Rt from 1 to 0 - upper weight Rb = 1.0 - Rt; // Rb from 0 to 1 - lower weight vl = d1 * Rt + d3 * Rb; // left gap vr = d2 * Rt + d4 * Rb; // right gap for (px = 0; px < Eww; px++) // loop from left to right { Rl = 1.0 - 1.0 * px / Eww; // Rl from 1 to 0 - left weight Rr = 1.0 - Rl; // Rr from 0 to 1 - right weight vpx = 0.5 * Tfx[px] + 0.5 * Bfx[px]; // use upper/lower stretch equally vpx += Rl * vl - Rr * vr; // shift to cancel gaps vpy = py + Rt * Tfy[int(vpx)] + Rb * Bfy[int(vpx)]; // flatten upper/lower curved lines vstat = vpixel(E9pxm,vpx,vpy,vpix); // get source pixel pix3 = PXMpix(E3pxm,px,py); // E3 output pixel if (vstat) memcpy(pix3,vpix,pcc); else memset(pix3,0,pcc); // off page, void pixel } } if (widen > 1.0) { // widen image Eww2 = Eww * widen; tempxm = PXM_rescale(E3pxm,Eww2,Ehh); PXM_free(E3pxm); E3pxm = tempxm; } Fbusy(-1); Fwarp = 1; // flag, E3 image is warped CEF->Fmods++; // image is modified CEF->Fsaved = 0; Fpaint2(); // update window return; } fotocx/f.meta.cc0000664000175000017500000147624715247006660012536 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image editor - image metadata functions. View and edit metadata ---------------------- int metatagtype classify tag: xxrec_tab[], extra indexed, not indexed select_meta_tags dialog to select metadata tags m_meta_view_main metadata short report m_meta_view_all report all metadata meta_edit_text dialog for editing large metadata text m_meta_edit_main primary edit main metadata dialog m_meta_edit_any dialog to fetch and save any image metadata by name m_meta_delete dialog to delete any image file metadata by name m_meta_copy copy metadata from one image file to another m_meta_fix fix file with malformed metadata m_meta_manage_keywords define keywords for image searching m_meta_choose_caps choose metadata tags for image captions meta_show_caps show captions on current image meta_popup_title show title & description in popup window m_meta_toggle_caps toggle display of image captions on/off m_batch_keywords batch add and delete keywords for selected image files m_batch_rename_keywords convert keyword names for all image files m_batch_purge_keywords purge unwanted keywords from all image files m_batch_photo_date_time change or shift photo date/time m_batch_change_meta add/change or delete metadata for selected files m_batch_report_meta batch metadata report to text file m_batch_geotags add given geotag to selected set of images Image search utilities ---------------------- m_meta_places_dates find images by location and date range m_meta_timeline find images by year and month m_meta_tags find images by metadata tag value m_autosearch search function for use with scripts m_search_images find images using any metadata and/or file names checkDT validate date [time] input add_keyword add keyword to a keyword list del_keyword remove keyword from a keyword list add_recenkeyword add keyword to recent keywords list, remove oldest if needed load_defkeywords load defined keywords list from keywords file and image index save_defkeywords save defined keywords list to keywords file find_defkeyword check if given keyword is in defined keywords list add_defkeyword add new keyword to defined keywords list or change category del_defkeyword remove keyword from defined keywords list del_defcatg remove category from defined categories list (if no keywords assigned) defkeywords_stuff stuff defined keywords into dialog text widget defcats_stuff stuff defined categories into dialog combobox widget glocs_compare compare two geolocation records load_imagelocs load geolocations table from image files load_worldlocs load geolocations table from world cities file find_location find geolocations from image data and world locations table choose_location choose a location/country given leading substring(s) nearest_loc find nearest known location name for given geocoordinates put_imagelocs put new location data in geolocations table get_gps_data validate and return GPS coordinates as type float earth_distance compute km distance between two earth coordinates get_gallerymap get map coordinates for current gallery files metadata store and retrieve --------------------------- meta_get get image file metadata from list of tags meta_getN same for multiple files, using multiple threads meta_put update image metadata from list of tags and data meta_copy copy metadata from file to file, with revisions Image index functions --------------------- file_to_xxrec update xxrec_tab[] record from file metadata xxrec_index get xxrec_tab[] index for given image file get_xxrec get image xxrec_tab[] for image file read_xxrec_seq read xxrec_tab[] records sequentially, one per call write_xxrec_seq write xxrec_tab[] records sequentially ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) using namespace zfuncs; /**************************************************************************************/ int checkDT(ch *datetime); // validate date [time] input int add_keyword(ch *keyword, ch *keywordlist, int maxcc); // add keyword if unique and enough space int del_keyword(ch *keyword, ch *keywordlist); // remove keyword from keyword list int add_recenkeyword(ch *keyword); // add to recent keywords, keep recent void load_defkeywords(int force); // load defined_keywords from index data void save_defkeywords(); // defined_keywords[] >> file int find_defkeyword(ch *keyword); // find keyword in defined_keywords[] int add_defkeyword(ch *catg, ch *keyword); // add keyword to defined_keywords[] int del_defkeyword(ch *keyword); // remove keyword from defined_keywords[] int del_defcatg(ch *catg); // remove category from defined categories[] void defkeywords_stuff(zdialog *zd, ch *catg); // defined_keywords[] >> zd defkeywords void defcats_stuff(zdialog *zd); // defined categories >> " widget defcats int glocs_compare(ch *rec1, ch *rec2); // compare geocoordinate records int load_worldlocs(); // load cities geolocations table int find_location(zdialog *zd); // get geolocation from image and world data int put_imagelocs(zdialog *zd); // Update geolocations table in memory float earth_distance(float lat1, float long1, float lat2, float long2); // compute distance from earth coordinates namespace meta_names { ch edit_keywords[filekeywordsXcc] = ""; // edited keywords: keyw1, keyw2, ... ch *defined_keywords[maxkeywordcats]; // defined keywords: catg: keyw1, keyw2, ... ch recent_keywords[recentkeywordsXcc] = ""; // recently added keywords list enum { xxNULL, xxFNAME, xxFDATE, xxFSIZE, xxPDATE, xxPSIZE, xxBPC, xxRATE, // xxrec_tab[] members xxKWDS, xxTITL, xxDESC, xxLOC, xxCNTR, xxMAKE, xxMODL, xxLENS, // indexed metadata tags - avoid zero xxEXP, xxFNUM, xxFLNG, xxISO } ; } using namespace meta_names; /**************************************************************************************/ // Get tag type from tag name: // returns: 1-19 member sequence in xxrec_tab[] // 100 present in extra indexed metadata // 0 not indexed (must be searched in image metadata) int metatagtype(ch *tagname) // 26.0 { if (strmatchcase(tagname,"filename")) return xxFNAME; if (strmatchcase(tagname,"filedate")) return xxFDATE; if (strmatchcase(tagname,"filesize")) return xxFSIZE; if (strmatchcase(tagname,"photodate")) return xxPDATE; if (strmatchcase(tagname,"datetimeoriginal")) return xxPDATE; if (strmatchcase(tagname,"imagesize")) return xxPSIZE; if (strmatchcase(tagname,"bitspersample")) return xxBPC; if (strmatchcase(tagname,"rating")) return xxRATE; if (strmatchcase(tagname,"keywords")) return xxKWDS; if (strmatchcase(tagname,"subject")) return xxKWDS; // jxl if (strmatchcase(tagname,"title")) return xxTITL; if (strmatchcase(tagname,"description")) return xxDESC; if (strmatchcase(tagname,"city")) return xxLOC; if (strmatchcase(tagname,"location")) return xxLOC; // jxl if (strmatchcase(tagname,"country")) return xxCNTR; if (strmatchcase(tagname,"make")) return xxMAKE; if (strmatchcase(tagname,"model")) return xxMODL; if (strmatchcase(tagname,"lens")) return xxLENS; if (strmatchcase(tagname,"exposuretime")) return xxEXP; if (strmatchcase(tagname,"fnumber")) return xxFNUM; if (strmatchcase(tagname,"focallength")) return xxFLNG; if (strmatchcase(tagname,"iso")) return xxISO; for (int ii = 0; ii < xmetaNtags; ii++) // search extra indexed metadata tags if (strmatchcase(tagname,xmeta_tags[ii])) return 100; // tag is extra indexed metadata tag return 0; } // Dialog to select metadata tags (for index, view, edit, search, report). // Input list is replaced by user-edited list if changes were made. // exclude: exclude tags which are indexed by default. // returns 0/1 = no changes / changes made namespace select_meta_tags_names { GtkWidget *mtext1, *mtext2; int Fexclude, Fchange; zdialog *zd; ch *pp; } int select_meta_tags(zlist_t *mlist, int maxout, int exclude) { using namespace select_meta_tags_names; int select_meta_tags_clickfunc1(GtkWidget *, int line, int pos, ch *input); int select_meta_tags_clickfunc2(GtkWidget *, int line, int pos, ch *input); int zstat, ii, jj, nn; ch *pp, ppc1[80], ppc2[80]; zlist_t *picklist; Fexclude = exclude; Fchange = 0; /*** __________________________________________________________ | Select Metadata Tags | | | | click to select click to unselect | | _________________________ __________________________ | | | Orientation | | | | | | Rotation | | | | | | Exposure Time | | | | | | Aperture | | | | | | ... | | | | | | Other Tag ... | | | | | |_________________________| |__________________________| | | | | [OK] [X] | |__________________________________________________________| ***/ zd = zdialog_new(TX("Select Metadata tags"),Mwin,"OK","X",null); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"expand"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"expand|space=3"); zdialog_add_widget(zd,"label","lab1","vb1",TX("click to select")); zdialog_add_widget(zd,"scrwin","scroll1","vb1",0,"expand"); zdialog_add_widget(zd,"text","mtext1","scroll1",0,"expand"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"expand|space=3"); zdialog_add_widget(zd,"label","lab2","vb2",TX("click to unselect")); zdialog_add_widget(zd,"scrwin","scroll2","vb2",0,"expand"); zdialog_add_widget(zd,"text","mtext2","scroll2",0,"expand"); mtext1 = zdialog_gtkwidget(zd,"mtext1"); txwidget_clear(mtext1); mtext2 = zdialog_gtkwidget(zd,"mtext2"); txwidget_clear(mtext2); picklist = zlist_from_file(meta_picklist_file); // metadata picklist if (! picklist) { zmessageACK(Mwin,TX("metadata picklist file not found %s"),meta_picklist_file); return 0; } for (ii = 0; ii < zlist_count(picklist); ii++) { pp = zlist_get(picklist,ii); if (Fexclude) { strCompress(ppc1,pp); // exclude tags indexed by default for (jj = 0; jj < NKX; jj++) { strCompress(ppc2,tagnamex[jj]); if (strcasestr(ppc1,ppc2)) break; } if (jj < NKX) continue; } txwidget_append(mtext1,0,"%s\n",pp); // picklist >> left widget } txwidget_append(mtext1,0,"%s\n",TX("Other Tag ...")); // append "Other tag ..." zlist_free(picklist); // free memory txwidget_clear(mtext2); for (ii = 0; ii < zlist_count(mlist); ii++) // user list >> right widget txwidget_append(mtext2,0,"%s\n",zlist_get(mlist,ii)); txwidget_set_eventfunc(mtext1,select_meta_tags_clickfunc1); // set mouse/KB event function txwidget_set_eventfunc(mtext2,select_meta_tags_clickfunc2); zdialog_resize(zd,500,300); zdialog_set_modal(zd); zdialog_run(zd,0,0); // run dialog zstat = zdialog_wait(zd); // wait for dialog completion if (zstat != 1 || ! Fchange) { // no changes made zdialog_free(zd); return 0; } nn = txwidget_linecount(mtext2); if (nn > maxout) { zmessageACK(Mwin,TX("selection exceeds %d tags"),maxout); zdialog_free(zd); return 0; } zlist_clear(mlist,0); // replace input list with output list for (ii = 0; ii < nn; ii++) { pp = txwidget_line(mtext2,ii,1); if (! *pp) continue; strCompress(ppc1,pp); // exiftool: no embedded blanks zlist_append(mlist,ppc1,1); } zdialog_free(zd); return 1; // return "changes made" } // get clicked tag name from input list and insert into output list int select_meta_tags_clickfunc1(GtkWidget *widget, int line, int pos, ch *input) { using namespace select_meta_tags_names; ch *pp, ppc[80]; int ii; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } pp = txwidget_line(widget,line,1); // get clicked line, highlight if (! pp || ! *pp) return 1; txwidget_highlight_line(widget,line); if (strmatch(pp,"Other Tag ...")) { // get manually input metadata name 26.0 pp = zdialog_text(zd->dialog,"metadata tag name",0); if (! pp) return 1; strCompress(pp); // remove blanks if (Fexclude) { for (ii = 0; ii < NKX; ii++) { strCompress(ppc,tagnamex[ii]); if (strmatch(pp,ppc)) { zmessageACK(Mwin,TX("%s is already indexed"),pp); zfree(pp); return 1; } } } } strCompress(ppc,pp); // exiftool: no embedded blanks zfree(pp); txwidget_append2(mtext2,0,"%s\n",ppc); // append to output list Fchange = 1; return 1; } // get clicked tag name from output list and remove it int select_meta_tags_clickfunc2(GtkWidget *widget, int line, int pos, ch *input) { using namespace select_meta_tags_names; ch *pp; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } pp = txwidget_line(widget,line,1); // get clicked line if (! pp || ! *pp) return 1; txwidget_delete(widget,line); // delete line Fchange = 1; return 1; } /**************************************************************************************/ // menu function and popup dialog to show metadata // window is updated when navigating to another image #define maxextraview 20 int metadata_report_type = 1; // called by f_open() if zd_metaview is defined void meta_view(int type) { if (type) metadata_report_type = type; if (metadata_report_type == 2) m_meta_view_all(0,0); else m_meta_view_main(0,0); return; } // menu function - metadata short report void m_meta_view_main(GtkWidget *, ch *menu) { void meta_view_tag_report(ch *tagname, ch *tagval, GtkWidget *widget); int meta_view_short_dialog_event(zdialog *zd, ch *event); ch *tagvalx[NKX]; // xxrec_tab[] tags ch *edithisttag[1] = { meta_edithist_tag }; // edit history data ch *edithistval[1]; ch *tagname2[maxextraview]; // extra metadata tags to view ch *tagval2[maxextraview]; ch buff[metatagXcc], *pp; ch *pixels, *bpc; ch *focallength, chsec[12]; ch *text1, **text2; static ch *file, *filen; float mb, fsecs; int err, ii, nn, cc, nk2; GtkWidget *widget; FILE *fid; F1_help_topic = TX("VIEW MAIN META"); printf("m_meta_view_main \n"); if (FGM != 'F' && FGM != 'G') return; if (clicked_file) { // use clicked file if present file = clicked_file; clicked_file = 0; } else if (curr_file) file = zstrdup(curr_file,"meta-view"); else return; if (metadata_report_type != 1) { if (zd_metaview) zdialog_free(zd_metaview); zd_metaview = 0; metadata_report_type = 1; } if (! zd_metaview) // create if not already { zd_metaview = zdialog_new(TX("View Main Metadata"),Mwin,"Extras","X",null); zdialog_add_widget(zd_metaview,"scrwin","scroll","dialog",0,"expand"); zdialog_add_widget(zd_metaview,"text","metadata","scroll",0,"expand"); zdialog_resize(zd_metaview,550,350); zdialog_run(zd_metaview,meta_view_short_dialog_event,"save"); } widget = zdialog_gtkwidget(zd_metaview,"metadata"); // clear prior report txwidget_clear(widget); err = meta_get(file,tagnamex,tagvalx,NKX); // xxrec_tab[] tags if (err) return; meta_get(file,edithisttag,edithistval,1); // edit history data filen = strrchr(file,'/'); // get file name without folder if (filen) filen++; else filen = file; if (tagvalx[0]) tagvalx[0][19] = 0; // truncate dates to yyyy:mm:dd hh:mm:ss if (tagvalx[2]) tagvalx[2][19] = 0; if (tagvalx[2]) tagvalx[2][4] = tagvalx[2][7] = ':'; // metadata mixed yyyy:mm:dd, yyyy-mm-dd txwidget_append(widget,0,"File %s \n",filen); mb = atof(tagvalx[1]) / MEGA; pixels = tagvalx[3]; pp = strchr(pixels,' '); if (pp && pp-pixels < (int64) (strlen(pixels) - 2)) *pp = 'x'; bpc = tagvalx[4]; txwidget_append(widget,0,"Size %.3f mb pixels %s bit depth %s \n", mb,pixels,bpc); txwidget_append(widget,0,"Dates photo: %s file: %s \n", tagvalx[2], tagvalx[0]); if (tagvalx[12] || tagvalx[13] || tagvalx[14]) txwidget_append(widget,0,"Camera make: %s model: %s lens: %s \n", tagvalx[12], tagvalx[13], tagvalx[14]); if (tagvalx[15] || tagvalx[16] || tagvalx[17] || tagvalx[18]) // photo exposure data { if (tagvalx[17]) focallength = tagvalx[17]; // focal length else focallength = 0; // missing *chsec = 0; if (tagvalx[15]) { // expose time fsecs = atofz(tagvalx[15]); // convert 0.008 seconds to 1/125 etc. if (fsecs > 0 && fsecs <= 0.5) { fsecs = 1/fsecs; snprintf(chsec,12,"1/%.0f",fsecs); } else if (fsecs > 0.5 && fsecs < 2) // 23/1 snprintf(chsec,12,"%.1f",fsecs); else snprintf(chsec,12,"%.0f",fsecs); } txwidget_append(widget,0,"Exposure %s sec %s mm F%s ISO %s \n", // secs Fleng Fnumber ISO chsec,focallength,tagvalx[16],tagvalx[18]); } if (tagvalx[9] || tagvalx[10] || tagvalx[11]) // location, country, GPS data txwidget_append(widget,0,"Location %s %s %s \n", tagvalx[9],tagvalx[10],tagvalx[11]); if (tagvalx[6]) { // keywords cc = strlen(tagvalx[6]) - 1; if (tagvalx[6][cc] == ',') tagvalx[6][cc] = 0; nn = breakup_text(tagvalx[6],text2,"|",100); // wrap long lines txwidget_append(widget,0,"Keywords %s \n",text2[0]); for (ii = 1; ii < nn; ii++) txwidget_append(widget,0," %s \n",text2[ii]); for (ii = 0; ii < nn; ii++) zfree(text2[ii]); zfree(text2); } if (tagvalx[5]) // rating txwidget_append(widget,0,"Rating %s \n",tagvalx[5]); if (edithistval[0]) { // edit history data cc = strlen(edithistval[0]) + 100; text1 = (ch *) zmalloc(cc,"meta-view"); repl_1str(edithistval[0],text1,cc,"|","\n"); nn = breakup_text(text1,text2,"|",100); txwidget_append(widget,0,"Edits %s \n",text2[0]); for (ii = 1; ii < nn; ii++) txwidget_append(widget,0," %s \n",text2[ii]); for (ii = 0; ii < nn; ii++) zfree(text2[ii]); zfree(text2); zfree(text1); } if (tagvalx[7]) // title meta_view_tag_report(tagnamex[7],tagvalx[7],widget); if (tagvalx[8]) // description meta_view_tag_report(tagnamex[8],tagvalx[8],widget); txwidget_append(widget,0,"\n"); for (ii = 0; ii < NKX; ii++) // free memory if (tagvalx[ii]) zfree(tagvalx[ii]); if (edithistval[0]) zfree(edithistval[0]); // append extra report tags if any fid = fopen(meta_view_extras_file,"r"); if (! fid) goto finished; // no extras file for (nk2 = 0; nk2 < maxextraview; nk2++) { // get list of user extras to view pp = fgets_trim(buff,metatagXcc,fid,1); if (! pp) break; strCompress(pp); if (*pp <= ' ') { nk2--; continue; } tagname2[nk2] = zstrdup(pp,"meta-view"); } fclose(fid); if (nk2 == 0) goto finished; // empty file err = meta_get(file,tagname2,tagval2,nk2); // get all extra tags at once if (err) goto finished; for (ii = 0; ii < nk2; ii++) // report user extra tags meta_view_tag_report(tagname2[ii],tagval2[ii],widget); for (ii = 0; ii < nk2; ii++) { // free memory zfree(tagname2[ii]); if (tagval2[ii]) zfree(tagval2[ii]); } finished: zfree(file); return; } // m_meta_view_main() helper function // write tag name and tag value to report, breaking up long text where needed. void meta_view_tag_report(ch *tagname, ch *tagval, GtkWidget *widget) { int ii, nn; ch **longtext; if (! tagval || ! *tagval) return; if (strlen(tagval) < 60) { // 25.1 txwidget_append(widget,0,"%-12s %s \n",tagname,tagval); return; } txwidget_append(widget,0,"\n"); // blank line txwidget_append(widget,0,"%s: \n",tagname); // tag name nn = breakup_text(tagval,longtext,0,100); // break up long tag value for (ii = 0; ii < nn; ii++) txwidget_append(widget,0," %s \n",longtext[ii]); // output each piece for (ii = 0; ii < nn; ii++) zfree(longtext[ii]); // free memory zfree(longtext); return; } // dialog event and completion callback function int meta_view_short_dialog_event(zdialog *zd, ch *event) { zlist_t *mlist; int zstat, nn; zstat = zd->zstat; if (! zstat) return 1; // wait for completion zdialog_free(zd); // kill dialog zd_metaview = 0; if (zstat != 1) return 1; // not [extras] button mlist = zlist_from_file(meta_view_extras_file); // get metadata extras list if (! mlist) mlist = zlist_new(0); nn = select_meta_tags(mlist,maxextraview,1); // user edit of view extras list if (nn) zlist_to_file(mlist,meta_view_extras_file); // update extras file zlist_free(mlist); return 1; } /**************************************************************************************/ // menu function - metadata long report void m_meta_view_all(GtkWidget *, ch *menu) { int meta_view_long_dialog_event(zdialog *zd, ch *event); FILE *fid; ch *file, *file2; ch *pp, buff[10000]; GtkWidget *widget; int err; ch *tooloptions = "-m -n -S -c \"%+.5f\" -d \"%Y:%m:%d %H:%M:%S\""; F1_help_topic = TX("VIEW MAIN META"); printf("m_meta_view_all \n"); if (FGM != 'F' && FGM != 'G') return; if (clicked_file) { // use clicked file if present file = clicked_file; clicked_file = 0; } else if (curr_file) file = zstrdup(curr_file,"meta-view"); else return; if (metadata_report_type != 2) { if (zd_metaview) zdialog_free(zd_metaview); zd_metaview = 0; metadata_report_type = 2; } if (zd_metaview) zdialog_free(zd_metaview); zd_metaview = zdialog_new(TX("View All Metadata"),Mwin,"X",null); zdialog_add_widget(zd_metaview,"scrwin","scroll","dialog",0,"expand"); zdialog_add_widget(zd_metaview,"text","metadata","scroll",0,"expand|wrap"); zdialog_resize(zd_metaview,700,700); zdialog_run(zd_metaview,meta_view_long_dialog_event,"save"); widget = zdialog_gtkwidget(zd_metaview,"metadata"); gtk_text_view_set_editable(GTK_TEXT_VIEW(widget),0); // disable widget editing gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget),GTK_WRAP_NONE); // disable text wrap txwidget_clear(widget); file2 = zescape_quotes(file); snprintf(command,CCC,"exiftool %s \"%s\" ",tooloptions,file2); // exiftool command zfree(file2); fid = popen(command,"r"); // get command outputs if (fid) { while ((pp = fgets_trim(buff,10000,fid))) { err = utf8_clean(pp); if (err) txwidget_append(widget,0,TX("*** bad utf8 detected *** \n")); // 25.1 txwidget_append(widget,0,"%s\n",pp); // add to report window } pclose(fid); } zfree(file); return; } // dialog event and completion callback function int meta_view_long_dialog_event(zdialog *zd, ch *event) { if (! zd->zstat) return 1; // wait for completion zdialog_free(zd); // kill dialog zd_metaview = 0; return 1; } /**************************************************************************************/ // Popup dialog to edit a large metadata text block. // Fake \n characters are replaced with real \n for editing, // and the reverse is done when editing is done. // Real \n characters are not allowed in metadata. int meta_edit_text(ch *&text) { zdialog *zd; ch text2[metadataXcc], text3[metadataXcc]; int zstat; if (text) strncpy0(text2,text,metadataXcc); // input text else *text2 = 0; repl_1str(text2,text3,metadataXcc,"\\n","\n"); // replace fake \n with real \n zd = zdialog_new(TX("Edit Metadata"),Mwin,TX("Apply"),"X",null); // build edit dialog zdialog_add_widget(zd,"scrwin","scroll","dialog",0,"expand"); zdialog_add_widget(zd,"zedit","text","scroll",0,"wrap|expand"); zdialog_stuff(zd,"text",text3); // metadata --> dialog zdialog_resize(zd,600,400); zdialog_run(zd,0,"parent"); // run dialog, edit text zstat = zdialog_wait(zd); if (zstat != 1) { // canceled zdialog_free(zd); return 0; } zdialog_fetch(zd,"text",text3,metadataXcc); // get edited text repl_1str(text3,text2,metadataXcc,"\n","\\n"); // replace real \n with fake \n if (text) zfree(text); // return edited text text = zstrdup(text2,"meta_edit_text"); zdialog_free(zd); return 1; } /**************************************************************************************/ // edit main metadata menu function namespace edit_main_names { xxrec_t *xxrec; int ftf = 1; ch pdate[20], rating[4]; // editable metadata ch *keywords = 0, *title = 0, *desc = 0; ch location[40], country[40], gps_data[24]; ch p_pdate[20], p_rating[4]; // previous data ch *p_keywords, *p_title, *p_desc; // for use by [prev] button ch p_location[40], p_country[40], p_gps_data[24]; }; void m_meta_edit_main(GtkWidget *, ch *menu) { using namespace edit_main_names; int edit_keywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int edit_recenkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int edit_matchkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int edit_defkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int editmeta_dialog_event(zdialog *zd, ch *event); GtkWidget *widget; zdialog *zd; ch *tagvalx[NKX]; ch *pp, text50[50]; int ii, err; float flati, flongi; F1_help_topic = TX("EDIT MAIN META"); printf("m_meta_edit_main \n"); if (ftf) { // first time processing ftf = 0; *p_pdate = 0; // prior metadata is empty *p_rating = 0; p_keywords = 0; p_title = 0; p_desc = 0; *p_location = 0; *p_country = 0; *p_gps_data = 0; } if (clicked_file) { // use clicked file if present if (! curr_file || ! strmatch(clicked_file,curr_file)) // avoid f_open() re-entry f_open(clicked_file); clicked_file = 0; } if (! curr_file) { zmessageACK(Mwin,TX("no current file")); if (zd_editmeta) zdialog_free(zd_editmeta); zd_editmeta = 0; zd_mapgeotags = 0; return; } err = access(curr_file,W_OK); // test if file can be written if (err) { zmessageACK(Mwin,"%s: %s",TX("no write permission"),curr_file); return; } // get all editable metadata from meta_get() err = meta_get(curr_file,tagnamex,tagvalx,NKX); if (err) return; if (tagvalx[2]) { strncpy0(pdate,tagvalx[2],20); // photo date, yyyy:mm:dd ... or null pdate[4] = pdate[7] = pdate[13] = pdate[16] = ':'; // stop variable formats } else *pdate = 0; if (tagvalx[5]) strncpy0(rating,tagvalx[5],4); // rating 0-5 else strcpy(rating,"0"); if (keywords) zfree(keywords); if (tagvalx[6]) { // image keywords keywords = tagvalx[6]; tagvalx[6] = 0; strncpy0(edit_keywords,keywords,filekeywordsXcc); // edit_keywords: where keywords are edited } else { keywords = 0; *edit_keywords = 0; } if (title) zfree(title); // image title if (tagvalx[7]) { title = tagvalx[7]; tagvalx[7] = 0; } else title = 0; if (desc) zfree(desc); // image description if (tagvalx[8]) { desc = tagvalx[8]; tagvalx[8] = 0; } else desc = 0; if (tagvalx[9]) strncpy0(location,tagvalx[9],40); // location (aka city) else *location = 0; if (tagvalx[10]) strncpy0(country,tagvalx[10],40); // country else *country = 0; if (tagvalx[11]) strncpy0(gps_data,tagvalx[11],24); // gps data else *gps_data = 0; get_gps_data(gps_data,flati,flongi); for (ii = 0; ii < NKX; ii++) if (tagvalx[ii]) zfree(tagvalx[ii]); load_imagelocs(); // initialize image geolocs[] data load_worldlocs(); // initialize world geolocs[] data /*** ___________________________________________________________ | Edit Main Metadata | | | | File: filename.jpg | | ________________________________________ | | Title |________________________________________| [edit] | | ________________________________________ | | Desc. |________________________________________| [edit] | | | | Photo Date: [__________________] Rating: [__] | | | | location [____________] [____________] GPS [__________] | | [Find] [Previous] [Clear] [Map] | // 26.7 | | | Image Keywords [_______________________________________] | | - - - - - - - - - - - - - - - - - - - - - - - - - - - - | | Recent Keywords [__________________________________] [X] | | Enter Keyword [______________] [_] add new keyword | | Matching Keywords [____________________________________] | | | | Keywords Category [_________________|v] | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |______________________________________________________| | | | | [Prev] [Apply] [X] | |___________________________________________________________| ***/ if (! zd_editmeta) // (re)start edit dialog { zd = zdialog_new(TX("Edit Main Metadata"),Mwin,TX("Prev"),TX("Apply"),"X",null); zd_editmeta = zd; zdialog_add_ttip(zd,"Apply",TX("save metadata to image file")); // File: xxxxxxxxx.jpg zdialog_add_widget(zd,"hbox","hbf","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labf","hbf",TX("File:"),"space=3"); zdialog_add_widget(zd,"label","file","hbf","filename.jpg","space=5"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=3"); // Title |______________________________________________| [edit] zdialog_add_widget(zd,"hbox","hbtl","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labtl","hbtl",TX("Title"),"space=3"); zdialog_add_widget(zd,"text","title","hbtl",0,"expand"); zdialog_add_widget(zd,"button","edittitle","hbtl",TX("edit"),"space=3"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=3"); // Desc. |______________________________________________| [edit] zdialog_add_widget(zd,"hbox","hbds","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labds","hbds",TX("Desc."),"space=3"); zdialog_add_widget(zd,"text","desc","hbds",0,"expand"); zdialog_add_widget(zd,"button","editdesc","hbds",TX("edit"),"space=3"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=3"); // Photo Date [_______________] Rating: [__] zdialog_add_widget(zd,"hbox","hbdt","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labdate","hbdt",TX("Photo Date"),"space=3"); zdialog_add_widget(zd,"zentry","pdate","hbdt",0,"size=20"); zdialog_add_widget(zd,"label","space","hbdt",0,"space=5"); zdialog_add_widget(zd,"label","labrate","hbdt",TX("Rating:"),"space=3"); zdialog_add_widget(zd,"zspin","rating","hbdt","0|5|1|0","space=3"); zdialog_add_ttip(zd,"pdate","yyyy:mm:dd hh:mm[:ss]"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=3"); // location [_____________] [____________] GPS [________________] zdialog_add_widget(zd,"hbox","hbloc","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labloc","hbloc",TX("Location"),"space=3"); zdialog_add_widget(zd,"zentry","location","hbloc",0,"expand"); zdialog_add_widget(zd,"label","space","hbloc",0,"space=5"); zdialog_add_widget(zd,"zentry","country","hbloc",0,"expand"); zdialog_add_widget(zd,"label","space","hbloc",0,"space=5"); zdialog_add_widget(zd,"label","labgps","hbloc","GPS","space=3"); zdialog_add_widget(zd,"zentry","gps_data","hbloc",0,"size=10"); // [Find] [Previous] [Clear] [Map] zdialog_add_widget(zd,"hbox","hbgeo","dialog",0,"space=3"); zdialog_add_widget(zd,"button","geofind","hbgeo",TX("Find"),"space=5"); zdialog_add_widget(zd,"button","geoprev","hbgeo",TX("Previous"),"space=5"); // 25.1 zdialog_add_widget(zd,"button","geoclear","hbgeo",TX("Clear"),"space=5"); zdialog_add_widget(zd,"button","geomap","hbgeo",TX("Map"),"space=5"); // 26.7 zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=3"); // Image Keywords [________________________________________] zdialog_add_widget(zd,"hbox","hbit","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labit","hbit",TX("Image Keywords"),"space=3"); zdialog_add_widget(zd,"text","keywords","hbit",0,"expand|wrap"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=6"); // Recent Keywords [_______________________________________] zdialog_add_widget(zd,"hbox","hbrt","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labrt","hbrt",TX("Recent Keywords"),"space=3"); zdialog_add_widget(zd,"text","recenkeywords","hbrt",0,"expand|wrap"); zdialog_add_widget(zd,"button","clear recent","hbrt","[X]","space=3"); // Enter Keyword [________________] [_] add new keyword zdialog_add_widget(zd,"hbox","hbnt","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labnt","hbnt",TX("Enter Keyword"),"space=3"); zdialog_add_widget(zd,"zentry","newkeyword","hbnt",0,"size=20"); zdialog_add_widget(zd,"zbutton","add","hbnt",TX("add new keyword"),"space=8"); // Matching Keywords [_____________________________________] zdialog_add_widget(zd,"hbox","hbmt","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labmt","hbmt",TX("Matching Keywords"),"space=3"); zdialog_add_widget(zd,"text","matchkeywords","hbmt",0,"expand|wrap"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=6"); // Keywords Category [______________________________] zdialog_add_widget(zd,"hbox","hbdt1","dialog"); zdialog_add_widget(zd,"label","labdt","hbdt1","Keywords Category","space=3"); zdialog_add_widget(zd,"combo","defcats","hbdt1",0,"expand|space=10|size=20"); zdialog_add_widget(zd,"hbox","hbdt2","dialog",0,"expand"); zdialog_add_widget(zd,"scrwin","swdt2","hbdt2",0,"expand"); zdialog_add_widget(zd,"text","defkeywords","swdt2",0,"wrap"); zdialog_add_ttip(zd,"labdate",TX("format: yyyy:mm:dd [hh:mm:ss]")); zdialog_add_ttip(zd,"geofind",TX("search known locations")); zdialog_add_ttip(zd,"geoprev",TX("use previous location")); zdialog_add_ttip(zd,"geoclear",TX("clear inputs")); zdialog_add_ttip(zd,"geomap",TX("set location from world map")); // 26.7 load_defkeywords(0); // stuff defined keywords into dialog defkeywords_stuff(zd,"ALL"); defcats_stuff(zd); // and defined categories widget = zdialog_gtkwidget(zd,"keywords"); // keyword widget mouse/KB event functions txwidget_set_eventfunc(widget,edit_keywords_clickfunc); widget = zdialog_gtkwidget(zd,"recenkeywords"); txwidget_set_eventfunc(widget,edit_recenkeywords_clickfunc); widget = zdialog_gtkwidget(zd,"matchkeywords"); txwidget_set_eventfunc(widget,edit_matchkeywords_clickfunc); widget = zdialog_gtkwidget(zd,"defkeywords"); txwidget_set_eventfunc(widget,edit_defkeywords_clickfunc); zdialog_resize(zd,500,900); // run dialog zdialog_run(zd,editmeta_dialog_event,"save"); } zd = zd_editmeta; // edit metadata active zd_mapgeotags = zd; // map clicks active pp = strrchr(curr_file,'/'); zdialog_stuff(zd,"file",pp+1); // stuff dialog data from curr. file zdialog_stuff(zd,"pdate",pdate); zdialog_stuff(zd,"rating",rating); zdialog_stuff(zd,"keywords",keywords); if (title) { strncpy0(text50,title,50); // limit 50 chars. if (strlen(text50) > 48) strcpy(text50+45," ..."); } else *text50 = 0; zdialog_stuff(zd,"title",text50); if (desc) { strncpy0(text50,desc,50); if (strlen(text50) > 48) strcpy(text50+45," ..."); } else *text50 = 0; zdialog_stuff(zd,"desc",text50); zdialog_stuff(zd,"location",location); zdialog_stuff(zd,"country",country); zdialog_stuff(zd,"gps_data",gps_data); zdialog_stuff(zd,"recenkeywords",recent_keywords); // stuff recent keywords list return; } // mouse click functions for various text widgets for keywords int edit_keywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) // existing image keyword was clicked { using namespace edit_main_names; ch *txkeyword, end = 0; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;",end); if (! txkeyword) return 1; del_keyword(txkeyword,edit_keywords); // remove keyword from file keywords zdialog_stuff(zd_editmeta,"keywords",edit_keywords); Fmetamod++; // note change zfree(txkeyword); return 1; } int edit_recenkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) // recent keyword was clicked { using namespace edit_main_names; ch *txkeyword, end = 0; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;",end); if (! txkeyword) return 1; add_keyword(txkeyword,edit_keywords,filekeywordsXcc); // add recent keyword to keyword list zdialog_stuff(zd_editmeta,"keywords",edit_keywords); Fmetamod++; // note change zfree(txkeyword); return 1; } int edit_matchkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) // matching keyword was clicked { using namespace edit_main_names; ch *txkeyword, end = 0; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;",end); if (! txkeyword) return 1; add_keyword(txkeyword,edit_keywords,filekeywordsXcc); // add matching keyword to image Fmetamod++; // note change add_recenkeyword(txkeyword); // and add to recent keywords zdialog_stuff(zd_editmeta,"keywords",edit_keywords); // update dialog widgets zdialog_stuff(zd_editmeta,"recenkeywords",recent_keywords); zdialog_stuff(zd_editmeta,"newkeyword",""); zdialog_stuff(zd_editmeta,"matchkeywords",""); zdialog_goto(zd_editmeta,"newkeyword"); // put focus back on newkeyword widget zfree(txkeyword); return 1; } int edit_defkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) // defined keyword was clicked { using namespace edit_main_names; ch *txkeyword, end = 0; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;:",end); if (! txkeyword || end == ':') return 1; // nothing or keyword category, ignore add_keyword(txkeyword,edit_keywords,filekeywordsXcc); // add new keyword to file keywords list zdialog_stuff(zd_editmeta,"keywords",edit_keywords); // from defined keywords list Fmetamod++; // note change add_recenkeyword(txkeyword); // and add to recent keywords zdialog_stuff(zd_editmeta,"recenkeywords",recent_keywords); zfree(txkeyword); return 1; } // dialog event and completion callback function int editmeta_dialog_event(zdialog *zd, ch *event) { using namespace edit_main_names; ch pdate[20]; // yyyy:mm:dd hh:mm:ss int ii, jj, nn, nt, cc1, cc2, err, ff; float flati, flongi; ch *pp1, *pp2; ch catgname[keywordXcc]; ch newkeyword[keywordXcc], matchkeywords[20][keywordXcc]; ch matchkeywordstext[(keywordXcc+2)*20]; ch text50[50]; if (! curr_file) zd->zstat = 3; // current file gone if (strmatch(event,"cancel")) zd->zstat = 3; if (strmatch(event,"edittitle")) { // edit title meta_edit_text(title); if (title) strncpy0(text50,title,50); else *text50 = 0; if (strlen(text50) > 48) strcpy(text50+45," ..."); zdialog_stuff(zd,"title",text50); Fmetamod++; return 1; } if (strmatch(event,"editdesc")) { // edit description meta_edit_text(desc); if (desc) strncpy0(text50,desc,50); else *text50 = 0; if (strlen(text50) > 48) strcpy(text50+45," ..."); zdialog_stuff(zd,"desc",text50); Fmetamod++; return 1; } if (zstrstr("pdate rating location country gps_data",event)) { // note change, process later Fmetamod++; return 1; } if (strmatch(event,"geofind")) // [find] search images and world 26.0 { zdialog_fetch(zd,"location",location,40); // ignore blank location if (! *location) return 1; nn = find_location(zd); // search image location data 26.0 if (nn) Fmetamod++; // got at least location, country return 1; } if (strmatch(event,"geomap")) { // choose geocoordinates from map 26.7 m_show_on_map(0,0); return 1; } if (strmatch(event,"geomap-click")) { // gps_data modified via map click Fmetamod++; return 1; } if (strmatch(event,"geoprev")) // [previous] use previous location 25.1 { zdialog_stuff(zd,"location",p_location); zdialog_stuff(zd,"country",p_country); zdialog_stuff(zd,"gps_data",p_gps_data); return 1; } if (strmatch(event,"geoclear")) // [clear] location data { zdialog_stuff(zd,"location",""); // erase dialog fields zdialog_stuff(zd,"country",""); zdialog_stuff(zd,"gps_data",""); Fmetamod++; return 1; } if (strmatch(event,"defcats")) { // new keyword category selection zdialog_fetch(zd,"defcats",catgname,keywordXcc); defkeywords_stuff(zd,catgname); } if (strmatch(event,"clear recent")) { // clear recent keywords list zdialog_stuff(zd,"recenkeywords",""); *recent_keywords = 0; } if (strmatch(event,"newkeyword")) // new keyword is being typed in { zdialog_stuff(zd,"matchkeywords",""); // clear matchkeywords in dialog zdialog_fetch(zd,"newkeyword",newkeyword,keywordXcc); // get chars. typed so far cc1 = strlen(newkeyword); for (ii = jj = 0; ii <= cc1; ii++) { // remove foul characters if (strchr(",:;",newkeyword[ii])) continue; newkeyword[jj++] = newkeyword[ii]; } if (jj < cc1) { // something was removed newkeyword[jj] = 0; cc1 = jj; zdialog_stuff(zd,"newkeyword",newkeyword); } if (cc1 < 2) return 1; // wait for at least 2 chars. for (ii = nt = 0; ii < maxkeywordcats; ii++) // loop all categories { pp2 = defined_keywords[ii]; // category: aaaaaa, bbbbb, ... keywordN, if (! pp2) continue; // | | pp2 = strchr(pp2,':'); // pp1 pp2 while (true) // loop all defkeywords in category { pp1 = pp2 + 2; if (! *pp1) break; pp2 = strchr(pp1,','); if (! pp2) break; if (strmatchcaseN(newkeyword,pp1,cc1)) { // defkeyword matches chars. typed so far cc2 = pp2 - pp1; strncpy(matchkeywords[nt],pp1,cc2); // save defkeywords that match matchkeywords[nt][cc2] = 0; if (++nt == 20) return 1; // quit if 20 matches or more } } } if (nt == 0) return 1; // no matches pp1 = matchkeywordstext; for (ii = 0; ii < nt; ii++) // matchkeyword list: aaaaa, bbb, cccc ... { strcpy(pp1,matchkeywords[ii]); pp1 += strlen(pp1); strcpy(pp1,", "); pp1 += 2; } zdialog_stuff(zd,"matchkeywords",matchkeywordstext); // stuff matchkeywords in dialog return 1; } if (strmatch(event,"add")) // enter new keyword finished { zdialog_fetch(zd,"newkeyword",newkeyword,keywordXcc); // get finished keyword cc1 = strlen(newkeyword); if (! cc1) return 1; if (newkeyword[cc1-1] == '\n') { // remove newline character cc1--; newkeyword[cc1] = 0; } for (ii = ff = 0; ii < maxkeywordcats; ii++) // loop all categories { pp2 = defined_keywords[ii]; // category: aaaaaa, bbbbb, ... keywordN, if (! pp2) continue; // | | pp2 = strchr(pp2,':'); // pp1 pp2 while (true) // loop all defkeywords in category { pp1 = pp2 + 2; if (! *pp1) break; pp2 = strchr(pp1,','); if (! pp2) break; cc2 = pp2 - pp1; if (cc2 != cc1) continue; if (strmatchcaseN(newkeyword,pp1,cc1)) { // entered keyword matches defkeyword strncpy(newkeyword,pp1,cc1); // use defkeyword upper/lower case ff = 1; break; } } if (ff) break; } add_keyword(newkeyword,edit_keywords,filekeywordsXcc); // add to file keywords list add_recenkeyword(newkeyword); // and add to recent keywords Fmetamod++; // note change if (! ff) { // if new keyword, add to defined keywords add_defkeyword("nocatg",newkeyword); defkeywords_stuff(zd,"ALL"); // refresh keyword list } zdialog_stuff(zd,"newkeyword",""); // update dialog widgets zdialog_stuff(zd,"keywords",edit_keywords); zdialog_stuff(zd,"recenkeywords",recent_keywords); zdialog_stuff(zd,"matchkeywords",""); zdialog_goto(zd,"newkeyword"); // put focus back on newkeyword widget return 1; } if (! zd->zstat) return 1; // wait for completion if (zd->zstat == 1) // [prev] stuff previous file data { zd->zstat = 0; // keep dialog active if (! *pdate && *p_pdate) // stuff photo date only if none zdialog_stuff(zd,"pdate",p_pdate); zdialog_stuff(zd,"rating",p_rating); if (! p_keywords || ! *p_keywords) { // no previous keywords zdialog_stuff(zd,"keywords",""); *edit_keywords = 0; // stuff no keywords } else { // stuff previous keywords zdialog_stuff(zd,"keywords",p_keywords); strncpy0(edit_keywords,p_keywords,filekeywordsXcc); // sync edited keywords list } if (p_title && *p_title) { if (title) zfree(title); title = zstrdup(p_title,"edit_main"); strncpy0(text50,title,50); // limit to 50 chars. if (strlen(text50) > 48) strcpy(text50+45," ..."); zdialog_stuff(zd,"title",text50); } else { if (title) zfree(title); title = 0; zdialog_stuff(zd,"title",""); } if (p_desc && *p_desc) { if (desc) zfree(desc); desc = zstrdup(p_desc,"edit_main"); strncpy0(text50,p_desc,50); if (strlen(text50) > 48) strcpy(text50+45," ..."); zdialog_stuff(zd,"desc",text50); } else { if (desc) zfree(desc); desc = 0; zdialog_stuff(zd,"desc",""); } zdialog_stuff(zd,"location",p_location); zdialog_stuff(zd,"country",p_country); zdialog_stuff(zd,"gps_data",p_gps_data); Fmetamod++; return 1; } if (zd->zstat != 2) { // cancel zdialog_free(zd); // kill dialog zd_editmeta = 0; zd_mapgeotags = 0; // deactivate map clicks Fmetamod = 0; return 1; } zd->zstat = 0; // [apply] - keep dialog active gtk_window_present(MWIN); // return focus to main window if (! Fmetamod) return 1; // no metadata changes // edits finished // get all data from dialog, validate, save back to image file zdialog_fetch(zd,"pdate",pdate,20); if (*pdate && ! checkDT(pdate)) { // validate photo date zmessageACK(Mwin,TX("date format is yyyy:mm:dd [hh:mm:ss]")); return 1; } zdialog_fetch(zd,"rating",rating,4); zdialog_fetch(zd,"location",location,40); // clean extra blanks zdialog_fetch(zd,"country",country,40); strTrim2(location); strTrim2(country); if (*location) { *location = toupper(*location); // capitalize zdialog_stuff(zd,"location",location); } if (*country) { *country = toupper(*country); zdialog_stuff(zd,"country",country); } zdialog_fetch(zd,"gps_data",gps_data,24); if (*gps_data) { err = get_gps_data(gps_data,flati,flongi); if (err) { zmessageACK(Mwin,TX("invalid GPS data")); return 1; } } if (keywords) zfree(keywords); keywords = zstrdup(edit_keywords,"edit_main"); // get edited keywords ch *tagname[8] = { meta_pdate_tag, meta_rating_tag, // setup for meta_put() meta_keywords_tag, meta_title_tag, meta_desc_tag, meta_city_tag, meta_country_tag, meta_gps_tag }; ch *tagval[8] = { pdate, rating, keywords, title, desc, location, country, gps_data }; meta_put(curr_file,tagname,tagval,8); // update image file and xxrec_tab[] if (zd_metaview) meta_view(0); // if active, update metadata report 25.3 Fmetamod = 0; // no unsaved metadata edits if (*location && *country && *gps_data) // update geolocs table in memory put_imagelocs(zd); strncpy0(p_pdate,pdate,20); // copy data for use by [prev] button strncpy0(p_rating,rating,4); if (p_keywords) zfree(p_keywords); p_keywords = keywords, keywords = 0; if (p_title) zfree(p_title); p_title = 0; if (title) p_title = zstrdup(title,"edit_main"); // 26.0 if (p_desc) zfree(p_desc); p_desc = 0; if (desc) p_desc = zstrdup(desc,"edit_main"); // 26.0 strncpy0(p_location,location,40); strncpy0(p_country,country,40); strncpy0(p_gps_data,gps_data,24); return 1; } /**************************************************************************************/ // edit any metadata - add or change specified metadata tag data namespace meta_edit_any_names { ch tagname[metatagXcc]; ch tagval[metadataXcc]; } // menu function void m_meta_edit_any(GtkWidget *, ch *menu) { using namespace meta_edit_any_names; int meta_edit_any_dialog_event(zdialog *zd, ch *event); int meta_edit_any_clickfunc(GtkWidget *, int line, int pos, ch *input); GtkWidget *mtext; int err; zdialog *zd; ch *tagname1[1]; ch *tagval1[1], *pp; F1_help_topic = TX("EDIT ANY META"); printf("m_meta_edit_any \n"); if (FGM != 'F' && FGM != 'G') return; if (clicked_file) { // use clicked file if present if (! curr_file || ! strmatch(clicked_file,curr_file)) // avoid f_open() re-entry f_open(clicked_file); clicked_file = 0; } if (! curr_file) { if (zd_editanymeta) zdialog_free(zd_editanymeta); zd_editanymeta = 0; return; } err = access(curr_file,W_OK); // test file can be written by me if (err) { zmessageACK(Mwin,"%s: %s",TX("no write permission"),curr_file); return; } /*** ____________________________________________________________________ | Click to Select | File: filename.jpg | |------------------------------| | | (metadata list) | tag name [________________________] | | | tag value [_______________________] | | | | | | [fetch] [update] [delete] | | | | | | | | | | | | | | | | |--------------------------------------------------------------------| | [Short List] [Full List] [X] | |____________________________________________________________________| ***/ if (! zd_editanymeta) // popup dialog if not already { zd = zdialog_new(TX("Edit Any Metadata"),Mwin,TX("Short List"),TX("Full List"),"X",null); zd_editanymeta = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"expand"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"space=3"); zdialog_add_widget(zd,"label","lab1","vb1",TX("click to select"),"size=30"); zdialog_add_widget(zd,"scrwin","scrb1","vb1",0,"expand"); zdialog_add_widget(zd,"text","mtext","scrb1"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"expand|space=3"); zdialog_add_widget(zd,"hbox","hbf","vb2",0,"space=6"); zdialog_add_widget(zd,"label","labf","hbf",TX("File:"),"space=3"); zdialog_add_widget(zd,"label","file","hbf","filename.jpg","space=5"); zdialog_add_widget(zd,"hbox","hbtag","vb2",0,"space=2"); zdialog_add_widget(zd,"label","labtag","hbtag",TX("tag name"),"space=5"); zdialog_add_widget(zd,"zentry","tagname","hbtag",0,"size=30"); zdialog_add_widget(zd,"hbox","hbdata","vb2",0,"space=2"); zdialog_add_widget(zd,"label","labdata","hbdata",TX("tag value"),"space=5"); zdialog_add_widget(zd,"zedit","tagval","hbdata",0,"expand|wrap"); zdialog_add_widget(zd,"hbox","hbb","vb2",0,"space=10"); zdialog_add_widget(zd,"label","space","hbb",0,"expand"); zdialog_add_widget(zd,"button","fetch","hbb",TX("fetch"),"space=3"); zdialog_add_widget(zd,"button","update","hbb",TX("update"),"space=3"); zdialog_add_widget(zd,"button","delete","hbb",TX("delete"),"space=3"); zdialog_resize(zd,700,400); zdialog_run(zd,meta_edit_any_dialog_event,0); // start dialog mtext = zdialog_gtkwidget(zd,"mtext"); // make clickable metadata list txwidget_set_eventfunc(mtext,meta_edit_any_clickfunc); // set mouse/KB event function *tagname = 0; } zd = zd_editanymeta; // dialog can stay open pp = strrchr(curr_file,'/'); // stuff file name in dialog if (pp) zdialog_stuff(zd,"file",pp+1); zdialog_send_event(zd,"initz"); // initz. dialog tag list if (*tagname) // update current tag value { tagname1[0] = tagname; // look for tag data meta_get(curr_file,tagname1,tagval1,1); if (tagval1[0]) { strncpy0(tagval,tagval1[0],metadataXcc); zfree(tagval1[0]); } else *tagval = 0; zdialog_stuff(zd,"tagval",tagval); // stuff into dialog } return; } // dialog event and completion callback function int meta_edit_any_dialog_event(zdialog *zd, ch *event) { using namespace meta_edit_any_names; GtkWidget *mtext; ch buff[1000]; FILE *fid; ch *file2; ch *pp, *ppp; ch *tagname1[1]; ch *tagval1[1]; ch ppc1[80], ppc2[80]; int ii, err; static int Fwarn = 1; static int whichlist = 1; // 1/2 = short/full list ch *warnmess = TX("Caution: Use the function Edit Main Metadata \n" // 25.3 "to changed tags available there, to insure \n" "related updates are made."); if (strmatch(event,"initz")) { if (whichlist == 1) zd->zstat = 1; if (whichlist == 2) zd->zstat = 2; } if (! curr_file) return 1; if (strmatch(event,"fetch")) { zdialog_fetch(zd,"tagname",tagname,metatagXcc); // get tag name from dialog strCompress(tagname); tagname1[0] = tagname; // look for tag data meta_get(curr_file,tagname1,tagval1,1); if (tagval1[0]) { strncpy0(tagval,tagval1[0],metadataXcc); zfree(tagval1[0]); } else *tagval = 0; zdialog_stuff(zd,"tagval",tagval); // stuff into dialog } if (strmatch(event,"update")) { zdialog_fetch(zd,"tagname",tagname,metatagXcc); // get tag name from dialog zdialog_fetch(zd,"tagval",tagval,metadataXcc); strCompress(tagname); tagname1[0] = tagname; tagval1[0] = tagval; err = meta_put(curr_file,tagname1,tagval1,1); // metadata --> file if (err) zmessageACK(Mwin,TX("metadata update error")); if (zd_metaview) meta_view(0); // update metadata view if active } if (strmatch(event,"delete")) { zdialog_fetch(zd,"tagname",tagname,metatagXcc); // get tag name from dialog zdialog_stuff(zd,"tagval",""); // clear tag data in dialog *tagval = 0; // and in memory strCompress(tagname); tagname1[0] = tagname; tagval1[0] = tagval; err = meta_put(curr_file,tagname1,tagval1,1); // metadata --> file if (err) zmessageACK(Mwin,TX("metadata update error")); if (zd_metaview) meta_view(0); // update metadata view if active } if (! zd->zstat) return 1; // wait for completion if (zd->zstat == 1) // short list { zd->zstat = 0; // keep dialog active mtext = zdialog_gtkwidget(zd,"mtext"); // make clickable metadata list txwidget_clear(mtext); fid = fopen(meta_picklist_file,"r"); // get list of metadata tags if (fid) { while ((pp = fgets_trim(buff,1000,fid))) { if (strlen(pp) > 79) pp[79] = 0; strCompress(ppc1,pp); // exclude tags indexed by default 25.1 for (ii = 0; ii < NKX; ii++) { strCompress(ppc2,tagnamex[ii]); if (strcasestr(ppc1,ppc2)) break; } if (ii < NKX) continue; txwidget_append(mtext,0,"%s\n",pp); } fclose(fid); } whichlist = 1; } else if (zd->zstat == 2) // full list { if (Fwarn) zmessageACK(Mwin,warnmess); // 25.1 Fwarn = 0; zd->zstat = 0; // keep dialog active mtext = zdialog_gtkwidget(zd,"mtext"); // make clickable metadata list txwidget_clear(mtext); file2 = zescape_quotes(curr_file); snprintf(command,CCC,"exiftool -m -S \"%s\" ",file2); // exiftool command zfree(file2); fid = popen(command,"r"); // get command outputs if (fid) { while ((pp = fgets_trim(buff,1000,fid))) { ppp = strchr(pp,':'); if (! ppp) continue; *ppp = 0; txwidget_append(mtext,0,"%s\n",pp); // add to report window } pclose(fid); } whichlist = 2; } else { zdialog_free(zd); // OK or cancel zd_editanymeta = 0; } return 1; } // get clicked tag name from list and insert into dialog int meta_edit_any_clickfunc(GtkWidget *widget, int line, int pos, ch *input) { using namespace meta_edit_any_names; ch *pp, *tagval1[1]; ch *tagname1[1]; if (! zd_editanymeta) return 1; if (! curr_file) return 1; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } pp = txwidget_line(widget,line,1); // get clicked line, highlight if (! pp || ! *pp) return 1; txwidget_highlight_line(widget,line); zdialog_stuff(zd_editanymeta,"tagname",pp); zdialog_fetch(zd_editanymeta,"tagname",tagname,metatagXcc); // get tag name from dialog strCompress(tagname); tagname1[0] = tagname; // look for tag data meta_get(curr_file,tagname1,tagval1,1); if (tagval1[0]) { strncpy0(tagval,tagval1[0],metadataXcc); zfree(tagval1[0]); } else *tagval = 0; zdialog_stuff(zd_editanymeta,"tagval",tagval); // stuff into dialog return 1; } /**************************************************************************************/ // delete metadata, specific tag or all data void m_meta_delete(GtkWidget *, ch *menu) { int meta_delete_dialog_event(zdialog *zd, ch *event); zdialog *zd; ch *pp; int err; F1_help_topic = TX("DELETE META"); printf("m_meta_delete \n"); if (FGM != 'F' && FGM != 'G') return; if (clicked_file) { // use clicked file if present if (! curr_file || ! strmatch(clicked_file,curr_file)) // avoid f_open() re-entry f_open(clicked_file); clicked_file = 0; } if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } err = access(curr_file,W_OK); // test file can be written by me if (err) { zmessageACK(Mwin,"%s: %s",TX("no write permission"),curr_file); return; } /*** _________________________________________ | Delete Metadata | | | | File: [______________________________] | | | | (o) ALL (o) One Tag: [______________] | | | | [Apply] [X] | |_________________________________________| ***/ if (! zd_deletemeta) { zd = zdialog_new(TX("Delete Metadata"),Mwin,TX("Apply"),"X",null); zd_deletemeta = zd; zdialog_add_widget(zd,"hbox","hbf","dialog"); zdialog_add_widget(zd,"label","labf","hbf",TX("File:"),"space=3"); zdialog_add_widget(zd,"label","file","hbf",0,"space=5"); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"radio","tall","hb1",TX("All"),"space=5"); zdialog_add_widget(zd,"radio","tag1","hb1",TX("One Tag:")); zdialog_add_widget(zd,"zentry","tagval","hb1",0,"size=20"); zdialog_stuff(zd,"tag1",1); zdialog_run(zd,meta_delete_dialog_event,"parent"); } zd = zd_deletemeta; pp = ""; if (curr_file) { pp = strrchr(curr_file,'/'); if (pp) pp++; else pp = curr_file; } zdialog_stuff(zd,"file",pp); return; } // dialog event and completion callback function int meta_delete_dialog_event(zdialog *zd, ch *event) { int tall, tag1; ch *file2; ch tagval[200]; if (! zd->zstat) return 1; // wait for completion if (zd->zstat != 1) { // canceled zdialog_free(zd); zd_deletemeta = 0; return 1; } zd->zstat = 0; // dialog remains active if (! curr_file) return 1; zdialog_fetch(zd,"tall",tall); zdialog_fetch(zd,"tag1",tag1); zdialog_fetch(zd,"tagval",tagval,200); strCompress(tagval); if (! tall && ! tag1) return 1; file2 = zescape_quotes(curr_file); if (tall) // update file metadata zshell("log ack","exiftool -m -q -overwrite_original -all= \"%s\"",file2); else if (tag1) zshell("log ack","exiftool -m -q -overwrite_original -%s= \"%s\"",tagval,file2); zfree(file2); file_to_xxrec(curr_file); // update xxrec_tab[] if (zd_metaview) meta_view(0); // update metadata view if active return 1; } /**************************************************************************************/ // copy metadata from one image to another void m_meta_copy(GtkWidget *, ch *menu) { int meta_copy_dialog_event(zdialog *zd, ch *event); F1_help_topic = TX("COPY META"); printf("m_meta_copy \n"); viewmode('G'); /*** _______________________________________________ | Copy Metadata | | | | source file: [_____________________] [Browse] | | target file: [_____________________] [Browse] | | | | [Apply] [X] | |_______________________________________________| ***/ zdialog *zd = zdialog_new(TX("Copy Metadata"),Mwin,TX("Apply"),"X",null); zdialog_add_widget(zd,"hbox","hbs","dialog",0,"expand|space=3"); zdialog_add_widget(zd,"label","labs","hbs",TX("source file:"),"space=3"); zdialog_add_widget(zd,"zentry","sfile","hbs",0,"expand|space=3"); zdialog_add_widget(zd,"button","sbrowse","hbs",TX("Browse"),"space=3"); zdialog_add_widget(zd,"hbox","hbt","dialog",0,"expand|space=3"); zdialog_add_widget(zd,"label","labt","hbt",TX("target file:"),"space=3"); zdialog_add_widget(zd,"zentry","tfile","hbt",0,"expand|space=3"); zdialog_add_widget(zd,"button","tbrowse","hbt",TX("Browse"),"space=3"); zdialog_resize(zd,400,0); zdialog_run(zd,meta_copy_dialog_event,"parent"); return; } // dialog event and completion callback function int meta_copy_dialog_event(zdialog *zd, ch *event) { int err = 0; ch *pp; ch sfile[XFCC], tfile[XFCC]; if (strmatch(event,"sbrowse")) // choose source file { zdialog_show(zd,0); pp = select_1file(0); if (pp) zdialog_stuff(zd,"sfile",pp); if (pp) zfree(pp); zdialog_show(zd,1); } if (strmatch(event,"tbrowse")) // choose target file { zdialog_show(zd,0); pp = select_1file(0); if (pp) zdialog_stuff(zd,"tfile",pp); if (pp) zfree(pp); zdialog_show(zd,1); } if (! zd->zstat) return 1; // wait for completion if (zd->zstat != 1) { // cancel zdialog_free(zd); return 1; } zd->zstat = 0; // keep dialog active zdialog_fetch(zd,"sfile",sfile,XFCC); // get source and target files zdialog_fetch(zd,"tfile",tfile,XFCC); if (! regfile(sfile)) { // validate source file zmessageACK(Mwin,TX("file not found: %s"),sfile); return 1; } if (! regfile(tfile)) { // validate target file zmessageACK(Mwin,TX("file not found: %s"),tfile); return 1; } err = access(tfile,W_OK); // test target file permissions if (err) { zmessageACK(Mwin,TX("no write permission: %s"),tfile); return 1; } printf("copy metadata from %s \n to %s \n",sfile,tfile); err = meta_copy(sfile,tfile,0,0,0); // copy metadata, update xxrec_tab[] if (err) zmessageACK(Mwin,TX("metadata update error: %s"),tfile); zdialog_free(zd); // done return 1; } /**************************************************************************************/ // menu function // fix malformed metadata that prevents exiftool() from working void m_meta_fix(GtkWidget *, ch *menu) { int meta_fix_dialog_event(zdialog *zd, ch *event); int yn, zstat; ch file[XFCC], *file2; FTYPE ftype; ch *pp, command[XFCC+100]; ch *tooloptions = "-all= -tagsfromfile @ -all:all -unsafe " "-icc_profile -overwrite_original"; F1_help_topic = TX("FIX META"); printf("m_meta_fix \n"); /*** ______________________________________ | Fix Broken Metadata | | | | File: [____________________________] | | | | [Apply] [X] | |______________________________________| ***/ zdialog *zd = zdialog_new(TX("Fix Broken Metadata"),Mwin,TX("Apply"),"X",null); // allow any file 26.3 zdialog_add_widget(zd,"hbox","hbf","dialog",0,"expand|space=3"); zdialog_add_widget(zd,"label","labf","hbf",TX("File"),"space=3"); zdialog_add_widget(zd,"zentry","file","hbf",0,"expand|space=3"); if (curr_file) zdialog_stuff(zd,"file",curr_file); // default current file 26.3 zdialog_resize(zd,400,0); zdialog_run(zd,0,"parent"); zstat = zdialog_wait(zd); zdialog_fetch(zd,"file",file,XFCC); zdialog_free(zd); if (zstat != 1) return; ftype = image_file_type(file); if (ftype != IMAGE && ftype != RAW) { zmessageACK(Mwin,TX("not a known image file")); return; } pp = strrchr(file,'/'); if (! pp) return; yn = zmessageYN(Mwin,TX("repair metadata for %s"),pp+1); if (! yn) return; file2 = zescape_quotes(file); snprintf(command,XFCC+100,"exiftool %s \"%s\" ",tooloptions,file2); zshell("log",command); zfree(file2); file_to_xxrec(file); // update xxrec_tab[] zmessageACK(Mwin,TX("completed")); return; } /**************************************************************************************/ // manage keywords function - auxiliary dialog zdialog *zdmanagekeywords = 0; void m_meta_manage_keywords(GtkWidget *, ch *menu) { int manage_defkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int managekeywords_dialog_event(zdialog *zd, ch *event); GtkWidget *widget; zdialog *zd; F1_help_topic = TX("MANAGE KEYWORDS"); printf("m_meta_manage_keywords \n"); /*** ______________________________________________________________ | Manage Keywords | | | | category [__________] keyword [_________] [Create] [Delete] | | | | Defined Keywords: _________________________________________ | | | | | | | category1: keyword11, keyword12, keyword13 ... | | | | category2: keyword21, keyword22, keyword23 ... | | | | ... | | | | | | | | | | | | | | | |__________________________________________________________| | | | | [OK] | |______________________________________________________________| ***/ if (zdmanagekeywords) return; zd = zdialog_new(TX("Manage Keywords"),Mwin,"OK",null); zdmanagekeywords = zd; zdialog_add_widget(zd,"hbox","hb7","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labcatg","hb7","category","space=5"); zdialog_add_widget(zd,"zentry","catg","hb7",0,"size=12"); zdialog_add_widget(zd,"label","space","hb7",0,"space=5"); zdialog_add_widget(zd,"label","labkeyword","hb7","keyword","space=5"); zdialog_add_widget(zd,"zentry","keyword","hb7",0,"size=20|expand"); zdialog_add_widget(zd,"label","space","hb7",0,"space=5"); zdialog_add_widget(zd,"button","create","hb7",TX("Create")); zdialog_add_widget(zd,"button","delete","hb7",TX("Delete"),"space=3"); zdialog_add_widget(zd,"hbox","hb8","dialog"); zdialog_add_widget(zd,"label","labdefkeywords","hb8",TX("Defined Keywords:"),"space=5"); zdialog_add_widget(zd,"hbox","hb9","dialog",0,"expand"); zdialog_add_widget(zd,"scrwin","scrwin8","hb9",0,"expand"); zdialog_add_widget(zd,"text","defkeywords","scrwin8",0,"wrap"); widget = zdialog_gtkwidget(zd,"defkeywords"); // defkeywords widget mouse/KB event func txwidget_set_eventfunc(widget,manage_defkeywords_clickfunc); load_defkeywords(0); // stuff defined keywords into dialog defkeywords_stuff(zd,"ALL"); zdialog_resize(zd,0,400); zdialog_run(zd,managekeywords_dialog_event,0); // run dialog zdialog_wait(zd); zdialog_free(zd); return; } // mouse click functions for widget having keywords int manage_defkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) // keyword or keyword category was clicked { ch *txkeyword, end = 0; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;:",end); if (! txkeyword) return 1; if (end == ':') zdialog_stuff(zdmanagekeywords,"catg",txkeyword); // selected category >> dialog widget else zdialog_stuff(zdmanagekeywords,"keyword",txkeyword); // selected keyword >> dialog widget zfree(txkeyword); return 1; } // dialog event and completion callback function int managekeywords_dialog_event(zdialog *zd, ch *event) { ch keyword[keywordXcc], catg[keywordXcc]; int err, changed = 0; if (zd->zstat) // [OK] or [x] { zdialog_free(zd); zdmanagekeywords = 0; return 1; } if (strmatch(event,"create")) { // add new keyword to defined keywords zdialog_fetch(zd,"catg",catg,keywordXcc); zdialog_fetch(zd,"keyword",keyword,keywordXcc); err = add_defkeyword(catg,keyword); if (! err) changed++; } if (strmatch(event,"delete")) { // remove keyword from defined keywords zdialog_fetch(zd,"keyword",keyword,keywordXcc); zdialog_fetch(zd,"catg",catg,keywordXcc); if (*keyword) { del_defkeyword(keyword); changed++; } else if (*catg) { del_defcatg(catg); changed++; } } if (changed) { save_defkeywords(); // save keyword updates to file defkeywords_stuff(zd,"ALL"); // update dialog "defkeywords" window if (zd_editmeta) // and edit metadata dialog if active defkeywords_stuff(zd_editmeta,"ALL"); if (zd_batchkeywords) // and batch keywords dialog if active defkeywords_stuff(zd_batchkeywords,"ALL"); } return 1; } /**************************************************************************************/ // Choose metadata tags for captions on top of the current image. void m_meta_choose_caps(GtkWidget *, ch *menu) { zlist_t *Zcapstags; F1_help_topic = TX("CAPTIONS"); printf("m_meta_choose_caps \n"); Zcapstags = zlist_from_file(capstags_file); // get current metadata tags if (! Zcapstags) { Zcapstags = zlist_new(0); // file missing, make default list zlist_append(Zcapstags,"filename",1); } select_meta_tags(Zcapstags,maxcaptags,0); // user edit tag list zlist_to_file(Zcapstags,capstags_file); // save changes to file meta_show_caps(1); return; } // show captions text on current image void meta_show_caps(int show) { zlist_t *Zcapstags; ch *pp, *mtags[maxcaptags], *metatext[maxcaptags]; ch captext1[capsXcc], **captext2; int ii, nn, Ncaps, cc1, cc2; if (! curr_file) return; if (! show) { erase_toptext(1); Fpaintnow(); Fcaps = 0; return; } Zcapstags = zlist_from_file(capstags_file); // get current metadata tags if (! Zcapstags) { Zcapstags = zlist_new(1); // file missing, make default list zlist_put(Zcapstags,"filename",0); // (show file name) bugfix } Ncaps = zlist_count(Zcapstags); // tag count if (! Ncaps) return; for (ii = 0; ii < Ncaps; ii++) { // get metadata tags pp = zlist_get(Zcapstags,ii); mtags[ii] = zstrdup(pp,"capstags"); } meta_get(curr_file,mtags,metatext,Ncaps); // get metadata text for input tags cc1 = 0; for (ii = 0; ii < Ncaps; ii++) // put text strings together { // with \n separators if (! metatext[ii]) continue; cc2 = strlen(metatext[ii]); if (cc1 + 2 + cc2 > capsXcc) cc2 = capsXcc - cc1 - 2; if (cc2 < 1) break; if (cc1 > 0) captext1[cc1++] = '\n'; strncpy(captext1+cc1,metatext[ii],cc2); cc1 += cc2; } captext1[cc1] = 0; if (cc1 == 0) return; // no captions nn = breakup_text(captext1,captext2,0,100); // break into lines within user limits cc1 = 0; for (ii = 0; ii < nn; ii++) { // combine lines with \n separators cc2 = strlen(captext2[ii]); if (cc1 + cc2 + 2 > capsXcc) cc2 = capsXcc - cc1 - 2; if (cc2 < 1) break; if (cc1) captext1[cc1++] = '\n'; strcpy(captext1+cc1,captext2[ii]); cc1 += cc2; zfree(captext2[ii]); } erase_toptext(1); add_toptext(1,0,0,captext1,zfuncs::appfont); Fpaintnow(); Fcaps = 1; return; } // Show popup window with title and description in image top left corner void meta_popup_title(int onoff) // 25.0 { static int Fonoff = 0; ch *title, *description; ch *tagname[2] = { meta_title_tag, meta_desc_tag }; ch *tagval[2]; ch text[1000]; ch **text2; int ii, nn; if (! curr_file) return; // no image file if (CEF) return; // edit function active if (onoff == Fonoff) return; // no change in popup status Fonoff = onoff; // toggle status on <--> off if (onoff) // show popup { tagval[0] = tagval[1] = 0; meta_get(curr_file,tagname,tagval,2); // get image title and description if (tagval[0]) title = tagval[0]; else title = TX("no title"); if (tagval[1]) description = tagval[1]; else description = TX("no description"); snprintf(text,1000,"%s\n%s",title,description); // combine title & description nn = breakup_text(text,text2,".,;-",100); // wrap text lines within user limits *text = 0; for (ii = 0; ii < nn; ii++) { if (ii < nn-1) strncatv(text,1000,text2[ii],"\n",null); else strncatv(text,1000,text2[ii],null); } poptext_mouse(text,20,20,0,0); // popup window, no time limit for (ii = 0; ii < nn; ii++) // free memory zfree(text2[ii]); zfree(text2); if (tagval[0]) zfree(tagval[0]); // free memory if (tagval[1]) zfree(tagval[1]); } else { poptext_killnow(); onoff = 0; } return; } /**************************************************************************************/ // toggle display of metadata text at the top of the displayed image file void m_meta_toggle_caps(GtkWidget *, ch *menu) { F1_help_topic = TX("CAPTIONS"); Fcaps = 1 - Fcaps; meta_show_caps(Fcaps); return; } /**************************************************************************************/ // menu function - add and remove keywords for many files at once namespace batchkeywords { ch addkeywords[batchkeywordsXcc]; // keywords to add, list ch delkeywords[batchkeywordsXcc]; // keywords to remove, list int radadd, raddel; // dialog radio buttons ch countmess[80]; } void m_batch_keywords(GtkWidget *, ch *menu) // combine batch add/del keywords { using namespace batchkeywords; int batch_addkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int batch_delkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int batch_matchkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int batch_defkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int batch_keywords_dialog_event(zdialog *zd, ch *event); ch *pkeyword, *file; int zstat, ii, jj, err; zdialog *zd, *zdpop; GtkWidget *widget; xxrec_t *xxrec; ch *tagname[1], *tagval[1]; F1_help_topic = TX("BATCH KEYWORDS"); printf("m_batch_keywords \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("batch keywords")) return; /*** ________________________________________________________ | Batch Add/Remove Keywords | | | | [Select Files] NN files selected | | | | (o) keywords to add [____________________________] | | (o) keywords to remove [____________________________] | | - - - - - - - - - - - - - - - - - - - - - - - - - - - | | Enter New Keyword [___________] [Add] | | Matching Keywords [_________________________________] | | - - - - - - - - - - - - - - - - - - - - - - - - - - - | | Keywords Category [________________|v] | | | | | | | | | | | | | | | | | | | | | | | | | | | |___________________________________________________| | | | | [Proceed] [X] | |________________________________________________________| ***/ zd = zdialog_new(TX("Batch Add/Remove Keywords"),Mwin,TX("Proceed"),"X",null); zd_batchkeywords = zd; // [Select Files] NN files selected zdialog_add_widget(zd,"hbox","hbfiles","dialog",0,"space=3"); zdialog_add_widget(zd,"button","files","hbfiles",TX("Select Files"),"space=5"); zdialog_add_widget(zd,"label","labcount","hbfiles",TX("no files selected"),"space=10"); // (o) keywords to add [_______________________________________] // (o) keywords to remove [_______________________________________] zdialog_add_widget(zd,"hbox","hbkeywords","dialog",0,"space=3"); zdialog_add_widget(zd,"vbox","vb1","hbkeywords",0,"space=3|homog"); zdialog_add_widget(zd,"vbox","vb2","hbkeywords",0,"space=3|homog|expand"); zdialog_add_widget(zd,"radio","radadd","vb1",TX("keywords to add")); zdialog_add_widget(zd,"radio","raddel","vb1",TX("keywords to remove")); zdialog_add_widget(zd,"text","addkeywords","vb2",0,"expand|wrap"); zdialog_add_widget(zd,"text","delkeywords","vb2",0,"expand|wrap"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=3"); // Enter New Keyword [________________] [Add] zdialog_add_widget(zd,"hbox","hbnt","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labnt","hbnt",TX("Enter New Keyword"),"space=3"); zdialog_add_widget(zd,"zentry","newkeyword","hbnt"); zdialog_add_widget(zd,"button","add","hbnt",TX("Add"),"space=5"); // Matching Keywords [____________________________________________] zdialog_add_widget(zd,"hbox","hbmt","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labmt","hbmt",TX("Matching Keywords"),"space=3"); zdialog_add_widget(zd,"text","matchkeywords","hbmt",0,"expand|wrap"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=5"); // Keywords Category [____________________|v] zdialog_add_widget(zd,"hbox","hbdt1","dialog"); zdialog_add_widget(zd,"label","labdt","hbdt1",TX("Keywords Category"),"space=3"); zdialog_add_widget(zd,"combo","defcats","hbdt1",0,"expand|space=10|size=20"); zdialog_add_widget(zd,"hbox","hbdt2","dialog",0,"expand"); zdialog_add_widget(zd,"scrwin","swdt2","hbdt2",0,"expand"); zdialog_add_widget(zd,"text","defkeywords","swdt2",0,"wrap"); zdialog_stuff(zd,"radadd",1); // initz. radio buttons zdialog_stuff(zd,"raddel",0); load_defkeywords(0); // stuff defined keywords into dialog defkeywords_stuff(zd,"ALL"); defcats_stuff(zd); // and defined categories *addkeywords = *delkeywords = 0; snprintf(countmess,80,TX("%d image files selected"),SFcount); // show selected files count zdialog_stuff(zd,"labcount",countmess); widget = zdialog_gtkwidget(zd,"addkeywords"); // keyword widget mouse/KB event funcs txwidget_set_eventfunc(widget,batch_addkeywords_clickfunc); widget = zdialog_gtkwidget(zd,"delkeywords"); txwidget_set_eventfunc(widget,batch_delkeywords_clickfunc); widget = zdialog_gtkwidget(zd,"matchkeywords"); txwidget_set_eventfunc(widget,batch_matchkeywords_clickfunc); widget = zdialog_gtkwidget(zd,"defkeywords"); txwidget_set_eventfunc(widget,batch_defkeywords_clickfunc); zdialog_resize(zd,500,500); // run dialog zdialog_run(zd,batch_keywords_dialog_event,0); zstat = zdialog_wait(zd); // wait for dialog completion zdialog_free(zd); zd_batchkeywords = 0; if (zstat != 1) { // cancel Fblock(0); return; } zdpop = popup_report_open("Batch Keywords",Mwin,500,200,0,0,0,"X",null); // status report popup window Fbusy(+1); for (ii = 0; ii < SFcount; ii++) // loop all selected files { zmainloop(); // keep GTK alive if (! zdialog_valid(zdpop)) break; // report canceled file = SelFiles[ii]; // display image popup_report_write2(zdpop,0,"%s \n",file); // report progress err = access(file,W_OK); // test file can be written by me if (err) { popup_report_write2(zdpop,1,TX("no write permission \n")); continue; } xxrec = get_xxrec(file); if (! xxrec) continue; // deleted, not image file if (xxrec->keywords) strncpy0(edit_keywords,xxrec->keywords,filekeywordsXcc); // copy keywords for editing for (jj = 1; ; jj++) // remove keywords if present { pkeyword = (ch *) substring(delkeywords,",;",jj); if (! pkeyword) break; if (*pkeyword == 0) continue; err = del_keyword(pkeyword,edit_keywords); if (err) continue; } for (jj = 1; ; jj++) // add new keywords unless already { pkeyword = (ch *) substring(addkeywords,",;",jj); if (! pkeyword) break; if (*pkeyword == 0) continue; err = add_keyword(pkeyword,edit_keywords,filekeywordsXcc); if (err == 2) { zmessageACK(Mwin,TX("%s: too many keywords"),file); break; } } tagname[0] = meta_keywords_tag; // update file metadata tagval[0] = edit_keywords; err = meta_put(file,tagname,tagval,1); if (err) popup_report_write2(zdpop,1,TX("file metadata update failed")); } if (! zdialog_valid(zdpop)) printf("*** report canceled \n"); else popup_report_write2(zdpop,0,TX("\n*** COMPLETED \n")); popup_report_bottom(zdpop); Fbusy(-1); load_defkeywords(1); // update defined keywords list Fblock(0); return; } // mouse click functions for widgets holding keywords int batch_addkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) // a keyword in the add list was clicked { using namespace batchkeywords; ch *txkeyword, end; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;",end); if (! txkeyword) return 1; del_keyword(txkeyword,addkeywords); // remove keyword from list zdialog_stuff(zd_batchkeywords,"addkeywords",addkeywords); zfree(txkeyword); return 1; } int batch_delkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) // a keyword in the remove list was clicked { using namespace batchkeywords; ch *txkeyword, end; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;",end); if (! txkeyword) return 1; del_keyword(txkeyword,delkeywords); // remove keyword from list zdialog_stuff(zd_batchkeywords,"delkeywords",delkeywords); zfree(txkeyword); return 1; } int batch_matchkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) // matching keyword was clicked { using namespace batchkeywords; ch *txkeyword, end = 0; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;",end); if (! txkeyword) return 1; zdialog_fetch(zd_batchkeywords,"radadd",radadd); // which radio button? if (radadd) { add_keyword(txkeyword,addkeywords,batchkeywordsXcc); // add recent keyword to keyword add list zdialog_stuff(zd_batchkeywords,"addkeywords",addkeywords); } else { add_keyword(txkeyword,delkeywords,batchkeywordsXcc); // add recent keyword to keyword remove list zdialog_stuff(zd_batchkeywords,"delkeywords",delkeywords); } zdialog_stuff(zd_batchkeywords,"newkeyword",""); // clear newkeyword and matchkeywords zdialog_stuff(zd_batchkeywords,"matchkeywords",""); zdialog_goto(zd_batchkeywords,"newkeyword"); // put focus back on newkeyword widget zfree(txkeyword); return 1; } int batch_defkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) // a defined keyword was clicked { using namespace batchkeywords; ch *txkeyword, end; int radadd; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;:",end); if (! txkeyword || end == ':') return 1; // nothing or keyword category, ignore zdialog_fetch(zd_batchkeywords,"radadd",radadd); // which radio button? if (radadd) { add_keyword(txkeyword,addkeywords,batchkeywordsXcc); // add defined keyword to keyword add list zdialog_stuff(zd_batchkeywords,"addkeywords",addkeywords); } else { add_keyword(txkeyword,delkeywords,batchkeywordsXcc); // add defined keyword to keyword remove list zdialog_stuff(zd_batchkeywords,"delkeywords",delkeywords); } zfree(txkeyword); return 1; } // batchkeywords dialog event function int batch_keywords_dialog_event(zdialog *zd, ch *event) { using namespace batchkeywords; ch catgname[keywordXcc]; int ii, jj, nt, cc1, cc2, ff; ch *pp1, *pp2; ch newkeyword[keywordXcc], matchkeywords[20][keywordXcc]; ch matchkeywordstext[(keywordXcc+2)*20]; if (zd->zstat) // dialog completed { if (zd->zstat == 1) { // proceed if (! SFcount || (*addkeywords <= ' ' && *delkeywords <= ' ')) { zmessageACK(Mwin,TX("specify files and keywords")); zd->zstat = 0; // keep dialog active } } else zd_batchkeywords = 0; return 1; // cancel } if (strmatch(event,"files")) // select images to process { zdialog_show(zd,0); // hide parent dialog select_files(0); // get new list zdialog_show(zd,1); snprintf(countmess,80,TX("%d image files selected"),SFcount); zdialog_stuff(zd,"labcount",countmess); } if (zstrstr("radadd raddel",event)) { // get state of radio buttons zdialog_fetch(zd,"radadd",radadd); zdialog_fetch(zd,"raddel",raddel); } if (strmatch(event,"defcats")) { // new keyword category selection zdialog_fetch(zd,"defcats",catgname,keywordXcc); defkeywords_stuff(zd,catgname); } if (strmatch(event,"newkeyword")) // new keyword is being typed in { zdialog_stuff(zd,"matchkeywords",""); // clear matchkeywords in dialog zdialog_fetch(zd,"newkeyword",newkeyword,keywordXcc); // get chars. typed so far cc1 = strlen(newkeyword); for (ii = jj = 0; ii <= cc1; ii++) { // remove foul characters if (strchr(",:;",newkeyword[ii])) continue; newkeyword[jj++] = newkeyword[ii]; } if (jj < cc1) { // something was removed newkeyword[jj] = 0; cc1 = jj; zdialog_stuff(zd,"newkeyword",newkeyword); } if (cc1 < 2) return 1; // wait for at least 2 chars. for (ii = nt = 0; ii < maxkeywordcats; ii++) // loop all categories { pp2 = defined_keywords[ii]; // category: aaaaaa, bbbbb, ... keywordN, if (! pp2) continue; // | | pp2 = strchr(pp2,':'); // pp1 pp2 while (true) // loop all defkeywords in category { pp1 = pp2 + 2; if (! *pp1) break; pp2 = strchr(pp1,','); if (! pp2) break; if (strmatchcaseN(newkeyword,pp1,cc1)) { // defkeyword matches chars. typed so far cc2 = pp2 - pp1; strncpy(matchkeywords[nt],pp1,cc2); // save defkeywords that match matchkeywords[nt][cc2] = 0; if (++nt == 20) return 1; // quit if 20 matches or more } } } if (nt == 0) return 1; // no matches pp1 = matchkeywordstext; for (ii = 0; ii < nt; ii++) // make defkeyword list: aaaaa, bbb, cccc ... { strcpy(pp1,matchkeywords[ii]); pp1 += strlen(pp1); strcpy(pp1,", "); pp1 += 2; } zdialog_stuff(zd,"matchkeywords",matchkeywordstext); // stuff matchkeywords in dialog return 1; } if (strmatch(event,"add")) // enter new keyword finished { zdialog_fetch(zd,"newkeyword",newkeyword,keywordXcc); // get finished keyword cc1 = strlen(newkeyword); if (! cc1) return 1; if (newkeyword[cc1-1] == '\n') { // remove newline character cc1--; newkeyword[cc1] = 0; } for (ii = ff = 0; ii < maxkeywordcats; ii++) // loop all categories { pp2 = defined_keywords[ii]; // category: aaaaaa, bbbbb, ... keywordN, if (! pp2) continue; // | | pp2 = strchr(pp2,':'); // pp1 pp2 while (true) // loop all defkeywords in category { pp1 = pp2 + 2; if (! *pp1) break; pp2 = strchr(pp1,','); if (! pp2) break; cc2 = pp2 - pp1; if (cc2 != cc1) continue; if (strmatchcaseN(newkeyword,pp1,cc1)) { // entered keyword matches defkeyword strncpy(newkeyword,pp1,cc1); // use defkeyword upper/lower case ff = 1; break; } } if (ff) break; } if (! ff) { // if new keyword, add to defined keywords add_defkeyword("nocatg",newkeyword); defkeywords_stuff(zd,"ALL"); } add_keyword(newkeyword,addkeywords,batchkeywordsXcc); // add to keyword add list zdialog_stuff(zd_batchkeywords,"addkeywords",addkeywords); zdialog_stuff(zd,"newkeyword",""); // update dialog widgets zdialog_stuff(zd,"matchkeywords",""); zdialog_goto(zd,"newkeyword"); // put focus back on newkeyword widget return 1; } return 1; } /**************************************************************************************/ // Rename multiple keywords for selected image files or all files. // Keywords may also be deleted. // 26.0 namespace batchrenamekeywords { int Nkeywords; // count, 1-100 ch *oldkeywords[100]; // keywords to rename ch *newkeywords[100]; // corresponding new name #define tpcc (keywordXcc+keywordXcc+10) zdialog *zd; } // menu function void m_batch_rename_keywords(GtkWidget *, ch *menu) { using namespace batchrenamekeywords; int batchrenamekeywords_defkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int batchrenamekeywords_keywordlist_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int batchrenamekeywords_dialog_event(zdialog *zd, ch *event); ch *file; int ii, jj, kk, ff, err, yn; int zstat, Nfiles, Nlist; GtkWidget *widget; ch **filelist; ch *pp, *filekeyword; ch *oldkeywordlist[100], *newkeywordlist[100]; ch *tagname[1], *tagval[1]; xxrec_t *xxrec; zdialog *zdpop; F1_help_topic = TX("BATCH RENAME KEYWORDS"); printf("m_batch_rename_keywords \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("batch rename keywords")) return; Nkeywords = Nfiles = 0; filelist = 0; /*** ________________________________________________________________________________________ | Batch Rename Keywords | | | | old keyword name >> new keyword name | | Keyword [_______] Rename to [_________] [->] | unwanted keyword >> delete | 26.0 | | | | Keywords Category [________________________|v| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |____________________________________________| |_______________________________________| | | | [Proceed] [X] | |________________________________________________________________________________________| ***/ zd = zdialog_new(TX("Batch Rename Keywords"),Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"expand"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"expand"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"space=8|expand"); // keyword [_________________] rename to [___________________] [-->] zdialog_add_widget(zd,"hbox","hbkeywords","vb1",0,"space=3"); zdialog_add_widget(zd,"label","lab1","hbkeywords","Keyword","space=3"); zdialog_add_widget(zd,"frame","frot","hbkeywords"); zdialog_add_widget(zd,"label","oldkeyword","frot",TX("(click below)")); zdialog_add_widget(zd,"label","space","hbkeywords",0,"space=5"); zdialog_add_widget(zd,"label","lab2","hbkeywords",TX("Rename to"),"space=3"); zdialog_add_widget(zd,"zentry","newkeyword","hbkeywords",0,"expand"); zdialog_add_widget(zd,"label","space","hbkeywords",0,"space=3"); zdialog_add_widget(zd,"button","addkeywords","hbkeywords",">>"); zdialog_add_widget(zd,"hsep","hsep1","vb1",0,"space=5"); // Keywords Category [_____________________|v] zdialog_add_widget(zd,"hbox","hbdt","vb1",0); zdialog_add_widget(zd,"label","labdt","hbdt",TX("Keywords Category"),"space=3"); zdialog_add_widget(zd,"combo","defcats","hbdt",0,"expand|space=10|size=20"); zdialog_add_widget(zd,"scrwin","swdt","vb1",0,"expand"); zdialog_add_widget(zd,"text","defkeywords","swdt",0,"wrap"); // old keyword name >> new keyword name zdialog_add_widget(zd,"hbox","hblist","vb2"); zdialog_add_widget(zd,"label","lablist","hblist",TX("old keyword name >> new keyword name"),"space=10"); zdialog_add_widget(zd,"scrwin","swlist","vb2",0,"expand"); zdialog_add_widget(zd,"text","keywordlist","swlist"); load_defkeywords(0); // stuff defined keywords into dialog defkeywords_stuff(zd,"ALL"); defcats_stuff(zd); // and defined categories widget = zdialog_gtkwidget(zd,"defkeywords"); // connect mouse to defined keywords widget txwidget_set_eventfunc(widget,batchrenamekeywords_defkeywords_clickfunc); widget = zdialog_gtkwidget(zd,"keywordlist"); // connect mouse to keywordlist widget txwidget_set_eventfunc(widget,batchrenamekeywords_keywordlist_clickfunc); zdialog_resize(zd,700,400); // run dialog zdialog_run(zd,batchrenamekeywords_dialog_event,0); zstat = zdialog_wait(zd); // wait for dialog completion zdialog_free(zd); zd = 0; if (zstat != 1) goto cleanup; // canceled filelist = (ch **) zmalloc(Nxxrec * sizeof(ch *),"batch keywords"); // find all affected image files Nfiles = 0; zdpop = popup_report_open(TX("rename keywords"),Mwin,500,300,0,0,0,"X",null); // log report Fbusy(+1); for (ii = 0; ii < Nxxrec; ii++) // loop all index recs { zmainloop(); // keep GTK alive xxrec = xxrec_tab[ii]; if (! xxrec->keywords) continue; // search for keywords to rename ff = 0; for (jj = 1; ; jj++) { pp = (ch *) substring(xxrec->keywords,',',jj); if (! pp) break; for (kk = 0; kk < Nkeywords; kk++) { if (strmatchcase(pp,oldkeywords[kk])) { // this file has one or more keywords ff = 1; // that will be renamed break; } } if (ff) break; } if (ff) { filelist[Nfiles] = zstrdup(xxrec->file,"batch keywords"); // add to list of files to process Nfiles++; popup_report_write2(zdpop,0,TX("file included: %s \n"),xxrec->file); } } Fbusy(-1); yn = zmessageYN(Mwin,TX("%d keywords to rename \n" "in %d image files. \n" "Proceed?"),Nkeywords,Nfiles); if (! yn) goto cleanup; if (! Nkeywords) goto cleanup; Fbusy(+1); for (ii = 0; ii < Nfiles; ii++) // loop all files { zmainloop(); // keep GTK alive if (! zdialog_valid(zdpop)) break; // report canceled file = filelist[ii]; popup_report_write2(zdpop,0,"%s \n",file); // report file err = access(file,W_OK); // test file can be written by me if (err) { popup_report_write2(zdpop,1,TX("no write permission \n")); continue; } xxrec = get_xxrec(file); if (! xxrec) { popup_report_write2(zdpop,1,TX("not an indexed image file \n")); // 25.3 continue; } Nlist = 0; for (jj = 1; ; jj++) { // loop file keywords filekeyword = (ch *) substring(xxrec->keywords,',',jj); if (! filekeyword) break; for (kk = 0; kk < Nkeywords; kk++) { // loop keyword replacement list if (strmatchcase(filekeyword,oldkeywords[kk])) { // file keyword matches keyword to replace oldkeywordlist[Nlist] = oldkeywords[kk]; // save old and new keywords newkeywordlist[Nlist] = newkeywords[kk]; Nlist++; break; // next file keyword } } } strncpy0(edit_keywords,xxrec->keywords,filekeywordsXcc); // copy keywords for editing for (jj = 0; jj < Nlist; jj++) // remove old keywords err = del_keyword(oldkeywordlist[jj],edit_keywords); for (jj = 0; jj < Nlist; jj++) { // add new keywords - after removals if (! newkeywordlist[jj]) continue; // EOL if (strmatch(newkeywordlist[jj],"DELETE")) continue; // no replacement 26.0 popup_report_write2(zdpop,0,"%s \n",newkeywordlist[jj]); err = add_keyword(newkeywordlist[jj],edit_keywords,filekeywordsXcc); if (err && err != 1) popup_report_write2(zdpop,1,"ERROR \n"); // ignore already there, else report } tagname[0] = meta_keywords_tag; // update image file keywords tagval[0] = edit_keywords; err = meta_put(file,tagname,tagval,1); if (err) popup_report_write2(zdpop,1,TX("metadata update failed \n")); } Fbusy(-1); if (! zdialog_valid(zdpop)) printf("*** report canceled \n"); else popup_report_write2(zdpop,0,TX("\n*** COMPLETED \n")); popup_report_bottom(zdpop); load_defkeywords(1); // update keyword list cleanup: // free resources Fblock(0); for (ii = 0; ii < Nkeywords; ii++) { zfree(oldkeywords[ii]); zfree(newkeywords[ii]); } for (ii = 0; ii < Nfiles; ii++) zfree(filelist[ii]); if (filelist) zfree(filelist); return; } // a defined keyword was clicked int batchrenamekeywords_defkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) { using namespace batchrenamekeywords; ch *txkeyword, end; ch keywordname[keywordXcc]; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;:",end); // clicked word if (! txkeyword || end == ':') return 1; // nothing or keyword category, ignore snprintf(keywordname,keywordXcc," %s ",txkeyword); // add spaces for appearance zdialog_stuff(zd,"oldkeyword",keywordname); zdialog_stuff(zd,"newkeyword",""); zfree(txkeyword); return 1; } // a keyword list line was clicked - remove it int batchrenamekeywords_keywordlist_clickfunc(GtkWidget *widget, int line, int pos, ch *input) { using namespace batchrenamekeywords; int ii; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } if (line >= Nkeywords) return 1; for (ii = line; ii < Nkeywords-1; ii++) { // remove keywords pair corresponding oldkeywords[ii] = oldkeywords[ii+1]; // to the line clicked newkeywords[ii] = newkeywords[ii+1]; } Nkeywords--; widget = zdialog_gtkwidget(zd,"keywordlist"); // rewrite dialog keyword list txwidget_clear(widget); for (int ii = 0; ii < Nkeywords; ii++) txwidget_append2(widget,0,"%s >> %s\n",oldkeywords[ii],newkeywords[ii]); return 1; } // batch rename keywords dialog event function int batchrenamekeywords_dialog_event(zdialog *zd, ch *event) { using namespace batchrenamekeywords; int ii; ch catgname[keywordXcc]; ch oldkeyword[keywordXcc], newkeyword[keywordXcc]; GtkWidget *widget; if (zd->zstat) return 1; // dialog completed if (strmatch(event,"defcats")) { // new keyword category selection zdialog_fetch(zd,"defcats",catgname,keywordXcc); defkeywords_stuff(zd,catgname); } if (strmatch(event,"addkeywords")) { // [ --> ] button pressed zdialog_fetch(zd,"oldkeyword",oldkeyword,keywordXcc); // save new pair of keyword names zdialog_fetch(zd,"newkeyword",newkeyword,keywordXcc); strTrim2(oldkeyword); strTrim2(newkeyword); if (*oldkeyword <= ' ' || *newkeyword <= ' ') return 1; if (strmatch(newkeyword,"delete")) strcpy(newkeyword,"DELETE"); // allow "delete" or "DELETE" 26.0 if (Nkeywords == 100) { zmessageACK(Mwin,TX("max keywords exceeded")); return 1; } for (ii = 0; ii < Nkeywords; ii++) // check for duplicate 26.0 if (strmatchcase(oldkeyword,oldkeywords[ii])) break; if (ii < Nkeywords) { zmessageACK(Mwin,TX("remove duplicate")); return 1; } oldkeywords[Nkeywords] = zstrdup(oldkeyword,"batch keywords"); newkeywords[Nkeywords] = zstrdup(newkeyword,"batch keywords"); Nkeywords++; } widget = zdialog_gtkwidget(zd,"keywordlist"); // rewrite dialog keyword list txwidget_clear(widget); for (ii = 0; ii < Nkeywords; ii++) txwidget_append2(widget,0,"%s >> %s\n",oldkeywords[ii],newkeywords[ii]); return 1; } /**************************************************************************************/ // delete up to 100 keywords from all image files namespace batchpurgekeywords { int Nkeywords; // count, 1-100 ch *keywordlist[100]; // keywords to purge zdialog *zd; } // menu function void m_batch_purge_keywords(GtkWidget *, ch *menu) // 26.0 { using namespace batchpurgekeywords; int batchpurgekeywords_defkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int batchpurgekeywords_keywordlist_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int batchpurgekeywords_dialog_event(zdialog *zd, ch *event); ch *file; int ii, jj, kk, ff, err, yn; int zstat, Nfiles, Nlist; ch **filelist; ch *pp, *filekeyword; ch *tagname[1], *tagval[1]; GtkWidget *widget; xxrec_t *xxrec; zdialog *zdpop; F1_help_topic = TX("BATCH PURGE KEYWORDS"); printf("m_batch_purge_keywords \n"); if (Xindexlev < 1) { index_rebuild(1,0); if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("batch purge keywords")) return; Nkeywords = Nfiles = 0; filelist = 0; /*** _______________________________________________________________________ | Batch Purge Keywords | | | | keyword name 1 | | Keywords Category [________________________|v| | keyword name 2 | | | | | ... | | | | | | | | | | | | | | | | | | | | | | | | | | | |____________________________________________| |______________________| | | | [Proceed] [X] | |_______________________________________________________________________| ***/ zd = zdialog_new(TX("Batch Purge Keywords"),Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"expand"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"expand"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"space=8|expand"); // Keywords Category [_____________________|v] zdialog_add_widget(zd,"hbox","hbdt","vb1",0); zdialog_add_widget(zd,"label","labdt","hbdt",TX("Keywords Category"),"space=3"); zdialog_add_widget(zd,"combo","defcats","hbdt",0,"expand|space=10|size=20"); zdialog_add_widget(zd,"scrwin","swdt","vb1",0,"expand"); zdialog_add_widget(zd,"text","defkeywords","swdt",0,"wrap"); // keyword list to purge zdialog_add_widget(zd,"hbox","hblist","vb2"); zdialog_add_widget(zd,"scrwin","swlist","vb2",0,"expand"); zdialog_add_widget(zd,"text","keywordlist","swlist"); load_defkeywords(0); // stuff defined keywords into dialog defkeywords_stuff(zd,"ALL"); defcats_stuff(zd); // and defined categories widget = zdialog_gtkwidget(zd,"defkeywords"); // connect mouse to defined keywords widget txwidget_set_eventfunc(widget,batchpurgekeywords_defkeywords_clickfunc); widget = zdialog_gtkwidget(zd,"keywordlist"); // connect mouse to keywordlist widget txwidget_set_eventfunc(widget,batchpurgekeywords_keywordlist_clickfunc); zdialog_resize(zd,700,400); // run dialog zdialog_run(zd,batchpurgekeywords_dialog_event,0); zstat = zdialog_wait(zd); // wait for dialog completion zdialog_free(zd); zd = 0; if (zstat != 1) goto cleanup; // canceled filelist = (ch **) zmalloc(Nxxrec * sizeof(ch *),"batch keywords"); // find all affected image files Nfiles = 0; zdpop = popup_report_open("batch purge keywords",Mwin,500,300,0,0,0,"X",null); // log report Fbusy(+1); for (ii = 0; ii < Nxxrec; ii++) // loop all index recs { zmainloop(); // keep GTK alive xxrec = xxrec_tab[ii]; if (! xxrec->keywords) continue; // search for keywords to purge ff = 0; for (jj = 1; ; jj++) { pp = (ch *) substring(xxrec->keywords,',',jj); if (! pp) break; for (kk = 0; kk < Nkeywords; kk++) { if (strmatchcase(pp,keywordlist[kk])) { // this file has one or more keywords ff = 1; // that will be purged break; } } if (ff) break; } if (ff) { filelist[Nfiles] = zstrdup(xxrec->file,"batch keywords"); // add to list of files to process Nfiles++; popup_report_write2(zdpop,0,TX("file included: %s \n"),xxrec->file); } } Fbusy(-1); yn = zmessageYN(Mwin,TX("%d keywords to purge \n" "in %d image files. \n" "Proceed?"),Nkeywords,Nfiles); if (! yn) goto cleanup; if (! Nkeywords) goto cleanup; Fbusy(+1); for (ii = 0; ii < Nfiles; ii++) // loop all files { zmainloop(); // keep GTK alive if (! zdialog_valid(zdpop)) break; // report canceled file = filelist[ii]; popup_report_write2(zdpop,0,"%s \n",file); // report file err = access(file,W_OK); // test file can be written by me if (err) { popup_report_write2(zdpop,1,TX("no write permission \n")); continue; } xxrec = get_xxrec(file); if (! xxrec) { popup_report_write2(zdpop,1,TX("not an indexed image file \n")); // 26.0 continue; } Nlist = 0; for (jj = 1; ; jj++) { // loop file keywords filekeyword = (ch *) substring(xxrec->keywords,',',jj); if (! filekeyword) break; for (kk = 0; kk < Nkeywords; kk++) { // loop keyword replacement list if (strmatchcase(filekeyword,keywordlist[kk])) { // file keyword matches keyword to replace Nlist++; break; // next file keyword } } } strncpy0(edit_keywords,xxrec->keywords,filekeywordsXcc); // copy keywords for editing for (jj = 0; jj < Nlist; jj++) // remove keywords err = del_keyword(keywordlist[jj],edit_keywords); tagname[0] = meta_keywords_tag; // update image file keywords tagval[0] = edit_keywords; err = meta_put(file,tagname,tagval,1); // also updates xxrec_tab[] if (err) popup_report_write2(zdpop,1,TX("metadata update failed \n")); } Fbusy(-1); if (! zdialog_valid(zdpop)) printf("*** report canceled \n"); else popup_report_write2(zdpop,0,TX("\n*** COMPLETED \n")); popup_report_bottom(zdpop); load_defkeywords(1); // update keyword list cleanup: // free resources Fblock(0); for (ii = 0; ii < Nkeywords; ii++) zfree(keywordlist[ii]); for (ii = 0; ii < Nfiles; ii++) zfree(filelist[ii]); if (filelist) zfree(filelist); return; } // a defined keyword was clicked int batchpurgekeywords_defkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) { using namespace batchpurgekeywords; int ii; ch *txkeyword, end; ch keywordname[keywordXcc]; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;:",end); // clicked word if (! txkeyword || end == ':') return 1; // nothing or keyword category, ignore strncpy0(keywordname,txkeyword,keywordXcc); if (Nkeywords == 100) { zmessageACK(Mwin,TX("max keywords exceeded")); return 1; } for (ii = 0; ii < Nkeywords; ii++) // check for duplicate if (strmatchcase(keywordname,keywordlist[ii])) break; if (ii < Nkeywords) { zmessageACK(Mwin,TX("duplicate keyword")); return 1; } keywordlist[Nkeywords] = zstrdup(keywordname,"batch_keywords"); Nkeywords++; widget = zdialog_gtkwidget(zd,"keywordlist"); // rewrite dialog keyword list txwidget_clear(widget); for (ii = 0; ii < Nkeywords; ii++) txwidget_append2(widget,0,"%s \n",keywordlist[ii]); zfree(txkeyword); return 1; } // a keyword list line was clicked - remove it int batchpurgekeywords_keywordlist_clickfunc(GtkWidget *widget, int line, int pos, ch *input) { using namespace batchpurgekeywords; int ii; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } if (line >= Nkeywords) return 1; for (ii = line; ii < Nkeywords-1; ii++) { // remove keyword corresponding keywordlist[ii] = keywordlist[ii+1]; // to the line clicked } Nkeywords--; widget = zdialog_gtkwidget(zd,"keywordlist"); // rewrite dialog keyword list txwidget_clear(widget); for (int ii = 0; ii < Nkeywords; ii++) txwidget_append2(widget,0,"%s \n",keywordlist[ii]); return 1; } // batch purge keywords dialog event function int batchpurgekeywords_dialog_event(zdialog *zd, ch *event) { using namespace batchpurgekeywords; ch catgname[keywordXcc]; if (zd->zstat) return 1; // dialog completed if (strmatch(event,"defcats")) { // new keyword category selection zdialog_fetch(zd,"defcats",catgname,keywordXcc); defkeywords_stuff(zd,catgname); } return 1; } /**************************************************************************************/ // batch change or shift photo date/time void m_batch_photo_date_time(GtkWidget *, ch *menu) { int batch_photo_time_dialog_event(zdialog *zd, ch *event); ch *tagname[1] = { meta_pdate_tag }; ch *tagval[1]; ch text[100]; ch *file, olddatetime[24], newdatetime[24]; // metadata format "yyyy:mm:dd hh:mm:ss" int ii, nn, cc, err, zstat; int Fyearonly, Fdateonly; int Fsetnew, Fshift, Ftest; // check boxes time_t timep; struct tm DTold, DTnew; // old and new date/time int s_years, s_mons, s_mdays, s_hours, s_mins, s_secs; // shift amounts zdialog *zd, *zdpop; F1_help_topic = TX("BATCH PHOTO DATE"); printf("m_batch_photo_date_time \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("batch photo date")) return; /*** __________________________________________________ | Batch Photo Date/Time | | | | [Select Files] NN files selected | | | | [x] set a new date/time: [_____________________] | | (yyyy:mm:dd hh:mm:ss) | | | | [x] shift existing date/time (+/-): | | years [__] months [__] days [__] | | hours [__] minutes [__] seconds [__] | | | | [x] test: show changes, do not update files | | | | [Proceed] [X] | |__________________________________________________| ***/ zd = zdialog_new(TX("Batch Photo Date/Time"),Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbfiles","dialog",0,"space=3"); zdialog_add_widget(zd,"button","files","hbfiles",TX("Select Files"),"space=5"); zdialog_add_widget(zd,"label","labcount","hbfiles",TX("no files selected"),"space=10"); zdialog_add_widget(zd,"hsep","sep1","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbsetnew","dialog",0,"space=3"); zdialog_add_widget(zd,"check","Fsetnew","hbsetnew",TX("set a new date/time:"),"space=3"); zdialog_add_widget(zd,"zentry","newdatetime","hbsetnew",0,"expand|size=15"); zdialog_add_widget(zd,"hbox","hbsetnew2","dialog"); zdialog_add_widget(zd,"label","labspace","hbsetnew2","","expand"); zdialog_add_widget(zd,"label","labtemplate","hbsetnew2","yyyy:mm:dd hh:mm[:ss]","space=5"); zdialog_add_widget(zd,"hsep","sep1","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbshift1","dialog",0,"space=3"); zdialog_add_widget(zd,"check","Fshift","hbshift1",TX("shift existing date/time (+/–):"),"space=3"); zdialog_add_widget(zd,"hbox","hbshift2","dialog"); zdialog_add_widget(zd,"label","space","hbshift2",0,"space=10"); zdialog_add_widget(zd,"label","labyears","hbshift2",TX("years"),"space=5"); zdialog_add_widget(zd,"zspin","s_years","hbshift2","-99|+99|1|0"); zdialog_add_widget(zd,"label","space","hbshift2",0,"space=5"); zdialog_add_widget(zd,"label","labmons","hbshift2",TX("months"),"space=5"); zdialog_add_widget(zd,"zspin","s_mons","hbshift2","-11|+11|1|0"); zdialog_add_widget(zd,"label","space","hbshift2",0,"space=5"); zdialog_add_widget(zd,"label","labmdays","hbshift2",TX("days"),"space=5"); zdialog_add_widget(zd,"zspin","s_mdays","hbshift2","-30|+30|1|0"); zdialog_add_widget(zd,"hbox","hbshift3","dialog"); zdialog_add_widget(zd,"label","space","hbshift3",0,"space=10"); zdialog_add_widget(zd,"label","labhours","hbshift3",TX("hours"),"space=5"); zdialog_add_widget(zd,"zspin","s_hours","hbshift3","-23|+23|1|0"); zdialog_add_widget(zd,"label","space","hbshift3",0,"space=5"); zdialog_add_widget(zd,"label","labmins","hbshift3",TX("minutes"),"space=5"); zdialog_add_widget(zd,"zspin","s_mins","hbshift3","-59|+59|1|0"); zdialog_add_widget(zd,"label","space","hbshift3",0,"space=5"); zdialog_add_widget(zd,"label","labsecs","hbshift3",TX("seconds"),"space=5"); zdialog_add_widget(zd,"zspin","s_secs","hbshift3","-59|+59|1|0"); zdialog_add_widget(zd,"hsep","sep1","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbtest","dialog",0,"space=5"); zdialog_add_widget(zd,"check","Ftest","hbtest",TX("test: show changes, do not update files"),"space=3"); zdialog_load_inputs(zd); snprintf(text,100,TX("%d image files selected"),SFcount); // show selected files count zdialog_stuff(zd,"labcount",text); zstat = zdialog_run(zd,batch_photo_time_dialog_event,"parent"); retry: zstat = zdialog_wait(zd); // wait for dialog, get status if (zstat != 1) { // not [proceed] zdialog_free(zd); // cancel Fblock(0); return; } zd->zstat = 0; // keep dialog active zdialog_fetch(zd,"Fsetnew",Fsetnew); // checkboxes zdialog_fetch(zd,"Fshift",Fshift); zdialog_fetch(zd,"Ftest",Ftest); if (Fsetnew + Fshift != 1) { zmessageACK(Mwin,TX("please make a choice")); goto retry; } if (SFcount == 0) { zmessageACK(Mwin,TX("no files selected")); goto retry; } Fyearonly = Fdateonly = 0; if (Fsetnew) // input is new date/time { zdialog_fetch(zd,"newdatetime",newdatetime,24); strTrim2(newdatetime); // strip leading and trailing blanks cc = strlen(newdatetime); if (cc == 4) { // have only "yyyy" strcat(newdatetime,":01:01 00:00:00"); // append ":01:01 00:00:00" Fyearonly = 1; cc = 19; } if (cc == 10) { // have only "yyyy:mm:dd" strcat(newdatetime," 00:00:00"); // append " 00:00:00" Fdateonly = 1; // flag, change date only cc = 19; } if (cc == 16) { // have only "yyyy:mm:dd hh:mm" strcat(newdatetime,":00"); // append ":00" cc = 19; } if (cc != 19) { // must have yyyy:mm:dd hh:mm:ss zmessageACK(Mwin,TX("invalid date/time format")); goto retry; } nn = sscanf(newdatetime,"%d:%d:%d %d:%d:%d", // yyyy:mm:dd hh:mm:ss >> DTnew &DTnew.tm_year, &DTnew.tm_mon, &DTnew.tm_mday, &DTnew.tm_hour, &DTnew.tm_min, &DTnew.tm_sec); if (nn != 6) { // check input format zmessageACK(Mwin,TX("invalid date/time format")); goto retry; } DTnew.tm_year -= 1900; // deal with stupid offsets 25.1 DTnew.tm_mon -= 1; timep = mktime(&DTnew); // DTnew >> timep DTnew.tm_year += 1900; DTnew.tm_mon += 1; DTnew.tm_hour += DTnew.tm_gmtoff/3600; // poorly understood kludge 25.1 if (timep < 0) { // validate DTnew by validating timep zmessageACK(Mwin,TX("invalid date/time format")); goto retry; } } // DTnew is final value to use zdpop = popup_report_open(TX("Photo Date/Time"),Mwin,500,200,0,0,0,"X",null); // log report if (Fshift) { zdialog_fetch(zd,"s_years",s_years); // inputs are shifted date/time values zdialog_fetch(zd,"s_mons",s_mons); zdialog_fetch(zd,"s_mdays",s_mdays); zdialog_fetch(zd,"s_hours",s_hours); zdialog_fetch(zd,"s_mins",s_mins); zdialog_fetch(zd,"s_secs",s_secs); popup_report_write2(zdpop,0,"changes: year mon day hours mins secs \n"); popup_report_write2(zdpop,0," %4d %3d %3d %5d %4d %4d \n", s_years,s_mons,s_mdays,s_hours,s_mins,s_secs); } zdialog_free(zd); Fbusy(+1); for (ii = 0; ii < SFcount; ii++) // loop all selected files { zmainloop(); // keep GTK alive if (! zdialog_valid(zdpop)) break; // report canceled file = SelFiles[ii]; err = f_open(file,0,0,0); // open image file if (err) continue; popup_report_write2(zdpop,0,"\n"); // report progress popup_report_write2(zdpop,0,"%s \n",file); err = access(file,W_OK); // test file can be written by me if (err) { popup_report_write2(zdpop,0,"%s",TX("no write permission \n")); continue; } meta_get(curr_file,tagname,tagval,1); // metadata >> yyyy:mm:dd hh:mm:ss if (! tagval[0] && Fshift) { // ignore if Fsetnew popup_report_write2(zdpop,0,TX("*** no date/time available \n")); continue; } if (tagval[0]) { strcpy(olddatetime,"0000:01:01 00:00:00"); // append for missing time 25.1 cc = strlen(tagval[0]); if (cc > 19) cc = 19; strncpy(olddatetime,tagval[0],cc); zfree(tagval[0]); } else strcpy(olddatetime,"0000:01:01 00:00:00"); // missing old date/time nn = sscanf(olddatetime,"%d:%d:%d %d:%d:%d", // yyyy:mm:dd hh:mm:ss >> DTnew &DTold.tm_year, &DTold.tm_mon, &DTold.tm_mday, &DTold.tm_hour, &DTold.tm_min, &DTold.tm_sec); if (nn < 6) DTold.tm_sec = 0; // fix truncated date-time if (nn < 5) DTold.tm_min = 0; if (nn < 4) DTold.tm_hour = 0; if (nn < 3) DTold.tm_mday = 1; if (nn < 2) DTold.tm_mon = 0; if (nn < 1) DTold.tm_year = 0; if (nn < 3 && Fshift) { // require at least yyyy:mm:dd popup_report_write2(zdpop,0,TX("*** file date/time invalid \n")); continue; } if (Fsetnew) // set new date/time { if (Fyearonly) // change year only, leave rest { DTnew.tm_mon = DTold.tm_mon; // >> revised DTnew DTnew.tm_mday = DTold.tm_mday; // set month/day/hour/min/sec only DTnew.tm_hour = DTold.tm_hour; // year remains fixed DTnew.tm_min = DTold.tm_min; DTnew.tm_sec = DTold.tm_sec; } if (Fdateonly) // change year/mon/day only, leave time { DTnew.tm_hour = DTold.tm_hour; // >> revised DTnew DTnew.tm_min = DTold.tm_min; // set hour/min/sec only DTnew.tm_sec = DTold.tm_sec; // year/mon/day remains fixed } } if (Fshift) // shift existing date/time values { DTnew.tm_year = DTold.tm_year + s_years; DTnew.tm_mon = DTold.tm_mon + s_mons; DTnew.tm_mday = DTold.tm_mday + s_mdays; DTnew.tm_hour = DTold.tm_hour + s_hours; DTnew.tm_min = DTold.tm_min + s_mins; DTnew.tm_sec = DTold.tm_sec + s_secs; } DTnew.tm_year -= 1900; // deal with stupid offsets 25.1 DTnew.tm_mon -= 1; timep = mktime(&DTnew); // convert to local time if (timep < 0) { popup_report_write2(zdpop,0,TX("%s *** date/time conversion failed \n"),olddatetime); continue; } DTnew = *localtime(&timep); // convert back to date and time DTnew.tm_year += 1900; // deal with stupid offsets 25.1 DTnew.tm_mon += 1; snprintf(newdatetime,20,"%04d:%02d:%02d %02d:%02d:%02d", // DTnew >> yyyy:mm:dd hh:mm:ss DTnew.tm_year, DTnew.tm_mon, DTnew.tm_mday, DTnew.tm_hour, DTnew.tm_min, DTnew.tm_sec); olddatetime[4] = olddatetime[7] = newdatetime[4] = newdatetime[7] = ':'; // format: yyyy:mm:dd popup_report_write2(zdpop,0," %s %s \n",olddatetime,newdatetime); if (Ftest) continue; // test only, no file updates newdatetime[4] = newdatetime[7] = ':'; // format: yyyy:mm:dd for metadata tagval[0] = (ch *) &newdatetime; err = meta_put(curr_file,(ch **) tagname,tagval,1); // yyyy:mm:dd hh:mm:ss >> metadata if (err) { popup_report_write2(zdpop,0,TX("*** metadata update error \n")); continue; } } Fbusy(-1); if (! zdialog_valid(zdpop)) printf("*** report canceled \n"); else popup_report_write2(zdpop,0,TX("\n*** COMPLETED \n")); popup_report_bottom(zdpop); Fblock(0); return; } // dialog event and completion callback function int batch_photo_time_dialog_event(zdialog *zd, ch *event) { ch countmess[80]; if (strmatch(event,"files")) // select images to process { zdialog_show(zd,0); // hide parent dialog select_files(0); // get new file list zdialog_show(zd,1); snprintf(countmess,80,TX("%d image files selected"),SFcount); zdialog_stuff(zd,"labcount",countmess); } if (zstrstr("Fsetnew Fshift",event)) { zdialog_stuff(zd,"Fsetnew",0); zdialog_stuff(zd,"Fshift",0); zdialog_stuff(zd,event,1); } return 1; } /**************************************************************************************/ // batch add or change any meta metadata namespace batchchangemeta { zdialog *zd; } // menu function void m_batch_change_meta(GtkWidget *, ch *menu) { using namespace batchchangemeta; int batch_change_meta_dialog_event(zdialog *zd, ch *event); int batch_change_meta_clickfunc(GtkWidget *, int line, int pos, ch *input); int ii, jj, yn, err, zstat, ntags; ch tagnameN[10] = "tagnameN", tagvalN[10] = "tagvalN"; ch *tagname[10], *tagval[10]; ch *file, text[metadataXcc]; GtkWidget *mtext; static int nx, ftf = 1; static ch **taglist; zdialog *zdpop; F1_help_topic = TX("BATCH CHANGE META"); printf("m_batch_change_meta \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("batch change meta")) return; if (ftf) { ftf = 0; nx = zreadfile(meta_picklist_file,taglist); // get list of metadata tags } /** _________________________________________________________________ | Click to Select | Batch Add/Change Metadata | | | | | (metadata list) | [Select Files] NN files selected | | | | | | tag name tag value | | | [______________] [_____________________] | | | [______________] [_____________________] | | | [______________] [_____________________] | | | [______________] [_____________________] | | | [______________] [_____________________] | | | [______________] [_____________________] | | | [______________] [_____________________] | | | [______________] [_____________________] | | | [______________] [_____________________] | | | | | | [Full List] [Apply] [X] | |____________________|____________________________________________| **/ zd = zdialog_new(TX("Batch Add/Change Metadata"),Mwin,TX("Full List"),TX("Apply"),"X",null); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"expand"); zdialog_add_widget(zd,"vbox","vb1","hb1"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"expand|space=5"); zdialog_add_widget(zd,"label","lab1","vb1",TX("click to select"),"size=30|space=3"); zdialog_add_widget(zd,"scrwin","scr1","vb1",0,"expand"); zdialog_add_widget(zd,"text","mtext","scr1"); zdialog_add_widget(zd,"hbox","hbfiles","vb2",0,"space=3"); zdialog_add_widget(zd,"button","files","hbfiles",TX("Select Files"),"space=5"); zdialog_add_widget(zd,"label","labcount","hbfiles",TX("no files selected"),"space=10"); zdialog_add_widget(zd,"hbox","hbtags","vb2",0,"space=5"); zdialog_add_widget(zd,"vbox","vbname","hbtags"); zdialog_add_widget(zd,"vbox","vbval","hbtags",0,"expand"); zdialog_add_widget(zd,"label","labtag","vbname",TX("tag name")); zdialog_add_widget(zd,"label","labdata","vbval",TX("tag value")); zdialog_add_widget(zd,"zentry","tagname0","vbname",0,"size=20"); zdialog_add_widget(zd,"zentry","tagname1","vbname",0,"size=20"); zdialog_add_widget(zd,"zentry","tagname2","vbname",0,"size=20"); zdialog_add_widget(zd,"zentry","tagname3","vbname",0,"size=20"); zdialog_add_widget(zd,"zentry","tagname4","vbname",0,"size=20"); zdialog_add_widget(zd,"zentry","tagname5","vbname",0,"size=20"); zdialog_add_widget(zd,"zentry","tagname6","vbname",0,"size=20"); zdialog_add_widget(zd,"zentry","tagname7","vbname",0,"size=20"); zdialog_add_widget(zd,"zentry","tagname8","vbname",0,"size=20"); zdialog_add_widget(zd,"zentry","tagname9","vbname",0,"size=20"); zdialog_add_widget(zd,"zentry","tagval0","vbval",0,"size=20|expand"); zdialog_add_widget(zd,"zentry","tagval1","vbval",0,"size=20|expand"); zdialog_add_widget(zd,"zentry","tagval2","vbval",0,"size=20|expand"); zdialog_add_widget(zd,"zentry","tagval3","vbval",0,"size=20|expand"); zdialog_add_widget(zd,"zentry","tagval4","vbval",0,"size=20|expand"); zdialog_add_widget(zd,"zentry","tagval5","vbval",0,"size=20|expand"); zdialog_add_widget(zd,"zentry","tagval6","vbval",0,"size=20|expand"); zdialog_add_widget(zd,"zentry","tagval7","vbval",0,"size=20|expand"); zdialog_add_widget(zd,"zentry","tagval8","vbval",0,"size=20|expand"); zdialog_add_widget(zd,"zentry","tagval9","vbval",0,"size=20|expand"); snprintf(text,100,TX("%d image files selected"),SFcount); // show selected files count zdialog_stuff(zd,"labcount",text); mtext = zdialog_gtkwidget(zd,"mtext"); // make clickable metadata list txwidget_clear(mtext); for (ii = 0; ii < nx; ii++) // stuff metadata pick list txwidget_append(mtext,0,"%s \n",taglist[ii]); txwidget_set_eventfunc(mtext,batch_change_meta_clickfunc); // set mouse/KB event function ntags = 0; // nothing selected zstat = zdialog_run(zd,batch_change_meta_dialog_event,0); // run dialog retry: zstat = zdialog_wait(zd); // wait for completion if (zstat != 2) { zdialog_free(zd); Fblock(0); return; } for (ii = jj = 0; ii < 10; ii++) { tagnameN[7] = '0' + ii; // get metadata list from dialog tagvalN[6] = '0' + ii; zdialog_fetch(zd,tagnameN,text,metatagXcc); // tag name strCompress(text); // remove blanks if (*text <= ' ') continue; tagname[jj] = zstrdup(text,"batch-metadata"); zdialog_fetch(zd,tagvalN,text,metadataXcc); // tag data, may be "" tagval[jj] = zstrdup(text,"batch-metadata"); jj++; } ntags = jj; if (ntags == 0) { zmessageACK(Mwin,TX("enter tag names")); zd->zstat = 0; goto retry; } if (SFcount == 0) { zmessageACK(Mwin,TX("no files selected")); zd->zstat = 0; goto retry; } zdpop = popup_report_open(TX("Batch Metadata"),Mwin,500,200,0,0,0,"OK",null); // log report for (ii = 0; ii < ntags; ii++) popup_report_write2(zdpop,0,"tag %s = %s \n",tagname[ii],tagval[ii]); yn = zmessageYN(Mwin,TX("Proceed?")); // 25.0 if (yn != 1) { zd->zstat = 0; // cancel popup_report_close(zdpop,0); goto retry; } zdialog_free(zd); zd = 0; Fbusy(+1); for (ii = 0; ii < SFcount; ii++) // loop all selected files { zmainloop(); // keep GTK alive if (! zdialog_valid(zdpop)) break; // report canceled file = SelFiles[ii]; // display image popup_report_write2(zdpop,0,"%s \n",file); // report progress err = access(file,W_OK); // test file can be written by me if (err) { popup_report_write2(zdpop,1,TX("no write permission \n")); continue; } err = meta_put(file,tagname,tagval,ntags); if (err) { popup_report_write2(zdpop,1,TX("metadata update error \n")); continue; } if (zd_metaview) meta_view(0); // update metadata view if active } Fbusy(-1); if (! zdialog_valid(zdpop)) popup_report_write2(zdpop,1,TX("\n*** CANCELED \n")); else popup_report_write2(zdpop,1,TX("\n*** COMPLETED \n")); popup_report_bottom(zdpop); for (ii = 0; ii < ntags; ii++) { // free memory zfree(tagname[ii]); zfree(tagval[ii]); } Fblock(0); return; } // dialog event and completion callback function int batch_change_meta_dialog_event(zdialog *zd, ch *event) { using namespace batchchangemeta; ch countmess[80]; if (zd->zstat == 1) // full list { zd->zstat = 0; // keep dialog active zmessageACK(Mwin,"The command: $ man Image::ExifTool::TagNames \n" "will show over 15000 \"standard\" tag names"); return 1; } if (strmatch(event,"files")) // select images to process { zdialog_show(zd,0); // hide parent dialog select_files(0); // get image file list zdialog_show(zd,1); snprintf(countmess,80,TX("%d image files selected"),SFcount); zdialog_stuff(zd,"labcount",countmess); } return 1; } // get clicked tag name from short list and insert into dialog int batch_change_meta_clickfunc(GtkWidget *widget, int line, int pos, ch *input) { using namespace batchchangemeta; int ii; ch *pp; ch tagnameX[9] = "tagnameX"; ch tagname[metatagXcc]; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } pp = txwidget_line(widget,line,1); // get clicked line, highlight if (! pp || ! *pp) return 1; txwidget_highlight_line(widget,line); for (ii = 0; ii < 10; ii++) { // find 1st empty dialog tag name tagnameX[7] = '0' + ii; zdialog_fetch(zd,tagnameX,tagname,metatagXcc); if (*tagname <= ' ') break; } if (ii < 10) zdialog_stuff(zd,tagnameX,pp); return 1; } /**************************************************************************************/ // batch report metadata for selected image files // menu function void m_batch_report_meta(GtkWidget *, ch *menu) { int batch_report_meta_dialog_event(zdialog *zd, ch *event); zdialog *zd, *zdpop; ch *file, text[100]; int zstat, ff, ii, err; int brm, brmx = 20; ch **taglist, *tagname2[brmx], *tagval2[brmx]; F1_help_topic = TX("BATCH REPORT META"); printf("m_batch_report_meta \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("batch report meta")) return; /*** ____________________________________________ | Batch Report Metadata | | | | [Select Files] NN files selected | | [Edit] metadata tags to report | | | | [Proceed] [X] | |____________________________________________| ***/ zd = zdialog_new(TX("Batch Report Metadata"),Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbfiles","dialog",0,"space=3"); zdialog_add_widget(zd,"button","files","hbfiles",TX("Select Files"),"space=5"); zdialog_add_widget(zd,"label","labcount","hbfiles",TX("no files selected"),"space=10"); zdialog_add_widget(zd,"hbox","hbedit","dialog",0,"space=3"); zdialog_add_widget(zd,"button","edit","hbedit",TX("Edit"),"space=5"); zdialog_add_widget(zd,"label","labedit","hbedit",TX("metadata tags to report"),"space=10"); snprintf(text,100,TX("%d image files selected"),SFcount); // show selected files count zdialog_stuff(zd,"labcount",text); zstat = zdialog_run(zd,batch_report_meta_dialog_event,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for completion zdialog_free(zd); if (zstat != 1) { // cancel Fblock(0); return; } if (SFcount == 0) { zmessageACK(Mwin,TX("no files selected")); Fblock(0); return; } brm = zreadfile(meta_report_tags_file,taglist); if (brm > brmx) brm = brmx; for (ii = 0; ii < brm; ii++) tagname2[ii] = taglist[ii]; if (taglist) zfree(taglist); if (! brm) { zmessageACK(Mwin,TX("no metadata tags to report")); return; } zdpop = popup_report_open("metadata",Mwin,600,400,0,0,0,"Save","X",null); // log report Fbusy(+1); for (ff = 0; ff < SFcount; ff++) // loop selected files { zmainloop(); // keep GTK alive if (! zdialog_valid(zdpop)) break; // report canceled popup_report_write2(zdpop,0,"\n"); // blank line separator file = SelFiles[ff]; popup_report_write2(zdpop,0,"%s \n",file); if (image_file_type(file) != IMAGE) { // file deleted? popup_report_write2(zdpop,1,TX("*** invalid file \n")); continue; } err = meta_get(file,tagname2,tagval2,brm); // get all report tags if (err) continue; for (ii = 0; ii < brm; ii++) // output tag names and values if (tagval2[ii]) popup_report_write2(zdpop,0,"%-24s : %s \n",tagname2[ii],tagval2[ii]); for (ii = 0; ii < brm; ii++) // free memory if (tagval2[ii]) zfree(tagval2[ii]); } Fbusy(-1); if (! zdialog_valid(zdpop)) printf("*** report canceled \n"); else popup_report_write2(zdpop,1,TX("\n*** COMPLETED \n")); Fblock(0); return; } // dialog event and completion function int batch_report_meta_dialog_event(zdialog *zd, ch *event) { ch countmess[80]; zlist_t *mlist; int nn; if (zd->zstat) zdialog_destroy(zd); if (strmatch(event,"files")) // select images to process { zdialog_show(zd,0); // hide parent dialog select_files(0); // get new list zdialog_show(zd,1); snprintf(countmess,80,TX("%d image files selected"),SFcount); zdialog_stuff(zd,"labcount",countmess); } if (strmatch(event,"edit")) // select metadata tags to report { mlist = zlist_from_file(meta_report_tags_file); // load metadata report list if (! mlist) mlist = zlist_new(0); nn = select_meta_tags(mlist,maxbatchtags,0); // user edit of metadata list if (nn) zlist_to_file(mlist,meta_report_tags_file); // replace file zlist_free(mlist); } return 1; } /**************************************************************************************/ // batch geotags - set geotags for multiple image files void m_batch_geotags(GtkWidget *, ch *menu) { int batch_geotags_dialog_event(zdialog *zd, ch *event); int ii, nn, err, zstat; ch *file; ch location[40], country[40]; ch gps_data[24], text[100]; zdialog *zd, *zdpop; ch *tagname[3] = { meta_city_tag, meta_country_tag, meta_gps_tag }; ch *tagval[3]; ch *labrep = TX("Location and country will replace current values.\n" "GPS data is replaced only if new value is present."); F1_help_topic = TX("BATCH GEOTAGS"); printf("m_batch_geotags \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("batch geotags")) return; load_imagelocs(); // initialize image geolocs[] data /*** _____________________________________________________ | Batch Set Geotags | | | | [select files] NN files selected | | location [______________] country [______________] | | GPS data [_____________________] | | Location and country will replace current values. | // 26.5 | GPS data is replaced only if new value is present. | | | | [Find] [Clear] [Proceed] [X] | |_____________________________________________________| ***/ zd = zdialog_new(TX("Batch Set Geotags"),Mwin,TX("Find"),TX("Clear"),TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"button","files","hb1",TX("Select Files"),"space=10"); zdialog_add_widget(zd,"label","labcount","hb1",TX("no files selected"),"space=10"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labloc","hb2","location","space=5"); zdialog_add_widget(zd,"zentry","location","hb2",0,"expand"); zdialog_add_widget(zd,"label","space","hb2",0,"space=5"); zdialog_add_widget(zd,"label","labcountry","hb2","country","space=5"); zdialog_add_widget(zd,"zentry","country","hb2",0,"expand"); zdialog_add_widget(zd,"hbox","hb3","dialog"); zdialog_add_widget(zd,"label","labgps","hb3","GPS data","space=3"); zdialog_add_widget(zd,"zentry","gps_data","hb3",0,"size=30"); zdialog_add_widget(zd,"label","labrep","dialog",labrep,"space = 5"); zdialog_add_ttip(zd,"Find",TX("search known locations")); zdialog_add_ttip(zd,"Lookup",TX("find via table lookup")); zdialog_add_ttip(zd,"Clear",TX("clear inputs")); snprintf(text,100,TX("%d image files selected"),SFcount); // show selected files count zdialog_stuff(zd,"labcount",text); zd_mapgeotags = zd; // activate map clicks zdialog_run(zd,batch_geotags_dialog_event,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for dialog completion if (zstat != 4) goto cleanup; // status not [proceed] if (! SFcount) goto cleanup; // no files selected put_imagelocs(zd); // update geolocs table zdialog_fetch(zd,"location",location,40); // get location from dialog zdialog_fetch(zd,"country",country,40); zdialog_fetch(zd,"gps_data",gps_data,24); zdialog_free(zd); // kill dialog zd = zd_mapgeotags = 0; if (SFcount == 0) goto cleanup; zdpop = popup_report_open("Add Geotags",Mwin,500,200,0,0,0,"X",null); // log report Fbusy(+1); for (ii = 0; ii < SFcount; ii++) // loop all selected files { zmainloop(); // keep GTK alive if (! zdialog_valid(zdpop)) break; // report canceled file = SelFiles[ii]; // display image err = f_open(file,0,0,0); if (err) continue; err = access(file,W_OK); // test file can be written by me if (err) { popup_report_write2(zdpop,1,TX("%s: no write permission"),file); continue; } tagval[0] = location; tagval[1] = country; tagval[2] = gps_data; nn = 2; if (*gps_data) nn = 3; // replace GPS only if value present 26.5 err = meta_put(file,tagname,tagval,nn); if (err) { popup_report_write2(zdpop,1,TX("%s: metadata update failed"),file); continue; } popup_report_write2(zdpop,0,"%s \n",file); // report progress } if (! zdialog_valid(zdpop)) printf("*** report canceled \n"); else popup_report_write2(zdpop,0,TX("\n*** COMPLETED \n")); popup_report_bottom(zdpop); Fbusy(-1); cleanup: Fblock(0); load_imagelocs(); // refresh geolocatons table if (zd) zdialog_free(zd); zd_mapgeotags = 0; return; } // batch_geotags dialog event function int batch_geotags_dialog_event(zdialog *zd, ch *event) { int yn, nn, zstat, err; ch countmess[80]; ch location[40], country[40]; ch gps_data[24]; float flati, flongi; if (strmatch(event,"files")) // select images to add tags { zdialog_show(zd,0); // hide parent dialog select_files(0); // get file list from user zdialog_show(zd,1); snprintf(countmess,80,TX("%d image files selected"),SFcount); zdialog_stuff(zd,"labcount",countmess); } if (! zd->zstat) return 1; // wait for action button zstat = zd->zstat; zd->zstat = 0; // keep dialog active if (zstat == 1) // [find] { nn = find_location(zd); // search image location data 26.0 if (nn < 2) { // multiple geocoordinates? zmessage_post(Mwin,"40/40",3,TX("choose location")); // inform user 26.7 m_show_on_map(0,0); // resolve multiple geocoordinates 26.7 } return 1; } else if (zstat == 2) // [clear] { zdialog_stuff(zd,"location",""); // erase dialog fields zdialog_stuff(zd,"country",""); zdialog_stuff(zd,"gps_data",""); return 1; } else if (zstat == 3) // [proceed] { zdialog_fetch(zd,"location",location,40); // get location from dialog zdialog_fetch(zd,"country",country,40); strTrim2(location); strTrim2(country); if (*location) { // allow "" to erase location *location = toupper(*location); // capitalize zdialog_stuff(zd,"location",location); } if (*country) { *country = toupper(*country); zdialog_stuff(zd,"country",country); } zdialog_fetch(zd,"gps_data",gps_data,24); // get GPS data if (*gps_data) { // if present, validate err = get_gps_data(gps_data,flati,flongi); if (err) goto badcoord; } if (! SFcount) goto nofiles; if (*location <= ' ' || *country <= ' ' || *gps_data <= ' ') { yn = zmessageYN(Mwin,TX("data is incomplete, proceed?")); if (! yn) return 1; } zd->zstat = 4; // mark complete return 1; } zdialog_free(zd); // canceled return 1; badcoord: zmessageACK(Mwin,TX("invalid GPS data: %s"),gps_data); return 1; nofiles: zmessageACK(Mwin,TX("no files selected")); return 1; } /**************************************************************************************/ // Group images by location and date, with a count of images in each group. // Click on a group to get a thumbnail gallery of all images in the group. namespace places_dates_names { struct grec_t { // image geotags data ch *location, *country; // group location ch pdate[12]; // nominal group date, yyyy:mm:dd int lodate, hidate; // range, days since 0 CE int count; // images in group }; grec_t *grec = 0; zlist_t *filelist = 0; int Ngrec = 0; int groupby, daterange; int Fusesearch, Nsearch; int pline; zdialog *zdpop = 0; } // menu function void m_meta_places_dates(GtkWidget *, ch *) // 26.0 { using namespace places_dates_names; int places_dates_getdays(ch *date); int places_dates_comp(ch *rec1, ch *rec2); int places_dates_clickfunc(GtkWidget *widget, int line, int pos, ch *input); zdialog *zd; int zstat, ii, jj, cc, cc1, cc2; int ww, iix, iig, newgroup; ch location[40], country[40]; ch albumfile[200]; xxrec_t *xxrec; F1_help_topic = TX("PLACES/DATES"); printf("m_meta_places_dates \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } /*** __________________________________________ | Report Image Places/Dates | | | | Include: (o) all images (o) last search | | (o) Group by country | 1 | (o) Group by country/location | 2 | (o) Group by country/date | 3 // 26.0 | (o) Group by country/location/date | 4 | (o) Group by date/country | 5 // 26.0 | (o) Group by date/country/location | 6 | Combine within [ xx ] days | | | | [Proceed] [X] | |__________________________________________| ***/ zd = zdialog_new(TX("Report Image Places/Dates"),Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbincl","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labincl","hbincl",TX("Include:"),"space=3"); zdialog_add_widget(zd,"radio","all images","hbincl",TX("all images"),"space=5"); zdialog_add_widget(zd,"radio","last search","hbincl",TX("last search")); zdialog_add_widget(zd,"radio","1","dialog",TX("Group by country")); zdialog_add_widget(zd,"radio","2","dialog",TX("Group by country/location")); zdialog_add_widget(zd,"radio","3","dialog",TX("Group by country/date")); zdialog_add_widget(zd,"radio","4","dialog",TX("Group by country/location/date")); zdialog_add_widget(zd,"radio","5","dialog",TX("Group by date/country")); zdialog_add_widget(zd,"radio","6","dialog",TX("Group by date/country/location")); zdialog_add_widget(zd,"hbox","hbr","dialog",0,"space=8"); zdialog_add_widget(zd,"label","labr1","hbr",TX("Combine within"),"space=3"); zdialog_add_widget(zd,"zspin","range","hbr","0|9999|1|1","space=3"); zdialog_add_widget(zd,"label","labr2","hbr",TX("days"),"space=3"); zdialog_stuff(zd,"all images",1); // default, use all images zdialog_stuff(zd,"last search",0); zdialog_stuff(zd,"1",0); zdialog_stuff(zd,"2",1); // default by country/location zdialog_stuff(zd,"3",0); zdialog_stuff(zd,"4",0); zdialog_stuff(zd,"5",0); zdialog_stuff(zd,"6",0); zdialog_load_inputs(zd); zdialog_resize(zd,300,0); zdialog_run(zd,0,"parent"); zstat = zdialog_wait(zd); if (zstat != 1) { zdialog_free(zd); return; } zdialog_fetch(zd,"last search",Fusesearch); // use last search results zdialog_fetch(zd,"1",iix); if (iix) groupby = 1; // group country zdialog_fetch(zd,"2",iix); if (iix) groupby = 2; // group country/location zdialog_fetch(zd,"3",iix); if (iix) groupby = 3; // group country/date zdialog_fetch(zd,"4",iix); if (iix) groupby = 4; // group country/location/date zdialog_fetch(zd,"5",iix); if (iix) groupby = 5; // group date/country zdialog_fetch(zd,"6",iix); if (iix) groupby = 6; // group date/country/location zdialog_fetch(zd,"range",daterange); // combine recs within date range zdialog_free(zd); if (Ngrec) { // free prior memory zfree(grec); Ngrec = 0; } if (filelist) zlist_free(filelist); filelist = 0; if (! Nxxrec) { zmessageACK(Mwin,TX("no files found")); // no image files return; } if (Fusesearch) // use last search results { snprintf(albumfile,200,"%s/%s",albums_folder,"search_results"); // get image list from last search filelist = zlist_from_file(albumfile); Nsearch = zlist_count(filelist); if (! Nsearch) { zlist_free(filelist); zmessageACK(Mwin,TX("no files found")); return; } cc = Nsearch * sizeof(grec_t); // allocate memory grec = (grec_t *) zmalloc(cc,"meta-places"); for (ii = jj = 0; ii < Nsearch; ii++) // loop files in search results { xxrec = get_xxrec(zlist_get(filelist,ii)); if (! xxrec) continue; // deleted, not image file grec[jj].location = xxrec->location; // get location and country grec[jj].country = xxrec->country; strncpy0(grec[jj].pdate,xxrec->pdate,11); // photo date, truncate to yyyy:mm:dd grec[jj].lodate = places_dates_getdays(xxrec->pdate); // days since 0 CE grec[jj].hidate = grec[jj].lodate; jj++; } Ngrec = jj; } else // use all image files { cc = Nxxrec * sizeof(grec_t); // allocate memory grec = (grec_t *) zmalloc(cc,"meta-places"); for (ii = 0; ii < Nxxrec; ii++) // loop all index recs { xxrec = xxrec_tab[ii]; grec[ii].location = xxrec->location; // get location and country grec[ii].country = xxrec->country; strncpy0(grec[ii].pdate,xxrec->pdate,11); // photo date, truncate to yyyy:mm:dd grec[ii].lodate = places_dates_getdays(xxrec->pdate); // days since 0 CE grec[ii].hidate = grec[ii].lodate; } Ngrec = Nxxrec; } if (Ngrec > 1) // sort grecs according to groupby HeapSort((ch *) grec, sizeof(grec_t), Ngrec, places_dates_comp); iig = 0; // 1st group from grec[0] grec[iig].count = 1; // group count = 1 for (iix = 1; iix < Ngrec; iix++) // scan following grecs { newgroup = 0; if (! strmatch(grec[iix].country,grec[iig].country)) newgroup = 1; // new country >> new group if (! strmatch(grec[iix].location,grec[iig].location) // new location >> new group && (groupby == 2 || groupby == 4 || groupby == 6)) newgroup = 1; // new country >> new group if ((grec[iix].lodate - grec[iig].hidate > daterange) && (groupby >= 3)) // new date >> new group newgroup = 1; // new country >> new group if (newgroup) { iig++; // new group if (iix > iig) { grec[iig] = grec[iix]; // copy and pack down grec[iix].location = grec[iix].country = 0; // no zfree() } grec[iig].count = 1; // group count = 1 } else { grec[iix].location = grec[iix].country = 0; grec[iig].hidate = grec[iix].lodate; // expand group date-range grec[iig].count++; // increment group count } } Ngrec = iig + 1; // unique groups count if (groupby == 1) ww = 500; // group country if (groupby == 2) ww = 800; // group country/location if (groupby == 3) ww = 600; // group country/date-range if (groupby == 4) ww = 980; // group country/location/date-range if (groupby == 5) ww = 600; // group date-range/country if (groupby == 6) ww = 980; // group date-range/country/location if (zdialog_valid(zdpop)) popup_report_close(zdpop,0); // close prior if any zdpop = popup_report_open(TX("Image Locations"),Mwin,ww,400,0, // write groups to popup window 1,places_dates_clickfunc,"Find","X",null); if (groupby == 1) // group by country { popup_report_header(zdpop,1,"%-40s %5s","Country","Count"); for (iig = 0; iig < Ngrec; iig++) { utf8substring(country,grec[iig].country,0,40); cc1 = 40 + strlen(country) - utf8len(country); popup_report_write2(zdpop,0,"%-*s %5d \n",cc1,country,grec[iig].count); } } if (groupby == 2) // group by country/location { popup_report_header(zdpop,1,"%-40s %-40s %5s", "Country","Location","Count"); for (iig = 0; iig < Ngrec; iig++) { utf8substring(country,grec[iig].country,0,40); cc1 = 40 + strlen(country) - utf8len(country); utf8substring(location,grec[iig].location,0,40); cc2 = 40 + strlen(location) - utf8len(location); popup_report_write2(zdpop,0,"%-*s %-*s %5d \n", cc1,country,cc2,location,grec[iig].count); } } if (groupby == 3) // group by country/date-range { popup_report_header(zdpop,1,"%-40s %-10s %5s", "Country","Date","Count"); for (iig = 0; iig < Ngrec; iig++) { utf8substring(country,grec[iig].country,0,40); cc1 = 40 + strlen(country) - utf8len(country); popup_report_write2(zdpop,0,"%-*s %-10s %5d \n", cc1,country,grec[iig].pdate,grec[iig].count); } } if (groupby == 4) // group by country/location/date-range { popup_report_header(zdpop,1,"%-40s %-40s %-10s %5s", "Country","Location","Date","Count"); for (iig = 0; iig < Ngrec; iig++) { utf8substring(country,grec[iig].country,0,40); cc1 = 40 + strlen(country) - utf8len(country); utf8substring(location,grec[iig].location,0,40); cc2 = 40 + strlen(location) - utf8len(location); popup_report_write2(zdpop,0,"%-*s %-*s %-10s %5d \n", cc1,country,cc2,location,grec[iig].pdate,grec[iig].count); } } if (groupby == 5) // group by date-range/country { popup_report_header(zdpop,1,"%-10s %-40s %5s", "Date","Country","Count"); for (iig = 0; iig < Ngrec; iig++) { utf8substring(country,grec[iig].country,0,40); cc1 = 40 + strlen(country) - utf8len(country); popup_report_write2(zdpop,0,"%-10s %-*s %5d \n", grec[iig].pdate,cc1,country,grec[iig].count); } } if (groupby == 6) // group by date-range/country/location { popup_report_header(zdpop,1,"%-10s %-40s %-40s %5s", "Date","Country","Location","Count"); for (iig = 0; iig < Ngrec; iig++) { utf8substring(country,grec[iig].country,0,40); cc1 = 40 + strlen(country) - utf8len(country); utf8substring(location,grec[iig].location,0,40); cc2 = 40 + strlen(location) - utf8len(location); popup_report_write2(zdpop,0,"%-10s %-*s %-*s %5d \n", grec[iig].pdate,cc1,country,cc2,location,grec[iig].count); } } pline = 0; // initial report line return; } // Compare 2 grec records using groupby sequence // return < 0 = 0 > 0 for rec1 < = > rec2. int places_dates_comp(ch *rec1, ch *rec2) { using namespace places_dates_names; int ii, date1, date2; ch *loc1, *loc2; if (groupby == 1) // compare country { ch * country1 = ((grec_t *) rec1)->country; ch * country2 = ((grec_t *) rec2)->country; ii = strcmp(country1,country2); return ii; } if (groupby == 2) // compare country, location { ch * country1 = ((grec_t *) rec1)->country; ch * country2 = ((grec_t *) rec2)->country; ii = strcmp(country1,country2); if (ii) return ii; loc1 = ((grec_t *) rec1)->location; loc2 = ((grec_t *) rec2)->location; ii = strcmp(loc1,loc2); return ii; } if (groupby == 3) // compare country, date { ch * country1 = ((grec_t *) rec1)->country; ch * country2 = ((grec_t *) rec2)->country; ii = strcmp(country1,country2); if (ii) return ii; date1 = ((grec_t *) rec1)->lodate; date2 = ((grec_t *) rec2)->lodate; ii = date1 - date2; return ii; } if (groupby == 4) // compare country, location, date { ch * country1 = ((grec_t *) rec1)->country; ch * country2 = ((grec_t *) rec2)->country; ii = strcmp(country1,country2); if (ii) return ii; loc1 = ((grec_t *) rec1)->location; loc2 = ((grec_t *) rec2)->location; ii = strcmp(loc1,loc2); if (ii) return ii; date1 = ((grec_t *) rec1)->lodate; date2 = ((grec_t *) rec2)->lodate; ii = date1 - date2; return ii; } if (groupby == 5) // compare date, country { date1 = ((grec_t *) rec1)->lodate; date2 = ((grec_t *) rec2)->lodate; ii = date1 - date2; if (ii) return ii; ch * country1 = ((grec_t *) rec1)->country; ch * country2 = ((grec_t *) rec2)->country; ii = strcmp(country1,country2); return ii; } if (groupby == 6) // compare date, country, location { date1 = ((grec_t *) rec1)->lodate; date2 = ((grec_t *) rec2)->lodate; ii = date1 - date2; if (ii) return ii; ch * country1 = ((grec_t *) rec1)->country; ch * country2 = ((grec_t *) rec2)->country; ii = strcmp(country1,country2); if (ii) return ii; loc1 = ((grec_t *) rec1)->location; loc2 = ((grec_t *) rec2)->location; ii = strcmp(loc1,loc2); return ii; } return 0; } // convert yyyy:mm:dd date into days from 0001:01:01 C.E. int places_dates_getdays(ch *pdate) { using namespace places_dates_names; int year, month, day; ch temp[8]; int montab[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; int elaps; if (! *pdate) return 0; year = month = day = 0; strncpy0(temp,pdate,5); year = atoi(temp); if (year <= 0) year = 1; strncpy0(temp,pdate+5,3); month = atoi(temp); if (month <= 0) month = 1; strncpy0(temp,pdate+8,3); day = atoi(temp); if (day <= 0) day = 1; elaps = 365 * (year-1) + (year-1) / 4; // elapsed days in prior years elaps += montab[month-1]; // + elapsed days in prior months if (year % 4 == 0 && month > 2) elaps += 1; // + 1 for Feb. 29 elaps += day-1; // + elapsed days in month return elaps; } // Receive clicks on report window and generate gallery of images // matching the selected country/location/date int places_dates_clickfunc(GtkWidget *widget, int line, int pos, ch *input) { using namespace places_dates_names; int ii, jj, lodate, hidate, datex; ch location[40], country[40]; ch places_file[200]; FILE *fid; xxrec_t *xxrec; if (line >= 0) // line clicked { txwidget_scroll(widget,line); // keep line on screen txwidget_highlight_line(widget,line); // highlight pline = line; // remember last line selected } strncpy0(country,grec[pline].country,40); // selected country/location/date-range strncpy0(location,grec[pline].location,40); lodate = grec[pline].lodate; hidate = grec[pline].hidate; snprintf(places_file,200,"%s/places_dates",albums_folder); // open output file fid = fopen(places_file,"w"); if (! fid) goto filerror; if (Fusesearch) // loop files in search results { for (ii = jj = 0; ii < Nsearch; ii++) { xxrec = get_xxrec(zlist_get(filelist,ii)); if (! xxrec) continue; // deleted, not image file if (! strmatch(xxrec->country,country)) continue; // no country match if (groupby == 2 || groupby == 4 || groupby == 6) if (! strmatch(xxrec->location,location)) continue; // no location match if (groupby >= 3) { datex = places_dates_getdays(xxrec->pdate); if (! *xxrec->pdate) datex = 0; if (datex < lodate || datex > hidate) continue; // no date match } fprintf(fid,"%s\n",xxrec->file); // output matching file } } else { for (ii = 0; ii < Nxxrec; ii++) // loop all files { zmainloop(); // keep GTK alive xxrec = xxrec_tab[ii]; if (! strmatch(xxrec->country,country)) continue; // no country match if (groupby == 2 || groupby == 4 || groupby == 6) if (! strmatch(xxrec->location,location)) continue; // no location match if (groupby >= 3) { datex = places_dates_getdays(xxrec->pdate); if (! *xxrec->pdate) datex = 0; if (datex < lodate || datex > hidate) continue; // no date match } fprintf(fid,"%s\n",xxrec->file); // output matching file } } fclose(fid); navi::gallerytype = SEARCH; // search results gallery(places_file,"initF",0); // generate gallery of matching files gallery(0,"paint",0); viewmode('G'); return 1; filerror: zmessageACK(Mwin,TX("file error: %s"),strerror(errno)); return 1; } /**************************************************************************************/ // Produce a report of image counts by year and month. // Click on a report line to get a thumbnail gallery of images. namespace timeline_names { int Fuseall, Fusesearch, Fusegallery; int Nsearch = 0; zlist_t *filelist; int Nyears = 2100; int Nperds = 12 * Nyears; int Nyears2 = 0; ch *months = TX("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"); int colpos[14] = { 0, 6, 13, 19, 25, 31, 37, 43, 49, 55, 61, 67, 73, 79 }; zdialog *zdpop = 0; } // menu function void m_meta_timeline(GtkWidget *, ch *) { using namespace timeline_names; int timeline_clickfunc(GtkWidget *widget, int line, int pos, ch *input); ch *file, albumfile[200]; int Ycount[Nyears], Pcount[Nperds]; // image counts per year and period int Mcount, Ecount; // counts for missing and invalid dates int ii, jj, cc; int yy, mm, pp; ch pdate[8], nnnnnn[8], buff[100]; xxrec_t *xxrec; F1_help_topic = TX("TIMELINE"); printf("m_meta_timeline \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Nsearch) zlist_free(filelist); // free prior memory Nsearch = 0; Fuseall = Fusesearch = Fusegallery = 0; ii = zdialog_choose(Mwin,"mouse",TX("images to report"), // query user TX("all images"), TX("last search"), TX("current gallery"), "X", null); if (ii == 1) Fuseall = 1; else if (ii == 2) Fusesearch = 1; else if (ii == 3) Fusegallery = 1; else return; Mcount = Ecount = 0; // clear missing and error counts for (yy = 0; yy < Nyears; yy++) // clear totals per year Ycount[yy] = 0; for (pp = 0; pp < Nperds; pp++) // clear totals per period (month) Pcount[pp] = 0; if (Fuseall) // include all image files { for (ii = 0; ii < Nxxrec; ii++) { zmainloop(); // keep GTK alive xxrec = xxrec_tab[ii]; strncpy0(pdate,xxrec->pdate,8); // photo date, truncate to yyyy:mm if (! *pdate) { // if missing, count ++Mcount; continue; } yy = atoi(pdate); mm = atoi(pdate+5); if (yy < 0 || yy >= Nyears || mm < 1 || mm > 12) { ++Ecount; // invalid, add to error count continue; } ++Ycount[yy]; // add to year totals pp = yy * 12 + mm - 1; // add to period totals ++Pcount[pp]; } } if (Fusegallery) // include current gallery only { for (ii = 0; ii < navi::Gfiles; ii++) // loop files in current gallery { file = gallery(0,"getR",ii); if (! file) continue; xxrec = get_xxrec(file); if (! xxrec) continue; // deleted, not image file strncpy0(pdate,xxrec->pdate,8); // photo date, truncate to yyyy:mm if (! *pdate) { // if missing, count ++Mcount; continue; } yy = atoi(pdate); mm = atoi(pdate+5); if (yy < 0 || yy >= Nyears || mm < 1 || mm > 12) { ++Ecount; // invalid, add to error count continue; } ++Ycount[yy]; // add to year totals pp = yy * 12 + mm - 1; // add to period totals ++Pcount[pp]; } } if (Fusesearch) // include search results only { snprintf(albumfile,200,"%s/%s",albums_folder,"search_results"); // get image list from last search filelist = zlist_from_file(albumfile); Nsearch = zlist_count(filelist); if (! Nsearch) { zlist_free(filelist); zmessageACK(Mwin,TX("no files found")); return; } for (ii = jj = 0; ii < Nsearch; ii++) { xxrec = get_xxrec(zlist_get(filelist,ii)); if (! xxrec) continue; // deleted, not image file strncpy0(pdate,xxrec->pdate,8); // photo date, truncate to yyyy:mm if (! *pdate) { // if missing, count ++Mcount; continue; } yy = atoi(pdate); mm = atoi(pdate+5); if (yy < 0 || yy >= Nyears || mm < 1 || mm > 12) { ++Ecount; // invalid, add to error count continue; } ++Ycount[yy]; // add to year totals pp = yy * 12 + mm - 1; // add to period totals ++Pcount[pp]; } } if (zdialog_valid(zdpop)) popup_report_close(zdpop,0); // close prior if any zdpop = popup_report_open(TX("Image Timeline"),Mwin,700,400,0,1, // write report to popup window timeline_clickfunc,"X",null); popup_report_header(zdpop,1,"year count %s",months); // "year count Jan Feb ... " if (Mcount) popup_report_write2(zdpop,0,"null %-6d \n",Mcount); // images with no date if (Ecount) popup_report_write2(zdpop,0,"invalid %-4d \n",Ecount); // images with invalid date Nyears2 = 0; for (yy = 0; yy < Nyears; yy++) // loop years { if (! Ycount[yy]) continue; // omit years without images snprintf(buff,100,"%04d %-6d ",yy,Ycount[yy]); // output "yyyy NNNNNN " cc = 13; for (mm = 0; mm < 12; mm++) { // loop months 0 - 11 pp = yy * 12 + mm; // period snprintf(nnnnnn,7,"%-6d",Pcount[pp]); // output "NNNNNN" memcpy(buff+cc,nnnnnn,6); cc += 6; } buff[cc] = 0; popup_report_write2(zdpop,0,"%s \n",buff); Nyears2++; // count reported years } return; } // Receive clicks on report window and generate gallery of images // matching the selected period int timeline_clickfunc(GtkWidget *widget, int line, int pos, ch *input) { using namespace timeline_names; int ii, mm, cc; int Fnull = 0, ustat = 0; static int pline, ppos; ch *txline, pdate[8], *pp, end; ch albumfile[200]; FILE *fid; xxrec_t *xxrec; static int busy = 0; if (busy) return 0; // stop re-entry busy++; if (line == -1) // arrow key navigation { if (input && strstr("left right up down",input)) ustat = 1; // handled here for (ii = 0; ii < 14; ii++) // current report column if (ppos == colpos[ii]) break; if (strmatch(input,"left")) { // prior month if (ii > 2) ppos = colpos[ii-1]; else { pline -= 1; ppos = colpos[13]; } } if (strmatch(input,"right")) { // next month if (ii < 13) ppos = colpos[ii+1]; else { pline += 1; ppos = colpos[2]; } } if (strmatch(input,"up")) pline -= 1; // prior year if (strmatch(input,"down")) pline += 1; // next year line = pline; pos = ppos; } if (line < 0) line = 0; if (line > Nyears2) line = Nyears2; if (pos < 0) pos = 0; for (ii = 0; ii < 14; ii++) if (pos < colpos[ii]) break; pos = colpos[ii-1]; txwidget_scroll(widget,line); // keep line on screen pline = line; // remember chosen line, position ppos = pos; pp = txwidget_word(widget,line,pos," ",end); // hilite clicked word if (pp) txwidget_highlight_word(widget,line,pos,strlen(pp)); txline = txwidget_line(widget,line,1); // get clicked line if (! txline || ! *txline) goto retx; cc = 0; if (strmatchN(txline,"null",4)) Fnull = 1; // find images with null date else if (pos < 13) { // clicked on year or year count strncpy0(pdate,txline,5); // have "yyyy" cc = 4; } else { // month was clicked mm = (pos - 13) / 6 + 1; // month, 1-12 if (mm < 1 || mm > 12) goto retx; strncpy(pdate,txline,4); // "yyyy" pdate[4] = ':'; pdate[5] = '0' + mm/10; pdate[6] = '0' + mm % 10; // have "yyyy:mm" pdate[7] = 0; cc = 7; } snprintf(albumfile,200,"%s/timeline",albums_folder); fid = fopen(albumfile,"w"); // open output file if (! fid) { zmessageACK(Mwin,TX("file error: %s"),strerror(errno)); goto retx; } if (Fusesearch) // include prior search results { for (ii = 0; ii < Nsearch; ii++) // loop search results { zmainloop(100); // keep GTK alive xxrec = get_xxrec(zlist_get(filelist,ii)); // bugfix 26.0 if (! xxrec) continue; if (Fnull) { // search for missing dates if (! *xxrec->pdate) { fprintf(fid,"%s\n",xxrec->file); continue; } } else if (strmatchN(xxrec->pdate,pdate,cc)) // screen for desired period fprintf(fid,"%s\n",xxrec->file); // output matching file } } else // include all image files { for (ii = 0; ii < Nxxrec; ii++) { zmainloop(100); // keep GTK alive xxrec = xxrec_tab[ii]; if (! xxrec) continue; if (Fnull) { // search for missing dates if (! *xxrec->pdate) { fprintf(fid,"%s\n",xxrec->file); continue; } } else if (strmatchN(xxrec->pdate,pdate,cc)) // screen for desired period fprintf(fid,"%s\n",xxrec->file); // output matching file } } fclose(fid); navi::gallerytype = SEARCH; // search results gallery(albumfile,"initF",0); // generate gallery of matching files gallery(0,"paint",0); viewmode('G'); retx: busy = 0; return ustat; } /**************************************************************************************/ // Report images by metadata tag value or keyword value. // Imput a metadata tag name (rating, keywords, title, description, camera) // Count images by tag value and make a list of tag values and image counts. // If tag name is keywords, the multiple contained values are treated separately. // Output a report of tag values and corresponding count of images with tag value. // Click on a tag value to get a thumbnail gallery of all images with the tag value. namespace meta_tags_names { ch *tagname; // input tag name ch **tags; // array, all tag values found in image files int *files; // array, count of files having each tag value int Ntags; // count of the above two arrays int Fxmeta; // flag, tag name is in extra metadata zdialog *zdpop = 0; } // menu function void m_meta_tags(GtkWidget *, ch *) // 26.0 { using namespace meta_tags_names; int meta_tags_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int ii, jj, cc, tcc, vcc; ch *pp, *pp1, *pp2; ch buff[100]; xxrec_t *xxrec; ch tagvalue[100], megapix[8]; int maxNtags; int Nnotag; zlist_t *zlist; printf("m_meta_tags \n"); F1_help_topic = TX("METADATA TAGS"); if (Xindexlev < 1) { index_rebuild(1,0); if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } zlist = zlist_new(0); zlist_append(zlist,"rating",0); // list of tag names to choose from zlist_append(zlist,"keywords",0); zlist_append(zlist,"title",0); zlist_append(zlist,"description",0); zlist_append(zlist,"camera",0); zlist_append(zlist,"location",0); for (ii = 0; ii < xmetaNtags; ii++) // add extra metadata tags zlist_append(zlist,xmeta_tags[ii],0); tagname = popup_choose(zlist); // get tag name from user if (! tagname) return; maxNtags = Nxxrec; // max. unique tag values (1 per file) if (strmatch(tagname,"keywords")) maxNtags *= 20; // if keywords, allow 20 per file cc = maxNtags * sizeof(ch *); tags = (ch **) zmalloc(cc,"meta_tags"); // allocate tag values cc = maxNtags * sizeof(int); files = (int *) zmalloc(cc,"meta_tags"); // allocate corresp. file counts Ntags = 0; Nnotag = 0; Fxmeta = 0; if (strmatch(tagname,"rating")) // rating is wanted { for (ii = 0; ii < Nxxrec; ii++) { zmainloop(); xxrec = xxrec_tab[ii]; if (! xxrec->rating[0]) Nnotag++; else { strncpy0(tagvalue,xxrec->rating,2); tags[Ntags++] = zstrdup(tagvalue,"meta_tags"); } } } else if (strmatch(tagname,"keywords")) // keywords is wanted { for (ii = 0; ii < Nxxrec; ii++) { zmainloop(); xxrec = xxrec_tab[ii]; if (! xxrec->keywords) { Nnotag++; continue; } for (jj = 1; ; jj++) { pp = substring(xxrec->keywords,",",jj); // get all keywords if (! pp) break; if (Ntags < maxNtags) tags[Ntags++] = zstrdup(pp,"meta_tags"); else { zmessageACK(Mwin,TX("max keywords exceeded")); goto cleanup; } } } } else if (strmatch(tagname,"title")) // title is wanted { for (ii = 0; ii < Nxxrec; ii++) { zmainloop(); xxrec = xxrec_tab[ii]; if (! xxrec->title) Nnotag++; else { strncpy0(tagvalue,xxrec->title,100); tags[Ntags++] = zstrdup(tagvalue,"meta_tags"); } } } else if (strmatch(tagname,"description")) // description is wanted { for (ii = 0; ii < Nxxrec; ii++) { zmainloop(); xxrec = xxrec_tab[ii]; if (! xxrec->desc) Nnotag++; else { strncpy0(tagvalue,xxrec->desc,100); tags[Ntags++] = zstrdup(tagvalue,"meta_tags"); } } } else if (strmatch(tagname,"camera")) // camera is wanted { for (ii = 0; ii < Nxxrec; ii++) { zmainloop(); xxrec = xxrec_tab[ii]; if (! xxrec->make[0]) Nnotag++; else { *tagvalue = 0; strncatv(tagvalue,100,xxrec->make,"-",xxrec->model,"-",xxrec->lens,null); tags[Ntags++] = zstrdup(tagvalue,"meta_tags"); } } } else if (strmatch(tagname,"location")) // location is wanted { for (ii = 0; ii < Nxxrec; ii++) { zmainloop(); xxrec = xxrec_tab[ii]; if (! xxrec->country[0] && ! xxrec->location[0]) Nnotag++; else { *tagvalue = 0; strncatv(tagvalue,100,xxrec->country," ",xxrec->location,null); tags[Ntags++] = zstrdup(tagvalue,"meta_tags"); } } } else // look for extra metadata tag { for (ii = 0; ii < xmetaNtags; ii++) if (strmatch(tagname,xmeta_tags[ii])) break; if (ii == xmetaNtags) { zmessageACK(Mwin,TX("tag name %s not in xmeta tag list"),tagname); // should not happen return; } Fxmeta = 1; // extra metadata tag is wanted tcc = strlen(tagname); // extra metadata tag name and cc for (ii = 0; ii < Nxxrec; ii++) // search for extra metadata { zmainloop(); xxrec = xxrec_tab[ii]; pp = xxrec->xmeta; // tag1=value1^ tag2=value2^ ... // | | | while (true) // pp pp1 pp2 { if (! pp || ! *pp) break; if (strmatchN(tagname,pp,tcc) && pp[tcc] == '=') break; pp = strchr(pp,'^'); if (! pp) break; pp++; if (*pp == ' ') pp++; } if (! pp || ! *pp) { // extra metadata tag not found Nnotag++; continue; } pp1 = pp + tcc + 1; pp2 = strchr(pp1,'^'); if (! pp2) strcpy(tagvalue,"invalid xmeta"); else { vcc = pp2 - pp1 + 1; if (vcc > 100) vcc = 100; strncpy0(tagvalue,pp1,vcc); } if (strmatch(tagname,"Megapixels")) // if megapixels snprintf(megapix,8,"%3.0f",atof(tagvalue)); // round to nearest whole value tags[Ntags++] = zstrdup(megapix,"meta_tags"); } } if (! Ntags) goto report; HeapSort(tags,Ntags); // sort tag values files[0] = 1; for (ii = 0, jj = 1; jj < Ntags; jj++) // pack down, eliminate duplicates { if (strmatch(tags[ii],tags[jj])) { zfree(tags[jj]); tags[jj] = 0; files[ii]++; } else { ii++; if (jj > ii) { if (tags[ii]) zfree(tags[ii]); tags[ii] = tags[jj]; tags[jj] = 0; } files[ii] = 1; } } Ntags = ii + 1; // reduced tag count report: if (zdialog_valid(zdpop)) popup_report_close(zdpop,0); // close prior if any zdpop = popup_report_open("Metadata Tags",Mwin,700,400,0,1, // write report to popup window meta_tags_clickfunc,"X",null); popup_report_header(zdpop,1," files %s",tagname); snprintf(buff,100,"%8d %-100s",Nnotag,"(no tag value)"); // output no-tag-value first popup_report_write(zdpop,0,"%s \n",buff); for (ii = 0; ii < Ntags; ii++) // loop tags { snprintf(buff,100,"%8d %-100s",files[ii],tags[ii]); // 100 = tagvalue max cc popup_report_write(zdpop,0,"%s \n",buff); } cleanup: for (ii = 0; ii < Ntags; ii++) zfree(tags[ii]); // free memory zfree(tags); zfree(files); zlist_free(zlist); return; } int meta_tags_clickfunc(GtkWidget *widget, int line, int pos, ch *input) // 26.0 { using namespace meta_tags_names; int ii, jj, cc; FILE *fid; xxrec_t *xxrec; ch tags_file[200]; ch tagvalue[100], megapix[8]; ch camera[100], location[80]; ch *pp, *pp1, *pp2; int tcc, vcc; if (line < 0) return 1; txwidget_scroll(widget,line); // keep line on screen txwidget_highlight_line(widget,line); // highlight pp = popup_report_line(zdpop,line,1); // get report line, trim \n if (! pp) return 1; strncpy0(tagvalue,pp+10,100); // get tag value clicked strTrim(tagvalue); cc = strlen(tagvalue); snprintf(tags_file,200,"%s/Meta Tags",albums_folder); // open output file fid = fopen(tags_file,"w"); if (! fid) goto filerror; if (strmatch(tagname,"rating")) // rating is wanted { for (ii = 0; ii < Nxxrec; ii++) // loop all files { zmainloop(); // keep GTK alive xxrec = xxrec_tab[ii]; if (strmatch(tagvalue,"(no tag value)")) { // no rating is wanted if (xxrec->rating[0]) continue; fprintf(fid,"%s\n",xxrec->file); // output matching file } else if (xxrec->rating[0] == tagvalue[0]) // if selected rating, fprintf(fid,"%s\n",xxrec->file); // output matching file } } if (strmatch(tagname,"keywords")) // keywords is wanted { for (ii = 0; ii < Nxxrec; ii++) // loop all files { zmainloop(); // keep GTK alive xxrec = xxrec_tab[ii]; if (strmatch(tagvalue,"(no tag value)")) { // no keyword is wanted if (xxrec->keywords) continue; fprintf(fid,"%s\n",xxrec->file); // output matching file } for (jj = 1; ; jj++) { pp = substring(xxrec->keywords,",",jj); // get all keywords for image file if (! pp) break; if (strmatch(pp,tagvalue)) { // if selected keyword, fprintf(fid,"%s\n",xxrec->file); // output matching file break; } } } } if (strmatch(tagname,"title")) // title is wanted { for (ii = 0; ii < Nxxrec; ii++) // loop all files { zmainloop(); // keep GTK alive xxrec = xxrec_tab[ii]; if (strmatch(tagvalue,"(no tag value)")) { // no title is wanted if (xxrec->title) continue; fprintf(fid,"%s\n",xxrec->file); // output matching file } else if (xxrec->title && strmatchN(xxrec->title,tagvalue,cc)) // if selected title fprintf(fid,"%s\n",xxrec->file); // output matching file } } if (strmatch(tagname,"description")) // description is wanted { for (ii = 0; ii < Nxxrec; ii++) // loop all files { zmainloop(); // keep GTK alive xxrec = xxrec_tab[ii]; if (strmatch(tagvalue,"(no tag value)")) { // no title is wanted if (xxrec->desc) continue; fprintf(fid,"%s\n",xxrec->file); // output matching file } else if (xxrec->desc && strmatchN(xxrec->desc,tagvalue,cc)) // if selected description, fprintf(fid,"%s\n",xxrec->file); // output matching file } } if (strmatch(tagname,"camera")) // camera is wanted { for (ii = 0; ii < Nxxrec; ii++) // loop all files { zmainloop(); // keep GTK alive xxrec = xxrec_tab[ii]; if (strmatch(tagvalue,"(no tag value)")) { // no title is wanted if (xxrec->make[0]) continue; fprintf(fid,"%s\n",xxrec->file); // output matching file } else if (xxrec->make[0]) { *camera = 0; strncatv(camera,100,xxrec->make,"-",xxrec->model,"-",xxrec->lens,null); strTrim(camera); if (strmatch(camera,tagvalue)) // if selected camera, fprintf(fid,"%s\n",xxrec->file); // output matching file } } } if (strmatch(tagname,"location")) // location is wanted { for (ii = 0; ii < Nxxrec; ii++) // loop all files { zmainloop(); // keep GTK alive xxrec = xxrec_tab[ii]; if (strmatch(tagvalue,"(no tag value)")) { // no location is wanted if (xxrec->country[0] || xxrec->location[0]) continue; fprintf(fid,"%s\n",xxrec->file); // output matching file } else if (xxrec->country[0] || xxrec->location[0]) { *location = 0; strncatv(location,80,xxrec->country," ",xxrec->location,null); strTrim(location); if (strmatch(location,tagvalue)) // if selected location, fprintf(fid,"%s\n",xxrec->file); // output matching file } } } if (Fxmeta) // extra metadata tag is wanted { tcc = strlen(tagname); vcc = strlen(tagvalue); // extra metadata tag name and value for (ii = 0; ii < Nxxrec; ii++) // search for extra metadata { xxrec = xxrec_tab[ii]; pp = xxrec->xmeta; // tag1=value1^ tag2=value2^ ... // | | | while (true) // pp pp1 pp2 { if (! pp || ! *pp) break; if (strmatchN(tagname,pp,tcc) && pp[tcc] == '=') break; pp = strchr(pp,'^'); if (! pp) break; pp++; if (*pp == ' ') pp++; } if (! pp || ! *pp) { // extra metadata tag not found if (strmatch(tagvalue,"(no tag value)")) // no tag value is wanted fprintf(fid,"%s\n",xxrec->file); // output matching file continue; } pp1 = pp + tcc + 1; // get tag value pp2 = strchr(pp1,'^'); if (! pp2) { // invalid xmeta if (strmatch(tagvalue,"invalid xmeta")) // invalid xmeta is wanted fprintf(fid,"%s\n",xxrec->file); // output matching file continue; } if (strmatch(tagname,"Megapixels")) { // megapixels snprintf(megapix,8,"%3.0f",atof(pp1)); // round to whole value if (strmatch(megapix,tagvalue)) fprintf(fid,"%s\n",xxrec->file); continue; } if (pp2 - pp1 < vcc) continue; // tag value cc if (strmatchN(pp1,tagvalue,vcc)) // if selected tag value within vcc fprintf(fid,"%s\n",xxrec->file); // output matching file } } fclose(fid); navi::gallerytype = SEARCH; // search results gallery(tags_file,"initF",0); // generate gallery of matching files gallery(0,"paint",0); viewmode('G'); return 1; filerror: zmessageACK(Mwin,TX("file error: %s"),strerror(errno)); return 1; } /**************************************************************************************/ // Search image keywords, geotags, dates, ratings, titles, descriptions // overhauled // to find matching images. This is fast using the image index. // Search also any other metadata, but relatively slow. namespace search_images { zdialog *zd_search = 0; // search images dialog ch shDateFrom[20] = ""; // search images ch shDateTo[20] = ""; // format is "yyyy:mm:dd hh:mm" ch shRatingFr[4] = ""; ch shRatingTo[4] = ""; ch shkeywords[searchkeywordsXcc] = ""; // search keywords list ch shtext[searchkeywordsXcc] = ""; // search title and description text list ch shfiles[searchkeywordsXcc] = ""; // search files list ch shLocs[200] = ""; // search locations int Fscanall, Fscancurr; int Forgver, Flastver, Fallvers; // 25.1 int Fnewset, Faddset, Fremset; int Frepgallery, Frepmeta, Fautosearch = 0; int Fphotodate, Ffiledate, Fdaterange, Fnulldate; int Ftext, Ffiles, Fkeywords, Frating, Flocs; int Fallkeywords, Falltext, Fallfiles, Falllocs; #define Nxtagsmax 3 // max. extra search tags int Nxtags = 0; // search tags in use (user selections) ch *srchtags[Nxtagsmax]; // metadata tags to search ch *machvals[Nxtagsmax]; // data values to search for ch machtyp[Nxtagsmax]; // match type: string or number < = > int tagindexed[Nxtagsmax]; // tag included in extra indexed metadata ch **scanfiles = 0; // files to search and select int *passfiles; // selected files, ii --> xxrec_tab[ii] int Nscan = 0, Npass = 0; int Ncurrset; } /**************************************************************************************/ // Search function for use in scripts // $ fotocx -m autosearch settingsfile // A search is performed using the specified search settings file. // Upon completion, "search results: " is written to stdout, // where is a file containing a list of all image files // found - those matching the parameters in the search settings file. // A search settings file is made using the search dialog the [save] button. void m_autosearch(GtkWidget *, ch *) { using namespace search_images; FILE *fid; printf("m_autosearch \n"); printf("search parameters: %s \n",initial_file); fid = fopen(initial_file,"r"); // open search parameters file if (! fid) zexit(0,"%s: %s",initial_file,strerror(errno)); Fautosearch = 1; m_search_images(0,0); // open search dialog Fautosearch = 0; zdialog_load_widgets(zd_search,0,0,fid); // load parameters into dialog fclose(fid); zdialog_send_event(zd_search,"proceed"); // execute search zdialog_wait(zd_search); // wait for completion zdialog_free(zd_search); zexit(0,"autosearch exit"); } /**************************************************************************************/ // menu function // reduced dialog height void m_search_images(GtkWidget *, ch *) { using namespace search_images; int search_searchkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int search_matchkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int search_defkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input); int search_dialog_event(zdialog*, ch *event); zdialog *zd; GtkWidget *widget; int ii, nk; static ch **mlist = 0; ch matchx[8] = "matchx"; F1_help_topic = TX("SEARCH IMAGES"); printf("m_search_images \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } if (Fblock("search images")) return; if (! srchtags[0]) // first call initialization { for (ii = 0; ii < Nxtagsmax; ii++) { srchtags[ii] = (ch *) zmalloc(metatagXcc,"search"); machvals[ii] = (ch *) zmalloc(metadataXcc,"search"); } } /*** __________________________________________________________________ | Search Images | | | | search: (o) all images (o) current set only | Fscanall Fscancurr | include: [x] original [x] last version [x] all versions | Forgver Flastver Fallvers 25.1 | current set: (o) replace (o) add to set (o) remove from set | Fnewset Faddset Fremset | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | | report type: (o) gallery (o) metadata | Frepgallery Frepmeta | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | | date range [_______] [_______] (o) photo (o) file (yyyy:mm:dd) | | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | | rating range [__] [__] 0-5 stars | | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | | all/any | | keywords [____________________________________________] (o) (o) | | title/desc. [_________________________________________] (o) (o) | | file names [___________________________________________] (o) (o) | | locations [____________________________________________] (o) (o) | | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | | tagname condition match values X | these are called 'extra search tags' | [_____________|v] [ report ] [___________________________] [x] | in the code and comments | [_____________|v] [ matches ] [___________________________] [x] | | [_____________|v] [ number = ] [___________________________] [x] | | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | | Enter Keyword [______________] Matches [______________________] | | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | | Keywords Category [___________________|v] | | | | | | | | | | | | | | | | | | | | | | | | | | | |______________________________________________________________| | | | | [Load] [Save] [Clear] [Proceed] [X] | |__________________________________________________________________| ***/ zd = zdialog_new(TX("Search Images"),Mwin,TX("Load"),TX("Save"),TX("Clear"),TX("Proceed"),"X",null); zd_search = zd; zdialog_add_widget(zd,"hbox","hbs1","dialog"); zdialog_add_widget(zd,"label","labs1","hbs1",TX("search:"),"space=3"); zdialog_add_widget(zd,"radio","allimages","hbs1",TX("all images"),"space=5"); zdialog_add_widget(zd,"radio","currset","hbs1",TX("current set only"),"space=5"); zdialog_add_widget(zd,"hbox","hbsell","dialog"); zdialog_add_widget(zd,"label","labrep","hbsell",TX("include:"),"space=3"); zdialog_add_widget(zd,"check","org ver","hbsell",TX("original"),"space=3"); // 25.1 zdialog_add_widget(zd,"check","last ver","hbsell",TX("last version"),"space=3"); zdialog_add_widget(zd,"check","all vers","hbsell",TX("all versions"),"space=3"); zdialog_add_widget(zd,"hbox","hbm1","dialog"); zdialog_add_widget(zd,"label","labs1","hbm1",TX("current set:"),"space=3"); zdialog_add_widget(zd,"radio","newset","hbm1",TX("replace"),"space=5"); zdialog_add_widget(zd,"radio","addset","hbm1",TX("add to set"),"space=5"); zdialog_add_widget(zd,"radio","remset","hbm1",TX("remove from set"),"space=5"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=2"); zdialog_add_widget(zd,"hbox","hbrt","dialog"); zdialog_add_widget(zd,"label","labrt","hbrt",TX("report type:"),"space=3"); zdialog_add_widget(zd,"radio","repgallery","hbrt",TX("gallery"),"space=5"); zdialog_add_widget(zd,"radio","repmeta","hbrt","Metadata","space=5"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=2"); zdialog_add_widget(zd,"hbox","hbdt","dialog"); zdialog_add_widget(zd,"label","labd1","hbdt",TX("date range"),"space=3"); zdialog_add_widget(zd,"zentry","datefrom","hbdt",0,"size=10|space=5"); zdialog_add_widget(zd,"zentry","dateto","hbdt",0,"size=10"); zdialog_add_widget(zd,"radio","photodate","hbdt",TX("photo"),"space=5"); zdialog_add_widget(zd,"radio","filedate","hbdt",TX("file")); zdialog_add_widget(zd,"label","labd2","hbdt","(yyyy:mm:dd)","space=8"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=2"); zdialog_add_widget(zd,"hbox","hbrating","dialog"); zdialog_add_widget(zd,"label","labrat","hbrating",TX("rating range"),"space=5"); zdialog_add_widget(zd,"zentry","ratingfrom","hbrating",0,"size=3|space=8"); zdialog_add_widget(zd,"zentry","ratingto","hbrating",0,"size=3|space=8"); zdialog_add_widget(zd,"label","stars","hbrating",TX("0-5 stars"),"space=5"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=2"); zdialog_add_widget(zd,"hbox","hbaa","dialog"); zdialog_add_widget(zd,"label","space","hbaa",0,"expand"); zdialog_add_widget(zd,"label","all-any","hbaa","all/any"); zdialog_add_widget(zd,"hbox","hbkeywords","dialog","space=3"); zdialog_add_widget(zd,"label","labkeywords","hbkeywords","keywords","space=3"); zdialog_add_widget(zd,"text","shkeywords","hbkeywords",0,"expand|wrap|space=3"); zdialog_add_widget(zd,"radio","allkeywords","hbkeywords",0,"space=5"); zdialog_add_widget(zd,"radio","anykeywords","hbkeywords",0,"space=5"); zdialog_add_widget(zd,"hbox","hbtext","dialog","space=3"); zdialog_add_widget(zd,"label","labtext","hbtext",TX("title/desc."),"space=3"); zdialog_add_widget(zd,"zentry","shtext","hbtext",0,"expand|space=3"); zdialog_add_widget(zd,"radio","alltext","hbtext",0,"space=5"); zdialog_add_widget(zd,"radio","anytext","hbtext",0,"space=5"); zdialog_add_widget(zd,"hbox","hbfiles","dialog","space=3"); zdialog_add_widget(zd,"label","labfiles","hbfiles",TX("file names"),"space=3"); zdialog_add_widget(zd,"zentry","shfiles","hbfiles",0,"expand|space=3"); zdialog_add_widget(zd,"radio","allfiles","hbfiles",0,"space=5"); zdialog_add_widget(zd,"radio","anyfiles","hbfiles",0,"space=5"); zdialog_add_widget(zd,"hbox","hblocs","dialog","space=3"); zdialog_add_widget(zd,"label","lablocs","hblocs",TX("locations"),"space=3"); zdialog_add_widget(zd,"zentry","searchlocs","hblocs",0,"expand|space=3"); zdialog_add_widget(zd,"radio","alllocs","hblocs",0,"space=5"); zdialog_add_widget(zd,"radio","anylocs","hblocs",0,"space=5"); zdialog_add_ttip(zd,"searchlocs",TX("enter cities/locations, countries")); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=2"); zdialog_add_widget(zd,"hbox","hbmeta","dialog"); zdialog_add_widget(zd,"vbox","vbtag","hbmeta",0,"space=2|homog"); zdialog_add_widget(zd,"vbox","vbmatch","hbmeta",0,"space=2|homog"); zdialog_add_widget(zd,"vbox","vbvalue","hbmeta",0,"space=2|homog|expand"); zdialog_add_widget(zd,"vbox","vbclear","hbmeta",0,"space=2|homog"); zdialog_add_widget(zd,"label","lab1","vbtag","tag name"); zdialog_add_widget(zd,"label","lab2","vbmatch",TX("condition")); zdialog_add_widget(zd,"label","lab3","vbvalue",TX("match values")); zdialog_add_widget(zd,"label","lab0","vbclear","X"); zdialog_add_widget(zd,"combo","tag0","vbtag",0,"size=15"); // must match Nxtagsmax (now 3) zdialog_add_widget(zd,"combo","tag1","vbtag",0,"size=15"); zdialog_add_widget(zd,"combo","tag2","vbtag",0,"size=15"); zdialog_add_widget(zd,"combo","match0","vbmatch"); // must match zdialog_add_widget(zd,"combo","match1","vbmatch"); zdialog_add_widget(zd,"combo","match2","vbmatch"); zdialog_add_widget(zd,"zentry","value0","vbvalue",0,"expand"); // must match zdialog_add_widget(zd,"zentry","value1","vbvalue",0,"expand"); zdialog_add_widget(zd,"zentry","value2","vbvalue",0,"expand"); zdialog_add_widget(zd,"button","clear0","vbclear","x"); // must match zdialog_add_widget(zd,"button","clear1","vbclear","x"); zdialog_add_widget(zd,"button","clear2","vbclear","x"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=4"); zdialog_add_widget(zd,"hbox","hbnt","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labnt","hbnt",TX("Enter Keyword"),"space=3"); zdialog_add_widget(zd,"zentry","enterkeyword","hbnt",0,"size=12"); zdialog_add_widget(zd,"label","space","hbnt","","space=5"); zdialog_add_widget(zd,"label","labnt","hbnt",TX("matches"),"space=3"); zdialog_add_widget(zd,"text","matchkeywords","hbnt",0,"wrap|expand"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=3"); zdialog_add_widget(zd,"hbox","hbdt1","dialog"); zdialog_add_widget(zd,"label","labdt","hbdt1","Keywords Category","space=3"); zdialog_add_widget(zd,"combo","defcats","hbdt1",0,"space=10|size=20"); zdialog_add_widget(zd,"hbox","hbdefkeywords","dialog",0,"expand"); // scroll window for defined keywords zdialog_add_widget(zd,"scrwin","scrwdefkeywords","hbdefkeywords",0,"expand"); zdialog_add_widget(zd,"text","defkeywords","scrwdefkeywords",0,"wrap"); // defined keywords window zdialog_add_ttip(zd,"shkeywords",TX("click a defined keyword (below) to add a search keyword")); // 25.1 zdialog_add_ttip(zd,"shtext",TX("search for text within image title or description")); zdialog_add_ttip(zd,"shfiles",TX("search for text within file folders or file name")); zdialog_add_ttip(zd,"searchlocs",TX("search for names in image location metadata")); if (Fautosearch) { // autosearch caller zdialog_run(zd,search_dialog_event,"save"); // bypass interactive stuff return; } widget = zdialog_gtkwidget(zd,"shkeywords"); // keyword widget mouse/KB event function txwidget_set_eventfunc(widget,search_searchkeywords_clickfunc); widget = zdialog_gtkwidget(zd,"matchkeywords"); txwidget_set_eventfunc(widget,search_matchkeywords_clickfunc); widget = zdialog_gtkwidget(zd,"defkeywords"); txwidget_set_eventfunc(widget,search_defkeywords_clickfunc); zdialog_stuff(zd,"allimages",1); // defaults zdialog_stuff(zd,"currset",0); zdialog_stuff(zd,"newset",1); zdialog_stuff(zd,"addset",0); zdialog_stuff(zd,"remset",0); zdialog_stuff(zd,"repgallery",1); zdialog_stuff(zd,"repmeta",0); zdialog_stuff(zd,"photodate",1); zdialog_stuff(zd,"filedate",0); zdialog_stuff(zd,"org ver",0); zdialog_stuff(zd,"last ver",0); zdialog_stuff(zd,"all vers",0); zdialog_stuff(zd,"allkeywords",0); zdialog_stuff(zd,"anykeywords",1); zdialog_stuff(zd,"alltext",0); zdialog_stuff(zd,"anytext",1); zdialog_stuff(zd,"allfiles",0); zdialog_stuff(zd,"anyfiles",1); zdialog_stuff(zd,"alllocs",0); zdialog_stuff(zd,"anylocs",1); nk = zreadfile(meta_picklist_file,mlist); // get metadata picklist for (ii = 0; ii < nk; ii++) { zdialog_stuff(zd,"tag0",mlist[ii]); // metadata picklist > tag picklist zdialog_stuff(zd,"tag1",mlist[ii]); zdialog_stuff(zd,"tag2",mlist[ii]); } zreadfile_free(mlist); zdialog_stuff(zd,"tag0","(other)"); // add "other" choice zdialog_stuff(zd,"tag1","(other)"); zdialog_stuff(zd,"tag2","(other)"); zdialog_stuff(zd,"tag0",""); // clear picklist choices zdialog_stuff(zd,"tag1",""); zdialog_stuff(zd,"tag2",""); for (ii = 0; ii < Nxtagsmax; ii++) { // add operator options matchx[5] = '0' + ii; zdialog_stuff(zd,matchx,"report"); zdialog_stuff(zd,matchx,"reportx"); zdialog_stuff(zd,matchx,"matches"); zdialog_stuff(zd,matchx,"contains"); zdialog_stuff(zd,matchx,"number ="); zdialog_stuff(zd,matchx,"number =>"); zdialog_stuff(zd,matchx,"number <="); } zdialog_load_inputs(zd); // preload prior user inputs zdialog_fetch(zd,"shkeywords",shkeywords,searchkeywordsXcc); strcat(shkeywords," "); // trailing blank after "keywordname," load_defkeywords(0); // stuff defined keywords into dialog defkeywords_stuff(zd,"ALL"); defcats_stuff(zd); // and defined categories zdialog_resize(zd,600,900); // start dialog zdialog_run(zd,search_dialog_event,"save"); zdialog_wait(zd); // wait for dialog completion zdialog_free(zd); Fblock(0); return; } // search keyword was clicked int search_searchkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) { using namespace search_images; ch *txkeyword, end = 0; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;:",end); if (! txkeyword) return 1; del_keyword(txkeyword,shkeywords); // remove from search list zdialog_stuff(zd_search,"shkeywords",shkeywords); zfree(txkeyword); return 1; } // matching keyword was clicked int search_matchkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) { using namespace search_images; ch *txkeyword, end = 0; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;",end); if (! txkeyword) return 1; add_keyword(txkeyword,shkeywords,searchkeywordsXcc); // add to search keyword list zdialog_stuff(zd_search,"enterkeyword",""); // update dialog widgets zdialog_stuff(zd_search,"matchkeywords",""); zdialog_stuff(zd_search,"shkeywords",shkeywords); zdialog_goto(zd_search,"enterkeyword"); // focus back to enterkeyword widget zfree(txkeyword); return 1; } // defined keyword was clicked int search_defkeywords_clickfunc(GtkWidget *widget, int line, int pos, ch *input) { using namespace search_images; ch *txkeyword, end = 0; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txkeyword = txwidget_word(widget,line,pos,",;:",end); if (! txkeyword || end == ':') return 1; // nothing or keyword category, ignore add_keyword(txkeyword,shkeywords,searchkeywordsXcc); // add to search keyword list zdialog_stuff(zd_search,"shkeywords",shkeywords); zfree(txkeyword); return 1; } // search images dialog event and completion callback function int search_dialog_event(zdialog *zd, ch *event) { using namespace search_images; int search_metadata_dialog(zdialog *zd); void search_main(); void search_xmeta(); void search_add_related_files(void); int search_metadata_report(void); ch dateLoDefault[20] = "0000:01:01 00:00:00"; // start of time ch dateHiDefault[20] = "2099:12:31 23:59:59"; // end of time ch *file; ch mm[4] = "mm"; int ii, jj, err, cc; int nt, cc1, cc2, ff; float fnum; ch *pp, *pp1, *pp2; ch enterkeyword[keywordXcc], matchkeywords[20][keywordXcc]; ch matchkeywordstext[(keywordXcc+2)*20]; ch catgname[keywordXcc]; ch albumfile[200]; ch tagx[8] = "tagx", valuex[8] = "valuex", matchx[8] = "matchx"; ch wname[8], temp[100]; FILE *srfid; // search results output file if (strmatch(event,"proceed")) zd->zstat = 4; // "proceed" from autosearch if (zd->zstat < 0 || zd->zstat == 5) return 1; // canceled if (zd->zstat == 1) { // [load] settings from file zd->zstat = 0; zdialog_load_widgets(zd,0,"saved_searches",0); // folder name under get_zhomedir() zdialog_fetch(zd,"shkeywords",shkeywords,searchkeywordsXcc); strcat(shkeywords," "); // trailing blank after "keywordname," return 1; } if (zd->zstat == 2) { // [save] settings to file zd->zstat = 0; zdialog_save_widgets(zd,0,"saved_searches",0); return 1; } if (zd->zstat == 3) // [clear] selection criteria { zd->zstat = 0; // keep dialog active zdialog_stuff(zd,"allimages",1); zdialog_stuff(zd,"currset",0); zdialog_stuff(zd,"newset",1); zdialog_stuff(zd,"addset",0); zdialog_stuff(zd,"remset",0); zdialog_stuff(zd,"repgallery",1); zdialog_stuff(zd,"repmeta",0); zdialog_stuff(zd,"org ver",0); zdialog_stuff(zd,"last ver",0); zdialog_stuff(zd,"all vers",0); zdialog_stuff(zd,"allkeywords",0); zdialog_stuff(zd,"anykeywords",1); zdialog_stuff(zd,"alltext",0); zdialog_stuff(zd,"anytext",1); zdialog_stuff(zd,"allfiles",0); zdialog_stuff(zd,"anyfiles",1); zdialog_stuff(zd,"datefrom",""); zdialog_stuff(zd,"dateto",""); zdialog_stuff(zd,"photodate",1); zdialog_stuff(zd,"filedate",0); zdialog_stuff(zd,"ratingfrom",""); zdialog_stuff(zd,"ratingto",""); zdialog_stuff(zd,"shkeywords",""); zdialog_stuff(zd,"shtext",""); zdialog_stuff(zd,"shfiles",""); zdialog_stuff(zd,"searchlocs",""); *shkeywords = 0; Flocs = 0; *shLocs = 0; Nxtags = 0; for (ii = 0; ii < Nxtagsmax; ii++) { // erase extra search tags tagx[3] = '0' + ii; valuex[5] = '0' + ii; matchx[5] = '0' + ii; zdialog_stuff(zd,tagx,""); zdialog_stuff(zd,matchx,""); zdialog_stuff(zd,valuex,""); } return 1; } if (zd->zstat == 4) { // [proceed] with search zd->zstat = 0; // keep dialog active goto validate; } if (strmatch(event,"org ver")) // get original image version 25.1 zdialog_stuff(zd,"all vers",0); // implies not all versions if (strmatch(event,"last ver")) // get last version zdialog_stuff(zd,"all vers",0); // implies not all versions if (strmatch(event,"all vers")) { // get all versions zdialog_stuff(zd,"org ver",0); // implies not original version zdialog_stuff(zd,"last ver",0); // implies not last version } if (strmatch(event,"enterkeyword")) // new keyword is being typed in { zdialog_stuff(zd,"matchkeywords",""); // clear matchkeywords in dialog zdialog_fetch(zd,"enterkeyword",enterkeyword,keywordXcc); // get chars. typed so far cc1 = strlen(enterkeyword); for (ii = jj = 0; ii <= cc1; ii++) { // remove foul characters if (strchr(",:;",enterkeyword[ii])) continue; enterkeyword[jj++] = enterkeyword[ii]; } if (jj < cc1) { // something was removed enterkeyword[jj] = 0; cc1 = jj; zdialog_stuff(zd,"enterkeyword",enterkeyword); } if (cc1 < 2) return 1; // wait for at least 2 chars. for (ii = nt = 0; ii < maxkeywordcats; ii++) // loop all categories { pp2 = defined_keywords[ii]; // category: aaaaaa, bbbbb, ... keywordN, if (! pp2) continue; // | | pp2 = strchr(pp2,':'); // pp1 pp2 while (true) // loop all defkeywords in category { pp1 = pp2 + 2; if (! *pp1) break; pp2 = strchr(pp1,','); if (! pp2) break; if (strmatchcaseN(enterkeyword,pp1,cc1)) { // defkeyword matches chars. typed so far cc2 = pp2 - pp1; strncpy(matchkeywords[nt],pp1,cc2); // save defkeywords that match matchkeywords[nt][cc2] = 0; if (++nt == 20) return 1; // quit if 20 matches or more } } } if (nt == 0) return 1; // no matches pp1 = matchkeywordstext; for (ii = 0; ii < nt; ii++) // make list: aaaaa, bbb, cccc ... { strcpy(pp1,matchkeywords[ii]); pp1 += strlen(pp1); strcpy(pp1,", "); pp1 += 2; } zdialog_stuff(zd,"matchkeywords",matchkeywordstext); // stuff matchkeywords in dialog return 1; } if (strmatch(event,"defcats")) { // new keyword category selection zdialog_fetch(zd,"defcats",catgname,keywordXcc); defkeywords_stuff(zd,catgname); } if (strstr(event,"tag")) // metadata tagN selected { snprintf(wname,8,"match%c",event[3]); // widget tagN >> widget matchN zdialog_stuff(zd,wname,"report"); // set "report" default operator } if (strstr(event,"clear")) // extra search tag clear button { ii = event[5]; // character N tagx[3] = ii; valuex[5] = ii; matchx[5] = ii; zdialog_stuff(zd,tagx,""); zdialog_stuff(zd,matchx,""); zdialog_stuff(zd,valuex,""); } if (strstr(event,"tag")) { for (ii = 0; ii < Nxtagsmax; ii++) // if extra search tag "(other)" { // get tag name from user tagx[3] = '0' + ii; valuex[5] = '0' + ii; zdialog_fetch(zd,tagx,temp,100); if (strmatch(temp,"(other)")) { pp = zdialog_text1(zd->parent,TX("enter tag name"),0); if (pp) { zdialog_stuff(zd,tagx,pp); zfree(pp); } else zdialog_stuff(zd,tagx,""); } } } for (ii = 0; ii < Nxtagsmax; ii++) // if extra search tag match type { // "report" or "reportx", clear match value valuex[5] = '0' + ii; matchx[5] = '0' + ii; zdialog_fetch(zd,matchx,temp,20); if (strstr("report reportx",temp)) zdialog_stuff(zd,valuex,""); // causes gtk error but works OK } return 1; // wait for dialog completion // Inputs are complete. Validate all inputs. ----------------------------------- validate: zdialog_fetch(zd,"allimages",Fscanall); // search all images zdialog_fetch(zd,"currset",Fscancurr); // search current set (gallery) zdialog_fetch(zd,"newset",Fnewset); // matching images --> new set zdialog_fetch(zd,"addset",Faddset); // add matching image to set zdialog_fetch(zd,"remset",Fremset); // remove matching images from set if (Fremset && Fscanall) { // illogical search zmessageACK(Mwin,TX("to remove images from current set, \n" "search current set")); zd->zstat = 0; // keep dialog active return 1; } if (Faddset && Fscancurr) { zmessageACK(Mwin,TX("to add images to current set, \n" "search all images")); zd->zstat = 0; // keep dialog active return 1; } zdialog_fetch(zd,"repgallery",Frepgallery); // gallery report zdialog_fetch(zd,"repmeta",Frepmeta); // metadata report zdialog_fetch(zd,"org ver",Forgver); // get original image 25.1 zdialog_fetch(zd,"last ver",Flastver); // get last version zdialog_fetch(zd,"all vers",Fallvers); // get original and all versions zdialog_fetch(zd,"datefrom",shDateFrom,20); // get search date range zdialog_fetch(zd,"dateto",shDateTo,20); zdialog_fetch(zd,"photodate",Fphotodate); // photo or file date zdialog_fetch(zd,"filedate",Ffiledate); zdialog_fetch(zd,"ratingfrom",shRatingFr,2); // get search rating range zdialog_fetch(zd,"ratingto",shRatingTo,2); zdialog_fetch(zd,"shkeywords",shkeywords,searchkeywordsXcc); // get search keywords zdialog_fetch(zd,"shtext",shtext,searchkeywordsXcc); // get search text* zdialog_fetch(zd,"shfiles",shfiles,searchkeywordsXcc); // get search /path*/file* zdialog_fetch(zd,"searchlocs",shLocs,200); // get search locations zdialog_fetch(zd,"allkeywords",Fallkeywords); // get match all/any options zdialog_fetch(zd,"alltext",Falltext); zdialog_fetch(zd,"allfiles",Fallfiles); zdialog_fetch(zd,"alllocs",Falllocs); Fnulldate = 0; Fdaterange = 0; if (strmatchcase(shDateFrom,"null")) { // search for missing photo date Fnulldate = 1; // (user input "null") Fphotodate = 1; // force photo date search Ffiledate = 0; Fdaterange = 0; zdialog_stuff(zd,"photodate",1); // photo date will be tested zdialog_stuff(zd,"filedate",0); } if (! Fnulldate && (*shDateFrom || *shDateTo)) // complete partial date/time data { Fdaterange = 1; cc = strlen(shDateFrom); for (ii = cc; ii < 20; ii++) // default date from: shDateFrom[ii] = dateLoDefault[ii]; // 0000-01-01 00:00:00 cc = strlen(shDateTo); for (ii = cc; ii < 20; ii++) // default date to: shDateTo[ii] = dateHiDefault[ii]; // 2099-12-31 23:59:59 if (cc == 7) { // input was yyyy:mm strncpy(mm,shDateTo+5,2); // get mm = "01" .. "12" if (strstr("04 06 09 11",mm)) memmove(shDateTo+8,"30",2); // set dd = 30 for these months if (strmatch(mm,"02")) { memmove(shDateTo+8,"28",2); // set dd = 28 for month 02 ii = atoi(shDateTo); if (ii == (ii/4)*4) memmove(shDateTo+8,"29",2); // set dd = 29 if leap year } } ff = 0; // check search dates reasonable if (! checkDT(shDateFrom)) ff = 1; // invalid year/mon/day (e.g. mon 13) if (! checkDT(shDateTo)) ff = 1; // or hour/min/sec (e.g. hour 33) if (strcmp(shDateFrom,shDateTo) > 0) ff = 1; // search-from date > search-to date if (ff) { zmessageACK(Mwin,TX("invalid date range: %s %s"),shDateFrom,shDateTo); zd->zstat = 0; Fdaterange = 0; return 1; } } Frating = 0; if (*shRatingFr || *shRatingTo) { Frating = 1; // rating was given ii = *shRatingFr; if (! ii) ii = '0'; if (ii < '0' || ii > '5') Frating = 0; // validate inputs jj = *shRatingTo; if (! jj) jj = '5'; if (jj < '0' || jj > '5') Frating = 0; if (jj < ii) Frating = 0; if (! Frating) { zmessageACK(Mwin,TX("invalid rating range")); zd->zstat = 0; return 1; } } Ffiles = 0; if (*shfiles) Ffiles = 1; // search path / file (fragment) was given Ftext = 0; if (*shtext) Ftext = 1; // search text was given Fkeywords = 0; if (*shkeywords) Fkeywords = 1; // search keywords was given Flocs = 0; if (*shLocs) Flocs = 1; // search locations was given Nxtags = 0; for (ii = jj = 0; ii < Nxtagsmax; ii++) // process extra search tags { tagx[3] = '0' + ii; matchx[5] = '0' + ii; valuex[5] = '0' + ii; zdialog_fetch(zd,tagx,srchtags[ii],metatagXcc); // get search tag strCompress(srchtags[ii]); // remove all blanks from tag names if (*srchtags[ii] <= ' ') { zdialog_stuff(zd,matchx,""); // empty search tag position zdialog_stuff(zd,valuex,""); continue; } memmove(srchtags[jj],srchtags[ii],metatagXcc); // repack blank tags zdialog_fetch(zd,matchx,temp,20); // get corresp. match type if (strmatch(temp,"report")) machtyp[jj] = 'r'; else if (strmatch(temp,"reportx")) machtyp[jj] = 'x'; else if (strmatch(temp,"matches")) machtyp[jj] = 'm'; else if (strmatch(temp,"contains")) machtyp[jj] = 'c'; else if (strmatch(temp,"number =")) machtyp[jj] = '='; else if (strmatch(temp,"number =>")) machtyp[jj] = '>'; else if (strmatch(temp,"number <=")) machtyp[jj] = '<'; else { zdialog_stuff(zd,matchx,"report"); // unspecified >> report machtyp[jj] = 'r'; } if (machtyp[jj] == 'r' || machtyp[jj] == 'x') { // force metadata report type 26.0 zdialog_stuff(zd,"repgallery",0); zdialog_stuff(zd,"repmeta",1); Frepgallery = 0; Frepmeta = 1; } zdialog_fetch(zd,valuex,machvals[ii],100); // get corresp. match value strTrim2(machvals[jj],machvals[ii]); // trim leading and trailing blanks if (strstr(temp,"number")) { // check numeric values err = convSF(machvals[jj],fnum); if (err) { snprintf(temp,100,TX("need numeric match value: %s"),srchtags[jj]); zmessageACK(Mwin,temp); zd->zstat = 0; return 1; } } if (ii > jj) *srchtags[ii] = *machvals[ii] = 0; jj++; } Nxtags = jj; // extra search tags count for (ii = 0; ii < Nxtags; ii++) // classify extra search tags 26.0 tagindexed[ii] = metatagtype(srchtags[ii]); // Begin search ------------------------------------------------------------- // Scan all files or current set (gallery) // Test files against select criteria in search dialog if (Fscanall) Nscan = Nxxrec; // scan all files if (Fscancurr) Nscan = navi::Gfiles; // scan current set (current gallery) if (! Nscan) { Ncurrset = 0; goto search_complete; } cc = Nscan * sizeof(ch *); // list of files to scan scanfiles = (ch **) zmalloc(cc,"search"); for (ii = 0; ii < Nscan; ii++) // create scanfiles[] list { file = 0; if (Fscanall) file = xxrec_tab[ii]->file; // all files from xxrec_tab[] if (Fscancurr) file = gallery(0,"getR",ii); // current gallery files scanfiles[ii] = file; } cc = maximages * sizeof(int); // memory for selected files passfiles = (int *) zmalloc(cc,"search"); // (ii --> xxrec_tab[ii]) 25.1 Npass = 0; search_main(); // test main select criteria search_xmeta(); // test extra search tags 26.0 search_add_related_files(); // add related files (org/last/all versions) if (Fescape) goto usercancel; // user killed search if (Fnewset) { /* do nothing */ } // new set: no changes if (Faddset) // add results to prior results 25.1 { for (ii = 0; ii < navi::Gfiles; ii++) // add gallery files (prior results) passfiles[Npass++] = xxrec_index(gallery(0,"getR",ii)); // to selected files HeapSort(passfiles,Npass); // sort passfiles for (ii = jj = 0; ii < Npass; ii++) { // eliminate duplicates if (passfiles[ii] == passfiles[jj]) continue; passfiles[++jj] = passfiles[ii]; } Npass = jj + 1; } if (Fremset) // remove results from prior results 25.1 { for (ii = 0; ii < navi::Gfiles; ii++) // add gallery files (prior results) passfiles[Npass++] = xxrec_index(gallery(0,"getR",ii)); // to selected files HeapSort(passfiles,Npass); // sort passfiles for (ii = 0; ii < Npass-1; ii++) { // duplicate pairs = -1 if (passfiles[ii] == passfiles[ii+1]) { passfiles[ii] = passfiles[ii+1] = -1; ii++; } } for (ii = jj = 0; ii < Npass; ii++) { // remove -1 pairs if (passfiles[ii] > -1) passfiles[jj++] = passfiles[ii]; } Npass = jj; } if (Npass) { srfid = fopen(searchresults_file,"w"); // open new output file 25.1 if (! srfid) goto filerror; for (ii = 0; ii < Npass; ii++) // passfiles[] --> search results file { jj = passfiles[ii]; file = xxrec_tab[jj]->file; cc = fprintf(srfid,"%s\n",file); if (! cc) break; } fclose(srfid); if (! cc) goto filerror; } Ncurrset = Npass; // current set, including last results // search complete ------------------------------------------------------------- search_complete: Fescape = 0; if (scanfiles) zfree(scanfiles); scanfiles = 0; if (passfiles) zfree(passfiles); passfiles = 0; printf("search count: %d \n", Ncurrset); if (Ncurrset == 0) { if (Fnewset || Faddset) zmessageACK(Mwin,TX("nothing found")); if (Fremset) zmessageACK(Mwin,TX("nothing left, no change made")); return 1; } snprintf(albumfile,200,"%s/search_results",albums_folder); // save search results in the err = cp_copy(searchresults_file,albumfile); // album "search_results" if (err) zmessageACK(Mwin,strerror(err)); navi::gallerytype = SEARCH; // normal search results gallery(searchresults_file,"initF",0); // generate gallery of matching files if (Frepmeta) { // metadata report format navi::gallerytype = META; // report search_metadata_report(); m_metaview(0,0); } else m_thumbview(0,0); return 1; usercancel: // cancel via escape key zmessage_post(Mwin,"parent",1,TX("function canceled")); Fescape = 0; if (scanfiles) zfree(scanfiles); scanfiles = 0; if (passfiles) zfree(passfiles); passfiles = 0; return 1; filerror: zmessageACK(Mwin,TX("file error: %s"),strerror(errno)); Fescape = 0; if (scanfiles) zfree(scanfiles); scanfiles = 0; if (passfiles) zfree(passfiles); passfiles = 0; return 1; } // Test image files against main selection criteria // Mark matching files void search_main() { using namespace search_images; int ii, jj, ff, iis, iit, iif; int Nmatch, Nnomatch, match1; ch *pps, *ppf, *ppt; ch *file; xxrec_t *xxrec; if (! Nscan) { Npass = 0; return; } for (ff = 0; ff < Nscan; ff++) // loop through files to scan { zmainloop(); if (Fescape) { // 25.1 Npass = 0; return; } file = scanfiles[ff]; xxrec = get_xxrec(file); if (! xxrec) goto nomatch; // deleted, not an image file if (Ffiles) // file name match is wanted { Nmatch = Nnomatch = 0; for (ii = 1; ; ii++) { pps = substringR(shfiles," ,",ii); // step thru search file names if (! pps) break; if (strcasestr(file,pps)) Nmatch++; // use substring matching else Nnomatch++; zfree(pps); } if (Nmatch == 0) goto nomatch; // no match any file if (Fallfiles && Nnomatch) goto nomatch; // no match all files } if (Fnulldate && *xxrec->pdate) goto nomatch; // missing photo date wanted else if (Fdaterange) // from-to date range specified { if (Fphotodate) { if (! *xxrec->pdate) goto nomatch; // test photo date if (strcmp(xxrec->pdate,shDateFrom) < 0) goto nomatch; if (strcmp(xxrec->pdate,shDateTo) > 0) goto nomatch; } if (Ffiledate) { // test file mod date if (strcmp(xxrec->fdate,shDateFrom) < 0) goto nomatch; if (strcmp(xxrec->fdate,shDateTo) > 0) goto nomatch; } } if (Fnulldate && *xxrec->pdate) goto nomatch; // select for null photo date if (Fkeywords) // keywords match is wanted { Nmatch = Nnomatch = 0; if (! xxrec->keywords) // file has no keywords 25.1 { for (iis = 1; ; iis++) // step thru search keywords { pps = substringR(shkeywords,",;",iis); // delimited if (! pps) break; if (strmatch(pps,"null")) Nmatch++; // "null" keyword wanted, match zfree(pps); } } for (iis = 1; ; iis++) // step thru search keywords { pps = substringR(shkeywords,",;",iis); // delimited if (! pps) break; if (*pps == 0) { zfree(pps); continue; } for (iif = 1; ; iif++) // step thru file keywords { ppf = substringR(xxrec->keywords,",;",iif); // count matches and fails if (! ppf) { Nnomatch++; // no keyword matched break; } if (strmatch(pps,ppf)) { Nmatch++; // 1 or more keyword matches zfree(ppf); break; } else zfree(ppf); } zfree(pps); } if (Nmatch == 0) goto nomatch; // no match to any keyword if (Fallkeywords && Nnomatch) goto nomatch; // no match to all keywords } if (Frating) // rating match is wanted { if (*shRatingFr && xxrec->rating[0] < *shRatingFr) goto nomatch; if (*shRatingTo && xxrec->rating[0] > *shRatingTo) goto nomatch; } if (Ftext) // text match is wanted { Nmatch = Nnomatch = 0; for (iis = 1; ; iis++) // step through search words { pps = substringR(shtext,", ",iis); if (! pps) break; match1 = 0; for (iit = 1; ; iit++) // step through title words { ppt = substringR(xxrec->title," ,.;:?/'\"",iit); // delimiters: blank , . ; : ? / ' " if (! ppt) break; if (strcasestr(ppt,pps)) match1 = 1; // match search amd title words zfree(ppt); if (match1) break; } if (! match1) { for (iit = 1; ; iit++) // step through description words { ppt = substringR(xxrec->desc," ,.;:?/'\"",iit); if (! ppt) break; if (strcasestr(ppt,pps)) match1 = 1; // match search and description words zfree(ppt); if (match1) break; } } if (match1) Nmatch++; // count words matched and not matched else Nnomatch++; zfree(pps); } if (Nmatch == 0) goto nomatch; // no match to any word if (Falltext && Nnomatch) goto nomatch; // no match to all words } if (Flocs ) // location match is wanted { Nmatch = Nnomatch = 0; for (iis = 1; ; iis++) // step thru search locations { pps = substringR(shLocs,',',iis); // comma delimiter 25.3 if (! pps) break; if (strcasestr(xxrec->location,pps)) Nmatch++; else if (strcasestr(xxrec->country,pps)) Nmatch++; else Nnomatch++; zfree(pps); } if (! Nmatch) goto nomatch; // no match found if (Falllocs && Nnomatch) goto nomatch; } continue; // file passed main select criteria nomatch: // file does not match scanfiles[ff] = 0; // remove from scanfiles list continue; } for (ii = jj = 0; ii < Nscan; ii++) // passfiles[] = remaining scanfiles[] if (scanfiles[ii]) passfiles[jj++] = xxrec_index(scanfiles[ii]); // 25.1 Npass = jj; // count of passed files return; } // Test extra search tags against select criteria. // Use meta_getN() to get all search tags: // in xxrec_tab[], in extra indexed metadata, not indexed. void search_xmeta() { using namespace search_images; int searchmeta_test1(ch *tagval, ch machtyp, ch *machvals); ch **passfiles2; ch **tagval2; ch *xtag[xmetaXtags], *xval[xmetaXtags]; int ii, jj, jj1, jj2; int ff, cc, NK, pass; if (! Npass) return; if (! Nxtags) return; NK = Nxtags; cc = Npass * sizeof(ch *); // allocate memory for file names passfiles2 = (ch **) zmalloc(cc,"search"); for (ii = 0; ii < Npass; ii++) { // convert list of xxrec_tab indexes jj = passfiles[ii]; // to list of file names passfiles2[ii] = xxrec_tab[jj]->file; } cc = Npass * NK * sizeof(ch *); // allocate space for returned data tagval2 = (ch **) zmalloc(cc,"search"); meta_getN(passfiles2,Npass,srchtags,tagval2,NK,0); // get metadata for all files for (ff = 0; ff < Npass; ff++) // loop through files to scan { zmainloop(); if (Fescape) { Npass = 0; goto retx; } jj1 = ff * NK; // tagval2[] range for file[ff] jj2 = jj1 + NK; for (ii = 0, jj = jj1; jj < jj2; ii++, jj++) { // get tag names and values for file[ff] xtag[ii] = srchtags[ii]; xval[ii] = tagval2[jj]; } for (ii = 0; ii < NK; ii++) // loop search tags { for (jj = 0; jj < NK; jj++) // find matching file tag data { if (strmatchcase(srchtags[ii],xtag[jj])) { // if found, test metadata pass = searchmeta_test1(xval[jj],machtyp[ii],machvals[ii]); // against select criteria if (! pass) goto nomatch; // fail, no more testing needed break; } } } continue; // file metadata fits criteria, next file nomatch: // metadata does not match passfiles[ff] = -1; // remove file from pass list continue; // next file } for (ii = jj = 0; ii < Npass; ii++) // remove non-matching files from list 25.1 if (passfiles[ii] >= 0) passfiles[jj++] = passfiles[ii]; Npass = jj; // count of passed files retx: for (ii = 0; ii < Npass * NK; ii++) // free memory from meta_getN() if (tagval2[ii]) zfree(tagval2[ii]); zfree(tagval2); zfree(passfiles2); // free file names list return; } // test a single metadata tag/value against select criteria int searchmeta_test1(ch *tagval, ch machtyp, ch *machvals) { using namespace search_images; int nth, n1, n2, n3, mm; ch *pps, *ppm; float Ftagval = 0, Fsearchval; if (machtyp == 'r') return 1; // tag value reported, not tested if (machtyp == 'x') { // exists, reported, not tested if (tagval && *tagval > ' ') return 1; // tag value present, pass 26.0 else return 0; // no data, fail } if (! tagval || ! *tagval) { // no metadata present 26.0 if (! machvals || *machvals <= ' ') return 1; // search is for empty data, pass return 0; // fail } if (strchr("= > <",machtyp)) { // real value, look for N/N format Ftagval = atofz(tagval); n1 = sscanf(tagval,"%d/%d",&n2,&n3); if (n1 == 2) Ftagval = 1.0 * n2 / n3; } for (nth = 1; ; nth++) // loop all search values { pps = substringR(machvals,',',nth); // comma delimiter if (! pps) return 0; // no more, no match found if (machtyp == 'm') { // tag matches any value mm = strcasecmp(tagval,pps); // match not case sensitive zfree(pps); if (mm == 0) return 1; // match } else if (machtyp == 'c') { // tag contains any value ppm = strcasestr(tagval,pps); // match not case sensitive zfree(pps); if (ppm) return 1; // found } else if (machtyp == '=') { // numeric tag equals any value Fsearchval = atofz(pps); zfree(pps); if (Ftagval == Fsearchval) return 1; // found match } else if (machtyp == '>') { // numeric tag >= one value Fsearchval = atofz(pps); zfree(pps); if (Ftagval >= Fsearchval) return 1; // found match } else if (machtyp == '<') { // numeric tag <= one value Fsearchval = atofz(pps); zfree(pps); if (Ftagval <= Fsearchval) return 1; // found match } else { printf("*** searchmeta invalid machtyp %c \n",machtyp); zfree(pps); return 0; } } } // add related files to search results if wanted // (original image, last version, all versions) void search_add_related_files() // overhauled 25.1 { using namespace search_images; int cc, ii, jj, nv, Npass2; int *flist; ch **vlist; ch *file, *file2; ch *pp1, *pp2; if (! Npass) return; // no search result if (Forgver + Flastver + Fallvers == 0) return; // no add related files cc = Npass * sizeof(int); flist = (int *) zmalloc(cc,"search"); for (ii = 0; ii < Npass; ii++) // copy search results to flist flist[ii] = passfiles[ii]; for (ii = 1; ii < Npass; ii++) // reduce flist to one file version { // for each group of file versions zmainloop(); if (Fescape) { Npass = 0; goto retx; } jj = flist[ii]; // search results file file = xxrec_tab[jj]->file; pp1 = strrchr(file,'/'); if (! pp1) continue; pp1 = strrchr(pp1,'.'); if (! pp1) continue; // /.../filename.vNN.ext pp2 = pp1 - 4; // | | | if (strmatchN(pp2,".v",2) && // file pp2 pp1 (pp2[2] >= '0' && pp2[2] <= '9') && (pp2[3] >= '0' && pp2[3] <= '9')) cc = pp2 - file + 1; // versioned file: filename.vNN.ext else cc = pp1 - file + 1; // original filename jj = flist[ii-1]; // prior search results file file2 = xxrec_tab[jj]->file; if (strmatchN(file,file2,cc)) // if same base name, eliminate prior flist[ii-1] = -1; } // retain only last file in family Npass2 = Npass; for (ii = 0; ii < Npass; ii++) // loop all files in flist { zmainloop(); jj = flist[ii]; if (jj < 0) continue; // skip removed file file = xxrec_tab[jj]->file; vlist = file_all_versions(file,nv); // get file original + all versions if (! vlist) continue; // should not happen if (Forgver && Flastver && nv == 1) { // original + last version wanted passfiles[Npass2++] = xxrec_index(vlist[0]); // and only 1 file exists zfree(vlist); // add file to search results continue; // stop here } if (Forgver) // original (or 1st vers.) wanted passfiles[Npass2++] = xxrec_index(vlist[0]); // add to search resulta if (Flastver) // last version wanted passfiles[Npass2++] = xxrec_index(vlist[nv-1]); // add to search results if (Fallvers) { // all versions wanted for (jj = 0; jj < nv; jj++) // (excludes original and last) passfiles[Npass2++] = xxrec_index(vlist[jj]); // add to search results } zfree(vlist); } Npass = Npass2; // new search results count HeapSort(passfiles,Npass); // sort passfiles for (ii = jj = 0; ii < Npass; ii++) { // eliminate duplicates if (passfiles[ii] == passfiles[jj]) continue; passfiles[++jj] = passfiles[ii]; } Npass = jj + 1; // new passfiles count retx: zfree(flist); // free flist return; } // Report selected files using a gallery window layout // with image thumbnails and selected metadata text. int search_metadata_report() { using namespace search_images; using namespace navi; int ff, ii, jj, cc; ch *file = 0, **repfiles = 0, **tagval = 0; ch *pp; ch psize2[20]; float fsize; ch text1[3000], text2[400]; // text1 size to rule out overflow xxrec_t *xxrec; if (! Gfiles) { // curr. gallery files printf("metadata report, 0 files \n"); return 0; } if (Nxtags) { cc = Gfiles * sizeof(ch *); // make file list from curr. gallery repfiles = (ch **) zmalloc(cc,"search"); for (ff = 0; ff < Gfiles; ff++) repfiles[ff] = gallery(0,"getR",ff); cc = Gfiles * Nxtags * sizeof(ch **); // allocate pointers for returned metadata tagval = (ch **) zmalloc(cc,"search"); meta_getN(repfiles,Gfiles,srchtags,tagval,Nxtags,0); // get Nxtags tagval per repfile } for (ff = 0; ff < Gfiles; ff++) // scan all images in gallery { zmainloop(); file = gallery(0,"getR",ff); if (! file) continue; xxrec = get_xxrec(file); // get metadata available in index table if (! xxrec) continue; // deleted, not an image file snprintf(text2,400,TX("Photo Date: %s File Date: %s \n"), // 25.1 xxrec->pdate, xxrec->fdate); strcpy(text1,text2); cc = strlen(text1); strncpy0(psize2,xxrec->psize,20); // pixel size, 12345 6789 pp = strchr(psize2,' '); if (pp && psize2 - pp < (int) strlen(psize2) - 2) *pp = 'x'; // 12345x6789 fsize = atof(xxrec->fsize)/MEGA; snprintf(text2,400,TX("Rating: %s Size: %s %.2fmb \n"), xxrec->rating, psize2, fsize); strcpy(text1+cc,text2); cc += strlen(text2); snprintf(text2,400,"Camera: %s %s %s\n",xxrec->make,xxrec->model,xxrec->lens); strcpy(text1+cc,text2); cc += strlen(text2); snprintf(text2,400,"Keywords: %s\n",xxrec->keywords); strcpy(text1+cc,text2); cc += strlen(text2); snprintf(text2,400,"Location: %s %s\n",xxrec->location,xxrec->country); strcpy(text1+cc,text2); cc += strlen(text2); snprintf(text2,400,TX("Title: %s\n"),xxrec->title); strcpy(text1+cc,text2); cc += strlen(text2); snprintf(text2,400,TX("Description: %s\n"),xxrec->desc); strcpy(text1+cc,text2); cc += strlen(text2); if (Gindex[ff].mdata1) zfree(Gindex[ff].mdata1); // standard metadata report text Gindex[ff].mdata1 = zstrdup(text1,"search"); if (Gindex[ff].mdata2) zfree(Gindex[ff].mdata2); // clear user selected metadata Gindex[ff].mdata2 = 0; if (Nxtags) // get user selected metadata to report { ii = ff * Nxtags; // metadata values for this file for (cc = jj = 0; jj < Nxtags; jj++, ii++) { if (strmatch(srchtags[jj],"FileName")) // meta_getN() only reports seq. no. 26.0 snprintf(text2,400,TX("File Name: %s \n"),file); else snprintf(text2,400,"%s: %s \n",srchtags[jj], tagval[ii]); if (cc + strlen(text2) > 2999) break; // text1 limit strcpy(text1+cc,text2); cc += strlen(text2); } Gindex[ff].mdata2 = zstrdup(text1,"search"); // user selected metadata report text } } Gmdrows = 6 + Nxtags; // report rows if (Nxtags) { zfree(repfiles); for (ii = 0; ii < Gfiles * Nxtags; ii++) // free tagval memory if (tagval[ii]) zfree(tagval[ii]); zfree(tagval); } gallerytype = META; // gallery type = search results/metadata return 0; } /**************************************************************************************/ // validate a date/time string formatted "yyyy:mm:dd [hh:mm[:ss]]" // valid year is 0000 to 2099 // return 0 if bad, 1 if OK int checkDT(ch *datetime) // format changed { int monlim[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int cc, year, mon, day, hour, min, sec; cc = strlen(datetime); if (cc < 10) return 0; if (datetime[4] != ':') return 0; // check yyyy:mm:dd if (datetime[7] != ':') return 0; year = atoi(datetime); mon = atoi(datetime+5); day = atoi(datetime+8); if (year < 0 || year > 2099) return 0; if (mon < 1 || mon > 12) return 0; if (day < 1 || day > monlim[mon-1]) return 0; if (mon == 2 && day == 29 && (year % 4)) return 0; if (cc == 10) return 1; // year only is present if (cc == 11 && datetime[10] == ' ') { // allow trailing blank, remove it datetime[10] = 0; return 1; } if (datetime[10] != ' ') return 0; // 1 blank between date and time if (datetime[13] != ':') return 0; // check hh:mm if (cc == 19 && datetime[16] != ':') return 0; // or hh:mm:ss hour = atoi(datetime+11); min = atoi(datetime+14); if (cc == 19) sec = atoi(datetime+17); else sec = 0; if (hour < 0 || hour > 23) return 0; if (min < 0 || min > 59) return 0; if (sec < 0 || sec > 59) return 0; return 1; } /**************************************************************************************/ // add input keyword to output keyword list if not already there and enough room // returns: 0 = added OK 1 = already there (case ignored) // 2 = overflow 3 = bad keyword name 4 = null/blank keyword int add_keyword(ch *keyword, ch *keywordlist, int maxcc) { ch *pp1, *pp2, keyword1[keywordXcc]; int cc, cc1, cc2; if (! keyword || ! *keyword) return 4; strncpy0(keyword1,keyword,keywordXcc); // remove leading and trailing blanks cc = strTrim2(keyword1); if (! cc) return 4; if (utf8_check(keyword1)) return 3; // look for bad characters if (strpbrk(keyword1,",;:")) return 3; strcpy(keyword,keyword1); pp1 = keywordlist; cc1 = strlen(keyword); while (true) // check if already in keyword list { while (*pp1 == ' ' || *pp1 == ',') pp1++; if (! *pp1) break; pp2 = pp1 + 1; while (*pp2 && *pp2 != ',') pp2++; cc2 = pp2 - pp1; if (cc2 == cc1 && strmatchcaseN(keyword,pp1,cc1)) return 1; pp1 = pp2; } cc1 = strlen(keywordlist); cc2 = strlen(keyword); while (cc1 > 0 && keywordlist[cc1-1] == ' ') cc1--; // remove ',' and ' ' from end if present while (cc1 > 0 && keywordlist[cc1-1] == ',') cc1--; // (prior fotocx quirk) if (cc1 + cc2 + 3 > maxcc) return 2; // no room for ", " + new keyword if (cc1 > 0) { strcpy(keywordlist + cc1,", "); // oldkeyword, oldkeyword, newkeyword cc1 += 2; } strcpy(keywordlist + cc1, keyword); return 0; } // remove keyword from keywordlist, if present // returns: 0 if found and deleted, otherwise 1 int del_keyword(ch *keyword, ch *keywordlist) { int ii, cc, ftcc, atcc, found; ch *tempkeywords; ch *pp; tempkeywords = zstrdup(keywordlist,"delete-keyword"); *keywordlist = 0; ftcc = found = 0; for (ii = 1; ; ii++) { pp = substring(tempkeywords,",;",ii); // next keyword if (! pp) break; if (*pp == 0) continue; if (strmatchcase(pp,keyword)) { // skip matching keyword found = 1; continue; } atcc = strlen(pp); // copy non-matching keyword strcpy(keywordlist + ftcc, pp); ftcc += atcc; strcpy(keywordlist + ftcc, ", "); // + delim + blank ftcc += 2; } cc = strlen(keywordlist); while(cc > 0 && keywordlist[cc-1] == ' ') cc--; // remove trailing ", " if present while(cc > 0 && keywordlist[cc-1] == ',') cc--; keywordlist[cc] = 0; zfree(tempkeywords); return 1-found; } // add new keyword to recent keywords, if not already. // remove oldest to make space if needed. int add_recenkeyword(ch *keyword) { int err; ch *pp, tempkeywords[recentkeywordsXcc]; err = add_keyword(keyword,recent_keywords,recentkeywordsXcc); // add keyword to recent keywords while (err == 2) // overflow { strncpy0(tempkeywords,recent_keywords,recentkeywordsXcc); // remove oldest to make room pp = strpbrk(tempkeywords,",;"); if (! pp) return 0; strcpy(recent_keywords,pp+2); // delimiter + blank before keyword err = add_keyword(keyword,recent_keywords,recentkeywordsXcc); } return 0; } /**************************************************************************************/ // Load keywords_defined file into defined_keywords[ii] => category: keyword1, keyword2, ... // Read image_index recs. and add unmatched keywords: => nocatg: keyword1, keyword2, ... // force: read image index and build defkeywords list void load_defkeywords(int force) { static int Floaded = 0; FILE * fid; xxrec_t *xxrec; int ii, jj, nkeywords, err, cc, tcc; int ncats, catoverflow; int nocat, nocatcc; ch keyword[keywordXcc], catg[keywordXcc]; ch keywordsbuff[catgkeywordsXcc]; ch *pp1, *pp2; ch pkeywords[maxkeywords][keywordXcc]; // 10000 * 50 = 0.5 MB if (Floaded && ! force) return; // use memory keywords if already there Floaded++; for (ii = 0; ii < maxkeywordcats; ii++) { // clean memory if (defined_keywords[ii]) zfree(defined_keywords[ii]); defined_keywords[ii] = 0; } ncats = catoverflow = 0; fid = fopen(keywords_defined_file,"r"); // read keywords_defined file if (fid) { while (true) { pp1 = fgets_trim(keywordsbuff,catgkeywordsXcc,fid); if (! pp1) break; pp2 = strchr(pp1,':'); // isolate "category:" if (! pp2) continue; // no colon cc = pp2 - pp1 + 1; if (cc > keywordXcc-1) continue; // category name too long strncpy0(catg,pp1,cc); // (for error message) if (strlen(pp1) > catgkeywordsXcc-2) goto cattoobig; // all category keywords too long pp2++; while (*pp2 == ' ') pp2++; while (*pp2) { if (*pp2 == ';') *pp2 = ','; // replace ';' with ',' for Fotocx pp2++; } defined_keywords[ncats] = zstrdup(pp1,"load-defkeywords"); // defined_keywords[ii] ncats++; // = category: kword1, kword2, ... kwordN, if (ncats == maxkeywordcats) goto toomanycats; } err = fclose(fid); fid = 0; if (err) goto defkeywordsfilerr; } // sort the categories in ascending order for (ii = 0; ii < ncats; ii++) for (jj = ii+1; jj < ncats; jj++) { pp1 = defined_keywords[ii]; pp2 = defined_keywords[jj]; if (strcasecmp(pp1,pp2) > 0) { defined_keywords[ii] = pp2; defined_keywords[jj] = pp1; } } // move category "nocatg" to the end of the list for (ii = 0; ii < ncats; ii++) { pp1 = defined_keywords[ii]; if (strmatchN(pp1,"nocatg:",7)) { for (jj = ii; jj < ncats-1; jj++) defined_keywords[jj] = defined_keywords[jj+1]; defined_keywords[jj] = pp1; break; } } // if not already there, add category "nocatg" to the end of the list pp1 = 0; if (ncats > 0) pp1 = defined_keywords[ncats-1]; // last keyword category if (pp1 && strmatchN(pp1,"nocatg:",7)) { // already 'nocatg' nocat = ncats - 1; nocatcc = strlen(pp1); pp2 = (ch *) zmalloc(catgkeywordsXcc,"load-defkeywords"); // re-allocate max. size defined_keywords[nocat] = pp2; // for following phase strcpy(pp2,pp1); zfree(pp1); } else { nocat = ncats; // add to end of list ncats++; defined_keywords[nocat] = (ch *) zmalloc(catgkeywordsXcc,"load-defkeywords"); // allocate max. size strcpy(defined_keywords[nocat],"nocatg: "); nocatcc = 8; } // search image index recs for all keywords in all images // for keywords not found in defined keywords list, add to 'nocatg' list for (ii = 0; ii < Nxxrec; ii++) // loop all index recs { zmainloop(); // keep GTK alive xxrec = xxrec_tab[ii]; pp1 = xxrec->keywords; while (pp1) // was: while (true) { while (*pp1 && strchr(",; ",*pp1)) pp1++; // next image keyword start if (! *pp1) break; pp2 = strpbrk(pp1,",;"); // end if (! pp2) pp2 = pp1 + strlen(pp1); cc = pp2 - pp1; if (cc > keywordXcc-1) { pp1 = pp2; continue; // ignore huge keyword } strncpy0(keyword,pp1,cc+1); // look for keyword in defined keywords if (find_defkeyword(keyword)) { pp1 = pp2; // found continue; } if (nocatcc + cc + 2 > catgkeywordsXcc-2) { catoverflow = 1; // nocatg: length limit reached break; } else { strcpy(defined_keywords[nocat] + nocatcc, keyword); // append keyword to list nocatcc += cc; strcpy(defined_keywords[nocat] + nocatcc, ", "); // + delim + blank nocatcc += 2; } pp1 = pp2; } } if (catoverflow) goto cattoobig; // parse all the keywords in each category and sort in ascending order for (ii = 0; ii < ncats; ii++) { pp1 = defined_keywords[ii]; pp2 = strchr(pp1,':'); if (! pp2) { printf("*** defined keywords file format error: %s \n",pp1); continue; } cc = pp2 - pp1 + 1; strncpy0(catg,pp1,cc); pp1 = pp2 + 1; while (*pp1 == ' ') pp1++; tcc = 0; for (jj = 0; jj < maxkeywords; jj++) { if (! *pp1) break; pp2 = strchr(pp1,','); if (pp2) cc = pp2 - pp1; else cc = strlen(pp1); if (cc > keywordXcc-1) cc = keywordXcc-1; strncpy0(pkeywords[jj],pp1,cc+1); pp1 += cc + 1; tcc += cc; while (*pp1 == ' ') pp1++; } nkeywords = jj; if (nkeywords == maxkeywords) goto toomanykeywords; HeapSort((ch *) pkeywords,keywordXcc,nkeywords,zstrcasecmp); pp1 = defined_keywords[ii]; tcc += strlen(catg) + 2 + 2 * nkeywords + 2; // category, all keywords, delimiters pp2 = (ch *) zmalloc(tcc,"load-defkeywords"); defined_keywords[ii] = pp2; // swap memory zfree(pp1); strcpy(pp2,catg); pp2 += strlen(catg); strcpy(pp2,": "); // pp2 = "category: " pp2 += 2; for (jj = 0; jj < nkeywords; jj++) // add the sorted keywords { strcpy(pp2,pkeywords[jj]); // append keyword + delim + blank pp2 += strlen(pp2); strcpy(pp2,", "); pp2 += 2; } *pp2 = 0; } return; toomanycats: zmessageACK(Mwin,TX("more than %d categories"),maxkeywordcats); if (fid) fclose(fid); return; cattoobig: zmessageACK(Mwin,TX("category %s is too big"),catg); if (fid) fclose(fid); return; toomanykeywords: zmessageACK(Mwin,TX("category %s has too many keywords"),catg); if (fid) fclose(fid); return; defkeywordsfilerr: zmessageACK(Mwin,TX("keywords_defined file error: %s"),strerror(errno)); return; } // write defined_keywords[] memory data to the defined keywords file if any changes were made void save_defkeywords() { int ii, err; FILE *fid; printf("update defined keywords \n"); fid = fopen(keywords_defined_file,"w"); // write keywords_defined file if (! fid) goto defkeywordserr; for (ii = 0; ii < maxkeywordcats; ii++) { if (! defined_keywords[ii]) break; err = fprintf(fid,"%s\n",defined_keywords[ii]); // each record: if (err < 0) goto defkeywordserr; // category: kword1, kword2, ... kwordN, } err = fclose(fid); if (err) goto defkeywordserr; return; defkeywordserr: zmessageACK(Mwin,TX("keywords_defined file error: %s"),strerror(errno)); return; } // find a given keyword in defined_keywords[] // return: 1 = found, 0 = not found int find_defkeyword(ch *keyword) { int ii, cc; ch keyword2[keywordXcc+4]; ch *pp; strncpy0(keyword2,keyword,keywordXcc); // construct keyword + delim + blank cc = strlen(keyword2); strcpy(keyword2+cc,", "); cc += 2; for (ii = 0; ii < maxkeywordcats; ii++) { pp = defined_keywords[ii]; // category: kword1, kword2, ... kwordN, if (! pp) return 0; // not found while (pp) { pp = strcasestr(pp,keyword2); // look for delim + blank + keyword + delim if (! pp) break; if (strchr(",;:", pp[-2])) return 1; // cat: keyword, or priorkeyword, keyword, pp += cc; // | | } // pp pp } return 1; } // add new keyword to defined_keywords[] >> category: keyword1, keyword2, ... newkeyword, // returns: 0 = added OK 1 = not unique (case ignored) // 2 = overflow 3 = bad name 4 = null/blank keyword // if keyword present under another category, it is moved to new category int add_defkeyword(ch *catg, ch *keyword) { int ii, cc, cc1, cc2; ch catg1[keywordXcc], keyword1[keywordXcc]; ch *pp1, *pp2; if (! catg) strcpy(catg1,"nocatg"); else strncpy0(catg1,catg,keywordXcc); cc = strTrim2(catg1); // remove leading and trailing blanks if (! cc) strcpy(catg1,"nocatg"); if (utf8_check(catg1)) goto badcatname; // look for bad characters if (strpbrk(catg1,",;:\"")) goto badcatname; if (! keyword) return 4; strncpy0(keyword1,keyword,keywordXcc); // remove leading and trailing blanks cc = strTrim2(keyword1); if (! cc) return 4; if (utf8_check(keyword1)) goto badkeywordname; // look for bad characters if (strpbrk(keyword1,",;:\"")) goto badkeywordname; del_defkeyword(keyword1); // delete keyword if already there cc1 = strlen(catg1); for (ii = 0; ii < maxkeywordcats; ii++) // look for given category { pp1 = defined_keywords[ii]; if (! pp1) goto newcatg; if (! strmatchN(catg1,pp1,cc1)) continue; // match on "catname:" if (pp1[cc1] == ':') goto oldcatg; } newcatg: if (ii == maxkeywordcats) goto toomanycats; cc1 = strlen(catg1) + strlen(keyword1) + 6; pp1 = (ch *) zmalloc(cc1,"add-defkeyword"); *pp1 = 0; strncatv(pp1,cc1,catg1,": ",keyword1,", ",null); // category: + keyword + delim + blank defined_keywords[ii] = defined_keywords[ii-1]; // move "nocatg" record to next slot defined_keywords[ii-1] = pp1; // insert new record before save_defkeywords(); return 0; oldcatg: // logic simplified pp2 = pp1 + cc1 + 2; // ch following "catname: " cc1 = strlen(keyword1); cc2 = strlen(pp1); // add new keyword to old record if (cc1 + cc2 + 4 > catgkeywordsXcc) goto cattoobig; pp2 = zstrdup(pp1,"add-defkeyword",cc1+cc2+4); // expand string zfree(pp1); defined_keywords[ii] = pp2; strcpy(pp2+cc2,keyword1); // old record + keyword + delim + blank strcpy(pp2+cc2+cc1,", "); save_defkeywords(); return 0; badcatname: zmessageACK(Mwin,TX("bad category name")); return 3; badkeywordname: zmessageACK(Mwin,TX("bad keyword name")); return 3; toomanycats: zmessageACK(Mwin,TX("too many categories")); return 2; cattoobig: zmessageACK(Mwin,TX("too many keywords in a category")); return 2; } // delete keyword from defined keywords list, defined_keywords[] // return: 0 = found and deleted, 1 = not found int del_defkeyword(ch *keyword) { int ii, cc; ch keyword2[keywordXcc+4]; ch *pp, *pp1, *pp2; if (! keyword || ! *keyword || *keyword == ' ') return 1; // bad keyword (utf8 can be < ' ') strncpy0(keyword2,keyword,keywordXcc); // construct keyword + delim + blank cc = strlen(keyword2); strcpy(keyword2+cc,", "); cc += 2; for (ii = 0; ii < maxkeywordcats; ii++) { pp = defined_keywords[ii]; if (! pp) return 1; // not found while (pp) { pp = strcasestr(pp,keyword2); // look for prior delim or colon if (! pp) break; if (strchr(",;:", pp[-2])) goto found; // cat: keyword, or priorkeyword, keyword, pp += cc; // | | } // pp pp } found: for (pp1 = pp, pp2 = pp+cc; *pp2; pp1++, pp2++) // eliminate keyword, delim, blank *pp1 = *pp2; *pp1 = 0; return 0; } // delete category from defined keywords list, defined_keywords[] // return: 0 = found and deleted, 1 = not found // 2 = not deleted because category has keywords assigned int del_defcatg(ch *catg) { int ii, jj, cc; ch catg2[keywordXcc+2]; ch *pp; if (! catg || ! *catg || *catg == ' ') return 1; // bad catg (utf8 can be < ' ') strncpy0(catg2,catg,keywordXcc); // construct "catgname:" cc = strlen(catg2); strcpy(catg2+cc,":"); cc += 1; for (ii = 0; ii < maxkeywordcats; ii++) { pp = defined_keywords[ii]; if (! pp) return 1; // catg not found if (strmatchN(pp,catg2,cc)) break; } for (jj = cc; pp[jj]; jj++) // check nothing following ':' if (pp[jj] != ' ') return 2; // catg not empty zfree(pp); // delete table entry for (jj = ii; jj < maxkeywordcats-1; jj++) // close hole in table defined_keywords[jj] = defined_keywords[jj+1]; return 0; // found and deleted } // Stuff text widget "defkeywords" with all keywords in the given category. // If category "ALL", stuff all keywords and format by category. void defkeywords_stuff(zdialog *zd, ch *acatg) { GtkWidget *widget; int ii, ff, cc; ch catgname[keywordXcc+4]; ch *pp1, *pp2; widget = zdialog_gtkwidget(zd,"defkeywords"); txwidget_clear(widget); for (ii = 0; ii < maxkeywordcats; ii++) { pp1 = defined_keywords[ii]; if (! pp1) break; pp2 = strchr(pp1,':'); if (! pp2) continue; cc = pp2 - pp1; if (cc < 1) continue; if (cc > keywordXcc) continue; strncpy0(catgname,pp1,cc+1); if (! strmatch(acatg,"ALL")) { ff = strmatch(catgname,acatg); if (! ff) continue; } strcat(catgname,": "); txwidget_append(widget,1,catgname); // "category: " in bold text pp2++; if (*pp2 == ' ') pp2++; if (*pp2) txwidget_append(widget,0,pp2); // "cat1, cat2, ... catN," txwidget_append(widget,0,"\n"); } return; } // Stuff combo box "defcats" with "ALL" + all defined categories void defcats_stuff(zdialog *zd) { ch catgname[keywordXcc+2]; int ii, cc; ch *pp1, *pp2; zdialog_combo_clear(zd,"defcats"); zdialog_stuff(zd,"defcats","ALL"); for (ii = 0; ii < maxkeywordcats; ii++) { pp1 = defined_keywords[ii]; if (! pp1) break; pp2 = strchr(pp1,':'); if (! pp2) continue; cc = pp2 - pp1; if (cc < 1) continue; if (cc > keywordXcc) continue; strncpy0(catgname,pp1,cc+1); zdialog_stuff(zd,"defcats",catgname); } zdialog_stuff(zd,"defcats","ALL"); // default selection return; } /**************************************************************************************/ // Compare 2 imagelocs records by country, location, latitude, longitude // return <0 0 >0 for rec1 < == > rec2. int glocs_compare(ch *rec1, ch *rec2) { float diff; int ii; glocs_t *r1 = (glocs_t *) rec1; glocs_t *r2 = (glocs_t *) rec2; ii = strcmp(r1->country,r2->country); if (ii) return ii; ii = strcmp(r1->location,r2->location); if (ii) return ii; diff = r1->flati - r2->flati; if (diff < 0) return -1; if (diff > 0) return +1; diff = r1->flongi - r2->flongi; if (diff < 0) return -1; if (diff > 0) return +1; return 0; } /**************************************************************************************/ // Load image geolocations data into memory from image index table. // Returns no. geolocations loaded. int load_imagelocs() { ch location[40], country[40]; float flati, flongi; int cc, ii, jj; xxrec_t *xxrec; if (Xindexlev < 1) { index_rebuild(1,0); if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return 0; } } if (Nimagelocs) return Nimagelocs; // already done cc = (Nxxrec+1) * sizeof(glocs_t *); // get memory for geolocs table imagelocs = (glocs_t **) zmalloc(cc,"load_imagelocs"); // room for Nxxrec entries Nimagelocs = 0; // populate imagelocs from image index table for (ii = 0; ii < Nxxrec; ii++) // loop all index recs { xxrec = xxrec_tab[ii]; strncpy0(location,xxrec->location,40); strncpy0(country,xxrec->country,40); get_gps_data(xxrec->gps_data,flati,flongi); if (Nimagelocs) { jj = Nimagelocs - 1; // eliminate sequential duplicates if (strmatch(location,imagelocs[jj]->location) && strmatch(country,imagelocs[jj]->country) && flati == imagelocs[jj]->flati && flongi == imagelocs[jj]->flongi) continue; } jj = Nimagelocs++; // fill next entry in table imagelocs[jj] = (glocs_t *) zmalloc(sizeof(glocs_t),"load_imagelocs"); imagelocs[jj]->location = zstrdup(location,"load_imagelocs"); imagelocs[jj]->country = zstrdup(country,"load_imagelocsC"); imagelocs[jj]->flati = flati; imagelocs[jj]->flongi = flongi; } if (Nimagelocs > 1) HeapSort((ch **) imagelocs, Nimagelocs, glocs_compare); // sort for (ii = 0, jj = 1; jj < Nimagelocs; jj++) // eliminate duplicates { if (strmatch(imagelocs[jj]->location,imagelocs[ii]->location) && strmatch(imagelocs[jj]->country,imagelocs[ii]->country) && imagelocs[jj]->flati == imagelocs[ii]->flati && imagelocs[jj]->flongi == imagelocs[ii]->flongi) { zfree(imagelocs[jj]->country); // free redundant entries zfree(imagelocs[jj]->location); zfree(imagelocs[jj]); } else { ii++; // count unique entries if (ii < jj) imagelocs[ii] = imagelocs[jj]; // pack down the table } } Nimagelocs = ii + 1; // final geolocs table size printf("total image geolocations: %d \n",Nimagelocs); /*** for (ii = 0; ii < Nimagelocs; ii++) { printf("%s %s %.4f %.4f \n", imagelocs[ii]->location, imagelocs[ii]->country, imagelocs[ii]->flati, imagelocs[ii]->flongi); } ***/ return Nimagelocs; } /**************************************************************************************/ // load cities geolocations table into memory // worldcities file must be sorted by location, country int load_worldlocs() { ch worldcitiesfile[200], wcfbuff[200]; ch location[40], country[40]; ch plocation[40], pcountry[40]; float flati, flongi; ch *pp; int nwl, cc; FILE *fid; if (Xindexlev < 1) { index_rebuild(1,0); if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return 0; } } if (Nworldlocs) return Nworldlocs; // already done cc = (maxworldcities) * sizeof(glocs_t *); // memory for geolocs table worldlocs = (glocs_t **) zmalloc(cc,"load_worldlocs"); Nworldlocs = 0; snprintf(worldcitiesfile,200,"%s/worldcities.txt",get_zdatadir()); fid = fopen(worldcitiesfile,"r"); if (! fid) { printf("*** worldcities.txt file missing \n"); goto retx; } nwl = 0; *plocation = *pcountry = '?'; while (true) { pp = fgets(wcfbuff,200,fid); // read location, country, lati, longi if (! pp) break; pp = substring(wcfbuff,',',1); if (! pp) continue; strncpy0(location,pp,40); pp = substring(wcfbuff,',',2); if (! pp) continue; strncpy0(country,pp,40); strcpy(plocation,location); strcpy(pcountry,country); pp = substring(wcfbuff,',',3); if (! pp) continue; flati = atof(pp); if (! flati || flati < -90 || flati > 90) continue; pp = substring(wcfbuff,',',4); if (! pp) continue; flongi = atof(pp); if (! flongi || flongi < -180 || flongi > 180) continue; worldlocs[nwl] = (glocs_t *) zmalloc(sizeof(glocs_t),"load_worldlocs"); worldlocs[nwl]->location = zstrdup(location,"load_worldlocs"); worldlocs[nwl]->country = zstrdup(country,"load_worldlocs"); worldlocs[nwl]->flati = flati; worldlocs[nwl]->flongi = flongi; nwl++; if (nwl == maxworldcities) break; } fclose(fid); Nworldlocs = nwl; retx: printf("total world locations: %d \n",Nworldlocs); return Nworldlocs; } /************************************************************************************** Find a geolocation from partial zdialog inputs and user choice of options. Uses locations and geocoordinates from image files and world locations table. Input zdialog widgets: location, country, gps_data Location and country may be partial leading strings All three widgets are outputs (found location, country, geocoordinates) return: 0 = no updates made 1 = location and country updated 2 = location, country, geocoordinates updated ********/ int find_location(zdialog *zd) // combined imiage and world search 26.0 { int nn, cc, ii; int Npick; ch location[40], country[40], gps_data[24]; ch text[100]; ch *pp, *choice; zlist_t *picklist; float flati1 = 999, flati2 = -999; float flongi1 = 999, flongi2 = -999; nn = load_imagelocs(); // load image and world locations tables nn += load_worldlocs(); // (if not already) if (! nn) return 0; zdialog_fetch(zd,"location",location,40); // get zdialog inputs zdialog_fetch(zd,"country",country,40); strTrim2(location); strTrim2(country); if (! *location && ! *country) return 0; // one of these must be present picklist = zlist_new(20); // room for 20 location matches Npick = 0; for (ii = 0; ii < Nimagelocs; ii++) // search all image files { // for partial location match if (*location) { cc = strlen(location); if (! strmatchcaseN(location,imagelocs[ii]->location,cc)) continue; } if (*country) { cc = strlen(country); if (! strmatchcaseN(country,imagelocs[ii]->country,cc)) continue; } snprintf(text,100,"%s | %s",imagelocs[ii]->location,imagelocs[ii]->country); // potential picklist entry if (zlist_find(picklist,text,0) >= 0) continue; // reject duplicate zlist_put(picklist,text,Npick++); // new picklist entry if (Npick == 20) { // if 20 or more, give up zmessageACK(Mwin,TX("more than 20 matches")); zlist_free(picklist); return 0; } } for (ii = 0; ii < Nworldlocs; ii++) // search world locations table { // for partial location match if (*location) { cc = strlen(location); if (! strmatchcaseN(location,worldlocs[ii]->location,cc)) continue; } if (*country) { cc = strlen(country); if (! strmatchcaseN(country,worldlocs[ii]->country,cc)) continue; } snprintf(text,100,"%s | %s",worldlocs[ii]->location,worldlocs[ii]->country); // potential picklist entry if (zlist_find(picklist,text,0) >= 0) continue; // reject duplicate zlist_put(picklist,text,Npick++); // new picklist entry if (Npick == 20) { // if 20 or more, give up zmessageACK(Mwin,TX("more than 20 matches")); zlist_free(picklist); return 0; } } if (Npick == 0) { // no matches found zlist_free(picklist); return 0; } choice = popup_choose(picklist); // show picklist, choose zlist_free(picklist); if (! choice) return 0; // no choice pp = substring(choice,'|',1); if (pp) strncpy0(location,pp,40); // user choice, location and country pp = substring(choice,'|',2); if (pp) strncpy0(country,pp,40); strTrim2(location); strTrim2(country); zdialog_stuff(zd,"location",location); // return location, country to zdialog zdialog_stuff(zd,"country",country); for (ii = 0; ii < Nimagelocs; ii++) // search image files for { // location and country if (strmatchcase(location,imagelocs[ii]->location) && strmatchcase(country,imagelocs[ii]->country)) { if (imagelocs[ii]->flati == 0 && imagelocs[ii]->flongi == 0) continue; // ignore missing values if (imagelocs[ii]->flati < flati1) flati1 = imagelocs[ii]->flati; // save range of geocoordinates found if (imagelocs[ii]->flati > flati2) flati2 = imagelocs[ii]->flati; if (imagelocs[ii]->flongi < flongi1) flongi1 = imagelocs[ii]->flongi; if (imagelocs[ii]->flongi > flongi2) flongi2 = imagelocs[ii]->flongi; } } for (ii = 0; ii < Nworldlocs; ii++) // search world locations table { // for location and country if (strmatchcase(location,worldlocs[ii]->location) && strmatchcase(country,worldlocs[ii]->country)) { if (worldlocs[ii]->flati < flati1) flati1 = worldlocs[ii]->flati; // save range of geocoordinates found if (worldlocs[ii]->flati > flati2) flati2 = worldlocs[ii]->flati; if (worldlocs[ii]->flongi < flongi1) flongi1 = worldlocs[ii]->flongi; if (worldlocs[ii]->flongi > flongi2) flongi2 = worldlocs[ii]->flongi; break; } } if (flati1 == 999) { // no match, return "" geocoordinates zdialog_stuff(zd,"gps_data",""); return 1; } if (flati1 == flati2 && flongi1 == flongi2) { // one match, return geocoordinates snprintf(gps_data,24,"%.4f %.4f",flati1,flongi1); zdialog_stuff(zd,"gps_data",gps_data); return 2; } return 0; } /**************************************************************************************/ // Find a location/country name matching a (partial) location and country name. // If more than 1 match found, present a picklist for the user to choose. // Picklist: matching location and country names, geocoordinates, image counts. // Returned: location, country, latitude, longitude // Returned status: 0 = OK, 1 = no match or no choice, 2 = too many matches int choose_location(ch *location, ch *country, float &flati, float &flongi) { int ii, nn, cc; int Nmatch; ch *mloc[20], *mcon[20]; // matching locations float mflati[20], mflongi[20]; // matching geocoordinates ch Fimage[20]; // images present '*' or blank ch *choice, text[200]; ch *pp; zlist_t *picklist; nn = load_imagelocs(); nn += load_worldlocs(); if (! nn) { printf("*** no location data is available \n"); return 1; } if (! *location && ! *country) { printf("*** no location name given \n"); return 1; } Nmatch = 0; // match count for (ii = 0; ii < Nimagelocs; ii++) // search image locations table { if (*location) { cc = strlen(location); if (! strmatchcaseN(location,imagelocs[ii]->location,cc)) continue; } if (*country) { cc = strlen(country); if (! strmatchcaseN(country,imagelocs[ii]->country,cc)) continue; } mloc[Nmatch] = imagelocs[ii]->location; // save match mcon[Nmatch] = imagelocs[ii]->country; mflati[Nmatch] = imagelocs[ii]->flati; mflongi[Nmatch] = imagelocs[ii]->flongi; Fimage[Nmatch] = '*'; // images present at location Nmatch++; // count matches if (Nmatch == 10) break; // limit 10 locations with images } for (ii = 0; ii < Nworldlocs; ii++) // search world locations table { if (*location) { cc = strlen(location); if (! strmatchcaseN(location,worldlocs[ii]->location,cc)) continue; } if (*country) { cc = strlen(country); if (! strmatchcaseN(country,worldlocs[ii]->country,cc)) continue; } mloc[Nmatch] = worldlocs[ii]->location; // save match mcon[Nmatch] = worldlocs[ii]->country; mflati[Nmatch] = worldlocs[ii]->flati; mflongi[Nmatch] = worldlocs[ii]->flongi; Fimage[Nmatch] = ' '; // no images at location Nmatch++; // count matches if (Nmatch == 20) break; } if (! Nmatch) { zmessageACK(Mwin,TX("no matching locations")); return 1; } picklist = zlist_new(Nmatch); for (ii = 0; ii < Nmatch; ii++) { // build picklist of locations snprintf(text,200,"%s / %s | %.4f / %.4f %c", mloc[ii], mcon[ii], mflati[ii], mflongi[ii], Fimage[ii]); zlist_put(picklist,text,ii); } choice = popup_choose(picklist); // show picklist, choose one if (choice) strncpy0(text,choice,200); // preserve from zfree() zlist_free(picklist); if (! choice) return 1; pp = substring(text,"/|*",1); // parse returned text if (! pp) return 1; // location / country | NN.NNN / NN.NNN strncpy0(location,pp,40); pp = substring(text,"/|*",2); if (! pp) return 1; strncpy0(country,pp,40); pp = substring(text,"/|*",3); if (! pp) return 1; sscanf(pp,"%f",&flati); pp = substring(text,"/|*",4); if (! pp) return 1; sscanf(pp,"%f",&flongi); return 0; } /**************************************************************************************/ // Find nearest known location for input geocoordinates. // Return km to location and which table has closest location: // iim: image table index iic: world cities table index // other index returned = -1 // execution time is 2 ms on 4 GHz computer with 15K images and 43K world locations float nearest_loc(float lati, float longi, int &iim, int &iic) { float km1, km2; km1 = 99999; iim = iic = -1; load_imagelocs(); // load images geolocations table load_worldlocs(); // load cities geolocations table for (int ii = 0; ii < Nimagelocs; ii++) // search image locations { if (imagelocs[ii]->location[0] <= ' ') continue; // ignore blank locations 26.0 km2 = earth_distance(lati,longi,imagelocs[ii]->flati,imagelocs[ii]->flongi); if (km2 < km1) { km1 = km2; iim = ii; } } for (int ii = 0; ii < Nworldlocs; ii++) // search world cities locations { km2 = earth_distance(lati,longi,worldlocs[ii]->flati,worldlocs[ii]->flongi); if (km2 < km1) { km1 = km2; iic = ii; } } if (iic > -1) iim = -1; // if world cities, unset image index return km1; } /**************************************************************************************/ // Update image locations table imagelocs[*] // // inputs: location, country, latitude, longitude // return value: 0 OK, no geotag revision (incomplete data) // 1 OK, no geotag revision (matches existing data) // 2 OK, geotag new location/lati/longi added // -1 error, lat/long bad int put_imagelocs(zdialog *zd) { ch location[40], country[40]; ch gps_data[24]; float flati, flongi; int ii, err, cc, nn, found = 0; if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return 0; } } zdialog_fetch(zd,"location",location,40); // get location and geocoordinates zdialog_fetch(zd,"country",country,40); strTrim2(location); strTrim2(country); if (! *location || ! *country) return 0; // location not complete if (! *location) return 0; // or "" if (! *country) return 0; *location = toupper(*location); // capitalize location names *country = toupper(*country); zdialog_stuff(zd,"location",location); zdialog_stuff(zd,"country",country); zdialog_fetch(zd,"gps_data",gps_data,24); err = get_gps_data(gps_data,flati,flongi); if (err) { // 1 = missing, 2 = bad if (err > 1) zmessageACK(Mwin,TX("invalid GPS data: %s"),gps_data); // 26.5 return -1; } for (ii = 0; ii < Nimagelocs; ii++) // search geotags for location { if (! strmatchcase(location,imagelocs[ii]->location)) continue; // case-insensitive compare if (! strmatchcase(country,imagelocs[ii]->country)) continue; if (! strmatch(location,imagelocs[ii]->location)) { zfree(imagelocs[ii]->location); // revise capitalization imagelocs[ii]->location = zstrdup(location,"put-geolocs"); } if (! strmatch(country,imagelocs[ii]->country)) { zfree(imagelocs[ii]->country); imagelocs[ii]->country = zstrdup(country,"put-geolocs"); } if (flati == imagelocs[ii]->flati && flongi == imagelocs[ii]->flongi) found++; } if (found) return 1; glocs_t *glocsA = (glocs_t *) zmalloc(sizeof(glocs_t),"put-geolocs"); glocs_t **glocsB; glocsA->location = zstrdup(location,"put-geolocs"); // new geolocs record glocsA->country = zstrdup(country,"put-geolocs"); glocsA->flati = flati; glocsA->flongi = flongi; cc = (Nimagelocs + 1) * sizeof(glocs_t *); glocsB = (glocs_t **) zmalloc(cc,"put-geolocs"); for (ii = 0; ii < Nimagelocs; ii++) { // copy geolocs before new geoloc nn = glocs_compare((ch *) imagelocs[ii], (ch *) glocsA); if (nn > 0) break; glocsB[ii] = imagelocs[ii]; } glocsB[ii] = glocsA; // insert new geolocs for (NOP; ii < Nimagelocs; ii++) // copy geolocs after new geoloc glocsB[ii+1] = imagelocs[ii]; if (Nimagelocs) zfree(imagelocs); // geolocs --> new table bugfix 26.2 imagelocs = glocsB; Nimagelocs += 1; return 2; } /**************************************************************************************/ // validate and convert earth coordinates, latitude and longitude // return: 0 OK // 1 missing or blank // 2 invalid data // if return status > 0, 0.0 is returned for both values // if conversion is valid, input string is returned minus excess blanks // if input string >23 char, reformat ±nn.nnnn ±nnn.nnnn (max. 18 char. + null) // execution time is 0.2 microseconds on 4 GHz processor int get_gps_data(ch *gps_data, float &flati, float &flongi) { int cc, err; ch *pp, *pp1, *pp2, *pp3, *pp4; if (! gps_data || ! *gps_data) goto status1; cc = strlen(gps_data); if (cc < 3) goto status2; // allow valid nonsense like "2 3" 26.5 for (pp1 = gps_data; *pp1 == ' '; pp1++); // " nn.nnnnn nn.nnnnn " if (! *pp1) goto status2; // | | | | for (pp2 = pp1+1; *pp2 > ' '; pp2++); // pp1 pp2 pp3 pp4 if (*pp2 != ' ') goto status2; for (pp3 = pp2+1; *pp3 == ' '; pp3++); if (! *pp3) goto status2; for (pp4 = pp3+1; *pp4 > ' '; pp4++); if (pp2 - pp1 < 1) goto status2; if (pp4 - pp3 < 1) goto status2; pp = strchr(pp1,','); // replace comma decimal point if (pp) *pp = '.'; // with period pp = strchr(pp3,','); if (pp) *pp = '.'; err = convSF(pp1,flati,-90,+90); // convert to float and check limits if (err) goto status2; err = convSF(pp3,flongi,-180,+180); if (err) goto status2; snprintf(gps_data,24,"%.4f %.4f",flati,flongi); // reduce to standard precision return 0; status1: flati = flongi = 0.0; // both missing return 1; status2: // one missing or invalid flati = flongi = 0.0; return 2; } /**************************************************************************************/ // compute the km distance between two earth coordinates float earth_distance(float lat1, float long1, float lat2, float long2) { float dlat, dlong, mlat, dist; dlat = fabsf(lat2 - lat1); // latitude distance dlong = fabsf(long2 - long1); // longitude distance mlat = 0.5 * (lat1 + lat2); // mean latitude mlat *= 0.01745; // radians dlong = dlong * cosf(mlat); // longitude distance * cos(latitude) dist = sqrtf(dlat * dlat + dlong * dlong); // distance in degrees dist *= 111.0; // distance in km return dist; } /**************************************************************************************/ // generate a list of files and geocoordinates from the current gallery file list int get_gallerymap() { int ii, jj, cc; float flati, flongi; xxrec_t *xxrec; if (Xindexlev < 1) { index_rebuild(1,0); if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return 0; } } if (! navi::Gfiles) { zmessageACK(Mwin,TX("gallery is empty")); return 0; } if (gallerymap) { // free prior gallerymap for (ii = 0; ii < Ngallerymap; ii++) zfree(gallerymap[ii].file); zfree(gallerymap); gallerymap = 0; } cc = sizeof(gallerymap_t); gallerymap = (gallerymap_t *) zmalloc(navi::Gfiles * cc,"gallerymap"); for (jj = 0, ii = navi::Gfolders; ii < navi::Gfiles; ii++) // loop gallery files { xxrec = get_xxrec(navi::Gindex[ii].file); // look up in xxrec_tab if (! xxrec) continue; // deleted, not an image file get_gps_data(xxrec->gps_data,flati,flongi); gallerymap[jj].flati = flati; gallerymap[jj].flongi = flongi; gallerymap[jj].file = zstrdup(navi::Gindex[ii].file,"gallerymap"); jj++; } Ngallerymap = jj; return Ngallerymap; } /************************************************************************************** get metadata for one image file and set of metadata tag names file image file to retrieve metadata tagname[NK] set of tag names, e.g. keywords, rating, ISO, city ... tagval[NK] returned tag data (caller must zmalloc() before and zfree() after) return status: 0 = OK, +N = system error (errno) -1 = exiftool failure ***************************************************************************************/ int meta_get(ch *file, ch **tagname, ch **tagval, int NK) { int ii, kk, cc, err; int Fjxl = 0; ch *file2; ch *pp1, *pp2, *pp3; ch exifcommand[XFCC+500], buff[metadataXcc+100]; FILE *fid = 0; zfuncs::zappcrash_context1 = file; pp1 = strrchr(file,'.'); // flag JXL file jxl if (pp1 && strmatchcase(pp1,".jxl")) Fjxl = 1; for (ii = 0; ii < NK; ii++) // clear outputs tagval[ii] = 0; // build exiftool command: // exiftool -m -S -n -fast // processing options // -c "%.4f" // geocoordinate format // -tagname1 -tagname2 ... -tagnameN // tag names to extract // "/.../filename.jpg" // input file strcpy(exifcommand,"exiftool -m -S -n -fast -c \"%.4f\" "); cc = strlen(exifcommand); for (kk = 0; kk < NK; kk++) { // append "-tagname " for each tag name if (! tagname[kk] || *tagname[kk] <= ' ') tagname[kk] = zstrdup("??","meta_get"); // stop deadly exiftool input exifcommand[cc++] = '-'; if (Fjxl && strmatchcase(tagname[kk],"keywords")) { // if JXL file, substitute jxl strcpy(exifcommand+cc,"subject"); // 'subject' for 'keywords' cc += 7; } else if (Fjxl && strmatchcase(tagname[kk],"city")) { // if JXL file, substitute jxl strcpy(exifcommand+cc,"location"); // 'location' for 'city' cc += 8; } else if (strmatchcase(tagname[kk],"photodate")) { // replace photodate 26.0 strcpy(exifcommand+cc,"datetimeoriginal"); cc += 16; } else { strcpy(exifcommand+cc,tagname[kk]); cc += strlen(tagname[kk]); } exifcommand[cc++] = ' '; } file2 = zescape_quotes(file); exifcommand[cc++] = '"'; strcpy(exifcommand+cc,file2); // append input file cc += strlen(file2); exifcommand[cc++] = '"'; exifcommand[cc] = 0; zfree(file2); // execute exiftool command and read outputs, filenames followed by tag values fid = popen(exifcommand,"r"); if (! fid) goto exiferr; while (true) // loop exiftool outputs { pp1 = fgets_trim(buff,metadataXcc+100,fid,1); // next exiftool output record if (! pp1) break; // EOF pp2 = strchr(pp1,':'); // this is a tag data record if (! pp2) continue; // format is: tagname: tagval if (strlen(pp2) < 2) continue; // | | *pp2 = 0; // pp1 pp2 pp2 += 2; if (Fjxl && strmatchcase(pp1,"subject")) // replace 'subject' with 'keywords' jxl pp1 = "keywords"; if (Fjxl && strmatchcase(pp1,"location")) // replace 'location' with 'city' jxl pp1 = "city"; for (kk = 0; kk < NK; kk++) // look for tag name match if (strmatchcase(pp1,tagname[kk])) break; if (kk == NK) continue; // should not happen cc = strlen(pp2); if (cc == 1 && *pp2 == '\n') continue; // ignore blank line data if (cc >= metadataXcc) pp2[cc] = 0; // 25.1 pp3 = zstrdup(pp2,"meta_get"); // get tag data err = utf8_clean(pp3); // replace bad utf8 with '?' if (err) printf("*** bad utf8 detected *** %s \n",file); // 25.1 tagval[kk] = pp3; // return tag data } goto OKret; exiferr: errno = -1; goto retxx; OKret: errno = 0; retxx: if (fid) pclose(fid); if (errno) printf("*** meta_get(): %s \n %s \n",file, strerror(errno)); return 0; } /************************************************************************************** get metadata for set of image files and set of metadata tag names files[NF] set of image files to retrieve metadata tagname[NK] set of tag names, e.g. keywords, rating, ISO, city ... tagval[] returned tag data, NF * NK values caller must zmalloc() pointers before call, and zfree() data and pointers after call. return status: 0 = OK, +N = system error (errno) -1 = exiftool failure ***************************************************************************************/ #define XEXIF 100 // max. exiftool threads to use (only NSMP in parallel) namespace meta_getN_names { ch **files; // caller args ch **tagname; ch **tagval; int Fall; int tagtype[50]; // up to 50 tags can be processed int NF, NK; int TF1[XEXIF], TF2[XEXIF]; // file range per exiftool thread pthread_t pid[XEXIF]; int busythreads, donethreads; int errstat; xxrec_t *xxrec; } // caller function int meta_getN(ch **files2, int NF2, ch **tagname2, ch **tagval2, int NK2, int Fall2) // 26.0 { using namespace meta_getN_names; void * meta_getN_thread(void *arg); int ii, ff, kk, kk2, tt; int Frange; double secs; ch *pp1, *pp2, *pp3; ch tagdata[metadataXcc]; int cc; ch *xmeta; files = files2; // copy args to namespace NF = NF2; // files to process tagname = tagname2; // metadata tag names to fetch tagval = tagval2; // corresp. tag data NK = NK2; // count of tag names and data if (NK > 50) zappcrash("meta_getN(), too many tags: %d \n",NK); Fall = Fall2; for (kk = 0; kk < NF * NK; kk++) // clear output tag data tagval[kk] = 0; for (kk = 0; kk < NK; kk++) // get tag types from tag names tagtype[kk] = metatagtype(tagname[kk]); // xxrec_tab[], extra indexed metadata, // or not indexed for (ff = 0; ff < NF; ff++) { // loop all files ii = xxrec_index(files[ff]); if (ii < 0) continue; // non-indexed file, ignore xxrec = xxrec_tab[ii]; // xxrec_tab[] for file for (kk = 0; kk < NK; kk++) // loop tag names { kk2 = ff * NK + kk; // output slot for file and tag if (tagtype[kk] == 0) continue; // not indexed, must read file metadata if (Fall) continue; // image index function if (tagtype[kk] < 100) // tag is a member of xxrec_tab[] { switch (tagtype[kk]) { case xxFNAME: tagval[kk2] = zstrdup(xxrec->file,"meta_getN"); continue; case xxFDATE: tagval[kk2] = zstrdup(xxrec->fdate,"meta_getN"); continue; case xxFSIZE: tagval[kk2] = zstrdup(xxrec->fsize,"meta_getN"); continue; case xxPDATE: tagval[kk2] = zstrdup(xxrec->pdate,"meta_getN"); continue; case xxPSIZE: tagval[kk2] = zstrdup(xxrec->psize,"meta_getN"); continue; case xxBPC: tagval[kk2] = zstrdup(xxrec->bpc,"meta_getN"); continue; case xxRATE: tagval[kk2] = zstrdup(xxrec->rating,"meta_getN"); continue; case xxKWDS: tagval[kk2] = zstrdup(xxrec->keywords,"meta_getN"); continue; case xxTITL: tagval[kk2] = zstrdup(xxrec->title,"meta_getN"); continue; case xxDESC: tagval[kk2] = zstrdup(xxrec->desc,"meta_getN"); continue; case xxLOC: tagval[kk2] = zstrdup(xxrec->location,"meta_getN"); continue; case xxCNTR: tagval[kk2] = zstrdup(xxrec->country,"meta_getN"); continue; case xxMAKE: tagval[kk2] = zstrdup(xxrec->make,"meta_getN"); continue; case xxMODL: tagval[kk2] = zstrdup(xxrec->model,"meta_getN"); continue; case xxLENS: tagval[kk2] = zstrdup(xxrec->lens,"meta_getN"); continue; case xxEXP: tagval[kk2] = zstrdup(xxrec->exp,"meta_getN"); continue; case xxFNUM: tagval[kk2] = zstrdup(xxrec->fn,"meta_getN"); continue; case xxFLNG: tagval[kk2] = zstrdup(xxrec->fl,"meta_getN"); continue; case xxISO: tagval[kk2] = zstrdup(xxrec->iso,"meta_getN"); continue; default: tagval[kk2] = zstrdup("meta_getN() bug","meta_getN"); continue; } } else if (tagtype[kk] == 100) // tag exists in extra indexed metadata { // ( <1 µsec. for 5 GHz CPU and <1 KB) *tagdata = 0; xmeta = xxrec->xmeta; // name1=data1^ name2=data2^ ... if (! xmeta) continue; // | | | cc = strlen(tagname[kk]); // pp1 pp2 pp3 pp1 = xmeta; while (true) { // scan xmeta data pp2 = strchr(pp1,'='); if (! pp2) break; // invalid pp3 = strchr(pp2,'^'); if (! pp3) break; // invalid if (strmatchcaseN(tagname[kk],pp1,cc) && pp2-pp1 == cc) { if (pp3-pp2 > 1 && pp3 - pp2 < metadataXcc) // meta name and cc match strncpy0(tagdata,pp2+1,pp3-pp2); // copy metadata break; } pp1 = pp3 + 1; while (*pp1 == ' ') pp1++; if (! *pp1) break; } tagval[kk2] = zstrdup(tagdata,"meta_getN"); } } } if (! Fall) // not image index function { for (kk = 0; kk < NK; kk++) // loop tag names if (tagtype[kk] == 0) break; // not indexed, must read file metadata if (kk == NK) return 0; // no non-indexed tags, done } progress_setgoal(NF); // start progress counter for (tt = 0; tt < XEXIF; tt++) // loop exiftool threads TF1[tt] = TF2[tt] = -1; // file range, initially disabled Frange = NF / XEXIF + 1; // files per thread for (ff = tt = 0; tt < XEXIF; tt++) // loop threads { TF1[tt] = ff; // 1st file for thread ff += Frange; // + files per thread if (ff > NF) ff = NF; // limit to last file TF2[tt] = ff - 1; // last file for thread if (ff == NF) break; // done } secs = get_seconds(); busythreads = donethreads = 0; errstat = 0; for (tt = 0; tt < XEXIF; tt++) // start XEXIF threads { if (TF1[tt] < 0) break; while (busythreads - donethreads >= NSMP) zmainsleep(0.01); // limit to NSMP parallel threads 25.2 if (errstat) break; busythreads++; pid[tt] = start_detached_thread(meta_getN_thread,&Nval[tt]); } while (busythreads > donethreads) zmainsleep(0.01); // wait for last threads if (Fescape) goto cancel; secs = get_seconds() - secs; printf("meta_getN() files: %d time: %.1f \n",NF,secs); if (errstat) zmessageACK(Mwin,"meta_getN(): %s \n",strerror(errstat)); progress_setgoal(0); // reset progress counter return errstat; cancel: printf("*** meta_getN() canceled \n"); // user cancel, terminate threads progress_setgoal(0); // reset progress counter return 1; } // thread function // get metadata for files for this thread, file1[T] to fileN[T] void * meta_getN_thread(void *arg) { using namespace meta_getN_names; int T = *((int *) arg); // thread number int F1st, Flast, Fdone; // file range for thread int Fonefile; // flag, only 1 file to process int ff, kk, kk2, cc, err; int Fkw = 0, Fcity = 0, Fjxl = 0; // JXL non-standard tags present jxl ch *pp1, *pp2; ch linkdir[200], linkname[200]; ch exifcommand[1000], buff[xmetaXcc+100]; ch *file = 0; FILE *fid = 0; F1st = TF1[T]; // file range for thread Flast = TF2[T]; // create folder containing symlinks to all image files for thread T snprintf(linkdir,200,"%s/metalinks_%d",temp_folder,T); // /metalinks_T zshell(0,"rm -R -f %s",linkdir); err = zshell(0,"mkdir -p -m 0750 %s",linkdir); if (err) goto exiferr; for (ff = F1st; ff <= Flast; ff++) // create symlinks to input files { snprintf(linkname,200,"%s/%06d",linkdir,ff); // linkname: /metalinks_N/nnnnnn err = symlink(files[ff],linkname); // linkname --> filename if (err) printf("*** meta_getN(): %s \n %s \n",files[ff],strerror(errno)); } // build exiftool command: // exiftool -m -S -n -fast // processing options // -q is deadly - do not use // -c "%.4f" // geocoordinate formats // 2>/dev/null // suppress exiftool errors // -tagname1 -tagname2 ... -tagnameN // tag names to extract // /home//.fotocx/temp-nnnnn/metalinks_N/* // folder with input files strcpy(exifcommand,"exiftool -m -S -n -fast -c \"%.4f\" 2>/dev/null "); cc = strlen(exifcommand); for (kk = 0; kk < NK; kk++) // loop tag names { if (! Fall && tagtype[kk] != 0) continue; // skip indexed tags if (! tagname[kk] || strlen(tagname[kk]) < 1) // append "-tagname " for each tag name tagname[kk] = zstrdup("??","meta_getN"); // stop deadly exiftool input exifcommand[cc++] = '-'; strcpy(exifcommand+cc,tagname[kk]); cc += strlen(tagname[kk]); exifcommand[cc++] = ' '; if (strmatchcase(tagname[kk],"keywords")) Fkw = 1; // flag 'keywords' present jxl if (strmatchcase(tagname[kk],"city")) Fcity = 1; // flag 'city' present jxl } if (Fkw) { // if 'keywords' present, add 'subject' jxl strcpy(exifcommand+cc,"-subject "); // (JXL equivalent of 'keywords') cc += 9; } if (Fcity) { // if 'city' present, add 'location' jxl strcpy(exifcommand+cc,"-location "); // (JXL equivalent of 'city') cc += 10; } strncpy0(exifcommand+cc,linkdir,1000-cc); // append linkdir strcat(exifcommand+cc,"/*"); // append "/*" fid = popen(exifcommand,"r"); // execute exiftool, read outputs if (! fid) goto exiferr; Fonefile = 0; if (Flast == F1st) Fonefile = 1; // flag, only 1 file to process Fdone = 0; while (true) // loop exiftool outputs { if (Fonefile) { // one and only file, strcpy(buff,"== "); // supply filename exiftool omits strcpy(buff+3,files[F1st]); pp1 = buff; Fonefile = 0; // reset flag } else pp1 = fgets_trim(buff,xmetaXcc,fid,1); // next exiftool output record if (! pp1) break; // EOF if (*pp1 == '=') // filename record { ff = F1st + (Fdone++); // current file in F1st to Flast if (ff > Flast) goto retxx; progress_addvalue(1); // update progress counter if (Fescape) goto retxx; // user killed file = files[ff]; zfuncs::zappcrash_context1 = file; // note file in case zappcrash pp2 = strrchr(file,'.'); Fjxl = 0; if (pp2 && strmatchcase(pp2,".jxl")) Fjxl = 1; // note jxl file jxl continue; // next exiftool output } pp2 = strchr(pp1,':'); // this is a tag data record if (! pp2) continue; // format is: tagname: tagval if (strlen(pp2) < 2) continue; // | | *pp2 = 0; // pp1 pp2 pp2 += 2; err = utf8_check(pp2); // check for utf8 bad data if (err) { printf("*** bad utf8 detected *** %s \n",file); // 25.1 continue; } if (Fjxl && Fkw && strmatchcase(pp1,"subject")) // JXL file uses 'subject' jxl pp1 = "keywords"; // return data as 'keywords' if (Fjxl && Fkw && strmatchcase(pp1,"location")) // JXL file uses 'location' jxl pp1 = "city"; // return data as 'city' cc = strlen(pp2); if (cc >= metadataXcc) continue; for (kk = 0; kk < NK; kk++) { // look for tag name match kk2 = ff * NK + kk; // corresp. tag data if (tagval[kk2]) continue; // already found, skip if (strmatchcase(pp1,tagname[kk])) break; } if (kk == NK) continue; // should not happen kk = ff * NK + kk; tagval[kk] = zstrdup(pp2,"meta_getN"); // return tag data } goto OKret; exiferr: errno = -1; goto retxx; OKret: errno = 0; retxx: zshell(0,"rm -R -f -d %s",linkdir); // remove linkdir if (fid) pclose(fid); if (errno) { errstat = errno; printf("*** meta_getN(): %s \n %s \n",file, strerror(errno)); } zadd_locked(donethreads,+1); // not busy return 0; } /**************************************************************************************/ // create or change metadata for given image file and metadata tags. // update both file and corresponding xxrec_tab[] if file is indexed. // // command: // exiftool -m -overwrite_original -tagname="tagvalue" ... "file" // // NOTE: exiftool replaces \n (newline) in tag value with . (period). // returns: 0 = OK, +N = error (message --> logfile) int meta_put(ch *file, ch **tagname, ch **tagval, int NK) { int ccc = 9999; ch exifcommand[ccc]; ch *file2; ch *pp; ch tagval2[metadataXcc]; int ii, cc, err; int Fjxl = 0; if (NK < 1 || NK > 30) zappcrash("meta_put NK: %d",NK); err = access(file,W_OK); // test file can be written by me if (err) { printf("*** no write permission: %s \n",file); return 1; } pp = strrchr(file,'.'); // flag JXL file jxl if (pp && strmatchcase(pp,".jxl")) Fjxl = 1; sprintf(exifcommand,"exiftool -m -n -q -overwrite_original "); // add -n -q 25.0 cc = strlen(exifcommand); for (ii = 0; ii < NK; ii++) // build exiftool inputs { exifcommand[cc++] = '-'; // add string -tagname= if (Fjxl && strmatchcase(tagname[ii],"keywords")) { // if JXL file, replace 'keywords' jxl strcpy(exifcommand+cc,"subject"); // with 'subject' cc += 7; } else if (Fjxl && strmatchcase(tagname[ii],"city")) { // if JXL file, replace 'city' jxl strcpy(exifcommand+cc,"location"); // with 'location' cc += 8; } else { strcpy(exifcommand+cc,tagname[ii]); cc += strlen(tagname[ii]); } exifcommand[cc++] = '='; if (! tagval[ii] || ! *tagval[ii]) { // delete tagname 25.1 exifcommand[cc] = ' '; cc++; continue; } repl_Nstrs(tagval[ii],tagval2,metadataXcc,"\n",". ","\"","\\\"",null); // replace embedded \n with ". " if (cc + (int) strlen(tagval2) > ccc-4) { // and embedded " with \" printf("*** meta_put() data too long \n"); return 1; } snprintf(exifcommand+cc,ccc-cc,"\"%s\" ",tagval2); // append "tagval" + blank cc += strlen(tagval2) + 3; } file2 = zescape_quotes(file); if (cc + (int) strlen(file2) > ccc-3) { printf("*** meta_put() data too long \n"); zfree(file2); return 1; } snprintf(exifcommand+cc,ccc-cc,"\"%s\"",file2); // append file name zfree(file2); err = system(exifcommand); // bugfix zshell fails this case 26.7 err = WEXITSTATUS(err); if (err) printf("*** meta_put() error: %s \n",file); file_to_xxrec(file); // update xxrec_tab[] 25.1 return err; } /**************************************************************************************/ // copy metadata from one image file to new (edited) image file // if NK > 0: tagname[] tags get new values from tagval[] // return: 0 = OK, +N = error int meta_copy(ch *file1, ch *file2, ch **tagname, ch **tagval, int NK) { int ccc = 9999; ch *file1a, *file2a; ch exifcommand[ccc]; int err = 0; ch *pp; ch *kwtag[1] = { "keywords" }; ch *subtag[1] = { "subject" }; ch *kwdata[1] = { "" }; err = access(file2,W_OK); // test file can be written by me if (err) { printf("*** no write permission: %s \n",file2); return 1; } file1a = zescape_quotes(file1); file2a = zescape_quotes(file2); snprintf(exifcommand,ccc,"exiftool -m -n -q -tagsfromfile \"%s\" " // simplified 25.0 "\"%s\" -overwrite_original",file1a,file2a); zfree(file1a); zfree(file2a); err = zshell(0,exifcommand); if (err) { printf("*** meta_copy() error: %s \n",file1); return err; } if (NK) { err = meta_put(file2, tagname, tagval, NK); // add/replace new tags/data if (err) { printf("*** meta_copy() error: %s \n",file1); return err; } } pp = strrchr(file2,'.'); // test for JXL output file jxl if (pp && strmatchcase(pp,".jxl")) { err = meta_get(file1,kwtag,kwdata,1); // get keywords data from input file if (kwdata[0] && *kwdata[0]) { // if present, write to output file 25.0 meta_put(file2,subtag,kwdata,1); zfree(kwdata[0]); } } file_to_xxrec(file2); // update xxrec_tab[] and thumbnail return 0; } /************************************************************************************** Functions to update metadata in xxrec_tab[] and corresponding image file. ***************************************************************************************/ // update xxrec_tab[] entry from corresponding file metadata // entry will be added if missing, or existing entry updated // returns 0 if OK and +N if error int file_to_xxrec(ch *file) { #define NK2 NKX + xmetaXtags // standard + max. extra metadata tags ch *tagname[NK2], *tagval[NK2]; ch xmetarec[xmetaXcc]; // max. extra metadata cc int kk, nk2, xcc; xxrec_t xxrec, *xxrec2; int ii, iix, nn, cc, err; int Fadd, Freplace; float flati, flongi; ch *RP; FILE *fid; STATB statB; if (strstr(file,"-fotocx-temp")) return 0; // 25.1 RP = f_realpath(file); // use real path if (! RP) return 1; // FNF if (! regfile(RP,&statB)) { // not reg. file zfree(RP); return 1; } if (Xindexlev < 1) { // image index not valid zfree(RP); return 2; } for (kk = 0; kk < NKX; kk++) // get standard metadata tag names tagname[kk] = tagnamex[kk]; for (kk = 0; kk < xmetaNtags; kk++) // add tag names for extra indexed metadata tagname[NKX+kk] = xmeta_tags[kk]; nk2 = NKX + kk; // total tag count for (kk = 0; kk < nk2; kk++) // insure tagval pointers null tagval[kk] = 0; err = meta_get(RP,tagname,tagval,nk2); // get all metadata from image file if (err) { zfree(RP); return err; } memset(&xxrec,0,sizeof(xxrec)); xxrec.file = RP; // file name if (tagval[0]) // file date yyyy:mm:dd hh:mm:ss+hh:mm strncpy0(xxrec.fdate,tagval[0],20); // (time zone +hh:mm is truncated) else *xxrec.fdate = 0; if (tagval[1]) // file size strncpy0(xxrec.fsize,tagval[1],16); else *xxrec.fsize = 0; if (tagval[2]) { // photo date strncpy0(xxrec.pdate,tagval[2],20); xxrec.pdate[4] = xxrec.pdate[7] = ':'; // metadata mixed yyyy:mm:dd, yyyy-mm-dd } else *xxrec.pdate = 0; if (tagval[3]) // pixel size strncpy0(xxrec.psize,tagval[3],16); else *xxrec.psize = 0; if (tagval[4]) // bpc strncpy0(xxrec.bpc,tagval[4],4); else *xxrec.bpc = 0; if (tagval[5]) // rating strncpy0(xxrec.rating,tagval[5],4); else *xxrec.rating = 0; if (tagval[6]) { // keywords xxrec.keywords = zstrdup(tagval[6],"file_to_xxrec"); cc = strlen(xxrec.keywords); while (cc > 0 && xxrec.keywords[cc-1] == ' ') cc--; // remove trailing ", " (prior fotocx) while (cc > 0 && xxrec.keywords[cc-1] == ',') cc--; xxrec.keywords[cc] = 0; } else xxrec.keywords = 0; if (tagval[7]) // title xxrec.title = zstrdup(tagval[7],"file_to_xxrec"); else xxrec.title = 0; if (tagval[8]) // description xxrec.desc = zstrdup(tagval[8],"file_to_xxrec"); else xxrec.desc = 0; if (tagval[9]) // location strncpy0(xxrec.location,tagval[9],40); else *xxrec.location = 0; if (tagval[10]) // country strncpy0(xxrec.country,tagval[10],40); else *xxrec.country = 0; if (tagval[11]) { // GPS coordinates strncpy0(xxrec.gps_data,tagval[11],24); // error -> 0.0 0.0 get_gps_data(xxrec.gps_data,flati,flongi); // reduce long strings to %.4f } else *xxrec.gps_data = 0; if (tagval[12]) // camera make strncpy0(xxrec.make,tagval[12],20); else *xxrec.make = 0; if (tagval[13]) // camera model strncpy0(xxrec.model,tagval[13],20); else *xxrec.model = 0; if (tagval[14]) // camera lens strncpy0(xxrec.lens,tagval[14],20); else *xxrec.lens = 0; if (tagval[15]) // exposure time strncpy0(xxrec.exp,tagval[15],12); else *xxrec.exp = 0; if (tagval[16]) // Fnumber strncpy0(xxrec.fn,tagval[16],12); else *xxrec.fn = 0; if (tagval[17]) // focal length strncpy0(xxrec.fl,tagval[17],12); else *xxrec.fl = 0; if (tagval[18]) // ISO strncpy0(xxrec.iso,tagval[18],12); else *xxrec.iso = 0; xcc = 0; for (kk = NKX; kk < nk2; kk++) // extra indexed metadata if any { if (! tagval[kk]) continue; // no data strcpy(xmetarec+xcc,tagname[kk]); // construct series xcc += strlen(tagname[kk]); // "tagname=tagval^ " xmetarec[xcc++] = '='; strcpy(xmetarec+xcc,tagval[kk]); xcc += strlen(tagval[kk]); strcpy(xmetarec+xcc,"^ "); xcc += 2; } if (xcc > 0) xxrec.xmeta = zstrdup(xmetarec,"file_to_xxrec"); // add to xmeta output record else xxrec.xmeta = 0; for (ii = 0; ii < nk2; ii++) // free tagval memory if (tagval[ii]) zfree(tagval[ii]); nn = -1; for (iix = 0; iix < Nxxrec; iix++) { // find xxrec position in xxrec_tab[] nn = strcmp(RP,xxrec_tab[iix]->file); if (nn <= 0) break; // xxrec goes before or at posn iix } // = posn to add/replace/delete Fadd = Freplace = 0; if (nn != 0) Fadd = 1; // add new xxrec if (nn == 0) Freplace = 1; // replace existing xxrec if (Fadd) { spinlock(1); // make thread-safe 25.1 if (Nxxrec == maximages) { zmessageACK(Mwin,TX("exceed %d max files, cannot continue"),maximages); quitxx(); } for (ii = Nxxrec; ii > iix; ii--) // make empty slot xxrec_tab[ii] = xxrec_tab[ii-1]; // (move up to Nxxrec pointers) xxrec_tab[iix] = (xxrec_t *) zmalloc(sizeof(xxrec_t),"file_to_xxrec"); // insert new entry *xxrec_tab[iix] = xxrec; // 4ms to move 1m entries using 4 GHz CPU Nxxrec++; spinlock(0); } if (Freplace) { zfree(xxrec_tab[iix]->file); // free memory for old xxrec_tab[] if (xxrec_tab[iix]->keywords) zfree(xxrec_tab[iix]->keywords); if (xxrec_tab[iix]->title) zfree(xxrec_tab[iix]->title); if (xxrec_tab[iix]->desc) zfree(xxrec_tab[iix]->desc); if (xxrec_tab[iix]->xmeta) zfree(xxrec_tab[iix]->xmeta); *xxrec_tab[iix] = xxrec; // replace old entry with new } Findexnew += 1; // count updates since last full index 25.1 fid = fopen(image_index_file,"a"); // append new record to image index file if (! fid) goto file_err; nn = fprintf(fid,"file: %s\n",RP); // file real path name if (! nn) goto file_err; xxrec2 = xxrec_tab[iix]; nn = fprintf(fid,"data: %s^ %s^ %s^ %s^ %s^ %s\n", xxrec2->fdate, xxrec2->fsize, // file date, file size xxrec2->pdate, xxrec2->psize, // photo date, pixel size xxrec2->bpc, xxrec2->rating); // bits/color, rating if (! nn) goto file_err; if (xxrec2->keywords) { nn = fprintf(fid,"keywords: %s\n",xxrec2->keywords); // keywords if (! nn) goto file_err; } if (xxrec2->title) { nn = fprintf(fid,"title: %s\n",xxrec2->title); // title if (! nn) goto file_err; } if (xxrec2->desc) { nn = fprintf(fid,"desc: %s\n",xxrec2->desc); // description if (! nn) goto file_err; } nn = fprintf(fid,"loc: %s^ %s^ %s\n", // location, country, gps_data xxrec2->location, xxrec2->country, xxrec2->gps_data); if (! nn) goto file_err; nn = fprintf(fid,"foto: %s^ %s^ %s^ %s^ %s^ %s^ %s\n", // camera and exposure data xxrec2->make, xxrec2->model, xxrec2->lens, xxrec2->exp, xxrec2->fn, xxrec2->fl, xxrec2->iso); if (xxrec2->xmeta) { // 26.0 nn = fprintf(fid,"xmeta: %s\n",xxrec2->xmeta); // extra metadata record if (! nn) goto file_err; } nn = fprintf(fid,"END\n"); // EOL if (! nn) goto file_err; err = fclose(fid); if (err) goto file_err; update_thumbfile(RP); // refresh thumbnail return 0; file_err: zmessageACK(Mwin,TX("image index write error: %s"),strerror(errno)); if (fid) fclose(fid); fid = 0; return 3; } /************************************************************************************** Functions to read and write image index file on disk and update the image index memory table, xxrec_tab[] ***************************************************************************************/ // look-up filename in xxrec_tab[] and return its index (0 - Nxxrec) // returns -2 if invalid file name or file not found // returns -1 if file not in xxrec_tab[] int xxrec_index(ch *file) { int ii, jj, kk, rkk, last; ch *RP, fdate[20]; STATB statB; if (! file || *file != '/') return -2; // null or no leading '/' RP = f_realpath(file); // use real path if (! RP) return -2; // file not found if (! regfile(RP,&statB)) { // not a regular file zfree(RP); return 0; } if (Xindexlev < 1) goto notfound; // index not valid if (! Nxxrec) goto notfound; // index empty ii = Nxxrec / 2; // next table entry to search jj = (ii + 1) / 2; // next increment last = Nxxrec - 1; // last entry rkk = 0; while (true) // binary search { kk = strcmp(xxrec_tab[ii]->file,RP); // compare table entry to file2 if (kk > 0) { ii -= jj; // too high, go back in table if (ii < 0) goto notfound; } else if (kk < 0) { ii += jj; // too low, go forward in table if (ii > last) goto notfound; } else { // xxrec_tab[] found pretty_datetime(statB.st_mtime,fdate); // yyyy:mm:dd hh:mm:ss if (! strmatchN(fdate,xxrec_tab[ii]->fdate,19)) goto notfound; // check mod time matches zfree(RP); // (file modified outside fotocx) return ii; // success } jj = jj / 2; // reduce increment if (jj == 0) { jj = 1; // step by 1 element if (! rkk) rkk = kk; // save last direction else { if (rkk > 0 && kk < 0) goto notfound; // if direction change, fail if (rkk < 0 && kk > 0) goto notfound; } } } notfound: zfree(RP); return -1; } /**************************************************************************************/ // Get the image xxrec_tab[] for the given image file. // Returns pointer to xxrec in-memory index, or dummy if not found. // Returned xxrec fields are NOT subjects for zfree(). xxrec_t * get_xxrec(ch *file) { int ii; STATB statB; ch *RP; static xxrec_t xxrec; static ch file2[XFCC]; // largest accepted file name RP = f_realpath(file); // use real path if (! RP) return 0; // file not found if (! regfile(RP,&statB)) { // not a regular file zfree(RP); return 0; } if (image_file_type(RP) > VIDEO) { // not an image or video file zfree(RP); return 0; } if (image_file_type(RP) > VIDEO) { // not an image or video file zfree(RP); return 0; } ii = xxrec_index(file); // get xxrec_tab[] index if (ii >= 0) { zfree(RP); return xxrec_tab[ii]; // found } memset(&xxrec,0,sizeof(xxrec_t)); // build dummy xxrec strncpy0(file2,RP,XFCC); zfree(RP); xxrec.file = file2; pretty_datetime(statB.st_mtime,xxrec.fdate); snprintf(xxrec.fsize,16,"%ld",statB.st_size); *xxrec.pdate = 0; *xxrec.psize = 0; *xxrec.bpc = 0; *xxrec.rating = 0; xxrec.keywords = 0; xxrec.title = 0; xxrec.desc = 0; *xxrec.location = 0; *xxrec.country = 0; *xxrec.gps_data = 0; *xxrec.make = 0; *xxrec.model = 0; *xxrec.lens = 0; *xxrec.exp = 0; *xxrec.fn = 0; *xxrec.fl = 0; *xxrec.iso = 0; xxrec.xmeta = 0; return &xxrec; } /**************************************************************************************/ // Read image index files sequentially, return one xxrec_tab[] per call. // Set ftf = 1 for first read, will be reset to 0. // Returns xxrec or null for EOF or error. // Returned xxrec_t and its allocated pointers are subject to zfree(). // Used by index_rebuild() function. xxrec_t * read_xxrec_seq(int &ftf) { int ii, cc; xxrec_t *xxrec = 0; static FILE *fid = 0; static ch buff[indexrecl]; ch *pp; float flati, flongi; static ch *substring[10]; if (ftf) // initial call { ftf = 0; fid = fopen(image_index_file,"r"); if (! fid) { // 25.1 printf("read_xxrec_seq: no image index file \n"); // 26.0 return 0; } *buff = 0; // insure no leftover data for (ii = 0; ii < 10; ii++) // pre-allocate substring buffers substring[ii] = (ch *) malloc(100); } while (true) // read to next "file: " record { pp = fgets_trim(buff,indexrecl,fid); if (! pp) { fclose(fid); // EOF return 0; } if (strmatchN(pp,"file: ",6)) break; } xxrec = (xxrec_t *) zmalloc(sizeof(xxrec_t),"read_xxrec"); // allocate xxrec xxrec->file = zstrdup(buff+6,"read_xxrec"); // image file name while (true) // get recs following "file" record { pp = fgets_trim(buff,indexrecl,fid); if (! pp) break; if (strmatchN(pp,"END",3)) break; // end of recs for this file else if (strmatchN(pp,"data: ",6)) // file date, file size, { // photo date, pixel size, rating pp += 6; get_substrings(pp,'^',6,20,substring); strncpy0(xxrec->fdate,substring[0],20); strncpy0(xxrec->fsize,substring[1],16); strncpy0(xxrec->pdate,substring[2],20); strncpy0(xxrec->psize,substring[3],16); strncpy0(xxrec->bpc,substring[4],4); strncpy0(xxrec->rating,substring[5],4); } else if (strmatchN(pp,"keywords: ",10)) { // keywords xxrec->keywords = zstrdup(pp+10,"read_xxrec"); cc = strlen(xxrec->keywords); while (cc > 0 && xxrec->keywords[cc-1] == ' ') cc--; // remove trailing ", " (prior fotocx) while (cc > 0 && xxrec->keywords[cc-1] == ',') cc--; xxrec->keywords[cc] = 0; } else if (strmatchN(pp,"title: ",7)) // title xxrec->title = zstrdup(pp+7,"read_xxrec"); else if (strmatchN(pp,"desc: ",6)) // description xxrec->desc = zstrdup(pp+6,"read_xxrec"); else if (strmatchN(pp,"loc: ",5)) // location, country, GPS data { pp += 5; get_substrings(pp,'^',3,40,substring); strncpy0(xxrec->location,substring[0],40); strncpy0(xxrec->country,substring[1],40); strncpy0(xxrec->gps_data,substring[2],24); get_gps_data(xxrec->gps_data,flati,flongi); // validate, shorten to %.4f } else if (strmatchN(pp,"foto: ",6)) // make, model, lens, exp, fn, fl, iso { pp += 6; get_substrings(pp,'^',7,20,substring); strncpy0(xxrec->make,substring[0],20); strncpy0(xxrec->model,substring[1],20); strncpy0(xxrec->lens,substring[2],20); strncpy0(xxrec->exp,substring[3],12); strncpy0(xxrec->fn,substring[4],12); strncpy0(xxrec->fl,substring[5],12); strncpy0(xxrec->iso,substring[6],12); } else if (strmatchN(pp,"xmeta: ",7)) // extra metadata xxrec->xmeta = zstrdup(pp+7,"read_xxrec"); } return xxrec; } /**************************************************************************************/ // Write the image index files sequentially, 1 record per call // Set ftf = 1 for first call, will be reset to 0. // Set xxrec = 0 to close file after last write. // Returns 0 if OK, otherwise +N (diagnosed). // Used by index_rebuild() function. int write_xxrec_seq(xxrec_t *xxrec, int &ftf) // file need not exist { static FILE *fid = 0; int err, nn; if (ftf) // first call { ftf = 0; fid = fopen(image_index_file,"w"); if (! fid) goto file_err; } if (! xxrec) { // EOF call if (fid) { err = fclose(fid); fid = 0; if (err) goto file_err; } return 0; } nn = fprintf(fid,"file: %s\n",xxrec->file); // file: filename if (! nn) goto file_err; nn = fprintf(fid,"data: %s^ %s^ %s^ %s^ %s^ %s\n", xxrec->fdate, xxrec->fsize, // file date, file size xxrec->pdate, xxrec->psize, // photo date, pixel size xxrec->bpc, xxrec->rating); // bits/color, rating if (! nn) goto file_err; if (xxrec->keywords) { nn = fprintf(fid,"keywords: %s\n",xxrec->keywords); // keywords: aaaaa, bbbbb, ... if (! nn) goto file_err; } if (xxrec->title) { nn = fprintf(fid,"title: %s\n",xxrec->title); // title: text if (! nn) goto file_err; } if (xxrec->desc) { nn = fprintf(fid,"desc: %s\n",xxrec->desc); // desc: text if (! nn) goto file_err; } nn = fprintf(fid,"loc: %s^ %s^ %s\n", // loc: location, country, gps coordinates xxrec->location, xxrec->country, xxrec->gps_data); if (! nn) goto file_err; nn = fprintf(fid,"foto: %s^ %s^ %s^ %s^ %s^ %s^ %s\n", xxrec->make, xxrec->model, xxrec->lens, xxrec->exp, xxrec->fn, xxrec->fl, xxrec->iso); if (! nn) goto file_err; if (xxrec->xmeta) nn = fprintf(fid,"xmeta: %s\n",xxrec->xmeta); // xmeta: tag1=data1^ tag2=data2^ ... if (! nn) goto file_err; nn = fprintf(fid,"END\n"); // EOL if (! nn) goto file_err; return 0; file_err: zmessageACK(Mwin,TX("image index write error: %s"),strerror(errno)); if (fid) fclose(fid); fid = 0; quitxx(); return 2; } fotocx/fotocx.cc0000664000175000017500000055033615247006660012655 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** main main program - defaults, initializations, command line options check_outboards check and install required/optional outboard programs first_index user initial index decision at fotocx install time delete_event response function for main window delete event destroy_event response function for main window destroy event state_event response function for main window fullscreen state change drop_event response function for main window file drag-drop event progress_setgoal set/reset progress counter progress_addvalue increment progress value progress_getvalue get progress, 0 - goal progress_percent get progress, 0 - 100% timerfunc periodic function for top pamel update update_Fpanel update status parameters on F window top panel panelmessage create top panel message for short time display Fblock block/unblock functions that can interfere each-other paintlock block window paint during E1/E3 image updates Fpaint main / drawing window refresh (draw signal response function) Fpaintnow immediate Fpaint, not callable from threads Fpaint2 queue Fpaint, callable from threads Fpaint3 update drawing window section from updated E3 section Fpaint3_thread Fpaint3, callable from threads Fpaint0 same as Fpaint3 but uses E0 instead of E3 Fpaint4 update drawing window section (direct write) Fpaintmouse update drawing window within mouse circle mouse_event mouse event response function mouse_convert convert mouse/window space to image space m_zoom main window zoom in/out function KBevent send KB key from dialog to main window KBpress KB key press event function win_fullscreen set main window full screen status win_unfullscreen restore main window to former size set_mwin_title update the main window title bar draw_pixel draw one overlay pixel using image space erase_pixel erase one pixel draw_line draw overlay line in image space erase_line erase line draw_toplines draw or redraw a set of overlay lines draw_gridlines draw grid lines over image add_toptext add to set of overlay text strings draw_toptext draw set of overlay text strings erase_toptext remove text from set of overlay text strings draw_text draw overlay text on window in image space add_topcircle add a circle to set of overlay circles draw_topcircles draw the set of overlay circles in window space erase_topcircles erase the set of overlay circles draw_mousecircle draw a circle around pointer in image space draw_mousecircle2 2nd instance for paint/clone tracking circle draw_mousearc draw an ellipse around pointer in image space RGBmatch calculate match value for two RGB colors PIXmatch calculate match value for two pixels RGBfix check and repair bad RGB values edit_wwhhOK check file size for edit function edit_setup start an image edit function edit_cancel cancel image edit edit_fullsize convert preview to full size edit edit_done finish image edit edit_addhist format edit parms, add to edit hist edit_undo undo current edit (reset) edit_redo redo current edit edit_reset reset all edit changes m_undo_redo undo/redo depending on mouse button undo_redo_choice popup menu response function m_undo restore previous edit in undo/redo stack m_redo restore next edit in undo/redo stack undo_all undo all edits for image redo_all redo all edits for image save_undo save image in the undo stack load_undo load image from the undo stack takeMouse set mouse event function and special cursor freeMouse remove mouse event function, set normal cursor thread_start start thread in idle state thread_signal signal thread that work is pending thread_stop stop thread and wait for exit thread_wait wait for thread to become idle do_wthreads thread: start worker threads and wait save_params save parameters when fotocx exits load_params load parameters at fotocx startup free_resources free resources for the current image file ***************************************************************************************/ #define EX // disable extern declarations #include "fotocx.h" // (variables in fotocx.h are defined) using namespace zfuncs; /**************************************************************************************/ // fotocx main program int main(int argc, ch *argv[]) // Fotocx main program { ch *temp, *pp; ch *pid, *pidlist; int Fnewrelease = 0; int Fclone=0, cloxx=0, cloyy=0, cloww=0, clohh=0; int Fblankwindow = 0; int ii, nn, cc, err, yn; int Pindexlev; FTYPE ftype; FILE *fid; ch filename[200], newname[200], buff[200]; ch *prev_file = 0; double startsecs, freememory; float maxmegapix; ch *lost_settings_notify = TX("A new Fotocx release is being installed. \n" "You may need to restore custom settings."); startsecs = get_seconds(); // start time #ifdef DEBUG printf("*** DEBUG BUILD *** \n"); // note if makefile debug build 26.0 #endif pp = getenv("WSL_DISTRO_NAME"); // note if Windows WSL Linux if (pp && *pp) printf("Windows WSL %s\n",pp); zinitapp(Frelease,argc,argv); // initz. app and GTK, also zhomedir setlocale(LC_NUMERIC,"C"); // stop comma decimal points 26.1 // initialize default parameter values (saved parameters will override these) Fdevelop = 0; // no show developer menu Findexlev = 2; // fotocx command: index old + new files FMindexlev = 0; // file manager click: no index Xindexlev = 0; // actual index level (TBD) Pindexlev = -1; // no -xN index command parameter xxrec_tab = 0; // no image index yet Nxxrec = 0; // no image index table xxrec_tab[] Prelease = zstrdup("unknown","params"); // prev. release (params override) mwgeom[0] = mwgeom[1] = 20; // default main window geometry mwgeom[2] = 1000; mwgeom[3] = 760; // accomodate small screen *paneltext = 0; // no top panel text menu_style = zstrdup("both","params"); // default menu style iconsize = 32; // default menu icon size FBrgb[0] = FBrgb[1] = FBrgb[2] = 50; // F view background color GBrgb[0] = GBrgb[1] = GBrgb[2] = 200; // G view background color MFrgb[0] = MFrgb[1] = MFrgb[2] = 220; // menu font color MBrgb[0] = MBrgb[1] = MBrgb[2] = 60; // menu background color lc = zstrdup("en","params"); // default language code, english 26.0 application_font = zstrdup("FreeSans 10","params"); // default menu + dialog font 26.3 splcurve_minx = 5; // default curve node separation % startdisplay = zstrdup("previous file","params"); // start with previous image file ImagePosn = zstrdup("center","params"); // F-view image is centered zoomcount = 2; // zooms to reach 2x image size zoomratio = sqrtf(2); // corresp. zoom ratio Nkbsu = 0; // KB shortcut list is empty curr_file = 0; // no current file Ntopfolders = 0; // no top folders list yet Flastversion = 0; // gallery shows all versions curr_album = 0; // no current album copymove_loc = 0; // no current copy/move to location RGB_chooser_file = 0; // users RGB color chooser file thumbfolder = 0; // no thumbnail folder navi::thumbsize = 256; // gallery default thumbnail size initial_menu = 0; // command line menu function initial_file = 0; // start with image file or folder initial_album = 0; // command line album name video_command = zstrdup("vlc --play-and-exit %s","params"); // default video play command jpeg_def_quality = 90; // default .jpeg save quality raw_loader_command = zstrdup("dcraw -w -T -6 -q 0 ","params"); // default raw loader command 25.3 Fraw_match_embed = 0; // RAW loader match embedded image colormapfile = zstrdup("undefined","params"); // printer calibration color map Fcaps = 0; // show captions = off Faskquit = 0; // ask to quit = NO Fshowhidden = 0; // show hidden files = NO 26.4 Fpaintedits = 0; // not paint edits mode Fmousevents = 0; // no show mouse events popup text Fescape = 0; // no escape key pressed editrescale[0] = 1600; // default rescale memory editrescale[1] = 1200; cropsizes[0] = zstrdup("1920x1080","params"); // default crop size buttons cropsizes[1] = zstrdup("1600x900", "params"); // (must match fotocx.h 'cropmem') cropsizes[2] = zstrdup("1440x900", "params"); cropsizes[3] = zstrdup("1280x1024","params"); cropsizes[4] = zstrdup("1366x768", "params"); cropratios[0] = zstrdup("5:4", "params"); // default crop ratio buttons cropratios[1] = zstrdup("4:3", "params"); cropratios[2] = zstrdup("8:5", "params"); cropratios[3] = zstrdup("16:9","params"); cropratios[4] = zstrdup("2:1", "params"); gridsettings[GON] = 0; // grid off gridsettings[GXC] = gridsettings[GYC] = 2; // x/y-lines count gridsettings[GXF] = gridsettings[GYF] = 0; // x/y-lines offset imagefiletypes = zstrdup(".jpg .jpeg .png .jxl .tif .tiff .bmp .ico .ppm .gif .svg .xpm .tga " ,"params",100); // jxl RAWfiletypes = zstrdup(".arw .srf .sr2 .crw .cr2 .cr3 .dng .mdc .mrw .nef .nrw .raw .rw2 .srw ", "params",100); VIDEOfiletypes = zstrdup(".mp4 .flv .mov .avi .wmv .mpeg .mpg .h264 .webm ", "params",100); // end of parameter settings tagnamex[0] = meta_fdate_tag; // tag names for metadata items tagnamex[1] = meta_fsize_tag; // in xxrec_tab[] tagnamex[2] = meta_pdate_tag; tagnamex[3] = meta_psize_tag; tagnamex[4] = meta_bpc_tag; tagnamex[5] = meta_rating_tag; tagnamex[6] = meta_keywords_tag; tagnamex[7] = meta_title_tag; tagnamex[8] = meta_desc_tag; tagnamex[9] = meta_city_tag; tagnamex[10] = meta_country_tag; tagnamex[11] = meta_gps_tag; tagnamex[12] = meta_make_tag; tagnamex[13] = meta_model_tag; tagnamex[14] = meta_lens_tag; tagnamex[15] = meta_exp_tag; tagnamex[16] = meta_fnum_tag; tagnamex[17] = meta_flen_tag; tagnamex[18] = meta_iso_tag; tagname_alt_title[0] = "headline"; // alt. tag names for image title ATD tagname_alt_title[1] = "event"; // fotocx.h dimensions must match tagname_alt_title[2] = "abstract"; tagname_alt_desc[0] = "imagedescription"; // alt. tag names for description ATD tagname_alt_desc[1] = "caption-abstract"; // fotocx.h dimensions must match tagname_alt_desc[2] = "subject"; tagname_alt_desc[3] = "comment"; tagname_alt_desc[4] = "usercomment"; tagname_alt_desc[5] = "caption"; BLACK[0] = BLACK[1] = BLACK[2] = 0; // define RGB colors WHITE[0] = WHITE[1] = WHITE[2] = 255; RED[0] = 255; RED[1] = RED[2] = 0; GREEN[1] = 255; GREEN[0] = GREEN[2] = 0; BLUE[2] = 255; BLUE[0] = BLUE[1] = 0; memcpy(LINE_COLOR,RED,3*sizeof(int)); // initial drawing color Nval = (int *) zmalloc(maximages * sizeof(int),"Nval"); // static integer values 0-maximages for (int ii = 0; ii < maximages; ii++) Nval[ii] = ii; // file and folder names in fotocx home folder: /home//.fotocx/* #define makehomefolder(name1,name2) \ snprintf(name1,200,"%s/"#name2,get_zhomedir()); \ if (! dirfile(name1)) mkdir(name1,0750); makehomefolder(albums_folder,albums) makehomefolder(custom_kernel_folder,custom_kernel) makehomefolder(scripts_folder,custom_scripts) makehomefolder(index_folder,image_index) // image index folder, this release makehomefolder(markup_folder,markup) makehomefolder(mashup_folder,mashup) makehomefolder(palettes_folder,palettes) makehomefolder(pattern_folder,patterns) makehomefolder(printer_color_folder,printer_color) makehomefolder(saved_areas_folder,saved_areas) makehomefolder(saved_searches_folder,saved_searches) makehomefolder(slideshow_folder,slideshows) makehomefolder(slideshow_trans_folder,slideshow_trans) makehomefolder(translations_folder,translations) // 26.0 snprintf(parameters_file,199,"%s/parameters",get_zhomedir()); // fotocx parameters file snprintf(capstags_file,199,"%s/capstags",get_zhomedir()); // metadata tags for image captions snprintf(gallerymem_file,199,"%s/gallery_memory",get_zhomedir()); // recent gallery memory snprintf(image_folders_file,199,"%s/image_folders",index_folder); // top image and thumbnail folders snprintf(image_index_file,199,"%s/image_index",index_folder); // image index file snprintf(meta_index_file,199,"%s/meta_index",index_folder); // index extra metadata tags snprintf(KB_shortcuts_file,199,"%s/KB_shortcuts",get_zhomedir()); // KB shortcuts file snprintf(meta_picklist_file,199,"%s/meta_picklist",get_zhomedir()); // metadata picklist file snprintf(meta_report_tags_file,199,"%s/meta_report_tags",get_zhomedir()); // metadata batch report tags snprintf(meta_view_extras_file,199,"%s/meta_view_extra",get_zhomedir()); // view_meta extra tags picklist snprintf(recentfiles_file,199,"%s/recent_files",get_zhomedir()); // recent files file snprintf(recent_folders_file,199,"%s/recent_folders",get_zhomedir()); // recent folders file snprintf(searchresults_file,199,"%s/search_results",get_zhomedir()); // output of image search function snprintf(keywords_defined_file,199,"%s/keywords_defined",get_zhomedir()); // defined keywords file snprintf(raw_commands_file,199,"%s/raw_commands",get_zhomedir()); // RAW file loader commands file snprintf(bookmarks_file,199,"%s/bookmarks",get_zhomedir()); // gallery bookmarks file snprintf(custom_menu_file,199,"%s/custom_menu",get_zhomedir()); // custom menu file snprintf(plugins_file,199,"%s/plugins",get_zhomedir()); // plugin menu functions file snprintf(grid_picklist_file,199,"%s/grid_picklist",get_zhomedir()); // grid settings file snprintf(UG_file,199,"%s/translations/ug_en",get_zhomedir()); // default userguide file 26.5 // delete fotocx temp files if owner process is no longer running pidlist = 0; snprintf(buff,200,"pidof fotocx fotocx.x"); // get active fotocx PIDs fid = popen(buff,"r"); if (fid) { pp = fgets_trim(buff,200,fid); if (pp) pidlist = zstrdup(pp,"params"); pclose(fid); } if (! pidlist) pidlist = zstrdup("none","params"); snprintf(temp_folder,200,"%s/temp/temp-*",get_zhomedir()); // get existing /.../temp/temp-xxxxx 26.3 snprintf(buff,200,"find %s -type d 2>/dev/null",temp_folder); fid = popen(buff,"r"); while ((pp = fgets_trim(buff,200,fid))) { // loop temp folders pid = strrchr(pp,'-'); // -xxxxx (pid) if (! pid) continue; if (strstr(pidlist,pid+1)) continue; // PID still active, do not delete zshell("ack","rm -R -f %s",pp); // delete folder and contents } pclose(fid); zfree(pidlist); snprintf(temp_folder,200,"%s/temp/temp-%d",get_zhomedir(),getpid()); // temp folder: /.../temp/temp-xxxx/ 26.3 err = zshell("ack","mkdir -p -m 0750 %s",temp_folder); if (err) quitxx(); printf("temp files: %s \n",temp_folder); snprintf(URS_filename,200,"%s/undo_nn",temp_folder); // file name template for undo/redo files load_params(); // restore parameters from last session for (ii = 1; ii < argc; ii++) // process command line parameters { ch *pp = argv[ii]; if (strmatch(pp,"-home")) ii++; // -home homedir see zinitapp() above else if (strmatch(pp,"-help")) { // -help show user guide show_help("HELP MENU"); zmainsleep(1); } else if (strmatch(pp,"-clone") && argc > ii+4) { // -clone clone new instance Fclone = 1; // (internal use only) cloxx = atoi(argv[ii+1]); // window position and size cloyy = atoi(argv[ii+2]); // passed from parent instance cloww = atoi(argv[ii+3]); clohh = atoi(argv[ii+4]); ii += 4; } else if (strmatch(pp,"-lang")) // -lang language code lc = zstrdup(argv[++ii],"params"); else if (strmatch(pp,"-recent")) // -recent recent files Frecent = 1; else if (strmatch(pp,"-new")) // -new newest files Fnew = 1; else if (strmatch(pp,"-album") && argc > ii+1) // -album "name" album to open initial_album = zstrdup(argv[++ii],"params"); else if (strmatch(pp,"-prev")) // -prev previous file Fprev = 1; else if (strmatch(pp,"-blank")) // -blank blank window Fblankwindow = 1; else if (strmatch(pp,"-dev")) // -dev show develop menu Fdevelop = 1; else if (strmatch(pp,"-menu") && argc > ii+1) // -menu "name" do menu function initial_menu = zstrdup(argv[++ii],"params"); else if (strmatch(pp,"-cwp")) // -cwp sec "name" cycle wallpaper m_cycle_wallpaper(argc,argv); else if (strmatch(pp,"-x0")) // -x0 index level 0 Pindexlev = 0; else if (strmatch(pp,"-x1")) // -x1 index level 1 Pindexlev = 1; else if (strmatch(pp,"-x2")) // -x2 index level 2 Pindexlev = 2; else { // assume initial image file pp = combine_argvs(argc,argv,ii); // xxx xxxx.ext -> "xxx xxxx.ext" initial_file = zstrdup(pp,"params"); if (*pp == '\'' || *pp == '"') // if quotes, remove them strncpy0(initial_file,pp+1,strlen(pp)-1); if (*initial_file != '/') { // if no initial '/' cc = strlen(initial_file); // assume relative to CWD temp = zstrdup(getcwd(0,0),"params",cc+4); // get CWD if (temp) { strncatv(temp,200,"/",initial_file,null); // prepend CWD initial_file = temp; } } break; } } TX_init(lc,translations_folder); // GUI translation file 26.0 if (initial_menu) printf("initial menu: %s \n",initial_menu); if (initial_file) printf("initial file: %s \n",initial_file); if (initial_album) printf("initial album: %s \n",initial_album); if (! strmatch(lc,"en")) { // 26.5 snprintf(UG_file,199,"%s/translations/ug_%s",get_zhomedir(),lc); // get translated user guide if (! regfile(UG_file)) snprintf(UG_file,199,"%s/translations/ug_en",get_zhomedir()); } printf("userguide file: %s \n",UG_file); zsetfont(application_font); // default font for widgets 26.3 build_widgets(); // build window widgets and menus mainwin = Mwin; // zfuncs parent = main window if (Fclone) { // clone: open new window gtk_window_move(MWIN,cloxx,cloyy); // at passed position gtk_window_resize(MWIN,cloww,clohh); // with passed size } else { gtk_window_move(MWIN,mwgeom[0],mwgeom[1]); // main window geometry gtk_window_resize(MWIN,mwgeom[2],mwgeom[3]); // defaults or last session params } gtk_widget_show_all(Mwin); viewmode('F'); arrowcursor = gdk_cursor_new_for_display(display,GDK_TOP_LEFT_ARROW); // cursor for selection dragcursor = gdk_cursor_new_for_display(display,GDK_CROSSHAIR); // cursor for dragging targcursor = gdk_cursor_new_for_display(display,GDK_TARGET); // cursor for precise targeting drawcursor = gdk_cursor_new_for_display(display,GDK_PENCIL); // cursor for drawing lines blankcursor = gdk_cursor_new_for_display(display,GDK_BLANK_CURSOR); // invisible cursor dotcursor = gdk_cursor_new_for_display(display,GDK_DOT); // cursor for show_RGB() // check free memory, report estimated image size limits freememory = realmemory(); // avail. real memory in MB printf("free real memory: %.0f MB \n",freememory); maxmegapix = freememory / 32; // E1 + E3, 16 bytes/pixel each 26.3 printf("image size limit: %.0f megapixels \n",maxmegapix); // 26.3 wwhh_limit1 = 80000; // max image width or height wwhh_limit2 = maxmegapix * MEGA; // max image width x height if (freememory < 4000) { yn = zmessageYN(Mwin,TX("Main memory is too small to run Fotocx. \n" "You can try anyway if you wish. \n Continue?")); if (! yn) quitxx(); } // Report SMP (core) count for parallel threads. Hyperthreads and E-cores // have marginal value, but the kernel scheduler does not discriminate. NSMP = get_nprocs_conf(); // get actual CPU core count 25.2 NSMP -= 2; // don't use all of them 26.0 if (NSMP < 4) NSMP = 4; // minimum required for some functions if (NSMP > XSMP) NSMP = XSMP; // compile time limit printf("fotocx SMP threads: %d \n",NSMP); printf("monitor width: %d height: %d \n",monitor_ww,monitor_hh); // monitor pixel size strcpy(desktopname,"Desktop"); // default desktop folder name snprintf(filename,200,"%s/.config/user-dirs.dirs",getenv("HOME")); // get locale specific name for Desktop fid = fopen(filename,"r"); // for "copy to desktop" function if (fid) { while (true) { pp = fgets_trim(buff,200,fid); if (! pp) break; if (! strmatchN(pp,"XDG_DESKTOP_DIR=",16)) continue; pp = strchr(pp+16,'/'); if (! pp) continue; strncpy0(desktopname,pp+1,100); cc = strlen(desktopname); if (desktopname[cc-1] == '"') desktopname[cc-1] = 0; printf("locale desktop name: %s \n",desktopname); break; } fclose(fid); } if (strmatch(Prelease,Frelease)) Fnewrelease = 0; // check if new release 26.5 else Fnewrelease = 1; if (Fnewrelease) // new install or upgrade 26.0 { printf("*** Fotocx new release: %s \n",Frelease); // log new release zinitappfiles(1); // copy app data files to ~/.fotocx/* snprintf(filename,200,"%s/zdialog_geometry",get_zhomedir()); // remove zdialog memory files remove(filename); // (start new files from now) snprintf(filename,200,"%s/zdialog_inputs",get_zhomedir()); remove(filename); snprintf(filename,200,"%s/tags_defined",get_zhomedir()); // rename file 'tags_defined' to snprintf(newname,200,"%s/keywords_defined",get_zhomedir()); // to 'keywords_defined' rename(filename,newname); showz_textfile("doc","changelog",Mwin); // show change log zmessageACK(Mwin,lost_settings_notify); // show list of customizable files nn = check_outboards(1); // check req./opt. outboard programs, if (nn) { // add image file types supported printf("*** %d required programs not installed, EXIT \n",nn); // (display table of outboards) quitxx(); } first_index(); // initial user indexing decision Prelease = zstrdup(Frelease,"params"); // update installed release initial_file = 0; // no initial file Pindexlev = -1; // no -x index parameter set } else zinitappfiles(0); // copy any missing app data files 26.0 nn = check_outboards(0); // check req./opt. outboard programs, if (nn) { // add image file types supported printf("*** %d required programs not installed, EXIT \n",nn); // (silent - no table display) quitxx(); } // restore data and settings from prior sessions zdialog_inputs("load"); // load saved dialog inputs zdialog_geometry("load"); // load saved dialogs position/size gallery_memory("load"); // load recent gallery positions KB_shortcuts_load(); // load KB shortcuts from file // image file index creation or update if (Pindexlev < 0) { // no -x0 -x1 -x2 command parameter if (initial_file) Pindexlev = FMindexlev; // use file manager index level (settings) else Pindexlev = Findexlev; // use normal index level (settings) } if (Fnewrelease) m_index(0,0); // if new release, manual index 26.5 else { index_rebuild(Pindexlev,0); // 0/1/2 = none/old-index/old+search new if (Xindexlev < Pindexlev) m_index(0,0); // failed, do manual index } save_params(); // save parameters now prev_file = curr_file; // prev_file = last session curr. file curr_file = 0; // set current file and gallery from command line if present if (initial_file) // command line file or folder { ftype = image_file_type(initial_file); if (ftype == FDIR) { // folder gallery(initial_file,"init",0); // initz. gallery gallery(0,"sort",-2); // recall sort and position viewmode('G'); } else if (ftype == IMAGE || ftype == RAW || ftype == VIDEO) { // image file gallery(initial_file,"init",0); // initz. gallery from initial file gallery(0,"sort",-2); f_open(initial_file); viewmode('F'); } else { if (Ntopfolders) { gallery(topfolders[0],"init",0); gallery(0,"sort",-2); viewmode('G'); } } } else if (initial_album) { // -album albumname printf("initial album: %s \n",initial_album); snprintf(filename,200,"%s/albums/%s",get_zhomedir(),initial_album); album_show(filename); } else if (Fprev) { // -prev if (prev_file && *prev_file == '/') { f_open(prev_file); viewmode('F'); } } else if (Frecent) // start with recent files gallery m_recentfiles(0,0); else if (Fnew) // start with newest files gallery m_newest_files(0,"file"); // by file mod date else if (Fblankwindow) { // blank window, no gallery if (navi::galleryname) zfree(navi::galleryname); navi::galleryname = 0; navi::gallerytype = TNONE; set_mwin_title(); } // if no command line option, get startup display from user settings else if (strmatch(startdisplay,"start folder")) { // start with specified gallery (folder) if (startfolder && *startfolder == '/') { gallery(startfolder,"init",0); gallery(0,"sort",-2); // recall sort and position viewmode('G'); } } else if (strmatch(startdisplay,"start file")) { // start with given image file f_open(startfile); viewmode('F'); } else if (strmatch(startdisplay,"start album")) { printf("initial album: %s \n",startalbum); album_show(startalbum); } else if (strmatch(startdisplay,"previous file")) { // start with previous image file err = 1; if (prev_file && *prev_file == '/') { err = f_open(prev_file,0,0,0,0); // no diagnostic if missing viewmode('F'); } if (err) { // not available, use topfolder[0] 26.0 if (Ntopfolders) { gallery(topfolders[0],"init",0); viewmode('G'); } else { gallery(getenv("HOME"),"init",0); viewmode('G'); } } } else if (strmatch(startdisplay,"recent files")) // start with recent files gallery m_recentfiles(0,0); else if (strmatch(startdisplay,"newest files")) // start with newest files gallery m_newest_files(0,"file"); // by file mode date else if (Ntopfolders) { // start with first topfolders[] 26.0 gallery(topfolders[0],"init",0); viewmode('G'); } else { gallery(getenv("HOME"),"init",0); // last resort, user $HOME folder 26.0 viewmode('G'); } printf("start gallery: %s \n",navi::galleryname); printf("start file: %s \n",curr_file); g_timeout_add(100,timerfunc,0); // start timer function, 100 ms interval startsecs = get_seconds() - startsecs; printf("startup time: %.1f secs.\n",startsecs); if (initial_menu) { // startup menu on command line for (ii = 0; ii < Nmenus; ii++) { // convert menu name to menu function if (! menutab[ii].menu) continue; // separator, null menu if (strmatchcase(initial_menu,menutab[ii].menu)) break; // 26.0 if (strmatchcase(TX(initial_menu),menutab[ii].menu)) break; if (strmatchcase(initial_menu,TX(menutab[ii].menu))) break; } if (ii < Nmenus) menutab[ii].func(0,menutab[ii].arg); // call the menu function } zmainsleep(0.01); // insure window update gtk_main(); // start processing window events printf("return from gtk_main() \n"); return 0; } /**************************************************************************************/ // Check that necessary outboard programs are installed. // List optional programs for added capabilities. // Return 0/1 if all required programs are/not installed. int check_outboards(int fshow) { zdialog *zdpop; char command[100]; int ii, cc, err; int Fmissing; char *pp1, *pp2; typedef struct { char prog[20]; char purp[20]; char req[4]; char avail[4]; char pack[32]; int *installed; } outboard_t; // table of outboard programs -- addr2line removed 26.7 -- #define NOB 8 outboard_t OB[NOB] = { // program purpose REQ AVAIL package (debian) status flag { "exiftool", "metadata", "yes", "no", "libimage-exiftool-perl", &Fexiftool }, { "dcraw", "RAW files", "yes", "no", "dcraw", &Fdcraw }, { "ffmpeg", "video files", "no", "no", "ffmpeg", &Ffmpeg }, { "dwebp", ".webp files", "no", "no", "webp", &Fwebp }, { "heif-convert", ".heic files", "no", "no", "libheif-examples", &Fheif }, { "heif-convert", ".avif files", "no", "no", "libheif-examples", &Fheif }, { "opj_decompress", ".jp2 files", "no", "no", "libopenjp2-tools", &Fjp2 }, { "vlc", "video play", "no", "no", "vlc", &Fvlc } }; Fmissing = 0; for (ii = 0; ii < NOB; ii++) // mark available programs and { // count missing required programs snprintf(command,100,"which %s >/dev/null 2>&1",OB[ii].prog); err = system(command); if (err == 0) { strcpy(OB[ii].avail,"yes"); *OB[ii].installed = 1; pp1 = OB[ii].purp; if (*pp1 == '.') { // add to image file types list pp2 = strchr(pp1,' '); cc = pp2 - pp1; strncat(imagefiletypes,pp1,cc+1); // append ".ext " + null } } else { *OB[ii].installed = 0; printf("outboard program %s is not installed \n",OB[ii].prog); if (OB[ii].req[0] == 'y') Fmissing++; } } if (Fmissing || fshow) // if anything missing or 'fshow' arg { // output a status report zdpop = popup_report_open(TX("Outboard Programs"),Mwin,700,300,0,1,0,"OK",null); popup_report_write(zdpop,1,"%-18s %-16s %-5s %-7s %s \n", "program","purpose","REQ","AVAIL","package (debian)"); for (ii = 0; ii < NOB; ii++) { popup_report_write(zdpop,0,"%-18s %-16s %-5s %-7s %s \n", OB[ii].prog, OB[ii].purp, OB[ii].req, OB[ii].avail, OB[ii].pack); } if (Fmissing) { // must install missing required programs popup_report_write(zdpop,0,"\n"); popup_report_write(zdpop,1,TX("Install following programs using your package manager: \n")); for (ii = 0; ii < NOB; ii++) { if (OB[ii].req[0] == 'y' && OB[ii].avail[0] == 'n') popup_report_write(zdpop,0,"%-18s %-16s %-5s %-7s %s \n", OB[ii].prog, OB[ii].purp, OB[ii].req, OB[ii].avail, OB[ii].pack); } } else { popup_report_write(zdpop,0,"\n"); popup_report_write(zdpop,1,TX("Required programs are installed. \n")); // 26.5 } zdialog_wait(zdpop); } return Fmissing; } /**************************************************************************************/ // Fotocx first index - initial user decision about indexing void first_index() { zdialog *zd; int zstat; ch *info = TX(" Indexing time depends on the number, type, and size of \n" " your image files and the speed of your computer. This can \n" " range from a few hundred to over 10 thousand per minute. \n" " You can change index options later, using these menus: \n" " Tools > Index, Tools > Settings. \n"); /*** ___________________________________________________________ | Fotocx First Index | | | | Indexing time depends on the number, type, and size of | | your image files and the speed of your computer. This can | | range from a few hundred to over 10 thousand per minute. | | You can change index options later, using these menus: | | Tools > Index, Tools > Settings. | | | | [Help] [Proceed] [Quit] | |___________________________________________________________| ***/ zd = zdialog_new("Fotocx First Index",Mwin,TX("Help"),TX("Proceed"),TX("Quit"),null); zdialog_add_widget(zd,"text","info","dialog",info,"space=10"); zdialog_run(zd,0,"parent"); zstat = zdialog_wait(zd); while (zstat == 1) { // [Help] zd->zstat = 0; show_help(TX("FIRST INDEX")); zstat = zdialog_wait(zd); } if (zstat == 2) // [Proceed] button { topfolders[0] = zstrdup(getenv("HOME"),"top-folders"); // default top folder = /home/ Ntopfolders = 1; zdialog_free(zd); Findexlev = 2; // current index + search new } else { // [Quit] zdialog_free(zd); quitxx(); } return; } /**************************************************************************************/ // functions for main window event signals int delete_event() // main window [x] button { printf("main window delete event \n"); m_quit(0,0); // returns if user does not quit return 1; } int destroy_event() // main window destroyed { printf("*** main window destroy event \n"); // no user bailout possible quitxx(); return 0; } int state_event(GtkWidget *, GdkEvent *event) // main window state changed { int state = ((GdkEventWindowState *) event)->new_window_state; // track window fullscreen status if (state & GDK_WINDOW_STATE_FULLSCREEN) Ffullscreen = 1; else if (state & GDK_WINDOW_STATE_MAXIMIZED) Ffullscreen = 1; else Ffullscreen = 0; return 0; } void drop_event(int mousex, int mousey, ch *file) // file drag-drop event { if (! file) return; printf("drag-drop file: %s \n",file); f_open(file,0,0,1); return; } /************************************************************************************** Overview of function busy and progress tracking Fbusy(+1) increase count of busy functions Fbusy(-1) decrease count of busy functions Fbusy() return count of busy functions int Fescape if Fbusy > 0, set Fescape to kill busy function fotocx.h busy function must reset when done double progress_goal; process goal value double progress_done[XSMP]; progress per thread initialize: progress_setgoal(goal) end goal value add progress: progress_addvalue(value) increment function progress progress_addvalue(index,value) increment thread progress get progress: progress_getvalue() get progress, 0 - goal pct = progress_percent() get progress, 0 - 100% reset to idle: progress_setgoal(0) reset, stop progress tracking timerfunc periodic function for top pamel update update_Fpanel update status parameters on F-view top panel show "working" if Fbusy > 0 and progress_goal = 0 show "working nn%" if progress_goal > 0 panelmessage show short-time message in top panel ***************************************************************************************/ // Fbusy(+1) increment count of busy functions and return new count // Fbusy(-1) decrement count of busy functions and return new count // Fbusy() return count of busy functions (default arg = 0) // call from threads is OK int Fbusy(int increment) // 26.5 { static int NFbusy = 0; if (increment == 0) return NFbusy; else zadd_locked(NFbusy,increment); if (main_thread()) update_Fpanel(); // includes zmainloop() return NFbusy; } /**************************************************************************************/ namespace progress_tracking { double progress_goal; // goal value double progress_done[XSMP]; // progress per thread } // reset thread counters and set new goal value (0 = inactive) void progress_setgoal(double goal) { using namespace progress_tracking; for (int ii = 0; ii < XSMP; ii++) progress_done[ii] = 0; progress_goal = goal; return; } // accumulate progress value, 0 - goal void progress_addvalue(double value) { using namespace progress_tracking; progress_done[0] += value; return; } // increment progress counter per thread void progress_addvalue(int index, double value) { using namespace progress_tracking; progress_done[index] += value; return; } // get progress value, 0 - goal int progress_getvalue() { using namespace progress_tracking; double progress = 0; if (progress_goal == 0) return 0; for (int ii = 0; ii < XSMP; ii++) progress += progress_done[ii]; return progress; } // get progress value, percent 0-100 int progress_percent() { using namespace progress_tracking; double progress = 0; int pct; if (progress_goal == 0) return 0; for (int ii = 0; ii < XSMP; ii++) progress += progress_done[ii]; pct = 100.0 * progress / progress_goal; return pct; } /**************************************************************************************/ // Periodic function - started by main() after initializations // 25.0 int timerfunc(void *) { if (Fshutdown) return 0; // shutdown underway if (Fpaintrequest && Cdrawin && ! Fpaintlock) // paint request pending, not blocked gtk_widget_queue_draw(Cdrawin); Fpaint3_main(); // update window area from thread update_Fpanel(); // update top panel information return 1; } /**************************************************************************************/ // update F window top panel with current status information // called from timer function void update_Fpanel() { ch paneltext1[300]; // note global 'paneltext' in fotocx.h static ch priortext1[300] = ""; ch *pp, text[100]; int ww, hh, scale, bpc; float file_MB; if (! main_thread()) zappcrash("panel update from thread"); if (! Fpanelshow) { // remove panel if (! *priortext1) return; *priortext1 = 0; gtk_widget_hide(Fpanel); return; } if (FGM == 'G') { // gallery panel only has 'working' goto update_progress; return; } if (FGM != 'F') return; // file panel has all data *paneltext1 = *text = 0; if (curr_file && Fpxb) { if (E3pxm) { // edit function engaged ww = E3pxm->ww; // pano does not update Eww/Ehh hh = E3pxm->hh; } else { ww = Fpxb->ww; hh = Fpxb->hh; } bpc = curr_file_bpc; // file bits per channel snprintf(text,100," %dx%dx%d",ww,hh,bpc); // width x height x bits strncatv(paneltext1,300,text,null); if (CEF && CEF->Fpreview) strncatv(paneltext1,300," (reduced)",null); // (reduced) 45% scale = Mscale * 100 + 0.5; snprintf(text,100," %d%c",scale,'%'); strncatv(paneltext1,300,text,null); if (URS_pos) { // edit undo/redo stack depth snprintf(text,100," edits: %d",URS_pos); // edits N strncatv(paneltext1,300,text,null); } if (! URS_pos && ! CEF) { // if not modified, file size file_MB = 1.0 / MEGA * curr_file_size; // N.NN MB snprintf(text,100," %.2f MB",file_MB); strncatv(paneltext1,300,text,null); } if (Fmetamod) strncatv(paneltext1,300," ","meta mod",null); // metadata modified } if (sa_stat == sa_stat_fini) strncatv(paneltext1,300," area active",null); if (zdialog_count) strncatv(paneltext1,300," dialog open",null); if (CEF && CEF->Fmods) strncatv(paneltext1,300," mod",null); // image is modified if (curr_file) { pp = strrchr(curr_file,'/'); // add filename.jpg if (pp && Ffullscreen && ! Fbusy()) { strncpy0(text,pp+1,100); strncatv(paneltext1,300," ",text,null); } } if (! strmatch(paneltext1,priortext1)) { // if text changed, update panel bar gtk_label_set_label(GTK_LABEL(Fpanlab),paneltext1); gtk_widget_show_all(Fpanel); strcpy(priortext1,paneltext1); } // show "working xx%" if progress_percent() > 0 // else show "working" in top panel if Fbusy() > 0 // show application text if paneltext (fotocx.h) has text to display update_progress: static GtkWidget *busylabel = 0, *donelabel = 0, *textlabel = 0; static ch busytext[] = " working "; static ch donetext[] = " working xx% "; static ch *doneposn = 0; GtkWidget *FGpanel; int pct; ch nn[4]; if (! main_thread()) return; // thread caller if (! Fpanelshow) return; // no panel if (FGM == 'F') FGpanel = Fpanel; else if (FGM == 'G') FGpanel = Gpanel; else return; pct = progress_percent(); // add "working xx%" to top panel if (pct > 0) { if (! doneposn) doneposn = (ch *) strstr(donetext,"xx%"); // position to insert "xx%" in donetext if (pct > 99) pct = 99; snprintf(nn,4,"%02d",pct); memcpy(doneposn,nn,2); if (! donelabel) { donelabel = gtk_label_new(0); // create label if not already gtk_box_pack_start(GTK_BOX(FGpanel),donelabel,0,0,5); } gtk_label_set_markup(GTK_LABEL(donelabel),donetext); } else { if (donelabel) gtk_widget_destroy(donelabel); donelabel = 0; } if (Fbusy() && pct == 0) { // add "working" to top panel if (! busylabel) { busylabel = gtk_label_new(0); gtk_box_pack_start(GTK_BOX(FGpanel),busylabel,0,0,5); } gtk_label_set_markup(GTK_LABEL(busylabel),busytext); } else { if (busylabel) gtk_widget_destroy(busylabel); busylabel = 0; } if (*paneltext) { // add application message 25.1 if (! textlabel) { textlabel = gtk_label_new(0); gtk_box_pack_start(GTK_BOX(FGpanel),textlabel,0,0,8); } gtk_label_set_markup(GTK_LABEL(textlabel),paneltext); } else { if (textlabel) gtk_widget_destroy(textlabel); textlabel = 0; } gtk_widget_show_all(FGpanel); zmainloop(); return; } /**************************************************************************************/ // add an application message to the Fotocx top panel bar // panelmessage(red, secs, format, ...) // red: 1 if message is bold red, 0 for plain text // secs: time to keep message on screen, 0 = forever until cancelled // format: variable format with optional args to be inserted into format void panelmessage(int red, int secs, ch *format, ...) // 25.1 { int panelmessage_timeout(void *); va_list arglist; ch message[200], messagebold[200]; if (! main_thread()) zappcrash("illegal call from thread"); va_start(arglist,format); vsnprintf(message,200,format,arglist); va_end(arglist); if (red) { snprintf(messagebold,200,"%s",message); strncpy0(message,messagebold,200); } strncpy0(paneltext,message,200); if (secs) g_timeout_add_seconds(secs,(GSourceFunc) panelmessage_timeout,0); return; } // clear the message when time expires int panelmessage_timeout(void *) { *paneltext = 0; return 0; } // unconditionally clear the message (use secs = 0 for clarity) void panelmessage(int secs) { *paneltext = 0; return; } /**************************************************************************************/ // block/unblock for mutex functions // block for calling function if not already blocked // block call: if (Fblock("funcname")) return; // unblock call: Fblock(0); int Fblock(ch *funcname) { static int blocked = 0; static ch Bfunction[20] = "no function"; if (funcname) printf("Fblock %s \n",funcname); // 25.1 else printf("Fblock \n"); if (funcname) { if (blocked) { // already blocked zmessageACK(Mwin,TX("blocking function: %s"),Bfunction); // caller must stop return 1; } blocked++; strncpy0(Bfunction,funcname,20); // block for caller return 0; } if (! blocked) printf("Fblock: not blocked \n"); // not blocked (OK) blocked = 0; // unblock return 0; } /**************************************************************************************/ // block main window painting during image updates from threads // Fpaintlock: if > 0 painting is blocked // d = 1: block painting // d = -1: unblock int paintlock(int d) { zadd_locked(Fpaintlock,d); // increment or decrement if (Fpaintlock < 0) zappcrash("Fpaintlock: %d %d",d,Fpaintlock); // fatal bug return 0; } /**************************************************************************************/ // GTK3 "draw" function for F mode drawing windows. // Paint window when created, exposed, resized, or image modified (edited). // Update window image if scale change or window size change. // Otherwise do only the draw function (triggered from GTK). // Draw the image section currently within the visible window. // May NOT be called from threads. See Fpaint2() for threads. int Fpaint(GtkWidget *Cdrawin, cairo_t *cr) { PIXBUF *pixbuf; PXB *pxb1; GdkRGBA rgba; static int pdww = 0, pdhh = 0; // prior window size float wscale, hscale, mscale; int fww, fhh; // current image size at 1x int mww, mhh; // scaled image size int morgx, morgy; int dorgx, dorgy; int centerx, centery; int Fsmallimage; int mousex, mousey; // mouse position after zoom uint8 *pixels, *pix, bgpix[3]; int rs, px, py; if (Fshutdown) return 1; // shutdown underway if (Fview360) return 1; if (! Cdrawin || ! Fgdkwin || ! Cstate || ! Cstate->fpxb) // no image return 1; Dww = gdk_window_get_width(Fgdkwin); // (new) drawing window size Dhh = gdk_window_get_height(Fgdkwin); if (Dww < 20 || Dhh < 20) return 1; // too small if (Dww != pdww || Dhh != pdhh) { // window size changed pdww = Dww; pdhh = Dhh; } if (Fpaintrequest && ! Fpaintlock) { if (FGM == 'F' && (E0pxm || E3pxm)) { // edit active, refresh image if (E3pxm) pxb1 = PXM_PXB_copy(E3pxm); // update fpxb from E0/E3 image else pxb1 = PXM_PXB_copy(E0pxm); // or use already edited image PXB_free(Cstate->fpxb); // 0.05 secs. typical Cstate->fpxb = pxb1; } Fpaintrequest = 0; } centerx = (Cstate->morgx + 0.5 * dww) / Cstate->mscale; // center of window, image space centery = (Cstate->morgy + 0.5 * dhh) / Cstate->mscale; // (before window or scale change) fww = Cstate->fpxb->ww; // 1x image size fhh = Cstate->fpxb->hh; wscale = 1.0 * Dww / fww; // calc. image scale for fit window hscale = 1.0 * Dhh / fhh; if (wscale < hscale) mscale = wscale; // use greatest ww/hh ratio else mscale = hscale; if (mscale > 1) Fsmallimage = 1; // flag, image < window size else Fsmallimage = 0; if (Cstate->fzoom == -1) { // fit to window A Cstate->mscale = mscale; // small image: expand to fit window Cstate->fzoom = 0; zoomx = zoomy = 0; // no zoom target } else if (Cstate->fzoom == 0) { // fit to window B Cstate->mscale = mscale; if (Fsmallimage) Cstate->mscale = 1; // small image: use 1x size zoomx = zoomy = 0; // no zoom target } else Cstate->mscale = Cstate->fzoom; // scale to fzoom level mww = fww * Cstate->mscale + 0.5; // scaled image size for window mhh = fhh * Cstate->mscale + 0.5; dww = Dww; // image fitting inside drawing window if (dww > mww) dww = mww; // image size dhh = Dhh; if (dhh > mhh) dhh = mhh; if (Cstate->mscale != Cstate->pscale) { // scale changed Cstate->morgx = Cstate->mscale * centerx - 0.5 * dww; // change origin to keep same center Cstate->morgy = Cstate->mscale * centery - 0.5 * dhh; // (subject to later rules) Cstate->pscale = Cstate->mscale; // remember scale } if (Cstate->mpxb) PXB_free(Cstate->mpxb); if (Cstate->mscale == 1) Cstate->mpxb = PXB_copy(Cstate->fpxb); // fast 1x image else Cstate->mpxb = PXB_rescale(Cstate->fpxb,mww,mhh); // rescaled image (0.02 secs. typical) if ((Mxdrag || Mydrag)) { // pan/scroll via mouse drag zoomx = zoomy = 0; // no zoom target Cstate->morgx -= round(Mwdragx); // same direction (drag) Cstate->morgy -= round(Mwdragy); } if (dww < Dww) Cstate->dorgx = 0.5 * (Dww - dww); // if scaled image < window width, else Cstate->dorgx = 0; // center image in window if (dhh < Dhh) Cstate->dorgy = 0.5 * (Dhh - dhh); else Cstate->dorgy = 0; if (strmatch(ImagePosn,"left")) Cstate->dorgx = 0; // shift image to left margin if (strmatch(ImagePosn,"right")) Cstate->dorgx = Dww-1 - dww; // shict image to right margin if (zoomx || zoomy) { // requested zoom center Cstate->morgx = Cstate->mscale * zoomx - 0.5 * dww; // corresp. window position within image Cstate->morgy = Cstate->mscale * zoomy - 0.5 * dhh; } if (Cstate->morgx < 0) Cstate->morgx = 0; // maximize image within window if (Cstate->morgy < 0) Cstate->morgy = 0; // (no unused margins) if (Cstate->morgx + dww > mww) Cstate->morgx = mww - dww; if (Cstate->morgy + dhh > mhh) Cstate->morgy = mhh - dhh; if (zoomx || zoomy) { // zoom target mousex = zoomx * Cstate->mscale - Cstate->morgx + Cstate->dorgx; mousey = zoomy * Cstate->mscale - Cstate->morgy + Cstate->dorgy; // mouse pointer follows target move_pointer(Cdrawin,mousex,mousey); zoomx = zoomy = 0; // reset zoom target } if (zd_darkbrite) darkbrite_paint(); // update dark/bright pixels rgba.red = 0.00392 * FBrgb[0]; // window background color rgba.green = 0.00392 * FBrgb[1]; // 0 - 255 --> 0.0 - 1.0 rgba.blue = 0.00392 * FBrgb[2]; rgba.alpha = 1.0; gdk_cairo_set_source_rgba(cr,&rgba); // background color to entire window cairo_paint(cr); // < 0.0001 seconds morgx = Cstate->morgx; // window position in (larger) image morgy = Cstate->morgy; dorgx = Cstate->dorgx; dorgy = Cstate->dorgy; if (BGpixbuf) g_object_unref(BGpixbuf); // 0.005 secs. typical BGpixbuf = gdk_pixbuf_new(GDKRGB,0,8,dww,dhh); pixels = gdk_pixbuf_get_pixels(BGpixbuf); rs = gdk_pixbuf_get_rowstride(BGpixbuf); bgpix[0] = FBrgb[0]; // background color bgpix[1] = FBrgb[1]; bgpix[2] = FBrgb[2]; for (py = 0; py < dhh; py++) for (px = 0; px < dww; px++) { pix = pixels + py * rs + px * 3; if (py % 10 < 2 && px % 10 < 2) // add periodic black dots memset(pix,0,3); else memcpy(pix,bgpix,3); } gdk_cairo_set_source_pixbuf(cr,BGpixbuf,dorgx,dorgy); // paint background image cairo_paint(cr); // < 0.01 seconds, 4K x 2K window pixbuf = Cstate->mpxb->pixbuf; // PXB->pixbuf if (! pixbuf) { zmessageACK(Mwin,"pixbuf failure"); exit(0); } pixbuf = gdk_pixbuf_new_subpixbuf(pixbuf,morgx,morgy,dww,dhh); // image section within window gdk_cairo_set_source_pixbuf(cr,pixbuf,dorgx,dorgy); // *** fails if morgy+dhh > 20K 26.61 cairo_paint(cr); // < 0.01 secs, 4K x 2K window g_object_unref(pixbuf); if (Cstate == &Fstate) { // view mode is image if (Ntoplines) draw_toplines(1,cr); // draw line overlays if (gridsettings[GON]) draw_gridlines(cr); // draw grid lines if (Ntoptext) draw_toptext(cr); // draw text strings if (Ntopcircles) draw_topcircles(cr); // draw circles if (Fshowarea) sa_show(1,cr); // draw select area outline if (zd_RGB_hist) m_RGB_hist(0,0); // update brightness histogram } return 1; } /**************************************************************************************/ // Repaint modified image immediately. // May NOT be called from threads. void Fpaintnow() { if (! pthread_equal(pthread_self(),tid_main)) zappcrash("Fpaintnow() called from thread"); if (! Cdrawin || ! Fgdkwin || ! Cstate || ! Cstate->fpxb) return; // no image Fpaintrequest = 1; // request repaint of changed image gtk_widget_queue_draw(Cdrawin); while (Fpaintrequest) zmainsleep(0.01); // necessary return; } // Cause (modified) output image to get repainted soon. // Fpaint() will be called by timerfunc() next timer cycle. // MAY be called from main() or threads. void Fpaint2() { Fpaintrequest = 1; // request repaint of changed image return; } // Update a section of Fpxb and Mpxb from an updated section of E3pxm, // then update the corresponding section of the drawing window. // This avoids a full image refresh, E3pxm > fpxb > mpxb > drawing window. // px3, py3, ww3, hh3: modified section within E3pxm to be propagated. // May NOT be called from threads. void Fpaint3(int px3, int py3, int ww3, int hh3, cairo_t *cr) { int crflag = 0; if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } PXM_PXB_update(E3pxm,Fpxb,px3,py3,ww3,hh3); // E3pxm > Fpxb, both 1x scale PXB_PXB_update(Fpxb,Mpxb,px3,py3,ww3,hh3); // Fpxb > Mpxb, scaled up or down Fpaint4(px3,py3,ww3,hh3,cr); // update drawing window from Mpxb if (crflag) draw_context_destroy(draw_context); return; } // Fpaint3 callable ONLY from threads. // Prepare data about region to update. // Main thread (below) does the window update. namespace Fpaint3_thread_names // window area to update from thread { int Fpaint3_lock = 0; int pending = 0; int px3a, py3a, ww3a, hh3a; } void Fpaint3_thread(int px3, int py3, int ww3, int hh3) { using namespace Fpaint3_thread_names; while (pending) zsleep(0.01); resource_lock(Fpaint3_lock); if (px3 < px3a) { ww3a += (px3a - px3); px3a = px3; } if (py3 < py3a) { hh3a += (py3a - py3); py3a = py3; } if (px3 + ww3 > px3a + ww3a) ww3a += px3 + ww3 - (px3a + ww3a); if (py3 + hh3 > py3a + hh3a) hh3a += py3 + hh3 - (py3a + hh3a); pending = 1; resource_unlock(Fpaint3_lock); return; } // called by timerfunc() each timer cycle // if pending, paint else return void Fpaint3_main() { using namespace Fpaint3_thread_names; if (! pending) return; resource_lock(Fpaint3_lock); cairo_t *cr = draw_context_create(Fgdkwin,draw_context); Fpaint3(px3a,py3a,ww3a,hh3a,cr); draw_context_destroy(draw_context); pending = 0; resource_unlock(Fpaint3_lock); return; } // same as Fpaint3 but uses E0pxm instead of E3pxm void Fpaint0(int px3, int py3, int ww3, int hh3, cairo_t *cr) { int crflag = 0; if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } PXM_PXB_update(E0pxm,Fpxb,px3,py3,ww3,hh3); PXB_PXB_update(Fpxb,Mpxb,px3,py3,ww3,hh3); Fpaint4(px3,py3,ww3,hh3,cr); if (crflag) draw_context_destroy(draw_context); return; } // Repaint a section of the Mpxb image in the visible window. // px3, py3, ww3, hh3: area to be repainted (in 1x image space). // May NOT be called from threads. // Writes directly on the window (cairo pixbuf paint). void Fpaint4(int px3, int py3, int ww3, int hh3, cairo_t *cr) { PIXBUF *pixbuf, *bgpixbuf; int px1, py1, ww1, hh1; int px2, py2, ww2, hh2; int crflag = 0; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->fpxb) return; // no image px2 = Mscale * px3 - 2; // 1x image space to Mpxb space py2 = Mscale * py3 - 2; // (expanded a few pixels) ww2 = Mscale * ww3 + 2 / Mscale + 4; hh2 = Mscale * hh3 + 2 / Mscale + 4; if (px2 < Morgx) { // reduce to currently visible window ww2 = ww2 - (Morgx - px2); px2 = Morgx; } if (py2 < Morgy) { hh2 = hh2 - (Morgy - py2); py2 = Morgy; } if (px2 + ww2 >= Mpxb->ww) ww2 = Mpxb->ww - px2 - 1; // stay within image if (py2 + hh2 >= Mpxb->hh) hh2 = Mpxb->hh - py2 - 1; if (ww2 <= 0 || hh2 <= 0) return; px1 = px2 - Morgx + Dorgx; // corresp. position in drawing window py1 = py2 - Morgy + Dorgy; if (px1 + ww2 >= Dww) ww2 = Dww - px1 - 1; // stay within window if (py1 + hh2 >= Dhh) hh2 = Dhh - py1 - 1; if (ww2 <= 0 || hh2 <= 0) return; pixbuf = gdk_pixbuf_new_subpixbuf(Mpxb->pixbuf,px2,py2,ww2,hh2); // Mpxb area to paint if (! pixbuf) { printf("*** Fpaint4() pixbuf failure \n"); return; } px2 = px1; // corresp. position in drawing window py2 = py1; px1 = px2 - Dorgx; // corresp. position in background image py1 = py2 - Dorgy; if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } if (Mpxb->nc > 3) { // alpha channel present ww1 = ww2; // draw background image to area hh1 = hh2; if (px1 + ww1 > dww) ww1 = dww - px1; if (py1 + hh1 > dhh) hh1 = dhh - py1; if (ww1 > 0 && hh1 > 0) { bgpixbuf = gdk_pixbuf_new_subpixbuf(BGpixbuf,px1,py1,ww1,hh1); if (bgpixbuf) { gdk_cairo_set_source_pixbuf(cr,bgpixbuf,px2,py2); cairo_paint(cr); g_object_unref(bgpixbuf); } else printf("*** Fpaint4() bgpixbuf failure \n"); } } gdk_cairo_set_source_pixbuf(cr,pixbuf,px2,py2); // draw area to window *** problem is here cairo_paint(cr); g_object_unref(pixbuf); if (Fshowarea) { px3 = (px2 - Dorgx + Morgx) / Mscale; // back to image scale, expanded py3 = (py2 - Dorgy + Morgy) / Mscale; ww3 = ww2 / Mscale + 2; hh3 = hh2 / Mscale + 2; sa_show_rect(px3,py3,ww3,hh3,cr); // refresh select area outline } if (crflag) draw_context_destroy(draw_context); return; } // update Mpxb and Fpxb from E3 image updated via mouse painting // then update corresponding portion of drawing window void Fpaintmouse(int mxposn, int myposn, int radius) { int px, py, ww, hh; px = mxposn - radius; py = myposn - radius; ww = radius + radius; hh = ww; if (px < 0) { ww += px; px = 0; } if (py < 0) { hh += py; py = 0; } if (px + ww > Eww) ww = Eww - px; if (py + hh > Ehh) hh = Ehh - py; Fpaint3(px,py,ww,hh,0); return; } /**************************************************************************************/ // F view - window mouse event function - capture buttons and drag movements void mouse_event(GtkWidget *widget, GdkEventButton *event, void *) { void mouse_convert(int xpos1, int ypos1, int &xpos2, int &ypos2); int button, time, type, scroll, thresh; static int bdtime = 0, butime = 0; static int dragstart = 0, mdragx0, mdragy0; #define GAPR GDK_AXIS_PRESSURE if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->fpxb) return; // no image type = event->type; button = event->button; // button, 1/2/3 = left/center/right time = event->time; Mwxposn = event->x; // mouse position in window Mwyposn = event->y; scroll = ((GdkEventScroll *) event)->direction; // scroll wheel event mouse_convert(Mwxposn,Mwyposn,Mxposn,Myposn); // convert to image space KBcontrolkey = KBshiftkey = KBaltkey = 0; if (event->state & GDK_CONTROL_MASK) KBcontrolkey = 1; if (event->state & GDK_SHIFT_MASK) KBshiftkey = 1; if (event->state & GDK_MOD1_MASK) KBaltkey = 1; if (button == 1 && KBaltkey) button = 3; // left butt + ALT key >> right butt thresh = 50 / Cstate->mscale; // 25.0 if (Mxposn > 0 && Mxposn < thresh && Myposn > 0 && Myposn < thresh) // if mouse near top left corner meta_popup_title(1); // popup title and description else meta_popup_title(0); if (type == GDK_SCROLL) { // scroll wheel = zoom zoomx = Mxposn; // zoom center = mouse position zoomy = Myposn; if (scroll == GDK_SCROLL_UP) m_zoom(0,"in"); if (scroll == GDK_SCROLL_DOWN) m_zoom(0,"out"); return; } if (type == GDK_BUTTON_PRESS) // button down { dragstart = 1; // possible drag start bdtime = time; // time of button down Mbutton = button; mdragx0 = Mwxposn; // window position at button down mdragy0 = Mwyposn; Mxdown = Mxposn; // image position at button down Mydown = Myposn; Mxdrag = Mydrag = 0; } if (type == GDK_MOTION_NOTIFY) { if (dragstart && time - bdtime > 200) // drag underway { if (Fmousevents) { if (Mbutton == 1) poptext_mouse("left drag",30,0,0,0.5); if (Mbutton == 3) poptext_mouse("right drag",30,0,0,0.5); } Mdrag = 1; Mwdragx = Mwxposn - mdragx0; // drag increment, window space Mwdragy = Mwyposn - mdragy0; mdragx0 = Mwxposn; // new drag origin = current position mdragy0 = Mwyposn; Mxdrag = Mxposn; // drag position, image space Mydrag = Myposn; mouse_dragtime = time - bdtime; // track drag duration gdk_event_get_axis((GdkEvent *) event, GAPR, &wacom_pressure); // wacom tablet stylus pressure } else Mwdragx = Mwdragy = Mxdrag = Mydrag = 0; // no drag underway } if (type == GDK_BUTTON_RELEASE) // button up { dragstart = 0; // reset drag status Mxclick = Myclick = 0; // reset click and drag status butime = time; // time of button up if (butime - bdtime < 500) // < 0.5 secs down, ignore motion { if (Mbutton == 1) if (Mbutton == 1) LMclick++; // left mouse click if (Mbutton == 3) RMclick++; // right mouse click if (Fmousevents) { if (KBshiftkey) { if (LMclick) poptext_mouse("shift + L-click",20,0,0,0.5); if (RMclick) poptext_mouse("shift + R-click",20,0,0,0.5); } else { if (LMclick) poptext_mouse("L-click",20,0,0,0.5); if (RMclick) poptext_mouse("R-click",20,0,0,0.5); } } Mxclick = Mxposn = Mxdown; // click = button down position Myclick = Myposn = Mydown; if (button == 2) { // center button click zoomx = Mxclick; // re-center at mouse (Doriano) zoomy = Myclick; gtk_widget_queue_draw(Cdrawin); } } Mxdrag = Mydrag = Mdrag = 0; // forget buttons and drag Mxdown = Mydown = Mbutton = 0; } Fmousemain = 1; // mouse acts on main window if (Mcapture) Fmousemain = 0; // curr. function handles mouse if (mouseCBfunc) Fmousemain = 0; // mouse owned by callback function if (KBcontrolkey) Fmousemain = 1; // mouse acts on main window if (mouseCBfunc && ! Fmousemain) { // pass to callback function (* mouseCBfunc)(); // remove busy test Fmousemain = 1; // click/drag params are processed here } // unless reset by callback func. if (! Fmousemain) return; // curr. function handles mouse if (LMclick) { // left click = zoom request LMclick = 0; zoomx = Mxclick; // zoom center = mouse zoomy = Myclick; m_zoom(0,"in"); } if (RMclick) { // right click RMclick = 0; if (Cstate->fzoom) { // if zoomed image, reset to fit window zoomx = zoomy = 0; m_zoom(0,"fit"); } else if (curr_file && FGM == 'F') image_Rclick_popup(); // image right-click popup menu } if (Mxdrag || Mydrag) // drag = scroll window by mouse gtk_widget_queue_draw(Cdrawin); return; } // convert mouse position from window space to image space void mouse_convert(int xpos1, int ypos1, int &xpos2, int &ypos2) { xpos2 = (xpos1 - Cstate->dorgx + Cstate->morgx) / Cstate->mscale + 0.5; ypos2 = (ypos1 - Cstate->dorgy + Cstate->morgy) / Cstate->mscale + 0.5; if (xpos2 < 0) xpos2 = 0; // if outside image put at edge if (ypos2 < 0) ypos2 = 0; if (E3pxm) { if (xpos2 >= Eww) xpos2 = Eww-1; if (ypos2 >= Ehh) ypos2 = Ehh-1; } else { if (xpos2 >= Cstate->fpxb->ww) xpos2 = Cstate->fpxb->ww-1; if (ypos2 >= Cstate->fpxb->hh) ypos2 = Cstate->fpxb->hh-1; } return; } /**************************************************************************************/ // set new image zoom level or magnification // zoom: meaning: // in zoom-in in steps // out zoom-out in steps // fit zoom to fit window (image < window >> 1x) // fit+ zoom to fit window (image < window >> fit window) // toggle toggle 1x and fit window (Z-key) (image < window >> fit window) void m_zoom(GtkWidget *, ch *zoom) { int fww, fhh; float scalew, scaleh, fitscale, fzoom2; float Czoom, Gzoom = 0, pixels; int64 z64 = 1; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->fpxb) return; // no image if (E3pxm) { // edit image active fww = Eww; // 1x image size fhh = Ehh; } else { fww = Cstate->fpxb->ww; fhh = Cstate->fpxb->hh; } scalew = 1.0 * Dww / fww; // calc. scale to fit window scaleh = 1.0 * Dhh / fhh; if (scalew < scaleh) fitscale = scalew; else fitscale = scaleh; Czoom = Cstate->mscale; // current image scale if (strmatch(zoom,"Zoom+")) zoom = "in"; // menu button: + = zoom in if (strmatch(zoom,"Zoom-")) zoom = "fit"; // - = fit window if (strmatch(zoom,"fit")) Gzoom = 0; // fit window (image < window >> 1x) if (strmatch(zoom,"fit+")) Gzoom = -1; // fit window (image < window >> fit window) if (strmatch(zoom,"toggle")) { // alternate 1x and fit window (Z-key) if (fabsf(Czoom - fitscale) < 0.01) Gzoom = 1; // at or near fit window: zoom to 1x else Gzoom = -1; // else fit window (image < win >> fit win) } for (fzoom2 = 0.0625; fzoom2 < 4.0; fzoom2 *= zoomratio) // find nearest natural ratio if (Czoom < fzoom2 * sqrt(zoomratio)) break; // fzoom2 = 0.0625 ... 4.0 if (strmatch(zoom,"in")) { // zoom in - make image larger Gzoom = fzoom2 * zoomratio; // next size step larger pixels = Gzoom * Gzoom * z64 * fww * fhh; // new image size in pixels if (pixels > wwhh_limit2) Gzoom = Czoom; // limit size if (Gzoom * fhh > 20000) Gzoom = Czoom; // compensate pixbuf/cairo bug (??) 26.61 } if (strmatch(zoom,"out")) { // zoom out - make image smaller Gzoom = fzoom2 / zoomratio; if (fitscale <= 1 && Gzoom < fitscale) Gzoom = -1; // large image: limit = fit window if (fitscale > 1 && Gzoom < 1) Gzoom = 1; // small image: limit = 1x } if (Gzoom > 0 && Gzoom != 1 && Gzoom != fitscale) { if (Gzoom > 0.124 && Gzoom < 0.126) Gzoom = 0.125; // hit these ratios exactly else if (Gzoom > 0.24 && Gzoom < 0.26) Gzoom = 0.25; else if (Gzoom > 0.49 && Gzoom < 0.51) Gzoom = 0.50; else if (Gzoom > 0.99 && Gzoom < 1.01) Gzoom = 1.00; else if (Gzoom > 1.99 && Gzoom < 2.01) Gzoom = 2.00; else if (Gzoom > 3.99) Gzoom = 4.0; // max. allowed zoom } Cstate->fzoom = Gzoom; // set new zoom size if (! Gzoom) zoomx = zoomy = 0; // no requested zoom center Fpaint2(); // refresh window return; } /**************************************************************************************/ // function for dialogs to call to send KB keys for processing by main program void KBevent(GdkEventKey *event) { KBpress(0,event,0); return; } // keyboard event functions // GDK key symbols: /usr/include/gtk-3.0/gdk/gdkkeysyms.h // zdialog completion button KB shortcuts removed namespace crop_names { void KBfunc(int key); } // keyboard functions called from here namespace perspective { void KBfunc(int key); } namespace mashup { void KBfunc(int key); } namespace view360 { void KB_func(int key); } int KBpress(GtkWidget *, GdkEventKey *event, void *) // keyboard key was pressed { int ii, jj, cc; ch shortkey[20] = ""; ch *action = 0; ch *file = 0, *qfile; static int Fshowmenu = 1; KBkey = event->keyval; // input key if ((KBkey & 0xfff0) == 0xffe0) return 1; // Ctrl/Shift/Alt key KBcontrolkey = KBshiftkey = KBaltkey = 0; // look for combination keys if (event->state & GDK_CONTROL_MASK) KBcontrolkey = 1; if (event->state & GDK_SHIFT_MASK) KBshiftkey = 1; if (event->state & GDK_MOD1_MASK) KBaltkey = 1; if (KBshiftkey && KBkey == GDK_KEY_plus) KBshiftkey = 0; // treat Shift [+] same as [+] if (KBkey == GDK_KEY_equal) KBkey = GDK_KEY_plus; // treat [=] same as [+] if (KBkey == GDK_KEY_KP_Add) KBkey = GDK_KEY_plus; // treat keypad [+] same as [+] if (KBkey == GDK_KEY_KP_Subtract) KBkey = GDK_KEY_minus; // treat keypad [-] same as [-] if (KBcontrolkey && KBkey == GDK_KEY_plus) KBcontrolkey = 0; // treat Ctrl/+ and Ctrl/- if (KBcontrolkey && KBkey == GDK_KEY_minus) KBcontrolkey = 0; // same as [+] and [-] if (KBkey == GDK_KEY_F1) { // F1 >> user guide, current topic show_help(F1_help_topic); return 1; } if (Fslideshow) { // slide show active ss_KBfunc(KBkey); // pass key to slide show return 1; } if (Fview360) { // view360 active view360::KB_func(KBkey); // pass key to view360 return 1; } if (KBkey == GDK_KEY_Escape) { // [esc] key pressed if (Fbusy()) Fescape = 1; // tell pending function to quit else if (CEF && zdialog_valid(CEF->zd)) { CEF->zd->zstat = -2; // zdialog [x] status 26.0 zdialog_send_event(CEF->zd,"zstat"); } else if (Ffullscreen) win_unfullscreen(); // full-screen mode, shrink else if (FGM != 'F') viewmode('F'); // file view mode if not already else m_quit(0,0); // quit fotocx return 1; // ESC also terminates dialogs } if (KBkey == GDK_KEY_F10) { // F10: fullscreen toggle with menu if (! Ffullscreen) win_fullscreen(0); // toggle full-screen mode and back else win_unfullscreen(); Fshowmenu = 1; return 1; } if (KBkey == GDK_KEY_F11) { // F11: fullscreen toggle without menu if (! Ffullscreen) win_fullscreen(1); // toggle full-screen mode and back else if (Fshowmenu) win_fullscreen(1); else win_unfullscreen(); Fshowmenu = 0; return 1; } if (KBkey == GDK_KEY_p) // P key, play video file { // (OK to also use P in shortcuts) if (! curr_file) return 1; if (image_file_type(curr_file) == VIDEO) { file = zescape_quotes(curr_file); cc = strlen(file) + 4; qfile = (ch *) zmalloc(cc,"KBpress"); strncatv(qfile,cc,"\"",file,"\"",null); zshell("log ack",video_command,qfile); // video-command "curr_file" zfree(file); zfree(qfile); return 1; } } if (KBkey == GDK_KEY_KP_Left) KBkey = GDK_KEY_Left; // map keypad keys if (KBkey == GDK_KEY_KP_Right) KBkey = GDK_KEY_Right; if (KBkey == GDK_KEY_KP_Up) KBkey = GDK_KEY_Up; if (KBkey == GDK_KEY_KP_Down) KBkey = GDK_KEY_Down; if (KBkey == GDK_KEY_KP_Home) KBkey = GDK_KEY_Home; if (KBkey == GDK_KEY_KP_End) KBkey = GDK_KEY_End; if (KBkey == GDK_KEY_KP_Page_Up) KBkey = GDK_KEY_Page_Up; if (KBkey == GDK_KEY_KP_Page_Down) KBkey = GDK_KEY_Page_Down; if (KBkey == GDK_KEY_KP_Add) KBkey = GDK_KEY_plus; // numeric keypad works the same if (KBkey == GDK_KEY_KP_Subtract) KBkey = GDK_KEY_plus; // with/without num-lock if (KBkey == GDK_KEY_KP_7) KBkey = GDK_KEY_Home; if (KBkey == GDK_KEY_KP_8) KBkey = GDK_KEY_Up; if (KBkey == GDK_KEY_KP_9) KBkey = GDK_KEY_Page_Up; if (KBkey == GDK_KEY_KP_4) KBkey = GDK_KEY_Left; if (KBkey == GDK_KEY_KP_6) KBkey = GDK_KEY_Right; if (KBkey == GDK_KEY_KP_1) KBkey = GDK_KEY_End; if (KBkey == GDK_KEY_KP_2) KBkey = GDK_KEY_Down; if (KBkey == GDK_KEY_KP_3) KBkey = GDK_KEY_Page_Down; if (KBkey == GDK_KEY_Delete) action = "Delete"; // reserved shortcuts if (KBkey == GDK_KEY_Left) action = "Left"; if (KBkey == GDK_KEY_Right) action = "Right"; if (KBkey == GDK_KEY_Up) action = "Up"; if (KBkey == GDK_KEY_Down) action = "Down"; if (KBkey == GDK_KEY_Home) action = "Home"; if (KBkey == GDK_KEY_End) action = "End"; if (KBkey == GDK_KEY_Page_Up) action = "Page_Up"; if (KBkey == GDK_KEY_Page_Down) action = "Page_Down"; if (KBkey == GDK_KEY_plus) action = "Zoom+"; if (KBkey == GDK_KEY_minus) action = "Zoom-"; if (KBkey == GDK_KEY_z) action = "toggle-zoom"; if (! action) // custom shortcut { if (KBkey >= GDK_KEY_F2 && KBkey <= GDK_KEY_F9) { // input key is F2 to F9 ii = KBkey - GDK_KEY_F1; strcpy(shortkey,"F1"); // convert to "F2" etc. shortkey[1] += ii; } if (! *shortkey && KBkey < 256) // single ascii character { if (KBcontrolkey) strcat(shortkey,"Ctrl+"); // build input key combination if (KBaltkey) strcat(shortkey,"Alt+"); // [Ctrl+] [Alt+] [Shift+] key if (KBshiftkey) strcat(shortkey,"Shift+"); cc = strlen(shortkey); shortkey[cc] = KBkey; shortkey[cc+1] = 0; } if (*shortkey) { // find key in shortcut list for (ii = 0; ii < Nkbsu; ii++) if (strmatchcase(shortkey,KBsutab[ii].key)) break; if (ii < Nkbsu) action = KBsutab[ii].menu; // corresp. action or function } } if (! action) { // 26.0 zmessage_post(Mwin,"parent",3,TX("shortcut not found: %s"),shortkey); return 1; } if (FGM == 'G') { // G view mode navi::KBaction((ch *) action); // pass KB action to gallery return 1; } if (KBcapture) return 1; // let current function handle it if (Fmashup) { // mashup active, pass KB key mashup::KBfunc(KBkey); return 1; } if (CEF && CEF->menufunc == m_crop) { // crop image active, pass KB key crop_names::KBfunc(KBkey); return 1; } if (strmatch(action,"Left")) { // left arrow - previous image m_prev(0,0); return 1; } if (strmatch(action,"Right")) { // right arrow - next image m_next(0,0); return 1; } if (strmatch(action,"Up")) { // up arrow - previous image m_prev(0,"jump"); // (last version, jump folder) return 1; } if (strmatch(action,"Down")) { // down arrow - next image m_next(0,"jump"); // (last version, jump folder) return 1; } if (strmatch(action,"Delete")) { // delete key - delete/trash dialog m_delete_trash(0,0); return 1; } if (strmatch(action,"Zoom+")) { // zoom center = mouse position zoomx = Mxposn; zoomy = Myposn; m_zoom(0,"in"); // zoom-in return 1; } if (strmatch(action,"Zoom-")) { // zoom to fit window m_zoom(0,"fit"); // small image >> 1x return 1; } if (strmatch(action,"toggle-zoom")) { // toggle zoom 1x / fit window m_zoom(0,"toggle"); // (Z-key) return 1; } // look up action in KB shortcut table, get corresp. function and arg. for (jj = 0; jj < Nkbsf; jj++) if (strmatchcase(TX(action),KBsftab[jj].menu)) break; // 26.0 if (jj == Nkbsf || ! KBsftab[jj].func) { // 26.0 zmessage_post(Mwin,"parent",3,TX("shortcut function not found: %s"),action); return 1; } KBsftab[jj].func(0,KBsftab[jj].arg); // call the menu function return 1; } int KBrelease(GtkWidget *win, GdkEventKey *event, void *) // KB key released { KBkey = 0; // reset current active key return 1; } /**************************************************************************************/ // set the main window to fullscreen status // (with or without menu and panel) void win_fullscreen(int hidemenu) { if (FGM == 'F' && hidemenu) { // if F window, hide panel gtk_widget_hide(MWmenu); gtk_widget_hide(Fpanel); Fpanelshow = 0; } if (hidemenu) gtk_window_fullscreen(MWIN); else gtk_window_maximize(MWIN); while (! Ffullscreen) zmainloop(); return; } // restore window to former size and restore menu etc. void win_unfullscreen() { gtk_window_unfullscreen(MWIN); // restore old window size gtk_window_unmaximize(MWIN); gtk_widget_show(MWmenu); gtk_widget_show(Fpanel); Fpanelshow = 1; while (Ffullscreen) zmainloop(); return; } /**************************************************************************************/ // update information in main window title bar void set_mwin_title() { GTYPE gtype; int cc, fposn, Gfiles, Gimages; ch *pp, titlebar[250]; ch pdate[20]; ch fname[100], gname[100], ffolder[100]; xxrec_t *xxrec; if (FGM != 'F') return; if (! curr_file || *curr_file != '/') { gtk_window_set_title(MWIN,Frelease); // include fotocx release return; } pp = (ch *) strrchr(curr_file,'/'); strncpy0(fname,pp+1,99); // file name cc = pp - curr_file; if (cc < 99) strncpy0(ffolder,curr_file,cc+2); // get folder/path/ if short enough else { strncpy(ffolder,curr_file,96); // or use /folder/path... strcpy(ffolder+95,"..."); } Gfiles = navi::Gfiles; // total gallery files (incl. folders) Gimages = navi::Gimages; // total image files fposn = file_position(curr_file,curr_file_posn); // curr. file in curr. gallery? if (fposn >= 0) { curr_file_posn = fposn; fposn = fposn + 1 - Gfiles + Gimages; // position among images, 1-based } xxrec = get_xxrec(curr_file); // photo date/time if (xxrec && *xxrec->pdate) strcpy(pdate,xxrec->pdate); else strcpy(pdate,"undated"); gtype = navi::gallerytype; if (gtype == FOLDER) // gallery name = folder snprintf(titlebar,250,"%s %d/%d %s %s %s", Frelease,fposn,Gimages,ffolder,fname,pdate); else { if (gtype == SEARCH || gtype == META) strcpy(gname,"SEARCH RESULTS"); else if (gtype == ALBUM) { pp = strrchr(navi::galleryname,'/'); if (! pp) pp = navi::galleryname; else pp++; strcpy(gname,"ALBUM: "); strncpy0(gname+7,pp,87); } else if (gtype == RECENT) strcpy(gname,"RECENT FILES"); else if (gtype == NEWEST) strcpy(gname,"NEWEST FILES"); else strcpy(gname,"NO GALLERY"); if (fposn > 0) snprintf(titlebar,250,"%s %s %d/%d %s %s %s", // window title bar Frelease,gname,fposn,Gimages,ffolder,fname,pdate); else snprintf(titlebar,250,"%s %s (*)/%d %s %s %s", // image not in gallery Frelease,gname,Gimages,ffolder,fname,pdate); } gtk_window_set_title(MWIN,titlebar); return; } /**************************************************************************************/ // draw a pixel using foreground color. // px, py are image space. // mode: 0 = scaled, 1 = thin pixel, 2 = fat pixel // scaled: thin pixel if zoom <= 1, fat pixel if zoom > 1 void draw_pixel(int px, int py, cairo_t *cr, int mode) { int qx, qy; static int pqx, pqy; static uint8 pixel[27]; // 3x3 block of RGB pixels static PIXBUF *pixbuf1 = 0, *pixbuf9 = 0; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->fpxb) return; // no image if (! pixbuf1) { pixbuf1 = gdk_pixbuf_new_from_data(pixel,GDKRGB,0,8,1,1,3,0,0); // 1x1 pixels pixbuf9 = gdk_pixbuf_new_from_data(pixel,GDKRGB,0,8,3,3,9,0,0); // 3x3 pixels } if (Cstate->fpxb->nc > 3) // omit transparent pixels if (PXBpix(Cstate->fpxb,px,py)[3] < 128) return; qx = Mscale * px - Morgx; // image to window space qy = Mscale * py - Morgy; if (qx == pqx && qy == pqy) return; // avoid redundant points pqx = qx; pqy = qy; if (qx < 0 || qx > dww-2) return; // keep off image edges if (qy < 0 || qy > dhh-2) return; if (mode == 1 || (mode == 0 && Mscale <= 1)) { // write 1x1 pixels pixel[0] = LINE_COLOR[0]; pixel[1] = LINE_COLOR[1]; pixel[2] = LINE_COLOR[2]; gdk_cairo_set_source_pixbuf(cr,pixbuf1,qx+Dorgx,qy+Dorgy); cairo_paint(cr); } else { // write 3x3 fat pixels pixel[0] = pixel[3] = pixel[6] = pixel[9] = pixel[12] = pixel[15] = pixel[18] = pixel[21] = pixel[24] = LINE_COLOR[0]; pixel[1] = pixel[4] = pixel[7] = pixel[10] = pixel[13] = pixel[16] = pixel[19] = pixel[22] = pixel[25] = LINE_COLOR[1]; pixel[2] = pixel[5] = pixel[8] = pixel[11] = pixel[14] = pixel[17] = pixel[20] = pixel[23] = pixel[26] = LINE_COLOR[2]; gdk_cairo_set_source_pixbuf(cr,pixbuf9,qx+Dorgx-1,qy+Dorgy-1); cairo_paint(cr); } return; } // erase one drawn pixel - restore from window image Mpxb. // px, py are image space. void erase_pixel(int px, int py, cairo_t *cr) { GdkPixbuf *pixbuf; int qx, qy, ww, hh, f; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->fpxb) return; // no image qx = Mscale * px; // image to window space qy = Mscale * py; if (qx < 0 || qx > Mpxb->ww-1) return; // pixel outside scaled image if (qy < 0 || qy > Mpxb->hh-1) return; if (qx < Morgx || qx > Morgx + dww-1) return; // pixel outside drawing window if (qy < Morgy || qy > Morgy + dhh-1) return; if (Mscale <= 1) f = 0; else f = 1; qx = qx - 1 - f; // erase fat pixel if Mscale > 1 qy = qy - 1 - f; ww = 3 + f; hh = 3 + f; if (qx < Morgx) qx = Morgx; if (qy < Morgy) qy = Morgy; if (qx + ww > Mpxb->ww) ww = Mpxb->ww - qx; if (qy + hh > Mpxb->hh) hh = Mpxb->hh - qy; pixbuf = gdk_pixbuf_new_subpixbuf(Mpxb->pixbuf,qx,qy,ww,hh); // Mpxb area to copy qx = qx - Morgx + Dorgx; // target pixel in window qy = qy - Morgy + Dorgy; gdk_cairo_set_source_pixbuf(cr,pixbuf,qx,qy); cairo_paint(cr); g_object_unref(pixbuf); return; } /**************************************************************************************/ // draw line. // coordinates are image space. // type = 1/2/3/4 = black/white/both/dash void draw_line(int x1, int y1, int x2, int y2, int type, cairo_t *cr) { float px1, py1, px2, py2; float R, px3, py3, px4, py4; double dashes[2] = { 8, 8 }; int crflag = 0; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->fpxb) return; // no image px1 = Mscale * x1 - Morgx + Dorgx; // image to window space py1 = Mscale * y1 - Morgy + Dorgy; px2 = Mscale * x2 - Morgx + Dorgx; py2 = Mscale * y2 - Morgy + Dorgy; if (px1 > Dww-2) px1 = Dww-2; // play nice if (py1 > Dhh-2) py1 = Dhh-2; if (px2 > Dww-2) px2 = Dww-2; if (py2 > Dhh-2) py2 = Dhh-2; if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } cairo_set_line_width(cr,2); if (type == 1) { cairo_set_source_rgb(cr,0,0,0); // black line cairo_set_dash(cr,dashes,0,0); cairo_move_to(cr,px1,py1); cairo_line_to(cr,px2,py2); cairo_stroke(cr); } if (type == 2) { cairo_set_source_rgb(cr,1,1,1); // white line cairo_set_dash(cr,dashes,0,0); cairo_move_to(cr,px1,py1); cairo_line_to(cr,px2,py2); cairo_stroke(cr); } if (type == 3) { cairo_set_source_rgb(cr,0,0,0); // black-white adjacent lines cairo_set_dash(cr,dashes,0,0); cairo_move_to(cr,px1,py1); cairo_line_to(cr,px2,py2); cairo_stroke(cr); R = sqrtf((px1-px2)*(px1-px2) + (py1-py2)*(py1-py2)); // offset = 2 pixels at right angle px3 = px1 - 2 * (py2-py1) / R; py3 = py1 + 2 * (px2-px1) / R; px4 = px3 + (px2-px1); py4 = py3 + (py2-py1); cairo_set_source_rgb(cr,1,1,1); cairo_set_dash(cr,dashes,0,0); cairo_move_to(cr,px3,py3); cairo_line_to(cr,px4,py4); cairo_stroke(cr); } if (type == 4) { cairo_set_source_rgb(cr,1,1,1); // dash line cairo_set_dash(cr,dashes,2,0); cairo_move_to(cr,px1,py1); cairo_line_to(cr,px2,py2); cairo_stroke(cr); cairo_set_source_rgb(cr,0,0,0); // compliment dash line in gaps cairo_set_dash(cr,dashes,2,8); // of first dash line cairo_move_to(cr,px1,py1); cairo_line_to(cr,px2,py2); cairo_stroke(cr); } if (crflag) draw_context_destroy(draw_context); return; } // erase line. refresh line path from mpxb window image. // double line width is erased. // coordinates are image space. void erase_line(int x1, int y1, int x2, int y2, cairo_t *cr) { float pxm, pym, slope; int crflag = 0; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->fpxb) return; // no image if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } if (abs(y2 - y1) > abs(x2 - x1)) { slope = 1.0 * (x2 - x1) / (y2 - y1); for (pym = y1; pym <= y2; pym++) { pxm = x1 + slope * (pym - y1); erase_pixel(pxm,pym,cr); } } else { slope = 1.0 * (y2 - y1) / (x2 - x1); for (pxm = x1; pxm <= x2; pxm++) { pym = y1 + slope * (pxm - x1); erase_pixel(pxm,pym,cr); } } if (crflag) draw_context_destroy(draw_context); return; } /**************************************************************************************/ // draw pre-set overlay lines on top of image // arg = 1: paint lines only (because window repainted) // 2: erase lines and forget them // 3: erase old lines, paint new lines, save new in old // line types defined in toplines[*].type void draw_toplines(int arg, cairo_t *cr) { int ii; int crflag = 0; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->fpxb) return; // no image if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } if (arg == 2 || arg == 3) // erase old lines for (ii = 0; ii < Nptoplines; ii++) erase_line(ptoplines[ii].x1,ptoplines[ii].y1, ptoplines[ii].x2,ptoplines[ii].y2,cr); if (arg == 1 || arg == 3) // draw new lines for (ii = 0; ii < Ntoplines; ii++) draw_line(toplines[ii].x1,toplines[ii].y1, toplines[ii].x2,toplines[ii].y2,toplines[ii].type,cr); if (crflag) draw_context_destroy(draw_context); if (arg == 2) { Nptoplines = Ntoplines = 0; // forget lines return; } for (ii = 0; ii < Ntoplines; ii++) // save for future erase ptoplines[ii] = toplines[ii]; Nptoplines = Ntoplines; return; } /**************************************************************************************/ // draw a grid of horizontal and vertical lines. // grid line spacings are in window space. void draw_gridlines(cairo_t *cr) { int px, py, gww, ghh; int startx, starty, endx, endy, stepx, stepy; int startx1, starty1; int crflag = 0; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->fpxb) return; // no image if (! gridsettings[GON]) return; // grid lines off gww = dww; // grid box size ghh = dhh; startx = Dorgx; // starting corner (top left) starty = Dorgy; endx = startx + gww; endy = starty + ghh; stepx = stepy = 0; // 25.1 if (gridsettings[GXC]) stepx = gww / (1 + gridsettings[GXC]); // if line counts specified, if (gridsettings[GYC]) // set spacing accordingly stepy = ghh / ( 1 + gridsettings[GYC]); startx1 = startx + stepx * gridsettings[GXF] / 100; // variable starting offsets starty1 = starty + stepy * gridsettings[GYF] / 100; if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } cairo_set_line_width(cr,2); cairo_set_source_rgb(cr,1,1,1); // white lines if (stepx) for (px = startx1; px < endx; px += stepx) { cairo_move_to(cr,px,starty); cairo_line_to(cr,px,endy); } if (stepy) for (py = starty1; py < endy; py += stepy) { cairo_move_to(cr,startx,py); cairo_line_to(cr,endx,py); } cairo_stroke(cr); cairo_set_source_rgb(cr,0,0,0); // adjacent black lines if (stepx) for (px = startx1+1; px < endx+1; px += stepx) { cairo_move_to(cr,px,starty); cairo_line_to(cr,px,endy); } if (stepy) for (py = starty1+1; py < endy+1; py += stepy) { cairo_move_to(cr,startx,py); cairo_line_to(cr,endx,py); } cairo_stroke(cr); if (crflag) draw_context_destroy(draw_context); return; } /**************************************************************************************/ // maintain a set of text strings written over the image in the window. // add a new text string to the list. // multiple text strings can be added with the same ID. // px and py are image space. void add_toptext(int ID, int px, int py, ch *text, ch *font) { if (Ntoptext == maxtoptext) { printf("*** maxtoptext exceeded \n"); return; } int ii = Ntoptext++; toptext[ii].ID = ID; toptext[ii].px = px; toptext[ii].py = py; toptext[ii].text = zstrdup(text,"toptext"); toptext[ii].font = zstrdup(font,"toptext"); return; } // draw current text strings over the image in window. // called from Fpaint(). void draw_toptext(cairo_t *cr) { int crflag = 0; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->fpxb) return; // no image if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } for (int ii = 0; ii < Ntoptext; ii++) draw_text(toptext[ii].px,toptext[ii].py,toptext[ii].text,toptext[ii].font,cr); if (crflag) draw_context_destroy(draw_context); return; } // delete text strings having the given ID from the list void erase_toptext(int ID) { int ii, jj; for (ii = jj = 0; ii < Ntoptext; ii++) { if (toptext[ii].ID == ID) { zfree(toptext[ii].text); zfree(toptext[ii].font); continue; } else toptext[jj++] = toptext[ii]; } Ntoptext = jj; return; } // draw overlay text on window, black on white background // coordinates are image space void draw_text(int px, int py, ch *text, ch *font, cairo_t *cr) { static PangoFontDescription *pangofont = 0; static PangoLayout *pangolayout = 0; static ch priorfont[60] = ""; int ww, hh; int crflag = 0; if (! Cdrawin) return; if (! Fgdkwin) return; px = Mscale * px - Morgx + Dorgx; // image to window space py = Mscale * py - Morgy + Dorgy; if (! strmatch(font,priorfont)) { // change font strncpy0(priorfont,font,60); if (pangofont) pango_font_description_free(pangofont); if (pangolayout) g_object_unref(pangolayout); pangofont = pango_font_description_from_string(font); // make pango layout for font pangolayout = gtk_widget_create_pango_layout(Cdrawin,0); pango_layout_set_font_description(pangolayout,pangofont); } pango_layout_set_text(pangolayout,text,-1); // add text to layout pango_layout_get_pixel_size(pangolayout,&ww,&hh); if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } cairo_set_source_rgb(cr,1,1,1); // draw white background cairo_rectangle(cr,px,py,ww+10,hh+10); // padding cairo_fill(cr); cairo_move_to(cr,px+5,py+5); // draw layout with text cairo_set_source_rgb(cr,0,0,0); pango_cairo_show_layout(cr,pangolayout); if (crflag) draw_context_destroy(draw_context); return; } /**************************************************************************************/ // maintain a set of circles drawn over the image in the window // px, py are image space, radius is window space void add_topcircle(int px, int py, int radius) { if (Ntopcircles == maxtopcircles) { printf("*** maxtopcircles exceeded \n"); return; } int ii = Ntopcircles++; topcircles[ii].px = px; topcircles[ii].py = py; topcircles[ii].radius = radius; return; } // draw current circles over the image in the window // called from window repaint function Fpaint() void draw_topcircles(cairo_t *cr) { double R, G, B; double px, py, rad; int ii, crflag = 0; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->fpxb) return; // no image R = LINE_COLOR[0] / 255.0; // use LINE_COLOR G = LINE_COLOR[1] / 255.0; B = LINE_COLOR[2] / 255.0; if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } for (ii = 0; ii < Ntopcircles; ii++) { px = topcircles[ii].px * Mscale - Morgx + Dorgx + 0.5; // image to window space py = topcircles[ii].py * Mscale - Morgy + Dorgy + 0.5; rad = topcircles[ii].radius; // radius is window space cairo_new_path(cr); cairo_set_source_rgb(cr,R,G,B); cairo_arc(cr,px,py,rad,0,2*PI); // draw 360 deg. arc cairo_stroke(cr); } if (crflag) draw_context_destroy(draw_context); return; } // erase top circles (next window repaint) void erase_topcircles() { Ntopcircles = 0; return; } /**************************************************************************************/ // Draw circle around the mouse pointer. // Prior circle will be erased first. // Used for mouse/brush radius in select and paint functions. // cx, cy, rad: center and radius of circle in image space. // if Ferase, then erase previous circle only. void draw_mousecircle(int cx, int cy, int rad, int Ferase, cairo_t *cr) { int px3, py3, ww3, hh3; static int ppx3, ppy3, pww3 = 0, phh3; int px, py, pok; double R, G, B; double t, dt, t1, t2; int crflag = 0; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->mpxb) return; // no image gdk_window_freeze_updates(Fgdkwin); // smoother image update if (pww3 > 0) { // erase prior Fpaint4(ppx3,ppy3,pww3,phh3,cr); // refresh from Mpxb pww3 = 0; } if (Ferase) { gdk_window_thaw_updates(Fgdkwin); return; // erase only, done } px3 = cx - rad - 2; // convert pointer center + radius py3 = cy - rad - 2; // to block position, width, length ww3 = 2 * rad + 4; hh3 = 2 * rad + 4; ppx3 = px3; // remember pixel block area ppy3 = py3; // to erase in next call pww3 = ww3; phh3 = hh3; cx = cx * Mscale - Morgx + Dorgx; // convert to window coordinates cy = cy * Mscale - Morgy + Dorgy; rad = rad * Mscale; R = LINE_COLOR[0] / 255.0; // use LINE_COLOR G = LINE_COLOR[1] / 255.0; B = LINE_COLOR[2] / 255.0; if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } cairo_set_source_rgba(cr,R,G,B,1.0); t1 = t2 = -1; // angle limits of arc to draw dt = 1.0 / rad; for (t = 0; t < 2*PI; t += dt) // loop 0-360 degrees { px = cx + rad * cos(t); // pixel on mouse circle py = cy + rad * sin(t); pok = 1; // assume pixel OK to draw if (px < Dorgx || py < Dorgy) pok = 0; // outside image limits if (px >= Dorgx+dww || py >= Dorgy+dhh) pok = 0; if (pok) { // pixel ok, add to arc if (t1 < 0) t1 = t; // start of arc to draw t2 = t; // end of arc, so far } else if (t1 >= 0) { // pixel not ok cairo_arc(cr,cx,cy,rad,t1,t2); // draw accumulated arc cairo_stroke(cr); t1 = t2 = -1; // start over } } if (t1 >= 0) { cairo_arc(cr,cx,cy,rad,t1,t2); // draw rest of arc cairo_stroke(cr); } if (crflag) draw_context_destroy(draw_context); gdk_window_thaw_updates(Fgdkwin); return; } // duplicate for drawing and tracking a 2nd mouse circle // (used by paint/clone to track source pixels being cloned) void draw_mousecircle2(int cx, int cy, int rad, int Ferase, cairo_t *cr) { int px3, py3, ww3, hh3; static int ppx3, ppy3, pww3 = 0, phh3; int px, py, pok; double R, G, B; double t, dt, t1, t2; int crflag = 0; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->mpxb) return; // no image if (pww3 > 0) { // erase prior Fpaint4(ppx3,ppy3,pww3,phh3,cr); // refresh from Mpxb pww3 = 0; } if (Ferase) return; // erase only, done px3 = cx - rad - 2; // convert pointer center + radius py3 = cy - rad - 2; // to block position, width, length ww3 = 2 * rad + 4; hh3 = 2 * rad + 4; ppx3 = px3; // remember pixel block area ppy3 = py3; // to erase in next call pww3 = ww3; phh3 = hh3; cx = cx * Mscale - Morgx + Dorgx; // convert to window coordinates cy = cy * Mscale - Morgy + Dorgy; rad = rad * Mscale; R = LINE_COLOR[0] / 255.0; // use LINE_COLOR G = LINE_COLOR[1] / 255.0; B = LINE_COLOR[2] / 255.0; if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } cairo_set_source_rgba(cr,R,G,B,1.0); t1 = t2 = -1; // angle limits of arc to draw dt = 1.0 / rad; for (t = 0; t < 2*PI; t += dt) // loop 0-360 degrees { px = cx + rad * cos(t); // pixel on mouse circle py = cy + rad * sin(t); pok = 1; // assume pixel OK to draw if (px < Dorgx || py < Dorgy) pok = 0; // outside image limits if (px >= Dorgx+dww || py >= Dorgy+dhh) pok = 0; if (pok) { // pixel ok, add to arc if (t1 < 0) t1 = t; // start of arc to draw t2 = t; // end of arc, so far } else if (t1 >= 0) { // pixel not ok cairo_arc(cr,cx,cy,rad,t1,t2); // draw accumulated arc cairo_stroke(cr); t1 = t2 = -1; // start over } } if (t1 >= 0) { cairo_arc(cr,cx,cy,rad,t1,t2); // draw rest of arc cairo_stroke(cr); } if (crflag) draw_context_destroy(draw_context); return; } /**************************************************************************************/ // Draw ellipse around the mouse pointer. // Prior ellipse will be erased first. // cx, cy, cww, chh: center and axes of ellipse in image space. // if Ferase, then erase previous ellipse only. void draw_mousearc(int cx, int cy, int cww, int chh, int Ferase, cairo_t *cr) { int px3, py3, ww3, hh3; static int ppx3, ppy3, pww3 = 0, phh3; int px, py; float a, b, a2, b2; float x, y, x2, y2; int crflag = 0; if (! Cdrawin) return; if (! Fgdkwin) return; if (! Cstate || ! Cstate->fpxb) return; // no image if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } if (pww3 > 0) { // erase prior Fpaint4(ppx3,ppy3,pww3,phh3,cr); // refresh from Mpxb pww3 = 0; } if (Ferase) { if (crflag) draw_context_destroy(draw_context); return; } px3 = cx - (cww + 2) / 2; // convert pointer center + radius py3 = cy - (chh + 2) / 2; // to block position, width, length ww3 = cww + 2; hh3 = chh + 2; ppx3 = px3; // remember pixel block area ppy3 = py3; // to erase in next call pww3 = ww3; phh3 = hh3; a = cww / 2; // ellipse constants from b = chh / 2; // enclosing rectangle a2 = a * a; b2 = b * b; for (y = -b; y < b; y++) // step through y values, omitting { // curve points covered by x values y2 = y * y; x2 = a2 * (1 - y2 / b2); x = sqrtf(x2); // corresp. x values, + and - py = y + cy; px = cx - x + 0.5; draw_pixel(px,py,cr); // draw 2 points on ellipse px = cx + x + 0.5; draw_pixel(px,py,cr); } for (x = -a; x < a; x++) // step through x values, omitting { // curve points covered by y values x2 = x * x; y2 = b2 * (1 - x2 / a2); y = sqrtf(y2); // corresp. y values, + and - px = x + cx; py = cy - y + 0.5; draw_pixel(px,py,cr); // draw 2 points on ellipse py = cy + y + 0.5; draw_pixel(px,py,cr); } if (crflag) draw_context_destroy(draw_context); return; } /**************************************************************************************/ // calculate a match value for two sets of RGB values // replace former macros // 0.0 = maximum unmatch (black/white pixels) // 1.0 = perfect match (same RGB values) float RGBmatch(uint8 r1, uint8 g1, uint8 b1, uint8 r2, uint8 g2, uint8 b2) { int dr, dg, db; float dist; float F768 = 1.0 / 768; dr = abs(r1 - r2); // 0-255 dg = abs(g1 - g2); db = abs(b1 - b2); dist = F768 * (dr + dg + db); // 0 - 1.0 dist = sqrtf(dist); return 1.0 - dist; } float RGBmatch(float r1, float g1, float b1, float r2, float g2, float b2) { float dr, dg, db; float dist; float F768 = 1.0 / 768; dr = fabsf(r1 - r2); // 0-255 dg = fabsf(g1 - g2); db = fabsf(b1 - b2); dist = F768 * (dr + dg + db); // 0 - 1.0 dist = sqrtf(dist); return 1.0 - dist; } float RGBmatch(float r1, float g1, float b1, uint8 r2, uint8 g2, uint8 b2) { float dr, dg, db; float dist; float F768 = 1.0 / 768; dr = fabsf(r1 - r2); // 0-255 dg = fabsf(g1 - g2); db = fabsf(b1 - b2); dist = F768 * (dr + dg + db); // 0 - 1.0 dist = sqrtf(dist); return 1.0 - dist; } // calculate a match value for two RGB pixels // 0.0 = maximum unmatch (black/white pixels) // 1.0 = perfect match (same RGB values) float PIXmatch(uint8 *pix1, uint8 *pix2) { return RGBmatch(pix1[0],pix1[1],pix1[2],pix2[0],pix2[1],pix2[2]); } float PIXmatch(float *pix1, float *pix2) { return RGBmatch(pix1[0],pix1[1],pix1[2],pix2[0],pix2[1],pix2[2]); } float PIXmatch(float *pix1, uint8 *pix2) { return RGBmatch(pix1[0],pix1[1],pix1[2],pix2[0],pix2[1],pix2[2]); } // insure RGB values are within limits 0-255 // overflows are fixed, preserving RGB ratios // return: 0: OK 1: < 0 2: > 255 3: NAN or INF int RGBfix(float &R, float &G, float &B) { float max, F; int N1 = 0, N2 = 0, N3 = 0; if (isnan(R)) { N3++; R = 0; } // 26.0 if (isnan(G)) { N3++; G = 0; } if (isnan(B)) { N3++; B = 0; } if (isinf(R)) { N3++; R = 0; } // 26.0 if (isinf(G)) { N3++; G = 0; } if (isinf(B)) { N3++; B = 0; } if (R < 0) { N1++; R = 0; } if (G < 0) { N1++; G = 0; } if (B < 0) { N1++; B = 0; } max = R; if (G > max) max = G; if (B > max) max = B; if (max > 255.4) { // must round to <= 255 // 26.0 F = 255.0 / max; R *= F; G *= F; B *= F; N2++; } if (N1) return 1; if (N2) return 2; if (N3) return 3; return 0; } int RGBfix(int &R, int &G, int &B) { float max, F; int N1 = 0, N2 = 0; if (R < 0) { N1++; R = 0; } // 26.0 if (G < 0) { N1++; G = 0; } if (B < 0) { N1++; B = 0; } max = R; if (G > max) max = G; if (B > max) max = B; if (max > 255) { F = 255 / max; R *= F; G *= F; B *= F; N2++; } if (N1) return 1; if (N2) return 2; return 0; } /************************************************************************************** edit transaction management edit_wwhhOK() check image size within limits edit_setup() get E0 if none, E0 > E1 > E3 edit_cancel() free (E1 E3 ER) edit_fullsize() free (E1 E3) E0 > E1 > E3 edit_done() E3 > E0, free (E1 ER) add to undo stack edit_undo() E3 > ER, E1 > E3 edit_redo() ER > E3 edit_reset() free ER, E1 > E3 ***************************************************************************************/ // check that image size is within limits // used by edit_setup, m_rescale, m_mashup int edit_wwhhOK(int ww, int hh) { if (ww < 10 || hh < 10) { zmessageACK(Mwin,TX("image is too small to edit: %d x %d"),ww,hh); return 0; } if (ww < wwhh_limit1 && hh < wwhh_limit1 && ww * hh < wwhh_limit2) return 1; zmessageACK(Mwin,TX("image is too large to edit: %d x %d"),ww,hh); return 0; } // Setup for a new edit transaction // Create E1 (edit input) and E3 (edit output) pixmaps from // previous edit (E0) or image file (new E0). int edit_setup(editfunc &EF) { int yn, rww, rhh, ftype; int Fpreview; if (! curr_file || ! Fpxb) { zmessageACK(Mwin,TX("no current file")); return 0; } viewmode('F'); // insure file view mode ftype = image_file_type(curr_file); if (ftype == FNF) { // 26.8 zmessageACK(Mwin,TX("file not found: %s"),curr_file); return 0; } if (ftype != IMAGE && ftype != RAW) { // file type not editable zmessageACK(Mwin,TX("File type cannot be edited")); return 0; } if (! edit_wwhhOK(Fpxb->ww,Fpxb->hh)) return 0; // image too big if (CEF) { zmessageACK(Mwin,TX("finish or cancel pending edit")); return 0; } if (URS_pos > maxedits-2) { // undo/redo stack capacity reached zmessageACK(Mwin,TX("Too many edits, please save image")); return 0; } if (Fscriptbuild && ! EF.Fscript) { // this function not scriptable zmessageACK(Mwin,TX("this function cannot be scripted")); return 0; } if (Fblock(EF.menuname)) return 0; // block for edit function sa_validate(); // delete select area if not valid if (EF.Farea == 0 && sa_stat) { // select area will be lost, warn user yn = zmessageYN(Mwin,TX("Select area cannot be kept.\n" "Continue?")); if (! yn) { Fblock(0); return 0; } sa_clear(); // clear area if (zd_sela) zdialog_free(zd_sela); } if (EF.Farea == 1 && sa_stat) { // select area kept, not used yn = zmessageYN(Mwin,TX("Select area will be ignored. \n" "Continue?")); if (! yn) { Fblock(0); return 0; } } if (EF.Farea == 2 && sa_stat && sa_stat != sa_stat_fini) // area usable, exists, not finished/enabled { if (sa_stat == sa_stat_disab) // area finished and disabled yn = zmessageYN(Mwin,TX("Select area disabled, Continue?")); else yn = zmessageYN(Mwin,TX("Select area not finished, Continue?")); // area not finished if (! yn) { Fblock(0); return 0; } } if (! E0pxm) { // first edit for this file E0pxm = PXM_load(curr_file,1); // get E0 image (poss. 16-bit color) if (! E0pxm) { Fblock(0); return 0; } curr_file_bpc = f_load_bpc; URS_pos = 0; } if (URS_pos == 0) save_undo(); // initial image >> undo/redo stack Fpreview = 0; // assume no preview if (EF.FprevReq && ! Fzoom) // preview requested by edit func. Fpreview = 1; if (EF.Farea == 2 && sa_stat == sa_stat_fini) // not if select area active Fpreview = 0; if (E0pxm->ww < 1.5 * Dww && E0pxm->hh < 1.5 * Dhh) // image < 1.5 * window, no preview Fpreview = 0; if (Fpreview) { if (Fpxb->ww * Dhh > Fpxb->hh * Dww) { // use preview image 1.5 * window size rww = 1.5 * Dww; if (rww < 1500) rww = 1500; // at least 1500 on one side rhh = 1.0 * rww * Fpxb->hh / Fpxb->ww + 0.5; } else { rhh = 1.5 * Dhh; if (rhh < 1500) rhh = 1500; rww = 1.0 * rhh * Fpxb->ww / Fpxb->hh + 0.5; } if (rww > Fpxb->ww) Fpreview = 0; } if (Fpreview) { E1pxm = PXM_rescale(E0pxm,rww,rhh); // scale image to preview size sa_show(0,0); // hide select area if present } else E1pxm = PXM_copy(E0pxm); // else use full size imagez E3pxm = PXM_copy(E1pxm); // E1 >> E3 Eww = E3pxm->ww; // image dimensions Ehh = E3pxm->hh; CEF = &EF; // set current edit function CEF->Fmods = 0; // image not modified yet CEF->Fpreview = Fpreview; CEF->edit_hist[0] = 0; // no edit history if (CEF->threadfunc) thread_start(CEF->threadfunc,0); // start thread func if any Fpaintnow(); // update image synchronous Fescape = 0; // reset kill switch return 1; } /**************************************************************************************/ // process edit cancel // keep: retain zdialog, mousefunc, curves void edit_cancel(int keep) { if (! CEF) return; Fescape = 1; // kill worker threads if (CEF->threadfunc) thread_stop(); // stop thread and wait for exit Fescape = 0; // reset PXM_free(E1pxm); // free E1 E3 ER E8 E9 if present PXM_free(E3pxm); PXM_free(ERpxm); PXM_free(E8pxm); PXM_free(E9pxm); Fpaintnow(); // update image synchronous 25.0 if (! keep) { if (CEF->zd) zdialog_free(CEF->zd); // kill dialog if (CEF->mousefunc == mouseCBfunc) freeMouse(); // if my mouse, free mouse if (CEF->sd) zfree(CEF->sd); // free spl curve data 25.1 } CEF = 0; // no current edit func Eww = Ehh = 0; if (zd_paintedits) zdialog_send_event(zd_paintedits,"cancel"); // kill paint_edits() if active Fblock(0); // edit_setup() blocks return; } /**************************************************************************************/ // Convert from preview mode (window-size pixmaps) to full-size pixmaps. // Called by edit functions prior to edit_done(). void edit_fullsize() { if (! CEF) return; if (! CEF->Fpreview) return; // FprevReq ignored if small image if (CEF->threadfunc) thread_wait(); // wait for thread idle PXM_free(E1pxm); // free preview pixmaps PXM_free(E3pxm); E1pxm = PXM_copy(E0pxm); // E0 >> E1, full size image E3pxm = PXM_copy(E0pxm); // E0 >> E3 Eww = E3pxm->ww; // image dimensions Ehh = E3pxm->hh; PXB_free(Cstate->fpxb); Cstate->fpxb = PXM_PXB_copy(E3pxm); // update Fpxb from E3 Fzoom = 0; CEF->Fpreview = 0; viewmode('F'); // insure F-view return; } /**************************************************************************************/ // process edit done // keep: retain zdialog, mousefunc, curves void edit_done(int keep) { if (! CEF) return; if (CEF->threadfunc) { thread_wait(); // wait thread idle thread_stop(); // stop thread and wait for exit } if (CEF->Fmods) { // image was modified PXM_audit(E3pxm); // sanity check RGB values PXM_free(E0pxm); E0pxm = E3pxm; // E3 updated image >> E0 E3pxm = 0; PXM_free(E1pxm); // free E1 ER E8 E9 if present PXM_free(ERpxm); PXM_free(E8pxm); PXM_free(E9pxm); URS_pos++; // next undo/redo stack position URS_max = URS_pos; // image modified - higher mods obsolete save_undo(); // save undo state (for following undo) if (Fscriptbuild) // edit script file in progress - edit_script_addfunc(CEF); // add edit function to script } else { // not modified PXM_free(E1pxm); // free E1 E3 ER E8 E9 PXM_free(E3pxm); PXM_free(ERpxm); PXM_free(E8pxm); PXM_free(E9pxm); } Fpaintnow(); // update image synchronous 25.0 if (! keep) { if (CEF->zd) zdialog_free(CEF->zd); // kill dialog if (CEF->mousefunc == mouseCBfunc) freeMouse(); // if my mouse, free mouse if (CEF->sd) zfree(CEF->sd); // free spl curve data 25.1 } CEF = 0; // no current edit func Eww = Ehh = 0; Fescape = 0; // reset Fescape kill switch if (zd_paintedits) zdialog_send_event(zd_paintedits,"done"); // kill paint_edits() if active Fblock(0); // edit_setup() blocks return; } /**************************************************************************************/ // format edit history data for current edit function // example: edit_addhist("parm1: %d parm2: %.3f",parm1,parm2); void edit_addhist(ch *format, ...) { va_list arglist; ch edit_hist[edithistXcc]; if (! CEF) zappcrash("edit_addhist() no CEF"); va_start(arglist,format); vsnprintf(edit_hist,edithistXcc,format,arglist); strncpy0(CEF->edit_hist,edit_hist,edithistXcc); return; } /**************************************************************************************/ // edit undo, redo, reset functions // these apply within an active edit function void edit_undo() // E3 >> ER, E1 >> E3 { if (! CEF) return; if (CEF->threadfunc) thread_wait(); // wait for thread to become idle if (! CEF->Fmods) return; // not modified PXM_free(ERpxm); // E3 >> redo copy ERpxm = E3pxm; E3pxm = PXM_copy(E1pxm); // E1 >> E3 Eww = E3pxm->ww; // image dimensions Ehh = E3pxm->hh; CEF->Fmods = 0; // image not modified if (CEF->zd) zdialog_send_event(CEF->zd,"undo"); // notify edit function Fpaintnow(); // update image synchronous return; } void edit_redo() // ER >> E3 { if (! CEF) return; if (CEF->threadfunc) thread_wait(); // wait for thread to become idle if (! ERpxm) return; // no prior undo PXM_free(E3pxm); // redo copy >> E3 E3pxm = ERpxm; ERpxm = 0; Eww = E3pxm->ww; // image dimensions Ehh = E3pxm->hh; CEF->Fmods = 1; // image modified if (CEF->zd) zdialog_send_event(CEF->zd,"redo"); // notify edit function Fpaintnow(); // update image synchronous return; } void edit_reset() // reset E3 to E1 status { if (! CEF) return; Fescape = 1; // kill worker threads if (CEF->threadfunc) thread_wait(); // wait for thread to become idle Fescape = 0; // reset if (! CEF->Fmods) return; // not modified PXM_free(ERpxm); // delete redo copy PXM_free(E3pxm); E3pxm = PXM_copy(E1pxm); // E1 >> E3 Eww = E3pxm->ww; // image dimensions Ehh = E3pxm->hh; CEF->Fmods = 0; // reset image modified status Fpaintnow(); // update image synchronous return; } /************************************************************************************** undo / redo menu buttons ***************************************************************************************/ // [undo/redo] menu function // Reinstate a prior edit step as long as an edited image remains current. // Call m_undo() / m_redo() if left / right mouse click on menu. // If A key is pressed, call undo_all() or redo_all(). // If middle mouse button is clicked, pop-up a list of all edit steps // and choose a step to go back to. void m_undo_redo(GtkWidget *, ch *) { void undo_redo_choice(GtkWidget *, ch *menu); GtkWidget *popmenu; int button = vmenuclickbutton; ch menuitem[40], flag; F1_help_topic = TX("UNDO/REDO BUTTON"); if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } viewmode('F'); if (button == 1) { if (KBkey == GDK_KEY_a) undo_all(); // undo all steps else m_undo(0,0); // undo one step } if (button == 2) // go back to selected edit step { if (URS_max == 0) return; popmenu = create_popmenu(); for (int ii = 0; ii < 30; ii++) { // insert all edit steps if (ii > URS_max) break; if (ii == URS_pos) flag = '*'; // flag step matching current status else flag = ' '; snprintf(menuitem,40,"%d %s %c",ii,URS_menu[ii],flag); add_popmenu(popmenu,menuitem,undo_redo_choice,(ch *) &Nval[ii],0); } popup_menu(Mwin,popmenu); } if (button == 3) { if (KBkey == GDK_KEY_a) redo_all(); // redo all steps else m_redo(0,0); // redo one step } return; } // popup menu response function void undo_redo_choice(GtkWidget *, ch *menu) { int nn = *((int *) menu); if (nn < 0 || nn > URS_max) return; URS_pos = nn; if (E0pxm) PXM_free(E0pxm); E0pxm = load_undo(URS_pos); Fpaintnow(); return; } // [undo] menu function - reinstate previous edit in undo/redo stack void m_undo(GtkWidget *, ch *) { if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } viewmode('F'); if (CEF) { // undo active edit edit_undo(); return; } if (URS_pos == 0) return; // undo past edit URS_pos--; if (E0pxm) PXM_free(E0pxm); E0pxm = load_undo(URS_pos); Fpaintnow(); return; } // [redo] menu function - reinstate next edit in undo/redo stack void m_redo(GtkWidget *, ch *) { if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } viewmode('F'); if (CEF) { // redo active edit edit_redo(); return; } if (URS_pos == URS_max) return; // redo past edit URS_pos++; if (E0pxm) PXM_free(E0pxm); E0pxm = load_undo(URS_pos); Fpaintnow(); return; } // undo all edits of the current image // (discard modifications) void undo_all() { if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } if (CEF) return; // not if edit active if (URS_pos == 0) return; URS_pos = 0; // original image if (E0pxm) PXM_free(E0pxm); E0pxm = load_undo(URS_pos); Fpaintnow(); return; } // redo all edits of the current image // (reinstate all modifications) void redo_all() { if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } viewmode('F'); if (CEF) return; // not if edit active if (URS_pos == URS_max) return; URS_pos = URS_max;; // image with last edit applied if (E0pxm) PXM_free(E0pxm); E0pxm = load_undo(URS_pos); Fpaintnow(); return; } // Save E0 to undo/redo file stack // stack position = URS_pos void save_undo() { ch *pp, buff[24]; FILE *fid; int ww, hh, nc, nn; int64 cc1, cc2; int64 ccmax = 128 * MEGA; // max. I/O size int64 z64 = 1; float diskmb; ww = E0pxm->ww; hh = E0pxm->hh; nc = E0pxm->nc; diskmb = diskspace(temp_folder); // disk MB diskmb -= 0.000001 * ww * hh * nc * sizeof(float); // - file MB if (diskmb < 100) { // remaining MB zmessageACK(Mwin,TX("out of space for temp files \n" "save your edits and quit Fotocx")); // allow user recovery return; // continuation is crash prone } pp = strstr(URS_filename,"undo_"); // get undo/redo stack filename to use if (! pp) zappcrash("undo/redo stack corrupted"); snprintf(pp+5,3,"%02d",URS_pos); fid = fopen(URS_filename,"w"); if (! fid) goto writefail; snprintf(buff,24,"fotocx %05d %05d %d",ww,hh,nc); // write header nn = fwrite(buff,20,1,fid); if (nn != 1) goto writefail; Fbusy(+1); cc1 = z64 * ww * hh * nc * sizeof(float); // bytes to write cc2 = 0; // bytes done while (cc1) { if (cc1 <= ccmax) { pp = (ch *) E0pxm->pixels; nn = fwrite(pp+cc2,cc1,1,fid); if (nn != 1) goto writefail; break; } else { pp = (ch *) E0pxm->pixels; nn = fwrite(pp+cc2,ccmax,1,fid); if (nn != 1) goto writefail; cc1 -= ccmax; cc2 += ccmax; } } fclose(fid); Fbusy(-1); if (URS_pos == 0) { // stack posn. 0 = original image strcpy(URS_menu[0],"original"); // function name for original image URS_saved[0] = 1; // original image already on disk } else { // stack position if (! CEF) return; strncpy0(URS_menu[URS_pos],CEF->menuname,32); // edit function menu name strncpy0(URS_parms[URS_pos],CEF->edit_hist,edithistXcc); // edit history text URS_saved[URS_pos] = 0; // not yet saved to disk } return; writefail: zmessageACK(Mwin,"undo/redo stack write failure: %s",strerror(errno)); quitxx(); } // Load PXM from undo/redo image file stack // stack position = URS_pos PXM * load_undo(int posn) { ch *pp, buff[24]; FILE *fid; int ww, hh, nc, nn; int64 cc1, cc2; int64 ccmax = 128 * MEGA; int64 z64 = 1; PXM *pxm; pp = strstr(URS_filename,"undo_"); if (! pp) goto err1; snprintf(pp+5,3,"%02d",posn); fid = fopen(URS_filename,"r"); if (! fid) goto err2; nn = fread(buff,20,1,fid); if (nn != 1) goto err3; buff[20] = 0; // null at end of data nn = sscanf(buff,"fotocx %d %d %d",&ww,&hh,&nc); if (nn != 3) goto err4; pxm = PXM_make(ww,hh,nc); Fbusy(+1); cc1 = z64 * ww * hh * nc * sizeof(float); // bytes to read cc2 = 0; // bytes done while (cc1) { if (cc1 <= ccmax) { pp = (ch *) pxm->pixels; // read entire (remaining) file nn = fread(pp+cc2,cc1,1,fid); if (nn != 1) goto err3; break; } else { pp = (ch *) pxm->pixels; // read max. part of file nn = fread(pp+cc2,ccmax,1,fid); if (nn != 1) goto err3; cc1 -= ccmax; cc2 += ccmax; } } fclose(fid); Fbusy(-1); return pxm; err1: printf("*** undo err1: %s \n",URS_filename); // extended diagnostics goto fail; err2: printf("*** open() failure, errno: %d %s \n",errno,strerror(errno)); goto fail; err3: printf("*** fread() failure, errno: %d %s \n",errno,strerror(errno)); goto fail; err4: printf("*** undo err4: %s \n",buff); goto fail; fail: zmessageACK(Mwin,"undo/redo stack read failure"); quitxx(); return 0; } /**************************************************************************************/ // zdialog mouse capture and release void takeMouse(mcbFunc func, GdkCursor *cursor) // capture mouse for dialog { if (! Cdrawin) return; if (! Fgdkwin) return; freeMouse(); mouseCBfunc = func; Mcapture = 1; gdk_window_set_cursor(Fgdkwin,cursor); return; } void freeMouse() // free mouse for main window { mouseCBfunc = 0; Mcapture = 0; if (Fgdkwin) gdk_window_set_cursor(Fgdkwin,0); // set normal cursor return; } /**************************************************************************************/ // functions to manage working threads // edit thread management int Fthread_pend; // work request, run thread function int Fthread_busy; // thread status, working or idle int Fthread_stop; // command: stop working, exit thread threadfunc *userfunc; // caller-supplied thread function // start thread function that does the edit work // thread waits for work or exit request void thread_start(threadfunc ufunc, void *arg) { threadfunc Fthreadfunc; // defined below if (userfunc) zappcrash("thread_start(): old thread active"); Fthread_pend = Fthread_busy = Fthread_stop = 0; // not busy, no work pending userfunc = ufunc; Fescape = 0; // reset kill switch start_detached_thread(Fthreadfunc,0); return; } // signal thread that new work is pending void thread_signal() { if (! userfunc) zappcrash("thread_signal(): no thread active"); Fthread_pend = 1; return; } // stop thread and wait for exit // pending edits may not be completed void thread_stop() { if (! userfunc) zappcrash("thread_stop(): no thread active"); Fthread_stop = 1; Fescape = 1; // kill worker threads while (Fthread_busy) zsleep(0.01); Fescape = 0; // reset userfunc = 0; return; } // main thread: wait for working thread to finish current work and become idle void thread_wait() { if (! main_thread()) zappcrash("thread_wait(): called from thread"); if (! userfunc) zappcrash("thread_wait(): no thread active"); while (Fthread_busy || Fthread_pend) zmainsleep(0.001); return; } // thread: wait for work or exit request void * Fthreadfunc(void *) { while (true) { if (Fthread_stop) { // stop thread Fthread_busy = 0; Fthread_pend = 0; userfunc = 0; pthread_exit(0); // exit thread } if (Fthread_pend) { // new work requested Fthread_busy = 1; // thread is working Fthread_pend = 0; // all pending requests will be done paintlock(1); // window paint blocked Fbusy(+1); // top panel busy indicator userfunc(0); // execute thread function Fbusy(-1); paintlock(-1); // window paint allowed Fthread_busy = 0; continue; // loop without delay } zsleep(0.01); // idle loop if pend = stop = 0 } } /**************************************************************************************/ // thread: start worker threads (per processor core) and wait for completion // threadfunc: void * func(void *index) // start Nt threads and wait for all to exit void do_wthreads(threadfunc func, int Nt) { pthread_t tid[XSMP]; // 25.5 Fbusy(+1); for (int ii = 0; ii < Nt; ii++) tid[ii] = start_Jthread(func, &Nval[ii]); for (int ii = 0; ii < Nt; ii++) wait_Jthread(tid[ii]); Fbusy(-1); return; } /**************************************************************************************/ // table for loading and saving adjustable parameters between sessions typedef struct { ch name[20]; ch type[12]; int count; void *location; } param_t; #define Nparms 42 param_t paramTab[Nparms] = { // name type count location { "fotocx release", "char", 1, &Prelease }, { "language code", "char", 1, &lc }, // 26.0 { "window geometry", "int", 4, &mwgeom }, { "thumbnail size", "int", 1, &navi::thumbsize }, { "menu style", "char", 1, &menu_style }, { "icon size", "int", 1, &iconsize }, { "F-base-color", "int", 3, &FBrgb }, { "G-base-color", "int", 3, &GBrgb }, { "menu font color", "int", 3, &MFrgb }, { "menu background", "int", 3, &MBrgb }, { "index level", "int", 1, &Findexlev }, { "FM index level", "int", 1, &FMindexlev }, { "application font", "char", 1, &application_font }, // menu + dialog font 26.3 { "zoom count", "int", 1, &zoomcount }, { "last version", "int", 1, &Flastversion }, { "Image Position", "char", 1, &ImagePosn }, { "curve node dist %", "float", 1, &splcurve_minx }, { "start display", "char", 1, &startdisplay }, { "start album", "char", 1, &startalbum }, { "start file", "char", 1, &startfile }, { "start folder", "char", 1, &startfolder }, { "curr file", "char", 1, &curr_file }, { "galleryname", "char", 1, &navi::galleryname }, { "gallerytype", "int", 1, &navi::gallerytype }, { "current album", "char", 1, &curr_album }, { "copymove loc", "char", 1, ©move_loc }, { "RGB chooser file", "char", 1, &RGB_chooser_file }, { "gridsettings", "int", 5, &gridsettings }, // 5 must match fotocx.h 'gridsettings' { "RAW file types", "char", 1, &RAWfiletypes }, { "video file types", "char", 1, &VIDEOfiletypes }, { "video command", "char", 1, &video_command }, { "crop sizes", "char", 5, &cropsizes }, // 5 must match fotocx.h 'cropmem' { "crop ratios", "char", 5, &cropratios }, { "edit rescale", "int", 2, &editrescale }, { "show captions", "int", 1, &Fcaps }, { "jpeg def quality", "int", 1, &jpeg_def_quality }, { "RAW loader command", "char", 1, &raw_loader_command }, { "RAW match embed", "int", 1, &Fraw_match_embed }, { "line color", "int", 3, &LINE_COLOR }, { "Fshowhidden", "int", 1, &Fshowhidden }, // 26.4 { "Faskquit", "int", 1, &Faskquit }, { "printer color map", "char", 1, &colormapfile } }; // save parameters to file /.../.fotocx/parameters void save_params() { FILE *fid; ch text[1000]; // limit for character data cc ch *name, *type; int nr, count; void *location; ch **charloc; int *intloc; float *floatloc; printf("save_params()\n"); fid = fopen(parameters_file,"w"); // open parameters file if (! fid) return; for (nr = 0; nr < Nparms; nr++) // write table of state data { name = paramTab[nr].name; type = paramTab[nr].type; count = paramTab[nr].count; location = paramTab[nr].location; charloc = (ch **) location; intloc = (int *) location; floatloc = (float *) location; fprintf(fid,"%03d %-20s %-8s %02d ",nr,name,type,count); // write parm name, type, count for (int kk = 0; kk < count; kk++) // write "value" "value" ... { if (strmatch(type,"char")) { if (! *charloc) strcpy(text,"null"); // missing, use "null" else repl_1str(*charloc++,text,999,"\n","\\n"); // replace newlines with "\n" fprintf(fid," \"%s\"",text); } if (strmatch(type,"int")) fprintf(fid," \"%d\"",*intloc++); if (strmatch(type,"float")) fprintf(fid," \"%.2f\"",*floatloc++); } fprintf(fid,"\n"); // write EOR } fprintf(fid,"%03d EOF \n",nr); fclose(fid); // close file return; } // load parameters from file /.../.fotocx/parameters void load_params() { FILE *fid; int seqno = 0; int ii, err, pcount; int Idata; float Fdata; ch buff[1000], text[1000], *pp; ch name[20], type[12], count[8], data[1000]; void *location; ch **charloc; int *intloc; float *floatloc; printf("load_params()\n"); fid = fopen(parameters_file,"r"); // open parameters file if (! fid) return; // none, defaults are used while (true) // read parameters { pp = fgets_trim(buff,999,fid,1); if (! pp) break; // EOF ii = atoi(pp); if (ii != seqno) { // check sequence number 25.1 printf("*** parameter file clobbered - deleted \n"); fclose(fid); remove(parameters_file); return; } seqno++; // next record sequence no. pp += 4; if (*pp == '#') continue; // comment if (strlen(pp) < 40) continue; // rubbish err = 0; strncpy0(name,pp,20); // parm name strTrim2(name); strncpy0(type,pp+22,8); // parm type strTrim2(type); strncpy0(count,pp+32,4); // parm count strTrim2(count); err = convSI(count,pcount); strncpy0(data,pp+38,1000); // parm value(s) strTrim2(data); for (ii = 0; ii < Nparms; ii++) // match file record to param table { if (! strmatch(name,paramTab[ii].name)) continue; // parm name if (! strmatch(type,paramTab[ii].type)) continue; // parm type if (paramTab[ii].count != pcount) continue; // parm count break; } if (ii == Nparms) continue; // not found, ignore file param location = paramTab[ii].location; // get parameter memory location charloc = (ch **) location; intloc = (int *) location; floatloc = (float *) location; for (ii = 1; ii <= pcount; ii++) // get parameter value(s) { if (strmatch(type,"char") && pcount == 1) { // one quoted string with possible pp = strrchr(data,'"'); // embedded blanks and quotes if (pp) *pp = 0; pp = data + 1; if (strlen(pp) == 0) break; repl_1str(pp,text,999,"\\n","\n"); // replace "\n" with real newlines *charloc++ = zstrdup(text,"params"); break; } pp = substring(data,' ',ii); if (! pp) break; if (strmatch(type,"char")) { repl_1str(pp,text,999,"\\n","\n"); // replace "\n" with real newlines *charloc++ = zstrdup(text,"params"); } if (strmatch(type,"int")) { err = convSI(pp,Idata); if (err) continue; *intloc++ = Idata; } if (strmatch(type,"float")) { err = convSF(pp,Fdata); if (err) continue; *floatloc++ = Fdata; } } } fclose(fid); for (ii = 0; ii < Nparms; ii++) // set null strings to "null" { if (! strmatch(paramTab[ii].type,"char")) continue; charloc = (ch **) paramTab[ii].location; pcount = paramTab[ii].count; for (int jj = 0; jj < pcount; jj++) if (! charloc[jj]) charloc[jj] = zstrdup("null","params",20); } if (curr_file && ! *curr_file) curr_file = 0; // no current file >> null zoomratio = pow( 2.0, 1.0 / zoomcount); // set zoom ratio from zoom count return; } /**************************************************************************************/ // free all resources associated with the current image file void free_resources(int Fkeepundo) { if (! Fkeepundo) zshell(0,"rm -f %s/undo_*",temp_folder); // remove undo/redo files if (Fshutdown) return; // stop here if shutdown mode URS_pos = URS_max = 0; // reset undo/redo stack Fmetamod = 0; // no unsaved metadata changes sa_clear(); // clear select area for (int ii = 0; ii < Ntoptext; ii++) { // no toptext zfree(toptext[ii].text); zfree(toptext[ii].font); } Ntoptext = 0; Nptoplines = Ntoplines = 0; // no toplines Ntopcircles = 0; // no topcircles progress_setgoal(0); // not busy if (curr_file) { if (zd_sela) zdialog_free(zd_sela); // kill select area dialog if active freeMouse(); // free mouse zfree(curr_file); // free image file curr_file = 0; *paneltext = 0; } if (FGM == 'F') gtk_window_set_title(MWIN,Frelease); // fotocx release PXB_free(Fpxb); PXM_free(E0pxm); PXM_free(E1pxm); PXM_free(E3pxm); Eww = Ehh = 0; PXM_free(ERpxm); PXM_free(E8pxm); PXM_free(E9pxm); return; } fotocx/fotocx.png0000664000175000017500000004671415247006660013054 0ustar micomicoPNG  IHDR>atEXtAuthorwarszawianka KXtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/!tEXtCreation Time2010-03-27T08:34:22F)tEXtDescription"Photo camera" icon from Tango Project \n

\nSince version 0.8.90 Tango Project icons are Public Domain: Tango Project FAQ + tEXtSoftwarewww.inkscape.org<NtEXtSourcehttps://openclipart.org/detail/34423/tango-camera-photo-by-warszawiankaEtEXtTitletango camera photoƟ˝ pHYs{{x$ViTXtXML:com.adobe.xmp "Photo camera" icon from <a href="http://tango.freedesktop.org/Tango_Desktop_Project"> Tango Project </a> \n<br><br> \nSince version 0.8.90 Tango Project icons are Public Domain: <a href="http://tango.freedesktop.org/Frequently_Asked_Questions#Terms_of_Use.3F"> Tango Project FAQ </a> tango camera photo 1 2 3 0 warszawianka 0 128 128 1 !ateXIfMM*bj(1rOiHHwww.inkscape.orgCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/02320100fotocx-26.5: Retouch: br:0.00 con:0.00 sat:0.00 temp:5000|fotocx-26.5: Paint Transparency|fotocx-26.5: Markup Text|fotocx-26.5: Rescale: width:128 height:128|fotocx-26.8: Margins: 0 0 0 0|fotocx-26.8: Crop: width:124 height:124|fotocx-26.8: Margins: 2 2 2 2|׬ IDATx}XU63Ƅcw`w-babw'b((=ƌ3c[ ~sg=gwkc>?l}T->*߶(9f͒s."V^[r6tuM>])5ko_wEnK4mڔ->۾3TR[12>rvl˸{7io%J%K_}Uyk|Žft*Ujg%eCH"M2{^ɒ%jK$Iޞ'FlQ\o>k|'ȑ={A|,_ԨQͻndɒ}i~v*6 ),Qԩ3}Om2g(M4u;@ڵkgYn3sv!>;%M͛kaXUͽ+e˖->eK0nlkv0 e$Im]ߓ'M !͛7wNlԫo޽m~']x=X:w=o߿ͷޱu @'r0Kx){Sݷlٲ>n,u }4'NqcKŶ\1`t:8x`~{eoo;޵}Ǐ_is!kp[L4H2ޜ}J3ӵkz˯|i-5ֻ;i·=߯|ϸ-b|І ClΘ1-`*Ι3gѣFD2ٳ|E D*Ud-crWNJwnߪ&UJ&O3>?k(nݼ1|ʵ1Ǐ>ϓiskp>sgU[gȐ!Gdɾ/Sʕ=Fs{p=c !~`a ,XA۶[F? ԮA?8ck\㏧O_a si69 ӝұ]QV / ?sG;nh}9|'68ubL_{wT#뤏ݷwC~7'gϞfh=zgGhhcnjZ)oGAic6ށ>vd׍zqi 8vhkCWM3S/_^<OXy;wn p`{P')yC  fU~6˔4>0R0綾6i :@1p7r_>ٹLs8bI+Vh2edӾc;3gO{HS"Dg97rS؞ 2QzyF4hXcƺàALk )l\r"v~@Xe5nܰggW6{Ae̶,BjF0 -ZXukbl"X95ÍKT<]zyqcG}۶_ޣkV["̛+YVV G(Pbz?ĨŋD H[Q1Pb|L2Z{]b%c`<",1j N1Vbym|/IC/ywc`~@  \".A_ǭ[H}ϐ젖0F'sk36?G#7=Щc z_\6y) ~1z 6dimF(%l30@I^hX3c v ۷}{v'6?yuV?Ap͈Ag.}\? >xZ5/i\ۍE/dF_-[5OG}v6S0'9%^aM5Bg\6o4ҥޔhе>/,|e4kڤ>fm;qO8Y3wP<HdCXsj*^0*횯Y򆾆qkبA*UlXAC$jHr?v5jUOn<'zՒدUgp(ZXh ӤI9$8PP׫WKw˔.]Gۦz>KwDٲeH@+ӨQCg=6m҇aAαEŪukȐA ?ɩ}ʗIVt sTLOԭ[.0ؾmUҚ;Ҷ$ߠ^];qtl;ѱVZSvǂ{03A͌^^F5b:(;@{~0ӥOg@>#wviR%f)~Q c 6ٲgH. ft|\ĥM,NcJIHsS[OTqfm%]_"!t[k@l-0I,Ex?Ka&ok}O3G'0jo tWWd/f|@k腑Rz6m7NP+׃Wd/eH6$FTS& 2b0t弜:}BN=)gΝsNɹ3rp\tN.^>'qʵ rEvR mw@~1i޲HI\%&1Zqh$D8TȑCBB?q9~?uTNSg˙'8 PpZ.\<+. @(F*s^툐: <~lAQOGBB]6k"n\~Adaءt(]:SݹM)aeA8~7BM%&xȹȱ14Xz-4LI`;>n=볁xΕEȒ^Oߛ^߹Kiۮ[Ad,B$8$P /Rf 5Ġ4kd~;ٳ?RfOVmZGldK+ M\RL@JF#[( k8%(+zpaj PoRPA~͠Xo@JS׻2\37%dScS3ܦȚ^6g3SR~=F|x leH`lP&0^!;0kA E埂藛'uLKTRRA}ٹkG~` Eνs7\:AY)ʺ ҧO/z? k+گ#:k+U`~mFr@ =_&%L\N# f q  쑳p߮^$~wSٿ}}#7_).U6[:4VoJY>@@ ԭ-u zxҰU* %(4C:F{$|oyZнSmx(b.SG-ZTvY&M(^ޞy1ux~\ϗ']Sgn0Xw! xZ)0Dk'hqr$1Ëx(Ȍp5kVUt${U}Xj2HFs#XLHWRSyzȜ2mdY: 0Jj/kWɚu~P%`Y/uqn@ٸ9HBKXxl[Ce˶xϛ`|1 cr5GD!j1CA:ust :Wi_ fE'_^ oB 1iGJ`q}csoܺESwS߄>e޻?v'FU O&315>ߠ2޴^}dڑ\02:ss*sfM˼0|~bjX Cw `:E:DH2ҡ*]R .(2eKI=͵x>U{tESʠkS'dž;gKbdU{!AF*Ok:{AP6L oC01N !Ңe3a]J,.#9sM3Wc6J~7dЁRZ?~$"X$5$zǹ=; ޫQs)q2,ػ62d899aZH&>|E[lV{pj[1;\Ǝiim?K*fMKcǎҡC팊.^0>or8q5 4c[b.#Gm"m$ޙgǟG6N%o/@-X{)Z4SC$Cnja'Ȑ.x5lt8T:/mVCҺSgUz)CRsL5ns=Mh^4u p<^zF0tEH 3x z}HOT6KlQѨz?A0ojZL8{jU&  $$8 kҴE8"G 3eL^-f{eؤ2p9Nz !] }uҼ}'iԺk 56*uHz 9b}Fei:WI $} [[LZo*Hcɱm_r)ZXM6N]pBQz?_\iW) Rp<P9V[MaҾC[pB3d5p/ʴEKus'# Ha&)I -HͥzFbWZ]JUJkHӧ{h\y9 ScJ߹sg6Q̀fH 'NS`(6> 0) @Zs@N]{py7JJ(2 ܱc۷Ej֬:ea5JB*%@NelYEVn+ XZ'e sd2h$%4Hgiޡ c)Pz-)cWUJ(EJnF{S.cB1ùOס7E; \T0۫?QgL787cޮ'Ȥ)./AkMb̿xR 05R` u&'L=0Az )] v=zl-4W ZR+S^ (% 6+1D}5"[h= C=2AH #ʖ-)/] W]g18!h`B'͜5?E,T@+"`TRET" h(W=>u8Ȍ^!;*duxA ~oKv#;v[ xzhi\F,Ysɨ K>Ҡy+Z^*֨-e+W_JE+(R\7oj& vadN }p_ҥKMzT|Pat C402k")\oI%+B1J|HJĮr\ $ o.c6 u;u~knXm9qZ.ݻroJ.aX>rD#[mЍdp_("* TVƃ4`Z<H7d{d,_.fΔFKĹW/>0CeDx9%`m@ @8RACe@dH=律 ÿzݍQ{wH˖__(Gb)Y|tN+7g˰j ayx%Pu0rW1,VojTY_:5C.`e,/\t}.ˏO~?^g->.?R IDAT?~,{IӧK3Vp͓*ʕ/,`N} IRF-J h`_(KyZ-,-ݵ{{%-BL`_b 'PRܐc љmO,eҲ `[N*pcThi%ýSOBZ!ڿQ_'`G[rnk#(2F"T"r0* ýSgLF?LP}VEiyO0].\!Ŋ`:@&TI7lAv1uwvݺIqRr)kP DS rqu5aRe*T¨\$+W/ Щ% ?8irJ(s]:JwGnH|F5z0jթ)kV*yK@W:U.\"nKVȜk8~ =x 'OEaX }NȽ/͓%K[E <`\]*VzYh6MPVmtQK hXhmd(+;QHAZ/0ֱ8nTvFZ&>}Uw/ _ݸ<;RjQ_HQ$^2[//0ҡ-X(ʽkJНt,R 0VЪ]2E.5FJ=wyVΜ:Λ@2Sp']`˓'2f)P2uv>=C//ǎ4sMܶReIXRL%7l(5ʬĘ2mm`Ŷ4 0mH@ KD3M&JrO*%@4H 9k̼Y6M^[$ ]L0Ȃ͘xpX}(qJv`v#wUiݾl{.l)S?;be>D&lJ:Llf3Ƶ O`ҥf()Pn8@'HLJ1ȯ]I< X@K: "d}I׍%1\ #eW=>utJ1{q%A"d>r+*2sÚu֬Y/FFT<2"1'8)3GB†76N} euN6n˚V%Onb<#zDLj?cXb+kݹWo1ءsR@M @dӖPp%7X-ʖԬ =pP׎idYjLL:LtT̷:R Yz*,!`1650 - __,&T-m{(W4jS4Bz8n쌰w(-121B1?_>),  &bTDrj10m^K VF"}{MhVZtq1:>:ɸ8$)rGpc V"[0_ 3M6a"Φ-!ҤIIS1`?+`?`X 5#b~v(HaF0@Զm[m!2r<.\F ]AJS$KJ˗G~ ֵkYI=`]'̄hvPW@f5N Nh56nx031ĜPFMq@C1lkgU~W&@ | ӯ&G¬q2;'OW׉*U?I# (zʕS5}8:9t+$Fk]\ʜy3%'%G5֮[&$OXVƀ#1lUb ڵ+*E$t۷W]tq? ٻϒ9 WQ=hP$K|` h2S_Ebehp(t-ׯ_3: L0XGkٯ 0xm[!Z_kڲeK8pܸqTs_%1cb<E cY5q 7)Pe1> 1Xzq;ztu)'͛(\zYM%7&81 RC‚>xA0a㏡]ȝ;Ǡ͔)S9u/5M_(]`ٸ1DsIb,U؞ @[iK4oVY%I `9 X5J Y35ỸF2s44lqycƌ:WQlVgӧO G`B޽*R3'¿Me]?`CXLfbQ=75m]Ffc%PaItT]냂)=JgɡFZd~60hk 4ƌ~.Jt[#9ٳf"FFšD[_.!&ٳgW@`ϧ4``=r ;w$5tM^_8"Px*,IrW!n eKT%0KAsh (upl6mlD̍=V(dL0j`̚&Sߴişp0D)9/~!/#%R5m8::b_7T+ig*Rt[n*)pY7H %>/y= f{T(kuzqcQz}: O_{NredC2z돹1Lc$r b-{=A@I@/w LydrD%mq.cM*!k*jذAK$@ـ)0OGm^zsSR\N5hpX( hMŊ+K 0v| Op[bQV8}tP p*9{̙3hȯ>4',IG{.TYԒŮ) +A@uRJʰaCe)5P43=lԬ1>s?G7 \K j] Z涿 Цm8uhyIFu2Q>+)1رChhN۾]yjRSf8 *d2rb5C:$|1? Ls60`mnßq5^\U`Ɨ9P (g{[n'O-L)p~E ٳ[-,k[ =2q*-;p\|J s*,`]jUf<$_0y[e3Tcm5kVB1E.CUݺ-[ ׯ*Bѣ(zZ9rXX ٿ*`:jp,:ӧODV`\|Q|1cKbS6*7 #T&n}dٲeCϟt /]0*xGwORD@0Рd6pQr9=4isplY??z?߯@D+E(F=74gV 7W*aLu97sWԨrx\!X;КL0LK g #vdCΝET/Ǐx}Ǐə3y|'9'NMFsxj@=}(\ a?c+t9J.fP mxD(?s G$7}LJ7 <J))yhlgd8uFNC%Wܡ4{G u>>{>2z"a3S JΈ988w6PT tEhsP1N0o`o_+|ǢDsW >ř7 #]uz?2XBBكO#sxgEF1}2 X|}{ >y}2ڵ !ܸq]GL"۷bt+y4kԨz;۠F1u!15/P$^i_L4f n$sU~MSoJWO3\:jjԬ5ZX}=)^k֬V=U@;@vvv [eb*4X@4ixL")KWmRҁR  3"t c\ڱ߸cdъ>aX̡Cv>I3i \-WL9}]@~0;G9@@ *`ܹC%ڧGO)@0&?N1˯1׀ǪV qperJiܬyNp7iL}Jor /SW(b2/)L d( HDa9H k&JaôQ^1/M pA/L)FfqQ20+5{+{^H!ji+hwy|uVcd@_!A`}(*1bJ6e. =8H#/Y*LUkVad׽/x4mnXF;8HfvbxD2dbQ#gx/¢< 2RaղXeÍso3;Dǎ$~"eϼ, vp@ 3vȋKz/k@B$@E׿B *^80cYZ/ZUVLN%sbJޛFc ۧ:`Ct}~>8^h!U@\b2*W»<@KiܞAG[, W9PT7.\4 Qod\1?cYDWgfbh) &f28Cf=mTx>J<abzNCpX̙yh=p888H:K}{& \nCKr-Ԁ%7yoDTA!A9l *gJ%U7['XCOq7_G̃˖=酡VYA~3ggV#M(jY;lRVy rTz&M( oӦϑ@Z /F0*$H 7֣ sP`4,`q;&QFs/`ZZA<∼Ӻb[2V=A(۶m^F -@D $`:x K @׎"F^͚50eܟ6aaaJWq=qzLWr9:ڂZꂪ*J hڂ3Rh$7'x D>#N'׿>/q&N'',Qh%.ӕo(c{M$"IҤmؐ)vPWH-sFG2]B 4 0@i@ P"MPZ2CHax5y]w j"|I}PM{?ޯ?B)A$5\A,i9=aOXTx +ť閵n3ʏ0>+GuwBc0EFxF(1%AP19n]':C:ȱ}IJ_`QsXy%R 9[[6|BD;F f~ySkџF3shC-x 6[!rAóPU{Mj㹛mk,#ċA%`m: !p]#`tMi{T !B6L$I9bwL&n.Y-}CF&O$ wӔ`q832fz]DkL/ =mN>d<{=; vl2IA<^jT ސ !l?0bZӤK K( =>Sl'%JLj=RRw b$/tvV ϰg @ $ؐ R* oH"0HD!\yRM; L=L(3{>b{hC/Ţ J1JUJ[[Ev?ASeVIDAT}SԳZd<_\qIQ* 8&e/!H3`>/Ma5~i<U{9-2=Uu2mv'/(2j7_|`/N@x3CC$pq9EƳ/`<M=*Kt2]slg9۟|8.u"A!.4Kq>m 7m2µ_@Gp#{7+.'Ptܯl6&S!G-L17_pé65)(h3Y?ۜUI>r蕫xŋ,9l}uʎxc/72">^7{Zb匈fk7JExn9ifS3xo}b@&A4C:iҤO%G`| &(EӘþkf8딩:'M btnu/'ߘnǵ)A aAT(5  {4D-l??hkm@&6jӸnI֜IENDB`fotocx/zfuncs.cc0000664000175000017500000176304215247006660012664 0ustar micomico/************************************************************************************** zfuncs.cc collection of Linux and GDK/GTK utility functions Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ***************************************************************************************/ #include "zfuncs.h" #define RELEASE 26.8 // follows Fotocx release versions // 26.8 /************************************************************************************** System Utility Functions ------------------------ zmalloc zfree wrappers to add add checks and statistics zmalloc_test check if planned allocation is available realmemory get real free memory (incl. file cache) in MB units availmemory get available memory (incl. swap file) in MB units zstrdup duplicate string with added space zstrcpy replace string with new string + added cc zmalloc_report memory usage by tag > popup report zmalloc_growth memory growth by tag > popup report xmessage output a popup message not requiring GTK zexit exit process and kill subprocesses, opt. popup message zbacktrace callable backtrace dump zappcrash abort with traceback dump to desktop file catch_signals trap segfault, crash with zappcrash() trace implements TRACE macro tracedump dump trace data combine_argvs catenate argv[ii] elements from Nth to last get_seconds get time in real seconds with millisecond resolution print_seconds output seconds since last call start_timer start a named timer get_timer get elapsed time with millisecond resolution CPUtime get CPU process time for current process, seconds memused get real memory used by current process, MB compact_time convert time_t type to yyyymmddhhmmss format pretty_datetime convert time_t type to yyyy:mm:dd hh:mm:ss format secs_datetime seconds since 1970 (double) to yymmddhhmmss (int[6]) datetime_secs yymmddhhmmss (int[6]) to seconds since 1970 (double) parseprocfile read and parse /proc records formatted "parmname value" parseprocrec read and parse /proc records with fixed series of values coretemp get current processor core temperature disktemp get temperature for given disk drive zsleep sleep for any amount of time (e.g. 0.1 seconds) zloop loop for any amount of time spinlock simple method to prevent parallel execution of code block global_lock lock/unlock a global resource (all processes/threads) resource_lock lock/unlock a resource within a process and threads zget_locked, etc. safely get/put/increment parameters from multiple threads start_detached_thread start a detached thread start_Jthread start a joinable thread wait_Jthread wait for thread and join synch_threads make threads pause and resume together main_thread return 1 if main() thread, else 0 zshell run shell command with options log, ack command_output run shell command and return output into a string kill_procname kill process matching wildcard name signalProc pause, resume, or kill a child process fgets_trim fgets() with trim of trailing \r \n and optionally blanks fgets_pend fgets() non-blocking wrapper samefolder test if two files/folders have the same folder path parsefile parse filespec into folder, file, extension renamez like rename() but works across file systems check_create_dir check if folder exists, ask to create if not cp_copy same, using shell "cp -f -p" diskspace get available space on disk of given file, MB get_file_extension use 'file' command to find and append correct extension zreaddir return all files in a folder, sorted zreadfile read file, return array of records zwritefile write array of records to file zreadfile_free free zreadfile() memory String Functions ---------------- strmatch true if strings match, null strings match only null strings strmatchN true if leading N characters match, null strings as above strmatchcase true if strings match, except for case, null strings as above strmatchcaseN true if leading N characters match, null strings as above substringR get delimited substrings from input string substring same, not thread-safe, no zfree() needed get_substrings get all substrings from a delimited input string strHash hash string to random number in a range strncpy0 strncpy() with insured null delimiter strnPad add blank padding to specified length strTrim remove trailing blanks strTrim2 remove leading and trailing blanks strCompress remove embedded blanks strncatv catenate multiple strings with length limit strmatchV compare 1 string to N strings strToUpper convert string to upper case (ascii only) strToLower convert string to lower case (ascii only) repl_1str replace a substring within a string repl_Nstrs replace multiple substrings within string breakup_text insert newline chars to limit text line lengths strncpyx convert string to hex format StripZeros remove trailing zeros (1.23000E+8 >> 1.23E+8) blank_null test string for null pointer, zero length, and all blanks clean_escapes replace 2-character escapes ("\n") with the escaped characters UTF8 functions deal with UTF8 multibyte character strings zsed substitute multiple strings in a file zstrstr zstrstr() and zcasestrstr() work like strstr() and strcasestr() zstrcasestr but the string "" does NOT match with any string zstrcpy strcpy with overlap allowed zstrncpy strncpy with overlap allowed zstrcmp like strcmp, but \n as well as null ends the compare zstrcmp2 works like strcmp(), but using ch *args instead of cch * zstrcasecmp works like strcasecmp(), but using ch *args instead of cch * zescape_quotes escape quote marks (",') for strings used in shell commands Number Conversion and Formatting -------------------------------- convSI string to integer with optional limits check convSD string to double with optional limits check convSF string to float with optional limits check convIS integer to string with returned length convDS double to string with specified digits of precision atofz atof() accepting both '.' and ',' decimal points formatKBMB format a byte count with specified precision and B/KB/MB/GB units Ftruncate reduce significant bits in a float number mantissa Wildcard Functions ------------------ MatchWild match string to wildcard string (multiple * and ?) MatchWildCase works like MatchWild() but ignores case SearchWild wildcard file search (multiple * and ? in path or file name) SearchWildCase works like SearchWild() but ignores case in file name zfind find files matching a pattern. uses glob() Search and Sort Functions ------------------------- bsearch binary search of sorted list HeapSort sort list of integer / float / double / records / pointers to records MemSort sort records with multiple keys (data types and sequence) zmember test if a value is a member of a set of values HashTab hash table: add, delete, find, step through Misc Functions -------------- zlist functions list processing functions - array of string pointers lrandz int64 random numbers drandz double random numbers spline1/2 cubic spline curve fitting function Qtext FIFO queue for text strings, dual thread access variance compute variance for a list of numbers Application Admin Functions --------------------------- zinitapp initialize application folder and data files zinitappfiles copy app data files to app home folder get_zprefix /usr or /home/ get_zhomedir /home//.appname or custom location get_zdatadir app data files location get_zdocdir app documentation files location get_zimagedir app image files location zabout popup application 'about' information zsetfont set new application font widget_font_metrics get font width and height for given widget get_zfilespec get filespec for README, changelog, parameters ... showz_logfile display application log file showz_textfile show application text file (README, changelog, etc.) showz_docfile show a document file topic and associated image audit_docfile audit docfile for missing topics and bad links TX_init initialize translations at startup time TX translate a text string XT reverse translate language xx to English appimage-desktop do desktop integration for an appimage GTK Utility Functions --------------------- zmainloop do main loop to process menu events, etc. zmainsleep loop zmainloop and zsleep for designated time draw_context_create get cairo drawing context for GDK window draw_context_destroy free drawing context memory txwidget text report, navigation, line editing create_menubar menubar functions create_toolbar toolbar functions create_stbar statusbar functions create_popmenu create popup menu with response functions popup_menu display/execute popup menu popup_choose popup to choose from zlist or text file Vmenu vertical menu/toolbar in vertical packing box splcurve_init set up a spline curve drawing area splcurve_adjust mouse event function to manipulate curve nodes splcurve_addnode add an anchor point to a curve splcurve_resize resize drawing area if too small splcurve_draw draw curve through nodes splcurve_generate generate x/y table of values from curve splcurve_yval get curve y-value for given x-value splcurve_load load curve data from a saved file splcurve_save save curve data to a file zdialog_new create new zdialog zdialog_set_title change a zdialog title zdialog_set_modal set a zdialog to be modal zdialog_set_decorated set a zdialog to be decorated or not zdialog_present present a zdialog (visible and on top) zdialog_set_focus set focus on zdialog window or window + widget zdialog_add_widget add widget to existing zdialog zdialog_valid return 1/0 if zdialog is valid/invalid zdialog_find_widget return widget from zdialog and widget name zdialog_gtkwidget get GTK widget from zdialog and widget name zdialog_set_image set image widget from GDK pixbuf zdialog_add_ttip add a popup tool tip to a zdialog widget zdialog_resize resize zdialog greater than initial size zdialog_put_data put data into a zdialog widget of any type zdialog_get_data get data from a zialog widget of any type zdialog_set_limits set new limits for numeric data entry widget zdialog_get_limits get limits for numeric data entry widget zdialog_rescale expand the scale around a neutral value zdialog_run run the zdialog and send events to event function zdialog_widget_event respond to zdialog widget events zdialog_focus_event response handler for focus-in and focus-out signals zdialog_activate_event response handler for "activate" signal ('enter' key) zdialog_KB_press respond to zdialog keyboard inputs zdialog_zspin_event response function for "zspin" widget zdialog_copyfunc copy widget data to clipboard zdialog_pastefunc copy clipboard to widget with KB focus zdialog_delete_event process zdialog delete event ([x] button) zdialog_send_event send an event to an active zdialog zdialog_send_response complete a zdialog and assign status zdialog_show show or hide a zdialog window zdialog_destroy destroy a zdialog (data remains available) zdialog_free free zdialog memory (data is gone) zdialog_wait wait for zdialog completion, get status zdialog_goto put cursor at named widget zdialog_set_cursor set zdialog cursor (e.g. busy) zdialog_stuff stuff data into zdialog widget zdialog_labelfont set label text with font zdialog_fetch fetch data from zdialog widget zdialog_combo_clear clear combo box entries zdialog_combo_popup open combo box pick list zdialog_load_widgets load zdialog widgets and curves from a file zdialog_save_widgets save zdialog widgets and curves to a file zdialog_load_prev_widgets load last-used widgets (for [prev] buttons) zdialog_save_last_widgets save last-used widgets (for [prev] buttons) zdialog_geometry load/save zdialog positions at app start/exit zdialog_set_position set zdialog position: null mouse desktop parent save nn/nn zdialog_save_position remember zdialog position relative to parent zdialog_save_inputs save zdialog inputs when zdialog completed zdialog_load_inputs retrieve prior zdialog input fields zdialog_text popup zdialog to get N lines of text input from user zdialog_text1 popup zdialog to get one line of text input from user zdialog_password popup zdialog to get a password entry (invisible) zdialog_choose popup zdialog to show a message, select a button, return choice zdialog_edit_textfile popup zdialog to edit a text file popup_report popup window and scrolling text report popup_command run a shell command with output in a popup window monitor_file show a text file in a popup window, with real-time updates boldred convert dialog text to bold/red font zmessageACK popup message, printf format, wait for user ACK zmessageYN popup message, printf format, wait for user Yes / No zmessage_post popup message, printf format, show until killed poptext_screen popup message at given absolute screen position poptext_mouse popup message at current mouse position + offset poptext_widget popup message at given widget position + offset poptext_killnow kill popup message zgetfile simplified file chooser zdialog zgetfolder file chooser for folder, with create option print_image_file zdialog to print an image file using GTK functions drag_drop_source connect window as drag-drop source drag_drop_dest connect window as drag-drop destination get_thumbnail get thumbnail image for given image file zmakecursor make a cursor from an image file (.png .jpg) gdk_pixbuf_stripalpha remove an alpha channel from a pixbuf text_pixbuf create pixbuf containing text move_pointer move the mouse pointer within a widget/window window_to_mouse move a GtkWindow to the mouse position ***************************************************************************************/ namespace zfuncs { GdkDisplay *display; // workstation (KB, mouse, screen) GdkScreen *screen; // screen, N displays GdkDevice *mouse; // pointer device GtkSettings *gtksettings = 0; // screen settings GtkWidget *mainwin = 0; // main window GtkTextView *curr_textview_widget; // curr. GtkTextView widget ch *build_date_time = __DATE__ " " __TIME__; // build date and time ch *progexe = 0; // executable image file int Floglevel = 1; // 0/1/2 = errs/infos/dialog inputs int Fescape = 0; // zdialog, escape key pressed int Fshutdown; // flag, app shutdown underway 25.1 int monitor_ww, monitor_hh; // monitor dimensions int appfontsize = 10; // application font size ch *appfont = "sans 10"; // application font defaults ch *appboldfont = "sans bold 10"; ch *appmonofont = "mono 10"; ch *appmonoboldfont = "mono bold 10"; ch zappname[40] = "undefined"; // appname without version ch zappvers[40] = "undefined"; // appname-N.N ch zprefix[200], zdatadir[200], zdocdir[200]; // app folders ch zimagedir[200], zhomedir[200]; ch logfile[200]; // application log file pthread_t tid_main = 0; // main() thread ID int vmenuclickposn; // Vmenu image click posn. 0-100 int vmenuclickbutton; // button: 1/2/3 = L/M/R mouse int vmenustop; // setupfunc() stop flag zdialog *zdialog_list[zdialog_max]; // active zdialog list int zdialog_count = 0; // total zdialogs (new - free) zdialog *zdialog_focus_zd; // zdialog with KB focus float splcurve_minx = 5; // min. anchor point dist, % scale ch *zappcrash_context1 = 0, *zappcrash_context2 = 0; } using namespace zfuncs; /************************************************************************************** system-level utility functions ***************************************************************************************/ /************************************************************************************** These are wrappers for malloc() and free() with extra diagnostics. Memory usage is tracked by caller's tag and can be reported by tag to reveal memory leaks. void * zmalloc(int64 cc, ch *tag) + return cc bytes of allocated memory marked with tag (max 19 ch + null) + crash with a message if allocation fails, so caller need not check + returned memory is cleared to zeros, so entire allocation is actualized + allocate extra memory for sentinels placed before and after the returned memory + optional tag argument copied into extra allocated space for zmalloc_report() zfree(void *memory) check the sentinels for validity and crash with a message if clobbered clobber sentinels to detect double zfree() calls free user memory including extra allocated memory zmalloc_report() + report total allocation counts and bytes by tag to standard output + list outstanding zmalloc() counts and bytes not matched by zfree() calls The extra cpu time is too small to measure. ***************************************************************************************/ #define zmalloc_extra 36 // extra memory for sentinels and user tag int64 zmalloc_tot = 0; int zmalloc_lock = 0; void * zmalloc(int64 cc, ch *tag) // bytes, tag { void zmalloc_tabulate(ch *tag, int64 cc); double memavail; static int ftf = 1, memcheck = 1; double mcc; while (! resource_lock(zmalloc_lock)) zsleep(0.001); // avoid re-entrance ch *OOMmessage = " \n" // big and obvious " --------------- \n" " OUT OF MEMORY \n" " --------------- \n"; if (ftf) { // first call ftf = 0; memavail = availmemory(); if (! memavail) memcheck = 0; // memory checking not possible, disable } if (cc <= 0) zappcrash("zmalloc: %lld bytes",cc); if (memcheck && cc > 1000) { // large block mcc = cc; mcc = mcc / 1024 / 1024; // requested memory, MB memavail = availmemory(); // avail. memory, MB if (memavail - mcc < 500) { printf("*** memory request for %.0f MB failed\n",mcc); zexit(1,OOMmessage); exit(-1); } } if (! tag) tag = "zmalloc notag"; if (strlen(tag) > 19) zappcrash("zmalloc tag too big: %s",tag); // 26.0 void * maddr = malloc(cc + zmalloc_extra); // 0 allocated memory with extra space int64 *pcc = (int64 *) maddr; // 0..7 caller byte count ch *psen1 = (ch *) maddr + 8; // 8..11 sentinel "sen1" ch *ptag = (ch *) maddr + 12; // 12..31 tag, < 20 chars. ch *puser = (ch *) maddr + 32; // 32..B+31 user data, B chars. ch *psen2 = (ch *) puser + cc; // B+32..B+35 sentinel "sen2" if (! maddr) { zexit(1,OOMmessage); exit(-1); } *pcc = cc; strncpy(psen1,"sen1",4); // set leading sentinel strncpy0(ptag,tag,20); // set tag strncpy(psen2,"sen2",4); // set following sentinel memset(puser,0,cc); // clear allocation (force memory commit) zmalloc_tot += cc; zmalloc_tabulate(ptag,cc); // track usage by tag resource_unlock(zmalloc_lock); return puser; } // free memory allocated by zmalloc(). checks for overflow. void zfree(void *puser) { void zmalloc_tabulate(ch *tag, int64 cc); while (! resource_lock(zmalloc_lock)) zsleep(0.001); // avoid re-entrance if (! puser) zappcrash("zfree: null address"); void *maddr = (ch *) puser - 32; int64 *pcc = (int64 *) maddr; ch *psen1 = (ch *) maddr + 8; ch *ptag = (ch *) maddr + 12; int64 cc = *pcc; ch *psen2 = (ch *) puser + cc; if (strncmp("sen1",psen1,4) || strncmp("sen2",psen2,4)) // check sentinels zappcrash("zfree: sentinels clobbered"); *psen1 = *psen2 = 0; // destroy sentinels zmalloc_tot -= cc; zmalloc_tabulate(ptag,-cc); // track usage by tag memset(maddr,-1,cc+32); // clear to detect use-after-free 25.1 free(maddr); // free memory resource_unlock(zmalloc_lock); return; } // private function. track how much memory is in use, per tag. // real tag capacity is about 80% of nominal 'zmhtcap' #define zmhtcap 500 HashTab *zmalloc_hashtab = 0; int64 zmalloc_count[zmhtcap]; int64 zmalloc_bytes[zmhtcap]; void zmalloc_tabulate(ch *ptag, int64 cc) { int ii; if (! zmalloc_hashtab) { zmalloc_hashtab = new HashTab(20,zmhtcap); memset(zmalloc_count, 0, zmhtcap * sizeof(int64)); memset(zmalloc_bytes, 0, zmhtcap * sizeof(int64)); } ii = zmalloc_hashtab->Find(ptag); if (ii < 0) ii = zmalloc_hashtab->Add(ptag); if (ii < 0) zappcrash("zmalloc hash table full"); zmalloc_bytes[ii] += cc; if (cc > 0) ++zmalloc_count[ii]; else --zmalloc_count[ii]; return; } // test if a given about of free memory is available // return 1 if OK, return 0 if NO. int zmalloc_test(int64 cc) { double memavail, mb; mb = cc / 1024 / 1024; memavail = availmemory(); // avail. memory, MB memavail -= mb; if (memavail > 300) return 1; // > 300 MB remaining, return OK printf("*** planned memory allocation of %.0f MB failed \n",mb); return 0; // not OK } // get real memory in MB units // typical < 0.1 milliseconds double realmemory() { FILE *fid; ch buff[100], *pp; double rmem = 0; fid = fopen("/proc/meminfo","r"); if (! fid) return 0; while (true) { pp = fgets(buff,100,fid); if (! pp) break; if (strmatchN(pp,"MemAvailable:",13)) { // free + file cache rmem = atof(pp+13) / 1024; break; } } fclose(fid); return rmem; } // get available memory in MB units (includes swap space) // typical < 0.1 milliseconds double availmemory() { FILE *fid; ch buff[100], *pp; double avmem = 0; int Ngot = 0; fid = fopen("/proc/meminfo","r"); if (! fid) return 0; while (true) { pp = fgets(buff,100,fid); if (! pp) break; if (strmatchN(pp,"MemAvailable:",13)) { // free + file cache avmem += atof(pp+13) / 1024; if (++Ngot == 2) break; } if (strmatchN(pp,"SwapFree:",9)) { // swapfile free avmem += atof(pp+9) / 1024; if (++Ngot == 2) break; } } fclose(fid); return avmem; } // duplicate string in allocated memory, with additional space at end ch * zstrdup(ch *zstring, ch *tag, int addcc) { if (! zstring) zstring = "null"; // 26.0 if (! tag) tag = "zstrdup notag"; ch *pp = (ch *) zmalloc(strlen(zstring) + 2 + addcc, tag); // add additional chars, clear strcpy(pp,zstring); return pp; } // replace zstring with string + added cc int zstrcopy(ch *&zstring, ch *string, ch *tag, int addcc) { if (! tag) tag = "zstrcopy notag"; if (zstring == string) zstring = 0; // if same string, make a duplicate if (zstring) zfree(zstring); int cc = strlen(string) + 2 + addcc; zstring = (ch *) zmalloc(cc,tag); strcpy(zstring,string); return cc; } /**************************************************************************************/ // popup report of zmalloc() memory allocation per tag void zmalloc_report(GtkWidget *parent) // 25.1 { int zmalloc_report_callback(GtkWidget *,int line, int posn, ch *input); static zdialog *zdpop = 0; int count, ii, first = 1; int64 cc; ch tag[20]; if (! zdpop || ! zdialog_valid(zdpop,"zmalloc")) // open new popup report zdpop = popup_report_open("zmalloc",parent,500,400,0,0, zmalloc_report_callback,"apply","clear","X",null); popup_report_write(zdpop,0,"zmalloc total memory: %lld \n",zmalloc_tot); while (true) { ii = zmalloc_hashtab->GetNext(first,tag); if (ii < 0) break; ii = zmalloc_hashtab->Find(tag); if (ii < 0) zappcrash("zmalloc hash table bug: %s",tag); cc = zmalloc_bytes[ii]; count = zmalloc_count[ii]; if (cc == 0) continue; popup_report_write(zdpop,0," %-20s %8d %lld \n",tag,count,cc); } popup_report_write(zdpop,0,"\n"); popup_report_bottom(zdpop); return; } // zmalloc_report() callback function for completion buttons int zmalloc_report_callback(GtkWidget *txwidget, int line, int posn, ch *input) { if (strmatch(input,"apply")) zmalloc_report(0); if (strmatch(input,"clear")) txwidget_clear(txwidget); return 1; } /**************************************************************************************/ // report total memory allocated per tag - leak detection utility // report only tags with increased memory consumption since prior report void zmalloc_growth(GtkWidget *parent) // 25.1 { int zmalloc_growth_callback(GtkWidget *,int line, int posn, ch *input); static zdialog *zdpop = 0; int count, ii, first = 1; int64 cc; ch tag[20]; static int pne = 0; // table of prior tag and cc values static ch *ptag[1000]; static int64 pcc[1000]; if (! zdpop || ! zdialog_valid(zdpop,"zmalloc growth")) // open new popup report zdpop = popup_report_open("zmalloc growth",parent,500,400,0,0, zmalloc_growth_callback,"apply","clear","X",null); popup_report_write(zdpop,0,"zmalloc total memory: %lld \n",zmalloc_tot); while (true) // loop all tags in table { ii = zmalloc_hashtab->GetNext(first,tag); if (ii < 0) break; ii = zmalloc_hashtab->Find(tag); if (ii < 0) zappcrash("zmalloc hash table bug: %s",tag); cc = zmalloc_bytes[ii]; // memory allocation for tag count = zmalloc_count[ii]; // zmalloc/zfree calls for tag if (cc == 0) continue; // net memory = 0, skip for (ii = 0; ii < pne; ii++) // find prior allocation for tag if (strmatch(tag,ptag[ii])) break; if (ii == pne) { ptag[ii] = strdup(tag); // new tag, add to table pcc[ii] = cc; pne++; } if (cc <= pcc[ii]) continue; // current <= prior allocation, skip popup_report_write(zdpop,0," %-20s %8d %lld \n",tag,count,cc); // report increased allocation pcc[ii] = cc; // new high-water allocation } popup_report_write(zdpop,0,"\n"); popup_report_bottom(zdpop); return; } // zmalloc_growth() callback function for completion buttons int zmalloc_growth_callback(GtkWidget *txwidget, int line, int posn, ch *input) { if (strmatch(input,"apply")) zmalloc_growth(0); if (strmatch(input,"clear")) txwidget_clear(txwidget); return 1; } /**************************************************************************************/ // output a popup message not requiring GTK - callable from a thread. // application is stalled - "not responding" until [ok] button pressed. void xmessage(ch *message) { ch command[400]; ch *font = "-*-bookman-*-r-*--0-140-0-0-p-*-*-*"; // big font 25.1 printf("%s \n",message); snprintf(command,400,"xmessage -fn %s -center \"%s\" ",font,message); int err = system(command); // do not use zshell if (err) return; // avoid gcc warning return; } /**************************************************************************************/ // Output a status or error message and kill all processes in the process group. // killpg(0,SIGKILL) kills all processes, including the caller. // if 'popup' true, popup an xmessage window with error message. void zexit(int popup, ch *errmess, ...) { va_list arglist; ch mess[1000]; if (errmess) { // output error message va_start(arglist,errmess); vsnprintf(mess,1000,errmess,arglist); printf("zexit: %s\n",mess); if (popup) xmessage(mess); // popup message } else printf("zexit\n"); killpg(0,SIGKILL); // kill all processes in group sleep(1); // wait here to die exit(-1); } /**************************************************************************************/ // produce a backtrace dump to stdout void zbacktrace() { int nstack = 100; void *stacklist[100]; nstack = backtrace(stacklist,nstack); // get backtrace data if (nstack > 100) nstack = 100; backtrace_symbols_fd(stacklist,nstack,STDOUT_FILENO); // backtrace records to STDOUT return; } /**************************************************************************************/ // Write an error message and backtrace dump to a file and to a popup window. // Error message works like printf(). // Depends on program addr2line() in binutils package. void zappcrash(ch *format, ... ) { static int crash = 0; struct utsname unbuff; va_list arglist; FILE *fid1, *fid2, *fid3; int fd, ii, err, cc, nstack = 100; int Flinenos = 1; void *stacklist[100]; ch OS1[60] = "?", OS2[60] = "?", OS3[60] = "?"; ch message[300], progexe[300]; ch buff1[300], buff2[300], hexaddr[20]; ch *arch, *pp1, *pp2, dlim, *pfunc; if (crash++) return; // re-entry or multiple threads crash va_start(arglist,format); vsnprintf(message,300,format,arglist); va_end(arglist); uname(&unbuff); // get cpu arch. 32/64 bit arch = unbuff.machine; fid1 = popen("lsb_release -d","r"); // get Linux flavor and release if (fid1) { ii = fscanf(fid1,"%s %s %s",OS1,OS2,OS3); pclose(fid1); } printf("\n*** zappcrash: %s %s %s %s %s %s \n", arch, OS2, OS3, zappvers, build_date_time, message); printf("*** zappcrash context: %s | %s \n",zappcrash_context1, zappcrash_context2); nstack = backtrace(stacklist,nstack); // get backtrace data if (nstack <= 0) zexit(0,"zappcrash backtrace() failure"); if (nstack > 100) nstack = 100; fid1 = fopen("zbacktrace","w"); // open backtrace data output file if (! fid1) zexit(0,"zappcrash fopen() failure"); fd = fileno(fid1); backtrace_symbols_fd(stacklist,nstack,fd); // write backtrace data fclose(fid1); // (use of malloc() is avoided) fid1 = fopen("zbacktrace","r"); // open backtrace data file if (! fid1) zexit(0,"zappcrash fopen() failure"); fid2 = fopen("zappcrash","w"); // open zappcrash output file if (! fid2) zexit(0,"zappcrash fopen() failure"); fprintf(fid2,"\n*** zappcrash: %s %s %s %s %s %s \n", arch, OS2, OS3, zappvers, build_date_time, message); fprintf(fid2,"*** zappcrash context: %s | %s \n",zappcrash_context1, zappcrash_context2); fprintf(fid2,"*** please send this crash report to mkornelix@gmail.com *** \n" "*** if possible, please explain how to repeat this problem *** \n"); cc = readlink("/proc/self/exe",progexe,300); // get own program path if (cc > 0) progexe[cc] = 0; // readlink() quirk else { fprintf(fid2,"progexe not available \n"); Flinenos = 0; } err = zshell(0,"which addr2line >/dev/null"); // check if addr2line() available if (err) Flinenos = 0; for (ii = 0; ii < nstack; ii++) // loop backtrace records { pp1 = pp2 = 0; fgets_trim(buff1,300,fid1); // read backtrace line if (! Flinenos) goto output; pfunc = 0; pp1 = strstr(buff1,"+0x"); // new format (+0x12345...) if (pp1) pp2 = strchr(pp1,')'); else { pp1 = strstr(buff1,"[0x"); // old format [0x12345...] if (pp1) pp2 = strchr(pp1,']'); } if (! pp1 || ! pp2) goto output; // cannot parse dlim = *pp2; *pp2 = 0; strncpy0(hexaddr,pp1+1,20); *pp2 = dlim; snprintf(buff2,300,"addr2line -i -e %s %s",progexe,hexaddr); // convert to source program fid3 = popen(buff2,"r"); // and line number if (! fid3) goto output; pfunc = fgets(buff2,300,fid3); pclose(fid3); if (! pfunc) goto output; cc = strlen(pfunc); if (cc < 10) goto output; if (pfunc[cc-1] < ' ') pfunc[cc-1] = 0; // remove tailing \n if present strncatv(buff1,300,"\n--- ",pfunc,null); output: fprintf(fid2,"%s \n",buff1); // output } fclose(fid1); fclose(fid2); zshell(0,"rm zbacktrace"); // remove backtrace file zshell(0,"cat zappcrash"); // add zappcrash to log file if (*logfile == '/') zshell(0,"cp -f %s $HOME/zappcrash",logfile); // copy log file to $HOME/zappcrash snprintf(message,300,"A fatal error has occurred. \n" // do this last 25.1 "See zappcrash file at $HOME/zappcrash"); xmessage(message); zexit(0,"Zexit zappcrash"); // quit } /**************************************************************************************/ // application initialization function to catch some bad news signals // the signal handler calls zappcrash() to output a backtrace dump and exit void catch_signals() { void sighandler(int signal); struct sigaction sigact; sigact.sa_handler = sighandler; sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; sigaction(SIGTERM,&sigact,0); sigaction(SIGSEGV,&sigact,0); sigaction(SIGILL,&sigact,0); // man page says cannot be caught sigaction(SIGFPE,&sigact,0); sigaction(SIGBUS,&sigact,0); sigaction(SIGABRT,&sigact,0); // heap or stack corruption return; } // catch fatal signals and produce backtrace dumps on-screen void sighandler(int signal) { cch *signame = "unknown"; if (signal == SIGTERM) zexit(0,"TERMINATED"); if (signal == SIGKILL) zexit(0,"KILLED"); if (signal == SIGSEGV) signame = "segment fault"; if (signal == SIGILL) signame = "illegal operation"; if (signal == SIGFPE) signame = "arithmetic exception"; if (signal == SIGBUS) signame = "bus error (bad memory)"; if (signal == SIGABRT) signame = "abort"; zappcrash("fatal signal: %s",signame); exit(0); } /**************************************************************************************/ // Implement the TRACE macro. // Trace program execution by function and source code line number. // tracedump() dumps last 50 uses of TRACE macro, latest first. namespace tracenames { ch filebuff[50][100]; // last 50 TRACE calls ch funcbuff[50][60]; int linebuff[50]; void *addrbuff[50]; int ii, ftf = 1; }; // Args are source file, source function name, source code line number, // caller address. These all come from the GCC compiler and TRACE macro. void trace(ch *file, ch *func, int line, void *addr) { using namespace tracenames; if (ftf) { ftf = 0; for (ii = 0; ii < 50; ii++) { filebuff[ii][99] = 0; funcbuff[ii][39] = 0; linebuff[ii] = 0; addrbuff[ii] = 0; } ii = 0; } if (line == linebuff[ii] && strmatch(func,funcbuff[ii])) return; // same as last call, don't duplicate if (++ii > 49) ii = 0; // add data to list strncpy(&filebuff[ii][0],file,99); strncpy(&funcbuff[ii][0],func,39); linebuff[ii] = line; addrbuff[ii] = addr; return; } // dump trace records to STDOUT void tracedump() { using namespace tracenames; FILE *fid; int kk; printf(" *** tracedump *** \n"); kk = ii; while (linebuff[kk]) { printf("TRACE %s %s %d %p \n",&filebuff[kk][0], &funcbuff[kk][0],linebuff[kk],addrbuff[kk]); if (--kk == ii) break; } fid = fopen("tracedump","w"); if (! fid) { perror("tracedump fopen() failure \n"); return; } fprintf(fid, " *** tracedump *** \n"); kk = ii; while (linebuff[kk]) { fprintf(fid, "TRACE %s %s %d %p \n",&filebuff[kk][0], &funcbuff[kk][0],linebuff[kk],addrbuff[kk]); if (--kk == ii) break; } fclose(fid); return; } /**************************************************************************************/ // ch * combine_argvs(int argc, ch *argv[], Nth) // combine argv[ii] elements from Nth to last // returned char string has one blank between each element ch * combine_argvs(int argc, ch *argv[], int Nth) { int ii, ccv, outcc = 0; static ch output[XFCC]; for (ii = Nth; ii < argc; ii++) { ccv = strlen(argv[ii]); if (outcc + ccv > XFCC - 2) return 0; strcpy(output+outcc,argv[ii]); outcc += ccv; output[outcc] = ' '; outcc++; } outcc--; output[outcc] = 0; return output; } /**************************************************************************************/ // get elapsed seconds // if init = 0 (default if missing), return seconds since boot. // if init = 1, returns seconds since last call. // execution time is 0.013 microseconds on 5 GHz computer double get_seconds(int init) { timespec time1; static double secs1 = 0, secs2, secs3; if (init == 0) { clock_gettime(CLOCK_MONOTONIC_RAW,&time1); secs1 = time1.tv_sec; secs1 += time1.tv_nsec * 0.000000001; return secs1; } else { clock_gettime(CLOCK_MONOTONIC_RAW,&time1); secs2 = time1.tv_sec; secs2 += time1.tv_nsec * 0.000000001; secs3 = secs2 - secs1; secs1 = secs2; return secs3; } } // print elapsed seconds since last call, with label void print_seconds(ch *label) { double secs = get_seconds(1); printf("%s seconds: %.3f \n",label,secs); return; } // get time in real seconds from timespec struct double get_seconds(timespec *ts) { double secs; secs = ts->tv_sec; secs += ts->tv_nsec * 0.000000001; return secs; } /**************************************************************************************/ // start a timer or get elapsed time with millisecond resolution. void start_timer(double &time0) { timeval timev; gettimeofday(&timev,0); time0 = timev.tv_sec + 0.000001 * timev.tv_usec; return; } double get_timer(double &time0) { timeval timev; double time; gettimeofday(&timev,0); time = timev.tv_sec + 0.000001 * timev.tv_usec; return time - time0; } /**************************************************************************************/ // get elapsed CPU time used by current process // returns seconds with millisecond resolution double CPUtime() { clock_t ctime = clock(); double dtime = ctime / 1000000.0; return dtime; } /**************************************************************************************/ // get real memory used by current process, MB int memused() { ch buff1[100], buff2[1000]; ch *pp = 0; FILE *fid; double mem; int MB, pagesize; int mega = 1024 * 1024; snprintf(buff1,100,"/proc/self/stat"); // read file /proc/self/stat fid = fopen(buff1,"r"); if (fid) { pp = fgets(buff2,1000,fid); fclose(fid); } MB = 0; if (pp) { pp = strchr(pp,')'); // closing ')' after (short) filename if (pp) { parseprocrec(pp+1,22,&mem,null); // get real memory pagesize = sysconf(_SC_PAGESIZE); // system page size MB = mem * pagesize / mega + 0.5; } } return MB; } /**************************************************************************************/ // convert a time_t date/time (e.g. st_mtime from stat() call) // into a compact date/time format "yyyymmddhhmmss" void compact_time(time_t DT, ch *compactDT) { struct tm *fdt; int year, mon, day, hour, min, sec; fdt = localtime(&DT); year = fdt->tm_year + 1900; mon = fdt->tm_mon + 1; day = fdt->tm_mday; hour = fdt->tm_hour; min = fdt->tm_min; sec = fdt->tm_sec; compactDT[0] = year / 1000 + '0'; compactDT[1] = (year % 1000) / 100 + '0'; compactDT[2] = (year % 100) / 10 + '0'; compactDT[3] = year % 10 + '0'; compactDT[4] = mon / 10 + '0'; compactDT[5] = mon % 10 + '0'; compactDT[6] = day / 10 + '0'; compactDT[7] = day % 10 + '0'; compactDT[8] = hour / 10 + '0'; compactDT[9] = hour % 10 + '0'; compactDT[10] = min / 10 + '0'; compactDT[11] = min % 10 + '0'; compactDT[12] = sec / 10 + '0'; compactDT[13] = sec % 10 + '0'; compactDT[14] = 0; return; } /**************************************************************************************/ // convert a time_t date/time (e.g. st_mtime from stat() call) // into a pretty date/time format "yyyy:mm:dd hh:mm:ss" (19 chars. + null) void pretty_datetime(time_t DT, ch *prettyDT) // 25.1 { struct tm *fdt; int year, mon, day, hour, min, sec; fdt = localtime(&DT); year = fdt->tm_year + 1900; mon = fdt->tm_mon + 1; day = fdt->tm_mday; hour = fdt->tm_hour; min = fdt->tm_min; sec = fdt->tm_sec; prettyDT[0] = year / 1000 + '0'; prettyDT[1] = (year % 1000) / 100 + '0'; prettyDT[2] = (year % 100) / 10 + '0'; prettyDT[3] = year % 10 + '0'; prettyDT[4] = ':'; prettyDT[5] = mon / 10 + '0'; prettyDT[6] = mon % 10 + '0'; prettyDT[7] = ':'; prettyDT[8] = day / 10 + '0'; prettyDT[9] = day % 10 + '0'; prettyDT[10] = ' '; prettyDT[11] = hour / 10 + '0'; prettyDT[12] = hour % 10 + '0'; prettyDT[13] = ':'; prettyDT[14] = min / 10 + '0'; prettyDT[15] = min % 10 + '0'; prettyDT[16] = ':'; prettyDT[17] = sec / 10 + '0'; prettyDT[18] = sec % 10 + '0'; prettyDT[19] = 0; return; } /**************************************************************************************/ // seconds since 1970 (double) <--> year/mon/day/hour/min/secs (int[6]) void secs_datetime(double secs, int datetime[6]) { time_t tsecs = secs; tm *tmx; tmx = localtime(&tsecs); datetime[0] = tmx->tm_year + 1900; datetime[1] = tmx->tm_mon + 1; datetime[2] = tmx->tm_mday; datetime[3] = tmx->tm_hour; datetime[4] = tmx->tm_min; datetime[5] = tmx->tm_sec; return; } void datetime_secs(int datetime[6], double *secs) { time_t tsecs; tm tmx; tmx.tm_year = datetime[0] - 1900; tmx.tm_mon = datetime[1] - 1; tmx.tm_mday = datetime[2]; tmx.tm_hour = datetime[3]; tmx.tm_min = datetime[4]; tmx.tm_sec = datetime[5]; tmx.tm_isdst = -1; tsecs = mktime(&tmx); *secs = tsecs; return; } /**************************************************************************************/ // Read and parse /proc file with records formatted "parmname xxxxxxx" // Find all requested parameters and return their numeric values int parseprocfile(ch *pfile, ch *pname, double *value, ...) // EOL = 0 { FILE *fid; va_list arglist; ch buff[1000]; ch *pnames[20]; double *values[20]; int ii, fcc, wanted, found; pnames[0] = pname; // 1st parameter values[0] = value; *value = 0; va_start(arglist,value); for (ii = 1; ii < 20; ii++) // get all parameters { pnames[ii] = va_arg(arglist,ch *); if (! pnames[ii]) break; values[ii] = va_arg(arglist,double *); *values[ii] = 0; // initialize to zero } va_end(arglist); if (ii == 20) zappcrash("parseProcFile, too many fields"); wanted = ii; found = 0; fid = fopen(pfile,"r"); // open /proc/xxx file if (! fid) return 0; while ((fgets(buff,999,fid))) // read record, "parmname nnnnn" { for (ii = 0; ii < wanted; ii++) { // look for my fields fcc = strlen(pnames[ii]); if (strmatchN(buff,pnames[ii],fcc)) { *values[ii] = atof(buff+fcc); // return value found++; break; } } if (found == wanted) break; // stop when all found } fclose(fid); return found; } // Parse /proc record of the type "xxx xxxxx xxxxx xxxxxxxx xxx" // Return numeric values for requested fields (starting with 1) int parseprocrec(ch *prec, int field, double *value, ...) // EOL = 0 { va_list arglist; int xfield = 1, found = 0; va_start(arglist,value); while (*prec == ' ') prec++; // skip leading blanks while (field > 0) { while (xfield < field) // skip to next wanted field { prec = strchr(prec,' '); // find next blank if (! prec) break; while (*prec == ' ') prec++; // skip multiple blanks xfield++; } if (! prec) break; *value = atof(prec); // convert, return double found++; field = va_arg(arglist,int); // next field number if (! field) break; value = va_arg(arglist,double *); // next output double * } while (field > 0) { *value = 0; // zero values not found field = va_arg(arglist,int); value = va_arg(arglist,double *); } va_end(arglist); return found; } /**************************************************************************************/ // get current CPU temperature // returns 0 if cannot find int coretemp() // use package temp { FILE *fid; static int ftf = 1, zone, temp; static ch Tfile[200]; ch buff[200], *pp; if (ftf) // first call, setup { // dump files ".../thermal_zone*/type" ftf = 0; fid = popen("cat /sys/class/thermal/thermal_zone*/type","r"); // find file containing "pkg_temp" if (! fid) return 0; for (zone = 0; ; zone++) { pp = fgets(buff,200,fid); if (! pp) break; pp = strstr(pp,"pkg_temp"); if (pp) break; } pclose(fid); // ignore 'broken pipe' status if (! pp) { // failed zone = -1; return 0; } snprintf(Tfile,200,"cat /sys/class/thermal/thermal_zone%d/temp",zone); // corresp. file ".../thermal_zone*/temp" } if (zone < 0) return 0; // setup call failed fid = popen(Tfile,"r"); // read temp file if (! fid) return 0; pp = fgets(buff,200,fid); pclose(fid); if (! pp) return 0; temp = atoi(pp) / 1000; // get temp, deg. C x 1000 return temp; } /**************************************************************************************/ // get current temperature for given disk, e.g. "/dev/sda" // depends on "smartctl" command from package smartmontools int disktemp(ch *disk) { int id, temp; ch *pp, *pp2; ch buff[200], command[100]; FILE *ffid; temp = 0; pp2 = 0; snprintf(command,100,"smartctl -A %s",disk); ffid = popen(command,"r"); if (! ffid) return 0; while (true) { pp = fgets(buff,200,ffid); // revised for smartctl report if (! pp) break; // format changes if (strmatchN(pp,"ID#",3)) pp2 = strstr(pp,"RAW_VALUE"); id = atoi(pp); if (id != 190 && id != 194) continue; // Airflow Temp. or Temp. if (! pp2) continue; temp = atoi(pp2); if (temp < 10 || temp > 99) temp = 0; break; } pclose(ffid); return temp; } /**************************************************************************************/ // sleep for specified time in seconds (double) // signals can cause early return void zsleep(double dsecs) { unsigned isecs, nsecs; timespec tsecs; if (dsecs <= 0) return; isecs = unsigned(dsecs); nsecs = unsigned(1000000000.0 * (dsecs - isecs)); tsecs.tv_sec = isecs; tsecs.tv_nsec = nsecs; nanosleep(&tsecs,null); return; } /**************************************************************************************/ // loop for specified time in seconds (double) void zloop(double dsecs) { double time0, time1; if (dsecs <= 0) return; time0 = get_seconds(); time1 = time0 + dsecs; while (get_seconds() < time1) continue; return; } /**************************************************************************************/ // spinlock() is a simply way for a process to protect a code block from // concurrent execution by more than one thread, including the main() thread. // CANNOT BE USED for coroutines within one thread, e.g. GTK main loop. // // spinlock(1); // ... protected code // only one thread at a time can be in here // spinlock(0); // // will deadlock if already locked by same thread pthread_mutex_t spinmutex = PTHREAD_MUTEX_INITIALIZER; void spinlock(int lock) { if (lock) mutex_lock(&spinmutex); else mutex_unlock(&spinmutex); return; } /**************************************************************************************/ // Lock or unlock a multi-process multi-thread resource. // Only one process/thread may possess a given lock. // A reboot or process exit or crash releases the lock. // lockfile is typically "/tmp/filename" and does not have to exist // // fd = global_lock(lockfile); // ... protected code // only one process/thread at a time // global_unlock(fd,lockfile); int global_lock(ch *lockfile) { int err, fd; while (true) // loop until success { fd = open(lockfile,O_RDWR|O_CREAT,0666); // open the lock file if (fd < 0) zappcrash("global_lock() %s",strerror(errno)); err = flock(fd,LOCK_EX); // request exclusive lock if (! err) return fd + 1; // return value >= 1 close(fd); // failed zsleep(0.001); // wait a bit and try again } } void global_unlock(int fd, ch *lockfile) { int err = close(fd-1); if (err < 0) zappcrash("global_unlock() %s",strerror(errno)); return; } /**************************************************************************************/ // lock or unlock a resource // does not spin or wait for resource. // usable within or across threads in one process. // CANNOT BE USED for coroutines within one thread, e.g. GTK main loop. // return 0 if already locked, otherwise lock and return 1. mutex_t resource_lock_lock = PTHREAD_MUTEX_INITIALIZER; int resource_lock(int &resource) { if (resource) return 0; // locked mutex_lock(&resource_lock_lock); if (resource) { mutex_unlock(&resource_lock_lock); // locked return 0; } resource = 1; mutex_unlock(&resource_lock_lock); return 1; // locked OK } // unlock a locked resource void resource_unlock(int &resource) { mutex_lock(&resource_lock_lock); if (resource != 1) zappcrash("resource not locked"); // not locked resource = 0; // unlock mutex_unlock(&resource_lock_lock); return; } /**************************************************************************************/ // Safely access and update parameters from multiple threads. // A mutex lock is used to insure one thread at a time has access to the parameter. // Many parameters can be used but there is only one mutex lock. // CANNOT BE USED for coroutines within one thread, e.g. GTK main loop. mutex_t zget_lock = PTHREAD_MUTEX_INITIALIZER; int zget_locked(int ¶m) // lock and return parameter { // (wait if locked) mutex_lock(&zget_lock); return param; } void zput_locked(int ¶m, int value) // set and unlock parameter { param = value; mutex_unlock(&zget_lock); return; } int zadd_locked(int ¶m, int incr) // lock, increment, unlock, return { int retval; mutex_lock(&zget_lock); retval = param + incr; param = retval; mutex_unlock(&zget_lock); return retval; } /**************************************************************************************/ // Start a detached thread using a simplified protocol. // Will not make a zombie if caller exits without checking thread status. pthread_t start_detached_thread(void * threadfunc(void *), void * arg) { pthread_attr_t pthattr; pthread_t pthtid; int ii, err; pthread_attr_init(&pthattr); pthread_attr_setdetachstate(&pthattr,PTHREAD_CREATE_DETACHED); for (ii = 0; ii < 1000; ii++) { err = pthread_create(&pthtid,&pthattr,threadfunc,arg); if (! err) return pthtid; zsleep(0.001); if (err == EAGAIN) continue; // this shit happens break; } zexit(1,"pthread_create() failure: %s",strerror(err)); return 0; // avoid compiler warning } /**************************************************************************************/ // Start a thread using a simplified protocol. // Caller must call wait_Jthread() to avoid creating a zombie process. pthread_t start_Jthread(void * threadfunc(void *), void * arg) { pthread_t tid; int err; err = pthread_create(&tid, null, threadfunc, arg); // retry EAGAIN failure removed if (! err) return tid; // (does not work) zexit(1,"pthread_create() failure: %s",strerror(err)); // fail totally return 0; } // wait for thread to exit. int wait_Jthread(pthread_t tid) { int err; err = pthread_join(tid, null); if (! err) return 0; zexit(1,"pthread_join() failure: %s",strerror(err)); return 0; } /**************************************************************************************/ // Synchronize execution of multiple threads. // Simultaneously resume NT calling threads. // from main(): synch_threads(NT) /* setup to synch NT threads */ // from each thread: synch_threads(0) /* suspend, resume simultaneously */ // // Each calling thread will suspend execution until all threads have suspended, // then they will all resume execution at the same time. If NT is greater than // the number of calling threads, the threads will never resume. void synch_threads(int NT) { static pthread_barrier_t barrier; static int bflag = 0; if (NT) { // main(), initialize if (bflag) pthread_barrier_destroy(&barrier); pthread_barrier_init(&barrier,null,NT); bflag = 1; return; } pthread_barrier_wait(&barrier); // thread(), wait for NT threads return; // unblock } /**************************************************************************************/ // Test if caller is from the main() thread or from a created thread. // return 1 if main(), else 0 int main_thread() { if (pthread_equal(pthread_self(),zfuncs::tid_main)) return 1; return 0; } /************************************************************************************** int err = zshell(ch *options, ch *command, ...) Format and perform a shell command, wait for completion, return status. Shell command is performed in a thread with a GTK main loop wait options: may be null or may contain any of the following substrings: "log" write command to log file, stdout "ack" popup user ACK message if the shell command has an error "noerr" do not log error status "thread" run shell command in a thread with GTK main loop wait // 25.1 command: shell command with optional '%' printf formats ... : optional arguments to stuff into printf formats returns: status of the shell command ***************************************************************************************/ int zshell_stat; int zshell(ch *options, ch *command, ...) { void * zshell_thread(void *command); int Flog, Fack, Fnoerr, Fthread; va_list arglist; int err, cc, ccmax = 9999; // 25.1 ch command2[10000]; pthread_t tid; Flog = Fack = Fnoerr = Fthread = 0; if (options) { if (strstr(options,"log")) Flog = 1; // set options if (strstr(options,"ack")) Fack = 1; if (strstr(options,"noerr")) Fnoerr = 1; if (strstr(options,"thread")) Fthread = 1; // 25.1 } va_start(arglist,command); // format command cc = vsnprintf(command2,ccmax,command,arglist); va_end(arglist); if (cc >= ccmax) zappcrash("zshell: buffer overflow: %d",cc); if (Fnoerr && ccmax-cc > 17) strcat(command2," >/dev/null 2>&1"); // suppress error output if not wanted 25.0 if (Flog) printf("zshell: %s \n",command2); // command > log file if wanted if (Fthread) // do shell command in a thread 25.1 { zshell_stat = -1; tid = start_Jthread(zshell_thread,command2); // start thread while (zshell_stat < 0) zmainsleep(0.01); // wait for command status wait_Jthread(tid); // join thread } else zshell_stat = system(command2); err = WEXITSTATUS(zshell_stat); // get thread status if (err && ! Fnoerr) { // suppress log of command and error if (! Flog) printf("zshell: %s \n",command2); // log command if not already printf("*** zshell error: %s \n",strerror(err)); // log error if (Fack) zmessageACK(mainwin,"command: %s \n error: %s", command2, strerror(err)); // popup error to user if wanted } return err; // return completion status } void * zshell_thread(void *command) { zshell_stat = system((ch *) command); return 0; } /**************************************************************************************/ // Get the output of a shell command into a string, max. cc // Returns cc of command output. // If the command fails, whatever error text it outputs is returned int command_output(ch *command, ch *output, int cc) // 26.7 { FILE *fid; ch *pp; *output = 0; fid = popen(command,"r"); if (! fid) return 0; pp = fgets(output,cc,fid); pclose(fid); if (! pp) return 0; return strlen(output); } /**************************************************************************************/ // kill processes matching a given process name, which may have '*' wildcards // int NP = kill_procname("process*name*") // status returned: N = processes found (0 if none found) int kill_procname(ch *wildname) { DIR *procdir; struct dirent *procent; int cc, found = 0; ch *pp, *pid, *filename; ch buff1[100], buff2[XFCC]; procdir = opendir("/proc"); if (! procdir) return 1; while (true) { procent = readdir(procdir); if (! procent) break; pid = procent->d_name; snprintf(buff1,100,"/proc/%s/exe",pid); cc = readlink(buff1,buff2,XFCC); if (cc <= 0) continue; buff2[cc] = 0; pp = strrchr(buff2,'/'); if (! pp) continue; filename = pp + 1; if (MatchWild(wildname,filename) != 0) continue; zshell("log","kill %s",pid); found++; } closedir(procdir); return found; } /**************************************************************************************/ // Signal a running subprocess by name (name of executable or shell command). // Signal is "pause", "resume" or "kill". If process is paused, kill may not work, // so issue resume first if process is paused. int signalProc(ch *pname, ch *signal) { pid_t pid; FILE *fid; ch buff[100], *pp; int err, nsignal = 0; snprintf(buff,100,"ps -C %s h o pid",pname); fid = popen(buff,"r"); // popen() instead of system() if (! fid) return 2; pp = fgets(buff,100,fid); pclose(fid); if (! pp) return 4; pid = atoi(buff); if (! pid) return 5; if (strmatch(signal,"pause")) nsignal = SIGSTOP; if (strmatch(signal,"resume")) nsignal = SIGCONT; if (strmatch(signal,"kill")) nsignal = SIGKILL; err = kill(pid,nsignal); return err; } /**************************************************************************************/ // fgets() with additional feature: trailing \n \r are removed. // optional bf flag: true if trailing blanks are to be removed. // trailing null character is assured. ch * fgets_trim(ch *buff, int maxcc, FILE *fid, int bf) { int cc; ch *pp; pp = fgets(buff,maxcc,fid); if (! pp) return pp; cc = strlen(buff); if (bf) while (cc && buff[cc-1] > 0 && buff[cc-1] <= ' ') --cc; else while (cc && buff[cc-1] > 0 && buff[cc-1] < ' ') --cc; buff[cc] = 0; return pp; } /**************************************************************************************/ // get next record from open file steam // do not block if next record is not yet available // // buff: buffer for reading file // bcc: length of buffer // fid: open file stream // // returned ch * pointer: // null: EOF or error - file can be closed // "fgets_pend\n": next record not yet available, try again later // other: pointer to record in buffer, \n\0 terminated ch * fgets_pend(ch *buff, int bcc, FILE *fid) // 25.1 { int fd, flags; static FILE *pfid = 0; ch *pp; if (fid != pfid) { pfid = fid; fd = fileno(fid); // stop fgets() from blocking flags = fcntl(fd,F_GETFL,0); flags |= O_NONBLOCK; fcntl(fd,F_SETFL,flags); } pp = fgets(buff,500,fid); // read next record in file if (pp) return pp; // success if (feof(fid)) return 0; // EOF, no more data return "fgets_pend\n"; // next record not available yet } /**************************************************************************************/ // Return 1 if both filespecs have the same folder, else return 0. // Both folders must be specified, at least one with ending '/' // (true if a file name is present) int samefolder(ch *file1, ch *file2) { ch *p1, *p2; int cc1, cc2, cc; p1 = strrchr(file1,'/'); // /dir1/dir2 p2 = strrchr(file2,'/'); // /dir1/dir2/file cc1 = cc2 = 0; if (p1) cc1 = p1 - file1; // /dir1/dir2/file if (p2) cc2 = p2 - file2; // | | if (cc2 > cc1) cc = cc2; // 0 cc else cc = cc1; if (cc == 0) return 0; if (strmatchN(file1,file2,cc)) return 1; return 0; } /**************************************************************************************/ // Parse a pathname (filespec) and return its components. // Returned strings are subject to zfree() unless they are null. // folder is returned without trailing '/' but with two nulls on end, // to allow appending '/' if needed. // file is returned without .ext // ext is returned with leading '.' // returns 0 if OK, 1 if error int parsefile(ch *path, ch *&folder, ch *&file, ch *&ext) // make reentrant 25.1 { ch *pp1, *pp2; int cc; folder = file = ext = 0; if (! path || ! *path) return 1; // null or empty string pp1 = strrchr(path,'/'); if (! pp1) return 1; // /folders/.../file.ext cc = pp1 - path; // | | | if (cc < 2) return 1; // path pp1 pp2 *pp1 = 0; folder = zstrdup(path,"parsefile",2); *pp1 = '/'; pp1++; // /folders/.../file.ext if (! *pp1) return 0; // | | // pp1 pp2 pp2 = strrchr(pp1,'.'); if (! pp2) { file = zstrdup(pp1,"parsefile"); return 0; } *pp2 = 0; file = zstrdup(pp1,"parsefile"); *pp2 = '.'; ext = zstrdup(pp2,"parsefile"); return 0; } // free file name components allocated by parsefile() void parsefile_free(ch *&folder, ch *&file, ch *&ext) // 25.1 { if (folder) zfree(folder); if (file) zfree(file); if (ext) zfree(ext); folder = file = ext = 0; return; } /**************************************************************************************/ // Move a source file to a destination file and delete the source file. // Equivalent to rename(), but the two files MAY be on different file systems. // Pathnames must be absolute (start with '/'). // Returns 0 if OK, +N if not. int renamez(ch *file1, ch *file2) { ch *pp1, *pp2; int err, Frename = 0; if (*file1 != '/' || *file2 != '/') return 1; // not absolute pathnames pp1 = strchr((ch *) file1+1,'/'); pp2 = strchr((ch *) file2+1,'/'); if (! pp1 || ! pp2) return 2; *pp1 = *pp2 = 0; if (strmatch(file1,file2)) Frename = 1; *pp1 = *pp2 = '/'; if (Frename) { // same top folder err = rename(file1,file2); if (err) return errno; return 0; } pp1 = zescape_quotes(file1); pp2 = zescape_quotes(file2); err = zshell(0,"mv -f \"%s\" \"%s\" ",pp1,pp2); zfree(pp1); zfree(pp2); return err; } /**************************************************************************************/ // Check if a folder exists. If not, ask user if it should be created. // Returns 0 if OK or +N if error or user refused to create. // The user is notified of failure, no other message needed. // path may not have embedded quotes. int check_create_dir(ch *path) { int err, yn; STATB statB; err = stat(path,&statB); // check status if (! err) { if (S_ISDIR(statB.st_mode)) return 0; // exists, folder, OK else { zmessageACK(mainwin,"%s \n %s",path,strerror(ENOTDIR)); // exists, not a folder return ENOTDIR; } } if (errno != ENOENT) { zmessageACK(mainwin,"%s \n %s",path,strerror(errno)); // error other than missing return errno; } yn = zmessageYN(0,TX("create folder %s"),path); // ask to create if (! yn) return ENOENT; err = zshell("ack","mkdir -p -m 0750 \"%s\" ",path); // create if (! err) return 0; zmessageACK(mainwin,"%s \n %s",path,strerror(errno)); // failed to create return errno; } /**************************************************************************************/ // copy a file using shell 'cp' command // file owner, permissions, and timestamps are copied // returns 0 if OK, else errno int cp_copy(ch *sfile, ch *dfile) { ch *pps, *ppd; if (strmatch(sfile,dfile)) { printf("ignore copy file to self: %s \n",sfile); return 0; } pps = zescape_quotes(sfile); ppd = zescape_quotes(dfile); int err = zshell(0,"cp -f -p \"%s\" \"%s\" ",pps,ppd); zfree(pps); zfree(ppd); return err; } /**************************************************************************************/ // get the available space on disk of the given file // returns disk space in MB (limit 4 billion MB) uint diskspace(ch *file) { ch command[200], buff[200]; ch *pp; uint avail; FILE *fid; pp = zescape_quotes(file); snprintf(command,200,"df --output=avail \"%s\" ",pp); zfree(pp); fid = popen(command,"r"); if (! fid) return 0; pp = fgets(buff,200,fid); // "Avail" header pp = fgets(buff,200,fid); // decimal number, KB space pclose(fid); if (! pp) return 0; avail = 0.001 * atoll(pp); // MB space return avail; } /**************************************************************************************/ // if a file has an incorrect .ext, return the correct .ext // return null if file is OK or cannot be determined // returned .ext is in a static buffer NOT THREAD SAFE ch * get_file_extension(ch *file) { ch *fext1; ch *extlist, *fext2, *pp; ch *buff; int cc; FILE *fid; static ch fext3[20]; errno = 0; cc = strlen(file) + 20; buff = (ch *) zmalloc(cc,0); pp = zescape_quotes(file); snprintf(buff,cc,"file --extension %s",pp); // 'file' command - get correct extensions zfree(pp); fid = popen(buff,"r"); if (! fid) goto ret0; extlist = fgets(buff,cc,fid); // /.../filename.ext: ext1/ext2/... pclose(fid); if (! extlist) goto ret0; extlist = strrchr(extlist,':'); // extlist = : ext1/ext2/... if (! extlist) goto ret0; extlist += 2; // extlist = ext1/ext2/... fext1 = strrchr(file,'.'); // fext1 = file current .ext if (! fext1) fext1 = ".xxx"; if (strcasestr(extlist,fext1+1)) goto ret0; // fext1 found in extlist fext2 = extlist; pp = strchr(fext2,'/'); // fext2 = first in extlist if (pp) *pp = 0; strncpy0(fext3,fext2,20); // return correct .ext in static buffer zfree(buff); return fext3; ret0: if (errno) printf("*** %s\n",strerror(errno)); zfree(buff); return 0; } /**************************************************************************************/ // Return all the file names in a folder, sorted in alphabetic order. // Subfolders are not included. // The 'files' argument is allocated and filled with pointers to file names. // (the names in the folder, not the full path names) // The number of files found is returned. // -1 is returned if the folder is invalid or other error. // If 'files' is returned non-null, it is subject to zfree() int zreaddir(ch *folder, ch **&files) { struct dirent *dirent1; int Nfiles = 0, maxfiles = 100; DIR *direc; ch **ufiles, **ufiles2; files = 0; // nothing returned yet ufiles = (ch **) zmalloc(maxfiles * sizeof(ch *),"zreaddir"); // starting space direc = opendir(folder); // open caller's folder if (! direc) return -1; while (true) { if (Nfiles == maxfiles) // out of space { ufiles2 = (ch **) zmalloc(2 * maxfiles * sizeof(ch *),"zreaddir"); // allocate new space = 2x old space memcpy(ufiles2,ufiles, maxfiles * sizeof(ch *)); // copy data to new space zfree(ufiles); // free old space ufiles = ufiles2; // set new space maxfiles *= 2; // new capacity } dirent1 = readdir(direc); // get next file in folder if (! dirent1) break; if (dirent1->d_type != DT_REG) continue; // skip subfolders ufiles[Nfiles] = zstrdup(dirent1->d_name,"zreaddir"); // add to file list Nfiles++; continue; } closedir(direc); if (Nfiles > 1) HeapSort(ufiles,Nfiles); // sort file list files = ufiles; // return allocated file list return Nfiles; // return file count } /**************************************************************************************/ // int NR = zreadfile(ch *filename, ch &**rrecs) // // Read a text file into a list of ch * strings, 1 record per string. // The strings are allocated as needed. The number of records is returned. // Returned: -1 error (errno is set) // 0 empty file // NR records read, > 0 // Returned record N: rrecs[N] (ch *) // Trailing blanks and '\n' characters are removed. // The maximum record length is 1000 chars, including terminating null. // The maximum record count is 1000 records. // Null records ("" or "\n") are not included in output. // rrecs[NR] (last + 1) is a null pointer. int zreadfile(ch *filename, ch **&rrecs) { FILE *fid; ch *recs[1001]; ch buff[1001], *pp; int cc, NR = 0; rrecs = 0; // initz. no data fid = fopen(filename,"r"); // open file if (! fid) return -1; while (true) { pp = fgets(buff,1001,fid); // read record if (! pp) break; // EOF cc = strlen(pp); if (cc > 999) { zmessageACK(mainwin,"zreadfile() record too long %s",filename); errno = EFBIG; return -1; } while (cc && pp[cc-1] > 0 && pp[cc-1] <= ' ') --cc; // remove trailing \n, \r, blanks, etc. pp[cc] = 0; // terminating null if (cc == 0) continue; // discard null recs recs[NR] = (ch *) zmalloc(cc+1,"zreadfile"); // allocate memory memcpy(recs[NR],pp,cc+1); // copy record NR++; if (NR == 1000) { zmessageACK(mainwin,"zreadfile() too many records %s",filename); errno = EFBIG; return -1; } } fclose(fid); recs[NR] = 0; // last record + 1 = null cc = (NR + 1) * sizeof(ch *); // allocate caller rrecs list rrecs = (ch **) zmalloc(cc,"zreadfile"); memcpy(rrecs,recs,cc); // copy record pointers + null return NR; } // int NR = zwritefile(ch *filename, ch **rrecs) // write array of records to a file, each with trailing \n character. // EOF is signalled with a null pointer: rrecs[last] = null // returns no. records written (>= 0) or -1 if file error. int zwritefile(ch *filename, ch **rrecs) { FILE *fid; int nr, nn; fid = fopen(filename,"w"); // open file if (! fid) return -1; for (nr = 0; nr < 1000; nr++) { if (! rrecs[nr]) break; nn = fprintf(fid,"%s\n",rrecs[nr]); if (nn <= 0) break; } fclose(fid); return nr; } // free allocated records and their pointer list void zreadfile_free(ch **&rrecs) { for (int ii = 0; rrecs[ii]; ii++) // loop until null pointer zfree(rrecs[ii]); zfree(rrecs); rrecs = 0; // set no data return; } /**************************************************************************************/ // these functions are a replacement for the strcmp functions // null strings are allowed and compare false to non-null strings // null strings compare true to null strings int strmatch(cch *str1, cch *str2) { if (str1 && str2) return ! strcmp(str1,str2); if (! str1 && ! str2) return 1; else return 0; } int strmatchN(cch *str1, cch *str2, int cc) { if (str1 && str2) return ! strncmp(str1,str2,cc); else return 0; } int strmatchcase(cch *str1, cch *str2) { if (str1 && str2) return ! strcasecmp(str1,str2); if (! str1 && ! str2) return 1; else return 0; } int strmatchcaseN(cch *str1, cch *str2, int cc) { if (str1 && str2) return ! strncasecmp(str1,str2,cc); else return 0; } /************************************************************************************** substringR() ch * substringR(ch *string, ch *delims, int Nth) Get the Nth substring in an input string, which contains at least N substrings delimited by the character(s) in delim (e.g. blank, comma). Nth >= 1. Returns a pointer to the found substring (actually a pointer to a copy of the found substring, with a null terminator appended). The returned pointer is a subject for zfree(). If a delimiter is immediately followed by another delimiter, it is considered a substring with zero length, and the string "" is returned. Leading blanks in a substring are omitted from the returned substring. A substring with only blanks is returned as "". The last substring may be terminated by null or a delimiter. Characters within quotes (") are treated as data within a substring, i.e. blanks and delimiters are not processed as such. The quotes are removed from the returned substring. If there are less than Nth substrings, a null pointer is returned. This function is thread-safe. See below for simpler non-thread-safe version. Example: input string: ,a,bb, cc, ,dd"ee,ff"ggg, (first and last characters are comma) delimiter: comma Nth returned string 1: (null) 2: a 3: bb 4: cc 5: (one blank) 6: ddee,ffggg 7: (null) last+1 substring ***************************************************************************************/ ch * substringR(ch *string, ch *delims, int Nth) { ch *pf1, pf2[2000]; // 2000 char. limit ch quote = '"'; int nf, fcc = 0; if (! string || ! *string) return 0; // bad call if (Nth < 1) return 0; pf1 = (ch *) string - 1; // start parse nf = 0; while (nf < Nth) { pf1++; // start substring nf++; fcc = 0; while (*pf1 == ' ') pf1++; // skip leading blanks while (true) { if (*pf1 == quote) { // pass chars between quotes pf1++; // (but without the quotes) while (*pf1 && *pf1 != quote) pf2[fcc++] = *pf1++; if (*pf1 == quote) pf1++; } else if (strchr(delims,*pf1) || *pf1 == 0) break; // found delimiter or null else pf2[fcc++] = *pf1++; // pass normal character if (fcc > 1999) zappcrash("substringR() too long"); } if (*pf1 == 0) break; // end of input string } if (nf < Nth) return 0; // no Nth substring if (fcc == 0 && *pf1 == 0) return 0; // empty substring pf2[fcc] = 0; return zstrdup(pf2,"substringR"); // returned string (needs zfree()) } // alternative with one delimiter ch * substringR(ch *string, ch delim, int Nth) { ch delims[2] = "x"; *delims = delim; return substringR(string,delims,Nth); } // non-thread-safe versions without zfree() requirement // returned substring is in static memory // only the last 1000 results are kept <----- NOTE limitation // causes creeping small memory leak ch * substring(ch *string, ch *delims, int Nth) { ch *s1; static ch *s2[1000]; static int kk = -1; if (kk == -1) memset(s2,0,1000*sizeof(ch *)); s1 = substringR(string,delims,Nth); if (! s1) return 0; kk++; if (kk == 1000) kk = 0; if (s2[kk]) zfree(s2[kk]); s2[kk] = s1; return s1; } ch * substring(ch *string, ch delim, int Nth) { ch delims[2] = "x"; *delims = delim; return substring(string,delims,Nth); } /************************************************************************************** decode a string with embedded delimiters and return the substrings input: string1^ string2^ ... stringN where '^' is the delimiter output: output[0], output[1] ... output[N] delim: single delimiter character count: max. number of output strings maxcc: max. output string length (rest truncated) the output strings must be pre-allocated with at least maxcc chars. returns: no. substrings found output string = single null if two delimiters are separated by nothing or blanks ****/ int get_substrings(ch *input, ch delim, int count, int maxcc, ch **output) // 25.1 { int Nth = 0, ii, cc; ch *pp1 = input, *pp2; for (ii = 0; ii < count; ii++) // clear outputs output[ii][0] = 0; for (Nth = 0; Nth < count; Nth++) // aaaaaaaa^ bbbbbbbbbbbbb^ ... ^ ccccccc { // | | | | | | | while (*pp1 == ' ') pp1++; // pp1 pp2 pp1 pp2 pp2 pp1 pp2 if (! *pp1) break; pp2 = strchr(pp1,delim); if (! pp2) pp2 = pp1 + strlen(pp1); cc = pp2 - pp1; if (cc >= maxcc) cc = maxcc - 1; if (cc) strncpy(output[Nth],pp1,cc); output[Nth][cc] = 0; if (*pp2 == delim) pp1 = pp2 + 1; else pp1 = pp2; } return Nth; } /**************************************************************************************/ // Produce random value from hashed input string. // Output range is 0 to max-1. // Benchmark: 0.2 usec for 99 char. string, 3 GHz Core i5 int strHash(ch *string, uint max) { uint hash = 1357; uch byte; while ((byte = *string++)) { hash = hash * (byte + 111); hash = hash ^ (hash >> 9); hash = hash ^ (byte << 9); } hash = hash % max; return hash; } /**************************************************************************************/ // Copy string with specified max. length (including null terminator). // truncate if needed. null terminator is always supplied. // Returns 0 if no truncation, 1 if input string was truncated to fit. int strncpy0(ch *dest, ch *source, uint cc) { strncpy(dest,source,cc); dest[cc-1] = 0; if (strlen(source) >= cc) return 1; // truncated else return 0; } /**************************************************************************************/ // Copy string with blank pad to specified length. No null is added. void strnPad(ch *dest, ch *source, int cc) { strncpy(dest,source,cc); int ii = strlen(source); for (int jj = ii; jj < cc; jj++) dest[jj] = ' '; } /**************************************************************************************/ // Remove trailing blanks from a string. Returns remaining length. int strTrim(ch *dest, ch *source) { if (dest != source) strcpy(dest,source); return strTrim(dest); } int strTrim(ch *dest) { int ii = strlen(dest); while (ii && (dest[ii-1] == ' ')) dest[--ii] = 0; return ii; } /**************************************************************************************/ // Remove leading and trailing blanks from a string. // Returns remaining length, possibly zero. int strTrim2(ch *dest, ch *source) { ch *pp1, *pp2; int cc; pp1 = source; pp2 = source + strlen(source) - 1; while (*pp1 == ' ') pp1++; if (*pp1 == 0) { strcpy(dest,""); // null or blank input return 0; } while (*pp2 == ' ' && pp2 > pp1) pp2--; cc = pp2 - pp1 + 1; memmove(dest,pp1,cc); dest[cc] = 0; return cc; } int strTrim2(ch *string) { return strTrim2(string,string); } /**************************************************************************************/ // Remove all blanks from a string. Returns remaining length. int strCompress(ch *dest, ch *source) { if (dest != source) strcpy(dest,source); return strCompress(dest); } int strCompress(ch *string) { int ii, jj; for (ii = jj = 0; string[ii]; ii++) { if (string[ii] != ' ') { string[jj] = string[ii]; jj++; } } string[jj] = 0; return jj; } /**************************************************************************************/ // Concatenate multiple strings, staying within a specified overall length. // The destination string is also the first source string. // Null marks the end of the source strings (omission --> crash). // Output is truncated to fit within the specified length. // A final null is assured and is included in the length. // Returns 0 if OK, 1 if truncation was needed. int strncatv(ch *dest, int maxcc, ch *source, ...) { ch *ps; va_list arglist; maxcc = maxcc - strlen(dest) - 1; if (maxcc < 0) return 1; va_start(arglist,source); ps = source; while (ps) { strncat(dest,ps,maxcc); maxcc = maxcc - strlen(ps); if (maxcc < 0) break; ps = va_arg(arglist,ch *); if (! ps) break; } va_end(arglist); if (maxcc < 0) return 1; return 0; } /**************************************************************************************/ // Match 1st string to N additional strings. // Return matching string number 1 to N or 0 if no match. // Supply a null argument for end of list. int strmatchV(ch *string, ...) { int match = 0; ch *stringN; va_list arglist; va_start(arglist,string); while (true) { stringN = va_arg(arglist, ch *); if (! stringN) { va_end(arglist); return 0; } match++; if (strmatch(string,stringN)) { va_end(arglist); return match; } } } /**************************************************************************************/ // convert string to upper case (ascii only) void strToUpper(ch *string) { int ii; ch jj; int delta = 'A' - 'a'; for (ii = 0; (jj = string[ii]); ii++) if ((jj >= 'a') && (jj <= 'z')) string[ii] += delta; } void strToUpper(ch *dest, ch *source) { strcpy(dest,source); strToUpper(dest); } /**************************************************************************************/ // convert string to lower case (ascii only) void strToLower(ch *string) { int ii; ch jj; int delta = 'a' - 'A'; for (ii = 0; (jj = string[ii]); ii++) if ((jj >= 'A') && (jj <= 'Z')) string[ii] += delta; } void strToLower(ch *dest, ch *source) { strcpy(dest,source); strToLower(dest); } /**************************************************************************************/ // Copy string strin to strout, replacing every occurrence // of the substring ssin with the substring ssout. // maxcc is the limit for strout. The actual cc is returned. // Replacement strings may be longer or shorter or have zero length. int repl_1str(ch *strin, ch *strout, int maxcc, ch *ssin, ch *ssout) { int cc, cc1, cc2, ccout; ch *pp, *pp1, *pp2; pp1 = strin; pp2 = strout; cc1 = strlen(ssin); cc2 = strlen(ssout); ccout = 0; while ((pp = strstr(pp1,ssin))) { cc = pp - pp1; if (ccout + cc >= maxcc) break; memcpy(pp2,pp1,cc); pp2 += cc; pp1 += cc; ccout += cc; if (ccout + cc2 >= maxcc) break; memcpy(pp2,ssout,cc2); pp1 += cc1; pp2 += cc2; ccout += cc2; } cc = strlen(pp1); if (ccout + cc >= maxcc) cc = maxcc - ccout - 1; // overflow, keep as much as poss. 25.1 memcpy(pp2,pp1,cc); ccout += cc; strout[ccout] = 0; return ccout; } /**************************************************************************************/ // Copy string strin to strout, replacing multiple substrings with replacement strings. // Multiple pairs of string arguments follow maxcc, a substring and a replacement string. // Last pair of string arguments must be followed by a null argument. // maxcc is the limit for strout. The actual cc is returned. // Replacement strings may be longer or shorter or have zero length. int repl_Nstrs(ch *strin, ch *strout, int maxcc, ...) { va_list arglist; ch *ssin, *ssout; ch ftemp[2000]; int ftf, ccout; ftf = 1; ccout = 0; va_start(arglist,maxcc); while (true) { ssin = va_arg(arglist, ch *); if (! ssin) break; ssout = va_arg(arglist, ch *); if (ftf) { ftf = 0; ccout = repl_1str(strin,strout,maxcc,ssin,ssout); } else { if (ccout >= 2000) goto stop; strcpy(ftemp,strout); ccout = repl_1str(ftemp,strout,maxcc,ssin,ssout); } } stop: va_end(arglist); return ccout; } /**************************************************************************************/ // Break up a long text string into lines no longer than ccmax chars. // If fake newlines ("\n") are found, replace them with real newlines. // Break unconditionally where newlines are found and remove them. // Break at last blank ch between ccmin and ccmax if present. // Break at last delimiter ch between ccmin and ccmax if present. // Break unconditionally at ccmax if none of the above. // Returns text lines in txout[*] with count as returned function value. // txout[*] are subjects for zfree(). int breakup_text(ch *txin0, ch **&txout, ch *delims, int ccmax) // 26.8 { ch *txin; uch ch1; int ccin; int ccmin = ccmax - 20; // 26.8 int p1, p2, cc3, Nout; int Np, Bp, Sp; txin = zstrdup(txin0,"breakup_text"); ccin = strlen(txin); txout = (ch **) zmalloc(100 * sizeof(ch *),"breakup_text"); // 100 line limit if (strstr(txin0,"\\n")) // replace "\n" with real newline chars repl_1str(txin0,txin,ccin,"\\n","\n"); Nout = p1 = 0; while (true) { p2 = p1; // input line position cc3 = 0; // output line cc Np = Bp = Sp = 0; while (txin[p2]) // scan further up to ccmax chars { ch1 = txin[p2]; if (ch1 == '\n') { Np = p2; break; } // break out if newline found if (cc3 >= ccmin) { if (ch1 == ' ') Bp = p2; // remember last ' ' found after ccmin chars if (delims && strchr(delims,ch1)) Sp = p2; // remember last delimiter found after ccmin } if (ch1 < 0) // UTF8 wide character while ((ch1 = txin[p2+1]) < 0xC0) p2++; p2++; cc3++; if (cc3 == ccmax) break; } if (! cc3 && ! Np) break; // nothing left if (Np) cc3 = Np - p1; // newline found else { if (cc3 < ccmax) Bp = Sp = 0; // line fits ccmax limit if (Bp) cc3 = Bp - p1 + 1; // break at previous ' ' else if (Sp) cc3 = Sp - p1 + 1; // break at previous delimiter else cc3 = p2 - p1; } if (txin[p1] == ' ' && cc3) { p1++; cc3--; } // remove leading blank if (cc3 > 0) { // avoid blank line txout[Nout] = (ch *) zmalloc(cc3+1,"breakup_text"); strncpy0(txout[Nout],txin+p1,cc3+1); if (++Nout == 100) break; } p2 = p1 + cc3; if (Np) p2++; p1 = p2; } zfree(txin); return Nout; } /**************************************************************************************/ // Copy and convert string to hex string. // Each input character 'A' >> 3 output characters "41 " void strncpyx(ch *out, ch *in, int ccin) { int ii, jj, c1, c2; ch cx[] = "0123456789ABCDEF"; if (! ccin) ccin = strlen(in); for (ii = 0, jj = 0; ii < ccin; ii++, jj += 3) { c1 = (uch) in[ii] >> 4; c2 = in[ii] & 15; out[jj] = cx[c1]; out[jj+1] = cx[c2]; out[jj+2] = ' '; } out[jj] = 0; return; } /**************************************************************************************/ // Strip trailing zeros from ascii floating numbers // (e.g. 1.230000e+02 --> 1.23e+02) void StripZeros(ch *pNum) { int ii, cc; int pp, k1, k2; ch work[20]; cc = strlen(pNum); if (cc >= 20) return; for (ii = 0; ii < cc; ii++) { if (pNum[ii] == '.') { pp = ii; k1 = k2 = 0; for (++ii; ii < cc; ii++) { if (pNum[ii] == '0') { if (! k1) k1 = k2 = ii; else k2 = ii; continue; } if ((pNum[ii] >= '1') && (pNum[ii] <= '9')) { k1 = 0; continue; } break; } if (! k1) return; if (k1 == pp + 1) k1++; if (k2 < k1) return; strcpy(work,pNum); strcpy(work+k1,pNum+k2+1); strcpy(pNum,work); return; } } } /**************************************************************************************/ // test for blank/null string // Returns status depending on input string: // 0 not a blank or null string // 1 argument string is NULL // 2 string has zero length (*string == 0) // 3 string is all blanks int blank_null(ch *string) { if (! string) return 1; // null string if (! *string) return 2; // zero length string int cc = strlen(string); for (int ii = 0; ii < cc; ii++) if (string[ii] != ' ') return 0; // non-blank string return 3; // blank string } /**************************************************************************************/ // clean \x escape sequences and replace them with the escaped character // \n >> newline \" >> doublequote \\ >> backslash etc. // see $ man ascii for the complete list int clean_escapes(ch *string) { ch *pp1 = string, *pp2 = string, *pp; ch char1; ch escapes[] = "abtnvfr"; int count = 0; while (true) { char1 = *pp1++; if (char1 == 0) { *pp2 = 0; return count; } else if (char1 == '\\') { char1 = *pp1++; pp = strchr(escapes,char1); if (pp) char1 = pp - escapes + 7; count++; } *pp2++ = char1; } } /**************************************************************************************/ // Compute the graphic character count for a UTF8 character string. // Depends on UTF8 rules: // - ascii characters are positive (0x00 to 0x7F) // - 1st ch of multich sequence is negative (0xC0 to 0xFD) // - subsequent multichars are in the range 0x80 to 0xBF int utf8len(ch *utf8string) { int ii, cc; ch xlimit = 0xC0; for (ii = cc = 0; utf8string[ii]; ii++) { if (utf8string[ii] < 0) // multibyte character while (utf8string[ii+1] < xlimit) ii++; // skip extra bytes cc++; } return cc; } /**************************************************************************************/ // Extract a UTF8 substring with a specified count of graphic characters. // utf8in input UTF8 string // utf8out output UTF8 string, which must be long enough // pos initial graphic character position to get (0 = first) // cc max. count of graphic characters to get // returns number of graphic characters extracted, <= cc // Output string is null terminated after last extracted character. int utf8substring(ch *utf8out, ch *utf8in, int pos, int cc) { int ii, jj, kk, posx, ccx; ch xlimit = 0xC0; for (ii = posx = 0; posx < pos && utf8in[ii]; ii++) { if (utf8in[ii] < 0) while (utf8in[ii+1] < xlimit) ii++; posx++; } jj = ii; for (ccx = 0; ccx < cc && utf8in[jj]; jj++) { if (utf8in[jj] < 0) while (utf8in[jj+1] < xlimit) jj++; ccx++; } kk = jj - ii; strncpy(utf8out,utf8in+ii,kk); utf8out[kk] = 0; return ccx; } /**************************************************************************************/ // check a character string for valid utf8 encoding // returns: 0 = OK, 1 = bad string int utf8_check(ch *string) { ch *pp; uch ch1, ch2, nch; for (pp = string; *pp; pp++) { ch1 = *pp; if (ch1 < 0x7F) continue; if (ch1 > 0xBF && ch1 < 0xE0) nch = 1; else if (ch1 < 0xF0) nch = 2; else if (ch1 < 0xF8) nch = 3; else if (ch1 < 0xFC) nch = 4; else if (ch1 < 0xFE) nch = 5; else return 1; while (nch) { pp++; ch2 = *pp; if (ch2 < 0x80 || ch2 > 0xBF) return 1; nch--; } } return 0; } /**************************************************************************************/ // check a character string for valid utf8 encoding // invalid characters are replaced with '?' // returns no. of characters replaced (0 if no errors found) int utf8_clean(ch *string) { int badbytes = 0; ch *pp1, *pp2; uch ch1, ch2, nch; for (pp1 = string; *pp1; pp1++) { ch1 = *pp1; if (ch1 < 0x7F) continue; // ascii, single byte if (ch1 > 0xBF && ch1 < 0xE0) nch = 1; // extra bytes else if (ch1 < 0xF0) nch = 2; else if (ch1 < 0xF8) nch = 3; else if (ch1 < 0xFC) nch = 4; else if (ch1 < 0xFE) nch = 5; else goto fix1; // >5 invalid pp2 = pp1; while (nch) { // check extra bytes pp1++; ch2 = *pp1; if (ch2 < 0x80 || ch2 > 0xBF) goto fix2; // invalid nch--; } continue; fix1: // replace bad byte with '?' *pp1 = '?'; badbytes++; continue; fix2: pp1 = pp2; // back to initial byte *pp1 = '?'; // replace with '?' badbytes++; continue; } return badbytes; } /**************************************************************************************/ // Find the Nth graphic character position within a UTF8 string // utf8in input UTF8 string // Nth graphic character position, zero based // returns starting character (byte) position of Nth graphic character // returns -1 if Nth is beyond the string length int utf8_position(ch *utf8in, int Nth) { int ii, posx; ch xlimit = 0xC0; for (ii = posx = 0; posx < Nth && utf8in[ii]; ii++) { if (utf8in[ii] < 0) // multi-byte character while (utf8in[ii+1] && utf8in[ii+1] < xlimit) ii++; // traverse member bytes posx++; } if (utf8in[ii]) return ii; return -1; } /**************************************************************************************/ // err = zsed(file, string1, string2 ... null) // // replace string1/3/5... with string2/4/6... in designated file // returns N lines changed // -1 file not found // -2 other error (with message) int zsed(ch *infile ...) { int err, ftf, nn; FILE *fid1, *fid2; ch *outfile, *pp; ch buffin[1000], buffout[1000], buffxx[1000]; ch *stringin, *stringout; va_list arglist; fid1 = fopen(infile,"r"); if (! fid1) return -1; outfile = zstrdup(infile,"zsed",8); strcat(outfile,"-temp"); fid2 = fopen(outfile,"w"); if (! fid2) { printf("*** %s \n",strerror(errno)); zfree(outfile); return -2; } nn = 0; while (true) { pp = fgets(buffin,500,fid1); if (! pp) break; va_start(arglist,infile); ftf = 1; while (true) { stringin = va_arg(arglist, ch *); if (! stringin) break; stringout = va_arg(arglist, ch *); if (! stringout) break; if (ftf) { ftf = 0; nn += repl_1str(buffin,buffout,1000,stringin,stringout); } else { strcpy(buffxx,buffout); nn += repl_1str(buffxx,buffout,1000,stringin,stringout); } } va_end(arglist); fputs(buffout,fid2); } fclose(fid1); err = fclose(fid2); if (err) { printf("*** %s \n",strerror(errno)); zfree(outfile); return -2; } rename(outfile,infile); zfree(outfile); return nn; } /**************************************************************************************/ // zstrstr() and zstrcasestr() work like strstr() and strcasestr() // but the needle string "" does NOT match any haystack string. ch * zstrstr(ch *haystack, ch *needle) { if (! needle || ! *needle) return 0; return strstr(haystack,needle); } ch * zstrcasestr(ch *haystack, ch *needle) { if (! needle || ! *needle) return 0; return strcasestr(haystack,needle); } /**************************************************************************************/ // strcpy() with overlap allowed ch * zstrcpy(ch *dest, ch *source) { int cc = strlen(source); memmove(dest,source,cc); dest[cc] = 0; return dest; } // strncpy() with overlap allowed ch * zstrncpy(ch *dest, ch *source, int cc) { memmove(dest,source,cc); return dest; } /**************************************************************************************/ // works like strcmp(), but compare is terminated by \n as well as null int zstrcmp(ch *s1, ch *s2) { ch *p1, *p2; int nn; p1 = (ch *) strchr(s1,'\n'); p2 = (ch *) strchr(s2,'\n'); if (p1) *p1 = 0; if (p2) *p2 = 0; nn = strcmp(s1,s2); if (p1) *p1 = '\n'; if (p2) *p2 = '\n'; return nn; } /**************************************************************************************/ // works like strcmp(), but using char *args instead of const char* int zstrcmp2(ch *s1, ch *s2) { return strcmp((cch *) s1, (cch *) s2); } /**************************************************************************************/ // works like strcasecmp(), but using char *args instead of const char* int zstrcasecmp(ch *s1, ch *s2) { return strcasecmp((cch *) s1, (cch *) s2); } /**************************************************************************************/ // escape quote marks (" and ') in a string, for use in shell commands // returned file is subject for zfree() ch * zescape_quotes(ch *str1) { ch *str2 = 0; int cc; if (strchr(str1,'"') == 0) { str2 = zstrdup(str1,"zescape_quotes"); return str2; } cc = strlen(str1); str2 = (ch *) zmalloc(cc+40,"zescape_quotes"); repl_Nstrs(str1,str2,cc+40,"\"","\\\"","\'","\\\'",null); return str2; } /************************************************************************************** Conversion Utilities convSI(string, inum, delim) string to int convSI(string, inum, low, high, delim) string to int with range check convSD(string, dnum, delim) string to double convSD(string, dnum, low, high, delim) string to double with range check convSF(string, fnum, delim) string to float convSF(string, fnum, low, high, delim) string to float with range check convIS(inum, string, cc) int to string with returned cc convDS(fnum, digits, string, cc) double to string with specified digits of precision and returned cc string input (ch *) or output (ch *) inum input (int) or output (int &) dnum input (double) or output (double &) delim optional returned delimiter (null or ch **) low, high input range check (int or double) cc output string length (int &) digits input digits of precision (int) to be used for output string NOTE: decimal point may be comma or period. 1000's separators must NOT be present. convIS and convDS also return the length cc of the string output. convDS accepts same formats as atof. Decimal point can be comma or period. convDS will use whatever format (f/e) gives the shortest result. Outputs like "e03" or "e+03" will be shortened to "e3". function status returned: 0 normal conversion, no invalid digits, blank/null termination 1 successful conversion, but trailing non-numeric found 2 conversion OK, but outside specified limits 3 null or blank string, converted to zero (obsolete, now status 4) 4 conversion error, invalid data in string overlapping statuses have following precedence: 4 3 2 1 0 ***************************************************************************************/ // Convert string to integer int convSI(ch *string, int &inum, ch **delim) // use glib function { ch *ddelim = 0; int err; inum = strtol(string,&ddelim,10); // convert next characters if (delim) *delim = ddelim; if (ddelim == string) err = 4; // no valid digits else if (*ddelim == '\0') err = 0; // null delimiter else if (*ddelim == ' ') err = 0; // blank delimiter else err = 1; // other delimiter return err; } int convSI(ch *string, int &inum, int lolim, int hilim, ch **delim) { int stat = convSI(string,inum,delim); if (stat > 2) return stat; // invalid or null/blank if (inum < lolim) return 2; // return 2 if out of limits if (inum > hilim) return 2; // (has precedence over status 1) return stat; // limits OK, return 0 or 1 } // Convert string to double *** status 3 --> status 4 *** int convSD(ch *string, double &dnum, ch **delim) // use glib function { ch *ddelim = 0; int err; dnum = strtod(string,&ddelim); if (delim) *delim = ddelim; if (ddelim == string) err = 4; // no valid digits else if (*ddelim == '\0') err = 0; // OK, null delimiter else if (*ddelim == ' ') err = 0; // OK, blank delimiter else err = 1; // OK, other delimiter return err; } int convSD(ch *string, double &dnum, double lolim, double hilim, ch **delim) { int stat = convSD(string,dnum,delim); if (stat > 2) return stat; // invalid or null/blank if (dnum < lolim) return 2; // return 2 if out of limits if (dnum > hilim) return 2; // (has precedence over status 1) return stat; // limits OK, return 0 or 1 } int convSF(ch *string, float &fnum, ch **delim) { double dnum; int err; err = convSD(string,dnum,delim); fnum = dnum; return err; } int convSF(ch *string, float &fnum, float lolim, float hilim, ch **delim) { double dnum, dlolim = lolim, dhilim = hilim; int err; err = convSD(string,dnum,dlolim,dhilim,delim); fnum = dnum; return err; } // Convert int to string with returned length. // (will never exceed 12 characters) int convIS(int inum, ch *string, int *cc) { int ccc; ccc = snprintf(string,12,"%d",inum); if (cc) *cc = ccc; return 0; } // Convert double to string with specified digits of precision. // Shortest length format (f/e) will be used. // Output length is returned in optional argument cc. // (will never exceed 20 characters) int convDS(double dnum, int digits, ch *string, int *cc) // bugfix: use memmove not strcpy { ch *pstr; snprintf(string,20,"%.*g",digits,dnum); pstr = strstr(string,"e+"); // 1.23e+12 > 1.23e12 if (pstr) memmove(pstr+1,pstr+2,strlen(pstr+2)+1); pstr = strstr(string,"e0"); // 1.23e02 > 1.23e2 if (pstr) memmove(pstr+1,pstr+2,strlen(pstr+2)+1); pstr = strstr(string,"e0"); if (pstr) memmove(pstr+1,pstr+2,strlen(pstr+2)+1); pstr = strstr(string,"e-0"); // 1.23e-02 > 1.23e-2 if (pstr) memmove(pstr+2,pstr+3,strlen(pstr+3)+1); pstr = strstr(string,"e-0"); if (pstr) memmove(pstr+2,pstr+3,strlen(pstr+3)+1); if (cc) *cc = strlen(string); return 0; } /**************************************************************************************/ // convert string to double, accepting either '.' or ',' decimal points. // if there is an error, zero is returned. double atofz(ch *string) { ch string2[20], *pp; strncpy(string2,string,20); string2[19] = 0; pp = strchr(string2,','); if (pp) *pp = '.'; return atof(string2); } // format a number as "123 B" or "12.3 KB" or "1.23 MB" etc. // prec is the desired digits of precision to output. // WARNING: only the last 100 conversions remain available in memory. // Example formats for 3 digits of precision: // 123 B, 999 B, 1.23 KB, 98.7 KB, 456 KB, 2.34 MB, 45.6 GB, 1.23 GB ch * formatKBMB(double fnum, int prec) { #define Bkilo 1024 #define Bmega (Bkilo*Bkilo) #define Bgiga (Bkilo*Bkilo*Bkilo) ch *units; static ch *output[100]; static int ftf = 1, ii; double gnum; if (ftf) { // keep last 100 conversions ftf = 0; for (ii = 0; ii < 100; ii++) output[ii] = (ch *) zmalloc(20,"formatKBMB"); } gnum = fabs(fnum); if (gnum > Bgiga) { fnum = fnum / Bgiga; units = "GB"; } else if (gnum > Bmega) { fnum = fnum / Bmega; units = "MB"; } else if (gnum > Bkilo) { fnum = fnum / Bkilo; units = "KB"; } else units = "B "; gnum = fabs(fnum); if (prec == 2 && gnum >= 99.5) prec++; // avoid e+nn formats if (prec == 3 && gnum >= 999.5) prec++; if (prec == 4 && gnum >= 9999.5) prec++; if (prec == 5 && gnum >= 99999.5) prec++; if (prec == 6 && gnum >= 999999.5) prec++; if (++ii > 99) ii = 0; snprintf(output[ii],20,"%.*g %s",prec,fnum,units); return output[ii]; } // Truncate the mantissa of a float number to a given number of bits. // e.g. 10 bits implies a precision of 1/1024 or 0.098 percent. float Fround(float Fin, int bits) // 26.0 { uint Fin2; memcpy((ch *) &Fin2, (ch *) &Fin,4); uint Fin3 = Fin2 >> (23-bits); Fin3 = Fin3 << (23-bits); float Fout; memcpy((ch *) &Fout, (ch *) &Fin3,4); return Fout; } // return true if string is a regular number: ±NN.NNN, null or \n terminated. // leading blanks optional +/- digits with optional point trailing blanks int znumber(ch *digits) // 26.8 { ch *pp; int np = 0, nd = 0, nb = 0; for (pp = digits; *pp == ' '; pp++); // skip leading blanks if (*pp == '+'|| *pp == '-') pp++; // skip leading +/- for ( ; *pp && *pp != '\n'; pp++) // scan remaining chars. { if (*pp == '.') { // found decimal point if (np++ > 0) return 0; // more than 1 if (nb) return 0; // embedded blank continue; } else if (*pp >= '0' && *pp <= '9') { // digit 0-9 nd++; // count if (nb) return 0; // embedded blank continue; } else if (*pp == ' ') { // embedded or trailing blank nb++; continue; } else return 0; // something else } if (! nd) return 0; // no digits return 1; } /************************************************************************************** Wildcard string match Match candidate string to wildcard string containing any number of '*' or '?' wildcard characters. '*' matches any number of characters, including zero characters. '?' matches any one character. Returns 0 if match, 1 if no match. <<---- WATCH OUT ! Benchmark: 0.032 usec. wild = *asdf*qwer?yxc 3.3 GHz Core i5 match = XXXasdfXXXXqwerXyxc ***************************************************************************************/ int MatchWild(ch *pWild, ch *pString) { int ii, star; new_segment: star = 0; while (pWild[0] == '*') { star = 1; pWild++; } test_match: for (ii = 0; pWild[ii] && (pWild[ii] != '*'); ii++) { if (pWild[ii] != pString[ii]) { if (! pString[ii]) return 1; if (pWild[ii] == '?') continue; if (! star) return 1; pString++; goto test_match; } } if (pWild[ii] == '*') { pString += ii; pWild += ii; goto new_segment; } if (! pString[ii]) return 0; if (ii && pWild[ii-1] == '*') return 0; if (! star) return 1; pString++; goto test_match; } /************************************************************************************** Wildcard string match - ignoring case Works like MatchWild() above, but case is ignored. ***/ int MatchWildCase(ch *pWild, ch *pString) { int ii, star; new_segment: star = 0; while (pWild[0] == '*') { star = 1; pWild++; } test_match: for (ii = 0; pWild[ii] && (pWild[ii] != '*'); ii++) { if (! strmatchcaseN(pWild+ii,pString+ii,1)) // the only difference { if (! pString[ii]) return 1; if (pWild[ii] == '?') continue; if (! star) return 1; pString++; goto test_match; } } if (pWild[ii] == '*') { pString += ii; pWild += ii; goto new_segment; } if (! pString[ii]) return 0; if (ii && pWild[ii-1] == '*') return 0; if (! star) return 1; pString++; goto test_match; } /************************************************************************************** SearchWild - wildcard file search Find all files with total /pathname/filename matching a pattern, which may have any number of the wildcard characters '*' and '?' in either or both the pathname and filename. ch * SearchWild(ch *wfilespec, int &flag) inputs: flag = 1 to start a new search flag = 2 abort a running search *** do not modify flag within a search *** wfilespec = filespec to search with optional wildcards e.g. "/name1/na*me2/nam??e3/name4*.ext?" return: a pointer to one matching file is returned per call, or null when there are no more matching files. The search may be aborted before completion, but make a final call with flag = 2 to clean up temp file. A new search with flag = 1 will also finish the cleanup. NOT THREAD SAFE - do not use in parallel threads '#' is used in place of '*' in comments below to prevent the compiler from interpreting /# and #/ as comment delimiters GNU find peculiarities: find /path/# omits "." files find /path/ includes "." files find /path/# recurses folders under /path/ find /path/#.txt does not recurse folders find /path/#/ finds all files under /path/ find /path/#/# finds files >= 1 folder level under /path/ find /path/xxx# never finds anything SearchWild uses simpler rules: '/' and '.' are treated like all other characters and match '#' and '?' no files are excluded except pure folders /path/#.txt finds all xxx.txt files under /path/ at all levels (because #.txt matches aaa.txt, /aaa/bbb.txt, etc.) Benchmark: search path: /usr/# file: #.html 2 strings: #per prop# find 97 files from 209K files in /usr/# first time: 4.6 sec. second time: 1.5 sec. computer: 3.6 GHz core i7 with SSD disk Do not use to search files in /proc/# (causes infinite loop). ***/ ch * SearchWild(ch *wpath, int &uflag) { static FILE *fid = 0; static ch buff[XFCC]; static ch wpath2[XFCC]; static ch command[XFCC]; ch *fcomm = "find \"%s\" -type f 2>/dev/null"; int cc, err; ch *pp, *pp1, *pp2; if ((uflag == 1) || (uflag == 2)) { // first call or stop flag if (fid) pclose(fid); // if file open, close it fid = 0; if (uflag == 2) return 0; // stop flag, done } if (uflag == 1) // first call flag { cc = strlen(wpath); if (cc == 0) return 0; if (cc > XFCC-20) zappcrash("SearchWild: wpath > XFCC"); repl_Nstrs(wpath,wpath2,XFCC,"\"","\\\"","$","\\$",null); // escape " and $ chars. in match pattern pp1 = strchr(wpath2,'*'); // find last wildcard in match pattern pp2 = strchr(wpath2,'?'); pp = 0; if (pp1) { pp = pp1; if (pp2 && pp2 < pp1) pp = pp2; } else if (pp2) pp = pp2; if (pp) *pp = 0; // terminate at first wildcard pp = strrchr(wpath2,'/'); // find last '/' in match pattern if (pp) pp[1] = 0; // terminate after last '/' pp = zescape_quotes(wpath2); snprintf(command,XFCC,fcomm,pp); // result is input to find command zfree(pp); fid = popen(command,"r"); // start find command, get matching files if (! fid) zappcrash(strerror(errno)); uflag = 763568954; // begin search } if (uflag != 763568954) zappcrash("SearchWild, uflag invalid"); while (true) { pp = fgets(buff,XFCC-2,fid); // next matching file if (! pp) { pclose(fid); // no more fid = 0; return 0; } cc = strlen(pp); // get rid of trailing \n pp[cc-1] = 0; err = MatchWild(wpath,pp); // wildcard match? if (err) continue; // no return pp; // return file } } /************************************************************************************** SearchWildCase - wildcard file search - ignoring case Works like SearchWild() above, but case of file name is ignored. Actually, the trailing part of the path name is also case-insensitive, meaning that it is possible to get more matches than technically correct if folders like this are present: /AAA/BBB/.../filename /AAA/bbb/.../filename ***/ ch * SearchWildCase(ch *wpath, int &uflag) { static FILE *fid = 0; static ch buff[XFCC]; static ch wpath2[XFCC]; static ch command[XFCC]; ch *fcomm = "find \"%s\" -type f 2>/dev/null"; int cc, err; ch *pp, *pp1, *pp2; if ((uflag == 1) || (uflag == 2)) { // first call or stop flag if (fid) pclose(fid); // if file open, close it fid = 0; if (uflag == 2) return 0; // stop flag, done } if (uflag == 1) // first call flag { cc = strlen(wpath); if (cc == 0) return 0; if (cc > XFCC-20) zappcrash("SearchWild: wpath > XFCC"); repl_Nstrs(wpath,wpath2,XFCC,"\"","\\\"","$","\\$",null); // escape " and $ chars. in match pattern pp1 = strchr(wpath2,'*'); // find last wildcard in match pattern pp2 = strchr(wpath2,'?'); pp = 0; if (pp1) { pp = pp1; if (pp2 && pp2 < pp1) pp = pp2; } else if (pp2) pp = pp2; if (pp) *pp = 0; // terminate at first wildcard pp = strrchr(wpath2,'/'); // find last '/' in match pattern if (pp) pp[1] = 0; // terminate after last '/' pp = zescape_quotes(wpath2); snprintf(command,XFCC,fcomm,pp); // result is input to find command zfree(pp); fid = popen(command,"r"); // start find command, get matching files if (! fid) zappcrash(strerror(errno)); uflag = 763568954; // begin search } if (uflag != 763568954) zappcrash("SearchWild, uflag invalid"); while (true) { pp = fgets(buff,XFCC-2,fid); // next matching file if (! pp) { pclose(fid); // no more fid = 0; return 0; } cc = strlen(pp); // get rid of trailing \n pp[cc-1] = 0; err = MatchWildCase(wpath,pp); // wildcard match? (ignore case) if (err) continue; // no return pp; // return file } } /************************************************************************************** Find all files matching a given pattern (using glob() rules) int zfind(ch *pattern, ch **&flist, int &NF) pattern pattern to match, with wildcards flist list of files returned NF count of files returned Returns 0 if OK, +N if error (errno is set). flist and flist[*] are subjects for zfree(). zfind() works for files containing quotes (") dotfiles (/. and /..) are not included ***************************************************************************************/ int zfind(ch *pattern, ch **&flist, int &NF) { ch **zfind_filelist = 0; // list of filespecs returned int globflags = GLOB_PERIOD; // include dotfiles int ii, jj, err, cc; glob_t globdata; ch *pp; globdata.gl_pathc = 0; // glob() setup globdata.gl_offs = 0; globdata.gl_pathc = 0; NF = 0; // empty output flist = 0; err = glob(pattern,globflags,null,&globdata); // find all matching files if (err) { if (err == GLOB_NOMATCH) err = 0; else if (err == GLOB_ABORTED) err = 1; else if (err == GLOB_NOSPACE) err = 2; else err = 3; if (err) printf("*** zfind() error: %d \n",err); globfree(&globdata); // free glob memory return err; } NF = globdata.gl_pathc; if (! NF) { globfree(&globdata); return 0; } cc = NF * sizeof(ch *); zfind_filelist = (ch **) zmalloc(cc,"zfind"); for (ii = jj = 0; ii < NF; ii++) { // loop found files pp = strrchr(globdata.gl_pathv[ii],'/'); if (! pp) continue; if (strmatch(pp,"/.")) continue; // skip dotfiles if (strmatch(pp,"/..")) continue; zfind_filelist[jj++] = zstrdup(globdata.gl_pathv[ii],"zfind"); // add file to output list } flist = zfind_filelist; // return file list and count NF = jj; globfree(&globdata); // free glob memory return 0; } /**************************************************************************************/ // perform a binary search on sorted list of integers // return matching element or -1 if not found // Benchmark: search a list of 10 million sorted integers // 0.35 usecs. 3.3 GHz Core i5 int bsearch(int seekint, int nn, int list[]) { int ii, jj, kk, rkk; ii = nn / 2; // next element to search jj = (ii + 1) / 2; // next increment nn--; // last element rkk = 0; while (true) { kk = list[ii] - seekint; // check element if (kk > 0) { ii -= jj; // too high, go down if (ii < 0) return -1; } else if (kk < 0) { ii += jj; // too low, go up if (ii > nn) return -1; } else if (kk == 0) return ii; // matched jj = jj / 2; // reduce increment if (jj == 0) { jj = 1; // step by 1 element if (! rkk) rkk = kk; // save direction else { if (rkk > 0) { if (kk < 0) return -1; } // if change direction, fail else if (kk > 0) return -1; } } } } // Perform a binary search on sorted set of records in memory. // Return matching record number (0 based) or -1 if not found. // Benchmark: search 10 million sorted records of 20 chars. // 0.61 usecs. 3.3 GHz Core i5 int bsearch(ch *seekrec, ch *allrecs, int recl, int nrecs) { int ii, jj, kk, rkk; ii = nrecs / 2; // next element to search jj = (ii + 1) / 2; // next increment nrecs--; // last element rkk = 0; while (true) { kk = strcmp(allrecs+ii*recl,seekrec); // compare member rec to seek rec if (kk > 0) { ii -= jj; // too high, go down in set if (ii < 0) return -1; } else if (kk < 0) { ii += jj; // too low, go up in set if (ii > nrecs) return -1; } else if (kk == 0) return ii; // matched jj = jj / 2; // reduce increment if (jj == 0) { jj = 1; // step by 1 element if (! rkk) rkk = kk; // save direction else { if (rkk > 0) { if (kk < 0) return -1; } // if change direction, fail else if (kk > 0) return -1; } } } } // Perform a binary search on sorted set of pointers to records in memory. // Return matching record number (0 based) or -1 if not found. // The pointers are sorted in the order of the records starting at ch N. // The records need not be sorted. // The string length of seekrec is compared. int bsearch(ch *seekrec, ch **allrecs, int N, int nrecs) { int ii, jj, kk, rkk; ii = nrecs / 2; // next element to search jj = (ii + 1) / 2; // next increment nrecs--; // last element rkk = 0; while (true) { kk = strcmp(allrecs[ii]+N,seekrec); // compare member rec to seek rec if (kk > 0) { ii -= jj; // too high, go down in set if (ii < 0) return -1; } else if (kk < 0) { ii += jj; // too low, go up in set if (ii > nrecs) return -1; } else if (kk == 0) return ii; // matched jj = jj / 2; // reduce increment if (jj == 0) { jj = 1; // step by 1 element if (! rkk) rkk = kk; // save direction else { if (rkk > 0) { if (kk < 0) return -1; } // if change direction, fail else if (kk > 0) return -1; } } } } /************************************************************************************** heap sort functions void HeapSort(int list[], int nn) void HeapSort(float flist[], int nn) void HeapSort(double dlist[], int nn) Sort list of nn integers, floats, or doubles. Numbers are sorted in ascending order. Uses 4 parallel threads for lists > 1000. void HeapSort(ch *plist[], int nn) Pointers are sorted in order of the strings they point to. The strings are not changed. void HeapSort(ch *plist1[], ch *plist2[], int nn) Sort two lists of pointers to two sets of strings. Both lists are sorted in order of the first set of strings. void HeapSort(ch *plist[], int nn, compfunc) Sort list of pointers to strings in user-defined order. Pointers are sorted, strings are not changed. Uses 4 parallel threads for lists > 1000. void HeapSort(ch *recs, int RL, int NR, compfunc) Sort an array of records in memory using a caller-supplied compare function. recs pointer to 1st record in array RL record length NR no. of records int compfunc(ch *rec1, ch *rec2) compare rec1 to rec2, return -1 0 +1 if rec1 < = > rec2 in sort order. Benchmarks (4 GHz Core i5) 100 million integers: 3.9 secs 100 million floats: 5.2 secs 100 million doubles: 6.1 secs 52 million pointers to 20 character strings: 18.2 secs 20 million records of 100 characters: 20.2 secs ***************************************************************************************/ #define SWAP(x,y) (temp = (x), (x) = (y), (y) = temp) // ------------------------------------------------------------------------------ // heapsort for array of integers void adjust(int vv[], int n1, int n2) { int *bb, jj, kk, temp; bb = vv - 1; jj = n1; kk = n1 * 2; while (kk <= n2) { if (kk < n2 && bb[kk] < bb[kk+1]) kk++; if (bb[jj] < bb[kk]) SWAP(bb[jj],bb[kk]); jj = kk; kk *= 2; } } void heapsort(int vv[], int nn) // single thread version { int *bb, jj, temp; for (jj = nn/2; jj > 0; jj--) adjust(vv,jj,nn); bb = vv - 1; for (jj = nn-1; jj > 0; jj--) { SWAP(bb[1], bb[jj+1]); adjust(vv,1,jj); } } namespace HeapSort_int { int nn1, nn2, nn3, nn4; int *vv1, *vv2, *vv3, *vv4; pthread_t tid1, tid2, tid3, tid4; int tt1 = 1, tt2 = 2, tt3 = 3, tt4 = 4; } void HeapSort(int vv[], int nn) // 4-thread version { using namespace HeapSort_int; void * HeapSort_int_thread(void *arg); int *vv9, *next; if (nn < 1000 || get_nprocs() < 2) { // small list or <2 SMPs heapsort(vv,nn); // use one thread return; } nn1 = nn2 = nn3 = nn / 4; // 1st/2nd/3rd sub-list counts nn4 = nn - nn1 - nn2 - nn3; // 4th sub-list count vv1 = vv; // 4 sub-list start positions vv2 = vv1 + nn1; vv3 = vv2 + nn2; vv4 = vv3 + nn3; tid1 = start_Jthread(HeapSort_int_thread,&tt1); // sort the 4 sub-lists, parallel tid2 = start_Jthread(HeapSort_int_thread,&tt2); tid3 = start_Jthread(HeapSort_int_thread,&tt3); tid4 = start_Jthread(HeapSort_int_thread,&tt4); wait_Jthread(tid1); // wait for 4 thread completions wait_Jthread(tid2); wait_Jthread(tid3); wait_Jthread(tid4); vv9 = (int *) malloc(nn * sizeof(int)); // merge list, output list while (true) { next = 0; if (vv1) next = vv1; if (! next && vv2) next = vv2; if (! next && vv3) next = vv3; if (! next && vv4) next = vv4; if (! next) break; if (vv2 && *vv2 < *next) next = vv2; if (vv3 && *vv3 < *next) next = vv3; if (vv4 && *vv4 < *next) next = vv4; if (next == vv1) { vv1++; nn1--; if (! nn1) vv1 = 0; } else if (next == vv2) { vv2++; nn2--; if (! nn2) vv2 = 0; } else if (next == vv3) { vv3++; nn3--; if (! nn3) vv3 = 0; } else { vv4++; nn4--; if (! nn4) vv4 = 0; } *vv9 = *next; vv9++; } vv9 -= nn; memcpy(vv,vv9,nn * sizeof(int)); // copy output list to input list free(vv9); // free output list return; } void * HeapSort_int_thread(void *arg) // thread function { using namespace HeapSort_int; int tt = *((int *) arg); if (tt == 1) heapsort(vv1,nn1); if (tt == 2) heapsort(vv2,nn2); if (tt == 3) heapsort(vv3,nn3); if (tt == 4) heapsort(vv4,nn4); return 0; } // ------------------------------------------------------------------------------ // heapsort for array of floats void adjust(float vv[], int n1, int n2) { float *bb, temp; int jj, kk; bb = vv - 1; jj = n1; kk = n1 * 2; while (kk <= n2) { if (kk < n2 && bb[kk] < bb[kk+1]) kk++; if (bb[jj] < bb[kk]) SWAP(bb[jj],bb[kk]); jj = kk; kk *= 2; } } void heapsort(float vv[], int nn) // single thread version { float *bb, temp; int jj; for (jj = nn/2; jj > 0; jj--) adjust(vv,jj,nn); bb = vv - 1; for (jj = nn-1; jj > 0; jj--) { SWAP(bb[1], bb[jj+1]); adjust(vv,1,jj); } } namespace HeapSort_float { int nn1, nn2, nn3, nn4; float *vv1, *vv2, *vv3, *vv4; pthread_t tid1, tid2, tid3, tid4; int tt1 = 1, tt2 = 2, tt3 = 3, tt4 = 4; } void HeapSort(float vv[], int nn) // 4-thread version { using namespace HeapSort_float; void * HeapSort_float_thread(void *arg); float *vv9, *next; if (nn < 1000 || get_nprocs() < 2) { // small list or <2 SMPs heapsort(vv,nn); // use one thread return; } nn1 = nn2 = nn3 = nn / 4; // 1st/2nd/3rd sub-list counts nn4 = nn - nn1 - nn2 - nn3; // 4th sub-list count vv1 = vv; // 4 sub-list start positions vv2 = vv1 + nn1; vv3 = vv2 + nn2; vv4 = vv3 + nn3; tid1 = start_Jthread(HeapSort_float_thread,&tt1); // sort the 4 sub-lists, parallel tid2 = start_Jthread(HeapSort_float_thread,&tt2); tid3 = start_Jthread(HeapSort_float_thread,&tt3); tid4 = start_Jthread(HeapSort_float_thread,&tt4); wait_Jthread(tid1); // wait for 4 thread completions wait_Jthread(tid2); wait_Jthread(tid3); wait_Jthread(tid4); vv9 = (float *) malloc(nn * sizeof(float)); // merge list, output list while (true) { next = 0; if (vv1) next = vv1; if (! next && vv2) next = vv2; if (! next && vv3) next = vv3; if (! next && vv4) next = vv4; if (! next) break; if (vv2 && *vv2 < *next) next = vv2; if (vv3 && *vv3 < *next) next = vv3; if (vv4 && *vv4 < *next) next = vv4; if (next == vv1) { vv1++; nn1--; if (! nn1) vv1 = 0; } else if (next == vv2) { vv2++; nn2--; if (! nn2) vv2 = 0; } else if (next == vv3) { vv3++; nn3--; if (! nn3) vv3 = 0; } else { vv4++; nn4--; if (! nn4) vv4 = 0; } *vv9 = *next; vv9++; } vv9 -= nn; memcpy(vv,vv9,nn * sizeof(float)); // copy output list to input list free(vv9); // free output list return; } void * HeapSort_float_thread(void *arg) // thread function { using namespace HeapSort_float; int tt = *((int *) arg); if (tt == 1) heapsort(vv1,nn1); if (tt == 2) heapsort(vv2,nn2); if (tt == 3) heapsort(vv3,nn3); if (tt == 4) heapsort(vv4,nn4); return 0; } // ------------------------------------------------------------------------------ // heapsort for array of doubles void adjust(double vv[], int n1, int n2) { double *bb, temp; int jj, kk; bb = vv - 1; jj = n1; kk = n1 * 2; while (kk <= n2) { if (kk < n2 && bb[kk] < bb[kk+1]) kk++; if (bb[jj] < bb[kk]) SWAP(bb[jj],bb[kk]); jj = kk; kk *= 2; } } void heapsort(double vv[], int nn) // single thread version { double *bb, temp; int jj; for (jj = nn/2; jj > 0; jj--) adjust(vv,jj,nn); bb = vv - 1; for (jj = nn-1; jj > 0; jj--) { SWAP(bb[1], bb[jj+1]); adjust(vv,1,jj); } } namespace HeapSort_double { int nn1, nn2, nn3, nn4; double *vv1, *vv2, *vv3, *vv4; pthread_t tid1, tid2, tid3, tid4; int tt1 = 1, tt2 = 2, tt3 = 3, tt4 = 4; } void HeapSort(double vv[], int nn) // 4-thread version { using namespace HeapSort_double; void * HeapSort_double_thread(void *arg); double *vv9, *next; if (nn < 1000 || get_nprocs() < 2) { // small list or <2 SMPs heapsort(vv,nn); // use one thread return; } nn1 = nn2 = nn3 = nn / 4; // 1st/2nd/3rd sub-list counts nn4 = nn - nn1 - nn2 - nn3; // 4th sub-list count vv1 = vv; // 4 sub-list start positions vv2 = vv1 + nn1; vv3 = vv2 + nn2; vv4 = vv3 + nn3; tid1 = start_Jthread(HeapSort_double_thread,&tt1); // sort the 4 sub-lists, parallel tid2 = start_Jthread(HeapSort_double_thread,&tt2); tid3 = start_Jthread(HeapSort_double_thread,&tt3); tid4 = start_Jthread(HeapSort_double_thread,&tt4); wait_Jthread(tid1); // wait for 4 thread completions wait_Jthread(tid2); wait_Jthread(tid3); wait_Jthread(tid4); vv9 = (double *) malloc(nn * sizeof(double)); // merge list, output list while (true) { next = 0; if (vv1) next = vv1; if (! next && vv2) next = vv2; if (! next && vv3) next = vv3; if (! next && vv4) next = vv4; if (! next) break; if (vv2 && *vv2 < *next) next = vv2; if (vv3 && *vv3 < *next) next = vv3; if (vv4 && *vv4 < *next) next = vv4; if (next == vv1) { vv1++; nn1--; if (! nn1) vv1 = 0; } else if (next == vv2) { vv2++; nn2--; if (! nn2) vv2 = 0; } else if (next == vv3) { vv3++; nn3--; if (! nn3) vv3 = 0; } else { vv4++; nn4--; if (! nn4) vv4 = 0; } *vv9 = *next; vv9++; } vv9 -= nn; memcpy(vv,vv9,nn * sizeof(double)); // copy output list to input list free(vv9); // free output list return; } void * HeapSort_double_thread(void *arg) // thread function { using namespace HeapSort_double; int tt = *((int *) arg); if (tt == 1) heapsort(vv1,nn1); if (tt == 2) heapsort(vv2,nn2); if (tt == 3) heapsort(vv3,nn3); if (tt == 4) heapsort(vv4,nn4); return 0; } // ------------------------------------------------------------------------------ // heapsort array of pointers to strings in ascending order of strings // pointers are sorted, strings are not changed. void HeapSort(ch *vv[], int nn) { HeapSort(vv,nn, (HeapSortUcomp *) strcmp); return; } // ------------------------------------------------------------------------------ // Heapsort 2 lists of pointers to 2 parallel sets of strings // in ascending order of the first set of strings. // Both lists of pointers are sorted together in tandem. // Pointers are sorted, strings are not changed. void adjust(ch *vv1[], ch *vv2[], int n1, int n2) { ch **bb1, **bb2, *temp; int jj, kk; bb1 = vv1 - 1; bb2 = vv2 - 1; jj = n1; kk = n1 * 2; while (kk <= n2) { if (kk < n2 && strcmp(bb1[kk],bb1[kk+1]) < 0) kk++; if (strcmp(bb1[jj],bb1[kk]) < 0) { SWAP(bb1[jj],bb1[kk]); SWAP(bb2[jj],bb2[kk]); } jj = kk; kk *= 2; } } void HeapSort(ch *vv1[], ch *vv2[], int nn) { ch **bb1, **bb2, *temp; int jj; for (jj = nn/2; jj > 0; jj--) adjust(vv1,vv2,jj,nn); bb1 = vv1; bb2 = vv2; for (jj = nn-1; jj > 0; jj--) { SWAP(bb1[0], bb1[jj]); SWAP(bb2[0], bb2[jj]); adjust(vv1,vv2,1,jj); } } // ------------------------------------------------------------------------------ // heapsort array of pointers to strings in user-defined order. // pointers are sorted, strings are not changed. void adjust(ch *vv[], int n1, int n2, HeapSortUcomp fcomp) { ch **bb, *temp; int jj, kk; bb = vv - 1; jj = n1; kk = n1 * 2; while (kk <= n2) { if (kk < n2 && fcomp(bb[kk],bb[kk+1]) < 0) kk++; if (fcomp(bb[jj],bb[kk]) < 0) SWAP(bb[jj],bb[kk]); jj = kk; kk *= 2; } } void heapsort(ch *vv[], int nn, HeapSortUcomp fcomp) // single thread version { ch **bb, *temp; int jj; for (jj = nn/2; jj > 0; jj--) adjust(vv,jj,nn,fcomp); bb = vv; for (jj = nn-1; jj > 0; jj--) { SWAP(bb[0], bb[jj]); adjust(vv,1,jj,fcomp); } } namespace HeapSort_string { int nn1, nn2, nn3, nn4; ch **vv1, **vv2, **vv3, **vv4; pthread_t tid1, tid2, tid3, tid4; int tt1 = 1, tt2 = 2, tt3 = 3, tt4 = 4; HeapSortUcomp *ttfcomp; } void HeapSort(ch *vv[], int nn, HeapSortUcomp fcomp) // 4-thread version { using namespace HeapSort_string; void * HeapSort_string_thread(void *arg); ch **vv9, **next; if (nn < 1000 || get_nprocs() < 2) { // small list or <2 SMPs heapsort(vv,nn,fcomp); // use one thread return; } nn1 = nn2 = nn3 = nn / 4; // 1st/2nd/3rd sub-list counts nn4 = nn - nn1 - nn2 - nn3; // 4th sub-list count vv1 = vv; // 4 sub-list start positions vv2 = vv1 + nn1; vv3 = vv2 + nn2; vv4 = vv3 + nn3; ttfcomp = fcomp; tid1 = start_Jthread(HeapSort_string_thread,&tt1); // sort the 4 sub-lists, parallel tid2 = start_Jthread(HeapSort_string_thread,&tt2); tid3 = start_Jthread(HeapSort_string_thread,&tt3); tid4 = start_Jthread(HeapSort_string_thread,&tt4); wait_Jthread(tid1); // wait for 4 thread completions wait_Jthread(tid2); wait_Jthread(tid3); wait_Jthread(tid4); vv9 = (ch **) malloc(nn * sizeof(ch *)); // merge list, output list while (true) { next = 0; if (vv1) next = vv1; if (! next && vv2) next = vv2; if (! next && vv3) next = vv3; if (! next && vv4) next = vv4; if (! next) break; if (vv2 && ttfcomp(*vv2,*next) < 0) next = vv2; if (vv3 && ttfcomp(*vv3,*next) < 0) next = vv3; if (vv4 && ttfcomp(*vv4,*next) < 0) next = vv4; if (next == vv1) { vv1++; nn1--; if (! nn1) vv1 = 0; } else if (next == vv2) { vv2++; nn2--; if (! nn2) vv2 = 0; } else if (next == vv3) { vv3++; nn3--; if (! nn3) vv3 = 0; } else { vv4++; nn4--; if (! nn4) vv4 = 0; } *vv9 = *next; vv9++; } vv9 -= nn; memcpy(vv,vv9,nn * sizeof(ch *)); // copy output list to input list free(vv9); // free output list return; } void * HeapSort_string_thread(void *arg) // thread function { using namespace HeapSort_string; int tt = *((int *) arg); if (tt == 1) heapsort(vv1,nn1,ttfcomp); if (tt == 2) heapsort(vv2,nn2,ttfcomp); if (tt == 3) heapsort(vv3,nn3,ttfcomp); if (tt == 4) heapsort(vv4,nn4,ttfcomp); return 0; } // ------------------------------------------------------------------------------ // heapsort for array of records, // using caller-supplied record compare function. // HeapSortUcomp returns [ -1 0 +1 ] for rec1 [ < = > ] rec2 // method: build array of pointers and sort these, then // use this sorted array to re-order the records at the end. void adjust(ch *recs, int RL, int n1, int n2, int *vv1, HeapSortUcomp fcomp) { int *bb, jj, kk, temp; ch *rec1, *rec2; bb = vv1 - 1; jj = n1; kk = n1 * 2; while (kk <= n2) { rec1 = recs + RL * bb[kk]; rec2 = recs + RL * bb[kk+1]; if (kk < n2 && fcomp(rec1,rec2) < 0) kk++; rec1 = recs + RL * bb[jj]; rec2 = recs + RL * bb[kk]; if (fcomp(rec1,rec2) < 0) SWAP(bb[jj],bb[kk]); jj = kk; kk *= 2; } } void HeapSort(ch *recs, int RL, int NR, HeapSortUcomp fcomp) { int *bb, jj, kk, temp, flag; int *vv1, *vv2; // make reentrant ch *vvrec; vv1 = (int *) malloc((NR+1) * sizeof(int)); for (jj = 0; jj < NR; jj++) vv1[jj] = jj; for (jj = NR/2; jj > 0; jj--) adjust(recs,RL,jj,NR,vv1,fcomp); bb = vv1 - 1; for (jj = NR-1; jj > 0; jj--) { SWAP(bb[1], bb[jj+1]); adjust(recs,RL,1,jj,vv1,fcomp); } vv2 = (int *) malloc((NR+1) * sizeof(int)); for (jj = 0; jj < NR; jj++) vv2[vv1[jj]] = jj; vvrec = (ch *) malloc(RL); flag = 1; while (flag) { flag = 0; for (jj = 0; jj < NR; jj++) { kk = vv2[jj]; if (kk == jj) continue; memmove(vvrec,recs+jj*RL,RL); memmove(recs+jj*RL,recs+kk*RL,RL); memmove(recs+kk*RL,vvrec,RL); SWAP(vv2[jj],vv2[kk]); flag = 1; } } free(vv1); free(vv2); free(vvrec); } /************************************************************************************** int MemSort (ch *RECS, int RL, int NR, int KEYS[][3], int NK) RECS is an array of records, to be sorted in-place. (record length = RL, record count = NR) KEYS[NK][3] is an integer array defined as follows: [N][0] starting position of Nth key field in RECS [N][1] length of Nth key field in RECS [N][2] type of sort for Nth key: 1 = ch ascending 2 = ch descending 3 = int*4 ascending 4 = int*4 descending 5 = float*4 ascending 6 = float*4 descending 7 = float*8 ascending (double) 8 = float*8 descending Benchmark: 10 million recs of 80 bytes with 4 sort keys: 10.8 secs (4 GHz Core i5). ***/ int MemSortComp(ch *rec1, ch *rec2); int MemSortKeys[10][3], MemSortNK; int MemSort(ch *RECS, int RL, int NR, int KEYS[][3], int NK) { int ii; if (NR < 2) return 1; if (NK > 10) zappcrash("MemSort, bad NK"); if (NK < 1) zappcrash("MemSort, bad NK"); MemSortNK = NK; for (ii = 0; ii < NK; ii++) { MemSortKeys[ii][0] = KEYS[ii][0]; MemSortKeys[ii][1] = KEYS[ii][1]; MemSortKeys[ii][2] = KEYS[ii][2]; } HeapSort(RECS,RL,NR,MemSortComp); return 1; } int MemSortComp(ch *rec1, ch *rec2) { int ii, stat, kpos, ktype, kleng; int inum1, inum2; float rnum1, rnum2; double dnum1, dnum2; ch *p1, *p2; for (ii = 0; ii < MemSortNK; ii++) // loop each key { kpos = MemSortKeys[ii][0]; // relative position kleng = MemSortKeys[ii][1]; // length ktype = MemSortKeys[ii][2]; // type p1 = rec1 + kpos; // absolute position p2 = rec2 + kpos; switch (ktype) { case 1: // ch ascending stat = strncmp(p1,p2,kleng); // compare 2 key values if (stat) return stat; // + if rec1 > rec2, - if < break; // 2 keys are equal, check next key case 2: // ch descending stat = strncmp(p1,p2,kleng); if (stat) return -stat; break; case 3: // int ascending memmove(&inum1,p1,4); memmove(&inum2,p2,4); if (inum1 > inum2) return 1; if (inum1 < inum2) return -1; break; case 4: // int descending memmove(&inum1,p1,4); memmove(&inum2,p2,4); if (inum1 > inum2) return -1; if (inum1 < inum2) return 1; break; case 5: // float ascending memmove(&rnum1,p1,4); memmove(&rnum2,p2,4); if (rnum1 > rnum2) return 1; if (rnum1 < rnum2) return -1; break; case 6: // float descending memmove(&rnum1,p1,4); memmove(&rnum2,p2,4); if (rnum1 > rnum2) return -1; if (rnum1 < rnum2) return 1; break; case 7: // double ascending memmove(&dnum1,p1,8); memmove(&dnum2,p2,8); if (dnum1 > dnum2) return 1; if (dnum1 < dnum2) return -1; break; case 8: // double descending memmove(&dnum1,p1,8); memmove(&dnum2,p2,8); if (dnum1 > dnum2) return -1; if (dnum1 < dnum2) return 1; break; default: // key type not 1-8 zappcrash("MemSort, bad KEYS sort type"); } } return 0; // records match on all keys } /**************************************************************************************/ // test if an integer value matches any in a list of values // returns the matching value or zero if nothing matches // list of values must end with zero // zero cannot be one of the values to match int zmember(int testval, int matchval1, ...) { va_list arglist; int matchval; va_start(arglist,matchval1); matchval = matchval1; while (matchval) { if (testval == matchval) break; matchval = va_arg(arglist,int); } va_end(arglist); return matchval; } /************************************************************************************** Hash Table class HashTab(int cc, int cap); constructor ~HashTab(); destructor int Add(ch *string); add a new string int Del(ch *string); delete a string int Find(ch *string); find a string int GetCount() { return count; } get string count int GetNext(int &first, ch *string); get first/next string int Dump(); dump hash table to std. output constructor: cc = string length of table entries, cap = table capacity cap should be set 30% higher than needed to reduce collisions and improve speed Benchmark: 0.056 usec. to find 19 ch string in a table of 100,000 which is 80% full. 3.3 GHz Core i5 ***************************************************************************************/ // static members (robust for tables up to 60% full) int HashTab::tries1 = 100; // Add() tries int HashTab::tries2 = 200; // Find() tries HashTab::HashTab(int _cc, int _cap) // constructor { cc = 4 * (_cc + 4) / 4; // + 1 + mod 4 length cap = _cap; int len = cc * cap; table = new ch [len]; if (! table) zappcrash("HashTab() new %d fail",len,null); memset(table,0,len); } HashTab::~HashTab() // destructor { delete [] table; table = 0; } // Add a new string to table int HashTab::Add(ch *string) { int pos, fpos, tries; pos = strHash(string,cap); // get random position pos = pos * cc; for (tries = 0, fpos = -1; tries < tries1; tries++, pos += cc) // find next free slot at/after position { if (pos >= cap * cc) pos = 0; // last position wraps to 1st if (! table[pos]) // empty slot: string not found { if (fpos != -1) pos = fpos; // use prior deleted slot if there strncpy(table+pos,string,cc); // insert new string table[pos+cc-1] = 0; // insure null terminator return (pos/cc); // return rel. table entry } if (table[pos] == -1) // deleted slot { if (fpos == -1) fpos = pos; // remember 1st one found continue; } if (strmatch(string,table+pos)) return -2; // string already present } return -3; // table full (tries1 exceeded) } // Delete a string from table int HashTab::Del(ch *string) { int pos, tries; pos = strHash(string,cap); // get random position pos = pos * cc; for (tries = 0; tries < tries2; tries++, pos += cc) // search for string at/after position { if (pos >= cap * cc) pos = 0; // last position wraps to 1st if (! table[pos]) return -1; // empty slot, string not found if (strmatch(string,table+pos)) // string found { table[pos] = -1; // delete table entry return (pos/cc); // return rel. table entry } } zappcrash("HashTab::Del() fail",null); // exceed tries2, must not happen return 0; // (table too full to function) } // Find a table entry. int HashTab::Find(ch *string) { int pos, tries; pos = strHash(string,cap); // get random position pos = pos * cc; for (tries = 0; tries < tries2; tries++, pos += cc) // search for string at/after position { if (pos >= cap * cc) pos = 0; // last position wraps to 1st if (! table[pos]) return -1; // empty slot, string not found if (strmatch(string,table+pos)) return (pos/cc); // string found, return rel. entry } zappcrash("HashTab::Find() fail",null); // cannot happen return 0; } // return first or next table entry int HashTab::GetNext(int &ftf, ch *string) { static int pos; if (ftf) // initial call { pos = 0; ftf = 0; } while (pos < (cap * cc)) { if ((table[pos] == 0) || (table[pos] == -1)) // empty or deleted slot { pos += cc; continue; } strcpy(string,table+pos); // return string pos += cc; return 1; } return -4; // EOF } int HashTab::Dump() { int ii, pos; for (ii = 0; ii < cap; ii++) { pos = ii * cc; if (table[pos] && table[pos] != -1) printf("%d, %s \n", ii, table + pos); if (table[pos] == -1) printf("%d, deleted \n", pos); } return 1; } /************************************************************************************** zlist - list processing functions typedef struct { list data type int count; count of member strings ch **mber; member strings, null == no members } zlist_t; zlist_t *zlist; zlist = zlist_new(N) make new zlist with N null members void zlist_free(zlist) delete zlist, free memory void zlist_dump(zlist) dump zlist to stdout N = zlist_count(zlist) get member count (including null entries) string = zlist_get(zlist,Nth) get Nth member void zlist_put(zlist,string,Nth) put Nth member (replace) void zlist_insert(zlist,string,Nth) insert member (count += 1) void zlist_remove(zlist,Nth) remove member (count -= 1) void zlist_clear(zlist_t *zlist, int Nth); clear zlist from Nth member to end void zlist_purge(zlist); purge zlist of null members err = zlist_add(zlist,string,Funiq) add member at first null or append (if unique) err = zlist_append(zlist,string,Funiq) append new member (if unique) err = zlist_prepend(zlist,string,Funiq) prepend new member (if unique) Nth = zlist_find(zlist,string,posn); find next matching zlist member at/after posn Nth = zlist_findwild(zlist,wstring,posn); same as above, but wildcard string match zlist2 = zlist_copy(zlist1) copy zlist zlist3 = zlist_insert_zlist(zlist1,zlist2,Nth) insert zlist2 into zlist1 at Nth posn zlist3 = zlist_remove(zlist1,zlist2) remove all members of zlist2 from zlist1 void zlist_sort(zlist) sort zlist ascending void zlist_sort(zlist,ccfunc) sort zlist using caller compare function err = zlist_to_file(zlist,filename) make file from zlist zlist = zlist_from_file(filename) make zlist from file zlist = zlist_from_folder(foldername) make zlist from file names in folder benchmark: zlist_find(): search speed 0.0016 usec per member for 20 ch. strings ***************************************************************************************/ // create zlist with 'count' empty members zlist_t * zlist_new(int count) { zlist_t *zlist = (zlist_t *) zmalloc(sizeof(zlist_t),"zlist"); zlist->count = count; if (count > 0) zlist->mber = (ch **) zmalloc(count * sizeof(ch *),"zlist"); for (int ii = 0; ii < count; ii++) zlist->mber[ii] = null; return zlist; } // delete a zlist void zlist_free(zlist_t *zlist) { for (int ii = 0; ii < zlist->count; ii++) if (zlist->mber[ii]) zfree(zlist->mber[ii]); if (zlist->mber) zfree(zlist->mber); zlist->count = 0; zfree(zlist); return; } // dump zlist to stdout void zlist_dump(zlist_t *zlist) { printf("count: %d \n",zlist->count); for (int ii = 0; ii < zlist->count; ii++) printf("%5d %s \n",ii,zlist->mber[ii]); printf("\n"); return; } // get zlist member count int zlist_count(zlist_t *zlist) { return zlist->count; } // get a zlist member ch * zlist_get(zlist_t *zlist, int Nth) { if (Nth >= 0 && Nth < zlist->count) return zlist->mber[Nth]; else return null; // 26.0 } // put a zlist member (replace existing) (null allowed) void zlist_put(zlist_t *zlist, ch *string, int Nth) { if (Nth < 0 || Nth >= zlist->count) { printf("zlist_put() invalid Nth: %d \n",Nth); // 26.0 return; } if (zlist->mber[Nth]) zfree(zlist->mber[Nth]); if (string) zlist->mber[Nth] = zstrdup(string,"zlist"); else zlist->mber[Nth] = 0; return; } // insert new zlist member (count increases) // new member is Nth member, old Nth member is Nth+1 // if Nth > last + 1, null members are added in-between void zlist_insert(zlist_t *zlist, ch *string, int Nth) { int count, newcount; int ii1, ii2, cc; ch **newmber; if (Nth < 0) zappcrash("zlist_insert() invalid Nth: %d",Nth); count = zlist->count; if (Nth < count) newcount = count + 1; else newcount = Nth + 1; newmber = (ch **) zmalloc(newcount * sizeof(ch *),"zlist"); if (Nth > 0) { // copy 0 - Nth-1 ii1 = 0; ii2 = Nth; if (Nth > count) ii2 = count; cc = (ii2 - ii1) * sizeof(ch *); memcpy(newmber,zlist->mber,cc); } newmber[Nth] = zstrdup(string,"zlist"); // insert Nth if (Nth < count) { // copy Nth - last ii1 = Nth; ii2 = count; cc = (ii2 - ii1) * sizeof(ch *); memcpy(newmber+ii1+1,zlist->mber+ii1,cc); } if (zlist->mber) zfree(zlist->mber); zlist->mber = newmber; zlist->count = newcount; return; } // remove a zlist member (count -= 1) void zlist_remove(zlist_t *zlist, int Nth) { int newcount, cc; ch **newmber; if (Nth < 0 || Nth >= zlist->count) zappcrash("zlist_remove() invalid Nth: %d",Nth); newcount = zlist->count - 1; if (newcount) newmber = (ch **) zmalloc(newcount * sizeof(ch *),"zlist"); else newmber = 0; if (Nth > 0) { // copy 0 - Nth-1 cc = Nth * sizeof(ch *); memcpy(newmber,zlist->mber,cc); } if (zlist->mber[Nth]) zfree(zlist->mber[Nth]); // remove Nth if (Nth < newcount) { // copy Nth+1 - last cc = (newcount - Nth) * sizeof(ch *); memcpy(newmber+Nth,zlist->mber+Nth+1,cc); } zfree(zlist->mber); zlist->mber = newmber; zlist->count = newcount; return; } // clear zlist members from Nth to end void zlist_clear(zlist_t *zlist, int Nth) { int ii; ch **mber = 0; if (Nth >= zlist_count(zlist)) return; if (Nth > 0) mber = (ch **) zmalloc(Nth * sizeof(ch *),"zlist"); // remaining members for (ii = 0; ii < Nth; ii++) // copy remaining members mber[ii] = zlist->mber[ii]; for (ii = Nth; ii < zlist_count(zlist); ii++) // free deleted members zfree(zlist->mber[ii]); zfree(zlist->mber); zlist->mber = mber; // null if empty list zlist->count = Nth; return; } // purge zlist of all null members and reset count void zlist_purge(zlist_t *zlist) { int ii, jj; ch **mber; for (ii = jj = 0; ii < zlist->count; ii++) if (zlist->mber[ii]) jj++; if (jj) mber = (ch **) zmalloc(jj * sizeof(ch *),"zlist"); else mber = 0; for (ii = jj = 0; ii < zlist->count; ii++) { if (zlist->mber[ii]) { mber[jj] = zlist->mber[ii]; jj++; } } zlist->count = jj; zfree(zlist->mber); zlist->mber = mber; return; } // add new member at first null position, or append (if unique) // return 0 if OK, 1 if not unique int zlist_add(zlist_t *zlist, ch *string, int Funiq) { int ii; if (Funiq && zlist_find(zlist,string,0) >= 0) return 1; for (ii = 0; ii < zlist->count; ii++) if (! zlist->mber[ii]) break; if (ii < zlist->count) { zlist->mber[ii] = zstrdup(string,"zlist"); return 0; } return zlist_append(zlist,string,Funiq); } // append new member at end (if unique) // return 0 if OK, 1 if not unique int zlist_append(zlist_t *zlist, ch *string, int Funiq) { if (Funiq && zlist_find(zlist,string,0) >= 0) return 1; zlist_insert(zlist,string,zlist->count); return 0; } // prepend new member at posn 0 (if unique) // return 0 if OK, 1 if not unique int zlist_prepend(zlist_t *zlist, ch *string, int Funiq) { if (Funiq && zlist_find(zlist,string,0) >= 0) return 1; zlist_insert(zlist,string,0); return 0; } // find next matching zlist member at/from given posn int zlist_find(zlist_t *zlist, ch *string, int posn) { if (posn < 0 || posn >= zlist->count) return -1; for (int ii = posn; ii < zlist->count; ii++) { if (zlist->mber[ii]) if (strmatch(string,zlist->mber[ii])) return ii; } return -1; } // find next matching zlist member at/from given posn (wildcard match) int zlist_findwild(zlist_t *zlist, ch *wstring, int posn) { if (posn < 0 || posn >= zlist->count) return -1; for (int ii = posn; ii < zlist->count; ii++) { if (zlist->mber[ii]) if (MatchWild(wstring,zlist->mber[ii]) == 0) return ii; } return -1; } // copy a zlist zlist_t * zlist_copy(zlist_t *zlist1) { zlist_t *zlist2 = zlist_new(zlist1->count); for (int ii = 0; ii < zlist2->count; ii++) if (zlist1->mber[ii]) zlist2->mber[ii] = zstrdup(zlist1->mber[ii],"zlist"); return zlist2; } // insert zlist2 into zlist1 at Nth position // use Nth = -1 to insert at the end (append) zlist_t * zlist_insert_zlist(zlist_t *zlist1, zlist_t *zlist2, int Nth) { int ii; int nn1 = zlist1->count; // zlist to receive int nn2 = zlist2->count; // zlist to insert int nn3 = nn1 + nn2; // output zlist if (Nth < 0) Nth = nn1; // append to end of zlist1 if (Nth > nn1) nn3 = Nth + nn2; // append with missing members in-between zlist_t *zlist3 = zlist_new(nn3); for (ii = 0; ii < Nth; ii++) // 0 to Nth-1 if (ii < nn1 && zlist1->mber[ii]) zlist3->mber[ii] = zstrdup(zlist1->mber[ii],"zlist"); for (ii = Nth; ii < Nth + nn2; ii++) // Nth to Nth + nn2-1 if (zlist2->mber[ii-Nth]) zlist3->mber[ii] = zstrdup(zlist2->mber[ii-Nth],"zlist"); for (ii = Nth + nn2; ii < nn3; ii++) // Nth + nn2 to nn3-1 if (ii-nn2 < nn1 && zlist1->mber[ii-nn2]) zlist3->mber[ii] = zstrdup(zlist1->mber[ii-nn2],"zlist"); return zlist3; } // remove all members of zlist2 from zlist1 zlist_t * zlist_remove(zlist_t *zlist1, zlist_t *zlist2) { int ii, jj; int nn2 = zlist2->count; zlist_t *zlist3 = zlist_copy(zlist1); // copy input zlist for (ii = 0; ii < nn2; ii++) { jj = zlist_find(zlist3,zlist_get(zlist2,ii),0); // find zlist2 member in zlist3 if (jj >= 0) zlist_put(zlist3,null,jj); // if found, replace with null } zlist_purge(zlist3); // purge null entries return zlist3; } // sort zlist ascending void zlist_sort(zlist_t *zlist) { HeapSort(zlist->mber,zlist->count); return; } // sort zlist via caller compare function void zlist_sort(zlist_t *zlist, int ccfunc(ch *, ch *)) { HeapSort(zlist->mber,zlist->count,ccfunc); return; } // make file from zlist int zlist_to_file(zlist_t *zlist, ch *filename) { int ii, err; FILE *fid = fopen(filename,"w"); if (! fid) return errno; for (ii = 0; ii < zlist->count; ii++) if (zlist->mber[ii]) fprintf(fid,"%s\n",zlist->mber[ii]); err = fclose(fid); if (err) return errno; else return 0; } // make zlist from file // performance with SSD: over 100 MB/sec. zlist_t * zlist_from_file(ch *filename) { FILE *fid; zlist_t *zlist; int ii, count = 0; ch *pp, buff[5000]; fid = fopen(filename,"r"); // count recs in file if (! fid) return 0; // this adds 40% to elapsed time while (true) { pp = fgets(buff,5000,fid); if (! pp) break; count++; } fclose(fid); fid = fopen(filename,"r"); if (! fid) return 0; zlist = zlist_new(count); // create zlist for (ii = 0; ii < count; ii++) { pp = fgets_trim(buff,5000,fid); if (! pp) break; zlist->mber[ii] = zstrdup(buff,"zlist"); } fclose(fid); return zlist; } // create a zlist from all file names in a folder // list members are file names without folder zlist_t * zlist_from_folder(ch *folder) // 25.1 { ch findcomm[1000]; ch *pp, **flist; int ii, NF; zlist_t *zlist; snprintf(findcomm,1000,"%s/*",folder); // find all files in folder zfind(findcomm,flist,NF); if (! NF) return 0; zlist = zlist_new(NF); for (ii = 0; ii < NF; ii++) { // make zlist of file root names pp = strrchr(flist[ii],'/'); if (! pp) pp = flist[ii]; else pp++; zlist_put(zlist,pp,ii); zfree(flist[ii]); } zfree(flist); zlist_sort(zlist); // sort zlist return zlist; } /**************************************************************************************/ // Random number generators with explicit context // and improved randomness over a small series. // Benchmark: lrandz 0.012 usec drandz 0.014 usec 3.3 GHz Core i5 // (srand() % range) is much slower. int lrandz(int64 *seed) // returns 0 to 0x7fffffff { *seed = *seed ^ (*seed << 17); *seed = *seed ^ (*seed << 20); return nrand48((unsigned int16 *) seed); } int lrandz() // implicit seed, repeatable sequence { static int64 seed = 12345678; return lrandz(&seed); } double drandz(int64 *seed) // returns 0.0 to 0.99999... { *seed = *seed ^ (*seed << 17); *seed = *seed ^ (*seed << 20); return erand48((unsigned int16 *) seed); } double drandz() // automatic volatile seed { static int64 seed = get_seconds(); // nanosecond resolution return drandz(&seed); } /************************************************************************************** spline1: define a curve using a set of data points (x and y values) spline2: for a given x-value, return a y-value fitting the curve For spline1, the no. of curve-defining points must be < 100. For spline2, the given x-value must be within the range defined in spline1. The algorithm was taken from the book "Numerical Recipes" (Cambridge University Press) and converted from Fortran to C++. ***/ namespace splinedata { int nn; float px1[100], py1[100], py2[100]; } void spline1(int dnn, float *dx1, float *dy1) { using namespace splinedata; float sig, p, u[100]; int ii; nn = dnn; if (nn > 100) zappcrash("spline1(), > 100 data points"); for (ii = 0; ii < nn; ii++) { px1[ii] = dx1[ii]; py1[ii] = dy1[ii]; if (ii && px1[ii] <= px1[ii-1]) zappcrash("spline1(), x-value not increasing"); } py2[0] = u[0] = 0; for (ii = 1; ii < nn-1; ii++) { sig = (px1[ii] - px1[ii-1]) / (px1[ii+1] - px1[ii-1]); p = sig * py2[ii-1] + 2; py2[ii] = (sig - 1) / p; u[ii] = (6 * ((py1[ii+1] - py1[ii]) / (px1[ii+1] - px1[ii]) - (py1[ii] - py1[ii-1]) / (px1[ii] - px1[ii-1])) / (px1[ii+1] - px1[ii-1]) - sig * u[ii-1]) / p; } py2[nn-1] = 0; for (ii = nn-2; ii >= 0; ii--) py2[ii] = py2[ii] * py2[ii+1] + u[ii]; return; } float spline2(float x) { using namespace splinedata; int kk, klo = 0, khi = nn-1; float h, a, b, y; while (khi - klo > 1) { kk = (khi + klo) / 2; if (px1[kk] > x) khi = kk; else klo = kk; } h = px1[khi] - px1[klo]; a = (px1[khi] - x) / h; b = (x - px1[klo]) / h; y = a * py1[klo] + b * py1[khi] + ((a*a*a - a) * py2[klo] + (b*b*b - b) * py2[khi]) * (h*h) / 6; return y; } /**************************************************************************************/ // Add text strings to a FIFO queue, retrieve text strings. // Can be used by one or two threads. // thread 1: open queue, get strings, close queue. // thread 2: put strings into queue. // create and initialize Qtext queue, empty status void Qtext_open(Qtext *qtext, int cap) { int cc; qtext->qcap = cap; qtext->qnewest = -1; qtext->qoldest = -1; qtext->qdone = 0; cc = cap * sizeof(ch *); qtext->qtext = (ch **) zmalloc(cc,"qtext"); memset(qtext->qtext,0,cc); return; } // add new text string to Qtext queue // if queue full, sleep until space is available void Qtext_put(Qtext *qtext, ch *format, ...) { int qnext; va_list arglist; ch message[200]; va_start(arglist,format); vsnprintf(message,199,format,arglist); va_end(arglist); qnext = qtext->qnewest + 1; if (qnext == qtext->qcap) qnext = 0; while (qtext->qtext[qnext]) zsleep(0.01); qtext->qtext[qnext] = zstrdup(message,"Qtext"); qtext->qnewest = qnext; return; } // remove oldest text string from Qtext queue // if queue empty, return a null string // returned string is subject for zfree() ch * Qtext_get(Qtext *qtext) { int qnext; ch *text; if (qtext->qcap == 0) return 0; qnext = qtext->qoldest + 1; if (qnext == qtext->qcap) qnext = 0; text = qtext->qtext[qnext]; if (! text) return 0; qtext->qtext[qnext] = 0; qtext->qoldest = qnext; return text; } // close Qtext, zfree() any leftover strings void Qtext_close(Qtext *qtext) { for (int ii = 0; ii < qtext->qcap; ii++) if (qtext->qtext[ii]) zfree(qtext->qtext[ii]); zfree(qtext->qtext); qtext->qcap = 0; return; } /**************************************************************************************/ // compute variance for a list of numbers // std. deviation = sqrtf(variance) float variance(float *vals, int N) { float mean1, mean2, variance; int ii; if (N == 0) return 0; mean1 = mean2 = 0; for (ii = 0; ii < N; ii++) { mean1 += vals[ii]; mean2 += vals[ii] * vals[ii]; } mean1 = mean1 / N; mean2 = mean2 / N; variance = fabsf(mean2 - mean1 * mean1); return variance; } /************************************************************************************** Initialize application files according to following conventions: // new version + binary executable is at: /prefix/bin/appname // = PREFIX/bin/appname + other application folders are derived as follows: /prefix/share/appname/data/ desktop, parameters, translations ... /prefix/share/doc/appname/ README, changelog, appname.man ... /prefix/share/appname/icons/ application icon files, filename.png /prefix/share/appname/images/ application image files /home/user/.appname/ some installation files are copied here /home/user/.appname/appname-N.N.log log file with error messages zprefix install location /usr or /usr/local zdatadir installed data files /prefix/share/appname/data/ zimagedir installed image files /prefix/share/appname/images/ zdocdir documentation files /prefix/share/doc/appname/ zhomedir local app files /home//.appname/ If it does not already exist, an application folder for the current user is created at /home/username/.appname (following common Linux convention). If this folder was created for the first time, copy specified files (following the 1st argument) from the install folder into the newly created user-specific folder. The assumption is that all initial data files for the application (e.g. parameters) will be in the install data folder, and these are copied to the user folder where the user or application can modify them. If the running program is not connected to a terminal device, stdout and stderr are redirected to the log file at /home/user/.appname/appname-N.N.log ***/ ch * get_zprefix() { return zfuncs::zprefix; } // /usr or /usr/local ch * get_zhomedir() { return zfuncs::zhomedir; } // /home//.appname ch * get_zdatadir() { return zfuncs::zdatadir; } // data files ch * get_zdocdir() { return zfuncs::zdocdir; } // documentation files ch * get_zimagedir() { return zfuncs::zimagedir; } // image files int zinitapp(ch *appvers, int argc, ch *argv[]) // appname-N.N { ch buff[300]; ch LNhomedir[200]; ch username[140]; ch cssfile[200]; ch *pp, *ch_time; int ii, cc, err, size; time_t startime; STATB statB; FILE *fid; if (! getcwd(null,0)) exit(1); // die if curr. directory invalid 26.61 startime = time(null); // app start time, secs. since 1970 catch_signals(); // catch signals, do backtrace printf("command: "); for (ii = 0; ii < argc; ii++) printf("%s ",argv[ii]); // log command line printf("\n"); setpgid(0,0); // make a new process group pp = setlocale(LC_NUMERIC,"C"); // stop comma decimal points strncpy0(zappvers,appvers,40); // appname-N.N printf("%s \n",zappvers); strncpy0(zappname,appvers,40); // appname without version pp = strchr(zappname,'-'); if (pp && pp[1] > '9') pp = strchr(pp+1,'-'); // bypass '-' in appname if (pp) *pp = 0; if (argc > 1 && strmatchV(argv[1],"-ver","-v",null)) exit(0); // exit if nothing else wanted progexe = 0; cc = readlink("/proc/self/exe",buff,300); // get my executable program path if (cc <= 0) zexit(1,"readlink() /proc/self/exe) failed"); buff[cc] = 0; // readlink() quirk progexe = zstrdup(buff,"zinitapp"); printf("program exe: %s \n",progexe); // executable path strncpy0(zprefix,progexe,200); pp = strstr(zprefix,"/bin/"); // get install prefix (e.g. /usr) if (pp) *pp = 0; else (strcpy(zprefix,"/usr")); // if /xxxxx/bin --> /xxxxx strncatv(zdatadir,199,zprefix,"/share/",zappname,"/data",null); // /prefix/share/appname/data strncatv(zimagedir,199,zprefix,"/share/",zappname,"/images",null); // /prefix/share/appname/images strncatv(zdocdir,199,zprefix,"/share/doc/",zappname,null); // /prefix/share/doc/appname ch_time = zstrdup(build_date_time,"zinitapp"); if (ch_time[4] == ' ') ch_time[4] = '0'; // replace month day ' d' with '0d' printf("build date/time: %s \n",ch_time); strncpy0(username,getenv("USER"),140); // get user name if (strlen(username) > 138) zexit(1,"username too big"); // insure derived folders <200 ch. *zhomedir = 0; // app home dir if (argc > 2 && strmatch(argv[1],"-home") && *argv[2] == '/') // get appname home folder from caller strncpy0(zhomedir,argv[2],200); // (any user-owned folder) if (! *zhomedir) { snprintf(LNhomedir,200,"%s/.%s-home",getenv("HOME"),zappname); // check $HOME/.appname-home fid = fopen(LNhomedir,"r"); if (fid) { pp = fgets_trim(LNhomedir,200,fid); // if found, read pointer to home folder if (pp) strncpy0(zhomedir,pp,200); // (can be any user-owned folder) fclose(fid); } } if (! *zhomedir) snprintf(zhomedir,200,"%s/.%s",getenv("HOME"),zappname); // use $HOME/.appname/ (default) printf("%s home folder: %s \n",zappname,zhomedir); if (strchr(zhomedir,' ')) zexit(1,"home folder name contains a space"); // forbid space or quote in home folder if (strchr(zhomedir,'"')) zexit(1,"home folder name contains a quote"); if (strchr(zhomedir,'\'')) zexit(1,"home folder name contains a quote"); err = stat(zhomedir,&statB); // home folder exists already? if (err) { err = mkdir(zhomedir,0750); // no, create if (err) zexit(1,"cannot create %s: \n %s",zhomedir,strerror(errno)); } snprintf(logfile,199,"%s/%s.log",zhomedir,zappvers); // /home//appname-N.N.log printf("log file: %s \n",logfile); err = stat(logfile,&statB); // start new log file if >50 kb 25.1 if (! err) { size = statB.st_size; if (size > 50000) remove(logfile); } if (! isatty(fileno(stdin))) { // not attached to a terminal fid = freopen(logfile,"a",stdout); // redirect stdout/stderr to log file fid = freopen(logfile,"a",stderr); if (! fid) printf("*** cannot redirect stdout and stderr \n"); } printf("-------------------------------------------\n"); // log file separator ch_time = ctime(&startime); // start time: Ddd Mmm dd hh:mm:ss.nn ch_time[19] = 0; // eliminate hundredths of seconds if (ch_time[8] == ' ') ch_time[8] = '0'; // replace ' d' with '0d' printf("start %s %s \n",zappname,ch_time); fflush(0); tid_main = pthread_self(); // thread ID of main() process // GTK initialization setenv("GDK_BACKEND","x11",0); // needed by Fedora (11/2023) setenv("GTK_THEME","default",0); // " " if (! gtk_init_check(0,null)) zexit(1,"gtk_init_check() failed"); setlocale(LC_NUMERIC,"C"); // NECESSARY: GTK changes locale int v1 = gtk_get_major_version(); // get GTK release version int v2 = gtk_get_minor_version(); int v3 = gtk_get_micro_version(); printf("GTK version: %d.%02d.%02d \n",v1,v2,v3); display = gdk_display_get_default(); // get hardware info screen = gdk_screen_get_default(); GdkRectangle rect; GdkMonitor *monitor; monitor = gdk_display_get_primary_monitor(display); gdk_monitor_get_geometry(monitor,&rect); monitor_ww = rect.width; monitor_hh = rect.height; if (! monitor_ww) zexit(1,"GTK cannot get monitor data"); GdkSeat *gdkseat = 0; // screen / KB / pointer associations if (screen) gdkseat = gdk_display_get_default_seat(display); // Ubuntu 16.10 if (screen) gtksettings = gtk_settings_get_for_screen(screen); if (gdkseat) mouse = gdk_seat_get_pointer(gdkseat); if (! mouse) zexit(1,"GTK cannot get pointer device"); if (gtksettings) { // get default font g_object_get(gtksettings,"gtk_font_name",&appfont,null); zsetfont(appfont); // set mono and bold versions } // widget style changes if widgets.css file is present snprintf(cssfile,200,"%s/widgets.css",get_zhomedir()); err = stat(cssfile,&statB); if (! err) { GtkStyleProvider *provider = (GtkStyleProvider *) gtk_css_provider_new(); gtk_style_context_add_provider_for_screen(zfuncs::screen,provider,999); gtk_css_provider_load_from_path(GTK_CSS_PROVIDER(provider),cssfile,0); } return 1; } // copy application files from install folder /.../appname/data/* // to app home folder /home//.appname/* // this is done only if a new release is being installed void zinitappfiles(int Fnewvers) // new 26.0 { STATB statB; ch *zdatadir = get_zdatadir(); ch *zhomedir = get_zhomedir(); int err = stat(zdatadir,&statB); if (err) return; if (Fnewvers) // 26.5 zshell("log","cp -R --backup=simple --preserve=timestamps %s/* %s",zdatadir,zhomedir); // make backups, copy all files else zshell("log","cp -R --update=none --preserve=timestamps %s/* %s",zdatadir,zhomedir); // copy only missing files return; } /**************************************************************************************/ // popup window with application 'about' information void zabout(GtkWidget *parent) { int zabout_dialog_event(zdialog *zd, ch *event); zdialog *zd; int cc; ch installed_release[80]; ch title[40]; ch *execfile; /*** __________________________________________________ | About Appname | | | | installed release: appname-N.N Mon dd yyyy | // 'query release' removed | executable: xxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | publisher: Michael Cornelison | | contact: mkornelix@gmail.com | |__________________________________________________| ***/ execfile = progexe; snprintf(installed_release,80,"%s %s",zappvers,build_date_time); // appname-N.N Mon dd yyyy hh:mm:ss cc = strlen(installed_release); installed_release[cc-9] = 0; // remove hh:mm:ss if (installed_release[cc-16] == ' ') installed_release[cc-16] = '0'; // replace "Jan 1" with "Jan 01" snprintf(title,40,"About %s",zappname); zd = zdialog_new(title,parent,null); zdialog_add_widget(zd,"hbox","hbirel","dialog"); zdialog_add_widget(zd,"label","labir1","hbirel","installed release:","space=3"); zdialog_add_widget(zd,"label","labir2","hbirel",installed_release); zdialog_add_widget(zd,"hbox","hbexe","dialog"); zdialog_add_widget(zd,"label","labexe1","hbexe","executable:","space=3"); zdialog_add_widget(zd,"label","labexe2","hbexe",execfile); zdialog_add_widget(zd,"hbox","hbpub","dialog"); zdialog_add_widget(zd,"label","labpub","hbpub","publisher: Michael Cornelison","space=3"); zdialog_add_widget(zd,"hbox","hbcontact","dialog"); zdialog_add_widget(zd,"label","labcontact","hbcontact","contact: mkornelix@gmail.com","space=3"); zdialog_run(zd,zabout_dialog_event,"parent"); return; } // dialog event and completion function int zabout_dialog_event(zdialog *zd, ch *event) { if (zd->zstat) zdialog_free(zd); return 1; } /**************************************************************************************/ // set a new application font via GtkSettings // newfont should be something like "free sans 11" // use generic monospace font since app font may not have a mono version void zsetfont(ch *newfont) { ch font[80], bfont[88], mfont[88], mbfont[100]; ch *pp; int size; if (! gtksettings) return; strncpy0(font,newfont,80); // more robuse font parsing 25.1 pp = font + strlen(font); while (*pp < ' ') pp--; // skip poss. trailing blanks 26.3 while (*pp >= '0' && *pp <= '9') pp--; // skip over font size digits size = atoi(pp); // get font size if (size < 6 || size > 14) { printf("font size %d is not reasonable",size); size = 10; } else *pp = 0; // font name without size g_object_set(gtksettings,"gtk-font-name",newfont,null); // set dialog font snprintf(bfont,48,"%s bold %d",font,size); // "free sans 11 bold" snprintf(mfont,48,"mono %d",size-1); // "mono 10" snprintf(mbfont,56,"mono bold %d",size-1); // "mono bold 10" appfont = zstrdup(newfont,"zsetfont"); appboldfont = zstrdup(bfont,"zsetfont"); appmonofont = zstrdup(mfont,"zsetfont"); appmonoboldfont = zstrdup(mbfont,"zsetfont"); appfontsize = size; return; } /**************************************************************************************/ // get the font character width and height for a given widget // returns 0 if OK, +N if error int widget_font_metrics(GtkWidget *widget, int &fontwidth, int &fontheight) { PangoContext *pangocontext; PangoFontDescription *pangofontdesc; PangoFontMetrics *pangofontmetrics; PangoLanguage *pangolanguage; pangocontext = gtk_widget_get_pango_context(widget); pangofontdesc = pango_context_get_font_description(pangocontext); pangolanguage = pango_language_get_default(); pangofontmetrics = pango_context_get_metrics(pangocontext,pangofontdesc,pangolanguage); if (! pangofontmetrics) { printf("*** widget_font_metrics() failed \n"); return 1; } fontwidth = pango_font_metrics_get_approximate_char_width(pangofontmetrics); fontheight = pango_font_metrics_get_ascent(pangofontmetrics) + pango_font_metrics_get_descent(pangofontmetrics); fontwidth /= PANGO_SCALE; fontheight /= PANGO_SCALE; return 0; } /**************************************************************************************/ // Find installation file or user file. // file type: doc, data, user // file name: README, changelog, ug-xx, parameters ... // Returns complete file name, e.g. /usr/share/appname/data/translations/ug_xx // Output filespec should be 200 bytes (limit for all installation files). // Returns 0 if OK, +N if not found. int get_zfilespec(ch *filetype, ch *filename, ch *filespec) { int cc, err; STATB statB; filespec[0] = '/'; strcat(filespec,filetype); // leave /type as default if (strmatch(filetype,"doc")) strcpy(filespec,zdocdir); // /usr/share/doc/appname if (strmatch(filetype,"data")) strcpy(filespec,zdatadir); // /usr/share/appname/data if (strmatch(filetype,"user")) strcpy(filespec,zhomedir); // /home//.appname cc = strlen(filespec); filespec[cc] = '/'; // /folders.../ strcpy(filespec+cc+1,filename); // /folders.../filename err = stat(filespec,&statB); if (! err) return 0; // found if (! strmatch(filetype,"doc")) return 1; // doc files may be in strcpy(filespec,zdocdir); // /usr/share/doc/appname/extras strcat(filespec,"/extras/"); // due to Linux chaos cc = strlen(filespec); strcpy(filespec+cc,filename); err = stat(filespec,&statB); if (! err) return 0; // found return 1; // not found } /**************************************************************************************/ // display application log file in a popup window // The log file is /home//.appname/logfile void showz_logfile(GtkWidget *parent) { ch buff[200]; fflush(0); snprintf(buff,199,"cat %s",logfile); popup_command(buff,800,600,parent); return; } /**************************************************************************************/ // find and show a text file in /usr/share/doc/appname/ // or /usr/share/appname/data // the text file may also be a compressed .gz file // type is "doc" or "data" void showz_textfile(ch *type, ch *file, GtkWidget *parent) { ch filex[40], filespec[200], command[200]; int err; if (! main_thread()) zappcrash("illegal call from thread"); strncpy0(filex,file,36); // look for gzip file first strcat(filex,".gz"); err = get_zfilespec(type,filex,filespec); if (! err) { snprintf(command,200,"zcat \"%s\"",filespec); // use quotes around filename popup_command(command,700,500,parent,1); return; } strncpy0(filex,file,35); // look also for bzip2 file strcat(filex,".bz2"); err = get_zfilespec(type,filex,filespec); if (! err) { snprintf(command,200,"bzcat \"%s\"",filespec); popup_command(command,700,500,parent,1); return; } strncpy0(filex,file,36); // look for uncompressed file err = get_zfilespec(type,filex,filespec); if (! err) { snprintf(command,200,"cat \"%s\"",filespec); popup_command(command,700,500,parent,1); return; } zmessageACK(mainwin,TX("file not found: %s %s"),type,file); return; } /************************************************************************************** void showz_docfile(GtkWidget *parent, ch *docfile, ch *topic) Show docfile in popup scrolling text window with 'topic' at the top. docfile is located in data folder: get_zdatadir() images are located in image folder: get_zimagedir() docfile format: TOPIC: TOPIC 1 topic: bold text text text text text text text text text text text text ... topic text TOPIC: TOPIC 2 +image: file1.png +image: file2.jpg embedded images text text text text text text text text {TOPIC 1} text text ... link to topic, bold ^bold subtopic line^ subtopic, bold text text text text text ^bold text bold text^ text text ... embedded bold text text text text text text ^http.........^ text text text ... web link, bold ***************************************************************************************/ namespace showz_docfile_names { #define TMAX 1000 // max. topics and markups #define docxcc 10000 // max. docfile record (line cc) zdialog *zd = 0; GtkWidget *txwidget; int cc, ii, jj; int currline; ch *pp; ch *Tname[TMAX]; // all topic names (link targets) int Tline[TMAX]; // topic lines int Bline[TMAX], Bpos[TMAX], Bcc[TMAX]; // bold texts: line, posn, cc int TN, BN, BF; // counts, flags zlist_t *RTopics = 0; // recent topics list ch RTfile[200] = ""; // recent topics file int RTmax = 10; // max. recent topics } void showz_docfile(GtkWidget *parent, ch *docfile, ch *utopic) { using namespace showz_docfile_names; int showz_docfile_clickfunc(GtkWidget *widget, int line, int pos, ch *input); FILE *fid; ch buff1[docxcc], buff2[docxcc]; // record cc limit ch topic[100], image[100]; // topic name, image name 26.3 ch filespec[200]; ch *pp1, *pp2; int Fm, line, pos1, pos2, cc; GdkPixbuf *pixbuf; GError *gerror; if (! main_thread()) zappcrash("illegal call from thread"); if (utopic && strmatch(utopic,"quit")) { // quit - save recent topics list if (RTopics && *RTfile) zlist_to_file(RTopics,RTfile); if (zdialog_valid2(zd)) popup_report_close(zd,0); // close open report or userguide return; } if (utopic && strmatch(utopic,"validate")) { // check document for errors audit_docfile(docfile); // (developer tool) return; } if (zd && zdialog_valid2(zd,docfile)) // document active already goto initz_done; snprintf(RTfile,200,"%s/recent_topics",get_zhomedir()); // get recent topics list RTopics = zlist_from_file(RTfile); if (! RTopics) RTopics = zlist_new(0); for (ii = 0; ii < TN; ii++) zfree(Tname[ii]); // free prior docfile data if any TN = BN = 0; fid = fopen(docfile,"r"); // open docfile 26.5 if (! fid) { printf("%s %s \n",docfile,strerror(errno)); return; } for (line = 0; ; line++) // loop docfile recs/lines { pp1 = fgets_trim(buff1,docxcc,fid); // line with null at end if (! pp1) break; // EOF if (strmatchN(pp1,"EOF",3)) break; // end of displayed text if (! strmatchN(buff1,"TOPIC:",6)) continue; // not a topic name pp1 = buff1 + 6; while (*pp1 == ' ') pp1++; pp2 = pp1 + strlen(pp1); cc = pp2 - pp1; // bugfix (utf8) 26.3 if (cc < 1 || cc > 299) continue; // ascii 100 can be utf8 300 26.6 strncpy0(topic,pp1,cc+1); // add topic and line number Tname[TN] = zstrdup(topic,"docfile"); // to topic list Tline[TN] = line; if (++TN == TMAX) zexit(1,"docfile exceeds %d topics \n",TMAX); } fclose(fid); printf("Docfile topics: %d \n",TN); zd = popup_report_open(docfile,parent,1000,800,1,0,showz_docfile_clickfunc, // popup window for docfile text display "Recent", "<", ">", "Find", "Save", "X", null); // + buttons if (! zd) zexit(1,"cannot open docfile window \n"); popup_report_font_attributes(zd); // use high contrast font txwidget = zdialog_gtkwidget(zd,"text"); // text widget in zdialog fid = fopen(docfile,"r"); // open docfile again 26.5 if (! fid) { printf("%s %s \n",docfile,strerror(errno)); return; } for (line = 0; ; line++) // loop docfile recs/lines { pp1 = fgets_trim(buff1,docxcc,fid); // line with null at end if (! pp1) break; // EOF if (strmatchN(pp1,"EOF",3)) break; // end of displayed text if (*pp1 == '-') *pp1 = ' '; // blank line marker --> blank 26.5 if (strmatchN(buff1,"TOPIC:",6)) // TOPIC: TOPIC NAME { pp1 = buff1 + 6; while (*pp1 == ' ') pp1++; popup_report_write(zd,1,"%s \n",pp1); // output TOPIC NAME, bold continue; } pp1 = strstr(buff1,"+image:"); // line has image names if (pp1) { while (pp1) { pp1 += 7; while (*pp1 == ' ') pp1++; // remove blanks strncpy0(image,pp1,100); pp2 = strchr(image,' '); if (pp2) *pp2 = 0; snprintf(filespec,200,"%s/%s",get_zimagedir(),image); // full filespec gerror = 0; pixbuf = gdk_pixbuf_new_from_file(filespec,&gerror); // convert to pixbuf image if (pixbuf) { popup_report_write(zd,0," ",0); // leading spaces popup_report_insert_pixbuf(zd,line,pixbuf); // write image to output line g_object_unref(pixbuf); } else printf("*** cannot load image file: %s \n",image); pp1 = strstr(pp1,"+image:"); // next image file } popup_report_write(zd,0,"\n",0); // write image line EOL continue; // next input line } strncpy0(buff2,buff1,docxcc); // line is text Fm = 0; // buff1: line with bold markups for (pp1 = buff2; (pp1 = strpbrk(pp1,"{}^"));) { // buff2: line without markups cc = strlen(pp1+1); memmove(pp1,pp1+1,cc+1); Fm++; // markups found in this line } popup_report_write(zd,0,"%s \n",buff2); // write line to output, no markups if (! Fm) continue; // no markups found, done BF = 0; // intiz. no markups active pos1 = pos2 = 0; // char. posn. with/without markups while (buff1[pos1]) // loop chars. in line { if (! strchr("{}^",buff1[pos1])) { // not a markup char. if (BF) ++Bcc[BN]; // count cc for active markups pos1++; pos2++; continue; } if (buff1[pos1] == '{') { // ... {bold text} ... link to topic if (BN == TMAX) zexit(1,"docfile > %d markups \n",TMAX); BF = 1; // start bold text Bline[BN] = line; Bpos[BN] = pos2; Bcc[BN] = 0; } else if (buff1[pos1] == '}') { // end bold text BF = 0; BN++; // bold markup count } else if (buff1[pos1] == '^') { // ... ^bold text^ ... if (! BF) { // starting ^ BF = 1; Bline[BN] = line; Bpos[BN] = pos2; Bcc[BN] = 0; } else { // ending ^ BF = 0; BN++; } } pos1++; // skip over markup char. } if (BF) BN++; // EOL without trailing } or ^ } // end loop line fclose(fid); for (ii = 0; ii < BN; ii++) // do all text bolds popup_report_bold_word(zd,Bline[ii],Bpos[ii],Bcc[ii]); zmainloop(); // necessary here for some reason initz_done: currline = 0; // docfile line for topic if (utopic) // initial topic from caller { cc = strlen(utopic); for (ii = 0; ii < TN; ii++) { // search docfile topics if (strmatch(utopic,Tname[ii])) { // no strmatchcase 26.3 currline = Tline[ii]; // get line of matching topic break; } } if (ii == TN) printf("*** topic not found: %s \n",utopic); else { zlist_prepend(RTopics,utopic,0); // add to recent topics, 1st position ii = zlist_find(RTopics,utopic,1); if (ii > 0) zlist_remove(RTopics,ii); // if topic present later, remove it ii = zlist_count(RTopics); if (ii > RTmax) zlist_remove(RTopics,ii-1); // limit entry count } } popup_report_scroll_top(zd,currline); // scroll to topic line return; } // handle clicks on document window and KB inputs int showz_docfile_clickfunc(GtkWidget *txwidget, int line, int posn, ch *input) { using namespace showz_docfile_names; int ii, jj, cc; int vtop, vbott, page, posn8; ch *text, *pp1, *pp2; ch *topic; ch text2[docxcc], weblink[200]; static int Ltab[10], maxL = 10, Lpos = 0; // last 10 links clicked gtk_widget_grab_focus(txwidget); // necessary for some reason txwidget_get_visible_lines(txwidget,vtop,vbott); // range of lines on screen if (strmatch(input,"X")) { // [X] kill report 25.0 showz_docfile(0,0,"quit"); return 1; } if (strmatch(input,"Recent")) // [Recent] recent topics { topic = popup_choose(RTopics); // choose a topic 25.1 if (! topic) return 0; for (ii = 0; ii < TN; ii++) // search docfile topics if (strmatchcase(topic,Tname[ii])) break; if (ii == TN) return 0; // not found currline = Tline[ii]; // get line of matching topic popup_report_scroll_top(zd,currline); // scroll to topic line zlist_prepend(RTopics,topic,0); // add to recent topics, 1st position ii = zlist_find(RTopics,topic,1); if (ii > 0) zlist_remove(RTopics,ii); // if topic present later, remove it ii = zlist_count(RTopics); if (ii > RTmax) zlist_remove(RTopics,ii-1); // limit entry count return 1; } if (input) // 25.1 { if (*input == GDK_KEY_Left || *input == '<') { // [<] or left arrow, go back Ltab[Lpos] = currline; if (Lpos > 0) Lpos--; currline = Ltab[Lpos]; txwidget_scroll_top(txwidget,currline); // scroll line to top of window return 1; } if (*input == GDK_KEY_Right || *input == '>') { // [>] or right arrow, go forward Ltab[Lpos] = currline; if (Lpos < maxL-1 && Ltab[Lpos+1] >= 0) currline = Ltab[++Lpos]; txwidget_scroll_top(txwidget,currline); // scroll line to top of window return 1; } if (strmatch(input,"Find")) { // [Find] zdialog_send_event(zd,"Find"); return 1; } if (*input >= 0xfd00) { // navigation key page = vbott - vtop - 2; // page size, lines if (page < 0) page = 0; currline = 0; // default if (*input == GDK_KEY_Up) currline = vtop - 1; // handle navigation keys else if (*input == GDK_KEY_Down) currline = vbott + 1; else if (*input == GDK_KEY_Page_Up) currline = vtop - page; else if (*input == GDK_KEY_Page_Down) currline = vbott + page; else if (*input == GDK_KEY_KP_Page_Up) currline = vtop - page; else if (*input == GDK_KEY_KP_Page_Down) currline = vbott + page; else if (*input == GDK_KEY_KP_9) currline = vtop - page; else if (*input == GDK_KEY_KP_3) currline = vbott + page; else if (*input == GDK_KEY_Home) currline = 0; else if (*input == GDK_KEY_End) currline = 999999; if (currline < 0) currline = 0; txwidget_scroll(txwidget,currline); // put line on screen return 1; } } if (line < 0 || posn < 0) return 0; // clicked line and position text = txwidget_line(txwidget,line,1); // get line text if (! text) return 0; strncpy0(text2,text,posn+1); // compensate utf8 chars. before posn posn8 = posn + strlen(text2) - utf8len(text2); for (ii = 0; ii < BN; ii++) { // is clicked text bolded text if (line == Bline[ii]) { if (posn8 >= Bpos[ii] && posn8 <= Bpos[ii] + Bcc[ii]) { // yes for (jj = 0; jj < TN; jj++) { if (Bcc[ii] == (int) strlen(Tname[jj]) && // does it match a topic name bugfix 26.3 strmatchN(Tname[jj],text+Bpos[ii],Bcc[ii])) break; } if (jj < TN) goto topiclink; // yes } } } goto weblink; topiclink: topic = Tname[jj]; // clicked topic currline = Tline[jj]; txwidget_scroll_top(txwidget,currline); // scroll topic to top of window zlist_prepend(RTopics,topic,0); // add to recent topics, 1st position ii = zlist_find(RTopics,topic,1); if (ii > 0) zlist_remove(RTopics,ii); // if topic present later, remove it ii = zlist_count(RTopics); if (ii > RTmax) zlist_remove(RTopics,ii-1); // limit entry count if (Lpos == maxL-1) { for (jj = 0; jj < maxL-1; jj++) // back tab table full, Ltab[jj] = Ltab[jj+1]; // discard oldest Lpos--; } Ltab[Lpos] = vtop; // curr. top line >> back tab Lpos++; // advance back tab position Ltab[Lpos] = currline; // >> back tab return 1; weblink: for ( ; posn >= 0; posn--) if ( *(text+posn) == ' ') break; // click position, preceding blank if (posn < 0) posn = 0; if (text[posn] == ' ') posn += 1; // eliminate preceding blank pp1 = text + posn; pp2 = strchr(pp1,' '); // following blank or EOL if (pp2) cc = pp2 - pp1; else cc = strlen(pp1); if (pp1[cc-1] == '.') cc--; // remove trailing period if (cc > 199) return 1; strncpy0(weblink,pp1,cc+1); // copy clicked text string if (strmatchN(pp1,"http",4)) // if "http..." assume a web link zshell("log ack","xdg-open %s",weblink); return 1; } // validate the F1_help_topic links and the internal links in a docfile // (developer tool) void audit_docfile(ch *docfile) { #define LMAX 10000 // max. docfile lines/recs ch *textlines[LMAX]; ch *Tname[TMAX]; ch buff[docxcc], image[100]; // limits: filename, rec. cc, image name ch topic[100]; ch filespec[200]; ch *pp1, *pp2, *pp3; FILE *fid; int Ntext, Ntop, Nerrs; int ii, cc, line; GdkPixbuf *pixbuf; GError *gerror; printf("audit docfile: %s \n",docfile); Ntext = Ntop = Nerrs = 0; fid = fopen(docfile,"r"); if (! fid) { printf("%s %s",docfile,strerror(errno)); return; } for (line = 0; line < LMAX; line++) // read docfile text lines { pp1 = fgets_trim(buff,docxcc,fid); // line without \n EOL if (! pp1) break; // EOF textlines[Ntext] = zstrdup(pp1,"docfile"); // copy text line to memory if (++Ntext == LMAX) zexit(1,"exceed LMAX text recs"); if (! strmatchN(pp1,"TOPIC:",6)) continue; // not a topic line pp1 += 6; while (*pp1 == ' ') pp1++; cc = strlen(pp1); if (cc < 2 || cc > 299) continue; // ascii 100 can be utf8 300 26.6 strncpy0(topic,pp1,cc+1); // add topic to list Tname[Ntop] = zstrdup(topic,"docfile"); if (++Ntop == TMAX) zexit(1,"exceed TMAX topics"); } fclose(fid); printf("text lines: %d topics: %d \n",Ntext,Ntop); for (line = 0; line < Ntext; line++) // process text lines { pp1 = textlines[line]; pp2 = strstr(pp1,"+image:"); if (pp2) { // line contains images while (pp2) { pp2 += 7; while (*pp2 == ' ') pp2++; // remove blanks strncpy0(image,pp2,100); pp3 = strchr(image,' '); if (pp3) *pp3 = 0; snprintf(filespec,200,"%s/%s",get_zimagedir(),image); // full filespec gerror = 0; pixbuf = gdk_pixbuf_new_from_file(filespec,&gerror); // convert to pixbuf image if (pixbuf) g_object_unref(pixbuf); else { printf("cannot load image file: %s \n",image); Nerrs++; } pp2 = strstr(pp2,"+image:"); } continue; // next line } if (strmatchN(pp1,"TOPIC:",6)) continue; // skip topic line { pp1 = strchr(pp1,'{'); // get topic links in line while (pp1) { pp2 = strchr(pp1+1,'}'); // ... {topic name} ... if (! pp2) break; // | | pp1 += 1; // pp1 pp2 cc = pp2 - pp1; if (cc < 2 || cc > 299) { // 26.6 printf("topic >299 chars, line %d: %s \n",line,pp1); // topic name > 299 char. Nerrs++; // (ascii 100 can be utf8 300) break; } strncpy0(topic,pp1,cc+1); for (ii = 0; ii < Ntop; ii++) if (strcmp(topic,Tname[ii]) == 0) break; if (ii == Ntop) { // topic not found printf("topic not found, line %d: %s \n",line,topic); Nerrs++; } pp1 = strchr(pp2+1,'{'); } continue; // next line } } printf(" %d errors \n",Nerrs); for (ii = 0; ii < Ntext; ii++) // free memory zfree(textlines[ii]); for (ii = 0; ii < Ntop; ii++) zfree(Tname[ii]); return; } /************************************************************************************** TRANSLATE SUSPEND omit following code from translation scan // 26.0 contains tokens: TX( that must be ignored ***************************************************************************************/ namespace txinit_names { zlist_t *zlist_xx = 0; // translated text strings int TXvalid = 0; } // Initialize the application program for GUI translations. // "xx" is language code: "de", "fr", etc. // load file gui_xx into memory int TX_init(ch *xx, ch *folder) // 26.0 { using namespace txinit_names; ch zlist_xx_file[500]; int N, ii, jj, kk; ch *text; TXvalid = 0; // translations inactive if (strmatch(xx,"en")) return 0; // language = english if (strlen(xx) != 2) return 0; snprintf(zlist_xx_file,500,"%s/gui_%s",folder,xx); // get translation file gui_xx zlist_xx = zlist_from_file(zlist_xx_file); if (! zlist_xx) { zmessageACK(mainwin,TX("cannot load gui_%s file"),xx); return 0; } N = zlist_count(zlist_xx); // replace "\\n" with real \n for (ii = 0; ii < N; ii++) { // <1 ms for 1800 translations, 4 GHz CPU text = zlist_get(zlist_xx,ii); for (jj = 0; text[jj]; jj++) { if (text[jj] == '\\' && text[jj+1] == 'n') { text[jj] = '\n'; for (kk = jj+1; text[kk]; kk++) text[kk] = text[kk+1]; } } } TXvalid = 1; return 1; } // Translate an english text string to the language set by TX_init(). // If no translation is found, the input text is returned. // Benchmark: translation table with 2765 entries: 40-60 µs using 4 GHz CPU. ch * TX(ch *text) // 26.0 { using namespace txinit_names; int N, ii; if (! TXvalid) return text; // translations not active N = zlist_count(zlist_xx); for (ii = 0; ii < N; ii += 2) // search english for input text if (strmatch(text,zlist_get(zlist_xx,ii)+5)) break; // (omit leading "NNNN ") if (ii >= N) return text; // not found return zlist_get(zlist_xx,ii+1) + 5; // return corresp. translation } // Reverse Translate // Search for a translation and return matching Englist text. ch * XT(ch *text) // 26.0 { using namespace txinit_names; int N, ii; if (! TXvalid) return text; // translations not active N = zlist_count(zlist_xx); for (ii = 0; ii < N; ii += 2) // search xx text for input text if (strmatch(text,zlist_get(zlist_xx,ii+1)+5)) break; // (omit leading "NNNN ") if (ii >= N) return text; // not found return zlist_get(zlist_xx,ii) + 5; // return corresp. en text } // TRANSLATE RESUME // continue translate scan from here /**************************************************************************************/ // GTK utility functions // Iterate GTK main loop every "skip" calls. // If called within the main() thread, does a GTK main loop to process menu events, etc. // You must do this periodically within long-running main() thread tasks if you wish to // keep menus, buttons, output windows, etc. alive and working. // Skip argument: do nothing for skip calls, then perform the normal function. // This allows it to be embedded in loops with little execution time penalty. // If called from a thread, zmainloop() does nothing. // Execution time: if no events pending, 1-2 microseconds for 3 GHz processor. void zmainloop(int skip) { static int xskip = 0; if (! main_thread()) return; // thread caller, do nothing if (skip && ++xskip < skip) return; while (gtk_events_pending()) gtk_main_iteration_do(0); xskip = 0; return; } // Iterate the main loop and sleep for designated time void zmainsleep(float secs) { while (secs > 0) { zmainloop(); zsleep(0.0001); secs = secs - 0.0001; } return; } /**************************************************************************************/ // cairo drawing context for GDK window cairo_t * draw_context_create(GdkWindow *gdkwin, draw_context_t &context) { if (! main_thread()) zappcrash("illegal call from thread"); if (context.dcr) { printf("*** draw_context_create(): nested call"); return context.dcr; } context.win = gdkwin; context.rect.x = 0; context.rect.y = 0; context.rect.width = gdk_window_get_width(gdkwin); context.rect.height = gdk_window_get_height(gdkwin); context.reg = cairo_region_create_rectangle(&context.rect); context.ctx = gdk_window_begin_draw_frame(gdkwin,context.reg); context.dcr = gdk_drawing_context_get_cairo_context(context.ctx); return context.dcr; } void draw_context_destroy(draw_context_t &context) { if (! main_thread()) zappcrash("illegal call from thread"); if (! context.dcr) { printf("*** draw_context_destroy(): not created \n"); return; } gdk_window_end_draw_frame(context.win,context.ctx); cairo_region_destroy(context.reg); /* cairo_destroy(context.dcr); this is fatal */ context.dcr = 0; return; } /**************************************************************************************/ // txwidget functions // -------------------- // // High-level use of GtkTextView widget for text reports, line editing, text selection // In functions below, txwidget = zdialog_gtkwidget(zd,"widgetname"), // where "widgetname" is a zdialog "text" widget type. // All line numbers and line positions are zero based. // clear the text widget to blank void txwidget_clear(GtkWidget *txwidget) { GtkTextBuffer *textBuff; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; gtk_text_buffer_set_text(textBuff,"",-1); return; } // clear the text widget from given line to end void txwidget_clear(GtkWidget *txwidget, int line) { GtkTextBuffer *textBuff; GtkTextIter iter1, iter2; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; gtk_text_buffer_get_iter_at_line(textBuff,&iter1,line); // iter at line start gtk_text_buffer_get_end_iter(textBuff,&iter2); gtk_text_buffer_delete(textBuff,&iter1,&iter2); // delete existing line and rest of buffer return; } // get the current line count int txwidget_linecount(GtkWidget *txwidget) { GtkTextBuffer *textBuff; int nlines; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return 0; nlines = gtk_text_buffer_get_line_count(textBuff); return nlines; } // append a new line of text to the end of existing text lines // line should normally include trailing \n // if current last line has no \n, text is appended to this line void txwidget_append(GtkWidget *txwidget, int bold, ch *format, ...) { va_list arglist; ch textline[20000]; // txwidget append cc limit GtkTextBuffer *textBuff; GtkTextIter enditer; GtkTextTag *fontag = 0; ch *normfont = zfuncs::appmonofont; ch *boldfont = zfuncs::appmonoboldfont; if (! main_thread()) zappcrash("illegal call from thread"); va_start(arglist,format); vsnprintf(textline,19999,format,arglist); va_end(arglist); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; gtk_text_buffer_get_end_iter(textBuff,&enditer); // end of text if (bold) fontag = gtk_text_buffer_create_tag(textBuff,0,"font",boldfont,0); // prepare bold/norm tag else fontag = gtk_text_buffer_create_tag(textBuff,0,"font",normfont,0); gtk_text_buffer_insert_with_tags(textBuff,&enditer,textline,-1,fontag,null); // insert line return; } // same as above, with scroll to last line added (slower) void txwidget_append2(GtkWidget *txwidget, int bold, ch *format, ...) { va_list arglist; ch textline[20000]; // txwidget append cc limit GtkTextBuffer *textBuff; GtkTextIter enditer; GtkTextTag *fontag = 0; ch *normfont = zfuncs::appmonofont; ch *boldfont = zfuncs::appmonoboldfont; GtkAdjustment *vadjust; double upperlimit; if (! main_thread()) zappcrash("illegal call from thread"); va_start(arglist,format); vsnprintf(textline,19999,format,arglist); va_end(arglist); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; gtk_text_buffer_get_end_iter(textBuff,&enditer); // end of text if (bold) fontag = gtk_text_buffer_create_tag(textBuff,0,"font",boldfont,0); // prepare bold/norm tag else fontag = gtk_text_buffer_create_tag(textBuff,0,"font",normfont,0); gtk_text_buffer_insert_with_tags(textBuff,&enditer,textline,-1,fontag,null); // insert line vadjust = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(txwidget)); upperlimit = gtk_adjustment_get_upper(vadjust); gtk_adjustment_set_value(vadjust,upperlimit); zmainloop(); return; } // insert a new line of text after designated line // use line -1 to insert before line 0 // line should normally include trailing \n void txwidget_insert(GtkWidget *txwidget, int bold, int line, ch *format, ...) { va_list arglist; ch textline[20000]; // txwidget insert cc limit GtkTextBuffer *textBuff; GtkTextIter iter; int nlines; GtkTextTag *fontag = 0; ch *normfont = zfuncs::appmonofont; ch *boldfont = zfuncs::appmonoboldfont; if (! main_thread()) zappcrash("illegal call from thread"); va_start(arglist,format); vsnprintf(textline,19999,format,arglist); va_end(arglist); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; if (line < 0) gtk_text_buffer_get_start_iter(textBuff,&iter); // insert before line 0 if (line >= 0) { nlines = gtk_text_buffer_get_line_count(textBuff); // insert after line if (line < nlines - 1) gtk_text_buffer_get_iter_at_line(textBuff,&iter,line+1); // start of next line else gtk_text_buffer_get_end_iter(textBuff,&iter); // or end of text } if (bold) fontag = gtk_text_buffer_create_tag(textBuff,0,"font",boldfont,0); // prepare bold/norm tag else fontag = gtk_text_buffer_create_tag(textBuff,0,"font",normfont,0); gtk_text_buffer_insert_with_tags(textBuff,&iter,textline,-1,fontag,null); // insert line return; } // replace a given line with a new line // line = -1: replace last line. -2: replace last-1 line, etc. // new line should normally include trailing \n void txwidget_replace(GtkWidget *txwidget, int bold, int line, ch *format, ...) { va_list arglist; ch textline[20000]; // txwidget replace cc limit GtkTextBuffer *textBuff; GtkTextIter iter1, iter2; int nlines; GtkTextTag *fontag = 0; ch *normfont = zfuncs::appmonofont; ch *boldfont = zfuncs::appmonoboldfont; if (! main_thread()) zappcrash("illegal call from thread"); va_start(arglist,format); vsnprintf(textline,19999,format,arglist); va_end(arglist); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; nlines = gtk_text_buffer_get_line_count(textBuff); // lines now in buffer if (line < 0) line = nlines + line - 1; if (line >= nlines) line = nlines - 1; gtk_text_buffer_get_iter_at_line(textBuff,&iter1,line); // line start iter2 = iter1; gtk_text_iter_forward_line(&iter2); // end gtk_text_buffer_delete(textBuff,&iter1,&iter2); // delete line gtk_text_buffer_get_iter_at_line(textBuff,&iter1,line); if (bold) fontag = gtk_text_buffer_create_tag(textBuff,0,"font",boldfont,0); // prepare bold/norm tag else fontag = gtk_text_buffer_create_tag(textBuff,0,"font",normfont,0); gtk_text_buffer_insert_with_tags(textBuff,&iter1,textline,-1,fontag,null); // insert line return; } // delete a given line including the trailing \n void txwidget_delete(GtkWidget *txwidget, int line) { GtkTextBuffer *textBuff; GtkTextIter iter1, iter2; int nlines; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; nlines = gtk_text_buffer_get_line_count(textBuff); // lines now in buffer if (line < 0 || line >= nlines) return; gtk_text_buffer_get_iter_at_line(textBuff,&iter1,line); // line start iter2 = iter1; gtk_text_iter_forward_line(&iter2); // end gtk_text_buffer_delete(textBuff,&iter1,&iter2); // delete line return; } // find first line of text containing characters matching input string // search is from line1 to end, then from 0 to line1-1 // returns first matching line or -1 if none // comparison is not case sensitive int txwidget_find(GtkWidget *txwidget, ch *matchtext, int line1, int hilite) { GtkTextBuffer *textBuff; GtkTextIter iter1, iter2; int line, nlines, cc; ch *textline = 0, *pp1, *pp2; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return -1; nlines = gtk_text_buffer_get_line_count(textBuff); // lines now in buffer if (! nlines) return -1; if (line1 < 0) line1 = 0; // starting line to search if (line1 >= nlines) line1 = 0; line = line1; while (true) { gtk_text_buffer_get_iter_at_line(textBuff,&iter1,line); // line start iter2 = iter1; gtk_text_iter_forward_line(&iter2); // end textline = gtk_text_buffer_get_text(textBuff,&iter1,&iter2,0); // get text if (textline) { pp1 = strcasestr(textline,matchtext); // look for matching text if (pp1) break; // found free(textline); } line++; if (line == nlines) line = 0; if (line == line1) return -1; // wrapped around, not found } if (hilite) { cc = strlen(matchtext); // highlight matching text pp2 = pp1 + cc - 1; gtk_text_buffer_get_iter_at_line_index(textBuff,&iter1,line,pp1-textline); gtk_text_buffer_get_iter_at_line_index(textBuff,&iter2,line,pp2-textline+1); gtk_text_buffer_select_range(textBuff,&iter1,&iter2); } free(textline); return line; } // insert a pixbuf image at designated line void txwidget_insert_pixbuf(GtkWidget *txwidget, int line, GdkPixbuf *pixbuf) { int nlines; GtkTextBuffer *textBuff; GtkTextIter iter; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; nlines = gtk_text_buffer_get_line_count(textBuff); // insert after line if (line < nlines - 1) gtk_text_buffer_get_iter_at_line(textBuff,&iter,line+1); // start of next line else gtk_text_buffer_get_end_iter(textBuff,&iter); // or end of text gtk_text_buffer_insert_pixbuf(textBuff,&iter,pixbuf); return; } // scroll a txwidget to put a given line on screen // 1st line = 0. for last line use line = -1. void txwidget_scroll(GtkWidget *txwidget, int line) { GtkTextBuffer *textBuff; GtkTextIter iter; GtkTextMark *mark; GtkAdjustment *vadjust; double upperlimit; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; vadjust = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(txwidget)); if (line < 0) { // bottom zmainloop(); // make it work (GTK problem) upperlimit = gtk_adjustment_get_upper(vadjust); gtk_adjustment_set_value(vadjust,upperlimit); } else { gtk_text_buffer_get_iter_at_line(textBuff,&iter,line); mark = gtk_text_buffer_create_mark(textBuff,0,&iter,0); gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(txwidget),mark); } return; } // scroll a txwidget to put a given line at the top of the window void txwidget_scroll_top(GtkWidget *txwidget, int line) { GtkTextBuffer *textBuff; GtkTextIter iter; GtkTextMark *mark; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; gtk_text_buffer_get_iter_at_line(textBuff,&iter,line); mark = gtk_text_buffer_create_mark(textBuff,0,&iter,0); gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(txwidget),mark,0,1,0,0); return; } // get the range of txwidget lines currently visible in the window void txwidget_get_visible_lines(GtkWidget *txwidget, int &vtop, int &vbott) { GdkRectangle rect; GtkTextIter iter1, iter2; int y1, y2; if (! main_thread()) zappcrash("illegal call from thread"); gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(txwidget),&rect); y1 = rect.y; y2 = y1 + rect.height; gtk_text_view_get_line_at_y(GTK_TEXT_VIEW(txwidget), &iter1, y1, 0); gtk_text_view_get_line_at_y(GTK_TEXT_VIEW(txwidget), &iter2, y2, 0); vtop = gtk_text_iter_get_line(&iter1); vbott = gtk_text_iter_get_line(&iter2) - 1; return; } // dump the entire txwidget contents into a file void txwidget_dump(GtkWidget *widget, ch *filename) { FILE *fid; ch *prec; int line, err; if (! main_thread()) zappcrash("illegal call from thread"); fid = fopen(filename,"w"); // open file if (! fid) { zmessageACK(mainwin,TX("cannot open file %s"),filename); return; } for (line = 0; ; line++) { prec = txwidget_line(widget,line,1); // get text line, strip \n if (! prec) break; fprintf(fid,"%s\n",prec); // output with \n } err = fclose(fid); // close file if (err) zmessageACK(mainwin,TX("file close error")); return; } // dump the entire txwidget contents into a file, using a save-as dialog void txwidget_save(GtkWidget *widget, GtkWindow *parent) { ch *file; if (! main_thread()) zappcrash("illegal call from thread"); file = zgetfile("save text to file",parent,"save","noname"); if (! file) return; txwidget_dump(widget,file); zfree(file); return; } // Get a line of text. Returned text is subject for zfree(). // trailing \n is included if strip == 0 ch * txwidget_line(GtkWidget *txwidget, int line, int strip) { GtkTextBuffer *textBuff; GtkTextIter iter1, iter2; int cc, nlines; ch *textline, *ztext; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return 0; nlines = gtk_text_buffer_get_line_count(textBuff); // lines now in buffer if (line < 0 || line >= nlines) return 0; gtk_text_buffer_get_iter_at_line(textBuff,&iter1,line); // line start iter2 = iter1; gtk_text_iter_forward_line(&iter2); // end textline = gtk_text_buffer_get_text(textBuff,&iter1,&iter2,0); // get text line if (! textline) return 0; ztext = zstrdup(textline,"txwidget"); free(textline); if (strip) { cc = strlen(ztext); if (cc && ztext[cc-1] == '\n') ztext[cc-1] = 0; } return ztext; } // highlight a given line of text void txwidget_highlight_line(GtkWidget *txwidget, int line) { GtkTextBuffer *textBuff; GtkTextIter iter1, iter2; int nlines; zmainloop(); if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; nlines = gtk_text_buffer_get_line_count(textBuff); // lines now in buffer if (line < 0 || line >= nlines) return; gtk_text_buffer_get_iter_at_line(textBuff,&iter1,line); // line start iter2 = iter1; gtk_text_iter_forward_line(&iter2); // end gtk_text_buffer_select_range(textBuff,&iter1,&iter2); // highlight return; } // get the word at the given position within the line // words are defined by line starts and ends, and the given delimiters // returns word and delimiter (&end) ch * txwidget_word(GtkWidget *txwidget, int line, int posn, ch *dlims, ch &end) { GtkTextBuffer *textBuff; ch *txline, *pp1, *pp2, *ztext; int cc, nn; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return 0; txline = txwidget_line(txwidget,line,0); if (! txline) return 0; cc = strlen(txline); if (txline[cc-1] == '\n') { txline[cc-1] = 0; cc--; } pp1 = pp2 = txline; // fix for utf8 while (true) { while (*pp1 == ' ' || strchr(dlims,*pp1)) pp1++; // pp1 = start of next word in line if (*pp1 == 0) return 0; pp2 = pp1; while (true) { if (*pp2 == 0) break; nn = utf8_position(pp2,1); // pp2 = next delimiter or EOL if (nn < 0) break; if (strchr(dlims,pp2[nn])) break; pp2 += nn; posn += nn-1; if (pp2 - txline >= cc) break; } if (txline+posn >= pp1 && txline+posn <= pp2) break; // pp1-pp2 is word clicked nn = utf8_position(pp2,1); if (nn < 0) return 0; pp1 = pp2 + nn; posn += nn-1; if (posn >= cc) return 0; if (pp1 >= txline+posn) return 0; } nn = utf8_position(pp2,1); if (nn > 0) cc = pp2 - pp1 + nn; else cc = pp2 - pp1 + strlen(pp2); end = pp1[cc]; ztext = (ch *) zmalloc(cc+1,"txwidget"); strncpy0(ztext,pp1,cc+1); zfree(txline); return ztext; } // highlight text at line and positiion, length cc void txwidget_highlight_word(GtkWidget *txwidget, int line, int posn, int cc) { GtkTextBuffer *textBuff; GtkTextIter iter1, iter2; ch *txline, *pp1, *pp2; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; txline = txwidget_line(txwidget,line,0); if (! txline) return; pp1 = txline + posn; pp2 = pp1 + cc - 1; gtk_text_buffer_get_iter_at_line_index(textBuff,&iter1,line,pp1-txline); gtk_text_buffer_get_iter_at_line_index(textBuff,&iter2,line,pp2-txline+1); gtk_text_buffer_select_range(textBuff,&iter1,&iter2); zfree(txline); return; } // convert text to bold text at line, positiion, cc void txwidget_bold_word(GtkWidget *txwidget, int line, int posn, int cc) { GtkTextBuffer *textBuff; GtkTextIter iter1, iter2; GtkTextTag *fontag = 0; ch *boldfont = zfuncs::appmonoboldfont; ch *txline, *pp1, *pp2; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; txline = txwidget_line(txwidget,line,0); if (! txline) return; fontag = gtk_text_buffer_create_tag(textBuff,0,"font",boldfont,0); /*** fontag = gtk_text_buffer_create_tag(textBuff,0,"font",boldfont, // example "foreground","red","background","light blue",0); ***/ pp1 = txline + posn; pp2 = pp1 + cc - 1; gtk_text_buffer_get_iter_at_line_index(textBuff,&iter1,line,pp1-txline); gtk_text_buffer_get_iter_at_line_index(textBuff,&iter2,line,pp2-txline+1); gtk_text_buffer_apply_tag(textBuff,fontag,&iter1,&iter2); zfree(txline); return; } // convert text to underlined text at line, positiion, cc void txwidget_underline_word(GtkWidget *txwidget, int line, int posn, int cc) { GtkTextBuffer *textBuff; GtkTextIter iter1, iter2; GtkTextTag *fontag = 0; ch *txline, *pp1, *pp2; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; txline = txwidget_line(txwidget,line,0); if (! txline) return; fontag = gtk_text_buffer_create_tag(textBuff,0,"underline",PANGO_UNDERLINE_SINGLE,0); pp1 = txline + posn; pp2 = pp1 + cc - 1; gtk_text_buffer_get_iter_at_line_index(textBuff,&iter1,line,pp1-txline); gtk_text_buffer_get_iter_at_line_index(textBuff,&iter2,line,pp2-txline+1); gtk_text_buffer_apply_tag(textBuff,fontag,&iter1,&iter2); zfree(txline); return; } // set font attributes for the entire txwidget (black on white) // this does not do anything to the text font - why? FIXME void txwidget_font_attributes(GtkWidget *txwidget) { GtkTextBuffer *textBuff; GtkTextIter iter1, iter2; GtkTextTag *fontag = 0; if (! main_thread()) zappcrash("illegal call from thread"); textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txwidget)); if (! textBuff) return; fontag = gtk_text_buffer_create_tag(textBuff,0, // high contrast "font",appmonofont,"foreground","black","background","white",0); gtk_text_buffer_get_start_iter(textBuff,&iter1); gtk_text_buffer_get_end_iter(textBuff,&iter2); gtk_text_buffer_apply_tag(textBuff,fontag,&iter1,&iter2); return; } // set an event function for mouse and KB events in txwidget // + line selection via mouse click or keyboard up/down arrow key // + line and word selection via mouse click // // optional user callback function looks like this: // void userfunc(GtkWidget *txwidget, int line, int posn, ch *input) // receive clicked line and position (or) // dialog completion button (input) (or) // KB navigation key (input[0]) void txwidget_set_eventfunc(GtkWidget *txwidget, txwidget_CBfunc_t userfunc) { int txwidget_eventfunc(GtkWidget *txwidget, GdkEvent *event, txwidget_CBfunc_t userfunc); if (! main_thread()) zappcrash("illegal call from thread"); gtk_widget_add_events(txwidget,GDK_BUTTON_PRESS_MASK); gtk_widget_add_events(txwidget,GDK_KEY_PRESS_MASK); gtk_widget_add_events(txwidget,GDK_POINTER_MOTION_MASK); gtk_widget_add_events(txwidget,GDK_FOCUS_CHANGE_MASK); if (userfunc) { // 25.1 G_SIGNAL(txwidget,"key-press-event",txwidget_eventfunc,userfunc); G_SIGNAL(txwidget,"button-press-event",txwidget_eventfunc,userfunc); G_SIGNAL(txwidget,"motion-notify-event",txwidget_eventfunc,userfunc); G_SIGNAL(txwidget,"focus-in-event",txwidget_eventfunc,userfunc); } return; } // txwidget event function: // if no user callback function, process KB navigation keys (arrow, page, home/end) // if user callback func, send all KB keys to user callback function // process mouse clicks, send clicked line and position to user callback function int txwidget_eventfunc(GtkWidget *txwidget, GdkEvent *event, txwidget_CBfunc_t userfunc) { #define TEXT GTK_TEXT_WINDOW_TEXT #define VIEW GTK_TEXT_VIEW static GdkCursor *arrowcursor = 0; GdkWindow *gdkwin; GtkTextIter iter1; int ustat; int button, mpx, mpy, tbx, tby; int line, pos, vtop, vbott, page, KBkey; ch input[20] = ""; if (! arrowcursor) // first call, get arrow cursor arrowcursor = gdk_cursor_new_for_display(display,GDK_TOP_LEFT_ARROW); gdkwin = gtk_text_view_get_window(VIEW(txwidget),TEXT); // set arrow cursor for window if (gdkwin) gdk_window_set_cursor(gdkwin,arrowcursor); // (must reset every event) gtk_widget_grab_focus(txwidget); if (event->type == GDK_KEY_PRESS) // KB key press event { KBkey = ((GdkEventKey *) event)->keyval; if (userfunc) { // send arrow keys to userfunc strcpy(input,"xxx"); if (KBkey == GDK_KEY_Up) strcpy(input,"up"); if (KBkey == GDK_KEY_Down) strcpy(input,"down"); if (KBkey == GDK_KEY_Left) strcpy(input,"left"); if (KBkey == GDK_KEY_Right) strcpy(input,"right"); ustat = userfunc(txwidget,-1,-1,input); if (ustat) return 1; // handled by userfunc } if (KBkey > 0xff00) // navigation key { txwidget_get_visible_lines(txwidget,vtop,vbott); // range of lines on screen page = vbott - vtop - 2; // page size, lines if (page < 0) page = 0; line = 0; // default if (KBkey == GDK_KEY_Up) line = vtop - 1; // handle some navigation keys if (KBkey == GDK_KEY_Down) line = vbott + 1; if (KBkey == GDK_KEY_Page_Up) line = vtop - page; if (KBkey == GDK_KEY_Page_Down) line = vbott + page; if (KBkey == GDK_KEY_Home) line = 0; if (KBkey == GDK_KEY_End) line = 999999; if (line < 0) line = 0; txwidget_scroll(txwidget,line); // put line on screen return 1; } } if (! userfunc) return 1; if (event->type == GDK_BUTTON_PRESS) // mouse button press { button = ((GdkEventButton *) event)->button; // ignore if not left button if (button != 1) return 0; mpx = int(((GdkEventButton *) event)->x); // mouse click position mpy = int(((GdkEventButton *) event)->y); mpx -= appfontsize / 2; // more accurate if (mpx < 0) mpx = 0; gtk_text_view_window_to_buffer_coords(VIEW(txwidget),TEXT,mpx,mpy,&tbx,&tby); if (tbx && tby) { // can happen gtk_text_view_get_iter_at_location(VIEW(txwidget),&iter1,tbx,tby); line = gtk_text_iter_get_line(&iter1); // clicked txwidget line pos = gtk_text_iter_get_line_offset(&iter1); // clicked position } else line = pos = 0; userfunc(txwidget,line,pos,null); // pass line and posn to user func return 1; } return 0; } /************************************************************************************** simplified GTK menu bar, tool bar, status bar functions These functions simplify the creation of GTK menus and toolbars. The functionality is limited but adequate for most purposes. mbar = create_menubar(vbox) create menubar mitem = add_menubar_item(mbar, label, func) add menu item to menubar msub = add_submenu_item(mitem, label, func, tip) add submenu item to menu or submenu tbar = create_toolbar(vbox, iconsize) create toolbar add_toolbar_button(tbar, label, tip, icon, func) add button to toolbar stbar = create_stbar(vbox) create status bar stbar_message(stbar, message) display message in status bar These functions to the following: * create a menu bar and add to existing window vertical packing box * add menu item to menu bar * add submenu item to menu bar item or submenu item * create a toolbar and add to existing window * add button to toolbar, using stock icon or custom icon * create a status bar and add to existing window * display a message in the status bar argument definitions: vbox GtkWidget * a vertical packing box (in a window) mbar GtkWidget * reference for menu bar popup GtkWidget * reference for popup menu mitem GtkWidget * reference for menu item (in a menu bar) msub GtkWidget * reference for submenu item (in a menu) label ch * menu or toolbar name or label tbar GtkWidget * reference for toolbar tip ch * tool button tool tip (popup text via mouse-over) icon ch * stock icon name or custom icon file name (see below) func see below menu or tool button response function arg ch * argument to response function stbar int reference for status bar message ch * message to display in status bar The icon argument for the function add_toolbar_button() has two forms. For a GTK stock item referenced with a macro like GTK_STOCK_OPEN, use the corresponding text name, like "gtk-open". For a custom icon, use the icon's file name like "my-icon.png". The file is expected to be in get_zdatadir()/icons. The icon file may be any size, and is resized for use on the toolbar. If the file is not found, the stock icon "gtk-missing-image" is used (".png" and ".jpg" files both work). For a button with no icon (text label only), use 0 or null for the icon argument. For a menu separator, use the menu name "separator". For a toolbar separator, use the label "separator". For a title menu (no response function), set the response function to null. The response function for both menus and toolbar buttons looks like this: void func(GtkWidget *, ch *) The following macro is also supplied to simplify the coding of response functions: G_SIGNAL(window,event,func,arg) which expands to: g_signal_connect(G_OBJECT(window),event,G_CALLBACK(func),(void *) arg) ***************************************************************************************/ // create menu bar and add to vertical packing box GtkWidget * create_menubar(GtkWidget *vbox) { GtkWidget *wmbar; wmbar = gtk_menu_bar_new(); gtk_box_pack_start(GTK_BOX(vbox),wmbar,0,0,0); return wmbar; } // add menu item to menu bar, with optional response function GtkWidget * add_menubar_item(GtkWidget *wmbar, ch *mname, cbFunc func) { GtkWidget *wmitem; wmitem = gtk_menu_item_new_with_label(mname); gtk_menu_shell_append(GTK_MENU_SHELL(wmbar),wmitem); if (func) G_SIGNAL(wmitem,"activate",func,mname); return wmitem; } // add submenu item to menu item, with optional response function GtkWidget * add_submenu_item(GtkWidget *wmitem, ch *mlab, cbFunc func, ch *mtip) { GtkWidget *wmsub, *wmsubitem; wmsub = gtk_menu_item_get_submenu(GTK_MENU_ITEM(wmitem)); // add submenu if not already if (wmsub == null) { wmsub = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(wmitem),wmsub); } if (strmatch(mlab,"separator")) wmsubitem = gtk_separator_menu_item_new(); else wmsubitem = gtk_menu_item_new_with_label(mlab); // add menu item with label only gtk_menu_shell_append(GTK_MENU_SHELL(wmsub),wmsubitem); // append submenu item to submenu if (func) G_SIGNAL(wmsubitem,"activate",func,mlab); // connect optional response function if (mtip) g_object_set(G_OBJECT(wmsubitem),"tooltip-text",mtip,null); // add optional popup menu tip return wmsubitem; } /**************************************************************************************/ // create toolbar and add to vertical packing box int tbIconSize = 32; // default if not supplied GtkWidget * create_toolbar(GtkWidget *vbox, int iconsize) { GtkWidget *wtbar; wtbar = gtk_toolbar_new(); gtk_box_pack_start(GTK_BOX(vbox),wtbar,0,0,0); tbIconSize = iconsize; return wtbar; } // add toolbar button with label and icon ("iconfile.png") and tool tip // at least one of label and icon should be present GtkWidget * add_toolbar_button(GtkWidget *wtbar, ch *blab, ch *btip, ch *icon, cbFunc func) { GtkToolItem *tbutton; GError *gerror = 0; PIXBUF *pixbuf; GtkWidget *wicon = 0; ch iconpath[300], *pp; STATB statB; int err, cc; if (blab && strmatch(blab,"separator")) { tbutton = gtk_separator_tool_item_new(); gtk_toolbar_insert(GTK_TOOLBAR(wtbar),GTK_TOOL_ITEM(tbutton),-1); return (GtkWidget *) tbutton; } if (icon && *icon) { // get icon pixbuf *iconpath = 0; strncatv(iconpath,199,zimagedir,"/",icon,null); err = stat(iconpath,&statB); if (err) { // alternative path cc = readlink("/proc/self/exe",iconpath,300); // get own program path if (cc > 0) iconpath[cc] = 0; // readlink() quirk pp = strrchr(iconpath,'/'); // folder of program if (pp) *pp = 0; strncatv(iconpath,300,"/icons/",icon,null); // .../icons/iconfile.png } pixbuf = gdk_pixbuf_new_from_file_at_scale(iconpath,tbIconSize,tbIconSize,1,&gerror); if (pixbuf) wicon = gtk_image_new_from_pixbuf(pixbuf); } tbutton = gtk_tool_button_new(wicon,blab); if (! wicon) gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(tbutton),"gtk-missing-image"); if (btip) gtk_tool_item_set_tooltip_text(tbutton,btip); gtk_tool_item_set_homogeneous(tbutton,0); gtk_toolbar_insert(GTK_TOOLBAR(wtbar),GTK_TOOL_ITEM(tbutton),-1); if (func) G_SIGNAL(tbutton,"clicked",func,blab); return (GtkWidget *) tbutton; } /**************************************************************************************/ // create a status bar and add to the start of a packing box GtkWidget * create_stbar(GtkWidget *pbox) { GtkWidget *stbar; stbar = gtk_statusbar_new(); gtk_box_pack_start(GTK_BOX(pbox),stbar,0,0,0); gtk_widget_show(stbar); return stbar; } // display message in status bar int stbar_message(GtkWidget *wstbar, ch *message) { static int ctx = -1; if (ctx == -1) ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(wstbar),"all"); gtk_statusbar_pop(GTK_STATUSBAR(wstbar),ctx); gtk_statusbar_push(GTK_STATUSBAR(wstbar),ctx,message); return 0; } /************************************************************************************** Popup Menu GtkWidget *popup, *mitem ch *label, *arg, *tip void func(GtkWidget *, ch *arg) popup = create_popmenu() create a popup menu mitem = add_popmenu(popup, label, func, arg, tip) add menu item to popup menu popup_menu(GtkWidget *parent, popup) popup the menu at mouse position Call 'create_popmenu' and then 'add_popmenu' for each item in the menu. 'label' is the menu name, 'func' the response function, 'arg' an argument for 'func', and 'tip' is a tool-tip. 'arg' and 'tip' may be null. A call to 'popup_menu' will show all menu entries at the mouse position. Clicking an entry will call the respective response function. Hovering on the entry will show the tool-tip. The response function looks like this: void func(GtkWidget *, ch *menu) ***/ // create a popup menu GtkWidget * create_popmenu() // event processing removed { if (! main_thread()) zappcrash("illegal call from thread"); GtkWidget *popmenu; popmenu = gtk_menu_new(); return popmenu; } // add a menu item to a popup menu void add_popmenu(GtkWidget *popmenu, ch *mname, cbFunc func, ch *arg, ch *mtip) { void popmenu_item_select(GtkWidget *, ch *mtip); GtkWidget *widget; widget = gtk_menu_item_new_with_label(mname); gtk_menu_shell_append(GTK_MENU_SHELL(popmenu),widget); if (func) { if (arg) G_SIGNAL(widget,"activate",func,arg); // call func with arg else G_SIGNAL(widget,"activate",func,mname); // call func with menu name } if (mtip) { G_SIGNAL(widget,"select",popmenu_item_select,mtip); G_SIGNAL(widget,"deselect",popmenu_item_select,0); } return; } // show popup tip for selected menu item void popmenu_item_select(GtkWidget *wmitem, ch *mtip) // convoluted code but it works { GdkWindow *window; int xp, yp, mx, my; window = gtk_widget_get_window(wmitem); gdk_window_get_origin(window,&xp,&yp); // menu screen origin xp += gdk_window_get_width(window); // + width gdk_device_get_position(zfuncs::mouse,0,&mx,&my); // mouse (x,y) screen position poptext_screen(mtip,xp,my,0,5); // popup px = menu + width, py = mouse return; } // Show a popup menu at current mouse position // GtkWidget * argument is not used void popup_menu(GtkWidget *widget, GtkWidget *popmenu) { gtk_widget_show_all(popmenu); // GTK change: show before popup gtk_menu_popup_at_pointer(GTK_MENU(popmenu),null); return; } /**************************************************************************************/ // popup picklist for user choice of zlist member ch * popup_choose_choice = 0; ch * popup_choose(zlist_t *zlist) { void popup_choose_choose(GtkWidget *, ch *); static GtkWidget *popmenu; static int busy = 0; int nl; ch *member; if (! main_thread()) zappcrash("illegal call from thread"); if (busy++) zappcrash("popup_choose() re-entry"); // 25.1 nl = zlist_count(zlist); if (! nl) { zmessageACK(mainwin,TX("popup_choose: empty list")); busy = 0; return 0; } popmenu = create_popmenu(); for (int ii = 0; ii < nl; ii++) { member = zlist_get(zlist,ii); if (member) add_popmenu(popmenu,member,popup_choose_choose,0,0); } add_popmenu(popmenu,TX("CLOSE"),popup_choose_choose,0,0); if (popup_choose_choice) { // 25.1 zfree(popup_choose_choice); popup_choose_choice = 0; } popup_menu(0,popmenu); while (! popup_choose_choice) { if (! gtk_widget_get_mapped(popmenu)) popup_choose_choice = "NONE"; // escape if menu abandoned zmainsleep(0.1); } if (strmatch(popup_choose_choice,"NONE")) popup_choose_choice = 0; busy = 0; return popup_choose_choice; } // popup_choose response function void popup_choose_choose(GtkWidget *, ch *choice) { if (! choice || strmatch(choice,TX("CLOSE"))) popup_choose_choice = zstrdup("NONE","zlist choose"); else popup_choose_choice = zstrdup(choice,"zlist choose"); return; } /**************************************************************************************/ // popup picklist from a text file and choose an entry (text line) ch * popup_choose(ch *file) // 25.1 { static zlist_t *picklist = 0; ch *choice = 0; if (! main_thread()) zappcrash("illegal call from thread"); if (picklist) zlist_free(picklist); picklist = zlist_from_file(file); if (! picklist) { zmessageACK(mainwin,TX("picklist file not found: %s"),file); return 0; } choice = popup_choose(picklist); return choice; } /************************************************************************************** Vertical Menu / Toolbar Build a custom vertical menu and/or toolbar in a vertical packing box Vmenu *vbm; ch *name, *icon, *desc, *arg; int iww, ihh; void func(GtkWidget *, ch *name); void RMfunc(GtkWidget *, ch *name); vbm = Vmenu_new(GtkWidget *vbox, float fgRGB[3], float bgRGB[3]); // create base menu Vmenu_add(vbm, name, icon, iww, ihh, desc, func, arg); // add left-mouse menu function Vmenu_add_setupfunc(vbm, me, func); // add opt. setup function Vmenu_add_RMfunc(vbm, me, func); // add right-mouse menu function Vmenu_block(int flag) 1 to block Vmenu, 0 to unblock Create a vertical menu / toolbar in a vertical packing box. fgRGB and bgRGB are font and background colors, RGB scaled 0-1.0 Added items can have a menu name, icon, description, response function, and function argument. 'name' and 'icon' can be null but not both. name menu name icon menu icon, filespec for a .png file iww, ihh size of icon in menu display desc optional tool tip if mouse is hovered over displayed menu When 'name/icon' is clicked, 'func' is called with 'arg'. If 'arg' is null, 'name' is used instead. To create a menu entry that is a popup menu with multiple entries, do as follows: popup = create_popmenu(); add_popup_menu_item(popup ...); see create_popmenu() add_popup_menu_item(popup ...); ... Vmenu_add(vbm, name, icon, ww, hh, desc, create_popmenu, (ch *) popup); i.e. use create_popmenu() as the response function and use the previously created menu 'popup' as the argument (cast to ch *). ***/ namespace Vmenunames { #define margin 10 // margins for menu text 25.1 PangoFontDescription *pfont1, *pfont2; PangoAttrList *pattrlist; PangoAttribute *pbackground; int fontheight; int Fblock = 0; void wpaint(GtkWidget *, cairo_t *, Vmenu *); // window repaint - draw event void mouse_event(GtkWidget *, GdkEventButton *, Vmenu *); // mouse event function void paint_menu(cairo_t *cr, Vmenu *vbm, int me, int hilite); // paint menu entry, opt. highlight } // create Vmenu Vmenu *Vmenu_new(GtkWidget *vbox, float fgRGB[3], float bgRGB[3]) { using namespace Vmenunames; int cc, ww, hh; int K64 = 65536; ch *menufont1, *menufont2; PangoLayout *playout; cc = sizeof(Vmenu); Vmenu *vbm = (Vmenu *) zmalloc(cc,"Vmenu"); vbm->fgRGB[0] = fgRGB[0]; // background color, RGB 0-1.0 vbm->fgRGB[1] = fgRGB[1]; vbm->fgRGB[2] = fgRGB[2]; vbm->bgRGB[0] = bgRGB[0]; // background color, RGB 0-1.0 vbm->bgRGB[1] = bgRGB[1]; vbm->bgRGB[2] = bgRGB[2]; vbm->vbox = vbox; vbm->topwin = gtk_widget_get_toplevel(vbox); vbm->layout = gtk_layout_new(0,0); vbm->mcount = 0; gtk_box_pack_start(GTK_BOX(vbox),vbm->layout,1,1,0); vbm->xmax = vbm->ymax = 10; // initial layout size pattrlist = pango_attr_list_new(); pbackground = pango_attr_background_new(K64*bgRGB[0],K64*bgRGB[1],K64*bgRGB[2]); pango_attr_list_change(pattrlist,pbackground); menufont1 = zstrdup(zfuncs::appfont,"Vmenu"); // set menu fonts, normal and bold menufont2 = zstrdup(zfuncs::appboldfont,"Vmenu"); pfont1 = pango_font_description_from_string(menufont1); pfont2 = pango_font_description_from_string(menufont2); playout = gtk_widget_create_pango_layout(vbm->layout,0); pango_layout_set_font_description(playout,pfont1); pango_layout_set_text(playout,"Ayg",-1); pango_layout_get_pixel_size(playout,&ww,&hh); fontheight = hh; gtk_widget_add_events(vbm->layout,GDK_BUTTON_PRESS_MASK); gtk_widget_add_events(vbm->layout,GDK_BUTTON_RELEASE_MASK); gtk_widget_add_events(vbm->layout,GDK_POINTER_MOTION_MASK); gtk_widget_add_events(vbm->layout,GDK_LEAVE_NOTIFY_MASK); G_SIGNAL(vbm->layout,"button-press-event",mouse_event,vbm); G_SIGNAL(vbm->layout,"button-release-event",mouse_event,vbm); G_SIGNAL(vbm->layout,"motion-notify-event",mouse_event,vbm); G_SIGNAL(vbm->layout,"leave-notify-event",mouse_event,vbm); G_SIGNAL(vbm->layout,"draw",wpaint,vbm); return vbm; } // add Vmenu entry with name, icon, description, menu function (left click) void Vmenu_add(Vmenu *vbm, ch *name, ch *icon, int iconww, int iconhh, ch *desc, cbFunc func, ch *arg) { using namespace Vmenunames; int me, cc, xpos, ww, hh; ch iconpath[200], *mdesc, *name__; ch *blanks = " "; // 20 blanks PIXBUF *pixbuf; GError *gerror = 0; PangoLayout *playout; PangoFontDescription *pfont; if (! name && ! icon) return; me = vbm->mcount++; // track no. menu entries if (name) vbm->menu[me].name = zstrdup(name,"Vmenu"); // create new menu entry from caller data if (icon) { vbm->menu[me].icon = zstrdup(icon,"Vmenu"); vbm->menu[me].iconww = iconww; vbm->menu[me].iconhh = iconhh; } if (desc) { // pad description with blanks for looks cc = strlen(desc); mdesc = (ch *) zmalloc(cc+3,"Vmenu"); mdesc[0] = ' '; strcpy(mdesc+1,desc); strcpy(mdesc+cc+1," "); vbm->menu[me].desc = mdesc; } vbm->menu[me].LMfunc = func; // left-mouse menu function vbm->menu[me].arg = name; // argument is menu name or arg if avail. if (arg) vbm->menu[me].arg = arg; vbm->menu[me].pixbuf = 0; if (icon) { // if icon is named, get pixbuf *iconpath = 0; strncatv(iconpath,199,zfuncs::zimagedir,"/",icon,null); pixbuf = gdk_pixbuf_new_from_file_at_scale(iconpath,iconww,iconhh,1,&gerror); if (pixbuf) vbm->menu[me].pixbuf = pixbuf; else printf("*** Vmenu no icon: %s \n",iconpath); } if (me == 0) vbm->ymax = margin; // first menu, top position vbm->menu[me].iconx = 0; vbm->menu[me].icony = 0; vbm->menu[me].namex = 0; vbm->menu[me].namey = 0; if (icon) { vbm->menu[me].iconx = margin; // ______ vbm->menu[me].icony = vbm->ymax; // | | if (name) { // | icon | menu name vbm->menu[me].namex = margin + iconww + margin; // |______| vbm->menu[me].namey = vbm->ymax + (iconhh - fontheight) / 2; // } vbm->menu[me].ylo = vbm->ymax; vbm->ymax += iconhh + iconhh / 8; // position for next menu entry vbm->menu[me].yhi = vbm->ymax; if (margin + iconww > vbm->xmax) vbm->xmax = margin + iconww; // keep track of max. layout width } else if (name) { vbm->menu[me].namex = margin; // menu name vbm->menu[me].namey = vbm->ymax; vbm->menu[me].ylo = vbm->ymax; vbm->ymax += 1.5 * fontheight; // more space between text lines vbm->menu[me].yhi = vbm->ymax; } vbm->menu[me].playout1 = gtk_widget_create_pango_layout(vbm->layout,0); vbm->menu[me].playout2 = gtk_widget_create_pango_layout(vbm->layout,0); if (name) { xpos = vbm->menu[me].namex; cc = strlen(name); // menu name with trailing blanks name__ = zstrdup(name,"Vmenu",22); // (long enough to overwrite bold name) strncpy0(name__+cc,blanks,20); playout = vbm->menu[me].playout1; // normal font pfont = pfont1; pango_layout_set_attributes(playout,pattrlist); pango_layout_set_font_description(playout,pfont); pango_layout_set_text(playout,name__,-1); // compute layout pango_layout_get_pixel_size(playout,&ww,&hh); // pixel width and height of layout playout = vbm->menu[me].playout2; // bold font pfont = pfont2; pango_layout_set_attributes(playout,pattrlist); pango_layout_set_font_description(playout,pfont); pango_layout_set_text(playout,name,-1); // compute layout pango_layout_get_pixel_size(playout,&ww,&hh); // pixel width and height of layout if (xpos + ww > vbm->xmax) vbm->xmax = xpos + ww; // keep track of max. layout width } gtk_widget_set_size_request(vbm->layout,vbm->xmax+margin,0); // add right margin to layout width return; } // add opt. setup function to existing menu entry void Vmenu_add_setup(Vmenu *vbm, int me, cbFunc func, ch *arg) { if (me > vbm->mcount-1) zappcrash("Vmenu_add_RMfunc() bad me: %d",me); vbm->menu[me].setupfunc = func; vbm->menu[me].setuparg = arg; return; } // add alternate function for right-mouse click void Vmenu_add_RMfunc(Vmenu *vbm, int me, cbFunc func, ch *arg) { if (me > vbm->mcount-1) zappcrash("Vmenu_add_RMfunc() bad me: %d",me); vbm->menu[me].RMfunc = func; vbm->menu[me].RMarg = arg; return; } // block or unblock menu void Vmenu_block(int flag) { using namespace Vmenunames; Fblock = flag; return; } // paint window when created, exposed, resized void Vmenunames::wpaint(GtkWidget *widget, cairo_t *cr, Vmenu *vbm) { using namespace Vmenunames; cairo_set_source_rgb(cr,vbm->bgRGB[0],vbm->bgRGB[1],vbm->bgRGB[2]); // background cairo_paint(cr); for (int me = 0; me < vbm->mcount; me++) // paint all menu entries paint_menu(cr,vbm,me,0); return; } // draw menu icon and text into layout void Vmenunames::paint_menu(cairo_t *cr, Vmenu *vbm, int me, int hilite) { using namespace Vmenunames; PIXBUF *pixbuf; PangoLayout *playout; int xpos, ypos; int iconww, iconhh; ch *name; pixbuf = vbm->menu[me].pixbuf; // icon if (pixbuf) { // draw menu icon at menu position xpos = vbm->menu[me].iconx; ypos = vbm->menu[me].icony; iconww = vbm->menu[me].iconww; iconhh = vbm->menu[me].iconhh; if (! hilite) { // erase box around icon cairo_set_source_rgb(cr,vbm->bgRGB[0],vbm->bgRGB[1],vbm->bgRGB[2]); // background cairo_rectangle(cr,xpos-1,ypos-1,iconww+2,iconhh+2); cairo_fill(cr); } gdk_cairo_set_source_pixbuf(cr,pixbuf,xpos,ypos); // draw icon cairo_paint(cr); if (hilite) { cairo_set_source_rgb(cr,vbm->fgRGB[0],vbm->fgRGB[1],vbm->fgRGB[2]); // draw box around icon cairo_set_line_width(cr,1); cairo_set_line_join(cr,CAIRO_LINE_JOIN_ROUND); cairo_rectangle(cr,xpos,ypos,iconww,iconhh); cairo_stroke(cr); } } name = vbm->menu[me].name; // menu text if (name) { // draw menu text at menu position xpos = vbm->menu[me].namex; ypos = vbm->menu[me].namey; cairo_move_to(cr,xpos,ypos); // draw layout with text cairo_set_source_rgb(cr,vbm->fgRGB[0],vbm->fgRGB[1],vbm->fgRGB[2]); if (hilite) playout = vbm->menu[me].playout2; else playout = vbm->menu[me].playout1; pango_cairo_show_layout(cr,playout); } return; } // mouse event function - capture buttons and drag movements void Vmenunames::mouse_event(GtkWidget *widget, GdkEventButton *event, Vmenu *vbm) { using namespace Vmenunames; GdkWindow *gdkwin; ch *desc; int me, mpx, mpy, button, ww, ylo, yhi; static int me0 = -1, Fmyclick = 0, winww = 0; static draw_context_t context; static GtkWidget *pwidget = 0; static cairo_t *cr = 0; if (widget != pwidget) { // widget changed if (pwidget) draw_context_destroy(context); gdkwin = gtk_layout_get_bin_window(GTK_LAYOUT(widget)); cr = draw_context_create(gdkwin,context); gdkwin = gtk_widget_get_window(widget); // get width of menu widget winww = gdk_window_get_width(gdkwin); pwidget = widget; } mpx = int(event->x); // mouse position mpy = int(event->y); button = event->button; if (button == 1 && (event->state & GDK_MOD1_MASK)) button = 3; // left butt + ALT key >> right butt if (event->type == GDK_MOTION_NOTIFY) // mouse inside layout { for (me = 0; me < vbm->mcount; me++) { // find menu where mouse is ylo = vbm->menu[me].ylo; yhi = vbm->menu[me].yhi; if (mpy < ylo) continue; if (mpy < yhi) break; } if (me != me0 && me0 >= 0) { // unhighlight prior paint_menu(cr,vbm,me0,0); me0 = -1; } if (me == me0) return; // same as before if (me == vbm->mcount) return; // no new menu match paint_menu(cr,vbm,me,1); // highlight menu entry at mouse desc = vbm->menu[me].desc; // show tool tip if (desc) poptext_widget(widget,desc,winww,mpy,0,5); // px = menu width, py = mouse 25.0 me0 = me; // remember last match return; } if (me0 >= 0) // mouse left layout { poptext_killnow(); // 25.0 paint_menu(cr,vbm,me0,0); // unhighlight prior me0 = -1; } if (event->type == GDK_BUTTON_PRESS) // menu entry clicked Fmyclick = 1; // button click is mine if (event->type == GDK_BUTTON_RELEASE) // menu entry clicked { if (Fblock) return; // menu is blocked if (! Fmyclick) return; // ignore unmatched button release Fmyclick = 0; // (from vanished popup window) for (me = 0; me < vbm->mcount; me++) { // look for clicked menu entry ylo = vbm->menu[me].ylo; yhi = vbm->menu[me].yhi; if (mpy < ylo) continue; if (mpy < yhi) break; } if (me == vbm->mcount) return; // no menu match zfuncs::vmenuclickbutton = button; // 1/2/3 = left/mid/right button ww = vbm->menu[me].iconww; // get horiz. click posn. on menu icon if (ww) mpx = 100 * (mpx - margin) / ww; // scale 0-100 else mpx = 0; if (mpx < 0) mpx = 0; if (mpx > 100) mpx = 100; zfuncs::vmenuclickposn = mpx; paint_menu(cr,vbm,me,0); // unhighlight menu if (vbm->menu[me].setupfunc) { // call opt. setup function vbm->menu[me].setupfunc(widget,vbm->menu[me].setuparg); if (vmenustop) { vmenustop = 0; return; } } if (button == 3 && vbm->menu[me].RMfunc) // if right mouse button, vbm->menu[me].RMfunc(widget,vbm->menu[me].RMarg); // call right-mouse function else if (vbm->menu[me].LMfunc) // call left-mouse menu function vbm->menu[me].LMfunc(widget,vbm->menu[me].arg); } return; } /************************************************************************************** spline curve setup and edit functions support multiple frames with multiple curves sd = splcurve_init(frame,callback_func) add draw area widget in dialog frame widget sd->Nspc = n Initialize no. of curves in frame sd->fact[spc] = 1 Initialize active flag for curve spc sd->vert[spc] = hv Initialize vert/horz flag for curve spc sd->nap[spc], sd->apx[spc][xx], sd->apy[spc][yy] Initialize anchor points for curve spc splcurve_generate(sd,spc) Generate data for curve spc Curves will now be shown inside the frame when window is realized. The callback_func(spc) will be called when curve spc is edited (mouse drag). Change curve in program: set anchor points, call splcurve_generate(sd,spc). yval = splcurve_yval(sd,spc,xval) Get y-value (0-1) for curve spc and given x-value (0-1) kk = 1000 * xval; If faster access to curve is needed (no interpolation) if (kk > 999) kk = 999; yval = sd->yval[spc][kk]; ***/ // initialize for spline curve editing // initial anchor points are pre-loaded into spldat before window is realized spldat * splcurve_init(GtkWidget *frame, void func(int spc)) { int cc = sizeof(spldat); // allocate spc curve data area spldat * sd = (spldat *) zmalloc(cc,"splcurve"); memset(sd,0,cc); sd->drawarea = gtk_drawing_area_new(); // drawing area for curves gtk_container_add(GTK_CONTAINER(frame),sd->drawarea); sd->spcfunc = func; // user callback function gtk_widget_add_events(sd->drawarea,GDK_BUTTON_PRESS_MASK); // connect mouse events to drawing area gtk_widget_add_events(sd->drawarea,GDK_BUTTON_RELEASE_MASK); gtk_widget_add_events(sd->drawarea,GDK_BUTTON1_MOTION_MASK); G_SIGNAL(sd->drawarea,"motion-notify-event",splcurve_adjust,sd); G_SIGNAL(sd->drawarea,"button-press-event",splcurve_adjust,sd); G_SIGNAL(sd->drawarea,"realize",splcurve_resize,sd); G_SIGNAL(sd->drawarea,"draw",splcurve_draw,sd); return sd; } // modify anchor points in curve using mouse int splcurve_adjust(void *, GdkEventButton *event, spldat *sd) { int ww, hh, kk; int mx, my, button, evtype; static int spc, ap, mbusy = 0, Fdrag = 0; // drag continuation logic int minspc, minap, apset = 0; float mxval, myval, cxval, cyval; float dist2, mindist2 = 0; float dist, dx, dy; float minx = 0.01 * splcurve_minx; // % to absolute distance mx = event->x; // mouse position in drawing area my = event->y; evtype = event->type; button = event->button; if (evtype == GDK_MOTION_NOTIFY) { if (mbusy) return 0; // discard excess motion events mbusy++; zmainloop(); mbusy = 0; } if (evtype == GDK_BUTTON_RELEASE) { Fdrag = 0; return 0; } ww = gtk_widget_get_allocated_width(sd->drawarea); // drawing area size hh = gtk_widget_get_allocated_height(sd->drawarea); if (mx < 0) mx = 0; // limit edge excursions if (mx > ww) mx = ww; if (my < 0) my = 0; if (my > hh) my = hh; if (evtype == GDK_BUTTON_PRESS) Fdrag = 0; // left or right click if (Fdrag) // continuation of drag { if (sd->vert[spc]) { mxval = 1.0 * my / hh; // mouse position in curve space myval = 1.0 * mx / ww; } else { mxval = 1.0 * mx / ww; myval = 1.0 * (hh - my) / hh; } if (ap < sd->nap[spc] - 1) { // not the last anchor point dx = sd->apx[spc][ap+1] - mxval; // get distance to next anchor point if (dx < 0.01) return 0; // x-value not increasing, forbid dy = sd->apy[spc][ap+1] - myval; dist = sqrtf(dx * dx + dy * dy); if (dist < minx) return 0; // too close, forbid } if (ap > 0) { // not the first anchor point dx = mxval - sd->apx[spc][ap-1]; // get distance to prior anchor point if (dx < 0.01) return 0; // x-value not increasing, forbid dy = myval - sd->apy[spc][ap-1]; dist = sqrtf(dx * dx + dy * dy); if (dist < minx) return 0; // too close, forbid } apset = 1; // mxval/myval = new node position } else // mouse click or new drag begin { minspc = minap = -1; // find closest curve/anchor point mindist2 = 999999; for (spc = 0; spc < sd->Nspc; spc++) // loop curves { if (! sd->fact[spc]) continue; // not active if (sd->vert[spc]) { mxval = 1.0 * my / hh; // mouse position in curve space myval = 1.0 * mx / ww; } else { mxval = 1.0 * mx / ww; myval = 1.0 * (hh - my) / hh; } for (ap = 0; ap < sd->nap[spc]; ap++) // loop anchor points { cxval = sd->apx[spc][ap]; cyval = sd->apy[spc][ap]; dist2 = (mxval-cxval)*(mxval-cxval) + (myval-cyval)*(myval-cyval); if (dist2 < mindist2) { mindist2 = dist2; // remember closest anchor point minspc = spc; minap = ap; } } } if (minspc < 0) return 0; // impossible spc = minspc; // nearest curve ap = minap; // nearest anchor point } if (evtype == GDK_BUTTON_PRESS && button == 3) // right click, remove anchor point { if (sqrtf(mindist2) > minx) return 0; // not close enough if (sd->nap[spc] < 3) return 0; // < 2 anchor points would remain sd->nap[spc]--; // decr. before loop for (kk = ap; kk < sd->nap[spc]; kk++) { sd->apx[spc][kk] = sd->apx[spc][kk+1]; sd->apy[spc][kk] = sd->apy[spc][kk+1]; } splcurve_generate(sd,spc); // regenerate data for modified curve gtk_widget_queue_draw(sd->drawarea); sd->spcfunc(spc); // call user function return 0; } if (! Fdrag) // new drag or left click { if (sd->vert[spc]) { mxval = 1.0 * my / hh; // mouse position in curve space myval = 1.0 * mx / ww; } else { mxval = 1.0 * mx / ww; myval = 1.0 * (hh - my) / hh; } if (sqrtf(mindist2) < minx) // anchor point close enough, { // move this one to mouse position if (ap < sd->nap[spc]-1) { // not the last anchor point dx = sd->apx[spc][ap+1] - mxval; // get distance to next anchor point if (dx < 0.01) return 0; // x-value not increasing, forbid dy = sd->apy[spc][ap+1] - myval; dist = sqrtf(dx * dx + dy * dy); if (dist < minx) return 0; // too close, forbid } if (ap > 0) { // not the first anchor point dx = mxval - sd->apx[spc][ap-1]; // get distance to prior anchor point if (dx < 0.01) return 0; // x-value not increasing, forbid dy = myval - sd->apy[spc][ap-1]; dist = sqrtf(dx * dx + dy * dy); if (dist < minx) return 0; // too close, forbid } apset = 1; // mxval/myval = new node position } else // none close, add new anchor point { minspc = -1; // find closest curve to mouse mindist2 = 999999; for (spc = 0; spc < sd->Nspc; spc++) // loop curves { if (! sd->fact[spc]) continue; // not active if (sd->vert[spc]) { mxval = 1.0 * my / hh; // mouse position in curve space myval = 1.0 * mx / ww; } else { mxval = 1.0 * mx / ww; myval = 1.0 * (hh - my) / hh; } cyval = splcurve_yval(sd,spc,mxval); dist2 = fabsf(myval - cyval); if (dist2 < mindist2) { mindist2 = dist2; // remember closest curve minspc = spc; } } if (minspc < 0) return 0; // impossible if (mindist2 > minx) return 0; // not close enough to any curve spc = minspc; if (sd->nap[spc] > 49) { zmessageACK(mainwin,TX("Exceed 50 anchor points")); return 0; } if (sd->vert[spc]) { mxval = 1.0 * my / hh; // mouse position in curve space myval = 1.0 * mx / ww; } else { mxval = 1.0 * mx / ww; myval = 1.0 * (hh - my) / hh; } for (ap = 0; ap < sd->nap[spc]; ap++) // find anchor point with next higher x if (mxval <= sd->apx[spc][ap]) break; // (ap may come out 0 or nap) if (ap < sd->nap[spc] && sd->apx[spc][ap] - mxval < minx) // disallow < minx from next return 0; // or prior anchor point if (ap > 0 && mxval - sd->apx[spc][ap-1] < minx) return 0; for (kk = sd->nap[spc]; kk > ap; kk--) { // make hole for new point sd->apx[spc][kk] = sd->apx[spc][kk-1]; sd->apy[spc][kk] = sd->apy[spc][kk-1]; } sd->nap[spc]++; // up point count apset = 1; // mxval/myval = new node position } } if (evtype == GDK_MOTION_NOTIFY) Fdrag = 1; // remember drag is underway if (apset) { sd->apx[spc][ap] = mxval; // new or moved anchor point sd->apy[spc][ap] = myval; // at mouse position splcurve_generate(sd,spc); // regenerate data for modified curve if (sd->drawarea) gtk_widget_queue_draw(sd->drawarea); // redraw graph if (sd->spcfunc) sd->spcfunc(spc); // call user function } return 0; } // add a new anchor point to a curve // spc: curve number // px, py: node coordinates in the range 0-1 int splcurve_addnode(spldat *sd, int spc, float px, float py) { int ap, kk; float minx = 0.01 * splcurve_minx; // % to absolute distance for (ap = 0; ap < sd->nap[spc]; ap++) // find anchor point with next higher x if (px <= sd->apx[spc][ap]) break; // (ap may come out 0 or nap) if (ap < sd->nap[spc] && sd->apx[spc][ap] - px < minx) // disallow < minx from next return 0; // or prior anchor point if (ap > 0 && px - sd->apx[spc][ap-1] < minx) return 0; for (kk = sd->nap[spc]; kk > ap; kk--) { // make hole for new point sd->apx[spc][kk] = sd->apx[spc][kk-1]; sd->apy[spc][kk] = sd->apy[spc][kk-1]; } sd->apx[spc][ap] = px; // add node coordinates sd->apy[spc][ap] = py; sd->nap[spc]++; // up point count return 1; } // if height/width too small, make bigger int splcurve_resize(GtkWidget *drawarea) { int ww, hh; gtk_widget_get_size_request(drawarea,&ww,&hh); if (hh < 50) gtk_widget_set_size_request(drawarea,ww,50); return 1; } // for expose event or when a curve is changed // draw all curves based on current anchor points int splcurve_draw(GtkWidget *drawarea, cairo_t *cr, spldat *sd) { int ww, hh, spc, ap; float xval, yval, px, py, qx, qy; if (! sd || ! sd->drawarea) return 0; // 25.0 ww = gtk_widget_get_allocated_width(sd->drawarea); // drawing area size hh = gtk_widget_get_allocated_height(sd->drawarea); if (ww < 50 || hh < 50) return 0; cairo_set_line_width(cr,1); cairo_set_source_rgb(cr,0.7,0.7,0.7); for (int ii = 0; ii < sd->Nscale; ii++) // draw y-scale lines if any { px = ww * sd->xscale[0][ii]; py = hh - hh * sd->yscale[0][ii]; qx = ww * sd->xscale[1][ii]; qy = hh - hh * sd->yscale[1][ii]; cairo_move_to(cr,px,py); cairo_line_to(cr,qx,qy); } cairo_stroke(cr); cairo_set_source_rgb(cr,0,0,0); for (spc = 0; spc < sd->Nspc; spc++) // loop all curves { if (! sd->fact[spc]) continue; // not active if (sd->vert[spc]) // vert. curve { for (py = 0; py < hh; py++) // generate all points for curve { xval = 1.0 * py / hh; yval = splcurve_yval(sd,spc,xval); px = ww * yval; if (py == 0) cairo_move_to(cr,px,py); cairo_line_to(cr,px,py); } cairo_stroke(cr); for (ap = 0; ap < sd->nap[spc]; ap++) // draw boxes at anchor points { xval = sd->apx[spc][ap]; yval = sd->apy[spc][ap]; px = ww * yval; py = hh * xval; cairo_rectangle(cr,px-2,py-2,4,4); } cairo_fill(cr); } else // horz. curve { for (px = 0; px < ww; px++) // generate all points for curve { xval = 1.0 * px / ww; yval = splcurve_yval(sd,spc,xval); py = hh - hh * yval; if (px == 0) cairo_move_to(cr,px,py); cairo_line_to(cr,px,py); } cairo_stroke(cr); for (ap = 0; ap < sd->nap[spc]; ap++) // draw boxes at anchor points { xval = sd->apx[spc][ap]; yval = sd->apy[spc][ap]; px = ww * xval; py = hh - hh * yval; cairo_rectangle(cr,px-2,py-2,4,4); } cairo_fill(cr); } } return 0; } // generate all curve data points when anchor points are modified int splcurve_generate(spldat *sd, int spc) { int kk, kklo, kkhi; float xval, yvalx; spline1(sd->nap[spc],sd->apx[spc],sd->apy[spc]); // compute curve fitting anchor points kklo = 1000 * sd->apx[spc][0] - 30; // xval range = anchor point range if (kklo < 0) kklo = 0; // + 0.03 extra below/above kkhi = 1000 * sd->apx[spc][sd->nap[spc]-1] + 30; if (kkhi > 1000) kkhi = 1000; for (kk = 0; kk < 1000; kk++) // generate all points for curve { xval = 0.001 * kk; // remove anchor point limits yvalx = spline2(xval); if (yvalx < 0) yvalx = 0; // yval < 0 not allowed, > 1 OK sd->yval[spc][kk] = yvalx; } sd->mod[spc] = 1; // mark curve modified return 0; } // Retrieve curve data using interpolation of saved table of values float splcurve_yval(spldat *sd, int spc, float xval) { int ii; float x1, x2, y1, y2, y3; if (xval <= 0) return sd->yval[spc][0]; if (xval >= 0.999) return sd->yval[spc][999]; x2 = 1000.0 * xval; ii = x2; x1 = ii; y1 = sd->yval[spc][ii]; y2 = sd->yval[spc][ii+1]; y3 = y1 + (y2 - y1) * (x2 - x1); return y3; } // load curve data from a file // returns 0 if success, sd is initialized from file data // returns 1 if fail (invalid file data), sd not modified int splcurve_load(spldat *sd, FILE *fid) { ch *pp, buff[300]; int nn, ii, jj, err, myfid = 0; int Nspc, fact[10], vert[10], nap[10]; float apx[10][50], apy[10][50]; pp = fgets_trim(buff,300,fid,1); if (! pp) goto fail; nn = sscanf(pp,"%d",&Nspc); // no. of curves if (nn != 1) goto fail; if (Nspc < 1 || Nspc > 10) goto fail; if (Nspc != sd->Nspc) goto fail; for (ii = 0; ii < Nspc; ii++) // loop each curve { pp = fgets_trim(buff,300,fid,1); if (! pp) goto fail; nn = sscanf(pp,"%d %d %d",&fact[ii],&vert[ii],&nap[ii]); // active flag, vert flag, anchors if (nn != 3) goto fail; if (fact[ii] < 0 || fact[ii] > 1) goto fail; if (vert[ii] < 0 || vert[ii] > 1) goto fail; if (nap[ii] < 2 || nap[ii] > 50) goto fail; pp = fgets_trim(buff,300,fid,1); // anchor points: nnn/nnn nnn/nnn ... for (jj = 0; jj < nap[ii]; jj++) // anchor point values { pp = (ch *) substring(buff,"/ ",2*jj+1); if (! pp) goto fail; err = convSF(pp,apx[ii][jj],0,1); if (err) goto fail; pp = (ch *) substring(buff,"/ ",2*jj+2); if (! pp) goto fail; err = convSF(pp,apy[ii][jj],0,1); if (err) goto fail; } } if (myfid) fclose(fid); sd->Nspc = Nspc; // copy curve data to caller's arg for (ii = 0; ii < Nspc; ii++) { sd->fact[ii] = fact[ii]; sd->vert[ii] = vert[ii]; sd->nap[ii] = nap[ii]; for (jj = 0; jj < nap[ii]; jj++) { sd->apx[ii][jj] = apx[ii][jj]; sd->apy[ii][jj] = apy[ii][jj]; } } for (ii = 0; ii < Nspc; ii++) // generate curve data from anchor points splcurve_generate(sd,ii); if (sd->drawarea) // redraw all curves gtk_widget_queue_draw(sd->drawarea); return 0; // success fail: if (fid && myfid) fclose(fid); zmessageACK(mainwin,TX("curve file is invalid")); return 1; } // save curve data to a file int splcurve_save(spldat *sd, FILE *fid) { int ii, jj, myfid = 0; fprintf(fid,"%d \n",sd->Nspc); // no. of curves for (ii = 0; ii < sd->Nspc; ii++) // loop each curve { fprintf(fid,"%d %d %d \n",sd->fact[ii],sd->vert[ii],sd->nap[ii]); // active flag, vert flag, anchors for (jj = 0; jj < sd->nap[ii]; jj++) // anchor point values fprintf(fid,"%.4f/%.4f ",sd->apx[ii][jj],sd->apy[ii][jj]); fprintf(fid,"\n"); } if (myfid) fclose(fid); return 0; } /************************************************************************************** simplified GTK dialog functions create a dialog with response buttons (OK, cancel ...) add widgets to dialog (button, text entry, combo box ...) put data into widgets (text or numeric data) run the dialog, get user inputs (button press, text entry, checkbox selection ...) run caller event function when widgets change from user inputs run caller event function when dialog is completed or canceled get dialog completion status (OK, cancel, destroyed ...) get data from dialog widgets (the user inputs) destroy the dialog and free memory ***************************************************************************************/ // private functions for widget events and dialog completion int zdialog_widget_event(GtkWidget *, zdialog *zd); int zdialog_delete_event(GtkWidget *, GdkEvent *, zdialog *zd); int zdialog_zspin_event(GtkWidget *, GdkEvent *, zdialog *zd); // "zspin" widget // create a new zdialog dialog // The title and parent arguments may be null. // optional arguments: up to zdmaxbutts button labels followed by null // returned dialog status: +N = button N (1 to zdmaxbutts) // <0 = [x] button or other GTK destroy action // completion buttons are also events like other widgets // all dialogs run parallel, use zdialog_wait() if needed // The status returned by zdialog_wait() corresponds to the button // (1-10) used to end the dialog. Status < 0 indicates the [x] button // was used or the dialog was killed by the program itself. zdialog * zdialog_new(ch *title, GtkWidget *parent, ...) // completion buttons ending with null { zdialog *zd; GtkWidget *dialog, *hbox, *vbox, *butt, *hsep; ch *bulab[zdmaxbutts]; int cc, ii, nbu; va_list arglist; static int uniqueID = 1; if (! main_thread()) zappcrash("illegal call from thread"); va_start(arglist,parent); for (nbu = 0; nbu < zdmaxbutts; nbu++) { // get completion buttons bulab[nbu] = va_arg(arglist, ch *); if (! bulab[nbu]) break; } va_end(arglist); if (! title) title = ""; dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(dialog),title); vbox = gtk_box_new(VERTICAL,0); // vertical packing box gtk_container_add(GTK_CONTAINER(dialog),vbox); // add to main window gtk_window_set_default_size(GTK_WINDOW(dialog),10,10); // stop auto width of 150 pixels if (parent) gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(parent)); gtk_box_set_spacing(GTK_BOX(vbox),2); gtk_container_set_border_width(GTK_CONTAINER(vbox),5); cc = sizeof(zdialog); // allocate zdialog zd = (zdialog *) zmalloc(cc,"zdialog"); if (zdialog_count == zdialog_max) { // add to active list for (ii = 0; ii < zdialog_count; ii++) printf("*** dialog: %s \n",zdialog_list[ii]->widget[0].data); zappcrash("max. zdialogs exceeded"); } zdialog_list[zdialog_count] = zd; zdialog_count++; if (nbu) { // completion buttons hbox = gtk_box_new(HORIZONTAL,2); // add hbox for buttons at bottom gtk_box_pack_end(GTK_BOX(vbox),hbox,0,0,2); hsep = gtk_separator_new(HORIZONTAL); // add separator line gtk_box_pack_end(GTK_BOX(vbox),hsep,0,0,5); for (ii = nbu-1; ii >= 0; ii--) { // add buttons to hbox butt = gtk_button_new_with_label(bulab[ii]); // reverse order nbu-1...0 gtk_box_pack_end(GTK_BOX(hbox),butt,0,0,2); G_SIGNAL(butt,"clicked",zdialog_widget_event,zd); // connect to event function zd->compwidget[ii] = butt; // save button widgets zd->compbutton[ii] = bulab[ii]; // and button labels } } zd->compbutton[nbu] = 0; // mark EOL zd->dialog = dialog; // dialog window zd->title = zstrdup(title,"zdialog"); // dialog title zd->parent = parent; // parent window zd->sentinel1 = zdsentinel | (lrandz() & 0x0000FFFF); // validity sentinels zd->sentinel2 = zd->sentinel1; // fixed part + random part zd->uniqueID = uniqueID++; // increment unique ID zd->eventCB = 0; // no user event callback function zd->zstat = 0; // no zdialog status zd->disabled = 1; // widget signals disabled zd->saveposn = 0; // position not saved zd->widget[0].wname = "dialog"; // set up 1st widget = dialog zd->widget[0].type = "dialog"; zd->widget[0].pname = 0; // no parent zd->widget[0].data = zstrdup(title,"zdialog"); zd->widget[0].widget = dialog; zd->widget[1].type = 0; // eof - no contained widgets yet return zd; } // change a zdialog title void zdialog_set_title(zdialog *zd, ch *title) { if (! main_thread()) zappcrash("illegal call from thread"); gtk_window_set_title(GTK_WINDOW(zd->widget[0].widget),title); return; } // set a zdialog to be modal void zdialog_set_modal(zdialog *zd) { if (! main_thread()) zappcrash("illegal call from thread"); GtkWidget *widget = zdialog_gtkwidget(zd,"dialog"); gtk_window_set_modal(GTK_WINDOW(widget),1); gtk_window_set_keep_above(GTK_WINDOW(widget),1); return; } // set a zdialog to be decorated or not void zdialog_set_decorated(zdialog *zd, int decorated) { void zdialog_drag(GtkWidget *widget, GdkEventButton *event, void *); GtkWidget *widget; if (! main_thread()) zappcrash("illegal call from thread"); widget = zdialog_gtkwidget(zd,"dialog"); gtk_window_set_decorated(GTK_WINDOW(widget),decorated); if (decorated) return; gtk_widget_add_events(widget,GDK_BUTTON_PRESS_MASK); gtk_widget_add_events(widget,GDK_BUTTON_RELEASE_MASK); gtk_widget_add_events(widget,GDK_POINTER_MOTION_MASK); G_SIGNAL(widget,"button-press-event",zdialog_drag,0); // connect mouse events to drag G_SIGNAL(widget,"button-release-event",zdialog_drag,0); // undecorated window G_SIGNAL(widget,"motion-notify-event",zdialog_drag,0); return; } void zdialog_drag(GtkWidget *widget, GdkEventButton *event, void *) { static int bdown = 0, type; static int mx0, my0, mx, my; static int wx0, wy0, wx, wy; if (! main_thread()) zappcrash("illegal call from thread"); type = event->type; gdk_device_get_position(zfuncs::mouse,0,&mx,&my); // mouse position in monitor if (type == GDK_BUTTON_PRESS) { bdown = 1; mx0 = mx; // drag start my0 = my; gtk_window_get_position(GTK_WINDOW(widget),&wx0,&wy0); // initial window position } if (type == GDK_BUTTON_RELEASE) bdown = 0; if (type == GDK_MOTION_NOTIFY) { if (! bdown) return; wx = wx0 + mx - mx0; wy = wy0 + my - my0; gtk_window_move(GTK_WINDOW(widget),wx,wy); } return; } // present a zdialog (visible and on top) void zdialog_present(zdialog *zd) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid2(zd)) return; gtk_window_present(GTK_WINDOW(zd->dialog)); return; } // set focus on dialog window or window and named widget // (widget name may be null or missing) // see also: gtk_window_activate_focus(GtkWindow *) void zdialog_set_focus(zdialog *zd, ch *wname) { GtkWindow *window; GtkWidget *widget; if (! main_thread()) zappcrash("illegal call from thread"); window = GTK_WINDOW(zd->dialog); if (wname) widget = zdialog_gtkwidget(zd,wname); else widget = 0; if (wname) gtk_window_set_focus(window,widget); else gtk_window_activate_focus(window); return; } // add widget to existing zdialog // // Arguments after parent are optional and default to 0. // zd zdialog *, created with zdialog_new() // type string, one of the widget types listed below // wname string, widget name, used to stuff or fetch widget data // parent string, parent name: "dialog" or a previously added container widget // data string, initial data for widget (label name, entry string, spin value, etc.) // size cc for text entry or pixel size for image widget // homog for hbox or vbox to make even space allocation for contained widgets // expand widget should expand with dialog box expansion // space extra space between this widget and neighbors, pixels // wrap allow text to wrap at right margin // // data can be a string ("initial widget data") or a number in string form ("12.345") // data for togbutt / check / radio: use "0" or "1" for OFF or ON // data for spin / zspin / hscale / vscale: use "min|max|step|value" (default: 0 | 100 | 1 | 50) // data for colorbutt: use "rrr|ggg|bbb" with values 0-255 for each RGB color. // This format is used to initialize the control and read back when user selects a color. // Multiple radio buttons with same parent are a group: pressing one turns the others OFF. int zdialog_add_widget_long ( zdialog *zd, ch *type, ch *wname, ch *pname, // mandatory args ch *data, int size, int homog, int expand, int space, int wrap) // optional args (default = 0) { int textview_focus_in_event(GtkWidget *widget); // for popup_text insertion int zdialog_activate_event(GtkWidget *, zdialog *zd); GtkWidget *widget = 0, *pwidget = 0, *fwidget = 0; GtkWidget *image, *vbox; GtkTextBuffer *editBuff = 0; PIXBUF *pixbuf = 0; GdkRGBA gdkrgba; GError *gerror = 0; ch *pp, *ptype = 0; ch vdata[30], iconpath[200]; double min, max, step, val; double f256 = 1.0 / 256.0; int iiw, iip, kk, err; if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) zappcrash("zdialog invalid"); for (iiw = 1; zd->widget[iiw].type; iiw++); // find next avail. slot if (iiw > zdmaxwidgets-2) zappcrash("too many widgets: %d",iiw); zd->widget[iiw].type = zstrdup(type,"zdialog"); // initz. widget struct zd->widget[iiw].wname = zstrdup(wname,"zdialog"); zd->widget[iiw].pname = zstrdup(pname,"zdialog"); zd->widget[iiw].data = 0; zd->widget[iiw].size = size; zd->widget[iiw].homog = homog; zd->widget[iiw].expand = expand; zd->widget[iiw].space = space; zd->widget[iiw].wrap = wrap; zd->widget[iiw].widget = 0; zd->widget[iiw+1].type = 0; // set new EOF marker if (strmatchV(type,"dialog","hbox","vbox","hsep","vsep","frame","scrwin", "label","link","entry","zentry","zedit","text","report", "button","zbutton","togbutt","check","radio", "imagebutt","colorbutt","combo","spin","zspin", "hscale","hscale2","vscale","icon","image",null) == 0) { printf("*** zdialog, bad widget type: %s \n",type); return 0; } for (iip = iiw-1; iip >= 0; iip--) // find parent (container) widget if (strmatch(pname,zd->widget[iip].wname)) break; if (iip < 0) zappcrash("zdialog, no parent for widget: %s",wname); pwidget = zd->widget[iip].widget; // parent widget, type ptype = zd->widget[iip].type; if (strmatchV(ptype,"dialog","hbox","vbox","frame","scrwin",null) == 0) zappcrash("zdialog, bad widget parent type: %s",ptype); if (strmatch(type,"hbox")) widget = gtk_box_new(HORIZONTAL,space); // expandable container boxes if (strmatch(type,"vbox")) widget = gtk_box_new(VERTICAL,space); if (strstr("hbox vbox",type)) gtk_box_set_homogeneous(GTK_BOX(widget),homog); if (strmatch(type,"hsep")) widget = gtk_separator_new(HORIZONTAL); // horiz. & vert. separators if (strmatch(type,"vsep")) widget = gtk_separator_new(VERTICAL); if (strmatch(type,"frame")) { // frame around contained widgets widget = gtk_frame_new(data); gtk_frame_set_shadow_type(GTK_FRAME(widget),GTK_SHADOW_IN); data = 0; } if (strmatch(type,"scrwin")) { // scrolled window container widget = gtk_scrolled_window_new(0,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_overlay_scrolling(GTK_SCROLLED_WINDOW(widget),0); data = 0; } if (strmatch(type,"label")) { // label (static text) widget = gtk_label_new(data); if (size) gtk_label_set_width_chars(GTK_LABEL(widget),size); if (data && strstr(data,"> link G_SIGNAL(widget,"clicked",zdialog_widget_event,zd); data = 0; } if (strmatch(type,"entry")) { // text input, single line widget = gtk_entry_new(); if (data) gtk_entry_set_text(GTK_ENTRY(widget),data); if (size) gtk_entry_set_width_chars(GTK_ENTRY(widget),size); G_SIGNAL(widget,"changed",zdialog_widget_event,zd); G_SIGNAL(widget,"activate",zdialog_activate_event,zd); } if (strmatch(type,"zentry")) { // text input, single line widget = gtk_text_view_new(); gtk_text_view_set_top_margin(GTK_TEXT_VIEW(widget),2); gtk_text_view_set_bottom_margin(GTK_TEXT_VIEW(widget),2); gtk_text_view_set_left_margin(GTK_TEXT_VIEW(widget),5); if (! size) size = 10; // scale widget for font size gtk_widget_set_size_request(widget,size*appfontsize,2*appfontsize); gtk_text_view_set_editable(GTK_TEXT_VIEW(widget),1); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget),GTK_WRAP_NONE); // this does nothing GTK bug gtk_text_view_set_accepts_tab(GTK_TEXT_VIEW(widget),0); editBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); if (data) gtk_text_buffer_set_text(editBuff,data,-1); G_SIGNAL(editBuff,"changed",zdialog_widget_event,zd); // buffer signals, not widget G_SIGNAL(widget,"focus-in-event",textview_focus_in_event,widget); // for popup_text inserts } if (strmatch(type,"zedit")) { // text input, opt. multi-line widget = gtk_text_view_new(); gtk_text_view_set_top_margin(GTK_TEXT_VIEW(widget),2); gtk_text_view_set_bottom_margin(GTK_TEXT_VIEW(widget),2); gtk_text_view_set_left_margin(GTK_TEXT_VIEW(widget),5); if (! size) size = 10; // scale widget for font size gtk_widget_set_size_request(widget,size*appfontsize,2*appfontsize); gtk_text_view_set_editable(GTK_TEXT_VIEW(widget),1); if (wrap) gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget),GTK_WRAP_WORD); gtk_text_view_set_accepts_tab(GTK_TEXT_VIEW(widget),0); editBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); if (data) gtk_text_buffer_set_text(editBuff,data,-1); G_SIGNAL(editBuff,"changed",zdialog_widget_event,zd); // buffer signals, not widget G_SIGNAL(widget,"focus-in-event",textview_focus_in_event,widget); // for popup_text inserts } if (strmatch(type,"text") || strmatch(type,"report")) { // text output (not editable) widget = gtk_text_view_new(); gtk_text_view_set_top_margin(GTK_TEXT_VIEW(widget),2); gtk_text_view_set_bottom_margin(GTK_TEXT_VIEW(widget),2); gtk_text_view_set_left_margin(GTK_TEXT_VIEW(widget),5); if (wrap) gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget),GTK_WRAP_WORD); editBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); if (data) gtk_text_buffer_set_text(editBuff,data,-1); gtk_text_view_set_editable(GTK_TEXT_VIEW(widget),0); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(widget),0); if (strmatch(type,"text")) gtk_widget_set_can_focus(widget,0); // inactivate KB navi keys type = "text"; } if (strmatch(type,"button")) { // button widget = gtk_button_new_with_label(data); G_SIGNAL(widget,"clicked",zdialog_widget_event,zd); data = 0; } if (strmatch(type,"zbutton")) { // checkbox used as small button if (data) widget = gtk_check_button_new_with_label(data); else widget = gtk_check_button_new(); G_SIGNAL(widget,"toggled",zdialog_widget_event,zd); data = "0"; // default data } if (strmatch(type,"togbutt")) { // toggle button widget = gtk_toggle_button_new_with_label(data); G_SIGNAL(widget,"toggled",zdialog_widget_event,zd); data = "0"; // default data } if (strmatch(type,"imagebutt")) { // button with image snprintf(iconpath,200,"%s/%s",get_zimagedir(),data); data = 0; pixbuf = gdk_pixbuf_new_from_file_at_scale(iconpath,size,size,1,&gerror); if (pixbuf) { image = gtk_image_new_from_pixbuf(pixbuf); g_object_unref(pixbuf); } else image = gtk_image_new_from_icon_name("missing",GTK_ICON_SIZE_BUTTON); widget = gtk_button_new_with_label(data); gtk_button_set_image(GTK_BUTTON(widget),image); G_SIGNAL(widget,"clicked",zdialog_widget_event,zd); } if (strmatch(type,"colorbutt")) { // color edit button if (! data) data = "0|0|0"; // data format: "nnn|nnn|nnn" = RGB pp = substring(data,'|',1); gdkrgba.red = f256 * atoi(pp); // RGB values are 0-1 pp = substring(data,'|',2); gdkrgba.green = f256 * atoi(pp); pp = substring(data,'|',3); gdkrgba.blue = f256 * atoi(pp); gdkrgba.alpha = 1.0; widget = gtk_color_button_new_with_rgba(&gdkrgba); G_SIGNAL(widget,"color-set",zdialog_widget_event,zd); } if (strmatch(type,"check")) { // checkbox if (data) widget = gtk_check_button_new_with_label(data); else widget = gtk_check_button_new(); G_SIGNAL(widget,"toggled",zdialog_widget_event,zd); data = "0"; // default data } if (strmatch(type,"combo")) { // combo box widget = gtk_combo_box_text_new(); G_SIGNAL(widget,"changed",zdialog_widget_event,zd); G_SIGNAL(widget,"popdown",zdialog_widget_event,zd); // fails for wayland } if (strmatch(type,"radio")) { // radio button for (kk = iip+1; kk <= iiw; kk++) if (strmatch(zd->widget[kk].pname,pname) && // find first radio button strmatch(zd->widget[kk].type,"radio")) break; // with same container if (kk == iiw) widget = gtk_radio_button_new_with_label(null,data); // this one is first else widget = gtk_radio_button_new_with_label_from_widget // not first, add to group (GTK_RADIO_BUTTON(zd->widget[kk].widget),data); G_SIGNAL(widget,"toggled",zdialog_widget_event,zd); data = "0"; // default data } if (strmatchV(type,"spin","hscale","hscale2","vscale",null)) { // spin button or sliding scale if (! data) zappcrash("zdialog_add_widget(): data missing"); // "min|max|step|value" pp = substring(data,'|',1); err = convSD(pp,min); pp = substring(data,'|',2); err += convSD(pp,max); pp = substring(data,'|',3); err += convSD(pp,step); pp = substring(data,'|',4); err += convSD(pp,val); if (err) zappcrash("zdialog_add_widget(): bad data: %s",data); zd->widget[iiw].lolim = min; zd->widget[iiw].hilim = max; zd->widget[iiw].step = step; if (strmatch(type,"spin")) { widget = gtk_spin_button_new_with_range(min,max,step); gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget),val); } if (strmatch(type,"hscale")) { widget = gtk_scale_new_with_range(HORIZONTAL,min,max,step); gtk_range_set_value(GTK_RANGE(widget),val); gtk_scale_set_draw_value(GTK_SCALE(widget),0); gtk_scale_set_has_origin(GTK_SCALE(widget),0); } if (strmatch(type,"hscale2")) { // add digital value on the right widget = gtk_scale_new_with_range(HORIZONTAL,min,max,step); gtk_range_set_value(GTK_RANGE(widget),val); gtk_scale_set_draw_value(GTK_SCALE(widget),1); gtk_scale_set_value_pos(GTK_SCALE(widget),GTK_POS_RIGHT); gtk_scale_set_has_origin(GTK_SCALE(widget),0); } if (strmatch(type,"vscale")) { widget = gtk_scale_new_with_range(VERTICAL,min,max,step); gtk_range_set_value(GTK_RANGE(widget),val); gtk_scale_set_draw_value(GTK_SCALE(widget),0); } G_SIGNAL(widget,"value-changed",zdialog_widget_event,zd); snprintf(vdata,30,"%g",val); data = vdata; } if (strmatch(type,"zspin")) { // "zspin" widget with range if (! data) zappcrash("zdialog_add_widget(): data missing"); // "min|max|step|value" pp = substring(data,'|',1); err = convSD(pp,min); pp = substring(data,'|',2); err += convSD(pp,max); pp = substring(data,'|',3); err += convSD(pp,step); pp = substring(data,'|',4); err += convSD(pp,val); if (err) zappcrash("zdialog_add_widget(): bad data: %s",data); zd->widget[iiw].lolim = min; zd->widget[iiw].hilim = max; zd->widget[iiw].step = step; err = convDS(val,7,vdata); // initial value >> text data = vdata; widget = gtk_text_view_new(); // GTK widget is text_view gtk_text_view_set_top_margin(GTK_TEXT_VIEW(widget),2); gtk_text_view_set_left_margin(GTK_TEXT_VIEW(widget),5); if (! size) size = 5; // scale widget for font size gtk_widget_set_size_request(widget,size*appfontsize,2*appfontsize); gtk_text_view_set_editable(GTK_TEXT_VIEW(widget),1); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget),GTK_WRAP_NONE); gtk_text_view_set_accepts_tab(GTK_TEXT_VIEW(widget),0); gtk_text_view_set_input_purpose(GTK_TEXT_VIEW(widget),GTK_INPUT_PURPOSE_NUMBER); editBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); gtk_text_buffer_set_text(editBuff,data,-1); gtk_widget_add_events(widget,GDK_SCROLL_MASK); gtk_widget_add_events(widget,GDK_FOCUS_CHANGE_MASK); G_SIGNAL(editBuff,"changed",zdialog_zspin_event,zd); // buffer signals, not widget G_SIGNAL(widget,"key-press-event",zdialog_zspin_event,zd); G_SIGNAL(widget,"focus-out-event",zdialog_zspin_event,zd); G_SIGNAL(widget,"scroll-event",zdialog_zspin_event,zd); } if (strmatch(type,"icon")) { // image widget from icon snprintf(iconpath,200,"%s/%s",get_zimagedir(),data); data = 0; // data not further used pixbuf = gdk_pixbuf_new_from_file_at_scale(iconpath,size,size,1,&gerror); if (pixbuf) { widget = gtk_image_new_from_pixbuf(pixbuf); g_object_unref(pixbuf); } else widget = gtk_image_new_from_icon_name("missing",GTK_ICON_SIZE_BUTTON); } if (strmatch(type,"image")) // image widget from pixbuf widget = gtk_image_new_from_pixbuf((GdkPixbuf *) data); // use (ch *) pixbuf in call // all widget types come here zd->widget[iiw].widget = widget; // set widget in zdialog if (strmatchV(type,"zentry","zspin","zedit","text","scrwin",null)) { // add frame around these widgets if (! strmatch(ptype,"scrwin")) { // unless parent is scroll widget fwidget = gtk_frame_new(0); gtk_frame_set_shadow_type(GTK_FRAME(fwidget),GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(fwidget),widget); widget = fwidget; } } if (strmatch(ptype,"hbox") || strmatch(ptype,"vbox")) // add to hbox/vbox gtk_box_pack_start(GTK_BOX(pwidget),widget,expand,expand,space); if (strmatch(ptype,"frame")) // add to frame gtk_container_add(GTK_CONTAINER(pwidget),widget); if (strmatch(ptype,"scrwin")) // add to scroll window gtk_container_add(GTK_CONTAINER(pwidget),widget); if (strmatch(ptype,"dialog")) { // add to dialog box vbox = gtk_bin_get_child(GTK_BIN(pwidget)); // dialog is a gtkwindow gtk_box_pack_start(GTK_BOX(vbox),widget,expand,expand,space); } if (data) zd->widget[iiw].data = zstrdup(data,"zdialog"); // widget memory return 0; } // add widget to existing zdialog - alternative form (clearer and easier code) // options: "size=nn | homog | expand | space=nn | wrap" (all optional, any order) int zdialog_add_widget(zdialog *zd, ch *type, ch *wname, ch *parent, ch *data, ch *options) { int size = 0, homog = 0, expand = 0, space = 0, wrap = 0; ch *pp, *param; int stat, Nth, pval = 0; if (! main_thread()) zappcrash("illegal call from thread"); if (! options) options = ""; for (Nth = 1; true; Nth++) { param = substring(options,"|",Nth); // get pname=value if (! param) break; pp = strchr(param,'='); if (pp) pval = atoi(pp+1); if (strstr(param,"size")) size = pval; else if (strstr(param,"homog")) homog = 1; else if (strstr(param,"expand")) expand = 1; else if (strstr(param,"space")) space = pval; else if (strstr(param,"wrap")) wrap = 1; else zappcrash("bad zdialog options: %s",options); } stat = zdialog_add_widget_long(zd,type,wname,parent,data,size,homog,expand,space,wrap); return stat; } // return 1/0 if zdialog is valid/invalid int zdialog_valid(zdialog *zd, ch *title) // title is optional { int ok, ii; if (! zd) return 0; for (ii = 0; ii < zdialog_count; ii++) // find in valid zdialog list if (zd == zdialog_list[ii]) break; if (ii == zdialog_count) { printf("*** zdialog invalid %s \n",title); return 0; } ok = 1; if ((zd->sentinel1 & 0xFFFF0000) != zdsentinel) ok = 0; if (zd->sentinel2 != zd->sentinel1) ok = 0; if (! ok) { printf("*** zdialog sentinel invalid %s \n",title); return 0; } if (title && ! strmatch(title,zd->title)) { printf("*** zdialog title invalid %s \n",title); return 0; } return 1; } // return 1/0 if zdialog is valid/invalid // silent version to use when zdialog is possibly destroyed int zdialog_valid2(zdialog *zd, ch *title) { int ok, ii; if (! zd) return 0; for (ii = 0; ii < zdialog_count; ii++) if (zd == zdialog_list[ii]) break; if (ii == zdialog_count) return 0; ok = 1; if ((zd->sentinel1 & 0xFFFF0000) != zdsentinel) ok = 0; if (zd->sentinel2 != zd->sentinel1) ok = 0; if (! ok) return 0; if (title && ! strmatch(title,zd->title)) return 0; return 1; } // find zdialog widget from zdialog and widget name int zdialog_find_widget(zdialog *zd, ch *wname) { int ii; if (! zdialog_valid(zd)) { printf("*** invalid zdialog %p \n",zd); return 0; } for (ii = 0; zd->widget[ii].type; ii++) if (strmatch(zd->widget[ii].wname,wname)) return ii; return 0; } // get GTK widget from zdialog and widget name GtkWidget * zdialog_gtkwidget(zdialog *zd, ch *wname) { if (strmatch(wname,"dialog")) return zd->widget[0].widget; int ii = zdialog_find_widget(zd,wname); if (ii) return zd->widget[ii].widget; return 0; } // set an "image" widget type from a GDK pixbuf // returns 0 if OK, else +N int zdialog_set_image(zdialog *zd, ch *wname, GdkPixbuf *pixbuf) { GtkWidget *widget; int ii; if (! main_thread()) zappcrash("illegal call from thread"); ii = zdialog_find_widget(zd,wname); if (! ii) return 2; if (! strmatch(zd->widget[ii].type,"image")) return 3; widget = zd->widget[ii].widget; gtk_image_set_from_pixbuf(GTK_IMAGE(widget),pixbuf); return 0; } // add a popup tool tip to a zdialog widget int zdialog_add_ttip(zdialog *zd, ch *wname, ch *ttip) { GtkWidget *widget; int ii; if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return 0; for (ii = 0; zd->compwidget[ii]; ii++) // search completion buttons if (strmatch(zd->compbutton[ii],TX(wname))) { // for matching wname gtk_widget_set_tooltip_text(zd->compwidget[ii],ttip); return 1; } widget = zdialog_gtkwidget(zd,wname); // search zdialog widgets if (! widget) return 0; gtk_widget_set_tooltip_text(widget,ttip); return 1; } // resize dialog to a size greater than initial size // (as determined by the included widgets) int zdialog_resize(zdialog *zd, int width, int height) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return 0; if (! width) width = 10; // stop spurious GTK warnings if (! height) height = 10; GtkWidget *window = zd->widget[0].widget; gtk_window_set_default_size(GTK_WINDOW(window),width,height); return 1; } // put data into a zdialog widget // private function int zdialog_put_data(zdialog *zd, ch *wname, ch *data) { GtkWidget *widget; GtkTextBuffer *textBuff; GdkRGBA gdkrgba; int iiw, nn, kk, err, Nsteps; ch *type, *pp; ch *wdata, sdata[32]; double dval; double f256 = 1.0 / 256.0; double lval, hval, nval, F, F2; double fdata, lolim, hilim, step; // double if (! main_thread()) zappcrash("illegal call from thread"); iiw = zdialog_find_widget(zd,wname); if (! iiw) return 0; type = zd->widget[iiw].type; widget = zd->widget[iiw].widget; wdata = zd->widget[iiw].data; if (wdata) zfree(wdata); // free prior data memory zd->widget[iiw].data = 0; if (data) { if (utf8_check(data)) wdata = zstrdup("bad UTF8 data","zdialog"); // replace bad UTF-8 encoding else wdata = zstrdup(data,"zdialog"); // set new data for widget zd->widget[iiw].data = wdata; } zd->disabled++; // disable for widget stuffing if (strmatch(type,"label")) gtk_label_set_text(GTK_LABEL(widget),data); if (strmatch(type,"link")) gtk_label_set_text(GTK_LABEL(widget),data); if (strmatch(type,"entry")) gtk_entry_set_text(GTK_ENTRY(widget),data); if (strmatch(type,"zentry")) { // text input, single line textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); gtk_text_buffer_set_text(textBuff,data,-1); } if (strmatchV(type,"button","zbutton",null)) // change button label gtk_button_set_label(GTK_BUTTON(widget),data); if (strmatch(type,"zedit")) { // text input to editable text textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); gtk_text_buffer_set_text(textBuff,data,-1); } if (strmatch(type,"text")) { // text output textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); gtk_text_buffer_set_text(textBuff,data,-1); } if (strmatchV(type,"togbutt","check","radio",null)) { if (! data) kk = nn = 0; else kk = convSI(data,nn); if (kk != 0) nn = 0; // data not integer, force zero if (nn <= 0) nn = 0; else nn = 1; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),nn); // set gtk widget value } if (strmatch(type,"spin")) { kk = convSD(data,dval); if (kk != 0) dval = 0.0; gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget),dval); } if (strmatch(type,"zspin")) { // "zspin" widget lolim = zd->widget[iiw].lolim; hilim = zd->widget[iiw].hilim; step = zd->widget[iiw].step; err = convSD(data,fdata); // string --> double if (err) goto retx; Nsteps = (fdata - lolim) / step + 0.5; // nearest exact step fdata = lolim + Nsteps * step; if (fdata < lolim) fdata = lolim; // enforce limits if (fdata > hilim) fdata = hilim; convDS(fdata,7,sdata); // double --> string, precision 7 textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); gtk_text_buffer_set_text(textBuff,sdata,-1); } if (strmatch(type,"colorbutt")) { // color button data is nnn|nnn|nnn pp = substring(data,'|',1); if (pp) gdkrgba.red = f256 * atoi(pp); // RGB range is 0-1 pp = substring(data,'|',2); if (pp) gdkrgba.green = f256 * atoi(pp); pp = substring(data,'|',3); if (pp) gdkrgba.blue = f256 * atoi(pp); gdkrgba.alpha = 1.0; gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(widget),&gdkrgba); } if (strmatchV(type,"hscale","hscale2","vscale",null)) // slider widget { kk = convSD(data,dval); // zdialog widget value if (kk != 0) dval = 0.0; if (zd->widget[iiw].rescale) // widget value --> slider value { lval = zd->widget[iiw].lval; // rescaled for more sensitivity nval = zd->widget[iiw].nval; // around neutral value hval = zd->widget[iiw].hval; if (dval > lval && dval <= nval) { // if dval == lval or dval == hval F2 = (nval - dval) / (nval - lval); // then dval is not revised F = sqrtf(F2); dval = nval - F * (nval - lval); } else if (dval >= nval && dval < hval) { F2 = (dval - nval) / (hval - nval); F = sqrtf(F2); dval = nval + F * (hval - nval); } } gtk_range_set_value(GTK_RANGE(widget),dval); } if (strmatch(type,"combo")) // combo box { if (blank_null(data)) // if blank, set no active entry gtk_combo_box_set_active(GTK_COMBO_BOX(widget),-1); else { if (! zd->widget[iiw].zlist) // add parallel zlist if not already zd->widget[iiw].zlist = zlist_new(0); nn = zlist_find(zd->widget[iiw].zlist,data,0); // find matching zlist entry if (nn < 0) { zlist_append(zd->widget[iiw].zlist,data,0); // not found, append new entry to zlist gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget),data); // append new entry to combo box nn = zlist_count(zd->widget[iiw].zlist) - 1; // entry = count - 1 } gtk_combo_box_set_active(GTK_COMBO_BOX(widget),nn); // set combo box active entry } } retx: zd->disabled--; // re-enable dialog return iiw; } // get data from a dialog widget based on its name // private function ch * zdialog_get_data(zdialog *zd, ch *wname) { if (! main_thread()) zappcrash("illegal call from thread"); int ii = zdialog_find_widget(zd,wname); if (ii) return zd->widget[ii].data; return 0; } // set new limits for a numeric data entry widget (spin, zspin, hscale, vscale) int zdialog_set_limits(zdialog *zd, ch *wname, double min, double max) { GtkWidget *widget; ch *type; int iiw; if (! main_thread()) zappcrash("illegal call from thread"); iiw = zdialog_find_widget(zd,wname); if (! iiw) { printf("*** zdialog_set_limits, %s not found \n",wname); return 0; } widget = zd->widget[iiw].widget; type = zd->widget[iiw].type; if (*type == 's') gtk_spin_button_set_range(GTK_SPIN_BUTTON(widget),min,max); if (*type == 'h' || *type == 'v') gtk_range_set_range(GTK_RANGE(widget),min,max); if (*type == 'z') { // zspin zd->widget[iiw].lval = min; zd->widget[iiw].hval = max; } return 1; } // get lower and upper limits for numeric data entry widget // returns 1 if OK, 0 if not a widget with limits int zdialog_get_limits(zdialog *zd, ch *wname, double &min, double &max) { int iiw; min = max = 0; iiw = zdialog_find_widget(zd,wname); if (! iiw) return 0; if (! strstr("spin zspin hscale hscale2 vscale",zd->widget[iiw].type)) return 0; min = zd->widget[iiw].lolim; max = zd->widget[iiw].hilim; return 1; } // Expand a widget scale in the region around the neutral value. // Control small adjustments near the neutral value more precisely. // lval and hval: the range of values to be rescaled. // nval: the neutral value where the scale will be expanded the most. // lval <= nval <= hval int zdialog_rescale(zdialog *zd, ch *wname, float lval, float nval, float hval) { int iiw; iiw = zdialog_find_widget(zd,wname); if (! iiw) return 0; if (lval > nval || nval > hval) { printf("*** zdialog_rescale, bad data: %s \n",wname); return 0; } zd->widget[iiw].rescale = 1; zd->widget[iiw].lval = lval; zd->widget[iiw].nval = nval; zd->widget[iiw].hval = hval; return 1; } // run the dialog and send events to the event function // // evfunc: int func(zdialog *zd, ch *event) // If present, eventFunc is called when a dialog widget is changed or the dialog // is completed. If a widget was changed, event is the widget name. // Get the new widget data with zdialog_fetch(). // If a completion button was pressed, event is "zstat" and zd->zstat will be // the button number 1-N. // If the dialog was destroyed, event is "zstat" and zd->zstat is negative. // // posn: optional dialog box position: // "mouse" = position at mouse // "desktop" = center on desktop DEFAULT // "parent" = center on parent window // "nn/nn" = position NW corner at relative x/y position in parent window, // where nn/nn is a percent 0-100 of the parent window dimensions. // "save" = save last user-set position and use this whenever the dialog // is repeated, also across sessions. // // KBevent: extern void KBevent(GdkEventKey *event) // This function must be supplied by the caller of zdialog. // It is called when Ctrl|Shift|Alt|F1 is pressed. int zdialog_run(zdialog *zd, zdialog_event evfunc, ch *posn) { int zdialog_KB_press(GtkWidget *, GdkEventKey *event, zdialog *zd); int zdialog_focus_event(GtkWidget *, GdkEvent *event, zdialog *zd); GtkWidget *dialog; if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return 0; if (zd->zrunning) { printf("zdialog is already running \n"); return 0; } if (posn) zdialog_set_position(zd,posn); // put dialog at desired position else zdialog_set_position(zd,"desktop"); // use default if (evfunc) zd->eventCB = (void *) evfunc; // link to dialog event callback printf("dialog started: %s \n",zd->title); dialog = zd->widget[0].widget; gtk_widget_show_all(dialog); // activate dialog G_SIGNAL(dialog,"focus-in-event",zdialog_focus_event,zd); // connect focus event function G_SIGNAL(dialog,"focus-out-event",zdialog_focus_event,zd); // connect focus event function 26.8 G_SIGNAL(dialog,"key-press-event",zdialog_KB_press,zd); // connect key press event function G_SIGNAL(dialog,"delete-event",zdialog_delete_event,zd); // connect delete event function zd->zstat = 0; // dialog status incomplete zd->disabled = 0; // enable widget events zd->zrunning = 1; // dialog is running return 0; } // zdialog event handler - called for dialog events. // Updates data in zdialog, calls user callback function (if present). // private function int zdialog_widget_event(GtkWidget *widget, zdialog *zd) { zdialog_event *evfunc = 0; // dialog event callback function GtkTextView *textView = 0; GtkTextBuffer *textBuff = 0; GtkTextIter iter1, iter2; GdkRGBA gdkrgba; int ii, nn; ch *wname, *wtype, *wdata; ch *pp, sdata[20]; double dval; float lval, nval, hval, F; if (! zdialog_valid2(zd)) return 1; // zdialog gone if (zd->disabled) return 1; // events disabled zd->disabled = 1; // disable nested events for (ii = 0; ii < zdmaxbutts; ii++) { // check completion buttons if (zd->compwidget[ii] == null) break; // EOL if (zd->compwidget[ii] != widget) continue; zd->zstat = ii+1; // zdialog status = button no. strncpy0(zd->event,"zstat",40); strncpy0(zd->zstat_button,zd->compbutton[ii],40); // button label "Cancel" etc. wtype = "completion button"; printf("dialog: %s button: %s \n",zd->title,zd->zstat_button); goto call_evfunc; // call zdialog event function } for (ii = 1; zd->widget[ii].type; ii++) // find widget in zdialog if (zd->widget[ii].widget == widget) goto found_widget; for (ii = 1; zd->widget[ii].type; ii++) { // failed, test if buffer if (strmatchV(zd->widget[ii].type,"zedit","zentry",null)) { // of text view widget textView = GTK_TEXT_VIEW(zd->widget[ii].widget); textBuff = gtk_text_view_get_buffer(textView); if (widget == (GtkWidget *) textBuff) goto found_widget; } } printf("zdialog event ignored: %s \n",zd->title); // not found, ignore event zd->disabled = 0; return 1; found_widget: wname = zd->widget[ii].wname; wtype = zd->widget[ii].type; wdata = 0; if (strmatch(wtype,"button")) wdata = (ch *) gtk_button_get_label(GTK_BUTTON(widget)); // button label if (strmatch(wtype,"zbutton")) { // checkbox as smaller button wdata = (ch *) gtk_button_get_label(GTK_BUTTON(widget)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),0); // reset checkmark = off } if (strmatch(wtype,"zedit")) { // multi-line gtk_text_buffer_get_bounds(textBuff,&iter1,&iter2); wdata = gtk_text_buffer_get_text(textBuff,&iter1,&iter2,0); } if (strmatch(wtype,"entry")) wdata = (ch *) gtk_entry_get_text(GTK_ENTRY(widget)); if (strmatch(wtype,"zentry")) { // single line gtk_text_buffer_get_bounds(textBuff,&iter1,&iter2); wdata = gtk_text_buffer_get_text(textBuff,&iter1,&iter2,0); pp = strchr(wdata,GDK_KEY_Linefeed); // prohibit return character if (pp) { *pp = 0; gtk_text_buffer_set_text(textBuff,wdata,-1); // works, generates bogus error message } } if (strmatchV(wtype,"radio","check","togbutt",null)) { nn = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); if (nn == 0) wdata = "0"; else wdata = "1"; } if (strmatch(wtype,"combo")) wdata = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(widget)); if (strmatch(wtype,"spin")) { dval = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)); snprintf(sdata,20,"%g",dval); wdata = sdata; } if (strmatch(wtype,"colorbutt")) // color button { gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(widget),&gdkrgba); snprintf(sdata,20,"%.0f|%.0f|%.0f",gdkrgba.red*255,gdkrgba.green*255,gdkrgba.blue*255); wdata = sdata; } if (strmatchV(wtype,"hscale","hscale2","vscale",null)) { dval = gtk_range_get_value(GTK_RANGE(widget)); if (zd->widget[ii].rescale) // slider value --> widget value { lval = zd->widget[ii].lval; nval = zd->widget[ii].nval; hval = zd->widget[ii].hval; if (dval > lval && dval < nval) { // lval ... nval F = (nval - dval) / (nval - lval); // 1 ... 0 dval = (1.0 - F * F) * (nval - lval) + lval; // lval ... nval } else if (dval > nval && dval < hval) { // nval ... hval F = (dval - nval) / (hval - nval); // 0 ... 1 dval = F * F * (hval - nval) + nval; // nval ... hval } } snprintf(sdata,20,"%g",dval); wdata = sdata; } // all widgets come here if (zd->widget[ii].data) zfree(zd->widget[ii].data); // clear prior data zd->widget[ii].data = 0; if (wdata) zd->widget[ii].data = zstrdup(wdata,"zdialog"); // set new data zd->lastwidget = widget; // remember last widget updated strncpy0(zd->event,wname,40); // event = widget name call_evfunc: // call zdialog event function if (zd->eventCB) { evfunc = (zdialog_event *) zd->eventCB; // do callback function evfunc(zd,zd->event); } if (zdialog_valid2(zd)) zd->disabled = 0; // 'event' may cause zdialog_free() return 1; } // special zdialog handler for GtkTextView widgets // track current input widget for popup_text int textview_focus_in_event(GtkWidget *widget) { curr_textview_widget = GTK_TEXT_VIEW(widget); return 1; } // zdialog response handler for "focus-in-event" signal // private function int zdialog_focus_event(GtkWidget *, GdkEvent *event, zdialog *zd) { if (! zdialog_valid2(zd)) return 0; if (zd->zstat) return 0; // already complete zdialog_focus_zd = zd; // track zdialog with KB focus 26.8 zdialog_send_event(zd,"focus"); // notify dialog event function return 0; // must be 0 } // zdialog response handler for "activate" signal // private function int zdialog_activate_event(GtkWidget *, zdialog *zd) { if (! zdialog_valid2(zd)) return 0; if (zd->zstat) return 0; // already complete zdialog_send_event(zd,"activate"); // notify dialog event function return 0; // must be 0 } // zdialog response handler for keyboard events // key symbols can be found at /usr/include/gtk-3.0/gdk/gdkkeysyms.h // main app must provide: extern void KBevent(GdkEventKey *event) // private function int zdialog_KB_press(GtkWidget *widget, GdkEventKey *kbevent, zdialog *zd) { void zdialog_copyfunc(GtkWidget *, GtkClipboard *); void zdialog_pastefunc(GtkClipboard *, ch *, void *); GtkWidget *focuswidget; int KBkey = kbevent->keyval; ch *type; int ii; if (KBkey == GDK_KEY_Escape) { // escape key printf("zdialog escape key \n"); Fescape = 1; zd->zstat = -2; if (zd->eventCB) zdialog_send_event(zd,"zstat"); return 1; } if (KBkey == GDK_KEY_F1) { KBevent(kbevent); return 1; }; // these keys handled by main app window if (KBkey == GDK_KEY_F10) { KBevent(kbevent); return 1; }; if (KBkey == GDK_KEY_F11) { KBevent(kbevent); return 1; }; focuswidget = gtk_window_get_focus(GTK_WINDOW(widget)); // find widget in zdialog for (ii = 1; zd->widget[ii].type; ii++) if (zd->widget[ii].widget == focuswidget) break; type = zd->widget[ii].type; // screening input widget types removed if (! type) return 0; strncpy0(zd->event,zd->widget[ii].wname,40); // save event name return 0; // pass KB key to widget } // event function for "zspin" widget int zdialog_zspin_event(GtkWidget *widget, GdkEvent *event, zdialog *zd) { zdialog_event *evfunc = 0; // dialog event callback function GtkTextBuffer *textBuff; GtkTextIter iter1, iter2; int KBkey; int ii, err, Nsteps, state; static float fincr = 0; // 25.2 double fdata, lolim, hilim, step; // double ch *wdata, sdata[20]; int time, elaps, Fchanged; static int time0 = 0, time1 = 0; if (event->type < 0) return 1; // GDK bug ? if (! zdialog_valid2(zd)) return 0; // event after dialog destroyed if (zd->disabled) return 0; // zdialog events disabled for (ii = 1; zd->widget[ii].type; ii++) // find "zspin" (text view) widget if (zd->widget[ii].widget == widget) break; if (! zd->widget[ii].type) return 0; // not found textBuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); // get widget data gtk_text_buffer_get_bounds(textBuff,&iter1,&iter2); wdata = gtk_text_buffer_get_text(textBuff,&iter1,&iter2,0); lolim = zd->widget[ii].lolim; // limits and step size hilim = zd->widget[ii].hilim; step = zd->widget[ii].step; if (event->type == GDK_SCROLL) { // mouse wheel event gtk_widget_grab_focus(widget); fincr += - ((GdkEventScroll *) event)->delta_y; // accumulate scroll values 25.2 if (fincr > -0.7 && fincr < +0.7) return 0; // (new mouse, smooth scroll) if (fincr < 0) fincr = -1; else fincr = +1; state = ((GdkEventScroll *) event)->state; // if shift key held, use 10x step if (state & GDK_SHIFT_MASK) fincr *= 10; goto checklimits; } if (event->type == GDK_KEY_PRESS) { // KB button press KBkey = ((GdkEventKey *) event)->keyval; if (KBkey == GDK_KEY_Return) goto checklimits; // return = entry finished if (KBkey == GDK_KEY_Up) fincr = 1; if (KBkey == GDK_KEY_Down) fincr = -1; if (! fincr) return 0; // must return 0 state = ((GdkEventKey *) event)->state; // if shift key held, use 10x step if (state & GDK_SHIFT_MASK) fincr *= 10; time = ((GdkEventKey *) event)->time; // track time key is held down if (time - time1 > 300) time0 = time; time1 = time; elaps = time - time0; if (elaps > 5000) step = 10 * step; // acceleration table for else if (elaps > 4500) step = 9 * step; // hold time 1-5+ seconds else if (elaps > 4000) step = 8 * step; // use integer values only else if (elaps > 3500) step = 7 * step; else if (elaps > 3000) step = 6 * step; else if (elaps > 2500) step = 5 * step; else if (elaps > 2000) step = 4 * step; else if (elaps > 1500) step = 3 * step; else if (elaps > 1000) step = 2 * step; goto checklimits; } if (event->type == GDK_FOCUS_CHANGE) goto checklimits; // focus change = entry finished if (event->type == GDK_LEAVE_NOTIFY) goto checklimits; // pointer out - entry finished return 0; checklimits: convSD(wdata,fdata); // ignore bad char. inputs fdata += fincr * step; Nsteps = (fdata - lolim) / step + 0.5; // set nearest exact step fdata = lolim + Nsteps * step; fincr = 0; // reset accumulating counter 25.2 err = 0; if (fdata < lolim) { err = 1; fdata = lolim; // force within limits } if (fdata > hilim) { err = 2; fdata = hilim; } if (err) gtk_widget_grab_focus(widget); // if error, restore focus convDS(fdata,7,sdata); // round to 7 digits gtk_text_buffer_set_text(textBuff,sdata,-1); // insert recognized value Fchanged = 0; if (zd->widget[ii].data) { if (! strmatch(zd->widget[ii].data,sdata)) Fchanged = 1; // detect if widget data changed zfree(zd->widget[ii].data); // clear prior widget data } zd->widget[ii].data = zstrdup(sdata,"zdialog"); // set new data zd->lastwidget = widget; // remember last widget updated strncpy0(zd->event,zd->widget[ii].wname,40); // event = widget name if (zd->eventCB && Fchanged) { // if widget data changed zd->disabled = 1; evfunc = (zdialog_event *) zd->eventCB; // do event callback function evfunc(zd,zd->event); if (zdialog_valid2(zd)) zd->disabled = 0; // 'event' may cause zdialog_free() } if (event->type == GDK_FOCUS_CHANGE) return 0; // no propagate return 1; // propagate } // process Ctrl+C (copy text from widget to clipboard) // private function void zdialog_copyfunc(GtkWidget *widget, GtkClipboard *clipboard) { GtkTextView *textView = 0; GtkTextBuffer *textBuff = 0; zdialog *zd; int ii, cc = 0; ch *wname; ch text[1000]; widget = gtk_window_get_focus(GTK_WINDOW(widget)); if (! widget) return; zd = zdialog_focus_zd; if (! zdialog_valid2(zd)) return; for (ii = 1; zd->widget[ii].type; ii++) // find widget in zdialog if (zd->widget[ii].widget == widget) goto found_widget; for (ii = 1; zd->widget[ii].type; ii++) { // failed, test if buffer if (strmatchV(zd->widget[ii].type,"zedit","zentry",null)) { // of text view widget textView = GTK_TEXT_VIEW(zd->widget[ii].widget); textBuff = gtk_text_view_get_buffer(textView); if (widget == (GtkWidget *) textBuff) goto found_widget; } } return; // not found found_widget: wname = zd->widget[ii].wname; zdialog_fetch(zd,wname,text,999); // current text in widget cc = strlen(text); gtk_clipboard_set_text(clipboard,text,cc); return; } // process Ctrl+V (paste text from clipboard to widget with KB focus) // private function void zdialog_pastefunc(GtkClipboard *clipboard, ch *cliptext, void *arg) { GtkWindow *window; GtkWidget *widget; GtkTextView *textView = 0; GtkTextBuffer *textBuff = 0; zdialog *zd; int ii, cc = 0; ch *wname; ch text[1000]; window = (GtkWindow *) arg; widget = gtk_window_get_focus(window); if (! widget) return; // widget for pasted text if (! cliptext || ! *cliptext) return; // clipboard text pasted zd = zdialog_focus_zd; if (! zdialog_valid2(zd)) return; if (zd->zstat) return; for (ii = 1; zd->widget[ii].type; ii++) // find widget in zdialog if (zd->widget[ii].widget == widget) goto found_widget; for (ii = 1; zd->widget[ii].type; ii++) { // failed, test if buffer if (strmatchV(zd->widget[ii].type,"zedit","zentry",null)) { // of text view widget textView = GTK_TEXT_VIEW(zd->widget[ii].widget); textBuff = gtk_text_view_get_buffer(textView); if (widget == (GtkWidget *) textBuff) goto found_widget; } } return; // not found found_widget: wname = zd->widget[ii].wname; zdialog_fetch(zd,wname,text,999); // current text in widget cc = strlen(text); if (cc > 995) return; strncpy(text+cc,cliptext,999-cc); // add clipboard text text[999] = 0; zdialog_stuff(zd,wname,text); return; } // private function called when zdialog is completed. // called when dialog is canceled via [x] button or destroyed by GTK (zstat < 0). int zdialog_delete_event(GtkWidget *, GdkEvent *, zdialog *zd) { zdialog_event *evfunc = 0; // dialog event callback function if (! zd) return 0; zd->widget[0].widget = 0; // widget no longer valid if (! zdialog_valid2(zd)) return 1; // already destroyed if (zd->zstat) return 1; // already complete if (zd->disabled) return 1; // in process zd->zstat = -1; // set zdialog cancel status printf("dialog: %s killed\n",zd->title); if (zd->eventCB) { evfunc = (zdialog_event *) zd->eventCB; // do callback function zd->disabled = 1; evfunc(zd,"zstat"); if (zdialog_valid2(zd)) zd->disabled = 0; // 'event' may cause zdialog_free() } zdialog_free(zd); return 0; } // Send an event name to an active zdialog. // The response function eventFunc() will be called with this event. // zdialog completion buttons KB shortcuts removed int zdialog_send_event(zdialog *zd, ch *event) { zdialog_event * evfunc = 0; // dialog event callback function if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid2(zd)) return 0; // zdialog canceled if (zd->disabled) return 0; // zdialog busy evfunc = (zdialog_event *) zd->eventCB; if (! evfunc) return 0; zd->disabled = 1; if (! strstr("paint focus",event)) // avoid flood 26.8 printf("zdialog send event: %s \n",event); evfunc(zd,event); // call dialog event function if (zdialog_valid2(zd)) zd->disabled = 0; // 'event' may cause zdialog_free() return 1; } // Complete an active dialog and assign a status. // Equivalent to the user pressing a dialog completion button. // The dialog completion function is called if defined, // and zdialog_wait() is unblocked. // returns: 0 = no active dialog or completion function, 1 = OK int zdialog_send_response(zdialog *zd, int zstat) { zdialog_event *evfunc = 0; // dialog event callback function if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid2(zd)) return 0; if (zd->disabled) return 0; zd->zstat = zstat; // set status evfunc = (zdialog_event *) zd->eventCB; if (! evfunc) return 0; zd->disabled = 1; evfunc(zd,"zstat"); if (zdialog_valid2(zd)) zd->disabled = 0; // 'event' may cause zdialog_free() return 1; } // show or hide a zdialog window // returns 1 if successful, 0 if zd does not exist. int zdialog_show(zdialog *zd, int show) { static GtkWidget *widget, *pwidget = 0; static int posx, posy; if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return 0; widget = zdialog_gtkwidget(zd,"dialog"); if (show) { // show window if (widget == pwidget) { // restore prior position gtk_window_move(GTK_WINDOW(widget),posx,posy); pwidget = 0; } gtk_widget_show_all(widget); gtk_window_present(GTK_WINDOW(widget)); // set focus on restored window } else { // hide window pwidget = widget; gtk_window_get_position(GTK_WINDOW(widget),&posx,&posy); // save position gtk_widget_hide(widget); } return 1; } // Destroy the zdialog - must be done by zdialog_run() caller // (else dialog continues active even after completion button). // Data in widgets remains valid until zdialog_free() is called. int zdialog_destroy(zdialog *zd) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid2(zd)) return 0; // destroyed, not freed yet if (zd->saveposn) zdialog_save_position(zd); // save position for next use if (zd->widget[0].widget) { // multiple destroys OK gtk_widget_destroy(zd->widget[0].widget); // destroy GTK dialog zd->widget[0].widget = 0; } if (! zd->zstat) zd->zstat = -1; // status = destroyed zd->zrunning = 0; // not running zd->disabled = 1; // ignore events after destroy return 1; } // free zdialog memory (will destroy first, if not already) // zd is set to null int zdialog_free(zdialog *&zd) // reference { int ii; if (! main_thread()) zappcrash("illegal call from thread"); if (! zd) return 0; if (! zdialog_valid2(zd)) return 0; // validate zd pointer zdialog_save_inputs(zd); // save user inputs for next use zdialog_destroy(zd); // destroy GTK dialog if there zd->sentinel1 = zd->sentinel2 = 0; // mark sentinels invalid zfree(zd->title); // free title memory zfree(zd->widget[0].data); for (ii = 1; zd->widget[ii].type; ii++) // loop through widgets { zfree((ch *) zd->widget[ii].type); // free strings zfree((ch *) zd->widget[ii].wname); if (zd->widget[ii].pname) zfree((ch *) zd->widget[ii].pname); // parent widget name if (zd->widget[ii].data) zfree(zd->widget[ii].data); // free data if (zd->widget[ii].zlist) zlist_free(zd->widget[ii].zlist); // free combo box zlist } for (ii = 0; ii < zdialog_count; ii++) // remove from valid zdialog list if (zd == zdialog_list[ii]) break; if (ii < zdialog_count) { zdialog_count--; for (NOP; ii < zdialog_count; ii++) // pack down list zdialog_list[ii] = zdialog_list[ii+1]; } else printf("*** zdialog_free(), not in zdialog_list \n"); zfree(zd); // free zdialog memory zd = 0; // caller pointer = null return 1; } // Wait for a dialog to complete or be destroyed. This is a zmainloop() loop. // The returned status is the button 1-N used to complete the dialog, or negative // if the dialog was destroyed with [x] or otherwise by GTK. If the status was 1-N and // the dialog will be kept active, set zd->zstat = 0 to restore the active state. int zdialog_wait(zdialog *zd) { if (! main_thread()) zappcrash("illegal call from thread"); zdialog_present(zd); // initially has focus while (true) { zmainsleep(0.01); if (! zd) return -1; if (! zdialog_valid2(zd)) return -1; if (zd->zstat) return zd->zstat; } } // put cursor at named widget int zdialog_goto(zdialog *zd, ch *wname) { GtkWidget *widget; if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return 0; widget = zdialog_gtkwidget(zd, wname); if (! widget) return 0; gtk_widget_grab_focus(widget); return 1; } // set cursor for zdialog (e.g. a busy cursor) void zdialog_set_cursor(zdialog *zd, GdkCursor *cursor) { GtkWidget *dialog; GdkWindow *window; if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return; dialog = zd->widget[0].widget; if (! dialog) return; window = gtk_widget_get_window(dialog); gdk_window_set_cursor(window,cursor); return; } // insert data into a zdialog widget int zdialog_stuff(zdialog *zd, ch *wname, ch *data) // stuff a string { if (! main_thread()) zappcrash("illegal call from thread"); if (data) zdialog_put_data(zd,wname,data); else zdialog_put_data(zd,wname,""); // null > "" return 1; } int zdialog_stuff(zdialog *zd, ch *wname, int idata) // stuff an integer { ch string[16]; double min, max; if (! main_thread()) zappcrash("illegal call from thread"); if (zdialog_get_limits(zd,wname,min,max)) if (idata < min || idata > max) return 0; // bad data, do nothing snprintf(string,16,"%d",idata); zdialog_put_data(zd,wname,string); return 1; } int zdialog_stuff(zdialog *zd, ch *wname, double ddata) // stuff a double { ch string[32]; double min, max; if (! main_thread()) zappcrash("illegal call from thread"); if (zdialog_get_limits(zd,wname,min,max)) if (ddata < min || ddata > max) return 0; // bad data, do nothing snprintf(string,32,"%.7g",ddata); // increase from 6 to 7 digits zdialog_put_data(zd,wname,string); // 'g' uses decimal or comma return 1; // (per locale) } int zdialog_stuff(zdialog *zd, ch *wname, double ddata, ch *format) // stuff a double, formatted { ch string[32]; double min, max; if (! main_thread()) zappcrash("illegal call from thread"); if (zdialog_get_limits(zd,wname,min,max)) if (ddata < min || ddata > max) return 0; // bad data, do nothing snprintf(string,32,format,ddata); // use "%.2g" etc. for zdialog_put_data(zd,wname,string); // locale dependent point/comma return 1; } int zdialog_labelfont(zdialog *zd, ch *labl, ch *font, ch *txt) // stuff label text using specified font { GtkWidget *widget; ch *format = "%s"; ch txt2[1000]; if (! main_thread()) zappcrash("illegal call from thread"); if (! font) font = zfuncs::appfont; // default font snprintf(txt2,1000,format,font,txt); widget = zdialog_gtkwidget(zd,labl); gtk_label_set_markup(GTK_LABEL(widget),txt2); return 1; } // get data from a zdialog widget int zdialog_fetch(zdialog *zd, ch *wname, ch *data, int maxcc) // fetch string data { ch *zdata; if (! main_thread()) zappcrash("illegal call from thread"); zdata = zdialog_get_data(zd,wname); if (! zdata) { *data = 0; return 0; } return strncpy0(data,zdata,maxcc); // 0 = OK, 1 = truncation } int zdialog_fetch(zdialog *zd, ch *wname, int &idata) // fetch an integer { ch *zdata; if (! main_thread()) zappcrash("illegal call from thread"); zdata = zdialog_get_data(zd,wname); if (! zdata) { idata = 0; return 0; } idata = atoi(zdata); return 1; } int zdialog_fetch(zdialog *zd, ch *wname, double &ddata) // fetch a double { int stat; ch *zdata; if (! main_thread()) zappcrash("illegal call from thread"); zdata = zdialog_get_data(zd,wname); if (! zdata) { ddata = 0; return 0; } stat = convSD(zdata,ddata); // period or comma decimal point OK if (stat < 4) return 1; return 0; } int zdialog_fetch(zdialog *zd, ch *wname, float &fdata) // fetch a float { int stat; ch *zdata; double ddata; if (! main_thread()) zappcrash("illegal call from thread"); zdata = zdialog_get_data(zd,wname); if (! zdata) { fdata = 0; return 0; } stat = convSD(zdata,ddata); // period or comma decimal point OK fdata = ddata; if (stat < 4) return 1; return 0; } // clear combo box entries int zdialog_combo_clear(zdialog *zd, ch *wname) { int ii; if (! main_thread()) zappcrash("illegal call from thread"); ii = zdialog_find_widget(zd,wname); if (! ii) return 0; gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(zd->widget[ii].widget)); // remove all entries if (zd->widget[ii].zlist) zlist_clear(zd->widget[ii].zlist,0); return 1; } // popup (open) combo box pick list int zdialog_combo_popup(zdialog *zd, ch *wname) { int ii; if (! main_thread()) zappcrash("illegal call from thread"); ii = zdialog_find_widget(zd,wname); if (! ii) return 0; gtk_combo_box_popup(GTK_COMBO_BOX(zd->widget[ii].widget)); return 1; } /**************************************************************************************/ // Load/save all function widget data from/to a file. // dirname for data files: /home//.appname/funcname // where zdialog data is saved for the respective function. // return 0 = OK, +N = error int zdialog_load_widgets(zdialog *zd, spldat *sd, ch *funcname, FILE *fid) { using namespace zfuncs; ch *mess = "Load settings from file"; int myfid = 0; ch *filename, dirname[200], buff[1000]; ch *wname, *wdata, wdata2[1000]; ch *pp, *pp1, *pp2; int ii, kk, err, cc1, cc2; if (! main_thread()) zappcrash("illegal call from thread"); if (! fid) // fid from script { snprintf(dirname,200,"%s/%s",get_zhomedir(),funcname); // folder for data files filename = zgetfile(mess,GTK_WINDOW(zd->dialog),"file",dirname,0); // open data file if (! filename) return 1; // user cancel fid = fopen(filename,"r"); if (! fid) { zmessageACK(zd->dialog,"%s \n %s",filename,strerror(errno)); return 1; } zfree(filename); myfid = 1; } for (ii = 0; ii < zdmaxwidgets; ii++) // read widget data recs { pp = fgets_trim(buff,1000,fid,1); if (! pp) break; if (strmatch(pp,"curves")) { if (! sd) goto baddata; err = splcurve_load(sd,fid); // load curves data if (err) goto baddata; continue; } if (strmatch(pp,"end")) break; pp1 = pp; pp2 = strstr(pp1," =="); if (! pp2) continue; // widget has no data cc1 = pp2 - pp1; if (cc1 > 100) continue; pp1[cc1] = 0; wname = pp1; // widget name if (strstr("defcats deftags",wname)) continue; // fotocx only kludge pp2 += 3; if (*pp2 == ' ') pp2++; wdata = pp2; // widget data cc2 = strlen(wdata); if (cc2 < 1) wdata = ""; if (cc2 > 1000) continue; repl_1str(wdata,wdata2,1000,"\\n","\n"); // replace "\n" with newline chars. kk = zdialog_put_data(zd,wname,wdata2); if (! kk) goto baddata; } if (myfid) fclose(fid); return 0; baddata: zmessageACK(zd->dialog,"file data does not fit dialog"); if (myfid) fclose(fid); return 1; } int zdialog_save_widgets(zdialog *zd, spldat *sd, ch *funcname, FILE *fid) { using namespace zfuncs; ch *mess = "Save settings to a file"; int myfid = 0; ch *filename, dirname[200]; ch *wtype, *wname, *wdata, wdata2[1000]; int ii, cc; ch *editwidgets = "entry zentry edit text togbutt check combo" // widget types to save "radio spin zspin hscale hscale2 vscale colorbutt"; ch *editwidgetsX = "defcats deftags"; // exclude list, fotocx kludge if (! main_thread()) zappcrash("illegal call from thread"); if (! fid) // fid from script { snprintf(dirname,200,"%s/%s",get_zhomedir(),funcname); // folder for data files filename = zgetfile(mess,GTK_WINDOW(zd->dialog),"save",dirname,0); // open data file if (! filename) return 1; // user cancel fid = fopen(filename,"w"); if (! fid) { zmessageACK(zd->dialog,"%s \n %s",filename,strerror(errno)); return 1; } myfid = 1; zfree(filename); } for (ii = 0; ii < zdmaxwidgets; ii++) { wtype = (ch *) zd->widget[ii].type; if (! wtype) break; if (! strstr(editwidgets,wtype)) continue; wname = (ch *) zd->widget[ii].wname; // write widget data recs: if (strstr(editwidgetsX,wname)) continue; wdata = zd->widget[ii].data; // widgetname == widgetdata if (! wdata) continue; cc = strlen(wdata); if (cc > 900) continue; repl_1str(wdata,wdata2,1000,"\n","\\n"); // replace newline with "\n" fprintf(fid,"%s == %s \n",wname,wdata); } if (sd) { fprintf(fid,"curves\n"); splcurve_save(sd,fid); } fprintf(fid,"end\n"); if (myfid) fclose(fid); return 0; } // functions to support [prev] buttons in function dialogs // load or save last-used widgets int zdialog_load_prev_widgets(zdialog *zd, spldat *sd, ch *funcname) { using namespace zfuncs; ch filename[200]; FILE *fid; int err; if (! main_thread()) zappcrash("illegal call from thread"); snprintf(filename,200,"%s/%s/last-used",get_zhomedir(),funcname); fid = fopen(filename,"r"); if (! fid) { zmessageACK(zd->dialog,"%s \n %s",filename,strerror(errno)); return 1; } err = zdialog_load_widgets(zd,sd,funcname,fid); fclose(fid); return err; } int zdialog_save_last_widgets(zdialog *zd, spldat *sd, ch *funcname) { using namespace zfuncs; ch filename[200], dirname[200]; FILE *fid; int err; if (! main_thread()) zappcrash("illegal call from thread"); snprintf(filename,200,"%s/%s/last-used",get_zhomedir(),funcname); fid = fopen(filename,"w"); if (! fid) { snprintf(dirname,200,"%s/%s",get_zhomedir(),funcname); // create missing folder err = mkdir(dirname,0750); if (err) { printf("*** %s \n %s \n",dirname,strerror(errno)); return 1; } fid = fopen(filename,"w"); // open again } if (! fid) { printf("*** %s \n %s \n",filename,strerror(errno)); return 1; } err = zdialog_save_widgets(zd,sd,funcname,fid); fclose(fid); return err; } /**************************************************************************************/ // functions to save and recall zdialog window positions namespace zdposn_names { struct zdposn_t { ch wintitle[64]; // window title (ID) float xpos, ypos; // window posn WRT parent or desktop, 0-100 int xsize, ysize; // window size, pixels } zdposn[200]; // space to remember 200 windows int Nzdposn; // no. in use int Nzdpmax = 200; // table size } // Load zdialog positions table from its file (application startup) // or save zdialog positions table to its file (application exit). // Action is "load" or "save". Number of table entries is returned. int zdialog_geometry(ch *action) { using namespace zdposn_names; ch posfile[200], buff[100], wintitle[64], *pp; float xpos, ypos; int xsize, ysize; int ii, nn, cc; FILE *fid; if (! main_thread()) zappcrash("illegal call from thread"); snprintf(posfile,199,"%s/zdialog_geometry",zhomedir); // /home//.appname/zdialog_geometry if (strmatch(action,"load")) // load dialog positions table from file { fid = fopen(posfile,"r"); if (! fid) { Nzdposn = 0; return 0; } for (ii = 0; ii < Nzdpmax; ) { pp = fgets(buff,100,fid); if (! pp) break; pp = strstr(buff,"||"); if (! pp) continue; cc = pp - buff; strncpy0(wintitle,buff,cc); strTrim(wintitle); if (strlen(wintitle) < 3) continue; nn = sscanf(pp+2," %f %f %d %d ",&xpos,&ypos,&xsize,&ysize); if (nn != 4) continue; strcpy(zdposn[ii].wintitle,wintitle); zdposn[ii].xpos = xpos; zdposn[ii].ypos = ypos; zdposn[ii].xsize = xsize; zdposn[ii].ysize = ysize; ii++; } fclose(fid); Nzdposn = ii; return Nzdposn; } if (strmatch(action,"save")) // save dialog positions table to file { fid = fopen(posfile,"w"); if (! fid) { printf("*** cannot write zdialog_geometry file \n"); return 0; } for (ii = 0; ii < Nzdposn; ii++) { fprintf(fid,"%s || %0.1f %0.1f %d %d \n", // dialog-title || xpos ypos xsize ysize zdposn[ii].wintitle, zdposn[ii].xpos, zdposn[ii].ypos, zdposn[ii].xsize, zdposn[ii].ysize); } fclose(fid); return Nzdposn; } printf("*** zdialog_geometry bad action: %s \n",action); return 0; } // Set the initial or new zdialog window position from "posn". // Called by zdialog_run(). Private function. // null: window manager decides // "mouse" put dialog at mouse position // "desktop" center dialog in desktop window // "parent" center dialog in parent window // "save" use the same position last set by the user // "nn/nn" put NW corner of dialog in parent window at % size // (e.g. "50/50" puts NW corner at center of parent) void zdialog_set_position(zdialog *zd, ch *posn) { using namespace zdposn_names; int ii, ppx, ppy, zdpx, zdpy, pww, phh; float xpos, ypos; int xsize, ysize; ch wintitle[64], *pp; GtkWidget *parent, *dialog; if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return; parent = zd->parent; dialog = zd->widget[0].widget; if (strmatch(posn,"mouse")) { window_to_mouse(zd->dialog); return; } if (strmatch(posn,"desktop")) { gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_CENTER); return; } if (strmatch(posn,"parent")) { gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_CENTER_ON_PARENT); return; } if (! parent) parent = zd->dialog; if (! parent) { // no parent window ppx = ppy = 0; // use desktop pww = monitor_ww; phh = monitor_hh; } else { gtk_window_get_position(GTK_WINDOW(parent),&ppx,&ppy); // parent window NW corner gtk_window_get_size(GTK_WINDOW(parent),&pww,&phh); // parent window size } if (strmatch(posn,"save")) // use last saved window position { zd->saveposn = 1; // set flag for zdialog_free() pp = (ch *) gtk_window_get_title(GTK_WINDOW(dialog)); // get window title, used as ID if (! pp || strlen(pp) < 2) goto center_parent; strncpy0(wintitle,pp,64); // window title, < 64 chars. for (ii = 0; ii < Nzdposn; ii++) // search table for title if (strmatch(wintitle,zdposn[ii].wintitle)) break; if (ii == Nzdposn) goto center_parent; // not found - zdialog_destroy() will add zdpx = ppx + 0.01 * zdposn[ii].xpos * pww; // set position for dialog window zdpy = ppy + 0.01 * zdposn[ii].ypos * phh; xsize = zdposn[ii].xsize; // set size ysize = zdposn[ii].ysize; gtk_window_move(GTK_WINDOW(dialog),zdpx,zdpy); gtk_window_resize(GTK_WINDOW(dialog),xsize,ysize); return; } else // "nn/nn" // position from caller { ii = sscanf(posn,"%f/%f",&xpos,&ypos); // parse "nn/nn" if (ii != 2) goto center_parent; zdpx = ppx + 0.01 * xpos * pww; // position for dialog window zdpy = ppy + 0.01 * ypos * phh; gtk_window_move(GTK_WINDOW(dialog),zdpx,zdpy); return; } center_parent: // center on parent window gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_CENTER_ON_PARENT); return; } // If the dialog window position is "save" then save // its position WRT parent or desktop for next use. // called by zdialog_destroy(). Private function. void zdialog_save_position(zdialog *zd) { using namespace zdposn_names; int ii, ppx, ppy, pww, phh, zdpx, zdpy; float xpos, ypos; int xsize, ysize; ch wintitle[64], *pp; GtkWidget *parent, *dialog; if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return; dialog = zd->widget[0].widget; if (! dialog) return; if (! gtk_widget_get_window(dialog)) return; gtk_window_get_position(GTK_WINDOW(dialog),&zdpx,&zdpy); // dialog window NW corner if (! zdpx && ! zdpy) return; // (0,0) ignore gtk_window_get_size(GTK_WINDOW(dialog),&xsize,&ysize); // window size parent = zd->parent; // parent window if (! parent) parent = zd->dialog; if (! parent) { // no parent window ppx = ppy = 0; // use desktop pww = monitor_ww; phh = monitor_hh; } else { gtk_window_get_position(GTK_WINDOW(parent),&ppx,&ppy); // parent window NW corner gtk_window_get_size(GTK_WINDOW(parent),&pww,&phh); // parent window size } xpos = 100.0 * (zdpx - ppx) / pww; // dialog window relative position ypos = 100.0 * (zdpy - ppy) / phh; // (as percent of parent size) pp = (ch *) gtk_window_get_title(GTK_WINDOW(dialog)); if (! pp) return; if (strlen(pp) < 2) return; strncpy0(wintitle,pp,64); // window title, < 64 chars. for (ii = 0; ii < Nzdposn; ii++) // search table for window if (strmatch(wintitle,zdposn[ii].wintitle)) break; if (ii == Nzdposn) { // not found if (ii == Nzdpmax) return; // table full Nzdposn++; // new entry } strcpy(zdposn[ii].wintitle,wintitle); // add window to table zdposn[ii].xpos = xpos; // save window position zdposn[ii].ypos = ypos; zdposn[ii].xsize = xsize; // and window size zdposn[ii].ysize = ysize; return; } /**************************************************************************************/ // Functions to save and restore zdialog user inputs // within an app session or across app sessions. namespace zdinputs_names { #define Nwmax zdmaxwidgets // max. widgets in a dialog #define Nzdmax 200 // max. zdialogs #define ccmax1 100 // max. widget name length #define ccmax2 400 // max. widget data length struct zdinputs_t { ch *zdtitle = 0; // zdialog title int Nw; // no. of widgets ch **wname; // list of widget names ch **wdata; // list of widget data } zdinputs[Nzdmax]; // space for Nzdmax dialogs int Nzd = 0; // no. zdialogs in use } // Load zdialog input fields from its file (app startup) // or save zdialog input fields to its file (app shutdown). // Action is "load" or "save". // Number of zdialogs is returned. int zdialog_inputs(ch *action) // sequence numbers added 25.1 { using namespace zdinputs_names; ch zdinputsfile[200], buff[ccmax2]; ch zdtitle[ccmax1], wname[Nwmax][ccmax1], wdata[Nwmax][ccmax2]; ch *pp, *pp1, *pp2, wdata2[ccmax2+50]; FILE *fid; int Nw, ii, jj, cc, cc1, cc2; int seq; if (! main_thread()) zappcrash("illegal call from thread"); snprintf(zdinputsfile,200,"%s/zdialog_inputs",zhomedir); // /home//.appname/zdialog_inputs if (strmatch(action,"load")) // load dialog input fields from its file { Nzd = seq = 0; fid = fopen(zdinputsfile,"r"); // no file if (! fid) return 0; while (true) { pp = fgets_trim(buff,ccmax2,fid,1); // read next zdialog title record if (! pp || seq++ != atoi(pp)) goto abend; pp += 4; if (strstr(pp,"EOF")) break; // normal EOF, OK if (! strmatchN(pp,"zdialog == ",11)) continue; // expect zdialog title record strncpy0(zdtitle,pp+11,ccmax1); // save new zdialog title pp = fgets_trim(buff,ccmax2,fid,1); // read next zdialog title record if (! pp || seq++ != atoi(pp)) goto abend; pp += 4; Nw = atoi(pp); // dialog widget count if (Nw < 1 || Nw > Nwmax) goto abend; for (ii = 0; ii < Nw; ii++) // read widget data recs { pp = fgets_trim(buff,ccmax2,fid,1); // read next zdialog title record if (! pp || seq++ != atoi(pp)) goto abend; pp += 4; pp1 = pp; pp2 = strstr(pp1," =="); if (! pp2) break; // widget has no data cc1 = pp2 - pp1; pp1[cc1] = 0; pp2 += 3; if (*pp2 == ' ') pp2++; cc2 = strlen(pp2); if (cc1 < 1 || cc1 >= ccmax1) break; if (cc2 < 1) pp2 = ""; if (cc2 >= ccmax2) break; // do not copy large inputs strcpy(wname[ii],pp1); // save widget name and data strcpy(wdata2,pp2); repl_1str(wdata2,wdata[ii],ccmax2,"\\n","\n"); // replace "\n" with newline chars. } if (ii < Nw) goto abend; if (Nzd == Nzdmax) { printf("*** zdialog_inputs() overflow \n"); break; } zdinputs[Nzd].zdtitle = zstrdup(zdtitle,"zdialog_inputs"); // save acculumated zdialog data zdinputs[Nzd].Nw = Nw; cc = Nw * sizeof(ch *); zdinputs[Nzd].wname = (ch **) zmalloc(cc,"zdialog_inputs"); zdinputs[Nzd].wdata = (ch **) zmalloc(cc,"zdialog_inputs"); for (ii = 0; ii < Nw; ii++) { zdinputs[Nzd].wname[ii] = zstrdup(wname[ii],"zdialog_inputs"); zdinputs[Nzd].wdata[ii] = zstrdup(wdata[ii],"zdialog_inputs"); } Nzd++; } fclose(fid); return Nzd; abend: printf("*** zdialog_inputs file corrupted - deleted \n"); // 25.1 fclose(fid); remove(zdinputsfile); Nzd = 0; return 0; } if (strmatch(action,"save")) // save dialog input fields to its file { fid = fopen(zdinputsfile,"w"); if (! fid) { printf("*** zdialog_inputs() cannot write file \n"); return 0; } seq = 0; for (ii = 0; ii < Nzd; ii++) { fprintf(fid,"%03d zdialog == %s \n",seq++,zdinputs[ii].zdtitle); // zdialog == zdialog title Nw = zdinputs[ii].Nw; fprintf(fid,"%03d %d \n",seq++,Nw); // widget count for (jj = 0; jj < Nw; jj++) { pp1 = zdinputs[ii].wname[jj]; // widget name == widget data pp2 = zdinputs[ii].wdata[jj]; repl_1str(pp2,wdata2,ccmax2+50,"\n","\\n"); // replace newline chars. with "\n" fprintf(fid,"%03d %s == %s \n",seq++,pp1,wdata2); } fprintf(fid,"%03d \n",seq++); } fprintf(fid,"%03d EOF",seq); fclose(fid); return Nzd; } printf("*** zdialog_inputs bad action: %s \n",action); return 0; } // Save dialog user input fields when a dialog is finished. // Called automatically by zdialog_free(). Private function. int zdialog_save_inputs(zdialog *zd) { using namespace zdinputs_names; ch zdtitle[ccmax1], wname[ccmax1], wdata[ccmax2]; ch *wnamex, *type; int ii, jj, Nw, cc; ch *skipwidgets = "dialog hbox vbox hsep vsep frame scrwin" // non-input widgets to omit "label link button zbutton"; ch *skipexceptions = "searchtags"; // fotocx kludge if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return 0; if (! zd->saveinputs) return 0; // zdialog does not use this service strncpy0(zdtitle,zd->widget[0].data,ccmax1); // zdialog title is widget[0].data for (ii = 0; ii < Nzd; ii++) // find zdialog in zdinputs table if (strmatch(zdtitle,zdinputs[ii].zdtitle)) break; if (ii < Nzd) { // found zfree(zdinputs[ii].zdtitle); // delete obsolete zdinputs data for (jj = 0; jj < zdinputs[ii].Nw; jj++) { zfree(zdinputs[ii].wname[jj]); zfree(zdinputs[ii].wdata[jj]); } zfree(zdinputs[ii].wname); zfree(zdinputs[ii].wdata); Nzd--; // decr. zdialog count for (NOP; ii < Nzd; ii++) // pack down the rest zdinputs[ii] = zdinputs[ii+1]; } if (Nzd == Nzdmax) { printf("*** zdialog_save_inputs, too many zdialogs \n"); return 0; } ii = Nzd; // next zdinputs table entry for (Nw = 0, jj = 1; zd->widget[jj].type; jj++) { // count zdialog widgets wnamex = (ch *) zd->widget[jj].wname; type = (ch *) zd->widget[jj].type; if (strstr(skipwidgets,type)) // skip non-input widgets if (! strstr(skipexceptions,wnamex)) continue; Nw++; } if (! Nw) return 0; // no input widgets if (Nw > Nwmax) { printf("*** zdialog_save_inputs() bad data: %s \n",zdtitle); return 0; } zdinputs[ii].zdtitle = zstrdup(zdtitle,"zdialog_save"); // set zdialog title cc = Nw * sizeof(ch *); // allocate pointers for widgets zdinputs[ii].wname = (ch **) zmalloc(cc,"zdialog_save"); zdinputs[ii].wdata = (ch **) zmalloc(cc,"zdialog_save"); for (Nw = 0, jj = 1; zd->widget[jj].type; jj++) { // add widget names and data wnamex = (ch *) zd->widget[jj].wname; type = (ch *) zd->widget[jj].type; if (strstr(skipwidgets,type)) // skip non-input widgets if (! strstr(skipexceptions,wnamex)) continue; strncpy0(wname,zd->widget[jj].wname,ccmax1); if (zd->widget[jj].data) strncpy0(wdata,zd->widget[jj].data,ccmax2); else strcpy(wdata,""); zdinputs[ii].wname[Nw] = zstrdup(wname,"zdialog_save"); zdinputs[ii].wdata[Nw] = zstrdup(wdata,"zdialog_save"); Nw++; } zdinputs[ii].Nw = Nw; // set widget count Nzd++; // add zdialog to end of zdinputs return 1; } // Restore user input fields from prior use of the same dialog. // Call this if wanted after zdialog is built and before it is run. // Override old user inputs with zdialog_stuff() where needed. int zdialog_load_inputs(zdialog *zd) { using namespace zdinputs_names; ch *zdtitle, *wname, *wdata; int ii, jj; zd->saveinputs = 1; // flag, save data at zdialog_free() if (! main_thread()) zappcrash("illegal call from thread"); zdtitle = (ch *) zd->widget[0].data; // zdialog title for (ii = 0; ii < Nzd; ii++) // find zdialog in zdinputs if (strmatch(zdtitle,zdinputs[ii].zdtitle)) break; if (ii == Nzd) return 0; // not found for (jj = 0; jj < zdinputs[ii].Nw; jj++) { // stuff all saved widget data wname = zdinputs[ii].wname[jj]; wdata = zdinputs[ii].wdata[jj]; zdialog_put_data(zd,wname,wdata); } return 1; } /**************************************************************************************/ // get text input from a popup dialog - multiple lines can be entered // returned text is subject for zfree() // null is returned if user presses [cancel] button. ch * zdialog_text(GtkWidget *parent, ch *title, ch *inittext) { zdialog *zd; int zstat; ch *text; if (! main_thread()) zappcrash("illegal call from thread"); zd = zdialog_new(title,parent,"OK","X",null); zdialog_add_widget(zd,"frame","fred","dialog"); zdialog_add_widget(zd,"zedit","text","fred"); if (inittext) zdialog_stuff(zd,"text",inittext); zdialog_resize(zd,300,0); zdialog_set_modal(zd); zdialog_run(zd,0,"mouse"); zstat = zdialog_wait(zd); if (zstat == 1) text = (ch *) zdialog_get_data(zd,"text"); else text = 0; if (text) text = zstrdup(text,"zdialog_text"); zdialog_free(zd); return text; } /**************************************************************************************/ // get text input from a popup dialog - one line only // returned text is subject for zfree() // null is returned if user presses [cancel] button. ch * zdialog_text1(GtkWidget *parent, ch *title, ch *inittext, int cc) { zdialog *zd; int zstat; ch *text; ch size[20]; if (! main_thread()) zappcrash("illegal call from thread"); zd = zdialog_new(title,parent,"OK","X",null); zdialog_add_widget(zd,"hbox","hbtext","dialog",0,"space=5"); snprintf(size,20,"size=%d",cc); zdialog_add_widget(zd,"entry","text","hbtext",0,size); if (inittext) zdialog_stuff(zd,"text",inittext); zdialog_resize(zd,300,0); zdialog_set_modal(zd); zdialog_run(zd,0,"mouse"); zstat = zdialog_wait(zd); if (zstat == 1) text = (ch *) zdialog_get_data(zd,"text"); else text = 0; if (text) text = zstrdup(text,"zdialog_text"); zdialog_free(zd); return text; } /**************************************************************************************/ // get password input from a popup dialog - one line only // user input is hidden as '*' characters. // returned text is subject for zfree() // null is returned if user presses [cancel] button. ch * zdialog_password(GtkWidget *parent, ch *title, ch *inittext) { int zdialog_password_event(zdialog *zd, ch *event); zdialog *zd; int zstat; ch *text; GtkWidget *widget; if (! main_thread()) zappcrash("illegal call from thread"); zd = zdialog_new(title,parent,"OK","X",null); zdialog_add_widget(zd,"entry","text","dialog",0); widget = zdialog_gtkwidget(zd,"text"); gtk_entry_set_visibility(GTK_ENTRY(widget),0); if (inittext) zdialog_stuff(zd,"text",inittext); zdialog_resize(zd,300,0); zdialog_set_modal(zd); zdialog_run(zd,zdialog_password_event,"mouse"); zstat = zdialog_wait(zd); if (zstat == 1) text = (ch *) zdialog_get_data(zd,"text"); else text = 0; if (text) text = zstrdup(text,"zdialog_password"); zdialog_free(zd); return text; } int zdialog_password_event(zdialog *zd, ch *event) { if (strmatch(event,"activate")) zd->zstat = 1; return 1; } /**************************************************************************************/ // Display a dialog with 1-5 radio buttons with text labels . // Button 1 is the default and is pre-selected. // Returns choice 1-5 corresponding to button selected. // Returns -1 if cancel button [x] or completion button [X] is selected. // // nn = zdialog_choose(parent, where, message, text1, text2, ... null) // 'where' is null: window manager decides dialog placement // "mouse" put dialog at mouse position // "desktop" center dialog in desktop window // "parent" center dialog in parent window namespace zdialog_choose_names { int button; // button pushed 1-5 } int zdialog_choose(GtkWidget *parent, ch *where, ch *message, ...) // improved 26.0 { using namespace zdialog_choose_names; int zdialog_choose_event(zdialog *zd, ch *event); zdialog *zd; va_list arglist; int ii, Ntext; ch *text[5]; ch butt[4] = "B0"; if (! main_thread()) zappcrash("illegal call from thread"); button = 0; // no button pushed va_start(arglist,message); for (ii = 0; ii < 5; ii++) { text[ii] = va_arg(arglist,ch *); if (! text[ii]) break; } Ntext = ii; if (! Ntext) zappcrash("zdialog_choose(), no buttons"); zd = zdialog_new("choose",parent,null); zdialog_add_widget(zd,"label","labmess","dialog",message,"space=5"); zdialog_add_widget(zd,"hbox","hbb","dialog",0,"space=5"); for (ii = 0; ii < Ntext; ii++) { butt[1] = '1' + ii; // button names: "B1" "B2" etc. zdialog_add_widget(zd,"zbutton",butt,"hbb",text[ii],"space=2"); } zdialog_set_decorated(zd,0); zdialog_set_modal(zd); zdialog_run(zd,zdialog_choose_event,where); zdialog_wait(zd); zdialog_free(zd); printf("dialog choose: %s \n",text[button-1]); return button; } // dialog event and completion function int zdialog_choose_event(zdialog *zd, ch *event) { using namespace zdialog_choose_names; if (! main_thread()) zappcrash("illegal call from thread"); if (strstr("B1 B2 B3 B4 B5",event)) button = event[1] - '0'; // set button pushed 1-5 zd->zstat = 0; if (button) zd->zstat = 1; return 1; } /**************************************************************************************/ // popup zdialog to edit a text file // returns 0 if OK or user cancel, +N if error int zdialog_edit_textfile(GtkWidget *parent, char *file) { zdialog *zd; int cc, err, zstat, maxcc = 1000000; // max. file size char *pp, *title, buff[1000001]; FILE *fid; if (! main_thread()) zappcrash("illegal call from thread"); snprintf(buff,maxcc,"du -b %s",file); // command to get file size fid = popen(buff,"r"); // run 'du' command if (! fid) goto filerr; pp = fgets(buff,100,fid); // read command output pclose(fid); if (! pp) goto filerr; cc = atoi(pp); // file size if (cc < 0 || cc > maxcc) { // reject file > 1 MB printf("*** file size > %d: %s \n",maxcc,file); return 1; } fid = fopen(file,"r"); // open file if (! fid) goto filerr; for (cc = 0; ; ) { pp = fgets(buff+cc,maxcc-cc,fid); // read entire file if (! pp) break; cc += strlen(pp); } fclose(fid); title = strrchr(file,'/'); // get root file name if (title) title++; else title = file; zd = zdialog_new(title,parent,TX("Apply"),"X",null); // create text edit dialog zdialog_add_widget(zd,"scrwin","scroll","dialog",0,"expand"); zdialog_add_widget(zd,"zedit","text","scroll",0,"expand"); zdialog_stuff(zd,"text",buff); // stuff file text into dialog zdialog_resize(zd,500,400); zdialog_run(zd,0,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for completion if (zstat != 1) { zdialog_free(zd); // user cancel return 0; } zdialog_fetch(zd,"text",buff,maxcc); // get edited text zdialog_free(zd); cc = strlen(buff); if (cc > maxcc) { printf("*** edited file size > %d: %s \n",maxcc,file); return 1; } fid = fopen(file,"w"); if (! fid) goto filerr; err = fputs(buff,fid); if (err < 0 || err == EOF) goto filerr; err = fclose(fid); if (err) goto filerr; return 0; filerr: printf("*** file error: %s %s \n",strerror(errno),file); return 1; } /************************************************************************************** popup window with scrolling text report line numbers and line positions are zero based open the report window with given title and pixel dimensions Fheader add optional non-scrolling header at top of report window CBfunc optional callback function: void CBfunc(GtkWidget *, int line, int posn, ch *input) ... optional dialog completion buttons terminated with null: [OK] [X] [Find] [Save] [Esc] are processed here others are passed to callback function ( --> input) zdialog->zstat = 1/2 for buttons [OK] / [X] ***/ zdialog * popup_report_open(ch *title, GtkWidget *parent, int ww, int hh, int wrap, int Fheader, txwidget_CBfunc_t CBfunc, ...) { int popup_report_dialog_event(zdialog *zd, ch *event); va_list arglist; ch *butn[6]; // up to 5 buttons + null int ii, NB; zdialog *zd; GtkWidget *mHead, *mText; if (! main_thread()) zappcrash("illegal call from thread"); va_start(arglist,CBfunc); // get button args, if any for (ii = 0; ii < 5; ii++) { // up to 5 buttons 25.1 butn[ii] = va_arg(arglist,ch *); if (! butn[ii]) break; } NB = ii; // no. buttons zd = zdialog_new(title,parent,null); if (Fheader) { // non-scrolling header zdialog_add_widget(zd,"text","header","dialog"); zdialog_add_widget(zd,"hsep","hsep","dialog"); } zdialog_add_widget(zd,"scrwin","scroll","dialog",0,"expand"); // scrolling text window for report if (wrap) zdialog_add_widget(zd,"report","text","scroll",0,"expand|wrap"); // text > report else zdialog_add_widget(zd,"report","text","scroll",0,"expand"); if (NB) { // optional event buttons zdialog_add_widget(zd,"hbox","hbbutn","dialog"); zdialog_add_widget(zd,"label","space","hbbutn",0,"expand"); for (ii = 0; ii < NB; ii++) zdialog_add_widget(zd,"button",butn[ii],"hbbutn",butn[ii],"space=5"); } zdialog_resize(zd,ww,hh); // show report dialog box zdialog_run(zd,popup_report_dialog_event); // keep window size and position if (Fheader) { mHead = zdialog_gtkwidget(zd,"header"); // header initially invisible gtk_widget_set_visible(mHead,0); } mText = zdialog_gtkwidget(zd,"text"); // report text not editable gtk_widget_grab_focus(mText); if (CBfunc) { // 25.1 txwidget_set_eventfunc(mText,CBfunc); // set mouse/KB event function zd->popup_report_CB = (void *) CBfunc; } return zd; } // dialog event and completion function [OK] [ X ] [Find] [Save] [Esc] int popup_report_dialog_event(zdialog *zd, ch *event) { txwidget_CBfunc_t *CBfunc; GtkWidget *mText; static ch findtext[40] = ""; int linem, line1, line2; zdialog *zdf; if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return 1; // report cancelled if (strmatch(event,"focus")) return 0; if (zd->zstat) { // [x] cancel or escape, kill dialog zdialog_free(zd); return 1; } if (strstr(" OK X escape",event)) { // kill report window 25.0 zdialog_free(zd); return 1; } if (strmatch(event,"Find")) { // [Find] zdf = zdialog_new("find text",zd->dialog,"Find","X",null); // popup dialog to enter text zdialog_add_widget(zdf,"zentry","text","dialog",findtext,"size=20"); zdialog_run(zdf,0,"mouse"); linem = -1; // no match line yet while (true) { zdialog_wait(zdf); if (zdf->zstat != 1) { // [cancel] zdialog_free(zdf); return 1; } zdf->zstat = 0; zdialog_fetch(zdf,"text",findtext,40); // get text popup_report_get_visible_lines(zd,line1,line2); // lines now visible if (linem < 0) linem = line1; // search from 1st visible line linem = popup_report_find(zd,findtext,linem); // search for text if (linem < 0) continue; // not found popup_report_scroll_top(zd,linem); // found, scroll to top linem++; // next search from line } } if (strmatch(event,"Save")) { // [Save] save text to file mText = zdialog_gtkwidget(zd,"text"); txwidget_save(mText,GTK_WINDOW(zd->parent)); return 1; } mText = zdialog_gtkwidget(zd,"text"); CBfunc = (txwidget_CBfunc_t *) zd->popup_report_CB; // other event if (CBfunc) CBfunc(mText,-1,-1,event); // pass to callback function return 1; } // write a non-scrolling header line void popup_report_header(zdialog *zd, int bold, ch *format, ...) { va_list arglist; ch message[1000]; GtkWidget *mHead; if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } va_start(arglist,format); vsnprintf(message,999,format,arglist); va_end(arglist); mHead = zdialog_gtkwidget(zd,"header"); txwidget_append(mHead,bold,message); gtk_widget_set_visible(mHead,1); return; } // write a new text line at the end void popup_report_write(zdialog *zd, int bold, ch *format, ...) { va_list arglist; ch message[20000]; GtkWidget *mText; if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } va_start(arglist,format); vsnprintf(message,19999,format,arglist); va_end(arglist); mText = zdialog_gtkwidget(zd,"text"); txwidget_append(mText,bold,"%s",message); return; } // write a new text line at the end, scroll down to end void popup_report_write2(zdialog *zd, int bold, ch *format, ...) { va_list arglist; ch message[20000]; GtkWidget *mText; if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } va_start(arglist,format); vsnprintf(message,19999,format,arglist); va_end(arglist); mText = zdialog_gtkwidget(zd,"text"); txwidget_append2(mText,bold,"%s",message); return; } // scroll window back to top line void popup_report_top(zdialog *zd) { if (! main_thread()) zappcrash("illegal call from thread"); GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_scroll(mText,0); return; } // scroll window back to bottom line void popup_report_bottom(zdialog *zd) { if (! main_thread()) zappcrash("illegal call from thread"); GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_scroll(mText,-1); return; } // clear the report window void popup_report_clear(zdialog *zd) { if (! main_thread()) zappcrash("illegal call from thread"); GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_clear(mText); return; } // clear the report window from line to end void popup_report_clear(zdialog *zd, int line) { if (! main_thread()) zappcrash("illegal call from thread"); GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_clear(mText,line); return; } // insert a new line after a given line void popup_report_insert(zdialog *zd, int bold, int line, ch *format, ...) { va_list arglist; ch message[20000]; GtkWidget *mText; if (! main_thread()) zappcrash("illegal call from thread"); va_start(arglist,format); vsnprintf(message,19999,format,arglist); va_end(arglist); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } mText = zdialog_gtkwidget(zd,"text"); txwidget_insert(mText,bold,line,message); return; } // replace a given line void popup_report_replace(zdialog *zd, int bold, int line, ch *format, ...) { va_list arglist; ch message[20000]; GtkWidget *mText; if (! main_thread()) zappcrash("illegal call from thread"); va_start(arglist,format); vsnprintf(message,19999,format,arglist); va_end(arglist); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } mText = zdialog_gtkwidget(zd,"text"); txwidget_replace(mText,bold,line,message); return; } // delete a given line void popup_report_delete(zdialog *zd, int line) { if (! main_thread()) zappcrash("illegal call from thread"); GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_delete(mText,line); return; } // find first line of text containing characters matching input string // search is from line1 to end, then from 0 to line1-1 // returns first matching line or -1 if none // comparison is not case sensitive int popup_report_find(zdialog *zd, ch *matchtext, int line1) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return 1; } GtkWidget *mText = zdialog_gtkwidget(zd,"text"); return txwidget_find(mText,matchtext,line1,1); // highlight line } // insert a pixbuf image after a given line void popup_report_insert_pixbuf(zdialog *zd, int line, GdkPixbuf *pixbuf) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_insert_pixbuf(mText,line,pixbuf); return; } // scroll to bring a given line into the report window void popup_report_scroll(zdialog *zd, int line) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_scroll(mText,line); return; } // scroll to bring a given line to the top of the report window void popup_report_scroll_top(zdialog *zd, int line) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_scroll_top(mText,line); return; } // get the range of visible lines in the report window void popup_report_get_visible_lines(zdialog *zd, int &vtop, int &vbott) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_get_visible_lines(mText,vtop,vbott); return; } // retrieve a given line and optionally strip the trailing \n ch * popup_report_line(zdialog *zd, int line, int strip) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return 0; } GtkWidget *mText = zdialog_gtkwidget(zd,"text"); return txwidget_line(mText,line,strip); } // retrieve the word starting at a given position in a given line ch * popup_report_word(zdialog *zd, int line, int posn, ch *dlims, ch &end) { if (! main_thread()) zappcrash("illegal call from thread"); GtkWidget *mText = zdialog_gtkwidget(zd,"text"); return txwidget_word(mText,line,posn,dlims,end); } // highlight a given line of text void popup_report_highlight_line(zdialog *zd, int line) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_highlight_line(mText,line); return; } // highlight the text at a given position and length in a given line void popup_report_highlight_word(zdialog *zd, int line, int posn, int cc) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_highlight_word(mText,line,posn,cc); return; } // underline the text at a given position and length in a given line void popup_report_underline_word(zdialog *zd, int line, int posn, int cc) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_underline_word(mText,line,posn,cc); return; } // bold the text at a given position and length in a given line void popup_report_bold_word(zdialog *zd, int line, int posn, int cc) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) { printf("report cancelled \n"); return; } GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_bold_word(mText,line,posn,cc); return; } // set font attributes for entire report // temp. kludge void popup_report_font_attributes(zdialog *zd) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return; GtkWidget *mText = zdialog_gtkwidget(zd,"text"); txwidget_font_attributes(mText); return; } // close report after given seconds (OK to leave it open until user closes) // also connected to window destroy signal (secs = 0) void popup_report_close(zdialog *zd, int secs) { void popup_report_timeout(zdialog *zd); if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return; if (secs < 1) { zdialog_free(zd); return; } g_timeout_add_seconds(secs,(GSourceFunc) popup_report_timeout,zd); return; } // private function for report timeout void popup_report_timeout(zdialog *zd) { if (! main_thread()) zappcrash("illegal call from thread"); if (! zdialog_valid(zd)) return; zdialog_free(zd); return; } /**************************************************************************************/ // execute a shell command and show the output in a scrolling popup window // returns: 0 = EOF 1 = command failure int popup_command(ch *command, int ww, int hh, GtkWidget *parent, int top) { FILE *fid; ch buff[1000], *pp; zdialog *zd; if (! main_thread()) zappcrash("illegal call from thread"); printf("run command: %s \n",command); zd = popup_report_open(command,parent,ww,hh,0,0,0,"Find","Save","X",null); fid = popen(command,"r"); if (! fid) return 1; while (true) { pp = fgets_trim(buff,1000,fid); if (! pp) break; popup_report_write2(zd,0,"%s\n",pp); } pclose(fid); if (top) popup_report_top(zd); // back to top of window return 0; } /**************************************************************************************/ // show a text file in a popup window // show appended records in real-time until window is closed // return: 0 = OK // 1 = not a text file // 2 = cannot open popup report window // 3 = cannot open file int monitor_file(ch *file) // 25.1 { zdialog *zd; FILE *fid; ch buff[500]; ch *title, *pp; if (! main_thread()) zappcrash("illegal call from thread"); printf("monitor file: %s \n",file); snprintf(buff,500,"file \"%s\" ",file); // check for text file fid = popen(buff,"r"); pp = fgets(buff,500,fid); pclose(fid); if (! pp || ! strstr(pp,"text")) return 1; title = strrchr(file,'/') + 1; zd = popup_report_open(title,0,600,400,1,0,0,"Find","Save","X",null); if (! zd) return 2; snprintf(buff,500,"tail -f \"%s\" ",file); fid = popen(buff,"r"); if (! fid) return 3; while (true) { zmainsleep(0.01); // limit 100/sec if (! zdialog_valid(zd)) break; // popup window closed, exit pp = fgets_pend(buff,500,fid); // read next log record if (! pp) break; // EOF or error, exit if (strmatch(pp,"fgets_pend\n")) continue; // next record not available yet popup_report_write2(zd,0,"%s",pp); // output record to window } pclose(fid); exit(0); } /**************************************************************************************/ // convert a dialog message into a bold/red font ch * boldred(ch *message) // 25.1 { static ch boldredmess[2000]; snprintf(boldredmess,2000,"%s",message); return boldredmess; } /**************************************************************************************/ // Display popup message box and wait for user acknowledgement. // Messages are presented sequentially from main() and from threads. namespace zmessageACK_names { int Finit = 0; ch buffer[2000]; GtkWidget *Pwindow; } void zmessageACK(GtkWidget *parent, ch *format, ... ) // rewrite for threads 25.1 { using namespace zmessageACK_names; int zmessageACK_timerfunc(void *); va_list arglist; ch message[2000]; if (! Finit) { // initz. message processor Finit = 1; *buffer = 0; g_timeout_add(100,zmessageACK_timerfunc,0); } va_start(arglist,format); // format the message vsnprintf(message,2000,format,arglist); va_end(arglist); printf("%s \n",message); // output to log file while (*buffer) zsleep(0.1); // wait for parallel caller strncpy0(buffer,boldred(message),2000); // bold/red 25.1 Pwindow = parent; while (* buffer) zmainsleep(0.1); // wait for this caller response return; } int zmessageACK_timerfunc(void *) // loop every 0.1 sec. { using namespace zmessageACK_names; zdialog *zd; ch *posn; if (! *buffer) return 1; if (Fshutdown) return 0; if (Pwindow) posn = "parent"; else posn = "desktop"; zd = zdialog_new("ACK",Pwindow,"OK",null); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","lab1","hb1",buffer,"space=5"); zdialog_resize(zd,200,0); zdialog_set_modal(zd); zdialog_set_decorated(zd,0); zdialog_run(zd,0,posn); zdialog_wait(zd); zdialog_free(zd); *buffer = 0; return 1; } /**************************************************************************************/ // display message box and wait for user Yes or No response // returns 1 or 0 int zmessageYN(GtkWidget *parent, ch *format, ... ) { va_list arglist; ch message[500]; ch *posn; zdialog *zd; int zstat; if (! main_thread()) zappcrash("illegal call from thread"); va_start(arglist,format); vsnprintf(message,500,format,arglist); va_end(arglist); printf("%s \n",message); // output to log file if (parent) posn = "parent"; else posn = "desktop"; zd = zdialog_new("YN",parent,TX("Yes"),TX("No"),null); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","lab1","hb1",boldred(message),"space=5"); zdialog_resize(zd,200,0); zdialog_set_modal(zd); zdialog_set_decorated(zd,0); zdialog_run(zd,0,posn); zstat = zdialog_wait(zd); zdialog_free(zd); zmainloop(); if (zstat == 1) return 1; return 0; } /**************************************************************************************/ // display bold red message until timeout (can be forever) or user cancel // or caller kills it with zdialog_free() // posn - from zdialog_run(): // "mouse" = position at mouse // "desktop" = center on desktop // "parent" = center on parent window // "nn/nn" = position NW corner at relative x/y position in parent window, // where nn/nn is a percent 0-100 of the parent window dimensions. // seconds: time to keep message on screen, 0 = forever until cancelled typedef struct { zdialog *zd; int uniqueID; } zdx_t; zdialog * zmessage_post(GtkWidget *parent, ch *posn, int seconds, ch *format, ... ) { int zmessage_post_timeout(zdx_t *zdx); va_list arglist; ch message[400]; static zdx_t zdx[100]; static int ii = 0; zdialog *zd; if (! main_thread()) zappcrash("illegal call from thread"); va_start(arglist,format); vsnprintf(message,400,format,arglist); va_end(arglist); printf("%s \n",message); // output to log file zd = zdialog_new("post",parent,null); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","lab1","hb1",boldred(message),"space=5"); zdialog_run(zd,0,posn); // mouse position zdialog_set_decorated(zd,0); zdialog_present(zd); if (seconds) { if (ii < 99) ii++; // track unique zdialogs else ii = 0; zdx[ii].zd = zd; zdx[ii].uniqueID = zd->uniqueID; g_timeout_add_seconds(seconds,(GSourceFunc) zmessage_post_timeout,&zdx[ii]); } return zd; } int zmessage_post_timeout(zdx_t *zdx) { zdialog *zd = zdx->zd; // check unique zdialog active if (! zdialog_valid2(zd,"post")) return 0; if (zd->uniqueID != zdx->uniqueID) return 0; zdialog_free(zd); return 0; } /**************************************************************************************/ // functions to show popup text windows namespace poptext { ch *ptext = 0; GtkWidget *popwin = 0; ch *pcurrent = 0; #define GSFNORMAL GTK_STATE_FLAG_NORMAL } // timer function to show popup window after a given time int poptext_show(ch *current) { using namespace poptext; if (! main_thread()) zappcrash("illegal call from thread"); if (current != pcurrent) return 0; if (popwin) gtk_widget_show_all(popwin); return 0; } // timer function to kill popup window after a given time int poptext_timeout(ch *current) { using namespace poptext; if (! main_thread()) zappcrash("illegal call from thread"); if (current != pcurrent) return 0; poptext_killnow(); // 25.0 return 0; } // Show a popup text message at a given absolute screen position. // Any prior popup will be killed and replaced. // If text == null, kill without replacement. // secs1 is time to delay before showing the popup. // secs2 is time to kill the popup after it is shown (0 = never). // This function returns immediately. void poptext_screen(ch *text, int px, int py, float secs1, float secs2) { using namespace poptext; GtkWidget *label; int millisec1, millisec2; if (! main_thread()) zappcrash("illegal call from thread"); poptext_killnow(); pcurrent++; // make current != pcurrent if (! text) return; popwin = gtk_window_new(GTK_WINDOW_POPUP); label = gtk_label_new(text); gtk_container_set_border_width(GTK_CONTAINER(popwin),5); // 25.0 gtk_container_add(GTK_CONTAINER(popwin),label); gtk_window_move(GTK_WINDOW(popwin),px,py); if (secs1 > 0) { // delayed popup display millisec1 = secs1 * 1000; g_timeout_add(millisec1,(GSourceFunc) poptext_show,pcurrent); } else gtk_widget_show_all(popwin); // immediate display if (secs2 > 0) { // popup kill timer millisec2 = (secs1 + secs2) * 1000; g_timeout_add(millisec2,(GSourceFunc) poptext_timeout,pcurrent); } return; } // Show a popup text message at current mouse position + offsets. void poptext_mouse(ch *text, int dx, int dy, float secs1, float secs2) { using namespace poptext; int mx, my; ch *ptext2; GtkWidget *popwin2; if (! main_thread()) zappcrash("illegal call from thread"); if (! text) { poptext_killnow(); return; } popwin2 = popwin; ptext2 = ptext; popwin = 0; ptext = 0; gdk_device_get_position(zfuncs::mouse,0,&mx,&my); // mouse screen position poptext_screen(text,mx+dx,my+dy,secs1,secs2); // add displacements zmainloop(); if (popwin2) gtk_widget_destroy(popwin2); // kill prior after create new if (ptext2) zfree(ptext2); // (prevent flicker) return; } // Show a popup text message at the given widget position. void poptext_widget(GtkWidget *widget, ch *text, int dx, int dy, float secs1, float secs2) { GdkWindow *win; int px, py; if (! main_thread()) zappcrash("illegal call from thread"); if (! text) { poptext_killnow(); return; } win = gtk_widget_get_window(widget); gdk_window_get_origin(win,&px,&py); poptext_screen(text,px+dx,py+dy,secs1,secs2); return; } // kill popup window unconditionally int poptext_killnow() { using namespace poptext; if (popwin) gtk_widget_destroy(popwin); if (ptext) zfree(ptext); popwin = 0; ptext = 0; return 0; } /************************************************************************************** File chooser dialog for one or more files Action: "file" select an existing file "files" select multiple existing files "save" select an existing or new file "folder" select existing folder "folders" select multiple existing folders "create folder" select existing or new folder hidden if > 0, add button to toggle display of hidden files optional, default = 0 Returns a list of filespecs terminated with null. Memory for returned list and returned files are subjects for zfree(); *********************************************************************************/ // version for 1 file only: file, save, folder, create folder // returns one filespec or null // returned file is subject for zfree() ch * zgetfile(ch *title, GtkWindow *parent, ch *action, ch *initfile, int hidden) { if (! main_thread()) zappcrash("illegal call from thread"); if (! strmatchV(action,"file","save","folder","create folder",null)) zappcrash("zgetfile() call error: %s",action); ch **flist = zgetfiles(title,parent,action,initfile,hidden); if (! flist) return 0; ch *file = *flist; zfree(flist); return file; } // version for 2 or more files // returns a list of filespecs (ch **) terminated with null // returns null if canceled by user // returned list members and returned list are subjects for zfree() ch ** zgetfiles(ch *title, GtkWindow *parent, ch *action, ch *initfile, int hidden) { void zgetfile_preview(GtkWidget *dialog, GtkWidget *pvwidget); // private functions int zgetfile_KBkey(GtkWidget *dialog, GdkEventKey *event, int &fcdes); void zgetfile_newfolder(GtkFileChooser *dialog, void *); GtkFileChooserAction fcact = GTK_FILE_CHOOSER_ACTION_OPEN; GtkWidget *dialog; PIXBUF *thumbnail; GtkWidget *pvwidget = gtk_image_new(); GSList *gslist = 0; ch *button1 = 0, *buttxx = 0; ch *pdir, *pfile; int ii, err, NF, setfname = 0; int fcstat, bcode = 0, hide = 1; int fcdes = 0; ch *file1, *file2, **flist = 0; STATB statB; if (! main_thread()) zappcrash("illegal call from thread"); if (strmatch(action,"file")) { fcact = GTK_FILE_CHOOSER_ACTION_OPEN; button1 = TX("choose file"); } else if (strmatch(action,"files")) { fcact = GTK_FILE_CHOOSER_ACTION_OPEN; button1 = TX("choose files"); } else if (strmatch(action,"save")) { fcact = GTK_FILE_CHOOSER_ACTION_SAVE; button1 = TX("Save"); setfname = 1; } else if (strmatch(action,"folder")) { fcact = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; button1 = TX("choose folder"); } else if (strmatch(action,"folders")) { fcact = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; button1 = TX("choose folders"); } else if (strmatch(action,"create folder")) { fcact = GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER; button1 = TX("create folder"); setfname = 1; } else zappcrash("zgetfiles() call error: %s",action); if (hidden) { buttxx = "hidden"; bcode = 103; } dialog = gtk_file_chooser_dialog_new(title, parent, fcact, // create file selection dialog button1, GTK_RESPONSE_ACCEPT, // parent added "X", GTK_RESPONSE_CANCEL, buttxx, bcode, null); gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog),pvwidget); G_SIGNAL(dialog,"update-preview",zgetfile_preview,pvwidget); // create preview for selected file G_SIGNAL(dialog,"key-press-event",zgetfile_KBkey,&fcdes); // respond to special KB keys gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_MOUSE); // put dialog at mouse position gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(dialog),0); // default: no show hidden if (strmatch(action,"save")) // overwrite confirmation gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog),1); if (strmatch(action,"files") || strmatch(action,"folders")) gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog),1); // select multiple files or folders if (initfile) { // pre-select filespec err = stat(initfile,&statB); if (err) { pdir = zstrdup(initfile,"zgetfiles"); // non-existent file pfile = strrchr(pdir,'/'); if (pfile && pfile > pdir) { *pfile++ = 0; // set folder name gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),pdir); } if (setfname) { // set new file name if (! pfile) pfile = (ch *) initfile; gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),pfile); } zfree(pdir); } else if (S_ISREG(statB.st_mode)) // select given file gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),initfile); else if (S_ISDIR(statB.st_mode)) // select given folder gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),initfile); } if (initfile) { thumbnail = get_thumbnail(initfile,256); // preview for initial file if (thumbnail) { gtk_image_set_from_pixbuf(GTK_IMAGE(pvwidget),thumbnail); gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(dialog),1); g_object_unref(thumbnail); } else gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(dialog),0); } gtk_widget_show_all(dialog); while (true) { fcstat = gtk_dialog_run(GTK_DIALOG(dialog)); // run dialog, get status button if (fcstat == 103) { // show/hide hidden files hide = 1 - hide; gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(dialog),hide); continue; } else if (fcstat == GTK_RESPONSE_ACCEPT) { gslist = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog)); if (! gslist) continue; NF = g_slist_length(gslist); // no. selected files flist = (ch **) zmalloc((NF+1)*sizeof(ch *),"zgetfiles"); // allocate returned list for (ii = 0; ii < NF; ii++) { // process selected files file1 = (ch *) g_slist_nth_data(gslist,ii); file2 = zstrdup(file1,"zgetfiles"); // re-allocate memory flist[ii] = file2; g_free(file1); } flist[ii] = 0; // EOL marker break; } else break; // user bailout } if (gslist) g_slist_free(gslist); // return selected file(s) if (! fcdes) gtk_widget_destroy(dialog); // destroy if not already return flist; } // zgetfile private function - get preview images for image files void zgetfile_preview(GtkWidget *dialog, GtkWidget *pvwidget) { PIXBUF *thumbnail; ch *filename; filename = gtk_file_chooser_get_preview_filename(GTK_FILE_CHOOSER(dialog)); if (! filename) { gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(dialog),0); return; } thumbnail = get_thumbnail(filename,256); // 256x256 pixels g_free(filename); if (thumbnail) { gtk_image_set_from_pixbuf(GTK_IMAGE(pvwidget),thumbnail); gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(dialog),1); g_object_unref(thumbnail); } else gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(dialog),0); return; } // zgetfile private function - KB functions int zgetfile_KBkey(GtkWidget *dialog, GdkEventKey *event, int &fcdes) { int KBkey = event->keyval; if (KBkey == GDK_KEY_F1) { // F1 = help KBevent(event); return 1; } if (KBkey == GDK_KEY_Escape) { // escape = cancel gtk_widget_destroy(dialog); fcdes = 1; return 1; } return 0; } /**************************************************************************************/ // select a folder (or create a new folder) // returns location (pathname) of selected or created folder. // returned location is subject for zfree(). ch * zgetfolder(ch *title, GtkWindow *parent, ch *initfolder) { GtkWidget *dialog; GtkFileChooser *chooser; int nn; ch *pp1, *pp2 = null; if (! main_thread()) zappcrash("illegal call from thread"); dialog = gtk_file_chooser_dialog_new(title, parent, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, "X", GTK_RESPONSE_CANCEL, "Open", GTK_RESPONSE_ACCEPT, NULL); chooser = GTK_FILE_CHOOSER(dialog); gtk_file_chooser_set_filename(chooser, initfolder); nn = gtk_dialog_run(GTK_DIALOG(dialog)); if (nn != GTK_RESPONSE_ACCEPT) { gtk_widget_destroy(dialog); return null; } pp1 = gtk_file_chooser_get_filename(chooser); if (pp1) { pp2 = zstrdup(pp1,"zgetfolder"); g_free(pp1); } gtk_widget_destroy(dialog); return pp2; } /************************************************************************************** print_image_file(GtkWidget *parent, ch *imagefile) Print an image file using the printer, paper, orientation, margins, and scale set by the user. HPLIP problem: Setting paper size was made less flexible. GtkPrintSettings paper size must agree with the one in the current printer setup. This can only be set in the printer setup dialog, not in the application. Also the print size (width, height) comes from the chosen paper size and cannot be changed in the application. Print margins can be changed to effect printing a smaller or shifted image on a larger paper size. *********************************************************************************/ namespace print_image { #define MM GTK_UNIT_MM #define INCH GTK_UNIT_INCH #define PRINTOP GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG #define PORTRAIT GTK_PAGE_ORIENTATION_PORTRAIT #define LANDSCAPE GTK_PAGE_ORIENTATION_LANDSCAPE #define QUALITY GTK_PRINT_QUALITY_HIGH GtkWidget *parent = 0; GtkPageSetup *priorpagesetup = 0; GtkPageSetup *pagesetup; GtkPrintSettings *printsettings = 0; GtkPrintOperation *printop; GtkPageOrientation orientation = PORTRAIT; PIXBUF *pixbuf; ch *printer = 0; int landscape = 0; // true if landscape double width = 21.0, height = 29.7; // paper size, CM (default A4 portrait) double margins[4] = { 0.5, 0.5, 0.5, 0.5 }; // margins, CM (default 0.5) double imagescale = 100; // image print scale, percent double pwidth, pheight; // printed image size int page_setup(); int margins_setup(); int margins_dialog_event(zdialog *zd, ch *event); void get_printed_image_size(); void print_page(GtkPrintOperation *, GtkPrintContext *, int page); } // user callable function to set paper, margins, scale, and then print void print_image_file(GtkWidget *pwin, ch *imagefile) { using namespace print_image; GtkPrintOperationResult printstat; GError *gerror = 0; int err; if (! main_thread()) zappcrash("illegal call from thread"); parent = pwin; // save parent window pixbuf = gdk_pixbuf_new_from_file(imagefile,&gerror); // read image file if (! pixbuf) { zmessageACK(mainwin,gerror->message); return; } err = page_setup(); // select size and orientation if (err) return; err = margins_setup(); // set margins and scale if (err) return; printop = gtk_print_operation_new(); // print operation gtk_print_operation_set_default_page_setup(printop,pagesetup); gtk_print_operation_set_print_settings(printop,printsettings); gtk_print_operation_set_n_pages(printop,1); g_signal_connect(printop,"draw-page",G_CALLBACK(print_page),0); // start print printstat = gtk_print_operation_run(printop,PRINTOP,0,0); if (printstat == GTK_PRINT_OPERATION_RESULT_ERROR) { gtk_print_operation_get_error(printop,&gerror); zmessageACK(mainwin,gerror->message); } g_object_unref(printop); return; } // draw the graphics for the print page // rescale with cairo void print_image::print_page(GtkPrintOperation *printop, GtkPrintContext *printcontext, int page) { using namespace print_image; cairo_t *cairocontext; double iww, ihh, pww, phh, scale; pww = gtk_print_context_get_width(printcontext); // print context size, pixels phh = gtk_print_context_get_height(printcontext); iww = gdk_pixbuf_get_width(pixbuf); // original image size ihh = gdk_pixbuf_get_height(pixbuf); scale = pww / iww; // rescale to fit page if (phh / ihh < scale) scale = phh / ihh; cairocontext = gtk_print_context_get_cairo_context(printcontext); // use cairo to rescale cairo_translate(cairocontext,0,0); cairo_scale(cairocontext,scale,scale); gdk_cairo_set_source_pixbuf(cairocontext,pixbuf,0,0); cairo_paint(cairocontext); return; } // Do a print paper format selection, after which the page width, height // and orientation are available to the caller. Units are CM. // (paper width and height are reversed for landscape orientation) int print_image::page_setup() { using namespace print_image; ch printsettingsfile[200], pagesetupfile[200]; snprintf(printsettingsfile,200,"%s/printsettings",zhomedir); snprintf(pagesetupfile,200,"%s/pagesetup",zhomedir); if (! printsettings) { // start with prior print settings printsettings = gtk_print_settings_new_from_file(printsettingsfile,0); if (! printsettings) printsettings = gtk_print_settings_new(); } if (! priorpagesetup) { // start with prior page setup priorpagesetup = gtk_page_setup_new_from_file(pagesetupfile,0); if (! priorpagesetup) priorpagesetup = gtk_page_setup_new(); } pagesetup = gtk_print_run_page_setup_dialog // select printer, paper, orientation (GTK_WINDOW(parent),priorpagesetup,printsettings); // user cancel cannot be detected g_object_unref(priorpagesetup); // save for next call priorpagesetup = pagesetup; orientation = gtk_print_settings_get_orientation(printsettings); // save orientation if (orientation == LANDSCAPE) landscape = 1; else landscape = 0; gtk_print_settings_set_quality(printsettings,QUALITY); // set high quality 300 dpi gtk_print_settings_set_resolution(printsettings,300); gtk_print_settings_to_file(printsettings,printsettingsfile,0); // save print settings to file gtk_page_setup_to_file(pagesetup,pagesetupfile,0); // save print settings to file return 0; } // Optionally set the print margins and print scale. // If canceled the margins are zero (or printer-dependent minimum) // and the scale is 100% (fitting the paper and margins). int print_image::margins_setup() { using namespace print_image; zdialog *zd; int zstat; /*** __________________________________________________ | [x] (-) [_] Margins | | | | Margins Top Bottom Left Right | | CM [ 0.50 ] [ 0.50 ] [ 0.50 ] [ 0.50 ] | | Inch [ 0.20 ] [ 0.20 ] [ 0.20 ] [ 0.20 ] | | | | image scale [ 80 ] percent | | | | image width height | | CM xx.x xx.x | | Inch xx.x xx.x | | [ OK ] [X] | |__________________________________________________| ***/ zd = zdialog_new(TX("Margins"),parent,"OK","X",null); zdialog_add_widget(zd,"hbox","hbmlab","dialog"); zdialog_add_widget(zd,"vbox","vbmarg","hbmlab",0,"homog|space=3"); zdialog_add_widget(zd,"vbox","vbtop","hbmlab",0,"homog|space=3"); zdialog_add_widget(zd,"vbox","vbbottom","hbmlab",0,"homog|space=3"); zdialog_add_widget(zd,"vbox","vbleft","hbmlab",0,"homog|space=3"); zdialog_add_widget(zd,"vbox","vbright","hbmlab",0,"homog|space=3"); zdialog_add_widget(zd,"label","labmarg","vbmarg",TX("Margins"),"space=5"); zdialog_add_widget(zd,"label","labcm","vbmarg","CM","space=5"); zdialog_add_widget(zd,"label","labinch","vbmarg","Inch","space=5"); zdialog_add_widget(zd,"label","labtop","vbtop",TX("Top")); zdialog_add_widget(zd,"zspin","mtopcm","vbtop","0|10|0.01|0"); zdialog_add_widget(zd,"zspin","mtopin","vbtop","0|4|0.01|0"); zdialog_add_widget(zd,"label","labbot","vbbottom",TX("Bottom")); zdialog_add_widget(zd,"zspin","mbottcm","vbbottom","0|10|0.01|0"); zdialog_add_widget(zd,"zspin","mbottin","vbbottom","0|4|0.01|0"); zdialog_add_widget(zd,"label","lableft","vbleft",TX("Left")); zdialog_add_widget(zd,"zspin","mleftcm","vbleft","0|10|0.01|0"); zdialog_add_widget(zd,"zspin","mleftin","vbleft","0|4|0.01|0"); zdialog_add_widget(zd,"label","labright","vbright",TX("Right")); zdialog_add_widget(zd,"zspin","mrightcm","vbright","0|10|0.01|0"); zdialog_add_widget(zd,"zspin","mrightin","vbright","0|4|0.01|0"); zdialog_add_widget(zd,"hbox","hbscale","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labscale","hbscale",TX("image scale"),"space=5"); zdialog_add_widget(zd,"zspin","scale","hbscale","5|100|1|100"); zdialog_add_widget(zd,"label","labpct","hbscale",TX("percent"),"space=5"); zdialog_add_widget(zd,"hbox","hbsize","dialog",0,"space=3"); zdialog_add_widget(zd,"vbox","vbunit","hbsize",0,"space=5"); zdialog_add_widget(zd,"vbox","vbwidth","hbsize",0,"space=5"); zdialog_add_widget(zd,"vbox","vbheight","hbsize",0,"space=5"); zdialog_add_widget(zd,"label","space","vbunit",TX("Image")); zdialog_add_widget(zd,"label","labcm","vbunit","CM"); zdialog_add_widget(zd,"label","labinch","vbunit","Inch"); zdialog_add_widget(zd,"label","labwidth","vbwidth",TX("Width")); zdialog_add_widget(zd,"label","labwcm","vbwidth","xx.x"); zdialog_add_widget(zd,"label","labwin","vbwidth","xx.x"); zdialog_add_widget(zd,"label","labheight","vbheight",TX("Height")); zdialog_add_widget(zd,"label","labhcm","vbheight","xx.x"); zdialog_add_widget(zd,"label","labhin","vbheight","xx.x"); zdialog_load_inputs(zd); // recall prior settings zdialog_fetch(zd,"mtopcm",margins[0]); zdialog_fetch(zd,"mbottcm",margins[1]); zdialog_fetch(zd,"mleftcm",margins[2]); zdialog_fetch(zd,"mrightcm",margins[3]); zdialog_fetch(zd,"scale",imagescale); get_printed_image_size(); zdialog_stuff(zd,"labwcm",pwidth,"%.2f"); // update image size in dialog zdialog_stuff(zd,"labhcm",pheight,"%.2f"); zdialog_stuff(zd,"labwin",pwidth/2.54,"%.2f"); zdialog_stuff(zd,"labhin",pheight/2.54,"%.2f"); gtk_page_setup_set_top_margin(pagesetup,10*margins[0],MM); // set page margins gtk_page_setup_set_bottom_margin(pagesetup,10*margins[1],MM); // (cm to mm units) gtk_page_setup_set_left_margin(pagesetup,10*margins[2],MM); gtk_page_setup_set_right_margin(pagesetup,10*margins[3],MM); gtk_print_settings_set_scale(printsettings,imagescale); // set image print scale % zdialog_run(zd,margins_dialog_event,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for completion zdialog_free(zd); // kill dialog if (zstat == 1) return 0; return 1; } // dialog event function // save user margin and scale changes // recompute print image size int print_image::margins_dialog_event(zdialog *zd, ch *event) { using namespace print_image; double temp; if (strmatch(event,"escape")) zd->zstat = -2; // escape key if (strmatch(event,"mtopcm")) { // get cm inputs and set inch values zdialog_fetch(zd,"mtopcm",margins[0]); zdialog_stuff(zd,"mtopin",margins[0]/2.54); } if (strmatch(event,"mbottcm")) { zdialog_fetch(zd,"mbottcm",margins[1]); zdialog_stuff(zd,"mbottin",margins[1]/2.54); } if (strmatch(event,"mleftcm")) { zdialog_fetch(zd,"mleftcm",margins[2]); zdialog_stuff(zd,"mleftin",margins[2]/2.54); } if (strmatch(event,"mrightcm")) { zdialog_fetch(zd,"mrightcm",margins[3]); zdialog_stuff(zd,"mrightin",margins[3]/2.54); } if (strmatch(event,"mtopin")) { // get inch inputs and set cm values zdialog_fetch(zd,"mtopin",temp); margins[0] = temp * 2.54; zdialog_stuff(zd,"mtopcm",margins[0]); } if (strmatch(event,"mbottin")) { zdialog_fetch(zd,"mbottin",temp); margins[1] = temp * 2.54; zdialog_stuff(zd,"mbottcm",margins[1]); } if (strmatch(event,"mleftin")) { zdialog_fetch(zd,"mleftin",temp); margins[2] = temp * 2.54; zdialog_stuff(zd,"mleftcm",margins[2]); } if (strmatch(event,"mrightin")) { zdialog_fetch(zd,"mrightin",temp); margins[3] = temp * 2.54; zdialog_stuff(zd,"mrightcm",margins[3]); } zdialog_fetch(zd,"scale",imagescale); // get image scale get_printed_image_size(); zdialog_stuff(zd,"labwcm",pwidth,"%.2f"); // update image size in dialog zdialog_stuff(zd,"labhcm",pheight,"%.2f"); zdialog_stuff(zd,"labwin",pwidth/2.54,"%.2f"); zdialog_stuff(zd,"labhin",pheight/2.54,"%.2f"); gtk_page_setup_set_top_margin(pagesetup,10*margins[0],MM); // set page margins gtk_page_setup_set_bottom_margin(pagesetup,10*margins[1],MM); // (cm to mm units) gtk_page_setup_set_left_margin(pagesetup,10*margins[2],MM); gtk_page_setup_set_right_margin(pagesetup,10*margins[3],MM); gtk_print_settings_set_scale(printsettings,imagescale); // set image print scale % return 1; } // compute printed image size based on paper size, // orientation, margins, and scale (percent) void print_image::get_printed_image_size() { using namespace print_image; double iww, ihh, pww, phh, scale; pww = 0.1 * gtk_page_setup_get_paper_width(pagesetup,MM); // get paper size phh = 0.1 * gtk_page_setup_get_paper_height(pagesetup,MM); // (mm to cm units) pww = pww - margins[2] - margins[3]; // reduce for margins phh = phh - margins[0] - margins[1]; pww = pww / 2.54 * 300; // convert to dots @ 300 dpi phh = phh / 2.54 * 300; iww = gdk_pixbuf_get_width(pixbuf); // original image size, pixels ihh = gdk_pixbuf_get_height(pixbuf); scale = pww / iww; // rescale image to fit page if (phh / ihh < scale) scale = phh / ihh; scale = scale * 0.01 * imagescale; // adjust for user scale setting pwidth = iww * scale / 300 * 2.54; // dots to cm pheight = ihh * scale / 300 * 2.54; return; } /**************************************************************************************/ // connect a user callback function to a drag-drop source widget void drag_drop_source(GtkWidget *widget, drag_drop_source_func ufunc) { void drag_drop_source2(GtkWidget *, GdkDragContext *, void *ufunc); void drag_drop_source3(GtkWidget *, GdkDragContext *, GtkSelectionData *, int, int, void *ufunc); if (! main_thread()) zappcrash("illegal call from thread"); gtk_drag_source_set(widget,GDK_BUTTON1_MASK,null,0,GDK_ACTION_COPY); gtk_drag_source_add_text_targets(widget); gtk_drag_source_add_image_targets(widget); G_SIGNAL(widget, "drag-begin", drag_drop_source2, ufunc); G_SIGNAL(widget, "drag-data-get", drag_drop_source3, ufunc); return; } // private function for "drag-begin" signal void drag_drop_source2(GtkWidget *widget, GdkDragContext *context, void *ufunc) { drag_drop_source_func *ufunc2; GdkPixbuf *pixbuf; GError *gerror = 0; ch *file = 0; if (! main_thread()) zappcrash("illegal call from thread"); ufunc2 = (drag_drop_source_func *) ufunc; file = ufunc2(); if (! file) goto cancel; pixbuf = gdk_pixbuf_new_from_file_at_size(file,128,128,&gerror); if (! pixbuf) { if (gerror) printf("*** %s \n",gerror->message); return; } gtk_drag_set_icon_pixbuf(context,pixbuf,64,64); // hot spot is middle of image return; cancel: printf("drag canceled \n"); return; } // private function for "drag-data-get" signal void drag_drop_source3(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *data, int, int, void *ufunc) { drag_drop_source_func *ufunc2; ch *file = 0; if (! main_thread()) zappcrash("illegal call from thread"); ufunc2 = (drag_drop_source_func *) ufunc; file = ufunc2(); if (! file) goto cancel; gtk_selection_data_set_text(data,file,-1); // drops text return; cancel: printf("drag canceled \n"); return; } // connect a user callback function to a drag-drop destination widget void drag_drop_dest(GtkWidget *widget, drag_drop_dest_func *ufunc) { int drag_drop_dest2(GtkWidget *, GdkDragContext *, int, int, void *, int, int time, void *); int drag_drop_dest3(GtkWidget *, void *, int, int, int, void *); int drag_drop_dest4(GtkWidget *, void *, int, void *); if (! main_thread()) zappcrash("illegal call from thread"); gtk_drag_dest_set(widget,GTK_DEST_DEFAULT_ALL,null,0,GDK_ACTION_COPY); gtk_drag_dest_add_text_targets(widget); G_SIGNAL(widget, "drag-data-received", drag_drop_dest2, ufunc); G_SIGNAL(widget, "drag-motion", drag_drop_dest3, ufunc); G_SIGNAL(widget, "drag-leave", drag_drop_dest4, ufunc); return; } // private function for "drag-data-received" signal // get dropped file, clean escapes, pass to user function // passed filespec is subject for zfree() int drag_drop_dest2(GtkWidget *, GdkDragContext *context, int mpx, int mpy, void *sdata, int, int time, void *ufunc) { ch * drag_drop_unescape(ch *escaped_string); drag_drop_dest_func *ufunc2; ch *text, *text2, *file, *file2; int cc; if (! main_thread()) zappcrash("illegal call from thread"); text = (ch *) gtk_selection_data_get_data((GtkSelectionData *) sdata); ufunc2 = (drag_drop_dest_func *) ufunc; if (strstr(text,"file://")) // text is a filespec { file = zstrdup(text+7,"drag_drop"); // get rid of junk added by GTK cc = strlen(file); while (file[cc-1] < ' ') cc--; file[cc] = 0; file2 = drag_drop_unescape(file); // clean %xx escapes from Nautilus zfree(file); ufunc2(mpx,mpy,file2); // pass file to user function } else // text is text { text2 = zstrdup(text,"drag_drop"); ufunc2(mpx,mpy,text2); } gtk_drag_finish(context,1,0,time); return 1; } // private function for "drag-motion" signal // pass mouse position to user function during drag int drag_drop_dest3(GtkWidget *, void *, int mpx, int mpy, int, void *ufunc) { drag_drop_dest_func *ufunc2; ufunc2 = (drag_drop_dest_func *) ufunc; if (! ufunc2) return 0; ufunc2(mpx,mpy,null); return 0; } // private function for "drag-leave" signal // pass mouse position (0,0) to user function int drag_drop_dest4(GtkWidget *, void *, int, void *ufunc) { drag_drop_dest_func *ufunc2; ufunc2 = (drag_drop_dest_func *) ufunc; if (! ufunc2) return 0; ufunc2(0,0,null); return 0; } // private function // Clean %xx escapes from strange Nautilus drag-drop file names ch * drag_drop_unescape(ch *inp) { int drag_drop_convhex(ch ch1); ch inch, *out, *outp; int nib1, nib2; out = (ch *) zmalloc(strlen(inp)+1,"drag_drop"); outp = out; while ((inch = *inp++)) { if (inch == '%') { nib1 = drag_drop_convhex(*inp++); nib2 = drag_drop_convhex(*inp++); *outp++ = nib1 << 4 | nib2; } else *outp++ = inch; } *outp = 0; return out; } // private function - convert character 0-F to number 0-15 int drag_drop_convhex(ch ch1) { if (ch1 >= '0' && ch1 <= '9') return ch1 - '0'; if (ch1 >= 'A' && ch1 <= 'F') return ch1 - 'A' + 10; if (ch1 >= 'a' && ch1 <= 'f') return ch1 - 'a' + 10; return ch1; } /************************************************************************************** Miscellaneous GDK/GTK functions *********************************************************************************/ // Get thumbnail image for given image file. // Returned thumbnail belongs to caller: g_object_unref() is necessary. PIXBUF * get_thumbnail(ch *fpath, int size) { PIXBUF *thumbpxb; GError *gerror = 0; int err; ch *bpath; STATB statB; if (! main_thread()) zappcrash("illegal call from thread"); err = stat(fpath,&statB); // fpath status info if (err) return 0; if (S_ISDIR(statB.st_mode)) { // if folder, return folder image bpath = (ch *) zmalloc(500,"get_thumbnail"); *bpath = 0; strncatv(bpath,499,zimagedir,"/folder.png",null); thumbpxb = gdk_pixbuf_new_from_file_at_size(bpath,size,size,&gerror); zfree(bpath); return thumbpxb; } thumbpxb = gdk_pixbuf_new_from_file_at_size(fpath,size,size,&gerror); return thumbpxb; // return pixbuf to caller } // make a cursor from a graphic file in application folder // (see initz_appfiles()). GdkCursor * zmakecursor(ch *imagefile) { GError *gerror = 0; PIXBUF *pixbuf; GdkDisplay *display; GdkCursor *cursor = 0; ch imagepath[200]; if (! main_thread()) zappcrash("illegal call from thread"); display = gdk_display_get_default(); *imagepath = 0; strncatv(imagepath,199,zimagedir,"/",imagefile,null); pixbuf = gdk_pixbuf_new_from_file(imagepath,&gerror); if (pixbuf && display) cursor = gdk_cursor_new_from_pixbuf(display,pixbuf,0,0); else printf("*** %s \n",gerror->message); return cursor; } /**************************************************************************************/ // strip the alpha channel from a pixbuf // returns 0 if no alpha channel or fatal error PIXBUF * gdk_pixbuf_stripalpha(PIXBUF *pixbuf1) { PIXBUF *pixbuf2; GDKCOLOR color; int ww, hh, rs1, rs2; uint8 *ppix1, *ppix2, *pix1, *pix2; int nch, ac; int px, py; if (! main_thread()) zappcrash("illegal call from thread"); ac = gdk_pixbuf_get_has_alpha(pixbuf1); if (! ac) return 0; nch = gdk_pixbuf_get_n_channels(pixbuf1); color = gdk_pixbuf_get_colorspace(pixbuf1); ww = gdk_pixbuf_get_width(pixbuf1); hh = gdk_pixbuf_get_height(pixbuf1); pixbuf2 = gdk_pixbuf_new(color,0,8,ww,hh); // create output pixbuf2 if (! pixbuf2) return 0; ppix1 = gdk_pixbuf_get_pixels(pixbuf1); // input pixel array ppix2 = gdk_pixbuf_get_pixels(pixbuf2); // output pixel array rs1 = gdk_pixbuf_get_rowstride(pixbuf1); rs2 = gdk_pixbuf_get_rowstride(pixbuf2); for (py = 0; py < hh; py++) { pix1 = ppix1 + py * rs1; pix2 = ppix2 + py * rs2; for (px = 0; px < ww; px++) { memcpy(pix2,pix1,nch-1); pix1 += nch; pix2 += nch-1; } } return pixbuf2; } /**************************************************************************************/ // Create a pixbuf containing text with designated font and attributes. // Text is white on black. Widget is ultimate display destination. PIXBUF * text_pixbuf(ch *text, ch *font, int fontsize, GtkWidget *widget) { ch font2[60]; PangoFontDescription *pfont; PangoLayout *playout; cairo_surface_t *surface; cairo_t *cr; PIXBUF *pixbuf; uint8 *pixels, *cairo_data, *cpix, *pix2; int ww, hh, rs, px, py; if (! main_thread()) zappcrash("illegal call from thread"); if (! font) font = zfuncs::appfont; // default font snprintf(font2,60,"%s %d",font,fontsize); // combine font and size pfont = pango_font_description_from_string(font2); // make layout with text playout = gtk_widget_create_pango_layout(widget,text); pango_layout_set_font_description(playout,pfont); pango_layout_get_pixel_size(playout,&ww,&hh); ww += 2 + 0.2 * fontsize; // compensate bad font metrics hh += 2 + 0.1 * fontsize; surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24,ww,hh); // cairo output image cr = cairo_create(surface); pango_cairo_show_layout(cr,playout); // write text layout to image cairo_data = cairo_image_surface_get_data(surface); // get text image pixels pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB,0,8,ww,hh); rs = gdk_pixbuf_get_rowstride(pixbuf); pixels = gdk_pixbuf_get_pixels(pixbuf); for (py = 0; py < hh; py++) // copy text image to PXB for (px = 0; px < ww; px++) { cpix = cairo_data + 4 * (ww * py + px); pix2 = pixels + py * rs + px * 3; pix2[0] = pix2[1] = pix2[2] = cpix[3]; } pango_font_description_free(pfont); // free resources g_object_unref(playout); cairo_destroy(cr); cairo_surface_destroy(surface); return pixbuf; } /**************************************************************************************/ // move the mouse pointer to given position in given window // widget must be realized int move_pointer(GtkWidget *widget, int px, int py) { int rpx, rpy; GdkWindow *window; if (! main_thread()) zappcrash("illegal call from thread"); window = gtk_widget_get_window(widget); gdk_window_get_root_coords(window,px,py,&rpx,&rpy); gdk_device_warp(mouse,screen,rpx,rpy); return 1; } /**************************************************************************************/ // move a window to the mouse position // widget is a GtkWindow, which may or may not be realized void window_to_mouse(GtkWidget *window) { using namespace zfuncs; int px, py; if (! main_thread()) zappcrash("illegal call from thread"); gdk_device_get_position(mouse,&screen,&px,&py); // get mouse position gtk_window_move(GTK_WINDOW(window),px,py); return; } fotocx/debian-control0000664000175000017500000000314715247006660013660 0ustar micomicoPackage: fotocx Version: 26.8 Architecture: amd64 Section: graphics Installed-Size: 24452 Keywords: image, photo, edit, retouch Maintainer: Mike Cornelison Priority: extra Homepage: https://kornelix.net Depends: libc6, binutils, dcraw, libimage-exiftool-perl, libjpeg-turbo8, libpng16-16, libtiff6, libjxl0.11, libwebkit2gtk-4.1-0 Suggests: ffmpeg, vlc, heif-examples, libopenjp2-tools, webp Description: Edit photos and manage a large collection. Navigate a large image collection with a thumbnail browser. View and edit image files (RAW, jpg, png, jxl, tif). Deep color is preserved in edit functions and output files. Fotocx has extensive tools for edit, repair, and special effects. View image changes as edit tools are applied interactively. Undo and redo within and across edit functions. File versioning: save and recall multiple edit stages. Select image features or areas to edit separately from background. Copy and paste area selections within and across images. Paint most edit functions locally and gradually using the mouse. Combine images: HDR, HDF, panorama, stack, mashup images + text. Metadata edit and report: tags, captions, dates, locations ... Search images using any metadata plus folder and file names Search includes wildcard matching and substring selection. Albums: select images and arrange order with drag and drop. Slide Show with many animated transitions and pan/zoom effects. Scalable world map with markers - click for image gallery. Batch functions: convert, resize, upright, move, revise metatata. User interface and user guide available in 15 languages. fotocx/f.tools.cc0000664000175000017500000060277715247006660012746 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit - Tools menu functions m_index dialog to create/update image index file index_rebuild update image index file with updates search index_rebuild_old use old image index file without updates search m_settings user preferences and settings dialog m_KB_shortcuts edit keyboard shortcuts KB_shortcuts_load load KB shortcuts file into memory m_RGB_hist show RGB brightness histogram graph m_magnify magnify the image within a radius of the mouse m_measure_image measure distances within an image m_show_RGB show RGB values for clicked image positions m_grid_settings configure grid lines m_toggle_grid toggle grid lines on/off m_line_color choose color for foreground lines m_darkbrite highlight darkest and brightest pixels m_monitor_color monitor color and contrast check m_duplicates find all duplicated images m_find_bad_files find all unreadable image files m_move_fotocx_home move home folder from $HOME/.fotocx to chosen folder m_resources memory allocated, CPU time, map cache ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" using namespace zfuncs; /**************************************************************************************/ // Index Image Files menu function // Dialog to get top image folders, thumbnails folder, indexed metadata tags. // Update the index config file and generate new image index. namespace index_names { zdialog *zd_indexlog = 0; // log report window GtkWidget *wlog = 0; // log report text widget int8 *Xstatus = 0, *Tstatus = 0; int index_thread_busy, thumb_thread_busy; int FfullindexReq = 0; // force full re-index int index_updates; // file indexing progress counters int final_index_updates; int atd_updates; int thumb_updates; int thumb_deletes; } // index menu function void m_index(GtkWidget *, ch *) { using namespace index_names; int index_CBfunc(GtkWidget *widget, int line, int pos, ch *input); int index_dialog_event(zdialog *zd, ch *event); zdialog *zd; FILE *fid; ch buff[200], sthumbfolder[200]; ch *pp; GtkWidget *widget; int line, cc, zstat; ch *greet1 = TX("Folders for image files " "(subfolders included automatically)"); ch *greet2 = TX("Select to add, click on X to delete."); ch *greet3 = TX("Thumbnails folder"); ch *greet4 = TX("extra metadata tags to include in index"); ch *greet5 = TX("force a full re-index of all image files"); ch *termmess = TX("Index function terminated. \n" "Indexing is required for search and map functions \n" "and to make thumbnail gallery pages display fast."); F1_help_topic = TX("INDEX FILES"); printf("m_index \n"); FfullindexReq = 0; if (Fblock("index files")) return; /*** ______________________________________________________________ | Index Image Files | | | | Folders for image files (subfolders included automatically). | | [Select] Select to add, click on X to delete. | | __________________________________________________________ | | | X /home//Pictures | | | | X /home//... | | | | | | | | | | | |__________________________________________________________| | | | | [Select] Thumbnails folder | | __________________________________________________________ | | |__________________________________________________________| | | | | [Select] extra metadata tags to include in index | | | | [x] force a full re-index of all image files | | | | [Help] [Proceed] [X] | |______________________________________________________________| ***/ zd = zdialog_new("Index Image Files",Mwin,"Help",TX("Proceed"),"X",null); zdialog_add_widget(zd,"hsep","space","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbgreet1","dialog"); zdialog_add_widget(zd,"label","labgreet1","hbgreet1",greet1,"space=3"); zdialog_add_widget(zd,"hbox","hbtop","dialog"); zdialog_add_widget(zd,"button","browsetop","hbtop",TX("Select"),"space=3"); // browse top button zdialog_add_widget(zd,"label","labgreet2","hbtop",greet2,"space=5"); zdialog_add_widget(zd,"hbox","hbtop2","dialog",0,"expand"); zdialog_add_widget(zd,"label","space","hbtop2",0,"space=3"); zdialog_add_widget(zd,"vbox","vbtop2","hbtop2",0,"expand"); zdialog_add_widget(zd,"label","space","hbtop2",0,"space=3"); zdialog_add_widget(zd,"scrwin","scrtop","vbtop2",0,"expand"); zdialog_add_widget(zd,"text","topfolders","scrtop"); // topfolders text zdialog_add_widget(zd,"hsep","space","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbthumb1","dialog"); zdialog_add_widget(zd,"button","browsethumb","hbthumb1",TX("Select"),"space=3"); // browse thumb button zdialog_add_widget(zd,"label","labgreet3","hbthumb1",greet3,"space=3"); zdialog_add_widget(zd,"hbox","hbthumb2","dialog"); zdialog_add_widget(zd,"text","sthumbfolder","hbthumb2",0,"expand"); // thumbnail folder zdialog_add_widget(zd,"hsep","space","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbxmeta","dialog"); zdialog_add_widget(zd,"button","browsxmeta","hbxmeta",TX("Select"),"space=3"); // browse xmeta metadata zdialog_add_widget(zd,"label","labgreet4","hbxmeta",greet4,"space=5"); zdialog_add_widget(zd,"hsep","space","dialog",0,"space=5"); // force full re-index zdialog_add_widget(zd,"hbox","hbforce","dialog"); zdialog_add_widget(zd,"check","forcex","hbforce",greet5,"space=3"); widget = zdialog_gtkwidget(zd,"topfolders"); // set mouse/KB event function txwidget_set_eventfunc(widget,index_CBfunc); // for top folders text window txwidget_clear(widget); // default top folder txwidget_append(widget,0," X %s/Pictures\n",getenv("HOME")); // /home//Pictures snprintf(sthumbfolder,200,"%s/thumbnails",get_zhomedir()); // default thumbnails folder zdialog_stuff(zd,"sthumbfolder",sthumbfolder); // /home//.fotocx/thumbnails xmetaNtags = 0; // default no extra indexed metadata fid = fopen(image_folders_file,"r"); // read image folders file if (fid) { // stuff data into dialog widgets txwidget_clear(widget); while (true) { pp = fgets_trim(buff,200,fid,1); if (! pp) break; if (strmatchN(buff,"thumbnails:",11)) { // if "thumbnails: /..." if (buff[12] == '/') // stuff thumbnails folder zdialog_stuff(zd,"sthumbfolder",buff+12); } else txwidget_append(widget,0," X %s\n",buff); // stuff " X /dir1/dir2..." } fclose(fid); } zdialog_resize(zd,400,400); // run dialog zdialog_run(zd,index_dialog_event,"parent"); zstat = zdialog_wait(zd); // wait for completion while (zstat == 1) { // [help] zd->zstat = 0; // keep dialog active m_help(0,"Help"); zstat = zdialog_wait(zd); } if (zstat != 2) // canceled { zdialog_free(zd); zmessageACK(Mwin,termmess); // warn: index not finished Xindexlev = 0; Fblock(0); return; } fid = fopen(image_folders_file,"w"); // open/write image folders file if (! fid) { // fatal error zmessageACK(Mwin,TX("cannot write image folders file: %s"),strerror(errno)); Xindexlev = 0; // 26.0 Fblock(0); return; } widget = zdialog_gtkwidget(zd,"topfolders"); // get top folders from dialog widget for (line = 0; ; line++) { pp = txwidget_line(widget,line,1); // loop widget text lines if (! pp || ! *pp) break; pp += 4; // skip " X " if (*pp != '/') continue; strncpy0(buff,pp,200); // /dir1/dir2/... cc = strlen(buff); if (cc < 5) continue; // ignore blanks or rubbish if (buff[cc-1] == '/') buff[cc-1] = 0; // remove trailing '/' fprintf(fid,"%s\n",buff); // write top folder to file } zdialog_fetch(zd,"sthumbfolder",buff,200); // get thumbnails folder from dialog strTrim2(buff); // remove surrounding blanks cc = strlen(buff); if (cc && buff[cc-1] == '/') buff[cc-1] = 0; // remove trailing '/' fprintf(fid,"thumbnails: %s\n",buff); // write thumbnails folder to file fclose(fid); zdialog_free(zd); // close dialog index_rebuild(2,1); // build image index and thumbnails 25.1 Fblock(0); return; } // mouse click function for top folders text window // remove folder from list where "X" is clicked int index_CBfunc(GtkWidget *widget, int line, int pos, ch *input) { GdkWindow *Xgdkwin; ch *pp; ch *dirlist[maxtopfolders]; int ii, jj; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } Xgdkwin = gtk_widget_get_window(widget); // stop updates between clear and refresh gdk_window_freeze_updates(Xgdkwin); for (ii = jj = 0; ii < maxtopfolders; ii++) // loop text lines in widget { // " X /dir1/dir2/... " pp = txwidget_line(widget,ii,1); if (! pp || strlen(pp) < 4) break; if (ii == line && pos < 3) continue; // if "X" clicked, skip deleted line dirlist[jj] = zstrdup(pp,"index-dialog"); jj++; } txwidget_clear(widget); for (ii = 0; ii < jj; ii++) // stuff remaining lines back into widget { txwidget_append(widget,0,"%s\n",dirlist[ii]); zfree(dirlist[ii]); } gdk_window_thaw_updates(Xgdkwin); return 1; } // index dialog event and completion function int index_dialog_event(zdialog *zd, ch *event) { using namespace index_names; int ii, nn, yn; GtkWidget *widget; ch **flist, *pp, *sthumbfolder; zlist_t *mlist; ch *topmess = TX("Choose top image folders"); ch *thumbmess = TX("Choose thumbnail folder"); ch *xmetamess = TX("All image files will be re-indexed. \n" "Continue?"); if (strmatch(event,"browsetop")) { // [browse] top folders flist = zgetfiles(topmess,MWIN,"folders",getenv("HOME")); // get top folders from user if (! flist) return 1; widget = zdialog_gtkwidget(zd,"topfolders"); // add to dialog list for (ii = 0; flist[ii]; ii++) { txwidget_append2(widget,0," X %s\n",flist[ii]); // " X /dir1/dir2/..." zfree(flist[ii]); } zfree(flist); } if (strmatch(event,"browsethumb")) { // [browse] thumbnail folder pp = zgetfile(thumbmess,MWIN,"folder",getenv("HOME")); if (! pp) return 1; sthumbfolder = zstrdup(pp,"index-dialog",12); if (! strstr(sthumbfolder,"thumbnails")) // if not containing "thumbnails" strcat(sthumbfolder,"/thumbnails"); // append /thumbnails zdialog_stuff(zd,"sthumbfolder",sthumbfolder); zfree(sthumbfolder); zfree(pp); } if (strmatch(event,"browsxmeta")) { // [select] yn = zmessageYN(Mwin,xmetamess); // add optional indexed metadata if (! yn) return 1; mlist = zlist_from_file(meta_index_file); // index extra metadata tags if (! mlist) mlist = zlist_new(0); nn = select_meta_tags(mlist,xmetaXtags,1); // user edit if (nn) { zlist_to_file(mlist,meta_index_file); // changes made, replace file FfullindexReq = 1; // full index required } zlist_free(mlist); } if (strmatch(event,"forcex")) { // force full re-index zdialog_fetch(zd,"forcex",ii); if (ii) FfullindexReq = 1; } if (! zd->zstat) return 1; // wait for completion if (zd->zstat == 1) { // [help] zd->zstat = 0; show_help("INDEX FILES"); return 1; } return 1; // proceed or cancel status } /**************************************************************************************/ // Rebuild the image index from the index config data. // index level = 0/1/2 = no index / old files only / old + search new files // Called from main() when Fotocx is started (index level from user setting) // Called from menu function m_index() (index level = 2, keepopen = 1) void index_rebuild(int indexlev, int keepopen) { using namespace index_names; int indexlog_dialog_event(zdialog *zd, ch *event); void indexlog(int bold, ch *format, ...); int index_compare(ch *rec1, ch *rec2); void * thumb_thread(void *); void * index_thread(void *); xxrec_t *xxrec = 0, **xxrec_old = 0, **xxrec_new = 0; FILE *fid; zlist_t *mlist; ch **topfol2, **misstop2; int *topcc2, *misscc2; int ii, jj, nn; int Ntop, Nthumb; int ftf, NF, orec, orec2, nrec, xrec, comp; int cc, cc1, cc2, err; int Nnew, Nold; ch *pp, *pp1, *pp2; ch buff[XFCC+500]; ch **flist, *file, *thumbfile; ch *xtagname; STATB statB; double startime; int Nraw, Nimage, Nvideo; double rawgb, imagegb, videogb; ch *indexmess = TX("No image file index was found.\n" "An image file index will be created.\n" "Your image files will not be changed.\n" "This may need considerable time if you \n" "have many thousands of image files."); ch *indexerr2 = TX("Thumbnails folder: %s \n" "Please remove."); ch *thumberr = TX("Thumbnails folder: \n %s \n" "must be named .../thumbnails"); ch *duperr = TX("Duplicate or nested folders: \n %s \n %s \n" "Please remove."); startime = get_seconds(); // index function start time xxrec_old = xxrec_new = 0; // initz. Xstatus = Tstatus = 0; Xindexlev = 0; // create log window for reporting status and statistics if (zd_indexlog) zdialog_free(zd_indexlog); // 25.1 zd_indexlog = 0; wlog = 0; if (indexlev > 1) { // popup window log report 25.1 zd_indexlog = zdialog_new("build index",Mwin,"X",null); zdialog_add_widget(zd_indexlog,"scrwin","scrwin","dialog",0,"expand"); zdialog_add_widget(zd_indexlog,"text","text","scrwin"); wlog = zdialog_gtkwidget(zd_indexlog,"text"); zdialog_resize(zd_indexlog,700,500); zdialog_run(zd_indexlog,indexlog_dialog_event,"parent"); } // get current top image folders and thumbnails folder for (ii = 0; ii < Ntopfolders; ii++) // free prior zfree(topfolders[ii]); Ntop = Nthumb = 0; thumbfolder = 0; // 25.1 fid = fopen(image_folders_file,"r"); // read index config file if (fid) { while (true) { // get top image folders pp = fgets_trim(buff,200,fid,1); if (! pp) break; if (strmatchN(buff,"thumbnails: /",13)) { // get thumbnails folder zstrcopy(thumbfolder,buff+12,"thumb-folder"); Nthumb++; } else { topfolders[Ntop] = zstrdup(buff,"top-folders"); if (++Ntop == maxtopfolders) break; } } fclose(fid); } Ntopfolders = Ntop; if (indexlev == 0) // indexing is disabled { if (Nthumb != 1) // no index config file, or invalid { thumbfolder = zstrdup("","thumb-folder",200); // set default thumbnails folder snprintf(thumbfolder,200,"%s/thumbnails",get_zhomedir()); fid = fopen(image_folders_file,"w"); // create stump index config file if (! fid) { // (thumbnails folder only) zmessageACK(Mwin,TX("index config file error: %s"),strerror(errno)); Xindexlev = 0; // 26.0 return; } fprintf(fid,"thumbnails: %s\n",thumbfolder); fclose(fid); } if (! dirfile(thumbfolder)) { // create thumbnails folder if needed pp = zescape_quotes(thumbfolder); err = zshell("log ack","mkdir -p -m 0750 \"%s\" ",pp); if (err) { Xindexlev = 0; // 26.0 return; } } Nthumb = 1; indexlog(0,TX("thumbnails folder: %s \n"),thumbfolder); // log thumbnails folder Ntopfolders = 0; // no top image folders indexlog(0,TX("no image index: reports disabled \n")); // no image index Xindexlev = 0; // 25.1 return; } if (! Ntopfolders) { // if nothing found, must ask user zmessageACK(Mwin,TX("specify at least 1 top image folder")); goto cleanup; } if (Nthumb != 1) { // 0 or >1 thumbnail folders zmessageACK(Mwin,TX("specify a thumbnail folder")); goto cleanup; } cc = strlen(thumbfolder) - 11 ; // check /thumbnails name if (! strmatch(thumbfolder+cc,"/thumbnails")) { zmessageACK(Mwin,thumberr,thumbfolder); goto cleanup; } if (! dirfile(thumbfolder)) { // create thumbnails folder if needed pp = zescape_quotes(thumbfolder); err = zshell("log ack","mkdir -p -m 0750 \"%s\" ",pp); if (err) { Xindexlev = 0; // 26.0 return; } } for (ii = 0; ii < Ntopfolders; ii++) { // disallow top dir = thumbnail dir if (strmatch(topfolders[ii],thumbfolder)) { zmessageACK(Mwin,indexerr2,topfolders[ii]); goto cleanup; } } image_file_type_init(); // initz. to detect thumbnail files 25.1 for (ii = 0; ii < Ntopfolders; ii++) // check for duplicate folders for (jj = ii+1; jj < Ntopfolders; jj++) // or nested folders { cc1 = strlen(topfolders[ii]); cc2 = strlen(topfolders[jj]); if (cc1 <= cc2) { pp1 = zstrdup(topfolders[ii],"top-folders",2); pp2 = zstrdup(topfolders[jj],"top-folders",2); } else { pp1 = zstrdup(topfolders[jj],"top-folders",2); pp2 = zstrdup(topfolders[ii],"top-folders",2); cc = cc1; cc1 = cc2; cc2 = cc; } strcpy(pp1+cc1,"/"); strcpy(pp2+cc2,"/"); nn = strmatchN(pp1,pp2,cc1+1); zfree(pp1); zfree(pp2); if (nn) { zmessageACK(Mwin,duperr,topfolders[ii],topfolders[jj]); // user must fix goto cleanup; } } for (ii = jj = Nmisstops = 0; ii < Ntopfolders; ii++) // check top image folders { if (! dirfile(topfolders[ii])) // move missing top image folders misstops[Nmisstops++] = topfolders[ii]; // into a separate list else topfolders[jj++] = topfolders[ii]; // (poss. not mounted) } Ntopfolders = jj; // valid top image folders if (! Ntopfolders) { // none, must ask user zmessageACK(Mwin,indexmess); goto cleanup; } topfol2 = (ch **) zmalloc(Ntopfolders * sizeof(ch *),"top-folders"); // top folders with '/' appended topcc2 = (int *) zmalloc(Ntopfolders * sizeof(int),"top-folders"); // cc of same misstop2 = 0; misscc2 = 0; if (Nmisstops) { misstop2 = (ch **) zmalloc(Nmisstops * sizeof(ch *),"top-folders"); // missing top folders with '/' misscc2 = (int *) zmalloc(Nmisstops * sizeof(int),"top-folders"); // cc of same } for (ii = 0; ii < Ntopfolders; ii++) { // save top folders with appended '/' topfol2[ii] = zstrdup(topfolders[ii],"top-folders",2); // for use with later comparisons strcat(topfol2[ii],"/"); topcc2[ii] = strlen(topfol2[ii]); } for (ii = 0; ii < Nmisstops; ii++) { misstop2[ii] = zstrdup(misstops[ii],"top-folders",2); strcat(misstop2[ii],"/"); misscc2[ii] = strlen(misstop2[ii]); } indexlog(0,TX("top image folders: \n")); for (ii = 0; ii < Ntopfolders; ii++) // log top folders indexlog(0," %s\n",topfolders[ii]); nn = 0.001 * diskspace(topfolders[0]); // log free disk space in GB indexlog(0,TX("free disk space: %d GB \n"),nn); if (Nmisstops) for (ii = 0; ii < Nmisstops; ii++) // log missing top folders indexlog(0," %s *** not mounted *** \n",misstops[ii]); indexlog(0,TX("thumbnails folder: %s \n"),thumbfolder); // log thumbnails folder mlist = zlist_from_file(meta_index_file); // get extra indexed metadata tags xmetaNtags = 0; if (mlist) { indexlog(0,TX("extra metadata tags: \n")); xmetaNtags = zlist_count(mlist); if (xmetaNtags > xmetaXtags) { zmessageACK(Mwin,TX("extra indexed metadata tags > %d"),xmetaXtags); goto cleanup; } for (ii = 0; ii < xmetaNtags; ii++) { // log extra metadata tags xtagname = zlist_get(mlist,ii); xmeta_tags[ii] = xtagname; indexlog(0,"%s, ",xtagname); } indexlog(0,"\n"); } if (indexlev == 0) { indexlog(0,TX("no image index: reports disabled \n")); // no image index, reports disabled Xindexlev = 0; goto cleanup; } if (indexlev == 1) { indexlog(0,TX("old image index: reports will omit new files \n")); // image index has old files only index_rebuild_old(); indexlog(0,TX("image index records found: %d \n"),Nxxrec); // note: superfluous - see above Xindexlev = 1; goto cleanup; } if (indexlev == 2) { // update image index for all image files indexlog(0,TX("full image index: reports will be complete \n")); Xindexlev = 2; } if (FfullindexReq) { // user: force full re-index Nold = 0; Xindexlev = 2; goto get_new_files; // skip old index processing } // read old image index file and build "old list" of xxrec_tab[] records indexlog(0,TX("reading image index file ...\n")); cc = maximages * sizeof(xxrec_t *); xxrec_old = (xxrec_t **) zmalloc(cc,"xxrec-old"); // "old" image xxrec_tab[] recs Nold = 0; ftf = 1; while (true) { xxrec = read_xxrec_seq(ftf); // read curr. xxrec_tab[] recs if (! xxrec) break; err = stat(xxrec->file,&statB); // file status if (err) { // file is missing for (ii = 0; ii < Nmisstops; ii++) if (strmatchN(xxrec->file,misstop2[ii],misscc2[ii])) break; // within missing top folders? if (ii == Nmisstops) continue; // no, exclude file } else { // file is present if (! S_ISREG(statB.st_mode)) continue; // not a regular file, remove for (ii = 0; ii < Ntopfolders; ii++) if (strmatchN(xxrec->file,topfol2[ii],topcc2[ii])) break; // within top folders? if (ii == Ntopfolders) continue; // no, exclude file } xxrec_old[Nold] = xxrec; // file is included if (++Nold == maximages) { zmessageACK(Mwin,TX("exceeded max. images: %d"),maximages); Xindexlev = 0; // 26.0 goto cleanup; } } indexlog(0,"prior image index records found: %d \n",Nold); // sort old xxrec_tab[] recs in order of file name and file mod date if (Nold > 1) HeapSort((ch **) xxrec_old,Nold,index_compare); // smp sort // replace older recs with newer recs that were appended to the file // and are now sorted in file name sequence if (Nold > 1) { for (orec = 0, orec2 = 1; orec2 < Nold; orec2++) { if (strmatch(xxrec_old[orec]->file,xxrec_old[orec2]->file)) // memory for replaced recs is lost xxrec_old[orec] = xxrec_old[orec2]; else { orec++; xxrec_old[orec] = xxrec_old[orec2]; } } Nold = orec + 1; // new count } get_new_files: // find all image files and create "new list" of xxrec_tab[] recs indexlog(0,TX("find all image files ...\n")); cc = maximages * sizeof(xxrec_t *); xxrec_new = (xxrec_t **) zmalloc(cc,"xxrec-new"); // "new" image xxrec_tab[] recs Nnew = 0; Fbusy(+1); for (ii = 0; ii < Ntopfolders; ii++) // loop top folders { err = find_imagefiles(topfolders[ii],1+16+32,flist,NF); // find all image files in top folders if (err) { zmessageACK(Mwin,TX("find_imagefiles() failure \n")); Xindexlev = 0; // 26.0 goto cleanup; } if (Nnew + NF > maximages) { zmessageACK(Mwin,TX("exceeded max. images: %d"),maximages); Xindexlev = 0; // 26.0 goto cleanup; } for (jj = 0; jj < NF; jj++) // loop found image files { file = flist[jj]; nrec = Nnew++; xxrec_new[nrec] = (xxrec_t *) zmalloc(sizeof(xxrec_t),"xxrec-new"); // allocate xxrec xxrec_new[nrec]->file = file; // filespec stat(file,&statB); pretty_datetime(statB.st_mtime,xxrec_new[nrec]->fdate); // file mod date } // remaining data left null if (flist) zfree(flist); } Fbusy(-1); indexlog(0,TX("current image files found: %d \n"),Nnew); // sort new xxrec_tab[] recs in order of file name and file mod date if (Nnew > 1) HeapSort((ch **) xxrec_new,Nnew,index_compare); // smp sort if (xxrec_tab) { for (ii = 0; ii < Nxxrec; ii++) // free memory for old xxrec_tab { zfree(xxrec_tab[ii]->file); if (xxrec_tab[ii]->keywords) zfree(xxrec_tab[ii]->keywords); if (xxrec_tab[ii]->title) zfree(xxrec_tab[ii]->title); if (xxrec_tab[ii]->desc) zfree(xxrec_tab[ii]->desc); if (xxrec_tab[ii]->xmeta) zfree(xxrec_tab[ii]->xmeta); zfree(xxrec_tab[ii]); } zfree(xxrec_tab); } // create image xxrec_tab[] table in memory cc = maximages * sizeof(xxrec_t *); // make new table with max. capacity xxrec_tab = (xxrec_t **) zmalloc(cc,"xxrec-tab"); cc = maximages * sizeof(int); Xstatus = (int8 *) zmalloc(cc,"xxrec-Xstat"); // 1/2/3 = missing/stale/OK Tstatus = (int8 *) zmalloc(cc,"xxrec-Tstat"); // file or thumbnail // merge and compare old and new xxrec_tab[] recs nrec = orec = xrec = 0; while (true) // merge old and new xxrec_tab[] recs { if (nrec == Nnew && orec == Nold) break; // both EOF, done if (nrec < Nnew && orec < Nold) // if neither EOF, compare file names comp = strcmp(xxrec_old[orec]->file, xxrec_new[nrec]->file); else comp = 0; if (nrec == Nnew || comp < 0) { // old xxrec_tab[] rec has no match xxrec_tab[xrec] = xxrec_old[orec]; // copy old xxrec_tab[] rec to output xxrec_old[orec] = 0; Xstatus[xrec] = 1; // mark file as missing orec++; } else if (orec == Nold || comp > 0) { // new xxrec_tab[] rec has no match xxrec_tab[xrec] = xxrec_new[nrec]; // copy new xxrec_tab[] rec to output xxrec_new[nrec] = 0; Xstatus[xrec] = 2; // mark file as needing update nrec++; } else { // old and new xxrec_tab[] recs match xxrec_tab[xrec] = xxrec_old[orec]; if (strmatch(xxrec_old[orec]->fdate, xxrec_new[nrec]->fdate)) { // compare file dates Xstatus[xrec] = 3; // same, mark file as up to date } else { Xstatus[xrec] = 2; // different, mark as needing update strcpy(xxrec_tab[xrec]->fdate, xxrec_new[nrec]->fdate); // use current file date } xxrec_old[orec] = 0; orec++; zfree(xxrec_new[nrec]->file); zfree(xxrec_new[nrec]); xxrec_new[nrec] = 0; nrec++; } Tstatus[xrec] = 3; // thumbnail OK if (Xstatus[xrec] > 1) // if file not missing, test and if (! thumbfile_OK(xxrec_tab[xrec]->file)) // mark thumbnail update needed Tstatus[xrec] = 2; file = xxrec_tab[xrec]->file; // indexed file xrec++; // count output recs if (xrec == maximages) { zmessageACK(Mwin,TX("max. image limit reached: %d"),xrec); goto cleanup; } } Nxxrec = xrec; // final count if (xxrec_new) zfree(xxrec_new); // free memory if (xxrec_old) zfree(xxrec_old); xxrec_new = xxrec_old = 0; for (ii = index_updates = thumb_updates = 0; ii < Nxxrec; ii++) { // count updates required if (Xstatus[ii] == 2) index_updates++; // index rec updates if (Tstatus[ii] == 2) thumb_updates++; // thumbnail file updates } indexlog(1,TX("index updates needed: %d thumbnails: %d \n"), index_updates,thumb_updates); // Process entries needing update in the new xxrec_tab[] table // (new files or files dated later than in old xxrec_tab[] table). // Get updated metadata from image file metadata. // Add missing or update stale thumbnail file. Fbusy(+1); Fescape = 0; index_updates = atd_updates = thumb_updates = 0; txwidget_append2(wlog,0," index title/desc thumbs \n"); txwidget_append2(wlog,0,"---- \n"); // replaced with progress counters 25.1 index_thread_busy = 1; // initially busy start_detached_thread(index_thread,0); // start metadata index thread while (index_thread_busy) // while thread running { if (Fescape) goto bailout; if (wlog) { // update log window progress counters index_updates = progress_getvalue(); // progress from meta_getN() 26.0 txwidget_replace(wlog,0,-1,"%7d %7d %7d \n", index_updates,atd_updates,thumb_updates); // 25.1 } zmainsleep(0.001); } index_updates = final_index_updates; // from index thread 26.0 thumb_thread_busy = 1; // initially busy start_detached_thread(thumb_thread,0); // start thumbnails thread while (thumb_thread_busy) // while thread running { if (Fescape) goto bailout; if (wlog) // update log window progress counters txwidget_replace(wlog,0,-1,"%7d %7d %7d \n", index_updates,atd_updates,thumb_updates); // 25.1 zmainsleep(0.001); } bailout: Fbusy(-1); if (Fescape || Fshutdown) goto cleanup; // indexed function killed indexlog(1,TX("index updates: %d title/desc updates: %d \n" // final statistics "thumbnail updates: %d, deletes: %d \n"), index_updates, atd_updates, thumb_updates, thumb_deletes); // write updated xxrec_tab[] records to image index file indexlog(0,TX("writing updated image index file \n")); if (Nxxrec) { ftf = 1; for (ii = 0; ii < Nxxrec; ii++) write_xxrec_seq(xxrec_tab[ii],ftf); write_xxrec_seq(null,ftf); // close output } indexlog(0,TX("all image files, including unmounted folders: %d \n"),Nxxrec); // keep xxrec_tab[] records in memory only for files actually present for (ii = jj = 0; ii < Nxxrec; ii++) { if (Xstatus[ii] == 1) continue; // missing xxrec_tab[jj++] = xxrec_tab[ii]; } Nxxrec = jj; // new count indexlog(0,TX("after removal of missing files: %d \n"),Nxxrec); // get RAW and image file counts and megabytes Nraw = Nimage = Nvideo = 0; rawgb = imagegb = videogb = 0; for (ii = 0; ii < Nxxrec; ii++) { if (image_file_type(xxrec_tab[ii]->file) == IMAGE) { Nimage++; imagegb += atoi(xxrec_tab[ii]->fsize); // 25.4 } if (image_file_type(xxrec_tab[ii]->file) == VIDEO) { Nvideo++; videogb += atoi(xxrec_tab[ii]->fsize); } else if (image_file_type(xxrec_tab[ii]->file) == RAW) { Nraw++; rawgb += atoi(xxrec_tab[ii]->fsize); } } indexlog(0,"Image files: %d (%.1f GB) + RAW files: %d (%.1f GB) + Video files: %d \n", Nimage, imagegb/GIGA, Nraw, rawgb/GIGA, Nvideo, videogb/GIGA); // find orphan thumbnails and delete them err = find_imagefiles(thumbfolder,2+16,flist,NF); // thumbnails, recurse folders if (err) { zmessageACK(Mwin,strerror(errno)); NF = 0; } indexlog(0,"thumbnails found: %d \n",NF); if (NF > 1.1 * Nxxrec) { indexlog(0,TX("deleting orphan thumbnails ... \n")); thumb_deletes = 0; for (ii = 0; ii < NF; ii++) { thumbfile = flist[ii]; file = thumb2imagefile(thumbfile); // thumbnail corresponding file if (file) { // exists, keep thumbnail zfree(file); zfree(thumbfile); continue; } pp = thumbfile + strlen(thumbfolder); // corresponding file within for (jj = 0; jj < Nmisstops; jj++) // a missing top image folder? if (strmatchN(misstop2[jj],pp,misscc2[jj])) break; if (jj < Nmisstops) continue; // yes, keep thumbnail remove(thumbfile); // remove thumbnail file zfree(thumbfile); thumb_deletes++; } if (flist) zfree(flist); indexlog(0,TX("thumbnails deleted: %d \n"),thumb_deletes); } cleanup: // free allocated memory FfullindexReq = 0; // cancel user full xxrec_tab[] reqest if (Fescape) { zsleep(1); // user aborted Fescape = 0; Xindexlev = 0; // no index } if (! Nxxrec) Xindexlev = 0; // no index printf("image files: %d index level: %d \n",Nxxrec,Xindexlev); // report status 25.1 if (Xindexlev == 2) Findexnew = 0; // reset new/mod files count 25.1 if (xxrec_old) zfree(xxrec_old); if (xxrec_new) zfree(xxrec_new); xxrec_old = xxrec_new = 0; if (Xstatus) zfree(Xstatus); if (Tstatus) zfree(Tstatus); Xstatus = Tstatus = 0; nn = index_updates + thumb_updates; if (! keepopen && (nn < 6)) { // few updates made 25.1 indexlog(1,"index and thumb updates made: %d \n",nn); zdialog_free(zd_indexlog); // kill index log report zd_indexlog = 0; wlog = 0; } indexlog(0,TX("index completed, %.1f seconds \n"),get_seconds() - startime); indexlog(0,TX("you can close this window now \n")); indexlog(1,"\n"); // 25.2 return; } // ------------------------------------------------------------------------------------ // thumbnail thread - create thumbnail files for image files needing update namespace index_thumb_names { int threads_started; int threads_completed; } void * thumb_thread(void *arg) { using namespace index_names; using namespace index_thumb_names; void *thumb_thread2(void *); int xrec; thumb_thread_busy = 1; thumb_updates = 0; threads_started = threads_completed = 0; progress_setgoal(Nxxrec); for (xrec = 0; xrec < Nxxrec; xrec++) { if (Tstatus[xrec] != 2) continue; // thumbnail update not needed while (threads_started - threads_completed >= NSMP) zsleep(0.001); if (Fescape) break; // user kill threads_started++; start_detached_thread(thumb_thread2,&Nval[xrec]); // update thumbnail file thumb_updates++; progress_addvalue(1); } while (threads_started - threads_completed > 0) // wait for last thread zsleep(0.001); thumb_thread_busy = 0; progress_setgoal(0); return 0; } void * thumb_thread2(void *arg) { using namespace index_names; using namespace index_thumb_names; int xrec; ch *file; xrec = *((int *) arg); file = xxrec_tab[xrec]->file; // image file zfuncs::zappcrash_context1 = file; update_thumbfile(file); // do thumbnail update zadd_locked(threads_completed,+1); // 25.1 return 0; } // ------------------------------------------------------------------------------------ // index thread // get metadata for image files needing update and build image xxrec_tab[] // thread has no GTK calls namespace index_thread_names { xxrec_t **xxrecs = 0; ch **files = 0, *file; ch *tagname[100], **tagval = 0; int NF, NK, NKXX; ch *keywords, *title, *desc; } void * index_thread(void *arg) { using namespace index_names; using namespace index_thread_names; int cc, xcc, acc; int ff, kk, fkk; ch xmetarec[xmetaXcc]; // max. extra metadata cc xxrec_t *xxrec; int xrec; STATB statB; ch *fdate, *fsize; ch *pdate, *psize, *bpc, *rating; ch *location, *country, *gps_data; ch *make, *model, *lens, *exp, *fn, *fl, *iso; index_thread_busy = 1; xxrecs = 0; // 26.2 files = 0; if (! Nxxrec) goto exit_thread; for (kk = 0; kk < NKX; kk++) // get tagnames for data in xxrec_tab[] tagname[kk] = tagnamex[kk]; NKXX = xmetaNtags; // extra indexed metadata count for (kk = 0; kk < NKXX; kk++) // add tags for extra indexed metadata tagname[NKX+kk] = xmeta_tags[kk]; NK = NKX + NKXX; // standard + extra metadata tags for (kk = 0; kk < 3; kk++) // add alt. tags for image title ATD tagname[NK+kk] = tagname_alt_title[kk]; // fotocx.h dimensions must match NK += 3; for (kk = 0; kk < 6; kk++) // add alt. tags for description ATD tagname[NK+kk] = tagname_alt_desc[kk]; // fotocx.h dimensions must match NK += 6; cc = Nxxrec * sizeof(ch *); // get list of files needing update files = (ch**) zmalloc(cc,"index_thread"); xxrecs = (xxrec_t **) zmalloc(cc,"index_thread"); for (xrec = ff = 0; xrec < Nxxrec; xrec++) { if (Xstatus[xrec] != 2) continue; // index update not needed xxrecs[ff] = xxrec_tab[xrec]; file = xxrecs[ff]->file; // check file exists if (! regfile(file,&statB)) { printf("*** index_thread: file not found: %s \n",file); continue; } files[ff] = file; // image file needing update ff++; } NF = ff; // file count if (! NF) goto exit_thread; cc = NF * NK * sizeof(ch *); // get space for returned tag data tagval = (ch **) zmalloc(cc,"index_thread"); meta_getN(files,NF,tagname,tagval,NK,1); // get metadata for all files final_index_updates = NF; // final update count 26.0 for (ff = 0; ff < NF; ff++) // loop image files { if (Fescape) break; file = files[ff]; zfuncs::zappcrash_context1 = file; xxrec = xxrecs[ff]; fkk = ff * NK; // tag data for file ff fdate = tagval[fkk+0]; // metadata returned fsize = tagval[fkk+1]; pdate = tagval[fkk+2]; psize = tagval[fkk+3]; bpc = tagval[fkk+4]; rating = tagval[fkk+5]; keywords = tagval[fkk+6]; title = tagval[fkk+7]; desc = tagval[fkk+8]; location = tagval[fkk+9]; country = tagval[fkk+10]; gps_data = tagval[fkk+11]; make = tagval[fkk+12]; model = tagval[fkk+13]; lens = tagval[fkk+14]; exp = tagval[fkk+15]; fn = tagval[fkk+16]; fl = tagval[fkk+17]; iso = tagval[fkk+18]; if (fdate) strncpy0(xxrec->fdate,fdate,20); if (fsize) strncpy0(xxrec->fsize,fsize,16); if (pdate) { strncpy0(xxrec->pdate,pdate,20); xxrec->pdate[4] = xxrec->pdate[7] = ':'; // force yyyy:mm:dd (metadata mixed -/:) } if (psize) strncpy0(xxrec->psize,psize,16); if (bpc) strncpy0(xxrec->bpc,bpc,4); if (rating) strncpy0(xxrec->rating,rating,4); if (keywords) { xxrec->keywords = zstrdup(keywords,"index_thread"); cc = strlen(xxrec->keywords); while (cc > 0 && xxrec->keywords[cc-1] == ' ') cc--; // remove trailing ", " (prior fotocx) while (cc > 0 && xxrec->keywords[cc-1] == ',') cc--; xxrec->keywords[cc] = 0; } else xxrec->keywords = 0; if (title) xxrec->title = zstrdup(title,"index_thread"); else xxrec->title = 0; if (desc) xxrec->desc = zstrdup(desc,"index_thread"); else xxrec->desc = 0; if (location) strncpy0(xxrec->location,location,40); if (country) strncpy0(xxrec->country,country,40); if (gps_data) strncpy0(xxrec->gps_data,gps_data,24); if (make) strncpy0(xxrec->make,make,20); if (model) strncpy0(xxrec->model,model,20); if (lens) strncpy0(xxrec->lens,lens,20); if (exp) strncpy0(xxrec->exp,exp,12); if (fn) strncpy0(xxrec->fn,fn,12); if (fl) strncpy0(xxrec->fl,fl,12); if (iso) strncpy0(xxrec->iso,iso,12); xcc = 0; for (kk = NKX; kk < NKX+NKXX; kk++) // extra indexed metadata if any { if (! tagval[fkk+kk]) continue; acc = strlen(tagname[kk]) + strlen(tagval[fkk+kk]) + 3; if (acc + xcc >= xmetaXcc-2) { // limit tag and data < xmetaXcc printf("*** indexed metadata too big: %s %s \n",tagname[kk],file); continue; } strcpy(xmetarec+xcc,tagname[kk]); // construct series xcc += strlen(tagname[kk]); // "tagname=tagval^ " xmetarec[xcc++] = '='; strcpy(xmetarec+xcc,tagval[fkk+kk]); xcc += strlen(tagval[fkk+kk]); strcpy(xmetarec+xcc,"^ "); xcc += 2; } if (xcc > 0) xxrec->xmeta = zstrdup(xmetarec,"index_thread"); // add extra metadata to xxrec_tab[] } void * atd_thread(void *arg); // process missing title/description ATD do_wthreads(atd_thread,NSMP); // threads exit_thread: if (xxrecs) zfree(xxrecs); // free memory if (files) zfree(files); if (NF && NK) { for (kk = 0; kk < NF * NK; kk++) if (tagval[kk]) zfree(tagval[kk]); zfree(tagval); } index_thread_busy = 0; return 0; } // ------------------------------------------------------------------------------------ // thread to stuff missing title/description tags from alternative tags void * atd_thread(void *arg) // ATD 25.1 { using namespace index_names; using namespace index_thread_names; int index = *((int *) arg); int ff, kk, fkk, Fatd; ch *file; ch *title, *desc; char *tagnameatd[2], *tagvalatd[2]; // alternative tag names xxrec_t *xxrec; for (ff = index; ff < NF; ff += NSMP) // loop image files { if (Fescape) break; file = files[ff]; zfuncs::zappcrash_context1 = file; xxrec = xxrecs[ff]; fkk = ff * NK; // tag data for file ff title = tagval[fkk+7]; // "standard" title and description desc = tagval[fkk+8]; Fatd = 0; if (! title) { // look for alt. image title tag data for (kk = NKX+NKXX; kk < NKX+NKXX+3; kk++) // fotocx.h dimensions must match if (tagval[fkk+kk]) break; if (kk < NKX+NKXX+3) { // found one xxrec->title = zstrdup(tagval[fkk+kk],"index_thread"); // use in image index Fatd = 1; } } if (! desc) { // look for alt. description tag data for (kk = NKX+NKXX+3; kk < NKX+NKXX+9; kk++) // fotocx.h dimensions must match if (tagval[fkk+kk]) break; if (kk < NKX+NKXX+9) { // found one xxrec->desc = zstrdup(tagval[fkk+kk],"index_thread"); // use in image index Fatd = 1; } } if (Fatd) { // add either or both to file metadata printf("consolidate title and description: %s \n",file); tagnameatd[0] = tagnamex[7]; tagnameatd[1] = tagnamex[8]; tagvalatd[0] = xxrec->title; tagvalatd[1] = xxrec->desc; meta_put(file,tagnameatd,tagvalatd,2); atd_updates++; } } return 0; } // ------------------------------------------------------------------------------------ // index log window dialog response function int indexlog_dialog_event(zdialog *zd, ch *event) { using namespace index_names; if (! zd->zstat) return 1; // continue if (Fbusy()) { Fescape = 1; // [kill] index process zmainsleep(0.1); } zdialog_free(zd); // kill index log report zd_indexlog = 0; wlog = 0; return 1; } // log index status and statistics to report window and log file void indexlog(int bold, ch *format, ...) // 26.8 { using namespace index_names; va_list arglist; ch text_en[200], text_xx[200]; va_start(arglist,format); vsnprintf(text_xx,200,format,arglist); // user language va_end(arglist); va_start(arglist,format); vsnprintf(text_en,200,XT(format),arglist); // english va_end(arglist); printf("%s",text_en); // output to log file - english if (wlog) txwidget_append2(wlog,bold,text_xx); // output to report window - user lang. return; } // ------------------------------------------------------------------------------------ // sort compare function - compare xxrec_tab[] records and return // <0 0 >0 for rec1 < rec2 rec1 == rec2 rec1 > rec2 int index_compare(ch *rec1, ch *rec2) { xxrec_t *xxrec1 = (xxrec_t *) rec1; xxrec_t *xxrec2 = (xxrec_t *) rec2; int nn = strcmp(xxrec1->file,xxrec2->file); if (nn) return nn; nn = strcmp(xxrec1->fdate,xxrec2->fdate); return nn; } /**************************************************************************************/ // Rebuild image xxrec_tab[] table from existing image index file // without searching for new and modified files. void index_rebuild_old() { using namespace index_names; int ftf, cc, rec, rec2, Ntab; xxrec_t *xxrec; if (Xindexlev > 0) return; // not needed panelmessage(1,3,TX("build index, old files only")); // 25.1 // read image index file and build table of xxrec_tab[] records cc = maximages * sizeof(xxrec_t *); xxrec_tab = (xxrec_t **) zmalloc(cc,"index-rebuild"); // image xxrec_tab[] recs Ntab = 0; ftf = 1; while (true) { zmainloop(); xxrec = read_xxrec_seq(ftf); // read curr. xxrec_tab[] recs if (! xxrec) break; if (! regfile(xxrec->file)) continue; xxrec_tab[Ntab] = xxrec; Ntab++; if (Ntab == maximages) { zmessageACK(Mwin,TX("exceeded max. images: %d"),maximages); Xindexlev = 0; // 26.0 return; } } // sort xxrec_tab[] recs in order of file name and file mod date if (Ntab) HeapSort((ch **) xxrec_tab,Ntab,index_compare); // smp sort // replace older recs with newer (appended) recs now sorted together if (Ntab) { for (rec = 0, rec2 = 1; rec2 < Ntab; rec2++) { if (strmatch(xxrec_tab[rec]->file,xxrec_tab[rec2]->file)) xxrec_tab[rec] = xxrec_tab[rec2]; else { rec++; xxrec_tab[rec] = xxrec_tab[rec2]; } } Ntab = rec + 1; // new count } Nxxrec = Ntab; if (Nxxrec) Xindexlev = 1; // image index OK return; } /**************************************************************************************/ // user preferences and settings dialog namespace settings { void get_raw_commands(zdialog *zd); ch *startopt[6] = { "start folder", "start file", "start album", // startup options "previous file", "recent files", "newest files" }; int Frestart; } // menu function void m_settings(GtkWidget *, ch *) { using namespace settings; int settings_dialog_event(zdialog *zd, ch *event); zdialog *zd; int ii; ch txrgb[20], pct_scale[40]; ch lcfile[200]; zlist_t *zlist; snprintf(pct_scale,40,TX("min. separation, %c of scale"),'%'); // "separation, % of scale" F1_help_topic = TX("SETTINGS"); printf("m_settings \n"); if (Fblock("settings")) return; /*** _____________________________________________________________________ | Preferences and Settings | | | | Language | [ en |v] 2-character code | // 26.0 | Startup View | [ Previous File |v] [browse] | | Background | F-view [###] G-view [###] | | Menu Style | (o) Icons (o) Text (o) Both Icon size [40] | | Menu Colors | Text [###] Background [###] | | Dialog Font | [ Ubuntu Bold 11 ] [choose] | | Show Hidden | [x] show hidden files and folders | // 26.4 | Zoom Speed | [ 2 ] clicks per 2x image increase | | JPEG files | [ 90 ] quality level (70+) | | Curve Node | [ 5 ] min. separation, % of scale | | Image Position | (o) left (o) center (o) right | | Confirm Exit | [x] confirm Fotocx exit | | Index Level | [ 2 ] $ fotocx [ 1 ] $ fotocx | | RAW loader | command [___________________________________|v] | | RAW Options | [_] edit commands [x] use embedded image color | | RAW files | [ .cr2 .dng .raf .nef .orf .rw2 .raw ] | | Video Files | [ .mp4 .mov .wmv .mpeg .mpg .h264 .webm ] | | Video App | [ vlc -q |v] | | [OK] | |_____________________________________________________________________| ***/ zd = zdialog_new("Preferences and Settings",Mwin,"OK",null); // left and right vertical boxes zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"space=2|homog"); zdialog_add_widget(zd,"vsep","sep1","hb1",0,"space=10"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"space=2|homog"); // language code zdialog_add_widget(zd,"label","language","vb1",TX("Language")); // 26.0 zdialog_add_widget(zd,"hbox","hblc","vb2"); zdialog_add_widget(zd,"combo","lc","hblc",0,"size=10"); zdialog_add_widget(zd,"label","lablc","hblc",TX("2-character code"),"space=8"); // startup view zdialog_add_widget(zd,"label","startup view","vb1",TX("Startup View")); zdialog_add_widget(zd,"hbox","hbsd","vb2"); zdialog_add_widget(zd,"combo","startopt","hbsd",0,"space=3|size=30"); zdialog_add_widget(zd,"button","startopt-browse","hbsd",TX("Browse"),"space=5"); // background colors zdialog_add_widget(zd,"label","background colors","vb1",TX("Background")); zdialog_add_widget(zd,"hbox","hbbg","vb2"); zdialog_add_widget(zd,"label","labfbg","hbbg","F-View","space=5"); zdialog_add_widget(zd,"colorbutt","FBrgb","hbbg"); zdialog_add_widget(zd,"label","space","hbbg",0,"space=8"); zdialog_add_widget(zd,"label","labgbg","hbbg","G-View","space=5"); zdialog_add_widget(zd,"colorbutt","GBrgb","hbbg"); // menu style zdialog_add_widget(zd,"label","menu style","vb1",TX("Menu Style")); zdialog_add_widget(zd,"hbox","hbms","vb2"); zdialog_add_widget(zd,"radio","icons","hbms",TX("Icons"),"space=3"); zdialog_add_widget(zd,"radio","text","hbms",TX("Text"),"space=3"); zdialog_add_widget(zd,"radio","both","hbms",TX("Both"),"space=3"); zdialog_add_widget(zd,"label","space","hbms",0,"space=8"); zdialog_add_widget(zd,"label","labis","hbms",TX("Icon size")); zdialog_add_widget(zd,"zspin","iconsize","hbms","26|64|1|32","space=2"); // menu colors zdialog_add_widget(zd,"label","menu colors","vb1",TX("Menu Colors")); zdialog_add_widget(zd,"hbox","hbmc","vb2"); zdialog_add_widget(zd,"label","labmb","hbmc",TX("Text"),"space=5"); zdialog_add_widget(zd,"colorbutt","MFrgb","hbmc"); zdialog_add_widget(zd,"label","space","hbmc",0,"space=5"); zdialog_add_widget(zd,"label","labmb","hbmc",TX("Background"),"space=8"); zdialog_add_widget(zd,"colorbutt","MBrgb","hbmc"); // dialog font zdialog_add_widget(zd,"label","dialog font","vb1",TX("Dialog Font")); zdialog_add_widget(zd,"hbox","hbdf","vb2"); zdialog_add_widget(zd,"zentry","font","hbdf","Sans 10","size=20"); zdialog_add_widget(zd,"button","choosefont","hbdf",TX("Choose"),"space=5"); // show hidden zdialog_add_widget(zd,"label","show hidden","vb1",TX("Show Hidden")); zdialog_add_widget(zd,"hbox","hbhide","vb2"); zdialog_add_widget(zd,"check","showhidden","hbhide"); zdialog_add_widget(zd,"label","labhide","hbhide",TX("show hidden files and folders"),"space=10"); // zoom count zdialog_add_widget(zd,"label","zoom count","vb1",TX("Zoom Speed")); zdialog_add_widget(zd,"hbox","hbz","vb2"); zdialog_add_widget(zd,"zspin","zoomcount","hbz","1|40|1|2","size=3"); zdialog_add_widget(zd,"label","labz","hbz",TX("clicks per 2x image increase"),"space=5"); // JPEG save quality zdialog_add_widget(zd,"label","jpeg qual","vb1",TX("JPEG files")); zdialog_add_widget(zd,"hbox","hbjpeg","vb2"); zdialog_add_widget(zd,"zspin","jpegqual","hbjpeg","1|100|1|90"); zdialog_add_widget(zd,"label","labqual","hbjpeg",TX("quality level (70+)"),"space=10"); // curve edit node separation zdialog_add_widget(zd,"label","curve node","vb1",TX("Curve Node")); zdialog_add_widget(zd,"hbox","hbncap","vb2"); zdialog_add_widget(zd,"zspin","nodecap","hbncap","3|20|1|5","size=2"); zdialog_add_widget(zd,"label","labncap","hbncap",pct_scale,"space=10"); // image position zdialog_add_widget(zd,"label","image posn","vb1",TX("Image Position")); zdialog_add_widget(zd,"hbox","hbshift","vb2"); zdialog_add_widget(zd,"radio","ipleft","hbshift",TX("left")); zdialog_add_widget(zd,"radio","ipcenter","hbshift",TX("center"),"space=10"); zdialog_add_widget(zd,"radio","ipright","hbshift",TX("right"),"space=5"); // confirm exit zdialog_add_widget(zd,"label","confirm exit","vb1",TX("Confirm Exit")); zdialog_add_widget(zd,"hbox","hbquit","vb2"); zdialog_add_widget(zd,"check","askquit","hbquit"); zdialog_add_widget(zd,"label","labquit","hbquit",TX("confirm Fotocx exit"),"space=10"); // index level zdialog_add_widget(zd,"label","index levels","vb1",TX("Index Level")); zdialog_add_widget(zd,"hbox","hbxlev","vb2"); zdialog_add_widget(zd,"zspin","findexlev","hbxlev","0|2|1|2","size=3"); zdialog_add_widget(zd,"label","labxlev2","hbxlev","$ fotocx (2)","space=5"); zdialog_add_widget(zd,"label","space","hbxlev",0,"space=10"); zdialog_add_widget(zd,"zspin","fmindexlev","hbxlev","0|2|1|0","size=3"); zdialog_add_widget(zd,"label","labfmxlev2","hbxlev","$ fotocx (1)","space=5"); // RAW loader zdialog_add_widget(zd,"label","raw loader","vb1",TX("RAW loader")); zdialog_add_widget(zd,"hbox","hbrc","vb2"); zdialog_add_widget(zd,"label","labrc","hbrc",TX("command:"),"space=5"); zdialog_add_widget(zd,"combo","rawcommand","hbrc",0,"space=3"); // RAW conversion options zdialog_add_widget(zd,"label","raw options","vb1",TX("RAW Options")); zdialog_add_widget(zd,"hbox","hbrc","vb2"); zdialog_add_widget(zd,"zbutton","editrawcomms","hbrc",TX("edit commands")); zdialog_add_widget(zd,"label","space","hbrc",0,"space=10"); zdialog_add_widget(zd,"check","matchembed","hbrc",0,"space=3"); zdialog_add_widget(zd,"label","labprof","hbrc",TX("match embedded image color")); // RAW file types zdialog_add_widget(zd,"label","raw files","vb1",TX("RAW Files")); zdialog_add_widget(zd,"hbox","hbrft","vb2"); zdialog_add_widget(zd,"zentry","rawtypes","hbrft",".raw .dng"); // video file types zdialog_add_widget(zd,"label","video files","vb1",TX("Video Files")); zdialog_add_widget(zd,"hbox","hbvft","vb2"); zdialog_add_widget(zd,"zentry","videotypes","hbvft",".mp4 .mov"); // video play app zdialog_add_widget(zd,"label","video command","vb1",TX("Video command")); zdialog_add_widget(zd,"hbox","hbvc","vb2"); zdialog_add_widget(zd,"zentry","videocomm","hbvc",video_command,"size=40"); zdialog_add_ttip(zd,"lc",TX("enter 2-character language code: en, de, fr ...")); // 26.0 zdialog_add_ttip(zd,"startup view",TX("start with previous image file, gallery of recent files, etc.")); zdialog_add_ttip(zd,"background colors",TX("background colors for file and gallery view windows")); zdialog_add_ttip(zd,"menu style",TX("icons only, text only, or both")); zdialog_add_ttip(zd,"menu colors",TX("menu text and background colors")); zdialog_add_ttip(zd,"dialog font",TX("font name and size for menus and dilogs")); zdialog_add_ttip(zd,"zoom count",TX("choose 1-8 clicks or [+] keys for 2x image zoom")); zdialog_add_ttip(zd,"jpeg qual",TX("jpeg quality level - 70+ for good image quality")); zdialog_add_ttip(zd,"curve node",TX("min. edit curve node separation, % of scale length")); zdialog_add_ttip(zd,"map marker",TX("map marker (red dot) diameter, pixels")); zdialog_add_ttip(zd,"image posn",TX("if image < window, center or shift left or right")); zdialog_add_ttip(zd,"confirm exit",TX("use option to stop accidental quit")); zdialog_add_ttip(zd,"index levels",TX("0/1/2 = no image index, old index only, old + update new/modified")); zdialog_add_ttip(zd,"raw loader",TX("shell command used for converting RAW files to RGB")); zdialog_add_ttip(zd,"raw options",TX("edit custom shell commands, match colors to embedded jpeg image")); zdialog_add_ttip(zd,"raw files",TX("file .ext names to recognize RAW files")); zdialog_add_ttip(zd,"video files",TX("file .ext names to recognize video files")); zdialog_add_ttip(zd,"video command",TX("custom command to play video files")); // stuff dialog fields with current settings snprintf(lcfile,200,"%s/$ language codes",translations_folder); // 26.0 zlist = zlist_from_file(lcfile); for (ii = 0; ii < zlist_count(zlist); ii++) zdialog_stuff(zd,"lc",zlist_get(zlist,ii)); zdialog_stuff(zd,"lc",lc); // set current language code zlist_free(zlist); zdialog_stuff(zd,"startopt",TX("start folder")); // make list of start display options zdialog_stuff(zd,"startopt",TX("start file")); zdialog_stuff(zd,"startopt",TX("start album")); zdialog_stuff(zd,"startopt",TX("previous file")); zdialog_stuff(zd,"startopt",TX("recent files")); zdialog_stuff(zd,"startopt",TX("newest files")); zdialog_stuff(zd,"startopt",TX(startdisplay)); // restore current option snprintf(txrgb,20,"%d|%d|%d",FBrgb[0],FBrgb[1],FBrgb[2]); // F-view background color zdialog_stuff(zd,"FBrgb",txrgb); snprintf(txrgb,20,"%d|%d|%d",GBrgb[0],GBrgb[1],GBrgb[2]); // G-view background color zdialog_stuff(zd,"GBrgb",txrgb); zdialog_stuff(zd,"icons",0); // menu style zdialog_stuff(zd,"text",0); zdialog_stuff(zd,"both",0); if (strmatch(menu_style,"icons")) zdialog_stuff(zd,"icons",1); else if (strmatch(menu_style,"text")) zdialog_stuff(zd,"text",1); else zdialog_stuff(zd,"both",1); zdialog_stuff(zd,"iconsize",iconsize); // icon size snprintf(txrgb,20,"%d|%d|%d",MFrgb[0],MFrgb[1],MFrgb[2]); // menus font color zdialog_stuff(zd,"MFrgb",txrgb); snprintf(txrgb,20,"%d|%d|%d",MBrgb[0],MBrgb[1],MBrgb[2]); // menus background color zdialog_stuff(zd,"MBrgb",txrgb); zdialog_stuff(zd,"font",application_font); // curr. menu + dialog font 26.3 zdialog_stuff(zd,"showhidden",Fshowhidden); // show hidden files option 26.4 zdialog_stuff(zd,"zoomcount",zoomcount); // zooms for 2x increase zdialog_stuff(zd,"drag",0); // image drag/scroll options zdialog_stuff(zd,"scroll",0); zdialog_stuff(zd,"fast",0); zdialog_stuff(zd,"jpegqual",jpeg_def_quality); // default jpeg file save quality zdialog_stuff(zd,"nodecap",zfuncs::splcurve_minx); // edit curve min. node distance zdialog_stuff(zd,"ipleft",0); // F-view image position zdialog_stuff(zd,"ipcenter",0); zdialog_stuff(zd,"ipright",0); if (strmatch(ImagePosn,"left")) zdialog_stuff(zd,"ipleft",1); if (strmatch(ImagePosn,"center")) zdialog_stuff(zd,"ipcenter",1); if (strmatch(ImagePosn,"right")) zdialog_stuff(zd,"ipright",1); if (Faskquit) zdialog_stuff(zd,"askquit",1); // ask to quit option else zdialog_stuff(zd,"askquit",0); zdialog_stuff(zd,"findexlev",Findexlev); // index level, always zdialog_stuff(zd,"fmindexlev",FMindexlev); // index level, file manager call get_raw_commands(zd); // get raw commands from corresp. file zdialog_stuff(zd,"matchembed",Fraw_match_embed); // match embedded image color zdialog_stuff(zd,"rawtypes",RAWfiletypes); // RAW file types zdialog_stuff(zd,"videotypes",VIDEOfiletypes); // VIDEO file types zdialog_stuff(zd,"videocomm",video_command); // video play command Frestart = 0; // some changes require restart // run dialog and wait for completion zdialog_resize(zd,500,500); zmainloop(); // GTK bug - help widgets resize zdialog_run(zd,settings_dialog_event,"save"); // run dialog and wait for completion zdialog_wait(zd); zdialog_free(zd); Fblock(0); save_params(); // save parameter changes gtk_window_present(MWIN); // refresh window if (Frestart) { // start new session if needed new_session("-x1"); // no re-index needed zsleep(1); // delay before SIGTERM in quitxx() quitxx(); } return; } // settings dialog event function int settings_dialog_event(zdialog *zd, ch *event) { using namespace settings; int ii, jj, nn; ch *pp, temp[200]; ch *ppc; ch txrgb[20], langcode[20]; GtkWidget *font_dialog; if (zd->zstat) return 1; // [OK] or [x] if (strmatch(event,"lc")) // language code 26.0 { zdialog_fetch(zd,"lc",langcode,20); strncpy0(lc,langcode,3); // use only 2-char. code Frestart = 1; } if (strmatch(event,"startopt")) // set startup display { zdialog_fetch(zd,"startopt",temp,200); if (strmatch(temp,TX("start folder"))) zstrcpy(startdisplay,"start folder"); if (strmatch(temp,TX("start file"))) zstrcpy(startdisplay,"start file"); if (strmatch(temp,TX("start album"))) zstrcpy(startdisplay,"start album"); if (strmatch(temp,TX("previous file"))) zstrcpy(startdisplay,"previous file"); if (strmatch(temp,TX("recent files"))) zstrcpy(startdisplay,"recent files"); if (strmatch(temp,TX("newest files"))) zstrcpy(startdisplay,"newest files"); } if (strmatch(event,"startopt-browse")) // browse for startup folder or file { if (strmatch(startdisplay,"start folder")) { // set startup gallery if (! startfolder && topfolders[0]) startfolder = zstrdup(topfolders[0],"settings"); // default pp = zgetfile(TX("Select startup folder"),MWIN,"folder",startfolder); if (! pp) return 1; if (image_file_type(pp) != FDIR) { zmessageACK(Mwin,TX("startup folder is invalid")); zfree(pp); return 1; } if (startfolder) zfree(startfolder); startfolder = pp; } if (strmatch(startdisplay,"start file")) { // set startup image file pp = zgetfile(TX("Select startup image file"),MWIN,"file",startfile); if (! pp) return 1; if (image_file_type(pp) != IMAGE) { zmessageACK(Mwin,TX("startup file is invalid")); zfree(pp); return 1; } if (startfile) zfree(startfile); startfile = pp; } if (strmatch(startdisplay,"start album")) { // specific album pp = zgetfile(TX("Select startup album"),MWIN,"file",albums_folder); if (! pp) return 1; if (! strstr(pp,albums_folder)) { zmessageACK(Mwin,TX("startup album is invalid")); zfree(pp); return 1; } if (startalbum) zfree(startalbum); startalbum = pp; } } if (strmatch(event,"FBrgb")) { zdialog_fetch(zd,"FBrgb",txrgb,20); // F-view background color ppc = substring(txrgb,"|",1); if (ppc) FBrgb[0] = atoi(ppc); ppc = substring(txrgb,"|",2); if (ppc) FBrgb[1] = atoi(ppc); ppc = substring(txrgb,"|",3); if (ppc) FBrgb[2] = atoi(ppc); } if (strmatch(event,"GBrgb")) { zdialog_fetch(zd,"GBrgb",txrgb,20); // G-view background color ppc = substring(txrgb,"|",1); if (ppc) GBrgb[0] = atoi(ppc); ppc = substring(txrgb,"|",2); if (ppc) GBrgb[1] = atoi(ppc); ppc = substring(txrgb,"|",3); if (ppc) GBrgb[2] = atoi(ppc); } if (strstr("icons text both iconsize",event)) // menu options { zdialog_fetch(zd,"icons",nn); // menu style = icons if (nn) zstrcopy(menu_style,"icons","settings"); zdialog_fetch(zd,"text",nn); // menu style = text if (nn) zstrcopy(menu_style,"text","settings"); zdialog_fetch(zd,"both",nn); // menu style = icons + text if (nn) zstrcopy(menu_style,"both","settings"); zdialog_fetch(zd,"iconsize",nn); // icon size if (nn != iconsize) { iconsize = nn; } Frestart = 1; } if (strstr("MFrgb MBrgb",event)) { zdialog_fetch(zd,"MFrgb",txrgb,20); // menu text color ppc = substring(txrgb,"|",1); if (ppc) MFrgb[0] = atoi(ppc); ppc = substring(txrgb,"|",2); if (ppc) MFrgb[1] = atoi(ppc); ppc = substring(txrgb,"|",3); if (ppc) MFrgb[2] = atoi(ppc); zdialog_fetch(zd,"MBrgb",txrgb,20); // menu background color ppc = substring(txrgb,"|",1); if (ppc) MBrgb[0] = atoi(ppc); ppc = substring(txrgb,"|",2); if (ppc) MBrgb[1] = atoi(ppc); ppc = substring(txrgb,"|",3); if (ppc) MBrgb[2] = atoi(ppc); Frestart = 1; } if (strmatch(event,"choosefont")) // choose menu/dialog font { zdialog_fetch(zd,"font",temp,200); font_dialog = gtk_font_chooser_dialog_new(TX("select font"),MWIN); gtk_font_chooser_set_font(GTK_FONT_CHOOSER(font_dialog),temp); gtk_dialog_run(GTK_DIALOG(font_dialog)); pp = gtk_font_chooser_get_font(GTK_FONT_CHOOSER(font_dialog)); gtk_widget_destroy(font_dialog); if (! pp) return 1; zdialog_stuff(zd,"font",pp); application_font = zstrdup(pp,"settings"); // 26.3 zsetfont(pp); g_free(pp); Frestart = 1; // 26.3 } if (strmatch(event,"showhidden")) { // show hidden option 26.4 zdialog_fetch(zd,"showhidden",Fshowhidden); Frestart = 1; // discard folder cache 26.5 } if (strmatch(event,"zoomcount")) { zdialog_fetch(zd,"zoomcount",zoomcount); // zooms for 2x image size zoomratio = pow( 2.0, 1.0 / zoomcount); // 2.0, 1.4142, 1.2599, 1.1892 ... } if (strmatch(event,"jpegqual")) zdialog_fetch(zd,"jpegqual",jpeg_def_quality); // JPEG file save quality if (strmatch(event,"nodecap")) // edit curve min. node distance zdialog_fetch(zd,"nodecap",zfuncs::splcurve_minx); if (strstr("ipleft ipcenter ipright",event)) // image position in wider window { zdialog_fetch(zd,"ipleft",nn); if (nn) zstrcopy(ImagePosn,"left","settings"); zdialog_fetch(zd,"ipcenter",nn); if (nn) zstrcopy(ImagePosn,"center","settings"); zdialog_fetch(zd,"ipright",nn); if (nn) zstrcopy(ImagePosn,"right","settings"); } if (strmatch(event,"askquit")) // ask to quit option zdialog_fetch(zd,"askquit",Faskquit); if (strstr("findexlev fmindexlev",event)) // index level, { zdialog_fetch(zd,"findexlev",Findexlev); // fotocx started directly zdialog_fetch(zd,"fmindexlev",FMindexlev); // fotocx started via file manager if (Findexlev < FMindexlev) Findexlev = FMindexlev; // disallow F < FM } if (strmatch("rawcommand",event)) { zdialog_fetch(zd,"rawcommand",temp,200); // get new RAW loader command if (*temp > ' ') { if (raw_loader_command) zfree(raw_loader_command); raw_loader_command = zstrdup(temp,"settings"); } } if (strmatch(event,"editrawcomms")) // edit raw loader commands file { zdialog_edit_textfile(Mwin,raw_commands_file); // edit raw commands file get_raw_commands(zd); // refresh dialog raw commands list 25.0 return 1; } if (strmatch(event,"matchembed")) // option, match embedded image color zdialog_fetch(zd,"matchembed",Fraw_match_embed); if (strmatch(event,"rawtypes")) // RAW file types, .raw .rw2 ... { zdialog_fetch(zd,"rawtypes",temp,200); pp = zstrdup(temp,"settings",100); for (ii = jj = 0; temp[ii]; ii++) { // insure blanks between types if (temp[ii] == '.' && ii && temp[ii-1] != ' ') pp[jj++] = ' '; pp[jj++] = temp[ii]; } if (pp[jj-1] != ' ') pp[jj++] = ' '; // insure 1 final blank pp[jj] = 0; if (RAWfiletypes) zfree(RAWfiletypes); RAWfiletypes = pp; } if (strmatch(event,"videotypes")) // VIDEO file types, .mp4 .mov ... { zdialog_fetch(zd,"videotypes",temp,200); pp = zstrdup(temp,"settings",100); for (ii = jj = 0; temp[ii]; ii++) { // insure blanks between types if (temp[ii] == '.' && ii && temp[ii-1] != ' ') pp[jj++] = ' '; pp[jj++] = temp[ii]; } if (pp[jj-1] != ' ') pp[jj++] = ' '; // insure 1 final blank pp[jj] = 0; if (VIDEOfiletypes) zfree(VIDEOfiletypes); VIDEOfiletypes = pp; } if (strmatch(event,"videocomm")) // user-selected video command { zdialog_fetch(zd,"videocomm",temp,200); zstrcopy(video_command,temp,"settings"); } return 1; } // local function to stuff settings dialog RAW loader commands // from the corresponding text file in Fotocx home folder void settings::get_raw_commands(zdialog *zd) { zlist_t *zrawcomms = 0; int nn, ii; ch *pp, text[200]; zdialog_combo_clear(zd,"rawcommand"); // 25.0 zrawcomms = zlist_from_file(raw_commands_file); if (zrawcomms) { nn = zlist_count(zrawcomms); for (ii = 0; ii < nn; ii++) { pp = zlist_get(zrawcomms,ii); if (! pp) continue; strncpy0(text,pp,200); strTrim(text); if (strlen(text) < 8) continue; zdialog_stuff(zd,"rawcommand",text); } } zdialog_stuff(zd,"rawcommand",raw_loader_command); // reset to current option return; } /**************************************************************************************/ // keyboard shortcuts namespace KBshortcutnames { zdialog *zd; int Nreserved = 17; // reserved shortcuts (hard coded) ch *reserved[17] = { "+", "-", "=", "Z", "F1", "F10", "F11", "Escape", "Delete", // 26.0 "Left", "Right", "Up", "Down", "Home", "End", "Page_Up", "Page_Down" }; KBsutab_t KBsutab2[maxkbsu]; // KB shortcuts list during editing int Nkbsu2; } // KB shortcuts menu function void m_KB_shortcuts(GtkWidget *, ch *) { using namespace KBshortcutnames; int KBshorts_dialog_event(zdialog *zd, ch *event); void KB_shortcuts_edit(); int zstat, ii; GtkWidget *widget; F1_help_topic = TX("KEYBOARD SHORTCUTS"); printf("m_KB_shortcuts \n"); /*** _______________________________________________ | Keyboard Shortcuts | | | | Reserved Shortcuts | // 26.0 | + / = Zoom-in | | - Zoom-out | | Z 1x <--> fit to window | | F1 User Guide, Context Help | | F10/F11 Full Screen / no menus | | Escape Quit dialog, Quit Fotocx | | Delete Delete/Trash file | | L/R Arrow keys Previous/Next file | | U/D Arrow keys Gallery row up/down | | Page U/D keys Gallery page up/down | | Home/End Gallery start/end | | | | Custom Shortcuts | | F File View | | G Gallery View | | M Map View | | R Rotate | | T Retouch | | ... ... | | | | [Edit] [X] | |_______________________________________________| ***/ zd = zdialog_new(TX("Keyboard Shortcuts"),Mwin,TX("Edit"),"X",null); zdialog_add_widget(zd,"scrwin","scrlist","dialog",0,"space=5|expand"); zdialog_add_widget(zd,"text","shortlist","scrlist",0,"expand"); widget = zdialog_gtkwidget(zd,"shortlist"); // list fixed shortcuts txwidget_append(widget,1,TX("Reserved Shortcuts \n")); // 26.0 txwidget_append(widget,0,TX(" + Zoom-in \n")); txwidget_append(widget,0,TX(" = Zoom-in \n")); txwidget_append(widget,0,TX(" - Zoom-out \n")); txwidget_append(widget,0,TX(" Z 1x <--> fit to window \n")); txwidget_append(widget,0,TX(" F1 User Guide, Context Help \n")); txwidget_append(widget,0,TX(" F10/F11 Full Screen / no menus \n")); txwidget_append(widget,0,TX(" Escape Quit dialog / Quit Fotocx \n")); txwidget_append(widget,0,TX(" Delete Delete/Trash file \n")); txwidget_append(widget,0,TX(" Arrow keys Previous/Next file \n")); txwidget_append(widget,0,TX(" Page keys Gallery page up/down \n")); txwidget_append(widget,0,TX(" Home/End Gallery start/end \n")); txwidget_append(widget,0,"\n"); txwidget_append(widget,1,TX("Custom Shortcuts \n")); for (ii = 0; ii < Nkbsu; ii++) // list custom shortcuts, translated 26.0 txwidget_append(widget,0," %-14s %s \n", KBsutab[ii].key, TX(KBsutab[ii].menu)); zdialog_resize(zd,400,600); zdialog_run(zd,KBshorts_dialog_event,"save"); zstat = zdialog_wait(zd); zdialog_free(zd); if (zstat == 1) KB_shortcuts_edit(); return; } // dialog event and completion function int KBshorts_dialog_event(zdialog *zd, ch *event) { if (zd->zstat) zdialog_destroy(zd); return 1; } // KB shortcuts edit function void KB_shortcuts_edit() { using namespace KBshortcutnames; int KBshorts_CBfunc1(GtkWidget *widget, int line, int pos, ch *input); int KBshorts_CBfunc2(GtkWidget *widget, int line, int pos, ch *input); int KBshorts_keyfunc(GtkWidget *dialog, GdkEventKey *event); int KBshorts_edit_dialog_event(zdialog *zd, ch *event); int ii; GtkWidget *widget; ch *sortlist[maxkbsf]; // all eligible funcs, sorted /*** _________________________________________________________________ | Edit Keyboard Shortcuts | |_________________________________________________________________| | F File View | Blur | | G Gallery View | Bookmarks | | M Map View | Captions | | R Rotate | Color Depth | | T Retouch | Color Saturation | | K Shortcuts Menu | Copy to Cache | | ... ... | ... | |_________________________________________|_______________________| | | | shortcut key: (press key) (select function) | | | | [Add] [Delete] [OK] [X] | |_________________________________________________________________| ***/ zd = zdialog_new(TX("Edit Keyboard Shortcuts"),Mwin,TX("Add"),TX("Delete"),"OK","X",null); zdialog_add_widget(zd,"hbox","hblists","dialog",0,"expand"); zdialog_add_widget(zd,"scrwin","scrlist","hblists",0,"expand"); zdialog_add_widget(zd,"text","shortlist","scrlist",0,"expand"); zdialog_add_widget(zd,"vsep","separator","hblists",0,"space=10"); zdialog_add_widget(zd,"scrwin","scrmenus","hblists",0,"expand"); zdialog_add_widget(zd,"text","menufuncs","scrmenus"); zdialog_add_widget(zd,"hbox","hbshort","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labshort","hbshort",TX("shortcut key:"),"space=5"); zdialog_add_widget(zd,"label","shortkey","hbshort",TX("(press key)"),"size=10"); zdialog_add_widget(zd,"label","shortfunc","hbshort",TX("(select function)"),"space=5"); for (ii = 0; ii < Nkbsu; ii++) { // copy current shortcuts list KBsutab2[ii].key = zstrdup(KBsutab[ii].key,"KB_shortcuts"); // for use during editing KBsutab2[ii].menu = zstrdup(KBsutab[ii].menu,"KB_shortcuts"); } Nkbsu2 = Nkbsu; widget = zdialog_gtkwidget(zd,"shortlist"); // show shortcuts list in dialog txwidget_clear(widget); for (ii = 0; ii < Nkbsu2; ii++) txwidget_append(widget,0,"%-14s %s \n", // 26.0 KBsutab2[ii].key, TX(KBsutab2[ii].menu)); txwidget_set_eventfunc(widget,KBshorts_CBfunc1); // set mouse/KB event function for (ii = 0; ii < Nkbsf; ii++) // copy eligible shortcut funcs sortlist[ii] = zstrdup(KBsftab[ii].menu,"KB_shortcuts"); HeapSort(sortlist,Nkbsf); // sort copied list widget = zdialog_gtkwidget(zd,"menufuncs"); // clear dialog txwidget_clear(widget); for (ii = 0; ii < Nkbsf; ii++) // show sorted funcs list txwidget_append(widget,0,"%s\n",sortlist[ii]); txwidget_set_eventfunc(widget,KBshorts_CBfunc2); // set mouse/KB event function widget = zdialog_gtkwidget(zd,"dialog"); // capture KB keys pressed G_SIGNAL(widget,"key-press-event",KBshorts_keyfunc,0); zdialog_resize(zd,600,400); zdialog_run(zd,KBshorts_edit_dialog_event,"save"); return; } // mouse callback function to select existing shortcut from list // and stuff into dialog "shortfunc" int KBshorts_CBfunc1(GtkWidget *widget, int line, int pos, ch *input) { using namespace KBshortcutnames; ch *txline; ch shortkey[20]; ch shortfunc[60]; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txline = txwidget_line(widget,line,1); // get clicked line if (! txline || ! *txline) return 1; txwidget_highlight_line(widget,line); strncpy0(shortkey,txline,14); // get shortcut key and menu strncpy0(shortfunc,txline+15,60); zfree(txline); strTrim(shortkey); strTrim(shortfunc); zdialog_stuff(zd,"shortkey",shortkey); // stuff into dialog zdialog_stuff(zd,"shortfunc",shortfunc); return 1; } // mouse callback function to select new shortcut function from menu list // and stuff into dialog "shortfunc" int KBshorts_CBfunc2(GtkWidget *widget, int line, int pos, ch *input) { using namespace KBshortcutnames; ch *txline; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } txline = txwidget_line(widget,line,1); // get clicked line if (! txline || ! *txline) return 1; txwidget_highlight_line(widget,line); zdialog_stuff(zd,"shortfunc",txline); // stuff into dialog zfree(txline); return 1; } // intercept KB key events, stuff into dialog "shortkey" int KBshorts_keyfunc(GtkWidget *dialog, GdkEventKey *event) { using namespace KBshortcutnames; int Ctrl = 0, Alt = 0, Shift = 0; int key, ii, cc; ch kbname[20]; key = event->keyval; if (event->state & GDK_CONTROL_MASK) Ctrl = 1; if (event->state & GDK_SHIFT_MASK) Shift = 1; if (event->state & GDK_MOD1_MASK) Alt = 1; if (key == GDK_KEY_F1) { // key is F1 (context help) KBevent(event); // send to main app return 1; } if (key >= GDK_KEY_F2 && key <= GDK_KEY_F9) { // key is F2 to F9 ii = key - GDK_KEY_F1; strcpy(kbname,"F1"); kbname[1] += ii; } else if (key > 255) return 1; // not a simple Ascii key else { *kbname = 0; // build input key combination if (Ctrl) strcat(kbname,"Ctrl+"); // [Ctrl+] [Alt+] [Shift+] key if (Alt) strcat(kbname,"Alt+"); if (Shift) strcat(kbname,"Shift+"); cc = strlen(kbname); kbname[cc] = toupper(key); // x --> X, Ctrl+x --> Ctrl+X kbname[cc+1] = 0; } for (ii = 0; ii < Nreserved; ii++) if (strmatch(kbname,reserved[ii])) break; if (ii < Nreserved) { zmessageACK(Mwin,TX("%s: reserved, cannot be used"),kbname); Ctrl = Alt = 0; return 1; } zdialog_stuff(zd,"shortkey",kbname); // stuff key name into dialog zdialog_stuff(zd,"shortfunc",TX("(no selection)")); // clear menu choice return 1; } // dialog event and completion function int KBshorts_edit_dialog_event(zdialog *zd, ch *event) { using namespace KBshortcutnames; int KBshorts_edit_menufuncs_event(zdialog *zd, ch *event); int KBshorts_CBfunc2(GtkWidget *widget, int line, int pos, ch *input); int ii, jj; GtkWidget *widget; ch shortkey[20]; ch shortfunc[60]; FILE *fid = 0; if (! zd->zstat) return 1; // wait for completion if (zd->zstat == 1) // add shortcut { zd->zstat = 0; // keep dialog active if (Nkbsu2 == maxkbsu) { zmessageACK(Mwin,TX("exceed %d shortcuts"),maxkbsu); return 1; } zdialog_fetch(zd,"shortkey",shortkey,20); // get shortcut key and menu zdialog_fetch(zd,"shortfunc",shortfunc,60); // from dialog widgets if (*shortkey <= ' ' || *shortfunc <= ' ') return 0; for (ii = 0; ii < Nkbsu2; ii++) // find matching shortcut key in list if (strmatch(KBsutab2[ii].key,shortkey)) break; if (ii < Nkbsu2) { // if found, remove from list zfree(KBsutab2[ii].key); zfree(KBsutab2[ii].menu); for (jj = ii; jj < Nkbsu2; jj++) KBsutab2[jj] = KBsutab2[jj+1]; --Nkbsu2; } for (ii = 0; ii < Nkbsu2; ii++) // find matching shortcut func in list if (strmatch(shortfunc,KBsutab2[ii].menu)) break; if (ii < Nkbsu2) { // if found, remove from list zfree(KBsutab2[ii].key); zfree(KBsutab2[ii].menu); for (jj = ii; jj < Nkbsu2; jj++) KBsutab2[jj] = KBsutab2[jj+1]; --Nkbsu2; } for (ii = 0; ii < Nkbsf; ii++) // look up shortcut func in list if (strmatch(shortfunc,KBsftab[ii].menu)) break; // of eligible menu funcs if (ii == Nkbsf) return 1; strncpy0(shortfunc,KBsftab[ii].menu,60); // english menu func ii = Nkbsu2++; // add new shortcut to end of list KBsutab2[ii].key = zstrdup(shortkey,"KB_shortcuts"); KBsutab2[ii].menu = zstrdup(shortfunc,"KB_shortcuts"); widget = zdialog_gtkwidget(zd,"shortlist"); // clear shortcuts list in dialog txwidget_clear(widget); for (ii = 0; ii < Nkbsu2; ii++) // show updated shortcuts in dialog txwidget_append2(widget,0,"%-14s %s \n", KBsutab2[ii].key,TX(KBsutab2[ii].menu)); // 26.0 return 1; } if (zd->zstat == 2) // remove shortcut { zd->zstat = 0; // keep dialog active zdialog_fetch(zd,"shortkey",shortkey,20); // get shortcut key if (*shortkey <= ' ') return 0; for (ii = 0; ii < Nkbsu2; ii++) // find matching shortcut key in list if (strmatch(KBsutab2[ii].key,shortkey)) break; if (ii < Nkbsu2) { // if found, remove from list zfree(KBsutab2[ii].key); zfree(KBsutab2[ii].menu); for (jj = ii; jj < Nkbsu2; jj++) KBsutab2[jj] = KBsutab2[jj+1]; --Nkbsu2; } widget = zdialog_gtkwidget(zd,"shortlist"); // clear shortcuts list in dialog txwidget_clear(widget); for (ii = 0; ii < Nkbsu2; ii++) // show updated shortcuts in dialog txwidget_append2(widget,0,"%-14s %s \n", KBsutab2[ii].key,TX(KBsutab2[ii].menu)); // 26.0 zdialog_stuff(zd,"shortkey",""); // clear entered key and menu zdialog_stuff(zd,"shortfunc",TX("(no selection)")); return 1; } if (zd->zstat == 3) // done - save new shortcut list { zdialog_free(zd); // kill menu funcs list fid = fopen(KB_shortcuts_file,"w"); // update KB shortcuts file if (! fid) { zmessageACK(Mwin,strerror(errno)); return 1; } for (ii = 0; ii < Nkbsu2; ii++) fprintf(fid,"%-14s %s \n",KBsutab2[ii].key,KBsutab2[ii].menu); fclose(fid); KB_shortcuts_load(); // reload shortcuts list from file return 1; } zdialog_free(zd); // cancel return 1; } // Read KB_shortcuts file and load shortcuts table in memory. // Called at fotocx startup time. void KB_shortcuts_load() { using namespace KBshortcutnames; int ii, jj; ch buff[200]; ch *pp1, *pp2; ch *key, *menu; FILE *fid; for (ii = 0; ii < Nkbsu; ii++) { // clear shortcuts data zfree(KBsutab[ii].key); zfree(KBsutab[ii].menu); } Nkbsu = 0; fid = fopen(KB_shortcuts_file,"r"); // read KB shortcuts file if (! fid) return; for (ii = 0; ii < maxkbsu; ) { pp1 = fgets_trim(buff,200,fid,1); // next record if (! pp1) break; if (*pp1 == '#') continue; // comment if (*pp1 <= ' ') continue; // blank pp2 = strchr(pp1,' '); if (! pp2) continue; if (pp2 - pp1 > 20) continue; *pp2 = 0; key = zstrdup(pp1,"KB_shortcuts"); // shortcut key or combination for (jj = 0; jj < Nreserved; jj++) // outlaw reserved shortcut if (strmatchcase(key,reserved[jj])) break; if (jj < Nreserved) { zmessage_post(Mwin,"parent",3,TX("Reserved shortcut ignored: %s"),key); // 26.0 continue; } pp1 = pp2 + 1; while (*pp1 && *pp1 == ' ') pp1++; if (! *pp1) continue; menu = zstrdup(pp1,"KB_shortcuts"); // corresp. menu KBsutab[ii].key = key; // add to shortcuts table KBsutab[ii].menu = zstrdup(menu,"KB_shortcuts"); // keep english ii++; } Nkbsu = ii; fclose(fid); return; } /**************************************************************************************/ // show a brightness histogram graph - live update as image is edited namespace RGB_hist_names { GtkWidget *drawwin_hist, *drawwin_scale; // brightness histogram graph widgets int RGBW[4] = { 1, 1, 1, 0 }; // colors: red/green/blue/white (all) } // menu function void m_RGB_hist(GtkWidget *, ch *menu) // menu function { using namespace RGB_hist_names; void RGB_hist_graph(GtkWidget *drawin, cairo_t *cr, int *rgbw); int show_RGB_hist_dialog_event(zdialog *zd, ch *event); GtkWidget *frhist, *frscale, *widget; zdialog *zd; printf("m_RGB_hist \n"); viewmode('F'); // file view mode if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } if (menu && strmatch(menu,"kill")) { if (zd_RGB_hist) zdialog_free(zd_RGB_hist); zd_RGB_hist = 0; return; } if (zd_RGB_hist) { // dialog already present gtk_widget_queue_draw(drawwin_hist); // refresh drawing windows return; } if (menu) F1_help_topic = TX("RGB HISTOGRAM"); zd = zdialog_new(TX("Brightness Histogram"),Mwin,null); zdialog_add_widget(zd,"frame","frhist","dialog",0,"expand"); // frames for 2 drawing areas zdialog_add_widget(zd,"frame","frscale","dialog"); frhist = zdialog_gtkwidget(zd,"frhist"); frscale = zdialog_gtkwidget(zd,"frscale"); drawwin_hist = gtk_drawing_area_new(); // histogram drawing area gtk_container_add(GTK_CONTAINER(frhist),drawwin_hist); G_SIGNAL(drawwin_hist,"draw",RGB_hist_graph,RGBW); drawwin_scale = gtk_drawing_area_new(); // brightness scale under histogram gtk_container_add(GTK_CONTAINER(frscale),drawwin_scale); gtk_widget_set_size_request(drawwin_scale,300,12); G_SIGNAL(drawwin_scale,"draw",brightness_scale,0); zdialog_add_widget(zd,"hbox","hbcolors","dialog"); zdialog_add_widget(zd,"check","all","hbcolors","All","space=5"); zdialog_add_widget(zd,"check","red","hbcolors","Red","space=5"); zdialog_add_widget(zd,"check","green","hbcolors","Green","space=5"); zdialog_add_widget(zd,"check","blue","hbcolors","Blue","space=5"); zdialog_stuff(zd,"red",RGBW[0]); zdialog_stuff(zd,"green",RGBW[1]); zdialog_stuff(zd,"blue",RGBW[2]); zdialog_stuff(zd,"all",RGBW[3]); zdialog_resize(zd,300,250); zdialog_run(zd,show_RGB_hist_dialog_event,"save"); widget = zdialog_gtkwidget(zd,"dialog"); // stop focus on this window gtk_window_set_accept_focus(GTK_WINDOW(widget),0); zd_RGB_hist = zd; return; } // dialog event and completion function int show_RGB_hist_dialog_event(zdialog *zd, ch *event) { using namespace RGB_hist_names; if (zd->zstat) { zdialog_free(zd); zd_RGB_hist = 0; return 1; } if (zstrstr("all red green blue",event)) { // update chosen colors zdialog_fetch(zd,"red",RGBW[0]); zdialog_fetch(zd,"green",RGBW[1]); zdialog_fetch(zd,"blue",RGBW[2]); zdialog_fetch(zd,"all",RGBW[3]); gtk_widget_queue_draw(drawwin_hist); // refresh drawing window } return 1; } // draw brightness histogram graph in drawing window void RGB_hist_graph(GtkWidget *drawin, cairo_t *cr, int *rgbw) { int bin, Nbins = 256, histogram[256][4]; // bin count, R/G/B/all int px, py, dx, dy; int ww, hh, winww, winhh; int ii, rgb, maxhist, bright; uint8 *pixi; if (! Fpxb) return; if (rgbw[0]+rgbw[1]+rgbw[2]+rgbw[3] == 0) return; winww = gtk_widget_get_allocated_width(drawin); // drawing window size winhh = gtk_widget_get_allocated_height(drawin); for (bin = 0; bin < Nbins; bin++) // clear brightness histogram for (rgb = 0; rgb < 4; rgb++) histogram[bin][rgb] = 0; ww = Fpxb->ww; // image area within window hh = Fpxb->hh; for (ii = 0; ii < ww * hh; ii++) { if (sa_stat == sa_stat_fini && ! sa_pixmap[ii]) continue; // stay within active select area py = ii / ww; // image pixel px = ii - ww * py; dx = Mscale * px - Morgx + Dorgx; // stay within visible window if (dx < 0 || dx > Dww-1) continue; // for zoomed image dy = Mscale * py - Morgy + Dorgy; if (dy < 0 || dy > Dhh-1) continue; pixi = PXBpix(Fpxb,px,py); // use displayed image for (rgb = 0; rgb < 3; rgb++) { // get R/G/B brightness levels bright = pixi[rgb] * Nbins / 256.0; // scale 0 to Nbins-1 if (bright < 0 || bright > 255) { printf("pixel %d/%d: %d %d %d \n",px,py,pixi[0],pixi[1],pixi[2]); return; } ++histogram[bright][rgb]; } bright = (pixi[0] + pixi[1] + pixi[2]) * 0.333 * Nbins / 256.0; // R+G+B, 0 to Nbins-1 ++histogram[bright][3]; } maxhist = 0; for (bin = 1; bin < Nbins-1; bin++) // find max. bin over all RGB for (rgb = 0; rgb < 3; rgb++) // omit bins 0 and last if (histogram[bin][rgb] > maxhist) // which can be huge maxhist = histogram[bin][rgb]; for (rgb = 0; rgb < 4; rgb++) // R/G/B/white (all) { if (! rgbw[rgb]) continue; // color not selected for graph if (rgb == 0) cairo_set_source_rgb(cr,1,0,0); if (rgb == 1) cairo_set_source_rgb(cr,0,1,0); if (rgb == 2) cairo_set_source_rgb(cr,0,0,1); if (rgb == 3) cairo_set_source_rgb(cr,0,0,0); // color "white" = R+G+B uses black line cairo_move_to(cr,0,winhh-1); // start at (0,0) for (px = 0; px < winww; px++) // x from 0 to window width { bin = Nbins * px / winww; // bin = 0-Nbins for x = 0-width py = 0.9 * winhh * histogram[bin][rgb] / maxhist; // height of bin in window py = winhh * sqrt(1.0 * py / winhh); py = winhh - py - 1; cairo_line_to(cr,px,py); // draw line from bin to bin } cairo_stroke(cr); } return; } /**************************************************************************************/ // Paint a horizontal stripe drawing area with a color progressing from // black to white. This represents a brightness scale from 0 to 255. void brightness_scale(GtkWidget *drawarea, cairo_t *cr, int *) { int px, ww, hh; float fbright; ww = gtk_widget_get_allocated_width(drawarea); // drawing area size hh = gtk_widget_get_allocated_height(drawarea); for (px = 0; px < ww; px++) // draw brightness scale { fbright = 1.0 * px / ww; cairo_set_source_rgb(cr,fbright,fbright,fbright); cairo_move_to(cr,px,0); cairo_line_to(cr,px,hh-1); cairo_stroke(cr); } return; } /**************************************************************************************/ // magnify image within a given radius of dragged mouse namespace magnify_names { int magnify_dialog_event(zdialog* zd, ch *event); void magnify_mousefunc(); void magnify_dopixels(int ftf); float Xmag; // magnification, 1 - 5x int Mx, My; // mouse location, image space int Mrad; // mouse radius } // menu function void m_magnify(GtkWidget *, ch *) { using namespace magnify_names; ch *mess = TX("Drag mouse on image. \n" "Left click to cancel."); F1_help_topic = TX("MAGNIFY IMAGE"); printf("m_magnify \n"); /*** __________________________ | Magnify Image | | | | Drag mouse on image. | | Left click to cancel. | | | | radius [_____] | | X-size [_____] | | | | [X] | |__________________________| ***/ if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } viewmode('F'); // file view mode if (zd_magnify) { // toggle magnify mode zdialog_send_event(zd_magnify,"kill"); return; } else { zdialog *zd = zdialog_new(TX("Magnify Image"),Mwin,"X",null); zd_magnify = zd; zdialog_add_widget(zd,"label","labdrag","dialog",mess,"space=5"); zdialog_add_widget(zd,"hbox","hbr","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labr","hbr",TX("Radius"),"space=5"); zdialog_add_widget(zd,"zspin","Mrad","hbr","50|500|10|200"); zdialog_add_widget(zd,"hbox","hbx","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labx","hbx",TX("X-size"),"space=5"); zdialog_add_widget(zd,"zspin","Xmag","hbx","2|10|1|2"); zdialog_fetch(zd,"Mrad",Mrad); // initial mouse radius zdialog_fetch(zd,"Xmag",Xmag); // initial magnification zdialog_resize(zd,200,0); zdialog_load_inputs(zd); // preload prior user inputs zdialog_run(zd,magnify_dialog_event,"save"); // run dialog, parallel zdialog_send_event(zd,"Mrad"); // initializations zdialog_send_event(zd,"Xmag"); } takeMouse(magnify_mousefunc,dragcursor); // connect mouse function return; } // dialog event and completion callback function int magnify_names::magnify_dialog_event(zdialog *zd, ch *event) { using namespace magnify_names; if (strmatch(event,"kill")) zd->zstat = 1; // from slide show if (zd->zstat) { // terminate zd_magnify = 0; zdialog_free(zd); freeMouse(); return 1; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(magnify_mousefunc,dragcursor); if (strmatch(event,"Mrad")) { zdialog_fetch(zd,"Mrad",Mrad); // new mouse radius return 1; } if (strmatch(event,"Xmag")) { zdialog_fetch(zd,"Xmag",Xmag); // new magnification return 1; } return 1; } // pixel paint mouse function void magnify_names::magnify_mousefunc() { using namespace magnify_names; static int ftf = 1; if (! curr_file) return; if (FGM != 'F') return; if (! zd_magnify) return; if (Mxdown) Fpaint2(); // drag start, erase prior if any Mxdown = 0; if (Mxdrag || Mydrag) // drag in progress { Mx = Mxdrag; // save mouse position My = Mydrag; Mxdrag = Mydrag = 0; magnify_dopixels(ftf); // magnify pixels inside mouse gdk_window_set_cursor(Fgdkwin,blankcursor); ftf = 0; } else { if (! ftf) Fpaint2(); // refresh image ftf = 1; gdk_window_set_cursor(Fgdkwin,dragcursor); } return; } // Get pixels from mouse circle within full size image Fpxb, magnify // and move into Mpxb, paint. Mpxb is scaled image for display. void magnify_names::magnify_dopixels(int ftf) { using namespace magnify_names; int Frad; // mouse radius, image space int Fx, Fy, Fww, Fhh; // mouse circle, enclosing box, Fpxb static int pFx, pFy, pFww, pFhh; PIXBUF *pxb1, *pxb2, *pxbx; int ww1, hh1, rs1, ww2, hh2, rs2; uint8 *pixels1, *pixels2, *pix1, *pix2; int nch = Fpxb->nc; int px1, py1, px2, py2; int xlo, xhi, ylo, yhi; int xc, yc, dx, dy; float R2, R2lim; cairo_t *cr; Frad = Mrad / Mscale; // keep magnify circle constant // get box enclosing PRIOR mouse circle, restore those pixels if (! ftf) // continuation of mouse drag { pxb1 = gdk_pixbuf_new_subpixbuf(Fpxb->pixbuf,pFx,pFy,pFww,pFhh); // unmagnified pixels, Fpxb if (! pxb1) return; ww1 = pFww * Mscale; // scale to Mpxb hh1 = pFhh * Mscale; pxbx = gdk_pixbuf_scale_simple(pxb1,ww1,hh1,BILINEAR); g_object_unref(pxb1); pxb1 = pxbx; px1 = pFx * Mscale; // copy into Mpxb py1 = pFy * Mscale; gdk_pixbuf_copy_area(pxb1,0,0,ww1,hh1,Mpxb->pixbuf,px1,py1); g_object_unref(pxb1); } // get box enclosing current mouse circle in Fpxb Fx = Mx - Frad; // mouse circle, enclosing box Fy = My - Frad; // (Fpxb, 1x image) Fww = Fhh = Frad * 2; // clip current mouse box to keep within image if (Fx < 0) { Fww += Fx; Fx = 0; } if (Fy < 0) { Fhh += Fy; Fy = 0; } if (Fx + Fww > Fpxb->ww) Fww = Fpxb->ww - Fx; if (Fy + Fhh > Fpxb->hh) Fhh = Fpxb->hh - Fy; if (Fww <= 0 || Fhh <= 0) return; pFx = Fx; // save this box for next restore pFy = Fy; pFww = Fww; pFhh = Fhh; // scale box for Mpxb, then magnify by Xmag pxb1 = gdk_pixbuf_new_subpixbuf(Fpxb->pixbuf,Fx,Fy,Fww,Fhh); // Fpxb mouse area, 1x if (! pxb1) return; ww1 = Fww * Mscale; hh1 = Fhh * Mscale; pxbx = gdk_pixbuf_scale_simple(pxb1,ww1,hh1,BILINEAR); g_object_unref(pxb1); pxb1 = pxbx; // Mpxb mouse area, Mscale rs1 = gdk_pixbuf_get_rowstride(pxb1); pixels1 = gdk_pixbuf_get_pixels(pxb1); ww2 = ww1 * Xmag; hh2 = hh1 * Xmag; pxb2 = gdk_pixbuf_scale_simple(pxb1,ww2,hh2,BILINEAR); // magnified mouse area rs2 = gdk_pixbuf_get_rowstride(pxb2); pixels2 = gdk_pixbuf_get_pixels(pxb2); // copy magnified pixels within mouse radius only xlo = (ww2 - ww1) / 2; // pxb2 overlap area with pxb1 xhi = ww2 - xlo; ylo = (hh2 - hh1) / 2; yhi = hh2 - ylo; xc = (Mx - Fx) * Mscale; // mouse center in pxb1 yc = (My - Fy) * Mscale; R2lim = Frad * Mscale; // mouse radius in pxb1 for (py2 = ylo; py2 < yhi; py2++) // loop pxb2 pixels for (px2 = xlo; px2 < xhi; px2++) { px1 = px2 - xlo; // corresp. pxb1 pixel py1 = py2 - ylo; if (px1 < 0 || px1 >= ww1) continue; if (py1 < 0 || py1 >= hh1) continue; dx = px1 - xc; dy = py1 - yc; R2 = sqrtf(dx * dx + dy * dy); if (R2 > R2lim) continue; // outside mouse radius pix1 = pixels1 + py1 * rs1 + px1 * nch; pix2 = pixels2 + py2 * rs2 + px2 * nch; memcpy(pix1,pix2,nch); } px1 = Fx * Mscale; // copy into Mpxb py1 = Fy * Mscale; gdk_pixbuf_copy_area(pxb1,0,0,ww1,hh1,Mpxb->pixbuf,px1,py1); g_object_unref(pxb1); g_object_unref(pxb2); cr = draw_context_create(Fgdkwin,draw_context); if (! cr) return; Fpaint4(Fx,Fy,Fww,Fhh,cr); draw_mousecircle(Mx,My,Frad,0,cr); draw_context_destroy(draw_context); return; } /**************************************************************************************/ // Show the last two pixel positions clicked and the distance between. namespace measure_image_names { zdialog *zd; int p1x, p1y, p2x, p2y; int dx, dy, dh; int Npix; } void measure_image_mousefunc(); // menu function void m_measure_image(GtkWidget *, ch *) { using namespace measure_image_names; int measure_image_dialog_event(zdialog *zd, ch *event); ch *mess = TX("Click image to select pixels"); F1_help_topic = TX("MEASURE IMAGE"); printf("m_measure_image \n"); if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } viewmode('F'); // file view mode /*** ______________________________________ | Measure Image | | | | Click image to select pixels | | | | Pixel A: xxxx xxxx B: xxxx xxxx | | Distance X: xxxx Y: xxxx H: xxxx | | | | [X] | |______________________________________| ***/ zd = zdialog_new(TX("Measure Image"),Mwin,"X",null); zdialog_add_widget(zd,"hbox","hbmess","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labmess","hbmess",mess,"space=5"); zdialog_add_widget(zd,"hbox","hbpix","dialog"); zdialog_add_widget(zd,"label","labpix","hbpix","Pixel A: 0000 0000 Pixel B: 0000 0000","space=3"); zdialog_add_widget(zd,"hbox","hbdist","dialog"); zdialog_add_widget(zd,"label","labdist","hbdist","Distance X: 0000 Y: 0000 H: 0000","space=3"); zdialog_run(zd,measure_image_dialog_event,"save"); // run dialog takeMouse(measure_image_mousefunc,dotcursor); // connect mouse function Npix = 0; // no clicked pixel positions yet p1x = p1y = p2x = p2y = 0; dx = dy = dh = 0; return; } // dialog event and completion function int measure_image_dialog_event(zdialog *zd, ch *event) { using namespace measure_image_names; if (zd->zstat) { // any status freeMouse(); // disconnect mouse function zdialog_free(zd); // kill dialog erase_toptext(102); // clear pixel labels Fpaint2(); return 1; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(measure_image_mousefunc,dotcursor); // connect mouse function return 1; } // mouse function void measure_image_mousefunc() { using namespace measure_image_names; ch text[100]; if (! LMclick) return; // left click LMclick = 0; if (Npix == 0) { // first clicked pixel Npix = 1; p1x = Mxclick; p1y = Myclick; add_toptext(102,p1x,p1y,"A","Sans 8"); Fpaint2(); } else if (Npix == 1) { // 2nd clicked pixel Npix = 2; p2x = Mxclick; p2y = Myclick; } else if (Npix == 2) { // next clicked pixel p1x = p2x; // pixel 2 --> pixel 1 p1y = p2y; p2x = Mxclick; // new pixel --> pixel 2 p2y = Myclick; } if (Npix < 2) return; erase_toptext(102); add_toptext(102,p1x,p1y,"A","Sans 8"); add_toptext(102,p2x,p2y,"B","Sans 8"); Fpaint2(); dx = abs(p1x - p2x); dy = abs(p1y - p2y); dh = sqrt(dx*dx + dy*dy) + 0.5; snprintf(text,100,"Pixel A: %d %d Pixel B: %d %d",p1x,p1y,p2x,p2y); zdialog_stuff(zd,"labpix",text); snprintf(text,100,"Distance X: %d Y: %d H: %d",dx,dy,dh); zdialog_stuff(zd,"labdist",text); return; } /**************************************************************************************/ // Show RGB values for 1-9 pixels selected with mouse-clicks. // Additional pixel position tracks active mouse position void show_RGB_mousefunc(); int show_RGB_timefunc(void *); zdialog *RGBSzd; int RGBSpixel[10][2]; // 0-9 clicked pixels + current mouse int RGBSnpix = 0; // no. clicked pixels, 0-9 int RGBSdelta = 0; // abs/delta mode int RGBSlabels = 0; // pixel labels on/off void m_show_RGB(GtkWidget *, ch *) { int show_RGB_event(zdialog *zd, ch *event); ch *mess = TX("Click image to select pixels"); ch *header = " Pixel Red Green Blue"; ch hbx[8] = "hbx", pixx[8] = "pixx"; // last char. is '0' to '9' int ii; F1_help_topic = TX("SHOW RGB"); printf("m_show_RGB \n"); if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } viewmode('F'); // file view mode if (! E0pxm && ! E1pxm && ! E3pxm) { E0pxm = PXM_load(curr_file,1); // never edited if (! E0pxm) return; // get poss. 16-bit file } /*** ____________________________________________ | | | Click image to select pixels | | [x] delta [x] labels | | | | Pixel Red Green Blue | | A NNNNN NNNNN NNN.NN NNN.NN NNN.NN | // pixel coordinates, RGB values 0-255.99 | B NNNNN NNNNN NNN.NN NNN.NN NNN.NN | | C NNNNN NNNNN NNN.NN NNN.NN NNN.NN | | D NNNNN NNNNN NNN.NN NNN.NN NNN.NN | | E NNNNN NNNNN NNN.NN NNN.NN NNN.NN | | F NNNNN NNNNN NNN.NN NNN.NN NNN.NN | | G NNNNN NNNNN NNN.NN NNN.NN NNN.NN | | H NNNNN NNNNN NNN.NN NNN.NN NNN.NN | | I NNNNN NNNNN NNN.NN NNN.NN NNN.NN | | NNNNN NNNNN NNN.NN NNN.NN NNN.NN | | | | [Clear] [X] | |____________________________________________| ***/ RGBSnpix = 0; // no clicked pixels yet RGBSlabels = 0; // no labels yet if (RGBSzd) zdialog_free(RGBSzd); // delete previous if any zdialog *zd = zdialog_new(TX("Show RGB"),Mwin,"Clear","X",null); RGBSzd = zd; zdialog_add_widget(zd,"hbox","hbmess","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labmess","hbmess",mess,"space=5"); zdialog_add_widget(zd,"hbox","hbmym","dialog"); zdialog_add_widget(zd,"check","delta","hbmym","delta","space=8"); zdialog_add_widget(zd,"check","labels","hbmym","labels","space=8"); if (RGBSdelta && E3pxm) zdialog_stuff(zd,"delta",1); zdialog_add_widget(zd,"vbox","vbdat","dialog",0,"space=5"); // vbox for pixel values zdialog_add_widget(zd,"hbox","hbpix","vbdat"); zdialog_add_widget(zd,"label","labheader","hbpix",header); // Pixel Red Green Blue zdialog_labelfont(zd,"labheader","monospace 9",header); for (ii = 0; ii < 10; ii++) { // 10 hbox's with 10 labels hbx[2] = '0' + ii; pixx[3] = '0' + ii; zdialog_add_widget(zd,"hbox",hbx,"vbdat"); zdialog_add_widget(zd,"label",pixx,hbx); } zdialog_run(zd,show_RGB_event,"save"); // run dialog takeMouse(show_RGB_mousefunc,dotcursor); // connect mouse function g_timeout_add(200,show_RGB_timefunc,0); // start timer function, 200 ms return; } // dialog event function int show_RGB_event(zdialog *zd, ch *event) { if (zd->zstat) { if (zd->zstat == 1) { // clear zd->zstat = 0; // keep dialog active RGBSnpix = 0; // clicked pixel count = 0 erase_toptext(102); // erase labels on image } else { // done or kill freeMouse(); // disconnect mouse function zdialog_free(RGBSzd); // kill dialog RGBSzd = 0; erase_toptext(102); } Fpaint2(); return 0; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(show_RGB_mousefunc,dotcursor); // connect mouse function if (strmatch(event,"delta")) { // set absolute/delta mode zdialog_fetch(zd,"delta",RGBSdelta); if (RGBSdelta && ! E3pxm) { RGBSdelta = 0; // block delta mode if no edit underway zdialog_stuff(zd,"delta",0); zmessageACK(Mwin,TX("Edit function must be active")); } } if (strmatch(event,"labels")) // get labels on/off zdialog_fetch(zd,"labels",RGBSlabels); return 0; } // mouse function // fill table positions 0-8 with last clicked pixel positions and RGB data // next table position tracks current mouse position and RGB data void show_RGB_mousefunc() // mouse function { int ii; PXM *pxm; if (E3pxm) pxm = E3pxm; // report image being edited else if (E1pxm) pxm = E1pxm; else if (E0pxm) pxm = E0pxm; else return; // must have E0/E1/E3 if (Mxposn <= 0 || Mxposn >= pxm->ww-1) return; // mouse outside image, ignore if (Myposn <= 0 || Myposn >= pxm->hh-1) return; if (LMclick) // left click, add labeled position { LMclick = 0; if (RGBSnpix == 9) { // if all 9 labeled positions filled, for (ii = 1; ii < 9; ii++) { // remove first (oldest) and RGBSpixel[ii-1][0] = RGBSpixel[ii][0]; // push the rest back RGBSpixel[ii-1][1] = RGBSpixel[ii][1]; } RGBSnpix = 8; // position for newest clicked pixel } ii = RGBSnpix; // labeled position to fill, 0-8 RGBSpixel[ii][0] = Mxclick; // save newest pixel RGBSpixel[ii][1] = Myclick; RGBSnpix++; // count is 1-9 } ii = RGBSnpix; // fill last position from active mouse RGBSpixel[ii][0] = Mxposn; RGBSpixel[ii][1] = Myposn; return; } // timer function // display RGB values for last 0-9 clicked pixels and current mouse position int show_RGB_timefunc(void *arg) { ch label[9][4] = { " A ", " B ", " C ", " D ", " E ", // labels A-I for last 0-9 clicked pixels " F ", " G ", " H ", " I " }; PXM *pxm = 0; int ii, jj, px, py; int ww, hh; float red3, green3, blue3; float *ppixa, *ppixb; ch text[100], pixx[8] = "pixx"; static float priorvals[10][3]; // remembers prior pixel values if (! RGBSzd) return 0; // user quit, cancel timer if (! curr_file) return 0; if (! E0pxm && ! E1pxm && ! E3pxm) { E0pxm = PXM_load(curr_file,1); if (! E0pxm) return 0; // get poss. 16-bit file } if (E3pxm) pxm = E3pxm; // report image being edited else if (E1pxm) pxm = E1pxm; else if (E0pxm) pxm = E0pxm; else return 0; if (RGBSdelta && ! E3pxm) { RGBSdelta = 0; // delta mode only if edit active zdialog_stuff(RGBSzd,"delta",RGBSdelta); // update dialog } ww = pxm->ww; hh = pxm->hh; for (ii = 0; ii < RGBSnpix; ii++) // 0-9 clicked pixels { px = RGBSpixel[ii][0]; // next pixel to report py = RGBSpixel[ii][1]; if (px >= 0 && px < ww && py >= 0 && py < hh) continue; // within image limits for (jj = ii+1; jj < RGBSnpix + 1; jj++) { RGBSpixel[jj-1][0] = RGBSpixel[jj][0]; // remove pixel outside limits RGBSpixel[jj-1][1] = RGBSpixel[jj][1]; // and pack the remaining down } // include last+1 = curr. mouse position ii--; RGBSnpix--; } erase_toptext(102); if (RGBSlabels) { for (ii = 0; ii < RGBSnpix; ii++) { // show pixel labels on image px = RGBSpixel[ii][0]; py = RGBSpixel[ii][1]; add_toptext(102,px,py,label[ii],"Sans 8"); } } for (ii = 0; ii < 10; ii++) // loop positions 0 to 9 { pixx[3] = '0' + ii; // widget names "pix0" ... "pix9" if (ii > RGBSnpix) { // no pixel there yet zdialog_stuff(RGBSzd,pixx,""); // blank report line continue; } px = RGBSpixel[ii][0]; // next pixel to report py = RGBSpixel[ii][1]; if (px >= ww || py >= hh) continue; // PXM may have changed ppixa = PXMpix(pxm,px,py); // get pixel RGB values red3 = ppixa[0]; green3 = ppixa[1]; blue3 = ppixa[2]; if (RGBSdelta) { // delta RGB for edited image ppixb = PXMpix(E1pxm,px,py); // "before" image E1 red3 -= ppixb[0]; green3 -= ppixb[1]; blue3 -= ppixb[2]; } if (ii == RGBSnpix) // last table position snprintf(text,100," %5d %5d ",px,py); // mouse pixel, format " xxxx yyyy" else snprintf(text,100," %c %5d %5d ",'A'+ii,px,py); // clicked pixel, format " A xxxx yyyy" snprintf(text+14,86," %6.2f %6.2f %6.2f ",red3,green3,blue3); zdialog_labelfont(RGBSzd,pixx,"monospace 9",text); } for (ii = 0; ii < RGBSnpix; ii++) // paint only when pixels change { px = RGBSpixel[ii][0]; // next pixel to report py = RGBSpixel[ii][1]; if (px >= ww || py >= hh) continue; // PXM may have changed ppixa = PXMpix(pxm,px,py); // get pixel RGB values if (ppixa[0] != priorvals[ii][0]) break; if (ppixa[1] != priorvals[ii][1]) break; if (ppixa[2] != priorvals[ii][2]) break; } if (ii < RGBSnpix) Fpaint2(); for (ii = 0; ii < RGBSnpix; ii++) // record pixels for change detection { px = RGBSpixel[ii][0]; // next pixel to report py = RGBSpixel[ii][1]; if (px >= ww || py >= hh) continue; // PXM may have changed ppixa = PXMpix(pxm,px,py); // get pixel RGB values priorvals[ii][0] = ppixa[0]; priorvals[ii][1] = ppixa[1]; priorvals[ii][2] = ppixa[2]; } return 1; } /**************************************************************************************/ // setup x and y grid lines - count/spacing, enable/disable, offsets void m_grid_settings(GtkWidget *widget, ch *menu) { int grid_settings_dialog_event(zdialog *zd, ch *event); zdialog *zd; F1_help_topic = TX("GRID SETTINGS"); printf("m_grid_settings \n"); viewmode('F'); // file view mode /*** ____________________________________________ | Grid Settings | | | | x-count [____] y-count [____] | | | | x-offset =================[]============= | | y-offset ==============[]================ | | | | [Recent] [OK] | // 25.1 |____________________________________________| ***/ zd = zdialog_new(TX("Grid Settings"),Mwin,"Recent","OK",null); zdialog_add_widget(zd,"hbox","hb0","dialog",0,"space=10"); zdialog_add_widget(zd,"label","labx","hb0",TX("x-count"),"space=7"); zdialog_add_widget(zd,"zspin","countx","hb0","0|100|1|2","space=4"); zdialog_add_widget(zd,"label","space","hb0",0,"space=8"); zdialog_add_widget(zd,"label","laby","hb0",TX("y-count")); zdialog_add_widget(zd,"zspin","county","hb0","0|100|1|2","space=4"); zdialog_add_widget(zd,"hbox","hboffx","dialog"); zdialog_add_widget(zd,"label","lab3x","hboffx",TX("x-offset"),"space=7"); zdialog_add_widget(zd,"hscale","offsetx","hboffx","0|100|1|0","expand|space=4"); zdialog_add_widget(zd,"hbox","hboffy","dialog"); zdialog_add_widget(zd,"label","lab3y","hboffy",TX("y-offset"),"space=7"); zdialog_add_widget(zd,"hscale","offsety","hboffy","0|100|1|0","expand|space=4"); zdialog_stuff(zd,"countx",gridsettings[GXC]); zdialog_stuff(zd,"county",gridsettings[GYC]); zdialog_stuff(zd,"offsetx",gridsettings[GXF]); zdialog_stuff(zd,"offsety",gridsettings[GYF]); zdialog_set_modal(zd); zdialog_run(zd,grid_settings_dialog_event,"parent"); zdialog_wait(zd); zdialog_free(zd); return; } // dialog event function int grid_settings_dialog_event(zdialog *zd, ch *event) { static zlist_t *picklist = 0; ch *gridchoice, newchoice[20]; int countx, county, nn, err; countx = gridsettings[GXC]; // current grid settings county = gridsettings[GYC]; if (countx < 0 || countx > 100) countx = 0; if (county < 0 || county > 100) county = 0; if (! picklist) picklist = zlist_from_file(grid_picklist_file); // get grid picklist from file if (! picklist) { picklist = zlist_new(0); // make default picklist zlist_put(picklist,"1 x 1",0); // with two entries zlist_put(picklist,"2 x 2",1); err = zlist_to_file(picklist,grid_picklist_file); if (err) { zmessageACK(Mwin,TX("grid picklist file error: %s"),strerror); picklist = 0; } return 1; } if (zd->zstat == 1) // [Recent] { zd->zstat = 0; // keep dialog active if (! picklist) return 1; gridchoice = popup_choose(picklist); // get choice, "NN x NN" if (! gridchoice) return 1; countx = county = -1; sscanf(gridchoice,"%d x %d ",&countx,&county); if (countx < 0 || countx > 100 || county < 0 || county > 100) { zmessageACK(Mwin,TX("grid counts not 0-100: %s"),gridchoice); return 1; } gridsettings[GXC] = countx; // set grids gridsettings[GYC] = county; gridsettings[GON] = 1; zdialog_stuff(zd,"countx",countx); zdialog_stuff(zd,"county",county); Fpaint2(); return 1; } if (zd->zstat == 2) // [OK] { if (countx || county) gridsettings[GON] = 1; else gridsettings[GON] = 0; Fpaint2(); if (picklist) { snprintf(newchoice,20,"%d x %d",countx,county); // new picklist entry N x N nn = zlist_find(picklist,newchoice,0); // if entry already present, if (nn >= 0) zlist_remove(picklist,nn); // remove it zlist_prepend(picklist,newchoice,0); // prepend newest entry zlist_to_file(picklist,grid_picklist_file); // update grid_picklist file } return 1; } if (zd->zstat) return 1; // cancel if (strmatch(event,"countx")) // x/y grid line counts zdialog_fetch(zd,"countx",gridsettings[GXC]); if (strmatch(event,"county")) zdialog_fetch(zd,"county",gridsettings[GYC]); if (strmatch(event,"offsetx")) // x/y grid starting offsets zdialog_fetch(zd,"offsetx",gridsettings[GXF]); if (strmatch(event,"offsety")) zdialog_fetch(zd,"offsety",gridsettings[GYF]); if (gridsettings[GXC] || gridsettings[GYC]) // if either grid enabled, show grid gridsettings[GON] = 1; Fpaint2(); return 1; } // toggle grid lines on and off void m_toggle_grid(GtkWidget *, ch *menu) { F1_help_topic = TX("GRID SETTINGS"); printf("m_toggle_grid \n"); gridsettings[GON] = 1 - gridsettings[GON]; Fpaint2(); return; } /**************************************************************************************/ // choose color for foreground lines // (area outline, mouse circle) void m_line_color(GtkWidget *, ch *menu) { int line_color_dialog_event(zdialog *zd, ch *event); zdialog *zd; F1_help_topic = TX("LINE COLOR"); printf("m_line_color \n"); viewmode('F'); // file view mode zd = zdialog_new(TX("Line Color"),Mwin,null); zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"radio","Black","hb1",TX("Black"),"space=3"); // add radio button per color zdialog_add_widget(zd,"radio","White","hb1",TX("White"),"space=3"); zdialog_add_widget(zd,"radio","Red","hb1",TX("Red"),"space=3"); zdialog_add_widget(zd,"radio","Green","hb1",TX("Green"),"space=3"); zdialog_stuff(zd,"Black",0); // all are initially off zdialog_stuff(zd,"White",0); zdialog_stuff(zd,"Red",0); zdialog_stuff(zd,"Green",0); if (LINE_COLOR[0] == BLACK[0] && LINE_COLOR[1] == BLACK[1] && LINE_COLOR[2] == BLACK[2]) zdialog_stuff(zd,"Black",1); if (LINE_COLOR[0] == WHITE[0] && LINE_COLOR[1] == WHITE[1] && LINE_COLOR[2] == WHITE[2]) zdialog_stuff(zd,"White",1); if (LINE_COLOR[0] == RED[0] && LINE_COLOR[1] == RED[1] && LINE_COLOR[2] == RED[2]) zdialog_stuff(zd,"Red",1); if (LINE_COLOR[0] == GREEN[0] && LINE_COLOR[1] == GREEN[1] && LINE_COLOR[2] == GREEN[2]) zdialog_stuff(zd,"Green",1); zdialog_run(zd,line_color_dialog_event,"save"); // run dialog, parallel return; } // dialog event and completion function int line_color_dialog_event(zdialog *zd, ch *event) { if (strmatch(event,"Black")) memcpy(LINE_COLOR,BLACK,3*sizeof(int)); // set selected color if (strmatch(event,"White")) memcpy(LINE_COLOR,WHITE,3*sizeof(int)); if (strmatch(event,"Red")) memcpy(LINE_COLOR,RED,3*sizeof(int)); if (strmatch(event,"Green")) memcpy(LINE_COLOR,GREEN,3*sizeof(int)); if (CEF && CEF->zd) zdialog_send_event(CEF->zd,"line_color"); Fpaint2(); if (zd->zstat) zdialog_free(zd); // [x] button return 1; } /**************************************************************************************/ // dark-brite menu function // highlight darkest and brightest pixels by blinking them namespace darkbrite { float darklim = 0; float brightlim = 255; int flip; } void m_darkbrite(GtkWidget *, ch *) { using namespace darkbrite; int darkbrite_dialog_event(zdialog* zd, ch *event); F1_help_topic = TX("DARK/BRIGHT PIXELS"); printf("m_darkbrite \n"); if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } viewmode('F'); // file view mode /*** _______________________ | Dark/Bright Pixels | | | | Dark Limit [ 40] | | Bright Limit [160] | | | | [X] | |_______________________| ***/ zdialog *zd = zdialog_new(TX("Dark/Bright Pixels"),Mwin,"X",null); // darkbrite dialog zdialog_add_widget(zd,"hbox","hbD","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labD","hbD",TX("Dark Limit"),"space=3"); zdialog_add_widget(zd,"zspin","limD","hbD","0|255|1|0"); zdialog_add_widget(zd,"hbox","hbB","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labB","hbB",TX("Bright Limit"),"space=3"); zdialog_add_widget(zd,"zspin","limB","hbB","0|255|1|0"); zdialog_stuff(zd,"limD",darklim); // start with prior values zdialog_stuff(zd,"limB",brightlim); zdialog_resize(zd,300,0); zdialog_run(zd,darkbrite_dialog_event,"save"); // run dialog - parallel zd_darkbrite = zd; // global pointer for Fpaint() while (true) { if (zd->zstat) break; // dark/bright pixel blink flip = 0; Fpaint2(); zmainsleep(0.5); // time pixels have image color flip = 1; Fpaint2(); zmainsleep(0.1); // time pixels have blink color } zdialog_free(zd); zd_darkbrite = 0; Fpaint2(); return; } // darkbrite dialog event and completion function int darkbrite_dialog_event(zdialog *zd, ch *event) // set dark and bright limits { using namespace darkbrite; if (strmatch(event,"limD")) zdialog_fetch(zd,"limD",darklim); if (strmatch(event,"limB")) zdialog_fetch(zd,"limB",brightlim); return 0; } // this function called by Fpaint() if zd_darkbrite dialog active void darkbrite_paint() { using namespace darkbrite; int px, py; uint8 *pix; float P, D = darklim, B = brightlim; if (flip == 0) return; // show true pixels for (py = 0; py < Mpxb->hh; py++) // blink dark and bright pixels for (px = 0; px < Mpxb->ww; px++) { pix = PXBpix(Mpxb,px,py); P = PIXBRIGHT(pix); if (P < D) pix[0] = pix[1] = pix[2] = 255; // dark pixel >> white else if (P > B) pix[0] = pix[1] = pix[2] = 0; // bright pixel >> black } return; } /**************************************************************************************/ // monitor color and contrast test function void m_monitor_color(GtkWidget *, ch *) { ch file[200]; int err; ch *savecurrfile = 0; ch *savegallery = 0; zdialog *zd; ch *message = TX("Brightness should show a gradual ramp \n" "extending all the way to the edges."); F1_help_topic = TX("MONITOR COLOR"); printf("m_monitor_color \n"); if (curr_file) savecurrfile = zstrdup(curr_file,"monitor-color"); // save view mode if (navi::galleryname) savegallery = zstrdup(navi::galleryname,"monitor-color"); viewmode('F'); // set file view mode snprintf(file,200,"%s/moncolor.png",get_zimagedir()); // color chart file err = f_open(file); if (err) goto restore; Fzoom = 1; gtk_window_set_title(MWIN,TX("Monitor Color")); zd = zdialog_new("monitor color",Mwin,"X",null); // start user dialog if (message) { zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=5"); zdialog_add_widget(zd,"label","lab1","hb1",message,"space=5"); } zdialog_resize(zd,300,0); zdialog_set_modal(zd); zdialog_run(zd,0,"0/0"); zdialog_wait(zd); // wait for dialog complete zdialog_free(zd); restore: Fzoom = 0; if (savecurrfile) { f_open(savecurrfile); zfree(savecurrfile); } if (savegallery) { gallery(savegallery,"init",0); gallery(0,"sort",-2); // recall sort and position zfree(savegallery); } else gallery(topfolders[0],"init",0); return; } /**************************************************************************************/ // find all duplicated files and create corresponding gallery of duplicates namespace duplicates_names { int thumbsize; int Nfiles; ch **files; int Fallfiles, Fgallery; } // menu function void m_duplicates(GtkWidget *, ch *) { using namespace duplicates_names; int duplicates_dialog_event(zdialog *zd, ch *event); void duplicates_randomize(); PIXBUF *pxb; GError *gerror; uint8 *pixels, *pix1; uint8 *pixelsii, *pixelsjj, *pixii, *pixjj; FILE *fid = 0; zdialog *zd; int Ndups = 0; // image file and duplicate counts int thumbsize, pixdiff, pixcount; int zstat, ii, jj, kk, cc, err, ndup; int ww, hh, rs, px, py; int trgb, diff, sumdiff; int percent; ch text[100], *pp; ch tempfile[200], albumfile[200]; typedef struct // thumbnail data { int trgb; // mean RGB sum int ww, hh, rs; // pixel dimensions ch *file; // file name uint8 *pixels; // image pixels } thumbdat_t; thumbdat_t **thumbdat = 0; F1_help_topic = TX("FIND DUPLICATES"); printf("m_duplicates \n"); if (Xindexlev < 1) { index_rebuild(1,0); // 25.1 if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } viewmode('G'); // gallery view mode free_resources(); // duplicates_randomize(); 1-shot test function /*** _______________________________________________ | Find Duplicate Images | | | | (o) All files (o) Current gallery | | File count: nnnn | | | | thumbnail size [ 64 ] [calculate] | | pixel difference [ 2 ] pixel count [ 2 ] | | | | Thumbnails: nnnnnn nn% Duplicates: nnn nn% | | | | /topfolder/subfolder1/subfolder2/... | | imagefile.jpg | | | | [Proceed] [X] | |_______________________________________________| ***/ zd = zdialog_new(TX("Find Duplicate Images"),Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbwhere","dialog",0,"space=5"); zdialog_add_widget(zd,"radio","allfiles","hbwhere",TX("All files"),"space=3"); zdialog_add_widget(zd,"radio","gallery","hbwhere",TX("Current gallery"),"space=8"); zdialog_add_widget(zd,"hbox","hbfiles","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labfiles","hbfiles",TX("File count:"),"space=3"); zdialog_add_widget(zd,"label","filecount","hbfiles","0"); zdialog_add_widget(zd,"hbox","hbthumb","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labthumb","hbthumb",TX("Thumbnail size"),"space=3"); zdialog_add_widget(zd,"zspin","thumbsize","hbthumb","32|512|16|256","space=3"); zdialog_add_widget(zd,"zbutton","calculate","hbthumb",TX("Calculate"),"space=5"); zdialog_add_widget(zd,"hbox","hbdiff","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labdiff","hbdiff",TX("Pixel difference"),"space=3"); zdialog_add_widget(zd,"zspin","pixdiff","hbdiff","1|20|1|1","space=3"); zdialog_add_widget(zd,"label","space","hbdiff",0,"space=8"); zdialog_add_widget(zd,"label","labsum","hbdiff",TX("Pixel count"),"space=3"); zdialog_add_widget(zd,"zspin","pixcount","hbdiff","1|999|1|1","space=3"); zdialog_add_widget(zd,"hbox","hbstats","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labthumbs1","hbstats",TX("Thumbnails:"),"space=3"); zdialog_add_widget(zd,"label","thumbs","hbstats","0"); zdialog_add_widget(zd,"label","Tpct","hbstats","0%","space=3"); zdialog_add_widget(zd,"label","space","hbstats",0,"space=5"); zdialog_add_widget(zd,"label","labdups1","hbstats",TX("Duplicates:"),"space=3"); zdialog_add_widget(zd,"label","dups","hbstats","0"); zdialog_add_widget(zd,"label","Dpct","hbstats","0%","space=3"); zdialog_add_widget(zd,"hbox","hbfolder","dialog",0,"space=3"); zdialog_add_widget(zd,"label","currfolder","hbfolder"," ","space=8"); zdialog_add_widget(zd,"hbox","hbfile","dialog"); zdialog_add_widget(zd,"label","currfile","hbfile"," ","space=8"); zdialog_stuff(zd,"allfiles",1); // default all files Fallfiles = 1; files = (ch **) zmalloc(maximages * sizeof(ch *),"duplicates"); for (ii = jj = 0; ii < Nxxrec; ii++) // count all files { pp = xxrec_tab[ii]->file; pp = image2thumbfile(pp); // omit those without a thumbnail if (! pp) continue; files[jj++] = pp; } Nfiles = jj; snprintf(text,20,"%d",Nfiles); // file count >> dialog zdialog_stuff(zd,"filecount",text); zdialog_run(zd,duplicates_dialog_event,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for user inputs if (zstat != 1) goto cleanup; // canceled if (Nfiles < 2) { zmessageACK(Mwin,TX("<2 images")); goto cleanup; } zdialog_fetch(zd,"thumbsize",thumbsize); // thumbnail size to use zdialog_fetch(zd,"pixdiff",pixdiff); // pixel difference threshold zdialog_fetch(zd,"pixcount",pixcount); // pixel count threshold cc = Nfiles * sizeof(thumbdat_t); // allocate memory for thumbnail data thumbdat = (thumbdat_t **) zmalloc(cc,"duplicates"); Fbusy(+1); Fescape = 0; for (ii = 0; ii < Nfiles; ii++) // screen out thumbnails not { // matching an image file pp = thumb2imagefile(files[ii]); if (pp) zfree(pp); else { zfree(files[ii]); files[ii] = 0; } } for (ii = 0; ii < Nfiles; ii++) // read thumbnails into memory { if (Fescape) goto cleanup; if (! files[ii]) continue; thumbdat[ii] = (thumbdat_t *) zmalloc(sizeof(thumbdat_t),"duplicates"); thumbdat[ii]->file = files[ii]; // thumbnail file files[ii] = 0; kk = thumbsize; gerror = 0; // read thumbnail >> pixbuf pxb = gdk_pixbuf_new_from_file_at_size(thumbdat[ii]->file,kk,kk,&gerror); if (! pxb) { printf("*** file: %s \n %s",thumbdat[ii]->file,gerror->message); zfree(thumbdat[ii]->file); zfree(thumbdat[ii]); thumbdat[ii] = 0; continue; } ww = gdk_pixbuf_get_width(pxb); // pixbuf dimensions hh = gdk_pixbuf_get_height(pxb); rs = gdk_pixbuf_get_rowstride(pxb); pixels = gdk_pixbuf_get_pixels(pxb); thumbdat[ii]->ww = ww; // thumbnail dimensions thumbdat[ii]->hh = hh; thumbdat[ii]->rs = rs; cc = rs * hh; thumbdat[ii]->pixels = (uint8 *) zmalloc(cc,"duplicates"); memcpy(thumbdat[ii]->pixels,pixels,cc); // thumbnail pixels trgb = 0; // compute mean RGB sum for (py = 0; py < hh; py++) for (px = 0; px < ww; px++) { pix1 = pixels + py * rs + px * 3; trgb += pix1[0] + pix1[1] + pix1[2]; } thumbdat[ii]->trgb = trgb / ww / hh; // thumbnail mean RGB sum g_object_unref(pxb); snprintf(text,100,"%d",ii); // stuff thumbs read into dialog zdialog_stuff(zd,"thumbs",text); percent = 100.0 * ii / Nfiles; // and percent read snprintf(text,20,"%02d %c",percent,'%'); zdialog_stuff(zd,"Tpct",text); zmainloop(); // keep GTK alive } for (ii = jj = 0; ii < Nfiles; ii++) // remove empty members of thumbdat[] if (thumbdat[ii]) thumbdat[jj++] = thumbdat[ii]; Nfiles = jj; // new count for (ii = 0; ii < Nfiles; ii++) // replace thumbnail filespecs { // with corresp. image filespecs if (! thumbdat[ii]) continue; pp = thumb2imagefile(thumbdat[ii]->file); zfree(thumbdat[ii]->file); thumbdat[ii]->file = pp; } snprintf(tempfile,200,"%s/duplicate_images",temp_folder); // open file for gallery output fid = fopen(tempfile,"w"); if (! fid) goto filerror; Ndups = 0; // total duplicates for (ii = 0; ii < Nfiles; ii++) // loop all thumbnails ii { zmainloop(); if (Fescape) goto cleanup; percent = 100.0 * (ii+1) / Nfiles; // show percent processed snprintf(text,20,"%02d %c",percent,'%'); zdialog_stuff(zd,"Dpct",text); if (! thumbdat[ii]) continue; // removed from list pp = strrchr(thumbdat[ii]->file,'/'); if (! pp) continue; *pp = 0; zdialog_stuff(zd,"currfolder",thumbdat[ii]->file); // update folder and file zdialog_stuff(zd,"currfile",pp+1); // in dialog *pp = '/'; trgb = thumbdat[ii]->trgb; ww = thumbdat[ii]->ww; hh = thumbdat[ii]->hh; rs = thumbdat[ii]->rs; pixelsii = thumbdat[ii]->pixels; ndup = 0; // file duplicates for (jj = ii+1; jj < Nfiles; jj++) // loop all thumbnails jj { if (! thumbdat[jj]) continue; // removed from list if (abs(trgb - thumbdat[jj]->trgb) > 1) continue; // brightness not matching if (ww != thumbdat[jj]->ww) continue; // size not matching if (hh != thumbdat[jj]->hh) continue; pixelsjj = thumbdat[jj]->pixels; sumdiff = 0; for (py = 0; py < hh; py++) for (px = 0; px < ww; px++) { pixii = pixelsii + py * rs + px * 3; pixjj = pixelsjj + py * rs + px * 3; diff = abs(pixii[0] - pixjj[0]) + abs(pixii[1] - pixjj[1]) + abs(pixii[2] - pixjj[2]); if (diff < pixdiff) continue; // pixels match within threshold sumdiff++; // count unmatched pixels if (sumdiff >= pixcount) { // if over threshold, py = hh; px = ww; } // break out both loops } if (sumdiff >= pixcount) continue; // thumbnails not matching if (ndup == 0) { fprintf(fid,"%s\n",thumbdat[ii]->file); // first duplicate, output file name ndup++; Ndups++; } fprintf(fid,"%s\n",thumbdat[jj]->file); // output duplicate image file name zfree(thumbdat[jj]->file); // remove from list zfree(thumbdat[jj]->pixels); zfree(thumbdat[jj]); thumbdat[jj] = 0; ndup++; Ndups++; snprintf(text,100,"%d",Ndups); // update total duplicates found zdialog_stuff(zd,"dups",text); zmainloop(); } } fclose(fid); fid = 0; if (Ndups == 0) { zmessageACK(Mwin,TX("0 duplicates")); goto cleanup; } navi::gallerytype = SEARCH; // generate gallery of duplicate images gallery(tempfile,"initF",0); gallery(0,"paint",0); // position at top viewmode('G'); snprintf(albumfile,200,"%s/duplicate_images",albums_folder); // save search results in album err = cp_copy(tempfile,albumfile); // "duplicate_images" if (err) zmessageACK(Mwin,strerror(err)); cleanup: zdialog_free(zd); if (fid) fclose(fid); fid = 0; if (files) { for (ii = 0; ii < Nfiles; ii++) if (files[ii]) zfree(files[ii]); zfree(files); } if (thumbdat) { for (ii = 0; ii < Nfiles; ii++) { if (! thumbdat[ii]) continue; zfree(thumbdat[ii]->file); zfree(thumbdat[ii]->pixels); zfree(thumbdat[ii]); } zfree(thumbdat); } Fbusy(-1); Fescape = 0; return; filerror: zmessageACK(Mwin,TX("file error: %s"),strerror(errno)); goto cleanup; } // dialog event and completion function int duplicates_dialog_event(zdialog *zd, ch *event) { using namespace duplicates_names; double freemem, reqmem; ch text[20], *pp; int nn, ii, jj; if (strmatch(event,"allfiles")) { zdialog_fetch(zd,"allfiles",nn); Fallfiles = nn; if (! Fallfiles) return 1; for (ii = jj = 0; ii < Nxxrec; ii++) // count all files { pp = xxrec_tab[ii]->file; pp = image2thumbfile(pp); // omit those without thumbnail if (! pp) continue; files[jj++] = pp; } Nfiles = jj; snprintf(text,20,"%d",Nfiles); // file count >> dialog zdialog_stuff(zd,"filecount",text); return 1; } if (strmatch(event,"gallery")) { zdialog_fetch(zd,"gallery",nn); Fgallery = nn; if (! Fgallery) return 1; for (ii = jj = 0; ii < navi::Gfiles; ii++) // scan current gallery { if (navi::Gindex[ii].folder) continue; // skip folders pp = navi::Gindex[ii].file; pp = image2thumbfile(pp); // get corresp. thumbnail file if (! pp) continue; files[jj++] = pp; // save thumbnail } Nfiles = jj; snprintf(text,20,"%d",Nfiles); // file count >> dialog zdialog_stuff(zd,"filecount",text); return 1; } if (strmatch(event,"calculate")) // calculate thumbnail size { zd->zstat = 0; // keep dialog active freemem = availmemory() - 1000; // free memory, MB for (thumbsize = 32; thumbsize <= 512; thumbsize += 8) { // find largest thumbnail size reqmem = 0.8 * thumbsize * thumbsize * 3 * Nfiles; // that probably works reqmem = reqmem / MEGA; if (reqmem > freemem) break; } thumbsize -= 8; // biggest size that fits if (thumbsize < 32) { zmessageACK(Mwin,TX("too many files, cannot continue")); return 1; } zdialog_stuff(zd,"thumbsize",thumbsize); // stuff into dialog return 1; } if (! zd->zstat) return 1; // wait for user input if (zd->zstat != 1) Fescape = 1; // cancel return 1; // proceed } // Make small random changes to all images. // Used for testing and benchmarking Find Duplicates. void duplicates_randomize() { using namespace duplicates_names; ch *file; int px, py; int ii, jj, kk; float *pixel; for (ii = 0; ii < Nxxrec; ii++) // loop all files { if (drandz() > 0.95) continue; // leave 5% duplicates zmainloop(); // keep GTK alive file = zstrdup(xxrec_tab[ii]->file,"duplicates"); if (! file) continue; printf(" %d %s \n",ii,file); // log progress f_open(file); // open and read file E0pxm = PXM_load(file,1); if (! E0pxm) continue; jj = 2 + 49 * drandz(); // random 2-50 pixels for (kk = 0; kk < jj; kk++) { px = E0pxm->ww * drandz(); // random pixel py = E0pxm->hh * drandz(); pixel = PXMpix(E0pxm,px,py); pixel[0] = pixel[1] = pixel[2] = 0; // RGB = black } f_save(file,"jpg",8,0,1); // write file PXM_free(E0pxm); zfree(file); } return; } /**************************************************************************************/ // find all image files within top folders void m_find_bad_files(GtkWidget *, ch *) // 26.8 { void fix_bad_file(ch *file); ch *file, **flist = 0; int err, ii, jj, NF; int Ndone = 0; PXB *pxb; FTYPE ftype; printf("m_find_bad_files \n"); F1_help_topic = TX("FIND BAD FILES"); if (Fblock("find bad files")) return; zmessage_post(Mwin,"parent",3,TX("Searching - use ESC key to terminate")); Fbusy(+1); for (ii = 0; ii < Ntopfolders; ii++) // loop top folders { printf("\n --- folder --- %s \n\n",topfolders[ii]); flist = 0; err = find_imagefiles(topfolders[ii],1+16+32,flist,NF); // find all image files in top folder if (err) { zmessageACK(Mwin,TX("find_imagefiles() failure: %s \n"),topfolders[ii]); continue; } for (jj = 0; jj < NF; jj++) // read all image files { file = flist[jj]; ftype = image_file_type(file); if (ftype == IMAGE) { pxb = PXB_load(file,0); if (! pxb) fix_bad_file(file); else PXB_free(pxb); } snprintf(paneltext,20,"files: %d",Ndone++); if (Fescape) break; } for (jj = 0; jj < NF; jj++) zfree(flist[jj]); // free file list if (flist) zfree(flist); flist = 0; if (Fescape) break; } Fbusy(-1); Fblock(0); Fescape = 0; *paneltext = 0; return; } void fix_bad_file(ch *file) { FILE *fid; STATB statB; zdialog *zd; ch command[300], status[400]; ch *pp, *ftype, *newfile; int zstat, cc, err; static int Fdelete = 0, Ffixtype = 0, Fmove = 0; static ch *newfolder1 = 0, *newfolder2 = 0; snprintf(command,300,"file \"%s\" ",file); fid = popen(command,"r"); if (! fid) strncpy0(status,TX("cannot be determined"),300); else { pp = fgets_trim(status,400,fid); if (! pp) strncpy0(status,TX("cannot be determined"),400); pclose(fid); } cc = strlen(file); // remove file name from status if (strmatchN(file,status,cc)) // (assume format "filename: status") strncpy0(status,status+cc+2,400); /*** _________________________________________ | Fix Bad File | | | | File: [_______________________________] | | Status: [_____________________________] | | | | (0) delete (0) fix type (0) move | | | | [OK] [X] | |_________________________________________| ***/ zd = zdialog_new(TX("Fix Bad File"),Mwin,"OK","X",null); zdialog_add_widget(zd,"hbox","hbfile","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labfile","hbfile","File:","space=3"); zdialog_add_widget(zd,"zentry","file","hbfile",0,"expand|space=3"); zdialog_add_widget(zd,"hbox","hbstat","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labstat","hbstat","Status:","space=3"); zdialog_add_widget(zd,"zentry","status","hbstat",0,"expand|space=3"); zdialog_add_widget(zd,"hbox","hbchoose","dialog",0,"space=3"); zdialog_add_widget(zd,"radio","delete","hbchoose","delete","space=3"); zdialog_add_widget(zd,"radio","fixtype","hbchoose","fix type","space=3"); zdialog_add_widget(zd,"radio","move","hbchoose","move","space=3"); zdialog_stuff(zd,"file",file); zdialog_stuff(zd,"status",status); if (Fdelete) zdialog_stuff(zd,"delete",1); // default prior choice if (Ffixtype) zdialog_stuff(zd,"fixtype",1); if (Fmove) zdialog_stuff(zd,"move",1); zdialog_run(zd,0,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for completion zdialog_fetch(zd,"delete",Fdelete); // get user choice zdialog_fetch(zd,"fixtype",Ffixtype); zdialog_fetch(zd,"move",Fmove); zdialog_free(zd); // close dialog if (zstat != 1) return; // [X] cancel - do nothing if (Fdelete) { // delete the bad file f_remove(file,"delete"); return; } if (Ffixtype) { ftype = "jpg"; // default 26.8 ftype = zdialog_text1(Mwin,TX("new file type"),ftype,5); // get new file type if (! ftype) return; newfile = zstrdup(file,"fix bad file",10); pp = strrchr(newfile,'.'); if (pp) strncpy0(pp+1,ftype,8); rename(file,newfile); zfree(newfile); return; } if (Fmove) { // move file elsewhere newfile = (ch *) zmalloc(400,"fix bad file"); newfolder2 = zgetfolder(TX("new location"),MWIN,newfolder1); if (! newfolder2) return; if (newfolder1) zfree(newfolder1); newfolder1 = newfolder2; pp = strrchr(file,'/'); strncatv(newfile,400,newfolder1,pp,null); zshell("log ack","cp \"%s\" \"%s\" ",file,newfile); err = stat(newfile,&statB); if (! err) remove(file); printf("file: %s moved to: %s \n",file,newfile); zfree(newfile); return; } return; } /**************************************************************************************/ // move the fotocx home folder (user data and settings) // get user input (folder name) and copy all files to the new location // default home folder: /home//.fotocx // if home folder has been moved, the new folder is saved in: // /home//.fotocx-home (1-line text file) void m_move_fotocx_home(GtkWidget *, ch *) // 26.2 { int move_home_dialog_event(zdialog *zd, ch *event); ch oldhomefolder[200], newhomefolder[200]; // old and new fotocx home folder ch defaulthome[200]; // default home folder ~/.fotocx ch movedhomelink[200]; // link to moved home folder ~/.fotocx-home ch oldthumbfolder[200], newthumbfolder[200]; // old and new thumbnails folder ch imagefoldersfile[200]; // image index file inside home folder ch *pp; FILE *fid; int ii, err, zstat; zdialog *zd, *zd2; zlist_t *zlist; F1_help_topic = TX("MOVE FOTOCX HOME"); printf("move_fotocx_home \n"); if (Fblock("move fotocx home")) return; snprintf(defaulthome,200,"%s/.fotocx",getenv("HOME")); // default home folder ~/.fotocx snprintf(movedhomelink,200,"%s/.fotocx-home",getenv("HOME")); // link to moved home folder ~/.fotocx-home /*** _____________________________________________________ | Move Fotocx Home Folder | | | | [Select] Home Folder [____________________________] | | | | [Proceed] [X] | |_____________________________________________________| ***/ zd = zdialog_new(TX("Move Fotocx Home Folder"),Mwin,"Proceed","X",null); zdialog_add_widget(zd,"hbox","hbsel","dialog",0,"space=5"); zdialog_add_widget(zd,"button","Select","hbsel","Select","space=3"); zdialog_add_widget(zd,"label","labsel","hbsel",TX("Home Folder"),"space=3"); zdialog_add_widget(zd,"text","newhomefolder","hbsel",0,"expand"); strncpy0(oldhomefolder,get_zhomedir(),200); strncpy0(newhomefolder,oldhomefolder,200); zdialog_stuff(zd,"newhomefolder",newhomefolder); zdialog_resize(zd,500,0); zdialog_run(zd,move_home_dialog_event,"parent"); // run dialog retry: zd->zstat = 0; zstat = zdialog_wait(zd); // wait for completion if (zstat != 1) goto cancel; // [X] cancel zdialog_fetch(zd,"newhomefolder",newhomefolder,200); // get new home folder strTrim2(newhomefolder); if (strmatch(newhomefolder,oldhomefolder)) { // no change, do nothing zmessageACK(Mwin,TX("home folder was not changed")); goto cancel; } if (strchr(newhomefolder,' ')) { zmessageACK(Mwin,TX("new home folder contains a blank")); goto retry; } if (! dirfile(newhomefolder)) { // create folder if needed err = zshell("log ack","mkdir -p -m 0750 %s",newhomefolder); if (err) goto retry; } zd2 = zmessage_post(zd->dialog,"parent",0,TX("copy files to %s"),newhomefolder); // may need time if thumbnails inside err = zshell("log ack","cp -r -p %s/* %s",oldhomefolder,newhomefolder); // copy files to new home folder zdialog_free(zd2); if (err) { // failed zmessageACK(Mwin,"copy files error: %s",strerror(errno)); goto cancel; } if (strmatch(newhomefolder,defaulthome)) // if using default home folder, remove(movedhomelink); // remove link to moved home folder else { // if moved home folder, create fid = fopen(movedhomelink,"w"); // link to moved home folder if (! fid) { zmessageACK(Mwin,"cannot create: %s \n %s",movedhomelink,strerror(errno)); goto cancel; } fprintf(fid,"%s",newhomefolder); // /home//.fotocx-home fclose(fid); // contains new home folder } snprintf(imagefoldersfile,200,"%s/image_index/image_folders",newhomefolder); // file has list of top image folders zlist = zlist_from_file(imagefoldersfile); // and top thumbnails folder if (zlist) { for (ii = 0; ii < zlist_count(zlist); ii++) { // read list of folders strncpy0(oldthumbfolder,zlist_get(zlist,ii),200); if (strmatchN(oldthumbfolder,"thumbnails: ",12)) break; // find thumbnails folder } if (ii < zlist_count(zlist)) { pp = strstr(oldthumbfolder,oldhomefolder); // thumbnails are in old home folder? if (pp) { // yes, copy thumbnails is needed repl_1str(oldthumbfolder,newthumbfolder,200,oldhomefolder,newhomefolder); zlist_put(zlist,newthumbfolder,ii); // replace old home folder with new zlist_to_file(zlist,imagefoldersfile); // replace image_folders file zstrcpy(oldthumbfolder,oldthumbfolder+12); // remove "thumbnails: " zstrcpy(newthumbfolder,newthumbfolder+12); printf("thumbnails folder changed: \n %s --> %s \n", oldthumbfolder,newthumbfolder); } } zlist_free(zlist); } zmessageACK(Mwin,TX("files in %s can be deleted"),oldhomefolder); zmessageACK(Mwin,TX("fotocx will exit")); zdialog_free(zd); Fblock(0); quitxx(); cancel: zdialog_free(zd); Fblock(0); return; } // dialog event and completion function int move_home_dialog_event(zdialog *zd, ch *event) { ch *pp; ch newhomefolder[200]; ch *title = TX("Choose new Fotocx home folder"); if (strmatch(event,"Select")) { // [Select] new folder zdialog_fetch(zd,"newhomefolder",newhomefolder,200); pp = zgetfile(title,MWIN,"folder",newhomefolder); if (! pp) return 1; strncpy0(newhomefolder,pp,200); // get entered folder if (! strstr(newhomefolder,"fotocx")) { // if not containing "fotocx" strncatv(newhomefolder,200,"/fotocx",0); // append /fotocx } zdialog_stuff(zd,"newhomefolder",newhomefolder); // stuff new folder zfree(pp); } return 1; } /**************************************************************************************/ // show resource consumption: CPU, memory, map tiles on disk namespace resources_names { double time0; } // menu function void m_resources(GtkWidget *, ch *) { using namespace resources_names; int resources_dialog_event(zdialog *zd, ch *event); zdialog *zd; F1_help_topic = TX("SHOW RESOURCES"); /*** ___________________________________ | Resources | | | | Time: hh:mm:ss | | CPU time: nn.nnn seconds | | Real memory: nnn MB | | Maps cache: 99M /home/user/... | | [x] Clear maps cache | | [Sample] [X] | |___________________________________| ***/ zd = zdialog_new(TX("Resources"),Mwin,"Sample","X",null); zdialog_add_widget(zd,"hbox","hbtime","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labtime","hbtime","hh:mm:ss","space=3"); zdialog_add_widget(zd,"hbox","hbcpu","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labcpu","hbcpu","CPU time: 1.234 seconds","space=3"); zdialog_add_widget(zd,"hbox","hbmem","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labmem","hbmem","Real memory: 123 MB","space=3"); zdialog_add_widget(zd,"hbox","hbmaps","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labmaps","hbmaps","Maps cache: 999M","space=3"); zdialog_add_widget(zd,"hbox","hbclear","dialog",0,"space=3"); zdialog_add_widget(zd,"zbutton","clear","hbclear","Clear maps cache","space=3"); time0 = 0; zdialog_run(zd,resources_dialog_event); // run dialog zdialog_send_event(zd,"sample"); // take first sample now return; } // dialog event and completion function int resources_dialog_event(zdialog *zd, ch *event) { using namespace resources_names; time_t reptime1; ch *pp, reptime2[40]; double time1; ch text[100], text2[200]; FILE *fid; int MB; if (strmatch(event,"focus")) return 1; if (strmatch(event,"sample")) zd->zstat = 1; // initial sample if (strmatch(event,"clear")) { zshell("log","rm -R ~/.cache/fotocx*"); // clear maps cache snprintf(text,100,"maps cache: 0"); zdialog_stuff(zd,"labmaps",text); return 1; } if (zd->zstat && zd->zstat != 1) { // not [sample], kill dialog zdialog_free(zd); return 1; } zd->zstat = 0; // keep dialog active reptime1 = time(0); // report current time strncpy0(reptime2,ctime(&reptime1),40); // Day Mon dd hh:mm:ss yyyy reptime2[19] = 0; // hh:mm:ss snprintf(text,100,"time: %s ",reptime2); zdialog_stuff(zd,"labtime",text); time1 = CPUtime(); // report CPU time snprintf(text,100,"CPU time: %.3f seconds",time1 - time0); time0 = time1; zdialog_stuff(zd,"labcpu",text); MB = memused(); // get process memory snprintf(text,100,"real memory: %d MB",MB); zdialog_stuff(zd,"labmem",text); strcpy(text,"maps cache unknown"); fid = popen("du -sh ~/.cache/fotocx*","r"); // count map tiles and space used if (fid) { pp = fgets_trim(text2,200,fid); if (pp) snprintf(text,100,"maps cache: %s",text2); pclose(fid); } zdialog_stuff(zd,"labmaps",text); return 1; } fotocx/Makefile0000664000175000017500000001102315247006660012465 0ustar micomico# fotocx Makefile # # Following commands choose compiler and debug options # export CXX=g++ gnu compiler # export CXX=clang++ clang compiler # export DEBUG=x debug build with address checking CXXFLAGS += -fpermissive -Wno-write-strings CXXFLAGS += -Wno-class-memaccess ## new restriction Oct 2023 CXXFLAGS += -fno-omit-frame-pointer ## for backtrace reliability CXXFLAGS += -Wno-non-c-typedef-for-linkage ifeq ($(CXX), clang++) # CLANG ifdef DEBUG CXXFLAGS += -Wall -g -O0 -fsanitize=address -Wno-stringop-truncation LDFLAGS += -fsanitize=address else CXXFLAGS += -Wall -g -O1 endif else # GCC ifdef DEBUG CXXFLAGS += -Wall -g2 -rdynamic -O0 -fsanitize=address \ -Wno-format-truncation -Wno-stringop-truncation LDFLAGS += -fsanitize=address else CXXFLAGS += -Wall -g2 -rdynamic -O1 \ -Wno-format-truncation -Wno-stringop-truncation endif endif PKG_CONFIG ?= pkg-config CFLAGS = $(CXXFLAGS) $(CPPFLAGS) -c `$(PKG_CONFIG) --cflags gtk+-3.0 webkit2gtk-4.1` ifdef DEBUG CFLAGS += -DDEBUG endif JXL_CFLAGS := $(shell pkg-config --cflags libjxl) JXL_LDFLAGS := $(shell pkg-config --libs libjxl libjxl_threads libhwy \ libbrotlicommon libbrotlidec) NETMAP_LDFLAGS := $(shell pkg-config --libs webkit2gtk-4.1) LIBS = `$(PKG_CONFIG) --libs gtk+-3.0` -lrt -lpthread -ltiff -lpng -ljpeg ALLFILES = fotocx.o f.widgets.o f.file.o f.gallery.o f.albums.o f.select.o \ f.meta.o f.edit.o f.repair.o f.refine.o f.effects.o f.warp.o \ f.combine.o f.mashup.o f.tools.o f.batch.o f.pixmap.o f.develop.o \ f.netmap.o zfuncs.o fotocx: $(ALLFILES) $(CXX) $(ALLFILES) $(LIBS) -o fotocx $(LDFLAGS) $(JXL_CFLAGS) $(JXL_LDFLAGS) $(NETMAP_LDFLAGS) fotocx.o: fotocx.cc fotocx.h $(CXX) fotocx.cc $(CFLAGS) -o fotocx.o \ f.widgets.o: f.widgets.cc fotocx.h $(CXX) f.widgets.cc $(CFLAGS) \ f.file.o: f.file.cc fotocx.h $(CXX) f.file.cc $(CFLAGS) \ f.gallery.o: f.gallery.cc fotocx.h $(CXX) f.gallery.cc $(CFLAGS) \ f.albums.o: f.albums.cc fotocx.h $(CXX) f.albums.cc $(CFLAGS) \ f.select.o: f.select.cc fotocx.h $(CXX) f.select.cc $(CFLAGS) \ f.meta.o: f.meta.cc fotocx.h $(CXX) f.meta.cc $(CFLAGS) \ f.edit.o: f.edit.cc fotocx.h $(CXX) f.edit.cc $(CFLAGS) \ f.repair.o: f.repair.cc fotocx.h $(CXX) f.repair.cc $(CFLAGS) \ f.refine.o: f.refine.cc fotocx.h $(CXX) f.refine.cc $(CFLAGS) \ f.effects.o: f.effects.cc fotocx.h $(CXX) f.effects.cc $(CFLAGS) \ f.warp.o: f.warp.cc fotocx.h $(CXX) f.warp.cc $(CFLAGS) \ f.combine.o: f.combine.cc fotocx.h $(CXX) f.combine.cc $(CFLAGS) \ f.mashup.o: f.mashup.cc fotocx.h $(CXX) f.mashup.cc $(CFLAGS) \ f.tools.o: f.tools.cc fotocx.h $(CXX) f.tools.cc $(CFLAGS) \ f.batch.o: f.batch.cc fotocx.h $(CXX) f.batch.cc $(CFLAGS) \ f.pixmap.o: f.pixmap.cc fotocx.h $(CXX) f.pixmap.cc $(CFLAGS) \ f.develop.o: f.develop.cc fotocx.h $(CXX) f.develop.cc $(CFLAGS) \ f.netmap.o: f.netmap.cc fotocx.h $(CXX) f.netmap.cc $(CFLAGS) \ zfuncs.o: zfuncs.cc zfuncs.h $(CXX) zfuncs.cc $(CFLAGS) \ ifdef DEBUG @echo DEBUG BUILD endif # install application files in standard locations PREFIX ?= /usr/local BINDIR = $(PREFIX)/bin MENUDIR = $(PREFIX)/share/applications DOCDIR = $(PREFIX)/share/doc/fotocx MANDIR = $(PREFIX)/share/man/man1 DATADIR = $(PREFIX)/share/fotocx ICONDIR = $(PREFIX)/share/icons METAINFODIR = $(PREFIX)/share/metainfo install: fotocx uninstall mkdir -p $(DESTDIR)$(BINDIR) mkdir -p $(DESTDIR)$(MENUDIR) mkdir -p $(DESTDIR)$(DOCDIR) mkdir -p $(DESTDIR)$(MANDIR) mkdir -p $(DESTDIR)$(DATADIR) mkdir -p $(DESTDIR)$(ICONDIR) mkdir -p $(DESTDIR)$(METAINFODIR) cp -f fotocx $(DESTDIR)$(BINDIR) cp -f fotocx.desktop $(DESTDIR)$(MENUDIR) cp -f -R doc/* $(DESTDIR)$(DOCDIR) gzip -fk -9 man/fotocx.man mv -f man/fotocx.man.gz $(DESTDIR)$(MANDIR)/fotocx.1.gz cp -f -R data $(DESTDIR)$(DATADIR) cp -f -R images $(DESTDIR)$(DATADIR) cp -f fotocx.png $(DESTDIR)$(ICONDIR) cp -f metainfo/* $(DESTDIR)$(METAINFODIR) uninstall: rm -f $(DESTDIR)$(BINDIR)/fotocx* rm -f $(DESTDIR)$(MENUDIR)/fotocx* rm -f -R $(DESTDIR)$(DOCDIR) rm -f $(DESTDIR)$(MANDIR)/fotocx* rm -f -R $(DESTDIR)$(DATADIR) rm -f $(DESTDIR)$(ICONDIR)/fotocx* rm -f $(DESTDIR)$(METAINFODIR)/kornelix.fotocx* clean: rm -f fotocx rm -f *.o fotocx/f.select.cc0000664000175000017500000046360715247006660013062 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image editor - select area functions Select an area within the current image. Subsequent edit functions are carried out within the area. Otherwise, edit functions apply to the entire image. sa_stat sa_stat_none/edit/fini/disab sa_pixmap[*] 0/1/2+ = pixel outside/edge/inside (edge distance) sa_pixmap2[*] mouse-selected pixels (without added matching pixels) sa_pixselc[*] 0/1 = pixel not/in current selection group sa_mode current area selection method: sa_mode_rect select rectangle by drag/click sa_mode_ellipse select ellipse by drag sa_mode_draw freehand draw by drag/click sa_mode_follow follow edge indicated by clicks sa_mode_mouse select area within mouse (radius) sa_mode_onecolor select one matching color within mouse sa_mode_allcolors select all matching colors within mouse sa_mode_sharp select sharp pixels m_select_area select area dialog sa_geom_mousefunc select rectangle or ellipse sa_draw_mousefunc draw area outline manually sa_mouse_select select area mouse functions sa_nextseq sequence number for selected pixels sa_unselect_pixels unselect recently selected pixels sa_pixmap_create setup area pixel maps sa_finish finish selected areas sa_finish_auto auto finish areas where possible sa_map_pixels map area edge and interior pixels sa_unfinish unfinish selected areas m_select_find_gap find a gap in an area outline m_select_blend blend area edits using the mouse m_select_show show area outlines m_select_hide hide area outlines m_select_enable enable area m_select_disable disable area (reversible) m_select_invert invert selected area m_select_clear delete selected area sa_show show area callable function sa_show_rect show area within an image rectangle sa_validate validate area for current image sa_enable enable area callable function sa_disable disable area callable function sa_invert invert area callable function sa_clear delete area callable function sa_edgecalc calculate area edge distances sa_edgecreep adjust area edges +-1 pixel sa_postfix copy E1 to E3 outside area, blend E3 area edges m_select_copy save area to default PNG file with alpha channel m_select_save save area to PNG file with alpha channel m_select_load open PNG file and make a select area m_select_paste paste area into image select_paste paste area in memory onto image ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) using namespace zfuncs; /**************************************************************************************/ // user select area dialog // line drawing and selection by color range are combined void m_select_area(GtkWidget *, ch *menu) // menu function { int select_dialog_event(zdialog *, ch *event); // dialog event and completion funcs zdialog *zd; if (menu) F1_help_topic = TX("SELECT AREA"); printf("m_select_area \n"); if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } if (FGM != 'F') return; if (zd_sela) return; // already active if (CEF && CEF->Farea != 2) { // active edit function zmessageACK(Mwin,TX("Select Area not supported \n" "by this edit function")); return; } /*** _______________________________________________ | Select Area for Edits | | Press F1 for help | | | | [x] select rectangle [x] ellipse | | [x] freehand draw [x] follow edge | | - - - - - - - - - - - - - - - - - - - - - - - | | [x] select area within mouse | | [x] select one color within mouse [####] | | [x] optional deselect color [####] | | [x] select all colors within mouse (flood) | | | | color match level % [___] | | mouse radius [___] search range [___] | | - - - - - - - - - - - - - - - - - - - - - - - | | area edge creep [+] [-] | area edge blend removed | - - - - - - - - - - - - - - - - - - - - - - - | | area outline color: (#) (#) (#) (#) (#) | color buttons red green blue black white | | | [Finish] [Invert] [Show] [Hide] [Clear] [X] | |_______________________________________________| ***/ zd_sela = zdialog_new(TX("Select Area for Edits"),Mwin,null); zd = zd_sela; zdialog_add_widget(zd,"label","labhelp","dialog",TX("Press F1 for help"),"space=3"); zdialog_add_widget(zd,"hbox","hbshape","dialog"); zdialog_add_widget(zd,"check","ckrect","hbshape",TX("select rectangle"),"space=3"); zdialog_add_widget(zd,"check","ckelips","hbshape",TX("ellipse"),"space=10"); zdialog_add_widget(zd,"hbox","hbdraw","dialog"); zdialog_add_widget(zd,"check","ckdraw","hbdraw",TX("freehand draw"),"space=3"); zdialog_add_widget(zd,"check","ckfollow","hbdraw",TX("follow edge"),"space=10"); zdialog_add_widget(zd,"hsep","sep1","dialog",0,"space=4"); zdialog_add_widget(zd,"hbox","hbm1","dialog"); zdialog_add_widget(zd,"check","ckmouse","hbm1",TX("select area within mouse"),"space=3"); zdialog_add_widget(zd,"hbox","hbm2","dialog"); zdialog_add_widget(zd,"check","ckonecolor","hbm2",TX("select one color within mouse"),"space=3"); zdialog_add_widget(zd,"colorbutt","onecolor","hbm2","0|0|0","space=5"); zdialog_add_widget(zd,"hbox","hbm3","dialog"); zdialog_add_widget(zd,"label","space","hbm3",0,"space=20"); zdialog_add_widget(zd,"check","ckdselcolor","hbm3",TX("optional deselect color")); zdialog_add_widget(zd,"colorbutt","dselcolor","hbm3","0|0|0","space=5"); zdialog_add_widget(zd,"hbox","hbm4","dialog"); zdialog_add_widget(zd,"check","ckallcolors","hbm4",TX("select all colors within mouse (flood)"),"space=3"); zdialog_add_widget(zd,"hsep","sep2","dialog",0,"space=4"); zdialog_add_widget(zd,"hbox","hbml","dialog"); zdialog_add_widget(zd,"label","labmatch","hbml",TX("color match level %"),"space=3"); zdialog_add_widget(zd,"zspin","colormatch","hbml","0|100|1|90","space=5|size=3"); zdialog_add_widget(zd,"hbox","hbmm","dialog"); zdialog_add_widget(zd,"label","labmr","hbmm",TX("mouse radius"),"space=3"); zdialog_add_widget(zd,"zspin","mouserad","hbmm","1|300|1|20","space=5|size=3"); zdialog_add_widget(zd,"label","space","hbmm",0,"space=10"); zdialog_add_widget(zd,"label","labrange","hbmm",TX("search range"),"space=3"); zdialog_add_widget(zd,"zspin","searchrange","hbmm","1|20|1|5","space=5|size=3"); zdialog_add_widget(zd,"hsep","sep3","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbbw","dialog"); zdialog_add_widget(zd,"label","labcreep","hbbw",TX("area edge creep"),"space=3"); zdialog_add_widget(zd,"button","creep+","hbbw","+","space=5"); zdialog_add_widget(zd,"button","creep-","hbbw","-"); zdialog_add_widget(zd,"hsep","sep4","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbm5","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labcolor","hbm5",TX("area outline color:"),"space=3"); zdialog_add_widget(zd,"imagebutt","red","hbm5","redball.png","size=15|space=3"); zdialog_add_widget(zd,"imagebutt","green","hbm5","greenball.png","size=15|space=3"); zdialog_add_widget(zd,"imagebutt","blue","hbm5","blueball.png","size=15|space=3"); zdialog_add_widget(zd,"imagebutt","black","hbm5","blackball.png","size=15|space=3"); zdialog_add_widget(zd,"imagebutt","white","hbm5","whiteball.png","size=15|space=3"); zdialog_add_widget(zd,"hbox","hbb2","dialog",0,"space=10"); zdialog_add_widget(zd,"button","finish","hbb2",TX("Finish"),"space=2"); zdialog_add_widget(zd,"button","invert","hbb2",TX("Invert"),"space=2"); zdialog_add_widget(zd,"button","show","hbb2",TX("Show"),"space=2"); zdialog_add_widget(zd,"button","hide","hbb2",TX("Hide"),"space=2"); zdialog_add_widget(zd,"button","clear","hbb2",TX("Clear"),"space=2"); zdialog_add_widget(zd,"button","done","hbb2","X","space=2"); zdialog_add_ttip(zd,"ckrect",TX("drag mouse to select rectangular area")); zdialog_add_ttip(zd,"ckelips",TX("drag mouse to select circular or elliptical area")); zdialog_add_ttip(zd,"ckdraw",TX("drag mouse to outline an area")); zdialog_add_ttip(zd,"ckfollow",TX("drag mouse along an edge to follow the edge")); zdialog_add_ttip(zd,"labcolor",TX("select line color")); zdialog_add_ttip(zd,"labmr",TX("size of mouse selection circle")); zdialog_add_ttip(zd,"labmatch",TX("select by color, required match level")); zdialog_add_ttip(zd,"labrange",TX("select by color, search range")); zdialog_add_ttip(zd,"ckmouse",TX("select area within mouse circle")); zdialog_add_ttip(zd,"ckonecolor",TX("left click on image for selected color")); zdialog_add_ttip(zd,"ckdselcolor",TX("right click on image for deselected color")); zdialog_add_ttip(zd,"ckallcolors",TX("select surrounding areas matching colors in mouse")); zdialog_add_ttip(zd,"labcreep",TX("move area boundary in/out in 1-pixel steps")); zdialog_add_ttip(zd,"finish",TX("map selected areas and verify")); zdialog_add_ttip(zd,"invert",TX("invert area")); zdialog_add_ttip(zd,"show",TX("show area outlines")); zdialog_add_ttip(zd,"hide",TX("hide area outlines")); zdialog_add_ttip(zd,"clear",TX("clear area selections")); sa_mouseradius = 30; // initial values matching dialog sa_colormatch = 90; sa_searchrange = 5; sa_mode = 0; zdialog_stuff(zd,"ckrect",0); zdialog_stuff(zd,"ckelips",0); zdialog_stuff(zd,"ckdraw",0); zdialog_stuff(zd,"ckfollow",0); zdialog_stuff(zd,"ckmouse",0); zdialog_stuff(zd,"ckonecolor",0); zdialog_stuff(zd,"ckdselcolor",0); zdialog_stuff(zd,"ckallcolors",0); zdialog_run(zd,select_dialog_event,"save"); // run dialog - parallel if (sa_stat) sa_show(1,0); // show existing area return; } // dialog event and completion callback function int select_dialog_event(zdialog *zd, ch *event) { int Nckevents = 7, ii, kk, cc; ch *ckevents[7] = { "ckrect", "ckelips", "ckdraw", "ckfollow", // mutually exclusive check boxes "ckmouse", "ckonecolor", "ckallcolors" }; if (zd->zstat == -2) zd->zstat = 0; // escape key (keep dialog) if (sa_edgecalc_busy) return 1; // block until done if (! curr_file) event = "done"; // image went away if (FGM != 'F') event = "done"; if (strmatch(event,"done") || zd->zstat) // done or cancel { freeMouse(); // disconnect mouse function zdialog_free(zd); // kill dialog zd_sela = 0; if (sa_stat) { cc = Fpxb->ww * Fpxb->hh; // check if any pixels mapped for (ii = 0; ii < cc; ii++) if (sa_pixmap[ii]) break; if (ii == cc) sa_clear(); // no, delete area } return 1; } if (CEF && CEF->Fpreview && CEF->zd) // use full-size image zdialog_send_event(CEF->zd,"fullsize"); sa_validate(); // validate area, remove if no good if (CEF && CEF->Farea != 2) { // select area not supported printf("*** select area ignored for this edit function \n"); return 1; } if (sa_stat == sa_stat_none) { // no area, create one sa_pixmap_create(); // allocate pixel maps sa_currseq = sa_Ncurrseq = 0; // reset selection sequence sa_Npixel = sa_edgecalc_done = 0; sa_fww = Fpxb->ww; // valid image size for area sa_fhh = Fpxb->hh; sa_stat = sa_stat_edit; // status = edit sa_mode = 0; } for (ii = 0; ii < Nckevents; ii++) // look for checkbox event { if (strmatch(event,ckevents[ii])) { // checkbox was changed zdialog_fetch(zd,event,kk); // checkbox status if (kk) { // ON sa_mode = ii+1; // edit mode 1-9 sa_stat = sa_stat_edit; // active edit status sa_Npixel = sa_edgecalc_done = 0; sa_show(1,0); // show area } else sa_mode = 0; // OFF, no edit mode, edit paused for (kk = 0; kk < Nckevents; kk++) // other checkboxes >> off if (kk != ii) zdialog_stuff(zd,ckevents[kk],0); // one checkbox >> on } } if (strmatch(event,"mouserad")) // mouse selection radius zdialog_fetch(zd,"mouserad",sa_mouseradius); if (strmatch(event,"colormatch")) // mouse color match limit, 0 - 99.9 zdialog_fetch(zd_sela,"colormatch",sa_colormatch); if (strmatch(event,"searchrange")) // mouse color match search range, x radius zdialog_fetch(zd_sela,"searchrange",sa_searchrange); if (strmatch(event,"finish")) sa_finish(); // finish (finalize) area if (strmatch(event,"invert")) sa_invert(); // invert area (inside <--> outside) if (strmatch(event,"show")) sa_show(1,0); // show area if (strmatch(event,"hide")) sa_show(0,0); // hide area if (strmatch(event,"clear")) sa_clear(); // clear area if (strmatchN(event,"creep",5) && sa_stat == sa_stat_fini) { // edge creep changed and area finished if (event[5] == '+') sa_edgecreep(+1); else sa_edgecreep(-1); } if (strmatch(event,"red")) memcpy(LINE_COLOR,RED,3*sizeof(int)); if (strmatch(event,"green")) memcpy(LINE_COLOR,GREEN,3*sizeof(int)); if (strmatch(event,"blue")) memcpy(LINE_COLOR,BLUE,3*sizeof(int)); if (strmatch(event,"black")) memcpy(LINE_COLOR,BLACK,3*sizeof(int)); if (strmatch(event,"white")) memcpy(LINE_COLOR,WHITE,3*sizeof(int)); if (zstrstr("red green blue black white",event)) Fpaint2(); if (sa_stat == sa_stat_edit && sa_mode && Fshowarea) // active edit mode { if (sa_mode == sa_mode_rect) takeMouse(sa_geom_mousefunc,dragcursor); // rectangle if (sa_mode == sa_mode_ellipse) takeMouse(sa_geom_mousefunc,dragcursor); // ellipse if (sa_mode == sa_mode_draw) takeMouse(sa_draw_mousefunc,drawcursor); // freehand draw if (sa_mode == sa_mode_follow) takeMouse(sa_draw_mousefunc,drawcursor); // follow edge if (sa_mode == sa_mode_mouse) { // mouse radius select sa_lastx = sa_lasty = 0; takeMouse(sa_mouse_select,0); } if (sa_mode == sa_mode_onecolor) { // mouse radius, one color select sa_lastx = sa_lasty = 0; takeMouse(sa_mouse_select,0); } if (sa_mode == sa_mode_allcolors) { // mouse radius, all colors select sa_lastx = sa_lasty = 0; takeMouse(sa_mouse_select,0); } if (sa_mode != sa_mode_onecolor) // not select one color zdialog_stuff(zd,"ckdselcolor",0); // remove check for deselect color } else // edit paused or done { freeMouse(); // disconnect mouse gdk_window_set_cursor(Fgdkwin,null); // normal cursor for (kk = 0; kk < Nckevents; kk++) // all checkboxes off zdialog_stuff(zd,ckevents[kk],0); sa_mode = 0; } return 1; } // select area mouse function - select a rectangle or ellipse void sa_geom_mousefunc() { static int mx1, my1, mx2, my2; static int mdx0, mdy0, drag; float a, b, a2, b2; float x, y, x2, y2, cx, cy; int px, py; cairo_t *cr; if (sa_stat != sa_stat_edit) return; // area gone? if (sa_currseq > sa_maxseq-2) { zmessageACK(Mwin,TX("exceed %d edits"),sa_maxseq); // cannot continue return; } cr = draw_context_create(Fgdkwin,draw_context); if (RMclick) // right mouse click { RMclick = 0; sa_unselect_pixels(cr); // remove latest selection drag = 0; Fpaint2(); draw_context_destroy(draw_context); return; } if (! Mxdrag && ! Mydrag) { // no drag underway draw_context_destroy(draw_context); return; } if (Mxdown != mdx0 || Mydown != mdy0) { // new drag initiated mdx0 = Mxdown; mdy0 = Mydown; mx1 = mdx0; // drag start, one corner my1 = mdy0; drag = 0; Mxdrag = Mydrag = 0; draw_context_destroy(draw_context); return; } mx2 = Mxdrag; // drag continues, 2nd corner my2 = Mydrag; Mxdrag = Mydrag = 0; if (drag) sa_unselect_pixels(cr); // remove prior drag result sa_nextseq(); // next sequence number drag = 1; if (sa_mode == sa_mode_rect) // draw rectangle { sa_draw_line(mx1,my1,mx2,my1,cr); // draw 4 lines sa_draw_line(mx2,my1,mx2,my2,cr); sa_draw_line(mx2,my2,mx1,my2,cr); sa_draw_line(mx1,my2,mx1,my1,cr); } if (sa_mode == sa_mode_ellipse) // draw ellipse { a = abs(mx2 - mx1); // ellipse constants from b = abs(my2 - my1); // enclosing rectangle a2 = a * a; b2 = b * b; cx = mx1; // center at drag origin cy = my1; for (y = -b; y < b; y++) // step through y values { y2 = y * y; x2 = a2 * (1 - y2 / b2); x = sqrtf(x2); // corresp. x values, + and - py = y + cy; px = cx - x + 0.5; sa_draw1pix(px,py,cr); // draw 2 points on ellipse px = cx + x + 0.5; sa_draw1pix(px,py,cr); } for (x = -a; x < a; x++) // step through x values { x2 = x * x; y2 = b2 * (1 - x2 / a2); y = sqrtf(y2); // corresp. y values, + and - px = cx + x; py = cy - y + 0.5; sa_draw1pix(px,py,cr); // draw 2 points on ellipse py = cy + y + 0.5; sa_draw1pix(px,py,cr); } } draw_context_destroy(draw_context); return; } // select area mouse function - freehand draw and follow edge void sa_draw_mousefunc() { void sa_follow_edge(int mx1, int my1, int &mx2, int &my2, cairo_t *cr); void sa_redraw(int mx1, int my1, int mx2, int my2, cairo_t *cr); int mx1, my1, mx2, my2; int ii, npdist, npx, npy; int click, newseq, thresh; static int drag = 0, openend = 0; static int mdx0, mdy0, mdx1, mdy1; cairo_t *cr; if (sa_stat != sa_stat_edit) return; // area gone? cr = draw_context_create(Fgdkwin,draw_context); sa_thresh = 4.0 / Mscale + 1; // mouse pixel distance threshold if (! (LMclick || RMclick || Mxdrag || Mydrag)) { // no mouse action if (openend) { openend = 0; // close gap after prior draw mx1 = sa_endpx[sa_currseq]; my1 = sa_endpy[sa_currseq]; thresh = 3 * sa_thresh; npdist = sa_nearpix(mx1,my1,thresh,mx2,my2,1); if (npdist) sa_draw_line(mx1,my1,mx2,my2,cr); } goto draw_exit; } click = newseq = 0; if (LMclick || Mxdrag || Mydrag) // left mouse click or mouse drag { if (LMclick) // left mouse click { mx1 = mx2 = Mxclick; // click position my1 = my2 = Myclick; newseq++; click++; drag = 0; } else // drag motion { if (Mxdown != mdx0 || Mydown != mdy0) { // new drag initiated mdx0 = mdx1 = Mxdown; mdy0 = mdy1 = Mydown; newseq++; } mx1 = mdx1; // drag start my1 = mdy1; mx2 = Mxdrag; // drag position my2 = Mydrag; mdx1 = mx2; // next drag start mdy1 = my2; drag++; click = 0; } if (Mbutton == 3) // right mouse >> erase { while (true) { thresh = sa_thresh; npdist = sa_nearpix(mx2,my2,thresh,npx,npy,0); // find nearest pixel if (! npdist) break; ii = npy * Fpxb->ww + npx; if (sa_pixmap[ii]) { sa_pixmap[ii] = 0; // unmap pixel erase_pixel(npx,npy,cr); // erase pixel } } goto draw_exit; } if (sa_currseq > sa_maxseq-2) { zmessageACK(Mwin,TX("exceed %d edits"),sa_maxseq); // cannot continue goto draw_exit; } if (sa_currseq == 0 && newseq) // 1st pixel(s) of 1st sequence { sa_nextseq(); // set next (1st) sequence no. sa_draw_line(mx1,my1,mx2,my2,cr); // draw initial pixel or line sa_endpx[sa_currseq] = mx2; sa_endpy[sa_currseq] = my2; goto draw_exit; } if (click) { mx1 = sa_endpx[sa_currseq]; // prior sequence end pixel my1 = sa_endpy[sa_currseq]; // (before this click) } if (drag) { if (newseq) thresh = 2 * sa_thresh; // new drag threshold else thresh = 5 * sa_thresh; // continuation drag threshold npx = sa_endpx[sa_currseq]; // distance from prior end pixel npy = sa_endpy[sa_currseq]; // (before this drag) if (abs(mx1-npx) < thresh && abs(my1-npy) < thresh) { mx1 = sa_endpx[sa_currseq]; // if < threshold, connect this my1 = sa_endpy[sa_currseq]; // drag to prior drag or click } } if (drag > 50) newseq = 1; // incr. sequence each 50 pixels if (newseq) { sa_nextseq(); // set next sequence no. drag = 1; // drag length within sequence } if (sa_mode == sa_mode_draw) sa_draw_line(mx1,my1,mx2,my2,cr); // draw line from end pixel to mouse if (sa_mode == sa_mode_follow) sa_follow_edge(mx1,my1,mx2,my2,cr); // follow edge from end pixel to mouse sa_endpx[sa_currseq] = mx2; // set end pixel for this sequence sa_endpy[sa_currseq] = my2; openend = 0; } else if (RMclick) // right mouse click sa_unselect_pixels(cr); // remove latest selection draw_exit: draw_context_destroy(draw_context); LMclick = RMclick = 0; // stop further mouse action Mxdrag = Mydrag = 0; return; } // Find the nearest drawn pixel within a radius of a given pixel. // Returns distance to pixel, or zero if nothing found. // Returns 1 for adjacent pixel. // fx flag: exclude current selection (sequence no.) from search. int sa_nearpix(int mx, int my, int rad2, int &npx, int &npy, int fx) { int ii, rad, qx, qy, dx, dy; int mindist, dist; npx = npy = 0; mindist = (rad2+1) * (rad2+1); for (rad = 1; rad <= rad2; rad++) // seek neighbors within range { if (rad * rad > mindist) break; // can stop searching now for (qx = mx-rad; qx <= mx+rad; qx++) // search within rad for (qy = my-rad; qy <= my+rad; qy++) { if (qx != mx-rad && qx != mx+rad && // exclude within rad-1 qy != my-rad && qy != my+rad) continue; // (already searched) if (qx < 0 || qx > Fpxb->ww-1) continue; if (qy < 0 || qy > Fpxb->hh-1) continue; ii = qy * Fpxb->ww + qx; if (! sa_pixmap[ii]) continue; if (fx && sa_pixmap[ii] == sa_currseq) continue; // exclude curr. selection dx = (mx - qx) * (mx - qx); // found pixel dy = (my - qy) * (my - qy); dist = dx + dy; // distance**2 if (dist < mindist) { mindist = dist; npx = qx; // save nearest pixel found npy = qy; } } } if (npx + npy) return sqrt(mindist) + 0.5; return 0; } // draw a line between two given pixels // add all in-line pixels to sa_pixmap[] void sa_draw_line(int px1, int py1, int px2, int py2, cairo_t *cr) { int pxm, pym; float slope; int crflag = 0; if (sa_stat != sa_stat_edit) return; // area gone? if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } if (px1 == px2 && py1 == py2) { // only one pixel sa_draw1pix(px1,py1,cr); if (crflag) draw_context_destroy(draw_context); return; } if (abs(py2 - py1) > abs(px2 - px1)) { slope = 1.0 * (px2 - px1) / (py2 - py1); if (py2 > py1) { for (pym = py1; pym <= py2; pym++) { pxm = round(px1 + slope * (pym - py1)); sa_draw1pix(pxm,pym,cr); } } else { for (pym = py1; pym >= py2; pym--) { pxm = round(px1 + slope * (pym - py1)); sa_draw1pix(pxm,pym,cr); } } } else { slope = 1.0 * (py2 - py1) / (px2 - px1); if (px2 > px1) { for (pxm = px1; pxm <= px2; pxm++) { pym = round(py1 + slope * (pxm - px1)); sa_draw1pix(pxm,pym,cr); } } else { for (pxm = px1; pxm >= px2; pxm--) { pym = round(py1 + slope * (pxm - px1)); sa_draw1pix(pxm,pym,cr); } } } if (crflag) draw_context_destroy(draw_context); return; } // add to select area and draw one pixel if not already // cr must be set by caller void sa_draw1pix(int px, int py, cairo_t *cr) { int ii; if (px < 0 || px > Fpxb->ww-1) return; if (py < 0 || py > Fpxb->hh-1) return; ii = Fpxb->ww * py + px; if (! sa_pixmap[ii]) { // if not already selected, sa_pixmap[ii] = sa_currseq; // map pixel to curr. selection sa_Ncurrseq++; } draw_pixel(px,py,cr); // draw pixel return; } // Find series of edge pixels from px1/py1 to px2/py2 and connect them together. void sa_follow_edge(int px1, int py1, int &px2, int &py2, cairo_t *cr) { float sa_get_contrast(int px, int py); float px3, py3, px4, py4, px5, py5, px6, py6; float dx, dy, dist, contrast, maxcontrast; int crflag = 0; if (sa_stat != sa_stat_edit) return; // area gone? if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } px3 = px1; // p3 progresses from p1 to p2 py3 = py1; while (true) { dx = px2 - px3; dy = py2 - py3; dist = sqrt(dx * dx + dy * dy); // last segment if (dist < 5) break; // line laggs mouse 5 pixels px4 = px3 + dx / dist; // p4 = p3 moved toward p2 py4 = py3 + dy / dist; maxcontrast = 0; px6 = px4; py6 = py4; for (int ii = -2; ii <= +2; ii++) // p5 points are in a line through p4 { // and perpendicular to p4 - p2 px5 = px4 + ii * dy / dist; py5 = py4 - ii * dx / dist; contrast = sa_get_contrast(px5,py5); contrast *= (7 - abs(ii)); // favor points closer together if (contrast > maxcontrast) { px6 = px5; // p6 = highest contrast point in p5 py6 = py5; maxcontrast = contrast; } } sa_draw_line(px3,py3,px6,py6,cr); // draw p3 to p6 px3 = px6; // next p3 py3 = py6; } px2 = px3; // return lagging end point py2 = py3; if (crflag) draw_context_destroy(draw_context); return; } // freehand draw while erasing nearby pixels, effectively replacing them void sa_redraw(int mx1, int my1, int mx2, int my2, cairo_t *cr) { int ii, npx, npy; int thresh, npdist, d1, d2; int crflag = 0; if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } thresh = 2 * sa_thresh; npdist = sa_nearpix(mx1,my1,thresh,npx,npy,0); // nearest pixel to (mx1,my1) if (npdist) { ii = npy * Fpxb->ww + npx; if (sa_pixmap[ii] != sa_currseq) { // if not in current line, sa_pixmap[ii] = sa_currseq; // add to current line sa_draw_line(npx,npy,mx1,my1,cr); } } sa_draw_line(mx1,my1,mx2,my2,cr); // draw line from (mx1,my1) to (mx2,my2) while (true) { npdist = sa_nearpix(mx2,my2,thresh,npx,npy,1); // nearest pixel to (mx2,my2) not in line if (! npdist) break; d1 = (npx-mx1)*(npx-mx1) + (npy-my1)*(npy-my1); d2 = (npx-mx2)*(npx-mx2) + (npy-my2)*(npy-my2); if (d2 >= d1) break; ii = npy * Fpxb->ww + npx; // motion toward pixel sa_pixmap[ii] = 0; // unmap pixel erase_pixel(npx,npy,cr); // erase pixel } if (crflag) draw_context_destroy(draw_context); return; } // Find max. contrast between neighbors on opposite sides of given pixel float sa_get_contrast(int px, int py) { int map[4][2] = { {1, 0}, {1, 1}, {0, 1}, {-1, 1} }; int ii, qx, qy; uint8 *pix1, *pix2; float match, contrast, maxcontrast = 0; if (px < 1 || px > Fpxb->ww-2) return 0; // avoid edge pixels if (py < 1 || py > Fpxb->hh-2) return 0; for (ii = 0; ii < 4; ii++) // compare pixels around target { // e.g. (px-1,py) to (px+1,py) qx = map[ii][0]; qy = map[ii][1]; pix1 = PXBpix(Fpxb,px+qx,py+qy); pix2 = PXBpix(Fpxb,px-qx,py-qy); match = PIXmatch(pix1,pix2); // 0..1 = zero..perfect match contrast = 1.0 - match; // max. contrast = 1.0 if (contrast > maxcontrast) maxcontrast = contrast; } return maxcontrast; } // mouse function for edit modes with mouse / color selection // sa_mode = mouse = select area within mouse radius // sa_mode = onecolor = select one matching color within mouse radius // optionally deselect matching color within mouse // sa_mode = allcolors = select all matching colors within mouse radius // and extend to contiguous matching colors // if left click or drag, find and select matching pixels // if right click, unselect last selection // if right drag, find and unselect matching pixels void sa_mouse_select() { void sa_mouse_select1(int mode, int select, int dselect); void sa_mouse_selectall(int select); int newdrag, dselect = 0; static int pxcc, mxdown, mydown, dragseq; int startx, starty, endx, endy; float slope; if (sa_stat != sa_stat_edit) return; // area gone? if (sa_mode == sa_mode_allcolors && ! sa_pixselc) { // allocate memory for this mode pxcc = Fpxb->ww * Fpxb->hh; sa_stackdirec = (ch *) zmalloc(pxcc,"select-area"); sa_stack = (int *) zmalloc(pxcc * sizeof(int),"select-area"); sa_maxstack = pxcc; sa_Nstack = 0; sa_pixselc = (uint8 *) zmalloc(pxcc,"select-area"); } if (sa_mode != sa_mode_allcolors && sa_pixselc) { // free memory otherwise zfree(sa_stackdirec); zfree(sa_stack); zfree(sa_pixselc); sa_stackdirec = 0; sa_stack = 0; sa_pixselc = 0; } if (sa_pixselc) memset(sa_pixselc,0,pxcc); // clear list of mouse-selected pixels if (LMclick || RMclick) // left or right mouse click { if (RMclick) dselect = 1; // deselect color is active 25.1 LMclick = RMclick = 0; sa_nextseq(); // set next sequence no. dragseq = 0; // reset drag counter if (sa_lastx == 0 && sa_lasty == 0) { // no prior selection sa_lastx = Mxclick; sa_lasty = Myclick; } sa_mousex = Mxclick; sa_mousey = Myclick; if (sa_mode == sa_mode_onecolor) sa_mouse_select1(1,1,dselect); // set colors to match or not match 25.1 if (sa_mode == sa_mode_allcolors) sa_mouse_selectall(1); // select matching colors in or beyond mouse if (sa_mode == sa_mode_mouse) // select along line from last { // selection to current mouse startx = sa_lastx; starty = sa_lasty; endx = Mxclick; endy = Myclick; if (abs(endy - starty) > abs(endx - startx)) { slope = 1.0 * (endx - startx) / (endy - starty); if (endy > starty) { for (sa_mousey = starty; sa_mousey <= endy; sa_mousey++) { sa_mousex = round(startx + slope * (sa_mousey - starty)); sa_mouse_selectall(1); // select pixels within mouse } } else { for (sa_mousey = starty; sa_mousey >= endy; sa_mousey--) { sa_mousex = round(startx + slope * (sa_mousey - starty)); sa_mouse_selectall(1); } } } else { slope = 1.0 * (endy - starty) / (endx - startx); if (endx > startx) { for (sa_mousex = startx; sa_mousex <= endx; sa_mousex++) { sa_mousey = round(starty + slope * (sa_mousex - startx)); sa_mouse_selectall(1); } } else { for (sa_mousex = startx; sa_mousex >= endx; sa_mousex--) { sa_mousey = round(starty + slope * (sa_mousex - startx)); sa_mouse_selectall(1); } } } } Fpaintnow(); } if (RMclick) { // right mouse click RMclick = 0; sa_unselect_pixels(0); // remove latest selection sa_show(1,0); // show area } if (Mxdrag || Mydrag) // drag is underway { sa_mousex = Mxdrag; // new mouse position sa_mousey = Mydrag; Mxdrag = Mydrag = 0; newdrag = 0; if (Mxdown != mxdown || Mydown != mydown) { // detect if new drag started newdrag = 1; // yes mxdown = Mxdown; // save drag start position mydown = Mydown; } if (Mbutton == 1) { // left drag, select matching colors if (sa_mode == sa_mode_mouse) sa_mouse_selectall(1); if (sa_mode == sa_mode_onecolor) // select matching colors within mouse sa_mouse_select1(2,1,dselect); // 25.1 if (sa_mode == sa_mode_allcolors) // select in mouse + matching colors beyond sa_mouse_selectall(1); if (newdrag || ++dragseq > 30) { // limit work per sequence no. sa_nextseq(); // set next sequence no. dragseq = 0; // reset drag counter } } if (Mbutton == 3) { // right drag, find and unselect pixels if (sa_mode == sa_mode_mouse) sa_mouse_selectall(0); if (sa_mode == sa_mode_onecolor) sa_mouse_select1(2,0,dselect); if (sa_mode == sa_mode_allcolors) sa_mouse_selectall(0); } } draw_mousecircle(Mxposn,Myposn,sa_mouseradius,0,0); // move mouse circle with mouse return; } // Left click - pixel at mouse position --> color to select (match) // Right click - pixel at mouse position --> color to deselect (unmmatch) // Left/right drag - select/deselect matching pixels within mouse radius. void sa_mouse_select1(int mode, int select, int dselect) // 25.1 { int mrad, mrad2; int rad2, ii, jj; int px, py, rx, ry; int xlo, xhi, ylo, yhi, newpix; int Fdselect; // deselect option engaged uint8 *pix1; float match1, match2, match3; float red, green, blue; float Rsel, Gsel, Bsel; float Rdsel, Gdsel, Bdsel; ch colorbutt[16]; px = sa_mousex; py = sa_mousey; if (px < 0 || px > Fpxb->ww-2) return; // mouse outside image if (py < 0 || py > Fpxb->hh-2) return; if (mode == 1) // left or right click { red = green = blue = 0; for (ii = -1; ii <= +1; ii++) // get mean color for 3x3 pixels for (jj = -1; jj <= +1; jj++) // centered at px, py { pix1 = PXBpix(Fpxb,px+ii,py+jj); red += pix1[0]; green += pix1[1]; blue += pix1[2]; } red = red / 9.0; // color to match green = green / 9.0; blue = blue / 9.0; snprintf(colorbutt,16,"%.0f|%.0f|%.0f",red,green,blue); // set select/match color button if (dselect) zdialog_stuff(zd_sela,"dselcolor",colorbutt); // or deselect/unmatch color button 25.1 else zdialog_stuff(zd_sela,"onecolor",colorbutt); return; } // drag mode: select = 1/0 for left/right drag // left or right drag // test all pixels within mouse, select/unselect matching colors zdialog_fetch(zd_sela,"onecolor",colorbutt,16); // get select color button color ii = sscanf(colorbutt,"%f|%f|%f",&Rsel,&Gsel,&Bsel); if (ii != 3) { printf("*** color button error: select color"); return; } zdialog_fetch(zd_sela,"ckdselcolor",Fdselect); // deselect option engaged if (Fdselect) { zdialog_fetch(zd_sela,"dselcolor",colorbutt,16); // get deselect color button color ii = sscanf(colorbutt,"%f|%f|%f",&Rdsel,&Gdsel,&Bdsel); if (ii != 3) { printf("*** color button error: deselect color"); return; } } match1 = 0.01 * sa_colormatch; // color match level, 0.01 to 1.0 sa_Ncurrseq = 0; // count newly selected pixels mrad = sa_mouseradius; mrad2 = mrad * mrad; xlo = px - mrad; // track changed area xhi = px + mrad; ylo = py - mrad; yhi = py + mrad; for (rx = -mrad; rx <= mrad; rx++) // loop every pixel in radius of mouse for (ry = -mrad; ry <= mrad; ry++) { rad2 = rx * rx + ry * ry; if (rad2 > mrad2) continue; // outside radius px = sa_mousex + rx; py = sa_mousey + ry; if (px < 0 || px >= Fpxb->ww) continue; // off the image edge if (py < 0 || py >= Fpxb->hh) continue; pix1 = PXBpix(Fpxb,px,py); // pixel to test ii = Fpxb->ww * py + px; newpix = 0; if (select) { // left drag if (! Fdselect) { // select only match2 = RGBmatch(Rsel,Gsel,Bsel,pix1[0],pix1[1],pix1[2]); // pixel match to select color if (match2 < match1) continue; // not a good enough match } else { // select and deselect 25.1 match2 = RGBmatch(Rsel,Gsel,Bsel,pix1[0],pix1[1],pix1[2]); // pixel match to select color match3 = RGBmatch(Rdsel,Gdsel,Bdsel,pix1[0],pix1[1],pix1[2]); // pixel match to deselect color if (match3 > match2) continue; // if better match, don't select } if (! sa_pixmap[ii]) { // if selected for the first time, sa_pixmap[ii] = sa_currseq; // map pixel to current sequence sa_Ncurrseq++; // current sequence pixel count newpix = 1; sa_pixmap2[ii] = 1; // pixel is mouse selected } } else if (sa_pixmap[ii]) // right drag - unselect mode { sa_pixmap[ii] = 0; newpix = 1; sa_pixmap2[ii] = 0; } if (newpix) { if (px < xlo) xlo = px; // range of changed pixels if (px > xhi) xhi = px; if (py < ylo) ylo = py; if (py > yhi) yhi = py; } } if (select) { // remember last select location sa_lastx = sa_mousex; sa_lasty = sa_mousey; } return; } // Select all pixels within mouse radius and optionally extend selection // to all contiguous pixels matching colors within mouse and within range. // Select or unselect the matching pixels. void sa_mouse_selectall(int select) { int mrad, mrad2, srange2; int rad1, rad2, ii; int kk, px, py, rx, ry; int ppx, ppy, npx, npy; int xlo, xhi, ylo, yhi, newpix; uint8 *pix1; float red, green, blue, ff1, ff2; float match1, match2, match3; int thresh; ch direc; struct Ctab_t { // table of pixel colors in mouse circle int count; // count of pixels with this color float rgb[3]; // RGB color }; Ctab_t Ctab[1000]; // table int Ntab; // table count px = sa_mousex; py = sa_mousey; if (px < 0 || px > Fpxb->ww-1) return; // mouse outside image if (py < 0 || py > Fpxb->hh-1) return; sa_Ncurrseq = 0; // count newly selected pixels mrad = sa_mouseradius; mrad2 = mrad * mrad; for (rx = -mrad; rx <= mrad; rx++) // loop every pixel in radius of mouse for (ry = -mrad; ry <= mrad; ry++) { rad2 = rx * rx + ry * ry; if (rad2 > mrad2) continue; // outside radius px = sa_mousex + rx; py = sa_mousey + ry; if (px < 0 || px >= Fpxb->ww) continue; // off the image edge if (py < 0 || py >= Fpxb->hh) continue; ii = Fpxb->ww * py + px; if (select) { // select pixel if (sa_pixmap[ii]) continue; // already selected sa_pixmap[ii] = sa_currseq; // map pixel to current sequence sa_Ncurrseq++; // current sequence pixel count sa_pixmap2[ii] = 1; // pixel is mouse selected } else sa_pixmap[ii] = sa_pixmap2[ii] = 0; // unselect } if (select) { // remember last select location sa_lastx = sa_mousex; sa_lasty = sa_mousey; } if (sa_mode == sa_mode_mouse) { // no color matching, done Fpaint4(px-mrad,py-mrad,2*mrad,2*mrad,0); // repaint changed area return; } // find all colors within mouse radius and build table of mouse colors // and counts of pixels (nearly) matching these colors match1 = 0.01 * sa_colormatch; // user color match level, 0.01 to 1.0 match3 = match1 + 0.6 * (1.0 - match1); // level for combining colors Ntab = 0; // match color counts rad1 = mrad - 1; // mouse radius - 1 if (rad1 < 1) rad1 = 1; rad2 = rad1 * rad1; for (rx = -rad1; rx <= rad1; rx++) // find every pixel within mouse for (ry = -rad1; ry <= rad1; ry++) { if (rx * rx + ry * ry > rad2) continue; // outside mouse circle px = sa_mousex + rx; py = sa_mousey + ry; if (px < 1 || px > Fpxb->ww-2) continue; // off the image edge if (py < 1 || py > Fpxb->hh-2) continue; pix1 = PXBpix(Fpxb,px,py); red = pix1[0]; green = pix1[1]; blue = pix1[2]; for (ii = 0; ii < Ntab; ii++) { // see if color is already included match2 = RGBmatch(red,green,blue, // 0..1 = zero..perfect match Ctab[ii].rgb[0],Ctab[ii].rgb[1],Ctab[ii].rgb[2]); if (match2 >= match3) break; // matches table color within margin } if (ii < Ntab) { // average aggregated pixel color ff1 = Ctab[ii].count; ff2 = 1.0 / (ff1 + 1.0); Ctab[ii].rgb[0] = (Ctab[ii].rgb[0] * ff1 + red) * ff2; Ctab[ii].rgb[1] = (Ctab[ii].rgb[1] * ff1 + green) * ff2; Ctab[ii].rgb[2] = (Ctab[ii].rgb[2] * ff1 + blue) * ff2; Ctab[ii].count += 1; // count of pixels matching color } else { Ctab[ii].rgb[0] = red; // add unmatched pixel color to table Ctab[ii].rgb[1] = green; Ctab[ii].rgb[2] = blue; Ctab[ii].count = 1; Ntab++; if (Ntab == 1000) goto endmatch; // exit two nested loops } } endmatch: int keys[1][3] = { { 0, sizeof(int), 4 } }; // sort position, length, descending MemSort((ch *) Ctab, sizeof(Ctab_t), Ntab, keys, 1); // sort descending count of matching pixels thresh = 0.05 * Ntab; // exclude minority pixels if (thresh < 2) thresh = 2; for (ii = 0; ii < Ntab; ii++) if (Ctab[ii].count < thresh) break; Ntab = ii; // search pixels outside mouse radius but within range for matching colors srange2 = mrad * sa_searchrange; // search range (* mouse radius) srange2 = srange2 * srange2; // squared px = sa_mousex; // pixel at mouse py = sa_mousey; ii = Fpxb->ww * py + px; sa_pixselc[ii] = 1; // pixel is in current selection xlo = px - mrad; // track limits of changed area xhi = px + mrad; ylo = py - mrad; yhi = py + mrad; sa_stack[0] = ii; // put 1st pixel into stack sa_stackdirec[0] = 'a'; // direction = ahead sa_Nstack = 1; // stack count while (sa_Nstack) { kk = sa_Nstack - 1; // get last pixel in stack ii = sa_stack[kk]; direc = sa_stackdirec[kk]; py = ii / Fpxb->ww; // reconstruct px, py px = ii - Fpxb->ww * py; if (direc == 'x') { // no neighbors left to check sa_Nstack--; continue; } if (sa_Nstack > 1) { ii = sa_Nstack - 2; // get prior pixel in stack ii = sa_stack[ii]; ppy = ii / Fpxb->ww; ppx = ii - ppy * Fpxb->ww; } else { ppx = px - 1; // if only one, assume prior = left ppy = py; } if (direc == 'a') { // next ahead pixel npx = px + px - ppx; npy = py + py - ppy; sa_stackdirec[kk] = 'r'; // next search direction } else if (direc == 'r') { // next right pixel npx = px + py - ppy; npy = py + px - ppx; sa_stackdirec[kk] = 'l'; } else { /* direc = 'l' */ // next left pixel npx = px + ppy - py; npy = py + ppx - px; sa_stackdirec[kk] = 'x'; } if (npx < 0 || npx > Fpxb->ww-1) continue; // pixel off the edge if (npy < 0 || npy > Fpxb->hh-1) continue; ii = npy * Fpxb->ww + npx; if (sa_pixselc[ii]) continue; // already in current selection rx = npx - Mxposn; // limit search to ry = npy - Myposn; // mouse radius * search range rad2 = rx * rx + ry * ry; if (rad2 > srange2) continue; pix1 = PXBpix(Fpxb,npx,npy); // pixel at mouse for (kk = 0; kk < Ntab; kk++) { // compare pixel RGB to mouse colors match2 = PIXmatch(Ctab[kk].rgb,pix1); // 0..1 = zero..perfect match if (match2 >= match1) break; // good match, accept pixel } if (kk == Ntab) continue; // not within range of any color sa_pixselc[ii] = 1; // map pixel to current selection newpix = 0; if (select) { // select mode if (! sa_pixmap[ii]) { // if selected for the first time, sa_pixmap[ii] = sa_currseq; // map pixel to current sequence sa_Ncurrseq++; // current sequence pixel count newpix = 1; sa_pixmap2[ii] = 1; // pixel is mouse selected } } else if (sa_pixmap[ii]) { // unselect mode sa_pixmap[ii] = sa_pixmap2[ii] = 0; newpix = 1; } if (newpix) { if (npx < xlo) xlo = npx; // range of changed pixels if (npx > xhi) xhi = npx; if (npy < ylo) ylo = npy; if (npy > yhi) yhi = npy; } if (sa_Nstack == sa_maxstack) continue; // stack is full kk = sa_Nstack++; // push pixel into stack sa_stack[kk] = ii; sa_stackdirec[kk] = 'a'; // direction = ahead } Fpaint4(xlo,ylo,xhi-xlo+1,yhi-ylo+1,0); // repaint changed area return; } // set next sequence number for pixels about to be selected void sa_nextseq() { if (sa_Ncurrseq > 0) sa_currseq++; // increase only if some pixels mapped if (sa_currseq < sa_initseq) sa_currseq = sa_initseq; // start at initial value sa_Ncurrseq = 0; return; } // un-select all pixels mapped to current sequence number // reduce sequence number and set pixel count = 1 void sa_unselect_pixels(cairo_t *cr) { int px, py, xlo, xhi, ylo, yhi; int crflag = 0; xlo = Fpxb->ww; xhi = 0; ylo = Fpxb->hh; yhi = 0; if (sa_stat != sa_stat_edit) return; // area gone? if (! sa_currseq) return; // no pixels mapped if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } for (int ii = 0; ii < Fpxb->ww * Fpxb->hh; ii++) { if (sa_pixmap[ii] == sa_currseq) { sa_pixmap[ii] = sa_pixmap2[ii] = 0; // unmap current selection py = ii / Fpxb->ww; px = ii - Fpxb->ww * py; if (px < xlo) xlo = px; // range of changed pixels if (px > xhi) xhi = px; if (py < ylo) ylo = py; if (py > yhi) yhi = py; } } if (xhi >= xlo) Fpaint4(xlo,ylo,xhi-xlo+1,yhi-ylo+1,cr); // repaint changed area if (sa_currseq > sa_initseq) { // reduce sequence no. sa_currseq--; sa_Ncurrseq = 1; // unknown but > 0 } else sa_Ncurrseq = 0; // initial sequence no. reached if (crflag) draw_context_destroy(draw_context); return; } // allocate pixel maps for new select area void sa_pixmap_create() { int cc; cc = Fpxb->ww * Fpxb->hh * sizeof(uint16); sa_pixmap = (uint16 *) zmalloc(cc,"select-area"); // maps outside/edge/inside pixels cc = Fpxb->ww * Fpxb->hh * sizeof(uint8); sa_pixmap2 = (uint8 *) zmalloc(cc,"select-area"); // maps mouse-selected pixels return; } // Finish select area - map pixels enclosed by edge pixels // into sa_pixmap[ii]: 0/1/2 = outside/edge/inside (ii = py * Fww + px) // total count = sa_Npixel zdialog *sa_finzd = 0; // finish area zdialog int sa_fincancel; // finish area - user cancel int sa_finish_dialog_event(zdialog *zd, ch *event); // private functions void sa_finish_mousefunc(); void sa_finish_mappix(); void sa_finish_color(); void sa_finish() { ch *fmess = TX("Fill selected areas with color for visual verification. \n" "Method 1: left-click in each selected area not already filled. \n" "Method 2: right-click OUTSIDE all selected areas. \n" "Press [help] button for clarification"); int zstat, cc; printf("sa_finish() \n"); if (sa_stat == sa_stat_none) return; // no area? if (! sa_validate()) return; // invalid for current image sa_finish_auto(); // auto-finish mouse-selected areas if (sa_stat != sa_stat_fini) return; cc = Fpxb->ww * Fpxb->hh; if (sa_stackdirec) zfree(sa_stackdirec); sa_stackdirec = (ch *) zmalloc(cc,"select-area"); if (sa_stack) zfree(sa_stack); sa_stack = (int *) zmalloc(cc * sizeof(int),"select-area"); sa_maxstack = cc; sa_fincancel = 0; sa_Nstack = 0; /*** _________________________________________________________________ | Finish Area | | | | Fill selected areas with color for visual verification. | | Method 1: left-click in each selected area not already filled. | | Method 2: right-click OUTSIDE all selected areas. | | Press [help] button for clarification. | | | | [Help] [Keep] [Undo] | |_________________________________________________________________| ***/ sa_finzd = zdialog_new(TX("Finish Area"),Mwin, // dialog for user to click inside TX("Help"),TX("Keep"),TX("Undo"),null); zdialog_add_widget(sa_finzd,"hbox","hbmess","dialog",0,"space=3"); // each enclosed area zdialog_add_widget(sa_finzd,"label","fmess","hbmess",fmess,"space=5"); takeMouse(sa_finish_mousefunc,dragcursor); // connect mouse function zdialog_run(sa_finzd,sa_finish_dialog_event,"mouse"); // run dialog, wait for completion zstat = zdialog_wait(sa_finzd); zdialog_free(sa_finzd); sa_finzd = 0; freeMouse(); // disconnect mouse if (sa_stat == sa_stat_none) return; // area gone? if (zstat != 2) sa_fincancel = 1; // user cancel while (sa_Nstack) // wait for pixel search to complete zmainsleep(0.01); if (sa_fincancel) { // user cancel sa_unfinish(); // unmap interior pixels, set edit mode return; } sa_map_pixels(); // count pixels, map interior pixels if (sa_Npixel < 10) { // ignore tiny area zmessageACK(Mwin,TX("found %d pixels"),sa_Npixel); return; } sa_stat = sa_stat_fini; // area is finished areanumber++; // next sequential number sa_edgecalc_done = 0; // edge calculation is missing Fpaintnow(); return; } // dialog event and completion function int sa_finish_dialog_event(zdialog *zd, ch *event) { ch *fmess = TX( "Method 1: \n" "Left-click inside an outlined area that is not already filled. \n" "Area will be filled with color for visible verification. \n" "Gaps in the outline will cause overflow outside the area. \n" "Repeat for each outlined area that is not already filled. \n" "Method 2: \n" "Right-click outside ALL outlined areas. \n" "All areas will be filled with color for visible verification. \n" "Gaps in an area outline will cause that area not to be filled. \n" "Gaps in an area outline: \n" "Gaps must be closed before proceeding with edits. \n" "The Find Gap function can be used for this."); if (zd->zstat == 1) { // [help] zd->zstat = 0; // keep dialog active zmessageACK(Mwin,fmess); return 1; } if (zd->zstat == 2) return 0; // [keep] if (zd->zstat == 3) sa_unfinish(); // [undo] return 0; // [x] } // mouse function - get user clicks and perform pixel searches void sa_finish_mousefunc() { int ii, jj, px, py, npix; if (sa_stat == sa_stat_none) return; // area gone? if (! LMclick && ! RMclick) return; ii = Fpxb->ww * Myclick + Mxclick; // seed pixel from mouse click if (sa_pixmap[ii] == 1) return; // ignore if edge pixel sa_pixmap[ii] = 2; // map the pixel, inside area sa_stack[0] = ii; // put seed pixel into stack sa_stackdirec[0] = 'a'; // direction = ahead sa_Nstack = 1; // stack count // click inside one outlined area, select all pixels within outline if (LMclick) { LMclick = 0; sa_finish_mappix(); // do pixel search sa_finish_color(); // fill with color for user verify } // click outside all areas, select all pixels outside all outlines, then invert if (RMclick) { RMclick = 0; sa_finish_mappix(); // do pixel search npix = 0; for (py = 0; py < Fpxb->hh; py++) // loop all pixels for (px = 0; px < Fpxb->ww; px++) { ii = py * Fpxb->ww + px; if (sa_pixmap2[ii]) { // if mouse-selected pixel npix++; // no change continue; } jj = sa_pixmap[ii]; // 0/1/2+ = outside/edge/inside if (jj > 1) { // inside pixel (2+) sa_pixmap[ii] = 0; // is now outside (0) continue; } sa_pixmap[ii] = 2 - jj; // edge/outside (1/0) >> edge/inside (1/2) npix++; // count } sa_finish_color(); // fill with color for user verify sa_stat = sa_stat_fini; // area now finished sa_Npixel = npix; // new select area pixel count sa_edgecalc_done = 0; // edge calculation missing } return; } // function to map all pixels found within enclosure containing starting pixel void sa_finish_mappix() { int px, py, ii, jj, kk; int ppx, ppy, npx, npy; ch direc; printf("sa_finish_mappix() \n"); while (sa_Nstack) // find all pixels within enclosed area(s) { kk = sa_Nstack - 1; // get last pixel in stack ii = sa_stack[kk]; direc = sa_stackdirec[kk]; py = ii / Fpxb->ww; // reconstruct px, py px = ii - Fpxb->ww * py; if (direc == 'x') { // no neighbors left to check sa_Nstack--; continue; } if (sa_Nstack > 1) { jj = sa_Nstack - 2; // get prior pixel in stack jj = sa_stack[jj]; ppy = jj / Fpxb->ww; ppx = jj - ppy * Fpxb->ww; } else { ppx = px - 1; // if only one, assume prior = left ppy = py; } if (direc == 'a') { // next ahead pixel npx = px + px - ppx; npy = py + py - ppy; sa_stackdirec[kk] = 'r'; // next search direction } else if (direc == 'r') { // next right pixel npx = px + py - ppy; npy = py + px - ppx; sa_stackdirec[kk] = 'l'; } else { /* direc = 'l' */ // next left pixel npx = px + ppy - py; npy = py + ppx - px; sa_stackdirec[kk] = 'x'; } if (npx < 0 || npx >= Fpxb->ww || npy < 0 || npy >= Fpxb->hh) { // next pixel off image edge sa_pixmap[ii] = 1; // this pixel is edge pixel continue; } jj = npy * Fpxb->ww + npx; if (Fpxb->nc > 3 && PXBpix(Fpxb,npx,npy)[3] < 250) { // next pixel is in transparent area sa_pixmap[ii] = 1; // this pixel is edge pixel sa_pixmap[jj] = 1; // next pixel is edge pixel continue; } if (sa_pixmap[jj]) continue; // next pixel already mapped sa_pixmap[jj] = 2; // this pixel is interior pixel kk = sa_Nstack++; // put pixel into stack sa_stack[kk] = jj; sa_stackdirec[kk] = 'a'; // direction = ahead } sa_Nstack = 0; // done return; } // fill selected areas with color for user verification void sa_finish_color() { int ii, px, py; int npaint; cairo_t *cr; printf("sa_finish_color \n"); cr = draw_context_create(Fgdkwin,draw_context); npaint = 2.0 / Mscale + 1; // area fill, sparse for (py = 0; py < Fpxb->hh; py += npaint) // mark pixels inside area for (px = 0; px < Fpxb->ww; px += npaint) { ii = py * Fpxb->ww + px; if (sa_pixmap[ii]) draw_pixel(px,py,cr,1); // thin pixel } draw_context_destroy(draw_context); return; } // Finish select area automatically when the // interior selected pixels are already known. void sa_finish_auto() { printf("sa_finish_auto \n"); if (sa_stat == sa_stat_none) return; // no area? if (! sa_validate()) return; // invalid for current image sa_stat = sa_stat_edit; // area is unfinished sa_Npixel = 0; sa_map_pixels(); // map interior pixels if (sa_Npixel < 10) { zmessageACK(Mwin,TX("found %d pixels"),sa_Npixel); sa_clear(); return; } sa_stat = sa_stat_fini; // area is finished areanumber++; // next sequential number sa_edgecalc_done = 0; // edge calculation is missing Fpaint2(); return; } // private function // map edge and interior pixels (sa_pixmap[*] = 1 or 2) // set sa_Npixel = total pixel count void sa_map_pixels() { int npix, px, py, ii, kk; printf("sa_map_pixels \n"); if (sa_stat == sa_stat_none) return; // no area? sa_minx = Fpxb->ww; sa_maxx = 0; sa_miny = Fpxb->hh; sa_maxy = 0; npix = 0; for (ii = 0; ii < Fpxb->ww * Fpxb->hh; ii++) { if (! sa_pixmap[ii]) continue; // outside area npix++; // count pixels inside area py = ii / Fpxb->ww; // simplify px = ii - Fpxb->ww * py; if (px >= sa_maxx) sa_maxx = px+1; // get enclosing rectangle if (px < sa_minx) sa_minx = px; // (sa_maxx = last pixel + 1) if (py >= sa_maxy) sa_maxy = py+1; if (py < sa_miny) sa_miny = py; if (px == 0 || px == Fpxb->ww-1 || py == 0 || py == Fpxb->hh-1) // image edge goto edgepix; if (Fpxb->nc > 3 && PXBpix(Fpxb,px,py)[3] < 250) // transparency edge goto edgepix; if (! sa_pixmap[ii-1] || ! sa_pixmap[ii+1]) goto edgepix; // check 8 neighbor pixels kk = ii - Fpxb->ww; if (! sa_pixmap[kk-1] || ! sa_pixmap[kk] || ! sa_pixmap[kk+1]) goto edgepix; kk = ii + Fpxb->ww; if (! sa_pixmap[kk-1] || ! sa_pixmap[kk] || ! sa_pixmap[kk+1]) goto edgepix; sa_pixmap[ii] = 2; // interior pixel continue; edgepix: sa_pixmap[ii] = 1; // edge pixel } sa_Npixel = npix; // total pixel count sa_minx -= 10; // add margins where possible if (sa_minx < 0) sa_minx = 0; sa_maxx += 10; if (sa_maxx > Fpxb->ww) sa_maxx = Fpxb->ww; sa_miny -= 10; if (sa_miny < 0) sa_miny = 0; sa_maxy += 10; if (sa_maxy > Fpxb->hh) sa_maxy = Fpxb->hh; return; } // unfinish an area - unmap interior pixels and put back in edit mode void sa_unfinish() { int px, py, ii; printf("sa_unfinish \n"); for (py = 0; py < Fpxb->hh; py++) // loop all pixels for (px = 0; px < Fpxb->ww; px++) { ii = py * Fpxb->ww + px; // clear interior pixels found if (sa_pixmap2[ii]) continue; // (omit mouse selected pixels) if (sa_pixmap[ii] > 1) sa_pixmap[ii] = 0; // by finish search function } sa_stat = sa_stat_edit; // resume edit mode sa_edgecalc_done = 0; Fpaint2(); return; } /**************************************************************************************/ // Find the edge pixels surrounding the clicked pixel location. // Trace around the edge outline to see if there is a gap. void m_select_find_gap(GtkWidget *, ch *menu) { int sa_find_gap_dialog_event(zdialog *zd, ch *event); void sa_find_gap_mousefunc(); ch *fmess = TX("Click near any position on the area outline. \n" "Possible gaps in the outline will be found. \n" "Press F1 for help"); zdialog *zd; F1_help_topic = TX("FIND AREA GAP"); printf("m_select_find_gap \n"); if (FGM != 'F') return; if (! sa_stat) { zmessageACK(Mwin,TX("no select area")); // 26.8 return; } if (sa_finzd) zdialog_free(sa_finzd); // terminate finish dialog sa_map_pixels(); // find edge pixels if (! sa_Npixel) return; sa_show(1,0); // show area zd = zdialog_new(TX("find outline gap"),Mwin,"X",null); // dialog for user to click inside zdialog_add_widget(zd,"hbox","hbmess","dialog",0,"space=3"); // each enclosed area zdialog_add_widget(zd,"label","fmess","hbmess",fmess,"space=5"); zdialog_run(zd,sa_find_gap_dialog_event,"save"); // run dialog takeMouse(sa_find_gap_mousefunc,dragcursor); // connect mouse function return; } // dialog event and completion function int sa_find_gap_dialog_event(zdialog *zd, ch *event) { void sa_find_gap_mousefunc(); if (strmatch(event,"focus")) { takeMouse(sa_find_gap_mousefunc,dragcursor); // connect mouse function return 1; } if (! zd->zstat) return 1; // wait for completion if (Fbusy()) Fescape = 1; // 26.5 zdialog_free(zd); freeMouse(); // disconnect mouse return 1; } // mouse function - search area outline surrounding mouse click position void sa_find_gap_mousefunc() { int rad, ii, jj, kk, pix0; float angle, delay; int ww, hh, cc; int mx, my, px, py, rx, ry; ch *pixmark = 0; cairo_t *cr = 0; if (Fbusy()) return; // prevent re-entry if (sa_stat == sa_stat_none) return; if (! LMclick) return; // no left mouse click LMclick = 0; sa_map_pixels(); // find edge pixels if (! sa_Npixel) return; ww = Fpxb->ww; // image size hh = Fpxb->hh; mx = Mxclick; // mouse click position my = Myclick; if (mx == 0 || mx >= ww) return; // reject if image edge if (my == 0 || my >= hh) return; pix0 = -1; for (rad = 1; rad < 100; rad++) // loop radius = 1 - 100 pixels for (angle = 0; angle < 2*PI; angle += 0.7/rad) // loop angle = 0 - 360 degrees { px = mx + rad * cosf(angle); // search for nearest edge pixel py = my + rad * sinf(angle); ii = py * ww + px; if (sa_pixmap[ii] == 1) { pix0 = ii; goto break2; } } break2: if (pix0 == -1) { panelmessage(1,3,TX("cannot find area outline")); // no edge pixels was found 25.1 sa_show(1,0); // show area return; } m_zoom(0,"fit"); // unzoom, fit window 26.5 if (sa_stack) zfree(sa_stack); // allocate pixel stack memory cc = ww * hh; sa_stack = (int *) zmalloc(cc * sizeof(int),"select_area"); sa_Nstack = 0; sa_maxstack = cc; pixmark = (ch *) zmalloc(cc,"select_area"); // create pixel mark map memset(pixmark,0,cc); // clear all pixel marks cr = draw_context_create(Fgdkwin,draw_context); Fbusy(+1); delay = 0.001 + 2.0 / sa_Npixel; // speed inverse of outline size 25.0 sa_stack[0] = pix0; // put initial edge pixel into stack sa_Nstack = 1; // stack count while (sa_Nstack) // 26.5 { if (Fescape) break; // 26.0 kk = --sa_Nstack; // pull pixel from stack ii = sa_stack[kk]; pixmark[ii] = 1; // mark pixel py = ii / ww; px = ii - ww * py; draw_pixel(px,py,cr,2); // draw fat pixel zmainsleep(delay); // slow down for visibility for (ry = -1; ry <= +1; ry++) // find unmarked edge neighbor pixels for (rx = -1; rx <= +1; rx++) { if (py+ry <= 0 || py+ry >= hh-1) continue; // off the image edge if (px+rx <= 0 || px+rx >= ww-1) continue; jj = ii + ww * ry + rx; if (pixmark[jj]) continue; // omit marked pixel if (sa_pixmap[jj] == 1) { // neighbor is an unmarked edge pixel kk = sa_Nstack++; // add to stack sa_stack[kk] = jj; } } } Fbusy(-1); Fescape = 0; zfree(sa_stack); zfree(pixmark); sa_stack = 0; pixmark = 0; draw_context_destroy(draw_context); sa_show(1,0); } /**************************************************************************************/ // Manually blend selected parts of an edited area using the mouse. // Change pixels from E3 values to E1 values, gradually. namespace selectblend_names { editfunc EFselectblend; // edit function data int mode = 0; // 1/2 = area/edge blend int blendwidth = 0; // area edge blend width int blurwidth = 0; // area edge blur width int radius = 50; // mouse radius int Bcent = 50, Bedge = 0; // blend rates, mouse center and edge uint8 *distmap; // maps pixel distance to area edge } // menu function void m_select_blend(GtkWidget *, ch *menu) { using namespace selectblend_names; int selectblend_dialog_event(zdialog* zd, ch *event); void selectblend_mousefunc(); ch *helptext = TX("Left-drag mouse within the area \n" "to gradually undo area edits. \n" "Right-drag to restore edits. \n" "Drag along area edge to blend edge."); ch text[40]; F1_help_topic = TX("AREA BLEND"); printf("m_select_blend \n"); if (CEF) { zmessageACK(Mwin,TX("finish current edit first")); return; } if (! E0pxm) { zmessageACK(Mwin,TX("no current edit image")); return; } if (URS_pos < 1) { zmessageACK(Mwin,TX("no prior edit image")); return; } E9pxm = load_undo(URS_pos - 1); // image from prior edit if (! E9pxm) { printf("*** no prior edit image \n"); // should not happen return; } if (E9pxm->ww != E0pxm->ww || E9pxm->hh != E0pxm->hh) { // prior edit must be same size zmessageACK(Mwin,TX("Image dimensions have changed, \n" "Area Blend cannot be used")); PXM_free(E9pxm); return; } if (sa_stat < sa_stat_fini) { zmessageACK(Mwin,TX("select area missing or not finished")); return; } EFselectblend.menufunc = m_select_blend; EFselectblend.menuname = "Area Blend"; EFselectblend.mousefunc = selectblend_mousefunc; EFselectblend.Farea = 2; // use area if (! edit_setup(EFselectblend)) return; // initz. edit /*** _________________________________________ | Area Blend | | | | [x] Area Blend | | Left-drag mouse within the area to | | gradually undo area edits. | | Right-drag to restore edits. | | Drag along area edge to blend edge. | | use prior edit step [_______________|v] | | mouse radius [___] | // 2-999 | blend rate: center [___] edge [___] | // 0-100 | | | [x] Area Edge Blend | | blend edges: blend width [___] | | blur edges: blur width [___] | | | | [OK] [X] | |_________________________________________| ***/ zdialog *zd = zdialog_new(TX("Area Blend"),Mwin,"OK","X",null); CEF->zd = zd; zdialog_add_widget(zd,"check","areablend","dialog",TX("Area Blend"),"space=3"); // 25.0 zdialog_add_widget(zd,"hbox","hbtip","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labhelp","hbtip",helptext,"space=3"); zdialog_add_widget(zd,"hbox","hbstep","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labstep","hbstep",TX("use prior edit step:"),"space=3"); zdialog_add_widget(zd,"combo","editstep","hbstep",0,"space=3"); zdialog_add_widget(zd,"hbox","hbrad","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labrad","hbrad",TX("mouse radius:"),"space=3"); zdialog_add_widget(zd,"zspin","radius","hbrad","2|999|1|100","space=3"); zdialog_add_widget(zd,"hbox","hbblend","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labcenter","hbblend",TX("blend rate: center:"),"space=3"); zdialog_add_widget(zd,"zspin","Bcent","hbblend","0|100|1|50","space=3"); zdialog_add_widget(zd,"label","labedge","hbblend",TX("edge:"),"space=3"); zdialog_add_widget(zd,"zspin","Bedge","hbblend","0|100|1|0","space=3"); zdialog_add_widget(zd,"hbox","space","dialog",0,"space=6"); zdialog_add_widget(zd,"check","edgeblend","dialog",TX("Area Edge Blend"),"space=3"); // 25.0 zdialog_add_widget(zd,"hbox","hbblendall","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labrad","hbblendall",TX("blend edges: blend width:"),"space=3"); zdialog_add_widget(zd,"zspin","blendwidth","hbblendall","0|999|1|0","space=3"); zdialog_add_widget(zd,"hbox","hbblurall","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labrad","hbblurall",TX("blur edges: blur width:"),"space=3"); zdialog_add_widget(zd,"zspin","blurwidth","hbblurall","0|100|1|0","space=3"); for (int ii = 0; ii <= URS_pos - 1; ii++) { // prior edit steps > dropdown list snprintf(text,40,"%d %s",ii,URS_menu[ii]); // includes original image zdialog_stuff(zd,"editstep",text); // current = status before current edit } mode = 0; blendwidth = 0; // initial defaults radius = 100; Bcent = 50; Bedge = 0; zdialog_run(zd,selectblend_dialog_event,"save"); // run dialog - parallel return; } // selectblend dialog event and completion function int selectblend_dialog_event(zdialog *zd, ch *event) // selectblend dialog event function { using namespace selectblend_names; void selectblend_mousefunc(); void selectblend_blendwidth(); void selectblend_blurwidth(); ch text[40]; int nn; if (sa_stat < sa_stat_fini) { zmessageACK(Mwin,TX("select area missing or not finished")); zd->zstat = -2; } if (strmatch(event,"done")) zd->zstat = 1; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 2; // cancel if (zd->zstat) { if (zd->zstat == 1) edit_done(0); // complete edit else edit_cancel(0); freeMouse(); // disconnect mouse function return 1; } if (strstr("areablend editstep radius Bcent Bedge",event)) { // toggle mode checkboxes depending 25.0 mode = 1; // on selected widget edits zdialog_stuff(zd,"areablend",1); zdialog_stuff(zd,"edgeblend",0); } if (strstr("edgeblend blendwidth blurwidth",event)) { mode = 2; zdialog_stuff(zd,"areablend",0); zdialog_stuff(zd,"edgeblend",1); } if (strmatch(event,"editstep")) // select prior edit step { zdialog_fetch(zd,"editstep",text,40); // "nn menuname" nn = atoi(text); if (nn < 0 || nn > URS_max) return 1; if (E9pxm) PXM_free(E9pxm); E9pxm = load_undo(nn); // load prior edit output image if (! E9pxm) return 1; if (E9pxm->ww != Eww || E9pxm->hh != Ehh) { zmessageACK(Mwin,TX("Image dimensions have changed, \n" "this prior image cannot be used")); PXM_free(E9pxm); // free memory E9pxm = 0; return 1; } } zdialog_fetch(zd,"radius",radius); // mouse radius zdialog_fetch(zd,"Bcent",Bcent); // mouse blend rate center zdialog_fetch(zd,"Bedge",Bedge); // mouse blend rate edge zdialog_fetch(zd,"blendwidth",blendwidth); // edge blend distance zdialog_fetch(zd,"blurwidth",blurwidth); // edge blur distance if (mode == 1) takeMouse(selectblend_mousefunc,0); // paint blend 25.0 if (mode == 2) { freeMouse(); // process area edges 25.0 if (blendwidth) selectblend_blendwidth(); if (blurwidth) selectblend_blurwidth(); CEF->Fmods++; // 25.0 CEF->Fsaved = 0; } return 1; } // mouse function - called for mouse events inside image void selectblend_mousefunc() { using namespace selectblend_names; int ii, rx, ry; int radius2, rad2; int px, py, ww, hh; float *pix1, *pix3, *pix9; float Fdist, Pcenter, Pedge, power; float f1, f3, f9; Pcenter = 0.01 * Bcent; // blend power at mouse center, 0...1.0 Pedge = 0.01 * Bedge; // blend power at mouse edge, 0...1.0 if (! CEF || sa_stat < sa_stat_fini || ! E9pxm) return; draw_mousecircle(Mxposn,Myposn,radius,0,0); // show mouse selection circle if (! Mxdrag && ! Mydrag) return; // wait for drag event Mxdrag = Mydrag = 0; // neutralize drag radius2 = radius * radius; for (rx = -radius; rx <= radius; rx++) // loop every pixel in mouse for (ry = -radius; ry <= radius; ry++) { rad2 = rx * rx + ry * ry; if (rad2 > radius2) continue; // outside radius px = Mxposn + rx; py = Myposn + ry; if (px < 0 || px > Eww-1) continue; // off the image edge if (py < 0 || py > Ehh-1) continue; ii = py * Eww + px; if (! sa_pixmap[ii]) continue; // not within area Fdist = sqrt(rad2); // px/py distance from mouse center Fdist = Fdist / radius; // scale 0...1.0 power = Pcenter + (Pedge - Pcenter) * Fdist; // blend power at this pixel, 0...1.0 power = pow(power,1.5); // curve it if (Mbutton == 1) { // left drag, blend f9 = 0.1 * power; // reduce rate of change f3 = 1.0 - f9; pix9 = PXMpix(E9pxm,px,py); pix3 = PXMpix(E3pxm,px,py); pix3[0] = f9 * pix9[0] + f3 * pix3[0]; // edit image tends to prior edit image pix3[1] = f9 * pix9[1] + f3 * pix3[1]; pix3[2] = f9 * pix9[2] + f3 * pix3[2]; } if (Mbutton == 3) { // right drag, undo blend f1 = 0.2 * power; f3 = 1.0 - f1; pix1 = PXMpix(E1pxm,px,py); pix3 = PXMpix(E3pxm,px,py); pix3[0] = f1 * pix1[0] + f3 * pix3[0]; // edit image tends to input image pix3[1] = f1 * pix1[1] + f3 * pix3[1]; pix3[2] = f1 * pix1[2] + f3 * pix3[2]; } } px = Mxposn - radius - 1; // repaint modified area py = Myposn - radius - 1; ww = hh = 2 * radius + 3; Fpaint3(px,py,ww,hh,0); draw_mousecircle(Mxposn,Myposn,radius,0,0); // show mouse selection circle CEF->Fmods++; CEF->Fsaved = 0; return; } // apply edge blend width to all area edges void selectblend_blendwidth() { using namespace selectblend_names; int px, py, ii, dist; float *pix1, *pix3, *pix9; float f1, f9, blend; if (! CEF || sa_stat < sa_stat_fini || ! E9pxm) return; sa_edgecalc(); // calc. area pixel edge distances Fbusy(+1); for (py = sa_miny; py < sa_maxy; py++) for (px = sa_minx; px < sa_maxx; px++) { ii = py * Eww + px; dist = sa_pixmap[ii]; if (! dist) continue; // outside area blend = 1.0 * (blendwidth - dist) / blendwidth; // edge pixel --> blend = 1.0 if (blend < 0) continue; // edge distance > blend width f9 = blend; f1 = 1.0 - f9; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel pix9 = PXMpix(E9pxm,px,py); // blend pixel pix3[0] = f1 * pix1[0] + f9 * pix9[0]; pix3[1] = f1 * pix1[1] + f9 * pix9[1]; pix3[2] = f1 * pix1[2] + f9 * pix9[2]; } Fbusy(-1); CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return; } // apply edge blur width to all area edges void selectblend_blurwidth() { using namespace selectblend_names; void * selectblend_wthread1(void *); void * selectblend_wthread2(void *); int cc; if (! CEF || sa_stat < sa_stat_fini || ! E9pxm) return; sa_edgecalc(); // calc. area pixel edge distances Fbusy(+1); cc = Eww * Ehh; distmap = (uint8 *) zmalloc(cc,"selectblend"); // initz. max. pixel distance memset(distmap,255,cc); do_wthreads(selectblend_wthread1,NSMP); // do worker threads do_wthreads(selectblend_wthread2,NSMP); zfree(distmap); Fbusy(-1); CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return; } // worker thread 1 - map all pixels within blur width of area edge // threads collide on updates to distmap[], but seems to work fine void * selectblend_wthread1(void *arg) { using namespace selectblend_names; int index = *((int *) arg); int px, py, qx, qy, ii; int dist, bw; float rad; bw = blurwidth; for (py = sa_miny + index; py < sa_maxy; py += NSMP) // loop all area edge pixels px/py for (px = sa_minx; px < sa_maxx; px++) { ii = py * Eww + px; dist = sa_pixmap[ii]; if (dist != 1) continue; // not edge pixel for (qy = py-bw; qy <= py+bw; qy++) // loop all pixels qx/qy for (qx = px-bw; qx <= px+bw; qx++) // within blur width of px/py { if (qy < 0 || qy > Ehh-1) continue; // skip if off image if (qx < 0 || qx > Eww-1) continue; rad = sqrtf((qx-px) * (qx-px) + (qy-py) * (qy-py)); // qx/qy distance from px/py ii = qy * Eww + qx; dist = distmap[ii]; if (rad < dist) distmap[ii] = rad + 0.5; // save shortest distance to edge } } return 0; } // worker thread 2 - compute blur for all mapped pixels void * selectblend_wthread2(void *arg) { using namespace selectblend_names; int index = *((int *) arg); int px, py, qx, qy, ii; int dist, bw, npix; float F1, F2; float R, G, B; float *pix1, *pix3; bw = blurwidth; for (py = index; py < Ehh; py += NSMP) // loop all pixels px/py for (px = 0; px < Eww; px++) // < blur width from edge { ii = py * Eww + px; dist = distmap[ii]; if (dist > bw) continue; // not within blur width npix = 0; R = G = B = 0; for (qy = py-bw; qy <= py+bw; qy++) // loop all pixels qx/qy for (qx = px-bw; qx <= px+bw; qx++) // within blur width of px/py { if (qy < 0 || qy > Ehh-1) continue; // skip if off image if (qx < 0 || qx > Eww-1) continue; pix1 = PXMpix(E1pxm,qx,qy); // sum RGB for all pixels R += pix1[0]; G += pix1[1]; B += pix1[2]; npix++; } R = R / npix; // average RGB within blur width G = G / npix; B = B / npix; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel to blur F1 = 1.0 * dist / bw; // edge distance, 0 .. 1 = blur width F2 = 1 - F1; pix3[0] = F1 * pix1[0] + F2 * R; // blur = max at edge, 0 at blur width pix3[1] = F1 * pix1[1] + F2 * G; pix3[2] = F1 * pix1[2] + F2 * B; } return 0; } /**************************************************************************************/ // menu function for show, hide, enable, disable, invert, clear // (also implemented as buttons in select area dialog) void m_select_show(GtkWidget *, ch *menu) { F1_help_topic = TX("SHOW/HIDE AREA"); printf("m_select_show \n"); if (FGM != 'F') return; sa_show(1,0); // show area return; } void m_select_hide(GtkWidget *, ch *menu) { F1_help_topic = TX("SHOW/HIDE AREA"); printf("m_select_hide \n"); if (FGM != 'F') return; sa_show(0,0); return; } void m_select_enable(GtkWidget *, ch *menu) { F1_help_topic = TX("ENABLE/DISABLE AREA"); printf("m_select_enable \n"); if (FGM != 'F') return; sa_enable(); return; } void m_select_disable(GtkWidget *, ch *menu) { F1_help_topic = TX("ENABLE/DISABLE AREA"); printf("m_select_disable \n"); if (FGM != 'F') return; sa_disable(); return; } void m_select_invert(GtkWidget *, ch *menu) { F1_help_topic = TX("INVERT AREA"); printf("m_select_invert \n"); if (FGM != 'F') return; sa_invert(); return; } void m_select_clear(GtkWidget *, ch *menu) // delete the area { F1_help_topic = TX("CLEAR AREA"); printf("m_select_clear \n"); if (FGM != 'F') return; sa_clear(); return; } /**************************************************************************************/ // show or hide outline of select area // also called from Fpaint() if Fshowarea = 1 // edges are detected independently of sa_pixmap[] void sa_show(int flag, cairo_t *cr) { int px, py, ii, kk; int crflag = 0; if (sa_stat == sa_stat_none) return; // no area if (! sa_validate()) return; // invalid for current image Fshowarea = flag; // flag for Fpaint*() if (! flag) { Fpaint2(); // erase area outline return; } if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } for (ii = 0; ii < Fpxb->ww * Fpxb->hh; ii++) { if (! sa_pixmap[ii]) continue; py = ii / Fpxb->ww; px = ii - Fpxb->ww * py; if (px == 0 || px == Fpxb->ww-1 || py == 0 || py == Fpxb->hh-1) // edge of image continue; if (Fpxb->nc > 3 && PXBpix(Fpxb,px,py)[3] < 250) // transparency edge continue; if (! sa_pixmap[ii-1] || ! sa_pixmap[ii+1]) goto edgepix; // check 8 neighbor pixels kk = ii - Fpxb->ww; if (! sa_pixmap[kk] || ! sa_pixmap[kk-1] || ! sa_pixmap[kk+1]) goto edgepix; kk = ii + Fpxb->ww; if (! sa_pixmap[kk] || ! sa_pixmap[kk-1] || ! sa_pixmap[kk+1]) goto edgepix; continue; edgepix: draw_pixel(px,py,cr); } if (crflag) draw_context_destroy(draw_context); return; } // Show the area outline only within a rectangular section. // Improve responsiveness during user mouse-driven updates. // Also called by Fpaint4() after a sectional edit is applied. void sa_show_rect(int px1, int py1, int ww, int hh, cairo_t *cr) { int px, py, px2, py2, ii, kk; int crflag = 0; if (! Fshowarea) return; if (sa_stat == sa_stat_none) return; // no area if (! sa_validate()) return; // invalid for current image px2 = px1 + ww; py2 = py1 + hh; if (px1 < 0) px1 = 0; if (py1 < 0) py1 = 0; if (px2 > Fpxb->ww) px2 = Fpxb->ww; if (py2 > Fpxb->hh) py2 = Fpxb->hh; if (! cr) { cr = draw_context_create(Fgdkwin,draw_context); crflag = 1; } for (py = py1; py < py2; py++) // loop pixels in rectangle for (px = px1; px < px2; px++) { ii = Fpxb->ww * py + px; if (! sa_pixmap[ii]) continue; if (px == 0 || px == Fpxb->ww-1 || py == 0 || py == Fpxb->hh-1) // edge of image continue; if (Fpxb->nc > 3 && PXBpix(Fpxb,px,py)[3] < 250) // transparency edge continue; if (! sa_pixmap[ii-1] || ! sa_pixmap[ii+1]) goto edgepix; // check 8 neighbor pixels kk = ii - Fpxb->ww; if (! sa_pixmap[kk] || ! sa_pixmap[kk-1] || ! sa_pixmap[kk+1]) goto edgepix; kk = ii + Fpxb->ww; if (! sa_pixmap[kk] || ! sa_pixmap[kk-1] || ! sa_pixmap[kk+1]) goto edgepix; continue; edgepix: draw_pixel(px,py,cr); } if (crflag) draw_context_destroy(draw_context); return; } // validate an area for use in the current image. // returns 1 if OK, 0 if not (area will have been deleted). int sa_validate() { int ww = 0, hh = 0; if (sa_stat == sa_stat_none) return 0; // no area if (! curr_file || (CEF && CEF->Fpreview)) { // no image file or edit preview image sa_clear(); return 0; } if (E1pxm) { ww = E1pxm->ww; hh = E1pxm->hh; } else if (E0pxm) { ww = E0pxm->ww; hh = E0pxm->hh; } else { ww = Fpxb->ww; hh = Fpxb->hh; } if (sa_fww == ww && sa_fhh == hh) return 1; sa_clear(); return 0; } // enable select area that was disabled void sa_enable() { if (sa_stat == sa_stat_none) return; // no area if (! sa_validate()) return; // invalid for current image if (sa_stat < sa_stat_fini) { // finished or finished/disabled zmessageACK(Mwin,TX("area is not finished")); return; } sa_stat = sa_stat_fini; // finished/enabled areanumber++; // next sequential number sa_show(1,0); // show area return; } // disable select area void sa_disable() { if (sa_stat == sa_stat_none) return; // no area if (sa_stat < sa_stat_fini) { zmessageACK(Mwin,TX("area is not finished")); return; } sa_stat = sa_stat_disab; // finished/disabled sa_show(0,0); // hide area return; } // invert a selected area void sa_invert() { int ii, jj, px, py, npix; if (sa_stat == sa_stat_none) return; // no area if (! sa_validate()) return; // invalid for current image if (sa_stat < sa_stat_fini) { zmessageACK(Mwin,TX("area is not finished")); return; } sa_minx = Fpxb->ww; // get new enclosing rectangle sa_maxx = 0; sa_miny = Fpxb->hh; sa_maxy = 0; npix = 0; for (py = 0; py < Fpxb->hh; py++) // loop all pixels for (px = 0; px < Fpxb->ww; px++) { ii = py * Fpxb->ww + px; jj = sa_pixmap[ii]; // 0/1/2+ = outside/edge/inside if (jj > 1) { // inside pixel (2+) sa_pixmap[ii] = 0; // is now outside (0) continue; } sa_pixmap[ii] = 2 - jj; // edge/outside (1/0) >> edge/inside (1/2) npix++; // count if (px >= sa_maxx) sa_maxx = px + 1; if (px < sa_minx) sa_minx = px; if (py >= sa_maxy) sa_maxy = py + 1; if (py < sa_miny) sa_miny = py; } sa_minx -= 10; // add margins where possible if (sa_minx < 0) sa_minx = 0; sa_maxx += 10; if (sa_maxx > Fpxb->ww) sa_maxx = Fpxb->ww; sa_miny -= 10; if (sa_miny < 0) sa_miny = 0; sa_maxy += 10; if (sa_maxy > Fpxb->hh) sa_maxy = Fpxb->hh; sa_stat = sa_stat_fini; // if disabled, now finished sa_Npixel = npix; // new select area pixel count sa_edgecalc_done = 0; // edge calculation missing sa_show(1,0); // show area return; } // clear current area (delete the area) void sa_clear() { if (Fbusy()) return; // 26.0 sa_stat = sa_Npixel = sa_edgecalc_done = 0; sa_currseq = sa_Ncurrseq = 0; sa_fww = sa_fhh = 0; if (sa_pixmap) zfree(sa_pixmap); if (sa_pixmap2) zfree(sa_pixmap2); if (sa_stack) zfree(sa_stack); if (sa_stackdirec) zfree(sa_stackdirec); if (sa_pixselc) zfree(sa_pixselc); sa_pixmap = 0; sa_pixmap2 = 0; sa_stack = 0; sa_stackdirec = 0; sa_Nstack = 0; sa_pixselc = 0; Fpaint2(); return; } // compute distance from all pixels in area to nearest edge // output: sa_pixmap[*] = 0/1/2+ = outside, edge, inside distance from edge namespace sa_edgecalc_names { uint16 *sa_edgepx, *sa_edgepy, *sa_edgedist; int sa_Nedge; int edgecalc_threadbusy = 0; } void sa_edgecalc() { using namespace sa_edgecalc_names; void * edgecalc_thread(void *arg); int ii, nn, cc, px, py; if (edgecalc_threadbusy) return; // should not happen 26.0 if (sa_stat == sa_stat_none) return; // area gone? if (sa_edgecalc_done) return; // done already if (sa_stat != sa_stat_fini) return; // area must be finished/enabled if (sa_edgecalc_busy) return; // stop re-entry sa_edgecalc_busy = 1; panelmessage(0,0,TX("edge distance calculation")); // 25.1 cc = Fpxb->ww * Fpxb->hh * sizeof(uint16); // allocate memory for calculations sa_edgedist = (uint16 *) zmalloc(cc,"select_area"); for (ii = nn = 0; ii < Fpxb->ww * Fpxb->hh; ii++) // count edge pixels in select area if (sa_pixmap[ii] == 1) nn++; cc = nn * sizeof(uint16); sa_edgepx = (uint16 *) zmalloc(cc,"select_area"); // allocate memory sa_edgepy = (uint16 *) zmalloc(cc,"select_area"); for (ii = nn = 0; ii < Fpxb->ww * Fpxb->hh; ii++) // build list of edge pixels { if (sa_pixmap[ii] != 1) continue; py = ii / Fpxb->ww; px = ii - py * Fpxb->ww; if (px == 0 || px == Fpxb->ww-1) continue; // omit edge pixels if (py == 0 || py == Fpxb->hh-1) continue; if (Fpxb->nc > 3) { // omit pixels at transparency edge if (PXBpix(Fpxb,px-1,py)[3] < 250) continue; if (PXBpix(Fpxb,px, py)[3] < 250) continue; if (PXBpix(Fpxb,px+1,py)[3] < 250) continue; if (PXBpix(Fpxb,px-1,py-1)[3] < 250) continue; if (PXBpix(Fpxb,px, py-1)[3] < 250) continue; if (PXBpix(Fpxb,px+1,py-1)[3] < 250) continue; if (PXBpix(Fpxb,px-1,py+1)[3] < 250) continue; if (PXBpix(Fpxb,px, py+1)[3] < 250) continue; if (PXBpix(Fpxb,px+1,py+1)[3] < 250) continue; } sa_edgepx[nn] = px; sa_edgepy[nn] = py; nn++; } sa_Nedge = nn; progress_setgoal(sa_Npixel); // progress counter goal Fescape = 0; edgecalc_threadbusy = 1; start_detached_thread(edgecalc_thread,0); while (edgecalc_threadbusy) zmainsleep(0.1); progress_setgoal(0); panelmessage(0); zfree(sa_edgedist); // free memory zfree(sa_edgepx); zfree(sa_edgepy); sa_edgecalc_busy = 0; Fescape = 0; return; } void * edgecalc_thread(void *arg) // edgecalc thread function { using namespace sa_edgecalc_names; void * edgecalc_wthread(void *arg); do_wthreads(edgecalc_wthread,NSMP); // do worker threads if (! Fescape) // not canceled { for (int ii = 0; ii < Fpxb->ww * Fpxb->hh; ii++) { // copy sa_edgedist[] to sa_pixmap[] if (sa_pixmap[ii] <= 1) continue; // skip outside and edge pixels sa_pixmap[ii] = sa_edgedist[ii]; // interior pixel edge distance } sa_edgecalc_done = 1; // edge calc. done } edgecalc_threadbusy = 0; return 0; } void * edgecalc_wthread(void *arg) // edgecalc worker thread function { using namespace sa_edgecalc_names; void edgecalc_func(int px, int py); int index = *((int *) arg); int midx, midy, radx, rady, rad; int ii, px, py; midx = (sa_maxx + sa_minx) / 2; midy = (sa_maxy + sa_miny) / 2; radx = (sa_maxx - sa_minx) / 2 + 1; rady = (sa_maxy - sa_miny) / 2 + 1; px = midx; // center of enclosing rectangle py = midy; ii = py * Fpxb->ww + px; if (sa_pixmap[ii]) edgecalc_func(px,py); // do center pixel first for (rad = 1; rad < radx || rad < rady; rad++) // expanding square from the center { for (px = midx-rad; px <= midx+rad; px += 2 * rad) // edges only, interior already done for (py = midy-rad+index; py <= midy+rad; py += NSMP) { if (px < 0 || px > Fpxb->ww-1) continue; if (py < 0 || py > Fpxb->hh-1) continue; ii = py * Fpxb->ww + px; if (! sa_pixmap[ii]) continue; if (sa_edgedist[ii]) continue; edgecalc_func(px,py); if (Fescape) return 0; // killed } for (py = midy-rad; py <= midy+rad; py += 2 * rad) for (px = midx-rad+index; px <= midx+rad; px += NSMP) { if (px < 0 || px > Fpxb->ww-1) continue; if (py < 0 || py > Fpxb->hh-1) continue; ii = py * Fpxb->ww + px; if (! sa_pixmap[ii]) continue; if (sa_edgedist[ii]) continue; edgecalc_func(px,py); if (Fescape) return 0; // killed } } return 0; } // Find the nearest edge pixel for a given pixel. // For all pixels in a line from the given pixel to the edge pixel, // the same edge pixel is used to compute edge distance. void edgecalc_func(int px1, int py1) { using namespace sa_edgecalc_names; int ii, px2, py2, mindist; uint dist2, mindist2; int epx, epy, pxm, pym, dx, dy, inc; int ww = Fpxb->ww, hh = Fpxb->hh; int cc = ww * hh; float slope; mindist = 9999; mindist2 = mindist * mindist; epx = epy = 0; for (ii = 0; ii < sa_Nedge; ii++) // loop all edge pixels { // (ii += 2 tried, buggy) px2 = sa_edgepx[ii]; py2 = sa_edgepy[ii]; dx = px2 - px1; dy = py2 - py1; dist2 = dx*dx + dy*dy; // avoid sqrt() if (dist2 < mindist2) { mindist2 = dist2; // remember minimum epx = px2; // remember nearest edge pixel epy = py2; } } if (abs(epy - py1) > abs(epx - px1)) { // find all pixels along a line slope = 1.0 * (epx - px1) / (epy - py1); // to the edge pixel if (epy > py1) inc = 1; else inc = -1; for (pym = py1; pym != epy; pym += inc) { pxm = px1 + slope * (pym - py1); ii = pym * ww + pxm; if (ii < 0 || ii >= cc) { printf("*** edgecalc() error %d \n",ii); return; } if (sa_edgedist[ii]) return; dx = epx - pxm; // calculate distance to edge dy = epy - pym; dist2 = sqrt(dx*dx + dy*dy) + 1; sa_edgedist[ii] = dist2; // save progress_addvalue(1); // track progress } } else { slope = 1.0 * (epy - py1) / (epx - px1); if (epx > px1) inc = 1; else inc = -1; for (pxm = px1; pxm != epx; pxm += inc) { pym = py1 + slope * (pxm - px1); ii = pym * ww + pxm; if (ii < 0 || ii >= cc) { printf("*** edgecalc() error %d \n",ii); return; } if (sa_edgedist[ii]) return; dx = epx - pxm; dy = epy - pym; dist2 = sqrt(dx*dx + dy*dy) + 1; sa_edgedist[ii] = dist2; progress_addvalue(1); } } return; } // adjust area edge 1 pixel out (+) or in (-) void sa_edgecreep(int kk) { int px, py, ii, jj; if (sa_stat != sa_stat_fini) { zmessageACK(Mwin,TX("area is not finished")); return; } for (py = sa_miny; py < sa_maxy; py++) // find all area edge pixels for (px = sa_minx; px < sa_maxx; px++) { ii = Fpxb->ww * py + px; if (sa_pixmap[ii] != 1) continue; if (px == 0 || px == Fpxb->ww-1 || py == 0 || py == Fpxb->hh-1) // edge of image, no change continue; if (kk < 0) { // shrink area sa_pixmap[ii] = 0; continue; } sa_pixmap[ii-1] = sa_pixmap[ii+1] = 2; // expand area jj = ii - Fpxb->ww; sa_pixmap[jj] = sa_pixmap[jj-1] = sa_pixmap[jj+1] = 2; // mark 8 neighbor pixels in area jj = ii + Fpxb->ww; sa_pixmap[jj] = sa_pixmap[jj-1] = sa_pixmap[jj+1] = 2; } sa_map_pixels(); // remap edge and interior pixels sa_finish_auto(); // finish area again sa_show(1,0); // show area sa_edgecalc_done = 0; // invalidate prior edge calc. Fpaint2(); return; } // finish select area after edits on entire image but only select area is wanted // pixels outside select area are copied from E1 to E3 void sa_postfix() { int ii, px, py, dist, pcc; float *pix1, *pix3; if (sa_stat != sa_stat_fini) return; pcc = E3pxm->nc * sizeof(float); for (py = 0; py < Ehh; py++) for (px = 0; px < Eww; px++) { if (Fescape) break; pix1 = PXMpix(E1pxm,px,py); // E1 input pixel pix3 = PXMpix(E3pxm,px,py); // E3 output pixel ii = py * Eww + px; dist = sa_pixmap[ii]; // pixel distance from area edge if (dist == 0) { // pixel is outside area memcpy(pix3,pix1,pcc); // use E1 pixel continue; } } return; } /************************************************************************************** select area copy/paste and load/save - select area <--> disk file ***************************************************************************************/ namespace sa_diskfile { PXM *sacp_pxm = 0; // select area pixmap image int sacp_ww, sacp_hh; // original dimensions PXM *sacpR_pxm = 0; // rescaled/rotated image int sacpR_ww, sacpR_hh; // rescaled/rotated dimensions float sacp_scale; // scale, 1.0 = original size float sacp_angle; // angle of rotation, -180 to +180 int sacp_fliphorz; // flip horizontal int sacp_flipvert; // flip vertical int sacp_orgx, sacp_orgy; // origin in target image int sacp_porg = 0; // pasted area is present int sacp_porgx, sacp_porgy; // pasted area origin in image int sacp_pww, sacp_phh; // pasted area dimensions editfunc EFpaste; } // Save a select area in memory to a disk PNG file. // For menu "Copy" use default file: ~/.fotocx/saved_areas/copied_area.png // For menu "Save Area" use file name from user input. void m_select_copy(GtkWidget *, ch *) { printf("m_select_copy \n"); select_copysave(0,"copy"); return; } void m_select_save(GtkWidget *, ch *) { printf("m_select_save \n"); select_copysave(0,"save"); return; } void select_copysave(GtkWidget *, ch *menu) { using namespace sa_diskfile; int ii, px1, py1, px2, py2, dist; int ww, nc, pcc; float *pix1, *pix2; ch *pp, *file; ch filename[200]; if (strmatch(menu,"copy")) F1_help_topic = TX("COPY/PASTE AREA"); else if (strmatch(menu,"save")) F1_help_topic = TX("LOAD/SAVE AREA"); else printf("*** F1 topic error \n"); if (FGM != 'F') return; if (sa_stat == sa_stat_none) return; // no selected area if (sa_stat < sa_stat_fini) { zmessageACK(Mwin,TX("area is not finished")); return; } if (! E0pxm) { // get poss. 16-bit image E0pxm = PXM_load(curr_file,1); if (! E0pxm) return; } ww = E0pxm->ww; nc = E0pxm->nc; pcc = nc * sizeof(float); PXM_free(sacp_pxm); // free prior if any PXM_free(sacpR_pxm); sacp_ww = sa_maxx - sa_minx; // new area image PXM sacp_hh = sa_maxy - sa_miny; sacp_pxm = PXM_make(sacp_ww,sacp_hh,4); // alpha channel for (py2 = 0; py2 < sacp_hh; py2++) // loop area pixels for (px2 = 0; px2 < sacp_ww; px2++) { px1 = px2 + sa_minx; py1 = py2 + sa_miny; pix1 = PXMpix(E0pxm,px1,py1); // copy to area PXM pix2 = PXMpix(sacp_pxm,px2,py2); memcpy(pix2,pix1,pcc); // copy RGB(A) data ii = py1 * ww + px1; dist = sa_pixmap[ii]; // 0/1/2+ = outside/edge/inside edge dist. if (dist == 0) pix2[3] = 0; // outside pixel, transparent else pix2[3] = 255; // edge or inside, opaque } if (strmatch(menu,"copy")) { snprintf(filename,200,"%s/copied_area.png",saved_areas_folder); // save to default PNG file PXM_PNG_save(sacp_pxm,filename,16); return; } pp = zgetfile(TX("save area as a PNG file"),MWIN,"save",saved_areas_folder); // get file name from user if (! pp) return; file = zstrdup(pp,"select_area",8); zfree(pp); pp = strrchr(file,'/'); pp = strcasestr(pp,".png"); if (! pp) strcat(file,".png"); PXM_PNG_save(sacp_pxm,file,16); // use PNG-16 file zfree(file); return; } // Read a select area from a disk PNG file. void m_select_load(GtkWidget *, ch *menu) { using namespace sa_diskfile; void select_paste(GtkWidget *, ch *); PXM *pxmtemp; ch *file; float *pix1, *pix2; int px, py, nc, pcc; F1_help_topic = TX("LOAD/SAVE AREA"); printf("m_select_load \n"); if (FGM != 'F') return; PXM_free(sacp_pxm); // free prior if any PXM_free(sacpR_pxm); file = select_1file(saved_areas_folder); // use thumbnail selection if (! file) return; pxmtemp = PXM_load(file,1); // load image file zfree(file); if (! pxmtemp) return; nc = pxmtemp->nc; pcc = nc * sizeof(float); // 3 or 4 channels, RGB or RGBA sacp_ww = pxmtemp->ww; // image dimensiona sacp_hh = pxmtemp->hh; sacp_pxm = PXM_make(sacp_ww,sacp_hh,4); // alpha channel for (py = 0; py < sacp_hh; py++) for (px = 0; px < sacp_ww; px++) { pix1 = PXMpix(pxmtemp,px,py); pix2 = PXMpix(sacp_pxm,px,py); memcpy(pix2,pix1,pcc); // copy all channels if (nc < 4) pix2[3] = 255; // no alpha, all pixels opaque } PXM_free(pxmtemp); select_paste(0,"paste area"); // interactive move/rescale area image return; } // paste the area last copied on to the current image // uses the default file from "copy area" menu (above) void m_select_paste(GtkWidget *, ch *menu) { using namespace sa_diskfile; void select_paste(GtkWidget *, ch *); PXM *pxmtemp; ch filename[200]; float *pix1, *pix2; int px, py, nc, pcc; F1_help_topic = TX("COPY/PASTE AREA"); printf("m_select_paste \n"); if (FGM != 'F') return; PXM_free(sacp_pxm); // free prior if any PXM_free(sacpR_pxm); snprintf(filename,200,"%s/copied_area.png",saved_areas_folder); pxmtemp = PXM_load(filename,1); // load image file if (! pxmtemp) return; nc = pxmtemp->nc; pcc = nc * sizeof(float); sacp_ww = pxmtemp->ww; // image dimensiona sacp_hh = pxmtemp->hh; sacp_pxm = PXM_make(sacp_ww,sacp_hh,4); // alpha channel for (py = 0; py < sacp_hh; py++) for (px = 0; px < sacp_ww; px++) { pix1 = PXMpix(pxmtemp,px,py); pix2 = PXMpix(sacp_pxm,px,py); memcpy(pix2,pix1,pcc); // copy all channels if (nc < 4) pix2[3] = 255; // no alpha, all pixels opaque } PXM_free(pxmtemp); select_paste(0,"paste area"); // interactive move/rescale area image return; } // paste select area in memory into current image // this is an edit function - select area image is copied into main image void select_paste(GtkWidget *, ch *menu) { using namespace sa_diskfile; void select_paste_image(); int select_paste_dialog_event(zdialog *, ch *event); void select_paste_mousefunc(); ch *dragmess = TX("position with mouse click/drag"); if (! sacp_pxm) return; // nothing to paste sa_clear(); // clear area if present EFpaste.menufunc = select_paste; EFpaste.menuname = "paste area"; if (! edit_setup(EFpaste)) return; // setup edit for paste sacp_scale = 1.0; // size = 1x sacp_angle = 0; // angle = 0 sacp_fliphorz = sacp_flipvert = 0; // not flipped sacp_porg = 0; // no image paste location yet PXM_free(sacpR_pxm); // free prior if any if (sacp_ww > E0pxm->ww) // if paste image > current image sacp_scale = 1.0 * E0pxm->ww / sacp_ww; // scale down to fit if (sacp_hh * sacp_scale > E0pxm->hh) sacp_scale = 1.0 * E0pxm->hh / sacp_hh; if (sacp_scale < 1.0) { sacp_ww *= sacp_scale; sacp_hh *= sacp_scale; sacpR_pxm = PXM_rescale(sacp_pxm,sacp_ww,sacp_hh); PXM_free(sacp_pxm); sacp_pxm = sacpR_pxm; sacp_scale = 1.0; } sacpR_pxm = PXM_copy(sacp_pxm); // initial paste image sacpR_ww = sacp_ww; // size = 1.0, no rotation sacpR_hh = sacp_hh; sacp_orgx = sacp_orgy = 0; // initial position select_paste_image(); // paste area image if (! sa_Npixel) { // failed edit_cancel(0); // cancel edit, restore image PXM_free(sacpR_pxm); // free memory return; } /*** __________________________________________________ | Paste Image | | | | position with mouse click/drag | | | | Rescale [-10%] [-1%] [-.1%] [+.1%] [+1%] [+10%] | | Angle [-10°] [-1°] [-.1°] [+.1°] [+1°] [+10°] | | Flip [horizontal] [vertical] | | | | [OK] [X] | |__________________________________________________| ***/ CEF->zd = zdialog_new(TX("Paste Image"),Mwin,"OK","X",null); zdialog_add_widget(CEF->zd,"hbox","hb0","dialog",0,"space=3"); zdialog_add_widget(CEF->zd,"label","lab1","hb0",dragmess,"space=5"); zdialog_add_widget(CEF->zd,"hbox","hbres","dialog",0,"space=3"); zdialog_add_widget(CEF->zd,"label","labres","hbres",TX("Rescale"),"space=3"); zdialog_add_widget(CEF->zd,"button","-10%","hbres","-10%"); zdialog_add_widget(CEF->zd,"button","-1%","hbres","-1%"); zdialog_add_widget(CEF->zd,"button","-.1%","hbres","-.1%"); zdialog_add_widget(CEF->zd,"button","+.1%","hbres","+.1%"); zdialog_add_widget(CEF->zd,"button","+1%","hbres","+1%"); zdialog_add_widget(CEF->zd,"button","+10%","hbres","+10%"); zdialog_add_widget(CEF->zd,"hbox","hbang","dialog",0,"space=3"); zdialog_add_widget(CEF->zd,"label","labang","hbang",TX("Angle"),"space=3"); zdialog_add_widget(CEF->zd,"button","-10°","hbang","-10°"); zdialog_add_widget(CEF->zd,"button","-1°","hbang","-1°"); zdialog_add_widget(CEF->zd,"button","-.1°","hbang","-.1°"); zdialog_add_widget(CEF->zd,"button","+.1°","hbang","+.1°"); zdialog_add_widget(CEF->zd,"button","+1°","hbang","+1°"); zdialog_add_widget(CEF->zd,"button","+10°","hbang","+10°"); zdialog_add_widget(CEF->zd,"hbox","hbflip","dialog",0,"space=3"); zdialog_add_widget(CEF->zd,"label","labflip","hbflip",TX("Flip"),"space=3"); zdialog_add_widget(CEF->zd,"button","horz","hbflip",TX("horizontal"),"space=5"); zdialog_add_widget(CEF->zd,"button","vert","hbflip",TX("vertical"),"space=10"); zdialog_run(CEF->zd,select_paste_dialog_event,"save"); // start dialog takeMouse(select_paste_mousefunc,0); // connect mouse function return; } // Dialog event and completion callback function. // Get dialog values and convert image. When done, commit edited image // (with pasted area) and set up a new select area for the pasted area, // allowing further editing of the area. int select_paste_dialog_event(zdialog *zd, ch *event) { using namespace sa_diskfile; void select_paste_mousefunc(); void select_paste_image(); void select_paste_adjust(); int ww, hh; PXM *pxm_temp; if (strmatch(event,"done")) zd->zstat = 1; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 2; // cancel if (zd->zstat) // dialog completed { freeMouse(); // disconnect mouse if (zd->zstat != 1 || ! sacp_porg) { // cancel or no pasted image edit_cancel(0); // cancel edit, restore image sa_clear(); PXM_free(sacpR_pxm); // free memory return 1; } sa_show(1,0); // show area edit_done(0); // commit the edit (pasted image) PXM_free(sacpR_pxm); // free memory return 1; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(select_paste_mousefunc,0); if (zstrstr(event,"%") || zstrstr(event,"°") || zstrstr(event,"horz") || zstrstr(event,"vert")) { if (strmatch(event,"+.1%")) sacp_scale *= 1.001; if (strmatch(event,"+1%")) sacp_scale *= 1.01; if (strmatch(event,"+10%")) sacp_scale *= 1.10; if (strmatch(event,"-.1%")) sacp_scale *= 0.999001; if (strmatch(event,"-1%")) sacp_scale *= 0.990099; if (strmatch(event,"-10%")) sacp_scale *= 0.909091; // -10% is really 1.0/1.10 if (strmatch(event,"+.1°")) sacp_angle += 0.1; // rotation if (strmatch(event,"+1°")) sacp_angle += 1.0; if (strmatch(event,"+10°")) sacp_angle += 10.0; if (strmatch(event,"-.1°")) sacp_angle -= 0.1; if (strmatch(event,"-1°")) sacp_angle -= 1.0; if (strmatch(event,"-10°")) sacp_angle -= 10.0; if (strmatch(event,"horz")) sacp_fliphorz = 1 - sacp_fliphorz; // flip status if (strmatch(event,"vert")) sacp_flipvert = 1 - sacp_flipvert; PXM_free(sacpR_pxm); // free prior if any ww = sacp_scale * sacp_ww; // new size hh = sacp_scale * sacp_hh; pxm_temp = PXM_rescale(sacp_pxm,ww,hh); // rescaled area image sacpR_pxm = PXM_rotate(pxm_temp,sacp_angle); // rotated area image PXM_free(pxm_temp); if (sacp_fliphorz) { pxm_temp = PXM_upright(sacpR_pxm,0,1); // flip horizontal PXM_free(sacpR_pxm); sacpR_pxm = pxm_temp; } if (sacp_flipvert) { pxm_temp = PXM_upright(sacpR_pxm,0,2); // flip vertical PXM_free(sacpR_pxm); sacpR_pxm = pxm_temp; } sacpR_ww = sacpR_pxm->ww; // size after rescale/rotate/flip sacpR_hh = sacpR_pxm->hh; select_paste_image(); // copy onto target image sa_edgecalc_done = 0; // edge distance calculation needed } Fpaint2(); return 1; } // mouse function - follow mouse drags and move pasted area accordingly void select_paste_mousefunc() { using namespace sa_diskfile; void select_paste_image(); int mx1, my1, mx2, my2; static int mdx0, mdy0, mdx1, mdy1; if (LMclick) { // left mouse click LMclick = 0; sacp_orgx = Mxclick - sacpR_ww / 2; // position image at mouse sacp_orgy = Myclick - sacpR_hh / 2; select_paste_image(); } if (! sacp_porg) return; // no select area paste yet if (Mxposn < sacp_orgx || Mxposn > sacp_orgx + sacpR_ww || // mouse outside select area Myposn < sacp_orgy || Myposn > sacp_orgy + sacpR_hh) gdk_window_set_cursor(Fgdkwin,0); // set normal cursor else gdk_window_set_cursor(Fgdkwin,dragcursor); // set drag cursor if (! Mxdrag && ! Mydrag) return; // no drag underway if (Mxdown != mdx0 || Mydown != mdy0) { // new drag initiated mdx0 = mdx1 = Mxdown; mdy0 = mdy1 = Mydown; } mx1 = mdx1; // drag start my1 = mdy1; mx2 = Mxdrag; // drag position my2 = Mydrag; mdx1 = mx2; // next drag start mdy1 = my2; Mxdrag = Mydrag = 0; sacp_orgx += (mx2 - mx1); // move position of select area sacp_orgy += (my2 - my1); // by mouse drag amount select_paste_image(); // re-copy area to new position sa_edgecalc_done = 0; // edge distance calculation needed return; } // copy select area into edit image, starting at sacp_orgx/y // called when area moved, rescaled, rotated void select_paste_image() { using namespace sa_diskfile; void select_paste_makearea(); int px1, py1, px2, py2, nc, pcc; float *pix1, *pix2, *pix3; float f1, f2; float red, green, blue; nc = E1pxm->nc; pcc = nc * sizeof(float); if (sacp_porg) // prior area overlap rectangle { for (py2 = 0; py2 < sacp_phh; py2++) // loop area pixels for (px2 = 0; px2 < sacp_pww; px2++) { px1 = px2 + sacp_porgx; // coresp. E1/E3 image pixel py1 = py2 + sacp_porgy; if (px1 < 0 || px1 >= Fpxb->ww) continue; // parts may be beyond edges if (py1 < 0 || py1 >= Fpxb->hh) continue; pix1 = PXMpix(E1pxm,px1,py1); // restore E1 pixels to E3 pix3 = PXMpix(E3pxm,px1,py1); memcpy(pix3,pix1,pcc); } Fpaint3(sacp_porgx,sacp_porgy,sacp_pww,sacp_phh,0); // update window } for (py2 = 0; py2 < sacpR_hh; py2++) // copy paste area pixels to new for (px2 = 0; px2 < sacpR_ww; px2++) // image overlap rectangle { px1 = px2 + sacp_orgx; py1 = py2 + sacp_orgy; if (px1 < 0 || px1 >= E3pxm->ww) continue; // parts may be beyond edges if (py1 < 0 || py1 >= E3pxm->hh) continue; pix2 = PXMpix(sacpR_pxm,px2,py2); // area pixel red = pix2[0]; green = pix2[1]; blue = pix2[2]; pix3 = PXMpix(E3pxm,px1,py1); // corresp. image pixel if (pix2[3] < 255) { // opacity of area pixel f1 = pix2[3] / 255.0; f2 = 1.0 - f1; red = f1 * red + f2 * pix3[0]; // blend area and image pixels green = f1 * green + f2 * pix3[1]; blue = f1 * blue + f2 * pix3[2]; } pix3[0] = red; pix3[1] = green; pix3[2] = blue; if (nc > 3) { // combine alpha channels pix3[3] = 255 - (255 - pix2[3]) * (255 - pix3[3]) / 255; if (pix3[3] > 255) pix3[3] = 255; if (pix3[3] < 0) pix3[3] = 0; } } Fpaint3(sacp_orgx,sacp_orgy,sacpR_ww,sacpR_hh,0); // update window for new overlap area sacp_porgx = sacp_orgx; // remember location for next call sacp_porgy = sacp_orgy; sacp_pww = sacpR_ww; sacp_phh = sacpR_hh; sacp_porg = 1; select_paste_makearea(); if (! sa_Npixel) return; CEF->Fmods++; // image is modified CEF->Fsaved = 0; return; } // convert the pasted image area into an equivalent select area by mouse void select_paste_makearea() { using namespace sa_diskfile; int ii, px1, py1, px2, py2; float *pix2, opac; sa_clear(); // clear old area sa_pixmap_create(); // allocate pixel maps for (py2 = 0; py2 < sacpR_hh; py2++) // loop area pixels for (px2 = 0; px2 < sacpR_ww; px2++) { px1 = px2 + sacp_orgx; // corresp. E0 image pixel py1 = py2 + sacp_orgy; if (px1 < 0 || px1 >= Fpxb->ww) continue; // parts may be beyond edges if (py1 < 0 || py1 >= Fpxb->hh) continue; pix2 = PXMpix(sacpR_pxm,px2,py2); // get opacity opac = pix2[3]; ii = py1 * Fpxb->ww + px1; // set sa_pixmap[] from opacity if (opac== 0) sa_pixmap[ii] = 0; // pixel outside area else sa_pixmap[ii] = 2; // interior pixel } sa_stat = sa_stat_edit; sa_mode = sa_mode_mouse; // equivalent select by mouse area sa_fww = Fpxb->ww; sa_fhh = Fpxb->hh; sa_finish_auto(); // will find new edge pixels sa_show(0,0); // hide area return; } // make area brightness and edge blend adjustments. void select_paste_adjust() { using namespace sa_diskfile; int px1, py1, px2, py2; float *pix1, *pix2, *pix3; float red, green, blue; float f1, f2; int ii, dist; for (py2 = 0; py2 < sacpR_hh; py2++) // copy paste area pixels to new for (px2 = 0; px2 < sacpR_ww; px2++) // image overlap rectangle { px1 = px2 + sacp_orgx; py1 = py2 + sacp_orgy; if (px1 < 0 || px1 >= E3pxm->ww) continue; // parts may be beyond edges if (py1 < 0 || py1 >= E3pxm->hh) continue; pix2 = PXMpix(sacpR_pxm,px2,py2); // area pixel pix1 = PXMpix(E1pxm,px1,py1); // corresp. E1 image pixel pix3 = PXMpix(E3pxm,px1,py1); // corresp. E3 image pixel red = pix2[0]; // area pixel green = pix2[1]; blue = pix2[2]; RGBfix(red,green,blue); f1 = pix2[3] / 255.0; // area pixel opacity if (f1 < 1.0) { f2 = 1.0 - f1; red = f1 * red + f2 * pix1[0]; // blend area and image pixels green = f1 * green + f2 * pix1[1]; blue = f1 * blue + f2 * pix1[2]; } ii = py1 * Fpxb->ww + px1; dist = sa_pixmap[ii]; // edge distance if (dist == 0) { // pixel outside area red = pix1[0]; green = pix1[1]; blue = pix1[2]; } pix3[0] = red; pix3[1] = green; pix3[2] = blue; } return; } fotocx/f.mashup.cc0000664000175000017500000061734015247006660013073 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit functions - Mashup and Array functions m_mashup combine images and text into custom layout m_image_array combine images into a array or matrix of images ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) using namespace zfuncs; /************************************************************************************** MASHUP Define a layout/background image. Add images, text, and lines as overlays on top of layout. Overlays have adjustable position, angle, size, transparency. ***************************************************************************************/ namespace mashup { ch projname[100]; // project name ch projfolder[200]; // /projname ch masterfile[200]; // /masterdata ch tranfile[200]; // /trandata ch warpfile[200]; // /warpdata ch layoutfile[XFCC]; // background/layout image file int Lww, Lhh; // layout image size int flatRGB[3]; // flat layout RGB values (no file) PXB *Lpxb; // layout image PXB int Nimage; // overlay image count int Ntext; // overlay text count int Nline; // overlay line count int updxlo, updxhi, updylo, updyhi; // update region in layout image float PRscale; // project scale for editing int Fupdall; // flag, update entire layout ch *focus; // "image" "text" "line" "" int focusii; // image[ii] text[ii] line[ii] or -1 int Fnextimage = 0; // flag, image selected with [next] int Mradius = 50; // paint transparency mouse radius int Mpowcen = 10; // paint transparency mouse center power int Mpowedge = 0; // paint transparency mouse edge power int Mgradual = 1; // paint transparency gradual or instant zdialog *zdimage; // image edit dialog active zdialog *zdtext; // text edit dialog active zdialog *zdaddtext; // add text dialog active zdialog *zdline; // line edit dialog active zdialog *zdaddline; // add line dialog active zdialog *zdtransp; // paint transparencies dialog active zdialog *zdwarp; // warp image dialog active struct image_t { // overlay image data ch *file; // filespec PXB *pxb1; // image PXB, 1x size PXB *pxb2; // image PXB, scaled size float scale; // pxb2 scale, 0.0 to 1.0 = 1x float theta; // angle, -PI to +PI radians float sinT, cosT; // trig values for theta int ww1, hh1; // image size at 1x scale int ww2, hh2; // image size at curr. scale int px0, py0; // image position in layout image int pxlo, pxhi, pylo, pyhi; // image extent in layout image space int fixed; // flag, image fixed, cannot move int Lmarg, Rmarg, Tmarg, Bmarg; // left/right/top/bottom hard margins int Lblend, Rblend, Tblend, Bblend; // left/right/top/bottom blended margins float Btransp; // base image transparency 0...1 int vtrancc; // var. transparency map cc uint8 *vtranmap; // var. transparency map (pxb1 image) int Nwarp; // warpmem count float warpmem[200][5]; // warp undo memory, last 200 warps int warpcc; // warpx/warpy data length float *warpx, *warpy; // pixel warps (virt. source pixels) }; struct text_t { // overlay text data textattr_t attr; // text, font, angle, outline ... int ww, hh; // image dimensions in layout image int px0, py0; // image position in layout image int pxlo, pxhi, pylo, pyhi; // extent of text image in layout image }; struct line_t { // overlay line/arrow data lineattr_t attr; // attributes (length, width, arrowheads) int ww, hh; // image dimensions in layout image int px0, py0; // image position in layout image int pxlo, pxhi, pylo, pyhi; // extent of line image in layout image }; #define maxmash 100 // max. images, text, lines image_t image[maxmash]; text_t text[maxmash]; line_t line[maxmash]; void project(void); int project_dialog_event(zdialog *zd, ch *event); int project_open(void); void project_save(void); void project_rescale(float scale); void image_edit(void); int image_dialog_event(zdialog *zd, ch *event); void image_rescale(int ii, float scale2); void paintransp_dialog(void); int paintransp_dialog_event(zdialog *zd, ch *event); void paintransp_mousefunc(void); void warp_dialog(void); int warp_dialog_event(zdialog *zd, ch *event); void warp_mousefunc(void); void warp_warpfunc(void); void * warp_warpfunc_wthread(void *arg); void transparent_margins(void); void add_image(void); void remove_image(int ii); void flashimage(void); void text_edit(void); int text_dialog_event(zdialog *zd, ch *event); void add_text(void); void remove_text(int ii); void flashtext(void); void line_edit(void); int line_dialog_event(zdialog *zd, ch *event); void add_line(void); void remove_line(int ii); void flashline(void); void select(ch *which, int ii); void setlayoutupdatearea(void); void mousefunc_layout(void); void KBfunc(int key); void Lupdate(int = 0); void * Lupdate_wthread(void *arg); } /**************************************************************************************/ // menu function void m_mashup(GtkWidget *, ch *menu) { using namespace mashup; zdialog *zd; int zstat, nn, err, ww, hh; ch color[20], *file; ch *choice = 0, *ppc; int px, py; uint8 *pix; F1_help_topic = TX("MASHUP"); printf("m_mashup \n"); if (Fblock("mashup")) return; *projname = *layoutfile = *tranfile = *warpfile = 0; // clear project data zdimage = zdtransp = zdwarp = zdtext = zdline = 0; Nimage = Ntext = Nline = 0; for (nn = 0; nn < maxmash; nn++) { memset(&image[nn],0,sizeof(image_t)); memset(&text[nn],0,sizeof(text_t)); memset(&line[nn],0,sizeof(line_t)); } select("",-1); // nothing selected /*** _________________________________________ | | | Project name [_______________________] | | | | Layout and background image | | (o) choose an image file | | (o) use the current image file | | (o) specify background size and color | | (o) use a saved Mashup project | | | | [Proceed] [X] | |_________________________________________| ***/ zd = zdialog_new("Mashup",Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbpn","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labpn","hbpn",TX("Project name"),"space=3"); zdialog_add_widget(zd,"zentry","projname","hbpn","mashup","space=3|expand"); zdialog_add_widget(zd,"hbox","space","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbl","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labtitle","hbl",TX("Layout and background image"),"space=3"); zdialog_add_widget(zd,"hbox","hbopt","dialog",0,"space=3"); zdialog_add_widget(zd,"label","space","hbopt",0,"space=5"); zdialog_add_widget(zd,"vbox","vbopt","hbopt"); zdialog_add_widget(zd,"radio","choosefile","vbopt",TX("choose an image file")); zdialog_add_widget(zd,"radio","usecurrent","vbopt",TX("use the current image file")); zdialog_add_widget(zd,"radio","makelayout","vbopt",TX("specify background size and color")); zdialog_add_widget(zd,"radio","openproject","vbopt",TX("use a saved Mashup project")); zdialog_stuff(zd,"choosefile",1); zdialog_run(zd,0,"save"); // run dialog, wait for completion zstat = zdialog_wait(zd); if (zstat != 1) { // canceled zdialog_free(zd); Fblock(0); return; } zdialog_fetch(zd,"projname",projname,100); // get project name strTrim2(projname); if (*projname <= ' ') { zmessageACK(Mwin,TX("enter a project name")); zdialog_free(zd); goto try_again; } if (strchr(projname,'"') || strchr(projname,'\'')) { zmessageACK(Mwin,TX("project name cannot have quote characters")); zdialog_free(zd); goto try_again; } zdialog_fetch(zd,"choosefile",nn); if (nn) choice = "choosefile"; zdialog_fetch(zd,"usecurrent",nn); if (nn) choice = "usecurrent"; zdialog_fetch(zd,"makelayout",nn); if (nn) choice = "makelayout"; zdialog_fetch(zd,"openproject",nn); if (nn) choice = "openproject"; zdialog_free(zd); if (strmatch(choice,"choosefile")) // open new curr. file >> layout { file = select_1file(curr_file); if (! file) goto try_again; Lpxb = PXB_load(file,1); // layout image if (! Lpxb) goto try_again; Lww = Lpxb->ww; // layout size Lhh = Lpxb->hh; strncpy0(layoutfile,file,XFCC); project(); // start project return; } if (strmatch(choice,"usecurrent")) { // curr. file >> layout if (! curr_file) { // bugfix zmessageACK(Mwin,TX("no current file")); goto try_again; } file = zstrdup(curr_file,"mashup"); Lpxb = PXB_load(file,1); // layout image if (! Lpxb) goto try_again; Lww = Lpxb->ww; // layout size Lhh = Lpxb->hh; strncpy0(layoutfile,file,XFCC); project(); // start project return; } if (strmatch(choice,"makelayout")) // create flat layout image { /*** _______________________________________________ | Make Layout Image | | | | width [____] height [____] (pixels) | | color [____] | | [OK] [X] | |_______________________________________________| ***/ zd = zdialog_new(TX("Make Layout Image"),Mwin,"OK","X",null); zdialog_add_widget(zd,"hbox","hbz","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labw","hbz",TX("Width"),"space=5"); zdialog_add_widget(zd,"zspin","width","hbz","1000|40000|1|2000"); // limit 40K x 40K = 1600 megapixels zdialog_add_widget(zd,"label","space","hbz",0,"space=5"); zdialog_add_widget(zd,"label","labh","hbz",TX("Height"),"space=5"); zdialog_add_widget(zd,"zspin","height","hbz","600|40000|1|1200"); zdialog_add_widget(zd,"label","labp","hbz",TX("(pixels)"),"space=3"); zdialog_add_widget(zd,"hbox","hbc","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labc","hbc",TX("Color"),"space=5"); zdialog_add_widget(zd,"colorbutt","color","hbc","200|200|200"); zdialog_load_inputs(zd); // preload prior user inputs zdialog_run(zd,null,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for completion if (zstat != 1) { // cancel zdialog_free(zd); goto try_again; } zdialog_fetch(zd,"width",ww); // get layout dimensions zdialog_fetch(zd,"height",hh); flatRGB[0] = flatRGB[1] = flatRGB[2] = 255; zdialog_fetch(zd,"color",color,19); // get flat layout color ppc = substring(color,"|",1); if (ppc) flatRGB[0] = atoi(ppc); ppc = substring(color,"|",2); if (ppc) flatRGB[1] = atoi(ppc); ppc = substring(color,"|",3); if (ppc) flatRGB[2] = atoi(ppc); zdialog_free(zd); Lpxb = PXB_make(ww,hh,3); // layout image if (! Lpxb) goto try_again; // 26.3 Lww = Lpxb->ww; // layout size Lhh = Lpxb->hh; *layoutfile = 0; // no layout file (flat layout) for (py = 0; py < Lhh; py++) // fill layout with flat color for (px = 0; px < Lww; px++) { pix = PXBpix(Lpxb,px,py); pix[0] = flatRGB[0]; pix[1] = flatRGB[1]; pix[2] = flatRGB[2]; } project(); // start project return; } if (strmatch(choice,"openproject")) { // project file >> layout & contents err = project_open(); if (err) goto try_again; project(); // start project return; } try_again: // restart mashup Fblock(0); m_mashup(0,0); return; } // overall steering dialog - edit dialogs return to this dialog void mashup::project() { using namespace mashup; zdialog *zd; free_resources(); // no E1/E3 etc. Fmashup = 1; // flag for KBpress() func Fpxb = PXB_copy(Lpxb); // initz. window update image viewmode('F'); // force file view Fpanelshow = 0; // 26.5 PRscale = 1.0; select("",-1); // nothing selected Fupdall = 1; Lupdate(1); // update layout composite image /*** ____________________________________________ | Mashup | | | | [Edit Images] add or edit images | | [Edit Text] add or edit text | | [Edit Line] add or edit lines/arrows | | [Rescale] change project scale | | [OK] project complete | | [Cancel] cancel project | |____________________________________________| ***/ zd = zdialog_new("Mashup",Mwin,null); zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"space=3|homog"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"space=3|homog"); zdialog_add_widget(zd,"button","editimage","vb1",TX("Edit Images"),"space=3"); zdialog_add_widget(zd,"button","edittext","vb1",TX("Edit Text"),"space=3"); zdialog_add_widget(zd,"button","editline","vb1",TX("Edit Line"),"space=3"); zdialog_add_widget(zd,"button","rescale","vb1",TX("Rescale"),"space=3"); zdialog_add_widget(zd,"button","done","vb1","OK","space=3"); zdialog_add_widget(zd,"button","cancel","vb1",TX("Cancel"),"space=3"); zdialog_add_widget(zd,"hbox","hbedim","vb2"); zdialog_add_widget(zd,"label","labedim","hbedim",TX("add or edit images"),"space=3"); zdialog_add_widget(zd,"hbox","hbedtx","vb2"); zdialog_add_widget(zd,"label","labedtx","hbedtx",TX("add or edit text"),"space=3"); zdialog_add_widget(zd,"hbox","hbedln","vb2"); zdialog_add_widget(zd,"label","labedln","hbedln",TX("add or edit lines/arrows"),"space=3"); zdialog_add_widget(zd,"hbox","hbres","vb2"); zdialog_add_widget(zd,"label","labscale","hbres",TX("change project scale"),"space=3"); zdialog_add_widget(zd,"hbox","hbdone","vb2"); zdialog_add_widget(zd,"label","labdone","hbdone",TX("project complete"),"space=3"); zdialog_add_widget(zd,"hbox","hbcan","vb2"); zdialog_add_widget(zd,"label","labcancel","hbcan",TX("cancel project"),"space=3"); zdialog_run(zd,project_dialog_event,"save"); // start dialog takeMouse(mousefunc_layout,0); // capture mouse click/drag return; } // project dialog event and completion function int mashup::project_dialog_event(zdialog *zd, ch *event) { using namespace mashup; int ii, cc, yn; GError *gerror = 0; ch *file = 0, *outfile, *pp; ch *rescalemess = "rescale project"; STATB statB; if (zd->zstat) event = "cancel"; if (strmatch(event,"focus")) { takeMouse(mousefunc_layout,0); return 1; } if (strmatch(event,"editimage")) { zdialog_show(zd,0); image_edit(); // start edit images dialog zdialog_show(zd,1); return 1; } if (strmatch(event,"edittext")) { zdialog_show(zd,0); text_edit(); // start edit text dialog zdialog_show(zd,1); return 1; } if (strmatch(event,"editline")) { zdialog_show(zd,0); line_edit(); // start edit line dialog zdialog_show(zd,1); return 1; } if (strmatch(event,"rescale")) { // rescale project bigger, or reset ii = zdialog_choose(Mwin,"mouse",rescalemess,"2x","3x","4x",TX("Reset"),null); if (ii == 1 && PRscale == 1.0) project_rescale(2.0); // 1x -> 2x if (ii == 2 && PRscale == 1.0) project_rescale(3.0); // 1x -> 3x if (ii == 3 && PRscale == 1.0) project_rescale(4.0); // 1x -> 4x if (ii == 4 && PRscale > 1.0) project_rescale(1.0); // [reset] back to 1x return 1; } if (strmatch(event,"done")) // project done { zdialog_free(zd); // kill dialog freeMouse(); if (navi::gallerytype == FOLDER) { // default output image file name outfile = zstrdup(navi::galleryname,"mashup",108); cc = strlen(outfile); strncatv(outfile,cc+108,"/",projname,".png",null); // gallery/projname.png } else { outfile = zstrdup(projname,"mashup",6); // projname.png strcat(outfile,".png"); } file = zgetfile(TX("save Mashup output file"),MWIN,"save",outfile); // ask user for file name zfree(outfile); if (file) { pp = strrchr(file,'.'); // force .png extension if (! pp || strlen(pp) < 4) { pp = zstrdup(file,"mashup",6); zfree(file); file = pp; pp = strrchr(file,'.'); if (! pp || strlen(pp) > 5) pp = file + strlen(file); } strcpy(pp,".png"); ii = gdk_pixbuf_save(Fpxb->pixbuf,file,"png",&gerror,"compression","1",null); if (! ii) { zmessageACK(Mwin,gerror->message); zfree(file); file = 0; } } yn = zmessageYN(Mwin,TX("save Mashup project?")); // offer to save project if (yn) project_save(); event = "cleanup"; } if (strmatch(event,"cancel")) // project canceled { Fescape = 0; // user kill yn = zmessageYN(Mwin,TX("cancel project?")); if (! yn) return 1; zdialog_free(zd); // kill dialog freeMouse(); if (dirfile(projfolder,&statB)) { yn = zmessageYN(Mwin,TX("delete Mashup project files?")); // offer to delete project files if (yn) zshell("log","rm -f -R %s",projfolder); } viewmode('G'); event = "cleanup"; } if (strmatch(event,"cleanup")) { PXB_free(Lpxb); Lpxb = 0; Fmashup = 0; Fpanelshow = 1; // 26.5 if (file) { // open finished mashup f_open(file,0,0,1); zfree(file); } else free_resources(0); // leave a blank window Fblock(0); } return 1; } /**************************************************************************************/ // open and restore a saved mashup project // return 0 if success, +N if error int mashup::project_open() { using namespace mashup; PXB *pxbtemp; int ii, nn; int ww1, hh1; int px, py, kk; int nfid = -1, cc, wcc, vcc; ch *pp, *pp2; ch buff[XFCC]; textattr_t *txattr = 0; lineattr_t *lnattr = 0; FILE *fid; uint8 *pix; pp = zgetfile(TX("mashup project"),MWIN,"folder",mashup_folder); // get project folder if (! pp) return 1; snprintf(projfolder,200,"%s",pp); // project folder zfree(pp); snprintf(masterfile,200,"%s/masterdata",projfolder); // project master data file snprintf(tranfile,200,"%s/trandata",projfolder); // transparency data file snprintf(warpfile,200,"%s/warpdata",projfolder); // warp data file pp = strrchr(projfolder,'/'); // project name from folder name strncpy0(projname,pp+1,100); // read project file and validate all data fid = fopen(masterfile,"r"); // open master file if (! fid) goto failure; pp = fgets_trim(buff,XFCC,fid); // read layout record if (! pp) { printf("*** no layout \n"); goto badproject; } if (strmatchN(pp,"layout:",7)) // layout: /.../filename.jpg { pp += 7; while (*pp == ' ') pp++; strncpy0(layoutfile,pp,XFCC); if (! regfile(layoutfile)) { zmessageACK(Mwin,TX("layout file missing: %s"),layoutfile); printf("*** no layout image \n"); goto badproject; } Lpxb = PXB_load(layoutfile,1); // layout image if (! Lpxb) { printf("*** PXB_load() layout file \n"); goto badproject; } Lww = Lpxb->ww; // layout size Lhh = Lpxb->hh; } else if (strmatchN(pp,"flatlayout:",11)) // flatlayout: ww hh R|G|B { nn = sscanf(buff,"flatlayout: %d %d RGB: %d/%d/%d \n", &ww1,&hh1,&flatRGB[0],&flatRGB[1],&flatRGB[2]); if (nn != 5) { printf("*** flatlayout rec. \n"); goto badproject; } *layoutfile = 0; // flat layout, no layout file Lpxb = PXB_make(ww1,hh1,3); // layout image if (! Lpxb) return 1; Lww = Lpxb->ww; // layout size Lhh = Lpxb->hh; for (py = 0; py < Lhh; py++) // fill layout with flat color for (px = 0; px < Lww; px++) { pix = PXBpix(Lpxb,px,py); pix[0] = flatRGB[0]; pix[1] = flatRGB[1]; pix[2] = flatRGB[2]; } } else { printf("*** unknown rec. \n"); goto badproject; } // read any number of overlay image records while (true) { pp = fgets_trim(buff,XFCC,fid); if (! pp) break; if (strmatchN(pp,"end",3)) break; if (strmatchN(pp,"image:",6)) // image: /.../filename.jpg { pp += 6; while (*pp == ' ') pp++; if (! regfile(pp)) { zmessageACK(Mwin,TX("overlay file missing: %s"),pp); continue; } ii = Nimage++; cc = sizeof(image_t); // clear image data memset(&image[ii],0,cc); image[ii].file = zstrdup(pp,"mashup"); // overlay image file pxbtemp = PXB_load(image[ii].file,1); // make overlay image if (! pxbtemp) goto cleanupErr; PXB_addalpha(pxbtemp); // add alpha channel if missing image[ii].pxb1 = pxbtemp; image[ii].ww1 = pxbtemp->ww; image[ii].hh1 = pxbtemp->hh; continue; } ii = Nimage - 1; // current image if (strmatchN(pp,"position:",9)) { // position: xxx yyy nn = sscanf(pp,"position: %d %d",&image[ii].px0,&image[ii].py0); if (nn != 2) { printf("*** position rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"fixed:",6)) { // position fixed: n nn = sscanf(pp,"fixed: %d",&image[ii].fixed); if (nn != 1) { printf("*** fixed rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"scale:",6)) { // scale: n.nnn nn = sscanf(pp,"scale: %f",&image[ii].scale); if (nn != 1) { printf("*** scale rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"theta:",6)) { // theta: n.nnn nn = sscanf(pp,"theta: %f",&image[ii].theta); if (nn != 1) { printf("*** theta rec. \n"); goto badproject; } image[ii].sinT = sin(image[ii].theta); image[ii].cosT = cos(image[ii].theta); continue; } if (strmatchN(pp,"Btransp:",8)) { // Btransp: 0.nnn nn = sscanf(pp,"Btransp: %f",&image[ii].Btransp); if (nn != 1) { printf("*** Btransp rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"Lmarg:",6)) { // Lmarg: nnn nn = sscanf(pp,"Lmarg: %d",&image[ii].Lmarg); if (nn != 1) { printf("*** Lmarg rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"Rmarg:",6)) { // Rmarg: nnn nn = sscanf(pp,"Rmarg: %d",&image[ii].Rmarg); if (nn != 1) { printf("*** Rmarg rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"Tmarg:",6)) { // Tmarg: nnn nn = sscanf(pp,"Tmarg: %d",&image[ii].Tmarg); if (nn != 1) { printf("*** Tmarg rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"Bmarg:",6)) { // Bmarg: nnn nn = sscanf(pp,"Bmarg: %d",&image[ii].Bmarg); if (nn != 1) { printf("*** Bmarg rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"Lblend:",7)) { // Lblend: nnn nn = sscanf(pp,"Lblend: %d",&image[ii].Lblend); if (nn != 1) { printf("*** Lblend rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"Rblend:",7)) { // Rblend: nnn nn = sscanf(pp,"Rblend: %d",&image[ii].Rblend); if (nn != 1) { printf("*** Rblend rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"Tblend:",7)) { // Tblend: nnn nn = sscanf(pp,"Tblend: %d",&image[ii].Tblend); if (nn != 1) { printf("*** Tblend rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"Bblend:",7)) { // Bblend: nnn nn = sscanf(pp,"Bblend: %d",&image[ii].Bblend); if (nn != 1) { printf("*** Bblend rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"Nwarp:",6)) { // Nwarp: nn nn = sscanf(pp,"Nwarp: %d",&image[ii].Nwarp); if (nn != 1) { printf("*** Nwarp rec. \n"); goto badproject; } if (image[ii].Nwarp > 200) { printf("*** Nwarp rec. \n"); goto badproject; } for (kk = 0; kk < image[ii].Nwarp; kk++) { pp = fgets_trim(buff,XFCC,fid); // n.nnn n.nnn n.nnn n.nnn n.nnn if (! pp) break; // (loop for Nwarp records) nn = sscanf(pp,"%f %f %f %f %f",&image[ii].warpmem[kk][0], &image[ii].warpmem[kk][1],&image[ii].warpmem[kk][2], &image[ii].warpmem[kk][3],&image[ii].warpmem[kk][4]); if (nn != 5) { printf("*** warpmem rec. \n"); goto badproject; } } } ww1 = image[ii].ww1; hh1 = image[ii].hh1; if (strmatchN(pp,"vtrancc:",8)) { // vtrancc: nnnn nn = sscanf(pp,"vtrancc: %d",&vcc); if (nn != 1) { printf("*** vtrancc rec. \n"); goto badproject; } if (vcc && vcc != ww1 * hh1) { printf("*** vtrancc rec. \n"); goto badproject; } image[ii].vtrancc = vcc; continue; } if (strmatchN(pp,"warpcc:",7)) { // warpcc: nnnn nn = sscanf(pp,"warpcc: %d",&wcc); if (nn != 1) { printf("*** warpcc rec. \n"); goto badproject; } if (wcc && wcc != (int) (ww1 * hh1 * sizeof(float))) { printf("*** warpcc rec. \n"); goto badproject; } image[ii].warpcc = wcc; continue; } } // read any number of text records while (true) { pp = fgets_trim(buff,XFCC,fid); if (! pp) break; if (strmatchN(pp,"end",3)) break; if (strmatchN(pp,"text:",5)) // text: this is my text ... { ii = Ntext++; txattr = &text[ii].attr; pp += 5; while (*pp == ' ') pp++; repl_Nstrs(pp,txattr->text,999,"\\n","\n",null); // replace "\n" with newline continue; } ii = Ntext - 1; // current text if (strmatchN(pp,"position:",9)) { // position: xx yy nn = sscanf(pp,"position: %d %d",&text[ii].px0,&text[ii].py0); if (nn != 2) { printf("*** position rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"font:",5)) { // font: free sans size: nn pp += 5; while (*pp == ' ') pp++; pp2 = strstr(pp,"size:"); if (! pp2) { printf("*** font rec. \n"); goto badproject; } *pp2 = 0; pp2 += 5; strncpy0(txattr->font,pp,80); txattr->size = atoi(pp2); if (txattr->size < 8) { printf("*** font rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"attributes:",11)) { // attributes txattr = &text[ii].attr; nn = sscanf(pp,"attributes: %f %s %s %s %s %d %d %d %d %d %d %d", &txattr->angle, txattr->color[0], txattr->color[1], txattr->color[2], txattr->color[3], &txattr->transp[0], &txattr->transp[1], &txattr->transp[2], &txattr->transp[3], &txattr->towidth, &txattr->shwidth, &txattr->shangle); if (nn != 12) { printf("*** attributes rec. \n"); goto badproject; } } } // read any number of line/arrow records while (true) { pp = fgets_trim(buff,XFCC,fid); if (! pp) break; if (strmatchN(pp,"end",3)) break; if (strmatchN(pp,"line:",5)) { // line: ii = Nline++; continue; } ii = Nline - 1; // current line if (strmatchN(pp,"position:",9)) { // position: xx yy nn = sscanf(pp,"position: %d %d",&line[ii].px0,&line[ii].py0); if (nn != 2) { printf("*** position rec. \n"); goto badproject; } continue; } if (strmatchN(pp,"attributes:",11)) { // attributes: lnattr = &line[ii].attr; nn = sscanf(pp,"attributes: %d %d %d %d %f %s %s %s %s %d %d %d %d %d %d %d", &lnattr->length, &lnattr->width, &lnattr->larrow, &lnattr->rarrow, &lnattr->angle, lnattr->color[0], lnattr->color[1], lnattr->color[2], lnattr->color[3], &lnattr->transp[0], &lnattr->transp[1], &lnattr->transp[2], &lnattr->transp[3], &lnattr->towidth, &lnattr->shwidth, &lnattr->shangle); if (nn != 16) { printf("*** attributes rec. \n"); goto badproject; } } } fclose(fid); fid = 0; // read binary transparency file if any for (vcc = ii = 0; ii < Nimage; ii++) // sum transparency data vcc += image[ii].vtrancc; if (vcc) { nfid = open(tranfile,O_RDONLY); if (nfid < 0) goto failure; for (ii = 0; ii < Nimage; ii++) // read transparency data { vcc = image[ii].vtrancc; if (vcc) { image[ii].vtranmap = (uint8 *) zmalloc(vcc,"mashup"); cc = read(nfid,image[ii].vtranmap,vcc); if (cc != vcc) { printf("*** vtranmap data \n"); goto badproject; } } else image[ii].vtranmap = 0; } close(nfid); nfid = -1; } // read binary warp data file if any for (wcc = ii = 0; ii < Nimage; ii++) // sum warp data wcc += image[ii].warpcc; if (wcc) { nfid = open(warpfile,O_RDONLY); if (nfid < 0) goto failure; for (ii = 0; ii < Nimage; ii++) // read warp data { wcc = image[ii].warpcc; if (wcc) { image[ii].warpx = (float *) zmalloc(wcc,"mashup"); cc = read(nfid,image[ii].warpx,wcc); if (cc != wcc) { printf("*** warpx data \n"); goto badproject; } image[ii].warpy = (float *) zmalloc(wcc,"mashup"); cc = read(nfid,image[ii].warpy,wcc); if (cc != wcc) { printf("*** warpy data \n"); goto badproject; } } else image[ii].warpx = image[ii].warpy = 0; } close(nfid); nfid = -1; } // generate overlay images for (ii = 0; ii < Nimage; ii++) { image_rescale(ii,image[ii].scale); // scaled and warped image select("image",ii); setlayoutupdatearea(); // set layout update area } // generate text images for (ii = 0; ii < Ntext; ii++) { gentext(&text[ii].attr); // make image from text and attributes text[ii].ww = text[ii].attr.pxb_text->ww; // text image size in layout text[ii].hh = text[ii].attr.pxb_text->hh; select("text",ii); setlayoutupdatearea(); // set layout update area } // generate line/arrow images for (ii = 0; ii < Nline; ii++) // load overlay line/arrow images { genline(&line[ii].attr); // make image from line attributes line[ii].ww = line[ii].attr.pxb_line->ww; // line image size in layout line[ii].hh = line[ii].attr.pxb_line->hh; select("line",ii); setlayoutupdatearea(); // set layout update area } viewmode('F'); return 0; // success return failure: if (fid) fclose(fid); if (nfid > -1) close(nfid); zmessageACK(Mwin,"%s \n %s \n %s \n %s", masterfile,tranfile,warpfile,strerror(errno)); goto cleanupErr; badproject: // project file had a problem if (fid) fclose(fid); if (nfid > -1) close(nfid); zmessageACK(Mwin,TX("project file is defective")); cleanupErr: if (Lpxb) PXB_free(Lpxb); Lpxb = 0; for (ii = Nimage-1; ii >= 0; ii--) // free image memory remove_image(ii); for (ii = Ntext-1; ii >= 0; ii--) // free text memory remove_text(ii); for (ii = Nline-1; ii >= 0; ii--) // free line/arrow memory remove_line(ii); return 1; // failure return } // save a mashup project so that it can be edited again later void mashup::project_save() { using namespace mashup; textattr_t txattr; lineattr_t lnattr; ch text2[1200]; ch *pp, *ppx; ch cpfile[200]; FILE *fid; STATB statB; int nfid, ii, kk, cc, vcc, wcc; pp = zdialog_text1(Mwin,TX("enter project name"),projname); // get project name from user if (! pp) return; if (strchr(projname,'"') || strchr(projname,'\'')) { zmessageACK(Mwin,TX("project name cannot have quote characters")); return; } strncpy0(projname,pp,100); zfree(pp); snprintf(projfolder,200,"%s/%s",mashup_folder,projname); zshell(0,"mkdir -p %s",projfolder); if (! dirfile(projfolder,&statB)) return; snprintf(masterfile,200,"%s/masterdata",projfolder); // project master data file snprintf(tranfile,200,"%s/trandata",projfolder); // transparency data file snprintf(warpfile,200,"%s/warpdata",projfolder); // warp data file if (PRscale > 1) project_rescale(1.0); // must save at 1x only fid = fopen(masterfile,"w"); if (! fid) goto failure; if (*layoutfile) { ppx = strrchr(layoutfile,'.'); // copy layout file if (! ppx) goto failure; // to /projfolder/layout.ext snprintf(cpfile,200,"%s/layoutfile.%s",projfolder,ppx+1); if (! strmatch(layoutfile,cpfile)) zshell(0,"cp -T \"%s\" \"%s\" ",layoutfile,cpfile); fprintf(fid,"layout: %s\n",cpfile); } else fprintf(fid,"flatlayout: %d %d RGB: %d/%d/%d \n", // write flat layout attributes Lww,Lhh,flatRGB[0],flatRGB[1],flatRGB[2]); for (ii = 0; ii < Nimage; ii++) // write image data { ppx = strrchr(image[ii].file,'.'); // copy image filename.ext if (! ppx) continue; // to /projfolder/NNN.ext snprintf(cpfile,200,"%s/%03d.%s",projfolder,ii,ppx+1); if (! strmatch(image[ii].file,cpfile)) zshell(0,"cp -T \"%s\" \"%s\" ",image[ii].file,cpfile); fprintf(fid,"image: %s\n",cpfile); fprintf(fid,"position: %d %d \n", image[ii].px0, image[ii].py0); fprintf(fid,"fixed: %d \n",image[ii].fixed); fprintf(fid,"scale: %.4f \n",image[ii].scale); fprintf(fid,"theta: %.4f \n",image[ii].theta); fprintf(fid,"Btransp: %.4f \n",image[ii].Btransp); fprintf(fid,"Lmarg: %d \n",image[ii].Lmarg); fprintf(fid,"Rmarg: %d \n",image[ii].Rmarg); fprintf(fid,"Tmarg: %d \n",image[ii].Tmarg); fprintf(fid,"Bmarg: %d \n",image[ii].Bmarg); fprintf(fid,"Lblend: %d \n",image[ii].Lblend); fprintf(fid,"Rblend: %d \n",image[ii].Rblend); fprintf(fid,"Tblend: %d \n",image[ii].Tblend); fprintf(fid,"Bblend: %d \n",image[ii].Bblend); fprintf(fid,"Nwarp: %d \n",image[ii].Nwarp); for (kk = 0; kk < image[ii].Nwarp; kk++) fprintf(fid,"%f %f %f %f %f \n", image[ii].warpmem[kk][0],image[ii].warpmem[kk][1], image[ii].warpmem[kk][2],image[ii].warpmem[kk][3],image[ii].warpmem[kk][4]); fprintf(fid,"vtrancc: %d \n",image[ii].vtrancc); fprintf(fid,"warpcc: %d \n",image[ii].warpcc); } fprintf(fid,"end\n"); for (ii = 0; ii < Ntext; ii++) // write text data { repl_Nstrs(text[ii].attr.text,text2,999,"\n","\\n",null); fprintf(fid,"text: %s\n",text2); fprintf(fid,"position: %d %d \n", text[ii].px0, text[ii].py0); txattr = text[ii].attr; fprintf(fid,"font: %s size: %d \n", txattr.font, txattr.size); fprintf(fid,"attributes: %.4f %s %s %s %s %d %d %d %d %d %d %d \n", txattr.angle, txattr.color[0], txattr.color[1], txattr.color[2], txattr.color[3], txattr.transp[0], txattr.transp[1], txattr.transp[2], txattr.transp[3], txattr.towidth, txattr.shwidth, txattr.shangle); } fprintf(fid,"end\n"); for (ii = 0; ii < Nline; ii++) // write line/arrow data { fprintf(fid,"line:\n"); fprintf(fid,"position: %d %d \n", line[ii].px0, line[ii].py0); lnattr = line[ii].attr; fprintf(fid,"attributes: %d %d %d %d %.4f %s %s %s %s %d %d %d %d %d %d %d \n", lnattr.length, lnattr.width, lnattr.larrow, lnattr.rarrow, lnattr.angle, lnattr.color[0], lnattr.color[1], lnattr.color[2], lnattr.color[3], lnattr.transp[0], lnattr.transp[1], lnattr.transp[2], lnattr.transp[3], lnattr.towidth, lnattr.shwidth, lnattr.shangle); } fprintf(fid,"end\n"); fclose(fid); for (vcc = ii = 0; ii < Nimage; ii++) // sum transparency data vcc += image[ii].vtrancc; if (vcc == 0) remove(tranfile); // no transparencies, remove poss. file else { nfid = open(tranfile,O_WRONLY|O_CREAT|O_TRUNC,0640); // write transparencies to binary file if (nfid < 0) goto failure; for (ii = 0; ii < Nimage; ii++) { vcc = image[ii].vtrancc; if (! vcc) continue; cc = write(nfid,image[ii].vtranmap,vcc); if (cc != vcc) goto failure; } close(nfid); } for (wcc = ii = 0; ii < Nimage; ii++) // sum warpcc data wcc += image[ii].warpcc; if (wcc == 0) remove(warpfile); // no warp data, remove poss. file else { nfid = open(warpfile,O_WRONLY|O_CREAT|O_TRUNC,0640); // write warp data to binary file if (nfid < 0) goto failure; for (ii = 0; ii < Nimage; ii++) { wcc = image[ii].warpcc; if (! wcc) continue; cc = write(nfid,image[ii].warpx,wcc); cc = write(nfid,image[ii].warpy,wcc); if (cc != wcc) goto failure; } close(nfid); } return; failure: zmessageACK(Mwin,TX("cannot save layout file: %s"),strerror(errno)); return; } // scale project up by 2x/3x/4x or reset to 1x void mashup::project_rescale(float scale) { using namespace mashup; int ii, nn; int64 size; float scaleR; PXB *pxbtemp; if (scale == 1.0) { if (PRscale == 2.0) scale = 0.5; if (PRscale == 3.0) scale = 0.3334; // int 3/6/9... --> 1/2/3... not 0/1/2... if (PRscale == 4.0) scale = 0.25; } size = Lww * Lhh * scale * scale; if (12 * size > (int64)(4000) * MEGA) { // PXM size < 4 GB to remain editable zmessageACK(Mwin,TX("layout exceeds 4 gigabytes")); return; } if (scale < 1) PRscale = 1.0; // reset to 1x else PRscale = scale; // rescale to 2x, 3x or 4x Lww *= scale; // rescale layout image Lhh *= scale; pxbtemp = PXB_rescale(Lpxb,Lww,Lhh); PXB_free(Lpxb); Lpxb = pxbtemp; PXB_free(Fpxb); // rescale window image to match Fpxb = PXB_copy(Lpxb); for (ii = 0; ii < Nimage; ii++) { // rescale overlay images scaleR = scale * image[ii].scale; image_rescale(ii,scaleR); image[ii].px0 *= scale; // new layout position image[ii].py0 *= scale; select("image",ii); setlayoutupdatearea(); } for (ii = 0; ii < Ntext; ii++) { // rescale text images text[ii].px0 *= scale; text[ii].py0 *= scale; text[ii].attr.size *= scale; text[ii].attr.towidth *= scale; text[ii].attr.shwidth *= scale; gentext(&text[ii].attr); text[ii].ww = text[ii].attr.pxb_text->ww; text[ii].hh = text[ii].attr.pxb_text->hh; select("text",ii); setlayoutupdatearea(); } for (ii = 0; ii < Nline; ii++) { // rescale line images nn = line[ii].px0; nn = (nn+10) * scale - 10; // compensate fixed 10 pixel margin line[ii].px0 = nn; nn = line[ii].py0; nn = (nn+10) * scale - 10; line[ii].py0 = nn; line[ii].attr.length *= scale; line[ii].attr.width *= scale; line[ii].attr.towidth *= scale; line[ii].attr.shwidth *= scale; genline(&line[ii].attr); line[ii].ww = line[ii].attr.pxb_line->ww; line[ii].hh = line[ii].attr.pxb_line->hh; select("line",ii); setlayoutupdatearea(); } Fupdall = 1; Lupdate(2); return; } /**************************************************************************************/ // mashup image edit function void mashup::image_edit() { using namespace mashup; ch *tipmess = TX("Click image to select, drag image to move."); ch *blackmargmess = TX("Make black margins transparent"); ch *imagefixed = TX("Image is fixed, unmovable"); if (! strmatch(focus,"image")) select("",-1); // nothing selected /*** _______________________________________________ | Edit Images | | | | Click image to select, drag image to move. | | | | Current image: filename.jpg | | Cycle through images: [Prev] [Next] | | | | Scale [0.345 ] [ 1.0 ] Angle [12.3 ] | | Stacking Order [raise] [lower] | | Base Transparency [0.5 ] | | Variable Transparency [paint] | | Bend and fine-align [warp] | | [x] Make black margins transparent | | [x] Image is fixed, unmovable | | | | Margins hard blend | | Left [ 123 ] [ 0 ] | | Right [ 0 ] [ 123 ] | | Top [ 234 ] [ 0 ] | | Bottom [ 0 ] [ 234 ] | | | | [Add Image] [Delete] [X] | |_______________________________________________| ***/ zdimage = zdialog_new(TX("Edit Images"),Mwin,TX("Add Image"),TX("Delete"),"X",null); zdialog *zd = zdimage; zdialog_add_widget(zd,"hbox","hbtip","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labtip","hbtip",tipmess,"space=3"); zdialog_add_widget(zd,"hbox","hbfile","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labfile","hbfile",TX("Current image:"),"space=3"); zdialog_add_widget(zd,"label","currfile","hbfile",0,"space=3"); zdialog_add_widget(zd,"hbox","hbnext","dialog"); zdialog_add_widget(zd,"label","labnext","hbnext",TX("Cycle through images:"),"space=3"); zdialog_add_widget(zd,"button","prev","hbnext",TX("Prev"),"space=8"); zdialog_add_widget(zd,"button","next","hbnext",TX("Next")); zdialog_add_widget(zd,"vbox","space","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbscale","dialog"); zdialog_add_widget(zd,"label","labscale","hbscale",TX("Scale"),"space=3"); zdialog_add_widget(zd,"zspin","scale","hbscale","0.02|4.0|0.001|0.3"); zdialog_add_widget(zd,"button","scale1x","hbscale"," 1.0 ","space=10"); zdialog_add_widget(zd,"label","space","hbscale",0,"space=10"); zdialog_add_widget(zd,"label","labangle","hbscale",TX("Angle"),"space=3"); zdialog_add_widget(zd,"zspin","angle","hbscale","-180|180|0.1|0"); zdialog_add_widget(zd,"hbox","hbstack","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labstack","hbstack",TX("Stacking Order"),"space=3"); zdialog_add_widget(zd,"button","raise","hbstack","Raise","space=5"); zdialog_add_widget(zd,"button","lower","hbstack","Lower","space=5"); zdialog_add_widget(zd,"hbox","hbbtransp","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labbtr","hbbtransp",TX("Base Transparency"),"space=3"); zdialog_add_widget(zd,"zspin","Btransp","hbbtransp","0|1.0|0.01|0"); zdialog_add_widget(zd,"hbox","hbvtran","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labvtran","hbvtran",TX("Var. Transparency"),"space=3"); zdialog_add_widget(zd,"button","vtran","hbvtran","Paint","space=5"); zdialog_add_widget(zd,"hbox","hbwarp","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labwarp","hbwarp",TX("Bend and fine-align"),"space=3"); zdialog_add_widget(zd,"button","warp","hbwarp","Warp","space=5"); zdialog_add_widget(zd,"hbox","hbmarg","dialog",0,"space=3"); zdialog_add_widget(zd,"check","fixmarg","hbmarg",blackmargmess,"space=3"); zdialog_add_widget(zd,"hbox","hbfixed","dialog",0,"space=3"); zdialog_add_widget(zd,"check","fixed","hbfixed",imagefixed,"space=3"); zdialog_add_widget(zd,"hbox","hbmarg","dialog",0,"space=3"); // margins zdialog_add_widget(zd,"vbox","vbmarg1","hbmarg",0,"space=3|homog"); zdialog_add_widget(zd,"vbox","vbmarg2","hbmarg",0,"space=3|homog"); zdialog_add_widget(zd,"vbox","vbmarg3","hbmarg",0,"space=3|homog"); zdialog_add_widget(zd,"label","labmarg","vbmarg1",TX("Margins")); zdialog_add_widget(zd,"label","labhard","vbmarg2",TX("Hard")); zdialog_add_widget(zd,"label","labblend","vbmarg3",TX("Blend")); zdialog_add_widget(zd,"label","lableft","vbmarg1",TX("Left")); zdialog_add_widget(zd,"label","labright","vbmarg1",TX("Right")); zdialog_add_widget(zd,"label","labtop","vbmarg1",TX("Top")); zdialog_add_widget(zd,"label","labbott","vbmarg1",TX("Bottom")); zdialog_add_widget(zd,"zspin","Lmarg","vbmarg2","0|999|1|0"); zdialog_add_widget(zd,"zspin","Rmarg","vbmarg2","0|999|1|0"); zdialog_add_widget(zd,"zspin","Tmarg","vbmarg2","0|999|1|0"); zdialog_add_widget(zd,"zspin","Bmarg","vbmarg2","0|999|1|0"); zdialog_add_widget(zd,"zspin","Lblend","vbmarg3","0|999|1|0"); zdialog_add_widget(zd,"zspin","Rblend","vbmarg3","0|999|1|0"); zdialog_add_widget(zd,"zspin","Tblend","vbmarg3","0|999|1|0"); zdialog_add_widget(zd,"zspin","Bblend","vbmarg3","0|999|1|0"); zdialog_add_ttip(zd,"Add Image",TX("add images to layout")); zdialog_run(zd,image_dialog_event,"save"); // run dialog - parallel zdialog_wait(zd); zdialog_free(zd); return; } // image dialog event and completion function int mashup::image_dialog_event(zdialog *zd, ch *event) { using namespace mashup; int ii; float scale, angle, rad = PI / 180.0; image_t temp; if (zd->zstat) { if (zd->zstat == 1) { // add image zd->zstat = 0; add_image(); return 1; } if (zd->zstat == 2) { // remove image zd->zstat = 0; if (! strmatch(focus,"image")) return 1; ii = focusii; remove_image(ii); return 1; } zdialog_free(zd); // done or [x] kill zdimage = 0; if (zdtransp) { zdialog_free(zdtransp); zdtransp = 0; } if (zdwarp) { zdialog_free(zdwarp); zdwarp = 0; } return 1; } if (strmatch(event,"focus")) { // get mouse ownership takeMouse(mousefunc_layout,0); return 1; } if (strmatch(event,"next")) { // select and flash next image if (! Nimage) return 1; if (strmatch(focus,"image")) { if (focusii == Nimage-1) select("image",0); else select("image",focusii+1); } else select("image",0); flashimage(); Fnextimage = 1; // flag for layout mouse func. } if (strmatch(event,"prev")) { // select and flash prev. image if (! Nimage) return 1; if (strmatch(focus,"image")) { if (focusii == 0) select("image",Nimage-1); else select("image",focusii-1); } else select("image",0); flashimage(); Fnextimage = 1; } if (! strmatch(focus,"image")) return 1; // get selected image ii = focusii; if (strmatch(event,"scale")) // rescale { zdialog_fetch(zd,"scale",scale); // new image scale image_rescale(ii,scale); select("image",ii); } if (strmatch(event,"scale1x")) // rescale to 1x { zdialog_stuff(zd,"scale",1.0); image_rescale(ii,1.0); select("image",ii); } if (strmatch(event,"angle")) // rotate { zdialog_fetch(zd,"angle",angle); angle = angle * rad; image[ii].theta = angle; image[ii].cosT = cos(angle); image[ii].sinT = sin(angle); } if (strmatch(event,"raise")) { // raise image in stacking order if (ii == Nimage - 1) return 1; temp = image[ii+1]; image[ii+1] = image[ii]; image[ii] = temp; ii = focusii = ii + 1; } if (strmatch(event,"lower")) { // lower image in stacking order if (ii == 0) return 1; temp = image[ii-1]; image[ii-1] = image[ii]; image[ii] = temp; ii = focusii = ii - 1; } if (strmatch(event,"Btransp")) // base transparency, 0 to 1.0 = invisible zdialog_fetch(zd,"Btransp",image[ii].Btransp); if (strmatch(event,"vtran")) { // paint variable transparency dialog paintransp_dialog(); return 1; } if (strmatch(event,"warp")) { warp_dialog(); return 1; } if (strmatch(event,"fixmarg")) transparent_margins(); // fix black margins if (strmatch(event,"fixed")) // toggle fixed-image status zdialog_fetch(zd,"fixed",image[ii].fixed); if (strmatch(event,"Lmarg")) // left edge margin zdialog_fetch(zd,"Lmarg",image[ii].Lmarg); if (strmatch(event,"Rmarg")) // right edge zdialog_fetch(zd,"Rmarg",image[ii].Rmarg); if (strmatch(event,"Tmarg")) // top edge zdialog_fetch(zd,"Tmarg",image[ii].Tmarg); if (strmatch(event,"Bmarg")) // bottom edge zdialog_fetch(zd,"Bmarg",image[ii].Bmarg); if (strmatch(event,"Lblend")) // left edge blend width zdialog_fetch(zd,"Lblend",image[ii].Lblend); if (strmatch(event,"Rblend")) // right edge zdialog_fetch(zd,"Rblend",image[ii].Rblend); if (strmatch(event,"Tblend")) // top edge zdialog_fetch(zd,"Tblend",image[ii].Tblend); if (strmatch(event,"Bblend")) // bottom edge zdialog_fetch(zd,"Bblend",image[ii].Bblend); zmainloop(); setlayoutupdatearea(); // set layout update area Lupdate(3); // update layout composite image return 1; } // rescale an overlay image: pxb1 (1x) --> pxb2 (scale) // if warps are present, rescale from 1x and apply to pxb2 void mashup::image_rescale(int ii, float scale) { int ww1, hh1, ww2, hh2; int px1, py1, px2, py2, kk; float dx1, dy1, dx2, dy2, vstat; uint8 vpix[4], *pix2; PXB *pxb2, *pxb2w; ww1 = image[ii].ww1; // 1x image size hh1 = image[ii].hh1; ww2 = scale * ww1; // image size at scale hh2 = scale * hh1; pxb2 = PXB_rescale(image[ii].pxb1,ww2,hh2); // rescale image -> pxb2 PXB_free(image[ii].pxb2); image[ii].pxb2 = pxb2; image[ii].ww2 = ww2; image[ii].hh2 = hh2; image[ii].scale = scale; if (image[ii].warpcc) { // apply image warps to pxb2 pxb2w = PXB_copy(pxb2); for (py2 = 0; py2 < hh2; py2++) for (px2 = 0; px2 < ww2; px2++) { px1 = px2 / scale; // rescale 1x warps py1 = py2 / scale; kk = py1 * ww1 + px1; dx1 = image[ii].warpx[kk]; dy1 = image[ii].warpy[kk]; dx2 = dx1 * scale; dy2 = dy1 * scale; vstat = vpixel(image[ii].pxb2,px2+dx2,py2+dy2,vpix); pix2 = PXBpix(pxb2w,px2,py2); if (vstat) memcpy(pix2,vpix,3); else pix2[0] = pix2[1] = pix2[2] = pix2[3] = 0; } PXB_free(image[ii].pxb2); image[ii].pxb2 = pxb2w; } return; } // dialog to initiate painting image variable transparency void mashup::paintransp_dialog() { using namespace mashup; ch *ptitle = TX("Paint Image Transparencies"); /*** _________________________________ | Paint Image Transparencies | | | | Radius [123 ] [x] Gradual | | Power Center [100] Edge [ 10] | | | | [X] | |_________________________________| ***/ zdtransp = zdialog_new(ptitle,Mwin,"X",null); zdialog_add_widget(zdtransp,"hbox","hbrad","dialog",0,"space=3"); zdialog_add_widget(zdtransp,"label","labrad","hbrad",TX("Radius"),"space=5"); zdialog_add_widget(zdtransp,"zspin","radius","hbrad","5|300|1|100"); zdialog_add_widget(zdtransp,"check","gradual","hbrad",TX("Gradual"),"space=10"); zdialog_add_widget(zdtransp,"hbox","hbpow","dialog",0,"space=3"); zdialog_add_widget(zdtransp,"label","labpower","hbpow",TX("Power"),"space=5"); zdialog_add_widget(zdtransp,"label","labcen","hbpow",TX("Center"),"space=5"); zdialog_add_widget(zdtransp,"zspin","center","hbpow","0|100|1|10"); zdialog_add_widget(zdtransp,"label","space","hbpow",0,"space=6"); zdialog_add_widget(zdtransp,"label","labedge","hbpow",TX("Edge"),"space=5"); zdialog_add_widget(zdtransp,"zspin","edge","hbpow","0|100|1|3"); zdialog_stuff(zdtransp,"radius",Mradius); zdialog_stuff(zdtransp,"radius",Mradius); zdialog_stuff(zdtransp,"gradual",Mgradual); zdialog_stuff(zdtransp,"edge",Mpowedge); zdialog_run(zdtransp,paintransp_dialog_event,"save"); takeMouse(paintransp_mousefunc,0); return; } // zdialog event and completion function int mashup::paintransp_dialog_event(zdialog *zd, ch *event) { using namespace mashup; if (zd->zstat) { // done or cancel zdialog_free(zd); zdtransp = 0; takeMouse(mousefunc_layout,0); return 1; } if (strmatch(event,"focus")) { // take mouse ownership takeMouse(paintransp_mousefunc,0); return 1; } if (strmatch(event,"radius")) // mouse radius value zdialog_fetch(zd,"radius",Mradius); if (strmatch(event,"gradual")) // gradual/instant paint option zdialog_fetch(zd,"gradual",Mgradual); if (strmatch(event,"center")) // mouse center power zdialog_fetch(zd,"center",Mpowcen); if (strmatch(event,"edge")) // mouse edge power zdialog_fetch(zd,"edge",Mpowedge); return 1; } // mouse function for painting image var. transparency void mashup::paintransp_mousefunc() { using namespace mashup; int ii, Mii, jj, kk, vcc, mx, my; int distx, disty, dist, mindist; int pxlo, pylo, pxhi, pyhi; int cenx, ceny, mrad = Mradius; int ww1, hh1, ww2, hh2, transp, mtransp; int dx, dy, qx, qy, rx, ry; float sinT, cosT, scale; float px0, py0, px1, py1, px2, py2; px1 = py1 = -1; // no mouse position in image if (! strmatch(focus,"image")) { // if no image focus, draw_mousecircle(0,0,0,1,0); // no mouse circle gdk_window_set_cursor(Fgdkwin,0); } mx = Mxposn; // mouse position in layout my = Myposn; if (LMclick) // left click { LMclick = 0; // stop main window click after return mx = Mxclick; // click position my = Myclick; Mii = -1; // no selected image mindist = 9999; for (ii = 0; ii < Nimage; ii++) // find closest image center to mouse { px0 = image[ii].px0; // image position and rotation py0 = image[ii].py0; // in layout image space sinT = image[ii].sinT; cosT = image[ii].cosT; ww2 = image[ii].ww2; // image size at scale hh2 = image[ii].hh2; px1 = (mx-px0) * cosT + (my-py0) * sinT; // image pixel for layout position py1 = (my-py0) * cosT - (mx-px0) * sinT; if (px1 < 0 || px1 > ww2-1) continue; // not within image if (py1 < 0 || py1 > hh2-1) continue; pxlo = image[ii].pxlo; // image extent pxhi = image[ii].pxhi; pylo = image[ii].pylo; pyhi = image[ii].pyhi; cenx = (pxlo + pxhi) / 2; // image center ceny = (pylo + pyhi) / 2; distx = mx - cenx; disty = my - ceny; dist = sqrtf(distx * distx + disty * disty); // mouse/center distance if (dist < mindist) { mindist = dist; Mii = ii; // save closest image center } } if (Mii < 0) { // no image clicked select("",-1); // no selected image draw_mousecircle(0,0,0,1,0); // no mouse circle gdk_window_set_cursor(Fgdkwin,0); return; } ii = Mii; select("image",ii); // set selected image flashimage(); // flash selected image return; } if (! strmatch(focus,"image")) { // if no current image, draw_mousecircle(0,0,0,1,0); // no mouse circle gdk_window_set_cursor(Fgdkwin,0); return; } ii = focusii; // current image px0 = image[ii].px0; // image position and rotation py0 = image[ii].py0; // in layout image space sinT = image[ii].sinT; cosT = image[ii].cosT; ww1 = image[ii].ww1; // image size at 1x hh1 = image[ii].hh1; ww2 = image[ii].ww2; // image size at scale hh2 = image[ii].hh2; px2 = (mx-px0) * cosT + (my-py0) * sinT; // mouse position within scaled image py2 = (my-py0) * cosT - (mx-px0) * sinT; if (px2+mrad < 0 || px2-mrad > ww2 || // entire circle off image py2+mrad < 0 || py2-mrad > hh2) { draw_mousecircle(0,0,0,1,0); // no mouse circle gdk_window_set_cursor(Fgdkwin,0); return; } draw_mousecircle(mx,my,mrad,0,0); // mouse within image, draw mouse circle gdk_window_set_cursor(Fgdkwin,dragcursor); zmainloop(); // keep mouse circle visible if (! Mxdrag && ! Mydrag) return; // no drag underway Mxdrag = Mydrag = 0; // stop main window drag after return if (! image[ii].vtranmap) { // make transparency map if not already vcc = ww1 * hh1; // transparency map is 1x scale image[ii].vtranmap = (uint8 *) zmalloc(vcc,"mashup"); // and one uint8 per pixel image[ii].vtrancc = vcc; } scale = image[ii].scale; qx = px2 / scale; // mouse position in 1x image qy = py2 / scale; if (image[ii].warpcc) { // image is warped kk = qy * ww1 + qx; qx += image[ii].warpx[kk]; // source pixel in 1x image qy += image[ii].warpy[kk]; } mrad = mrad / scale; // mouse radius at 1x scale for (dy = -mrad; dy <= mrad; dy++) // loop pixels within mouse circle for (dx = -mrad; dx <= mrad; dx++) { dist = sqrtf(dx*dx + dy*dy); // distance from mouse center if (dist >= mrad) continue; // outside mouse circle if (Mgradual) { // gradual paint transparency if (drandz() < 0.005) continue; // thin active points mtransp = Mpowcen * (mrad - dist) / mrad // mouse power at distance from center + Mpowedge * dist / mrad; // Mpowcen ... Mpowedge scale 0-100 mtransp = mtransp * 0.2 + 1; // slow down } else mtransp = 255; // instant paint transparency rx = qx + dx; // 1x image pixel position ry = qy + dy; if (rx < 0 || rx > ww1-1) continue; // outside 1x image if (ry < 0 || ry > hh1-1) continue; jj = ry * ww1 + rx; // get corresp. var. transparency transp = image[ii].vtranmap[jj]; if (Mbutton == 1) { // left mouse button transp += mtransp; // increase image transparency if (transp > 255) transp = 255; // by mouse power } else { // right button transp -= mtransp; // decrease if (transp < 0) transp = 0; } image[ii].vtranmap[jj] = transp; // adjusted image transparency } updxlo = mx - mrad; // update area = mouse circle updxhi = mx + mrad; updylo = my - mrad; updyhi = my + mrad; setlayoutupdatearea(); // set layout update area Lupdate(4); // update layout composite image return; } // dialog to initiate warping an image by dragging the mouse namespace warp { float dragx, dragy, dragw, dragh; float warpD, Wspan; int Fdrag; PXB *pxb2w; int warpii; }; void mashup::warp_dialog() { using namespace mashup; using namespace warp; ch *warp_message = TX("Pull on the image with the mouse."); /*** ___________________________________ | Warp Image | | | | Pull on the image with the mouse. | | | | [undo last] [undo all] | | Warp span [___] | | | | [X] | |___________________________________| ***/ zdwarp = zdialog_new(TX("Warp Image"),Mwin,"X",null); zdialog_add_widget(zdwarp,"label","lab1","dialog",warp_message,"space=3"); zdialog_add_widget(zdwarp,"hbox","hb1","dialog",0,"space=8"); zdialog_add_widget(zdwarp,"button","undolast","hb1",TX("Undo Last"),"space=8"); zdialog_add_widget(zdwarp,"button","undoall","hb1",TX("Undo All"),"space=2"); zdialog_add_widget(zdwarp,"hbox","hb2","dialog",0,"space=4"); zdialog_add_widget(zdwarp,"label","lab2","hb2",TX("warp span"),"space=8"); zdialog_add_widget(zdwarp,"zspin","Wspan","hb2","0.00|1.0|0.01|0.5","space=1"); Wspan = 0.5; Fdrag = 0; pxb2w = 0; warpii = -1; zdialog_run(zdwarp,warp_dialog_event,"save"); // run dialog, parallel takeMouse(warp_mousefunc,0); // connect mouse function return; } // dialog event and completion callback function int mashup::warp_dialog_event(zdialog * zd, ch *event) { using namespace mashup; using namespace warp; int ii, kk; if (zd->zstat) // done or cancel { if (pxb2w) PXB_free(pxb2w); pxb2w = 0; zdialog_free(zd); // kill dialog zdwarp = 0; takeMouse(mousefunc_layout,0); // restore mouse ownership return 1; } if (! strmatch(focus,"image")) return 1; // insure image focus ii = focusii; if (strmatch(event,"focus")) // connect mouse function takeMouse(warp_mousefunc,dragcursor); if (strmatch(event,"undolast")) { if (image[ii].Nwarp == 1) event = "undoall"; else if (image[ii].Nwarp) { kk = image[ii].Nwarp - 1; dragx = image[ii].warpmem[kk][0]; // new warp = negative prior warp dragy = image[ii].warpmem[kk][1]; dragw = -image[ii].warpmem[kk][2]; dragh = -image[ii].warpmem[kk][3]; Wspan = image[ii].warpmem[kk][4]; zdialog_stuff(zd,"Wspan",Wspan); Fdrag = 0; warp_warpfunc(); image[ii].Nwarp -= 1; } } if (strmatch(event,"undoall") && image[ii].warpcc) { // undo all warps image[ii].Nwarp = 0; zfree(image[ii].warpx); zfree(image[ii].warpy); image[ii].warpx = image[ii].warpy = 0; image[ii].warpcc = 0; } if (strstr(event,"undo")) { image_rescale(ii,image[ii].scale); // pxb1 + warps -> pxb2 if (pxb2w) PXB_free(pxb2w); pxb2w = PXB_copy(image[ii].pxb2); // base for next drag/warp setlayoutupdatearea(); Lupdate(5); // update layout image } if (strmatch(event,"Wspan")) zdialog_fetch(zd,"Wspan",Wspan); return 1; } // warp mouse function // convert mouse drags to image warps void mashup::warp_mousefunc() { using namespace mashup; using namespace warp; int ii, kk, wcc, Mii; int mx, my, dx, dy, dw, dh; int distx, disty, dist, mindist; int pxlo, pylo, pxhi, pyhi; int cenx, ceny, ww1, hh1, ww2, hh2; float sinT, cosT, scale, px0, py0, px1, py1; if (LMclick) // left click { gdk_window_set_cursor(Fgdkwin,0); // no drag cursor LMclick = 0; // stop main window click after return mx = Mxclick; // click position my = Myclick; Mii = -1; // no selected image mindist = 9999; for (ii = 0; ii < Nimage; ii++) // find closest image center to mouse { px0 = image[ii].px0; // image position and rotation py0 = image[ii].py0; // in layout image space sinT = image[ii].sinT; cosT = image[ii].cosT; ww2 = image[ii].ww2; // image size at scale hh2 = image[ii].hh2; px1 = (mx-px0) * cosT + (my-py0) * sinT; // image pixel for layout position py1 = (my-py0) * cosT - (mx-px0) * sinT; if (px1 < 0 || px1 > ww2-1) continue; // not within image if (py1 < 0 || py1 > hh2-1) continue; pxlo = image[ii].pxlo; // image extent pxhi = image[ii].pxhi; pylo = image[ii].pylo; pyhi = image[ii].pyhi; cenx = (pxlo + pxhi) / 2; // image center ceny = (pylo + pyhi) / 2; distx = mx - cenx; disty = my - ceny; dist = sqrtf(distx * distx + disty * disty); // mouse/center distance if (dist < mindist) { mindist = dist; Mii = ii; // save closest image center } } if (Mii < 0) { // no image clicked select("",-1); // no selected image return; } ii = Mii; select("image",ii); // set selected image flashimage(); // flash selected image return; } if (! strmatch(focus,"image")) { // if no image focus, gdk_window_set_cursor(Fgdkwin,0); // no drag cursor return; } ii = focusii; // focus image mx = Mxposn; // mouse position in layout space my = Myposn; px0 = image[ii].px0; // image position and rotation py0 = image[ii].py0; // in layout space sinT = image[ii].sinT; cosT = image[ii].cosT; px1 = (mx-px0) * cosT + (my-py0) * sinT; // mouse position within scaled image py1 = (my-py0) * cosT - (mx-px0) * sinT; ww2 = image[ii].ww2; // image size at scale hh2 = image[ii].hh2; if (px1 < 0 || px1 > ww2 || py1 < 0 || py1 > hh2) { // mouse outside image gdk_window_set_cursor(Fgdkwin,0); // no drag cursor return; } gdk_window_set_cursor(Fgdkwin,dragcursor); // mouse inside image, drag cursor if (! pxb2w || (ii != warpii)) { // image changed if (pxb2w) PXB_free(pxb2w); // initial base image for warping pxb2w = PXB_copy(image[ii].pxb2); warpii = ii; } if (Mxdrag || Mydrag) // mouse drag underway { if (! image[ii].warpcc) // first warp for image { ww1 = image[ii].ww1; // 1x image hh1 = image[ii].hh1; wcc = ww1 * hh1 * sizeof(float); image[ii].warpx = (float *) zmalloc(wcc,"mashup"); // get memory for pixel displacements image[ii].warpy = (float *) zmalloc(wcc,"mashup"); image[ii].warpcc = wcc; image[ii].Nwarp = 0; // no warp memory data } dx = Mxdown; // drag origin, image space dy = Mydown; dw = Mxdrag - Mxdown; // drag increment dh = Mydrag - Mydown; Mxdrag = Mydrag = 0; // reset px0 = image[ii].px0; py0 = image[ii].py0; sinT = image[ii].sinT; cosT = image[ii].cosT; dragx = (dx-px0) * cosT + (dy-py0) * sinT; // drag origin in scaled image dragy = (dy-py0) * cosT - (dx-px0) * sinT; dragw = dw * cosT + dh * sinT; // drag increment in scaled image dragh = dh * cosT - dw * sinT; warpD = ww2 + hh2; // warp span warpD = warpD * Wspan; Fdrag = 1; // drag underway warp_warpfunc(); // drag pxb2 image } else if (Fdrag) // drag complete { scale = image[ii].scale; // overlay image scale dragx = dragx / scale; // conv. drag vector to 1x scale dragy = dragy / scale; dragw = dragw / scale; dragh = dragh / scale; warpD = warpD / scale; Fdrag = 0; warp_warpfunc(); // accumulate pxb1 warp positions image_rescale(ii,scale); // pxb1 + warps -> pxb2 PXB_free(pxb2w); // base for next drag/warp pxb2w = PXB_copy(image[ii].pxb2); if (image[ii].Nwarp == 200) // add drag to undo memory { image[ii].Nwarp = 199; // full, remove oldest for (kk = 0; kk < image[ii].Nwarp; kk++) { image[ii].warpmem[kk][0] = image[ii].warpmem[kk+1][0]; image[ii].warpmem[kk][1] = image[ii].warpmem[kk+1][1]; image[ii].warpmem[kk][2] = image[ii].warpmem[kk+1][2]; image[ii].warpmem[kk][3] = image[ii].warpmem[kk+1][3]; image[ii].warpmem[kk][4] = image[ii].warpmem[kk+1][4]; } } kk = image[ii].Nwarp; image[ii].warpmem[kk][0] = dragx; // save drag for undo image[ii].warpmem[kk][1] = dragy; image[ii].warpmem[kk][2] = dragw; image[ii].warpmem[kk][3] = dragh; image[ii].warpmem[kk][4] = Wspan; image[ii].Nwarp++; } setlayoutupdatearea(); // update layout image Lupdate(6); return; } // warp image and accumulate warp memory // mouse at (dragx,dragy) is moved (dragw,dragh) pixels void mashup::warp_warpfunc() { using namespace mashup; using namespace warp; do_wthreads(warp_warpfunc_wthread,NSMP); // worker threads return; } void * mashup::warp_warpfunc_wthread(void *arg) // worker thread { using namespace mashup; using namespace warp; int index = *((int *) arg); int ii, kk, px, py, vstat; int ww1, hh1, ww2, hh2; float d, mag, dx, dy; float FD = 1.0 / (warpD * warpD); uint8 vpix[4], *pix2; ii = focusii; if (Fdrag) // drag underway { ww2 = image[ii].ww2; hh2 = image[ii].hh2; for (py = index; py < hh2; py += NSMP) // process all pxb2 pixels for (px = 0; px < ww2; px++) { d = (px-dragx)*(px-dragx) + (py-dragy)*(py-dragy); // compute warp based on nearness mag = 1.0 - d * FD; // to mouse position = drag center if (mag < 0) continue; mag = mag * mag; // faster than pow(mag,4); mag = mag * mag; dx = -dragw * mag; // displacement = drag * mag dy = -dragh * mag; vstat = vpixel(pxb2w,px+dx,py+dy,vpix); // drag/warp pxb2 image pix2 = PXBpix(image[ii].pxb2,px,py); if (vstat) memcpy(pix2,vpix,3); else pix2[0] = pix2[1] = pix2[2] = pix2[3] = 0; } } else // drag complete { ww1 = image[ii].ww1; hh1 = image[ii].hh1; for (py = index; py < hh1; py += NSMP) // process all pxb1 pixels for (px = 0; px < ww1; px++) { d = (px-dragx)*(px-dragx) + (py-dragy)*(py-dragy); // compute warp based on nearness mag = 1.0 - d * FD; // to mouse position = drag center if (mag < 0) continue; mag = mag * mag; // faster than pow(mag,4); mag = mag * mag; dx = -dragw * mag; // displacement = drag * mag dy = -dragh * mag; kk = py * ww1 + px; // accumulate drag/warp image[ii].warpx[kk] += dx; // into pxb1 warp memory image[ii].warpy[kk] += dy; } } return 0; // exit thread } // make black image margins transparent void mashup::transparent_margins() { int ii, ww1, hh1, px, py; PXB *pxb1; uint8 *pixel; for (ii = 0; ii < Nimage; ii++) // loop all images { ww1 = image[ii].ww1; // image 1x size hh1 = image[ii].hh1; pxb1 = image[ii].pxb1; for (py = 0; py < hh1; py++) // loop all rows { for (px = 0; px < ww1/2; px++) // from left edge to middle { pixel = PXBpix(pxb1,px,py); if (pixel[0] > 0 || pixel[1] > 0 || pixel[2] > 1) break; // break out at first non-black pixel pixel[3] = 0; // pixel has full transparency } for (px = ww1-1; px > ww1/2; px--) // from right edge to middle { pixel = PXBpix(pxb1,px,py); if (pixel[0] > 0 || pixel[1] > 0 || pixel[2] > 1) break; pixel[3] = 0; } } for (px = 0; px < ww1; px++) // from top to middle { for (py = 0; py < hh1/2; py++) { pixel = PXBpix(pxb1,px,py); if (pixel[0] > 0 || pixel[1] > 0 || pixel[2] > 1) break; pixel[3] = 0; } for (py = hh1-1; py > hh1/2; py--) // from bottom to middle { pixel = PXBpix(pxb1,px,py); if (pixel[0] > 0 || pixel[1] > 0 || pixel[2] > 1) break; pixel[3] = 0; } } image_rescale(ii,image[ii].scale); // update scaled image pxb2 } Fupdall = 1; Lupdate(7); // update layout composite image return; } // select and add one or more new overlay image files void mashup::add_image() { using namespace mashup; int ii, jj, nn, cc, Nfiles = 0; int ww1, hh1, ww2, hh2; float scale; ch **sfiles = 0, *file; PXB *pxb1; zdialog_show(zdimage,0); // hide parent dialog select_files(0); // select image files from gallery Fpxb = PXB_copy(Lpxb); // restore mashup view viewmode('F'); zdialog_show(zdimage,1); if (! SFcount) return; // nothing selected sfiles = (ch **) zmalloc(SFcount * sizeof(ch *),"mashup"); for (ii = 0; ii < SFcount; ii++) sfiles[ii] = SelFiles[ii]; Nfiles = SFcount; SFcount = 0; for (nn = 0; nn < Nfiles; nn++) { if (Nimage == maxmash) { zmessageACK(Mwin,TX("exceed %d images"),maxmash); break; } file = sfiles[nn]; pxb1 = PXB_load(file,1); // load image, ACK errors if (! pxb1) { zfree(file); continue; } PXB_addalpha(pxb1); // add alpha channel if missing ii = Nimage++; // new image cc = sizeof(image_t); // clear image data memset(&image[ii],0,cc); image[ii].file = file; // add image file to mashup list image[ii].pxb1 = pxb1; ww1 = pxb1->ww; hh1 = pxb1->hh; scale = 1.0; if (scale * ww1 / Lww > 0.3) scale = 0.3 * Lww / ww1; // if image > 30% layout, reduce to 30% if (scale * hh1 / Lhh > 0.3) scale = 0.3 * Lhh / hh1; ww2 = ww1 * scale; hh2 = hh1 * scale; image[ii].scale = scale; image[ii].ww1 = ww1; image[ii].hh1 = hh1; image[ii].ww2 = ww2; image[ii].hh2 = hh2; image[ii].pxb2 = PXB_rescale(image[ii].pxb1,ww2,hh2); // scaled image for display image[ii].theta = 0.0; image[ii].sinT = 0; image[ii].cosT = 1.0; jj = ii; while (jj >= 25) jj -= 25; image[ii].py0 = (jj / 5) * 0.20 * Lhh; // initial position image[ii].px0 = (jj % 5) * 0.20 * Lww; select("image",ii); setlayoutupdatearea(); // set layout update area } while (nn < Nfiles) zfree(sfiles[nn++]); // free unused files zfree(sfiles); select("",-1); // nothing selected Fupdall = 1; Lupdate(8); // update layout composite image return; } // remove an overlay image void mashup::remove_image(int ii) { using namespace mashup; select("image",ii); setlayoutupdatearea(); // set layout update area zfree(image[ii].file); // free memory PXB_free(image[ii].pxb1); PXB_free(image[ii].pxb2); if (image[ii].vtranmap) zfree(image[ii].vtranmap); for (int jj = ii+1; jj < Nimage; jj++) // pack-down image list image[ii] = image[jj]; Nimage--; // image count select("",-1); // no selected image Fupdall = 1; Lupdate(9); // update layout composite image return; } // flash a selected image as bright as possible for a short moment void mashup::flashimage() { int ii, px, py, ww2, hh2; int xlo, xhi, ylo, yhi; float px0, py0, px1, py1, px2, py2; float sinT, cosT; uint8 *pix2, vpix[4]; PXB *pxb2; if (! strmatch(focus,"image")) return; ii = focusii; xlo = image[ii].pxlo; // overlay image extent in layout image xhi = image[ii].pxhi; ylo = image[ii].pylo; yhi = image[ii].pyhi; for (py = ylo; py < yhi; py++) for (px = xlo; px < xhi; px++) { px1 = px; py1 = py; px0 = image[ii].px0; // overlay image position and rotation py0 = image[ii].py0; // in layout image space pxb2 = image[ii].pxb2; sinT = image[ii].sinT; cosT = image[ii].cosT; ww2 = image[ii].ww2; // image size at scale hh2 = image[ii].hh2; px2 = (px1-px0) * cosT + (py1-py0) * sinT; // overlay image pixel for layout position py2 = (py1-py0) * cosT - (px1-px0) * sinT; if (px2 < 0 || px2 > ww2-1) continue; // not within image if (py2 < 0 || py2 > hh2-1) continue; pix2 = PXBpix(Fpxb,px,py); // output image pixel if (! vpixel(pxb2,px2,py2,vpix)) continue; // overlay image virt. pixel pix2[0] = vpix[1]; // rotate the colors pix2[1] = vpix[2]; pix2[2] = vpix[0]; } ww2 = xhi - xlo; hh2 = yhi - ylo; PXB_PXB_update(Fpxb,Mpxb,xlo,ylo,ww2,hh2); // Fpxb > Mpxb, scaled up or down Fpaint4(xlo,ylo,ww2,hh2,0); // update drawing window from Mpxb zmainsleep(0.1); // hold for a moment setlayoutupdatearea(); // set layout update area Lupdate(10); // update layout composite image return; } /**************************************************************************************/ // add text to image or revise existing text void mashup::text_edit() { using namespace mashup; ch *intro = TX("Enter text, [Add] to layout, edit properties."); /*** __________________________________________________ | Edit Text | | | | Enter text, [Add] to layout, edit properties. | | | | Text [______________________________________] | | | | [font] [FreeSans______________] size [ 44 ] | | | | color transp. width angle | | text [_____] [_____] [_____] | | backing [_____] [_____] | | outline [_____] [_____] [_____] | | shadow [_____] [_____] [_____] [_____] | | | | Text File: [Open] [Save] | | | | [Clear] [Apply] [Delete] [X] | |__________________________________________________| ***/ if (! strmatch(focus,"text")) select("",-1); // nothing selected zdtext = zdialog_new(TX("Edit Text"),Mwin,TX("Clear"),TX("Apply"),TX("Delete"),"X",null); zdialog *zd = zdtext; zdialog_add_widget(zd,"label","intro","dialog",intro,"space=3"); zdialog_add_widget(zd,"hbox","hbtext","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labtext","hbtext",TX("Text"),"space=5"); zdialog_add_widget(zd,"zedit","text","hbtext","","expand"); zdialog_add_widget(zd,"hbox","hbfont","dialog",0,"space=3"); zdialog_add_widget(zd,"button","fontbutt","hbfont",TX("Font")); zdialog_add_widget(zd,"zentry","fontname","hbfont",TX("FreeSans"),"space=2|expand"); zdialog_add_widget(zd,"label","labsize","hbfont",TX("Size"),"space=2"); zdialog_add_widget(zd,"zspin","fontsize","hbfont","8|500|1|40"); zdialog_add_widget(zd,"hbox","hbcol","dialog",0,"space=3"); zdialog_add_widget(zd,"vbox","vbcol1","hbcol",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbcol2","hbcol",0,"homog|space=2"); zdialog_add_widget(zd,"vbox","vbcol3","hbcol",0,"homog|space=2"); zdialog_add_widget(zd,"vbox","vbcol4","hbcol",0,"homog|space=2"); zdialog_add_widget(zd,"vbox","vbcol5","hbcol",0,"homog|space=2"); zdialog_add_widget(zd,"label","space","vbcol1"); zdialog_add_widget(zd,"label","labtext","vbcol1",TX("text")); zdialog_add_widget(zd,"label","labback","vbcol1",TX("backing")); zdialog_add_widget(zd,"label","laboutln","vbcol1",TX("outline")); zdialog_add_widget(zd,"label","labshadow","vbcol1",TX("shadow")); zdialog_add_widget(zd,"label","labcol","vbcol2",TX("Color")); zdialog_add_widget(zd,"colorbutt","fgcolor","vbcol2","0|0|0"); zdialog_add_widget(zd,"colorbutt","bgcolor","vbcol2","255|255|255"); zdialog_add_widget(zd,"colorbutt","tocolor","vbcol2","255|0|0"); zdialog_add_widget(zd,"colorbutt","shcolor","vbcol2","0|255|0"); zdialog_add_widget(zd,"label","labcol","vbcol3",TX("Transp.")); zdialog_add_widget(zd,"zspin","fgtransp","vbcol3","0|100|1|0"); zdialog_add_widget(zd,"zspin","bgtransp","vbcol3","0|100|1|0"); zdialog_add_widget(zd,"zspin","totransp","vbcol3","0|100|1|0"); zdialog_add_widget(zd,"zspin","shtransp","vbcol3","0|100|1|0"); zdialog_add_widget(zd,"label","labw","vbcol4",TX("Width")); zdialog_add_widget(zd,"label","space","vbcol4"); zdialog_add_widget(zd,"label","space","vbcol4"); zdialog_add_widget(zd,"zspin","towidth","vbcol4","0|30|1|0"); zdialog_add_widget(zd,"zspin","shwidth","vbcol4","0|50|1|0"); zdialog_add_widget(zd,"label","labw","vbcol5",TX("Angle")); zdialog_add_widget(zd,"zspin","angle","vbcol5","-180|180|0.1|0"); zdialog_add_widget(zd,"label","space","vbcol5"); zdialog_add_widget(zd,"label","space","vbcol5"); zdialog_add_widget(zd,"zspin","shangle","vbcol5","-180|180|1|0"); zdialog_add_widget(zd,"hbox","hbaf","dialog",0,"space=10"); zdialog_add_widget(zd,"label","labbg","hbaf",TX("Text File:"),"space=3"); zdialog_add_widget(zd,"button","loadtext","hbaf",TX("Open"),"space=5"); zdialog_add_widget(zd,"button","savetext","hbaf",TX("Save"),"space=5"); zdialog_add_ttip(zd,"Clear",TX("clear entered text")); zdialog_add_ttip(zd,"Apply",TX("add entered text to layout")); zdialog_add_ttip(zd,"Delete",TX("delete selected text from layout")); zdialog_add_ttip(zd,"OK",TX("commit all changes, close dialog")); zdialog_load_inputs(zd); // restore prior inputs zdialog_run(zd,text_dialog_event,"save"); // run dialog, parallel zdialog_wait(zd); zdialog_free(zd); return; } // dialog event and completion callback function int mashup::text_dialog_event(zdialog *zd, ch *event) { using namespace mashup; GtkWidget *font_dialog; ch font[80], fname[70]; int ii, size; ch *pp; if (zd->zstat) { if (zd->zstat == 1) { // [clear] zd->zstat = 0; zdialog_stuff(zd,"text",""); focus = ""; return 1; } if (zd->zstat == 2) { // [apply] zd->zstat = 0; add_text(); // zdialog inputs >> new text image return 1; } if (zd->zstat == 3) { // [delete] zd->zstat = 0; if (! strmatch(focus,"text")) return 1; ii = focusii; remove_text(ii); // remove selected text image return 1; } zdialog_free(zd); // [OK] or [x] kill zdtext = 0; return 1; } if (strmatch(event,"focus")) { // get mouse ownership takeMouse(mousefunc_layout,0); return 1; } if (strmatch(event,"loadtext")) // load text data from file load_text(zdtext); // and stuff zdialog fields if (strmatch(event,"savetext")) { // get all zdialog fields save_text(zdtext); // and save them to a file return 1; } if (strmatch(event,"fontbutt")) // set new font { zdialog_fetch(zd,"fontname",fname,70); zdialog_fetch(zd,"fontsize",size); snprintf(font,80,"%s %d",fname,size); font_dialog = gtk_font_chooser_dialog_new(TX("select font"),MWIN); gtk_font_chooser_set_font(GTK_FONT_CHOOSER(font_dialog),font); gtk_dialog_run(GTK_DIALOG(font_dialog)); pp = gtk_font_chooser_get_font(GTK_FONT_CHOOSER(font_dialog)); gtk_widget_destroy(font_dialog); if (pp) { // should have "fontname nn" strncpy0(font,pp,80); g_free(pp); pp = font + strlen(font); while (*pp != ' ') pp--; if (pp > font) { // set both font name and size size = atoi(pp); if (size < 8) size = 8; zdialog_stuff(zd,"fontsize",size); *pp = 0; zdialog_stuff(zd,"fontname",font); } } } if (! strmatch(focus,"text")) return 1; // selected text image ii = focusii; zdialog_fetch(zd,"text",text[ii].attr.text,1000); // initz. new text and attributes zdialog_fetch(zd,"fontname",text[ii].attr.font,80); zdialog_fetch(zd,"fontsize",text[ii].attr.size); zdialog_fetch(zd,"angle",text[ii].attr.angle); zdialog_fetch(zd,"fgcolor",text[ii].attr.color[0],20); zdialog_fetch(zd,"bgcolor",text[ii].attr.color[1],20); zdialog_fetch(zd,"tocolor",text[ii].attr.color[2],20); zdialog_fetch(zd,"shcolor",text[ii].attr.color[3],20); zdialog_fetch(zd,"fgtransp",text[ii].attr.transp[0]); zdialog_fetch(zd,"bgtransp",text[ii].attr.transp[1]); zdialog_fetch(zd,"totransp",text[ii].attr.transp[2]); zdialog_fetch(zd,"shtransp",text[ii].attr.transp[3]); zdialog_fetch(zd,"towidth",text[ii].attr.towidth); zdialog_fetch(zd,"shwidth",text[ii].attr.shwidth); zdialog_fetch(zd,"shangle",text[ii].attr.shangle); gentext(&text[ii].attr); // generate new text image text[ii].ww = text[ii].attr.pxb_text->ww; text[ii].hh = text[ii].attr.pxb_text->hh; zmainloop(); // update dialog controls setlayoutupdatearea(); // set layout update area Lupdate(11); // update layout composite image return 1; } // add new text entry to text[ii] list // get text and attributes from zdialog fields void mashup::add_text() { using namespace mashup; int ii; zdialog *zd = zdtext; ch *tip = TX("click position to add text"); if (! zd) return; if (zdaddtext) return; if (Ntext == maxmash) { zmessageACK(Mwin,TX("exceeded %d text entries"),maxmash); return; } Mxclick = Myclick = 0; zdaddtext = zdialog_new("Add Text",Mwin,"X",null); // get mouse click for text position zdialog_set_decorated(zdaddtext,0); zdialog_add_widget(zdaddtext,"label","labtip","dialog",tip,"space=3"); zdialog_run(zdaddtext,0,"mouse"); zdialog_wait(zdaddtext); zdialog_free(zdaddtext); if (! (Mxclick + Myclick)) return; ii = Ntext++; memset(&text[ii],0,sizeof(text_t)); zdialog_fetch(zd,"text",text[ii].attr.text,1000); // initz. new text and attributes zdialog_fetch(zd,"fontname",text[ii].attr.font,80); zdialog_fetch(zd,"fontsize",text[ii].attr.size); zdialog_fetch(zd,"angle",text[ii].attr.angle); zdialog_fetch(zd,"fgcolor",text[ii].attr.color[0],20); zdialog_fetch(zd,"bgcolor",text[ii].attr.color[1],20); zdialog_fetch(zd,"tocolor",text[ii].attr.color[2],20); zdialog_fetch(zd,"shcolor",text[ii].attr.color[3],20); zdialog_fetch(zd,"fgtransp",text[ii].attr.transp[0]); zdialog_fetch(zd,"bgtransp",text[ii].attr.transp[1]); zdialog_fetch(zd,"totransp",text[ii].attr.transp[2]); zdialog_fetch(zd,"shtransp",text[ii].attr.transp[3]); zdialog_fetch(zd,"towidth",text[ii].attr.towidth); zdialog_fetch(zd,"shwidth",text[ii].attr.shwidth); zdialog_fetch(zd,"shangle",text[ii].attr.shangle); gentext(&text[ii].attr); // generate new text image text[ii].ww = text[ii].attr.pxb_text->ww; text[ii].hh = text[ii].attr.pxb_text->hh; text[ii].px0 = Mxclick; // set initial position text[ii].py0 = Myclick; select("text",ii); // set selected text image setlayoutupdatearea(); // set layout update area Lupdate(12); // update layout composite image return; } // remove text entry from text[ii] void mashup::remove_text(int ii) { using namespace mashup; select("text",ii); setlayoutupdatearea(); // set layout update area PXB_free(text[ii].attr.pxb_text); for (int jj = ii+1; jj < Ntext; jj++) // pack down text list text[jj-1] = text[jj]; Ntext--; // text count select("",-1); // nothing selected Fupdall = 1; Lupdate(13); // update layout composite image return; } // flash a selected text image as bright as possible for a short moment void mashup::flashtext() { int ii, jj, red, green, blue; ch savecolor[4][20], flashcolor[20]; if (! strmatch(focus,"text")) return; ii = focusii; for (jj = 0; jj < 4; jj++) // save text colors strcpy(savecolor[jj],text[ii].attr.color[jj]); for (jj = 0; jj < 4; jj++) { // get complimentary colors red = 255 - atoi(substring(text[ii].attr.color[jj],'|',1)); green = 255 - atoi(substring(text[ii].attr.color[jj],'|',2)); blue = 255 - atoi(substring(text[ii].attr.color[jj],'|',3)); snprintf(flashcolor,20,"%d|%d|%d",red,green,blue); strcpy(text[ii].attr.color[jj],flashcolor); } gentext(&text[ii].attr); // generate complimentary text image zmainloop(); setlayoutupdatearea(); // set layout update area Lupdate(14); // update layout composite image zsleep(0.05); // hold for a moment for (jj = 0; jj < 4; jj++) // restore text colors strcpy(text[ii].attr.color[jj],savecolor[jj]); gentext(&text[ii].attr); // gemerate normal text image zmainloop(); setlayoutupdatearea(); // set layout update area Lupdate(15); // update layout composite image return; } /**************************************************************************************/ // add a line/arrow to image or revise existing line/arrow void mashup::line_edit() { using namespace mashup; ch *intro = TX("Set line properties, [Add] to layout, edit."); /*** _______________________________________________ | Edit Line/Arrow | | | | Set line properties, [Add] to layout, edit. | | | | Line length [____] width [____] | | Arrow head [x] left [x] right | | | | color transp. width angle | | line [_____] [_____] [_____] | | backing [_____] [_____] | | outline [_____] [_____] [_____] | | shadow [_____] [_____] [_____] [_____] | | | | [Add] [Delete] [X] | |_______________________________________________| ***/ if (! strmatch(focus,"line")) select("",-1); // nothing selected zdline = zdialog_new(TX("Edit Line/Arrow"),Mwin,TX("Add"),TX("Delete"),"X",null); zdialog *zd = zdline; zdialog_add_widget(zd,"label","intro","dialog",intro,"space=3"); zdialog_add_widget(zd,"hbox","hbline","dialog",0,"space=3"); zdialog_add_widget(zd,"label","lablength","hbline",TX("Line length"),"space=5"); zdialog_add_widget(zd,"zspin","length","hbline","2|9999|1|20"); zdialog_add_widget(zd,"label","space","hbline",0,"space=10"); zdialog_add_widget(zd,"label","labwidth","hbline",TX("Width"),"space=5"); zdialog_add_widget(zd,"zspin","width","hbline","1|99|1|2"); zdialog_add_widget(zd,"hbox","hbarrow","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labarrow","hbarrow",TX("Arrow head"),"space=5"); zdialog_add_widget(zd,"check","larrow","hbarrow",TX("Left")); zdialog_add_widget(zd,"label","space","hbarrow",0,"space=10"); zdialog_add_widget(zd,"check","rarrow","hbarrow",TX("Right")); zdialog_add_widget(zd,"hbox","hbcol","dialog"); zdialog_add_widget(zd,"vbox","vbcol1","hbcol",0,"homog|space=5"); zdialog_add_widget(zd,"vbox","vbcol2","hbcol",0,"homog|space=2"); zdialog_add_widget(zd,"vbox","vbcol3","hbcol",0,"homog|space=2"); zdialog_add_widget(zd,"vbox","vbcol4","hbcol",0,"homog|space=2"); zdialog_add_widget(zd,"vbox","vbcol5","hbcol",0,"homog|space=2"); zdialog_add_widget(zd,"label","space","vbcol1"); zdialog_add_widget(zd,"label","labline","vbcol1",TX("line")); zdialog_add_widget(zd,"label","labback","vbcol1",TX("backing")); zdialog_add_widget(zd,"label","laboutln","vbcol1",TX("outline")); zdialog_add_widget(zd,"label","labshadow","vbcol1",TX("shadow")); zdialog_add_widget(zd,"label","labcol","vbcol2",TX("Color")); zdialog_add_widget(zd,"colorbutt","fgcolor","vbcol2","0|0|0"); zdialog_add_widget(zd,"colorbutt","bgcolor","vbcol2","255|255|255"); zdialog_add_widget(zd,"colorbutt","tocolor","vbcol2","255|0|0"); zdialog_add_widget(zd,"colorbutt","shcolor","vbcol2","0|255|0"); zdialog_add_widget(zd,"label","labcol","vbcol3",TX("Transp.")); zdialog_add_widget(zd,"zspin","fgtransp","vbcol3","0|100|1|0"); zdialog_add_widget(zd,"zspin","bgtransp","vbcol3","0|100|1|0"); zdialog_add_widget(zd,"zspin","totransp","vbcol3","0|100|1|0"); zdialog_add_widget(zd,"zspin","shtransp","vbcol3","0|100|1|0"); zdialog_add_widget(zd,"label","labw","vbcol4",TX("Width")); zdialog_add_widget(zd,"label","space","vbcol4"); zdialog_add_widget(zd,"label","space","vbcol4"); zdialog_add_widget(zd,"zspin","towidth","vbcol4","0|30|1|0"); zdialog_add_widget(zd,"zspin","shwidth","vbcol4","0|50|1|0"); zdialog_add_widget(zd,"label","labw","vbcol5",TX("Angle")); zdialog_add_widget(zd,"zspin","angle","vbcol5","-180|180|0.1|0"); zdialog_add_widget(zd,"label","space","vbcol5"); zdialog_add_widget(zd,"label","space","vbcol5"); zdialog_add_widget(zd,"zspin","shangle","vbcol5","-180|180|1|0"); zdialog_add_ttip(zd,"Add",TX("add line/arrow to layout")); zdialog_load_inputs(zd); // restore prior inputs zdialog_run(zd,line_dialog_event,"save"); // run dialog, parallel zdialog_wait(zd); zdialog_free(zd); return; } // dialog event and completion callback function int mashup::line_dialog_event(zdialog *zd, ch *event) { using namespace mashup; int ii; if (zd->zstat) { if (zd->zstat == 1) { // add zd->zstat = 0; add_line(); // zdialog inputs >> new line/arrow image return 1; } if (zd->zstat == 2) { // delete zd->zstat = 0; if (! strmatch(focus,"line")) return 1; ii = focusii; remove_line(ii); // remove selected line/arrow image return 1; } zdialog_free(zd); // done or [x] kill zdline = 0; return 1; } if (strmatch(event,"focus")) { // get mouse ownership takeMouse(mousefunc_layout,0); return 1; } ii = focusii; if (ii < 0) return 1; zdialog_fetch(zd,"length",line[ii].attr.length); zdialog_fetch(zd,"width",line[ii].attr.width); zdialog_fetch(zd,"larrow",line[ii].attr.larrow); zdialog_fetch(zd,"rarrow",line[ii].attr.rarrow); zdialog_fetch(zd,"angle",line[ii].attr.angle); zdialog_fetch(zd,"fgcolor",line[ii].attr.color[0],20); zdialog_fetch(zd,"bgcolor",line[ii].attr.color[1],20); zdialog_fetch(zd,"tocolor",line[ii].attr.color[2],20); zdialog_fetch(zd,"shcolor",line[ii].attr.color[3],20); zdialog_fetch(zd,"fgtransp",line[ii].attr.transp[0]); zdialog_fetch(zd,"bgtransp",line[ii].attr.transp[1]); zdialog_fetch(zd,"totransp",line[ii].attr.transp[2]); zdialog_fetch(zd,"shtransp",line[ii].attr.transp[3]); zdialog_fetch(zd,"towidth",line[ii].attr.towidth); zdialog_fetch(zd,"shwidth",line[ii].attr.shwidth); zdialog_fetch(zd,"shangle",line[ii].attr.shangle); genline(&line[ii].attr); // generate new line/arrow image zmainloop(); line[ii].ww = line[ii].attr.pxb_line->ww; line[ii].hh = line[ii].attr.pxb_line->hh; setlayoutupdatearea(); // set layout update area Lupdate(16); // update layout composite image return 1; } // add new line/arrow entry to line[ii] list // get line attributes from zdialog fields void mashup::add_line() { using namespace mashup; int ii; zdialog *zd = zdline; ch *tip = TX("click position to add line"); if (! zd) return; if (zdaddline) return; if (Nline == maxmash) { zmessageACK(Mwin,TX("exceeded %d line entries"),maxmash); return; } Mxclick = Myclick = 0; zdaddline = zdialog_new(TX("Add Line"),Mwin,"X",null); // get mouse click for line position zdialog_set_decorated(zdaddline,0); zdialog_add_widget(zdaddline,"label","labtip","dialog",tip,"space=3"); zdialog_run(zdaddline,0,"mouse"); zdialog_wait(zdaddline); zdialog_free(zdaddline); if (! (Mxclick + Myclick)) return; ii = Nline++; memset(&line[ii],0,sizeof(line_t)); zdialog_fetch(zd,"length",line[ii].attr.length); zdialog_fetch(zd,"width",line[ii].attr.width); zdialog_fetch(zd,"larrow",line[ii].attr.larrow); zdialog_fetch(zd,"rarrow",line[ii].attr.rarrow); zdialog_fetch(zd,"angle",line[ii].attr.angle); zdialog_fetch(zd,"fgcolor",line[ii].attr.color[0],20); zdialog_fetch(zd,"bgcolor",line[ii].attr.color[1],20); zdialog_fetch(zd,"tocolor",line[ii].attr.color[2],20); zdialog_fetch(zd,"shcolor",line[ii].attr.color[3],20); zdialog_fetch(zd,"fgtransp",line[ii].attr.transp[0]); zdialog_fetch(zd,"bgtransp",line[ii].attr.transp[1]); zdialog_fetch(zd,"totransp",line[ii].attr.transp[2]); zdialog_fetch(zd,"shtransp",line[ii].attr.transp[3]); zdialog_fetch(zd,"towidth",line[ii].attr.towidth); zdialog_fetch(zd,"shwidth",line[ii].attr.shwidth); zdialog_fetch(zd,"shangle",line[ii].attr.shangle); genline(&line[ii].attr); // generate new line/arrow image line[ii].ww = line[ii].attr.pxb_line->ww; line[ii].hh = line[ii].attr.pxb_line->hh; line[ii].px0 = Mxclick; // initial position line[ii].py0 = Myclick; select("line",ii); // set selected line/arrow image setlayoutupdatearea(); // set layout update area Lupdate(17); // update layout composite image return; } // remove line/arrow entry from line[ii] void mashup::remove_line(int ii) { using namespace mashup; select("line",ii); setlayoutupdatearea(); // set layout update area PXB_free(line[ii].attr.pxb_line); for (int jj = ii+1; jj < Nline; jj++) // pack down line list line[jj-1] = line[jj]; Nline--; // line/arrow count select("",-1); // nothing selected Fupdall = 1; Lupdate(18); // update layout composite image return; } // flash a selected line/arrow image as bright as possible for a short moment void mashup::flashline() { int ii, jj, red, green, blue; ch savecolor[4][20], flashcolor[20]; if (! strmatch(focus,"line")) return; ii = focusii; for (jj = 0; jj < 4; jj++) // save line colors strcpy(savecolor[jj],line[ii].attr.color[jj]); for (jj = 0; jj < 4; jj++) { // get complimentary colors red = 255 - atoi(substring(line[ii].attr.color[jj],'|',1)); green = 255 - atoi(substring(line[ii].attr.color[jj],'|',2)); blue = 255 - atoi(substring(line[ii].attr.color[jj],'|',3)); snprintf(flashcolor,20,"%d|%d|%d",red,green,blue); strcpy(line[ii].attr.color[jj],flashcolor); } genline(&line[ii].attr); // generate complimentary image zmainloop(); setlayoutupdatearea(); // set layout update area Lupdate(19); // update layout composite image zsleep(0.5); // hold for a moment for (jj = 0; jj < 4; jj++) // restore line colors strcpy(line[ii].attr.color[jj],savecolor[jj]); genline(&line[ii].attr); // gemerate normal line image zmainloop(); setlayoutupdatearea(); // set layout update area Lupdate(20); // update layout composite image return; } /**************************************************************************************/ // select an image, text image, or line/arrow image - update active dialog // which = "image" or "text" or "line" or "" to select nothing void mashup::select(ch *which, int ii) { using namespace mashup; ch *pp; float rad = 180 / PI; zdialog *zd; if (strmatch(which,"image") && ii >= 0) { if (ii >= Nimage) zappcrash("bad image index"); focus = "image"; // for KB key drags focusii = ii; zd = zdimage; if (! zd) return; // no active edit image dialog pp = strrchr(image[ii].file,'/'); // stuff zdialog fields zdialog_stuff(zd,"currfile",pp+1); // from selected image zdialog_stuff(zd,"scale",image[ii].scale); zdialog_stuff(zd,"angle",image[ii].theta * rad); zdialog_stuff(zd,"Btransp",image[ii].Btransp); zdialog_stuff(zd,"fixed",image[ii].fixed); zdialog_stuff(zd,"Lmarg",image[ii].Lmarg); zdialog_stuff(zd,"Rmarg",image[ii].Rmarg); zdialog_stuff(zd,"Tmarg",image[ii].Tmarg); zdialog_stuff(zd,"Bmarg",image[ii].Bmarg); zdialog_stuff(zd,"Lblend",image[ii].Lblend); zdialog_stuff(zd,"Rblend",image[ii].Rblend); zdialog_stuff(zd,"Tblend",image[ii].Tblend); zdialog_stuff(zd,"Bblend",image[ii].Bblend); return; } if (strmatch(which,"text") && ii >= 0) { if (ii >= Ntext) zappcrash("bad text index"); focus = "text"; // for KB key drags focusii = ii; zd = zdtext; if (! zd) return; // no active edit text dialog zdialog_stuff(zd,"text",text[ii].attr.text); // stuff zdialog fields zdialog_stuff(zd,"fontname",text[ii].attr.font); // from selected text image zdialog_stuff(zd,"fontsize",text[ii].attr.size); zdialog_stuff(zd,"angle",text[ii].attr.angle); zdialog_stuff(zd,"fgcolor",text[ii].attr.color[0]); zdialog_stuff(zd,"bgcolor",text[ii].attr.color[1]); zdialog_stuff(zd,"tocolor",text[ii].attr.color[2]); zdialog_stuff(zd,"shcolor",text[ii].attr.color[3]); zdialog_stuff(zd,"fgtransp",text[ii].attr.transp[0]); zdialog_stuff(zd,"bgtransp",text[ii].attr.transp[1]); zdialog_stuff(zd,"totransp",text[ii].attr.transp[2]); zdialog_stuff(zd,"shtransp",text[ii].attr.transp[3]); zdialog_stuff(zd,"towidth",text[ii].attr.towidth); zdialog_stuff(zd,"shwidth",text[ii].attr.shwidth); zdialog_stuff(zd,"shangle",text[ii].attr.shangle); return; } if (strmatch(which,"line") && ii >= 0) { if (ii >= Nline) zappcrash("bad line index"); focus = "line"; // for KB key drags focusii = ii; zd = zdline; if (! zd) return; // no active edit line/arrow dialog zdialog_stuff(zd,"length",line[ii].attr.length); zdialog_stuff(zd,"width",line[ii].attr.width); zdialog_stuff(zd,"larrow",line[ii].attr.larrow); zdialog_stuff(zd,"rarrow",line[ii].attr.rarrow); zdialog_stuff(zd,"angle",line[ii].attr.angle); zdialog_stuff(zd,"fgcolor",line[ii].attr.color[0]); zdialog_stuff(zd,"bgcolor",line[ii].attr.color[1]); zdialog_stuff(zd,"tocolor",line[ii].attr.color[2]); zdialog_stuff(zd,"shcolor",line[ii].attr.color[3]); zdialog_stuff(zd,"fgtransp",line[ii].attr.transp[0]); zdialog_stuff(zd,"bgtransp",line[ii].attr.transp[1]); zdialog_stuff(zd,"totransp",line[ii].attr.transp[2]); zdialog_stuff(zd,"shtransp",line[ii].attr.transp[3]); zdialog_stuff(zd,"towidth",line[ii].attr.towidth); zdialog_stuff(zd,"shwidth",line[ii].attr.shwidth); zdialog_stuff(zd,"shangle",line[ii].attr.shangle); return; } focus = ""; // no selection focusii = -1; zd = zdimage; if (! zd) return; zdialog_stuff(zd,"currfile","*********"); // mark obvious no selection return; } // Set the update area for the layout based on // the current selected image, text, or line/arrow. void mashup::setlayoutupdatearea() { using namespace mashup; int pxlo, pxhi, pylo, pyhi; int ii, px, py, px0, py0; int ww, hh, ww2, hh2; float cosT, sinT; Fupdall = 0; if (strmatch(focus,"image")) { ii = focusii; px0 = image[ii].px0; py0 = image[ii].py0; ww2 = image[ii].ww2; // image size at scale hh2 = image[ii].hh2; cosT = image[ii].cosT; sinT = image[ii].sinT; pxlo = pxhi = px0; // NW corner pylo = pyhi = py0; px = px0 + ww2 * cosT; // NE if (px < pxlo) pxlo = px; if (px > pxhi) pxhi = px; py = py0 + ww2 * sinT; if (py < pylo) pylo = py; if (py > pyhi) pyhi = py; px = px0 + ww2 * cosT - hh2 * sinT; // SE if (px < pxlo) pxlo = px; if (px > pxhi) pxhi = px; py = py0 + hh2 * cosT + ww2 * sinT; if (py < pylo) pylo = py; if (py > pyhi) pyhi = py; px = px0 - hh2 * sinT; // SW if (px < pxlo) pxlo = px; if (px > pxhi) pxhi = px; py = py0 + hh2 * cosT; if (py < pylo) pylo = py; if (py > pyhi) pyhi = py; if (pxlo < 0) pxlo = 0; if (pxhi > Lww) pxhi = Lww; if (pylo < 0) pylo = 0; if (pyhi > Lhh) pyhi = Lhh; updxlo = image[ii].pxlo = pxlo; updxhi = image[ii].pxhi = pxhi; updylo = image[ii].pylo = pylo; updyhi = image[ii].pyhi = pyhi; } else if (strmatch(focus,"text")) { ii = focusii; px0 = text[ii].px0; py0 = text[ii].py0; ww = text[ii].ww; hh = text[ii].hh; updxlo = text[ii].pxlo = px0; // set update region updxhi = text[ii].pxhi = px0 + ww; updylo = text[ii].pylo = py0; updyhi = text[ii].pyhi = py0 + hh; } else if (strmatch(focus,"line")) { ii = focusii; px0 = line[ii].px0; py0 = line[ii].py0; ww = line[ii].ww; hh = line[ii].hh; updxlo = line[ii].pxlo = px0; // set update region updxhi = line[ii].pxhi = px0 + ww; updylo = line[ii].pylo = py0; updyhi = line[ii].pyhi = py0 + hh; } return; } // mouse function - called for mouse events inside layout image // move and resize the overlay images, text images, line/arrow images void mashup::mousefunc_layout() { using namespace mashup; static int mdx0 = 0, mdy0 = 0, mdx1, mdy1; static int Mcen, Mcor, Tcen, Tcor, Lcen, Lcor; // mouse at image/text/line center/corner static int iiMcen, iiTcen, iiLcen, iiMcor, iiTcor, iiLcor; // selected image/text/line center/corner static int Tcorx, Tcory; int cenx, ceny; int minMcen, minMcor, minTcen, minTcor, minLcen, minLcor; int ii, Fflash, Fmove, Fnew; int mx, my, mx0, my0; int ww, hh, ww2, hh2; int pxlo, pxhi, pylo, pyhi; int length; float dist, distx, disty, Cdist, Mdist, Mdist0; float expand, contract; float scale, thresh, size; float px0, py0, px1, py1, px2, py2, px3, py3; float tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3; float Vcx, Vcy, Vmx, Vmy; float sinT, cosT; float leng2, amx, amy, d1, d2, angle, rad; if (LMclick) // left click { LMclick = 0; Fnextimage = 0; mx0 = mx = Mxclick; // mouse position my0 = my = Myclick; Fnew = 1; // new image or text selected Fmove = 0; Fflash = 1; select("",-1); // unselect prior } else if (Mxdrag || Mydrag) // drag underway { Fnew = 0; // assume same image/text as before Fmove = 1; // is being moved Fflash = 0; if (Mxdown != mdx0 || Mydown != mdy0) { // new drag was initiated mdx0 = mdx1 = Mxdown; mdy0 = mdy1 = Mydown; Fnew = 1; // new image or text selected } mx0 = mdx1; // drag start my0 = mdy1; mx = Mxdrag; // drag position my = Mydrag; mdx1 = mx; // next drag start mdy1 = my; if (mx == mx0 && my == my0) Fmove = 0; // no mouse movement Mxdrag = Mydrag = 0; // stop main window drag after return } else return; // ignore simple mouse movement if (Fnextimage) { // image set from [next] button Fnextimage = 0; Fnew = 0; Mcen = 1; iiMcen = focusii; } if (zdaddtext && (Mxclick + Myclick)) { // return clicked position zdaddtext->zstat = 1; zdialog_free(zdaddtext); return; } if (zdaddline && (Mxclick + Myclick)) { // return clicked position zdaddline->zstat = 1; zdialog_free(zdaddline); return; } thresh = 200; // corner grab max. distance if (Fnew) // search all images and text images { minMcen = 9999; // find closest image center to mouse for (ii = 0; ii < Nimage; ii++) { px0 = image[ii].px0; // image position and rotation py0 = image[ii].py0; // in layout image space sinT = image[ii].sinT; cosT = image[ii].cosT; ww2 = image[ii].ww2; // image size at scale hh2 = image[ii].hh2; px2 = (mx-px0) * cosT + (my-py0) * sinT; // image pixel for layout position py2 = (my-py0) * cosT - (mx-px0) * sinT; if (px2 < 0 || px2 > ww2-1) continue; // mouse not within image if (py2 < 0 || py2 > hh2-1) continue; pxlo = image[ii].pxlo; // image extent pxhi = image[ii].pxhi; pylo = image[ii].pylo; pyhi = image[ii].pyhi; cenx = (pxlo + pxhi) / 2; // image center ceny = (pylo + pyhi) / 2; distx = mx - cenx; disty = my - ceny; dist = sqrtf(distx * distx + disty * disty); // mouse/center distance if (dist < minMcen) { minMcen = dist; iiMcen = ii; // save closest image center } } minMcor = 9999; // find closest image corner to mouse for (ii = 0; ii < Nimage; ii++) { px0 = image[ii].px0; // image position and rotation py0 = image[ii].py0; // in layout image space sinT = image[ii].sinT; cosT = image[ii].cosT; ww2 = image[ii].ww2; // image size at scale hh2 = image[ii].hh2; px2 = (mx-px0) * cosT + (my-py0) * sinT; // image pixel for layout position py2 = (my-py0) * cosT - (mx-px0) * sinT; if (px2 < 0 || px2 > ww2-1) continue; // mouse not within image if (py2 < 0 || py2 > hh2-1) continue; px0 = image[ii].px0; // NW corner py0 = image[ii].py0; distx = mx - px0; disty = my - py0; dist = sqrtf(distx * distx + disty * disty); // mouse/corner distance if (dist < minMcor && dist < thresh) { minMcor = dist; iiMcor = ii; // save closest image corner } px1 = px0 + ww2 * cosT; // NE py1 = py0 + ww2 * sinT; distx = mx - px1; disty = my - py1; dist = sqrtf(distx * distx + disty * disty); if (dist < minMcor && dist < thresh) { minMcor = dist; iiMcor = ii; } px2 = px0 + ww2 * cosT - hh2 * sinT; // SE py2 = py0 + hh2 * cosT + ww2 * sinT; distx = mx - px2; disty = my - py2; dist = sqrtf(distx * distx + disty * disty); if (dist < minMcor && dist < thresh) { minMcor = dist; iiMcor = ii; } px3 = px0 - hh2 * sinT; // SW py3 = py0 + hh2 * cosT; distx = mx - px3; disty = my - py3; dist = sqrtf(distx * distx + disty * disty); if (dist < minMcor && dist < thresh) { minMcor = dist; iiMcor = ii; } } minTcen = 9999; // find closest text image center to mouse for (ii = 0; ii < Ntext; ii++) { pxlo = text[ii].pxlo; // image extent pxhi = text[ii].pxhi; pylo = text[ii].pylo; pyhi = text[ii].pyhi; if (mx < pxlo || mx > pxhi) continue; // mouse not within text image if (my < pylo || my > pyhi) continue; cenx = (pxlo + pxhi) / 2; // text image center ceny = (pylo + pyhi) / 2; distx = mx - cenx; disty = my - ceny; dist = sqrtf(distx * distx + disty * disty); // mouse/center distance if (dist < minTcen) { minTcen = dist; iiTcen = ii; } } minTcor = 9999; // find closest text image corner to mouse Tcorx = Tcory = 0; for (ii = 0; ii < Ntext; ii++) { pxlo = text[ii].pxlo; // text image extent pxhi = text[ii].pxhi; pylo = text[ii].pylo; pyhi = text[ii].pyhi; if (mx < pxlo || mx > pxhi) continue; // mouse not within text image if (my < pylo || my > pyhi) continue; ww = text[ii].attr.tww; // unrotated text rectangle size hh = text[ii].attr.thh; sinT = text[ii].attr.sinT; // angle of text cosT = text[ii].attr.cosT; px0 = text[ii].px0; // NW corner of enclosing rectangle py0 = text[ii].py0; if (text[ii].attr.angle > 0) { tx0 = px0 + hh * sinT; // NW corner of text rectangle ty0 = py0; tx1 = px0 + ww * cosT + hh * sinT; // NE ty1 = py0 + ww * sinT; tx2 = px0 + ww * cosT; // SE ty2 = py0 + ww * sinT + hh * cosT; tx3 = px0; // SW ty3 = py0 + hh * cosT; } else { sinT = -sinT; tx0 = px0; // NW ty0 = py0 + ww * sinT; tx1 = px0 + ww * cosT; // NE ty1 = py0; tx2 = px0 + ww * cosT + hh * sinT; // SE ty2 = py0 + hh * cosT; tx3 = px0 + hh * sinT; // SW ty3 = py0 + ww * sinT + hh * cosT; } distx = mx - tx0; // NW corner disty = my - ty0; dist = sqrtf(distx * distx + disty * disty); // mouse/corner distance if (dist < minTcor && dist < thresh) { minTcor = dist; iiTcor = ii; Tcorx = tx0; // save closest text image corner Tcory = ty0; } distx = mx - tx1; // NE disty = my - ty1; dist = sqrtf(distx * distx + disty * disty); if (dist < minTcor && dist < thresh) { minTcor = dist; iiTcor = ii; Tcorx = tx1; Tcory = ty1; } distx = mx - tx2; // SE disty = my - ty2; dist = sqrtf(distx * distx + disty * disty); if (dist < minTcor && dist < thresh) { minTcor = dist; iiTcor = ii; Tcorx = tx2; Tcory = ty2; } distx = mx - tx3; // SW disty = my - ty3; dist = sqrtf(distx * distx + disty * disty); if (dist < minTcor && dist < thresh) { minTcor = dist; iiTcor = ii; Tcorx = tx3; Tcory = ty3; } } minLcen = 9999; // find closest line/arrow image // center to mouse position for (ii = 0; ii < Nline; ii++) { pxlo = line[ii].pxlo; // image extent pxhi = line[ii].pxhi; pylo = line[ii].pylo; pyhi = line[ii].pyhi; if (mx < pxlo || mx > pxhi) continue; // mouse not within line image if (my < pylo || my > pyhi) continue; cenx = (pxlo + pxhi) / 2; // line image center ceny = (pylo + pyhi) / 2; distx = mx - cenx; disty = my - ceny; dist = sqrtf(distx * distx + disty * disty); // mouse/center distance if (dist < minLcen) { minLcen = dist; iiLcen = ii; } } minLcor = 9999; // find closest line end point to mouse for (ii = 0; ii < Nline; ii++) { pxlo = line[ii].pxlo; // line image extent pxhi = line[ii].pxhi; pylo = line[ii].pylo; pyhi = line[ii].pyhi; if (mx < pxlo || mx > pxhi) continue; // mouse not within line image if (my < pylo || my > pyhi) continue; angle = line[ii].attr.angle; rad = -angle / 57.296; length = line[ii].attr.length; leng2 = length / 2.0; ww2 = line[ii].attr.pxb_line->ww; // line image hh2 = line[ii].attr.pxb_line->hh; amx = ww2 / 2.0; // line midpoint within line image amy = hh2 / 2.0; px1 = amx - leng2 * cosf(rad) + 0.5; // line end points py1 = amy + leng2 * sinf(rad) + 0.5; px2 = amx + leng2 * cosf(rad) + 0.5; py2 = amy - leng2 * sinf(rad) + 0.5; d1 = (mx-px1-pxlo) * (mx-px1-pxlo) + (my-py1-pylo) * (my-py1-pylo); d2 = (mx-px2-pxlo) * (mx-px2-pxlo) + (my-py2-pylo) * (my-py2-pylo); d1 = sqrtf(d1); // mouse - end point distance d2 = sqrtf(d2); if (d1 < minLcor && d1 < thresh) { minLcor = d1; iiLcor = ii; } if (d2 < minLcor && d2 < thresh) { minLcor = d2; iiLcor = ii; } } Mcen = Mcor = Tcen = Tcor = Lcen = Lcor = 0; // mark where mouse is acting: if (Fmove) // recognize drags from anywhere { if (minMcen < minMcor && minMcen < minTcen && minMcen < minTcor && minMcen < minLcen && minMcen < minLcor) Mcen = 1; if (minMcor < minMcen && minMcor < minTcen && minMcor < minTcor && minMcor < minLcen && minMcor < minLcor) Mcor = 1; if (minTcen < minMcen && minTcen < minMcor && minTcen < minTcor && minTcen < minLcen && minTcen < minLcor) Tcen = 1; if (minTcor < minMcen && minTcor < minMcor && minTcor < minTcen && minTcor < minLcen && minTcor < minLcor) Tcor = 1; if (minLcen < minMcen && minLcen < minMcor && minLcen < minTcen && minLcen < minTcor && minLcen < minLcor) Lcen = 1; if (minLcor < minMcen && minLcor < minMcor && minLcor < minTcen && minLcor < minTcor && minLcor < minLcen) Lcor = 1; } else // recognize clicks near center only { if (minMcen < minTcen && minMcen < minLcen) Mcen = 1; if (minTcen < minMcen && minTcen < minLcen) Tcen = 1; if (minLcen < minMcen && minLcen < minTcen) Lcen = 1; } } // Fnew if (Mcen) { ii = iiMcen; select("image",ii); } // select the corresp. image, text or line if (Mcor) { ii = iiMcor; select("image",ii); } if (Tcen) { ii = iiTcen; select("text",ii); } if (Tcor) { ii = iiTcor; select("text",ii); } if (Lcen) { ii = iiLcen; select("line",ii); } if (Lcor) { ii = iiLcor; select("line",ii); } if (Fflash) { if (Mcen) flashimage(); // if click on image, flash it if (Tcen) flashtext(); // same for text if (Lcen) flashline(); // same for line return; } if (Fmove) { // before changes (why needed?) setlayoutupdatearea(); // set layout update area Lupdate(21); // update layout composite image if (Mcen) // move image { ii = iiMcen; if (mx0 < image[ii].pxlo || mx0 > image[ii].pxhi) return; // mouse outside image bounds if (my0 < image[ii].pylo || my0 > image[ii].pyhi) return; select("image",ii); if (image[ii].fixed) return; // ignore fixed image image[ii].px0 += (mx - mx0); // move selected image image[ii].py0 += (my - my0); // by mouse drag amount } if (Mcor) // resize image by dragging a corner { ii = iiMcor; select("image",ii); if (image[ii].fixed) return; // ignore fixed image pxlo = image[ii].pxlo; pxhi = image[ii].pxhi; pylo = image[ii].pylo; pyhi = image[ii].pyhi; cenx = (pxlo + pxhi) / 2; // image center ceny = (pylo + pyhi) / 2; distx = mx0 - cenx; disty = my0 - ceny; Mdist0 = sqrtf(distx * distx + disty * disty); // center - mouse drag start distx = mx - cenx; disty = my - ceny; Mdist = sqrtf(distx * distx + disty * disty); // center - mouse drag end scale = image[ii].scale * 0.5 * (Mdist + Mdist0) / Mdist0; // image scale change image_rescale(ii,scale); } if (Tcen) // move text image { ii = iiTcen; if (mx0 < text[ii].pxlo || mx0 > text[ii].pxhi) return; // mouse outside text bounds if (my0 < text[ii].pylo || my0 > text[ii].pyhi) return; select("text",ii); text[ii].px0 += (mx - mx0); // move selected text image text[ii].py0 += (my - my0); // by mouse drag amount } if (Tcor) // resize text image { ii = iiTcor; select("text",ii); pxlo = text[ii].pxlo; pxhi = text[ii].pxhi; pylo = text[ii].pylo; pyhi = text[ii].pyhi; cenx = (pxlo + pxhi) / 2; // text image center ceny = (pylo + pyhi) / 2; distx = Tcorx - cenx; disty = Tcory - ceny; Cdist = sqrtf(distx * distx + disty * disty); Vcx = distx / Cdist; // unit vector, text image center to corner Vcy = disty / Cdist; distx = mx - mx0; disty = my - my0; Mdist = sqrtf(distx * distx + disty * disty); Vmx = distx / Mdist; // unit vector, mouse movement Vmy = disty / Mdist; expand = fabsf(Vcx + Vmx) + fabsf(Vcy + Vmy); // mouse pull-out amount contract = fabsf(Vcx - Vmx) + fabsf(Vcy - Vmy); // push-in amount size = expand - contract; // change in text size if (size > 0.5) text[ii].attr.size++; if (size < -0.5) text[ii].attr.size--; gentext(&text[ii].attr); // generate new text image text[ii].ww = text[ii].attr.pxb_text->ww; text[ii].hh = text[ii].attr.pxb_text->hh; } if (Lcen) // move line/arrow image { ii = iiLcen; if (mx0 < line[ii].pxlo || mx0 > line[ii].pxhi) return; // mouse outside line bounds if (my0 < line[ii].pylo || my0 > line[ii].pyhi) return; select("line",ii); line[ii].px0 += (mx - mx0); // move selected line image line[ii].py0 += (my - my0); // by mouse drag amount } if (Lcor) // drag line end point { ii = iiLcor; if (mx0 < line[ii].pxlo || mx0 > line[ii].pxhi) return; // mouse outside line bounds if (my0 < line[ii].pylo || my0 > line[ii].pyhi) return; select("line",ii); angle = line[ii].attr.angle; rad = -angle / 57.296; length = line[ii].attr.length; leng2 = length / 2.0; ww2 = line[ii].attr.pxb_line->ww; // line image hh2 = line[ii].attr.pxb_line->hh; amx = ww2 / 2.0; // line midpoint within line image amy = hh2 / 2.0; px1 = amx - leng2 * cosf(rad) + 0.5; // line end points py1 = amy + leng2 * sinf(rad) + 0.5; px2 = amx + leng2 * cosf(rad) + 0.5; py2 = amy - leng2 * sinf(rad) + 0.5; pxlo = line[ii].pxlo; pylo = line[ii].pylo; d1 = (mx-px1-pxlo) * (mx-px1-pxlo) + (my-py1-pylo) * (my-py1-pylo); d2 = (mx-px2-pxlo) * (mx-px2-pxlo) + (my-py2-pylo) * (my-py2-pylo); d1 = sqrtf(d1); // mouse - end point distance d2 = sqrtf(d2); if (d1 < d2) { // move px1/py1 end to mouse px2 += pxlo; py2 += pylo; px1 = mx; py1 = my; length = d2 + 0.5; rad = asinf((py1-py2) / d2); angle = -57.296 * rad; if (mx > px2) angle = -180 - angle; } if (d2 < d1) { // move px2/py2 end to mouse px1 += pxlo; py1 += pylo; px2 = mx; py2 = my; length = d1 + 0.5; rad = asinf((py1-py2) / d1); angle = -57.296 * rad; if (mx < px1) angle = -180 - angle; } if (angle < -180) angle += 360; if (angle > 180) angle -= 360; line[ii].attr.angle = angle; line[ii].attr.length = length; genline(&line[ii].attr); line[ii].ww = line[ii].attr.pxb_line->ww; line[ii].hh = line[ii].attr.pxb_line->hh; ww2 = line[ii].attr.pxb_line->ww; hh2 = line[ii].attr.pxb_line->hh; amx = (px1 + px2) / 2.0; amy = (py1 + py2) / 2.0; pxlo = amx - ww2 / 2.0; pylo = amy - hh2 / 2.0; line[ii].px0 = pxlo; line[ii].py0 = pylo; } } // Fmove setlayoutupdatearea(); Lupdate(21); // update layout composite image return; } // Keyboard function // KB arrow keys act like mouse drag of 1 pixel for current image void mashup::KBfunc(int key) { using namespace mashup; int ii, xstep, ystep; xstep = ystep = 0; if (key == GDK_KEY_Left) xstep = -1; if (key == GDK_KEY_Right) xstep = +1; if (key == GDK_KEY_Up) ystep = -1; if (key == GDK_KEY_Down) ystep = +1; if (strmatch(focus,"image")) // choose last selected image { ii = focusii; if (image[ii].fixed) return; // ignore fixed image image[ii].px0 += xstep; // move image 1 pixel image[ii].py0 += ystep; } else if (strmatch(focus,"text")) // last selected text image { ii = focusii; text[ii].px0 += xstep; // move selected text image 1 pixel text[ii].py0 += ystep; } else if (strmatch(focus,"line")) // last selected line/arrow image { ii = focusii; line[ii].px0 += xstep; // move selected line image 1 pixel line[ii].py0 += ystep; } else return; setlayoutupdatearea(); // set layout update area Lupdate(22); // update layout composite image return; } // update layout image Fpxb from layout + overlay images // paint main window void mashup::Lupdate(int caller) { using namespace mashup; int nupdxlo, nupdxhi, nupdylo, nupdyhi; static int pupdxlo, pupdxhi, pupdylo, pupdyhi; // prior image update region int ww, hh; static int busy = 0; if (! Lpxb || ! Fpxb) return; if (busy++) return; // stop re-entrance if (updxlo < 0) updxlo = 0; // keep within layout image if (updxhi > Lww) updxhi = Lww; if (updylo < 0) updylo = 0; if (updyhi > Lhh) updyhi = Lhh; nupdxlo = updxlo; // save update region nupdxhi = updxhi; nupdylo = updylo; nupdyhi = updyhi; if (! Fupdall) { if (pupdxlo < updxlo) updxlo = pupdxlo; // expand update region to if (pupdxhi > updxhi) updxhi = pupdxhi; // include prior update region if (pupdylo < updylo) updylo = pupdylo; if (pupdyhi > updyhi) updyhi = pupdyhi; } pupdxlo = nupdxlo; // save update region pupdxhi = nupdxhi; pupdylo = nupdylo; pupdyhi = nupdyhi; if (Fupdall) { // update entire layout updxlo = updylo = 0; updxhi = Lww; updyhi = Lhh; } do_wthreads(Lupdate_wthread,NSMP); // worker threads if (Fupdall) Fpaintnow(); // paint entire layout else { ww = updxhi-updxlo; hh = updyhi-updylo; PXB_PXB_update(Fpxb,Mpxb,updxlo,updylo,ww,hh); // Fpxb > Mpxb, scaled up or down Fpaint4(updxlo,updylo,ww,hh,0); // update drawing window from Mpxb } Fupdall = 0; busy = 0; return; } void * mashup::Lupdate_wthread(void *arg) // worker thread for images { using namespace mashup; int index = *((int *) (arg)); int ii, jj, kk, px1, py1, ww, hh, qx, qy; uint8 *pix1, *pix2, *pix3, vpix2[4]; float red, green, blue; float Bopac, Iopac, Vtran; float px0, py0, px2, py2; float ww1, hh1, ww2, hh2; float edgedist, margin, blendist; float scale, sinT, cosT; PXB *pxb2; float e3part; for (py1 = updylo+index; py1 < updyhi; py1 += NSMP) // loop layout image pixels for (px1 = updxlo; px1 < updxhi; px1++) // within update region { pix1 = PXBpix(Lpxb,px1,py1); // start with layout pixel red = pix1[0]; // background RGB green = pix1[1]; blue = pix1[2]; for (ii = 0; ii < Nimage; ii++) // loop overlay images from bottom to top { if (image[ii].pxhi < updxlo) continue; // no overlap with update region if (image[ii].pxlo > updxhi) continue; if (image[ii].pyhi < updylo) continue; if (image[ii].pylo > updyhi) continue; px0 = image[ii].px0; // overlay image position and rotation py0 = image[ii].py0; // in layout image space ww2 = image[ii].ww2; // scaled image size hh2 = image[ii].hh2; if (image[ii].theta == 0) { // image not rotated px2 = px1 - px0; // overlay image pixel for layout pixel py2 = py1 - py0; } else { sinT = image[ii].sinT; // image is rotated cosT = image[ii].cosT; px2 = (px1-px0) * cosT + (py1-py0) * sinT; // overlay image pixel for layout pixel py2 = (py1-py0) * cosT - (px1-px0) * sinT; } if (px2 < 0 || px2 > ww2-1) continue; // layout pixel not in overlay image if (py2 < 0 || py2 > hh2-1) continue; pxb2 = image[ii].pxb2; // scaled overlay image if (! vpixel(pxb2,px2,py2,vpix2)) continue; // virt. pixel is beyond the edge Bopac = 1.0 - image[ii].Btransp; // image base opacity 0...1 Iopac = vpix2[3] / 255.0; // alpha channel opacity 0...1 Iopac = Iopac * Bopac; // combined scale = image[ii].scale; if (image[ii].vtranmap) { // image has painted transparency ww1 = image[ii].ww1; // image size at 1x scale hh1 = image[ii].hh1; qx = px2 / scale; // position in 1x image qy = py2 / scale; if (image[ii].warpcc) { // scaled image is warped kk = qy * ww1 + qx; qx += image[ii].warpx[kk]; // source pixel in 1x image qy += image[ii].warpy[kk]; } if (qx < ww1 && qy < hh1) { // position is within image jj = qy * ww1 + qx; Vtran = image[ii].vtranmap[jj] / 255.0; // var. transparency 0...1 Iopac = Iopac * (1 - Vtran); } } if (image[ii].Lmarg || image[ii].Lblend) { // left edge hard or blend margin edgedist = px2 / scale; margin = image[ii].Lmarg; if (edgedist <= margin) Iopac = 0; else { edgedist -= margin; blendist = image[ii].Lblend; if (edgedist < blendist) Iopac = Iopac * edgedist / blendist; } } if (image[ii].Rmarg || image[ii].Rblend) { // right edge edgedist = (ww2 - px2) / scale; margin = image[ii].Rmarg; if (edgedist <= margin) Iopac = 0; else { edgedist -= margin; blendist = image[ii].Rblend; if (edgedist < blendist) Iopac = Iopac * edgedist / blendist; } } if (image[ii].Tmarg || image[ii].Tblend) { // top edge edgedist = py2 / scale; margin = image[ii].Tmarg; if (edgedist <= margin) Iopac = 0; else { edgedist -= margin; blendist = image[ii].Tblend; if (edgedist < blendist) Iopac = Iopac * edgedist / blendist; } } if (image[ii].Bmarg || image[ii].Bblend) { // bottom edge edgedist = (hh2 - py2) / scale; margin = image[ii].Bmarg; if (edgedist <= margin) Iopac = 0; else { edgedist -= margin; blendist = image[ii].Bblend; if (edgedist < blendist) Iopac = Iopac * edgedist / blendist; } } red = Iopac * vpix2[0] + (1 - Iopac) * red; // add image pixel over prior green = Iopac * vpix2[1] + (1 - Iopac) * green; blue = Iopac * vpix2[2] + (1 - Iopac) * blue; } for (ii = 0; ii < Ntext; ii++) // loop overlay text images { if (text[ii].pxhi < updxlo) continue; // no overlap with update region if (text[ii].pxlo > updxhi) continue; if (text[ii].pyhi < updylo) continue; if (text[ii].pylo > updyhi) continue; px0 = text[ii].px0; // text image position in layout space py0 = text[ii].py0; ww = text[ii].ww; // text image size in layout hh = text[ii].hh; qx = px1 - px0; // text image pixel for layout pixel qy = py1 - py0; if (qx < 0 || qx > ww-1) continue; // layout pixel not in this text image if (qy < 0 || qy > hh-1) continue; pxb2 = text[ii].attr.pxb_text; pix2 = PXBpix(pxb2,qx,qy); e3part = pix2[3] / 255.0; red = pix2[0] + e3part * red; green = pix2[1] + e3part * green; blue = pix2[2] + e3part * blue; } for (ii = 0; ii < Nline; ii++) // loop overlay line/arrow images { if (line[ii].pxhi < updxlo) continue; // no overlap with update region if (line[ii].pxlo > updxhi) continue; if (line[ii].pyhi < updylo) continue; if (line[ii].pylo > updyhi) continue; px0 = line[ii].px0; // line image position in layout space py0 = line[ii].py0; ww = line[ii].ww; // line image size in layout hh = line[ii].hh; qx = px1 - px0; // line image pixel for layout pixel qy = py1 - py0; if (qx < 0 || qx > ww-1) continue; // layout pixel not in this line image if (qy < 0 || qy > hh-1) continue; pxb2 = line[ii].attr.pxb_line; pix2 = PXBpix(pxb2,qx,qy); e3part = pix2[3] / 255.0; red = pix2[0] + e3part * red; green = pix2[1] + e3part * green; blue = pix2[2] + e3part * blue; } pix3 = PXBpix(Fpxb,px1,py1); // output image pixel pix3[0] = red; pix3[1] = green; pix3[2] = blue; } return 0; // exit thread } /************************************************************************************** IMAGE ARRAY Combine selected images into a array or matrix format within one image. ***************************************************************************************/ namespace image_array_names { int Tabww; // array width (input) int Tabhh; // array height (calculated) int Tabmarg; // array margin size (input) uint8 Tabbg[3]; // array background color int Ncols; // image columns in array (input) int Nrows; // image rows in tablle (calculated) int Ihsep, Ivsep; // image separation, horz and vert int Iww, Ihh; // image width, height without margins typedef struct { int random; // random number for sorting int Ihh; // image height (calculated, variable) int Ipx, Ipy; // image position in array image int row, col; // image row and column number ch *file; // image filename PIXBUF *pixbuf; // scaled image pixbuf } image_t; #define maxNm 1000 // max. images in array image_t image[maxNm]; // image data int Nimages; // actual image count int maxNc = 100; // max. columns int maxNr = 100; // max. rows int colH[100]; // column heights ch *metafile; // source file for metadata copy } // menu function void m_image_array(GtkWidget *, ch *) { using namespace image_array_names; int image_array_dialog_event(zdialog* zd, ch *event); int image_array_mapimages(void); int image_array_showarray(void); int image_array_sort(void); int image_array_shuffle(void); int image_array_spread(void); int image_array_mapfile(void); int ii, nn, err, zstat, ww, hh; int coldiff, coldiffB, coldiff2; image_t imageB[maxNm]; ch *pp, text[100], filename[XFCC]; ch *pext1, *pext2; float R; PXB *pxb1, *pxb2; F1_help_topic = TX("IMAGE ARRAY"); printf("m_image_array \n"); if (Fblock("image array")) return; Nimages = 0; /*** ______________________________________ | Image Array | | | | [Select Files] NN files selected | | Background Color [######] | | Array Width [___] Margin [___] | | Image Columns [___] | | Separation Horz [___] Vert [___] | | | | [Proceed] [X] | |______________________________________| ***/ zdialog *zd = zdialog_new(TX("Image Array"),Mwin,TX("Proceed"),"X",null); // [Select Files] NN files selected zdialog_add_widget(zd,"hbox","hbf","dialog",0,"space=3"); zdialog_add_widget(zd,"button","files","hbf",TX("Select Files"),"space=5"); zdialog_add_widget(zd,"label","labfcount","hbf",TX("no files selected"),"space=10"); // Background Color [######] zdialog_add_widget(zd,"hbox","hbtbg","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labtbg","hbtbg",TX("Background Color"),"space=3"); zdialog_add_widget(zd,"colorbutt","Tabbg","hbtbg","255|255|255"); // Array Width [___] Margin [___] zdialog_add_widget(zd,"hbox","hbf","dialog"); zdialog_add_widget(zd,"label","labfw","hbf",TX("Array Width"),"space=3"); zdialog_add_widget(zd,"zspin","Tabww","hbf","100|30000|1|2000","space=3"); zdialog_add_widget(zd,"label","space","hbf",0,"space=5"); zdialog_add_widget(zd,"label","labfm","hbf",TX("Margin"),"space=3"); zdialog_add_widget(zd,"zspin","Tabmarg","hbf","0|500|1|30","space=3"); // Image Columns [___] zdialog_add_widget(zd,"hbox","hbcols","dialog"); zdialog_add_widget(zd,"label","labcols","hbcols",TX("Image Columns"),"space=3"); zdialog_add_widget(zd,"zspin","Ncols","hbcols","1|100|1|4","space=3"); // max 100 columns // Separation Horz [___] Vert [___] zdialog_add_widget(zd,"hbox","hbsep","dialog"); zdialog_add_widget(zd,"label","labhsep","hbsep",TX("Separation Horz"),"space=3"); zdialog_add_widget(zd,"zspin","Ihsep","hbsep","0|500|1|20","space=3"); zdialog_add_widget(zd,"label","space","hbsep",0,"space=5"); zdialog_add_widget(zd,"label","labvsep","hbsep",TX("Vert"),"space=3"); zdialog_add_widget(zd,"zspin","Ivsep","hbsep","0|500|1|20","space=3"); Tabbg[0] = Tabbg[1] = Tabbg[2] = 200; // default background color: off white zdialog_load_inputs(zd); // restore previous inputs zdialog_run(zd,image_array_dialog_event,"save"); // run dialog - parallel zstat = zdialog_wait(zd); // wait for completion if (zstat != 1) goto cleanup; zdialog_free(zd); zd = 0; Nrows = 1 + (SFcount - 1) / Ncols; // required image rows if (Nrows > maxNr) { zmessageACK(Mwin,TX("exceed %d rows"),maxNr); goto cleanup; } if (SFcount < Ncols) Ncols = SFcount; // reduce Ncols if fewer images Iww = (Tabww - 2 * Tabmarg - (Ncols-1) * Ihsep) / Ncols; // scaled image width Fbusy(+1); for (nn = ii = 0; ii < SFcount; ii++) // loop all images { zmainloop(); image[nn].file = 0; image[nn].Ihh = 0; image[nn].Ipx = 0; image[nn].Ipy = 0; image[nn].row = 0; image[nn].col = 0; image[nn].pixbuf = 0; image[nn].file = zstrdup(SelFiles[ii],"array"); // image file name image[nn].row = nn / Ncols; // initial image row image[nn].col = nn - Ncols * image[nn].row; // initial image column pxb1 = PXB_load(image[nn].file,1); // load PXB from file if (! pxb1) continue; PXB_subalpha(pxb1); // remove alpha channel ww = pxb1->ww; // image dimensions hh = pxb1->hh; R = 1.0 * Iww / ww; // image scale ratio image[nn].Ihh = R * hh + 0.5; // scaled image height pxb2 = PXB_rescale(pxb1,Iww,image[nn].Ihh); // rescale image higher quality image[nn].pixbuf = gdk_pixbuf_copy(pxb2->pixbuf); // copy image pixbuf PXB_free(pxb1); PXB_free(pxb2); nn++; // accumulate image count } Fbusy(-1); Nimages = nn; // final image count if (! Nimages) { zmessageACK(Mwin,TX("no images found")); goto cleanup; } Nrows = 1 + (Nimages - 1) / Ncols; // final row count coldiff = image_array_mapimages(); // map scaled images into array image err = image_array_showarray(); // show completed array image if (err) goto optdone; for (ii = 0; ii < Nimages; ii++) // best map = initial map imageB[ii] = image[ii]; coldiffB = coldiff; if (coldiff < 3) { zstat = 2; goto optdone; } /*** ___________________________________ | Optimize | | | | column difference: NNN pixels | | | | [Start] [Stop] [X] | |___________________________________| ***/ zd = zdialog_new(TX("Optimize"),Mwin,TX("Start"),TX("Stop"),"X",null); zdialog_add_widget(zd,"label","labdiff","dialog","stuffed"); zdialog_set_modal(zd); zdialog_run(zd,null,"save"); // run dialog zstat = 0; // status = not started Fbusy(+1); while (true) // optimization loop { snprintf(text,100,TX("column difference: %d pixels"),coldiffB); // show best column diff. so far zdialog_stuff(zd,"labdiff",text); zmainloop(); if (zd->zstat) { // dialog status change zstat = zd->zstat; // new status zd->zstat = 0; // keep dialog active } if (zstat == 0) { // not started zsleep(0.1); continue; // wait for start } if (zstat < 0 || zstat >= 2) break; // [x] while (true) // [start] or continue { coldiff2 = coldiff; // shuffle() until no improvement image_array_shuffle(); coldiff = image_array_mapimages(); if (coldiff >= coldiff2) break; } if (coldiff < coldiffB) { for (ii = 0; ii < Nimages; ii++) // save new best map imageB[ii] = image[ii]; coldiffB = coldiff; err = image_array_showarray(); // show completed array image zmainsleep(1); if (err) break; } if (coldiff < 3) { // stop if column diff. is tiny zstat = 2; break; } image_array_sort(); // re-sort all images coldiff = image_array_mapimages(); // compute new column difference } Fbusy(-1); optdone: zdialog_free(zd); zd = 0; for (ii = 0; ii < Nimages; ii++) // restore best result image[ii] = imageB[ii]; coldiff = image_array_mapimages(); if (coldiff > 1) { int yn = zmessageYN(Mwin,TX("column difference: %d pixels \n" "Make columns even?"),coldiff); if (yn) { image_array_mapimages(); image_array_spread(); image_array_showarray(); } } /*** _________________________________________ | Array Complete | | | | output file: [________________________] | | | | [x] copy metadata from Nth file: [___] | // 25.1 | | | [Save] [X] | |_________________________________________| ***/ zd = zdialog_new(TX("Array Complete"),Mwin,TX("Save"),"X",null); zdialog_add_widget(zd,"hbox","hbname","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labname","hbname",TX("output file:"),"space=5"); zdialog_add_widget(zd,"zentry","filename","hbname",0,"size=30|expand"); zdialog_add_widget(zd,"hbox","hbmeta","dialog",0,"space=5"); zdialog_add_widget(zd,"check","copymeta","hbmeta",TX("copy metadata from Nth file:")); snprintf(text,20,"1|%d|1|%d",Nimages,Nimages); zdialog_add_widget(zd,"zspin","metaNth","hbmeta",text,"space=5"); zdialog_stuff(zd,"filename",image[0].file); // default 1st image file name 26.0 tryagain: zd->zstat = 0; zdialog_run(zd,null,"save"); // run save dialog zstat = zdialog_wait(zd); if (zstat != 1) goto cleanup; zdialog_fetch(zd,"filename",filename,XFCC); // get final file name if (regfile(filename)) // if output file exists 26.0 { nn = zdialog_choose(Mwin,"mouse",TX("output file exists"),TX("do nothing"), TX("replace file"),TX("make new version"),null); if (nn == 1) goto tryagain; // retry 26.4 else if (nn == 2); // replace file (continue below) else if (nn == 3) { // copy file to new version pp = file_new_version(filename); // get next version of destfile if (! pp) goto cleanup; strncpy0(filename,pp,XFCC); } } pext1 = strrchr(curr_file,'.'); // check input, output file type pext2 = strrchr(filename,'.'); if (! pext1 || ! pext2) goto cleanup; err = f_open(curr_file,0,0,1,0); // open old, save-as new if (err) goto cleanup; // (replace copy file, bugfix) 26.4 err = f_save(filename,pext2+1,8,90,1); if (err) goto tryagain; // bad file name 26.4 zdialog_fetch(zd,"copymeta",nn); // copy metadata if requested 25.1 if (nn) { zdialog_fetch(zd,"metaNth",nn); // copy from file metafile = image[nn-1].file; err = meta_copy(metafile,filename,0,0,0); if (err) zmessageACK(Mwin,TX("metadata copy failed")); } f_open(filename,0,0,1,0); // output file --> current file 26.4 cleanup: if (zd) zdialog_free(zd); // kill dialog zd = 0; for (ii = 0; ii < Nimages; ii++) g_object_unref(image[ii].pixbuf); // free memory Fblock(0); return; } // array dialog event and completion function int image_array_dialog_event(zdialog *zd, ch *event) { using namespace image_array_names; ch countmess[80]; ch colorbutt[20]; ch *pp; if (strmatch(event,"files")) // select images to process { zdialog_show(zd,0); select_files(0); // get file list snprintf(countmess,80,TX("%d image files selected"),SFcount); zdialog_stuff(zd,"labfcount",countmess); zdialog_show(zd,1); } if (! zd->zstat) return 1; // wait for completion if (zd->zstat != 1) return 1; // user cancel zd->zstat = 0; // keep dialog active if (SFcount == 0) { // no files selected zmessageACK(Mwin,TX("no files selected")); return 1; } if (SFcount > maxNm) { zmessageACK(Mwin,TX("%d max images exceeded"),maxNm); return 1; } zdialog_fetch(zd,"Tabbg",colorbutt,19); // get background color pp = substring(colorbutt,"|",1); if (pp) Tabbg[0] = atoi(pp); pp = substring(colorbutt,"|",2); if (pp) Tabbg[1] = atoi(pp); pp = substring(colorbutt,"|",3); if (pp) Tabbg[2] = atoi(pp); zdialog_fetch(zd,"Tabww",Tabww); // array width zdialog_fetch(zd,"Tabmarg",Tabmarg); // array margin zdialog_fetch(zd,"Ncols",Ncols); // image columns zdialog_fetch(zd,"Ihsep",Ihsep); // image horz spacing zdialog_fetch(zd,"Ivsep",Ivsep); // image vert spacing zd->zstat = 1; // dialog finished return 1; } // Map scaled image positions into array image. // Calculate max. difference in image column height. int image_array_mapimages() { using namespace image_array_names; int ii, jj; int maxcol, mincol; int row, col, bott; for (ii = 0; ii < Nimages; ii++) // loop all images { row = image[ii].row; // image row col = image[ii].col; // image column jj = ii - Ncols; // prior image in same column image[ii].Ipx = Tabmarg + col * (Iww + Ihsep); // image x position if (row == 0) image[ii].Ipy = Tabmarg; // image y position for row 0 else image[ii].Ipy = image[jj].Ipy + image[jj].Ihh + Ivsep; // image y position for row 1+ } maxcol = 0; mincol = 999999; for (ii = Nimages - Ncols; ii < Nimages; ii++) // loop last Ncols images { bott = image[ii].Ipy + image[ii].Ihh; // image y position + height if (bott > maxcol) maxcol = bott; // save max. bottom edge if (bott < mincol) mincol = bott; // save min. bottom edge col = image[ii].col; colH[col] = bott; // save column height } return (maxcol - mincol); // return column height difference } // fill the array image from scaled images and show the array image int image_array_showarray() { using namespace image_array_names; uint8 *Fpixels, *pixel; int ii, px, py, Frs, col, maxcol = 0; int ww, hh, st, bott, err; ch *file; PIXBUF *Fpixbuf, *pixbuf; GError *gerror = 0; for (ii = Nimages - Ncols; ii < Nimages; ii++) // loop last Ncols images { bott = image[ii].Ipy + image[ii].Ihh; // image y position + height if (bott > maxcol) maxcol = bott; // save max. bottom edge col = image[ii].col; colH[col] = bott; // save column height } Tabhh = maxcol + Tabmarg; // set array image height if (! edit_wwhhOK(Tabww,Tabhh)) return 1; Fpixbuf = gdk_pixbuf_new(GDKRGB,0,8,Tabww,Tabhh); // make array image pixbuf if (! Fpixbuf) { zmessageACK(Mwin,TX("array width is too large: %d x %d"),Tabww,Tabhh); return 1; // error return } Fpixels = gdk_pixbuf_get_pixels(Fpixbuf); // fill array image with background color Frs = gdk_pixbuf_get_rowstride(Fpixbuf); for (py = 0; py < Tabhh; py++) for (px = 0; px < Tabww; px++) { pixel = Fpixels + py * Frs + px * 3; pixel[0] = Tabbg[0]; pixel[1] = Tabbg[1]; pixel[2] = Tabbg[2]; } for (ii = 0; ii < Nimages; ii++) // loop all images { pixbuf = image[ii].pixbuf; // copy scaled image into array image ww = gdk_pixbuf_get_width(pixbuf); hh = gdk_pixbuf_get_height(pixbuf); gdk_pixbuf_copy_area(pixbuf,0,0,ww,hh,Fpixbuf,image[ii].Ipx,image[ii].Ipy); zmainloop(); } file = zstrdup(temp_folder,"array",30); // save array image to temp file strcat(file,"/image-array.jpg"); st = gdk_pixbuf_save(Fpixbuf,file,"jpeg",&gerror,"quality","90",null); if (! st) { zmessageACK(Mwin,TX("GDK pixbuf: cannot save file")); zfree(file); g_object_unref(Fpixbuf); return 2; // error return } viewmode('F'); err = f_open(file); // show array image if (err) return 3; zfree(file); g_object_unref(Fpixbuf); return 0; } // shuffle image column assignments to make column heights even int image_array_shuffle() { using namespace image_array_names; int ii, jj, col, colii, coljj; int hh1, hh2, diff, maxdiff; int bestii, bestjj; image_t tempimage; for (ii = Nimages - Ncols; ii < Nimages; ii++) // loop last Ncols images { col = image[ii].col; // get column height colH[col] = image[ii].Ipy + image[ii].Ihh; // = y position + image height } for (ii = 0; ii < Nimages; ii++) // loop all images ii { zmainloop(); colii = image[ii].col; maxdiff = bestii = 0; for (jj = 0; jj < Nimages; jj++) // loop all images jj { coljj = image[jj].col; if (colii == coljj ) continue; // both images in same column hh1 = colH[colii] - image[ii].Ihh + image[jj].Ihh; // column heights if images are switched hh2 = colH[coljj] + image[ii].Ihh - image[jj].Ihh; diff = abs(colH[colii] - colH[coljj]) - abs(hh1 - hh2); // column height diff - switched diff if (diff > maxdiff) { maxdiff = diff; // best switch for nearest heights bestii = ii; bestjj = jj; } } if (maxdiff > 0) { ii = bestii; // switch the images jj = bestjj; col = image[ii].col; colH[col] = colH[col] - image[ii].Ihh + image[jj].Ihh; col = image[jj].col; colH[col] = colH[col] + image[ii].Ihh - image[jj].Ihh; tempimage = image[ii]; image[ii] = image[jj]; image[jj] = tempimage; image[jj].row = image[ii].row; image[jj].col = image[ii].col; image[ii].row = tempimage.row; image[ii].col = tempimage.col; } } return 0; } // sort images randomly to get a new starting point for shuffle int image_array_sort() { using namespace image_array_names; int ii; int keys[1][3] = { { 0, 4, 3 } }; // key position, length, type for (ii = 0; ii < Nimages; ii++) // populate random sort key image[ii].random = 1000000 * drandz(); MemSort((ch *) image, sizeof(image_t), Nimages, keys, 1); // sort image[] for (ii = 0; ii < Nimages; ii++) { image[ii].row = ii / Ncols; // new image row, column image[ii].col = ii - Ncols * image[ii].row; } return 1; } // spread images in short columns to make column heights even. int image_array_spread() { using namespace image_array_names; int col, row, nrows, ii, dy; int maxH = 0, diff, diff2; if (Nrows < 2) return 0; for (ii = Nimages - Ncols; ii < Nimages; ii++) // loop last Ncols images { col = image[ii].col; // get column height colH[col] = image[ii].Ipy + image[ii].Ihh; // = y position + image height } for (col = 0; col < Ncols; col++) // get max. column height if (colH[col] > maxH) maxH = colH[col]; for (col = 0; col < Ncols; col++) // loop all columns { diff = maxH - colH[col]; if (diff < 2) continue; // column height near max, no change nrows = Nrows; // max. images per column ii = (nrows - 1) * Ncols + col; // last image[ii] this column if (ii >= Nimages) nrows -= 1; // this is a short column if (nrows < 2) break; diff2 = diff / (nrows - 1); // increase for Y-posn after row 0 for (dy = row = 0; row < nrows; row++) // loop all rows in column { ii = row * Ncols + col; if (ii == Nimages) break; image[ii].Ipy += dy; dy += diff2; // prior increase + per row increase } } return 0; } fotocx/f.effects.cc0000664000175000017500000115331115247006660013207 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit - Effects menu functions - paint, sketch ... and 'filters' m_outlines convert image to outline drawing m_sketch1 convert photo to simulated sketch m_sketch2 convert photo to simulated sketch m_cartoon convert image to cartoon drawing m_emboss convert image to simulated embossing (3D relief) m_tiles1 convert image to square tiles with 3D edges m_tiles2 convert image to irregular tiles matching image m_painting convert image to simulated painting m_texture apply a random texture to an image m_fusion suppress fine details while retaining sharpness m_pattern tile an image with a repeating pattern m_crosshatch convert photo to crosshatch sketch m_dither image dither functions: m_dither0 Roy Lichtenstein effect m_dither1 pure RGB or black/white dots m_dither2 RGB mix with given bit-depth m_dither3 use custom palette colors m_dither4 pixels condense into blobs m_engrave engrave image (black-white or color lines) m_addglare add glare around bright objects m_mosaic convert image to mosaic of thumbnail images m_add_noise add random noise to an image m_set_colors choose no. of colors for R/G/B or total m_shift_colors gradually shift selected RGB colors into other colors m_alien_colors change color hues with an algorithm m_anykernel transform an image using any custom kernel ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) using namespace zfuncs; /**************************************************************************************/ // make an outline drawing by maximizing high-contrast pixels and darkening the rest namespace outlines_names { editfunc EFoutlines; float Blo, Bhi; // pixel contrast range to draw float Amp; // low contrast amplification int ModeA, ModeB; // operation mode int Fbw, Fneg; // flags float *conmap; // pixel contrast map int Fconmap_done; } void m_outlines(GtkWidget *, ch *menu) { using namespace outlines_names; int outlines_dialog_event(zdialog* zd, ch *event); void * outlines_thread(void *); F1_help_topic = TX("OUTLINES"); printf("m_outlines \n"); EFoutlines.menuname = "Outlines"; EFoutlines.menufunc = m_outlines; EFoutlines.Farea = 2; // select area usable EFoutlines.Fpaintedits = 1; // can use paint edits EFoutlines.Fscript = 1; // scripting supported EFoutlines.threadfunc = outlines_thread; // thread function if (! edit_setup(EFoutlines)) return; // setup edit /*** ___________________________________ | Outline Drawing | | | | Threshold: Low [__] High [__] | | Low Amplify: [__] | | Mode: A (o) B (o) | | [_] black/white [_] negative | | | | [OK] [X] | |___________________________________| ***/ zdialog *zd = zdialog_new(TX("Outline Drawing"),Mwin,"OK","X",null); EFoutlines.zd = zd; zdialog_add_widget(zd,"hbox","hbT","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labLT","hbT",TX("Threshold: Low"),"space=3"); zdialog_add_widget(zd,"zspin","Blo","hbT","0|100|1|30","space=3"); zdialog_add_widget(zd,"label","space","hbT",0,"space=10"); zdialog_add_widget(zd,"label","labHT","hbT",TX("High"),"space=3"); zdialog_add_widget(zd,"zspin","Bhi","hbT","0|100|1|40","space=3"); zdialog_add_widget(zd,"hbox","hbA","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labamp","hbA",TX("Low Amplify"),"space=3"); zdialog_add_widget(zd,"zspin","Amp","hbA","0|10|1|0","space=3"); zdialog_add_widget(zd,"hbox","hbM","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labM","hbM",TX("Mode:"),"space=3"); zdialog_add_widget(zd,"radio","ModeA","hbM","A","space=5"); zdialog_add_widget(zd,"radio","ModeB","hbM","B","space=5"); zdialog_add_widget(zd,"hbox","hb4","dialog",0,"space=8"); zdialog_add_widget(zd,"check","Fbw","hb4",TX("black/white"),"space=5"); zdialog_add_widget(zd,"label","space","hb4",0,"space=10"); zdialog_add_widget(zd,"check","Fneg","hb4",TX("negative")); Blo = 30; Bhi = 40; Amp = 0; ModeA = 1; ModeB = 0; Fbw = Fneg = 0; zdialog_stuff(zd,"Fbw",0); zdialog_stuff(zd,"Fneg",0); int cc = Eww * Ehh * sizeof(float); conmap = (float *) zmalloc(cc,"outlines"); // allocate contrast map Fconmap_done = 0; zdialog_run(zd,outlines_dialog_event,"save"); // run dialog, parallel zdialog_send_event(zd,"init"); return; } // dialog event and completion callback function int outlines_dialog_event(zdialog *zd, ch *event) // dialog event function { using namespace outlines_names; if (strmatch(event,"focus")) return 1; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (strmatch(event,"undo")) return 1; if (zd->zstat) { if (zd->zstat == 1) { // commit edit edit_addhist("Blo:%.0f Bhi:%.0f Amp:%.0f Mode:%c B&W:%d Neg:%d", Blo,Bhi,Amp,'A'+ModeB,Fbw,Fneg); // edit parms > edit hist edit_done(0); } else edit_cancel(0); // discard edit zfree(conmap); return 1; } zdialog_fetch(zd,"Blo",Blo); // get brightness threshold range zdialog_fetch(zd,"Bhi",Bhi); zdialog_fetch(zd,"Amp",Amp); zdialog_fetch(zd,"ModeA",ModeA); zdialog_fetch(zd,"ModeB",ModeB); zdialog_fetch(zd,"Fbw",Fbw); zdialog_fetch(zd,"Fneg",Fneg); thread_signal(); return 1; } // thread function to update image void * outlines_thread(void *) { using namespace outlines_names; void * outlines_wthread1(void *arg); void * outlines_wthread2(void *arg); if (! Fconmap_done) do_wthreads(outlines_wthread1,NSMP); // make contrast map Fconmap_done = 1; if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(outlines_wthread2,NSMP); // draw image CEF->Fmods = 1; // image modified CEF->Fsaved = 0; // not saved if (! Fpaintedits) Fpaint2(); // update window return 0; } void * outlines_wthread1(void *arg) // make contrast map { using namespace outlines_names; int index = *((int *) arg); int px, py, ii; float *pix1, *pix2; float cont[12]; /*** get contrast of opposing pixels within 5x5 block centered on pixel P P[-2,-2] P[0,0] P[+2,+2] ***/ for (py = index+2; py < Ehh-2; py += NSMP) // loop all pixels, get contrast for (px = 2; px < Eww-2; px++) { pix1 = PXMpix(E1pxm,px-2,py-2); pix2 = PXMpix(E1pxm,px+2,py+2); cont[0] = 1.0 - PIXmatch(pix1,pix2); pix1 = PXMpix(E1pxm,px-1,py-2); pix2 = PXMpix(E1pxm,px+1,py+2); cont[1] = 1.0 - PIXmatch(pix1,pix2); pix1 = PXMpix(E1pxm,px+0,py-2); pix2 = PXMpix(E1pxm,px+0,py+2); cont[2] = 1.0 - PIXmatch(pix1,pix2); pix1 = PXMpix(E1pxm,px+1,py-2); pix2 = PXMpix(E1pxm,px-1,py+2); cont[3] = 1.0 - PIXmatch(pix1,pix2); pix1 = PXMpix(E1pxm,px+2,py-2); pix2 = PXMpix(E1pxm,px-2,py+2); cont[4] = 1.0 - PIXmatch(pix1,pix2); pix1 = PXMpix(E1pxm,px-2,py-1); pix2 = PXMpix(E1pxm,px+2,py+1); cont[5] = 1.0 - PIXmatch(pix1,pix2); pix1 = PXMpix(E1pxm,px-1,py-1); pix2 = PXMpix(E1pxm,px+1,py+1); cont[6] = 1.0 - PIXmatch(pix1,pix2); pix1 = PXMpix(E1pxm,px+0,py-1); pix2 = PXMpix(E1pxm,px+0,py+1); cont[7] = 1.0 - PIXmatch(pix1,pix2); pix1 = PXMpix(E1pxm,px+1,py-1); pix2 = PXMpix(E1pxm,px-1,py+1); cont[8] = 1.0 - PIXmatch(pix1,pix2); pix1 = PXMpix(E1pxm,px+2,py-1); pix2 = PXMpix(E1pxm,px-2,py+1); cont[9] = 1.0 - PIXmatch(pix1,pix2); pix1 = PXMpix(E1pxm,px-2,py+0); pix2 = PXMpix(E1pxm,px+2,py+0); cont[10] = 1.0 - PIXmatch(pix1,pix2); pix1 = PXMpix(E1pxm,px-1,py+0); pix2 = PXMpix(E1pxm,px+1,py+0); cont[11] = 1.0 - PIXmatch(pix1,pix2); HeapSort(cont,12); // sort values ascending ii = py * Eww + px; conmap[ii] = 0.333 * (cont[9] + cont[10] + cont[11]); // average 3 highest values } return 0; } void * outlines_wthread2(void *arg) // draw image { using namespace outlines_names; int index = *((int *) arg); int px, py, ii, Fend; float *pix1, *pix3; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float blend, contrast, maxrgb, addrgb; float blo, bhi, amp, F1, F2; blo = 0.01 * Blo; // normalize 0 - 1 bhi = 0.01 * Bhi; amp = 0.05 * Amp; // 25.1 amp = sqrtf(amp); while (true) // pixel loop { if (Fescape) break; Fend = get_edit_pixels(index,px,py,blend); // next pixel if (Fend) break; if (blend == 0) continue; if (px == 0 || px == Eww-1) continue; // avoid image edges if (py == 0 || py == Ehh-1) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; G3 = pix3[1]; B3 = pix3[2]; R9 = R1; G9 = G1; B9 = B1; ii = py * Eww + px; contrast = conmap[ii]; // pixel contrast value if (contrast < blo) { // pixel contrast below range R9 = G9 = B9 = 0; // brightness = 0 goto paint; } else if (contrast > bhi) F1 = 1.0; // above range, brightness = max. else F1 = (contrast - blo) / (bhi - blo); // get relative brightness, 0 - 1 F1 += amp * (1.0 - F1); // amplify dim pixel maxrgb = R9; // get max. pixel RGB value if (G9 > maxrgb) maxrgb = G9; if (B9 > maxrgb) maxrgb = B9; if (Fbw) R9 = G9 = B9 = maxrgb; // make black/white addrgb = 255 - maxrgb; // amount poss. to brighten if (addrgb < 1 || addrgb > 254) continue; F2 = 255.0 / maxrgb; // maximize brightness if (ModeB) F2 = 1.0; // use flat method R9 = F1 * F2 * R9; // brighten pixel proportionally G9 = F1 * F2 * G9; B9 = F1 * F2 * B9; paint: if (Fneg) // make negative { R9 = 255 - R9; G9 = 255 - G9; B9 = 255 - B9; } RGBfix(R9,G9,B9); // insure within 0-255 if (Fpaintedits) // mouse paint edit { if (blend > 0) { // increase edit R3 = blend * R9 + (1-blend) * R3; G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { // decrease edit R3 = -blend * R1 + (1+blend) * R3; G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full image edit { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // sketch menu function - convert photo to simulated sketch namespace sketch1_names { editfunc EFsketch1; // edit function data float Bweight = 0.5; // brightness weight 0-1 int Brthresh = 255; // brightness threshold 0-255 float Cweight = 0.5; // contrast weight 0-1 int cliplev = 255; // clipping level 0-255 int cc; uint8 fgrgb[3] = { 0, 0, 0 }; // foreground color (black) uint8 bgrgb[3] = { 255, 255, 255 }; // background color (white) uint8 *britness; // maps pixel brightness 0-255 uint8 *contrast; // maps pixel color contrast 0-255 uint8 *monopix; // output pixel map 0-255 uint8 *fclip; // output clipping flag 0/1 } void m_sketch1(GtkWidget *, ch *menu) { using namespace sketch1_names; int sketch1_dialog_event(zdialog* zd, ch *event); void * sketch1_thread(void *); int ii, px, py; float *pix0, *pix1, *pix2, *pix3, *pix4; float f1, f2; F1_help_topic = TX("SKETCH1"); printf("m_sketch1 \n"); EFsketch1.menuname = "Sketch1"; EFsketch1.menufunc = m_sketch1; EFsketch1.Farea = 2; // select area usable EFsketch1.Fscript = 1; // scripting supported EFsketch1.threadfunc = sketch1_thread; // thread function if (! edit_setup(EFsketch1)) return; // setup edit cc = Eww * Ehh; britness = (uint8 *) zmalloc(cc,"sketch1"); contrast = (uint8 *) zmalloc(cc,"sketch1"); monopix = (uint8 *) zmalloc(cc,"sketch1"); fclip = (uint8 *) zmalloc(cc,"sketch1"); for (py = 1; py < Ehh-1; py++) // precalculate pixel brightness for (px = 1; px < Eww-1; px++) { pix0 = PXMpix(E1pxm,px,py); ii = py * Eww + px; britness[ii] = 0.333 * (pix0[0] + pix0[1] + pix0[2]); // brightness 0-255 } for (py = 1; py < Ehh-1; py++) // precalculate pixel contrast for (px = 1; px < Eww-1; px++) { pix0 = PXMpix(E1pxm,px,py); pix1 = PXMpix(E1pxm,px-1,py); // get pixel contrast pix2 = PXMpix(E1pxm,px+1,py); pix3 = PXMpix(E1pxm,px,py-1); pix4 = PXMpix(E1pxm,px,py+1); f1 = PIXmatch(pix1,pix2); // 0..1 = zero..perfect match f2 = PIXmatch(pix3,pix4); ii = py * Eww + px; contrast[ii] = 255.0 * (1.0 - f1 * f2); // pixel color contrast 0-255 } /*** _________________________________________ | Sketch1 | | | | Brightness ==============[]========== | | Threshold ======[]=================== | | Contrast =========[]================= | | Clip Level ===================[]===== | | Foreground [#####] Background [#####] | | | | [OK] [X] | |_________________________________________| ***/ zdialog *zd = zdialog_new(TX("Sketch1"),Mwin,"OK","X",null); // sketch dialog EFsketch1.zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labbrite","hb1",TX("Brightness"),"space=5"); zdialog_add_widget(zd,"hscale2","Bweight","hb1","0.0|1.0|0.005|0.5","expand|space=3"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=2"); zdialog_add_widget(zd,"label","laBrthresh","hb2",TX("Threshold"),"space=5"); zdialog_add_widget(zd,"hscale2","Brthresh","hb2","0|255|1|255","expand|space=3"); zdialog_add_widget(zd,"hbox","hb3","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labcon","hb3",TX("Contrast"),"space=5"); zdialog_add_widget(zd,"hscale2","Cweight","hb3","0.0|1.0|0.005|0.5","expand|space=3"); zdialog_add_widget(zd,"hbox","hb4","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labclip","hb4",TX("Clip Level"),"space=5"); zdialog_add_widget(zd,"hscale2","cliplev","hb4","0|255|1|0","expand|space=3"); zdialog_add_widget(zd,"hbox","hb6","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labfg","hb6",TX("Foreground"),"space=2"); zdialog_add_widget(zd,"colorbutt","fgcolor","hb6","0|0|0","space=2"); zdialog_add_widget(zd,"label","space","hb6",0,"space=8"); zdialog_add_widget(zd,"label","labbg","hb6",TX("Background"),"space=2"); zdialog_add_widget(zd,"colorbutt","bgcolor","hb6","255|255|255","space=2"); Bweight = 0.5; // initial values Brthresh = 255; Cweight = 0.5; cliplev = 255; zdialog_resize(zd,250,0); zdialog_run(zd,sketch1_dialog_event,"save"); // run dialog - parallel zdialog_send_event(zd,"init"); return; } // sketch1 dialog event and completion function int sketch1_dialog_event(zdialog *zd, ch *event) { using namespace sketch1_names; ch *pp; ch color[20]; if (strmatch(event,"focus")) return 1; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat == 1 && ! Fescape) { // commit edit edit_addhist("Br:%.3f Th:%d Con:%.3f Clip:%d", Bweight,Brthresh,Cweight,cliplev); // edit parms > edit hist edit_done(0); } else edit_cancel(0); // discard edit zfree(britness); zfree(contrast); zfree(monopix); zfree(fclip); return 1; } zdialog_fetch(zd,"Bweight",Bweight); // revised brightness weight zdialog_fetch(zd,"Brthresh",Brthresh); // brightness threshold zdialog_fetch(zd,"Cweight",Cweight); // contrast weight zdialog_fetch(zd,"cliplev",cliplev); cliplev = 255 - cliplev; // scale is reversed zdialog_fetch(zd,"fgcolor",color,19); pp = substring(color,"|",1); if (pp) fgrgb[0] = atoi(pp); pp = substring(color,"|",2); if (pp) fgrgb[1] = atoi(pp); pp = substring(color,"|",3); if (pp) fgrgb[2] = atoi(pp); zdialog_fetch(zd,"bgcolor",color,19); pp = substring(color,"|",1); if (pp) bgrgb[0] = atoi(pp); pp = substring(color,"|",2); if (pp) bgrgb[1] = atoi(pp); pp = substring(color,"|",3); if (pp) bgrgb[2] = atoi(pp); thread_signal(); return 1; } // thread function - multiple working threads to update image void * sketch1_thread(void *) { using namespace sketch1_names; void sketch1_wthread(); progress_setgoal(255); sketch1_wthread(); progress_setgoal(0); CEF->Fmods++; // image modified CEF->Fsaved = 0; Fpaint2(); // update window return 0; } // working thread void sketch1_wthread() { using namespace sketch1_names; int px, py, qx, qy; int ii, jj, kk, dist; int br0, br1, br2, br3, move; int bright, cont, brcon, brsum; int R, G, B; float *pix3, f1, f2; for (py = 0; py < Ehh; py++) // convert to monocolor image for (px = 0; px < Eww; px++) // with brightness range 0-255 { if (Fescape) return; // user kill ii = py * Eww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } bright = Bweight * britness[ii]; // brightness 0-255 if (bright > Brthresh) bright = 255; cont = contrast[ii]; // contrast 0-255 brcon = (1.0 - Cweight) * bright - Cweight * cont; // 255 = max. brightness + min. contrast if (brcon < 0) brcon = 0; if (brcon > 0) brcon = 255; // pixels are black/white monopix[ii] = brcon; // 0-255 } for (br0 = 5; br0 <= 255; br0 += 50) // loop brightness threshold { for (py = 1; py < Ehh-1; py++) // loop image interior pixels for (px = 1; px < Eww-1; px++) { if (Fescape) return; // user kill ii = py * Eww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } br1 = monopix[ii]; if (br1 > br0 || br1 == 0) continue; // skip target pixel > threshold or black for (qy = py-1; qy <= py+1; qy++) // loop pixels within 1 of target pixel for (qx = px-1; qx <= px+1; qx++) { jj = qy * Eww + qx; br2 = monopix[jj]; if (br2 == 0) continue; // ignore black pixels if (br2 < br1) goto nextpixel; // target pixel not darkest } br2 = 0; kk = -1; for (qy = py-1; qy <= py+1; qy++) // loop pixels within 1 of target pixel for (qx = px-1; qx <= px+1; qx++) { jj = qy * Eww + qx; br3 = monopix[jj]; if (br3 < 255 && br3 > br2) { // find brightest < 255 br2 = br3; kk = jj; } } if (kk < 0) continue; move = br1; // move darkness to target pixel, if (255 - br2 < move) move = 255 - br2; // as much as possible br1 -= move; br2 += move; monopix[ii] = br1; monopix[kk] = br2; nextpixel: ; } progress_addvalue(50); } memset(fclip,0,cc); for (py = 1; py < Ehh-1; py++) // loop all pixels for (px = 1; px < Eww-1; px++) // (interior pixels only) { if (Fescape) return; // user kill ii = py * Eww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } brsum = 0; for (qy = py-1; qy <= py+1; qy++) // loop pixels within 1 of target pixel for (qx = px-1; qx <= px+1; qx++) { jj = qy * Eww + qx; // sum brightness brsum += monopix[jj]; } brsum = brsum / 9; // average brightness if (brsum > cliplev) fclip[ii] = 1; // reduce isolated dark pixels } for (ii = 0; ii < cc; ii++) // clipped pixels >> white if (fclip[ii]) monopix[ii] = 255; for (py = 0; py < Ehh; py++) // loop all pixels for (px = 0; px < Eww; px++) { if (Fescape) return; // user kill ii = py * Eww + px; br1 = monopix[ii]; // input pixel brightness 0-255 f1 = 0.003906 * br1; // background part, 0 - 1 f2 = 1.0 - f1; // foreground part, 1 - 0 R = f2 * fgrgb[0] + f1 * bgrgb[0]; // foreground + background G = f2 * fgrgb[1] + f1 * bgrgb[1]; B = f2 * fgrgb[2] + f1 * bgrgb[2]; pix3 = PXMpix(E3pxm,px,py); // output pixel pix3[0] = R; pix3[1] = G; pix3[2] = B; } return; } /**************************************************************************************/ // convert a photo or other image into a simulated pencil sketch namespace sketch2_names { editfunc EFsketch2; int *conmap; // image contrast map float Fblend; // image blend, 0 - 1.0 } // menu function void m_sketch2(GtkWidget *, ch *menu) // 26.0 { using namespace sketch2_names; int sketch2_dialog_event(zdialog* zd, ch *event); void sketch2_curvedit(int spc); void * sketch2_thread(void *); int ii, cc, px, py, qx, qy; float *pix1, *pix2; int R1, G1, B1, R2, G2, B2, con1, con2; printf("m_sketch2 \n"); F1_help_topic = TX("SKETCH2"); EFsketch2.menuname = "Sketch2"; EFsketch2.menufunc = m_sketch2; EFsketch2.Farea = 2; // select area usable EFsketch2.Fpaintedits = 1; // allow paint edits EFsketch2.Fscript = 1; // allow scripting EFsketch2.threadfunc = sketch2_thread; if (! edit_setup(EFsketch2)) return; // setup edit cc = Eww * Ehh * sizeof(int); // allocate contrast map conmap = (int *) zmalloc(cc,"m_sketch2"); for (py = 1; py < Ehh-1; py++) // map RGB contrast of all pixels for (px = 1; px < Eww-1; px++) { pix1 = PXMpix(E1pxm,px,py); // pixel to map R1 = pix1[0]; // RGB values 0-255 G1 = pix1[1]; B1 = pix1[2]; con1 = 0; for (qy = py-1; qy <= py+1; qy++) // loop 8 neighbor pixels for (qx = px-1; qx <= px+1; qx++) { if (qx == px && qy == py) continue; // skip central pixel = self pix2 = PXMpix(E1pxm,qx,qy); // neighbor pixel R2 = pix2[0]; // RGB values 0-255 G2 = pix2[1]; B2 = pix2[2]; con2 = abs(R2-R1) + abs(G2-G1) + abs(B2-B1); // total RGB contrast if (con2 > con1) con1 = con2; // save largest value } ii = py * Eww + px; // pix1 contrast if (con1 < 0) con1 = 0; if (con1 > 765) con1 = 765; // guard poss. bad RGB data conmap[ii] = con1; } /*** _______________________________________________ | Sketch2 | | ___________________________________________ | | | | | | | curve edit area | | | | | | | | ----------------------------------------- | | // editable power curve | | | | | | | | | |___________________________________________| | | low contrast high | // contrast scale | | | Blend: 0% ============[]============== 100% | // blend input and output images | | | [Reset] [OK] [X] | |_______________________________________________| ***/ zdialog *zd = zdialog_new(TX("Sketch2"),Mwin,TX("Reset"),"OK","X",null); EFsketch2.zd = zd; zdialog_add_widget(zd,"frame","frameH","dialog",0,"expand"); // edit-curve GtkWidget *frameH = zdialog_gtkwidget(zd,"frameH"); spldat *sd = splcurve_init(frameH,sketch2_curvedit); EFsketch2.sd = sd; sd->Nscale = 1; // horizontal line, neutral value sd->xscale[0][0] = 0.00; sd->yscale[0][0] = 0.50; sd->xscale[1][0] = 1.00; sd->yscale[1][0] = 0.50; sd->nap[0] = 3; // initial curve is neutral sd->vert[0] = 0; sd->apx[0][0] = 0.01; // horizontal line sd->apy[0][0] = 0.50; sd->apx[0][1] = 0.50; sd->apy[0][1] = 0.50; // curve 0 = power sd->apx[0][2] = 0.99; sd->apy[0][2] = 0.50; splcurve_generate(sd,0); sd->mod[0] = 0; // mark curve unmodified sd->Nspc = 1; // 1 curve sd->fact[0] = 1; // curve 0 active zdialog_add_widget(zd,"hbox","hbcon","dialog",0,"space=2"); zdialog_add_widget(zd,"label","lowcon","hbcon",TX("low contrast"),"space=3"); zdialog_add_widget(zd,"label","space","hbcon",0,"expand"); zdialog_add_widget(zd,"label","hicon","hbcon",TX("high")); zdialog_add_widget(zd,"hbox","hblend","dialog",0,"space=10"); // blend slider, 0 - 1.0 zdialog_add_widget(zd,"label","lab0","hblend",TX("Blend: 0%"),"space=3"); zdialog_add_widget(zd,"hscale","Fblend","hblend","0.0|1.0|0.01|0.0","expand"); zdialog_add_widget(zd,"label","lab100","hblend","100%","space=3"); zdialog_resize(zd,250,300); zdialog_run(zd,sketch2_dialog_event,"save"); // run dialog - parallel Fblend = 0; thread_signal(); return; } // dialog event and completion callback function int sketch2_dialog_event(zdialog *zd, ch *event) { using namespace sketch2_names; spldat *sd = EFsketch2.sd; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active sd->nap[0] = 3; // curve is neutral sd->vert[0] = 0; sd->apx[0][0] = 0.01; sd->apy[0][0] = 0.50; sd->apx[0][1] = 0.50; sd->apy[0][1] = 0.50; sd->apx[0][2] = 0.99; sd->apy[0][2] = 0.50; splcurve_generate(sd,0); sd->mod[0] = 0; // mark curve unmodified gtk_widget_queue_draw(sd->drawarea); // redraw curve Fblend = 0; // no image blend zdialog_stuff(zd,"Fblend",0); edit_reset(); return 1; } if (zd->zstat == 2) // [OK] { freeMouse(); // free mouse if curve edit active if (CEF->Fmods) { edit_addhist("blend:%.3f",Fblend); // edit parms > edit hist edit_done(0); } else edit_cancel(0); // no change zfree(conmap); return 1; } if (zd->zstat < 0 || zd->zstat > 2) { // cancel edit_cancel(0); zfree(conmap); return 1; } if (strmatch(event,"Fblend")) { // new blend ratio zdialog_fetch(zd,"Fblend",Fblend); thread_signal(); } if (strmatch(event,"paint")) thread_signal(); // mouse paint return 1; } // this function is called when the curve is edited void sketch2_curvedit(int spc) { using namespace sketch2_names; thread_signal(); return; } // thread function void * sketch2_thread(void *arg) { using namespace sketch2_names; void * sketch2_wthread(void *); if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag get_edit_pixels_init(NSMP,1); // initz. pixel loop do_wthreads(sketch2_wthread,NSMP); CEF->Fmods++; // image3 modified CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } void * sketch2_wthread(void *arg) // worker thread function { using namespace sketch2_names; int index = *((int *) arg); int ii, Fend, px, py, con; float blend; float *pix1, *pix3; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float pixbrite, F; spldat *sd = EFsketch2.sd; while (true) // loop all edit pixels { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; // input RGB values G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; // current output RGB G3 = pix3[1]; B3 = pix3[2]; ii = py * Eww + px; // get pixel contrast con = conmap[ii]; // contrast = 0 ... 765 ii = 5 * con; // rescale to 0 ... 3825 if (ii > 999) ii = 999; // cut off upper 74% F = sd->yval[0][ii]; // get curve y-val, 0.0 ... 1.0 F = F * 0.01 * (1000 - ii) + 1; // amplify y-val for low x-val pixbrite = F * con; // amplified contrast --> brightness if (pixbrite > 255) pixbrite = 255; R9 = G9 = B9 = 255 - pixbrite; // invert to darkness if (Fblend > 0) { R9 = Fblend * R1 + (1.0 - Fblend) * R9; // blend input image G9 = Fblend * G1 + (1.0 - Fblend) * G9; B9 = Fblend * B1 + (1.0 - Fblend) * B9; } if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or select area { R3 = blend * R9 + (1-blend) * R1; // output = blend of input and output G3 = blend * G9 + (1-blend) * G1; // (select area edge blending) B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // convert an image into a cartoon drawing namespace cartoon { editfunc EFcartoon; int line_threshold = 100; int line_width = 3; int blur_radius = 4; int kuwahara_depth = 2; int priorKD, priorBR; float *pixcon; float Fthreshold; float Wrad[41][41]; // radius <= 20 } // menu function void m_cartoon(GtkWidget *, ch *menu) { using namespace cartoon; int cartoon_dialog_event(zdialog *zd, ch *event); void * cartoon_thread(void *); F1_help_topic = TX("CARTOON"); printf("m_cartoon \n"); EFcartoon.menuname = "Cartoon"; EFcartoon.menufunc = m_cartoon; EFcartoon.Farea = 2; // select area usable EFcartoon.Fscript = 1; // scripting supported EFcartoon.threadfunc = cartoon_thread; // thread function if (! edit_setup(EFcartoon)) return; // setup edit pixcon = (float *) zmalloc(Eww * Ehh * sizeof(float),"cartoon"); E8pxm = PXM_copy(E1pxm); // blurred image E9pxm = PXM_copy(E1pxm); // kuwahara image /*** _____________________________ | Cartoon | | | | Line Threshold [ 20 ] | | Line Width [ 3 ] | | Kuwahara Depth [ 4 ] | | | | [Apply] [OK] [X] | |_____________________________| ***/ zdialog *zd = zdialog_new(TX("Cartoon"),Mwin,TX("Apply"),"OK","X",null); EFcartoon.zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"vbox","space","hb1",0,"space=3"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"homog"); zdialog_add_widget(zd,"vbox","space","hb1",0,"space=3"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"homog"); zdialog_add_widget(zd,"label","lab1","vb1",TX("Line Threshold")); zdialog_add_widget(zd,"label","lab1","vb1",TX("Line Width")); zdialog_add_widget(zd,"label","lab1","vb1",TX("Kuwahara Depth")); zdialog_add_widget(zd,"zspin","line_threshold","vb2","0|200|1|100"); zdialog_add_widget(zd,"zspin","line_width","vb2","0|10|1|1"); zdialog_add_widget(zd,"zspin","kuwahara_depth","vb2","0|10|1|1"); zdialog_resize(zd,200,0); zdialog_load_inputs(zd); zdialog_run(zd,cartoon_dialog_event,"save"); // run dialog, parallel zdialog_fetch(zd,"line_threshold",line_threshold); zdialog_fetch(zd,"line_width",line_width); zdialog_fetch(zd,"kuwahara_depth",kuwahara_depth); blur_radius = 2 * kuwahara_depth; priorKD = priorBR = -1; // initial edit return; } // dialog event and completion callback function int cartoon_dialog_event(zdialog *zd, ch *event) // dialog event function { using namespace cartoon; if (strmatch(event,"focus")) return 1; if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (strmatch(event,"apply")) zd->zstat = 1; // from script zdialog_fetch(zd,"line_threshold",line_threshold); // get outline threshold 0-1000 zdialog_fetch(zd,"line_width",line_width); // get line width 0-10 zdialog_fetch(zd,"kuwahara_depth",kuwahara_depth); // get kuwahara depth 0-10 blur_radius = 2 * kuwahara_depth; if (zd->zstat) { if (zd->zstat == 1) { // [apply] zd->zstat = 0; // keep dialog active thread_signal(); return 1; } if (zd->zstat == 2) { // [OK] edit_addhist("line thresh:%d width:%d blur rad:%d Kuwa depth:%d", line_threshold,line_width,blur_radius,kuwahara_depth); // edit parms > edit hist edit_done(0); } else edit_cancel(0); zfree(pixcon); } return 1; } // thread function to update image void * cartoon_thread(void *) { using namespace cartoon; void cartoon_blur(); void cartoon_kuwahara(); void cartoon_conmap(); void cartoon_drawlines(); int Fblur, Fkuwa, Fcon; Fblur = Fkuwa = Fcon = 0; if (blur_radius != priorBR) Fblur = Fkuwa = Fcon = 1; if (kuwahara_depth != priorKD) Fkuwa = Fcon = 1; priorBR = blur_radius; // capture now, can change during process priorKD = kuwahara_depth; progress_setgoal((Fblur*Fkuwa*Fcon+1)*Eww*Ehh); if (Fblur) cartoon_blur(); // E1 + blur >> E8 if (Fkuwa) cartoon_kuwahara(); // E8 + kuwahara >> E9 if (Fcon) cartoon_conmap(); // compute E9 pixel contrast cartoon_drawlines(); // draw lines where contrast > threshold progress_setgoal(0); CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return 0; } // Blur the image using blur_radius. E1 + blur >> E8 void cartoon_blur() { using namespace cartoon; void * cartoon_blur_wthread(void *arg); int rad, px, py, qx, qy; float R, W; PXM_free(E8pxm); E8pxm = PXM_copy(E1pxm); if (blur_radius == 0) return; rad = blur_radius; for (qy = -rad; qy <= rad; qy++) // compute blur weights for pixels for (qx = -rad; qx <= rad; qx++) // within rad of target pixel { R = sqrtf(qx * qx + qy * qy); if (R > rad) W = 0.0; else if (R == 0) W = 1.0; else W = 1.0 / R; py = qy + rad; px = qx + rad; Wrad[py][px] = W; } do_wthreads(cartoon_blur_wthread,NSMP); // worker threads return; } void * cartoon_blur_wthread(void *arg) // worker thread function { using namespace cartoon; int index = *((int *) arg); int rad = blur_radius; int ii, dist = 0, px, py, qx, qy; float W, Wsum; float R, G, B, *pix1, *pixq, *pix8; int pskip = 0; for (py = index + rad; py < Ehh-rad; py += NSMP) // loop all image pixels for (px = rad; px < Eww-rad; px++) { if (Fescape) break; if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel is outside area } R = G = B = Wsum = 0; for (qy = -rad; qy <= rad; qy++) // compute weighted sum RGB for pixels for (qx = -rad; qx <= rad; qx++) // within rad of target pixel { pix1 = PXMpix(E1pxm,px,py); pixq = PXMpix(E1pxm,px+qx,py+qy); if (PIXmatch(pix1,pixq) < 0.7) continue; // use only pixels matching target pixel W = Wrad[qy+rad][qx+rad]; R += W * pixq[0]; G += W * pixq[1]; B += W * pixq[2]; Wsum += W; } R = R / Wsum; // divide by sum of weights G = G / Wsum; B = B / Wsum; pix8 = PXMpix(E8pxm,px,py); // output pixel pix8[0] = R; pix8[1] = G; pix8[2] = B; if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; } // Perform a kuwahara sharpen of the image. E8 + kuwahara >> E9. void cartoon_kuwahara() { using namespace cartoon; void * cartoon_kuwahara_wthread(void *arg); PXM_free(E9pxm); E9pxm = PXM_copy(E8pxm); if (kuwahara_depth == 0) return; do_wthreads(cartoon_kuwahara_wthread,NSMP); // worker threads return; } void * cartoon_kuwahara_wthread(void *arg) // worker thread function { using namespace cartoon; int index = *((int *) arg); int px, py, qx, qy, rx, ry; int ii, rad, N, dist = 0; float *pix8, *pix9; float red, green, blue, red2, green2, blue2; float vmin, vall, vred, vgreen, vblue; float red9, green9, blue9; int pskip = 1; rad = kuwahara_depth; // user input radius N = (rad + 1) * (rad + 1); for (py = index + rad; py < Ehh-rad; py += NSMP) // loop all image pixels for (px = rad; px < Eww-rad; px++) { if (Fescape) break; if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel is outside area } vmin = 99999; red9 = green9 = blue9 = 0; for (qy = py - rad; qy <= py; qy++) // loop all surrounding neighborhoods for (qx = px - rad; qx <= px; qx++) { red = green = blue = 0; red2 = green2 = blue2 = 0; for (ry = qy; ry <= qy + rad; ry++) // loop all pixels in neighborhood for (rx = qx; rx <= qx + rad; rx++) { pix8 = PXMpix(E8pxm,rx,ry); red += pix8[0]; // compute mean RGB and mean RGB**2 red2 += pix8[0] * pix8[0]; green += pix8[1]; green2 += pix8[1] * pix8[1]; blue += pix8[2]; blue2 += pix8[2] * pix8[2]; } red = red / N; // mean RGB of neighborhood green = green / N; blue = blue / N; vred = red2 / N - red * red; // variance RGB vgreen = green2 / N - green * green; vblue = blue2 / N - blue * blue; vall = vred + vgreen + vblue; // save RGB values with least variance if (vall < vmin) { vmin = vall; red9 = red; green9 = green; blue9 = blue; } } pix9 = PXMpix(E9pxm,px,py); // output pixel pix9[0] = red9; pix9[1] = green9; pix9[2] = blue9; if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; } // Map contrast for E9 image pixels and set threshold scale. void cartoon_conmap() { using namespace cartoon; int ii, px, py, qx, qy; double sumcon, pix1con, maxcon; float *pixx, *pixq; maxcon = 0; for (py = 1; py < Ehh-1; py++) // make image pixel contrast map for (px = 1; px < Eww-1; px++) { if (Fescape) break; sumcon = 0; for (qy = py-1; qy <= py+1; qy++) for (qx = px-1; qx <= px+1; qx++) { pixx = PXMpix(E9pxm,px,py); // pixel contrast is mean contrast pixq = PXMpix(E9pxm,qx,qy); // with 8 neighboring pixels sumcon += fabsf(pixx[0] - pixq[0]); sumcon += fabsf(pixx[1] - pixq[1]); sumcon += fabsf(pixx[2] - pixq[2]); } ii = py * Eww + px; pixcon[ii] = pix1con = 0.0417 * sumcon; // / (8 * 3) if (pix1con > maxcon) maxcon = pix1con; progress_addvalue(1); } Fthreshold = maxcon; // threshold scale factor return; } // Draw lines on the image where edges are detected. // E9 >> E3, add lines to E3, use E1 for area blend. void cartoon_drawlines() { void * cartoon_drawlines_wthread(void *arg); PXM_free(E3pxm); E3pxm = PXM_copy(E9pxm); do_wthreads(cartoon_drawlines_wthread,NSMP); // worker threads } void * cartoon_drawlines_wthread(void *arg) // worker thread function { using namespace cartoon; int index = *((int *) arg); int px, py, qx, qy, ii, dist = 0; float Fthresh, paint, f1, f2; float *pix3, *pix3q; int pskip = 0; Fthresh = 0.001 * line_threshold * Fthreshold; // 0 .. 1000 >> 0 .. Fthreshold for (py = index+1; py < Ehh-1; py += NSMP) for (px = 1; px < Eww-1; px++) { if (Fescape) break; ii = py * Eww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } if (pixcon[ii] < Fthresh) continue; pix3 = PXMpix(E3pxm,px,py); // output image pixel paint = line_width * (pixcon[ii] - Fthresh) / Fthresh; if (paint <= 1) { f1 = paint; f2 = 1.0 - f1; pix3[0] = f2 * pix3[0]; pix3[1] = f2 * pix3[1]; pix3[2] = f2 * pix3[2]; } else { f1 = (paint - 1.0) / 8.0; if (f1 > 1.0) f1 = 1.0; f2 = 1.0 - f1; for (qy = py-1; qy <= py+1; qy++) for (qx = px-1; qx <= px+1; qx++) { if (qx == px && qy == py) pix3[0] = pix3[1] = pix3[2] = 0; else { pix3q = PXMpix(E3pxm,qx,qy); pix3q[0] = f2 * pix3q[0]; pix3q[1] = f2 * pix3q[1]; pix3q[2] = f2 * pix3q[2]; } } } if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; } /**************************************************************************************/ // convert image to simulate an embossing namespace emboss_names { editfunc EFemboss; int radius, depth; int angle = 0; // illumination angle float kernel[41][41]; // support radius <= 20 } // menu function void m_emboss(GtkWidget *, ch *menu) { using namespace emboss_names; int emboss_dialog_event(zdialog* zd, ch *event); void * emboss_thread(void *); F1_help_topic = TX("EMBOSS"); printf("m_emboss \n"); EFemboss.menuname = "Emboss"; EFemboss.menufunc = m_emboss; EFemboss.Fscript = 1; // scripting supported EFemboss.Farea = 2; // select area usable EFemboss.Fpaintedits = 1; // can use paint edits EFemboss.threadfunc = emboss_thread; // thread function if (! edit_setup(EFemboss)) return; // setup edit /*** __________________________ | Emboss | | | | Radius [__] Depth [__] | | Light Source [___] deg. | | | | [OK] [X] | |__________________________| ***/ zdialog *zd = zdialog_new(TX("Emboss"),Mwin,"OK","X",null); EFemboss.zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","lab1","hb1",TX("Radius"),"space=5"); zdialog_add_widget(zd,"zspin","radius","hb1","0|20|1|2"); zdialog_add_widget(zd,"label","lab2","hb1",TX("Depth"),"space=5"); zdialog_add_widget(zd,"zspin","depth","hb1","0|99|1|3"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=3"); zdialog_add_widget(zd,"label","lab2","hb2",TX("Light Source"),"space=5"); zdialog_add_widget(zd,"zspin","angle","hb2","0|360|1|0"); zdialog_add_widget(zd,"label","lab3","hb2","deg.","space=5"); zdialog_add_ttip(zd,"angle",TX("direction of light and shadows")); radius = 2; depth = 3; angle = 0; zdialog_run(zd,emboss_dialog_event,"save"); // run dialog, parallel thread_signal(); return; } // dialog event and completion callback function int emboss_dialog_event(zdialog *zd, ch *event) // emboss dialog event function { using namespace emboss_names; if (strmatch(event,"focus")) return 1; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (strmatch(event,"apply")) { // from script zdialog_fetch(zd,"radius",radius); // get user inputs zdialog_fetch(zd,"depth",depth); zdialog_fetch(zd,"angle",angle); thread_signal(); zd->zstat = 1; } if (zd->zstat) { if (zd->zstat == 1) { // [OK] commit edit edit_addhist("radius:%d depth:%d angle:%d",radius,depth,angle); // edit parms > edit hist edit_done(0); } else edit_cancel(0); // discard edit return 1; } if (zstrstr("paint radius depth angle",event)) { // mouse paint or dialog input zdialog_fetch(zd,"radius",radius); // get user inputs zdialog_fetch(zd,"depth",depth); zdialog_fetch(zd,"angle",angle); thread_signal(); } return 1; } // thread function - use multiple working threads void * emboss_thread(void *) { using namespace emboss_names; void * emboss_wthread(void *arg); int dx, dy, rad; float C1, C2, R; float T = angle / 57.3; // illumination direction float Cx = sinf(T), Cy = cosf(T); if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag rad = radius; C1 = 0.1 * depth / (rad * rad + 1); // max. illumination for (dy = -rad; dy <= rad; dy++) // build kernel with radius and depth for (dx = -rad; dx <= rad; dx++) { if (dx == 0 && dy == 0) continue; R = sqrtf(dx*dx + dy*dy); // cell distance from kernel center C2 = C1 * (Cx*dx + Cy*dy)/R; // illumination of cell kernel[dx+rad][dy+rad] = C2; } kernel[rad][rad] = 1; // kernel center cell = 1 get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(emboss_wthread,NSMP); // worker threads CEF->Fmods++; CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } void * emboss_wthread(void *arg) // worker thread function { using namespace emboss_names; int index = *((int *) (arg)); int px, py, Fend; int dx, dy, rad; int nc = E1pxm->nc; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float bright1, bright3; float *pix1, *pix3, *pixN; float sumpix, kern; float blend; rad = radius; while (true) { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; if (px < rad || py < rad) continue; if (px > Eww-rad-1 || py > Ehh-rad-1) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; G3 = pix3[1]; B3 = pix3[2]; sumpix = 0; for (dy = -rad; dy <= rad; dy++) // loop surrounding block of pixels for (dx = -rad; dx <= rad; dx++) { pixN = pix1 + (dy * Eww + dx) * nc; kern = kernel[dx+rad][dy+rad]; sumpix += kern * (pixN[0] + pixN[1] + pixN[2]); // kern sums to 1.0 } bright1 = pix1[0] + pix1[1] + pix1[2] + 1; bright3 = (sumpix + 1) / bright1; // ratio of brightness change R9 = bright3 * R1; G9 = bright3 * G1; B9 = bright3 * B1; RGBfix(R9,G9,B9); if (Fpaintedits) // mouse paint edit { if (blend > 0) { // increase edit R3 = blend * R9 + (1-blend) * R3; G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { // decrease edit R3 = -blend * R1 + (1+blend) * R3; G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full image edit { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // convert image to simulate square tiles namespace tiles1_names { editfunc EFtiles1; int size, gap, D3; float *pixmap = 0; } void m_tiles1(GtkWidget *, ch *menu) { using namespace tiles1_names; int tiles1_dialog_event(zdialog *zd, ch *event); void * tiles1_thread(void *); int64 z64 = 1; F1_help_topic = TX("TILES1"); printf("m_tiles1 \n"); EFtiles1.menuname = "Tiles1"; EFtiles1.menufunc = m_tiles1; EFtiles1.Farea = 2; // select area usable EFtiles1.Fscript = 1; // scripting supported EFtiles1.threadfunc = tiles1_thread; // thread function if (! edit_setup(EFtiles1)) return; // setup edit /*** _____________________________ | Make Square Tiles | | | | tile size [____] | | tile gap [____] | | 3D depth [____] | | | | [Apply] [OK] [X] | |_____________________________| ***/ zdialog *zd = zdialog_new(TX("Make Square Tiles"),Mwin,TX("Apply"),"OK","X",null); EFtiles1.zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labt","hb1",TX("tile size"),"space=5"); zdialog_add_widget(zd,"zspin","size","hb1","1|99|1|10","space=5"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labg","hb2",TX("tile gap"),"space=5"); zdialog_add_widget(zd,"zspin","gap","hb2","0|9|1|1","space=5"); zdialog_add_widget(zd,"hbox","hb3","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labd","hb3",TX("3D depth"),"space=5"); zdialog_add_widget(zd,"zspin","D3","hb3","0|9|1|1","space=5"); size = 10; // defaults gap = 1; D3 = 0; int64 cc = z64 * Eww * Ehh * 3 * sizeof(float); pixmap = (float *) zmalloc(cc,"tiles1"); // set up pixel color map zdialog_run(zd,tiles1_dialog_event,"save"); // run dialog, parallel return; } // dialog event and completion callback function int tiles1_dialog_event(zdialog * zd, ch *event) { using namespace tiles1_names; if (strmatch(event,"focus")) return 1; if (strmatch(event,"apply")) zd->zstat = 1; // from script if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (zd->zstat) // dialog complete { if (zd->zstat == 1) { // apply zd->zstat = 0; // keep dialog active zdialog_fetch(zd,"size",size); // get tile size zdialog_fetch(zd,"gap",gap); // get tile gap zdialog_fetch(zd,"D3",D3); // get 3D yes/no if (size < 2) edit_reset(); // restore original image else thread_signal(); // trigger working thread return 1; } else if (zd->zstat == 2) { // commit edit edit_addhist("tile size:%d gap:%d depth:%d",size,gap,D3); // edit parms > edit hist edit_done(0); } else edit_cancel(0); // discard edit zfree(pixmap); } return 1; } // image tiles1 thread function void * tiles1_thread(void *) { using namespace tiles1_names; int sg, gg, eg, sumpix; int ii, px, py, qx, qy; int td, bd, ld, rd; int64 zii, z64 = 1; float red = 0, green = 0, blue = 0; float hired = 0, higreen = 0, hiblue = 0; float lored = 0, logreen = 0, loblue = 0; float *pix1, *pix3; sg = size + gap; gg = gap; for (py = 0; py < Ehh; py += sg) // initz. pixel color map for for (px = 0; px < Eww; px += sg) // given pixel size { sumpix = red = green = blue = 0; for (qy = py + gg; qy < py + sg; qy++) // get mean color for pixel block for (qx = px + gg; qx < px + sg; qx++) { if (qy > Ehh-1 || qx > Eww-1) continue; pix1 = PXMpix(E1pxm,qx,qy); red += pix1[0]; green += pix1[1]; blue += pix1[2]; sumpix++; } if (! sumpix) continue; red = (red / sumpix); // tile color green = (green / sumpix); blue = (blue / sumpix); if (D3) { hired = 0.5 * (red + 255.0); // 3D highlight and shadow colors higreen = 0.5 * (green + 255.0); hiblue = 0.5 * (blue + 255.0); lored = 0.5 * red; logreen = 0.5 * green; loblue = 0.5 * blue; } for (qy = py; qy < py + sg; qy++) // set color for pixels in block for (qx = px; qx < px + sg; qx++) { if (qy > Ehh-1 || qx > Eww-1) continue; zii = z64 * (qy * Eww + qx) * 3; // pixel index td = qx - px; // distance from top edge of tile bd = px + sg - qx; // distance from bottom edge ld = qy - py; // distance from left edge rd = py + sg - qy; // distance from right edge if (td < gg || ld < gg) { // gap pixels are black pixmap[zii] = pixmap[zii+1] = pixmap[zii+2] = 0; continue; } if (D3) { eg = D3; // tile "depth" if (td < gg+eg && td < rd) { // top edge: highlight pixmap[zii] = hired; // bevel at right end pixmap[zii+1] = higreen; pixmap[zii+2] = hiblue; continue; } if (ld < gg+eg && ld < bd) { // left edge: highlight pixmap[zii] = hired; // bevel at bottom end pixmap[zii+1] = higreen; pixmap[zii+2] = hiblue; continue; } if (bd <= eg || rd <= eg) { // bottom or right edge: shadow pixmap[zii] = lored; pixmap[zii+1] = logreen; pixmap[zii+2] = loblue; continue; } } pixmap[zii] = red; pixmap[zii+1] = green; pixmap[zii+2] = blue; } } if (sa_stat == sa_stat_fini) // process selected area { for (ii = 0; ii < Eww * Ehh; ii++) // find pixels in select area { if (! sa_pixmap[ii]) continue; py = ii / Eww; px = ii - py * Eww; pix3 = PXMpix(E3pxm,px,py); zii = z64 * (py * Eww + px) * 3; pix3[0] = pixmap[zii]; pix3[1] = pixmap[zii+1]; // apply block color to member pixels pix3[2] = pixmap[zii+2]; } } else // process entire image { for (py = 0; py < Ehh-1; py++) // loop all image pixels for (px = 0; px < Eww-1; px++) { pix3 = PXMpix(E3pxm,px,py); // target pixel zii = z64 * (py * Eww + px) * 3; // color map for (px,py) pix3[0] = pixmap[zii]; pix3[1] = pixmap[zii+1]; pix3[2] = pixmap[zii+2]; } } CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return 0; } /**************************************************************************************/ // common functions for m_tiles2() and m_painting() // pixgroups_make // pixgroups_merge // pixgroups_borders namespace pixgroups_names { int color_depth; int area_goal; int color_match; typedef struct { int16 px, py; ch direc; } spixstack; int Nstack; spixstack *pixstack; // pixel group search memory int *pixgroup; // maps (px,py) to pixel group no. int *groupcount; // count of pixels in each group float *pixmap = 0; int group; ch direc; float gcolor[3]; } // find all groups of contiguous pixels with the same color void pixgroups_make() { using namespace pixgroups_names; int cc1, cc2; int ii, kk, px, py; int ppx, ppy, npx, npy; float *pix3; cc1 = Eww * Ehh; cc2 = cc1 * sizeof(int); pixgroup = (int *) zmalloc(cc2,"painting"); // maps pixel to assigned group cc2 = cc1 * sizeof(spixstack); pixstack = (spixstack *) zmalloc(cc2,"painting"); // memory stack for pixel search cc2 = cc1 * sizeof(int); groupcount = (int *) zmalloc(cc2,"painting"); // counts pixels per group group = 0; for (py = 0; py < Ehh; py++) // loop all pixels for (px = 0; px < Eww; px++) { if (Fescape) break; if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; if (sa_pixmap[ii] == 0) continue; // pixel outside of area } kk = py * Eww + px; if (pixgroup[kk]) continue; // already assigned to group pixgroup[kk] = ++group; // assign next group ++groupcount[group]; pix3 = PXMpix(E3pxm,px,py); gcolor[0] = pix3[0]; gcolor[1] = pix3[1]; gcolor[2] = pix3[2]; pixstack[0].px = px; // put pixel into stack with pixstack[0].py = py; // direction = ahead pixstack[0].direc = 'a'; Nstack = 1; while (Nstack) { kk = Nstack - 1; // get last pixel in stack px = pixstack[kk].px; py = pixstack[kk].py; direc = pixstack[kk].direc; if (direc == 'x') { Nstack--; continue; } if (Nstack > 1) { ii = Nstack - 2; // get prior pixel in stack ppx = pixstack[ii].px; ppy = pixstack[ii].py; } else { ppx = px - 1; // if only one, assume prior = left ppy = py; } if (direc == 'a') { // next ahead pixel npx = px + px - ppx; npy = py + py - ppy; pixstack[kk].direc = 'r'; // next search direction } else if (direc == 'r') { // next right pixel npx = px + py - ppy; npy = py + px - ppx; pixstack[kk].direc = 'l'; } else { /* direc = 'l' */ // next left pixel npx = px + ppy - py; npy = py + ppx - px; pixstack[kk].direc = 'x'; } if (npx < 0 || npx > Eww-1) continue; // pixel off the edge if (npy < 0 || npy > Ehh-1) continue; kk = npy * Eww + npx; if (pixgroup[kk]) continue; // pixel already assigned pix3 = PXMpix(E3pxm,npx,npy); if (pix3[0] != gcolor[0] || pix3[1] != gcolor[1] // not same color as group || pix3[2] != gcolor[2]) continue; pixgroup[kk] = group; // assign pixel to group ++groupcount[group]; kk = Nstack++; // put pixel into stack pixstack[kk].px = npx; pixstack[kk].py = npy; pixstack[kk].direc = 'a'; // direction = ahead } } return; } // merge small pixel groups into adjacent larger groups with best color match void pixgroups_merge() { using namespace pixgroups_names; int jj, kk, px, py, npx, npy; int mcount, group2; int64 nccc, z64 = 1; int nnpx[4] = { 0, -1, +1, 0 }; int nnpy[4] = { -1, 0, 0, +1 }; float match, colrmatch = 0.01 * color_match; float *pix3, *pixN; typedef struct { int group; double match; float pixM[3]; } snewgroup; snewgroup *newgroup; nccc = z64 * (group + 1) * sizeof(snewgroup); // group count newgroup = (snewgroup *) zmalloc(nccc,"painting"); while (true) { memset(newgroup,0,nccc); for (py = 0; py < Ehh; py++) // loop all pixels for (px = 0; px < Eww; px++) { if (Fescape) break; kk = Eww * py + px; // get assigned group group = pixgroup[kk]; if (! group) continue; if (groupcount[group] >= area_goal) continue; // group count large enough pix3 = PXMpix(E3pxm,px,py); for (jj = 0; jj < 4; jj++) // get 4 neighbor pixels { npx = px + nnpx[jj]; npy = py + nnpy[jj]; if (npx < 0 || npx >= Eww) continue; // off the edge if (npy < 0 || npy >= Ehh) continue; kk = Eww * npy + npx; if (pixgroup[kk] == group) continue; // in same group pixN = PXMpix(E3pxm,npx,npy); // match color of group neighbor match = PIXmatch(pix3,pixN); // 0..1 = zero..perfect match if (match < colrmatch) continue; if (match > newgroup[group].match) { newgroup[group].match = match; // remember best match newgroup[group].group = pixgroup[kk]; // and corresp. group no. newgroup[group].pixM[0] = pixN[0]; // and corresp. new color newgroup[group].pixM[1] = pixN[1]; newgroup[group].pixM[2] = pixN[2]; } } } mcount = 0; for (py = 0; py < Ehh; py++) // loop all pixels for (px = 0; px < Eww; px++) { if (Fescape) break; kk = Eww * py + px; group = pixgroup[kk]; // test for new group assignment if (! group) continue; group2 = newgroup[group].group; if (! group2) continue; if (groupcount[group] > groupcount[group2]) continue; // accept only bigger new group pixgroup[kk] = group2; // make new group assignment --groupcount[group]; ++groupcount[group2]; pix3 = PXMpix(E3pxm,px,py); // make new color assignment pix3[0] = newgroup[group].pixM[0]; pix3[1] = newgroup[group].pixM[1]; pix3[2] = newgroup[group].pixM[2]; mcount++; } if (mcount == 0) break; } zfree(pixgroup); zfree(pixstack); zfree(groupcount); zfree(newgroup); return; } // paint borders between the groups of matching pixels void pixgroups_borders() { using namespace pixgroups_names; int ii, kk, px, py, cc; float *pix3, *pixL, *pixA; cc = Eww * Ehh; ch * pixblack = (ch *) zmalloc(cc,"painting"); for (py = 1; py < Ehh; py++) // loop all pixels for (px = 1; px < Eww; px++) // omit top and left { if (Fescape) break; if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; if (sa_pixmap[ii] == 0) continue; // pixel outside of area } pix3 = PXMpix(E3pxm,px,py); // output pixel pixL = PXMpix(E3pxm,px-1,py); // pixel to left pixA = PXMpix(E3pxm,px,py-1); // pixel above if (pix3[0] != pixL[0] || pix3[1] != pixL[1] || pix3[2] != pixL[2]) { kk = Eww * py + px-1; // have horiz. transition if (pixblack[kk]) continue; kk += 1; pixblack[kk] = 1; continue; } if (pix3[0] != pixA[0] || pix3[1] != pixA[1] || pix3[2] != pixA[2]) { kk = Eww * (py-1) + px; // have vertical transition if (pixblack[kk]) continue; kk += Eww; pixblack[kk] = 1; } } for (py = 1; py < Ehh; py++) for (px = 1; px < Eww; px++) { kk = Eww * py + px; if (! pixblack[kk]) continue; pix3 = PXMpix(E3pxm,px,py); pix3[0] = pix3[1] = pix3[2] = 0; } zfree(pixblack); return; } /**************************************************************************************/ // convert image to irregular tiles matching image features namespace tiles2_names { int base_size; editfunc EFtiles2; } void m_tiles2(GtkWidget *, ch *menu) { using namespace tiles2_names; using namespace pixgroups_names; int tiles2_dialog_event(zdialog *zd, ch *event); void * tiles2_thread(void *); F1_help_topic = TX("TILES2"); printf("m_tiles2 \n"); EFtiles2.menuname = "Tiles2"; EFtiles2.menufunc = m_tiles2; EFtiles2.Farea = 2; // select area usable EFtiles2.Fscript = 1; // scripting supported EFtiles2.threadfunc = tiles2_thread; // thread function if (! edit_setup(EFtiles2)) return; // setup edit /*** _____________________________ | Irregular Tiles | | | | base size [____] | | color depth [___] | | tile area goal [____] | | req. color match [___] | | | | [Apply] [OK] [X] | |_____________________________| ***/ zdialog *zd = zdialog_new(TX("Irregular Tiles"),Mwin,TX("Apply"),"OK","X",null); EFtiles2.zd = zd; zdialog_add_widget(zd,"hbox","hbsize","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labsize","hbsize",TX("base size"),"space=5"); zdialog_add_widget(zd,"zspin","base_size","hbsize","2|99|1|10","space=5"); zdialog_add_widget(zd,"hbox","hbcolor","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labcolor","hbcolor",TX("color depth"),"space=5"); zdialog_add_widget(zd,"zspin","color_depth","hbcolor","1|8|1|4","space=5"); zdialog_add_widget(zd,"hbox","hbgoal","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labgoal","hbgoal",TX("tile area goal"),"space=5"); zdialog_add_widget(zd,"zspin","area_goal","hbgoal","0|99999|100|1000","space=5"); zdialog_add_widget(zd,"hbox","hbmatch","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labmatch","hbmatch",TX("req. color match"),"space=5"); zdialog_add_widget(zd,"zspin","color_match","hbmatch","0|99|1|80","space=5"); base_size = 10; color_depth = 4; area_goal = 1000; color_match = 80; zdialog_run(zd,tiles2_dialog_event,"save"); // run dialog, parallel return; } // dialog event and completion callback function int tiles2_dialog_event(zdialog * zd, ch *event) { using namespace tiles2_names; using namespace pixgroups_names; if (strmatch(event,"focus")) return 1; if (strmatch(event,"apply")) zd->zstat = 1; // from script if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (zd->zstat) // dialog complete { if (zd->zstat == 1) { // apply zd->zstat = 0; // keep dialog active zdialog_fetch(zd,"base_size",base_size); // get tile base size zdialog_fetch(zd,"color_depth",color_depth); // get tile color depth zdialog_fetch(zd,"area_goal",area_goal); // group area goal zdialog_fetch(zd,"color_match",color_match); // req. color match to combine groups thread_signal(); // trigger working thread return 1; } else if (zd->zstat == 2) { // commit edit edit_addhist("size:%d depth:%d goal:%d match:%d", // 25.1 base_size, color_depth, area_goal, color_match); // edit parms > edit hist edit_done(0); } else edit_cancel(0); // discard edit } return 1; } // tiles2 thread function void * tiles2_thread(void *) { using namespace tiles2_names; using namespace pixgroups_names; void tiles2_base(); // color base tiles void tiles2_colordepth(); // reduce tiles color depth tiles2_base(); tiles2_colordepth(); pixgroups_make(); pixgroups_merge(); pixgroups_borders(); sa_postfix(); // if select area, restore unselected CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return 0; } // form base tiles with mean colors from input image void tiles2_base() { using namespace tiles2_names; using namespace pixgroups_names; int bsz, sumpix; int px, py, qx, qy; float red, green, blue; float *pix1, *pix3; bsz = base_size; for (py = 0; py < Ehh - bsz; py += bsz) // initz. pixel color map for for (px = 0; px < Eww - bsz; px += bsz) // given pixel size { if (Fescape) break; sumpix = red = green = blue = 0; for (qy = py; qy < py + bsz; qy++) // get mean color for pixel block for (qx = px; qx < px + bsz; qx++) { pix1 = PXMpix(E1pxm,qx,qy); red += pix1[0]; green += pix1[1]; blue += pix1[2]; sumpix++; } if (! sumpix) continue; // black red = (red / sumpix); // tile color green = (green / sumpix); blue = (blue / sumpix); for (qy = py; qy < py + bsz; qy++) // set color for pixels in block for (qx = px; qx < px + bsz; qx++) { pix3 = PXMpix(E3pxm,qx,qy); pix3[0] = red; pix3[1] = green; pix3[2] = blue; } } return; } // set the specified color depth, 1-8 bits/color void tiles2_colordepth() { using namespace pixgroups_names; PXM_rgbdepth(E3pxm,color_depth); return; } /**************************************************************************************/ // convert image to simulate a painting namespace painting_names { editfunc EFpainting; int blur_radius; int borders; } void m_painting(GtkWidget *, ch *menu) { using namespace painting_names; using namespace pixgroups_names; int painting_dialog_event(zdialog *zd, ch *event); void * painting_thread(void *); F1_help_topic = TX("PAINTING"); printf("m_painting \n"); EFpainting.menuname = "Painting"; EFpainting.menufunc = m_painting; EFpainting.Farea = 2; // select area usable EFpainting.Fscript = 1; // scripting supported EFpainting.threadfunc = painting_thread; // thread function if (! edit_setup(EFpainting)) return; // setup edit /*** _____________________________ | Simulate Painting | | | | blur radius [____] | | color depth [____] | | patch area goal [____] | | req. color match [____] | | borders [_] | | | | [Apply] [OK] [X] | |_____________________________| ***/ zdialog *zd = zdialog_new(TX("Painting"),Mwin,TX("Apply"),"OK","X",null); EFpainting.zd = zd; zdialog_add_widget(zd,"hbox","hbbr","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labbr","hbbr",TX("blur radius"),"space=5"); zdialog_add_widget(zd,"zspin","blurrad","hbbr","0|20|1|3","space=5"); zdialog_add_widget(zd,"hbox","hbcd","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labcd","hbcd",TX("color depth"),"space=5"); zdialog_add_widget(zd,"zspin","colordepth","hbcd","1|8|1|3","space=5"); zdialog_add_widget(zd,"hbox","hbts","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labts","hbts",TX("patch area goal"),"space=5"); zdialog_add_widget(zd,"zspin","area_goal","hbts","0|9999|10|1000","space=5"); zdialog_add_widget(zd,"hbox","hbcm","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labcm","hbcm",TX("req. color match"),"space=5"); zdialog_add_widget(zd,"zspin","colormatch","hbcm","0|99|1|50","space=5"); zdialog_add_widget(zd,"hbox","hbbd","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labbd","hbbd",TX("borders"),"space=5"); zdialog_add_widget(zd,"check","borders","hbbd",0,"space=2"); zdialog_load_inputs(zd); // preload prior user inputs zdialog_run(zd,painting_dialog_event,"save"); // run dialog, parallel return; } // dialog event and completion callback function int painting_dialog_event(zdialog *zd, ch *event) { using namespace painting_names; using namespace pixgroups_names; if (strmatch(event,"focus")) return 1; if (strmatch(event,"apply")) zd->zstat = 1; // from script if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (zd->zstat) { if (zd->zstat == 1) { // apply zd->zstat = 0; // keep dialog active edit_reset(); // start over zdialog_fetch(zd,"blurrad",blur_radius); // blur radius zdialog_fetch(zd,"colordepth",color_depth); // color depth zdialog_fetch(zd,"area_goal",area_goal); // target pixel group area zdialog_fetch(zd,"colormatch",color_match); // req. color match to combine groups zdialog_fetch(zd,"borders",borders); // borders wanted thread_signal(); // do the work } else if (zd->zstat == 2) { // done, commit edit edit_addhist("radius:%d color:%d patch:%d match:%d borders:%d", blur_radius,color_depth,area_goal,color_match,borders); // edit parms > edit hist 25.1 edit_done(0); } else edit_cancel(0); return 1; } return 0; } // painting thread function void * painting_thread(void *) { using namespace painting_names; void painting_blur(); void painting_colordepth(); painting_blur(); // blur image painting_colordepth(); // set new color depth pixgroups_make(); pixgroups_merge(); if (borders) pixgroups_borders(); sa_postfix(); // if select area, restore unselected CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return 0; } // blur the image using specified blur radius void painting_blur() { using namespace painting_names; PXM_blur(E3pxm,blur_radius); return; } // set the specified color depth, 1-8 bits/color void painting_colordepth() { using namespace pixgroups_names; PXM_rgbdepth(E3pxm,color_depth); return; } /**************************************************************************************/ // texture menu function // apply a random texture to the image namespace texturenames { editfunc EFtexture; // edit function data int radius = 4; int power = 40; } void m_texture(GtkWidget *, ch *menu) { using namespace texturenames; int texture_dialog_event(zdialog* zd, ch *event); void * texture_thread(void *); zdialog *zd; F1_help_topic = TX("TEXTURE"); printf("m_texture \n"); EFtexture.menuname = "Texture"; EFtexture.menufunc = m_texture; EFtexture.Farea = 2; // select area OK EFtexture.Fpaintedits = 1; // can use paint edits EFtexture.Fscript = 1; // scripting supported EFtexture.threadfunc = texture_thread; // thread function if (! edit_setup(EFtexture)) return; // setup edit /*** ___________________________________ | Add Texture | | | | Radius [___] Power [___] | | | | [Apply] [OK] [X] | |___________________________________| ***/ zd = zdialog_new(TX("Add Texture"),Mwin,TX("Apply"),"OK","X",null); // texture dialog CEF->zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=10"); zdialog_add_widget(zd,"label","labrad","hb1",TX("Radius"),"space=3"); zdialog_add_widget(zd,"zspin","radius","hb1","1|40|1|4"); zdialog_add_widget(zd,"label","space","hb1",0,"space=1"); zdialog_add_widget(zd,"label","labpow","hb1",TX("Power")); zdialog_add_widget(zd,"zspin","power","hb1","1|100|1|40","space=3"); zdialog_stuff(zd,"radius",radius); zdialog_stuff(zd,"power",power); zdialog_run(zd,texture_dialog_event,"save"); // run dialog - parallel return; } // texture dialog event and completion function int texture_dialog_event(zdialog *zd, ch *event) { using namespace texturenames; if (strmatch(event,"focus")) return 1; if (strmatch(event,"apply")) zd->zstat = 1; // from script if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (zd->zstat) { if (zd->zstat == 1) { // apply zd->zstat = 0; // keep dialog active edit_reset(); zdialog_fetch(zd,"radius",radius); zdialog_fetch(zd,"power",power); thread_signal(); // process return 1; } if (zd->zstat == 2) { // commit edit edit_addhist("radius:%d power:%d",radius,power); // edit parms > edit hist edit_done(0); return 1; } edit_cancel(0); // cancel edit return 1; } if (strmatch(event,"paint")) { // mouse paint zdialog_fetch(zd,"radius",radius); zdialog_fetch(zd,"power",power); thread_signal(); } return 1; } // thread function - update image void * texture_thread(void *) { using namespace texturenames; void * texture_wthread(void *arg); // worker thread if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // initz. progress counter else progress_setgoal(Eww * Ehh); get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(texture_wthread,NSMP); // worker threads progress_setgoal(0); CEF->Fmods = 1; // image modified CEF->Fsaved = 0; // not saved if (! Fpaintedits) Fpaint2(); // update window return 0; } void * texture_wthread(void *arg) // worker thread function { using namespace texturenames; int index = *((int *) (arg)); int px, py, qx, qy, npix; int Fend, rank1, rank2; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float *pix1, *pix3, *qpix; float pow, ff; float pbright, qbright; float blend; int pskip = 0; pow = 0.001 * powf(power,1.5); // 0.001 ... 1.0 while (true) { if (Fescape) break; Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; if (px < radius || px >= Eww-radius) continue; // avoid image edges if (py < radius || py >= Ehh-radius) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; G3 = pix3[1]; B3 = pix3[2]; pbright = PIXBRIGHT(pix1); // input pixel brightness npix = 0; rank1 = rank2 = 0; for (qy = py-radius; qy <= py+radius; qy++) // loop pixels in neighborhood for (qx = px-radius; qx <= px+radius; qx++) { qpix = PXMpix(E1pxm,qx,qy); // neighbor pixel qbright = PIXBRIGHT(qpix); // compare neighbor brightness if (qbright < pbright) rank1++; // count darker neighbors if (qbright == pbright) rank2++; // count equal neighbors npix++; } if (! pbright) ff = 1; else { qbright = 255.9 * (rank1 + 0.5 * rank2) / npix; // assigned brightness = 256*rank/npix ff = qbright / pbright; // new/old brightness ratio } ff = 1.0 - pow * (1.0 - ff); // 1 ... ff for pow = 0 ... 1 R9 = ff * R1; // RGB for new brightness level G9 = ff * G1; B9 = ff * B1; RGBfix(R9,G9,B9); if (Fpaintedits) // mouse paint edit { if (blend > 0) { // increase edit R3 = blend * R9 + (1-blend) * R3; G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { // decrease edit R3 = -blend * R1 + (1+blend) * R3; G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full image edit { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; // exit thread } /**************************************************************************************/ // suppress fine details while retaining sharpness // also useful for noise suppression namespace fusion_names { editfunc EFfusion; int Frun; int count; zdialog *zd; } // menu function void m_fusion(GtkWidget *, ch *menu) // 25.1 { using namespace fusion_names; int fusion_dialog_event(zdialog* zd, ch *event); void * fusion_thread(void *); printf("m_fusion \n"); F1_help_topic = TX("FUSION"); EFfusion.menuname = "fusion"; EFfusion.menufunc = m_fusion; EFfusion.Farea = 2; // select area usable EFfusion.threadfunc = fusion_thread; if (! edit_setup(EFfusion)) return; // setup edit E8pxm = PXM_copy(E0pxm); // initial input image /*** ___________________________________ | Fusion | | | | [start] [stop] [step] count: NN | | | | [Reset] [OK] [X] | |___________________________________| ***/ zd = zdialog_new(TX("Fusion"),Mwin,TX("Reset"),"OK","X",null); EFfusion.zd = zd; zdialog_add_widget(zd,"hbox","hbcon","dialog",0,"space=3"); zdialog_add_widget(zd,"button","start","hbcon",TX("start"),"space=3"); zdialog_add_widget(zd,"button","stop","hbcon",TX("stop"),"space=3"); zdialog_add_widget(zd,"button","step","hbcon",TX("step"),"space=3"); zdialog_add_widget(zd,"label","count","hbcon",TX("count: 0"),"space=5"); zdialog_add_ttip(zd,"start",TX("start fusion process")); zdialog_add_ttip(zd,"stop",TX("stop fusion process")); Frun = 0; count = 0; zdialog_run(zd,fusion_dialog_event,"save"); return; } // dialog event and completion callback function int fusion_dialog_event(zdialog *zd, ch *event) { using namespace fusion_names; int fusion_timerfunc(void *); static int N0 = 0, N1 = 1; if (strmatch(event,"focus")) return 1; if (strmatch(event,"done")) zd->zstat = 2; // done if (strmatch(event,"cancel")) zd->zstat = 3; // cancel thread_wait(); if (strmatch(event,"start")) { if (! Frun) { Frun = 1; // start timer function g_timeout_add(500,fusion_timerfunc,&N0); // runs every 0.5 sec. } } else if (strmatch(event,"stop")) Frun = 0; else if (strmatch(event,"step")) { Frun = 1; g_timeout_add(500,fusion_timerfunc,&N1); } else Frun = 0; if (zd->zstat) Frun = 0; // stop thread if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active edit_reset(); PXM_copy(E0pxm,E8pxm); // restore input image zdialog_stuff(zd,"count",TX("count: 0")); count = 0; return 1; } if (zd->zstat == 2) // [OK] { edit_addhist("count:%d",count); // edit parms > edit hist PXM_free(E8pxm); // free input image edit_done(0); return 1; } if (zd->zstat < 0 || zd->zstat > 2) // [X] or [-] cancel { PXM_free(E8pxm); // free input image edit_cancel(0); return 1; } return 1; } // timer function - start thread every interval int fusion_timerfunc(void *arg) { using namespace fusion_names; ch labcount[20]; int N = *((int *) arg); if (! Frun) return 0; // exit forever thread_signal(); // start thread process thread_wait(); if (CEF) { CEF->Fmods = 1; // image E3 modified CEF->Fsaved = 0; } Fpaint2(); // update image window snprintf(labcount,20,"count: %d",++count); // update counter zdialog_stuff(zd,"count",labcount); if (N == 1) { Frun = 0; // run only 1 time return 0; // exit forever } return 1; // repeat every interval } // thread function void * fusion_thread(void *arg) { using namespace fusion_names; void * fusion_median_wthread(void *); void * fusion_smooth_wthread(void *); void * fusion_KH_wthread(void *); get_edit_pixels_init(NSMP,1); // initz. pixel loop do_wthreads(fusion_median_wthread,NSMP); // process pixels PXM_copy(E3pxm,E8pxm); // E3 (output) --> E8 (input for next) get_edit_pixels_init(NSMP,1); // initz. pixel loop do_wthreads(fusion_smooth_wthread,NSMP); // process pixels PXM_copy(E3pxm,E8pxm); // E3 (output) --> E8 (input for next) get_edit_pixels_init(NSMP,1); // initz. pixel loop do_wthreads(fusion_KH_wthread,NSMP); // process pixels PXM_copy(E3pxm,E8pxm); // E3 (output) --> E8 (input for next) return 0; } // pixel RGB = median RGB fof 8 neighbor pixels void * fusion_median_wthread(void *arg) { int index = *((int *) arg); int ii, rgb, Fend; int px, py, dx, dy; int nc = E3pxm->nc; float *pix8, *pix3, *pixN, pix9[3]; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float blend, median; int16 rgbhist[256]; int rgbsum; while (true) { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix8 = PXMpix(E8pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix9[0] = pix8[0]; G1 = pix9[1] = pix8[1]; B1 = pix9[2] = pix8[2]; R3 = pix3[0]; G3 = pix3[1]; B3 = pix3[2]; for (rgb = 0; rgb < 3; rgb++) // loop all RGB colors { memset(rgbhist,0,256*sizeof(int16)); // clear rgb histogram rgbsum = 0; for (dy = -1; dy <= 1; dy++) // loop surrounding pixels for (dx = -1; dx <= 1; dx++) // get RGB values { pixN = pix8 + (dy * Eww + dx) * nc; // make histogram of RGB values ii = pixN[rgb]; rgbhist[ii]++; } for (ii = 0; ii < 256; ii++) // sum histogram from 0 to 255 { rgbsum += rgbhist[ii]; // break when half of RGB values if (rgbsum > 4) break; // have been counted } median = ii; pix9[rgb] = median; // pixel rgb = median } R9 = pix9[0]; G9 = pix9[1]; B9 = pix9[2]; R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; } return 0; } // pixel RGB = mean of two best-match opposing neighbors void * fusion_smooth_wthread(void *arg) { int index = *((int *) arg); int Fend, rgb; int px, py, px1, py1, px2, py2; float *pix8, *pix3; float *pixA, *pixB; float *pix91, *pix92, pix9[3]; float blend; int bmpx, bmpy; float diffA, diffB, diffAB, mindiff, mrgb; while (true) // loop all image pixels { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix8 = PXMpix(E8pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel for (rgb = 0; rgb < 3; rgb++) // loop each RGB color { mindiff = 999; // remember best matching pixel pair bmpx = bmpy = 0; py1 = -1; // py1 = top row py2 = +1; // py2 = bottom row for (px1 = -1; px1 <= +1; px1++) // px1/py1 = top row pixel { px2 = -px1; // px2/py2 = opposite bottom row pixel pixA = PXMpix(E8pxm,px+px1,py+py1); // top row pixel pixB = PXMpix(E8pxm,px+px2,py+py2); // bottom row pixel diffA = fabsf(pixA[rgb] - pix8[rgb]); // diff from pix8 diffB = fabsf(pixB[rgb] - pix8[rgb]); // diff from pix8 diffAB = diffA + diffB; // match both with px/py if (diffAB < mindiff) { mindiff = diffAB; // remember best match bmpx = px1; bmpy = py1; } } px1 = -1; // px1 = left col px2 = +1; // px2 = right col py1 = py2 = 0; pixA = PXMpix(E8pxm,px+px1,py+py1); // left col pixel pixB = PXMpix(E8pxm,px+px2,py+py2); // right col pixel diffA = fabsf(pixA[rgb] - pix8[rgb]); // diff from pix8 diffB = fabsf(pixB[rgb] - pix8[rgb]); // diff from pix8 diffAB = diffA + diffB; // match both with px/py if (diffAB < mindiff) { mindiff = diffAB; // remember best match bmpx = px1; bmpy = py1; } px1 = bmpx; // best matching pixel pair py1 = bmpy; // (relative to px/py) px2 = -px1; py2 = -py1; px1 += px; // absolute values py1 += py; px2 += px; py2 += py; pix91 = PXMpix(E8pxm,px1,py1); // opposing pixel pair pix92 = PXMpix(E8pxm,px2,py2); mrgb = 0.5 * (pix91[rgb] + pix92[rgb]); // mean RGB value pix9[rgb] = mrgb; // rgb = mean pix3[rgb] = blend * pix9[rgb] + (1-blend) * pix8[rgb]; // output pixel } } return 0; } // pixel RGB = neighbor pixel with least variance of neighborhood (Kuwahara sharpen) void * fusion_KH_wthread(void *arg) { float *pix8, *pix3; int px, py, qx, qy, rx, ry, Fend; float red, green, blue, red2, green2, blue2; float vmin, vall, vred, vgreen, vblue; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float blend; int index = *((int *) arg); while (true) { Fend = get_edit_pixels(index,px,py,blend); if (Fend) return 0; if (blend == 0) continue; pix8 = PXMpix(E8pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = R9 = pix8[0]; // input image RGB values G1 = G9 = pix8[1]; B1 = B9 = pix8[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; vmin = 99999; R9 = G9 = B9 = 0; for (qy = py-1; qy <= py; qy++) // loop all surrounding neighborhoods for (qx = px-1; qx <= px; qx++) { red = green = blue = 0; red2 = green2 = blue2 = 0; for (ry = qy; ry <= qy+1; ry++) // loop all pixels in neighborhood for (rx = qx; rx <= qx+1; rx++) { pix8 = PXMpix(E8pxm,rx,ry); red += pix8[0]; // compute mean RGB and mean RGB**2 red2 += pix8[0] * pix8[0]; green += pix8[1]; green2 += pix8[1] * pix8[1]; blue += pix8[2]; blue2 += pix8[2] * pix8[2]; } red = red / 4; // mean RGB of neighborhood green = green / 4; blue = blue / 4; vred = red2 / 4 - red * red; // variance RGB vgreen = green2 / 4 - green * green; vblue = blue2 / 4 - blue * blue; vall = vred + vgreen + vblue; // save RGB values with least variance if (vall < vmin) { vmin = vall; R9 = red; G9 = green; B9 = blue; } } R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // pattern menu function // tile the image with a repeating pattern namespace patternnames { editfunc EFpattern; // edit function data ch *pattfile = 0; // pattern image file PIXBUF *pixbuf = 0; // pattern pixbuf int pattww, patthh, pattrs; // pixbuf length, width, row stride uint8 *pixels; // pixbuf pixels int olapww = 0, olaphh = 0; // pattern overlap int opacity = 0; // pattern opacity 0-100 int contrast = 100; // pattern contrast 0-200 float zoom = 1.0; // pattern magnification int Fgray = 0; // grayscale = no } // menu function void m_pattern(GtkWidget *, ch *menu) { using namespace patternnames; int pattern_dialog_event(zdialog* zd, ch *event); zdialog *zd; F1_help_topic = TX("PATTERN"); printf("m_pattern \n"); EFpattern.menuname = "Pattern"; EFpattern.menufunc = m_pattern; EFpattern.Farea = 2; // select area OK EFpattern.Fscript = 1; // scripting supported if (! edit_setup(EFpattern)) return; // setup edit /*** _______________________________________________ | Background Pattern | | | | Pattern File [____________________] [Browse] | | Zoom [___] Geometry [Calculate] | | Pattern Width NNN Height NNN | // labels not spin buttons | Overlap Width [___] Height [___] | | Opacity [___] Contrast [___] [x] Grayscale | | | | [OK] [X] | |_______________________________________________| ***/ zd = zdialog_new(TX("Background Pattern"),Mwin,"OK","X",null); CEF->zd = zd; zdialog_add_widget(zd,"hbox","hbfile","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labfile","hbfile",TX("Pattern File:"),"space=5"); zdialog_add_widget(zd,"zentry","pattfile","hbfile",0,"expand"); zdialog_add_widget(zd,"button","browse","hbfile",TX("Browse"),"space=5"); zdialog_add_widget(zd,"hbox","hbcalc","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labzoom","hbcalc",TX("Zoom"),"space=5"); zdialog_add_widget(zd,"zspin","zoom","hbcalc","0.1|5.0|0.01|1.0"); zdialog_add_widget(zd,"label","space","hbcalc",0,"space=10"); zdialog_add_widget(zd,"zbutton","calc","hbcalc",TX("Calculate Geometry"),"space=3"); zdialog_add_widget(zd,"hbox","hbs11","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labpattw","hbs11",TX("Pattern Width"),"space=5"); zdialog_add_widget(zd,"label","pattww","hbs11","tbd","space=5"); zdialog_add_widget(zd,"label","space","hbs11",0,"space=10"); zdialog_add_widget(zd,"label","labheight","hbs11",TX("Height"),"space=3"); zdialog_add_widget(zd,"label","patthh","hbs11","tbd","space=5"); zdialog_add_widget(zd,"hbox","hbs12","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labover","hbs12",TX("Overlap"),"space=5"); zdialog_add_widget(zd,"label","labwidth","hbs12",TX("Width"),"space=3"); zdialog_add_widget(zd,"zspin","olapww","hbs12","0|1000|1|0"); zdialog_add_widget(zd,"label","space","hbs12",0,"space=10"); zdialog_add_widget(zd,"label","labheight","hbs12",TX("Height"),"space=3"); zdialog_add_widget(zd,"zspin","olaphh","hbs12","0|1000|1|0"); zdialog_add_widget(zd,"hbox","hbopac","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labopac","hbopac",TX("Opacity"),"space=5"); zdialog_add_widget(zd,"zspin","opacity","hbopac","0|100|1|0"); zdialog_add_widget(zd,"label","space","hbopac",0,"space=10"); zdialog_add_widget(zd,"label","labcont","hbopac",TX("Contrast"),"space=5"); zdialog_add_widget(zd,"zspin","contrast","hbopac","0|200|1|100"); zdialog_add_widget(zd,"label","space","hbopac",0,"space=10"); zdialog_add_widget(zd,"check","gray","hbopac",TX("Grayscale")); zdialog_load_inputs(zd); // restore previous inputs zdialog_run(zd,pattern_dialog_event,"save"); // run dialog - parallel zdialog_send_event(zd,"init"); // initialize return; } // pattern dialog event and completion function int pattern_dialog_event(zdialog *zd, ch *event) // dialog changes --> instant update 26.2 { using namespace patternnames; void pattern_match(); void pattern_image(); ch temp1[150], temp2[200]; ch *file, *pp; PIXBUF *pixbuf2; GError *gerror = 0; if (strmatch(event,"focus")) return 1; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (strmatch(event,"apply")) zd->zstat = 1; // from script if (zd->zstat) { if (zd->zstat == 1) edit_done(0); // [OK] commit edit else edit_cancel(0); // discard edit if (pixbuf) g_object_unref(pixbuf); // free memory pixbuf = 0; if (pattfile) zfree(pattfile); pattfile = 0; return 1; } zdialog_fetch(zd,"olapww",olapww); zdialog_fetch(zd,"olaphh",olaphh); zdialog_fetch(zd,"zoom",zoom); zdialog_fetch(zd,"opacity",opacity); zdialog_fetch(zd,"contrast",contrast); if (strmatch(event,"init")) { if (pattfile) zfree(pattfile); pattfile = 0; if (pixbuf) g_object_unref(pixbuf); pixbuf = 0; zdialog_fetch(zd,"pattfile",temp1,150); // get prior pattern file if (*temp1 > ' ') { snprintf(temp2,200,"%s/%s",pattern_folder,temp1); pattfile = zstrdup(temp2,"pattern"); } zdialog_stuff(zd,"gray",0); // grayscale off Fgray = 0; } if (strmatch(event,"gray")) zdialog_fetch(zd,"gray",Fgray); if (strmatch(event,"browse")) // choose new pattern file { if (pattfile) pp = pattfile; else pp = pattern_folder; file = select_1file(pp); // use thumbnail selection if (! file) return 1; if (pattfile) zfree(pattfile); pattfile = file; pp = strrchr(pattfile,'/'); // update dialog if (pp) zdialog_stuff(zd,"pattfile",pp+1); olapww = olaphh = 0; // reset zoom, overlaps zoom = 1; } if (zstrstr("init browse",event)) // open pattern file { if (! pattfile) return 1; if (pixbuf) g_object_unref(pixbuf); pixbuf = gdk_pixbuf_new_from_file(pattfile,&gerror); // create pixbuf image if (! pixbuf) { zmessageACK(Mwin,TX("bad pattern file: %s"),pattfile); // not an image file zfree(pattfile); pattfile = 0; return 1; } if (! strstr(pattfile,pattern_folder)) // add pattern to folder if needed cp_copy(pattfile,pattern_folder); pixbuf2 = gdk_pixbuf_stripalpha(pixbuf); // strip alpha channel if present if (pixbuf2) { g_object_unref(pixbuf); pixbuf = pixbuf2; } pattrs = gdk_pixbuf_get_rowstride(pixbuf); // row stride pixels = gdk_pixbuf_get_pixels(pixbuf); // image data (pixels) } if (! pixbuf) { printf("error, no pixbuf \n"); // continuation pointless return 1; } pattww = gdk_pixbuf_get_width(pixbuf); // pixbuf dimensions patthh = gdk_pixbuf_get_height(pixbuf); if (strmatch(event,"calc")) { // find pattern dimensions automatically pattern_match(); olapww = olaphh = 0; // reset overlaps } if (zstrstr("zoom init",event)) // set pattern zoom level { g_object_unref(pixbuf); pixbuf = gdk_pixbuf_new_from_file(pattfile,&gerror); // refresh pixbuf at scale 1x if (! pixbuf) { zmessageACK(Mwin,"%s \n %s",pattfile,gerror->message); return 1; } pixbuf2 = gdk_pixbuf_stripalpha(pixbuf); // strip alpha channel if present if (pixbuf2) { g_object_unref(pixbuf); pixbuf = pixbuf2; } pattww = gdk_pixbuf_get_width(pixbuf); // pixbuf dimensions patthh = gdk_pixbuf_get_height(pixbuf); pattww = pattww * zoom; // new dimensions patthh = patthh * zoom; pixbuf2 = gdk_pixbuf_scale_simple(pixbuf,pattww,patthh,BILINEAR); g_object_unref(pixbuf); // replace original pixbuf pixbuf = pixbuf2; if (! pixbuf) { zmessageACK(Mwin,"%s \n %s",pattfile,gerror->message); return 1; } pattww = gdk_pixbuf_get_width(pixbuf); // new pixbuf dimensions patthh = gdk_pixbuf_get_height(pixbuf); pattrs = gdk_pixbuf_get_rowstride(pixbuf); // row stride pixels = gdk_pixbuf_get_pixels(pixbuf); // image data (pixels) } if (olapww > pattww/3) olapww = pattww/3; // prevent nonsense if (olaphh > patthh/3) olaphh = patthh/3; zdialog_stuff(zd,"pattww",pattww); // update dialog zdialog_stuff(zd,"patthh",patthh); zdialog_stuff(zd,"olapww",olapww); zdialog_stuff(zd,"olaphh",olaphh); zdialog_stuff(zd,"zoom",zoom); pattern_image(); // calculate image + pattern CEF->Fmods = 1; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); // update window return 1; } // set tile dimensions to match the pitch of a repeating pattern void pattern_match() { using namespace patternnames; int limx, limy; int px, py, qx, qy, sx, sy; int64 diff, mindiff; uint8 *pix1, *pix2; limx = pattww / 2; limy = patthh / 2; if (limx < 21 || limy < 21) return; sx = sy = 1; // best origin found mindiff = 99999999999; // best pixel difference found for (px = 20; px < limx; px++) // loop all possible pattern origins for (py = 20; py < limy; py++) // (pattern must be > 20 x 20) { diff = 0; for (qy = py; qy < py + limy; qy++) // match vert. lines from (1,1) and (px,py) { pix1 = pixels + (1+qy-py) * pattrs + 1 * 3; // line from (1,1) pix2 = pixels + qy * pattrs + px * 3; // line from (qx,qy) diff += abs(pix1[0] - pix2[0]) + abs(pix1[1] - pix2[1]) + abs(pix1[2] - pix2[2]); } for (qx = px; qx < px + limx; qx++) // match horz. lines from (1,1) and (px,py) { pix1 = pixels + 1 * pattrs + (1+qx-px) * 3; // line from (1,1) pix2 = pixels + py * pattrs + qx * 3; // line from (qx,qy) diff += abs(pix1[0] - pix2[0]) + abs(pix1[1] - pix2[1]) + abs(pix1[2] - pix2[2]); } if (diff < mindiff) { // save best match found mindiff = diff; sx = px; // pattern origin sy = py; } } pattww = 2 * (sx - 1); // set width, height to match patthh = 2 * (sy - 1); // pattern size return; } // combine image and pattern void pattern_image() { using namespace patternnames; ch *tmap; // maps tiles overlapping image pixel int ii, cc, dist; int tcol, trow, Ntcols, Ntrows; // tile columns and rows int pww, phh, prs; // pattern/tile dimensions int mpx, mpy, tpx, tpy; int R, G, B; uint8 *pixt; float *pix1, *pix3; float pbrite, f1, f2; double mbrite = 0; float *tbmap; pww = pattww; // capture and freeze volatile params phh = patthh; prs = pattrs; cc = Eww * Ehh; // tile pixels mapping to image pixel tmap = (ch *) zmalloc(cc,"pattern"); cc = pww * phh * sizeof(float); // tile brightness map tbmap = (float *) zmalloc(cc,"pattern"); for (mpy = 0; mpy < Ehh; mpy++) // clear output image to black for (mpx = 0; mpx < Eww; mpx++) { pix3 = PXMpix(E3pxm,mpx,mpy); pix3[0] = pix3[1] = pix3[2] = 0; } Ntrows = Ehh / (phh-2*olaphh) + 1; // tile rows and columns including Ntcols = Eww / (pww-2*olapww) + 1; // top/bottom and left/right overlaps for (trow = 0; trow < Ntrows; trow++) // loop tile rows, columns for (tcol = 0; tcol < Ntcols; tcol++) { for (tpy = 0; tpy < phh; tpy++) // loop tile pixels for (tpx = 0; tpx < pww; tpx++) { mpy = trow * (phh-2*olaphh) + tpy; // corresponding image pixel mpx = tcol * (pww-2*olapww) + tpx; if (mpy >= Ehh || mpx >= Eww) continue; ii = mpy * Eww + mpx; // count tile pixels overlapping ++tmap[ii]; // this image pixel } } for (trow = 0; trow < Ntrows; trow++) // loop tile rows, columns for (tcol = 0; tcol < Ntcols; tcol++) { for (tpy = 0; tpy < phh; tpy++) // loop tile pixels for (tpx = 0; tpx < pww; tpx++) { mpy = trow * (phh-2*olaphh) + tpy; // corresponding image pixel mpx = tcol * (pww-2*olapww) + tpx; if (mpy >= Ehh || mpx >= Eww) continue; ii = mpy * Eww + mpx; pixt = pixels + tpy * prs + tpx * 3; // input tile pixel R = pixt[0]; G = pixt[1]; B = pixt[2]; if (Fgray) R = G = B = 0.333 * (R + G + B); // convert to grayscale pix3 = PXMpix(E3pxm,mpx,mpy); // output image pixel pix3[0] += (0.01 * opacity / tmap[ii]) * R; // image = tile * opacity 0-100% pix3[1] += (0.01 * opacity / tmap[ii]) * G; // reduce for overlapping tiles pix3[2] += (0.01 * opacity / tmap[ii]) * B; } } for (mpy = 0; mpy < Ehh; mpy++) // loop image pixels for (mpx = 0; mpx < Eww; mpx++) { pix1 = PXMpix(E1pxm,mpx,mpy); // input image pixel pix3 = PXMpix(E3pxm,mpx,mpy); // output image pixel pix3[0] += (1.0 - 0.01 * opacity) * pix1[0]; // add input pixel to output, pix3[1] += (1.0 - 0.01 * opacity) * pix1[1]; // part not taken by tiles pix3[2] += (1.0 - 0.01 * opacity) * pix1[2]; } for (tpy = 0; tpy < phh; tpy++) // loop tile pixels for (tpx = 0; tpx < pww; tpx++) { pixt = pixels + tpy * prs + tpx * 3; mbrite += pixt[0] + pixt[1] + pixt[2]; // sum of all pixel RGB values } mbrite = mbrite / (phh * pww); // mean RGB sum for all tile pixels for (tpy = 0; tpy < phh; tpy++) // loop tile pixels for (tpx = 0; tpx < pww; tpx++) { pixt = pixels + tpy * prs + tpx * 3; pbrite = pixt[0] + pixt[1] + pixt[2]; pbrite = pbrite / mbrite; // pixel relative brightness 0...2 ii = tpy * pww + tpx; tbmap[ii] = pbrite; } for (trow = 0; trow < Ntrows; trow++) // loop tile rows, columns for (tcol = 0; tcol < Ntcols; tcol++) { for (tpy = 0; tpy < phh; tpy++) // loop tile pixels for (tpx = 0; tpx < pww; tpx++) { mpy = trow * (phh-2*olaphh) + tpy; // corresponding image pixel mpx = tcol * (pww-2*olapww) + tpx; if (mpy >= Ehh || mpx >= Eww) continue; pix3 = PXMpix(E3pxm,mpx,mpy); ii = tpy * pww + tpx; pbrite = tbmap[ii]; // tile pixel rel. brightness 0...2 ii = mpy * Eww + mpx; if (tmap[ii] > 1) // if 2+ tile pixels map to image pixel pbrite = (pbrite - 1.0) / tmap[ii] + 1.0; // reduce impact of each pbrite = 0.01 * contrast * (pbrite - 1.0) + 1.0; // apply contrast factor 0-100% pix3[0] *= pbrite; pix3[1] *= pbrite; pix3[2] *= pbrite; } } for (mpy = 0; mpy < Ehh; mpy++) // stop RGB overflows for (mpx = 0; mpx < Eww; mpx++) { pix3 = PXMpix(E3pxm,mpx,mpy); RGBfix(pix3[0],pix3[1],pix3[2]); } if (sa_stat == sa_stat_fini) // select area active { for (mpy = 0; mpy < Ehh; mpy++) // loop image pixels for (mpx = 0; mpx < Eww; mpx++) { ii = mpy * Eww + mpx; dist = sa_pixmap[ii]; // distance from edge if (dist) f1 = 1.0; // pixel inside area else f1 = 0.0; // pixel outside area f2 = 1.0 - f1; pix1 = PXMpix(E1pxm,mpx,mpy); // input image pixel pix3 = PXMpix(E3pxm,mpx,mpy); // output image pixel pix3[0] = f1 * pix3[0] + f2 * pix1[0]; pix3[1] = f1 * pix3[1] + f2 * pix1[1]; pix3[2] = f1 * pix3[2] + f2 * pix1[2]; } } return; } /**************************************************************************************/ // convert an image into a drawing, using a crosshatch pattern (#) for shading namespace crosshatch_names { editfunc EFcrosshatch; int GZ; // user input, grid size int GZx = 6; // internal grid size int8 *GM; // crosshatch grid map } // menu function void m_crosshatch(GtkWidget *, ch *menu) // 26.0 { using namespace crosshatch_names; int crosshatch_dialog_event(zdialog* zd, ch *event); void * crosshatch_thread(void *); printf("m_crosshatch \n"); F1_help_topic = TX("CROSSHATCH"); EFcrosshatch.menuname = "Crosshatch"; EFcrosshatch.menufunc = m_crosshatch; EFcrosshatch.threadfunc = crosshatch_thread; if (! edit_setup(EFcrosshatch)) return; // setup edit GM = (int8 *) zmalloc(Eww * Ehh * sizeof(int8),"crosshatch"); // allocate grid map /*** _____________________________ | Crosshatch Sketch | | | | grid size [___] | | | | [Reset] [Apply] [OK] [X] | |_____________________________| ***/ zdialog *zd = zdialog_new(TX("Crosshatch Sketch"),Mwin,TX("Reset"),TX("Apply"),"OK","X",null); EFcrosshatch.zd = zd; zdialog_add_widget(zd,"hbox","hbgz","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labgrid","hbgz",TX("grid size")); zdialog_add_widget(zd,"zspin","GZ","hbgz","6|99|1|6"); // low limit = GZx GZ = GZx; // initial grid value zdialog_resize(zd,400,0); zdialog_run(zd,crosshatch_dialog_event); // run dialog - parallel return; } // dialog event and completion callback function int crosshatch_dialog_event(zdialog *zd, ch *event) { using namespace crosshatch_names; int cc, Fapply = 0; int px, py, ii; int Ewwx = 0, Ehhx = 0; PXM *pxmx; if (strmatch(event,"done")) zd->zstat = 3; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 4; // cancel if (strmatch(event,"apply")) Fapply = 1; // from script if (strmatch(event,"paint")) Fapply = 1; // mouse paint if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active edit_reset(); return 1; } if (zd->zstat == 2) // [apply] { zd->zstat = 0; Fapply = 1; } if (zd->zstat == 3) // [OK] { if (CEF->Fmods) edit_done(0); // complete edit else edit_cancel(0); // no change zfree(GM); return 1; } if (zd->zstat < 0 || zd->zstat > 3) { // cancel edit_cancel(0); zfree(GM); return 1; } if (strmatch(event,"GZ")) { // new grid size zdialog_fetch(zd,"GZ",GZ); } if (Fapply) { edit_reset(); if (GZ > GZx) { Ewwx = Eww; // save org. size Ehhx = Ehh; Eww = Eww * 1.0 * GZx / GZ; // downsize E3 Ehh = Ehh * 1.0 * GZx / GZ; PXM_free(E3pxm); E3pxm = PXM_rescale(E1pxm,Eww,Ehh); } cc = Eww * Ehh * sizeof(int8); // clear grid map memset(GM,0,cc); for (py = 0; py < Ehh; py++) // mark grid map pixels, '/' lines for (px = py - py/GZx*GZx; px < Eww; px += GZx) { // 0, 1, 2 ... GZ-1, 0, 1, 2 ... ii = py * Eww + px; GM[ii] = 1; } for (py = 0; py < Ehh; py++) // mark grid map pixels, '\' lines for (px = GZx - (py - py/GZx*GZx); px < Eww; px += GZx) { // GZ, GZ-1, GZ-2 ... 0, GZ, GZ-1, GZ-2 ... ii = py * Eww + px; GM[ii] = 1; } thread_signal(); // update the image thread_wait(); if (GZ > GZx) { Eww = Ewwx; // restore original size Ehh = Ehhx; pxmx = PXM_rescale(E3pxm,Eww,Ehh); PXM_free(E3pxm); E3pxm = pxmx; } } CEF->Fmods++; // image3 modified CEF->Fsaved = 0; Fpaint2(); // update window return 1; } // thread function void * crosshatch_thread(void *arg) { using namespace crosshatch_names; int px, py, qx, qy, rx, ry; int ii, dist; float *pix31, *pix32; float R31, G31, B31, R32, G32, B32; float max; for (py = 0; py < Ehh; py++) // loop all image pixels for (px = 0; px < Eww; px++) { if (Fescape) break; // user kill if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // outside area } ii = py * Eww + px; if (! GM[ii]) continue; // skip unmarked pixel pix31 = PXMpix(E3pxm,px,py); // RGB source pixel R31 = pix31[0]; G31 = pix31[1]; B31 = pix31[2]; for (dist = 1; dist < GZx; dist++) // search for RGB destination pixel { // in order of increasing distance if (R31 + G31 + B31 < 1) break; // source pixel is empty for (qy = -dist; qy <= +dist; qy++) for (qx = -dist; qx <= +dist; qx++) { if (R31 + G31 + B31 < 1) break; // source pixel is empty if (abs(qx) != dist && abs(qy) != dist) continue; rx = px + qx; // pixel at distance 'dist' from px/py ry = py + qy; if (rx < 0 || rx > Eww-1) continue; // off the image edge if (ry < 0 || ry > Ehh-1) continue; ii = ry * Eww + rx; if (GM[ii]) continue; // skip marked pixel pix32 = PXMpix(E3pxm,rx,ry); // potential RGB destination pixel R32 = pix32[0]; G32 = pix32[1]; B32 = pix32[2]; if (R32 >= 255 && G32 >= 255 && B32 >= 255) continue; // pixel is full max = R31; // move as much RGB as possible if (255 - R32 < max) max = 255 - R32; // from source to destination pixel R31 -= max; R32 += max; max = G31; if (255 - G32 < max) max = 255 - G32; G31 -= max; G32 += max; max = B31; if (255 - B32 < max) max = 255 - B32; B31 -= max; B32 += max; pix31[0] = R31; // update pixel RGB values pix31[1] = G31; pix31[2] = B31; pix32[0] = R32; pix32[1] = G32; pix32[2] = B32; } } } return 0; } /**************************************************************************************/ // Dither menu, incorporating dither0, dither1, dither2, dither3 void m_dither(GtkWidget *, ch *menu) { int dither_dialog_event(zdialog *zd, ch *event); zdialog *zd; F1_help_topic = TX("DITHER"); printf("m_dither \n"); if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } viewmode('F'); /*** ____________________________________________ | Dither Image | | | | [Dither0] Roy Lichtenstein effect | | [Dither1] pure RGB or black/white dots | | [Dither2] RGB mix with given bit-depth | | [Dither3] use custom color palette | | [Dither4] condense into color blobs | | | | [X] | |____________________________________________| ***/ zd = zdialog_new(TX("Dither Image"),Mwin,"X",null); zdialog_add_widget(zd,"hbox","hb0","dialog"); zdialog_add_widget(zd,"button","dither0","hb0",TX("Dither0"),"space=3"); zdialog_add_widget(zd,"label","lab0","hb0",TX("Roy Lichtenstein effect"),"space=3"); zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"button","dither1","hb1",TX("Dither1"),"space=3"); zdialog_add_widget(zd,"label","lab1","hb1",TX("pure RGB or black/white dots"),"space=3"); zdialog_add_widget(zd,"hbox","hb2","dialog"); zdialog_add_widget(zd,"button","dither2","hb2",TX("Dither2"),"space=3"); zdialog_add_widget(zd,"label","lab2","hb2",TX("RGB mix with given bit-depth"),"space=3"); zdialog_add_widget(zd,"hbox","hb3","dialog"); zdialog_add_widget(zd,"button","dither3","hb3",TX("Dither3"),"space=3"); zdialog_add_widget(zd,"label","lab3","hb3",TX("use custom color palette"),"space=3"); zdialog_add_widget(zd,"hbox","hb4","dialog"); zdialog_add_widget(zd,"button","dither4","hb4",TX("Dither4"),"space=3"); zdialog_add_widget(zd,"label","lab4","hb4",TX("condense into color blobs"),"space=3"); zdialog_run(zd,dither_dialog_event,"save"); return; } // dialog event and completion function int dither_dialog_event(zdialog *zd, ch *event) { if (zd->zstat) { // done or [x] zdialog_free(zd); // kill dialog return 1; } if (! zstrstr(event,"dither")) return 1; // ignore other events if (strmatch(event,"dither0")) m_dither0(0,0); if (strmatch(event,"dither1")) m_dither1(0,0); if (strmatch(event,"dither2")) m_dither2(0,0); if (strmatch(event,"dither3")) m_dither3(0,0); if (strmatch(event,"dither4")) m_dither4(0,0); zdialog_free(zd); return 1; } /**************************************************************************************/ // convert image to dot grid (like Roy Lichtenstein) namespace dither0_names { int dot_size; // tile size enclosing dots editfunc EFdither0; } void m_dither0(GtkWidget *, ch *menu) { using namespace dither0_names; int dither0_dialog_event(zdialog *zd, ch *event); void * dither0_thread(void *); F1_help_topic = TX("DITHER"); printf("m_dither0 \n"); EFdither0.menuname = "dither0"; EFdither0.menufunc = m_dither0; EFdither0.Farea = 2; // select area usable EFdither0.Fscript = 1; // scripting supported EFdither0.threadfunc = dither0_thread; // thread function if (! edit_setup(EFdither0)) return; // setup edit /** __________________________ | Roy Lichtenstein | | | | dot size [ 12 ] | | | | [Apply] [OK] [X] | |__________________________| **/ zdialog *zd = zdialog_new("Roy Lichtenstein",Mwin,TX("Apply"),"OK","X",null); EFdither0.zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labt","hb1",TX("dot size"),"space=5"); zdialog_add_widget(zd,"zspin","size","hb1","4|99|1|9","space=5|size=3"); dot_size = 9; zdialog_run(zd,dither0_dialog_event,"save"); // run dialog, parallel return; } // dialog event and completion callback function int dither0_dialog_event(zdialog * zd, ch *event) { using namespace dither0_names; if (strmatch(event,"focus")) return 1; if (strmatch(event,"apply")) zd->zstat = 1; // from script if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (zd->zstat) { if (zd->zstat == 1) { // apply zd->zstat = 0; // keep dialog active zdialog_fetch(zd,"size",dot_size); // get dot size thread_signal(); // trigger working thread return 1; } else if (zd->zstat == 2) { // commit edit edit_addhist("dot size:%d",dot_size); // edit parms > edit hist edit_done(0); } else edit_cancel(0); // discard edit return 1; } return 1; } // image dither0 thread function void * dither0_thread(void *) { using namespace dither0_names; int ds, ii, sumpix; int dist, shift1, shift2; int px, py, px1, px2, py1, py2; int qx, qy, qx1, qx2, qy1, qy2; float *pix1, *pix3; float red, green, blue, maxrgb; float relmax, radius, radius2a, radius2b, f1; float fpi = 1.0 / 3.14159; float dcx, dcy, qcx, qcy, qrad2; int nc = E3pxm->nc; ds = dot_size; // dot size and tile size for (py = 0; py < Ehh; py++) // set image to black for (px = 0; px < Eww; px++) { // not alpha channel pix3 = PXMpix(E3pxm,px,py); pix3[0] = pix3[1] = pix3[2] = 0; } px1 = 0; // limits for tiles px2 = Eww - ds; py1 = 0; py2 = Ehh - ds; if (sa_stat == sa_stat_fini) { // reduce for active area px1 = sa_minx; px2 = sa_maxx; py1 = sa_miny; py2 = sa_maxy; if (px2 > Eww - ds) px2 = Eww - ds; if (py2 > Ehh - ds) py2 = Ehh - ds; } shift1 = 0; for (py = py1; py < py2; py += ds) // loop all tiles in input image { shift1 = 1 - shift1; // offset alternate rows shift2 = 0.5 * shift1 * ds; for (px = px1 + shift2; px < px2; px += ds) { sumpix = red = green = blue = 0; for (qy = py; qy < py + ds; qy++) // loop all pixels in tile for (qx = px; qx < px + ds; qx++) // get mean RGB levels for tile { pix1 = PXMpix(E1pxm,qx,qy); red += pix1[0]; green += pix1[1]; blue += pix1[2]; sumpix++; } red = red / sumpix; // mean RGB levels, 0 to 255.9 green = green / sumpix; blue = blue / sumpix; maxrgb = red; // max. mean RGB level, 0 to 255.9 if (green > maxrgb) maxrgb = green; if (blue > maxrgb) maxrgb = blue; relmax = maxrgb / 256.0; // max. RGB as 0 to 0.999 relmax = pow(relmax,1.6); // improve contrast radius = ds * sqrt(fpi * relmax); // radius of dot with maximized color radius = radius * 0.9; // deliberate reduction if (radius < 0.5) continue; // tiny - leave tile black red = 255.9 * red / maxrgb; // dot color, maximized green = 255.9 * green / maxrgb; blue = 255.9 * blue / maxrgb; dcx = px + 0.5 * ds; // center of dot / tile dcy = py + 0.5 * ds; qx1 = dcx - radius; // pixels within dot radius of center qx2 = dcx + radius; qy1 = dcy - radius; qy2 = dcy + radius; radius2a = (radius + 0.5) * (radius + 0.5); radius2b = (radius - 0.5) * (radius - 0.5); for (qy = qy1; qy <= qy2; qy++) // loop all pixels within dot radius for (qx = qx1; qx <= qx2; qx++) { qcx = qx + 0.5; // center of pixel qcy = qy + 0.5; qrad2 = (qcx-dcx)*(qcx-dcx) + (qcy-dcy)*(qcy-dcy); // pixel distance**2 from center of dot if (qrad2 > radius2a) f1 = 0.0; // pixel outside dot, no color else if (qrad2 < radius2b) f1 = 1.0; // pixel inside dot, full color else f1 = radius + 0.5 - sqrtf(qrad2); // pixel straddles edge, some color pix3 = PXMpix(E3pxm,qx,qy); pix3[0] = f1 * red; pix3[1] = f1 * green; pix3[2] = f1 * blue; } } } if (sa_stat == sa_stat_fini) // select area active { pix1 = E1pxm->pixels; pix3 = E3pxm->pixels; for (ii = 0; ii < Eww * Ehh; ii++) // loop all pixels { dist = sa_pixmap[ii]; if (dist == 0) // outside area memmove(pix3,pix1,3*sizeof(float)); // restore input pixel pix1 += nc; pix3 += nc; } } CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return 0; } /**************************************************************************************/ // Convert image into pure RGB or black/white dots, dithered to show other tones namespace dither1_names { editfunc EFdither1; int res, RGB, BW; int rpos; } // menu function void m_dither1(GtkWidget *, ch *menu) { using namespace dither1_names; int dither1_dialog_event(zdialog* zd, ch *event); void * dither1_thread(void *); F1_help_topic = TX("DITHER"); printf("m_dither1 \n"); EFdither1.menuname = "dither1"; EFdither1.menufunc = m_dither1; EFdither1.threadfunc = dither1_thread; // thread function EFdither1.Farea = 2; // select area usable EFdither1.Fscript = 1; // scripting supported if (! edit_setup(EFdither1)) return; // setup edit /*** __________________________ | Dither1 | | | | Resolution [ N ] | 2x2 to 30x30 // see Pflag dependency below | (o) RGB color | | (o) black/white | | [x] random position | | | | [Apply] [OK] [X] | |__________________________| ***/ zdialog *zd = zdialog_new(TX("Dither1"),Mwin,TX("Apply"),"OK","X",null); // dither1 dialog CEF->zd = zd; zdialog_add_widget(zd,"hbox","hbres","dialog"); zdialog_add_widget(zd,"label","labres","hbres",TX("Resolution"),"space=5"); zdialog_add_widget(zd,"zspin","res","hbres","2|30|1|4","space=5|size=3"); zdialog_add_widget(zd,"radio","RGB","dialog",TX("RGB color")); zdialog_add_widget(zd,"radio","B&W","dialog",TX("black/white")); zdialog_add_widget(zd,"check","rpos","dialog",TX("random position")); zdialog_stuff(zd,"RGB",1); zdialog_stuff(zd,"B&W",0); zdialog_stuff(zd,"rpos",0); zdialog_load_inputs(zd); // restore previous inputs zdialog_run(zd,dither1_dialog_event,"save"); // run dialog - parallel return; } // dither1 dialog event and completion function int dither1_dialog_event(zdialog *zd, ch *event) { using namespace dither1_names; if (strmatch(event,"apply")) zd->zstat = 1; // from script if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() zdialog_fetch(zd,"res",res); zdialog_fetch(zd,"RGB",RGB); zdialog_fetch(zd,"B&W",BW); zdialog_fetch(zd,"rpos",rpos); if (zd->zstat) { if (zd->zstat == 1) { // apply zd->zstat = 0; thread_signal(); } else if (zd->zstat == 2) { // done edit_addhist("res:%d RGB:%d B/W:%d rpos:%d",res,RGB,BW,rpos); // edit parms > edit hist edit_done(0); } else edit_cancel(0); // discard edit return 1; } return 1; } // thread function - multiple working threads to update image void * dither1_thread(void *) { using namespace dither1_names; void * dither1_wthread_RGB(void *arg); void * dither1_wthread_BW(void *arg); if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // initz. progress counter else progress_setgoal(Eww * Ehh); if (RGB) do_wthreads(dither1_wthread_RGB,NSMP); // do RGB worker threads if (BW) do_wthreads(dither1_wthread_BW,NSMP); // do B/W worker threads progress_setgoal(0); CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); // update window return 0; } // worker thread function for RGB dither1 void * dither1_wthread_RGB(void *arg) { using namespace dither1_names; int index = *((int *) arg); int px, py, qx, qy; int ii, jj, kk, dist = 1; int pixcc = 3 * sizeof(float); int res2 = res * res; ch Pflag[1000]; // max. res = 31 float *pix1, *pix3; float Rs, Gs, Bs, Rp, Gp, Bp; float maxrgb; int pskip = 0; pix3 = 0; // stop compiler 'uninitialized' kk = 0; // warnings for (py = index * res; py < Ehh - res; py += NSMP * res) // loop each pixel block for (px = 0; px < Eww - res; px += res) { if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // outside pixel } for (qy = py; qy < py + res; qy++) // set all output pixels in block for (qx = px; qx < px + res; qx++) // to RGB values 0/0/0 { pix3 = PXMpix(E3pxm,qx,qy); memset(pix3,0,pixcc); } Rs = Gs = Bs = 0; for (qy = py; qy < py + res; qy++) // get RGB sums for pixel block for (qx = px; qx < px + res; qx++) { pix1 = PXMpix(E1pxm,qx,qy); Rs += pix1[0]; Gs += pix1[1]; Bs += pix1[2]; } Rp = Rs / 256 / 3; // count of dithered pixels for block Gp = Gs / 256 / 3; // (single RGB value of 255) Bp = Bs / 256 / 3; memset(Pflag,0,res2); // reset pixel flags while (true) // distribute dithered pixels { if (Rp < 0.5 && Gp < 0.5 && Bp < 0.5) break; // nothing left to distribute ii = 0; // get greatest remaining if (Gp >= Rp && Gp >= Bp) ii = 1; // dithered pixel count if (Bp >= Rp && Bp >= Gp) ii = 2; if (ii == 0) Rp -= 1; // decrement dithered pixel count if (ii == 1) Gp -= 1; if (ii == 2) Bp -= 1; if (rpos) // use random position in block { kk = res2 * drandz(); // random initial search posn. for (jj = 0; jj < res2; jj++) // loop pixels in block { kk++; // next pixel if (kk == res2) kk = 0; if (! Pflag[kk]) break; // available } if (jj < res2) // found { Pflag[kk] = 1; // mark pixel as used qy = kk / res; // pixel within block qx = kk - res * qy; pix3 = PXMpix(E3pxm, px + qx, py + qy); // make into dithered pixel pix3[ii] = 255; } } else // use best match position in block { maxrgb = 0; for (jj = 0; jj < res2; jj++) // loop pixels in block { if (Pflag[jj]) continue; // pixel used already qy = jj / res; // pixel within block qx = jj - qy * res; pix1 = PXMpix(E1pxm, px + qx, py + qy); // find pixel with greatest if (pix1[ii] > maxrgb) { // matching RGB value maxrgb = pix1[ii]; kk = jj; } } if (maxrgb > 0) // found pixel { Pflag[kk] = 1; // mark pixel as used qy = kk / res; // matching pixel within block qx = kk - res * qy; pix3 = PXMpix(E3pxm, px + qx, py + qy); // make into dithered pixel pix3[ii] = 255; } } } if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; // exit thread } // worker thread function for black/white dither void * dither1_wthread_BW(void *arg) { using namespace dither1_names; int index = *((int *) arg); int px, py, qx, qy; int ii, jj, kk, dist = 1; int pixcc = 3 * sizeof(float); int res2 = res * res; ch Pflag[1000]; // max. res = 31 float *pix1, *pix3; float white[3] = { 255, 255, 255 }; float Nw, Nb, minrgb, pixrgb; int pskip = 0; pix3 = 0; // stop compiler 'uninitialized' kk = 0; // warnings for (py = index * res; py < Ehh - res; py += NSMP * res) // loop each pixel block for (px = 0; px < Eww - res; px += res) { if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // outside pixel } for (qy = py; qy < py + res; qy++) // set all output pixels in block for (qx = px; qx < px + res; qx++) // to RGB white { pix3 = PXMpix(E3pxm,qx,qy); memcpy(pix3,white,pixcc); } Nw = 0; for (qy = py; qy < py + res; qy++) // get RGB sum for pixel block for (qx = px; qx < px + res; qx++) { pix1 = PXMpix(E1pxm,qx,qy); Nw += pix1[0] + pix1[1] + pix1[2]; } Nw = Nw / 255 / 3; // white pixel count Nb = res2 - Nw; // black pixel count memset(Pflag,0,res2); // reset pixel flags while (true) // distribute black pixels { if (Nb < 0.5) break; // nothing left to distribute Nb -= 1; minrgb = 9999; if (rpos) // use random position in block { kk = res2 * drandz(); // random initial search posn. for (jj = 0; jj < res2; jj++) // loop pixels in block { kk++; // next pixel if (kk == res2) kk = 0; if (! Pflag[kk]) break; // available } if (jj < res2) // found { Pflag[kk] = 1; // mark pixel as used qy = kk / res; // pixel within block qx = kk - res * qy; pix3 = PXMpix(E3pxm, px + qx, py + qy); pix3[0] = pix3[1] = pix3[2] = 0; // make pixel black } } else // use best match position in block { for (jj = 0; jj < res2; jj++) // loop pixels in block { if (Pflag[jj]) continue; // pixel used already qy = jj / res; // pixel within block qx = jj - qy * res; pix1 = PXMpix(E1pxm, px + qx, py + qy); pixrgb = pix1[0] + pix1[1] + pix1[2]; // get pixel RGB sum if (pixrgb < minrgb) { minrgb = pixrgb; // remember pixel with lowest sum kk = jj; } } if (minrgb < 9999) // found pixel { Pflag[kk] = 1; // mark pixel as used qy = kk / res; // matching pixel within block qx = kk - res * qy; pix3 = PXMpix(E3pxm, px + qx, py + qy); pix3[0] = pix3[1] = pix3[2] = 0; // make pixel black } } } if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; // exit thread } /**************************************************************************************/ // Dither image using RGB colors and Floyd-Steinberg error distribution algorithm. namespace dither2_names { editfunc EFdither2; int res, res2, depth, comp; } // menu function void m_dither2(GtkWidget *, ch *menu) { using namespace dither2_names; int dither2_dialog_event(zdialog* zd, ch *event); void * dither2_thread(void *); F1_help_topic = TX("DITHER"); printf("m_dither2 \n"); EFdither2.menuname = "dither2"; EFdither2.menufunc = m_dither2; EFdither2.threadfunc = dither2_thread; // thread function EFdither2.Farea = 2; // select area usable EFdither2.Fscript = 1; // scripting supported if (! edit_setup(EFdither2)) return; // setup edit /*** __________________________ | Dither2 | | | | resolution [ N ] | 2x2 to 30x30 | color depth [ N ] | 1 to 8 bits | [x] error compensation | | | | [Apply] [OK] [X] | |__________________________| ***/ zdialog *zd = zdialog_new("Dither2",Mwin,TX("Apply"),"OK","X",null); // dither dialog CEF->zd = zd; zdialog_add_widget(zd,"hbox","hbres","dialog"); zdialog_add_widget(zd,"label","labres","hbres",TX("resolution"),"space=5"); zdialog_add_widget(zd,"zspin","res","hbres","2|30|1|4","space=5|size=3"); zdialog_add_widget(zd,"hbox","hbdep","dialog"); zdialog_add_widget(zd,"label","labdep","hbdep",TX("color depth"),"space=5"); zdialog_add_widget(zd,"zspin","depth","hbdep","1|8|1|2","space=5|size=2"); zdialog_add_widget(zd,"hbox","hbcomp","dialog"); zdialog_add_widget(zd,"check","comp","hbcomp",TX("error compensation"),"space=5"); zdialog_load_inputs(zd); // restore previous inputs zdialog_run(zd,dither2_dialog_event,"save"); // run dialog - parallel return; } // dither2 dialog event and completion function int dither2_dialog_event(zdialog *zd, ch *event) { using namespace dither2_names; if (strmatch(event,"apply")) zd->zstat = 1; // from script if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() zdialog_fetch(zd,"res",res); zdialog_fetch(zd,"depth",depth); zdialog_fetch(zd,"comp",comp); if (zd->zstat) { if (zd->zstat == 1) { // apply zd->zstat = 0; thread_signal(); } else if (zd->zstat == 2) { // done edit_addhist("res:%d depth:%d comp:%d",res,depth,comp); // edit parms > edit hist edit_done(0); } else edit_cancel(0); // discard edit return 1; } return 1; } // thread function void * dither2_thread(void *) { using namespace dither2_names; int bits[9] = { 1, 2, 4, 8, 16, 32, 64, 128, 256 }; int Brows, Bcols, Brow, Bcol, block, Nblocks; int pxlo, pxhi, pylo, pyhi, px, py; float *blockR, *blockG, *blockB; float R, G, B, Rp, Gp, Bp, Re, Ge, Be; int n1, n2, n3, n4; int bb, ii, dist = 0; float *pix1, *pix3; bb = bits[9-depth]; // depth: 1 .. 8 bb: 256 128 64 .. 2 res2 = res * res; // pixel block size Bcols = Eww / res; // block rows and cols Brows = Ehh / res; Nblocks = Brows * Bcols; // allocate block color memory blockR = (float *) zmalloc(Nblocks * sizeof(float),"dither2"); blockG = (float *) zmalloc(Nblocks * sizeof(float),"dither2"); blockB = (float *) zmalloc(Nblocks * sizeof(float),"dither2"); progress_setgoal(Nblocks); // initz. progress counter for (Brow = 0; Brow < Brows; Brow++) // loop blocks for (Bcol = 0; Bcol < Bcols; Bcol++) { block = Brow * Bcols + Bcol; // block sequence number pylo = Brow * res; // range of pixels in block pyhi = pylo + res; pxlo = Bcol * res; pxhi = pxlo + res; R = G = B = 0; for (py = pylo; py < pyhi; py++) // loop pixels in block for (px = pxlo; px < pxhi; px++) { pix1 = PXMpix(E1pxm,px,py); // sum RGB for all pixels R += pix1[0]; G += pix1[1]; B += pix1[2]; } blockR[block] = R / res2; // save mean RGB values for block blockG[block] = G / res2; blockB[block] = B / res2; } if (comp) { for (Brow = 1; Brow < Brows-1; Brow++) // loop blocks, omitting for (Bcol = 1; Bcol < Bcols-1; Bcol++) // first/last rows/cols { block = Brow * Bcols + Bcol; // block sequence number R = blockR[block]; // block mean RGB G = blockG[block]; B = blockB[block]; Rp = int(R + bb/2) / bb * bb; // nearest palette RGB Gp = int(G + bb/2) / bb * bb; Bp = int(B + bb/2) / bb * bb; if (Rp > 255) Rp = 255; if (Gp > 255) Gp = 255; if (Bp > 255) Bp = 255; Re = R - Rp; // errors Ge = G - Gp; Be = B - Bp; n1 = block + 1; // distribute errors downstream n2 = block + Bcols - 1; n3 = n2 + 1; n4 = n3 + 1; blockR[n1] += 0.4375 * Re; blockG[n1] += 0.4375 * Ge; blockB[n1] += 0.4375 * Be; blockR[n2] += 0.1875 * Re; blockG[n2] += 0.1875 * Ge; blockB[n2] += 0.1875 * Be; blockR[n3] += 0.3125 * Re; blockG[n3] += 0.3125 * Ge; blockB[n3] += 0.3125 * Be; blockR[n4] += 0.0625 * Re; blockG[n4] += 0.0625 * Ge; blockB[n4] += 0.0625 * Be; } } for (Brow = 0; Brow < Brows; Brow++) // loop blocks for (Bcol = 0; Bcol < Bcols; Bcol++) { block = Brow * Bcols + Bcol; // block sequence number R = blockR[block]; // block mean RGB + errors G = blockG[block]; B = blockB[block]; Rp = int(R + bb/2) / bb * bb; // nearest palette RGB Gp = int(G + bb/2) / bb * bb; Bp = int(B + bb/2) / bb * bb; if (Rp > 255) Rp = 255; if (Gp > 255) Gp = 255; if (Bp > 255) Bp = 255; pylo = Brow * res; // range of pixels in block pyhi = pylo + res; pxlo = Bcol * res; pxhi = pxlo + res; for (py = pylo; py < pyhi; py++) // loop pixels in block for (px = pxlo; px < pxhi; px++) { if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } pix3 = PXMpix(E3pxm,px,py); // set pixels to pix3[0] = Rp; // block palette color pix3[1] = Gp; pix3[2] = Bp; } progress_addvalue(1); } zfree(blockR); zfree(blockG); zfree(blockB); progress_setgoal(0); CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); // update window return 0; } /**************************************************************************************/ // Dither image using custom colors and Floyd-Steinberg error distribution algorithm. namespace dither3_names { editfunc EFdither3; int res, res2, comp; ch palettename[100] = "none"; // palette file name int Ncolors = 0; // palette color count } // menu function void m_dither3(GtkWidget *, ch *menu) { using namespace dither3_names; int dither3_dialog_event(zdialog* zd, ch *event); void * dither3_thread(void *); F1_help_topic = TX("DITHER"); printf("m_dither3 \n"); EFdither3.menuname = "dither3"; EFdither3.menufunc = m_dither3; EFdither3.threadfunc = dither3_thread; // thread function EFdither3.Farea = 2; // select area usable EFdither3.Fscript = 1; // script file supported if (! edit_setup(EFdither3)) return; // setup edit if (Fscriptrun) Ncolors = 0; /*** _________________________________ | Dither3 | | | | resolution [ N ] | // 2x2 to 30x30 | palette: [palette name] [load] | | [x] error compensation | | | | [Apply] [OK] [X] | |_________________________________| ***/ zdialog *zd = zdialog_new(TX("Dither3"),Mwin,TX("Apply"),"OK","X",null); // dither dialog CEF->zd = zd; zdialog_add_widget(zd,"hbox","hbres","dialog"); zdialog_add_widget(zd,"label","labres","hbres",TX("resolution"),"space=5"); zdialog_add_widget(zd,"zspin","res","hbres","2|30|1|4","space=5|size=3"); zdialog_add_widget(zd,"hbox","hbpal","dialog"); zdialog_add_widget(zd,"hbox","hbpal","dialog"); zdialog_add_widget(zd,"label","labpal","hbpal",TX("palette:"),"space=5"); zdialog_add_widget(zd,"zentry","palname","hbpal",TX("none"),"size=20|space=5"); zdialog_add_widget(zd,"button","LOAD","hbpal",TX("Load"),"space=5"); zdialog_add_widget(zd,"hbox","hbcomp","dialog"); zdialog_add_widget(zd,"check","comp","hbcomp",TX("error compensation"),"space=5"); if (! Fscriptrun) zdialog_load_inputs(zd); // restore previous inputs zdialog_run(zd,dither3_dialog_event,"save"); // run dialog - parallel res = 4; comp = 0; return; } // dither3 dialog event and completion function int dither3_dialog_event(zdialog *zd, ch *event) { using namespace dither3_names; int load_palette_map(ch *file); zdialog *zdpop; ch palettefile[200], *pp; if (strmatch(event,"apply")) zd->zstat = 1; // from script if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (zd->zstat) { if (zd->zstat == 1) // [apply] { zd->zstat = 0; zdialog_fetch(zd,"res",res); zdialog_fetch(zd,"comp",comp); zdialog_fetch(zd,"palname",palettename,100); if (! Ncolors) { // no palette loaded snprintf(palettefile,200,"%s/%s",palettes_folder,palettename); Ncolors = load_palette_map(palettefile); // CPU loops for a long time } if (Ncolors) thread_signal(); // no palette loaded } else if (zd->zstat == 2) { // [OK] edit_addhist("res:%d palette:%s comp:%d",res,palettename,comp); // edit parms > edit hist edit_done(0); } else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"LOAD")) // load a palette file { pp = zgetfile(TX("palette file"),MWIN,"file",palettes_folder,0); if (pp) { zdialog_show(zd,0); zdpop = zmessage_post(Mwin,"parent",0,TX("loading palette ...")); // 25.1 Ncolors = load_palette_map(pp); // CPU loops for a long time zdialog_free(zdpop); if (Ncolors) { zmessage_post(Mwin,"parent",3,TX("palette loaded, %d colors"),Ncolors); pp = strrchr(pp,'/'); zdialog_stuff(zd,"palname",pp+1); } zdialog_show(zd,1); } } return 1; } // thread function void * dither3_thread(void *) { using namespace dither3_names; void match_palette_map(int r, int g, int b, int &R, int &G, int&B); int Brows, Bcols, Brow, Bcol, block, Nblocks; int pxlo, pxhi, pylo, pyhi, px, py; float *blockR, *blockG, *blockB; float R, G, B, Re, Ge, Be; int Rp, Gp, Bp; int n1, n2, n3, n4; int ii, dist = 0; float *pix1, *pix3; res2 = res * res; // pixel block size Bcols = Eww / res; // block rows and cols Brows = Ehh / res; Nblocks = Brows * Bcols; // allocate block color memory blockR = (float *) zmalloc(Nblocks * sizeof(float),"dither3"); blockG = (float *) zmalloc(Nblocks * sizeof(float),"dither3"); blockB = (float *) zmalloc(Nblocks * sizeof(float),"dither3"); progress_setgoal(Nblocks); // initz. progress counter for (Brow = 0; Brow < Brows; Brow++) // loop blocks for (Bcol = 0; Bcol < Bcols; Bcol++) { block = Brow * Bcols + Bcol; // block sequence number pylo = Brow * res; // range of pixels in block pyhi = pylo + res; pxlo = Bcol * res; pxhi = pxlo + res; R = G = B = 0; for (py = pylo; py < pyhi; py++) // loop pixels in block for (px = pxlo; px < pxhi; px++) { pix1 = PXMpix(E1pxm,px,py); // sum RGB for all pixels R += pix1[0]; G += pix1[1]; B += pix1[2]; } blockR[block] = R / res2; // save mean RGB values for block blockG[block] = G / res2; blockB[block] = B / res2; } if (comp) { for (Brow = 1; Brow < Brows-1; Brow++) // loop blocks, omitting for (Bcol = 1; Bcol < Bcols-1; Bcol++) // first/last rows/cols { block = Brow * Bcols + Bcol; // block sequence number R = blockR[block]; // block mean RGB G = blockG[block]; B = blockB[block]; RGBfix(R,G,B); match_palette_map(R,G,B,Rp,Gp,Bp); // get nearest palette RGB Re = R - Rp; // errors Ge = G - Gp; Be = B - Bp; n1 = block + 1; // distribute errors downstream n2 = block + Bcols - 1; n3 = n2 + 1; n4 = n3 + 1; blockR[n1] += 0.4375 * Re; blockG[n1] += 0.4375 * Ge; blockB[n1] += 0.4375 * Be; blockR[n2] += 0.1875 * Re; blockG[n2] += 0.1875 * Ge; blockB[n2] += 0.1875 * Be; blockR[n3] += 0.3125 * Re; blockG[n3] += 0.3125 * Ge; blockB[n3] += 0.3125 * Be; blockR[n4] += 0.0625 * Re; blockG[n4] += 0.0625 * Ge; blockB[n4] += 0.0625 * Be; } } for (Brow = 0; Brow < Brows; Brow++) // loop blocks for (Bcol = 0; Bcol < Bcols; Bcol++) { block = Brow * Bcols + Bcol; // block sequence number R = blockR[block]; // block mean RGB + errors G = blockG[block]; B = blockB[block]; RGBfix(R,G,B); match_palette_map(R,G,B,Rp,Gp,Bp); // get nearest palette RGB pylo = Brow * res; // range of pixels in block pyhi = pylo + res; pxlo = Bcol * res; pxhi = pxlo + res; for (py = pylo; py < pyhi; py++) // loop pixels in block for (px = pxlo; px < pxhi; px++) { if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } pix3 = PXMpix(E3pxm,px,py); // set pixels to pix3[0] = Rp; // block palette color pix3[1] = Gp; pix3[2] = Bp; } progress_addvalue(1); } zfree(blockR); zfree(blockG); zfree(blockB); progress_setgoal(0); CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); // update window return 0; } /**************************************************************************************/ namespace palette_map_names { int Np = 0, maxNp = 2000; int palette[2000][3]; int16 RGBmap[256][256][256]; } // Load a palette file and map all RGB colors to best palette color. // Returns palette color count, or 0 if error. int load_palette_map(ch *file) { using namespace palette_map_names; void * load_palette_map_thread(void *arg); FILE *fid; ch buffer[200]; int nn, R, G, B; Np = 0; printf("read palette file: %s \n",file); fid = fopen(file,"r"); if (! fid) { zmessageACK(Mwin,strerror(errno)); return 0; } while (true) { if (! fgets_trim(buffer,200,fid)) break; nn = sscanf(buffer,"%d %d %d",&R,&G,&B); if (nn != 3) continue; if (R < 0 || R > 255) continue; if (G < 0 || G > 255) continue; if (B < 0 || B > 255) continue; palette[Np][0] = R; palette[Np][1] = G; palette[Np][2] = B; Np++; if (Np == maxNp) break; } fclose(fid); if (Np < 6) { zmessageACK(Mwin,TX("palette has %d colors"),Np); return 0; } if (Np == maxNp) { zmessageACK(Mwin,TX("palette exceeds %d color limit"),maxNp); return 0; } do_wthreads(load_palette_map_thread,NSMP); return Np; } // thread function for mapping all RGB values to best-fit palette color void * load_palette_map_thread(void *arg) { using namespace palette_map_names; int index = * ((int *) arg); int Dr, Dg, Db, Dmin, D; int R, G, B, p, Mp; for (R = index; R < 256; R += NSMP) for (G = 0; G < 256; G++) for (B = 0; B < 256; B++) { Dmin = 99999999; Mp = 0; for (p = 0; p < Np; p++) { Dr = R - palette[p][0]; Dg = G - palette[p][1]; Db = B - palette[p][2]; D = Dr * Dr + Dg * Dg + Db * Db; if (D > Dmin) continue; Dmin = D; Mp = p; } RGBmap[R][G][B] = Mp; } return 0; } // return the best matching palette RGB for a given input RGB void match_palette_map(int r, int g, int b, int &R, int &G, int&B) { using namespace palette_map_names; int p; R = G = B = 0; if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) return; if (! Np) return; p = RGBmap[r][g][b]; R = palette[p][0]; G = palette[p][1]; B = palette[p][2]; } /**************************************************************************************/ // The pixels in an image attract each-other and collapse into // blobs at a local center of mass (mass := brightness). namespace dither4_names { editfunc EFdither4; int radius; float *vposx, *vposy; // pixel virtual positions float *wposx, *wposy; int Frun; // run blob condensation process } // menu function void m_dither4(GtkWidget *, ch *menu) { using namespace dither4_names; int dither4_dialog_event(zdialog* zd, ch *event); void * dither4_thread(void *); int px, py, ii; uint vpcc; F1_help_topic = TX("DITHER"); printf("m_dither4 \n"); EFdither4.menuname = "dither4"; EFdither4.menufunc = m_dither4; EFdither4.threadfunc = dither4_thread; EFdither4.Farea = 2; // select area usable if (! edit_setup(EFdither4)) return; // setup edit vpcc = Eww * Ehh * sizeof(float); vposx = (float *) zmalloc(vpcc,"dither4"); // virtual pixel positions vposy = (float *) zmalloc(vpcc,"dither4"); wposx = (float *) zmalloc(vpcc,"dither4"); wposy = (float *) zmalloc(vpcc,"dither4"); for (py = 0; py < Ehh; py++) // initz. virtual pixel positions for (px = 0; px < Eww; px++) { ii = py * Eww + px; vposx[ii] = drandz() + px; vposy[ii] = drandz() + py; } /*** ________________________________ | Dither4 | | | | radius [ 10 ] [start] [stop] | | | | [Reset] [OK] [X] | |________________________________| ***/ zdialog *zd = zdialog_new(TX("Dither4"),Mwin,TX("Reset"),"OK","X",null); EFdither4.zd = zd; zdialog_add_widget(zd,"hbox","hbinputs","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labradius","hbinputs",TX("radius"),"space=3"); zdialog_add_widget(zd,"zspin","radius","hbinputs","2|20|1|10","space=3|size=3"); zdialog_add_widget(zd,"button","start","hbinputs",TX("start"),"space=5"); zdialog_add_widget(zd,"button","stop","hbinputs",TX("stop"),"space=5"); zdialog_add_ttip(zd,"start",TX("start blob condensation process")); zdialog_add_ttip(zd,"stop",TX("stop blob condensation process")); radius = 10; // initial value zdialog_run(zd,dither4_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int dither4_dialog_event(zdialog *zd, ch *event) { using namespace dither4_names; int dither4_timerfunc(void *); int px, py, ii; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (zd->zstat) Frun = 0; // stop thread if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active edit_reset(); for (py = 0; py < Ehh; py++) // reset virtual pixel positions for (px = 0; px < Eww; px++) { ii = py * Eww + px; vposx[ii] = drandz() + px; vposy[ii] = drandz() + py; } return 1; } if (zd->zstat == 2) // [OK] { if (CEF->Fmods) { edit_addhist("radius:%d",radius); // edit parms > edit hist edit_done(0); // complete edit } else edit_cancel(0); // no change zfree(vposx); // free memory zfree(vposy); zfree(wposx); zfree(wposy); return 1; } if (zd->zstat < 0 || zd->zstat > 2) { // cancel edit edit_cancel(0); zfree(vposx); // free memory zfree(vposy); zfree(wposx); zfree(wposy); return 1; } if (strmatch(event,"radius")) zdialog_fetch(zd,"radius",radius); if (strmatch(event,"start")) { if (! Frun) { Frun = 1; // start timer function g_timeout_add(200,dither4_timerfunc,0); // runs every 200 ms } } else Frun = 0; return 1; } // timer function - start thread every interval int dither4_timerfunc(void *) { using namespace dither4_names; if (! Frun) return 0; // exit forever thread_signal(); // start thread process thread_wait(); if (CEF) { CEF->Fmods = 1; // image E3 modified CEF->Fsaved = 0; } Fpaint2(); // update window return 1; // come back every interval } // thread function void * dither4_thread(void *arg) { using namespace dither4_names; void * dither4_wthread(void *); synch_threads(NSMP); // setup to synch threads do_wthreads(dither4_wthread,NSMP); // do working threads return 0; } // worker thread function void * dither4_wthread(void *arg) { using namespace dither4_names; int index = *((int *) arg); int px, py, qx, qy; int ii, jj, rgb, dist; float vpx, vpy, vqx, vqy, dx, dy; float R, R2, M; float Fx, Fy, Fxa, Fya; float *pix1, *pix3, *pix3q; float c1, c2; for (py = radius+index; py < Ehh-radius; py += NSMP) // loop pixels px/py in input image for (px = radius; px < Eww-radius; px++) { ii = py * Eww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } wposx[ii] = vposx[ii]; // copy px/py virtual position wposy[ii] = vposy[ii]; } for (py = radius+index; py < Ehh-radius; py += NSMP) // loop pixels px/py in input image for (px = radius; px < Eww-radius; px++) { ii = py * Eww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } vpx = vposx[ii]; // current px/py virtual positions vpy = vposy[ii]; Fx = Fy = 0; // force acting on px/py for (qy = py-radius; qy <= py+radius; qy++) // loop pixels qx/qy in range of px/py for (qx = px-radius; qx <= px+radius; qx++) { jj = qy * Eww + qx; vqx = vposx[jj]; // current qx/qy virtual positions vqy = vposy[jj]; dx = vqx - vpx; // vpx/vpy -> vqx/vqy dy = vqy - vpy; // x and y distance R2 = dx * dx + dy * dy; // distance ^2 if (R2 > radius * radius) continue; // vqx/vqy out of range, ignore if (R2 < 0.5) continue; // too close, ignore pix1 = PXMpix(E1pxm,qx,qy); // get pixel qx/qy RGB M = pix1[0] + pix1[1] + pix1[2]; M = 0.001 * M / R2; // 'mass' of pixel, 0 - 0.77 Fx += M * dx; // accumulate total attractive force Fy += M * dy; // of all pixels in range } Fxa = fabsf(Fx); // get |Fx| and |Fy| Fya = fabsf(Fy); if (Fxa + Fya < 0.1) continue; // too small, ignore if (Fxa > Fya) { // scale Fx/Fy to 1.0 Fy = Fy / Fxa; Fx = Fx / Fxa; } else { Fx = Fx / Fya; Fy = Fy / Fya; } wposx[ii] += 0.7 * Fx; // move virt. px/py in force direction wposy[ii] += 0.7 * Fy; } for (py = radius+index; py < Ehh-radius; py += NSMP) // loop pixels px/py in input image for (px = radius; px < Eww-radius; px++) { ii = py * Eww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } vposx[ii] = wposx[ii]; // get new px/py virtual position vposy[ii] = wposy[ii]; } synch_threads(0); // wait for all threads reach here if (index > 0) return 0; // continue only thread 0 for (py = 0; py < Ehh; py++) // loop pixels px/py in output image for (px = 0; px < Eww; px++) { ii = py * Eww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } pix3 = PXMpix(E3pxm,px,py); // set pixel RGB values = 0 pix3[0] = pix3[1] = pix3[2] = 0; } for (py = radius; py < Ehh-radius; py++) // loop pixels px/py in output image for (px = radius; px < Eww-radius; px++) { ii = py * Eww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } qx = vposx[ii] + 0.5; // new pixel virtual position qy = vposy[ii] + 0.5; if (qx < 0 || qx > Eww-1) continue; if (qy < 0 || qy > Ehh-1) continue; pix1 = PXMpix(E1pxm,px,py); // old pixel position pix3 = PXMpix(E3pxm,qx,qy); // move RGB values to new position pix3[0] += pix1[0]; pix3[1] += pix1[1]; pix3[2] += pix1[2]; } for (py = radius; py < Ehh-radius; py++) // loop pixels px/py in output image for (px = radius; px < Eww-radius; px++) { if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } pix3 = PXMpix(E3pxm,px,py); for (rgb = 0; rgb < 3; rgb++) // loop RGB color { c1 = pix3[rgb]; // pixel RGB value if (c1 <= 255) continue; // <= 255, OK pix3[rgb] = 255; // > 255, must distribute excess c1 = c1 - 255; // amount to distribute for (R = 1; R <= radius; R++) // loop pixels qx/qy in range of px/py { for (qy = -R; qy <= +R; qy++) for (qx = -R; qx <= +R; qx++) { if (qx == 0 && qy == 0) continue; // skip px/py if (sqrtf(qx*qx + qy*qy) > R) continue; // corners of box > range pix3q = PXMpix(E3pxm,px+qx,py+qy); c2 = pix3q[rgb]; if (c2 >= 255) continue; // pixel already full if (c1 + c2 > 255) { c1 -= (255 - c2); // fill pixel and reduce c2 = 255; // remaining amount to distribute } else { c2 += c1; // add amount to distribute to pixel c1 = 0; // nothing left } pix3q[rgb] = c2; if (c1 < 1) goto endR; } } endR:; } } return 0; } /**************************************************************************************/ // Convert an image into a form of line art. // Replace RGB pixel blocks with horizontal stripes of B/W pixels. namespace engrave_names { editfunc EFengrave; int size, bias, color; // user inputs } // menu function void m_engrave(GtkWidget *, ch *menu) { using namespace engrave_names; int engrave_dialog_event(zdialog* zd, ch *event); void engrave_curvedit(int spc); void * engrave_thread(void *); F1_help_topic = TX("ENGRAVE"); printf("m_engrave \n"); EFengrave.menuname = "Engrave"; EFengrave.menufunc = m_engrave; EFengrave.Farea = 2; // select area usable EFengrave.Fscript = 1; // scripting supported EFengrave.threadfunc = engrave_thread; if (! edit_setup(EFengrave)) return; // setup edit /*** ______________________________________ | Engrave | | | | Size [___] Bias [___] color [___] | | | | [Apply] [OK] [X] | |______________________________________| ***/ zdialog *zd = zdialog_new(TX("Engrave"),Mwin,TX("Apply"),"OK","X",null); EFengrave.zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labsize","hb1",TX("Size"),"space=3"); zdialog_add_widget(zd,"zspin","size","hb1","2|20|1|8"); zdialog_add_widget(zd,"label","space","hb1",0,"space=4"); zdialog_add_widget(zd,"label","labbias","hb1",TX("Bias"),"space=3"); zdialog_add_widget(zd,"zspin","bias","hb1","-255|255|1|0"); zdialog_add_widget(zd,"label","space","hb1",0,"space=4"); zdialog_add_widget(zd,"label","labcolor","hb1",TX("Color"),"space=3"); zdialog_add_widget(zd,"zspin","color","hb1","0|100|1|0"); size = 8; // initial values bias = 0; color = 0; zdialog_run(zd,engrave_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int engrave_dialog_event(zdialog *zd, ch *event) { using namespace engrave_names; if (strmatch(event,"apply")) zd->zstat = 1; // from script if (strmatch(event,"done")) zd->zstat = 2; // done if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (zd->zstat == 1) // [apply] { zd->zstat = 0; // keep dialog active zdialog_fetch(zd,"size",size); // get user inputs zdialog_fetch(zd,"bias",bias); zdialog_fetch(zd,"color",color); thread_signal(); // do function return 1; } if (zd->zstat == 2) // [OK] { if (CEF->Fmods) edit_done(0); else edit_cancel(0); return 1; } if (zd->zstat < 0 || zd->zstat > 2) { // cancel edit edit_cancel(0); return 1; } return 1; } // thread function void * engrave_thread(void *arg) { using namespace engrave_names; void * engrave_wthread(void *); do_wthreads(engrave_wthread,NSMP); CEF->Fmods++; // image3 modified CEF->Fsaved = 0; Fpaint2(); // update window return 0; } void * engrave_wthread(void *arg) // worker thread function { using namespace engrave_names; int index = *((int *) arg); int ii, px, py, qx, qy, dist; int pcc = E3pxm->nc * sizeof(float); float brite, dnew, dold; float *pix1, *pix3; for (py = index * size; py < Ehh-size; py += NSMP * size) // loop pixel blocks size x size for (px = 0; px < Eww-size; px += size) { for (qx = px; qx < px + size; qx++) // loop block columns { brite = bias * size; // initial bias for (qy = py; qy < py + size; qy++) // loop pixels in column { pix1 = PXMpix(E1pxm,qx,qy); // input pixel brite += PIXBRIGHT(pix1); // sum column brightness } for (qy = py; qy < py + size; qy++) // loop pixels in column { pix3 = PXMpix(E3pxm,qx,qy); // output pixel if (brite < 100) pix3[0] = pix3[1] = pix3[2] = 0; // set column pixels to black or white else pix3[0] = pix3[1] = pix3[2] = 255; // B/W ratio matches block brightness brite -= 255; } if (color > 1) { dnew = 0.01 * color; // add color 0 ... 1 dold = 1.0 - dnew; for (qy = py; qy < py + size; qy++) // loop pixels in column { pix3 = PXMpix(E3pxm,qx,qy); // output pixel pix1 = PXMpix(E1pxm,qx,qy); // input pixel 25.4 for (ii = 0; ii < 3; ii++) if (pix3[ii] == 255) pix3[ii] = dnew * pix1[ii] + dold * 255; } } if (sa_stat == sa_stat_fini) // select area active { for (qy = py; qy < py + size; qy++) // loop pixels in column { pix1 = PXMpix(E1pxm,qx,qy); pix3 = PXMpix(E3pxm,qx,qy); ii = qy * Eww + qx; dist = sa_pixmap[ii]; if (! dist) { // pixel outside area memcpy(pix3,pix1,pcc); // restore input pixel continue; } } } } } return 0; } /**************************************************************************************/ // add glare around bright objects namespace addglare_names { editfunc EFaddglare; float power; // 0 - 1.0 overall add glare power float limit; // 100 - 255 pixel min. brightness for glare emission float range; // 1 - 99 glare range from emitting pixels struct lum_t { float R, G, B; // maps pixel illumination from nearby illuminating pixels int count; }; lum_t *lummap; size_t lumcc; } // menu function void m_addglare(GtkWidget *, ch *menu) // 26.0 { using namespace addglare_names; int addglare_dialog_event(zdialog* zd, ch *event); void * addglare_thread(void *); printf("m_addglare \n"); F1_help_topic = TX("ADD GLARE"); EFaddglare.menuname = "addglare"; EFaddglare.menufunc = m_addglare; EFaddglare.Farea = 2; // select area usable EFaddglare.Fpaintedits = 1; // use with paint edits OK EFaddglare.Fscript = 1; // scripting supported EFaddglare.threadfunc = addglare_thread; if (! edit_setup(EFaddglare)) return; // setup edit lumcc = Eww * Ehh * sizeof(lum_t); // memory for illumination map lummap = (lum_t *) zmalloc(lumcc,"addglare"); /*** ________________________________ | Add Glare | | | | Power ===========[]==== [__] | // overall glare power, 0 - 1.0 | Limit ====[]=========== [__] | // source pixel min. brightness, 200 - 255 | Range =========[]====== [__] | // target pixel max. distance, 1 - 99 | | | [Apply] [OK] [X] | |________________________________| ***/ zdialog *zd = zdialog_new(TX("Add Glare"),Mwin,TX("Apply"),"OK","X",null); EFaddglare.zd = zd; zdialog_add_widget(zd,"hbox","hbp","dialog",0,"space=5|expand"); zdialog_add_widget(zd,"label","labp","hbp",TX("Power")); zdialog_add_widget(zd,"hscale2","power","hbp","0|1.0|0.01|0","expand"); zdialog_add_widget(zd,"hbox","hbl","dialog",0,"space=5|expand"); zdialog_add_widget(zd,"label","labp","hbl",TX("Limit")); zdialog_add_widget(zd,"hscale2","limit","hbl","200|255|1|250","expand"); zdialog_add_widget(zd,"hbox","hbr","dialog",0,"space=5|expand"); zdialog_add_widget(zd,"label","labp","hbr",TX("Range")); zdialog_add_widget(zd,"hscale2","range","hbr","1|99|1|20","expand"); power = 0; limit = 250; range = 20; zdialog_run(zd,addglare_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int addglare_dialog_event(zdialog *zd, ch *event) { using namespace addglare_names; int Fapply = 0; if (strmatch(event,"done")) zd->zstat = 1; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (strmatch(event,"apply")) Fapply = 1; // from script if (strmatch(event,"paint")) Fapply = 1; // mouse paint if (zd->zstat == 1) // [apply] { zd->zstat = 0; // keep dialog active edit_reset(); Fapply = 1; } if (zd->zstat == 2) // [OK] { if (CEF->Fmods) edit_done(0); else edit_cancel(0); // no change zfree(lummap); return 1; } if (zd->zstat < 0 || zd->zstat > 2) { // cancel edit_cancel(0); zfree(lummap); return 1; } if (strstr("power limit range",event)) { // new user input zdialog_fetch(zd,"power",power); zdialog_fetch(zd,"limit",limit); zdialog_fetch(zd,"range",range); } if (Fapply) thread_signal(); return 1; } // thread function void * addglare_thread(void *arg) { using namespace addglare_names; void * addglare_wthread(void *); int px, py, rx, ry, ii, pskip = 0; float *pixB, *pixD, Pdist, F; if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag memset(lummap,0,lumcc); // clear illumination map progress_setgoal(Eww * Ehh); // initz. progress monitor for (py = 0; py < Ehh; py++) // loop all pixels for (px = 0; px < Eww; px++) { if (++pskip == 10) { // every 10th pixel pskip = 0; // (reduce call overhead) progress_addvalue(10); // track progress } pixB = PXMpix(E1pxm,px,py); if (pixB[0] < limit && pixB[1] < limit && pixB[2] < limit) continue; // skip non-illuminating (dark) pixels for (ry = py-range; ry <= py+range; ry++) // loop pixels within range of for (rx = px-range; rx <= px+range; rx++) // illuminating pixel { if (rx < 0 || rx > Eww-1) continue; // pixel off the image edge if (ry < 0 || ry > Ehh-1) continue; pixD = PXMpix(E1pxm,rx,ry); // skip illuminating pixels if (pixD[0] >= limit || pixD[1] >= limit || pixD[2] >= limit) continue; Pdist = sqrtf((rx-px)*(rx-px) + (ry-py)*(ry-py)); // distance from source if (Pdist > range) continue; ii = ry * Eww + rx; F = (range - Pdist) / range; // near 1 at Pdist=1 --> 0 at Pdist=range lummap[ii].R += pixB[0] * F; // accumulate illumination of dark pixel lummap[ii].G += pixB[1] * F; // from nearby illuminating pixels lummap[ii].B += pixB[2] * F; lummap[ii].count++; // accumulate count of illuminating pixels } } get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(addglare_wthread,NSMP); // run working threads progress_setgoal(0); CEF->Fmods++; // image3 modified CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } void * addglare_wthread(void *arg) // worker thread function { using namespace addglare_names; int index = *((int *) arg); int Fend, px, py, ii; float *pix1, *pix3; float blend; float F, R1, G1, B1, R3, G3, B3, R9, G9, B9; while (true) // loop all edit pixels { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; if (Fescape) break; ii = py * Eww + px; if (lummap[ii].count == 0) continue; // pixel not illuminated pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = R9 = pix1[0]; // input image RGB values G1 = G9 = pix1[1]; B1 = B9 = pix1[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; F = power / lummap[ii].count; R9 += F * lummap[ii].R; // add illumination to pixel G9 += F * lummap[ii].G; B9 += F * lummap[ii].B; RGBfix(R9,G9,B9); // rescale within 255 if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or select area { R3 = blend * R9 + (1-blend) * R1; // output = blend of input and output G3 = blend * G9 + (1-blend) * G1; // (select area edge blending) B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // Create a mosaic image using tiny thumbnails as tiles. // tiles can be clicked to pop-up a larger zoomable image. namespace mosaic_names { editfunc EFmosaic; // edit function data #define maxtiles maximages int tww, thh; // tile size (default 32x24) int mww, mhh; // image size ch *tilefile[maxtiles]; // tile files list (100K x 100 --> 10M) uint8 *tileimage[maxtiles]; // tile images (tww x thh x 3) (100K x 32 x 24 x 3 --> 230M) int Ntiles, Ndone; // tile image count float tileRGB1[maxtiles][3]; // tile mean RGB values for each tile quadrant float tileRGB2[maxtiles][3]; // (100K x 3 x 4B --> 1.2M x 4Q --> 4.8M) float tileRGB3[maxtiles][3]; float tileRGB4[maxtiles][3]; int *tilemap; // maps image [px,py] to tile used at that position int tbusy[XSMP]; } // menu function void m_mosaic(GtkWidget *, ch *menu) { using namespace mosaic_names; int mosaic_dialog_event(zdialog*, ch *); void mosaic_mousefunc(); zdialog *zd; ch *title = TX("Create Mosaic"); ch label[12]; int cc; F1_help_topic = TX("MOSAIC"); printf("m_mosaic \n"); EFmosaic.menuname = "Mosaic"; EFmosaic.mousefunc = mosaic_mousefunc; // mouse function EFmosaic.Farea = 2; // area usable if (! edit_setup(EFmosaic)) return; // setup edit tww = 32; // default tile size thh = 24; Ntiles = 0; // tile file and image counts cc = maxtiles * sizeof(ch *); // clear tile file list memset(tilefile,0,cc); cc = maxtiles * sizeof(uint8 *); // clear tile image list memset(tileimage,0,cc); cc = Eww * Ehh * sizeof(int); // allocate image/tile map tilemap = (int *) zmalloc(cc,"mosaic"); memset(tilemap,-1,cc); /*** ____________________________________________ | Create Mosaic | | | | Tile Width [___] Height [___] | | [Tiles] nnnnn [Image] | | Tile blending =========[]============= | | | | [OK] [X] | |____________________________________________| ***/ zd = zdialog_new(title,Mwin,"OK","X",null); // mosaic dialog CEF->zd = zd; zdialog_add_widget(zd,"hbox","hbsize","dialog"); zdialog_add_widget(zd,"label","labsize","hbsize",TX("Tile"),"space=3"); zdialog_add_widget(zd,"label","labwidth","hbsize",TX("Width"),"space=3"); zdialog_add_widget(zd,"zspin","width","hbsize","16|48|2|32"); zdialog_add_widget(zd,"label","space","hbsize",0,"space=5"); zdialog_add_widget(zd,"label","labheight","hbsize",TX("Height"),"space=3"); zdialog_add_widget(zd,"zspin","height","hbsize","16|48|2|24"); zdialog_add_widget(zd,"hbox","hbcreate","dialog"); zdialog_add_widget(zd,"button","tiles","hbcreate",TX("Tiles"),"space=3"); zdialog_add_widget(zd,"label","labNtiles","hbcreate","0","space=5"); zdialog_add_widget(zd,"button","image","hbcreate",TX("Image"),"space=10"); zdialog_add_widget(zd,"vbox","space","dialog",0,"space=3"); zdialog_add_widget(zd,"hbox","hbblend","dialog"); zdialog_add_widget(zd,"label","labblend","hbblend",TX("Tile blending"),"space=3"); zdialog_add_widget(zd,"hscale","blend","hbblend","0|100|1|0","space=5|expand"); zdialog_stuff(zd,"width",tww); zdialog_stuff(zd,"height",thh); snprintf(label,12,"%d",Ntiles); zdialog_stuff(zd,"labNtiles",label); zdialog_run(zd,mosaic_dialog_event,"save"); // run dialog - parallel return; } // mosaic dialog event and completion function int mosaic_dialog_event(zdialog *zd, ch *event) { using namespace mosaic_names; void * mosaic_thread1(void *arg); void * mosaic_thread2(void *arg); void mosaic_mousefunc(); static int block = 0; ch **flist = 0; ch label[12]; int ii, err, NF; int trow, tcol, tpx, tpy, ipx, ipy; uint8 *timage, *tpix; float blend, f1, f3; float *pix1, *pix3; if (block) return 1; block = 1; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat == 1) edit_done(0); // commit edit else edit_cancel(0); // discard edit for (ii = 0; ii < Ntiles; ii++) { // free memory if (tilefile[ii]) zfree(tilefile[ii]); if (tileimage[ii]) zfree(tileimage[ii]); } if (tilemap) zfree(tilemap); block = 0; return 1; } if (strmatch(event,"focus")) { takeMouse(mosaic_mousefunc,dragcursor); // connect mouse function block = 0; return 1; } if (strmatch(event,"tiles")) // read thumbnails, create tile images { for (ii = 0; ii < Ntiles; ii++) { // free memory if (tilefile[ii]) zfree(tilefile[ii]); if (tileimage[ii]) zfree(tileimage[ii]); tilefile[ii] = 0; tileimage[ii] = 0; } Ntiles = 0; Ndone = 0; // progress counter zdialog_stuff(zd,"labNtiles","0"); zdialog_fetch(zd,"width",tww); // get tile size from dialog zdialog_fetch(zd,"height",thh); err = find_imagefiles(thumbfolder,2+16,flist,NF); // all thumbnails, all levels if (err) { zmessageACK(Mwin,strerror(errno)); block = 0; return 1; } if (NF > maxtiles) { // too many zmessageACK(Mwin,TX("exceeded max. tiles: %d"),maxtiles); for (ii = 0; ii < NF; ii++) // free memory 25.1 zfree(flist[ii]); zfree(flist); block = 0; return 1; } if (NF < 100) { // too few zmessageACK(Mwin,TX("only %d tile images found"),NF); for (ii = 0; ii < NF; ii++) // free memory 25.1 zfree(flist[ii]); if (NF) zfree(flist); block = 0; return 1; } for (ii = 0; ii < NF; ii++) { // save thumbnail filespecs tilefile[ii] = flist[ii]; tileimage[ii] = 0; } zfree(flist); Ntiles = NF; for (ii = 0; ii < NSMP; ii++) { // create tile images and tbusy[ii] = 1; // RGB color data per tile start_detached_thread(mosaic_thread1,&Nval[ii]); } for (ii = 0; ii < NSMP; ii++) { // wait for completion while(tbusy[ii]) { zmainsleep(0.01); snprintf(label,12,"%d",Ndone); // show count in dialog zdialog_stuff(zd,"labNtiles",label); } } block = 0; return 1; } if (strmatch(event,"image")) // apply tiles to mosaic image { if (! Ntiles) { block = 0; return 1; } edit_undo(); // reset to original image for (ii = 0; ii < NSMP; ii++) { // apply tiles to image tbusy[ii] = 1; start_detached_thread(mosaic_thread2,&Nval[ii]); } for (int ii = 0; ii < NSMP; ii++) { // wait for completion while(tbusy[ii]) { zmainsleep(0.01); Fpaint2(); // update image continuously } } zdialog_stuff(zd,"blend",0); // reset blend control if (sa_stat == sa_stat_fini) sa_postfix(); // if select area, restore unselected Fpaint2(); CEF->Fmods++; // image is modified CEF->Fsaved = 0; block = 0; return 1; } if (strmatch(event,"blend")) { if (! Ntiles) { block = 0; return 1; } zdialog_fetch(zd,"blend",blend); // get blend value 0-100 f1 = blend / 100.0; // base image part, 0.0 --> 1.0 f3 = 1.0 - f1; // tile image part, 1.0 --> 0.0 for (trow = 0; trow < Ehh/thh; trow++) // loop tile positions in base image for (tcol = 0; tcol < Eww/tww; tcol++) { for (tpy = 0; tpy < thh; tpy++) // loop tile pixels for (tpx = 0; tpx < tww; tpx++) { ipy = trow * thh + tpy; // corresponding image pixels ipx = tcol * tww + tpx; ii = Eww * ipy + ipx; // get tile used at image pixel ii = tilemap[ii]; if (ii < 0 || ii >= maxtiles) break; timage = tileimage[ii]; if (! timage) continue; tpix = timage + tpy * tww * 3 + tpx * 3; // input tile pixel pix1 = PXMpix(E1pxm,ipx,ipy); // input E1 image pixel pix3 = PXMpix(E3pxm,ipx,ipy); // output E3 image pixel pix3[0] = f1 * pix1[0] + f3 * tpix[0]; // replace image pixels with tile pixels pix3[1] = f1 * pix1[1] + f3 * tpix[1]; pix3[2] = f1 * pix1[2] + f3 * tpix[2]; } } if (sa_stat == sa_stat_fini) sa_postfix(); // if select area, restore unselected Fpaint2(); CEF->Fmods++; // image is modified CEF->Fsaved = 0; block = 0; return 1; } block = 0; return 1; } // thread to make tile images from thumbnails and tile RGB color data void * mosaic_thread1(void *arg) { using namespace mosaic_names; int index = *((int *) arg); PIXBUF *pxb1, *pxb2; GError *gerror = 0; int tpx, tpy; int tww1, thh1, tww2, thh2; int ii, row, rs; uint8 *tpixels, *tpix, *timage; uint8 *row1, *row2; float fred1, fgreen1, fblue1; float fred2, fgreen2, fblue2; float fred3, fgreen3, fblue3; float fred4, fgreen4, fblue4; float coeff; for (ii = index; ii < Ntiles; ii += NSMP) // loop tile image files { if (tileimage[ii]) zfree(tileimage[ii]); tileimage[ii] = 0; pxb1 = gdk_pixbuf_new_from_file_at_size(tilefile[ii],64,64,&gerror); // create pixbuf within 64x64 if (! pxb1) { printf("pixbuf error: %s \n",gerror->message); // message includes file name gerror = 0; continue; } tww1 = gdk_pixbuf_get_width(pxb1); // actual width, height (max. 64) thh1 = gdk_pixbuf_get_height(pxb1); g_object_unref(pxb1); if (tww1 < tww || thh1 < thh) continue; // unusable if (tww1 * thh < tww * thh1) { // tww1/thh1 < tww/thh tww2 = tww; // (too high for tww x thh) thh2 = tww * thh1 / tww1; } else { // tww1/thh1 > tww/thh thh2 = thh; // (too wide for tww x thh) tww2 = thh * tww1 / thh1; } pxb2 = gdk_pixbuf_new_from_file_at_size(tilefile[ii],tww2+1,thh2,&gerror); // tww2+1 required (see below) if (! pxb2) { printf("file: %s \n %s",tilefile[ii],gerror->message); gerror = 0; continue; } tpx = (tww2 - tww) / 2; // tww2 or thh2 offset for pixels tpy = (thh2 - thh) / 2; // copied to tww x thh tile image rs = gdk_pixbuf_get_rowstride(pxb2); tpixels = gdk_pixbuf_get_pixels(pxb2); timage = (uint8 *) zmalloc(tww * thh * 3,"mosaic"); // allocate memory for tww x thh pixels for (row = 0; row < thh; row++) { // copy pixbuf tww x thh section row1 = tpixels + rs * (row + tpy) + tpx * 3; row2 = timage + row * tww * 3; memcpy(row2,row1,tww * 3); // buffer-overflow unless (see above) } g_object_unref(pxb2); tileimage[ii] = timage; // save final tile image fred1 = fgreen1 = fblue1 = 0; fred2 = fgreen2 = fblue2 = 0; fred3 = fgreen3 = fblue3 = 0; fred4 = fgreen4 = fblue4 = 0; for (tpy = 0; tpy < thh/2; tpy++) // loop pixels in top left tile quadrant for (tpx = 0; tpx < tww/2; tpx++) { tpix = timage + tpy * tww * 3 + tpx * 3; fred1 += tpix[0]; // sum RGB values fgreen1 += tpix[1]; fblue1 += tpix[2]; } for (tpy = 0; tpy < thh/2; tpy++) // top right for (tpx = tww/2; tpx < tww; tpx++) { tpix = timage + tpy * tww * 3 + tpx * 3; fred2 += tpix[0]; fgreen2 += tpix[1]; fblue2 += tpix[2]; } for (tpy = thh/2; tpy < thh; tpy++) // bottom left for (tpx = 0; tpx < tww/2; tpx++) { tpix = timage + tpy * tww * 3 + tpx * 3; fred3 += tpix[0]; fgreen3 += tpix[1]; fblue3 += tpix[2]; } for (tpy = thh/2; tpy < thh; tpy++) // bottom right for (tpx = tww/2; tpx < tww; tpx++) { tpix = timage + tpy * tww * 3 + tpx * 3; fred4 += tpix[0]; fgreen4 += tpix[1]; fblue4 += tpix[2]; } coeff = 0.25 / (tww * thh); tileRGB1[ii][0] = coeff * fred1; // save tile mean RGB values tileRGB1[ii][1] = coeff * fgreen1; // for each quadrant tileRGB1[ii][2] = coeff * fblue1; tileRGB2[ii][0] = coeff * fred2; tileRGB2[ii][1] = coeff * fgreen2; tileRGB2[ii][2] = coeff * fblue2; tileRGB3[ii][0] = coeff * fred3; tileRGB3[ii][1] = coeff * fgreen3; tileRGB3[ii][2] = coeff * fblue3; tileRGB4[ii][0] = coeff * fred4; tileRGB4[ii][1] = coeff * fgreen4; tileRGB4[ii][2] = coeff * fblue4; Ndone++; // progress counter } tbusy[index] = 0; return 0; } // thread to apply best color-matched tile to each image position void * mosaic_thread2(void *arg) { using namespace mosaic_names; int index = *((int *) arg); int trow, tcol, tpx, tpy, ipx, ipy; int ii, bestii; uint8 *tpix, *timage; float *pix1, *pix3; float fred1, fgreen1, fblue1; float fred2, fgreen2, fblue2; float fred3, fgreen3, fblue3; float fred4, fgreen4, fblue4; float match, bestmatch; float coeff; for (trow = index; trow < Ehh/thh; trow += NSMP) // loop tile positions in base image for (tcol = 0; tcol < Eww/tww; tcol++) { fred1 = fgreen1 = fblue1 = 0; fred2 = fgreen2 = fblue2 = 0; fred3 = fgreen3 = fblue3 = 0; fred4 = fgreen4 = fblue4 = 0; for (tpy = 0; tpy < thh/2; tpy++) // loop pixels in top left tile quadrant for (tpx = 0; tpx < tww/2; tpx++) { ipy = trow * thh + tpy; // corresponding image pixels ipx = tcol * tww + tpx; pix1 = PXMpix(E1pxm,ipx,ipy); fred1 += pix1[0]; // sum image RGB values fgreen1 += pix1[1]; fblue1 += pix1[2]; } for (tpy = 0; tpy < thh/2; tpy++) // top right quadrant for (tpx = tww/2; tpx < tww; tpx++) { ipy = trow * thh + tpy; ipx = tcol * tww + tpx; pix1 = PXMpix(E1pxm,ipx,ipy); fred2 += pix1[0]; fgreen2 += pix1[1]; fblue2 += pix1[2]; } for (tpy = thh/2; tpy < thh; tpy++) // lower left quadrant for (tpx = 0; tpx < tww/2; tpx++) { ipy = trow * thh + tpy; ipx = tcol * tww + tpx; pix1 = PXMpix(E1pxm,ipx,ipy); fred3 += pix1[0]; fgreen3 += pix1[1]; fblue3 += pix1[2]; } for (tpy = thh/2; tpy < thh; tpy++) // lower right quadrant for (tpx = tww/2; tpx < tww; tpx++) { ipy = trow * thh + tpy; ipx = tcol * tww + tpx; pix1 = PXMpix(E1pxm,ipx,ipy); fred4 += pix1[0]; fgreen4 += pix1[1]; fblue4 += pix1[2]; } coeff = 0.25 / (tww * thh); fred1 = coeff * fred1; // mean image RGB values for fgreen1 = coeff * fgreen1; // each quadrant fblue1 = coeff * fblue1; fred2 = coeff * fred2; fgreen2 = coeff * fgreen2; fblue2 = coeff * fblue2; fred3 = coeff * fred3; fgreen3 = coeff * fgreen3; fblue3 = coeff * fblue3; fred4 = coeff * fred4; fgreen4 = coeff * fgreen4; fblue4 = coeff * fblue4; bestmatch = 0; bestii = 0; for (ii = 0; ii < Ntiles; ii++) // loop tile RGB values { if (! tileimage[ii]) continue; match = RGBmatch(fred1,fgreen1,fblue1, // 0..1 = zero..perfect match tileRGB1[ii][0],tileRGB1[ii][1],tileRGB1[ii][2]); match += RGBmatch(fred2,fgreen2,fblue2, tileRGB2[ii][0],tileRGB2[ii][1],tileRGB2[ii][2]); match += RGBmatch(fred3,fgreen3,fblue3, tileRGB3[ii][0],tileRGB3[ii][1],tileRGB3[ii][2]); match += RGBmatch(fred4,fgreen4,fblue4, tileRGB4[ii][0],tileRGB4[ii][1],tileRGB4[ii][2]); if (match > bestmatch) { bestmatch = match; // save best matching tile bestii = ii; } } ii = bestii; // best matching tile timage = tileimage[ii]; for (tpy = 0; tpy < thh; tpy++) // loop tile pixels for (tpx = 0; tpx < tww; tpx++) { ipy = trow * thh + tpy; // corresponding image pixels ipx = tcol * tww + tpx; tpix = timage + tpy * tww * 3 + tpx * 3; pix1 = PXMpix(E1pxm,ipx,ipy); pix3 = PXMpix(E3pxm,ipx,ipy); pix3[0] = tpix[0]; // replace image pixels with tile pixels pix3[1] = tpix[1]; pix3[2] = tpix[2]; ii = Eww * ipy + ipx; // save map of tile used tilemap[ii] = bestii; // at each image pixel } } tbusy[index] = 0; return 0; } // mouse function - called for mouse events inside image void mosaic_mousefunc() { using namespace mosaic_names; int ii; ch *tfile, *mfile; if (! LMclick) return; LMclick = 0; ii = Myclick * Eww + Mxclick; ii = tilemap[ii]; if (ii < 0) return; tfile = tilefile[ii]; mfile = thumb2imagefile(tfile); if (mfile) popup_image(mfile,MWIN,1,256); else popup_image(tfile,MWIN,1,256); return; } /**************************************************************************************/ // Add random noise to an image (can mask color banding) namespace add_noise_names { editfunc EFadd_noise; float size; // mean noise size, pixels (diameter) float level; // mean noise level, 0-100% float Pmap[22][22]; // pixel noise distribution map (max. size 20) } // menu function void m_add_noise(GtkWidget *, ch *menu) { using namespace add_noise_names; int add_noise_dialog_event(zdialog* zd, ch *event); void * add_noise_thread(void *); F1_help_topic = TX("ADD NOISE"); printf("m_add_noise \n"); EFadd_noise.menufunc = m_add_noise; EFadd_noise.menuname = "Add Noise"; EFadd_noise.Farea = 2; // select area usable EFadd_noise.threadfunc = add_noise_thread; // thread function if (! edit_setup(EFadd_noise)) return; // setup edit /*** ___________________________________ | Add Random Noise | | | | Noise Size [___] Level [___] | | | | [Reset] [Apply] [OK] [X] | |___________________________________| ***/ zdialog *zd = zdialog_new(TX("Add Random Noise"),Mwin,TX("Reset"),TX("Apply"),"OK","X",null); CEF->zd = zd; zdialog_add_widget(zd,"hbox","hbnoise","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labsize","hbnoise",TX("Noise Size"),"space=5"); zdialog_add_widget(zd,"zspin","size","hbnoise","1|20|1|2"); zdialog_add_widget(zd,"label","space","hbnoise",0,"space=8"); zdialog_add_widget(zd,"label","lablevel","hbnoise",TX("Level"),"space=5"); zdialog_add_widget(zd,"zspin","level","hbnoise","0|100|1|10"); size = 2; level = 10; zdialog_resize(zd,300,0); zdialog_run(zd,add_noise_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion function int add_noise_dialog_event(zdialog *zd, ch *event) { using namespace add_noise_names; if (strmatch(event,"done")) zd->zstat = 3; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 4; // from f_open() int rx, ry, irad; float r, frad; float F, sumF; if (zd->zstat) { if (zd->zstat == 1) { // [reset] thread_wait(); zd->zstat = 0; // keep dialog active edit_reset(); } else if (zd->zstat == 2) { // [apply] thread_wait(); zd->zstat = 0; // keep dialog active PXM_free(E3pxm); E3pxm = PXM_copy(E1pxm); thread_signal(); // perform the edit } else if (zd->zstat == 3) // [OK] commit edit { edit_addhist("size:%.0f level:%.0f",size,level); // edit parms > edit hist edit_done(0); } else edit_cancel(0); // discard edit return 1; } if (strstr("size level",event)) { zdialog_fetch(zd,"size",size); zdialog_fetch(zd,"level",level); frad = 0.5 + 0.5 * size; // frad: 1.0 1.5 2.0 2.5 ... 10.5 irad = int(frad); // irad: 1 1 2 2 ... 10 sumF = 0; for (ry = -irad; ry <= +irad; ry++) // compute distribution factors for for (rx = -irad; rx <= +irad; rx++) // noise centered at [irad][irad] { r = sqrtf(ry*ry + rx*rx); if (r >= frad) F = 0; else F = sqrtf(1.0 - r/frad); Pmap[rx+irad][ry+irad] = F; sumF += F; } for (ry = -irad; ry <= +irad; ry++) // normalize to sum = 1.0 for (rx = -irad; rx <= +irad; rx++) Pmap[rx+irad][ry+irad] /= sqrtf(sumF); } return 1; } // thread function - multiple working threads to update image void * add_noise_thread(void *) { using namespace add_noise_names; void * add_noise_wthread(void *arg); // worker thread if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // set up progress monitor else progress_setgoal(Eww * Ehh); do_wthreads(add_noise_wthread,NSMP); // do worker threads progress_setgoal(0); CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); // update window return 0; } // worker thread function void * add_noise_wthread(void *arg) { using namespace add_noise_names; int index = *((int *) arg); int px, py, ii, dist = 1; float *pix3; int rx, ry, irad; float frad, F; float Rn1, Gn1, Bn1, Rn2, Gn2, Bn2; int pskip = 0; frad = 0.5 + 0.5 * size; // frad: 1.0 1.5 2.0 2.5 ... 10.5 irad = int(frad); // irad: 1 1 2 2 ... 10 for (py = index+irad; py < Ehh-irad; py += NSMP) // loop all image pixels for (px = irad; px < Eww-irad; px++) { if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // outside pixel } Rn1 = 0.01 * level * (-1.0 + 2 * drandz()) * 127; // RGB noise levels for pixel Gn1 = 0.01 * level * (-1.0 + 2 * drandz()) * 127; Bn1 = 0.01 * level * (-1.0 + 2 * drandz()) * 127; for (ry = -irad; ry <= +irad; ry++) // noise size around pixel for (rx = -irad; rx <= +irad; rx++) { F = Pmap[rx+irad][ry+irad]; Rn2 = Rn1 * F; // spread noise around pixel Gn2 = Gn1 * F; Bn2 = Bn1 * F; pix3 = PXMpix(E3pxm,px+rx,py+ry); // input/output pixel pix3[0] += Rn2; // add noise pix3[1] += Gn2; pix3[2] += Bn2; RGBfix(pix3[0],pix3[1],pix3[2]); // stop underflow and overflow } if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; // exit thread } /**************************************************************************************/ // image set colors function // set no. of colors for R/G/B and/or total colors namespace set_colors_names { int Rcolors, Gcolors, Bcolors; // number of RGB colors, 0-256 int Tcolors; // total colors, R x G x B editfunc EFsetcolors; } // menu function void m_set_colors(GtkWidget *, ch *menu) { using namespace set_colors_names; int set_colors_dialog_event(zdialog *zd, ch *event); void * set_colors_thread(void *); F1_help_topic = TX("SET COLORS"); printf("m_set_colors \n"); EFsetcolors.menuname = "Set Colors"; EFsetcolors.menufunc = m_set_colors; EFsetcolors.FprevReq = 1; // use preview EFsetcolors.Farea = 2; // select area usable EFsetcolors.Fpaintedits = 1; // can use with paint edits EFsetcolors.Fscript = 1; // scripting supported EFsetcolors.threadfunc = set_colors_thread; // thread function if (! edit_setup(EFsetcolors)) return; // setup edit /*** _________________________________ | Set No. of Colors | | | | Red [__] Green [__] Blue [__] | | Total Colors [_____] | | | | [OK] [X] | |_________________________________| ***/ zdialog *zd = zdialog_new(TX("Set No. of Colors"),Mwin,"OK","X",null); EFsetcolors.zd = zd; zdialog_add_widget(zd,"hbox","hbrgb","dialog",0,"space=3"); zdialog_add_widget(zd,"label","Rlab","hbrgb",TX("Red"),"space=3"); zdialog_add_widget(zd,"zspin","Rcolors","hbrgb","1|256|1|6","space=3"); zdialog_add_widget(zd,"label","Glab","hbrgb",TX("Green"),"space=3"); zdialog_add_widget(zd,"zspin","Gcolors","hbrgb","1|256|1|6","space=3"); zdialog_add_widget(zd,"label","Blab","hbrgb",TX("Blue"),"space=3"); zdialog_add_widget(zd,"zspin","Bcolors","hbrgb","1|256|1|6","space=3"); zdialog_add_widget(zd,"hbox","hbtot","dialog",0,"space=3"); zdialog_add_widget(zd,"label","Tlab","hbtot",TX("Total Colors"),"space=3"); zdialog_add_widget(zd,"zspin","Tcolors","hbtot","1|1000000|1|216","space=3"); Rcolors = Gcolors = Bcolors = 6; // initial no. colors Tcolors = 216; // 6 * 6 * 6 zdialog_run(zd,set_colors_dialog_event,"save"); // run dialog, parallel thread_signal(); return; } // set_colors dialog event and completion function int set_colors_dialog_event(zdialog *zd, ch *event) { using namespace set_colors_names; int Tcolors2; if (strmatch(event,"focus")) return 1; if (strmatch(event,"apply")) event = "colors"; // from script if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (strmatch(event,"fullsize")) { // from select area edit_fullsize(); Eww = E3pxm->ww; Ehh = E3pxm->hh; if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } return 1; } if (zd->zstat) { if (zd->zstat == 1) { // done edit_fullsize(); // get full size image Eww = E3pxm->ww; Ehh = E3pxm->hh; if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } edit_addhist("set colors:%d/%d/%d",Rcolors,Gcolors,Bcolors); edit_done(0); // commit edit } else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"paint")) // mouse paint thread_signal(); if (strstr("Rcolors Gcolors Bcolors",event)) // RGB colors changed { zdialog_fetch(zd,"Rcolors",Rcolors); // get new RGB colors zdialog_fetch(zd,"Gcolors",Gcolors); zdialog_fetch(zd,"Bcolors",Bcolors); Tcolors = (Rcolors * Gcolors * Bcolors); // new total colors zdialog_stuff(zd,"Tcolors",Tcolors); thread_signal(); } if (strmatch(event,"Tcolors")) // total colors changed { zdialog_fetch(zd,"Tcolors",Tcolors2); // new total colors if (Tcolors2 > Tcolors) { Rcolors++; // increase RGB colors Gcolors++; Bcolors++; if (Rcolors > 256) Rcolors = 256; if (Gcolors > 256) Gcolors = 256; if (Bcolors > 256) Bcolors = 256; } else { Rcolors--; // decrease RGB colors Gcolors--; Bcolors--; if (Rcolors < 1) Rcolors = 1; if (Gcolors < 1) Gcolors = 1; if (Bcolors < 1) Bcolors = 1; } Tcolors = (Rcolors * Gcolors * Bcolors); // new total colors zdialog_stuff(zd,"Rcolors",Rcolors); // update dialog zdialog_stuff(zd,"Gcolors",Gcolors); zdialog_stuff(zd,"Bcolors",Bcolors); zdialog_stuff(zd,"Tcolors",Tcolors); thread_signal(); } return 0; } // set_colors thread function void * set_colors_thread(void *) { using namespace set_colors_names; int px, py, Fend; float *pix1, *pix3; int R1, G1, B1, R3, G3, B3; float blend; int rgb, ii, F1, F2; int Bsize[3]; int newcolor[3][256]; if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag Bsize[0] = 256 / Rcolors; // input colors per output color Bsize[1] = 256 / Gcolors; Bsize[2] = 256 / Bcolors; for (rgb = 0; rgb < 3; rgb++) // loop RGB colors for (ii = 0; ii < 256; ii++) // loop color value 0-255 { F1 = Bsize[rgb]; // bucket size e.g. 64 F2 = ii / F1 * F1; // bucket number e.g. 0, 1, 2, 3 if (F1 < 256) F2 = F2 + (1.0 * F2 / (256 - F1)) * (F1 - 1); // bucket value e.g. 0, if (F2 > 255) F2 = 255; if (F2 < 0) F2 = 0; newcolor[rgb][ii] = F2; // map input color to output color } get_edit_pixels_init(1,0); // initz. pixel loop while (true) // loop all edit pixels { Fend = get_edit_pixels(0,px,py,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; // input RGB values, 0-255 G1 = pix1[1]; B1 = pix1[2]; R3 = newcolor[0][R1]; G3 = newcolor[1][G1]; B3 = newcolor[2][B1]; if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { pix3[0] = blend * R3 + (1-blend) * pix3[0]; // pix3 --> mix reduced colors and pix3 pix3[1] = blend * G3 + (1-blend) * pix3[1]; pix3[2] = blend * B3 + (1-blend) * pix3[2]; } else if (blend < 0) { pix3[0] = -blend * pix1[0] + (1+blend) * pix3[0]; // pix3 --> pix1 pix3[1] = -blend * pix1[1] + (1+blend) * pix3[1]; pix3[2] = -blend * pix1[2] + (1+blend) * pix3[2]; } } else // full edit for image or area { pix3[0] = blend * R3 + (1-blend) * pix1[0]; // pix3 --> mix reduced colors and pix1 pix3[1] = blend * G3 + (1-blend) * pix1[1]; pix3[2] = blend * B3 + (1-blend) * pix1[2]; } } CEF->Fmods++; CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } /**************************************************************************************/ // Shift Colors menu function // Gradually shift selected RGB colors into other colors. namespace shiftcolors_names { editfunc EFshiftcolors; // edit function data float shiftred = 0.5, shiftgreen = 0.5, shiftblue = 0.5; } // menu function void m_shift_colors(GtkWidget *, ch *menu) { using namespace shiftcolors_names; int shiftcolors_dialog_event(zdialog* zd, ch *event); void * shiftcolors_thread(void *); F1_help_topic = TX("SHIFT COLORS"); printf("m_shift_colors \n"); EFshiftcolors.menuname = "Shift Colors"; EFshiftcolors.menufunc = m_shift_colors; EFshiftcolors.FprevReq = 1; // use preview EFshiftcolors.Farea = 2; // select area OK EFshiftcolors.Fscript = 1; // scripting supported EFshiftcolors.Fpaintedits = 1; // can use with paint edits EFshiftcolors.threadfunc = shiftcolors_thread; // thread function if (! edit_setup(EFshiftcolors)) return; // setup edit /*** ______________________________________ | Shift Colors | | | | red: green =======[]======= blue | | green: blue ==========[]==== red | | blue: red ======[]======== green | | all: all ========[]====== all | | | | [Reset] [OK] [X] | |______________________________________| ***/ zdialog *zd = zdialog_new(TX("Shift Colors"),Mwin,TX("Reset"),"OK","X",null); EFshiftcolors.zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"homog|space=3"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"homog|space=3"); zdialog_add_widget(zd,"vbox","vb3","hb1",0,"homog|space=3|expand"); zdialog_add_widget(zd,"vbox","vb4","hb1",0,"homog|space=3"); zdialog_add_widget(zd,"label","labr","vb1",TX("Red")); zdialog_add_widget(zd,"label","labr","vb1",TX("Green")); zdialog_add_widget(zd,"label","labr","vb1",TX("Blue")); zdialog_add_widget(zd,"label","labr","vb1",TX("All")); zdialog_add_widget(zd,"label","labg","vb2",TX("Green")); zdialog_add_widget(zd,"label","labb","vb2",TX("Blue")); zdialog_add_widget(zd,"label","labr","vb2",TX("Red")); zdialog_add_widget(zd,"label","laba","vb2",TX("All")); zdialog_add_widget(zd,"hscale2","red","vb3","0|1|0.001|0.5"); zdialog_add_widget(zd,"hscale2","green","vb3","0|1|0.001|0.5"); zdialog_add_widget(zd,"hscale2","blue","vb3","0|1|0.001|0.5"); zdialog_add_widget(zd,"hscale2","all","vb3","0|1|0.001|0.5"); zdialog_add_widget(zd,"label","labb","vb4",TX("Blue")); zdialog_add_widget(zd,"label","labr","vb4",TX("Red")); zdialog_add_widget(zd,"label","labg","vb4",TX("Green")); zdialog_add_widget(zd,"label","laba","vb4",TX("All")); zdialog_rescale(zd,"red",0,0.5,1); // expand scale around neutral values zdialog_rescale(zd,"green",0,0.5,1); zdialog_rescale(zd,"blue",0,0.5,1); zdialog_rescale(zd,"all",0,0.5,1); shiftred = shiftgreen = shiftblue = 0.5; // neutral values zdialog_resize(zd,400,0); zdialog_run(zd,shiftcolors_dialog_event,"save"); // run dialog - parallel return; } // shift color dialog event and completion function int shiftcolors_dialog_event(zdialog *zd, ch *event) { using namespace shiftcolors_names; float shiftall; if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (strmatch(event,"fullsize")) { // from select area if (! CEF->Fpreview) return 1; edit_fullsize(); if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } return 1; } if (zd->zstat) { if (zd->zstat == 1) { // reset zd->zstat = 0; // keep dialog active zdialog_stuff(zd,"red",0.5); zdialog_stuff(zd,"green",0.5); zdialog_stuff(zd,"blue",0.5); zdialog_stuff(zd,"all",0.5); edit_reset(); return 1; } if (zd->zstat == 2) { // done edit_fullsize(); // get full size image if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } edit_addhist("red:%.3f green:%.3f blue:%.3f", // edit parms > edit hist shiftred,shiftgreen,shiftblue); edit_done(0); // commit edit } else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"focus")) return 1; if (strmatch(event,"all")) { zdialog_fetch(zd,"all",shiftall); shiftred = shiftgreen = shiftblue = shiftall; zdialog_stuff(zd,"red",shiftred); zdialog_stuff(zd,"green",shiftgreen); zdialog_stuff(zd,"blue",shiftblue); } zdialog_fetch(zd,"red",shiftred); zdialog_fetch(zd,"green",shiftgreen); zdialog_fetch(zd,"blue",shiftblue); if (zstrstr("red green blue all apply paint",event)) // trigger update thread thread_signal(); return 1; } // thread function - launch multiple working threads to update image void * shiftcolors_thread(void *) { using namespace shiftcolors_names; void * shiftcolors_wthread(void *arg); // worker thread if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(shiftcolors_wthread,NSMP); // do worker threads CEF->Fmods++; // image modified CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } void * shiftcolors_wthread(void *arg) // worker thread function { using namespace shiftcolors_names; int index = *((int *) (arg)); int px, py, Fend; float *pix1, *pix3; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float lossR, lossG, lossB, gainR, gainG, gainB; float shift, move; float blend; while (true) { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; G3 = pix3[1]; B3 = pix3[2]; lossR = lossG = lossB = 0; gainR = gainG = gainB = 0; shift = shiftred; // red shift: green <-- red --> blue if (shift <= 0.5) { // 0.0 ... 0.5 move = R1 * 2.0 * (0.5 - shift); lossR += move; gainG += move; } if (shift > 0.5) { // 0.5 ... 1.0 move = R1 * 2.0 * (shift - 0.5); lossR += move; gainB += move; } shift = shiftgreen; // green shift: blue <-- green --> red if (shift <= 0.5) { // 0.0 ... 0.5 move = G1 * 2.0 * (0.5 - shift); lossG += move; gainB += move; } if (shift > 0.5) { // 0.5 ... 1.0 move = G1 * 2.0 * (shift - 0.5); lossG += move; gainR += move; } shift = shiftblue; // blue shift: red <-- blue --> green if (shift <= 0.5) { // 0.0 ... 0.5 move = B1 * 2.0 * (0.5 - shift); lossB += move; gainR += move; } if (shift > 0.5) { // 0.5 ... 1.0 move = B1 * 2.0 * (shift - 0.5); lossB += move; gainG += move; } R9 = R1 - lossR + gainR; // output pixel G9 = G1 - lossG + gainG; B9 = B1 - lossB + gainB; RGBfix(R9,G9,B9); if (Fpaintedits) // mouse paint edit { if (blend > 0) { // increase edit R3 = blend * R9 + (1-blend) * R3; G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { // decrease edit R3 = -blend * R1 + (1+blend) * R3; G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full image edit { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // alien colors - displace hue by an angle that varies over the image namespace alien_colors_names { editfunc EFaliencolors; float BLsz, Ampl; // block size, amplitude float Frand[200][200]; // random numbers #define maxblocks 200 // max. rows and cols } // menu function void m_alien_colors(GtkWidget *, ch *menu) { using namespace alien_colors_names; int alien_colors_dialog_event(zdialog* zd, ch *event); void * alien_colors_thread(void *); F1_help_topic = TX("ALIEN COLORS"); printf("m_alien_colors \n"); EFaliencolors.menuname = "Alien Colors"; EFaliencolors.menufunc = m_alien_colors; EFaliencolors.Farea = 2; // select area usable EFaliencolors.threadfunc = alien_colors_thread; // preview mode not used - do not replace pattern when [OK] pressed if (! edit_setup(EFaliencolors)) return; /*** __________________________ | Alien Colors | | | | blocksize [___] | | amplitude [___] | | | | [Apply] [OK] [X] | |__________________________| ***/ zdialog *zd = zdialog_new(TX("Alien Colors"),Mwin,TX("Apply"),"OK","X",null); CEF->zd = zd; zdialog_add_widget(zd,"hbox","hbbsz","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labbsz","hbbsz",TX("blocksize"),"space=5"); zdialog_add_widget(zd,"zspin","BLsz","hbbsz","10|1000|1|100"); zdialog_add_widget(zd,"hbox","hbamp","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labamp","hbamp",TX("amplitude"),"space=5"); zdialog_add_widget(zd,"zspin","Ampl","hbamp","0.0|1.0|0.01|1.0"); zdialog_load_inputs(zd); // restore previous inputs zdialog_run(zd,alien_colors_dialog_event,"save"); // run dialog - parallel zdialog_send_event(zd,"BLsz"); // initial image return; } // alien dialog event and completion function int alien_colors_dialog_event(zdialog *zd, ch *event) // alien dialog event function { using namespace alien_colors_names; if (strmatch(event,"focus")) return 1; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zstrstr("BLsz Ampl",event)) { zdialog_fetch(zd,"BLsz",BLsz); // get user inputs zdialog_fetch(zd,"Ampl",Ampl); thread_signal(); // calculate } if (zd->zstat) { if (zd->zstat == 1) { // [Apply] thread_signal(); zd->zstat = 0; } else if (zd->zstat == 2) edit_done(0); // [OK] else edit_cancel(0); // [ X ] } return 1; } // thread function - multiple working threads to update image void * alien_colors_thread(void *) { using namespace alien_colors_names; void * alien_colors_wthread(void *); for (int ii = 0; ii < maxblocks; ii++) // populate random values for (int jj = 0; jj < maxblocks; jj++) Frand[ii][jj] = drandz(); do_wthreads(alien_colors_wthread,NSMP); // worker threads CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); // update window return 0; } void * alien_colors_wthread(void *arg) // working threads { using namespace alien_colors_names; int index = *((int *) (arg)); int px, py; int row, col, row1, col1, row2, col2; int maxrow, maxcol, bsize, edist = 0; float d1, d7, dx, dy; float W0, W1, W2, W3, W4, W5, W6, W7, W8, Wsum; float R1, G1, B1, R3, G3, B3, H, S, L; float theta; float *pix1, *pix3; bsize = BLsz; // block size if (Eww / bsize >= maxblocks) bsize = Eww / (maxblocks - 1); // stop > maxblocks rows or cols if (Ehh / bsize >= maxblocks) bsize = Ehh / (maxblocks - 1); maxrow = 1 + Ehh / bsize; maxcol = 1 + Eww / bsize; for (py = index; py < Ehh; py += NSMP) for (px = 0; px < Eww; px++) { if (sa_stat == sa_stat_fini) { // select area active int ii = py * Eww + px; edist = sa_pixmap[ii]; // distance from edge if (! edist) continue; // pixel outside area } d1 = py - py / bsize * bsize; // y coordinate within block d7 = px - px / bsize * bsize; // x coordinate d1 = d1 / bsize; // rescale, 0 .. 1 d7 = d7 / bsize; dx = d7 - 0.5; // distance from pixel to center dy = d1 - 0.5; // of 9 block group W0 = sqrtf(dx*dx + dy*dy); dx = d7 - 0.5; dy = d1 + 0.5; W1 = sqrtf(dx*dx + dy*dy); dx = 1.5 - d7; dy = d1 + 0.5; W2 = sqrtf(dx*dx + dy*dy); dx = 1.5 - d7; dy = 0.5 - d1; W3 = sqrtf(dx*dx + dy*dy); dx = 1.5 - d7; dy = 1.5 - d1; W4 = sqrtf(dx*dx + dy*dy); dx = 0.5 - d7; dy = 1.5 - d1; W5 = sqrtf(dx*dx + dy*dy); dx = d7 + 0.5; dy = 1.5 - d1; W6 = sqrtf(dx*dx + dy*dy); dx = d7 + 0.5; dy = 0.5 - d1; W7 = sqrtf(dx*dx + dy*dy); dx = d7 + 0.5; dy = d1 + 0.5; W8 = sqrtf(dx*dx + dy*dy); W0 = 1.5 - W0; // block weight: W1 = 1.5 - W1; // max. distance - actual W2 = 1.5 - W2; // closer blocks have more weight W3 = 1.5 - W3; W4 = 1.5 - W4; W5 = 1.5 - W5; W6 = 1.5 - W6; W7 = 1.5 - W7; W8 = 1.5 - W8; if (W2 < 0) W2 = 0; // corners may go negative if (W4 < 0) W4 = 0; if (W6 < 0) W6 = 0; if (W8 < 0) W8 = 0; Wsum = W0 + W1 + W2 + W3 + W4 + W5 + W6 + W7 + W8; // sum of weights W0 = W0 / Wsum; // normalize to make sum = 1 W1 = W1 / Wsum; W2 = W2 / Wsum; W3 = W3 / Wsum; W4 = W4 / Wsum; W5 = W5 / Wsum; W6 = W6 / Wsum; W7 = W7 / Wsum; W8 = W8 / Wsum; row = py / bsize; // block[row][col] for this px/py col = px / bsize; row1 = row2 = row; col1 = col2 = col; if (row > 0) row1 = row - 1; if (row < maxrow) row2 = row + 1; if (col > 0) col1 = col - 1; if (col < maxcol) col2 = col + 1; W0 = W0 * Frand[col][row]; // compute random for pixel from W1 = W1 * Frand[col][row1]; // block randoms * weights W2 = W2 * Frand[col2][row1]; W3 = W3 * Frand[col2][row]; W4 = W4 * Frand[col2][row2]; W5 = W5 * Frand[col][row2]; W6 = W6 * Frand[col1][row2]; W7 = W7 * Frand[col1][row]; W8 = W8 * Frand[col1][row1]; theta = W0 + W1 + W2 + W3 + W4 + W5 + W6 + W7 + W8; // hue angle change theta = theta * 2.0 * Ampl - Ampl; // scale -Ampl ... +Ampl pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; G1 = pix1[1]; B1 = pix1[2]; RGBtoHSL(0.0039*R1, 0.0039*G1, 0.0039*B1, H,S,L); H = H + 180 * theta; // displace H by -90 ... +90 if (H < 0) H += 360.0; else if (H >= 360.0) H -= 360.0; HSLtoRGB(H,S,L,R3,G3,B3); R3 *= 255.0; G3 *= 255.0; B3 *= 255.0; pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; } return 0; // exit thread } /**************************************************************************************/ // process image using a custom kernel namespace anykernel_names { int kernsize = 5; // kernel size, N x N float fmpyer = 1.0; // multiplier int fadder = 0; // adder int kernel[15][15]; // up to 15 x 15 editfunc EFanykernel; } void m_anykernel(GtkWidget *, ch *menu) // menu function { using namespace anykernel_names; int anykernel_make_dialog(void); void * anykernel_thread(void *); F1_help_topic = TX("CUSTOM KERNEL"); printf("m_anykernel \n"); EFanykernel.menuname = "Custom Kernel"; EFanykernel.menufunc = m_anykernel; EFanykernel.Farea = 2; // select area usable EFanykernel.Fpaintedits = 1; // use with paint edits OK EFanykernel.Fscript = 1; // scripting supported EFanykernel.threadfunc = anykernel_thread; // thread function if (! edit_setup(EFanykernel)) return; // setup edit anykernel_make_dialog(); return; } // build the input dialog with the requested array size int anykernel_make_dialog() { using namespace anykernel_names; int anykernel_dialog_event(zdialog *zd, ch *event); zdialog *zd; int row, col; ch rowname[16], cellname[30]; /*** __________________________________________ | Custom Kernel | | | | Kernel size [___] | | | | [____] [____] [____] [____] [____] ... | | [____] [____] [____] [____] [____] ... | | [____] [____] [____] [____] [____] ... | | [____] [____] [____] [____] [____] ... | | [____] [____] [____] [____] [____] ... | | [____] [____] [____] [____] [____] ... | | ... ... ... ... ... | | | | multiply [____] add [____] | | | | Data file [Load] [Save] | | | | [Reset] [Apply] [OK] [X] | |__________________________________________| ***/ zd = zdialog_new(TX("Custom Kernel"),Mwin,TX("Reset"),TX("Apply"),"OK","X",null); EFanykernel.zd = zd; zdialog_add_widget(zd,"hbox","hbkern","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labkern","hbkern",TX("Kernel size"),"space=3"); zdialog_add_widget(zd,"zspin","kernsize","hbkern","3|15|2|5","size=3"); zdialog_stuff(zd,"kernsize",kernsize); for (row = 1; row <= kernsize; row++) // make entry cell matrix { snprintf(rowname,16,"row%02d",row); zdialog_add_widget(zd,"hbox",rowname,"dialog","space=5"); for (col = 1; col <= kernsize; col++) { snprintf(cellname,30,"cell%02d%02d",col,row); zdialog_add_widget(zd,"zspin",cellname,rowname,"-99|+99|1|0","size=4|space=4"); } } zdialog_add_widget(zd,"hbox","hbf","dialog",0,"space=5"); // multiplier and adder zdialog_add_widget(zd,"label","labmul","hbf",TX("multiply"),"space=3"); zdialog_add_widget(zd,"zspin","fmul","hbf","0|99|0.01|1","size=5"); zdialog_add_widget(zd,"label","space","hbf",0,"space=3"); zdialog_add_widget(zd,"label","labadd","hbf",TX("add"),"space=3"); zdialog_add_widget(zd,"zspin","fadd","hbf","-999|+999|1|0","size=5"); zdialog_add_widget(zd,"hbox","hbfile","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labfile","hbfile",TX("Data file"),"space=3"); zdialog_add_widget(zd,"button","load","hbfile",TX("Load"),"space=3"); zdialog_add_widget(zd,"button","save","hbfile",TX("Save"),"space=3"); zdialog_add_widget(zd,"hbox","hbfname","dialog",0,0); zdialog_add_widget(zd,"label","file","hbfname",TX("File:"),"space=3"); zdialog_add_widget(zd,"label","filename","hbfname",0,"space=3"); zdialog_run(zd,anykernel_dialog_event,"parent"); // run dialog - parallel return 1; } // dialog event and completion callback function int anykernel_dialog_event(zdialog *zd, ch *event) { using namespace anykernel_names; int row, col, err, nn, kernsize2; float value; ch cellname[20]; ch *filename, dirname[200]; FILE *fid; ch *pp; if (strmatch(event,"focus")) return 1; if (strmatch(event,"apply")) zd->zstat = 2; // from script if (strmatch(event,"paint")) zd->zstat = 2; // from paint edits mouse if (strmatch(event,"done")) zd->zstat = 3; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 4; // from f_open() if (zd->zstat) { if (zd->zstat == 1) // reset { zd->zstat = 0; // keep dialog active edit_reset(); return 1; } if (zd->zstat == 2) // apply { zd->zstat = 0; // keep dialog active for (row = 1; row <= kernsize; row++) // get kernel values from dialog for (col = 1; col <= kernsize; col++) { snprintf(cellname,20,"cell%02d%02d",col,row); zdialog_fetch(zd,cellname,value); kernel[row-1][col-1] = value; } zdialog_fetch(zd,"fmul",fmpyer); zdialog_fetch(zd,"fadd",fadder); thread_signal(); // start thread return 1; } if (zd->zstat == 3) // done - commit edit { zdialog_save_last_widgets(zd,null,"custom_kernel"); edit_done(0); } else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"kernsize")) // change kernel size { zdialog_fetch(zd,"kernsize",kernsize2); if (kernsize2 == kernsize) return 1; kernsize = kernsize2; zdialog_free(zd); anykernel_make_dialog(); return 1; } if (strmatch(event,"save")) // save kernel data to a file zdialog_save_widgets(zd,null,"custom_kernel",null); if (strmatch(event,"load")) // load kernel data from a file { snprintf(dirname,200,"%s/custom_kernel",get_zhomedir()); // folder for data files filename = zgetfile(TX("Load settings from file"),MWIN,"file",dirname,0); // open data file if (! filename) return 1; // user cancel fid = fopen(filename,"r"); // open file if (! fid) { zmessageACK(Mwin,"%s \n %s",filename,strerror(errno)); zfree(filename); return 1; } nn = fscanf(fid,"kernsize == %d",&kernsize2); // read 1st record, "kernsize == N" fclose(fid); if (nn != 1) { zmessageACK(Mwin,TX("file format error: %s"),filename); zfree(filename); return 1; } if (kernsize2 != kernsize) { // change kernel size to match file zdialog_free(zd); kernsize = kernsize2; anykernel_make_dialog(); zd = EFanykernel.zd; // zd has changed } fid = fopen(filename,"r"); // re-open file and load kernel data err = zdialog_load_widgets(zd,null,"custom_kernel",fid); if (err) zmessageACK(Mwin,TX("file format error: %s"),filename); fclose(fid); pp = strrchr(filename,'/'); zdialog_stuff(zd,"filename",pp+1); zfree(filename); } return 1; } // image anykernel thread function void * anykernel_thread(void *) { using namespace anykernel_names; void * anykernel_wthread(void *arg); int rad = kernsize / 2; if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag get_edit_pixels_init(NSMP,rad); // initz. pixel loop do_wthreads(anykernel_wthread,NSMP); // worker threads CEF->Fmods++; CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } void * anykernel_wthread(void *arg) // worker thread function { using namespace anykernel_names; int index = *((int *) arg); int px, py, qx, qy; int rad, Fend; float kval, blend; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float *pix1, *pix3, *pix9; rad = kernsize / 2; // image margins, not processed while (true) // loop all edit pixels { Fend = get_edit_pixels(index,px,py,blend); // paint edits if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; // input RGB values G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; // current output RGB G3 = pix3[1]; B3 = pix3[2]; R9 = G9 = B9 = 0; // new output RGB for (qy = -rad; qy <= +rad; qy++) // loop pixels around (px,py) for (qx = -rad; qx <= +rad; qx++) // mapped to kernel { pix9 = PXMpix(E1pxm,px+qx,py+qy); // pixel kval = kernel[qy+rad][qx+rad]; // kernel value for pixel R9 += kval * pix9[0]; // sum (kernel * pixel value) per RGB G9 += kval * pix9[1]; B9 += kval * pix9[2]; } if (fmpyer != 1.0) { // apply multiplier R9 = fmpyer * R9; G9 = fmpyer * G9; B9 = fmpyer * B9; } if (fadder != 0) { // apply adder R9 += fadder; G9 += fadder; B9 += fadder; } RGBfix(R9,G9,B9); // output RGB if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or select area { R3 = blend * R9 + (1-blend) * R1; // output = blend of input and output G3 = blend * G9 + (1-blend) * G1; // (select area edge blending) B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; } return 0; } fotocx/f.gallery.cc0000664000175000017500000065650415247006660013242 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit - folder navigation and thumbnail gallery functions gallery() create/update/search/display an image gallery navi:: gallery_comp gallery sort compare function filename_comp gallery sort file name compare function gallery_paint paint thumbnail gallery, resizable thumbnails gallery_paintmeta same, metadata report from search function gallery_paintmeta2 same, thumbnails with basic metadata dir_filecount paint - get folder subdir and image file counts draw_text paint - write text over thumbnail images gallery_navibutts add folder navigation buttons menufuncx gallery menu: sort/zoom/scroll ... gallery_scroll scroll gallery in rows and pages navibutt_clicked open new gallery from clicked folder newtop open new gallery from clicked TOP entry mouse_event process gallery thumbnail clicks gallery_dragfile process thumbnail dragged gallery_dropfile process thumbnail dropped (add new file, arrange album) KBaction process gallery KB actions: zoom, page, top, end gallery_memory save/recall gallery sort and position set_gwin_title update the gallery window title bar prev_next_file get previous/next file from curr_file in current gallery prev_next_gallery get gallery's previous or next gallery file_position get gallery file position image_file_type get file type (folder, image, RAW, thumbnail, other) thumb2imagefile get corresponding image file for given thumbnail file image2thumbfile get corresponding thumbnail file for given image file thumbfile_OK check if thumbnail file missing or stale get_folder_pixbuf get 'folder' pixbuf image get_broken_pixbuf get 'broken file' pixbuf image update_thumbfile refresh thumbnail file if missing or stale thumbfile_set_mod_time set thumbnail file mod time from image file delete_thumbfile delete thumbnail disk file get_thumb_pixbuf get thumbnail pixbuf for given image file gallery_popimage popup a larger image from a clicked thumbnail select_1file one file selection function and dialog select_2files two file selection function and dialog select_files multiple file selection function and dialog m_thumbview gallery thumbnail view m_metaview gallery metadata view m_recentfiles show gallery of recently viewed files add_recent_file add an image file to the list of recent files m_newest_files show gallery of newest image files m_gallery_sort sort gallery by file, date, size ... m_gallery_filter filter gallery for newest, oldest, text match m_current_file_folder set gallery to folder of current image file m_recent_folders set gallery to selected recently used folder add_recent_folder add current folder to top of recent folder list m_search_results show gallery of latest search results m_folder_tree tree view, expand/contract, click for gallery view m_select_files select files for album and batch functions m_bookmarks goto selected bookmark, edit bookmarks m_edit_bookmarks edit bookmarks m_current_album dummy menu for KB shortcut "Current Album" popup_image show an image in a small popup window ***************************************************************************************/ #define EX extern // disable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) /**************************************************************************************/ /*** gallery index in fotocx.h typedef struct { current gallery file list in memory ch *file; /folder.../filename int folder; flag, file is a folder ch fdate[16]; file date: yyyymmddhhmmss ch pdate[16]; photo date: yyyymmddhhmmss uint fsize; file size, bytes uint psize; image size, pixels ch *mdata1; fixed text for metadata report ch *mdata2; variable text for metadata report } Gindex_t; ***/ namespace navi { #define maxgallerylevs 60 // max gallery navigation levels #define TEXTWIN GTK_TEXT_WINDOW_TEXT // GDK window of GTK text view #define NEVER GTK_POLICY_NEVER #define ALWAYS GTK_POLICY_ALWAYS #define thumbxx 5 // thumbx array size int thumbx[5] = { 512, 360, 256, 180, 128 }; // thumbnail sizes int fontx[5] = { 0, -1, -1, -2, -3 }; // font size wrt appfont Gindex_t *Gindex = 0; // gallery index int GFlock = 0; // gallery index lock int TClock = 0; // thumbnail cache lock int Gfiles = 0; // gallery files (incl. subfolders) int Gfolders = 0; // gallery subfolder count int Gimages = 0; // gallery image file count int preload_start = 0; // 1st file in gallery to check int Gmdrows = 0; // text rows in metadata list ch *galleryname = 0; // physical folder or file list filename GTYPE gallerytype; // gallery type: folder, recent, etc. GSORT gallerysort; // gallery sort: f.name, f.date, p.date GSEQ galleryseq; // gallery sort: ascending/descending int galleryposn = 0; // scroll-to file position (Nth) int Fthumbview = 1; // gallery view mode 1/2 = normal/metadata GtkWidget *gallerybutt[60]; // gallery navi buttons [aaa] [bbb] ... ch *gallerypath[60]; // corresp. folder names aaa bbb ... GtkWidget *gallerylabel = 0; // gallery label (album name ...) int gallerypainted = 0; // gallery is finished painting int xwinW, xwinH; // gallery window current size int thumbsize = 256; // initial thumbnail image size int thumbW, thumbH; // gallery window thumbnail cell size int fontsize = 10; // font size for gallery text int texthh; // vertical space req. for metadata text int xrows, xcols; // gallery window thumbnail rows, cols int margin = 5; // cell margin from left and top edge int genthumbs = 0; // count newly generated thumbnails int scrollposn = 0; // scroll position int maxscroll; // max. scroll position ch *drag_file = 0; // selected thumbnail (file) int drag_posn = -1; // drag from position int gallery_scrollgoal = -1; // gallery scroll goal position int gallery_scrollspeed = 0; // gallery scroll speed pixels/second zlist_t *ZLrecent_folders = 0; // list of recently used folders // private functions void xxrec_to_gindex(xxrec_t *xxrec, Gindex_t *gindex); // fill gindex data from xxrec data int gallery_comp(ch *rec1, ch *rec2); // gallery record compare for sort options int filename_comp(ch *file1, ch *file2); // special file name compare function int gallery_paint(GtkWidget *, cairo_t *); // gallery window paint, resizable thumbnails int gallery_paintmeta(GtkWidget *Gdrawin, cairo_t *cr); // same, metadata report from search func. int gallery_paintmeta2(GtkWidget *Gdrawin, cairo_t *cr); // same, thumbnails with basic metadata void dir_filecount(ch *dirname, int &ndir, int &nfil); // get subdir and image file counts void draw_text(cairo_t *cr, ch *text, int x, int y, int ww); // draw text in gallery window void gallery_navibutts(); // create navigation buttons in top panel void menufuncx(GtkWidget *, ch *menu); // function for gallery window buttons void gallery_scroll(int position, int speed); // start gallery slow scroll to position int gallery_scrollfunc(void *); // gallery scroll timer function void navibutt_clicked(GtkWidget *, int *level); // set gallery via click navigation button void newtop(GtkWidget *widget, GdkEventButton *event); // function for [TOP] button void newtop_menu_event(GtkWidget *, ch *); // [TOP] menu response function int mouse_event(GtkWidget *widget, GdkEvent *event, void *); // gallery window mouse event function ch * gallery_dragfile(); // start drag-drop, set the file void gallery_dropfile(int mousex, int mousey, ch *file); // accept drag-drop file at position int KBpress(GtkWidget *, GdkEventKey *, void *); // gallery window key press event } using namespace zfuncs; using namespace navi; /************************************************************************************** ch * gallery(ch *filez, ch *action, int Nth) public function to create/update image gallery (thumbnail window) Make a scrolling window of thumbnails for a folder or list of files Handle window buttons (up row, down page, open file, etc.) Call external functions in response to thumbnail mouse-clicks. filez: image file or folder, or file with list of image files filez action Nth ----- ------ --- file init * folder gallery, file name sort (folders first, last vers. option) file initF * file list gallery, no sort * sort -2 sort and position via gallery_memory() * sort -1 sort and position from current params file paint N paint, position = file (use N if valid for file) 0 paint N paint, position = N 0 paint -1 paint, no change in position file insert N add file to gallery at position N (folder or unsorted album) * delete N delete Nth file in gallery list * get N return file N in gallery list or null if N > last file update * update gallery index (Gindex[*]) from image index in memory Returned values: get: filespec returned filespec is subject for zfree(). getR: filespec reference no zfree() needed thumbnail click functions: gallery_Lclick_func() default function (open file) gallery_Rclick_popup() default function (popup menu) select_files_Lclick_func() select_files active select_files_Rclick_func() select_files active edit_bookmarks_Lclick_func edit bookmarks active ***************************************************************************************/ ch * gallery(ch *filez, ch *action, int Nth) { ch *file, *file2; ch *pp, *pp1, *pp2; ch buff[XFCC]; ch **Flist = 0; xxrec_t *xxrec; static int ftf = 1; int err, ii, jj, kk; int cc, cc1, cc2, fposn; int NF; FTYPE ftype; FILE *fid; while (! resource_lock(GFlock)) zsleep(0.0001); // lock gallery file list if (ftf) { ftf = 0; cc = maxgallery * sizeof(Gindex_t); Gindex = (Gindex_t *) zmalloc(cc,"gallery"); // allocate gallery index Gfiles = Gfolders = Gimages = 0; // no files yet } if (strmatchN(action,"init",4)) // init or initF { if (! filez && gallerytype == FOLDER) filez = galleryname; // null file: refresh current gallery if (! filez) goto return0; zstrcopy(galleryname,filez,"gallery"); // new gallery name NF = Gfiles; // current file count Gfiles = Gfolders = Gimages = 0; // no new files yet for (ii = 0; ii < NF; ii++) { // free prior gallery index if (Gindex[ii].file) zfree(Gindex[ii].file); if (Gindex[ii].mdata1) zfree(Gindex[ii].mdata1); if (Gindex[ii].mdata2) zfree(Gindex[ii].mdata2); Gindex[ii].file = Gindex[ii].mdata1 = Gindex[ii].mdata2 = 0; Gindex[ii].folder = 0; } } if (strmatch(action,"init")) // initz. from given file or folder { if (! dirfile(galleryname)) { // bad folder? (may be member file) pp = (ch *) strrchr(galleryname,'/'); // try parent folder if (pp) *pp = 0; if (! dirfile(galleryname)) goto return0; // give up, empty file list } cc = strlen(galleryname) - 1; // remove trailing '/' if (cc > 1 && galleryname[cc] == '/') galleryname[cc] = 0; // but not if root folder '/' err = find_imagefiles(galleryname,1+8+32,Flist,NF); // find folders + files, one level 25.2 if (err) { zmessageACK(Mwin,strerror(errno)); goto return0; } for (ii = 0; ii < NF; ii++) { file = Flist[ii]; pp = strrchr(file,'/'); if (pp && (strmatch(pp,"/.") || strmatch(pp,"/.."))) { // omit folders /. and /.. zfree(file); continue; } if (! Fshowhidden && pp && *(pp+1) == '.') continue; // suppress hidden files 26.4 if (Gfiles == maxgallery) { // too many files zmessageACK(Mwin,TX("gallery truncated to %d images"),maxgallery); break; } ftype = image_file_type(file); if (ftype == FDIR) // subfolder { Gindex[Gfiles].file = file; // add to gallery index Gindex[Gfiles].folder = 1; // mark folder Gindex[Gfiles].fdate[0] = 0; // no file date Gindex[Gfiles].pdate[0] = 0; // no photo date Gindex[Gfiles].psize = 0; // no image size Gfiles++; Gfolders++; } else if (ftype == IMAGE || ftype == RAW || ftype == VIDEO) // supported image file type { xxrec = get_xxrec(file); if (! xxrec) { // should not happen zfree(file); continue; } Gindex[Gfiles].file = file; Gindex[Gfiles].folder = 0; xxrec_to_gindex(xxrec,&Gindex[Gfiles]); // get data from file xxrec_tab[] Gfiles++; Gimages++; } else zfree(file); // thumbnail or other kind of file if (Gfiles == maxgallery) { // too many files zmessageACK(Mwin,TX("gallery truncated to %d images"),maxgallery); break; } } if (Flist) zfree(Flist); gallerytype = FOLDER; // gallery type = folder gallerysort = FNAME; // sort Gindex by file name ascending galleryseq = ASCEND; galleryposn = 0; add_recent_folder(galleryname); // add gallery to recent list if (Gfiles > 1) HeapSort((ch *) Gindex, sizeof(Gindex_t), Gfiles, gallery_comp); if (Flastversion) // keep last versions only (user setting) { ii = Gfolders; // skip folders jj = ii + 1; kk = 0; while (jj < Gfiles) { pp1 = strrchr(Gindex[jj].file,'.'); // /.../filename.vNN.ext if (pp1 && pp1[-4] == '.' && pp1[-3] == 'v') { // | cc1 = pp1 - Gindex[jj].file - 3; pp2 = strrchr(Gindex[ii].file,'.'); if (! pp2) cc2 = 0; else { cc2 = pp2 - Gindex[ii].file + 1; // /.../filename.ext if (pp2[-4] == '.' && pp2[-3] == 'v') cc2 -= 4; // | } if (cc1 == cc2 && strmatchN(Gindex[jj].file,Gindex[ii].file,cc1)) { zfree(Gindex[ii].file); // if match to "/.../filename." Gindex[ii] = Gindex[jj]; // replace with later version jj++; kk++; continue; } } ii++; Gindex[ii] = Gindex[jj]; jj++; } Gfiles -= kk; Gimages -= kk; } gallerypainted = 0; goto return0; } if (strmatch(action,"initF")) // gallery from given file list { if (gallerytype == TNONE || gallerytype == FOLDER) // gallery type from caller: zappcrash("gallery() initF gallerytype %d",gallerytype); // SEARCH META RECENT NEWEST ALBUM fid = fopen(galleryname,"r"); // open file if (! fid) goto return0; while (true) // read list of files { file = fgets_trim(buff,XFCC-1,fid,1); if (! file) break; xxrec = get_xxrec(file); // get xxrec_tab[] if (! xxrec) continue; // deleted, not image file Gindex[Gfiles].file = zstrdup(file,"gallery"); // add to gallery index Gindex[Gfiles].folder = 0; xxrec_to_gindex(xxrec,&Gindex[Gfiles]); // get data from file xxrec_tab[] Gfiles++; if (Gfiles == maxgallery) { // too many files zmessageACK(Mwin,TX("gallery truncated to %d images"),maxgallery); break; } } fclose(fid); Gimages = Gfiles; // no folders gallerysort = SNONE; // no initial sort galleryseq = QNONE; galleryposn = 0; gallerypainted = 0; goto return0; } if (strmatch(action,"sort")) // sort the gallery index { if (Nth == -2) gallery_memory("get"); // recall prior sort and posn. if (Gfiles > 1 && gallerysort != SNONE) // sort using current or prior params HeapSort((ch *) Gindex, sizeof(Gindex_t), Gfiles, gallery_comp); gallerypainted = 0; goto return0; } if (strmatch(action,"paint")) // paint gallery window { if (filez) Nth = file_position(filez,Nth); // use or get valid Nth for filez if (Nth >= 0) galleryposn = Nth; // filez position or caller Nth else gallery_memory("get"); gtk_widget_queue_draw(Gdrawin); // draw gallery window gallerypainted = 0; goto return0; } if (strmatch(action,"insert")) // insert new file into list { fposn = Nth; // file position from caller if (fposn < 0) fposn = 0; // limit to allowed range if (fposn > Gfiles) fposn = Gfiles; if (Gfiles == maxgallery) { // no room zmessageACK(Mwin,TX("gallery truncated to %d images"),maxgallery); goto return0; } xxrec = get_xxrec(filez); if (! xxrec) goto return0; // deleted, not image file for (ii = Gfiles; ii > fposn; ii--) // create hole in gallery index Gindex[ii] = Gindex[ii-1]; Gindex[fposn].file = zstrdup(filez,"gallery"); // put new file in hole Gindex[Gfiles].folder = 0; xxrec_to_gindex(xxrec,&Gindex[fposn]); // get data from file xxrec_tab[] Gfiles++; Gimages++; gallerypainted = 0; goto return0; } if (strmatch(action,"delete")) // delete file from gallery index { fposn = Nth; // file position from caller if (fposn < Gfolders || fposn > Gfiles-1) goto return0; // not image file Gfiles--; // decr. total files Gimages--; // decr. image files zfree(Gindex[fposn].file); // remove Gindex[] record if (Gindex[fposn].mdata1) zfree(Gindex[fposn].mdata1); // and metadata if (Gindex[fposn].mdata2) zfree(Gindex[fposn].mdata2); for (ii = fposn; ii < Gfiles; ii++) // close the hole Gindex[ii] = Gindex[ii+1]; gallerypainted = 0; goto return0; } if (strmatch(action,"get")) // return Nth folder/file in gallery index { fposn = Nth; // file position from caller if (fposn < 0 || fposn > Gfiles-1) goto return0; file2 = zstrdup(Gindex[fposn].file,"gallery"); // get Nth file if (regfile(file2)) goto return2; // return file2 if (dirfile(file2)) goto return2; zfree(file2); goto return0; } if (strmatch(action,"getR")) // return file reference (no zstrdup) { fposn = Nth; // file position from caller if (fposn < 0 || fposn > Gfiles-1) goto return0; file2 = Gindex[fposn].file; // get Nth file if (regfile(file2)) goto return2; // return file2 if (dirfile(file2)) goto return2; goto return0; } if (strmatch(action,"update")) // update Gindex file from image index { // (from update_image_index()) for (ii = 0; ii < Gfiles; ii++) if (strmatch(filez,Gindex[ii].file)) break; if (ii == Gfiles) goto return0; // not found xxrec = get_xxrec(filez); if (! xxrec) goto return0; // deleted, not image file xxrec_to_gindex(xxrec,&Gindex[Gfiles]); // get data from file xxrec_tab[] gallerypainted = 0; goto return0; } zappcrash("navigate %s",action); // invalid action return0: resource_unlock(GFlock); // unlock gallery file list return 0; return2: resource_unlock(GFlock); return file2; } /**************************************************************************************/ // private function // fill Gindex[] record data from xxrec_tab[] data void navi::xxrec_to_gindex(xxrec_t *xxrec, Gindex_t *gindex) { uint ww, hh; ch fdate[16], pdate[16]; static ch *strings[2]; static int ftf = 1; if (ftf) { ftf = 0; strings[0] = (ch *) malloc(12); // pre-allocate strings strings[1] = (ch *) malloc(12); } gindex->fsize = atoi(xxrec->fsize); // file size get_substrings(xxrec->psize,' ',2,12,strings); // pixel size ww = atoi(strings[0]); hh = atoi(strings[1]); gindex->psize = ww * hh; strncpy(fdate+0,xxrec->fdate+0,4); // convert yyyy:mm:dd hh:mm:ss strncpy(fdate+4,xxrec->fdate+5,2); // to yyyymmddhhmmss strncpy(fdate+6,xxrec->fdate+8,2); strncpy(fdate+8,xxrec->fdate+11,2); strncpy(fdate+10,xxrec->fdate+14,2); strncpy(fdate+12,xxrec->fdate+17,2); fdate[14] = 0; strcpy(gindex->fdate,fdate); // file date, yyyymmddhhmmss if (*xxrec->pdate) { strncpy(pdate+0,xxrec->pdate+0,4); // convert yyyy:mm:dd hh:mm:ss strncpy(pdate+4,xxrec->pdate+5,2); // to yyyymmddhhmmss strncpy(pdate+6,xxrec->pdate+8,2); strncpy(pdate+8,xxrec->pdate+11,2); strncpy(pdate+10,xxrec->pdate+14,2); strncpy(pdate+12,xxrec->pdate+17,2); pdate[14] = 0; strcpy(gindex->pdate,pdate); // photo date, yyyymmddhhmmss } else *pdate = 0; // no photo date if (gindex->mdata1) zfree(gindex->mdata1); if (gindex->mdata2) zfree(gindex->mdata2); gindex->mdata1 = gindex->mdata2 = 0; } /**************************************************************************************/ // private function, gallery sort compare // folders sort first and upper/lower case is ignored int navi::gallery_comp(ch *rec1, ch *rec2) { int nn; ch *pp1, *pp2; double d1, d2; Gindex_t *grec1, *grec2; grec1 = (Gindex_t *) rec1; grec2 = (Gindex_t *) rec2; if (grec1->folder) { // folder sort if (! grec2->folder) return -1; // folder :: image file nn = strcasecmp(grec1->file,grec2->file); // folder :: folder if (nn) return nn; nn = strcmp(grec1->file,grec2->file); // if equal, use utf8 compare return nn; } else if (grec2->folder) return +1; // image file :: folder if (galleryseq == DESCEND) { // descending, switch inputs grec1 = (Gindex_t *) rec2; grec2 = (Gindex_t *) rec1; } switch (gallerysort) { case FNAME: { // file name nn = strcasecmp(grec1->file,grec2->file); // ignore case if (nn) return nn; nn = strcmp(grec1->file,grec2->file); // if equal, use utf8 compare return nn; } case FNUMBER: { // file name/number nn = filename_comp(grec1->file,grec2->file); // (embedded numbers sort by value) if (nn) return nn; nn = strcmp(grec1->file,grec2->file); // if equal, use utf8 compare return nn; } case FDATE: { // file mod date/time nn = strcmp(grec1->fdate,grec2->fdate); if (nn) return nn; goto tiebreak; } case PDATE: { // photo date/time nn = strcmp(grec1->pdate,grec2->pdate); // (metadata DateTimeOriginal) if (nn) return nn; goto tiebreak; } case FSIZE: { // file size nn = grec1->fsize - grec2->fsize; if (nn) return nn; goto tiebreak; } case PSIZE: { // image pixel size nn = grec1->psize - grec2->psize; if (nn) return nn; goto tiebreak; } case MDATA: // user selected metadata { pp1 = grec1->mdata2; // (from search function, metadata report) pp2 = grec2->mdata2; while (true) // loop name1: data1 \n name2: data2 ... { if (! pp1 && ! pp2) goto tiebreak; // no data if (pp1 && ! pp2) return 1; // something > nothing if (pp2 && ! pp1) return -1; pp1 = strchr(pp1,':'); // look for metaname: metadata pp2 = strchr(pp2,':'); if (! pp1 && ! pp2) goto tiebreak; // no data if (pp1 && ! pp2) return 1; // something > nothing if (pp2 && ! pp1) return -1; if (znumber(pp1+1) && znumber(pp2+1)) { // if both are regular numbers, d1 = atof(pp1+1); // do numeric comparison d2 = atof(pp2+1); if (d1 < d2) return -1; if (d1 > d2) return +1; goto nextdata; // equal } nn = zstrcmp(pp1,pp2); // strcmp() but \n terminates like null if (nn) return nn; // not equal nextdata: // equal pp1 = strchr(pp1,'\n'); pp2 = strchr(pp2,'\n'); // loop next name: data pair } } default: return 0; tiebreak: // tie breaker nn = strcasecmp(grec1->file,grec2->file); // file name without case if (nn) return nn; nn = strcmp(grec1->file,grec2->file); // if equal, use utf8 compare return nn; } } /************************************************************************************** compare function for sorting a list of file names with embedded numbers + folder names are compared normally using strcmp() + file base names are compared ignoring string case: 'a' = 'A' + file base names with embedded numbers starting in the same position are compared arithmetically: '5' < '40' < '300' < '1000' ****/ int navi::filename_comp(ch *file1, ch *file2) { ch *pp1, *pp2; ch ch1, ch2; int nn; int64 nn1, nn2; pp1 = strrchr(file1,'/'); // get end of folders pp2 = strrchr(file2,'/'); if (pp1 && pp2) { // compare folders *pp1 = *pp2 = 0; nn = strcmp(file1,file2); *pp1 = *pp2 = '/'; if (nn != 0) return nn; // different, done } else { // no folders pp1 = file1 - 1; // point to base file names -1 pp2 = file2 - 1; } while (true) // loop chars. in file names { pp1++; pp2++; // next chars. to compare if (*pp1 == *pp2) { // chars. are equal if (*pp1 == 0) return 0; // both '0', strings are equal, done if (*pp1 < '0' || *pp1 > '9') continue; // if either is not a number 0-9, if (*pp2 < '0' || *pp2 > '9') continue; // continue to compare next chars. goto number; // both are numbers 0-9 } if (*pp1 == 0) return -1; // chars. are not equal if (*pp2 == 0) return +1; // if either is '0', done if (*pp1 < '0' || *pp1 > '9' || *pp2 < '0' || *pp2 > '9') { // either is not a number 0-9 ch1 = *pp1; ch2 = *pp2; if (ch1 >= 'A' && ch1 <= 'Z') ch1 = ch1 | 0x20; // make A-Z into a-z to ignore case if (ch2 >= 'A' && ch2 <= 'Z') ch2 = ch2 | 0x20; if (ch1 > ch2) return +1; // compare chars. if (ch2 > ch1) return -1; // if not equal, done continue; // equal, continue to next chars. } number: nn1 = atol(pp1); // compare two numbers nn2 = atol(pp2); // note: '123' and '0123' compare equal if (nn1 > nn2) return +1; if (nn2 > nn1) return -1; while (pp1[1] >= '0' && pp1[1] <= '9') pp1++; // leave pp1/pp2 at last digit 0-9 while (pp2[1] >= '0' && pp2[1] <= '9') pp2++; continue; } } /**************************************************************************************/ // private function for gallery 'thumb view' // paint gallery window - draw thumbnail images and limited metadata int navi::gallery_paint(GtkWidget *drwin, cairo_t *cr) { GdkRGBA rgba; PIXBUF *pixbuf; FTYPE ftype; GtkWidget *Ftext; xxrec_t *xxrec; static int prows = 0; double x1, y1, x2, y2; int ii, Fmark; int nrows, row, col; int textlines; int row1, row2, ww, hh, cc; int drwingW, drwingH; int thumx, thumy; int ndir, nfil; ch *pp, *fspec, *fname; ch *ppd, ffolder[60]; ch text[200]; ch pdate[20]; ch psize2[20]; float fsize2; gallerypainted = 0; if (! galleryname) return 1; // no gallery set_gwin_title(); // main window title = gallery name gallery_navibutts(); // set navigation buttons on top panel rgba.red = 0.00392 * GBrgb[0]; // window background color rgba.green = 0.00392 * GBrgb[1]; // 0 - 255 --> 0.0 - 1.0 rgba.blue = 0.00392 * GBrgb[2]; rgba.alpha = 1.0; gdk_cairo_set_source_rgba(cr,&rgba); cairo_paint(cr); if (gallerytype == META) { // search, metadata report gallery_paintmeta(drwin,cr); return 1; } if (Fthumbview == 2) { // thumbnails with basic metadata gallery_paintmeta2(drwin,cr); return 1; } for (ii = 0; ii < thumbxx; ii++) // largest ... smallest thumb size if (thumbsize >= thumbx[ii]) break; if (ii == thumbxx) ii = thumbxx-1; // (fix poss. bad parameter) thumbsize = thumbx[ii]; // thumbnail size fontsize = appfontsize + fontx[ii]; // corresp. font size if (Xindexlev < 1) textlines = 1; // no index, file name only else textlines = 2; // file name + date + wwhh if (gallerytype != FOLDER) textlines++; // add folder name above file name texthh = textlines * 2.0 * fontsize; // vertical space required 26.7 thumbW = thumbsize + 10; // thumbnail cell size thumbH = thumbsize + texthh + thumbsize/24 + 10; xwinW = gtk_widget_get_allocated_width(Gscroll); // drawing window size xwinH = gtk_widget_get_allocated_height(Gscroll); xrows = int(0.1 + 1.0 * xwinH / thumbH); // get thumbnail rows and cols that xcols = int(0.1 + 1.0 * xwinW / thumbW); // (almost) fit in window if (xrows < 1) xrows = 1; if (xcols < 1) xcols = 1; nrows = (Gfiles+xcols-1) / xcols; // total thumbnail rows, 1 or more if (nrows < 1) nrows = 1; drwingW = xcols * thumbW + margin + 10; // layout size for entire gallery drwingH = (nrows + 1) * thumbH; // (+ empty row for visual end) if (drwingH <= xwinH) drwingH = xwinH + 1; // at least window size + 1 if (drwingH < 7000000) prows = 0; // stay within undocumented limit else { nrows = 7000000 / thumbH; drwingH = nrows * thumbH; if (nrows * xcols != prows) { panelmessage(1,3,TX("gallery truncated to %d images"),nrows*xcols); // 25.1 prows = nrows * xcols; } } gtk_widget_get_size_request(drwin,&ww,&hh); // current size if (ww != drwingW || hh != drwingH) gtk_widget_set_size_request(drwin,-1,drwingH); // needs to change maxscroll = nrows * thumbH; // too far but necessary if (maxscroll < xwinH) maxscroll = xwinH; // compensate GTK bug gtk_adjustment_set_upper(Gadjust,maxscroll); gtk_adjustment_set_step_increment(Gadjust,thumbH); // scrollbar works in row steps gtk_adjustment_set_page_increment(Gadjust,thumbH * xrows); // and in page steps if (galleryposn >= 0) { // new target file position (Nth) scrollposn = galleryposn / xcols * thumbH; // scroll position for target file if (scrollposn > maxscroll) scrollposn = maxscroll; // >> top row of window gtk_adjustment_set_value(Gadjust,scrollposn); } scrollposn = gtk_adjustment_get_value(Gadjust); galleryposn = (scrollposn + thumbH/2) / thumbH * xcols; // remember gallery position gallery_memory("put"); galleryposn = -1; // disable cairo_clip_extents(cr,&x1,&y1,&x2,&y2); // window region to paint row1 = y1 / thumbH; row2 = y2 / thumbH; for (row = row1; row <= row2; row++) // draw visible rows for (col = 0; col < xcols; col++) // draw all columns in row { ii = row * xcols + col; // next file if (ii >= Gfiles) goto endloops; // exit 2 nested loops fspec = Gindex[ii].file; // folder/file name pp = strrchr(fspec,'/'); // get file name only if (pp) fname = pp + 1; else fname = fspec; strcpy(ffolder,"/"); if (gallerytype != FOLDER) { // files from mixed folders if (pp && pp > fspec) { for (ppd = pp-1; ppd >= fspec && *ppd != '/'; ppd--); // get last folder level cc = pp - ppd + 1; // (include null to be added) if (cc > 60) cc = 60; strncpy0(ffolder,ppd,cc); } } thumx = col * thumbW + margin; // drawing area position thumy = row * thumbH + margin; Fmark = 0; if (zd_select_files) { // gallery select is active Ftext = zdialog_gtkwidget(zd_select_files,"files"); if (txwidget_find(Ftext,fspec,0,0) >= 0) Fmark = 1; // mark selected file } else if (curr_file && strmatch(fspec,curr_file)) Fmark = 1; // if file is current file, mark it if (Fmark) { cairo_set_source_rgb(cr,1,1,0.5); // mark file with yellow background cairo_rectangle(cr,thumx-3,thumy-3,thumbW-3,texthh); cairo_fill(cr); } ftype = image_file_type(fspec); // folder/image/RAW file if (ftype == FDIR) { // folder dir_filecount(fspec,ndir,nfil); // get subdir and file counts snprintf(text,200,"%s\n%d + %d images",fname,ndir,nfil); // dir name, subdirs + image files } else // image/RAW/VIDEO file { xxrec = get_xxrec(fspec); // get xxrec_tab[] record if (! xxrec) continue; // deleted, not image file fsize2 = atof(xxrec->fsize)/MEGA; // file size, mb strncpy0(pdate,xxrec->pdate,20); // photo date yyyy:mm:dd hh:mm:ss strncpy0(psize2,xxrec->psize,20); // pixel size, 12345 6789 pp = strchr(psize2,' '); if (pp && psize2 - pp < (int) strlen(psize2) - 2) *pp = 'x'; // 12345x6789 if (gallerysort == FDATE) strncpy0(pdate,xxrec->fdate,20); // use file or photo date if (thumbsize <= 256) pdate[10] = 0; // truncate date/time to date only cc = 0; if (gallerytype != FOLDER) { // mixed folders (search results) snprintf(text,200,"%s\n",ffolder); // output folder name + \n cc = strlen(text); } snprintf(text+cc,200-cc,"%s\n",fname); // output file name + \n cc = cc + strlen(fname) + 1; snprintf(text+cc,200-cc,"%s",pdate); // output date [ time ] cc += strlen(pdate); if (thumbsize > 180) snprintf(text+cc,200-cc," %s %.2fmb",psize2,fsize2); // output pixel size, file size (mb) else if (thumbsize > 128) snprintf(text+cc,200-cc," %s",psize2); // output only pixel size draw_text(cr,text,thumx,thumy,thumbW-5); // paint text first thumy += texthh; // position thumbnail below text } pixbuf = get_thumb_pixbuf(fspec); // get thumbnail if (pixbuf) { ww = gdk_pixbuf_get_width(pixbuf); ww = (thumbsize - ww) / 4; // shift margin if smaller width gdk_cairo_set_source_pixbuf(cr,pixbuf,thumx+ww,thumy); cairo_paint(cr); // paint } if (ftype == FDIR) { // folder thumy += thumbsize/3 + 10; // overlay thumbnail with text draw_text(cr,text,thumx+ww+thumbW/6,thumy,thumbW-5); } } endloops: gallerypainted = 1; // mark gallery display complete preload_start = ii; // start file for preload_thread() return 1; } /**************************************************************************************/ // private function for search images 'metadata report' // paint metadata report - draw thumbnail images + metadata text int navi::gallery_paintmeta(GtkWidget *drwin, cairo_t *cr) { PIXBUF *pixbuf; double x1, y1, x2, y2; int ii, nrows, row; int row1, row2, ww, hh; int cc1, cc2; int drwingW, drwingH; int thumx, thumy; ch *fspec, *mtext; static int prows = 0; thumbsize = 360; // 25.1 for (ii = 0; ii < thumbxx; ii++) if (thumbsize == thumbx[ii]) break; // tolerate bad parameter value if (ii >= thumbxx) thumbsize = thumbx[2]; // inherited from prior release fontsize = appfontsize; thumbW = thumbsize + 10; // thumbnail layout size thumbH = thumbsize + 20; texthh = Gmdrows * 2.0 * fontsize + 10; // vertical space required 26.7 if (texthh > thumbH) thumbH = texthh; xwinW = gtk_widget_get_allocated_width(Gscroll); // drawing window size xwinH = gtk_widget_get_allocated_height(Gscroll); xrows = int(0.1 + 1.0 * xwinH / thumbH); // get thumbnail rows fitting in window if (xrows < 1) xrows = 1; xcols = 1; // force cols = 1 nrows = Gfiles; // thumbnail rows if (! nrows) nrows = 1; drwingW = xwinW; // layout size for entire gallery drwingH = (nrows + 1) * thumbH; // last row if (drwingH < xwinH) drwingH = xwinH; if (drwingH < 7000000) prows = 0; // stay within undocumented limit else { nrows = 7000000 / thumbH; drwingH = nrows * thumbH; if (nrows != prows) { panelmessage(1,3,TX("gallery truncated to %d images"),nrows); // 25.1 prows = nrows; } } gtk_widget_get_size_request(drwin,&ww,&hh); // current size if (ww != drwingW || hh != drwingH) gtk_widget_set_size_request(drwin,-1,drwingH); // needs to change maxscroll = nrows * thumbH; // too far but necessary if (maxscroll < xwinH) maxscroll = xwinH; // compensate GTK bug gtk_adjustment_set_upper(Gadjust,maxscroll); gtk_adjustment_set_step_increment(Gadjust,thumbH); // scrollbar works in row steps gtk_adjustment_set_page_increment(Gadjust,thumbH * xrows); // and in page steps if (galleryposn >= 0) { // new target file position (Nth) scrollposn = galleryposn / xcols * thumbH; // scroll position for target file if (scrollposn > maxscroll) scrollposn = maxscroll; // >> top row of window gtk_adjustment_set_value(Gadjust,scrollposn); } scrollposn = gtk_adjustment_get_value(Gadjust); // save gallery sort and position galleryposn = (scrollposn + thumbH/2) / thumbH * xcols; gallery_memory("put"); galleryposn = -1; // disable cairo_clip_extents(cr,&x1,&y1,&x2,&y2); // window region to paint row1 = y1 / thumbH; row2 = y2 / thumbH; for (row = row1; row <= row2; row++) // draw file thumbnails + text { ii = row; // next file if (ii >= Gfiles) break; fspec = Gindex[ii].file; // filename thumx = margin; // drawing area position thumy = row * thumbH + margin; pixbuf = get_thumb_pixbuf(fspec); // get thumbnail if (pixbuf) { gdk_cairo_set_source_pixbuf(cr,pixbuf,thumx,thumy); cairo_paint(cr); } draw_text(cr,fspec,thumbW+margin,thumy,3000); // write filespec to right of thumbnail cc1 = cc2 = 0; if (Gindex[ii].mdata1) cc1 = strlen(Gindex[ii].mdata1); // standard metadata text if (Gindex[ii].mdata2) cc2 = strlen(Gindex[ii].mdata2); // user selected metadata text if (cc1 + cc2 == 0) continue; // no text if (cc1 && Gindex[ii].mdata1[cc1-1] == '\n') { // delete sporadic trailing \n Gindex[ii].mdata1[cc1-1] = 0; cc1--; } if (cc2 && Gindex[ii].mdata2[cc2-1] == '\n') { // delete sporadic trailing \n Gindex[ii].mdata2[cc2-1] = 0; cc2--; } mtext = (ch *) zmalloc(cc1 + cc2 + 4,"paintmeta"); // space for both if (cc1) strcpy(mtext,Gindex[ii].mdata1); // standard metadata text if (cc2) { strcpy(mtext + cc1,"\n\n"); cc1 += 2; strcpy(mtext+cc1,Gindex[ii].mdata2); // user selected metadata text } draw_text(cr,mtext,thumbW+margin,thumy+20,3000); // draw text to window zfree(mtext); } gallerypainted = 1; return 1; } /**************************************************************************************/ // private function for gallery metadata view // paint gallery window: thumbnail, file name, basic metadata, // extra indexed metadata (user defined in image index function). int navi::gallery_paintmeta2(GtkWidget *drwin, cairo_t *cr) { PIXBUF *pixbuf; FTYPE ftype; double x1, y1, x2, y2; int ii, nn, cc, nrows, row, col; int row1, row2, ww, hh; int drwingW, drwingH; int thumx, thumy, textx; int ndir, nfil; ch *pp, *fspec, *fspec2; xxrec_t *xxrec; ch *fdate, *pdate, *rating; ch *keywords, *title, *location, *country, *gps_data; ch desc[200], psize2[20]; float fsize2; ch text[2000], xtext1[xmetaXcc+xmetaXtags], **xtext2; static int prows = 0; thumbsize = 512; // 25.1 fontsize = appfontsize; thumbW = thumbsize + 10 + 2000; // thumbnail + text layout size thumbH = thumbsize + 20; texthh = 15 * 2.0 * fontsize + 10; // space for 15 lines of text 26.7 if (texthh > thumbH) thumbH = texthh; xwinW = gtk_widget_get_allocated_width(Gscroll); // drawing window size xwinH = gtk_widget_get_allocated_height(Gscroll); xrows = int(0.1 + 1.0 * xwinH / thumbH); // thumbnail rows that fit in window if (xrows < 1) xrows = 1; xcols = 1; // 1 thumbnail column nrows = (Gfiles+xcols-1) / xcols; // thumbnail rows, 1 or more if (nrows < 1) nrows = 1; drwingW = xcols * thumbW + margin + 10; // layout size for entire gallery drwingH = (nrows + 1) * thumbH; // (+ empty row for visual end) if (drwingH <= xwinH) drwingH = xwinH + 1; // at least window size + 1 if (drwingH < 7000000) prows = 0; // stay within undocumented limit else { nrows = 7000000 / thumbH; drwingH = nrows * thumbH; if (nrows != prows) { panelmessage(1,3,TX("gallery truncated to %d images"),nrows); // 25.1 prows = nrows; } } gtk_widget_get_size_request(drwin,&ww,&hh); // current size if (ww != drwingW || hh != drwingH) gtk_widget_set_size_request(drwin,-1,drwingH); // needs to change maxscroll = nrows * thumbH; // too far but necessary if (maxscroll < xwinH) maxscroll = xwinH; // compensate GTK bug gtk_adjustment_set_upper(Gadjust,maxscroll); gtk_adjustment_set_step_increment(Gadjust,thumbH); // scrollbar works in row steps gtk_adjustment_set_page_increment(Gadjust,thumbH * xrows); // and in page steps if (galleryposn >= 0) { // new target file position (Nth) scrollposn = galleryposn / xcols * thumbH; // scroll position for target file if (scrollposn > maxscroll) scrollposn = maxscroll; // >> top row of window gtk_adjustment_set_value(Gadjust,scrollposn); } scrollposn = gtk_adjustment_get_value(Gadjust); // save gallery sort and position galleryposn = (scrollposn + thumbH/2) / thumbH * xcols; gallery_memory("put"); galleryposn = -1; // disable cairo_clip_extents(cr,&x1,&y1,&x2,&y2); // window region to paint row1 = y1 / thumbH; row2 = y2 / thumbH; for (row = row1; row <= row2; row++) // draw file thumbnails for (col = 0; col < xcols; col++) // draw all columns in row { ii = row * xcols + col; // next file if (ii >= Gfiles) goto endloops; // exit 2 nested loops fspec = Gindex[ii].file; fspec2 = fspec; if (gallerytype == FOLDER) { // folder gallery, write only pp = strrchr(fspec,'/'); // base file names if (pp) fspec2 = pp+1; } thumx = col * thumbW + margin; // drawing area position thumy = row * thumbH + margin; pixbuf = get_thumb_pixbuf(fspec); // get thumbnail if (pixbuf) { gdk_cairo_set_source_pixbuf(cr,pixbuf,thumx,thumy); // paint thumbnail cairo_paint(cr); } textx = thumx + margin + thumbsize + 4; // text position 26.0 if (curr_file && strmatch(fspec,curr_file)) { // yellow background for curr. file name ww = fontsize * strlen(fspec2); cairo_set_source_rgb(cr,1,1,0.5); cairo_rectangle(cr,textx,thumy,ww,fontsize*1.6); cairo_fill(cr); } ftype = image_file_type(fspec); // file type if (ftype == FDIR) { // subfolder dir_filecount(fspec,ndir,nfil); // get subfolder and file counts snprintf(text,2000,"\n %s \n %d folders + %d images \n", // paint 2 lines: fspec2, ndir, nfil); // folder name, file counts draw_text(cr,text,textx,thumy,3000); } else if (Xindexlev > 0) // if image index is valid { xxrec = get_xxrec(fspec); // get indexed metadata for file if (! xxrec) continue; // deleted, not image file fdate = xxrec->fdate; // construct metadata text report fsize2 = atof(xxrec->fsize)/MEGA; // file size, mb pdate = xxrec->pdate; rating = xxrec->rating; keywords = xxrec->keywords; title = xxrec->title; if (xxrec->desc) strncpy0(desc,xxrec->desc,200); // limit size 26.0 else *desc = 0; location = xxrec->location; country = xxrec->country; gps_data = xxrec->gps_data; // 26.7 strncpy0(psize2,xxrec->psize,20); // pixel size, 12345 6789 pp = strchr(psize2,' '); if (pp && psize2 - pp < (int) strlen(psize2) - 2) *pp = 'x'; // 12345x6789 if (xxrec->xmeta) // extra indexed metadata present { nn = breakup_text(xxrec->xmeta,xtext2,"^",100); // break into shorter lines for (ii = cc = 0; ii < nn && ii < 9; ii++) { repl_1str(xtext2[ii],xtext1+cc,99,"^"," "); cc += strlen(xtext2[ii]); strcpy(xtext1+cc,"\n "); cc += 2; } xtext1[cc] = 0; for (ii = 0; ii < nn; ii++) zfree(xtext2[ii]); zfree(xtext2); snprintf(text,2000, // report basic metadata in 6 lines TX("%s\nPhoto Date: %s File Date: %s \n" "Rating: %s Size: %s %.2fmb \n" "Location: %s %s %s \n" "Keywords: %s \nTitle: %s \nDescription: %s \n" "----------------------- \n%s"), // extra indexed metadata in <10 lines fspec2, pdate, fdate, rating, psize2, fsize2, location, country, gps_data, keywords, title, desc, xtext1); // 26.7 } else { snprintf(text,2000, // report basic metadata in 6 lines TX("%s\nPhoto Date: %s File Date: %s \n" "Rating: %s Size: %s %.2fmb \n" "Location: %s %s %s \n" "Keywords: %s \nTitle: %s \nDescription: %s"), fspec2, pdate, fdate, rating, psize2, fsize2, location, country, gps_data, keywords, title, desc); // 26.7 } } else snprintf(text,2000,"\n%s",fspec2); // no index, no metadata, file name only draw_text(cr,text,textx,thumy,3000); // paint text } endloops: gallerypainted = 1; return 1; } /**************************************************************************************/ // private function // find the number of subdirs and image files within a given folder void navi::dir_filecount(ch *dirname, int &ndir, int &nfil) { ch *file, **flist, *pp; int ii, cc, err, NF; int dcount = 0, fcount = 0; FTYPE ftype; #define NC 1000 // cache capacity static int ftf = 1; static ch *dirnamecache[NC]; // cache for recent folder data static time_t modtimecache[NC]; static int dcountcache[NC]; static int fcountcache[NC]; static int pcache = 0; STATB statB; if (ftf) { ftf = 0; cc = NC * sizeof(ch *); // first call, clear cache memset(dirnamecache,0,cc); } ndir = nfil = 0; if (! dirfile(dirname,&statB)) return; for (ii = 0; ii < NC; ii++) { // look for folder in cache if (! dirnamecache[ii]) break; if (strmatch(dirname,dirnamecache[ii]) && statB.st_mtime == modtimecache[ii]) { ndir = dcountcache[ii]; // found, not stale nfil = fcountcache[ii]; return; } } err = find_imagefiles(dirname,1+8,flist,NF); // find image files + folders if (err) { zmessageACK(Mwin,strerror(errno)); return; } for (ii = 0; ii < NF; ii++) // count files and folders { file = flist[ii]; if (! Fshowhidden) { // if hidden files suppressed, 26.5 pp = strrchr(file,'/'); // don't count them if (pp && pp[1] == '.') continue; } ftype = image_file_type(file); if (ftype == FDIR) dcount++; // folder count else if (ftype == IMAGE || ftype == RAW || ftype == VIDEO) fcount++; // image file count zfree(file); } if (NF) zfree(flist); ii = pcache++; // add to cache, replace oldest if (pcache == NC) pcache = 0; if (dirnamecache[ii]) zfree(dirnamecache[ii]); dirnamecache[ii] = zstrdup(dirname,"filecount"); modtimecache[ii] = statB.st_mtime; ndir = dcountcache[ii] = dcount; nfil = fcountcache[ii] = fcount; return; } /**************************************************************************************/ // private function // write text block at px/py location with width limit ww void navi::draw_text(cairo_t *cr, ch *text, int px, int py, int ww) { static PangoFontDescription *pfont = 0; static PangoLayout *playout = 0; static int pfontsize = -1; static ch thumbfont[20] = ""; if (fontsize != pfontsize) { // adjust for curr. font size pfontsize = fontsize; snprintf(thumbfont,20,"sans bold %d",fontsize); if (pfont) pango_font_description_free(pfont); pfont = pango_font_description_from_string(thumbfont); if (playout) g_object_unref(playout); playout = pango_cairo_create_layout(cr); pango_layout_set_font_description(playout,pfont); } pango_layout_set_width(playout,ww*PANGO_SCALE); // limit width to avail. space pango_layout_set_ellipsize(playout,PANGO_ELLIPSIZE_END); pango_layout_set_text(playout,text,-1); cairo_move_to(cr,px,py); cairo_set_source_rgb(cr,0,0,0); // text = black pango_cairo_show_layout(cr,playout); return; } /**************************************************************************************/ // private function // create a row of navigation buttons in gallery top panel void navi::gallery_navibutts() { ch labtext[100]; int ii, cc, max = maxgallerylevs; ch *pp1, *pp2; for (ii = 0; ii < max; ii++) { // clear old navi buttons if any if (gallerypath[ii]) { zfree(gallerypath[ii]); gallerypath[ii] = 0; gtk_widget_destroy(gallerybutt[ii]); } } if (gallerylabel) gtk_widget_destroy(gallerylabel); // clear gallery label if any gallerylabel = 0; sprintf(labtext,"no gallery"); if (gallerytype == SEARCH) sprintf(labtext,"search results"); // search results if (gallerytype == META) sprintf(labtext,"search results"); // search results (metadata report) if (gallerytype == RECENT) sprintf(labtext,"recent files"); // recent files if (gallerytype == NEWEST) sprintf(labtext,"newest files"); // newest files if (gallerytype == ALBUM) { // album gallery pp1 = strrchr(galleryname,'/'); if (pp1) pp1++; else pp1 = galleryname; snprintf(labtext,100,"album: %s",pp1); // album: album-name } if (gallerytype != FOLDER) { // not a folder gallery gallerylabel = gtk_label_new(labtext); // show gallery label gtk_box_pack_start(GTK_BOX(Gpanel),gallerylabel,0,0,0); gtk_widget_show_all(Gpanel); return; } ii = 0; pp1 = galleryname; while (pp1 && *pp1) // construct new buttons { pp2 = strchr(pp1+1,'/'); // /aaaaaa/bbbbbb/cccccc if (pp2) cc = pp2 - pp1; // | | else cc = strlen(pp1); // pp1 pp2 gallerypath[ii] = (ch *) zmalloc(cc,"navibutts"); strncpy0(gallerypath[ii],pp1+1,cc); // bbbbbb gallerybutt[ii] = gtk_button_new_with_label(gallerypath[ii]); gtk_box_pack_start(GTK_BOX(Gpanel),gallerybutt[ii],0,0,3); G_SIGNAL(gallerybutt[ii],"clicked",navibutt_clicked,&Nval[ii]); pp1 = pp1 + cc; // next folder level /cccccc if (! *pp1) break; // null = end if (*pp1 == '/' && ! *(pp1+1)) break; // / + null = end if (++ii == max) break; // limit of folder levels } gtk_widget_show_all(Gpanel); return; } /**************************************************************************************/ // private function - menu function for gallery window // - scroll window as requested // - jump to new file or folder as requested void navi::menufuncx(GtkWidget *, ch *menu) { int ii, scroll1, scroll2; viewmode('G'); scrollposn = gtk_adjustment_get_value(Gadjust); // current scroll position if (strmatch(menu,"Zoom+")) // next bigger thumbnail size { if (Fthumbview != 1) return; // not resizable thumb view for (ii = 0; ii < thumbxx; ii++) // set next greater thumbnail size if (thumbsize == thumbx[ii]) break; if (ii == 0) return; // already maximum, no change thumbsize = thumbx[ii-1]; galleryposn = scrollposn / thumbH * xcols; // keep top row position gallery(0,"paint",-1); // paint gallery return; } if (strmatch(menu,"Zoom-")) // next smaller thumb size { if (Fthumbview != 1) return; // not resizable thumb view for (ii = 0; ii < thumbxx; ii++) // set next smaller thumb size if (thumbsize == thumbx[ii]) break; if (ii >= thumbxx-1) return; // already minimum, no change thumbsize = thumbx[ii+1]; // next smaller galleryposn = scrollposn / thumbH * xcols; // keep top row position gallery(0,"paint",-1); // paint gallery return; } if (strmatch(menu,"Row Up")) { // scroll 1 row up scroll1 = scrollposn / thumbH * thumbH; scroll2 = scroll1 - thumbH; if (scroll2 < 0) scroll2 = 0; gallery_scroll(scroll2,2000); return; } if (strmatch(menu,"Row Down")) { // scroll 1 row down scroll1 = scrollposn / thumbH * thumbH; scroll2 = scroll1 + thumbH; if (scroll2 > maxscroll) scroll2 = maxscroll; gallery_scroll(scroll2,2000); return; } if (strmatch(menu,"Page Up")) { // scroll 1 page up scroll1 = scrollposn / thumbH * thumbH; scroll2 = scroll1 - thumbH * xrows; if (scroll2 < 0) scroll2 = 0; gallery_scroll(scroll2,8000); return; } if (strmatch(menu,"Page Down")) { // scroll 1 page down scroll1 = scrollposn / thumbH * thumbH; scroll2 = scroll1 + thumbH * xrows; if (scroll2 > maxscroll) scroll2 = maxscroll; gallery_scroll(scroll2,8000); return; } if (strmatch(menu,"Home")) { // jump to top gallery_scroll(-1,0); // stop scrolling scrollposn = 0; galleryposn = scrollposn / thumbH * xcols; gallery(0,"paint",0); return; } if (strmatch(menu,"End")) { // jump to bottom gallery_scroll(-1,0); // stop scrolling scrollposn = maxscroll; galleryposn = scrollposn / thumbH * xcols; gallery(0,"paint",galleryposn); return; } printf("*** unknown gallery function: %s \n",menu); return; } /**************************************************************************************/ // private function // scroll gallery page up or down to goal scroll position // position: N goal scroll position, 0 to maxscroll // -1 stop scrolling immediately // speed: N scroll N pixels/second #define scrollms 1 // timer period, millisecs #define scrollsec (0.001 * scrollms) void navi::gallery_scroll(int position, int speed) { if (position < 0) { // stop scrolling gallery_scrollgoal = -1; gallery_scrollspeed = 0; return; } if (gallery_scrollgoal < 0) { // start scrolling gallery_scrollgoal = position; gallery_scrollspeed = speed; g_timeout_add(scrollms,gallery_scrollfunc,0); // timer period, milliseconds return; } gallery_scrollgoal = position; // continue scrolling with gallery_scrollspeed = speed; // possible goal/speed change return; } // private function // timer function, runs every 'scrollms' milliseconds int navi::gallery_scrollfunc(void *) { float cumscroll = 0; int newscrollposn; if (gallery_scrollgoal < 0) return 0; // stop scrolling if (FGM != 'G') { // not gallery view gallery_scrollgoal = -1; // stop scrolling return 0; } if (scrollposn == gallery_scrollgoal) { // goal reached, stop gallery_scrollgoal = -1; return 0; } cumscroll = scrollsec * gallery_scrollspeed; // based on timer period scrollposn = gtk_adjustment_get_value(Gadjust); newscrollposn = scrollposn; if (scrollposn < gallery_scrollgoal) { // adjust scroll position newscrollposn += cumscroll; if (newscrollposn > gallery_scrollgoal) newscrollposn = gallery_scrollgoal; } if (scrollposn > gallery_scrollgoal) { newscrollposn -= cumscroll; if (newscrollposn < gallery_scrollgoal) newscrollposn = gallery_scrollgoal; } gtk_adjustment_set_value(Gadjust,newscrollposn); return 1; } /**************************************************************************************/ // private function // gallery top panel folder button clicked, open corresponding folder void navi::navibutt_clicked(GtkWidget *widget, int *lev) { ch gallerydir[XFCC], *pp; gallery_scroll(-1,0); // stop scrolling pp = gallerydir; for (int ii = 0; ii <= *lev; ii++) { *pp = '/'; strcpy(pp+1,gallerypath[ii]); pp = pp + strlen(pp); } gallery(gallerydir,"init",0); // new gallery gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); // paint return; } /**************************************************************************************/ // private function - [TOP] button: select new top folder void navi::newtop(GtkWidget *widget, GdkEventButton *event) { static GtkWidget *popmenu = 0; if (Xindexlev < 1) { index_rebuild(1,0); if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } gallery_scroll(-1,0); // stop scrolling if (popmenu) gtk_widget_destroy(popmenu); popmenu = create_popmenu(); for (int ii = 0; ii < Ntopfolders; ii++) // insert all top image folders add_popmenu(popmenu,topfolders[ii],newtop_menu_event,0,0); add_popmenu(popmenu,TX("Folder Tree"),newtop_menu_event,0,0); // additional menu entries add_popmenu(popmenu,"/",newtop_menu_event,0,0); add_popmenu(popmenu,"HOME",newtop_menu_event,0,0); add_popmenu(popmenu,TX("Desktop"),newtop_menu_event,0,0); add_popmenu(popmenu,TX("Fotocx home"),newtop_menu_event,0,0); add_popmenu(popmenu,TX("Saved Areas"),newtop_menu_event,0,0); add_popmenu(popmenu,TX("recent files"),newtop_menu_event,0,0); add_popmenu(popmenu,TX("newest files"),newtop_menu_event,0,0); popup_menu(Mwin,popmenu); return; } void navi::newtop_menu_event(GtkWidget *, ch *menu) // menu event function { ch folder[200]; if (! menu) return; strncpy0(folder,menu,200); if (strmatch(menu,TX("Folder Tree"))) { m_folder_tree(0,0); return; } if (strmatch(menu,TX("recent files"))) { m_recentfiles(0,0); return; } if (strmatch(menu,TX("newest files"))) { m_newest_files(0,0); return; } if (strmatch(menu,"HOME")) // user home folder strncpy0(folder,getenv("HOME"),200); if (strmatch(menu,TX("Desktop"))) // user desktop snprintf(folder,200,"%s/%s",getenv("HOME"),desktopname); // locale-specific desktop name if (strmatch(menu,TX("Fotocx home"))) // fotocx home folder strncpy0(folder,get_zhomedir(),200); if (strmatch(menu,TX("Saved Areas"))) // saved areas folder snprintf(folder,200,"%s/saved_areas",get_zhomedir()); gallery(folder,"init",0); // new gallery gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); // paint return; } /**************************************************************************************/ // private function // mouse event function for gallery window - get selected thumbnail and file // user function receives clicked file, which is subject for zfree() int navi::mouse_event(GtkWidget *widget, GdkEvent *event, void *) { GdkEventButton *eventB; PIXBUF *pixbuf; int evtype, mousex, mousey, mousebutt; int row, col, nrows, tww, thh, marg; int Nth, poswidth, posheight, err, ftype; static int Fmyclick = 0; ch *filez = 0; STATB statB; if (! Gfiles) return 1; // empty gallery if (! gallerypainted) return 1; // not initialized eventB = (GdkEventButton *) event; evtype = eventB->type; mousex = int(eventB->x); mousey = int(eventB->y); mousebutt = eventB->button; if (mousex < margin) return 1; if (mousey < margin) return 1; KBcontrolkey = KBshiftkey = KBaltkey = 0; if (eventB->state & GDK_CONTROL_MASK) KBcontrolkey = 1; if (eventB->state & GDK_SHIFT_MASK) KBshiftkey = 1; if (eventB->state & GDK_MOD1_MASK) KBaltkey = 1; if (mousebutt == 1 && KBaltkey) mousebutt = 3; // left butt + ALT key >> right butt row = (mousey - margin) / thumbH; // find selected row, col col = (mousex - margin) / thumbW; if (thumbsize) { poswidth = (mousex - margin) - thumbW * col; // mouse position within thumbnail poswidth = 100 * poswidth / thumbsize; // 0-100 = left to right edge posheight = (mousey - texthh - margin) - thumbH * row; posheight = 100 * posheight / thumbsize; // 0-100 = top to bottom edge } else poswidth = posheight = 0; if (! xcols) return 1; nrows = 1 + (Gfiles-1) / xcols; // total thumbnail rows, 1 or more if (col < 0 || col >= xcols) return 1; // mouse not on a thumbnail if (row < 0 || row >= nrows) return 1; Nth = xcols * row + col; // mouse at this thumbnail (image file) if (Nth >= Gfiles) return 1; filez = zstrdup(Gindex[Nth].file,"navi-mouse"); // file (thumbnail) at mouse posn. if (evtype == GDK_BUTTON_PRESS) { gallery_scroll(-1,0); // stop scrolling Fmyclick = 1; // button press is mine if (drag_file) zfree(drag_file); drag_file = 0; ftype = image_file_type(filez); // save for poss. drag-drop if (ftype == IMAGE || ftype == RAW || ftype == VIDEO) { drag_file = zstrdup(filez,"navi-mouse"); // save file and position in gallery drag_posn = Nth; } goto cleanup; } if (evtype == GDK_BUTTON_RELEASE) { gallery_scroll(-1,0); // stop scrolling if (! Fmyclick) goto cleanup; // ignore unmatched button release Fmyclick = 0; // (from vanished popup window) err = stat(filez,&statB); if (err) goto cleanup; // file is gone? if (S_ISDIR(statB.st_mode)) { // if folder, go there gallery(filez,"init",0); // new gallery gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); // paint goto cleanup; } if (clicked_file) zfree(clicked_file); // save clicked file and gallery position clicked_file = zstrdup(filez,"navi-mouse"); clicked_posn = Nth; clicked_width = poswidth; // normalized 0-100 clicked_height = posheight; if (thumbsize) { pixbuf = get_thumb_pixbuf(filez); // get thumbnail image if (pixbuf) { tww = gdk_pixbuf_get_width(pixbuf); // thumbnail width and height thh = gdk_pixbuf_get_height(pixbuf); marg = (thumbsize - tww) / 4; // allow for margin offset poswidth -= 100 * marg/thumbsize; clicked_width = poswidth * thumbsize / tww; // clicked position is relative clicked_height = posheight * thumbsize / thh; // to thumbnail dimensions if (clicked_width < 0) clicked_width = 0; if (clicked_width > 100) clicked_width = 100; if (clicked_height < 0) clicked_height = 0; if (clicked_height > 100) clicked_height = 100; } } if (mousebutt == 1) // left click { if (zd_select_files) select_files_Lclick_func(Nth); // send to select_files() else if (zd_select_1file) select_1file_Lclick_func(Nth); // send to select_1file() else if (zd_album_update) update_albums_Lclick_func(Nth); // send to album_replacefile() else if (zd_edit_bookmarks) edit_bookmarks_Lclick_func(Nth); // send to bookmarks editor else if (zd_ss_imageprefs) ss_imageprefs_Lclick_func(Nth); // send to slide show editor else if (zd_copymove) m_copy_move(0,0); // update copy/move dialog else if (zd_rename) m_rename(0,0); // update rename dialog else if (zd_deltrash) m_delete_trash(0,0); // update delete/trash dialog else if (zd_deletemeta) m_meta_delete(0,0); // update delete metadata dialog else if (zd_editmeta || zd_editanymeta || zd_metaview) { // (any/all can be active) if (zd_editmeta) m_meta_edit_main(0,0); // update edit metadata dialog if (zd_editanymeta) m_meta_edit_any(0,0); // update edit any metadata dialog if (zd_metaview) meta_view(0); // update metadata view window } else if (KBshiftkey) gallery_popimage(); // popup large image else gallery_Lclick_func(Nth); // open the file } if (mousebutt == 2) gallery_popimage(); // middle click, popup large image if (mousebutt == 3) { // right click if (zd_select_files) select_files_Rclick_func(Nth); // send to select_files() else gallery_Rclick_popup(Nth); // send to gallery thumbnail popup menu } } cleanup: if (filez) zfree(filez); return 0; // must be 0 for drag/drop to work } /**************************************************************************************/ // this function is called if a drag-drop is initiated from the gallery window ch * navi::gallery_dragfile() { ch dragfile[200]; FILE *fid; snprintf(dragfile,200,"%s/drag_from_folder",get_zhomedir()); // save source gallery name fid = fopen(dragfile,"w"); // and position if (! fid) { zmessageACK(Mwin,strerror(errno)); return 0; } fprintf(fid,"%s\n",galleryname); fprintf(fid,"%d\n",drag_posn); fclose(fid); return drag_file; } // this function is called if a drag-drop file is dragged or dropped on the gallery window void navi::gallery_dropfile(int mousex, int mousey, ch *file) { int err, top, mpos, speed; int row, col, nrows, Nth, cc; int poswidth, from_posn = -1; ch dragfile[200], buff[200]; ch *pp1, *pp2, *from_gallery = 0, *newfile; FILE *fid; if (gallerytype != FOLDER && gallerytype != ALBUM) return; // reject others (search, recent ...) if (! file) // drag motion underway { if (! mousex) { // drag leave event gallery_scroll(-1,0); // stop scroll return; } top = gtk_adjustment_get_value(Gadjust); // mouse vertical posn in window mpos = 100 * (mousey - top) / xwinH; // 0 - 100 if (mpos < 15 && top > 0) { // mouse position from window top to bottom if (mpos < 0) mpos = 0; // 0 .... 15 .......... 85 .... 100 speed = 200 * (15 - mpos); // corresponding scroll speed gallery_scroll(0,speed); // 4000 ... 200 ... 0 ... 200 ... 4000 } // down down up up if (mpos > 85 && top < maxscroll) { if (mpos >= 100) mpos = 100; speed = 200 * (mpos - 85); gallery_scroll(maxscroll,speed); } if (mpos >= 15 && mpos <= 85) // stop scrolling in mid-window range gallery_scroll(-1,0); return; } gallery_scroll(-1,0); // stop scrolling if (gallerytype == FOLDER) // folder gallery, add new file { err = cp_copy(file,galleryname); if (err) { zfree(file); zmessageACK(Mwin,strerror(err)); return; } pp1 = strrchr(file+2,'/'); // isolate filename.ext if (! pp1) return; cc = strlen(pp1); newfile = zstrdup(galleryname,"navi-dropfile",cc+2); // construct galleryname/filename strcat(newfile,pp1); file_to_xxrec(newfile); // update xxrec_tab[] and thumbnail add_recent_file(newfile); zfree(file); zfree(newfile); gallery(0,"init",0); // refresh gallery gallery(0,"sort",-2); // sort, keep position gallery(0,"paint",-1); // paint return; } row = (mousey - margin) / thumbH; // find drop location: row, col col = (mousex - margin) / thumbW; if (col < 0) col = 0; if (col >= xcols) col = xcols-1; if (xcols) nrows = 1 + (Gfiles-1) / xcols; // total thumbnail rows, 1 or more else nrows = 1; if (nrows < 1) nrows = 1; if (row < 0) row = 0; if (row >= nrows) row = nrows-1; if (thumbsize) { poswidth = (mousex - margin) - thumbW * col; // mouse position within thumbnail poswidth = 100 * poswidth / thumbsize; // 0-100 = left to right edge } else poswidth = 0; Nth = xcols * row + col; // mouse at this thumbnail (image file) if (poswidth > 50) Nth++; // drop after this position if (Nth > Gfiles) Nth = Gfiles; // last + 1 snprintf(dragfile,200,"%s/drag_from_folder",get_zhomedir()); // get source gallery name fid = fopen(dragfile,"r"); // and position if (! fid) { zmessageACK(Mwin,strerror(errno)); return; } pp1 = fgets_trim(buff,200,fid); // source gallery name if (pp1) from_gallery = zstrdup(pp1,"navi-dropfile"); pp2 = fgets_trim(buff,200,fid); // source gallery position if (pp2) from_posn = atoi(pp2); fclose(fid); if (! pp1 || from_posn < 0) { printf("*** drag_from data not available \n"); return; } if (from_gallery && strmatch(galleryname,from_gallery)) { // drag-drop in same gallery album_move_file(from_posn,Nth); // move file position in gallery } else album_add_file(file,Nth); // insert new file at position zfree(file); if (from_gallery) zfree(from_gallery); album_show(); return; } /**************************************************************************************/ // Private function - respond to keyboard navigation keys. // KBpress() for main window calls this function when G view is active. int navi::KBaction(ch *action) { int ii; int row1, row2, rowf; if (strmatch(action,"Open")) { // goto F-view viewmode('F'); return 1; } if (strmatch(action,"Zoom+") || strmatch(action,"Zoom-in")) { menufuncx(0,"Zoom+"); return 1; } if (strmatch(action,"Zoom-") || strmatch(action,"Zoom-out")) { menufuncx(0,"Zoom-"); return 1; } if (strmatch(action,"Up")) { menufuncx(0,"Row Up"); return 1; } if (strmatch(action,"Down")) { menufuncx(0,"Row Down"); return 1; } if (strmatch(action,"Home")) { menufuncx(0,"Home"); return 1; } if (strmatch(action,"End")) { menufuncx(0,"End"); return 1; } if (strmatch(action,"Page_Up")) { menufuncx(0,"Page Up"); return 1; } if (strmatch(action,"Page_Down")) { menufuncx(0,"Page Down"); return 1; } if (strmatch(action,"Left")) { // left arrow - previous image m_prev(0,0); row1 = scrollposn / thumbH; rowf = curr_file_posn / xcols; if (rowf < row1) menufuncx(0,"Row Up"); return 1; } if (strmatch(action,"Right")) { // right arrow - next image m_next(0,0); row1 = scrollposn / thumbH; row2 = row1 + xwinH / thumbH - 1; rowf = curr_file_posn / xcols; if (rowf == 0) menufuncx(0,"Home"); if (rowf > row2) menufuncx(0,"Row Down"); return 1; } if (strmatch(action,"Delete")) { // delete key - delete/trash dialog m_delete_trash(0,0); return 1; } // check for menu function KB shortcut for (ii = 0; ii < Nkbsf; ii++) if (strmatchcase(TX(action),KBsftab[ii].menu)) break; if (ii == Nkbsf) { printf("*** shortcut not found: %s \n",action); return 1; } KBsftab[ii].func(0,KBsftab[ii].arg); // call the menu function return 1; } /**************************************************************************************/ // save and restore gallery sort and top file position #define RGmax 100 // max. recent galleries to remember typedef struct { // gallery memory data int galleryposn; // top file position (scroll position) int gallerysort; // sort galleryname/filedate/photodate int galleryseq; // sort ascending/descending ch *galleryname; // gallery name /.../filename } gallerymem_t; gallerymem_t gallerymem[RGmax]; // array of gallery memory gallerymem_t Tgallerymem; int NGmem; // current entries <= RGmax void gallery_memory(ch *action) { FILE *fid; ch buff[XFCC], *pp; int ii, nn, err; if (strmatch(action,"reset")) // clear gallery memory data { NGmem = 0; return; } if (strmatch(action,"load")) // load gallery memory from file { // at Fotocx startup time NGmem = 0; fid = fopen(gallerymem_file,"r"); // open gallery memory file if (fid) { for (ii = 0; ii < RGmax; ii++) { pp = fgets_trim(buff,XFCC,fid); // read gallery memory record if (! pp) break; // NNNNNN N N /folder/name/... err = convSI(pp,nn,0,999999); // NNNNNN = gallery top file position if (err) break; gallerymem[ii].galleryposn = nn; err = convSI(pp+7,nn,0,3); // N = 0/1/2/3 = sort if (err) break; // none / f.name / f.date / photo-date gallerymem[ii].gallerysort = nn; err = convSI(pp+9,nn,0,2); // N = 0/1/2 = none / ascend / descend if (err) break; gallerymem[ii].galleryseq = nn; pp += 11; // gallery name (folder) if (*pp != '/') break; gallerymem[ii].galleryname = zstrdup(pp,"gallery-memory"); } fclose(fid); NGmem = ii; // memory entry count } return; } if (strmatch(action,"save")) // save gallery memory at shutdown { fid = fopen(gallerymem_file,"w"); if (! fid) return; for (ii = 0; ii < NGmem; ii++) fprintf(fid,"%06d %1d %1d %s\n", gallerymem[ii].galleryposn, gallerymem[ii].gallerysort, gallerymem[ii].galleryseq, gallerymem[ii].galleryname); fclose(fid); return; } if (! galleryname) return; if (strmatch(action,"get")) // get gallery data from memory { for (ii = 0; ii < NGmem; ii++) // search for gallery in memory if (strmatch(galleryname,gallerymem[ii].galleryname)) break; if (ii < NGmem) { galleryposn = gallerymem[ii].galleryposn; // found, restore top file posn and sort gallerysort = (GSORT) gallerymem[ii].gallerysort; galleryseq = (GSEQ) gallerymem[ii].galleryseq; } else { // not found, use defaults if (gallerytype == FOLDER) { gallerysort = FNAME; galleryseq = ASCEND; galleryposn = 0; } else { gallerysort = SNONE; galleryseq = QNONE; galleryposn = 0; } } return; } if (strmatch(action,"put")) // save gallery data in memory { if (! galleryname) return; for (ii = 0; ii < NGmem; ii++) // search for gallery in memory if (strmatch(galleryname,gallerymem[ii].galleryname)) break; if (NGmem == 0 || ii == NGmem) // not found { if (NGmem == RGmax) { // gallery memory full zfree(gallerymem[ii-1].galleryname); // remove last entry NGmem--; } for (ii = NGmem; ii > 0; ii--) // push all entries up gallerymem[ii] = gallerymem[ii-1]; // to free entry [0] NGmem++; // one more entry gallerymem[0].galleryname = zstrdup(galleryname,"gallery-memory"); // entry [0] is mine } else if (ii > 0) // found at entry [ii] { Tgallerymem = gallerymem[0]; // exchange entries [0] and [ii] gallerymem[0] = gallerymem[ii]; gallerymem[ii] = Tgallerymem; } gallerymem[0].galleryposn = galleryposn; // update entry [0] gallerymem[0].gallerysort = gallerysort; gallerymem[0].galleryseq = galleryseq; return; } zappcrash("gallery_memory() %s",action); // bad action return; } /**************************************************************************************/ // set the window title for the gallery window // window title = gallery name void set_gwin_title() { ch *pp, title[200]; if (FGM != 'G') return; if (gallerytype == FOLDER) snprintf(title,200,TX("%s %s %d folders %d files"), Frelease,galleryname,Gfolders,Gimages); else if (gallerytype == SEARCH || gallerytype == META) snprintf(title,200,TX("%s SEARCH RESULTS %d files"),Frelease,Gimages); else if (gallerytype == ALBUM) { pp = strrchr(galleryname,'/'); if (! pp) pp = galleryname; else pp++; snprintf(title,200,TX("%s ALBUM %s %d files"),Frelease,pp,Gimages); } else if (gallerytype == RECENT) snprintf(title,200,TX("%s RECENT FILES"),Frelease); else if (gallerytype == NEWEST) snprintf(title,200,TX("%s NEWEST FILES"),Frelease); else snprintf(title,200,TX("%s UNKNOWN"),Frelease); gtk_window_set_title(MWIN,title); return; } /**************************************************************************************/ // Return previous or next image file from curr_file in the gallery file list. // If lastver is set, only the last edit version is returned. // (gallery must be sorted by file name (version sequence)). // Returns null if no previous/next file found. ch * prev_next_file(int index, int lastver) { int Nth; ch *rootname1 = 0, *rootname2 = 0; // file names without .vNN and .ext ch *file = 0, *filever = 0; Nth = curr_file_posn; if (index == +1) // get next file { while (true) { Nth += 1; if (Nth >= Gfiles) { // no more files this gallery if (filever) break; // return last file version goto retnull; // no more files } file = gallery(0,"getR",Nth); // get next file if (! file) goto retnull; if (! lastver) goto retfile; // return all versions if (! filever) { filever = file; // potential last version file = 0; rootname1 = file_rootname(filever); // save rootname continue; } if (rootname2) zfree(rootname2); rootname2 = file_rootname(file); if (! strmatch(rootname1,rootname2)) break; // new rootname, filever was last version filever = file; // save last file with same rootname file = 0; } file = filever; goto retfile; } if (index == -1) // get previous file { if (curr_file) rootname1 = file_rootname(curr_file); // current file rootname while (true) { Nth -= 1; if (Nth < Gfolders) goto retnull; // no more files file = gallery(0,"getR",Nth); // get previous file if (! file) goto retnull; if (! lastver) goto retfile; // return all versions if (! rootname1) goto retfile; // no current file - return previous file if (rootname2) zfree(rootname2); rootname2 = file_rootname(file); if (! strmatch(rootname1,rootname2)) goto retfile; // new rootname, return this file } } retnull: file = 0; retfile: if (rootname1) zfree(rootname1); if (rootname2) zfree(rootname2); return file; } /**************************************************************************************/ // Find the previous or next gallery from the current gallery. // (previous/next defined by subfolder sequence in parent folder) // returned gallery is subject for zfree(). ch * prev_next_gallery(int index) { int nn, Nth; ch *parentdir = 0, *olddir = 0, *newdir = 0, *file = 0; if (gallerytype != FOLDER) goto errret; // gallery not a physical folder olddir = zstrdup(galleryname,"prev-next-gallery"); // olddir = current gallery / folder if (! olddir) goto errret; nn = strlen(olddir) - 1; if (olddir[nn] == '/') olddir[nn] = 0; parentdir = zstrdup(olddir,"prev-next-gallery"); // get parent folder for (NOP; nn && parentdir[nn] != '/'; nn--) if (! nn) goto errret; parentdir[nn] = 0; gallery(parentdir,"init",0); // gallery = parent for (Nth = 0; Nth < Gfolders; Nth++) { // find olddir in parent if (file) zfree(file); file = gallery(0,"get",Nth); if (! file) goto errret; if (strmatch(file,olddir)) break; } Nth += index; // previous or next folder if (Nth < 0 || Nth >= Gfolders) goto errret; newdir = gallery(0,"get",Nth); if (newdir) goto okret; errret: if (newdir) zfree(newdir); newdir = 0; okret: if (olddir) { gallery(olddir,"init",0); // restore old folder gallery(0,"sort",-2); // recall sort and position zfree(olddir); gallerypainted = 1; // no need to paint } if (parentdir) zfree(parentdir); if (file) zfree(file); return newdir; } /**************************************************************************************/ // Get file position in gallery file list. // If Nth position matches file, this is returned. // Otherwise the list is searched from position 0. // Position 0-last is returned if found, or -1 if not. int file_position(ch *file, int Nth) { int ii; if (! Gimages) return -1; if (! file) return -1; if (Nth >= Gfolders && Nth < Gfiles) if (strmatch(file,Gindex[Nth].file)) return Nth; for (ii = Gfolders; ii < Gfiles; ii++) if (strmatch(file,Gindex[ii].file)) break; if (ii < Gfiles) return ii; return -1; } /**************************************************************************************/ // Determine if a file is a folder or a supported image file type int thumbfoldercc = 0; void image_file_type_init() // 25.1 { // initialize from image index function if (thumbfolder && *thumbfolder == '/') thumbfoldercc = strlen(thumbfolder); } FTYPE image_file_type(ch *file) { int err, xcc; ch *ppx; ch ppx2[8], *RP; STATB statB; static ch myRAWtypes[1000] = " "; // room for 200 file types static ch myVIDEOtypes[1000] = " "; // ditto if (! file) return FNF; RP = f_realpath(file); // use real path if (! RP) return FNF; err = stat(RP,&statB); // file not found if (err) { zfree(RP); return FNF; } if (S_ISDIR(statB.st_mode)) { // folder zfree(RP); return FDIR; } if (! S_ISREG(statB.st_mode)) { // not a regular file zfree(RP); return OTHER; } if (thumbfoldercc && strmatchN(RP,thumbfolder,thumbfoldercc)) { // a fotocx thumbnail zfree(RP); return THUMB; } ppx = strrchr(RP,'.'); if (! ppx || ! *(ppx+1)) { // no file .ext 25.1 zfree(RP); return OTHER; } xcc = strlen(ppx); // file .ext > 6 chars. if (xcc > 6) { zfree(RP); return OTHER; } strcpy(ppx2,ppx); // add trailing blank: ".ext " strcpy(ppx2+xcc," "); zfree(RP); if (strcasestr(imagefiletypes,ppx2)) return IMAGE; // supported image type if (strcasestr(myRAWtypes,ppx2))return RAW; // one of my RAW types if (strcasestr(myVIDEOtypes,ppx2)) return VIDEO; // one of my VIDEO types if (strcasestr(RAWfiletypes,ppx2)) { // found in known RAW types strcat(myRAWtypes,ppx2); // add to my RAW types return RAW; } if (! Ffmpeg) return OTHER; // missing ffmpeg program if (strcasestr(VIDEOfiletypes,ppx2)) { // found in known VIDEO types strcat(myVIDEOtypes,ppx2); // add to my VIDEO types return VIDEO; } return OTHER; // not a known image file type } /**************************************************************************************/ // Given a thumbnail file, get the corresponding image file. // Returns null if no image file found. // Returned file is subject for zfree(). // image file: /image/folder/file.xxx // thumb folder: /thumb/folder // thumb file: /thumb/folder/image/folder/file.xxx.jpeg ch * thumb2imagefile(ch *thumbfile) // simplified { uint cc; ch *imagefile; static int Fdone = 0; if (! thumbfolder || *thumbfolder != '/') { if (! Fdone) printf("*** %s \n","no thumbnail folder"); Fdone++; return 0; } cc = strlen(thumbfolder); if (cc > strlen(thumbfile) - 12) { // /thumbfolder/imagefolder/file.xxx.jpeg printf("*** invalid thumbfile: %s \n",thumbfile); return 0; } imagefile = zstrdup(thumbfile+cc,"thumb2imagefile"); // /imagefolder/file.xxx.jpeg cc = strlen(imagefile); imagefile[cc-5] = 0; // /imagefolder/file.xxx if (regfile(imagefile)) return imagefile; // return if exists zfree(imagefile); // not found return 0; } // Given an image file, get the corresponding thumbnail file. // The filespec is returned whether or not the file exists. // Returned file is subject for zfree(). ch * image2thumbfile(ch *imagefile) // simplified { int cc1, cc2; ch *RP, *thumbfile; static int Fdone = 0; if (! thumbfolder || *thumbfolder != '/') { if (! Fdone++) printf("*** %s \n","no thumbnail folder"); return 0; } RP = f_realpath(imagefile); // use real path if (! RP) return 0; if (! regfile(RP)) { zfree(RP); return 0; } cc1 = strlen(thumbfolder); cc2 = strlen(RP); thumbfile = (ch *) zmalloc(cc1+cc2+6,"image2thumbfile"); strcpy(thumbfile,thumbfolder); // /thumb/folder strcpy(thumbfile+cc1,RP); // .../image/folder/file.xxx strcpy(thumbfile+cc1+cc2,".jpeg"); // .../image/folder/file.xxx.jpeg zfree(RP); return thumbfile; } // version to avoid use of zmalloc() & zfree() // output: ch thumbfile[XFCC] // returns 0 if OK, 1 if image file not found int image2thumbfile2(ch *imagefile, ch *thumbfile) { int cc1, cc2; ch *RP; static int Fdone = 0; *thumbfile = 0; if (! thumbfolder || *thumbfolder != '/') { if (! Fdone++) printf("*** no thumbnail folder\n"); return 1; } RP = f_realpath(imagefile); // use real path if (! RP) return 1; if (! regfile(RP)) { zfree(RP); return 1; } cc1 = strlen(thumbfolder); cc2 = strlen(RP); strcpy(thumbfile,thumbfolder); // /thumb/folder strcpy(thumbfile+cc1,RP); // .../image/folder/file.xxx strcpy(thumbfile+cc1+cc2,".jpeg"); // .../image/folder/file.xxx.jpeg zfree(RP); return 0; } /**************************************************************************************/ // check if thumbnail file is missing or stale. // returns 1 new thumbnail NOT needed // 0 new thumbnail needed int thumbfile_OK(ch *imagefile) { int ftype; STATB statF, statB; ch thumbfile[XFCC]; if (! regfile(imagefile,&statF)) return 1; // bad image file ftype = image_file_type(imagefile); if (ftype != IMAGE && ftype != RAW && ftype != VIDEO) return 1; // not an image file or RAW file image2thumbfile2(imagefile,thumbfile); // get thumbnail file for image file if (! regfile(thumbfile,&statB)) return 0; // thumbfile FNF if (statB.st_mtime != statF.st_mtime) return 0; // thumbnail is stale return 1; // thumbnail is up to date } /**************************************************************************************/ // get "folder" or "broken" pixbuf using cached pixbuf image // caller must avoid gdk_object_unref() of returned pixbuf PIXBUF * get_folder_pixbuf() { static int ftf = 1, err; static PIXBUF *bigpixbuf = 0; static PIXBUF *pixbuf = 0; static int psize = -1; static ch thumbfile[300] = ""; GError *gerror = 0; STATB statB; if (ftf) { ftf = 0; snprintf(thumbfile,300,"%s/folder.png",get_zhomedir()); // look for user folder.png err = stat(thumbfile,&statB); if (err) snprintf(thumbfile,300,"%s/folder.png",get_zimagedir()); // no, get package folder.png bigpixbuf = gdk_pixbuf_new_from_file(thumbfile,&gerror); if (! bigpixbuf) { printf("*** cannot make folder pixbuf: "); if (gerror) printf("%s \n",gerror->message); } } if (! bigpixbuf) return 0; if (thumbsize == psize) return pixbuf; pixbuf = gdk_pixbuf_scale_simple(bigpixbuf,thumbsize,thumbsize,BILINEAR); psize = thumbsize; return pixbuf; } PIXBUF * get_broken_pixbuf() { static int ftf = 1; static PIXBUF *bigpixbuf = 0; static PIXBUF *pixbuf = 0; static int psize = -1; static ch thumbfile[300] = ""; GError *gerror = 0; if (ftf) { ftf = 0; strncatv(thumbfile,300,zfuncs::zimagedir,"/broken.png",null); bigpixbuf = gdk_pixbuf_new_from_file(thumbfile,&gerror); if (! bigpixbuf) { printf("*** cannot make broken pixbuf: "); if (gerror) printf("%s \n",gerror->message); } } if (! bigpixbuf) return 0; if (thumbsize == psize) return pixbuf; pixbuf = gdk_pixbuf_scale_simple(bigpixbuf,thumbsize,thumbsize,BILINEAR); psize = thumbsize; return pixbuf; } /**************************************************************************************/ // create or replace thumbnail file if missing or stale. // returns 0 thumbnail exists already, nothing was done (OK) // 1 new thumbnail file created (OK) // 2 cannot create PXB or make thumbnail file (error) int update_thumbfile(ch *imagefile) { ch *pp, *tf, thumbfile[XFCC]; PXB *imagepxb = 0, *thumbpxb = 0; STATB statB; int err, size, retstat; timeval thumbtimes[2]; if (thumbfile_OK(imagefile)) return 0; // thumbnail file exists, not stale Fbusy(+1); // "working" err = image2thumbfile2(imagefile,thumbfile); // get thumbnail file for image file if (err) { retstat = 2; goto returnx; } pp = strrchr(thumbfile+1,'/'); // folder if (! pp) { retstat = 2; goto returnx; } *pp = 0; if (! dirfile(thumbfile)) { // create thumbnail folder if needed tf = zescape_quotes(thumbfile); err = zshell(0,"mkdir -p -m 0750 \"%s\"",tf); zfree(tf); } *pp = '/'; if (err && errno != EEXIST) { // happens, threads printf("*** mkdir failure: %s\n %s\n",thumbfile,strerror(errno)); retstat = 2; goto returnx; } pp = (ch *) strrchr(imagefile,'.'); if (! pp) { retstat = 2; goto returnx; } size = thumbfilesize; if (strcasestr(".jpg .jpeg",pp)) thumbpxb = JPG_PXB_load(imagefile,size); // JPEG file to PXB (reduced) else if (image_file_type(imagefile) == RAW) // RAW file thumbpxb = RAW_thumb_pxb(imagefile); // get thumb PXB from embedded image if (! thumbpxb) { imagepxb = PXB_load(imagefile,0); // any image file to PXB if (imagepxb) thumbpxb = PXB_rescale(imagepxb,size); // rescale PXB to thumbnail size } if (! thumbpxb) { retstat = 2; goto returnx; } err = PXB_JPG_save(thumbpxb,thumbfile,80); // save to JPEG thumbnail file if (err) { retstat = 2; goto returnx; } if (! regfile(imagefile,&statB)) { retstat = 2; goto returnx; } // get image file mod time thumbtimes[0].tv_sec = thumbtimes[1].tv_sec = statB.st_mtim.tv_sec; // thumbnail mod time thumbtimes[0].tv_usec = thumbtimes[1].tv_usec = 0; // = image file mod time utimes(thumbfile,thumbtimes); retstat = 1; returnx: if (retstat > 1) printf("*** update_thumbfile() failure: %s \n",imagefile); if (imagepxb) PXB_free(imagepxb); if (thumbpxb) PXB_free(thumbpxb); Fbusy(-1); return retstat; } /**************************************************************************************/ // Update thumbnail mod time to match corresponding image file // (avoid thumbnail refresh when image file metadata is modified) int thumbfile_set_mod_time(ch *imagefile) { STATB statB; ch thumbfile[XFCC]; int err; timeval thumbtimes[2]; if (! regfile(imagefile,&statB)) return ENOENT; // get image file mod time image2thumbfile2(imagefile,thumbfile); // get thumbnail file for image file if (! regfile(thumbfile)) return ENOENT; thumbtimes[0].tv_sec = thumbtimes[1].tv_sec = statB.st_mtim.tv_sec; // thumbnail mod time thumbtimes[0].tv_usec = thumbtimes[1].tv_usec = 0; // = image file mod time err = utimes(thumbfile,thumbtimes); return err; } /**************************************************************************************/ // Remove thumbnail from disk (for deleted or renamed image file). void delete_thumbfile(ch *imagefile) { int err; ch thumbfile[XFCC]; err = image2thumbfile2(imagefile,thumbfile); // get thumbnail file for image file if (err) return; remove(thumbfile); return; } /**************************************************************************************/ // get thumbnail pixbuf for given image file // DO NOT g_object_unref() returned pixbuf. PIXBUF * get_thumb_pixbuf(ch *imagefile) { ch thumbfile[XFCC]; int ii, err; int ww, hh, size; FTYPE ftype; STATB statB; PIXBUF *tempixbuf; static PIXBUF *pixbuf = 0; GError *gerror = 0; if (pixbuf) g_object_unref(pixbuf); // free prior pixbuf memory pixbuf = 0; if (thumbsize == 0) return 0; // should not happen if (! regfile(imagefile,&statB)) // check file exists if (! dirfile(imagefile,&statB)) return 0; ftype = image_file_type(imagefile); if (ftype == FDIR) // 'folder' image return get_folder_pixbuf(); if (ftype != IMAGE && ftype != RAW && ftype != VIDEO) // not an image or RAW or VIDEO file return get_broken_pixbuf(); // 'broken' image ii = update_thumbfile(imagefile); // make/refresh thumbnail file if (ii > 1) return 0; // fail if (thumbsize <= thumbfilesize) { err = image2thumbfile2(imagefile,thumbfile); // small, use thumbnail file if (! err) pixbuf = gdk_pixbuf_new_from_file(thumbfile,&gerror); } else pixbuf = gdk_pixbuf_new_from_file(imagefile,&gerror); // large, use image file if (! pixbuf) { printf("*** cannot make pixbuf: %s %s \n",gerror->message,imagefile); return 0; } ww = gdk_pixbuf_get_width(pixbuf); // get thumbnail actual size hh = gdk_pixbuf_get_height(pixbuf); size = ww; if (hh > ww) size = hh; if (size != thumbsize) { // rescale to thumbnail display size ww = ww * thumbsize / size; hh = hh * thumbsize / size; tempixbuf = gdk_pixbuf_scale_simple(pixbuf,ww,hh,BILINEAR); g_object_unref(pixbuf); pixbuf = tempixbuf; } return pixbuf; } /**************************************************************************************/ // popup a new window with a larger image of a clicked thumbnail void gallery_popimage() { static int ftf = 1, ii; static ch *popfiles[20]; // last 20 files int ftype; if (ftf) { ftf = 0; // initz. empty file memory for (ii = 0; ii < 20; ii++) popfiles[ii] = 0; ii = 0; } if (! clicked_file) return; ftype = image_file_type(clicked_file); // exclude RAW etc. if (ftype != IMAGE) return; ii++; // use next file memory position if (ii == 20) ii = 0; if (popfiles[ii]) zfree(popfiles[ii]); popfiles[ii] = clicked_file; // save clicked_file persistently clicked_file = 0; // reset clicked_file popup_image(popfiles[ii],MWIN,1,512); // popup window with image return; } /**************************************************************************************/ // select one image file by clicking a gallery thumbnail // returned file is subject for zfree() ch galsel1_filename[XFCC]; ch * select_1file(ch *gfolder) { zdialog *zd; int zstat; ch *cfolder; ch fgm; fgm = FGM; // save current view mode cfolder = zstrdup(navi::galleryname,"gallery-select"); // and gallery folder if (gfolder) { gallery(gfolder,"init",0); // switch to caller's gallery gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); // paint } *galsel1_filename = 0; // no selection viewmode('G'); /*** _________________________________________ | Image File | | | | Click thumbnail to select file | | | | Image File [__________________________] | | | | [OK] [X] | |_________________________________________| ***/ zd = zdialog_new(TX("Image File"),Mwin,"OK","X",null); // dialog to select a thumbnail zd_select_1file = zd; zdialog_add_widget(zd,"label","labtip","dialog",TX("Click thumbnail to select file")); zdialog_add_widget(zd,"hbox","hbf","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labf","hbf",TX("Image File"),"space=3"); zdialog_add_widget(zd,"zentry","filename","hbf",0,"space=3|expand"); zdialog_resize(zd,400,0); zdialog_run(zd,0,"parent"); // run dialog and wait for completion zstat = zdialog_wait(zd); // via mouse click function below zdialog_free(zd); zd_select_1file = 0; if (cfolder) { gallery(cfolder,"init",0); // restore view mode gallery(0,"sort",-2); zfree(cfolder); } viewmode(fgm); // may paint if (zstat != 1) return 0; // no selection if (*galsel1_filename != '/') return 0; if (! regfile(galsel1_filename)) return 0; // FNF return f_realpath(galsel1_filename); // use real path } void select_1file_Lclick_func(int Nth) // called by gallery mouse function { ch *imagefile = 0, *pp; int ftype; if (! zd_select_1file) return; // should not happen if (Nth < 0) return; imagefile = gallery(0,"get",Nth); // get file at clicked position if (! imagefile) return; ftype = image_file_type(imagefile); // must be image or RAW file if (ftype != IMAGE && ftype != RAW) { zfree(imagefile); return; } pp = strrchr(imagefile,'/') + 1; zdialog_stuff(zd_select_1file,"filename",pp); // stuff file name in dialog strncpy0(galsel1_filename,imagefile,XFCC); // save full path zfree(imagefile); return; } /**************************************************************************************/ // Select two input files and check that they have the same pixel dimensions. // error status returned: 0 = OK, 1 = <2 files selected, 2 = not same dimensions // The current file and its last version are selected by default. namespace select_2files_names { ch sfile1[XFCC]; ch sfile2[XFCC]; } int select_2files(ch *&file1, ch *&file2) // 26.8 { using namespace select_2files_names; int select_2files_dialog_event(zdialog *zd, ch *event); zdialog *zd; ch *pp; PXB *pxb1 = 0, *pxb2 = 0; int zstat, err; file1 = file2 = 0; // clear returned files /*** ____________________________________________ | Select two files | | | | File1 [_________________________] [browse] | | File2 [_________________________] [browse] | | | | [OK] [X] | |____________________________________________| ***/ zd = zdialog_new(TX("Select two files"),Mwin,"OK","X",null); // start dialog for user inputs zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=3"); zdialog_add_widget(zd,"label","lab1","hb1",TX("File1"),"space=3"); zdialog_add_widget(zd,"zentry","file1","hb1",0,"space=3|expand"); zdialog_add_widget(zd,"button","browse1","hb1",TX("browse"),"space=3"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=3"); zdialog_add_widget(zd,"label","lab2","hb2",TX("File2"),"space=3"); zdialog_add_widget(zd,"zentry","file2","hb2",0,"space=3|expand"); zdialog_add_widget(zd,"button","browse2","hb2",TX("browse"),"space=3"); if (curr_file) { // current file is available zdialog_stuff(zd,"file1",curr_file); // --> default file 1 pp = file_newest_version(curr_file); // if newest version available if (pp) zdialog_stuff(zd,"file2",pp); // --> default file 2 if (pp) zfree(pp); } *sfile1 = *sfile2 = 0; // clear returned files zdialog_resize(zd,300,0); zdialog_run(zd,select_2files_dialog_event); // run dialog - parallel zstat = zdialog_wait(zd); if (zstat != 1) goto ret1; // user cancel zdialog_fetch(zd,"file1",sfile1,XFCC); // get two input files if (! *sfile1) goto ret1; zdialog_fetch(zd,"file2",sfile2,XFCC); if (! *sfile2) goto ret1; pxb1 = PXB_load(sfile1,1); // check if two image files if (! pxb1) goto ret1; pxb2 = PXB_load(sfile2,1); if (! pxb2) goto ret1; if (pxb1->ww != pxb2->ww || pxb1->hh != pxb2->hh) // check image dimensions goto ret2; file1 = sfile1; // return files to user file2 = sfile2; goto ret0; ret0: err = 0; goto retall; ret1: err = 1; goto retall; ret2: err = 2; goto retall; retall: zdialog_free(zd); if (pxb1) PXB_free(pxb1); if (pxb2) PXB_free(pxb2); pxb1 = pxb2 = 0; return err; } // dialog event and completion function int select_2files_dialog_event(zdialog *zd, ch *event) { using namespace select_2files_names; ch *pp; if (zd->zstat) return 1; if (strmatch(event,"browse1")) // browse for image1 { pp = sfile1; if (! *pp) pp = navi::galleryname; if (! pp) pp = topfolders[0]; pp = select_1file(pp); if (! pp) return 1; zdialog_stuff(zd,"file1",pp); return 1; } if (strmatch(event,"browse2")) // browse for image2 { pp = sfile2; if (! *pp) pp = navi::galleryname; if (! pp) pp = topfolders[0]; pp = select_1file(pp); if (! pp) return 1; zdialog_stuff(zd,"file2",pp); return 1; } return 1; } /**************************************************************************************/ // Select multiple image files from thumbnail gallery window. // SelFiles[*]: list of selected image files, SFcount entries. // Pre-selected files are passed in the same list, which is updated. // The dialog shows the list of files selected and can be edited. namespace galselnames { int dialog_event(zdialog *zd, ch *event); int find_file(ch *imagefile); void add_file(ch *imagefile); void remove_file(ch *imagefile); void Xclick_func(int Nth, ch LR); int CBfunc(GtkWidget *txwidget, int line, int posn, ch *input); void showthumb(); GtkWidget *drawarea = 0; GtkWidget *Ftext = 0; int currline; ch *imagefile; int GSselect; // count of files in select dialog }; void select_files(int fclear) // remove fsetcurr 25.1 { using namespace galselnames; int ii, kk, dups = 0, yn = 0;; /*** _________________________________________________________________ | Select Image Files | | __________________________________ ________________________ | | | | | | | | | list of selected files | | image of current file | | | | | | selected in file list | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |__________________________________| |________________________| | | | | [Remove] [Clear] [Add All] [Add Current] [Disable] | | | | [OK] [X] | |_________________________________________________________________| ***/ if (zd_select_files) return; // already active 26.0 zdialog *zd = zdialog_new(TX("Select Image Files"),Mwin,"OK","X",null); zd_select_files = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"expand|space=3"); zdialog_add_widget(zd,"scrwin","scrwin","hb1",0,"expand"); zdialog_add_widget(zd,"text","files","scrwin"); zdialog_add_widget(zd,"frame","fr12","hb1",0,"space=5"); // for thumbnail - added later zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=5"); zdialog_add_widget(zd,"button","remove","hb2",TX("Remove"),"space=8"); zdialog_add_widget(zd,"button","clear","hb2",TX("Clear All"),"space=8"); zdialog_add_widget(zd,"button","addall","hb2",TX("Add All"),"space=8"); zdialog_add_widget(zd,"button","addcurr","hb2",TX("Add Current"),"space=8"); zdialog_add_widget(zd,"label","space","hb2",0,"expand"); zdialog_add_widget(zd,"button","disable","hb2",TX("Disable"),"space=8"); zdialog_add_ttip(zd,"remove",TX("remove selected file from list")); zdialog_add_ttip(zd,"clear",TX("remove all files in list")); zdialog_add_ttip(zd,"addall",TX("add all gallery files to list")); zdialog_add_ttip(zd,"addcurr",TX("add current file to list")); zdialog_add_ttip(zd,"disable",TX("disable thumbnail selection to enable popup menus etc. \n" "use [Enable] to resume thumbnail selection")); Ftext = zdialog_gtkwidget(zd,"files"); txwidget_set_eventfunc(Ftext,CBfunc); // set mouse/KB event function GtkWidget *frame = zdialog_gtkwidget(zd,"fr12"); // drawing area for thumbnail image drawarea = gtk_drawing_area_new(); gtk_widget_set_size_request(drawarea,256,258); gtk_container_add(GTK_CONTAINER(frame),drawarea); G_SIGNAL(drawarea,"draw",showthumb,0); zdialog_resize(zd,600,0); // start dialog zdialog_run(zd,dialog_event,"save"); // keep relative position txwidget_clear(Ftext); GSselect = 0; currline = -1; imagefile = 0; if (fclear) { // clear prior list if requested for (ii = 0; ii < SFcount; ii++) zfree(SelFiles[ii]); SFcount = 0; } for (ii = 0; ii < SFcount; ii++) // move prev. selected files to dialog { // and clear selected files list txwidget_append(Ftext,0,"%s\n",SelFiles[ii]); zfree(SelFiles[ii]); } GSselect = SFcount; SFcount = 0; viewmode('G'); // insure gallery view zdialog_wait(zd); // wait for dialog completion if (zd->zstat != 1) // cancel { zdialog_free(zd); // kill dialog - no selectd files zd_select_files = 0; return; } for (ii = 0; ii < GSselect; ii++) // [OK] { imagefile = txwidget_line(Ftext,ii,1); // get selected files from dialog if (! imagefile || ! *imagefile) continue; SelFiles[SFcount++] = imagefile; } for (ii = kk = 0; ii < SFcount; ii++) // look for duplicates for (kk = ii + 1; kk < SFcount; kk++) if (strmatch(SelFiles[ii],SelFiles[kk])) dups++; if (dups) yn = zmessageYN(Mwin,TX("remove %d duplicates?"),dups); // ask user if (yn) { for (ii = kk = 0; ii < SFcount; ii++) { // remove duplicates if (! SelFiles[ii]) continue; for (kk = ii + 1; kk < SFcount; kk++) { if (! SelFiles[kk]) continue; if (strmatch(SelFiles[ii],SelFiles[kk])) { zfree(SelFiles[kk]); SelFiles[kk] = 0; } } } for (ii = kk = 0; ii < SFcount; ii++) if (SelFiles[ii]) SelFiles[kk++] = SelFiles[ii]; SFcount = kk; } zdialog_free(zd); // kill dialog zd_select_files = 0; return; } // gallery getfiles dialog event function int galselnames::dialog_event(zdialog *zd, ch *event) { using namespace galselnames; ch *file, *ftemp; int Nth; FTYPE ftype; if (zd->zstat) { if (zd->zstat < 0) { zd_select_files = 0; // [x] kill dialog gallery(0,"paint",-1); } return 1; } if (strmatch(event,"disable")) // toggle disable/enable status { if (zd_select_files) { zdialog_put_data(zd,"disable",TX("Enable")); zd_select_files = 0; // suspend, no capture gallery clicks } // (button is the opposite) else { zdialog_put_data(zd,"disable",TX("Disable")); // resume, capture gallery clicks zd_select_files = zd; } return 1; } if (strmatch(event,"remove")) // remove file from list { if (! GSselect) return 1; if (currline < 0) return 1; ftemp = txwidget_line(Ftext,currline,0); // file (text line) to remove (keep \n) if (! ftemp) return 1; txwidget_delete(Ftext,currline); // remove from dialog list GSselect--; if (currline > GSselect-1) currline = GSselect - 1; txwidget_highlight_line(Ftext,currline); // next line showthumb(); // show thumbnail gallery(0,"paint",-1); } if (strmatch(event,"clear")) { // clear all files txwidget_clear(Ftext); GSselect = 0; currline = -1; showthumb(); // blank thumbnail gallery(0,"paint",-1); } if (strmatch(event,"addall")) // insert all files in image gallery { for (Nth = 0; ; Nth++) { if (GSselect == SFmax) { zmessageACK(Mwin,TX("exceed %d selected files"),SFmax); break; } ftemp = gallery(0,"getR",Nth); // next file if (! ftemp) break; ftype = image_file_type(ftemp); // must be image or RAW file if (ftype != IMAGE && ftype != RAW && ftype != VIDEO) continue; file = f_realpath(ftemp); // use real path if (! file) continue; GSselect++; txwidget_append(Ftext,0,"%s\n",file); // append - could be insert zfree(file); } txwidget_scroll(Ftext,-1); // scroll to end currline = GSselect - 1; // position at last file showthumb(); gallery(0,"paint",-1); } if (strmatch(event,"addcurr")) // add current file to selection add_file(curr_file); return 1; } // See if image file is in the file list already or not. // Return the last matching line number or -1 if not found. int galselnames::find_file(ch *imagefile) { using namespace galselnames; int line; ch *ftemp; for (line = GSselect-1; line >= 0; line--) { ftemp = txwidget_line(Ftext,line,1); // get file without \n if (! ftemp) continue; if (strmatch(ftemp,imagefile)) { zfree(ftemp); return line; } zfree(ftemp); } return -1; } // add image file to list, set thumbnail = file void galselnames::add_file(ch *imagefile) { using namespace galselnames; int ftype; ch *RP; if (GSselect == SFmax) { zmessageACK(Mwin,TX("exceed %d selected files"),SFmax); return; } ftype = image_file_type(imagefile); // must be image or RAW file if (ftype != IMAGE && ftype != RAW && ftype != VIDEO) return; RP = f_realpath(imagefile); // use real path if (! RP) return; txwidget_append2(Ftext,0,"%s\n",RP); // append file to list zfree(RP); GSselect++; currline = GSselect-1; txwidget_highlight_line(Ftext,currline); showthumb(); // update thumbnail if (FGM == 'G') gallery(0,"paint",-1); // highlight in gallery return; } // external access to add a file to the current selection void add_file_to_selection(ch *imagefile) { using namespace galselnames; if (! zd_select_files) return; add_file(imagefile); return; } // remove image file at last position found, set thumbnail = next // called when gallery thumbnail is right-clicked void galselnames::remove_file(ch *imagefile) { using namespace galselnames; int line; line = find_file(imagefile); // find last instance if (line < 0) return; currline = line; showthumb(); txwidget_delete(Ftext,currline); GSselect--; if (currline > GSselect-1) currline = GSselect - 1; txwidget_highlight_line(Ftext,currline); showthumb(); gallery(0,"paint",-1); return; } // called from image gallery window when a thumbnail is clicked // add image file to list at current position, set thumbnail = file void select_files_Lclick_func(int Nth) // left click, add { galselnames::Xclick_func(Nth,'L'); if (clicked_file) zfree(clicked_file); clicked_file = 0; return; } void select_files_Rclick_func(int Nth) // right click, find and remove { galselnames::Xclick_func(Nth,'R'); if (clicked_file) zfree(clicked_file); clicked_file = 0; return; } void galselnames::Xclick_func(int Nth, ch LR) { using namespace galselnames; ch *imagefile; FTYPE ftype; static int pNth = -1; // previously clicked file int nn, incr; if (! zd_select_files) return; // should not happen if (Nth < 0) return; // gallery gone ? imagefile = gallery(0,"getR",Nth); // get file at clicked position if (! imagefile) { pNth = -1; return; } ftype = image_file_type(imagefile); // must be image or RAW file if (ftype != IMAGE && ftype != RAW && ftype != VIDEO) { pNth = -1; return; } if (LR == 'R') { // right click, unselect remove_file(imagefile); return; } if (! KBshiftkey) // no shift key { pNth = Nth; // possible start of range add_file(imagefile); // add to list return; } if (KBshiftkey) // shift key, end of range { if (pNth < 0) return; // no start of range, ignore if (pNth > Nth) incr = -1; // range is descending else incr = +1; // ascending for (nn = pNth+incr; nn != Nth+incr; nn += incr) // add all files from pNth to Nth { // excluding pNth (already added) imagefile = gallery(0,"get",nn); if (! imagefile) continue; ftype = image_file_type(imagefile); // only image and RAW files if (ftype != IMAGE && ftype != RAW && ftype != VIDEO) continue; add_file(imagefile); } pNth = -1; // no prior return; } return; } // process mouse or key click in file list // set new current position and set thumbnail = clicked file int galselnames::CBfunc(GtkWidget *widget, int line, int posn, ch *input) { if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } if (! GSselect) return 0; // no lines if (*input >= 0xfd00) { if (*input == GDK_KEY_Up) currline--; // KB arrow key navigation if (*input == GDK_KEY_Down) currline++; if (*input == GDK_KEY_Page_Up) currline -= 10; if (*input == GDK_KEY_Page_Down) currline += 10; if (*input == GDK_KEY_Home) currline = 0; if (*input == GDK_KEY_End) currline = GSselect - 1; if (currline < 0) currline = 0; if (currline > GSselect-1) currline = GSselect - 1; txwidget_highlight_line(Ftext,currline); // highlight line txwidget_scroll(Ftext,currline); } if (line >= 0) { // line clicked txwidget_highlight_line(Ftext,line); // highlight currline = line; showthumb(); return 1; } showthumb(); return 1; } // show thumbnail for file at current position in select list void galselnames::showthumb() { using namespace galselnames; GdkWindow *gdkwin; ch thumbfile[XFCC]; PIXBUF *thumbpxb = 0; GError *gerror = 0; int err; static draw_context_t draw_context; cairo_t *cr; if (! GSselect) return; if (currline < 0) return; gdkwin = gtk_widget_get_window(drawarea); cr = draw_context_create(gdkwin,draw_context); imagefile = txwidget_line(Ftext,currline,1); // get curr. image without \n if (imagefile) { err = image2thumbfile2(imagefile,thumbfile); // use thumbnail file if (! err) thumbpxb = gdk_pixbuf_new_from_file_at_size(thumbfile,256,256,&gerror); } if (thumbpxb) { cairo_set_source_rgb(cr,1,1,1); // white background cairo_paint(cr); gdk_cairo_set_source_pixbuf(cr,thumbpxb,0,0); // + thumbnail cairo_paint(cr); g_object_unref(thumbpxb); } else { cairo_set_source_rgb(cr,1,1,1); // white background only cairo_paint(cr); } draw_context_destroy(draw_context); return; } /**************************************************************************************/ // gallery menu, resizable thumbnail view void m_thumbview(GtkWidget *, ch *menu) { F1_help_topic = TX("THUMB VIEW"); printf("m_thumbview \n"); Fthumbview = 1; if (thumbsize < 256) thumbsize = 256; viewmode('G'); gallery(0,"paint",-1); return; } // gallery menu, thumbnail with basic metadata view void m_metaview(GtkWidget *, ch *menu) { F1_help_topic = TX("METADATA VIEW"); printf("m_metaview \n"); Fthumbview = 2; viewmode('G'); gallery(0,"paint",-1); return; } /**************************************************************************************/ // Show recently viewed image files. void m_recentfiles(GtkWidget *, ch *menu) { F1_help_topic = TX("RECENT FILES"); printf("m_recentfiles \n"); navi::gallerytype = RECENT; // gallery type = recent files gallery(recentfiles_file,"initF",0); // generate gallery of recent files gallery(0,"paint",0); viewmode('G'); return; } // add a new file to the list of recent files, first position // ( < 1 millisec. typical at 1000 file limit) void add_recent_file(ch *newfile) { zlist_t *ZLfiles; ch *pp; int ii; ZLfiles = zlist_from_file(recentfiles_file); if (! ZLfiles) ZLfiles = zlist_new(0); ii = zlist_find(ZLfiles,newfile,0); // if file already present, remove it if (ii >= 0) zlist_remove(ZLfiles,ii); zlist_insert(ZLfiles,newfile,0); // insert in 1st position zlist_clear(ZLfiles,1000); // truncate to 1000 files zlist_to_file(ZLfiles,recentfiles_file); zlist_free(ZLfiles); pp = strrchr(newfile,'/'); // update recent folders list if (pp) *pp = 0; add_recent_folder(newfile); if (pp) *pp = '/'; return; } /**************************************************************************************/ // Report the newest or most recently modified image files, // based on metadata photo date or file mod date. namespace newest_files_names { struct newfile_t { // new file record ch *file; // image file ch fdate[20]; // date-time, yyyy:mm:dd hh:mm:ss }; } // menu function void m_newest_files(GtkWidget *, ch *menu) { using namespace newest_files_names; int newestfile_comp(ch *rec1, ch *rec2); ch *mess = TX("Use metadata photo date or file modification date?"); int ii, jj, cc, sort, Nxrec; xxrec_t *xxrec; FILE *fid; newfile_t *newfile = 0; F1_help_topic = TX("NEWEST FILES"); printf("m_newest_files \n"); if (Xindexlev < 2 || Findexnew > 0) { // check if full index needed 25.1 index_rebuild(2,0); // full index, get new/mod files if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } cc = Nxxrec * sizeof(newfile_t); // allocate memory newfile = (newfile_t *) zmalloc(cc,"newest_files"); if (menu && strmatch(menu,"metadata")) sort = 1; else if (menu && strmatch(menu,"file")) sort = 2; else sort = zdialog_choose(Mwin,"mouse",mess,TX("metadata"),TX("File"),null); if (sort < 1) return; // cancel for (ii = jj = 0; ii < Nxxrec; ii++) // loop image index table { xxrec = xxrec_tab[ii]; newfile[jj].file = xxrec->file; // image file if (sort == 1) { if (! *xxrec->pdate) continue; // use metadata photo date strncpy0(newfile[jj].fdate,xxrec->pdate,20); // ignore images without photo date } else strncpy0(newfile[jj].fdate,xxrec->fdate,20); // else use file mod date jj++; // selected files } Nxrec = jj; // final count if (Nxrec > 1) // sort index recs. by file date HeapSort((ch *) newfile, sizeof(newfile_t), Nxrec, newestfile_comp); fid = fopen(searchresults_file,"w"); // open output file if (! fid) { zmessageACK(Mwin,TX("file error: %s"),strerror(errno)); goto cleanup; } for (ii = 0; ii < 1000 && ii < Nxrec; ii++) // output newest 1000 image files fprintf(fid,"%s\n",newfile[ii].file); fclose(fid); cleanup: zfree(newfile); // free memory navi::gallerytype = NEWEST; // newest files gallery(searchresults_file,"initF",0); // generate gallery of files gallery(0,"paint",0); viewmode('G'); return; } // Compare 2 newfile records by file date-time // return <0 =0 >0 for rec2 < = > rec1 (descending sequence) using namespace newest_files_names; int newestfile_comp(ch *rec1, ch *rec2) { ch *date1 = ((newfile_t *) rec1)->fdate; ch *date2 = ((newfile_t *) rec2)->fdate; return strcmp(date2,date1); } /**************************************************************************************/ // menu function // dialog to choose gallery sort order and sort the gallery void m_gallery_sort(GtkWidget *, ch *menu) { zdialog *zd; int zstat, nn; ch albumfile[200], *pp, *pp2; ch *resetmess = TX("Reset all galleries to file name ascending"); F1_help_topic = TX("GALLERY SORT"); printf("m_gallery_sort \n"); /*** _________________________________ | Gallery Sort | | | | (o) File Name | | (o) File Name/Number | | (o) File Mod Date/Time | | (o) Photo Date/Time (metadata) | | (o) File Size (bytes) | | (o) Image Size (pixels) | | (o) Metadata from Search | | (o) ascending (o) descending | | | | [x] reset all galleries | | to file name ascending | | | | [Apply] [X] | |_________________________________| ***/ zd = zdialog_new("Gallery Sort",Mwin,TX("Apply"),"X",null); // user dialog zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"label","space","hb1",0,"space=2"); zdialog_add_widget(zd,"vbox","vb1","hb1"); zdialog_add_widget(zd,"radio","filename","vb1",TX("File Name")); zdialog_add_widget(zd,"radio","filenumber","vb1",TX("File Name/Number")); zdialog_add_widget(zd,"radio","filedate","vb1",TX("File Mod Date/Time")); zdialog_add_widget(zd,"radio","photodate","vb1",TX("Photo Date/Time (metadata)")); zdialog_add_widget(zd,"radio","filesize","vb1",TX("File Size (bytes)")); zdialog_add_widget(zd,"radio","pixelsize","vb1",TX("Image Size (pixels)")); zdialog_add_widget(zd,"radio","metadata","vb1",TX("Metadata from Search Function")); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=5"); zdialog_add_widget(zd,"radio","ascending","hb2",TX("ascending"),"space=4"); zdialog_add_widget(zd,"radio","descending","hb2",TX("descending"),"space=2"); zdialog_add_widget(zd,"hbox","hbreset","dialog",0,"space=5"); zdialog_add_widget(zd,"check","reset","hbreset",resetmess,"space=4"); zdialog_add_ttip(zd,"metadata",TX("metadata from Search Function, metadata report")); zdialog_add_ttip(zd,"filenumber",TX("embedded numbers will sort by value")); zdialog_stuff(zd,"filename",0); // all buttons off zdialog_stuff(zd,"filenumber",0); zdialog_stuff(zd,"filedate",0); // GTK radio buttons not reliable zdialog_stuff(zd,"photodate",0); // (vbox works, hbox does not) zdialog_stuff(zd,"filesize",0); zdialog_stuff(zd,"pixelsize",0); zdialog_stuff(zd,"metadata",0); zdialog_stuff(zd,"metadata",0); zdialog_stuff(zd,"descending",0); zdialog_stuff(zd,"reset",0); if (gallerysort == FNAME || gallerysort == SNONE) zdialog_stuff(zd,"filename",1); if (gallerysort == FNUMBER) zdialog_stuff(zd,"filenumber",1); if (gallerysort == FDATE) zdialog_stuff(zd,"filedate",1); if (gallerysort == PDATE) zdialog_stuff(zd,"photodate",1); if (gallerysort == FSIZE) zdialog_stuff(zd,"filesize",1); if (gallerysort == PSIZE) zdialog_stuff(zd,"pixelsize",1); if (gallerysort == MDATA) zdialog_stuff(zd,"metadata",1); if (galleryseq == ASCEND || galleryseq == QNONE) zdialog_stuff(zd,"ascending",1); if (galleryseq == DESCEND) zdialog_stuff(zd,"descending",1); zdialog_set_modal(zd); zdialog_run(zd,0,"mouse"); // run dialog, wait for completion zstat = zdialog_wait(zd); if (zstat != 1) { zdialog_free(zd); return; } zdialog_fetch(zd,"filename",nn); // get user sort type if (nn) gallerysort = FNAME; zdialog_fetch(zd,"filenumber",nn); if (nn) gallerysort = FNUMBER; zdialog_fetch(zd,"filedate",nn); if (nn) gallerysort = FDATE; zdialog_fetch(zd,"photodate",nn); if (nn) gallerysort = PDATE; zdialog_fetch(zd,"filesize",nn); if (nn) gallerysort = FSIZE; zdialog_fetch(zd,"pixelsize",nn); if (nn) gallerysort = PSIZE; zdialog_fetch(zd,"metadata",nn); if (nn) gallerysort = MDATA; zdialog_fetch(zd,"ascending",nn); // get ascending/descending if (nn) galleryseq = ASCEND; else galleryseq = DESCEND; zdialog_fetch(zd,"reset",nn); // reset all gallery sort memory if (nn) { // (revert to file name ascending) gallery_memory("reset"); gallerysort = FNAME; galleryseq = ASCEND; } zdialog_free(zd); gallery(0,"sort",-1); // sort the gallery gallery(0,"paint",0); // paint, position = 0 if (gallerytype == ALBUM) // an album was sorted { pp = strrchr(galleryname,'/'); // get album name if (pp) pp++; else pp = galleryname; pp2 = strstr(pp,"-sorted"); // append "-sorted" if (pp2) *pp2 = 0; // avoid "-sorted-sorted" snprintf(albumfile,200,"%s/%s-sorted",albums_folder,pp); album_create_from_gallery(albumfile); // new album, oldname-sorted album_show(albumfile); } return; } /**************************************************************************************/ // filter the current gallery for matching files // output matching files to album "gallery_filter" namespace gallery_filter_names { int Fall, Forg, Fver, Flast, Frating, Fkeywords, Ftext; int lorat, hirat; ch keywords[100], text[100]; } // menu function void m_gallery_filter(GtkWidget *, ch *menu) { using namespace gallery_filter_names; zdialog *zd; int zstat, ii, kk1, kk2, Nfiles, Fkeep; ch albumfile[AFCC]; ch *file, *pp1, *pp2; FTYPE ftype; FILE *fid; xxrec_t *xxrec; int rating; int gallery_filter_dialog_event(zdialog *zd, ch *event); F1_help_topic = TX("GALLERY FILTER"); printf("m_gallery_filter \n"); if (Gfiles < 1) { zmessageACK(Mwin,TX("gallery is empty")); return; } /*** _________________________________________________________________ | Gallery Filter | | | | [_] all files [_] originals [_] versions [_] last versions | | | | [_] rating range [__] [__] | inlcude if rating within range | [_] keyword names [__________________________________________] | include if any keyword present (comma separated) | [_] filename text [__________________________________________] | include if any text present (comma separated) | | | [OK] [X] | |_________________________________________________________________| ***/ zd = zdialog_new(TX("Gallery Filter"),Mwin,"OK","X",null); zdialog_add_widget(zd,"hbox","hbfiles","dialog",0,"space=3"); zdialog_add_widget(zd,"check","ckall","hbfiles",TX("all files")); zdialog_add_widget(zd,"check","ckorg","hbfiles",TX("originals")); zdialog_add_widget(zd,"check","ckver","hbfiles",TX("versions")); zdialog_add_widget(zd,"check","cklast","hbfiles",TX("last versions")); zdialog_add_widget(zd,"hbox","hbrat","dialog"); zdialog_add_widget(zd,"check","ckrat","hbrat",TX("rating range")); zdialog_add_widget(zd,"zspin","lorat","hbrat","0|5|1|0","size=3|space=5"); zdialog_add_widget(zd,"zspin","hirat","hbrat","0|5|1|5","size=3"); zdialog_add_widget(zd,"hbox","hbkeywords","dialog"); zdialog_add_widget(zd,"check","ckkeywords","hbkeywords",TX("keyword names")); zdialog_add_widget(zd,"zentry","keywords","hbkeywords",0,"space=5|expand"); zdialog_add_widget(zd,"hbox","hbtext","dialog"); zdialog_add_widget(zd,"check","cktext","hbtext",TX("filename text")); zdialog_add_widget(zd,"zentry","text","hbtext",0,"space=5|expand"); zdialog_add_ttip(zd,"ckall",TX("include all files")); zdialog_add_ttip(zd,"ckorg",TX("include original files")); zdialog_add_ttip(zd,"ckver",TX("include edited versions")); zdialog_add_ttip(zd,"cklast",TX("include last versions only")); zdialog_add_ttip(zd,"ckrat",TX("get images within rating range")); zdialog_add_ttip(zd,"ckkeywords",TX("get images with matching keywords (comma separated)")); zdialog_add_ttip(zd,"cktext",TX("get images having text in filename (comma separated)")); zdialog_load_inputs(zd); zdialog_resize(zd,400,0); zdialog_run(zd,gallery_filter_dialog_event,"mouse"); // start dialog zdialog_send_event(zd,"init"); zstat = zdialog_wait(zd); // wait if (zstat != 1) { // cancel zdialog_free(zd); return; } zdialog_fetch(zd,"ckall",Fall); // get all inputs zdialog_fetch(zd,"ckorg",Forg); zdialog_fetch(zd,"ckver",Fver); zdialog_fetch(zd,"cklast",Flast); zdialog_fetch(zd,"ckrat",Frating); zdialog_fetch(zd,"ckkeywords",Fkeywords); zdialog_fetch(zd,"cktext",Ftext); zdialog_fetch(zd,"lorat",lorat); zdialog_fetch(zd,"hirat",hirat); zdialog_fetch(zd,"keywords",keywords,100); zdialog_fetch(zd,"text",text,100); zdialog_free(zd); snprintf(albumfile,AFCC,"%s/gallery_filter",albums_folder); // output to album "gallery_filter" fid = fopen(albumfile,"w"); // open/write album file if (! fid) { zmessageACK(Mwin,strerror(errno)); return; } Nfiles = 0; for (ii = 0; ii < Gfiles; ii++) // loop files in current gallery { file = gallery(0,"getR",ii); if (! file) break; ftype = image_file_type(file); // must be image type file if (ftype != IMAGE && ftype != RAW && ftype != VIDEO) continue; Fkeep = 0; if (Fall) Fkeep = 1; // keep all files if (! Fkeep && Forg) { pp1 = strrchr(file,'/'); // /.../filename.vNN.jpg if (pp1) pp1 = strrchr(pp1,'.'); // | if (pp1 && ! strmatchN(pp1-4,".v",2)) Fkeep = 1; // pp1 } if (! Fkeep && Fver) { pp1 = strrchr(file,'/'); // /.../filename.vNN.jpg if (pp1) pp1 = strrchr(pp1,'.'); // | if (pp1 && strmatchN(pp1-4,".v",2)) Fkeep = 1; // pp1 } if (! Fkeep && Flast) { pp1 = file_newest_version(file); if (strmatch(pp1,file)) Fkeep = 1; } if (! Fkeep) continue; if (Frating) { xxrec = get_xxrec(file); // get image rating if (! xxrec) continue; // deleted, not image file rating = xxrec->rating[0] - '0'; // numeric 0-5 if (rating < lorat || rating > hirat) continue; // test within limits } if (Fkeywords) { xxrec = get_xxrec(file); // get image keywords if (! xxrec) continue; // deleted, not image file for (kk1 = 1; ; kk1++) // loop keywords to search { pp1 = substring(keywords,',',kk1); if (! pp1) goto nomatch; // no match found for (kk2 = 1; ; kk2++) { // loop image keywords pp2 = substring(xxrec->keywords,',',kk2); if (! pp2) break; if (strmatchcase(pp1,pp2)) goto keywordmatch; } } } keywordmatch: if (Ftext) { for (kk1 = 1; ; kk1++) { // get text strings to match pp1 = substring(text,',',kk1); if (! pp1) goto nomatch; // no match found pp2 = strrchr(file,'/'); if (strcasestr(pp2,pp1)) goto textmatch; } } textmatch: fprintf(fid,"%s\n",file); // filtered output file Nfiles++; if (Nfiles == maxalbumfiles) { zmessageACK(Mwin,TX("max. album files reached, results truncated")); break; } nomatch: continue; } fclose(fid); if (Nfiles) { zstrcopy(curr_album,albumfile,"albums"); // make current album panelmessage(1,3,TX("new album created")); // 25.1 album_show(); } else { zmessageACK(Mwin,TX("no matching files found")); remove(albumfile); return; } return; } // dialog event and completion function int gallery_filter_dialog_event(zdialog *zd, ch *event) { using namespace gallery_filter_names; if (strmatch(event,"ckall")) { // if all, clear org, ver, last zdialog_fetch(zd,"ckall",Fall); if (Fall) Forg = Fver = Flast = 0; } if (strmatch(event,"ckorg")) { // if org, clear all zdialog_fetch(zd,"ckorg",Forg); if (Forg) Fall = 0; } if (strmatch(event,"ckver")) { // if ver, clear all, last zdialog_fetch(zd,"ckver",Fver); if (Fver) Fall = Flast = 0; } if (strmatch(event,"cklast")) { // if last, clear all, ver zdialog_fetch(zd,"cklast",Flast); if (Flast) Fall = Fver = 0; } if (Forg && Fver) { // if org and ver, clear both Fall = 1; // and set all Forg = Fver = 0; } if (! Forg && ! Fver && ! Flast) Fall = 1; // default zdialog_stuff(zd,"ckall",Fall); // update dialog zdialog_stuff(zd,"ckorg",Forg); zdialog_stuff(zd,"ckver",Fver); zdialog_stuff(zd,"cklast",Flast); zdialog_fetch(zd,"ckrat",Frating); zdialog_fetch(zd,"ckkeywords",Fkeywords); zdialog_fetch(zd,"cktext",Ftext); zdialog_fetch(zd,"lorat",lorat); zdialog_fetch(zd,"hirat",hirat); zdialog_fetch(zd,"keywords",keywords,100); zdialog_fetch(zd,"text",text,100); return 1; } /**************************************************************************************/ // set the gallery from the current image file folder void m_current_file_folder(GtkWidget*, ch *menu) { F1_help_topic = TX("CURRENT FILE FOLDER"); printf("m_current_file_folder \n"); if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } gallery(curr_file,"init",0); // new gallery gallery(curr_file,"paint",0); // position at curr. file curr_file_posn = file_position(curr_file,0); // file position in gallery list viewmode('G'); return; } /**************************************************************************************/ // set the gallery from a recently used file folder void m_recent_folders(GtkWidget*, ch *menu) { void recent_folders_choose(GtkWidget *, ch *); int nf = 0; ch *folder; F1_help_topic = TX("RECENT FOLDERS"); printf("m_recent_folders \n"); if (! ZLrecent_folders) ZLrecent_folders = zlist_from_file(recent_folders_file); if (ZLrecent_folders) nf = zlist_count(ZLrecent_folders); if (! nf) { zmessageACK(Mwin,TX("no saved folders")); return; } folder = popup_choose(ZLrecent_folders); if (! folder) return; gallery(folder,"init",0); // set new gallery gallery(0,"sort",-2); // last sort and position gallery(0,"paint",-1); // show viewmode('G'); return; } // add a new folder to the list of recent folders, first position // execution time is under 1 milllisecond void add_recent_folder(ch *foldername) { int ii; if (! ZLrecent_folders) ZLrecent_folders = zlist_from_file(recent_folders_file); if (! ZLrecent_folders) ZLrecent_folders = zlist_new(0); ii = zlist_find(ZLrecent_folders,foldername,0); if (ii >= 0) zlist_remove(ZLrecent_folders,ii); zlist_insert(ZLrecent_folders,foldername,0); zlist_clear(ZLrecent_folders,10); zlist_to_file(ZLrecent_folders,recent_folders_file); return; } /**************************************************************************************/ // set the gallery from the last search results void m_search_results(GtkWidget*, ch *menu) { ch albumfile[200]; snprintf(albumfile,200,"%s/search_results",albums_folder); album_show(albumfile); return; } /**************************************************************************************/ // generate a clickable list of all image folders // show gallery for any folder clicked namespace folder_tree { #define maxdirs 10000 int Nlines = 0, Fall = 0; int currline = 0; zdialog *zdpop; typedef struct { ch *name; // /dir1/dir2/.../dirN folder name int Nsubs; // subfolder count 0-N int8 lev; // folder level 0-N, top/sub/sub ... int8 exp; // folder status 0/1 = collapsed/expanded int16 line; // txwidget line -1 = not displayed } dlist_t; dlist_t *dlist; int drecl = sizeof(dlist_t); int compfunc(ch *rec1, ch *rec2); int CBfunc(GtkWidget *, int line, int pos, ch *input); void writetext(); } // menu function void m_folder_tree(GtkWidget *, ch *) { using namespace folder_tree; int ii, jj, cc, pcc, NF, err; ch *dir, *pdir, **Flist; F1_help_topic = TX("FOLDER TREE"); printf("m_folder_tree \n"); if (Xindexlev < 1) { index_rebuild(1,0); if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } /*** ________________________________ | Folder Tree | | ____________________________ | | | | | | | [+] topdir1 | | | | [-] topdir2 | | | | subdir1 | | | | [+] subdir2 | | | | subdir3 | | | | [+] topdir3 | | | | ... | | | |____________________________| | | | | [OK] | |________________________________| ***/ if (dlist) goto report; // already done cc = drecl * maxdirs; dlist = (dlist_t *) zmalloc(cc,"folder_tree"); // memory for folder list Fall = 0; for (ii = 0; ii < Ntopfolders; ii++) // loop all top image folders { dlist[Fall].name = topfolders[ii]; Fall++; if (Fall == maxdirs) break; err = find_imagefiles(topfolders[ii],8+16,Flist,NF); // folders, all levels if (err) { zmessageACK(Mwin,strerror(errno)); continue; } for (jj = 0; jj < NF; jj++) // add to folders list { dlist[Fall].name = zstrdup(Flist[jj],"folder_tree"); Fall++; if (Fall == maxdirs) break; } if (NF) zfree(Flist); if (Fall == maxdirs) break; } if (Fall > 1) HeapSort((ch *) dlist,drecl,Fall,compfunc); // sort alphabetically for (ii = 0; ii < Fall; ii++) // loop all folders { dir = dlist[ii].name; // this folder name for (jj = ii-1; jj >= 0; jj--) { // search backwards for parent pdir = dlist[jj].name; // previous folder name pcc = strlen(pdir); if (strmatchN(dir,pdir,pcc) && dir[pcc] == '/') break; // this dir = prev dir + /... } if (jj >= 0) { // parent found dlist[ii].lev = dlist[jj].lev + 1; // level = parent level + 1 dlist[jj].Nsubs++; // add parent subdir count } else dlist[ii].lev = 0; // no parent, level = 0 } for (ii = 0; ii < Fall; ii++) // loop all folders dlist[ii].exp = 0; // expand = no report: zdpop = popup_report_open(TX("Folders"),Mwin,300,400,0,0,CBfunc,"X",null); // open report window writetext(); // write top folders to window currline = 0; // first entry return; } // sort compare function int folder_tree::compfunc(ch *rec1, ch *rec2) { dlist_t *dir1 = (dlist_t *) rec1; dlist_t *dir2 = (dlist_t *) rec2; int nn; nn = strcasecmp(dir1->name,dir2->name); if (nn) return nn; nn = strcmp(dir1->name,dir2->name); return nn; } // folder list mouse function int folder_tree::CBfunc(GtkWidget *txwidget, int line, int pos, ch *input) { using namespace folder_tree; int ii; ch *pline, *pp; static int fbusy = 0; if (fbusy++) return 0; // stop re-entry if (line < 0) // KB key { line = currline; if (strmatch(input,"up")) line--; // KB arrow key navigation if (strmatch(input,"down")) line++; if (line < 0) line = 0; if (line > Nlines-1) line = Nlines - 1; } pline = txwidget_line(txwidget,line,1); // txwidget line: ... [x] dirname if (! pline || ! *pline) goto returnx; txwidget_highlight_line(txwidget,line); txwidget_scroll(txwidget,line); currline = line; for (ii = 0; ii < Fall; ii++) // find dlist[] rec corresponding if (line == dlist[ii].line) break; // to txwidget line clicked if (ii == Fall) goto returnx; if (pos > 0) // clicked position { pp = strchr(pline,'['); if (pp) { // [+] or [-] button present if (pos < (pp-pline)) goto returnx; // click position before button if (pos >= (pp-pline) && pos <= (pp+2-pline)) { // on the button if (pp[1] == '+') dlist[ii].exp = 1; // set expand flag if (pp[1] == '-') dlist[ii].exp = 0; writetext(); // refresh txwidget txwidget_highlight_line(txwidget,line); txwidget_scroll(txwidget,line); goto returnx; } } } viewmode('G'); gallery(dlist[ii].name,"init",0); // folder name clicked gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); // show gallery returnx: fbusy = 0; if (input && strstr("up down",input)) return 1; // input processed by me else return 0; // not } // write all visible folders to text window void folder_tree::writetext() { using namespace folder_tree; int ii = 0, jj, line = 0; ch *pp, indent[100]; ch *expbutt; memset(indent,' ',100); popup_report_clear(zdpop); while (ii < Fall) // loop all folders { jj = dlist[ii].lev * 4; // indent 4 blanks per folder level if (jj > 99) jj = 99; indent[jj] = 0; if (dlist[ii].Nsubs == 0) expbutt = " "; // no subdirs, no expand button else if (dlist[ii].exp) expbutt = "[-]"; // prepare [+] or [-] else expbutt = "[+]"; pp = strrchr(dlist[ii].name,'/'); if (! pp) continue; popup_report_write2(zdpop,0,"%s %s %s \n",indent,expbutt,pp+1); // ... [x] dirname indent[jj] = ' '; dlist[ii].line = line; // text line for this folder line++; if (dlist[ii].exp) { // if folder expanded, continue ii++; continue; } for (jj = ii + 1; jj < Fall; jj++) { // not expanded, find next folder if (dlist[jj].lev <= dlist[ii].lev) break; // at same or lower level dlist[jj].line = -1; // no text line for skipped folders } ii = jj; } Nlines = line; return; } /**************************************************************************************/ // menu function to pre-select files for feeding album, batch and script functions void m_select_files(GtkWidget *, ch *) { ch albumfile[200]; FILE *fid; int ii; F1_help_topic = TX("SELECT IMAGE FILES"); printf("m_select_files \n"); snprintf(albumfile,200,"%s/selected_files",albums_folder); // "selected files" album select_files(0); if (SFcount == 0) { remove(albumfile); // nothing selected return; } fid = fopen(albumfile,"w"); // create "selected files" album if (! fid) { zmessageACK(Mwin,strerror(errno)); return; } for (ii = 0; ii < SFcount; ii++) // fill with selected files fprintf(fid,"%s\n",SelFiles[ii]); fclose(fid); return; } /**************************************************************************************/ namespace bookmarknames { #define maxbmks 50 ch *bookmarks[maxbmks]; // bookmark names and files int Nbmks; // count of entries int bmkposn; // current entry, 0-last zdialog *zd_bookmark; GtkWidget *txwidget; } void bookmarks_load(); void bookmarks_refresh(); // select a bookmark and jump gallery to selected bookmark thumbnail void m_bookmarks(GtkWidget *, ch *) { using namespace bookmarknames; int bookmarks_dialog_event(zdialog *zd, ch *event); int bookmarks_CBfunc(GtkWidget *, int line, int pos, ch *input); zdialog *zd; /*** _______________________________________________ | Bookmarks | |-----------------------------------------------| | bookmarkname1 /topdir/.../filename1.jpg | | bookmarkname2 /topdir/.../filename2.jpg | | bookmarkname3 /topdir/.../filename3.jpg | | bookmarkname4 /topdir/.../filename4.jpg | | bookmarkname5 /topdir/.../filename5.jpg | | bookmarkname6 /topdir/.../filename6.jpg | | | | [Edit Bookmarks] [X] | |_______________________________________________| ***/ F1_help_topic = TX("BOOKMARKS"); printf("m_bookmarks \n"); if (zd_edit_bookmarks) return; // already busy if (zd_bookmark) return; zd = zdialog_new(TX("Bookmarks"),Mwin,TX("Edit Bookmarks"),"X",null); zd_bookmark = zd; zdialog_add_widget(zd,"frame","frame","dialog",0,"space=5|expand"); zdialog_add_widget(zd,"scrwin","scrwin","frame"); zdialog_add_widget(zd,"text","bmklist","scrwin"); txwidget = zdialog_gtkwidget(zd,"bmklist"); // set mouse/KB event function txwidget_set_eventfunc(txwidget,bookmarks_CBfunc); bookmarks_load(); // get bookmarks from bookmarks file bookmarks_refresh(); // update bookmarks list in dialog zdialog_resize(zd,400,300); zdialog_run(zd,bookmarks_dialog_event,"mouse"); // run dialog return; } // dialog event and completion function int bookmarks_dialog_event(zdialog *zd, ch *event) { using namespace bookmarknames; int zstat; zstat = zd->zstat; if (! zstat) return 1; // wait for completion zdialog_free(zd); zd_bookmark = 0; if (zstat == 1) m_edit_bookmarks(0,0); // [edit bookmarks] button return 1; } // mouse click function to receive clicked bookmarks int bookmarks_CBfunc(GtkWidget *, int line, int pos, ch *input) { using namespace bookmarknames; ch *file; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } if (! zd_bookmark) return 1; bmkposn = line; // get clicked line if (bmkposn < 0 || bmkposn > Nbmks-1) return 1; file = bookmarks[bmkposn] + 32; if (! regfile(file)) { zmessageACK(Mwin,TX("file not found")); return 1; } f_open(file,0); // open file (for yellow highlight) gallery(file,"init",0); // go to gallery and file position gallery(file,"paint",0); viewmode('G'); return 1; } /**************************************************************************************/ // edit bookmarks void m_edit_bookmarks(GtkWidget *, ch *) { using namespace bookmarknames; int edit_bookmarks_dialog_event(zdialog *zd, ch *event); int edit_bookmarks_CBfunc(GtkWidget *, int line, int pos, ch *input); zdialog *zd; ch *bmk_add = TX("Add bookmark: click on a gallery thumbnail. \n" "Rename bookmark: click it and press [Rename]"); /*** _______________________________________________ | Edit Bookmarks | | | | Click list position. Click thumbnail to add. | |-----------------------------------------------| | bookmarkname1 /topdir/.../filename1.jpg | | bookmarkname2 /topdir/.../filename2.jpg | | bookmarkname3 /topdir/.../filename3.jpg | | bookmarkname4 /topdir/.../filename4.jpg | | bookmarkname5 /topdir/.../filename5.jpg | | bookmarkname6 /topdir/.../filename6.jpg | |-----------------------------------------------| | [bookmarkname...] [rename] [delete] | | [OK] [X] | |_______________________________________________| ***/ F1_help_topic = TX("BOOKMARKS"); printf("m_edit_bookmarks \n"); if (zd_edit_bookmarks) return; // already busy zd = zdialog_new(TX("Edit Bookmarks"),Mwin,"OK","X",null); zd_edit_bookmarks = zd; zdialog_add_widget(zd,"hbox","hbtip","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labtip","hbtip",bmk_add,"space=5"); zdialog_add_widget(zd,"scrwin","scrwin","dialog",0,"expand"); zdialog_add_widget(zd,"text","bmklist","scrwin"); zdialog_add_widget(zd,"hbox","hbname","dialog",0,"space=5"); zdialog_add_widget(zd,"zentry","bmkname","hbname",0,"space=5|size=30"); zdialog_add_widget(zd,"button","rename","hbname",TX("Rename"),"space=5"); zdialog_add_widget(zd,"button","delete","hbname",TX("Delete"),"space=5"); txwidget = zdialog_gtkwidget(zd,"bmklist"); // set mouse/KB event function txwidget_set_eventfunc(txwidget,edit_bookmarks_CBfunc); bookmarks_load(); // load bookmarks from bookmarks file bookmarks_refresh(); // update bookmarks list in dialog zdialog_resize(zd,500,400); zdialog_run(zd,edit_bookmarks_dialog_event,"save"); // run dialog, parallel viewmode('G'); // show current gallery return; } // load bookmarks list from bookmarks file void bookmarks_load() { using namespace bookmarknames; ch buff[XFCC]; ch *pp, *pp2; FILE *fid; Nbmks = 0; fid = fopen(bookmarks_file,"r"); if (fid) { while (true) { pp = fgets_trim(buff,XFCC,fid,1); // next bookmark rec. if (! pp) break; if (strlen(pp) < 40) continue; pp2 = strchr(pp+32,'/'); // verify bookmark if (! pp2) continue; if (! regfile(pp2)) continue; bookmarks[Nbmks] = zstrdup(pp,"bookmarks"); // fill bookmark list if (++Nbmks == maxbmks) break; } fclose(fid); } bmkposn = Nbmks; // next free position return; } // mouse click function to select existing bookmark from list int edit_bookmarks_CBfunc(GtkWidget *, int line, int pos, ch *input) { using namespace bookmarknames; ch bookmarkname[32]; if (*input == GDK_KEY_F1) { // key F1 pressed, show help show_help(F1_help_topic); return 1; } if (! zd_edit_bookmarks) return 1; if (Nbmks < 1) return 1; if (line < 0) line = 0; if (line > Nbmks-1) line = Nbmks-1; bmkposn = line; strncpy0(bookmarkname,bookmarks[bmkposn],31); strTrim(bookmarkname); zdialog_stuff(zd_edit_bookmarks,"bmkname",bookmarkname); return 1; } // mouse click function to receive clicked thumbnails for new/revised bookmarks void edit_bookmarks_Lclick_func(int Nth) { using namespace bookmarknames; ch *imagefile, *newbookmark; ch *pp, bookmarkname[32]; int cc; if (! zd_edit_bookmarks) return; if (Nth < 0) return; // gallery gone ? imagefile = gallery(0,"getR",Nth); // get file at clicked position if (! imagefile) return; pp = strrchr(imagefile,'/'); // get file name or last subfolder name if (! pp) return; // to use as default bookmark name strncpy0(bookmarkname,pp+1,31); // max. 30 chars. + null cc = strlen(imagefile) + 34; // construct bookmark record: newbookmark = (ch *) zmalloc(cc,"bookmarks"); // filename /folders.../filename snprintf(newbookmark,cc,"%-30s %s",bookmarkname,imagefile); if (Nbmks == maxbmks) { // if list full, remove first zfree(bookmarks[0]); Nbmks--; for (int ii = 0; ii < Nbmks; ii++) bookmarks[ii] = bookmarks[ii+1]; } if (Nbmks == 0) bmkposn = 0; // 1st bookmark --> 0 else bmkposn++; // else clicked position + 1 if (bmkposn < 0) bmkposn = 0; if (bmkposn > Nbmks) bmkposn = Nbmks; for (int ii = Nbmks; ii > bmkposn; ii--) // make hole to insert new bookmark bookmarks[ii] = bookmarks[ii-1]; bookmarks[bmkposn] = newbookmark; // insert Nbmks++; bookmarks_refresh(); // update bookmarks list in dialog zdialog_stuff(zd_edit_bookmarks,"bmkname",bookmarkname); return; } // dialog event and completion function int edit_bookmarks_dialog_event(zdialog *zd, ch *event) { using namespace bookmarknames; ch bookmarkname[32]; FILE *fid; int cc; if (strmatch(event,"delete")) // delete bookmark at position { if (bmkposn < 0 || bmkposn > Nbmks-1) return 1; for (int ii = bmkposn; ii < Nbmks-1; ii++) bookmarks[ii] = bookmarks[ii+1]; Nbmks--; zdialog_stuff(zd,"bmkname",""); // clear name field bookmarks_refresh(); // update bookmarks list in dialog } if (strmatch(event,"rename")) // apply new name to bookmark { if (bmkposn < 0 || bmkposn > Nbmks-1) return 1; zdialog_fetch(zd,"bmkname",bookmarkname,31); // get name from dialog cc = strlen(bookmarkname); if (cc < 30) memset(bookmarkname+cc,' ',30-cc); // blank pad to 30 chars. bookmarkname[30] = 0; memcpy(bookmarks[bmkposn],bookmarkname,30); // replace name in bookmarks list bookmarks_refresh(); // update bookmarks list in dialog } if (! zd->zstat) return 1; // wait for completion if (zd->zstat == 1) // done { fid = fopen(bookmarks_file,"w"); // write bookmarks file if (! fid) zmessageACK(Mwin,TX("unable to save bookmarks file")); else { for (int ii = 0; ii < Nbmks; ii++) fprintf(fid,"%s\n",bookmarks[ii]); fclose(fid); } } for (int ii = 0; ii < Nbmks; ii++) // free memory zfree(bookmarks[ii]); zdialog_free(zd); zd_edit_bookmarks = 0; return 1; } // private function to update dialog widget with new bookmarks list void bookmarks_refresh() { using namespace bookmarknames; ch bookmarkline[XFCC+32]; ch blanks[33] = " "; int cc; if (! zd_edit_bookmarks && ! zd_bookmark) return; txwidget_clear(txwidget); // clear bookmarks list for (int ii = 0; ii < Nbmks; ii++) { // write bookmarks list strncpy0(bookmarkline,bookmarks[ii],31); cc = utf8len(bookmarkline); // compensate multibyte chars. strncat(bookmarkline,blanks,32-cc); strcat(bookmarkline,bookmarks[ii]+32); txwidget_append(txwidget,0,"%s\n",bookmarkline); } return; } /**************************************************************************************/ // Show an image file in a popup window at mouse position. // Re-use most recent window or create a new one if Fnewin != 0. // Returns 0 if OK, +N otherwise. namespace popup_image_names { GtkWidget *window[10], *drawarea[10]; // up to 10 popup windows open ch *filex[10], reqfull[10], isfull[10]; float winc = 1.26, wdec = 0.80; // window upsize/downsize ratios int Nw = 0; } int popup_image(ch *file, GtkWindow *parent, int Fnewin, int size) { using namespace popup_image_names; static int ftf = 1; ch *pp; ch *tipmess(TX("zoom via mouse wheel or Keys +/=/-/↑/↓")); int popup_image_draw(GtkWidget *, cairo_t *, int &Nw); int popup_image_scroll(GtkWidget *, GdkEvent *event, int &Nw); int popup_image_KBevent(GtkWidget *, GdkEventKey *event, int &Nw); int popup_image_mousebutt(GtkWidget *, GdkEvent *event, int &Nw); if (! main_thread()) zappcrash("popup_image() called from thread"); if (ftf) { ftf = 0; poptext_mouse(tipmess,0,0,0,8); } if (Fnewin) if (++Nw == 10) Nw = 0; // new window, re-use oldest up to 10 if (! Fnewin) while (Nw > 0 && window[Nw] == 0) Nw--; // else re-use latest still active if (window[Nw]) { gtk_widget_destroy(drawarea[Nw]); drawarea[Nw] = 0; zfree(filex[Nw]); filex[Nw] = 0; } else { window[Nw] = gtk_window_new(GTK_WINDOW_TOPLEVEL); // create new popup window if (! window[Nw]) return 1; if (! size) size = 512; gtk_window_set_default_size(GTK_WINDOW(window[Nw]),size,size); pp = strrchr(file,'/'); // window title = file name gtk_window_set_title(GTK_WINDOW(window[Nw]),pp+1); if (parent) { gtk_window_set_transient_for(GTK_WINDOW(window[Nw]),parent); gtk_window_set_destroy_with_parent(GTK_WINDOW(window[Nw]),1); } gtk_window_set_position(GTK_WINDOW(window[Nw]),GTK_WIN_POS_MOUSE); } filex[Nw] = zstrdup(file,"popup_image"); drawarea[Nw] = gtk_drawing_area_new(); // new drawing area always required if (! drawarea[Nw]) return 2; gtk_container_add(GTK_CONTAINER(window[Nw]),drawarea[Nw]); reqfull[Nw] = isfull[Nw] = 0; // not fullscreen gtk_widget_add_events(window[Nw],GDK_SCROLL_MASK); gtk_widget_add_events(window[Nw],GDK_KEY_PRESS_MASK); gtk_widget_add_events(window[Nw],GDK_BUTTON_RELEASE_MASK); G_SIGNAL(window[Nw],"destroy",gtk_widget_destroyed,&window[Nw]); // set window = null if destroyed G_SIGNAL(window[Nw],"draw",popup_image_draw,&Nval[Nw]); G_SIGNAL(window[Nw],"scroll-event",popup_image_scroll,&Nval[Nw]); // connect events G_SIGNAL(window[Nw],"key-press-event",popup_image_KBevent,&Nval[Nw]); G_SIGNAL(window[Nw],"button-press-event",popup_image_mousebutt,&Nval[Nw]); // 26.8 gtk_widget_show_all(window[Nw]); return 0; } // rescale image and repaint window to fit int popup_image_draw(GtkWidget *window, cairo_t *cr, int &nn) { using namespace popup_image_names; PXB *pxb1, *pxb2; int ww1, hh1, ww2, hh2; double area; ch *file; file = filex[nn]; if (! file) return 1; pxb1 = PXB_load(file,1); if (! pxb1) return 1; ww1 = pxb1->ww; // image dimensions hh1 = pxb1->hh; gtk_window_get_size(GTK_WINDOW(window),&ww2,&hh2); // current window dimensions area = ww2 * hh2; ww2 = sqrt(area * ww1 / hh1); // fit window to image, keeping same area hh2 = area / ww2; pxb2 = PXB_rescale(pxb1,ww2,hh2); // rescale image to window gtk_window_resize(GTK_WINDOW(window),ww2,hh2); gdk_cairo_set_source_pixbuf(cr,pxb2->pixbuf,0,0); // draw image cairo_paint(cr); PXB_free(pxb1); PXB_free(pxb2); return 1; } // respond to mouse scroll button and zoom window larger or smaller int popup_image_scroll(GtkWidget *window, GdkEvent *event, int &nn) { using namespace popup_image_names; int scroll, ww, hh; double ff = 1.0; if (event->type == GDK_SCROLL) { // mouse wheel event scroll = ((GdkEventScroll *) event)->direction; if (scroll == GDK_SCROLL_UP) ff = winc; if (scroll == GDK_SCROLL_DOWN) ff = wdec; } gtk_window_get_size(GTK_WINDOW(window),&ww,&hh); // current window dimensions ww *= ff; // new dimensions hh *= ff; if (ww > monitor_ww || hh > monitor_hh) { // request > screen size, fullscreen reqfull[nn] = 1; gtk_window_fullscreen(GTK_WINDOW(window)); return 1; } reqfull[nn] = 0; gtk_window_unfullscreen(GTK_WINDOW(window)); if (ww + hh > 512) gtk_window_resize(GTK_WINDOW(window),ww,hh); // rescale up or down else gtk_widget_destroy(window); // if very small, delete window return 1; } // respond to KB events F11 (fullscreen/unfullscreen) // Escape (destroy) // +/= or up-arrow make image larger // - or down-arrow make image smaller int popup_image_KBevent(GtkWidget *window, GdkEventKey *event, int &nn) { using namespace popup_image_names; int KBkey = event->keyval; int ww, hh; double ff = 0; if (KBkey == GDK_KEY_Escape) gtk_widget_destroy(window); if (KBkey == GDK_KEY_F11) { if (reqfull[nn]) { reqfull[nn] = 0; gtk_window_unfullscreen(GTK_WINDOW(window)); } else { reqfull[nn] = 1; gtk_window_fullscreen(GTK_WINDOW(window)); } } if (KBkey == GDK_KEY_plus || KBkey == GDK_KEY_KP_Add || KBkey == GDK_KEY_equal || KBkey == GDK_KEY_Up) ff = winc; if (KBkey == GDK_KEY_minus || KBkey == GDK_KEY_KP_Subtract || KBkey == GDK_KEY_Down) ff = wdec; if (ff) { gtk_window_get_size(GTK_WINDOW(window),&ww,&hh); // current window dimensions ww *= ff; // new dimensions hh *= ff; if (ww > monitor_ww || hh > monitor_hh) { // request > screen size, fullscreen reqfull[nn] = 1; gtk_window_fullscreen(GTK_WINDOW(window)); return 1; } reqfull[nn] = 0; gtk_window_unfullscreen(GTK_WINDOW(window)); if (ww + hh > 512) gtk_window_resize(GTK_WINDOW(window),ww,hh); // rescale up or down else gtk_widget_destroy(window); // if very small, delete window } return 1; } // respond to mouse button events on popup image // left: zoom-in right: kill image int popup_image_mousebutt(GtkWidget *window, GdkEvent *event, int &nn) // 26.8 { using namespace popup_image_names; GdkEventButton *eventB = (GdkEventButton *) event; int mousebutt = eventB->button; int KBaltkey = 0; int ww, hh; if (eventB->state & GDK_MOD1_MASK) KBaltkey = 1; if (mousebutt == 1 && KBaltkey) mousebutt = 3; // left butt + ALT key >> right butt if (mousebutt == 1) // zoom-in { gtk_window_get_size(GTK_WINDOW(window),&ww,&hh); // current window dimensions ww *= winc; // new dimensions hh *= winc; if (ww > monitor_ww || hh > monitor_hh) { // request > screen size, fullscreen reqfull[nn] = 1; gtk_window_fullscreen(GTK_WINDOW(window)); return 1; } gtk_window_resize(GTK_WINDOW(window),ww,hh); // rescale up or down } if (mousebutt == 3) gtk_widget_destroy(window); // delete window return 0; } fotocx/f.netmap.cc0000664000175000017500000010641415247006660013055 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** image geotag mapping (internet maps) // all functions 26.7 ------------------------------------ m_load_netmap display net map (OpenFreeMap web app) map_marker_event find images within clicked marker, show gallery of images map_mouse_event respond to mouse movement and clicks on map find_geocoordinates convert location/country into latitude/longitude ***************************************************************************************/ #define EX extern // disable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) using namespace zfuncs; /**************************************************************************************/ // OpenFreeMap and libwebkit functions generated by Claude/Anthropic // 26.7 #include /* ------------------------------------------------------------------------ * HTML/JS page that actually renders the map. * Loads MapLibre GL JS from a CDN. * Uses OpenFreeMap's liberty style: https://tiles.openfreemap.org/styles/liberty * which is free to use with no API key. * ------------------------------------------------------------------------ */ static const char *MAP_HTML = "" "" "" "" "" "" "" "
" "" ""; /**************************************************************************************/ /* Shared completion callback for our "fire and forget" evaluate_javascript() * calls (add_marker, clear_markers). We don't need the JS return value, but * we still must call the _finish() function to release the GAsyncResult, * and it's the right place to report any JavaScript errors. */ static void on_js_call_finished(GObject *source, GAsyncResult *result, gpointer user_data) { (void)user_data; GError *error = NULL; JSCValue *value = webkit_web_view_evaluate_javascript_finish( WEBKIT_WEB_VIEW(source), result, &error); if (!value) { g_warning("add_marker: JavaScript error: %s", error->message); g_error_free(error); return; } /* value is owned by us; we don't need it, so just release it. */ g_object_unref(value); } /**************************************************************************************/ /* ------------------------------------------------------------------------ * add_marker() * * Adds a marker to the currently displayed map by injecting a call to the * page's window.addMarker() JavaScript function. * * id - a caller-chosen unique string identifying the marker * lat/lon - marker position in degrees * label - text shown in the marker's popup and reported back on click * ------------------------------------------------------------------------ */ void add_marker(WebKitWebView *webview, const char *id, double lat, double lon, const char *label) { if (webview == NULL) { g_warning("add_marker: no webview available yet"); return; } gchar *id_json = g_strdup_printf("\"%s\"", id); gchar *label_json = g_strdup_printf("\"%s\"", label); gchar *script = g_strdup_printf("window.addMarker(%s, %f, %f, %s);", id_json, lat, lon, label_json); g_free(id_json); g_free(label_json); webkit_web_view_evaluate_javascript(webview, script, -1, NULL, NULL, NULL, on_js_call_finished, NULL); g_free(script); } /* ------------------------------------------------------------------------ * on_marker_clicked() * ------------------------------------------------------------------------ */ static void on_marker_clicked(WebKitUserContentManager *manager, WebKitJavascriptResult *js_result, gpointer user_data) { (void) manager; (void) user_data; JSCValue *value = webkit_javascript_result_get_js_value(js_result); gchar *payload = jsc_value_to_string(value); /* JSON string from JS */ map_marker_event(payload); g_free(payload); } /* ------------------------------------------------------------------------ * clear_markers() * * Removes every marker currently shown on the map by calling the page's * window.clearMarkers() JavaScript function. * ------------------------------------------------------------------------ */ void clear_markers(WebKitWebView *webview) { if (webview == NULL) { g_warning("clear_markers: no webview available yet"); return; } /* Reuse the same completion handler as add_marker(); we don't care * about the (undefined) return value either way, just error reporting. */ webkit_web_view_evaluate_javascript(webview, "window.clearMarkers();", -1, NULL, NULL, NULL, on_js_call_finished, NULL); } /* ------------------------------------------------------------------------ * function6: set_map_view * * Recenters the map at (lat, lon) and rescales it to the given zoom level, * by calling the page's window.setMapView() JavaScript function. * * lat/lon - new map center, in degrees * zoom - new zoom level (MapLibre's usual range is roughly 0-22, * depending on the style's available data) * ------------------------------------------------------------------------ */ void set_map_view(WebKitWebView *webview, double lat, double lon, double zoom) { if (webview == NULL) { g_warning("set_map_view: no webview available yet"); return; } /* Format the numbers locale-independently (always using '.' as the * decimal separator): g_strdup_printf()'s %f is locale-sensitive, and * on systems where the locale uses ',' as the decimal separator that * would produce invalid JavaScript (e.g. "48,8566" instead of * "48.8566"). */ gchar lat_buf[G_ASCII_DTOSTR_BUF_SIZE]; gchar lon_buf[G_ASCII_DTOSTR_BUF_SIZE]; gchar zoom_buf[G_ASCII_DTOSTR_BUF_SIZE]; g_ascii_formatd(lat_buf, sizeof(lat_buf), "%f", lat); g_ascii_formatd(lon_buf, sizeof(lon_buf), "%f", lon); g_ascii_formatd(zoom_buf, sizeof(zoom_buf), "%f", zoom); gchar *script = g_strdup_printf("window.setMapView(%s, %s, %s);", lat_buf, lon_buf, zoom_buf); webkit_web_view_evaluate_javascript(webview, script, -1, NULL, NULL, NULL, on_js_call_finished, NULL); g_free(script); } /**************************************************************************************/ /* Scale information for the map's current view, as produced by * get_scale_info() below. */ typedef struct { double zoom; double center_lat; double center_lon; double meters_per_pixel; /* ground distance per screen pixel */ double pixels_per_degree_lat; /* screen pixels per degree of latitude */ double pixels_per_degree_lon; /* screen pixels per degree of longitude */ } ScaleInfo; /* Called with the result once get_scale_info()'s async JS call completes. * On failure (e.g. the page hasn't loaded yet), info is NULL. */ typedef void (*ScaleInfoCallback)(const ScaleInfo *info, gpointer user_data); /* Bundles a caller's ScaleInfoCallback + user_data so it can travel through * as the gpointer passed to the GAsyncReadyCallback below. */ typedef struct { ScaleInfoCallback callback; gpointer user_data; } ScaleInfoRequest; double meters_per_pixel; // returned data static void on_get_scale_info_finished(GObject *source, GAsyncResult *result, gpointer user_data) { ScaleInfoRequest *req = (ScaleInfoRequest *) user_data; GError *error = NULL; JSCValue *value = webkit_web_view_evaluate_javascript_finish( WEBKIT_WEB_VIEW(source), result, &error); if (!value) { g_warning("get_scale_info: JavaScript error: %s", error->message); g_error_free(error); if (req->callback) req->callback(NULL, req->user_data); g_free(req); return; } /* window.getScaleInfo() returns a comma-separated string: * zoom,centerLat,centerLon,metersPerPixel,pxPerDegLat,pxPerDegLon */ gchar *str = jsc_value_to_string(value); g_object_unref(value); ScaleInfo info = { 0 }; sscanf(str, "%lf,%lf,%lf,%lf,%lf,%lf", &info.zoom, &info.center_lat, &info.center_lon, &info.meters_per_pixel, &info.pixels_per_degree_lat, &info.pixels_per_degree_lon); g_free(str); meters_per_pixel = info.meters_per_pixel; // save result g_free(req); } /* ------------------------------------------------------------------------ * get_scale_info() * * Asynchronously fetches scale information for the map's current view — * the zoom level, the map center, and derived measurements (meters per * screen pixel, and how many screen pixels correspond to one degree of * latitude/longitude at that position and zoom). * * This is inherently asynchronous: WebKit's JS evaluation always runs on * the page's own event loop and reports back later, so the result is * delivered via `callback` instead of a return value. * ------------------------------------------------------------------------ */ void get_scale_info(WebKitWebView *webview, ScaleInfoCallback callback, gpointer user_data) { meters_per_pixel = -1; // initz. invalid result if (webview == NULL) { g_warning("get_scale_info: no webview available yet"); if (callback) callback(NULL, user_data); return; } ScaleInfoRequest *req = g_new0(ScaleInfoRequest, 1); req->callback = callback; req->user_data = user_data; webkit_web_view_evaluate_javascript(webview, "window.getScaleInfo();", -1, NULL, NULL, NULL, on_get_scale_info_finished, req); while (meters_per_pixel < 0) // wait for result zmainsleep(0.01); return; } /**************************************************************************************/ // respond to mouse movement and clicks other than marker clicks /* Kind of mouse event reported by on_map_mouse_event() below. */ typedef enum { MAP_MOUSE_EVENT_CLICK, /* click on the map, NOT on a marker */ MAP_MOUSE_EVENT_MOVE /* mouse moved to a new map position, which may * be over a marker */ } MapMouseEventType; /* Info passed to on_map_mouse_event() for every general mouse event. */ typedef struct { MapMouseEventType type; double lat; double lon; } MapMouseEvent; /* Application-specific reaction to a general mouse event. Mouse movement * fires continuously, so this updates a status label rather than popping a * dialog; a click on empty map area also logs to the console. Swap this out * for whatever your app actually needs (e.g. updating a crosshair overlay, * starting a measurement tool, looking up what's at that location, etc). */ static void handle_map_mouse_event(const MapMouseEvent *event) { map_mouse_event(event->type,event->lat, event->lon); return; } /* ------------------------------------------------------------------------ * function5: on_map_mouse_event * * Invoked whenever JavaScript posts a message to the "mapMouseEvent" * handler (see the click/mousemove listeners on the map container inside * MAP_HTML). Unlike on_marker_clicked(), this fires for: * - clicks on the map that are NOT on a marker * - mouse movement to any map position (including over a marker) * * The posted message is a JSON string (the same approach as * on_marker_clicked() above), parsed here with simple substring/strtod * extraction. For anything more complex, use a JSON library instead. * ------------------------------------------------------------------------ */ static void on_map_mouse_event(WebKitUserContentManager *manager, WebKitJavascriptResult *js_result, gpointer user_data) { (void)manager; (void)user_data; JSCValue *value = webkit_javascript_result_get_js_value(js_result); gchar *payload = jsc_value_to_string(value); /* JSON string from JS */ MapMouseEvent mouse_event = { MAP_MOUSE_EVENT_MOVE, 0.0, 0.0 }; gboolean ok = TRUE; /* type: "click" or "move" */ const char *type_key = "\"type\":\""; char *p = strstr(payload, type_key); if (p) { p += strlen(type_key); mouse_event.type = (strncmp(p, "click", 5) == 0) ? MAP_MOUSE_EVENT_CLICK : MAP_MOUSE_EVENT_MOVE; } else { ok = FALSE; } /* lat: */ const char *lat_key = "\"lat\":"; p = strstr(payload, lat_key); if (p) { mouse_event.lat = g_ascii_strtod(p + strlen(lat_key), NULL); } else { ok = FALSE; } /* lon: */ const char *lon_key = "\"lon\":"; p = strstr(payload, lon_key); if (p) { mouse_event.lon = g_ascii_strtod(p + strlen(lon_key), NULL); } else { ok = FALSE; } if (ok) { handle_map_mouse_event(&mouse_event); } else { g_warning("on_map_mouse_event: unexpected payload: %s", payload); } g_free(payload); } /**************************************************************************************/ /* set indicator when map load is finished */ static int load_finished = 0; static void on_load_changed(WebKitWebView *webview, WebKitLoadEvent event, gpointer user_data) { (void) user_data; if (event == WEBKIT_LOAD_FINISHED) load_finished = 1; } /**************************************************************************************/ // internet map initialization - load map and show markers for all images WebKitWebView *g_webview = NULL; char *map_html = "https://tiles.openfreemap.org/"; void m_load_netmap(GtkWidget *, ch *) { static int markers_loaded = 0; int ii; float flati, flongi; printf("m_load_netmap \n"); if (! g_webview) // initialize internet map { load_finished = 0; WebKitUserContentManager *content_manager = webkit_user_content_manager_new(); // setup webkit content manager webkit_user_content_manager_register_script_message_handler // setup marker click response function (content_manager, "markerClicked"); g_signal_connect(content_manager, "script-message-received::markerClicked", G_CALLBACK(on_marker_clicked), NULL); webkit_user_content_manager_register_script_message_handler( content_manager, "mapMouseEvent"); g_signal_connect(content_manager, "script-message-received::mapMouseEvent", G_CALLBACK(on_map_mouse_event), NULL); g_webview = WEBKIT_WEB_VIEW(webkit_web_view_new_with_user_content_manager // connect function to content manager (content_manager)); g_signal_connect(g_webview,"load-changed",G_CALLBACK(on_load_changed), NULL); gtk_container_add(GTK_CONTAINER(Mhbox),GTK_WIDGET(g_webview)); // add webview to main window container webkit_web_view_load_html(g_webview, MAP_HTML, map_html); // connect to web server while (! load_finished) zmainsleep(0.1); // delay until map load finished } gtk_widget_show_all(GTK_WIDGET(g_webview)); // show map if (markers_loaded) return; load_imagelocs(); // refresh image geolocations table for (ii = 0; ii < Nimagelocs; ii++) // show markers for all images { flati = imagelocs[ii]->flati; flongi = imagelocs[ii]->flongi; add_marker(g_webview,null,flati,flongi,null); } markers_loaded = 1; return; } /************************************************************************************** Code from here on is from Fotocx author // 26.7 ***************************************************************************************/ // respond to marker click: find images marker, show gallery of images void map_marker_event(ch *payload) // 26.7 { float flati, flongi, mlati, mlongi; float hdist, hdist2, vdist, dist, mrad; int ii, nn; ch *pp; xxrec_t *xxrec; FILE *fid; zdialog *zd = zd_mapgeotags; if (Xindexlev < 1) { index_rebuild(1,0); if (Nxxrec == 0) { zmessageACK(Mwin,TX("image index required")); return; } } get_scale_info(g_webview,null,null); // get current map scale if (meters_per_pixel <= 0) return; mrad = 4 * meters_per_pixel; // marker radius in map meters pp = strstr(payload,"lat"); // get marker latitude if (! pp) return; if (pp[4] != ':') return; mlati = atof(pp+5); if (mlati < -90 || mlati > 90) return; pp = strstr(payload,"lon"); // get marker longitude if (! pp) return; if (pp[4] != ':') return; mlongi = atof(pp+5); if (mlongi < -180 || mlongi > 180) return; if (zd) { // if active zdialog, map_mouse_event(MAP_MOUSE_EVENT_CLICK,mlati,mlongi); // stuff clicked location information return; } fid = fopen(searchresults_file,"w"); // open output file if (! fid) { zmessageACK(Mwin,TX("file error: %s"),strerror(errno)); return; } for (ii = nn = 0; ii < Nxxrec; ii++) // show all images at location { zmainloop(100); // keep GTK alive xxrec = xxrec_tab[ii]; get_gps_data(xxrec->gps_data,flati,flongi); // file geocoordinates if (! flati || ! flongi) continue; vdist = mlati - flati; // vert distance, degrees latitude hdist = mlongi - flongi; // horz distance, degrees longitude hdist2 = hdist * cosf(0.0175 * mlati); // horz distance, degrees dist = sqrtf((vdist * vdist) + (hdist2 * hdist2)); // distance in degrees dist = dist * 111000; // distance in meters if (dist > mrad) continue; // outside marker fprintf(fid,"%s\n",xxrec->file); // output matching file nn++; } fclose(fid); if (! nn) { poptext_mouse(TX("No images found"),10,0,0,3); return; } navi::gallerytype = SEARCH; // search results gallery(searchresults_file,"initF",0); // generate gallery of matching files gallery(0,"paint",0); viewmode('G'); return; } /**************************************************************************************/ // respond to mouse movement and clicks on map (not on marker) // clicks: look for pending dialog and supply location information if available // movements: show known location name close to mouse pointer location void map_mouse_event(int type, float flati, float flongi) // 26.7 { int iim, iic, mrad, Fuseloc = 0; ch *location = 0, *country = 0; float glati, glongi, km; ch text[100], gps_data[24]; zdialog *zd = zd_mapgeotags; glati = glongi = 0; km = nearest_loc(flati,flongi,iim,iic); // find nearest known location if (iim > -1) { glati = imagelocs[iim]->flati; // nearest image location glongi = imagelocs[iim]->flongi; location = imagelocs[iim]->location; country = imagelocs[iim]->country; } if (iic > -1) { // nearest world cities location glati = worldlocs[iic]->flati; glongi = worldlocs[iic]->flongi; location = worldlocs[iic]->location; country = worldlocs[iic]->country; } if (! location) return; // should not happen get_scale_info(g_webview,null,null); // get current map scale mrad = 4 * meters_per_pixel; // marker radius in map meters if (mrad * 0.001 > km) Fuseloc = 1; // location < marker size from mouse if (zd && type == MAP_MOUSE_EVENT_CLICK) // stuff active dialog { if (Fuseloc) { zdialog_stuff(zd,"location",location); // known location clicked zdialog_stuff(zd,"country",country); // stuff location and geocoordinates snprintf(gps_data,24,"%.4f %.4f",glati,glongi); zdialog_stuff(zd,"gps_data",gps_data); } else { snprintf(gps_data,24,"%.4f %.4f",flati,flongi); // new location clicked zdialog_stuff(zd,"gps_data",gps_data); // stuff geocoordinates only add_marker(g_webview,null,flati,flongi,null); // add new marker } zdialog_send_event(zd,"geomap-click"); // activate calling dialog return; } if (Fuseloc) { snprintf(text,100,"%s \n %.4f %.4f",location,flati,flongi); // show location and coordinates poptext_mouse(text,20,-20,0.1,3); // close to mouse } else { snprintf(text,20,"%.4f %.4f",flati,flongi); // show coordinates only poptext_mouse(text,20,-20,0.1,3); } return; } /**************************************************************************************/ // go to the map position of the selected image file or current image file void m_show_on_map(GtkWidget *, ch *) // 26.7 { ch location[40], country[40], gps_data[24]; static ch *file = 0; float flati, flongi; xxrec_t *xxrec; zdialog *zd = zd_mapgeotags; static int ftf = 1; F1_help_topic = TX("SHOW ON MAP"); if (zd) // active dialog { zdialog_fetch(zd,"location",location,40); // get location data from dialog zdialog_fetch(zd,"country",country,40); zdialog_fetch(zd,"gps_data",gps_data,24); get_gps_data(gps_data,flati,flongi); } else // else look for file { if (file) zfree(file); file = 0; if (clicked_file) { // use clicked file if present file = clicked_file; clicked_file = 0; } else if (curr_file) // else current file file = zstrdup(curr_file,"map-zoomin"); else return; xxrec = get_xxrec(file); if (! xxrec) return; // deleted, not an image file strncpy0(location,xxrec->location,40); // get location data from file strncpy0(country,xxrec->country,40); get_gps_data(xxrec->gps_data,flati,flongi); } if (flati == 0 && flongi == 0) { // geocoordinates not found find_geocoordinates(location,country,flati,flongi); // try to get from location if (! flati || ! flongi) { printf("no geocoordinates found"); return; } } viewmode('M'); // show location on map set_map_view(g_webview,flati,flongi,8); if (ftf) { // repeat if first time here 26.8 ftf = 0; // (else marker is missing) zmainsleep(0.5); set_map_view(g_webview,flati,flongi,8); } return; } /**************************************************************************************/ // Find geocoordinates for a given location and country. // Searches both known locations and world cities locations // Return: 0 = not found, 1 = found one match, 2 = found multiple close matches // If return 2, returned geocoordinates = center of box enclosing matching locations int find_geocoordinates(ch *location, ch *country, float &glati, float &glongi) // 26.7 { int nn, ii, cc; float flati, flongi; float minflati, maxflati, minflongi, maxflongi; glati = glongi = 0; nn = load_imagelocs(); // load image and world locations tables nn += load_worldlocs(); // (if not already) if (! nn) return 0; minflati = 999; maxflati = -999; minflongi = 999; maxflongi = -999; for (ii = 0; ii < Nimagelocs; ii++) // search all image files { // for location and country if (*location) { cc = strlen(location); if (! strmatchcaseN(location,imagelocs[ii]->location,cc)) continue; } if (*country) { cc = strlen(country); if (! strmatchcaseN(country,imagelocs[ii]->country,cc)) continue; } flati = imagelocs[ii]->flati; flongi = imagelocs[ii]->flongi; if (! flati || ! flongi) continue; if (flati < minflati) minflati = flati; if (flati > maxflati) maxflati = flati; if (flongi < minflongi) minflongi = flongi; if (flongi > maxflongi) maxflongi = flongi; } for (ii = 0; ii < Nworldlocs; ii++) // search world locations table { // for location and country if (*location) { cc = strlen(location); if (! strmatchcaseN(location,worldlocs[ii]->location,cc)) continue; } if (*country) { cc = strlen(country); if (! strmatchcaseN(country,worldlocs[ii]->country,cc)) continue; } flati = worldlocs[ii]->flati; flongi = worldlocs[ii]->flongi; if (! flati || ! flongi) continue; if (flati < minflati) minflati = flati; if (flati > maxflati) maxflati = flati; if (flongi < minflongi) minflongi = flongi; if (flongi > maxflongi) maxflongi = flongi; } if (minflati == 999) { // no match found glati = glongi = 0; return 0; } if (minflati == maxflati && minflongi == maxflongi) { // one matching location glati = minflati; glongi = minflongi; return 1; } if (maxflati - minflati < 1 && // multiple matching locations (maxflongi - minflongi) * cosf(maxflati) < 1) // within 1 degree (111 km) { glati = 0.5 * (minflati + maxflati); // return middle of enclosing box glongi = 0.5 * (minflongi + maxflongi); return 2; } else { printf("*** multiple matches, too far apart \n"); glati = glongi = 0; // return no match return 0; } } fotocx/f.pixmap.cc0000664000175000017500000062342315247006660013073 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit - functions for pixmap memory images PXM_make create PXM pixmap RGB[A] float PXM_free free PXM pixmap memory PXM_audit audit PXM pixmap for errors PXM_clear clear PXM pixmap white/opaque or black/transparent PXM_addalpha add alhpa channel to PXM pixmap PXM_subalpha remove alhpa channel from PXM pixmap PXM_applyalpha apply alpha channel to RGB values PXM_copy copy (duplicate) PXM pixmap PXM_copy_area copy area from one PXM pixmap to another PXM_rescale copy and rescale PXM pixmap PXM_rotate copy and rotate PXM pixmap PXM_upright rotate and/or mirror PXM pixmap PXM_blur blur PXM pixmap image using specified blur radius PXM_rgbdepth set PXM pixmap image color depth 1-16 bits/color PXB_make create PXB pixmap RGB[A] uint8 PXB_free free PXB pixmap memory PXB_clear clear PXB pixmap to zeros PXB_addalpha add alhpa channel to PXB pixmap PXB_subalpha remove alpha channel from PXB pixmap PXB_copy copy (duplicate) PXB pixmap PXB_copy_area copy area from one PXB into another PXB_subpxb create new PXB from section of existing PXB PXB_half rescale PXB pixmap to 1/2 size PXB_rescale rescale PXB pixmap - ww/hh independent PXB_rescale_fast fast rescale PXB pixmap - ww/hh independent PXB_rescale rescale PXB pixmap - max. ww/hh, preserve ratio PXB_rescale_fast fast rescale PXB pixmap - max. ww/hh, preserve ratio PXB_rotate rotate PXB pixmap, any angle vpixel get virtual pixel at any PXM or PXB image location (float) PXM_PXB_copy copy PXM pixmap to PXB pixmap PXM_PXB_update copy/convert PXM pixmap area to PXB pixmap area PXB_PXB_update copy/rescale input PXB pixmap area to output PXB area PXB_load load an image file into a PXB pixmap (8-bit RGB) PXM_load load an image file into a PXM pixmap (float RGB) PXB_save save a PXB pixmap to a file with (8 bit RGB) PXM_save save a PXM pixmap to a file with (8/16 bit RGB) JPG_PXB_load load a .jpg file into a PXB pixmap (8-bit RGB) JPG_PXM_load load a .jpg file into a PXM pixmap (float RGB) PXB_JPG_save save a PXB pixmap to a .jpg file (8-bit RGB) PXM_JPG_save save a PXM pixmap to a .jpg file (8-bit RGB) TIFF_PXB_load load a .tif file into a PXB pixmap (8-bit RGB) TIFF_PXM_load load a .tif file into a PXM pixmap (float RGB) PXB_TIFF_save save a PXB pixmap to a .tif file (8/16-bit RGB) PXM_TIFF_save save a PXM pixmap to a .tif file (8/16-bit RGB) PNG_PXB_load load a .png file into a PXB pixmap (8-bit RGB) PNG_PXM_load load a .png file into a PXM pixmap (float RGB) PXB_PNG_save save a PXB pixmap to a .png file (8/16-bit RGB) PXM_PNG_save save a PXM pixmap to a .png file (8/16-bit RGB) JXL_PXB_load load a .jxl file into a PXB pixmap (8-bit RGB) // jxl JXL_PXM_load load a .jxl file into a PXM pixmap (float RGB) PXB_JXL_save save a PXB pixmap to a .jxl file (8-bit RGB) PXM_JXL_save save a PXM pixmap to a .jxl file (16-bit RGB) HEIC_PXB_load load a .heic/.avif file into a PXB pixmap (8-bit RGB) HEIC_PXM_load load a .heic/.avif file into a PXM pixmap (float RGB) PXB_HEIC_save save a PXB pixmap to a .heic/.avif file (8-bit RGB) PXM_HEIC_save save a PXM pixmap to a .heic/.avif file (8/16-bit RGB) JP2_PXB_load load a .jp2 file into a PXB pixmap (8-bit RGB) JP2_PXM_load load a .jp2 file into a PXM pixmap (float RGB) PXB_JP2_save save a PXB pixmap to a .jp2 file (8/16-bit RGB) PXM_JP2_save save a PXM pixmap to a .jp2 file (8/16-bit RGB) WEBP_PXB_load load a .webp file into a PXB pixmap (8-bit RGB) WEBP_PXM_load load a .webp file into a PXM pixmap (float RGB) PXB_WEBP_save save a PXB pixmap to a .webp file (8/16-bit RGB) PXM_WEBP_save save a PXM pixmap to a .webp file (8/16-bit RGB) ANY_PXB_load load other image file into a PXB pixmap (8-bit RGB) ANY_PXM_load load other image file into a PXM pixmap (float RGB) RAW_PXB_load load a RAW file into a PXB pixmap (8-bit RGB) RAW_PXM_load load a RAW file into a PXM pixmap (float RGB) RAW_thumb_pxb get PXB for thumbnail file from RAW file embedded image raw_match_embed_color use RAW file embedded image for image color balance pixelvert convert pixel format and channel count libjxl interface to libjxl for JXL file load and save functions ***************************************************************************************/ #define EX extern // disable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) using namespace zfuncs; /************************************************************************************** PXM pixmap functions - RGB[A] float pixel map pixel RGB values may range from 0.0 to 255.99 ***************************************************************************************/ // calculate image size in memory and check < 4 GB // arguments are image width, height, no. colors, color size (char=1 or float=4) // returns uint size (< 4 GB) or 0 if calculation > 4 GB // pz is pixel RGB size (1/2/4 bytes for int8/int16/float) int64 imagesize(int ww, int hh, int nc, int pz) // >4 GB allowed { int64 z64 = 1, size = z64 * ww * hh; if (ww > wwhh_limit1 || hh > wwhh_limit1 || size > wwhh_limit2) { // 26.0 size = size / MEGA; zmessageACK(Mwin,TX("image is too large: %dx%d, %lld megapix"),ww,hh,size); return 0; // instead of quit() 26.3 } return z64 * ww * hh * nc * pz; // insure 64-bit arithmetic } // initialize PXM pixmap - allocate memory PXM * PXM_make(int ww, int hh, int nc) { int64 cc64; cc64 = imagesize(ww,hh,nc,sizeof(float)); if (! cc64 || nc < 3 || nc > 4) { zmessageACK(Mwin,"PXM_make(): pixbuf creation failure"); // 26.3 return 0; } PXM *pxm = (PXM *) zmalloc(sizeof(PXM),"PXM"); strcpy(pxm->wmi,"pxmpix"); pxm->ww = ww; pxm->hh = hh; pxm->nc = nc; // nc = 3/4 for no/alpha channel pxm->rs = ww * nc; // bytes = rs * sizeof(float) pxm->pixels = (float *) zmalloc(cc64,"PXM"); return pxm; } // free PXM pixmap void PXM_free(PXM *&pxm) { if (! pxm) return; if (! strmatch(pxm->wmi,"pxmpix")) zappcrash("PXM_free(), bad PXM %s",pxm->wmi); strcpy(pxm->wmi,"xxxxxx"); zfree(pxm->pixels); zfree(pxm); pxm = 0; return; } // audit the contents of a PXM pixmap // detect NAN and check RGB >= 0.0 and RGB <= 255.0 typedef struct { int ww, hh; int err1, err2, err3; PXM *pxm; } pxm_audit_data_t; void PXM_audit(PXM *pxmx) // multi-thread 25.1 { void * PXM_audit_thread(void *arg); pxm_audit_data_t P; P.pxm = pxmx; P.ww = pxmx->ww; P.hh = pxmx->hh; P.err1 = P.err2 = P.err3 = 0; void *args[NSMP][2]; pthread_t tid[NSMP]; for (int ii = 0; ii < NSMP; ii++) { args[ii][0] = &P; args[ii][1] = &Nval[ii]; tid[ii] = start_Jthread(PXM_audit_thread,args[ii]); } for (int ii = 0; ii < NSMP; ii++) wait_Jthread(tid[ii]); if (P.err3) printf("*** PXM_audit(): corrected %d RGB = NAN/INF \n",P.err3); if (P.err1) printf("*** PXM_audit(): corrected %d RGB < 0 \n",P.err1); if (P.err2) printf("*** PXM_audit(): corrected %d RGB > 255 \n",P.err2); return; } void * PXM_audit_thread(void *arg) { int px, py; float *pix; void ** args = (void **) arg; pxm_audit_data_t *P = (pxm_audit_data_t *) args[0]; int index = * ((int *) args[1]); for (py = index; py < P->hh; py += NSMP) for (px = 0; px < P->ww; px++) { pix = PXMpix(P->pxm,px,py); for (int ii = 0; ii < 3; ii++) { if (isnan(pix[ii])) { P->err3++; pix[ii] = 0; continue; } if (isinf(pix[ii])) { P->err3++; pix[ii] = 0; continue; } if (pix[ii] < 0) { P->err1++; pix[ii] = 0; continue; } if (pix[ii] > 255.4) { // must round to <= 255 // 26.0 P->err2++; pix[ii] = 255.0; continue; } } } return 0; } // clear a PXM pixmap to white/opaque or black/transparent void PXM_clear(PXM *pxm, int BW) { int px, py, ii; float *pix, rgba; if (BW) rgba = 255.0; else rgba = 0; for (py = 0; py < pxm->hh; py++) for (px = 0; px < pxm->ww; px++) { pix = PXMpix(pxm,px,py); for (ii = 0; ii < pxm->nc; ii++) pix[ii] = rgba; } return; } // add an alpha channel to a PXM pixmap (RGB >> RGBA) // does nothing if 4 channels already void PXM_addalpha(PXM *pxm) { int ww, hh, nc1, nc2, ii; float *pixels1, *pixels2, *pix1, *pix2; uint cc; int64 cc64; ww = pxm->ww; hh = pxm->hh; nc1 = pxm->nc; if (nc1 > 3) return; pixels1 = pxm->pixels; nc2 = nc1 + 1; cc64 = imagesize(ww,hh,nc2,sizeof(float)); if (! cc64) return; // 26.3 pixels2 = (float *) zmalloc(cc64,"PXM"); cc = nc1 * sizeof(float); pix1 = pixels1; pix2 = pixels2; for (ii = 0; ii < ww * hh; ii++) { memcpy(pix2,pix1,cc); pix2[nc1] = 255.0; // 100% opaque = 255 pix1 += nc1; pix2 += nc2; } zfree(pixels1); pxm->nc = nc2; pxm->rs = ww * nc2; // bytes = rs * sizeof(float) pxm->pixels = pixels2; return; } // remove alpha channel from a PXM pixmap (RGBA >> RGB) // does nothing if no alpha channel present void PXM_subalpha(PXM *pxm) { int ww, hh, nc1, nc2, ii; float *pixels1, *pixels2, *pix1, *pix2; uint cc; int64 cc64; ww = pxm->ww; hh = pxm->hh; nc1 = pxm->nc; if (nc1 < 4) return; pixels1 = pxm->pixels; nc2 = 3; cc64 = imagesize(ww,hh,nc2,sizeof(float)); if (! cc64) return; // 26.3 pixels2 = (float *) zmalloc(cc64,"PXM"); cc = nc2 * sizeof(float); pix1 = pixels1; pix2 = pixels2; for (ii = 0; ii < ww * hh; ii++) { memcpy(pix2,pix1,cc); pix1 += nc1; pix2 += nc2; } zfree(pixels1); pxm->nc = nc2; pxm->rs = ww * nc2; pxm->pixels = pixels2; return; } // apply alpha channel to RGB values and remove alpha channel // RGBout = RGBin * alpha/255 void PXM_applyalpha(PXM *pxm) { int ww, hh, nc1, nc2, ii; float *pixels1, *pixels2, *pix1, *pix2; float F; int64 cc64; ww = pxm->ww; hh = pxm->hh; nc1 = pxm->nc; if (nc1 < 4) return; pixels1 = pxm->pixels; nc2 = 3; cc64 = imagesize(ww,hh,nc2,sizeof(float)); if (! cc64) return; // 26.3 pixels2 = (float *) zmalloc(cc64,"PXM"); pix1 = pixels1; pix2 = pixels2; for (ii = 0; ii < ww * hh; ii++) { F = 0.0039 * pix1[3]; // alpha / 255 pix2[0] = F * pix1[0]; pix2[1] = F * pix1[1]; pix2[2] = F * pix1[2]; pix1 += nc1; pix2 += nc2; } zfree(pixels1); pxm->nc = nc2; pxm->rs = ww * nc2; pxm->pixels = pixels2; return; } // create a copy of a PXM pixmap namespace PXM_copy_names { int ww, hh, nc, cc; PXM *pxm1, *pxm2; } PXM * PXM_copy(PXM *pxm) { using namespace PXM_copy_names; void * PXM_copy_thread(void *arg); pxm1 = pxm; ww = pxm1->ww; hh = pxm1->hh; nc = pxm1->nc; cc = pxm1->ww * pxm1->nc * sizeof(float); pxm2 = PXM_make(ww,hh,nc); do_wthreads(PXM_copy_thread,NSMP); return pxm2; } void * PXM_copy_thread(void *arg) // 25.1 { using namespace PXM_copy_names; int index = *((int *) arg); float *pix1, *pix2; int py; for (py = index; py < pxm1->hh; py += NSMP) { pix1 = PXMpix(pxm1,0,py); pix2 = PXMpix(pxm2,0,py); memcpy(pix2,pix1,cc); } return 0; } // copy one PXM pixmap to another PXM of equal size // pxmA --> pxmB namespace PXM_copy2_names { int ww, hh, nc, cc; PXM *pxm1, *pxm2; } void PXM_copy(PXM *pxmA, PXM *pxmB) { using namespace PXM_copy2_names; void * PXM_copy2_thread(void *arg); pxm1 = pxmA; pxm2 = pxmB; ww = pxm1->ww; hh = pxm1->hh; nc = pxm1->nc; cc = pxm1->ww * pxm1->nc * sizeof(float); do_wthreads(PXM_copy2_thread,NSMP); return; } void * PXM_copy2_thread(void *arg) // 25.1 { using namespace PXM_copy2_names; int index = *((int *) arg); float *pix1, *pix2; int py; for (py = index; py < pxm1->hh; py += NSMP) { pix1 = PXMpix(pxm1,0,py); pix2 = PXMpix(pxm2,0,py); memcpy(pix2,pix1,cc); } return 0; } // create a copy of a PXM pixmap rectangular area PXM * PXM_copy_area(PXM *pxm1, int orgx, int orgy, int ww2, int hh2) { float *pix1, *pix2; PXM *pxm2 = 0; int py1, px2, py2; int nc, pcc; nc = pxm1->nc; pcc = nc * sizeof(float); pxm2 = PXM_make(ww2,hh2,nc); for (py1 = orgy, py2 = 0; py2 < hh2; py1++, py2++) { pix1 = PXMpix(pxm1,orgx,py1); pix2 = PXMpix(pxm2,0,py2); for (px2 = 0; px2 < ww2; px2++) { memcpy(pix2,pix1,pcc); pix1 += nc; pix2 += nc; } } return pxm2; } // copy a rectangular area from one PXM image into another - same origin void PXM_copy_area(PXM *pxm1, PXM *pxm2, int orgx, int orgy, int ww, int hh) { float *pix1, *pix2; int py, nc, cc; nc = pxm1->nc; cc = nc * ww * sizeof(float); for (py = orgy; py < orgy + hh; py++) { pix1 = PXMpix(pxm1,orgx,py); pix2 = PXMpix(pxm2,orgx,py); memcpy(pix2,pix1,cc); } return; } // copy a rectangular area from one PXM image into another - different origin void PXM_copy_area(PXM *pxm1, PXM *pxm2, int orgx1, int orgy1, int orgx2, int orgy2, int ww, int hh) { float *pix1, *pix2; int py, nc, cc; nc = pxm1->nc; cc = nc * ww * sizeof(float); for (py = 0; py < hh; py++) { pix1 = PXMpix(pxm1,orgx1,orgy1+py); pix2 = PXMpix(pxm2,orgx2,orgy2+py); memcpy(pix2,pix1,cc); } return; } /************************************************************************************** Rescale PXM pixmap to new width and height. The scale ratios may be different for width and height. Method is better than bilinear: For all input pixels [p] having some overlap area with an output pixel: output pixel = sum ( overlap[p] * input[p] ) / sum ( overlap[p] ) ***************************************************************************************/ typedef struct { float *pixels1; float *pixels2; int ww1, hh1, rs1; int ww2, hh2, rs2; int nc1, nc2; int *px1L, *py1L; float *pxmap, *pymap; int maxmapx, maxmapy; } pxm_rescale_data_t; PXM * PXM_rescale(PXM *pxm1, int ww, int hh) // made thread safe 25.1 { void * pxm_rescale_thread(void *arg); pxm_rescale_data_t P; PXM *pxm2; int px1, py1, px2, py2; int pxl, pyl, pxm, pym, ii; float scalex, scaley; float px1a, py1a, px1b, py1b; float fx, fy; P.ww1 = pxm1->ww; P.hh1 = pxm1->hh; P.nc1 = pxm1->nc; P.rs1 = pxm1->rs; P.pixels1 = pxm1->pixels; pxm2 = PXM_make(ww,hh,P.nc1); // output PXM if (! pxm2) return 0; // too big 26.3 P.ww2 = ww; // output image data P.hh2 = hh; P.rs2 = pxm2->rs; P.nc2 = P.nc1; P.pixels2 = pxm2->pixels; scalex = 1.0 * P.ww1 / P.ww2; // compute x and y scales scaley = 1.0 * P.hh1 / P.hh2; if (scalex <= 1) P.maxmapx = 2; // compute max input pixels else P.maxmapx = scalex + 2; // mapping into output pixels P.maxmapx += 1; // for both dimensions if (scaley <= 1) P.maxmapy = 2; // (pixels may not be square) else P.maxmapy = scaley + 2; P.maxmapy += 1; // (extra entry for -1 flag) P.pymap = (float *) zmalloc(P.hh2 * P.maxmapy * sizeof(float),"PXM"); // maps overlap of < maxmap input P.pxmap = (float *) zmalloc(P.ww2 * P.maxmapx * sizeof(float),"PXM"); // pixels per output pixel P.py1L = (int *) zmalloc(P.hh2 * sizeof(int),"PXM"); // maps first (lowest) input pixel P.px1L = (int *) zmalloc(P.ww2 * sizeof(int),"PXM"); // per output pixel for (py2 = 0; py2 < P.hh2; py2++) // loop output y-pixels { py1a = py2 * scaley; // corresponding input y-pixels py1b = py1a + scaley; if (py1b >= P.hh1) py1b = P.hh1 - 0.001; // fix precision limitation pyl = py1a; P.py1L[py2] = pyl; // 1st overlapping input pixel for (py1 = pyl, pym = 0; py1 < py1b; py1++, pym++) // loop overlapping input pixels { if (py1 < py1a) { // compute amount of overlap if (py1+1 < py1b) fy = py1+1 - py1a; // 0.0 to 1.0 else fy = scaley; } else if (py1+1 > py1b) fy = py1b - py1; else fy = 1; ii = py2 * P.maxmapy + pym; // save it P.pymap[ii] = 0.9999 * fy / scaley; } ii = py2 * P.maxmapy + pym; // set an end marker after P.pymap[ii] = -1; // last overlapping pixel } for (px2 = 0; px2 < P.ww2; px2++) // do same for x-pixels { px1a = px2 * scalex; px1b = px1a + scalex; if (px1b >= P.ww1) px1b = P.ww1 - 0.001; pxl = px1a; P.px1L[px2] = pxl; for (px1 = pxl, pxm = 0; px1 < px1b; px1++, pxm++) { if (px1 < px1a) { if (px1+1 < px1b) fx = px1+1 - px1a; else fx = scalex; } else if (px1+1 > px1b) fx = px1b - px1; else fx = 1; ii = px2 * P.maxmapx + pxm; P.pxmap[ii] = 0.9999 * fx / scalex; } ii = px2 * P.maxmapx + pxm; P.pxmap[ii] = -1; } void *args[NSMP][2]; pthread_t tid[NSMP]; for (ii = 0; ii < NSMP; ii++) { args[ii][0] = &P; args[ii][1] = &Nval[ii]; tid[ii] = start_Jthread(pxm_rescale_thread,args[ii]); } for (ii = 0; ii < NSMP; ii++) wait_Jthread(tid[ii]); zfree(P.px1L); zfree(P.py1L); zfree(P.pxmap); zfree(P.pymap); return pxm2; } void * pxm_rescale_thread(void *arg) // worker thread function { int px1, py1, px2, py2; int pxl, pyl, pxm, pym, ii; float *pix1, *pix2; float fx, fy, ftot; float red, green, blue, alpha; int64 z64 = 1; void ** args = (void **) arg; pxm_rescale_data_t *P = (pxm_rescale_data_t *) args[0]; int index = * ((int *) args[1]); for (py2 = index; py2 < P->hh2; py2 += NSMP) // loop output y-pixels { pyl = P->py1L[py2]; // corresp. 1st input y-pixel for (px2 = 0; px2 < P->ww2; px2++) // loop output x-pixels { pxl = P->px1L[px2]; // corresp. 1st input x-pixel red = green = blue = alpha = 0; // initz. output pixel for (py1 = pyl, pym = 0; ; py1++, pym++) // loop overlapping input y-pixels { ii = py2 * P->maxmapy + pym; // get y-overlap fy = P->pymap[ii]; if (fy < 0) break; // no more pixels for (px1 = pxl, pxm = 0; ; px1++, pxm++) // loop overlapping input x-pixels { ii = px2 * P->maxmapx + pxm; // get x-overlap fx = P->pxmap[ii]; if (fx < 0) break; // no more pixels ftot = fx * fy; // area overlap = x * y overlap pix1 = P->pixels1 + z64 * py1 * P->rs1 + px1 * P->nc1; red += pix1[0] * ftot; // add input pixel * overlap green += pix1[1] * ftot; blue += pix1[2] * ftot; if (P->nc1 == 4) alpha += pix1[3] * ftot; } pix2 = P->pixels2 + z64 * py2 * P->rs2 + px2 * P->nc2; // save output pixel pix2[0] = red; pix2[1] = green; pix2[2] = blue; if (P->nc2 == 4) pix2[3] = alpha; } } } return 0; } /************************************************************************************** PXM *pxm2 = PXM_rotate(PXM *pxm1, float angle) Rotate PXM pixmap through an arbitrary angle (degrees). The returned image has the same size as the original, but the pixmap size is increased to accommodate the rotated image. (e.g. a 100x100 image rotated 45 deg. needs a 142x142 pixmap). The space added around the rotated image is black (RGB 0,0,0). Angle is in degrees. Positive direction is clockwise. Speed is about 28 million pixels/sec/thread for a 3.3 GHz CPU. Loss of resolution is less than 1 pixel. NOT THREAD SAFE ***************************************************************************************/ namespace pxmrotate { float *ppix1, *ppix2; int ww1, hh1, ww2, hh2, nc; float angle; } PXM * PXM_rotate(PXM *pxm1, float anglex, int fast) // fast option { using namespace pxmrotate; PXM *PXM_rotate90(PXM *pxm, int angle); void *PXM_rotate_thread(void *); void *PXM_rotate_thread_fast(void *); PXM *pxm2; ww1 = pxm1->ww; // input PXM hh1 = pxm1->hh; nc = pxm1->nc; ppix1 = pxm1->pixels; angle = anglex; while (angle < -180) angle += 360; // normalize, -180 to +180 while (angle > 180) angle -= 360; if (angle >= -180.0 && angle < -179.99) // use lossless version for angles return PXM_rotate90(pxm1,180); // of -180, -90, 0, 90, 180 if (angle > -90.01 && angle < -89.99) return PXM_rotate90(pxm1,-90); if (angle > -0.01 && angle < 0.01) return PXM_copy(pxm1); if (angle > 89.99 && angle < 90.01) return PXM_rotate90(pxm1,90); if (angle > 179.99 && angle <= 180.0) return PXM_rotate90(pxm1,180); angle = angle * PI / 180; // radians, -PI to +PI ww2 = ww1*fabsf(cosf(angle)) + hh1*fabsf(sinf(angle)); // rectangle containing rotated image hh2 = ww1*fabsf(sinf(angle)) + hh1*fabsf(cosf(angle)); pxm2 = PXM_make(ww2,hh2,nc); // output PXM if (! pxm2) return 0; // 26.3 ppix2 = pxm2->pixels; if (fast) do_wthreads(PXM_rotate_thread_fast,NSMP); else do_wthreads(PXM_rotate_thread,NSMP); return pxm2; } void * PXM_rotate_thread(void *arg) { using namespace pxmrotate; int index = *((int *) (arg)); int px2, py2, px0, py0; float *pix0, *pix1, *pix2, *pix3; float px1, py1; float f0, f1, f2, f3, pixN[6]; float a, b, ww15, hh15, ww25, hh25; int pcc = nc * sizeof(float); int64 z64 = 1; ww15 = 0.5 * ww1; hh15 = 0.5 * hh1; ww25 = 0.5 * ww2; hh25 = 0.5 * hh2; a = cosf(angle); b = sinf(angle); for (py2 = index; py2 < hh2; py2 += NSMP) // loop through output pixels for (px2 = 0; px2 < ww2; px2++) { px1 = a * (px2 - ww25) + b * (py2 - hh25) + ww15; // (px1,py1) = corresponding py1 = -b * (px2 - ww25) + a * (py2 - hh25) + hh15; // point within input pixels px0 = px1; // pixel containing (px1,py1) py0 = py1; if (px0 < 0 || px0 > ww1-2 || py0 < 0 || py0 > hh1-2) { // if outside input pixel array pix2 = ppix2 + (z64 * py2 * ww2 + px2) * nc; // output is black memset(pix2,0,pcc); continue; } pix0 = ppix1 + (z64 * py0 * ww1 + px0) * nc; // 4 input pixels based at (px0,py0) pix1 = pix0 + ww1 * nc; pix2 = pix0 + nc; pix3 = pix1 + nc; f0 = (px0+1 - px1) * (py0+1 - py1); // overlap of (px1,py1) f1 = (px0+1 - px1) * (py1 - py0); // in each of the 4 pixels f2 = (px1 - px0) * (py0+1 - py1); f3 = (px1 - px0) * (py1 - py0); for (int ii = 0; ii < nc; ii++) // sum the weighted inputs pixN[ii] = f0 * pix0[ii] + f1 * pix1[ii] + f2 * pix2[ii] + f3 * pix3[ii]; pix2 = ppix2 + (z64 * py2 * ww2 + px2) * nc; // output pixel memcpy(pix2,pixN,pcc); } return 0; } void * PXM_rotate_thread_fast(void *arg) { using namespace pxmrotate; int index = *((int *) (arg)); int px2, py2, px0, py0; float *pix0, *pix2; float px1, py1; float a, b, ww15, hh15, ww25, hh25; int pcc = nc * sizeof(float); int z64 = 1; ww15 = 0.5 * ww1; hh15 = 0.5 * hh1; ww25 = 0.5 * ww2; hh25 = 0.5 * hh2; a = cosf(angle); b = sinf(angle); for (py2 = index; py2 < hh2; py2 += NSMP) // loop through output pixels for (px2 = 0; px2 < ww2; px2++) { px1 = a * (px2 - ww25) + b * (py2 - hh25) + ww15; // (px1,py1) = corresponding py1 = -b * (px2 - ww25) + a * (py2 - hh25) + hh15; // point within input pixels px0 = px1; // pixel containing (px1,py1) py0 = py1; if (px0 < 0 || px0 > ww1-2 || py0 < 0 || py0 > hh1-2) { // if outside input pixel array pix2 = ppix2 + (z64 * py2 * ww2 + px2) * nc; // output is black memset(pix2,0,pcc); continue; } pix0 = ppix1 + (z64 * py0 * ww1 + px0) * nc; // input pixel pix2 = ppix2 + (z64 * py2 * ww2 + px2) * nc; // output pixel memcpy(pix2,pix0,pcc); } return 0; } PXM * PXM_rotate90(PXM *pxm1, int angle) // angle = -90, 90, 180 { using namespace pxmrotate; int px1, py1, px2, py2, nc, pcc; float *pix1, *pix2; PXM *pxm2; int z64 = 1; if (angle == 0) return PXM_copy(pxm1); ww1 = pxm1->ww; // input PXM hh1 = pxm1->hh; nc = pxm1->nc; pcc = nc * sizeof(float); if (angle == -90) { ww2 = hh1; hh2 = ww1; } else if (angle == 90) { ww2 = hh1; hh2 = ww1; } else if (angle == 180) { ww2 = ww1; hh2 = hh1; } else zappcrash("PXM_rotate2() bad angle %d",angle); pxm2 = PXM_make(ww2,hh2,nc); // output PXM ppix2 = pxm2->pixels; for (py1 = 0; py1 < hh1; py1++) // loop all input pixels for (px1 = 0; px1 < ww1; px1++) { if (angle == -90) { px2 = py1; py2 = hh2 - px1 - 1; } else if (angle == 90) { px2 = ww2 - py1 - 1; py2 = px1; } else /* angle = 180 */ { px2 = ww2 - px1 - 1; py2 = hh2 - py1 - 1; } pix1 = ppix1 + (z64 * py1 * ww1 + px1) * nc; pix2 = ppix2 + (z64 * py2 * ww2 + px2) * nc; memcpy(pix2,pix1,pcc); } return pxm2; } /************************************************************************************** PXM *pxm2 = PXM_upright(PXM *pxm1, int angle, int mirror) Rotate a PXM pixmap 0 or 90 or 180 or 270 degrees, and mirror the image horizontally or vertically. angle angle of clockwise rotation: 0/90/180/270. mirror 0/1/2 = no/horizontal/vertical mirror. (mirror is done after rotation) The returned image has the same size as the original, but length and width are reversed if rotation = 90 or 270. If angle = 0 and mirror = 0, a copy of the input image is returned. There is no loss of resolution. NOT THREAD SAFE ***************************************************************************************/ PXM * PXM_upright(PXM *pxm1, int angle, int mirror) { PXM *pxm2, *pxm3; float *pix2, *pix3; int px, py; int pcc = pxm1->nc * sizeof(float); // pixel cc if (angle != 0 && angle != 90 && angle != 180 && angle != 270) zappcrash("PXM_upright() angle: %d",angle); if (mirror != 0 && mirror != 1 && mirror != 2) zappcrash("PXM_upright() mirror: %d",mirror); pxm2 = PXM_rotate(pxm1,angle); if (! pxm2) return 0; // 26.3 if (! mirror) return pxm2; if (mirror == 1) // horizontal mirror { pxm3 = PXM_copy(pxm2); for (py = 0; py < pxm2->hh; py++) for (px = 0; px < pxm2->ww; px++) { pix2 = PXMpix(pxm2,px,py); pix3 = PXMpix(pxm3,pxm2->ww-1-px,py); memcpy(pix3,pix2,pcc); } PXM_free(pxm2); return pxm3; } if (mirror == 2) // vertical mirror { pxm3 = PXM_copy(pxm2); for (py = 0; py < pxm2->hh; py++) for (px = 0; px < pxm2->ww; px++) { pix2 = PXMpix(pxm2,px,py); pix3 = PXMpix(pxm3,px,pxm2->hh-1-py); memcpy(pix3,pix2,pcc); } PXM_free(pxm2); return pxm3; } return 0; // should not happen } /**************************************************************************************/ // blur a PXM pixmap image using specified blur radius // NOT THREAD SAFE namespace PXM_blur_names { int rad; PXM *pxm_input; PXM *pxm_temp; int Pww, Phh; float blur_weight[1000]; // blur radius limit 999 } // callable function void PXM_blur(PXM *pxm, int radius) { using namespace PXM_blur_names; void * PXM_blur_wthread1(void *); void * PXM_blur_wthread2(void *); int ii; float w, wsum; if (radius < 1) return; if (radius > 999) zappcrash("PXM_blur() radius: %d",radius); rad = radius; Pww = pxm->ww; // image dimensions Phh = pxm->hh; pxm_input = pxm; // input image pxm_temp = PXM_copy(pxm_input); // intermediate image wsum = 0; for (ii = 0; ii <= rad; ii++) // set pixel weight per distance { // example, rad = 10 w = 1.0 - (ii + 0.25) / rad; // dist: 0 1 2 3 5 7 9 w = w * w; // weight: .95 .77 .60 .46 .23 .08 .01 blur_weight[ii] = w; wsum += w; } for (ii = 0; ii <= rad; ii++) // make weights sum to 1.0 blur_weight[ii] = blur_weight[ii] / wsum; do_wthreads(PXM_blur_wthread1,NSMP); // worker threads 1 do_wthreads(PXM_blur_wthread2,NSMP); // worker threads 2 PXM_free(pxm_temp); return; } // worker thread 1 void * PXM_blur_wthread1(void *arg) { using namespace PXM_blur_names; int index = *((int *) arg); int ii, dist = 0; int px, py, qy; int ylo, yhi; float R9, G9, B9, w1, w2; float *pix1, *pix2; for (py = index; py < Phh; py += NSMP) // loop all pixels for (px = 0; px < Pww; px++) { if (Fescape) return 0; if (sa_stat == sa_stat_fini) { // select area active ii = py * Pww + px; if (! sa_pixmap[ii]) continue; // outside pixel } pix1 = PXMpix(pxm_input,px,py); // input pixel pix2 = PXMpix(pxm_temp,px,py); // output pixel - intermediate image ylo = py - rad; // get column of input pixel if (ylo < 0) ylo = 0; yhi = py + rad; if (yhi > Phh-1) yhi = Phh - 1; R9 = G9 = B9 = 0; w2 = 0; for (qy = ylo; qy <= yhi; qy++) // loop pixels in same column { if (sa_stat == sa_stat_fini) { ii = qy * Pww + px; // don't use pixels outside area dist = sa_pixmap[ii]; if (! dist) continue; } w1 = blur_weight[abs(qy-py)]; // weight based on radius pix1 = PXMpix(E3pxm,px,qy); R9 += w1 * pix1[0]; // accumulate RGB * weight G9 += w1 * pix1[1]; B9 += w1 * pix1[2]; w2 += w1; // accumulate weights } R9 = R9 / w2; // normalize G9 = G9 / w2; B9 = B9 / w2; pix2[0] = R9; // weighted average pix2[1] = G9; pix2[2] = B9; } return 0; } // worker thread 2 void * PXM_blur_wthread2(void *arg) { using namespace PXM_blur_names; int index = *((int *) arg); int ii, dist = 0; int px, py, qx; int xlo, xhi; float R9, G9, B9; float w1, w2; float *pix2, *pix3; for (py = index; py < Phh; py += NSMP) // loop all pixels for (px = 0; px < Pww; px++) { if (Fescape) return 0; if (sa_stat == sa_stat_fini) { // select area active ii = py * Pww + px; if (! sa_pixmap[ii]) continue; // outside pixel } pix3 = PXMpix(pxm_input,px,py); // output pixel xlo = px - rad; // get row of input pixel if (xlo < 0) xlo = 0; xhi = px + rad; if (xhi > Pww-1) xhi = Pww - 1; R9 = G9 = B9 = 0; w2 = 0; for (qx = xlo; qx <= xhi; qx++) // loop pixels in same row { if (sa_stat == sa_stat_fini) { ii = py * Pww + qx; // don't use pixels outside area dist = sa_pixmap[ii]; if (! dist) continue; } pix2 = PXMpix(pxm_temp,qx,py); // intermediate image, input pixel w1 = blur_weight[abs(qx-px)]; // weight based on radius R9 += w1 * pix2[0]; // accumulate RGB * weight G9 += w1 * pix2[1]; B9 += w1 * pix2[2]; w2 += w1; // accumulate weights } R9 = R9 / w2; // normalize G9 = G9 / w2; B9 = B9 / w2; RGBfix(R9,G9,B9); pix3[0] = R9; // set output pixel pix3[1] = G9; pix3[2] = B9; } return 0; } /**************************************************************************************/ // set PXM pixmap image color depth to 1-16 bits per RGB color // alpha channel is not affected void PXM_rgbdepth(PXM *pxm, int color_depth) { int ii, px, py, rgb; uint16 m1, m2, val1, val3; float fmag, *pix1, *pix3; int Pww, Phh; Pww = pxm->ww; Phh = pxm->hh; m1 = 0xFFFF << (16 - color_depth); // 5 > 1111100000000000 m2 = 0x8000 >> color_depth; // 5 > 0000010000000000 fmag = 65535.0 / m1; // full brightness range for (py = 0; py < Phh; py++) // loop all pixels for (px = 0; px < Pww; px++) { if (Fescape) break; if (sa_stat == sa_stat_fini) { // select area active ii = py * Pww + px; if (! sa_pixmap[ii]) continue; // outside pixel } pix1 = PXMpix(E3pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel for (rgb = 0; rgb < 3; rgb++) { val1 = 256 * pix1[rgb]; if (val1 < m1) val3 = (val1 + m2) & m1; else val3 = m1; val3 = val3 * fmag; pix3[rgb] = val3 / 256; } } return; } /************************************************************************************** PXB pixmap functions - RGB[A] uint8 pixel map and PIXBUF wrapper ***************************************************************************************/ // Create PXB pixmap with pixels cleared to zero // nc = 3/4 for RGB/RGBA image PXB * PXB_make(int ww, int hh, int nc) { int rs, ac; int64 cc64; uint8 *pixels; cc64 = imagesize(ww,hh,nc,1); if (! cc64 || nc < 3 || nc > 4) { zmessageACK(Mwin,"PXB_make(): pixbuf creation failure"); // 26.3 return 0; } PXB *pxb = (PXB *) zmalloc(sizeof(PXB),"PXB"); strcpy(pxb->wmi,"pxbpix"); pxb->ww = ww; pxb->hh = hh; pxb->nc = nc; rs = ww * nc; pxb->rs = rs; pixels = (uint8 *) zmalloc(cc64,"PXB"); pxb->pixels = pixels; ac = nc - 3; // alpha channel 0/1 pxb->pixbuf = gdk_pixbuf_new_from_data(pixels,GDKRGB,ac,8,ww,hh,rs,0,0); // make congruent pixbuf if (! pxb->pixbuf) { zmessageACK(Mwin,"PXB_make(): pixbuf creation failure"); return 0; // 26.3 } return pxb; } // Free PXB pixmap - release memory void PXB_free(PXB *&pxb) { if (! pxb) return; if (! strmatch(pxb->wmi,"pxbpix")) zappcrash("PXB_free(), bad PXB"); strcpy(pxb->wmi,"xxxxxx"); g_object_unref(pxb->pixbuf); zfree(pxb->pixels); zfree(pxb); pxb = 0; return; } // clear PXB pixmap to zeros (black) void PXB_clear(PXB * pxb) { int64 cc64 = imagesize(pxb->ww,pxb->hh,pxb->nc,1); if (! cc64) return; // 26.3 memset(pxb->pixels,0,cc64); return; } // add an alpha channel to a PXB pixmap int PXB_addalpha(PXB *pxb) { uint8 *pixels1, *pixels2, *pix1, *pix2; int ww, hh, nc, rs; int64 cc64; nc = pxb->nc; if (nc == 4) return 0; if (nc != 3) zappcrash("PXB_addalpha() nc: %d",nc); ww = pxb->ww; hh = pxb->hh; pixels1 = pxb->pixels; cc64 = imagesize(ww,hh,4,1); if (! cc64) return 0; // 26.3 pixels2 = (uint8 *) zmalloc(cc64,"PXB"); pix1 = pixels1; pix2 = pixels2; for (int ii = 0; ii < ww * hh; ii++) { memcpy(pix2,pix1,3); pix2[3] = 255; // opacity = max. pix1 += 3; pix2 += 4; } zfree(pixels1); pxb->pixels = pixels2; pxb->nc = 4; rs = ww * 4; pxb->rs = rs; g_object_unref(pxb->pixbuf); pxb->pixbuf = gdk_pixbuf_new_from_data(pixels2,GDKRGB,1,8,ww,hh,rs,0,0); if (! pxb->pixbuf) { zmessageACK(Mwin,"PXB_addalpha(): pixbuf creation failure"); quitxx(); } return 0; } // remove an alpha channel from a PXB pixmap // return: 0 = OK, +N = error int PXB_subalpha(PXB *pxb) { uint8 *pixels1, *pixels2, *pix1, *pix2; int ww, hh, nc, rs; int64 cc64; nc = pxb->nc; if (nc == 3) return 0; if (nc != 4) zappcrash("PXB_subalpha() nc: %d",nc); ww = pxb->ww; hh = pxb->hh; pixels1 = pxb->pixels; cc64 = imagesize(ww,hh,3,1); if (! cc64) return 1; // 26.3 pixels2 = (uint8 *) zmalloc(cc64,"PXB"); pix1 = pixels1; pix2 = pixels2; for (int ii = 0; ii < ww * hh; ii++) { memcpy(pix2,pix1,3); pix1 += 4; pix2 += 3; } zfree(pixels1); pxb->pixels = pixels2; pxb->nc = 3; rs = ww * 3; pxb->rs = rs; g_object_unref(pxb->pixbuf); pxb->pixbuf = gdk_pixbuf_new_from_data(pixels2,GDKRGB,0,8,ww,hh,rs,0,0); if (! pxb->pixbuf) { zmessageACK(Mwin,"PXB_subalpha(): pixbuf creation failure"); quitxx(); } return 0; } // Copy a PXB pixmap to a new PXB pixmap PXB * PXB_copy(PXB *pxb1) { int ww, hh, nc; int64 cc64; ww = pxb1->ww; hh = pxb1->hh; nc = pxb1->nc; cc64 = imagesize(ww,hh,nc,1); if (! cc64) return 0; // 26.3 PXB *pxb2 = PXB_make(ww,hh,nc); if (! pxb2) return 0; // 26.3 memcpy(pxb2->pixels,pxb1->pixels,cc64); return pxb2; } // copy an area from an input PXB to an output PXB // input area (px1, py1, ww, hh) copied to output area at (px2, py2) void PXB_copy_area(PXB *pxb1, int px1, int py1, int ww, int hh, PXB *pxb2, int px2, int py2) { int row1, row2; int64 z64 = 1; if (px1 < 0) goto overflow; if (px1 + ww > pxb1->ww) goto overflow; if (py1 < 0) goto overflow; if (py1 + hh > pxb1->hh) goto overflow; if (px2 < 0) goto overflow; if (px2 + ww > pxb2->ww) goto overflow; if (py2 < 0) goto overflow; if (py2 + hh > pxb2->hh) goto overflow; if (pxb1->nc != pxb2->nc) zappcrash("PXB_copy_area(): NC unequal"); for (row1 = py1, row2 = py2; row1 < py1 + hh; row1++, row2++) memcpy(pxb2->pixels + z64 * row2 * pxb2->rs + px2 * pxb2->nc, pxb1->pixels + z64 * row1 * pxb1->rs + px1 * pxb1->nc, ww * pxb1->nc); return; overflow: zappcrash("PXB_copy_area() overflow: input: %d %d %d %d " "output: %d %d",px1,py1,ww,hh,px2,py2); } // create a new PXB pixmap from a subsection of an existing PXB PXB * PXB_subpxb(PXB *pxb1, int px1, int py1, int ww, int hh) { PXB *pxb2 = PXB_make(ww,hh,pxb1->nc); if (! pxb2) return 0; // 26.3 PXB_copy_area(pxb1,px1,py1,ww,hh,pxb2,0,0); return pxb2; } /**************************************************************************************/ // rescale a PXB pixmap image to 1/2 size using NSMP threads // if rows or columns are odd, the last one is omitted typedef struct { uint8 *pixels1, *pixels2; int ww1, hh1, rs1, nc1; int ww2, hh2, rs2, nc2; } pxb_half_data_t; PXB * PXB_half(PXB *pxb1) { void * pxb_half_thread(void *arg); pxb_half_data_t P; PXB *pxb2; P.ww1 = pxb1->ww; // input image data P.hh1 = pxb1->hh; P.rs1 = pxb1->rs; P.nc1 = pxb1->nc; P.pixels1 = pxb1->pixels; P.ww2 = P.ww1 / 2; // output image data P.hh2 = P.hh1 / 2; P.nc2 = P.nc1; pxb2 = PXB_make(P.ww2,P.hh2,P.nc2); // output PXB if (! pxb2) return 0; // 26.3 P.pixels2 = pxb2->pixels; P.rs2 = pxb2->rs; void *args[NSMP][2]; pthread_t tid[NSMP]; for (int ii = 0; ii < NSMP; ii++) { args[ii][0] = &P; args[ii][1] = &Nval[ii]; tid[ii] = start_Jthread(pxb_half_thread,args[ii]); } for (int ii = 0; ii < NSMP; ii++) wait_Jthread(tid[ii]); return pxb2; } void * pxb_half_thread(void *arg) { int row, col, ch1, nc, rgb; uint8 *pix1a, *pix1b, *pix2; int64 z64 = 1; void ** args = (void **) arg; pxb_half_data_t *P = (pxb_half_data_t *) args[0]; int index = * ((int *) args[1]); nc = P->nc1; for (row = index; row < P->hh2; row += NSMP) // loop output rows { pix1a = P->pixels1 + z64 * P->rs1 * row * 2; // 2 input rows pix1b = pix1a + P->rs1; pix2 = P->pixels2 + z64 * P->rs2 * row; // output row for (col = 0; col < P->ww2 * nc; col += nc) // output col { for (ch1 = 0; ch1 < nc; ch1++) // loop channels { rgb = pix1a[ch1] + pix1a[ch1+nc] + pix1b[ch1] + pix1b[ch1+nc]; // 4 input RGB[A] values pix2[ch1] = rgb / 4; // --> 1 output RGB[A] } pix1a += 2 * nc; pix1b += 2 * nc; pix2 += nc; } } return 0; } /************************************************************************************** Rescale PXB pixmap image to new width and height. The scale ratios may be different for width and height. Method is better than bilinear: For all input pixels [p] having some overlap area (0-1) with an output pixel: output pixel = sum over p ( overlap(p) * value(p) ) ***************************************************************************************/ typedef struct { uint8 *pixels1; uint8 *pixels2; int ww1, hh1, rs1; int ww2, hh2, rs2; int nc1, nc2; int *px1L, *py1L; float *pxmap, *pymap; int maxmapx, maxmapy; } pxb_rescale_data_t; PXB * PXB_rescale(PXB *pxb1, int ww, int hh) { void * pxb_rescale_thread(void *arg); pxb_rescale_data_t P; PXB *pxb2; int px1, py1, px2, py2; int pxl, pyl, pxm, pym, ii; float scalex, scaley; float px1a, py1a, px1b, py1b; float fx, fy; int Fhalf = 0; if (ww <= pxb1->ww/2 && hh <= pxb1->hh/2) { // if scaling down to < 1/2 size, pxb1 = PXB_half(pxb1); // use fast 1/2 scale down first Fhalf = 1; } P.ww1 = pxb1->ww; P.hh1 = pxb1->hh; P.nc1 = pxb1->nc; P.rs1 = pxb1->rs; P.pixels1 = pxb1->pixels; pxb2 = PXB_make(ww,hh,P.nc1); // output PXB if (! pxb2) return 0; // 26.3 P.ww2 = ww; // output image data P.hh2 = hh; P.rs2 = pxb2->rs; P.nc2 = P.nc1; P.pixels2 = pxb2->pixels; scalex = 1.0 * P.ww1 / P.ww2; // compute x and y scales scaley = 1.0 * P.hh1 / P.hh2; if (scalex <= 1) P.maxmapx = 2; // compute max input pixels else P.maxmapx = scalex + 2; // mapping into output pixels P.maxmapx += 1; // for both dimensions if (scaley <= 1) P.maxmapy = 2; // (pixels may not be square) else P.maxmapy = scaley + 2; P.maxmapy += 1; // (extra entry for -1 flag) P.pymap = (float *) zmalloc(P.hh2 * P.maxmapy * sizeof(float),"PXB"); // maps overlap of < maxmap input P.pxmap = (float *) zmalloc(P.ww2 * P.maxmapx * sizeof(float),"PXB"); // pixels per output pixel P.py1L = (int *) zmalloc(P.hh2 * sizeof(int),"PXB"); // maps first (lowest) input pixel P.px1L = (int *) zmalloc(P.ww2 * sizeof(int),"PXB"); // per output pixel for (py2 = 0; py2 < P.hh2; py2++) // loop output y-pixels { py1a = py2 * scaley; // corresponding input y-pixels py1b = py1a + scaley; if (py1b >= P.hh1) py1b = P.hh1 - 0.001; // fix precision limitation pyl = py1a; P.py1L[py2] = pyl; // 1st overlapping input pixel for (py1 = pyl, pym = 0; py1 < py1b; py1++, pym++) // loop overlapping input pixels { if (py1 < py1a) { // compute amount of overlap if (py1+1 < py1b) fy = py1+1 - py1a; // 0.0 to 1.0 else fy = scaley; } else if (py1+1 > py1b) fy = py1b - py1; else fy = 1; ii = py2 * P.maxmapy + pym; // save it P.pymap[ii] = 0.9999 * fy / scaley; } ii = py2 * P.maxmapy + pym; // set an end marker after P.pymap[ii] = -1; // last overlapping pixel } for (px2 = 0; px2 < P.ww2; px2++) // do same for x-pixels { px1a = px2 * scalex; px1b = px1a + scalex; if (px1b >= P.ww1) px1b = P.ww1 - 0.001; pxl = px1a; P.px1L[px2] = pxl; for (px1 = pxl, pxm = 0; px1 < px1b; px1++, pxm++) { if (px1 < px1a) { if (px1+1 < px1b) fx = px1+1 - px1a; else fx = scalex; } else if (px1+1 > px1b) fx = px1b - px1; else fx = 1; ii = px2 * P.maxmapx + pxm; P.pxmap[ii] = 0.9999 * fx / scalex; } ii = px2 * P.maxmapx + pxm; P.pxmap[ii] = -1; } void *args[NSMP][2]; pthread_t tid[NSMP]; for (ii = 0; ii < NSMP; ii++) { args[ii][0] = &P; args[ii][1] = &Nval[ii]; tid[ii] = start_Jthread(pxb_rescale_thread,args[ii]); } for (ii = 0; ii < NSMP; ii++) wait_Jthread(tid[ii]); zfree(P.px1L); zfree(P.py1L); zfree(P.pxmap); zfree(P.pymap); if (Fhalf) PXB_free(pxb1); return pxb2; } void * pxb_rescale_thread(void *arg) // worker thread function { int px1, py1, px2, py2; int pxl, pyl, pxm, pym, ii; uint8 *pix1, *pix2; float fx, fy, ftot; float red, green, blue, alpha; int64 z64 = 1; void ** args = (void **) arg; pxb_rescale_data_t *P = (pxb_rescale_data_t *) args[0]; int index = * ((int *) args[1]); for (py2 = index; py2 < P->hh2; py2 += NSMP) // loop output y-pixels { pyl = P->py1L[py2]; // corresp. 1st input y-pixel for (px2 = 0; px2 < P->ww2; px2++) // loop output x-pixels { pxl = P->px1L[px2]; // corresp. 1st input x-pixel red = green = blue = alpha = 0; // initz. output pixel for (py1 = pyl, pym = 0; ; py1++, pym++) // loop overlapping input y-pixels { ii = py2 * P->maxmapy + pym; // get y-overlap fy = P->pymap[ii]; if (fy < 0) break; // no more pixels for (px1 = pxl, pxm = 0; ; px1++, pxm++) // loop overlapping input x-pixels { ii = px2 * P->maxmapx + pxm; // get x-overlap fx = P->pxmap[ii]; if (fx < 0) break; // no more pixels ftot = fx * fy; // area overlap = x * y overlap pix1 = P->pixels1 + z64 * py1 * P->rs1 + px1 * P->nc1; red += pix1[0] * ftot; // add input pixel * overlap green += pix1[1] * ftot; blue += pix1[2] * ftot; if (P->nc1 == 4) alpha += pix1[3] * ftot; } pix2 = P->pixels2 + z64 * py2 * P->rs2 + px2 * P->nc2; // save output pixel pix2[0] = red; pix2[1] = green; pix2[2] = blue; if (P->nc2 == 4) pix2[3] = alpha; } } } return 0; } /**************************************************************************************/ // fast PXB pixmap rescale using 'half binomial' interpolation // works best when the rescale ratio is between 0.5 and 2.0 typedef struct { int ww1, hh1, ww2, hh2, rs1, rs2, nc1, nc2; uint8 *pixels1, *pixels2; float xscale, yscale; } pxb_rescale_fast_data_t; PXB * PXB_rescale_fast(PXB *pxb1, int ww, int hh) { void * pxb_rescale_fast_thread(void *arg); pxb_rescale_fast_data_t P; PXB *pxb2; P.ww1 = pxb1->ww; // input image data P.hh1 = pxb1->hh; P.rs1 = pxb1->rs; P.nc1 = pxb1->nc; P.pixels1 = pxb1->pixels; P.ww2 = ww; // output image data P.hh2 = hh; P.nc2 = P.nc1; pxb2 = PXB_make(P.ww2,P.hh2,P.nc2); if (! pxb2) return 0; // 26.3 P.rs2 = pxb2->rs; P.pixels2 = pxb2->pixels; P.xscale = 1.0 * (P.ww1-1) / P.ww2; P.yscale = 1.0 * (P.hh1-1) / P.hh2; void *args[NSMP][2]; pthread_t tid[NSMP]; for (int ii = 0; ii < NSMP; ii++) { // start working threads args[ii][0] = &P; args[ii][1] = &Nval[ii]; tid[ii] = start_Jthread(pxb_rescale_fast_thread,args[ii]); } for (int ii = 0; ii < NSMP; ii++) // wait for all done wait_Jthread(tid[ii]); return pxb2; } void * pxb_rescale_fast_thread(void *arg) { int px1, py1, px2, py2; uint8 *pix10, *pix11, *pix2; int64 z64 = 1; void ** args = (void **) arg; int index = * ((int *) args[1]); pxb_rescale_fast_data_t *P = (pxb_rescale_fast_data_t *) args[0]; for (py2 = index; py2 < P->hh2; py2 += NSMP) // loop output pixels for (px2 = 0; px2 < P->ww2; px2++) { px1 = px2 * P->xscale; // input pixel corresponding py1 = py2 * P->yscale; // to output pixel pix10 = P->pixels1 + z64 * py1 * P->rs1 + px1 * P->nc1; // input pixel RGB data pix11 = pix10 + P->nc1; // next pixel right pix2 = P->pixels2 + z64 * py2 * P->rs2 + px2 * P->nc2; // output pixel pix2[0] = (pix10[0] + pix11[0]) / 2; pix2[1] = (pix10[1] + pix11[1]) / 2; pix2[2] = (pix10[2] + pix11[2]) / 2; } return 0; } /**************************************************************************************/ // rescale PXB to given max. width or height, preserving aspect ratio // same as PXB_rescale() but one size argument instead of width and height PXB * PXB_rescale(PXB *pxb1, int size) { int ww1, hh1, ww2, hh2; PXB *pxb2; ww1 = pxb1->ww; hh1 = pxb1->hh; if (ww1 >= hh1) { ww2 = size; hh2 = 1.0 * size * hh1 / ww1 + 0.5; } else { hh2 = size; ww2 = 1.0 * size * ww1 / hh1 + 0.5; } if (ww2 < 1 || hh2 < 1) { // happens - invalid jpeg file printf("*** PXB rescale() failed: %d %d \n",ww2,hh2); return 0; } pxb2 = PXB_rescale(pxb1,ww2,hh2); return pxb2; } /**************************************************************************************/ // fast rescale PXB to given max. width or height, preserving aspect ratio // same as PXB_rescale_fast() but one size argument instead of width and height PXB * PXB_rescale_fast(PXB *pxb1, int size) { int ww1, hh1, ww2, hh2; PXB *pxb2; ww1 = pxb1->ww; hh1 = pxb1->hh; if (ww1 >= hh1) { ww2 = size; hh2 = 1.0 * size * hh1 / ww1 + 0.5; } else { hh2 = size; ww2 = 1.0 * size * ww1 / hh1 + 0.5; } pxb2 = PXB_rescale_fast(pxb1,ww2,hh2); return pxb2; } /************************************************************************************** PXB * PXB_rotate(PXB *pxb, float angle) Rotate PXB pixmap image through any angle (degrees). The returned pixmap has the same size as the original, but the pixmap envelope is increased to accommodate the rotated original (e.g. a 100x100 pixmap rotated 45 deg. needs a 142x142 pixmap). Pixels added around the rotated pixmap have RGB[A] = 0. Angle is in degrees. Positive direction is clockwise. PXB must have 3 or 4 channels (RGB or RGBA). Loss of resolution is about 1/2 pixel. Algorithm: create output PXB big enough for rotated input PXB compute coefficients for affine transform loop all output pixels (px2,py2) get corresp. input pixel (px1,py1) using affine transform if outside of PXB pixmap output pixel = black continue for 4 input pixels based at (px0,py0) = (int(px1),int(py1)) compute overlap (0 to 1) with (px1,py1) sum RGB values * overlap output aggregate RGB to pixel (px2,py2) ***************************************************************************************/ PXB * PXB_rotate(PXB *pxb1, float angle) { PXB *pxb2; int nc, ac; int ww1, hh1, rs1, ww2, hh2, rs2; int px2, py2, px0, py0; float px1, py1; float f0, f1, f2, f3, red, green, blue, alpha = 0; float a, b, d, e, ww15, hh15, ww25, hh25; uch *ppix1, *ppix2, *pix0, *pix1, *pix2, *pix3; int64 z64 = 1; ww1 = pxb1->ww; hh1 = pxb1->hh; nc = pxb1->nc; ac = 0; if (nc == 4) ac = 1; // has alpha channel rs1 = ww1 * nc; while (angle < -180) angle += 360; // normalize, -180 to +180 while (angle > 180) angle -= 360; angle = angle * PI / 180; // radians, -PI to +PI if (fabsf(angle) < 0.001) { pxb2 = PXB_copy(pxb1); // angle is zero within my precision return pxb2; } ww2 = int(ww1*fabsf(cosf(angle)) + hh1*fabsf(sinf(angle))); // rectangle containing rotated pixmap hh2 = int(ww1*fabsf(sinf(angle)) + hh1*fabsf(cosf(angle))); pxb2 = PXB_make(ww2,hh2,nc); // create output pxb2 if (! pxb2) return 0; // 26.3 rs2 = ww2 * nc; ppix1 = pxb1->pixels; ppix2 = pxb2->pixels; ww15 = 0.5 * ww1; hh15 = 0.5 * hh1; ww25 = 0.5 * ww2; hh25 = 0.5 * hh2; a = cosf(angle); // affine transform coefficients b = sinf(angle); d = - sinf(angle); e = cosf(angle); for (py2 = 0; py2 < hh2; py2++) // loop through output pixels for (px2 = 0; px2 < ww2; px2++) { px1 = a * (px2 - ww25) + b * (py2 - hh25) + ww15; // (px1,py1) = corresponding py1 = d * (px2 - ww25) + e * (py2 - hh25) + hh15; // point within input pixels px0 = int(px1); // pixel containing (px1,py1) py0 = int(py1); if (px0 < 0 || px0 >= ww1-1 || py0 < 0 || py0 >= hh1-1) // if outside input pixel array, continue; // leave black pix0 = ppix1 + z64 * py0 * rs1 + px0 * nc; // 4 input pixels based at (px0,py0) pix1 = pix0 + rs1; pix2 = pix0 + nc; pix3 = pix1 + nc; f0 = (px0+1 - px1) * (py0+1 - py1); // overlap of (px1,py1) f1 = (px0+1 - px1) * (py1 - py0); // in each of the 4 pixels f2 = (px1 - px0) * (py0+1 - py1); f3 = (px1 - px0) * (py1 - py0); red = f0 * pix0[0] + f1 * pix1[0] + f2 * pix2[0] + f3 * pix3[0]; // sum the weighted inputs green = f0 * pix0[1] + f1 * pix1[1] + f2 * pix2[1] + f3 * pix3[1]; blue = f0 * pix0[2] + f1 * pix1[2] + f2 * pix2[2] + f3 * pix3[2]; if (ac) alpha = f0 * pix0[3] + f1 * pix1[3] + f2 * pix2[3] + f3 * pix3[3]; pix2 = ppix2 + z64 * py2 * rs2 + px2 * nc; // output pixel pix2[0] = int(red); pix2[1] = int(green); pix2[2] = int(blue); if (ac) pix2[3] = int(alpha); } return pxb2; } /**************************************************************************************/ // Get a virtual pixel at location (px,py) (real) in a PXB pixmap. // Get the overlapping integer pixels and build a composite. // Output vpix is uint8[4] supplied by caller. // Returns 1 if OK, 0 if px/py out of limits for pxm. int vpixel(PXB *pxb, float px, float py, uint8 *vpix) { int ww, hh, rs, nc, ac, px0, py0; uint8 *pix0, *pix1, *pix2, *pix3; float f0, f1, f2, f3; ww = pxb->ww; hh = pxb->hh; rs = pxb->rs; nc = pxb->nc; ac = nc - 3; px0 = px; // integer pixel containing (px,py) py0 = py; if (px0 < 0 || py0 < 0) return 0; if (px0 > ww-2 || py0 > hh-2) return 0; f0 = (px0+1 - px) * (py0+1 - py); // overlap of (px,py) f1 = (px0+1 - px) * (py - py0); // in each of the 4 pixels f2 = (px - px0) * (py0+1 - py); f3 = (px - px0) * (py - py0); pix0 = PXBpix(pxb,px0,py0); // pixel (px0,py0) pix1 = pix0 + rs; // (px0,py0+1) pix2 = pix0 + nc; // (px0+1,py0) pix3 = pix1 + nc; // (px0+1,py0+1) vpix[0] = f0 * pix0[0] + f1 * pix1[0] + f2 * pix2[0] + f3 * pix3[0]; // sum the weighted inputs vpix[1] = f0 * pix0[1] + f1 * pix1[1] + f2 * pix2[1] + f3 * pix3[1]; vpix[2] = f0 * pix0[2] + f1 * pix1[2] + f2 * pix2[2] + f3 * pix3[2]; if (ac) vpix[3] = f0 * pix0[3] + f1 * pix1[3] + f2 * pix2[3] + f3 * pix3[3]; return 1; } // Get a virtual pixel at location (px,py) (real) in a PXM pixmap. // Get the overlapping float pixels and build a composite. // Output vpix is float[4] supplied by caller. // Returns 1 if OK, 0 if px/py out of limits for pxm. int vpixel(PXM *pxm, float px, float py, float *vpix) { int ww, hh, nc, ac, px0, py0; float *pix0, *pix1, *pix2, *pix3; float f0, f1, f2, f3; ww = pxm->ww; hh = pxm->hh; nc = pxm->nc; ac = nc - 3; px0 = px; // integer pixel containing (px,py) py0 = py; if (px0 < 1 || py0 < 1) return 0; // off-image or edge pixel if (px0 > ww-2 || py0 > hh-2) return 0; f0 = (px0+1 - px) * (py0+1 - py); // overlap of (px,py) f1 = (px0+1 - px) * (py - py0); // in each of the 4 pixels f2 = (px - px0) * (py0+1 - py); f3 = (px - px0) * (py - py0); pix0 = PXMpix(pxm,px0,py0); // pixel (px0,py0) pix1 = pix0 + ww * nc; // (px0,py0+1) pix2 = pix0 + nc; // (px0+1,py0) pix3 = pix1 + nc; // (px0+1,py0+1) vpix[0] = f0 * pix0[0] + f1 * pix1[0] + f2 * pix2[0] + f3 * pix3[0]; // sum the weighted inputs vpix[1] = f0 * pix0[1] + f1 * pix1[1] + f2 * pix2[1] + f3 * pix3[1]; vpix[2] = f0 * pix0[2] + f1 * pix1[2] + f2 * pix2[2] + f3 * pix3[2]; if (ac) // alpha channel vpix[3] = f0 * pix0[3] + f1 * pix1[3] + f2 * pix2[3] + f3 * pix3[3]; return 1; } /**************************************************************************************/ // Copy a PXM pixmap image (RGB float) to a PXB pixmap image (RGB uint8). // NOT THREAD SAFE namespace PXM_PXB_copy_names { PXM *pxm1; PXB *pxb2; int ww, hh, nc; } PXB * PXM_PXB_copy(PXM *pxm) { using namespace PXM_PXB_copy_names; void * PXM_PXB_copy_thread(void *); ww = pxm->ww; hh = pxm->hh; nc = pxm->nc; pxm1 = pxm; pxb2 = PXB_make(ww,hh,nc); if (! pxb2) return 0; // 26.3 do_wthreads(PXM_PXB_copy_thread,NSMP); return pxb2; } void * PXM_PXB_copy_thread(void *arg) // speedup with threads { using namespace PXM_PXB_copy_names; int index = *((int *) arg); int px, py; float *pix1; uint8 *pix2; for (py = index; py < hh; py += NSMP) { pix1 = PXMpix(pxm1,0,py); pix2 = PXBpix(pxb2,0,py); for (px = 0; px < ww; px++) { pix2[0] = pix1[0]; pix2[1] = pix1[1]; pix2[2] = pix1[2]; if (nc == 4) pix2[3] = pix1[3]; pix1 += nc; pix2 += nc; } } return 0; } // Update a PXB section from an updated PXM section. // PXM and PXB must have the same dimensions. // px3, py3, ww3, hh3: modified section within pxm1 to propagate to pxb2; void PXM_PXB_update(PXM *pxm1, PXB *pxb2, int px3, int py3, int ww3, int hh3) { float *pix1; uint8 *pix2; int px, py; int lox, hix, loy, hiy; int nc1, nc2, ac; if (pxm1->ww + pxm1->hh != pxb2->ww + pxb2->hh) { zmessageACK(Mwin,"PXM_PXB_update() call error %d %d %d %d \n", pxm1->ww, pxm1->hh, pxb2->ww, pxb2->hh); quitxx(); } lox = px3; hix = px3 + ww3; if (lox < 0) lox = 0; if (hix > pxb2->ww) hix = pxb2->ww; loy = py3; hiy = py3 + hh3; if (loy < 0) loy = 0; if (hiy > pxb2->hh) hiy = pxb2->hh; nc1 = pxm1->nc; nc2 = pxb2->nc; if (nc1 > 3 && nc2 > 3) ac = 1; // alpha channel else ac = 0; for (py = loy; py < hiy; py++) { pix1 = PXMpix(pxm1,lox,py); pix2 = PXBpix(pxb2,lox,py); for (px = lox; px < hix; px++) { pix2[0] = pix1[0]; // 0.0 - 255.99 >> 0 - 255 pix2[1] = pix1[1]; pix2[2] = pix1[2]; if (ac) pix2[3] = pix1[3]; pix1 += nc1; pix2 += nc2; } } return; } // Update an output PXB section from a corresponding input PXB section. // The two PXBs represent the same image at different scales (width/height). // Input pxb1 must be larger or equal to output pxb2. // px3, py3, ww3, hh3: modified section within pxb1 to propagate to pxb2; void PXB_PXB_update(PXB *pxb1, PXB *pxb2, int px3, int py3, int ww3, int hh3) { static int pww1 = 0, phh1 = 0, pww2 = 0, phh2 = 0; static int *px1L = 0, *py1L = 0; static float scalex = 1, scaley = 1; static float *pxmap = 0, *pymap = 0; static int maxmapx = 0, maxmapy = 0; uint8 *ppix1, *ppix2; int ww1, hh1, ww2, hh2, rs1, rs2, nc1, nc2, ac; int px1, py1, px2, py2; int pxl, pyl, pxm, pym, ii; float px1a, py1a, px1b, py1b; float fx, fy, ftot; uint8 *pixel1, *pixel2; float red, green, blue, alpha; int lox, hix, loy, hiy; int64 z64 = 1; ww1 = pxb1->ww; hh1 = pxb1->hh; rs1 = pxb1->rs; nc1 = pxb1->nc; ppix1 = pxb1->pixels; ww2 = pxb2->ww; hh2 = pxb2->hh; rs2 = pxb2->rs; nc2 = pxb2->nc; ppix2 = pxb2->pixels; if (nc1 > 3 && nc2 > 3) ac = 1; // alpha channel else ac = 0; if (ww1 == pww1 && hh1 == phh1 && ww2 == pww2 && hh2 == phh2) // if the sizes are the same as before, goto copy_pixels; // the pixel mapping math can be avoided. pww1 = ww1; phh1 = hh1; pww2 = ww2; phh2 = hh2; if (px1L) { // unless this is the first call, zfree(px1L); // free prior map memory zfree(py1L); zfree(pxmap); zfree(pymap); } scalex = 1.0 * ww1 / ww2; // compute x and y scales scaley = 1.0 * hh1 / hh2; if (scalex <= 1) maxmapx = 2; // compute max input pixels else maxmapx = scalex + 2; // mapping into output pixels maxmapx += 1; // for both dimensions if (scaley <= 1) maxmapy = 2; // (pixels may not be square) else maxmapy = scaley + 2; maxmapy += 1; // (extra entry for -1 flag) pymap = (float *) zmalloc(hh2 * maxmapy * sizeof(float),"PXB_PXB_upd"); // maps overlap of < maxmap input pxmap = (float *) zmalloc(ww2 * maxmapx * sizeof(float),"PXB_PXB_upd"); // pixels per output pixel py1L = (int *) zmalloc(hh2 * sizeof(int),"PXB_PXB_upd"); // maps first (lowest) input pixel px1L = (int *) zmalloc(ww2 * sizeof(int),"PXB_PXB_upd"); // per output pixel for (py2 = 0; py2 < hh2; py2++) // loop output y-pixels { py1a = py2 * scaley; // corresponding input y-pixels py1b = py1a + scaley; if (py1b >= hh1) py1b = hh1 - 0.001; // fix precision limitation pyl = py1a; py1L[py2] = pyl; // 1st overlapping input pixel for (py1 = pyl, pym = 0; py1 < py1b; py1++, pym++) // loop overlapping input pixels { if (py1 < py1a) { // compute amount of overlap if (py1+1 < py1b) fy = py1+1 - py1a; // 0.0 to 1.0 else fy = scaley; } else if (py1+1 > py1b) fy = py1b - py1; else fy = 1; ii = py2 * maxmapy + pym; // save it pymap[ii] = 0.9999 * fy / scaley; } ii = py2 * maxmapy + pym; // set an end marker after pymap[ii] = -1; // last overlapping pixel } for (px2 = 0; px2 < ww2; px2++) // do same for x-pixels { px1a = px2 * scalex; px1b = px1a + scalex; if (px1b >= ww1) px1b = ww1 - 0.001; pxl = px1a; px1L[px2] = pxl; for (px1 = pxl, pxm = 0; px1 < px1b; px1++, pxm++) { if (px1 < px1a) { if (px1+1 < px1b) fx = px1+1 - px1a; else fx = scalex; } else if (px1+1 > px1b) fx = px1b - px1; else fx = 1; ii = px2 * maxmapx + pxm; pxmap[ii] = 0.9999 * fx / scalex; } ii = px2 * maxmapx + pxm; pxmap[ii] = -1; } copy_pixels: px3 = px3 / scalex; // convert input area to output area py3 = py3 / scaley; ww3 = ww3 / scalex + 2; hh3 = hh3 / scaley + 2; lox = px3; hix = px3 + ww3; if (lox < 0) lox = 0; if (hix > ww2) hix = ww2; loy = py3; hiy = py3 + hh3; if (loy < 0) loy = 0; if (hiy > hh2) hiy = hh2; for (py2 = loy; py2 < hiy; py2++) // loop output y-pixels { pyl = py1L[py2]; // corresp. 1st input y-pixel for (px2 = lox; px2 < hix; px2++) // loop output x-pixels { pxl = px1L[px2]; // corresp. 1st input x-pixel red = green = blue = alpha = 0; // initz. output pixel for (py1 = pyl, pym = 0; ; py1++, pym++) // loop overlapping input y-pixels { ii = py2 * maxmapy + pym; // get y-overlap fy = pymap[ii]; if (fy < 0) break; // no more pixels for (px1 = pxl, pxm = 0; ; px1++, pxm++) // loop overlapping input x-pixels { ii = px2 * maxmapx + pxm; // get x-overlap fx = pxmap[ii]; if (fx < 0) break; // no more pixels ftot = fx * fy; // area overlap = x * y overlap pixel1 = ppix1 + z64 * py1 * rs1 + px1 * nc1; red += pixel1[0] * ftot; // add input pixel * overlap green += pixel1[1] * ftot; blue += pixel1[2] * ftot; if (ac) alpha += pixel1[3] * ftot; } } pixel2 = ppix2 + z64 * py2 * rs2 + px2 * nc2; // save output pixel pixel2[0] = red; // 0.0 - 255.996 >> 0 - 255 pixel2[1] = green; pixel2[2] = blue; if (ac) pixel2[3] = alpha; } } return; } /************************************************************************************** primary image file read and write functions PXB pixmap <--> file 8-bit RGB[A] PXM pixmap <--> file float RGB[A] ***************************************************************************************/ // Load an image file into a PXB pixmap (8 bit color). // Also sets the following file scope variables: // f_load_type = "jpg" "tif" "png" "RAW" "video" "other" // f_load_bpc = disk file bits per color = 8/16 // f_load_size = disk file size // If Fack is true, failure will cause a popup ACK dialog // Do not call from a thread with Fack true. PXB * PXB_load(ch *file, int Fack) { int err; FTYPE ftype; ch *file2 = 0; ch framefile[200]; ch *pext = 0; PXB *pxb = 0; STATB statB; pthread_t tid; Fbusy(+1); static int Vftf = 1; ch *ffmpegmess = TX("video files not supported (install ffmpeg)"); if (! regfile(file,&statB)) { printf("*** PXB_load() file not found: %s \n",file); goto errret; } f_load_size = statB.st_size; ftype = image_file_type(file); if (ftype != IMAGE && ftype != RAW && ftype != VIDEO) { printf("*** PXB_load() file type not supported: %s \n",file); goto errret; } pext = strrchr(file,'.'); // file .ext if (! pext) pext = ""; if (ftype == VIDEO) // video file - extract frame 1 { if (! Ffmpeg) { if (Vftf) { Vftf = 0; printf("*** %s \n",ffmpegmess); } goto errret; } tid = pthread_self(); snprintf(framefile,200,"%s/framefile-%ld.jpg",temp_folder,tid); // unique frame file per thread // (index function, thumbnail creation) file2 = zescape_quotes(file); // escape embedded quotes err = zshell(0,"ffmpeg -ss 1 -i \"%s\" -v 8 -frames 1 -y %s", // ffmpeg command to get frame file file2, framefile); zfree(file2); if (err && err != 69) { // srmount error, ignore printf("*** PXB_load() ffmpeg cannot get video frame: %s \n",file); goto errret; } pxb = ANY_PXB_load(framefile); if (! pxb) goto errret; remove(framefile); strcpy(f_load_type,"video"); } if (ftype == IMAGE) { if (strcasestr(".jpg .jpeg",pext)) { pxb = JPG_PXB_load(file); strcpy(f_load_type,"jpg"); } // remove check for png with type jpg 25.0 else if (strcasestr(".tif .tiff",pext)) { pxb = TIFF_PXB_load(file); strcpy(f_load_type,"tif"); } else if (strcasestr(".png",pext)) { pxb = PNG_PXB_load(file); strcpy(f_load_type,"png"); } else if (strcasestr(".jxl",pext)) { // jxl pxb = JXL_PXB_load(file); strcpy(f_load_type,"jxl"); } else if (strcasestr(".heic",pext)) { // heif-gdk-pixbuf in U22.04 pxb = HEIC_PXB_load(file); strcpy(f_load_type,"heic"); } else if (strcasestr(".avif",pext)) { // libavif-gdk-pixbuf in U22.04 pxb = HEIC_PXB_load(file); strcpy(f_load_type,"avif"); } else if (strcasestr(".jp2",pext)) { pxb = JP2_PXB_load(file); strcpy(f_load_type,"jp2"); } else if (strcasestr(".webp",pext)) { // webp-pixbuf-loader in U22.04 pxb = WEBP_PXB_load(file); strcpy(f_load_type,"webp"); } else { pxb = ANY_PXB_load(file); strcpy(f_load_type,"other"); } } if (ftype == RAW) { pxb = RAW_PXB_load(file,Fraw_match_embed); strcpy(f_load_type,"RAW"); } if (pxb) { Fbusy(-1); return pxb; } errret: strcpy(f_load_type,"none"); f_load_bpc = f_load_size = 0; if (Fack) zmessageACK(Mwin,"PXB_load() file error: %s",file); Fbusy(-1); return 0; } /**************************************************************************************/ // Load an image file into a PXM pixmap (float color). // Also sets the following file scope variables: // f_load_type = "jpg" "tif" "png" "RAW" "other" // f_load_bpc = disk file bits per color = 8/16 // f_load_size = disk file size // If Fack is true, failure will cause a popup ACK dialog // Do not call from a thread with Fack true. PXM * PXM_load(ch *file, int Fack) { FTYPE ftype; ch *pext; PXM *pxm = 0; STATB statB; Fbusy(+1); if (! regfile(file,&statB)) { printf("*** PXM_load() file not found: %s \n",file); goto errret; } f_load_size = statB.st_size; ftype = image_file_type(file); if (ftype != IMAGE && ftype != RAW) { printf("*** PXM_load() file type not supported: %s \n",file); goto errret; } pext = strrchr(file,'.'); // file .ext if (! pext) pext = ""; if (ftype == IMAGE) { if (strcasestr(".jpg .jpeg",pext)) { pxm = JPG_PXM_load(file); strcpy(f_load_type,"jpg"); } else if (strcasestr(".tif .tiff",pext)) { pxm = TIFF_PXM_load(file); strcpy(f_load_type,"tif"); } else if (strcasestr(".png",pext)) { pxm = PNG_PXM_load(file); strcpy(f_load_type,"png"); } else if (strcasestr(".jxl",pext)) { // jxl pxm = JXL_PXM_load(file); strcpy(f_load_type,"jxl"); } else if (strcasestr(".heic",pext)) { pxm = HEIC_PXM_load(file); strcpy(f_load_type,"heic"); } else if (strcasestr(".avif",pext)) { pxm = HEIC_PXM_load(file); strcpy(f_load_type,"avif"); } else if (strcasestr(".jp2",pext)) { pxm = JP2_PXM_load(file); strcpy(f_load_type,"jp2"); } else if (strcasestr(".webp",pext)) { pxm = WEBP_PXM_load(file); strcpy(f_load_type,"webp"); } else { pxm = ANY_PXM_load(file); strcpy(f_load_type,"other"); } } if (ftype == RAW) { pxm = RAW_PXM_load(file,Fraw_match_embed); strcpy(f_load_type,"RAW"); } if (pxm) { PXM_audit(pxm); // 25.4 Fbusy(-1); return pxm; } errret: strcpy(f_load_type,"none"); f_load_bpc = f_load_size = 0; if (Fack) zmessageACK(Mwin,"PXM_load() file error: %s",file); Fbusy(-1); return 0; } /**************************************************************************************/ // Save a PXB pixmap to a specified file, bits/color, and quality level. // If output file is JPEG, bpc is 8 and quality is used for compression level. // If output file is TIFF or PNG, bpc may be 8 or 16 and quality is ignored. // If Fack is true, failure will cause a popup ACK dialog. // Return 0 if OK, +N if error int PXB_save(PXB *pxb, ch *file, int bpc, int quality, int Fack) { int err; ch *pext; Fbusy(+1); pext = strrchr(file,'/'); if (! pext) pext = file; pext = strrchr(pext,'.'); if (! pext) pext = ""; if (strcasestr(".tif .tiff",pext)) err = PXB_TIFF_save(pxb,file,bpc); else if (strcasestr(".png",pext)) err = PXB_PNG_save(pxb,file,bpc); else if (strcasestr(".jxl",pext)) // jxl err = PXB_JXL_save(pxb,file); else if (strcasestr(".heic",pext)) err = PXB_HEIC_save(pxb,file); else if (strcasestr(".avif",pext)) err = PXB_HEIC_save(pxb,file); else if (strcasestr(".jp2",pext)) err = PXB_JP2_save(pxb,file); else if (strcasestr(".webp",pext)) err = PXB_WEBP_save(pxb,file); else err = PXB_JPG_save(pxb,file,quality); if (! err) { Fbusy(-1); return 0; } if (Fack) zmessageACK(Mwin,"PXB_save() file error: %s",file); Fbusy(-1); return err; } /**************************************************************************************/ // Save a PXM pixmap to a specified file, bits/color, and quality level. // If output file is JPEG, bpc is 8 and quality is used for compression level. // If output file is TIFF or PNG, bpc may be 8 or 16 and quality is ignored. // If Fack is true, failure will cause a popup ACK dialog. // Return 0 if OK, +N if error int PXM_save(PXM *pxm, ch *file, int bpc, int quality, int Fack) { int err; ch *pext; Fbusy(+1); PXM_audit(pxm); // 25.4 pext = strrchr(file,'/'); if (! pext) pext = file; pext = strrchr(pext,'.'); if (! pext) pext = ""; if (strcasestr(".tif .tiff",pext)) err = PXM_TIFF_save(pxm,file,bpc); else if (strcasestr(".png",pext)) err = PXM_PNG_save(pxm,file,bpc); else if (strcasestr(".jxl",pext)) // jxl err = PXM_JXL_save(pxm,file); else if (strcasestr(".heic",pext)) err = PXM_HEIC_save(pxm,file); else if (strcasestr(".avif",pext)) err = PXM_HEIC_save(pxm,file); else if (strcasestr(".jp2",pext)) err = PXM_JP2_save(pxm,file); else if (strcasestr(".webp",pext)) err = PXM_WEBP_save(pxm,file); else err = PXM_JPG_save(pxm,file,quality); if (! err) { Fbusy(-1); return 0; } if (Fack) zmessageACK(Mwin,"PXM_save() file error: %s",file); Fbusy(-1); return err; } /************************************************************************************** JPG file read and write functions ***************************************************************************************/ #pragma GCC push_options // stop GCC from removing necessary code #pragma GCC optimize ("O1") // (all calls to jpeg_xxxx functions) // JPEG error handler function typedef struct libjpeg_error_mgr *libjpeg_error_ptr; struct libjpeg_error_mgr { struct jpeg_error_mgr pub; jmp_buf setjmp_buffer; }; void libjpeg_error_exit (j_common_ptr cinfo) { libjpeg_error_ptr errptr = (libjpeg_error_ptr) cinfo->err; // (*cinfo->err->output_message) (cinfo); // suppress secondary message longjmp(errptr->setjmp_buffer, 1); } // Load PXB pixmap from JPG file using JPG library. // set size = 0 to load a full image size // set size = N to load an image with width and height <= size PXB * JPG_PXB_load(ch *file, int size) { struct jpeg_decompress_struct cinfo; struct libjpeg_error_mgr jerr; FILE *fid = 0; uint8 **row_pointers = 0; uint8 *pixels = 0; uint8 *buffer; int ww, hh, num, nc1, nc2, row, nb; uint cc; int64 cc64; PXB *pxb = 0, *pxb2 = 0; if (! regfile(file)) goto errret; // no print error fid = fopen(file,"r"); if (! fid) goto errret; cinfo.err = jpeg_std_error(&jerr.pub); // replace standard error handler jerr.pub.error_exit = libjpeg_error_exit; // which exits on error if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_decompress(&cinfo); goto errret; } jpeg_create_decompress(&cinfo); // initz. for read jpeg_stdio_src(&cinfo,fid); jpeg_read_header(&cinfo,TRUE); ww = cinfo.image_width; // image size hh = cinfo.image_height; if (size) // used for thumbnails { if (ww >= hh) { // calculate num for actual size num = 16 * size / ww; // minimally >= target size if (ww * num / 16 < size) num++; } else { num = 16 * size / hh; if (hh * num / 16 < size) num++; } if (num == 0) num = 1; if (num < 16) { cinfo.scale_num = num; // target size = num/16 * full size cinfo.scale_denom = 16; } } jpeg_start_decompress(&cinfo); nb = cinfo.rec_outbuf_height; // rows per read nc1 = cinfo.output_components; // color channels if (nc1 != 3) printf("*** JPG_PXB_load() file has %d channels: %s \n",nc1,file); // try anyway ww = cinfo.output_width; // actual output dimensions hh = cinfo.output_height; cc64 = imagesize(ww,hh,nc1,1); if (! cc64) return 0; // 26.3 pixels = (uint8 *) zmalloc(cc64,"JPG_PXB_load"); // allocate memory for RGB image cc = hh * sizeof(void *); // allocate row pointers row_pointers = (uint8 **) zmalloc(cc,"JPG_PXB_load"); for (row = 0; row < hh; row++) // initz. row pointers row_pointers[row] = pixels + (uint)(row) * ww * nc1; // GCC bug 2018, now fixed while (cinfo.output_scanline < cinfo.output_height) { // read rows row = cinfo.output_scanline; buffer = row_pointers[row]; jpeg_read_scanlines(&cinfo,&buffer,nb); } jpeg_finish_decompress(&cinfo); // wrap-up jpeg_destroy_decompress(&cinfo); fclose(fid); zfree(row_pointers); row_pointers = 0; nc2 = 3; // RGB output even if monocolor input pxb = PXB_make(ww,hh,nc2); // output PXB, no alpha channel if (! pxb) goto errret; // 26.3 pixelvert(pixels,pxb->pixels,ww,hh,nc1,nc2); // convert pixel data if (size) // make final exact size { if (ww >= hh) { hh = hh * size / ww; ww = size; } else { ww = ww * size / hh; hh = size; } pxb2 = PXB_rescale(pxb,ww,hh); PXB_free(pxb); pxb = pxb2; } zfree(pixels); pixels = 0; f_load_bpc = 8; return pxb; errret: printf("*** JPG_PXB_load() file error: %s \n",file); if (fid && fileno(fid) != -1) fclose(fid); if (row_pointers) zfree(row_pointers); if (pixels) zfree(pixels); return 0; } // Load PXM pixmap from JPG file using JPG library. PXM * JPG_PXM_load(ch *file) { struct jpeg_decompress_struct cinfo; struct libjpeg_error_mgr jerr; FILE *fid = 0; uint8 **row_pointers = 0; uint8 *pixels = 0; uint8 *buffer; int ww, hh, nc1, nc2, row, nb; uint cc; int64 cc64; PXM *pxm = 0; if (! regfile(file)) goto errret; // no print error fid = fopen(file,"r"); if (! fid) goto errret; cinfo.err = jpeg_std_error(&jerr.pub); // replace standard error handler jerr.pub.error_exit = libjpeg_error_exit; // which exits on error if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_decompress(&cinfo); goto errret; } jpeg_create_decompress(&cinfo); // initz. for read jpeg_stdio_src(&cinfo,fid); jpeg_read_header(&cinfo,TRUE); ww = cinfo.image_width; // image size hh = cinfo.image_height; jpeg_start_decompress(&cinfo); nb = cinfo.rec_outbuf_height; // rows per read nc1 = cinfo.output_components; // color channels if (nc1 != 3) printf("*** JPG_PXM_load() file has %d channels: %s \n",nc1,file); // try anyway ww = cinfo.output_width; // actual output dimensions hh = cinfo.output_height; cc64 = imagesize(ww,hh,nc1,1); if (! cc64) return 0; // 26.3 pixels = (uint8 *) zmalloc(cc64,"JPG_PXM_load"); // allocate memory for RGB image cc = hh * sizeof(void *); // allocate row pointers row_pointers = (uint8 **) zmalloc(cc,"JPG_PXM_load"); for (row = 0; row < hh; row++) // initz. row pointers row_pointers[row] = pixels + (uint)(row) * ww * nc1; // GCC bug 2018, now fixed while (cinfo.output_scanline < cinfo.output_height) { // read rows row = cinfo.output_scanline; buffer = row_pointers[row]; jpeg_read_scanlines(&cinfo,&buffer,nb); } jpeg_finish_decompress(&cinfo); // wrap-up jpeg_destroy_decompress(&cinfo); fclose(fid); zfree(row_pointers); row_pointers = 0; nc2 = 3; pxm = PXM_make(ww,hh,nc2); // output PXM, no alpha channel if (! pxm) return 0; // too big 26.3 pixelvert(pixels,pxm->pixels,ww,hh,nc1,nc2); // convert pixel data PXM_audit(pxm); // audit/repair zfree(pixels); pixels = 0; f_load_bpc = 8; return pxm; errret: printf("*** JPG_PXM_load() file error: %s \n",file); if (fid && fileno(fid) != -1) fclose(fid); if (row_pointers) zfree(row_pointers); if (pixels) zfree(pixels); return 0; } // Write PXB pixmap to JPG file using JPG library. // quality is compression quality 0-100 // returns 0 if OK, +N if error. int PXB_JPG_save(PXB *pxb, ch *file, int quality) { struct jpeg_compress_struct cinfo; struct libjpeg_error_mgr jerr; FILE *fid = 0; int ww, hh, nc1, nc2, row, nn; uint cc; int64 cc64; uint8 **row_pointers = 0; uint8 *pixels1, *pixels2 = 0; fid = fopen(file,"w"); if (! fid) goto errret; cinfo.err = jpeg_std_error(&jerr.pub); // replace standard error handler jerr.pub.error_exit = libjpeg_error_exit; // which exits on error if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_compress(&cinfo); goto errret; } jpeg_create_compress(&cinfo); // initz. for write jpeg_stdio_dest(&cinfo,fid); ww = pxb->ww; // image dimensions hh = pxb->hh; nc1 = pxb->nc; // input channels (3/4) nc2 = 3; // output channels pixels1 = pxb->pixels; // input pixels cc64 = imagesize(ww,hh,nc2,1); if (! cc64) return 1; // 26.3 pixels2 = (uint8 *) zmalloc(cc64,"PXB_JPG_save"); pixelvert(pixels1,pixels2,ww,hh,nc1,nc2); // convert pixel data cinfo.image_width = ww; cinfo.image_height = hh; cinfo.input_components = nc2; cinfo.in_color_space = JCS_RGB; jpeg_set_defaults(&cinfo); // default compression parameters jpeg_set_quality(&cinfo,quality,TRUE); // compression quality 0-100 jpeg_start_compress(&cinfo,TRUE); cc = hh * sizeof(void *); // allocate row pointers row_pointers = (uint8 **) zmalloc(cc,"PXB_JPG_save"); for (row = 0; row < hh; row++) // initz. row pointers row_pointers[row] = pixels2 + (uint)(row) * ww * nc2; // GCC bug 2018, now fixed nn = jpeg_write_scanlines(&cinfo,row_pointers,hh); // write rows if (nn != hh) goto errret; jpeg_finish_compress(&cinfo); // wrap-up jpeg_destroy_compress(&cinfo); fclose(fid); zfree(row_pointers); zfree(pixels2); row_pointers = 0; pixels2 = 0; return 0; errret: printf("*** PXB_JPG_save() file error: %s \n",file); if (fid && fileno(fid) != -1) fclose(fid); if (row_pointers) zfree(row_pointers); if (pixels2) zfree(pixels2); return 3; } // Write PXM pixmap to JPG file using JPG library. // quality is compression quality 0-100 // returns 0 if OK, +N if error. int PXM_JPG_save(PXM *pxm, ch *file, int quality) { struct jpeg_compress_struct cinfo; struct libjpeg_error_mgr jerr; FILE *fid = 0; int ww, hh, nc1, nc2, row, nn; uint cc; int64 cc64; uint8 **row_pointers = 0; uint8 *pixels2 = 0; float *pixels1; fid = fopen(file,"w"); if (! fid) goto errret; cinfo.err = jpeg_std_error(&jerr.pub); // replace standard error handler jerr.pub.error_exit = libjpeg_error_exit; // which exits on error if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_compress(&cinfo); goto errret; } jpeg_create_compress(&cinfo); // initz. for write jpeg_stdio_dest(&cinfo,fid); ww = pxm->ww; // image dimensions hh = pxm->hh; nc1 = pxm->nc; // 3 or 4 channels RGB[A] nc2 = 3; pixels1 = pxm->pixels; // input float * cc64 = imagesize(ww,hh,nc2,1); if (! cc64) return 1; // 26.3 pixels2 = (uint8 *) zmalloc(cc64,"PXM_JPG_save"); // output uint8 * pixelvert(pixels1,pixels2,ww,hh,nc1,nc2); // convert pixel data cinfo.image_width = ww; cinfo.image_height = hh; cinfo.input_components = nc2; // RGB cinfo.in_color_space = JCS_RGB; jpeg_set_defaults(&cinfo); // default compression parameters jpeg_set_quality(&cinfo,quality,TRUE); // compression quality 0-100 jpeg_start_compress(&cinfo,TRUE); cc = hh * sizeof(void *); // allocate row pointers row_pointers = (uint8 **) zmalloc(cc,"PXM_JPG_save"); for (row = 0; row < hh; row++) // initz. row pointers row_pointers[row] = pixels2 + (uint)(row) * ww * nc2; // GCC bug 2018, now fixed nn = jpeg_write_scanlines(&cinfo,row_pointers,hh); // write rows if (nn != hh) goto errret; jpeg_finish_compress(&cinfo); // wrap-up jpeg_destroy_compress(&cinfo); fclose(fid); zfree(row_pointers); zfree(pixels2); row_pointers = 0; pixels2 = 0; return 0; errret: printf("*** PXM_JPG_save() file error: %s \n",file); if (fid && fileno(fid) != -1) fclose(fid); if (row_pointers) zfree(row_pointers); if (pixels2) zfree(pixels2); return 2; } /**************************************************************************************/ #pragma GCC pop_options // revert to normal optimization /************************************************************************************** TIFF file read and write functions ***************************************************************************************/ // Intercept TIFF warning messages (many) void tiffwarninghandler(cch *module, cch *format, va_list ap) { return; // stop flood of crap ch message[200]; vsnprintf(message,199,format,ap); printf("*** libtiff warning: %s %s \n",module,message); return; } // Load PXB pixmap from TIFF file using TIFF library. // Native TIFF file bits/color >> f_load_bpc PXB * TIFF_PXB_load(ch *file) { static int ftf = 1; TIFF *tiff; PXB *pxb; ch *tiffbuff; uint16 bpc, nc1, nc2, pcfg; // pcfg int -> uint16 uint ww, hh, rs1, rps, rwb, stb, nst; uint row, strip, cc; int64 buffsz1, buffsz2, buffsz; int64 buffbytes, buffbits; int64 z64 = 1; if (! regfile(file)) goto errret; // no print error if (ftf) { TIFFSetWarningHandler(tiffwarninghandler); // intercept TIFF warning messages ftf = 0; } tiff = TIFFOpen(file,"r"); if (! tiff) goto errret; TIFFGetFieldDefaulted(tiff, TIFFTAG_IMAGEWIDTH, &ww); // width TIFFGetFieldDefaulted(tiff, TIFFTAG_IMAGELENGTH, &hh); // height TIFFGetFieldDefaulted(tiff, TIFFTAG_BITSPERSAMPLE, &bpc); // bits per color, 1/8/16 TIFFGetFieldDefaulted(tiff, TIFFTAG_SAMPLESPERPIXEL, &nc1); // no. channels (colors), 1/2/3/4 TIFFGetFieldDefaulted(tiff, TIFFTAG_ROWSPERSTRIP, &rps); // rows per strip TIFFGetFieldDefaulted(tiff, TIFFTAG_PLANARCONFIG, &pcfg); // 1 = contiguous, 2 = planes rwb = TIFFScanlineSize(tiff); // scanline size stb = TIFFStripSize(tiff); // strip size (ww) nst = TIFFNumberOfStrips(tiff); // number of strips (hh) if (pcfg != 1 || nc1 > 4) { printf("*** TIFF_PXB_load() TIFF format not supported: %s pcfg: %d nc1: %d \n",file,pcfg,nc1); TIFFClose(tiff); goto errret; } if (bpc != 8 && bpc != 16) { // bits/color printf("*** TIFF_PXB_load() TIFF format not supported: %s bpc: %d \n",file,bpc); TIFFClose(tiff); goto errret; } if (nst == 0 || stb == 0) { // R.Nolde tiff integrity checks printf("*** TIFF_PXB_load() TIFF format not supported: %s nst: %d stb: %d \n",file,nst,stb); TIFFClose(tiff); goto errret; } buffbytes = ((uint64)(stb)) * nst; if (stb != buffbytes / nst) { printf("*** TIFF_PXB_load() TIFF buffer check fail: %s %d %d \n",file,stb,nst); TIFFClose(tiff); goto errret; } buffbits = ((uint64)(ww)) * hh * nc1 * bpc; if (hh != buffbits / ww / nc1 / bpc) { printf("*** TIFF_PXB_load() TIFF buffer check fail: %s %d %d %d %d \n",file,ww,hh,nc1,bpc); TIFFClose(tiff); goto errret; } rs1 = ww * nc1; // row stride if (bpc == 16) rs1 = rs1 * 2; buffsz1 = z64 * stb * nst; // alternate size calculations buffsz2 = z64 * rs1 * hh; buffsz = buffsz1; if (buffsz2 > buffsz) buffsz = buffsz2; // use the larger if (! buffsz) goto errret; buffsz += rwb; // extra row, R.Nolde tiffbuff = (ch *) zmalloc(buffsz,"TIFF_PXB_load"); // allocate buffer for (strip = 0; strip < nst; strip++) // read strips { row = strip * rps; // 1st row in strip cc = TIFFReadEncodedStrip(tiff,strip,tiffbuff+row*rs1,stb); if (cc > 0) continue; if (cc == 0) break; TIFFClose(tiff); // failed zfree(tiffbuff); return ANY_PXB_load(file); // fallback to pixbuf loader } TIFFClose(tiff); if (nc1 == 2 || nc1 == 4) nc2 = 4; // alpha channel present else nc2 = 3; pxb = PXB_make(ww,hh,nc2); // create output PXB if (! pxb) goto errret; // 26.3 if (bpc == 8) pixelvert((uint8 *) tiffbuff,pxb->pixels,ww,hh,nc1,nc2); // convert pixel data if (bpc == 16) pixelvert((uint16 *) tiffbuff,pxb->pixels,ww,hh,nc1,nc2); zfree(tiffbuff); f_load_bpc = bpc; return pxb; errret: printf("*** TIFF_PXB_load() file error: %s \n",file); return 0; } // Load PXM pixmap from TIFF file using TIFF library. // Native TIFF file bits/color >> f_load_bpc PXM * TIFF_PXM_load(ch *file) { static int ftf = 1; TIFF *tiff; PXM *pxm; ch *tiffbuff; uint16 bpc, nc1, nc2, pcfg; // pcfg int -> uint16 uint ww, hh, rs1, rps, rwb, stb, nst; uint row, strip, cc; int64 buffsz1, buffsz2, buffsz; int64 buffbytes, buffbits; int64 z64 = 1; if (! regfile(file)) goto errret; // no print error if (ftf) { TIFFSetWarningHandler(tiffwarninghandler); // intercept TIFF warning messages ftf = 0; } tiff = TIFFOpen(file,"r"); if (! tiff) goto errret; TIFFGetFieldDefaulted(tiff, TIFFTAG_IMAGEWIDTH, &ww); // width TIFFGetFieldDefaulted(tiff, TIFFTAG_IMAGELENGTH, &hh); // height TIFFGetFieldDefaulted(tiff, TIFFTAG_BITSPERSAMPLE, &bpc); // bits per color, 1/8/16 TIFFGetFieldDefaulted(tiff, TIFFTAG_SAMPLESPERPIXEL, &nc1); // no. channels (colors), 1/2/3/4 TIFFGetFieldDefaulted(tiff, TIFFTAG_ROWSPERSTRIP, &rps); // rows per strip TIFFGetFieldDefaulted(tiff, TIFFTAG_PLANARCONFIG, &pcfg); // 1 = contiguous, 2 = planes rwb = TIFFScanlineSize(tiff); // scanline size stb = TIFFStripSize(tiff); // strip size (ww) nst = TIFFNumberOfStrips(tiff); // number of strips (hh) if (pcfg != 1 || nc1 > 4) { printf("*** TIFF_PXM_load() TIFF format not supported: %s pcfg: %d nc1: %d \n",file,pcfg,nc1); TIFFClose(tiff); goto errret; } if (bpc != 8 && bpc != 16) { // bits/color printf("*** TIFF_PXM_load() TIFF format not supported: %s bpc: %d \n",file,bpc); TIFFClose(tiff); goto errret; } if (nst == 0 || stb == 0) { // R.Nolde tiff integrity checks printf("*** TIFF_PXM_load() TIFF format not supported: %s nst: %d stb: %d \n",file,nst,stb); TIFFClose(tiff); goto errret; } buffbytes = ((uint64)(stb)) * nst; if (stb != buffbytes / nst) { printf("*** TIFF_PXM_load() TIFF buffer check fail: %s %d %d \n",file,stb,nst); TIFFClose(tiff); goto errret; } buffbits = ((uint64)(ww)) * hh * nc1 * bpc; if (hh != buffbits / ww / nc1 / bpc) { printf("*** TIFF_PXM_load() TIFF buffer check fail: %s %d %d %d %d \n",file,ww,hh,nc1,bpc); TIFFClose(tiff); goto errret; } rs1 = ww * nc1; // row stride if (bpc == 16) rs1 = rs1 * 2; buffsz1 = z64 * stb * nst; // alternate size calculations buffsz2 = z64 * rs1 * hh; buffsz = buffsz1; if (buffsz2 > buffsz) buffsz = buffsz2; // use the larger if (! buffsz) goto errret; buffsz += rwb; // extra row, R.Nolde tiffbuff = (ch *) zmalloc(buffsz,"TIFF_PXM_load"); // allocate buffer for (strip = 0; strip < nst; strip++) // read strips { row = strip * rps; // 1st row in strip cc = TIFFReadEncodedStrip(tiff,strip,tiffbuff+row*rs1,stb); if (cc > 0) continue; if (cc == 0) break; TIFFClose(tiff); // failed zfree(tiffbuff); return ANY_PXM_load(file); // fallback to pixbuf loader } TIFFClose(tiff); if (nc1 == 2 || nc1 == 4) nc2 = 4; // alpha channel present else nc2 = 3; pxm = PXM_make(ww,hh,nc2); // create output PXM if (! pxm) return 0; // too big 26.3 if (bpc == 8) pixelvert((uint8 *) tiffbuff,pxm->pixels,ww,hh,nc1,nc2); // convert pixel data if (bpc == 16) pixelvert((uint16 *) tiffbuff,pxm->pixels,ww,hh,nc1,nc2); zfree(tiffbuff); f_load_bpc = bpc; PXM_audit(pxm); // audit/repair return pxm; errret: printf("*** TIFF_PXM_load() file error: %s \n",file); return 0; } // Write PXB pixmap to TIFF file using TIFF library. // TIFF file bpc is 8 or 16. // Returns 0 if OK, +N if error. int PXB_TIFF_save(PXB *pxb, ch *file, int bpc) { static int ftf = 1; TIFF *tiff; ch *tiffbuff; int tiffstat = 0; int ww, hh, row; // int not uint int nc1, nc2, rs2, pm = 2, pc = 1, rps = 1; int64 cc64, z64 = 1; uint16 es[1]; if (ftf) { TIFFSetWarningHandler(tiffwarninghandler); // intercept TIFF warning messages ftf = 0; } tiff = TIFFOpen(file,"w"); if (! tiff) goto errret; ww = pxb->ww; hh = pxb->hh; nc1 = pxb->nc; nc2 = nc1; rs2 = ww * nc2; // output row stride if (bpc == 16) rs2 = rs2 * 2; cc64 = z64 * rs2 * hh; tiffbuff = (ch *) zmalloc(cc64,"PXB_TIFF_save"); TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, ww); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, hh); // Nolde TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, bpc); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, nc2); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, pm); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, pc); TIFFSetField(tiff, TIFFTAG_COMPRESSION, 8); // deflate (best for color images) 26.8 TIFFSetField(tiff, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); // Nolde if (nc2 == 2 || nc2 == 4) { // extra channel is alpha es[0] = EXTRASAMPLE_ASSOCALPHA; TIFFSetField(tiff,TIFFTAG_EXTRASAMPLES,1,&es); } if (rs2 > 10240) rps = 1; // R.Nolde else rps = 10240 / rs2; TIFFSetField(tiff,TIFFTAG_ROWSPERSTRIP,rps); if (bpc == 8) pixelvert(pxb->pixels,(uint8 *) tiffbuff,ww,hh,nc1,nc2); if (bpc == 16) pixelvert(pxb->pixels,(uint16 *) tiffbuff,ww,hh,nc1,nc2); for (row = 0; row < hh; row++) { tiffstat = TIFFWriteScanline(tiff,tiffbuff+row*rs2,row,0); if (tiffstat != 1) break; } TIFFClose(tiff); zfree(tiffbuff); if (tiffstat == 1) return 0; errret: printf("*** PXB_TIFF_save() file error: %s \n",file); return 1; } // Write PXM pixmap to TIFF file using TIFF library. // TIFF file bpc is 8 or 16. // Returns 0 if OK, +N if error. int PXM_TIFF_save(PXM *pxm, ch *file, int bpc) { static int ftf = 1; TIFF *tiff; ch *tiffbuff; int tiffstat = 0; int ww, hh, row; // int not uint int nc1, nc2, rs2, pm = 2, pc = 1, rps = 1; int64 cc64, z64 = 1; uint16 es[1]; if (ftf) { TIFFSetWarningHandler(tiffwarninghandler); // intercept TIFF warning messages ftf = 0; } tiff = TIFFOpen(file,"w"); if (! tiff) goto errret; ww = pxm->ww; hh = pxm->hh; nc1 = pxm->nc; nc2 = nc1; rs2 = ww * nc2; // output row stride if (bpc == 16) rs2 = rs2 * 2; cc64 = z64 * rs2 * hh; tiffbuff = (ch *) zmalloc(cc64,"PXM_TIFF_save"); TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, ww); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, hh); // Nolde TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, bpc); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, nc2); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, pm); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, pc); TIFFSetField(tiff, TIFFTAG_COMPRESSION, 8); // deflate (best for color images) 26.8 TIFFSetField(tiff, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); // Nolde if (nc2 == 2 || nc2 == 4) { // extra channel is alpha es[0] = EXTRASAMPLE_ASSOCALPHA; TIFFSetField(tiff,TIFFTAG_EXTRASAMPLES,1,&es); } if (rs2 > 10240) rps = 1; // R.Nolde else rps = 10240 / rs2; TIFFSetField(tiff,TIFFTAG_ROWSPERSTRIP,rps); if (bpc == 8) pixelvert(pxm->pixels,(uint8 *) tiffbuff,ww,hh,nc1,nc2); if (bpc == 16) pixelvert(pxm->pixels,(uint16 *) tiffbuff,ww,hh,nc1,nc2); for (row = 0; row < hh; row++) { tiffstat = TIFFWriteScanline(tiff,tiffbuff+row*rs2,row,0); if (tiffstat != 1) break; } TIFFClose(tiff); zfree(tiffbuff); if (tiffstat == 1) return 0; errret: printf("*** PXM_TIFF_save() file error: %s \n",file); return 1; } /************************************************************************************** PNG file read and write functions ***************************************************************************************/ // Load PXB pixmap from PNG file using PNG library. // Native PNG file bits/color >> f_load_bpc PXB * PNG_PXB_load(ch *file) { png_structp pngstruct = 0; png_infop pnginfo = 0; FILE *fid = 0; int ww, hh, bpc, nc1, nc2, rs1, row, colortype; uch *pngbuff, **pngrows; PXB *pxb; int64 cc64; if (! regfile(file)) goto errret; // no print error fid = fopen(file,"r"); // open file if (! fid) goto errret; pngstruct = png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0); // create png structs if (! pngstruct) goto errret; pnginfo = png_create_info_struct(pngstruct); if (! pnginfo) goto errret; if (setjmp(png_jmpbuf(pngstruct))) goto errret; // setup error handling png_init_io(pngstruct,fid); // read png file png_read_png(pngstruct,pnginfo,PNG_TRANSFORM_SWAP_ENDIAN,0); fclose(fid); ww = png_get_image_width(pngstruct,pnginfo); // width hh = png_get_image_height(pngstruct,pnginfo); // height bpc = png_get_bit_depth(pngstruct,pnginfo); // bits per color (channel) nc1 = png_get_channels(pngstruct,pnginfo); // no. channels colortype = png_get_color_type(pngstruct,pnginfo); // color type pngrows = png_get_rows(pngstruct,pnginfo); // array of png row pointers if (colortype == PNG_COLOR_TYPE_GRAY || colortype == PNG_COLOR_TYPE_RGB) nc2 = 3; else if (colortype == PNG_COLOR_TYPE_GRAY_ALPHA || colortype == PNG_COLOR_TYPE_RGB_ALPHA) nc2 = 4; else { png_destroy_read_struct(&pngstruct,&pnginfo,0); return ANY_PXB_load(file); // fallback to pixbuf loader } if (bpc != 8 && bpc != 16) { // not 8 or 16 bits per channel png_destroy_read_struct(&pngstruct,&pnginfo,0); return ANY_PXB_load(file); // use standard pixbuf loader } if (nc1 > 4) { // not gray (+alpha) or RGB (+alpha) png_destroy_read_struct(&pngstruct,&pnginfo,0); return ANY_PXB_load(file); // use standard pixbuf loader } pxb = PXB_make(ww,hh,nc2); // create output PXB if (! pxb) goto errret; // 26.3 rs1 = ww * nc1; // png input row stride if (bpc == 16) rs1 = rs1 * 2; cc64 = imagesize(ww,hh,nc1,1); if (bpc == 16) cc64 = imagesize(ww,hh,nc1,2); if (! cc64) return 0; // 26.3 pngbuff = (uch *) zmalloc(cc64,"PNG_PXB_load"); // png file input buffer for (row = 0; row < hh; row++) // get all png rows memcpy(pngbuff+row*rs1,pngrows[row],rs1); png_destroy_read_struct(&pngstruct,&pnginfo,0); // release memory if (bpc == 8) pixelvert((uint8 *) pngbuff,pxb->pixels,ww,hh,nc1,nc2); // convert pixel data if (bpc == 16) pixelvert((uint16 *) pngbuff,pxb->pixels,ww,hh,nc1,nc2); zfree(pngbuff); f_load_bpc = bpc; return pxb; errret: printf("*** PNG_PXB_load() file error: %s \n",file); if (fid && fileno(fid) != -1) fclose(fid); return 0; } // Load PXM pixmap from PNG file using PNG library. // Native PNG file bits/color >> f_load_bpc PXM * PNG_PXM_load(ch *file) { png_structp pngstruct = 0; png_infop pnginfo = 0; FILE *fid = 0; int ww, hh, bpc, nc1, nc2, rs1, row, colortype; uch *pngbuff, **pngrows; PXM *pxm; int64 cc64; if (! regfile(file)) goto errret; // no print error fid = fopen(file,"r"); // open file if (! fid) goto errret; pngstruct = png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0); // create png structs if (! pngstruct) goto errret; pnginfo = png_create_info_struct(pngstruct); if (! pnginfo) goto errret; if (setjmp(png_jmpbuf(pngstruct))) goto errret; // setup error handling png_init_io(pngstruct,fid); // read png file png_read_png(pngstruct,pnginfo,PNG_TRANSFORM_SWAP_ENDIAN,0); fclose(fid); ww = png_get_image_width(pngstruct,pnginfo); // width hh = png_get_image_height(pngstruct,pnginfo); // height bpc = png_get_bit_depth(pngstruct,pnginfo); // bits per color (channel) nc1 = png_get_channels(pngstruct,pnginfo); // no. channels colortype = png_get_color_type(pngstruct,pnginfo); // color type pngrows = png_get_rows(pngstruct,pnginfo); // array of png row pointers if (colortype == PNG_COLOR_TYPE_GRAY || colortype == PNG_COLOR_TYPE_RGB) nc2 = 3; else if (colortype == PNG_COLOR_TYPE_GRAY_ALPHA || colortype == PNG_COLOR_TYPE_RGB_ALPHA) nc2 = 4; else { png_destroy_read_struct(&pngstruct,&pnginfo,0); return ANY_PXM_load(file); // fallback to pixbuf loader } if (bpc != 8 && bpc != 16) { png_destroy_read_struct(&pngstruct,&pnginfo,0); return ANY_PXM_load(file); // use standard pixbuf loader } if (nc1 > 4) { // not gray (+alpha) or RGB (+alpha) png_destroy_read_struct(&pngstruct,&pnginfo,0); return ANY_PXM_load(file); // use standard pixbuf loader } pxm = PXM_make(ww,hh,nc2); // create PXM if (! pxm) return 0; // too big 26.3 rs1 = ww * nc1; // png input row stride if (bpc == 16) rs1 = rs1 * 2; cc64 = imagesize(ww,hh,nc1,1); if (bpc == 16) cc64 = imagesize(ww,hh,nc1,2); if (! cc64) return 0; // 26.3 pngbuff = (uch *) zmalloc(cc64,"PNG_PXM_load"); // png file input buffer for (row = 0; row < hh; row++) // get all png rows memcpy(pngbuff+row*rs1,pngrows[row],rs1); png_destroy_read_struct(&pngstruct,&pnginfo,0); // release memory if (bpc == 8) pixelvert((uint8 *) pngbuff,pxm->pixels,ww,hh,nc1,nc2); // convert pixel data if (bpc == 16) pixelvert((uint16 *) pngbuff,pxm->pixels,ww,hh,nc1,nc2); PXM_audit(pxm); // audit/repair zfree(pngbuff); f_load_bpc = bpc; return pxm; errret: printf("*** PNG_PXM_load() file error: %s \n",file); if (fid && fileno(fid) != -1) fclose(fid); return 0; } // callback function for png_write - prevent "fotocx not responding" popup // libpng - writing to a large PNG file is incredibly slow. void png_write_row_callback(png_structp png_ptr, png_uint_32 row, int pass) // 25.0 { if (row == row/100*100) zmainloop(); // GTK main loop every 100 rows return; } // Write PXB pixmap to PNG file using PNG library. // File bpc is 8 or 16. // returns 0 if OK, +N if error. int PXB_PNG_save(PXB *pxb, ch *file, int bpc) { png_structp pngstruct; png_infop pnginfo; FILE *fid = 0; uch *pngbuff, **pngrows; int ww, hh, nc1, nc2, rs2, row; int64 cc64; if (bpc != 8 && bpc != 16) { printf("*** PXB_PNG_save() PNG BPC not 8/16: %s \n",file); goto errret; } fid = fopen(file,"w"); // open output file if (! fid) goto errret; ww = pxb->ww; hh = pxb->hh; nc1 = pxb->nc; nc2 = nc1; pngstruct = png_create_write_struct(PNG_LIBPNG_VER_STRING,0,0,0); // create png structs if (! pngstruct) goto errret; pnginfo = png_create_info_struct(pngstruct); if (! pnginfo) goto errret; if (setjmp(png_jmpbuf(pngstruct))) goto errret; // setup error handling png_init_io(pngstruct,fid); // initz. for writing file if (nc1 == 4) png_set_IHDR(pngstruct,pnginfo,ww,hh,bpc,PNG_COLOR_TYPE_RGB_ALPHA,0,0,0); else png_set_IHDR(pngstruct,pnginfo,ww,hh,bpc,PNG_COLOR_TYPE_RGB,0,0,0); png_set_compression_level(pngstruct,1); // faster 26.0 png_set_filter(pngstruct,0,PNG_FILTER_NONE); rs2 = ww * nc2; // png row length if (bpc == 16) rs2 = rs2 * 2; cc64 = imagesize(ww,hh,nc2,1); if (bpc == 16) cc64 = imagesize(ww,hh,nc2,2); if (! cc64) return 1; // 26.3 pngbuff = (uch *) zmalloc(cc64,"PXB_PNG_save"); // allocate png file data pngrows = (uch **) zmalloc(hh * sizeof(ch *),"PXB_PNG_save"); // allocate png row pointers png_set_rows(pngstruct,pnginfo,pngrows); for (row = 0; row < hh; row++) // set row pointers to row data pngrows[row] = pngbuff + row * rs2; if (bpc == 8) pixelvert(pxb->pixels,(uint8 *) pngbuff,ww,hh,nc1,nc2); // convert pixel data if (bpc == 16) pixelvert(pxb->pixels,(uint16 *) pngbuff,ww,hh,nc1,nc2); png_set_write_status_fn(pngstruct,png_write_row_callback); // set row callback function 25.0 png_write_png(pngstruct,pnginfo,PNG_TRANSFORM_SWAP_ENDIAN,0); // write the file fclose(fid); png_destroy_write_struct(&pngstruct,&pnginfo); // release memory zfree(pngbuff); zfree(pngrows); return 0; errret: printf("*** PXB_PNG_save() file error: %s \n",file); if (fid && fileno(fid) != -1) fclose(fid); return 2; } // Write PXM pixmap to PNG file using PNG library. // File bpc is 8 or 16. // returns 0 if OK, +N if error. int PXM_PNG_save(PXM *pxm, ch *file, int bpc) { png_structp pngstruct; png_infop pnginfo; FILE *fid = 0; uch *pngbuff, **pngrows; int ww, hh, nc1, nc2, rs2, row; int cc64; if (bpc != 8 && bpc != 16) { printf("*** PXM_PNG_save() PNG BPC not 8/16: %s \n",file); goto errret; } fid = fopen(file,"w"); // open output file if (! fid) goto errret; ww = pxm->ww; hh = pxm->hh; nc1 = pxm->nc; nc2 = nc1; pngstruct = png_create_write_struct(PNG_LIBPNG_VER_STRING,0,0,0); // create png structs if (! pngstruct) goto errret; pnginfo = png_create_info_struct(pngstruct); if (! pnginfo) goto errret; if (setjmp(png_jmpbuf(pngstruct))) goto errret; // setup error handling png_init_io(pngstruct,fid); // initz. for writing file if (nc1 == 4) png_set_IHDR(pngstruct,pnginfo,ww,hh,bpc,PNG_COLOR_TYPE_RGB_ALPHA,0,0,0); else png_set_IHDR(pngstruct,pnginfo,ww,hh,bpc,PNG_COLOR_TYPE_RGB,0,0,0); png_set_compression_level(pngstruct,1); // faster 26.0 png_set_filter(pngstruct,0,PNG_FILTER_NONE); rs2 = ww * nc2; // png row length if (bpc == 16) rs2 = rs2 * 2; cc64 = imagesize(ww,hh,nc2,1); if (bpc == 16) cc64 = imagesize(ww,hh,nc2,2); if (! cc64) return 1; // 26.3 pngbuff = (uch *) zmalloc(cc64,"PXM_PNG_save"); // allocate png file data pngrows = (uch **) zmalloc(hh * sizeof(ch *),"PXM_PNG_save"); // allocate png row pointers png_set_rows(pngstruct,pnginfo,pngrows); for (row = 0; row < hh; row++) // set row pointers to row data pngrows[row] = pngbuff + row * rs2; if (bpc == 8) pixelvert(pxm->pixels,(uint8 *) pngbuff,ww,hh,nc1,nc2); // convert pixel data if (bpc == 16) pixelvert(pxm->pixels,(uint16 *) pngbuff,ww,hh,nc1,nc2); png_set_write_status_fn(pngstruct,png_write_row_callback); // set row callback function 25.0 png_write_png(pngstruct,pnginfo,PNG_TRANSFORM_SWAP_ENDIAN,0); // write the file fclose(fid); png_destroy_write_struct(&pngstruct,&pnginfo); // release memory zfree(pngbuff); zfree(pngrows); return 0; errret: printf("*** PXM_PNG_save() file error: %s \n",file); if (fid && fileno(fid) != -1) fclose(fid); return 2; } /************************************************************************************** JXL file read and write functions JXL // 26.0 ***************************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include bool JXLdataToFloat(const uint8_t* jxl, size_t size, std::vector* pixels, size_t* xsize, size_t* ysize); bool FloatToJXLdata(const std::vector& pixels, const uint32_t xsize, const uint32_t ysize, uint nchan, std::vector* compressed); // load PXB pixmap from JXL file using libjxl function PXB * JXL_PXB_load(ch *jxlfile) { FILE *fid; STATB statB; PXB *pxb; uint ii, jj, px, py; size_t fsize; size_t ww, hh, err, ok; std::vector filedata; std::vector pixels; err = stat(jxlfile,&statB); // get jxl file size if (err) goto errx; fsize = statB.st_size; filedata.resize(fsize); // allocate buffer fid = fopen(jxlfile,"r"); // read file if (! fid) goto errx; fsize = fread(filedata.data(),1,fsize,fid); fclose(fid); ok = JXLdataToFloat(filedata.data(),fsize,&pixels,&ww,&hh); // decode to float vector if (! ok) goto errx; // RGBA values 0 - 1.0 for (ii = 0; ii < ww * hh * 4; ii += 4) { // fix out of gamut pixels if (pixels[ii] < 0.0) pixels[ii] = 0.0; if (pixels[ii] > 0.999) pixels[ii] = 0.999; if (pixels[ii+1] < 0.0) pixels[ii+1] = 0.0; if (pixels[ii+1] > 0.999) pixels[ii+1] = 0.999; if (pixels[ii+2] < 0.0) pixels[ii+2] = 0.0; if (pixels[ii+2] > 0.999) pixels[ii+2] = 0.999; } pxb = PXB_make(ww,hh,3); if (! pxb) goto errx; for (py = 0; py < hh; py++) for (px = 0; px < ww; px++) { ii = (py * ww + px) * 4; jj = (py * ww + px) * 3; pxb->pixels[jj] = 255 * pixels[ii]; pxb->pixels[jj+1] = 255 * pixels[ii+1]; pxb->pixels[jj+2] = 255 * pixels[ii+2]; } f_load_bpc = 16; return pxb; errx: zmessageACK(Mwin,"JXL file read failure"); return 0; } // load PXM pixmap from JXL file using libjxl function PXM * JXL_PXM_load(ch *jxlfile) { FILE *fid; STATB statB; PXM *pxm; uint ii; size_t fsize; size_t ww, hh, err, ok; std::vector filedata; std::vector pixels; err = stat(jxlfile,&statB); // get jxl file size if (err) goto errx; fsize = statB.st_size; filedata.resize(fsize); // allocate buffer fid = fopen(jxlfile,"r"); // read file if (! fid) goto errx; fsize = fread(filedata.data(),1,fsize,fid); fclose(fid); ok = JXLdataToFloat(filedata.data(),fsize,&pixels,&ww,&hh); // decode to float vector if (! ok) goto errx; // RGBA values 0 - 1.0 for (ii = 0; ii < ww * hh * 4; ii += 4) { // fix out of gamut pixels if (pixels[ii] < 0.0) pixels[ii] = 0.0; if (pixels[ii] > 0.999) pixels[ii] = 0.999; if (pixels[ii+1] < 0.0) pixels[ii+1] = 0.0; if (pixels[ii+1] > 0.999) pixels[ii+1] = 0.999; if (pixels[ii+2] < 0.0) pixels[ii+2] = 0.0; if (pixels[ii+2] > 0.999) pixels[ii+2] = 0.999; } pxm = PXM_make(ww,hh,4); if (! pxm) return 0; // too big 26.3 for (ii = 0; ii < ww * hh * 4; ii += 4) { pxm->pixels[ii] = 255.0 * pixels[ii]; // RGB pxm->pixels[ii+1] = 255.0 * pixels[ii+1]; pxm->pixels[ii+2] = 255.0 * pixels[ii+2]; pxm->pixels[ii+3] = 255.0 * pixels[ii+3]; // alpha } PXM_audit(pxm); f_load_bpc = 16; return pxm; errx: zmessageACK(Mwin,"JXL file read failure"); return 0; } // write PXB pixmap to JXL file using libjxl function // (this function is currently not used) int PXB_JXL_save(PXB *pxb, ch *jxlfile) { uint ii; uint ww, hh, nc; FILE *fid; std::vector inpixels; // image pixels, 0-255 std::vector outdata; // compressed pixels ww = pxb->ww; hh = pxb->hh; nc = pxb->nc; inpixels.resize(ww * hh * nc); // RGB or RGBA for (ii = 0; ii < ww * hh * nc; ii++) { // convert pixel range to 0.0 - 0.999 inpixels[ii] = pxb->pixels[ii] / 257; if (inpixels[ii] > 255) inpixels[ii] = 255; } ii = FloatToJXLdata(inpixels,ww,hh,nc,&outdata); // compress if (! ii) goto errx; fid = fopen(jxlfile,"w"); // write to output file if (! fid) goto errx; ii = fwrite(outdata.data(),1,outdata.size(),fid); fclose(fid); if (! ii) goto errx; return 0; errx: zmessageACK(Mwin,"JXL file save failure"); return 1; } // write PXM pixmap to JXL file using libjxl function int PXM_JXL_save(PXM *pxm, ch *jxlfile) { uint ii; uint ww, hh, nc; FILE *fid; std::vector inpixels; // image pixels, 0-255 std::vector outdata; // compressed pixels ww = pxm->ww; hh = pxm->hh; nc = pxm->nc; if (nc == 3) PXM_addalpha(pxm); // add alpha channel nc = 4; inpixels.resize(ww * hh * nc); // RGB or RGBA for (ii = 0; ii < ww * hh * nc; ii++) { // convert pixel range to 0.0 - 0.999 inpixels[ii] = pxm->pixels[ii] / 257; if (inpixels[ii] > 255) inpixels[ii] = 255; } ii = FloatToJXLdata(inpixels,ww,hh,nc,&outdata); // compress if (! ii) goto errx; fid = fopen(jxlfile,"w"); // write to output file if (! fid) goto errx; ii = fwrite(outdata.data(),1,outdata.size(),fid); fclose(fid); if (! ii) goto errx; return 0; errx: zmessageACK(Mwin,"JXL file save failure"); return 1; } /************************************************************************************** HEIC file read functions (write functions are not implemented) ***************************************************************************************/ // Load PXB pixmap from HEIC file using HEIC library (heif-convert). // Also works for AVIF files (.avif) // Crutch: convert .heic file to .jpg and load .jpg file. PXB * HEIC_PXB_load(ch *file, int size) { ch *jpegfile = 0, *jpegfix = 0; ch *pp; ch *f1, *f2; PXB *pxb; static int ftf = 1; ch *installmess = TX(".heic/.avif files not supported (install heif_convert)"); if (! Fheif) { if (ftf) { ftf = 0; zmessageACK(Mwin,installmess); } return 0; } if (! regfile(file)) return 0; // no print error jpegfile = zstrdup(file,"HEIC_PXB_load",8); // file.heic >> file.jpg pp = strrchr(jpegfile,'.'); if (! pp) goto errret; strcpy(pp,".jpg"); f1 = zescape_quotes(file); f2 = zescape_quotes(jpegfile); zshell(0,"heif-convert -q %d \"%s\" \"%s\" >/dev/null 2>&1", // convert to .jpg jpeg_def_quality,f1,f2); zfree(f1); zfree(f2); if (! regfile(jpegfile)) { jpegfix = zstrdup(jpegfile,"HEIC_PXB_load",8); // failed, may have multiple output files pp = strrchr(jpegfix,'.'); // file-1.jpg, file-2.jpg, etc. strcpy(pp,"-1.jpg"); if (! regfile(jpegfix)) goto errret; rename(jpegfix,jpegfile); // if file-1.jpg, rename to file.jpg zfree(jpegfix); // (file-2.jpg etc. remain) } pxb = JPG_PXB_load(jpegfile,size); // make PXB from jpeg file remove(jpegfile); zfree(jpegfile); f_load_bpc = 8; return pxb; errret: printf("*** HEIC_PXB_load() file error: %s \n",file); if (jpegfile) remove(jpegfile); if (jpegfile) zfree(jpegfile); if (jpegfix) zfree(jpegfix); return 0; } // Load PXM pixmap from HEIC file using HEIC library (heif-convert). // Also works for AVIF files (.avif) // Crutch: convert .heic file to .jpg and load .jpg file. PXM * HEIC_PXM_load(ch *file) { ch *jpegfile = 0, *jpegfix = 0; ch *pp; ch *f1, *f2; PXM *pxm; static int ftf = 1; ch *installmess = TX(".heic/.avif files not supported (install heif_convert)"); if (! Fheif) { if (ftf) { ftf = 0; zmessageACK(Mwin,installmess); } return 0; } if (! regfile(file)) return 0; // no print error jpegfile = zstrdup(file,"HEIC_PXM_load",8); pp = strrchr(jpegfile,'.'); if (! pp) goto errret; strcpy(pp,".jpg"); f1 = zescape_quotes(file); f2 = zescape_quotes(jpegfile); zshell(0,"heif-convert -q %d \"%s\" \"%s\" >/dev/null 2>&1", // convert to .jpg jpeg_def_quality,f1,f2); zfree(f1); zfree(f2); if (! regfile(jpegfile)) { jpegfix = zstrdup(jpegfile,"HEIC_PXM_load",8); pp = strrchr(jpegfix,'.'); strcpy(pp,"-1.jpg"); if (! regfile(jpegfix)) goto errret; rename(jpegfix,jpegfile); zfree(jpegfix); } pxm = JPG_PXM_load(jpegfile); remove(jpegfile); zfree(jpegfile); f_load_bpc = 8; return pxm; errret: printf("*** HEIC_PXM_load() file error: %s \n",file); if (jpegfile) remove(jpegfile); if (jpegfile) zfree(jpegfile); if (jpegfix) zfree(jpegfix); return 0; } int PXB_HEIC_save(PXB *pxb, ch *file) { zmessageACK(Mwin,TX("save to .heic/.avif file not supported")); return 0; } int PXM_HEIC_save(PXM *pxm, ch *file) { zmessageACK(Mwin,TX("save to .heic/.avif file not supported")); return 0; } /************************************************************************************** JP2 file read functions (write functions are not implemented) ***************************************************************************************/ // Load PXB pixmap from JP2 file using jpeg2000 utility (opj_decompress). // Crutch: convert .jp2 file to .tif and load .tif file. PXB * JP2_PXB_load(ch *file) { int err; ch *tiffile = 0; ch *pp; ch *f1, *f2; PXB *pxb; static int ftf = 1; ch *installmess = TX(".jp2 files not supported (install opj_decompress)"); if (! Fjp2) { if (ftf) { ftf = 0; zmessageACK(Mwin,installmess); } return 0; } if (! regfile(file)) return 0; // no print error tiffile = zstrdup(file,"JP2_PXB_load",8); // file.jp2 >> file.tif pp = strrchr(tiffile,'.'); if (! pp) goto errret; strcpy(pp,".tif"); f1 = zescape_quotes(file); f2 = zescape_quotes(tiffile); err = zshell(0,"opj_decompress -i \"%s\" -o \"%s\" >/dev/null 2>&1",f1,f2); zfree(f1); zfree(f2); if (err) goto errret; if (! regfile(tiffile)) goto errret; pxb = TIFF_PXB_load(tiffile); // make PXB from tif file remove(tiffile); zfree(tiffile); f_load_bpc = 8; return pxb; errret: printf("*** JP2_PXB_load() file error: %s \n",file); if (tiffile) remove(tiffile); if (tiffile) zfree(tiffile); return 0; } // Load PXM pixmap from JP2 file using jpeg2000 utility (opj_decompress). // Crutch: convert .jp2 file to .tif and load .tif file. // f_load_bpc = 8 or 16, depending on .jp2 file PXM * JP2_PXM_load(ch *file) { int err; ch *tiffile = 0; ch *f1, *f2; ch *pp; PXM *pxm = 0; static int ftf = 1; ch *installmess = TX(".jp2 files not supported (install opj_decompress)"); if (! Fjp2) { if (ftf) { ftf = 0; zmessageACK(Mwin,installmess); } return 0; } if (! regfile(file)) return 0; // no print error tiffile = zstrdup(file,"JP2_PXM_load",8); // file.jp2 >> file.tif pp = strrchr(tiffile,'.'); if (! pp) goto errret; strcpy(pp,".tif"); f1 = zescape_quotes(file); f2 = zescape_quotes(tiffile); err = zshell(0,"opj_decompress -i \"%s\" -o \"%s\" >/dev/null 2>&1",f1,f2); zfree(f1); zfree(f2); if (err) goto errret; if (! regfile(tiffile)) goto errret; pxm = TIFF_PXM_load(tiffile); // make PXM from tif file remove(tiffile); zfree(tiffile); return pxm; errret: printf("*** JP2_PXM_load() file error: %s \n",file); if (tiffile) remove(tiffile); if (tiffile) zfree(tiffile); return 0; } int PXB_JP2_save(PXB *pxb, ch *file) { zmessageACK(Mwin,TX("save to .jp2 file not supported")); return 0; } int PXM_JP2_save(PXM *pxm, ch *file) { zmessageACK(Mwin,TX("save to .jp2 file not supported")); return 0; } /************************************************************************************** WEBP file read functions (write functions are not implemented) ***************************************************************************************/ // Load PXB pixmap from WEBP file using dwebp utility (webp package). // Crutch: convert .webp file to .tif and load .tif file. PXB * WEBP_PXB_load(ch *file) { int err; ch *tiffile = 0; ch *f1, *f2; ch *pp; PXB *pxb; static int ftf = 1; ch *installmess = TX(".webp files not supported (install dwebp)"); if (! Fwebp) { if (ftf) { ftf = 0; zmessageACK(Mwin,installmess); } return 0; } if (! regfile(file)) return 0; // no print error tiffile = zstrdup(file,"WEBP_PXB_load",8); // file.webp >> file.tif pp = strrchr(tiffile,'.'); if (! pp) goto errret; strcpy(pp,".tif"); f1 = zescape_quotes(file); f2 = zescape_quotes(tiffile); err = zshell(0,"dwebp -quiet -tiff \"%s\" -o \"%s\" ",file,tiffile); zfree(f1); zfree(f2); if (err) goto errret; if (! regfile(tiffile)) goto errret; pxb = TIFF_PXB_load(tiffile); // make PXB from tif file remove(tiffile); zfree(tiffile); f_load_bpc = 8; return pxb; errret: printf("*** WEBP_PXB_load() file error: %s \n",file); if (tiffile) remove(tiffile); if (tiffile) zfree(tiffile); return 0; } // Load PXM pixmap from WEBP file using jpeg2000 utility (opj_decompress). // Crutch: convert .webp file to .tif and load .tif file. // f_load_bpc = 8 or 16, depending on .webp file PXM * WEBP_PXM_load(ch *file) { int err; ch *tiffile = 0; ch *f1, *f2; ch *pp; PXM *pxm = 0; static int ftf = 1; ch *installmess = TX(".webp files not supported (install dwebp)"); if (! Fwebp) { if (ftf) { ftf = 0; zmessageACK(Mwin,installmess); } return 0; } if (! regfile(file)) return 0; // no print error tiffile = zstrdup(file,"WEBP_PXM_load",8); // file.webp >> file.tif pp = strrchr(tiffile,'.'); if (! pp) goto errret; strcpy(pp,".tif"); f1 = zescape_quotes(file); f2 = zescape_quotes(tiffile); err = zshell(0,"dwebp -quiet -tiff \"%s\" -o \"%s\" ",file,tiffile); zfree(f1); zfree(f2); if (err) goto errret; if (! regfile(tiffile)) goto errret; pxm = TIFF_PXM_load(tiffile); // make PXM from tif file remove(tiffile); zfree(tiffile); return pxm; errret: printf("*** WEBP_PXM_load() file error: %s \n",file); if (tiffile) remove(tiffile); if (tiffile) zfree(tiffile); return 0; } int PXB_WEBP_save(PXB *pxb, ch *file) { zmessageACK(Mwin,TX("save to .webp file not supported")); return 0; } int PXM_WEBP_save(PXM *pxm, ch *file) { zmessageACK(Mwin,TX("save to .webp file not supported")); return 0; } /************************************************************************************** Other file types read and write functions (via gdk_pixbuf library) ***************************************************************************************/ // Load PXB pixmap from other file types using the pixbuf library. PXB * ANY_PXB_load(ch *file) { GError *gerror = 0; PXB *pxb; PIXBUF *pixbuf; int ww, hh, px, py, nc1, nc2, ac, rs; uint8 *pixels1, *pix1; uint8 *pixels2, *pix2; if (! regfile(file)) goto errret; // no print error pixbuf = gdk_pixbuf_new_from_file(file,&gerror); if (! pixbuf) goto errret; ww = gdk_pixbuf_get_width(pixbuf); hh = gdk_pixbuf_get_height(pixbuf); nc1 = gdk_pixbuf_get_n_channels(pixbuf); ac = gdk_pixbuf_get_has_alpha(pixbuf); rs = gdk_pixbuf_get_rowstride(pixbuf); pixels1 = gdk_pixbuf_get_pixels(pixbuf); nc2 = 3 + ac; pxb = PXB_make(ww,hh,nc2); if (! pxb) goto errret; // 26.3 pixels2 = pxb->pixels; for (py = 0; py < hh; py++) { pix1 = pixels1 + rs * py; pix2 = pixels2 + py * pxb->rs; if (nc1 >= 3) { for (px = 0; px < ww; px++) { memcpy(pix2,pix1,3); if (nc1 == 4) pix2[3] = pix1[3]; // uint8 > unit8 pix1 += nc1; pix2 += nc2; } } else { for (px = 0; px < ww; px++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; if (nc1 == 2) pix2[3] = pix1[1]; pix1 += nc1; pix2 += nc2; } } } g_object_unref(pixbuf); f_load_bpc = 8; return pxb; errret: printf("*** ANY_PXB_load() pixbuf file read error: %s \n",file); if (gerror) printf("%s \n",gerror->message); return 0; } // Load PXM pixmap from other file types using the pixbuf library. // bpc = 8. PXM * ANY_PXM_load(ch *file) { GError *gerror = 0; PXM *pxm; PIXBUF *pixbuf; int ww, hh, px, py, nc1, nc2, ac, rs; uint8 *pixels1, *pix1; float *pixels2, *pix2; if (! regfile(file)) goto errret; // no print error pixbuf = gdk_pixbuf_new_from_file(file,&gerror); if (! pixbuf) goto errret; ww = gdk_pixbuf_get_width(pixbuf); hh = gdk_pixbuf_get_height(pixbuf); nc1 = gdk_pixbuf_get_n_channels(pixbuf); ac = gdk_pixbuf_get_has_alpha(pixbuf); rs = gdk_pixbuf_get_rowstride(pixbuf); pixels1 = gdk_pixbuf_get_pixels(pixbuf); nc2 = 3 + ac; pxm = PXM_make(ww,hh,nc2); if (! pxm) return 0; // too big 26.3 pixels2 = pxm->pixels; for (py = 0; py < hh; py++) { pix1 = pixels1 + rs * py; pix2 = pixels2 + py * ww * nc2; if (nc1 >= 3) { for (px = 0; px < ww; px++) { pix2[0] = pix1[0]; // uint8 > float pix2[1] = pix1[1]; pix2[2] = pix1[2]; if (nc1 == 4) pix2[3] = pix1[3]; pix1 += nc1; pix2 += nc2; } } else { for (px = 0; px < ww; px++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; if (ac) pix2[3] = pix1[1]; pix1 += nc1; pix2 += nc2; } } } g_object_unref(pixbuf); PXM_audit(pxm); // audit/repair f_load_bpc = 8; return pxm; errret: printf("*** ANY_PXM_load() pixbuf file read error: %s \n",file); if (gerror) printf("%s \n",gerror->message); return 0; } /************************************************************************************** RAW file read functions. There are no write functions. ***************************************************************************************/ int raw_match_embed_color(ch *rawfile, PXM *pxm); // RAW file to PXB pixmap (pixbuf, 8-bit color) PXB * RAW_PXB_load(ch *rawfile, int matchthumb) { PXB *pxb = 0; PXM *pxm = 0; pxm = RAW_PXM_load(rawfile,matchthumb); if (! pxm) return 0; pxb = PXM_PXB_copy(pxm); PXM_free(pxm); return pxb; } // RAW file to PXM pixmap (float color) // RAW loader command format: command ... # comment PXM * RAW_PXM_load(ch *rawfile, int matchthumb) // revised 25.0 { int err, cc; PXM *pxm = 0; ch *pp, *RLcommand, *command; ch *rawfileE, *rawfileQ, *tiffile, *tiffileE, *tiffileQ; ch *tagname = "bitspersample", *tagval[1]; Fbusy(+1); cc = strlen(raw_loader_command); // copy raw loader command RLcommand = (ch *) zmalloc(cc+1,"RAW_PXM_load"); strncpy0(RLcommand,raw_loader_command,cc+1); pp = strrchr(RLcommand,'#'); // if trailing comment, remove it if (pp) *pp = 0; rawfileE = zescape_quotes(rawfile); // escape quotes in rawfile name cc = strlen(rawfileE) + 8; rawfileQ = (ch *) zmalloc(cc,"RAW_PXM_load"); // enclose rawfile name in quotes strncatv(rawfileQ,cc," \"",rawfileE,"\" ",null); tiffile = zstrdup(rawfile,"RAW_PXM_load",8); // raw file, /.../rawfile.xxx pp = strrchr(tiffile,'.'); if (pp) strcpy(pp,".tiff"); // tiff file, /.../rawfile.tiff else strcat(tiffile,".tiff"); tiffileE = zescape_quotes(tiffile); // escape quotes in tiffile name cc = strlen(tiffileE) + 8; tiffileQ = (ch *) zmalloc(cc,"RAW_PXM_load"); // enclose tiffile name in quotes strncatv(tiffileQ,cc," \"",tiffileE,"\" ",null); cc = strlen(RLcommand) + 2 * strlen(rawfileQ) + 8; // prepare command buffer, big enough command = (ch *) zmalloc(cc,"RAW_PXM_load"); if (! strstr(RLcommand,"")) // build: command ... "rawfile" "tiffile" repl_1str(RLcommand,command,cc,"",rawfileQ); else repl_Nstrs(RLcommand,command,cc,"",rawfileQ,"",tiffileQ,null); err = zshell("log",command,0); // convert RAW file to output file if (err) { // conversion failed zmessageACK(Mwin,TX("RAW conversion failed: %s %s"),rawfile,strerror(errno)); goto exxit; } if (! regfile(tiffile)) { // look for output.tiff pp = strstr(tiffile,".tiff"); if (pp) *(pp+4) = 0; // if not there, try output.tif } pxm = TIFF_PXM_load(tiffile); // load output file if (! pxm) zmessageACK(Mwin,TX("cannot find output file")); // load failed if (matchthumb) raw_match_embed_color(rawfile,pxm); // match colors to embedded image colors err = meta_get(rawfile,(ch **) &tagname,tagval,1); // 26.0 if (! err && *tagval) { f_load_bpc = atoi(*tagval); zfree(*tagval); } exxit: remove(tiffile); zfree(rawfileE); zfree(rawfileQ); zfree(tiffile); zfree(tiffileE); zfree(tiffileQ); zfree(RLcommand); zfree(command); Fbusy(-1); return pxm; } // RAW file to PXB pixmap (pixbuf, 8-bit color, dcraw) // use 1/2 size output file for faster thumbnail creation PXB * RAW_PXB_load_dcraw_half(ch *rawfile) { int err; ch *tiffile, *pp; PXB *pxb; ch *command = "dcraw -w -T -h \"%s\" "; // -h (half size) Fbusy(+1); pp = zescape_quotes(rawfile); // make tiff file from raw file err = zshell(0,command,pp); zfree(pp); if (err) { printf("*** RAW_PXB_load_dcraw_half() file error: %s %s \n",rawfile,strerror(errno)); Fbusy(-1); return 0; } tiffile = zstrdup(rawfile,"RAW_PXB_load",8); // tiff file name = rawfile.tiff pp = strrchr(tiffile,'/'); if (! pp) pp = tiffile; pp = strrchr(pp,'.'); if (! pp) pp = tiffile + strlen(tiffile); strcpy(pp,".tiff"); if (! regfile(tiffile)) strcpy(pp,".tif"); pxb = TIFF_PXB_load(tiffile); // make raw PXB from tiff file remove(tiffile); zfree(tiffile); Fbusy(-1); return pxb; } // Create 512x512 PXB for thumbnail from the embedded image in a RAW file PXB * RAW_thumb_pxb(ch *rawfile) { ch *thumbfile = 0, *pp; int err, ww, hh, angle = 0; PXB *Tpxb = 0, *Rpxb = 0; ch *metatag[1] = { meta_orientation_tag }; ch *metadata[1] = { 0 }, orientation = 0; pp = zescape_quotes(rawfile); err = zshell("noerr","dcraw -e \"%s\" ",pp); // get .jpg or .ppm embedded image zfree(pp); if (err) goto getraw; // none there thumbfile = zstrdup(rawfile,"RAW_thumb_pxb",12); // rawfile.thumb.jpg (or .ppm) pp = strrchr(thumbfile,'/'); pp = strrchr(pp,'.'); if (! pp) pp = thumbfile + strlen(thumbfile); strcpy(pp,".thumb.jpg"); if (regfile(thumbfile)) // make thumb PXB Tpxb = JPG_PXB_load(thumbfile); else { strcpy(pp+6,".ppm"); Tpxb = ANY_PXB_load(thumbfile); } if (! Tpxb) { // embedded image not usable remove(thumbfile); zfree(thumbfile); goto getraw; } meta_get(thumbfile,metatag,metadata,1); // get thumb image rotation status if (metadata[0]) orientation = *metadata[0]; else { // no data meta_get(rawfile,metatag,metadata,1); // get raw image rotation status if (metadata[0]) orientation = *metadata[0]; } remove(thumbfile); zfree(thumbfile); ww = Tpxb->ww; hh = Tpxb->hh; if (ww < 512 && hh < 512) { // embedded image too small PXB_free(Tpxb); goto getraw; } Rpxb = PXB_rescale(Tpxb,512); // rescale to 512 pixels PXB_free(Tpxb); Tpxb = Rpxb; if (orientation) { if (orientation == '6') angle = +90; // rotate clockwise 90 deg. else if (orientation == '8') angle = -90; // counterclockwise 90 deg. else if (orientation == '3') angle = 180; // 180 deg. if (angle) { Rpxb = PXB_rotate(Tpxb,angle); // rotate pixbuf to upright PXB_free(Tpxb); Tpxb = Rpxb; } } return Tpxb; getraw: Rpxb = RAW_PXB_load_dcraw_half(rawfile); // extract 1/2 size tiff file if (! Rpxb) return 0; Tpxb = PXB_rescale(Rpxb,512); // rescale to 512 PXB_free(Rpxb); return Tpxb; } // Use the RAW file embedded thumbnail as a template for RAW image color balance. // Input PXM RGB values are revised to match thumbnail histogram. // returns: 0 = OK, +N = error (PXM not changed). int raw_match_embed_color(ch *rawfile, PXM *Rpxm) { PXB *Tpxb; ch *thumbfile, *pp; int ii, jj, kk, err, rgb, step; int Tpix, Rpix, Tpix3[3], Rpix3[3]; int Tdist[3][1024], Rdist[3][1024], Rval[3][1024]; int Rsum, Tsum, Rbin, Tbin; uint8 *Tpixel; float *Rpixel; pp = zescape_quotes(rawfile); // get embedded thumbnail file err = zshell(0,"dcraw -e \"%s\" ",pp); // from raw file zfree(pp); if (err) return 1; thumbfile = zstrdup(rawfile,"raw_match_thumb",12); // rawfile.thumb.jpg pp = strrchr(thumbfile,'/'); pp = strrchr(pp,'.'); if (! pp) pp = thumbfile + strlen(thumbfile); strcpy(pp,".thumb.jpg"); if (regfile(thumbfile)) Tpxb = JPG_PXB_load(thumbfile); // make thumb PXB else { strcpy(pp+6,".ppm"); Tpxb = ANY_PXB_load(thumbfile); } remove(thumbfile); zfree(thumbfile); if (! Tpxb) return 2; if (Tpxb->nc < 3) return 3; // thumbnail not RGB Tpix = Tpxb->ww * Tpxb->hh; // total thumb PXB pixels Rpix = Rpxm->ww * Rpxm->hh; // total raw PXM pixels memset(Tdist,0,3*1024*sizeof(int)); // clear thumb distribution for (ii = 0; ii < Tpix; ii++) // loop thumb pixels for (rgb = 0; rgb < 3; rgb++) { Tpixel = Tpxb->pixels + ii * 3; // build thumb brightness distribution jj = 4 * Tpixel[rgb]; // for each RGB channel Tdist[rgb][jj]++; Tdist[rgb][jj+1] = Tdist[rgb][jj+2] = Tdist[rgb][jj+3] = Tdist[rgb][jj]; // duplicate 4x for 1024 bins } for (ii = 0; ii < 255; ii++) // ramp each set of 4 duplicates for (rgb = 0; rgb < 3; rgb++) // 10 10 10 10 20 20 20 20 40 ... { // >> 10 12 15 17 20 25 30 35 40 ... jj = 4 * ii; step = Tdist[rgb][jj+4] - Tdist[rgb][jj]; for (kk = 1; kk < 4; kk++) Tdist[rgb][jj+kk] += kk * step / 4; } memset(Rdist,0,3*1024*sizeof(int)); // clear raw distribution for (ii = 0; ii < Rpix; ii++) // loop raw pixels for (rgb = 0; rgb < 3; rgb++) { Rpixel = Rpxm->pixels + ii * 3; // build raw brightness distribution jj = 4 * Rpixel[rgb]; // 0.0 - 255.99 >> bins 0 - 1023 if (jj > 1023) jj = 1023; Rdist[rgb][jj]++; } for (rgb = 0; rgb < 3; rgb++) Tpix3[rgb] = Rpix3[rgb] = 0; for (ii = 0; ii < 1024; ii++) // get distribution totals for (rgb = 0; rgb < 3; rgb++) { Tpix3[rgb] += Tdist[rgb][ii]; Rpix3[rgb] += Rdist[rgb][ii]; } for (ii = 0; ii < 1024; ii++) // make Tdist totals = Rdist totals for (rgb = 0; rgb < 3; rgb++) Tdist[rgb][ii] *= 1.0 * Rpix3[rgb] / Tpix3[rgb]; for (rgb = 0; rgb < 3; rgb++) // low to high { for (Rsum = 0, Rbin = 0; Rbin < 1024; Rbin++) { Rsum += Rdist[rgb][Rbin]; for (Tsum = 0, Tbin = 0; Tbin < 1024; Tbin++) { Tsum += Tdist[rgb][Tbin]; if (Tsum > Rsum) break; } if (Tbin > 1020) Tbin = 1020; // bugfix 25.4 Rval[rgb][Rbin] = Tbin; } } for (rgb = 0; rgb < 3; rgb++) // high to low { for (Rsum = 0, Rbin = 1023; Rbin >= 0; Rbin--) { Rsum += Rdist[rgb][Rbin]; for (Tsum = 0, Tbin = 1023; Tbin >= 0; Tbin--) { Tsum += Tdist[rgb][Tbin]; if (Tsum > Rsum) break; } if (Tbin < 0) Tbin = 0; Rval[rgb][Rbin] = 0.5 * (Rval[rgb][Rbin] + Tbin); // average two distributions } } for (ii = 0; ii < Rpix; ii++) // loop raw pixels { Rpixel = Rpxm->pixels + ii * 3; for (rgb = 0; rgb < 3; rgb++) // loop RGB color { Rbin = 4 * Rpixel[rgb]; // old brightness Rpixel[rgb] = 0.25 * Rval[rgb][Rbin]; // set new brightness } } return 0; } /************************************************************************************** pixel format conversion functions input pixel buffer: uint8/uint16/float with 1/2/3/4 channels output pixel buffer: uint8/uint16/float with 3/4 channels row stride is assumed to have no padding at row ends and no shortening of the last row (not compatible with GDK pixbufs) ***************************************************************************************/ // copy from uint8 buffer to uint8 buffer void pixelvert(uint8 *buff1, uint8 *buff2, int ww, int hh, int nc1, int nc2) { uint8 *pix1; uint8 *pix2; uint rs1 = ww * nc1, rs2 = ww * nc2; int row, col; float F; Fbusy(+1); for (row = 0; row < hh; row++) { pix1 = buff1 + row * rs1; pix2 = buff2 + row * rs2; if (nc1 == 1 && nc2 == 3) { for (col = 0; col < ww; col++) { memset(pix2,pix1[0],3); pix1 += nc1; pix2 += nc2; } } if (nc1 == 1 && nc2 == 4) { for (col = 0; col < ww; col++) { memset(pix2,pix1[0],3); pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 3) { for (col = 0; col < ww; col++) { memset(pix2,pix1[0],3); pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 4) { for (col = 0; col < ww; col++) { memset(pix2,pix1[0],3); pix2[3] = pix1[1]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 3) { for (col = 0; col < ww; col++) { memcpy(pix2,pix1,3); pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 4) { for (col = 0; col < ww; col++) { memcpy(pix2,pix1,3); pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 3) { for (col = 0; col < ww; col++) { if (pix1[3] < 255) { // apply alpha channel F = pix1[3] / 255.0; pix2[0] = F * pix1[0]; pix2[1] = F * pix1[1]; pix2[2] = F * pix1[2]; } else memcpy(pix2,pix1,3); pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 4) { for (col = 0; col < ww; col++) { memcpy(pix2,pix1,4); pix1 += nc1; pix2 += nc2; } } } Fbusy(-1); return; } // copy from uint8 buffer to uint16 buffer void pixelvert(uint8 *buff1, uint16 *buff2, int ww, int hh, int nc1, int nc2) { uint8 *pix1; uint16 *pix2; int rs1 = ww * nc1, rs2 = ww * nc2; int row, col; float F; Fbusy(+1); for (row = 0; row < hh; row++) { pix1 = buff1 + row * rs1; pix2 = buff2 + row * rs2; if (nc1 == 1 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] * 256; pix1 += nc1; pix2 += nc2; } } if (nc1 == 1 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] * 256; pix2[3] = 255 * 256; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] * 256; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] * 256; pix2[3] = pix1[1] * 256; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0] * 256; pix2[1] = pix1[1] * 256; pix2[2] = pix1[2] * 256; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0] * 256; pix2[1] = pix1[1] * 256; pix2[2] = pix1[2] * 256; pix2[3] = 255 * 256; pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 3) { for (col = 0; col < ww; col++) { if (pix1[3] < 255) { // apply alpha channel F = 0.003906 * pix1[3] * 256; pix2[0] = pix1[0] * F; pix2[1] = pix1[1] * F; pix2[2] = pix1[2] * F; } else { pix2[0] = pix1[0] * 256; pix2[1] = pix1[1] * 256; pix2[2] = pix1[2] * 256; } pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0] * 256; pix2[1] = pix1[1] * 256; pix2[2] = pix1[2] * 256; pix2[3] = pix1[3] * 256; pix1 += nc1; pix2 += nc2; } } } Fbusy(-1); return; } // copy from uint8 buffer to float buffer void pixelvert(uint8 *buff1, float *buff2, int ww, int hh, int nc1, int nc2) { uint8 *pix1; float *pix2; int rs1 = ww * nc1, rs2 = ww * nc2; int row, col; float F; Fbusy(+1); for (row = 0; row < hh; row++) { pix1 = buff1 + row * rs1; pix2 = buff2 + row * rs2; if (nc1 == 1 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 1 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix2[3] = pix1[1]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0]; pix2[1] = pix1[1]; pix2[2] = pix1[2]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0]; pix2[1] = pix1[1]; pix2[2] = pix1[2]; pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 3) { for (col = 0; col < ww; col++) { if (pix1[3] < 255) { // apply alpha channel F = pix1[3] / 255.0; pix2[0] = F * pix1[0]; pix2[1] = F * pix1[1]; pix2[2] = F * pix1[2]; } else { pix2[0] = pix1[0]; pix2[1] = pix1[1]; pix2[2] = pix1[2]; } pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0]; pix2[1] = pix1[1]; pix2[2] = pix1[2]; pix2[3] = pix1[3]; pix1 += nc1; pix2 += nc2; } } } Fbusy(-1); return; } // copy from uint16 buffer to uint8 buffer void pixelvert(uint16 *buff1, uint8 *buff2, int ww, int hh, int nc1, int nc2) { uint16 *pix1; uint8 *pix2; int rs1 = ww * nc1, rs2 = ww * nc2; int row, col; float F; Fbusy(+1); for (row = 0; row < hh; row++) { pix1 = buff1 + row * rs1; pix2 = buff2 + row * rs2; if (nc1 == 1 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] >> 8; pix1 += nc1; pix2 += nc2; } } if (nc1 == 1 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] >> 8; pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] >> 8; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] >> 8; pix2[3] = pix1[1] >> 8; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0] >> 8; pix2[1] = pix1[1] >> 8; pix2[2] = pix1[2] >> 8; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0] >> 8; pix2[1] = pix1[1] >> 8; pix2[2] = pix1[2] >> 8; pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 3) { for (col = 0; col < ww; col++) { if (pix1[3] < 65280) { // apply alpha channel F = pix1[3] / 65280.0; pix2[0] = (pix1[0] >> 8) * F; pix2[1] = (pix1[1] >> 8) * F; pix2[2] = (pix1[2] >> 8) * F; } else { pix2[0] = pix1[0] >> 8; pix2[1] = pix1[1] >> 8; pix2[2] = pix1[2] >> 8; } pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0] >> 8; pix2[1] = pix1[1] >> 8; pix2[2] = pix1[2] >> 8; pix2[3] = pix1[3] >> 8; pix1 += nc1; pix2 += nc2; } } } Fbusy(-1); return; } // copy from uint16 buffer to uint16 buffer void pixelvert(uint16 *buff1, uint16 *buff2, int ww, int hh, int nc1, int nc2) { uint16 *pix1; uint16 *pix2; int rs1 = ww * nc1, rs2 = ww * nc2; int row, col; float F; Fbusy(+1); for (row = 0; row < hh; row++) { pix1 = buff1 + row * rs1; pix2 = buff2 + row * rs2; if (nc1 == 1 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 1 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix2[3] = pix1[1]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 3) { for (col = 0; col < ww; col++) { memcpy(pix2,pix1,6); pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 4) { for (col = 0; col < ww; col++) { memcpy(pix2,pix1,6); pix2[3] = 255 * 256; pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 3) { for (col = 0; col < ww; col++) { if (pix1[3] < 65280) { // apply alpha channel F = pix1[3] / 65280.0; pix2[0] = F * pix1[0]; pix2[1] = F * pix1[1]; pix2[2] = F * pix1[2]; } else memcpy(pix2,pix1,6); pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 4) { for (col = 0; col < ww; col++) { memcpy(pix2,pix1,8); pix1 += nc1; pix2 += nc2; } } } Fbusy(-1); return; } // copy from uint16 buffer to float buffer void pixelvert(uint16 *buff1, float *buff2, int ww, int hh, int nc1, int nc2) { uint16 *pix1; float *pix2; int rs1 = ww * nc1, rs2 = ww * nc2; int row, col; float F; Fbusy(+1); for (row = 0; row < hh; row++) { pix1 = buff1 + row * rs1; pix2 = buff2 + row * rs2; if (nc1 == 1 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] / 256.0; pix1 += nc1; pix2 += nc2; } } if (nc1 == 1 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] / 256.0; pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] / 256.0; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] / 256.0; pix2[3] = pix1[1] / 256.0; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0] / 256.0; pix2[1] = pix1[1] / 256.0; pix2[2] = pix1[2] / 256.0; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0] / 256.0; pix2[1] = pix1[1] / 256.0; pix2[2] = pix1[2] / 256.0; pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 3) { for (col = 0; col < ww; col++) { if (pix1[3] < 65280) { // apply alpha channel F = pix1[3] / 65280.0; pix2[0] = pix1[0] * F; pix2[1] = pix1[1] * F; pix2[2] = pix1[2] * F; } else { pix2[0] = pix1[0] / 256.0; pix2[1] = pix1[1] / 256.0; pix2[2] = pix1[2] / 256.0; } pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0] / 256.0; pix2[1] = pix1[1] / 256.0; pix2[2] = pix1[2] / 256.0; pix2[3] = pix1[3] / 256.0; pix1 += nc1; pix2 += nc2; } } } Fbusy(-1); return; } // copy from float buffer to uint8 buffer void pixelvert(float *buff1, uint8 *buff2, int ww, int hh, int nc1, int nc2) { float *pix1; uint8 *pix2; int rs1 = ww * nc1, rs2 = ww * nc2; int row, col; float F; Fbusy(+1); for (row = 0; row < hh; row++) { pix1 = buff1 + row * rs1; pix2 = buff2 + row * rs2; if (nc1 == 1 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 1 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix2[3] = pix1[1]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0]; pix2[1] = pix1[1]; pix2[2] = pix1[2]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0]; pix2[1] = pix1[1]; pix2[2] = pix1[2]; pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 3) { for (col = 0; col < ww; col++) { if (pix1[3] < 255) { // apply alpha channel F = pix1[3] / 255.0; pix2[0] = F * pix1[0]; pix2[1] = F * pix1[1]; pix2[2] = F * pix1[2]; } else { pix2[0] = pix1[0]; pix2[1] = pix1[1]; pix2[2] = pix1[2]; } pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0]; pix2[1] = pix1[1]; pix2[2] = pix1[2]; pix2[3] = pix1[3]; pix1 += nc1; pix2 += nc2; } } } Fbusy(-1); return; } // copy from float buffer to uint16 buffer void pixelvert(float *buff1, uint16 *buff2, int ww, int hh, int nc1, int nc2) { float *pix1; uint16 *pix2; int rs1 = ww * nc1, rs2 = ww * nc2; int row, col; float F; Fbusy(+1); for (row = 0; row < hh; row++) { pix1 = buff1 + row * rs1; pix2 = buff2 + row * rs2; if (nc1 == 1 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] * 255.9; pix1 += nc1; pix2 += nc2; } } if (nc1 == 1 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] * 255.9; pix2[3] = 255 * 256; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] * 255.9; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0] * 255.9; pix2[3] = pix1[1] * 255.9; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0] * 255.9; pix2[1] = pix1[1] * 255.9; pix2[2] = pix1[2] * 255.9; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0] * 255.9; pix2[1] = pix1[1] * 255.9; pix2[2] = pix1[2] * 255.9; pix2[3] = 255 * 256; pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 3) { for (col = 0; col < ww; col++) { if (pix1[3] < 255) { // apply alpha channel F = pix1[3] / 255.0 * 255.9; pix2[0] = F * pix1[0]; pix2[1] = F * pix1[1]; pix2[2] = F * pix1[2]; } else { pix2[0] = pix1[0] * 255.9; pix2[1] = pix1[1] * 255.9; pix2[2] = pix1[2] * 255.9; } pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix1[0] * 255.9; pix2[1] = pix1[1] * 255.9; pix2[2] = pix1[2] * 255.9; pix2[3] = pix1[3] * 255.9; pix1 += nc1; pix2 += nc2; } } } Fbusy(-1); return; } // copy from float buffer to float buffer void pixelvert(float *buff1, float *buff2, int ww, int hh, int nc1, int nc2) { float *pix1; float *pix2; int rs1 = ww * nc1, rs2 = ww * nc2; int row, col; float F; Fbusy(+1); for (row = 0; row < hh; row++) { pix1 = buff1 + row * rs1; pix2 = buff2 + row * rs2; if (nc1 == 1 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 1 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 3) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 2 && nc2 == 4) { for (col = 0; col < ww; col++) { pix2[0] = pix2[1] = pix2[2] = pix1[0]; pix2[3] = pix1[1]; pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 3) { for (col = 0; col < ww; col++) { memcpy(pix2, pix1, 3 * sizeof(float)); pix1 += nc1; pix2 += nc2; } } if (nc1 == 3 && nc2 == 4) { for (col = 0; col < ww; col++) { memcpy(pix2, pix1, 3 * sizeof(float)); pix2[3] = 255; pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 3) { for (col = 0; col < ww; col++) { if (pix1[3] < 255) { // apply alpha channel F = 0.003906 * pix1[3]; pix2[0] = F * pix1[0]; pix2[1] = F * pix1[1]; pix2[2] = F * pix1[2]; } else memcpy(pix2, pix1, 3 * sizeof(float)); pix1 += nc1; pix2 += nc2; } } if (nc1 == 4 && nc2 == 4) { for (col = 0; col < ww; col++) { memcpy(pix2, pix1, 4 * sizeof(float)); pix1 += nc1; pix2 += nc2; } } } Fbusy(-1); return; } /**************************************************************************************/ // Copyright (c) the JPEG XL Project Authors. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // This C++ example decodes a JPEG XL image in one shot (all input bytes // available at once). The example outputs the pixels and color information to a // floating point image and an ICC profile on disk. #include #include #include #include #include #include #include #include #include #include #include /** Decodes JPEG XL image to floating point pixels and ICC Profile. Pixel are * stored as floating point, as interleaved RGBA (4 floating point values per * pixel), line per line from top to bottom. Pixel values have nominal range * 0..1 but may go beyond this range for HDR or wide gamut. The ICC profile * describes the color format of the pixel data. */ bool JXLdataToFloat(const uint8_t* jxl, size_t size, std::vector* pixels, size_t* xsize, size_t* ysize) { JxlResizableParallelRunnerPtr runner = JxlResizableParallelRunnerMake(nullptr); JxlDecoderPtr dec = JxlDecoderMake(nullptr); if (JXL_DEC_SUCCESS != JxlDecoderSubscribeEvents(dec.get(), JXL_DEC_BASIC_INFO | JXL_DEC_COLOR_ENCODING | JXL_DEC_FULL_IMAGE)) { fprintf(stderr, "JxlDecoderSubscribeEvents failed\n"); return false; } if (JXL_DEC_SUCCESS != JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner, runner.get())) { fprintf(stderr, "JxlDecoderSetParallelRunner failed\n"); return false; } JxlBasicInfo info; JxlPixelFormat format = {4, JXL_TYPE_FLOAT, JXL_NATIVE_ENDIAN, 0}; JxlDecoderSetInput(dec.get(), jxl, size); JxlDecoderCloseInput(dec.get()); for (;;) { JxlDecoderStatus status = JxlDecoderProcessInput(dec.get()); if (status == JXL_DEC_ERROR) { fprintf(stderr, "Decoder error\n"); return false; } else if (status == JXL_DEC_NEED_MORE_INPUT) { fprintf(stderr, "Error, already provided all input\n"); return false; } else if (status == JXL_DEC_BASIC_INFO) { if (JXL_DEC_SUCCESS != JxlDecoderGetBasicInfo(dec.get(), &info)) { fprintf(stderr, "JxlDecoderGetBasicInfo failed\n"); return false; } *xsize = info.xsize; *ysize = info.ysize; JxlResizableParallelRunnerSetThreads( runner.get(), JxlResizableParallelRunnerSuggestThreads(info.xsize, info.ysize)); } else if (status == JXL_DEC_COLOR_ENCODING) continue; // ignore this /** { // Get the ICC color profile of the pixel data size_t icc_size; if (JXL_DEC_SUCCESS != JxlDecoderGetICCProfileSize(dec.get(), JXL_COLOR_PROFILE_TARGET_DATA,&icc_size)) { fprintf(stderr, "JxlDecoderGetICCProfileSize failed\n"); return false; } **/ else if (status == JXL_DEC_NEED_IMAGE_OUT_BUFFER) { size_t buffer_size; if (JXL_DEC_SUCCESS != JxlDecoderImageOutBufferSize(dec.get(), &format, &buffer_size)) { fprintf(stderr, "JxlDecoderImageOutBufferSize failed\n"); return false; } if (buffer_size != *xsize * *ysize * 16) { fprintf(stderr, "Invalid out buffer size %d %d\n", static_cast(buffer_size), static_cast(*xsize * *ysize * 16)); return false; } pixels->resize(*xsize * *ysize * 4); void* pixels_buffer = static_cast(pixels->data()); size_t pixels_buffer_size = pixels->size() * sizeof(float); if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, pixels_buffer, pixels_buffer_size)) { fprintf(stderr, "JxlDecoderSetImageOutBuffer failed\n"); return false; } } else if (status == JXL_DEC_FULL_IMAGE) { // Nothing to do. Do not yet return. If the image is an animation, more // full frames may be decoded. This example only keeps the last one. } else if (status == JXL_DEC_SUCCESS) { // All decoding successfully finished. // It's not required to call JxlDecoderReleaseInput(dec.get()) here since // the decoder will be destroyed. return true; } else { fprintf(stderr, "Unknown decoder status\n"); return false; } } } /**************************************************************************************/ // Copyright (c) the JPEG XL Project Authors. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // This example encodes a file containing a floating point image to another // file containing JPEG XL image with a single frame. #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * Compresses the provided pixels. * * @param pixels input pixels * @param xsize width of the input image * @param ysize height of the input image * @param compressed will be populated with the compressed bytes */ bool FloatToJXLdata(const std::vector& pixels, const uint32_t xsize, const uint32_t ysize, uint nchan, // nchan added std::vector* compressed) { JxlEncoderPtr enc = JxlEncoderMake(/*memory_manager=*/nullptr); JxlThreadParallelRunnerPtr runner = JxlThreadParallelRunnerMake( /*memory_manager=*/nullptr, JxlThreadParallelRunnerDefaultNumWorkerThreads()); if (JXL_ENC_SUCCESS != JxlEncoderSetParallelRunner(enc.get(), JxlThreadParallelRunner, runner.get())) { fprintf(stderr, "JxlEncoderSetParallelRunner failed\n"); return false; } JxlPixelFormat pixel_format = {nchan, JXL_TYPE_FLOAT, JXL_NATIVE_ENDIAN, 0}; // 3 -> nchan JxlBasicInfo basic_info; JxlEncoderInitBasicInfo(&basic_info); basic_info.xsize = xsize; basic_info.ysize = ysize; if (nchan == 4) basic_info.num_extra_channels = 1; // add alpha channel basic_info.bits_per_sample = 32; basic_info.exponent_bits_per_sample = 8; basic_info.uses_original_profile = JXL_FALSE; if (JXL_ENC_SUCCESS != JxlEncoderSetBasicInfo(enc.get(), &basic_info)) { fprintf(stderr, "JxlEncoderSetBasicInfo failed\n"); return false; } /** // causes pixels out of range 0-1.0 JxlColorEncoding color_encoding = {}; JXL_BOOL is_gray = TO_JXL_BOOL(pixel_format.num_channels < 3); JxlColorEncodingSetToSRGB(&color_encoding, is_gray); if (JXL_ENC_SUCCESS != JxlEncoderSetColorEncoding(enc.get(), &color_encoding)) { fprintf(stderr, "JxlEncoderSetColorEncoding failed\n"); return false; } **/ JxlEncoderFrameSettings* frame_settings = JxlEncoderFrameSettingsCreate(enc.get(), nullptr); if (!frame_settings) { fprintf(stderr, "JxlEncoderFrameSettingsCreate failed\n"); return false; } if (JXL_ENC_SUCCESS != JxlEncoderAddImageFrame(frame_settings, &pixel_format, static_cast(pixels.data()), sizeof(float) * pixels.size())) { fprintf(stderr, "JxlEncoderAddImageFrame failed\n"); return false; } JxlEncoderCloseInput(enc.get()); compressed->resize(64); uint8_t* next_out = compressed->data(); size_t avail_out = compressed->size() - (next_out - compressed->data()); JxlEncoderStatus process_result = JXL_ENC_NEED_MORE_OUTPUT; while (process_result == JXL_ENC_NEED_MORE_OUTPUT) { process_result = JxlEncoderProcessOutput(enc.get(), &next_out, &avail_out); if (process_result == JXL_ENC_NEED_MORE_OUTPUT) { size_t offset = next_out - compressed->data(); compressed->resize(compressed->size() * 2); next_out = compressed->data() + offset; avail_out = compressed->size() - offset; } } compressed->resize(next_out - compressed->data()); if (JXL_ENC_SUCCESS != process_result) { fprintf(stderr, "JxlEncoderProcessOutput failed\n"); return false; } return true; } fotocx/f.repair.cc0000664000175000017500000112507415247006660013057 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit - Repair menu functions m_sharpen sharpen an image, various methods m_fix_motionblur fix motion blur using Richardson-Lucy algorithm m_blur blur an image m_blur_normal mix pixels with immediate neighbors m_blur_radial mix pixels in radial lines from chosen center m_blur_directed blur locally in direction of mouse drag m_blur_graduated blur relative to pixel contrast m_blur_background blur relative to distance from foreground m_denoise remove noise from an image m_defog add or remove fog/haze in an image or selected area m_redeyes remove red-eyes from flash photos m_smart_erase replace pixels inside selected areas with background m_remove_halo remove halo effect caused by sharpen or other edits m_jpeg_artifacts suppress JPEG compression artifacts m_anti_alias fix jaggies on hard feature edges m_adjust_RGB adjust brightness/color using RGB or CMY colors m_adjust_HSL adjust color using HSL model m_remove_dust remove dust specs from an image m_fringes fix color fringes (chromatic aberration) ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) using namespace zfuncs; /**************************************************************************************/ // image sharpen functions namespace sharpen_names { int UM_radius, UM_amount, UM_thresh; int AC_amount, AC_thresh; int KH_radius; int MD_radius, MD_dark, MD_light, *MD_britemap; float RL_radius; int RL_iters; ch sharp_function[8] = ""; int brhood_radius; float brhood_kernel[200][200]; // up to radius = 99 ch brhood_method; // g = gaussian, f = flat distribution float *brhood_brightness = 0; // neighborhood brightness per pixel int BRH_radius = 0; // radius base for above calculation editfunc EFsharp; ch edit_hist[200]; } // menu function void m_sharpen(GtkWidget *, ch *menu) { using namespace sharpen_names; int sharp_dialog_event(zdialog *zd, ch *event); void * sharp_thread(void *); int ii; F1_help_topic = TX("SHARPEN"); printf("m_sharpen \n"); EFsharp.menuname = "Sharpen"; EFsharp.menufunc = m_sharpen; EFsharp.Farea = 2; // select area usable EFsharp.threadfunc = sharp_thread; // thread function EFsharp.Fpaintedits = 1; // use with paint edits OK EFsharp.Fscript = 1; // scripting supported if (! edit_setup(EFsharp)) return; // setup edit /*** ____________________________________________ | Sharpen | | | | [_] unsharp mask radius [__] | | amount [__] | | threshold [__] | | | | [_] amplify contrast amount [__] | | threshold [__] | | | | [_] Kuwahara radius [__] | | | | [_] median diff radius [__] | | dark [__] | | light [__] | | | | [_] Richardson-Lucy radius [__] | | iterations [__] | | | | [fix motion blur] | | | | [Reset] [Apply] [OK] [X] | |____________________________________________| ***/ zdialog *zd = zdialog_new(TX("Sharpen"),Mwin,TX("Reset"),TX("Apply"),"OK","X",null); EFsharp.zd = zd; zdialog_add_widget(zd,"hbox","hbum","dialog",0,"space=5"); // unsharp mask zdialog_add_widget(zd,"vbox","vb21","hbum",0,"space=2"); zdialog_add_widget(zd,"label","space","hbum",0,"expand"); zdialog_add_widget(zd,"vbox","vb22","hbum",0,"homog|space=2"); zdialog_add_widget(zd,"vbox","vb23","hbum",0,"homog|space=2"); zdialog_add_widget(zd,"check","UM","vb21",TX("unsharp mask"),"space=5"); zdialog_add_widget(zd,"label","lab21","vb22",TX("Radius")); zdialog_add_widget(zd,"label","lab22","vb22",TX("Amount")); zdialog_add_widget(zd,"label","lab23","vb22",TX("Threshold")); zdialog_add_widget(zd,"zspin","radiusUM","vb23","1|20|1|2"); zdialog_add_widget(zd,"zspin","amountUM","vb23","1|200|1|100"); zdialog_add_widget(zd,"zspin","threshUM","vb23","1|100|1|0"); zdialog_add_widget(zd,"hsep","sep3","dialog"); // amplify contrast zdialog_add_widget(zd,"hbox","hbgr","dialog",0,"space=5"); zdialog_add_widget(zd,"vbox","vb31","hbgr",0,"space=2"); zdialog_add_widget(zd,"label","space","hbgr",0,"expand"); zdialog_add_widget(zd,"vbox","vb32","hbgr",0,"homog|space=2"); zdialog_add_widget(zd,"vbox","vb33","hbgr",0,"homog|space=2"); zdialog_add_widget(zd,"check","AC","vb31",TX("amplify contrast"),"space=5"); zdialog_add_widget(zd,"label","lab32","vb32",TX("Amount")); zdialog_add_widget(zd,"label","lab33","vb32",TX("Threshold")); zdialog_add_widget(zd,"zspin","amountAC","vb33","1|400|1|100"); zdialog_add_widget(zd,"zspin","threshAC","vb33","1|100|1|0"); zdialog_add_widget(zd,"hsep","sep4","dialog"); // kuwahara zdialog_add_widget(zd,"hbox","hbku","dialog",0,"space=5"); zdialog_add_widget(zd,"check","KH","hbku",TX("Kuwahara"),"space=3"); zdialog_add_widget(zd,"label","space","hbku",0,"expand"); zdialog_add_widget(zd,"label","lab42","hbku",TX("Radius"),"space=3"); zdialog_add_widget(zd,"zspin","radiusKH","hbku","1|9|1|1"); zdialog_add_widget(zd,"hsep","sep5","dialog"); // median diff zdialog_add_widget(zd,"hbox","hbmd","dialog",0,"space=5"); zdialog_add_widget(zd,"vbox","vb51","hbmd",0,"space=2"); zdialog_add_widget(zd,"label","space","hbmd",0,"expand"); zdialog_add_widget(zd,"vbox","vb52","hbmd",0,"homog|space=2"); zdialog_add_widget(zd,"vbox","vb53","hbmd",0,"homog|space=2"); zdialog_add_widget(zd,"check","MD","vb51",TX("median diff"),"space=5"); zdialog_add_widget(zd,"label","lab51","vb52",TX("Radius")); zdialog_add_widget(zd,"label","lab52","vb52",TX("dark")); zdialog_add_widget(zd,"label","lab53","vb52",TX("light")); zdialog_add_widget(zd,"zspin","radiusMD","vb53","1|10|1|3"); zdialog_add_widget(zd,"zspin","darkMD","vb53","0|50|1|1"); zdialog_add_widget(zd,"zspin","lightMD","vb53","0|50|1|1"); zdialog_add_widget(zd,"hsep","sep6","dialog"); // Richardson-Lucy zdialog_add_widget(zd,"hbox","hbrl","dialog",0,"space=5"); zdialog_add_widget(zd,"vbox","vb61","hbrl",0,"space=2"); zdialog_add_widget(zd,"label","space","hbrl",0,"expand"); zdialog_add_widget(zd,"vbox","vb62","hbrl",0,"homog|space=2"); zdialog_add_widget(zd,"vbox","vb63","hbrl",0,"homog|space=2"); zdialog_add_widget(zd,"check","RL","vb61",TX("Richardson-Lucy"),"space=5"); zdialog_add_widget(zd,"label","lab62","vb62",TX("Radius")); zdialog_add_widget(zd,"label","lab63","vb62",TX("Iterations")); zdialog_add_widget(zd,"zspin","radiusRL","vb63","1|9|0.1|1"); zdialog_add_widget(zd,"zspin","itersRL","vb63","1|100|1|10"); zdialog_add_widget(zd,"hsep","sep7","dialog",0,"space=3"); // fix motion blur zdialog_add_widget(zd,"hbox","hbmb","dialog",0,"space=5"); zdialog_add_widget(zd,"button","FMB","hbmb",TX("fix motion blur"),"space=5"); zdialog_load_inputs(zd); zdialog_fetch(zd,"UM",ii); // set function from checkboxes if (ii) strcpy(sharp_function,"UM"); zdialog_fetch(zd,"AC",ii); if (ii) strcpy(sharp_function,"AC"); zdialog_fetch(zd,"KH",ii); if (ii) strcpy(sharp_function,"KH"); zdialog_fetch(zd,"MD",ii); if (ii) strcpy(sharp_function,"MD"); zdialog_fetch(zd,"RL",ii); if (ii) strcpy(sharp_function,"RL"); zdialog_run(zd,sharp_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int sharp_dialog_event(zdialog *zd, ch *event) // reworked for script files { using namespace sharpen_names; if (strmatch(event,"focus")) return 1; zdialog_fetch(zd,"radiusUM",UM_radius); // get all parameters zdialog_fetch(zd,"amountUM",UM_amount); zdialog_fetch(zd,"threshUM",UM_thresh); zdialog_fetch(zd,"amountAC",AC_amount); zdialog_fetch(zd,"threshAC",AC_thresh); zdialog_fetch(zd,"radiusKH",KH_radius); zdialog_fetch(zd,"radiusMD",MD_radius); zdialog_fetch(zd,"radiusRL",RL_radius); zdialog_fetch(zd,"itersRL",RL_iters); zdialog_fetch(zd,"darkMD",MD_dark); zdialog_fetch(zd,"lightMD",MD_light); if (strmatch(event,"apply")) zd->zstat = 2; // from script file if (strmatch(event,"done")) zd->zstat = 3; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 4; // from f_open() if (zd->zstat) { if (zd->zstat == 1) { // [reset] zd->zstat = 0; edit_reset(); return 1; } if (zd->zstat == 2) { // [apply] zd->zstat = 0; edit_reset(); if (*sharp_function) thread_signal(); // start thread function else zmessageACK(Mwin,TX("no selection")); // no choice made return 1; } if (zd->zstat == 3) { // [OK] edit_addhist(edit_hist); // record edit history edit_done(0); // done if (brhood_brightness) zfree(brhood_brightness); brhood_brightness = 0; return 1; } edit_cancel(0); // discard edit if (brhood_brightness) zfree(brhood_brightness); brhood_brightness = 0; return 1; } if (strmatch(event,"paint")) thread_signal(); if (strstr("UM AC KH MD RL",event)) { zdialog_stuff(zd,"UM",0); // make checkboxes like radio buttons zdialog_stuff(zd,"AC",0); zdialog_stuff(zd,"KH",0); zdialog_stuff(zd,"MD",0); zdialog_stuff(zd,"RL",0); zdialog_stuff(zd,event,1); strcpy(sharp_function,event); // set chosen method } if (strmatch(event,"FMB")) // button - fix motion blur strcpy(sharp_function,"FMB"); if (Fpaintedits && strstr("RL FMB",sharp_function)) { zmessageACK(Mwin,TX("paint edits cannot be used for this method")); sharp_dialog_event(zd,"UM"); return 1; } if (strmatch(sharp_function,"FMB")) { // motion blur Richardson-Lucy algorithm edit_cancel(0); if (brhood_brightness) zfree(brhood_brightness); brhood_brightness = 0; m_fix_motionblur(0,0); return 1; } return 1; } // sharpen image thread function void * sharp_thread(void *) { using namespace sharpen_names; int sharp_UM_thread(void); int sharp_AC_thread(void); int sharp_KH_thread(void); int sharp_MD_thread(void); int sharp_RL_thread(void); if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag if (strmatch(sharp_function,"UM")) sharp_UM_thread(); if (strmatch(sharp_function,"AC")) sharp_AC_thread(); if (strmatch(sharp_function,"KH")) sharp_KH_thread(); if (strmatch(sharp_function,"MD")) sharp_MD_thread(); if (strmatch(sharp_function,"RL")) sharp_RL_thread(); CEF->Fmods++; CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } // ------------------------------------------------------------------------------ // image sharpen function using unsharp mask int sharp_UM_thread() { using namespace sharpen_names; void britehood(int radius, ch method); // compute neighborhood brightness void * sharp_UM_wthread(void *arg); int64 cc; if (! brhood_brightness) { cc = Eww * Ehh * sizeof(float); brhood_brightness = (float *) zmalloc(cc,"sharpen"); BRH_radius = 0; } if (UM_radius != BRH_radius) { britehood(UM_radius,'f'); // re-calculate if radius changed BRH_radius = UM_radius; } if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // initz. progress counter else progress_setgoal(Eww * Ehh); get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(sharp_UM_wthread,NSMP); // worker threads progress_setgoal(0); snprintf(edit_hist,200,"unsharp mask %d %d",UM_amount,UM_thresh); // record edit hist return 1; } void * sharp_UM_wthread(void *arg) // worker thread function { using namespace sharpen_names; int index = *((int *) arg); int px, py, ii, Fend; float amount, thresh, bright; float mean, incr, ratio; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float *pix1, *pix3; float blend; int pskip = 0; while (true) { if (Fescape) return 0; // user kill Fend = get_edit_pixels(index,px,py,blend); if (Fend) return 0; if (blend == 0) continue; amount = 0.01 * UM_amount; // 0.0 to 2.0 thresh = 0.4 * UM_thresh; // 0 to 40 (256 max. possible) pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel bright = PIXBRIGHT(pix1); if (bright < 1) continue; // effectively black ii = py * Eww + px; mean = brhood_brightness[ii]; incr = (bright - mean); if (fabsf(incr) < thresh) continue; // omit low-contrast pixels incr = incr * amount; // 0.0 to 2.0 if (bright + incr > 255) incr = 255 - bright; ratio = (bright + incr) / bright; if (ratio < 0) ratio = 0; R1 = R9 = pix1[0]; // input RGB G1 = G9 = pix1[1]; B1 = B9 = pix1[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; R9 = ratio * R1; // new output RGB G9 = ratio * G1; B9 = ratio * B1; RGBfix(R9,G9,B9); if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; } // ------------------------------------------------------------------------------ // sharpen image by amplifying existing contrast int sharp_AC_thread() { using namespace sharpen_names; void * sharp_AC_wthread(void *arg); if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // initz. progress counter else progress_setgoal(Eww * Ehh); get_edit_pixels_init(NSMP,1); // initz. pixel loop do_wthreads(sharp_AC_wthread,NSMP); // worker threads progress_setgoal(0); snprintf(edit_hist,200,"amplifycon %d %d",AC_amount,AC_thresh); // record edit hist return 1; } void * sharp_AC_wthread(void *arg) // worker thread function { using namespace sharpen_names; float *pix1, *pix3; int px, py, Fend; int nc = E1pxm->nc; float blend, amount, thresh; float b1, b1x, b1y, b3x, b3y, b3, bf, f1, f2; float R1, G1, B1, R3, G3, B3, R9, G9, B9; int pskip = 0; int index = *((int *) arg); amount = 1 + 0.01 * AC_amount; // 1.0 - 5.0 thresh = AC_thresh; // 0 - 100 while (true) { if (Fescape) return 0; // user kill Fend = get_edit_pixels(index,px,py,blend); if (Fend) return 0; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel b1 = PIXBRIGHT(pix1); // pixel brightness, 0 - 256 if (b1 == 0) continue; // black, don't change b1x = b1 - PIXBRIGHT(pix1-nc); // horiz. brightness gradient b1y = b1 - PIXBRIGHT(pix1-nc * Eww); // vertical f1 = fabsf(b1x) + fabsf(b1y); if (f1 < thresh) // moderate brightness change for f1 = f1 / thresh; // pixels below threshold gradient else f1 = 1.0; f2 = 1.0 - f1; b1x = b1x * amount; // amplified gradient b1y = b1y * amount; b3x = PIXBRIGHT(pix1-nc) + b1x; // + prior pixel brightness b3y = PIXBRIGHT(pix1-nc * Eww) + b1y; // = new brightness b3 = 0.5 * (b3x + b3y); b3 = f1 * b3 + f2 * b1; // possibly moderated bf = b3 / b1; // ratio of brightness change if (bf < 0) bf = 0; if (bf > 4) bf = 4; R1 = R9 = pix1[0]; // input RGB G1 = G9 = pix1[1]; B1 = B9 = pix1[2]; R3 = pix3[0]; // current output RGB G3 = pix3[1]; B3 = pix3[2]; R9 = bf * R1; // new output RGB G9 = bf * G1; B9 = bf * B1; RGBfix(R9,G9,B9); if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; pix3[1] = G3; pix3[2] = B3; if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; } // callable sharp_AC() used by rotate function // returns E3 = sharpened E3 void sharp_AC(int amount, int thresh) { using namespace sharpen_names; int sharp_AC_thread(void); PXM *PXMtemp = E1pxm; // save E1 E1pxm = PXM_copy(E3pxm); // copy E3 > E1 AC_amount = amount; AC_thresh = thresh; sharp_AC_thread(); // E3 = sharpened E1 PXM_free(E1pxm); E1pxm = PXMtemp; // restore org. E1 return; } // ------------------------------------------------------------------------------ // sharpen edges using the Kuwahara algorithm int sharp_KH_thread() { using namespace sharpen_names; void * sharp_KH_wthread(void *arg); if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // initz. progress counter else progress_setgoal(Eww * Ehh); get_edit_pixels_init(NSMP,KH_radius); // initz. pixel loop do_wthreads(sharp_KH_wthread,NSMP); // worker threads progress_setgoal(0); snprintf(edit_hist,200,"kuwahara %d",KH_radius); // record edit hist return 1; } void * sharp_KH_wthread(void *arg) // worker thread function { using namespace sharpen_names; float *pix1, *pix3; int px, py, qx, qy, rx, ry; int rad, N, Fend; float red, green, blue, red2, green2, blue2; float vmin, vall, vred, vgreen, vblue; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float blend; int pskip = 0; int index = *((int *) arg); rad = KH_radius; // user input radius N = (rad + 1) * (rad + 1); while (true) { if (Fescape) return 0; // user kill Fend = get_edit_pixels(index,px,py,blend); if (Fend) return 0; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = R9 = pix1[0]; // input image RGB values G1 = G9 = pix1[1]; B1 = B9 = pix1[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; vmin = 99999; R9 = G9 = B9 = 0; for (qy = py - rad; qy <= py; qy++) // loop all surrounding neighborhoods for (qx = px - rad; qx <= px; qx++) { red = green = blue = 0; red2 = green2 = blue2 = 0; for (ry = qy; ry <= qy + rad; ry++) // loop all pixels in neighborhood for (rx = qx; rx <= qx + rad; rx++) { pix1 = PXMpix(E1pxm,rx,ry); red += pix1[0]; // compute mean RGB and mean RGB**2 red2 += pix1[0] * pix1[0]; green += pix1[1]; green2 += pix1[1] * pix1[1]; blue += pix1[2]; blue2 += pix1[2] * pix1[2]; } red = red / N; // mean RGB of neighborhood green = green / N; blue = blue / N; vred = red2 / N - red * red; // variance RGB vgreen = green2 / N - green * green; vblue = blue2 / N - blue * blue; vall = vred + vgreen + vblue; // save RGB values with least variance if (vall < vmin) { vmin = vall; R9 = red; G9 = green; B9 = blue; } } if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; } // ------------------------------------------------------------------------------ // sharpen edges using the median difference algorithm int sharp_MD_thread() { using namespace sharpen_names; void * sharp_MD_wthread(void *arg); int px, py, ii; float *pix1; MD_britemap = (int *) zmalloc(Eww * Ehh * sizeof(int),"sharpen"); for (py = 0; py < Ehh; py++) // loop all pixels for (px = 0; px < Eww; px++) { pix1 = PXMpix(E1pxm,px,py); // initz. pixel brightness map ii = py * Eww + px; MD_britemap[ii] = PIXBRIGHT(pix1); } if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // initz. progress counter else progress_setgoal(Eww * Ehh); get_edit_pixels_init(NSMP,MD_radius); // initz. pixel loop do_wthreads(sharp_MD_wthread,NSMP); progress_setgoal(0); zfree(MD_britemap); snprintf(edit_hist,200,"median diff %d %d %d",MD_radius,MD_dark,MD_light); // record edit hist return 1; } void * sharp_MD_wthread(void *arg) // worker thread function { using namespace sharpen_names; int index = *((int *) arg); int rad, dark, light, *britemap; int ii, px, py, Fend; int dy, dx, ns; float R1, G1, B1, R2, G2, B2, R3, G3, B3, R9, G9, B9; float F, blend; float *pix1, *pix3; int bright, median; int bsortN[1681]; // radius <= 20 (41 x 41 pixels) int pskip = 0; rad = MD_radius; // parameters from dialog dark = MD_dark; light = MD_light; britemap = MD_britemap; while (true) { if (Fescape) return 0; // user kill Fend = get_edit_pixels(index,px,py,blend); if (Fend) return 0; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = R9 = pix1[0]; // input image RGB values G1 = G9 = pix1[1]; B1 = B9 = pix1[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; ns = 0; for (dy = py-rad; dy <= py+rad; dy++) // loop surrounding pixels for (dx = px-rad; dx <= px+rad; dx++) // get brightness values { ii = dy * Eww + dx; bsortN[ns] = britemap[ii]; ns++; } heapsort(bsortN,ns); // sort the pixels (single thread) median = bsortN[ns/2]; // median brightness bright = PIXBRIGHT(pix3); if (bright < median) { F = 1.0 - 0.1 * dark * (median - bright) / (median + 50); R2 = R1 * F; G2 = G1 * F; B2 = B1 * F; if (R2 > 0 && G2 > 0 && B2 > 0) { R9 = R2; G9 = G2; B9 = B2; } } if (bright > median) { F = 1.0 + 0.03 * light * (bright - median) / (median + 50); R2 = R1 * F; G2 = G1 * F; B2 = B1 * F; if (R2 < 255 && G2 < 255 && B2 < 255) { R9 = R2; G9 = G2; B9 = B2; } } if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; } // ------------------------------------------------------------------------------ // Sharpen image using the Richardson-Lucy deconvolution algorithm // (best for camera out-of-focus area - point source blur disc is uniform) int sharp_RL_thread() { using namespace sharpen_names; void * sharp_RL_wthread(void *arg); do_wthreads(sharp_RL_wthread,3); // 3 threads for 3 RGB colors snprintf(edit_hist,200,"Richardson-Lucy %.1f %d",RL_radius,RL_iters); // record edit hist return 1; } void * sharp_RL_wthread(void *arg) // worker thread function { using namespace sharpen_names; void RLdecon(PXM *pxm, int rgb, float frad, int iter); int rgb = *((int *) arg); progress_setgoal(6 * RL_iters); RLdecon(E3pxm,rgb,RL_radius,RL_iters); progress_setgoal(0); return 0; } // Deblur out-of-focus image using Richardson-Lucy deconvolution // pxm input image in PXM format (float RGB values) // rgb RGB channel to deblur (0/1/2) // frad input blur disc radius (found by trial and error) // iter R-L algorithm iterations to use // Code below follows notation in Richardson-Lucy Wikipedia topic. void RLdecon(PXM *pxm, int rgb, float frad, int iter) { using namespace sharpen_names; int ww, hh; // image dimensions int px, py, rx, ry, sx, sy; int pxlo, pxhi, pylo, pyhi; int ii, jj, marg, dist = 0; float *pix; // pixel within input image float *Di; // initial pixel values (blurred) float *Uj; // current pixel values (deblurred float *Ci; // R-L factor float Pij; // R-L factor float f1, f2; float PSF[20][20]; // 1x blur disc, radius < 10 float PSF2[200][200]; // 9x blur disc, radius < 100 int irad, irad2, B, B2; float frad2, R, S; ww = pxm->ww; // image dimensions hh = pxm->hh; Di = (float *) malloc(ww * hh * sizeof(float)); // allocate memory Uj = (float *) malloc(ww * hh * sizeof(float)); Ci = (float *) malloc(ww * hh * sizeof(float)); // compute 9x blur disc (point spread function PSF) // shrink to 1x size for higher precision irad = frad + 0.5; // disc radius, next greater integer B = 2 * irad + 1; // disc container array, B x B B2 = 9 * B; // 9x container size irad2 = B2 / 2; // container irad frad2 = 9 * frad; // container frad for (ry = -irad2; ry <= +irad2; ry++) // build 9x disc for (rx = -irad2; rx <= +irad2; rx++) { R = sqrtf(rx * rx + ry * ry); if (R > frad2 + 0.5) // pixel fully outside radius PSF2[99+rx][99+ry] = 0; else if (R < frad2 - 0.5) // pixel fully inside radius PSF2[99+rx][99+ry] = 1.0; else // pixel strides radius PSF2[99+rx][99+ry] = frad2 + 0.5 - R; } for (ry = -irad; ry <= +irad; ry++) // loop 1x disc for (rx = -irad; rx <= +irad; rx++) PSF[9+rx][9+ry] = 0; // clear to zeros for (ry = -irad2; ry <= +irad2; ry++) // loop 9x disc for (rx = -irad2; rx <= +irad2; rx++) { sx = (rx + irad2) / 9 - irad; // corresp. 1x disc cell sy = (ry + irad2) / 9 - irad; PSF[9+sx][9+sy] += PSF2[99+rx][99+ry]; // aggregate 9x disc into 1x disc } S = 0; for (ry = -irad; ry <= +irad; ry++) // loop pixels in 1x disc for (rx = -irad; rx <= +irad; rx++) S += PSF[9+rx][9+ry]; // sum pixel values for (ry = -irad; ry <= +irad; ry++) // loop pixels in 1x disc for (rx = -irad; rx <= +irad; rx++) PSF[9+rx][9+ry] /= S; // normalize to sum 1.0 /*** print blur disc if (rgb == 0) { printf("\nfrad: %.1f irad: %d \n",frad,irad); for (ry = -irad; ry <= +irad; ry++) { for (rx = -irad; rx <= +irad; rx++) printf("%8.3f",PSF[9+rx][9+ry]); printf("\n"); } printf("\n"); } ***/ // initialize Di and Uj from input image rgb values marg = 5.3 * irad + 0.5 * iter; // invalid pixels - empirical pxlo = irad; // avoid image edges pxhi = ww - irad; pylo = irad; pyhi = hh - irad; if (sa_stat == sa_stat_fini) // if select area, reduce processing { pxlo = sa_minx - marg; pxhi = sa_maxx + marg; pylo = sa_miny - marg; pyhi = sa_maxy + marg; if (pxlo < irad) pxlo = irad; if (pxhi > ww-irad) pxhi = ww - irad; if (pylo < irad) pylo = irad; if (pyhi > hh-irad) pyhi = hh - irad; } for (py = pylo; py < pyhi; py++) for (px = pxlo; px < pxhi; px++) { if (Fescape) break; // user kill pix = PXMpix(pxm,px,py); ii = py * ww + px; Di[ii] = Uj[ii] = pix[rgb]; } // loop algorithm iterations for (int tt = 0; tt < iter; tt++) { if (Fescape) break; // user kill // compute Ci for each pixel i for (py = pylo; py < pyhi; py++) // loop all pixels i for (px = pxlo; px < pxhi; px++) { ii = py * ww + px; Ci[ii] = 0; for (ry = -irad; ry <= +irad; ry++) // loop contributing pixels j for (rx = -irad; rx <= +irad; rx++) { Pij = PSF[9+rx][9+ry]; // contribution factor jj = ii + ry * ww + rx; Ci[ii] += Pij * Uj[jj]; // aggregate } if (Ci[ii] <= 0) Ci[ii] = 1; if (isnan(Ci[ii])) Ci[ii] = 1; } progress_addvalue(1); // track progress // compute new Uj for each pixel j for (py = pylo; py < pyhi; py++) // loop all pixels j for (px = pxlo; px < pxhi; px++) { jj = py * ww + px; S = 0; for (ry = -irad; ry <= +irad; ry++) // loop all pixels i that pixel j for (rx = -irad; rx <= +irad; rx++) { // contributes to ii = jj + ry * ww + rx; Pij = PSF[9+rx][9+ry]; // contribution factor S += Di[ii] / Ci[ii] * Pij; // Di / Ci * Pij } Uj[jj] = Uj[jj] * S; // new Uj } progress_addvalue(1); // track progress } for (py = pylo+marg; py < pyhi-marg; py++) // replace input image rgb values for (px = pxlo+marg; px < pxhi-marg; px++) // avoid margins with invalid pixels { if (Fescape) break; // user kill ii = py * ww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; if (! dist) continue; // pixel outside area } if (isnan(Uj[ii])) Uj[ii] = 0; if (Uj[ii] < 0) Uj[ii] = 0; // modified pixel if (Uj[ii] > 255) Uj[ii] = 255; pix = PXMpix(pxm,px,py); // output image pixel f1 = 1.0; f2 = 0.0; pix[rgb] = f1 * Uj[ii] + f2 * Di[ii]; } free(Uj); free(Di); free(Ci); return; } // ------------------------------------------------------------------------------ // Compute the mean brightness of all pixel neighborhoods, // using a Gaussian or a flat distribution for the weightings. // If a select area is active, only inside pixels are calculated. // The flat method is 10-100x faster than the Gaussian method. void britehood(int radius, ch method) { using namespace sharpen_names; void * brhood_wthread(void *arg); int rad, radflat2, dx, dy; float kern; brhood_radius = radius; brhood_method = method; if (brhood_method == 'g') // compute Gaussian kernel { // (not currently used) rad = brhood_radius; radflat2 = rad * rad; for (dy = -rad; dy <= rad; dy++) for (dx = -rad; dx <= rad; dx++) { if (dx*dx + dy*dy <= radflat2) // cells within radius kern = exp( - (dx*dx + dy*dy) / radflat2); else kern = 0; // outside radius brhood_kernel[dy+rad][dx+rad] = kern; } } if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // initz. progress counter else progress_setgoal(Eww * Ehh); do_wthreads(brhood_wthread,NSMP); // worker threads progress_setgoal(0); return; } // worker thread function void * brhood_wthread(void *arg) { using namespace sharpen_names; int index = *((int *) arg); int rad = brhood_radius; int ii, px, py, qx, qy, Fstart; float kern, bsum, bsamp, bmean; float *pixel; int pskip = 0; if (brhood_method == 'g') // use round gaussian distribution { for (py = index; py < Ehh; py += NSMP) for (px = 0; px < Eww; px++) { if (Fescape) return 0; // user kill if (sa_stat == sa_stat_fini) { // select area, ii = py * Eww + px; // use only inside pixels if (! sa_pixmap[ii]) continue; } bsum = bsamp = 0; for (qy = py-rad; qy <= py+rad; qy++) // computed weighted sum of brightness for (qx = px-rad; qx <= px+rad; qx++) // for pixels in neighborhood { if (qy < 0 || qy > Ehh-1) continue; if (qx < 0 || qx > Eww-1) continue; kern = brhood_kernel[qy+rad-py][qx+rad-px]; pixel = PXMpix(E1pxm,qx,qy); bsum += PIXBRIGHT(pixel) * kern; // sum brightness * weight bsamp += kern; // sum weights } bmean = bsum / bsamp; // mean brightness ii = py * Eww + px; brhood_brightness[ii] = bmean; // pixel value if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } } if (brhood_method == 'f') // use square flat distribution { Fstart = 1; bsum = bsamp = 0; for (py = index; py < Ehh; py += NSMP) for (px = 0; px < Eww; px++) { if (Fescape) return 0; // user kill if (sa_stat == sa_stat_fini) { // select area, ii = py * Eww + px; // compute only inside pixels if (! sa_pixmap[ii]) { Fstart = 1; continue; } } if (px == 0) Fstart = 1; if (Fstart) { Fstart = 0; bsum = bsamp = 0; for (qy = py-rad; qy <= py+rad; qy++) // add up all columns for (qx = px-rad; qx <= px+rad; qx++) { if (qy < 0 || qy > Ehh-1) continue; if (qx < 0 || qx > Eww-1) continue; pixel = PXMpix(E1pxm,qx,qy); bsum += PIXBRIGHT(pixel); bsamp += 1; } } else { qx = px-rad-1; // subtract first-1 column if (qx >= 0) { for (qy = py-rad; qy <= py+rad; qy++) { if (qy < 0 || qy > Ehh-1) continue; pixel = PXMpix(E1pxm,qx,qy); bsum -= PIXBRIGHT(pixel); bsamp -= 1; } } qx = px+rad; // add last column if (qx < Eww) { for (qy = py-rad; qy <= py+rad; qy++) { if (qy < 0 || qy > Ehh-1) continue; pixel = PXMpix(E1pxm,qx,qy); bsum += PIXBRIGHT(pixel); bsamp += 1; } } } bmean = bsum / bsamp; // mean brightness ii = py * Eww + px; brhood_brightness[ii] = bmean; if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } } return 0; } /**************************************************************************************/ // remove blur from camera motion - Richardson-Lucy method namespace fix_motionblur_names { editfunc EFfixmotionblur; int span; // blur span, pixels int angle; // blur angle, 0-180 deg. int iter; // algorithm iterations int supring; // suppress ringing PXM *E2pxm; } // menu function void m_fix_motionblur(GtkWidget *, ch *menu) { using namespace fix_motionblur_names; void fix_motionblur_mousefunc(); int fix_motionblur_dialog_event(zdialog* zd, ch *event); void * fix_motionblur_thread(void *); ch *hintmess = TX("Shift + drag mouse across image \n" "to indicate blur direction"); printf("m_fix_motionblur \n"); EFfixmotionblur.menufunc = m_fix_motionblur; EFfixmotionblur.menuname = "Fix Motion Blur"; EFfixmotionblur.Farea = 2; // select area usable EFfixmotionblur.threadfunc = fix_motionblur_thread; // thread function EFfixmotionblur.mousefunc = fix_motionblur_mousefunc; // mouse function if (! edit_setup(EFfixmotionblur)) return; // setup edit /*** ___________________________________ | Fix Motion Blur | | | | Shift + drag mouse across image | | to indicate blur direction | | | | Blur Span (pixels) [___] | | Blur Angle (degrees) [___] | | Algorithm Iterations [___] | | Suppress Ringing [___] | | | | [Reset] [Apply] [OK] [X] | |___________________________________| ***/ zdialog *zd = zdialog_new(TX("Fix Motion Blur"),Mwin,TX("Reset"),TX("Apply"),"OK","X",null); CEF->zd = zd; zdialog_add_widget(zd,"label","labhint","dialog",hintmess,"space=5"); zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"label","space","hb1",0,"space=3"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"space=4|homog"); zdialog_add_widget(zd,"label","space","hb1",0,"space=8"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"space=4|homog"); zdialog_add_widget(zd,"label","space","hb1",0,"space=3"); zdialog_add_widget(zd,"label","labspan","vb1",TX("Blur Span (pixels)")); zdialog_add_widget(zd,"label","labangle","vb1",TX("Blur Angle (degrees)")); zdialog_add_widget(zd,"label","labiter","vb1",TX("Algorithm Iterations")); zdialog_add_widget(zd,"label","labsup","vb1",TX("Suppress Ringing")); zdialog_add_widget(zd,"zspin","span","vb2","0|40|1|0"); zdialog_add_widget(zd,"zspin","angle","vb2","-180|180|1|0"); zdialog_add_widget(zd,"zspin","iter","vb2","0|100|1|0"); zdialog_add_widget(zd,"zspin","supring","vb2","0|9|1|0"); zdialog_load_inputs(zd); zdialog_run(zd,fix_motionblur_dialog_event); // run dialog - parallel return; } // dialog event and completion function int fix_motionblur_dialog_event(zdialog *zd, ch *event) { using namespace fix_motionblur_names; void fix_motionblur_mousefunc(); if (strmatch(event,"done")) zd->zstat = 3; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 4; // from f_open() if (zd->zstat) { if (zd->zstat == 1) { // [reset] zd->zstat = 0; // keep dialog active edit_reset(); } else if (zd->zstat == 2) { // [apply] zd->zstat = 0; // keep dialog active edit_reset(); zdialog_fetch(zd,"angle",angle); // get all inputs zdialog_fetch(zd,"span",span); zdialog_fetch(zd,"iter",iter); zdialog_fetch(zd,"supring",supring); if (angle < 0) { angle = 180 + angle; // -1 --> 179 zdialog_stuff(zd,"angle",angle); } if (angle >= 180) { // 180 --> 0 angle = angle - 180; zdialog_stuff(zd,"angle",angle); } thread_signal(); // process } else if (zd->zstat == 3) // [OK] commit edit { edit_addhist("span:%d angle:%d iter:%d supR:%d", // edit params > edit hist span,angle,iter,supring); edit_done(0); } else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"focus")) { takeMouse(fix_motionblur_mousefunc,0); // connect mouse return 1; } return 1; } // mouse function - capture mouse drag direction and set rotate angle void fix_motionblur_mousefunc() { using namespace fix_motionblur_names; int dx, dy; float R; if (! KBshiftkey) { takeMouse(fix_motionblur_mousefunc,0); return; } takeMouse(fix_motionblur_mousefunc,dragcursor); if (! Mxdrag && ! Mydrag) return; dx = Mxdrag - Mxdown; // drag vector dy = Mydrag - Mydown; Mxdrag = Mydrag = 0; R = sqrtf(dx*dx + dy*dy); // get angle of drag angle = RAD * acosf(dx/R); if (dy > 0) angle = 180 - angle; // top quadrant only, 0-180 deg. if (angle == 180) angle = 0; if (CEF) zdialog_stuff(CEF->zd,"angle",angle); return; } // thread function void * fix_motionblur_thread(void *) { using namespace fix_motionblur_names; void * fix_motionblur_wthread1(void *arg); void * fix_motionblur_wthread2(void *arg); float rotate; int ww3, hh3; int ww8, hh8; int mww, mhh; if (angle <= 90) rotate = angle; // avoid upside-down result else rotate = angle - 180; ww3 = E3pxm->ww; // E3 size hh3 = E3pxm->hh; E8pxm = PXM_rotate(E3pxm,rotate); // E8 = E3 rotated so blur angle = 0 E9pxm = PXM_copy(E8pxm); // E8 = blurred input, E9 = sharp output do_wthreads(fix_motionblur_wthread1,NSMP); // replace black margins from edge pixels progress_setgoal(E8pxm->hh); // progress monitor = rows do_wthreads(fix_motionblur_wthread2,NSMP); // worker thread, E8 --> sharpen --> E9 progress_setgoal(0); PXM_free(E8pxm); // discard input image E8pxm = 0; E8pxm = PXM_rotate(E9pxm,-rotate); // E8 = unrotated E9 ww8 = E8pxm->ww; // E8 size hh8 = E8pxm->hh; PXM_free(E9pxm); // discard E9 E9pxm = 0; mww = (ww8 - ww3) / 2; mhh = (hh8 - hh3) / 2; // cut-off margins from two rotates PXM_free(E3pxm); E3pxm = PXM_copy_area(E8pxm,mww,mhh,ww3,hh3); // E8 - margins --> E3 (original size) PXM_free(E8pxm); // discard E8 E8pxm = 0; if (sa_stat == sa_stat_fini) sa_postfix(); // if select area, restore unselected CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); return 0; // not executed, stop warning } // propagate image edge pixels into the black margins created from rotation void * fix_motionblur_wthread1(void *arg) { using namespace fix_motionblur_names; int index = *((int *) arg); int px, py, pxL; float *pix8, R, G, B; int ww8 = E8pxm->ww; // E8 size int hh8 = E8pxm->hh; if (angle == 0) return 0; for (py = index; py < hh8; py += NSMP) // loop image rows { for (px = 0; px < ww8; px++) // loop columns { pix8 = PXMpix(E8pxm,px,py); if (pix8[0] > 0 || pix8[1] > 0 || pix8[2] > 0) break; // find first non-black pixel in row } pxL = px + 2; // use next pixel if (pxL < ww8) { pix8 = PXMpix(E8pxm,pxL,py); // get RGB values R = pix8[0]; G = pix8[1]; B = pix8[2]; for (px = 0; px < pxL; px++) { // fill black pixels with RGB pix8 = PXMpix(E8pxm,px,py); pix8[0] = R; pix8[1] = G; pix8[2] = B; } } for (px = ww8-1; px > 0; px--) // find last non-black pixel in row { pix8 = PXMpix(E8pxm,px,py); if (pix8[0] > 0 || pix8[1] > 0 || pix8[2] > 0) break; } pxL = px - 2; // use previous pixel if (pxL > 0) { pix8 = PXMpix(E8pxm,pxL,py); // get RGB values R = pix8[0]; G = pix8[1]; B = pix8[2]; for (px = pxL+1; px < ww8; px++) { // fill black pixels with RGB pix8 = PXMpix(E8pxm,px,py); pix8[0] = R; pix8[1] = G; pix8[2] = B; } } } return 0; } // fix motion blur worker thread function // E8 and E9 are rotated blurred image so that blur angle = 0 // span = N: each blurred pixel is average of N input pixels // output = E9 = sharpened E8 void * fix_motionblur_wthread2(void *arg) { using namespace fix_motionblur_names; void RLdecon(float *pixels, int Np, int Nd, int Nt); int index = *((int *) arg); int px, py, rgb; int ww = E8pxm->ww, hh = E8pxm->hh, nc = E8pxm->nc; int pcc = nc * sizeof(float); float *pixx, *pix9, *RLval; float *pix8, *pix8a, *pix8b; float con, F1, F2; if (span < 1) return 0; RLval = (float *) zmalloc(ww * sizeof(float),"motionblur-RL"); for (py = index; py < hh; py += NSMP) // loop image rows { progress_addvalue(index,1); // count progress (rows) for (rgb = 0; rgb < 3; rgb++) // loop RGB { for (px = 0; px < ww; px++) // loop pixels in row { pix9 = PXMpix(E8pxm,px,py); // one RGB value per pixel RLval[px] = pix9[rgb]; } RLdecon(RLval,ww,span,iter); // do R-L algorithm on pixel array for (px = 0; px < ww; px++) { pix9 = PXMpix(E9pxm,px,py); // save revised RGB values pix9[rgb] = RLval[px]; } } for (px = ww-1; px > span; px--) // fix position shift { pix9 = PXMpix(E9pxm,px,py); pixx = PXMpix(E9pxm,px-span/2,py); memcpy(pix9,pixx,pcc); } for (px = 1; px < ww-1; px++) // suppress ringing for (rgb = 0; rgb < 3; rgb++) { pix8 = PXMpix(E8pxm,px,py); // blurred input image pix8a = pix8 - nc; pix8b = pix8 + nc; con = span * 0.0039 * fabsf(pix8a[rgb] - pix8b[rgb]); // 0 - 1 = max. contrast if (con > 1.0) con = 1.0; F1 = 0.1 * supring; // 0 - 1 = max. suppression F2 = F1 * (1.0 - con); // min. contrast --> max. suppression pix9 = PXMpix(E9pxm,px,py); // sharpened output image pix9[rgb] = F2 * pix8[rgb] + (1.0 - F2) * pix9[rgb]; } } zfree(RLval); return 0; // exit thread } /*** Richardson-Lucy deconvolution for special case: linear uniform blur. pixels[] row of motion blurred pixels in blur direction (one RGB channel) Np pixel row length Nd blur span: Nd pixels contribute equally to each blurred pixel (inclusive: Nd = 1 means no blur) Nt algorithm iterations Variable names follow Wikipedia article on Richardson-Lucy deconvolution. ***/ void RLdecon(float *pixels, int Np, int Nd, int Nt) { int ii, jj, tt; float Pij = 1.0 / Nd; // pixel contribution factor float *Ci = (float *) malloc(Np * sizeof(float)); // Ci factor per pixel float *Uj = (float *) malloc(Np * sizeof(float)); // old/new estimated value per pixel for (jj = 0; jj < Np; jj++) // initial Uj per pixel jj Uj[jj] = pixels[jj]; for (tt = 0; tt < Nt; tt++) // algorithm iterations { for (ii = Nd; ii < Np-Nd; ii++) // compute Ci per pixel ii { Ci[ii] = 0; for (jj = 0; jj < Nd; jj++) // Nd pixels contributing to ii Ci[ii] += Pij * Uj[ii-jj]; if (Ci[ii] <= 0) Ci[ii] = 1; } for (jj = Nd; jj < Np-Nd-Nd; jj++) // compute new Uj per pixel jj { float S = 0; for (ii = 0; ii < Nd; ii++) // Nd pixels contributing to pixel jj S += pixels[jj+ii] / Ci[jj+ii] * Pij; Uj[jj] = Uj[jj] * S; // new Uj replaces old Uj } } for (jj = 0; jj < Np; jj++) { pixels[jj] = Uj[jj]; if (pixels[jj] < 0) pixels[jj] = 0; if (pixels[jj] > 255) pixels[jj] = 255; } free(Ci); free(Uj); return; } /**************************************************************************************/ // blur image steering function - choose from multiple blur functions void m_blur(GtkWidget *, ch *menu) { int blur_dialog_event(zdialog *zd, ch *event); zdialog *zd; F1_help_topic = TX("BLUR"); printf("m_blur \n"); /*** ____________________________________________________________________ | Blur Image | | | | [_] Normal Blur - mix pixels with all neighbor pixels | | [_] Radial Blur - mix pixels in radial lines from chosen center | | [_] Directed Blur - blur locally in direction of mouse drag | | [_] Graduated Blur - blur relative to pixel contrast | | [_] Background Blur - blur relative to distance from foreground | | | | [X] | |____________________________________________________________________| ***/ zd = zdialog_new(TX("Blur Image"),Mwin,"X",null); zdialog_add_widget(zd,"check","normal","dialog",TX("Normal Blur - mix pixels with all neighbor pixels")); zdialog_add_widget(zd,"check","radial","dialog",TX("Radial Blur - mix pixels in radial lines from chosen center")); zdialog_add_widget(zd,"check","directed","dialog",TX("Directed Blur - blur locally in direction of mouse drag")); zdialog_add_widget(zd,"check","graduated","dialog",TX("Graduated Blur - blur relative to pixel contrast")); zdialog_add_widget(zd,"check","background","dialog",TX("Background Blur - blur relative to distance from foreground")); zdialog_stuff(zd,"normal",0); zdialog_stuff(zd,"radial",0); zdialog_stuff(zd,"directed",0); zdialog_stuff(zd,"graduated",0); zdialog_stuff(zd,"background",0); zdialog_run(zd,blur_dialog_event,"save"); return; } // dialog event and completion function int blur_dialog_event(zdialog *zd, ch *event) { char event2[20]; void m_blur_normal(GtkWidget *, ch *menu); void m_blur_radial(GtkWidget *, ch *menu); void m_blur_directed(GtkWidget *, ch *menu); void m_blur_graduated(GtkWidget *, ch *menu); void m_blur_background(GtkWidget *, ch *menu); if (zd->zstat) { zdialog_free(zd); return 1; } if (zstrstr("normal radial directed graduated background motion",event)) { strncpy0(event2,event,20); zdialog_free(zd); } if (strmatch(event2,"normal")) m_blur_normal(0,0); if (strmatch(event2,"radial")) m_blur_radial(0,0); if (strmatch(event2,"directed")) m_blur_directed(0,0); if (strmatch(event2,"graduated")) m_blur_graduated(0,0); if (strmatch(event2,"background")) m_blur_background(0,0); return 1; } /**************************************************************************************/ // normal blur namespace blur_normal_names { editfunc EFblur; PXM *E2pxm; float radius; // blur radius float horz, vert; // blur distance, horz and vert float Wh[1000], Wv[1000]; // weights for radius < 1000 } void m_blur_normal(GtkWidget *, ch *menu) { using namespace blur_normal_names; int blur_normal_dialog_event(zdialog *zd, ch *event); void * blur_normal_thread(void *); F1_help_topic = TX("BLUR"); printf("m_blur_normal \n"); EFblur.menuname = "Blur Normal"; EFblur.menufunc = m_blur_normal; EFblur.Farea = 2; // select area usable EFblur.threadfunc = blur_normal_thread; // thread function EFblur.Fpaintedits = 1; // allow paint edits EFblur.Fscript = 1; // allow scripting 25.1 if (! edit_setup(EFblur)) return; // setup edit /*** _________________________________________ | Normal Blur | | | | Radius [___] Horz [___] Vert [___] | // separate horz and vert 25.1 | | | [Reset] [Apply] [OK] [X] | |_________________________________________| ***/ zdialog *zd = zdialog_new(TX("Normal Blur"),Mwin,TX("Reset"),TX("Apply"),"OK","X",null); EFblur.zd = zd; zdialog_add_widget(zd,"hbox","hbnb","dialog"); zdialog_add_widget(zd,"label","labrad","hbnb",TX("Radius"),"space=3"); zdialog_add_widget(zd,"zspin","radius","hbnb","1|999|1|10","space=3|size=3"); zdialog_add_widget(zd,"label","labhorz","hbnb",TX("Horz"),"space=3"); zdialog_add_widget(zd,"zspin","horz","hbnb","1|999|1|10","space=3|size=3"); zdialog_add_widget(zd,"label","labvert","hbnb",TX("Vert"),"space=3"); zdialog_add_widget(zd,"zspin","vert","hbnb","1|999|1|10","space=3|size=3"); E2pxm = 0; zdialog_load_inputs(zd); // restore inputs zdialog_fetch(zd,"radius",radius); zdialog_fetch(zd,"horz",horz); zdialog_fetch(zd,"vert",vert); zdialog_run(zd,blur_normal_dialog_event,"save"); // run dialog return; } // dialog event and completion callback function int blur_normal_dialog_event(zdialog * zd, ch *event) { using namespace blur_normal_names; if (strmatch(event,"done")) zd->zstat = 3; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 4; // from f_open() if (strmatch(event,"apply")) zd->zstat = 2; // from script if (zd->zstat) { if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active edit_reset(); return 1; } if (zd->zstat == 2) // [apply] { zd->zstat = 0; // keep dialog active thread_signal(); // trigger thread return 1; } if (zd->zstat == 3) { // [OK] edit_addhist("rad:%.0f",radius); edit_done(0); } else edit_cancel(0); // cancel if (E2pxm) PXM_free(E2pxm); // free memory E2pxm = 0; return 1; } if (strmatch(event,"paint")) // from paint edits thread_signal(); if (strmatch(event,"radius")) { zdialog_fetch(zd,"radius",radius); // radius input horz = vert = radius; // horz and vert blur = same zdialog_stuff(zd,"horz",horz); zdialog_stuff(zd,"vert",vert); } if (strmatch(event,"horz")) zdialog_fetch(zd,"horz",horz); // horz input if (strmatch(event,"vert")) zdialog_fetch(zd,"vert",vert); // vert input return 1; } // thread function void * blur_normal_thread(void *) { using namespace blur_normal_names; void * blur_normal_wthread1(void *); void * blur_normal_wthread2(void *); int ii, N; float rad, w, wsum; if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag rad = horz; // horizontal blur wsum = 0; for (ii = 0; ii <= rad; ii++) // set pixel weight per distance { // example, rad = 10 w = 1.0 - (ii + 0.25) / rad; // dist: 0 1 2 3 5 7 9 w = w * w; // weight: .95 .77 .60 .46 .23 .08 .01 Wh[ii] = w; wsum += w; } for (ii = 0; ii <= rad; ii++) // make weights sum to 1.0 Wh[ii] = Wh[ii] / wsum; rad = vert; // same for vertical blur wsum = 0; for (ii = 0; ii <= rad; ii++) { w = 1.0 - (ii + 0.25) / rad; w = w * w; Wv[ii] = w; wsum += w; } for (ii = 0; ii <= rad; ii++) Wv[ii] = Wv[ii] / wsum; if (E2pxm) PXM_free(E2pxm); E2pxm = PXM_copy(E3pxm); // intermediate image if (! Fpaintedits) { N = 0; if (horz) N++; if (vert) N++; if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel * N); // initz. progress counter else progress_setgoal(Eww * Ehh * N); } get_edit_pixels_init(NSMP,0); do_wthreads(blur_normal_wthread1,NSMP); // worker threads 1 get_edit_pixels_init(NSMP,0); do_wthreads(blur_normal_wthread2,NSMP); // worker threads 2 progress_setgoal(0); CEF->Fmods++; CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); return 0; } // worker thread 1 - vertical blur void * blur_normal_wthread1(void *arg) { using namespace blur_normal_names; int index = *((int *) arg); int rad = vert; // 25.1 int ii, dist = 0; int Fend, px, py, qy; int ylo, yhi; float blend, R9, G9, B9, w1, w2; float *pix2, *pix3; int pskip = 0; while (true) // loop all edit pixels { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; if (Fescape) return 0; // escape key pix3 = PXMpix(E3pxm,px,py); // input pixel pix2 = PXMpix(E2pxm,px,py); // output pixel - intermediate image ylo = py - rad; // get column of input pixel if (ylo < 0) ylo = 0; yhi = py + rad; if (yhi > Ehh-1) yhi = Ehh - 1; R9 = G9 = B9 = 0; w2 = 0; for (qy = ylo; qy <= yhi; qy++) // loop pixels in same column { if (sa_stat == sa_stat_fini) { ii = qy * Eww + px; // don't use pixels outside area dist = sa_pixmap[ii]; if (! dist) continue; } w1 = Wv[abs(qy-py)]; // weight based on radius pix3 = PXMpix(E3pxm,px,qy); R9 += w1 * pix3[0]; // accumulate RGB * weight G9 += w1 * pix3[1]; B9 += w1 * pix3[2]; w2 += w1; // accumulate weights } R9 = R9 / w2; // normalize G9 = G9 / w2; B9 = B9 / w2; pix2[0] = R9; // weighted average pix2[1] = G9; pix2[2] = B9; if (! Fpaintedits) { if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } } return 0; } // worker thread 2 - horizontal blur void * blur_normal_wthread2(void *arg) { using namespace blur_normal_names; int index = *((int *) arg); int rad = horz; // 25.1 int ii, dist = 0; int Fend, px, py, qx; int xlo, xhi; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float blend, w1, w2; float *pix1, *pix2, *pix3; int pskip = 0; while (true) // loop all edit pixels { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; if (Fescape) return 0; // user cancel pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; // input RGB values G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; // current output RGB G3 = pix3[1]; B3 = pix3[2]; xlo = px - rad; // get row of input pixel if (xlo < 0) xlo = 0; xhi = px + rad; if (xhi > Eww-1) xhi = Eww - 1; R9 = G9 = B9 = 0; w2 = 0; for (qx = xlo; qx <= xhi; qx++) // loop pixels in same row { if (sa_stat == sa_stat_fini) { ii = py * Eww + qx; // don't use pixels outside area dist = sa_pixmap[ii]; if (! dist) continue; } pix2 = PXMpix(E2pxm,qx,py); // use intermediate image w1 = Wh[abs(qx-px)]; // weight based on radius R9 += w1 * pix2[0]; // accumulate RGB * weight G9 += w1 * pix2[1]; B9 += w1 * pix2[2]; w2 += w1; // accumulate weights } R9 = R9 / w2; // normalize G9 = G9 / w2; B9 = B9 / w2; RGBfix(R9,G9,B9); if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; // increase edit G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; if (! Fpaintedits) { if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } } return 0; } /**************************************************************************************/ // radial blur namespace blur_radial_names { editfunc EFblurad; zdialog *zd; // 25.1 PXM *E2pxm; int RBrad, RBlen; // radial blur radius, length int Cx, Cy; // image center of radial blur } void m_blur_radial(GtkWidget *, ch *menu) { using namespace blur_radial_names; int blur_radial_dialog_event(zdialog *zd, ch *event); void blur_radial_mousefunc(); void * blur_radial_thread(void *); F1_help_topic = TX("BLUR"); printf("m_blur_radial \n"); EFblurad.menuname = "Blur Radial"; EFblurad.menufunc = m_blur_radial; EFblurad.Farea = 2; // select area usable EFblurad.threadfunc = blur_radial_thread; // thread function EFblurad.mousefunc = blur_radial_mousefunc; // mouse function if (! edit_setup(EFblurad)) return; // setup edit /*** _________________________________________ | Radial Blur | | | | Radius [___] Length [___] | // central area, no blur | Center X [___] Y [___] | | | | [Reset] [Apply] [OK] [X] | |_________________________________________| ***/ zd = zdialog_new(TX("Radial Blur"),Mwin,TX("Reset"),TX("Apply"),"OK","X",null); EFblurad.zd = zd; zdialog_add_widget(zd,"hbox","hbrb2","dialog"); zdialog_add_widget(zd,"label","labrbr","hbrb2",TX("Radius"),"space=5"); zdialog_add_widget(zd,"zspin","RBrad","hbrb2","1|999|1|100","space=3|size=3"); zdialog_add_widget(zd,"label","space","hbrb2",0,"space=5"); zdialog_add_widget(zd,"label","labrbl","hbrb2",TX("Length"),"space=5"); zdialog_add_widget(zd,"zspin","RBlen","hbrb2","1|999|1|100","space=3|size=3"); zdialog_add_widget(zd,"hbox","hbrb3","dialog"); zdialog_add_widget(zd,"label","labc","hbrb3",TX("Center"),"space=5"); zdialog_add_widget(zd,"label","labcx","hbrb3","X","space=3"); zdialog_add_widget(zd,"zentry","Cx","hbrb3",0,"space=3|size=3"); zdialog_add_widget(zd,"label","space","hbrb3",0,"space=5"); zdialog_add_widget(zd,"label","labcy","hbrb3","Y","space=3"); zdialog_add_widget(zd,"zentry","Cy","hbrb3",0,"space=3|size=3"); E2pxm = 0; RBrad = 100; RBlen = 100; Cx = Eww / 2; Cy = Ehh / 2; zdialog_stuff(zd,"Cx",Cx); zdialog_stuff(zd,"Cy",Cy); zdialog_load_inputs(zd); zdialog_run(zd,blur_radial_dialog_event,"save"); // run dialog return; } // dialog event and completion callback function int blur_radial_dialog_event(zdialog * zd, ch *event) { using namespace blur_radial_names; void blur_radial_mousefunc(); if (strmatch(event,"done")) zd->zstat = 3; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 4; // from f_open() zdialog_fetch(zd,"RBrad",RBrad); zdialog_fetch(zd,"RBlen",RBlen); zdialog_fetch(zd,"Cx",Cx); zdialog_fetch(zd,"Cy",Cy); takeMouse(blur_radial_mousefunc,dragcursor); if (zd->zstat) { if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active edit_reset(); return 1; } else if (zd->zstat == 2) // [apply] { zdialog_fetch(zd,"Cx",Cx); // make scriptable 25.1 zdialog_fetch(zd,"Cy",Cy); zd->zstat = 0; // keep dialog active thread_signal(); // trigger thread return 1; // do not free E2 } else if (zd->zstat == 3) { // [OK] edit_addhist("rad:%d length:%d",RBrad,RBlen); edit_done(0); } else edit_cancel(0); // cancel if (E2pxm) PXM_free(E2pxm); // free memory E2pxm = 0; } return 1; } // mouse function void blur_radial_mousefunc() { using namespace blur_radial_names; if (! CEF) return; if (LMclick) // radial blur, new center { zdialog *zd = CEF->zd; Cx = Mxposn; Cy = Myposn; zdialog_stuff(zd,"Cx",Cx); zdialog_stuff(zd,"Cy",Cy); LMclick = 0; thread_signal(); } return; } // thread function void * blur_radial_thread(void *) { using namespace blur_radial_names; void * blur_radial_wthread(void *); if (E2pxm) PXM_free(E2pxm); E2pxm = PXM_copy(E1pxm); // use original image if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // initz. progress counter else progress_setgoal(Eww * Ehh); do_wthreads(blur_radial_wthread,NSMP); // worker threads progress_setgoal(0); CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); return 0; } // worker thread void * blur_radial_wthread(void *arg) { using namespace blur_radial_names; int index = *((int *) arg); int ii, dist = 0; int px, py, qx, qy, qz; float RBlen2; float *pix2, *pix3; float R, Rx, Ry, Rz; int Rsum, Gsum, Bsum, Npix; int pskip = 0; for (py = index+1; py < Ehh-1; py += NSMP) // loop all image pixels for (px = 1; px < Eww-1; px++) { if (Fescape) return 0; // user cancel ii = py * Eww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // outside pixel } Rsum = Gsum = Bsum = Npix = 0; // reset RGB sums R = sqrtf((px-Cx)*(px-Cx) + (py-Cy)*(py-Cy)); // distance (Cx,Cy) to (px,py) if (R == 0) continue; Rx = (px-Cx)/R; // unit vector along (Cx,Cy) to (px,py) Ry = (py-Cy)/R; if (fabsf(Rx) > fabsf(Ry)) Rz = 1.0 / fabsf(Rx); // Rz is 1.0 .. 1.414 else Rz = 1.0 / fabsf(Ry); Rx = Rx * Rz; // vector with max x/y component = 1 Ry = Ry * Rz; RBlen2 = Eww; // lesser image dimension if (Ehh < Eww) RBlen2 = Ehh; RBlen2 = RBlen * (R - RBrad) / RBlen2; // R = 0-max >> RBlen2 = 0..RBlen if (RBlen2 < 1) RBlen2 = 1; // central area, no blur for (qz = 0; qz < RBlen2; qz++) // loop (qx,qy) from (px,py) { // in direction to (Cx,Cy) qx = px - qz * Rx; // for distance RBlen qy = py - qz * Ry; if (qx < 0 || qx > Eww-1) break; if (qy < 0 || qy > Ehh-1) break; if (sa_stat == sa_stat_fini) { ii = qy * Eww + qx; // don't use pixels outside area dist = sa_pixmap[ii]; if (! dist) continue; } pix2 = PXMpix(E2pxm,qx,qy); // sum RGB values Rsum += pix2[0]; Gsum += pix2[1]; Bsum += pix2[2]; Npix++; // count pixels in sum } pix3 = PXMpix(E3pxm,px,py); // output pixel is average of pix3[0] = Rsum / Npix; // pixels in line of length RBlen pix3[1] = Gsum / Npix; // from (px,py) to (Cx,Cy) pix3[2] = Bsum / Npix; if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; } /**************************************************************************************/ // directed blur - blur in direction of mouse drag namespace blur_directed_names { float Dmdx, Dmdy, Dmdw, Dmdh; float DD, Dspan, Dintens; editfunc EFblurdirc; } void m_blur_directed(GtkWidget *, ch *menu) { using namespace blur_directed_names; int blur_directed_dialog_event(zdialog *zd, ch *event); void blur_directed_mousefunc(); void * blur_directed_thread(void *); F1_help_topic = TX("BLUR"); printf("m_blur_directed \n"); EFblurdirc.menuname = "Blur Directed"; EFblurdirc.menufunc = m_blur_directed; EFblurdirc.Farea = 2; // select area usable EFblurdirc.threadfunc = blur_directed_thread; // thread function EFblurdirc.mousefunc = blur_directed_mousefunc; if (! edit_setup(EFblurdirc)) return; // setup edit /*** _________________________________________ | Directed Blur | | | | Blur Span [___] Intensity [___] | | | | [Reset] [OK] [X] | |_________________________________________| ***/ zdialog *zd = zdialog_new(TX("Directed Blur"),Mwin,TX("Reset"),"OK","X",null); EFblurdirc.zd = zd; zdialog_add_widget(zd,"hbox","hbdb2","dialog"); zdialog_add_widget(zd,"label","labspan","hbdb2",TX("Blur Span"),"space=5"); zdialog_add_widget(zd,"zspin","span","hbdb2","0.00|1.0|0.002|0.1","space=3|size=3"); zdialog_add_widget(zd,"label","space","hbdb2",0,"space=5"); zdialog_add_widget(zd,"label","labint","hbdb2",TX("Intensity")); zdialog_add_widget(zd,"zspin","intens","hbdb2","0.00|1.0|0.01|0.1","space=3|size=3"); Dspan = 0.1; Dintens = 0.1; zdialog_load_inputs(zd); zdialog_run(zd,blur_directed_dialog_event,"save"); // run dialog return; } // dialog event and completion callback function int blur_directed_dialog_event(zdialog * zd, ch *event) { using namespace blur_directed_names; void blur_directed_mousefunc(); if (strmatch(event,"done")) zd->zstat = 3; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 4; // from f_open() takeMouse(blur_directed_mousefunc,dragcursor); zdialog_fetch(zd,"span",Dspan); zdialog_fetch(zd,"intens",Dintens); if (zd->zstat) { if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active edit_reset(); } else if (zd->zstat == 2) { // [OK] edit_addhist("span:%.2f intens:%.2f",Dspan,Dintens); edit_done(0); } else edit_cancel(0); // discard edit } return 1; } // mouse function void blur_directed_mousefunc() { using namespace blur_directed_names; if (! CEF) return; if (Mxdrag || Mydrag) // directed blur, mouse drag { Dmdx = Mxdown; // drag origin Dmdy = Mydown; Dmdw = Mxdrag - Mxdown; // drag increment Dmdh = Mydrag - Mydown; Mxdrag = Mydrag = 0; thread_signal(); } return; } // thread function void * blur_directed_thread(void *) { using namespace blur_directed_names; void * blur_directed_wthread(void *); float dd, d1, d2, d3, d4; d1 = (Dmdx) * (Dmdx) + (Dmdy) * (Dmdy); // distance, mouse to 4 corners d2 = (Eww-Dmdx) * (Eww-Dmdx) + (Dmdy) * (Dmdy); d3 = (Eww-Dmdx) * (Eww-Dmdx) + (Ehh-Dmdy) * (Ehh-Dmdy); d4 = (Dmdx) * (Dmdx) + (Ehh-Dmdy) * (Ehh-Dmdy); dd = d1; if (d2 > dd) dd = d2; // find greatest corner distance if (d3 > dd) dd = d3; if (d4 > dd) dd = d4; DD = dd * 0.5 * Dspan; do_wthreads(blur_directed_wthread,NSMP); // worker threads progress_setgoal(0); CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); return 0; } // worker thread void * blur_directed_wthread(void *arg) { using namespace blur_directed_names; int index = *((int *) arg); int ii, px, py, dist = 0, vstat; float d, mag, dispx, dispy; float F1, F2; float vpix[4], *pix3; F1 = Dintens * Dintens; F2 = 1.0 - F1; for (py = index; py < Ehh; py += NSMP) // process all pixels for (px = 0; px < Eww; px++) { ii = py * Eww + px; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from edge if (! dist) continue; // pixel outside area } d = (px-Dmdx)*(px-Dmdx) + (py-Dmdy)*(py-Dmdy); mag = (1.0 - d / DD); if (mag < 0) continue; mag = mag * mag; // faster than pow(mag,4); mag = mag * mag; dispx = -Dmdw * mag; // displacement = drag * mag dispy = -Dmdh * mag; vstat = vpixel(E3pxm,px+dispx,py+dispy,vpix); // input virtual pixel pix3 = PXMpix(E3pxm,px,py); // output pixel if (vstat) { pix3[0] = F2 * pix3[0] + F1 * vpix[0]; // output = input pixel blend pix3[1] = F2 * pix3[1] + F1 * vpix[1]; pix3[2] = F2 * pix3[2] + F1 * vpix[2]; } } return 0; // exit thread } /**************************************************************************************/ // graduated blur - blur inversly proportional to sharpness namespace blur_graduated_names { float radius; // blur radius int con_limit; // contrast limit uint8 *pixcon; int pixseq_done[122][122]; // up to blur_radius = 60 int pixseq_angle[1000]; int pixseq_dx[13000], pixseq_dy[13000]; int pixseq_rad[13000]; int max1 = 999, max2 = 12999; // for later overflow check editfunc EFblurgrad; } void m_blur_graduated(GtkWidget *, ch *menu) { using namespace blur_graduated_names; void blur_graduated_pixcon(void); void blur_graduated_pixseq(void); int blur_graduated_dialog_event(zdialog *zd, ch *event); void * blur_graduated_thread(void *); F1_help_topic = TX("BLUR"); printf("m_blur_graduated \n"); EFblurgrad.menuname = "Blur Graduated"; EFblurgrad.menufunc = m_blur_graduated; EFblurgrad.Farea = 2; // select area usable EFblurgrad.threadfunc = blur_graduated_thread; // thread function EFblurgrad.Fpaintedits = 1; // allow paint edits EFblurgrad.Fscript = 1; // allow scripting 25.1 if (! edit_setup(EFblurgrad)) return; // setup edit /*** _________________________________________ | Graduated Blur | | | | Radius [___] Contrast Limit [___] | | | | [Reset] [Apply] [OK] [X] | |_________________________________________| ***/ zdialog *zd = zdialog_new(TX("Graduated Blur"),Mwin,TX("Reset"),TX("Apply"),"OK","X",null); EFblurgrad.zd = zd; zdialog_add_widget(zd,"hbox","hbgb2","dialog"); zdialog_add_widget(zd,"label","labgrad","hbgb2",TX("Radius"),"space=5"); zdialog_add_widget(zd,"zspin","radius","hbgb2","1|50|1|10","space=3|size=3"); zdialog_add_widget(zd,"label","space","hbgb2",0,"space=5"); zdialog_add_widget(zd,"label","lablim","hbgb2",TX("Contrast Limit")); zdialog_add_widget(zd,"zspin","con_limit","hbgb2","1|255|1|50","space=3|size=3"); radius = 10; // initial values con_limit = 1; zdialog_load_inputs(zd); zdialog_run(zd,blur_graduated_dialog_event,"save"); // run dialog blur_graduated_pixcon(); // initialize - will burn a while blur_graduated_pixseq(); return; } // dialog event and completion callback function int blur_graduated_dialog_event(zdialog * zd, ch *event) { using namespace blur_graduated_names; void blur_graduated_pixseq(void); if (strmatch(event,"done")) zd->zstat = 3; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 4; // from f_open() if (strmatch(event,"apply")) zd->zstat = 2; // from script 25.1 if (zd->zstat) { if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active edit_reset(); return 1; } if (zd->zstat == 2) // [apply] { zd->zstat = 0; // keep dialog active thread_signal(); // trigger thread return 1; // do not free E2 } if (zd->zstat == 3) { // [OK] edit_addhist("rad:%.0f conlim:%d",radius,con_limit); edit_done(0); } else edit_cancel(0); // cancel zfree(pixcon); return 1; } if (strmatch(event,"radius")) { zdialog_fetch(zd,"radius",radius); blur_graduated_pixseq(); } zdialog_fetch(zd,"radius",radius); // for script 25.1 zdialog_fetch(zd,"con_limit",con_limit); if (strmatch(event,"paint")) // from paint edits thread_signal(); return 1; } // calculate contrast for all pixels - done once void blur_graduated_pixcon(void) { using namespace blur_graduated_names; int ii; int px, py, dx, dy; float *pix1, *pix2; float contrast, maxcon; Fbusy(+1); pixcon = (uint8 *) zmalloc(Eww * Ehh,"grad blur"); // pixel contrast map for (py = 1; py < Ehh-1; py++) // loop interior pixels for (px = 1; px < Eww-1; px++) { pix1 = PXMpix(E1pxm,px,py); // this pixel in base image E1 contrast = maxcon = 0.0; for (dx = px-1; dx <= px+1; dx++) // loop neighbor pixels for (dy = py-1; dy <= py+1; dy++) { pix2 = PXMpix(E1pxm,dx,dy); contrast = 1.0 - PIXmatch(pix1,pix2); // contrast, 0-1 if (contrast > maxcon) maxcon = contrast; } ii = py * Eww + px; // ii maps to (px,py) pixcon[ii] = 255 * maxcon; // pixel contrast, 0 to 255 } Fbusy(-1); return; } // map pixels around each image pixel in order of increasing angle and radius // done whenever radius changes void blur_graduated_pixseq(void) { using namespace blur_graduated_names; int ii, jj; int dx, dy, adx, ady; float rad1, rad2, angle, astep; Fbusy(+1); rad1 = radius; for (dy = 0; dy <= 2*rad1; dy++) // no pixels mapped yet for (dx = 0; dx <= 2*rad1; dx++) pixseq_done[dx][dy] = 0; ii = jj = 0; astep = 0.5 / rad1; // 0.5 pixel steps at rad1 from center for (angle = 0; angle < 2*PI; angle += astep) // loop full circle { pixseq_angle[ii] = jj; // start pixel sequence for this angle ii++; for (rad2 = 1; rad2 <= rad1; rad2++) // loop rad2 from center to edge { dx = lround(rad2 * cos(angle)); // pixel at angle and rad2 dy = lround(rad2 * sin(angle)); adx = rad1 + dx; ady = rad1 + dy; if (pixseq_done[adx][ady]) continue; // pixel already mapped pixseq_done[adx][ady] = 1; // map pixel pixseq_dx[jj] = dx; // save pixel sequence for angle pixseq_dy[jj] = dy; pixseq_rad[jj] = rad2; // pixel radius jj++; } pixseq_rad[jj] = 9999; // mark end of pixels for angle jj++; } pixseq_angle[ii] = 9999; // mark end of angle steps if (ii > max1 || jj > max2) // should not happen zappcrash("gradblur array overflow"); Fbusy(-1); return; } // thread function void * blur_graduated_thread(void *) { using namespace blur_graduated_names; void * blur_graduated_wthread(void *); if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag if (! Fpaintedits) { if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // initz. progress counter else progress_setgoal(Eww * Ehh); } get_edit_pixels_init(NSMP,0); do_wthreads(blur_graduated_wthread,NSMP); // worker threads progress_setgoal(0); CEF->Fmods++; CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); return 0; } // worker thread void * blur_graduated_wthread(void *arg) { using namespace blur_graduated_names; int index = *((int *) arg); int ii, jj, npix, Fend; int px, py, dx, dy; float blend; float *pix1, *pix3, *pixN; float R1, G1, B1, R3, G3, B3, R9, G9, B9; int rad, blurrad, con; int pskip = 0; while (true) // loop all edit pixels { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; if (Fescape) return 0; // user kill ii = py * Eww + px; if (pixcon[ii] > con_limit) { if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } continue; } pix1 = PXMpix(E1pxm,px,py); // source pixel pix3 = PXMpix(E3pxm,px,py); // target pixel R1 = pix1[0]; // blur center pixel G1 = pix1[1]; B1 = pix1[2]; R3 = R9 = pix3[0]; // current output RGB G3 = G9 = pix3[1]; B3 = B9 = pix3[2]; R9 = R3; G9 = G3; B9 = B3; npix = 1; blurrad = 1.0 + radius * (con_limit - pixcon[ii]) / con_limit; // blur radius for pixel, 1 - blur_radius for (ii = 0; ii < 2000; ii++) // loop angle around center pixel { jj = pixseq_angle[ii]; // 1st pixel for angle step ii if (jj == 9999) break; // none, end of angle loop while (true) // loop pixels from center to radius { rad = pixseq_rad[jj]; // next pixel step radius if (rad > blurrad) break; // stop here if beyond blur radius dx = pixseq_dx[jj]; // next pixel step px/py dy = pixseq_dy[jj]; if (px+dx < 0 || px+dx > Eww-1) break; // stop here if off the edge if (py+dy < 0 || py+dy > Ehh-1) break; pixN = PXMpix(E1pxm,px+dx,py+dy); con = 255 * (1.0 - PIXmatch(pix1,pixN)); if (con > con_limit) break; R9 += pixN[0]; // add pixel RGB values G9 += pixN[1]; B9 += pixN[2]; npix++; jj++; } } R9 = R9 / npix; // average pixel values G9 = G9 / npix; B9 = B9 / npix; RGBfix(R9,G9,B9); if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; // increase edit G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; if (! Fpaintedits) { if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } } return 0; } /**************************************************************************************/ // Blur Background // Blur the image outside of a selected area or areas. // Blur increases with distance from selected area edges. namespace blur_background_names { int conrad, incrad; // constant or increasing blur int conbrad; // constant blur radius int minbrad; // min. blur radius int maxbrad; // max. blur radius int maxdist; // max. area edge distance editfunc EFblurbg; } void m_blur_background(GtkWidget *, ch *menu) { using namespace blur_background_names; int blur_background_dialog_event(zdialog* zd, ch *event); void * blur_background_thread(void *); printf("m_blur_background \n"); EFblurbg.menufunc = m_blur_background; EFblurbg.menuname = "Blur Background"; // function name EFblurbg.Farea = 2; // select area usable (required) EFblurbg.threadfunc = blur_background_thread; // thread function if (! edit_setup(EFblurbg)) return; // setup edit minbrad = 10; // defaults maxbrad = 20; conbrad = 10; conrad = 1; incrad = 0; /*** ____________________________________ | Blur Background | | | | [x] constant blur [ 20 ] | | | | [x] increase blur with distance | | min. blur radius [ 20 ] | | max. blur radius [ 90 ] | | | | [Apply] [OK] [X] | |____________________________________| ***/ zdialog *zd = zdialog_new(TX("Blur Background"),Mwin,TX("Apply"),"OK","X",null); CEF->zd = zd; zdialog_add_widget(zd,"hbox","hbcon","dialog",0,"space=5"); zdialog_add_widget(zd,"check","conrad","hbcon",TX("constant blur"),"space=3"); zdialog_add_widget(zd,"zspin","conbrad","hbcon","1|100|1|10","space=8"); zdialog_add_widget(zd,"hbox","hbinc","dialog"); zdialog_add_widget(zd,"check","incrad","hbinc",TX("increase blur with distance"),"space=3"); zdialog_add_widget(zd,"hbox","hbmin","dialog"); zdialog_add_widget(zd,"label","labmin","hbmin",TX("min. blur radius"),"space=8"); zdialog_add_widget(zd,"zspin","minbrad","hbmin","0|100|1|10","space=3"); zdialog_add_widget(zd,"hbox","hbmax","dialog"); zdialog_add_widget(zd,"label","labmax","hbmax",TX("max. blur radius"),"space=8"); zdialog_add_widget(zd,"zspin","maxbrad","hbmax","1|100|1|20","space=3"); zdialog_stuff(zd,"conrad",conrad); zdialog_stuff(zd,"incrad",incrad); zdialog_resize(zd,300,0); zdialog_load_inputs(zd); // restore previous inputs zdialog_run(zd,blur_background_dialog_event,"save"); // run dialog - parallel if (sa_stat != sa_stat_fini) m_select_area(0,0); // start select area dialog return; } // dialog event and completion function int blur_background_dialog_event(zdialog *zd, ch *event) // blur_background dialog event function { using namespace blur_background_names; if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (zd->zstat) { if (zd->zstat == 1) // [apply] { zd->zstat = 0; // keep dialog active if (sa_stat != sa_stat_fini) { zmessageACK(Mwin,TX("no active Select Area")); m_select_area(0,0); return 1; } if (incrad && ! sa_edgecalc_done) // if increasing blur radius, sa_edgecalc(); // calc. area edge distances sa_show(0,0); edit_reset(); thread_signal(); return 1; } else if (zd->zstat == 2) { // [OK] if (zd_sela) zdialog_send_event(zd_sela,"done"); // kill select area dialog if (conrad) edit_addhist("rad:%d",conrad); if (incrad) edit_addhist("rad:%d-%d",minbrad,maxbrad); edit_done(0); } else { // discard edit edit_cancel(0); if (zd_sela) zdialog_send_event(zd_sela,"done"); // kill select area dialog } return 1; } if (zstrstr("conrad incrad",event)) { zdialog_stuff(zd,"conrad",0); zdialog_stuff(zd,"incrad",0); zdialog_stuff(zd,event,1); } zdialog_fetch(zd,"conrad",conrad); zdialog_fetch(zd,"incrad",incrad); zdialog_fetch(zd,"conbrad",conbrad); zdialog_fetch(zd,"minbrad",minbrad); zdialog_fetch(zd,"maxbrad",maxbrad); return 1; } // thread function void * blur_background_thread(void *) { using namespace blur_background_names; void * blur_background_wthread(void *arg); // worker thread int ii, dist; if (incrad && sa_edgecalc_done) { // if increasing blur radius, maxdist = 0; // get max. area edge distance for (ii = 0; ii < Eww * Ehh; ii++) { dist = sa_pixmap[ii]; if (dist > maxdist) maxdist = dist; } } progress_setgoal(sa_Npixel); // initz. progress counter Fescape = 0; do_wthreads(blur_background_wthread,NSMP); // worker threads progress_setgoal(0); CEF->Fmods++; // image modified CEF->Fsaved = 0; // not saved Fpaint2(); // update window return 0; } // worker thread function void * blur_background_wthread(void *arg) { using namespace blur_background_names; int index = *((int *) (arg)); int ii, rad = 0, dist, npix; int px, py, qx, qy; float *pix1, *pix3; float red, green, blue, F; int pskip = 1; for (py = index; py < Ehh; py += NSMP) // loop all image pixels for (px = 0; px < Eww; px++) { if (Fescape) break; // cancel edit ii = py * Eww + px; dist = sa_pixmap[ii]; // area edge distance if (! dist) continue; // pixel outside the area if (conrad) rad = conbrad; // use constant blur radius if (incrad) { // use increasing blur radius if (! sa_edgecalc_done) return 0; // depending on edge distance rad = minbrad + (maxbrad - minbrad) * dist / maxdist; } npix = 0; red = green = blue = 0; for (qy = py-rad; qy <= py+rad; qy++) // average surrounding pixels for (qx = px-rad; qx <= px+rad; qx++) { if (qy < 0 || qy > Ehh-1) continue; if (qx < 0 || qx > Eww-1) continue; ii = qy * Eww + qx; if (! sa_pixmap[ii]) continue; pix1 = PXMpix(E1pxm,qx,qy); red += pix1[0]; green += pix1[1]; blue += pix1[2]; npix++; } F = 0.999 / npix; red = F * red; // blurred pixel RGB green = F * green; blue = F * blue; pix3 = PXMpix(E3pxm,px,py); pix3[0] = red; pix3[1] = green; pix3[2] = blue; if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; // exit thread } /**************************************************************************************/ // image noise reduction namespace denoise_names { cch *dn_method; int dn_radius; int dn_limit; float dn_areas; // 26.8 int noise_histogram[3][256]; ch edit_hist[200]; zdialog *zd_denoise_measure; GtkWidget *denoise_measure_drawwin; editfunc EFdenoise; } // menu function void m_denoise(GtkWidget *, ch *menu) { using namespace denoise_names; int denoise_dialog_event(zdialog *zd, ch *event); void * denoise_thread(void *); ch *tip = TX("Apply repeatedly while watching the image."); F1_help_topic = TX("DENOISE"); printf("m_denoise \n"); EFdenoise.menuname = "Denoise"; EFdenoise.menufunc = m_denoise; EFdenoise.Farea = 2; // select area usable EFdenoise.Fpaintedits = 1; // use with paint edits OK EFdenoise.Fscript = 0; // scripting NOT supported 25.1 EFdenoise.threadfunc = denoise_thread; // thread function if (! edit_setup(EFdenoise)) return; // setup edit E8pxm = PXM_copy(E0pxm); // initial input image /*** __________________________________________________ | Noise Reduction | | Apply repeatedly while watching the image. | | | | Radius [ 2 ] scope of neighbor pixels | | Limit [_10_] ignore differences above limit | | Dark Areas [________________________] all areas | // 26.8 | | | [median] pixel = median of all neighbors | | [smooth] pixel = mean of best match neighbors | | | | [Measure] [Reset] [OK] [X] | |__________________________________________________| ***/ zdialog *zd = zdialog_new(TX("Noise Reduction"),Mwin,"Measure",TX("Reset"),"OK","X",null); EFdenoise.zd = zd; zdialog_add_widget(zd,"label","labtip","dialog",tip,"space=3"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbrad","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labrad","hbrad",TX("Radius"),"space=3"); zdialog_add_widget(zd,"zspin","dn_radius","hbrad","1|5|1|1","size=2|space=3"); zdialog_add_widget(zd,"label","labrad","hbrad",TX("scope of neighbor pixels"),"space=3"); zdialog_add_widget(zd,"hbox","hblim","dialog",0,"space=2"); zdialog_add_widget(zd,"label","lablim","hblim",TX("Limit"),"space=3"); zdialog_add_widget(zd,"zspin","dn_limit","hblim","1|255|1|100","size=4|space=3"); zdialog_add_widget(zd,"label","lablim","hblim",TX("ignore differences above limit"),"space=3"); zdialog_add_widget(zd,"hbox","hbareas","dialog",0,"space=2"); // 26.8 zdialog_add_widget(zd,"label","labdark","hbareas",TX("Dark Areas"),"space=3"); zdialog_add_widget(zd,"hscale","areas","hbareas","0|1|0.01|1","expand|space=3"); zdialog_add_widget(zd,"label","laball","hbareas",TX("All Areas"),"space=3"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=8"); zdialog_add_widget(zd,"hbox","hbmed","dialog",0,"space=2"); zdialog_add_widget(zd,"button","median","hbmed",TX("median"),"space=3"); zdialog_add_widget(zd,"label","labmed","hbmed",TX("pixel = median of all neighbors"),"space=3"); zdialog_add_widget(zd,"hbox","hbsmoo","dialog",0,"space=2"); zdialog_add_widget(zd,"button","smooth","hbsmoo",TX("smooth"),"space=3"); zdialog_add_widget(zd,"label","labsmo","hbsmoo",TX("pixel = mean of best match neighbors"),"space=3"); zdialog_load_inputs(zd); zdialog_run(zd,denoise_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int denoise_dialog_event(zdialog * zd, ch *event) // reworked for script files { using namespace denoise_names; void denoise_measure(); if (strmatch(event,"apply")) zd->zstat = 3; // from script file if (strmatch(event,"done")) zd->zstat = 3; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 4; // from f_open() zdialog_fetch(zd,"dn_radius",dn_radius); // get user inputs zdialog_fetch(zd,"dn_limit",dn_limit); zdialog_fetch(zd,"areas",dn_areas); // 26.8 if (strstr("median smooth",event)) { // get denoise method if (strmatch(event,"median")) dn_method = "median"; // and execute one iteration if (strmatch(event,"smooth")) dn_method = "smooth"; thread_signal(); return 1; } if (strmatch(event,"paint")) { // mouse paint thread_signal(); return 1; } if (zd->zstat) { if (zd->zstat == 1) { // [measure] zd->zstat = 0; // keep dialog active denoise_measure(); return 1; } if (zd->zstat == 2) { // [reset] PXM_copy(E0pxm,E8pxm); // restore input image edit_reset(); // undo edits zd->zstat = 0; // keep dialog active return 1; } if (zd->zstat == 3) { // [OK] commit edit edit_addhist(edit_hist); // edit params > edit hist edit_done(0); } else edit_cancel(0); // discard edit PXM_free(E8pxm); // free input image if (zd_denoise_measure) { // kill measure dialog freeMouse(); zdialog_free(zd_denoise_measure); zd_denoise_measure = 0; } return 1; } return 1; } // image noise reduction thread void * denoise_thread(void *) { using namespace denoise_names; void * denoise_median_wthread(void *arg); void * denoise_smooth_wthread(void *arg); if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag if (strmatch(dn_method,"median")) { if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // initz. progress counter else progress_setgoal(Eww * Ehh); get_edit_pixels_init(NSMP,dn_radius); // initz. pixel loop do_wthreads(denoise_median_wthread,NSMP); // median denoise PXM_copy(E3pxm,E8pxm); // E3 (output) --> E8 (input for next) snprintf(edit_hist,200,"median rad:%d",dn_radius); // metadata edit params > edit hist } if (strmatch(dn_method,"smooth")) { if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // initz. progress counter else progress_setgoal(Eww * Ehh); get_edit_pixels_init(NSMP,dn_radius); // initz. pixel loop do_wthreads(denoise_smooth_wthread,NSMP); // smooth denoise PXM_copy(E3pxm,E8pxm); // E3 (output) --> E8 (input for next) snprintf(edit_hist,200,"smooth rad:%d",dn_radius); // metadata edit params > edit hist } progress_setgoal(0); CEF->Fmods++; CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } // Median: // Use median RGB brightness for pixels within radius void * denoise_median_wthread(void *arg) { using namespace denoise_names; int index = *((int *) arg); int ii, rgb, Fend; int px, py, dx, dy, rad, samp; int nc = E3pxm->nc; float *pix8, *pix3, *pixN, pix9[3]; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float blend, median; float diff, brite; int16 rgbhist[256]; int rgbsum; int pskip = 0; rad = dn_radius; samp = 2 * rad + 1; // get sample area samp = samp * samp; while (true) { if (Fescape) return 0; // user kill Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix8 = PXMpix(E8pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix9[0] = pix8[0]; G1 = pix9[1] = pix8[1]; B1 = pix9[2] = pix8[2]; R3 = pix3[0]; G3 = pix3[1]; B3 = pix3[2]; for (rgb = 0; rgb < 3; rgb++) // loop all RGB colors { memset(rgbhist,0,256*sizeof(int16)); // clear rgb histogram rgbsum = 0; for (dy = -rad; dy <= rad; dy++) // loop surrounding pixels for (dx = -rad; dx <= rad; dx++) // get RGB values { pixN = pix8 + (dy * Eww + dx) * nc; // make histogram of RGB values ii = pixN[rgb]; rgbhist[ii]++; } for (ii = 0; ii < 256; ii++) // sum histogram from 0 to 255 { rgbsum += rgbhist[ii]; // break when half of RGB values if (rgbsum > samp / 2) break; // have been counted } median = ii; // median rgb for surrounding pixels if (abs(median - pix9[rgb]) > dn_limit) continue; // ignore if large difference pix9[rgb] = median; // moderated pixel rgb diff = pix9[rgb] - pix8[rgb]; // rgb change 26.8 brite = pix8[rgb] / 256.0; // rgb brightness 0..1 diff = diff * (1.0 - brite * (1.0 - dn_areas)); // moderate Func(brightness,areas) pix9[rgb] = pix8[rgb] + diff; // moderated rgb } R9 = pix9[0]; G9 = pix9[1]; B9 = pix9[2]; if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { // increase edit R3 = blend * R9 + (1-blend) * R3; G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { // decrease edit R3 = -blend * R1 + (1+blend) * R3; G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; } // smooth: // For each pixel, find two best-match opposing neighbors. // Set pixel RGB values to mean of best neighbor RGB values. void * denoise_smooth_wthread(void *arg) { using namespace denoise_names; int index = *((int *) arg); int Fend, rad, rgb; int px, py, px1, py1, px2, py2; float *pix8, *pix3; float *pixA, *pixB; float *pix91, *pix92, pix9[3]; float blend; float diff, brite; int bmpx, bmpy; float diffA, diffB, diffAB, mindiff, mrgb; int pskip = 0; rad = dn_radius; while (true) // loop all image pixels { if (Fescape) return 0; // user kill Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix8 = PXMpix(E8pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel for (rgb = 0; rgb < 3; rgb++) // loop each RGB color { mindiff = 999; // remember best matching pixel pair bmpx = bmpy = 0; py1 = -rad; // py1 = top row py2 = +rad; // py2 = bottom row for (px1 = -rad; px1 <= +rad; px1++) // px1/py1 = top row pixel { px2 = -px1; // px2/py2 = opposite bottom row pixel pixA = PXMpix(E8pxm,px+px1,py+py1); // top row pixel pixB = PXMpix(E8pxm,px+px2,py+py2); // bottom row pixel diffA = fabsf(pixA[rgb] - pix8[rgb]); // diff from pix8 diffB = fabsf(pixB[rgb] - pix8[rgb]); // diff from pix8 diffAB = diffA + diffB; // match both with px/py if (diffAB <= mindiff) { mindiff = diffAB; // remember best match bmpx = px1; bmpy = py1; } } px1 = -rad; // px1 = left col px2 = +rad; // px2 = right col for (py1 = -rad; py1 <= +rad; py1++) // px1/py1 = left col { py2 = -py1; // px2/py2 = opposite on right col pixA = PXMpix(E8pxm,px+px1,py+py1); // left col pixel pixB = PXMpix(E8pxm,px+px2,py+py2); // right col pixel diffA = fabsf(pixA[rgb] - pix8[rgb]); // diff from pix8 diffB = fabsf(pixB[rgb] - pix8[rgb]); // diff from pix8 diffAB = diffA + diffB; // match both with px/py if (diffAB <= mindiff) { mindiff = diffAB; // remember best match bmpx = px1; bmpy = py1; } } px1 = bmpx; // best matching pixel pair py1 = bmpy; // (relative to px/py) px2 = -px1; py2 = -py1; px1 += px; // absolute values py1 += py; px2 += px; py2 += py; pix91 = PXMpix(E8pxm,px1,py1); // opposing pixel pair pix92 = PXMpix(E8pxm,px2,py2); mrgb = 0.5 * (pix91[rgb] + pix92[rgb]); // mean RGB value if (abs(pix8[rgb] - mrgb) < dn_limit) { // if difference within limit diff = mrgb - pix8[rgb]; // rgb change 26.8 brite = pix8[rgb] / 256.0; // rgb brightness 0..1 diff = diff * (1.0 - brite * (1.0 - dn_areas)); // moderate Func(brightness,areas) pix9[rgb] = pix8[rgb] + diff; // moderate pixel } else pix9[rgb] = pix8[rgb]; // no moderation if (Fpaintedits) { // gradual edit within mouse circle if (blend > 0) pix3[rgb] = blend * pix9[rgb] + (1-blend) * pix3[rgb]; else if (blend < 0) pix3[rgb] = -blend * pix8[rgb] + (1+blend) * pix3[rgb]; } else // full edit for image or area pix3[rgb] = blend * pix9[rgb] + (1-blend) * pix8[rgb]; } if (++pskip == 10) { // every 10th pixel 26.0 pskip = 0; // (reduce call overhead) progress_addvalue(index,10); // track progress } } return 0; } // dialog to measure noise at mouse position void denoise_measure() { using namespace denoise_names; int denoise_measure_dialog_event(zdialog *zd, ch *event); GtkWidget *frdraw, *drawwin; ch text[100]; ch *title = TX("Measure Noise"); ch *mousemess = TX("Move mouse in a monotone image area."); ch *mformat = TX("mean RGB: %5.0f %5.0f %5.0f"); ch *nformat = TX("mean noise: %5.2f %5.2f %5.2f"); /*** _______________________________________ | Measure Noise | | | | Move mouse in a monotone image area. | | _____________________________________ | || || || || ||.....................................|| || || || || ||_____________________________________|| drawing area || || || || ||.....................................|| || || ||_____________________________________|| | center edge | | | | mean RGB: 100 150 200 | | mean noise: 1.51 1.23 0.76 | | | | [X] | |_______________________________________| ***/ if (zd_denoise_measure) return; zdialog *zd = zdialog_new(title,Mwin,"X",null); // measure noise dialog zd_denoise_measure = zd; zdialog_add_widget(zd,"label","clab","dialog",mousemess,"space=5"); zdialog_add_widget(zd,"frame","frdraw","dialog",0,"expand"); // frame for drawing areas frdraw = zdialog_gtkwidget(zd,"frdraw"); drawwin = gtk_drawing_area_new(); // drawing area gtk_container_add(GTK_CONTAINER(frdraw),drawwin); denoise_measure_drawwin = drawwin; zdialog_add_widget(zd,"hbox","hbce","dialog"); zdialog_add_widget(zd,"label","labcen","hbce",TX("Center"),"space=3"); zdialog_add_widget(zd,"label","space","hbce",0,"expand"); zdialog_add_widget(zd,"label","labend","hbce",TX("Edge"),"space=5"); snprintf(text,100,mformat,0.0,0.0,0.0); // mean RGB: 0 0 0 zdialog_add_widget(zd,"label","mlab","dialog",text); snprintf(text,100,nformat,0.0,0.0,0.0); // mean noise: 0.00 0.00 0.00 zdialog_add_widget(zd,"label","nlab","dialog",text); zdialog_resize(zd,300,300); zdialog_run(zd,denoise_measure_dialog_event,"save"); // run dialog return; } // dialog event and completion function int denoise_measure_dialog_event(zdialog *zd, ch *event) { using namespace denoise_names; void denoise_measure_mousefunc(); if (strmatch(event,"focus")) takeMouse(denoise_measure_mousefunc,dragcursor); // connect mouse function if (zd->zstat) { freeMouse(); // free mouse zdialog_free(zd); zd_denoise_measure = 0; } return 1; } // mouse function // sample noise where the mouse is clicked // assumed: mouse is on a monotone image area void denoise_measure_mousefunc() { using namespace denoise_names; GtkWidget *drawwin; GdkWindow *Mgdkwin; cairo_t *cr; zdialog *zd = zd_denoise_measure; ch *mformat = " mean RGB: %5.0f %5.0f %5.0f "; ch *nformat = " mean noise: %5.2f %5.2f %5.2f "; ch text[100]; int mx, my, px, py, qx, qy, Npix; float *pix3, R; float Rm, Gm, Bm, Rn, Gn, Bn, Ro, Go, Bo; int dww, dhh; float max, xscale, yscale; float rx, ry; float Noise[400][3]; double dashes[2] = { 1, 3 }; if (! E3pxm) return; if (! zd) return; if (Fbusy()) return; // wait if denoise in progress mx = Mxposn; // mouse position my = Myposn; if (mx < 13 || mx >= Eww-13) return; // must be 12+ pixels from image edge if (my < 13 || my >= Ehh-13) return; draw_mousecircle(Mxposn,Myposn,10,0,0); // draw mouse circle, radius 10 Npix = 0; Rm = Gm = Bm = 0; for (py = my-10; py <= my+10; py++) // loop pixels within mouise circle for (px = mx-10; px <= mx+10; px++) // (approx. 314 pixels) { R = sqrtf((px-mx)*(px-mx) + (py-my)*(py-my)); // distance from center if (R > 10) continue; pix3 = PXMpix(E3pxm,px,py); // get pixel RGB values Rm += pix3[0]; // accumulate Gm += pix3[1]; Bm += pix3[2]; Npix++; } Rm = Rm / Npix; // mean RGB values Gm = Gm / Npix; // for pixels within mouse Bm = Bm / Npix; Npix = 0; Rn = Gn = Bn = 0; for (py = my-10; py <= my+10; py++) // loop pixels within mouise circle for (px = mx-10; px <= mx+10; px++) // (approx. 314 pixels) { R = sqrtf((px-mx)*(px-mx) + (py-my)*(py-my)); // distance from center if (R > 10) continue; Ro = Go = Bo = 0; for (qy = py-2; qy <= py+2; qy++) // for each pixel, get mean RGB for (qx = px-2; qx <= px+2; qx++) // for 5x5 surrounding pixels { pix3 = PXMpix(E3pxm,qx,qy); Ro += pix3[0]; Go += pix3[1]; Bo += pix3[2]; } Ro = Ro / 25; // mean RGB for surrounding pixels Go = Go / 25; Bo = Bo / 25; pix3 = PXMpix(E3pxm,px,py); // get pixel RGB noise levels Noise[Npix][0] = pix3[0] - Ro; // noise = pixel value - mean Noise[Npix][1] = pix3[1] - Go; Noise[Npix][2] = pix3[2] - Bo; Rn += fabsf(Noise[Npix][0]); // accumulate absolute values Gn += fabsf(Noise[Npix][1]); Bn += fabsf(Noise[Npix][2]); Npix++; } Rn = Rn / Npix; // mean RGB noise levels Gn = Gn / Npix; // for pixels within mouse Bn = Bn / Npix; snprintf(text,100,mformat,0.0,0.0,0.0); // clear dialog data zdialog_stuff(zd,"mlab",text); snprintf(text,100,nformat,0.0,0.0,0.0); zdialog_stuff(zd,"nlab",text); snprintf(text,100,mformat,Rm,Gm,Bm); // mean RGB: NNN NNN NNN zdialog_stuff(zd,"mlab",text); snprintf(text,100,nformat,Rn,Gn,Bn); // mean noise: N.NN N.NN N.NN zdialog_stuff(zd,"nlab",text); max = Rn; if (Gn > max) max = Gn; if (Bn > max) max = Bn; drawwin = denoise_measure_drawwin; Mgdkwin = gtk_widget_get_window(drawwin); // GDK drawing window dww = gtk_widget_get_allocated_width(drawwin); // drawing window size dhh = gtk_widget_get_allocated_height(drawwin); xscale = dww / 10.0; // x scale: 0 to max radius yscale = dhh / 20.0; // y scale: -10 to +10 noise level cr = draw_context_create(Mgdkwin,draw_context); cairo_set_source_rgb(cr,1,1,1); // white background cairo_paint(cr); cairo_set_source_rgb(cr,0,0,0); // paint black cairo_set_line_width(cr,2); // center line cairo_set_dash(cr,dashes,0,0); cairo_move_to(cr,0,0.5*dhh); cairo_line_to(cr,dww,0.5*dhh); cairo_stroke(cr); cairo_set_dash(cr,dashes,2,0); // dash lines at -5 and +5 cairo_move_to(cr,0,0.25*dhh); cairo_line_to(cr,dww,0.25*dhh); cairo_move_to(cr,0,0.75*dhh); cairo_line_to(cr,dww,0.75*dhh); cairo_stroke(cr); cairo_set_source_rgb(cr,1,0,0); Npix = 0; for (py = my-10; py <= my+10; py++) // loop pixels within mouise circle for (px = mx-10; px <= mx+10; px++) // (approx. 314 pixels) { R = sqrtf((px-mx)*(px-mx) + (py-my)*(py-my)); // distance from center if (R > 10) continue; Rn = Noise[Npix][0]; // RED noise rx = R * xscale; // px, 0 to dww ry = 0.5 * dhh - Rn * yscale; // red py, 0 to dhh cairo_move_to(cr,rx,ry); cairo_arc(cr,rx,ry,1,0,2*PI); Npix++; } cairo_stroke(cr); cairo_set_source_rgb(cr,0,1,0); Npix = 0; for (py = my-10; py <= my+10; py++) // same for GREEN noise for (px = mx-10; px <= mx+10; px++) { R = sqrtf((px-mx)*(px-mx) + (py-my)*(py-my)); if (R > 10) continue; Gn = Noise[Npix][1]; rx = R * xscale; ry = 0.5 * dhh - Gn * yscale; cairo_move_to(cr,rx,ry); cairo_arc(cr,rx,ry,1,0,2*PI); Npix++; } cairo_stroke(cr); cairo_set_source_rgb(cr,0,0,1); Npix = 0; for (py = my-10; py <= my+10; py++) // same for BLUE noise for (px = mx-10; px <= mx+10; px++) { R = (px-mx)*(px-mx) + (py-my)*(py-my); if (R > 100) continue; R = 0.1 * R; Bn = Noise[Npix][2]; rx = R * xscale; ry = 0.5 * dhh - Bn * yscale; cairo_move_to(cr,rx,ry); cairo_arc(cr,rx,ry,1,0,2*PI); Npix++; } cairo_stroke(cr); draw_context_destroy(draw_context); return; } /**************************************************************************************/ // Defog - remove fog/haze from an image or selected areas namespace defog_names { editfunc EFdefog; float minusfog; // fog reduction, 0 - 1 float plusbrite; // brightness addition, 0 - 1 float minusblue; // blue attenuation, 0 - 1 } // menu function void m_defog(GtkWidget *, ch *menu) // rewrite 25.0 { using namespace defog_names; int defog_dialog_event(zdialog* zd, ch *event); void defog_curvedit(int spc); void * defog_thread(void *); F1_help_topic = TX("DEFOG"); printf("m_defog \n"); EFdefog.menuname = "Defog"; EFdefog.menufunc = m_defog; EFdefog.FprevReq = 1; // use preview EFdefog.Farea = 2; // select area usable EFdefog.Fpaintedits = 1; // use with paint edits OK EFdefog.Fscript = 1; // scripting supported EFdefog.threadfunc = defog_thread; if (! edit_setup(EFdefog)) return; // setup edit /*** ______________________________________ | Reduce Fog/Haze | | | | - fog/haze ========[]============= | 0 - 1 minusfog | + bright ==============[]========= | 0 - 1 plusbrite | - blue ==========[]============== | 0 - 1 minusblue | | | [Reset] [OK] [X] | |______________________________________| ***/ zdialog *zd = zdialog_new(TX("Reduce Fog/Haze"),Mwin,TX("Reset"),"OK","X",null); EFdefog.zd = zd; zdialog_add_widget(zd,"hbox","hbdefog","dialog"); // defog slider zdialog_add_widget(zd,"label","labdefog","hbdefog",TX("- fog/haze"),"space=8"); zdialog_add_widget(zd,"hscale","minusfog","hbdefog","0|1|0.01|0","expand"); zdialog_add_widget(zd,"hbox","hbbrite","dialog"); // brightness slider zdialog_add_widget(zd,"label","labbrite","hbbrite",TX("+ bright"),"space=8"); zdialog_add_widget(zd,"hscale","plusbrite","hbbrite","0|1|0.01|0","expand"); zdialog_add_widget(zd,"hbox","hbblue","dialog"); // reduce blue slider zdialog_add_widget(zd,"label","labblue","hbblue",TX("- blue"),"space=8"); zdialog_add_widget(zd,"hscale","minusblue","hbblue","0|1|0.01|0","expand"); zdialog_resize(zd,300,0); zdialog_run(zd,defog_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int defog_dialog_event(zdialog *zd, ch *event) { using namespace defog_names; float Fapply = 0; if (strmatch(event,"focus")) return 1; zdialog_fetch(zd,"minusfog",minusfog); zdialog_fetch(zd,"plusbrite",plusbrite); // get dialog inputs zdialog_fetch(zd,"minusblue",minusblue); if (strstr("minusfog plusbrite minusblue",event)) Fapply = 1; // user input if (strmatch(event,"paint")) Fapply = 1; // mouse paint if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (strmatch(event,"apply")) { // from script Fapply = 1; zd->zstat = 2; } if (strmatch(event,"fullsize")) { // from select area edit_fullsize(); // get full size image if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } return 1; } if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active zdialog_stuff(zd,"minusfog",0); zdialog_stuff(zd,"plusbrite",0); // reset dialog inputs zdialog_stuff(zd,"minusblue",0); minusfog = plusbrite = minusblue = 0; edit_reset(); return 1; } if (zd->zstat == 2) // [OK] { freeMouse(); if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } edit_done(0); // complete edit return 1; } if (zd->zstat < 0 || zd->zstat > 2) { // cancel edit_cancel(0); return 1; } if (Fapply) thread_signal(); // update the image return 1; } // thread function void * defog_thread(void *arg) { using namespace defog_names; void * defog_wthread(void *); if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(defog_wthread,NSMP); CEF->Fmods++; // image3 modified CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } void * defog_wthread(void *arg) // worker thread function { using namespace defog_names; int index = *((int *) arg); int Fend, px, py; float blend; float *pix1, *pix3; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float maxrgb, maxrdc, actrdc, maxadd, actadd, ratio; while (true) // loop all edit pixels { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; // input RGB values G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; maxrgb = R1; if (G1 > maxrgb) maxrgb = G1; // get max. RGB value if (B1 > maxrgb) maxrgb = B1; if (maxrgb < 2) continue; // no fog by definition maxrdc = 255 - maxrgb; // max. possible white reduction actrdc = maxrdc * minusfog; // act. white reduction R9 = R1 - actrdc; // remove white from RGB G9 = G1 - actrdc; B9 = B1 - actrdc; maxadd = maxrdc; // max. brightness to add actadd = maxadd * plusbrite; // act. brightness add ratio = (maxrgb + actadd) / maxrgb; // new/old brightness ratio R9 = R9 * ratio; // add brightness to RGB G9 = G9 * ratio; B9 = B9 * ratio; B9 = B9 * (1.0 - minusblue); // reduce blue RGBfix(R9,G9,B9); // clamp 0-255 if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; // 0 - full edit for blend 0 - max. G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // red eye removal function namespace redeye_names { struct sredmem { // red-eye struct in memory ch type, space[3]; int cx, cy, ww, hh, rad, clicks; float thresh, tstep; }; sredmem redmem[100]; // store up to 100 red-eyes int Nredmem = 0, maxredmem = 100; editfunc EFredeye; #define PIXRED(pix) (25*pix[0]/(PIXBRIGHT(pix)+1)) // red brightness 0-100% } // menu function void m_redeyes(GtkWidget *, ch *menu) { using namespace redeye_names; int redeye_dialog_event(zdialog *zd, ch *event); void redeye_mousefunc(); ch *redeye_message = TX("Method 1:\n" "Left-click on red-eye to darken.\n" "Method 2:\n" "Drag down and right to enclose red-eye.\n" "Left-click on red-eye to darken.\n" "Undo red-eye:\n" "Right-click on red-eye."); F1_help_topic = TX("RED EYES"); printf("m_redeyes \n"); EFredeye.menufunc = m_redeyes; EFredeye.menuname = "Red Eyes"; EFredeye.Farea = 1; // select area ignored EFredeye.mousefunc = redeye_mousefunc; if (! edit_setup(EFredeye)) return; // setup edit zdialog *zd = zdialog_new(TX("Red Eye Reduction"),Mwin,"OK","X",null); EFredeye.zd = zd; zdialog_add_widget(zd,"label","lab1","dialog",redeye_message); zdialog_run(zd,redeye_dialog_event,"save"); // run dialog - parallel Nredmem = 0; takeMouse(redeye_mousefunc,dragcursor); // connect mouse function return; } // dialog event and completion callback function int redeye_dialog_event(zdialog *zd, ch *event) { using namespace redeye_names; void redeye_mousefunc(); if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (Nredmem > 0) { CEF->Fmods++; CEF->Fsaved = 0; } if (zd->zstat == 1) edit_done(0); // commit edit else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(redeye_mousefunc,dragcursor); // connect mouse function return 1; } int redeye_createF(int px, int py); // create 1-click red-eye (type F) int redeye_createR(int px, int py, int ww, int hh); // create robust red-eye (type R) void redeye_darken(int ii); // darken red-eye void redeye_distr(int ii); // build pixel redness distribution int redeye_find(int px, int py); // find red-eye at mouse position void redeye_remove(int ii); // remove red-eye at mouse position int redeye_radlim(int cx, int cy); // compute red-eye radius limit void redeye_mousefunc() { using namespace redeye_names; int ii, px, py, ww, hh; if (Nredmem == maxredmem) { zmessageACK(Mwin,TX("%d red-eye limit reached"),maxredmem); // too many red-eyes return; } if (LMclick) // left mouse click { px = Mxclick; // click position py = Myclick; if (px < 0 || px > Eww-1 || py < 0 || py > Ehh-1) // outside image area return; ii = redeye_find(px,py); // find existing red-eye if (ii < 0) ii = redeye_createF(px,py); // or create new type F redeye_darken(ii); // darken red-eye Fpaint2(); } if (RMclick) // right mouse click { px = Mxclick; // click position py = Myclick; ii = redeye_find(px,py); // find red-eye if (ii >= 0) redeye_remove(ii); // if found, remove Fpaint2(); } LMclick = RMclick = 0; if (Mxdrag || Mydrag) // mouse drag underway { px = Mxdown; // initial position py = Mydown; ww = Mxdrag - Mxdown; // increment hh = Mydrag - Mydown; Mxdrag = Mydrag = 0; if (ww < 2 && hh < 2) return; if (ww < 2) ww = 2; if (hh < 2) hh = 2; if (px < 1) px = 1; // keep within image area if (py < 1) py = 1; if (px + ww > Eww-1) ww = Eww-1 - px; if (py + hh > Ehh-1) hh = Ehh-1 - py; ii = redeye_find(px,py); // find existing red-eye if (ii >= 0) redeye_remove(ii); // remove it ii = redeye_createR(px,py,ww,hh); // create new red-eye type R } return; } // create type F redeye (1-click automatic) int redeye_createF(int cx, int cy) { using namespace redeye_names; int cx0, cy0, cx1, cy1, px, py, rad, radlim; int loops, ii; int Tnpix, Rnpix, R2npix; float rd, rcx, rcy, redpart; float Tsum, Rsum, R2sum, Tavg, Ravg, R2avg; float sumx, sumy, sumr; float *ppix; cx0 = cx; cy0 = cy; for (loops = 0; loops < 8; loops++) { cx1 = cx; cy1 = cy; radlim = redeye_radlim(cx,cy); // radius limit (image edge) Tsum = Tavg = Ravg = Tnpix = 0; for (rad = 0; rad < radlim-2; rad++) // find red-eye radius from (cx,cy) { Rsum = Rnpix = 0; R2sum = R2npix = 0; for (py = cy-rad-2; py <= cy+rad+2; py++) for (px = cx-rad-2; px <= cx+rad+2; px++) { rd = sqrt((px-cx)*(px-cx) + (py-cy)*(py-cy)); ppix = PXMpix(E3pxm,px,py); redpart = PIXRED(ppix); if (rd <= rad + 0.5 && rd > rad - 0.5) { // accum. redness at rad Rsum += redpart; Rnpix++; } else if (rd <= rad + 2.5 && rd > rad + 1.5) { // accum. redness at rad+2 R2sum += redpart; R2npix++; } } Tsum += Rsum; Tnpix += Rnpix; Tavg = Tsum / Tnpix; // avg. redness over 0-rad Ravg = Rsum / Rnpix; // avg. redness at rad R2avg = R2sum / R2npix; // avg. redness at rad+2 if (R2avg > Ravg || Ravg > Tavg) continue; if ((Ravg - R2avg) < 0.2 * (Tavg - Ravg)) break; // 0.1 --> 0.2 } sumx = sumy = sumr = 0; rad = int(1.2 * rad + 1); if (rad > radlim) rad = radlim; for (py = cy-rad; py <= cy+rad; py++) // compute center of gravity for for (px = cx-rad; px <= cx+rad; px++) // pixels within rad of (cx,cy) { rd = sqrt((px-cx)*(px-cx) + (py-cy)*(py-cy)); if (rd > rad + 0.5) continue; ppix = PXMpix(E3pxm,px,py); redpart = PIXRED(ppix); // weight by redness sumx += redpart * (px - cx); sumy += redpart * (py - cy); sumr += redpart; } rcx = cx + 1.0 * sumx / sumr; // new center of red-eye rcy = cy + 1.0 * sumy / sumr; if (fabsf(cx0 - rcx) > 0.6 * rad) break; // give up if big movement if (fabsf(cy0 - rcy) > 0.6 * rad) break; cx = int(rcx + 0.5); cy = int(rcy + 0.5); if (cx == cx1 && cy == cy1) break; // done if no change } radlim = redeye_radlim(cx,cy); if (rad > radlim) rad = radlim; ii = Nredmem++; // add red-eye to memory redmem[ii].type = 'F'; redmem[ii].cx = cx; redmem[ii].cy = cy; redmem[ii].rad = rad; redmem[ii].clicks = 0; redmem[ii].thresh = 0; return ii; } // create type R red-eye (drag an ellipse over red-eye area) int redeye_createR(int cx, int cy, int ww, int hh) { using namespace redeye_names; int rad, radlim; draw_mousearc(cx,cy,2*ww,2*hh,0,0); // draw ellipse around mouse pointer if (ww > hh) rad = ww; else rad = hh; radlim = redeye_radlim(cx,cy); if (rad > radlim) rad = radlim; int ii = Nredmem++; // add red-eye to memory redmem[ii].type = 'R'; redmem[ii].cx = cx; redmem[ii].cy = cy; redmem[ii].ww = 2 * ww; redmem[ii].hh = 2 * hh; redmem[ii].rad = rad; redmem[ii].clicks = 0; redmem[ii].thresh = 0; return ii; } // darken a red-eye and increase click count void redeye_darken(int ii) { using namespace redeye_names; int cx, cy, ww, hh, px, py, rad, clicks; float rd, thresh, tstep; ch type; float *ppix; type = redmem[ii].type; cx = redmem[ii].cx; cy = redmem[ii].cy; ww = redmem[ii].ww; hh = redmem[ii].hh; rad = redmem[ii].rad; thresh = redmem[ii].thresh; tstep = redmem[ii].tstep; clicks = redmem[ii].clicks++; if (thresh == 0) // 1st click { redeye_distr(ii); // get pixel redness distribution thresh = redmem[ii].thresh; // initial redness threshold tstep = redmem[ii].tstep; // redness step size draw_mousearc(0,0,0,0,1,0); // erase mouse ellipse } tstep = (thresh - tstep) / thresh; // convert to reduction factor thresh = thresh * pow(tstep,clicks); // reduce threshold by total clicks for (py = cy-rad; py <= cy+rad; py++) // darken pixels over threshold for (px = cx-rad; px <= cx+rad; px++) { if (type == 'R') { if (px < cx - ww/2) continue; if (px > cx + ww/2) continue; if (py < cy - hh/2) continue; if (py > cy + hh/2) continue; } rd = sqrt((px-cx)*(px-cx) + (py-cy)*(py-cy)); if (rd > rad + 0.5) continue; ppix = PXMpix(E3pxm,px,py); // set redness = threshold if (PIXRED(ppix) > thresh) ppix[0] = int(thresh * (0.65 * ppix[1] + 0.10 * ppix[2] + 1) / (25 - 0.25 * thresh)); } return; } // Build a distribution of redness for a red-eye. Use this information // to set initial threshold and step size for stepwise darkening. void redeye_distr(int ii) { using namespace redeye_names; int cx, cy, ww, hh, rad, px, py; int bin, npix, dbins[20], bsum, blim; float rd, maxred, minred, redpart, dbase, dstep; ch type; float *ppix; type = redmem[ii].type; cx = redmem[ii].cx; cy = redmem[ii].cy; ww = redmem[ii].ww; hh = redmem[ii].hh; rad = redmem[ii].rad; maxred = 0; minred = 100; for (py = cy-rad; py <= cy+rad; py++) for (px = cx-rad; px <= cx+rad; px++) { if (type == 'R') { if (px < cx - ww/2) continue; if (px > cx + ww/2) continue; if (py < cy - hh/2) continue; if (py > cy + hh/2) continue; } rd = sqrt((px-cx)*(px-cx) + (py-cy)*(py-cy)); if (rd > rad + 0.5) continue; ppix = PXMpix(E3pxm,px,py); redpart = PIXRED(ppix); if (redpart > maxred) maxred = redpart; if (redpart < minred) minred = redpart; } dbase = minred; dstep = (maxred - minred) / 19.99; for (bin = 0; bin < 20; bin++) dbins[bin] = 0; npix = 0; for (py = cy-rad; py <= cy+rad; py++) for (px = cx-rad; px <= cx+rad; px++) { if (type == 'R') { if (px < cx - ww/2) continue; if (px > cx + ww/2) continue; if (py < cy - hh/2) continue; if (py > cy + hh/2) continue; } rd = sqrt((px-cx)*(px-cx) + (py-cy)*(py-cy)); if (rd > rad + 0.5) continue; ppix = PXMpix(E3pxm,px,py); redpart = PIXRED(ppix); bin = int((redpart - dbase) / dstep); ++dbins[bin]; ++npix; } bsum = 0; blim = int(0.5 * npix); for (bin = 0; bin < 20; bin++) // find redness level for 50% of { // pixels within red-eye radius bsum += dbins[bin]; if (bsum > blim) break; } redmem[ii].thresh = dbase + dstep * bin; // initial redness threshold redmem[ii].tstep = dstep; // redness step (5% of range) return; } // find a red-eye (nearly) overlapping the mouse click position int redeye_find(int cx, int cy) { using namespace redeye_names; for (int ii = 0; ii < Nredmem; ii++) { if (cx > redmem[ii].cx - 2 * redmem[ii].rad && cx < redmem[ii].cx + 2 * redmem[ii].rad && cy > redmem[ii].cy - 2 * redmem[ii].rad && cy < redmem[ii].cy + 2 * redmem[ii].rad) return ii; // found } return -1; // not found } // remove a red-eye from memory void redeye_remove(int ii) { using namespace redeye_names; int cx, cy, rad, px, py; float *pix1, *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); cx = redmem[ii].cx; cy = redmem[ii].cy; rad = redmem[ii].rad; for (px = cx-rad; px <= cx+rad; px++) for (py = cy-rad; py <= cy+rad; py++) { pix1 = PXMpix(E1pxm,px,py); pix3 = PXMpix(E3pxm,px,py); memcpy(pix3,pix1,pcc); } for (ii++; ii < Nredmem; ii++) redmem[ii-1] = redmem[ii]; Nredmem--; draw_mousearc(0,0,0,0,1,0); // erase mouse ellipse return; } // compute red-eye radius limit: smaller of 100 and nearest image edge int redeye_radlim(int cx, int cy) { using namespace redeye_names; int radlim = 100; if (cx < 100) radlim = cx; if (Eww-1 - cx < 100) radlim = Eww-1 - cx; if (cy < 100) radlim = cy; if (Ehh-1 - cy < 100) radlim = Ehh-1 - cy; return radlim; } /**************************************************************************************/ // Smart Erase menu function // Replace pixels inside a mouse-selected area with pixels outside the area. namespace smarterase_names { editfunc EFsmarterase; } // menu function void m_smart_erase(GtkWidget *, ch *menu) { using namespace smarterase_names; int smart_erase_dialog_event(zdialog* zd, ch *event); ch *erase_message = TX("Drag mouse to select. Erase. Repeat. \n" "Click: extend selection to mouse."); F1_help_topic = TX("SMART ERASE"); printf("m_smart_erase \n"); EFsmarterase.menufunc = m_smart_erase; EFsmarterase.menuname = "Smart Erase"; EFsmarterase.Farea = 0; // select area deleted EFsmarterase.mousefunc = sa_mouse_select; // mouse function (uses select area method) if (! edit_setup(EFsmarterase)) return; // setup edit /*** _________________________________________ | Smart Erase | | | | Drag mouse to select. Erase. Repeat. | | Click: extend selection to mouse. | | | | Radius [ 10 ] Blur [ 1.5 ] | | [New Area] [Show] [Hide] [Erase] [Undo] | | | | [OK] [X] | |_________________________________________| ***/ zdialog *zd = zdialog_new(TX("Smart Erase"),Mwin,"OK","X",null); EFsmarterase.zd = zd; zdialog_add_widget(zd,"label","lab1","dialog",erase_message,"space=3"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labr","hb2",TX("Radius"),"space=5"); zdialog_add_widget(zd,"zspin","radius","hb2","1|30|1|10"); zdialog_add_widget(zd,"label","labb","hb2",TX("Blur"),"space=10"); zdialog_add_widget(zd,"zspin","blur","hb2","0|9|0.5|1"); zdialog_add_widget(zd,"hbox","hb3","dialog",0,"space=5"); zdialog_add_widget(zd,"button","newarea","hb3",TX("New Area"),"space=3"); zdialog_add_widget(zd,"button","show","hb3",TX("Show"),"space=3"); zdialog_add_widget(zd,"button","hide","hb3",TX("Hide"),"space=3"); zdialog_add_widget(zd,"button","erase","hb3",TX("Erase"),"space=3"); zdialog_add_widget(zd,"button","undo1","hb3",TX("Undo"),"space=3"); sa_clear(); // clear area if any sa_pixmap_create(); // allocate select area pixel maps sa_mode = sa_mode_mouse; // mode = select by mouse sa_stat = sa_stat_edit; // status = active edit sa_fww = E1pxm->ww; sa_fhh = E1pxm->hh; sa_searchrange = 1; // search within mouse radius sa_mouseradius = 10; // initial mouse select radius sa_lastx = sa_lasty = 0; // initz. for sa_mouse_select takeMouse(sa_mouse_select,0); // use select area mouse function sa_show(1,0); zdialog_run(zd,smart_erase_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion function int smart_erase_dialog_event(zdialog *zd, ch *event) { using namespace smarterase_names; void smart_erase_func(int mode); int smart_erase_blur(float radius); float radius; if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { sa_clear(); // clear select area freeMouse(); // disconnect mouse if (zd->zstat == 1) edit_done(0); // commit edit else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"radius")) zdialog_fetch(zd,"radius",sa_mouseradius); if (strmatch(event,"newarea")) { sa_clear(); sa_lastx = sa_lasty = 0; // forget last click sa_pixmap_create(); // allocate select area pixel maps sa_mode = sa_mode_mouse; // mode = select by mouse sa_stat = sa_stat_edit; // status = active edit sa_fww = E1pxm->ww; sa_fhh = E1pxm->hh; sa_show(1,0); takeMouse(sa_mouse_select,0); } if (strmatch(event,"show")) { sa_show(1,0); takeMouse(sa_mouse_select,0); } if (strmatch(event,"hide")) { sa_show(0,0); freeMouse(); } if (strmatch(event,"erase")) { // do smart erase sa_finish_auto(); // finish the area smart_erase_func(1); zdialog_fetch(zd,"blur",radius); // add optional blur if (radius > 0) smart_erase_blur(radius); sa_show(0,0); } if (strmatch(event,"undo1")) // dialog undo, undo last erase smart_erase_func(2); return 1; } // erase the area or restore last erased area // mode = 1 = erase, mode = 2 = restore void smart_erase_func(int mode) { using namespace smarterase_names; int px, py, npx, npy; int qx, qy, sx, sy, tx, ty; int ww, hh, ii, rad, inc, cc; int dist2, mindist2; float slope; ch *pmap; float *pix1, *pix3; int nc = E1pxm->nc, pcc = nc * sizeof(float); if (sa_stat != sa_stat_fini) return; // nothing selected if (! sa_validate()) return; // area invalid for curr. image file ww = E1pxm->ww; hh = E1pxm->hh; for (py = sa_miny; py < sa_maxy; py++) // undo all pixels in area for (px = sa_minx; px < sa_maxx; px++) { ii = py * ww + px; if (! sa_pixmap[ii]) continue; // pixel not selected pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel memcpy(pix3,pix1,pcc); } Fpaint2(); // update window if (mode == 2) return; // mode = undo, done cc = ww * hh; // allocate pixel done map pmap = (ch *) zmalloc(cc,"smart erase"); for (py = sa_miny; py < sa_maxy; py++) // loop all pixels in area for (px = sa_minx; px < sa_maxx; px++) { ii = py * ww + px; if (! sa_pixmap[ii]) continue; // pixel not selected if (pmap[ii]) continue; // pixel already done mindist2 = 999999; // find nearest edge npx = npy = 0; for (rad = 1; rad < 50; rad++) // 50 pixel limit { for (qx = px-rad; qx <= px+rad; qx++) // search within rad for (qy = py-rad; qy <= py+rad; qy++) { if (qx < 0 || qx >= ww) continue; // off image edge if (qy < 0 || qy >= hh) continue; ii = qy * ww + qx; if (sa_pixmap[ii]) continue; // within selected area dist2 = (px-qx) * (px-qx) + (py-qy) * (py-qy); // distance**2 to edge pixel if (dist2 < mindist2) { mindist2 = dist2; npx = qx; // save nearest edge pixel found npy = qy; } } if (rad * rad >= mindist2) break; // found edge, can quit now } if (! npx && ! npy) continue; // edge not found, should not happen qx = npx; // nearest edge pixel from px/py qy = npy; if (abs(qy - py) > abs(qx - px)) // line px/py to qx/qy is more { // vertical than horizontal slope = 1.0 * (qx - px) / (qy - py); if (qy > py) inc = 1; else inc = -1; for (sy = py; sy != qy; sy += inc) { // sx/sy = line from px/py to qx/qy sx = px + slope * (sy - py); ii = sy * ww + sx; if (pmap[ii]) continue; // skip done pixels pmap[ii] = 1; tx = qx + (qx - sx); // tx/ty = extended line from qx/qy ty = qy + (qy - sy); if (tx < 0) tx = 0; // don't go off edge if (tx > ww-1) tx = ww-1; if (ty < 0) ty = 0; if (ty > hh-1) ty = hh-1; pix1 = PXMpix(E1pxm,tx,ty); // copy pixel from tx/ty to sx/sy pix3 = PXMpix(E3pxm,sx,sy); // simplified memcpy(pix3,pix1,pcc); } } else // more horizontal than vertical { slope = 1.0 * (qy - py) / (qx - px); if (qx > px) inc = 1; else inc = -1; for (sx = px; sx != qx; sx += inc) { sy = py + slope * (sx - px); ii = sy * ww + sx; if (pmap[ii]) continue; pmap[ii] = 1; tx = qx + (qx - sx); ty = qy + (qy - sy); if (tx < 0) tx = 0; if (tx > ww-1) tx = ww-1; if (ty < 0) ty = 0; if (ty > hh-1) ty = hh-1; pix1 = PXMpix(E1pxm,tx,ty); pix3 = PXMpix(E3pxm,sx,sy); memcpy(pix3,pix1,pcc); } } } zfree(pmap); // free memory CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return; } // add blur to the erased area to help mask the side-effects int smart_erase_blur(float radius) { using namespace smarterase_names; int ii, px, py, dx, dy, adx, ady; float blur_weight[12][12]; // up to blur radius = 10 float rad, radflat2; float m, d, w, sum, weight; float red, green, blue; float *pix9, *pix3, *pixN; int nc = E3pxm->nc; if (sa_stat != sa_stat_fini) return 0; rad = radius - 0.2; radflat2 = rad * rad; for (dx = 0; dx < 12; dx++) // clear weights array for (dy = 0; dy < 12; dy++) blur_weight[dx][dy] = 0; for (dx = -rad-1; dx <= rad+1; dx++) // blur_weight[dx][dy] = no. of pixels for (dy = -rad-1; dy <= rad+1; dy++) // at distance (dx,dy) from center ++blur_weight[abs(dx)][abs(dy)]; m = sqrt(radflat2 + radflat2); // corner pixel distance from center sum = 0; for (dx = 0; dx <= rad+1; dx++) // compute weight of pixel for (dy = 0; dy <= rad+1; dy++) // at distance dx, dy { d = sqrt(dx*dx + dy*dy); w = (m + 1.2 - d) / m; w = w * w; sum += blur_weight[dx][dy] * w; blur_weight[dx][dy] = w; } for (dx = 0; dx <= rad+1; dx++) // make weights add up to 1.0 for (dy = 0; dy <= rad+1; dy++) blur_weight[dx][dy] = blur_weight[dx][dy] / sum; E9pxm = PXM_copy(E3pxm); // copy edited image for (py = sa_miny; py < sa_maxy; py++) // loop all pixels in area for (px = sa_minx; px < sa_maxx; px++) { ii = py * E1pxm->ww + px; if (! sa_pixmap[ii]) continue; // pixel not in area pix9 = PXMpix(E9pxm,px,py); // source pixel pix3 = PXMpix(E3pxm,px,py); // target pixel rad = radius; red = green = blue = 0; for (dy = -rad-1; dy <= rad+1; dy++) // loop neighbor pixels within radius for (dx = -rad-1; dx <= rad+1; dx++) { if (px+dx < 0 || px+dx >= Eww) continue; // omit pixels off edge if (py+dy < 0 || py+dy >= Ehh) continue; adx = abs(dx); ady = abs(dy); pixN = pix9 + (dy * Eww + dx) * nc; weight = blur_weight[adx][ady]; // weight at distance (dx,dy) red += pixN[0] * weight; // accumulate contributions green += pixN[1] * weight; blue += pixN[2] * weight; } pix3[0] = red; pix3[1] = green; pix3[2] = blue; } PXM_free(E9pxm); CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); // update window return 0; } /**************************************************************************************/ // remove halo function // drag mouse, slowly darken/brighten the brightest/darkest pixels within mouse circle namespace remove_halo_names { int mode = 1; // 1/2 = reduce halo / undo int Fbd; // 1/0 = bright / dark halo float Mrad; // mouse radius float Power; // power at center, edge editfunc EFremovehalo; } // menu function void m_remove_halo(GtkWidget *, ch *menu) { using namespace remove_halo_names; int remove_halo_dialog_event(zdialog* zd, ch *event); void remove_halo_mousefunc(); ch *mess1 = TX("left drag: reduce halo, right drag: undo"); F1_help_topic = TX("REMOVE HALO"); printf("m_remove_halo \n"); EFremovehalo.menufunc = m_remove_halo; EFremovehalo.menuname = "Remove Halo"; EFremovehalo.Farea = 1; // select area ignored EFremovehalo.mousefunc = remove_halo_mousefunc; // mouse function if (! edit_setup(EFremovehalo)) return; // setup edit /*** ____________________________________________ | Remove Halo | | | | left drag: reduce halo right drag: undo | | | | mouse radius [___] power [___] | | (o) bright halo (o) dark halo | | | | [OK] [X] | |____________________________________________| ***/ zdialog *zd = zdialog_new(TX("Remove Halo"),Mwin,"OK","X",null); EFremovehalo.zd = zd; zdialog_add_widget(zd,"label","labm","dialog",mess1,"space=5"); zdialog_add_widget(zd,"hbox","hb2","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labbr","hb2",TX("mouse radius"),"space=3"); zdialog_add_widget(zd,"zspin","Mrad","hb2","1|100|1|10"); zdialog_add_widget(zd,"label","space","hb2","","space=8"); zdialog_add_widget(zd,"label","labsc","hb2",TX("power"),"space=3"); zdialog_add_widget(zd,"zspin","Power","hb2","0|100|1|100"); zdialog_add_widget(zd,"hbox","hb3","dialog",0,"space=2"); zdialog_add_widget(zd,"radio","bright","hb3",TX("bright halo"),"space=3"); zdialog_add_widget(zd,"radio","dark","hb3",TX("dark halo"),"space=8"); zdialog_run(zd,remove_halo_dialog_event,"save"); // run dialog, parallel zdialog_send_event(zd,"Mrad"); // initialize mouse params zdialog_stuff(zd,"bright",1); // initz. bright halo mode Fbd = 1; mode = 1; // initz. paint mode takeMouse(remove_halo_mousefunc,drawcursor); // connect mouse function return; } // dialog event and completion callback function int remove_halo_dialog_event(zdialog *zd, ch *event) { using namespace remove_halo_names; void remove_halo_mousefunc(); if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat == 1) edit_done(0); // commit edit else edit_cancel(0); // discard edit return 1; } if (strmatch(event,"focus")) // toggle mouse capture takeMouse(remove_halo_mousefunc,drawcursor); if (zstrstr("Mrad Power",event)) // get new mouse attributes { zdialog_fetch(zd,"Mrad",Mrad); // mouse radius zdialog_fetch(zd,"Power",Power); // mouse power Power = 0.01 * Power; // scale 0 - 1.0 } if (zstrstr("bright dark",event)) // get bright/dark mode = 1/0 zdialog_fetch(zd,"bright",Fbd); return 1; } // pixel paint mouse function void remove_halo_mousefunc() { using namespace remove_halo_names; void remove_halo_bright(int px, int py); void remove_halo_dark(int px, int py); static int pmxdown = 0, pmydown = 0; int px, py; if (LMclick || RMclick) { if (LMclick) mode = 1; // left click, paint if (RMclick) mode = 2; // right click, erase px = Mxclick; py = Myclick; if (Fbd) remove_halo_bright(px,py); // do 1 block of pixels else remove_halo_dark(px,py); } else if (Mxdrag || Mydrag) // drag in progress { if (Mbutton == 1) mode = 1; // left drag, paint if (Mbutton == 3) mode = 2; // right drag, erase px = Mxdrag; py = Mydrag; if (Mxdown != pmxdown || Mydown != pmydown) { // new drag pmxdown = Mxdown; pmydown = Mydown; } if (Fbd) remove_halo_bright(px,py); // do 1 block of pixels else remove_halo_dark(px,py); LMclick = RMclick = Mxdrag = Mydrag = 0; return; } LMclick = RMclick = Mxdrag = Mydrag = 0; draw_mousecircle(Mxposn,Myposn,Mrad,0,0); // draw mouse circle return; } // process pixels within mouse radius void remove_halo_bright(int px, int py) { using namespace remove_halo_names; float *pix1, *pix3; float Drad, Pthresh, Rpower; float B1, B3, BR; int Bhist[768], Spix, Npix; int dx, dy, qx, qy; int ii, jj, rr; for (ii = 0; ii < 768; ii++) // clear brightness histogram Bhist[ii] = 0; Spix = Npix = 0; if (Mrad > 16) jj = 2; // if large radius, sample 1/4 pixels else jj = 1; for (dy = -Mrad; dy <= Mrad; dy += jj) // loop pixels around mouse for (dx = -Mrad; dx <= Mrad; dx += jj) { qx = px + dx; qy = py + dy; if (qx < 0 || qx > Eww-1) continue; if (qy < 0 || qy > Ehh-1) continue; pix3 = PXMpix(E3pxm,qx,qy); // accumulate brightness histogram ii = pix3[0] + pix3[1] + pix3[2]; // RGB weighted equally if (ii > 767) ii = 767; // should not happen Bhist[ii] += 1; Npix += 1; } for (ii = 767; ii > 0; ii--) // find brightest pixels { Spix += Bhist[ii]; if (Spix > Power * 0.05 * Npix) break; // at most 5% } Pthresh = ii; // darken pixels > Pthresh cairo_t *cr = draw_context_create(Fgdkwin,draw_context); for (dy = -Mrad; dy <= Mrad; dy++) // loop pixels around mouse for (dx = -Mrad; dx <= Mrad; dx++) { qx = px + dx; qy = py + dy; if (qx < 0 || qx > Eww-1) continue; if (qy < 0 || qy > Ehh-1) continue; Drad = sqrtf(dx*dx + dy*dy); // distance from mouse pointer if (Drad > Mrad) continue; // > Mrad, ignore Rpower = Power * Drad / Mrad; // mouse center...edge >> 1...0 pix1 = PXMpix(E1pxm,qx,qy); // original pixel pix3 = PXMpix(E3pxm,qx,qy); // edited pixel B1 = pix1[0] + pix1[1] + pix1[2]; // pix1 brightness B3 = pix3[0] + pix3[1] + pix3[2]; // pix3 brightness BR = (B3 + 1) / (B1 + 1); // pix3/pix1 ratio, 0 - 1 if (mode == 1) // reduce halo { if (B3 < Pthresh) continue; // below Pthresh, ignore BR = BR - Rpower * 0.05; // reduce brightness up to 5% if (BR < 0) BR = 0; pix3[0] = pix1[0] * BR; pix3[1] = pix1[1] * BR; pix3[2] = pix1[2] * BR; } if (mode == 2) // restore original image { BR = BR + Rpower * 0.1; if (BR > 1.0) BR = 1.0; pix3[0] = pix1[0] * BR; pix3[1] = pix1[1] * BR; pix3[2] = pix1[2] * BR; } } CEF->Fmods++; CEF->Fsaved = 0; px = px - Mrad - 1; // repaint modified area py = py - Mrad - 1; rr = 2 * Mrad + 3; Fpaint3(px,py,rr,rr,cr); draw_mousecircle(Mxposn,Myposn,Mrad,0,cr); // draw mouse circle draw_context_destroy(draw_context); return; } void remove_halo_dark(int px, int py) { using namespace remove_halo_names; float *pix1, *pix3; float Drad, Pthresh, Rpower; float B1, B3, BR; int Bhist[768], Spix, Npix; int dx, dy, qx, qy; int ii, jj, rr; for (ii = 0; ii < 768; ii++) // clear brightness histogram Bhist[ii] = 0; Spix = Npix = 0; if (Mrad > 16) jj = 2; // if large radius, sample 1/4 pixels else jj = 1; for (dy = -Mrad; dy <= Mrad; dy += jj) // loop pixels around mouse for (dx = -Mrad; dx <= Mrad; dx += jj) { qx = px + dx; qy = py + dy; if (qx < 0 || qx > Eww-1) continue; if (qy < 0 || qy > Ehh-1) continue; pix3 = PXMpix(E3pxm,qx,qy); // accumulate brightness histogram ii = pix3[0] + pix3[1] + pix3[2]; // RGB weighted equally if (ii > 767) ii = 767; // should not happen Bhist[ii] += 1; Npix += 1; } for (ii = 0; ii < 768; ii++) // find darkest pixels { Spix += Bhist[ii]; if (Spix > Power * 0.05 * Npix) break; // at most 5% } Pthresh = ii; // brighten pixels < Pthresh cairo_t *cr = draw_context_create(Fgdkwin,draw_context); for (dy = -Mrad; dy <= Mrad; dy++) // loop pixels around mouse for (dx = -Mrad; dx <= Mrad; dx++) { qx = px + dx; qy = py + dy; if (qx < 0 || qx > Eww-1) continue; if (qy < 0 || qy > Ehh-1) continue; Drad = sqrtf(dx*dx + dy*dy); // distance from mouse pointer if (Drad > Mrad) continue; // > Mrad, ignore Rpower = Power * Drad / Mrad; // mouse center...edge >> 1...0 pix1 = PXMpix(E1pxm,qx,qy); // original pixel pix3 = PXMpix(E3pxm,qx,qy); // edited pixel B1 = pix1[0] + pix1[1] + pix1[2]; // pix1 brightness B3 = pix3[0] + pix3[1] + pix3[2]; // pix3 brightness BR = (B3 + 1) / (B1 + 1); // pix3/pix1 ratio, 0 - 1 if (mode == 1) // reduce halo { if (B3 > Pthresh) continue; // above Pthresh, ignore BR = BR + Rpower * 0.1; // increase brightness up to 10% pix3[0] = pix1[0] * BR; pix3[1] = pix1[1] * BR; pix3[2] = pix1[2] * BR; } if (mode == 2) // restore original image { BR = BR + Rpower * 0.1; if (BR > 1.0) BR = 1.0; pix3[0] = pix1[0] * BR; pix3[1] = pix1[1] * BR; pix3[2] = pix1[2] * BR; } } CEF->Fmods++; CEF->Fsaved = 0; px = px - Mrad - 1; // repaint modified area py = py - Mrad - 1; rr = 2 * Mrad + 3; Fpaint3(px,py,rr,rr,cr); draw_mousecircle(Mxposn,Myposn,Mrad,0,cr); // draw mouse circle draw_context_destroy(draw_context); return; } /**************************************************************************************/ // Attenuate JPEG compression artifacts namespace jpeg_artifacts_names { editfunc EFjpeg_artifacts; float matchlimit; // pixel block match limit float conlimit; // block blend contrast limit uint8 *pixmark; typedef struct { // block of monotone pixels uint16 px, py; // (image ww/hh limit = 64K) uint8 ww, hh; } pixblock; pixblock *PB; int NB; } // menu function void m_jpeg_artifacts(GtkWidget *, ch *menu) { using namespace jpeg_artifacts_names; int jpeg_artifacts_dialog_event(zdialog *zd, ch *event); void * jpeg_artifacts_thread(void *); F1_help_topic = TX("JPEG ARTIFACTS"); printf("m_jpeg_artifacts \n"); EFjpeg_artifacts.menuname = "JPEG Artifacts"; EFjpeg_artifacts.menufunc = m_jpeg_artifacts; EFjpeg_artifacts.Farea = 2; // select area usable EFjpeg_artifacts.Fscript = 1; // scripting supported EFjpeg_artifacts.threadfunc = jpeg_artifacts_thread; if (! edit_setup(EFjpeg_artifacts)) return; // setup edit int cc = Eww * Ehh; // allocate pixmark memory pixmark = (uint8 *) zmalloc(cc,"jpeg_artifacts"); PB = (pixblock *) zmalloc(cc * sizeof(pixblock),"jpeg_artifacts"); /*** _____________________________ | JPEG Artifacts | | | | Match Limit [___] | | Contrast Limit [___] | | | | [Reset] [Apply] [OK] [X] | |_____________________________| ***/ zdialog *zd = zdialog_new(TX("JPEG Artifacts"),Mwin,TX("Reset"),TX("Apply"),"OK","X",null); EFjpeg_artifacts.zd = zd; zdialog_add_widget(zd,"hbox","hbm","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labm","hbm",TX("Match Limit"),"space=5"); zdialog_add_widget(zd,"zspin","matchlimit","hbm","0.0|0.99|0.01|0.9"); zdialog_add_widget(zd,"hbox","hbc","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labc","hbc",TX("Contrast Limit"),"space=5"); zdialog_add_widget(zd,"zspin","conlimit","hbc","0.0|0.99|0.01|0.8"); matchlimit = 0.9; // defaults conlimit = 0.8; zdialog_run(zd,jpeg_artifacts_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion function int jpeg_artifacts_dialog_event(zdialog *zd, ch *event) { using namespace jpeg_artifacts_names; if (strmatch(event,"done")) zd->zstat = 3; // apply and quit if (strmatch(event,"cancel")) zd->zstat = -1; // cancel if (strmatch(event,"apply")) zd->zstat = 2; // from script if (zd->zstat) { if (zd->zstat == 1) { // [reset] zd->zstat = 0; // keep dialog alive edit_reset(); return 1; } else if (zd->zstat == 2) { // [apply] zd->zstat = 0; // keep dialog alive thread_signal(); // start thread return 1; } else if (zd->zstat == 3) edit_done(0); // [OK] else edit_cancel(0); // discard edit zfree(pixmark); // free memory zfree(PB); return 1; } if (strmatch(event,"matchlimit")) zdialog_fetch(zd,"matchlimit",conlimit); if (strmatch(event,"conlimit")) zdialog_fetch(zd,"conlimit",conlimit); return 1; } // thread function void * jpeg_artifacts_thread(void *) { using namespace jpeg_artifacts_names; int ii, dist; int px, py, qx, qy, ww, hh; int maxrow, area, maxarea, maxqx, maxqy; float *pixp, *pixq; E9pxm = PXM_copy(E3pxm); // this allows multiple [apply] for (py = 8; py < Ehh-8; py++) // unmark all pixels for (px = 8; px < Eww-8; px++) { ii = py * Eww + px; pixmark[ii] = 0; } NB = 0; // block count for (py = 8; py < Ehh-8; py++) // loop all pixels for (px = 8; px < Eww-8; px++) { ii = py * Eww + px; // skip marked pixels if (pixmark[ii]) continue; if (sa_stat == sa_stat_fini) { // select area active dist = sa_pixmap[ii]; // distance from area edge if (! dist) continue; // outside area, skip } maxrow = 8; maxarea = 0; for (qy = py; qy < py+8; qy++) // loop rows py .. py+7 { pixp = PXMpix(E1pxm,px,py); for (qx = px; qx < px+maxrow; qx++) // loop cols px .. px+maxrow-1 { pixq = PXMpix(E1pxm,qx,qy); // count matching pixels in row if (PIXmatch(pixp,pixq) < matchlimit) break; } if (qx == px) break; // end of matching rows qx--; // last matching col in row if (qx-px+1 < maxrow) maxrow = qx-px+1; // update maxrow if row shorter area = (qx-px+1) * (qy-py+1); // area (px,py) .. (qx,qy) if (area > maxarea) { maxarea = area; // remember max area found maxqx = qx; // anchored at (px,py) maxqy = qy; } } if (! maxarea) continue; ii = NB++; // save monotone block PB[ii].px = px; // origin = px, py PB[ii].py = py; ww = maxqx-px+1; hh = maxqy-py+1; PB[ii].ww = ww; // size = ww, hh PB[ii].hh = hh; for (qy = py; qy < py + hh; qy++) // mark pixels in block for (qx = px; qx < px + ww; qx++) { ii = qy * Eww + qx; pixmark[ii] = 1; } } float d1, d2, d3, d4; float f1, f2, f3, f4; float R, G, B; float *pix1, *pix2, *pix3, *pix4; for (ii = 0; ii < NB; ii++) // loop all blocks { px = PB[ii].px; py = PB[ii].py; ww = PB[ii].ww; hh = PB[ii].hh; for (qy = py; qy < py+hh; qy++) // loop pixels in block for (qx = px; qx < px+ww; qx++) { d1 = qy - py + 1; // qx/qy distance from block edges d2 = py + hh - qy; d3 = qx - px + 1; d4 = px + ww - qx; f1 = d1 / (ww + hh + 2); // bilinear interpolation weights f2 = d2 / (ww + hh + 2); f3 = d3 / (ww + hh + 2); f4 = d4 / (ww + hh + 2); pix1 = PXMpix(E9pxm,qx,py+hh); // neighbor pixels for interpolation pix2 = PXMpix(E9pxm,qx,py-1); pix3 = PXMpix(E9pxm,px+ww,qy); pix4 = PXMpix(E9pxm,px-1,qy); pixq = PXMpix(E9pxm,qx,qy); if (PIXmatch(pix1,pixq) < conlimit) pix1 = pixq; // replace high-contrast neighbors if (PIXmatch(pix2,pixq) < conlimit) pix2 = pixq; if (PIXmatch(pix3,pixq) < conlimit) pix3 = pixq; if (PIXmatch(pix4,pixq) < conlimit) pix4 = pixq; R = f1 * pix1[0] + f2 * pix2[0] + f3 * pix3[0] + f4 * pix4[0]; // new RGB from neighbors G = f1 * pix1[1] + f2 * pix2[1] + f3 * pix3[1] + f4 * pix4[1]; B = f1 * pix1[2] + f2 * pix2[2] + f3 * pix3[2] + f4 * pix4[2]; pixq = PXMpix(E3pxm,qx,qy); // output pixel pixq[0] = R; pixq[1] = G; pixq[2] = B; } float *pix3; if (drandz() < 0.0) { pix3 = PXMpix(E3pxm,px,py); // mark block (debug tool) pix3[0] = pix3[1] = pix3[2] = 0; pix3 = PXMpix(E3pxm,px+ww-1,py+hh-1); pix3[0] = pix3[1] = pix3[2] = 255; } } PXM_free(E9pxm); E9pxm = 0; CEF->Fmods++; // E3pxm modified CEF->Fsaved = 0; Fpaint2(); // update window return 0; } /************************************************************************************** anti-alias: smooth the jaggies on high-contrast edges scale3x algorithm, modified to use 'closeness' in place of 'equal' 3x3 pixel input block 3x3 pixel output block A B C 1 2 3 D E F 4 5 6 G H I 7 8 9 input block = 3x3 pixels centered on input pixel E 1=E; 2=E; 3=E; 4=E; 5=E; 6=E; 7=E; 8=E; 9=E; IF D==B AND D!=H AND B!=F then 1=D IF D==B AND D!=H AND B!=F AND E!=C then 2=B IF B==F AND B!=D AND F!=H AND E!=A then 2=B IF B==F AND B!=D AND F!=H then 3=F IF H==D AND H!=F AND D!=B AND E!=A then 4=D IF D==B AND D!=H AND B!=F AND E!=G then 4=D 5=E IF B==F AND B!=D AND F!=H AND E!=I then 6=F IF F==H AND F!=B AND H!=D AND E!=C then 6=F IF H==D AND H!=F AND D!=B then 7=D IF F==H AND F!=B AND H!=D AND E!=G then 8=H IF H==D AND H!=F AND D!=B AND E!=I then 8=H IF F==H AND F!=B AND H!=D then 9=F output pixel E = mean of 3x3 output block Note: can be applied more than once, but 'painting' causes rapid deterioration, therefore this is not supported. ***************************************************************************************/ namespace anti_alias_names { editfunc EFanti_alias; int applies; float thresh; } void m_anti_alias(GtkWidget *, ch *menu) { using namespace anti_alias_names; int anti_alias_dialog_event(zdialog *zd, ch *event); void * anti_alias_thread(void *); F1_help_topic = TX("ANTI-ALIAS"); printf("m_anti_alias \n"); EFanti_alias.menuname = "Anti-Alias"; EFanti_alias.menufunc = m_anti_alias; EFanti_alias.Farea = 2; // select area usable EFanti_alias.threadfunc = anti_alias_thread; // thread function EFanti_alias.Fscript = 1; // allow script if (! edit_setup(EFanti_alias)) return; // setup edit /*** ___________________________________ | Anti-Alias | | | | Threshold [___] | | | | [Reset] [Apply] [OK] [X] | |___________________________________| ***/ zdialog *zd = zdialog_new(TX("Anti-Alias"),Mwin,TX("Reset"),TX("Apply"),"OK","X",null); zdialog_add_widget(zd,"hbox","hbthresh","dialog",0,"space=10"); zdialog_add_widget(zd,"label","labthresh","hbthresh",TX("Threshold"),"space=10"); zdialog_add_widget(zd,"zspin","thresh","hbthresh","0.00|0.30|0.01|0.00"); EFanti_alias.zd = zd; applies = 0; thresh = 0.0; zdialog_run(zd,anti_alias_dialog_event,"save"); // run dialog return; } // dialog event and completion callback function int anti_alias_dialog_event(zdialog * zd, ch *event) { using namespace anti_alias_names; if (strmatch(event,"done")) zd->zstat = 3; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 4; // from f_open() if (strmatch(event,"apply")) { // from script thread_signal(); applies = 1; zd->zstat = 3; } if (zd->zstat) { if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active edit_reset(); } else if (zd->zstat == 2) // [apply] { zd->zstat = 0; // keep dialog active thread_signal(); // trigger thread applies++; } else if (zd->zstat == 3) { // [OK] edit_addhist("applies: %d",applies); edit_done(0); } else edit_cancel(0); // cancel return 1; } if (strmatch(event,"thresh")) // get threshold value 0.0 - 1.0 zdialog_fetch(zd,"thresh",thresh); return 1; } // thread function void * anti_alias_thread(void *) { using namespace anti_alias_names; void * anti_alias_wthread(void *); E9pxm = PXM_copy(E3pxm); // this facilitates multiple [apply] do_wthreads(anti_alias_wthread,NSMP); // worker threads PXM_free(E9pxm); E9pxm = 0; CEF->Fmods++; CEF->Fsaved = 0; Fpaint2(); return 0; } // worker thread void * anti_alias_wthread(void *arg) { using namespace anti_alias_names; int index = *((int *) arg); int ii, px, py, dist; int pcc = 3 * sizeof(float); float *pixA, *pixB, *pixC, *pixD, *pixE, *pixF, *pixG, *pixH, *pixI; float pix1[3], pix2[3], pix3[3], pix4[3], pix5[3], pix6[3], pix7[3], pix8[3], pix9[3]; float R, G, B; for (py = index+1; py < Ehh-1; py += NSMP) // loop all pixels for (px = 1; px < Eww-1; px++) { if (sa_stat == sa_stat_fini) { // select area active ii = py * Eww + px; dist = sa_pixmap[ii]; // distance from area edge if (! dist) continue; // outside area, skip } pixA = PXMpix(E9pxm,px-1,py-1); // input 3x3 block pixB = PXMpix(E9pxm,px, py-1); // centered on px,py pixC = PXMpix(E9pxm,px+1,py-1); pixD = PXMpix(E9pxm,px-1,py ); pixE = PXMpix(E9pxm,px, py ); // pixE is central pixel pixF = PXMpix(E9pxm,px+1,py ); pixG = PXMpix(E9pxm,px-1,py+1); pixH = PXMpix(E9pxm,px, py+1); pixI = PXMpix(E9pxm,px+1,py+1); memcpy(pix1,pixE,pcc); // output 3x3 block memcpy(pix2,pixE,pcc); // initz. = pixE memcpy(pix3,pixE,pcc); memcpy(pix4,pixE,pcc); memcpy(pix5,pixE,pcc); memcpy(pix6,pixE,pcc); memcpy(pix7,pixE,pcc); memcpy(pix8,pixE,pcc); memcpy(pix9,pixE,pcc); if (PIXmatch(pixD,pixB) > PIXmatch(pixD,pixH) + thresh && PIXmatch(pixD,pixB) > PIXmatch(pixB,pixF) + thresh) memcpy(pix1,pixD,pcc); if (PIXmatch(pixD,pixB) > PIXmatch(pixD,pixH) + thresh && PIXmatch(pixD,pixB) > PIXmatch(pixB,pixF) + thresh && PIXmatch(pixD,pixB) > PIXmatch(pixE,pixC) + thresh) memcpy(pix2,pixB,pcc); if (PIXmatch(pixB,pixF) > PIXmatch(pixB,pixD) + thresh && PIXmatch(pixB,pixF) > PIXmatch(pixF,pixH) + thresh && PIXmatch(pixB,pixF) > PIXmatch(pixE,pixA) + thresh) memcpy(pix2,pixB,pcc); if (PIXmatch(pixB,pixF) > PIXmatch(pixB,pixD) + thresh && PIXmatch(pixB,pixF) > PIXmatch(pixF,pixH) + thresh) memcpy(pix3,pixF,pcc); if (PIXmatch(pixH,pixD) > PIXmatch(pixH,pixF) + thresh && PIXmatch(pixH,pixD) > PIXmatch(pixD,pixB) + thresh && PIXmatch(pixH,pixD) > PIXmatch(pixE,pixA) + thresh) memcpy(pix4,pixD,pcc); if (PIXmatch(pixD,pixB) > PIXmatch(pixD,pixH) + thresh && PIXmatch(pixD,pixB) > PIXmatch(pixB,pixF) + thresh && PIXmatch(pixD,pixB) > PIXmatch(pixE,pixG) + thresh) memcpy(pix4,pixD,pcc); if (PIXmatch(pixB,pixF) > PIXmatch(pixB,pixD) + thresh && PIXmatch(pixB,pixF) > PIXmatch(pixF,pixH) + thresh && PIXmatch(pixB,pixF) > PIXmatch(pixE,pixI) + thresh) memcpy(pix6,pixF,pcc); if (PIXmatch(pixF,pixH) > PIXmatch(pixF,pixB) + thresh && PIXmatch(pixF,pixH) > PIXmatch(pixH,pixD) + thresh && PIXmatch(pixF,pixH) > PIXmatch(pixE,pixC) + thresh) memcpy(pix6,pixF,pcc); if (PIXmatch(pixH,pixD) > PIXmatch(pixH,pixF) + thresh && PIXmatch(pixH,pixD) > PIXmatch(pixD,pixB) + thresh) memcpy(pix7,pixD,pcc); if (PIXmatch(pixF,pixH) > PIXmatch(pixF,pixB) + thresh && PIXmatch(pixF,pixH) > PIXmatch(pixH,pixD) + thresh && PIXmatch(pixF,pixH) > PIXmatch(pixE,pixG) + thresh) memcpy(pix8,pixH,pcc); if (PIXmatch(pixH,pixD) > PIXmatch(pixH,pixF) + thresh && PIXmatch(pixH,pixD) > PIXmatch(pixD,pixB) + thresh && PIXmatch(pixH,pixD) > PIXmatch(pixE,pixI) + thresh) memcpy(pix8,pixH,pcc); if (PIXmatch(pixF,pixH) > PIXmatch(pixF,pixB) + thresh && PIXmatch(pixF,pixH) > PIXmatch(pixH,pixD) + thresh) memcpy(pix9,pixF,pcc); R = pix1[0] + pix2[0] + pix3[0] + pix4[0] + pix5[0] // get mean of pix1-pix9 + pix6[0] + pix7[0] + pix8[0] + pix9[0]; R = R * 0.1111; G = pix1[1] + pix2[1] + pix3[1] + pix4[1] + pix5[1] + pix6[1] + pix7[1] + pix8[1] + pix9[1]; G = G * 0.1111; B = pix1[2] + pix2[2] + pix3[2] + pix4[2] + pix5[2] + pix6[2] + pix7[2] + pix8[2] + pix9[2]; B = B * 0.1111; pixE = PXMpix(E3pxm,px,py); // output pixel pixE[0] = R; pixE[1] = G; pixE[2] = B; } return 0; } /**************************************************************************************/ // Adjust RGB menu function // Adjust Brightness, contrast, and color levels using RGB or CMY colors namespace adjust_RGB_names { editfunc EF_RGB; // edit function data float inputs[8]; } // menu function void m_adjust_RGB(GtkWidget *, ch *menu) { using namespace adjust_RGB_names; int RGB_dialog_event(zdialog *zd, ch *event); void * RGB_thread(void *); F1_help_topic = TX("ADJUST RGB"); printf("m_adjust_RGB \n"); EF_RGB.menuname = "Adjust RGB"; EF_RGB.menufunc = m_adjust_RGB; EF_RGB.FprevReq = 1; // use preview EF_RGB.Farea = 2; // select area usable EF_RGB.Fscript = 1; // scripting supported EF_RGB.Fpaintedits = 1; // paint edits supported EF_RGB.threadfunc = RGB_thread; // thread function if (! edit_setup(EF_RGB)) return; // setup edit /*** ________________________________ | | | +Brightness =====[]===== | | +Red -Cyan =====[]===== | | +Green -Magenta =====[]===== | | +Blue -Yellow =====[]===== | | | | Contrast All =====[]===== | | Contrast Red =====[]===== | | Contrast Green =====[]===== | | Contrast Blue =====[]===== | | | | [Reset] [OK] [X] | |________________________________| ***/ zdialog *zd = zdialog_new(TX("Adjust RGB"),Mwin,TX("Reset"),"OK","X",null); EF_RGB.zd = zd; zdialog_add_widget(zd,"hbox","hb2","dialog"); zdialog_add_widget(zd,"vbox","vb1","hb2",0,"homog"); zdialog_add_widget(zd,"vbox","vb2","hb2",0,"homog|expand"); zdialog_add_widget(zd,"label","labBriteDens","vb1",TX("+Brightness")); zdialog_add_widget(zd,"label","labRedDens","vb1",TX("+Red -Cyan")); zdialog_add_widget(zd,"label","labGreenDens","vb1",TX("+Green -Magenta")); zdialog_add_widget(zd,"label","labBlueDens","vb1",TX("+Blue -Yellow")); zdialog_add_widget(zd,"hsep","sep1","vb1"); zdialog_add_widget(zd,"label","labContrast","vb1",TX("Contrast All")); zdialog_add_widget(zd,"label","labRedCon","vb1",TX("Contrast Red")); zdialog_add_widget(zd,"label","labGreenCon","vb1",TX("Contrast Green")); zdialog_add_widget(zd,"label","labBlueCon","vb1",TX("Contrast Blue")); zdialog_add_widget(zd,"hscale2","BriteDens","vb2","-1|+1|0.001|0","expand"); zdialog_add_widget(zd,"hscale2","RedDens","vb2","-1|+1|0.001|0","expand"); zdialog_add_widget(zd,"hscale2","GreenDens","vb2","-1|+1|0.001|0","expand"); zdialog_add_widget(zd,"hscale2","BlueDens","vb2","-1|+1|0.001|0","expand"); zdialog_add_widget(zd,"hsep","sep2","vb2"); zdialog_add_widget(zd,"hscale2","Contrast","vb2","-1|+1|0.001|0","expand"); zdialog_add_widget(zd,"hscale2","RedCon","vb2","-1|+1|0.001|0","expand"); zdialog_add_widget(zd,"hscale2","GreenCon","vb2","-1|+1|0.001|0","expand"); zdialog_add_widget(zd,"hscale2","BlueCon","vb2","-1|+1|0.001|0","expand"); zdialog_rescale(zd,"BriteDens",-1,0,+1); // expand scale around neutral value zdialog_rescale(zd,"RedDens",-1,0,+1); zdialog_rescale(zd,"GreenDens",-1,0,+1); zdialog_rescale(zd,"BlueDens",-1,0,+1); zdialog_rescale(zd,"Contrast",-1,0,+1); zdialog_rescale(zd,"RedCon",-1,0,+1); zdialog_rescale(zd,"GreenCon",-1,0,+1); zdialog_rescale(zd,"BlueCon",-1,0,+1); zdialog_resize(zd,300,0); zdialog_load_inputs(zd); // restore prior inputs zdialog_run(zd,RGB_dialog_event,"save"); // run dialog - parallel zdialog_send_event(zd,"apply"); return; } // RGB dialog event and completion function int RGB_dialog_event(zdialog *zd, ch *event) // RGB dialog event function { using namespace adjust_RGB_names; if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (strmatch(event,"fullsize")) { // from select area edit_fullsize(); if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } return 1; } if (zd->zstat) { if (zd->zstat == 1) { // reset zd->zstat = 0; // keep dialog active zdialog_stuff(zd,"BriteDens",0); zdialog_stuff(zd,"RedDens",0); zdialog_stuff(zd,"GreenDens",0); zdialog_stuff(zd,"BlueDens",0); zdialog_stuff(zd,"Contrast",0); zdialog_stuff(zd,"RedCon",0); zdialog_stuff(zd,"GreenCon",0); zdialog_stuff(zd,"BlueCon",0); edit_reset(); return 1; } if (zd->zstat == 2) { // done edit_fullsize(); // get full size image if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } edit_addhist("%.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f", // edit parameters --> edit history 25.1 inputs[0],inputs[1],inputs[2],inputs[3], inputs[4],inputs[5],inputs[6],inputs[7]); edit_done(0); // commit edit return 1; } edit_cancel(0); // discard edit return 1; } if (strmatch("focus",event)) return 1; if (strstr("BriteDens RedDens GreenDens BlueDens" "Contrast RedCon GreenCon BlueCon paint apply", event)) { zdialog_fetch(zd,"BriteDens",inputs[0]); // get all inputs zdialog_fetch(zd,"RedDens",inputs[1]); zdialog_fetch(zd,"GreenDens",inputs[2]); zdialog_fetch(zd,"BlueDens",inputs[3]); zdialog_fetch(zd,"Contrast",inputs[4]); zdialog_fetch(zd,"RedCon",inputs[5]); zdialog_fetch(zd,"GreenCon",inputs[6]); zdialog_fetch(zd,"BlueCon",inputs[7]); thread_signal(); // trigger update thread } return 1; } // thread function - multiple working threads to update image void * RGB_thread(void *) { using namespace adjust_RGB_names; void * RGB_wthread(void *arg); // worker thread if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag if (sa_stat == sa_stat_fini) progress_setgoal(sa_Npixel); // initz. progress counter else progress_setgoal(Eww * Ehh); get_edit_pixels_init(NSMP,0); do_wthreads(RGB_wthread,NSMP); // worker threads progress_setgoal(0); CEF->Fmods++; // image modified CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } // worker thread function void * RGB_wthread(void *arg) { using namespace adjust_RGB_names; float R, G, B, R1, G1, B1, R3, G3, B3, R9, G9, B9; float briA, briR, briG, briB; float conA, conR, conG, conB; int index = *((int *) (arg)); int px, py, Fend; float *pix1, *pix3; float blend; briA = inputs[0]; // color brightness inputs, -1 to +1 briR = inputs[1]; briG = inputs[2]; briB = inputs[3]; R = briR - 0.5 * briG - 0.5 * briB + briA; // red = red - green - blue + all G = briG - 0.5 * briR - 0.5 * briB + briA; // etc. B = briB - 0.5 * briR - 0.5 * briG + briA; R += 1; // -1 ... 0 ... +1 >> 0 ... 1 ... 2 G += 1; // increase the range B += 1; briR = R; // final color brightness factors briG = G; briB = B; conA = inputs[4]; // contrast inputs, -1 to +1 conR = inputs[5]; conG = inputs[6]; conB = inputs[7]; if (conA < 0) conA = 0.5 * conA + 1; // -1 ... 0 >> 0.5 ... 1.0 else conA = conA + 1; // 0 ... 1 >> 1.0 ... 2.0 if (conR < 0) conR = 0.5 * conR + 1; else conR = conR + 1; if (conG < 0) conG = 0.5 * conG + 1; else conG = conG + 1; if (conB < 0) conB = 0.5 * conB + 1; else conB = conB + 1; conR = conR * conA; // apply overall contrast conG = conG * conA; conB = conB * conA; while (true) { Fend = get_edit_pixels(index,px,py,blend); if (Fend) return 0; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = pix1[0]; // input RGB values, 0-255 G1 = pix1[1]; B1 = pix1[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; R9 = R1 * briR; // apply color brightness factors G9 = G1 * briG; B9 = B1 * briB; R9 = conR * (R9 - 128) + 128; // apply contrast factors G9 = conG * (G9 - 128) + 128; B9 = conB * (B9 - 128) + 128; RGBfix(R9,G9,B9); if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { // increase edit R3 = blend * R9 + (1-blend) * R3; G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { // decrease edit R3 = -blend * R1 + (1+blend) * R3; G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // output RGB values pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // HSL color menu function // Adjust colors using the HSL (hue/saturation/lightness) color model namespace adjust_HSL_names { GtkWidget *RGBframe, *RGBcolor; GtkWidget *Hframe, *Hscale; editfunc EF_HSL; // edit function data int Huse, Suse, Luse; // "match using" flags, 0 or 1 int Hout, Sout, Lout; // "output color" flags, 0 or 1 float Rm, Gm, Bm; // RGB image color to match float Hm, Sm, Lm; // corresp. HSL color float Mlev; // match level 0..1 = 100% float Hc, Sc, Lc; // new color to add float Rc, Gc, Bc; // corresp. RGB color float Adj; // color adjustment, 0..1 = 100% } // menu function void m_adjust_HSL(GtkWidget *, ch *menu) { using namespace adjust_HSL_names; void HSL_RGBcolor(GtkWidget *drawarea, cairo_t *cr, int *); void HSL_Hscale(GtkWidget *drawarea, cairo_t *cr, int *); int HSL_dialog_event(zdialog *zd, ch *event); void HSL_mousefunc(); void * HSL_thread(void *); F1_help_topic = TX("ADJUST HSL"); printf("m_adjust_HSL \n"); EF_HSL.menuname = "Adjust HSL"; EF_HSL.menufunc = m_adjust_HSL; EF_HSL.FprevReq = 1; // use preview EF_HSL.Farea = 2; // select area usable EF_HSL.Fpaintedits = 1; // use with paint edits OK EF_HSL.mousefunc = HSL_mousefunc; // mouse function EF_HSL.threadfunc = HSL_thread; // thread function if (! edit_setup(EF_HSL)) return; // setup edit /*** ___________________________________________________ | | | Input color to match and adjust: [#####] | | Match using: [] Hue [] Saturation [] Lightness | | Match Level: ==================[]========== 100% | | - - - - - - - - - - - - - - - - - - - - - - - - | | Output Color | | [########] [#################################] | // new color and hue spectrum | [] Color Hue ================[]============== | | [] Saturation =====================[]========= | | [] Lightness ===========[]=================== | | Adjustment ===================[]========== 100% | | | | [Reset] [OK] [X] | |___________________________________________________| ***/ zdialog *zd = zdialog_new(TX("Adjust HSL"),Mwin,TX("Reset"),"OK","X",null); EF_HSL.zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"label","labmatch","hb1",TX("Input color to match and adjust:"),"space=5"); zdialog_add_widget(zd,"colorbutt","matchRGB","hb1","0|0|0"); zdialog_add_ttip(zd,"matchRGB",TX("shift+click on image to select color")); zdialog_add_widget(zd,"hbox","hbmu","dialog"); zdialog_add_widget(zd,"label","labmu","hbmu",TX("Match using:"),"space=5"); zdialog_add_widget(zd,"check","Huse","hbmu",TX("Hue"),"space=3"); zdialog_add_widget(zd,"check","Suse","hbmu",TX("Saturation"),"space=3"); zdialog_add_widget(zd,"check","Luse","hbmu",TX("Lightness"),"space=3"); zdialog_add_widget(zd,"hbox","hbmatch","dialog"); zdialog_add_widget(zd,"label","labmatch","hbmatch",TX("Match Level"),"space=5"); zdialog_add_widget(zd,"hscale","Mlev","hbmatch","0|1|0.001|1.0","expand"); zdialog_add_widget(zd,"label","lab100%","hbmatch","100%","space=4"); zdialog_add_widget(zd,"hsep","sep","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"label","laboutput","hb1",TX("Output Color")); zdialog_add_widget(zd,"hbox","hb2","dialog"); zdialog_add_widget(zd,"vbox","vb1","hb2",0,"homog"); zdialog_add_widget(zd,"vbox","vb2","hb2",0,"homog|expand"); zdialog_add_widget(zd,"frame","RGBframe","vb1",0,"space=1"); // drawing area for RGB color RGBframe = zdialog_gtkwidget(zd,"RGBframe"); RGBcolor = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(RGBframe),RGBcolor); gtk_widget_set_size_request(RGBcolor,0,16); G_SIGNAL(RGBcolor,"draw",HSL_RGBcolor,0); zdialog_add_widget(zd,"frame","Hframe","vb2",0,"space=1"); // drawing area for hue scale Hframe = zdialog_gtkwidget(zd,"Hframe"); Hscale = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(Hframe),Hscale); gtk_widget_set_size_request(Hscale,200,16); G_SIGNAL(Hscale,"draw",HSL_Hscale,0); zdialog_add_widget(zd,"check","Hout","vb1",TX("Color Hue")); zdialog_add_widget(zd,"check","Sout","vb1",TX("Saturation")); zdialog_add_widget(zd,"check","Lout","vb1",TX("Lightness")); zdialog_add_widget(zd,"label","labadjust","vb1",TX("Adjustment")); zdialog_add_widget(zd,"hscale","Hc","vb2","0|359.9|0.1|180","expand"); zdialog_add_widget(zd,"hscale","Sc","vb2","0|1|0.001|0.5","expand"); zdialog_add_widget(zd,"hscale","Lc","vb2","0|1|0.001|0.5","expand"); zdialog_add_widget(zd,"hbox","vb2hb","vb2"); zdialog_add_widget(zd,"hscale","Adj","vb2hb","0|1|0.001|0.0","expand"); zdialog_add_widget(zd,"label","lab100%","vb2hb","100%","space=4"); zdialog_stuff(zd,"Huse",1); // default: match on hue and saturation zdialog_stuff(zd,"Suse",1); zdialog_stuff(zd,"Luse",0); zdialog_stuff(zd,"Hout",1); // default: replace only hue zdialog_stuff(zd,"Sout",0); zdialog_stuff(zd,"Lout",0); Rm = Gm = Bm = 0; // color to match = black = not set Hm = Sm = Lm = 0; Huse = Suse = 1; Luse = 0; Hout = 1; Sout = Lout = 0; Mlev = 1.0; Hc = 180; // new HSL color to set / mix Sc = 0.5; Lc = 0.5; Adj = 0.0; zdialog_run(zd,HSL_dialog_event,"save"); // run dialog - parallel takeMouse(HSL_mousefunc,arrowcursor); // connect mouse function return; } // Paint RGBcolor drawing area with RGB color from new HSL color void HSL_RGBcolor(GtkWidget *drawarea, cairo_t *cr, int *) { using namespace adjust_HSL_names; int ww, hh; ww = gtk_widget_get_allocated_width(drawarea); // drawing area size hh = gtk_widget_get_allocated_height(drawarea); HSLtoRGB(Hc,Sc,Lc,Rc,Gc,Bc); // new RGB color cairo_set_source_rgb(cr,Rc,Gc,Bc); cairo_rectangle(cr,0,0,ww-1,hh-1); cairo_fill(cr); return; } // Paint Hscale drawing area with all hue values in a horizontal scale void HSL_Hscale(GtkWidget *drawarea, cairo_t *cr, int *) { using namespace adjust_HSL_names; int px, ww, hh; float H, S, L, R, G, B; ww = gtk_widget_get_allocated_width(drawarea); // drawing area size hh = gtk_widget_get_allocated_height(drawarea); S = L = 0.5; for (px = 0; px < ww; px++) // paint hue color scale { H = 360 * px / ww; HSLtoRGB(H,S,L,R,G,B); cairo_set_source_rgb(cr,R,G,B); cairo_move_to(cr,px,0); cairo_line_to(cr,px,hh-1); cairo_stroke(cr); } return; } // HSL dialog event and completion function int HSL_dialog_event(zdialog *zd, ch *event) // HSL dialog event function { using namespace adjust_HSL_names; void HSL_mousefunc(); int mod = 0; if (strmatch(event,"done")) zd->zstat = 2; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 3; // from f_open() if (strmatch(event,"fullsize")) { // from select area edit_fullsize(); if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } return 1; } if (zd->zstat) { if (zd->zstat == 1) { // reset zd->zstat = 0; // keep dialog active Mlev = 1.0; Hc = 180; // set defaults Sc = 0.5; Lc = 0.5; Adj = 0.0; zdialog_stuff(zd,"Mlev",Mlev); zdialog_stuff(zd,"Hc",Hc); zdialog_stuff(zd,"Sc",Sc); zdialog_stuff(zd,"Lc",Lc); zdialog_stuff(zd,"Adj",Adj); edit_reset(); return 1; } else if (zd->zstat == 2) { // done edit_fullsize(); // get full size image if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } edit_done(0); // commit edit return 1; } else { edit_cancel(0); // discard edit return 1; } } if (strmatch("focus",event)) { takeMouse(HSL_mousefunc,arrowcursor); return 1; } if (strmatch(event,"Huse")) { // match on Hue, 0/1 zdialog_fetch(zd,"Huse",Huse); mod = 1; } if (strmatch(event,"Suse")) { // match on Saturation, 0/1 zdialog_fetch(zd,"Suse",Suse); mod = 1; } if (strmatch(event,"Luse")) { // match on Lightness, 0/1 zdialog_fetch(zd,"Luse",Luse); mod = 1; } if (strmatch(event,"Hout")) { // replace Hue, 0/1 zdialog_fetch(zd,"Hout",Hout); mod = 1; } if (strmatch(event,"Sout")) { // replace Saturation, 0/1 zdialog_fetch(zd,"Sout",Sout); mod = 1; } if (strmatch(event,"Lout")) { // replace Lightness, 0/1 zdialog_fetch(zd,"Lout",Lout); mod = 1; } if (strmatch("Mlev",event)) { // color match 0..1 = 100% zdialog_fetch(zd,"Mlev",Mlev); mod = 1; } if (strmatch("Hc",event)) { // new color hue 0-360 zdialog_fetch(zd,"Hc",Hc); mod = 1; } if (strmatch("Sc",event)) { // saturation 0-1 zdialog_fetch(zd,"Sc",Sc); mod = 1; } if (strmatch("Lc",event)) { // lightness 0-1 zdialog_fetch(zd,"Lc",Lc); mod = 1; } if (strmatch("Adj",event)) { // adjustment 0..1 = 100% zdialog_fetch(zd,"Adj",Adj); mod = 1; } if (strmatch(event,"paint")) mod = 1; // mouse paint if (mod) { gtk_widget_queue_draw(RGBcolor); // draw current RGB color thread_signal(); // trigger update thread } return 1; } // mouse function // click on image to set the color to match and change void HSL_mousefunc() { using namespace adjust_HSL_names; int mx, my, px, py; ch color[20]; float *pix1, R, G, B; float f256 = 1.0 / 256.0; zdialog *zd = EF_HSL.zd; if (! KBshiftkey) return; // check shift + left or right click if (! LMclick && ! RMclick) return; mx = Mxclick; // clicked pixel on image my = Myclick; if (mx < 1) mx = 1; // pull back from image edge if (mx > Eww - 2) mx = Eww - 2; if (my < 1) my = 1; if (my > Ehh - 2) my = Ehh - 2; R = G = B = 0; for (py = my-1; py <= my+1; py++) // compute average RGB for 3x3 for (px = mx-1; px <= mx+1; px++) // block of pixels { pix1 = PXMpix(E1pxm,px,py); R += pix1[0]; G += pix1[1]; B += pix1[2]; } R = R / 9; G = G / 9; B = B / 9; if (LMclick) // left mouse click { // pick MATCH color from image LMclick = 0; snprintf(color,19,"%.0f|%.0f|%.0f",R,G,B); // draw new match color button if (zd) zdialog_stuff(zd,"matchRGB",color); Rm = R * f256; Gm = G * f256; Bm = B * f256; RGBtoHSL(Rm,Gm,Bm,Hm,Sm,Lm); // set HSL color to match thread_signal(); // trigger update thread } if (RMclick) // right mouse click { // pick OUTPUT color from image RMclick = 0; R = R * f256; G = G * f256; B = B * f256; RGBtoHSL(R,G,B,Hc,Sc,Lc); // output HSL zdialog_stuff(zd,"Hc",Hc); zdialog_stuff(zd,"Sc",Sc); zdialog_stuff(zd,"Lc",Lc); gtk_widget_queue_draw(RGBcolor); // draw current RGB color thread_signal(); // trigger update thread } return; } // thread function - multiple working threads to update image void * HSL_thread(void *) { using namespace adjust_HSL_names; void * HSL_wthread(void *arg); // worker thread if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(HSL_wthread,NSMP); // worker threads CEF->Fmods++; // image modified CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } // worker thread function void * HSL_wthread(void *arg) { using namespace adjust_HSL_names; int index = *((int *) (arg)); int px, py, Fend; float *pix1, *pix3; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float H1, S1, L1, H3, S3, L3; float dH, dS, dL, match; float a1, a2, blend; float f256 = 1.0 / 256.0; while (true) { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = f256 * pix1[0]; // input pixel RGB scaled 0-1 G1 = f256 * pix1[1]; B1 = f256 * pix1[2]; R3 = pix3[0]; // current output image RGB G3 = pix3[1]; B3 = pix3[2]; RGBtoHSL(R1,G1,B1,H1,S1,L1); // convert to HSL match = 1.0; // compare image pixel to match HSL if (Huse) { dH = fabsf(Hm - H1); if (360 - dH < dH) dH = 360 - dH; dH *= 0.002778; // H difference, normalized 0..1 match = 1.0 - dH; } if (Suse) { dS = fabsf(Sm - S1); // S difference, 0..1 match *= (1.0 - dS); } if (Luse) { dL = fabsf(Lm - L1); // L difference, 0..1 match *= (1.0 - dL); } a1 = pow(match, 10.0 * Mlev); // color selectivity, 0..1 = max a1 = Adj * a1; a2 = 1.0 - a1; if (Hout) H3 = a1 * Hc + a2 * H1; // output HSL = a1 * new HSL else H3 = H1; // + a2 * old HSL if (Sout) S3 = a1 * Sc + a2 * S1; else S3 = S1; if (Lout) L3 = a1 * Lc + a2 * L1; else L3 = L1; HSLtoRGB(H3,S3,L3,R9,G9,B9); // conv. back to RGB 0-1 R1 *= 255.9; // rescale 0-255.9 G1 *= 255.9; B1 *= 255.9; R9 *= 255.9; G9 *= 255.9; B9 *= 255.9; if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { // increase edit R3 = blend * R9 + (1-blend) * R3; G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { // decrease edit R3 = -blend * R1 + (1+blend) * R3; G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or area { R3 = blend * R9 + (1-blend) * R1; G3 = blend * G9 + (1-blend) * G1; B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // find and remove "dust" from an image (e.g. from a scanned dusty slide) // dust is defined as small dark areas surrounded by brighter areas // image 1 original with prior edits // image 3 accumulated dust removals that have been committed // image 9 committed dust removals + pending removal (work in process) namespace dust_names { editfunc EFdust; int spotspan; // max. dustspot span, pixels int spotspan2; // spotspan **2 float brightness; // brightness limit, 0 to 1 = white float contrast; // min. contrast, 0 to 1 = black/white int *pixgroup; // maps (px,py) to pixel group no. int Fred; // red pixels are on int Nstack; struct spixstack { uint16 px, py; // pixel group search stack uint16 direc; } *pixstack; #define maxgroups 1000000 int Ngroups; int groupcount[maxgroups]; // count of pixels in each group float groupbright[maxgroups]; int edgecount[maxgroups]; // group edge pixel count float edgebright[maxgroups]; // group edge pixel brightness sum typedef struct { uint16 px1, py1, px2, py2; // pixel group extreme pixels int span2; // span from px1/py1 to px2/py2 } sgroupspan; sgroupspan groupspan[maxgroups]; } // menu function void m_remove_dust(GtkWidget *, ch *menu) { using namespace dust_names; int dust_dialog_event(zdialog *zd, ch *event); void * dust_thread(void *); F1_help_topic = TX("REMOVE DUST"); printf("m_remove_dust \n"); EFdust.menufunc = m_remove_dust; EFdust.menuname = "Remove Dust"; EFdust.Farea = 2; // select area usable EFdust.threadfunc = dust_thread; // thread function if (! edit_setup(EFdust)) return; // setup edit E9pxm = PXM_copy(E3pxm); // image 9 = copy of image3 Fred = 0; int cc = E1pxm->ww * E1pxm->hh * sizeof(int); pixgroup = (int *) zmalloc(cc,"remove dust"); // maps pixels to assigned groups cc = E1pxm->ww * E1pxm->hh * sizeof(spixstack); pixstack = (spixstack *) zmalloc(cc,"remove dust"); // pixel group search stack /*** ____________________________________________ | Remove Dust | | | | spot size limit =========[]=========== | | max. brightness =============[]======= | | min. contrast ========[]============ | | [erase] [red] [undo last] [apply] | | | | [OK] [X] | |____________________________________________| ***/ zdialog *zd = zdialog_new(TX("Remove Dust"),Mwin,"OK","X",null); EFdust.zd = zd; zdialog_add_widget(zd,"hbox","hbssl","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labssl","hbssl",TX("spot size limit"),"space=5"); zdialog_add_widget(zd,"hscale","spotspan","hbssl","1|50|1|20","space=5|expand"); zdialog_add_widget(zd,"hbox","hbmb","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labmb","hbmb",TX("max. brightness"),"space=5"); zdialog_add_widget(zd,"hscale","brightness","hbmb","1|999|1|700","space=5|expand"); zdialog_add_widget(zd,"hbox","hbmc","dialog",0,"space=1"); zdialog_add_widget(zd,"label","labmb","hbmc",TX("min. contrast"),"space=5"); zdialog_add_widget(zd,"hscale","contrast","hbmc","1|500|1|40","space=5|expand"); zdialog_add_widget(zd,"hbox","hbbutts","dialog",0,"space=5"); zdialog_add_widget(zd,"button","erase","hbbutts",TX("Erase"),"space=5"); zdialog_add_widget(zd,"button","red","hbbutts",TX("Red"),"space=5"); zdialog_add_widget(zd,"button","undo1","hbbutts",TX("Undo Last"),"space=5"); zdialog_add_widget(zd,"button","apply","hbbutts",TX("Apply"),"space=5"); zdialog_resize(zd,300,0); zdialog_load_inputs(zd); // preload prior user inputs zdialog_fetch(zd,"spotspan",spotspan); // max. dustspot span (pixels) spotspan2 = spotspan * spotspan; zdialog_fetch(zd,"brightness",brightness); // max. dustspot brightness brightness = 0.001 * brightness; // scale 0 to 1 = white zdialog_fetch(zd,"contrast",contrast); // min. dustspot contrast contrast = 0.001 * contrast; // scale 0 to 1 = black/white zdialog_run(zd,dust_dialog_event,"save"); // run dialog - parallel thread_signal(); return; } // dialog event and completion callback function int dust_dialog_event(zdialog *zd, ch *event) { using namespace dust_names; void dust_erase(); if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat == 1) { // done thread_wait(); // wait for thread PXM_free(E3pxm); E3pxm = E9pxm; // image 3 = image 9 E9pxm = 0; edit_done(0); // commit edit } else { // cancel PXM_free(E9pxm); edit_cancel(0); // discard edit } zfree(pixgroup); // free memory zfree(pixstack); return 1; } if (zstrstr("spotspan brightness contrast red",event)) { zdialog_fetch(zd,"spotspan",spotspan); // max. dustspot span (pixels) spotspan2 = spotspan * spotspan; zdialog_fetch(zd,"brightness",brightness); // max. dustspot brightness brightness = 0.001 * brightness; // scale 0 to 1 = white zdialog_fetch(zd,"contrast",contrast); // min. dustspot contrast contrast = 0.001 * contrast; // scale 0 to 1 = black/white thread_signal(); // do the work } if (strmatch(event,"erase")) dust_erase(); if (strmatch(event,"undo1")) { PXM_free(E3pxm); E3pxm = PXM_copy(E9pxm); Fred = 0; Fpaint2(); } if (strmatch(event,"apply")) { // button if (Fred) dust_erase(); PXM_free(E9pxm); // image 9 = copy of image 3 E9pxm = PXM_copy(E3pxm); CEF->Fmods++; CEF->Fsaved = 0; } return 1; } // dust find thread function - find the dust particles and mark them void * dust_thread(void *) { using namespace dust_names; int xspan, yspan, span2; int group, cc, ii, kk; int px, py, dx, dy, ppx, ppy, npx, npy; float gbright, pbright, pcontrast; float ff = 1.0 / 256.0; uint16 direc; float *pix3; PXM_free(E3pxm); E3pxm = PXM_copy(E9pxm); cc = E1pxm->ww * E1pxm->hh * sizeof(int); // clear group arrays memset(pixgroup,0,cc); cc = maxgroups * sizeof(int); memset(groupcount,0,cc); memset(edgecount,0,cc); cc = maxgroups * sizeof(float ); memset(groupbright,0,cc); memset(edgebright,0,cc); cc = maxgroups * sizeof(sgroupspan); memset(groupspan,0,cc); group = 0; for (py = 0; py < E1pxm->hh; py++) // loop all pixels for (px = 0; px < E1pxm->ww; px++) { ii = py * E1pxm->ww + px; if (sa_stat == sa_stat_fini && ! sa_pixmap[ii]) continue; // not in active area if (pixgroup[ii]) continue; // already assigned to a group pix3 = PXMpix(E3pxm,px,py); // get pixel brightness gbright = ff * PIXBRIGHT(pix3); // 0 to 1.0 = white if (gbright > brightness) continue; // ignore bright pixel if (group == maxgroups-1) break; // too many groups, make no more pixgroup[ii] = ++group; // assign next group groupcount[group] = 1; groupbright[group] = gbright; pixstack[0].px = px; // put pixel into stack with pixstack[0].py = py; // direction = ahead pixstack[0].direc = 0; Nstack = 1; while (Nstack) { kk = Nstack - 1; // get last pixel in stack px = pixstack[kk].px; py = pixstack[kk].py; direc = pixstack[kk].direc; // next search direction if (direc == 'x') { Nstack--; // none left continue; } if (Nstack > 1) { ii = Nstack - 2; // get prior pixel in stack ppx = pixstack[ii].px; ppy = pixstack[ii].py; } else { ppx = px - 1; // if only one, assume prior = left ppy = py; } dx = px - ppx; // vector from prior to this pixel dy = py - ppy; switch (direc) { case 0: npx = px + dx; npy = py + dy; pixstack[kk].direc = 1; break; case 1: npx = px + dy; npy = py + dx; pixstack[kk].direc = 3; break; case 2: npx = px - dx; // back to prior pixel npy = py - dy; // (this path never taken) zappcrash("stack search error"); break; case 3: npx = px - dy; npy = py - dx; pixstack[kk].direc = 4; break; case 4: npx = px - dx; npy = py + dy; pixstack[kk].direc = 5; break; case 5: npx = px - dy; npy = py + dx; pixstack[kk].direc = 6; break; case 6: npx = px + dx; npy = py - dy; pixstack[kk].direc = 7; break; case 7: npx = px + dy; npy = py - dx; pixstack[kk].direc = 'x'; break; default: npx = npy = 0; zappcrash("stack search error"); } if (npx < 0 || npx > E1pxm->ww-1) continue; // pixel off the edge if (npy < 0 || npy > E1pxm->hh-1) continue; ii = npy * E1pxm->ww + npx; if (pixgroup[ii]) continue; // pixel already assigned if (sa_stat == sa_stat_fini && ! sa_pixmap[ii]) continue; // pixel outside area pix3 = PXMpix(E3pxm,npx,npy); // pixel brightness pbright = ff * PIXBRIGHT(pix3); if (pbright > brightness) continue; // brighter than limit pixgroup[ii] = group; // assign pixel to group ++groupcount[group]; // count pixels in group groupbright[group] += pbright; // sum brightness for group kk = Nstack++; // put pixel into stack pixstack[kk].px = npx; pixstack[kk].py = npy; pixstack[kk].direc = 0; // search direction } } Ngroups = group; // group numbers are 1-Ngroups for (py = 0; py < E1pxm->hh; py++) // loop all pixels for (px = 0; px < E1pxm->ww; px++) { ii = py * E1pxm->ww + px; group = pixgroup[ii]; if (! group) continue; if (groupspan[group].px1 == 0) { // first pixel found in this group groupspan[group].px1 = px; // group px1/py1 = this pixel groupspan[group].py1 = py; continue; } xspan = groupspan[group].px1 - px; // span from group px1/py1 to this pixel yspan = groupspan[group].py1 - py; span2 = xspan * xspan + yspan * yspan; if (span2 > groupspan[group].span2) { groupspan[group].span2 = span2; // if greater, group px2/py2 = this pixel groupspan[group].px2 = px; groupspan[group].py2 = py; } } for (py = 0; py < E1pxm->hh; py++) // loop all pixels for (px = 0; px < E1pxm->ww; px++) { ii = py * E1pxm->ww + px; group = pixgroup[ii]; if (! group) continue; if (groupspan[group].span2 > spotspan2) continue; xspan = groupspan[group].px2 - px; // span from this pixel to group px2/py2 yspan = groupspan[group].py2 - py; span2 = xspan * xspan + yspan * yspan; if (span2 > groupspan[group].span2) { groupspan[group].span2 = span2; // if greater, group px1/py1 = this pixel groupspan[group].px1 = px; groupspan[group].py1 = py; } } for (py = 0; py < E1pxm->hh; py++) // loop all pixels for (px = 0; px < E1pxm->ww; px++) { ii = py * E1pxm->ww + px; // eliminate group if span > limit group = pixgroup[ii]; if (! group) continue; if (! groupcount[group]) pixgroup[ii] = 0; else if (groupspan[group].span2 > spotspan2) { pixgroup[ii] = 0; groupcount[group] = 0; } } for (py = 1; py < E1pxm->hh-1; py++) // loop all pixels except image edges for (px = 1; px < E1pxm->ww-1; px++) { ii = py * E1pxm->ww + px; group = pixgroup[ii]; if (group) continue; // find pixels bordering group pixels pix3 = PXMpix(E3pxm,px,py); pbright = ff * PIXBRIGHT(pix3); group = pixgroup[ii-E1pxm->ww-1]; if (group) { ++edgecount[group]; // accumulate pixel count and edgebright[group] += pbright; // bordering the groups } group = pixgroup[ii-E1pxm->ww]; if (group) { ++edgecount[group]; edgebright[group] += pbright; } group = pixgroup[ii-E1pxm->ww+1]; if (group) { ++edgecount[group]; edgebright[group] += pbright; } group = pixgroup[ii-1]; if (group) { ++edgecount[group]; edgebright[group] += pbright; } group = pixgroup[ii+1]; if (group) { ++edgecount[group]; edgebright[group] += pbright; } group = pixgroup[ii+E1pxm->ww-1]; if (group) { ++edgecount[group]; edgebright[group] += pbright; } group = pixgroup[ii+E1pxm->ww]; if (group) { ++edgecount[group]; edgebright[group] += pbright; } group = pixgroup[ii+E1pxm->ww+1]; if (group) { ++edgecount[group]; edgebright[group] += pbright; } } for (group = 1; group <= Ngroups; group++) // compute group pixel and edge pixel { // mean brightness if (groupcount[group] && edgecount[group]) { edgebright[group] = edgebright[group] / edgecount[group]; groupbright[group] = groupbright[group] / groupcount[group]; pcontrast = edgebright[group] - groupbright[group]; // edge - group contrast if (pcontrast < contrast) groupcount[group] = 0; } } for (py = 0; py < E1pxm->hh; py++) // loop all pixels for (px = 0; px < E1pxm->ww; px++) { ii = py * E1pxm->ww + px; // eliminate group if low contrast group = pixgroup[ii]; if (! group) continue; if (! groupcount[group]) pixgroup[ii] = 0; } for (py = 0; py < E1pxm->hh; py++) // loop all pixels for (px = 0; px < E1pxm->ww; px++) { ii = py * E1pxm->ww + px; if (! pixgroup[ii]) continue; // not a dust pixel pix3 = PXMpix(E3pxm,px,py); // paint it red pix3[0] = 255; pix3[1] = pix3[2] = 0; } Fred = 1; Fpaint2(); // update window return 0; } // erase the marked dust areas void dust_erase() { using namespace dust_names; int cc, ii, px, py, inc; int qx, qy, npx, npy; int sx, sy, tx, ty; int rad, dist2, mindist2; float slope; float *pix1, *pix3; ch *pmap; int nc = E1pxm->nc, pcc = nc * sizeof(float); Fbusy(+1); PXM_free(E3pxm); // not a thread E3pxm = PXM_copy(E9pxm); cc = E1pxm->ww * E1pxm->hh; // allocate pixel done map pmap = (ch *) zmalloc(cc,"remove dust"); for (py = 0; py < E1pxm->hh; py++) // loop all pixels for (px = 0; px < E1pxm->ww; px++) { ii = py * E1pxm->ww + px; if (! pixgroup[ii]) continue; // not a dust pixel if (pmap[ii]) continue; // skip pixels already done mindist2 = 999999; npx = npy = 0; for (rad = 1; rad < 10; rad++) // find nearest edge (10 pixel limit) { for (qx = px-rad; qx <= px+rad; qx++) // search within rad for (qy = py-rad; qy <= py+rad; qy++) { if (qx < 0 || qx >= E1pxm->ww) continue; // off image edge if (qy < 0 || qy >= E1pxm->hh) continue; ii = qy * E1pxm->ww + qx; if (pixgroup[ii]) continue; // within dust area dist2 = (px-qx) * (px-qx) + (py-qy) * (py-qy); // distance**2 to edge pixel if (dist2 < mindist2) { mindist2 = dist2; npx = qx; // save nearest pixel found npy = qy; } } if (rad * rad >= mindist2) break; // can quit now } if (! npx && ! npy) continue; // should not happen qx = npx; // nearest edge pixel qy = npy; if (abs(qy - py) > abs(qx - px)) { // qx/qy = near edge from px/py slope = 1.0 * (qx - px) / (qy - py); if (qy > py) inc = 1; else inc = -1; for (sy = py; sy != qy+inc; sy += inc) // line from px/py to qx/qy { sx = px + slope * (sy - py); ii = sy * E1pxm->ww + sx; if (pmap[ii]) continue; pmap[ii] = 1; tx = qx + (qx - sx); // tx/ty = parallel line from qx/qy ty = qy + (qy - sy); if (tx < 0) tx = 0; if (tx > E1pxm->ww-1) tx = E1pxm->ww-1; if (ty < 0) ty = 0; if (ty > E1pxm->hh-1) ty = E1pxm->hh-1; pix1 = PXMpix(E3pxm,tx,ty); // copy pixel from tx/ty to sx/sy pix3 = PXMpix(E3pxm,sx,sy); memcpy(pix3,pix1,pcc); } } else { slope = 1.0 * (qy - py) / (qx - px); if (qx > px) inc = 1; else inc = -1; for (sx = px; sx != qx+inc; sx += inc) { sy = py + slope * (sx - px); ii = sy * E1pxm->ww + sx; if (pmap[ii]) continue; pmap[ii] = 1; tx = qx + (qx - sx); ty = qy + (qy - sy); if (tx < 0) tx = 0; if (tx > E1pxm->ww-1) tx = E1pxm->ww-1; if (ty < 0) ty = 0; if (ty > E1pxm->hh-1) ty = E1pxm->hh-1; pix1 = PXMpix(E3pxm,tx,ty); pix3 = PXMpix(E3pxm,sx,sy); memcpy(pix3,pix1,pcc); } } } zfree(pmap); Fred = 0; Fbusy(-1); Fpaint2(); // update window return; } /**************************************************************************************/ // Fix color fringes or lateral chromatic aberration // Shift R/B color planes to maximize overlap with G plane. // Radius of a pixel in R-plane or B-plane is shifted using the formula: // R2 = F1 * R1 + F2 * R1 * R1 + F3 * sqrt(R1) // R1: pixel old radius R2: pixel new radius // F1 F2 F3: computed values for maximum overlap // F1 is near 1.0 // F2 and F3 are near 0.0 namespace fringes_names { editfunc EFfringes; double Rf1, Rf2, Rf3, Bf1, Bf2, Bf3; int cx, cy; uint8 *pixcon; int threshcon; int evrgb; float evF1, evF2, evF3; double evRsum1[XSMP]; double evRsum2; } // menu function void m_fringes(GtkWidget *, ch *menu) { using namespace fringes_names; void fringes_threshcon(); int fringes_dialog_event(zdialog* zd, ch *event); F1_help_topic = TX("FRINGES"); printf("m_fringes \n"); EFfringes.menuname = "Fringes"; // setup edit EFfringes.menufunc = m_fringes; EFfringes.Farea = 2; // select area usable if (! edit_setup(EFfringes)) return; cx = Eww / 2; // image center cy = Ehh / 2; fringes_threshcon(); // get image threshold contrast /*** ____________________________________________ | Color Fringes | | | | Red Factors: [ 1.0 ] [ 0.0 ] [ 0.0 ] | | Blue Factors: [ 1.0 ] [ 0.0 ] [ 0.0 ] | | | | Find optimum factors: [ Search ] | | | | [OK] [X] | |____________________________________________| ***/ zdialog *zd = zdialog_new(TX("Color Fringes"),Mwin,"OK","X",null); CEF->zd = zd; zdialog_add_widget(zd,"hbox","hb1","dialog",0,"space=5"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"space=3|homog"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"space=3|homog"); zdialog_add_widget(zd,"vbox","vb3","hb1",0,"space=3|homog"); zdialog_add_widget(zd,"vbox","vb4","hb1",0,"space=3|homog"); zdialog_add_widget(zd,"label","labR","vb1",TX("Red Factors")); zdialog_add_widget(zd,"zspin","Rf1","vb2","-3|+3|0.2|0.0","size=6"); zdialog_add_widget(zd,"zspin","Rf2","vb3","-3|+3|0.2|0.0","size=6"); zdialog_add_widget(zd,"zspin","Rf3","vb4","-3|+3|0.2|0.0","size=6"); zdialog_add_widget(zd,"label","labB","vb1",TX("Blue Factors")); zdialog_add_widget(zd,"zspin","Bf1","vb2","-3|+3|0.2|0.0","size=6"); zdialog_add_widget(zd,"zspin","Bf2","vb3","-3|+3|0.2|0.0","size=6"); zdialog_add_widget(zd,"zspin","Bf3","vb4","-3|+3|0.2|0.0","size=6"); zdialog_add_widget(zd,"hbox","hbopt","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labopt","hbopt",TX("Find optimum factors:")); zdialog_add_widget(zd,"button","search","hbopt",TX("Search"),"space=5"); zdialog_run(zd,fringes_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion function int fringes_dialog_event(zdialog *zd, ch *event) { using namespace fringes_names; void fringes_RBshift(); void fringes_RBsearch(); if (strmatch(event,"done")) zd->zstat = 1; // from edit_setup() or f_save() if (strmatch(event,"cancel")) zd->zstat = 2; // from f_open() if (zd->zstat) { if (zd->zstat == 1) // done { edit_addhist("Red:%.1f %.1f %.1f Blue:%.1f %.1f %.1f", // edit params > edit hist Rf1, Rf2, Rf3, Bf1, Bf2, Bf3); // log metadata edit hist edit_done(0); } else edit_cancel(0); // discard edit zfree(pixcon); // free memory return 1; } if (zstrstr("Rf1 Rf2 Rf3 Bf1 Bf2 Bf3",event)) { zdialog_fetch(zd,"Rf1",Rf1); // get manually adjusted factors zdialog_fetch(zd,"Rf2",Rf2); zdialog_fetch(zd,"Rf3",Rf3); zdialog_fetch(zd,"Bf1",Bf1); zdialog_fetch(zd,"Bf2",Bf2); zdialog_fetch(zd,"Bf3",Bf3); fringes_RBshift(); // shift R/B color planes using factors } if (strmatch(event,"search")) { fringes_RBsearch(); // search for optimum factors zdialog_stuff(zd,"Rf1",Rf1); // stuff dialog with found factors zdialog_stuff(zd,"Rf2",Rf2); zdialog_stuff(zd,"Rf3",Rf3); zdialog_stuff(zd,"Bf1",Bf1); zdialog_stuff(zd,"Bf2",Bf2); zdialog_stuff(zd,"Bf3",Bf3); fringes_RBshift(); // shift R/B color planes using factors } return 1; } // Find contrast threshold for highest-contrast pixels in color green. void fringes_threshcon() { using namespace fringes_names; int ii, jj; int px, py, qx, qy; int Gcon, Gmax; int conhist[256]; float *pix1, *pix2; pixcon = (uint8 *) zmalloc(Eww * Ehh,"fringes"); // map of pixel green contrast for (py = 9; py < Ehh-9; py++) // loop all pixels for (px = 9; px < Eww-9; px++) { Gmax = 0; pix1 = PXMpix(E1pxm,px,py); for (qy = py - 5; qy <= py + 5; qy += 10) // loop 4 neighbors offset by 5 for (qx = px - 5; qx <= px + 5; qx += 10) { pix2 = PXMpix(E1pxm,qx,qy); // find max. green contrast Gcon = pix1[1] - pix2[1]; Gcon = abs(Gcon); if (Gcon > Gmax) Gmax = Gcon; } ii = py * Eww + px; // save pixel green contrast pixcon[ii] = Gmax; } memset(conhist, 0, 256 * sizeof(int)); for (ii = 0; ii < Eww * Ehh; ii++) // make histogram of contrast values { jj = pixcon[ii]; // conhist[jj] = pixels with ++conhist[jj]; // contrast value jj } for (jj = 0, ii = 255; ii > 0; ii--) // find minimum contrast for 200K { // highest green-contrast pixels jj += conhist[ii]; if (ii > 100 && jj > 100000) break; if (jj > 200000) break; } threshcon = ii; // threshold for fringes_evaluate() return; } // Compute factors Rf1 Rf2 Bf1 Bf2 that minimize // Rplane - Gplane and Bplane - Gplane void fringes_RBsearch() { using namespace fringes_names; double fringes_evaluate(int rgb, float F1, float F2, float F3); int rgb; // 0/1/2 = red/green/blue float F1, F2, F3; float R1, R2, R3; float S1, S2, S3; double Rsum, Rmin; progress_setgoal(1372); // initz. progress counter Fbusy(+1); for (rgb = 0; rgb <= 2; rgb += 2) // loop rgb = 0, 2 (red, blue) { Rmin = 1.0 * Eww * Ehh * 256; // max. possible image difference R1 = R2 = R3 = 0; for (F1 = -3; F1 <= +3; F1 += 1.0) // loop all combinations F1, F2, F3 for (F2 = -3; F2 <= +3; F2 += 1.0) // in 1-pixel steps for (F3 = -3; F3 <= +3; F3 += 1.0) { Rsum = fringes_evaluate(rgb, F1, F2, F3); // evaluate each combination if (Rsum < Rmin) { Rmin = Rsum; // remember best combination R1 = F1; R2 = F2; R3 = F3; } progress_addvalue(1); zmainloop(); } S1 = R1; S2 = R2; S3 = R3; // loop around best combination for (F1 = R1-1; F1 <= R1+1; F1 += 0.333) // loop all combinations F1, F2, F3 for (F2 = R2-1; F2 <= R2+1; F2 += 0.333) // in 0.333 pixel steps for (F3 = R3-1; F3 <= R3+1; F3 += 0.333) { Rsum = fringes_evaluate(rgb, F1, F2, F3); // evaluate each combination if (Rsum < Rmin) { Rmin = Rsum; // remember best combination S1 = F1; S2 = F2; S3 = F3; } progress_addvalue(1); zmainloop(); } if (rgb == 0) { Rf1 = S1; // red plane factors Rf2 = S2; Rf3 = S3; } else { Bf1 = S1; // blue plane factors Bf2 = S2; Bf3 = S3; } } Fbusy(-1); progress_setgoal(0); return; } // evaluate the alignment of a shifted R/B color plane with the G plane // R/B color plane is shifted using factors F1 F2 F3 // rgb is 0/2 for R/B double fringes_evaluate(int rgb, float F1, float F2, float F3) { using namespace fringes_names; void * fringes_evaluate_wthread(void *); evrgb = rgb; // make args avail. for thread evF1 = F1; evF2 = F2; evF3 = F3; do_wthreads(fringes_evaluate_wthread,NSMP); // do worker threads evRsum2 = 0; for (int ii = 0; ii < NSMP; ii++) evRsum2 += evRsum1[ii]; return evRsum2; } void * fringes_evaluate_wthread(void *arg) // worker thread { using namespace fringes_names; int index = *((int *) arg); int ii, px1, py1; float fx1, fy1, fx2, fy2, fx3, fy3; float *pix1, vpix[4]; double Rsum = 0; for (py1 = index + 9; py1 < Ehh-9; py1 += NSMP) // loop all image pixels for (px1 = 9; px1 < Eww-9; px1++) { ii = py1 * Eww + px1; // skip low contrast pixel if (pixcon[ii] < threshcon) continue; fx1 = 1.0 * (px1 - cx) / cx; // -1 to +1 at edges, 0 at center fy1 = 1.0 * (py1 - cy) / cy; fx2 = fx1 * fabsf(fx1); // square, keep sign fy2 = fy1 * fabsf(fy1); fx3 = fx1 * fx2; // cube fy3 = fy1 * fy2; fx1 = fx1 * evF1; // * F1 fy1 = fy1 * evF1; fx2 = fx2 * evF2; // * F2 fy2 = fy2 * evF2; fx3 = fx3 * evF3; // * F3 fy3 = fy3 * evF3; pix1 = PXMpix(E1pxm,px1,py1); // image unshifted pixel (G) vpixel(E1pxm, px1+fx1+fx2+fx3, py1+fy1+fy2+fy3, vpix); // virtual pixel, shifted (R/B) Rsum += fabs(vpix[evrgb] - pix1[1]); // sum shifted R/B - unshifted G } evRsum1[index] = Rsum; return 0; } // shift R/B color planes using factors Rf1 Rf2 Bf1 Bf2 void fringes_RBshift() { void * fringes_RBshift_wthread(void *); do_wthreads(fringes_RBshift_wthread,NSMP); // do worker threads if (sa_stat == sa_stat_fini) sa_postfix(); // if select area, restore unselected CEF->Fmods++; // image is modified CEF->Fsaved = 0; // and not saved Fpaint2(); // update window return; } void * fringes_RBshift_wthread(void *arg) // worker thread { using namespace fringes_names; int index = *((int *) arg); int px3, py3, ok; float px1, py1; float fx1, fy1, fx2, fy2, fx3, fy3; float *pix3, vpix[4]; for (py3 = index; py3 < Ehh; py3 += NSMP) // loop all image pixels for (px3 = 0; px3 < Eww; px3++) { pix3 = PXMpix(E3pxm,px3,py3); // output pixel fx1 = 1.0 * (px3 - cx) / cx; // -1 to +1 at edges, 0 at center fy1 = 1.0 * (py3 - cy) / cy; fx2 = fx1 * fabsf(fx1); // square, keep sign fy2 = fy1 * fabsf(fy1); fx3 = fx1 * fx2; // cube fy3 = fy1 * fy2; px1 = px3 + Rf1 * fx1 + Rf2 * fx2 + Rf3 * fx3; // red shift py1 = py3 + Rf1 * fy1 + Rf2 * fy2 + Rf3 * fy3; ok = vpixel(E1pxm,px1,py1,vpix); // red input pixel if (ok) pix3[0] = vpix[0]; px1 = px3 + Bf1 * fx1 + Bf2 * fx2 + Bf3 * fx3; // blue shift py1 = py3 + Bf1 * fy1 + Bf2 * fy2 + Bf3 * fy3; ok = vpixel(E1pxm,px1,py1,vpix); // blue input pixel if (ok) pix3[2] = vpix[2]; } return 0; } fotocx/metainfo/0000775000175000017500000000000015247006660012632 5ustar micomicofotocx/metainfo/kornelix.fotocx.metainfo.xml0000664000175000017500000000424015247006660020311 0ustar micomico net.kornelix.fotocx CC0-1.0 GPL-3.0+ Michael Cornelison Fotocx image editor Graphics photo editor collection version="26.8" Edit photos and manage a large image collection

Edit photos and manage a very large image collection. Navigate a large image collection with a thumbnail browser. View and edit image files (RAW, jpeg, png, tiff ...). Editing is done in 24 bits/color, output is 8 or 16 bits/color. Extensive tools for edit, repair, enhance, and special effects. View image changes as edit tools are applied interactively. Most edit tools can be applied locally and gradually - mouse paint. Undo and redo within and across edit functions. File versioning: save and recall multiple edit stages. Select image features or areas to edit separately from background. Copy and paste area selections within and across images. Combine functions: HDR, HDF, panorama, stack, image/text mashup. Metadata edit and report: keywords, captions, dates, locations ... Search images using any metadata, folder/file names, wildcards. Albums: select images and arrange order with drag and drop. Slide Show with animated transitions and pan/zoom. Scalable world map with image markers - click marker for gallery. Batch functions: convert, resize, upright, move, revise metatata. User Guide (many languages) describes all functions in great detail.

fotocx https://kornelix.net/fotocx/images/fotocx-views.jpg https://kornelix.net
fotocx/f.albums.cc0000664000175000017500000105411615247006660013056 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit - album and slide show functions m_album_create create a new album m_album_rename rename an album m_album_delete delete an album m_album_choose list albums, pick, show album_show callable show album m_album_current show current (last used) album m_gallery_to_album make album from current gallery album thumbnail functions: album_add_selfiles add selected files to album at position album_add_currfile add current file at position album_add_file add single file at position (drag/drop from gallery) album_remove_file remove file at position from album album_move_file move album file position (drag/drop within album) album_folder_rename update album file names after a folder rename album_purge_replace purge missing files, replace target files m_update_albums replace old with new version or append new to old m_album_mass_update album mass update utilities m_cycle_wallpaper cycle desktop wallpaper from album or folder m_slideshow album --> slide show ***************************************************************************************/ #define EX extern // disable extern declarations #include "fotocx.h" // (variables in fotocx.h are refs) /**************************************************************************************/ // Albums - create, view, edit named albums of image files // albums created by search and report functions - omit from album update functions int NXalbums = 7; cch *Xalbums[7] = { "/current_set", "/duplicate_images", "/gallery_screen", "/places_dates", "/search_results", "/selected_files", "/timeline" }; /**************************************************************************************/ // create or replace an album void m_album_create(GtkWidget *, ch *) // 25.1 { int album_create_dialog_event(zdialog *zd, ch *event); ch **flist; int NF; ch patt[200]; F1_help_topic = TX("CREATE ALBUM"); printf("m_album_create \n"); snprintf(patt,200,"%s/*",albums_folder); // get current album count zfind(patt,flist,NF); for (int ii = 0; ii < NF; ii++) zfree(flist[ii]); zfree(flist); if (NF >= maxalbums) { // cannot create more zmessageACK(Mwin,TX("max. album count exceeded: %d"),maxalbums); return; } /*** _______________________________________________ | Create or replace an album | | | | Album Name [____________________] [Browse] | | (o) make an initially empty album | | (o) fill from selected files | | (o) fill from the current gallery | | (o) select initial files | | | | [OK] [X] | |_______________________________________________| ***/ zdialog *zd = zdialog_new(TX("Create or replace an album"),Mwin,"OK","X",null); zdialog_add_widget(zd,"hbox","hbname","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labname","hbname",TX("Album Name"),"space=3"); zdialog_add_widget(zd,"zentry","albumname","hbname",0,"space=3|size=20"); zdialog_add_widget(zd,"button","browse","hbname",TX("Browse"),"space=3"); zdialog_add_widget(zd,"hbox","hbopt","dialog",0,"space=5"); zdialog_add_widget(zd,"label","space","hbopt",0,"space=10"); zdialog_add_widget(zd,"vbox","vbopt","hbopt"); zdialog_add_widget(zd,"radio","empty","vbopt",TX("make an initially empty album")); zdialog_add_widget(zd,"radio","selected","vbopt",TX("fill from selected files")); zdialog_add_widget(zd,"radio","gallery","vbopt",TX("fill from current gallery")); zdialog_add_widget(zd,"radio","select","vbopt",TX("select initial files")); zdialog_stuff(zd,"empty",1); zdialog_stuff(zd,"selected",0); zdialog_stuff(zd,"gallery",0); zdialog_stuff(zd,"select",0); zdialog_run(zd,album_create_dialog_event,"parent"); zdialog_wait(zd); zdialog_free(zd); return; } // dialog event and completion function int album_create_dialog_event(zdialog *zd, ch *event) { int Fempty, Fselected, Fgallery, Fselect; int yn; ch albumname[ANCC], newalbumfile[AFCC]; ch *cfile, *pp; FILE *fid; if (strmatch(event,"browse")) { cfile = zgetfile(TX("Album Name"),MWIN,"file",albums_folder); // choose file name if (! cfile) return 1; pp = strrchr(cfile,'/'); if (! pp) return 1; zdialog_stuff(zd,"albumname",pp+1); zfree(cfile); return 1; } if (! zd->zstat) return 1; // wait for completion if (zd->zstat != 1) return 1; // cancel zdialog_fetch(zd,"albumname",albumname,ANCC); // get album name if (*albumname <= ' ') { zmessageACK(Mwin,TX("enter an album name")); zd->zstat = 0; // keep dialog active return 1; } snprintf(newalbumfile,AFCC,"%s/%s",albums_folder,albumname); // make filespec if (regfile(newalbumfile)) { // already exists yn = zmessageYN(Mwin,TX("replace album %s ?"),albumname); if (! yn) return 1; } zstrcopy(curr_album,newalbumfile,"albums"); fid = fopen(curr_album,"w"); // open/write empty album file if (! fid) { zmessageACK(Mwin,strerror(errno)); return 1; } fclose(fid); zdialog_fetch(zd,"empty",Fempty); // get option zdialog_fetch(zd,"selected",Fselected); zdialog_fetch(zd,"gallery",Fgallery); zdialog_fetch(zd,"select",Fselect); if (Fempty) { zmessageACK(Mwin,TX("Use [Select] to add files to an empty album")); Fselect = 1; } if (Fselected) { if (zd_select_files) { // select files active 26.0 zmessageACK(Mwin,TX("complete file selection first")); return 1; } album_add_selfiles(1); // fill album from selected files } if (Fgallery) // fill album from gallery album_create_from_gallery(curr_album); if (Fselect) { // select initial album files m_select_files(0,0); album_add_selfiles(1); } album_show(); panelmessage(1,3,TX("new album created")); // 25.1 return 1; } // make an album from the current gallery // return 0 = OK, +N = error int album_create_from_gallery(ch *newalbumfile) { ch *pp; int Nth; FILE *fid; FTYPE ftype; if (navi::Gimages == 0) { zmessageACK(Mwin,TX("gallery is empty")); return 1; } if (navi::Gfiles > maxalbumfiles) { zmessageACK(Mwin,TX("max. album size exceeded: %d"),maxalbumfiles); return 1; } fid = fopen(newalbumfile,"w"); // open/write album file if (! fid) { zmessageACK(Mwin,strerror(errno)); return 1; } for (Nth = 0; Nth < navi::Gfiles; Nth++) // add gallery images to album file { pp = gallery(0,"getR",Nth); if (! pp) break; ftype = image_file_type(pp); // must be image type file if (ftype != IMAGE && ftype != RAW && ftype != VIDEO) continue; fprintf(fid,"%s\n",pp); } fclose(fid); return 0; } /**************************************************************************************/ // rename an existing album void m_album_rename(GtkWidget *, ch *) // 25.1 { zlist_t *zlist; ch *oldname, *newname; ch oldfile[200], newfile[200]; int err; F1_help_topic = TX("RENAME ALBUM"); printf("m_album_rename \n"); zlist = zlist_from_folder(albums_folder); if (! zlist) { zmessageACK(Mwin,TX("albums folder missing")); return; } oldname = popup_choose(zlist); zlist_free(zlist); if (! oldname) return; newname = zdialog_text(Mwin,TX("new album name"),oldname); if (! newname) return; snprintf(oldfile,200,"%s/%s",albums_folder,oldname); snprintf(newfile,200,"%s/%s",albums_folder,newname); if (regfile(newfile)) { zmessageACK(Mwin,TX("album already exists: %s"),newname); return; } err = rename(oldfile,newfile); if (err) { zmessageACK(Mwin,strerror(errno)); return; } zmessageACK(Mwin,TX("%s renamed: %s"),oldname,newname); return; } /**************************************************************************************/ // delete an album void m_album_delete(GtkWidget *, ch *) // 25.1 { zlist_t *zlist; ch *delname; ch delfile[200]; F1_help_topic = TX("DELETE ALBUM"); printf("m_album_delete \n"); zlist = zlist_from_folder(albums_folder); if (! zlist) { zmessageACK(Mwin,TX("albums folder missing")); return; } delname = popup_choose(zlist); zlist_free(zlist); if (! delname) return; snprintf(delfile,200,"%s/%s",albums_folder,delname); remove(delfile); zmessageACK(Mwin,TX("album %s: deleted"),delname); return; } /**************************************************************************************/ // choose an album and show a gallery of album image files void m_album_choose(GtkWidget *, ch *) // 25.1 { zlist_t *zlist; ch *album, albumfile[200]; F1_help_topic = TX("CHOOSE ALBUM"); printf("m_album_choose \n"); zlist = zlist_from_folder(albums_folder); if (! zlist) { zmessageACK(Mwin,TX("albums folder missing")); return; } album = popup_choose(zlist); if (! album) { zlist_free(zlist); return; } snprintf(albumfile,200,"%s/%s",albums_folder,album); album_show(albumfile); zlist_free(zlist); return; } /**************************************************************************************/ // initz. gallery from current album, show gallery // if albumfile is null, show current album // if not null, set current album from albumfile void album_show(ch *albumfile) // 25.1 { zlist_t *ZLfiles; int ii, Nf; ch *afile, *pp; printf("album_show %s\n",albumfile); if (! albumfile && ! curr_album) return; if (! albumfile) albumfile = curr_album; zstrcopy(curr_album,albumfile,"albums"); ZLfiles = zlist_from_file(albumfile); // get image files in album if (! ZLfiles) { pp = strrchr(albumfile,'/'); if (! pp) pp = albumfile; else pp++; zmessageACK(Mwin,TX("unknown or empty album: %s"),pp); return; } Nf = zlist_count(ZLfiles); if (Nf > maxalbumfiles) { zmessageACK(Mwin,TX("max. album size exceeded: %d"),maxalbumfiles); Nf = maxalbumfiles; } for (ii = 0; ii < Nf; ii++) // loop files in album { afile = zlist_get(ZLfiles,ii); // album file >> zlist if (! regfile(afile)) { // test file exists printf("missing file removed: %s \n",afile); zlist_put(ZLfiles,0,ii); // not found, replace with null } } zlist_to_file(ZLfiles,albumfile); // zlist >> album file zlist_free(ZLfiles); navi::gallerytype = ALBUM; gallery(albumfile,"initF",0); // gallery = album gallery(0,"sort",-2); // recall sort and position gallery(0,"paint",-1); // paint viewmode('G'); return; } /**************************************************************************************/ // 1-click to show the current (last used) album // This is a convenience when navigating back-and-forth between an album // and other folders while adding images to an album. void m_album_current(GtkWidget *, ch *menu) // 25.1 { F1_help_topic = TX("CURRENT ALBUM"); printf("m_album_current \n"); album_show(null); return; } /**************************************************************************************/ // make current gallery into an album with chosen or given name void m_gallery_to_album(GtkWidget *, ch *) { int gallery_album_dialog_event(zdialog *zd, ch *event); ch albumname[ANCC], albumfile[AFCC]; int yn, zstat; /*** _________________________________________ | Save Gallery as Album | | | | Album Name [_________________] [Browse] | | | | [OK] [X] | |_________________________________________| ***/ F1_help_topic = TX("GALLERY TO ALBUM"); printf("m_gallery_to_album \n"); zdialog *zd = zdialog_new(TX("Save Gallery as Album"),Mwin,"OK","X",null); zdialog_add_widget(zd,"hbox","hbname","dialog"); zdialog_add_widget(zd,"label","labname","hbname",TX("Album Name"),"space=5"); zdialog_add_widget(zd,"zentry","albumname","hbname",0,"space=3|size=20"); zdialog_add_widget(zd,"button","browse","hbname",TX("Browse"),"space=3"); zdialog_stuff(zd,"albumname","gallery"); // default name "gallery" zdialog_run(zd,gallery_album_dialog_event,"save"); // run dialog zstat = zdialog_wait(zd); zdialog_fetch(zd,"albumname",albumname,ANCC); // get album name zdialog_free(zd); if (zstat != 1) return; // user cancel if (*albumname <= ' ') return; snprintf(albumfile,AFCC,"%s/%s",albums_folder,albumname); // make album file name if (regfile(albumfile)) { // already exists yn = zmessageYN(Mwin,TX("replace album %s ?"),albumname); if (! yn) return; } album_create_from_gallery(albumfile); // create album album_show(albumfile); return; } // dialog event and completion function int gallery_album_dialog_event(zdialog *zd, ch *event) { ch *cfile, *pp, albumname[ANCC]; if (strmatch(event,"browse")) { cfile = zgetfile(TX("Album Name"),MWIN,"file",albums_folder); // choose file name if (! cfile) return 1; pp = strrchr(cfile,'/'); if (! pp) return 1; zdialog_stuff(zd,"albumname",pp+1); zfree(cfile); return 1; } if (zd->zstat != 1) return 1; // wait for [OK] zdialog_fetch(zd,"albumname",albumname,ANCC); // get album name if (*albumname <= ' ') { zmessageACK(Mwin,TX("enter an album name")); zd->zstat = 0; // keep dialog active } return 1; } /**************************************************************************************/ // insert selected files into album at designated position // mode: 1 = add at position 0 // 2 = use clicked_posn and clicked_width void album_add_selfiles(int mode) // use zlist funcs { zlist_t *ZLalbum, *ZLfiles, *ZLtemp; ch sfiles[AFCC]; int posn; F1_help_topic = TX("ALBUMS"); // for album popup menu if (! curr_album) return; if (mode == 1) posn = 0; // insert at album start else if (mode == 2) { posn = clicked_posn; // insert at clicked thumb position if (clicked_width > 50) posn++; // right side of thumbnail clicked } else return; snprintf(sfiles,AFCC,"%s/%s",albums_folder,"selected_files"); // selected_files > zlist ZLfiles = zlist_from_file(sfiles); if (! ZLfiles) return; ZLalbum = zlist_from_file(curr_album); // current album > zlist if (! ZLalbum) ZLalbum = zlist_new(0); ZLtemp = zlist_insert_zlist(ZLalbum,ZLfiles,posn); // insert ZLfiles into ZLalbum zlist_free(ZLalbum); ZLalbum = ZLtemp; zlist_to_file(ZLalbum,curr_album); // zlist > current album album_show(); // (will alarm maxalbumfiles) zlist_free(ZLfiles); // free memory zlist_free(ZLalbum); return; } /**************************************************************************************/ // insert 'curr_file' into album at designated position // mode: 1 = add at position 0 // 2 = use clicked_posn and clicked_width void album_add_currfile(int mode) // use zlist { zlist_t *ZLalbum; int posn; F1_help_topic = TX("ALBUMS"); // for album popup menu if (! curr_album) { zmessageACK(Mwin,TX("no current album")); return; } if (! curr_file) { zmessageACK(Mwin,TX("no current file")); return; } if (mode == 1) posn = 0; // insert at album start else if (mode == 2) { posn = clicked_posn; // insert at clicked thumb position if (clicked_width > 50) posn++; // right side of thumbnail clicked } else return; ZLalbum = zlist_from_file(curr_album); if (! ZLalbum) return; zlist_insert(ZLalbum,curr_file,posn); zlist_to_file(ZLalbum,curr_album); zlist_free(ZLalbum); album_show(); // (will alarm maxalbumfiles) return; } /**************************************************************************************/ // insert single file into album at position (drag/drop from gallery window) void album_add_file(ch *file, int posn) // use zlist { zlist_t *ZLalbum; F1_help_topic = TX("ALBUMS"); // for album popup menu if (! curr_album) return; ZLalbum = zlist_from_file(curr_album); if (! ZLalbum) return; zlist_insert(ZLalbum,file,posn); zlist_to_file(ZLalbum,curr_album); zlist_free(ZLalbum); album_show(); return; } /**************************************************************************************/ // remove file at position from album void album_remove_file(int posn) // use zlist { zlist_t *ZLalbum; F1_help_topic = TX("ALBUMS"); // for album popup menu if (! curr_album) return; ZLalbum = zlist_from_file(curr_album); if (! ZLalbum) return; zlist_remove(ZLalbum,posn); zlist_to_file(ZLalbum,curr_album); zlist_free(ZLalbum); album_show(); return; } /**************************************************************************************/ // move an album file from pos1 to pos2 (for drag and drop) void album_move_file(int pos1, int pos2) // use zlist { zlist_t *ZLalbum; ch *file; if (! curr_album) return; if (pos1 == pos2) return; ZLalbum = zlist_from_file(curr_album); if (! ZLalbum) return; file = zstrdup(zlist_get(ZLalbum,pos1),"albums"); zlist_remove(ZLalbum,pos1); if (pos2 > pos1) pos2--; zlist_insert(ZLalbum,file,pos2); zfree(file); zlist_to_file(ZLalbum,curr_album); zlist_free(ZLalbum); album_show(); return; } /**************************************************************************************/ // Replace file names in all albums after a folder rename. // Input args are the old and new folder full path names. void album_folder_rename(ch *oldname, ch *newname) { int ii, jj, Fchange, Nalbums = 0; ch findcomm[300]; ch *pp, **albumfiles = 0; int oldcc, newcc; ch newfile[XFCC]; zlist_t *ZL1, *ZL2; printf("album folder rename \n"); oldcc = strlen(oldname); newcc = strlen(newname); strncpy0(newfile,newname,newcc); snprintf(findcomm,300,"%s/*",albums_folder); // find all albums (files) zfind(findcomm,albumfiles,Nalbums); if (! Nalbums) return; for (ii = 0; ii < Nalbums; ii++) // loop all albums { pp = strrchr(albumfiles[ii],'/'); // /album_name if (! pp) continue; for (jj = 0; jj < NXalbums; jj++) // if excluded album, skip it if (strmatch(pp,Xalbums[jj])) break; // (place_dates, search, etc.) if (jj < NXalbums) continue; ZL1 = zlist_from_file(albumfiles[ii]); // input files ZL2 = zlist_new(zlist_count(ZL1)); // output files Fchange = 0; for (jj = 0; jj < zlist_count(ZL1); jj++) // loop input files { if (strmatchN(zlist_get(ZL1,jj),oldname,oldcc)) { // input file matches? strcpy(newfile + newcc, zlist_get(ZL1,jj) + oldcc); zlist_put(ZL2,newfile,jj); // yes, replace Fchange = 1; } else zlist_put(ZL2,zlist_get(ZL1,jj),jj); // no, copy input to output } if (Fchange) zlist_to_file(ZL2,albumfiles[ii]); // save updated album file zlist_free(ZL1); // free memory zlist_free(ZL2); } for (ii = 0; ii < Nalbums; ii++) // free album names zfree(albumfiles[ii]); zfree(albumfiles); return; } /**************************************************************************************/ // Purge missing album files, delete and optionally replace target files. // 'album' is an album name or "ALL" to process all albums. void album_purge_replace(ch *album, int Nt, ch **targfile, ch **repfile) { ch findcomm[300], *pp; ch **albfiles, *afile; int ii, jj, kk; int Na, Nf; int Fupdates; zlist_t *ZLfiles; printf("update album %s \n",album); for (ii = 0; ii < Nt; ii++) { if (repfile) printf("replace: %s \n with: %s \n",targfile[ii], repfile[ii]); else if (targfile) printf("delete: %s \n",targfile[ii]); } if (strmatch(album,"ALL")) { snprintf(findcomm,300,"%s/*",albums_folder); // find all albums (files) zfind(findcomm,albfiles,Na); } else { albfiles = (ch **) zmalloc(sizeof(ch *),"albums"); // single album albfiles[0] = zstrdup(album,"albums"); Na = 1; } for (ii = 0; ii < Na; ii++) // loop albums { pp = strrchr(albfiles[ii],'/'); // /album_name if (! pp) continue; for (jj = 0; jj < NXalbums; jj++) // if excluded album, skip it if (strmatch(pp,Xalbums[jj])) break; if (jj < NXalbums) continue; ZLfiles = zlist_from_file(albfiles[ii]); // get image files in album if (! ZLfiles) continue; Fupdates = 0; // count updates 26.4 Nf = zlist_count(ZLfiles); for (jj = 0; jj < Nf; jj++) // loop files in album { afile = zlist_get(ZLfiles,jj); // album file >> zlist for (kk = 0; kk < Nt; kk++) // loop target files { if (strmatch(afile,targfile[kk])) { // album file = target file if (repfile && repfile[kk]) zlist_put(ZLfiles,repfile[kk],jj); // yes, replace if available 25.1 else zlist_put(ZLfiles,0,jj); // no, replace with null Fupdates++; // count updates break; } } afile = zlist_get(ZLfiles,jj); // album file (possibly replaced) if (afile && ! regfile(afile)) { zlist_put(ZLfiles,0,jj); // not found, replace with null Fupdates++; // count updates 26.4 } } if (! Fupdates) continue; // nothing changed 26.4 zlist_to_file(ZLfiles,albfiles[ii]); // zlist >> album file zlist_free(ZLfiles); } for (ii = 0; ii < Na; ii++) // free memory zfree(albfiles[ii]); zfree(albfiles); if (curr_album && strmatch(navi::galleryname,curr_album)) album_show(); return; } // version for a single file and optional replacement void album_purge_replace(ch *album, ch *targfile, ch *repfile) { ch **tfile = 0, **rfile = 0; if (targfile) tfile = &targfile; if (repfile) rfile = &repfile; album_purge_replace(album, 1, tfile, rfile); return; } /**************************************************************************************/ // Replace an old file with a designated new file in selected albums, // or add the new file after the old file. namespace update_albums_names { ch **albumfiles = 0; ch oldfile[XFCC], newfile[XFCC]; // albums and replace option kept int Nalbums = 0; // to initialize next run int Freplace = 1; ch *selectformat = TX("%d albums selected"); ch selectmess[60]; }; // menu function void m_update_albums(GtkWidget *, ch *) { using namespace update_albums_names; int update_albums_dialog_event(zdialog *zd, ch *event); zdialog *zd; int ii, jj, kk, zstat, Fchange; ch *pp; zlist_t *ZL1, *ZL2; F1_help_topic = TX("UPDATE ALBUMS"); printf("m_update_albums \n"); if (Fblock("update albums")) return; /*** __________________________________________________ | Replace Album File | | | | [Select] N albums selected [x] select all | | | | old file [____________________________________] | | new file [____________________________________] | | | | (o) replace old (o) add after old | | | | [Clear] [Proceed] [X] | |__________________________________________________| ***/ zd = zdialog_new("Replace Album File",Mwin,"Clear",TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbselect","dialog",0,"space=5"); zdialog_add_widget(zd,"button","select","hbselect","Select","space=5"); zdialog_add_widget(zd,"label","labselect","hbselect",TX("0 albums selected"),"space=5"); zdialog_add_widget(zd,"check","all","hbselect",TX("select all"),"space=10"); zdialog_add_widget(zd,"vbox","space","dialog",0,"space=3"); zdialog_add_widget(zd,"hbox","hbold","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labold","hbold",TX("old file"),"space=5"); zdialog_add_widget(zd,"zentry","oldfile","hbold",0,"expand|space=5"); zdialog_add_widget(zd,"hbox","hbnew","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labnew","hbnew",TX("new file"),"space=5"); zdialog_add_widget(zd,"zentry","newfile","hbnew",0,"expand|space=5"); zdialog_add_widget(zd,"hbox","hbrep","dialog",0,"space=10"); zdialog_add_widget(zd,"radio","replace","hbrep",TX("replace old"),"space=5"); zdialog_add_widget(zd,"radio","addafter","hbrep",TX("add after old"),"space=10"); snprintf(selectmess,60,selectformat,Nalbums); zdialog_stuff(zd,"labselect",selectmess); if (Freplace) { zdialog_stuff(zd,"replace",1); zdialog_stuff(zd,"addafter",0); } else { zdialog_stuff(zd,"replace",0); zdialog_stuff(zd,"addafter",1); } zdialog_resize(zd,500,0); viewmode('G'); // gallery view zd_album_update = zd; // set up mouse intercepts zdialog_run(zd,update_albums_dialog_event,"parent"); // run dialog zstat = zdialog_wait(zd); // wait for completion zd_album_update = 0; // cancel mouse intercepts if (zstat != 2) { zdialog_free(zd); // cancel Fblock(0); return; } zdialog_fetch(zd,"oldfile",oldfile,XFCC); // [proceed] zdialog_fetch(zd,"newfile",newfile,XFCC); zdialog_fetch(zd,"replace",Freplace); zdialog_free(zd); if (! regfile(oldfile)) { zmessageACK(Mwin,TX("file not found: %s"),oldfile); Fblock(0); return; } if (! regfile(newfile)) { zmessageACK(Mwin,TX("file not found: %s"),newfile); Fblock(0); return; } if (! Nalbums) { zmessageACK(Mwin,TX("no albums selected")); Fblock(0); return; } for (ii = 0; ii < Nalbums; ii++) // loop all albums { pp = strrchr(albumfiles[ii],'/'); // /album_name if (! pp) continue; for (jj = 0; jj < NXalbums; jj++) // if excluded album, skip it if (strmatch(pp,Xalbums[jj])) break; // (place_dates, etc.) if (jj < NXalbums) continue; ZL1 = zlist_from_file(albumfiles[ii]); // input files ZL2 = zlist_new(maxalbumfiles); // output files Fchange = 0; for (jj = kk = 0; jj < zlist_count(ZL1); jj++) // loop input files { if (strmatch(zlist_get(ZL1,jj),oldfile)) { // input file matches? Fchange = 1; if (Freplace) zlist_put(ZL2,newfile,kk++); // replace: output new file else { zlist_put(ZL2,oldfile,kk++); // add after: zlist_put(ZL2,newfile,kk++); // output both files } } else zlist_put(ZL2,zlist_get(ZL1,jj),kk++); // no match, copy input to output if (kk > maxalbumfiles-2) break; } if (Fchange) zlist_to_file(ZL2,albumfiles[ii]); // save new album file zlist_free(ZL1); // free memory zlist_free(ZL2); album_show(albumfiles[ii]); // show updated album } Fblock(0); m_update_albums(0,0); // repeat until canceled return; } // dialog event and completion callback function int update_albums_dialog_event(zdialog *zd, ch *event) { using namespace update_albums_names; ch **pp; int ii,cc; ch findcomm[300]; if (zd->zstat < 0) { zd_album_update = 0; // escape or cancel return 1; } if (zd->zstat == 1) { // [clear] zd->zstat = 0; // keep dialog active zdialog_stuff(zd,"oldfile",""); // clear file name inputs zdialog_stuff(zd,"newfile",""); return 1; } if (strmatch(event,"select")) // [choose] button { for (ii = 0; ii < Nalbums; ii++) // free prior album names, if any zfree(albumfiles[ii]); if (albumfiles) zfree(albumfiles); albumfiles = 0; Nalbums = 0; pp = zgetfiles(TX("Choose Albums"),MWIN,"files",albums_folder); // choose album files if (pp) { cc = maxalbums * sizeof(ch *); albumfiles = (ch **) zmalloc(cc,"albums"); for (ii = 0; ii < maxalbums && pp[ii]; ii++) albumfiles[ii] = pp[ii]; Nalbums = ii; // album count selected zfree(pp); } snprintf(selectmess,60,selectformat,Nalbums); // update dialog album count zdialog_stuff(zd,"labselect",selectmess); } if (strmatch(event,"all")) // select all albums { for (ii = 0; ii < Nalbums; ii++) // free prior album names, if any zfree(albumfiles[ii]); if (albumfiles) zfree(albumfiles); albumfiles = 0; Nalbums = 0; snprintf(findcomm,300,"%s/*",albums_folder); // find all albums (files) zfind(findcomm,albumfiles,Nalbums); snprintf(selectmess,60,selectformat,Nalbums); // update dialog album count zdialog_stuff(zd,"labselect",selectmess); } return 1; } // mouse click function void update_albums_Lclick_func(int Nth) { using namespace update_albums_names; ch *imagefile = 0; ch filename[100]; int ftype; zdialog *zd = zd_album_update; if (! zd) return; // should not happen if (Nth < 0) return; imagefile = gallery(0,"getR",Nth); // get file at clicked position if (! imagefile) return; ftype = image_file_type(imagefile); // must be image or RAW file if (ftype != IMAGE && ftype != RAW && ftype != VIDEO) return; zdialog_fetch(zd,"oldfile",filename,100); // stuff oldfile or newfile if (filename[0] <= ' ') zdialog_stuff(zd,"oldfile",imagefile); // if currently blank else { zdialog_fetch(zd,"newfile",filename,100); if (filename[0] <= ' ') zdialog_stuff(zd,"newfile",imagefile); } return; } /**************************************************************************************/ // mass update of album files namespace album_mass_update_names { ch *selectformat = TX("%d albums selected"); ch selectmess[60]; ch massoption = 0; ch *albumfiles[maxalbums]; // albums to process zlist_t *ZLoldfs, *ZLnewfs; // old and new album files list int Nalbums = 0, Nold, Nnew; // corresp. counts zdialog *zdpop = 0; } // menu function void m_album_mass_update(GtkWidget *, ch *) { using namespace album_mass_update_names; int album_mass_update_dialog_event(zdialog *zd, ch *event); void album_mass_update_process(ch *albumname); int ii, jj; ch *albumname; F1_help_topic = TX("ALBUM MASS UPDATE"); printf("m_album_mass_update \n"); if (Fblock("album mass update")) return; /*** ______________________________________________________ | Album Mass Update | | | | [select] N albums selected | | | | Process selected album files: | | (o) Replace all with newest version only | | (o) Replace all versions with newest version | | (o) Add newest version to existing versions | | (o) Replace all with original and all versions | | (o) Replace all with original + newest version | | | | Process album files matching selected files: | | (o) Replace all with selected versions | | (o) Replace all versions with selected versions | | (o) Add selected versions to existing versions | | (o) Replace all with original + selected versions | | | | [Proceed] [X] | |______________________________________________________| ***/ massoption = 0; Nalbums = 0; zdpop = 0; zdialog *zd = zdialog_new(TX("Album Mass Update"),Mwin,TX("Proceed"),"X",null); zdialog_add_widget(zd,"hbox","hbselect","dialog",0,"space=5"); zdialog_add_widget(zd,"button","select","hbselect","Select","space=3"); zdialog_add_widget(zd,"label","labselect","hbselect",TX("0 albums selected"),"space=5"); zdialog_add_widget(zd,"vbox","space","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hball","dialog"); zdialog_add_widget(zd,"label","laball","hball",TX("Process selected album files:"),"space=3"); zdialog_add_widget(zd,"vbox","vb1","dialog"); zdialog_add_widget(zd,"hbox","hbA","vb1"); zdialog_add_widget(zd,"check","optA","hbA",TX("Replace all with newest version only"),"space=12"); zdialog_add_widget(zd,"hbox","hbB","vb1"); zdialog_add_widget(zd,"check","optB","hbB",TX("Replace all versions with newest version"),"space=12"); zdialog_add_widget(zd,"hbox","hbC","vb1"); zdialog_add_widget(zd,"check","optC","hbC",TX("Add newest version to existing versions"),"space=12"); zdialog_add_widget(zd,"hbox","hbD","vb1"); zdialog_add_widget(zd,"check","optD","hbD",TX("Replace all with original and all versions"),"space=12"); zdialog_add_widget(zd,"hbox","hbE","vb1"); zdialog_add_widget(zd,"check","optE","hbE",TX("Replace all with original + newest version"),"space=12"); zdialog_add_widget(zd,"vbox","space","dialog",0,"space=5"); zdialog_add_widget(zd,"hbox","hbselc","dialog"); zdialog_add_widget(zd,"label","labselc","hbselc",TX("Process album files matching selected files:"),"space=3"); zdialog_add_widget(zd,"vbox","vb2","dialog"); zdialog_add_widget(zd,"hbox","hbM","vb2"); zdialog_add_widget(zd,"check","optM","hbM",TX("Replace all with selected versions"),"space=12"); zdialog_add_widget(zd,"hbox","hbN","vb2"); zdialog_add_widget(zd,"check","optN","hbN",TX("Replace all versions with selected versions"),"space=12"); zdialog_add_widget(zd,"hbox","hbO","vb2"); zdialog_add_widget(zd,"check","optO","hbO",TX("Add selected versions to existing versions"),"space=12"); zdialog_add_widget(zd,"hbox","hbP","vb2"); zdialog_add_widget(zd,"check","optP","hbP",TX("Replace all with original + selected versions"),"space=12"); zdialog_run(zd,album_mass_update_dialog_event,"parent"); // run dialog zdialog_wait(zd); // wait for completion if (! Nalbums || ! massoption) { // canceled Fblock(0); return; } if (zdpop) zdialog_free(zdpop); // open log report zdpop = popup_report_open(TX("album mass update"),Mwin,800,600, 0,0,0,"Save","X",null); Fbusy(+1); for (ii = 0; ii < Nalbums; ii++) // loop selected albums { zmainloop(); // 26.5 if (! zdialog_valid(zdpop)) break; // report canceled albumname = strrchr(albumfiles[ii],'/'); // /album_name if (! albumname) continue; for (jj = 0; jj < NXalbums; jj++) // if excluded album, skip it if (strmatch(albumname,Xalbums[jj])) break; if (jj < NXalbums) continue; ZLoldfs = zlist_from_file(albumfiles[ii]); // album file list if (! ZLoldfs) continue; Nold = zlist_count(ZLoldfs); ZLnewfs = zlist_new(maxalbumfiles); // container, new file list album_mass_update_process(albumname); // ZLoldfs --> ZLnewfs zlist_to_file(ZLnewfs,albumfiles[ii]); // replace album file zlist_free(ZLoldfs); // free memory zlist_free(ZLnewfs); } Fbusy(-1); if (! zdialog_valid(zdpop)) printf("*** report canceled \n"); album_show(albumfiles[0]); // show first album processed for (ii = 0; ii < Nalbums; ii++) // free memory zfree(albumfiles[ii]); Fblock(0); return; } // dialog event and completion function int album_mass_update_dialog_event(zdialog *zd, ch *event) { using namespace album_mass_update_names; int ii; ch **pp; if (zd->zstat) { if (zd->zstat == 1) // proceed { if (Nalbums == 0) { zd->zstat = 0; zmessageACK(Mwin,TX("no albums selected")); return 1; } if (! massoption) { zd->zstat = 0; zmessageACK(Mwin,TX("no option selected")); return 1; } zdialog_free(zd); return 1; } massoption = 0; // cancel zdialog_free(zd); return 1; } if (strmatch(event,"select")) { for (ii = 0; ii < Nalbums; ii++) zfree(albumfiles[ii]); pp = zgetfiles(TX("Select Albums"),MWIN,"files",albums_folder); // select album files if (pp) { for (ii = 0; ii < maxalbums && pp[ii]; ii++) albumfiles[ii] = pp[ii]; Nalbums = ii; // album count selected zfree(pp); } snprintf(selectmess,60,selectformat,Nalbums); // update dialog album count zdialog_stuff(zd,"labselect",selectmess); } if (zstrstr("optA optB optC optD optE optM optN optO optP",event)) { zdialog_stuff(zd,"optA",0); zdialog_stuff(zd,"optB",0); zdialog_stuff(zd,"optC",0); zdialog_stuff(zd,"optD",0); zdialog_stuff(zd,"optE",0); zdialog_stuff(zd,"optM",0); zdialog_stuff(zd,"optN",0); zdialog_stuff(zd,"optO",0); zdialog_stuff(zd,"optP",0); zdialog_stuff(zd,event,1); massoption = event[3]; } return 1; } // process the list of Nold album files in ZLoldfs // output list of Nnew new album files in ZLnewfs void album_mass_update_process(ch *albumname) { using namespace album_mass_update_names; int ii, ii1, ii2, jj, kk, kk1, kk2; int ll, nf, nc, Fchanged; int Nself = 0; ch sfiles[AFCC]; ch *rootname, *basename, *pp; ch **fileversions, *ppselect[100]; zlist_t *ZLselfs = 0; popup_report_write(zdpop,0,"\n"); // report album name popup_report_write(zdpop,1,"%s \n",albumname); if (massoption >= 'M') // if 'selected files' option { snprintf(sfiles,AFCC,"%s/%s",albums_folder,"selected_files"); // get selected_files ZLselfs = zlist_from_file(sfiles); if (ZLselfs) Nself = zlist_count(ZLselfs); if (! Nself) { zmessageACK(Mwin,TX("no files selected")); return; } } ii = 0; // input oldfiles index kk = 0; // output newfiles index while (ii < Nold) // loop old files in name/version groups { if (! zdialog_valid(zdpop)) break; // report canceled if (kk > maxalbumfiles-100) { zmessageACK(Mwin,TX("max. album size exceeded: %d"),maxalbumfiles); // stop with sufficient margin break; } rootname = file_rootname(zlist_get(ZLoldfs,ii)); // get root name for group /.../filename if (! rootname) continue; // no files found for group basename = file_basename(zlist_get(ZLoldfs,ii)); // get base name for group /.../filename.ext // (null if only versions are in group) ii1 = ii; for (ii2 = ii+1; ii2 < Nold; ii2++) // range of oldfiles group, ii1 to ii2 if (! strmatch(rootname,file_rootname(zlist_get(ZLoldfs,ii2)))) break; ii = ii2; // leave ii at start of next oldfiles group ii2--; kk1 = kk; // start of next newfiles group kk2 = kk1 - 1; // (empty) if (massoption == 'A') // Replace all files with newest version only { pp = file_newest_version(zlist_get(ZLoldfs,ii1)); if (pp) zlist_put(ZLnewfs,pp,kk++); // add newest version only to newfiles goto report; } if (massoption == 'B') // Replace all versions with newest version { if (basename) { for (jj = ii1; jj <= ii2; jj++) // oldfiles includes basename file? if (strmatch(basename,zlist_get(ZLoldfs,jj))) break; if (jj <= ii2) zlist_put(ZLnewfs,basename,kk++); // yes, add basename to newfiles } pp = file_newest_version(zlist_get(ZLoldfs,ii1)); // newest version if (pp && basename && ! strmatch(pp,basename)) // not same as basename zlist_put(ZLnewfs,pp,kk++); // add to newfiles goto report; } if (massoption == 'C') // Add newest version to existing versions { for (jj = ii1; jj <= ii2; jj++) // add oldfiles to newfiles zlist_put(ZLnewfs,zlist_get(ZLoldfs,jj),kk++); pp = file_newest_version(zlist_get(ZLoldfs,ii1)); // newest version if (pp) { for (jj = ii1; jj <= ii2; jj++) // already included in oldfiles? if (strmatch(pp,zlist_get(ZLoldfs,jj))) break; if (jj > ii2) zlist_put(ZLnewfs,pp,kk++); // no, add to newfiles } goto report; } if (massoption == 'D') // Replace all with original + all versions { fileversions = file_all_versions(zlist_get(ZLoldfs,ii1),nf); // get basename and all versions that exist if (! nf) goto report; for (jj = 0; jj < nf; jj++) // add all file versions to newfiles zlist_put(ZLnewfs,fileversions[jj],kk++); zfree(fileversions); // free memory goto report; } if (massoption == 'E') // Replace all with original + newest version { if (basename) zlist_put(ZLnewfs,basename,kk++); // add basename to newfiles pp = file_newest_version(zlist_get(ZLoldfs,ii1)); if (pp && (! basename || ! strmatch(pp,basename))) // add newest version to newfiles zlist_put(ZLnewfs,pp,kk++); // if not same as basename goto report; } if (massoption < 'M') continue; // not a selected files option, stop here for (nc = ll = 0; ll < Nself && nc < 100; ll++) // find matching select files if (strmatch(rootname,file_rootname(zlist_get(ZLselfs,ll)))) ppselect[nc++] = zlist_get(ZLselfs,ll); if (nc == 0) { for (jj = ii1; jj <= ii2; jj++) // none, add all oldfiles to newfiles zlist_put(ZLnewfs,zlist_get(ZLoldfs,jj),kk++); goto report; // album unchanged } if (massoption == 'M') // Replace all with selected versions { for (ll = 0; ll < nc; ll++) // loop selected files zlist_put(ZLnewfs,ppselect[ll],kk++); // add selected files to newfiles goto report; } if (massoption == 'N') // Replace all versions with selected versions { if (basename) { for (jj = ii1; jj <= ii2; jj++) // oldfiles includes basename? if (strmatch(basename,zlist_get(ZLoldfs,jj))) break; if (jj <= ii2) zlist_put(ZLnewfs,basename,kk++); // yes, add basename to newfiles } for (ll = 0; ll < nc; ll++) // loop selected files if (! basename || ! strmatch(basename,ppselect[ll])) // if selected file not basename zlist_put(ZLnewfs,ppselect[ll],kk++); // add selected file to newfiles goto report; } if (massoption == 'O') // Add selected versions to existing versions { for (jj = ii1; jj <= ii2; jj++) // add all oldfiles to newfiles zlist_put(ZLnewfs,zlist_get(ZLoldfs,jj),kk++); for (ll = 0; ll < nc; ll++) { // loop selected files for (jj = ii1; jj <= ii2; jj++) // loop oldfiles if (strmatch(zlist_get(ZLoldfs,jj),ppselect[ll])) break; // is selected file included in oldfiles? if (jj > ii2) zlist_put(ZLnewfs,ppselect[ll],kk++); // no, add selected file to newfiles } goto report; } if (massoption == 'P') // Replace all with original + selected vers. { if (basename) zlist_put(ZLnewfs,basename,kk++); // add basename to newfiles for (ll = 0; ll < nc; ll++) // loop selected files if (! basename || ! strmatch(basename,ppselect[ll])) // if selected file not basename zlist_put(ZLnewfs,ppselect[ll],kk++); // add selected file to newfiles goto report; } report: // report old and new/replacement files kk2 = kk - 1; // newfiles range: kk1-kk2 oldfiles: ii1-ii2 Fchanged = 0; if (kk2-kk1 != ii2-ii1) Fchanged = 1; // report only changed file groups if (! Fchanged) { for (jj = ii1; jj <= ii2; jj++) if (zlist_find(ZLnewfs,zlist_get(ZLoldfs,jj),0) < 0) break; if (jj < ii2) Fchanged = 1; } if (! Fchanged) { for (jj = kk1; jj <= kk2; jj++) if (zlist_find(ZLoldfs,zlist_get(ZLnewfs,jj),0) < 0) break; if (jj < kk2) Fchanged = 1; } if (! Fchanged) continue; if (! zdialog_valid(zdpop)) break; // report canceled popup_report_write(zdpop,0,"old files: "); // report old files group for (jj = ii1; jj <= ii2; jj++) { pp = zlist_get(ZLoldfs,jj); pp = strrchr(pp,'/'); popup_report_write(zdpop,0,"%s ",pp+1); } popup_report_write(zdpop,0,"\n"); popup_report_write(zdpop,0,"new files: "); // report corresp. new files group for (jj = kk1; jj <= kk2; jj++) { pp = zlist_get(ZLnewfs,jj); pp = strrchr(pp,'/'); popup_report_write(zdpop,0,"%s ",pp+1); } popup_report_write(zdpop,0,"\n"); } Nnew = kk; // new file count in ZLnewfs if (ZLselfs) zlist_free(ZLselfs); return; } /************************************************************************************** cycle wallpaper function Periodic update of desktop wallpaper image, using Fotocx album name or any folder containing image files. Called via Fotocx command line: $ fotocx -cwp NNN container NNN update interval in seconds container a Fotocx album name or folder pathname if NNN = 0, make one wallpaper update and exit ***************************************************************************************/ void m_cycle_wallpaper(int argc, ch **argv) { zlist_t *ZLfiles = 0; int ii, err, Nfiles, secs, nextF; ch *pp, *container, **imagefiles, **wprecs; ch albumfile[500], wpfile[500]; FILE *fid; printf("m_cycle_wallpaper \n"); printf("cycle wallpaper: secs: %s container: %s \n",argv[2],argv[3]); if (argc < 4) { printf("*** missing command parameters \n"); zexit(0,"cycle wallpaper exit"); } secs = atoi(argv[2]); container = argv[3]; if (! *container) { printf("*** no image container specified \n"); zexit(0,"cycle wallpaper exit"); } if (*container == '/') // container is folder path name { if (! dirfile(container)) { printf("*** image container not a valid folder \n"); zexit(0,"cycle wallpaper exit"); } err = find_imagefiles(container,1,imagefiles,Nfiles); // get list of image files if (err || Nfiles == 0) { printf("*** image container is empty \n"); zexit(0,"cycle wallpaper exit"); } if (Nfiles > 1) HeapSort(imagefiles,Nfiles); // sort alphabetically } else // container is a fotocx album name { snprintf(albumfile,500,"%s/%s",albums_folder,container); // album file name ZLfiles = zlist_from_file(albumfile); // get contained files if (! ZLfiles) goto filerr; Nfiles = zlist_count(ZLfiles); if (! Nfiles) goto filerr; imagefiles = (ch **) zmalloc(Nfiles * sizeof(ch *),"wallpaper"); // allocate memory for file list for (ii = Nfiles = 0; ii < zlist_count(ZLfiles); ii++) { // screen for image files imagefiles[Nfiles] = zlist_get(ZLfiles,ii); if (image_file_type(imagefiles[Nfiles]) == IMAGE) Nfiles++; } printf("album contains %d image files \n",Nfiles); // keep ZLfiles in memory if (Nfiles == 0) zexit(0,"cycle wallpaper exit"); } snprintf(wpfile,500,"%s/wallpaper",get_zhomedir()); // get last wallpaper file used ii = zreadfile(wpfile,wprecs); if (ii < 1) pp = "no wallpaper file"; else pp = wprecs[0]; for (ii = 0; ii < Nfiles; ii++) // find in file list if (strmatch(pp,imagefiles[ii])) break; if (ii < Nfiles) nextF = ii; // found else nextF = -1; // not found, set first file - 1 while (true) // loop forever { nextF++; // next file if (nextF >= Nfiles) nextF = 0; // last + 1 --> first ii = nextF; printf("image file: %s \n",imagefiles[ii]); curr_file = imagefiles[ii]; m_wallpaper(0,0); // file --> desktop wallpaper fid = fopen(wpfile,"w"); if (! fid) goto filerr; // write file to wallpaper file fprintf(fid,"%s",imagefiles[ii]); fclose(fid); if (secs <= 0) zexit(0,"exit fotocx wallpaper"); zsleep(secs); } filerr: zexit(0,"cycle wallpaper file error: %s",strerror(errno)); } /**************************************************************************************/ // slide show function int ss_dialog_event(zdialog *zd, ch *event); // main dialog int ss_timerfunc(void *); // timer function int ss_nextimage(int current); // get next image to show int ss_nextrans(); // select next transition to use int ss_showtext(int, int, int); // show filename/title/description PXB *ss_loadpxb(ch *file); // load image as PXB pixmap void ss_transprefs_dialog(); // edit transition preferences void ss_imageprefs_dialog(); // edit image preferences void ss_imageprefs_dialog(); void ss_loadprefs(); // load preferences from file void ss_saveprefs(); // write preferences to file void ss_blankwindow(); // blank the window void ss_instant(); // transition functions void ss_fadein(); void ss_rollright(); void ss_slidefadein(); void ss_rolldown(); void ss_venetian(); void ss_grate(); void ss_rectangle(); void ss_contract(); void ss_expand(); void ss_radar(); void ss_japfan(); void ss_spiral(); void ss_ellipse(); void ss_raindrops(); void ss_doubledoor(); void ss_rotate(); void ss_fallover(); void ss_spheroid(); void ss_turnpage(); void ss_frenchdoor(); void ss_windmill(); void ss_pixelize(); void ss_twist(); void ss_Xopen(); void ss_squishout(); void ss_disintegrate(); void ss_fliptiles(); void ss_interleave(); void ss_explode(); void ss_implode(); void ss_zoom_setup(ch *file); void ss_zoom_start(float zoom); PXB * ss_zoom_wait(); void ss_zoomin(); void ss_zoomout(); ch *ss_albumfile = 0; // slide show album file ch *ss_albumname = 0; // album name (ss_albumfile tail) int ss_Nfiles = 0; // album file count int ss_imagetime = 0; // image display default time int ss_texttime = 0; // show text time int ss_cliplimit = 10; // image clipping limit from user int ss_randomimage = 0; // use random image order int ss_randomtrans = 0; // use random transition order int ss_fullscreen = 0; // flag, full screen mode int ss_replay = 0; // flag, start over when done float ss_trantime = 4.0; // default transition time, seconds float ss_zoomsize = 1.0; // zoom size, 1-3.0 = 3x int ss_zoomtype = 0; // 0/1/2 = none/zoomin/zoomout int ss_zoomtime = 2; // zoom time, seconds int ss_zoomlocx, ss_zoomlocy; // zoom target (50/50 = image midpoint) int ss_setzloc; // 1-shot flag for image prefs dialog int ss_ww, ss_hh, ss_rs; // slide show image size, rowstride ch *ss_oldfile, *ss_newfile; // image files for transition PXB *ss_pxbold, *ss_pxbnew; // PXB pixmap images: old, new double ss_timer = 0; // slide show timer ch *ss_event; // slide show event int ss_escape; // flag, kill running slide show int ss_paused; // slide show paused status int ss_Fcurrent = 0; // current image file int ss_isblank = 0; // window is blank ch ss_KBkeyB = 'B'; // KB key: blank screen ch ss_KBkeyN = 'N'; // KB key: transition to next image ch ss_KBkeyP = 'P'; // KB key: pause /resume ch ss_KBkeyX = 'X'; // KB key: magnify image int ss_NT; // threads for transition funcs struct ss_trantab_t { // transition table ch tranname[32]; // transition name int enabled; // enabled or not float trantime; // duration, seconds int preference; // relative preference, 0-99 void (*func)(); // function to perform transition }; #define SSNT 30 // slide show transition types #define SSMAXI 10000 // max. slide show images ss_trantab_t ss_trantab[SSNT]; // specific slide show transition prefs int ss_Tused[SSNT]; // list of transition types enabled int ss_Tlast[SSNT]; // last transitions used, in order int ss_Nused; // count of enabled transitions, 0-SSNT int ss_Tnext; // next transition to use >> last one used ss_trantab_t ss_trantab_default[SSNT] = // transition defaults { // name enab time pref function // (enabled, trantime, preference) { "instant", 1, 0.0, 10, ss_instant }, { "fade-in", 1, 2.0, 10, ss_fadein }, { "roll-right", 1, 2.0, 10, ss_rollright }, // NO BLANKS IN TRANSITION NAMES { "slide-fade-in", 1, 2.0, 10, ss_slidefadein }, { "roll-down", 1, 2.0, 10, ss_rolldown }, { "venetian", 1, 2.0, 10, ss_venetian }, { "grate", 1, 2.0, 10, ss_grate }, { "rectangle", 1, 2.0, 10, ss_rectangle }, { "contract", 1, 2.0, 10, ss_contract }, { "expand", 1, 2.0, 10, ss_expand }, { "radar", 1, 2.0, 10, ss_radar }, { "Japan-fan", 1, 2.0, 10, ss_japfan }, { "Spiral", 1, 2.0, 10, ss_spiral }, { "ellipse", 1, 2.0, 10, ss_ellipse }, { "raindrops", 1, 2.0, 10, ss_raindrops }, { "doubledoor", 1, 2.0, 10, ss_doubledoor }, { "rotate", 1, 2.0, 10, ss_rotate }, { "fallover", 1, 2.0, 10, ss_fallover }, { "spheroid", 1, 2.0, 10, ss_spheroid }, { "turn-page", 1, 2.0, 10, ss_turnpage }, { "french-door", 1, 2.0, 10, ss_frenchdoor }, { "windmill", 1, 2.0, 10, ss_windmill }, { "pixelize", 1, 2.0, 10, ss_pixelize }, { "twist", 1, 2.0, 10, ss_twist }, { "Xopen", 1, 2.0, 10, ss_Xopen }, { "squish-out", 1, 2.0, 10, ss_squishout }, { "disintegrate", 1, 2.0, 10, ss_disintegrate }, { "flip-tiles", 1, 2.0, 10, ss_fliptiles }, { "explode", 1, 2.0, 10, ss_explode }, { "implode", 1, 2.0, 10, ss_implode } }; // note: ss_interleave is omitted (visually unappealing) struct ss_imagetab_t { // image table ch *imagefile; // image file int preference; // relative preference, 0-99 int wait0; // seconds to wait int filesecs; // seconds to show file name int titlesecs; // seconds to show title int descsecs; // seconds to show description int wait1; // seconds to wait int zoomtype; // 0/1/2 = none/zoomin/zoomout float zoomsize; // zoom size, 1-3.0 = 3x int zoomtime; // zoom time, seconds int zoomlocx, zoomlocy; // zoom target (50/50 = image midpoint) int wait2; // seconds to wait ch tranname[32]; // transition type to use }; ss_imagetab_t ss_imagetab[SSMAXI]; // specific slide show image table // ************************************************************************************ // menu function - start or stop a slide show void m_slideshow(GtkWidget *, ch *) { zdialog *zd; int zstat, ii; F1_help_topic = TX("SLIDE SHOW"); printf("m_slideshow \n"); if (Fblock("slide show")) return; ss_NT = NSMP - 2; // use SMP count from settings 25.0 if (ss_NT < 4) ss_NT = 4; /*** ________________________________________________________ | Slide Show | | | | [Select Album] album-name 123 images | | text time [___] Image Time [___] Clip Limit % [___] | | [x] Full Screen [x] Auto-replay [x] Random Image | | Customize: [transitions] [image files] [keyboard] | | | | [Start] [Resume] [X] | |________________________________________________________| ***/ zd = zdialog_new("Slide Show",Mwin,TX("Start"),TX("Resume"),"X",null); zdialog_add_widget(zd,"hbox","hbss","dialog",0,"space=3"); zdialog_add_widget(zd,"button","selectalbum","hbss",TX("Select Album"),"space=5"); zdialog_add_widget(zd,"label","albumname","hbss",TX("no selection"),"space=5"); zdialog_add_widget(zd,"label","nfiles","hbss",TX("no images"),"space=5"); zdialog_add_widget(zd,"hbox","hbprefs","dialog",0,"space=2"); zdialog_add_widget(zd,"label","labtexttime","hbprefs",TX("text time"),"space=5"); zdialog_add_widget(zd,"zspin","texttime","hbprefs","0|9999|1|0"); zdialog_add_widget(zd,"label","space","hbprefs",0,"space=5"); zdialog_add_widget(zd,"label","labimagetime","hbprefs",TX("Image Time"),"space=5"); zdialog_add_widget(zd,"zspin","imagetime","hbprefs","1|9999|1|3"); zdialog_add_widget(zd,"label","space","hbprefs",0,"space=5"); zdialog_add_widget(zd,"label","labclip","hbprefs",TX("Clip Limit %"),"space=5"); zdialog_add_widget(zd,"zspin","cliplim","hbprefs","0|50|1|0"); zdialog_add_widget(zd,"hbox","hbscreen","dialog",0,"space=2"); zdialog_add_widget(zd,"check","fullscreen","hbscreen",TX("Full Screen"),"space=3"); zdialog_add_widget(zd,"check","replay","hbscreen",TX("Auto-replay"),"space=5"); zdialog_add_widget(zd,"check","randomimage","hbscreen",TX("Random Image"),"space=5"); zdialog_add_widget(zd,"hbox","hbcust","dialog",0,"space=5"); zdialog_add_widget(zd,"label","labprefs","hbcust",TX("Customize:"),"space=5"); zdialog_add_widget(zd,"button","transprefs","hbcust",TX("transitions"),"space=5"); zdialog_add_widget(zd,"button","imageprefs","hbcust",TX("image files"),"space=5"); zdialog_add_widget(zd,"button","KBkeys","hbcust",TX("keyboard"),"space=5"); zdialog_add_ttip(zd,"texttime",TX("seconds to show with text")); zdialog_add_ttip(zd,"imagetime",TX("seconds to show without text")); zdialog_add_ttip(zd,"cliplim",TX("maximum clip allowed to fit window")); zdialog_add_ttip(zd,"replay",TX("start over at end of album")); zdialog_add_ttip(zd,"randomimage",TX("select images randomly")); zdialog_add_ttip(zd,"Start",TX("start from first image in album")); zdialog_add_ttip(zd,"Resume",TX("resume from current image")); zdialog_run(zd,ss_dialog_event,"save"); // run dialog zdialog_send_event(zd,"initz_album"); // initial album retry: zstat = zdialog_wait(zd); // wait for completion if (zstat != 1 && zstat != 2) { // cancel ss_saveprefs(); // 26.0 zdialog_free(zd); Fpanelshow = 1; Fblock(0); return; } zdialog_fetch(zd,"imagetime",ss_imagetime); // image show time seconds if (ss_Nused == 0) ss_imagetime = 9999; // if only arrow-keys used, huge interval zdialog_fetch(zd,"texttime",ss_texttime); // show text time zdialog_fetch(zd,"cliplim",ss_cliplimit); // image clipping limit zdialog_fetch(zd,"fullscreen",ss_fullscreen); // full screen option zdialog_fetch(zd,"replay",ss_replay); // replay (last image --> first) zdialog_fetch(zd,"randomimage",ss_randomimage); // use random image order if (! ss_Nfiles) { // no selection zmessageACK(Mwin,TX("invalid album")); zd->zstat = 0; goto retry; } zdialog_free(zd); // kill dialog ss_saveprefs(); // save preference changes ss_nextimage(-1); // initialization if (zstat == 1) ii = 0; // [start] selected, start from first file else if (zstat == 2) // [resume] selected { if (curr_file) { // start from curr. file for (ii = 0; ii < ss_Nfiles; ii++) // if member of file list if (strmatch(curr_file,ss_imagetab[ii].imagefile)) break; if (ii == ss_Nfiles) ii = 0; } else ii = 0; } ss_Fcurrent = ii; // starting file f_open(ss_imagetab[ii].imagefile); // first image Fpanelshow = 0; viewmode('F'); // file view without panel Fslideshow = 1; // slideshow active for KB events ss_isblank = 0; // not blank window ss_event = "first"; Fzoom = 0; // fit window ss_newfile = 0; // no new image ss_pxbnew = 0; ss_oldfile = 0; // no old (prior) image ss_pxbold = 0; ss_escape = 0; // kill switch off if (ss_fullscreen) win_fullscreen(1); // full screen, hide menu and panel zmainsleep(1); // necessary: compensate GDK bug ss_ww = gdk_window_get_width(Fgdkwin); // get window size ss_hh = gdk_window_get_height(Fgdkwin); // (height incorrect without above sleep) g_timeout_add(100,ss_timerfunc,0); // start timer for image changes // when done: unblock, restart slide show return; } // ------------------------------------------------------------------------------ // dialog event function - file chooser for images to show int ss_dialog_event(zdialog *zd, ch *event) { ch *file, *pp; ch countmess[50]; int err; ch *KBkeys_tip = TX("keyboard controls: \n" "Esc: exit running slide show \n" "arrow keys: prev/next image \n" "B: blank / unblank window \n" "N: transition to next image \n" "P: pause / resume \n" "X: magnify at mouse position"); if (zd->zstat == 1) { // [proceed] if (ss_Nfiles) return 1; zmessageACK(Mwin,TX("invalid album")); // diagnose and keep dialog open zd->zstat = 0; return 1; } if (zd->zstat) return 1; // cancel if (strmatch(event,"initz_album")) { if (! ss_albumfile && curr_album) ss_albumfile = zstrdup(curr_album,"ss"); if (! ss_albumfile) return 1; pp = strrchr(ss_albumfile,'/'); if (! pp) return 1; ss_albumname = pp + 1; if (strmatch(ss_albumname,"gallery")) { err = album_create_from_gallery(ss_albumfile); if (err) return 1; } goto initz_album; } if (strmatch(event,"selectalbum")) // select a slide show album { ss_Nfiles = 0; // reset album data ss_albumfile = ss_albumname = 0; zdialog_stuff(zd,"albumname",TX("no selection")); zdialog_stuff(zd,"nfiles",TX("no images")); file = zgetfile(TX("open album"),MWIN,"file",albums_folder); // user file selection if (! file) return 1; ss_albumfile = file; pp = strrchr(ss_albumfile,'/'); // get album name if (! pp) return 1; ss_albumname = pp + 1; goto initz_album; } if (! ss_Nfiles) return 1; if (strmatch(event,"transprefs")) { // edit transition preferences zdialog_show(zd,0); ss_transprefs_dialog(); zdialog_show(zd,1); } if (strmatch(event,"imageprefs")) { // edit image preferences zdialog_show(zd,0); ss_imageprefs_dialog(); zdialog_show(zd,1); } if (strmatch(event,"KBkeys")) zmessageACK(zd->dialog,KBkeys_tip); return 1; initz_album: pp = strrchr(ss_albumfile,'/'); if (! pp) return 1; ss_albumname = pp + 1; ss_loadprefs(); // get slide show prefs or defaults if (! ss_Nfiles) return 1; zdialog_stuff(zd,"albumname",ss_albumname); // update dialog album data snprintf(countmess,50,TX("%d images"),ss_Nfiles); zdialog_stuff(zd,"nfiles",countmess); zdialog_stuff(zd,"imagetime",ss_imagetime); zdialog_stuff(zd,"texttime",ss_texttime); zdialog_stuff(zd,"cliplim",ss_cliplimit); zdialog_stuff(zd,"fullscreen",ss_fullscreen); zdialog_stuff(zd,"replay",ss_replay); zdialog_stuff(zd,"randomimage",ss_randomimage); album_show(ss_albumfile); // open slide show album return 1; } // ************************************************************************************ // process keyboard input key - directed here from main() void ss_KBfunc(int kbkey) { if ((kbkey == GDK_KEY_Escape) || (kbkey == GDK_KEY_q) || (kbkey == GDK_KEY_F10) || (kbkey == GDK_KEY_F11)) { ss_escape = 1; ss_event = "escape"; return; } kbkey = toupper(kbkey); if (kbkey == ss_KBkeyB) ss_event = "blank"; // blank window if (kbkey == ss_KBkeyN) ss_event = "tran next"; // transition to next image if (kbkey == ss_KBkeyX) ss_event = "magnify"; // magnify image tool if (kbkey == GDK_KEY_Left) ss_event = "prior"; // prior image if (kbkey == GDK_KEY_Right) ss_event = "next"; // next image if (kbkey == ss_KBkeyP) { ss_paused = 1 - ss_paused; // toggle paused / running status if (! ss_paused) ss_event = "tran next"; } return; } /**************************************************************************************/ // Show next slide when time is up or user navigates with arrow keys. // Cycles every 0.1 seconds when slide show is active. int ss_timerfunc(void *) { int ss_timerfunc_sleep(int sleepsecs); int img, jj; int filesecs, titlesecs, descsecs, sleepsecs; ch *tagnames[2] = { meta_title_tag, meta_desc_tag }; ch *tagvals[2], *pp; if (zd_magnify) return 1; // exit magnify before event processing if (ss_ww != gdk_window_get_width(Fgdkwin)) goto escape; // window size changed if (ss_hh != gdk_window_get_height(Fgdkwin)) goto escape; if (ss_escape) ss_event = "escape"; // KB event from main() if (! Fslideshow) ss_event = "escape"; // from m_quit() if (FGM != 'F') ss_event = "escape"; // must be F-view mode if (strmatch(ss_event,"")) return 1; // no event, loop and wait if (strmatch(ss_event,"escape")) goto escape; if (strmatch(ss_event,"blank")) goto blank; if (strmatch(ss_event,"first")) goto first; if (strmatch(ss_event,"EOL")) goto EOL; if (strmatch(ss_event,"show")) goto show; if (strmatch(ss_event,"next")) goto next; if (strmatch(ss_event,"tran next")) goto tran_next; if (strmatch(ss_event,"magnify")) goto magnify; if (strmatch(ss_event,"prior")) goto prior; goto escape; // unknown event --> escape first: // start slide show ss_paused = 0; // at ss_Fcurrent image ss_event = "show"; return 1; EOL: // last image reached zmessage_post(Mwin,"parent",3,TX("SLIDESHOW END")); ss_timerfunc_sleep(3); img = ss_Fcurrent = ss_Nfiles - 1; // set last image escape: // terminate slide show ss_escape = 0; if (ss_pxbold) PXB_free(ss_pxbold); // free memory if (ss_pxbnew) PXB_free(ss_pxbnew); ss_pxbold = ss_pxbnew = 0; if (ss_fullscreen) win_unfullscreen(); // restore old window size, menu etc. ss_fullscreen = 0; viewmode('G'); img = ss_Fcurrent; f_open(ss_imagetab[img].imagefile); Fblock(0); if (Fslideshow) { // not killed Fslideshow = 0; m_slideshow(0,0); // restart slide show } return 0; blank: // blank window and wait ss_isblank = 1 - ss_isblank; if (ss_isblank) { ss_event = ""; ss_blankwindow(); } else ss_event = "show"; return 1; magnify: // magnify image ss_event = ""; img = ss_Fcurrent; f_open(ss_imagetab[img].imagefile); m_magnify(0,0); ss_event = "show"; return 1; prior: // back to prior image ss_Fcurrent--; if (ss_Fcurrent < 0) { if (ss_replay) ss_Fcurrent = ss_Nfiles-1; // wrap to last image else ss_Fcurrent = 0; } ss_event = "show"; return 1; show: // current image instantly next: // next image instantly tran_next: // transition to next image if (zstrstr(ss_event,"next")) // next or tran next { ss_Fcurrent = ss_nextimage(ss_Fcurrent); if (ss_Fcurrent < 0) { ss_event = "EOL"; // last image file was shown return 1; } } img = ss_Fcurrent; // new current image ss_oldfile = ss_newfile; // old file = new if (ss_pxbold) PXB_free(ss_pxbold); ss_pxbold = ss_pxbnew; // new pixbuf --> old ss_newfile = ss_imagetab[img].imagefile; // new current file ss_pxbnew = ss_loadpxb(ss_newfile); // new pixbuf if (! ss_pxbnew) { ss_event = "escape"; // failure, quit slide show return 1; } ss_zoomsize = ss_imagetab[img].zoomsize; // zoom size ss_zoomtype = ss_imagetab[img].zoomtype; // 0/1/2 = none/zoomin/zoomout ss_zoomlocx = ss_imagetab[img].zoomlocx; // target location for final center ss_zoomlocy = ss_imagetab[img].zoomlocy; if (ss_zoomsize > 1 && ss_zoomtype == 2) { // next image will be zoomed out PXB_free(ss_pxbnew); ss_zoom_setup(ss_newfile); // initial image is zoomed image ss_zoom_start(ss_zoomsize); ss_pxbnew = ss_zoom_wait(); } if (strmatch(ss_event,"tran next")) { // do transition to new image ss_event = ""; // erase event jj = ss_nextrans(); // select next transition type ss_trantime = ss_trantab[jj].trantime; // set transition duration ss_trantab[jj].func(); // call transition function if (*ss_event) return 1; // new event during transition } else ss_instant(); // show new image immediately if (! ss_fullscreen) // if not full screen mode, gtk_window_set_title(MWIN,ss_newfile); // put filename in title bar // process image events: // wait before text, show text, wait before zoom, zoom, wait after zoom sleepsecs = ss_imagetab[img].wait0; // show image specified time jj = ss_timerfunc_sleep(sleepsecs); // before filename/titles/description if (jj) return 1; filesecs = ss_imagetab[img].filesecs; // time to show file name titlesecs = ss_imagetab[img].titlesecs; // time to show title descsecs = ss_imagetab[img].descsecs; // time to show description if (filesecs + titlesecs + descsecs == 0) // if not specified, use default filesecs = titlesecs = descsecs = ss_texttime; meta_get(ss_newfile,tagnames,tagvals,2); // get image titles and description if (! tagvals[0]) titlesecs = 0; // zero time if no title else zfree(tagvals[0]); if (! tagvals[1]) descsecs = 0; // zero time if no description else zfree(tagvals[1]); while (filesecs + titlesecs + descsecs) { ss_showtext(filesecs,titlesecs,descsecs); // show items with remaining time jj = ss_timerfunc_sleep(1.0); // wait 1 second if (jj) return 1; // new event filesecs -= 1; if (filesecs < 0) filesecs = 0; // decrement show times titlesecs -= 1; if (titlesecs < 0) titlesecs = 0; descsecs -= 1; if (descsecs < 0) descsecs = 0; } ss_showtext(0,0,0); // remove all if (image_file_type(ss_newfile) == VIDEO) { // if VIDEO file, play now jj = ss_timerfunc_sleep(1.0); // show image one second if (jj) return 1; // new event f_open(ss_newfile); // reset current image pp = zescape_quotes(ss_newfile); zshell("ack","ffplay -loglevel -8 -autoexit \"%s\" ",pp); // play video zfree(pp); jj = ss_timerfunc_sleep(1.0); // wait one second after play if (jj) return 1; // new event if (ss_paused) ss_event = ""; else ss_event = "tran next"; return 1; } sleepsecs = ss_imagetab[img].wait1; // show image specified time jj = ss_timerfunc_sleep(sleepsecs); // before zoom if (jj) return 1; ss_zoomsize = ss_imagetab[img].zoomsize; // 1-3x = no zoom to 3x zoom ss_zoomtype = ss_imagetab[img].zoomtype; // 0/1/2 = none/zoomin/zoomout ss_zoomtime = ss_imagetab[img].zoomtime; // zoom time ss_zoomlocx = ss_imagetab[img].zoomlocx; // target location for final center ss_zoomlocy = ss_imagetab[img].zoomlocy; // (0-100% of image, 50/50 = middle) if (ss_zoomsize > 1.0) { ss_event = ""; // erase event if (ss_zoomtype == 1) ss_zoomin(); // zoom in or zoom out if (ss_zoomtype == 2) ss_zoomout(); if (*ss_event) return 1; // new event during zoom } sleepsecs = ss_imagetab[img].wait2; // show zoomed image specified time if (sleepsecs == 0) sleepsecs = ss_imagetime; // not set, use overall default jj = ss_timerfunc_sleep(sleepsecs); if (jj) return 1; // new event if (ss_paused) ss_event = ""; else ss_event = "tran next"; // do next image return 1; } // ------------------------------------------------------------------------------ // sleep designated seconds and return 0 if no ss_event happens // if ss_event happens during sleep, immediately return 1 int ss_timerfunc_sleep(int sleepsecs) { float Fsecs = sleepsecs; ss_event = ""; while (Fsecs > 0) { zmainsleep(0.1); Fsecs -= 0.1; if (*ss_event) return 1; if (ss_escape) return 1; // from main() } return 0; } // ------------------------------------------------------------------------------ // get next image to display // if mode = sequential, get next image // if mode = random, get random image // avoid re-use of most recently used images int ss_nextimage(int currimage) { int ii, next; static float sumprefs; float frand, rank; int limit; static int lastimage[10]; if (currimage < 0) // initialization call { for (ii = 0; ii < 10; ii++) // clear memory of most recent files lastimage[ii] = -1; sumprefs = 0; for (ii = 0; ii < ss_Nfiles; ii++) // compute sum of all image preferences sumprefs += ss_imagetab[ii].preference; return -1; } if (! ss_randomimage) // sequential image sequence { if (currimage < ss_Nfiles-1) return currimage + 1; // return next image file if (ss_replay) return 0; // if EOL and replay wanted, return 1st file return -1; // The End } get_random: // random image sequence frand = drandz(); // random number 0 - 0.999999 rank = 0; for (ii = 0; ii < ss_Nfiles; ii++) // choose a random image { // weighted by image preference rank += ss_imagetab[ii].preference / sumprefs; if (rank >= frand) break; } next = ii; // selected image limit = 10; // search depth = 10 if (ss_Nfiles/3 < 10) limit = ss_Nfiles/3; // or 1/3 of files in slide show for (ii = 0; ii < limit; ii++) // search most recent image files if (next == lastimage[ii]) break; if (ii < limit) goto get_random; // image in recent list, get another for (ii = limit-1; ii > 0; ii--) // add image to recent list lastimage[ii] = lastimage[ii-1]; lastimage[0] = next; return next; // next image to display } // ------------------------------------------------------------------------------ // select next transition type to use // mode = sequential: use enabled transition type in sequence // mode = random: choose random from enabled transition type // avoid re-use of most recent transition types int ss_nextrans() { int ii, jj, maxjj, next; float frand, sumprefs, tranrank; ii = ss_Fcurrent - 1; // transition type from prior image if (ii < 0) ii = ss_Nfiles - 1; if (! strmatch(ss_imagetab[ii].tranname,"next")) { // image transition not "next" for (jj = 0; jj < SSNT; jj++) if (strmatch(ss_trantab[jj].tranname,ss_imagetab[ii].tranname)) break; if (jj < SSNT) { next = jj; // assigned transition type for (ii = ss_Nused - 1; ii > 0; ii--) // --> most recently used ss_Tlast[ii] = ss_Tlast[ii-1]; ss_Tlast[0] = next; return next; } } if (ss_Nused < 2 || ss_randomtrans == 0) // few enabled transition types { // or sequential mode ss_Tnext++; if (ss_Tnext == ss_Nused) ss_Tnext = 0; // select transition types sequentially next = ss_Tused[ss_Tnext]; } else // select transition types randomly { maxjj = ss_Nused / 2; // most recently used to exclude if (maxjj > 4) maxjj = 4; // max. 4 sumprefs = 0; for (ii = 0; ii < ss_Nused; ii++) // search enabled transitions { for (jj = 0; jj < maxjj; jj++) // exclude most recently used 50% if (ss_Tused[ii] == ss_Tlast[jj]) break; if (jj < maxjj) continue; jj = ss_Tused[ii]; // transition to count sumprefs += ss_trantab[jj].preference; // sum transition preferences } frand = drandz(); // random 0.0 - 0.99999 tranrank = 0; for (ii = 0; ii < ss_Nused; ii++) // search enabled transitions { for (jj = 0; jj < maxjj; jj++) // exclude most recently used 50% if (ss_Tused[ii] == ss_Tlast[jj]) break; if (jj < maxjj) continue; jj = ss_Tused[ii]; // transition to rank tranrank += ss_trantab[jj].preference / sumprefs; // 0 ... 1.0 if (tranrank >= frand) break; } next = jj; // transition to use for (ii = ss_Nused - 1; ii > 0; ii--) // make it most recent ss_Tlast[ii] = ss_Tlast[ii-1]; ss_Tlast[0] = next; } return next; } // ----------------------------------------------------------------------------- // write file name, title and description at the top of the image // show only those items with time > 0 int ss_showtext(int filesecs, int titlesecs, int descsecs) { ch *tagnames[2] = { meta_title_tag, meta_desc_tag }; ch *tagvals[2], *pp; ch filename[200], title[1000], description[1000]; static ch text1[1000]; ch **text2 = 0; int ii, nn; PIXBUF *pixbuf; static PangoFontDescription *pangofont = null; static PangoLayout *pangolayout = null; static int plww, plhh, pline; if (plww) { // clear previous text pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbnew->pixbuf,0,0,plww+10,plhh+10); cairo_t *cr = draw_context_create(Fgdkwin,draw_context); gdk_cairo_set_source_pixbuf(cr,pixbuf,0,0); cairo_paint(cr); draw_context_destroy(draw_context); g_object_unref(pixbuf); plww = 0; } if (filesecs + titlesecs + descsecs == 0) return 0; pp = strrchr(ss_newfile,'/'); // get base file name if (pp) pp++; else pp = ss_newfile; strncpy0(filename,pp,200); *title = *description = 0; meta_get(ss_newfile,(ch **) tagnames,tagvals,2); // get title and description metadata if (tagvals[0]) { strncpy0(title,tagvals[0],1000); zfree(tagvals[0]); } if (tagvals[1]) { strncpy0(description,tagvals[1],1000); zfree(tagvals[1]); } *text1 = 0; pline = 0; if (filesecs) { strncpy0(text1,filename,200); // get items with time remaining pline = 1; } if (titlesecs && *title) { if (pline) strncatv(text1,1000,"\n",null); strncatv(text1,1000,title,null); pline = 1; } if (descsecs && *description) { if (pline) strncatv(text1,1000,"\n",null); strncatv(text1,1000,description,null); } nn = breakup_text(text1,text2,0,100); // break into lines within user limits *text1 = 0; for (ii = 0; ii < nn; ii++) { // combine lines with \n separators if (ii == 0) strncpy0(text1,text2[0],1000); else strncatv(text1,1000,"\n",text2[ii],null); zfree(text2[ii]); } pangofont = pango_font_description_from_string(zfuncs::appfont); // make pango layout for font pangolayout = gtk_widget_create_pango_layout(Fdrawin,0); pango_layout_set_font_description(pangolayout,pangofont); pango_layout_set_text(pangolayout,text1,-1); // add text to layout pango_layout_get_pixel_size(pangolayout,&plww,&plhh); cairo_t *cr = draw_context_create(Fgdkwin,draw_context); cairo_set_source_rgb(cr,1,1,1); // draw white background cairo_rectangle(cr,0,0,plww+10,plhh+10); cairo_fill(cr); cairo_move_to(cr,5,5); // draw layout with text cairo_set_source_rgb(cr,0,0,0); pango_cairo_show_layout(cr,pangolayout); draw_context_destroy(draw_context); return 1; } // ------------------------------------------------------------------------------ // Load image and rescale to fit in window size. // If image aspect ratio is close enough to window ratio, // truncate to avoid having margins around around the image. PXB * ss_loadpxb(ch *file) { PXB *pxbin, *pxbtemp, *pxbout; int ww1, hh1, ww2, hh2; int Iorgx, Iorgy, Worgx, Worgy; float Rm, Rw, dR; Dww = gdk_window_get_width(Fgdkwin); // refresh drawing window size Dhh = gdk_window_get_height(Fgdkwin); pxbin = PXB_load(file,1); // load image if (! pxbin) return 0; PXB_subalpha(pxbin); // remove alpha channel if any ww1 = pxbin->ww; // image dimensions hh1 = pxbin->hh; ww2 = ss_ww; // window dimensions hh2 = ss_hh; Rm = 1.0 * ww1 / hh1; // image width/height ratio Rw = 1.0 * ww2 / hh2; // window width/height ratio dR = fabsf(Rm - Rw) / Rw; // discrepancy ratio if (dR <= 0.01 * ss_cliplimit) { // discrepancy within user limit if (Rw >= Rm) { ww1 = ww2; // height will be clipped hh1 = ww1 / Rm; } else { hh1 = hh2; // width will be clipped ww1 = hh1 * Rm; } } else { // discrepancy too great if (Rw >= Rm) { hh1 = hh2; // ratio image to fit in window ww1 = hh1 * Rm; } else { ww1 = ww2; hh1 = ww1 / Rm; } } pxbtemp = PXB_rescale_fast(pxbin,ww1,hh1); PXB_free(pxbin); Iorgx = (ww1 - ww2) / 2.0; // top left corner of image to copy from if (Iorgx < 0) Iorgx = 0; Iorgy = (hh1 - hh2) / 2.0; if (Iorgy < 0) Iorgy = 0; Worgx = (ww2 - ww1) / 2.0; // top left corner of window to copy to if (Worgx < 0) Worgx = 0; Worgy = (hh2 - hh1) / 2.0; if (Worgy < 0) Worgy = 0; if (ww2 < ww1) ww1 = ww2; // copy width if (hh2 < hh1) hh1 = hh2; // copy height pxbout = PXB_make(ww2,hh2,3); // output PXB if (! pxbout) return 0; // 26.3 PXB_clear(pxbout); PXB_copy_area(pxbtemp,Iorgx,Iorgy,ww1,hh1,pxbout,Worgx,Worgy); PXB_free(pxbtemp); ss_rs = pxbout->rs; // set image row stride return pxbout; } // *********************************************************************************** // set transitions preferences for specific slide show void ss_transprefs_dialog() { int transprefs_dialog_event(zdialog *zd, ch *event); zdialog *zd; int ii, jj, zstat; ch nameii[32], enabii[8], timeii[8], prefii[8]; /*** __________________________________________________________________________ | | | Transitions File [load] [save] transition filename | | | | Select [all] [none] [x] random time [___] [set all] | | | | transition use time pref | transition use time pref | | instant [ ] [ 1.0 ] [ 10 ] | raindrops [x] [ 1.3 ] [ 10 ] | | fade-in [x] [ 1.5 ] [ 20 ] | doubledoor [x] [ 0.8 ] [ 20 ] | | roll-right [x] [ 2.0 ] [ 0 ] | rotate [ ] [ 1.4 ] [ 50 ] | | .... ... ..... .... | .... ... ..... .... | | | | [OK] [X] | |__________________________________________________________________________| ***/ if (! ss_Nfiles) { zmessageACK(Mwin,TX("invalid album")); return; } zd = zdialog_new(TX("Transition Preferences"),Mwin,"OK","X",null); zdialog_add_widget(zd,"hbox","hbfile","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labfile","hbfile",TX("Transitions File"),"space=3"); zdialog_add_widget(zd,"button","load","hbfile","Load","space=3"); zdialog_add_widget(zd,"button","save","hbfile","Save","space=3"); zdialog_add_widget(zd,"label","tranfile","hbfile",0,"space=5"); zdialog_add_widget(zd,"hbox","hbopts","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labtran","hbopts",TX("Select"),"space=3"); zdialog_add_widget(zd,"button","all","hbopts",TX("All"),"space=3"); zdialog_add_widget(zd,"button","none","hbopts",TX("None"),"space=3"); zdialog_add_widget(zd,"check","randomtrans","hbopts",TX("random"),"space=3"); zdialog_add_widget(zd,"label","space","hbopts","","space=10"); zdialog_add_widget(zd,"label","labtime","hbopts",TX("time"),"space=3"); zdialog_add_widget(zd,"zspin","alltime","hbopts","1|99|1|3","size=4"); zdialog_add_widget(zd,"button","setalltime","hbopts",TX("set all")); zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"space=5|homog"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"space=5|homog"); zdialog_add_widget(zd,"vbox","vb3","hb1",0,"space=5|homog"); zdialog_add_widget(zd,"vbox","vb4","hb1",0,"space=5|homog"); zdialog_add_widget(zd,"vsep","vs1","hb1",0,"space=5"); // two columns of transition poop zdialog_add_widget(zd,"vbox","vb5","hb1",0,"space=5|homog"); zdialog_add_widget(zd,"vbox","vb6","hb1",0,"space=5|homog"); zdialog_add_widget(zd,"vbox","vb7","hb1",0,"space=5|homog"); zdialog_add_widget(zd,"vbox","vb8","hb1",0,"space=5|homog"); zdialog_add_widget(zd,"label","labname","vb1",TX("transition")); zdialog_add_widget(zd,"label","labenab","vb2",TX("use")); zdialog_add_widget(zd,"label","labtime","vb3",TX("time")); zdialog_add_widget(zd,"label","labpref","vb4",TX("pref")); zdialog_add_widget(zd,"label","labname","vb5",TX("transition")); zdialog_add_widget(zd,"label","labenab","vb6",TX("use")); zdialog_add_widget(zd,"label","labtime","vb7",TX("time")); zdialog_add_widget(zd,"label","labpref","vb8",TX("pref")); zdialog_stuff(zd,"randomtrans",ss_randomtrans); // stuff random checkbox for (ii = 0; ii < SSNT; ii++) { // build input dialog for transition prefs snprintf(nameii,32,"name_%d",ii); snprintf(enabii,8,"enab_%d",ii); snprintf(timeii,8,"time_%d",ii); snprintf(prefii,8,"pref_%d",ii); if (ii < SSNT / 2) { zdialog_add_widget(zd,"label",nameii,"vb1",TX("transition")); zdialog_add_widget(zd,"check",enabii,"vb2"); zdialog_add_widget(zd,"zspin",timeii,"vb3","1|99|1|2","size=4"); zdialog_add_widget(zd,"zspin",prefii,"vb4","0|99|1|10","size=3"); } else { zdialog_add_widget(zd,"label",nameii,"vb5",TX("transition")); zdialog_add_widget(zd,"check",enabii,"vb6"); zdialog_add_widget(zd,"zspin",timeii,"vb7","1|99|1|2","size=4"); zdialog_add_widget(zd,"zspin",prefii,"vb8","0|99|1|10","size=3"); } zdialog_stuff(zd,nameii,ss_trantab[ii].tranname); // stuff current transition prefs zdialog_stuff(zd,enabii,ss_trantab[ii].enabled); zdialog_stuff(zd,timeii,ss_trantab[ii].trantime); zdialog_stuff(zd,prefii,ss_trantab[ii].preference); } zdialog_run(zd,transprefs_dialog_event,"parent"); // run dialog, wait for completion zstat = zdialog_wait(zd); if (zstat != 1) { zdialog_free(zd); return; } zdialog_fetch(zd,"randomtrans",ss_randomtrans); // get mode, 0/1 = sequential/random for (ii = 0; ii < SSNT; ii++) { // get all preferences snprintf(enabii,8,"enab_%d",ii); snprintf(timeii,8,"time_%d",ii); snprintf(prefii,8,"pref_%d",ii); zdialog_fetch(zd,enabii,ss_trantab[ii].enabled); zdialog_fetch(zd,timeii,ss_trantab[ii].trantime); zdialog_fetch(zd,prefii,ss_trantab[ii].preference); } zdialog_free(zd); ss_saveprefs(); // update preferences file for (ii = jj = 0; ii < SSNT; ii++) { // initialize list of enabled if (ss_trantab[ii].enabled) { // and last used transition types ss_Tused[jj] = ii; jj++; } ss_Tlast[ii] = 0; } ss_Nused = jj; // no. enabled transition types ss_Tnext = 0; // next one to use (first) return; } // transition prefs dialog event and completion function int transprefs_dialog_event(zdialog *zd, ch *event) { int transprefs_load(ch *file); int transprefs_save(ch *file); int err, ii; float time; ch *file, *pp; ch nameii[32], enabii[8], timeii[8], prefii[8]; if (strmatch(event,"all")) // enable all transitions { for (ii = 0; ii < SSNT; ii++) { snprintf(enabii,8,"enab_%d",ii); zdialog_stuff(zd,enabii,1); } } if (strmatch(event,"none")) // disable all transitions { for (ii = 0; ii < SSNT; ii++) { snprintf(enabii,8,"enab_%d",ii); zdialog_stuff(zd,enabii,0); } } if (strmatch(event,"load")) // load trans prefs from a file { file = zgetfile(TX("load"),MWIN,"file",slideshow_trans_folder,0); if (! file) return 1; err = transprefs_load(file); if (err) return 1; pp = strrchr(file,'/'); // show file name in dialog zdialog_stuff(zd,"tranfile",pp+1); zdialog_stuff(zd,"randomtrans",ss_randomtrans); // stuff random/sequential mode for (ii = 0; ii < SSNT; ii++) { // build input dialog for transition prefs snprintf(nameii,32,"name_%d",ii); snprintf(enabii,8,"enab_%d",ii); snprintf(timeii,8,"time_%d",ii); snprintf(prefii,8,"pref_%d",ii); zdialog_stuff(zd,nameii,ss_trantab[ii].tranname); // stuff current transition prefs zdialog_stuff(zd,enabii,ss_trantab[ii].enabled); zdialog_stuff(zd,timeii,ss_trantab[ii].trantime); zdialog_stuff(zd,prefii,ss_trantab[ii].preference); } } if (strmatch(event,"save")) // save trans prefs to a file { zdialog_fetch(zd,"randomtrans",ss_randomtrans); // get random/sequential mode for (ii = 0; ii < SSNT; ii++) { // get all preferences snprintf(enabii,8,"enab_%d",ii); snprintf(timeii,8,"time_%d",ii); snprintf(prefii,8,"pref_%d",ii); zdialog_fetch(zd,enabii,ss_trantab[ii].enabled); zdialog_fetch(zd,timeii,ss_trantab[ii].trantime); zdialog_fetch(zd,prefii,ss_trantab[ii].preference); } file = zgetfile(TX("save"),MWIN,"save",slideshow_trans_folder,0); // save trans prefs file if (! file) return 1; transprefs_save(file); // save dialog to file pp = strrchr(file,'/'); // show file name in dialog zdialog_stuff(zd,"tranfile",pp+1); } if (strmatch(event,"setalltime")) // set all transition times { zdialog_fetch(zd,"alltime",time); for (ii = 0; ii < SSNT; ii++) { snprintf(timeii,8,"time_%d",ii); zdialog_stuff(zd,timeii,time); } } return 1; } // ----------------------------------------------------------------------------- // load transition prefs from a file // returns 0 = OK, +N = error int transprefs_load(ch *file) { FILE *fid; ch *pp, buff[XFCC]; int ii, jj, nn; ch tranname[32]; int n1, n2; float ff; fid = fopen(file,"r"); if (! fid) { zmessageACK(Mwin,TX("invalid file")); return 1; } pp = fgets_trim(buff,XFCC,fid,1); if (! pp) goto format_error; nn = sscanf(buff,"randomtrans %d ",&ss_randomtrans); if (nn != 1) goto format_error; while (true) { pp = fgets_trim(buff,XFCC,fid,1); if (! pp) break; nn = sscanf(buff,"%s %d %f %d ",tranname,&n1,&ff,&n2); // tranname N N.N NN if (nn != 4) { // (enabled 0-1 duration N.N pref. 0-99) printf("*** bad record: %s \n",buff); continue; } for (ii = 0; ii < SSNT; ii++) if (strmatch(tranname,ss_trantab[ii].tranname)) break; if (ii == SSNT) { printf("*** bad record: %s \n",buff); continue; } ss_trantab[ii].enabled = n1; ss_trantab[ii].trantime = ff; ss_trantab[ii].preference = n2; } for (ii = jj = 0; ii < SSNT; ii++) { // initialize list of enabled if (ss_trantab[ii].enabled) { // transition types ss_Tused[jj] = ii; jj++; } } ss_Nused = jj; // no. enabled transition types fclose(fid); return 0; format_error: zmessageACK(Mwin,TX("file format error: %s"),buff); fclose(fid); return 1; } // ----------------------------------------------------------------------------- // save transition prefs to a file int transprefs_save(ch *file) { FILE *fid; fid = fopen(file,"w"); if (! fid) { zmessageACK(Mwin,TX("invalid file")); return 1; } fprintf(fid,"randomtrans %d \n",ss_randomtrans); for (int ii = 0; ii < SSNT; ii++) fprintf(fid,"%s %d %.1f %d \n", ss_trantab[ii].tranname, ss_trantab[ii].enabled, ss_trantab[ii].trantime, ss_trantab[ii].preference); fclose(fid); return 0; } // *********************************************************************************** // set image preferences for specific slide show void ss_imageprefs_dialog() { int ss_imageprefs_dialog_event(zdialog *zd, ch *event); zdialog *zd; int ii, kk; ch *pp, zoomloc[40]; ch *pref_ttip = TX("For random image sequence, this value is \n" "the relative frequency to show the image. \n" "Base value is 10. 20 --> show 2x as often."); /*** __________________________________________________ | Image Preferences | | | | Image File: [________________________________] | | Preference: [___] | | | | Action seconds | | ---------------------------------------------- | | Wait before filename/title/description [1.5] | | Show filename (overlap) [2.0] | | Show title (overlap) [2.0] | | Show description (overlap) [3.0] | | Wait before zoom [1.0] | | Zoom [2.5] X [_] in [x] out [2.0] | | [Zoom Center] position: x=40 y=50 | | Wait after zoom [1.5] | | Transition to next image [_________|v] | | | | [OK] | |__________________________________________________| ***/ if (! ss_Nfiles) { zmessageACK(Mwin,TX("invalid album")); return; } viewmode('G'); // gallery view zd = zdialog_new(TX("Image Preferences"),Mwin,"OK",null); zd_ss_imageprefs = zd; zdialog_add_widget(zd,"hbox","hbimf","dialog",0,"space=3"); zdialog_add_widget(zd,"label","labimf","hbimf",TX("Image File:"),"space=3"); zdialog_add_widget(zd,"label","imagefile","hbimf",0,"space=3"); zdialog_add_widget(zd,"hbox","hbpref","dialog",0); zdialog_add_widget(zd,"label","labpref","hbpref",TX("Preference:"),"space=3"); zdialog_add_widget(zd,"zspin","preference","hbpref","0|99|1|10","space=3"); zdialog_add_ttip(zd,"preference",pref_ttip); zdialog_add_widget(zd,"hbox","space","dialog",0,"space=8"); zdialog_add_widget(zd,"hbox","hbact","dialog"); zdialog_add_widget(zd,"label","labact","hbact",TX("Action"),"space=3"); zdialog_add_widget(zd,"label","space","hbact",0,"expand"); zdialog_add_widget(zd,"label","labsecs","hbact",TX("Seconds"),"space=3"); zdialog_add_widget(zd,"hsep","sepact","dialog",0,"space=3"); zdialog_add_widget(zd,"hbox","hb1","dialog"); zdialog_add_widget(zd,"vbox","vb1","hb1",0,"homog|space=1"); zdialog_add_widget(zd,"label","space","hb1",0,"space=5"); zdialog_add_widget(zd,"vbox","vb2","hb1",0,"homog|space=1"); zdialog_add_widget(zd,"hbox","hbw0","vb1"); zdialog_add_widget(zd,"label","labwait","hbw0",TX("Wait before filename/title/description")); zdialog_add_widget(zd,"zspin","wait0","vb2","0|99|1|0","size=3"); zdialog_add_widget(zd,"hbox","hbfile","vb1"); zdialog_add_widget(zd,"label","labfile","hbfile",TX("Show image file name (overlap)")); zdialog_add_widget(zd,"zspin","filesecs","vb2","0|99|1|0","size=3"); zdialog_add_widget(zd,"hbox","hbtitle","vb1"); zdialog_add_widget(zd,"label","labtitle","hbtitle",TX("Show image title (overlap)")); zdialog_add_widget(zd,"zspin","titlesecs","vb2","0|99|1|0","size=3"); zdialog_add_widget(zd,"hbox","hbdesc","vb1"); zdialog_add_widget(zd,"label","labdesc","hbdesc",TX("Show image description (overlap)")); zdialog_add_widget(zd,"zspin","descsecs","vb2","0|99|1|0","size=3"); zdialog_add_widget(zd,"hbox","hbw1","vb1"); zdialog_add_widget(zd,"label","labwait","hbw1",TX("Wait before zoom")); zdialog_add_widget(zd,"zspin","wait1","vb2","0|99|1|0","size=3"); zdialog_add_widget(zd,"hbox","hbzoom","vb1"); zdialog_add_widget(zd,"label","labzoom","hbzoom","Zoom"); zdialog_add_widget(zd,"zspin","zoomsize","hbzoom","1.0|3.0|0.1|1.0","space=3|size=3"); zdialog_add_widget(zd,"label","labX","hbzoom","X","space=3"); zdialog_add_widget(zd,"label","space","hbzoom",0,"space=3"); zdialog_add_widget(zd,"check","zoomin","hbzoom",TX("zoom-in"),"space=3"); zdialog_add_widget(zd,"check","zoomout","hbzoom",TX("zoom-out"),"space=3"); zdialog_add_widget(zd,"zspin","zoomtime","vb2","1|99|1|2","size=3"); zdialog_add_widget(zd,"hbox","hbzloc","vb1"); zdialog_add_widget(zd,"button","zloc","hbzloc",TX("Zoom Center")); zdialog_add_widget(zd,"label","labzloc","hbzloc",TX("position: 50 50"),"space=5"); zdialog_add_widget(zd,"label","space","vb2",0); zdialog_add_widget(zd,"hbox","hbw2","vb1"); zdialog_add_widget(zd,"label","labwait","hbw2",TX("Wait after zoom")); zdialog_add_widget(zd,"zspin","wait2","vb2","0|99|1|0","size=3"); zdialog_add_widget(zd,"hsep","septrn","dialog",0,"space=4"); zdialog_add_widget(zd,"hbox","hbtrn","dialog"); zdialog_add_widget(zd,"label","labtr","hbtrn",TX("Transition to next image"),"space=3"); zdialog_add_widget(zd,"combo","tranname","hbtrn"); zdialog_stuff(zd,"tranname","next"); // default transition for (ii = 0; ii < SSNT; ii++) // add all transitions to dropdown list zdialog_stuff(zd,"tranname",ss_trantab[ii].tranname); if (curr_file) { // set to curr. file for (ii = 0; ii < ss_Nfiles; ii++) // if member of album if (strmatch(curr_file,ss_imagetab[ii].imagefile)) break; if (ii == ss_Nfiles) ii = 0; } else ii = 0; // else first file in album ss_Fcurrent = ii; ss_setzloc = 0; // 1-shot flag is off pp = strrchr(ss_imagetab[ii].imagefile,'/'); // stuff curr. file data into dialog if (pp) zdialog_stuff(zd,"imagefile",pp+1); zdialog_stuff(zd,"preference",ss_imagetab[ii].preference); zdialog_stuff(zd,"wait0",ss_imagetab[ii].wait0); zdialog_stuff(zd,"filesecs",ss_imagetab[ii].filesecs); zdialog_stuff(zd,"titlesecs",ss_imagetab[ii].titlesecs); zdialog_stuff(zd,"descsecs",ss_imagetab[ii].descsecs); zdialog_stuff(zd,"wait1",ss_imagetab[ii].wait1); zdialog_stuff(zd,"zoomin",0); // both zoom checks off zdialog_stuff(zd,"zoomout",0); kk = ss_imagetab[ii].zoomtype; // zoom type 0/1/2 if (kk == 1) zdialog_stuff(zd,"zoomin",1); // set corresp. check on if (kk == 2) zdialog_stuff(zd,"zoomout",1); zdialog_stuff(zd,"zoomsize",ss_imagetab[ii].zoomsize); zdialog_stuff(zd,"zoomtime",ss_imagetab[ii].zoomtime); snprintf(zoomloc,40,TX("position: x=%02d y=%02d"), // stuff zoom location if defined ss_imagetab[ii].zoomlocx,ss_imagetab[ii].zoomlocy); // (else x=00 y=00) zdialog_stuff(zd,"labzloc",zoomloc); zdialog_stuff(zd,"wait2",ss_imagetab[ii].wait2); zdialog_stuff(zd,"tranname",ss_imagetab[ii].tranname); zdialog_run(zd,ss_imageprefs_dialog_event,"parent"); // run dialog zdialog_wait(zd); // wait for completion zdialog_free(zd); zd_ss_imageprefs = 0; ss_saveprefs(); // save updated preferences file return; } // ----------------------------------------------------------------------------- // image prefs dialog event and completion function int ss_imageprefs_dialog_event(zdialog *zd, ch *event) { int ii, jj; float ff; ch tranname[32]; GdkWindow *Ggdkwin; if (zd->zstat) { // OK or cancel zd_ss_imageprefs = 0; return 1; } ii = ss_Fcurrent; // from mouse click on thumbnail if (ii >= ss_Nfiles) return 1; if (strmatch(event,"preference")) { zdialog_fetch(zd,"preference",jj); ss_imagetab[ii].preference = jj; } if (strmatch(event,"wait0")) { zdialog_fetch(zd,"wait0",jj); ss_imagetab[ii].wait0 = jj; } if (strmatch(event,"filesecs")) { zdialog_fetch(zd,"filesecs",jj); ss_imagetab[ii].filesecs = jj; } if (strmatch(event,"titlesecs")) { zdialog_fetch(zd,"titlesecs",jj); ss_imagetab[ii].titlesecs = jj; } if (strmatch(event,"descsecs")) { zdialog_fetch(zd,"descsecs",jj); ss_imagetab[ii].descsecs = jj; } if (strmatch(event,"wait1")) { zdialog_fetch(zd,"wait1",jj); ss_imagetab[ii].wait1 = jj; } if (strmatch(event,"zoomin")) { // zoom-in checkbox zdialog_fetch(zd,"zoomin",jj); if (jj) { zdialog_stuff(zd,"zoomout",0); ss_imagetab[ii].zoomtype = 1; } else ss_imagetab[ii].zoomtype = 0; } if (strmatch(event,"zoomout")) { // zoom-out checkbox zdialog_fetch(zd,"zoomout",jj); if (jj) { zdialog_stuff(zd,"zoomin",0); ss_imagetab[ii].zoomtype = 2; } else ss_imagetab[ii].zoomtype = 0; } if (strmatch(event,"zoomsize")) { zdialog_fetch(zd,"zoomsize",ff); ss_imagetab[ii].zoomsize = ff; } if (strmatch(event,"zoomtime")) { zdialog_fetch(zd,"zoomtime",jj); ss_imagetab[ii].zoomtime = jj; } if (strmatch(event,"zloc")) { ss_setzloc = 1; // set 1-shot flag Ggdkwin = gtk_widget_get_window(Gdrawin); gdk_window_set_cursor(Ggdkwin,dragcursor); poptext_mouse(TX("click on thumbnail to set zoom center"),20,20,0,2); } if (strmatch(event,"wait2")) { zdialog_fetch(zd,"wait2",jj); ss_imagetab[ii].wait2 = jj; } if (strmatch(event,"tranname")) { zdialog_fetch(zd,"tranname",tranname,32); if (! strmatch(tranname,"next")) { for (jj = 0; jj < SSNT; jj++) if (strmatch(tranname,ss_trantab[jj].tranname)) break; if (jj == SSNT) return 1; strncpy0(ss_imagetab[ii].tranname,ss_trantab[jj].tranname,32); } else strncpy0(ss_imagetab[ii].tranname,"next",32); } return 1; } // ----------------------------------------------------------------------------- // response function for gallery thumbnail left-click // stuff image prefs dialog with data for clicked image void ss_imageprefs_Lclick_func(int Nth) { zdialog *zd; int ii, kk; ch *pp, zoomloc[40]; GdkWindow *Ggdkwin; if (! clicked_file) return; zd = zd_ss_imageprefs; // should not happen if (! zd) { zfree(clicked_file); clicked_file = 0; return; } for (ii = 0; ii < ss_Nfiles; ii++) // find clicked file in image prefs if (strmatch(clicked_file,ss_imagetab[ii].imagefile)) break; zfree(clicked_file); clicked_file = 0; if (ii == ss_Nfiles) return; // not found, album file removed ss_Fcurrent = ii; f_open(ss_imagetab[ii].imagefile); // make current, highlight if (ss_setzloc) { // 1-shot flag is set ss_setzloc = 0; ss_imagetab[ii].zoomlocx = clicked_width; // set zoom-in location from ss_imagetab[ii].zoomlocy = clicked_height; // thumbnail click position Ggdkwin = gtk_widget_get_window(Gdrawin); gdk_window_set_cursor(Ggdkwin,0); } pp = strrchr(ss_imagetab[ii].imagefile,'/'); // stuff image data into dialog if (pp) zdialog_stuff(zd,"imagefile",pp+1); zdialog_stuff(zd,"preference",ss_imagetab[ii].preference); zdialog_stuff(zd,"wait0",ss_imagetab[ii].wait0); zdialog_stuff(zd,"filesecs",ss_imagetab[ii].filesecs); zdialog_stuff(zd,"titlesecs",ss_imagetab[ii].titlesecs); zdialog_stuff(zd,"descsecs",ss_imagetab[ii].descsecs); zdialog_stuff(zd,"wait1",ss_imagetab[ii].wait1); zdialog_stuff(zd,"zoomin",0); // set both zoom checks off zdialog_stuff(zd,"zoomout",0); kk = ss_imagetab[ii].zoomtype; // 0/1/2 = none/zoomin/zoomout if (kk == 1) zdialog_stuff(zd,"zoomin",1); // set corresp. check on if (kk == 2) zdialog_stuff(zd,"zoomout",1); zdialog_stuff(zd,"zoomsize",ss_imagetab[ii].zoomsize); zdialog_stuff(zd,"zoomtime",ss_imagetab[ii].zoomtime); snprintf(zoomloc,40,"position: x=%02d y=%02d", // stuff zoom location ss_imagetab[ii].zoomlocx,ss_imagetab[ii].zoomlocy); zdialog_stuff(zd,"labzloc",zoomloc); zdialog_stuff(zd,"wait2",ss_imagetab[ii].wait2); zdialog_stuff(zd,"tranname",ss_imagetab[ii].tranname); return; } /*********************** preferences file format ************************************ global data: imagetime: NN 0-99 image show time texttime: NN 0-99 text show time cliplimit: NN 0-50 musicfile: /path.../file.ogg music file or "none" fullscreen: 0-1 replay: 0-1 randomimage: N 0-1 random image randomtrans: N 0-1 random transition type transitions data: tranname N NN NN tranname enabled duration preference tranname N NN NN 0-1 0.1-10 0-99 ... images data: imagefile: /path.../file.jpg show this image preference: NN 0-99 image preference wait0: NN seconds to wait 0-99 filename: NN seconds to show file name title: NN seconds to show title description: NN seconds to show description wait1: NN seconds to wait 0-99 zoomtype: N 0/1/2 = none/zoom-in/zoom-out zoomsize: N.N 1.0 - 3.0 // 1.0 = no zoom zoomtime: NN seconds for zoom 0-99 zoomloc: NN NN 20-80 20-80 wait2: NN seconds to wait 0-99 tranname: aaaaaa transition name or "next" ... ***************************************************************************************/ // Load all data for a specific slide show from a slide show preferences file. // Set defaults if no data previously defined. void ss_loadprefs() { FILE *fid; ch buff[XFCC]; ch prefsfile[200], *pp; int ii, jj, nn, format; FTYPE ftype; ch tranname[32]; int n1, n2; float ff; for (ii = 0; ii < ss_Nfiles; ii++) { // free prior image data if any pp = ss_imagetab[ii].imagefile; if (pp) zfree(pp); ss_imagetab[ii].imagefile = 0; } ss_Nfiles = 0; fid = fopen(ss_albumfile,"r"); // open album file if (! fid) { zmessageACK(Mwin,TX("invalid album")); return; } for (ii = 0; ii < SSMAXI; ) { // read all image file names pp = fgets_trim(buff,XFCC,fid); if (! pp) break; ftype = image_file_type(pp); // screen out deleted image files if (ftype != IMAGE && ftype != VIDEO) continue; ss_imagetab[ii].imagefile = zstrdup(pp,"ss"); // add to image table ii++; } fclose(fid); ss_Nfiles = ii; if (! ss_Nfiles) { zmessageACK(Mwin,TX("invalid album")); return; } album_show(ss_albumfile); // open slide show album ss_imagetime = 3; // default image display time ss_texttime = 0; // default text show time ss_cliplimit = 0; // image clip limit = no clipping for (ii = 0; ii < SSNT; ii++) // initialize transitions table ss_trantab[ii] = ss_trantab_default[ii]; // with default preferences for (ii = 0; ii < SSNT; ii++) { ss_Tused[ii] = ii; // all transition types are used ss_Tlast[ii] = 0; // last used list is empty } ss_randomimage = 0; // random images = NO ss_randomtrans = 0; // random transitions = NO ss_Nused = SSNT; // used transitions = all ss_Tnext = 0; // next = first for (ii = 0; ii < ss_Nfiles; ii++) { // initialize image table with defaults ss_imagetab[ii].preference = 10; ss_imagetab[ii].wait0 = 0; ss_imagetab[ii].filesecs = 0; ss_imagetab[ii].titlesecs = 0; ss_imagetab[ii].descsecs = 0; ss_imagetab[ii].wait1 = 0; ss_imagetab[ii].zoomtype = 0; // no zoom-in ss_imagetab[ii].zoomsize = 1.0; ss_imagetab[ii].zoomtime = 2; ss_imagetab[ii].zoomlocx = 50; ss_imagetab[ii].zoomlocy = 50; ss_imagetab[ii].wait2 = 0; strcpy(ss_imagetab[ii].tranname,"next"); } snprintf(prefsfile,200,"%s/%s",slideshow_folder,ss_albumname); fid = fopen(prefsfile,"r"); // open slide show prefs file if (! fid) return; format = 0; while (true) { pp = fgets_trim(buff,XFCC,fid,1); if (! pp) break; if (strmatchN(pp,"global data:",12)) { format = 1; continue; } if (strmatchN(pp,"transitions data:",17)) { format = 2; continue; } if (strmatchN(pp,"images data:",12)) { format = 3; continue; } if (format == 1) // overall preferences { if (strmatchN(pp,"imagetime: ",11)) { // imagetime: NN show time, secs. ss_imagetime = atoi(pp+11); continue; } if (strmatchN(pp,"texttime: ",10)) { // texttime: NN filename/title/desc. ss_texttime = atoi(pp+10); continue; } if (strmatchN(pp,"cliplimit: ",11)) { // cliplimit: NN margin clip limit 0-50% ss_cliplimit = atoi(pp+11); continue; } if (strmatchN(pp,"randomimage: ",13)) { // randomimage: 0/1 = seq./random image ss_randomimage = atoi(pp+13); continue; } if (strmatchN(pp,"randomtrans: ",13)) { // randomtrans: 0/1 = seq./random transition ss_randomtrans = atoi(pp+13); continue; } if (strmatchN(pp,"fullscreen: ",12)) { // fullscreen: N 0/1 = no / full screen ss_fullscreen = atoi(pp+12); continue; } if (strmatchN(pp,"replay: ",8)) { // replay: N 0/1 = no / replay after end ss_replay = atoi(pp+8); continue; } } if (format == 2) // transition preferences { nn = sscanf(buff,"%s %d %f %d ",tranname,&n1,&ff,&n2); // tranname N N.N NN if (nn != 4) { // (enabled 0-1 duration N.N pref. 0-99) printf("*** bad record: %s \n",buff); continue; } for (ii = 0; ii < SSNT; ii++) if (strmatch(tranname,ss_trantab[ii].tranname)) break; if (ii == SSNT) { printf("*** unknown transition: %s \n",tranname); // ignore and continue continue; } ss_trantab[ii].enabled = n1; ss_trantab[ii].trantime = ff; ss_trantab[ii].preference = n2; } if (format == 3) // image file preferences { if (strmatchN(pp,"imagefile: ",11)) { // set image file for subsequent recs pp += 11; if (*pp != '/') { printf("*** bad image file: %s \n",buff); continue; } for (ii = 0; ii < ss_Nfiles; ii++) // search album for matching image if (strmatch(pp,ss_imagetab[ii].imagefile)) break; if (ii == ss_Nfiles) ii = -1; // if not found, set no curr. image continue; } if (ii < 0) continue; // ignore recs following invalid image if (strmatchN(pp,"preference: ",12)) { // preference: NN 0-99 nn = atoi(pp+12); ss_imagetab[ii].preference = nn; continue; } if (strmatchN(pp,"wait0: ",7)) { // wait0: NN secs before title/desc nn = atoi(pp+7); ss_imagetab[ii].wait0 = nn; continue; } if (strmatchN(pp,"filename: ",10)) { // filename: NN secs for file name nn = atoi(pp+10); ss_imagetab[ii].filesecs = nn; continue; } if (strmatchN(pp,"title: ",7)) { // title: NN secs to show title nn = atoi(pp+7); ss_imagetab[ii].titlesecs = nn; continue; } if (strmatchN(pp,"description: ",13)) { // description: NN secs to show description nn = atoi(pp+13); ss_imagetab[ii].descsecs = nn; continue; } if (strmatchN(pp,"wait1: ",7)) { // wait1: NN secs before zoom-in nn = atoi(pp+7); ss_imagetab[ii].wait1 = nn; continue; } if (strmatchN(pp,"zoomtype: ",10)) { // zoomtype: N zoom type nn = atoi(pp+10); // 0/1/2 = none/zoom-in/zoom-out ss_imagetab[ii].zoomtype = nn; continue; } if (strmatchN(pp,"zoomsize: ",10)) { // zoomsize: N.N 1.0 - 3.0 = 3x ff = atofz(pp+10); // ff float ss_imagetab[ii].zoomsize = ff; continue; } if (strmatchN(pp,"zoomtime: ",10)) { // zoomtime: NN secs nn = atoi(pp+10); if (nn < 1) nn = 1; // insure >= 1 ss_imagetab[ii].zoomtime = nn; continue; } if (strmatchN(pp,"zoomloc: ",9)) { // zoomloc: NN NN zoom-in location nn = strtol(pp+9,&pp,10); // (20-80% of image width and height) ss_imagetab[ii].zoomlocx = nn; nn = atoi(pp); ss_imagetab[ii].zoomlocy = nn; continue; } if (strmatchN(pp,"wait2: ",7)) { // wait2: NN secs after zoom-in nn = atoi(pp+7); ss_imagetab[ii].wait2 = nn; continue; } if (strmatchN(pp,"tranname: ",10)) { // transaction to next image strncpy0(ss_imagetab[ii].tranname,pp+10,32); continue; } } } fclose(fid); for (ii = jj = 0; ii < SSNT; ii++) { // initialize list of enabled if (ss_trantab[ii].enabled) { // transition types ss_Tused[jj] = ii; jj++; } } ss_Nused = jj; // no. enabled transition types return; } // ----------------------------------------------------------------------------- // Save all data for a specific slide show to a slide show preferences file. void ss_saveprefs() { FILE *fid; ch prefsfile[200]; int ii; if (! ss_Nfiles) { zmessageACK(Mwin,TX("invalid album")); return; } snprintf(prefsfile,200,"%s/%s",slideshow_folder,ss_albumname); fid = fopen(prefsfile,"w"); // open slide show prefs file if (! fid) { zmessageACK(Mwin,strerror(errno)); return; } fprintf(fid,"global data: \n"); fprintf(fid,"imagetime: %d \n",ss_imagetime); fprintf(fid,"texttime: %d \n",ss_texttime); fprintf(fid,"cliplimit: %d \n",ss_cliplimit); fprintf(fid,"randomimage: %d \n",ss_randomimage); fprintf(fid,"randomtrans: %d \n",ss_randomtrans); fprintf(fid,"fullscreen: %d \n",ss_fullscreen); fprintf(fid,"replay: %d \n",ss_replay); fprintf(fid,"transitions data: \n"); for (ii = 0; ii < SSNT; ii++) fprintf(fid,"%s %d %.1f %d \n", ss_trantab[ii].tranname, ss_trantab[ii].enabled, ss_trantab[ii].trantime, ss_trantab[ii].preference); fprintf(fid,"images data: \n"); for (ii = 0; ii < ss_Nfiles; ii++) { fprintf(fid,"imagefile: %s \n",ss_imagetab[ii].imagefile); fprintf(fid,"preference: %d \n",ss_imagetab[ii].preference); fprintf(fid,"wait0: %d \n",ss_imagetab[ii].wait0); fprintf(fid,"filename: %d \n",ss_imagetab[ii].filesecs); fprintf(fid,"title: %d \n",ss_imagetab[ii].titlesecs); fprintf(fid,"description: %d \n",ss_imagetab[ii].descsecs); fprintf(fid,"wait1: %d \n",ss_imagetab[ii].wait1); fprintf(fid,"zoomtype: %d \n",ss_imagetab[ii].zoomtype); fprintf(fid,"zoomsize: %.1f \n",ss_imagetab[ii].zoomsize); fprintf(fid,"zoomtime: %d \n",ss_imagetab[ii].zoomtime); fprintf(fid,"zoomloc: %d %d \n",ss_imagetab[ii].zoomlocx,ss_imagetab[ii].zoomlocy); fprintf(fid,"wait2: %d \n",ss_imagetab[ii].wait2); fprintf(fid,"tranname: %s \n",ss_imagetab[ii].tranname); } fclose(fid); ss_loadprefs(); // reload to sync poss. album edits return; } /************************************************************************************** slide show image transitions ***************************************************************************************/ // write black to entire window void ss_blankwindow() { GdkRGBA GDKdark; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); GDKdark.red = GDKdark.green = GDKdark.blue = 0.2; GDKdark.alpha = 1; gdk_cairo_set_source_rgba(cr,&GDKdark); cairo_paint(cr); draw_context_destroy(draw_context); zmainloop(); return; } // ------------------------------------------------------------------------------ // instant transition (also used for keyboard arrow keys) void ss_instant() { cairo_t *cr = draw_context_create(Fgdkwin,draw_context); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); cairo_paint(cr); draw_context_destroy(draw_context); zmainloop(); return; } // ------------------------------------------------------------------------------ // fade-out / fade-in transition void ss_fadein() { PXB *pxbmix; int jj, kk, px, py; float newpart, oldpart; uint8 *pixels1, *pixels2, *pixels3; uint8 *pix1, *pix2, *pix3; double T0, Te, Tz; pxbmix = PXB_copy(ss_pxbold); pixels1 = ss_pxbold->pixels; pixels2 = ss_pxbnew->pixels; pixels3 = pxbmix->pixels; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done newpart = Te / Tz; oldpart = 1.0 - newpart; for (jj = 0; jj < 2; jj++) // four passes, each modifies 25% for (kk = 0; kk < 2; kk++) // of the pixels (visually smoother) { for (py = jj; py < ss_hh; py += 2) for (px = kk; px < ss_ww; px += 2) { pix1 = pixels1 + py * ss_rs + px * 3; pix2 = pixels2 + py * ss_rs + px * 3; pix3 = pixels3 + py * ss_rs + px * 3; pix3[0] = newpart * pix2[0] + oldpart * pix1[0]; pix3[1] = newpart * pix2[1] + oldpart * pix1[1]; pix3[2] = newpart * pix2[2] + oldpart * pix1[2]; } gdk_cairo_set_source_pixbuf(cr,pxbmix->pixbuf,0,0); cairo_paint(cr); zmainloop(); // reduce jitter 26.5 if (ss_escape) break; } } PXB_free(pxbmix); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // new image rolls over prior image from left to right void ss_rollright() { PIXBUF *pixbuf; int px, ppx, ww; double T0, Te, Tz; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) px = ppx = 0; while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te >= Tz) break; // done px = Te / Tz * ss_ww; // ending column to paint if (px > ss_ww - 1) break; ww = px - ppx; // width to paint if (ww < 1) ww = 1; pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbnew->pixbuf,ppx,0,ww,ss_hh); gdk_cairo_set_source_pixbuf(cr,pixbuf,ppx,0); cairo_paint(cr); g_object_unref(pixbuf); ppx = px; zmainloop(); if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // new image rolls over prior image from left to right // and fades-in, parallel with the roll void ss_slidefadein() { PXB *pxbmix; PIXBUF *pixbuf; int ww, px, py; float newpart, oldpart; uint8 *pixels1, *pixels2, *pixels3; uint8 *pix1, *pix2, *pix3; double T0, Te, Tz; pxbmix = PXB_copy(ss_pxbold); pixels1 = ss_pxbold->pixels; pixels2 = ss_pxbnew->pixels; pixels3 = pxbmix->pixels; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te >= Tz) break; // done ww = Te / Tz * ss_ww + 1; // new image width to paint if (ww > ss_ww - 1) break; newpart = Te / Tz; oldpart = 1.0 - newpart; for (py = 0; py < ss_hh; py++) for (px = 0; px < ww; px++) { pix1 = pixels1 + py * ss_rs + px * 3; // old image pixel pix2 = pixels2 + py * ss_rs + px * 3; // new image pixel pix3 = pixels3 + py * ss_rs + px * 3; // combined pix3[0] = newpart * pix2[0] + oldpart * pix1[0]; pix3[1] = newpart * pix2[1] + oldpart * pix1[1]; pix3[2] = newpart * pix2[2] + oldpart * pix1[2]; } pixbuf = gdk_pixbuf_new_subpixbuf(pxbmix->pixbuf,0,0,ww,ss_hh); gdk_cairo_set_source_pixbuf(cr,pixbuf,0,0); cairo_paint(cr); g_object_unref(pixbuf); zmainloop(); if (ss_escape) break; } PXB_free(pxbmix); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // new image rolls over prior image from top down void ss_rolldown() { PIXBUF *pixbuf; int py, ppy, hh; double T0, Te, Tz; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) py = ppy = 0; while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te >= Tz) break; // done py = Te / Tz * ss_hh; // last row to paint hh = py - ppy; if (hh < 1) hh = 1; pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbnew->pixbuf,0,ppy,ss_ww,hh); gdk_cairo_set_source_pixbuf(cr,pixbuf,0,ppy); cairo_paint(cr); g_object_unref(pixbuf); ppy = py; zmainloop(); // help jitter 26.5 if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // new image opens up in horizontal rows like venetian blinds void ss_venetian() { PIXBUF *pixbuf; int py1, py2; uint8 *pixels, *pix3; int louver, Nlouvers = 20; int louversize = ss_hh / Nlouvers; double T0, Te, Tz; pixels = ss_pxbnew->pixels; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done py1 = Te / Tz * louversize; // 0 .. louversize for (louver = 0; louver < Nlouvers; louver++) // louver, first to last { py2 = py1 + louver * louversize; if (py2 >= ss_hh) break; pix3 = pixels + py2 * ss_rs; pixbuf = gdk_pixbuf_new_from_data(pix3,GDKRGB,0,8,ss_ww,4,ss_rs,0,0); gdk_cairo_set_source_pixbuf(cr,pixbuf,0,py2); cairo_paint(cr); g_object_unref(pixbuf); } zmainsleep(0.001); // better than zmainloop() ?? 26.5 if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // a grate opens up to show new image void ss_grate() { PIXBUF *pixbuf; int px1, px2, py1, py2; uint8 *pixels, *pix3; int row, col, Nrow, Ncol; // rows and columns int boxww, boxhh; double T0, Te, Tz; pixels = ss_pxbnew->pixels; Ncol = 20; // 20 columns boxww = boxhh = ss_ww / Ncol; // square boxes Nrow = ss_hh / boxhh; // corresp. rows Ncol++; // round up Nrow++; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done py1 = Te / Tz * boxhh; // 0 .. boxhh for (row = 0; row < Nrow; row++) { py2 = py1 + row * boxhh; if (py2 >= ss_hh) break; pix3 = pixels + py2 * ss_rs; pixbuf = gdk_pixbuf_new_from_data(pix3,GDKRGB,0,8,ss_ww,1,ss_rs,0,0); gdk_cairo_set_source_pixbuf(cr,pixbuf,0,py2); cairo_paint(cr); g_object_unref(pixbuf); } px1 = py1; for (col = 0; col < Ncol; col++) { px2 = px1 + col * boxww; if (px2 >= ss_ww) break; pix3 = pixels + px2 * 3; pixbuf = gdk_pixbuf_new_from_data(pix3,GDKRGB,0,8,1,ss_hh,ss_rs,0,0); gdk_cairo_set_source_pixbuf(cr,pixbuf,px2,0); cairo_paint(cr); g_object_unref(pixbuf); } zmainloop(); if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // A rectangular hole opens up from the center and expands outward to reveal new image. void ss_rectangle() { PIXBUF *pixbuf; int ww, hh, sww, shh; int px, py, ppx, ppy; double T0, Te, Tz; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) ppx = ss_ww / 2; ppy = ss_hh / 2; while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te >= Tz) break; // done ww = Te / Tz * ss_ww; // 0 ... ss_ww central rectangle hh = Te / Tz * ss_hh; // 0 ... ss_hh width and height px = ss_ww / 2 - ww / 2; // NW corner, moving NW py = ss_hh / 2 - hh / 2; if (px == ppx || py == ppy) { zsleep(0.001); continue; } if (px + ww > ss_ww - 2) break; if (py + hh > ss_hh - 2) break; sww = ppx - px; // left/right stripe width shh = ppy - py; // top/bottom stripe height pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbnew->pixbuf,px,py,ww+2,shh+2); // paint top edge stripe gdk_cairo_set_source_pixbuf(cr,pixbuf,px,py); cairo_paint(cr); g_object_unref(pixbuf); pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbnew->pixbuf,px,py+hh-shh,ww+2,shh+2); // paint bottom edge stripe gdk_cairo_set_source_pixbuf(cr,pixbuf,px,py+hh-shh); cairo_paint(cr); g_object_unref(pixbuf); pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbnew->pixbuf,px,py,sww+2,hh+2); // paint left edge stripe gdk_cairo_set_source_pixbuf(cr,pixbuf,px,py); cairo_paint(cr); g_object_unref(pixbuf); pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbnew->pixbuf,px+ww-sww,py,sww+2,hh+2); // paint right edge stripe gdk_cairo_set_source_pixbuf(cr,pixbuf,px+ww-sww,py); cairo_paint(cr); g_object_unref(pixbuf); ppx = px; ppy = py; zmainloop(); if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // old image shrinks to the center, revealing new image void ss_contract() { float size; int ww, hh, px, py; PXB *pxbnew, *pxbold; double T0, Te, Tz, R; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done R = Te / Tz; // 0 ... 1 R = R * R; // slower ... faster size = 1.0 - R; if (size < 0.005) size = 0.005; pxbnew = PXB_copy(ss_pxbnew); // new image at full size ww = ss_ww * size; hh = ss_hh * size; pxbold = PXB_rescale_fast(ss_pxbold,ww,hh); // old image at reduced size px = ss_ww * 0.5 * (1.0 - size); // new image position, NW corner --> center py = ss_hh * 0.5 * (1.0 - size); PXB_copy_area(pxbold,0,0,ww,hh,pxbnew,px,py); // copy shrinking old image into new image gdk_cairo_set_source_pixbuf(cr,pxbnew->pixbuf,0,0); // paint new image cairo_paint(cr); PXB_free(pxbnew); PXB_free(pxbold); zmainloop(); if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // new image grows from the center, covering old image void ss_expand() { float size; int ww, hh, px, py; PXB *pxbnew, *pxbold; double T0, Te, Tz, R; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done R = Te / Tz; // 0 ... 1 R = pow(R,1.6); // slower ... faster size = R; if (size < 0.005) size = 0.005; if (size > 1.0) break; pxbold = PXB_copy(ss_pxbold); // old image at full size ww = ss_ww * size; hh = ss_hh * size; pxbnew = PXB_rescale_fast(ss_pxbnew,ww,hh); // new image at reduced size px = ss_ww * 0.5 * (1.0 - size); // new image position, center --> NW corner py = ss_hh * 0.5 * (1.0 - size); PXB_copy_area(pxbnew,0,0,ww,hh,pxbold,px,py); // copy shrinking old image into new image gdk_cairo_set_source_pixbuf(cr,pxbold->pixbuf,0,0); // paint new image cairo_paint(cr); PXB_free(pxbnew); PXB_free(pxbold); zmainloop(); if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // New image sweeps into view like a circular radar image void ss_radar() { int px, py, ww, hh; int px1, py1, px2, py2; int ww2 = ss_ww/2, hh2 = ss_hh/2; float R, Rmax, dR, T, pT, dTmax; float r, r1, r2; float cosT, sinT; uint8 *pixels1, *pixels3, *pix1, *pix3; PIXBUF *pixbuf; double T0, Te, Tz; px = py = 0; // suppress compiler warnings pixels1 = ss_pxbold->pixels; pixels3 = ss_pxbnew->pixels; Rmax = sqrt(ww2*ww2 + hh2*hh2); // max. line length, center to corner dR = 200; // line segment length T = pT = 0.0; dTmax = 1.3 / Rmax; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time T = 2.0 * PI * Te / Tz; // 0 ... 2 * PI if (T - pT > dTmax) T = pT + dTmax; pT = T; // enforce max. dT to avoid gaps if (T >= 2 * PI) break; cosT = cosf(T); sinT = sinf(T); for (R = 0; R < Rmax; R += dR) // R from center to edge { r1 = R; // R segment r2 = R + dR; px1 = ww2 + r1 * cosT; // R segment px2 = ww2 + r2 * cosT; py1 = hh2 - r1 * sinT; py2 = hh2 - r2 * sinT; for (r = r1; r <= r2; r++) // loop R segment pixels { px = ww2 + r * cosT; py = hh2 - r * sinT; if (px < 0) px = 0; if (px > ss_ww-3) px = ss_ww-3; if (py < 0) py = 0; if (py > ss_hh-3) py = ss_hh-3; pix1 = pixels1 + py * ss_rs + px * 3; // copy new image pixels to old image pix3 = pixels3 + py * ss_rs + px * 3; memcpy(pix1,pix3,9); memcpy(pix1 + ss_rs, pix3 + ss_rs,9); memcpy(pix1 + 2 * ss_rs, pix3 + 2 * ss_rs,9); if (px == 0 || px == ss_ww-3) break; // reached edge of image if (py == 0 || py == ss_hh-3) break; } px2 = px; // actual end of R segment py2 = py; if (px1 < px2) px = px1; // get rectangle enclosing R segment else px = px2; if (py1 < py2) py = py1; else py = py2; ww = abs(px2-px1) + 1; hh = abs(py2-py1) + 1; if (px < 0) px = 0; if (px > ss_ww-1) px = ss_ww-1; if (px + ww > ss_ww) ww = ss_ww - px; if (py < 0) py = 0; if (py > ss_hh-1) py = ss_hh-1; if (py + hh > ss_hh) hh = ss_hh - py; pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbold->pixbuf,px,py,ww,hh); // paint window rectangle gdk_cairo_set_source_pixbuf(cr,pixbuf,px,py); cairo_paint(cr); g_object_unref(pixbuf); zmainloop(); if (ss_escape) break; } } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // new image opens up like a Japanese fan void ss_japfan() { int px, py, pxL, ww, hh; int px1, py1, px2, py2; int ww2 = ss_ww/2, hh2 = ss_hh/2; double R, Rmax, dR, T, pT, dTmax; double r, r1, r2; double cosT, sinT; double T0, Te, Tz; uint8 *pixels1, *pixels3, *pix1, *pix3; PIXBUF *pixbuf; px = py = 0; // suppress compiler warnings pixels1 = ss_pxbold->pixels; pixels3 = ss_pxbnew->pixels; Rmax = sqrt(ww2*ww2 + hh2*hh2); // max. line length, center to corner dR = 200; dTmax = 1.3 / Rmax; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) pT = PI / 2; while (true) { Te = get_seconds() - T0; // elapsed transition time T = 0.5 * PI - PI * Te / Tz; // 0.5 * PI ... -0.5 * PI T += 0.01; // avoid tiny gaps if (T < -0.51 * PI) break; if (pT - T > dTmax) T = pT - dTmax; // enforce max. dT to avoid gaps pT = T; cosT = cosf(T); sinT = sinf(T); for (R = 0; R < Rmax; R += dR) // R from center to edge { r1 = R; // R segment r2 = R + dR; px1 = ww2 + r1 * cosT; // R segment px2 = ww2 + r2 * cosT; py1 = hh2 - r1 * sinT; py2 = hh2 - r2 * sinT; for (r = r1; r <= r2; r++) // loop R segment pixels { px = ww2 + r * cosT; py = hh2 - r * sinT; if (px < 0) px = 0; if (px > ss_ww-3) px = ss_ww-3; if (py < 0) py = 0; if (py > ss_hh-3) py = ss_hh-3; pix1 = pixels1 + py * ss_rs + px * 3; // copy new image pixels to old image pix3 = pixels3 + py * ss_rs + px * 3; // right side memcpy(pix1, pix3, 9); memcpy(pix1 + ss_rs, pix3 + ss_rs, 9); memcpy(pix1 + 2 * ss_rs, pix3 + 2 * ss_rs, 9); pxL = ss_ww - px - 3; pix1 = pixels1 + py * ss_rs + pxL * 3; // left side pixels pix3 = pixels3 + py * ss_rs + pxL * 3; memcpy(pix1, pix3, 9); memcpy(pix1 + ss_rs, pix3 + ss_rs, 9); memcpy(pix1 + 2 * ss_rs, pix3 + 2 * ss_rs, 9); if (px == 0 || px == ss_ww-3) break; // reached edge of image if (py == 0 || py == ss_hh-3) break; } px2 = px; // actual end of R segment py2 = py; if (px1 < px2) px = px1; // get rectangle enclosing R segment else px = px2; if (py1 < py2) py = py1; else py = py2; ww = ABS(px2 - px1) + 1; hh = abs(py2 - py1) + 1; if (px < 0) px = 0; if (px > ss_ww-1) px = ss_ww-1; if (px + ww > ss_ww) ww = ss_ww - px; if (py < 0) py = 0; if (py > ss_hh-1) py = ss_hh-1; if (py + hh > ss_hh) hh = ss_hh - py; pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbold->pixbuf,px,py,ww,hh); // paint window rectangle gdk_cairo_set_source_pixbuf(cr,pixbuf,px,py); cairo_paint(cr); g_object_unref(pixbuf); pxL = ss_ww-3 - px2; pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbold->pixbuf,pxL,py,ww,hh); // left side rectangle gdk_cairo_set_source_pixbuf(cr,pixbuf,pxL,py); cairo_paint(cr); g_object_unref(pixbuf); zmainloop(); if (ss_escape) break; } } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // New image spirals outwards from the center void ss_spiral() { int px, py, ww, hh; int px1, py1, px2, py2; int ww2 = ss_ww/2, hh2 = ss_hh/2; float R, Rmax, dR, T, Tp; float r, r1, r2; float cosT, sinT; uint8 *pixels1, *pixels3, *pix1, *pix3; PIXBUF *pixbuf; double T0, Te, Tz; px = py = 0; // suppress compiler warnings pixels1 = ss_pxbold->pixels; pixels3 = ss_pxbnew->pixels; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); Rmax = sqrt(ww2*ww2 + hh2*hh2); // max. line length, center to corner dR = Rmax / 8; // radius step T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) Tp = 0; while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te >= Tz) break; T = 16 * PI * Te / Tz; // 0 ... 8 revolutions if (T - Tp > 0.002) T = Tp + 0.002; // compensate scheduling jitter Tp = T; R = Rmax * T / (16.0 * PI); // 0 ... Rmax r1 = R; // R segment if (T < 2 * PI) r1 = 0; r2 = R + dR + 4; cosT = cosf(T); sinT = sinf(T); px1 = ww2 + r1 * cosT; // R segment px2 = ww2 + r2 * cosT; py1 = hh2 - r1 * sinT; py2 = hh2 - r2 * sinT; for (r = r1; r < r2; r++) // loop R segment pixels { px = ww2 + r * cosT; py = hh2 - r * sinT; if (px < 0) px = 0; if (px > ss_ww-6) px = ss_ww-6; if (py < 0) py = 0; if (py > ss_hh-6) py = ss_hh-6; pix1 = pixels1 + py * ss_rs + px * 3; // copy new image pixels to old image pix3 = pixels3 + py * ss_rs + px * 3; memcpy(pix1, pix3, 18); memcpy(pix1 + ss_rs, pix3 + ss_rs, 18); memcpy(pix1 + 2 * ss_rs, pix3 + 2 * ss_rs, 18); memcpy(pix1 + 3 * ss_rs, pix3 + 3 * ss_rs, 18); memcpy(pix1 + 4 * ss_rs, pix3 + 4 * ss_rs, 18); memcpy(pix1 + 5 * ss_rs, pix3 + 5 * ss_rs, 18); if (px == 0 || px >= ss_ww-6) break; // reached edge of image if (py == 0 || py >= ss_hh-6) break; } if (px1 < px2) px = px1; // get rectangle enclosing R segment else px = px2; if (py1 < py2) py = py1; else py = py2; ww = abs(px2-px1) + 20; hh = abs(py2-py1) + 20; if (px < 0) px = 0; if (px > ss_ww-1) px = ss_ww-1; if (px + ww > ss_ww) ww = ss_ww - px; if (py < 0) py = 0; if (py > ss_hh-1) py = ss_hh-1; if (py + hh > ss_hh) hh = ss_hh - py; pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbold->pixbuf,px,py,ww,hh); // paint window rectangle gdk_cairo_set_source_pixbuf(cr,pixbuf,px,py); cairo_paint(cr); g_object_unref(pixbuf); zmainloop(); if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // An ellipse opens up from the center and expands outward void ss_ellipse() { PIXBUF *pixbuf; uint8 *pixels, *pix3; int Np, px1, py1, ww; float a, b, a2, b2, px, py, px2, py2; float ww2 = ss_ww / 2, hh2 = ss_hh / 2; double T0, Te, Tz; Np = 3; pixels = ss_pxbnew->pixels; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done a = ww2 * 1.4 * Te / Tz; // ellipse a and b constants b = a * ss_hh / ss_ww; // from tiny to >> image size a2 = a * a; b2 = b * b; for (py = -b; py <= +b; py += Np) // py from top of ellipse to bottom { while (py < -(hh2-Np+1)) py += Np; if (py > hh2-Np+1) break; py2 = py * py; px2 = a2 * (1.0 - py2 / b2); // corresponding px value, px = sqrt(px2); // (+/- from center of ellipse) if (px > ww2) px = ww2; ww = 2 * px; // length of line thru ellipse if (ww < 2) continue; px1 = ww2 - px; // relocate origin py1 = py + hh2; if (px1 + ww > ss_ww) px1 = ss_ww - ww; // insurance if (py1 + Np > ss_hh) py1 = ss_hh - Np; pix3 = pixels + py1 * ss_rs + px1 * 3; pixbuf = gdk_pixbuf_new_from_data(pix3,GDKRGB,0,8,ww,Np,ss_rs,0,0); gdk_cairo_set_source_pixbuf(cr,pixbuf,px1,py1); cairo_paint(cr); g_object_unref(pixbuf); zmainloop(); if (ss_escape) break; } } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // new image splats onto old image one drop at a time void ss_raindrops() { PXB *pxbmix; PIXBUF *pixbuf; int rsmix; int px, py, px1, py1, px2, py2, cx, cy; int Rmin, Rmax, R, R2, dist2; int Ndrops = 3000; uint8 *pixels2, *pixels3; uint8 *pix2, *pix3 = 0; double T0, Te, Tz; pixels2 = ss_pxbnew->pixels; // source image cairo_t *cr = draw_context_create(Fgdkwin,draw_context); pxbmix = PXB_copy(ss_pxbold); // destination image pixels3 = pxbmix->pixels; rsmix = pxbmix->rs; Rmin = ss_ww * 0.01; // drop size range Rmax = ss_ww * 0.02; Ndrops = 3000; T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done cx = drandz() * ss_ww; // drop location on image cy = drandz() * ss_hh; R = drandz() * Rmax + Rmin; // drop size R2 = R * R; px1 = cx - R; if (px1 < 0) px1 = 0; py1 = cy - R; if (py1 < 0) py1 = 0; px2 = cx + R; if (px2 >= ss_ww) px2 = ss_ww; py2 = cy + R; if (py2 > ss_hh) py2 = ss_hh; for (py = py1; py < py2; py++) // copy drop area from new image for (px = px1; px < px2; px++) // to old image { dist2 = (px-cx) * (px-cx) + (py-cy) * (py-cy); if (dist2 > R2) continue; pix2 = pixels2 + py * ss_rs + px * 3; pix3 = pixels3 + py * rsmix + px * 3; memcpy(pix3,pix2,3); } pixbuf = gdk_pixbuf_new_subpixbuf(pxbmix->pixbuf,px1,py1,px2-px1,py2-py1); gdk_cairo_set_source_pixbuf(cr,pixbuf,px1,py1); cairo_paint(cr); g_object_unref(pixbuf); zloop(ss_trantime / Ndrops); zmainloop(); if (ss_escape) break; } PXB_free(pxbmix); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // new image spreads from the middle to left and right edges // like a double-door swinging open void ss_doubledoor() { #define GPNFD(pix,ww,hh) gdk_pixbuf_new_from_data(pix,GDKRGB,0,8,ww,hh,ss_rs,0,0) PIXBUF *pixbuf; int bx, px; uint8 *pixels, *pix3; double T0, Te, Tz; pixels = ss_pxbnew->pixels; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done Te = pow(Te,1.7); // slow ... fast bx = 1.0 * Te / Tz * ss_ww / 2; // bx = 0 ... ww/2 px = ss_ww / 2 - bx; if (px < 0) break; pix3 = pixels + 3 * px; // line from (ww/2-bx,0) to (ww/2-bx,hh-1) pixbuf = GPNFD(pix3,8,ss_hh); gdk_cairo_set_source_pixbuf(cr,pixbuf,px,0); cairo_paint(cr); g_object_unref(pixbuf); px = ss_ww / 2 + bx; if (px > ss_ww-8) break; pix3 = pixels + 3 * px; // line from (ww/2+bx,0) to (ww/2+bx,hh-1) pixbuf = GPNFD(pix3,8,ss_hh); gdk_cairo_set_source_pixbuf(cr,pixbuf,px,0); cairo_paint(cr); g_object_unref(pixbuf); zmainloop(); // reduce jitter 26.5 if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // Rotate from old image to new image. Horizontal rotate image 'page'. namespace ss_rotate_names { int cx1, cy1, cx2, cy2, cy3, cy4; uint8 *pixels1, *pixels2, *pixels3; int rsmix; } void ss_rotate() { using namespace ss_rotate_names; void * ss_rotate_thread1(void *arg); void * ss_rotate_thread2(void *arg); PIXBUF *pixbuf; double T0, Te, Tz, R; pixels1 = ss_pxbold->pixels; pixels2 = ss_pxbnew->pixels; pixbuf = gdk_pixbuf_new(GDKRGB,0,8,ss_ww,ss_hh); // destination image rsmix = gdk_pixbuf_get_rowstride(pixbuf); pixels3 = gdk_pixbuf_get_pixels(pixbuf); cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = 0.5 * ss_trantime; // transition time per 1/2 rotate (90 deg.) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te >= Tz) break; // done R = Te / Tz; R = pow(R,1.8); // slow ... fast cx1 = R * ss_ww / 2.0; // corners of shrinking trapezoid cy1 = 0.3 * R * ss_hh; cx2 = ss_ww - cx1; cy2 = 0; cy3 = ss_hh; cy4 = ss_hh - cy1; memset(pixels3,0,ss_hh * rsmix); do_wthreads(ss_rotate_thread1,ss_NT); gdk_cairo_set_source_pixbuf(cr,pixbuf,0,0); cairo_paint(cr); zmainloop(); if (ss_escape) break; } T0 = get_seconds(); // transition start time while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done R = Te / Tz; R = pow(R,0.8); // fast ... slow cx1 = ss_ww * (0.5 + 0.5 * R); // corners of expanding trapezoid cy1 = ss_hh * (0.3 - 0.3 * R); cx2 = ss_ww * (0.5 - 0.5 * R); cy2 = 0; cy3 = ss_hh; cy4 = ss_hh - cy1; memset(pixels3,0,ss_hh * rsmix); do_wthreads(ss_rotate_thread2,ss_NT); gdk_cairo_set_source_pixbuf(cr,pixbuf,0,0); cairo_paint(cr); zmainloop(); if (ss_escape) break; } g_object_unref(pixbuf); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } void * ss_rotate_thread1(void *arg) { using namespace ss_rotate_names; int index = *((int *) (arg)); int px, py, ylo, yhi, vpx, vpy; uint8 *pix1, *pix3; float Rx, Ry; for (px = cx1 + 2 * index; px < cx2-1; px += 2 * ss_NT) { Rx = 1.0 * (px - cx1) / (cx2 - cx1); ylo = cy1 + Rx * (cy2 - cy1); yhi = cy4 + Rx * (cy3 - cy4); for (py = ylo; py < yhi-1; py += 2) { Ry = 1.0 * (py - ylo) / (yhi - ylo); vpx = Rx * (ss_ww - 1); vpy = Ry * (ss_hh - 1); pix1 = pixels1 + vpy * ss_rs + vpx * 3; pix3 = pixels3 + py * rsmix + px * 3; memcpy(pix3,pix1,6); memcpy(pix3+rsmix,pix1+ss_rs,6); // speedup 25.0 } } return 0; } void * ss_rotate_thread2(void *arg) { using namespace ss_rotate_names; int index = *((int *) (arg)); int px, py, ylo, yhi, vpx, vpy; uint8 *pix2, *pix3; float Rx, Ry; for (px = cx2 + 2 * index; px < cx1-1; px += 2 * ss_NT) { Rx = 1.0 * (px - cx2) / (cx1 - cx2); ylo = cy2 + Rx * (cy1 - cy2); yhi = cy3 + Rx * (cy4 - cy3); for (py = ylo; py < yhi-1; py += 2) { Ry = 1.0 * (py - ylo) / (yhi - ylo); vpx = Rx * (ss_ww - 1); vpy = Ry * (ss_hh - 1); pix2 = pixels2 + vpy * ss_rs + vpx * 3; pix3 = pixels3 + py * rsmix + px * 3; memcpy(pix3,pix2,6); memcpy(pix3+rsmix,pix2+ss_rs,6); // speedup 25.0 } } return 0; } // ------------------------------------------------------------------------------ // Old image falls over to reveal new image. namespace ss_fallover_names { int cx1, cy1, cx2, cy2; uint8 *pixels1, *pixels2, *pixels3; int rsmix; } void ss_fallover() { using namespace ss_fallover_names; void * ss_fallover_thread(void *arg); PIXBUF *pixbuf; float R; double T0, Te, Tz; pixels1 = ss_pxbold->pixels; // old image pixels2 = ss_pxbnew->pixels; // new image pixbuf = gdk_pixbuf_new(GDKRGB,0,8,ss_ww,ss_hh); // output image - mixture rsmix = gdk_pixbuf_get_rowstride(pixbuf); pixels3 = gdk_pixbuf_get_pixels(pixbuf); cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done R = 1.0 * Te / Tz; // 0 ... 1 R = pow(R,3); // slow ... fast cx1 = 0.2 * ss_ww * R; // top corners of falling old image cy1 = ss_hh * R; cx2 = ss_ww - cx1; cy2 = cy1; do_wthreads(ss_fallover_thread,ss_NT); gdk_cairo_set_source_pixbuf(cr,pixbuf,0,0); cairo_paint(cr); zmainloop(); // reduce jitter 26.5 if (ss_escape) break; } g_object_unref(pixbuf); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } void * ss_fallover_thread(void *arg) // construct combined image { using namespace ss_fallover_names; int index = *((int *) (arg)); int px, py, npix, vpx, vpy; int cx1a, cx2a; float R; uint8 *pix1, *pix3; for (py = index; py < ss_hh; py += ss_NT) // py = 0 ... ss_hh { px = 0; // px = 0 ... ss_ww, new image npix = ss_ww; pix1 = pixels2 + py * ss_rs + px * 3; pix3 = pixels3 + py * rsmix + px * 3; memcpy(pix3,pix1,npix*3); if (py < cy1) continue; R = 1.0 * (py - cy1) / (ss_hh - cy1); // 0 ... 1 cx1a = cx1 * (1.0 - R); // cx1a = cx1 ... 0 cx2a = cx2 + R * (ss_ww - cx2); // cx2a = cx2 ... ss_ww for (px = cx1a; px < cx2a-1; px += 2) // px = cx1a ... cx2a { vpx = ss_ww * (px - cx1a) / (cx2a - cx1a); // vpx = 0 ... ss_ww vpy = ss_hh * R; // vpy = 0 ... ss_hh pix1 = pixels1 + vpy * ss_rs + vpx * 3; pix3 = pixels3 + py * rsmix + px * 3; memcpy(pix3,pix1,6); // speedup 25.0 } } return 0; } // ------------------------------------------------------------------------------ // old image deforms from flat to sphere and then shrinks to reveal new image namespace ss_spheroid_names { float Cx, Cy, D; PXB *pxbold, *pxbnew; uint8 *pixels1, *pixels3; float *s1mem, *s2mem, Rmax; } void ss_spheroid() { using namespace ss_spheroid_names; void * ss_spheroid_thread(void *arg); int ii, cc, px, py, dx, dy; double T0, Te, Tz; float F; cc = ss_ww * ss_hh * sizeof(float); s1mem = (float *) zmalloc(cc,"ss"); Rmax = 1.0 + 0.5 * sqrtf(ss_ww * ss_ww + ss_hh * ss_hh); cc = 10.1 * Rmax * sizeof(float); // float rounding s2mem = (float *) zmalloc(cc,"ss"); pxbold = PXB_copy(ss_pxbold); // old image at full size pixels1 = pxbold->pixels; Cx = ss_ww / 2; // center of image Cy = ss_hh / 2; for (py = 0; py < ss_hh; py++) // pre-calculate for (px = 0; px < ss_ww; px++) { dx = px - Cx; dy = py - Cy; ii = py * ss_ww + px; s1mem[ii] = sqrtf(dx*dx + dy*dy); // dist. from center to pixel } cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done F = 1.0 - Te / Tz; // 1 ... 0 float D1 = pow(F,10) * 8 * ss_ww; float D2 = pow(F,6) * 3 * ss_ww; float D3 = F * 2 * ss_ww; D = D1 + D2 + D3 + 10; pxbnew = PXB_copy(ss_pxbnew); // new image at full size pixels3 = pxbnew->pixels; do_wthreads(ss_spheroid_thread,ss_NT); gdk_cairo_set_source_pixbuf(cr,pxbnew->pixbuf,0,0); // paint new image cairo_paint(cr); PXB_free(pxbnew); zmainloop(); if (ss_escape) break; } zfree(s1mem); zfree(s2mem); PXB_free(pxbold); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } void * ss_spheroid_thread(void *arg) { using namespace ss_spheroid_names; int index = *((int *) arg); int ii, px0, py0, px3, py3, dx, dy; float px1, py1, s1, s2, T; uint8 *pix0, *pix1, *pix2, *pix3, *pixx, *pixx2; float f0, f1, f2, f3; for (ii = 0; ii < 10 * Rmax; ii++) // pre-calculate { s1 = 0.1 * ii; T = s1 * PI / D; if (s1 == 0) s2mem[ii] = 0; else if (T > 1.0) s2mem[ii] = -1; else s2mem[ii] = D / PI * asinf(T) / s1; } for (py3 = 2 * index; py3 < ss_hh-1; py3 += 2 * ss_NT) // loop all output pixels for (px3 = 0; px3 < ss_ww-1; px3 += 2) { /*** dx = px3 - Cx; // code without pre-calculations dy = py3 - Cy; s1 = sqrtf(dx*dx + dy*dy); // dist. from center to output pixel if (s1 == 0) continue; T = s1 * PI / D; // sine of subtended angle if (T > 1.0) continue; s2 = D / PI * asinf(T); // corresp. dist. on sphere px1 = Cx + dx * s2 / s1; // input v.pixel py1 = Cy + dy * s2 / s1; ***/ dx = px3 - Cx; dy = py3 - Cy; ii = py3 * ss_ww + px3; s1 = s1mem[ii]; // dist. from center to output pixel ii = 10 * s1; s2 = s2mem[ii]; // corresp. dist. on sphere / s1 if (s2 < 0) continue; px1 = Cx + dx * s2; // input v.pixel py1 = Cy + dy * s2; // inline vpixel() for speed px0 = px1; // px0/py0: integer px1/py1 py0 = py1; if (px0 < 0 || py0 < 0) continue; if (px0 > ss_ww-3 || py0 > ss_hh-3) continue; f0 = (px0+1 - px1) * (py0+1 - py1); // overlap of (px,py) f1 = (px0+1 - px1) * (py1 - py0); // in each of the 4 pixels f2 = (px1 - px0) * (py0+1 - py1); f3 = (px1 - px0) * (py1 - py0); pix0 = pixels1 + py0 * ss_rs + px0 * 3; // pixel (px0,py0) pix1 = pix0 + ss_rs; // (px0,py0+1) pix2 = pix0 + 3; // (px0+1,py0) pix3 = pix1 + 3; // (px0+1,py0+1) pixx = pixels3 + py3 * ss_rs + px3 * 3; // input v.pixel >> output pixel pixx[0] = f0 * pix0[0] + f1 * pix1[0] + f2 * pix2[0] + f3 * pix3[0]; pixx[1] = f0 * pix0[1] + f1 * pix1[1] + f2 * pix2[1] + f3 * pix3[1]; pixx[2] = f0 * pix0[2] + f1 * pix1[2] + f2 * pix2[2] + f3 * pix3[2]; pixx[3] = f0 * pix0[3] + f1 * pix1[3] + f2 * pix2[3] + f3 * pix3[3]; pixx[4] = f0 * pix0[4] + f1 * pix1[4] + f2 * pix2[4] + f3 * pix3[4]; pixx[5] = f0 * pix0[5] + f1 * pix1[5] + f2 * pix2[5] + f3 * pix3[5]; pixx2 = pixx + ss_rs; memcpy(pixx2,pixx,6); } return 0; } // ------------------------------------------------------------------------------ // new image turns up from lower right corner, like a book page namespace ss_turnpage_names { uint8 *pixels1, *pixels2, *pixels3; int pxA; } void ss_turnpage() { using namespace ss_turnpage_names; void * ss_turnpage_thread1(void *arg); void * ss_turnpage_thread2(void *arg); PXB *pixbuf3; double T0, Te, Tz, Prange; pixels1 = ss_pxbold->pixels; // old image pixels2 = ss_pxbnew->pixels; // new image pixbuf3 = PXB_copy(ss_pxbold); // output image - mixture pixels3 = pixbuf3->pixels; // (initially = old image) cairo_t *cr = draw_context_create(Fgdkwin,draw_context); Prange = 1.31 * (ss_ww + ss_hh); // pxA loop range pxA = ss_ww; T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done pxA = ss_ww - Prange * Te / Tz; do_wthreads(ss_turnpage_thread1,ss_NT); // use threads to reduce jitter 25.0 do_wthreads(ss_turnpage_thread2,ss_NT); gdk_cairo_set_source_pixbuf(cr,pixbuf3->pixbuf,0,0); // paint image cairo_paint(cr); zmainloop(); if (ss_escape) break; } PXB_free(pixbuf3); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } void * ss_turnpage_thread1(void *arg) { using namespace ss_turnpage_names; int index = *((int *) arg); uint8 *pix2, *pix3; int px1, py1; int cc; for (px1 = pxA+index, py1 = ss_hh-1-index; px1 < ss_ww && py1 >= 0; px1 += ss_NT, py1 -= ss_NT) { pix2 = pixels2 + py1 * ss_rs + px1 * 3; // new image row pix3 = pixels3 + py1 * ss_rs + px1 * 3; // output image row cc = 3 * (ss_ww - px1); if (px1 < 0) { pix2 -= 3 * px1; pix3 -= 3* px1; cc += 3 * px1; } if (cc < 1) continue; if (cc > 3 * ss_ww) cc = cc / 2; memcpy(pix3,pix2,cc); // paint new image from px1 to right edge } return 0; } void * ss_turnpage_thread2(void *arg) { using namespace ss_turnpage_names; int index = *((int *) arg); uint8 *pix1, *pix3; int pxS; int px1, py1, px3, py3; float C; for (pxS = pxA+index; pxS < ss_ww; pxS += ss_NT) // point S moves from point A to the right { C = 0.53 * (pxS - pxA) / (ss_ww - pxA); C = C * (pxS - pxA); // loop old image pixels for (px1 = pxS, py1 = ss_hh-1; px1 < ss_ww && py1 >= 0; px1++, py1--) { px3 = px1 - C; // dest pixel = source pixel py3 = py1 - C; // offset in NW direction if (px3 < 0 || px3 > ss_ww-1) continue; if (py3 < 0 || py3 > ss_hh-1) continue; pix1 = pixels1 + py1 * ss_rs + px1 * 3; // source pixel --> dest pixel pix3 = pixels3 + py3 * ss_rs + px3 * 3; memcpy(pix3,pix1,3); } } return 0; } // ------------------------------------------------------------------------------ // French door: old image swings away left and right to reveal new image. namespace ss_frenchdoor_names { PXB *pxbmix; PIXBUF *pixbuf; float R, ww2; uint8 *pixels1, *pixels3; int ww3, ww4, sww; } void ss_frenchdoor() { using namespace ss_frenchdoor_names; #define GPNFD(pix,ww,hh) \ gdk_pixbuf_new_from_data(pix,GDKRGB,0,8,ww,hh,ss_rs,0,0) void * ss_frenchdoor_thread(void *arg); double T0, Te, Tz; ww2 = 0.5 * ss_ww; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te >= Tz) break; // done R = Te / Tz; // 0 ... 1 R = R * R; // start slower pixels1 = ss_pxbold->pixels; // old image pxbmix = PXB_copy(ss_pxbnew); // mixed image <-- background pixels3 = pxbmix->pixels; do_wthreads(ss_frenchdoor_thread,ss_NT); sww = 60; // overpaint stripe ww3 = (1 - R) * ww2 + sww; // left side pixbuf = GPNFD(pixels3,ww3,ss_hh); gdk_cairo_set_source_pixbuf(cr,pixbuf,0,0); cairo_paint(cr); g_object_unref(pixbuf); ww4 = (1 + R) * ww2 - sww; // right side pixbuf = GPNFD(pixels3+ww4*3,ww3+sww,ss_hh); gdk_cairo_set_source_pixbuf(cr,pixbuf,ww4,0); cairo_paint(cr); g_object_unref(pixbuf); PXB_free(pxbmix); zmainloop(); // reduce jitter 26.5 if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } void * ss_frenchdoor_thread(void *arg) { using namespace ss_frenchdoor_names; int index = *((int *) arg); uint8 *pix1, *pix3; int px1, py1, px3, py3, px3L = -1; float F; for (py1 = 4*index; py1 < ss_hh-3; py1 += 4*ss_NT) // 0 >> ss_hh smoother for (px1 = 0; px1 < ww2-1; px1 += 2) // 0 >> ww2 { px3 = (1 - R) * px1; // 0 >> ww2 - X if (px3 == px3L) continue; px3L = px3; F = 0.2 * ss_hh * R * px1 / ww2; // 0 >> max py3 = F + (1.0 * py1 / ss_hh) * (ss_hh - 2 * F); // F >> ss_hh - F pix1 = pixels1 + py1 * ss_rs + px1 * 3; pix3 = pixels3 + py3 * ss_rs + px3 * 3; memcpy(pix3,pix1,6); memcpy(pix3 + ss_rs, pix1 + ss_rs, 6); memcpy(pix3 + 2 * ss_rs, pix1 + 2 * ss_rs, 6); memcpy(pix3 + 3 * ss_rs, pix1 + 3 * ss_rs, 6); } for (py1 = 4*index; py1 < ss_hh-3; py1 += 4*ss_NT) // 0 >> ss_hh for (px1 = ww2; px1 < ss_ww-1; px1 += 2) // ww2 >> ss_ww { px3 = R * ss_ww + (1 - R) * px1; // ww2 + X >> ss_ww if (px3 == px3L) continue; px3L = px3; F = 0.2 * ss_hh * R * (ss_ww - px1) / ww2; // max >> 0 py3 = F + (1.0 * py1 / ss_hh) * (ss_hh - 2 * F); // F >> ss_hh - F pix1 = pixels1 + py1 * ss_rs + px1 * 3; pix3 = pixels3 + py3 * ss_rs + px3 * 3; memcpy(pix3,pix1,6); memcpy(pix3 + ss_rs, pix1 + ss_rs, 6); memcpy(pix3 + 2 * ss_rs, pix1 + 2 * ss_rs, 6); memcpy(pix3 + 3 * ss_rs, pix1 + 3 * ss_rs, 6); } return 0; } // ------------------------------------------------------------------------------ // new image rotates over old image in many radial segments void ss_windmill() { int px, py; int ww2 = ss_ww/2, hh2 = ss_hh/2; float R, Rmax, T1, T2, T; float cosT, sinT; uint8 *pixels1, *pixels3, *pix1, *pix3; double T0, Te, Tz; pixels1 = ss_pxbold->pixels; pixels3 = ss_pxbnew->pixels; Rmax = sqrt(ww2*ww2 + hh2*hh2); // max. line length, center to corner cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done T1 = Te / Tz * PI / 9; for (T2 = 0; T2 < 2*PI; T2 += PI/9) // segments { T = T1 + T2; // segment and step cosT = cosf(T); sinT = sinf(T); for (R = 0; R < Rmax; R++) // radial line from center to edge { px = ww2 + R * cosT; py = hh2 + R * sinT; if (px < 0 || px > ss_ww-3) break; if (py < 0 || py > ss_hh-3) break; pix1 = pixels1 + py * ss_rs + px * 3; // copy new image pixel to old image pix3 = pixels3 + py * ss_rs + px * 3; memcpy(pix1,pix3,9); memcpy(pix1 + ss_rs, pix3 + ss_rs, 9); memcpy(pix1 + 2 * ss_rs, pix3 + 2 * ss_rs, 9); } } gdk_cairo_set_source_pixbuf(cr,ss_pxbold->pixbuf,0,0); cairo_paint(cr); zmainloop(); if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // Old image is increasingly / decreasingly pixelated to reveal new image void ss_pixelize() { PXB *pxbmix; int px, py, px1, py1, px2, py2; int ii, cc, Npix, blocksize; int Rsum, Gsum, Bsum, Ravg, Gavg, Bavg; uint8 *pixels1, *pixels2, *pixels3, *pix3; float F1, F2; double T0, Te, Tz; pxbmix = PXB_copy(ss_pxbnew); pixels1 = ss_pxbold->pixels; pixels2 = ss_pxbnew->pixels; pixels3 = pxbmix->pixels; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done F1 = Te / Tz; // new image part, 0 ... 1 F2 = 1 - F1; // old image part, 1 ... 0 cc = gdk_pixbuf_get_byte_length(pxbmix->pixbuf); // pxbmix = mix of old + new images for (ii = 0; ii < cc; ii++) pixels3[ii] = F1 * pixels2[ii] + F2 * pixels1[ii]; // pxbold + pxbnew >> pxbmix blocksize = 0.05 * ss_ww; if (F1 < 0.5) blocksize = 2 + blocksize * F1; // pixel block size, 2 ... max ... 2 else blocksize = 2 + blocksize * F2; for (py1 = 0; py1 < ss_hh; py1 += blocksize) // loop pixel blocks for (px1 = 0; px1 < ss_ww; px1 += blocksize) { py2 = py1 + blocksize; // block region in image if (py2 > ss_hh) py2 = ss_hh; px2 = px1 + blocksize; if (px2 > ss_ww) px2 = ss_ww; Rsum = Gsum = Bsum = Npix = 0; for (py = py1; py < py2; py++) // loop pixels in pixel block for (px = px1; px < px2; px++) { pix3 = pixels3 + py * ss_rs + px * 3; Rsum += pix3[0]; // sum pixel RGB values Gsum += pix3[1]; Bsum += pix3[2]; Npix++; } Ravg = Rsum / Npix; // mean pixel RGB values for block Gavg = Gsum / Npix; Bavg = Bsum / Npix; for (py = py1; py < py2; py++) // loop pixels in pixel block for (px = px1; px < px2; px++) { pix3 = pixels3 + py * ss_rs + px * 3; pix3[0] = Ravg; // set all pixel RGB values to mean pix3[1] = Gavg; pix3[2] = Bavg; } } gdk_cairo_set_source_pixbuf(cr,pxbmix->pixbuf,0,0); cairo_paint(cr); zmainloop(); if (ss_escape) break; } PXB_free(pxbmix); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // Old image twists 0 >> 360 deg. as new image untwists -360 >> 0 deg. // The old image fades-out as the new image fades-in. namespace ss_twist_names { PXB *PXBmix; int cx, cy; float Told, Tnew; float F1, F2; float *D, *Tp; float Dmax; } void ss_twist() { using namespace ss_twist_names; void * ss_twist_thread(void *arg); int ii, cc, px, py, Dx, Dy; double T0, Te, Tz, R; cx = ss_ww / 2; // image center cy = ss_hh / 2; Dmax = sqrtf(cx * cx + cy * cy); // distance to corner cc = ss_ww * ss_hh; D = (float *) zmalloc(cc * sizeof(float),"ss"); // precalculated factors Tp = (float *) zmalloc(cc * sizeof(float),"ss"); // depending only on px, py for (py = 0; py < ss_hh; py++) // loop all pixels for (px = 0; px < ss_ww; px++) { ii = py * ss_ww + px; Dx = px - cx; // px/py relative to cx/cy Dy = py - cy; D[ii] = Dx * Dx + Dy * Dy; // distance pixel to center if (D[ii] == 0) continue; D[ii] = sqrtf(D[ii]); Tp[ii] = asinf(Dy/D[ii]); // angle of pixel line to center if (Dx < 0) { if (Dy > 0) Tp[ii] = PI - Tp[ii]; else Tp[ii] = - PI - Tp[ii]; } } PXBmix = PXB_copy(ss_pxbold); cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done R = Te / Tz; // 0 ... 1 R = pow(R,1.7); // slow ... fast F1 = R; // new image part, 0 ... 1 F2 = 1 - F1; // old image part, 1 ... 0 Told = 2 * PI * F1; // old image twist 0 ... 360 deg. Tnew = - 2 * PI + Told; // new image twist -360 ... deg. /* Tnew = -Tnew; */ // opposite directions do_wthreads(ss_twist_thread,ss_NT); gdk_cairo_set_source_pixbuf(cr,PXBmix->pixbuf,0,0); cairo_paint(cr); zmainloop(); if (ss_escape) break; } PXB_free(PXBmix); zfree(D); zfree(Tp); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } void * ss_twist_thread(void *arg) { using namespace ss_twist_names; int index = *((int *) arg); int ii, px, py, qx, qy; float DN, Tq, T; uint8 *pixmix, *vpix, pix1[3], pix2[3], pix3[3]; for (py = 2 * index; py < ss_hh-1; py += 2 * ss_NT) // loop all pixels for (px = 0; px < ss_ww-1; px += 2) { ii = py * ss_ww + px; DN = D[ii]/Dmax; // distance from center, 0.0 ... 1.0 T = Told * DN; // old image rotation at distance Tq = Tp[ii] + T; // rotated pixel angle qx = D[ii] * cosf(Tq) + cx; // rotated pixel position qy = D[ii] * sinf(Tq) + cy; if (qx > 0 && qx < ss_ww && qy > 0 && qy < ss_hh) { vpix = PXBpix(ss_pxbold,qx,qy); memcpy(pix1,vpix,3); } else memset(pix1,0,3); T = Tnew * DN; // same for new image Tq = Tp[ii] + T; qx = D[ii] * cosf(Tq) + cx; qy = D[ii] * sinf(Tq) + cy; if (qx > 0 && qx < ss_ww && qy > 0 && qy < ss_hh) { vpix = PXBpix(ss_pxbnew,qx,qy); memcpy(pix2,vpix,3); } else memset(pix2,0,3); pixmix = PXBpix(PXBmix,px,py); // blend the twisted image pix3[0] = F2 * pix1[0] + F1 * pix2[0]; pix3[1] = F2 * pix1[1] + F1 * pix2[1]; pix3[2] = F2 * pix1[2] + F1 * pix2[2]; pixmix[0] = pix3[0]; pixmix[1] = pix3[1]; pixmix[2] = pix3[2]; pixmix[3] = pix3[0]; pixmix[4] = pix3[1]; pixmix[5] = pix3[2]; pixmix += ss_rs; pixmix[0] = pix3[0]; pixmix[1] = pix3[1]; pixmix[2] = pix3[2]; pixmix[3] = pix3[0]; pixmix[4] = pix3[1]; pixmix[5] = pix3[2]; } return 0; } // ------------------------------------------------------------------------------ // X-shaped region opens up from the center to reveal new image void ss_Xopen() { PXB *pxbmix; int xdisp, ydisp; int px1, py1, px2, py2; int pxL, pxH; int ww = ss_ww, hh = ss_hh, rs = ss_rs; int ww2 = ww/2, hh2 = hh/2; uint8 *pixels1, *pixels2; uint8 *pix1, *pix2; float M = 1.0 * hh / ww; double T0, Te, Tz, R; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done R = Te / Tz; // 0 ... 1 R = pow(R,2); // slow ... fast pxbmix = PXB_copy(ss_pxbnew); pixels1 = ss_pxbold->pixels; // old image pixels2 = pxbmix->pixels; // new image + old image overlay ydisp = R * hh2; xdisp = ydisp / M; for (py1 = ydisp; py1 < hh2; py1++) // top triangle { pxL = py1/M; pxH = ww - pxL; for (px1 = pxL; px1 < pxH; px1++) { py2 = py1 - ydisp; px2 = px1; pix1 = pixels1 + py1 * rs + px1 * 3; pix2 = pixels2 + py2 * rs + px2 * 3; memcpy(pix2,pix1,3); } } for (py1 = ydisp; py1 < hh - ydisp; py1++) // right triangle { pxL = ww2 + abs(py1 - hh2)/M; pxH = ww - xdisp; for (px1 = pxL; px1 < pxH; px1++) { py2 = py1; px2 = px1 + xdisp; pix1 = pixels1 + py1 * rs + px1 * 3; pix2 = pixels2 + py2 * rs + px2 * 3; memcpy(pix2,pix1,3); } } for (py1 = hh2; py1 < hh - ydisp; py1++) // bottom triangle { pxL = ww2 - (py1 - hh2)/M; pxH = ww - pxL; for (px1 = pxL; px1 < pxH; px1++) { py2 = py1 + ydisp; px2 = px1; pix1 = pixels1 + py1 * rs + px1 * 3; pix2 = pixels2 + py2 * rs + px2 * 3; memcpy(pix2,pix1,3); } } for (py1 = ydisp; py1 < hh - ydisp; py1++) // left triangle { pxL = xdisp; pxH = ww2 - abs(py1 - hh2)/M; for (px1 = pxL; px1 < pxH; px1++) { py2 = py1; px2 = px1 - xdisp; pix1 = pixels1 + py1 * rs + px1 * 3; pix2 = pixels2 + py2 * rs + px2 * 3; memcpy(pix2,pix1,3); } } gdk_cairo_set_source_pixbuf(cr,pxbmix->pixbuf,0,0); cairo_paint(cr); PXB_free(pxbmix); zmainloop(); if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // new image presses out from center and squishes old image to the edges namespace ss_squishout_names { PXB *pxbout; uint8 *pixold, *pixnew, *pixout; int ww, hh, rs, cx, cy, cmin; float R, Rmax; float *De, *Dp; // edge and pixel distance from center float *Ex, *Ey; // edge coordinates } void ss_squishout() { using namespace ss_squishout_names; void * ss_squishout_thread(void *arg); int px, py, qx, qy, ex, ey; int cc, ii, Q; float M, Ra; double T0, Te, Tz; ww = ss_ww; hh = ss_hh; rs = ss_rs; cx = ww/2; cy = hh/2; Ra = 1.0 * hh/ww; Rmax = sqrtf(cx*cx + cy*cy); // distance (0,0) to corner cmin = cy; if (cx < cy) cmin = cx; pxbout = PXB_copy(ss_pxbold); // output image pixold = ss_pxbold->pixels; // old image pixnew = ss_pxbnew->pixels; // new image pixout = pxbout->pixels; cc = ww * hh * sizeof(float); // allocate distance arrays De = (float *) zmalloc(cc,"ss"); // distance (0,0) to edge Dp = (float *) zmalloc(cc,"ss"); // distance (0,0) to (px,py) Ex = (float *) zmalloc(cc,"ss"); // line (0,0) to (px,py) Ey = (float *) zmalloc(cc,"ss"); // extended to edge (Ex,Ey) for (py = 0; py < hh; py++) // compute distances to center for (px = 0; px < ww; px++) // and to edge for each pixel { qx = px - cx; // convert to center origin qy = py - cy; if (qx == 0) { M = 1000; // qx = 0 >> slope = huge if (qy > 0) Q = 4; else Q = 2; } else M = 1.0 * qy / qx; // slope of line (0,0) to (px,py) Q = 0; ex = ey = 0; if (qx > 0) { // extended line (0,0) to (px,py) if (qy > 0) { // intersects which edge? if (M > Ra) Q = 4; // bottom edge else Q = 1; // right edge } else if (-M > Ra) Q = 2; // top edge else Q = 1; // right edge } else { // bugfix if (qy > 0) { if (-M > Ra) Q = 4; // bottom edge else Q = 3; // left edge } else { if (M > Ra) Q = 2; // top edge else Q = 3; // left edge } } if (Q == 1) { // get edge intersect coordinates ex = ww; ey = cy + M * (ex-cx); } else if (Q == 2) { ey = 0; ex = cx - cy / M; } else if (Q == 3) { ex = 0; ey = cy - cx * M; } else if (Q == 4) { ey = hh; ex = cx + (ey-cy) / M; } ii = ww * py + px; De[ii] = sqrtf((ex-cx)*(ex-cx) + (ey-cy)*(ey-cy)); // distance (0,0) to edge (ex,ey) Dp[ii] = sqrtf(qx*qx + qy*qy); // distance (0,0) to (px,py) Ex[ii] = ex - cx; // line (0.0) to (px,py) Ey[ii] = ey - cy; // extended to edge (ex,ey) } cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done R = Te / Tz; // 0 ... 1 R = pow(R,2); // slow ... fast R = R * Rmax; do_wthreads(ss_squishout_thread,ss_NT); // speedup 25.0 gdk_cairo_set_source_pixbuf(cr,pxbout->pixbuf,0,0); cairo_paint(cr); zmainloop(); if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); zfree(De); zfree(Dp); zfree(Ex); zfree(Ey); PXB_free(pxbout); return; } void * ss_squishout_thread(void *arg) // speedup 25.0 { using namespace ss_squishout_names; int index = *((int *) arg); uint8 *pix1, *pix2; int px, py, qx, qy, vx, vy; int ii; float V; for (py = index; py < hh; py += ss_NT) // loop all image pixels for (px = 0; px < ww-1; px += 2) { ii = ww * py + px; qx = px - cx; // convert to center origin qy = py - cy; if (Dp[ii] < R) // new image from center to R { V = (1.0 - R/Rmax) * (cmin/R) + (R/Rmax); vx = cx + V * qx; vy = cy + V * qy; if (vx < 0 || vx > ww-1) continue; if (vy < 0 || vy > hh-1) continue; pix1 = pixnew + vy * rs + vx * 3; // new image pixel >> output image pix2 = pixout + py * rs + px * 3; memcpy(pix2,pix1,6); } else if (De[ii] > R) // old image from R to edge { V = (Dp[ii] - R) / (De[ii] - R); // source pixel position vx = cx + V * Ex[ii]; vy = cy + V * Ey[ii]; if (vx < 0 || vx > ww-1) continue; if (vy < 0 || vy > hh-1) continue; pix1 = pixold + vy * rs + vx * 3; // old image pixel >> output image pix2 = pixout + py * rs + px * 3; memcpy(pix2,pix1,6); } } return 0; } // ------------------------------------------------------------------------------ // old image disintegrates to reveal new image // pieces detach randomly and fall to the bottom void ss_disintegrate() { PXB *pxbmix; uint8 *pixels1, *pixels2, *pixels3; uint8 *pix1, *pix3; double T0, Te, Tz; int cc, row, col, posn; int tww = ss_ww / 32, thh = ss_hh / 32; // tile width, height float time0[32][32], time, ftime; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); pixels1 = ss_pxbold->pixels; // old image pixels2 = ss_pxbnew->pixels; // new image pxbmix = PXB_copy(ss_pxbold); // mixed image pixels3 = pxbmix->pixels; for (row = 0; row < 32; row++) // initialize tiles for (col = 0; col < 32; col++) time0[row][col] = 0.6 * drandz(); // fall start, time 0 .. 0.6 T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done time = Te / Tz; // 0 .. 1 cc = gdk_pixbuf_get_byte_length(pxbmix->pixbuf); memcpy(pixels3,pixels2,cc); // mixed image = new image for (row = 0; row < 32; row++) // loop all tiles for (col = 0; col < 32; col++) { posn = row * thh; // initial vertical position if (time >= time0[row][col]) { // tile is falling ftime = time - time0[row][col]; // fall time posn += ss_hh * (ftime * ftime / 0.16); // new fall position } if (posn >= ss_hh - thh) continue; // finished falling, no paint pix1 = pixels1 + row * thh * ss_rs + col * tww * 3; // tile position in old image pix3 = pixels3 + posn * ss_rs + col * tww * 3; // tile position in mixed image for (int ii = 0; ii < thh; ii++) { // copy tile from old image memcpy(pix3,pix1,tww*3); // to mixed image pix1 += ss_rs; pix3 += ss_rs; } } gdk_cairo_set_source_pixbuf(cr,pxbmix->pixbuf,0,0); // paint mixed image to window cairo_paint(cr); zmainloop(); if (ss_escape) break; } PXB_free(pxbmix); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // old image is divided into tiles. // tiles rotate in place to reveal new image on flip side. void ss_fliptiles() { int row, col, Nrows = 10, Ncols = 15; // rows and nominal columns int px, py, ww, hh, rw, rh; int nt1, nt2; ch hv; struct tile_t { // tile data int px, py; // position int ww, hh; // size ch hv; // horz or vert flip mode }; tile_t tile1[200], tile2[200]; // Nrows * Ncols + extra nt1 = 0; // tile1 count for (row = 0; row < Nrows; row++) // generate tiles for (col = 0; ; col++) { if (col == 0) px = 0; // first tile in row at left edge else px = px + ww; // else at previous tile + width if (px == ss_ww) break; // row already full, next row ww = ss_ww / Ncols; // nominal tile width rw = 1.5 * drandz() * ww; // random tile width adder if (col == 0) ww += 0.5 * rw; else { px -= 0.5 * rw; ww += rw; } if (px + ww > ss_ww) ww = ss_ww - px; // limit width to image edge if (ss_ww - px - ww < 0.5 * (ss_ww / Ncols)) ww = ss_ww - px; // don't leave narrow remnant py = ss_hh * row / Nrows; // nominal tile top position hh = ss_hh / Nrows; // nominal tile height rh = 1.5 * drandz() * hh; // random tile height adder if (row == 0) hh += 0.5 * rh; // randomize top row tile height else { py -= 0.5 * rh; // randomize tile position and height hh += rh; } if (row == Nrows - 1) hh = ss_hh - py; // bottom row tiles at image edge tile1[nt1].px = px; // add to tile table tile1[nt1].py = py; tile1[nt1].ww = ww; tile1[nt1].hh = hh; if (drandz() < 0.5) hv = 'h'; // half the tiles flip horizontally, else hv = 'v'; // half vertically tile1[nt1].hv = hv; nt1++; } nt2 = 0; // tile2 count for (row = 0; row < Nrows; row++) // generate tiles for (col = 0; ; col++) { if (col == 0) px = 0; // first tile in row at left edge else px = px + ww; // else at previous tile + width if (px == ss_ww) break; // row already full, next row ww = ss_ww / Ncols; // nominal tile width rw = 1.5 * drandz() * ww; // random tile width adder if (col == 0) ww += 0.5 * rw; else { px -= 0.5 * rw; ww += rw; } if (px + ww > ss_ww) ww = ss_ww - px; // limit width to image edge if (ss_ww - px - ww < 0.5 * (ss_ww / Ncols)) ww = ss_ww - px; // don't leave narrow remnant py = ss_hh * row / Nrows; // nominal tile top position hh = ss_hh / Nrows; // nominal tile height rh = 1.5 * drandz() * hh; // random tile height adder if (row == 0) hh += 0.5 * rh; // randomize top row tile height else { py -= 0.5 * rh; // randomize tile position and height hh += rh; } if (row == Nrows - 1) hh = ss_hh - py; // bottom row tiles at image edge tile2[nt2].px = px; // add to tile table tile2[nt2].py = py; tile2[nt2].ww = ww; tile2[nt2].hh = hh; if (drandz() < 0.5) hv = 'h'; // half the tiles flip horizontally, else hv = 'v'; // half vertically tile2[nt2].hv = hv; nt2++; } PXB *pxbmix; uint8 *pixels1, *pixels2, *pixels3; uint8 *pix1, *pix2, *pix3, *p1, *p2, *p3; double T0, Te, Tz; int cc; int px1, py1, px2, py2, px3, py3; float time, shift; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); pixels1 = ss_pxbold->pixels; // old image pixels2 = ss_pxbnew->pixels; // new image pxbmix = PXB_copy(ss_pxbold); // mixed image pixels3 = pxbmix->pixels; T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done time = Te / Tz; // 0 .. 1 cc = gdk_pixbuf_get_byte_length(pxbmix->pixbuf); memset(pixels3,0,cc); // mixed image = black if (time <= 0.45) { shift = 1.0 - 2.22 * time; // 1.0 .. 0.0 for (int ii = 0; ii < nt1; ii++) // loop all tiles { px = tile1[ii].px; // tile position py = tile1[ii].py; ww = tile1[ii].ww; // tile dimensions hh = tile1[ii].hh; hv = tile1[ii].hv; pix1 = pixels1 + py * ss_rs + px * 3; // tile position in old image - input pix2 = pixels2 + py * ss_rs + px * 3; // tile position in new image - input pix3 = pixels3 + py * ss_rs + px * 3; // tile position in mixed image - output if (hv == 'h') // horizontal flip { for (py1 = 0; py1 < hh; py1++) // loop input tile row 0 .. last for (px1 = 0; px1 < ww; px1++) // loop input tile col 0 .. last { py3 = py1; // output tile row = input tile row px3 = time * ww + px1 * shift; // output tile col = input shift, compress p1 = pix1 + py1 * ss_rs + px1 * 3; // input pixel p3 = pix3 + py3 * ss_rs + px3 * 3; // output pixel memcpy(p3,p1,3); } } else /* hv == 'v' */ // vertical flip { for (py1 = 0; py1 < hh; py1++) // loop input tile row 0 .. last for (px1 = 0; px1 < ww; px1++) // loop input tile col 0 .. last { py3 = time * hh + py1 * shift; // output tile row = input shift, compress px3 = px1; // output tile col = input tile col p1 = pix1 + py1 * ss_rs + px1 * 3; // input pixel p3 = pix3 + py3 * ss_rs + px3 * 3; // output pixel memcpy(p3,p1,3); } } } } else if (time <= 0.55) zmainloop(); // 10% black time else /* time > 0.55 */ { shift = (time - 0.55) * 2.22; // 0.0 .. 1.0 if (shift >= 1.0) break; for (int ii = 0; ii < nt2; ii++) // loop all tiles { px = tile2[ii].px; // tile position py = tile2[ii].py; ww = tile2[ii].ww; // tile dimensions hh = tile2[ii].hh; hv = tile2[ii].hv; pix1 = pixels1 + py * ss_rs + px * 3; // tile position in old image - input pix2 = pixels2 + py * ss_rs + px * 3; // tile position in new image - input pix3 = pixels3 + py * ss_rs + px * 3; // tile position in mixed image - output if (hv == 'h') // horizontal flip { for (py2 = 0; py2 < hh; py2++) // loop input tile row 0 .. last for (px2 = 0; px2 < ww; px2++) // loop input tile col 0 .. last { py3 = py2; // output tile row = input tile row px3 = (1 - time) * ww + px2 * shift; // output tile col = input shift, compress p2 = pix2 + py2 * ss_rs + px2 * 3; // input pixel p3 = pix3 + py3 * ss_rs + px3 * 3; // output pixel memcpy(p3,p2,3); } } else /* hv == 'v' */ // vertical flip { for (py2 = 0; py2 < hh; py2++) // loop input tile row 0 .. last for (px2 = 0; px2 < ww; px2++) // loop input tile col 0 .. last { py3 = (1 - time) * hh + py2 * shift; // output tile row = input shift, compress px3 = px2; // output tile col = input tile col p2 = pix2 + py2 * ss_rs + px2 * 3; // input pixel p3 = pix3 + py3 * ss_rs + px3 * 3; // output pixel memcpy(p3,p2,3); } } } } gdk_cairo_set_source_pixbuf(cr,pxbmix->pixbuf,0,0); // paint mixed image to window cairo_paint(cr); zmainloop(); if (ss_escape) break; } PXB_free(pxbmix); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // new image moves in as bars from the left and right, interleaved // (visually not very appealing) /*** ________________________ |______| --> ______| |______ <-- |______| new image bars move in from left and right |______| --> ______| to cover the old image | <-- |______| | etc... | |________________________| ***/ void ss_interleave() { PIXBUF *pixbuf; int Nbars = 20, bar, barww, barhh; int px, py; double T0, Te, Tz; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) { Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done barww = ss_ww * Te / Tz; // bar length, 0 ... ss_ww if (barww < 2) barww = 2; barhh = ss_hh / Nbars; // bar height, fixed for (bar = 0; bar < Nbars; bar += 2) // even bars from left side { px = ss_ww - barww; py = bar * barhh; pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbnew->pixbuf,px,py,barww,barhh); gdk_cairo_set_source_pixbuf(cr,pixbuf,0,py); cairo_paint(cr); g_object_unref(pixbuf); } for (bar = 1; bar < Nbars; bar += 2) // odd bars from right side { px = 0; py = bar * barhh; pixbuf = gdk_pixbuf_new_subpixbuf(ss_pxbnew->pixbuf,px,py,barww,barhh); gdk_cairo_set_source_pixbuf(cr,pixbuf,ss_ww - barww, py); cairo_paint(cr); g_object_unref(pixbuf); } zmainloop(); if (ss_escape) break; } gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // old image explodes away in pieces revealing new image // pieces detach randomly and race to the edge void ss_explode() { #define NT 30 // tile rows and cols - even number PXB *pxbmix; uint8 *pixels1, *pixels2, *pixels3; uint8 *pix1, *pix3; double T0, Te, Tz; int cc, row, col; float posx, posy; int tww = ss_ww / NT, thh = ss_hh / NT; // tile width, height int offw, offh, lenw, lenh; float rg, cg, F; float rgoal[NT][NT], cgoal[NT][NT]; // tile final position at edge float time; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); pixels1 = ss_pxbold->pixels; // old image pixels2 = ss_pxbnew->pixels; // new image pxbmix = PXB_copy(ss_pxbold); // mixed image pixels3 = pxbmix->pixels; for (row = 0; row < NT; row++) // initialize tile goals for (col = 0; col < NT; col++) { cg = col + 0.5 - NT/2; // tile center offset from image center rg = row + 0.5 - NT/2; F = sqrtf(rg*rg + cg*cg); // tile distance from center F = 0.8 * NT / F; // goal distance from center cg = F * cg + NT/2; // col goal rg = F * rg + NT/2; // row goal cg *= (1 + drandz() * 0.4); rg *= (1 + drandz() * 0.4); rgoal[row][col] = rg; // tile end positions off image edge cgoal[row][col] = cg; } T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) // loop transition time 0..Tz { cc = gdk_pixbuf_get_byte_length(pxbmix->pixbuf); memcpy(pixels3,pixels2,cc); // mixed image = new image Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done time = Te / Tz; // relative transition time 0..1 time = pow(time,1.7); // slow .. fast for (row = 0; row < NT; row++) // loop all tiles for (col = 0; col < NT; col++) { rg = rgoal[row][col]; // tile end position 0..NT cg = cgoal[row][col]; posx = time * cg + (1-time) * col; // position at this time 0..NT posy = time * rg + (1-time) * row; posx = posx * tww; // tile x position 0..ss_ww posy = posy * thh; // tile y position 0..ss_hh offw = offh = 0; // tile part beyond image edge lenw = tww; // tile width to copy lenh = thh; // tile height to copy if (posx < 0) { // tile off left image edge offw = -posx; // offset lenw = lenw - offw; // width to copy } else if (posx + lenw > ss_ww) // tile off right image edge lenw = ss_ww - posx; // width to copy if (lenw < 2) continue; if (posy < 0) { // tile off top image edge offh = - posy; // offset lenh = lenh - offh; // height to copy } else if (posy + lenh > ss_hh) // tile off bottom image edge lenh = ss_hh - posy; // heigh to copy if (lenh < 2) continue; pix1 = pixels1 + row * thh * ss_rs + col * tww * 3; // tile position in old image pix3 = pixels3 + int(posy) * ss_rs + int(posx) * 3; // tile position in mixed image pix1 += offh * ss_rs + offw * 3; // adjust for offsets pix3 += offh * ss_rs + offw * 3; for (int ii = 0; ii < lenh; ii++) { // copy tile from old image memcpy(pix3, pix1, lenw * 3); // to mixed image pix1 += ss_rs; pix3 += ss_rs; } } gdk_cairo_set_source_pixbuf(cr,pxbmix->pixbuf,0,0); // paint mixed image to window cairo_paint(cr); zmainloop(); if (ss_escape) break; } PXB_free(pxbmix); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ // new image pieces flow inward from the periphery, covering the old image // implode code is almost the same as explode, with time going backwards void ss_implode() { #define NT 30 // tile rows and cols - even number PXB *pxbmix; uint8 *pixels1, *pixels2, *pixels3; uint8 *pix2, *pix3; double T0, Te, Tz; int cc, row, col; float posx, posy; int tww = ss_ww / NT, thh = ss_hh / NT; // tile width, height int offw, offh, lenw, lenh; float rg, cg, F; float rgoal[NT][NT], cgoal[NT][NT]; // tile final position at edge float time; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); pixels1 = ss_pxbold->pixels; // old image pixels2 = ss_pxbnew->pixels; // new image pxbmix = PXB_copy(ss_pxbold); // mixed image pixels3 = pxbmix->pixels; for (row = 0; row < NT; row++) // initialize tile goals for (col = 0; col < NT; col++) { cg = col + 0.5 - NT/2; // tile center offset from image center rg = row + 0.5 - NT/2; F = sqrtf(rg*rg + cg*cg); // tile distance from center F = 0.8 * NT / F; // goal distance from center cg = F * cg + NT/2; // col goal rg = F * rg + NT/2; // row goal cg *= (1 + drandz() * 0.4); rg *= (1 + drandz() * 0.4); rgoal[row][col] = rg; // tile end positions off image edge cgoal[row][col] = cg; } T0 = get_seconds(); // transition start time Tz = ss_trantime; // transition time (goal) while (true) // loop transition time 0..Tz { cc = gdk_pixbuf_get_byte_length(pxbmix->pixbuf); memcpy(pixels3,pixels1,cc); // mixed image = old image Te = get_seconds() - T0; // elapsed transition time if (Te > Tz) break; // done Te = Tz -Te; // time goes backwards time = Te / Tz; // relative transition time 0..1 time = pow(time,1.7); // slow .. fast for (row = 0; row < NT; row++) // loop all tiles for (col = 0; col < NT; col++) { rg = rgoal[row][col]; // tile end position 0..NT cg = cgoal[row][col]; posx = time * cg + (1-time) * col; // position at this time 0..NT posy = time * rg + (1-time) * row; posx = posx * tww; // tile x position 0..ss_ww posy = posy * thh; // tile y position 0..ss_hh offw = offh = 0; // tile part beyond image edge lenw = tww; // tile width to copy lenh = thh; // tile height to copy if (posx < 0) { // tile off left image edge offw = -posx; // offset lenw = lenw - offw; // width to copy } else if (posx + lenw > ss_ww) // tile off right image edge lenw = ss_ww - posx; // width to copy if (lenw < 2) continue; if (posy < 0) { // tile off top image edge offh = - posy; // offset lenh = lenh - offh; // height to copy } else if (posy + lenh > ss_hh) // tile off bottom image edge lenh = ss_hh - posy; // heigh to copy if (lenh < 2) continue; pix2 = pixels2 + row * thh * ss_rs + col * tww * 3; // tile position in new image pix3 = pixels3 + int(posy) * ss_rs + int(posx) * 3; // tile position in mixed image pix2 += offh * ss_rs + offw * 3; // adjust for offsets pix3 += offh * ss_rs + offw * 3; for (int ii = 0; ii < lenh; ii++) { // copy tile from new image memcpy(pix3, pix2, lenw * 3); // to mixed image pix2 += ss_rs; pix3 += ss_rs; } } gdk_cairo_set_source_pixbuf(cr,pxbmix->pixbuf,0,0); // paint mixed image to window cairo_paint(cr); zmainloop(); if (ss_escape) break; } PXB_free(pxbmix); gdk_cairo_set_source_pixbuf(cr,ss_pxbnew->pixbuf,0,0); // final image cairo_paint(cr); draw_context_destroy(draw_context); return; } // ------------------------------------------------------------------------------ namespace ss_zoom_names { PXB *pxb1 = 0, *pxb2 = 0, *pxb3 = 0; int ww1, hh1, ww1a, hh1a, ww2, hh2; int cropw, croph, margw, margh, dm; float R1, R2, zoomnow; int orgx1, orgy1, orgx2, orgy2; int zcx1, zcy1, zcx2, zcy2; pthread_t tid; } // initialize for image zoom out or zoom in // prepare 1x image, cropped or with added margins for window width/height ratio void ss_zoom_setup(ch *file) { using namespace ss_zoom_names; if (pxb1) PXB_free(pxb1); pxb1 = PXB_load(file,1); // load 1x image file if (! pxb1) return; PXB_subalpha(pxb1); // strip alpha channel if present ww1 = pxb1->ww; // image dimensions, 1x hh1 = pxb1->hh; zcx1 = ww1 * 0.01 * ss_zoomlocx; // zoom center location zcy1 = hh1 * 0.01 * ss_zoomlocy; cropw = croph = 0; // image crop sizes margw = margh = 0; // added margin sizes R1 = 1.0 * ww1 / hh1; // image width/height ratio R2 = 1.0 * ss_ww / ss_hh; // window width/height ratio if (fabsf(R1-R2) / R2 < 0.01 * ss_cliplimit) // difference < clip limits { if (R1 > R2) { hh1a = hh1; // crop image width ww1a = R2 * hh1; } else { ww1a = ww1; // crop image height hh1a = ww1 / R2; } cropw = (ww1-ww1a)/2; // width reduction, left and right croph = (hh1-hh1a)/2; // height reduction, top and bottom pxb2 = PXB_subpxb(pxb1,cropw,croph,ww1a,hh1a); // final 1x image, cropped PXB_free(pxb1); // to have ratio ss_ww/ss_hh pxb1 = pxb2; pxb2 = 0; zcx1 -= cropw; // adjust zoom center for crop zcy1 -= croph; } else // difference > clip limits { if (R1 > R2) { ww1a = ww1; // add height margins hh1a = ww1 / R2; } else { hh1a = hh1; // add width margins ww1a = R2 * hh1; } margw = (ww1a - ww1) / 2; // margin adds, left and right margh = (hh1a - hh1) / 2; // margin adds, top and bottom pxb2 = PXB_make(ww1a,hh1a,3); // final 1x image, with margins PXB_copy_area(pxb1,0,0,ww1,hh1,pxb2,margw,margh); // to have ratio ss_ww/ss_hh PXB_free(pxb1); pxb1 = pxb2; pxb2 = 0; zcx1 += margw; // adjust zoom center for margins zcy1 += margh; } ww1 = ww1a; // new 1x image size hh1 = hh1a; // image area to show for zoom = 1x ww2 = ww1 / ss_zoomsize; // image area to show for zoom = max. hh2 = hh1 / ss_zoomsize; orgx2 = zcx1 - ww2 / 2; // image origin at max. zoom orgy2 = zcy1 - hh2 / 2; // and zoom center at image center if (ww2 <= ww1 - 2 * margw) { // adjust to avoid margin overlap if (orgx2 < margw) orgx2 = margw; if (orgx2 + ww2 > ww1 - margw) orgx2 = ww1 - margw - ww2; } else { // too big, show even margins dm = ww2 - (ww1 - 2 * margw); orgx2 = margw - dm / 2; } if (hh2 <= hh1 - 2 * margh) { // adjust to avoid margin overlap if (orgy2 < margh) orgy2 = margh; if (orgy2 + hh2 > hh1 - margh) orgy2 = hh1 - margh - hh2; } else { // too big, show even margins dm = hh2 - (hh1 - 2 * margh); orgy2 = margh - dm / 2; } zcx1 = orgx2 + ww2 / 2; // adjusted zoom center zcy1 = orgy2 + hh2 / 2; return; } // start thread to perform image resize to target zoom size void ss_zoom_start(float zoom) { using namespace ss_zoom_names; void * ss_zoom_thread(void *); zoomnow = zoom; tid = start_Jthread(ss_zoom_thread,null); return; } void * ss_zoom_thread(void *) { using namespace ss_zoom_names; float F; ww2 = ww1 / zoomnow; // image size to show at zoom size hh2 = hh1 / zoomnow; F = 0; if (ss_zoomsize > 1) // F = 0 >> 1 F = (zoomnow - 1) / (ss_zoomsize - 1); // for zoom = 1x >> zoomsize zcx2 = ww1/2 + F * (zcx1 - ww1/2); // image center moves from zcy2 = hh1/2 + F * (zcy1 - hh1/2); // image midpoint >> zoom center orgx2 = zcx2 - ww2/2; // compute image area around if (orgx2 < 0) orgx2 = 0; // image center if (orgx2 + ww2 > ww1) orgx2 = ww1 - ww2; orgy2 = zcy2 - hh2/2; if (orgy2 < 0) orgy2 = 0; if (orgy2 + hh2 > hh1) orgy2 = hh1 - hh2; pxb2 = PXB_subpxb(pxb1,orgx2,orgy2,ww2,hh2); // resize to window pxb3 = PXB_rescale_fast(pxb2,ss_ww,ss_hh); PXB_free(pxb2); pxb2 = pxb3; pxb3 = 0; return 0; } // wait for thread completion and return zoomed image PXB * ss_zoom_wait() { using namespace ss_zoom_names; wait_Jthread(tid); return pxb2; } // slowly zoom-in on the image (Ken Burns effect) void ss_zoomin() { PXB *Zpxb; double T0, Te, Tz, zoom; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); ss_zoom_setup(ss_newfile); // initialize for new image ss_zoom_start(1.0); // start making initial zoom image T0 = get_seconds(); // zoom start time Tz = ss_zoomtime; // zoom time (goal) while (true) { Zpxb = ss_zoom_wait(); // wait for zoom image ready Te = get_seconds() - T0; // elapsed zoom time if (Te > Tz) break; // done if (ss_escape) break; zoom = 1 + (ss_zoomsize - 1) * Te / Tz; // 1.0 ... zoom size ss_zoom_start(zoom); // start making next zoom image gdk_cairo_set_source_pixbuf(cr,Zpxb->pixbuf,0,0); // paint image cairo_paint(cr); PXB_free(Zpxb); zmainloop(); // reduce jitter 26.5 } PXB_free(Zpxb); // discard last ss_zoom_start(ss_zoomsize); // last image, full zoom size Zpxb = ss_zoom_wait(); gdk_cairo_set_source_pixbuf(cr,Zpxb->pixbuf,0,0); // paint cairo_paint(cr); draw_context_destroy(draw_context); PXB_free(ss_pxbnew); // retain final zoomed image ss_pxbnew = Zpxb; // for next transition return; } // slowly zoom-out from initial image center point void ss_zoomout() { PXB *Zpxb; double T0, Te, Tz, zoom; cairo_t *cr = draw_context_create(Fgdkwin,draw_context); ss_zoom_setup(ss_newfile); // initialize for new image ss_zoom_start(ss_zoomsize); // start making initial zoom image T0 = get_seconds(); // zoom start time Tz = ss_zoomtime; // zoom time (goal) while (true) { Zpxb = ss_zoom_wait(); // wait for zoomed image ready Te = get_seconds() - T0; // elapsed zoom time if (Te > Tz) break; // done if (ss_escape) break; zoom = ss_zoomsize + (1 - ss_zoomsize) * Te / Tz; // zoom size ... 1.0 ss_zoom_start(zoom); // start making next zoom image gdk_cairo_set_source_pixbuf(cr,Zpxb->pixbuf,0,0); // paint cairo_paint(cr); PXB_free(Zpxb); zmainloop(); // reduce jitter 26.5 } PXB_free(Zpxb); // discard last ss_zoom_start(1.0); // last image, size = 1 Zpxb = ss_zoom_wait(); gdk_cairo_set_source_pixbuf(cr,Zpxb->pixbuf,0,0); // paint cairo_paint(cr); draw_context_destroy(draw_context); PXB_free(ss_pxbnew); // retain final zoomed image ss_pxbnew = Zpxb; // for next transition return; } fotocx/man/0000775000175000017500000000000015247006660011603 5ustar micomicofotocx/man/fotocx.man0000664000175000017500000003033515247006660013606 0ustar micomico.TH Fotocx 1 2026-09-01 "Linux" "Fotocx man page" .B NAME Fotocx - photo/image editor and collection manager .B SHORT DESCRIPTION Organize and manage a large image collection. Edit and optimize photos and other images, add special effects, edit metadata, search images, create a photomontage, perform batch operations. Fotocx is a GTK GUI application. The included user manual explains Fotocx operation in great detail. .B LONG DESCRIPTION Image folders can be viewed as a scrolling gallery of thumbnail images. Navigation through folders and subfolders is simple and fast. Click on a thumbnail for a full window view of the image. The image can be zoomed, panned and scrolled using the mouse. Gallery thumbnails can be zoomed small to huge. Popup windows can be used to view or compare multiple images at any scale. Thumbnail galleries are also used to display image search results and albums. Albums are selected images arranged in a desired order. Fotocx has many editing tools that go beyond the basics. Images with severe problems (underexposed, false colors, blurred, uneven lighting, fog/haze) can be brought back to life. Details lost in shadows or haze can be brought out. Images with distorted perspective (esp. wide-angle photos) can be corrected. Fotocx is standards compliant. Nothing done by Fotocx makes your images less usable with other applications. Fotocx uses your image files wherever they are: they are not moved or duplicated. Fotocx does create an index for fast image searching, and thumbnail images for fast gallery displays. These typically add 2% to overall storage requirements. Fotocx does not use SQL or other database tools. Fotocx can import RAW images and perform all processing in deep color (24 bits per color is used internally). Edited images can be saved as JPEG (8 bits/color), TIFF (8/16), PNG (8/16), or JXL (16). Convert single RAW files or selected batches (select thumbnails from gallery pages). Image edit functions are interactive with rapid visual feedback, using the full image or a chosen zoom-in area. Undo and Redo can be applied serially to all the edits of an image. Intermediate and final results can be saved as new files or as versions of the input file (e.g. filename.v02.jpg). Objects or areas within an image can be selected and edited separately from the background. Areas can be selected using several methods: drag the mouse to select and flood into matching tones, follow feature edges, or outline an area freehand. Complex feature edges, such as hair or foliage, can be accurately selected. Selected areas can be copied and pasted into the same or other images, resized, rotated, or otherwise edited. Layers are not used. Each edit stage can be saved separately as a file version. These can be re-used to make new versions. You can create a new version using selected parts from different prior versions. An image location can be "mouse painted" onto the same or other image being edited - paint from any source location to any destination location, with simultaneous rescale if wanted. Batch functions are available to copy, move, rename, resize, upright, convert format, convert RAW files, and add or revise metadata. Several tools are available to change size and shape: crop, resize (rescale), rotate, fix perspective, curve/warp the whole image or selected areas within the image. There is a special tool to 'flatten' photos of curved surfaces, e.g. a page from a thick book or a poster on a round column. Text can be added to an image. Any font and size can be used, any color, any angle. The text can have variable transparency, an outline, a shadow, or an embossed effect - good for a signature or copyright. Other basic markups are available: lines, arrows, box, oval/circle. Advanced editing functions: Dust spots from old slides or photos can be removed, roadside trash or power lines can be erased. Panoramas can be made by stitching photos together seamlessly, automatically matching brightness and color. Photos with a range of exposure values can be combined into an HDR image with adjustable contributions. Photos with varying focus depths can be combined into an image that is sharp over the combined range. Photos of one scene taken at different moments can be combined to remove passing autos or tourists. Multiple photos made under low light conditions can be combined to reduce noise. Photos made with a hand-held camera can be combined and aligned together with high accuracy, as long as the camera is not moved too much. Images and text can be combined in a mashup (montage), using the mouse to position and resize the components and adjust overlaps and transparencies. Fotocx has a batch scripting tool to speed the processing of multiple images requiring the same edits: record the edits made to a base image and then apply these edits automatically to any number of selected images. Many special effects ('filters') are available to convert a photo into a line drawing, sketch, painting, embossing, cartoon, dithered image, mosaic, or abstract distortions (shphere, tiny planet, others). Background patterns and textures can be added. Images can be rapidly searched using folder/file names or partial names, dates, assigned keywords, ratings, locations, and any other metadata stored in the image. Some data is automatic from the camera (date, location, exposure data), and other data can be manually entered (keywords, descriptions ...). Search criteria can be used in combination; e.g. find Chicago photos for years 2008-2020 containing keywords 'barbara' or 'barbie' or 'barb*'. Locations (from a camera GPS sensor or entered manually) can also be searched. List image counts by country and/or location and/or date range. Click on a report line for a gallery of images. List metadata tag values and corresponding image counts for any tag name. Click on a report line for a gallery of images. An internet map is available, scalable from street to continent level. Images having location data show as markers on these maps. Click on a marker to get a gallery of corresponding images. You can jump from a given photo to its map location, where you can find other photos from the same or nearby locations. You can add location and geocoordinates to an image by clicking on the map. Albums can be made using selected images from your collection. The files are not duplicated. Select images by clicking gallery thumbnails. Arrange the images with drag and drop. Albums can be made into slide shows. Choose animated transitions between images, pan and zoom effects, and places to pause for narration. Fotocx includes a comprehensive user guide that also serves as interactive help: press F1 while using any function in Fotocx. You should take the time to read the overview pages. Function details can be viewed as needed. Fotocx is easy to use but unconventional, so RTFM to avoid frustration. .B CAPABILITIES LIST • Organize and manage a large photo/image collection (up to 1 million images on a strong PC). • Comprehensive user guide (many languages) and context help via F1 key. • Thumbnail browser/navigator with variable thumb size and metadata view. • Click thumbnail for full-size view, image zoom in/out and pan/scroll. • RAW file conversion, single or batch, output 8 or 16 bits per color. • Large set of functions to edit, repair, refine, and transform images. • Internal processing in 24 bits per color (float), output 8 or 16 bits. • Edit common image types: JPG, PNG, TIF, JXL, WEBP, HEIC, JP2, others. • Edited files have a version number, originals are retained by default. • Fast edit visual feedback using the full image or selected zoom-in area. • Undo/Redo button - compare original/edited versions (instant replace). • Compare original/edited images with split-screen and movable boundary. • Conventional edit functions: rotate, upright, crop, rescale, add margins, retouch: brightness/color/contrast/saturation/temperature/white balance, markup: text (decorative features)/lines/arrows/boxes/circles/ellipses, edit RGB colors, convert B&W/color/negative/positive/sepia. • Repair functions: sharpen, blur selected areas, denoise, defog, red eyes, smart erase (remove spoilers), remove halos, suppress JPEG artifacts, anti-alias (suppress jaggies), remove dust spots, fix color fringes. • Refine functions: flatten the brightness histogram (enhance detail), increase local contrast (enhance detail), match colors to master image, add soft focus, suppress fine details, amplify existing contrast, global and local retinex, brightness ramp, add/remove vignette (curve edit). • Special effect conversions: sketch, outlines, cartoon, emboss, painting, fusion, tiles, texture, pattern, dither, engrave, mosaic, shift colors, add noise (hide color bands), set no. colors per RGB, alien colors. • Warp image: unbend (wide-angle photos, panoramas), warp selected area, fix perspective (photo from an angle), warp image (linear/curved/affine), unwarp closeup (fix balloon face), add waves, twist image, make sphere, turn inside-out, tiny planet, escher spiral, flatten curved horizon, flatten photo of curved surface (thick book page, poster on a column). • Edit functions can be 'painted' locally and gradually, using the mouse. • Copy areas within and across images by mouse painting and blending. • Create or maintain transparent image areas while editing. • Combine images: HDR (combine bright/dark images, adjust contributions), HDF (combine different focus depths), stack/layer combinations by area, panorama (2-6 images), make an array or matrix of many images. • Mashup: arrange images and text in an arbitrary layout using the mouse. (objects can be resized, rotated, overlapped with transparent areas ...) • Custom user menu: collect frequently used functions into one menu. • Plugins: use Gimp, Imagemagick ... as embedded Fotocx edit functions. • Scripts: record image edits, package as an edit function to re-use. • Select image objects or areas to edit separately from the background: outline by hand, follow feature edges, 'flood' into matching colors ... • Complex feature edges can be accurately selected (e.g. hair, foliage). • Batch tools: rename, resize, convert, export, add/revise/report metadata, convert RAW files, add overlay text, apply custom edit script. • Metadata edit and report keywords, titles, dates, geotags ... any metadata. • Search images using any metadata and folder/file names or partial names: dates, keywords, locations, ratings, titles, descriptions ... any metadata. • Search can include original or edited versions of targeted search images. • List image counts by location and date range, click line for image gallery. • List metadata tag values and corresponding image counts for a given tag name, click line item for image gallery. • Show an image calendar, click on year or month for a gallery of images. • View scalable world internet map. Click on a marker for a gallery of images. • Add location names and geocoordinates to an image by clicking on a map. • View 360 degree panorama image (Google Street View format). • Show video files as thumbnails, click to play video with chosen app. • Bookmarks: assign names to folder/file locations, go to name (gallery). • Create albums with chosen images arranged by drag & drop. No duplication. • Slide show: show album images with animated transitions and pan/zoom. • Print an image at any scale. Printer color calibration tool is available. • Custom keyboard shortcuts can be assigned to chosen functions. • Cycle wallpaper images from a Fotocx album or any folder of image files. • Source and binary packages are installable on most recent Linux flavors. • GUI and user guide translations for 15 languages (AI generated). .B SEE ALSO The user guide is available from the menu Help > user guide The home page for Fotocx is at https://kornelix.net .B AUTHORS Written by Mike Cornelison fotocx/images/0000775000175000017500000000000015247006660012275 5ustar micomicofotocx/images/inside-out1.png0000664000175000017500000005113015247006660015144 0ustar micomicoPNG  IHDR䆗tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 163 224 1 0 [ :eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:224 height:163|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:202 height:147|9( IDATx]eXU־s=0@P ;-Q)iFaqν|c GGt<ӵ{Yks9"[[zTUUO||20amm0򷐐@osA$eaa0 e`8@2kb"??KsQQJKK?Var rٕ䃲Y]-7&BFFӑ}~cԀaqrD+ONN'ǀne0x1(m{[/K #"b201maʄ#erY0agdlQm ,PJ BS[m\\ 'C^i;?F`g;@"~eX6`ϷWPef@4̀4Kse1@)%a>n:~{ܽ[7[wEz~}"29Qg^^+'7A[^(4JII6. # FmfYAeBŞ3Fdǖ/ޞ|ffm(Z=E|1zt=aUwTKY^Vo{9p) {<H***PQAS!,%_B,cIq"VN7>TԼ+ßU PGRL򂳳s˗xտ# eZ1c`EXX֭[Aq>iUp.ւ4 ''YhU\B_ wlY> Z ۧtn=zc()+ƳOOsjPAKEr228#G gQP spV 9iIHJBYs(neSZ G0k*BJR jZ1i6~FjNid[0?|_ᑞD9SA7;4O/<455' 0aG\pд47] ([JG@;={@WW+'>>瀻o>>ij}@)ۣ48T0c?+f1@_~$ 9yf'1`-_`ʤ}TT"Hk7)or<2^=s]18(7O.턢t_i`bcMQf,,mv\EE)Rm`4o[>=[Veը.ɂ ~g(LkH# 46ct I|Sa&PKoiMh&8w1o<077GlllueڬJ-,Y8yY jPBQ^KGBGI,+Y TW фY9!$& vJ1ZU^Mo n ѩHk0T[#W#<=/p fS%GVSXzZLC RX kA  `HJĠaD6F1.GDT,r\ ?FaBdtD1f6p`ҥڵ+֬Yi&,N Iim@vi,#/ !o|b Ks9I q3' D.H6J \m]eEZfs #ѧ :lo~JPTLK~ ^\(xzh2k0^@Knnten6~ 0L0F\[zIIIAVVQ֭[y6i*ߒ)qcmAhhfCSsJ͍{XRQ *BM,0R{?EGF r 2`y6m!pM3QsYh{0>8Љ&ؿtdae{7!4 յEX?u0`$6Le6}3¤pmaOby1ma<kg@AVJ8z t~i*@ZF+El|8\ e2L]4*,4Tu ]ר-Mh՛IL+ jsZ{#&-t |%''7+Mge(leȚ)6by4d{￰5+q ?}X("c4?9ӧo߾"flEnM\o@C }R>e/0JOzVyA%KWA=|ɬ@bA=iфw{ %-9iaؼܘ^\T'4MF^+?6eŻc!@\***'D/(9 ^ G?# g1oN EktT%ӯc(@Y"ӯ9g\sڄh9 Fpʝ ŴHx&E0G6JyÇc0=saq̘c„:}5dͣO0gX.3KW8_Há0L̜1ÌYsfE &18s=Ι)`i0>CN{HXįy|V,Xt5LO]x%ڈ@'ڰfN\s/ļKu"[wX:&Mq'b x(,_62$m}%8ff0,Qf߳f(PDFl&,}ag,V.+OT.ShRi3o (m {sD(e 0l0-116Eyq>}@``۫:^Z(@($~m} ^CxocZ ^CxѶ[fRNx ғ'Oa(BUm #1 1(@U=˭FzBGWԉկIIHBUmgfd+&w&]@O*%ϕ0ߵsoDLiŹ8c1ن/NL6rS\7=Ԋ77 4[+ۉ.46^}`nd5qbal% jQ[SM 3@(4a&ª_@yEY=g CP'Qf56m܅WWu5n@C,JWWu a:̆_d"X':;իWclݸKLHψÃa01YB;JI8n+-5p jPM߾.隙D7|_";'4mTƶ3W8 Jjg%8m"ʒt ?Gt"Ҋ41x< Cn^.r2vq#U`RBu2XS j e ? CaMI$22 D309<ʣڤ]Ѡ# \ 򔛄S :l$h* p zISn)g'cq/bʅ%!m3rBG^NNb.N=o@K/ AE` UUbp@DžOqс t$*>wNpF/f9"4ե'l;Jj? ;\*WLr&Bhh3 '/Q6@E^ _2GKxz A @_`"5l|^xl”uO~ MBF\ur]=oHs* [VN 3`֗gJh :RY 1`4VLD`a?@X3?f>,ʫ^. ӫO[k 8CW޾}WǷHXy&*Ix:z&[C[1\Te*# 2/ITFk] gu5D+j"CM'5./ Rp̿yIf8F_W\1p>Iqd$p-7;!'j;νf^C]7,:M>X:;"BG^ Nu{=/^gC@aNSYܥ _gFO@Qu-Fuǐ)sqI4M)Шg@84<[^AO h(eY2̉ AB+,@=`;BSVk>-* #HHM%]^CX\6 ÖN ̷A QRNB$ Ш!شlh ٣;zI 4%*(_" UD*L23D}&V '@aUxS/eGȢ\8`2cEx·&݇:8^%޸OȊ|#eN$ ^^ע8#綣/bÁSDȭ7Ϩ}9mѐҲr(pEF8~bډ6iPQ d9a8{%$ʏ]߾yM#Ԗ!h+Uʬ@f-aH&lj'G}L-Sr^/V'>וz>ۜm!( '/Q,d5)\𖛣ԯm(S7DbkNs}U~}0d>y2Wv6UrvcDŸJ^"kӻH"R\l4^{B_mPP z\>F# Lؾ2t%PT#/=7L"^a?+Qe9(BQ~m/vVRZ41`d.Než;P4*wQ3o[9ęXv=-#ٱXÃ.j.  - sM?:T(U2g ( ga]g \J*jh[ws {S['ۇ0;v˵xJ\qMQO7i Z 3g rq9~6(Ti~Ξ<}{rn/8f͢k=SCp4Ց Wo#h,Au9"q aPއۖ\8@V<p뒰X9Qlʮ*͇ aX$ޓg)^% U{׌;֖CXQhzэjbi2-990Ѡ@a^w`ܗ s:a.{az~ǤfpnO8jvqE%ٵY?07&VV:xGK?cȕw:g5of2ԥO]ХkWtK>e#QQ޶XMBB&`y18;N]O6[?/О|䑹)9~=֗%2 41t<򅗻vn0</ۥ9*,% !͞M ulb#Rk^ǶW@D~4aׯ^q@a`ioJ%wnl{^/^NBq)ab4d\]\tv B6Vptq'2 KpRғb贙\]]Byo9+J &I˱&kls8;#*%ht&?+^'↺}ߪ;C-;:HGMlhoK)U4*³S !o(9rX%G 8@jXS353 ѭz8SOnj9 8޳9z ƎA'T1s%i; zl1wP^{&0x^:t^<;);Ĥ"0PÞStDC v8s2ifZ jgNi  S{t4Ӛ!p&N2V2SFKui2m r6BA7Na^w-H5P"Gt򰪦変==by*ByJRz)EJLǂ}']DY^™tv_V<"uC m.vuDB:m #V8 <\8ֿot4HOKƽ[W2ȟK_Dux_6ee(Ced3֮)#8s Y K&&Jx^X:`C\y=N,.c3+)w];uؾAݡ?k37I$9,oFs1~+A e{h6dVT`P-,9a$lxРD̖Jdpi6egaG '|<8O׿I;w&yby)gq3qQ%G[h@L@Q3GЁ]A8k:괷5X0}(LἂV'h n}Z}p!(F ($Da D6+ӰztDT1b.!P<NyVFEStR;{l.͙:}%Bܪr{upm(:&ܴ&o۹laV9Am.ۉ //=C ) K^2ijc?l\ [}-1u(~x) Ni̔[/"e7 nJgx|E޾_PxX削%ۜѴ ț20d=r{=cl:߽,`iԔdT>((PDB]S]ʥM9Yʦ|HlqRt߷~[@{ 5!uZJ-9w^< AeQPSQX;4l„əPTT{Qg}i@$zOZ'( g즐E>%Ysǡ[oi"tMy^ӊSs騯+9#bXi/wq|1mĸ3֨=R[vAGR}Q0\{i~=[0Nl4<=mu%i9%}tO-nHDy}RtXcr`ܬ@l^1OϞ=!QT)>޶71b*ۈIGoP#]\˯ Ą";ŎrG_WJ7ye\=-ueHPHJcܜb4TOLKN'yطy)d:KJdQUT|P cWތy۱Yޞio{>^GƇ6 ǟ{&(L9 }ҽ!>]}+7y(5qRC@q8F =<]8{`5z TRX^Dmv J:Y!!;Ú<:[Od_I,v 49m)tVJsx%|PƁqE@ajhҔCjJ9Ty?޾ _?bp&NnOO8fP+79DXa=- ٫'&,݁l Ϲ?ð%<&mŨR;XYSʜqm,k=2;P_ Ơ M-,ʡ2Vm חisqmLEhi+G KllLխ+hpki`574AY%1r4,$y\뼘:7ۯͽ$])Jd\݊+KȀN(2rbW(_-fy$*kq{? M=\ `I _ 1yb $=%-3d0N@PZ6J{RDDR%<9\][O8~OS_7AQ<>q%eD WaH1] PXg"z ' (o#'MP~x zj0BiNfs4ʛX/Zgb ߥ 3"lVSw.voUemX]$ UhE4:"N.nƵV~+"F;k.Ɯ‘ 2v$4ŭkrߚ /o8wn)idWFFs]SLX]7C~j4j@GWiR(CeIj>~G6pzфJTLCE8W\_|zS m~ HI /AW'6\2Z[pvxبv(Xi̵_U]xhv~"ho։܂㣨N;VㅫMerhBG[ Z| JJc #Z$I\ I5Օa^Ϲ0t["T7UeH]pP #/ÑhEqDR /8(Q-($K$!Zԑ5((9614fvj&DssZEU iI#.aNB--*pvuZNnrٕ?  F\jS۔ꚓA&H02rY>ɻ9i@j_tl<Bonj,BP(fRD.?ap0Y째slS2vΔͽZh,#3C@iA7+[8c-nr|]wې; %e wPD_Zs(̷Cx?;((=Z ^Cx?;I¶){Y~t%4'[EjK)v7l|tٟ3b $Avȭv@@a2>?~@A QP""` .#5T~\4GUSY6eiW' oę~t|1b̔ 0U AD)(\3ӹ{_3̓xG eǦEeW((,ăE~"4W$8edzyDȹ&.4ɉyVMQ  &U0 J' K9gݗEYW\LѻHQNnE" !ѝ"Ց|DT!^6K|xXg+s=v3jلF5J' IDAT!VdZ¾=bزu+=pԈݛs}{q j*C{w)s$A@y6eEp=q;of;`v~aѨ$C}_εױ{)B3sF 5 Fi4R4-;B!8m)ES}L> 21 w!Ҙ:˫voA|jx\Ša#0yT1***:aYS h 0ոm*JHR(A;RG(z _i9,q/"Xxt}e >aXbZc(=ȫi];sAOٽe=,ea2aHbh:ˆp]ψ+j<92=)sviC{x ͬdj_P['ґ^DnZp\ {`dA Ve9#2|0c@ #AB,3( G?s\ OFۥA]M j00n(%3)]ajD>nB8xh`o24|Op@9zR"UQK$ iOBL+Tr@x"5 RDBEYEǸFa$uU1gЏ"!J'@aޮM1x<W:JXfzyT*?f⎓7b=rXUSYCu,=EѴ('av fO7z]C_ǩk3p)iBq(xpw@)|v(_HaaAP]{{SH0OYɑ?TSEn *#FRRP49minu>Be" Z *?ex~{)t$mwcAs߉LJ~c@aĵ9L<<.]%Y WNOF^t#t`|iRPِN QMCnkI-A<ɋ%׫`δ0U )`z$W PaMEK/:(Frr%^F %͘^"4FMe2fc7I GϏ*C"y( SW@4+rby4ÿ!V:{N޺Jg٣{Ōs7-,2=A%]ϞS`ĉ8i"&uˇ;-}YPyH3]nj>ޘ?"hTBpD%EC{r$b W-H̛?CNi%,1r 3w0bEFq$ީXo"34(rb{BԔS4ճEh(EB WJ.%QW!yDk]Uj`V$܇m) Z̜ 5 Eivg),O0xӫj'VrŖg Tƨisp-Ú"ڳa4/b#EczJXxYE$eLr h ϐ_RByWpaK(8kA$>6PU@W2"768;-aggpL7^Hqe<+ wLa{(&\IВVтGN>WVD;5P  z H+blj ppqn_G ÂJk`ˑSpp~?<ŕ.;xL}aPK${]xs& 7UhHa–SH)nW1r !ЖF%pL&,?QJ yeb2ԵbcHȤJau*J2f>˥ݻ}@{#±7;;ވO@y9i2=ٽxE 1<d??Oj_`PߕJm@&ex| *IX{Ʈ%[rDeqp1ǃz7֏<~aDeӴ yܻôg@JԚFB0sbe T1$<4PXն -ĸF(<>iϑiA,]SA,e7ܬ 4hNJ'J *^̭sWs_YI!r cTK2KhL>*Cy<%?7Gŝ0 y9YxIgQ4s'J!/3;δӤṂC)*"̎p!&BE25y1F\6tu)+`$#pwqhJin((LpIĎzv5J6VjSp#A #`EDw--^fF_g&mL]Lßkk+N ܸL`xbߵg LcQe4W[7M503x}<(iTXtXML:com.adobe.xmp 1 2 3 0 0 192 294 1 0 H:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:294 height:192|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:265 height:173| IDATxgTU6||};78cEL$AA 94怢b(s9suzA3۵}8gUOWW׮OZMM JKKQRR<<‡ԿUWWL3<^{yx ~44?oEEE(((@~~>WBWY;i`m ̮-3}=RmiN l~vgDFFrDDD#Fq?gQ $~` [KKs3U0Be>Dfi1>C? l[xs7ZX|>Z?`i +m;sQ\G׎AkG=йK7NY8YTGu 8ÇǀOĤ5Oh([KLPV4~7'Qc 0m $ZP$J}f}v(((ɓ]N8i>TAQƀZTx9ՙ2 eVQl)HqjGw0ѣ5k֬Yٳgرc`ŧez>5` @ct| iDEi.ȁ Cx51dL\vxvr G 7 5Ҁ]NnAu$'aCDG30% 1x2Gd4n7Z % є~ H0D 65fF&VlW+kJa ^@q nRZ_kW@18^D u 5x;&O!Xw*br$H w404i i0{TK@ ۍ!JXw+d(jF]kj̶hDxx8`Ċ+0g:uۊħBB!+L ĥ]1HJϟŁ+1aV:JjZ8P&N{܏@>N*H#1 1B^2d Od$$쿎ʿ$Iܻwzzz"˺uD?M"**3R***HJJFk.&!sm$J.>1aX:`H{cqy 964VO@"e%H \ 9xLCS 4"; ot# "Hh񐍓/juf N~5ix:p5FF#GDPPgekoh/Fs QRx'9_ JÕaGb=d8b852LN !NE qm{Mž1nصi+< ?Z q;%96U=c.I%itskDP٘@;UD[OU3q @>`~D=[tG偽kbD?4 OÓQPsGgϞ/WE(˅9TW"os't҅8%sJ8@N^)(+] x߾ԩ-wpG} )#bcai33޵T=הRpbm om=$DpkQa: UeEp#,*KG1R g7_Ɲ^ kb?6Kq*>\.3 },MӴ́DMU9>Cwwo]!UЯ7T",#I@ i$߃`NL5 z`aq#!4 K(Wӡ&]:cۭ(ND-i)/n~ݡ5utgŦ-0^CiKdYӧbE>q4 ƷPMT]^DBٯ0IG C)`*#Ck\Drג<<+z &ax QNuFfukWA{(,5<"b2~u ʐ> fNPYhl9|:p_<Ƃ=p'OC1~YA:_0PiK1V]rǑEjo< +vq-ػo/OI3s~AZ0 6,))NWbTN{%ʞ%ԧ>Xr.\3Yxbݱh.$$0~l̛7ښX8bQ-pA,5ˠ ` !ѳ3TtbŶ=0|Lp oj]KǣkBwܸV~HMKEBk:vC=о #(h:COi FN]vAH܋ Q.:+/CFRդ:qèĆcٔRa ̼HeM92tx[WN5 QS7d#3# qёNH|(OIZg Rh| >Jw^|65DАS.(@)N_[[H;hIK9$ *Ub8Q~ybJ9k"6-+#)>11B{SG`q L% [g='LyES.b0\ ԧ2`9A1m.]1 HNJDd8HaI )xh$[ |I`NUǺAɎA/76GbF6,,CsАrȨś*\݂2e>+GY)2b)xGS0 D\ Y&@s,ԑ2#Ƣ8̿(M]mI􂔜:5H v]ysIo9me t` 45 ''E9n?2[h%11YyUO3P6_x0lUzS'KOIP+w7j A G #KպC1ar$BWwy4J=ѝ ֯ÐSZߨM5d%[C$ᅥFMHXvgB,H*HyCۛb88>R.*ו[f k]Ie`| 娮#G:VM+@Jm6$ZDP۬O"8m>kU8tTd >|" ESclHi,@\NUk`ºvX@I\IF}pY["^^$^WӉU.D K5pmfCGM‹YbD2_}w ؄c?H0f}W IQG!+.5`Ac2t{+TW=c!عz =# Fۖ exN1{Fsa~͂SPg$#1U`uH l]< Exq!/kO l9qQh>W!_ =9X7q |G)yUPg7O@.bbb\>i5~԰[힐0{/b=щRi9A(^KRԷ$ ZmUFa8}⣾C^8#HҔhӷ8zPJt>N[sOԠG}н[Ȏqz|rR}8hpYp6;ǿ1pȐF4C]0\90JA\ZWdz]Lx ]@؞OxI.b={WnS% <1C俟?? H0m!v3wE- B#fi 2ګ_JЫK7LpUB&L #?@"$z&1~Z1?_I8 AH'c&/c !8Gx3Dc#H&q-2E@r[?㿿3ѻ[W0í$aLm ZJuq{RJ'u1ىq !l"s9tkMM.ocqVVH\"" n$m$jv~\MLG{؈P9ކ*2#`S1~6Ar {i${{UXʲ"D{>q,i5y=lJa,:- s(9/j!' v |ZBޒH[@dIM ۀp".˧2p嗠4? Cid8Ʀ)RBax~W'@^sW~ns 9SmNĠ`56+OH'5U}$\z0q^v$Y[v"ӳ4DI09 N&8~ס#mu#d1N%6>X:{"$qůa+xݰs?nL xНOjkʱq w>)(/2)ibe2x *4^/@I^5lYj$X韸 Ae1쟞; ~9762bvpN_pk5ýtz)N(| [b0-/݀ރL;s։Fcz9&~f͛7c+1Mu%8}*?:jHU)cnrOAʖSG9WsKG`R:=h6ٽ!I-ɵ`7n?} :4 ns>!l>Y?? {׏\qEXoNb' IDATN5]#(=1<Ȍĩci&kH?o'Q[(h8r \iSAsI1 (NƓp$f{XTz63 ~L#268gN(%>g#;ND_]O{]wÇo: wºEpNc BRTUd} U@ [Ab H̵Hz*Zapff1(b6J^RKo?WNϲRoVjMkNOo :CFEM g=BKۿ6H'S[MSGB|H ,[֯ĺ߆>,tY|\)Wo p R\q/@^{wt)ۍEA@F_}(qo g6W~VeEJ9|4P8f 'de)r(mx4e'5Q7um$(1w0B)i- ^bU (Z,%ep }[{1X;N8PcpҒMX=8|> c5EHNNFZFA4=#l,lϗN.$ -?|K]ON6 AY2i,s 8}1&=Y,L؜] YM=X_dǐ&QT[γP(7Frjur\8ړ[Ƣ^lM s$"+=/9%-`So*h"CPc#a̬@""QGz=_~>XCJv>vͩP1i07 SoDR 1^Hԑf'@Ai$YGhK,ooqbdG_+Dypqx oOSEtlDCTdh \D6p,d~K IX<3bC򖗇 ޑ&4Tk_J6CU$fA4}v#ԲZQpѣ?^3V32 5EP:󷮃m\x;ؖm-XZJCW梯 x%щI%ή$Oۍ?_BIӃzy’Tȁ9Qg%#6ltk$j(4Jk֝6qYhpJګߕ`J:#q>a*IӍAd<$¼̰zZxN..$FQL̂Pao_D&ADcs*1>MsljIaǞ IUg} Au.b8;;M?k(JfI!i o)\~Cj\3b]ܞ$Pj׏*/CG}Я_?HIJP^ \xhb.´сVF>6Axڗբ>YZHv/C|9 s3Ʀt7C "7'dt> tr()Y[rUZ$:J-XL%lt^[Cv .K8aT"hK8P*n8{0Mk@\ @QrH 5瑔˖_eتcQB>z3;!{e?FŗޯHL3RIvABag`^O&[E,i1QC؋:ڕ $:,w4a <4My `^uE4^'gY?7&ߧh̉ٙ\lN>cszsAಈ ^P8/ 0˯}OJl(?g~癰eۦe8 „?՚ fo?{Mvg4 yixt>FF8x ^0kz֜<{fŽ~ޚ6U.]ݏ EdiMn )߷`%:6Ŧ1=*BGWc1TZ:0wx#߷VvBAQ` &-M4 mӢ}ΩHOг~ z^YxnVN+ѳ/+޵|581M] (H.Nō G~^UHTŒ򁲐sϘ"~5U/ŔKp&5 π1bf,*\X\;Oeeesאόxr#2=Bڑ$ 1 JJ;.?@v>v18t˗2a RʳTDR9JhGȃL[AB=ν`^Ycpitkw).Iyu<5z3ȏ+]g\7oP 3SLw o?R$Y8 za: ;OzS75 a%1+XZؠ!nj@feS&M,(+ O>NPDuI8/N#$ʫJj0X: ć!}(uM<~)DT8얋:.4X TW+G*i+,T:laIy M9^4qJ녽(OMǘX$@)h` sWqufrR|SbЅm9l "(Ca^OT'j<եذBzKpx QIcOm.yX`2]?rD<&%W*H;طXsE\I=HP ,bIs`$JꃏN Jc`y~c;~wgdA2= 1u $q$R47Xj3| 䠨lx~j=zvE2^=>598{h=)jそr(6)v1d>W0J|%H0_[ʝY -. (7olcBM; QbiiDzm{`vP]p+W#W³+G5"## `E.x3VOl_!<>nͭڵ;>uD\|)zqu|Cg\Ij7̟>5r** T^(nh) u,\[[]Y'{[8;/aS4o#$O+6(ҐSP  2rՠ47OPVӀФΑcpc)ëеӿp;8AxSB\XW !0)>#cG@JV'c]KJ2aq<ƍQ MmMTQ\Z'0|@/l~s|4G2 hje{',ߙr3OMhsOHHOlI~) + ?^;"2{YgYYZi\ؼDr=t_ 阓Antti4!^T%닝¢ȩ٩qpPN^,ةųG4F#K>r@z#{#1 ?֎ x͂D{g*6StkrfHG)`oFsٛ]!Rwe %| cU,.7" ^y <8)U3*LHKh XǠA LH n&78w(]:%m F!1yAъ\Y"2~> DRRbI @SU: x$@ ~%ᵉ{ QS5b# )$>dvx)HFؼy6mތO#Av; ODϮ]0~jlظu,+΅˧8og7o{; + @V5aŦHϛ:TU Gfzv-8v "S)k#Xs 2P15($Iy9LIA( ps&$= OB_J3crX:JrОv>a([gwGb_,._B /#<-yI8nSgŞqpNCiA&]u9Ih[npb={># -WbiŴV[&2rqѪ-P|7R&Eб&’^=핵B>~gY;;Kr,H,8mRgMh+`ƚ]H(,oo+`rh!S+$!B={`㱋ȡ|a!#ˁ(ؓG@G#6>lP<ĄRXr+5kUhq d.%- u5X7M2#u`  4])Ş#b(vBL$_ X 1ցm7ZZX`{[+$rn~޾oIvP_zCj $֌(o&b<]@DJFCCػ@GxQ-I( +A]q6rDaˊPC! N:AeTEciT}QU I1J Jm-jS?FsC7:C) kZX>rE)r2ɞ`Aa#A2h-) $BHsu|->62x1TIHCs!), MV,XJ(aϻ0, Hi AN4UsceBCVԴa|.x<Cq"Q?p9@D}?ֿ$3Щswz 11VzK.%-;i^N1e6 +[&-vÛR8<3 V?__OKrL`Bov =GCj&nx0G/iu7$I0$Mb{M"@iWCPG@x0Vƕ GXKA4ceY ?KHU6gچHFFfRSSޗ4$f[fdlmzp47DU򟐏DKK^n6.mvDD)& PPF6B:A _] g۴yYm}}s%%#59fC'_BQ//`~Yy/ DlJ8~)QLIHg(.@a&o t梌 u(h/CH"H}RĶO0~zR8cxK%mU,(ISFh} ̙JiP/h܏;3ić*㦥#c_cÒ)icYؙt#rc1cH m`htwĬ;GϞ1n;AVC$bp`1Sļku;yP~R2^c8 SP%+az̙9#Gj;~e8)O̿i,#ZE.&A+󱰷}A{w\EDj'Ν8+OPZ^Ѱ"T셍'i?E޹cv؉c3(W@^<ؾ}w|Eucv6܃{8ud?N_J]Dtkcvi >^\t4jv>h"A'`nqI$I ( (/EWǿ eHp$ g}$z}ٗ6>n/"<,KԞƃmFUgE\l4ir/n?13waJǤ̸ /,I`!j}A6%h2J#%9 >p$@xekCW{6?Ԍ.me|=e"hR𙸘(8ځ=cx O ؇l4\F=IDATH_Rdc}|Jt$j!Av;^S袂|YR6XRv, Jn#BE2+,ѭ r(OG-фyy yM!#-=jJْ>PQ ۅ򩲱} swZJ<\Qyh Tr/P\T@ކA`vwQV6&F+M6C~ >$ˢ閏v V( ?T)}C+AT廎xGX2m0EXt"h|!4657$)OˮB8QLnTH|11abFQQ i߳n6@?EG~D{$1HX<}>')/]T quSB;]w[xЁB`h|eL-n߂0C޽njO7UdޛAyk;+WX\=M8~MDT=H|B?{`.ٻg.^Wp?? 6pQg7ЈmxhXg*4Xoz6޽'j@O,u'"r3oݰn<锔q $1AUH ǩ}롬 9eUOI!%)m=\zhJ<Sv NFje&@j zz]L II)Sb y&V}u"faq  ~!D1`Yhl /.`EZ-V?w{Zj#1)b%d ζE.$z AG޲t<8`&C#>>p6ǬQ2B B@WX o1Oo4$G-!T2n5z:ebć;7#..ED5| ikgA,j=D`@’m7sRLb-Lu QL]gSb R{qp#4FBNV0:{03tpֻh0Ql4:<#?9ND?C)(BNNZ@†m7J q hZD҄jɐ(T!,ĺaf#?CE-HҩZFai=h'ҹ.w,@ןI(TɈL 1_h/s̝# //jz bR2Ӿv-m| ZD;y%S 4з.V71]o O4ҝ(.(rc̞2 PP)s㥇/*8ͪ6R@66pABJbJT&c7\(2Z^R28n X ϺEЫw?[ ú!W M)L)),ٲN0p ܴO ǁ [۷׹K 7DIy1=b$,=pqI AjNׯ&5 5ZQZ:A]nwXٕL./f`f/Cde{a?X$B/F16v$ݭ?KxIA(|{G7cn=zWr:u`+琒OV2Mߝ2~:nY;#<kLD!JA%vXOȪ'p~̞: n>AnQ1AwO VP8r?4U0De<pzh-ǐ=ԐPJL+p!ib*]Wk!<Y(qE:X{ j)4\ $lEn m T~܋[+c^st@yxdU<ʆ4 %( cis/<"Β#PPYY~4\I(.sZJNJDJRo] :8/پ+q̷ѳ v71Vi<{2Vʒ9L#Dto9x栶ok0_[*z*?X#6  @GUSDm)ϊ#6,ЇmϔF( ]U47N@2.WmBc" ڣTP'7F_?k zcz /OOx[9 %$ӎv Q_ rbJyv/҄Rj&*zڊ$E,A5^SM$==*2oů@MEij9OQkfM 6}:X119#g AvY ^4rj&K+sGH*͆ @#]b]>DW#R2dXz 9QvXxt>l9!>6[m٪[UEGSq)4 L*0]]FpxL,q9}EKtx>d9b@=x8fΞɓ?a۩{H Ns8 қ]yMG=H<by\=HLml. G2BfX2B#yȧص{-o/h"1$H"X=:EH5#a,,sbu:JJPEu$a$e H4 /A IX6y$&W8*߯,KK6RZ"9Mbis!3Tb&>4 Ab<:u8J'4Ԏ|zY- 9yy*X/o8Jf ͧ -h{w($Hq QV~0vTqMv![ہ8. pY-@!lAcAC@œc2dadeh0DPB$UCaD* SuGc5Ϗ}O1c x<+xr6R7ӛ^n-JǡW~̞>GbedoCey,ԤAy"D!7+6Ob,Tg 9zKD)NAp!%x~O߂O nQh I@:u=³$DF}[2fY  $I7\^}n*Tϓq1O0= hQREIi)Jvôc' c( //}ϗlCQ>iqr$n']7څfڎ򷏠{l *+>A>ݣb-+ۃo,HsH0ރ&w[V~+Ɯ\lyS.֮߀GݡM%UyO?4159sSbƬҀ^ ˵_[r7<yyشՄßD0iQUyތ (ݻ^N 蚍lo8qOAm`hVΚJ_NAh< ^o H5"|)zjѾӁ6+V\O-\5+,EV|htw<)s"w6/[_?:fvNs<|i D ՔFp :tT'yS} 0A]oVlYyXNl{mId)pᬷr߫m> H!ICuk^1V=]WU FhJ$Ӗ{ Y1 -++QW"Iz;$$A|͢Uz\Vv FS#-"STvc<]R4cF´ncM1A"Awb=^] k3A+Mdr Hڌ+4;d@+ݤMߣ-R="ݻ*以It#Sm C53t٘rCFZY3iQT ?KJ! "nppgHmD47HH} v[%>I|Hz2?42w?#)3]%%`zYg7_\aiw%%my&d8դϿ*ו^ȫ(PP-]n$$(6IL#evOl%&ŝH32ӗIUԫL4d"7Z .f&^E%}5@"ABUq}8}k) $5r/Ec3X@eHmm ܵɉ ,IENDB`fotocx/images/mosaic1.png0000664000175000017500000006041215247006660014342 0ustar micomicoPNG  IHDRZtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 171 275 1 0 t):eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:275 height:171|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:248 height:154|Q IDATxxUɲ6|3g܉!$n !  x8tΎI&Yǜ_;nƼ Mat {idږCKf MOOP:n6f&>r<[̘ :9! +"nهf@cjS&X[6 ԿXijϧIX2Քѷ4d)CYSwFxR'1≼/03Eu>I-6}1~ ?ݖv&5?/ CU@{jg6>z5z ?xP_jiƟc~ ?[sަ|ג59,lє{Y<  gl]< }% ..~ JPЀ|?Y!|›l1gP=%4`n)AiUUu 4YZjZ;/i)J#Oxr? ,'<1&nLTxop"4ҰX7fAOK ݋"#9E 36#q]\Ǐ "ALD0^ٳxv.HH]eeOXsk[x#Nf# XWyl3$Z 8;gxvΈO"#ZE҄\[(**BQab!ttb~~.b¹^<FH}n'[<Іl <г޸R=| mdn\oKf!$v6=z [WIL@Mq5g&z mmm+tB +V7̼oZY  Cۛ-0p_ptt7lyUC<Od6S#%e5ns3)vhdBR\ w@]MA^vX`*4dЧW/IJC^u64z2&Ѕ֙б/ء:w`0n:rt AFFdIt?c"}|Wx^#.9X~7?$6i9lk>4bH+*AQf,-a@(CwQmBWM}%!!% 5]YaqL!; Gv,SN3ɩHMMйC{thߞB{890T1s!4ŅYpxbٓFBMA:vOn+5υ@a3]X] O<Lj.LZ?pYjXf qa؅c^peOG1Ђ֜BtvQ Klqɂ9{&ttm7L 0}9ѧ"ݶAO0zxY[WφzǸE{ET~Z4s!.\'⒭ qy"Uݡ2o͞j G+_CI}/@ C {6aHhNrJ>inE`2FofrqtLHABDfi"/]{`Ɔc--- &O[-۷a)RY[GWp0,Y /Ѱ9#GzRC0a&#1ԅx^P? S0҈Cǚ?flRɅW좴YC 2VWKzt!** .]ɓ1eѣ"ژx~nXKLp+LMl<9)!!#]G2HFzì!P3Ž/Ġg1}$+b ѿD~JMSFήbץ AZN=P2A!8,~Нy<q$Ȍ䡤:glk!4 =\ۉj0ZWP-yȪO#Yq/`}eU1} L5=M> '#2<dQX@z 199ix:pMAVr0ONSWCύO ñSEDՅ$NH|dZk1{sޘ3A4}baBoժU@3@ Y+s6lxAn2-fc[:!1-^((+^-O~ 'ﻪ>Ou/58ބH ӿ n6ؾ~%ϙMl * 'nON-e q )}cU0o",Z8L_V'1FGkMp9UԅX2< C8_ߎĐ' }yT#LnHU"f S 􆍇٢58z!3PF/+)Bo]P` #W| d_^3 2Л}2!X]Fg[S7il{n;9\gkeI ^ Nj7D*=Ddsd tzvBgq@bf 0PQ"S_ c8p d5뀑f%'0XSR`}jCIIG/h 8:"zِXF()b>a0 [wS7y?c4zQy($߀1⚚tЙ[`嗄*=q;<P`S|<ΩFS .) /X7Jh/[T0f$LX=uZӸh`SF?5cXEɪ<0{3Ͼ4Əv6v4dÆe"?iaϞ=ŋ[Qٳ? (ߏ iGiО]0Jk@CFuS.x&d:8j780Gtt r+ aw&$ax읈(:51֌|KFCJ?_{̲J҂e(i4źO_h#=^bifqmAfZ4gqBAZNB( 3t*ɈU1SGOñ% ӹ"R*8vҒ@2%Vh"Box8~>οLATl-wcmشOgC]N#yDkc^t`YfLL c39H{õnHƼGj1/zhh(`۸q#%uf3A, 5Q˒LˈYMj:0!ν~bKK@wDxViL(Upν\e_8H^9 9.ޅ3n_;9f+[8c9O^ vYU\ '6Dۏ=g#N]Ć5p!Eٱ3Sr$W@\+q_~=-!/nUiH ƽDpyݻABA .#!G0PI:qg{y5N^¥QE=:t&2+h] f]+•K0DKv4p5 a7Awoh 6/`䄧7QJBfŗjGOI܃|ܢ7Z2gUp2ɴYmC$+ft~/Jmg4Q < P`vú7FfՆlm.8~6ț(1sobF;uA?jNΨt?aͻH#皐( }amyJEztN o G\i'N={pR#%%nK6~5[fAF7:uD ùȲ axcEDỏ?jgIط\,[WAt(Kȣ=1혏nxWDum7sM)в 1[L/d ,ܿ =z-&IzSgvN- 5[BB=J* 4E7/.)$pM#v9BitFIs,7: FD KqڥM&oЉ(P5,QfL ְΦݘ\>lRLf.ƀMδ[2GˀilJس-¾1]vS59{ш {a] <ucXVQ{@Vf^V't,^+K賠TMo`ux 8p,rk͝2un/nbUpKyFlnVvzx&qg&CC!0>[Nً#" 7v<֮^ {z(‹GXf-^x1ս_VRǗbJAݤ~_Vēkaϴ Nu~n/J_cĉ00@ڣSO L_MXҒ03+92}@}8Q_!{-+Ѯ VG^ eLǰEk&(;ODg ܳsͅMխE|xh>:wUR\#RZ^R8&BA^1Kik}"NDz0"ZwoT>|șoTS\(BLL:N\FVA d8?1e=TbznZ~=o(TQγ 醖B n)*~/WBXF&볰_(7OcբX4{:Θɦ3pcFLٍ#?m2/@}VYFilґ!+2hL&ΆkJňJbDePxD fsL֩1p4^"pB~ZYW IAn؍*y]Hdz\fBq d}ia0w:l":ψ2)oT Zt9ƴXp +^$f1JL1;ίCiy;@CK#s)uv \b_A^4d(癁N|c_QT^ 6н/<޾MUl^N;J,GrtXҚyh|.sQgCⵟ!޼EJг;n&D7x>}CJZI/t襅gc 8ԕ,ܺ__x5Q &) d7߽>OPWGi~z,v ,X82})8% )_pbB1BLb|n/tD&ls/pn]{,JoPUmJ#ؼl:JCx  ćyahu7MVCLlrzA:7aЁ|_Zq 0acg3YFuQ@-}egaw8Nc*ųYT0//O02 (=x{9@E8e:n(Ң\<}|}1d x:s'IP3f[Q8=&- MCz #/+#,̌tP[n;szi]~zt șs8w=4 = I(#pb2)P0/^d~ :ڷ)>>IF_L^Y`≔m?ׯQUiK g|uh" p}27Ht/J֕P 5WH-{_"1r~<49qڇ$/1xC *7̦49FE5J҂qfh  5RnP{b=$pcgxVޢ|V)t8Gz* k7n;o22Kp {`H'!ŵSK5&zQ"  Ls@Bm0.{W/(K1gz/5 ?O!LZf 29I6X=\IĐ{2{v4\cVKH9{Q] s¡S2!ˑ4tdq=%CY$ HTI9Ϯ9z[[W 9z21`tpu 4t/L?eRS/#0fj6+qcd%p5:Fi ]?îX+$ Q%z IDATNH0}-$LiUQXd6= qlmlXml_:rd?roV WۛP+e"6FTE2a 0`"G3 4oI8>5G20?oYGӖzctҫQ^֘<?Nd3 s6Tg SV"2&Bfė:dxo1Hjݗd};_#gC*Xv>^ޥxh͍%ܡS 3Kn6v~ sn+-URnՓS~577-+ǩϧvWvAIJ'CjniFήÙ+@_s!֍,?ߐA8r^fk{cO>bM1- TE~p~ig0PeSybLS!FdNpLip\@[혓Ď䀫5"oO?CZE?nbn = <WLDp]'hYwBWqeFLɮk-Ycэr/u蝹,i`g(qo4~( ת`DŽ̯ߟjJŦ&Tg>!gQVVfuB&o8K9l Ifh2gnDTr&9pj4i`~1i*l{bi"JswptRvc1@sO!7x A;IQZ@#<3VN򌛭?hr }9 yхN6Mwxo-މlJd]'l ^D[-c7ߚ^zth]{W238~y=R#\pPH)PTQ$6,Yc]kLPn_{ٱ<׸6Х}O`f6ndDnj N҄)*$QSHK9-=`mIr=Fgʳ`I|,@wY\w ,5t`cxĕwJ%'nvv8m@MB;E~Dg hkkCUEF:4+! dn 2qVh@EC c <2S=rG(Leww{l/"Y Xc F iYF)!0zT:&Vm;#1zw)šv,,eFbD,wE/$r J[/M ro N\_ |v3*~AAt@vˁ\puq+8; )5фu6f.Hk2$ErǴ` DJͯ8JtTd( Th ,*9\^ <S$zՓOHt% o??:oZP_xϮҵ~nbr8v.ye??uYYϥ=zTC1ieޑ!-1pwuzsRDAtvgC_\L qc9E ݝ,,W,nBrg& x2b yƄ70#C)$WBZ Um_.=zAv tڕ%P$?~,8)vyE"7j-$22oL\JLY"SS(kg3}W3}xC$q%Yvz%߾4%I{; B}_bǎ|ν}p6AܤICi35,<8[8ѧ5iܶ2N⇱{_ܿc$d9IFNnK-!j Ǔ '{ LjZtjJ=MeKhK4n.H 祻x! ueLoBuȨB)a㹻8z<(*,{&JPÃH ,õ;,' 9ehkA^~/63&mUp~gBho}iDed(ͅ9W1Jzl)_!"aEC r2Xt, 9г.Fi Sxݡw;aEnNOtq&oHZ auR:cYۯ2AZ6l8 e$H9g[ |T_ tzw-:𰺈L{1a5-^"CEY "^Xj%w$|C#PFo1LǑ}WXk+LY+rSQ7,R)^\wr1w9;B"4*kM_<Ԕ"x$֕@2Eb>o6BYe,5K74MQKl(i+S 0H8 БԃOLFG"<"9y5=YWE@G^䴐FiĬŠo\ԄxjeomD؋Xf6!)OUE1,^Ӹ_S(ůñwQB, 0%%Ez[0xU b)y5>T@MkK!8ZS^X?g$BIE9s#>+-+-S Ny''1'pw-oh @n/ѻS{Ԯ#)Xw/J0ءC{ފz: u]vhJ|(lїT&a( ʈp;Rx肰 \8b~[,.RX\XӇ(g[]xoTeS~hݱch pv ޡНeD'Ӹ@\S (=NXj+-N%l<_ޤҶ"-OF*95*xػfS^W)Y!i-旙 D}"x'[b yl9–ip!Rv2io pHeiLQ СcRj&Dp >@RQ:3xyz8u! 0F_}4P\wu#I=N* >ip-MK%RNND1 rr}-c,D܇Nj e% PR7{PCamEm}~W\*zcѵedR7U<{83MWDFEq/DGŸ Da^2<\]HQYcccAG޺NBkq6"cbC[BYZ}! ip:<#{qQ~7={񡞘5\ c/Es`hߡ;<ɓ.geq$z ^oJ\S=1~8JJtd=po-}bX=bB##ΝDq鞣.b0g2ܾ gRqi,<@ YVC놹c KsL4ł `jb ==CnIi\?x. p:G&z)jKŁqC3ؽO=퐑[, LǯGbƍX~=lێg/sGZsplۺ֭q8Mu{7MdSFGc5XCN]@PT< e\ؗسsғqA\u dJH8[!"#r}aFSPD9NaÆ 48x$X>Jݓj.AB6mڌC'U$o8y dp}#ZNJ?Lmh?yR"sMeKugAɘ0-̎GV\ߕѾxe,~g C;D֛l-%&/>\<,{ *mϪ%.KMc>{LcU3G:${XA`||y Aan,n_/L®U3MkkhMե5;$`[ؚA$=(S8i&fJ?yx՘21>+UhF(gtXZ6cZ<.ES$C)Cjn&PI(36Z ,;'*auCT?(Kq7?DKGFKQ  p^ 8\8bbx#B[.l,:84wsђqhH`ѲԮHM.zIvF*͙Fom0܅޽f1Zk:>6 ϟ<R):ial ,%mM2?l-Z~]m-",.*DdDl=ƵKpJ\8MƂdEAݹ7ܨg i ϭ"(N>%{HJ[=KRczQ_ <PGR;@KGFZ*l_<ÿ\xYQ2:uk)њ\YKBq8yb: K[ >bmQ sqESƴN>% {0N]Fk-qG𱹅[+)OCfz*n߸|Q$dktzf_Z2v7?pD&R,0?cǍÊ t.x;ō[$-s+Tz0+9 Kƪ@}8ťR0PG?cJLP8'0n Ǹ^Cѭk/}`K;M7;{iOrb3f9)ZVz 1A)qFZ$hBp&)b\\,b) qj:IF<\_7/-[iif$`85OƉ41d<|spGbmُR NH/lYB ~fN4msʇAN7zD8.4IDATkRa67UX0Dz8߽岄0,F6ΜO.d2JtDzPtBm'~?r:8r ӧgh|Xu?kQ,ءSHõo8n N>U0y% DE%L^vς1`|ɑs}us s1-KhlD\_Eg?0@CF})wnH}ɡI:vyS>TuDdWTp'`D=t#96ԩC>zt}TL '%~oA(ϭEyI‘/? X6q!o z(#.䨀}}X 5<8}p;A %<|$ -4f:KNq"MWp*}`~Jo ۽(mݐjT8ä5{QXHP5O1A僕F0^ 1U]G.pIvUIvp]"G@?R #V{PJc98Px|${KwG9zEcB/HK^]z >1g7JԒ;Ҟyysґ@4 7Z﫢lz*ϹNNp{+CnyD~2ѷO]&&ge|SAr24&M4@Ox–N\qFCt5\ Ai9x>((*8FYFRVР\S?FꫢxQN4t sR4xCGa|\Ȥ.頋qpI`L\$X^F*]p2! *2 m'JCw :у8yx?Ο>w,^ !G#o*$,f;<` i/|| ^>_z ܦ9p༆o< OnS<\۵x5xmxryv5sSl?68;XN|i B _p ʛu<ίk=l\ 69B@SH/97;KȒ?~>V,.3*xM</"ФS(JfkP J3ȦpЍ'#-N$\|PJoP?C`ḢCao q1"Hh $-4'E}CA:,*\)|C1YHi/wF7b{:#.:k0_t -=ûo9 ΂ &e O$\oחq3%k^_囵-ٸYJ@O8Ok[X\Fb%/+O|lټ[la2zQ\zL >7!5KXGRb(o.?rA].궅uܩcؾ}6oڄ۶3p5}>29î;᝘V?y 0k}1]2d$EVWFR %!Cq=QX|ӕe(4aѴ{^ BXl Mx)lHQ0yyy荜G/?Sj@{(U Λ輶n5T`JVHKJ+AZ\.*NXEPiubikRivZZ -P @, A(ϼ&?'ɽgy==/n݉JrnrA*6,ìPqe9ضz!?f|VΊ p&:<[B 174CZ G#!9OHk>O&[=9hgchK& V$ WNf&9Qd,wMh(=In&4 ܘ7ևcXW7q4 3)xEi1҃Smdve5O*:ZV%2̹DkM.6%AHB-k~&rM8/‘sG$P2X`~*DIH]g  ’8.#t?t?fFdfo!><&L,[<< n6T'h3ZI2a `AOWVwօ1 xֿv$n,O+o򐵁5 86??MC-SLLv$q8}><|Ю&|k xxkbisL4`rJcd!o?H‡x!.; ZZK{'IJEx-AzaMA|̼Ã,2Jzπ#xIwYLC^ہm>XA&i0xLB`<âk06sN~3_m.[&48&mb.ĸT*cAZ[>5-Gf!<䛅P'FPtka#WϿ*q?Ao=ZhGs}GWFi`(fP]ux>k$0̜t[ ">-{>@i>CѴa˳^AuXac?V@ӱV}x<kC0n?.y ӈƚk, :4,^sgct?\l6_'`4oZ3`6keغ*O|T`Dw{ A=^ e%(/1 A )WzT^ip^ݱ:u[ BH4o .Um1'ɢbh)˞}:Rq[nr̦[xOA|ԓwФK+1q|y||| 9+&Wۗ fgPLmaMPi}c4 7n!~: zځNc,ܞ UƯcsF1B.Cћ\=.>QH*ϦH#5>5IahCFN$+= ߞ= ,'wmaO/M@Fѝ?y]s#95j 0vS‹K 73g)p/[WٗCms-IB Mb[@c9Gx|MY9z>s=4߀ $އy5c_xL i0Rc;cYieHXCmWrU-58ez{!gBhSkЫ?A\ő A(m9y1tm41*jA~ 2Iqkx 󑝝BLZe+$eE(*!.HLzl18ip{'MhtheCP} {oܨWYRVIe% J3&Scm%ni]Y[nڇoۈf"77 T0/w3Yn%WfLy"* F=ZEj<.b8H:xM`<2$u ,ugn{i66F?,ۡs*̷cqk(gBxǺ dmc[svjxHc״"!tW?f|:1nom!mzn˺,kո^+u7y (Ƣ(uj8VAABKsTz]mcVXk|TJ|ѥ<<.[AcUvvXk ZWW ǝimv[c̽4ZY*I9l*h}f0iݴȹ<<.¹܏lʎJUΤdf彄:J/BGرPLS'efה ]9YCG!mbMD4G(mIFy=bca IDATx]r6Sm1_D)i^7xI;RWV ;t(A|S gq-!J@Ba "w!vwKb𨉁Oz`55ymxO۶ݾDT ;& `3;e6&z"j]SCH?B ~?,>؜]3rBS"`.QNEB[ a@!@#+ 𮹅]\02t=2r!MwR^N;7Rc_G؟~}[moxkPDVsp:O-E@"B-J!+`ws#qqE8;>_%@AR|R? u]%H3#o |xIb[hi(&y%Fr:}<|e+D `ETnpGRj$? $o:pG2#7^w ~8$#NŚAO; YE_qu.ZDYE ]~5@pVQ*fD* @tjpz3N //UڍUXx^m6qQ@?nJHQFLdB?&fR'KLӐd3| mt= ~%t ]gD 9E B( XMYStt]R0sBB0@y: ,P7q%\$TX`M>9>"f0!A(8 (=7;}9s?- > N jomo f|@0 EhaZPv@#IznZ>`FDicvL`~3]ۋPDt\UiW¡]EDW`uCךu 9Mـk>Ycۏ]/D'!V/"˞j2z WoU >7E_\tmNuDMEF|b{:&Ev 9q\Bj6$ފ7̍RܬwU=Y-]o.3YT.U%`iG3o>f$WΆ칄'"j x^Xōj,,[l :CTi=4${IG֠mPQMgh ޝg7KJGC8ƽ~i@57H9FŒ@!w3]H*hz7مb!w3]H*hz7مb!w3]H*hz7مC4[UZaǬGv)n+-R}=s{UիWm7y^WU#?EȿWeXIfMM*V^(if%jHH02320100Fotoxx:resize| Fotoxx:resize|paint_transp|paint_transp| Fotoxx:resize|paint_transp|paint_transp|draw_oval|paint_transp|paint_image| Fotoxx:paint_image|fotoxx-22.0;Resize: width:128 height:128|NE|81iTXtXML:com.adobe.xmp 100 100 0 MIENDB`fotocx/images/calibrate-printer.png0000664000175000017500000010260215247006660016413 0ustar micomicoPNG  IHDR^#tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 189 292 1 0 beXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:295 height:216|fotoxx-23.70: Sharpen: median diff 2 15 15|fotoxx-23.70: Paint Image|fotocx-24.50: paste area|fotocx-24.50: Crop: width:292 height:189|fotocx-26.6: Rescale: width:263 height:170|\N*k IDATxwXT>~}ndX1䜓`@PbỲbTP@rH9uw>dLw;>89ޮ>筿浴555@ knn_`Rg;l@`pD ȱ (//GYY_v;wY۟g8v]9bqq1 \p PTTāo zY;m.k???Ŝ}o :g73C}~saRRR9bvv6b[:j 뾯]sV樿E$EE >.*L@/ UU  q}䔖((ˀgx*E=Ws4 NM0_tgϮq39Ydџ~<\gKCqa:fCx.\RT57Ll &͠P03L!%)6!2?1Uâgh=PX^3Oq˖;%mE; > zuCu2Bc0FO:zco0 l"06\(+N ~#, UIb3| GQNio|f$V|$VEY/Ǥ FXB$"t 5uMagF&"uтlUU8sp+L&aD~yW3\d-cY9)}n<u>p߽cW($$$!+'YY 4ǷXs6*>8D#%1n;jT6@SQʺJ+BqV. Qrv kP__8n<)- `O\nU#21fIcذaPVӄh](*CI^ӝ?E{!phH˪`)W%S8G\O?sg3)Nf`GEE!,,+%%9lE;NKKCDD^~dNdz{G._8GyHE R2Pm@j>gOfEOP0'#! D``BB_phnBav2^>yHWRd` G 2"QHNϦ i)[8BCCDm DLkr{aPU:Vœe08e#jݶ7g0@`+V@CC}{W̃ u72fDUdf堂,a!ޤ8RJ*Vek#}k0ft,&M1ĉ I f,^5HK S i 1 2~=&.ތ"\oa?GXTg'(!&p82o 9gHRRR?I!:5d=5ȈBxE7X`a1(waB} ٛ#:=* 9!'O}Xae xSCY^⢣0p * UIx,jpIQ_!#- Q1 H*cPAY[kfġ詖JEmU1y^Ŕq(NҊn_Du9.l-(JQha$U]%$s {;sf߳pͮ!>>#nL(叉'O~߼y3s>dzY;0}UPSӶӡ x^ͅ]E0Z[s[a"@l(ԍIoYA~hF a` *Ҙ`:W8`)0tL] Uq$G>Ǽ1xCjkI+hkb|NFbPȁ, gr 69_@Vqb|CS^R4g1̝jqi} DDD1oDgp[f%2YoBxi5|]`"QQi-\f@]KSHaX{ rk8 RbSĒ5l!t0\XV"% S`2Nփ˦H%&c!J@g8k1ϛF5J& JIёQ4q_tgٺO 8s&?]i~߽/]vK.ٳq1%Go0aZ*p,Ŷ4cƒ_Jg/MDk<9Sh@~93(s p U0JL;ALL,$DxiL(HI@T~ "[gk Ehj:?ATZ.(O³Ȣe@q*q$l8dTufsR`mfvy4`)nDEܐV .ՙa?݈TJ=L0stnr D!^Xh;Ml 8+G-t<طrk32ˊ!Vd#y4ƛaDD0y`ThŭXd_mK(|^$4qdSUvXRCEfv'C8.fȨhRҳ v/ȑ0|e(*.AQIY%Hy粢#r(\| 8ԣ& FulxlVN_+%p|)TU0|DuwD$n8k}Scm 9(߄nӏߗ?_G }, v,Xw+X--ؒ%Fv+ $:=yIʲC]{ -Ş#Gqa,9ʖMB^Qe0{ t t.r(-ŖYAeg!T%sm9v+"~Ӣ{-Ġ8~>)!p2K򴬸p~'XSx<Ŧ:PP),Yj5Mmўe}B9AC+Cp,L?\⣗ȣNaB}Zsƌ g mrD8pFwpȠ.؞s(rsP0C@ewpb ȁ{a %^E;9]3!ɉ H`haG'".*gN'oZk8(OE}gо>[wH 0y>%!rz%== `SSS{rL3{W9P(Z] h JIҴ'""B3Hn`%^aF v8z{"O[KBxP4AB U?#ˈ$u1Bm3PQ bw/. Vfd%߿0wV$w:aF+HGjp$j*k[ !<"1bݕ !01mcp[,翾Ŵ;V0YC ~-%-m@˗^]]3GAx]I F䢇J>vԷopj˰j$|ϿCh^U".7tw 1zE2!3jFsgHjMa)͜ɴA[4O >},b!p/%oE9Iw=s˚=O%&;- S6}WLJD?fG,7SMM0lf]DHJk|6gs^&SL`: &0w=^Q֜I8&'~Ivp H33OŬfԞ)L̀:<|*ʪ%ML,LCKk46:SΠ۽tLXb9=dN)L+G\\> Mƍ7ꝈIfNBGa;k:&N &l6.0bDzW\?@SS!۞^+'`l-=": ^5yM;Ojiw6 &l4?:Z005dzPN5tSr}o/8qimϤ>Q^4e l=p 4%طqX[ '×ww ?AN1>9(~޷ٻh.EG{_%8t/x tlo{ss2'a7/:dYf6|IOYV1 L-SBp,93`` &+?``q?w8*[.0Gd1c2'bN̜?>2dtD}&r2a>L 8?g8O NYً}f‡}ggn>$kg)}!Gw(8A`|m@kLWӉ  8 afIAFJKHH%Ё6v^%Ё6Z{BO ^l@`=m@`Lkp_̢=gѿ> 8l A`| 8S 3Z 6 a5 ,s+IMJ%  > E ;_Qq> n&<Xr ]7FGbvǭWKEXO5X]0yFep,8p?|M"  B&$⡗?5z"h}xH}x{}!}8ځ/~Ea&?~t4X;}'['LL9r@ߋTz&}C ъXq$ kj?ƺ*8I"j=~iVeat5Ït{}í#1x.%a.U>p *\^_9Ng _p(BvS1@\0axƵ <&bˣ&~{% 跛1[[xh5DOphXMETӻ/n59ر@:Q wlO32XIaQg}-H~y&e -oL;$B|u=,xR†!x(kvy7c[ qrsfgAƞNl8JTٙzܰ(hiĝS06%eU8n߃(fm?^EqM)u~!9\HpCTrKfwCw~4SPPH)(<\; mQYEFSf<0')ǥ1No4wuM|ARY7oZ[-m7yüxt E*6W<8x&SJeYDI0wQK1w kFȊIÓ :Z1*Р\Deg `g=4q3“t|u#;1tEsa= FPKyԋk}$( ~ùWRB@Nְ_bϘ8Al3r`N!Qi_ȶT=J+wF >Z^ pq"4&BD]LH vr(; 1Uhh2Xi!"xWɁZưȁۖ ]k!75!5 J0w܆l*GBۿ-%X6]?({'^iaV=r^fmڋz^{DL˵Rfg!+3Yq8psy;{*9ߢ,N[OPAzOwÏ /W5?|h|X__ŧ3z CNTiF^TV 1zpWXfLE:ků̽*L_n@2R#2\ۏ]AKi0md#P3&u/4aHHKCk_9VkQ֊# WxK[Wk](h##'') 2 ^vW}K0c -jZ9 N .PeDFG\ 𸬅/x0Tf ۖOd|u%_pZI%9PB_طw/|?c)y{ ڌmkn^܎!T{8>`'=y"CKAT^ a8Y}(`qG2 IDAT^``W{)>Nt}nBRI " ݧzGe ȋ SPyp)LH)HZl.Kōfc Eڔ"즞K] 8iNm KNX F xxvp"p}!LT曏 ޼Gz-`[NPQ] Iړ}%z;Ϳ 5r-sk:) l g<_I0HJ ɖ+]Dj .テGV׬BXdXq< ~~yNFpJ6K3qV#0$oSROJɧԣN[hٴ\F<|r"e|}m!%! . %K{!+<G|֖z[G ,yܸ{^("?ؔq(ψdbj%s'09=NL}]9] jvNݸǁå7AAy絘R<`'?më% @˦ 0sNzBөKco׸;JX}x+eȍ1a!d%7yB8 &v3F¼`:#ld6FHivA1i. GQJF=-EiȪhb t &X82rP-<5Ue+jzPoQ?R2r eh螄JHa& ū3pz(@Y]Jk֟W@\z_ᙝ>{xwV؞Րi+RII!Vb,5Ue\Mxy RТ͝iB8~m6fK|| Wuk^cAwxg uTDLN\=Pݙ =}^j1f{<sk<<=ҸWx)|||:E8y^U%yUGIL4!x[Krش蠡Qmm>}媻6{5!;-/}SD3r[4Lg wD%Mv~rt#(rʛT!m2 BV~Qgn('͌smEB9=xɤ,Hr*wH BXL\ P h<^#*&1pr侎(et7&g~/|o=w?WkM:!#XQ chmlߨy,ZY:>& d8 o{kP^UOyjV֡s8;[t@ 4x8f^95!8A`|m@k_&Fyp6 0 !5Wpڀ0M 㗍n>-tNv&zٓ8p-$%_V`A+ Ux!_:h475r/lp2RSp xqGQa`'%4T_٨+rn*CNf:ʪ؝- ,+A%=!=%*+/?M$|?ALT8n^'$_5?ೠX>w Z[d38>Ab{:WCQho}~^aZ vZD[~ݏ ,B}=-?󁅞_1`DcCӈ>wg7=[2nĕ{:ǶEv6Gٗrӕ(={/2V^_?}_p£_ _EjJ6uDA; #G7n#9ԥ1nG|nnq3}Cu _zpuq3^LfwQ'ixqw\DZ8\~fd"WKKWjO_0k[472.\Wqqg#")g5}ԏcpb=LjƻL o_$ %-ώ-~f41qVaxlOBcSoT堡?SM1V_SͭP[[)S`kVW쥫M*1Zv8alޱ,M!&]/F:Kc 0uxNG/9j؛*0L]bRh)xr|_}m _>R`=/:%E@PPs=\p(Xm;p$HXH _q~Ce1""*(Ė3}.Č#*9cMq[%F8JpXOTΔ9H">,'~A)iapr8:.W}UX*b}:g$q="o~ b67Rڸɸ Y I:?`a !B2-X2"ja_"6>%e(NcX~H:?a(}h(^S-n׉/7FT6;?< xq"`&uu該4fBNS?CTlbc"f4bzSG*t#,{Br211PqZ6)kcՎCUdxxpġIu?ߗ>"RXqQ&!CX~ ))f/ߌ7T/5VLE*mC^N"c>.{-:3caࠡrP^_S=~guDaw7xN84eN+ W'J\'CV3yHw]ݥ;[SU4Ї4r Mia|JEw΂ΌE.e {FKf8zE>x@Q('hr#;!+2 "X9kXɌ|X>Leg>H>Sd;BwV98CO;]>Es1TFb9Ub߶ԑSh=rvSV]Y ,u1m6pxJq>{6h8N$ spq r 7[-44fBUG8pPkqV0VmOc9vUU!+v,Őa"Xύ/fCDDcʫ'C 3-u8>ʁ ]p j+$jЙ{Ow2%qqm8Z*Prﲢ0. ¼U{10"#C* Uw.a6ލ@ EݷBj\cW_ӡ4~^A0ՒĖﯮEg3w"*GRN~u{'pPA0z:C UTh 2%]׵SNrh`S8xia!JzXQ4T5&oy_9.;.3_p(uǭɢ¹KuG7C]Kb)Q1C[ ڈw<8 lŨ+J QXXƦ"v^ U|Un Ԉۛ(rXˁK\S QFȔB/}ss6,=iHrbzkzh,-Z&-hmOKŻCvH9v,SYN gГeȦ%Len\7#vysV^ !8rUD[QNSaQ6p3rhr׷N4KRiE^U)3%ZzQn( 7Zqe;"'g F)~7JH5ŏx+6;ݻtv{)a^ ÒySM llq -&B\AG.z mLkm!BEe&̜Kx{X4tx.AOUƖp}>B8) LXz ^npp>N-ڀ \&PF6$izVTŞqi,0P)Dv+L n!k]( a-^sv] U& XΘmm̎AP(m#nq"%m8lO--݀#ihOбܩ0h@;9Xbb0X=n='N5[Z7rhiٽc 9UM,Xj60^>v+"CIV꺰s\ET~@ n@NQO)'\TUrSZaGӐn=ů #`z{#8=KN#a: 4s8"4#/]".MWo.9IxM^#9Z] ^Oc殮R!X 9xPExQاV%`UwTr*t{סho; +K['(ٹdЭLwk p1,_jCXp]\{*NKNKr,/hꖽtKj-%RY`h!|KK;vnгXb'#뛭j<眃G .\ңBl?"w`ow =c|_שQnDR/6;“g]%Y8{3,σ9m'5WV#!/KWXm"3"Jvl?. +|4m")R!~T\mmmghwGwY|V#>6-Bl EPK<}j2!F(t5{u]LMSt+z !0Ǝ d8o@he}/P,Џ@?_ |8|-pL | "# t 6 8Q`|m@kLWӉ  8 afIAFJp6> ,S)e nq@'x/80gpq1HOMArB< 3/]!y<+_p`M&zWzQճJ顫'c)`1ød+sq1loA|ag^5{r"C࣫p9~8tF4kZ`(˭;֧3}ލWO| 8QlyC xxxQu9jo[yMw Le竖؃9%AXw'ȉ4jSUFdDӝG2.x==9ZGڥc鹐nG>@=>7RGZH*j^]}b)^D)X&[GuU::r:o=c9fr )`{n } V[OԮEK(ʣs4pq*)B(Ϡ@&. &xI6g*dyFɨex'b3Q?Ic0DHrM OR7i%B=˧Ahз懁%RqcV1u_;5P ⒰[А3VEGþe0p 4(i%g70ՈآN!C`p%R侚8\p y)1:^Cq9pJF)[ QސC1tP%b!wx꼘pGH\}c4 >p]YťVLPYS0edHJI"kb`2>6)B w)c h#<PZ2R*gb)o[6{_s*guXu!Nv=Z;1 4 ̆yz|HNJ$YeFEy)n^g"c-DT*ɱ-kQx28Cz3! 7VL|$,i]n =1B8 7kgp !l;hŰ9Tu+2?WN%0ܺGb\Ca#XsR LuQm9c*L {iU@@pDaID,rL:t|H"]gu#';!+Q2~7,kxx2:t&S=-NxH\W[p|+^ Ғʡ.Z ضq#xxu έwD0;=#B $A`$k1%M"jv8Ql0l p؅F s`qI% *2ũk(i z 1غ Da4$Ua;ʊa +vډsWn .)/Ȅtp7[GIcbyLDAjv[`:uET ##%m|LcG/8V\'u,Mpq{Afjt\yK_KEXl*/coDB'Ȏ Hg &ՓYxG4t2(M5h oZՇxwn$9o m>T C A22 1RJe](q8?+NC+g'8#2W͐ϲv13㌰0cP1pkL#Ԋva+Hs5R5ᘶО*hKc:4ZM0`/o`M]h$x ~s[Jh[Z)}{-HaxV096ErvV^ÈbI`}Ip|)Z";/ 5*q㈸:Hf%nt'G7"rF0TĒS(o$PO~XIHDL?e ϼ:Pc/RH3(|\1c0g[9B5hz/+z/I67h3dwQ%fbp{xLYDאm b+j:sxb1yVKVS0~[XUN쿄hx?cpxMذ|6FHme栚j_ fJ9;? ɰaA; ][uYf5[ ÍHQxģ+iI"&/BFJS̠ LK ȘZa dupy0Cv ?XA^ mmFNGWc$o0оզ"" .bc?(3ՆPZ]b.`>p{?8 `w8 麣m0}\b,]@T@No2X邷psr|vA\J*T@Q LP՚=hq|uտكŚŔzQdu5r3qՕ ,pz dynK$1v>SHcݷAJ\"ݗi#{D-eTweq٬99(E-Uvz%^%q1iX}wT{ތYQ$H ØsQ&ĄH3̛;nly3oXVwU:w׹[?s`'>S^/`g8ƭ:jĴQ ZV~0(V6CDM;q681ôsmkvoYO*M32H"C8%(OAV7_;]WXM/SSHx-b\ma`9rb5rO~{ OK}rKH5!xdGB#&16Y``8dP._A ҦLd^.d2e45X .b8CQflڇLJc>~o4/5!9CC F6) 9\.O,1k8P{)QP |ٱ[ߜ ~HJB 8H.,0g~4 _=ƬrXBI7lrEI!?t(I洢,%$w>ׅv zatz$KTw4?!2Erod@'pEkwpOy$Ivܕصl MY5#3>|!XJi\r'YH;oEn ̟RCr(uuR)ҕv4%h]"4ey\)s S t+{ƍQih̞i,v9-+e})UBF%g\Dɑ<0Jpr-eINJg0{ (HQkj\)v ΅ǿ}`~?bp+e>C *pИO ;JEPlg%=TMeK8*F ˌt&Z@9MQ_[)'59Gf$(kGoOX dm`"--nc0m%\/Hc9[BFlA w,:[/6a̎cb um?Mt:f-o-nVZE5zomc}El-bm|/֞IG;X{Ye"~Upَ]o_|=S8cVZV1>D~٢w\;xkc l<YzW].Rt{?/\jXz=ILDx;0- ]ޖ߾-?  CUly,[V]MKE+ FOW9IKSمY3COOX_Y |>C|wkk΃Ԑ_}xp$cHt/.Ʒ篏:xp$cHt Nߩ48u5Օ܂rZ5Ɉe*h壀!Kޱy>Qp`++b#8iF8{'^VHFWoZ2m=әo'ڸ4RqaB8$#*V'g-bCWu}zkhV${R?‰GeqzEd4jŞ3NCtl"j7 /{*3!6_HE$?ڱؓǖ@nGuokS8?ٔ=?SS$ݏ̣ %8m)lDZk )ħIh89 #eO ̿vuv{tJcTp~G?R^UI?zxrΞȅ•?dzfS:SF,tGbG߶-Eu8bIs,ܕ>n(^g)3̀oHj`v ܼ0k/,V;*VY/+1JYͅ"+n!xqVvmY v,ⅰY1yv<Y▟֭Z&8b+z h*c/w-,1`^"D}M68pGâ1o\ێ|qVI۰`9,X|OX|&BF#ng`de(4vuU8m¹Kga3Өd'Mdkoم"]L$;wo|Oj%pt%̑=VUhGYmk;E 1̌[%+p#-]L7#[r $?a$0[lښsZ <% | >5+-~>$sį/ݷA_xrd"뮧`r..^nPO`ʾ/y;`8xK-\eHz'}K^ꅓm_m{"sbt:=J W`|)v$/ DyجXƍ k>D>e\`߁X8߂ھ.PCI er@Aşc,_@sdq/zn̛9 ;د[Q 4/Xd ܈6N7Gx.6XCH'i*g-Nœ4ؘV6 P1ga2}U=l<ooOB30 ~H ֲD޲KIr$L 0B}EgpO4"͈9+ކ!RR0H0cb\Hmi 'ǣ1j? -4Xg< ?$8A'̘Q&# 6㷨*̓T"!Rs,p7I-4f`GZۈ k1R㈎QH,GWWs Ha0-v f ͈&"8حKHC1sRٻ34:o>_pi/T\\jN[Zx_;UeE/Z3睱a 'bEKH"Q%+@zcx6`:dv"(`%" J% Up9H[B{ 7st0n{r܏VdC1m93p.J+ /+Itw"]?!wCNV@5ƵK.] -U8Ŋ>V++Q]YP& gPJ^0fG}PJ }3$҄-I^=6^/1 6.o'EݘQi#Q 9qF3e(--%1K,[ӛg4(Qj'RK85J85PbM~Uӌ~mc^FI3Hi* p0Rcqq:Ǥ߼򀎺펑S++ qj٨4UĖ_ t++ hF7;zݽ)1(eEQJEneaw1D󆢑jw е&MB#&wm8y`%4L7/6#a\e!rkkɜ*wJtVI,)*Di?%:ztTRߪTh8c[Np rĈ. !Fj*Ǘ_Yc8$7|P5^<ԑ-ٴF0h't(y)>ԂjGW/,(k$*0[Y"j] bX'Z"1#b eOhLcK(e%Ɂг9BQL1PҟH :sCLVxGG>yH`4)0`ddQ׼A+]\ UH>B D m% 4ݠ;NsL5 kbT0g2'ƌ Xڌ[;!OwZFw5E:OYL ',E*Y F`Q["yn j)$"\8pTM&tW(lW@e473rk4FOE1 ڊrq8{1Q7-'a4UCuv$v/҆$l28˵]k61$WJx8'n7(ʧc1֣6v\rCKar;$*X8( e$ûDU@`dbH{Z}@I[?nZ%,aQ j|ѻ 'Ϥ񞳹]t{N#J}R7&Y$d?K8"GDۆT$Qii@]7oIDATMӅ1E6kÏ0\dQ'=euDy/ &'v$˵Dpy&+)}_NxWdL2lsU4gMP-S䒃k)IF#LY %DJ0fP`b\W}7Xy.F/451|2ӦEf؉D_0板ݝx\nS"Z<T@pG09Myp:R#h:B[ޟiR8ؐ'A8+ Eف٢5 LtGA 1c*99[-Q0@:-E8n:@Ln Ȏ7;DY:TF6XԡEdam>ZPVR`h/roߢ<a7 #+B5%FyƲgP&quubPLY$I%לDj)Hwa2]D \t"$+͊:6lkNimũVDwHr?!eOtIHMRG6ᩗ3FR=W"Ա6ע `r竣 {%$Yx9v3Zk\` [aVaÜq0ۏTB|Jz/X8~GTWb:& 3&`gRH\¢BVQ@&j{u+Z*p VԀ?wdG>j2\t܂hII)kON+lt*؝"S 7i)4g`?[]K ꡿Rڗ$&2rH`h> ]#D ~!JtqYe5\];)| Cxz8סBS*M,aUmS2 i1 Rx]fb :ܺobjp! (<ҿ !I[\ E[]@H+џzL"Jt]h" 7#l9|8%QWMB7[~a"j*yᘺpbpc9H 2NK^%Fl;H&ȞA0,/*rFb17a l8튘d&EV(+(` )^UR/!oIA}F< "ݿ+#MhUz~}ߌ #;.^G$ d#t>AdR bqDm#*2BI}<7CJY]@w=BNA^E9)+eFc.@JХ7t.@pAZIO3yz%]m݋t1|5<"Tbəvʏ8C$QIHM-((چ|1i@: &!NGHI;F~yyM{XKBaѱHJJ@x c ej:(EZJ"#$"1ςh!NjŽ9ԞLm )'GM_G6I} C靟'ru,\S<Aqk'cX_ `f: D?ܚ~҅,j2#\lV-T呥j gGbުMH2u4;>>~T̠>jOE$O-5p90^πg Ƙ4IkwErn,vmX1cԠk`HU5mFׇsp: Xs^q8tGϲH^dB~"It 1^k9"eXomTJ}3>1v fɓsџ_%qס xuIt Wˣ[B@c%ZO烘Iq0h&iCGOsXY.E .4IК2vz2͐nD MaXb)RW)Jm N=RRvDsue~,MlQV[p/ )ۿülls!h'Ub?\:"Xۅ6=ynθ }! 2Jts؍w*ŽWv1p?Do{cMU$nKJ۱=/0hed+h.'7h .d.4[ۧ^6Qȉvk_ek[[Ct!,) [p$%h3/^uUFR-5 j,k𥴏ou-> B`yS׺2z3K|mDb'ɋ>~_k^ _s'<8a/f<8}Xހx>@wGDw ." xp>H5xÖ?GGGox|=+Ţ>rCL7x<8!1H_sxp>]E<8}1$:)|Bk΃<8> xph%xnMov {^yR`4m($ ?Fm~?ϟ /Sʃ]C M"Ϟi~?Iov!Hih97;'+d k `D/@CpxC,/POWGT[{l3۫؄SAҀLؾ7_=]DT,r*+)o3CQ4HZwcZ紛A?f#:" M$-م T(B<8!^DpBiE/rhDP7iw\t$2HKT<8tsq|_M-(y>$7IQߤ]X9p ]\q.,Ʀlu cY011YF={6,_A'kym`coD8D8t_z3l<9d'c1 [p8H-$q!,XϳD틣iE|~A2B S~7\]s TU ?B$[O}׆rՇXmrr>88xr ԍHCbD ^WS;FKNg DCuxvbFLCXYArcnchy RB4e++QRKnJHAfV>.A!W8JDgGJH6BzX\./̧`; *pfdH`ŖPV`a80}wސS/c55"1 `Wo8,W!*u`a,5 5YXfl>4APc}j34ч1Tnn> ;L #Q7l}Gw$9pwJY=#.ė-MM[(*ZIM!u#1RRR߿? Ƭ%kF=` V#1pH !wھ4bpyhQ׼Q^]ƺJ\; \_UCT_K+ ߂ȁOH~p;Yhn$ǡ-ݓ"wɑˑsXzux~S,lpy cG@Ek N^6B ]NPpFNacaQGܾaKEnbօH l>x Opl F)b^T5 /9A^E9jR=jiEF/̦j@ISι#&"[b\^!+ˠgf4צpNoo{+8ZQ:"jKmU-A)phf9k#Q^.x;"gbf5ǒ0QK}eGPZy,H+!KV{ aM5SoُVsP1\w/r6suu U\!:̓ ";"F-c-c uKKQXRNB#wwcքc+t6jrABcu2/7!"3ɎU[? !(+΃,ë4>6d؞e47V|klٶ vqۮë!- U>9p9cpY7g稫.e:8 )p`@XucNy - ,? Z3po(ynG2J BiPFζ8L%z{.&וAi@ȏ;v`"{m/ EWy.Bx(@DR.uWh)CHÕ X;V 2Url}c]>n`V {Yr1/-ֆj0Zn2޽Ceqe h67nԠTӳ L-4pއ1jpeikµ{0LA}@Ū&5X:YD ĴBg +3mQ0ڤa/iznN9}qf%Fh04P.A87@9aip_ژYZ0ZJb*(lQM@SE~sCzjA`!:9NCߡJ8j}'jry:9^^p9CGO!* T} !=^}!ϙˊН>O;42 Hx:&-APl2ᴟ}db a> UMw#oA0E79u+b"IH8 \T0M#dOIʆZX3 */PԖ1]k8"{Sc5܏`XEq*ۋ(!YQUDf-o*++߲Rޣ[lľ}j;RZRB~:[9| ~+k#YD},)>P?kjhًkr%2JQ۱_el])پUKHss6cvڃry.ts!gЇ4l,ثqE;᠒x iu?A:A>cn ޮbPR$ÇDws;}?쾏;\,rZ|pWh /zvGisg=9iE 5Rb")bL|B.lO9~O["͞-"LKգ[ d[#xypCy8 cGDVWCIo$(د Trb<1_KTBl4g"Օ"%Kaj)!o9qln>B4#]7F#c{~ Xd7_]Ϩ/ K(2b}7<8tq rL'SܺAtʳT0t ⃅}Dz)It}I]\Hhk8E )I I7<8|l@0gaY)M|e%В"qpڅ[.MS%ڣHWxp+Hh[IENDB`fotocx/images/paint-image.jpg0000664000175000017500000017427715247006660015214 0ustar micomicoJFIFExifMM*JR(iZ02320100fotocx-24.20: paste area| http://ns.adobe.com/xap/1.0/ 8 299 831 2 2 0 C     C   +?" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?K|j񮣯fk{O;v|_jo\i?令_\i?念WO*(_\i?念WO*(_\i?念WO*(_\i?念WO*(_\i?念WO*oútص]&f-'ݶM}JV#-a|xnk6H[Y&#̭k5.b|'}{I}5}Ig&25ZxNXet>Ai!9$ګo?GoxX_ Z,dВ mV5'U>_Uj>q=3kz? jZ.h<7oU-4[/'VVmWOUjoEx~K-z?h:Kj$,v,ۿx3W/7^E]G].mvV~b3n٣|'}{I}5}AOثKt}Jm#eCU%ڴƓ+~kW7-;xDF=柤k\i٣_3yrIߚ`Uj>q=d'YoPi&,DIk[8y2ȫZZ?3jR}j\hmCb֞J-yk6c~q=\i?令djMGڮ?紟TTPjMGڮ?紟TUº/MJJtnejXH՛s/͹v;'}{I}5u.𖇥WE״kPmo,dRVͣkufY[ ߻UPjMN3̗n||𕯊Lm͵hvo/ז֏Y U3UkOxgjZ}>OpVo_|b𕯄PdUkq_~_k$?,+]WMևS屸91'Izࡿ ~-=:-N.4u #'^5oT=SIG`K+y{z3_ןR_vSӧm>;ˀLQdw V^LtkǴc}&pFAЂ 0?msF}G ?-џz@|~{ i*(5|QCe[]ywwٛm$~z3ǟ{ i*(|~€?KnjhWL:nش;qU{o{ *(‹ )įl泒{bͻl*Pq֯h:6In) G=C~?_HT?E~Cf૷NXft MfE'F1ȯF`Am#P?USz3_?UQ`Am#P~ފ@{ i*(kG ??/ac53~~?_HT?_q?xjKHbX} 'uQT ((((((((((((((((((ĢwhN(hwhN(h,_:g :g (???_:g :g (???9Qdn}d_eY^@3P@3P/_?>|T|ikcmēCcw32m߻?+vZo5eB _ ku/MMt-ʿuUwƏ2wƏ2` fmƓxYu-w~7ڃE;\//vжqur,Ufo֧;GtCG;GtCSyCssoMM'3#HcR';3FۣeU֮PԼQMA'xNo5Gj˵[wF_Wu^whN(hwhN(j?t_:h7?^wڶ3n羚HտkO"R=X"mm_/o__;GtCG;GtC@F[[[yOSnY[Q2>+ |E2,+²-嬛Wnû4'L4û4'L4?{'o/yoK> keG/ B#7媷̿/^a7q7uQִ'[O%Ռ ՒkX˒E˻;GtCG;GtCCX4Q_Kû4'L4û4'L4x~\+on_?KfHٚ۫/no34m**;v_ ?e  ?e |[m׃o..Vݭf9#oe׽û4'L4û4'L4s*׊?M}?M4.!MUaYosU;GtCG;GtC@'Ɵxo6efU|ۗo/H>qc/-whN(hwhN(k4qu=7,Q|#_Kō5[y۫O$/x[i_ |@3PN_,![V[f勍wZѧBiáMLeib*R?1࣠bxE}<7}#V1 Ņ7F#8m1_AGOf'_)k朊lq}GZ[N8'Ԍ lxo--o#F])4n!4_f6 䟯|^?hqi>Ωc۸P~dp@9#?*m~xRILKJ< $ܻ.p[#"@t{~!i,ּW:Ky=5rD#F\p_0ԼZcj{Qd,ʃ /,!@u3{WxZχl-']Ks 1#"nIS$`yT8OƊ^(hJ(p(⒊^("" 0(ȣ" 0(ȣ" 0(ȣ" [q xO6yY>\qI( ((((((((((((((((((袼_ğukמ+g^Zg#Ok2͹h٦ڪ۶۾]Q_/ͥƪ[236ﻹv/Gx_? &]_ij ,Z"ݭno_5)gJ+_QCw=*KR,fUYhv.mwo-_ ꗖ:k4Ѭl'vUmܿ~GYX*+e> :yqtn5-6Pb;9Y$MZ?no{+_?x6º}wVr-nk HsE|ož*ooW9ծa2q$M_%~Z84 / izτm=O t֓ipFGk6U_t_Ligy.=[е$hѪryWo9(M:~oZ[XFY#XkmoU>(y?O73x6XE5 mV7AgѕtՇ[{G@Q<_hRQDʑD$Ud={O/uFOjPyGpqT|AuΓs&_B>y7{[/zZ9FAAƶO Ǯ~%*e܆Pc|1k?/̿>|uþ&/u]bM6? fq6yFk^~o z8ιcY_ c^YAI.ѭ23mo6͵Wur0ts޵xgZΩZjh2Ms˷umm-@{ڗyy}~&Ě^m.֎HM.oթoZA4^5Ŵڭ3B{VoݲͻoWMM7^"4{}q;m&KK3*U&oZ?~7k^ K;&Kt͵eV?w۷櫌y}x 65\4s+_ZɷɆIMۣvߛBx㧆o+7-mt;fgcIVVvGŏ,&F3Cgeck%*o.8f~mk?h~5:5KGk6ku_1Ww\}'}$yqK-_{n?rmY?w!\qCkh41ȬhY726fQ}W/|)ε::ơs+|Ѳmթ~յt[AϏTϙl$ݷ[_-wUrȘ%? |AK tձ׬bíIoo߼ܿ|=C~ խaԭ Ȫ̾[|U῎~o/<3YRYIk5i3-߾j; xڝ枱n56j6餍v[޹&f+7Y;,<-YcuYMTim.kVEd#U x,Ȭ·ٵ⪳}'v_U?F1NGOkZRJ..OtX~rI6?|,{WFs<r ɦڭ'U]^&X3O BG/ᣎ9w&_6/~ ༾kԴc=ve{1uR٫y|3ul|DGx<)2/kiZCjڦ57Gr$FڬŹ~j ŭj6zL:\`o7n,Ğmxn4{SPK\]}]~~[ٺw xUb;{no'o|.տiƛ=֠.uE%2|mͷ}^WLq>\xo o.C7/w|_kCoFj&_Gsd>3fv#/1>8fƚ}>gVͶE&_fGT.,|YxVoIyc|7æͶ;:?%|Əܭo⯥(*1>K_?~& oPdPd{cs4$Z>UwW|)O: 獬CvgpwWl{nU+j)sV熿Vnxk=5~ G|}]K_4WQ<_hRPQG`2XK`^6zT_]\kvv&sȒ<ۗPAUH<^kujd\\gʉ+?d+_ vOmwqanךOU?17mOxN/|>a*ɥ̀mې'kO]2Lz|UvYX8sl<?2sRL"x8ޑr[ufCN*TkfQEQQEQEQEQEQEQEW7MŸGo%?4ϯ袊b ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (txn?Q6i$Z=4l̪+_FV z:N-+O&]C+|6]/ݨxO$]BP>ǥjz-ս2RIc*3nk^|/߆6z}&խ\w m*ͷjvWx'\zJC&jhY>ll/#|s5:h:yCj +Cj̏V-A7/T<+ Jݣ7ږYdܻڻݯ?Լ%C<+kt?GtRV[8jVwFWx㟅|VsjkZ*Cc%Λu $y3nګ|eK5ifʷ6S,_MǛ-{ ~$_ 7_,Mq˵n~Uݵך|>> x^okٚ >8t_Vk,k2d 4 tMKH֮k& ksIlm[t,5uU\ld/}no7||_޹6' >% xGMmm.uM֒,12y{de~UۻFK-ƝkQjS-7>_1O{KԴsN4ve9w6_T~%>;-UgtjPw6WwH|⏅_<`6E5.tKclY25ZMʫ~]kM{0xe,n4~뚇m'P ƻkylY~okԴxIa"}Zm&MR򯒫3My;[|&_bռoR\*0]G I*nfx:xH)df[6mvڮb}|?o>mjZz͙Ydh~|J_g}懣AT_j_4 2#*Uo_GC_ϮbK+2}ڹkoV-45eVcsms SZ>.]^;okW־]ǙC&ݬ~|>"ď 4xwHiu EOidVo9Wn}ˏ^CZ&4\zЭՓvm.լFZgsc: LʻZ~72@?ß"-yltxooqnn[s*o:/¯i o.%پЫ7v^?/Oab.u<7vު/3%մ? jh}bMʭ,ܫ"y/x |].kmVmk8d+Ow>U {}0Gt]COԶ+y2I ]гWj:ޓW"ҬtE87.mo+O8{荦z/馾Y-{|2,O?_|=6,^&5I|K$2Gv]̬=/ǗZ?_L:?Xzޑnii$fF˵m7ݯOMFٮ6%q F̻~3.ݭ}-/Ó÷sI *-Y6~"5ox~qxºƹ6ڔ^.O cyj4{o̻bxöZ:ƽAʱFnܻVFm_R[CZZbQ]F+mX/=Z|yzMZخ!mVm2]~ZED3Ik~2ys6t,mve-6Ԣ(( ǽf:{?jE|<7W0ay הNpbEh[^8CGo&P*;HH|cM}. W7hĭ*%<\_|s%bPo#O?~uh{e꣫G2~ R}}1\0i-fX{uksρ:jv=Z'*UcCM~ViZ>c^.ˋ+ _8'ޠ>k_q'-|9xgnozׄ}CZR[Ki#E=Yv՟]7M^oK*»oܫU~Z 3!tItx_k_6Iɑk2ߖx7=Ú]"[.͹__.Zŧ/}RO;kI~Vow*׽Z!Nyˋ;{X.t4D۷rWQO>)𾃣_| ?ɬ\ˠk4r3]m'ͷ\x_gRh֤w{ᕺ[9/Fe"~_`QD"|>57vZ.~÷ͧx|ƺ;}W_ٮO>eu|;?1xv/ L˵ceVf~</4].̶kmm f'gɨMJ6-%FW̑f/wH9,-c${GEG Я̻cVך~yO 2x;;xO êGk}$ۤf۵|?n˷۾>+־z׈g,[VP;񆛤 %sZ2d̖mn'ޮOö;?G;KOY۶˷V+nwWҔR#~-7\[뫸-4*U&ouk?h&?O[׋x6nf8/"k(=? [t OѮt_.Uiݗ1WIK⦃/ m ik[i65lwEfot;WMm$lY~_m>o`>=}GG[_ue>%HkWnnk>"WG{]ssgo]SG2y<ڭTԼ=M3PmdUfV7̫QtGmSG|#n/ nkM4>mbk88Jd*j/\T|I[r+CěaUl[UWB#*X4m^ \fFù~VoO?;cy27_iշ||{v]/WUF\4aּ%f=2EB;jchվV_2xk~ռ1x$ntݧƪ-֏eڪW#i%bl[cv̿uSG)/4e/ \ipickx|&U~ߛeퟳ_4/ik6r6oͧxMt8dUFj"w ^sXkG-.mt|o]"Š((<5s_}٨W ='Zd"I] bxZW ='Z#~&5qyM8l~8[cTF7z\F!sAA5MjsitUzm>OCy\-XxD!1^7`<껆=k?`Ox ;KA.$vYձI$#l%h&}J;g֘F+gz1;ifןRCXTl1RL#5Wh*8 ƟΈ=PO+8a]6WWRG.lIkMޕèwnltrG=+cAG-é!N}篱L쓥i\iΙuj6_iqn-P"5 q#qʭ凓Y-IӂCl/nCF[*=$I=}qW?3 Y4`bCOc+xbRGQ]QEQEQEQEAtƿk a&Ou&3(((((((((((((((((((?g)h.-óhvdܭ}Q>6z曩^^YZ\YLI̻+|~7~ў ~ sž$U-VB_ C7/ͪ7̿*Z^.o%yfGi6ˤ*Ȫf}ھR9:xZ_+|=7-|GpKm=l|G"oem۫识: (FLehV=[*QӲw{^!{'ŭ[ĚG"a#𥦖 k#*U|+|5׼O-#\eqh:_B+G76__1n}=[C"n`[nkZKkA> 𖡧w ծ.5}B^L6ne˹_U]֥_cuu4[~m~-%Z;d}U~j9Ce~67V:kq#/ow,Yߡִj*`<ܧn *t?}JmSEv_;t*Gݶ+.C]?t_,V+/ڔ^5Ż*C .$/UX>8uJ#2Ok0j߻7^xE(^i2t/l[sFheo1YYm_~$~^"oͮxgCökᑣiy|e_o@A[^&0Z[tq+7 lcj0j+it}Il[v:O3/YrOF\A{úu &í8[jfVVe˵bDe#mC C?5ox_|Tu6?[Ώsn{^KOZU襯G~!E-aj""ff<<(/_)k~xsĶA:|$r6K`7  a @p_x'}KQ"w{v(6U)+b|n%τW`]>[u\ Wl,cs·^h)`CL $oDO "2"q烋лq*GPխR?*u'q_etgbiUMm}ZksN#&@CiSW^iy,ý3 ^:')$:lW[akt.AuQ~V?yL;I6Iko8(#OVeʛm#S()zeizZyuܒ~Q~?54/l- &$r/Ў?emn]N+:3.Ok+Pqgi1t1!IJWM*RpG+E}+o5hl."OmMv2=can_yk~'R:-'n졼D}+(((+ a&Ou~ /MGLgQE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@^ʺ~WWԚZM m~^EJGZ?-z=VɼJTk6hWlk|+?IֺTWVUK{v_WQK9N/^AT5+Yno5-MZfդV۷n_߆_K;].WᕶꚔ^^oݮV(K<+Ii+$LLz}]^of#\-:N_֒M>TfC6ʭj*(*k0RjsLX"oȭ8VZo/Il`m/kVIok(tCּ/k^Mo}fc"ڻ6ۻڬWהVʌyY]O3*%_*DYB~WؔWwS?3DYB~TmOAu?u-nom;f~o5}ED%Sj<#R5#' H3g9 i7IU˺Fo-mQEyܠ?E$hy6m.'Z(gg4׼AymˋyMҵ/˸cXy/չO|Qyyq> XǧG}gѪjʱ~Zb>:,o5VUH푶|y[i |$x-ڣjW-XW]w_>e~|=Ӽ?h)o}JKK5)U՗-|vמw۟5,_˵~ݵs~MIocT+y3/\|~o(]]sI[<;}qqgZ4j3|߻].֧j^uRYu֚Lcy;36ڿ+noۨ;s\]Y#fGo$0ϫ6|f+2.QW UuIM+[RKmYv-_3|3k%tYlqU۷*(<5s_}٨W ='Zº#~'5$\}$8}ev4kAr3yIx_ԡ+dfڕ2)7jw/j<ޕ6>$`])&V ?Z`~vVרC%Τw "jA[`yPQ_uCߣ yOa(/͈)iN@iiԊCH\{* k1neh{sHtAuVV m{+l_Xk?ØKF: *I"*EP\p ~m˔NDc^ofMmj2g5j~3u,5*Jլ7Vw)*ur ~li%xjωn gȐQ+Z|bct3SQ#0ND<G&po׼I>]OC2cK~LgkHDb%#29.rk'X֯.dpC{jCOZkJP]/$f1OB_x|E,](ס.h]4~GVJ*[+(m% 0)\/ǟG5@tƁ (((((((((((((((((((?*_+Ǘ VwWZyo!mۣXw7/7Euz_{e;6K;feeeVm>x{ޛᛏ k^o}%g8|e32Ǟ$t3\$a ԖMLIqWsnw/N>BR={?Y6Ŏqk%pjZl֭''̿7ݬyiŧ76}6qyogci5ܟeeY_j* KxGC/i7mΠl,"ɵn_/|;tkZ7şٷK\L4qe][B'm/rxs◂n?mMI.VEh$*be-zCz񥾠duY+.ik~/do4 Xڼ*]I2ɵc_UUǮ|'௄>(mSԯ/KtU9i#nUݵ@n@i%ocͬh-ڧ.FZ5m7ʭUUֹC?Hc֧f5(4YWnۿfVkt_Ϗ[}':Ǧf_K I|V5ڱmg"j<;MxWjZƓ662L;ߙݻW՗"*xZ't?GOkY-*FѲ/ۗxG7~Ҿ-KDoofVVo-Uw."Dt/}Wq^+nt3mf_2?nf]-z,|~,~{+7õ~mg.[Hmlaf-5e]ݮ |yX#@/KnUǗ}ӃcC# EFmw m+9G2W_r?rt?ᨾ-tQ|1[u]cBQ iQ|1[ucC# w m+9OcC# EFmw m+9G2W_r' EFm ۯ7G2W_re߆?- ?OOC ۯ7G5_ne߆?- ˿ [o]_aMIdsVAʹs[#3mY[km3_'mt˅Wi/?iּ/ξ>im4FۣUffmYW[wD<Qjw[~]>,k\n_x~2]/KGׯ}KIkV;7#eVOȻ۫k}~kdm kv]5puګ{fwB4_/i:垷 Y\, \.ݭvݭ]WW+vz$2Gen,y|۷6ݻ7u^{G@Q;kgxf;KI\o/} |jw&Ռnbe:*($}vE-|mk'7^Q6?bl kIk<Ԑ8 $dk>iwz.+wa"22>Uw߆n4,E 3HrÑ6t |O6M;MRpl!sߊ`}]]̾K,g$$o,NtbUqxj_ |a3 :WjuO[Xh bIKLp?PH"wעX\Ґ{P+$1a]6g/aWkZtS1GR:*q]*oVGk n\?bDk*\ZWrmS\sy|v#wWF^qך ijWY5]yZC 7$ 3].:broM,7v7)2GPG _'Lx֢D$M%9O>Wwx'on^éi+XܮC} gU­EWo5' 揵Yl?џx>xSKVh&cPKHwqֽ\b:u.py9h98SYMKѵO]6 .ύTXl]215V^x=\-YQE٦xĺ5Oim &W;܌3eO(o<;;s} nhOŻnz1ה%/w ?ZRl?46tw|nv|Vmχ+㯶·i<3j?𾷥߈5M?-ƥIbѬ}VOmVtk?i6znn}+ joREs{ώ~}k[şi:l׌f1n|v!Skjm4ٮ/Z5Ufi!w*{-x1xÞ<5B~omeF4ѴmZF+Ĉ[ˮx&; !lw4*knU&mWn}i?|3C[.?:v2e[YK_=}_jVpO54m۫=CGftO᫦9P9UeeY#mRR;*+_c`=CxaG~~g7TWʿ^7sz-h: ?kG??0?U1׍\Z?ᎼoEZ(=O}UE| u,?֏c`=C{ ?kS}UQ_*xX.PC: SW+majm˹jVfڥ1[_E}yچv7wG&yO_uqćĿZvzG I뉛Y}V$XUWor錹s>MiKfk[IYYVĿ_(ѷ,kկ+qKĞ"M5 ֿ5dṶsޥAwPQQ\/+K~?"WzEwUtW^PQiir*33m*<5?x>襯+(/_)ka{R(#UU$K`^>XxQmNbV>m~dJcc5VM'LEy~p@w 4+ xznk%oXe\2FG?0= c7z Yu])Tw5]xx/u ncMgw4,>hݐA}Kw/0<.5/./wD=Pڏ0Wߔ} A6H皗.·HW葍^w?+tYUg1p~ ͦبUy k8 9\`kV\d!.5jwy %_un -- zss7y5cPyr ^=L khE{w\9je} Ao@5j[I5AW3y"K& htv*;;h=?&Nxb;0g|< d,CF@Ϯ75&|5㋏\J6%9=A>o%U/g-i_%DVz*HWq>iae "CsXut?f/CH|[[-I< {[ĭ 䞀7uf\j5ԒJ.P)4Jl݃Xң%4?xJb`84LwᏈ<7i`_,ț c,;+c|Mk*;kGU)=<טS9x?h>_8_K<~GcGWW>=^.VMtAw.dU~\6?(ZW'T#h'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdh'E Jdhh'E Jdj9mH??ku}K~X$hku歊x>.x>&?ö6\\髨Mu5³/*ƫj9OfӴ{8y6+f۵~fV+ Uz|&j۴Icw2ߛw;}O"<'ol֡_[V[6e_%wInʭLd}ITftصhR6;O9|#],{o7ݯ/zMZ-5CO6a"ǹl/$ܬ˻jai(]?IIqGk32mXs4kOo(?P4=CRmu /&I>e]3/]|G/>,O&cWZ|Z,j٪*ޑ˹{OoDo-7l*d>/!UkuT.Rc.hU-FF ٖ6iپX_Zkuˍ6vo!˓uɺ9Uj-u_5~4[(<= iad-4b+vYbIiYȳFC*_*#G1O=G$*[' W?x|clz;{?j|+jVMYͶ=~bVݷsmo=]P{O/uFOjPyM8mWQ<_hRK`={|-VROigVs,!Kcp]O&O٭,a<33H_Oͺ(@RBSJ#0@{'[?ԟUx<=wHO0`uE0< @.[YvB6$uGakj6bWa1aWǒ#__NJf[3<1? ˍo'j~1_b֔?u-d>'yU+[{wA0fnqiw`={Z6;a]ޗtG5EWck汴9T#E}zX jީFd'=Cs.yST@^\ e'eGQs~jkAsW%` ^| B\du=a?5`_3O+&_ʓeP<4M!49.rj2ˢINiI9 }]@N HL){-oo1TU,dvյM snK(nm%h1885VĒL!%̌rI=sUk[zWMGjXɠS]Lh{_דI?ݶ8]5u?ğ Ix1Q@Š(((((?>3Z^:Y5kkve~X5fm3Ww-sWxvrHPt,O!n#XdUm/|z{b#/"6XYVouZA% R/}+Wz~~({ⅷ~'zeZ[fUi8UmvM嬏_ Io vE]߼vssKn]ϐ(ldGoxwqwHS9$_;jȪ2jͷms:'ÝCg=r&o_iiC 2G \w "wk*ۙS/t#'RW_揧~oilSTt|ڬʫW} ~VoxF6h[~Ye9I诽|Qkx_EoMšlv6>g/۶ʿVGī{X(ak_v=7Y{ƧQOUS(.5+[fmI}_iq%͜r3*{wT(OeK6j_컶vvJ {RNeDlު*U~oSOBůOYWk`ycJGY43>zgh@~M>{k-Y[w.ͷ^FCpi4sGɻwu,~4D;4dߺ|Mz=r=3X/d5)d?W|$lxNK)#&OF.,n$Vݺ?7[W7(u6P)-ٮZfi摤wZ9fO}?A.:}څ4ͺFYϙ[CRoqcgqږ%fV>f{7n,o֟-Jmv kU*'#Cm^Fo[ommH +9? ߟʏH.~*ء]vݬk9? ߟʏH.~*`r~gk_ Mz/n$}՚5oviֵrZmX=7OV[kvoh4}j$rU?@]WTآ#O *ê,̑eosx5,o/٭ܪyjآ#O +9? ߟʏH.~*آ#O {?j[>f:Ыzu2,4nu@_Q<_hRPQ!G`2X{O/uN,/!1mq| ;Untɢ2TqztF/!#"2?0Aj G7Z4vv3M#M*:3H޺?|Amkⰺk2swl6"H5P^qL'o~_JY2YBz Sc_ʽ6ݡl,5\˕L3']VӭٯxY^L8w_'z5;j7s4nT=3EѤ[J2q.o1i7s\XRݝ}E::]s] u<52g 地nu\ySW16cua>" ^=LC;&KCsT@7WXw55qGyvUdE[\$7\ަɪ$UȮic|4)%ɤgi'U3+?u?|O*u?|O*Q_qìIC2TìIC2T:ğ>i'G:ğ>i'@Q_qìIC2TìIC2T:ğ>i'G:ğ>i'@Q_qìIC2TìIC2Ts1߀~4ᧄ|M+mg ƤrryȭWryZ?S /C/&uA7m$J^Ցoe_GìIC2TìIC2TsydD.-?iG1qCjڇUQ/Fi#k&ju3\h^)i'G:ğ>i'VI> -hzzT_lRѴ-Ff6ffju?|O*u?|O*^QOw}(~$K??~$K?RW? U? U|S뚗/I.VUk/kmW5k(o\uxmٚ/$XYm[]_eìIC2TìIC2T:ğ>i'G:ğ>i'@s*jCkk?#_+ _qìIC2TìIC2T{hh45pUGw,ʿwr׶ìIC2TìIC2U04{nm@ wj}vssU^I_qìIC2TìIC2UX\-=#~cjZ?F+̼ÚVkWZ4{oG῅[n]̪Ws7.կM'\[n|K=je+);/rn<~!i#m{@n S55{nlw}_k+.o~^;{c_jVqM^,q|5z.kz-^Genw6o+\Nhߴ׊<[xUΰ{CI6y|wo}'xtE 5/XB澏ll4k[w|Տ Qn,<;q} -B-ݻg~O䵸I7\47v.w͵OK,ҭԒ3FL|XRmSK;_rIm_?q7 j:=柪IHG`_oFެ;_^,wMpE7[1[Uh~_6|;vt5n>ϯ,2˺ܿ/4yO+o!>yhIkgm$[ym$7UvߛO>M}bk^YϦH|<ƎHw3moꂍ?|=]_Jespg5г}s+|Y~o\?iX4FmJ崕VԮt>kt˻*_m~jo :|hYZrݲ}^+_KzL7&n|U%+C$-.+.? ¿f#~57:l41"i^:mJ 5eۛ6k{kU$]|7KWG SM]ςPԴe.!kxvX'S^<g~l:0585;6jVo:GQWxVGO5-BUZ Vޱuy{'r4Ѵ~wovYh(g6GsI㶋_\s̱~V_K|aMz-v?Kc[̭'ʫ7|9y-[KӴ?jo:MKy42W~VoxᦱxO Z=r][]ʷ51EȣOb2[cF֭ce䷶<Ͷ9$][NCcơy?Ol$ݷ[_-wʿ7zo>%jR|-:OM^Z vBjѷ̭?EC[qxgGԡ_E4\Z7=eV9nT𗍾6Vrڄw:m"ûeo[^8g;;[?W#U4/=4_̫˻;ɣxY hԚ S[\ f̭M|qRJqilQxn y3\GUeZ?GMH5t[ɨ -Yi|\lۣ_Yw*_-b_ch N}VkY?.HUw+|I7mᾏbuk;RPw}1V96i_3__Ys◄ltxh˪.FYFon"e{׆[͢Z^}u>?Ʋm[o'5MOYX45-.kXWY+7m~jd<}%W3Òh-厛jlUI7{U~]|vg߂7Qyv~]7ݩڊOlڿq7KmQtپ4r^Gʷ [.jo[:6}q4:}jiIak7d_7^/oE't"AcyՕZnܲm_J _ᾛw~)RekX&󤍬fVVU"}\~ 7/|xQd[=6ծt*fU5kw^0wkV_2BC4~g?T?>k_|}:[ k,w>M8}i6mW~&\k]? Ə\wPѲǔU&_m-FF?Tg{r}ub۶}l U?!oku M'A+y{YZ;_nۣYk鯅)zwOhg/~G|}]K_4WQ<_hRQDʑƍ$B(bz*ƃkؿg[AsnK3.Yx9:5 RҮm.Nahv=H<]{ /\ݝ/muoB)v: v 1L/VW̴xgKWRAV ׽|(>_IuZ)1Iz/1es]Y 4_h轛E)$K.Wr@Z3|/؜9,SOYYח5OxĞ-5lj0F٢j@}WAި& \o/<9YFIZW0u'$RK9j`CeYt(h\iI'byW5 ].o."Ag 5b itboDHGP]\Cg K< Kwl^GOGLRy=s<_ \t]eCڃs. Qn=G߉V[zX/+~#0VTgE ş\!z? ?s|ץ찧w;3?/B4.aCy/_o[I';W<MT=JC;j?IO53xWS5oƋwu%-^mL&U'a%NS!<|zֆ~ 'X*¯"?SdUubptc]K r'e'e n j!'i_->Kc!F?;#ɻ@?Z{3^x0O-.X)%ݸ_[|" :cm S WNoU&My ۗg\>l7/1UW2+ԯ/Ѽ3y5+qo rEo?+:j+>,Ԭo,c<3y[Lܵż6f}獯.iYy4k"ylʫoz72yc׶q$w : *~k|B,rܻwͷjD2 +O_ivz֛"Ϋ̆O-5PEdWź?;}cCMCMĿ+moZQEQEWyOMKWi kƎ5fm*WaEq?9u9uvՓxIѵ'EH5MSkF,jg@*?kG*?k]ªªQ@O*?kG*?k]ZjK{Y't#Ks'$ۿ+Y:ÛSRu NIiVo]UªªQ@O*?kG*?k]ªªQ@K|'}ָݿ -zo% Ɗ+"<5?x>襯<+5}#WyM8m1_AG|}]K_4U-HN twor"IpҰ>8][?䲵k-cIo[80\0U>nBkgM&koynMdV R <L"Sv??¤O?Qy#z$Џ>z ~|buӣ۲>)"޷ug}N:M Ѹe*ާ=3_c|4uV<7Z鵮tąNrpN>8\^fK v[/It\ftZ+߃n5ޞjhWqZ 濮熌b~h2h"w=MhA#>2k&>ϋ4 @$o$dF.EׁatZQݑ1T04i(unK ψZƥy`gnOWxY65f_i A<+ 돰ۧ>H2# K7_U-p=x}cŗrO^5ܛN}+xAXzw[~C_736&m/W7<<[_ʴ-?R?ck-/f?¡zS\Bּc鋷??¢[v?RA ߽O}j/ ThiXXO_-37?=>>OSE 3~>~*Yy,p1?ZxztzmY*/ck-}PThY[d_,|SbH DXFxwޒ(i^yh>_8~,?|)].q}D ꬻ|ߚ/ÿkZ>yusYkPo,m_6WkzT!_t_x_4?j Ls]I47V~]͹v%HwZ~kP4-|[ޮe|uo/ʼn<4vj[Z/k_x:]|Nkiw^ i5+8dsMgyەݿXO]kڵ|Rվ⹓m~dŷvɷE>$??揲C$q7fm5V #<;'+εiK>]YKeՙfUV]|u[s|5lx_^|i/^.tJngȻo YgT#^xsI'<. >h[O2I#>owU4.z:T$;Y#oVe_b #oC"GmX|Hjڔ̶B]5V;7Ju[kR~}AݲAmPZ3+IVoݿ+W=|FOgf[[~+}>G~ />~="ݻokot$7+W=|Fڭ sZ]/?}P߳O+ZUQJ??/KcimUq3mw|}_ի_ xKv{&oA6i?5>i⯆^4A?j>%mdeVi7F]I۫V].gӗ,etAF\iݽoe=˻oۗ+.߻jZZ+3Iʻ,Y5BW0.ou%w IWt-rm}Pcj-۶?z+|Ⱦ߻ח|.٠jM6N5?O 9AqRoc:M%q YٕO黶nݷ/onݷ^{7˭j{~_7e_9Km42/մuVc$UYUoZ6_ZS7U_/ڗkQݻoCn=6k7~m~4//h>eVyY[jNUZŻ/P^ޠuU.vv h$UZF2;GK6n[Ucjw} y{۷Qǥ Zޤ{w4gڿ{mκ=_Ik,Yw/ʫvUN!,i~?5p^2kjsry|b<~oviiͲP m`n .W7l>&U[W+־xg^.5 e3[]IveVۻj@_xݯZdoFqeό}f־  5E~Xoj-?tRPPi|Ul^xKCԮ/&t~q,+yly[oi-۾ qC\ֵvu+ƶ5)M42C6ۛ5a~~"41fy]mfUi6ܿu~_撷7K\mYWnߕj?+^"Y#uVdܭ6̭_j1<ÿ4{(]KY:xGTycjGoms­2Uׂ<;y7'v10],lWos{'x_þln5sIԑ/KVo̙a-|.Y-H\Ǔnʿd?UHoxo?dgw{۷w[j֋[=#MҬymc -QK[$oe}5u-ffw[_⮓ 7>qET]CRlp0ƭۚE⷗w|ݯ$}Yn/& 5Y7|dm7Xռ6:vݜsGھZʿ/ >;w|I~#&if,GncVvUUw2oU{P\?2_ƒYj$m>V*?7ͻto~}ik}2٤_w4{WlWڨu>Ex\5Ԟ~ e7IW~Z]|Qx*Pe[ϖM߻n9_ؤۻv/}oX} ;V->FVe۷rJ!o|.<k~]rmjPϭKk?27YcWkz_.楪\jzݏ?U_25Hm*w[kQoۣP[_nT{.KޑsûwlWP񞗯Ŀj>(Vu j@oePpyhU[74'𾵡hdX[k]_37&Z u wl,eݵv_k7c%UU]v>5Q@Q@Q@Q@nxk=5a熿P{O/T0ĩj^G`2I<+_(/_)k kC~'5sy$> *]{;=^KIK02885|4-swkr-pDdW@>6b=_LZXҏ2".$gokzWmC-F[7Cӵx{ A5 3mV<(S iϫ_Y['qpV(8^O*8{sx$fKKFy`GOPտi[?<)>Gs7y`d\~˦E7\Cikp& Sצj֓a/]k]NLTE?mx"h877 r6Ocz -+$h@͞9OkǟhFf_D+g?xӺ߀ CoZ~wLg嚷4 w>n#0'/V o{JfBڨKH9PA3P~ xÖ|9=RmN ^"I7<y'8*E~75XIEJqM]_}.<_y9jڐhti̇W^K<4,I<׳W%x3PqŎfkzrxGvMEp[OWzA}+l6f=6z-b|3rAo-?5}3 ޿6]W]𯄵+i6!\A!y  > #5o=\i>nKY ˞#쿳%!qLNWe 2yjQW'KQּMQ.!mdfgwGH#Eϋ>难_/  jtg9yx[prs>9`#T>)<:m9fK{H\_Ŧ ؼ6>}+coBOf̛t-V6ۺHپ]">ԿmmZZګHUU~7UN{R;[[K}.;=?*,9>ei'|.xZP<7k;]I2B\+6mvICeoHoM'ͱf°pBuc]?>"xHt]خ&K_.[9HeV_Xmݵc|x'|Q,ڴmZrگۉ.#deY]h-5Wr/2Qg\ռ'gycshZfYt{v:.}5_ x5m6U#VdHm2|7վ/Ie5mkc%*\7丑Y[rWG1Xb/-vok {`8#ݻlkZ&/j^oj,ԼkzͧZ{dUo1n>j^.ovz5?i>..-k[X8t- qv4F?9H-u5~X\?eff[vYvnos<evRʬyrϧ?i_o&QJ?2q+@xM??i_o&QO#q+@xM??i_o&QO#+W>ɔn~ҿL?GqW?۟}7(G,o>,oŠp>p(?>,o>,oŠS\Bn_w|2ɻ k|VO+UmGHuMb#*ʿ}oIӵ l|Yq*6VWj*+_xg,fKbnk$Ƕ=V#mmz .6h#vho-u/.q+y{Ucݻe|hc+\>|Dקodi.rK|x\xvOO5_Cu]kXRk[u6c][7LT+ŭ{PInAh+&ڔ?`Xvu&ݪۛo_WPE|l~VW ׼]qxO5{huVFf,*ʫw37̵c:ߋ+ ė5M;u_2jVV]37˺1y>A|yggW:ֵ{{ y01]ymj/*fWxN >Hh,vJ 6L]VUfemQ>hcV}zֵ麔Ǩ[F5H[^_^Gψ MxIOԣf_:9Uek_Zyl=G>k/aw 3Cʪf-+W#c°kھqkZ7ZxeXV{x۾]ͷЌl^kKPYeǖ#.ݿg/ ꖾ:^OeV_3"ZAnחt+*I7ʭO(r? jMCgi~(K[9nd6vOٯ!_#ďXxWW[ԭs}o$zzV˹w^otۯoHmצԦP˼8=uom%GD"Q~rQ@|dhj:D7b儮i"Ӿs6/loe4#$eقbI`+ O`iO.$2tcI:k_sjKrVZċi6aĿ9#e [;itOi$̏!brJGQOS4Hz< ez~_?2GĮgAʑGqԶkeZiXm24NNY'樠Nv,]βr`ZxФrl+(Wī׶MjӺ"93I8 ! h=]/47ӵ * |J^H`Hc~P䎄K^%4Io[C }EԒƢpr:רj_umia涹%,@==w뿉7v ZD#.쥋y!seAtƿk a&Ou&3{/Vzũ7ZNHkg>sYN͚մtk'=/z!;>7[_\c+{{X癤[xOj3T'?7 ,[Oo6VFVhUdfUj/>޽l`ueoKfX[+F7ʫUZ- NjT7//Xw*O7w>hO-|==֋Jə&e7?{?k͆i6eסP5pդi<ͪ/ߖ(]>|qin&8ceo3EimR\|@ƃ_^E|s$p 3H߼z6<|=|'vqK+2}efi6ɻUm[vwKm[fY\%wq̻U~_^_~њû?~0˝s¶7VhLLeo/̿ݬ >&_Yxv:ƗɭXŢ[CԑZ#̬˹[UoPg?Nͥ:ūX2d>c7? 7}Al_IS$~[++77* -7-,Z8t ̱i$Uo!ei,j̪/פ|֡j׺C\mI{WdfevUz%9 ?O| s[{VKc|{Ymy6?KOTWM<-Yǚ'<d}ME| $S`x4TEi Dn56?KOTQ $SWh>KLgIڧ*(iʊ>Wh>KLgIڧ*(iʊ>Wh>KLgIڧ*(iʊ>Wh>KLkXӬm6k[Vw7ͷn-~y:ψHכSW^24l_?mk4 ÚMe̓^2̱䷝c Wwͻjwo5R.YpjG']?= =Ayڄ$eܻ[|Wkޮjx_Ѷf?ښ|Q+HC$*6of_cZKczȣ*ǚ\=;Kk}\=vTW @5MR?;j+R?O5/O5/R?;j+R?O5/ChI~Y.j(Uvޮ€ uwZ^I\Eyq&&mZ.opmU_^No@Tյ^K9F CZl_/T_]fvzj5ڪ |[`?&^NoO)b?w,ckVX՛vֆF˹Wܪk;#i "/RK;{M7I k7$t37ʻWUܾyA9M`?&_g2 4awywv{|wU;k+? ~hBkyt3+G"۹[ڧ ~hq4_xwZT>yok$?Ѫ$*3WmY`?&^No@ts߸3Z+1f y/@c᧍S[<BKJ^GzA/YJ88L񎋩úޕGsxDBFp\ǽy/34kKHMJ8NnRm<1T>Xb *_`I6oq> )Ɵ K*·vXdV63xX[V#) Gw8>l*p @-Tw#宭iG{%KHf@nv)C,~NW4dZ(AZtۙn"KyD2\V }U[?wTMZ)#yaG~>/Gu=BOʍ5ڽոŦ R7"@KXPcdOe7_<`)E7ssuoX.crOVS"xW/4[OVVojSƅԕD2]'ľ*{*SYGĶ5+:B<֍fڬJ2WH.|#R۾x4m~ ݵJ\, F)~FGK?`jz`fYKdh)]sXwㆊY-/>K{6q ;GZڃH5s5_%*$+b6v=*?c{C> ۜg >8x_9M:\}0<2 N|$-+AOٷǰEk" TbQ!*;9G$ [BkC^ Vf'fo+U}9ȱ]F:V-+ մ֗-}^[6A#F M67Ƹ·fj <&mFv*5 Bw'iw lE|#sV]ୂҜ?c2>x8Q`?i7'![?,Ī?{_\5㛫KJLm& n;,#Fې9$6VOgo|kdUِz"XwqZ-Ī^8͊n`:\X4ӵ /ͳKտWI4g`n. fɦ?,#IP+io5IkT-qݪ.kj߲M 9x& T[$R±S7%_XѤi~Ġ|g]]+Z-%wvS5)X *r+{<1]+kcLѳ2Hpހa9l-|iG1bPr;*?g>٠C,HG=ڻˏ-K#DX.e&_.P˶7"睘ZtOmM)vvq㍉3u=&W[ٓ]^T0#0lr&bzW?豞IP:?ޯ>jIk_ Ay}eشrL;}o$v5wm*y[I&fʿw{߱?&'B$4zxO?:q?߸"/oq?߸[ZKxRO'Śvx˱8fUXfej'cqxVׯPԵ%Zi8V8|~Wa;;Ww?w?v+cMcMabWw?w?,Zq4}q4]TU_?&?&j;;v*DIn$dhnWG$m[k},[{}tv2w۶Jq?߸>q?߸doCXf}bV6[eo.5o˹s|~U^q4}q4NTq?߸>q?߸EUO~hO~hWw?w? TU_?&?&-QU~q?߸>q?߸EUO~jH-䈶&_QEQEQEQEQEQEQEQEQEQEQEs&ٻ:\I,R2 7טƱo,f8.s+m۹oٯLCּ>7j¿<a5I6G4J>Բ\ͺO/ˏn˵nԟ?+:WɺlDf]Ǚ[\_,\nVfXv˵+|?7dk^"%ŝݶ5ְXZI#_owޭH>WI3u{HѬcຎU4zhՕo7|?7uݟ[KR֤;Y9/Y_1W\CkZ[Z~5M5,DYGF ն٨,j%Fcp8=̲Bۗ&ko4#x~Zc+[.t̲3}~[Ej-JPDfZúv,.ٙaom?_;]Fq?gn#[m+B6WnWI3u]'xr/־)ͪxI'JhtkM4F^L/۶8o_{ě Yx+  j5s*- 7f/Et?\?q+]S-}]i:o6ZqȲ,jnwܿ^cxƺn_MocI,_&/l۷{,Q$l+Vvr\q#G7$mrmuk7~"|XR//4ͻ[}wm~]{?ULZ[VV?֥_جſ٥5Ef}|[OXϋ߳ZPgجſ٤5Ee|[>c>-~jQ@bfV?֝+oh5Ee|[_Xϋ߳ZtPgجſ٤5Ee|[_Xϋ߳ZtP_جſ٣V?֥+oh5Eg t|cp桻Ӵ|ۍ ,?鑮H`υS 1\.CĖrBi IB` r+ѻd `qᱟҁ3XNkzHQEQEQEQEQEQEQEQEQEQEQEQEQEQEɴ א6ۈl6*s2~[iMyXnivUo1]wVuڼoj[cxn2 P򬍺ݶVe_D} o~"isjMVI`o̿3F|?"O*uO~4#+^]I[+ywC%Ůi?|6߽^{fxLmɏQrL_6eϰX?>c<_${xCԼ'q-VvGnuiMn6f#eݻk}/-| x+jWW7~4ZmA|ɣ_۹~@sGxźOek:\bfo%Vo1IWUt`HT3nfẺ|7&-"I-k=$#Kɶ2̫vХbe*_t9*+˶?<Ơ~?<Əo~?<Əo~?<Əo~?<Əo~?<Əo~?<Əo~?<Əo~?<Əo~?<Əo~?<Əo9񵞡q ֛gfi9cfVV_w˻-p~PP[cmFJەfo.yhm7VUV#PeVUʲ775X|?]+ͼUڿ,?7ʻ~]t˶?<ƀ<M/Rֺ3^@fn]]doWsnG֡[^ 北P\Klְ4p.Oo.yhie}O䷒8n'۷uqwRԿ>j[Oǧ7vv.yh˶o ]jKO}Id,z{M/y۷/۪Ě6-՛9i.-Z9owmf^m<4e?xxCq3n!]Ϩ}fwnڬ͹Ww=S?yj^|3ԗ}r||w2v?G]Ǐáڦ ľLH~ѪK5I"ɷtev_}٪OoX'ԕd@QEQEQEQEQEQEQEQEQEQEQEQE|Nl!m<,\v*&Sސzx^39#E>ug!owbwD:3oxn%aNZQ?*C5Z&ꗲYD w۸ ^{焁Qu; $S/GVS[zּyuw~]Ǐ 讃.yh˶讃.yh˶讃.yh˶讃.yh˶讃.yh˶讃.yh˶讃.yh˶讃.yh˶讃.yh˶讃.yh˶讃.yh˶讃.yh˶讃.yh˶讃.yh˶uK?6͛g!hwwrǫѵFͭo?c}n3A=sG]|ׯe?xv?@/'nk?{쌰;.l~KY:DMf%GپVh~_no.yh9Z`H],MU_UۚՕv Ii°/]YU״e?xv?@/}ljGH͓wc=[wxfMUcyVEmw3vv?G]Ǐfotocx/images/vignette3.png0000664000175000017500000025451615247006660014730 0ustar micomicoPNG  IHDRYiTXtXML:com.adobe.xmp 0 186 230 \eXIfMM*JR(iZHH02320100fotocx-26.4: Margins: 3 3 3 3|z IDATxxV{Tii+Nwww G !]֬wޙ?v}Go>o9|oڛs5[o._BNo70XX>x }i~OЊ5E ќ| -3HD, 6(Fdz V|' 8)@Pr -0l4`}h&DwI܏bibdh˭4ysYň*R}I.Wb1W qTG.,!XE-U"Xy;^y䙋 9l0#OsnЛ+_c݋ ŸQE \,}=|~^h!>U"'~J)\"$8xds)VuBi_ںK *tlB.@$ 1G:GDZ ) ֠|&,Z;(@uvO+;SL1 È < #ˇwl [3:7[<^&h'gRTdjq ܿ|d΢U bDs ;yp+sLRDŽ~XBr k6n<%՜]"`ݩTԳ@[Bm̭FgL ֲqVT7ڇo>֫>wqJk;T|< ' Zh3/x9<l<7#D6*#q/nEu]E//Y.RZҰF(bI:{LRQ%*Αyl4W|2WS^%Se'U ʚF`|DśkLO" wC`KXoPYsiB`L5<癯'> <RaO=iZڙh5xpL=f晍s^Y7|rhrRp^W*/ڽK9_re349YdJ#V-(Ԡ]"/["/sU%eB*Y:((n D^TCK#:EkfnVӈW6}ٺOw`^M$D!_EUDmeJ[y|/>v8 /S~N 28\V҄s[|a,:ςM4#weSXNQ~4Is 8c#gaUCF (Jʖ*+IM SYlNPL-i<ʥ| ү5h%v'D' .~NGJSXRmaa :wb(,O >DXVY˅SSLNQVUI>U@u-RRS)~t R"mew^== 1# ww :1($j_+Qզ * $&@/*.-m|AXdÒ\bt&QW )P?ʚRak„M]s4}Ϣn1/J^&ӚSa-EJimyZݟX} _csƢy%1Ub 2aI H4U3Xʨ$ጰ41+1Z"F ^PĴ{yN|4D}7i"JH_EJ [AKSX?r,b: yjpU #a/n!Db jTA#%VpK_v̀K,\UtxX޻▉nٸ蚍 D](Z<ƒ&zV ڛs#EqE|H..ChE%<%֔4˾ΟE7Z%g'~\XIi}$)"PJE4Vp!S *za+~ X>'ld%Kso-M).MeQ[/o*3(%9II`#mJ\b>)]TJ[rFA%0}G1IE0%g2q΃2ht&h喆ix3p,TpK d\wOK櫄ߜ_twP]]j,$<-ϫMc-~ I%!qkDeşWi_YIlܧRPUak:_Sg8S7 ȣdOXuEXE=CYΗ1,@-Jhbڊ"A/BC@lR? F"Ha 2>B:DZx( 6r 2H+1c2RVo (Jai_*Ev1UM[,nx%qh64b,RY\3]E@9TV>QY/|)9tnV bqHJt~"H5/+~lEܯ"-/KXeK)(+sueaXlQXdR\35%$@Z5sXmitX ,_yN2=JDuEquAZQJQ8W) RJ+-jC`=ؑձc P:2@`#QZˀb6(TL+[X`NPaX\DQ-y J*@rĶϤ)\ x a+yEW`\aQPzq0`ADŇs&Gˠ#Re (ZGR-+E*xUg{4+ߢk&/),bJIIEguUxn)ޚ>t$Vo_&ث^_)`ʐ.Q%TO iUR㒩*m ,+Q w, +^eI*<XʃA$X<@ ~2u9)PD9充(*AqMȻsyMX- ڂs&|Re!h+[yÊ>MosUsB+i0| H3`Y(䚗KXl~ { Ҵ[-¢QZzڊ)lTM V%pY֒_<&* P%2hjdlR!ʪ,?+r,̿juw(j(pEydU%72`Z .]!\D'+G1ɖX, fh9~YJo&+.+$+\,tX[ˠ%yr ɀ% %%E1i4եB"-g?/`3I{zaA Re6bfI D 6S8>*AAԡ- &)m6f#)RU5WEz,}Sg֗p$J+,߅:Y9D < V@X8Ϊz(7IU"lG*P(jLcp'9Ow49gӪ TYkV\ZI1- \͢=`ŏՁKIVܝV=Q]V^`SUVaUGH`D.IՐ^$^`AUrb+ueTOua`;9Vo`zVS(*i(1 ,8qi%r,VL T-+*E{1Xmo6l3q1n>%k[߆3HpA-I̥)~jElRq<HKLEfzDɮg8['&qqP 4@\ij3V,#Zj6JK닥f\/tu}c tѕ*UL7 4HX_])sb2Mx{p c4X<Vz@h]cGdPH[%q*A:`rvFǗu?S(7^]P6)XmB8?YXr-;Io,ȱXQXɿg;ZV9Ep<,}a⤱1N1nBhxG?I+SSZz0!1& qIHO@vZRR8Z.2Cq'OJJ@Mlhj-GV'2鉒Ѧ$I.UKؗL@#?l5K7E+i6UR ]HVR eR ;8XCa;uli&CZrvtRaofl4m X1(E7Ƃ v%Xpp=Yd撡撚}k*QHU,&#T76UKsX8IR>&hKI2aX~sQ]T `C8yiYܻhvl|ؼ<*-O|~nXElR2/?9> FJ`$T%o G6%`y}SЀ),(.A)`j֖ bK?Qq7- ;`UGQV֎[4E]g)!TG&_ d DY}9S*IqDz70c9l;{n(;&i<,&N%**`RJhץP\W(W% ,ЪU%◁^U~"[R(i ܤI}է.^Cqq#5\/fDb G~ 6)?5nr2R/jLW, @sZ7CpEV,XMaK,lGo}f}X%W^8=LJChêܫ*AӀKLO+5F+O5 שJRWk┉#8t3᠕'7ˆ{Y­&;i Fن톶wYoܰ#N=RӷT[X2N=&,>JFTT|U0VWT2UG [ غD $9'hK.^Sd<yӉk.fZG+2JLEEW"ep`EBn$cٷ;V1V9aI(9i$XN+ z*[1uDau`_K+uÒ\sXV{uF.;uIR@.dhW<3フV`u;gFX aSXڋSW)w L\`m3O:Z%aT.Uֻ["yc]iB.*TMIQ{e =js {ác8~ Nԙ 8et.]ǭRIsf6a(",L( sE4 E4<0;К (`oHu1>UjOÖV`QVhF_Usn%'~ iKH>II( [X}ݍvײZu>&`ؙ2e֮ކia%Xr;[tz=61kWc1zJ+2UVST1uu`h*jJNY~4'2:j9({N\q!L/[’'CHp r2GE6J9K0*‹"tRi#Ni$ԕ3H&n0( 4Bd6[5j5ź\a%O` J+VB0W /J6};lax?$X4!ף}hv0*ZuO8f6,_ ˖c@no 4i>;bX^9v,6Z9`l:|6@t\i|ڬ19cF} G M`r2/Xl>prs!ӻ60<׬0u`LCvˆ0y`;'wKW aNN@#5|ܣp>X !>m(`%>)Y;j`_\ue`%$tB+a$Œ-g<3 2!2E~MsL[*N ]=Di[аpj47@ժо]C¤1ow;c&1ݻap׳z>޻?tQc`30N]SK^l 4 iOz =*4y2\a5ŏn\ >3kq3Vs" 6.\T،Lde2gzF50a= kǀѿ/߬5k^MVs1vP?̝<`˚8c xe9ԕ2B,Tj+Paa>y!>k*'wޠY{~$*UOY)Mbit{)A*%KdmsbzJ4sYay8m3 qbM/5Ъ֏X{ W#F֭Q*b\0j;q oXqۼ.kZbF?;s[9sw̟c&ch֦xǫt,*A"? *i,K}b Rj*i;fJi| XQW-Ă ɕekSFuZ{VЈi=0w9_zDE~YMR\gԭjFvѩuS ҙu|޴fvM8f5Μq4.݃ g`%9j"6مێ҃uqE,ܸAFVXEHu`)/+1*e.> nC p.Ä@wWXP ڶN5t~Quk9 IDATIu~zcZ1[i3U|ܴ 涫ݚbqX:V cAlؿv--_Ʉu۞x NuQq/V,k4B|KO{XT)aKVW_u`?Vj=yeuy7sRg/o{`23݆/DQ l'Ԩ WjA>lΜcغf9,e|mϺعz5̝%`i0۾in:ǜ1[_lz@ +Wo`CVJ!#/MnYm"Iô l) ?t hZzZkWF0iU 'T"f6.YM*`Aբ 洫%=cX=caaرdNǝ+WxcΆ+· ]b5q]dU %\ĕ #(qi`dTJaKt%sFe(wlZYjoьTci,b"Mڃ5g3D]oD/ˡbjTڷ`԰`C6;`z8Lѝ{oFZD:ƏŎS1[7{ IJu;1g~ᬢb4\np_4X@-ϋ R5-͙ fɔNШF=ktZ]5+O0OV&6I)UV&0euiUMkaVfuZc֫ fţb'#Tt7x'$NxQER9Od 8IٓKhmSd"?׹#wJXaKV,7 TtI]ּ|m|ZfŇMՊ&)Y~ևPJQ>r$MXRQkN0q6bڒ*Zn+TZ~ +W*VAFMPN4om[@Ν1o/̚0fc9ؿa3;s2[v8N ]bࡘ=k<1_GP -2Sƥaǿ ,XYo:;Oxڸ?U*_Ej?O0E} oT}~.TU06_oX1k`Lܪtl9`fj;6m}L SN3ƒ#n gQ %"91 NdEI@q0}A5YUWV+WVboyQd֣ V` BY+XKρfC/a)`XU/L`vxeK_UUMn EX&*';هJOA8:Ĕ@n#ZFB꿢\KW_/ߖEy[2Z[4^u/_|^E.?#a>X4ω+p);udUmZn7l}`aX2v=chzܬ6Mk(e٤*FЗ@f0e ,{G6F緪5ĠߣOo0Uc=w O"aMFvz c3O\֓ >QЏ#a)VR:\g7 nGC*uj$u "3G[*梮r(YhBᲜ4J"ԭ7ܙqfR&דTN)\/W9_}5{N^=Qy~ol97_ן+X/?WD_chOk\1BSƇ ;yHrqB# lwNꕘ7j$sqn{-4KrWpK.ia ҂g9DVel) ?c 1a(cZQK=`зwoal_1YM gu4#ѿAEat`ÀNݧmtctS6'p~ZD;CN7bPĤLBԠ" 1Ip}r7;ܷWVܠg+NA' V?U J#W4h6t~k Vy`9֯~ ]Vuc ^ȒWr(Yd[ִ:4 #2Ť+;}d WHk03ֶX8ۂ)sGX% s|Yo?|_}Zla]*ukٽplX;HtFC$F>A9_~?~ܾ0ss o #Gy#.R"xY_A tY|7 5g&05vlޱ'L,̕!\9HY E+1QU6Ɣs),.†M1STsK#0kXo,sY5G ~/t,9:Um}eCa }i 0-1'FW_ƚ`d*ޜH{"+1 \&4*>4,#0&TX\x-O5ugsXnY"^jM,Qg5($ρg zii`EB ]sP(m 6*/&UwN=F})"~o) ql=ymY3,DC1`iP+W~oh~g />?j~_*|uwU)}pl4]5C[ .1,{HwB(i[B݀[8=o\K V27a ` `e$孤\yw; lܰc:’aY1 +fL 1OGu0Qu_AEׯ!u*oApe;^Lm+y`?ǬNphD\ټ w͑qqGQ: /E"%9\ZƗn+r@7[]sJEqUMnA+JVaQdGh& +%VVːL6"^/ {}fIt8"12-ċLXrN*zD+ 0ؾ n0kB7apuP{ 'IMGFFB F_k䩻s(qs^;J] (FT+wE}cΉzX4=sJMZ:GMuE[Ij>ln)ezF2䂍GNm޷3W.J/SG`܉ʺ׎ۢ냿Z7_0>|{Pr9hZ6Ąέa0N̆;-07F9Q^:d|N*-=hikFXٍkлy3,6K V`-~p]\7(qi`dy 2sCX pq V=1ew Yfc0O;uajĖ?t_J;AULoX9aVfXԳ+/x2mKdq (򳧕@7x#9)FHl<,M~TX4ݱ FX%&[pL]1~FVUʂТ*)HA\zW1(PŔ;T4NY=ëu8?CgceN!c}htć ̧/>B˺U1gLaӯ ֍3,?}> `jn]0ӣ Xt2ʿr 64;թi#F`̰Qo=ӠDxưV:7jN.]Y|N,.haRgtX38wۢذp ٽXߣw;Զ0czڪ6&\{OѹQafX:gŲ=w80K;~8OheGOu1;dz}Xޡmp4<N0xt.Ӽtbq+*Z9E3H39bUvJX2~/S'b^vXҦ1#bNZsiOUaW`Wv Yqo1$?rFcܹ q`D4PqmF\G6 E␟$ħq@}N8BʠS8Wm`8nn&dJ >2B,oRW>ͭ.bpٞ_*oGkVtxXU"i4e L#0*ξ>x{/xᾛ {{"0Ah9#,lfbƊ0k: ڸMs"Ve]2?2hpwVM Q]>3t˜fѩQ":x`JW2ա۴6GH}jkBg/*?\JeQ{3Vf_*bXSXOXut6DǼqxzl:Ɔ^aЪkà/Xڹf6aJE#k3ACyd<~7OqnNe׉8e qp||i679IeVByw*+ŗbIJktoBi-6>EeˀԘJ:zWk`NI,zc}4=7jKߵ [ctIQG 3ypT*nLl+&fWN12{]С;|3n˜֍y[@޽0`` #Pzʂ`mB$b{VoB t{ʺG#y KaT!\b)-\̉ðg@GsP@}L9?׻~.֭Y: ֏;`pFI}A'`sdlqfL\ ª>m0s_v,1s{rzNի= c =_//"3s2CقMK$VEHe56&qSrv + +fqD* %hIOVWjEq:l_VڿOڀe 氜lm) O7+s0cqFkD$Mtzrv AqJ*s$T4n 6"㺰kk2EeIW(9#k;ub#gL¥;ja7{"X@hwҿd<:g /~ #g޽2rJ1WWL*ilﻷE7s]B4NV6%5* XMos_n^m%ϟās'`v2.3}a~:rBգw։.v3]|Ѫe d&#.%'tf}6E>9 TUSUk*`lde!=#I /ǝ.xv]fa{3;m7b7ޕۗa3o j:`Ԭh.ڠ wz3w~3 V 0nuӀܷ% :܏HVɲ~XR]Lm@^3 8ݕ+Q8e}:A϶mQFmTP_|6lRL8z5-;uLg`|O^?3waFO̭ӄycT>۴gc=;̞ī'FuÓf'`i$`$ >)PD42SbSbi:'t(dA:Da}liP5`MNԕ+'D#BFH֟0Hw'S6p.ىC6;px;q!_m-Fv{q l;VH3hސ S&cX2b U9wv'AOsg0ٸW,[h%?y  ,f*NT(38tY NڃcvRa2컸SW [a  "l1\= }"%rRM-{Gp r;q@bF &9E8KT,uL1 )6+'=:A~ t=N X+7繚)<٘Ĭ0|@ЂAh L4KFc);Y#АJC'D/ÏCU[o} u*T@ 0%MᒠR !Y.[AyNs-aI&հm}`*[2bճ5G6 ژQ^ХYSnBʕPoQ7qvl>m{m۱f쳖Ǜ&މcֻp|\ʌq~t:_XeV?~:5k' r+Xbh0nVM|t,̜Ç1;CU0߳'#Ugq6ˎQQ(J@!'hHy`jv&sU8fyǭU4wf:+LZ]4,1| ,?0KNӵO7|z \u%]|LvJ֋`)6=^)mzN)ӸPrlV}mjsFJ63$qfGxW9+q Cu=y nUm;:Y; 'Āqf2Z&`-MSѹ{ |c|FXk;3ߨw>Rqz<~2]#,ƚgZѻ1 1C%]ӻu"Ll;w_uX5<{ V@ ,$R P E0ΙYn7g㛙xq\#{u|(+W*#p4b ðJ aҕ,-F^]0tT(Zs`aaO0!.^v[XC隔GP gq_SO~Fe۞0n'* z33ms9ki-Xgz!?%QT#]*:ݬ>͙kx}>>A/<Ֆi\|?~=`l:X xFg!cci^NA߬4dKLS9R/@_}5FمRVɴNZ\sc}p/J}Z%B x~j3h*:VT߼aUB6xY^04e$`4/ ;b 0_LYtcklj0gFvXlY :tnE 銿`̐*ef?V,B} R`XТ֙ TCE,$Na9cpCm9URP;h).:b\Y*j,ĈQ#rd{-ٷhӃq׎ܯ7CEQ?|-\#(KŶ26ڪceX:cCux/ }x$C)jjl`>De"ʀv0q YVtΟz@iV#P6K5aÁuH$.ҲfokF8"b3֧ t##Nd'  {#?mB[nhۙԗtl}ztH KXp3$ATAEx:! ;p^}8z`?P\KTxp?cn1Gm-8TZG<]T6ާ:^ z\,ɜ=t>\Vc.tl5 !\+a}86Ŗ ж*+Vpwن,zxDZC*d L[z8^Yk.rHL`O?4$O0Q +a_+YGxCli7R}kP#hn z-gUCe< |"{ǘm%\wT2.iLfe#W-.U N„ʘ`Mo8#H *h&bh(!eXqIt4g1Րg8/Fa*$Si֏r:bROظk`2܂?^7#%IA[as3Z2e! mЭ.ppX- ћѶMhINbvεzj4SFdNyBHDjD2/>{we 51hp޸Ooh.>0G$b3۲Nm/cO.<ܢz>\ 5\eP6 8eb)Έ r ?w=[[HIuv4Ru$d40^K=~VWs(,A@MvB' ALH i +~ NȊN'zwӥP{4{3 mLWKY &;Җ0^5uȒ_Z!9yظ[䂤Vd^l6tDZo_lB+WOVU1Tq{YNlth]ch C{w=1n xqќIXP iVz:禧#gfff8{'jHˏ 蝌 e˟Ll}9q=R<9GktDhشö:"l#M:1-I$NT\'棪(H* ze4ëx>W f_SGܧ2rݳO 7/'WKF6⿰Di;}Ϟz:.?s*@Q~ *Nc8DSMt0wkb""{³FrPMvF&u :س4J}jјm\Dh-$$ి5n!vng|D IDATB"?BXM hhamp [ ؠ˛эqΈlt{l˝D]7v@fo$`9&ΟQ@i~ od۷@ۮk?n:#P]vG]0/KY0hl@ 2|`nIGmAqK!M0'tP*rN1|w޽gsQ{{V(O 7{ HJ}G𖜬)]\8j"?*v>눩9C1kWQ06 4{6FRBrr8IG wpZy@ 5 k7_PxtG2V zfo fXne vez") 냹VÑ9:[S^hGHk`M4]#}*Z4y)&aJރTХ\t5 `X,K;\)*mE.Wk5b`2P"iں鴒Y2A4p b tE'ng/#d;cP%T`44 s骨:AZtaޮV{,/]c 7n'4׀p2?db*E%J>|K|} "aOpCܤs+t| 7qꯠ֓\~uT-+NXڷaО. pr#<6$c±H]+Pt[% j{< Ppn/"JjI<co([3z6qY!O~T0\UF,tWm6Ͳ ugLZkSL*j+ਥ7#8AWF&7Ή;r\`al9).Aы[Ar3b6M#AN؞+z9%; Bwqw zPz*A߾S1]0y1YQwDz_>sħ>r0e])+%jxy2ߌ{ 񆾩;Y`\mL!`,,Ww70qO?\{y簷'Ɏwq)ׂnTD-gz%Y LQD;Eaw/D\&N磾 W*p ^Σl>z|ќ)a12c. M~:`XoyW޸y6|#z j6TVTաT-ȲHO~ͻlq!i-cVv!AƘXنD_ 4}64v+,>p |'F+*1{dǶ̌Y_4F5ֆõ׻hJNDq3z8 [s۾ ijt BMCE9='h9JA CbO X—oO;7,[MY9ť=v Ʃ9 r#ѭXF[sh7sK]^=ƢIl,1L$>UD @%A8n{FIgy ͸ a? -Bc ߰llͩKU$nOG51SZUʺZ Ql(6G9rɳǴ&z~+iiH]e 8Gu =`E!`E%XR5 n\5a_BbXeZ}`'pQv147ĽzEN1t(L)s o\:6ghK(mC 2Pp5u acɅM,Q{ vcmbmau9mDfaN98 ?20f%/A.3e"Vw@,NlilPNʄZ )Bvx#2|Uu%r ЗϨǰ潅 4:m&#*-'vadlkv쏧]P" Y[NָŒcs]\D>#e<''L`;ϸi!,w "9w+_`rk֝ʺ&%@K(<α{}PP@&ΚGx&CE Yu.Ay0E3XLF΃)D~ ӲW?q9o?)!j}gW"fc@'y%|S4tf1yCQfbG.Y7Z? Ep(!V̱uC/X.6`觰}W8uooRu ^'{1REIY 0l% Q 4]({.64e&QΩ8b)L:LAG+Bn4@4;d<A`_P&<}39.@h~CTA 0x/"c/`7Cvb lܖAv17qi+-Ϡ@%Nsq^PlT)Jjo ߧ۸qKK|\ #MSrQOw,gU|?2v^zǜ{ 5`a3JqsS'Py2/%0a7N }U@ue a~rj[w:m{X]wc>MoZtŷ-0턿4kK+h۪6VvBHGƎTDлDt8qs<)f"9ߩ|(,C@n?!y c1F}qFA\IVv0,aQ/{'ʥSTq;SrЀW`r}X:~w>!˲b% T/`=d * `EH,rX`/\ UҩT%'NpmPJWLb)hg.XE+a`lVTM0v j{-a$d0xBLYyH-<|Ͱ;k-Oelڌ}Gq6٧10 tBu1E1j4^lm,9o@!B-ɮ_gh[g: (PDGW5]l P\pc`k 90SJХ K=FYig|a|77-:r;[2Zwa;>y8QưAܟۃ9X[Z6!X3f9CJݔЩJ$` gxCBPCtT" yqHp[Mv|KsC>,׸G} Νǯq+B=}-._OyO_5V {oHKVVt!STVtE)w¸I*;i1*3%1[j X ,apx-4uAS Xin5F+Ù7y^"` <7a}$ 9Kʼn 1x=z a*Kt}F`+쳎cfTӪ7&,^wηty72nK9l=SJѼ K{ձ.~G8(30p-CΓ @P(C%{ ܶuC @ adBDEÈ؏0Z#)\c:-.>;snN`q=? yo?~\[)΋7փ2wԯ#Z~\:!Y"S:M28!`}I &d*CbYXD[e:+峔 K¸A >0\v2 ۖkBCH4)L mx졧m+IF(@ iF/PO bw+Y*;+緙aT\Ľ@*{Y4 s-Zfr0.Ƙ 0gXRh5 ̌Ȯfwg_)B| uށ8FN1b2_cP] hOT̸GcEAaj㕬١]8E| Ay2<&c _}i! HE^9hߩdxAAk А=KwMap =6*QN͜qG̈́W":QMVvNȐH}L,&H~ fqW? 3^ V=`-LuKGvʮH9OM"B,BbVQpj6t$įmYIRLgy6JgWvBcR O:ViTH7qQPWՆYu=h!; ~CjW ͭSv)y76ebY-]Z=!DO8CE#sAog*Ps5D,Gaih{Klpv$`=18)[ǘ1J 1'plp:;mrIYyt`cHCϕ/(NZECйtwBC|=g z}mO8H iS$B!y"p7Ҝ]E@$Syveɤ" ͥ8 [.6 ]G\Q$ƗbC,sDbҰ=HL<ʜnFpxdfG9 ~/i`[i<΋7܄ׯrt{H0~3>PHD8,k[_w׬*m&YUUĢ_VUڪRg ʰP^9;\ XTRƴi| jZX M^4uaDԛxZb TX>lgQ:i'K,՞kkl"Ͱ˱vCnsLYe7@p%|}黶\үȬ~5ej9CmZ"$ˡ0:#F aЭ(2H:0lB`M[ IDATҕ̽؇exܡH襈CGS\1sVSi)"nXDLg ^>;%f Gf܉sVrE22=a!.Vy0› wt }c ʰ`Bv}Ag){Ee+@+k\.yطae`^S8,w" Wׯ~1ȾqÑ2JaϾk_K !Kԟ0k=_=291H}1|X޼0Qi&Ncd6/ZuW[S N֜35E l:ɕ{;b^BNZ]FvZzeNd*đѻ1RoúL̥ܮ\C?P&MthBOLr2C%Я3Q˳><`/UUϹzW1JG+c椥TS9ё (xljgwJȐpu(ˋ q=zJE!mݷݕ"=i◅9k>i. gnEGBG׎LpyzH._<^|(fpL,Z9yC#p^gK2veXmmGWw8vw,+'/>KG~;{,5MKɪ}WG5쾕]~XYx,fœK08 HǢ4Z+`pBt = ߬'=ܤ?LBHt7r&–[D0d!` ^^[% zz7f4o{H0-ɲ Xp5jF&[۵6q=9J6V[KP΁A|. ?t?ȩ}hmZuaeJNP*GIU^-!OMÞ{z MaX>V1RAyCĘxpq&`_\;Xo&鸺$0V3ǗEmR3C2`KA* ݠo.=c f/gPdomL,C8f6%0 58C<5 =_M0 jcSȢl2.r&hvyNx¥uRWvs3$+TN++B8!eowư2ʾx[dCO>i8U&BmrHMJxPrs!GR[GbAv+v~N7G|Z沃Y)ES>Tp VhρN]ubnKZ ǨdG Z%j0&Rg-Rup&˚Sۡ@-ZaP3纉X$AtMT@ $?YVTa#M[47Xe(J ƳS?ogWӇ& s%'J>~Ö쪧Lk'DM:ޞ! V7< 2 @ vas"5ȴ NclKxx$I麉, TDFlMcb>C Nґw,\xЃpP1*+8p"2rr!Q9ORUk.6b´$s毅72$e|+])RUPY_6 f7VI*U%P88oފʱX*N\I/@+X'xZpx)hwpu_ٳgQ]]M ._\R}i۷7{r gw.ǣA="3k(2C!.6޲u':2]TtΔuhйu{ۡexmN$QO-۰7@gV"-1h&Q0N+oq`=`aV34nÃdhv[7)ᾑ$DN})ұ#+djLv}9 M]wg=7`LjaB ,3=;yBUiK,SRxՍOPw?pA37IoȀz".]57~Bn؝=,APmo Ϯ&@ opkq8ᧀ)]kqwOW 6OOG|`HE`_z32 C8wPQQ5U>S /®3v‘2ĦjkIQ'?yrnXZNu.`tgӡMت%%zͥӢMk k^8pfuL6S[J -!!֘3rژOqEUs$ 0o.u7հ)[_Z@f͠,?Mrp+‹◧yqc/~gYiE*gt|am+!q* Ⱦ)YOTYh,ש+[s>GX ;'rdKM=Oh2D54a@sfNI c:w,P#DA;`Y|89sq*KqSs}M]'ÿoqKgG3O`u%q -Ktz |v-)ϼ7+❂XćeG-1hWʾO]s.nܸ!kMM2A[WLVROϟ,*–Y [Aw;ǰl0|"+œ$ Blk\bܶĦ["rq OLpJ]C/ƄS0yt̞s-bjNmXcd*45t2Ju-td`Eo@J8qx)qmͿS qG-xQ}gA*6awx]ʌXR#mo/v٘9[(n!{2%3!zc/-m7v/ V]SKdmup?-dN(e9PXBccg{˸+TY-A& KB`pmǹp n{Iy?҂=G;R0AaulUwP}5ѺZq~C%?Zåpau9}O8Y}9{0w8eneJx?Kj~bܴS 2~}>|`iׯ_K*k}=U4GHG j/t5͟r:S:qa [hĽ >dd8z`%<[,1׀`WqZk=ѻ_ !OUwN&shRZe KTV@UMUSĶ}br5 ,G,-K@HeAƜ֡xaXC 4뷘4|-T 4HZ5~~|C~ O]g\eHFl~sq%::p H u&2r+~/Rn)tRKF7rmۏ<#8^EF}j 'o3}P!n}TyO"0,UthE8旌m{_.N]fc&bMH†ԦJ"FGNFRF)p lw;UJ;ZMӶRWS;8R~oWJ-AQITAp݅+w\7ݼQ:v gF2_Dx8n`Xfʛ_E8&P>;{QXtէ$xQx7]ū7p;uw=yD{p0omі9+[:"$nվӯVt۱k7@33p((UU[GR8. ÂQW,gȁnZX1IyχOP@b F.Rȯθh7`ZtokFɲY\{r_:_V?}~\脏+&ZduV[ }2KYsN:"]%[jZl@%Yd`.T=udɛCo'\zɺ;dƇƾ@Ň]{H,XJ%8-Bi%J^ a02>coh[N yG#PÉ6=`'Pv)v, joraĤ6u[@#\e#sgS]8Jq#"ݝyl|M՝hGXQpzVfI2p=9ض# 1q().GƎljJ`} gg7r}.^lJ.T3 `/Np ۜ`X X6oݔ6kBbNݺrv[h-m~اJ`M]=#0\gՕ u \e8JDŽy &Q$>SCIOEtch9lvϐ؄lbtpr{nstgj~~>!e|.():d>}b%i pC:z3^M-ę+"tz);ywXkE dݯ; ż,VqCbqNMԶ+qfDbC1>}f\u=N]wx2VƜ"&,zF <~#  )Xx~p[=Wo@+p)OvDLgw$XVư2 vŦ{hrN>`sr1 Iq\YpL綶TDp4E(89Exزb:itVVUVl63RaQ֣*ڙyoo v( (:V"4c%p.SҕژlG UpmDNxV+h@(go u7QvZQ0ţ\0PpUnbt3w!EUWiH9`E8,rZ1 ;{2 c 5rjם 1y 7 ko -:8P^ 7:Na:^V Sܖ̆"dXzz߽L)cPN}m{/!/TEʖ MoxX wE3\P6"R5%T_E+\"ſ# ТhTY~*Cf g\bƿNƗ<{XLWͅLGz(̉9`aCcu>~ XK 2.tҕNNMά\֊_TgϱLiPݻ ;دOUY* X`+cXYVz :\aEHEQGq2ZmBbng($H!"m}6$U^[u*?& X '_`iORXV䲂aE.+P^tl.tv԰2 '<vD+paq.wfma nR=5j%~Ԯ*2"Vj)qMuRGVX92X@۳W?r=5Hj.7x, pTԌ9Zy W`,aGiy_5j|]7]8H<>gW԰VϷ+xp4^ EЎufS;p|Ѫ;z\Sc6$IGzD6!C:l:CF% Hx8H% SN26&&`Rdб;v), <} 9[;\~ݝcY, %t6z7?]qXl`hsIKђH^R8wsjHnRaKke%ͧk׮GejX'G8;RˍuJT?6&C߾ 7Ya ]j_6:5?jXUbki^:#ǐhBK vuc'l,"-+)Q̗y]O)qyЖD]py K=\zd@{"iX<2xvlHg(ʠg:<#Kj,jբv=>I9*XGbDZX#8z\V [pf!])4@ֶҨET1m[a{d' S?2~ƔgF緹Ôlp]eS23u=D~c~6iR2iN 橨q]4:z.`щ}L=tD})50ą"r{gꕡߌ~=%]Ȥ35Gt֧tf+08;|otiBIz+E 'ls } <\1*jNz}Sfc45 8)Vtnz֙DRzr !37Gs e{nf-|'|)w?I wQ \OFkhR!>I@+GRcZ-j'- PB S\eeKמ\묚P[U)qo6E\!PIDBo:l-J̅0 >EƧвQl^4{ q6w3^>H"?(a)~^~m%fQuEb/6sAd6{@L' 0WoF!5zҁj5$uD~O a UWWTnPE<y~JyP"$rA6X^hBѺKJagʑIzK>?x:Щ#v$sq$oc/~T,'ٍG _Q92}5ݨQƼqPG5iY3ʼF8qD3]wf-1^EAҗNGc`b%vo݆)ʣn=@qMWx\ Pͽ>ߺK,#f'~ӏzDպ'~~(}b=վ+,&&ϵ=LwdY Y7S-zVQ"#5YJ3FJ.W}W*VT![Lt";k=f"q&`hɓbzc:p0ͩ眷@ػ/:6k#]|0k?uË'L|_xݺ f&qo dѾ<1j":P|'u549-z'ApS0;uDc{bI`ZD` T5s' 6(!t(OtD&:G)d E7l9t(}z•[0 @mt< rD4KKjo|Y`$OV{6^Tq 7onĝonяZAvPy%R_]!E%QV>d*#UղL{QVi6c*/&A PԬY5"=dP MT=1i%9r4ƍ=1)L'P@mԳa:j":CIxp!Nu:N%Io=h,N,w6}ҔvSFqڒMRc}ZOeW G@ZvEUGY(xSd*zٔ|#s7Xa6lЧ ssFH64NGQ|53Dxr&NCLKj`S"MHR)csY vc?( Ӱ};k1l"'_H3~&6v2ݬN;8#Qk^%!7O"+سPzvT:yX^o0qB4j:Oz9j`UYW7B~56xqj/g8tqtӗ`ҥJ5ۺu. ZV:-%F0=ܥzvi:c:tZ֯["<=Ͽ>Ŝ7,ayz[:7yX P6)400s1fl4k!ꐦؤI[4nM>o6;R)[sI_k6nF6m{/ ])jFXDˌ`møs`2ʆt]e+(D~vrYO/I2([4c>bF%$qa]"m \ߘع$' "`'vʔr\9?fL_#VDžHŦ2wN{gwjY7aJR~움 X%;{ZXaBan&ӑ̔D$E#&< E(WOE?mllR´J*q+`SJUT"rDUQ(dOA&hѺ Cg`E̙kovj(a!psӷ v$F3Ž(2@ۯ}3G Gndң\#+5Ǭ]ޣ)?(:"b¢a1hQfW5jqV~ ڻڶ)@7I=Ђ$v)?FJfͦ]7bh 'x%#鲘O"DPo֛^i܏MVGq@5,T"*^;slx =3뜤kgGOތ&F>7׳&:$n0B؍vi\ȠSvXt#kD|:Ȇ!aj9:W>MFVj׮R JO:A#(.!`ӑ82&Q&61a CdB=ow. Fƺt,Va^*TKjǒ"kj';u|_ =籢4cCԟW+Wlg$wx[OX:w4e!>#`D[ѧc{^Kxr$IT^Hf#\bɽ_~5$?yOn]K1c.xGץxzn4Wv)6nFon٦:: R)WaTؠorJ.\n,WlA_6>Et$e eU9֓=.tspz [ r?xN*%m/i:%dVzB~Wi|n:>ߩOZ [KV*j5)>E(Dav*rHF!!"aH DL/‚<i=o/7tkV"X H/$ `5'(,O~]F7S "iHOJ]ڪe[|EpvT0\XRiIGѩvRnZu ;xx ^ aBl.q+_ ŽRv/K|?^?_xvrǨa>+k~BZ Q-;(/Z˂{D[a[۪]f1J}:Va]-x)3`wPl!ZbDPX X r)D@A0QLA%}#)< "dWj^%Gx]o@t1VXLM-{5ԁ9;a|[j&)~;yMvRsqL;dO,*ķQ'ؑEvm/Vesi_t*XcK,u԰XaK/]P 'e +f$F#->qa %h`/;|6Ƒj:X9Z B@,`#)(*=r^rUWtkG#Uz,{ :wn)l}rå#ԕ3~;}Ш^}tk& 'U/m1~{Rx#,&޶ЌͥQA%͛[T X&mP?s^CZJ Bcћ&]#.KXAr\kXWif/,[70]`5/;~IDzv ΄h:yeN2a'4I$mXѳ&{bc]dX!e;{qyĿ%`s]y XIg85,#lF2bd1!Hb/u D kǠ.EEXNZ:e%?"S#k5ZABWh+yX~ 03*5V,Y7Z7(zwS#:}F *ė]QDK>dJqϳor}{] g9rkoMZvsߗL; Yymݶ'-7׍7WIeClM^9^ux;Հt7], nEyt8&.4jM;\+oq)d`%wZy,߬x8(Tҿ2k {xPٓ1fC[R~'qXO](}*Na+b>_!">%*-.*>%')ʽ؛eVVO0R.Tm%¦25<;Rˆ EttR%`+}DK ZmbjHE`q5V̵p]U*d=ĦT{̆`w;{c*WܠFdrpJ]tKJCj#obRJ{N#VjR1ZWg逕?D~7Sbi:i}6O)>uH?r(͒.q2لJf*#FYXvV#]d5jfRsJ)U%W] [qu)՞UZ@|P?(|Mq4茸ҜTaAO 3W!LqK%4bRj0ٺ?\?bq2yUGՉ|HJ {7pul?f=6艆ͻ.EZudK# D᳑zgf(p-^nFEsKq@9k+ԗrtNN ۡ"[s3 1=@I3EX (P.[;hm;h}iNMycGc;]윓a͹nZ 8|?2cVk.30}fx56)ےGM2gPa[EfoyE]̅R.;$7bm+X!O pWbCvfҺ1ȈG ѡHI@Ld" XqM6j *@j偪Wj+KTv%Ҋ;Kx簝AKf-p4RᵢwO]CV8fۡA޹ 6Zʌ4|}J1B7kY|].ŃkjpN6>U(^)GWZoCۺ@4mً Ua7p rnfeC+'wñb2Pg98g,|Bc([r'Mu3͞ݕIU(Yi'C M>ӢҌiCucp) ;.*sKGr(Z@8w&iB.[D k'Jjc2lz(J Uآ'xG(Wt'Qm'MAQNe5y}BV:2)94(uEHG*; gLE|L8"#5<p؞j=nU h-j> UU!`+Q-TgRlB}L3#ư&Lj5鎍7eڬs1P)%Dnv%J*|wӦ)#K/$Kw/~Mon>Auu–\z j5 =l}zYL;qwo6yO0Rggc. H\ıL 0g̸'y>n \>vq>2{V➧c Nc`И}u`"uaܹCwk|R2&)qR^ QܙR LbFkI>#sE[E\ѓ|u-৲ci_3 }ZOV:/وZ0c&>!j}9m>֮R؂[JM6Eæ=о0 $Q T?1su23,…1(V1]y DOuijGz5XlNzxӊ!ЪH* Jd# g,"ԑ͜=\;G9)CJMdz&])aFpLS[E&d3MvxQ5GNeekUEXiF3(^ XM*FK+ZmH|p)Sr*B~avr '6n- xyb*Šΰ0$3Tnե2ՁJ!=֥g"^dKZ\^wYrh{"TS+R̲+ͯZ| UVh֢9g-Djjj%FӧѨ-#싯S*^ůbgn_A3 ٩EƆdz;8҆^Y?n',|aakbz{RUSLix%nü[ իn== Bo:sgւntE`MKS5C6VK-x,Cac+ 6NkTk(XH*QČ_V5ݛF|XNPN\(C p.ç@k-&`ȩUencw]Djkr.Wb}ѕ"(~'^EOQEhNxZڿ]~ e'V XюԱLo@qYO !iqQXsrrHvJec)8z)ݝ-_Vc0 p(!`OG;-ֈU"Դ.)Rh՘&O#%WH ~R͚5s{>iH=׸A] &r9YGeq~eT}q&ʛ_؈ztV,2Ш!M1uҤe8m``z ^[GЙ#3,/_aï[ ֔qF7Ow4b1ceV-֦fRa0LM[+F> VfA lM:ڝ; hVUL RϚ&Amt:^psȘ!ۘv/_xqN']Cyxf3 WÊ[ؐa'Qبbi>/A{,Ktw,Eh%юdhGܑ(+2}eg״I? ˨SLNAv6OHJJ@|g'Μx(f;VjWg]2GVJJwbO>^$G+C=QORJJj,T+.Y5SV;2QVOթ)%L)L׼JDkUGFu7j0.flR('zn =FC\縟S.7{N$t]UJLWS_c;s 0D9e٪-x;a7oqLFY֥Uj,% \--8ז]tw#4w)G<"Q#7K5ft&4 O$͞⻟

LFK($3HDECg9sf1/u9C@oW>~O^(W~ĥ+7w IpIKEŞ}%NA?UR`[K `W\ږXV- h<{4@k-qUxHV"j FtV*D*UYh]n>*MkcӴصx2.Cj|73yb=Kxt qՇDU>ħ{icۊq )nҸERf =ߏA0jbFuWUY;0{: S<7y#k81Զ˖Jjj_iN pe% Xe̳_cyM#)DK9۷t|INF%|, (34T)UC 'c1FOXOI  {~QS\Bƒ/e]\?so9xW) X$;ƓVHWGٿ)?#Js>X<`rcgX;vTaKJ ծV `,\pF:ZGW-=֢XVju{U*p?U`/kvjj= 6C`=c AZ7 );PkIx|$Iextж m:jڌ_Pw >oUfbCE˞ L$!b`„݈3 (jLwr|4}3#f6v(%$IPHH„ԴX]uS`52$p]{p2blzׄ׀5#Зsc/R])ꗻH]P KxĿh9=\MBcG\BfFDs^ԡ GL˯Igϱau0j?ʊ7v4>͑;ćs(5CĒ8G*3XY_EXOonΌS544!@+|V`߼jV-U&5Y* H|e*g:Ʃñi\XL}`;}':g$E&(e'b{a]rɛH5i4ĪS~ï=~Tù/%OQ0t11u2N'b ]7T)P ݰ FҵC CS(7;biջ!%z#3{km=S. clvgȦؠAs0w&Xb,u ŲƄ_D<~H_X% X_@*/0<]+iq|}˿:J699qq1$YZ- p=6E?%ju4\kBiVQX^oFi"W@+UQ ~dJulK'ĚC`4cva>?̦ ܱY4VDnTDAEOQ|zTv+IU5eԬ9mI!j@,;$¶h3Xێ5 ȪcOـY$ iy%^ZWEy-U$E#ޝF2)1iڦg*llMg >e63mZ@w*Ok̸f3ߔbCWc*̟K霰nFlZCM60r{psf +sEU,X: x% Y `?{7U*=j?#IL'5 ʕR59E.t:f!N#XF:!q4X\iީTUkE҄uh]_テ ՍGD-8j1n@_,4k' I0>;玂0er.e`y3ZpQ6R4QO~T?i+7{6O%Lː҃gWoh5~~=L-(3)_Ov k]eWƺ+j@P @Iõb\t7owtB!P`?X$]5봉 iMj !5U#GmPmB"m(*iG{] Ke IDAT]:, ʚCFzAm*:%x벳\;9nY 1>zZPIOo%ΒBwN7A 9C\eym=ppU"AU$W*U1ZCSƦYP].*WDOUenXb;ȩ.c7!-0"_caи5m=& +Z TSwC;RyVl5p&clg }+ѳ7 Q;iN=I3Uz͠ /{rs;|l@@-nܶ9p62e3h{ď6j)]O#:2OIZwx>>~E;,[Lׂ8J2"ј$#YYe g'{ _f&f<280{'%졜P=E EV@ESVdӬ4@_``ETXNB iBc9 VXNB1% %Q:R VU&٫4v"V??Uq_`7vE XwXAvRksG:ןy AMI>6ةI"AsEWTpQUJJ'{:O#c֠HFQ)J12H/1zu}W^hJ%,s>υ\,/垪q֡*f~KVpI5#|gM)4e e}&wENs4O.&Xe}tZǓ,[T0ؼ+6aۦn>GN[hC첳xz8#$"74R_ rQqV\(:F45:V>Ò-JX_{2J*}Zhrr VHٙ;2:2UNj7(҄ȜJwX*)k #FԴY `-dҁfosoV"y+0VjjQz=T' ~nHf*u -EHs?`œk2KoTt=SgTu=`pk5ǣo#:K 'vw$)Ay׾F8H@rM+d.C*SՑG~,452CQZ뇳Cxq|sXRY%2Ooֲs&۠O,02 0we{ApQ7,#Uy;:vDEX@2 xr*OZIEPYZW#vt88Da2c=u`ƓVjYR5P-–oD)p ,rڵ|ՁVWjwIxXUMHM 7hǗ '>tI:X ?i2捀V>YN^yк8|u:/Y~e4:sƠSq},:z܃cDqSh6 +"a5D6e1hTq`wWl##hB&-#hs7ֿ `iSW"Day@'skT6$f_2ؠ:9?Xnf0\KOWӗ y~N$>Sb =M#(= [sCm߬jkf;ڌ;K߽NpBÂhe(?HA9^QHbތorJ\Z1ׅLq{Y%Gu ?GRu0!JF|=XW]RRbo_/vksFzl>|`^R+KUjU950kX¯/UK*~#1&;A굔[.$ K> ?nA4:wVdNJDJ=x 'e[LТ81 m:Q41g"oޓХp w ߐY6f!&N_mQ,lah9o ʑbXj)`r2CɛMB^:l>%'Qt1eUJ ~-%xPuaNf7vV[Z K@]bKZoH` !jFXf071 W,]Ys~aE 7 8Vt_?]"A^^OT3Tr$J ViIe,3c%Š`3,@_XKi:ļ+i65ח.勿lq`9ץ|,u"X?rS`W3(>[[E9+sٝ*]޲Y9ZQ4J^=S lʮ41w\`c :T3T74((/ؐx7']@Dyg_GzE>'g^0CkM튕pܸCqQ.o俖]+N7Do l>=-45R63RrسH[^n!k6R)8x G5S,J_,)|f%ؔ]tX04 jcSQ3b?$#H{y i2sWskƒ#tXb*7vdKfb3ݸGmޫ="9NP|;Ïd.8Xyބ'5=rH<@.^"HA5BUDK><<3 `lzrzdL9M{;_'49 'cXsŹxr8P&߻Ͻg|$vY*6)̱;oRR *<Lc); ) &b5# ]ϞWĥv~7VDKgOPjް4:TPcEIʰD "Г34w2>E|D6h@15#V"VSkU@@=KRJu+S.ixw+Sk8FK*ef; YEM9KbygS%C3R`(ֻ)yZ1`jF5Yn酻l=/1n-L8~-fybH۴ ݱ\X`jE5%=o rϿk 3 8)[QԒ0з:wX~/;l#yK^0ZcKa!5m 踇 9xv(~ȑ_ v( y^q+?bcGSy:u20`MۖbV3J:U$PDG3sf`' njb6.'K,VOjؿMJ,?3<}Lp.Kt-}Cw0֯7\• gqq>V\k]frɔ0$.O:WuE.zq팝cs3g'tS+u,9h([36 @Z&XEU*dS!?p߱[OʚT]j;(J3\zЛ鮻W6AKQ u2$բ+A,)q#`J3@x{SF saGYVD1wF{1%1cWU)S;}ZQ iżJrGu6V'^ZEgo-]^TـzŦ"m8܌21f0<A׶Rԃҫ9yaſϥ| !ޖxz(~P}<8+i{XLW[\M9@&ooi@RvN߻ .GRXQJ67]nN y,&t @$k~I["D[/6~c?ad OZXKO*W` w+Uk> cZshvg4ꢚNQ]tMF)?v',ô! pC=NN 8:@MZA/K:O* lB70eJEn}#;He\Ԝ&>渟:GvZ)q'dY#Y,eH \[81E hņz+oc+_-iEAJL'iv: !|N&rAxKU[Zc%JwX"ԯ2]LE]'fr){R; Vc:vL6$K[|I@BpRܽEw06~t:'KX‘99֟):zVdZil@Wu4rЊH% J[*r oKWiDZ~ =l zU׷Q[JM z DFM2J`b COȺd5adh5j4D 9om:0Jn¥&J_Fə;o+੖r9 ½0a rF;m%XTvSfpA[()jTFf?5 w SI߅:NowVfԀVSOl2raڑ@{ѫthގu ,*ږiغ};Yc$C:7r9(Mpߎ1_Mu\Bf w=]I&QBU+V]{3SDO {ƒyC\~s3X % VRb|kwKV$–lyǺ;7:C=q3]z0/ͦD:p+5]TXNY*|.f΁>2e $'%]Ig9)@-/VUJt Z\h# m$-_{~ңnKVTumѢejM]BlSmڴ'VG؄$(jL'!S|fgeQjYqhm.<5&i]5߳ a-ӟn FMв#va SlU8'*bK47Nik.<"u`u!;&apb][BVQ4cԮٰj{*˴yJz%APCBwkB'IЫҋbDTڶ[<n\9'' w2m:! ˯65a>]83=gpC;ƼvImcגNdѭ0F!:݇1r":FpaL$6Ӏ-T kbS1V5]2d_y|z96p5 ɮ:GaEH8stǬp$I|/R/ܾb:lU6L-+HIj2PrUV;G@-ؒ-ky#(߂bwj'0!TNMXTN6 *Z4BVrPV>#G}tNg\p X?{NS"c{`m ˰xC7…`uu"H] H[:Zr_$xxs]?PmBЊ%M MP1XYUiům;t2BAÆKD=Vt2lA7{Z\o6UZ23(se/tyZujO\c]u?G>3 IDAT|Kk. e&3v9cO.xeN;=ɛNsm! !J>~Ye۔` ADHG<3`ݚqďIqپ5b75O${&"fH> ѩ$ ҒQ^oL2,lEylbYv8 .?i*ŚQؚ1*{DX,=ţoIIp7vo/~3vGs˵wX:Au _:=a&,f)OM%X:%V7 aH4akIFa î ]\@`Ų*PjC_}L  fzR0a$װ ojU2f0e1dQSȯ9]iel{gocEp)o~wߐN܉;7(< p1LvA@ۮ&ضԞ>PQ)5F؇c`%Bi*U CGÕɮ%XN͢"r.< 1qbcNnlȪF.Hn,i=knо3b-C NhDa!X8aNXd(_ULM$H3r%;kApHKg-AII.2$ QkQ^Jv-يmawqxDN&r5Up*׿#GM/} |FO)~ȑ>.{~ /{ ]gqS,q(pzwSGϾRK qu FWWm>@m֒{u=!\=|N.pq1L)wa@ k1ŠflJm@Ӿ@,UU jG0lWeV!Cb$1Zȁ 3b +1[VBV;91hi3uukBb_p_:. nq/]õ瞦K$r\+(N#{ȁ]8ՆYNV;gD{gz$auszx'@TW\Wl~dh߀6Ml1)YVmS_nT\2 KvutFGІ[w!vEdTٴl܈G `u4=| "f#)ٜ)ۇ|NWrM#8 k(Q[GGnOq,vnTYK7r]-^ԕ7-7&LnӁڞ69Ci&Gv=1ptL +6 6.',*ٌ͉K0v*Lz"sWcI\2?k:O7o.E #ڥ:u<d|F^\0"r:nOf6P6Ss hSi̧ +qUX*#hKPQ^,[Z\(5ZVLS)]'*dђ";ʞ? O/]4zb$i-ljlM>ΰ{_Lԍ+}Wӽ:#>%a>(N9|bwh R~b KԪJvyŊX:G7\ʹyCz^f `ڢ]檖LPKiMcN8bzߵGO]LXy bYw;k:}u0 ۞fZGndYX\ј]hxtͳQKVP{SPE.1fщ=Қs$({{aَxދSB.2MZӰ+|wiv G[+[t%H;P8eFOZEiE,C\"Sб 1b\1s flŠta%XᲆR3)=9%LCxo3*=71oaonӗ1j]f %?9 tO'8 "\EM*bK9[)Zt|_A\aX;J+UA=HSVL~GhwLN]ANP1:AN:2oOqQO.@>1vZSًm\7E!^C|o5hҟGQ@d\T}KO'xpGRśwZ37ruiF>n\TŝuVoE^~fctS9xDU2)[dmaUU\]e|**l-S1GaCai؋}ƞHfݕLN)R9iV=Xi )Gۯk7!c ?{}ޯ.wwYsf)YDsAPk 0@( QL+z]joѵ[ uHtfv>~`U8k~m}9UY&|,~cl8s0Q,AQ5,P-$`7i  4')#N 1[:f^~sbH<< &:&ci>b6ڦx2ruØ-DsnQg;&J'04 מaTR}M[{ 4KXSM?j, Ȯk`9gb-OE\Gd؍)e2l]f"'n[^^jXWU@"K;1SkU Zf u[:|sc}70{X!KePXb+лo/{zFUIw4G)@+P  0W@uĴ bMkBbXl^fϳBbG!rXރؗ?]W0t͆Vc+:U;9Z|C| kn4O0zE14TI:LHmƢ79ï3} &u2t aiqF_ʎ i,0x\]<<2"+;}:̓=*<(Gg9y5vAL]8֛j=%QJqڟ1lRzbX6EeLv,]$ Ű&Zd PŬO]3y(V(,GO9{"vUU휯10v[MW(?OxUUGǬXE+HuN&Z`UhnݣL8l>brbXg~ckJP\SB^~]{cyWh;tsa=s2åSKɆ+޴9nB 1+ Ψ"X0weZUGtIA)G/╘9;#̾Uu Ny &NXc;kd31snXN͛ES9\|5jbCQs=}Yslp>F^eZ6rQפ.c+'Ƭ.ًnOF&ϊl9.]EbU]MSpZN`eWU9*ĩ9Hp8k%Kgmo JLJ+˄^/}sSxI VmYTI*:_Z]@3GvCNlXv. ccY[IaǗ V/o_Êa*)`*TT+ x ^]LrcyczÊa_37=}X]] g90\Mpկ-f_BEV>yjVH=ێW_jM3N|Ym֎ߧo6gF&MbkfB Ǝ0llcuD:cKw1'#*r*~}gqe6 *$&QZg'IF-͹p&VauVKG 鹬 ]s9G\rFYaV"P%F ]%Q&ַ4NjjáնY[ՇJ6oNԭ{ {ZurX2.l E^>"rNL_+:8:#UI9@+ bJ+फ'0 zn1v\11l { Mc#tpC3VusL )1/kVsfmeˊ9RyYfUXhEV60?T1p:sZ;y޾ЩK4"{Mb ڇq( '[\\E!=TWV{DbN>7f1t/BNhnKm6fo7f b][R Sݤ>Ʈ%a3lp^q=PTf[ 43Z nU9bXV`Qު Q*`k[؝QX9#Ŧnk\VE8SWMLaPb=l}^fUջ00rНD?ʧXj,gw`2:.B6cV+Z\ZD6+]ɼC6Nc:۹`_sۦ| ,};}7*USpr+7Ix7Weqv=c>,D Phx#߳܇FG(K3"id爦oEPT_iA7%dKكhoBrad֋hňi`;J3;6!lNg^wC \M\1;`MHz[v\=^iKⰌ ΰ[ȰyFt? _{/߼W_ߥ?O)rB*G@uNF{! G݉w hvPKܻo/*h W#fUa&aR^ -@>G C[`U!J)]׈ `jА>2~1σ Y4>,: Ye]`rɑ`5rv= 2eEX]J0{V)}f/7m@`7YV۴ƺЂdu;?w# pڳ64#\6g]wi%Lq=) 8k*‘zav 5=ĕʥ)hvSfxƝX8V\B[H~$\/coVẀXVղq}԰0*,v t3qpn]?xߧ&q겫:k}غE}'Xҩ.`Y;@VJhkT7bX1sXՒ/Js, XT [7PŪ w%3rV: > c{ VJqjЛs]:#0aάuxx LٸlY͢P9,n})ۯKXyfLȰ`MVlRZ}'8쨙kUXޫ gv};o]gWUUa[jcoMHp♫`NO8~H|N&eX9l6S8hHNVkb\1Z9u+p bJTk{ kZ(B+keZŪzMFFe^7SVa[Cy,}53k=ڈ3]GeN+T\YJ G(ZPކU`g߳ug#w͗ )p8x][̶? Nrp 0lbObgʑ%T˅?;Sp4s툦nARf{kKaup JcyHY|J<٫t-K!|ðlvaf7~cfۡ*Ò%*_U(Zezpʫq7l|aן}]Ůj6~KGҩ.`Շ`9^3]%ؾC5.49BbOoұ#FHZź7mUHĺ'*Ê5- jX=Y=cWWQ=(V!rX[H\߄ͭ5at$n6cdð3gnd'/q5=]{vN[۶'h NVkWŦV*TXl.Zyzޮz@ui1= zޫwQGIo,~Upb8>z;'8O}^;XU΍[7M8oA`c x? Z&Um*|+\/yπownO U!>m?u݋}w])%` ֪jP!Ȱq'*o7ifDZJ$/0xp2`_ 0}7/)f݃5B.]QδO+aж)BhwCǮyT3;u5] mg8fǢWsnpgJg:q"fXal6VQ0u[陴c9WPwl qJb {t=fW!=Xк{ذ@A`NdH21҃:z[7VR{v7"FGrP?}a3-})9*"6Hbm$lM ]$ּԽ Oc>lL϶6pR)$9_:L׼Rl-ێҊ91ðMR5aXDos{IHѤPX^MfomUo{`*Lqj M^hα_>&`ņ* VV@əXOz9i$З.@Q7=}SyD6JA,-e (^XMV4ޅ6l^$Gxz]pu XzV}kݍuӕa#p>/OZtW;gŊbjeMueXW\2wb Py(eN*.  ˠ͍ 'XmuΧ܃ɿZ?E=` -<#slyG~HFs

q~D `4-`}.;I G`ajw*sb23,hddiVHUG`QW`ۚ`C,OQl-ռ}_ Q8bYY bbX 4>doȓMHmh&1]뙫`FbYWg_9miGg.sҌP"aBe]ΚR&er%% fB%)lbrbƕ>aBd2kY2 woTϐk?v/0Fux+= [zQu$B&aǰIl(Uב%)KPy I;^ݯ`6!`ZJrFNLlBRS8x[ R?0{ N_VyBb%x啛&,ܻˉiw&ۂ+ͺ~:!ۯlBOCbF QSZlzJ)KFn]<kcYX(bY* L[RHϫT}Zӈ +@k!3Nݺ` S8,]e&2jV!qP|bW5-Zƶ7џŠtxx:L,^k+Ī5՜-G\vcHvzulEMVL\:޺ | Y;6 έ}s腘2 L#>Q}M4Bh:=Yثxu'UiH"(7װTxKԓXi*bYU\GR- {-U)X1xlaqbJ:6&fUı8ya+mKp4*63,rغ̓=q>`pJUZlee9""yr}XV Nb[Vf1@PX!VtՉۖɲF/K4)*וI/avaL*6ۊuv2-КH5`;1mbE'1tf2Kl6:sf*wZK&p&??n1.=0hjx{m!9>ha{0wm|E%ax.2 Ql7g D19 nFbe~Í331oY>3H.z Ƭͧ(aWvM3ɻO8qHc zDebE|mXư&Mϡ)]Ű*:Y*GXUe=T!VIN*<>``V/{#:Zh+ea)yvҵ&0e&.US3  O&$й4*# }#fU^62u2OQ+[XYz5Y:QPZӦoVMh2R "fms`(ܸ){wVuQVփ)Z7#(ER\kGZψ]NǸ:l:Aa}Х5&7 켆Ԫ] YDZW|sS#!q,A$2o%9, ؍/u Y{^AAenò8ox/$Næ-\ISf!q?n1eea?y۷WZ:Jʝ7o|̝9?)Կ#웸K̰J|u+;+$`7[V^d@O^3:+U B=TX唨c-͒,ľ:R#qXˆ$}\I^U, DS8qp.۰C].&Y(~~24ѬtM,*PBGa3kvŒeƀì0-7+pKD!vvX" k Q*Ʉu1kn !4c?ḴfvRѕhqI#ǭ+h5Jٔ/R<{YQ)bVOLJ@ P74UsWKD7N5B %jxGC_gm?=äE)$ѓWcԼT2+׈쿎չ `3]"ナf| {{}}!AUběX5,Ԝ5(NĶObӐ "S:¾\AyZ&ê褫 NϰBb6Ϧ9?#X%!Нǐ .bB>R?-wP gj}q bh$Q dn ܬOAXAǰI-f{0?$則0~.̈?XmB+T¶x"5,NVis26')9HCZn#=]T9t9u {2PXaVWI #w/͸؋OڊN ^X[+s] k;l(eHG +*ѿ*Ba1 H*8:,` M1XbO.Xl+U__9*kdcZy=X\h{8rў>Tˆwٱ 4׈(I_1c=[@+ُ1g s꠾pk!\cUKm/m? #{B6eEua68 })a+ɋyÈ>mg4y;m5ei_3l^.LKCiY0cjL"`nzkȰq[B<[?)n"] Yx*:|+iζ4~: `S6e V1lz^!WTm{X!ģ8{}`>Rcu]Mc9%P;PCw05VZb1U2%a(ݶ?cX O40doTm- a]UHzP$ )6aPVj0Nw - X6UnQڦ@CM0!v#˚XW Ecڟ63K)p:ud QCa̠bɞb6WgįڌqYjן2 N}i6S0g8GV!CDo8 t}R,vy]=<m4@'_g6-/ˆq5^wSacozF.fjn,9[/ ;g mש)~){n3mG h7bXxG$$E; `kw1;sְe #фN#ZTNߣW]dyHBݹ,yщBl}a`ՃՑ8iSIZ,P5B3uGcf\=zpoD(ƐQX4n2NTUg჻o7q?GqQlڋs\86W<5,,ty[\ujİaPCَ#”7s[dMTu`s$hI;S@c0qo{$!|rW#l*FmDd0ni9T`=+bw `S+JumUMi؜IS).EA9r ŗ.qV X:Vaϐ|Ig?3%tUPq T<'m>{愱8v^C͠U2О<`MXMlŞ:ٖ - 3,Woî U`3vtuTYR!ȒeuȽ(h5%f:m_eZ;İڌ+~`urF#ǦA4n-Ԧm0Og °vBex3?{ >{iwė/m,\sb03n;⬳&L*y`mi>E13~/Fbu)'t^G`oŮli@2m0 0^;ǘɘ8r-%&ƔaܲRIkjMEx^Q,Lq+ŋӎ#6sX 6mӳf m'*! 'lNڄ$gQ7y2ҺmS׏}}3$`77r>`K `n{RX-.(•s! ɶ-XVQVhRڴe  ;  Bd؆M%K+Ľ\ } ]w3jȰU-0ip[ ۣwc#@dо)7BI"PkQ5ڱFvŬQ`ݨ>x({sg坧۷￁_}xUm1q*2i"hQSswZ6-zY SbQbYskaɆ*zVq.k(p* }"1lR_<8crmlLKǘ%[1ye'47T:Usj&r AwQpUdaD@ش&}GY!Dt369 YT: Pal޽8zN*$XŰ\g97lyw%Zw ?Ŀ?1FW~ӏPOjrƘуtJxV˛Alؕ-*قla mqM TK3ɜ&$& XBBʂNdWMZ47ފ !.=n( AO, nf]TRN f`J02QFMS =%lVhL)d -ْZ=C⇇EcH,3"v>7VڮGŋןwD}e|A&1nZG.(~ap XVvťDUnV!A:ϥLq& v~0rN:.ƌUXX Lgaե1?i?Æ;N,q C$ZƔd.[e4ݐE23ZPĈַtYð[QYXboܤ|- NR` ŲSsWw7i<~)<~plGi ΢C]NVRu 60að9Lgq0H.VU^“rOV.|ifMW!NtJL!k̮!(7REN0g t=R(՛`eܰ+~ f3J z-PP#O,<9XFˁfE#bͨ(X0U+g⭓;qp%۝ۍtxe{ |hcOヘC QV^Ć H7>İ2|".dqkzGrޕ!1UR.d}`Œ u7!FCF_EA$F [6r!Kib\h5nGip0>sd˷ɝnDřwdn} H7fdk-(,[l{'ۜЉj(~+vU~krYG?1}mr %zawbC8q: *:“N֢f&,YVX/~x/~O|{oÔsq:4bH\XtX\d ǎiVb xԏm"UK'۩bX M{N`5$1fRPu mSNғown4?6<.y'Vl(HS5,SAn,C㌃=IMXn*O4Mݒ-EE(ʛx wN 8{~b?>8mcُ/Wo79GȊ k17JYi6t{88fG8't=Za5 ڎ׌ T(dnlL[C?c;H܎vvj ߎck& fѫ1l6Wf2T(:.ynbˑWi,O5sMrQYز*E`{Nc _b(̕W6bcW '$WV':ɟW9j1VM/[ X*0K~O=xG{o.x;A l:5vzrU hP6(ٹ(fO6'7'h!KP!P`[tR[G(UA1l&}CV e!йc*nl)1>ցrDFhQ SoUQ,pྜྷ|rr/6XKsX1'#z#fpdMúbQۋƵeӫ'7_2̊M[ {Grl*8BNFfc@8=c>hc..{pg4!>dvt_@&vܣ҇>Ⱦ\zecX{u+Mɲ,VDޗ4oB-g4&4`$B0Pxud켈ħpħrؤܼ-*0ku>;L'9y˜}րrUWkY6Y-`ŀ@V+>? = ߹2ח޼cOO XNyVPV}DX?z BzCķJLO _e{uD؁X3" ãDTLՊ,|*񭽅utc oi/v|Oə -\-KXOC`h2n%Y\OɣYM <<:{Էt ^!h^dcyGP ΁d@ SPcq<:D/f;(c)P+hRl(3o!VnEMȰ&؜-`GDIE٧SGi@Eh>P U#u/2w}7l?jsJJb鷰k*>)`ߣ䵷7_󴈹~z.nRs;m\Mq^ܸGE1󘳖V1ok-筘;G`8u_U%N ֎yLmҒmaX'VŰzf- X3yVWc08g/ӯm]"a꼙ؘIx0A=³r_K<ȴvTru 3f E"$-v&O/1V^;߽} yUbw÷;h{4噧1'KB@h?x;y1ث kwTIjGמ0b t^>(WcjĦXS:Y#nރ,> jGq}z .Ȣ"i ֩DR&=X!fؔWjwGSzA#8[}E&t^+,6ʾؤpXYJ#+^w7P!]C7`c"? ;IENDB`fotocx/images/outlines1.png0000664000175000017500000007060315247006660014734 0ustar micomicoPNG  IHDR?ӎGtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 224 354 1 0 XFw:eXIfMM*V^(1fixHHgnome-screenshot02320100fotocx-24.40: Crop: width:354 height:224|fotocx-24.40: Sharpen: median diff 2 14 15|fotocx-26.6: Rescale: width:319 height:202|4ae IDATxxָ{޶(!Q [kRBHwwZxH&393~g;;LIHH7de૖u#==P MY(nOYde@lȚW qqqQW*_`R;|lx5 c \J '$$ 6i_XXQQQ"##)/C[j-?CCCߺf-2Y .ZކiK+u!A$Wj@@@J`$AChR%u JiIuÅm^ãd~Ar iS>@$}n&|$Jp-OnI+ B\ ˪/wR[K /HEH嘸0fꉆ*& NqĵH(| @PE$Jh*zt,PV-3_T7/a>Xe+z Ò-qxC|9Ydہ3QpƇjT;jV HN aԪ=|==~^SŢޅC`M6؄-86禓{õ/:zͪ_ߢݼo|>yۼ-z=*0@Rw_2ߧnIkxs* ]麥6K7 rB]|x]:5QWSEY!5Mo\GTyФ {LjS # ++Ѭe_&c[2DUÀ5ǯ[= BOzua===TUiؠuG&0LGuJ-QRV< TD_BHҜÇqvv.vzD Vբu{{{B:<< X'1!>~B`tJwk/Ǩ'3sl?Z꣪-N\3Cq}.8:8`o'ThQ=~ ~sppTQ@p'{EyKm QsryLPX$ b=89?"65?׻\tWD?EG8Ou:::c]xMDtaf\L$>^ctVl )JZ߇j֗ ς5㧍Nvlܸs$T|9(N6j}딾?-[|r$IP}1&MؘOUwQO;ݻTtУI]:߈cpS7:rxLu5iDzwJo0mg1a]fpgSfWo?b"\X\hjηœd7^x~ɜ=]|,;uMHcu!]YE #L}W/rεhmf@#U%F4kɔkyԿ5~[RvFva~K}EؚQ̓IfɘɦوR姪Zv5{/D[a׬Yuoj̕ o?P#-MoB|Q_Ònlb"ZAMUTiaձ/{\#"GC녗OfHvh)XTfN3N9q~ɟEI\j@EK (Z~IK`)l ~o6zb'<40-iwcǎȈ۷+!sEKKyutȂ O 8_oN{}c5oRR e4v0ugKy9UբMqx&{Z ]'78~ꍚ`ն+ Ħu;=O@TDuB: Dʬ8+Hf2j~ 0aA݆yEJPi4VOcf֏]bjЄzJw2]WZ Fl͇_о_aA aקUƑ~z3alтN'rS{Vn۞#15MZvc9'25UDFGv~!uެ !:̞ɃSj5Z؈gS՚c)?muQQդېL8 kic7HNؘ֙jP c :ޝ[ZSH\9䯢AI+_Fqʩ$-h%_CҤ%ݛ1cЭ[7֮]){ҚcAS_9p4z)/PN'Luw!lj6ƭ7Nݑ԰^yki)),GGg 34!Xy\ km*7eչۄ 4hBLc0INXG0c#oʀ"@|Maixv'g=[t^\}(( h? ܹu+툈O"5./ (ebV}Nrkf E[M=x֞'gFB[k;׼ʥIׇ$JυHOjsuKnITuJV3fPh%U*W'< y ~a7t᧦a9K 999G[K$կU1$Ħh<$=%Ռ'2k|ϛ^텖5-"eo$[ڣ q~66P\..4EIII$Ep/^YX$0h S'.k;fcI?.x:6abҜA6pN115APńOkq7V/T:=tP;#!% ؝ZpT~Q+ ~e :={e$gHA@~5Ovq>8vzeUoSR @"'3F:Lh~jZtBY4ۚ_o'h7Ʌ_lb`lŰ9" ݻws!QEUWVaG|'7vLǪq"55s8H$y?J»-V\{<~#04nόMg7Lזz6X/wdΫX1lmF YqX/~;IMOfo_\'˦ @G8lxޙ/D[Bdg޿Ǐ]rX oi^ɻjjjZhkРAp&pB \l8~`, EG2XSe!l:~w%; 5冨i0n.\q$Lbr5&h mE,qwn_e5uv'plI.YsطcwPG9Ӣ+{ep+獽j݌F[xq11dʽ' -Yx욊Mfmuwv$͡5[/? 69EgjD.[ b}T 6֭hgᑬ+A8{ATnYu-l o.vT ~eUw)ίh9Hu4K.wyx|Ʉ.X_>xE6"|CC=RŚ-QǴ]]#ZI.Wٰ" Z__5UUSDfuAQZ;庵SV o7gOBnCCUVEEל g~t-4wUY|Q okю":1uo v܅@5o@2jLKraQE/X*QN D on%UYvfDƅ1X}#ڣoŧyĔ!Q %|)X\Zo$LZ2h%3(*'vK1zbfaۙ>c&VmC~z[/xj E%+ۯP|DmPpZ1>\64>Cw ?z>/[QU[㣨VXI,-S @%S\@ɟ# vgvЯGW&NÇ2zۘm^6&pɳߵ\#i^]+& BLʣI)y-s%W%e,MPdEhԧZ՟ 5jژ's68MX9*ڧ%'DqТ 9E˩%i" z0˻X\$IϢX R'/O k 6]!b2kLfk7sm0 &I@@#I$(J$H) #< RR=R}uKvgnV$KeKufM%i{eH2d d@I36 Ҿ KKJ-!4u_5n~_ yRe@ ?YeRʀ ?Y+˚QٚG2deRʀ ?Y+Z|}ek몖7dekpKIH.^(or2 W/$dzLMYdl2 O|eRʀ ?Y+W6-G޷5{~2d2P)e@,ReMmM ?~2d2 ï ~x|xܗ%vW6-כōk&Tފ/ïȁ?|;oP9) ōų't22*1ϗwer|. H;$]8sތt~p-b32g~eɚ߇[ev耛[g ' H P+{~ E_^~iI:kG۶m[;]kǘYKسk3c[Hvʌ aLu!1a1L]%#O[+gҥ[/Үcw_"|zh^cBƘ=hII `䠾~BǗ6A,6,S_9ᗑœ3aFʕ1Vjme&/Y΄ls-@+!9 ̇6Z1o#Fac K'wݱ)F+έƷ?Ĕu^qe}}%/uFB6X4Š9-Y(,y1'XҴ m^y8k_ࣛ nN|Sh<۠V;G7`ӄ'.Z!!,5>ϔ/.ҟ02Ĕ  |Vh| ۖӮ .ٻg: &_ڣi$T22yr~3MXwӁ$qWM/*<93>_ 2RVtؤ}{'+a~͈ᖚ_Tn1lz3:Y}h7|n-<Y>g,iRW/4U)7~/wMj3GbiḢO~ґZ5kPVm Z HYvBf]ˌÆd4zUfkdw_Ӌ6V͈y޳:{߼yݨ}Cn=o28mLظg/Y/{JZwvmIm+…&̾&TU.0:W)lݔ6K֝ Kr?ygoG2=f'$Ϙԯ5ֈ!dϢ^Y˃_% : aы?x7qt](*[V\Ego&,)6cSG1#g,x5 &c7Ta |lF&t7]GNpFZ5Ӡ!>IFWؖ̌a zmqiF73y :+]WIxtZ^wT IDAT {~"'-7QeD笹ŋ `9a|6X~L>Jg|{Ge &k@vq!hp#[hjԊ/#L2WLϲ503AM?NjS=z #L}p?R}O_BX.3Y?5jq=AO?"[σYI[9]f2WLn!%D3rp?FM]$ds4e2k 1&WSpֆj!B=|$q#"`klӜE'H8US =NkL5/q!N”hwwP(#ޔ>6?UB .zg~j43kXlFKKK:u?Sh; 󿅞aב3B3"X5իTcG%Rh~S7ø.?˛76V O}OIZ=~{Lh@j]hמ'=Q_ZquV\}@R:\zL tŢ(qח@sTVb|s+]Gfێlb۱l$UV?mm12oɨ_rV9WPbSB>#x$L;ah SzVf"vWP:s6+d._DZu)LwVlWhYOBs*z,~ mKC$Ry>ݿ]]hv;i"LvxXK6=y5 ]`qUP6肣WHo_nXz\rpn7]d6.n-L:rX#yՓŚG}cLy &OVlS~O{mZǼS3ں49)] 9'yc&765`S.V !ծoYo/1;ڢ/9!-ϟezmt?(5{ښԼo!%cte O"6MmYouxKCA==/'`?:O )>P1J ~L2YRxpc/Ml;A$7fodxk$mqE>d6#>pᗕX;lܰg 2Ȍe>g wyߋ& k3&ED)_>))W~uXo iH/2]'*k!:h1jvB"Fݤ3z[2]$gY q k*kAt=fa7]Mw11[5xXJN,` 뫇ԯҍ1"_5Sck%iS4jF 4!Cѳ%? 9r"Nn'7v F ~Iv?m 3<)o?ԗFLgK-j4.e(a $0% Oi"g,vѼ2x]24+pn\ʣ~8 eq:gs.tFMǘm'.QTV:,Ԫ Uhչ8E~bu},M qS=r$cǎelX>Cxp OcZ;9g\ٿ&5gDgH^/#-nM.;ay.۵& k1)s֩|?m{+uYy˾e>s'A[SU5uHC݆ s6Lh:jZUE|L#Dm7n;LQ+eeUTeZ]W/%ϕq hs$kٸѺ5f* s$7]R?jSFEEUyQlu6`upd<)PYESY״`xwS飼i$7Ӧ2T{x'8y敿Ҧu s8f0Z h'Z ʭS8sb7uY_5³/"]*\?7Y1=.UdeSwACZ"KMC y [jЪPFPXx.o_,$"6.NX[7EU>e dOE*^wf.[]xkPQs\Q?IBHp[$Dx'78S0#cqp )\E'ߤ2[V@$BpP`S*757~OBxDDvIqwB=2vD.+8(1k'驢P""# >m"L'RGdt=>]R3P\o-R8U2Dyi 'I2 }JjNhMLLWg{󂃛^ jȏbݧJzLfAW7:UJĮUMHʶ&/3-h!sayrۯ&+ɲ$C~1fHqITȨ$bza4ֳN@b%yrUFRgny%}u?)e3 ظ~tjV?5e21>#O:YQq7yZaJ&pVMoNjfЫA}~Nn^#TW%D相[׻/{^ /G[@^tP12 h:+%ùd>W_LwnG`Ҽ%ƿ҇¯}d+ӬD_0}e2'ï-J12ϥ\~u0n,o^u;o9|.TvH;y-+R^nk+29c'\ 24UK_Jmx򷌯!D2PTRd@ .L2deRʀ ?Y+^Jk~2d2P)e@,RKG#/Q+T<%n" /me}s{|p6_v =e}CWg.|=?ÖC~l}H|eTl6~`,O_uO5?ڟ;e+bU /~nѭ~L_/"G6`cn9!Mv%Ƅbb7:p?Vf,?~!/Zt˧ EOG 5~"{P+^!R)[n\nX.%r~H aԯUᆵƸmg6G31-ۉ=u8-Xy"SVzwD>bUe4| ;=;wK&TR ٱ PoP*Ubq0nAަ\AN5'_Ic.{X>>Bg -mFlJ9BE@?D8;D\R>dC "9'XZHᎏd]WۋhL%7Hq|>m0˦zhCLz~En/E⣐D=\iE~_ӧބ^9TIIƚQVtSB$EԋD^a"2m ~/oBԞAfNSDԓ"o)wIU&ڏhlћmaޔ(UC潉Iu? g&;oAŕchgij# 44Vy~fHƜ]hܼ3WW{KK~p~6fΦGqT5dZ3b+HC篓.݃:41hѧ"ijH7\L޶\R""2mDT:rŃ,QS.?#5+Kfa҆7smצ3 ypȑeO%b)Uj5q"<ȝGֈDVw )BCLBkϮABLZHH={( s9;jFJ ,@Y W̥ wPІS Vع4:/?/OJ4,~YQl[}VC794LeZ7#1.WTyN[:^OoksaGJ#G<ϻ[p3֤MD/kϣLErh[G\>vmFf1.Vݹ%~?ųB=&p"S=f{xwjm^'a^ foOoTK{i">BQTVaLu9o" at~kO %@LX}u?Y8J!>Qneb imǼxO8-4L׊+~ =}6:rl^O:{NڈE!ʾuShe̖swH}B)G{'Rac̮UhM4y!"ҳ"#-_:̦9{ƚ9c'{Dhf)lqHS0Lovg~GgׂmW=b`B: X!r {߇cl".?'/ IJGG42ןP'}w[.=ųVJ]朹i̔8.CISX6}pnt>*siչ'lĊmǯY`LmF 4h0;vTB32gkԈ;)HOM`VⳬTm2Vl -y:[P[Ǧ˿%_Z ah戽g/:/2lU[&k~E2Ld0}Iq9^ |E"zpT=~$x2ZpM~_28c&t6ĨlbRq9];ce8}ptIil͛`g"T]ޢ_AHaX[].$"t/o;V -.Ezf5}ɀ͕X]M*8 Wnld6m™+7qsLӫkʜ8qfzY]x<Ǘwbլ?P &ᢂ\b?զDŽxD O揱%;N$b4NVRKx}'9c7fBXR&Bq˩#ճGSv),R{vaEo[sjUa˙k GbL(g՞9AηBO3"1- Q#Ȑut//fSX\`?HdzWT{x{Ϭ-O*e+K?6)Sju [O9[U$;ynw]mWk@6V&&){?Tg;dp~bɏ50c&&Rz_:/\8$ig~+cw8&l&41~q nBS+[\-utVf M@YY6z6; }-jժrc}:Bt- !`A֝"OZQf=AK;n4b}r;X.HG~mL;$$ Ͽ$9.mOhߞ+1qHX##Y>>7~emIc.{XUƢ[v1txzj2 q_[AZ DB`,Kij?_qf:4ק**0gc> W)SY"^ᗙŒh[ C+N2Ӹ$gG[>z-;W72}';~Y3,7M8S9s-!"Lޥ4 w[#OwǡRK ~% 0~r?ǂIq"ʅk?s٪` hlxx̗f{+$d}'9qqE ryIOzy P ?~ TJ' ~|Y5X~2d2P)e@,ReOd'@~WJ5?Y'O,Rdɂ_)_dO_'s-eßh, )߫ɕ/uɣcø8> !nWr}2$':!CM`֙\H,Fb:A^n6NGzESOMZFPϟxuZumeX9AD.6VQtiI7'ĩ[ ^fpQW}&n'o4{q9/պb1Y|UmLQD]|["{q/̙pn9~@!<,GdOz/ms~?U*U^.F"/`*"a>,~O.mH`Tal()rg]g֨P)g;kC ~93bSޞ{ٲ`l6cG'0@nSⷖ"hWXKI3R8*5QG+!%%e/<@Ν><ԕ%4$gN'4â/T tc 4۳9.\87Ȗ*Ok >_>n GB~FФq39e'~s7d#ĺT{L}N._3?{BKΖFC._<Ϲsu\EgoS:.,Ћ.sN8=q]'K@prup%sYy'ƾb,Z (Zli(h=Q.Ntm[nEOAr4"ZĄBhf7{gw IDATjoc-˞blK4q}dDu旃' +Iy8?~[8a\,&;D>`;؉F51>͚[tA |r=lPQoL6m;hFAWC%~Ef4'wyToERS6EȂyw/M "]}\P,)yYɤqB (K*b=&dfT1+#=i)8D[V{{|\ Ϟ$<4J7:*+!uϨXxIi>JK$AUD3H)Q\ /UJߔNN EtZ3cVnFS]#.:<ٳds6;;?஭0l<5;c4YmN]xp X5~1,5ٰv{&B'%__We9UpbfMfeWFa*_Q|{?dg2s.m%o(DEЛ 5Uã '~J ^<^%R. )Xo6:@4q& .daiaϕReTMk!ɯvd)-;ގ%PWᢽ 6q! C vG`݈Egnk4 #"7omfG7A^<%8b֐[VOD1O9cܲ'xh(V^IA]?It 8F:t/'DB> kE %l;eqS(VpN>4/{i| %~uu?z2sᗟ'05Mmz~CnwdKR7n}E25#1Ȭ]>fOY6skpA/#2uVVA411WPS8&17{S"NQP6w~tMumA?j?PvkC0YHfJ".m =Rc*m%Ba.O2= _{8!Oh_OoPǧ`!ԬHěԫVA -G>O'&L>p[4[#g;Hy<0Tb/Rz- Ʃ3g8u4OqG>%zZ+Қ4[p:o碗VEfT1FC#Gkx↰iRGicjn̛6O?PU4]Lw  VEY[TLzX޾A%oٚ_J7=,:k<ϊTF]le8zhP AΌch(=!t3VCϲ+Yx%֟^>Oשxlt=42D,[p<UhV%oPc4tޖY ={ .!/y81-pa0S+*ʉ N3tfߙݷ[pMGjՙitR wq+)o޼VUۛ˼O?X+:^y2@?  ?3[0j\ v'JOBHx&i~Sg9ueӅ Ifz,#ZҺsOy!ee&p|,Zq+*O\9sO\*W^ekBW≎4E3'X4Ƣ{gr+6=b.͌2qQRdXUAOk{1v+]7y#1ZLS<t-^EJ%;?y}/=ŵx!A~!}qB;t%'8S^\O52 h4I؉ =Y|2_j\ |pK`td~vNs=rb5O%tr2>W~":Y2Ǻ6K&wi[ɟ2xdȖ~O |2 O2P)e@,Rec~2d2P)e@,R ߿~P ?~ TJ' ~|Y5X ?~ TJ' ~_3'O,Rdɂ_)_~ͮ1'O,Rdɂ_),@ e'@~WJ5_+ke'@~WJ/K+5wᩗ;pxpHX$' Re@ztxhq,C$sqW(Nc߀ ~+99p'{-bK}r$ ڥݽULIr,=J R9~x?ay$ډ -:.2m˦pF|Jl|tS-;/-ǫG:a,2-)L`"]fy`dr$''REۚGY鸃"/rjR,w/D%^⊿8);_JZyEu}z>yĆhJjEc1[kgXbĮbAE *җ^-u]-K\KQS1ׁ=sf|g{ΜT]?+=^'ؼfNG@jlUnk*)e8{X`_fg"#-C_aV2) us Ty^qE寍EͰ[B|ljFΝߑ-NmM5mWs;a{#o KĹX3-G>7Cn҇simO8K-|޽Qpqg1+Cɽu#+ѷiy?6;a2_:cd[ iCR?];^!>Z rqp4te\zwF?>8RT|j*BRqtHft4#z5, ;>SF F7cctb6rVT ?>N,*~VVlBNY*9iwPd>z „]zX", i#zO'+,XȘïcٽ;`_ Gc3㻙GOХ[wtټR4GPGw #np4~wPW'N_=ɂ6#1ح~zXH+=Pܬ7ԝ4Bun u%BrC}]%;lFfyN1eP%h9&} Q)94հ _KH)NE 0/B^׀+ѝʻ|_>>|ihD!A pC׮FjGNC82i - 'υ9.VQo撕U$2 ~H.HLI+1jM@~3[yǎbeXy K7&ղn&(5Z^rV=>ի{ f$eKI?bot>Q"58v33 1{`y0" {/ ikzb̌;p<{`jSw ŕFQi9^Q/:|#I?#;n%nn< ?`ֵzޟQZ^VQ_o; k~6sq\$|x .yn0t2 'mX Go#B*hRr 3M$&'ʙb1 V"! J\C5 C uTiw`] B/50 NZJ:4_cò0iT4гqa:~GCpw'F SagֿE"_ll !"e\˞]0z|:1ˏaCъ<$9CD? ǡa0Gܡscռm9Sjuq5\ݷfE(A}ѳ#:)ȌŔJh Y0SV%Eߗ0wQib~ʚƹ4as I"m6\ԑ5ʬmӰ+(gX8=!Nx-dX2qBB={X2^<Ԯtb$F/Y: j"MWtu^C?eۀ(OgBϬ`LhK W G`4z̍P09<,@Fo_-t z4Dz/@Euz,{c' k:TGu"߸+S[WP!{U%I!E#D9@bbGBlUUbZrl%hj1=ܧ\ֶfcαy.MVkfծ6MÓFN]6k&>4{'3nDcL?[^J'ν׬;ߋ9<4&bEx\&1pDd4ZuTG>=a/Zy=w.oƊӟۢ+knOY sc#{WSqQx$T'KlL [} Ha>)jtuY6K,NoR3s ֹ]SC#¯+B_%}OJc,)a@k %صzl݄t`, #a Ƃ>z5AZkGCM0j6n?U ؚcMB{QOG||T65n~O_&OS[3Љ+1%m/Nȃ0ܢe/Lz}'_Ŭ5`V}=& C+R+=Ǒ%1enF* h'M۸b녈~U]7C,&˯q)>l+OoJ+!IeS]0CO+w,2&/&XI5*rvC鏌*X'a1в{Y'`>\p{W/nt/hBtd`rcÏ4Gxa4cȫ5^NYWxZEN -4PAk p̏wBZ2iwmᴠwռlGCciYqX<,Y9Fp5*ʚ*ܿq=N<Mw~ W8K!A8{N]<K9H3$Q*R).y9>z7SA폡.0hI: s[,ݰ"ߺ~ ۷lChszU`u 7-jv~#N*m\lBƺ7zYc͞h "g;a+^,DZq2<hɉ+F ǰ9r{Ti1g;K97,M4cЛx;C o]TnMo0W[|w$-ޮgbO_v;r+Yo\y käZ:=:cT7AI*2AIT7]ӮSW#/-aae G'*9T"9aekGa߷/\{X@(Ыmy9Yi?sؒKdGxecu11 ZICgdKVNKuߟ ա"Gɩeke gW: 6nX0ůqkH .Ʀ8N%:ƦIs#2Oȁ2'?jnh +gǿxoܣe1PE6- H-y_ՂR / rm^c}* 6kZU fݟ"q+4jg"+qYk:u5fg kDi˅yzX6SHJJB~a1T4$!59%UҦWBDH'Gޭ7" Hk(exź5Ғg$A,VVB,a++/$2i{H5C\r!R^4KLLDzF&$2.m:1!.ׄ!R~~Z{'XWW{P;&TOGj!#'&\]#%Äg\R%!V.E'TaP|YTz::9MZc`id#%%eS071/jTj+)gK$FXlaI~OPޒf%HMg!^4 }Cmc:Uc;ḫ_q7҅3HJ7h7iɃ P_=(N7PnT;u N=`jX2l# 2woS/XyŦ~y_L* &(.*zcB^|^7uSCgѦo;_".?Z| IDAT#?9:.Cx; pq A ]X<ۂ0H pqU~[e}888 R~\)waY5`7Hs}988 R~\)beoÏÏÏk 5DžoSXOr=rqqq 4@YF"uܼv]6˫-xjHMNDxmܺ~w@hTI*ZDžJm fR~^ ANf:?|`i!'+Cx-M)x)W.ȟ]Q!JJD;(+)nu?fhK7_yi YgPY^/bzAKu/M YGxt~=t/^3Jw?VA<:@vF0Thyͫ,MZ̴TZiV;!#@gwCE,(JE|9ubaw)&ASK8~VcMs|x;o7<Ï#Ysy9Yi ~jw,MhT_zjXШk({vlŚիr*ߴRڦx5 \buiȊp^YDCM?m-9.6nAdZ.Z5RCszso%znŧm1(qo7tɓV`v䕖 qOmXb<Mu!~ܱ= 2!P ksث-ZV*m9\݋:aڲ+UCJ,SPМe[ipqqq WS<ȏ gkXXd"77Iqta?74@%)͟qԠ;¤؎BN31efΏk4PVb e}WB晝p[HFۺV-?m/Ǐh~"4jVaI8v>n`W6TSPAZ`l3294B1޸c;)nEY$JmGi7?P-9k)c#|` BQi~_=?> >gx5)t <H ,Mc$t+nWb 'fZx8a1hM{M˧ŵB*9zڣ8JZF+_a/kM .$. G_0qj4je 8RCZa?WK嵹H}ܪ )q̗l,\6P *ckc[\˗/uN 3LOiZ>=q*ȢҐyYqɔC-)@ЮYvϒ1`6:JE {:]mW:ߪj "c\1f@"m|ÏÎÎkM $ `dcb[t1GтRjdASGCgSܗ(,@ عKHm ac{#BwqY\m~ǜ0L᳖;sݎ7^Džߦ??ZISqzgб ֜F):(Oߪ* ̒C[Gl;*%ObZ {uTH <涮8uuY[Zz5Tfm]~k%:<~ۧ|S+@c(gaY=qznݼvawXعpSA^k:nK ( MqwS,۲Of;$ƽ~M24¬1fޅrr|d.Vײ888Ԁ~l?=!0D1XXYvC'±K7QY%Vec!pŨ476T-̈Śchxn!pGז阗p<Gy B/~f 䗔F#h{@7 Q ~,r`YQE!""|)YePyW! + Ǡ@KrSq=DB"~~oWJq."##6!ʦ|r߲">BTt,mzs^ßkM #Ę'50FBqg k5o6͖GVtϿ*cr^.6o~fZ 痀j XYHNxJrrkrz@/_aAsZ}mkgb T$eq,.x;_1-n.vӉA+ ~lPJ}H*ݎEI (C!j71ˋ'=5CRYJwlϽ4C " )Oh JCvG}MYlyL[:C* :>B HI1 ʾJdž|98tbЊ ~i^ ',nop-5FH`m#Ku~=3 EUڴu*)_}Ok{aH???A h{m:׀AjVm?4IENDB`fotocx/images/prev-next.png0000664000175000017500000001173415247006660014741 0ustar micomicoPNG  IHDR>a1iTXtXML:com.adobe.xmp 256 256 0 M'IDATx] pE݄h*KK<Á ` 'x"Pz \òD$@"!<4qx *R> ;eL$Cw@VDFD㷙Ǐgdd|4Qll,s7@(j;?t:tHLP@* ͪa̠yA4iJT]oב} hHJXfH_XA Kŋr'5A?!zI496o޺Ƅ`E3,Z^ ٩ӟ6ZPIXii١^rżcgb al3j1>S)fP#񛶡Ew @{KK-Z|@Oeh񉙙@8 ֚޷/eaDd]TI?}v$>z={YeHANlx@1jRK!CL2juEF7x/ rIIiZݺu.=jW,{Q" Y`_`/țQVSBxcJ6`I4JL': hfL#""h)7ikfD P"8,AUg(/:6dI/4ڛ=4iD"64 Q#P~@=/ h!_Uo]3_8ԩSgD9IZSNS}?GM'B=,ETXG+|s찞.|$7>!$"X20(_;=BA@{ zv1 r_kgzV14W S *PNS4.U+ Ly 3N] 󠈖~FƑ,!l1@P WQ^譇 Pa63С\#= 4KnwrؔJΎ`єl4ti I,\&yI>oYBpx_]Fl.a#:VYi=EL q^'<γ7F\p9/ lʥ \K, cGS_ziTTKΒ@~;)- ߿4w4t_~ /ږ˥ɓ|}T,/Y<[m+$$$(OL|AGKnKv`qұc_Ã>e߽{KСCm%-v>.M'2M5>\۶mznRCy"}Ξ=+ g5CJQQQL|?p:zВz!Xڱ=O<);?m?ƌIF~ǀ5XڷciSԵkWG 6w>?:1}E}O")={`VҥrVVV]%/91e74667$oܘ`w]8MNC@ ?(Dޝ}+P^^-ynFa J)Q`x#φ4z(<{x#70htⅷ?s.NYYٰ3pWj H%t8ѥKfOPo&6;`ܫWOf`od7Pv*3'(J1c rf+W^Ev2MyYw/XϬwUUv:z3ztM' z/fс_`"-3 "kw8㈏3u`Prrr:; 0INN]yt7s(**OTwHd{-ߜhza.CkǭޒA'0n8Сl ÕX︟w-qKhJaS-gР#_ڎx'o펧px#rq-qZ[$L`=c_3gjhY)&h#ϛ7_޽|[T ^t9s׵gOl(";).%3^SS=zr#on8>n.;'pо}FSN3e1&om&Amܸn|-@ 6]@ e X=*,B2Q =`Aoaˤ z{T,`;X& eۣbA{2), I!`c{ 4eXIfMM*JR(iZHH023150100fotoxx-22.0;Markup Text|fotoxx-22.0;Markup Text|fotoxx-22.0;Markup Text|fotoxx-22.0;Paint Transp|fotoxx-22.0;Paint Image|fotoxx-22.0;Paint Transp|fotoxx-22.0;paste area|fotoxx-22.0;Resize: width:128 height:128|fotoxx-22.0;Paint Transp|fotoxx-22.0;Paint Image|fotoxx-22.0;Markup Text|fotoxx-22.0;Paint Transp|aKIENDB`fotocx/images/index-files2.png0000664000175000017500000015247615247006660015313 0ustar micomicoPNG  IHDR@tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 312 495 1 0 W 6X, oVVҟ[Pg}K*|Kr:NVV2334rss8X,rdgga\rQҗVd.̵mSPg@c J  _]X:,=fcl >V6[f1},_;Yz9q"c[\\{ؽm v?ǹI+{Vz])+j[{#WAYY̲k 5+AȖSfdǟq2x `ҼufVǁߟ-L0QD?wS2|[ZoP ]Bmpqke}7'' \1[ Y?1l'@,:OsJrwL!%. !!a#Uz,2rW+.L4Ӿб+۹##w<^.<neu?Yey J6Cߺ(AgWڦ=F߉by ЙU#a:}aуC|7( Vh׶ԍ"!$"-C^^Fzq{f(u9.@jf.2bhs(+*q|pPX~@}ЇìEAsfwܭ85P..bPTUG~G7=E|FGr<[ Ü}11(fb q>>: :wJI2t1fVd[ 7цDĥa>iZ,ܺR:CXRoG1~PZMc,zJ&%/!E|Tyrbtіl2i#ҳiDKtGp ﻟ^znɜaYͥw-\tكs+֙i v"##}z*ߜ߇܌{7T L`˸r7|o`w".^ .  rr.… zAuR\@u>>>8;a(,}a"*&|Ƈ/!&9Wu&PWS.,]VJ|>0e%y9 #M u-8oRA(q"p\^A|^Z@MԒ9sT:Pp/|}}q DAy<xaȾ_* !wJ'0x% xx %iwٳ~ͻFrr Cvs<$@ymd 7-5 .8v"!-hoNŽ%ҏIhTb< KGz{q;HJ~ݮD./eEǒ2|)5Ep6ܿhiiCZZ .|f~ twʔ)C'NtZ}~!߲/aPW0]BJ.XlZ6r#"{יy?o-eEF)Oǹ`e Yq 0jC~~,.S{1TrRԱ#ڴmcILJ 0PU܋}_~=Dd@wwb8E5kAO_Xr+PЧ!v]VNP+@Ѝspszŷ5 fJs: C2%nѹC{Ct}Ȫ<'kka.hˁIIiAGd`= H 챦O#?- Yw#I}U>)ޭ[7/8ɕc=P9:Rt! h Î ZobU8Op$ɭ..&1I p9nlI1QKmޏ.c"ZmҾɢg/bK]Ϻ90PGsuo>ݼy,ZY1w'Gsy4$ [pŒ%K? >?ǿsK)t9qkV s`>D@CW'p9 əo\ee8s$􆬢`-uT $,ǹ됒2^[䕣AWŒDE0xD:ap=\X\ }Dܻt+@X7  qbDd̈́#Ƹ7;[ m`Yg@KU]^JbvƨXchSSpH*-GrL Bp-]0u=E! wP^'M q`ni f&b)066ÔiӰp8 Uz Cv6 ++p !D`Uoc 0Ro$/ )ظf0} ,>ݻ,G~ʫa ]]1|^ y<CAp8 f|D~NNn0$`ln&a9@"ZQ!H,a! GvW .5Y9T. ud!-D (9 f@N}rrsyqa(j Ƙ Ӱ|"XZZa^3A-`rltpe,­0T_:M,>{n1wYl19\rjbR wq|$Cj.'f4b5S,CLp""Bi5v dl5PFV\cqm @iu>.[| 68Ljzwpx\b7xc4L]upxg6X[ֳYLV. TD?;l8$Gyc6d41a7 9oɩvߛ{(RKEhx~P5rCLi1"ȝ80ua%$##:4!׳,૬B :!449GAUQsSU4²ވ&DDF!#UKݻAHDaN. Sm'Oێx(4,OJGc+r܌I@xn~ P3),l@֠(LGME`f:05 0u%$f$JCF} 6zU[M ,- Mqsť%Gaύl ?}1Ck|_!8$ӈ_,;.NpPU$e#g%$FLg)sØag_zgOx0q&e%Z.77sȯ旅ɣױzls+&9C_SJZq!->qiUL\qUd]٥j E%v惡W}y7\ [m"г:R""q%HJɕ>k>Ƕ-0ߢla _(Ms}_cnO_sFGKC d?>,,,0&Z|jǁǔ<e8de!1w"PpjWP.]]]~ǐz|5߃2XrB~ O߫͟+# 6EV-Y(hԆ %0'o.>qo;z .fjSq ~s",9;ƠWϞPѵxCi%ra)Ix3y9ndpN4x (Л0F r!KHBGOtCIQ,\ UIqqá (fm>yȤ`Ff,-I)Ї-M'<|47 u BijK=z&Llnټy3nY~͹;a\{J/x18c&T9nE /:& ҆R?mYp!)ǏC\O1-gŐ1Q\ڊxX2dEY/ť&%%)@,AUI4X@AY!2T!J V@m83JCNun Zh5+ u,?t _0.i nqrԔ;}Kuc5#3 U5%x;=] AYm=_Ul\Q!! '#19b* [@ rҐW7CW, ə8 47iCRDi9Zj*ⰑW;1D".55ƶeB\<ΰqs3 uzFkT\xtN} :[-|Mn #Txډnpۍrvo02$fсBG`H;edz+lY عzFE>" X` QXa'м,|ka=FXY & (! -7MuVop*/b.̏016XDd6u5ԟzw/c;8߰0?')ne3j kQ4s| +O07Qci{ܜGcahcHmXTGK4.ܩhGcqI-(4?.cacmO˞ai[I> yZÂbemud 2/3;[*=(7)ngboşf?^-tJOđ+0443mF+=I ų0në6(Gg:ዌ|ec8Jw0\BXF^ Q玲KZ8̨hI&Έ]`cMS%lǃ9ߧ'\{;6}͹[/S ,(sk~O6>|MnAܙkM\f07#<X:[ٵ \V^Vg ROPgܦs{p:@3N9Jsi{ڑk xYX9 `uf"LYd׿z,]|8q:w1,1:%f%1+CX>edO˗/ ecua^VgVGAނ:-3L+as2d-?%?S/3^w: )uǁs:J8q ߪ%#Jt|8q:J8q ߪ#y}mpǁN8hU:m 8tN~T`cG2]>>.Np:?01ތ 8tNZp |8tӁV8oU ύ[Ljkg?8qtNZpU)Fo@|8q:J8q ߪѷ=\;HZ=KK~!#41jjk> :&7_jp6wPx}g LP|`eTD߁,qCdV/ymn@X10+o= 큉N=Bũ\K"[(pXj+6"W_WZP36GP. 8uY|-kN J[`5~!kwF*Xx" k ݅B{z<).D=?>hpi-̘@)aو-j< 6eX^ZLomhΣ5yx9dEzaOTj꾍|Y[R殩vЭ7|S[f=('u`}336nfʰI-wsk+/%p7#0'LG`b|t "J/&ipuV#$&:cJc8NհRT?-ܯhH#/6Qq^k[t5xz #гK`XZZLpȸ ^ah{XQmG9`Վ+nssJ]b ,-,#1e"܊Lx1ؾ~)5=v<2l"^)b 4ԥ 7b8~ݭ) V"*CMoLqWq?~!CQֶ|g-_贜j>w M}@zi .[db0Uz.AbyCxQvˊ{r/\?42q&ҲwSy;!!@̛>Ƹ $)u: r]Ӱ3VGmn: ׎.1|JsUpr298b1_TgzǶ-1xPƭE\Y7;c8|0\Fw3_EqWmR?fLt lr!5rDž]ŌI5&X lxy#:7zKBA Jw<7//'lAYc%xVPgV)t5onx'%liY~xUrprbJAƸa4մJp3C ݻ3 _mU)EY *~+:@WK_DYE9koA|&G`[5[K䍲MOӠ*-Eq8鹨,ʼn!). Ƙ:cLt!,"PY]դע*Oݻ4&,'ugAZ8f0iDd 1q9u?fHA@EN 2Jjp6ANV Fqv.2l\0jtŜQ:G|p)\GNqKeRr$C\ehk+,WWHUʋ3qh\HBUNn38CU0qin` CjqۦEb{NARN!~3DEEa43gO2';O9J=wW}N@O^K r62św=4с>\Wz1wF^VM1m."RE D$e1fL<j}il; >&˲ؼ|$Dk2-ĔUQ *RcF&4gmf --xG#w/L51f,\CG(/:߸pUQ?D`L)09(Efz:J˛_F(KQIϊ8Fb PXtJTa6MBBA:KJilsi+b ȫFV`ȱJBqq!B]{zJ;*}u݂]SѵC,ET%h cLd7A1#= < 21Rc'#$6f8 "O!N] @{jzz5Te3,?0d: NBE`5g9dG})'= Vj#Ua8tԓo<5nzT]wG6A-z-DǞXw1U#h+cET'>3J_r @[ީoSߴ_m)oC"a䦜EN0zT5;0Ea2\f Am}lPY N?"^tm A Ru낝Ql)\S6֭)/@uz>OvV5åϧ@ qaD(ťwWSzܱa1e# vŜ,\0w!#62i=3GwQ"w2io7'\9]cۆ:imttr*6+bَA 3҂L܍[N sd9d{b߽*[M></DzĻQK Bv;$=a܊=~xC4$1yaT 3P͒:(&@˰Ԥ@U'CވJ3MYTSʞՆCQl#Q+L8+\uUo:C !$'?tm%zI*`X:N쟏}䰛MیoX)x}~x=~hUpg%tf-/+zeFP_cnP0Gdf!]Lc1(5_M9-XND0k\rwD{v,ݴ 3bIRb#qA"V'b$ [{)@FVRRd$tN;9 AQYRRү(Rn{5׆wؽ%RP揁Im"$uM|CHj|4|Xppw'nQfq*ao3]~s">Wks?3ocrKޫ9MVh)b=OĆ\ !*L RDsz~1ކP7ֱ;TUcV36-=Ʊۯm=*rrtߛ׿*z_{ePp *q "wO!LY DN~|4n`=a!2(3o$(7SeaZ x.!r9K-'uxt8zwRr-ٵrV֢Fvr}e9 =v~4Yо=e>i}^ۍ޽eͤQLߒQ0sc;1HK NsW":5u ջ:Cpl'*-5NR2.|K7jljdUփϟ" (!zm} |%Ps}ei>4Ulܸk7n!<2 90~B>Nh(B}n U:4{x]MUH7 jex\vx%Y F\|Ig%*)ijp~ht&KY$j3TO .sG o5<0֒+<)mvYx0ANC =X>U典~nLT`dbAFRvo-`;9yrܿy&z+c dUDpƏV#T[s샮pC]F`x HP$F9Xi鄿Nh:TT Lk #M3 7POkvXǦPWQuSx0h`%H@s&Փ㎢|Gl 1aR88-0l5MxQ5&]0CHB16Z?M,>=4%@Q{ :cѺmjg_^SBG] j0634K{xc5Z^k\Q|مSV@SS 4҇ɻCuͣjIR1,nTb LF(jZzaEOJCQk ^|Ajt .Y b$ &uHQkߊCL?&"^Ǟؼil GOo*Q=ㅴ5rpc*_/`gkbi1nl޼ػRQP7}`H}n]]^[W|c6\ hֺar]TDe JhXTQR[{v~m߁s4Bm*5um¦s\FgYQ&/ycmklq',S\q8~`nDDӈ!,8zp_vL۩<' "] y-=p?6BH"\yt:`Z{vPgz0+gNCJ@C~eύK`AqThQ׏1ږӁ~Q q^dɖӁW8qa܃}0qmǵ|8q:J8q ߪk"9+ӁC e.Akԁ|B~ȧUI{=ԭQ\vVtil|<@k7 bc@ ?vܾ۷nӹXg{Ek#WoN߄?{NM4 WoIm$ёqqsqZ+Kk\?IIqCj {w>q:N6Yy,Ԕ|$ebN>|Oha-ދjrxQb=&,ۅZ]i7jlG.$wI)ݻƌ57`MXKm0k+ݰw/;K_D/%X|5<"};'־˚/ gԁ?wz)$DcW`.~$I1=|۶󁷙΂p+-^X)Nha2K %߿`д=0:z==eI{gr/_~Xxe1ؘ)?Wǹc߃2R 4ߦFkD){MqhApS [C/~'r>*?jy[emYsphl|R{+@Aي#pL]{Co]ӛo 'jP143delq6b)Ա{Ayx{--sBvmGH" XɃ~@ٚ{S5]00' 䏀8v+ זnbmN^%ll>= -ڇvЁ#'/x~$t:ƚSN8p.R^%йC{ g\_O\~>|זa'WehtDzkhkq(j[?#F9µqʹ ߜv0hb#/5gvo1mVWՑd&'ȴm-z(>qsBIJi{E#IcTgFc#]YK'aig]щB|3MTp~FAБ6Q |6@w\b [э/>9'4I`؎C4!-+AhsGjN.\ zPnzk:RksZ"E޻U,ѫ{w [.A@޲ %r'k_jȀ5DY菹Ce0~fEq+$5Wf0/Z֟4/t>h+BDX_Vjh۩7ri)ԗ dib.mj.U.iCٳXH/[ B{}VSPh<8 l=!a۸t] *v7הDI%TiSđ# -3.=.OУG{HbppG5Jwx'EzѰ/V\BA?Tt-Ƒ 3 WF1;?mB_;{3oD N''aܶ-4mfK'͂Z{+8̜Z"Jx > =Yn|4fV},Áe!g\ {A0\ Ilp>+ gn%L0ǏǸ3X6ೄ:&ZWsRK.~&pss4 B,\i % IDATiZ 98܊ZYl!5xQMӹ55 oC\) UKiq|&_oFgaE;uAϳ^|/yg L?>'BAR_AՓgx^su*M/U)p}R-g ,Ai2WimHCa#Э0@FQ~a҇;⻳uTgeQ"MAw1Ey| ,!KӖu>fLǩPK;ו_nR8 a:q4WaL$Fx3-(:_$UiU6{YfW)xGA^Z 7ĕkpc;N{@ܹH_>T PTZTvEGmM v,.Rgh 5_/} Lika^[\vQ9*a0~5J 1uz a!PTӃx] Xw\еdR]tvϸH&rIk^Ev/G҂e-?[wG;x wnў{QTZMy){nKWw6g~|Qc\^'ap-z8O]gGܽy ~-N\sx^;6`DWQBM/gVl@Sڈ&*ҽ 1K>|/_b ~?gXpGOZڢQ\8 |A |6 gX\Lyg_ӟftp)-/Q[U/JBBTVuՃKJ X;J Ex3yQa-TPO8a|;t [p1a`fenC ]]J Z5f抵gf8cnr^&/t80eIzmVec 6 r}􅫯~a pz ́,^ e{ދ=B{^C e.BCg y?ña,`g i~L,a:Va zI)|>-0x! 1q3ת0?|#8 d< |6ՕhN²1$ӧ}K!)/D6za,z͒- 1'B.27 ;̄tԦ3N__ wטaޒ1@*FW6B7O=}MUŷnFNy8cյ]ء|Te[H`ԙl 8njhS|ٟ6Uˬ9X; Bv{Amqr.9S`(鵠z'%cmE-ʼnpp?+?MڏY| 0:f6wA6mg_%gU0? |/0HU{H#0ɰ7&띣9-kiŬ=8g̵%SO['Y.BO[G}i}~L?qԫ[,=~率gi߳_(EZuz]3nCSp-iW%_'Š P_;0֐(+,\rmrb5ƠU`2uGC^Vc9.Ww e{@nRgt$ŒQ`>u7xrZ ¥ F(g5uHEhfNz "[tf(zFD0eәW} -SWB/6/%6aFA_|8{p-6Fo?U;#+(jwQ;ӎ`+YEMGߋ+م,>zi&uucY<˱9e;׀HspN,mKt{-tE[KFG!8^P!Y.S vǃd<+8]ȠCCCj1iޝ׻-7wחހXa:z |S[fB <]siYE;Oϴ4?iF Abr QZ; gQ@$nEnQ)T׷!q0u]9gkg=YEpp8N%r3HzD|HI%}Y/-]2Ӗow,aRW*Unɍx_BcB4 WePXW:ODpXKB(Iup ~KJС r?&Hin'~PoHyx8?TG[8gÌʚvv4~?z'# 4RU6YC۠RO_lŕGoqap&5o]B&g4Ȱ M9y!/=_KN_ I|^ϰhZg*`gBq᭳=4(Q6wƗA‰vb,9sU<߂Qa~kUEװVFpc+=>5toж:m [ӡC{44[2unBsn^OSft7aQF~-Y`uwbJ*t}aQκ'Ir,)[W\MuNj\%I3&% E'7s1ZzZf9nڻW9Fc p悍c)Gsϝ91dyrdffxb,=s`}&!1"r gecI|/ 韄@@_h I|] $$-$)HWWj\1C@"bRs3ܤoIH#T~.*$!(O!YmôJZYvf^ '`Ŵ fK PK+ȩ ej/{4R~iF/:p~~x1tj e<~@@p1YCK >+x)I$:cR*6<'!9X"-],QBULhdw^=_ӺAmO'!!xy^tR' u=n~tޟś(fwY=ZL*J]y݋KSi.dIW`#ω/'w[1\ӗ8scL*4kTԽy!ǖ;0me%6Ջƍh5QTio+%Wjy/}==uh_~qdb@S\D>O't鄽welBWSdbc/ ЭR˹e4U')'*(s#C,/1l,)!`:|'/?(m˖dԪU+P^m hFujJEeᱹwovoZRXe|F(/U_e0pg0c4M _D&쳞ɹzqtfS@5һM| O|'#S0D%,ZTE;/ ~KzKjWq@!P{^G3ĺCڇ#[_ʈoڎ韹\f'ޠ{ʴ_??x8 O!+ 3Bg2pvYugG;mrƼyRm^!ʛ9_I]fi1D[_g IK1;; !|qXʑ|om1+QR4[t_N:? 3H ņgE;Ԛay{^yy۷ ȋ%}1O/3#ƊhӋ|,dbpdfmt-$A%Fa-QEwϮԪZELl\߲C\ {#!͢Z,=GN &ova3fJg|mHK!,8w,n(-!B9Ax&{pE^8/W6ZQVnG%I4iǽW>c&TTlx-M,!B,bUZ&- ѡr e6Wg 㩐?8Ϯ\5hh :<Ǵ)W<gӚժJْ2o=m!+6h3d7=,רM;qa@թ܉WHۆq=s K|9yYljѠb1wY«)jUb:16Qs(´HSHOԔ];P#! H &‡F ~C# =R$-+מ](ԦuH % eff}F#Sgt }RYY"~ !ė#Ɛ|䏣Y?X'({>?3C!;Kt{ԇϥ3 B_R\(.ukV,^[ۘyO2DLϱ/xj=ė#bȞATYʔ+'Uq=njF(T/Ge)W$?bC~J(]\?FI1,Ovc Tχ@/#- WЀ L0֭*6wjۜjDʂJIB36ݳ=Rm:X,`_5kְuaS ~V27'ҒCk-hny][riRJjdȅۉK*: H-f}Fqa&&kHMUݶܸШX9)qvlݹw7{B#JVq-6׸u>na#_'C*ם+|q&#O }ܽv+vda&ʈ#.ZҲI}*X]󟇸R| g MJ2v`q&BlmK{;*Bȭbm1ڊqt"Q~viIxG|~|,E1wV'.^̓$It<cDX0v6ָ~]PFsQS^抵>\koId[n^h˕kwyU߉{eyWcMx'0~2RcvzU++Yu}_:pvWmz8l{CD~ʽ.-9Kr n?"$y$鬨#P͎JwN?AA9/40l X 14hԐzjhB6hޔgr7uuPhHjBOvmZT&81X6 *T̼MSaDf>kb|ڽ=MhT5ԙ *96;Q:-t5hPtmjX{%kR_MV$Jȱ/. A|~ajRu^m'/&^ Ʋp bFK [sl imtVh2//fRf͍2OdAjO)9z|qa1R'))dp| t|,L(j:*hm 72cRwLA|=8*Ͽ{#浣iaGwz5F'它}&[޳h$ՄY7/xR_9d "7S N&J"$!9߂t*Ѽ0#FлwoFɯ|bT&YS5TmD$HI6 Q(q td%f2!,K\سZl(!ԮǸ}29} +' 0m}//O;A<eYdqguGN*F|y;okZtJPD̤0nEy̺q=Κ1OѨŕ޹z՚ZqQh ZMYeH,H"ωO  83tR>V#p2e}o]ҴPbqZ {b8$dחدh.eX\۴iYR5б;ws;ctc4|O#&L+UJ uB>`h͏ ¹R$o7kߣkiXQ'%@xt~'GE:GYkJ> mİ)K ˆ--˔cM4o`BD! !N5Ԧbn.~ 1G|OYPRg laDjNh]zz9̻ e$riHz݊K{' ckǽ"·尊(v󢣑65*2xER}PO A|ټrM k1>%O 0o`o*ȇ|K'y Y2%_m|!!&P6u/_kOhX|ej|򞄄/;f[סS_6lw0TFM͹IT =)/ šap(jTɕO)/3ytٕ+Wx/%V;^?6A|/;yS$'~ҕ;up&?rwp z <:7II\!K,pgȗ.W9lZ0JULN/zdw ė;*XL?W+/4d\e`eכYèP/FH$GOmѿ ߆W-l1y˖UɔK> 5E^ t:qbqޏ~&~]b"{Lj2vGn̑qȒΑөX#&o`KX 6ۨ^S{gėŒҌN4VVLS[Ϋ~ƗGbl91G \#,1weķNЪsM4SHy!iig_EB_NvoCV]եmǎף|*w 59:Z]DZtth2^EwkX㓙:c^fSzѸ^ح3u&S簽=vMio;&(uPPo"!Y4M#lʘKHOcp幓޿vе`\2cDWٞa9,:,|mc#6+EXFOΠA߿?Fy`pCZ[(:79oCڪt:=gcQֽVLjUe:ŪiZ<{+aTY1k2iѬngf!c2|yuԫb gu: LEG>=.0Ja+;]?]1DY7Y'a1A\\-EMb7dnބ<` LvjCSQnXl :¥g^1 E|2,2/ݞNB @؇'KQaX7}0;`lރ5wv]ƣgx%L c>v f ]̴spvcbd 9[cЦ{qUnt3kɬK "Aq~=: ө>-Zf̥6 ) kEfhx2?e қ=*.{:w/V= Fh}7Č03ς/a̡ 6m}ln;=q͓iӺadYk "-?&8N‘ƬM+v?Dz^.s:LټsְM:bdbΆ}I*’Ӌ+YF0;/`j|dX[oO.XܥҦ,x UGՉ}φ06 VFwp~) M|(K|6,R  J|i)qd,8Ta~inZ{? uH%8oBV]lNT1Bdʲ],:ͧ.֫BAs7j-o K3n8~އ.7KψFd܌_wUj!6̒g4E<г]IJaZ.'d,㷲UmX^Sx`Fl6I}ܥR%'>O͑uXJn'h3v|cW±^K240DzY.%ӇZK+Ld=AYB%"* 3WeJu^ F(te79iEcc vTo2øUy0 wPU%w>6yข6,mJy[gT.I1t20^ /Rve;+bnɹ%D|?TwH(">/)W38l={s}sKJR w8hUFJMNCg&H[r42ڵkٰaVbPH8j@tRNymQ֚}=r"ٮ4祘M!efh3ꫵeAp#eǘ&)9m,'|cdוy2''wB>>2r!o< OG:u~c X^A;J3?tC"R $- A|Y9YQJ8d 4On SȚV/~D''B% e0sktK|@|[6=(a͎8 s1 nԉ#̘8cINEF| %;r4‹S=ΒxBeݽ~ to(CSs<|fG@"oTBPėtWadĜ w2!-3zQl)YPkكW*e)6Ÿ%c:St)tըقkvk-'_: ЪUJUkaȜueFMkT (64%Ddyi2{mB"2){4}54l5;&gsǂq1Đ ;'Wb$jT,'ȫ%KF׬b)ΠU}F ᅲ,5*؋9cQAT$S# "R>?:=$OBG@"+bD|Ÿ9$+r]*5k @USB ]*'C@"äJ/H#}$!D|HH%~~ M|³&f̘/P[)59cp۟q {s6X) $+B:( |W1mOzyS=*U嗞JRԮЙk >#1V?Hz-!Ph$+4R? "}hțw~͓ +T&D?J O/#-W7#b [} ?  ސi(:tyty J99B\V*3=;X n"شsb{&]UQi3 MM۳㤕AZ^g~̊ȲbUZ_FYjiT.ͳ+1RSeQ[r0>P3(EsOШ23 jT^G_3, S4lm^@rC&2}] B_JBOJs_.KKnZp !6p)GڷPįkL5%&l>ó,F]|5![;yy3MI(% I@AP' dQhSF QߌGmf N{chځzS_~ 7uvo\  ԯY ,@9=5UPQt6IGN bNa @hV5jNh%$"hbhF;72-lmO2aѥ L8VJI@QB'\9YD N8zMr flqQ8x BXK7qDm3c 7W<!'!Qb+0fvx.sW&G[<g>:5<"B='!⛹)"4DMt~.Mx}aZIiW|ZjiGW820WM m mD$ߕr\fuiڈ1d /# ߗqޕ3&չx" _wEfJ_TNB;"P(KQ<'/geF~φnX\#,>JC^op8ݽVҤOn<#׷tH)+ B_h 0vTW|:i`s{d'6hEu{1 Z,IF~A8 vXwEGYL]cL< IDAT-NID|DzGBgEPė" 8z37G\\Njޤg|=p9llF<~Ɠ;6XFl8a3љYɸ>ū}T([6)%zqP|<&eJSwTy O("f?_̸31b0CGLd3->?[6C2`Y-gy3Y9l^4 C0`dHtF>kGз7a +Re_z!m__A6lr`` ӛ#3wv ; vl73` 0Y u#?2|fEj^?O-ZĊXrE] HO-Lٝ{2t}0Ed2ktTG˼koʩ#߷?'/c1+ ]<Yl s`E%%5>ɫԮJ|0H%8v2'z!9CK{;%pHg?;_^4qsLFp/A|,BxBCנN?6 btF`n+d9}ai5jcXErėF T& j8קlKBƒhP)_kii<^_\p 39t6yԫSkqLH ]>w&O8-c&wnˀy'H4̅WħޤP};i2juBRs3 {@Km$q/# & ]yX& &,L(F8|ڿ918ۮI *'J㝐kWU yPF|:3`y|?˳A|6{x˔#PWFˣ^9' ,)%A }XcHski(?ߝ΍1NnZ/OhJ猧.l޶M[ᐽ uo||8G$w$"T޽v~flA~ 8r1 rٌou81} f`4l!Qɩٌ/='>ZTՔ+O;PdȲI=QVaYk_S._+i`.8>Žhiʚ#ւR9w 1]_+lݒE ݸ[߷Zի/UeĖͺ}hч.aGorYKb]sl;3,8ɛ(lAX+7 Hٿ'\L)\b熥T[5֏yփ-sGR:{/]%5Ϲ$:…*f߾'($Lץˊ )>P|=vA|'܈!6>Q~wXe UԭR]sKuYx2DeNٌO_sˆ͛ٸe''{a"=AJ'??"L} TkTxj4nF~c сQNk|rSg^sGMG1O^鋖a1z8Q9stA-{hNƌ0 3VTZ!-艺t2y^|(>mn}0|T<~.5;1fH,hˠ٪&-d"8r]DGmbk/sfV8tU5>}g[YN^dzzZI"RK ".dΝ,8vIޞ-="P?kåkI3ۻ9pO=LN+\f4SXe>> <idz"vbמOLpL 0?ޓ'p`?,^c$ riszZrEܕCv 9\-NklQ3Ah޶'1Y\7!99Ö>/=b.DgL\ Zv޻Gʇ<Yn2зܳ ݻٽnŌ.kbƺ{}$w}wd,5ϕGizVf_>$oU)>6 WDDG8캠0R?s^[IHvT1 @!/oV͛@_S u4q%[oWk~!&"Uab:Z~a}$<Y#{VѱH_| _D yR8u&y"Ƶ5|޽@NIxɔIo+KwRri9q)sXh4o/] SR=%B_[gh(b:>Ct[N#qvlfӶ=:o>!y{9g׭-l:|ZR'6b!;{RCxls'm Em}lZ-l֬2opt6o}ؼqN_lOBU*+7.ݬ Tm$"%$:]eڅ3iJꪌ?kֲ~~E;ED|EVH(ere*rv>53==hP vۧ;BnXp\kH+ͣ==I1nDHshtFoccBHyg1?Ѫ1ucؐA8מƱ˘;ZBU2ϯ310e2F- m98u*chbb֌XtZN|<2Mtڂag3ut&GH=(_B t|qҌloiՠ -͹׎Lԙ uŲ2h+Ts[U&{.ْ&(0\.=s[ 3%oaT*]V× _7@"Ip~fxņfJQ7)osW]KGҸ\ y(0EJ'?)'U[B sb^/cB5W+KaEMY٨*d"Dt4QWC7"m;$E A ۵u\XcMA@DQBgC+纆f{3y >t`%gP:d\J0;f528]  EryX Įy|hr{0DPʮQL\O mW,3~ؙ8'@S# Vѩ%\% -OBH`i|rJs}aхHۥ9س\9NH :O7v\(IŞo i|#wܫ8Wp{ǟ/}ּ78GF|]j eUM1'w@-Hæ!3#BK ޛvi>"S°am6^DE+ډyg$ʡ5ݱ^a ?tk6xDWt;;NăBޮ fSVt2K͇Fa4i|g_ܟ]u)Ceرi>ZtSu[wZˤ\xWXo{Ĉ[l|">A.:+誫ALB}@C]m:týהA=wLGǂ9SKfSW]t"Lħ MۉQXv9Qӑp *%ٸB[t´Ghmꇳl~< 2Ŗ$MP. r IDNϝci*u1}Z7y?lJ Z]$^,"ZZ<Rr07l3תh>׉#^3jBVUvm+b\K# e} dP 6`9[01L).BIP` v@~()eԆIPUӏ?4s $A|#%)6Ye\0﷝=8e5iepҹqȑU ȭ5#>GmrTL:3\zEbF|_ccfԈ@Z?$MJRUA5Wp<Fn7><} C,:oF|3f#~hP42m4E;ղOݰ[ucM1!̙ N0~Iߏ~F|jhP8? [;rgȕ!nݺHʮW/z;mܾ}7oːH>%`~e} CÛ +EWX5 P)@uUGz%!#1 6XB{'w@6`6}ӳ(Ff"IFfucSJaփMx%a]AL &]gZVZINk 7 bX g͚6AݐUS@Iq*mX+v#kdcY _f#15(gm>e9XlZ/ٔkmòLVCfW+rZ9?"/zR\@HNCytj:^ MaN:6?=c >*/_xA[,a*FH 6@rl;F`ªȦDU>l ,k.;w*?yغ|Zl w_F|)~pe2Z_)BAF =w""4 [Bl!O`,F@Jj[A:JG᫋D>·26h -mtV.p=i4kݤ;J< M3prrsWU 99‘_> /;5 )'w/|nv&ܝ$B 򃋋 Ѽtrc/NH.2LD ]9j `F|u)!`|9QvǻЦeg,vƗ0G|FrbG9~0怤tOtjZS#2:>L ,2" 5><.m;r1alPQBFjė#k0b$:єl7% 9Vtl 9g%0D )Hgqa:laezEW Ʀ:i9⵿;Qg ¤qjN0?7xp9 ]ޒ`@ yihߩ tBAQ V@xs=3oY /&l^IT "Kq1srPJ1d(BMڜXw)X8RFbs$.m$^[,Jc(YOꩅa$ g@b?e%LKArs ٩'Fm#YKMN@;+2TgʐDZ<~*̗;f |?aHCcD"_ė ڽ;BYw$n;$ZO|ٰ{a9ԚQyS0Y /&,<>22uˇR osaD&+6Gb?o,g60Oe>6.69wRRx+E~eE }WܴHOBW!,RR IDATZ<.׏ >öA߁-ѣh89S3[KF=#&-:> ײ/,=?*$>jWM OT>oX7(hQ?#hʊsl(vW δt[1ӔT6x޸eJ{P=~v^*7!͐?}*Lv= aP C 6%"?+ZBUv_u5~ȸE5n'7n@-#W"G=0Ma,Z42^q_ 'b"mRFX}9"*F|u(!p|1"ÀΝ0>W,2 )rjyf.Bch=S,8@kb)P- JZP? ;+Œ ~cZI3=L}#$>q[H㫦%)[Tqs!x!L0KK{:vǜWfbIND|(˼-;~_NQlnʕ+rՊFj|\u}_]#c4_N|DuA.##Dh.Y}e)úHS%ѻʍ[*$/_DxasUbe7XՎsa@ﮂ?/^ОP!Sw7!CXRɡYHuipq>i|*w7dT, [7l3UYwq\Xm@Sx/1mȹ9EXaiF', LfEE(THE/**.. `W* @-$'`fJ"d9@V ;%!K6$&&`֔0TApOq=d0(PLf(Nŝm# #6ȺJ&C BÐ\̟`J9V>7n;rgMZ|)pq3dks]:uCcȐ~m;ǟVلӚwMP?4mG ~TG).n 3`7|-;Q0c@Yu DV;'=A?Meh",'J2L8Xp3?fiIv U%yi@ECzqS;V@K?{]8mc:N^VN9`]e9(b)Mr OCrb׃,&[E~ws tM6¾;AR/~=jT^NFJ}r`MhkQ0yE'%S| 3,OKʚy}$=XCE^5%u :ξF|+!ԚӬM#qC`Wز!}C Gw/ Aa|0:e#k!P0C0YU.gF!P+⋍|O_[?8Dbq ѵ2z:|C0~aTùe31{!dVKKarϟ:`Ͼ#xY|}h]'Z@ P+KO1y9wC0:m>E@iA~ɂ`[22(S$ ..9^0TAkS-r/…3[A\:TrF| 1>Z[ ? g“C!E>%D"9\ldriCQGJ(CNv6qsr)_2QtOvWW>ڨii9~{?B;zd(-,N}.rސ[WFSF sMؒ 2%G;9J ӇW&NrBf8X+KQ@cpbP",7@>䒦_/+Gy K a_ry宗V*b#+hԒ*K¡F?m'|*b]!=ť =9q ѥԶTd -E] =sD'5>C@GWHkCL\M5Ǟ?N!pn%7k=$M&[Mᩂ_"+D|r=5G~)** ˈECܭZ *.)ʅS' E)qG֝pJs}+{}ۖfhY bbSi:K{m֫;{)9Γf+ c(8 =ݺtAOjGlc-H1o\|X,0Lm z%> A3W,ŖiS1V ev^C i0ƔY`^v:{ 5>PH PR>> 1֍Ua8]ܼ~3L)g4N/硥;!U0ބEca9HRH}a)PF cx¦Qh8cT54i*M8qn];]N#*.s,)I,ryn ;gл ͘>_#/Íb4FBCGu.li0Oc1f. \FR6].H 7o\ƅ!ѹ.Pʒ@ C71D)Is+дik='JK"0Dm$*Lcj'< DkA[DE?(:h8!35<"qHU*SܡЪ L'̅@W-sЩuw\xAZ ;/6kNzTz:9ert(VX7/FC 2J|CO7dD2̘wމo0n>DZ;* ,&6iS70!fJw֔B phJ@|9nXk(fؽo?:;a.Fm㰄\4)秈İQ?]?S܎N(C`Ͷ8)Vj%;{b=w_z_NEۄ:K`{rq~!TM7=!8 Ѿ84SçB@|Z 7S_#/Aa4N[dp|9f;! jJx̜LXpg_A\+V͛fڶb9kԋ_H| pl ܇3F:Ynq3R"-h 0c1`5i/7T#˟$œt14 CJU=t]^ nb$<|Qd_#/Íb4FLË~@㫙Lv=FRZC]`CS7,BMWOuv-LU:aij# Htj Ł1-o_kl_;?V!Иf l  !o0˶廏_7a=ÞF0 /!Ѷ)mJ:<.aZO8mq-zd)O]L(pEzp>T° p=\8}3N®cg"E2 tW7_r/,*"fu|Gn c)x9ll5P Q+\!߇vbl]U(H7n1A/ l:r 7:SuU0n'mub n)UGUbJq,3{Uj#ZȊ3"o`&ֿ6Cӟ~?5A3Z,x1zj155|qf F.Elr*^ڄ Y~)H9nKtɼ#]׆Ѱգ FVd֪寐 Jc7Il=zU?D qlQaYuCRc1#q IvC71ΝGԤu $ ,GsVd=@Nw$UD~#}ڵ+$ =1* asw쫹3hCyz8\'^\ nXΎǦrv0~4C1!P++#w,dCv|r.y^sƦcn&,9gS}Eł9" ==1& E΁k+%p93إ(*#޵@to~.9Stn쫌M8lN0m 9'|sNΩ<]^);S9'<^"8ruXG_\=,c #34詖 ~}WʊdhfL)ð12!g 2 FO|6rV1C_ _ne4r5ĺ8`8C.5&Dzjl~FLRV68^qU4vw㎃MnZ?BZlS k'ǩX[٩F|_Cc]f|Z_~V2nY5n60${`KZK3`{}-䤵pGJ"1&3:ۚJfTrS@pxtŹDK&Bo+x3;!{d "P +Cx7)Fdp zWN>Pm{("02棍~p,勸.DI(qX8VJKr%|ȱeD#kl0klO!Ԃw&kA-+ǢCg#\K3#kD΅"40dS?1T^28xV g(u>6@.ȶ;ẀmXDy,Cފ8S|q|H_8{ --YE5,۴`u5M}{aN$lXc9I"'=%r05E6O,7 +;]SleAz;&/x67r,4*ZG} PzE_*g|9ѺWfh`t!:ax>zHZ;,&M ;-1u)]4\lož)Еk(ݹ%Po:}piAQN ,%X5-ZhP쩂=ɹ<aA/kE1HO: ߗ/akפ9Z_Y?-[N8t(wƬg Qo)O},gIE셇vER!xlw +5 ^W1L *J"+!&GĿ WLBqXGbzҒ-ތ27`pytS*@Ao$߲$A5(q@"LJȺ$B|/|75,PJ Wb]JB; gy^pdq֓{J"0@;RhaNٴX6'dAhAĬ|=%x mm֤1}zBmm9Q+Qf%}D86%(5#r 9F6'Cp|d=>>:s&JW{ڢ &$.uAhޤ5P3K5x9i=YxW _!g 3/'\[-ZǞXqj9y]5AO|I84c'wM!}J1W3d߆[-LU^G_y"TYsD5+E[o=>ZD EpYN:x-F+@0m;*Ĩ m.Cq}:O|MC#+,Ѽi8<~nq&<'=!! $o%_&pbW_Cf-_N|(F Zk V!{im_0 ۩&<sķm!f}$Wzh<aTܐNLLDbb22%X1M~Já$Kħb^PkFCG<<\qNFjWӆyu"U>"<4(-B_Pk WNcߒQhF)7թ+Έ2_c|*O /CĄcQo1(A\uPi~yv^^!9. ~JJp/ce/&Woa=u@enX>#b[<yYi2B+1p !']7 d sI8k&T*N,DKů8}Pƅب Òa&<{AQ(5Ȉ/r~78= s-%>uӻTiu̐P2Nu6yB< _?@]!P++φ?0LKڪPVӆ|BiU!z^"pUfQՐDf A=Q"طX1m;vCR.@NI!9/)G|0gJ"FE iW-ENo9Z,U^:˒R)[Gqy"8>FmBIC1uFJ[T^NcaSc(Ev`hdᒐtX_MeeaK:}[?\G!5)b?A1uK1,fD|OՕײF|g4"jE|8 n^/)jKfWLB|KS" bx:ѱ`,Wlx0NΏ )D e z_,df1+}W4rc.T eQOg">xg>>sNS<;:/CJr<n<~DƜTSW7#.3wgx)L'D޾3R3{vo`ob27&=<;@ npd0S`}hVWAAZ{^noS~ج o&"26=1 C|ۇ(+ r@z P==b& 'EE|7O_3L&L 0vd_ SLgϒ=K&L#>F|LT?{q0`2-#>F| 0`2]#>&ߕKZXdd#>F|L 0d6&L |2|9d#;+m &L 0&e@45\N|les 7&L`}b:^L9T2#>&L |W2 w%+ʹ&_ 0cLj&ߕ 0c] ^xhsQ#ZoyHKIƳp~d~##x3VgIDAT}tAu1/#+3/|`{C?7#>F|{ aɰ p]dK$.V7#ѢB5 qpwqBػ7torQg}q:w:Kx[<1/*^LNӸ8LkMv5Wojr";9 .6{7"0=XOc\KFZ*=*fLj@Zݽ ϑVlk#prEto^W U/#*9_Tv{3;sCP_9E~H|_ mW U/7nxW=Lj_`/{1,#$'eo1xx vlۂ5k`ڵؾs}Yq.L1| ?Þ#{l*hϽmQ?>űCa:Yod#1ݭ/`.7#>E/" NlxK);;ؿy!ACaj=a`@*6 %6.1s慙 !%[#m^OW`ˀ͟=d$$$C`@}ɣp{Gu PQNT8rt+d˃i| } k&%qėH\=${bRػ{!_-֓E/վhy~Sa܎$?Lfp ¢cZ _k|T;>ׇ07PA)v3_%&8t&bGw``cBEU =;$}ztcBMUj7ON~{9Ͻ=Sѩ43eǾ4Ok #*9iva܂DOZK\"{s2/2y3LWmic NZ䈠JٌOh|nM(ShhͰZqD.ɐ8y -cߠ$+i5*'3 Ѭy+h[xStVGWdP_2Ra6trzXi;mYC,_NH›'!ѵz)jbؿs5 .><-$8fd{3g2dQΐOd g]hժ#َ4"*[|;0$O:AJa 9Z9NTOiq"W[CKNFx;{з>ز|ZOM#ѵ2.c|&i/ _B d FI~qӹY(ȍńa\l{$Smh4>7;+i 93:d@D|4~iVnA2 A9H4>mLuRbTHL(Ǖw5 xm.-SC˶bxk|+9bL(tӗ<0QQph|&rvGMa^8z+5?q%Ii]=F/Tn;NEљ4#G &]g©N1cd@#.G|} 3I3_>Hj."OKѱcW\)֖oKOEmȣߵ_:͙"|ݓ+K63ɩ4A4dQAfzuܝhHCL3 k2S*/IgD|Do(tf!:+ Emr@*KAw2EYQmnKHGZf)q]Ljyy b[}FQ÷q˥_Ғb`hʒH8uwÝWɘc-e{@d GH71v"l91JY+BV/N\h2HU@|B >Yą=HnK+`euׯ\$;~<)+xBld/M*ʉ W2Rg1{{"Kq s]9xG V= ;{sgqS$ޅt]w= 8s$\^!HоkOyQgPe,r #*^%ɞϷ|8K%(p1iY((+CQARkH)Da%şKOK0%OY/^C ?'jۿ~-lo"B^Y+7! -ݟ[gw@Q  q0tPhjCwiܱwBzz2L7Dgް~͕YSĸ{C$@w]<dMrPU篓Ugwb*)@MK}S$_?mɁ/o|(H5#>Ft 0hD2ZH|#Ԥ8߿#?[{޿ÓǏD)xF⹟iLD5>QbB[ۇwH(8<7x<AqA>`4%)j#6"o@$(E7*5\7f' E*Sʠ)τ03?.;{;2v@DT$ߧ~^E(MŊ5_L `ϔ+"֪h^Vu#T# Ӥ*]_|yn]MpkTm^T\_PS?ӥܱ?aq~zxDV1~'A|jh_#^T_=;RZ#Ij|(WƗFW UoiޞxC.[cdXE * ;f/x&/O\KpʮNSn3zp7}8=F9W7#>F|Up1ᡰaDN1uJ~\Db{_'.s)qA)ILdN>4qcϳ|d1"2n ,9n}dz{Md6whV\D6xDu~CǞ#BՕ͈_Ž0f+'Vo΍kUq۝Uܽu$ 1deWqIӂ^OmP[U@u^}U_tevHHOl9ʈW^cn i4nLU3cW`Tv\/=1Ø'1c2dw%W~Uw *1c2dw%dm8)tIENDB`fotocx/images/file-save-as.jpg0000664000175000017500000022377515247006660015273 0ustar micomicoJFIFHHExifMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:752 height:533|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.5: Rescale: width:677 height:480|fotocx-26.5: Paint Image|fotocx-26.5: Paint Image|fotocx-26.5: Copy in Image| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 533 752 1 2 2 0 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?=?:5Yŧ0- "@ ; EQEQEQEQEQEQEQEQEQEQEQEQEQEcxTmOmfk)~ݓ!=lsI +dZ௅<#⮁_ |F]I5ۋ$ԧf`6WӚ/_~xĖ}iwpDBH+Hdh38>WQ|F .=i_v̯.Ur>\kÍ7RC>j:BKy(# N@;j t&R Å,cYQzvzcg]'b>]FlH$I 3^;< Bx|I-|= EJ2;7<t.OCfh,DKXHݝGnp;{xt>):|W\GN7Mѥ;bOj?o wC.ީ4Drm,zo 80]N"fb7\k_s~#ӗ– NҋǷx]n-N;DIqI_[H>5-]ONkoYa<%&֛j 0YSr1ɩrczhio>O Y,ya7 *?pBKr$ּ?7<#/xD:m8w[K8ԇ$8w ϯz_#ϟmz%ƶv׾x*nfA.K}pF*+QHaEPEPEPEPEPEPE yhpFT^]xʃ+}6+B;H2q HQԳ5!B; +Z&}.Lvz2*'J=Þ1^ȄAȭ)X.èNWܕE2v: *|漟ު%vkWzY^X"5̤/DڨV-kdЮUxOEhTKUh2 s̖!-Bbp2;qiexo~MM+[;hc6Do N 8Az$cz'Qp$y|>ƕOKi5+(X( nRrxZ#ᾯ\~ti S\z^ "/V?Izh$w쫥x6b]1.tI42n* מ6?fwìI\7{=XUQ6n.3Ԝ ?Ho(/U?…cq*_|]$% ibB-9ӿo6!/<}{[\_ԡH] ?sT#A@Wd ?$ տOK[µ o읫kzGM/bit7KBSw#3^gj!:L6snۘQ3jF? K ^2, 7Gοf,%HM>#W"ƺm{+5]?" ŕ5+#u9`$ տOA@[d 4O׹?&x|e4¾o%zvoKeҾx?M;oX6P $_FH? G$z'sw^gxI/|}5?M >htRH.o'>v#{#Tn.$n4awr"yM/By4}xYkz5,xx@Xggg\sVq:!g@r#+i{]NNl $!Ǖќuh>gNOs}Q *ZăzHz\,k"*\JT7JXix8Ķ".:3gQEI^aaF}%\ 3)(bQaIK{3(ϰkizmgiO<#U,~+_|MkWz{KK4y8c kHӔӒ؉T]gWޟ K/7)'}XaF}xo-__oOQ WiauYgWFZX'-o?oOQu< 3+kqz-,?Zޟ K>=>Œ Zޟ K/7(O, 3+k|ry-,?Z_ KپYgWFZX~9ѽ?G}?kܳ(ϰ ?k|ry-,?d=Orϰ>¼77( ==>Œ Z_ K/7(Ob{}9ѼG-o_o/QuYgWFZX9ѼG}'gQa^ [iaFZX_x{XaF}xo-__o/G-__oOG}'gQa^ Wia WiauYgWFZX4FZX4{'}b{}~9ѽ?M~9ѽ?M_x{XaF}xo-__oOG-__oOG}'gQa^ Wia WiauYgWFZX4FZX4{'}b{}~9ѽ?M~9ѽ?M_x{XaF}xo-__oOG-__oOG}'gQa^ Wia WiauYgWFZX4FZX4{'}b{}~9ѽ?M~9ѽ?M_x{XaF}xo-__oOG-__oOG}'gQa^ Wia WiauYgWFZX4FZX4{'}b{}~9ѽ?M~9ѽ?M_x{XaF}xo-__oOG-__oOG}'gQa^ Wia WiauYgWFZX4FZX4{'}b{}~9ѽ?M~9ѽ?M_x{XaF}xo-__oOG-__oOG}'gQa^ Wia WiauYgWFZX4FZX4{'}b{}+kp_0ZY"mΪ:c:קwo _@e$nXy=)J.5*:?Z(EtU+{MWƚzuYpʾk|bݰvg qņ|>TK [[K"Ȭ9k<9AơiOALT} L0=3ҾѼAyO^ .g־^ Hܶ&tNDO?nBĿ'.-l]bS#S1y~Y;v08xO| :ƹ}}%mFH98$;|ǷX^4F{ѹ'Qa>aͶbGpy/rG>"94{`7V>O?e= bV/-iKi.yh׼Oe?!on>lp[7M<,Dl6F3g-.kk o 7А@g;[>!F|{xCEk/֭uz[+;0Hqz.iO9/ړjLzQ`c,~uQ5ۏm:~8Ѵ S\*GaFg&\`),nvzû^'vSyʯ\J*1_;|cDy6_xWIވdTdR~kY8/7Û ƿI53\&{_xU٧'H#`Ϭ~ѿ1j5-K++9 @YU''(#$r3Z5x;oW:F<9R{i$ c1^ yxQuOOԡ<+\jte [F0S`Wx'/뺬(Ѯ401 6<-ѯƫroۨ%0)@φß-1}a{ŕ͜AyO1sS"Wo*=yYxvK,eY9&*DXס1/oYc/nfGX,jI pvds_T jߵug{C./ s]kMsS6]Sp?uQ;.Go ~$/mwũo]a|N/dg,۫2aT_Kӭ)B' i-࿈:ޫ=;PW{4뻉O q.0W/Cô񯌇<wm9yVgr 3@'`U??[~0}}͝wgVӴY|S &^KV&uy v58)~UgxGk0`x/J GķV6: `Ĩ[>[]{gZEwrӁ6^~br1 R >Us DnX7}u^g1ngد?+$s֣O k5+ƷAh&k8e l'~i;[\i\?_y6Y?騄7y'wWo_,/jֳs?j\f-Lqۥ}v!>`ǵ E=ǵ`Pj1Fcڌ{QF`Q@=ǵ`Pj1Fcڌ{QF`Q@=ǵ`Pj1Fcڌ{QF`Q@=ǵ`Pj1Fcڌ{QF`Q@=ǵ`Pj1Fcڌ{QF`Q@=ǵ`Pj1FBVs&ؒXljO +oaWK6du=h9t:CU4tOMM2sW)TЮE6K-RKX8r)&߃ѵi.EնoQIPs|'ֺ)tަ#xoMҦKblR̍ݥ|ۈyW[[k)6llzX1I vQ@u7ӵYi,0T Ny5KݬFg+<6P,(ұ9 ,O$&M;>;| 3xwQIFϊG1G:7S,т?h#HJl2;=df+xǾc[[XrI!ܞpp䓱߳»; inJǠڬ0aA9:f^ѵmAjz|W-Hv=+ſᓭ?|Uºo&d_*!{*a 57/ڍWM@2Sc5ž tgGд-=a368tK:o+hN[ Vxc߅<) ].+a.3nzk><>4h:7CLL$ۼ&s:o+hNW -O}~q/As/zҴmSni|-^yÞѼ>&m/O;nأ?x2u_WM kEW4ZwIF6vZ>w<2`nF}Eb(E. oh\Z\ k37/?@ֵ/52 su'3M]|Nt +AKkgm9!UcjdO*:o+h?/'Ogq+<-]Z]>xupΙ'?t];Ze6sqG,TI `rsֹd_*:o+hJ 'NGq-xT:Ϋmjl2\ڴҙvG!+~7_lo_C ]~Q0["xe-c_:_+hNW N4sv >Z|!Դnt t.{dK;t%axھtN[ ?ᓭUºo&a^_}\?ֿU~*]7G2u_WMҴ?i)vh| kEW4'ZUtM4;4fqNW ?ᓭUºo&C}3_8'ZUtMɶU~+]7E?>ᓭUºo&d_*h0sOOFkd_*:_+iZSњ:_+hNW v4;4fqNW ?ᓭUºo&?>mVºo&d_*h0sOOFkd_*:_+iZSњ:_+hN[ v4;4fqNW ?ᓭUºo&?>ᓭUºo&d_*`Gf?ֿU~*]7G2u_WMӴ?9٣52u_WM kEW4i)vh| kEW4'ZUtM;C}3_8'ZUtMֿU~*]7J`Gf?ɶU~+]7G2u_WMӴ?9٣52u_WM kEW4i)vh| kEW4'ZUtM4;4fqNW ?ᓭUºo&C}3_8'ZUtMɶU~+]7E?>ᓭUºo&dO*h0sOO$uH٘I_:~o*%Ck꤫{MictH3PYJ;Wozw4K=IK-:pE4(Fw_*2մ4 3Y*"$:o_aJךqrFd=Fx|":S__r4塬DlWm#BY[YEֺWɍĜ4\5;9k u`?|Jp՘97Zػ\5:O_gb{ yl%t׻ sz;qZZzտqw(jt٫Gj|3էj85i?Z. N5h_[rF?Vf٫\#6QՠVFn N5i9kOՏnf[? S{x-D׻ swؿ N5h_[rF?Vf٫\#6Qէj9\5:o9kj~o]?[rKy_tC\[YXcj}~gs֡ՠu].7j|5̏ Zzս1w(j~o].7j|55i?Z.Z֭9ES_?W湟F?VOտqw(jtg|5ͧj84;AeD%ˆgqq&4fxƧA+?ƃjcbw'${j|5X'}R:*OGf٫^=J?5/ _TG0a_?W{cRI4gS&w'4fxΥA; hԏį*O9Z=5i^A!; hԏ]J'A#?Wo hmsw}g\rIF5]ʮkIX?{9KoeҍvoÙ$ ˼Aךwj|5rb)f٫W(.٫Gj|( j|5r4G&s]Eic*[w1$ِ' IMGr4zHy j'rA״!ờ6pK2G4ݺ@T'*]OҊw-կqq" J]~dQo~Xx9֝j-aiڴW:. YSr? `r1vOxBN.mnF.Ky5pHe6N5jk >xItH&T_9 qyįM?X ;M"чO.#H#<fkm|\9xS@UB9u7uYVa `Ma|c#xK}*¾,ӵE!"+%HCm)3u_h׼Wce„.趑k`wyN?^4/ W/mFOLD@Q` ?~,hz[o@{yRNXLi2J.W]Si3Rւ=kqsZU[p# csDŽo/{}.ķ)&ʬ- { ևl]D|H־V 5m6760$ʡr'?yC9gɱRKoHdWvJT q㌟L('uxᵭh9լW 4xRM}+n/;]>1\ussl"k7*G:OPUqk{FP eru? >_ZFOkIc D8Ee8|iڦ=}Zm֯meJ$2xFzvӪCyizϥjJn-t,l6ւ}CHxd# }'tKz? uM{NH%t!*)oXtct?%d|^/QŚFˋ[hL<2w1dE'Ѣ]Gg=?4.`.!_O ̫eW_hpcU~h֕s]ix:i󽍽r\pO5|97ٿgI—+&ڧt ^@>L\ם? >'X|6]?:MZx_&]MIn|e$A!NQ}LݾGxusHn'zUFḦ@LҬw_c;SP-o .T$\m?Yr?bFzzh}=,Me>r9lzY6\4?ٶM5RnFŁ?@3ܛ_{Uo*=R_fi>s|s'pZ5|MJ/*piMé pJsgזx?u񇅼+eW|SMV i\Bn 3ڳyEF5xH2 /x7@eGoxxή[ ~bj|GVu-6x+(e fھޗ5Ǟp3 vN OKMYҼc_x}Zൊ?n߽/!v⾪l4{ CmpVڸB/[= <޹?n ޝhuMjLsn2wa>toߡSL!k! y &.H=@ڤ|⺏|tmtިt'k $ȯ.վxX|D_|ax ǨdFPX6wn5:45TtTdb|lؤw|㷃otQRkwٶ m"]gTď6xM +Z$m/G{} sn ~p*pȯ/:ửNƚE2薌H\+* w}4 |DWv.:f5eOθddKjӮ^QK0żnU18" xy=V{@ރ|,7 K-|Sat[dRoR@F*Nj|?OQh/z0]qKa$̪p  vu>*j+ͨIUNKhLO4k|i,zMmRp%"58RAי׋>*E-kO\6rh쥆h9PCლ|34]+xᮿmhU|awR<g'v|֬+տhHn}KCUEs$" m)3^?0?3*ћZ4MelomxXd8,<:+:b'$Lѥz'^0n|5F6]R\lJ`+#8 ]ukZƧ=-6wX彐Ds as0t[4tNZӭ1$SruNkԩ<7 hVZFei8'$OrMGq5jPK:j((((;xTt7Mյ==o&{J]Fi(9dF'Vx=D Z6i^1M&%%)vpJLh>*?.4+]G6K,~ŮiVw-rb9 bgzVi"Ӽ/΁s`&5E 75YuO^ֵE/๖'Y]?Y#TM]Uv%QFEZMI֣VSRU1)-P8M=h3(=h ( ( ( ( ??9kkƾ??XP>/j]SkY@7Mqc$h1Ԝ_| em_mx*B<+"GQSi=Ɏ8|wJn5,got9qׇ4 OLǴT};4 ONhVdKv7Npb2OJ9_i ēfĞ Iù|c>ҿaXO5_o?ƌ/7J.)ƚxj^JZOI9B=i{ _o?ƌ/7E;OZC\z.|O >M'z:äxtc'עɿ$0ߒb<?VO|=A?xZ\/7F|O&ty'_Zͷ񦄾":Ő-\Π1 sdg+հߒ&|OWG{ { V >M'х&h Ǐ|:1sOP<{1Dϓ~I4aɿ$,O|;A?oODϓ~I4aɿ$,QxBXw,%WBӨ f7gk潂ȭجңȉ9U*~u`m?ߒ w 9`>+@G4kpߒ_o?Ɔ<?VuL/-Zˍy2^Waɿ$rP.}6l. ?x~tjdÎ׺y>k4y>k4Gx_Ɓ2{/A~+4r1d =92=5EIs<׳~~{ϴ{ϴx_ʄ`ֽ__.c:)5u4cZ,2yI ʹZBn9 ׇ?9a 4k~(Q-6\HOps]0kRy~.~4XE*?y5b&Cϼh_ ~/G}hj*?y5X|5M_JeTyXz}iF?ր<sOQW4Nľ$_M^[35_4`Cڻ/7@/%mI덃?+EG~GRWgk5GĚ^Oi-ܑ2̱b^VS\5gcHWm",qfcI>_7b_È?!{- Xd.Nqk~(xƺ'OZ3Gg}g~lq47Z%#r#z_ |,5x{D:}Rm`3vi>'G>6[+ۥ/c!ϸ<6!wE€;??zNjH\]/jS5Ɠci|n0J.ц#h^_em^Oú<'Eƪlx>TkwzsIKԕn%sei(.I#߿:ƍ{8-fSm6?ufּᆵd[OѮ/<5w1 hҩg-3^ZxRӵH1\[ cJ{ݯaUӵ]v ;kVG*x0N{r{ /GkTŸdsm9+Ҽ#';Mi巺6Ky0GGOٟ܍r\2هH2 Cw=<#;ȭ5nKT:±I+=Eb]&xN4ۨl]Oʰ=|/EƣαeiuQO3 z k6w4S 뵹-]@v41E Q(a1EbQEQ@(P1EbQEQ@ 49nf!I`ԓZU^ ke3JPx;~ubdhhe7\)p:g VEOh$5u};d'n7-gt ym5/ KF4fh nvoNy"wR$`UjCC|Ṏ?'D$D,5[um/\_=q~%_|]|'2;;2I~֥zٷԖUiۥNБcpʹLx<񞃹O|t6q}XhT[\`prCdyz^5|MZI+k[m62@2_,îG>Iz~8'z: N5IDvE!#ֻk+u x-ICAVR2=|Ox@' g^t^Ku(-DrIYDoJ=2ki'$ c8[;Q(`QEaxĪ.qg^W?|z(gK H"_J >y kx'OZ^h\ܖ y!*Rx\M'LסaLqBOJ⿈:ߎxe=5lmeGidIf){=+< M_T杪7.sMbgV4>SNGsRR(嵛kVH%d%8F`;W|<5 sY F)*`y9`Z/v4 m4#.ťyXּ RO_iz3\[<+ v'= GŽSV> o $r*Ko |r/uo^߾v@о:,7kx]~,io4u"[ Xo2ּis |5m ڄ]gZ}_SCh^54SOMFXUbwG9N1N_>0VumB^Y|!w0*Ts^e<[|.,2Ųp[';31/|I'?zi3CpdL[Hˍ3F;g5}+ڙӟBHY~n|˒SgyzCҼ k~*,4J1RK291vo*8\x-32v})hz>6a^c-K^0Nu)VO@[_Aqτ&MrٴXN׺l8 ۏqڹ +~*h~k Wú/#ʎGz_KͧuKE5u}B)cTںNVÞ%mƅ&5D6#ߴ#⚵{h{r;Җ #ZJ85?J(-կԕEKk"!G덌oXfmdͼ_Gm -D>UO€43EgoXfmoXfmEgoXfmoXfmEgoXfmoXfmzs:i|NpM6S(f|hoXfmoXfmEgoXfmoXfmEgoXfmoXfmEgoXfmoXfmEgoXfmoXfm^5A-z?¼wV$LY?r_ӽ6}'Wv?gŠ3᱓ w趯)#&LvԔ?p80i?־3|N.>"]orYpqȊ=~~Ӟ>^m֯gyZXOgyZDL% ߑ8FJmWr¼7c/7?L4g熙j?bYybo%wcgjkGW/ey5i[-I`a. qi{}/:gLgsje+s`r k4|.u+N6skoO?M/,4'\_>xoöψ-C}i.Kxw5ߵý+ׅݧ%Ӣ[IxZ02 S T2a?Mx>+I/-W(t CLI.hGge !\CCkZw趯|q=7S_| Nv_<'g_Ԙ~kϏxru,w6M,r#άx<0߆sq,좃Zѡ8GfftpWF&6Q^ }6;F(m%I J!| 8| _ϋ]ci?Yq]ݩBD(2_=kAҐ+j;x/o_|j|-Mź/]BmN jRd]$ѲeF=GsB~|@5x]d> -nu.e7*r⾬מ1J\ &?fjOl*wqYd)`|nQPgv?f,uɬ>(|dl}]y֫YiK0ph)esJ׿/ t3o~[]h-;~tA$[FT6Lv '1DV|;a-oZ,;;k]!/r}Þ)(^֚Po'W';q:x=r+pm.ffegܞa\wm8E8C SX`K_V~"QUc"C1OGB8JO՟8MO_wf2ش\$*1r|oW5]?/kf#vrFGEg;#JB3FoS /^g?I='R:Vx{yɔlEwTP{Ho7~'|O>2<_y6i%icv`.I_[94b>;-Mι_ r)]v vd}hKk * E6ÎFGZU}mN_?/]Ѕ|1u_sGe_<}#_OA=ȭoOh}@Z)ܵ_//?/jM%vjEKinVSK~:6M|Mh Il=bimY@a#?Ìp1O_?_ tmIQdumn<;Ze6~2񥵤 (cj(#8|t_W׵Fd[Cj-poRʤac@_woXuqwa 7G]č חm)o_hzO.LO&B̫:q_U'9to\kp Fd`xeSSt1U vK]DA!vۼ %:+]o_RĺEԡLZ!2ȹ#ma5ߍs⇈d];Y0q~QEQEQEQEQEW|~~`^^5A-|G;[W۞SM9/jw2qM'1]kQƮk]yvYcTT9 χ?<`<'x]W Ş#t]oٓⵟ5kKZMJK1$@dawkA|}iwkw7wqC:JE3$!mG5<\ABKE8ᄧJnq&YZM1YDQvw'kAΡJ]45-'sDDS&2vW|Aߊ ڎqiox $_ +?~>6|WV_ A\mgP'Pd6K%fIj4gA_[toYY>oYxHM&"Lʟܤg5=4OUկ]}KCZ iOLKɗ /i4Yׇ F\; prrk' [·^8?\O }ͼxq m>~uh5x2?k-gņ%"Wy22b'!FF98O_ia5mK$ 1Spn995?g?? [XUφu9)4+< +Q0<ہk8WɨjZAG'YL{!k(c֙3_ռ>EEO-gL2J+ɾ*|i?h_C;Dqi5vVPc+'<2z__WA_ h2Gioskĉspk[\̰:h發̕۷f3sIYZK<`m~MGH7yg0|&Ҽ35,o}QvKx.IܪzԽt34?~*y/5d-%t_˸;:2{Kt6|A1zlLeyU$O`S\?أƾ$~4Og-NIq%d/=/ū?VEDE]JNX&fHV➫AnĚú]Q5$"8*ľ:`A_ɫcu=X'J[[8xQ~A ~>7n)aM4Լ?u/$w2Fy"1,%ًw~GGf"EIb$4L ڊWǺQE ( ( (9>qM<{ύur>㏩#Ȳ/W#^_R5FrFFsڂdg\ xZCahm1¨F:k5%Go~($=y旷QEQEQEQEQEQEQEQE_(rײ׍|~~`@:| Nv_T3"A#-ȥ/jdLvfѻ[g23OʿL1~Eo<]VXԯ.WaFX+>|O ?,:VMfH5y#x帎7V*WtQRKg,jnҧe*)ʅW8_K`ӴY/.THRp9T^19{jon/ #,TGmkEyk_._&| |Iu࿄֚P[Y/ne-B@3 Etj__Eex[_"#`v!+22y⚳d's趍})v1߆jFĺ.⟇ǃ]\qي?5bf9 r=Lj>iuwvI=+WteH"M}YA'zҐ x?jn:}Ox: ۍP̅apHF[\_6^2Ѿ z1|5q?^m Hwh؂Qsiznoy>l߻VPG'`6k#S7_ω?I\\jJM:{Y¦8@NVckl/hh yg-ROMKb[Tl(2|UF9m?ho|9YNľ(æK뗍l!Y 83 Q*>:ᎊtewC*ʡlP,x͐q^Sےm/z׋t֭];S:P^C(,!?8A/ɓzsC\5ݤ30dE}܌⬊:QE (9,wB棭zWo_ Qր;_:x#A_(ZMrn9˛i^ t #6!GBZMdxC~ o.X,K&wêk^$𧀾K{H|? 0Vo,yÃNNAOM5εM+\b!v:H !<*[<,FB?3 m:dӭ|%׊vKqs<4IFT,x?j]Wźf}k51X\LbY \ȮR㯌<1E🏼5SxJtǝZkdMm0e fx\ZoK-$T[˲猪lJ߳n|}eƷNshPͧEjx@LY̳2(Rh9δ¿ x,G:'tG/=+pBO$`qmkߵ׈hlCm>Q/j s/ )Iq'ڷ?@3Se \WRC4_n /rDvFy8o~4=CMo]k]^Dg{xHt sH]?ǭ ZĖdf\6* .22kT׵_W쭴hmK<۸ rH$ mWCo4[/z̟.m! B &Cn,cy_><coivi{$ ff2dx]/Zךdڿy(1$|}[KO_SrKmV(2$GcW> |&u)M,HO嘱'(@Q@Q@x _(rΟ?ӿݗE}?5em_ngzor܈|?x\};H-:}B tVq#7c~o᛽SJl,5kKBC2JBNͿ}wi{ As[˴=j֭ 80|mK_x;[:YSXʒ!F# wO/L~Xb rů=fD.cL _Jގf8읪|NԾ/.gilt{X偤e G#*oGgO&u߄Ҽ;c$B 21_T RIKR|U1okY576WpLl6R+u?B(uo#/^(iOdž6rZ3ReO~EMݒec>6.S_Lv7kՄĠNW|o>!5/f JЬ$C@#2S:)ܭ~ᖠ#Rñjj Y/dT9n_JjטZ]/IR:myow^+t*/∣?"B(QEQEQEQEQEQEQEQEQEQE^3P|2xo! >m,m8nG qXJR|^exOZQ 2H-y7_ğxvi9&3J1%@ 8}phchowuXk?`v~uNYa$B6'vA cp^$dm֡xP:^5JQ{vI]n :Yz8K|ɥ}^oxv}/m2ve21c8T3m#>'5y5_E7g\B@L<'pog;F~ъRwʶ6UVGJZ( (Q@o_ Qֽ+7/]Ѕy@??u< PYo~կԔQGH4Q(REPEuLZR1@sHNQEQE_(rײ׍|~~`@:| Nv_߂S뗯>/jw i_{-Zx\kSk!rmmjx]7_eXNuIsn*#za:M˫he$eX\ _tx{P.=mڕ1y\A2LU@ 2 vVqPls J -Y'Mc jv^ϱr\h];)x?x^7>'֓RMqg[O(5>gLeC^ x#IaZKerX"pcy7_ h0x?X5vl4z!6-hb1DtLiQKc&6#K+>|_SĿ м㉒3Txĩݮ!`tF;I+񵷂e >Cxk&[ F07*囨\G |"wYm=I1[vDk0d\Ds1]|T7~W{k[]+CYO ?M_fkɑ9uD1Ȯ9灝/wOv:jyKכVM^<%[v Ql3ٙ#Ğ"_6McM#>o;axWPĹ|_NFw4pq:O-]s%]?~E_kvZM{c^H jc F?hW@.u]]ѼK᫭"(62H&ݜ# mU7ZkGѿ+x3ƾ,M1[gs;ɣŨt +#2 iX#3Zÿj#SZ=֗]^²Tq38o~5߈xI7-@|}>{Ӿ%xE5O 2֮Z?ogi7J $I9^|Ho>.~[<6. RD2sU<;C |ocsql|Hc`+`ʒ=׌WoEмJZ-^ie<*gg8Px ? K >]OPXi3m%LRD8+OxW}R5eO91:q$G# )Ev?u| nK{;ID8^fT ]sϋl_T|5#ߌ'K-6xVI$Q3L20ܫ@5xuYuEuqs 8D= ~ MUO^-Kºfoo,@$ҲFu-a\U'xw>#h? u4 ;Y֬.t7.FH_1=w(-AwѮ|j,\l'a!Siχzp3b:,u'- c&v{⯂ .Ωx'}:vy$I\)}v܌߂>+xwK:f{<թ^yFٔc'~(xo--<=~ډЯ[N @ m<>*e\x +%kve3n}ʫPq'>Z |^Ꮉ>/j ?;{26dI&QY. ¿/`í~!Wáf_u5MAa\4eTuUWO^<;h8𕏅-~{b%3IFр1)dտG!uf{u O,}踍ܢ?x/.;EҴoo^[cp evyώ<o/VҵKke|k?s ;Ia,ؖr>&GOvml2i+]7_ǝgw. --JealH@ d'=( cCCkZw趯| O |p>"A#-SMOrcZ^&w" F)2[=G?Fx5YI!ԭ'V8Vc_zE] 9$Wi%{0T1>_? _:!5B'Q A0Oig$e|\5NF ?ax^;HHb <lW25Ox)gxGRKmzj<*jtp%]r|y㯈~,| Z Ftj+d\I4a):1<5)h}B%!|qP?~ [\7;h3Ž&o|k/t; %=Kѯq7q GjzF$J8y_)_׌?op_x‘麼:}S~F#%aUUMg|E>97{-" w#0cl*a`~`r1`+S_<;[i,죺4- !8dg8uu(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPMi8יqk7/#DėKgIaPfї*Z@̢H|+'&o|D~ZGi5+Hc4stW~ ?>4w,Wbeed0P.CZ}>G<D\d[?>!Ӝ&*if[oM73_>|Ϳ ~2"X.| gtkR+ԕ%NN$BsՇlSz#4_0޼G\ӭi~41-AhVasKwgWx ACDυu-:F?fiiyxӽJ@<ҫt5/(GYH ]Z);(QEFe_5kҾ#Ȳ/W#A_(AEujJZMI@ 4Q@tEڔvҊ(03=ih  Kڊ(1fqKEݣ"E!PH$f0)h(kZZ??9hO?ھN1??ӿݗE}M'1?WowM;Z&]_J` YV'Y wmǂGç~.е+sP+I+g=VΝX)EfӓRWF߈;cZ.4JKKHXdt&IFq. UUJ"H78T;'8JpzҐLV+GuZY ~R[ڟ~ ju6D.deF(ρqҺ| [J޻7쇧EiW]Qi^!Xo((g WϠ<6(r,rlޫV m# @)/0JĴT+8g!YXCɧ9'$Ȣ9,wB棭zWo_ Qր;_:x#A_(ZMPG-%[\ze׳Xl\)k7|1{Pi(~?k|S_ "H@B*c/ʤ<]6xG~!CV7 ]GKi.Sω;V t} ÚO %IoC۵[՟g h `n0vEt~&?u 6>eX _z gҾtω,q}O儁~vm79+<s3]ú8yTXٵMF~'TGs<ߚ4+_<[xO@NKk+ֳGK/nf.~+" i^[k?'?SS^* !U`(((( cCCkZw趯 )?k?ھ9Dž4ܘ~Pj~0]6zC#67m1]R!(L˷ %8*$~5?`#Ut6g{w-ZͦFG.w'hx;>V_MJ 6 o 2R, ooz𭆧iUA{4eab]t< "xkƚ υa[iLj6,YU;"?/ox[/mI,6:t"K@lX; ax SڽͺDY|ѲUG 9K}1EZF [Ua/7sxvNZA@VPd zg>'ߋFoZV_ M۝'Q 3c#+HF"a%GVMKOjFQˀF SW|:ixŚZy-I m`쩵rr['iu*Ǯ/b(((((((((((((((('_*k "M #D-"&@Uyd}Tz48nM'SѮM晬hB[dNG, t%GCx%myo՗΂oV>* g3FwlAh, FO#k>| >Υgk 5V|AyG/8P02k/G|F忋-gt <; n#$GJ}W'|*(\|#Gmm<7% 4%",ID`Eo'ޛhϮHn.N𾡧>TL2ltm3'=+|,ž6q] ^ É5ʛHc/Qoc*U~̚G]O|aHt>G{O IҡVyB1~U,Bc_>hui ݛh{I]K!M.G˹j$OeOoַj^5jݼ5O3-ƛ][\nY$qWp^.O*ft3=ec[xܸ$&_޽FIx:F.iHh^0`pFG5c_/SZ/uKj_j{+\B@ ϭ=mn|/t_^ɧxE-oWS847230O^2k%T$6v59P qNsֽޗ%>#|A95Kf`a{>go60AnG{߲n?Ǐ`ύMTm]JH!.21)#q GI,ѵ 1 Ե&ܹ!UNX5 |?iABO2msd kLt`9,wB棭zWo_ Q֐AEt (VSK41$3F"x`QKk5%yͿ %rlIb-'VDž~x|9 B(c7:vm=FǵuP&9dN\d{Tv6֌P-ZMH$[;up;s4Ig/0 0Xc5fm'bvPaG.e;G7n?RhG׏Lΐ+ZQD )sswcvDƱƋ(U{ uQEQEQEQEW|~~`^^5A-|G;[W۞8S_ Nv_s~=M&Lv#_X[9fNk ZxCfV2ϵ~gjK~+ɧX$ͫ7(RiIu%G vq?%N{ZG$%M[FA>(xo7OmHoBBHD ^O|x&/ja>!kcp"E]Ta lw ⸣ˑnu1aKuܶ. U25k qzk^?nk;Gmt\JHmTy0]|Һx O5dž$xfZh!@elȮ.Zi?k>N3M=~7]WZ5NK%2"$8n?) O?M_OU'汞]{H RJAeUaTմ-yR Z ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (zH𽨻uK-&԰A=BA3ָ|9~&5kxu uc!08a3*rE#[-n: )tW6=UGңmwLM]tZM3-|`3߲G" q?s\W+?Mj:ޝ^Χsos2ȍ8 V|[rK>jQY_[]i'pLиc~Vk'Y8jۨ/t'i%I"ۄP ct߲I>>2<[:I#tO(@((("x!^j:ץ|Fe_5hGQG??u-կqq"HdG8UP2I=[_3O ?J|}wV4&ZފOu55?F[OWѼyn4}>6aUHy5bᾃk [Ii^X^EčBeޥx׊Ai{oCEspːpFGpkhqO YX6MwQEQEQEQEQEQEQE_(rײ׍|~~`@:| Nv_!A#-_ {ψu=RI[.[4qfdz|9oĞ)sE{ْ66q+`0S5?ᖝGBD&{aD[k`<p8<7T|6VcW {}(n={q<O<=jqSZL85$&چC͵m̻цXw_|:M|A.Zxc/X4}_QZI`AҪZErMGU4ْ6i`(3 94Zy^ėv)auaAȴ|v~8 Cn&Kek9 x+'xO x_9Ԯ˞8InɥFFO D8%v9< \~T>mt4]K|\4ܴyPrO;XPLw趯"%A#-(>4⎈ԮOD{ȁ793ƺ/_7/ .t>!Пz'^knKH,D-vdoػ>>}qܥPF+ⴕIymRT ojXnA^r>>[ٻUO1b-Fr[9'$u^ү4B $nYO 6N̑ˤ[ٴcW=sR ݗu?>#xu㈵Eѭ%mpFT3⿇>.~Z> 95]UQJa@FB'I"+ٵ~Ծ$ h:o>8 8uyA+.aЖ^ |a^_]h\YGqw8|}<$/\Io/T+)2X[ǩ4jzDk׎#ax+ ZXAb M| ^kwqs9澝}y? +=vh$+ pǮi=~|O#ռO]OTl/7# FX{Ԩא.>V|]㿏 %~x*:n9s28_Q>~)/C{aPi4mIM.rƌ IrrA$W?;W| hVznm^UJ{o6 >-|$vq.K |AxG־75/r TgN$S ӊJ>|7+ͨ?m˨k.KaC;Hg5܁z,?E((((((((((((kW''D5 k67D𤈎@#ֺ3\bM]WLgyh|ykOd=Z? ?Dixx|O:|߄CŭDඟN1^9P)/N $[/,/ xnK/ʹ$J#iY0H㚫ٿ l𝖑M\]8D`'nrD._3xG Ǭ-Y$$?t5fb8~g㿁^²\iWZ|J!T[ј\mR9oῆGz 淢yג-mFq-Kb[ﲈU6g9ݎf?^i1] sj0)g!So sҼWA?__Ky+LdK^JɗvnN}O> wwZxVJ_u.B9aԎew1W#p2+Yȥp*A]|.>"dCjZV.-$I`CyLC(qU6W z֞d㯃t綉;jImptHVjyu[џ~> Bt2VT x;^Wk#Ï_N~fE&]GҖ."B Ӹ~޴%7{@9>1ҁETHQIN ( BKE t(((((((((((((+4(ukh:l-s(X՛vs<լt jj705ʱ⍁ Vs"s.?OϲռA ͻ_ڃ z].յh3# edE9bhz/\m-4"!y<[sHŰqɯ8мGwudMsu6Ct%YdV} aծY^>5kmL/[k+H^ynƠckeW+|wee!`AExk/-|m} ZC\2.G"0xzM-/~/i1տ}wĐv6I;L0Q}L$-ӎއ?־Q~$ߊ߳&x[lomuV1d[̪ؐo 69~Go5_?o-xMOʶKe 68ݜf4c3e,-LqԞ殊]l4-Q@Š(_7/]Ѕy^EBuAEt (!5'VOq57_k+q4n>ƸGlkXq4\,lyKI/dn>-⋅)(Yq4\,l5nSFhX:='q4n>o!=?Z;VVFOYZtR_AXqn>tSFhXכ[WT& q^kOsMh՛s -$sEǔOrNzWxiNL\0O/NQBʣ .<[[ծ /fi&wmv9f*$p*dždl5{ ᯬf[c{]$r)ʸIdepk2ަ'pwgk=[N9aC#*A b¼xS#tAaJ(n31֬n>ԽA+ oh>SJ拧hZHZevІc`+q4n>7SE7SE7SE7SE7SE7SE7SE7SEh4kEcn9OI.6]Ѹ.6]Ѹ.6]oSE=&:.6]Ѹ.6]Ѹ.6]Ѹ.6Z9KFL޲V8m22yzq4n>ahDm/>tQBZhAvA,j\ Yg9🂼=ዛ4>Ƚp4jn>nG:ikpu'G9ܙ)=V:麎`Giywi[ 7`Jfq4n>Xo-AΓ@⽰6 UFAk|}xLQSHajo2UrJ c8ȯSFOBX҉B"] 2>Fhcj}MpEb>p*dpgrޥy8zp0niRq*.9ʳIh!?w^(QS;T.zc4Qp.xR @Tuc =ɭ^GN%^(H7t!3JǶ/Hxy]1 \hݏ`$Uc:g}'[[9E')>|5z}دk}=b+jD6Y12sXȶs?+hW/4`4[I86`b SP48['NqkgZgM՚IT$$e$Af$8݁j} E|y ~0 h1|OjԮ&q*dsO3yIW+5tyqzƧ+u;mJ̵)p>bA4ͥϳ1E|C/xŞ)~&k#6?ÊE'oua+}sc{cӽ{  yqrQiYi[>7VBQM{G>'h?nt[/vo*`{ǥj+}sT.=0$Sp|{@xͭϻߏj/hV%}|{V0, "L405=O]?C/EN{ݯ O1;moU/l5n^|p+uE'MOF8tXoBu#MRwuA3gcNG>.H|=xbrwXe8#j{ hMWڝcsqN݌OYbl'OS^Skx;[w<:<=xZl\2</|Pi+~׭MΙ]j6m5@èFj-;Nw-f>d6:`Q!#Zf/IԿ;x?AVڝfO5mu«c^Uj:}얧/iqf\6 [DG5/ϭ[oZ{xJ iH`Xεi6:ޥ%Mʆ9mVkb3Ҿ\5/?Y9)w-onJnRv:ȸQ2w㽕Ϯ)q޾.o&Ax/A⋝>;Ǻ`je zڶ3x>)چi/Ki|V4k WHcH&iب;4 v:%-|?q[C[Iy>% z|Ii]Xk7V$r.@=H |_Mڏ}Ryi>l txOKxwhVuVKMAYHi ms.8SW=|Kf1x}RUuj4}Bm1ŒA% 9T׳ <1v^/ueRsyPzSkQE-!:_0˪[~$xkUx#G𕶜e|Mt. 2Is#ZL0> |b4hkiGl=%4jQ3>ź5m|5.nմi{$(BtPOzᇎ|IeVTᦱ+N#K]c<JA|:zGj5i(qBJ7vqU/_>OzhfxDHDQxO/˩E0_ɦ5oF=[^+kxOwZm[JbP؅rq-_<%[[hZko7Cw,+K=/E\O:^L7Xߌ?Z%j /?>[ {95)9WB2{V|? ^#V͵׈NoG&g tv-1vv֧PHO׍xwu9KasF5#n5Z| #|4#-?kx*O_hq+}s{u;׻ЩB'%cqiׅ ME^m?SھP~%\h&C !IOc8>7%n_L7:s^+*[Dxxkcxt >n=oǵq6r/94:=/kZd{mF,l~\ ~J Iv"x;?SmNx.#Ya& # u Ś?5X4Fm*omU ѷq+~|K}O˜|/zu"Mm-.#>k,e 9t(e֭>#Es}mcG,̤~9P[^SVw]/=׌4KǠ\jvRY.۫miqHս[oiwp\.`m־Xg|DVNmoMΡyen"&hrG̭#?]IM'o55R[=K;JKmvW#=1B|Ϡꆱhp$IG %sU~aīqsMoPXɼ]qƳ7&O-=#Q@jjՎ꺅6mM՗O\y5(Dm&y@Q X:R E|?K3ME\Lh!bU˱猌o xz+[][P"c}R{@Cf\}ltTRQE ( ( ( ( ( ( (u6;`OvFg#<*W  L]"۬GY}zp+e ҿp10U*3tWPkCtm-j@>M*XYSorRr1 S<|Zt [^fe@95}]B(?i|j?G{zIwV9+W;6DMM^g! I'i O xKFFiZlLΖVf,}I'>. K-/(E|۳펕_ZÚf 隔2%ՠT(ϸ6x~a^gSYZ߇a$u[;|7vk= Sg? x LQ/f Χ}r2RqjůXh~s J;5V Y-ڪq}(a%sαq[C i#9k ¶]_ŧg#Kl'IRD"x dC]/uiwN9tˤ\uRHw][O1MVִ'P+>Qd!qIٱ߫> xڇBņڜ?gh%l$vVVxLxBƃgIe<p'xoxL]'W:V6mߴiy<6s]ϋ$xKϊ vh{V"2ԮOQV~Z4ƺ6_^Hzb燛}jjXc/½~%nc30y%mGLv9,?f-kľax]g"i8laEڈ" s 9oğ khXG\.T_FP( 8@$1\WEiZƭyᳺg5-RuQOSZp((Y#{<=az}$^TC yrp0+ǵoT|=i?E&dGM!ADj'slյtXLh'#K rQw'OGU/q^ϋ ť<]rwClC$Zxc⧆[47_ZL#Gz-D::z~Gk;w3._ң55u tu"<._}v .z Z7i\6Q " rrK u^&O, Y0Tt@_5y[1|,׼eڡ ֲ3ܬXp<++]mس~ &xkNb򥽂,9Rrʹ'j+u?]{R귺t5I/& (8c3'Wsay{/ xIUtsLKyqdC:1PG֪G⿂~ ^\Zx_tzW23ޞ+c=΍ʡQe s l s$pZ7BXLaCw1+>1x $_|?kѳ#v2\_ Aqߊv{% =Tb$,8eB jņ; լb?j2\4J7+63WY;^8ΧxZRhHi"_6qRGܺ;jWL`efFUM$::AR:Z>OCyi\5`F;:VOnr|>8" F CoȎt"A9)J䓃=*?g8}=隌dybG?^|CxB^E $@v)n7tri/|6м'OiO-oblsO8dN 4=,7VFQlM#THIU8P+?gZwMu%y(#3z t6-u> \V+PK7 s|oKzmZ+j-&OZ%Ә ;nvþ|#z.2^\, 6w9y>6mᏈxF -+$,F WR5?ӦE^4jZlWhb+ -NzbO:m_|AJacjqIHXB$MY#(JBmু|?MK:mRs%朰 @ x[tY i^59ㅦh$``$ tȯE{3g?t^;vovF (x?>0jg4my-ŻP`n !HZz|_뗫kX"n2o\;2q]=UZ9돇ͣ':K3fS~cþ #>6[m|.qpXE>#0x9+ļU#7zKy$sϵ{u׆7հqNOIm[rJ&:dNG~|H_ ibnƻ+ g^nGvͩӍ(rAY2G,-Ⳳa*F01?f^!n=KzUɽX3Lvߜ7NG4VORֆ!F|Im_[&Ӡl?,ǵgx+?~_xkAѧ96ۜX]eV t }v52X7L_ƴg3q+R?ޡbOmbWP۽mZE\wV˧e*WpAnhy߃?g5 JHp0r0s9o~;|`*6޴?3L8аŌEb;hm#G$l8e#sgkOV:M?>]gE icw-Go/줃oky[2(o~hˤwNKӕxK?1&hh)QEQEQEQEQEQEQEQE)V ̘SM}0h~GJ[n*q6$8-8'Z>5Sm}?@ޓO2,lN6`oj ZhrTVɰ6rQ6_7JgpzR _C>迴ٓE4Z.rFzsX,\5GCռ:t7N5qܭ%1#yc;} }aOZu?ߴ յ]sQ}5ٮ/a" ˺A123ߊ'^)>,3W^&'$^a% ]YuS0q_j:}!玼ҵrWxWcAՖSZ҆5V%nT8=+-G#|Goޏ^x;Q0J{a@*t$ @J]ӗ|N爼?@x\hema}aۺ(f6yԼ p9PV  |Yh_Sro_^I8 yFboT4GR\t2Q{YpvaoYHbNJ3|sK1z <˧)?xo|cZŽ|-sj|̷P_';{|IF/mlN ybsm +n5^= nsG4$<&x~RIh-mweo,I'c(*6C~ad,2(Դ6sNE}}ܟ^xOHƫ>a&toL#|UL=HUzR[D| Ǻ֑kq;[վ/=ƙ{wv {+ 7Ql}^V3-c7ltwynUryp0:{::;}hDwᯇ?еK[k/\YO5mbF¶+[&[O:V.-. D~HHa$>qz}G3<7z<1xcHecaaX2mJ)w\H8V>^ 㚓Þj4Mk,CZ45K`vRsh_ +CᏈ|1_K>u!mrJ/` V%d=][@7~WRWotG[[MpxÞxs˩ KozcH :e tW [MoǞ;$=oOHFl-Nnr}@+.x=3Sa6fy ͗+NtkMzK84[B> )2g޼Wu ~ПMSJե|Gid]֙H#[xr;[~sgqrsH?ª#>'1q6[{}W[Lv"H# 6g8'ֹkA3{|vdr,E뷙 nuÂ6HG>(N=;o?xZBxK9׶YI=%C=0?Tk%GR>VG0F(*P8ڢ\0'skh ggACXCm'v@#ק+(ѿldZ-{o+#a=*.?/]K^6VvQU^'P\}<&i"c)Y#pA?tW~2o2/|kujXrWqt(|{||3ozmsk^2e+4f*sz.+~ԾЭ4YM]Ki&u@IssV\w n[O)M=5T]M^ӂn; <=+{GwĿ>6ˍB]M`ʏjoq?]s3O6\ɣrWH9)ӭ֚f┼֭O4 [vr1 WRAU~њjZƍ=K&t"f^ᯃ>*O\xwM׭.h ݪys r,Hpv߷v { VҼ',"|>+]G5 [SDaH9RCGݯoK[7aX|N5Osw a9kOO%uQSkf\B.PXp0NH>GuT/z|QiַaX(1E$]>ŭY)Eu/^I AW *]v vxuIdѼCm>_soDFw#dk4wO״K#Pn-nca p}x/_zwz'>4pķțSc<ׁ/ R_Q񖁪j7WQoIa5+S5>;Te?jΪ Z4?e򼥎Leld$Xc53o/,ҼGxzw3@[ݤxv%g8(d_O C[jsZM=0gEu,QV$yX KOM:.uwVAWmgொ>ҵ;K,y乖TelH8 ~Ư]W^'5S{hW6q.lgA_F ٌ/S j{Aկ#VtdʷT7˟79)5u9- ı)Wxe'>;xe WT6wfј2Яk3H!K3E--v-R5H9DQ) x84toռSM,uFK]oJtHu0NˎpFQ)HO7w>$K}*SGg} 2F1ַ%x ^:兴RXxr}Hdվf¼O#Z |s?>Ҽ3&_ZKs&r֏kbBw^=)u-?kx3Ceizvz%V|I`T`3Tᢏ~-|3-F)4VybdL1$\_|km5 `o^BnFA~.vA޷ǀ?QxSqqrۈ$?o`wOOsn~(V'5(ĖB @֎q_)~%퇀ܵϤ؇X)% {=ikxkVV]%.۲UXv$pgmSB^C[yu)HL!Nw<˅U9//Þ-VM7_5=6j/jz\Oo|Qs3^B?fj6^)0߼iq-' ep7T*oi(Ú+xS<9ZK/ ja/wwugP<<󚾮eG{ڃ>63cmgX'GԴ~c"9<0L3kߴr^3+ ~53[䨇; - D WgDi|um. JR@>Ngᾛᯂϊ:/k֚܆Ch%+.s}~_'}-o[/&+P5O6acs,nP鸕?/5\`I6ٯ|9IO 4Gjc)-C}\ׯxGֈiC4䬋Mvx/>"^x1 .-tukZ&B5gF|}>-s$U) ).$KG#[I?0:<)_}Ю|_ 2Α>,)yL3)Qe8# Wcx#ų{,/ɥ_)Tkjy)7'NKwͿ=cW6&Q$Z͛S B-_MxVnY/mmd Ag:|360](ƹ}mUdVE V(zZƍI`ڝjF][ Frr# GɷO:ȭ&jqiO;ˇD -taEt-LbWpS*TQEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ Q}}O?n7hݷ=qQM4q-<(j zsA[/" ~sA[/" ~gV>__E_%QϹG}nIT+u|EQsA[/"/T?+u|EQsA[/"/RgV>__E_??"(Ϲ@??"(Ϲ@EPϹG}nKsA[/" zsA[/" ~gV>__E^gV>__E^PϹG}nQ\yq s4reo5W>__E?"(0okh0RfgV>__E_gV>__E^?"(Ϲ@Fj}n?+u|EPPʺ,dsU+u|EQsA[/".P +;!mnC0##?+u|EQsA[/"9/tr~a7 %gV>__Es~-ƍ؞-ƍt?"(Ϲ@]A4V!v̫8s"lUsA[/" axcFt~ kVZ _~U1͍`@ka<:O?^3n|-Wdci#m.-C|Ύ&[1 GS/4{rm.Qӡ|K¡51I;YO8'z5q'i=|?|5I$|sy8ߵk r6ӑ?k|Eev_5ֻoܤfFD*zF&0w#DIgsU-]k̚kK;?1Cqm$Ƞ 371jZN$gDeT׈|\ψmo~<Φ5;n5KgkniyU'8< u_#Bh:_]7|3׾jO^,+4vXdV TЃzW/ j^cuyڶh5gdR .ôTzqMK<@1SMK#׀h5? YY>]eiZYՅ[y ' IR|C׼#?<= ]\ki[2y…Ռc#$.+|j:O?L#2-vW$YE[QHkv01j:غ K9fO2;xكyl䑅`MP qxgYU&#QrV ]C{~4sm:r{+?ͷhrKqQTEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^SMZgl9o^4aC$2Gm&ZK*qQ J/$4?g}Z8 Y$C6\⽃Fѭ;% W%lIGs{5ͮ}4tj4á|43W{a:qmK!_:2b# 5gp^.R^?IXz1ky kπ=|IqC&}Tp<~t,|EnnW}ODZlݜs߅_~F?v/bD"X;kM_Q2j?"n$oنY2:km|>I<1h>`e@rA\[O7>OI騺?.498Z,XNyXۃ׭z$ç5?"xڭ'@=^,pᶊET(qOsDV?fotocx/images/batch-rename-keywords.png0000664000175000017500000044052015247006660017203 0ustar micomicoPNG  IHDRzHDtEXtSoftwaregnome-screenshot>,iTXtXML:com.adobe.xmp 1 2 3 0 0 434 888 1 b/E8eXIfMM*V^(1fixHHgnome-screenshot0232~0100fotocx-26.0: Crop: width:888 height:434|fotocx-26.0: Sharpen: median diff 2 15 16|fotocx-26.5: Rescale: width:773 height:378|*6U IDATxXV>~;Ι3c"*R" ؅݊bt :}_ްQp@GW{s??'@;4444444444>[\븆F !!!!!!!!I! 0˗?(~߭,~Rbm`ly|}H9:Z_xt )) HHHPs-33 $,;55U+11QHKKCFF"H@>|zo#D)!!!!!!!! @-9` $L}jI2(V; 􂶉V$>kkih|pbO-v6q1  """ t:]PB@\S~׃.JzY7!Ki-!zHhkh|4Pb]2U_4$u WGwN.?}67*HODGGG(R֬Y5޽{hРttt J(\o  Ʌ0+6WnAΓ̼ wM^}HvٳguUV)Z6l@-zB W_}J*ԩSm4hѼys4nZRs9ESq$)?E{Qf߾}Y+54 p~ rZ{[Spj cȫ-0 U^AeHAaFAVC@CCd.]m3ڵCÆ PhQԭ[AAAn5JŠ+ |/©333-[V!3lw5K(1c( z ^0/8bZ5}s ,0Z{Q$Tu spͫj@`lzh@EB&d=uT%>ۗ.]*TjyZ777?~Oٳg_ :+VqݻW!f @ɧŋ͑>ԲeKիWʳ=$4UTESܼySDrʸ|rެ=s挢Y zDEEʕ+ʇװl+ԃeܿ_ɓ'k?^r]7n( F:YK.0܄ܹO[INjG\\<ݻw+RǶו ec{r Z khQ7U~]=9tqyKlsk bÇs #~)c̓`؊'N(s4x(jhh3J[H:Zg".Y$ϖ-[9s^V\kbccsVL}HAAF@FC@CG 7)5kVN\ׯWS߿?566bIXvME3gDQZ5Tڰo>'Ab&LP}g9ŗ!tc+P͚5Be^޻woŪ:ԃTZFFF"N/^f͚ÊiװtU2t!Bz6m`hh'ݗv"x/jRb$lllЫW/L4 $=,sH?om;IDn-ZJ O)&+WL2J(H# մqhM9r$bbbBǶD]L=H8v+Me>|xNڿ;Xb8qrH!Ǚ.usܱcիڵk+}f;8GHY1[Ǥ}pppP8o$/OC\#Rjo  #?/9[s[ &ȫǏ+k9sCת)kn^ 3f(/C-\U7LC#5 \i)(^8(LQSqF=Zq\G~z;ʕ^jzyP0`"dN2F 2X?׉伄߂cY5b~dGKH)9kZ}rmZl&~ dk44pTR@:6 QppAv :(Ծϟ?_ѪSc˃,]v)BӨeb=.PNፋ$z왲9LQKs,aqn"G%'JC!V~$ell+Hᘛ`Z9h1`m6FFMx^>ݰ!B]*0-Kl9f0ƅ}SDE+ZM~ q;yHoP̓1 ,m'iݺ~S5y tٺuKa{f;ee$Sy}u?U@~[>V!k+Q\i1 $ϟg}m#!!Q  S_=((Re'N (Os;wȃX(iVe٪<*xp5C TzGW $&,p 5G`~m-R@31P0<w!ӕ0ByUC6mdՃ .PϘZ:Mg<>D0Ʋԃr2i!"nĉdxZHx-I1ޤI* q`<]gď#j eyv~u繆~6 jk/]fY՚@EYLm.c&7B73P@GS)]?Nm0h!O7 O$tk b|d<]b&a ) ᠶ><~R@m0]XhM`y?Y]s&RC蹐mBum1 ̗QDᔮStKIpsR*h`(Sgȑ#J]B,}OO,F5Hpå_uQnaĔ~,ø]~$ tb!P@*Q`{:^O 6H8ğ7 Dñ!bĎ+ <kHnrĕGYDCDq$$ĉF r_CZ@A>/a]qR2>y#My}fuZg*^/I{꺬N51Z\V#5 /aOw tQyH(-Dпoŵ+w.2tBEYwawtƟmR aIH^ A< rnjI~(4~ Qԃ?HCA.C*4+{ ,G쯚%&f4*tѡPOR5ԜOyArq}G<(=<{d;X5`= ˘ ̛7O99AǚuD9G(7"גPah1}]-$X7{3jhu lPo.O!@A>?oep}(CvQ}]{[;hȫnWy3,#B#oC]MC@COC $bj©&qtQjIf~(S٥e 欋fV0>x/(԰ӗ)-yP;NM0)FD)>aT Ԃf/b(Rh,7  ]c娚m dPgf9ԫ6, 37 ^GJX'bB}wͺg[ɰMsV}*f+7`ZkfjX'?x =+9´jUZANv2Ę5o^˹@\nԺq^byIbFm&V82,I >o|v zqa'%y ~*N snu8eD#Z  ?.)Q㷪ͫ!\(hE6b^򸐳,Pc]\tyn 9sU:yn@Ͷ|=G^ۨb|,`۹))^n7_m#u:brrzyuT2LAJ 5$&jϱƈY:Uljew~bk_ǚo?w+K;!!p)0uյ05&2 rrp]Psj)Pо5444>Ej*׏ZC44>(\S.C_6EACMaIxHhkhhhPGW (]K !!"@Â^CkVwˠ^PCk,$"Y#2=tNrnA9߷#zY>Ru~oP件֊}VUF u44444444>JhmMM:c{ h{$$&$ jчF CV;!!!!!!!!! dnjhhhhhhhh䇀F CF;!!!!!!!!! dnjhhhhhhhh䇀F CF;!!!!!!!!! 7dbz$Mhhs@69mhsKHD < i>_6ks@69h@ hs@69m|s@#P١i 9́udf$]= q)/vzǙs@'&e\s Io=?3p_;{>X%D O3Ols'ֿ?cݟ;R1j`;-gG^O4oK`o\,%E㐚1 ĠaӢ3n> WN{2(UVoA'6=A#K=!q\ɘ)cG<[?O1Zsiռܞߨgzf$ݜ7Ž7s?72}")1Pmxg'#-ct@UikՕ5P\Es]1WPh1t4iXu_\t:A&Gs.# .Vdi=_\ w*Ǽ xsь'U#yL _'|,|>[}1>ԃVrRSqxnk |Kԫl|\w>Bܐ x$#1B_wa?7|~lT0é7- 7PZHA!e+\F7CS!<U節ן$\9ʔu;Dm.sk A۟Ԧ৑<0~#)8ygBu&IBW]Ž{{nܾ}gΜɓ'q]عw˗qܕ:7߷?܇HK}_`|_ǘa[hؼ-\{) <<R`/pr}1j6\:` %aġamE{*e>7vM[XT@-X chBtRV"y4j GF#ZXw2}Zv}>zƤ}:{ 1Og԰Vܼ]W@iKzJ0fNf݇v׮ )=GN`%896lc&y8? [u[0j@W>Z45" kOcm;zWwEf ꡿T5lakg)v#*>:jK ԴvyvlCFz2nyψKﱙ8}l섃6cD iӸcвfk87{K0gL?v+YֺG2][ԅmV ky40qr%+!)&cdְV梍:πOχШ͜z(k}]?~^wezJUzgG? JߡVMsk|r.\#A Rɯ/HNGl*qq9}*HV!]璂4FG>$)HF̑>qq૴_[IO?y3_/*jD᮸ "$$##(j9"āT9$';e9/^SܺqDs,У+%uѰe[tF:(oRŋR.` io"KƱ%yM+҆[ ʉkѰ +fnh?f.cj IDATz5D)pl;U#M^D֭# Loc40Cp^4QN΋ :j—Et0yn$~=^ĺTh=t6<k[*gm;[-#Z#1/31Gs¬ +nES(k&m:b1/&ߴdEc)(S,LXU=g֨"e 1{>|53%aСu.=G#8/àTQ՗zah`b%JQEi OU%h.7w8|J:cN"Zň9ML|cĆuʞGjFj< $[ĚgbE -ŬѤ- `ij wMꢼN)8t>!y )).JSpl%p)~>O7b ŰdCXwR0s/US7dx; ,Q֠27:sB%}Ԩ+!|n WOB e1l^E1vy}g^1i_}./G20uN_Gˊ+[=ʩtJDV=pC?YWD50mGNE05, fԣtk3 o1x훖4 =J sƔ a]Y:5q-|2;/jmCI=;(V ]CME ѩ0̘6&(ZRUѾL0DiE#E %>37-oN<b=F 4q )e(j_U! 7|V}"V7WBПQ / i)lة#ng8/T*S 7ٻ)0'p%pnEVy&c_[_|*UCם;o)Q}yDVQ "bcyk3jTj5cŧ#"N0lͱ9$ed!u7*+.#&yjk%$ dFeJ(6.6VSא2*,')x;ftd7R6CS@rz0 !$&V3|zJ7nR`SV:-.K}s ú $(mĮ0` %lL |B"$AP0+ 1#z:^7<RAfj NsӪXu<".n@u8/Zv5PѸ:@jR4N. KZpZصĺptpT13ҳ".6qýC2S4۶.JF˗x{׏GJu*"/P <"DZ&\^uZcLq?KBt2Ozv! /1KCVkBeNe&c2ʐI HbEʜvWz)ι+{#= m5@H2YnƳ5OG(L=N<I&ǧD3o?y_3 ,q7Aw A|Xkj Sc >,wXλ.dOdA0sTOyHˠy^4~bB1-j;ٓ9w&)HI =1s*$Hivcñbx#T <\?)HK&Ыl1c>}:NQCʂV,핅]1|O jU|7)sY ~/~~wѥC{lܹ/~$T?&N&1b-B+?%NI m`޴.<.x]JB$tF]p7*EЭ>pp#|=w|A*6i/)HЬtml N8zCz2A|aE/Tpջg{6Z qy._ :Rpd^'EF4f "] Шm{9MLPz&ָ]SES~(nrsk :RP nϞC3w_Wh`ﶙ(QkD)(%nS$'=%A>J˅s" vaW^HJ1,#K>-9GvFQFuT p\l4#hDkPǩ6>[Ef'X`Ů#H"4Lw"C&?`ʺ5vcLgXb}7ڦi !ϟ`8k:kV!*[~xz;pe=UE^=Q z'*K(M}Cy/,ڰq"4Q͇Lm()Z3RYv'.MTU#(gAIcеkk6#4S!f% b)SmoGLK QOúMѸXgbCbS :Vfd.VZ%.斕[,SW2.p|]зXmN5QpD=ša txļCRt(v}q;,:"(m'.o\]O{{] yu?IIiKt< l( )3ᦛ22D{jL^cQXyRDv Kop<~壚PgNcРA=f<,<&]Ǘ1cxqq5K?}*.߉GbH6n{N\P\{2䁘%~ņme]qKP2t(f-\O~(}v>Usyp_4Z<-D]֨]ՉIC7I#1ay{0m8aG`њxp%c1ذk?٣39K'3c~2͘,s"kLM[cC{6(cr>)C_v -nst-E@Pq 𼃥g*& e!,!>n0chG1ٖFz-1d<ĉ;y0n^Q#+c lC,D\Sp~l]c_'"Ʌ;<}D 4I3#„aw8^*p~> cbܴE8|h+vYmgɸcהXi~%+ Rb\8$>es1n=#B! )a_1ϧ~X ߛchҚ&<Ǭ #CHAWrf5vVq3$kj$J!ej JgڋO++{L)#sD%R>O`g/C\K" ExrAʜӨge^kbt:<']oXujXy]vqnLj p<1w 7Dp6)H y$p=8GYn>{# hZYH * L3TFoq}kĥk7H2Fa%k2c I o.fEO~<]qBUìy|Ә")iuťU} Iu#/Cpfr8WERzp}8 7gbkynRu]UGy$LdD2B<3!֣%/Zma²zmwY浱P^Yp://djd ^lgf{&%C^ߩMWb8CpE|荔23CG\_GUl>q5g.>؂JFtziՇ.Բ>0pKOw [ڠ}Kw :8ׂ7:Gs#:䐂h(1sv#6IjHۥ}  zX簴$WxӰs!ܼ{ѯC},c /2c Vw֛AJ{x],P7zn1'ߐ>k$&u_; 3팇A~-yVNJ QjՀB8`C;ʨc$C"82):֭ ; Rڻg%ꈉ5HPjY2~' WJ4#( sFvUM{*U u%cӃ0g 3B[F_70K#)j6vhղjvD5 l) "wif'¦4'&0'_j&b:mѸn[X_붂 |{GWI a0dIARފPt= ̱eVU[W_?Kۊ ZvS Iس(<51G13qۯj>,)Fz ipY[\j`ؖ)y]k-_ ʕ7@s, )ĕ[SѪEs )ezBYcRQreKұN=Iʎ(^VܷbfS>E>Ed#|$2wl jUCqSpZb؞*aѦ#D wCy1W@.^ԲʏK&IU~򰵵`o%p*l:#%|.C_' lT^Kv";G^1 fϊmp| !RB n_? a"foMt/O4٤á)oD3bü1opKO}T61`GZ@"S@KAP` |=n! Aڰl:i_i,eٵ;$Mu%#-oуdsGmeO@fי#O %~ȩ~,2C8tkHVZ [uS"sڣIѸ #B qKӤ;nG䕮7+иN,ڸW-)8ʔB El=WJLAOSz{P}ynZ ('m%tDqSpm-qWMqO0 Z6U,ܼW,.OPJ_Wi} =)ػzohg~RP^bmVu'2ƚG\}Ϡz#7 Z" C JT5JZ+F,ޅly!x:A |/ ?U2T;]: >/$*\KpuMoBɆ )>j?/*T1y.S &\f60m6cE e(/~ "89inPFft alHjxJʯ \<0ůlԅ&/%Kŀ𰧒kc܊}a8&Am%0 3=-Si+lhH#1ns\0k\O(Z V_P" WEySwB6Ю% %_%K;uAX7 KqǾUsh63LI,d ifW ̰aa =PZl#]Lgum޸fI fwp.C0lElK8<1al2?⼐ ɌEJ05pa$xĮ v\F\FV(c\/rrIYX$H5)oh;/)Ŋ` {G1S 6ò]'*Z#&Kz{)ĆpuSa&۴7NJ>pi)u;M-w!ǥ *Iک09ۻa*YUj6<#)бQE>x+[`cJ.- DDV ?TMh.i {lum `.]Z{]a=>BRmhئ;r’A][3|M1)Q\KĿ%R@daюC]H=I'zntE\y4h{N^V2$z"dv>S2M ^H [匪k(UEÙ@<%41:VU?:tÈCЮ=ꔑl>YadE*RTyy"b+-,k]hbҢm4EM IDAT7-$iB)LzLn~Ebj(F!1/S{Z[UH k_5Pqqzx6OV܇LC\UtlbX+>kV.D'+/\{KAvrx]/qi6Ly1EYV9 8bX/۵hR$(zД<_&`RHQ7m'nO'{RFF E#A{m<|$n]"A@V(.:E5(' en}q2!Fwwq/+ . 2Rct|ex'J)BoJdJo4>wbX@}yYj;IV&7 n},EA=M _}Q攓 AK)ˎ؞)®*bʭ@I&aۯzfSYfw;6 /w J=vVdt4Umu&h%YJ 60m}g%Ϲ-EP _[k뛕:N(LYutV('!9ۥw/F-54nE5zpg[C(3]=NQOF'q[p0{ޢ^ !?vCe(?#z]m5S>_W L#3 < v ,tEXK6}F[QLUR A6dG:pTteԸicS ᯂsy4E#q+@ILPIOa#Zy?X,i(w6's5v:E-473'rN(OZ.6f]Q2UTpԧ"̮5^#lj׫ lOε@tY`Z h ꣥hT4PN<$j7j)VWƏGC ClRS[$qXmHQB}SuNC۔qMUS2[]=*h,V:X,'Mm+Gf51[g,Cx.w\ޓ&ޘ:/%7N-@acY uZtƱqC<~.H4V_ l[G\vv3+Ff&yFˮ.KWb'D^kq]~}ceT/7!eF\K>` u(6..S{' Eכv iAY#;úx<܇ "d VM{tՍ1xE^ÓЭi],uZ&)5Fm%Y=D",%(%$(K% A1 g`O! WWCiI1ؿv< +)9.^!w2u'ͽ٤@"#7WHLcKof912%ǮrU^ Gy)B |1cSIwncPa^Tk+h,Jomu?R$@{,9P%`'n~&âĂeR0 RPR2ryT.Y ]wWCGNq9@nia)WK!sBkи):m#AĪ XZgp8ژ2J P'q!ʼe7.ᚸ%uh߅E@ݿ7y1?0yTmSQ*IzUu<;#]4)yfit> K3)HO{8m~j\7־5l>`^$}vJH V@MIFPN A|]y㤍G'PKݐ׮gOĤ@y8i:,%vʄ0@Ïricx:nSVXtRLUarߖ06^ I Ǿe;>ϼ]$Z-/>-Q\rD =++qiC?"3,%w@pSbD`u[I!8Ӱ0 e`(Oh#$kT,#!; j@9%u꒘@ゑII$͓ug]- ڶL{B}OmG>PKLA~Q yA~7eWczeh-0[!IAI Q>D8 a9{[&m5فn,R )I%)I/-_J8 hE1>޴sۡDq!:C0HSf}?1x&|͎R yPKlG24 )0`XX%5\N!+JG"ߊE7"$#FfC5`H0j5D~;v7gEC3J́.kH@Ա zpSR@,TL[2Ҟ{  2Gd3]Kďqpkϕ7BR{ji Pb Uţ&%woGWtLqJK@bߦ;b:vt\Ȼ9wū{_VU~38v%)""b"((*-vwwwwa`"H Hww|EPtqԙ{b}޽=ݫc׶ub m5msǕ[ڻz[/T>n܆Cb̑Ƙ廨8LV#N@[e2m%ݾ#cp}k }/>}/*Tz lB>4>uh m/.AEq)^C_<~l߆-f or|R@iTEBmg{gO쑽!O4A|xZWk1zXo4UǂxdTbvu]Hkrz) c lM* OD܆ĄzbElb@_0fGN'-D/ )ȡY'7=t |w+S)Ƞv7/,UcSso)(Ս){jJ`_=ҢL'P1xʵ zQļmbH2 mCṗ4c%qXM؄(3և\Xu}yc Z4E{ʪ&>I!ۿ~.D7I*=GPT5QiqM[UsIe;"QpyO^ JTݜ HDdՐ@mqwY_]J*_1'OsғHtዧR oycJl0H8,JFF"Rpdb LTԴc+#JTpL"biKsZ\B9{> {9!k E `d1FFM1dbp1USYC ; e?6R$>}u4i =&LYee ԡ=)+DuǔɣKќPNi)[-І2IQӱ-/F&?F!h_LMΥL!ZA;ÆRW̝GcDq[}AaMYBY HȨ(JV(ܽ꿠?βE{sFZ"o^ԏ )+ܼW0|dePvTt o;@P,77$.PqSUE,\(3s^eN8yLJ$7'\$'>4!&QѴWrsr>; N{s'!.w!!H._fBHߑ[>G 8=%Őw bhU쑞L`OYJr z4d3ɕ}Y Kq-w{N#O9KA'?.! )g0R_G r)]I(oaML\XAACe曓B7"PR@_(^F4UO82 (UB-11Y_@>gO]S*H^?]d0L :2 )+4N{u[ڡ\V꫟HghH#?5K:_r &Z:tڍ,|P؅@Ix ^/[`?Y F j.}yd&ߍb X spOVVV)`_%?)(U҄ɢCT^Zȷ!PRDI^"dfz*YҾixGV@rMGu3Џ`&%ߍp0näIEH1O%H(;ޫOPP\m,^ )\ܞ>\'\оp 91/ܞ];#-j]30yd2dke໑x# g$ŲFڐ R=ܟÏ z㍿//ܞ£μB=^=.O᥻<={q.C/x[wR[\Yc~~ 0`2Pw`QF .Pm1RP󿶱ڐHY<{OUׯȕ(G8 ҋrq<p |G\JS)?Y%K [_۳'xtm &L 2_&}b)| _Ol/ǿLGMoǑSp51 >+vR&7_LOCkifGׯ\@̿\xbJ0`2dlq)peR i[_>Kr3_a;n IDATᥕ~ķpVoF-͚#!`0~<7\b6Ï#?^`#`0`  &L ]~$)({pp@黲z ޗ QX!CbjVy_V`o 8B+JX#Fl'CgDF ּ+< ;/$^7+MgջZT;a֓x3>< p~oXQzc%ؿ{XuPLC!"H#0`2d$Jp%\ %k)()A˦a1oǿCKaiwFR].\ջHi 60C:0e)l+ A>G "}1}8L?'cڒp"ww{ `Šش|:K)q:w<:b h=/MQ=rqZLjss L[wż#f` BŨa}ؼaMQ)dR \2 !C1l$Q1܈ًV= spaJ,߸ Q'ƚ%1}hXY͂MupF zr^rְm3o#HSN+A.hذ1im&wExӇqǤ%Re(ey m0a8 Sƍ9^=q+Ji21upl޹ży/&LX[ԥ8z U0{O!H#0`2d@MAI-Vۄ3`^=p<^ wCGwɈMΠex}!#a:Ҋ)(DYi>=҉ 3% ."Is`T×ػj:D@c8>|K}tۻQVwo~Ea8c7.kM WvW͕WfPlfV/JH9i: M AYE#'σWX *xPvjPWBOKgÅ0]+ s"[wbQgo8 W.؁%SG`{lBVn>ߗ!&%.؆yúCSל+r()X:JZXr%Zd?qAH{.\䑷$ȵ#FZ }uuB-tѹ>N]wA{`[R1"5/0`2dZRD SIQ>$8XME)yHj; "9xUL+X>{4G@X$3qxhvH ?驩+ = cDCfE@l|9"#rcڡ8ug6τDeel;؈69^Q Jvm|J M 'S[iSՁfpx³f!MNP-p=dw%HKIBՅU~h>*"XQ2,c&Nj!G!وVe{/+E;–Q'-\++u#s$ގ2vru"NG0K$ Gz7`$5 p=Ο9 %Ņ@dL -Cdtq%%(#YJ!%M1RgG_#BV  ς{fz<۳'HJGvV&mYlc2e o&5UZ#2 GP&$rJE˨LRVfg (D&[\j7AAULF>HATDm)\"Iydu ycKIKhe?-]Oې0}V]YIb#Bcp pM&)-eiINv&o(@ǥLMro(.),P%W˜2eݳ i/\TS^DҜ#4"k\|B%94a֕[y\0F`F )Ϣ|/ҍ\Iy(dx/-ESX]/HѹF4־XyA_׸뻝OR} >_D7Otza8p~,[0 R> +)b~i9͉!|ꚯiGÑ[7y:W߲>@[e%ȫvơ."+crD&t=^6.lB-w ?}> 7S~+t 0g|vWХ{VyEk+b Il86b8Ty}5a}\0RPd C!aԉ!RW/, U)VWذtO>j5 <#E;OVI[F^00tԥrRcӷ/[XmgdV(fbjkdVy߂ňQ8zvO)C8%֥01TήpcP}pX2-? uYq9!Iex'kG;9nƥ062D^S"98j2RA  [)ȃe0G_ n3gFfj,o]0sŽ0hSfBj# L ٰcq u3Rܵ6 (% l 0y`ܵQUbNYV8sW|p6Y ㏷H野q>lB<˩:)<@ >=iI}P\A߆ھgg3 j)E;DXqFY:=I56PܑC+@^Z5tUA6Lƌ ݶ=t)62 d%.{g$DжC'jm!$"NQLJbEO^OeN5)~Aꋤ` OY ۘ`J:p $EG]ߋme &&読1QQM_ g"ZKaݣrp`TncڽpՏgbhݼ j!8Xt4ĕ^\ZPP"BՔ!,*)[N D($:hjA^F_D0:M nN=nԸ9b^YKWPM5G)Hɮg{$lVG^ VNYMIJD:FDf/ͳWՄQ߅bQD0fAD#3w&Vxr9  Sa]WJ@)U(*♖hTG6c Ch C ޽i Nzp:(/tQ9M OInդV!^I՗ک sO o|}jU!`/) o.>Sr2έr8`VV!p7<{D0kN._*q)!O',Fla`KE]Z)*%QpPوω!&"]MrZgVC^IoGYR](BC,GGXT޼nP"ttѹ h/+ ( |"yKNܜ,8GC"8I>ׄ!EB^ps}7ObY7t2 aHُS=a n: uđ-й],{]ǎx$c1eRӤ2G\4',kjH)| @QaۣoGyw 9e~9Y|d[e_yIAVX#++`ֻd; ›l ΁ HAT }IJϵ0:7oޤʴi&PcǎܞW0f}`04J `iiexžƴbC07 3թhˡկ2"Sr:{%̌BwaIY( gIoCV !:ȏۉ.a05S3Xm-t4Ъ\vs8zkCE7ͭEul͇㨳BA\NWC?Դ(*%sp_:Fī˹)8)Gu'Gt9 }s .,DrSJK{Gp7n^=;էdk㒋O%v S=ѵ,޽dSȊ zF}L+Z2cS6r<Rq 0>xS"28!iQA:MH@.Q_omqxC태Dn6׸H; b @ qzBDPtU`dokUuW~ܡX*aģS 5N,HV;~,,-1vx،qr2ɤU]D 2o/7'}#Uj=2%SÇEW; ,]LMq wNUy)Te /@HA{Y)Z83VO8nM(q|U$_($d>QLY j"2}2eG8@fY.9@ cNJG` n5d:` zUgE@GI1(U@ 8+Gu'rqI d+v,DU[`ٰ @ujI ra}d)H|ZY3g΄ͤqԿ'hDrrr }h%mG]L5˖GZo]*YXkr AzB8V[wCQ6@)M $Z)攬4<RRhӰpTo&WQxD@YqHrv1fcD^MO+.#a:/;-(&څH ;ie~+,ZS&XAEQzǑ[ 1E!?+׏Χc (3U|.e3 ꪄͅ=` aQCyX1ͅ$`6zZq#M2 JVeH1QIrUYm97+3JT#cɲŘ<ʌܘиq 4N#ʗ/AYt Lql߼ &ߦ_ BՕpJVF!FV}Á3al&G:$ qLVM}[8;ZeRN!;!sLam>4²|4$P3cݱ` $Ġ6_Bpk^x,R* sP@^CYkmknv6M22:E)Xf=f͞q߻KVw/<%b9WoEpdTe߂1E.(e޼޾*2,#~ޞ~wCpKIZ>1 @H%Z E˖h֬h)Y%LYo¢*WrRIB[um>lr9Ƀ݁<חϐo> C^c83H@ ppm䒥!!:KlQN pKb5年Q0 ""L;Š?pĺ^\-H"e!6 3z"}LymYI^R@)U{!qQ!'$ X=gbkۏ%p+EO5)HvkΕ$bٔ*KVT?p؇NC>G5ۚ\SH"B.C;EE,(@ZG4hݧȩ !hKZ@XʊrhIмEs̨`ƊmlH}(7 %$QRT0sZ"ˡL4 ,On O[qY9})iq8kʷc+. 'UJ)l٘CQ ȷp~D! T+):Nw wo ;b-_#xHHꤠ( GO4ͲޕX k^:p'2b^;,j`ݶ~Z cyzhȢek! kۄ)֖q`4H"(ZR8*&=}*^?Ͱ " eGj:Hzt~ @#P+R5J;j:}Q~&8> էXP؞90/CNUuR1pq$ش` d;%C\;)xWnyT]T9dx~P*zVT\L5j؊9EV^{5) faXx2KA?Y C HwV3-3t aۂj4Mw2X뛎+2YYA>)Qxt(RQSQq HA1 m2HynN wAL |@{%Kn>67!,js otU@G01uUe×u9:ҿJA]GvjJ|H{Z|ޭLOEVF* c΅6߉e1e0Fﬠ?ǎmpinS=>#\{wh\x;o@ص{R}qˬul߾:RC݉ۈW)0W/6j1)s]`0 |gRPe[{g,b^p+wJʳpV1 ~uó'TT1&Y 5`0Y)`?R3/1!n.ɉq0RK@zjƒ,`!o(nݭrY ه>!`|"y ܰH\>1 N`cnUc\:w;0d]t۝ "1EPc9&(xAgsg!`-)Tx׮ad2p=q[ہlcR2Ȁ3?U>w(Y(k"}C!_E B?w=`0|ǫtU; PPrMG&C!K H/1Ml C#ojG ^<{TF ~0 /"IA3vZ9"*?C!9֭8CϜ9[[[zs.٨ pRq}te[Le|<:}p8a0` ‚_zQn &0}yfֵ.!& 3G0fì1dh8u2Dxb@팵`#UI/evlظ 7oq1x~]I ) `M1 'a]bW/zn $Z5A??Aב;ᕑ]/mm#!nX: σT+!kJ/!,e%idl:xS XShvF@fΗ. (Cn@URclܴl;x lij )Y C#M 7Ȓy[rr SR_Tw%HNJBjz&223y$wLKARbbbuҒ"AMC*m>F~N://GiqRS$:;+'eFw(..F !> :es -heh6\:‡V (}?7 aO! J!E{CG)]hHv(/{GT3xqئf ,UWK LkrrcQq)oE4)Y-wȥ47ܜgBd$QK[ " G"1{_1_sC P`뎝@@ Ѿs癥L!`:ҒBbphBZa/-Z7DUuӣZ4~k y h-hI??pC@rNУ$eѸqCiCڣٟM0`,dPXдy+4n)c*8R?r Dh5RP NC[7CVQ+\y%ͽ x삺;alw%)h:39+&<5Ա7ߏ,{QvJ8XyhE5={y?*LjU/**H ”ὡ}&/*2r(KŸS!F;B0\FKc1WzMt2aHQUFgm' 70NK Jq3(B:4{ Bj?kɩY!j>!!=gHWNd0?@ b1ԩ9i%[DEn*~NP~k.0z@'4kd{sJ 1zdZ6DIcxްW1XK -t`F6\ch/q/mpe=MQ94n k"bs( fB ̜5-0eiZjЮh;i>%8i ZamD8ah#n: ؿt(%0cFܺs[n{BX8R$a!V苲`~($Q?Zُ ā-pY)'6S?o - 1^{xh< &m~G.ְuOF#R4ś@The'a.?h7Zia-igqf&Z`W_6:{0rw=Ӻ*@^R\=rbJ8|UNC+:b F ~Yacb0@Iho~]h=!/- A'I6q+^T3%W@`I@:/BZyÔ3~dup-׎o%Bk@ Zߤ1b#b+?G ʊwH4iZ KB`,;PZtG[_\ vH6OHAY 95Rɥ zq Z0C&CRlllx$+#ƈ]qp@84Xb՘hWrc cŲu&n+IHА7yude,qdJ%/H 4&VZ4\v۾X)8'rLמ2 cp{ B)Xlu$qA0zO: XC?y(K<$Ut#8{1D5هO񎷯C6yʾFRꁅ6$!e2q)4F{ai4 хJg {xށrZ"XW-N |rh!7aQױCG#H?C!~ԙpy] þ}a2g1p2=FD'L`T881ưyY;ac{`l_3Ƅ #̆`ݩp;C^ IDAT{f0ofaqehyJ_D5.Z}8O|pt\ 408&q77g)p?h};:GÊ_PxAV<^Ad( 7cbƼȬP̽+p%0꥕߀#6irz>"Y?!TQVVⱇ* (N™IVC^AƸGELDR Y{e0~(Y C#PgRz/",rG3غT!JE4=3~.)惍!`''oF}Y>YUD'}jX @`б  O#?2 F ~y``0F ?{WVUEg$IiT,DJnnut$$TR0Pzo}ƌ?ƽ߇w=af@CCC'D#?rS@%L*΢ZYi>j N  \ZkLh}!X4>WTɫM )F^W96MQK= p}=#<ė`; {f꘷^ NEؼv$dyW+ eXjb6/m~snOvi-RMz/|DBMNAPn&acp8_tP - !פ ._ʰdKHqfuz:ryYٍĪ%x!֭ƍI LVey]scFU}ٵͤrU-o_=r# 1.#:s53)`P\;ҏ^xxq[pqqGp 7x=hdٓ8{<|172U-Pk, A8z95 t].]AǓdNJ!ٸ![WhX9.^7/E>"bWw2Rr%n$PL.e8|ȗ0Aۄ;?)=(Aԉ@?nʱv H*DxT0;<v,|=R޽=xZ9⟜!Wo.O3>[ ۸!NM Rm* [hum-CXRP]P!h:<ٽu:Y{n`U&< =ṟㅷ韛Bܹ s'IJu=h]@Y3޽lr*yFLrC^ang+gNߒC' ׬wp>7gK_?Bp?'N {mb`4IE# @Is2:O+4$6h#IXBo ~M -MZq3uCYQ gn`: C$dwb>4B0[=X&b;7TT==Se(HAzoqi41ƞPTZӠ  BRZbHdܹr !#& H5mÎvx 8BEZ b PQRE}q7Xx.6\ZA1j3I-/~CF :4Z+{~]Z]B"eeW~v.U_qxV4Vj s.hc #9k:s r:1QA[aK;L46M -7p0A^}1OKB<ާg(?!оe =ae.~˱e`ɣw[vVfư:n?1 xϸy$Dq<} : IW´yg3E?" cΨ04h0jHh7@^#XR}`L{VL m6 l/.ߍ6Z0‑# m_S ;&2ahvh۾zYMѻOW:04B`MU3Rz"]؍ }9dvDT̮W? Cg!!50ix?Ҫ3t%$$Gґa6?y,UVogPG !!!"PgRT4>e 6{ɓ߀~T!*"\>NCc!$W Q9`^_gz"3g)?æ~/ ΓrŽ (^Ơκh,]p"d/ 0a?rr=} ~oׇ!|Q (4"T-/8>@3=x׸wS2̕!;3]UA\33bD]pc?=C:@DB@ J@Ugxq+=-u "Č ľ 8ݾnw¯H0;wI 8Z'{|74SRF<˃ۖkuɌ'2m{+.iR# Tjbљ5#WI ld&`z/u9t"˃"(WB*J[(iw¹;Y4[)h𘯏N|zn"ƒqB(%= Yg I urlQƢBĸq<L0ȵu1l+<(K@E;L֍+8y$((U8~9^6bY1P&=SA #\Z u>ۼR6CpjYID'@QARRH(DVg4o,q>HMhH Y tTq%~p$T"T>LLAWM 0r̛3 THqPx$$ N?#4TB VlL?[W(7^ANA!n'RP![YE i@D\B2Ar){դPRc77 㐜Њr\ dxVj%6 ?hʊ`^"_|:[n . n .l=ZktĒwQq'/VNESE!K82aD無Y>-v5<ADZHAbo>Vx9BT uX5BBTQɌt1>h դmKFdtn74)@y& SM3]fPMqpm,i(n ?и.1cN#O:]cu ZX{MAkGW`f ;X\㏌=(H%?]I`9,)ƝT4#R\*)9H퇇Y= `meWRޑPU g![:_;{}M8RP 3υ@IA~ $jtŒo4IA|xj F$M!''#%%q$l=Gg%]Zi@TJ/Pths8 IM+bHt󉴖[q~hAO}:L‰'z"դ()#ua7ӭICR&3iSQ&2HLOhH *d4["n}Jp+ d BRs\v&eӯ>$5,`}/&dEG{/NI1>J1fTI!,ΐr TCl"i;}ذd)jd0L 5d۫|wrqI cԙiRX j3_TSv|b`H(OQh\]L!#EewHAݱZrpp|ԙ3G KAa%,i ql{TM מӽ&O3`F zZ s,mŤ@JT\?"Id09ܩqlXpmdU?q'⬒WxЉqkf*I}9Y l-S.Ć)Pl\,X5"d 1 X)h(5W+J]?@;)MEtVT\4ғKA҂rV-QOi e'v*s%KJK,;$ f)Qj8|@~66k`YK4c)p@WyY R@U },w<."m2cq~<ŋs}"20[Arkl7B rkdȂ" Ws 4hDzUv֭ш X慣!2gq>"jG/v:L븹5SਧI1hdZ/yq暢<P"RSꦽ) 7)֚ KH1DP a)}(b .H;s\tYEC'MC*zg>D{j1đ_!W>/&ҟa#pbHL^v&Sc(:{HBp|8-X@"2٤mۏ̼l<2 }} pef1&*!m.'7b"4,)TR@<1-p$#,)CSf{;Q'D`b SLALG캜'פ"",)LaγVRZe)ß\tb(KB,ۮSo :.ĥbc Ɲ{sF:06eX\m)ȩ?EV0BS஺!Ƶ3)H=HmD ,XP @C).$>pq\-<ʊpo+LZ6CTJҔ'Mg;LGzfN6#;Ą(.@J((61eNJ^} AXư"P!]&=$DNrmCzR곲3هd )1K3NH68 C~s HW^_"1I][Ffj1 H:up+wM!YS䚡)=|V9{q8SI()+a0'w1vU)l!|a-٘4{02Lo 1)L*s:-#H@$̜:: ,) %>}6ñOL0mtU!&,>+`alV0` t5`jq5N/<4&V[njIe⤌c„ܖ31w ^_Ek5-t12HͅC >ocP+ĚΘ2yA 3 m5yQlM]Po`x'XXˈ Q/@ 1gcT8S!#I hu+'܇(շuO1hʐW"tұlbڴ Ɛ2f"r%c}1HB?l)}ȡ+:XtFCvA3*^t8KNcv>̺{p }:w^ _)jgD$2 6}2 ub VClTl"XeM}H YTM|xLUAnYun }c՜ )Ccϡ#xX`/&șjWz}ݛT!Ǔj4! ،;w+(#N o`S>Tgn{$X¼T >}TagVݐ-NٓTÃ!8q BI+ք\=FPZw_S7Q&:Scḿ{20u ޣWjnpN^n8{!1`j(\%L=Du9>Sp02Q`GefJ|~'+d"j#Cw=㱎b2Jz|4 w HĽ!!!"PgRΗ?E X~ =~a^5Dn#v xG$|{TXmոt6< '|"+7NGa o+[iq<\giѸYY|rXN r}~DZE9Yl %E>WO7.SH+;9qQZ[77,/#]mPovY 6EyHbYy5dNI[f԰SSH7CCCA#R0ngT[L.1EEEl:/@u%\lLy5\-׌C)CCCB#?rrH-3ד | N"!>K&H}KS%0f:maJ1gU&‰!"viqppIAQm9 8_^PoVP@_l]:@FR 3k(ƀkvk F^ z~fԥU3bi@O8n=/*bH7q #{Fpٻo^=ٓG9K7"uc 5xл/z9MFȹKZ{u޴'Yk(ZT M,) Yok| ^Ww {_#LI~YI4~1|\ ۇӱ'z(,9J Hp_988~"L xr܎ pꀾv"8<c G)Ib540cRLpZR:N-!TŶ[0qh9Sa3_tm: 2* xRWd#m0XrOOcq3d5mAvhթ={CՖq{ Lt0xL[mMrE`d%c@0+|\ĖSax/珃 L,c HO YTYO7D% ,[CgbjΞk!#rpԙTBV:֏싉;N#GwNB,[IuѬ!bKYaHG]9%16h;'݇MA&uRK@VѼ-YH&Jp?xOBňNbsWT0W'8Nم鹔ʙ7gL|/AQ(HQCT8v&PTvB2%q8d/-zCX:tG!63 1w'tw>*nESi9l qr1ZY:Qa>d5qMOu 6@I {Z@-/+Bx".艦 jxQyRT-B»ԖiCL$`k8z,}Z**;d*eek99@\d f?Ĝ-0cN}K ; OG ~!!#դ E"ntUVm{+vvL Ei)(.@/3[?vUƚ)N*} eͨr#1"Z ^sшȃW[;R\=j='} ٬ىZ18n|#eda3GVNqQɣ|=Ek?Yna FVqja${!>O so(Vcggu2m\}^V<`m'"i''0F *͑Pob|O>D~y)} a ͕P_1V]9/ ]mt4Nl(=C8Z]G% 5%PKv4'Ds:g+^.F#CCCGF_#o| Tv>ܝm5QS#D='Ϩt0ӇiO;G@E},ص(N;P6!C0l0 <M+(,-GnVܷı#0%41Ow:gd##lYC.D#Xu Ê)D q)8SA y#Rp LUaBBz5b ~ƒ.Z`ٵRPFq **0{-kk.GTD{N ::0 4foù_3QA T[}O{w{iHL!#!G*IACr:S- 1bfC`דHp;-0;S%"ĬYYVLg(0'Jq3*]O^ Up79Rş{R+FB0Y /1&Zv;ae UC;]Hzc8s{(7Y 8\msO9~ 8RK,37I_&DEg8<8R+RJY[aKn>sE!FZ>泤ʑ" =ಯ*K}HQu6‡Wf ,M@OJʪ4[Q\Rν!K00v=y<߿ƜP=7~޸<0{@܎:LR,z/Vb2=S5h?I4Vo%C5E;=M J&4*"_: 026uW6pFxX#ٯ<^\Ht4сzs7AYY)Q1ᄦϭȨ`᧣g5Mc,tux4ms+[DEq3u)+O %4o ǡJ/obT?+hijҶڡ)Me^[Q Y[iuҭ(uˈǪ)lIdE pE +3?X=+G ~f!!s#դ)8E.(YyE(щ|vFRS; i@JHˊ \0TW>]N2)L$$%'#7WQ^RRFL5LdjǴM%7 Q@mBeQ!IY)x<}FvAE|q_>sd F#^C\Eފh$V,rwJSILըX SS l)))BSSvvnUW#̬KFz;d'p|hn!n_~QLA=(8?)I]:UKIQ^ոi4fJkYxF*ɕDR QZ SR~RNĐ,rbKacɔ`BfdvmXPXB1pK$7z=9~m8Rk?7{&?7<]Ia,8cH?ΓG8m|u TՑMӸ~杤W1G_l;t$}^8~|8R!7!!0/a#G#?k!!]"rY8888 )&0rpppp_cn.)uמ9?B#.e g>ǚKa;~P_Z mz 6lqwKpZ\=|&!Ja-:?U/,qLj|+u}^ǧś#I!!!%Ф,)6oKA_2~>&/fT`mPmKLVeSR%i!ܣEB[*#ޓ>ڧ잮ˡc3o~.G ~D0)"rd䢴"g ~dVQ:Iz9)=F6Ӟ2F++s)d^.-xNyAe>ec147 T6;%eYc(/=MWQuۿA 3.,CNe9yȯ!PN5Zn%<(k.ɖ̝ȡU5-\~;|sSM;ʴyi;77CRf"nce$+Gs+`pN2jd̟Wnq jO֋Ҳ*5ɡ ̾SUyir3bhcȤ~rQ=[P$# #-(PObݘ+XJwlpFSms_Hvׂy{v2;9gQ~Q"f\]}ST<Ǥ.)̍!!! PgR(%7@BV6 9Y{A/Fimj)AT Aq~*|/Fsy)4m 2鄰@*76qa!zjh$:m,pS$Ɛvl( S.Qԗ6|3$E-YՔKɡ,OXj97';wF uwK-zajd v82qg):4BZ={9TAٴ:I[;bzW$6lu=4աf}QEl0,=M5X[AYs$qګ0/GVrShkh@]物H0:hF_xwX6+7n m}.Ehv` Ա`(U.ƒ-觯e&h . 5 *˞#xٗa\')bԯ5S*%mhC]E`wPtbLj.0Ӣ0*Qu’b;BvZw1d硸 G<ףG[項^t9Ovhbq+CQI-a`[94rvJIzusڢKٸ* 7G Ux988SL r3 ddao(F #R.yXc _+I(}-dT wHzԥg©a^3T%AD#g@g]iŒVü)мڡg v(p)4&OacxuBR7{}@*inx1.z{G<^A(+/GOOEb"\AW ̝3G"-.VmqĹ*"wz4o~z 'ba:}N@6J1 #] 3R g"U`cs3ka溝("@R5^d3Eq|/T;bS5z^@KV,Gȱ@&&8s>Q;]q40fxFui {eu8oc4NKSĽO$R +XL`ߑ3lx6"fv[XZ6XuaXp>wkϽ f 6%R2DQ}UA[{p R5 &: zz"Rr UH. qxXsG@SN;|\8ȡX.$FnB{-8V1qIQf0?{g#/NJ{CCCGCΤ 9t ~ d PԄFsH7 |x8GKkb_e&b88~ЂګR ck)FE=ސ 2t|-)4RMֶ/N]]AWTF|V ryxp3 {u5-YUV@EFG},÷4hh[𚈮'>݊`fl #.=m IDAT{QR1v<Z-ĥ*YEL/xqC)И):g;jp=p2Ma1x Bv3s<͉=ErGq{Y'+ nHeװshC1 &zֹPC؅ @BTw"q`g)`ƺ k#mhS0ub\~*!4.糲p-`!̛b󰠗>lWz>YVݰIz;5~Rȅ g5 tppF/3)H?&еa 9wSf"BpZ<ì (.)2Kz :C&.؂q*^ffg(KHd?=>bR=|w8rMR|N8QN]g#RmBAyy)d",,ibS rwܖؐ|alw7Nyê6Љueh>gkwY a'?XqH#D)>05n<==g?DDR#]! 6N[{f:堀Ga 'b޽8pރܞ?KB Xj4$Rе}$R La5,V6<@c Qa<`RAO~TR7.` m5 tD v)k窭 v#h ,kco xݍbJ6Y`NZ"P[V*pSpt~dݪCE#.\%u& \!ZOG~&y9]W#< t$=3S(6^wdқ%9BBMy Tᔗױm ^o ( )HWOU6e!E. ,裏"26vϠ[hgn# +KE4شOٗ'U"_04EzH So<#,e3P KRH k|ݤX 1i|9g܇T#8M,6&-D|'N?1M^y&Er:{1e*CII SVƫ"S7.Y 5{7^i5dܧ:O^ XOD״rݐ}kOCG51; )R@6wЦ4tӾ3?^݋Э+UUCp#W!k!!!]#PgRP\v:?TM(и=V \'R^]F;~/ɛQƦOV*ah rh,![VMD&'$kaЊ`$Td)"%Iea(b/rw} I)RERF1& YE1W(K@c$*|i1S*4`7%0}f_(k3|V3afb #HTM% $"B.SR2>̔4ƦOL9::zB"SFxI*ޭP&b2pzyÙ'WT dZvF㬪S R8>$EcQ0Su8u<'A*Ac ˈnY5`=z9Y*]T4bud} ][Cjs'& JS=LTє}HO'6^z"?<]dEٺ$g ran:2*~?!Upspp|ԙ0JM|`inkk[8>;WV>0sGtKծ;L+gԷ;t6sWnBB^6|Tq}H# ;/AxWS@wbI4ç԰BZjxm[9eYq S)k#~GC\cAء:4;o"j z]K8um!2e9yWA2gĚEd9trsp]`o$VjZ[ u!P!!!!lA0>G?tKqax8l+\60t nta9F '>vFĵ7O|C088838R-'SL|CH\-;|K4888/8R}' wG ۥj8RrppppXgn&))(~ճFĨ旕&b eVZկ*70LZ3(+6 :SyY&6 %fm aqVe:ed4v Pz04눂/L-V39}XU%CQADAuV0PA)ED{C3qp^k]>|Z_J(b28w;VF_[4z_Hwi&QZG#swBJ m!Iu&z"<)_uT7ض~)ڵn7oHՕ4kХSg6JW0R~{AX0\#mA0< O\9v"ų3r^-\squ9O^T-SpO˸|2kk0~|/:kK>3~HKƽ>w/R L><^_Ep/jnDPo |R[$NC_\$l1ͪՐk>p?K}7v`F<5{'׵ |yW~j'zC68Eq|b ]qbBvy xPDˋ܄0ҙԤ S к}g|}6*ؙHԖKuoOw!B^E '8xz;(;M]q%u;Un1Mǯ^/QUl^W&*t aXΤ|CTv!픔EHβ:LrVn,ɣz(xڭ+\9 M9 46YSaDq')|<愑*P襎Qf#[ 7D LuEܶØ*([XҒR$h\]*+!fj \ ׍PУJC=60r2 03OFg~;wl} *hobpdߺ#BCCCGɤ,&=eag̅T;Vo~:6 ^KVh{tFDy> ŵ 0Hm)c)ZB(#fBKyR4D7̕95Q0Ғſ~iYÙpp=ǰzb|.1}ѹU=r%:[ Α/8~t Qm<{LĿ^`1k5Ful{O pF]r!P󪑗G *ʼG`$.x7)Z8f"dZ!EB6)H|dL[-s@xlFM;*\SAWo6Y;)0mIh1{!^CQN/P}3L1z-#> }$nݸɌkY5(&_ǯ#>ch[VV i)( /"gϞ!9= %E(.x!cd.En|Z/Ja^1/=E*=9kxt>CFf&B`ջ;FN]^M#| 9Q8z? qxp7_%)όV=NOճ ٱ :)KktG}n"11NAVV /ބI!(]MK&024 s޾}"/GI?anxI"71V J;BX}EOWgvDqb#f=2n#.1 iIo9dU!!SP? .kh)ed혝$ۇ 6E)^H{C4^b9LZ|MC:-HtWcËCCCgBɤ< 1f<6z7!T]p8N:p'XfL?6@f-1lSfHpY4o (J;5^ I8&X 떑P{aЊ:tir *+1|pD;.xW ѡ9<_p4Ǽk?\1J\ߪ0#ˍMVp/%L0x7rK '[}h {vE]WfmR>Kz+ %Io!K }mtۻ7 $0 6%.QH@|Gy^"/ e{/ pZ[sBYp>>~}c^(@Q+L+ԟqiDQu②{+lF̠#6F]J . I mEDbJOqĕ}mӿbT~&M!.<ͣkЗC )*{:c" &GYb "1nK;!} WHj@̏Oܲ?TuԵH+j|~tMxW35f@y8{!Pu})LxSDz]KvvFd(6ZbxPvЖƙk]TRPC; ;BCı+0ojഞHA減I^%to{ۄ!s qM888~L *NAWpzR^d E.D-//CU+:t סNܩ=Z/tOR V-awwzwoCND"Ӷml}-+X%,G6gffWWYVRIY${HDd7W1EIK]~eT{`@fJG^Z "tR(-ՈxrB{7VBi*wO΂r"^F\r={חCC'1"ݺt@Ry٘иyBM7Mo=> x+ә":`-+: GbH]'/?|?z l'BϰyhOlCHz WOE. h]N9RcxqWsppLyR> )bHAO)LS6 cE#)w. p#>8%>\ ApGzz:}<3']`u IŢH.`Oq _F~jr}95p!z2o~C"YEFQq vj1#O} +WH?,싞*B e'#.! %e 5}RPђɜ԰^06RiYAZXt ٴm Xh9NR[s PUݺaܚcHLg҅31@Jc5j( 99J"]``gc}/g=5B̦Ug_{N1;w`#7=;l!ٹ=^v 2bȡRCٝ5n7C㨉Gx,62m*FU;n)Ъ}-hAvb9ʧ?:8RGq988~^L *J' : _׮!k Zwxڠ9c+HlJfyܾ}ObܽZ Y f0s:R!vbFODŽ/`q.Iwm"]qw(ѭ+۫?zʪRH1kp7=VN5^H Ba)8R`͚AO1lnD (v 3GyQ^Gh3"a@FҸd$HOwAVR O/1eG#*5i/r2: cI 5^A||^|ȡ؋~"!)aP/9hGUm7h(cŶCX<@0{M-=ǣ+_HKxX,'2̲rrTqxd5|o9 CƭO( ,0YO/;B[opeĪC!Q _'#8e nV k}iȫ^dHRָ@{xؼh<$ۺIf14 qboV#Nh*YeW` hd/ev" gn#2u"r'ќj81Dbf9n(:i"05hJBG3oHgd3෡&Ie[*Ƴ$=-1o| ߅(elC}=`1{{MhBTE#3! f+_7"<&w.^y}V`;L Y OLL0iƲ+x$[`%ȧަP_S;}=)8^EGN1ZNAyȱ΍[5j8t+ʊY#uPpo888q4fj+n w#|شP"\ CFF~$7݇!% dMoK+ڭмY Ҭ .ClI BnEq4CKQHFTM{f̽>j\w nߴ]]hE @)16/a?l:adUÅuo ߹1dI)t%Uu+-y#@Zߦ͇-긌5|)m!S`e27_?مad YŦ?U=&SVYhFY wa7b0z,jZ=zvcAM]͞ (s` @Sjͅ{Ox#ǵzcEX7YN~ <z0M􇭭-t!Td%b($%}a7%w0&@'Ep>$i#*#_SO!ٛ:c k-YR }ξswEŧ' ~fܢ?zMy c3})9 4BF!WQcNTg;={(P͘Oi8slt1sc}ZӓУ`Jx2>#Еv .Lf#Pcd7!Qa0iH?hibYx.鐠eG&&Lk<}+8 FjBU D=}h`;pçbQ㫇U5uʆ5#9 LLR'9;~HB*PgH˖΅notJW(ۑҳ:m yh޼9BُCFaE`  0`5X m)ZSK֨ψ{ ' +kXY<]Uعl2&iQY(G+[vuIJ5I0G u{!!!OCɤNi<~ה .HAEi!{{qrً^#.EbPp=#q ʒ,=# e9q;5^S WSp8|>?xGɳ8zB#VW>(A{ʛ@e)^C8B?zg9EAij88EyT鄣=@5p8x44@OU +N!:6S՗c' oU5x~^X#Lb\k2>gq#N>O_ }N'q;, %9I@uEޣ;K< XgARtQN*/FȻ)R}e ;zG}?}> s[~I#9sv9KC^Uw"Rb(pg &M&:-ԧwޜd̻gG#Χ=SR]ԸH'}p!ux=?]¤B 4.O4N$ HrCCCCɤ)'w#PQUCbݗws^sCT%Rj>aN6.46듊x^#V ңb۶x^a0 [i_&#!۞[q[pspppÿ|LU wﰪ )5*. 7/;'}C5R~xAZtULEqΟS|pTW 8R3*'#@HApZqppPy On:E% đޜr#E#HpG ~$O𑛓+q2\Ԍ҂X<ؿ R |_fs- . cg~zd\XgOvĻuBQ$̡9qJz6\~J:Q`ADaGU'b耾YoPM7^KKsl MC0_%}[`$QQ^]͠k2QeݴCCCC?D jʓk!Ҷ|#LA:~'>JPFz" DN=P;Q>\@uz=v?/u*O+iRm#,#FS7Gθy(ƻgW4r? +GU2;j 7QvnO5h2d~S0 L_ T|DS1Q]HJ`p].x\~'8]iT|kXL[A֎ʒtٵf,ہSqɈ N*3jHX΀{ ^삅(XW# E+O /?u%Vo; RѰ8xyu֤?`3w5i"a쩘9 QiK'!+y,cF^So#07! ƒlدs3XLŤy*6M97 a &N ;Lx#.(> vXŔ[P+χHg rp,5J,mrĦe1? ޼sU ="m;O1r&[_7:3tvJlwә8~6ƒN46 `ylŎ0C4K N#8^4-`l6"aHV,Έ{cc1y&uekrǖi6- 2fVp=>ݨƅ`gW-s\Y+ L"Xn,,(;-.?;a7ew$Oְ'_AIg=7;D `h?F;oH_1n6fރq츲`\Ysh¸ c32ٚa0ld{E0<#GYsPX!/O1ch3h&DE{yp!ܗotp_Dž*xޅnF:SWCR\eY.ۋ $"ӻ0o.Gg|ǼvﯩK p}r&mma0s^~;p; wO@IAUeL I5L_@{ھ2rȢ飻С͗ *<Mv Q %Cn@Yl[= TYV{F:`l^\.Gj 6 =$}w^Gűc( t(ކXeV̟K ڞZk>hG;I~᫄Û }7Fp;TP$Ug(ItUIf^<0=x-g6|K*,.]¤/dbˌ &a!a)q&* P3c`ӆ8R<8DPVrmvTUp0Z@+%όBPXh}&51uBxxa34;JGA;-.^s"61`0MtJmVAԞ>ad-"P87mSa`J 2pf dU ƈkTSf_|",G- n1 :W-)%)``mԩA*vrt FIK=;6cpw^CiI}҈l]=YF678Oyi*j8쌩Hwp܊~Aq^:VZwR}4Xݎ eXFݺaѺM>f5:\웊!B\Vn"*p5q3!D?-M&yеm[ E2U] F頙*~y(AjJ R6a:n&R9^]]2Q_ak~iW~wMU2L4eS}i&H 1}Ԯ*?gCR ?ZGUU[#c ;3)ؓuz =MŇlRϡHcH(TWBckYMC*pTW"k9zItO΅")vM"zBVB {QeKawsn(EDV..TqHwj'aDz"H[`BkhǫyX0:I -WBi%̖"ܧx<~ W:IM0R4e$0fL{ڢCJŌ{;tQ)Irve%Px -182dgx jIm%ԉT#T;a6'&4WuL{I+vLp`H-tڡNU祺(@Bs4kU{n0edWVӳVFFMxŶhߪbif8u H_+’hfCB}oǂUMS0+EnAغ%YpQSf{ЩWC$PIm5=|Ώ #?w5τ@IAY'vkP4?&|d`yPG>}חV[APH&mPT2ñg uܿlA™/H(sUĠ;q+"~]ڏ1buSFّɬxӴ$7_g"<ļ)M &% PQC˖YָeHDk1HHvbp{ÒѥF/gŌə` ocˤIXYWahcEfq;l-!0\}|h3J@ XKR` CG =_e3ѲU['(aԭ|HɈ ]]]#VB9L<3d$ڐ5^޾?o'I; qwB‘q ][`S WIxs IdԸW620M 5Uhah F;Cڊte )xY!ӺOR`"fo=YSO͆9=w]G`B[%ܟg對) "3LsIv.;B_C J*M?HQ\/-#"-IBK%-BU5kSz(`q ߟƙRbˁPfrEY *<v pc``:IAin Ǡ;`O>A<|@[gN{`}Yh !3 ڤ)hl\#&O0(h! GF'p<_ "I+SS?aRK|Zr Y1pylB!$t`%71M;T7 ?nia?Jh%8+&  IDAT]hW_FH >)ѪCy . {Oa,R ^&3TcǻPtFm[CNs;c ǶvA )l7<!;:&*x C vרx~k X7C-@d)K.Y;5>u)'R0`pd IY )h 顄[֏t&dzc=xD+B!#Hg/|Y2W! $*#7n͙%,,m1g3A@uِE 9R`qrppd4BCG./0*?a25 `W-ԭvnK1Xw8<|B+30ixO#e9sY075fͪHWBuHefgg#;;Vi],)j;f M E7z]'N="F&eUӇ9c7ѣ5Ny:(I w<<܂~X{"J+Q]ݻ`rd!~cG!J/׵5CR^T IlB 'nrߺ_e uKı>^%pܳ [׻})8 mTpVmJ+J U1Ph_by&9gǤ@x9ϰi+5JZQ~q\DMHAM".mAh_97n+^+đxpqpph2)(/MP qco`脀`x9+W;HafVYYf|bc\"$zB]]FkgE<+ Ot1zuJRbcE6sIHB#.,0P^j$e_j~G>XF wE`PN;²+Ac51PxoCZX2 LPOh xmGX1R={D2ra5!X?yԓ-eUICrim$MN^}^{ +*}gtΙB:p#.6QDAv]CRr Rҳhk/xN.A]>TSe+*B\L #(1Gۏ E蠇 ړ|-/vn(e j) !NA.m)*}9e JªC B.7vs@hyP塋9"G *(8[ !clf~=ָ-@uc a<|i iGJ&=Xf#RSdu  3{}G ,NZtGiVqyDt#3W!w2&نq0ǫϊUWU"%>?a,S _ &&BKrc$(k+Uv8X:lf,_ n_y ٔ*ˊppaG#"$o4ƃCCC@Iߕz[c&PW${#AܴX2m $% /S$I~L*T1@V  C0PݨRTc!&e v[:ZRHzc?(f.K]i7]vҐWgl!d$9U^#}M3-#T.ʛ$YrCQVŞTST;aCvͱ3(2i:%FhHCh F8B.bPׂu=a=UFe9=W6hkql)P0¦c3ja9{CG/5a&{/$="ݷ&[@CY)JJzR-xRٔXFtzmx>><!WBo5u ?ՙ0Y r/(;E7Șt\à6tеEst$׊>36{ 0YpDRpQL>|5Ǖ$ҁY}'PРlʻ'<@&"e췠sA!"aSF2O}"4a`Zfn 9EUwlNz }.k~`dqo k,1N|CJ[UCwMzfڴ<M v6^rybdkh[Wr4b0ũڇ[Nϱ4߿S4K'40a D7iad bEテ9S[gR@m 6>L / -[4CX\}H]9lgͦ *Lbt.|Z<|'RԀ"鎚f-߂j"go_ƐPE]]ՈL_'P*59_wcY`x&|Fj%%PhklkG.Bw2W[kfhIIJ qi T䥡 UMKa#(dI7da c)je(úъ47^+G >CCC@IE'3-I HN}E6Fi`ȈjU% % >N`kDjH}!%)id833,=IH]dFZ@(6'Y-v1/ t>1!v{3Ye?# م!{W܎킨H^ 2.sTQ$V$ʼDY_XxeEWRF;P59t aTMC3ر%$$Jߌ#8~|7>}^՗2r3GٞxRd%# ⪲tI|e#=D$ 3'G K$[RR2]rfřbh(7;=d=xQ);33I)B!}+ϭkôP;Ǥ9}]-+ $*/g$tLsJ95Hb2([e% 0s̄3)7߼Jd>& I\3⑕hc3>¿R d2_O~jO5|^"ah[xEM+piBL[LaWmZfKJ °})=Q d&2zH^7)=ts?7M'ǂ![F!!! @jڎLEuF#?qsppM&)wCCCCG ysʍCCC"rppp.)]x?5))8E)L_G%4AzJVϟg,7Nrppp 8R'rppH|.^%R<o ӗ.GW*}GS?B#wCCCEO><|^鴆R֟D06SRʊ AA$]_N3 d`2j Z20m>(mLlSF*aQ(VPE}4G&iee%l()s&(s0}Kv&a-+WF,/.)uc9|ӇА5ېCc>gh(d%ٹ>H疹;88wH\s#CO>ǔ!Q*:v6P,(lG~vm\]E)J ,@Օ%$@RL R:jj: A0 )I9"2E0gvEmؑz__gd=ȩ,+HS%9uX,G`MW˗Lu1qk:A.k`@.?jd 0=̷EFQ&[B^V}Ѧ}HЋj tU%ntJd^xT+lb=!--cd"!%(t&YAB':t/޳㪪(_]peqg2iusf=U9;GPV 9ZV{!!B#!!!M&L2׵#[[Nz\ngIAuE;.̦Sػm f^DgW1yzVQo+ 6@K;H+,\Zl tWDaUwR DFjeYU}u\DJ@AP,@J[X;[;PTD1[n~7Uw}wYpsyfܱθvifޓ}Ȉ~ʀvMo=l9꫗7OҦn qbr({n[Qv~V(h,+\&Kœjm[ׯ +VӇ$n]Z:N>nO0ѬHM}EGT֩Cҡl9ymA/eW)NYW`OkA+! !" uqKH d[An y!l񟏰m]~K03== PE}3m4жu1l4 0*e sC#T/̨)HuQյ`)秎@ƴhy_G&7V܎:"@+4Qa xݴc==Lr0o[?CcQQe'¬h$={i[Jsd;&u 4 4nߍҮŋ-9JWgޓ)r" 4rB{(iVѦcaOcXT;]O-vVظG~z?) &YO@I Ąhr3 -5Z!}u{L:u "!8mD^2;wbcc[;OL2{BT!ND HJxFtdM7o,ͱ+SkEfy(Sԧ!L_8 #O|nj NؕۉGӶLlg7ة~ȒNw`݆eFt+Wf)GPS#{I٩jҥJ? )I&ZOwlDd hND iP{EeWU%p 5 q "PVYtt߮5TϤ #' 9=c7AKsmJFiJ.A R3 #-'Dyʴ3'!3a%04"{ }-3YW}MsN^n]`5$ lJ%r[LN){ݤg⁔+^<)H''||RERC, \8 uu}l_wEt!W)eRpztk\2y&)ILՐ,[MK'`E'i ۄ0̸)Sֿ !Pv0CW׈~ZI80;WHo~S!Hf>TL3<իSӼĎI#1[F b)3pQ7X"euYې!ZծBM#^{W8#r ?fLi%ngpJZ \[f> zX!1FunyqrJ ~pBvt"UDhj֠lߗS)(Ā 1v2!5mA 0g¬_F9Hg$vmltU۳sbc/ǠK#8}tCB@B_D ( BB@B@B&st  ]jhĒ5ìlG[(ߧl45c3+Zví33nC60<"[8q]S;a~.oۿsz+ tkfv?(?UW3+&%Jd^5]rΫB6re؋ exuFb\f4jۇډF\{/[lVq=90nґpїk57f| ##Ҭu{b3s}v~rp,b'py9Ã3[j_xfTtrls~g  ))N4,   @IA~F/C@_nFFF_wTLָb[? -psug~OI򥱶#v,N"! !s cQJH %%ֽ 'of:,tio݇w"aZݟ*)ӫWrࢋ8ςD ~)! !3"Sdah IDAT;^#*A4f  oC@"߆T[B@B@B ?!S4A$RO I   D ~q4Rwi)?^yj{h/ʈI3Q&(n]>;JVl[)WLMNde_C VNG4NcR[RJkܘ4n֋vWv 4Q)# "}+! ! !o@ Ϥ %1;p.w8y婇<,@D?ϟC;qg͊N;gOr5ӎe$玞؟uUBqOsB%hʲed$ŕCNr\)rM XiDZn'SSE&]Bt 9z1n>t55)k9{ȣD:MCW#GIz~_+wy Eu|8{0{z ]BKWHHK'.2N9{G̃n_ q)]tS?vWOoy #Έq?K7ŸB/9edk[9rSܽzAxLr#b|¾Y9:oq!67&͛lB#wqyrGs;'!)`{?${' \1\$agĜk9Go5%sM^*#GOtq"dB#:G6=oqW -UdHttiAs&(ܿIG٧bݢ%?Iz'nVBٟbX[)'ώ$!gR"} LQ\Y VNNH$.*FQ4Ŋ)^FIK7'dwe-AQTלCBLK vNo*.e44)VJpdB)/tnX[ t (Dx᝹++V/[%Kyv3IA}]UdP[ CA!]>--]NS~4KlW###,6AȊGΐA6)O#Qߪ*Oy&f@;3i|HkJI-7gK6t1n:@ 3ujJjZutqwv135clYk '9ii4(i"T#ICQh1%"r ZPreߓ{R^5xchR_Umd>D'xJ_*WQeɶ s {Ҟrc^y|)L4   O3)tn_(TAle٘)kAMyF ʥ&[ES)ѐA18XvR6ɜ՛Y6Ԕa~&xFo+ hLc ZB(sqT`~G "j ]{7`ݾ>eVb cَ./ə;ϑTXjP,VƇGMvn''ҭNÑq;w]nqJ>y0I1Sc] jLVԬ׏i)|a9]}@dTbe7N '4Ìv3Ys-1TP;-'lMx$SEWo>St?!E3"7kAHL Oa2RP{1Ocu'x)O_7KcNT7-qE|(9M(YVSr8y G {h NQ;.,2n ת*u O`p 4&P0R'2(?7G-Mgi(+kp~87 &.L&O>|qM:\ChL[SR!,k|˅`]lDAЖET)[L'X޺`P'_+&~p+Td}|}@6Sy-Ilfq߳ݬcٝ#ww$|#/ ^yh#ץ^O{ƴnŸ¿fIBl/NM m_sn9݄s.:s)_πԿ<g*;b{?DwFt1Pr9ϓC)kAtĎ9 7k4TJQ./yrbEw~W$ 1XCzp/%rRP׉_FEqZiN /71V-C2U?}> MZ"4*V GV*MJ.Y H&ZhN!DGjTgzFlDbѢa|L bB}X:zYiw?A~R =9%驱ti۪Z6CB6Jؼe -}Q /w@2Mjp+ڊObW2R_#nZW*qƜƒ1f RCDҼ3uC4izElL~MoG4}g뷞ӿJ"'! !#]|P71LF5hum(GaSxq+*LB*ut#/e'WҒRvfweMN=% Ԛs/c%Rym1/RTw1 Y PvNɉqΟ_\%)5QŰ$R>K Y9'ur;Id@PʋNa5y6^CV) v6ѩV}jb 4h9)Ϻ>{lKޜ ` Fn,שa[ls&L7akb)heR£'hTGˣ^UjL'eׄ&_$4àL|H8)zui&uBeuU&騕Lf|%|1TŶ;$[0fۋ wMq<tMEcV0mY9/JԭąhAL Ҹt:ո'^5Ual՜(Af R\ߒ 4bﳸK}ʗ*- *ż~ d`,q+-g JJt6"-ĿQe1)I grHt5y=Gu%5_߂w_P oGZDR ?Ǔ}:]f'9SJ_0INA֛"v=)oh洷IAaLg^ɼtBق0G/^l6J@|*smڥbZJu'r'6¤'C kb ){ͤHݐoȱNOC 3ʻ =IAsIvK։c r2l eE beI:4 zOb3ϟ#ّu¼oϰ8'搂k>}C @_Uv-v+1j'-JaѦk&NLܙECHaV|`OpP "vR3ٍ Rpqz.4|m 16? @)? d(§@v2#RPHv_Emy-o%!ˇ7ES6N9egA+e},ORSp:[gbΜmd|41l2Q2"fQmE DR++{7N k|M0?˻$[\?fE<}rjJyNmA}|R0uc~@k;,h?lIA!$:cNוD |IJHH| E *'5i5z5v[LpfǛ^REDQkЃyWѿeT3dx\'®>?G zGn5jhR؎B|6 }]c`9 ܓ٦pgǚALʫP>|J>1ӤYXB!l#AIAEA lZ`$%td* Ri>S͝0afw8RP0ibAE@Aj6l- ㅓiْf<ʔrJTށ!{&D%YG"QLeO< de.ZSSЁ];PG2}fu=;"꼙Ә=7u˔Bag_Ŏc΄;X1w "be#ڴk'l:ptmZ[v JYwHEʿ3|R2w"]0aU*Yq%9%tszZXy]!Fd298Pbj}-Ua>Q-{|}lyMciռ.|Hxs+jXhICP=F;HZ~@D1t KgBWBFX'Ѯ!ӵ z: X~(I :ZU*x7GcE]9mi\z9 ,UXh&ӦzhTgxϲ~@r S150qsKjl_KF dކAU~M }zHGM: ҵq C)RHI3μv.8uj*BM?F LhgLcVg]V1dW)BiӮUCժЬ0iCm.!)`42TIy‘?LoR.mDSIdN=~Wʽ_Gh'-]H M$7 ]0."n,[ G"9l+4`a+}˗.elˎ @2!7ee,YCg${4B.T$Nl\+~>l?s/=]DY9 T=Z*K$ ֕-kqL34[ƾ눼o\dUXk7br8w>aۖb.V|Z6:)MKU1;:g=[7UŕֱrIVӲfΗNq5v mٽNdNXj)=DˊM1+XbVaÖ96?B `(@평˱ 6d;.Րun,N~q=߂]͵8ӈ3 K4zű|'{]ߺB$RI%$$y&eךm/~S91'%*`1f# Gn,؈Do?%cow^$YnGceONCd 1=ZKN gRpoQ|+bR}   @IAFzB""'6O6Q!\T+BG4.!! ! ! !$RФG$$$ y&d|? f$$$KR 3b5 IDAT!y.I~"LǏE(xRv.=5s8W"N}7/;%+ɹ0W~1Y_ZMSRSm۶N5?}z'*i0=7>У4O(]QVM0Jr$R/ij%)䌎 '0 H98wB(ԬRR<Ȟ\Y9-%+O1ID $S*^6в2ֳV5,A 5+ёٲuwE^QSysu_t>;G?o &)o-%! ! !E Ϥ Y4;z` 0 PSvNc1yqe_sd ׇft~y.ʸ57}Nb6;u4w|$ j,Iչ}ٽ+ a98=x{azĜq(Æb` ?Od>/OXAՓ~YH;:)h,~\<3d@"f,{#sztҬ6Eؒ]c ^u.ty01J5"rJzd?&ͻ˾p.Spp OhrP.(Z?{JlhYE(PkSAY`AP:^eݬ1 3Yi 7Ss˧ZӿWoF1uRކɒA3[.0=]?A7YЫ' 6FkB1}/ʠѳXqkG?b)Nзgwp噣cs*W;^xc|X3z*n>cƌC>g>[L7dGΒV^HA^#gR 3\"%+gT_KosCuIlBq݋ʕiӭuH],+|n.Lֈj3kBz41 wcb:JFm)1i&_2+]ˈIE]㚘5 2+/a(kaҡ/KEiȂzDʌ>̨g`&9GMLꧤ@mTVKWf9[ЬhaDJ?Erţ5f]Ip I$JOMC$:s #Ďumx(k ?PgeMfKG&u2\koN=}c92!-Y#oՌFke} ~)h\l8{clEEu=d&+̌ զj㴼PkL؈Xa}wA\~+cٵL\wK,RbEнOnҧ b]=m{RDRk{WUmZ?h8'. {mƆw1jJU=xFb1 vm]Iߖ42^b,itA.>[ HgCqSx/vF[l_ G&bM&cl睯;V~ (ZL-ʔa="k;֛:E1oYxqiMk`D'O8=IͅM*^(k1>OCY-EdMQ&zѯ^: Td\]#mNkIRd bͦȋG)'!0FqBKp`X3"X36LFU5.ݾ/L*ͪ)>jj$vxYC$ݓB@"YHH>L WVm;Z'[KiiUyuwW09pՌ4N+x.A *,{!^,ה6ᚐyR{z1'}?@wV `LrnMt4iO(։:&]8z|O\0Mz.?KA)H436:F뢮D"%8{ sEɆ}gr>K;ǴŬu.RX13MHB@;\ ۋ3e?b/lvO\qlZY˓)<;Lgx߀ R_F дtA*(`PCRkqn"eJ{N^s:[TN<S*;YZev^>$"2V)6sc.D B}ذpUU&uj G0mN~ "~9ٗO]Bҳ {-oBΛ2:Ʋ5SEfs0KŢjQ4m{O')ֽ(Z8xJEBkH"%Փ|')(Lv仴9=ZMչ)~} ڵk'ɴMVt5K︴tU9tYLnOyI JGrE8>ԛՃ|z TQ05.?)Ԟ*Tۋ[Ӳ@ vl&oҪ^[^q%>vR^}Bk4l܌:nݺ+f}fo@DN12S3աq?LXT;MD\1Nr&/lh*}/Iy1Da<;@Y6\nWmtZ'Hf)>#{F(QIwntm}-M3\}RA Z0ev"_`BWKcDq4q:U;<(Lka1bp?zwjE=m,ZrGIAemN ~l)Hi}^`_M-\?O/v"MDݚo݌z K=Tfש5gT4Ě9v톜kŴIs2ILR!N"!HkIHH?L CEN "|5Bq-U HLW N1KN“Qz͉ɍ} zf~DvdwȾ!9)6[;r=,r WA^V\vyʇ̾LDQY:>=# i2FQ-6jd$谕)8ERlTk,_x'N|h)zjEi;Pޒw|${TLpVA|;Ha80~/3͇Numޢs]-M&$5['WPre6<-_3܃W='4*2mծldcVg?']E_+{N3#\7uq3EOmIc1ڑ>/|%p4HXF SWEќX3ǮjRG9pҁ8E[_ \H ҥ "MuPQǐEq90fMc ~Di֪l7f$'qQ,.paqCYVcf()ƴyS%h_E\JFFh ۆl9zO7BM_200aɦ\uv]̝37W{>fLz(qyM [3 qS22ā0pt.$YΟb?=I&f:hTX4:@IO?˻X"pu!ldYETۊˣ.pIyȌ16GzG []b`j "`Ca:$/"С5Ԕ~3ϟ˾i!{Huys`w8υQgɡ31ވUnN2kg]zZT2$6 S, ó[hQKV݇r;Ql%:YkdyWOY<*5Y]FD(؈ԃ rA+$16#XhL~ mM0=EԣX_JUV sظPa7 bl%v3#j90_kgSO:zvk`ز|x B[]mtvڴbd"&2*[PPv_^.нU '{BB d!!KHH.RL$:۹1U{ ŠY,`GksaMz(U,UAٻz:VǼ15 `.{wg@Ju9z5 iޡ}>QVFG[C+N\p+^0Ws*VR~zhjj%"]!+ 7kV}DxFϏCtXĄcihkQװ5pzk6)տwyG?Eb$sj|ʖ.E6j.y4T(Y ._AݛA8zMi`b(R4Ĕ&q3DqC([7 $;LEgh k@&&3VA8:^C5uejT̂ZFM;g(E3m5 3Y_x˫hYSm*t!! H $$$G87=}˥`$'w7{B4.&_O<ijݓJgTRkEnyxgMIjJP Qr "Bp}{xh@əsIjc1Wb\2gIxr LdcaVbD KVMdV[s2ezzz?GH?YE&||2\xxʣ%%Z$rDL.^ \? $F)ܲ'f{!D뭏' |M ͪQ92gwYwH;0#&Kr[fYԦX|x+֓X3o 12Dt?¢VH]M1$獏{Q2o+8@>nb<|eab<{V@|}4o܈R1ٚdkFGFd} e%D"(9{MrdT`;?_!߄D M)EB@B@BcL 4Y7=ٲ|:eEч=.\V]9mCkO.lؔ{e9W/cdcZ;$RwI%$$/y&wȒyA@"yAMzFB@B@B  1Os$R?I   Ri 2!5z L%> ;?vZZ4`'Ta_d.k$e(a͋Ve)" 6)^)9s#)K&q1AfCy R bXC~ 3n#1"f|&:25En|24O5l=3D>B,ݾ*rS,_B՝iFQ.?@hE 7D/H_#ݔGH,ept{;r9l'p%}Fz"޽#grQU-G/*A\?r9="OcLèT՜\`lOJ^Я?vRk߃@X3+ax=Jwi?y&Q/GHdJn(m,X60ʮ?RN?"oѳE=**B(QV 9\a> Y=r>UZ KGi &җR@J(Cie]zGpw0V,]b%+z6Yfeӛ'#^1rg)ֽrbe kjrY3]NSf7rS]+@R*ڵ;a{ϳ1=d@Cs]HDL|v[~틇Qq#:ҐJUo=Ef۷/ުZhWաIkMZDPTNKzT#@RE:pk6Gyu}mJ5iQ 6RW[5mC7[I4ey~^ iךuRUAMC~gtNMٵv*+S}L/R1(?t2ŤZԫ@[m'.Γ.Qu e45t11IuuV-wd5CSjM4kZqGAy =MJ554k5 ܴPII#ٷ:G܌+jb5HƵW5x<Ѡ# e!:52}4#嫋,ԣ>:yy(qq*WBcB i 26 {Ӧ ꡤI&*ȑɢ/(o߁JT"-{ 0VlKٲEȩby1J%c<^cIZᬞܗhWj5kp\PVNJbEQWF9l$μj1[qʴQ}I\qfEOJ^5ѪA-jkQ7P*ZhL d1JѵhOQ)[_ V[E/ ܰGX4jFĀ b١b9&>]i_ѮkF-oh9 D(ONbE2nLn1W+3lA$iFB5o#Kf1vILi\q8HBRGIʘ,6*utlwlgڄ1sܖ>=- ?ﷸ=I*t={d'$2_KW=M YCEj=y֒ٻq:v Y߲[ )0*2@[tcmF DN^ݹȤشc߼q3oˡ+{q5tLZfQΜ<ȚxNN )O˸t ^͒KHl %`vY& P$ tPZJhs8Ğ-+~{RUkL5 C"@La r:z*OѥX=ڇ'K+ϐӿ>Ya:fq)nL^z#wb.z( IDAT}4״` e+3pR&HyY]䲏'd?cXYǿ][ PPAB[;nNT  $a~w ϳ03Os9s-E\Ot6 YЭuyK!dchdM,rlN;L+7`$v/EӶz뙍41-]]?2!˗bʪ'JBCϱ2,N@6B-yT*cHxgDh~eroTKV /hFoMbf"W̪3Gٻfy2ESYkR"jHDZ\q'2io8 qngbzT46=^&y!gߑrJ7xq kFOHFݓkcXĆ)2/ )o Eo&1 1{bߦ(3k_&R57ۗqnπCwnG'ryS\}˴s0_so!Ο91m˒[xɌȔ˟P|mt\ȹ;);3d}¯I:jV߫U(a?Q[cNӵ.&oK%]܇KaprIUS.?6 v, UFvT}r7첃rE j(TMODő( q{w z3)Yk,/wnE8>xѡ3?'RĶ߽qWK}gݹ[Bvm ux1E3gK'@ )T43]AKhQ"WВttaAx]c[6t#:ByYa2f/u&_ ܅l',\1u_DizN OBLNǡE tiI}Oxb;E۰a<Phv\$+ )PkH]S1+a{ JeYJUmCp?:W3f˲Y6;v55걏U\xm0kLF{… s၏:P$QPP.R?C:ڳRȜ. 7k/xa4J1ʒ,h-J\1귗`! OvҾJ1}ٍ52w FpE&#S:r.H&3v$C|,[yW+#OŽydecR? )(775: ]^0O.#xq紊H NjGwP@&fD8JKG{"7yz3qգ3rd|Hڞk߹'X߄Ŋ:I{s} 8M9iJ2yR6b+;Fг j@繇yQ` @13⪱J8}t:2`zn3֢&ǕK0YkT?·"֕#8[K#::U'2ҡfL ;Vce6U.ʟ7&QFM 4@zR^=ExT4^/(hwҲnw;ZۘBzyB n9A\lyiwRU_HAh=Xmr;jɁƙ3H/!Ǵ`j5)x*ۥ=K07p`ƹ4Rp!K!5v!f-oQtʲeXd ,`Ѳ]\!zIA{^Rb=-*edR{1}oS5:BhՄ挖T ҬDF%B ^ǖ8U @M &M\M hHϘ69V\ `2_Tu W ~D LYs}1|hpX,4`kLhДqROC VލK#|'1)uLsPٵK9yK^xb/_.c_ c_79?hc ,B ;q'LM 3DC nkHAiXx+@QiCA@A@A"21h->$f,Xѧ^jG)87\{ĐlVM,9pc$P JO!?Xg's! u}Kbb nqEqUN5SFֺGre?/&y 5}$Pd/_GԬ$I۴n.BJI;A=@ ~b4㎖XIA549)|{Ec)>`_6C>ù_C [B-lDkS1)Hk>16C&[ vWWbHٚK0˿Ajw6X+Tݻ Ys$})}ta}w i?)?ң #S^)Lɚ!Km& OtɒŗdQՎHƎՙ=*6uKflPbe\]WrХdL)R0?}F!"1㻠3 YrT4,AԻFSk tè\9qO2Ld_sRwH_%]F1 !,>X2Tºa'&;MK[ 1w}ōuy ހԂaIIXL6vY'kh>*5$SvF_χ(oޢCYM֥.}#NAX>DHƕ;g.VvʊRij`l֔]s*UKѐWl]>l)p\u =6ԭ{zl(of+X4{ 2`4cIA:z#}qX"5?sHP~fY/L[^k@B:z{dZ8->8wg %@3Lq;&5>Ե\&*cIȪ.}N,_1C+^ԌmTmǔ?6U9\]DⴝA,²TAJo )7WVPPg.R?CtaѾݴaIEs9|3:}4T̔72²XN'1՚Bv~UDpyu˻Ԍ:fAFv~49usFRDW¢Z=j6G='`VvU*˳Ul[E[-ֈǰ`$) w3֘YP#l-+M}N xwNԤ[ʶ:|"UQŽnXZ6r=OSXomn š +wH$MɺtWN!ĵIJ 5fԲ O&VNILJJ+wm<ۧXҾ9\Τ@omN}{z1bӘ~܇Z;r4ez_ LdaTP7ܒ U-*a5ɔӦ% zǯȀ۱m4m6CGH˛lӊVjDb!Y*,JsNe?j,BV[/:/}{ ao^o> nCTHVkTt6 k]Zi۹ ɤ`Td 4V7]hS km}UvTo<}8'3f dTƒ&uoP~y4w\TNN\{($Xz'lf)nkΖ 3ψ[ ɬtp8n"I6.>:v )O ͤ 9JɎZ]u^#B%Pi6D㾋xޑ|b3s8ye zhĄPuDע<I;gޓϿ/G"͛v`T c7\C==sFt5ӍoR߂74oMyDA@A@AAIxY&dmE[۾j8T3ülIo%%t;ڹKh'!.{׳hvB?rʾ+R#oʨ&b>xS޿qu`Wl%g-{~,Fz1+6}Ӟ~ ,\λ TJK    )Pրϋ7ed    C@!CE9 s cQ((((X@A@A@A_CIA^-JC8-Pg0ʕnʻO$VcZ:%My:ЄHm[L/UR)clc7RQO݈ b״[jbP~qۚ;8W6/?-ո/~*8w%l$Mm_םP ϛ=}=]ˇ^)"wRSpPIRO "ͤ o'3"K3znIjؒjפVIaYkr;YM񭘗)UvZZ6;ٳe㡷'~K#koCÃpINhaxtrdN٭([cIUIq 1i0MvN 4kgTfq|F 2xp.9O|}nSJ0YؕMɋEϯH% j/]QL]9OޅO!WXҫUzjN |f}𐀷/ٿjV˱n`B)Z*/^=z s΂zP!% 5[jt6lN2e[PQPH7e   _78!Ջ0l]N!}\) u[|]&b_)'kG]0 (]0' fWVt~ -Q =26&98wl k.ʋH?"/Crat546H)U\5 En1B֢(\M S(gF6]-'WIx:W'7rJnj._ɖσmT-TNK:25%3 jLk~v^ }ԫxM-lrS#;͝$ JS+Wš'ЧX{uZ IDAT3zN'<*mglx%u >:M\;7FUsEGTn9R3n?͑,b8s6IQ˟cא"iYvMɨ|R9PH9ʨ|;)?D ׹5oڐaRX y! ̨k!7?^a)uY%~yc(CxbZ0p] )xxtz噶GJN /4)/jc`Xs;\Z*<%иB?:98F6.n@(_>&8zA+(ccZowPL!ʤEjmBSTo] k>=m x^C}&-ٚ|^ņEV ` Gi,_ 0*:p68#>T@fg)'LUGPpi,ǽC ֞ )KP7UR4sA5u:ҍ̝>¹0s:bBӣ\1.K^ f"[n!H|L,U *h^&sfzDyVAA@!?T)*((e4-CI n5iPBupaJJO)\E"{ W ~I_XGGtj_fH>IGZD)LyDBبIm> \O,i)Jڴ姐^#F}q}d[%=Ģ,[dYm)dr4迂'i}jR,yu$zj-٫W"s{UA/nGstXȫwxy0_6j,$BG7w:/~2l4BR EҌ[e>ٓɭS˜ 8{\ƨhZ^ܢYi["M )XԜ1=EuRhQU^3I+jϩTKX ,KqI;_=>: ;bbmi sΫEDԇ"B1wml[!sI) ^]JӈH=C-r->h2%<ũƵzWՍ2 )X/50_j5Bt{9)GPb6FѴ7ϼxV=sa~pNb,1ޜ>iY)~lRcϟ"!ͤ I9l>:dTM~S :C9}jqѡ0'_Ay)c`H5acJ},K{i`nAiЦUqaUO*0P厖SA'vq1XMdյd ţSP(@&DwZ~"d>nL\@_ #㚬>xAՒBf4i[(N+V!Gn}\ղkԘnmC[ E!2ԟQٰ:weڔ.n54|p)dRKorcb~XU>zBpzFG;߫hd?c_] ]?v2:iiL%녀C]k?"wٺv s/"Vcċwصf!OcƂ5l=pk kc)LNhӱjz[d"yj"˞rM(Jf-"2Zc.so\‚qw!2ל޹x𹵏93WqZSpNkg5m^h0|R =CpO2zUdD/dnJ@[nKl0kA!?=@/߼o6ӇmokxJD~~DbB/\os=-H俭M{s#ٯ]Ƚ?\?^yGٯ)gae|  |)HiȐE$$cݓ+*6`Em}i5LLP8 aahAB=y05ET޲mqG^}E,ZS '^Ө ',b:II˛:͒}ĄΙDə5FV|f*E #]ɶr}kJgԧݬR*>8M<(QwǞ|ٷ^Xb=T9T%H,[/ث;6m{[J+$oI _cu[^d3Ώ} )I~O}T\١"<470/rfU֤~ )yV7'61C+j[&ǯЯX:iZ܂iSN7f-^}ܹ+isyzcҩC:ȫˈ-RfFf{6ӵSg&޵֚ǂcߣ;G`E 2%Gb;fJ}{ҭ#zeG|,mуç3_4PqeK]9NL܋=2kE#6җ9G0j@ozʈiKCyaBKGzORӼGk֎ճֹ=3`L0vFX̱ӫ/"48첊Z`XZ,ѤE+:v^b!؃!}{ѳMYu'Ҷ7Hg Bis'ecµHLJ&tnee#ҡFA'%GLoGˆ?E^s33FgA8N^Yi 1ѥ^!z*]o.;s.9K(:]^wt~Z7l]5;m ƜΩu8=Q!ztcOGMX7o,=;4X*cF{Yke-Q ./fX1H!3eC }"UsRe3l*WeWz?>;2|`o9vG1,XoIWym+{LdN;/=dM{k U}٣&^2jJBS꣈+ǘ:f6ylMM\3zh)b( O?)1,(Zo )ߞe  ?7L n,oPJ/@ɞ'/rןWP[?YHBd˘%[(`^wҼji2?)P%E1}20hLtQ839sR,vy>d>5}.>۸)֕27w.\O,1o6ԜIܾ~m( _sD-+ڻ)2eFVZͮ#g5Ǽcl^9%0i<_;H{KY/Uh.-JnAȔm..mިSت8}tsfbu"j-Fr ҟVz]t_[r*fLL]Hi͓05z3qh:t.:}aRT*ewάٰW%WRB'7T4mPR Ь6#aX\_~. mhج5+4w>EdW P0{&雰i~l9d~E΃)]5`D1*҈%my6dxKʗ4[hߐE>uѵ 2c"գ@6젙W3:gH:4odŲB Ԁ*[V򌂀7>ʮ̠G[wpJ ȸdP( |/Q2d΋{|RŃ)Wrל^\2c$£iЂ_~Iuqy5]z8/C%?<{[nVMqgrg5=wS)M%80w '4ȇQJۖLhL9t(~s`x' N-jqC/=O0xup0a͑)]6h3| u us90]Q&dID,q1Ԯ\b&%H%>щq؜JVM\XV4| -I%8{*굹E|\:4 [#1k23C'!Z#3)')(A<:l;u(//Htt4Lj'1u`[rdN[:p[H]Ij! ؖhJ Ç]@JY~tr%oE%5 d{'.k]*F؏Ǻf=Ittظx͸<[N%@\p I_Id(XonotġpN?Đ.4.)\<4ՐOejEvY˦R$WF:!ցD\ilV s^FR)kJ\H5kϫ]1RڛPP*$r`1y2c"bB,IA@<`^4ُ7 )HC +((||3)@1>Thztk Hoͧϻ^i(hBv4t2UB"ʥ*5 oR޵-9[9rÓoCOU~s$kOjKAXK9 >F32$[TߜpQ6.@{*h(Q*VN %.WUHҠƬ4ǡ|JՒY&5+UˉU Z,iJb lFx}]TC^W"(م>Sv].PD;l يY,1 W |fJ3,LL#Iљ M.nXLOC?"pU%Qf@BEU,EY>L{@uiu/6G؅qS]E}̟؈l^4V+AYz.ʪVCzߴdX 3|xFanך IX:r6-' װ5< ~uyozr,+ׂQTO.Epm-mI)$sn۰5LiUsv-yܿͱk>+eTHAd)  ]A@A@AC#/ƪpzJ']<)Ȯ )>o03Peq-f%R0Mc)݇IA|)z/B&888PNjժI0Ń|"W|Qb8or4;}ĚC}ìTY7NT*لu_%@@^zӨL=f͠n ]qw(ZT1rjq3Y[eҾ65@,.dռ>&ԗi.wB`vZRЇBLN.Nak<ަ Tw$߸E|JJJ܆AԨ\5Ӯ󤥁)k@őC1(V%w|Ӗk)XY4bש%D^@ڌ\B@p0 Pv KLAŢO(aERmSȰ_=)] ;/_jRl(1bnJ)B Ԫ=i@̖/Rsw2 OP4[`ވ1EUM9ux-IsiIqI_` ɸ+Oh;ƭ.:p7);)}=IR[^2>@{S ږBmZtuK6eHA' )h9k5)1gq޵ڀKvVm)")c@;;&+ ޴7ΊeRv*3O\7+ d`m#g\2pҥMlsV2iK˟czro!# m}#S&KF% IDAT l:t^I# ˜6h'nilqIy:xaa9$(4q`Tٖm+M'ϱ}>{V?'d"a(((|"NOtY)iݘ3v^IIZ*w:VBR۽3L3iSp糠ߔ#FoOΒlqGR`N)e\I*d{թ=ӧ8Z80n>gÔ˚Y>$FNJV&+̥+W8g;3frC#%@o7Hs?I6f.DA VIl} w4|Jz'% .u-}kRP׀w8ܛJΟX gmU)΀M9gdޖ"{0ۖF'Vv`i˄M\}=k&c[cg )W>|u,ģC}(Rq>w`J+XE_-,s*SR͘"#]v8f/Wz$hμxY2LJ&SA'g87LNIU}3!{Nł){(Σ$L:M"'IԦn>ƖT"c_CrZY`fnim!4fjnN-lb$')P!T MM1CQ wZLX2YS7tF.!bLdS:+]8~ )YfR>R FSw-%::q{H>3>7RWO_?oHy(> ~/5ܼwWYV .Yv#ncq DMdvu/ZQIJףI=><=5c𻷸'4R+YO׾ZiHJd97ejTj<wD^y삯@v='Q EDdyMXō湇Xk}pK6\y/Ԗ*g̖f*DiqQWU_{FQiK@.lA%l1QQRRinY}B0׽g֬}5BBPQ߇Sm|Day0+!t}XT(-Db| -19o%((1ϚzM b©C_ cXS @RB,CC<#gGfj";"]^7I,b }.^x f, LbbĂ#?+/^"Ea1der.71PAG% + Uɯ|$8L|[)R>Kp[3],dq|і=P %#:"v;#3 Y*/(%E{pzC_#b*#'+aBC悢>/}4nB0cef5QA#UM2AsSFR~WN}ȵcccs |(\?s>߶۠YӦЦ9׭FUp*$jEap0>QxS߫ʼnqaP)!_ Myk4n{ z똫 Uߵ )hH`"& u9~XM0_E.ML{yC' ~\(`Nb`e]a2d2>7߀Wl[PP)o7N0W7?VP_Tq 888(8QGu7X?Na5ccckD21113D_g._AQSùûdbd|[N<8GQn(NX_\y^N ;Fy/7Tg#IߏQԡ/(]#p櫗2T>~wqkPY(U*^U/Br-6ˬ;Wl>Rp|̟O? #Ƴ^=U(ka 2J-jarK'b[Lm,9_yrC*bV|qIa #%aWK~e%i8u4 a+qm?<Z8pa5Hyoz4(l8tkX{-ujYZw,WPTfz؊#v:8uz([߽?Emaﰭ٩gs!23PTXɟgOr5a ?TIbڝ_3Ғݣ$ǻE[O51H{>Qu=%.}8:o.+ /)^ O7'ʖ dzn_"O#R{b_YׯKnKT2mIEax4hS: IzV4oTg=/"*ʢ;m؀-[pٙ@q888o|S"٦WlG=hƃlҗ }cHQA{%%KSڠqHⳗmPk !ͭ#CJh@W嵠a<q-w%bo/. PTG׾F`v!Gbh?(G_gM*1)a?žPF>a(--BcTaǢI 'zbI  $r=0oaTP`b[CG2qgVZD1=ѝ_uDJ0߼yy&pgGVh! Cp?BMEE1G-9(AQڶo)"tSCk@AV :=}VK2bQ 6&,dڠe ԨYvЦM;Hkt'obqjJ P6^߉Hl%p;=;BuQn#jӖd`e'lD{8Ίxh-/ (6+!ռ)d a-3P׼@ vۄҭLjԮRњڦm< I[Ay9G.j1n' b >2RcA"vf8D :ZLqr\oR0es Ra6T&^`xw@J| 1= $HvD:8s((/+ۥFVj 2Qc5[7HPdqtSne}(hvFfM0o5oǺQ9a6)맙d9e,?WeQgbæͰʊ;ۛȘ11aEAiqBAZk0ٮ#&/#UZ(uF|}[CdМ& D[cNzx%0W=e㗯bL4N}(~>:h? WvzS=6%j0wbGa/$Jذw_Q8%GedF{ދ,ĻPW1*QU.zL/(wxXԇ޸L~A<\ [7vnxV,ѡ@8 3ip7Fi Cf(U=Z)걢<:$lHKDρ#|vxsK~vzaC➙wo^Ņ&teM[h2Q'vSVFp˛&jPR}\ b^ ;8+ѱD DM٭i-n{m2fsR'0D+쾃a26!p=e]q򶧰?CQ WNYck-WlcnNu6ڵdKO@m̰Xld?,tsȔD|Ф`1NHpd@tT0" kaUԷ e݁))x ѫd 2WUop~ւJ){ޢ7-(G+B~䰳OH& bcQa>7&oJpep?8:1~2Wۥ ;C>K>L Z!ˬn'<Ķ:(7ע:tTDO]%"Ӱ297M@0J(Y} _| ɤ='4lG. ǽX`ld,^!Fo$ FrIMh?# hM_L\ҪfF6Y/.]1`ND|ܘ/DݖhF7gy%̊]e\ӊvj+4c8hNoxԭj;\BFuI2(;Dx8MÍ=1do>Z ٶp/3p J8|)Z<͏YjWhZdEAEi2lAVo0޼} 1x<SIl K^8Q'2F?90k)1/FCp)H, WQ(0ו'ßGB]+c`Νa`o<2_3&4N ̳Vebm^l&QNN2=elBQ0fE'Þ$ d'FԩsV;TΈCY)/)(âiQp/h6\_Cs/Icǎزe qk]!$I`~9L&;a|kȣlDWu(mK c=XQ@Edml, ?Qb䊣}$#g!<5? QPW 9{!g]Z-w#&yoy&ZAF%Q0o4蠃W28v W) E&"Q-fǢ֒(`vpsͯA@eRVŅ-<- &%';sw$ CU8/f@ pditE)AQQm78k2q<\J{}sbeXcr@$ NNf/t%ZbٖsKQ#!TC)co{q,vQ4)psFfp坂 $:b644{ʣyJ P㝂+6CAٶ'DA$ YzĽD y(&QLeWJEPHWAkw @cvJb9׏ Sw) 7XxWQ0 IDAT,|ȟifu@*Q=L`?ƑkX|02͠d pY^KEi1Ǥ xRү' ~>r p p |-_- J)QZ!sp`jÞ|.,F hFml#FQ;h(` 9*aMԷoG&8 ISL\p:>YZrb:jcmq+ (?죄ƭ:⚛W5yTZEs{͆Ds kN3S,`P0]Q~R>z*T  '^'zKI 4a2Fݟ^ EٵJ5?83UC!0G/p9:4kq}iA.qo#mNEcYX;]7wD&c؃ñsVhYOh3)R<:3á }) yYX?A %bUĤ_?ZѼ}'\w\ 0".(ca0dccо9q& T,6 M>F[`Ҙ\o\$'ԯd~')>PV["b8f͇ E}?NԅyZj&c)2$:P@giر ܼCئF變P2 XpHcʝT2|lIV]ӐX_$G6t^tԪU}'.۲g+J rq"{y y{r'%0բ,u4 D}u ƣ ,^2*&P#{BKt{E0{$ P^}T5^) meE(u~w8S}zAV&Do} UfqOϼ8V,:Qn ybMƋ#;>M'>ˎPQBg-jy :WVp8GC D<;C z!y&zh+ Trm# SH$~ě7/~e4T; w#sqOLE ޥq\*AQƔ(lNH4SM: K!N+a\ V*pޒRovՠ)b( jLap)\%?; sM`8>CQ]1w4~_]an&u.3B{p۷\888I| }e%xPL﯋F-Q-~|at=EEC9%b($鵓5v!('} ж-*6*&9Qd觭> wT~^=siIPk'knZeJ ;ʊsx(+-".6VVTH "yM@2(y9Q ucccO?< ͛CLѶF̷J>Aw6K_seI~&X^&qz3m1U쮻yث ^.6kqX̝4 N]`HCm³D&!ὡۺ fSopz .T[,rw97f৉8n݄MvspDDJWEa6;< /AO\!uӦ82i.E9v8blݶ޴H r[ž|d2!]Vm(C111=I{6+cccc`\?_^< {ozjUD3.ogrq0ڵpc }%xϼgp s*p{UDA)^0PEKmSrq+%iCbt(=q}<~JRp_JI^ƒ=pw>^|BU>MAcqS {g 9$³^> 0_x<ChdH1d=f_/ۣ'/E0;- ~8ˌ +o [ҘzY2Lj % Q] '}wc&U/W!~~|'q.Cc'$:mwVFJC"㝩GYCɣ4.I bSX@o#=erw\1(a*&̍ѹ{Uj:Kia -дEXiL޹"J;({111P=Z\Z 5|3QQiY2tܾRKJHaӶLws:v}@MRf5Г᯿jA~Ў*CeEoppJlf нZ_CpsG+CSjצ{%Z&.\DfW0f&/@PtS7I/1YÁ1Qo^{Yp޴}~00CqWi9vKwS{/ 2#!=[RH/,fɖ)nohkcx-3vH ݦg2 #Faxpg1110բ 7#F-j(FYU!ڍuB]V&[`bo ]0D( B ELZlJ׈` }2qAl_-Ն| ,MzpdWaFL3 /\g<(x Ͷ !%9wj 逺ub yf¹ԯjAph{$%6 ΜT0RŪmX!=-qJn|Te$0b&x> 3/?A~A6룝R<(6*,]$\>/ R_pdD`ϱ">N"Q Q#W; KH>:[=fAy Xr³ \o S mw4 l0/ۈKH@Gk hZǣ 'Y R(2 BGa^3C0&/"]6R^"\MӖt(hFN]F')YEw5f8pf7fՂ 2m?S F_Xo$8TZМoLwXOgot>CCar&E1ֽа"- ?woRmk!AmqV\ÁNxW/0"F߈W6?{iTmrqp<X=`4#hG.<u=:E Ãؼ9QrF<ż&P`O'sqAU3&縶yekVǞ !6sBZ=8)=y. )y1(#M ~+Ґ0 5w:8Q;cccjQP^ՃeШO &JM u22s!4&6lݴ 5F=IռW\/MG=(^WJZ M@^CqpjZ֯ H̯Z*V3ى7CDAt`vGGnsYQpdth)z[#E(ygcq8n ꃶMa-+t (cGBVg.DfUB X"QhM ȷŹlᵟ]1ah- fc(qQ/?QOц܊LtbftvAK|q =o3J30޸1fВ@KYu2%kc#$D!(`? W $r*$lli"O'xx2 tudV{އfc 9#1s]&Gv$.ndk?{M BRĈὴ!3`GaOf}cxd~v }=6Uc,Fġ?sq&1shHY [&Qf @~< "^Rj?v0k%JnKE'2A's5tR-H*`DkB3%bV]nDGH#UW$G}Le/s!|{ ouFFψGgbp;fdC_۴t\:Zuĉk^6MIٙZr}+X>P5\' rjCIfV Бn "([l2hӾy?oOw>X7L-Vh̨C"zP?0[?3c|д&@{B3]\n*8z$>֘iA~|\;C$+ hAI*JbUrXYmDJN,bd|^6;p(ٓ}11113|q 1`j7g/@1,;d9DHMMC9y\ f5ч,_d΢{YX9 Հ(fIQFNeݖA$CX%8sj.–42yzsssCN4)/MieŁM7&j+\)߮#O<-4f5xZyCW1@]-t7H,ή )plV)Kwދ&^6ϬD8A(Ʉ\ޥ.RU|BΌΆ?"##ga ԢRX>J RGMrDBy8@)#CS5Ѫ2HxT}lr>&)( ;w Q5*bwړDoM07dT,3s{QÈ)BQϊGoq 4o 'g*$ H4SUE0O5Fž!ϟ܆>'~zYo W`: ݊ВJ SBlRWX~CLgrX &wjTW ͪqalwhQy޾L(_P!xʅ;n RvPDycQ'9to` JʠL (+њDi!r+W‚|fENAվ/1 L”nRj-[`jCxz6j{^ÄYWBAT&lGbb:&xC!6 )h\+q;$ a/"E\`̑yyMq"8cͺP4 g eEu\V'"84AO\1{ f1:g#5E&-I9Kl1 AVq ~ IDATS@fTHyY v`疆"@f|#)_qc>[{L"hB<\>F-y$IG.:φanH >jE`p%QP}؉`&f-^HX= d (( x {&s#! .~r"$oy 숞2XwĕDA)RoP5ȑ(=ؠMKO{C77S:+9d3/&kƍZPoprTo HX LiAYv]1*3Ou`(Hw3"$?^Ң|0_2oF;UA9o)w@ H'V`8p$w]tÌ]uVFukFG">1Pg/z)de`P97Ia!=A/m cpZ\` ޘ"Acw`\ F0WP]H Cxܷ;3e?Y\74]mv5o)teWdc|Ro _/6$3"IdpS7tQ)xue$4EǑPV QZ-~MAfo؈L0ș& 47u(r 4Ec@IU'[FM!_-FCF,& iSIc3:3Y8otkI̵ڀ3&M´K({\뱑"Il&:MPk]2Y<_(Tm1ẓ(F0h2dCtD܁Ync'NGhS#`A}D;"G|e8F]F,'QD]=F^3gȡ!-Oi i½jXGHVÎ75&B!/}][}57Kփ$EyCw)ϱv0iزp4L Bۦe !k) cg1<:ѩ,V.EgM  (m(ʄ]ێ_v6К0H\=gw &YU@U6FyV4[M-Z@Q;v'1=ۼƽlOLbǞ%#hCC+,+az}njdzS3IM u騏SDPP$&fAR~1'̘}t:CUF #4v2KEB3ѱ2zb%b yFN3fL1Q8/ #Ѥ *D^C=1^ MD׿IYCwu]hNtb78wWp G cҭ;FV ]d~ ]__0o)^g!8iJCvN}(MDzGg=hK-~@ AFz] 2쇐&{p2M+FB v[-U;iu9˜#gJ ݶ +-V`jlغUBykM|=Nf-\ @Fq]c%ꏅzxӊ#Жb*وͻ!0"Vl.SZ\7c尤L: 6+sF݈!s"Q{XmA@,U(zλaVq#6PTQ Tn=Mă!..'Q`(߈|/Fm\u.f% Lnۗ :us$w13SdE3y+azo [vYxx7+=tgD|6 XlZ{` ֬[/DM}XokM,{Y;Ĕ ki|ָΎ >zNk0 %.#H[xže;bݥ?wڊ\s)> "P%꿨N|](1KѪ&PtjDq~ 9>Ft ϣ)b|LRB$w@VR<~e1D绾ْTx>FTdl߷_4d,31O}!3 k(C111- p[ )Q|L$Ħ?Wbֹ622Q.t05kwb߉H_NAD+&Eyꋸ(ū!n||)E,;'^C`!2Vn2ELyA4AI'Tz0G<{PD0‚̬oKOuqNpcccQaPE![c"cF7UtkI/f &T) ?zh@o/n(03n{#|[UIw(D'~_|~!e.vXxEڪ~`&[[P? ]8 k O?D2i }]G|cRUeEP^\3wr(:޸888~~(~6 0{ZJ_r>G( w|;qP'gXP G_CΔ|'oQPRgig i+C ~2yXh<QXW .]}Gg&`jrvo%$<}8$XON|+.$ rߥ]fK1|\CYX&&lSL={aEi%s6 qf,1ğ;KX!%Z4wV,ʅ0Z8I E_+]5os?~ۏeZJݹE*O\Dw]xد+6h0} ^Lgmr4;`KXo[~y-p2$c,=}V "lX@ϒ'N4Lܽq g-VT[&*+~'nnE'>ƓǤńxR03 ,6Um9%kcά,G/\}bǂzDaXjV,2bKa( G4kXg(FJL`,;s(C:k&W&aۑ,#&L$ceNQJf+Oa(YU]nBsb.-ʂ8;.`nQ*Bsiu=w({mw8t7.yp;*>žjXzJ{(HBfj\> dq;c03ڳ떍G'宰?¶ϣ$O).t㠧6K#ǔZhJKcpO=;0L-XއJՖ@di*+p`jH簑2?w\œ\9WOCymX툽(ڛ'z`ZuP XaeͰdQ{a€.8t$zlv6ie͛c1KyDJZ=>H˓u_ħiNqn{a4 6Dly^)$} f`1IƪѺ.Q#çP#_(H*)tf"e+2]G,CppS8*0Έ2ډ 񔽼Ek AO+gvYNDs))7uIHr3"pj6_6::uaAki0d8Gu,Qy@Euw'I7Uc& Ec$VbIK4FSƆ7J^D^v{-y8޹3ٻgf)Mzwh@ɘ:X`yfMA3\LVh )xT^u`b^R #=yE⏭` ̻ӯ 8HAe=zo,V)] ߰mVް_YgWJO=,)f0]ļR/Aa=/BY+BHfȇeLGN^>J\Iv,<&x3#~8DdeP s}"cP@z4NX}7di}|)誂36!0S&>Tս[@+tіt_pԂAa4Rwaׇe&3+eN}&O 5X 0 桴EiGr\0E#F.;T,=V9-;,he 'ǭFW,w.gv(ME:?,41hB!/CBexLA)_oJGob.,G܅~]14mh󐚜saFW.?k\Z}ymFjX`hi뜎_l@dt,ivKX13YR0#>z9άBIʭ*KJ)>yBHDb.ڪtE˃~R:AOHwGQ$.+ib o͇7Kb|pkL(䯤06-鮡]lN`cSqx7/+| oj )ܲWPObtk9ڑfb^-SPX\ʩ9C TT[K8H=56<'Vva6 F8 %~ )x>)+ f^N3`%zvGr)q` ~@c2}hκU˵J:VZB`X)Ir oPezyi qw6-0cAuށCUm ̟V3W"<&))qxCUԎUPɵҕӬ?+@۶j037,,Pr BdtB)  -(?0 tLkDS@FI^6O}ڽ]wᝏ;` LA}43 CV[YYkN[?vtR)c@wЇӈ-ղUQ+WCY0o*SpX9షuR:ş)N?4D_⼎a`r:GQOʦ@1|HSP-]k24HWxCa >FX9ɑF0#-`n>SEx^16-wɌ՘3<hby,>gF*08%vʦ Uc=:Z߾}aanغ*+ kh))5 Hs};( {+=X/9[#/zMl ̇Tʧltw F !Aᩘ hٝ>! oFȖ8t0ƭ|:6⬧bvxiA#ʩ٭0f[J2 xc, D'@" 333|N(w/b jo0d f~j~ ?CYb7"NI ,nߏ(K;60d %S)xӞ6pQ(>50:wJy1S Ezyg$+O)dEO;m2[űd )XzEXЇd$wj.8{[4( 1UÇ*qi|hx7J ?ȇ0O;!S"S^R0_wgTs'G`UN'=SswD"VDfy s L bgb,+'BVۜPIqRhpe̊ T=Mqj%AVV/ ٹRv=HRଓ#) ~**A`XVUMcp>[yzB] L7R+ )(/-c}9Mc3r(1n^ Ga%ztlY?9UNV;am/PYQM=żgFb9^44Bd{"<")_ 4"':Z ޺ bo% ОZ׫c cac S8av$fI3sy>ɷ1{0hr횸ܤcƸVc`h>{GTOl^w̜ ޾~;m+dֈ g1zF졩)("wÐJky j0-pNҔWR {]#&/X7O܏ z;{\vav8|X[VB'4Fl ৬+ f )xHƿδGZ),Chvq[ia2r-SY{2>2mL!UEL&N:`p+|J-={8܍V:Dz_#m7B?NnxHӊ@#26¨mj4a- D 9#lzȤ&M44A[0\10CO={XdhrS"~0#K:9 йk78uLCQ*hS!Y)pnн;e_JJM' ]1JԽ7|!cʼ= 1n%mmàَ<&쮞FR_MAs\FVh )-d& ( bPTh\Z,Gx?(X KB@܎L9qfjO?Gt|RMK`4<^'tխ/p))?YyV&Huni V#N()!8.J!xL%G!MeSEGNHz7 iY5Ivx|? !awKk FGye#,$4M++ >2@"^[յ'ZK0OM~ʿD^Ĝ_$a!@=(84$N䓚C.eK̤O#T>@LUҩlD#$(Aw+T硲SH >S:%rxUBVs *+Kxk|n F:m~UMA`XM6[!h?wq*?Ok;/bAw|r* )jlބO][ ؔسa>!/QSu[C}LXIrDc,yw }̺cW,݂y'X#8gO&EVl &P8L>[(f`f1 |<=hAz`=pETZk2>{qY9 =$uIl ϯf 03 0?'_y!n^<c訩}--MtV5a&D1(}m﹝0͇!+(@ZJ2n_kPW 5(P ۠+,)I&uێvz$g5ԈHNgS_Kڳ3 03P!X tl{ibp򃇇mpv܇iY0Iw/ [w;];d Wh & ˗uѱ ~|"8a3f" $%)h |}05߬f`ffn-֤cHʧ3EY8cT۶'/RTz>)?Q)HgE07Lf p D~N~gMj4` c 13 03ФL*&&]0cQ$)/)6tjϐ) w\%Ypܵ=t.:0k!FIքj50/''Ph\,vBEEzX8$2hSK{an1z5:Sj4ǯxҰ > 8:OE 1yhG q'6rY&Sf⧕K1ĺ7>n_ */<s~hӦnwDz&~5:6nTߒ`30˖`I讣 J Ӱ4-]tŠ+?!=6l 03 038xZeJ=t1tRq:sgSػq9, PxCQmitAq-V}1:VP0Ųhh-ĞZNj&dS}J1fpxb{3q$>@II ј2',hlZ1 F'v4 研< k~ҒnDj:QI<6--[){DS@5TkSQ ?mͷ2)E=&jr_9oܪ 03 0@Pd Kk􀚺:t18v900v@3r_ C#-|ǽbLÁ&rG5蠡qJ;BkPY+7bÆزe36l܀/xkX~=n݊~]0~sf]q8X/fk*l)(̋Ӗ011EoJ5f"RkUe 62`f`&yǓ((` b5p+Μˮ 2q<*HBݩ=>5$UF\ف>5t8 ;S]p*O.NO(C& %pY7 >~-^ Tm  ‰C1?,\ `n0馁7!E>멅O %'%I O1%i&O|e]쥇Q 7ȖEBz~~?MMh}sp+3 03д8D*2 BOb6,+LU*lBp,Pű~Gѯ&oH3~>@_zE{nu3s)-蕌;6a)xFt`I["''[Y~).kG b®cViw){@@5/hMMi$afh (LP'Svf#![~-LJ{XLDoh u#;ϡrhlz8qYSڮ&]|@Xڝ g CnB۟좋 -_*Ҝ 0K+KĆS *ri6h >|@ >ț,ΟV~}h$8-MMeMoѹ*nݏТf^۠ޡ=1I 5҉M63 03 49.8J-UqLaw 1}ᳺ[n/4;I>Ùˠީ- 0iWdccԜUNNyhM3L%وG!5.ڠM{X FgwMۜ}hO)>A] Nv4QZax4Stg-@vգ7NC_O -[כ"7/)Sz ^Р̂,] ]07C#.#1+g amH^ A "\'[Wf`fh \8s䋛yL߯݊XW_1'# ?#/?fB{8"30ldVDl[C}iX7!t tRL8~]:?W(*BSvcaj&fb\xާ}ۿ,)7wcD| yd i Yx_NY?[;u!)t>+!cݸ E9-$)hroVMf׈3 03cTy*T)sKhOLl~ee(+G(--AY)Ek -5iPſ>+M؇VG*T+4zKr@Gqʧ0]i9Jh}9` )GO/-.לK44Q}).J:w"` EӤOu  r=u@͏emf`ZS psےgl `f`f1| 4|'Ym qb}}(En. W& 4@/m5a-X f`kW+B*LPDx(n5 =7\BC|^9SA)yy6df`p\JPQZÖWӠN&@ ڄWۡB^n4_3 0@f@zt9w' ԒZn)`YxH N;!AG)ɉ}?i)/GJb5\x+#pOAܼo|33  -BfG^聽p>wB!)PyTp:y~y=9 9Ğ 'l P ?3 03 S B%9'; HO{-7l99T 2` p>6l 03 03 4s4s;Q~-C3 03 4?)f`f`ff4|͙f`f>Tz!kIENDB`fotocx/images/batch-report-meta.png0000664000175000017500000007461215247006660016333 0ustar micomicoPNG  IHDR2ttEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 154 340 1 0 ǡ!:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:340 height:154|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:306 height:139|#P IDATx}u\U8sϱD E;[PQQDB;s=osw؛s9|5_DDDĔuuu?|w ĵ|Dy}@kk+ui<W'0555Bee%wըCV?kwی?zym>?J> lᖖG^^ KJJP^^HEEvQQkf0}ydm{Y; 6Fd &>6F< a xzj o!>3@+l (-DxP||QTw18/ƮAPX >a/&:>Hx '1IK=ÀW@N&1󹟬όvVϧ3b̛8 ;y_<;%=Tb>6(&|b 2LR@a`/mI_ʟ @?ĺ=ǞJo,hAWG օ]ˏ_ّ:WWW@lX st󘶶SO鈬XWE3zD> `h< g9H->q 1)b;6g _ZSAUNRR2=Vb\K(CMNFm?GwjkpI̚2#M 4l$Y) 3W}l؇ځǸO\05q=ٝOTϕ/jBj?M})1س__ ]}Iee`2  )iYkBFFR~ӘC^hEհC~&BHXcl@lm#k`,!!!ihAUU9YYKHdl|՟8  Q>á5CtnZNtD!..qmlvOSue6V @@}gFg>BcM(Xa0uǮ&G_5b\}}g cƂh_u%''#..+--g6>;mgggsmfddgݟa}K477hI`Rg$!59O`hHC|5UHELt4銊Fl\<2shgY䠛p4S16@*\^b$!.6ꈢb[Tod IEX' IHLLDBR2rPmZ^<M+bޮ krXh()BBV_Dqm@fz bxj'3;U]߅yHgrI&uXUQJIce*W,$&se:. Y0p} (Hr!#22I)()P=hkkCG D|q  u;C}=@j:ލG  j4_v NsWIfk`b(@Ic8ZbQXVt7F?oر1.riɝXd e]klw Di}+JEu&и2RWgg6a<5R@(GKtlKQ]YLj/' 3'-OxX?W*cX_mYXX@BBxV%((իW ϑʘl\fxg``>%%_KKje+nLB\3_-jTyP%{<d54!/-aؐA$5d($d`a hhFZ[jB!MMM1?akXPR1fD?~/F ʪ8 Q0mEH+jq.DeLd@6\BXx.ŕ$ՐzPR6 5h 5L y)qD!+4(kI`o9I^!C:v#@.O/,cH($<4 +'WU;́aUy!>IFE ӦBOUP؄k!!C0t(iaCH.k*@QQ~ 8(1X4u42>$m"%cxvދKg s<} kǏ? dL2b6x;=Jcjj*֬Yeee8p+sa+V 7~@&.&sVȕ{u]a>4 V[ZQ@OSMüA" q+c4L##S}A /l$a8ff*WCqZǂ+0{x(ƳQRۓ$$B(ɶV]0$yE],;FZw`iQ17lH"0oShA֕a±f-^젫Aa1uX457 dG@T\ 0ic H/^e&NIH,>pE]@c`i`nnNkƹ:AYA m1a:T d|{IS s'CY G1w^le1Q[MqOt46r4M0V4 bH}%3f¼i62VWP܈`g QaэƼ p D@7#> ј0FF IE:{"LESamm1 ,ؼx21f̘yBKYBR8H-z콐 d} K"O}2X{n;,^pvvFBB heV[ vx3qIгkyh{MH _ ig* 3qZS%)aD& 44ye\dSYqiBC~ %hmLTT6"(W1-5@6BFΞS.ɉ1:u8 -%8utTk턻Q9HNvXgh֗Il6 8r9@4`L3Gi3#6p#,յ%\DD$1n<'BȾd&4O$ZT a8v ``?|piN/06vGv]ndmpOFRb4B}u ëS"0F4ו"?Chөt?lf emZs eqr+4eĠm=ADBluԻ6\x#,"T*dGIPP5]_SdjzSqe GH5q/"0%e(zcCAQ6#ϼ~LH_sUɗ0 ̀rrr AO?qac>_ դX|{Ƀ`ge%5ؚ݈wh&+5:m[g3m 5L؈Huʣp?ʛ[9oCC .LQz5=*n K`uỹ(A|Ud-q@FF~CCCbv=}#XǞNv(_2$&Z:`p޹ ρTMpזv-JdU,!)FՋb`&4ʘ T! Hm&v̼~5TA.^"3M휃;Ӽ^ H]Y>Dhv86tEkM!*&k (g6;@M:3f3v܁-kJ[Rz&JjLIwbZUgp^lߺ#nYO"$ v/8D`Jدٮ!iB<`kv,5)@5 *1cchi oo /8;݅ms,{W]c =z̙SŅ(;F">\sבQ] 3`)e{Q;okNi)HKPL Ȯ}˥`@i#S6_5p0;tH}P5B_{j[kR!), D6"܄fFdư]OS*k4a $Heg#þ(}/2zH=r:υ2uL\vV] Z+K$VZAa:7&%9M}XӅevGh:\ wPP;<9hi߉W%X7իW4`J;HašBxxn p4W$eЖ܎;mw DqV ͵1ym<}8 Xe1]R[]2.b./%n%EE A;xpȁc>d_#tHd~(AB!G+21I2ʏ3/ށ7o@t : 4h0ϼ伖~XjM>E-bZx_cR#U yҐ pPn@fh:䍽+AMNl_fbb03k挃 4FzUiUIn8~ƕ9=6g^HHnlATS WHN@ .ԥ;ȪEKs=<4HJVx)oCzr\VN$&:GIHKO ΩRAU~(IBFN ɉĈTKdϰz1e F%#5>VQDVS 3[aF1RXz}q5ܝg@b,%TR-5a5}K c IR[L=}>/0a@6P[3]OVVi3{g; c,84 *j:7Kv~!f oZ$ E1HDe EyYQ싘&He*Kڹ)hSUl[?3BSC =CFD /&Ʌg(=K(\`0v2Q[E3F/-$VGWBG^Ϙṡb8‚4d&.";_^ʳ`7ZBS Q@`~0Q%E75UyDEXk**Cl?3=8$Bc$ B..'/h lE~i760GB@QRƜ, bs|zTA]d0~(YHm Oc%|y`' Nu():\DHfV*[CCN~NیFV>&S&R[ :J)C#B#[L2ˣ[2a -f}lA/0@bm,IVj'dX+JWϸ`Xa 80Gjc@-Z<}2cz(?e80錵am$ }L6>V"R7dkgvSd?}8@s-0IȷSkϾ_{3kSW@Ʒy>gbޮ'~d| | 3ğk@2>y灿ܟll>yGCDGG?| ׯt>y>Ay>gb$JRj@2>y>goq%;>d|yMt_C=c؀֖&jo/R?~O__3$hok_"W@@HGXp C@gOcOzU[+2R菢{,Gvo݄0i S18y9^@^"yLon`;}>@+I}I1X`.2}=VY;WPwC6xF\ub\X߷Fo675yv mCknkyj*2{-FAg5X 'Gޭ !Y,,r iaNv v@QJWUcL&19UL< Qfss\M$%>aO1y6!W zr2Ҙh=|@FROs Pm3h`ۯ 6#p=.616lۇ7ϫ AKVkn:04 . | ڹ9}ƦF*]͍$Uqà;v`,w"س-d( =WYQNz*SQVzj{adDp6*Օ=]`P-(hhD v}9,䰔SjkyD3'KLu5TsUQZ.鐁i#1{=î;t+În҄|+ū4ju1^cλ!d8n%Ү{3TSC FBQuF1/t5;Cs?gmuUWy6^uqf4(Rt1DPϫ8Vo_sR1I>;9,U1e3;桡۸2F7݆ƺ%3UY,dpy8ڿ-_ cu5U4 )XJtJ^,BT@uI 1 CPPSAlCyf$dY hcm|&IHBdUysTWNeNACQ!@ }$o ++ ]S ܍HAZ]4B'Bxd3b,@5ݙQޢ<.F/+XW`D0SJ^ 4"!Əև!($mS!sܾgv>ٌ"rdݘ1M+]"\ eKJL@ZZJ+Q kC\=XjJ`Ȫ~<{,CTZ.#:Ǝ60 ːVLYZYQظxde .Ac#&E5x/- Uxr 51lbt,A4 Y\:z`(=8^¼QTyIbCI""RWP  ϜB/0-:Bf>|j+BڑY(`IP;OHN1 8}{qExv~%ϝA^Dvf6F_wt*}}Cܿw Yxys/dEp'oh(2ۉv?5y)hs7#l[1 }[AR}{tw,$ +yj]`Buh5 Qb2[NL I/`fl%5mH'V L5l;)򺖸Ob%-1l>v$h[+BJYI%] IHNƵKsvTټ6Cf`莛/Dq'\cH-&@h gXN7;2YBAM7BBsڑ IQ݇7κl>̕| E!7$0ؾx8V\bdEyJ6E|Yir4<ӉKp}v?9FBV xCki4LWm\r ?@̋I_ Ո ’y3a 1QanPGΠ/]F9@nv]Du+]ZM<+aHb[ixg4ulFIjצk?iu>䄠?a!2xu&&bg$2+9:VӐYv/_l {>Z*۽  ˠaӇh%n"I/ġq`~4yD6<ͱ0U0#GrX!* n4 M.E(_-"-1>kF0aBg#!1 d Y)٬YjC޵`c î}}8L}=k#&Ԫb>xx(u1f"Vo p3UTu—ő9@ k oE`ѐ5/?b, 6L1ձPI+34y-Ȋ (mg&qB]a"7=){7ςHt@Cu16O2f Wqvh8AB7㻞 l>ɝ[q~H K-1.`&-cنw<|8HZʰn=a;{!6܇g. $6 -àH ϱњ:R^{u=m{)ϭ%4f-^..]X6~zy.\i IIkM`@akg(X7v,0vFu7WsI=_ ?|H-!%;w1h%##R[ʢ.@SאQ'wc8'r{cNl۾wT&Y`'@n'" Ta]l۶?DNN2 'sw iaAN"cj{ƌΓdT9$:,6$Y]ir@ xB@6 ش}'vӃc7_F<ƙS'w̴5I o dnpq%LbEdL^}k!a и .H %q;%,2 RRoݎo"6?4TQSK9/ڌ&d[Ȕ?Ȝc^;v`].M6@O[\FR~޶!48ɣ!#lI/^l^9&Z0%{Rdj޵AAL:Vر۶m&{d'kȮ]dSaزeKs >N0 ̳TͻZ|0o 쌭hr Gc3 e&,ٍW72p 8u)?Ȟ<2UW#3#5,F@O_O@֌`kPVź#QDFyy3LR]y:lY:JIm4k^V=@ Xho)B*3HP $bt. L$ 9xG wOk)HZ\Y^ D:(x@RJujp5,<96jI/c*$ exũM5eѴXbh<~Sbź-Od8a\_wܷb_ͦ>'kgAb&XJvx`[YXBhId[L%B0e ƪVЖR2Gp,jW͢˳mȘ{`Gjjnء ?9F[c5ҢBU S棨tH:W[!'%] Ci $UԢբL1mdZz^? gtz׶z< RUKF㣲p,N^s.<`liD4"j`8n6Ȥ-~7!>17rSc-b#SfŮp9޷T)=`R?PM! u[q<{ƂSV\21kDFDL: q1ډxիpcqBO@L`MYW_];p KwD[](\/C-un3wIhG`2y6"׈+QU18txlY.@rf(vnZUE$mPE[k!^;c<[w:ZhAkJ1N_V9F`<[H`ٞc(3صoc+Rυĭxv"ñj;A8::%:ȶBa\.Bc 8 䅋Q:d5ȱg@ycV5oc4FZ`ω ~w=c8${mM5{|FHM':bؠAjv15kha!>ڹe#R۩ 8~`+HHLŕ!!4mB-m<x0} ^{3m ,/<eכwcŒep}F>K2xt$ *hcG8w;V݂NcՕ;[p;V_r.j u(( wp)q9A1[w9\<% AT<_f'u+F3w+6x6Oجyc XPPRCWqx m B"bcH. aUĦQ҇Jҵs0OGnsjo1_RׂbgDkk3)I^ZBC?YH 3c1m޲*H enXhA*k%rBj.$;>1QAm~2739i_dĽy  Uĥ0sF䲸>2 RłicihM 0z`XN]/ qrIwh2Wty%E-*:oi@( e>58ʂSY8C}g.k;E;=~Yx}['?!Yohk) } Cc'NgMY{ cʉL$_v S{NL'|s/pc"QVRDǀizᇴwAwF2zI=>L˿X2GJLd8gd^H|_C`fy`jfhP (1~0dZ{v/K<@@g'ɀO˿FJ@> Ȫ*),\' $dePRB}<#qYqQ"ÂKWŮبppi2YMqa> LDGG#<2,;{8>E2_o/:\7X?FZ:(."ʗHh>}?ǟ \|+ȼ=Ndjbt#9g],o%XJ{v Gey)_{<x_ {J@ƎyC pݪ2Uɾw\UeJ IDATVP]Ω\V[YV*vÄPlq%ׯ(M IqV[^ 6`ˁc\vi85)aFSnnCILVK"!-1ɨ is4)֪erZ~LXT30P曏(u؟O DJr76lq!1J=GKTSB½p%^ĥKpSd$[C꘹}/ι5w$wv4Jsp:h<S]$&EJS*4ntƋ@!>)]pxܸ]ںr+p#z_GPD\X Oϻ4x 0>7nnns 9]irScp5ƅm\>"g#wXiKI]/D[\ 凩2 w&W=.@\>\|4M暛ѓ'qC]}bpn=USkSRp{PhGN-cunfll]UW իyrJƫqF|HW?CBTQ+ 0=*ͱH$jý1B BҊzk1HY-e$l/?;q$' V04єFܻ|Ji33f΀FZMgȣ@ppe˰`RSBӾ(͊Pƣ-0D*jpڼiEN1@{<,Y.pܖW'˻H1~t͘EKWUܸzZ47aoa;σ8 zP7ؙsbjL7 p|l_Je; VPV ǧݻ7𹲏2Dְ GG]FaJ̛'/8[_^ ,9r01QPVRJT\XQeN {zU8[[̡fL2&? x.ƌDqRHJ|q̙fsKKh)ALFw}lG-؏5̭1@jzp>Z<;$BQ(9ԧqa#/@OOm'aCce8'(le搟)c !*) 0w|,eUYN QL4ŝ- _=] bXMb)WdSr0O؏՘q6CgW^'Og%p`juXp ᑒCbw{3GP:.p/#i{[-NnA(wӹkET/ YJgEII +" 8܊[A1gUDf/qԴwUo&Ͻs{wWWZ핺*:.E;p/@4@& W %^9ܾe#9 bϸM#l1H&)ƨc1gn=F#0A6Vcgo#0,QX`m e3gdE%d{&'$etӮb>()6 y$D d$6;ĩSرk6nތ!v *hTpaBS"⟓G@v%&x>5PA1s5.&3-Yś E+A}הs,1H<#hol?ǽߑV,k‰ g?4(JqIbY12b8,=zy$H-ݒ?(xI{,9z~o> nqM4a.k0o$(f:X} JMYG[Q{λ0`Z;zQ'U)&Js8=5l q[&Xk=shW6AYi$cȀ0_%rH Τ b2ERT0 VBʧZ=? da =G-gIP)Sz4 l=QEQ/cncVVq„D;r_z%AmalB>HJ$  +/Ŝ9TfxQh'c&MdY(IcrmK3op~^µ5w- tԡcW$\Xm΀FG ]l^~,'Qr>;vy~n.WSɇ:v͍}?Դ/ e"Av荆{v*cÌw2^W|5p1V:͵8Ӂv,$T f,Ǔ8vW{z'̇6" K$wH#3<9TR~W e䳔"nhQm!lC?ա8sÃsZ֙LNm2! ˀ5KͿNzݛlȞGL*j&Dؠ1q 4oHfDl?tTJ[ q"i mBՙ2PǠs8\v]mRJI ̽A 䟸"PYݶ׶Lx\HtE(C17cƌѣ5:2>AUcsu}z:SRf$(ODFA,LkAaT Tej0=Y%b sD~6F$yûa)\uChX(_\ !srL#7^]@4_ѓ|8q->ZciRoK/JGp8Bv}e@FZZJ`X^*2֗zS2:8@܀[Gq7g=ozr0pf8CLI/2EdIzi.v! @WVH[9g$&-]>5տ-%Y-Cnq dB7]0jahD@c`]OV*# 2n2gs}" f6 Ҷqjh! K-fN$XjgxI꫐t  s2~}Qɇb3W+MB#ONQ,M0d R&g| 7iq$_i0@2wr<<<ڀz)R˹h&HVjW|b ?p%2jӰr~"3Ʒ"ȉ7EmӓK4F.}ɾ,7G)Dsv;2D ΒtE4ˢi~Aѫw[y'r xEZ$ӢM[% *DrxvAr!5d݁P/٤q*zZR'ޚxڃqSJcSG{D$(9Z0YEI )3d>4 &0"5x Ļa(?p/8'DKSC1̴Cd P#ʼhgִir SH Ȗh&e{ #Rfr0950snUq*1xVŒNe~*v+W)S3i- 0P{ Rt{cJ1D&kh>5J*vn'TĶ\_qK nmռ$4L)|yꏂ?iD.I&?Wt>^Iw}R)Fq <rEp};$FUjVxS)/HjZtȂ4Lk^-jKiD/:9rp[`UAc~?@KY%idqqy6n윁~zXII;vrֲۤ۾~ aVAQ;8ǧ[T/",jie KsOoޘ0g%\,M~}b4dQK _F_aDXaFܾug觢~ClN;Bsd WZpwJojX}2`2 ,lDinwx@&ZKUIП'ϝ;a3ulB MW2Ҁ.5,=`Ϊ-(hUsc(>Up&߳+D[QҲրxϳU係i4d>N VM!j<w8ԩXr)F pHo&@LiPd8O!i=7{w|"ZсW0UH'8Ɔ:,1`I?dSB]yhw8cb{hk—좪\޻Դl'2 *"4"z+ ]h)6:̆b^G/%Fgg_&6O)Ln?UUgL(v5W7!}.Z۷W|[!Ls7"/Y d~zUk0?K҄. T7?c "K dQKi+MO q2lq".7EQQAY&NZJ0>O±)yv Eg#t(E-:BnkDc?%ҹΝصQ6BI;a9c6eC01`# FƵs3޹/2'dbӓr^ ^ 033#xt(]$t%Ħ7nd9VaN7эVOJ+aū)) JWc"RLƓ섋7o-2wG B]Vp *+-&Xrq9Cƞ 3 7Sg-yU4+ixQڒBv:LgxFHrbz%x} 6iNn6|,L{0m6>6=T}nHo__s.v8+>W-x3_S̤gr%+NK`<„4&)MY055uoQ"+P%;ǑI~L4mGL4GMXW{·0eDcM;X3|E)N/KlQicܽ&֌z!yݻym6DcnA(%5!kP@,tߪ.J(l/ߋWƭ0/bZbMuӬ,9^NÎmd ~ +wyyLi+֭_s( !U(;W/dr#\b]y&ڀ 99sҚl\?ӧp48q JjI&W"[~ŭ_u4R$q/F1\=ӭNZ)ظb &YZkɬ rK;2߿ϙd#h%2sS&a3G+eK^ duKR)2)l='#N>K )fuko[I/:j U_]qxLN? dϟ q1\¾LEG@&e+Zݻaj z@QVV>"%%QI5>qJd鯁& H$R5-3VMKMAZ<> IDAT$9a|t'O#"<|rׁx)9cBu=zD_"88muoo/Z&;QQ/?wN 0G)#.yZ,f b8#;ϷO&^ |*I@3Ueٴ4u̽7ori\.a}>3۰$++OXr[3hg‚|@.d.=}JY"h?</xCq񏔁O%a]TD(WqʟRY^(G >VOlfL<% c\}_e%xG ^`ye?%%<%oZ2e2^M_khr<@/]^x ㅸ 1u5O3d<@@x!B75@d ty./EDXp<ûo熧oȶOdu=ޮ737.'/ThRG ~B9x"wb\ 7dM5fXMؿRaA cƮ:ݍ'O H'Y{䁌^8 ^D@JoXz5֮]իWq rO0*kdQB׍ؽu_~z =c͚5X~>T|zܝeDK5}r}y $bx_{9b ~@ m,۵_;JZx%C$9?dZJ5 y=I^70{x ?ǚ&-MMOD__c&n irx 㵯.}}ۀM@yoL9vi^ue/0r|9d<|',Gfz*RS^!-nCFLWh4_g'kZsR䑚v>*%hn(V?莳BPj AL׋B*[M~QvUEV#JB<;I#-m7̴棖&( Jx]S ŎO"D dUC@&k2Ⱥ!-9 , r,CLS`Tv]D\: 6!+كk1w!&SQ1j<зh2+hW0DdzoW,(=7 'n>AIe*+{2Z 5+hzI.} 'ߐktF>Ri_Y^|´dפG(S(J8'šr=@OEc٢t\;Mc AR* Ț77G3Q"LDC i-TWsb/}oL9vM?O21Q/Lt312*|xA5eT'ăD".!aԏ|;|(qHLICق:J)#é@u^j) Y(MYb^Drd4 *:EMioq<da@EQ2kdŠ`u_Xb":3,n+YvV:b b30+JzeZWְgdfgwIQa>AgM2Ⱥ,UVV++-)$ ۃY -c]L9>uαkVS]ά!_!߾<@A Xϟ=FH/賤n[`ǼV![L-y9vau=.}Oɣdfq~@Y<) ɹM1吏xLۆuE@E+ntNJ]+:to}kW2Ⱥ41!f`&e %VWUvRK}dib'7{:_dx@Yv^@d ty./E$y が2^ L˜&IENDB`fotocx/images/set-colors1.jpg0000664000175000017500000003330515247006660015156 0ustar micomicoJFIFHHnExifMM*V^(1fixHHgnome-screenshot02320100fotocx-24.30: Crop: width:365 height:156|fotocx-24.30: Sharpen: median diff 2 17 17|fotocx-24.30: Rescale: width:369 height:158|fotocx-26.6: Rescale: width:332 height:142| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 158 369 1 2 2 0 C     C   L" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?V4TE 0EPEPEPEPEPڹo|3-mJp __ V`yu_ G_|E_?ğZ@t.PGJ9hH:8ʲkf-Zic-Vs:?P7a_T=WNj֮-kK_g(l{RcR$UGRIQ>}oXiJ 7\@kYu7aڂiӉ$bCu_|:uO }nD=>Km8W=kEues 崣1o tqÃV0}+xƺ? xoW57,noW"Ǟ;R:#mX|(#8n ט~ h DX&?1"c-Wxo~Qkx~4|seL"207lh,hG5,VN;:X.AumbA{NN.XL+ؗZ߉qGq͢eZY|ܑ{g֯|x~+>GK.#̑ppsހ>,Q@% Cֵf-#Kxs_:U1!|*wxZGoi+s'9⏂<=YIMQ%ż)4goō ]c×/uaZ;Аzq}kS־ɳ_u!MkSTE#tV4<] ,a_RQK峚(`pW>|wCCz}w{ۓ{2nTr\qК&1u /|D׵ǧMdF3@OQEӭRբr.ʬqx/W,kGm-TJ$e@Z${AkL:ȡ9Ѽmܵz©v9\I ]m7 ϹRډ7<ի1H~lWN.͌grc-${5-c"%g%[_9ʣ}•cj}J_(Xڢ+k_W .6_J_(}‹+_W ?+kcjto]xW%H4]j5Rm̻BzJ_(}‹&kznx_.gcn=w L884t^n,|Cʋ .WJ_(}‹_5Ù%u ɩ`3ϥs~^ K46\eDĒHq]%v}Wk> EǖxQ׈ ?Y^_z8*yxw1j"uۏlw`}J_(X/=?V5YH%Uu;q^iD|_x~!]nRBhMz%v}Wk> E;_S&{u.$̬Ij2f|j5tˍRk+ZLa8 ЃvϵQ ]_+ I#A|9>&G p>yb<(@H'9R6;x>!~ajzs׾pe`HɯZ}J_(X=;=}fo5>7!YbF8 ?w{f6?0ӿ ?0ӿ wgȣ&1\0ӿ ?/ nv94xùaYCwld(xd}J?2 Ս>޷^hNܞ¼ߴmie(d..bgqr0`z7TBDіDW#$ HdP-񝼟p=M*\#Yf9 +H@ uwDGoE$U1әC=sҦX_YE߂^Cu7\POL4yi?L4yi?›'+]j=_EDR0[8@WgUf{w&w<4G&w<4]M48~u+hž)Ӽ/{m4kۈbB2sNۏiik"Kx~y,}bbRIkk&; ;OM2gsp,ץvy5|+פ q 0" t_ )Gw??`_E-F׫CifM&d ([np i!--cJ5;MB!_okhM',Hȯ߰ei92 O]ˌƠ|΋\4}K?كǾ<Q_ڑZJ2HaQ#|Y>W׈|hgw_hӴb{ɼ/s}ei KH-`$'X[E ZEe=F@41$ x>`HִhNR\>Ab$ H]O)4ً[&]GZ7ėRI{7=+<W؞Ud0][ i薈6,!\Cc(b_|x_X7W_Kmn@il#mG"F61ֻ%LJ5XC$i*($ްI+mWYc2Z,O} G|X~2jdo\q@}Ec{M{ \ iX:l"32A5]+ko ivI"9/(@ܒ)Wckݱ^  K[G֚WK;=Z;k!?XHW"=VMpVOU?_?OtտSs;^25k{=UHNp2JJqJcON}rOUJX+)VTG:TԊ (/cqrbq m!(}%xͯMxVH#{V0<ΙZheGXg0Gz+}ExHY?oOgrc̸ܙ#dtzg?j%<:!47ɷ p23Rގk~ hzӴ(# 3#\Gh#iwae$Td1@ssG4q:tO}q}Gj!grJYE !ztFAw{+K٭Z;`W#pF:ZÐ}*8H?!h%Q mk&TBxiƕQ~8.2:;_ៀ|L|WmcGIoM qtB}*M#??Myƨ}5^|.6Ki^gRIHW wcxwzg4;cGR/c[[Cсڅp5Uiڔ][3r4[Kcjx:;$ݼY}nJ iOM?CU I4.mɂrFzW|,V,kOLM MEd]>Q!#k\o/G:]'Pw<!_!˿qf_[bl[pb.l;qGz[&Pek8.JΈ6)%a~Շ~ xNKџ|)iń 8 rGb_ %蕫ĐDƋj0hՃc _ŝs$O FIXkOmoCX[Xhh:ɉ#NOGM~xr}9'nm_ፆ]tdy%=֪ZGFy<=v{mN4467w dGm,pā;Wi1Eq %lhL$tq*L|iV:R@WWxJ{ ?GE P8 *V_uq+W: G?$z bxKBH0Zyr>)=JZQEQEQEQEQEQEQEQEQEQEQEF0^TVA`v)^KxVe4/ ~o?b_ب?/ ~o?bxQeϤ?v_@~"kb˲H ??€%]E}>o?b˲H ??€%]}~"Ee>߱eϤ?J.أv_H*//.}!c(_[أ*//.}!c(_[G-?T_v_G]C~Sz/-3m)R㚇.}!c(˲H @K}~"Ee>߱eϤ?K}~"Ee>߱eϤ?K}~"Ee>߱eϤ?K}~"Ee>߱eϤ?K}~"Ee>߱eϤ?K}~"Ee>߱eϤ?K}~"Ee>߱eϤ?K}~"Ge>߱dϤ?I}~"Ge>߱V_@~"kQ *ˬُʲHؠ~"=%IWr:Ae>|SEkl5zG( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0upږ$ۛ3'̀\ ZY򸉭ΨÞ}BIмWynч×[$Pc8 ?,za.qwKs-}ҕ֠}(t.LEo7ީZղ蚚DӛK\rpF;Sx/SDķ bxE?zM ZxB^ G.d<;cݜNJdT6ç+([es$j{ {ՙ198͇+_9-3Wk>h58.[Ifa=ORވBL5ZU"][]:X;φTlnY,A|9|1Ihk:W%bI'5' 3O+]M(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O ݲGmqjm n'iϮkf>M}%Z(d=zhy9>㡯} 07TC /à#OQ<;8Ke'٢,~$Q!\xkbsx^(ܩ UrBOA]3ſa?´HF[+8- 105qt'wn݂~S:Y`K[_8AH^z*5 sa !xSoΕatEXtAuthorJakub Steiner/XtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/tEXtCreation Time2005-03-10R+utEXtSoftwarewww.inkscape.org<!tEXtSourcehttp://jimmac.musichall.czif^ pHYssXsXWfiTXtXML:com.adobe.xmp Jakub Steiner 0 400 400 eXIfMM*JR(iZHH0232,0100fotocx-25.1: Rescale: width:128 height:128|43 IDATxyxu/}`%@ @).&JHJ,˲'mzR{}N=fMݖcYD}Ipm {wc=,Jw?^U_sTupO='ܓ{rO='ܓ{rO='ܓ/v8˵@smmm^`]0N&&&!Ph,ߍ|!xQz=:::glܸF;pդkD5D"WӸqRRUVa۶mcLT%=!LD@_=='OR ǃ< L&fFp1==p CCC#eghy[pÆ ]JFW߸qc@vڵ뿥R˲,BPUU{ ]]]0y*}v~1)1 S|% :u 486̙3Meq v֭[ZV0022ׯcjjj… u֛w%cr gϞ5//;l6~?p̙3_~뭷.'II;J)ܰa)ka=Oɔjz9DX~DPz!✝p!իW1Nxo?Bmm***FH^W\x… uϖE~}}bA8fgg166vѣ>uX^Inݻr>@E݋'z 3rT )@KJ)#pFѣxd$ @ 'O̬rOJ::::ϵ=p8H<0.]ȅ ~֭[ wF---O۰a^Պ`0 LOO+W7 }>l>jh'GT.1QIӞ[I*s Kks:aڊuk;1p$BM&Ӗ֧?tS?2 MMMvb@!NcHסPh^\\+GlϞ=t:|;M&ݻw!V `oٯN%%Ka-*gV<!54[M`@ݎApEnll=2z/+O&ٳt:[W~t l0szz\YYc||Tj~ +ذaCs=횚}2o 7Lx<@xlt1D_Bq9]`hձcjPGIʱZж+>O{c:=9RQOtM04C:VFsS#n J*++߷zj$ҥK#HanEDprCCCGF(z0//zꍢ(bjj SSS7O4ͶG}6EdMK ӟFizS B__]c}I b@p O0oGߔ +Wij&N'81 FFF^d2j;ynAD`jj l ? Bb۷{ .a|>LMMyo  ƴךfCp8&`ԧ`w81wi \ʵ$v8F/|1PI 3 :::)ĉܹs'יft:%sAOo~HW @(H</DH,Wsd`G9J!r 8c0n(ڊFm^W 88w߱ZL&IPJ~#ȊWDj>5mPXSSS?(HNl:t{NQJ)o6QO0_GAAJMTdS'Ѱ K!RWދ#YRBdrݏ4,DVauCCæs0==߸q#Yf!fff tS+.~Iiٺun*>\x[7LCp8C }CS( В )oB$T꾅%IzHL Y(s@ǯ{ݠp<~СL&R/wdYZMMM`ݺuL&ȲD"d2zϵ̦Mt:? y6m/\BD 쨵D3J&[`Tm1Ɛ,!- IN ,ZKTMQHz<2$iI@U PG~޴ 6oTTT|v?166ΕR+,.~Iqᜧ$IʀAvWOiz_j&kIRȌAb !1˜Af9\l!kY?C];q;iqƍ_l9Yѐ5,˳T1 "DQtN{<^2_x8To_ Kf(lhZ0ms:nHId@N^`P""F#cHH∞: "g=y,u,t9y6IU璁q 9gD#O90Lؿ?~W"/!˲Es<G?L&Ӻ ea" `={Nt:mq&o܆t8Pp(`|t~׻\0V T'jl4=3;;{nrr1y$ @騪a2vHT1::1;z;jjzU"r&}w@)GPJ RPf>0a} L}&eY'Ttuuȑ#HJM@GG.S aM3ذ HR&|(f!8SF"b򑏨S PMm2" 9<5)#'iZN'dB0(K !>k'7—z ޸q&i,oMNl0 3QO5$…̓Ou:3>_GR Ӊz L&qV9y,ٳ(6n޼vR_X_@5Ann۸LH9xsMì/  2 vaŋs…WW|p1::z9R]] S>XMF4`vIҾ<կMlFfo{ ΓR`Lmf_rV+c=UV/ 'R\'M m7Z9@FX)8g8 qd2y7͓i)2;;eժUDQU :$'!by5:`z~rWąIҖa!,f Hڵkbbb⛱X,< J ^S,):h~v8>]c J3 #uBϟBˑ@ 0t%ӐauzpS^_ P{K% 8NTTdo/Aj:]vpR&w1^nDD@C{oL%?ZN>V"ׯ_j<0p1JCK |YU4!---(wt5岚5Rx`,KzT߇>9O>]s7̙3H&'x:aEJ~!E'*&L_r׀tӼ_6<O3\.B6jedPDKvF7$.$֭-eZugn" `0n, Ba@"8Bw+X,gJ5)&V@Hv2l0P pPZ˕<,C>'Ic E$ĄNWGW!uiL@rW]VSp?4l3ןJwD"HRpE[Y9l)RfPD;23w, d2UL!Zm%l,݋_{aϘr(wd*< dm2شpRK4X7\J3f!) -n:,[J P))EV.GZJI[ۊ6!dM`P[HY KMŲg-KYǠT(s)kÞdmk/nѨ6έGxIDATZh4P1)8`,G H9@,[%baʸ}x<+坔p|-X> 9|'6ˑr Pbi!v}t:u(#-EA ;Nʕxby-btX3"xS.Tj ȮFRɡt|L&Ų6%ViZw@[[l-T 0jXJ ;cj|$LN-ݗM!p,k^4Z[[3q^𼛽K|sEׯ^+,7w/ @4ddT_IJduuuuֽHߩB)֭{x<$k y2T}B"@ pcllLyãc3mAsNB`2tvvv-tvvvLV"[[[a]y5=fHsbמWP+j9WH(,W"I ;D+h3[_/+"?90@)7B]{`\[nAEEŲD+ [nfG?1GO@0:g~j/hAL@mY)`\)gD9v/k ]l(7>4 d*?v3T\xj?iEEEc9YTTT4J)y쇱#v"tT.v(duBJC3zH@k!LEMg!myeYѣG1==T*uٳ_.'OeX5B!߿_SBj[?~vX':Vv76>k}=<5Y,@U}}H$r%Jݕ~cJ)ݹsQJEQ3<f:BUu*cJ)8c`HgauWDrp{1W$I?^ijj}Ihcc#U_ik'Nx[$]KFwLXYYdss~Ji/ÜRJ7lCTSSIF͆_|Q$>t,&_%\[ 9F׏"3PSjkNnm0dJvzzz@nܸٲ+Xl)Ji$IرcG_H p77!m-jWރ#t6v,ƶv3BDqUmmv H&,l6׺uܷo9QWQJсO~o"9챷0@r| 4dp&`q$!=4o"58 r:|y_EYꫯbff$]$v J)X* O~#Iv(s^JLE6)8n]+,Ff38瘚Wiܾ}SN*{0=xꩧ@QsdD/*ɟD(67`<2075bOf… x뭷0<<L(bժUx衇}vC_>Rw!l)Uk kU"򛲜 gM 0|N@d$I8|0= #G4z޲g _Ѹe;+ <ݍbR:7-̤џ+ T5CnN= :(6=Յ! 3_CC`cϞ=صk&''ۋ>LLL #L47 nG]]ىZ.Ez<NCGiNSUR~rβI5\5nzjP`kV#L… P(fڵkpY߿? b Gf29UC3.bDPFA Ld#$#c7 ^z444СC$INAQ5LF;g2aDF?\^ܻ s 9}l^O%G3@rl "!D"AќsJVH-[tZezz8|0vAz_2ZB'8sDYB02߉$|n&s0];9ς@bd2s 0tdRR.I@44d Lf"h5@qYV##l73x8S/j= vb`42o Ӧ H^Sjo?7÷ `rjJl2!ivqitʼR!WS3IdD TMѵAf<(<-dોL)5^DPT?`߲qDItx

*SFb g Cn2pMRqtT!!-9yyAK ǯ#fUsӢfɤKzcm E)!Z Kn37hAAx05;9!<·P?YUJO3@A^2r"'Gxv.JFXM y:?GNA SN0xt}5%0nZDX}ft‘Uy6ZrBhߵ **n݄ )#) W%Z8/]ƐS.͢ A;eWˆVxUȸ)<$ ch8.Dށ4DX@XNr~pݷ00׬T{˟ͩtD!9ȳɈFv.A"1>Q-:: ȥu|kyYi9111d7L@B\ R33QWJ򑞚(20WcInf*ø"de".6'_4UŽW; ITto#0g\ȩ!GY5eQTIJ,OV K+ʧze)򓒢%' Ro"Hie} .W#th<)E /DFJ<QHIvk+uT}mXޔqpr|ߝ?-?8Ui\GjyGǪ;|8qmkF5zN;oq8@Ͼ-MWMJ'"KLחg:M@} ɉush;sW.#2߾M6j6~.oS'xyzr=MׯV`Z~0y޿|5|XG/0wQ8ZTC|_#0wvq_/H́:eC)qkfO ri8{Bq/1e-fcc{7)Є=m`p<7'jY1=+|ܵm|?,sz_BKSRBAfQY[ll F>Ū)еc{BJ}p{z}FnV 6/ 9 qhkA< kMz#-)༝5ĸP@/AxQ!~ 9ÇI<|ʗs2i=Ow:q ś$_a,+4dxuÉ,0ޡkq#hK!$ҭxi|LA7ym <)/_8;5d:[^Ȭ|=N?W8{dUY^"S(B$q]nEbf46 {Νm7n܀%n]//4ϟc S(`upqsá0TFo<~?6HދN.R5a\n\E0=@w[Z w%98c]ȓ􌵸q6lPԛAH[5|LanmJ2z#}IJiq'c)mjF ecBAɭ 0~ ̜=O#"qrH)/?3.6[䁗FߠZ+ƛ l[Av̌E1]uEh7>|xWL^{_JE| :f́l0Aϡ?.G1@]E1f%,C'٬r!}ّ`2m ɜ)hV S^#BOؒ+Z 3 \ͨ(8řbV|)A\O=2Rb[2`eMЇPX 0]$Ɯ>q"N2@pgBLZ$٭01xex&<pXĨb{bj?uȓ-wX0Aqrƒa@!O&1v& \%DrgvF &fa+!o?ò!l<2)j&2k.|]@7w1w.RnpZniy|J!j,Uˡ- #ۘ,;Ze@O??# Q-8h-9:M}t$!6Pc$J0lKK/ e=:9}d12ȓѝ1qX > #.nڃ)fA2 |+Fts*3!е_j;c# 0W|:}D;,X2s=;@w_|0.ER@yJ‚1fPTQT!=}|ü!# iq1LB~`,(JPP}(A>HOt(v>p/Bk *YaeJrE3a%H " Z;fWQ9w0k(Ew <;d -Ig{x>!etB~Iւ=W`G)LلTz%??P<*"~cU'Z!M0,PxctB#a̹(SCdZ7H_|LSZR9< <؅aHg_M8CBՌ,-^Q x! n֑V uF`IKkx,n6BPLvkh%xyr.Ui^>5c)>0<+'ZhsB+g_ >)5=m6/V"vo0Qc`byuiAAb-b M|)wG}k( -ֵH{jЭ>!4$FuAf nny1(ߛ!/)N]j "`3w#8: )d0iF:ܜ,'jE~2tZ3iD|Jpjt"9Ջ3nc`L\ WxZ|zf|kj5eQ/!=x`l큶_ "?'=RHú[x_nVt5no> AgM S{꿸ub#^B⠘N݋BL'EM[ܱ}{l;wb2RWM(^CE@@XiAð'9^X 5oV*Q ~fuYtجn[%c#ťhuH עTصg]o F~b>g\ eߐm" ATt /Fؓ CNJx&5tj|(Cb~Pbǟ21uNkW@}/DzbɻH!%.Nn:|3[*#m1:t Qbzq-,ԫ'71 > FcXj=G& u3S{%VnGx%0؛G6b)MX:?f v4U aϰu\,l/]͔h 6cMeZEƿ~bˑ#h1Yߊq''z1u|clC%NH\m+b9n!$6k˦(i$!:f|Spד-RͭYJ@[SE{,ւd\z^Fz 1l`oHJj`ܒ(,}j&Z/]Gw=jaҴЫ;%41e=? Sil/';KWXR_kOXbU6f V߁oփ&2>C l] .u;E='Zt>U $ ݓ%X;S-^fir1[Xco}|-YO[9Źmn8;nC_ݮ9]rǁ7M_U/>|mgN]|9 [+\|ɮ/u/^Cަ|/z\]_"g~>^sonW/\ 4yGx\̞n.8:p;ȆgNk.ء};xXd{\[mJ:v~&y&.LG[y27|Lfwp7"޸kMwu.r657mf?7w<}'w^58𵙍pGk#ڢ+ǁ_oޟ|y暣=-[l.2YN"Heak{aˆx&QąbյZIzQؐ˩<,˗/;qi@k]y &mxXN}9IW*2%pJ uۮS6jK *QS`Y0 %Ȫ^^Gef_w6A~ɗ`] OxK0klL5w@Dbz;,X4u2&OMCW\zRzVsd\̤,ۄ5ۏC־deE$y;|FXk= ,D||mQn^9$,\a;"]|ߕXh-einsh>u,Y8fNӱprVPuNH~;հ;fͥm}'Q͍OJ .Ăs~b'ȏ P-MS+L Ǒ%9p"\E!bFd)(~.)$o*A9:O@FeqrȉKthLcJoG^NADNO.TD~ dD0~o ȝRc fvy&_K`C2zPRVFG.20_ IZ/\:@PXZZb8O\EA;yŹ4 Aң[ *fKh-)$etCRL0v=ROQkv·P^}NR3Ц"042B#(IS@q awM Zeg@E2P!"E40mqUqi~2Nn zv'= D&)gD>IJ} ڹ#T`b***mL Z1'ϟ\X3IVg>ɫ*F/k;)(MĹ5mGUw_K@bE/̱9 uj -Nb I.0b TFjcزh4^r+|y\ UY\ c;wц |ptD~&( gxL 9= F8eUi++ߪ 85a^)u ^ߠ7-.KtwT1MacS*5P56/xe.[0H ю\+B5:mXIJ+NNGlsOIF\=̚`C?_L3*pP7{)#e"O@HNXzO0 -2OKj5>~KgH2' Azg{asy)/^Kb:hk}|")&WII2OȾjS~6|si~|%Qyr\"QAɩ|YnF"#(Ai bhR LtDx\E]">1馵|:D{aYOdD 1P28#HMSh||i קQ#g)p?J`N'6J8g/ť[wpea^bSy.ÞbD4(v߳<+ks02IA |AEZJZg 'bO)Jqzdv#i{Ac|^dU}N,B!jFy !g@YF %.A\GNHIHڎpF bb侥sYMi+bx χޤ|R O$+ey.vv~2G]M%3Cy.HSkHMEjW̙Xn94SW3Z >^hY)Swǿ&N|e'|:b b3 k~- IDAT`=/<bz;ꞵ|1P&M*`.G Kj? oCXT%bb0_vQiS«;X}mbEL , z͡eYػ S}T0xE,[ ."n⸙bt42_7 ^ ē{0bP>|>#U2"{ϭGȣIFBLAYyp#z12g~NOhʴ^8ZqϷF|BW1~FiKzO{bC]m# oB]C|X",%ZX':gPg>1F4ĒUɢXY>F/ݘ\<= ҃ |i_/?'\0~xpj)+%U-W;r$cQoU qXz4 sn>t!MbK@]9+W\_ſǨ՗Ua94.ax I[I`H-.'ynq&J sjCiV/Q53 u4r=?o:z߭#x9*Ɨs`恧,ѥCǦaAOP4uѽg_ Бe(gan Ӟ w{&ێKnvFy>P;;C`x$W86l]qlMl|G6·F/?@S+ylrٍ:}Kǰt8lE!MllJ>`%YI / ypy6W-ggvdbfdR:-\=Iqyb|))NP:V.a. 9) A<nr쑶_9 ^fS(`\;.vj,,6cܹcջCZީE6%ZfZUȏ|(.ȩv[DҐdoٍx!VWPVWΫS |nW@J+BW ;-bze|[93',m!&&o"Iqޒ.R4as  V!SD/TĊ3^9[[Fg7IS';FuTܺbR5j>^GW_X=w菭w_vj'x6l@ 9BŒh;}Fnf,v QY b0d²:N߉мʳ^v(ؕl|oN\4tc;_wv+'; Qɕ3ul|pZs}F) Yvnnp2?c6 /uExI)k<k_د|GA2"Y1UČ-dخZE%`JܧK|lVkθfCݺ !rQh U bcUYlpBv1"ok*xJFCՂr kCwpܽrR*4}-7餁g'n IO2|zKȑsyW-r<z:BHn݊[7a tpرh [24:a6+G.iz&AVBdrz?oz 4nA\fsPNxST=-;`n (>xPSn":zA;S/'1 ;rOsxO6ఇ bW9%xMqr-0qFDטX(ςP62WJ졩( 9K&^đ֐Fh\ee脃/4Ho Vb Ҕ27F(ى[B໶e$WÁ;d\Z2c΃kg1qd5qÏf`?u&114|;XYևN 2_:9+Ih`xWjWnVQQuN˪HeL3!kHSl4>v^y ͯ򷸹u,;coF}I*΄͘Oz!ɹe&9`x%Ǐ0La劊k]S+}G}lZPZ>yv$}SX媓7|@ZmO|TH]y\ LJ|Ƈb4,ĭ<> )4]|WS&)0/vg==Zy)S>v&Q*EՑ?+k *ʱ1{x2a3k$al _XrefW^φH =?<󃛛N;^B8gb }߿0wB{XDC1)qiN_luHah)S0=tފų)ߺh" }W^^ G@['h Hg3gKz7DBB-,ρt=(&WN00֟Y/]`k;- 5Ѯ(a -ݏ[ >fjX1}J`WZKt8 R7|,/` Qtyi%A9Uոz6ۄzBH Qtϲ\8_. G+7(*C`RZ _qA^{p>m6x2JLH5=!")|>e gףG{yÌ0lw ZSRkx?5NJK_ܱkw}oR" "* (ݝXqzw 8(ƫ1pkͽ\Ϟk͹C`?8q{y7& 'Wħ1u'FBp?R(JaU\##Ĕ (e  7DDӬl֎H̪iT*2W#kH(-- p wy׿2])W ?*'1M߼J(5y 1qI/PP[/O]{6]~@KΜ̊$\vzJ qҝ8+/Ą{`r7th+%R&ngLWNDN5յkW+d¿,З R;_ U'npB`@3ς, Y[xKW}WU2s| 2wVzњ j9Z]pgyI.>!3GCG_2Җj X| hH@AkRm!'f)099:ΣPŝ?)6K(088V_#!y3PgQ[pl$5t{ZzJO}ueN𾆟 |seƫޔmOK'oLyi{_)mLOI#!)zӁZt/KLNG7۰>&R߲ ݤљ( <5h&C|2}v ?Oj4ny}-ykt|<]s_X l^0?tdگqQ҉97^Z _E^Qڈ^Y  sŴu3/7!(*NW jKi0_. Ad\_%|iOrKB~6|Qd,#n b+n-kq jx]*KBL[Tm<2~4)[d}6?޽)+[Ѯ, 8{źBBc(!K7z ƌ¡V|9QV0Ѡ\hN86}8-%ૠOMwcUSJXk&aUXʉԈ̧$FN IDfn{̫ID8e<a8e*ƍE%;x9^"Mau/ in*IBeE1q$>eEJ(ˡ5 JlrbaD&rC/btGC^܇,e)ܧOyGCH\oOOH>\ؿ޸ 1c> jPg5Ҡ47+vŊǐ^(G}`Z~>ԙ.փpg"33YJ@k|w@k'pfcŸk^|x,g$rk).5Y衣Dw$U*Ή-sЭr#6R<9]HxY.pjhf(Tv`8) Qgu9j? jd΀O\ Nk/(뤇H߻`QK#>1Jw~'8D90Z9aq0zrc:q*i)4{Ka͉sXغVAF?\Z=7IMR_ J<T{1<3+7[t.O$>[o(sݩn%>e ) ߧi+sxY@K VmG4ɽPe( :낥N0: N>BrVA\;D=Y~:"|wuq[X|ŠB?WL^}lPu9 zNX1"=1HK͆0 *hQŶ3u o \[,bu@A zˊZ]/RP#qٰMd8}` ݡֻ]ٳ1qĪcYBD~$dknךy(,k{|mPv{bǀT GFL$My侩a8tx*QRPC߆jЛqˀYsoJ< /sGu֫+ﳽ`\^?C'/{lZxaufm>"P@kO-;ykk? 3On=^RW/>[| #yu(woa2UaپH!bzW0w:+`H|G_02^Y9eu83uiyО wd93r@oK7խ EcZwPՀ*6ɭ1< L_BP^V:x ,<6DHmpnTU{ZU/ל_M!"ӜD\n%*8p,oX|D-{[rbZQ;< })-Ίľе{_ش~yj^0DI B*13DSVnýO`r^ܞߖ)љ4LġWq`*Iu@kUQ2BgcF(Q;yC6ݯa<8%hIBk:7a :8;g L8c z Jb1Y[ +=vD1{೺ %KFxYq &Ƅ1.XhSps?46pqK tz9#d }2zT>%>vFjC li21-^7N`PM:a^#g|{"7)n0>\Kckb_bq *ӧ/  aCe}h%5`VSMEϟAWNCL+am $m|9A2ofNJ][n3'.?$ؚ{>SoeA݉M\4rU FTp2A9yH( Ɗ`4jtLjE;?zw|-}a>9(/@Ḓ[c+D|t(nJp)MSۧ9,ő)1jԨǘe8 ukZI"o +Hþɍl/jtD.THŸb;}1vnxE‚>X9-],5 S 1컀2V׈ IQ9VX"2pUV9u$%hJ|-7|O-E,*}Z(-*>4|_2S`r8ͬNT΍gO~ein&2?->:x΍4N4狠ȋS'dEZ~S8E)K]U;Ra/[Y֚R'bۉo'Qu>7 _ǃ|<-_&qq<gr1oruсf/'+؟ IDAT>pۃ+鏣|_}:$ёaHOG@ eO@TT}"=-E]ヤ$pLDZZ@و߾~~\&eo'ʊlʲhDEyUYۺAAM_HPeM "P .$&$"6&d ""Ə,>.&@29) `v>+-5AAyv>';1;LY/ @(~ 1ǟC>WG;)ӧqvXqx,/mX$ƨ9/h|:$9&˂+G,}Ss.{[kxo$|4 | X2aMܵz5%f5׽쾚N-G8D>!Pce|'u#Ïz< |(:"]xH=N<0CMAkA.5=%6ƱNSZsSDHL&^2NQQ;;f,#x~E.MNlTq3emz&RMdK-J۶|>14f<:-t?~m𥑇՝;ʊpV,޲݈K˪9/O+.TZNVɪ:Z41OT>'.2nu"Rf1TJq:Zl ߔV=xtzZp4S64xrt):k9e(q[J s@7G/uIck| `=z Z[cGj'6-):}.(l퍝J}|e澘@w?{\QC22}'OMˊ  `1=7r"9|)#_9^ ]x0_<)l^!%vz~V*\ wg O"8CbiE5ueQv ϞwqEVQ1]'PS`x8S3<37o 6mLJሱ!:6vHCFR m,'W\]OꁜBVGmeT+ㅥ5#b8rFTVD^r/<7 S'fs@\DU0?g4Èh9L"݉KEvJ4n]W[,Œq%Ņr{F#ػ }:DPPTΓW7-_` K0vxh Rrcg,(޾-1dj 8@UsW>8] ijc<pCxՋ4r0LgB*G{ |^RBq ^_ܝmpxM%pٍ֛aP#w,aBq63 V&(G oaJ;Zqvjui``GN ǃ+ wF&m1$H, ('OMbŸk톼B{X` NR޿9*)pF!(ȗ9I:*OƶSWw&tCBR"_g 8bD>מ!b+ݜ`ו8l8~' ( 0π 8ydb.QLgkdyzKqR7}LjJFaf쭞=b(P>)>&%8uĥ{`ptKV% {7Q[{& 0oֻc1cx?^l–YǓ4RD!.7#,2vYvl0GOA2i2NqDYU 4o킒|wuvrdG\c '-C\8#/K4X\ ߾FBÄ_]ìb\0Eo x0Btޱr0wY8;'A`!(I'm/hW5xr>CV@xuWC̳K9RڑD>wx&-|=xzz=5CAQA NA>Mdey@EYnbD;cjࣵrQ>1|%ŗ`} ӚUu%H`(e_\'OԌ fܜBfƇ`UYU ޔ8YAӹ Szb#H*%)(/|bcdH5TKOKjv(HJ`T Ċ_ AL8>>WOX;>'Z*,Ʌ)P9NfV}W=j4FԁjotW3PyYax] umgN#.+=m0whۏ(Bcqu귳E>jp/&Xʒ]x_fo)$GnXANuYV-1-hxw%.rYl{a\mY")OkT,;{s\Gf٫wve-R"+6}M/ ˍ 7q# g2ɒm7t{BLB\M*1Av%`:{E6^8q1ҲQB"?L*<9`T[ְn;ٸznP_?=lꚚ=ak(vi0'/'P޽wS{cg1vDzL%kiXwo*F}G .3?;II[z,'ϊޒ2~:iPKht|lUB:-#%c Ƨ8t2LcL !\N9?ރ>& q:H@b"Zb ,ץBl+ 5$KLT=?-G$Gyb< @X}2"1W['#Qv:WgI7eP_ yjEZYVCPJ JO Mya/d) h#:fU|' s*Yy~#䔇z,& Yսx꾩̂" Jjv0J 8h4,>3!& {n%زfcywЩZhDӫpƁ\iQXn@^3dsRbP7\wcs$U+J`չ+Ȭ)ġE}rdƸb:Kb•x2ڊzXq7|"o0yϗ^'OӔ$c+~mf`P,\hh߹+l>RIՕ6)53ܱ`Hypd9g;&9; N#YLq!:Jb$M9cѩFOm;w`C#ېh|z{Hccg>;NcFb(!"lbv_K&s3̝f=1t[hdIئ?>ZTXXXDo*i:ZRڱxڃ<[cmb^w5ese4xMi[+*Y,Io4]f"f):O9C"}J4uo! D&L% 쇥ΐOj;LI}$TY4(!kkŅ$|T% d1Xv6] A`;q^ %/M_>zh$$Ő9"  Ro#Z愈!b2qDx(w єkLT$3ӹ qeQ]>x?"(v/!y|:$Lb6<{o_wܻuhXߒrbJ}(!ߏ|?~ih0*-5bcB=uƦm~PuaߙU-=~uucuE؂xuׁoUxžoUxxt>R^~8WN$ˆ-y ~>ptPvV+ysooַ Sfo ^iݬ2e٦C)&ecۻ=HRx:֊RP<]h3m++sZaAAa pn1}z:lHo)&O$:'-زK7Q4f1 Ji 'T6ҡ8~Y9up4TW/u&@-V͟PZf)1J>x-ruP{(5 k)28F/:?8b,X=͸l0M]'~GێRٙ{jmx[xdcc^6Ƥs‘J^v0;oq4^W1`3pˢ ,W`(=J r"{c kLJ\QŰb>nHn"PKe"_^n6*p‹^!vf"𚜔(l4j':ԫ;G;[9|)X5/[h,ZL98ǥ$g) QS-tan:ƀc_4M2QfFn">n>B~+g$c$JLh@^Owxy KO~Nk |u*2R&ٵ${]eFDٽwml%Nc܌՟G i\Ɲm+,Ǯ/Z5IgWZĸq7MRY|9z6CtF/0N!Wf :}dٖ(M1*,EdukʾS##EY[<2R%l}X@޴8#,_M[W{2=q g/;L쳘O U[4 ҦQҩ-hPYd)sD֠t]X?dLekL`87vDnV#uL9} )219~ VU4&~ce ~+Sdg3:aL>)j:0(3[`ce-%=c㩔Ucz0YQs`.qY񺲶k/;(+nN(n'tSO#πoO_"0J #ݕ-$ jy8T2ݒb6v-O@N0E҅t#e'1z`'DYiBoSmxY݈p$Ź2X; !VudX~~tq ڷ@G`R㳑Lb;ABJcc)KSYb79}{AZF %# E%Y?cJbp֎K&W26+f룫vF!/1z  سd$% k:z={ QCЅڶ3T It ٜN9=>12uLBHM4,ƕ,e^*-cFQAK@tQgܮ=~zkyӛ~ BJ'݆rsXl5acg}w連vHMIK3gD$jq]\zV}'?6O-9͂y TDP OUT߀覢 G/ .C$p5"өӨ~ˈ7tW0"1uyLe QF)D-YӧrjtOnHOҰw#jMc\6y 0]{=1KUFp 3r)%t heJckBܼ2WTÎˏ l(鄳)t>) 7@8v, IY?v l}#?Z!]BjeY W3Q ą{`,$NެX?8z*ދGf7"hor<`%"mG#:vv7WY|aD ㇫BQUɣ8{6m 7"@r|qJX{q*"#݂n7%uh~%)7O>{cUϿV%%s|tvKG}ji[#^)7v5XN ٰ98ea[`,1Ɵ{5>v4D)aՑk&2H?[LS*Gt* :*衪'/R2'n<{t!փ GK d$0=`(~#F]kz9'`)~xBoޠ4' {jae<ʚfo_JxXU$7uk G`u7ô0qUDs|A{щv%SS{WBk7xFUf&b>1cB $oYQDoqNv6`ٶZ$~"GUJvĨmAަm|,ߵ ]eqvl nmԇ\pc9xT!Ӹ~:H yt \흳z'bȸ0v!>FPKw7J';/:~NzPC46SևIX9F÷qmzc%rnpcC;ݵG<)ѩ0\E{#g@]i%3?HO{kZו%LnXwJeB-KJ?vLx AU o\,N^E.8u! h\4~12(uF1j:rR=O@Uk 5-S0H2};4Uye*D-_jګ•o9go㸈GL$7DEi q:NRp!υc*XEp.ll2# _Rɵcrt=ep9p5Tň9K)( WF_-߻$3]z 7T0 z@D:z%"}{_y=w(Y|+h!0s<` >} BPBcTGLoqj ti5hEs*9,+KIANX׏ǐPZ^ ipԬqO!]&"(YvxPT瘥۷^ ^p#fO{񚽱# K soTȨ)ar}SqHU0yJ<5jSʼnkOӪڄ "2=6ڨ L3].B,Cuo*F/4FYͽi ZV BM>u!P&G]}ԑ72| a-+l>>OcN?Ogb֪OZZI vU ^^.@T AUAGO;RRaխo3OcVr'.=o0GZ3LFF)cڶ#ǗC2 WLwbp2mYoR ߒǀ>G֚p-TWC g!kM]ܲqEQYG~0T bS]%6ή㣢߻ک.DP򒪑ŷ,;=ŔczBgA%KL7xMuo6̺֡Sn5S]Q/'9hud5/oU $4ՕfX"]@]7t'΁orAlK}' CƋM1^Ůj4ρ80s˹ڃL/5=\ |=;`Ea\!ߣ76DODOYHbc:Ey?ڞ7Hbn+T7ũ(ǖY8x}N}a#+&)sj+{MOɤDS!v97̱C廟)syLd+tnT;7"i@G=TcxbU '乔 %--@]D՝:@_Qq:t0B_|;l0?~Op4s)-jnGNđ- ѭkG,Aq }E&\1~,Q OkRL28xϲL\T& `֥v\95~`! 1j|Dg'\]cJaH+䬬X4#Eip6h)G/TV4aהWrtoqV R$8QxHZ#B|S*c-5owGxNW=DD,:҉Dar,9U3߽KM8K! a,յ᜜^ӖnAk{,VG'[FY${YX׷P؆W0ŃYlBKI E#(]Huj!#ܳEβo4HHHPz+Rx&$;aPHQ%~Q..] ]CE; rr~bc$2F@;phbHP {QFa1[6V SW.ҵ ؃C;H)'ʪ=jpM./0"10yv5"P>E>h \H@:3>XE,Im!.+c eZvW}N`%+ JdZ\,A#e hvMM5(4)p+ 1aAL6a@ކa1 Y@, !^ !`09hͷ8yY fUAkً*Vn z R(NuUx+ d}Q^^\AY0j]9>Z^ ~Q?)MAvz^Oo1(#`5}]`]/׳Z=hb{HocnB$}6 `֤7 <۬SV>,mW>!m۸xd:tų~h֟  ` 3A|is¶."=EFz:i-霅kL_;oFÇsd䫷D0Xt][wpKM=DMںUCĎtZ~oƇ`y'=n{}om[ |-w.|:и-^W6]vVt>i2x9}灏>xt>^8-o">bTdMo]q%<r 偏e*}ܯ)I xDaNn^%άN2K`FOpESbh㟍suYyDqxOЦ?OD|$dž!,<u* KV4,5Prˈ'v:ZS?Wq3Pю?D(XVyvPS@:% ՜K>yND̦*J>u៬ɉ47EltdV^S@'(/*PAVxlF9&-ilˆN B}yyMi:mR:vxp,/ ޶hCB< !޸xۇ38f!q 7/Vcu<{sV>v_|y`%siۢ9YZ{|CWʓ5y|Lӧ&\^jnZ E=sfOZ_hO3DB9.l%.%pL3ЁY& $lL9kV-njB[|rDN|:ԁ x8)k!" EGXz#iNk;(.?E_ _ڍz+_OP(1"EsWǂǐLrwqlDJSWDӨsEjy%x[fQ/1zfX$E%o;%s ObO  x@dh b)<)[0Ekb-\F2c@V9pu/1D75xŤd"̏Ý3o3z~j=p=ovrG Uy8)J%d+WJ9gV Z @Zrm?LS@_O Bw`Ί,HwbЅO[8A 򃐞+ Dz,MD,-ٕD{E#Y|]q5( \J =/ۆ\ZC(A ?|Nh L٪nTD(M`gm||:`Oʹ <b+2b)y*,O$;I_/u=ؤI6yP8uk}d|_xXkNKw$&'vL\3} +;(]y'\#f.aRCOKj)U{v2hn>~1/Fmηy[ß$n/1!|G9DZ<dzc%+$#3#'0PIFY[N=KGdÕŸ~t9Ap%bhdZs#._Qr0-EI`[m Ѿ$lB@VYr_؅]:`H*Rxu s͹fG){N4eb\V!qcR103KLND_[2؛cYزm+/aÉϓXcyue;#6k(_,7P`9pNʊ0(-r=\:}h&o0S}ˊO[tsHOM&"l"UP3;uz b~ xat lȳy9j_haDfZrǃ uׁoQpEfzyWc~+.][Tɲ 5L"0bu׸]ň9kV@4䜳d!gf€} CP]sTWuWI؈ |mq@9Mh NX:̈́8!3}=%IETPˢ-/J ɳ%·ybNHS`,, xwBp|<_~n`ѡmf}s /|r?9I s ;W7䷁MDžb?g_?TT4FHe~O^8 T+޴ w I1>̫mps~ ioM?3$әa.Gò}V.4Ekdb}^On_;l2^l/45)f@7oꀭXo0ٔ818 ?Bs=AQl_Pp[~@o:`\|&^88!"WA^1?~&GBcx\{"&3NE>qOl9F۳UV p DxaȾXJ˄pր ,] [li`EQ|$7LAXu'C1T~&ўXg250e8z]h*kv~w[V-;wP\t]ݙHؙD$cb8icӞqFL;=tĴ!7W0iw`֔1P8ֶNyQ8v eIF>JΌp!`ϳ<"'8=;7^8qwxlU|,/['Amx\΀UR<Z`B DZ.!'kh;*+CL_ ՜gVU1D:4FWC4XteqZPq`<q1ԆOC|ZF],0gs):3M rB +:aT64k zEعj*DDjn*&i#)-&łБ?F?ČnE[koJDNK13"X[?, vzyRi9K 4 <:X|?4JO9'۪gY_p(q AA^By

Fn(PۀyiJ~EniY@37G'֡74rnR|{>;vitL3OM -u\"B|hg-!KfZZ^WIgh/Gy%%2Z f`yPCdD8=ۛjxcx ̭snT*nEr7xd:wM" Gh@c,@5Doפ`10XlESV^!2Wz'97cc-49I?;=M -Amjұe,:M .Ai]J6,{Si>2` TD|2(orjCE_uU9.A#ldlrTa4tźp @rJ"B(-D(CЯ/m(/-/0݆}iw*6UU6_8Yxn Hʕ9<.XN]c}x Q_:;( )\ރ>}uk!))4>{KsòI7z~ NDh;Θ͢-$F΃ W 7@sRo.-C75r^MϞBc!IO}R*Xa;˿fLSt8O3vDbrߞХ,*#R@DLGn Z6@ Ñ2UR2>eEǼ[(Qp{Hd)'N 2i>Rq@vq97=/*rJUuT @dήi0_xJ[^ \xr+LJz׻wh/ קi~<'E2x:Og;g;̱Ĝ~d`'9T h-%,ȯCh yeE_UW.]$ :X]kaБjwE9٣+2@kơ.o9EP+0[}Fuu m]|0~1~N/5ܜUʼlτ=EHMIƾ9eN&m.!A>-%k1mhd"̦&C[čKbq \GZS<>;PB\aYWkM[\l `$ vʅO/ D:'2w|e૓|\:чiG_"8qe૓|\:5ާb_菋/J5qh|l/H>""Tg//.G8q_%gcŁ>._ pB =ה>|\:Dž/Ek+>| |u2 }BDS G{| 苎 Ci+B}>(hr(Q|KaM>n̶,;ٙ7>|&ͧHiI1*+TR!9z6ǧ';2&'4>o(Elm|3%  PS] ^ -9Zz}>(eLJxР&9֌ߕH{dxHǁIZڔSx !gK W72)$}2N'xښqeo}GLh1^KzZ h]MBߞ f:Mߧk?gr}guikƟ;#= >>|MNH%S2Ex38inǏĉ8gq6"=zc_`g뀬;mIIc%!u*N: sדN͇ Jt@P\Z]\xrN[y:U<*KS\<?!pU8 |WZֆyE xJD̀k|b5i+0c >;b90fV1#=Rw _*{VǻV w x5SX`:8C#O!>ët*奸7ScL;уV"@5\`:e2 pg(h5W茣.ğJ 2rk[K(텎zcB] Eh¦۾BLI*ܟ^Ǣ0\9.5Օp]:vHZ^4jeSҘEuѭܴuBXd 3n_eF(b9N2VgV'5Wl[hL k|RGD?d*'hDE.õ[!-/wµghK~Щ| 5G|P̈́JY% }li H>'/s+gC`} X!=_D?lX71q6 c~}}_O=!#&4# 'A__֬g\~ךǗGQYGף{ l[Iu9oX@+NSPU^8v*Gaku:ڃh~ݕQūLfjg󘀏_%L37@dV`! ˊGU#q `D05[H\-+2%\zz8y*|9u%|urL4==}L3 k}Vb ~4[WKpr =6v5XF$}Ja#඼vW&+*"I|T 7YDa0R[hc8}b?&&p Ǜy0o}Uk,)X1oѱ7|3jHWA,Ыk܉JE\*ߠQc-]$l쮮`oj Qt [6+ N`ѓsrƃ[a8z&}lir\;APl?mp\$pW#^8wRaEcptkccEX0"OƢ] kvKg?D7Dk_8>WB|51!!.JYR3d$=VOPJjغhO~& /s1ra4R ]CLJ &s]M2}0Nˌ#触JHkie,I;Wi ̜<  wr<؅;(3?Ga$"THOmֻiЧ*ynXlF.}qTP=rY G'jr2EapcO`>0{AE|I΅c1w.$*,PSpPP0҉SI/~S맅;ɂ&)c,3J|'_x"= ?wVܫIhnKR;WʊFOtC`@ut롆[">HS< zGFf0DGE" V/ɫ .5V́Zr ^z"U22QA0GA%i,2Jqcv B@Nvm}b +/ )ѡ0SGU @np:a 퍦;{݂8VFHWeVt<%<{scai zaÇcP-|U ۏ]@y?c؀D@JZ-ȳqul :^!Cma;v(D8|B,濫z #૥vnUf }|4XjXy9233= WM.J1F?: ٳ1Ȉwb8q?(JSql6̞eI6t1Cm* Ta]3ުյ3NɀY-) *{> Uy-o:KZm5JSVrZ bQ4>A&4OI[/ 9;@['V|l} j]Vȓ+! %򱭤cՎ CvN&AW{0̎X .A_/\'BY-=8\5 rx]F>a JKWnYaϟ]` MR7o=?<-K;3@ o}&)aT QIlV֦iNs 0gp((GEy@);[Bn 32 2I#6+upliic]\T75 FlS>WvC4~:7.rd<5tMJr4Y rn<4#g,@l=ru4ezZ_ *ICbxN64$',̓"D&tʋvmd|V O5n*[ÀLX=2iFbqHQ]m:=2_Z72R&'ڈOJ|m 9[|sޫ2eHt8d8_UwC5zcO'!Ƴ{W]{^'-Bw/: <|j?$'DY(1-(@8p{GУKg~$$&DJ6Cec}#_K[8t*l^%[_4x9D&C/N,xE[_EMs+!f7={T?i/샶@x7}trfpMH8c9NR)vvg#Ť;λ@)ǭPS1q)ӘGz_Xsh|)9M\Imܞ\hXp/"" x>|PH϶{-hДrפ`4%, P60u"|Vݗ$`)M{z$? wCg6F)F0 p)IX`< ڴYW!68.۸!L{( Vc0mG-ƌ7sw#d,0҅11k6l x-vvM ‘]?@sHkI&0'$l\YI.MGMX{ly(I>ӹBU; 5a9xܷvEy W@{-,ʢ_{a ]hK,) 㿼4A~p|#Ë)2UIR4s@8] |}|,|U ~ͅ_t|)PYϮJ#ns{@&<[f y1]K9QnGQ=Jd[m5WT3@%.AuOx\fcI՜ųǍU_CƯF;X.-!NnJ{>$*Cz5aq{2 VڞxZZSHKl ax[@!A[WvSɛ yLOѧR 2EW19iR ?[;%BOg85)M WF*)pxH [+#-s<'f,"xd|O%(S ܐO+n}N&EHK 4O[7%(~'%('7́_I9 ,o3<\BQ/:Uo[%2xҖ,!},}Jv3ۗ3Uld凍-?sPY!f7l85)M 3 #{vd+Ŏڭa3Cz3Z GdNgY 8J:!r=Fþ?5?[^sf'eĩ=ǁs}s|ǀm36Rڪva̧.o>$CD@Oſ?ۧg<`lxTm+ ^N !#sBsu}jhefa ?~G??8q2>._skL흇8q2uU:IENDB`fotocx/images/make-waves2.jpg0000664000175000017500000006521515247006660015132 0ustar micomicoJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((6" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?v(Q@L+>*j-ج+X'_|'`׮k;mwڮĒkok}ͭV29RĎ}IP`o2o\7W|J7[Kb'wRdp\5}y>y-ԯ,oeU/~2 XۉQS$*##}N5wU^i?R}~eQ$+[~/y E,E=/$FTew}ʫqE,k.ډÜ!>Aۥxe+j}e,VU|_aWvݿ?Q QA ~FvO-;w&oϳǿﯿGO5? gwB(ŗ[n'"wKi'ե 2[RPFx6_EYN S^xzWWkMwyKU#HuW}VXO.۩T_A}U{SHəCo[ubՋϺ_?݉R$vO?ODX ey?6cZk{jn$h{kmj?k|S_Ob\i>#ר[ZRoR?U!>gUk,[ڋqK+yPh-ӥ5tj'.RC[t_|/ޮXjiV$hUC.^V*cT7oݦn8BQK]`VLjW.'KUrZʛYw/vw'oka}~˲xth˯Ư>W:_^&ӿ,sR׌#|'5~Un/`fVb?`o_?l,I)D񍝝VZ}Hڛl_??ެK63_XwSjRu;q+;Lifpk?=kcr7AyOc?_?>'Ϳ{ϻ jʏ+Ʀy[eݻj7W?~ͻ'_Sr7ީvڛпW_stܟsʛ@mݿ>E+{;'w2{Q_.rK:tEb}-{Fgd[UX `tԉ?o=tq|Kg^_g*fy _j-qm?/"o9Ջx>GiUWrR3fz "]ԩʛFE_(#)/@{Sⱁүb^Oi]m~yҮ 5 (ڊY/ʵ*@|WF\0gbgfتX˪7Zͱ-v"ҩEk{6m*2oeh4HC;TuVo.ovqU8إT9>#Ѵ,V(KX]Sf}_SJgyvR?t?zc5ƠD򼳯ȿ5jۚk,_ \}WV~eQ#U铦m/z yV_n4H'Jo[;7˺Ꞅ~#X.ߴD.kem[_l]umB/_oݪ-2yK?t\h,UNm[N}(R ÆhC+S(( >O#eX#U6kmOoTJ*؉b_ =]Sv\a74nzOYcSsU/˹6Q}u濔V~Hb9̟z?ϚxR{뤕oZQh|=O?q_{uv$QDQXcn[ȫ}U×Wuqxv<T.VvD⚪09w?ٴV|wl 9GfjCѥ>h$bLm[v?wƗw̟SxENZ֠r~NX?{?\͌cI]Vo__~014RYek/^ײ c@WR]7oKM pU-1ڛRG9Z̭ Ykt/ݥ?Wݷwϲ5YeookNe7|=k/7<_o 2wR)U }[J3?~>7eMꊳ^( ۱W)~Ok.oXwͮVaH͸X]"eW9=,~]yV'~ߡ/V?-SMWuM]\Sω&oo-[oWg%/JAPjdvSk6 ·JF-˷\>v;YZnݷk/"zWPy_?ZK0ekVok5N2*3#5W ,ۙ~]6qJ[El[ݴH#muwyYK,:|QvLSywE*pR}d*Lsʿo'gX%_+܏#ʜ?[EAKIwQZ~u6(ۨMg>/m&דoQi|x}7Om-yO_B˲UuQQ({})+뭿Je~To=D){٦&樞U7;mJ6?he]ky{8y#/nvIӠ-|uyºMEoM/V-7ԿUUz-?us^HOiwUU^U*V񭕟T WבK/۾$jR"⪊ψVk/t_Rj^n%e}6o?52xW~/ɷ{/w,x].,[峋 譯ߤmwz<-sʓmzVvJZ_7.HEԡ=DVڛ|oVe)|P${}Afn]Tgh7zQ%tHM9mx_sv&Ybdk A嵸W]hEijHT&{KP[Gkh?*íVy^~yևō3'Afs,R/=Vl :*YU/7?Y)ed-_6Q?jB_5l;KrgfGP?{y+FbڌKq,F~J٫QƀevW5Wo%޷V&C kv_-^˛Kʉ]Ss[ַk$SK|V'2<6?[L*h,nEUuuE٦\*SwWկ9u Ediwq~>ڢ+ (unMuݵ~5Z5}JQ%_5e)'x ΰ]2wz]Mn}Mb%q=fM[v.jߝ[n6}ަy_w|{SjfieE6x?֮x6˷oλZipo&S8exwngz^k:mrao=^SЗX]Ⱦ{Eܪ_w?Vk;Z X//*mkSTTٿ|mn+;1}/"ῇZ1}:N/)eZШQdzc+ů.ˋm_{Wx|%O[YvVANݷn*: vrQfxPTY_o^qjKoZ5w}}:s6o*.>/&J9i՛j6ln6ooX63HS#<.0*UM׼XW}N(-W -5Q1vlW6dTDoUU{k۵_vSZm|ըwmss2kگ/Jd^׮nU/|\{X|6[x%* z7 JtޮgjՔӪIĨwh^z1Un[H_sr[i֯s{*E^E~_k/m[ȱˬ5, r-?_U#k:v86/TRr"U-Jh>%Feݻ"vܑ/"vrsD9|%*6迉׋L.ޚx"x_mfs#_Z.eӼ%Rڴصbm$WMw֪5W9\朰+[V|q"?[Zw٥pɽKY~RZ.rlʥoZnۗwP+5-Uib%hݹ|ݫ &bX1[E>FeqLܿޡ+Sh>Z˘eO?~7Ov_z+T]+|jWi$GC[Yw>[_{-Y;)Cݑ'vubT_֝bv<[eo[hU}&kSoyT*Kp ETO*0+입UZto UW~7P7|M;ܺ"]k{m:uK֧lo_ߛÓ8Ht/|Z$iB/V-%jiʿ~eȭ>+طf2j]k>oh>mowZ\+0bTQD?wsVZ??%hjx]UͽQE]Ln]#UmjlS_(}I7ش_ᨵ%Ǒ^yuo&fZj.FTYb*#}}rZZq}UTe3>BOqouYF.V/5=7Oy[hQ&Yuۯ"59{U۶<QߗWaW*UlOCpi\O*ѯkZJjҳl}G/ڝ_5RV]"EݮO5˯)e+Ml_ks&ٶdG6Y_nEtmj &ygu{[ޭZNW#BS//g%:|IY! h7mMi0E^~UiA*oxYj^EvݕAoU}Z/6ֳ("$V"zV-"IevgV6;KKhSvݿ[lvrǛm2+*QoUO+|pE޴/.=`;yZ_F^ryUlU/*+:X]ɻʻOW q>HmI/v++d"_Yj1,RoݦXy\n_ Ⱦn_Z1dTڦoLX2 mElA+U]ȩq)h7uT9^/L->~y[ot/7k|W1Σ;ˉv6 6x!﮴T٢mQ)rcxOahFoėkz vŷvڗ|.ת^-[E[sX5<^'6,W]?egm.r/0%_[ܤu%VkugYt~_7VR7gj޵T5K)e]bSPtK+Q,_j_ |7Gv@z:]f]:bbۺxC_߷eH%YV~)b_ 鍤z,M[=D-V(nu7gVfڝ+kgn.3^FSʿ^yoQE/yXO:pVYg>V߹͚%W>eݯ/T]Uw?;99VUMP쪿'5E,$[]i >uUęy*Tl_>UMJ7zk-֘U46QnjV}/Wa8<=cZdVߩ|C׷oU'*W;%mkEDLaWbN]U+/"n?J ULo'MZټYQ/ӴMt7VEkzU_ 4^}>w_]"[]O-{d)]eVy?wjwJ~b]֨δۆSgQvK2IJĩS3Hlf\ExJdީ*ěߋ';ODq6><&n:u1iyzgJD?޸Or*nj4^ſТ_k?J"Wݶ/5|خnVo'_ ixz+_SjL+mRPEv&Di h;vٖ֟&d?'DF]sF'7ڑ,K,7 vh$h񢺌%x ]ţzl7⛛ϙ>[ʿ_yqO,|՟Ÿ*G^s\\nr]۝~vi;e|~Xë어Uevewެ3/Vl>j*Kz2۷nm2]mӥ~~U}ۻU7o?[|R#~Iqkڻq*>_oɶݶŰo\dz.)xAHk)lWFo#F_r}sDVe?n%?IU7/`k_sQ]yۯZ}K]^Y|*efܔ>#ٵśpofڿ5wɷkۗgsvQtB\3 =emnY^|_`w"o?_=cyrw6ѕbbښm7|v4hW˹e2m-}fO_/W8ͨVݓZ$L~ȩ-K7#,,Qy|uJy_4JRG1m.+֚2}DңӯWwh}Q7EJdey`[?\.<,7 ]45)W7MOkϕ͗l[8mIhߊwimYu=*_]>yvnYZ#_љm-M{x]۶}MjXHtljn5kxCSv^jQnoUO剻y-Ɵ/qpެ}IoG6nv[g[[y$UOmo(FTXN^һHiY]6}k}7,L}ZOK_ݨS~{^vN27J-ՅߕoZ*mj)WڛjMאOfeJο{j{('hn[X"OHV*X͸܍vT$sH8d+UK0ї>b۶UG)()kl-G)tz{ĺ/wnTٶߧqkdO_+Z_Z̉vkU%z!&b[Zt;&&{jdJ_~oqR*gj|ۥv?Z}ތݦԴ_mgև6w_̕fT;y^hMr.@:m_*|G EYWkcmJۿb$eGvz⣸_a{i^ծkz+|ߛyDl_J6\-j<]bgU`S<'xמ:gx'/_ޑf˛xk|7SKsu;yw]iYfxIմׂ$o5⺴d|uk>g:r$>WUN[[' R-eT#@$֯V+jΛy$.bY"^TWK-Ͽ]5u; n^(te(µo+ 2`/UJOR%T^U_()2^s6gU_VVh#-s+}oVp:ib-W|jƧOkk_m[jVsKhݴj>7oX-v/Ȭۿz<饻jmxDoW䮏OY-{j_W+QU)_WZu}-2h onO}b&}Wod5ljb[VM|ߙwIFI4,Iu5~Ĥڵ w|n%{mZ/ȿV\DQUrH#8}Gm4ݙek<mlK"]3ǫ+<oRֺۥdOu5́/{W Ǩ%:jG%%xk5g5umF+>6UgUk:՟j+ҫ@b]WUMN+: UFWQPAW'[qx]WrI/=V! oO.{/W}h?blRE{"hRcUOm:}[آUѩH-FT3]43dVȿWt"j7Z gxHY_o^7?%_eS⽔OF_АX|Vȱikc?ɨ_YulxК:/c}(ʴۈGGOh_ֿw}wj'eyu+:+UbEwj$= +xW}弿kOX]JWZ8DIf/̾Tݺ/W%s<UZ4~i77$imi~^^Du'}߽շWZAq,Ŷ_w؎6?ڼ5RuF\eoխZfF}Ǫ:W.}u$J4'2W'/t''_I|ׅkWgt/^֖5ݯ$_N7ky C>Gky|_YXKjUj޸YHelH'y _Og;y$RX}9e]_y(s-]?{z7StbgFڋ*~Rpwja[ox7Z˴Xu*XsEursQlmo8M_*Yګw̫,[?4e[kwAfoY[_/{Bv*{UlTo󾚋7vVy?{Ɠ/ި]YiZjƙ?x&+%Ev?K9-X6gwԯb?\oUyF%}㓜{WQ_5?q.reo{\ߦ5[ٓ#ִ!Lu^VWYY} O 2vݦ#}^knmM&d|[7_~fO|%K;ű׾^-/_>ٴ%j.~]Q3h|&%66^SE.*ŋr5O3ouzUb>T_q6M;NQ/wJך~zzk}ʿ"^XLxmೖ&mU+^yw-2[놷m9ݢY\#G{qN*3ݬ/ :q]Y Ź~z!e>QxbO8c/uX'8VVUn,V7NfmnPjYEz6ѓy'U 3f1U~]lֱ7[t_իuՖ()W컾foD^7-U" Dw?xȱnluH-nnheYګ2$vok:k/l:ϗлr<Sf R5]e%-ɷ5[h-,_Օ3_~j;ݝvݕ/ʯmq*ADHeu]ke]$kﵜW_NJȻQZ5j3Wߥ)te_i:;=2X_V58 tbYe[V-JFL+HH}շ5k2խ ͉-UJakzѼ+uEUpuXž/bD"UE>vEERa/?!{}GښYmd#/7e_^/q;,lkVXmnϣyĻ_+j_%}cmYʻgԞ)U|+[%M˺kZ×5HV͍[OVwʿ;*Qݶ$ *ŤK>|z;6^ke\v[p"y_bj12wYG |%/%Oh `qh><mV*/b/Up拥^$[v~_?'ߪ"HSbdJ>CmVWHV/NcW$^Jmh-nN:m1ZZr\ڷo5kvwVm"x*xN򿂸uyej%_l5h'm[S<Ȫͻs k]< ~Eb_yy~^_ŷ)+F/b}:-B(Fݷwִ(;|uzmZ[7R>w]/Yۻ@۷Q38Yexzwfu)hbW+n}~IGQx-E~"F+%喔΋qҫ婥W:S,f_BnkD>}-wY1[KUvJtz̋O[Ǘl?gX(-|+\|2}L=_z{.@7?OEkEuuݕ_^j'Sy+nUW=.^cGaj=ow_UX>$'y2~5el%__T)jS2FbʲVOkgcFhȯ+ZZgv˝'kYk_ ߽Q>1̬BB"&SkUͽibzՙnYUOWZ#7rغA.x]ۭs;U6\nWjדč+mk}~oLyYw;&jt}BxbۿV NUM@iFڳX7,ϽV TޠڋʞT_3?*Af}= fwV+*([UZ-fe Ew:Z35ݮĖgz$Yֱ?UydodTwVK*Wީ>mֻ?ٗVvEU"bs6zرVk(ص_2s?5cY}k@DꎲVvȿvWm&o4+|Q|voJzG]+iv˹VlW_6ZJDuv*7?_U]/'frnv|SeX+~V-"͵S@u6ou)-h_>WERbtW[ZVZȻĕ)F43)J37=VYd_us4T_5?IӚ+IQ\dD+߻Uyef7/U~#|Zj߮co-g3D~բh7nQgx'Q)ph44V1cEZoWTf],_$N&m=պ&۟o=NKȚ(ؾk|/Z6Yc.Kn ,t56UESvגvfƼORmO헶$H]Ք&i?|7s[m3ܫ>M)eg޿ޮQK B2-ŕ~e?X|eyJQVkJeZ/ȍZc^#/XQVu.{K;x+kr71yNfSk$O{]}vϤrVe5Q<3%1R/#lj`Ouh>u۷oɾ-4{ݛ"5[~VZ!𤺎@$/=ͮ=|rxN@SggZ+{$RXז}OYbXKOXOC8}sN<+#.A1|]|NlE[w4V.<;녊$m֪!utm[NO.6)6ןv7f A˹Uv;fV}_" A8Tiy4Uzg2 wʩ ^(Qw"5k"cTeѢ7UOemL$X//94[EtVo!~$^zohvk6ߝw q0c<Q}ji-N-nzNcnZ'vo6\;UeڐY|Y-B'[vf: ׬_Vm ~]Q}͗0En$IEk%w-&ev~2ՏO]7=W\gڥQYe~_ᭇXm=خ#6߽ھS"ϳ>Z.Z;ĊWזW{]UbZ5W H՗Gm;OrBx.")_Vk u コ(WL}ؘHFVt)*1~vߞտ0Fs:VJT_/a|M;lW"R~OeVYwPʳscN~od6;Zݲ˶(_deN?Ċ?u+Q`w~֟k;l[%rs+\KzvrVec2ƫc5b_7K{Zk>Trnm}gOᝥT_37)n/ڛCdm>SŻ!n/ޕF1,$/ݪSi6۟dQ5m"ȞknSYmw|>e[li-[L+hյoĨҮگmk3|)~&UyyNjDߐL|*Z,[إbVmWD)G2# G,F9-Wb|Ωզ3[˻uRvo|W)-|Ϻ_;+jjҷojIs@GРvJq]i/U5VTbDlޢK¼0ϴ-`S/|]-"MsQe{Ywm*xc$IUe['uVUyuL4zA[Ew_О+d_r&ybh=rl[~vMV L>MK 7Ѽ+B-Ȳ˷wܵzWTj׊MMK=~SU+^$ߩڨEX(ŕzPҳ^zyK,dt_<_sThKy>Eq)N5FͶ9W!׹'mV"Un5d7v$ [_-\uoqW5oη /qY~]s<[]5Y?ozJĻ!hn'H| y/}QO۾j!H]u-bm˱|*Q'kCDZ+TFnϛu1EE_k7qmJ"}kRo%EW7mgg26{[bk_߶Ջ{_6]%ovz;ӪB-VuF}5Q]~{mɲofv'o՜aȶY-#OEf~w E-_ 2y^{|ۿJ,[*UnTVw۷DSg' ſUh&T>_ }-ɉ6h{vŠ=m7muևu^vYs\˶[Zu˨\E<¿vQM:yw\*4Eu+S[5uqO:4tͿu?絛}YĒcRTUdgi[&)G&rNIjV>m%WsLz-Nl5c(KEF~Iu:ٯYbM=4?X?1O}~Q6+xBu?݊ӬUhDd8Xĵ+$_ٖÕy/W"E?%_({X?`_od[4TrHkUGe3m>ܮ[۶ܟMz6WoW|**OPQA'ByMZoyr]uvWdE,n_-@OoJީ^TTր*w%Tjo{&r~+}\DL[_)okNIvuWeYݥvڻ堒/ZLP$ow?eo|h(Oϻ?)ě}z!U$?vUvʛ(SM7T o!Mʟ:zGɾtoط<@v}[ZdeOJpҬsTڗ tk)[nry-Hj_gV7Տ_M]"ϱ E/<~/T_ Aʽ&,r 8O@VՋ~sTZ]J߸wn_I6:=/ݫmЖk?{5RwKV-u÷񪻭Kw%'TWVG⪊`Ymm>P]o}=7E~WfWZog7R8ui_K:{6k8j/5P<n?j[~v}ڐ4>?_?ݬi_{.%XcQ^Z-۾zn_V,}UO/z2ί/LICרR'][oݣk+i۳7Z~[vOc#iUhbl˵* svcdmuu"ebk 3}ڠ)]̉+XlHձdտH. inb_M1Z_Oj)_xbnE/kuVTɻcn*6,VA&<12zW]ή})Qm{R H? >dJhۢO@miؑjsu>>zІ)St붉[Ect_F_Vr}P+ovæE+ﻺܛ'[āgڛS]ɵ鲢;#U>m&*oSۛoޠLM+,6q@6)Q>ՠ"Mz<{Rŵ禢T>-9YW^Vj_:Y'?yo w Q[N\Ԣ9vVXvm&6NHWBA,76o;[gwݮ~)v$um]ʶ:vm,^R@gz썻 K>/5ʗj|;#mzhJ򼻝v<zyQ3$muVnX۹>߹wT;YZ[MW?-LgTmUnu*w}ژiym]ꩺt|Nl|߽GZ[JqhkHϻVS{o{窱Z_jM9b~/2EZ|׊+ʒ_[6/ml-oXZ-yR(sݯ@X,+f5+ufv|jq* *Z/ [Wln樮[5O>Vgi0[DjҷͱߛmfT*V稯xYQ٣Y~ϱܪآEٚʾkmOo&'}k泫UUUW_XuX#TW". &w_Xjʕ~v"oߠ ow5_oygε @S[Q.~Ax|ɹ޲%X:moTobSCdԻ>v]zp*],7Y>y]5-4,kvDRtj$OU7|=LkC3'V%?< }oZݳEeN>R]ב64ˏ D&?hvwmn%FQ73@ћ.%iE|v-$*32nH|ϵ*_ֲ/Zt+6_cmҳ_ToUtܴ@ܪ7ڰ͸Ywjhꨨ][wJ(}PyUh@tOտJjX?)|Ӣj'[?婞vߵgbbDmTnMLiY?z,KT9٧Q+kOKnMzUTmQSc_ ~G˷MmvMzsTvԭj}Nn`x핫}lJEV-.#*ZR2p*IpC<_{m>ݕS58\nOk}̮*|=k^l?[Ԯk,+e~vRQwb45l-'g٧/4+KndvZY`[]o%ggn.-PIa`~ZDm+M~Mc歬_kdim3Ph;D/ۢoj;Aoաّ:yO& 9wwU[׶FuEضޕ~vݷ]襁r:+f _,6%O6~XuѿV֑-֨V~v_WEm"$}ޮivAD_jhmlwޣȡXU%amshZ۪[S}:eUͶ&JZ_>.~[Ffpإ>گ K<;Xc'ɠdgd\mVۺԳE6-="eV{SO6TY~d"Rq~J q nʛQzи z굞]jOQ΍R*-7T"Wnuܕ-ChB?ykm3mVk[F%mﹿ+2GD->~RB>5ST\\@-($,qIp߽uU迂ӗ0D<z(#Xv* -:%E.Uj(s\-uF(Ѥ]Z*@w 2\ސ ~!\E@vnm_?Oj+̸ݨx,;3mUqq/&ݵ}Qr'  !͸&y ( 6uqJNEfhgBV3[j'wQAD+y)q0f{lv54;e(bQE[}h3mt; vDmͰ}֢Wcޭ)cO-Fߕ"ujwuUh-m i:zS\ T[#,[|~f-e'JHBH]+mݰTQ@h?h̍nQA$Ih?fotocx/images/select-hairy.jpg0000664000175000017500000016027615247006660015404 0ustar micomicoJFIFHHpExifMM*JR(iZHH02320100fotoxx-22.15;Crop: width:1493 height:703|fotoxx-22.15;Paint Image|fotoxx-22.15;Paint Image|fotoxx-22.15;Crop: width:1474 height:703|fotoxx-22.15;Crop: width:1457 height:703|fotoxx-22.15;paste area|fotoxx-22.15;Paint Image|fotoxx-22.15;Paint Image|fotoxx-22.15;Paint Image|fotoxx-22.15;Paint Image|fotoxx-22.15;Copy in Image|fotoxx-22.15;Copy in Image|fotoxx-22.15;Markup Line|fotocx-26.8: Rescale: width:728 height:351|fotocx-26.8: Crop: width:728 height:302|http://ns.adobe.com/xap/1.0/ 1 2 3 0 Test image 8 0 703 1457 1 2 2 0 C     C   ." }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Mloza6دWg4&N+3R? eR.6ty1]M KuUki1ZQ=m:4}ufMJ @JOu f9AxsT*4}Uj3ʩi_MmKo:^&ǵl_e}u-=Fg~(::/V8*6jU"=Oy?AAuOdRcMQ@Ti4tu_޿֟A[Aըg*T2#>/V~ҰmO ݚjT_r3Q ϴ ^]L O[̀@ ҧC? } IUWӭBg,VU4qQ?!~㚖(1@;\mM*F}Ky?蝕@pAx)0߅ XelXMoJKVmЏƒ#Do9=?[i q72Ђr[r)[+tJ# ҥҧӮ<;A#6RR!+ɵzb]&Ҭ8ۻɕ=^4Al),c%֟µC8Y…Y F#?J=kԍ:m|+G*SKA֟¡} KSOZEw'+UFSg6r??@.IƟi~+Pp?ZROytm3p_i:liwsWʴGO;Ka8ʾT+Ԍry~u_6N.S9⸏ wHdJmFᆶV~C>)ӛGܧ&*0ʎ"QďaA=ip(iV7[?)_Vۮ,Vstp+#9?Im:5}Tg(V"ZYuaHe\_'5?id܇>qi똧.iߵ |nsO4ѧC܆h?fW5!FiZ+FcRM(ÚzH N'$R#5i@Qǵk'u4u,\Kܿ_~Z" xdVe흣skfZCuASc_xG*,DH参Mwz@cH8=J%#i*=:EuO8w)L36NgEN39?V>a]5)Y]ptZىbYʑHHxx&ū{)|'Ry0Gj?X8u<}-,x 55ϵQҗ4w>i/|/zG=7jr3_dk^U7oX^wC΂+;SGYWrB(OZ*>H R^ih|f4qy|iz/ɝQ_D~8QEQEQEQEQEQEQEQJTJ+FCy1gd ZKT]>qgb35+S6mNuK("vRkr3Xr-kw^t-K G_m#jii&5M&#鶭c*GukvHhXV\c>FjZqqθzZ3xsQWLߕi:l~er3k8Ƭdtaʌԑ~mlV9L`U Ii!zbׯ|7x_|NT#@A,t&&  Ij^%Ol+;v4E@vU+ \O6y5xsT(L:gx _sMInVDT Āv!6G w"I^4+e޲o㶺hm kͼ4@ȥ'\XS"%fo4o5o4o4)>E9QEQEQE>(̮u>*Hy~3`S+4Ķo. H IJ.Nȧod{q еl&iHW+ɉpOlY\KG0mG C՝/K"G#L=˭`zT(k#rSՙdD E &}1zѷb@s_c¨c K3۷c]bς^8zOݳI|ER$XUje's|:ҍbV;y>qW^; ڤyy_=A\3c,5He~ ]O9clz{ٮoX0+saݑ(GoJc8ԥ˩̭Údf&0dS׊U汦6[Y#|\?+o>?^tI!Ubw]n2M(TV j!Ӛ5u er9yO:p[u6f*2{~=?t~'𖢶%q햒3$=YbSt|Ɠ޴v#Da+/0@-U$x$hR)k~ C4k#^8pFJׂuxKRe$ͫ+[Aeo01Muќhs+No]dgk/~60y jz&e_jxvhȖ%b}].ap]Dp3F'Uc-->|rOׯǟ;O_Vq})I؟Q5'{S(ҏUQ+w7,3I,W?t}5hu#]y؝k#8 }BIsFt[\ê$r#&R t{_+%&9I>ϧ5f$ؔjd/ f8lxMt&[CdƁgvйw9"jQM*Q9ڕMKRMФ/FRIpFrx9諯x~ </p~5'Q[573ĤD݄ 2@VcEl19ڽEJt#8K>icZ:-zIἫ Qr o4iQg?.hrܞCqk¶~,nnb68l`yh^kMj27$>З7aO'V=J(oY5uJ}6426ܟ)fKƃ{Kis628#8/ jZΠ\aCs׋b>w ? +Ѝ%,E=ISxiut* qO a]h.6ޟ4 r 'We赮B|&Jvɬ 0H{WkKتV`J5V0uxOe{>̣j[sd%$b^ٔ_G ?*|M=gR}+Km<^ݚM)89eڼL?ʰ>-}EyqGyvΝue*xkޔV+z>tϽyu׃Rݬ>9a)')pGx<ŐV xOZl&DǾ)X8xZ3Ԁu%_nƞ~jbGlxC3:`?#ZVzqx+MS?_;f ĆTf%|#ּ2ʝPgEGviC*SGtha s0ZIA1S#?/gajgM u#QaiӾx{i ZQʲe9n.dG|`#t߱u•xⵍեoM=6SBt49EN2Vk@vtBXQO.rGn`}SkIݧŬj9¼a@\օn8m{F@Dd@< '\gk⇅Y]I `uȯ~Vx2P 8& (((((d۽/۷Tq|(+9lAIR=qMgv[iA%s͋Hcyr 8W2F'IHNH[??gq;{'!}QZhv\W9*ЍsX4 Wgm[v bUݕKN[5L`qRFO4C*ALu9Mv1$ KA?{]זOg1MqjF{י꺌E(H{7J=.scGSo0ak'.K(裨\jbɴp9V= Ov&'jg~nVsԲZ ;\un.O\\,1'S(ecd(ھV&W$X ~52|I\AMrKu4}B:oDk/˶{qW kƒq]ݞXn<8^ ѫ*Ŗ=>@9Ȩ˩y"yğ\Z,z}n d?]sV`ؓ'Z6vϨw@n1gdٵa3`5HGd9JI KkWG,çzǎ`1]p5Y2C7&>TFrgpq};X/t.ScH*3QIxsRq,\31,'=:zRBGSWo C`'.O>P3~4o7Bҥ9c'#&6<{LJ4>u o? |}2?WqOc:-t}K[,7PGtxZe'mtg=]ڰ=>}nz*2#iR?P';[[kZ=*2rAG̼7kQЃ=2ߧ14:=WTgԗ1t}j;ċ6+'^9*G9tؤC* 5+Y 麇} ;'%GcYહEy4Õy=|aY.<{u{|~~E 7[5 ʹ:wQȤak>%v/ s ?_~{қ)O$2Xƅm'Z+.y隔6Tg{<҃0RVB1keg!ciax$_jk]ge=eE^[y5Cwppuc;z++Q xX3Qhn~I?`xi–pl| ?ϭq_Ni+양[D^s~3עvX&` _,c!eh-.l$[rLo*k7O/l.Nr32?+J˯=J :}V=z=J;G\[>L`…Z\ y͍>h&ʐ{pd՛GX%H`r1;%%}Ͻ{Mx^M_N1:/,Tsl\o@*QEQEQEQE|b\ý(]ӊd=e :ݡZH̘E *ɯTFcl P|Tx"t}]x#Avž13"ukA>btZOC ^ : F(;'y+U8\2l*:#itifjx\Ȉ,ffڬwן8ӴOW#ug`['yǷֹlAN_=5}b0Ҵ](]ѹ_9Ѥ<(濼ϩY :ci 'Ii;ܳs)}j}j&K\>ﷹ?ZN_2($ gO7%T%. ҼzNID?w7 :Kx\7AS\eGjIO\NRXI/ m)ORxZkE|nN},O8!`keK"!O銊HΜo+֖U#XvPyۭꪑ{8-VRca]ݎfoR8G;}6֛ASdըJ񚶑)8IDtuc,l}95p/K!$gRDpKDxbp3z$pqTtd?yC)%a6wxP=+t{庶V88<9jظphw،Z:hCYܮzgU<~ۖ[v{_e!٧]g#mJ8+{#W%<55@#,8ܬav$vԮmvgB-!>rC'pR5ƟHƸ=Wbo,?<6-܎8Jnax۸ڪ1nX dwRdqF\ ( vtϭ"J{ A#7h0~3L{כB}GOzF讏mNErFp˃ް2;l֛95QRphӫfƬl0JB2D$r? XʂH'G$Iq<ʒ߼~eMզqRBI銉3:D#{A*жPeZBrZWh+X#::WG>1ξ?؇^__:A_=Pv{Ө ( (-jWI |gݔzA%(ڊ;6B 5813Rqyz裨ֻGeFY'$?íu jF=Dy叻VCilb;^v ~GR"-b )[_[#25.c74d?[NG]qVs,D8OZ^E[) Ѣ0f`09ʹT\H3,Xۃ^M9QYUwXHQAW+ =EZDl6p=+Df#rd:"H[ aHWB,xvtb~`{?ϯGyoJivHcd`ywב9HbW5Gwtchdf' a_t+Cq9̳1v'ԜIo+bn+B*(NH]W.WOMӨ|IӦgU>Y\Ã_@x)wA+:3(vFYM%{QqnFxCV4;SJKGbAm.(uOBCcnCc~Th|TF}U7GEWQ@Q@Q@Yk`^dvW ]7?S>Zn٥8{I(֞L@ `+ΕoH>"c;PӽTѹy%8y^}|ԥ&\4t(Q;1OV{t?ȪRLC=?Ͻ>v# X7ܫjl)$ȡr}uHГc+;]5rxFz(«ƴce׶0F0G+&[T(W͸k% @#[\|A* YhNA;*؀}k3R+mEnn20AIhha˃/W:ę0zaxy'hWi 4Q+F^>*%2bߜ*(y<;O9W m>v0ԂKq8y ?k@H`sr4+ ddfcמ՞ʪrIϡ5b^}+'5dwS)|9x; ,+GqG_Q%3E"enH{п@ڇ'o2KQ<j2ʜo^ǁUJkMj3^ٶF }qnR,8@ RTNF8<*ypCWXl%9VP{_f<z ľՔMB}+ӤyI(psμeOzYu;hިIC؎՗rNxiuKw)`ǧo?i:Q^ݿ颂0}kYHyօ`?9d+8Wv{gaqj76Wnsz{Q)B/`\`Ϩ#>Ga^_G s+VaErb3V!RI@Q@Q@Z 3F`⴬.Hܷmǭ_` RYX |RT lsa~C~^C5"|esAZ\CYuw cid9sۏ'EMM(iy8]/cH$C FIO¡EX\2SSh 0y8WX:{g?Ҭx!x17*{mT}yds"U; =@RS<~KS=D?O e9?ʟofאGh#+u]\Y+]\bZ3]lTŸ^?ƢsӃѸ?N&N{e)sX.fʔ7jT9ֽf% cF޼m=軐c֘!^Y_i?zIwnzayuc/J{W?6Ir>W]Hmyp_%~WxWd3Ʈ'b}usS77e/M^%к訝>aKQ<{<< seRiOH~c۠\Ok4ҔBsNMzqj/%K_j=AmRzCit*^LK9*)u$|{W/_<|tʤBzWr>Y)g}9$Z h7yC'Fһ? 6LC1G^l';m dKJЯާ]zRBǾ1*?*Kk ~tlA࿃Դp$PAW~ЫMxbI!SJU0YQg&%jbx2btq)%A=3k9(򳒔yw>]RIl>^5ORE++?u^E]"@KE!B@km\y;˒=F=Gq^ $`8$se Hqчb?*3P]=r]Y`9??Ҥ@Nrz *usǔbU5e umNѬֹwQ+|>ҦaȯBWM,5U|&Ű6lӣ9 #Uq_EG1JG[-`J05Wy.a8)\g#uiW/3:ש Mˢ+h(()GZJ(̲S}h\ zUUlaWsĨҸ@R?Z3Mx@Yc?*y|ƹ!p{ׇ[ mtnuRyf=jk<"/ UڭS^jnzdGrG FЊ=h9mֺVZm[T?ϵr{̻ZN;[W kyy򮭮Iܜ9R-mAڄ.}?kH馔SlOX=0=1֪r31װiz+.1=R €~]+:[_^;bn.oۼsxh)R%&S./bT37W>,4kd8" 0(Tymѧ.^e+"ƛڌ̛1]χ>=hZU_5ᚯ,utĠ.1`\۹3^KG~U4g*۝3-;ƚ}VISVYUp@HcMe2ߥ{5i綌LۜכV.ў"F;/0Gq'8ZI]#;ZGs$VL"mOވ4,j>tvM˟rk;O\k:vŷgڮ vZ6\{YlQfR3+ӡtʼnGf" P^:rmmW"F'ξ- i#ԅW<ѣjd{Ha'^v:HӳF1tK)]>0{ %ѲΘ CkN9~>Ǿe# a[٭TžhG<G?+&1}@~$U;.ݲ/< jN} h9$d춏,Hr?j!W `{_)nsX9]$tEY\2z+]7OU&{zU{H<.10 0?؎T ,K[1SKma<<'𯒾6jQڅmAʀ/5GoP_j9~hǮ?2kZ!nvF"E (u)ψ!KbI}Xu #yLȓ9s`[\4 =*-vIȐ2Zh|['=OA {h$_6'rRnk WOof[Z-c=08{ oz~s Q)JZWgJ2rg%r3]퐎99pدG עR?J]4۱9kXCQ!9eu moc6|RCç^Ҿ߁2 c/Oz SVհ:-HB*s]3ޏoj0hV%Sϯ#ybgUٻv6) 1z #Ykvrdg O=RViCǧs|ҵٵu)"rKvZq|h5?`!LQ\a9uIm 0G$W|$gWYd8caYEgʕlێurۓؿS^e<}CW5jVd:8ʰ>V<;3'T,Sg:T-O]ݏR?_Z2j23gdJLgz~U_vGKVˁ3F1Ggp.,m+%+oVm~K3~غ8>⹹t_ g̍F 3swSZ1 K Ԝ=^8OV) LHKoh$t;T{UffESGjoè[ܴl8ϚF0H1peUVGc ^^n4Y2oOq{Sp}~[WXl;z~K^*\ؿw֥I6IR#5 [`85"GvFi{ 漋pķ:OWsxđ]1n+fG/EW )4pyt>[ڱe Ou&1HȨ,@'VOfU ݆;YT"ViN<]--6Lje>f<{WCmtn׊` >| gty1Z[@,xUksFMf[,4aA<[t\9R[ WQNDZ>rt=(B()oVo$IWPX{*XK#c̳s}yWgDQjnyfbߏoSx[M|z|q#O0ȟ?+wOCYt;Ji-#dh+:"|͎TZ&d5obH9?h7!Cqi]D59^_XI˟|uӢm8UOך܍N&?8_ |馴Kr>ޕ+žGV3 VyOŖMs"G&[9`2:zf ammkW_zIu=oZb1=*|5<` oSp~BX'kxZaURfP+ѾdW8ZY3\=25v+I?BkѴtxb1`^6)kMϨ©SVg -^`?C^g_QHdxFd?z>@vx©[]4c*G^kPQ}ʹomj}CWVp=īA8;Ag>$xZ6nt{5;I ܳy).\dg+51kyNZ@y  寡^puk+%^g$h^Y!ʞq~id;/ 8nk{[v'>~UG/Mo>Qʌp\m{,TVk7f#Z3FxYל=_%0 /8 |Yቮ4RPG5o Pȣ0JPuB0TGGO,Ws'B|X^xfB|4T] e{֟td҅SzWmTR?˩󓒌M/MKF?l8HFI6dI*_5g;$H 38It9=kl˻]m$ez+iuk-B1ݜu@Gq9eάC!*W b',E3SU`E(X,p=7I̝%%hZ1e!FA{QС"&HByErp `L[ʳF%tFs=kRRWG#G-E)HQEQEۢ+6I|Jw޷=WJc"=kR؜1uE&r1"mL,{׃5vpVmEvn*>~M]5AKxT>)98\`~5ï &D9XPn\U**j<v[cokjyk""$*\yϭz%q";Rªs+><W);#I{]B@ą=Y*G#gFW%'*U[diC1ugrcB.wokyZFj,MӮUG?+ȟʾSRx{gD*PFA1:ʌ%A}ƾ3?U@M5 tXfDk8:-/9N:>WyZctN@N@$~eGP3F"ZՇ3jpXY:eЂo1w5J^X~f^znzk޴BS]jfӄ~3M]NLAW p/Qơ1 ,L{澴_iL*p2UC:CXi ;LDmncl#`;=b2tg#{Ǚny%/^O3bKj$WNݜ:ЀGh2=ic^ɩ/Ugc01bzu85YI{V;$!_W|*븍EpGꕱ.Ei5"h!WNG +x®z׈UF"|(Š(j0 Ycgy$+UE_fTKpM ͝ H"#׎sJTQ.@ 5tRPf8Ƿݎ F3 l``/UXC>[E9}eKw.1iS :ZF \tg򦈀:?ƽ7]Ѡ>TE2cn=JqmzJϩW .\)$NM¼j5szNQXdp}6=R@.{:V厘tA!OsM=\8=1gKMN:}k+HӏϡWx.٥ԣ2 XW>&3MZT 9^r[FFmiRWV=AtRԆ'>J߅cW]˥pN}kE)܃_yBoot~](Jn4Mn1Z"d;{S.TT4A]CC O곍$9]2ݘO9>Yv=+Au[\ۨ9#1\|ɹs = ԏ9rpTOOgssDܕt pq]҃">'4^d[s%%hda84I0K,xMo mbLg=2q1Fe!ΎQIyJ@F >Jۨ{nO_FcwFH9vu>3^Fv"g:'^L*h(]sTK|7Os}3^jRbxgpc$eӬX* ʓGAa$ZIUNJRsNFLhp:TREX,|ϵCq/f8@&{{hs3$r}bJgp?h;Gj; eKBlAf:1lěh.Ys&?@)̱r&b>y'cGRctlߏupaXվE?qֲ-LvNSVO2DFn)'RVA]tW׎|m,ݔC`XYN=j%A$7rO_֦cBT+jIzIu_88>o@ zԐNNNK_Wֺ?o8kzOұ|;cs$3=+sķ^gRTcjwcWWټ4TOQMӭU;I^mpD{;, w9gJ{{KpBIy݃UCV%mWEF?zS1 zG}:2m|1khO Ki+3/{Peai|gobî?{&T(qcvWR/ S_FW5 M.*:[i# ?v,b lGre,>-Ӥ)#+rߕxǏj0Do$#`nq'zk{tmNzqpl~< -́W=Dy D'5*׼eUv6la;mCS|S!bxe0Ҷ:aGyBagMv>R#X?тщ+]wM# `HKIJ$I -]_\m0Mq$`μTG&*lM"IH9 :ɾ7Ln߅pvђbۥ#j$m|*w8_IT2*oJ~ScJI4~ҵu 2Xyn/" q:HO58Te3Ȥn3OJCܭ!"=+vx9 ?JԱ͎S.=Υyt{}&WBaw.+Ђy8?xw&%DeI,Ǝr&b*(~tִpr.#{c-w6s?Bg@\۱M3(#8"*vfSR[K9-VF O@Ecj4%9e0ŞAAPA+F+O054GRXCb,ʣ+-ϟZ$[tȣn7~O^6NF9֒ `Bs֢EPʞ(8zqZ,uy@$|Z|D#*Wn7~7 6ݮ\*IdjGχ IZط)^8=6`}x]ͽa GVoL5D:u4he|5Np=rp QeEdzݬЦ*H\컋\io3HN]xV4罖Ǔ7_h` vg|_V\)uB5n{l9$U[M&y klBe7WAwW]BT?G .'T@g{+-_EOc8E`NWr]Hw8A*N:,Y<t:MI V8 :5:šKg#+q:DI `sDeY^OO\tG^+हQ6w fbJQ9Bww|^տ_.͐_OP#瞧p$yaR,nGf3%8̇/B;׎xb;L}k ]A"l$YEgV.3:*[ǨPHN7}JTnl1{5~~yj1ч^EIy12ٔU*Jgl]F_ˌY`qH<]նs:Vu) IfSFƗŢ>m[oQG3.C#6Lxx{Қln + |^(9HQVC‰A0s:ג#xvKgJ'h%*۩^L!(?x&ߠ8jլ^1W`VmJ[Ng e~$tc}H:Eky)ANf#'?[ h^kOg""l=E'c9()hK[Qn"C8"Q9"'c{W҃ tzui2+AErZl[;w̳FSv_9+u(NNkŜg$DzpS$u.U8 Iʙh7"IyCΨH^4mn*H%snH'*ЭϰU-owApHܳr rYBsGskY~`9⺨lt-OA\pvN~M;6ckBjqMav?ªD p g V5& c^N=?ϭK)jebu+Tc8ҰEⅠ tVx¨?qh Av {wng'vvB +E%ԇk> IG'FϨURdaGuxfJXsO{NjN&bWjv1jm#`SYg $q+(;j[nwU@Vn9Wt~mPcdkjicSCf T$w'f}k?#BHCV!ψ ^O]J}\v~A#0'>lV#8<]Oԓ)"! ۹9%CT%=\Onk3cqXL-,p#C&6H07'渪vRشOHf9Ef*1r v5bdͱtږl)~Uxŭa 9o坲_wzh1ʮ<kƣۛ1M|[S{I_סh#6-lPeyU&G?"{VƋvW{\,aJZT]=OaV [D{HHAzO"%T.=<˱yŀ M]%GЧYY3pjx@H@OZз)M1'qY3pԂGlׇV\jqQJ(R'Տ-+p]p_iQ&rm =GN;WN>_gb XUAF/ڒ j>y`+u:zvlzfemte#T`Vv;4c>Zk}vPv"5 _{=Wc, 7*m?R`q>nj 9?eݶa\G\HOE]z\ X޻K@AӁ^i}j=/T2c54[ɿ۲1op|=OIƸOމRalURÅbx5\G] K-뤨z{MSڥy~L궷6m &Dp0ktåsa=x(IWfc>g( 4g?Z-JWmI oqyvܱOMHςvyˡyiǕYۓ]4: jqIY69djTݢs i\zg*=jv:D UY63ֳ^(QԎ-*yakbe[Gϟb@˾"? j.GlE|%ΗI>b2&O*YO#$c⾒t!m1|8\Y9F3W̚fy#$S36>2++ƇVcǮ(ktSqJJhu:sΡMꏞrv48a `]G`{->Ƭzݞ{z)LĒUz+bokcc Y˩E![kt"}\᦯cKc{C"D` ܊Pd+|>~1ڒb+/DzTF0܃VXCڬw ~ڱo٫tuN*#tұiVߊ]M>bONޕF.)bGj¿jJ3[d*&fsIMқHTB+W!O~c*J-(mИ8[y Hmc_UJQIݙ6cfhb𡸏zhmOb}qlVPr3Gט|re&u>r ŗ9wZ/Nj|cgi$:n--AsFh Ъ''=%O,gPXLds(0{34&0(#tǺ>r )i+aEP?snP"Us$qs^i֚<-]}kM#<>w*O kK#TM}75shERR5Čn;t28sXjE gު.09 W̹Fc$:^&$#sPvbeXn#*K[M 9#[rw-FȑegO|W-eu`WplfnGۗKLU9N㞹N?-.j}L0q$^O+P^",B?np븏-vg=8eY~y?.7Nmi(%-QL7Ampa\9 \ܢ}EjP\dqx\545’GV~]"jŽӽqA>SlLjQfMѮ7FAq כwRAMujS p鞔ұ<-wH2** ԑ T֥y a۽Wr %OBŃܚl7upnDzFV4NĚ嶌dcPr} Ik\f8K sv͍y}wr[%ܪFck<%+2. YN:T~M_9Z>mB_ 3o!2oA$? i@n>Uk|-(kuWZNu \(O-񞠑/hxY%"eaˁ>s] f8;MAm8q `P*Ե`Tݰ}yټ#)$k1ZƯ].hv?^ʼLL򛛦"0rW?{޻pE(6SIJ).iF$WUg|&9p ';lWeRz3TTq֪\͉uGfYqVZ)]▗+ b=}[k6ŭa0[@>Im:ds6 R4M;}A_4} Z-,Coy[9r3bRNPRX:a~\^Y+pTg9_w5׏T5JW(_Sғ1 :;л~N[9#&>燮{lo[4gȷ }9ܤ)e{ pBu OA zcs]5]t/,&U*>;rf=Eu8TƋ ;r֫ 7dME\!I9d~Fpҙ^EPEen!VmcRQY֤͞!lձWu&<9u"3G!B\'-I$ݧ򁓝y(kjb%ǯ :k{vR3d\[d?ʻOK{ "a|ݸR:{ד}@t-+Oˍ\{׃N'7ԯ8Z1$d[nGTG WdϦO[m#m\3r9tz.wBJ(!G?n襮o ɂ=9^ ͨڿ1B#]e0\~2z Zix_T7]JFj!O$ߜVW\j΅8 j;!Hd?5)o/w['Z-+<²ߎy;Er46N5tI#٪h0G0QOx]۳HҶ`N?j:/{`W7O6W>ssj Al ;I@zMo<[]?B8K.SU|yqG ӭ,lbK?W|li[l1"(9rvqcA?u5SY@XjҮ4BxI@)3Z HFFÂ*e8Vs|4CcY4hx. Ԭ8v< c^>ާ<ݐ8?y{pҋitF2cP} uԟ;fQI+*xݬYuS5|KFvORzuӥ22~4,~SXz z] e/Bh[`!o"0#瑑F }27mTR0I?: 1i)lm[6?6=3ְFW)q[K ZZ4k(< G2jҷ*ۚߨʽ k9r^8TBI#>՛]-d kƛ]kj9cL{ nMWm2s3뵰оlY :{~}q*QZRU*1 sb?$t..pc#lX,˒3VhBVŠV<ܼl=:ҷ``2 k'=\ҮV[, uWm,z2(acG=OC32Ӛ/vZ6 Pp?A*+ M8( /#$?^u$/DPǶ2?Oנ82_(U"/a_-WgVDNrA'8[uF-}{T%{}ZpPqCW4 IIjqH MO*pt٣Q4v Ĝ~mo>u0hy/AEb z6C謬tZ+4A=kТ͹+ѬcTw>ыˈm^Wex8x5N3\բ.´Lc~Xs{\ FrjAb+ǓMXɕ>0{H'st%cμbm 3V ˅/28neb4o - ofCn 娌dl[^kI2m~e A꩸z= xG= MwSD3rc%\BT8>P4g5kC,Yd_$u,$wLRfkT-v}}z~ g!F_NhmQLgxH%HS{:F~ar~o`6}9!P+u<$`oc\mq rn6l] /Ҿf&M:)ug uQui{Gs?|Ce v A?\q&5;e]r1Q>m[7kZ[6FNr_:3|铌;:۟HYD֭s{el9enG_:/{F3qsz <'ĎXCHs^4h~HJYfh?g H?\X[Í>H,-X szUjuA7<iS5% W?j-̋hp9Uk;G|5\$Cלvϡ25|ҳtާqolД_3ݷcy vl 4?% M""Ԑ3ȣ~_5{@%!*9db82Op  VH]Yf}ZFF>|Vv3N9O g?ڼ a"E+8#hyB[]\Ƥ$ N\\E:60?:o5}B|)`3\6fMJOo ^6gjn(}:ƞXqUx!}#RF擗sӥ ڡfc5b pp[AVMƁ}EB#\qҹI#ֳN RLqOF5V4J\ ֯R i]HWz~Ck@1 sCTNVFUKC#Je rOLӡ]=pnovYZEJd Ǣκ-`GMO|xQF2_>G^9~ͥЎ.Aӡ!#E V~~f <5l%,GZʴNB:uh$ÜS>8XGYC[8 o{\8hKDU$[ҵa 21@1=_jpy2.'Lf3Z.F;(kx?KD:K%6*)>|.ZVG7"/,,'y*9f~Uj,vl?jŢ)[MK G8}+or.Qr؂=qE8O4ZT4gз~ QD\l^[ Cn8?k¼9 BYtm pq^_]p' _9Q} kIӔ"DFg+Դ L&$J+$GC֨mk;UJC\<#h,w~S^UUtwAbLzcCGin S#jKi'{yG uLӦ"/Ԙ2ȣ$mⰔtSE+ 8ۑNΥ#j6/v I" Bh<vݱNa`c#?G7l EA{hǛsG׊[8ʩI6p*?vG_֔Rdi /*Pq+q {|+oD7<"vx?EgsGpk5+4uSVyvpl8v# VZ,(@vQUtl,/̮OӦ+V0 Dw*s.짣 )ʭC qSmdrnQYM1袱QVD칫`,@L;b TNO˜3w:Tl˱S2Z(?FЀHg"ʺ>5(+uGZ!H=ե4U{FRɈa27+qΥeiIE̛'u:M ?Vv]J tz|H v\?)?5TK"TSfEM{nO߆,L %2ƙ-܏ju#3 t^(>'t.Zc*?εKE<9<fq[0?Ú-]O ݒoOcXE8SI_/Vcxq2QvEeO5xJ I&+Rv{zWQxSI!'kvg[#C:Y}mCs<=WsyӼGi.yCN"VP?W'#\߇SNMrW!F'Ċzr? Zҙ/| ol`,5wVw݇ʟ6k %6pM{ʵeQZ_>#_:U+&g8'5~e+Gf33oɨ><3ּv*VڌA!OypXsKTbM;XGMY#98dK PZyRE|&u HƅHI8$QxU lsvWS/Gt1fPK\k7o2["H'M4OF8T@=@C}+tۘT a%SݘGZ? i O6Rm`qy@ⵧ:ʿy*{_^(-b OUC#!b4,=μൔa-̫iY?ʽ^,%A?"}+ĸhzhN]O챨V` zVuuD"Ei19%3YRUN.ONko,RyGw'ۨQiٱ,l1c'lzVŽ%p~'06̨3*+ LW4G 1SKv)OGAjwT@Nz3ުxWl*{眢d_^!ڊ~:$p\YynI ==kzK'q˿<#~7u4dRG|="+(WB -v rRe?sQlڀ%Ҍ@jƜ^B MqUlnOΗKuFbl&ڥoj]X%ۣ_LV]DhlznWηbH}6gM)tbIPҳ/"یMmn;TngޤԌ{0H'<xq"=9';R5LK q$6E;6i#B 9=I>ƪ!o}WS`.KzgOR]VZM-1Chg0+; ЌakHk6Km= ?tQ[*!pTcT)lq|45;} c^m^6rUWz{IAFĉs_yn'=j|Qf&FQ+f0OO_^~m`Ҩy~R *Iy{5jTڒ3>/x UyQxyI-2O_"|FYm|w _;a~ClC5B)=O?C֩s%l=dq f{WBjY{gڽ, mRGZ# [^|a>NcOeqc=Oa5VwʧlqJ{w g%f}d'*ng|<4bhn "pݩ,z'G"COӼ5zOƕps&)mJ4~TJ$[Ƶqeo,v7(0zבS;ፒ^]ӗڝ˟^k>'мQ,ށr}CѾ'kCԣ0c#r$qz]7dH 4 ێsg?O]^T49;{\!V]LQ5hX܀N"AsUZ$#\r3ڼ{ %qs,W[q d[Q6W%l󖕆 {(O$ztmoƚg, qjXvi/Լ|PzPE%wcסCY BY~jʠf0-}+0Gm28<2J޷mԒy~6ͬн3#psG˦4eC'?MKslw ܬcj_޷x~4oN[޿┻"%(Ut; dqG Z .#V p:>kkǍKƿLe~"<%!ҥȣp΋+)#enoM*~i,,嶞[+SFqԶ.-OA9&-dM{JMȟMUH>WȏңF:ElB 3;j0XFOc6*vSzֽLc4{R4u1aO>Vq*x9̛p?*a죽c7mH p6qX;uklt #qOU"K駐.# ï2~DcD@GqkϨkrlF[zD`FsOU`*p:TS uUn+'Is=utGis$Kejp(2?ҩhpqӉ+ /V}xXUd pT|W;ٌg8՗`gD# mvqihL~jUBw{-c Z!ӑMfw+nHN1^k7.`{}m.@Ny ewǭ{h۝:mt rY|v‘\zU'QDnW&x_KB :4F6b88sxMLevJPlҷ"H(@Ö$y@'?k[ph@BnK=I-:&s *p9 \ԡ`y`I׎z5+۝!UH1XD#9/|"iFmtm<>߄<1s[z C1` @=Oe όl쭥Q4r61w^#h'=.J5p\ ao,۴yQ o4#88>_]W onOk+4T팏L}έ,,,bV sGǛjC޷α>?ZS\3IP>e$_ntI:c}z#ADw:FRǜ?R~tӏ2'/iUSGhf&\oAt`##`rxl;1]_&n_ݰs rrQZIie&dR|0CO{Ie#[BdSl`Ԟ8F$,q>+hfY+LGo|Y,ȤF'Z4e#9$־Łp'ԭ%cxɧ ^YH>\M^nK* Kyg[:mgK|9b> o=u&]Dub FUa "U?V=Y1#J$1b l1⾧LR2XHҘ[IJӓ9=jm,W \mK[Rڢ ֡Y.cC1鑚^Kk0H<$yYJGtQjc28S]u=^(?(Pu&#O/$ƍbO@0Ac*UMrҜ?k5ԗ,aRYוC*#%PO@`?]~6pUr=+"INr&EÍc]ub:=KW%fu_%29Sһk]FXAЎ3FfL9Q޽B+*򿻑@kՄ}>h^t5/ >jBF~x:Vl >aMtJ*aV+u>ʛ!k|yl,i;U8)RrT^T|%5&Y3A^cA^hfԖX́8V k.<Wwv%L6˔(˗v~Crk>sS+" Ԋ }kiso<-#-|:jH< Wu9hŻ< j [v0!]EiN?FK_'R3Y²+؁¾_ ZXeL5=J d ?zROI<Ȓ(ڡrIǯnIVHa,`C89jHtHu!#6Xm -ORTYU;HLd=T8=ۺ10&^\c"rɥFz6frQ+ǰMctE8hΛ֡>ŌNpg`x=;}%, +KH|2l4%>]`ds3&f]ş1a8`=+I9h{8TFY#p?]B%&چJƺIs|Dt"g8xsO:3<Z ,q[=?۵z'#D!s#<ҼCVZ 帑ZbOL2xctRdxqrT⩢0nr6-hzhxC}ꯅto3>SAksW @kŝߢg'=3Ao_sZKf*~zM;LGW?<?A[c|9dg?Cߡe.mPs:9>z<<K4o'р=GV*A?U=QNi#C>ڝhGx))'03@]*5XQgV~depqǵMC Zϡȳ^w.R3]Z>*9Fƅc%tp ,nJ˵yo/'?an8wNy]-ǎ5+-{'kBVX̞y8Wt'3#28xl?1m $ỞJ2^QtgoLftSaG6=s8_wuˑʖ;x_Q2>tǩ|1Zx l>78 zBn-aO0 ŠhQq?Z~y}98$c|*Ⱥy\8'6ydrӶp?|[=On+?<'TXdT׸ צ|__(mFF?:X mw[]7$d_E𕲨,9#+/{#:~ݶvZ6ڦrc`OOr?Aפ7Yكd0/́n,Fc;?;u4q J%?s?Jz3zѭɟQ S~U><5(Cm^0r}w2q~fd_7?Wk%2*hz{s:<~۞iݘmJnuhpp~55mlypE{OXͦ<OW6.$݇1ٝv*PUJ rq/t70۩h㜩Fv G#8=l^-ec+QɡZ5%(=(KiT 8$0<}Ȧ7zԏcWcP:ו(Y= H#85Ȧb9;8 ϯz:K#I9;QeZMQI ]r}* 4~MHi|œդdWqΨ c?V~ yM]nVF# +mFUڴWJ!?魮\]bJdQ w# |pܶ=r?gItNS7@kx,rZ͈U~Lc`hbq2߳™ `kDzt'n$A# {"FgഘJ"v5X]:v2jǰhgy Q*O"h\Opk9~m*uL 1i|.6~p L8 lXOƻ~ޱO5ns4WBxnj5 Gy7 ܲ l}z5~? ISc:b)R\7oMٞV6ngDFgHDbޙ/+fߗ_ʤFAk|p7Vh0~BKefnA1sֺ!}auq v~n/{cvt#nc#NZg~OٗOw(5!stL~@Iu[D-P?}eg&"C[|V;/n 6Rqgʸo݊?7'{XHp!X"x[+vIX CsOؽ"^9V?&iҲFtyjn#=0Ms>6潎tJۉVH7P <98 2K*EbFK4n<0ºݤvMcDR#Ќ/q^} -pGuj֘mvR?YH˄#%d/xxWFxf-Nq߯Jm.m,RhKٝT}Y- ) DE:O=hxnrq"Q.rFN@N.<8wg~zPKWэL  ]RH~XVy'0 D/^2O\&ؿE ޜ ֱō`Hinݘq&ྍ> W,N0|A %¸B"|<~X?Je *Hzu( Pdvwgoζ{W\:hԼ.tͦ@q0 u+үnzg4/$1~5i;S~4Gv(0ku_:1 =y5kQo08+&ӎףZX S9q =fϛI,.d̛מAv 2&2vglhվP ѫE'= eǘnڮ\f8lp}jƊ\[ҶeL ^x{9Vڨ1̪*7**ß_>x ?Kk[>K{[" ]F6|31k|Fcpnz6Uc-)e>"0c,a{[jkh(7[}C(*9 g84Z>\ 64lAJ0H*U*yg5:u:t#h QI 0vT99Ïj=س򢴷K2r(,P~`u#$vn ]iqK.բX!@0`}pC-r&F<>0xWTK圪Cy2N:?nPQ/f!+fotocx/images/stack-layers.png0000664000175000017500000011205215247006660015406 0ustar micomicoPNG  IHDR~%tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 245 424 1 0 ']:eXIfMM*V^(1fixHHgnome-screenshot02320100fotocx-24.30: Crop: width:424 height:245|fotocx-24.30: Sharpen: median diff 2 14 15|fotocx-26.6: Rescale: width:382 height:221|m IDATxtUI֨g쟙ƉN45 ܢB{M7W$uN:9]Wvov:\XX2++ y@Ydk@QQ˿ nh}u@ց:lҗG;:M@ff&olH˃S|(OW4+Y* ʟe@Y@DBBDGGmqqq$&&Q0RRR>111eJU5^'=99B:B:_@lUVUNcu@ZJJoV+;y_9 R9Qiii (Ǐ+_ ?!1~/c?H Cs}O⦟7׼HC%WMGdVJ@J ,Y$J2rJ#?Ifit!&$(Ott5i>7c$yKJÓ?*-dHtlߎmѡs_qLٽ {KO_!) Qle?+ OrLH{;[ff'/uf4oFmhӶ=]f>~= 7hekQӷdYo\dϣG_}$;Wо3vL^wjy|zG (c,}%{ G\6ʼQt$kv8RR+rJȐf쌞:ꨩQ^}׿i.i\Ow'T,Y}џj;9!foA I2o03&y:tVuhܸ1&&&hhhf _oFZ8/&HȈgCMǑWH=j|O>X?b3@(c']%`{G {ܒu,*Ç|*:._шC%6Ru^#UȜ.C&;mcKgab9EX)" UPˬ4n@/gCTխY}OOK!>.EdDƑnTBzZ* (q}JZ&%d&hQ%$!Vn$%' M/!hQ$2_Ex㥈We*؈\"#1A.K|5~=# ~wgeepgupl֚}z<;Vϥgk' tQճX`Yٙ2S+kګ,ғ" aByEEH*({l\Io{&'lIuz ܉ oQ ɩr/.2&#Wl\oyfP-Yگ7IEz]ioNŦlG>K3~y/YW~vvvA A2 [:u5k;Hm1W%KWԋ_hvvvwEV xI3Cb!?K[HVmyq0B]UEX8Ɂ >$ _~vo?[؇,\Vх-XޝGq-&u-=ԪU:UYzI_---VC0 De4nPzu~Nhжo f yMuDMCcf,ql~"#=@3L]qz࿷g: 6d+ЦGrm<8X`hʊxc] ֩Mݺuicl9p4і[7/#;~KY M]lu`+Hvv"7sZg-z$2\̵v2VAúa#4t:slc3So'S1~`)jer5TEֺ#61E9es64w@GCUUU5QŵnU3=5σ}m 5&6.p ϻ%JT+:#i2|;fϞ͌39.c:i2Y%{駟066fȡuaddy;How:2BKţp2PX}'di/n0: uTi#ni 5۵rs3 哓Ρ34qmIK{LhBSdIMek4FCK+{'մYyKK+Zo-Cg[sXs/LhޢڹamjDq84!݀tٍ^}{ 44`@)~L F 10mk3*ز OVJ8^(: C'x#љ8:5S64kb:f=9LvN2s5C2~j'5PUӤiv W+a`ڤgF' W%m:w lpyA)X+ޥ9={wQLދTmء5FN1 zŘ$j5j꘸t[eu|5ZQƹ%:ǥ_ &]8DNn6~g6`Ptz5kEfXPU7YWrUT%V, oW\.ڂydU6 bʔ)M:1yd:wWXV)Ƣ  +/St@maIӴu7Oϱsׅ&ܜTOm1fmۄ_FO}3{F/?BFN;̂B209FfyoG,&.5'djM^1#5?MaD5).!FZSlW[[[_WF6a K~d˖Y{&YzR%+GTL!KIFi/\Vi]c#(L@~5~|HK}u yT:wrqc,Z'2sRv8I͊d؛ 9 cS3\ #6>MBOaQ/^؎In Z_7>~x=g{~w@3M]S1U9GqANB.#c\\bc)F~-Y|"10u{ ~ζlNNN"V.qO/|z?z%mڴiBP?#Yc-Kp&rz9s&wQmll)yIs%zҎ ULh% ![X҄ImadlFݳh)`d֗s9<==9}4G㊗?م&R)ǂqoʠ8|3gp1N@z~.*,V~a+HaN+z7AS˘c +_bˮQ^͞VmC,~gOqh`[ Ɖ?*sv+.b ᖪů/+L>Q*be"\hD]C3~ZS'9c #;caߓuaN9'qz:cʆK¯^T'-~tnf*Pˮ͕}0~7rV%&ɓr_nXuMvƩ܎"?=+`*:2?܏ql-1ج8xy,-ŤyUVV:h~]$EFuGQQ0JC,LI.@KMl+PnԞXg[?׋6b/džk9+>rnlZ0~{ !a8&mXrI2Fܪ=}zucf"JL)2F8͢ǸNM_i$97ym4|\.A}vy| RSQzΝn~~~#YCCC9u;RtYM* ɶ#Pn=tfbl#R͜]d 41'iE``l*\7ƨclΫ"DDܼNFa6X4;04n &#'u6dÊazjR4;Ck *\Au~3DtGi(35uE8ūb+z Ho\U-bb!&"ŐXSb׽if؀-'2'38[~c) 7':%};I\(gӎCx'-47֦^#u~tʇӸҠa#1dJYPO]-ƪ)\"'HIal';Qb`*ʞ;Ѯ?L$ }Z>ߵ{Ia 00 6a#U+BZ$4Z^O7'i[OQGqN.v@_4`q0}E+NzIV0]-DUMrYImm{I_ɏ䱈&Kft sD1Qǭ [E{ULpK.tuĜI#~V{e{Z6]GY|>'O|l#-u:EGe+ Җ?3#E`+0 61ul>zYJiG}l:pxztiޱ7(ȩҲ `V,IOIإV"CK DDh}$'Dqc [;P@=QpKum/>ѡ,:SqNp"6Ɲ7Y8ۚ#b 1З;; ஘S;Ǐȡ$IX?ƥhB 1a""g;v=1Qk! 7΄yHx{QZEҠ. D䍧(ate?7@5Cfmwšgh&PLl]3aXH{;Q"?cP~&-j:sصLlBDMMYEo=V ?-7w~ UEgEp'6LEV[Otk𐍋S_tjF;yQ(QzwpEW\ӷnҒ͇(d,IcϢ!؋##FYbd$u׏3W;,&u&vZAt5~џ ۻ&3vy"*ttiJe௨c?rT_JXqW^dbh%,:7}6,|>ҵHc}oˣSoE8$RMd_E>eU?h: S(VoPo3Wh%˿*V@ibSr2I&)I3W/]d<4::,_ ~Yҁ `Ҹ 6A1l([+~QBK%K9 H]JO=HK[̻2SyIOE2KyKǥrI)l/_~?$)|m +YR' Y%Jyuҗ>KyK`//*W!_ ~Yda: 5Ǘ.@2ekOYja .[y5ʓ^n{/[{:PtoL4+,ɛ\: _WG  Bŷ#MYdu௫%II1&ׁ:Pst@0_\jU'֕ ~'뀬5Ldװ֡5Gd=Yda: /%E|Zߢ2YkR~_2|C{wsоoj;gMɨl}>0~+{I;A7?JVϓG9zp7'](,(Y?F>2"0oNpG=ߚ9!vЭoNȈ?'%%ߜ){'9O:I 2+a_y| l1bl1rƲU?W_g]([wr_y|*Tj??ŴǰХM~tScBٱrCaȐ! JwZjf:& ;#[FLƂysݹ97yAƥT!ƉT:+;-9cߦщUN}kqg`@ ӝΝҮ}g~*CS]X<}q#~d@Ntԍ^3wfs?UNoO8o}vt҃]{3}&s\OuaN$>&DѦ:vL̂O%BKzR6b|㮜ܨri\ M 3#بpM@FZ,8_%P?}RCts2f}$?)PB]PPv3UD!w37Tə͛aYZe?J).N>." IDAT_Zu3hijzg} fu0kZ9-ڀ֡դ|Y V'bodh |8El}aK?/`FQDafFzԶ/wⒹsu7MMQUQօu{Op*CzwBOGFK灣v;S)).UؚXEckGNːn. e0}{6.2։}+zz)Ң[,܊+K'jUa꓊rd%~$l-"FU,M~OqOD~liʿ58߰*^"O@v݄NuoLRYe֧S 4Մ\j8bӡZ{YbMÆ i={.*K,} /_<0/ rrr%+}\RF).>צoE ӯY \J"T9gE?ydmu.,6ZC^VTa>G`E K'=[؃#ROǏnԮB.Xm' f:`kOmr+ab!\WlsAX10NH4i`ʹ7SP&]B㺵ѷvf-޾.-lQ7 ^_T܌剀nqAv6 Y ,6 rן F# #vz?|~72j%r=RTY> xǧyཏ4ֳd֊ xXKf44d,%ӇÔ[y+1LEl=X}_^_8xf2%h܇<<H|G ²4bmZE*p]beL՞$.%sUCn('Ó>rO aZk,Lhf5ZƶIi(:uw x OK8:y_bc6A0taljk%SwWꨘ*l؈Z}.\Ct~1$3=*HW;q #;;:ҲJ/R߲v[6LJ%-/u,9D=vp7}`F))iFosKnKB ť]^*ƒň@w;—-˴֥ӈ)Dd=b8͵;+Dߑπ?7+@on]s<ſ^N?E-FmƿiUEAjì|A/ȎȤ4ְnLor9V‰]@řv#ZIkS0=1YV '7\{oJ8t;*ݴܧ%v^ +kкmkmc}^bе^Dͦ9}ORlӳ5}&sk7 w,섮VcꪙJ*:'1cil戭#nڽ=kզy x7/ya ߊ2aX{6'0Q#:-Mz;.;b/[mz b78zړy]J9*ۿbdyׯS\ً/T'yKAMG++s4q4 Xl/H c.4hhU)~Zßcu uf4VmjzNݸt//;kSCumMiHB /dnԮoVrN43gNKR:polv0rb'0gfDYz1I=m H޽ѳg֣'%] Joe8#WR}\ VT_^#'s˟Px&8tu1àY?%Njjʫ-LֻJ7{cr73i\1},'$ S0l΁ eyQq3Q0ctq2bF~]גNK SN>H!Sn09M~V Mޟd%te"uH,7Qvb?rwM_ېQ{3 r"XsoԴDŗ[]"_!s|j,:K_>+ƺ1sv]|?$άV{}z,=ZyA q=;DddLz\IL}usGv`/cXWy+4JWW3?v΃y[5F 2t2p7ࢰfzѨn]c bo*"n2m'_&P\<{+Wq_YR)a>Lnu7^ KxUbCᨋ}8􍙶j'"}ԁs#'"(MdZU%g P\_? x_;˂IcʝdDsdV֬g?uzj,uT4d2U/MxǝS]_&?v3?*ofW}d҈.lg[N{&9 7e˙/U's6V _uGi_֭>fyRjů\[ڲP_\ K_=vK૕%,ٙsQe?+ֈ9w[bmCSwhG6-i&b^Ąfz|(kfPk_{fLKskF)q*9iٶb&F[bkg%6M'K ~liQ\Q|iuG߉s#z& 뎉%-ڴq.zhi G~8 1;ӗ8fԥ5W'(|٩xkK S M:G -SVM4ƥC_<;>W $Ň0b@KXtGLk_*W_|Ʊ1w[X癣,؏f¶mOn|YY OK>:B'mqAv>Dlf }w:h~/"|=gObHeS #K%E`"pb D 뉵0bWBزJ]%T>׾ GD'L [ykgH{ ZO܋85S1H%)1A%$&HZF=`W'E)I 9SI_^HJ'>M(ƺT'6Ux R_iMS3x//inF0OGŊzzi$V:ʾ^bQֻ|_s~_Rί5Z]eVp(C<$dx(- ʹ :guXRs~ t%yԔoj~z㛒Q&{T^s7'4G޹z>ՋUQfꇾT1sM7%%TU7nz}r\(K~o=2G }j{J fe-1~-&kyr|cFO[2eu@ց2kX˖ԧ[2ekOYja -X#reYցO2e֞0_\>%%ׯ\߂/[{:Pt@ ko([Ͳ|Z/_du %i-)~t@ ~ړu@ցUQQ#ÔCI&FɊS[j2ַͰuh$+bi*櫓{{%a Y{W^q"׋|ix/Sӳ6i6ZNn^8W= E\_@wF[u닭N]ի1f-%,.{ʧSR\%XE }޵j>6SޗfUEfCN'>τN7}8Rډh=~]Ӓ'ՁJ/oFm ^@]~itڜA] tT;o1lC`nPݦWHawtq~]ļ<:j+~}wcCo2GO!,3'D!7KLJ;;+(Sbu/^2.]^v: %QXi=2޾O^a!-ݸH|R~{󳒑.|Nfv"Ҷ)"96B_ԗ"[< u# {MCن)HohL;$e姼Nu@wˡ8\[MaO1Ϟ|ϞڬKmu*-;}uB|JY:' \fOiD377a/[XEq=aAUzRb2&:µ zF]Lլx~uQ%qkފS^\uOk16v6ܡ?oܦXօӴ}+:Nih-^I103 ֊<`ZO[t_t"-K㺵=f0-ZVs̹x8126#=rrţsxOl^tvIψ8:5P3G\깣}c&I¯.Zܦ3;N\$U'}ú N. }U_ItFi#D}aba)VXљ}뷼T ǒpYHUtؐ"̯/>9]7*sYެd%saEyF'GCڎ[ƒ{;rsWݛW>m5Hk 0PkȢ> 7Hz|:Hϒ +ݹ/GAL5U Oק%$1= HXqqgfU`eǾM7VڏMz n_L1z6 %!-;hgMDkIgƄNTT4>`f{\z"0)S!Ɋɺ] %-7/3~p\ڱpNĈ`S&jެBάCZu/ZQw}j%/oBk]w/x9s޻.~'O,:uDtQ|[ss6o?m̸t݋'<ѻ5uۈϑF5yx,Aƚ 3pI덕MBn2K9>d:P)'?iqM'qC*O+>On9-gp7*uqSLa҄hjM36FfAaq ̞ŬY>+jZx@XE<S-5Ht,.Ig۳;<mvϓEgs7;_Saɖ/[tl5_$[/ض3S im%}b鄾RK0.좕!3>~|%ӄp/Gj"v@C" V3u! -\3חPk<@"ous4tDYb J]QOJ22 4-8_ק94-umק<{ˍ Xdguh/RRN;#ԭ,cq.Jc7%ߞ<qR"rп}l%!ݑbYۼeHǕu(e]c:P)OQɒ$WOlV䗎wXN~Ƒw#UNXP@dBXU?RDl턝k+NΊ+X8oU*& +oA^C/&mI[U詩v a ;Xa8? KS*-;`С 4Hl֚:欽PA-'EÏh[p6Aif͌CgJ ^_7fGH gO8s`?n@2lث bpZwJ&4>(nfݯO 9}9:j=||_p1ù]W&Ϙͺ 9' 5MsEYXce |_O;[2v:46gȑe=ݣ?ySytR{xIyY2ko_ޫD5[Ǯ|*p6YYddd#8٣za¡Wb2n[)i3p  W6Mw3'Z%lZ>:={عk;vTl{~l&a^G\vT6*("`~g<ʃ_YGΒY,ߊz$=<#4RgYڭ,v*?1M*ܨX`a*P_5NWA''S4wɩ%r}!xLQ?Fo_CKK2?/CQ=,R^VR8%ցzt:.P)HQ=c(_h&e'½;k?؉uG,V*W>&w sCҳ9.x_UI0u?$ՆgqtL MYq| ^o";WJ{a'-~W>·$_z`md[)We*-X 3ň)Ne>7Q,hkM)ڴ8Sc @t<-.z^ͺWԭP* y/§ցJ/b~x yZ D엥*&{[IUD8!ko vvN^; X(kȌJyh60i/J=fP3!JLwEWF\(F# oi }U" o59wF [jw֬C~YE++U9)}CFTQc IDAT fzN:S&^),e"VOW ;.ڹnTbkPV-QN]G7kjժ{I)~{ 8?©K6l#^:Nm;FYn @Y>T ~SD4Ju!XΉln q|5!/o!fb'VAC>zښb٤&OښG8YT)q˅?#Baejȼ^A.[^'ڢ ݸ*#Wl'9bB(V1bXM] ',ZGBn.AW͆n+BBEK]0ŅܺDT\XEuH eڀt<@1‘`}|,L/E0n(v9j^T14d[~)ӛbl`[У{ ؄Sfp')}ڛhbmS(#`zV5kҬCW#]'m-:z46-[ӿ}Sf%;L*[ЕtluhGߺ#ڸEV^~k]Bԁ_(E+|pYx,F}{ _%@*!",rsIKdb- [kUP\,U~j:AK Kfh3Exbcvhxv! (-_ayb)KEev ׬ba4O qQQkӁ*_*PL咗Kߥ_Pry>߃V/`3rOFpC#߈\r]H %$MYd6t@잒Gl:Pt@ kp"6,2v: _l: @ 5?!-[|: _l: @ 5e۰vS ~'뀬5LdװVl:m ~'뀬5Ldװ-o"InO2e֞0_SZrڲ*UxIFG?s[ؾioDEFP,l1|3:AdgqƽAc'9}09٥ow//HM&5&^ޝ-"U\7/Ii[+SyLsOIwVo\)dK!;p7MI当_NfiOfq.7+M>C*ߖruZStH}x]/ŋ\xlZEwyd|_jhAaQm/y5dsĴֈW)XWJ@C=)Kߤߴte}396\W-;-❼&M[r)"~e::DY>N*xs~BEKoCOlO\*}WfBYK,(_!KڣoJ@^T3;m˽DCW^ru#:P)cOء} ;أ]ɹ>V̋ e͎bz&h7}pp>vޅ]$*{|ƒDyp @?)_= M(c5tmەws=>yo90'@ ?{W/oψǁ}>~ ED=ϱÇPᲉ}) 73;Rj"?{q #xf# 8ylE}ńs~yBN={x͇b$׹#[CαH!MXToǸJz1c69q<1u+񽀫BDgv'EsܸI+\nz,$]y:)!5HxI=z_o~z9vBì,D/ė+ͱ1?K>Yfr3ctVOvA9X:,ExarssQBzJpuEze8r,t b@-tz]Ⱦ)M^ţ4` C3fCu-Lx wݽ셭+@AU'hy8cHHaSxد:vvjYeNJw6\1n*&m؁r>^VTO z#8&$GpuDRzV֩ P-!z| FGYRV_ec:uUsi}YTOBw 5sXY[c95TedK(-[a)m`c3#A %N; CTz?v sa 8#r$aWLA #@#հ. ~ 3b^g`Lc Ffq x[?\O}0kx:80ktqȅ~F^U(93t,K:w }5uVȂ4a.B -^SAzV@qdx5'xpTd9Uc~POV|< &1yQ<+¦iF.P7L S! /k0: 12*PU[Kw/5xYM kȜ 7YbrZ][сVRr4Ossw驸Cw ;O V 8y.:BXt\ZVf:.? }UOfՃB,P~ȥbmECĦ|ŕst.:I׃?ÁHMħ6>!¶r`X= 3ŕ+>`}w=JJ#u!AwD!QcVmCl=!sW&7/bY+[fs1*掣6ϓ\=u\=VBqr8,g!cR.5_q@+@Nq')& T1h+)rtpr9%$q>6 /ɺi=b z8|Q^YpM^V8ضx<ІsL*=eP` x4T]X:3guUs xK!c'pM?q&R!T JplbKwŌM$m~wA ˷Z4zU?b Y"k:t~{ l$'{يia5)Eٴ kA׏7W 6 bUH m:+΄ +Hƹ#v1E9L҅D19 ilw@=cLQ=D)Q.Wo. & Oz_Q=,#8GGUرp ~SNI)0 (cMX|.t{` 8 +Ku`P G{$Ԥ(v~;*<oog`=gof aa]ūplX f~)ݠ7ӁVuh16]R 6[EVICqaq@BH rѭZ}c`b 1cp䜣0\1L \\vIr \.47WQHf i;L #C hMgZ/ˏ . CGˋp\~KܓlƊ{sl Eted];VSg"\?Y,a$ãNlIvؑ8Aauy8u,p؄|'a>;@$J\<f8CG lYؕ(I;Ƿ1mC 2vpyVWcؑaH 5֬ PR"nZIh,'=Ѥ*֓`YLژ01%]+ c:tX@C{9Y\^!m*d ?~x*W.i̾_1پl[$W^5M_o7 P`}???ӁVuM$}Yg0greggg:ЪI$oPr]W(< (VoDrAa߿V{qV#Є~?Y o'H q;r -د?"H1lO=VPr_S0 uD8JܶcMtйs'Ե'A.@c9a1qщ`ڷ %c GlbDd^y}j(P UWk'~ (+Ƞ$$$ccxMy,c )]堠gnu\c }UYt* ~8~!7ۯy-}f^W7~vs9w(EӠoܲxܷkx 1Л|Jaj%yȠTi)HOKC^~S*A%ґ 0H|1.PYzuQE% $k>iE;%ϡc _',-Azz:xu-K]QTR-LR?7>VM4RO%L| @ 'k!Rt^U~@C9Kp~SA'=J=|w 6ؤؽ {xr>ڗ/ (yc1Y[2*}"R֩gOrr ,-(B5;5#ud1h E8]9!'4T02@m*JPTVqN`l31U=4 |׃Z# % \^ݬwdh<^Q )-c1hS>P35n\Ɖp[Y)e(Kƺ]Q6;8o=tTf<|Sq`L-W>]p&*/(w裋Pm +نW^L]52=`|#n޿G1yx_6E@9E1ʕKI+ːuo>t掭[>%C^p,/l7 ??@3O4DNu#E& I!I!&L8z,KHNf^Ԗ]| ,zTo4QVZYˁZ5ͳ?Dd&!_&?GfB nӗU;/ \lC36O{m='/ =AEr}q$Nﶃ%z3!))%%H5C7-*.mEW)\O)EnZ,)cl$ $cK!-!+tPe"*PK;ym5r|"[V.[Ykh}س߉3ǡO_ceMIOp*rp8SGzTukcygrYen&a^WkZɎ#rcEcݽۊF}p~":u[IW-P5swU@y{Wk#pyi3 %. b鸵y uF/ FY IDAT$|OS}`1ۊum"d? lKSLH+IL CE/BLqZ0m'QLL®bgaް^?/_ #)sV`ٚ wŸjD'Pgf-۶bӦ²y$t耑kZ~_~=E( Ƭ9`;m4Tkx^=3MQJymMU(|EtUYuͯ>d Vm_+>8%߬|f>~{>_/ohIf;6!|^\ `0aIEY"J~=&\-OQgEL_םob ui._@G/l=턼l: dqWKs8&N{oiߞatZal)zb\p.L{1-?,aha"j"nahyOOD6'tNI pn PaS}mab)%J &h1grr9ebb (h|p` zIW YS?e9e,:x~>wA` 讧5Ey ,i8h?;u+H5 Ff!nG#[{X8*)_^).^R]AAYƦ0遡 |\՝DT *>twY~hIoGU$e8 ^u}i 6o®A}wg.FQs$[P;q ֔{+_@d?X[+boYY/_5*z CFͅ={.ԐzwaϢɁfu[m k=ԱI|㛟cU}4M$Pq߉A^~um|_$btstؑJthhrةOFA_QiWE]@J;@\\?^X ҁ CY/^}e7Omo|3&57Ey /8~v3II L~???ӁVu5pI V=gGE#"rVߧ?LELT7WIُ L1`ocgi12~033kӁ6 mL "^ƽ[*bZ唤pߒs:͕5w#4Ufn;yIAWZ ?iKEϽ_c;hMĺk`tVVt'@['{cP3&C_ 怜[{8alv?~Wk9bC\l\̘2&Mœ]*u f`ִi0a;Z;) [N&b+}-N._rq7 f^`q`aa),Ap/̌ }7 ~YN#Ƕ7Ȍ*%N˶"25U "(ÚE31ǖd:FVqY]?gy'/ MvO(KT>3Ss8v-R7W/_QJJU.:WP |x9d0i:xE".> q°WNb(d˽vCuTU5]we9e/k%nk.(ӞP E?@Jk$cR 7k~Zjj讬9 D_*Y>Ut= SvazwHv͛&ч/ Ȼf+"<) Ϟ!%%)ϐN:[7b*qn #.kgv57_tꊎ$Il[OvW{"m=`>+MD@Xʩ Ůfcq(yӭ͡Fwj=a2O#7'c+B%PwEVzd(VUX~4Z_^['1x TUS#'ţ8()ms1hPl޿S /_kpc<-+Rz *PPPP?ad`%6Fa c['7%W[íl'X^hOU i#vyEYvfL B~Kf,G%&~9HOMCJ%ؚ)Cd.SZq`ҽpFA$;C5ec., P,G5=xMFyЕn.- ||IWƹb(v)E;/ s7O.NML&iY^jAf!NrrAdا!XճGcʲu.ױ(L;hp\ww`.}izj:RamHЦuE!/.X}ť:/ S~:%`f g3 EAwǡ`Y8~à D' Sk#* (]bm/oFW h ari(Aeh?Kz˰kz_7g7|UC C@OY y5Mxscl `b\8?sǒ+[} @'iEL^|u`4n6iRNa ??dӺHEI6~;`.]`0|,;-@UA=Ml(n% lLoQ &g{xə‰yƃu6 dSѡP송 O!ZlF <x P,-אV۰_Ю!ColqIhT'e#93iiH7a6P]5b>z"% 3QZ5<}ܽg_lwl~hk{J|Uxzz=V2]8y|,L S.hs }] \dn sлkG 7@{īKLy{5S}`^/-G\`onQ0 Jp|VJDކFL\)d%_ۿJ4eq2Xa6Єu1zAd҂ Chi9%N#icw*`\(¼/DՂxۆv$h^i{kKw.&YO^C^rU }kO &.]εs~).bXs"+?k.H֣<*~=dCE^Nۙ@|:%Z>5/7 _ ~_`c%b x[Гs wO5^߇/۱w[tď/}ӯ!Mn?*T2Q[]CzBrHgKՃ*JZwzrRp x$1n 4O0y0,6#:Bɠh^>Jm =|1I:`* Jc6ջ>Hh3۲l.ۏE|BWONWuwG|z( %\A7W!8G`/VL5G 8c]O\Y]:t:@JL;GRl u(yvcdyMVXg[*~~#KO;ǻG碻6 =\?^!93EnaG.FSES9kyLFS߆m53PL`BΣky[`FGM-y7.[Fu %?nqi+׿cj_mNN}'W)1x.~J>j+bi?"b1L\=" 3CFo4t?-LzփUS1E7]KxxO6YJoL?7^Iu#*KJ{?Y"55RKr"`;nd!ϮW_2QC`=D#SoЌ\9V]+g x%2oO?C.ƌFb a5.(++9! \T'[ib7=F賭HɽСc4--a>R2 ~H Aɒְ菻M3-ֵ[C~tlj`9v,!od%`~0;m~<)_iKW7kc@8޼N&&!X}-7_Dr T`,s#8*\t7WVQӭ`02D2,21wDz è}о,(hQB KBħYf}H7 /k c%T ۣ"wέH1)lyEAДG ˭/ejd}C`L Ì:P`K>4]-ֈpnQ">v_pFf~>_XJ܀? QƪwQHQ=nPRCHC~~^塼X<'/lꍞ#W#"q8+< 1v;˹kٟ%1~ }O`(aS <0c/#]NWe~THSd{XprFNJ&(׻z^TaHtU釀$G\}5v,H4u.r Q^$})N/pmGA]'[.@ˆ C_+,9'Yhb""-cGo[%d>r1v8ӡ/ ^\8,UcdIU< 4ѹfl;"^PQvc?< 38L-y8A*zx/B<־Ut:뷝q39.n}QFL /]GȓpÉSZV.f:F1NkZ!쫄0j`OX>B":(Ǚ#ۏ_`u}(Ȉ0𢲷>?U41 rk X(Bb5RJEpȡ &>+bഝͮyÖB?/E5OFZ%| p\=\< ^ُj f!NEh>P$')W@0lII_NF 1CWo7oDDF gNᖻO¼/-(wsyqr[\)}Mwm7X~OeoC\_\v\i> 8})T[W}3)%BRyJ?z:0N{߿Jc?==qXxzkC_@3Ybܲ7g#7Sk[RWOz La={"t ջS>/>~Lѻ`tt`mq ƽe1uN4<|vpHȩ[>$'[O230k0%(T ꆅVԄ0A_Qʡ;)O7UNJ(O#[ }t`gpӊ`Q/sЩKO܀{]%T$ȏmZ((KǎЩ6G/Dw=b*k>G Jaw!4{RAf8rŕB4(NıKѧ$+ B_ Y[2G^S[S8: $,[(\jf$UV 7у譣AF׏7.#~AE.^s9L]zǦ#x)5^ѤsZt( +쌋BWQxS7>wi1t$XK! =?He㑏'=SF~ʋ(Jnd.F:/AxJ;P@1~}FVwK'II;OXDJ==CoOwZs^7&_PG^LH`\EZ#H#CTX=ϐB!'~s@PhM 2aOP܊+@|]ܶ5y] ?cb_#J ֿ#WΝeih w\C>=6i"zڰ{%_^$OwKCt0.9޸)MCcl#<!(587Un›I K lO/'O Mϥ+).J ԋ-coJERru~pq~yodLO6zNV7)ONѤd O lp1`:t SZ c~euY{L1`ocܖYL~`ggmLۘ5[cLFLF[t@6&mIt~~f1`:t Yc_5dduY{L1`ocܖYL~`ggmLۘ5[cLFLF[_TX`VX0`:t;Ձ25M*3 Y1L0:tzӁ6 mL:,.&&033kӁ6 mLM+ͬ\_033kӁ6 mL:,.&&033k@ׁ*R%C~e>{mn?qm:[J\Igf~:A2?/!p&n_sĭkW>8tCd ~(/C|l]?6w5?B^np2k.???Ӂ6SSᆸBիW$Kdg.bF C\Q%ŅxE}L\$i)ނ??mzз4wm~a~.!=%/_@mMpL3tŋrX `߸~^B?^QsrLKA#_6????Ӂ6tr^j|Lwظ((*(7o `$27tw۱K@i" !9i\-}?2,ёM&f3k|` ߫p _z[n2HП:gik7<4QO*pIh@T/.~B=gf,[vvvXfN],a/"q`m?8WNKqTҾYir*m7 *K|(V,_װ6s ^u Yy5ITbcF>F)>^7aq_+h9ƌ =m (y+$> |oEY E75=~fܡ C}-p_Y-C< .'!ߥO2$';VNsTS_\b ̲cu: ,~9 +ڷ'(; x'L͚}(,AP^6P+Q䄗KG7@MQgģ8ȝ՛EϣaKw|6*+y+c’ ޅi8N9|tM@=iqs(ľѱݯ|ZYǘfiKB%lCg0.%Z0~V? @Ougr৐N.׾D& ]Jlaaa mi^~.?mz}b9 xѰ:#|D|qptLt©'I(/_AC 7@Wss\bsaԷ!n-y ƚ= Lq <}3~n[fggg:Цu1Qu> ´:! kVpe$;`S!-~(jb쒽(Z͏LO[n! .0yQė -[w\TOLVvf~*ˑ?]l&~鮅8Ai) +;Yμgai_wÃ<%ͽ lAUw.zx<~nsk1WtM@=Orzu|"aYPSe.F'=%{RR!R0%# [CR ,m#.3릾}ymS"b&x!E`-%X?mz3Yk5B YJcz' +-FRT}}Qw-QΥ \Dx M6Ig ҫyt@4?Y4ΪwQt |"6ُ|o‰Q Nj~,GϝlwC=-Mq|.y:0Wjb,Ӂ1(1J)g?&o0]ӓa*3Y}LڼυY<K?G).ȣzd1ɕO 4~ 6?ua_|d,?9;(bnN^n.HKN,+)s()Gvf:e ze3]]>~6 +X)ؖAxq5 ɽ@mQd}t p޽uIQ7,oq:JK7!AOB>`x 1 2 3 0 8 0 609 666 1 2 2 0 C    #%$""!&+7/&)4)!"0A149;>>>%.DIC;C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ME4-:hĊ`Z8 Fr' GR2NMRhcYK mA8ߥj6RRd&GRA#$G'Zxf};P{.#e!JWp89 貶ߤ4LhAø8<   -ūCp"|d$d #&eq{oXGX\d}~s֧—6JΑ8m d|^9D@Gր,ە G09 BA HqUgø;m _$0 n hwWWv+mǖdt̅y9U+_ ClEvc0۶&B#rN3@iI$zmTVasD4= C^G?:^ c[O0΀:5_gPi-ܫvTc!5a@iuX5"Ux,N2I= ֦ T'#f6oc1׏eVNCskj-Wޒ9M=s<I,&s ,jc\=i#n&KYe @y2$ǼODK#/5FBJ'&EL֗H4s$=`## (5ea$ IX`VįwrNr2L`KT.A?i'5{So )Pdc sv^zQe eOs0X@sN2I33@z`/,.%7O$Q<34eY-ݪ˨OTG @bIxs=+Zgt?ΜͿǙc<}=+>l h5( FH"ۀ*[O Ҁ&Ʃz^=AtHod qPh7hVM=W8Y@U'.@ U;FkƐ9Hwbscfxm> ?V+hɖ]Шxp(O^ bu֦͝ |h%E,La$I$QOSM G22#!B)> i'5ܥe1 "BB`}A^XF)l`*$s<K 'Rm,p#_jR?Tx[83^o?ҷdbW7(=xsּ xQѦKkŢ$ ?7L:{Wi(bŒ+vKb C$gNs$C`kw%wVsV=цn2kA4+|lɤ[#Pb wo&; mCy@.Nn=1slsӦ+t3z[]vvK2mAއ 9Fsg16Hߜ ݂;cJ-5yE,-`gLs֘(Vĵ"Pp\0F W["][Hɺ%cTqw)yn$B] yn>my-m.ϐ{wʼ 7ſcvצ=XWv.*&_("_&3z~5R mʹ:"Š(W| It+v"xHv4hWDT <@ Ʋjx-/\P2B@_-'p'ڴm5ywCE܀N@ = Jc$7:17.L؋&=oc~ζbCNI(Au rH,#*-d9 ^H{)e[eèa@\8!#54%ݓG đ: t07gH=*Cử1-F$( 22Ĝ@,5iFaioH $8(Bu-Z5<P[`0X@dd:X[/Ӭ㴜O͝rr@œ ckCT{K>HźIEpIʓpsgD-4q<^ EYc$(K!k:S Fxj O.ỵn.ë,R$2TAoj:l4]1R22h8ҵuV+[VHмmY)8jt= OEĭkk DQKc¡(?xI|C;eEeUE#P}*#%Alz"?23`{  8q© U;vI\&^yUo=\S U@3hHڻK |dʄZjuV#dɸ$ѱڥ[x#7!ˀHNז& c\ ;ލc!`bCbQ-ie1XC2PI<e,:'x~o&kn$Hf+I< c-*Ǚ$. gǽ4ҍ%V˳m -ur@23=:wp I_c(/y'N76> <;OvbijlGrhWMf'h\Ja\3'1Υwaav~Q K`g 1,aۈ #Q#uR2N%W|`)X0 ?κ"?os%Dru[>zQag◌ k="ᅩ1ׯjek/04,y`y⁥r&׊F' m ߌVNsKy{%c>ϥm]iEhc߯jwYkq6ś82c#G>RXU3xsF;>sֺI^ @V^iO"͇LdqI8 Xk4aţ;dq~X뗚X΋$@o0!kӴ-wvEo(ńv-@2! Y'c8-߱>pXan28$sVƅ P͖[b;a%Tr<ד+HJR\t=_ye[wK3LR@sӜNY׈LK?#C$A 3qwKC-$ t1k^Kki%6dIno 8x+g-. ;w/č  n.rcU&$dp;1דԒL#Exmԟ/ׯL{\ Eb(=1Zv:9;~sրI8# UX A=rk7`goz\-b"KaI}@⏌#SE1=A r*_|]#1s( G$\G|`'9AТ[&ՙubqid|t*&uTHTe$ /|Ky)  I#UdN-@LEb) LlwbH>%EJe,yԟݴW{%Nk>JIYBmöb09{rk~8"xuڮ*bj"IY#<z~єT76#0.yҘ<1EvQRb]3+ mrylO#5-T4s$HvmYٜ!,dT%$+:`d!!yjIPa$rWvq8]+F$m\w#jCw4vqB#NC2< :bP ;sլ 3o, }?:1e32'b dT*,201c9'wc*F*[n4Zb I%F# H$!00e\3CuI!# ӃMً+̇{d#`sӞWOmmb+-D,Hg@t[2 Ғ~F('攟JR0HsJOJd 8"4<g39 nؠ6Ӗ2`U$Idz*n*\A$ҥЖR状a a-ycI4RBZĨT@/LzS'N=)͸v,Qn8 E6 늏$wJsҐ#*}qUdB3~adfb0vHJ0 M>Ư ҫԢ6ژcg߸>q!Eеjͧz~LzrmX5==q^϶)m6??y8'}t--0=pcM_oO\<|f~צ2zڞnqZǷqw8O\Q祸o#RL}߻錞,FfXr!o{L{ڞ/oOO\T,pn>[1jn#l ̝A #\ 4v >-q{bT,cee}g^{b};)c 0,?I*c~`?^?؇_E6XOg }`,mqO\i 4}6oޣ\b&-cׄ٘692s'Qؓ>اv&r)(շWvy?LZzߞh-;mhL6=hݷdϻZ \7L]#R0$;dkϷguZ $ (ʛເ$aqH=Aoq5ψkohOAPz| |ښ$QLhEEM"fi``s R"ٰqr &2=z튷-ͩr1@ (rxPi猈X2mPH=s=crl˼MppNZmB{7{ [B4;u!NAA'OZ{]F򲃂y<[[)-R9_b ]TBy)}^.[ҥ4["IBirBqHl6L6ӾбVsߏN{&+KW$H d|TxKܒ Ny+H]O-G>>k546c$g:Nr?*Ժ-VI+sFp}y&MQ+y`f@' ^|ɽ.8 ,DN}IYP\JH0z}ǦEu7}6 usan `Kra7`cIHǕ h `  Th")7[.r 'R,b;1ӞbC000Y88$qh$A%̓ &3֚@\ۄ98ds߁EǗp6 szh :(qAxp;mQ߼N>Oz-Qo }+TUPr$ xߚفlџ{})]y$z@rqnI$ctBH4*8Osu-@JA't4䌓ryV$\1?`՘²3i21児98T^@A3ҵՐ2 鞴hAH BT~ua1=)ISImzy瞆\rNެ3ڀ+9`j(Ue*IRN.sj= ciXX -Y-#[Bm un$O&Qn(T&kR5 =>Eqx$=⌞>E G2.=c_ܑ8ǿ^Ԣڌjez~Q2zrmj[߸L{s\ǧ><Ld϶)"2 _x#`[]Xoܭi6~d8銙5yMN@Ϟ~ON&mEl 6^%iA:ph;`uGV{ LLNřqq =}8+@Z,HgOŎ|&|џoY}c;7,yNd`=;Qa6KtңO44މ8ϧ?gg؈GozӉ1q'RqI=;SM ?1\b-y"3ftY9r;zTS#08ӈ#8`ӊgy__l?б98$s~,ADكX$N0 ؤj--cُ^ϵ2mHu/9-c0IUꄄ!>ɌҴ[}Owعg^$ϵWCdʐcf~-7/\߳˟/|s7'dˌ4ofϗ>^MPxO.|_k<1up xêJHjMyv\s략vzVXฉcyy&tKh-~2wBeIUUv1IO^Yd+ @#$ss$*,EP㑀Tzi;[I]j Z9OIHʤ}@'Rn<.Ed`9<8[M+ANp3䎣5%ݦ$aitP% g'J]u#1[ ss#7緦)i$V[G9-(' }j]:3#GZLVxe.,$nOqti=/bɭ,n- $$dv>/cRi$cyNB;G& p[0=)-'֠1E G,."G\՝gTRr{q,ݭ˧N,xXK3GarG/ ;` gҦG1KR͒F]ztSi ޢ6@=I8皭sm ξ{Kr`<ý(Z\ٗSluy/n-9 KA;pF zucwkw!bX[A'*Y}:YEn\8K+Șm29;d*yo9orVGuhż$ u=qҢ[]&}<[Cȸ̥+N=vg{rjG {vF@隄i638ZWj./m@h:*8\`jdĮ c#ұMI*j `l`9 `;8DٶRƅ'h$֯]B5gY %#sY#xշu%SsW^ݫx]vdnD TgX0GX"Hlܙٕ'`ibHJ< " o=2A$;0*4a3@3ӿԳ3!'@z)hR팻;؀qk[oqX$3\Jp* ?1[1iJ~Rqw*-œjU$ Xy0j\1V, T6`WQn}ɉx6Z;82ywf鰱}>jcvǒj-"hd0B7&Jr=xIALnaz"(ld$n;`Y,d9)tv( hlEʰܠ)r`u튞 yyܤw1.wPCG֭͜gI1ipjQ#D0Vye`u AIƙ XlœW.9ےI=A `rLT UϡMwlj0#`FHYNJ`AQ3n S koǷϿc>~lCG>_Ij>-1m[p?8ǿ^̆Չ{l/qY饍X 88'zqB-Bi}}~[vlRé 2PviyN$8'\qS}>!y ,ygdq:7)!%axf&S'2pA =sӌTtZzq^lU-UtKx}0)8I/gH)ٲCp4`sqq/n+!eҸTXfs~ԍľitXyۜ}qK}eg3'vF"a/ݰ*k_` >( lIe =:bdwƚ~{sO(c9O?^>9ǷJSNy?hĝ$N]e N>;}R L&zpI>§>'gNzt[MXZ YXYsONKOOŖ|IsON拔Yɳ(;<~8SjFةΦ67'OD#2s.28' b@ ˧dXhG:0 FڛZ-M/A:s튅1m/qO\bͱfՌ?d?g#~q£~ͩ~n`d;RU ?>F7Gjy/ o{jЁkoy)߿8O_£k$bCw?8ݿc!vm`ǿGͻuc'}j0.!C}=ǒ{=sLi"D7ſw= E0]]{Ldr2b>^7g^́>Dssj^n۾!wz?3gݛ>_z57|1`IE I9~Iϓ_k<98ᶣ[`2I>'mY7 #v$N19i8T㷷>B(:1w$rػ}$I?3) `c UҴٮhm& 2*09\#^-[Xv}E;CA(]APr;U&8$Ϡ ?\5yGaGZ,;ژ0р%8=X 秵lz5gkh`,A;o)?f;u'$PCu#Q,D] I/Φ \ tIkff` ֕qj[C#kN0MDU, 9*[-#@oB< +: >LkD* p0*-+3tl!\ 8 `zSYA&U 8$*L P1#B v%0N "Ÿ`ҕUݜzV}l1l+S `Oҩ qb}U0Jǵa]Đ2{ӹ-`UgqWn\1+2U*p˃MeXr)euBWI#mxR#1 8>ph`498=IW#"w ˀy-Jx$=⌜Z&N;W_x矰QWs;XX5=q^ϵOm{%${l71>ؤX`GX`ZG{UԓL t:X9= =sӌRlhlwI`KXN p~$<O98]MMlPĢCc8KsPYtqމ89=sMZDH:xcgݰ:EO`,|F%w̝G9ڬƟOy>$T 2~A'wx{sғLNO82v)cO~|I'QjbxHt4 O\{t_aƟ;sOa5/?y =:c/́e37;1`Ӧ9jfЁe17xA1ZV&ϋ/|=1sJweͧSc>vӽP>!yN<2@IҵSU?b_Ǧ,{cP@'̟d$b'1hWqӲX16Ļ>y~%OJb5'v~;[צ0:m@6^%2M!t6=:wkx6:v,A@~IтE%o6'x8$s@u,(Ӳ,q϶*ȑcΟ?|_$sO\+:Kȴċcř0f jd4FT~^϶*/oo'{'}14=ÑZǷ@ݿc>8ݻuc'}{LdAoO\SLAw7܏#P-8ݻuc'}O}7nGϵq< oxݻu錞ʱ"-ԏ/}1O<@s oǿHf^?^1P80d1{1bb"!Tvc9ǽ)GuSg=zǽ)F?gRC q@`{ӝnZukkmWBQ1O+,D1}N1[%I*N@9M+pPJB+I.Dg "), !SH'9sSeo6KZ dPi#ibрǹQڤNQ[ S玞Y汚wYGf%ьc/=y*};Mh^F-F ro#ӶlJE1΄m*4k͓K! 0^% ~jC##8:vvȤ< u+}@7VP2C䜜iY#*29 dK2(ho5;08ڝi]ܫ̦xX% 8'unpy@(( H΁F>l:;yGJ͞$ALn01 =.Kxu ?iy*sE~n\ I'ךȀ"d [֕@ 'WBrOoJz1b0fbQ2Fxel׌6F?:@LhM0"$lHb(wVCdHis*ML!cb)P3RӚ9$ >,rBc0W,JI'.8*<:IwbְtWV=5p>Ƌؑ I+zWgw HJ3 & hsr8 XS$y qLpFt{# S42H)E LMʞ𻔕ʐJP:W]࠿q\5(GOly"lCZ hPZۅo1׵[]H؀,5֔Z9`׮8d}Z.twlU7@6ttly8's1HCp,5iiYC)`y+FU}ěx؏D{vTi_ 4bp:O9ڤR6\Cqc/gc ZFcA0GKd|_NpI5u^#qCӰ'?گegF͏<G9V!\Yxw?!ǰ'򩱢'MMH6~"i>'?b=H >vd =:b-~#?AϜg*j_c'tAϝ:u'LQb"aaŇ >p8銰ٰ,FexoYsn%ԅ~$?9=:c-8,AϝgNޓ$P&>306%9F-O'c,|w]S?;v}d1H51l1k17;w9u?Z,6Dp>l{cSU[x'zfȷO1j_ ~oǶ1ޤ]X[_ ;ch>-m|Fd62v=1s&-6%i 69'/863VU6#OŖ;>2zc}TZiA/;ޘ닱iXIdO_:pIӽbyc).>Μ~%8K.mFlGlqc/}dk6}HX>q~$)KW9 g4ib<cf =tF{Ld R"3gsqo=%gf~ɏ8/8$sͣ;q ~Xݻu錞z &Gw9Xr o7zc,7g^!hx0QnO_˜,,|Ovzz<%"I\wY?|sׯ#ϑsׯOƓX;13y~f#ϕlsO 44֡2(BL1 {Ė7l^jkH'F8 k=NPa$a烀*^p&oc"@D!0[pxi5RCu{UIdH!g{UCvQ# ;]x$`:iUBFsGnJ$ErG )I12yQ|]RIw"]a+I"3냌?m۠[Roiip@FJ?nPP-HV=9ǯ5H [DsP mnq*cUϓs5Y=q`sץ jěRբKTDl!<cA$М1@F EM$s"X\2tw3'=rA穥ef-^mI̙'\+I#ԄĚq Ȅ  %{BvH˨Q 4ͧjrI'p:` =3So=)zGm&Ǖ ד(]%1:H&rxJ݆ko"p~$?+*jc ?17??2tӦ)}c!i>OonqҦ]WCĦoA'̝8$V*D`l{cO6#76E862zc4U0d'1j5SjA gA=w=w8*Φ-L1v$j\jfg3/6DqU 5f&SdyNd;zS!w3Eg#-Gg~qH_Iwl^Eo_3 B<u`y+2i݈̫k#~q¨͕<(;?Lg=zǽ!q|?Lg=~{?Oצ9QDGw՝zwzh1mO_LYX1ϓzKK?NM &W!gf3zc޻ ݹwF (cI$c$?2l¥D?g=~wMQHdR>1I䚥v{jW"M RX IȥH7<4F$d֨cc6Vc1ŝqĜc5[I}JR! p108aIupޥVm7LҢ \L7.ds8u dFfHIsɪZ ,g9$rp==jG̒=m*F1V\]΅SC›s˗fqOӊ{*!w1r{ 0:Nyij(# SDh巸-n<TVw1%rTYyCc3ӓ~TBF{I#]@.P$Ǧ:nc`vEgWx'i?RիvC' $-!(0:8:{Ҥ`,4`\jn[4MjE$*RcdR*-)jUUC(14!p) 8'@+jGB)2H v&J 't?JŃ}0\_cR3&:2tHkE`v0*9R29tkRE Y@"^\ҩ\W9AZeT*`Vުʄ!}1T\c S ]w@= _W"Ì<@)}c߿|+CLMKcM<~ş49̜gz8/j`=?Ϳ튵iSZ«Zjp'}`vN"ڢӹomK'= ’mo-b|'ӎ|V@ei6 m8vϵEm>u'M0I9:ڑfv#6^%2gq̟\~_nAĝ:Ӧ+xM YqJ4@<3`9<\Z'a6`yC'0 ?MW5Ʀc~&gLJ|>ޓWDĂo@ϝgN$銤!akhv:ۧzȳ2ŀ>p~$9'XXZxfXYsnmuOg17ؿ>vc'LsS.-?Ŏ;>2zc6YoLj>~sON#X,f'4XfzbAiŞ,soǷN0܁m1(LYn}c'1k%&o@ldőqi.sf?~\eǦOLtb[:X@/߳Ǧ,۾1;8&Ckͦ,w۾1ӽ`m- c Zf>98$մ[D[$Ro=1ef&Sg͗8> =:csBZ~oyA/Ĝj lm?d1SV[l/ ÛYozt5:PR6?yҳn/͑&wvM<3II5?dKl?Ё=V}֦lA6>!;C0pIU'Z?OرoNکf[.mٱI=ثRj""^9ĝG`O\b~-ԭ$6o?uh͔q c~צ2z櫳,M+^?%۾--=ϑnzڢwXIo>^7guzdخ$)/\&%؀-|Cg\&#ȋYٌ^q'ϕ랽8ͰpPٌ5^c'MQ]*IRy53;O^1]nᾧHacRI'$M cݵʹ<в678SJ(аV%2\1:˗SӤѣ3ܰ$ Π=xhx1 pnP*9' ?o򦁋G~zOn8*!M"8RɅ8&^bIx|9QO5a 6S%F <Nk++Y}rлoy7a73hvp888Ei2 \F@DeCsNsVo$guyF ]do1m`2OA摌 #>\p\I8zZ'4BLp'WnRװZP.ca5$>vlޟ{kym&:Fp \.9< `g s,hws)$89RI$) òl8JJ6RwA)6oba#(kqy#PX#4a0goNSMAeYm$$HjϹll8 M +eXK2E[`siV2 8$g<r$Ep@=<~UqKX-$H=ANMJŤ~eeA,b q @⫠[e,NaupLizVլB|\i$ 9@qP<µmb8nQ{O\Sg[!{֥Tڣ֭2Ƥ:HY\mi%zf7*G$Q1@A#sQ4Cذ櫽!5nKϦj^Av(lsKozH" rH3 9#WްmkN{Rdvp@M$lz"!9c`w`e~^-AbUڨŨD C iik(~qoA+WÆA`Rʹ\M*yEW@~q Pw")׊LG50!VQMBpVk~4"(J?*Ć+۸ ca$Z! f)!Ђ9Ԋ5c+ҙ,61qa NQ>@< ƄC9Ap-S-O{S-`Zsc͙y~zqRYgNDǛg\u{bkځ]TyFǙ0FZC`ƚPqO_J].l?ygdqE|Ë2m1N1SCDgǖly:1>ؤZ[@Ee:xy`ӊcbl5XLdqO_N*VeE 7\yN_qO\PiIdZk"AdY0 ‹Ua?Ognqұ,u3;HpOsҴcMg#!ӿ߮)Dz'>"ga~_NpIZ,Egǁ$ٍ֧> 3??y~d? -8iMq~d9'J^]ޢ#1a<2:Ӧ)aq`~G:0 Uy/̢?aE#?uc^~ld&_36''=8R{[k`/LygΧ`u{b![smL,>AG$*qs=ϔF{= %zYsf~ˏ4/8$sT "ۃ}Lnzc' d2vv~^Ywz?[Gql[~Ǿs E"C$$yzc"/;Gq'W=ɮ÷2·P﹊ V4nI$td$(˜?ιkѼ%!֫."D" 'Г֍:sk KX|38bKvoYdmAՙ$ӑ-c̫0r@`8V9_TH6+sFB ,qRwii%fz_MHJD3ږ1=Īͯ'2ICl "; pT1ޔew"DኼO\qU_VWȣ%A6 '>crz U($k=P[[Ɖs*_$}IFbX/BvnkD` |J#̎8jIE} P㙶Ti -*g'fvO}ssyaq$S%d=9#4`Hu)T U,9㩦K4WaewVa9'9Л(yAWR5ha #[FKG2;꜔RM] [ao$ oq9q:O<0i*K$,#F'yNi'>d+$RM#*1}iTdn!(\?\Rw{I?8 0w6~b}yH=%""ƙklI*N2sp*ͩHhp_s{qB)&FeՍqPI _CNK^Jw?nR[yGl%_AG֮ y$ T,#$:A泮lg9m"o%F&AG~GRϘ ̷]Dq"2G `KϳLjZBD Y"<72 'Ɵ$k眬e<, rzzYj H{P8P9(8l4< 86R0n*р T[Rі71iPUtŌ㡨{Z$Q:/CڐiS:.Hd >hΏLd 8-;VZG1p;wz+r mʠcRT6Yu p2A8t -EFN(DH)%OZ$#>Xq\'܊k%'z{XzU0UAҚ$]~=, scwt>|Ol8RUL!zo 2L>2q &g5c{[MpHv>?y;c}N:Ӳlœ7 N$sӌU*Yx4,yOG׵2]YJ?_ΞEqz0IE&["E$go=sIun-"3:gzqaŖ-HG*f8+o4Oxy#`u(3Vx˨~@/϶*!n#X/ < g=\U 69 d"܏8#G=qCp,-:-}3q1ӊ`U]Bxb;l#jQёB~ wjF_/P@Gq~hR1|GP ~- ^q`(| $yJن,|Fex *ySgca&"e|y2p b8/d,͉"`wȚئl|Df:~N>_NpIt;yOAIlD"b862zco.se9&N~O_"^@&ܷfքO Q}UUţ6&&ԛq_= =sй( ]q'6_y#qZ zِiZLdqO_N* wi. L۩qG=sS[xtΜO_jΖ#g[kBGو7?{cv#+^cf 62U;oϧMv76cN_q~$타OұEkAd~?xdYvlWC6,6~$3gaO;sON{~Ef6'yO8SDȪ(6ڱy͠AIlRIsuĿGy~zlu\sgrN<=,$[n`G?ʢReDP`rOnMLw{i'14.s]IPFca!@DU9Ϩ&Lj-/U(U`'Vjzko=DyNL>Y+KIs 11 Ur| rx ["r\]rn2yb:{sWvvM&ڰ[[bBKNzEs a^=60$cp[*VכMK#@C #uWM̗Vmj4a`,b0ysoJqNV] ^)ث'PKmD 0I Z $C%3=Ԓ=̋Lxd14`!`#-<>2O%HKKNUʢh67+ lD9O}+KJuݢ,]9FJɵC[D#6`A2zU,ociĆ>:Ao)][]Xdr C$1ҖaRiK:qKE_+c-#{u"d,PNA+vZ[Ռhe RR#p=EgvJIGIϦx.F1'! *A sY:rO+$x I7MX[vYXd`~N+2HYX;ƒ*FxBXHn])$IoEtM' $:Cߗc;s>f4Ȓ6"@"2sL,[OAڜ%-oi`dHV4YaHPC$9'#ޢWjV3mΔH0ASkbH/SڟUY^ W'*c$ CZ袮嬤CvNɦ52; B|D)bOF{3WRkC8IiS#)Xwy&f9v$Ռ~l GLc5-" fȸN,ISJ.]p3REhA9kE,|V"]ޓabh2=+Ȫe [CIbGfYrV䩊тIhp4.Z0HrUs^qh)ʂ1XZ$rBORdp~k-cGjFNGJ>\S4mPqW5ZKeEY%zPiXGpW|Ǔ$ePΜ$ҸĻpEiŭ/0I8Laѧ Y'NբΖ᯴`NŐ>q~d8jEY<OŐ>p~%G81ڋɓ?<>MdplscdO0'zv!vs1&R!U6MĿb>vӮ=wRЖsc82tONjBsi?3C69/qӽgO Zbca͎l #2 _.lD&Y\k{߳m{͑x~W5aeg%70|?lk9jIÝ?/A3gQ}Tm}l4se8/8'zv%gǗ.h~$=8z\Umuo,Gؿ ?g1]^ &-c0ذ&/̃>ğZ/ k=szqbMě}ZQ5-|C7NŐ>qq9$~X ĵiy˧Ǐ.{R2)dr9<nU^ $H8!MW=qXw/+A7I'=$3]]+8,OozhhǷ3L2*d=q2O8[7%!Up08<X1Д"D9''ҭnF[2u սRs6FGw&HO=z} }bX=\VҮ4q"d; gQҟ M,I*Oԛ[GQ[vm wv2LƲT!.g֗b9w;$@'qO6d+^=9 c [{qHa 1A9=y5Pm7ekQn>뷑F58')K$i\dt:.w!kyy&2:rz}jy6Fɴ`X0bR?QZAk+pKAOC~oSIb -O 9#^;e(331zeWJ'$loO1ldAީa3- G1Č0ɩZBT%+$` 8=U 1bK> ?ϵX2JNc!ĉG#R}=EӨ5k,d3Ƕ$Fsq¬ܴK"NH#$E4rnnw@y$،HOs m@ϘH9+sk|>V/e0\ #YVRI"VHTHq1δ$<&hդ ysY*c3A$ 'TRҏ;DE{Fm($`Q-`Mj%3h Un>ç%ռ@T! I)Ž̪Z6$X涗UXD  #Z,$$N s[/28ܼzI%m<&K0+#:ԯgvk(+j&7i$I$2\g{?OE62Np2AYߺ J1`lW.nY/d(H 9G~R\^[)̿ϴT4F]@$1'#m܆ @8vuq$(foAkh'ot'}Ve ]0g 6FH9YHs41+PdhԴi0*2*?[F3Ԛ*RiHA|Ⱥ$i1rNznC8ЕU=kKs>v6/ŽIn[P0՛bءG@(H)+ %rt"nQ_HT{U3V dX.`EcG$`r}Va߭E4.Mw8EpH+H\YwMGj̩z TA~rQqU{`*~}{T OWV<ϐG8'^]B>ϩ6|#y  ^m~0Ijl[j{$n1M7I:o˧؉8#'+Y:~ſ~Ldϵtnpk/س 1qRˎjb1iOgA =:bu^'?3fO:qӦ*X/$H*9uf??'ir[sdĢac|_>`;U#SoB6$2c'LW?.%6gǾ %UV_UT ,$~4 bP"l bm yvpsqsu(cđkV[l[6\l>(k5es LҬ #p,Rl8ǾjR):$mٗ3| |99,Եf6 "vᅵ=1sTdvO+K< |g󃞘Iua mld;欮oz̷Ƕ15om ?,=:bEo`Zb>vcN_&Qm-nqŶM=3i7c'1sMټD=qe񏽌9žMck nOLcԶ"֬mrm|Fd6\ȟ88;MΪl6~#3l?Љ0qӥ_ͱ&BSe͗|:uǷNsL? ̀|{ӥ1fԅ~#1ӹ'nl]|???_§l~!_' cugc/gQq}%TǜiYLqؓҬY4XЉB2p ŶDdŏ|It]ǎ,ou'LsPH5ۀ#iF͆,?J%lM82<#GO&jMz.lIu"Ki+ OO2"*;m,wd ~uʴWF ( 0GrAҺZV ͖ >fFm5t[O_. B`'ڣFq(%)g8sxy4NH㠤uIačy1^͹Rnu#Ԯy¡S-Rt31*o1&vI"LGq+VW9>ի(8;"0 sQ$܋957ŠyE ĜgG> I0ĒK RA9<ןJ̆bY&Gu IS|lW?a8OQGރWʔմгTXOS$I$oTa'gOzę3dүZ >F85`8QaZtZ|%-&lxSH>![' 2qޤ{ؤhJ ҥp5I\+Gr𝤚.ZE9?ZjHAB)Xi8o1 kZ[HhskB,8;rCP1XօG&ޫ\(6V.ַ#5Rb@E&t)}<݂99x\H$fS74H[d"Vnr8,q+ L%sTsӯ#0T"yRq^w B5_q #$:R9t1RIu6P}N3)21 &e^WsoA#ҺOP?rӃOs]Gr>fL¹ ol{L{HU;~ɟ(sGjNZ;cg\jY1PĖ<1R`[şz Q2zڴ-,SuӸSh'vlUO-k6\Yo0 ׵Io>kŹ{C);3DMcz͎m r;z5_-5iX~ƦXd42u`ӊ,}\2gcBĞo>vǷNux{,rl L_&AsO+]h?':sNm|[_bd1cfK2>7?;2vSƲր ?y` 8??!ܻ.lO,Ǜ/ |:qӽTW6`? ͇>q~\tJrj?z]WDy`OZżXK}XΖ6w0} ކA~8xOx)Ff ^NI鞝j-%' H$rplN ';uki٢i4  f99Gj[y{3j +$p~Ipu>j)2;qB]᥅V\J'R{]5.+%T8EN@$u}' WݴddҴd6+,$y09##5g6eĸ pA'ͷc 5mU0IJHfY `2 G=zUimb?\с)ϱ R{dM=JwԩpBj[Ќ8nZfeq*@': `FO2F9;rx- 2LB HCWmzGFy=:W? i^":' 烞Йg"F&BL@TۓA*q&1㯽 F)VVDBH p%p'54W"R<#1qr>V~(diI$IJS5 Pی ګMMG[/5X*ӆ )sщ;Ho֨m_9bHyI L\ra9#IJEQw ZIJ9* B7[U_.%,r7g#?ʁ; ۃ5,2::1<2;f |淖Wp/"d1ǯ&JFՒkr,py0P A"!b~$Ư[,4D `H Ƹ\C˴1 skWnevCq!539;erNGQRH.5 KhXe#8kԵ>bX tԕLbd)+s=j=TjQeJb4JUY`Yo`W 0;jͽ& ˻d1 zv4UȲPwP@ ?@~ErSsH=F?bqLw#1c>zz m}o{Ls5Ad1VLz$(-?f/vjLhcŘ6o-`=pwtf>1?1jEr޵k{Ν͈<\zv ɲ|,y~zv0m5N@ڃ/ _ŏ ~$;zڏH. ?<Ǜxsئ.%M$6 qO\b{RkE y;vlT kFgBC|y/qH҄"jmcBO8s:ږ{=m-&29'zv= GS[F?dппoCװ$|-p-<@dxg늀1lVbŢbAb8АYǞe6?Y'ʞ/ďx,8BϜSŖ~!/? ;2v)S["~!/8DʕV5/Oy`?Y⠟U6Y6z;/ˌh}Wj~?,ُYۜUIv'z4l~'+c$&~ɮv$`=;VmR [[NmOٱǾ}WP[0E$~vϵT;>mO_lU7?L\:قZx`pOs]FCb=#Q.:z7dpXpp 9qFQjŭĞURY->m?Q>.KR$dwL-qc}:-aɵq{LdϵOq",&57{$ 8\U!7>KFιhZ( yqaWc9kY<sıi$ckrIɌJI같7$W0g`II!bT[M"M0*)<yS+Kui$Yʗ-`u5oj ð coyR.ng?+G Ri #Sh[xKf<ynȨAͤcq&y|)iJ'8Y pT9ֳFt}V-I8xafЙW㚱 KM)qE`GzѫIC7 !ǔ6gvx< LlWgf3+LcuSg=zǽY-vCGsyKv4rG0k,/s Ju/-?dG#1nM!!KEs !|ϓ{ԭNXM^k]Owزm~zr-Pczsqb~VCOEy[7nO\Ջ]F[6I`-?_@O\cj.m1M|wxb[qK%Oѝ;82u#J+kc]c?JocyбO^ڄ+Cw EeXއLdvEl a,ZoY۷ dqcBǜ=qI=)x?}g~ߏL&9/ɿе!/B|۱'j"X`Xsʪlu7?;2~Dߥ[/FƟO'/.6"2c'8ޤB!YsONF_qa;߮=T~m1/~1Ic>$i"|Iۜj>Fd}|KC0;tONJ]@ZOy`q\P:/C'/̝'U?b?d? Ryac/*MHYgziMϬ6w=RGvgu]Nl?$N$&"߭[2?BTf@3Is- FYKdB<xR/Y%<*QM%*̖0x"մѭ̫p g?J\: ˸(0\HnvV;rRU<1Ԟid* ӌ! @zuoOV\$ZUҫI@ N:rVnd6@\N}zVή_6\6ag3myT޷oYrַ3bTvʮz, 9H5Ti@.P})66[X_b&ՙ}ݹBFìxg{TEK \Fy*Bq"W)ci]UC;j.@$ۮoN.^<\u[TRs0Ig]>6x=+MD}Hn*3q:DRBqZA2'}'vџ>q]hffh$¯o.5@A6eqHƼo`ԗQE8` 7>c]FW/qiAbD0(< C!8,ynA"&<s^y]|1+dgCV3fqädqSB1lՄPGJhi.AU.ю*(8V1+T1*A'{U UR;N+&AR0{3S$`:=g&圐*0rUa GXա! +*?_<5rN6hpe`G<Z쎜%?iU76Xb6s)s.?zC6dgFK;OP*fya#;P *O1]b01ds[vgcU;[XHVCsJkyϥtKcZC`l6@GL{֤n c.@|r2im@38?fcv8ncߖ0 9\}c C&d1-G9GO 3ki<停&u 'Լn3r00p ))\i'#D9_9^֕.ZS09z0Vl=il~^Vp b{XѣՖ7M;;`u϶+n-OX9&]9'rNͶHQ]Ne yW8O9sgRhIܻٸ Oň>p~%=9'I^Og? P,P&pŀ6Dt'LT-v8թm|L%6\>qzϸ~ŸLl9͙>q28ԁ^%Y$كp ҳgš"K(?d2*Kwd/ ?d?/̛Zkb #R<'Σ{u.lI;,ĞR]H6]dH,?|~'}Il@&~zx6scŖ-GBoD>L&=?с߿튶lN@|Qؓ>ԑ_\.l8?dq:9Ma̟yIS*O<&];<@7G`O\Str - ?|[)=`Gd#~8'ZZs,=A@1o8>1S'du)sM7лϐC B<^sӧzdY:c08f-L1Va'\=߈^sӥfbMZnqW]bk0]]4kosRfxR81qY=E  <'K2IrACml2<. wlV6R9 S`5J;iH#@Y0pҴ.H<.CYi'!ř'YI48 )"V#qHVM4c\PŎנ 94 7!{w0m-dk˒NSPA'Ү^ 3;rȻ#XV5ڴr6ރ+OK6%Ha(ž#,JE9!~qވ1!uǷJPjLR4 msܘ0 ^{~5> rbjR7A1(žǜK#vzU!oП$|Ēg8r;zѩiv_&i/6Y\_qY:n?3Ly|Mf, ,:$ڟGo|TM~U.m_;zڄbwԞ؁mya'7szIf SfǾ >ض6ڸi>}?Q> `~Ϭ>>}>آ'i6\c0I랝e[#=h,1zjjȓi:yoĞ,I;A?Q>XD|-.??g?6M@`Ykol'iR ?e׃gǖm-c:aa;hFm-;ۜ{UY>!<ݹǵdS -&Z&Τ}qWt!ߟd$pޖ0bwv5qÃCſ9ҍQD7\V_O'me.p98q[9ǷN>v<lڇszzVzؘ%nQg7m?ċ x'LsF>(nâ[$'X*[xd[Po879'15&qo7_[f10'm6y4y>DžQX0T݌)ygI~`2y*@ܙ$zLV=@neR<2*r, yjבV)^0EnbP:d9ϯ* C 0#;ӲLVKVA%瘫o&6gszvk#tn'GG rw{o,ܠ}>,w25vKIp3һ mB?ʺm|I$hTaա6gf޿JHed`-$?t^sLVmdOG0Qn¥ű?\[\;4وTS84s[^T:]>˟U[Ie(Q؊6{b2odzJpW3.#'YW I7#a.=Hi]@=gcu ea>cZ mVga5Ak1,U)FN;":G$%V03K2v}6gtS^<֐Zxi;ed/ O jnKxg_` J5 5S[9 !$U[i::a29oTp_ 8E8cHu)! rp=1ӽH.¸h'p? @3lcޥptV$pfГ dx8\ rwZÚdw}s׷Gu]>soAmp%C#fs VjezQ= [Y݇я9c'Y|?27zc>ԙv3mm2c_w/qO_”]E_ܑqOZ%}=߿:j[vcDyn0 V*fr}Pg?>q¤]@`j͏y܍~zyt]nۘR?B#~צ=ا#\9SA#y~_Lzým6ɓN%~rGlq{G.l&(vI`]#̔WS3[ NI*jY+F噘l#+^JԦc ('(֫IEC $):5NpOݷKZ@V98=~RR^R˟'n:sw,w[KF##9xc_hQI $S(faƌ>ldg$TPYKA㎝9F5T鶮00CS;EҎ[^yVͥtd#DZ"r短Y,r, ׵l'5BhwF#_ºp6 M Eis>i\.d9UBd!P8.l9n:'vp1 y8YZŮz`jQc=zRt4K}L丶M9s < kXG!q m|;]&qbʜs@Mo-#O;J1=)T=3)mbAq`d`'ȫIt^3 D\DA8\>Xù#( d? ]tg@Gw )_Q0ݳO(<ߝLYJ'5"'#a*ʺ$c$`)hI gFNH'UYjRjШBȑ1Xr >d^_hn8'֔>'>GJ8<:gZGh Ŵ H#n@i۴ϱyw DbU .@.rOS C ˵ ջ_ yg&2UfSOJ}֍M8q݈S{-ն=,vL$'H?W5ipd0Ò;1ۭg˧:X&}H"ބ 9'Pg w3}~p1[.bP] )<䁃(iW-ޛu qu ʪH Hu@eyʹMpuurXNPd֞kޛuk2( v'$H@1ךHboob"cfPw''$$񚮞1+ptMeCRq3pO IczA4cKB;|c|Tv۸϶)j> WկTns͔%-h /Mz+;[ˋw DxI,9#>*=G8Vt.@ rH9@88h~}6KWVo.TRYw"ygRd' 7i4]q-* Cr@ 56Uw$c(3ǠPH2rH湻5Bx\(Rc$ d+{X%k)a-ud0G#ȳy]GV7p^$p=PY*%@9v)"1i]Dr:HEI q|<">\m#i r1>K=ݩd *0R"H^}Oż Jшr2 #FH=.4_imzaF1 WUS_PycX2H8GG#'ⲙW|V][Pl pqF8ET[=Z5Z6T)l`;NGSީSu mwu@p2Nm/[lNfhfnr1j/t[x, `3GNz]='>-ZI|R88bT GZd'"DhVxwXr|t5oMfM xEqssڤ^"(Io%H\ˀ 3z5ƻ[,Q;}8-ܹ T$9cuj܂KWn yrLW?5?Q:ٮncBH @8`So/4 'gI @ ]ԏ:c 9k)EI3ǦwTbH c߯r= wpiaReet׎ixCW:ZYF-,&B`ArNtF[}1# t% *1(V%"#:$)FpH U_xZ\y4QlJ@ c gګGKnK[[w[g.S7,v׀tiʍwR$qqV.P fFs0#VCɪ0Y1)I@wJmM$&]$.qć mϋlO[n$ۂ '_uY"@xY$`H+).omffBNP9zu[iZm)nw|[Z][;#) :BsӚMoM>]!;Nׂ:Vmƙj:RY!y؃ ~\29S?ehCBTxN(]Q iRO'xy{c=xTt\4sO$Gp2z@kU!8)rzVt]1Nx&g,B9)@5z]n q䉼ayHjK0 ;?@9+>H JedBL@=mmD-: c 2`F $nI#Ύ !%̅Np0MCN϶YV(dutd3'ʋe# +mvܐHAA7̖4_hy XCH |= v~)q%\ d t=֣g}NN%Z%(QuBpA8:H:X>q=+mM|"K )= p^Vԕrtz׊b$ #lkd9׭bpa D/z 8ӴHC)@dۊxQI,v-8 P7b#j8'sF8+Dʂ)H(@u 9!# 4J@@n9ׯsA pEGͭ܌L,1 $`qCf9HYF$T;gҀ ߊٹKXdlTDlx`8G^~4v], rF=^Ħx]RG2@_C}]BGIS6F`\q\D ^[2F@99;4~,[E4Y#$4]ƥ}&KI&1"m3 i #洆5ԻLFA"M#dx~ "<9MkV n6 89ie,6iB;rn\d9QV.M3xJ+W>uuDhN8Î">+Q&{sǬN5`wVvMc[1D$$@ޯxkiE6iXxe).2r@Iz w:DH-N6䑁x5wv*.ӎuGxvn/ *@Ҝp2I#ֳB M'"kbA*F09:4v_7;G%W%p 9#⫟xu{u]B"S$qOU { \BOΥR;m+1JkbJL#`H>4mw9DDr0HǯLg`x+;hɒAčσIj;5MMf7Ȧb dB`{{w*[Gu"JLKc F񉈑[ (@{gְ+Y898#`UKe@L৑N~ @#OJrDn: %% 9*3cTH0Py G?8:+ dF<c(1FamFO|^;̄ggk:ѐ_MSKMĴgz}3UYc,Y"G*sNsNMXD`r0Q]V)s4S!˦F6ԎvkIWY_2+d E(0x'5drĐx<ڠ1`9 sJ$brgnO@{1un8$q 1y<`$ԢB H? HvBܛPN鎕[i1ۻwɝH98$y~=(ŽѳYZT$0_#JJH}* $89Lw=3PDB"^I;H̛-2+G8?gIuymy"u11 b1EK{o{x9oc+#f0< :m_KrYp11^O&M2389Qҙwym(h縒0|H H~@E H"'r1UnnoŹ{,H~'Uj˒;FVQ88M$-["FYA9rhNį}kzPZHI$ڞdwQćʞpQWn流 qDb J`FxjrjLO2ID :bl5kAug2,e6qZzs%4a@p7>J8y瑤 GS QЌq(*L6I ؏o/@9-Ry-S\d~?gޔUs 'xcyPvW`"%\GZ` 7$(#w`s2)l~;ѳ JTɞ0OJ=HZ)QP a30,/@7>f+I%9ثڴhqҥˢ}XY zjx,H]pgW##g>Y1ާH2fN7>1õ+]j5%d@c Uڡ@ T8ⱚG-I*>Qp؀~EM2++3aٮcGt)y$ =FgY'-VDp<ݺc1㲐ɥG$89 Auv)  51fM}Ao!H|T; $|KPmlܳyO9R0RzR]iتH%"F,A`,5O ,P9[' pO$c<@Odn82A#`f$dVQI#NI95 vQMDǨPbcq1#$h>=2;K c7f,@TnrsGa%[b;f&8$$p:Km}[hjD4{J` $׾qQIk-[{1 i,BNA;.:8{[ B?'c<|NOzg61HKg2c$`gٓI[!=2XߛKf-c,$Ul-] 1mEͬ4h%YWh#)ݓco5'~Y}y9'Y2+Z-edt!ܳr (8 dFn0, iMXFA=yΆQ1Qq ǷPm J31:{S0$+'bs chɴd 6G5Wk1BuzLʐS^'gaQ=N1DjE<K *(2U"aW̘RNQ$t=hIYP@A 0+/{5D򐄐I cfx4"F:IxS3 `i:}$ ds bė!G X:Rt.uR+ c#߾hRCΒ;w`Fh$WD8$R"':tjGmch㻸X(d=FG@ PIpxY>A,O\@ }wAhI=*һDKworC̤xۏBry [ԇO 5$41| s؀Jۀh˧XgLg2ۘg;"XM#Fq]SMJHȁD!qןz}>Y̤Įܜt#ySs:Ktd8 YubFX~$WX{cp)2?A-SZ ,1|*Ă9ϧZaFX&r˚f?xdқei&m5Ѣ0߮q@X̖5Z<,69|CZ۱!{NjI+[-+ZDHϾA]BdA LS^GCyPEha}v!p p 8$Bִ7K!1{`~VW젺(7 O8GtoQ;qh5$N\Jǂ{֙;LZZʎV,X6:dՕLaT%K]9,Olތ~=h+%Y< On}GzQJ֛s*<v;Fkgp#t=OG+JpX#T)r~R:}jv7 $xa=[  8=zlR*JR9GC)%p(dwEz-Ȁ,rfkh!]+S(w(zZKcEe&C7 ;Ӧ#.d+R$zT;ڏHYa|z^f\̱&hNVdw7yǘ(m̄5Sܫ$eIK*{''B=Las(C+y9W>,_>`;:c<ֲ'=:SojrCg#Nm$sm[Le<}+.# ds\nL '=ҋ;] /$<Hn!(v$9ң` Z@ʳѸS&܆8C+,2z{OS cV,[,n1==j9drF:OG%#&1~S{jUQt8N-G4aU +4F5o]ʲ?ȽóG5e}mAƀ:.9PzuZ"qh\9έxqV[C+Z $c'L~!]>/Au;X3 N1N8 maO@P^ I,UҚs-~z p$q0 Eim=mmaӴ+"\+ѯC8$zqpB04>CHGZcf'YLnH`H'9Ӯ~;qck ϔS;FGA;VƩi$׿VӉbU2QX0 b9 41h0Ⱦ$[}-xVk)4ǧQ;o;zg(-:LӠԴ kA`]bT0{>\ȑFuweec##c'F y!W(#LP`l N39^iC{]4ZZY'K]Z( Z$Dr7Rqo ~>.#EE9R[RHsRzjOk]Hd>XpIsiHȍL8=Jd? ,l\VN Q{v`"B`ߏ8H bTy] 뒳.b$`I{iPMOSOJCEG`X߷e yc#EݬsR?Sp}}zӵAIl4|鞧j-+mHmPan8Q1{SE;\XQ K##N@&.U]K|=F: 3%h[}zPPvKyrf_%'bϜolZ`.$)/ɻ>f:*Y`< ]=}; i i7̃1;NGBLlG|늉A*a<8HȮpTsC]<< JhD>$Rpr?Mv)p 7+MuZX^EղMwˢG'p1\Ybvuv y䊗{E*10y95b@ҭ2G00W8sުʑ xTV2A㞔$gFxsjëoV1I%U7OJ-2"6}T`tִP/8}EgQite%f3Nuz6ៈ 7d#?X]_pFadZVa{by3wO1,I dF,#@zf3൜9K0 UF0I=c 䱡ea˝&$Yˌ$B`$Qp%iq{`xbKy`2G%[pqngk[cO!-D  89j͋M{|3Ph.4&<( [YOt-2@nX !R29Tz}VhV#!F`'$~LǫçgRs6d2@6ϯ5xå3jM<ګ~[Q zXњT ndmes#ޕ)"Fv_Ϫc6n&\( 2s GBEsKifS0  S;Zޗ+X$Nc?DКQZIq;yf0OPH?Si^KJX/CɪAkMxu8j02!=ZpH=ݦ,HqVbzH `IWDtmVE|Cr]@ۖ ,2)8#&\->᥆ّd I&KX]DhB^iwF(LB20O^h_=dL662GKTo'yNcŦ]ؔbPצ&p, 7n@H#GR},GRbRFNxĪ2ӵhSf嶁iङS0S#':v5ya}`H&3@$XQظf)h Eq99$:$W=^\1op@R)M4Ɩ{O;=Gy%]Up0NjH5%Rso4J82d1I{ZIomw m F;w$bKcGkU;K>%̳H˜d`zP/R+,L܋{[ɻ p%T!`8K; zqcu`O{䅆HpH:dk%RK7:R;1^mkm (D̲ 'BH $N=!tǫŪ+Bnf& 3;7.z3HzŤ{K9d,A;s׶8ZY&-nm).ma%'Ҁ+\)k;[JɌ9# ^5%ۣH2Lʠ` *I/V] &4XLs)$1;u,:=id@Wڀ+-2[Yjyȷ8.r < dl"_^ih]&o0ztę-bVb "&L3H$cP_Nk`rcn Ard4P: 7OӦThdLW01۟Z5ߛ-s^ #c20lEcuo5@ !Acj*K-[#a1OaS& `w GA<qTL[)sAڐs,/M- 'AX)<JJd=9V ~b$2LImlbͨFmP$chCkn|=?7sңkXJWWpeQ#@9M;@TefdIh&e/H2:pg=dNi#w{W '8Z=(,23dh_ssx )%eq9Q1ՔnYY #`?z@Y0N߻hdRFH GZ}Q$0$g#.r֮dʚ4HPrI[%:|L2G< 5W+s ȅBIrOQ:߷ Xp3ԁEAN1="Ro g4-ͦ-pd!@r@<tFҘgf2  @PEE{ 'Ȧ>&n[4i@`-  E{+'3m3_U Yՠ%mȍư󙦵>Y%$ c6dHaN2GM!\qrIu#̌T* xOOZrר$na (\ QUFGt uqgT$V.QxsSTqmwsBzXQoXb6"` p,K*B|GI$A3EOK9L8bps$lb=@#xa/$){r{UyL]C*#O0W`D#3֭El-L`W?p{H B2/*9WM๚T HR"\ n??ʹkalD`N 3Ӯkt_i0^S('#"{3rA\ϷXG!6{c֫YIsx9ߞkA 9+G2!ym1 ~.R0 jEBpC"9)6-uf~W-#ygNsO#ce PG7Y1Y07Ico-b25 d+&۲foTAcq à=8Hg0\p'j2i[tb@JpqɦAy#|88JW[ m^5ıSI3ٱcҭØ28Z( QϨTqe%=X"20$3pJ`/[ŧٌȸez:d2fs3ҫ5ŴKS[H '{}9!̬.#۟qABwܤ#5![!H ǖO'^3YQ[l/wϨ]uO&PV0VH@G8a}a`G>IpmtG*KdRa;Oơ.1M{c$md Mދuo;Bx Y_'tKW2X zӿVy┓#eH8#i=FqfR79۴wM{ r3@U 7GҪbJ<C@(*3Z$IXI<8D%̏{w<|F3ʓ=M6 Fdi*c>Q'Q+w$n# 6Mg,c/:J` y" [``NpNaQ\)I3 J2lr'Ja`uԄ4Wa :d xpzM{}mipzyCro\㚩jI]Ǥx[`N:C0LZwSTkM^3@c0N 8&WS`&%2r3;w.^>ckokN6,1,1+ob3s RWEZ*yWmi|N~Sy#z^;[m?K`J&-r]ڗAgӎ"çZU|xteC qNE642)'Ns^%Ft).4}+I+2'mHo!@`A$Ȭka3cdȚb;$t uZhZEccu$nx$R A 1O <ӼN[6Ѥmjy#m%υuu@iAhM\A$R94q$vwKI ~\aA=tKG4ڀK-gifu(B`qf65tMs!S:@H2I=hmCO:J2]as$J9Y״m2R8*H6]S0@HA2^f..Y,#Id:RA߶dC ݬa#H$9$5jlEԹx׊ҙ'_%K 4p2H*ߙ-v$d }2 Hlyėr/̰2I ~~ IVLȉ]T\ (],v֞ly0CO?Jd,Dm!݈bA(r8Y.`md̳@#09 m?LmO_#<{~YD #9bg #Ls*yy-Rqi }x?NGC,0mF^j8Hcd6p=Kms;$GO?Vea# nkNA tqnZA  TmL$X"|r1Lը ܓ361'8][';C8֪  $ϹONAC%2mUk<߷K 4@~qM _E(s2I`2>&Y#,\J sx$G,r\?8>vXz `:1|`r3Ѵ71_|#9桉nQn," A1^ًZ5#A``]FbcHדP0hgYJ.WV(  dHւ8,FИ`u f[d˒HG`KHq~x*8mup5s` :-E%JP8Pr@qȋ+4laN>ʮ;=1#ma@~5taM2ĀFG$! _ lո%[H]] ]^4]Fb sW-ªn-lFpN 1IH9Ƴv[Eiviӣy*9#$pxǥ1'kefbۙ8}GPi'1,8r0i, X8ҳzh&(#Ag`q3zU-0I6''ӽC# R㟘oQ[eiK4>ZFy`r#gd r\rF9N}<Á18"jhak%-!OH{՝R;6t,-#hm@yowu9cGƥscq sm%W3w:9\uӮtBAiη;Y74%2$9?YլltK(#qNFI}{I%"b$peLgx' BTӾdb-agA'GjgBh"NalTyG2'zn峫Cai[GixIk$\s:p5M{xz:huyPJ 1 c9$⢸n,gJ0ϸR$V>LV$q} F"RA8H'VӢ$@r20:g" Ib*P>^ܐc2G>c8и3Kuy<ewI$*9al.(y]$!##.̱ͪuÜSkTeʖ1)RX9(2CU]BS( # $q$sK =αHtyg~Xz?hLDĖI7*B9!УI<{F8dR!Ns3fje;rĭ`M2lG/& ˏ8 A#R)m..+2ӚH.21!r "ko:Ѯ7T0$3ߨ=?:@<- [AsbklbۈrF[9pFH#5̴ .$p  t~9-s%^s%W3YU\+1 I>ޕ|dd' cc0Lc}j8k^;Bѵhd09 c𦫔B2@ =ޟ3G q1뚂Jș]Ͼk&tdJD F 9S (S$g$Z=q֯%'dYoq8?<$#zt5dmnf}&}?pM]mEHv{ݠN';s>S)xȢkYP<S\ A^48vO|JFyJlB1>fh%[a(<&C$sg: uU`$ 1444d#Nz괇fS$ks)#QA<zZhmYW:JQ-!Hsa= YjB "-|X`sVVM7G!Ѣ&HQA^Z#`|I{ʎȈE.yybVXZMOGDbȓ 2FyR\ҌVqM"2Qd;4 4)l't! X-Xu5h .!'8pRi׳>[\hcԤFe\tsu&[YXj:Vja{hwsotxebgKJ#98?jGaVpR;/0tgސ4 ib`7n ?6 J}"iwe:iFe"HVYO\rARbEӘws:5K1"80 8s@lX hjV.^J& R289.Eo oHq,QFpy=k>msce>; qN1[_qߤ:JMwgrEaRDc #.2_i6qy<۝=$.8 &ӵM+M}"m[vo*I:Z~F`c D+xSjW -nH5-"{Ϋcev1]I s&JqQ;1 IC`qYƥp<< pGsQ%ʹdNҧ\a+19KPX a(TA'j$*/HfܲH xi"ٳy[IN=JI͎9#G#S$ H8$./.V#"L0ginm,fE {GLG ߼HN?Zt7q115*IR9 v)*I+0\';SLܨ)7#\ҩW{˗q V 8遐KF' K:1pI5N8ml#QXSvbc6xV}>,qHW !퓚hUxJ2)$*d)$68sǥ@UEvA= ЌZvFټIhrIȠ Zi1[i%PL3vw##WCS,vzS౅H\3GEs4A.چ̉.{x&o[.^Q(,sI9Qܙ,nn1dAAsVүr񃈣p}ӽPU̒I*`SisnH1%s c[]~Q̎6ێ:Tm7>Yc5k\̒Qsc}j+ L?X-Ԯjړ|`?60OCUm"\@p -A-;uO`h!XqgrqBe(\s.br" DíGipGǡ>]nah|'%jN >zRq4\H.3g}{ff"XF$oć|:=;Ҵ&+dKvE&7r3A wD, rݪS*M$.߸ ӸkjROs5Jdy`:4ȡkkn@l2Eg<yr,qYf`\Xr;~֭j6rGuuKYV6ɞO:gSQɯ?䟔J֋z\Mmg XF3'A\]ppq+$ᗈ[ppzIXExUxw3c4#l4;3U ܥߍ,'{ MᔥUB`c?ZnYgP{ %l0$BH|>F<g&&)56[؄X rFO\Pܡ:UyaKϑUS P 2FG֯K ޱihkwm" `(j V,8#=489F)-8.`8I:OB;eC,1I0@!1H= U~gdivII,B(|`@y.mR%o$ň2PdNpH[M0lͣ7q<\X@'3l Kt[g.{K{Y \Rܽ׆{֠y-c\Ck!r A9޳4la/#o8 7&W Iy-.x hCc'*8#jxaKnH$գi]D1;H8ڂYF[:tؠsc=Agm-Ӎ1y.c$DI2p}Ҵg9-籷)zj0  9*p@f56pI%m󜃃 8h۫ IdKMI&&Cpv2\s uXNv,q vz(ҮowXڥbfI]9ߥU#D3:|L}jxUQ ;f0'9:,g*3I`JNy#$*&ؗ)0xpAӚ`SK i).Xt{VdheaJJsՑy$%;R 70VyK:_@mA`A9Q<(Aޥ,1+R>Veb28|ԗH2E1@$ugZO9)c,d}jPs+[]|*H<~"$XnUDy!~cVg2[#mYD$i' ۟J/-f?i ͒h ŕ<ԖG= V]1dNz,`Gf<$' Ќgf챇b0eNZi.&ʎYI$(rCg?:<#&1hL 8ƹy%'8'%x`~5x)VD0a1'gQܙl:E\ߒ20}1V@ff x_oY{cP)*:,C"~5݌R:ޜm {V<$`c95l^C =sE[ S <$zHUs6a97(~+A)nH'«('!UWR5)cSo*r,88*CAXǁ!* mS.tENǶ{i=WLm =3pc&9r"Ү47/`-zS~R1r^6AoI mK8qN ,M|dx q(w"KYؔU[Hs-Iئ6J9USuSA7M.nxݹIX.}\\F\x#ӁQGnr6\ˑ 9>ԆKqlUn<9/1a1enƒgj[H[[^B\3pzg\(ľdE!f$pg9?=i\͔n3,>&1}G\^ZF[\qafɻlnom,G%Ǟrq?%?'ɸSy<®LgldW-bpy]]Btw@z/EJAtK`:@q-|z }u&26nAj͔*S DO'c/2^[YvP2rî=rav~5Vc"ٸgi]x:]Qc%(G h-he>e.wc"ё;~nVXqSIs'~a7 %F$\cu#+UH9㿥hKnn] _8xw6 +T_KLdhGSu)Ns\JÃk? Ds70Tdg7vΪg)"H־MNPVpvr6)~cThKft()Uu90sγȸwLia9K$'$ zQpH5/Zn|UlZP`ڀg<gy"Yl-M"qD9^sqRXy6c}-枫 m|AOL{sfVo4->;c,3"۔D2@8 l#O2ioyk,bFG&Fgbx80kd06ڂ)yXPuO+pGc5_Z%ά|Cw^IYP12z gr*đ -ƌOU&Ct]v)''OAEڔP595IyI0Aϯc[i\j:y.b60@'L5GFww֣SCm`{BBPersjV.-pfn裸WY" OpZ "M.Feuup481bpTrN5ksq/^ڏ-š(c7(NO'i2_ã& A.n7W!4@#0BO~R񴸆i֒YJakCxy$=IK}c[^oM@ˁTˮq:Z-֭s^$%uFr@# YgJ`МH$a'=hcKRJsxvKo;HTؒzս?^\v7 no!0I$GAY)}}yS݀'2¡8wQLmVė7N&;g"2x r =}8+Kܵ1׭m4Zk++Ԍ&0ӳ3 9Rqji X[C`nEHyUfcx{YAnm.m7`S~MGuash7e-5FO|aos [E.$$pyϵUMen`}: "`[ ]׽4 t4-mcn"pf3FF[ 2sboYtqk?pl*TrBz%e^m,K4nn!.I8@’FɥX[>)JaxsOi5Myp 98}GK?R2hPTF.8l8$Zd[SbdX G'] sHcim#UhRQĮ$sjݵY-Eķ1hpH$g0.bK$% 8 2Y K|vhN&S$c9Kwc u{q* qێ5r)ZFMU8`WM 6mK[*I3@9$֨Cmu= M#Ib``GehuXʂ\}3qr¶1TC!'EεmE%Y``x?j /٤˵TG 3OZ<7w 4Ґ ?_ҵl&2Aǰ45~,MYG(Xdrp EAl\+0%#䁏N:kfLr̒L3cgL0GAT1o"CH79'qڐ̻D)cYT|8-4x 9#[,d(2yGP, #ӚhLeu6"Ad  *odyh O5AMFWqAҷ,blP FzޘhDp!";FzRRI'ȲHIc8n-i 쑘ìɉT@$tޕ[ S䖌3\cltrZmͲ5d;Նsi=T6ksc}sVcr6pW ]X{C(y9 mGHRp=}r;C @$$Wnoɬ #JG]e0}v]Gy+;ص3omѺ#J$ >n;~<- \LLȿ>vۯ$c3٧AE0pk-JLӻ'x|cxvqTiq0…) U5ZI1 F戬DrFOG<`tT)4,XIc!޴Χpm(788=+)&90XfO.r p>fwgsmr{6|¸cozUk$΢HMpJ\_OxV+4$2q>ޕŜkcvtD u|YI%6N $pYH/$c5#6ymi~.翅DsHe2hؖC @ӎreuMv"ӣ(OE'@WQuV xR$Xͧ&~Ӽ `9A*#mMN[k.5DŽ $+&ʐ0FF0=9z׵Xi`9, 9PG=o bt6 O'$@$SPkOg#XG+̫ !9 O#8; TUo;\\P %-`9 )b$03ڢP<̒-r& T:qRΕݚn&69 W 89Qk7zkT  #8y/4b{kH.%ԋg$SsJSZ1Z~3ֳ --L'$ګXIlM\L/I95] v=Mol/1$% riX?UDYm5nR `R1g '^_#QўҷPy,mev9U7ڤ<hǎg hf'b )`TkSYor ^v͢&ddH&{l( 6U!la_.XF~@k&[cUÉ2 9 Ԇ4{6` H0H<"$>Rn%( F%`Hٜcn*o6knFg˝1qE (8N$A'- 9~ $K˸m,G*d` O=5T'oxPDpI$Ҵ!(rK/2AdXF$a9\ 4}c1kHݢ=&n@P;qҶ ;*}O{Rc*tĄd#ZE gRo9`d8Ԕބ ~5McDw0*I$sڱ!`2 㞜u8^ߴA*eU2p>PEd[-ݴ7#'}s $RY7/lzV\=K:W/∾lFH$c=2<yo*TqFGYUgr3Ԟ;oh= %#XnI$ 4IȣԮl.:[EO: ngN8?%M&Ҙn[Jiy!p7$c֋]PTm.>x4<ˉy)`>Yֵ'u -2+PUP ,zdM+Y5qkq7af $8<=N=!gw $Š7!Ԍϵ+͚Z}GYX{;KTG$Pg(1`sWWp:׊id: 9b:d\j6wڄpwS)' qZΟqhtڅƺ\D2< 9 )Ƒ&wwl -Ŵ5 N<ͫi_{F(S1*?'$dtZW3k)ZMqMDGH-m(p!c}iZͯj3nזfŋSʤi?:gZ,#k{˻{t7cڱ˻8adrqzY"-]܂&#A8=kiK+ؤar{XEz\j"(omn,ITtm6Nnݳ?څ?.t`r8Cjz'&$a"Ci\62nA9ӯe][NAs#-º ,$5rJ4;h,PMy@d'8+\}iH"ɐ!0DƟw{h[4jhH8* Xko..ai.,rD2IOxⷒxBS4zUZ`VĽ/cq'8wMZwg>ιwok$r~ʋo`#e 1$NAzx{_ТPYMy4$I\c''<̲mͺmg ,f3*l`uQWߖd`lVuXdInDr]I(e+$< ָ+$P (/ hb a D`b`@F r9U"d= 2YcFf繌#~фl`k#Aq ˩n/-[X ">D#hP2G>ԦSpc@!F g\GIKձc u'~&;$8$x\dkh|!8$+з[Yib@9=2.ł9?CR170(%@@꼷&sG=*'ig<@(T|IzXsv]jD'hAꎡ~H! AwֽzVq#X$r>`mq܁wGj$/$N'C\1\9O?Zс R`7PH".T2.$09yi -$%Nu9XIm留Jb3I'caWKXʅe0Joj;9d^b`A#ZQ5 i=XWNn"hFuWX,KFJgjv #[6s'OO1elx?O֨Z]=HUm9OjY؄=IbRUȉ2{zd)丒@eʖ 0^;T((K`A+`I  79=`bvB =ҪLr@0f3)S_ko,s8* YBT6OIڀ2RJ79=FAsJ I?!"Z3%79Vw$g؀Oyz~<1`J$AS@\:ѥR#@R,=z o8)d;KN{GZ ղ]1p <{ոk{6cE Ph TMp=i\GaM9A0 APǯ?9!;n<sS=NOzU7-Wq(QO[  ( ZY6zXdfps,g Sp[Dg^ TLJ,A<gҴoFrvO3psO ~jw 0GAUv.!tHyp qӮ*gƪšy#pY(\ ~ұ‘N}zi'֬Dw .@/SNI:I/o$6m<1\VI^ڛ(bM@.e >! @n;9ֲʼn$͓:1XW7I_˞A3_jնR;HHɐcVv JGe152OiDRG'|^Ɏ㑐=jRm"w2ZߒcӽMFOu#;yvmhSP6+w4ӋIgԖRHJ EŶ7a4^0Iu ydL1WPD\ &e0r1y٭Xv#an$qӯ=DSpFIN=:h^wH$IӹzUX*n}N gɎ`q'0nDv!Q2yryk.]@Isv\Y %2[Fc)1;\TZn ;{i%Crq? ibӎѧϾQ9k בYcx[n]M/'i'`B^g/mAL1c9=+&svK3~\⴯43x~ 9k69-m&dEgVq֚^Fs H{꒪̄PcܰhbHxBж|uCP *\'@@JoDLz iI "N:cޖ6gq+^`+w Z6 QE&ئv8'ҡ,m-m̍V H<3ެ[#qFVHpI`zS@(SORmt˅L. o c;GOJiʒ՜M(3(Bw) iJO=xa,gᮾnhB3 {WJI#GKY-y"՜Oq˛i$;qެ%gqnuϙ$3F(H2Ggodx"M56yt$ǯ_Z[ťޡ*9E( I81H̥3,aY$}<$=qUp?u95KX xQxȤgVc˫mMM .py؊d L,.:up5fg Rˎ-5ivʷgDv,1@9}\@!Ӵ{iZJJX`rH5MHjKu+B9ycP qtuΧGqkwyӴ% o.bF0Kr'.]"\z~Lճ[],JL%$O8ٮӮ-/̓Cڼ#Id`c9aوh_OD{{@,N ' Fx5B[hA`b7""Ws8<Ɨ~gsyŌ1Kk@H9(; ӡtRPCp9ޠdc@6RZ@K#ƐB&Y17v-[{C;1\ZjrX]oogf#?ۗ`@,A<,& FQݥ֭9(,20{xNUfTvJ|W3؁4GJ W u)J QSlŇk؛O&B! Xqci)+jfM1Z:+HBٳ'$s ,}R;eP|wNH@mojUZ[rS5$BA8U.-[!["Kn ?y8SRU݌4-;k;-EHT!H^3Z[Ioaq=O%1rwL|?Εq5ݳAwh˷A$91Yhre9-rF21߽e}L|+ޜ#0{U] ]=KbXf(.[8NFNy[SAk7jz -.a0ʩp{j]gOGu0Xom#ϔHp:sQtU؛4幗Z^&a$PF@9AK}"]ODӵ'!%,T crI8*^IkGV[ç8q³5LZ]CU\Mu9, ،0y&%jciڌQ\/5Ǖm*HT`@}zpk}etZxV(Y㻸va@ u$GNkZ+.y"BsӧOqSM{a4RZ%ܷn$00zr?kf>Ҙcc\4ma$d2q\GR%ǧ&<`.O ZгDw;xظ'$wQC8(PP{ }sKnf[wϐ@{I-x*qߦiRhHYQH 8J!7n: ha+뎵4WE%PۂOd^+̢5F7ld`8=}КYn].BG 8UB x?1Xȷ<-gV1 I 2ʄ;ORFinm$!H#,>Iiq<1Bh>YWD\eFEi.r"!r kBF*L>~sSr=i H +aKQclg%$*p #=kV] 8aMuSM}e{:F& 8?*=RH%T~&c.& @@:xkR9*0|999 m ,5Q+]ykM0PXd'NhhIaJ AHPH<5#:yW'kB]C:t9WF%$BNO΋і+WeXvA< :NllaZQkngre'#Lԑĉ!;)?1@61H ]I-A!(HP}5O[eo:I<"7A$=ekq!gxA;?ϧgxEm\4&nZv8#dsՠE^6 hH>A5w6!R28rF9rp@HMhZ]1&2D{̄8+ Hcl=5@45¨usZ(,5WYvi!AH<4\%&4#ҦwYf\$cYs*ɀ68ZvQ/\5W0L[XScm3zɎ)HfNmQf0ج'dͣF%XؐN9< CX"svAI& c-ۑJdQ.Bxϧ4V$BL)>tH7*q,N9mptyӌE+NTcщ:˰J:jIna%18= -(ͷQSB( .8ҒVw*3VQԭS9)A1>m%Jy$<v)Glȕ31%D9 P+F~1qOAm؎k$h"V8UK}ӝ:tp='<^`0;U;O[BZLs(ϩɤ)(X7eہ8ִms@ib<ísb2f1d8c`zKb$ ?y~sƋk#nO< 6*983OhEnAlr{}+ ;YQ vz'Hi%&hhWV@AL[ u"QMrKӮH 7qcbTfVwd`<}*FHLA"$烏íek1ithƤH*΍X0ʆ'`6$ KIcg#<{S ;SfF;s>V7@c6+8x$L%Dx8㜞Ҫn}$1$18O…CATČ\;g%H^wge9LXPLI#4ri#'=SmSP HQL}CM4*jֆ{uG!U#S )@Jw'HatgUkؤEWqd$lMXF&qp ߿OzZn?%6l2MćAqW'Ib8Y:YQP)lT' aڴlqqe'gZPF 0@x`Ht0[F<{I8jw0N̲xFO_jfOF:֦F\yLrGjD*9ޕ6I#b|B*EO֣$ |!6{jGtJ=yvQ5nFNsz{ip)818oB{cSFBBc99̒ - n*mj܊H|(!9*x&YBG\OzLň8vxݞ7Id[!i1/Gq=k[vP30cHZ].4wHlg)< dxM r݉a>Yp@bA$ + -[]H6V,Ue (=V^Z@ڜWr+[:$a1T vVhKBem]!w(AնX'V]Fe6f-&%L@N/ۿٮY.onn'A1F <A8sw=qzL$Qs$nd9@4iWwwwj oPC1<'j V-6 (w@[{f/Vu t; !B[<bkU}?VԤԡmㄸBIުAl,N9#qXmQanvw^4wdcғG hvze` `Ipp qٹ|'i{{ I$NjcrI~T7O3e]u>zjֻWŲp1UPdH~dPNNz=;(>qz|ב[-*'<H'ך}6nYKE:hŚ(I- 'pj\]% d;Nuu:ḑQ >ÑB0?*Mī]| ^ԀI9aƿG!UeϚ̲IRHo%u)K $He죻졅 3$m'޵x]"1J眎qVڅ fſ$?Mcv]$RA$rHLg63%F  ~cUM`- h r$צ@dChU|)%N,DoS-f%΁S=iG-ݴ[@@m*[Sw(~r^E2Bu#8},8d6E c9j!^ M2@i#*Ѳݐ8|i2*#J 8kY[m:J0h9!Cp}#M Y@+'y1#hUnRZ\%2P1dָk)D{K18I{w2Z%ߞP̋0 g':%&A0h;1ןҳtˈj奓$apF? n~m4VDD32*P~ƱL 0pN1\gR^(+!PC8 Jqx7,r;U}W] px>g’;☖%K@>޴Jɜ"IBmHhzGrG%R[ӓ!]?vJri-ٯslڧcpw)O֙ڭFpR]C.v1jMtl H)19'(eܧe{+$6JӰ 2A7+'Й#بrH#~b=3Q#*43t U9B~f=Jc! 1zjcY"8xJ&,$ Pg:T^I0p8#֮멲EL:lOm;N EY[&xOsU1}9!o1pSzuV KwDnJgi?"ɭ$3dq&ϯj- [[XHem%DSނ H{ [}c})G4F pNN8Cu|[07Fzu ra-)ŤYIJ΃ 19=1D쐈@S8=v{jdsysc=NH(g<LvFIDf8o1)GsXʐgy #Py{y$Ǵr2) 8hfu$oe[lbY"DW+3x>+_+qVJZJ ra=k=!AA>zOY&x9r9]Iw5VIHow3]_1$1Q|;{I"InBFp[  `c+^RT4VǙ0Av<zO.v/:ZnQ`|:qOg}k_:Ia3L@AQYEw'&JF'3߁R݊\oiSݶ+Jᦐ()QCF8O5=vQ+ = ?ZItHob E15$2WeY#Ynod J[H0y`p3ϨSYdIjf/0, b@I#f#,Aݝpkr>Y6$8%1'=`Gl*PDcrdR 3>ܚӵa[ymuĉe[yyҋ7ƅ7Z<7 #F iDɧErmu8ʹp&p@c2I'⣺GHCwwh?"H03֬%Žg߈4"!ȧ(c&veg5ʢuItXp1@3SNmV]H<1vBA'/ɂ`"XL :o\9 aA$mncq}ywlnQ+ԞrI)4UeԴ.d.0 }O]+ }<^G=vde0n!s##cxukx؍&>d#Аp==n%Z5Զ8զg_4 $B\&RHkMݽwr=;TƖ{=}ȶCb9HMf/)'+l;\# q1)>,o-rFWVu z m;R9Nr@[Yo:z–ϧזWpH&3x$@jίcdjPҬ;{]Gd' A$ԯ{9֒.` d:rºDНJLYxNŗy`c r<;`%FRq9X %m!Yјb Ȩ䱿kH &[-GvR xŀRA} M5p$IJZd@sFcsxP6b)#'6~+uդ_m+` _B m z{AnUhy$aqSq<5YY#`pX89N:=: y8, 9+兘CycL t^iksi 8;RA 9+fO2$pfRT8TD\$j9rמեh|cO2#-r?OJ+2@c0p&"OӒxz蛝R,sHϩ'&iyls޳hSHYpU5Km% 0aL{pO?ZOA>+ 89{ԖcD`21c-'[ey ':F PQFOa}DsIhrA#'{V ū8$ R:}i+Jႉ$'I4P^2 1掂vrV $̱2nG2 M+UKdOJ &)}J7 ,Uxۥ:x,H*k=i(%~XL M4Qw2Fq[T私KwdڈW=9)w>P1z$gju5`:EYrJ*@$34r u>کA=~. k.Gg_ AmrA=@kδֵCT].x6<#Es[c %4{KIt9jbb@uzgDiX.aS7$1Lpn^e8I#]ݒ~q֝˷3!akK5o6~֨O-PsZn[vK + +'zD A[,N{㰡m^kM<Ő LH %Wp;ޡ{Te '\\x0cʁz`Z[YE=Igpߞnyl~^PC%2UMhS{3VRnk.$U s= J$%TI!nY2yJȳIs@9AY$fȱv9g#dcg5%V,FDZ"U@{O=;@g bfcgHaYL &(NrQ9ݎԖyn!2mؔ$ rA g$A x.0`~5i2\Ft%RT px瞵Z[ojږm<"I2I fN O9Յԣ|/a[ˤԶkm&4';] c!&f!dm[RQN rA8ogw=MtwKm#qF$sqN[kcMI8f!(Č894\c2m [{[$"6zD&91E+bw0#$V$Nixd20$ V 88ҮGh6Z5ggcIgZӮR.o'im[-.:@taaahΧ{5ݜGnq1ɷ,7;eoΉ{"acASH#֝lC_KI<^m#@#A#^ַ]ib6M6O<4c+0A#8<⧮4 4/QmGSE{ۛtx&DS RWգ4kqm58%N$@MzHCuo_H ŌsKص푠Ku֓$QsPZl7b5Yl)n,-LQܔ,8 ܌U7Y5YuY,J>Cly2x fK wF1.S-=q@㻓11#)UP̬A8 q4~kӧ"y$8%qx8>uK,Y0|0p2p2}j )t͌.uw}:xCT9~S b޻m`$I##v CnW^Lqx@WWI؜u jv"5>,sʳ\Ja"*I=I? YXڭŬ нB5wz p~7dtaWt]X 0! @-@skak eXnJpb!ySgӄsYcr1CL-Qn,me7kT\$'9$p3jG]ƞwjUݤ8!f FpGFB7:4O%& FJ F34 s;kY<5( Lw+[iKKG;Eg2FG=kh=O'ևL|8g]O6R# a'nd07L1#b9@=Ju]@ {:霠tDH$ W_o ]m[pk[s(Y#4r;?J ]è2ɿ$tHr`), ' 9aElggQu-V ܺ`Pqo$ %<+d)#Cx"81Dש?;+02Wf"79F8e_yO[Sq7;A9jꉢހ(Cˊ~GIbm$bNG O,}ݒ:tk\ RjmgO$t\<϶[k66:#}jSoV}eho[ VD* ql!P" evgBkE:+KM<Ⱦ]g>`#NN1Wݳ! ϓN'5 H,\&G9*EʐnC[ =h/Pٞ0vZ͹瞝8>u`N-k&:FG#gYP*U勩VWv>{-YE﷼[xLaqZnX,aF !\5/9#>KpdT؜Aqpr{մV"QԂ8sI $xLz;6n<(Ǯ HɽnXH<ڮjyi< sSBS*s3m< 덇QС!77 Hp{15͍Y-BA 1N[zzqQ"m廞Ba,Ǧ*Y7 1L2wgF/wonn/l%bQ-ƮL ֒FWiIs~5b>I-Sc9EWc' "bdLHۉscPͨ8fE:Tmᶉp|,^39^ե m{gB2619V&%IonS9Nq#=;OG=ZyKogw=z׺ۭț$rV ##L[-uFed=:#2X%7gR;uƥR饚Lk}H\q09$ps)ukDdذ۹NQ"M;$k)$f}:]Z8ilᐅNGgز-0kadJ$ sҷqfK9ԕ/'|7Xu*Km#Ҡm*)m^HvQ$A 0zCHLb{!qBF2qz\Gowm:=[0>R.%'$*ŮaYnhBHXpGr:zUXa9-RicyA* ב\yxV,L|.%b P9 dۚe.$ou ,=H <\1j\\LqEH  I=.oYLQF$qI^j-) chZGaH$dBcG}g+Gl%# 8$#scg5)$k̮O5ڮ\˧ţã{;,A Xg 2Sn5R=e<CPk2-^)>|.qr1Z$Jʢ0l޼}GҲƜeq;@cc 1s0 N Q*q"2=t 9Ha};ez2d rI(W8q $zvީ̋(d `着ؼ/-J8'U5Z1$O _HrXn¨2 ;K)BTpR890 A'=Wc`,Hd[O'zqrI!UG cplnX6 'ӧkuXn&R"@ZH'?ҬrE)yadHd !OO!D H:gίʖD>#(FC ׷Rӥ0pG$%Ǔ,QCG!2 p2zO"Ž̦)8pG \;zswnC1 SڢVi c2 2l“ڧæR4rr8zId 9yL!kfq!r\r1b[ b9d7*Kzr:SKy8v0Xd`sz,hm4ަ"VB玠f-#%f[Tiu9$1]OR ̣%-ؒ#rX;# t-ԮʰIc1 xYok@Kes\TLm#9 >cڵ4?m$F1$ 捅 ,1EL9H3ZKnVݦ+ I&B7)4"Vxl*9$)6I⎂u7k VI+$89ēG#^>u5ڋBa&1$qUHmb$lYzY7܃m\ͼU3yAC/n-X yy 5GʒrPD;zd~>X3mV9M7}ͤțD1zUvb1u9IM1IҔ)#=id{ǭJH g1N̳\## ICɱ+ڴ|gzҳ:b,,bYc]Đ@J򼓒Fs[8PnxR3iZ8'=ThhCr&_$cR^d0, f =jZLKD#`2rr;vmA܇T0r)HOXdɟ{sޭ'ԛI$#0(9z(Nѡ p{ j<czRɱY6?PJ@0@1g=9Z\^ݺ6K3Hx9U'Ͼ(@ڸ1}a&5ܗv'lU'PBsZ{`|ʙmǧZ= S~\ 3ϷO%* d@$&e&9\ ar8tuڴN#K|_M﹋#ob{KiDp3L@Q84X~NG~{s$(_6+u)>_]nV{KK6: pkX׺}yL-ԧ++< $qDn`HRnԞ5Bjkqo$0[㰭=R-?Hx);f:zbS8E}NKImFX7AiIxũ,G8֧ҏu4E=Ҽ̰D#UOCs)|#kh5 #IU4ikih-/ᘳ@&N楽OJ;9A8#ܤ\T$H9QhU d@K1683mHݪY%9c6̰3aP OLg;*r8"3CqR,%@H};S닷 q$<BZ-*m]T+1 Je@מ} $!$G䲔$ lc%hvHc'\=xސE&Hmg8Y_F9RAY)FE2J\&yH/ IƧwbbE98-%b;0!P.Dc`nR@dRBYH] r\}@vƮZ\57Xf)+ 6bNIVtɑYO^-% 9@nGCLKo0[ϲvB#eϦZfV㸎Ȣ惨*@T!'f7$ p$`ϫQ>dZHt0`pplQ9żM%䖰{,,卲>,ǷlԢkֱRKnH+mʨDC a<'={0E M:Yvvi%U 1Cu<چnu?eD}E1zG'm#[JDH8r3*$=-%@~&.#fɈ(Tq|v2.YB&Kn>?4|pSԞkWG{r5 KQ pNDq< #ާMΧ6V*i:v<ב:Ȓ~b3נsh-/.mŬ ]@rIZaG;ƶE1A ':HRcu4ױ6qʏ|a!$OSKtRks[n/dP߰URH9{Ⲽ='GYe.˔s~p)oy >v(i .It_&[ Aoo$g֐,Br~^+Цu=a4}GYN$9NJHyWR!!#k {WMIm ieB#O-3ӌtos,i-n63ִ<('V_cCJqg%W)i??4QMC?S%TѨ%/I]?U/fY\Ek-[[BѾRC/wS?1Zsu?_Eb}_e(﹧טU\DŽ#E7?f/w 袛C?]+y:(M ѿ QIs!i_+F_KE=NB5 (\w^ksj? TSOzKYsE=3sh|cSOŠ)׏ƴfR?Ί+9ntDZEkb^O^Ί)-.?]L(XjM]L|dQdzGhzGKd$_S?ZB2}Bbo\O!b+>kb{?ZٿX?K4Q[>v_(j?4?QYKsۡ_GBvEHK/ƚݨG"͟ݟ7?QH'@ֿ'JoE6<;! Ջo QLq ?w\Ov@R+&#F]"b?&l:7_v\h-RK [_ (P Nxl[MET΢>?]7@QE4vϡj?} 0 188 575 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((?" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?[7,ID7 Ӧ=י !S^jH9+5K닫P0>68#А#>4}:N[>?Ʋ1ۜⶵ[i_Ty'U&}^1S8 #'󩣉HN= 6lj@~ӷ  }:1y"v;*ܤ8`h=F衎qZ!gC, 0ᝧUG*O'B9+-yH:FPpr+sLJ+FFazijǓJwNZ`pO)r <й3Oz{N}i|C5>xUfӭeQf|HP1M$yGe8|y8#?Liʅ$sQ!F*azdr{]M70V,1\rS&KcM`1Z3{XqU@lsӊrHTqEW Ġ9wkryxZ5RUܓ1g?f1MWg { +#6;y<{ҵ_;.p;ѳ?7*XBHIZBHb01IZ5V$y#*{`uАRG9ԱgܓiБg'8,Fx=Ts1bGNÊ liS튬^\ TNO=H3kGČ]6{{ц-X'ֶ4< gDjQ<Չd.p3ڨj/cBe# B88TM!b2 N:?7UK-Ԏu m$O~zޡ.Ɗ<0p3SM'̯ pzTs3i5+LZDڤޢ#4' LP}jHT8d>Ґ?}/SX'ԫ0 4e=K[͜' E;|c{` rxsBD{mۿZd+P}{*:q$np*]=. M`?;M$^?1֪%gҸS}Y#u i;suV)ܥp<G@&0>ձX`F;Xg|6kno1?RDDd)mѥ>B dcziܾ3/0>QlGjx;P׉a,23oXm xx-B7FʽríKc*F֯t sk+E 5M=k[>"nlۆok @$! X'Z-zmgj`HC$[I2z2+fDk sS.T}!GQr3Ҙ `a#gl2(NT8Dst˨thn\xI$$ˑNjy6ACmۓ{sW4 Բ*v rrq8llO۸8-\μz#=qdO.0]O5yks!E@e>i!Kc(E[=S$)|˂>aV=2Yg"1L&Fq'5ہYf)lȪ83zS:?id Wpj&1Ҿ[v_2qQ$}.=h?H8'|l4+o/\ҒH=jpb6]؀~u2fbY5N*i 9Y}pwJKPfZzӖ\tjLrwlՓjP1qȫG ǵWmVeBXP-{si6:՘Xg88jOq49ŎGɱ$60r=>5DO^#2O%Pi$Qۗvn&(OAt϶*8T<8~YSB$8b{kH̗RErRb+I`XcoI/4Fn|#)IpC|t`&եbYpu9뚆@B8O^.%IUY8BZ p=qZXB܁ЎPs4AV'zRBl^Avx;mMW+KZmOn^v1?+q*#gJ\ФHnZMu@\;i+LT*9+{3sg4)id&Bg8Qt<5!q) 3Lc_N2}:WO 2H<Ԋ2p8as5j |w6h|Kr4u2@< L*u> FxcgOVl;MTdRjf{s|$T;Hv,}I9d|m@1LU<ّ6eJc: >XJb9#,rI$־>ϟ GH?ynkVnGFFb)L@3)q=~\?Zaϵ1{& #"<#nrsMpҀfdIE|}!ҙr,# QPw?2NI>d:8;ReYA#~[I&o=)]FxZHlVR'NGj($ZZ>(9랝JrI[d&xfUN e29}]Ò4c/jvwLg=R⥠ZE/FAb'93ܜRqE'(CJrsL'hP&V TCzRpЭrH%@O@$r7֛4ji)tm=)'Ђh3e"`TusûrzUxc96Hbyv#W ֩|HrWD(Py:Ȭ2r;Qq'ڞ'ۚREi%HEK.GL 5 jZv3HY[o?{)&t`221޽(:+C=nXd #e[7X9LH8MKs!fbcqaUېs. ښs a$d G9&+OX'1ISI(T3A`RÐ8:'@#K$&7.@_PI_GFX# 'ÒjIN z>Vrr;楋kW 3Ͻ$0"d{bO`PSתHj(]0=sYoN+WQ_I*4=_y}j1U2xUHm᳏եk{X==34 dyd'#fp 돧5VdS+x Gǡ=yYx¢ ex>ߔP cZB0c>I'1KE2r| =gHC348#9<N (G0!VA+KY}9\GoNq튠Ii$CHmyI.sߞ v=j*6HKfZ^\Ku'q3ؓ+:dZaz/ @8 (X{Ҳrs9RAN sJ.G)Z^a)\+)/P}`z>ڛXi$2egjJ rYHX`WX)n'?ʐ iF[cW㞦m!IqOp1V#TfQ&ŸmmF zPT9⋏a\6ZʕzjeQ'&RV'2񚲣 IQAp;Z5=6.*܎OʹaqWyx5#ޚe5Тct?;i$)3N1J~Q=8Q%0idEMPIZG㠤+څXlb`R؅`c݉Fs֚sRVf P=p($"A U5%p1drk?- ?T ݕ4lUs*x[ܬLʾS\sPPvRZ[w\~!Vhdeʚ<;+&X`#LjI,B: +ҠU歬@##O~Lr9px}! N$i8$g9%Î~7,XgIsZznj$q҄:TNp:#I9$S#$2R $ }τAf{udu^:3)Ue+xq֬9#Z<>"n?kVl2D-<[VmbEi30Q=zPԅ7ȩ~_\qzO·b5<)ƽ $:̌?UdR8 Ӵi ZH=sLYbLf cs`3{g~:8JA䎵&܌S < %dfI8lHYl2?J71 9#Ў۲60V9<گhm;#P6`Us÷ǵPKO JBk$>@@s?UI$jn;K<'GZP3‘W'ii@KqAiFS+`8 rǠ jHT'b 3\Ei2ۣC ͹Fy28-I%R4 T"OՐʇzT!bC,c=>Q?;c9ڒfR(»:q,I$8J"$OzV zT޿S{Wg<ғ L`=yjUc1H| c=kKDFF50wz}p3VLd9NƠQF<{NČ#iʎݪ BHl8ޙ3eEe g d>42ZxiًXzM;/m8H2:Ԛ:vBsIJSsBOP@R1 p:Jx8̋ t{JxP>#=F;gFl!YךҼ'#Q IQE$F/A+&rF3ɥUe!HB6J:2~bk%K˅K9_zχoQ{7 ?4z}+<7z9$u9\b8muQ@549%D\ 9,h$Wf6TBmdΥɠ<ൌJ|Fr}H\WM[5w"D^W\k6r]`8+>-Kp!3==KCc'ҵ8bU!bzχ $MyI#.\FPԕ;tnqƽ@ ޤyK fcHNi|hl*{T2Z= ȯ> XBNw?Ŀ -dH2C W],dg^wW6ii 2L-G;l1Eb\Ux]qoI\N>ϭJR[>r"2E2Tm;ʫwwP ,}5F(!Ejd$$*G-rsSC֥ WGE[#J\$b6$ :;S {ӊ/cUv cz`y\NE3c?Zn x`}j14=jSM]+2)ַhpr600#V-zRN(]?,P'gҘϭ-ȬBL 6p:jO2&cPwpI7|ȮY{Tl.<{/?n˲iDhV27<9 H sBWY8m؝Ȇ[qLe&6*qi~|qxf7Tb0yi] T\)B/6#ׯRGCcwyd%Mܥ"FKc]τZ5v݀rد8Vu?89Ǧ+ꏇWڎlI#gRN*i\< EnF9,p?wr4R6V,l5vD򼄁ϵsUB,sֱƯl-A2x56bOWx1Ki{Ra}F|@ΡGodpͷֹ-Rs 55Iv&$h4`%7E*DWkC`1Jϥ=+ =]@NIrOQZZ031E#S2eO?QE¶ gesX#`H)O' 2tC믬e]=NWDw~эUSj25Ѫ֓jy2er |B.F15~0ŪhE8Оk|!?)?=o5]l1_=WlX'0GCJ~ҳf^b.q^Q[kzrB#~O -Uf#{Pcr8#>-| 85 6'=G=jǵNILhʌ{M03C21N"ܪ'vXc>ך.Ν t'>⾫&I>‹BbWң(b}٤nO:q"Hm 1DN Kl'CQѫ-?;T~ljLp:zɼ.p*9nY8cqvNO7:ơ1,F!Gr}Swl}G$owm[LV.x8?wެAoᶕៃ^’-ډՔ4v[߀v08V?7j~gZcU+#̄ 9VMjCdT,*>, gU nܙ*4Lgڣb\Zod@8Ubx_ m̦FxEhDj DcTVUՆcF3zs8|)חL HZi@kZ: sij\B+RM&K'5_O#b˩8ϵT4=~(iWF82Xg W-m$*95`FW{gBy>i:ۛ10 V'gbIؓO5Bla&VxI7(Q3Ub9Q2.i\j0EfY̑krħYALCH?Î`ӕĉLH9gyKdַR*yuIfEX9#{Rnbe2)6ܤgb=ɩ E'"{Gr=,pvn{q<~EM!%J`*^W昱mry>6$T0lo``}R% y_F`Oԙ|?{E$bA\zzH9_Xf4 cvjY\Ɛ.YQ_R)s{ G`)'ב>\4qX`Qy;'+ȫ.E>5xֻAmzh| u.e{0G!(WH3/ʮsҶ(%q&Tb5}ymBƠc:0GcV?R}=jK#.+&[ Q%HHדޒo]ȼsҹչ99%dDܾ }mqn<uⱞ9#%P*%9tdsʄuxe`$6LSS-eVNL>_ZtA8ЁG.Dm KQ鸎Z1.F,>"?MkrdJ8='#D}l“LZHܧҵ`znRw3,}'=ja\dՋVy`?X9e.8Rr 7??)աԉ4+Ib8'DpeI_)#~m{ήvbg['asG_JбRH8I{zSfګ&r0zH$IIO#B($>3&8hB`ЌPpOj+u4֙ NGf*?JrBvP!RSgnI[sк֡9#,s]:S KnVgbsIn2ΫVT8I!'vN:ps뚾P&Kp;l'\sIɤKlҴH쥸n=jYO #" FG5+08U1M 1㰫0boxZU$Gowq^Tq^56y'p'v kRXX &s`_㣶ҦQLiMG` 9U𾦡)NJU,c_oJcB'Vauss>-G8dC]YFgoiE3}+9giI5e?0zQm'|^R)nx8t|7Ҽt|7,l9XJ6Ϊw:c&Wwqۅq NY\i0`8gu#K_?8 q |赥=Ȗ85q#a Պ3I(pS❐"`'ҘxhnBIOJblJiB96GK6W4!IN''(KK{H]dbXvs1!gM+ϝkg^Vw*WiSDtg@w)0n=9 vy4Z 5E/FWC=7cr 4%|wb$|>QOκDpO4}0w4 S۩ b5.Fr}oO~$qm$1nݤlq=MV|?{C, cp?zӮRJr|eÛnk-ĉkAAy⚒>z|97Z,WXijy : 7jH?d ˳,2ңxo {|W%^ϩ|@r# oa|5,*͌t485~8N<CLl:,w@ sUC)JN bӎ)O_j Sn/KMRlp &TF($qJ@ӵ;k,x%-2 y76cT2EHXu8Dc|k9KyqC?8&cYI#8$sak ` PF \@ t孊R4t>`E_fEI*⟡隖4Ir]j_jR*F,I\g_7'7ih:>rm8AXN08k~@+i#XE qz$%fI9D ずB1,Wh)*I& 7*;\WN|r0~&% 0aܹ*Fr:x1u\Ƭd]$!}3CSϽ AbTmR#15Ag}IVuɫl"gUh#bq][tP1@{-xUima-E8P΂՜%CGNeZLd ͘mچE 5?VA3,)p$b~{HYVfsNܬ® 5`3Dh;>IbInBRV r{6{\\\zU#@Od[^K%JwgMc!$T-<:M˷qXԱ֗vD:rFv֯W'm>@POR?^V:J W=Z%c޼u@dJk\͚&`t=4qF:'HI煣o,?jO9ֽv1ϓȯEr5ӟ:jzT ȥ==kM?«ykpqV3KHf}ۂ 8%d#)8cHkxVG[~YF=ז\YVqq ,G_>/8=EMb|ޜ$*WqPuiV$9,9&\K  U@0}@:ةH2GzYC3voduMQ(:߅?>,3' j߄bGcq\݈ms}*4|1z~4XwwMqڽ—yG!x kh k3iޙ zvr*AsO P0+~(_ 8\E'>όqZ3Z]$!< ?ZMNJ~N3ނƁZEceO4P&iiݬ[s9Ӽ&޴L!]tZ57'5{E-aO ҲX[{?ZY|2N3=l5خS +qW3 omE 0+|rv@89ּκJw=Y8+eŢE+bҲ1ҩ`Ib3Kd[ȹs͔QLbwҩ̵%\ܘăpҵO̠78qjgs4)AMlZp$#KhRx4=+ؼD<&tr @VQFX˰>b?0Y!b; t#hvO>4RR0F |N8@ރ9m;Bjc8=NK(ZPu JR3ɠ:,C6z^㯊|/a_>'b=^I%elM E\&i40208<ޡZvz|GsP ƍrPEl'E, X8Q@`6$fotocx/images/KB-shortcuts.jpg0000664000175000017500000013672515247006660015345 0ustar micomicoJFIFHHExifMM*V^(1fixHHgnome-screenshot02320100fotocx-26.0: Crop: width:393 height:686|fotocx-26.0: Sharpen: median diff 1 17 16|fotocx-26.0: Rescale: width:354 height:618|fotocx-26.3: Copy in Image|fotocx-26.6: Rescale: width:318 height:556| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 618 354 1 2 2 C     C   ,>" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?B$"QS袀 ( ( ( (ץ`7ke8W^5d8/w@ӥc\[d]N# :Ncßhxidm_eŘz䊿OSx[fx+UU-Ge"4`I+O}\)`u-O |7Ǎu_o2޵.MrKlT3\aռ[&M7\j60:e>a13Ҁ?@yjU-x@𿍼?aSB]o)I&|00ǦlYO[ǍWI,,n[ihp1}G>o~8м;sI) vZ {}shJUοw~5׼2%[#To erfӞ|AQ'C:uٞ=U vV_ M=x!{' O^CY;UզOʋM(_%>rq^k 3VS?uoUdM^Y@ʓmzҀ>7#+=+27O3G q/?/+7^(մk'ƑFtiW1c'_OWW?+XѴ{K.~-};47Oer>*e7 3c3R|/ ֧.̦;˨Es ^+OjxKuck-\6VSmmjk:͏GP \JX O+?\}s^*-zc18!+vӚ 0Mc~:/ڽV]~4j:Υ-O.r..@ܯ8eTpd]O?aq@n5V[=stf:W%. nW\,6[KkKZ]B^G|zPkA=IhX[Zo0IQ?_ˍ0P=k 侏 aרmtF`a#߷ы@.~F6n}+/8$.EnYWz/RkB?eo]fS\}]F}o1tJ>n۸G8X\8r'?v] ][ G8q##3ڽ͆$]y|h5ve 84چ- o<6 mllX(睯J,͚+CQv(X٢5kQ;_Ϳ‹o Gymhj?o/hI_Qn-ÜsڰMӏfӯf7Wf)&0[(睯Lv<ZgÚ!> mQt}>1rvnkK9-mmRUh wO Gymhj?opZׅ {LJ2;T[r\1~*+o?hZw4=+4W5kQ;_Ϳ‹^~s6V~-,Wc ++3k>t(]SFԴ@eunD ?5kQ;_Ϳ‹ xNÚLdi JX8$v34mpk6 ЬP >$[9^ynhj?oCQv w3cMW[u::ʭk !BZ֓Y-.G2Ҵ5kQ;_Ϳ‹G/SIM}D *IxE~x4xKƔ5$-%w99#=kGCQv(X xDԯ/WWXTlnV;y#މI{K)`3nhj?oCQv ~ Zd/$#:{ooS]w);KMд]#OPQ)=NCQv(X٤eH#;_Ϳ Gym\,%Ɖ(rb`{)lFYLB`j-зPu G[(X0=*`9Î*<6 ?5kQp ЧPӬEs#ujro睯EJǻ lw/]4(zhfK_zz!Ǎ~l&j7ky2_NX$m>'8,FJ1D%I,d^KWgo#yPژbKoޙ ?i>ѮsX?o؎U{}3%ϝ? _KDk>V__mtw xEFf>V!_?ٯǟ%n/5m+\Hl,BÞ/rGf]{j4y:"bW/P#eyY,-"@|#b"|mwҴL°Y]yh'2ɴSAs.Fc~J$ __&e_~˞:_uk-cK ťB pA9z~"\Naz\zLC b0OH :3],Mf@X5Qùch5UX.rf@X5/DЫ_w$a,nh&u&dlyܘ'j nŚni)@Bhԝ̬KFI_C ^i⾧oHym3\-Yl&Ӯ"gRacsTb 5ӌ)^+$^2<Dz#tHmI wᦥieՆ2ir,/J.̭I{vi)Xwot xz -m9.CCfo4??<7Q%5)&eg3ǥyo:Vx{ĖVtmo΂\JfT׾^)k+\>a|mێsȖ"-<{H]. ,<[fAny%䴎c>Z/{Tcφzimiz}Jib"¬D2qGh~'4:Kqjkwy$8HcrH;N8>+x6톋㋯M RmJ}6<7edB%žsң|We?=SSloַ#74I5.ƌ8 T1-qk+ ZT7mfp%/jI*x8 Ǥf-Afwpq,#K1䞦_yt?_sMr=R @C }k5_ڗw7^ԒH&m<g3"r ǮhjccݑEVV 29c-kz&N|]\> vi"B1$9G6u⏆^̽`Wc}袊`QEQEQEQEQEQEQEQE(Y?l݇AwW,6k?cDO'FO梒ɧ,veNl`"uQ@b$N:Sx?]>[utU sUmՏo⯣wAuQE ( ( (*zen2Byv^cx?𱺷8$`TϿjM7ׄ}:;  vgKk{(5 HZtFIm:oV1o,h;b0w+2dUx?xwSڦll$( Xø ֩%lϺthfg`YZA  +x?Q?|_{O[Xq-؅IҼe<3Nzm}.b9.e?1m ]M%Mk nU%YFBORÉzw-cog Gqc߸O%zV啅e vH"(@+Ѿ+|EԟIVҢ i"(J |GPy伛G_PV.Wr JvQE0 ( ( ( ( ( ( ( (wW,6k?R;+O5ai1M'FOI\ޓ#}z'k?1!+xSW|Sj^0uM>>Vs 茑,満Z( ( ( ( hl{x"@ 8kC >&s ,dԮPIRp&c^}4s &TB828P}O| xľ 杬x7R<5 ny<[Wel5DՍE}|_W4WP|EY髾U}A`pqc-Z c!A##_<_g5}J/ E-|9cǧ" @'ǵ><_{/%;=#ݓ~kYez-Ϩ| úod;=#M|9{jEyP8P$^%O/M{{~4G_.8UYQT/.xwq\y)ORѧB)argY0RzZu_xKz>[>$|srsN\}O_8|}o4h $rF'GRsG_3𿃼$tM[WRcim-۹+)f,Z-*ivĩx!XOHי|_Wx>?t}sIK]i-.#}0l=iI˰;Fi>$<+ٗž4qjhzy-\% X#[[_v֟ 4w־JdG`hmX*95oQcG-^GzŞeauuqfYȣvWRdsk_#h+O6bݺx5~U5bZkMac #ҪZ~W/{RuljtogmB1 X8pzg>au\FfL{n*Ϲ K[ߊ1:?-H*Zi\KAi_xA9}l,t)فH̏# >R <-6ťΗskmsOjE}C*Jē/|7G5oe:mG$(\*U$Nk>'}oWA `K{Kg\74HNptkB_'t+OI:|W6ҍ2(a* +~?iKD5x4hi <"IqXz}SVM0jxSвrE(c,'>%[x3Xb̾(๷\qo2ƭ$Ąx<5[NꗳZiڕSC2C^^Os3u]'&š֛ [ڃ>ԉ]|Ð[wޭ/ xoZ֋#EY>$mg0Gb3Wgχ>:^$ХGW]'QJe`P0cnv=v 1I \ƾ^ob~7Obmɳ3,e}sgk+w* 2Jר߳嘺q8ǝ=*W_ACoĞ%M;Ez֤Oq%#qoL:iMr?j$ #qۚÏxbĖgO<;H.u?3NQ$t#O3˺Gl<[Ν_;i} %ʒ<:ױ|O/ğ^xy5/5͂DҼlY?x`k#GmzD ݤ6l ]764ݼ[#Z[ wbYjK֬V7kƵ<*UnI9lՉQ@ʚ#L*̄D2py|C6c]FǺ֫g\_pܲAcĽ]ZM bTdܸ¿ ]";]FMOMM=wO?c;tkFęm_x]m4?Qx=GO):;/0m_rxk-SVkMp1l:Gp"99#t k#As6R;hٙUB*O|sV~¾)'ﵿְAwÆTՉ&]U/.k> ePMyO)xL<.KO{5{T@02YmzG/=h8_G1F *:j_籹|gI9J'W﬈W"Q_;4sA"z5ZG³2K` sZ%'sXӥn5SM@\DŇπ@5\~κ6x`w5  `%IgI4 J6]HgbQ44ipQWĠRp{Mײ{7UׇZ4uaP/ʛXϥZ>hZ :s\3wnMxP4_wqYX%<΅;Hȩ!ϯi>"Դ;GRI(f'.CXBZé2$o C.ey\C-R#ՅM@əy:[4xXԮKTfi K3}rqɚNϣxUY\urɻ̍e@ezT-rȡ:sm+i5ͦu#MCbY7=o~з5t>8<5ρ>y+e%y"W_l#`'1Nf?TYZkP>CF0@fwЃ_?|NԼ5YYZfhQ{?^K| ?+YlY]4"` b+#4hii(v (;+O5ak'4&#}z'ka#sO$3J><<'w|AFu [ԛNV@h`x|r񞕦 &\jh43>t}3]o | ֵڕk,im:6|2fhS R0\w4;m 嶯=ZkDp2τZ۵Z4n`E;ܚ~IGk#tvpxf@W{װ+xFYEVB^+-!!cwpe|K|}NmJWo%Ss'T4u-?7 |%uI^~mpqoC KgGs46q 7I+qIk?:-k}'djH[8K~H#Һx'I4ݭlF$rXƚj)A%PŠ({%ޗgu;6+ߑ_wt_xWnKQ5O*A`ܜ};W\ȑYCI<}@2b'~^15k6cX^hMr9}ȯF\)ҡ_L/ǿ&oioq]`KnK3|czY?bRk=U4ImP G&~>;5]N[94YlbۣXÇ,<1U߆ x[ / o:\f Kfn}lGx?Z~r V^,gҬgKec4R);]dݼ3ktt}:,h$cI=;mORV)^ O3+?aO&[eNv(FۑZk> ZPշ#[+a%q } 7IҼC֞^$iy>>`Ag'/ecqlN.#3Iv3i%M<᭟ͨi4{B~˹``qT:xC -K+$a%SE{*O>D%PE<Fml#j~z֥P^O*FXՉrW!w8_k?x:@MKG7˧ƑX@q7TO0]V&6bZ[12媆CQJY~ξӢaњ;{[,b2⺝ uCW䱿(nZ&*cj@8Lwa#)Q\٬]HY?l݇AƉ4?#] ɞOZ紟?#]!9~'705?z&=vwBK9/5?Njk|Iot&լ/uy<[kR0;Wx◂>.6}b7E[ cpϡO𕶤`FQIcl2wg n}LҲޓ~5nvJse   L+3H.iSՄ U\!&L `ֶw{Mc.2Yc?:v'b #׎;xOr=QǏŌhǧnu]OWpRWC`oe }AOAe*CeIкcgj^.|xilͫk 84A!][GZw#Sǭ7{{k{u[mS褜1TWSp u02չ}hw-YnmV[FrGҴzr? WY$NYۈ;! d IזzfNhྎ(V|{_P>_~"|2wU/Jj6s4y3#/E 5|hl!a$ܑ,e@E~½6H𶝭ǪAi[jQIsEmwd#y㊷k^[5 CMGsծxCZ->"̾7oYgN<= ӴA:!n5|E->3Y^ O%oy%ܧ9澯tY7=֧wn-Wi$l(꣒}&M>%j_c<ߴWL7{PkX-NJ55WuƖT6#(awI35_CjWV~#Z}ɒh~Y>Hy`նy)plIp9YGgOxSQ,unѕv 62}Jfh?kP[xUݴBąr]>#{=n9GX29nl+4O.byvY@m5Z?5Z}6Fe"P B0Qd̂zψ_ CqGM,Әw.>Slq֫jhV- ,n9\(ee$osU-熵gܚ'G[KI(HX1P6@+KǞ-5|wZhzJ`0[wq!=y$_PZ65$'Nm_#86!`w^EGg#RIl"ckMEmy~CI'v$y<3&+@\[ Yl5] 5ǝkwq{Wt+18#8zkk̟cUTVw6T$8z~ ֡i /8U302wu^Au+vp=Ĭs*oW|9i#kYɨ[j k3,1sfjlQ|F@WO񔶋%ԦE2fdlfm20:75-2oX7Qӭ=.0J块b}%oKoKmjt?h6W'fpBF+0YZAӴKoOЗKd),(Sj4wW<_fk>**֤xyWRP ]5/Jx^gT|!X^Xia;,R4'l8-,h't4}F(Y",$2:Gzoe4xKޭ?hN$#ί/B'Њ:u/-+_־mWM:,)Xg}U|evֺM@-ϕx[4$w0VZΡ=%ioU%6R;g:OčJ'>Z=nGa3~|Qd[x;t~3Z6p|Sd$a>ўq&|?{|;&+պ}<&,SlÂJ_Z5^QV%}joi}bY[2!A g_u5͠X&ߧ'v>OAGs5Ei\xY{BM~Q!UrKSswLfu6Y=!6*0 )װ{W6BS+J}֏!j~6OF}{;xo 4f6,e+8ii 7mqqqu,VH[ 0Tdc~zmZ=Mgw)V(r0]y8>U]OXj oRTFvq,sτ-u/i,bS +\ȓ b9\Hʹ8ֻ|p|ρҿV*M2Td^ =qź^𾯬=>[zD-?:zo~Z\-4fd ʊ I,8wm}/Ķz5 [6!knF`_d1ҩu$kM 6B=?źiRC3A '>?x"|7 ƭm:ެCl{&B_#ٳ׉>(4÷ZknR5Pc**y9Ǟ"w6LΛm4ӈpNܴn+TisY}kPwCDEHn}(> d4Ԁ]>]O: [E[T$$Gqa%Gr1 U1'iW캤~F[{ȅaV=G~:T./5V[xtXc`kQ~fpeZny~ C][oiھolZK*MrC(^`W5htWsV}A6FJ}90_I~4>!|)^WPFT`qSBG߳m#.Oi5'ѓOa2)"$mb3u=6?02OsLaEPEPEPJFgGr#f? &4I}^fp0  =}^:|?a ^Zxj [ב̎ I;V|_{Zk~7QM'L]#I1if*"iz|6ƫw5=iSzɟ4nm^yk6a)\3ftRz}~׿gož揭J<5viw- *cVPdž4ۍ[K}'_Mrit(C:b#XӴ,⽯ҌN}i%`>{|qW]/tY]!!P`, }ompāb"c`R`g8֗ބpVkٿRSEkgFYNmc#"#c';7b/ٳY.5mVZ:Oq4=S$MHpW5F9z,k_ i~WWyH'af#vvERQEQEQEҹdYv\٬IN<]|?#ZgGc>i rQ+}ҹu?#_$ |Y⎻lI!Uź¤(3֕ isӁM1I~ Ҟ:Nİ]]joi5 mu~(QjǞ |/nt/!++IA&p#k vgږw"kY⹄u8##jz_52:Ŝ:}6l|`qϥ??_]s{{(92VA;u3VjzΟB71ڲ\ʱ>=/أ○$&OkYXeX5S =v+<'wT1]6{FYNxtpzӖ0:quZLVci ^p2x_;?]{JS4<-bư.vLV<@okwWZACv,q 6P݀5\IpˑdT υeobѯżIm:H]P{u3[;ĺޫE]V-%dSwW[u @"(;gQEQEQEQEQEQEQEQEҹdYv\٬Ii_7_ךF5Okk 7>)`jlp7\ZzOҶ|C?;o nżGswuװh&2\ǷpkԼK .o|)=3AMgGuquѡŷ_kh&l~nF޾ҫճ>;5ɬ<Z5"A$v?m#D<ZiӵVڅERw#'z9>ڿm4qt#Ym.QYx'_m7_dɷ|C8LGuC#?4i<Z7ބqP>Z%ƥ"m4O{ecl`pkVЭ8 >Mψ~ x~ ^< sK.{&sel׾aU[NIn~io^#5 m<-D2trꪖ6tqے~axJ}zEBG1%yjWs ix;3eHHv_KMj.y`ݹCv&U'hl ` +W}Xzs_^>(,.KۍJJ6F #T*T^k+S_##IգmNt2 oj9"fҪ:A((((((Q\٬]HY?l݇AƉ4?#]8sIB5whw/Q;Cn8tOk?\O#ѱV`7o̬޽hJ/ ºïɤkU^T(u U.a[$`P }gߟsOEPEPEPEPEP\/z__ 6[K|t@D]}y7c]֍h6Zt8T#&N|L<=qxD lcm {ǿ4iw@"7li"3p%=gM[=#ŲxRbH-cUHCmC>FFX)ÿ/IjͪXN.vz$P1m U4_x$wṮu˱cyF'`+!`z) u?xWVvZc\`AvA#yO?QxsXFo]_f"! ؈n_>ğ5~M3ij~!-cҴ{{26 z{TR5u¶q)>hPcD_fkq>Gɻ0{5][A{o [YEy@yCOQ'Ci5ښk/<_wo6L"2YD5VIJxAu-]4ﶽB$*I5i_|=xzt U8ؿd4 )@[g)IQq8gyN^LAEP0((((Gr#f? u#ҹdYv$oDЍkwRXh1iaE|,vȬ'FO־k%[5 ÚR>Mqik9'CmraV< Gw%МJp_7xcbޝJ:]v9+onaYpZAI nHmER5 ( ( ( (˪|;i}7Vw1A/"zׯW|dowo Cvi:_u+&v: '|tj|6mOwkvài.gqu=R椒"n ۜ/?i[Xhw}v4Hyn-źφ²j17W$Y}O >`{⹝/W~xfZWD8!L^#ptI艅ތ~+|ooHZe  0A9+|gPIxHUҼm׋&w'~\u࿀;4-B F/2[Dd&8ϥyǯt>&t_KdI.-xU*|}Խ[\m>-KV+]GR{7Ja.Nf'zowgiZ$1j:!K p $ݜ~6}O/Dܺ'IuOī*f•p7?fMHe>kk^2>_$f7ebvuuĿy,5ǁ,B#rA2Ͽj+O|Gе}OWӮKRet_\)5_Z j@:BsZ(((((('5ԎJFgLhIB57z?#]71ư]w=F 0*ܓ)8OJ߇+u{ljr_y1ӱ'b$* (8eO=B(aEPEPEPEP-s##Dmum[Sҭ7g_2qR\ooV/.uq-,W6א Ѷqס1g)/5Ov5{ZkY>vb?zaw2\z$t.MW:Zncq a8br=k+u M%=[Wc[..%bμ)bO[l]Z]ZeB_* {sOԓ3,uS]x^m[ZK4+.? 8ߴjl5kX8m|YR_<=cyGk5*EXn+ʾ0!ZŤՌVL+1Ȫ^Ҥ4u:1$J`_+ok}V_3["ma `2>Q&Mm?O&< ю^C״ZόWƟj:˾kv}t~rz=vXbb;?Zg xW+K.- 3t*>f{YP6" Fvk{__ 'j[( "RAffppM#so<}FF8kQP7ء0=W<r?_>^VFc{r ɮgg#đ~(喳ws}4?cXJM1 s5.:[R`+!waeczI=!U?LZ>u(M2#{X`+< KfRԴѮZ;@8J+ױ3M7%!.tЭ #T"hqnnzR (Q@Q@Q@ ;+O5ak'4&#}z'k\#}z'kq<G˺dgIMt=+T=ZMJ1&"'>!a4f>}2X7/+H?_B%Q@Š((((^5Q:m2OM[ZӮo-a>콫—woXsRFy!jд{o MF5.$x u#30L5|mt åçTι(4]#sP@.H _ MA,aP A\ΙkPY'CW%5;Βܔi$)HG8'^^Dl$^k+ug$wN _gx_QУ}Ɖ~2Zz̖K2?H [k<>;᾵}e]_jZvodu$odU-$Ee^{Ų:ڭ$VVۡ*v!#d' - M/cĥ$SHhv1 m'߇tH829wwsĒI&QE$XQE(((Q\٬]HY?l݇AƉ4?#]1<ffkoDЍkr[ţ_wXG)ܡ##{ Ξ1O|oqjno7v-f91c9oUn}^_Yx::WC{k00ۜKv4-D(PQEQEQEQEW~IޕWѿlU)_4oߞ6ϵ{q_yxq'-ӥhnZy$ }{:?u?ICMCk6bHae*8#+^)o?=-n5ͥ JC!]-|BU:4$u4Wi|J`rFy[# M$inY lFº~ozh$gM;:jz4R¶ ~F8⏋߈߆4jisO[ZԮYLy Ns_Z^ycuoi5ͫZ\ʪ0$uoxSE/'ZeQfu8!#獭_֧B44KHͦ'X#o̬XһxFoųOffҬ.aB$rѩ轳^q }My$sO'0+E> Qt CZiCqv>`r=sDtTuohڍӈy9*N=+7\/KJ,G[ ɵ+c3^-Ē?>`o}k6wg2 H)5Y-9Ә閅vq|q(r_ڧw%T< a!_*GnG%x]|Ii^4t5=x4mss$qn\.һcC澢w'eΑ$bf~=) +a]6ҭqebmwͫ4hRRQE(((Q\٬]HY?l݇AƉ4?#]#rszO h*|O:ڛx[IUk}p2#VT<ui:~%ҼU/l#H̆5LۚsHsxZWo(bCu$Hm\t~Wzdza7^|). UvL=ƙ{?|+qӭԼed*Fd|]>oxĖڤ޷ kuXdBᔕ\=8Wzz[!xLko <2Grһ+K}F yV{yPi0W5\iT1[ +h YTdu5^'XEM_bѡ-}-R<'ZHg[mZ=F{UOh\Fꟍw=|-p[Gt$ vsҊ-ZExZ>kogf8fh_+##Ho|Qt;Exi山/t+QS6{>Eb7c`Cۚn?i E7zޣjww0hVjX.l u;+5SúrK׵/Q:}T!]e.[ h~ӵ~ĖR_iiV4ۿe@p~b+E|cwj[wfKD3अ2G5:bEQEQEҹdYv\٬Ii?7עFFR:W7}^ܕF#a3៍>oMKJ/bYEg#>U߇?5x!Y RIڻA+f]H⫩lg!f;n,x9JI įG@ck!Xl.oI)`⾸XP$P#@:WPԾ <9T: -$ض#,jVnFAExKqm. G9{l6οƟK?^ӂ>yo~>SJ6<*đX )ߚywټ8;t|A4cg][Y^)_C}s_E1W~GqQM l!,.leM ꬸ?.;|4Ӽ7uiZ I'[L9'oxFOj0-EG"GeK$i񜀹f_bEİi7ZM;A7>d2jF NVRM#{4h75_imq櫆+.070Ҽ ~"xgT~;GPMrM"yK]Ls׌vzOmޝ?tniMѼvEsBў7?|BGi:=0{‘1&CR#UoYW2G "Q I>ynqxNtqurG|Em0A5a|?6-xck (3I #8U% &t_]&ix+ksP-2ULb0dbĨ8R{WК%ܷ]5hVFXd $g Â=G]ڶoxS'lLetfD #5@]PPQEQEQEҹdYv\٬Ii?7עF7W9}^eHCGX~IZk5|J,a;%*J8=izݥχ#YcF;0[th_;ZOu)V?(>pE®Xqi+m>VyiUyA\]\ƛ&;?O>/.y]@pzG׏׃vAc<2;BxOA㿃2_j,jT+#eaA^E+]{O\…^Ud VS((Q+iw΃, Я-Zsǭ݀m>DVu0r29Z&uxOBn MuR~R 1^{PBSP짿iQwS.ԙX;p1\xg/jm GteQIۛj;kM+>`Eqc*c IJm_RoE;F+Ó蚅lpÐ y>?Z^[ѵ [vˑJr|wM/ǰhլ!u7d&c4.@aHl~~)Gi%UѮd,-_ w5)8I2\Wx|2E61H2JUuX1SaGHbYU~g7698_3T^c[e><^i]lU:G5=Di),/5PtFRX 2xjAgC]4EHHPl[yDŽ?hv΍6i+i<g[_$73gMKKt _L{Hvpv9Sj$5CؾFoVֵsŢ*R Q9nwN[=K𝏍c"VIiIk Fo/St4~mdwaQqLש|Sk>)kNMb6JRjMia+^|hPBGՄLW9o@tb5;ۻ}B$@fttԥnjγ#e;:%V 2-ذe;O$;WxcÖ40KhCHU V B(aEPEPEPJFgGr#f? &4I}^8'FOE/Z<׎~}/ xXD1,X4:2Xf'IRM|3Id>+(4Fѯ 5ɒ@b-h)ݱheQ@Q@Q@Q@ ڸO<("Qs|u^`5" qiݼ:sRHH-xC3%Σ͉*TN>Sҳ.1lԓg MR9%v2&X n5ޛ . sUm2HkXcnaHh,7Sr XZ/gW]_cT`/647ĭ9v}Wiw–4t4P_F''GOz𗆵[e}=_{Y0I"urc ^ őin_YUEGuF \ mO_z`ZŌ""26Hc cv%l}E @h~rX 'g?x6rw{䯗lے~]}xQ|_=xM M6 ;x=K5?|YwyҾ؀P@j7E |$ij0Hc5?yרnsYt}B Aly)I$`#`+Ԩm,+ks~~>G{5մtcj4"3;IaU 6^/c=峖cK'cCLUF\vtS QE (((((Q\٬]HY?l݇AƉ4?#]ꟿ?7עF)>s({ aoXiSi%F[s&Jzd:Wǟ|=?O\sTL˫]ZZKf)O '}O. (QEQEQEQE|G=&]jRR&'slC޺sGuW3CG,kT2JУrg8á:_Y][I_6Qĉq*Ē. a7<˙4R"Ey*~ |{]rغTԢф,D^d)to׎+>:d~>/Xx!UI$eqb++Lx_> 4=|}eQF < 5hfP\iVѝѤcG|A2K?WE>Ӵ9-Y,Lf7d_a"ҵ]ᇅuVӡ{a AI}~B79_O:m#[tf@:`ZNQRPQEQEQEQEQEQEQEQEҹdYv\٬Ii?7עF6W9}^;N:⇰sĿMsJ_4RuO[ )FkIExg⟇"K}e;1ݢF@a<8z:ןxo: --eko Ӽ$ .q*:g5|rMzHG+<`R˷9wտfV4 D7WM , aol<07zNicP:9%s¯ ,2\CkՈ/.vp b7V]Z̓̂HH tOhj2xV÷t;β+_ $(~xV_|=gglbDVePnkAu4QEHŠ)h(((((((Q\٬]HY?l݇AƉ4?#] C!I{W=}^]񲃴})Ka+~?'h!$:1_M{ݘ$1!R:澪Rp7pO^id<skpũx~M7RD5+VUxe,0O|׾@j-";<ނ O^H#EQEQEW.~/HW ohu{k{aXIuG elQ[&[jR,eX1Y/^*]a xVF wmI{ToUVw^X9RCIBB^%n,!ljm#-i6D7Y-)/$v?|4E!@⫩/[wηψZN|C<=q6\ %?ݏ6X[Y-Wl4?QG$gYg$) 2zס|VOa4֚4 ͭn <1f'2!3vq mxI#6_@DIݙw}ъbՍs4?XinmXg')$d գyExCL𖫬Kw04k $9b3׊uٛS5k;/inVx7\4*#|C9+|/)|;HX0b/>U#c~%U6{ ]ESn1 Kn'#{MW5~ŵZyb+?uwnv9-3v|RfkYI2_XO y$pW*8`g ]&W66VG "0ϻn{ikӱjW55_QnlTo 2cf)~؊< DjP| >3ͣ Vb %V>kuzQA[[~\Ja,NIx{4*]gpصf¥$aG)mHI/]D:wIkmtcRt~7kL <[r\)(1ץdzz 8撐Š(((('5ԎJFgLhIB5H@ ;;}^Ny1:~κ&Zw CĚψ9/gNStΖ86 ۸I5?|@4]Pmm^yk$זyuNkmաcBN2955ǂ4OKѬnu;ĆYbH]?(8/'|_ x{J=JZ݌ʻQQ2sCއh_jC'][噙`r@o~ |AQwomddż)-(N~UOɦ2jz.o+9;F~lr@y<aw]nt)f(B3oI<o>.W¾'XnJGW?/8u ܞhL꿴,mX he4%vs Z>־"\,MAӬJV(q! ^EzmYbDaN@;䜞kKPKis"Ƒx.m%ױE^6<~)uRӮ~fM t>OχnǗXKj^!c0 Fpx}m?4{tum<$~BIlz%*woSt?^"Χ]~A'nї]ʞwU |T<5+TfA W.Bn1'&Ox὿OO%Y ȊaK@953Z-#[KKnq *@ܯiH륶9ɮxY]aXC$lQH` iAC_׵ɬy]$IUc8ڡjH"|@V|Izr{3DS/-{M:C/0Ky }sIg/&Aikp  ֫i?w g9İ۳_ bRۉr}ߗkܼ7eIӴMG62l.- q@`}zWt= \6`2 0wA3G/xKJǑhז ڧ-X7 3֏bơA!cO\U-Rh ԌQ;Y䢪 µ[(A/Þ֬l4}>KEy}67qQpHPC]_º/]"WӴxKD@D:kF$>zo|WeuukgBHխ.4<1IBl޾@"v6=qJu߃6ojӯ p{H&n|u;Y֏eCPr+~Y#lQP+~ /soV[Դ}2NHg4.A!p*NIo cx i#Jڂۨ-R;[O6:ޏm[A,ƀG#HŤb=XO֚O3;R|WygugkGD$G`9,W~ڍƯ"_^G?MPTJ]bULFk4/3M:-A.(F}=kS +Pgͨc fٻZIY@zQ֊(QEQEQEQEQEҹdYv\٬Ii?7עF7FsIB5eG7ᯈAK{mFhdCq+<ʸpVo xR:lpO[kgw RlAJ[y}>am*IJHnohk-|?|6-چ/qww+B$U Yumo_曥'Vm5+J6*H_#sc"EDEDQ0Ai&r.:+3CB]/`.i;dKiVLy;9h|cxZ k;[SlУ3:zW\ZAv'9rD ?Z|q$HQ@US!穤QEQESV~ B uK8ô*ى`˞b^=W1&CdP4kux"J/lu[3ӭe%ŕ l$Bv!`gi<׼¿տuOD(h{IDnbpzܿ֞@ G占:SDb6X۟+{|37^ZNvF>\jz͔#TB9.vMO_~/#ݶc|r .,Rx",ΥDX*(U(BQE ( ( ( ( ( ( ( (wW,6k?R;+O5ai1M'FOI\gj6v'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iQY?'-c)4\,iJFg'ѹOO;{O[ap;}E+Ɯ$4+Aң˲K).$Ynb=QfIA+s2o/b/b̓WGd?Vɿ?2O ]MْJh\.}-أ.}-ب$9'&ɿ?2O ]MْJh\.}-أ.}-ب$9'&ɿ?2O ]MْJh\.}-أ.}-ب$9'&ɿ?2O ]MْJh\.}-أ.}-ب$9'&ɿ?2O ]MْJh\.}-أ.}-ب$9'&ɿ?2O ]MْJh\.}-أ.}-ب$9'&ɿ?2O ]MْJh\.}-أ.}-ب$9/&ɿ?2N}2'&ɿ?2O ]ML&W|X.Me>Qe>T?ْ?WGl?vɿ1Ro >TIzP3UCqJ55[ q,2PQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEgSIK.RGc5NѡIEI]Pѭ]D#)y2 JSRffP}:hŋ:hKc-'{3RxzеD+}w%m[;hdn">i$ZjRƭ t˥UuU_Q}>#xڔ77^`ɺ4^iz>w(,bc$Nay[57cޯVm>*;p#\?7Ze /$\o/+GlP[/ `-x/7m/wE_W]˪˨iFy>|OjD?ۍKKյeĐE50d^Ysߊt{,ѶބJxG?ý3"4Բsy8hs]otOĿjNQRPQEQEQEQEQEQEQEQEQEQEQEQEQEQER:J\@a)_b\=FLW jӖut1"O;N^pNp3F(Ix8XR*iiܸ{H$ֆmꚪMX$IsvY}̀I=?:0=J8s94a VF!,[c+3rǷ Kۋ`\\%2q#mg k }[pd BV8^N;9i%E(!V#q+O~Tfotocx/images/edit-meta.jpg0000664000175000017500000027055315247006660014664 0ustar micomicoJFIFExifMM*V^(1fixgnome-screenshot0232=0100fotocx-25.1: Crop: width:523 height:825|fotocx-25.1: Sharpen: median diff 2 14 14|fotocx-25.1: paste area|fotocx-25.1: paste area|fotocx-26.0: Rescale: width:471 height:743|fotocx-26.0: paste area|fotocx-26.0: Paint Image|fotocx-26.3: Copy in Image|fotocx-26.6: Rescale: width:424 height:669|fotocx-26.7: paste area| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 669 424 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Q@Q@Q@Q@Q@Q@Q@Q@>J(8C.4|ZѾףx;Gx;MFT#UUQO̼k߃s;٬n%|- dt4>Ԙ;s>|YxOjZoZ\q5$FG׋~|eΫ+;ؽNj5czR?@A{:G$WĞ1'ƿմY/4XK}$P9Ȯ6v\{]gjwTf<7x;Ú5㛖[Y]TH=v gOZ[l~>hyik[̦Iq"Î>ŏ)7/~~.IygtY#ɑynT~ $c5Aa'==>\z%0Ҵ[{K 8B%ɩ5O6'Cmx@2ܱ1RH-p;eH#i$ud=|w׾xm1m561H Ĩ 8a|z⿈_ mNr4F Q@_ȳƏ(r{ҕ 3+o~z_x>E[E./$KE@@n9C犿hM>[߅- tVD'ռG>gzg&KcI)`~Q,@f=F7ThO*䚯쿥Njo!m="(XB#xw-W]Sƚ{b E'a}@??o{E |)}Zy|I/5)K "%ːUx+O=Yu1Oo FģImd|7 I ܿo{Go4⨸Yk"Dm2"WZBY#ظPUoU5-!) dxg,|vl}WZb9rFNݧ=ҿo{Go4⨸Y)~f]ZV׎o ٶmŵެ(2F2#{wM'M%RHgf'IjCF4⨸YkzgS de*IF8N8W $ޙZv3t,srs9^@;??o4⨸Yif$'jE_RvTQp:pLdaPCgy0qF2O'N=kkZrȖNVYc7HX1מ GީxUi+I9w\'[$n2_5X]Mk(立Uga@W.Z}N@(5g=M^kJ eUT+C`$rN95k5?^sIK߳mXf[0$r9|=>3$1HTzdNG u!?Ooz_;VCE]ɧ[jȆ-ַ"/[YѿOx.Ϧm'q[+>nq_[ӛNwh㇌wMT`3> Q7`u8:| ^-+ƺ׆nX"-9( qz_ϝh:A #C9StH|=Q,C\`,\=MO|χ=6hedIN0ka.G}w_ij:LZuͦ 1NHıHNq{ i1Z?k Pd8 S=ɦZO^U/3>wi&?g|ɣLϝ4z?ߓ@?g|ɣLϝ4z?ߓ@?g|ɣLϝ4z?ߓN^i&3>w`/QTߓG;h?g|ɣLϝ4X U3>w@^i&3>w*;h?w~M^i&3>w*;h?w~M;z?ߓEER?w~M';iz?ߓ@yt0( ]9Ґt5w'Kk^t9V#D}k챫|F/|OeZA%C,Q+9n1ՎQ/6ƃksa~kO#™Ѯe'4hR0HC=CJ4.YAUρǏ5X@tu i]ͪE#aVU8;^v?8m4Ll1_(^=g߇z^ eW kU#;42BQ% u {o n5}ŷ,_&Sb'IT"(JQ\FŎ3O[_!SOIj|\$JA]7\9Gn7Zx=v_oZO^X{x58cFic6$HÒ#wS? %2xR{SBzbL;nG}XٺM݆=oOaj5Ɨ+" nhQN[&?Nsm5v?mkO?ڞ]Z1V~zV߉h|%REj]갽i*og?ΧW=es6t}8|?=ޟ5񋘥<,F P.cNv??5a~k/=h^/֝ټ[Kwm\JFX@i؊G#F6V:W0O&Y rvH9};XfHl5Ŏ=|Zh\Hu p' ;\ƾMOŶ5>3~cLx.d#4E,N~njVϭOXiFl8ƾSitb3k>+Z;e0F̜nVM9S+ƝUxwWx9I#Eo[<"+pFI\3[Kݺ|m3\"?4ib}m5?hoڌַD[<0$Y?LY:97xZ,Vԡtx5X$B"*rIUtt liu/VƼ3ߵͦgҟŖ;KȮ FfI*Z:fƣiv~Tԭu?@nB-k||z5ʼno4çkc?6k&|SC ol!ۦ+;;ȵ[ {\3ƲǺ0 MNXӵiO4M6?ƾ{о5xD"0|>][+2"| *Gs.9/ĿuBO/ M׬ҵ @ reӜg9IsGgM:}O ?[VxWuRPiZ&ߪ\Gn7>;_n(xxܱJwØ3]<lh罏¬{)3罏3]?ƺZ(k3]?ƛ%N񮞛/RbqPkwznAoc.C1VRhȌ=?:myp`vUO?A^OMGkk;k]+Z 58q;Tz#Ge-q/ƐEse(^M<;>]CĨֺۆn 8AU%>>4 CQO3"+)*Oʃ3SLHF"mNFAhY5'C;HFPY:q^-|fkυ۽ťݲ6(lN7ײ<ѡp~! Cm> x@{kZi-l->S4.=+e-u ^Մ:j{;"d'rȻW}o[?R[n%h~^e9/#t ۼѝIkwǃ&KYu:{lȅr@֤"l z ;XdMr#B"^@š4+-<3_hP\pZO{5n0@s޲,> ᯂ|94{Q\W:Jח2wyeB1^Ѳд cOx*-;&&/WX,dhem䪶QT=+GZýE#u~T/aˀ\ܓNֺ?6^6f${|w ~̟uK~"N't=>Ayr-ʘBk_3M|7m^[*Vl"øbp15fҔ%wv8OxV5?kG弬$$qH:.@mx>_ ,xJl#mb4˯'kN?9W׽pzgmx?zyFc,EV#)r=Rd%7Z?<%,c|*{ڏ۴+ x~d:${Zwh$Ϩ?=pA;._^6fo35%X~q|SwGykNleB[f/~֧? A zSFK4vF#Aw;{|<k?v7B[oM`LF@QOq|S=aņw3)c\Rf 9Z?6^6frk?O3NctS -O>-4Aa+A&̙l0~9ODI4t4iǣɐZ w4845%ӟɞj)oe|M 6>~c.дsNx |wPsCeih1/?O3JJdžj?W|e&'|E=e=m'U5GuOlxVåd畣>g{פW4m?]w`4}"|k> 6A>|}yK6vYj^QRO Az΋O[Yh4& rO9'Ϧ1T?+;>qX۩RI?߁/49|ICšY x^4DHܩ }C?x×~ij:>l@0fRmۂs tg^_V%E"w$R M%! sZ+GC -| ow@!M..Q#ßϰ~>|gkvlzom* 8RG-~h??4_Q{_vAqך*M7sпw~k7sпw~k\|~/? ƻ*)X.qsпw~h]X.qs/?.vTQmn89_ 4y@ ]X||~/? ƻ*(qsпw~h]X.qsпw~h]X.qsпw~h]X.qsпw~h]X.qsпw~h]X.qsпw~h]X.qsпw~h]X.qsпw~h]X.qsпw~h]X||~/? ƻ*(qsпw~h]X.qsпw~h]X.q{пw~iĥ΁wLkʹqZekrf?iʄD jEР:1v泼7^,tvK@&Ͽ¶= a]$t10Kws]$"g^unn/wH|YHFC"ZJ?LӵɴNPCE; q*2Yl1.G iw[D#6( ]uIsqM;O^E}gsK`WX(8S޹^o߄L# 'RY1N(Ա͒ICMX6$/n|sxg:5Z<&|ۆ(FA*xV_<'xԴ^Ģ! 6c[i嘕w__g<a>Ƌݏ/]{LcB~Q,-\2B^7shyWwbcr7)( 㩭,rïF+l/lZ HPauǭ%sX{_?5Y[lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃lk(?emQ̃6_ox5lk)$յF_.F8o",#Tռ9F)nUY@S[Yk!kHdpJ=OCi7w]AdStcdfE!T#G(i0(?(ҏ.*Ա4KAA%Ҧ\ #1ŏA޸ a|;OiΏ]c}x#E$QNFAX\;xOGJ/t QoQ?7>*WK8{k6".W%|RG¿gjw1ZZA4#m@3@0Hot_Q_^ Q QӤ;[[R.1=zWlml-y#K3h1}KTtl>axcJxbܑ6+ Eo':CJP _[;N7ut&#W _i1Ik>߱@GW +εhأ:}b7q `g׎|i;?h}פ[B"1jlqA ?M;4?MᏇ5ɦ!i¢$@|bĝBG]J{yOS= _i4ٍ?_&xƚO4kZv+82Qp9䞸Č+E:eFt5%a-rHs1}X4f]cĒPH?٤uGo?]cD|/x5BF-ys;Tw%hxz_|7uk7&M(%WqQxڀ0~Gk? 1G8KȠ.RfAO@yۮj|--[XmRKvy!{gj ^5.o;O-JמGnlP5Ω58TǯU~ۦ2ӡQ$ތ"Ȟ|+ mT~$ -q{m7Njo1bǢojĆKﯯ\GցicW#ō1=K,dQ _ZֿZr__ )7#uֿgϴ?P?.3%>BVUuvSlbHuicEE䢀7~]h6wpcS;t{H s"A+_|IXKivj~i7z5OyS~R:z f/ +9smnNl̜#$W?e 9|y/t! \jtI?Jχ?oZ)lrFGO$We_H幰ӬJBHרx~|/u-"l UMyzcM}SRQXQ\Ҹd*bIKy8\=GA-ZoX/'l$h%Ԓ%/~%]f= ZV|;:_FnG9FRZF( _>_9Mυ-M [#.;UO*k$BKWkMa8jYu/J.Zđ?sڐ5] <}u/Yh7r[3rU<ްRh>1P=zOwyH+cs;Uzp{ 37\wۏ=uOWu<'J;kXf1#ՕTzcHЎ.eRЏ1c$'9S艳>a|MūZo%ipF-T 6A5Z&m.,7c!+{}"Vi) 𦟄2noʭKhVffBIfYT F zQ.Cſm O? gnڪZ=]ǚ":% i#4|Wܬ/JHo4wCi0H9ktmB իC?5: ԣZ#{/m0mG@[#4-5w| ,Eu-u ixv{K`,9 ;׵H/^`o8Um%|'γh\(#η63OjkE`;Րz>#񎜃GM4ӽ.¨ +M;(Nw ?k+I?)#xGVeΝs ir22H8fÈP0;EK)nxk5ŷZv h406QTcHP.s)Kc2"n}2][_Kim+ X>~Gtl |{t^n|%y6_Iq$Zb~ndy}/zZfh+UE=|`psЎ:WFĒںsi֪m"UU`%%j ;dr:%☮F)N8y OydΚ&xNKu}._FB^UbJIf#Ӿ+o8SIfH@EĖ1 3#ײtבr0;._m3_FkW_b4I#V.Q ~իi7[C<-2=#̿W7qg M0H 1:cvf:mUTDQ"[0g=;=.ěV&wS[ƺz?Kw`UU}_zk$QI${ Rp_k|COWv~<-t3J˷9#Ƙw_7FKxZ*Gڀ)oԿ煯o"U<y _7FKxZ*۽)\j3R'ELo"Կ煯o"\%݅E%ò3 [ u):k._Q2)R?K nMuM4zi:25]4s4 OMn<-?5$N մgkz?\ϩGJ5M4d^n>kk&Gf`ퟸ9Etn<-?4f<-5KH:g_X[&8䉆!W? 99?7Q{OMn>zz#TxdJ+huԿ:)O?GNM4_?.G}?4yjS[Mki ?NtE?i+DZlMK~<-yd):Z%ԏǵ(R= Uio5l쮭-&wX鏹M 8GoԿ煯o"SSOOyAEFtp[n+.KxZ(ߩ _EOΩP-@4ܞ.~?=O]R7_7MZ&Zs ?[ i=M>ZC.卯&5i ?Jv́iz/.'Ͻ&7Q{OMHfm7;\?ںkgjg]?4fMA4ӽ?~ [N0^mql~ve ե>`>MDLE7gZβBC~kDoVߏ|Uuqy,~ԯafV#e`=յt{$D0IBR2G~ZfeoĞ1OŤcў#TS3 zOC/XGblgS[ tV4)&p7z_|a M6xb[#{^!HO1шH0;iug[Ie|[]8v7w'S/F>+_-|iaz݆r&8F~5s?{_-3ԏO _z}41`ai㏞~$Zg|H77} mKW~<+'I!e}1з{~^ Ӿ$|*ު0I#^YF>#awZw6ccQYvm(d37~ xb|5mY)G%,Z!(F|Gj»ּt>;m3[\.D "5CqYXVpCji/Ϲ *y ~z1 r9;!vfhwl+?~- "/[i5ma"X,YzM[i A4Dd8Vz:銗8T75 r[WQzHkgx#}!C71;R*;i:ݎxv5-_WHĒZ -4< I zW+N~|3A"9y-Fr==zşM5.-VB_"mdXdW_q'.U]6QER[ 2[vFc jZHVx '>Լ}whKaHIc2EJKNA3]oAꐥ^'߈atbIkGị/=Sdw)T|p8 3='H<]aCe}7]&G/pZ(.z͌9+5HЏ%DhL>&RIb}~X?汇 r1J?3*GWZ5ՆakC]-5,~a<{K6/#E}GOe,415 ñLPXB+'^[d}J'<]T(m=q x'kQCgkmmwW]Z]$IzYY93 CWc@״ֵuX'&8?e,lw)ɶdc~ j~!5qx]]Z+ēXb_H˱kX.8Y-O⟅"o 'Zip@oW~nbH%dQ"2Ǐʹh |Jcw^\^`,CW@ʤ gһK?ExNPQ.tQ$vֿH7?Z<3=kg~$C w/DbXb#{!~9?6OWPVij:]_\iXȸf##Z4s'@W#$zs^ck֥mirO﷖y}qe`sbXkn"Ԗ V+ch΍֓xPL_ZV B{_oHU'$qygo./2 n8%w2ԡGLj [27r`׃TCoM5NQD@'IXz#ߵ=5u/!m偷$*웂ru}@yXU恫YOm>ة$1`˼ ӜTbX4;b|MAA ☮Q(;u}C?7&ڀ'?4ڱO3uq:F%Bnՠ76AAsX]ImcuiBH jkh7Hx#>TÏl $Qxޥ:4 ځ>bW1ºߍ E\I+_>- 2t8"KѵkZj1JFvf $R:,VGE CNI??;e=ocqS%SO$[IiJ3}}(/%ss:p??µKJnD [JL,ܴ>}Y%Y:axz%LWIvR7OatmCT۳`]DGW9*:?ϵܷOsmShU駿O6wT'!t]v C."!D#d+]#a=;7?No^F>oތC력!*:&7Jºˣ04k{iѮ<$L97c鲤>Sψ:Lnƛ˾{p{ҟ$7&7G#0ߘaq \T}5Ov`g tG0v{ڮK't_`^. =?qnޓ# }"'.1>z_xvx??E^y~!({h'`E1&W_񦛫bmZQ!0plCyO&"Z bLK˯_0^ߘ?SՈv:X?_R3}C/?E_o{>w@5/#70^ߘ?Q`ЋoGƥf G#70^ߘ,}h}/Կ{~a(f EB/=o{/?E{~a(hE_oR3}C/?E w@4}j_Fo`03}CƏ=K "Fo`0X4"}/_Q "_o{Q}xƤf H|3x0X{FOR?CEPI4T;kP{R3ϿiBKYk84Đ;FMjW r^D÷_o4K/ ?u-K"d1e U^3 wy=BͷadQ#r^$if`^e x4TDZ^%啕Οqq < .l6'*8X +Zwe6C É{*=\g?fnOUL:mk'E/#8l*\'O>3.+_7i~o=* 'f`gx^3Fk6ޓ6ծa%2&}M"iT+_o U|wSmK:/.m$x˗f"ԔQNO  6_C~u@̀Ʈyǯi|Lpu|GfD1T*e"ˏ$4 'U֩;-:}.i.գȱ3d.ҤWx᭧j7KDP@ml9.e|gnjoű6&c@ǥq ._uɬ"Oy6@9%+}'H~M>K4N}SDdRm zW V-ƚH!/ f47,|cxT]zLu;MB uBS[Td r=j1ɩ).H|SgYbkhk(w}ls_Cv,ͯ5tTY* NdoWW[~~#$._^J3MbY;|ްt/NI^0߆廿0u*A%UhJLsx#}ao-ۭn"޲#C o0K& ~~%H-t;[&]0ʗE *-#Ki(6J% 衉 kN#տ|s 6k]'L) / ҥl]on--ts,Pܖdi3^>6?G %p#k>x~V,zPەfp gċo N &a/;1CZ~Z|y %;{][³w,ErF<9nq\t7 r=Un6^lw^Tp)19,܃?R"Rеm HxgfȬp`JLVڬZ(h6Fvs3 Oj#Om/Gыo#Ԧxą-|FӀ_<)eZM.Q`L9o /j˿`<-M[ {-dT"HbhGZfVjZgO `6$waDpXKyFK^wOƅbrҺFѶHo?j^? O5t9u*B3ј(9J0۞~Q[v>kxkW/hֺ4BfWN9b||E-Y5+:\UX]$~3 cS'e֧ c`R Ӷ(L 0)vѶ ]mmh0(FL 0)vѶ ]mmh0(FL 0)vѶqK$݀0~oibGo0?m='#[w5;i1w]翥8xrcyVji 9 =n<7dzyV?ƣM@n]}< 2잜Ux74c-Yuޑ5lTtA9?zj?h€+ [.?yw[[z9ɇN [K-gͻVadE=&CwV _?A9n~oia_wޏG=X:L$}LJ@m[w~h>?jx74cV rzC[[[[w5?i!kKn@H!7XP̟i)@9`׉?tχ>,| ɼ*퓹O!άC*W}FGE ҾH7GVT=KߵkdVQtڱnې߰BU#E=嶟Ku9xQ7MŮw4mgXR x+X`ֺk|O-~%fq]SC e$ ǵE} 9-vG@d8#,-y/'" ݵنťͼci\|m/M5WN׵+j_\Le!@ekt=:>^Oi'PI6!/x ZŶoG,b &E 󱶌2Or6:NJ>,|_],F/mm:G`TqG6IW7WMҤ =.o)kĭR47.%rhy4pS~Hz`z |Tvߵ_nO(}gWM_4|kx~5 'R]NFDYI 8WOě}?>7\cNм\BhRXEIhħ2}rs1P#mBBҴFZ{# n,{ջ/麕ծssk:#+z _#`kOh/Zkv^'dƞ)Qaزz3=tPxeo?z-y1Lo'\%D\ 85VkO|u}SW|=s-{|X]ef";=;כ)ZoH/4}&;n${`?-B*'p)tKσu}j? 7Wޚ߂׈GC}!]"\dnۓ8x_@*.{N5H-ǟ,3r܁b驪Їk_ uJj_KW^ lcmCQY]AnRypsҺ 7%B e|QcrjyͤAtR&GxoMH|!e?'4G|z^>)4 SHKK4M-;S_֖VYޏ\$r}1Z%qs>?Z_7MKu_SΟ4!]A-jvM/vaON&^/s+# & 1@'҇ IRZk?7ޚ߁3:S{}hNSC;A?zM-vsZ5Z5t4d?eSQeSWAFMsZ5Z5t4d?eSQeSWAFMsZ5Z5t4d?eSQeSWAFMsZ5Z5t4d?eSQeSWAFMss:c8s3=\^(g;י[h6YϹQk9j\z_^H,4 ֏|O{w QY UTIfQzR=j -\L[g̠,vڬI{u{K}j.u{é@#HPRBDQ>m$am Tw 9a" drȼo}+&$FhNG8 JO_ _Vsw)t>v =9T}vx(RxW<'c`k}ll59o 7UUrp9##f~>/4֯EK{ZiNce= oA@;#VV_|7sqjCCZcaĜ8UC¾/j6ͮ%]H FAʲpGw)Gc'8+݉G/AJBO\͸ۓ\_RÆ4NM`wNvd20y^בҒ~/t]JA][PkRWEڲ$wxx9P4mıYkr%5)ؖ$ڋ!ۯھN,y7*3U_Tq7}ᯄ[M'ovkwnI+K ;7*S$2im<$7̄pEnMe]BMaI 2@xVO4|۩,h~Xn58JU/#v/)C<*7 i4sjvOym{"^ &,f`wŹ^Wu /o7G"_/4#:^ܝE"K-yW@ؕ`K?h_o=kbG4m5ٶB-#mG}>lخloJLi'k:OxG-͏iL3jG_B+߱Nr~o=kbF߱G#zNqkSO{}>o=sCÚAf߱H|;mbN/Q+kI?-s\'#zH͵b:_[xGۭ_خk'Qޓ@_(SFN+EKЧwXx;pەӟ 8?.J.kqcGwnl x^? C V\amjmFZEs$JڍNk%WLDՊ1S yas~0ooOѵmU#oOA{<17>ԚB:zMƟwIt-mrҡt\. d47^>v6w:}ʟfPFnGR2 zPu_=|uuaY{s&Ֆ_akaskQKF\Z0=h(ր\Z0=h(ր\Z0=h(ր\Z0=h(ր\Z0=hk.5aJc'rAqc7 4U*$p^_ةd>2U}2ezs8n]*^2cK24'C$:to <+|ᔆ[~ oj:ZijI1أ dteK/I麬ְjvLv"FybF>: aMV&ѵNtb|pX۴rFs_ "i׿t]mjMZKY (&Ӈsq3^sZxWw:3~Ӥ^]j ̳Fid\%$g+|q2zv:/|CWH@=?rG*}ڽ8_2O>%qjzg,?ސ Hg1v50Š(qQNQE (#Ҍ}kJU}[zɦi'K8NHU'-5O7XWo/;_2IN>>߃>? ˋzw٭fI,GpG}3X7 \~n ^ogs-ޡZAr3,s{5 /.cOYѮ|$Q8[8Io-wC/ Jo#_hIҶpw%:?Fz9I t`z % NA;oJto uz 0=sEG%:?!POJ9{=M.M;glj:bZq7(3j!_idKoL+y#|Yֶ7+|>ЬuMWE!vXvu&.F0E}~{Ҏ1l-ρ4x^ |i{^k6nK`ee^+4O2 8|kiz]φn/mwK<ɣN$ Ax }ۦ;SYu?׊->,yk_"zWҮ&TY3qG;HM΁äIxRQ,^Zh@8f Xڽ1HA+V>wxo2xJ6r\BZH1jEd_xeC_X)V ^XZO~b8 _}FGԎk/ǚ]^Z͸/!lu"G4+_ 'w_ ?]72SřKQڔo/:fY-On+}'K4M:`$B`*`yr{VVG_Yk?AK-Y s ؍ 8 ~uM-Xtz)K v ,U@uldA9Y;oiocww{hm:塕HeC  wәڡxs?g?X |KmZ]w- D%`;S_Mo,P)yY>HaSEH[G/?t^ߤ: +#SI yF~cK5?]j?.: +#SI yF~cK5?]j?.: +#SI yF~cK5?]j?.: +#SI yF~cK5?]j?.: +#SI yF~cK5?]j?.: +#SI yF~cK5?]j?.: +#SI yF~cK5?]j?.: +#SI yF~cK5?]j?.: +#SI yF~cF3/?tHԹiz ։AVmƭi̚}py\*(14R(ў۾m<"eOg}.($cB7e3>_ڍ>_^ぎ9Ge6;?Ə3>_^?Zj3>_!ԉ}Xu `g=yQ{gTc.GُLtcj6cMmpDjm}AI}.?]߱5{>߭iؒK?Ə3>_]_g}.t_=rNDf'Vӿ<"S~1:: ]߱4icjk%MFo]"_OAr3>_g}.~ziK ]߱4icj=C?/'?u~?KOPD:LϥGK?Ơ?/=C3>_g}.OPD:?K ]߱4icj=C?/'?u~?KOPD:LϥGK?Ơ?/=C3>_g}.OPD:?K ]߱4icj=C?/'?u~?KOPD:LϥGK?Ơ?/=C3>_g}.OPD:?K ]߱4j7]߱55k^un-eeW zzP{:@f<tUQ@j_ |siڭ!B,-ݚ,*~3_N1MY ,mѾ|[{NԣK4c2,s8S#xW+qxT/:繼)T"%QAbNX]sh*M Q5Yv-eL O8x߅u l;  V|EEx+#G"G ʫ =u~+,iBKo]k>#*~2ayCGN]| ִxS^SQw> A9U;7:<MxMuK&(J Wj{Mzh>m6MJKx}U_ٰkQ?OOxMqgZ^CXDf9RG !<{7t^ӬmvI 8!0F{߽7lυ?[=׋l YfIa=8ơrm.O-$7mp xa# ג !k4(l/Ο9ִ#PXi]DsԐ\{5=CMmoby-F C׹iϠc[{Qm!O_jURHH5K/Gύ&7v=r- ȱ@*NӁ־ue<MY?>3M+Sv yM+TF[z~7GjP]+"K<45 * 0qkOߌd5 ~0f"Abp=x:gCw\AkXmߒlocKNå奸߷ kB6i^_xXk:jwV<[Šrh>M NǴsn]4$va2J/|mϭi<s3M в[IظFr!GQxLj<=5ςoCJp) j0f22yg5_>|e5 3z_5Ě]K-PIE"SgiZ%֙k%jVoo,L2 7B$ MFw{u`4ko^Yo:Cw2WXiǍ➥kw_OqܽG1oMAlVߋEw6΃a)߸TyP;|)¾06jVwZYFhp.~RAU;_g&{8.iH12F@#=:ׇ~ ^MFǺ}+O_]˴D d9pzu\3W |?73[qs9/#{e-Gvn!y_hz|Ʃxdv)O7*{WxGax׋$_Ş$յOVik%LyH#+=oqV:x὆ ޙϴ9!H+ϵhj/>45u='GXP:cׅ |9u#jP'y
k4lMq֢ku-_Ceh$SUH#+sSdwMA=PAW{9 ]*G", PE?- {c̲F|(ٵ&!Vֈ )>u7O+_I;Gi%bI*фb0z1RAܷ\j{4p~ɨzsW\~csY|[[;hCm(H2~!} ~տ `,Y0O"Y5n,<vv8Ƕn~k~qk:cOs+~ ~۾{oΑcFL.DfpQq޴5H[&*G&{9c$ HwF7ui\Wg[>Gٵp!#?ey'k=|Y|=S+{MDYg(`b0e[x|'#7Bs 4;-5MU NM[!ԴiR s( \ψj~x3R]>%y14$Iq^nρ`~NV[i[MbksԵs4XۻhcX%DB`TpdP1Ο7\mWOVfWVDg$~a 7_xW^lV> X{%Et9HC/ g_>":ľo&8q^5<`Լeikͨ'x\׍h|:lMYk}Z[\]K4_QmUKޔ|!6Dѵ›[s&1yle u℮ sH&>\i2Pv?Gs>_k Ao& ׊4?edIQYc7}S|=9ɥj`;i2V6 {f; wjbPI:b_XS}&=X],PGʹw[M1KyJ{6QSET$rOB=G]y@~w}? -r L]frf0`a\?hKoq^*[I`HfP~eu~$IIܞb{@?씧Sh^#O|#æioE:6m5k ߅ Z֮ji%6iE-[LolzҕWЋS_s "Oϵ'EcėpMGop/oqrk7Y,KV +x$n Qm\.Rmn?W=?K "gDžt+Gq%\x&iaP HR4fDkWO׼=xxEe@`PGJJ W[.Cx˼'.q\Wį^Eciy]4Ȯ[F"y~#Yz={S?x :],.MSɘBKMǍ]9x+xz=/\eMϞoېm=Is%"!]>I|;< ubz!\+f0wXtP~?l' %ָzOEͅS<ahČps=(Zkx}6|㔿ڞ!>oԏ+gk s?]˪Moq n 1f$<׫3ö߆M*bȓD~e8e*2<@"jx}:W]ǯ.+Cdtǵyo6_>$iQ+5l(3V gqA)wW=?cJgghq\%^n  $nXpNq]I~/ëE𵬞MG I&n;qi+W#] "⹡?>}Ϯ4,$_.nA_u W]8h+ʾ վ=6RzSW巟>$W|u:N~Ok~vxY}ڤW:-$fjU4mݘ־bBkVQWj\|+<>VwrViCq3`(;݌{ZZƬG=bU?S}jv)I=rW~|Gό hZ>xÐT/KiF=+_-ssPdЯp$<K ?cm&?M$fAspi܇?6Ӽ;c{/.˧H"H*s5o^ Ս>fHA&z%.[ V֑,xnXSho^Wt$un`g<f=,sú'5jR7ԯ bHar8'pkԾ7e,|>SUͭG啝HAlp ҏdznXiq8xx/m ?Xݼ^q,Ί 8W"}i@`x27>._.__Z%)8My'Ut[Rѯuuc)\}!U9Ǿ)0ǽM \|=iۖ74&%Bo-֚mа8< {T0<4~Zt-;o`@^lnnz`Z/g:?}FA 22zW~Bd#ҘL \hvOƑjM mrTnxK{{>Җ&Եm&NPTd㎽}%;F3J橠>v7p!״-5{&. Q]- PKq\=]w?Ľ& :2\f!7'sFwJjõp ^̾>xOxgH+}OQU7V p1%x3ƿ?gMz !;qA GFf߷ {#GNh3$SN?hZO xDvAJ F+o8*2Y@;A\=zOxίrAq&i%1*\*.q_Y.1OҔ[^E;_ <{w:'l"UήvuYJ*]Hܸ~5%O~0In#{+JaXUBHc=znc^6⋱X~ >&'/|Gyj^XƥD ܅ 5/1ُW|h#RN!;/є֯P?ޞ?giOESmpp=3;|[e߅vS[C}xV i88du=uc>S\H1ּe7G:NMzI6 5fYe@#C;o_D^]ݴ} j|Ux? j ONҵ+_Z21(K `W>>8 /Gp<0rT19Ԕy& ^Rsew$wF<k/ZoV|;o`U+p̲{b0yvX;a]*Ywd!Uxָ~?=̎FI`J/ڡn_1jvHĝ^8 *Is_pGeeU 6BI=ϿHVٮdkr6όyo>*Ѿ:i>*4(u}}'.%+o}{ׇ[Gڷ#'L^;M16X! $⇆|/Y|3SF'Jz?ؼB%cU2G=ީLV&ՉLmfc#X!Ϧ* <9YvQ[t$giSh>ޤ< (Wv*;j+|C@šO.!iNSئx4}[Vv+vUlq@Exi 'f;2M< *2jۃz_AP:pyc@hMi+OLc5 = [o&gZ@T(9'8k?> ңWiJ#C&G O|io[[OK&!s!AŒ{]-uz:nQ&\>5x7N#H[+rV+lr9όeZ^ {&KXۇ1>`8=x;+ ^1|iêZlBIF*qu5tYUvkj~#<=o$ޟ s]Y"Hcvn;N=+{-1I77Q>F-#_ xGEoWHZbO e.%1B8?7&h/׉w&;2Rw.=F p~ x+}f;;VMFY1)ǵh!|0?|Ar=bʡ9@{WC,<oYY}.")B>n2x:?GfxK횃V쓃]7B28ڏCXZIa-҉^Ƀ]/X0j^/55(/l.'2#v`WQA?@l^i&}wm+%Oֻg?Ku1aQ6vWih.ovoj9Ǿ)7b}8c*8"|oKEeg|كNZ4[U`8bTrs_xҸ9~3x!um!1jU,X|] iI4JIg >qF%ֵ,^EƠm^{krHYFqԾ'cѾj1Һ׋4Ώ?l.IRr\H.:/'o?|wOzoS[OxrW1 ! nO,Ҿiĺ]ύtokyI˟L~3Mh7>(ӭpyF2 %nh-GN|\ol4#{jQf# #6ᷯX:漲<yW3_jt$nr̭o|+.xOդً)O2;n=3ֵ'S/|b'u X1i7p-chwR6rlaQ|LWֹm|Q$ 1~^9jv6teVe}{}+N㇂:45-oVwW p$}N3ZcxB7_ kZl:W $1wa[{x~;д6 xsHYF܂TO<u\|&d^!<;ujVK۴lɓ$O|Fwb}m3CxLh -V@Gye#֙Cρ?9j+?%/T^"χ!8Rvᛱ5ǿ\hzMMu[®}IwҲz+ƼIxWŐRK<9%ծ.q$Yn=k㧀+%ntC?<7yjEs^ 9t^VC ۾eOtáh 7GC_~~oI|@w4AoXrm:$|_φw ]OTm$ϔYdў+ojEVMO^x8.x/TV^&ҮwuL~9h'>VѼc_.21bki0gv@מ~i~3xK]gRXfA^@<>,:ī۟v땍t/#[PݓKLk5XWwh#SG 0NqzMk?QC/Vn F8nEE}l_ڦC.hu" mA9QOo%μIOv|8ٜC|bOuä(tMvD9B>%_x]5GWw0iipŁ$r{Ʈ E2D =; f_[}Fx Z}^6U|s]#xYt>L]1A1_1]ߏ|0񯆴kiz:|y31s]}%÷$uN5~L޽L?^"д$q#2}hM8Y |O--fj:Xj[Y"9|) 0p+K⯄t?à$lv]"L۾=y88b }>q^mW*_ݰ;yyo3_/ 6+5̖s7I7"2!U$eNr8v1ߌa Xt_ C\Ċ[sgW4)-u㳞ccI͑ZKrPt> U5%`Qe`aA. \a Ep-j$Ҵ#"rH8~.>[5|UX5+=<0 Sb.kAmxx+9tfV qqY^9mcqsk#N K"46n1r{zw+-.dkզF8FH'W%i X-5 $5K}HY2~R={Rg|UY_i Sq6:`{ 9T[,gwfN-fIյ#:-_ F9oVcLdN+ [/h$YaC/!_ s)%RmO hځGXX7 j|hNᇊ|?״o-$1rpq߽v^'soφnexm5## >_nxMoA"[\NNa8$q\ާ'Ʃf/i-6V K+2 @56!q+5ᛸB:H!x,O<[xjMTNag\g)9؎3.K6 |Qi}w * v;F y ƞ"u%k~}=;B/Yp cی WP^y s$2(t zՇ]9kvY_{p9j|=>O XjZRFfo-JV$+s+>7i$_#tbSFiK1ǽw~! ~(Ҵe5qÒ}2GtVzE!k+;Ж ի13=xW_Ix7đOlM(P`b"U96]{~ީEJm2Qe|; B@^vmuqlofR[ g%?\>0xNnmor4Ixe@K+g 0ONI;P!߽y7U[k+Anږ:*Q1V|}Fx/ᕧխ^٣6쐐&pcr=GZu?;PVke-h8QI<#ၷia-*r:xݵN2G5|J<[|GĨy7H>P3l8G8oz/`gtc[8ceRcy)KZurF7·E댑gR|_?txQt_C%վr6k=ڠ@F.@~$>'EojETo5/IkcpV8eQ0xD$g kk^4+nĚ]~moErA #g5w4}KIP76 #d"D|wY?g=zeqkR<Y$|E @ќzWxut j~ᩭE9YFH={uycgs^,h!eb0rv#8S! ccq:[:\#Ȉ|' ~O<s\d']AnF8q=čBBw5x4[? ^S.#$'oc)@=KxǺn:>gsG;*M8؁f[/gTҴIm6d =5nS>O>xP/y1os-mnt3QKܼD8$br}<(֧ũxoYFD1?)*X6ӎk~3xEա^.eKp08h3Q;m^ؠU<*i$+_> xzݯn<4Ojd-ַ~S~vf~;T%z"ZU:N2s|vχ5Sm]8\d.鎢UcGfV€,.'e2 |]CNe%?ޞ?giOEc==CԵRLXcsWূ/3M{z)a )g\O5ւ3kWq,_ j? o$QűdlHbf]nb9=\S~m?YF|ڄPt;Yqj*>A!ڮT3LDcr:ɱ2Yʢ\2qº}?\ѮGj1XM}Ptex5ش|Oi7eU0IMX-?AVkV^Ե Imm"5H1eSyg%mimoR/ b6B13H찚B,oж9#!Pzt=zտGOք>{EƫH"4m<#/ƒ\gXNu{BÖ.d6eaO cZ/ k[I|GiD6w3B0cSN ::$gMB8Ǩ5 :>G_?[Y֢|DMn`х`_zdץx^!? ·,;TKIZ8+ܟj]G/[KMGZ^wz໽9n2p6)lO.FzRj|jaxF("PXe=jKg;㏌7>񧀼3x}|Kp*lkKt3L@ UG&L8Gr:4Y{/c|c^Sjv.tOͱ) ԏ79VRkZ揭jo<]7/4ѡ9ݼ.#m\(ȯ>!^ iwMu>}vu'f n隇U #Ɩ֥cok}5Kb$ |? ÝF·ŷ 5gI Ř|23i N>_I?U^Te&H'R3־ cÖ6t2{أ~261`x>hzMk]pquuyqJJ6-ܔ|h߳kcy s^(ԯt1K88GƝž/W'saGk Do"$)55+j:dĪNFyISױafwcC>{Kw>SstldQ#|{C_[Zuӊ2֒2NN'p)f_|~k?¯ Z~:Ouk&~/ai=*د]˨i֓<T> }ߊ /#QY-e۽{j[c(kpH>_}3L>Gƚ}- x7",;/sן}_ =旦jr$A&˪0Wb^fL ᇋ<'<@.otY#^HEʶN+˵/4o/tռMTn?6K>GȏqS~ z֡)W.$.wVkxv\$ː`@l|)>5KHt mcGFy +}Ls_OH$l6:LciV9߆$4 oR[FlNwa8޺(,5%X (h 7GC_~~oI|@w4AoXrm5dŎk~VADֿ^05KC Go%u%X` 678?4\k'z-|1x~8i\c%b8浊Љny_GųRHjֈoDʜھtm~|5E|e%66־cȢG ,$+[zZ}-oOW}=o#k=pcvqNxókriQjl`IcfubsN^ gZ_Sbf#bu{|;[k؞Ge储lcڼOU_{HAW82=Ǐx/~φ<}-Vym(U-Ax$twO /ƹ~Zihtn -c#HZ_ƚ[?sd޴ʪ~bOʋ_(ޓ=[߉5 Aw6W׶";+9uL+e#d׊~ZpΡNv[[LH3 *'>сKoڗB54:LQl#!d װo?Us~< |WP~oqm"+$LO99O|;tf4vgb3/vNԺ5}Rt6s q8RNӆ MV>&guU-f̋kH.]lދW[|"M[1xK͆n_UhX"XP9 IQz̀kS,PAf>b=3^M?h5oQ2g(*[.)GRr*:|v_ ìwa Z]֗p{r-@ V/s$Cncsokشh "+' u.˫`-ux~MgAn8ca9Gz׽~6i{ܨxV8Pz2`Xt%Yd7CIj/ MωCxOSmJnΎDVd,Fp+9Gǯ |GMZxnkgkd1$:b&#ǎV3֬qPOCǟCM|=M_nSpO>b:V[MN5M?E:0GK`8|OQSWQlQ3ml8r rW4?xq{ውKKIkk[ cy$%ʄA/q[&Ym+K> ZMIxI(] zKյk';cmC.9Uoxw@5Ե/My@uK,F2?Jmى-4-"?ZB³fèarn@Tj#xKy.u[#pj^Cq,y*{ lmnkfIHd`ynD@:`tTl(K.>xM!;m>IU縕TB~}>f't܁'8>- |\Sij4`hnϵ$ w >iis];K+ǎ* n݌kR撸_R𯌼'˨7^$yUQbpTpkZǺ dEԗQ3:JPqT4R VKmeP4,OpÂ=^vIa\(3mG\n$OE,Y{gq~=kǞמsloOZe{i࣒p3sRoCzZ ޟ!/`'8'nI횊_:u9u14mzq*Ǡ.Nq@>x%s9Я;]oOyXD7Q2ʸ<9붷\CnfX b8AjWL'a QEQE(kBv_+ߴ?ߛFR_ 7qFV3ܳ4_ 뤜zK|)K/x-9 ls_ZέbX_| uBmCNL( 78D=2qF=߃ϊO6{_x[ɵk]LD_BeNq,w~64ϩj:[2嶛@TǮkSjٶj'S(g==:TtZZ$e^+^LW?,x7d~{4gP@"O#&C~CH,~~5%jZ7,tK]WOK . e O_B"~Y_ aM<\KcQ1Ď[Zv~-ƹქ_階r/"ڒFʬ$vTan?rRPL= ymu'Dyfp!fB<;p@^#k_e!W:kj_ɴ3WzV[z ,Uǟ$3w\gQCYմ: ԁݕ1=E}V@{+Vܴe?˚9OZ%KnfgŀH1:W#OSM^4E- T/8K)u]rNOa^q.TPmKcrV\%|^~&"M/QԠ{湄,Į|lpOL|,ֆ#Bo^j~/|al*1q1c5m~.xKM_lq8k[3v$uj6|WqFA79\O Ix4HX/,Nwn$WlzF7),$xk?mX~&-Mu+"J9^xzFLq3\jK/  Ṽ9]VkV ̲_ZvY̠Dzci=ę=xRˡj~Mxph:ҪYhշcc qcWˏK%d2gKDRNh'¤ԼOiW+o{Z]Hg

<n3CHsƼ{Wr~DCu$ZD?9~Fsy ){cM.Jo(3q#:"X./*4$BMFZ!_OI`鎓H#WjbhLM4-u"N1tW #OAM]Sh 6 xq~Ug^0Ip(w)**'L< {^C%yC)!kfKa\kC9: I\85j+S'_PW+ǭ1i8uG f_ʦ 8:}HWҴGy X4C/A!91 /#8n, 9O [ؿsU5pu0n?;ja8tp.k($ǑQXv=! sUyG5Ӯ ΏJ0"_^9H ;!-<{ =u5҄D1Y YݷQF#0l2E{N28{!2qh ܂xÂ{zWRz"Hư!߁_Zn] *(vBg *qxx_4؉['N浫g S@! )tqdPfun=yNl{Bl.1 L-`svlYG^:xD}!GN!΃F 8^G"0Ė#!(;8ge Owhoo=x{^B#̧xy"iچ*x>EU[ȔSj pdf!2;Ξ61wa4;s+|ކ!1>7is,ʼnۡL~Y 8Yz0 0+{Ǥ)8r.$ L3Cz?>qXd&Ch9_JL7J{jB߶y o7i<у0g,9#QrN#K̪pq}7_6<040 ӵ[q#.=c0FtAR=\ڳYCzdyͲ$P =Cq^^:s(@"""LLUe V4/\a( *`i2(jvrց͔'=P-yVfQHa =vGQi j5 Rv$% *&EhG.МĶOa&ιze2eLdGGo$}[VCM ]KL,0\Ȏu2]R9j˴Z8NX@{5 n9۔LR"**B t5]21+rvҜʶAB7xUYD7L ou4@I1XF9"lW %n71c2X`/BʆUSwl@# T\ 溜Nbm1$>hTȀU;1_qQ1[]k`Ƃ%S}DK4E1snrv_YL_HJ`g0_=Y8t<bTmvQR ݟ24n:q 21_S O'1iP5d"z2#_\wԖX 搁s:Q@BU2oAZ3K3>Z]I 8L:Ņ,/ e۷,P2W Z|]"2 d.ߥ81I y,aRMAsEY (K(k|\ (_|Lc9@ќ9c38c3~$P$#[tAe42rR7']0s7IٗrfS^P69w2Dʯ|oDƒXS9&f<غ2qD@R_tG 13yE5aPD ozɶ9"?911I,)." .;# i)HO J bjy&&āQs,Y|l R;=9)!ȠƸhdp7.2\M \&S7{>ofz)2 C'ozj phx `b8+) 8c38c3~$P28D19G;^8>lcGx$mV=39`Y9rg pg 1Id*a4$ G6|LGa~Kk)y8c38c3eOZ dbJ_m?ˏI}j8G11y{pkxspd1158/8H#$G p$W(89q$G IOT{Sc)m߂sW~BC{߸hO8g+6oڈGտӃ'.z?PG{ ޽O֘ΎFy'^omqH+IOʦ&戉Tp+-(IX+i$ Ć!1dcAl?adi/ծ"-Pǿ BGL15ŭK2_L"_S cbi2-9lJ Cb%sb9عw8ֶ?YBPZ nDg=j毝mżѷ q%x~ #5Ʋwط@3YrȤLJ@G K (axvV[D8]1$ . ݵx‚X^h,$d4`,V*líV%Mhhd5Nj2-ó' !LF S]"j`Uy%ȈB^k+a,,~aC<zۏR_KGaKCqV:jݠ+Ey-ӡ*% em2L5\St-iuC$6U sAn2%촣 5dd(*oY?YqaL*s^mD<]F r 7mq݋Nx:ݟ($-WPӭuvA1Aaʪa r>6=.D̴:AmcnnCU\c7?>~+TyTc3P|6ق 㟌?~`Ԙq$+^LJciس|.fʋC\n:4]B*{烎kl ; 7}P^qk-FI3;yk,0T3}UUK{<| I[P> >IqEsUݦgƴv T!%,1YuL%ǷEh̀;C?ńhN%;>OV0xv8Fm0M.lEzk|?sHt*M1GF_ Ye ܴwk'lӀ|<d,u|mxt3D_C H:wԹFc4.ݺƚKX =i"V]WJp"2\<n25j(S{o#/16Hc4N;ld9G2 v]J{俎zG#5rCm3b6yElAOl%4㸅qml_>2hsAaC<]2u:CSi܂ ڣ 珄_n M|őW_(u-F~Om}+nmiL|{k('`sHdXrzx=hF5ۮznYLAO t77'30sWgAM` YDyXj _uv"!TD0wy%J~,vLwlQGZ?1Sdq-&l}ѧg4+@k5$7JikKgLgۡԧW$aêŘ ;A~hυPW\}{ž;!'`gpJ[:'ˌ5:XCNf)}Rb1[.Oޞib<!2 h[~N\E@ShAWuEⴑ 6B!Yc( ƾo& >t7;G$Ԥ ׳xƐ _ Y 3M!|? \/o5p*.m\C+7hl6aw#ɖ(΂| PH=!dKLǽG'r+{;9(Y:znLSyFaw,|l1˶<,0xH1[z{Yg} s jzg|-q>%ʪ(l֒FL_Yxi2BJ׋L}SG)9ZG9;9aCQJDXJyspy4iǥ)yss vgP$mdD4)MA}2/~=yw>M=]n@E\[.a'25Vû?'T&3>򪛐耩3 *ȇoo\rtAKĹ ^|}l Y2m)b]3CYW4<,g+a~<{.+͸&j>iꃽĔ%@1nL̇w!5 Wo1Wdm,7+wm׃w6tV#`P|3JG`ى@,a6u^Ir7Gp~Č٦$a!_nPv4Dഁ2+cpR jK݄L?lX#L<[,2{f31l*L#?^:P2?X@`l_>\qP7?>0bHn+#Zaτ_D| d$gJ5뺝y#L'ȺGl Ns͆m{0@9^ߍ(R (?ƨC0NDzzz044Xȫ*ӱ{&$OO͍+vT(5͋TBk*.4P^Hnq'nT^^C\d?ء23w mu]XSWKd\ȸ@AZޯӟP [N,_~ Xa:]Gё.p$rr|Kig4W*ɐ39]g ].$Et.tta}qEF@>[Yd $@\z*"-!aʆʎr;mlw]4#ƙ[Fy5=}kv&^Ǽ1cjϹ^Z85&|51Zj6l\POgR}c!?F)J4Qx-istq~ QF ;olQypMƼ`ddD㜑: IDAT ￉\fq׆'hUfzP#͖$A@i?q"=W Ӂ25rPZvsr(Jj&qj=t5@ 9P [bKّL?pNG=^? 9(,/GUUJ K*PuHC{p#p4׿tS`pa<@@Xsl|B0=5&NvoBx(3~m6=y ';Ff5A,|Y}{w.D@h J;ϣs@9+`afWu5𸳛%yG7Ga 1I^NXkk*6͕1Rr-?hۛm#bq s?_xv5@IZ~N@hh~[زXLETsY [XAO}pфKZ!GɹlJSTb<-X2j"4 DyM%ػzxDa`R *{?0F;F]ڽ{0^_F[O(c2v9=ւj8añdn9&0G}|%ec{a)p/0}*iվ@x"@t~dSK]nXADT=?_&4\ln7߲@YY enKNM2Eu*GDfJ J#=͈I\yxpxx`s( 䱋=: 04[0vZ~aϑD{=a: % 139(DbȲeCm%)4g%gis ,&P].¦#͍\gQڂMm#< (d4:%%h`?^gF*bUd7f2T #YxޯN $EihDks=|]0T!Gڠ&}:jOj]̝2 }9V;%ć@_l2fYо8yLՑV~ly& *?a׺mzpK{JP{iAGB RpƏO3d!)-'lQx?B]M 2 ӠF&ܐԜ~W!a U|Ӂ~~E99$'%9" 3 ڛyHEFvG௑K+i:/o oFE\Pedv?4%!$$Mi0zd&R0G!*>]{qEe,PY_$&g!DaN*BsVh(ޅ!2b۪jȻI.wxwI}S.GNyc4ו#bhko@jdAs]1h5_Zl~T(GU=v /;%mcDt"3z߉ڪ2N4"BAHLC yF2'`*$v]v瞾V6$޺?K@.yVd .:a A&g̣Y$Ô,4Sccm BCI0QQTg K˺6da!Ծ 8a٫T;!B~I:JP#ȣ9}>;+Spi$;+~~,Ρ)\{ݮ,EZ #2_C[s2R{e̟£Frf^Mhjc(}όÞ4ou9H@JV)S$3)PSpħfBZbbD (4{[[ώP}4%V %0jSeadPSĸhDP4R2s̮L\_ب^&/GDnk+(kjy#;(>4P}%:D[q~!i}%_xW+>1Lቇ/R(fp TnwBoW[^¢s 8Ho%l[uE9!:b\хʚpH[-ˑGgs#8H %/G p$Tl)Ds< ƱyuSLjPg/)$yj hac ŕ_R_LkK \ⅇΎ&c{*JKQ(jGrb4Y:9KOڲ4\&u.π9Q@Wv+yyRlZy2|(NmR1&HIBHP#bվkH%o_ r>~ |uׅԔyc(7T|XW2?EYurezDChh~=3qL6l8}ۗUJ8w2xWnXKybU/?Z(T`\i.DP֧oRksi, f_v<R4S݌F /WqLWR 1XL1qZ{(A"&7V;Ϧk+N{{rJ,5YN -#PK CL&Kc1o([*vX- VnNzPaN\:$bk-!YaHDX jlz6dA>n4łi>М 7v9`u07Ї-8u1Q<X2҅.[J > L?L-S2)Fb})Vur'eEdSK<{Kٟb[ auVcAmEى^te+_>kadh #+(|tdd[d/#Mkq58= {D$AcG&L'pƦ5"j&[)h*pu>D'c1F+S"@¢W^7{$(P65D1W F 1ȅ7\tEhDT"LV6Yo3hBJ "cypˀ~%gLd+lKP*a1c6ҌQ09%xwoc!mw@M  Dd&春AʳQH|aF$0Xc,ᮋl y_ex24i!+Tvgaڝ׎pM_qd(iRKd`jX!aSQt8cxFģ HTݐ|XCEa 5 {vCo"䈠K%InX5]tSXo!dT|t(s)s?yIx2”I}889>7t' qLً4]{ɤm_ElH#b wmAb"ewl8k)[ Z5R,T2A&V[x(`2т:.g /`Fӭ|uuxkr\su)q+!zRX9VwCFe1Cn'vks+.`s=E8r@,G10lOEZ iQ.LT1#gQD&0&mIKZ\>i력AUcX*xUvhqM U4H 1Ko)K)xo$H ŇD k xqh2va.e{0sK7⸵6]P>=q  (/$ϖ^gp9_([qX_?08eVI*/Arnrby| (cn>Qw’aP 5~|%,>ܢW UI~;dtl1)yg@V \BpM2Q< .$Qqe>ʀ' /A(pBI#$>Jnݦqe:w"қ4&i8邼>oWWE!73|GE9e'(gtQDd}wq9**T䬈 *(  @RLPP D$A}י鵐]mﮪ?#_ߟ՛\B`)%[# T(뢱{47Ѻae1Y+z3{q 0E 4zIbCTq3-#d|ڪ#?ǣ 54d٭Θ FlDΫc>G<0GIa$݇4 9u-. ֱ/V 5v3􅎥-8}a{ݞ i"LŽFZʭfv?%OQI׸sf=a+ć$3[ cm6l6.A!i܎}GE~ʣtT#-|nAy"DQ~D>} $$$ %% qqcў H)4r#`}ęb⵹8#G8a"0mNf&.9+ZuY`@h.A-P>ImUj$ko3('NoTb[>QmIX6L`v갓0X=x%XF9t)2d$H^T| &¿ >r6GK:`ō[:za_&Z%. 8$h 8 3ۜ?N^o} ]y^JTR6"\yL(o_veq]h聙f[8CrS 8Dn/?^- c$ â",.QWP#xm4M&Ψbtkو bD_iV["r-\tƫkY$kf4E,(C?x0m=v/PBa:&}}r. ,c*gwã ayZp^VZj~>W. %0ZnjS?-ˣʉgYC#J%!Z(o8(kBӴ={i>}dڻmDf >+|ëB@@gwn;÷?Q6꾥.o) 1Ux0tm27tLc]!.و#qn` !&RrOcfבGY51 QZe41$PAfxPYb1,x2 UgVf#KǏybCn A(ZOȡT!sd:P)z C vO_Ӻi}L6"OCJD Q QHSeY/`` ĵ)bO@!7 3b f.^EPDzAS|$ ʨf/URF}{r)Y.3`TK'y{(5-ՃZ'`&n:}O3(6!=Qm5rȆ~ &En@*)=,/.ϱus| W^KJ`;W] 6FǯFdpsvy ~/ H~ܜt7|%{UԦ?>O? ᵓKxA/HNg-}N-Mlx.9vpq9u/WV߷/e 9#^NHcUFve\qse8S]F߷ +\]86pH4Oǀŷ?QTXD<z++n 5Hx/:(miinDQf<"By4g3/) 6!,:²I''ѩ^HBأh0#pƷ( ?' F  9i,qr?<-QOq,RTqnN6d# ;5[/l w| -} |WGX_HHHFmGΊsRM%w^&iBʻDų:&((p׫%98ƾƛ$Z 4wr"#;S{͍NJ@rO٧Q&xO6~:eoZIa'?)3=~3oޥv `T$2}޾EC;@U[oO,]eiKYr{&Weaì +!l'uCV$$R?(T?T8{G]!*,!CaX8ၼ΁#:HkvXB<ʉCU%$ZTVVCm.yY}=o>B={cs;N_Hф >L!/:ا tń^yFxg[oQ%n!:ON!%kon)iAщH f{G Jp'?0M,!nQ2X/C.BPўS]9hDQ0JQh  3kG붐mgNT,CIYr3QI8q>h:qܹ:I#}&heET׃TrGq=@jD>M 9l5EtqxC0n&xHFJr$jO@oi0/} kG}S5 GJ!<1u$.9TG~#ќ X8S3lGYDGI 'H {`(+SA\tJ_b c|MY Ƃ(U*)`E?ϊ _kԁKH9&TUV,%G@P`Q0[2SV; oHYT=D ?a0w&RJ« J5H)#mݚ?v2 ;q4mBC-J p|zQ0c{c&.{ !31S^G7(.uG{AԾBДBD#8bmH<ʞ=L}]mFЫNz 5= O`9˷E)3ZXKY$]&%# cPUcm2Fcb~M6VkmMCE^es+[-v#٭@ a@qBEQ^8 xkb;miz ϳwXht F>YxE6֑έNSRSPn}i-9,daqm`)v}Ҽ4|<1rdpv,`>hwhȨ2܍-A [r\G_^ =mLp Znl)u7o$_`u0YIXB3͗UUذx䡪<mkwFzuXB"r֏^۵b8"X]XKa#h~S%I@/SQ/m&?lq6/2rI+W\G'lVdnGGY(6q\ XhJZ=GlQ ɦvGl\1^Өi!. %das0gEOwtي7*[o(yCc(BrPwrqJ_݌p _pA8gݐ{J+fk;USsR,>]!~ )G)y)0[<6>pQv9BBa(u$,6Ph- dNӴo946"F˹I{f$>KP'jQD?!I$3i=yģa "ģ-Gi r=Bp=Z]m 2gMU[ 2E_Oc|n@VY)̝~4֊S߈VۻgHSF +Q#G :90-wrGS͸qt-!tp%e^zAM w4Vs').) ~ f?}3'}>:(c('GRz$ָ>>nPT:0/ej@^({k)kB8-WCg&<  & }GRhG4tv<ʇԷ'W^14U:ˣ sZcyz "|8}@QPZŒRqa!F}(1Z-c1O匭[k%G:Dw jLnzexd ,aSsUp;u0keMk[wZ:JXR"4P\:ZӘ$˧m0dPzqOy([];ȣ,} =g8N-MĆE?d$PBEME,MWNat hpnLG›7ZBF!gD' TTq2>|8;ZΫ:WtQ:y)fyMWX(/QWW"0xñ~&̰WxȑZj||uBzcH-(*;b-5~X7|8jT'y&CSGgrH-1Oha*ঙ4UQ6b(z El:S(xɉӅ"mp3A.A#"Bge9$r4Y3:+v83 u4k~CƝ]3ϰ !9z:FɄn/yڦz"+9 q9uQƽ?7j:MČ(w JSqy u[of([,08q)lͫ `=W2ܽ?1eN O^i#+ajQ%`vJ)!YAh!VQ^)5c ̍1Z@+)*7^f#jȋX | |lBd]Xo> ap𘠄8_8R /|]xG55V#1ȐvVs\nV*lZ Kk9M|_Y*('b5Xav؝[03`)Oˈ's=:# 7K(5.&4,̱vjXXZkp0S>V#9N9i<:,pԲ#~^Z}8Gy)v-KpFߡ ,x5Sܢ?W"k;_Cf~痕?Z84_ (b(t[\_@ ??MN}z4424hY[<:S[S5(mf&*(fP$7j~s,wW/[<Ax_SD+O|^|S#]m+Ư ߠM[oY({̷| -7wua<Å& 2.N,K !;ma5 nHãHC_Vn^7JNq~,vJG)cP+ZZ;Opv@>ݺM Ll(gm0j2F%=}0[L 98unowASh (yk?[}~lȂdLS% lZ"!(?Dԟw*'둳G-%jr-x4 (ot֓mƆ\r݋7i'o],@z0 &.'gA_~˵\%(N 0g{ѳO(O7<$B;,7@KZЇ}뭩>B0a<'B`jf#`䔔fkJ}D>GQ'IK >}@Q0IQ[_jB |}|@!xOyM\wI $̖-}s%Sߜw3Vp{ _=BЃ`L$ IDATLjה#FMT(= {aknCr+}:bB46{"d œ%ӧ[s1%ZH'-M!>}/2e"Ŀ #ȆfZ?ߧ>QeR˨0<"0!F.5~bQƾ}4#}<> c~#zHIMguFO 1m7Tև$D2|AዐG:6Vu%}pEBR%(unou{ҙB; 2qƆ:gYlB)$/"Q,^%D/ق+ëxÓk-ûWQ* ?vY;J/=B&ۭ1o_XػwȋyP`zAN4<͂,ɥ Ɔ< PSH CMHb7j|o=FuD>n,ƈġ˾ӜP,ӓC y,܂iI'p1@P|2Z(i7"jn,#-U>V Cc>̕ZXA#(\=ʲS\Jv 6`N^s& w"ĩx8ߵ2PѺm4^߁p @bl$ 'QakArڋ `0Jt2=7# ..#!cIS}%0xrrդZy b4Z/'h2rŹis7|C*_`*!!"o 22s0A\7E#&z黴f"}|OBq?%88!4 JbYZi> Ko]z)_G)PS^c%@oL؅ W w4W~1}FpW poa9Zߢ|mN".&AV3 䎒Hfn4Ԗ8AGO( a͐vWJr<އ!9` }bzSGL;nc7ԃ]xə]ʼ rc¿(N`0³x6] Vjsp47*Ksk^8qD%)9𺺗Q^OXH7mik(xUZ0^ed]M >]qYYYr9Oi<;Bу7l=J7Dq>{>bk"͖Zi˕+  'teua&5GiD60GئWH k]^Lq)34" G5-docV3Ͱ/l-ϱ(HJzM9n>{}¹in,\~'!؊ٚrUO]!H%.,dϭS m$y֎GYQ[ўG(nRŴiC]e'X}LH cܵHAF,Dq9Έoݬχã4! .?({,esƮ[1\"4魭P>馺lCpձƅCNt#ިil+ GT((kǣYK,q5X,ݸ<~16ߌl _| #,ec]&iqƋO}}fLFH.(ģ,Mb}ܠx؈1SpW(})dg[S = I|:qϥ}!>r0,N/ hq0?swr(Ɍv$gLkQ]wvA]`^'g|q_`BL_v:JMY{d}Y%rs SyJB\eU,%iԾ{zܽu ZyO`+q@Nx!Y"ܘig#uŎJ4*s])ELj\ClCa$܋F"dcDQ+ eZ?|eOo(ybo0e3 3k]v<en?L0 q zg6dw)g]0-}bp "C?9'g |gGق0nxGCyi L@KFAyCNk_v]FyYO1Ol%4miwM@ 3: (mm#Jzue,Y)Z#4qGUqД)^V`Զуv - E&e5OQ_{z(-rBVl|}F{`mc˩5?j'4R)aq_˹ZM ҈rHGyꆓnpBe )ݝL_pj|U]v,%i#>}Q(1}~И'[:ʼG="1GY"gQQE,! "Eٱ0%B>t*438ʚ"@ ~$%^6AJ`$4DMmdy* XGib,Rp%ˣ,x Sԅ;X#UT4dc~.Yv'4lقE+V;(F#Hzt41sSxSGi-Y{>wF"KB"A(cas%N`Z3UIymdSof>#nڳV P`t,-MێP\ i=L Oh7:f4RC'/Q+dW {EGYGS[`2m#lǣL'A 6/^!]~(/`~МkAEGyTG/&!cek!lZXy'jubgdW\1_Wch͇l3coL[S,liˉe`iAL $0fd8jlMt=^p{kX2]"^HMm>Ftmy}ڴ uVn,&0JZnI(F:\k )O4S @.zU- AAUp5B_`;j(>, |7G(8}js9-_6 wduJ>/N{UsAҺ;CkTĶPJ߷45PRVEF1؂,zPם˶։bጃxBkqg`0"bh u(-6L&h`"R]UU".eyYʶ ʫa=oʮ“ 1 簷, 686o.R$#T'+ @TQ)k8;,X ޅ:hj@pϘ  %xz3QM0CKgq֩<:MJVU.tÝFu4J|⃅ ` eZԛ{_D-}X{WAHz6.'|Z/ԁ!g-S5epr &Ha((F2\:g #j&L{箚pX3~ YNֲP4j̅xʾ,0y;ti<-i㮮8m8x:؆?Qo/3߳n ~/K~kT% X5n[U| ;-F?<{U]'$t])]~{l;<gaHLTGXNz7ìDs> &6n&m ʝx3Ġ`Iu_B-wQ]:ߎl'%U4=e e` $gl%ylN{8r,3[̤߁)Z'@gi-Qۚx8-.{٣2W`wط?BeF|5d;{?}ia4S/ķgẄ_![o|G#.| -?,ΈƉs0Yަrħj+H:tqz7jj*ʅƐbr5fjM={٨?=whLDUlxC)ubeGre[UIl1מkj5K1A^E<utچ%s,*G9*ڊ`*('kp۴wS4/OkǷlɓ1l*v{=E-ɞg?@.P֝v4)Q.0+ uZ(%V\ ou+c}4嗮қ =535x-m_RCm)n^ YQ-^$*KA^b$t/刺\9Y(/؎^mC]. $}>JazmE,Cxa@(d*U_SKl )iL(*Q[HAarV >3 ;TUc>UidCF}܇ n$.| | |wGɴ!HTj7' MmLoƶ"xa*&DY5gl1BeR̙Q#FO_vlnj[&Ao!"!˪ #p1%\E}7 ԶSiov!%ppwA.omT6! j1)GS.(8H*.wo$B )9ȱrwg I%1jszz#;lZ$5~0Dne%`dXa;}nn1$$po;f#>$s6I`ox7fA[r(!V mE([zw3p]L sp-:HXNRv2ee q_nۻk6c^Gb8!(]\"q 6t]ykhfrBp>ZQUyCJGV+;w\29RzI--"nXIl"7]LA*\F1'\ kƣ[oq Ӣx/`rXj1| rssQ[, .ģGsC =3p>B!טJ<ʡ&f(ly]E'4?@D)-luq8\VE*' ڞG2k>.F͎mӶ/prDJN f)O3%EwI~Ve ee5IްuKyUZpyfd&Apm,6sCQoGLNa,ڊ IDATxƧp[ [oojQǑΦл F|FW4 A5Mn1xT#Q_<4wL d8dCWA"lde jrPO:yʉ7p(La8{ kx/hs2!)fMs8X,7Ҋb>>#xFLzuٝ^b6'[l7"[oljǎU31d4?I#!gɕP02:$!C_luc!%i`49LJ+cϿGyQjχ=Hh#9SYa&EampR9 g:ZoQ*8-<1MlsoKbn(8[pf. 5c9*7BmRS~ѼO1[y;#*cC`#_' /a :+a!!61ضݞ"[XRpq@T~&%i&1%L{n)J+#eD(츉O,h"D9up.o\QXDesRUL͏jQ^C;2+$u)$?hn{B9JgD!g @W7l6" qWPK,~5pra^Gd[r{?Qev7HWnJcwQfœGIzko# F46l.)eeeUPC2S :7I s}[)e\R[J ; DlJu7ŎkVz f>~۶jJ.˲Rt3uby|g.A]E^X34^'qY'@6 H!G9t9{eM$Dus,e^?T$Jz> 9yj|[R}mdtGؽj :;d6߿(g1DE.H/ns_b騾7j5$4q=uH}ԅ ʰmXI 7cߺƶwC#ER g Fً3Aڃ ((T` 7|ÚF"ÞC1f4J\\ W^2;\=za8{l e.*@e &٫4e-njXQ86wY8A9XOssJ 33ljk) vCS;UZ7[w`!eX)pA=QGb% psIA6)Fx)V6%' <")FZIR}ld ),ң y7}9h طa;K@l Oeg:5Mq[אS0še$5 gnx!4XhMcmSL ]M١aPhSΡGyE7й<ۃW1,ﻟ)J% чbc8⊣a ڹDb[ r Hkb17T=dtBBh*5cZx3?Bq=XKQrKSCt ZhCt&|_!(82kIOUL z$~N]>[ 4jLɚX0NC9ԵBTJsѮ;C!bDQ: Em:LZԔu5L$aM:<Mu#sY- u˴$cjL[sgкNJWlQoL6Մ8ĥՠhh[>A\O}~-=΋Fa ^;Bm )& P?iYo#CBW]ֺ!U6[j+(ڡmwߣm4g폃tC[і q'Ϸ(x:#d! ҞBQR,Ru"=U0dD(ǎc],Am!խ+:vs"AiIC{'Z2Hdy# N/i7=?s_(+vC?(^]ZG}]Cl޹ΧXS#gFHJ9--C!#Jfr)<>Ǐèѿ`ڼyc!& Q: C!`|~Q~~L C%׸=~]IH {|j\{Cguu޴ SF1gc-8r J_%̛5LǤ)3pZxƼGΦO#- %/z1.yj۷D)t4jsp8Иw}Ҋl̟> wAH{e ?/JUe9-% ~ԑD+u$v0LE Z6s y^A77}& x˾ՙ15w~ }þ0Bb0uX ڪ:j} {/J$nءhwBl2rE2u+Rp` ?t/ǻQAK]!sDR&Ug)(*A :{5س]#\"Sy+߮sy/γս)"$I)HI-]'>u_(xXht@skfQuoJީQs-NnIK;)jEռ\RHLeG/ SCa(%fa0r8Q;Qq~ nmg6]폢S+e1Iǐ2m+A7e($$d Ahxs`t?M'QP8_%"eNAQ m%Hɨ(V*;t 2Ҋc]DY)Ҏzn]َokSS I49:fYX -Wb` r %/BQȉ5TOk'Z }'m~ 4l[1!#) +%e rY@S'dzT$pWy lb}8 & 6Ы$Cjv$uuO% 1TCڠ`[ ҽ؛0=uy) h)@FAMp;*ӭBGA *PС쎽NZHJtt&Tno' ĵH@%LIH)ޤI)4S)z kA ٤Gi:g[$!vmMe^At5]~؅#,~:^=PmSDzcS<%??^j5xܽzIĊ3E<| M 7VU6RfC昍CK=2{@'NWyI$v$=2[IfK{N]i z;X(U(xrtH fA7Ry{2ίQ.ԣ<YV,8=~KI!CO]`mm޽]Q]3$9fMýr2[ zϰD2zcDѹ>z0]ȯDaC aEG1i,H[n3 kwhX2Rm~&bTK ȹq> a|"z/Q !Uѭ\):\%iQy -m$ h GFɻ."g DoNRP'JP3{wo3WMGE]P27!Ha0GGNANJp EQQBghZB":F'ZqJlen.|VFCxt˰60.H(n5vБh0Lc(( }@QVIKlmkH `4ǽs>mټk|,򑟡c=~_!?q71` Dj!!'[0|_lE'(d#?l9<צr}5{wl᳷#MvVBޤHqc3;C!|Q(E6$?Qu a""̚{yaU%)p\?p}-(ucNG>A)GK!DL}z(_3,6I@-rݳcH흣!/eÇx.^[^HF{OG:}5<8 ^$-LzTN]4&+;cH X[ RD߄@|7$B2[:;*c eG<m?ң䉒PsB6 K1_U˗(xx/ľ#'U E9 M :QJmXhm~ݐx{l3lb[v_sZv:DEv2xۓN‚D%. H3C^I> N|j^؄j>u=3'aѯKʊ\ ~ظ?3b_є&f`|_(kq~(x rnՕ%TgP%Ui$rT=aw8!y$xP_<ף2(17QC'JPn/eԅ 2 t޲Sq0 Sh,7AK=e!)S7X۠kOY@ZZ=zb$\CkmlB%7P{p2H?}]89nohGŏ$g^t3PTPV E LDd<\9 f R'* P~7#-fIDrWfz4i*wDBAf5MC|Pgb>9j.3p2Ҳ A搑ꎶ?9Q#-ԡ*/c ۏEq8́׀ԢVy'P\] PRY)U>~!ss7D\[mN$ҥz~~H[pB/; q\"!QIu J231$L7t O4YBC ?Cz IDATs4Cs)zh<d`I 6E׮ݠKݻ ܺgC|A\$"#D$U<$D!#+!UCzwJY:t ҉̦*7i)BuښJd$qQC\RUg"1.7(AZJTPdmDKb:t~j(XGd}!wq(oU}CDG֓o9%jXe~X'կ)GmuqeKh'pp8_P 0Q+[OU hn o׆uԇPѽݷX{p͇g1_pfH{u2ՠCqYy g;?95^=nPCۏks03C!!+C!`Duk C!`|e|Q,/Jų.8}"rh]!zS-sNxᪧZ/;(D¼,\8y <gkt%DC},OW,0v<=JN$a8r,NPGg3!E䷋7TmM ж]*L .*P3fBp!+Hܥ_Du?a VE[sMU&ܮ\_}ϵ8y u7O7c0os:-Co.UʃTH 5ahXYؐB>#h]N'v| {e8c5fڎpO_sBfBVV+7m!SIɛOh3G$z: Ya۝^QQ;N6 b;Ui׶\*+6{tu TS[$P98n/u&nv$ )5ej|dG>4TgM:D;`q/_GL6ץ-0&c98tn Ԕ)N|J7AqGV V?;3|D=oC(}6.d;StPf$( IuxT!k#*&tңJFvadbD5]7g @' *s\pcLO6ң,ɀz7WTqDYc(lB3m8y'Hl("T< \w"OO?c+%PP9ʲd PHј0n0:!5z-+ǢK~8[B}HӳBdSEE "]@[#.WYCeվ($]VV (X̻\ W, ]}]+ tw؝V "L<_ #sg b*?qL1e*PAﰝYVoQHm!Z! UeeiVZF'}HE3>wص€ŎQk {Yrn+=JrIΰPU(ǵ /e(}A!%= v-(S3ѕT$tI*.>E\Ba Ju$L5ǩM<ހdB q:tS3E=؋Q.%J< CQ$ZBrJ)fc:l b S:TQ(KEĨ~i;HGķ0tՆcٗB_ x'8#""{VP}p6Z3l!#ʼnυ \=OT1xVRt*A V/GW9<э~jԣ< N`xg~|9%M'Q&Sa``==]cږHh-&C;beM$׾0"Js.=g9\nʆ8}w@5q:( ˧eC".wۡC,]eiV̱EWy]#IӛeZJĴy 02>O"髷S}[at4M`e#f580ZO}M0iB).Jz۾,ɫoADGeQ ky  _(S#bA   >pڳ%~dDa63-588F}yOB=ʼש .iЉ$]3ѽ[ Mcz9~Ph둖9e~N AKτj"ȏ›Fjd{jGi;z5$†0 spx +ԕ 8{4)=YfxÀ%tmƨ>h$J 7ӄ=:G_B v^@X3\?چ04K}w"$$!75qgy DPrѬ1&R (˃O7dRoR0Y@)\?kb X/FPd,R T`\t36^e|B$o.X `߲ 0_Iwiz<^ /Ho~0`4VR壡'/E~#& ~13y|}H26;G~~+q?@DWBf^^Q/ +`c6wÞz-!6-^h1IY 5>WSNGܦj@8i<˖O0B{{83v6Jw{ێq!wWDŽl+b%xx e r|DS~zyT4`@}":N\V.}=x S]x3Z;xwUafn^h=m|b3hSp)Cׂr/Z3J VGQS-ӆS04ÇY@Cn>-Vq RwNXG9 O߿1 /Huz/2:F픁Xn{D7jp:&=iI p |<:>K(PU.(@]:2._[Pr/7 @IM%I G(!:\.⊫+\.];L,L7PAρ (,Z-4~$'Oh)J-4=?B * #}ӳ.]tv^ȭӍ z{72{yﰎ4-c&]vGm!*d<тxB׾B^M\ᎈTg +K\ ˗ࢋ+M-LJ8s׹1 2oQ^ƵO~RUBnw.tnw76tl!W Ƿi1 Bzp]vj W1E-W_ ͷOm‹ٌ_?CFM_7u_X;o<|m4!B0B~]TWUBPZ7f/C! #JQ4>C!`0Z! #C!`0D`D)g0 @+Q}d0 ((E` C!h#V C!E(l!`0`D !`00E3 C([>2 C@Fh}C!`Be+@GC!`"R `0 V0l`0 QQ C! Fa C! #JQ4>C!`0Z! #C!`0D`D)g0 @+Q}d0 ((E` C!h#V C!E(l!`0`D !`00E3 C([>2 C@Fh}C!`Be+@GC!`"R `0 V0l`0 QQ C! Fa C! #JQ4>C!`0Z!و1ܽym f 0Gg#ʼlalf4AEyc? Çl 0Hg`#JF 9|̀!l?Q2dDlfF>Jb<f |Zennb0`6l 7y-lc0`6lJM 0b1`6le-,n߬ |x/Qqޣ?(G9e|6q1̫df 06^|iɉoEi4o :w<,F_gVCL \5׾৷a[ @TnsOm:.=1 vk6ӳ>뽿݅U_%XYWiY)ũնm;}mcg{f>L)#+-sFBBFS8u֬X _0pY3zF# 3q588ct_g;Y`J°aLs8;@\v@edQ;{0{ùݳ!ֹ3lV'qSVV ?3 ݠ \{_lS"p{>͛WqrqR[/m/)v0q9%!8~7}?o\h rW EQCLPpv2 : 6)C8lfkưlDIDr:Msw\ȳRt+˄5l4u`aePm5Q^YNDUy|O BJ Ŏ5s!氶=-XG~A(69C(`[o_LZO` +3`b,\)ʵOHMa%i?e-Y<~~-!AXҳsQU)hAUDLعfo &OFh"J~Jzl] U%h5 hkbn{ p:(v#`6jL5T JbyO@vg5\i.n^os!PX=񣵱{@>ƌݤI8i&DCxr3 DΝ0dT̞;-ēxD#,a7c Fuѵ{O,~< pQ_Dz-)Bk-h>,-Ыg 0&i ]  mc Si*$a!Tua;g*nj # b̌ňF C}a/Y5Xa9iYL^ sY/}4 41~ˡcyt2oS\R_g-C^<ĸmml(8Dޭ}fdl밁HELƾ!-EsA:.Ž}$(ĨL1ސ8vB^C]h95 jvB(GBQN3 "Cp.j%{N|d d%%0s!ϑDUI(qNh(vF{ ƅ3e[T,@Skp'iDVJq~ NCVLD~~>GwB?-O ^ K* C!W14ț>u tJ:j SZM=^ACZ%sgD5(n C0k; Q!8Xǡ)+G@Fy< =ʧ@_;tGÙkn]c5ihW9|`:u͐FĞGD~m Cyr'Oͫ9s/iCՠ``=vA$=8 Xu#eUrykCosqrP!(nF-+?3* v +KxVx;o$Td2>21,,AɨV +'-/5. =|lu Á-AӐǼwIﲓ_b: T$49wAyz]=NfJ RCC4@-?fXhlR窭Bt*+IBʊE}cXk090(C| h@`n'⊸7^D[!-˶erp6FaǼb0L*x/Q>yx(K+7"|&"2U۞P B-hS[H+Q~Յt?`чDAzl-9_sP(Qrs5H ź_'ATzA&aszvF0~ |( D6!qI9|2)%e0B >)x/gϞ5l~HGZ4%% HDY @ #l2O("Fy{ƐmJi&}z݉>J2GYD^Ǽ <WiAڶ9сaigXғ0֐k!( X(q=U!-\fQ֔Ga2g[xFaD^ /^FRbH) }>ܹDɵ< wF8AQr J|TH˰6T£.5Ri DZdF]\DWDq$tלrB>yȜ[M Qlu[xO((H`Ӎ{MDFDi'(6Q H#?.@Zߚ˄Wa?PVETIʐr(chWkAK–cE y)%r>:  riU"C|q{v%jë OQrDI 3Ӣp;bٴh>=;]5hOW B@f@`|i07;MR#`:a^Q{O6{" d!;3]~>-`aϊ)>^p>7;$GJ _`ԡQi'RTJrQOZґObeH?*Tcl[^S{WC$]zWW#:+Aw(C;i>p2(k,7p{r=zt!2DY$tc pn(Icޮ#$';47t ^3kÎH6T]M9>#ϝ2Qr-/i 0]{*5FcH!zS[`#Ecx첏Bxn3Q&4dk}sfΌQr( EEǜsv9b Ar9 p_ :Nz9ٛUkUwUͧD&C'Ja֢d(W)BdZL.-t1UHq2lС#p5([+qNk'\l3y/ BO@Xh K91pP&/ CO!^:6RReE;w̼d;]M1|($VF,sda__%"""̔@֤)P&a֜Yp<r2#!lڊBܿe8KWƍ hW Έ)P &!Gغc~Z2VX(*+Qf!,{9Xb:mZHFa#L(#[?|Dlv>[$f DYzPp 3dC}'d$1,_AFj$V"3'b(Mf BZUǮz <\Z24l[ʦ+ˊ *&AubÚ就0\͢v@Vx0vx=Fcrρ&0EW^IV4.p$즹a5iepg60UÜ?#].,`0gTX~#+"es q?ކE ؼl*Fʩb׉ xOQfDp>FeC[(S(^z]%ze6?` hǦ[ 5ppv#s\HÂd2>??N6l,Q>\4RY{W` O%@.ÃJf1Z_SX4 (nxL{bo[5;"ɟJSp`:6X&cOk 0+4yعa%&Nw&l/ͳpĖq3#i/eeA"Z %w〦9N 6shxphځp]/ruv8ڍA&ۼhJLay 8c=uzPCnP+57#k+?{J(ܱSh{RdVs۞(c~16WQLsDd'gĤ!+1sQP,rs~tZϵDŽ`󪅰G|dص/c7`,Ww |Q۳]^yI6/q#X҈sqt$VnZs7ϱ`6u>"Y뗕IV2vM g&sՃA܎HbLw .Iv&:`3? WmA=0/% ;VKfɓ^veF5x8 |},Q2d"Ƽz op? NjΫ=ھ.]ȁ'3Ng8 ;`W@mZڑUD}Oڿٷ\jZ__WǖIp\8r0adntV.9Uu󫟪wcs2da^ 4|B(Sy |8 |{:r{_XQ2N8 p$Je8#oU\9 p$IKK~$I'oZQ~*I'N_G_;'N8 |SDMBnDCS ݋,#/ڍzI2W{V( zc(IbYzcwGeoka}hO ݅;~$D?wݛJ_Z f>*'5c}eN\-O ?諎Pn޴y4ETR&Nm  =;Ҧ6twW#-gJ? #v ),͌R[Cyt1NAIEj0e sufw]]?Fhkaٕ`}/nN=#±V.Uhݸc&4&6}1Q[!}ilMBӗ7vHoL3@f}8y'<|HTq|xZXx)o/L |KCv٭c`Ҿn? i]t??/5#.& J:)F|M԰ET2z{% IQ*O{D.!66I)iihXBeYAUs-&1>Ii(v7!;# t\B Ҳr񶏥yYHIg!!%=b7hÄ喝FGI{_hŊ@~ rҒ]"l IHHNGS{'ڛz%PݙUNmy2Q*_EI>[VdS~5-mloߠ(k<GC;< M[2I6ɉ bI)iot摾LY|Q0Z:pE bb]\?ճv#^Jbk$f#tԌ,jmF*w&1 eUu}א,3QA3M0؉OLE^Q)::PDdZOu8ɤ*C=%# Lǥ*P0_"&&9y`hmDvf*[ָy,K*ٲiG%/x)ռ!#^}нiy[K-QP֞k:PxJ 6 i}!>l B\^k!)yDm}|&Xy#q9YVS6Jr(_ot Rv){pW]VHXBeS-^2G@~D`6 ">ֺ2 !)&]c+mn49Qʐ,V=Zʫ BFFj˲x u0ZEtX1\1Pz4ߗ&}+=T&lG>hz #ȘuUŘ&Yɘ0 j"NYDTʦb piŕ]7nrÈAzegfc,62RPVT D@޿AƫG5NÇAUE#).ě"xQVb(Y E } EXх 45 }kCl+&{ U% 7j|?q{?Fu6Y&dr*8(E%% 23~ځԂRJԍk@LH nBZ^c5 1Rgy8BEQRr*k^fFYяɆp$Mu5(@V>,1޴&7kOoT nހcd WX3slsHA7AWIt2a6e ^26;ia?BTY c>#zINDLkmW6rf0oܳضe^14z0MW z/)GV?tՔm4 ezSA^NT1M!4xl$,a/_b TF/yed34}~_$P㈬nF!Y5 [+)*6X$0SWׅБQd7{އߣ;X2BC5ή0Ždl?vaaAطjdAD3V쀇7Za 3ln$`&tͱu< -#Xn2Ho>;.f Hn:h=$+C}S݀ tp5> ,ݖ$<> K-;̚FNXoB]e ee#,} m$T!޴ϰQ9Y!6OOF z0J.͎<;_p z z5¹zTWWȉY9o;ivCхs`'ǓPUв߉*|qkʶ'˧@Zh0D5-1sNxƕk!)4҆/*3C"~2&-ڂ'}aP`HC1L NBAe52|1wH!gU٣|ґ0DTQIa(Q A]ո}ħC/ػw<2qǷ+?HbZؾAtye UfZ]s-D0@ 7A}È)ף~(n³vDFL8F&rG]0Jt5}3uð}4MH83 rrv8 mwDE c8!iw7`i(gbm-ұ#!k^9yV/ 9:sc Orv#|x&zP4Nכ4<Y;Qvꖩ6Ǔ|#!DEp4{tw"6ćnL`goR]>(*s0T9h&iooG[[;ZZc7ä(o {ա9~b;hQr!+CC.J}m%/>Ħ.\_ 5]'S.%J{\evDC Kۡ R_\bl{VB~60N=8u%|ؽO;mdf_U{'V@l,~F+b("!v ~1Gم /P/ }$ fMkCZ S==@]/gZ|aә,G{Oy~CDFO.!y>a7SpȈAciΫ^ ז(fe@o (/p1[2n4,FZ}AϓHBCeV^#R= #Ugwu,8涘7>.\ f b婇l)rSGNŠcCO= 0 KSVXS7]E4'!:l ^9n="76V\|> ʮ6d\!,qz|# /gNKz*P<x4#k#dq+';ܿrɩb5ؽ{=?l?reiV,\ T>"0kf`YX3KNW-)F>4Uc)Ԭ"q""HtVBhMَg]p_Qoz#9QL\{ZG?hmGn?@Ys&ϟ nru%䲶@*(ɢt:|xqP)zTwcIɸمrkHW@U8\y1U_X>Z~fTOm;CM=}` ѕƒD=zK-fe;QzX!&8P.fzL0 e1eyїH 0؋HQJ(z9Epw(ZcQ*j`G(qG ,ۅ hN"O9wƦ 0H`9MQhx'\6lGjC#`"r̶ҀTaVGݸͅèV"ʽDK!8ñFGE5G}c,҄&d4V; ?,Ú/Qәvu5kr%-Cir뒵r .]/ pȴCuX(,C{ E;Ga7CX]L#bL:X[G?xPs>MD"PKgn=$lz%ҍLYߋ;\bx$31DX Aa4SJx$巍q[~z(+BXh L4#)ͳ>ijrb3Hκ9 >CF2Dtdu§iP]|p-DaQ֔f@~r1 AAMJ vG@_0gR7(i^U`&&-K(:VnG0$,̺{zEdTAcs3*|`i`ۈ Jɟ.nߝC{ g[(Jaj{N"FάJ-_NucQD, ({Iy҃3-/4EeF6_Hs 7jPZ02e>.:[bq`:,P덺[Kwx*y \ 7w E 3eBh`X}9{]hɏT7~QKv(1K~R̒]7^Hb8t^(Q2sn0{1eHC&Gk(/;2j -QDɊO7e5fA?-#'o%?D.̡{^,`?n Dp2ՀD2#n<>{`P#{A~{&]ՅBBLN7]#X԰kȂ?ۈ b3^ i -Д$IXj  )q5!.& 5d հn-~1WzRG[(=Ά`clNa4̚ PTBݲV/.CE`_Kќ4(5}`4+ qKQԂBP4RadS|?k/2ZZPWIZ(2Z;.Ǜ ػ _w]äYlʦy/ ͕3i&nFruu=%|IAD܌<*o+{j8!RhY~ْiZ㥙4Nxig`84#cwX6c !*uӅ2œV{ >QcKe2yxcS,hQ2Ri  نg*^?섟m696c1g{0f`h%Hij]^p9Y+gAvƒׄhl/#'$ 8 p$I?XQ+'N8 y pDeI'N?X\8 p$IKDA?NN8 p0Mbͦ|66ԡ;9p0a7ƆOe_F89p0a%o 9s0ac pD188p20a@+8R)r0ac pD%G8 p0+(kk͝ 8 p0a@}]`Q6ס;9p0a7&ny>h/Ʉ>,O%q0aoQ \a8R0a5 c0a#J(9 p0aW0E%#@vfWs2;FH8p20aoeyi1^CdD^zȈ|/#B ,e5X89qr0mbDɐKxS&'o߼TV#+DD}] GYr0ag2!5b_mh#ᶵ|5'3hoGMU%^K83~p9z,Q0%ʯ qHሒIr0agi/JKy$YeUD){wD}F8 p61y',.D+${eP0u55wf~gs#khu[fdȾa,Q157&V/ɥMߓg[k3M9ZPV~~_\3+ȵGoyv+Y%eeuFn t1W`9usD,"Ja67#=>8@LDB."ݱͦc~Oq0/R~C0m6˰I چKsX*M7 مL<ݵ !lu1iE₻DI[htXYӌ0\\3 p1^ʦc~,ʌ҉0vtAd~)?z>34Fh+77?(yF[KO]FQsۯ6"֕MͿ8;[qv-\uẻfg}>QE忩L9[!BtolDuLMXƊ7P+/HNJ0?_hX5θoo]Zp I5W K(" 7o\y,[?gMYN ?mޅ俀c0J S@FE*[:s?MzD.(sҟBIL+܊Ne"aNrC4;q}Jƿ/Oܺyo݆PTTW.dlaYKPCtoui.?7?D|J:Yyܡ47o܀]z$^y s7o߆_̖ecmb"Cuד-'^šܻm- HaJLF#1#\:>GqI>'Tpׯ@bf˨CϽ< @I c IDATEgMUi}#K|Fe{޾AQGx<^{YF*Kœq-6#@Ҝ4SYz$:`vݼՏ,D==FFpm< BnOi~=`~QOqll@r= ]?SXƳb 3bqp#cl947 Sbl÷mQ9CbQ(N}F=d"|]]>xNǒN!]x".5> vwy!:!t0Tbzs ^@&ra"鹴0~*Q[CTD}"QW"$ +ϻ":9B/kz;zA˶u)O<Ɔᑟ?zW$WQ}b^۫ovÔ ?8=rK{k$hT7ɫEY ?ޥV{X5Es@^co 32iӴAKcr/c֦Ŀݻ^H`M_ԃ+/7enshHncSPUWOml y 3++6T` c(j'Oʢܷc<69?!,&Tܻj m`fc+7!6̶Ȱ;s/EΖ/9!\}kJs$,MtLe74h5znPj"a>u63Zŕ#0hn=Y)Pks0u4\ F َ$ƻLɎp:>a/LSN1p%}:ʌ {+M ؘ V6PNRc_d& a 9E,qybcȽ<5V.p,tx.Fib.*FELCa?w!\\fb= @K )v05,1Z[ {yaHKKCg fL+')Gz]S,1 1y*jKXra:X| P\albI,C]U 3~ڌDT;z= F"1ؾCan#׭X#>! Jcj }u(ia˨#(/<+%ȫbڢ0]5H+bطq1 Hr2p\Du~Z0&B[K&&#)&l Ya+Rg8xҬWX>{"$$gd]MjjcΣ0^W|k -~fb3\]Bg,],h򹎐t$_e Bhᘷm7 (m3 1\R2PPC]EjzprrB%(y<\;zU2ZV=fg1M|Kv zbB04S0gXՁ1.z3ޞd, -kk n\ !1n#0{+Ǝт8x T 9@Dl$ pq\7g%SǪlX9hX*jfRr 8x8v]@S[3Rc1zcA=pdY c0Ue8~$Gj̋~ZM[He'ŷ,r2hDZس2c#lK(+4%qnL2c(\ Y Qm9@#pDGGC<x2z*J8M(k PDلް3XG7{X\";MM6bJpf=s)+ˑZ\4H}jXz2%ՠM+N]\PQ oFtl< hIN\?ϙNdS g`go#25BVKr:&X">%<'KHtt4.*G#$%'·.DRcWЂY=*QV^$F!/_XW8@jp*kaqDVu8 Rԩ\(B-..AY5dy=gE~N*n_9)YlK֎)EdT=ݭ} Fʩ#teb8.DPT A~wqf,0)GVԲ&˨'7ͤaXwB a|8'AFA'= =SD:ʨf':apq3QY^ 2s.{;`H?GgKq`D4j}hQ "X-Ҍ BTn Z >SyC[g@zPtBOM毂@$$ޕ#p }}P[]D"f) > -9aL_EZiS/jy~*VMւxUlds!+:cm$ԐtՉ7aoIvgw-XMm$E?æ0l@Qv7Ҟ:b$V:g֢^ӽKaށ']@R Ź󡨮,_bC~J_$J62]ry,_ MHAt f 4%:ZĽ %yE,sB#VrD_8.%5$+\xW(; eu& :i 8n*&.߃XrA,vKn^ƪe#H#<A[IGE:R (Kc2!W, <2 @} _pMH\ IoD79fy;-=i9BSΎSC0F,9Jftr.MGHq u8oc,7:gX#d5q'蓝~@~^$Tt 5H1(o:gn[9#1~) y21N0Ϗ̈́ 27Ήu!&mX9gm&Yp#+MpiM$ia*. JF^-xAƺU? 1Br^& ABb)D1!8{ %nԁS'd`+?aU0ǶQfKr( (Y}PܴGP"?rn5^@SE. :9 #i r- {(YԞ c 4A߽yyY2]&N SΖk)@L MMq: Xp NyW <\-vyl6Hаp9xGr&ڂ0PÊC'PƏ6&ɒ,du:p*H(҃xeT}iQi/s!bmIV[#:v"|b?*WS].4yI$ޓ+::7UKMʏԷ([gӠe6r f(žtttvya+unB Mk&[`>rc {]]o3`-e9Fsal:Gzcx=ukMUGn"7X7~}UEXE h?xi,{ U91('iXgO!#h Sߖ|\dUOS!-< (GvE866"S&J6vFC94rO6%0HbNЋ=‹`MX"Zjb3?og2!ʂ<":'~i]/T0` E3^Ht!F```i(!cFDYGUK*Cޏ} 9ʒp` PTQ)(OojzZD6ǂ#QGLnԄ5ښ q2kc+:'Oؓ 0av-8{ !&, ikq1D9^WN_A)RC'`%%PO.ZKtk?͇Q>dJYYnX҄UE|N-F> 2"à ~ /Ri,rlkHC[o6"DHŔ"QIZ@Mhuu-)7VH&7"c1SCs,DђM(5^%܈Mx{(o!!_Zl9Zpz5/ z }Ӻ(LQIXy&" 8Æc'  :GD%/6jgQSȾA>7Xt hmDiQ>m l\4#$䱝\rGM'(a2 M:i{M ȚLXW=q0F3]En,J S0:g=VL>5IGD9!Jz`)|1X~*;:Yw8Bl-ѽijB򅠳onf'-QmƦS!fS7G/O, -cQIQc6Wf"JG>D"!5!mܷÇD[b~k(of~4 ž'alfe66hl%]9c4MgoQT\0h5]L'bo:p}?d%=x\l˜(k(*ƿ;ΌcA3FFQDDsĀ9g1gń DAr 9SӤ}gvw8Z]®S{uڑLuY硌(kFբPhT#=x%hHz =ϼ^im2G/ה t(}bnXҔ qv(ІGdH}u]:uz%,LRD ^b㵇!OXǂh]H=AL34`86һ1t4ʏDYed$5bļXѴO o-^^&4,Ch-B~yWj" Byi(PF\AJ,_i+a@aJp, T5*kʈDa{Fڷ'i/!nBI7{%^^rqB&-$k}~MJwcd uʉ S~"K(_]16A}]*{ 5*vêw%X?J'#@h=mXK#4` =s_m*y _?ʢ}24*"x WVD`0g7'"C >*B '*rPc&L΃ajzAu8xf \H[|1OzR::{@oTl;yLG& {]{ȓ= bLLGNsLaf-s\uBeDɄWGqeKɄ)+8w81Ό"@WKL3#4! YkH{{N0'ZPg/5s#Ja9Ys R]3 ]:w!s[ Ԏ]gyܰz6|:u"lم'-XzҘV@pz쁻PKfLUDAt._[ɫSQA89tR߳ PgwWo,Bqf(SXw?vf ;))t'Bi|Zÿ%Qw8b$7@ڷ=]8A{yTVm ﯀FImR=&$+1dḁԇ֓u*J58Us4o+fFup>I}SHum3=KbÚ%Nϒ2P^c!;y1euLވqI L{bBwt9ٯ0o$ [Xp 䕇,y5ޕeyd TrA]A9$J3h8ch=mzry*+-hQyo=~0fT23 IGe(Vmގ7ciu6r(U, pbb(ջ!-ɩ>.BqX3_)bȹk uÿ(r"ҥ҃H={-޸GP*ۊ!6^%`^{uƾ!j0契K4A&\6~'^;@ tkј"Ђ7S '3v RKV=!ۓI]!ذ \6PιWnqņZx?!硾GA^mмo.Qx"^̴Rmo_Š% 3Y41I{2/Y'd& 0,l\L4'B;A6Mpyiq8k6-4rc)9a&O7=\C}s&bƝ#/禱29k{|x buGDz0;/#XZClxG蓥3wfPKI:F`XkR㝸tx-au!^fN80o ˷XjȲ3w' `}5 n+kZMqƢ P SFp[8 O_cXaIOvkI^:\54¢Wwڻ7!፦x߳kvAD4L{ӳ1Eonیb?HӔՕ恵6>ȗ`-z0G̞1 (LɺC[vGػ,~mů˧C%dqb&9aEM%{ `ީrLi̔'ݛʙI^B=Vi-i,> d#оURm^lt:2ayT(GF> K^V(C11%zVNfOΉi,?a]|Dc#ߙ$JI$%rt@t@8>88Zb]LKI+:ò@0e^ǔBLh%r  s&ţoEc"B`gA{8>,;vΕ245lau6ܽI,Q #~ɗccKc]5iyy,rir2oeʦv4m?7'Z'~bD|t"8QrOP 11118Qv oqeW8Qr+I0U1Ќ(JK?M"&%{^e1111Oƀ,LCnFߢMA(%(;Y{ ccc'JN|%11118Qv 6V|8r p  pDW`e=+~/_r p p |Dɉ$9888:'Wj#G߃&ʒ":9M3ܸztUeW/8M9鳈 Vw+?)I Q_W7̛3zAfT/D t5G|/o[}ԈqH 4/K3'] '2Õ g~w}lmGgްJeYرlv^ `bUWa±:/]~=+(Sf=@&}B#gQ_W0g0rP죄n`D OU JqH [0Zu(H *,7Fd~ߺ+?_ (QVWis!-&2f-,<Ç9~BYY!"!m`aa/K6^ Nto>=L52D౭w+FUEqQ&<]`mP(ӊuG^qi{Yq\mͰn,Qy2sc(  yiqpvCP|"%UY*jZx].Z=hTA;Wն X8ukx1J+ G+em5#6h;.pt+oX[ ;"YYŹx k#E"b=zҏk>beY/PB uxSz|(l}1sC^Q ޽# ֠[>XqM8jZ^%O':Êh!5hjm 6W9& W‘^I>|ٸ?Cp|[K jy:9-*QCg/]X Qa:>FHd\㢲4jĽ2 ixN l^U3WDwsz*`}9bMM!./زL5gSvJAl537EbG2硡.O+U6Ueqws68{!39暶Q\,(QJqni G_ 7ecd Ia#FaHŇoqR0kb_af~!_CK ?SM^e |`i?f($aѴMc%'>1F믄Cx>**$+an=-hwd~դqzm@Ν0{---+k[L+a肠`iU H}C}~({9 BrEKP'DD"b¼x-Ǜdv/3w`v`&,Br``}ιj;}F {aj~F)A hS95qi{̀.Q!"mֹ0d,|U{>'|zu 7$ Rn2􆢟TvG;gb/iT^Q_h䂩cҜ%uAZJ<<0BE=t5F`urrGL\ p &]zԊ `sT ngHxÔz(jp,]`zC FzDjxF$\PP(--Cb!۫Mz{G'%&!7'A1g:܃LҤ+Q?Ntye45de9h  /(anؾD Ŭm0Bo8vuʜtĹxpj5gBO$*eңw;DY-ԥ( DB]C\dFڊW$W~^pquGBZkqeQ_(W6y!Gh@KP MNCș|g " ~}/#P=D -&0 _GJuMגFaDi&jF~#a̳*WAmf%XJ"94!{idNtI#.+=2bp_e,}:%~*JmhSUYAJZw.-Ox$~ñɀmNDByݻ}N->Ы2ߴj2Ju&9z4^߿-A(7}iƺ v;wx< $ޱ;30n9VLUާ'O^>kd퇽hCeutWIvbUy]%%:X=MFLZo$:̳G|riTP6<i2AVCL.j^.T(&D\?z+% B[,]@E L7L&Ce*D눾ogD9B=u:䤇BgdL[Q$O諅>} hmW%i08nFٛL R Ƀ( q"Cdz˔jGO]I\"]uE*i F2zR*8Y_8pˆLjԮ*JbT(((V}׏`rt3;.@NHEmu.f@qc*˨Uy0? ʊJoQf&hlT㊞8peaR$w,4 `>ˤɼ^)ᰃz|A&a}(i{Qj 7enߠ!$}Led Z/˲?#@u8}9z~ᣠH..X{֫GP@,/a5 vҚ {rHTۧ4ȩ38sˍfc8e4I@SGC.]Crǁ-K(uvmz˖dEb*oƉ85}{Acvw1^^u8d3zxi;p@^tvs ݓKh*+a8-:| Ξ1y 3l#Z;#I.ӵθϼ^g+Y1 ~q-BXeЦP8D+ )f-)Mc^Xފ1eBp'McL}^\$W վ?g "_CkS{vC_TFö}a|Aoh]a0cWl8>q]Y7q8 Ip~Dw+#415Gy`Uҁ 0t@O:pn Y%yRzU3|A p#'jϐ 4 C{w4RrԹ}pݫ'?7Igb;ߎcPK{IAЛ0U <{ KgN|0k^^'iddXn/_&=;^E69=}tr)K13ZO|…!{LBrxSU|r[=m,[HZ1 ƹUZ׊P]:4h} = &;v 2!O œ6m?>ONEb:t%ss~4reo *[`f7#h,hkkCGg*Vm##yIDAT2O=&-$ܼp3 1th_n-M lݻsekO 8rY o-)ҵA̛<|(E)0?KL#8V&X:ǁ Y%sqe.!{'6bʵx<$z )O[H gfVb|PLdQ$9*L5ǣSnz<Sxg$3* lA Ai'lЂ)kұM9o!|Re{P;WNP8 a&LyFp!ҲpY g׍bYa fMJ2GXB8`916`T]l}T97܁Y.b-ygDyayB9:Sal d,^Al%AiyshL_@^s婮w%߄ƅH--.cLC8G|"ŗZ8 t\:zӦrh =K8lY$H r–u0m4,X{d,wY]`*=?9:M֘O*[а{%F;.ub$o~rf̜9O j?v/kMzK%v[֖ӌd#ENE5dy WgG$ \?|N&C:Lk,o |~xK!a(*.F~vlnx18pղU )9'"JGWL/́N{yaz^8@=';:b0ӎǴ2;-%gҮ7oF?v$$pv,[.|>( Y s'T@AL0ƚWy\xwX!N}}&J>p_111e0e6.0%_(p p p p tN<9889Dɉ$9888:'W#k>a%'J(;N{ =_yr p p s0Ќ(Ai)5 մg$k5#酜ϼce%y.H3^8938;=;"c!7;]3bC/n*)k#vҍa0hJ7iVPC2GİaC1hp^o"PS[)>W|~2Fƶ0N(61E1(DY=PFg}'h5尼nݻ}+,S w΀pe|2: Jrw< %h4D=TE"lf!ZṂ_U؊nr}ᘚȰEcXn_EžXe,I#n^=ka*I_SnnFN?6)m\ ioLFġ5?6ZQ֐$۷D'Чg~r#'LņaF=u aqt>P:Jk ~8uh7ݻӧbo&33Gj~Qc[X{:(*kwk3-cB{Y3plԗG`r!ܭc8x<=;~j%ҳ`gq۷[s/"Z 4ȥ0lamXOy6lKOyD9pw¾]ۅ7n2PT^XFQJ5J!61BEN"BO6,T#'3 Y9*Jge&L6Kj Ob+}C{v:8#})Q~8y6'lصdHȗ36w`@.t ΅͈2|3'Vh mr\dDL|,U4嚛< `,cP#| Ql|L02c`,ƘQ_ لZ!cPVc<F[cx$rʄzY/vImأllw(g6[kt(Sr/wƸ)Svaܹg;8b )rwS QoE0('ϖ ?]e$(7,XQ5Nx^ҙ4I)+(kk!`<&zrb5Y0>ƤU4#Q& Xu@a@T]i2]dҒ鵱ݯb7tSD%%%]` '2&{ _W <׬jnKwxH/_H2T8'>4wDj-!K B KyQy'1׳PVVM"eFARm57Q3kceI6C^N2j_VNk(OhzG?) MkGj֣gwW|kFZ5uT$ c H޿(UEph Ɋ4Z&ڂ<s^Cl^G7%'VNbeDM׉$ hأ &exrT(PNX~;uEICGO99!u'[#+(K/VВZ=EA #*bBmг> ramj(WYQldR8~]]2!nxQ( 7eP3=YV^]=h4#aymSfyX*Q,+B/ir wC;G .6GлH\|('ʯ+Ѝ/wҬdcDQҁ,GielY.]a 19`oz/ƹ駮X b0Pe(Z>+`{z-9tGt|X9e4ˎ]CR+1XI,׏HfC=0ivǥ\Q>'Ҕ%;r5JN@$߇ɖ% }CK尻}Jr=q!%9Ԋ0T6Fz^>+|,$M6șLU{ڒF9 ̞FI;*GEtNޤ4JYףY.+S 3V3޹+\ Jǣ;w8 {{JawdU]ioP14T2 őWT2]PPPH_0rzyEv"͔L'nZ VOmu9nl%hR>(r1cD׻֜2 S&jEyd-F( z#BZd'8^V'1Ff \#%ʒm)I&Dk}ԇ*cE({+huRkű=CoDrN.X(<؂Mab8QrB/\Q9~0nhD";}Hpa^'-mPJf4IM)^Ԡ1ڸ⅘8ҫb HI4EsH;R"w!ad{t ™z7Bt@;?aeZrFِ/,tnPj4CVJ8]gYyDv4bQd7^ER`!o{L7-( Z0 p_,̕/I+ˢ‚*ŴXH8O ':hx;"Ӵڗй2 "%r«T8ε!iA0Y*8}A!o.'LՋ0giCtj*ʋ;WLOTH|B"gx-^4G CB~:u>}xa"bP.*(S+"cHzU+$ ګF$5R2UF'㟹-c@F,9CH7o;rzŕʊBܻ|ݻm  {;EF'᪘>g>-_Yӡ P..;OhoPB 5C{t.Y1Ek  sבߤ^ydD)k;p[c)6~^E}x%:#&};r8&LFRᮓ/iC(Τ}3PQ51k<BSKq,˃9t'k`8M_KA_WEpn-i*Yi<bsƏVoĥKghƏPFn mlwGDL}' rc# U񘢫I41<}'ΆivC\㭸p$y'-Xpi$C`XGb ,Q޺D: `tC̙; &a3PHMyN,C!aʌXr1-蝛TN`dc]p#8QZ)|˓'DIf*J\9 UPXJq)B}TS!y>HXѢJGe@؁ MӞ#//!ϩ9"4)+ bw^J[k<[%HgN‹}Q@N=_j,&TrYzs]>V@NV: ym{{ݿ/.C(sJ."f:@"/;K)IRɉ5iN([= uRqBm1y[8Xl[$32 :["ֲ̕e%fq1__B.[#VQJ.̴7Aߜ\2Ғ@//*ooN([?s`C9Ypy/7gQxD!cW$VwDt{_&kc̴}vde5k~ZY 0j$Y9Qrlw=ʉbR ~IqQTZR f3R[u6TW1u@2d.+3dѴL&a]푅L&*O0մ~sDɉcccc p@8MWPUq p p 31%_Ir p p p tNG>|98b%'J[n(mvJ(~J)tJG)kLe1111a@QMy3k1GAƇ9F7IENDB`fotocx/images/grid-settings.jpg0000664000175000017500000003477615247006660015603 0ustar micomicoJFIF@ExifMM*V^(1fixgnome-screenshot0232~0100fotocx-25.1: Crop: width:320 height:176|fotocx-25.1: Sharpen: median diff 1 19 19|fotocx-26.6: Rescale: width:287 height:158| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 176 320 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?AtkiVzfcZFZ#^Q@Q@Q@Q@Q@ ;e]OPXAr"}TۣZiwiT-4m#1F5_ |ű$^hK |?*x ߌcuOK@Ȉ#"wBS9;Nz_m^mg+>PļEmHպt^y'M}oz=/ g#t&;>`3FGkj%=OUӤ%Hg?cmV7k}vSW_<'n@f{~>kO ~.QH>IRXр*r5WPt!H!\Lz*䌱~?o,W>UKM]Z8 b3g湟?|Z[W猭m%^`g }uWֶW^̫$F[b㠬SIuA◴7˥8>, ^/5K=l'L#*G0N5 }}ak_ gW}".fK<8'x}t}kMÎG=+~+i'|Ue=˦\gK[wvRU2s3qK_~+kANzZ-E/4$mq@sf_4X|V|+y$E2,͜Ba;tiΓg0[$(iA*z4rpsKTu; f+ϯ"rxԖzwc=q k:ޛ<8KԍgƉ 3vGԭ5Ke}{)d 8ܤPW1ǾF=JYfs vÐ=ZwaS_;x_Ś[T;#kҬcnps_\^gI['<(wڜV\7UΕKsj5Gfhd٨ڝ0+A@z[ sQ:'9tsKʙ-/Ybr8 _4| ?5l5MRJ1GTnO |;c#*uQlQYGp#gI ?y~ +EdG^߃G$pϵ4\v5Hkhj+'8?#}?cZHkhXh<+xw6+i7h*Ur xhZ9I_z\n  `x׶G^߃G$pϵ4\,q~|;񵭮}xIiuc$ǰ ^j{ׯG^߃G$pϵ4\,yOd >M"[~?;S\w 3ny5./m#z|Syq߾e+HIEp_)epG8?#}?cuCL׼5 [/j~"4Wm+oZkRkΩou)yY Hkh+^m|9GWzDg/Lǥx'ٓ|[HzF6z@  Y`23( CoRiމ) QMqH9>Dm Lɳ-9(U>ן ?y~   s FVw$pϵ4G^߃EE=N:LЈ Vsgh@z߃G$pϵ4\,j8GU7׌$pϵ4G^߃EǞ_|\#C<lNrIRkU0"Xb"T>ן ?y~  xݝյդ77Hk’}G=zҘ>Œ %!aF}bjzͦiwL廼h1'FLF}'FG6 gVW6Y@5 gVoI9縷KY㸞H@b$1U8%xHbQaIE.}gQE 3(Rϰ>Ž8㿽AaF}}KSSZ4Ȥ '.=(c>Œ W@5]I)"m,p!̑(;N^/bqUialW_xxrj:`r@$h hRC|eKþƳ^_s M=$ `=k?t_׆k{r#ddl W5,l0"N0 ϧzO{ xƖ:߇tױņ[&cea@`+_GgiZw|\F \^FS0F0gw hxm>p㏗:ׯ-_X4gN&h@X dc8#iM]G6]^svtHIw r]a~_p zfE[]oJZ@ $$j ;@2k?f/Kzmg)tFcaWI0qS1~7|c:^Wr=嶠ᘱwZxvkx-^M4#\KԮfTApKBAn㿀l;5k-B WO-p8ޤ3+X/go_X6g{mn%y%RWfϛ;#S5/i5>8BjV]:e H˹-cZ_|F|KJm{!gatȨ 2 'SށNT,Ƹkbkd{V80վf7<%]О=ЛMn;)5참 ?&)QlWtO0q.Ɋ竕=9k?W:7,`-,5 6f6M"Ȕn܌Ҳ%~ ioZp2>Ք,um Y#~8A+@Ot;YNBHo>g%{RѾxS xZ^Essf'e8<אkoCī[ 9MSZ7r$Ub<{{DŽ[Yضmai &ymѽ#wTb>>QɕlEw>Aa9Ҹ?'/#b9: 3@xIK9@ڡ}S2e# ;hGZ@PAnuj PikORF}Fх[o.IbzKu.~ӵ{-2'$IYU?_ l|@x:e)dW`J'ːq@>կ@?B47KF<&#'xMrt ._.1F(ʺnk٭^L O,ۘI$գ֌Qb\Q(bP8bPF18F :{Vv?[o- # ʑ?* /Aq.TU/!GsbF<%?/[!FKru-Cg"B7,ǩ$j !FOo|Ӡ_`|)Q /Z\HSeƘxH7XsWҲ'@e#zc+3޼tajڄ.5xRVM2;Jv._6HT;!Ӯ9˹n/'>(O>izxuM>s^` 63 `k|E?Ś [}[C&x`A9Ҹ?~Ϻk]MMs^{+ uq\aChR 6=k .,*-bxwF p0q+>*'υ5=fZMC/f;UN6 .Ú|#d?<1|z4qu,T9(.{~ZFM6Odz1 rv1)MBtWbo`ǚfx6"WV1K4f'&>Mc|?uw3@'&>Mc|?uw3@'&>Mc|?uw3@'&>Mc|?uw3@'&>Mc|?uw3@'&>Mc|?uw3@'&>Mc|?uw3@'&>Mc|?uw3@'&>Mc|?uw3@'&>Mc|?uw3@/&zp&[9{8&?);GH~yp=h$4mHH5.Nr /,:Z_gn`W]c=;Qg/%mq߀|7!lWWjmʎY|0)+aKWGm׷S(<f'1Mpi^![gnn;YĒB7ąJZ*toz}Vw%|6eys6 j[ Zb宧 mr 황xKN΃h:[ڛ{ZVR8OWhuvyP]Egmu$8b2C8}3Ï|#͡]ǩ,6v9wTZǚe7jd–HrG˒jL|uBt=gĖz*ޗ>Qޗ>PFGROoK (oK ( ,``tsF8#8*oK (oK (Nz?xLn$Suc<~K g{ij#z_[߱G#z_[߱En >OWd3/|-أ/|-آsKJ1FbFb,}(ҳ?,4JoK (oK (\Ҍ}+7/|-أ/|-آsKJ1FbFb,}(ҳ?,4JoK (oK (\Ҍ}+7/|-أ/|-آsKJ1FbFb,}(ҳ?,4JoK (oK (\ǽ(?|k(+8cgT QEQEQEQEQEQEQEQEQEQEQE)i9R+KQM>(9Aic#Uֹ!]37T1[mviHSНH3}\<ڼ‹aǿorhqHu'S.r֦:K>R~_t+c?Z n?w_!Dq_AJF Jm˰y3*|僔B^]_ǿ5_FM1i0\4%INv)vsUk 4sؿW?]Xޫ[.j3ĺώo=cڄvZR[{#m20`:lR=3>?閾$šf/U6 . KE%HݑTuݏmd2EK!"8W8犳\=%0G$s]lWZ?xJy\- 6?0M<g;KoF9n^U,\H!.~b31NJ]iHO}=սĐv/@Um.ú AXx,]FwçFZ <߅zMozeEiшMĤ:Qgy{ }ޭ|o]'Dx.]nm4YlXm!p3Ԍw^b}JK+{,.`Y;˞|=:? 1 2 3 0 0 178 384 1 Y7eXIfMM*JR(iZHH0232~0100fotocx-26.0: Crop: width:384 height:178|fotocx-26.0: Sharpen: median diff 2 12 12|fotocx-26.6: Rescale: width:345 height:160| IDATx콇WK;½~a̜`( Ass99PDQ (E%眣7Ϻil+ b^vwծ]~kW] z-ԡtl@ـʳ(kkSJ<*]*]*P6`h_TU^(P6P6 [5؀xgx%  9j;^r2mky1OM27oիWZzYy?V^YُnjH]1:Bzz:RSSeff"77RaKhi曒4dddh2^E eY>a~,/˚A4ddd |::`K !‰*>43p%2LƟM tfSd ԩS8p 틵k~aW=?z&N%>]ޙRֲ1sLt9'_Z @-[`eeݻgϞhݺ5ڶm]bʔ)pqq,ڵ K.͛Z~=~GTݸqӧOG^2cǎŬYp9wE,[L+kxx'CMGCEn`kkÇcŊpuuKH%3=g>9ʣul| ;dˁ,+ȑ#\:99^׺u7nyUzXڬ((..φ:l||<ݵ{=[(\RRu>z*LMM5/l׮kzk֬=vвeKMVCMZ;Ńz~:ؾ}{oݺU]ozY Q,--ѪU+m .`ǎׯX۶m+`:`J4Xg:7e CrL0?a|N҆|FPorh_佔0m]?꺴!Y~VK˧w;>c oGttS_JQ3NUb7Nk<(N56ߥЋ4iS=z'B=о}{ 6l*9δh|4B0!ظ9'hOec-4 BqΝ5P_|Ya/olDDV>80`gҥukL:Ke:t{AnڴΎ g^-;,‹rq@y"7>N^֍ ƌ=CRo/z1'NA:g9Xk`Q!;޽{kuX6NYpRRr={=L1uXG4L6AxsA.Po?e O2ʓe?S'\ks) \2m-Zhvu;[tm YT?Vz(Tn޼M9sF 30ȆKqFN#p`X }x8O=Ί!K@8bT& Cnݪ 8&x<,#;Kc$:!9dqbooK=ή_Aϯ7sLMB0J9hzq*8DzPF |Kv 9rZ BBBlAc6m B1o6|z-@}{_v ϟ&(7W}P=uAݻW8mqz¬7lPXʲj*Pod2KJ^E"d?cXŞd0l=ӠLHsUY3Fd3DePΘ1C+·%9\&?KBzxEϿ3XNv%끍H̗0\P@hr@}rHOX܄=uzᰝc،qavreGNKv.̏uBoˡ7*&cC1IC63wJ=ۥ9i#eB[LKs?3oz%!BώiiLG" S.- uϳ ^] ''XO11kr Ke\CƮ/I&KV6=Jz)u) +xnpm2}ņe9l) s<-"l'hh\*Fi g\2J٘h_@ |?4*>KhfF,0q{E(0~a8u@yX~]rk}y" 7=0,x?;*%iSFBO/3!˘(i2KKX~ʤH!mw^4<hKYNsN2'(*#\4 '>&̡'+#`YCh0@x2OIY 8SM,zh =B_+yQ;0P}̛QN>NePp=x7FOobG{)+VX=Z.[*+$Ѝ:+$xfhdB'AŎaY1rs4Yf0Xg%;&zqi XƋ8 QX; ug!~= v)~C 9%| ^Ӟ?|:ɗvE?u&f U-R)|n8'!̎5a;LBk#^E?:.lW| #ʛ(+O~:(-Db~Y3z,FQHOt&=UJ9xv6Cp9&,?㽄䧄 JTϒS EҏܬHܵO2+?ETn߁[|~Zw8ۘ~r4x0if%:twl;a½UFYòCpڥ 1q- Gd =mJe eV[6Xw:r"w\1^dܬ@,6ALbg*֮ ؄?NFCLfQ+%}WelGmL43i6,?-꣖5vs*՟1<56&@\}该kxOEg:<* ʢɓXӴH y>߃ʅ,4=\t\pފ& aыH/(ě2&<.Flh<3!"*y ̋ž S`q(yǘpW  Dl|yʑ] LKc 72FgqؘbY.~+/do"".BSh?mwNV*"B#Ajk`dKK@weEhx223puYYTmvhd=@.w|qx_£*Fd FnLD#*:σrdI?AP.seҢ2!-9! ~)Hl#hyA!).; Avp%#>9 /#4ȚuwP)s>b#(i7!9#NS1$)陥CNF?OPTޕ_r%$_(Z=.ϴt] r0 d$)hP=!+I M[h~^\}@:mgdd}8џSgQf 0.s7 :EL浾A_:#);aϰn",L`,ɸ*%ºzHoe+ދML`dlsV'4Z7?5n,׍Qoƭ1s@+T7"? #K 5R ]cýsptb7<)l^O"7+׏GfhШFԪ>#5ػr͚1Zvfi2Td_f=ǖдdEײ ^[ -V@q#dcG0=[Gn;Ѱ nĨ5눝Oh֬)֩>/6_Ǹ]a2o]wHl\4 &`jn +̟=5W$;J֫_dz?#rH{6Z-wD-_jaڦ*xAȈ~CN}q#]N\AxU sɦ9̛6+O E 7.̸̛5)uő-cTިװf `켵Iۗ<3N܊T-{Ҟ-[aC|/^O׍АN `_hҲ ֞~d\OMS4\ZW;{ hl!,Zb¼hTϞ-ىU=P?q {Y K6i`!'\r O"1 X2[u[q-ڵ =[vrgGa@ո'~0ok:ؼt ۴'.-quKfiSl:Nڭֹ\FTj|G ۢqm؎a]عk'6l [.xvyYOtOv3]$8l&:sN5+L[tǽhdECd O=SExBgO ̳ne`~ǯ?0mY1dз@l ?~Ep\u݁ Kfq?CP߼y wos1tYq}`ⶻN8EF5Pˤ΄]Ү5L_/V dN.Vye/ sôH2j/cy6<~=säu?+Wa݂qhݲ%V<+i^p<ݯbӀ< $ij6E7>=:b&G'a͔>0n+vkidma;"#?ӇuA՗ŃZ(8t Ǣܦ B[)\ IDATqAyΝ>y18/y+";/O΢KK t9 N'OQ{L[xqѦI3.z3>' [lWk,g52kEJ6,/MTX LoFKÝ΍mmyg!'/O7'Kbn0nxqN%>ǮpB}GXL dlnC2(ǧ8c [ J׆GVͰ'Qf=LzH׽$>aIʆlN'n7Fd{gLqP2?ZI߹2@zXuzDXIi 5e᩻Z=˸ ɼn,q?;d'}SbQ~83jB4W}Aj=,6Cl"$Lפ5NcNhdcg=5'o;ܹpj5ƓX$'ۨVbZ5=$^~zXiiΞ>[9'upy o`Xz#.=Bt憰I eS`mm~`l;ݶJtߋ2iDz'ѳ9Z =E_~3!6okO[( adKи .F ;-'E 1 IPq6 I>xSwΏN2g1dda=? Yzadc8o5f. HSk@LѼ(ȏ,=|xvv908lOV {Vkf8C87@vd ̴$>0nFVd 8͌aHOҨA+] _}t9Lbm9)e۷7}%\ qpܹyE:gZ]:F * 23 Ux7e\6"l`W}߃ȇN1KuMe+mvF1d dw7q`oÊr4n޺o^섍-,ܡQW.hs 6?`/aw;^`J kd'e@v6XK↭Z߫g^䆨dز.κӞѿZv7K]1{2\O8I=.DoM_lCfM0fzwta>o!,;^Vv{ v^r# F"e}gɤk3Drj!SvXފpeԴ}(ZzLUun ntjo!#^lFJ8 MdPWFBv,=yl1l!%dK\؉FBV]d8sN>,e5.9n¶#d6FȰoÈIp3/0wg]N-UM}G#K#W{]A6ݛ` \Y˞8 YdX4{6& >nќBFLHٍE]4@`I8u>e;^)2C+K] V ݫYf8XPO]oy#תy}V&ʃS~trLYdc%, `y(\8[%̟9ÒS]:Yn.|_%qZ_ToODs$V~훈GǢe˱d u6zY&;n&8a10_ 13MU G23p 0y-cNg%b]!O+^=Fmڍam<&2{nH -#]V HH5{XԫŦ\+';#vĪ3\d9=Y. qm{b]رe%zwˮp B+!áqtFYk}&b \QNyFh}(N_[f毿aȢűC73X]P v~f|\ ueaxO*q i6<:eglmѪD n0Ib3(ڱͰl1דظp&kdq7A!q`dhJ`HԔp=xN| ,'̔SO ]..G0u^hg~YxӛUWLuLZ`8.uy~ I#۶x"5ߪ׀EK,!{(\>M$ߪUVm,${9jsmGL|Rqm,MtAĦ\+*OfZ4헣O] k{W1sܛ>w0FJ5e(X]j22YŰVFd ۏ|N_UY'^׏Wf=#]4,*ixh9K&+c穢U(-)(ZZ ;=6C5QWn6`i$3uϔql7i1"k^nއBZuѶ8Y ?F_>&*8G^CsE.?U`g<ÐӇ^ZUȢU'FbYG. ]byrR QZ5T]mmG0O  j40&Y Zf/R ^~va֪ vʗT_*DFbk׬!kw#ge`SiS1&w]1k+b\:wӷh² 1S eYݎ ߻2vPAְ 5:<-a[y۷ [,!sλ{<xF{%F]+MUgY%[۷?,/%x4.'e͓ĿKE$"_~N<+ TU%K!![YM,|$Xɋ 5L<'u. O{$/^ ÃKfӲu88 vL2^e*߯o7?bTYu|Kxy;WMu}qs!1H_'ϨݏdBozd-.uTHGWja['1kk /!]^}/#5,UVՑ6P!޹q dIt@ݹq/ YR%l^ .+pJ>uSg> Yza>SJǞ7KL/<*H`Qe? Y.O}[xv1a֪d2:dDE -$'%h?PTTl࣐AhpNƩ(MDi/dX~$aB"ST65%Yv E#6:J Tꆞ/QTSm࣐AKX0t:>ѨTL aZzAC06 * Q9  | (JsW:T6l,PUUeUh Uܲz6z 86BޝPǷRP*Jԓoӎ*sBܩt=$%ĩ!lFYq{o->Ѷa!{IoSr {%=zBo"pB}dpf [1 ߬Lʎa s#m:J9731QQHVl¢?ܖs*d]A6Gs(~go׎˄ln?S.fV .gs;)d>'-^96,a⚃&g/9o8j} N2|;/.?keB6?;3e:x@+ s@ޫWkjvmڈ3 ߮q amf1>eݯ q}9m|<G%Ma=ukVcؾ׽ǀ_[a5XxNeWgl\+Wĺ qM6qql\Meݶ n?.ˀmݱE^56عȐ _ʵGp .]Uظm7}|fZA5Ϊl٣Evf-\,[ rq֯޺k?k18d[ȕAii 8lSWo!%7O[vV:i1W'nvZ?ԭY Odf?ھ gn܁8x<6E;;wEFh)7 ͛YYx&ϛ`-z~}',gPN; t3WEr78^XQv]<Gn 5L;<ܿaf AWS 6 ;ʦ Lv̚isiOd]l2ֿg$45o=zG0nb+v",.F&aձ;4p"_ ¯mec~]l)4/zڊg1O1{+،Y[ 8>툆GyLcɐV9nB$ue3Z~o_`oe D$EC{-oBƻ\iqYٯne P.dN/=sP^ {vCs>tZ FMq!.: FU.nPNmo$a#PN]۬A61>SׯA3Ajm j;"eq)ϝHή [f*y87j6#;.|Nj3Ѹ .%E# {dוNhPSccd+SSm@ AZ=u^BnE`e0y{fq;.iPvm\.RY3Р9\csjǫ:64ml@O6->n߂u' f,6C[-+wĄ5ȶ4kw@!fBv}#ATwA1>+8>y~p 'KVِekkyxa~xdΡ0(_gm3D= zbȆcx{S 348Q2Ud>x,{M-0).,B&K`d?ټeB07&آCxs̍o3˾^m`x7гetk`jӪ >Za MKGZr,^G/2Suv'Xa%5;inE1u$eQ8z!cc cl`lc xXӖ?<ӫ:M᙭b_̚*9ʄ,avjƄg)`^9 Mmz togAPxL$/1߻ ZQqw[,s`^8:dS$\ppK F`O'!U .Ov  sanhcfI;.}t)l%_%&W&dcc dK8\7OGzvFffh*ΛA}9c uS3NXױxBXvŊ[nBf&`u0n> £+о#77㕄Y/ouGlnfKʯ*XWAFnS?Q7n!NIז_;#?u|:HI*jReh[~y_6"q7RTƪljlHQTҫҫm@A/e8҇҇ـlgUXRzRz2ُ@6=-ԡtl@'@H? sėaS} 8e*j>qfnli`5p2,g ?F0iy+~fdWz(YHFDX(BC&hpC)51r=GHȨhgd̜ YO'#>1xe= r./EVNG'o3b[2ٯg*gYe@6_v I&ԪUժW;/sQ>j˶ר!VC3+,r3#) Qn]ԮSuI8@h咀+s^fo %S2a*"ⳟ ߳+ٕJlzb`;Knܺcʛ+mnK]p'OGo: mZFx yA彳0h l]miy-fQKy3`{nƖ Y=vt=κNLEו~MAYi{-,ƒѡ)N]q #1ȩv7i@VBzIϯM^ʁׅhߤAR^fkM!0h'[n/Fqݿ66q-:J;y }8{$vm![|,Žf%3;v`~G\ K[AZu0f +6*19;s.t> HfNA{6s%͎0=ܐ`s2YiH Ǿ* 3ēH Ix}D'$ ұ|T{\9v^E\z}6)2W/]X^0?tB}@w ,{D* eǮ;v:mp7"|bјQlNõJ żѶ0׀2-0t⽚{ٯg*gY@67u+[| C0| ;oe^aA)EfFxX1cjn-'"Ga{'Э[:k=`d斿,Av;4i8w@gz/c4c-P<=۶ ˆlRϐUWбek, yb00O_D{ ߳+ٕ>lv3l?vz <ٳfaŘ5mm-?Sh׮ZZYV:5n>Dk!|\ddtn &&0SNL6~Ҩ\ƫ7(H ƞa2",/XyxVLޱhΏd[y^6{RQԨ'X=m _4UJ |YBk!0:WG{\ԔDsŘmٲV.68 ǃذq#؋",&y|U4J0IE;ڳDJfvh-$ G\Eq2urttB ֭l0H:u`dY KcA@6OvݻrX=GVVŸ~R,dJ45d d[}Q ;Gn㥹f-rI g@5 +/-08=1l z7t9tC4EU 6C`֠v< ۷oxlيyt۽ckV8$''"6wĬMEu^W ℃cLMDx]٫nHNMd*l8yQd'x=gp9z= CģWpDy( *,PU <ڒtLjѮ}iCgּ ݉\y}}VFu0`QX Y=Ly݄ݔhjna a֢#6:@|F1g-,zLOOc@?r![|6ۡ 6ѾsgnVhܨ @>׾fMiz-ԏ+kGPDcPш1z5*Q@fT@Dfd)&k}ۻ ZZ]콫gS8؛A6}14a>^S|vfa24߽-AS$ޞ{UEE50eCvQ^]C:-tyPcМ7giKfǫuȺ& {2'[GC!1ngfW|ܧa d*x:b&ܯ=}dLي2, +jщ 7?^ANA\df\Ƀ^0;[BȚ#۟YϟiWw`,7Dߩ: d.l]9zTH ;8}Z5u8kFp0D1:i{JҰA'}R=ĩ{C`8BUk];ؿs ]]o(ήC'߻_F+ {Nӥ@daXNvqMto2l~sVxc9&$p:]'z ۃ_a$N@V)Y;urbys>5IvttErYѪȎ24j 1)fZЄNn|Ű? <SP F 9p~Ѱ _" L؉jFxѫn9&f,yR/qLg#v"t[q:zʔ *I;!UI2X8"1n#lpck'B[O]K)w(PS``jC#/^jA"hD |d  fY^xkp4Np_]O0NDfjA f |u'O48,q¢Es1y3nTSA^<0%AV됀2@M '`19jh,쑒%'`hx͈ ðas< *t玑c ]yƙNǡP}&@m,{Ȑe/ ǽe*̚MhTN(K%OvyTb8y %ҷ2".BѬ,ڥe[ q$,  Yk|ah*0FPoEiQov.d<ց+'v'SL6h&ϯv_φa6 f b퇱4VM7'"8!sN:!ih*[jqp*Z/aabgbWpko K$IK+ga=6 FpmqQ[8nY(7dY?֓Yκ`oߍ']m(~+g`W*I2͐f%OV퐀mdɖҫz'mdG"ii+JfA=Y d {`@A}T% !b_P~L?~f H+d=۶ΞY^en]hW*Fl%Kv j?Ǝ!MlUlZ]PI`m'գA o!ǭQ񔧙/@v⢭hSkD[ d6"d5q]? #ƒBx]0uMP6ٰvB\ygf!2x>{EK;٠)菚ʺWRxyqXLLi-)s]dĞp>@[XV zl\:DZ(60d >ў gzh0ǑțP}R,1ٚ IH ; [\ =ycy[csAod% aq/6nc.'τ7|L =N-FЛZ$Ĥ*Q>ea(,Ǐ3}Hk YC( nն(dlCQzLF<:uy(H8C=.T)Jǔ͏PH eP䜅!V hZv9t W'3YT]4u.#Zoq]z!I5U}db\϶Ʀ8]~[.QV y}<ο6N !M0<dYAӫQ[.5K 3Lj ?W^JSF-?-;A6<tSC&Xmoᆶ(Tiζ|aaa'# $ՖS#j !C?sÜ<~?!3;IHMKg?\`fYdʳzd;q{ IDATScSHHN4S L8 [tV _8,0?!Gi E8)f!: u(/}ae6 ~'/A<˾Y[h [=Y*`(=_Ϥ-Xu: R;X|KaVHSv9ɺ\adnx]Ǒ~. U`1g9ʯb=;1!G#SV̵c4 HL$]Jly_b5#:4mdr\+sSb` xxN18cF,)v zduNE{sٓ@$~YJWTsD|Anc3Ͽ+r1`$fm8D@  C8[[V+V& ]A<1!Yv9ƍ!#ywSབ^'AF!)֘p("ifP:}Ĝ)0[Z`m]T]O2{lؼ}e5uDLw\w<V;iEG֓״e)}GƉ$RV@? 9V.Kmm4U:XbYn|*TM<:lf)0< {7/LlAoǯHoZm9ӣ~쩖4 ΃})م4BFl0Oxp-1{<\4XJa^E}ύ+V1K8,߆F X)q*6yö 2QVJ!>!+)' qtu#-2.ERR޷uРE yW(΢1(z-BEu?- %ju AK{6$ bDG\F]Mav֛IY{Ԩ.ERl0Mt` T,`Qv7МDD$\G tWx-#0 {kt7%ȗBhϜH0\29"ӂ(_ ,]_~Px^ f^OAd2-H;ۮWೈ JA\dgq5:=ȸw$ ˵z{SNKB9K B/S̸ j[8ފ܌%!:1م9{5!Kvajkq:b>~68ɔVǓPc +AuH@w:d5Rr75 nojagp4+N")7J|C6g E^Ws}XNz]{XX͞@ \MyIJxLܣcB? q9o50DxY^>2F5D}5{і'OO#(;zm9>\/ݿB:ql7}Ԭd69<;}r7H! YN_+}?r' =ٿJw+D|e9+Bw8.Bfyc{3tD.xw '%Ll <:^IP 37`oE#d)NV2>W9َAyqf')z|_XV _,ۅ}d}Sۃg}Nl/Ȥ(6'~ԥ~%J}ćSC˯u55D[[Erʨ1\QC>Hw<_\kT./' 奅\_BiYdClrs/6}=9QuWvݡrgq>za9+"ۉv %pn֭4uH ;d + plLMB*5oyFZ=!1)6T 1J]O~@ަ7 "dduLP_)tzclwփaX?olۋ6Jq3<|!=,AV쐁2nXv{j7V-7^b},}A)=>X^+` +AvHAV-C1>&{W m\FW%׻;T~^s\xO{=Wu>$Jrm @Md{[=U,k cn+ztm d4dzڼf} +AV H|z>IENDB`fotocx/images/perspective1.png0000664000175000017500000004730115247006660015422 0ustar micomicoPNG  IHDRYBtEXtSoftwaregnome-screenshot>ZiTXtXML:com.adobe.xmp 0 134 456 0 'JeXIfMM*JR(iZHH0232,0100fotocx-24.20: Sharpen: median diff 2 12 12|Lb IDATx^wx?wFHi &"XA .Vw`TM&=$qIH.w <7;;;̻;W$@ɓ'O[fLm*(5H$D@ á:Ï.}뭷Zv[)1fS6Î2D"H- &88'rr4%77wPf ,+-qC"H$54 EY۵0&77gF4kk1ϑH$?CpHˉ&O|EǍ6*I$Daj ۷ m^H"H$"srAt H$D_EQuv=/J$DrUAjNCGD"Hj 4%D"iA:HD"HQ|L2K1`K~[L%͑ǭI=Mz$3 O;wb9yHQ4{ONdWf>Vw'Go[?ADDfQz7^=&'hrV6ka1 1r] %3pϑH!@Q ": ʣ*qQa5β%\sV!2tTo\ye6lƲ$)w vv\tr(p8PU=M{0 RrF(6>G#NfήYe ڸFRR<̏;nbUƕ칣( :^c66|}T.tJJJk!t:֫{v-vluZԭ7q s{sx6ǎu]Dr9 t>g/"kٗ]At:>LϞ}0:lv*Y]۷ hN8aE="ʱ QUOcЧ`z#\U{qcgt3.`RJvb%ѫ b9 *X9΢{A8 r=H (J_*Ъm;!)к]Z f+)**3fqq"N>6h(%μTEo!2:} h{\'?x58\q| BW2UգSry[Y3mv%!?[i @og˯8rtiy̺n1uyHE5 aiՉ];X*uJ,r ֿ[!}Y¾bEXA.(j0]MjN`WU%,%3/HN%s6:zX4I训e/ZVGko VW2I6:aZ rs)eߓP45߮v9BU݋aGf|:Mg?MXDeЄn,}>b ͛bEQT9w=<_/\wOQ+W=y.S{W\M@` Yhs[|Uה=h|J`DK>WwneXWGӾ$@=M#Z2ՌoZBPm):x`$ u4wSF7VrcۿॏUCЉ#|c6F3oyx\ǎ9(:]u_u8νfCX* NBH@t4i6o߅I'd_ڳ<emt$FT)wp`?R+/sZO7z;;;wвe*/=4zv=O"sbKs, F5QpL~wBzU58y#v EQp8؉Mod_6UNNn9R〙vQÉ4MhhBtlTNy|>J *cYhsšBXwN{邋Cf{1bDN;V@`w {[iB6a|G2$5B1"M7ף</atbuJdj376꼠 *Jч(0 EħN&q/JH}~KJH2bjSSi1tDO fc?>Ι(/-u-N8y t-yPkSrMy|حĵ K#Q|'2D4'@UKw8Dz (о&LJo -DEWۻ(@Z$KmDXu.Nr(t{׻DXӦiق !@Qh\ydv Gh=DMyײk(ݿ=˚ݛy}<=!1a( mE)` BCBif~nф0 MbQ rSU@ !٫Xk NFѣH|vWˉN8gKL> KUܳ{V-ohNכwI8o/k(,( &6{FPTX峯f_^V䟏XBv=Aa :~{i>c2],O͛Ow&Kj'GvN;Tg֤F/{7;2:(11Dc0仟BsXDf wp6޸{14 "4, |o8Bj.最q:Ė6{G&p::MBhBDdBak*0?cfcsL(1m}SZ*DO@9cƵoW]Bk|a#=q­ȿafaZ8w{4I(Xq`79^g=WlcOݱn .wGDh7 (䁬z *v+9vCr2~iw|@dR"3ZrVi6`5'5G1O'c ft!L7f H~@VrJ4&f3߱AAPa~yfHax4;ヨ2~18[)9JYk{נӗdg)4؏d6IIW!%JAE?aFGב[±&/. N Ǐ9^޹ M%5)/*a݊&l|s.)tћr6iէ .&Kyͦ8W$v ؄@'6GG u‰jH=&w.wOh<*ޱSXܞkn *~}= "}.y'p**khB~zc iC` @`6UnͶ:gV=hT]f'6!0H(ddE>x6[<ȫǺMαfogΕyԂ4zt/@QTR_An12iG^_GU%DAW $z _'˜I5+: =~&KW FԆ gf_.hTUuMn޻V^㠡ThIhB4 ^QLh Nw{clGVKH[{*<*-CX_Vo>@.mGtRv7U 9G;Wi9ՠ '._.$&&"Vpҕ8lyx?y)@Xx"VPV5a;c~_2Z3wHMH}hfGEQ`mK'l @Yzuj8yCU:}psSIJjɨK;Gc?ȯ9< #&-I;wkУc[ _xCwr!LEzz:ɩ>u**ZO^N|rgߟ] '/=V}A,=QGAA\T:hUUEx९9&>[>~95N34ihf.&n,V$,V~3q8r(yټ~eN]K'z[XC9[wbz=z=y |7ny+dm8|+ƕdĒovUhחu')yzKy\rS3p*:Uu+-hW}'QUP{=aރ «U /<>/S7L/47AU=} Q(c=RƲ-0Y>%t_t= jտy!ZK617s?ǖ7=Zm`a\KP3+6ױW܋EUQcSPlp8}B7-甫 DXAks09_seW%7qxv?_fY]G;ի2Ez^Οs5-,{+P\;!¾wGW 'Y]XT,f&ZPwwj%>V (0 uZ,^ SQb:9]\uyKRE+ uIUyebMEt@{Q ōe֪sEdTCګQ"Hl pZĊ{UID(v|8StDynlG(w=H0S)7 }W*8W}ڬd3jb6 X<2H9Jq^?BDKߔZ"_\uv:m{AD%G6闷Txc?S&޾co;Rl*SGTGe[R𛖊 ]ɳ9׉~-[zETtXU:w:V٪,fp:ۯqo p~#ڷh!=IuQi\㔿UځL'SzmV7:j#Vn)v1C+Z(:Z ,_Js6HΨ UQ0xͣ=mVaYq߫"92qm;Io} R5EU4WBPZ}Yɢ0?|Oڞk[?EN=!u5*ԳWT2ٝ^BiZg]fef^ZW9\6/XRϳmLJ~ g^cӖ\ةBr(Bs]G>e G3tRuyoOMU[s:0/Y18-32ȶܾ/w{#A~;T" WvL@gH䥯ױ z Ptq,:4D\/(B^AֶAT( &Ч^KO|!SfҼI] .Q^ՂV̉BN-ڨm tTX,:)1=Ly־Ѭ*(ڷgUoBNT/_NlD:L Cd- BXSSQnD<ֺW}zSOPv<& gqmŷl[㖚$UFxt ٥z{aMDh0!:2̽x-jڛNCQ!!zuө~۪/c@גpWobbZZ(+0V[../cX>GQsDwJ{C1Lmi]6Gݹ_!XǞ~Tz=z}H\*([p88r7na}4S !1\?cG?{XEq̘p:ZoӅsT]s|j 9_N%&}r^[+Ěl/p`9Zzr+SƶG*U_2fmڵ>-X-,{LB66@]bH.9E;0RϗG7|Z]Γ-7=l7r̈-85xFW뾱\&asyZ9893&Yʄshlu1quuwosG6y[9 hٕX\-u_NNc~Jͦ_/i|tOA>Uy`BV<hD(:¢4z .i;DBPiNT}mMo TC{3WA8mSg/2nUL8o o}> ]V*zΝW쑃q8λ^qHeurL{`J]<+L|qS7xWcY}c7 o;7fy@ЀKX̆}WqE@B>Xf&upcoţ>N=7>&ƹsʴ`jLWazx? )a2[QBhe0K{P/[]5c:NBc{ڤVN<<[+(s8hٲ%;?~+~ɝ9r1Gjsv77TEϬ_`333z@@6*a/_:hӢ)hȹS _Mc=`oS ;d Nz֜7 U àn͈aܧUAt?H'*'NFOXpeSXxZ"1&'^w&U* t>-y0om&W]ZꇦNyE$&v`,sW19.8b( ?1}>yW;{Zje$JFY-f5#bۋ&DD1j[VZ=SQEbКŤɢiD9>Qղ;Ertгw]OHmT!Le狹=&~wHO'"Rk $̦q]ExLE^aCEDrO{QX-CXmbbŐ đbsdX}~snU9h#.{Ka0 ˆD\\g SEx"2(>/vKebbd$v}Xq(%1h4B1Ql2 c1{Hv8bSEXqunf{{R/R'D˄jӕ<'6Uz$1"'x"*{%^n\oA'XaqQ\Q&??q/mdoJ6a2\(&KM"Ÿ[&0f(k+y[<Փ>Q\SRln*gEi~(1ou,]B<=gh!.1vݗۯU=Zxᵕ[,nq7UG16%9<˷M OI5"/iNWӞ+g6)SDri5M*ZT啈퇋Uجak}*d?z_$J*yt)D?,.,](([(:O^LIܹ\3Ŕiŷ GD߫m]=FL*4m/)GעCXqOF/?,n?)9HGjѡEWOW'w~'zRP.8vSSwm/(eh..{]Qn1 ,FQO:rkyjYQbU\orulb6y>mbWKREYW5t"2O;t_&KROۓ8uuV^jmҹi/.1 q+yVWt 19_0*Ky_zwwwKSɯg @[04k_rK!)>_85Q-VMG1,&@%8$bf'6$}u"q FG дaQ Ւ6e9' ~N8.5c8!F*ԏ9rc04el >vc&%.9j &.e{(oT(d`68gP{Lkv=~[0m/?Rû|DfuDiomݺg@jJ*u6xOR9'9|a;Vf DsR>ahQ~ W=z3[zrAwj9s,(Q`s41Z>1)7:-.:sẠ?m5it颶)B@w8ټ&ndal6(ANrNN&\x9ͻq31W'4K&\6Gh_u4^?,Y3Ƿʇ+csْ=.>Z4]u5Q2O~YP8oB/}Wrqif!LJNxV/ݩ8^ihzn .Vo UU]EEQEu`Z!k289F ]m>w߿ L&-彜Q寛o>s|UAp5N˷yφIۄݩhBிzNv}=QwGEQ\2I] 4{I9]t"K$n"WјmpCh(&30Q*A;>%qjWqoxJ^*ŀ.> O][Locẫ3YمF!TUE ģQĮ݉08u,, K1_BϗaNЌmeCb95iV]k;3iYwwͻsJ"N+oMuoᡲnT-+tV.Yz̥w}WmﵾCf@%yF%yɐ>\2WHջo&Pa#4奥y5x@ 5!lחn=ۺ|3w8&҅c[ rKY__2>Ρ¦Lj*ke?0׼v854N.~Uټ&|ԍt5T)9Hx XƣssWx޹wtxcMS7xw UTBUSU]Py @sтڤѪ~-ଌp"O7M]x/Aѕڃ?}h(~оu =?K_e\5s$v'3\N8Ӛ :"\gr2xWF^zn,YTeq1 "=*w sś5$ŃCBUL;v&fLn=[U;ody˼lMWRi8e78mg#jT?>EZocYcXKO<ɛ͸{^\jtͽ͓z3^ S[И^as2z7LMCۯƲ2%AfSx\UzƆ7j$NgwUΙcݹs7yn{Bs 4 f=Yb帟\'N'NU_U6)tpW>_=z=zoh!A>.,/AFhwQ=Ӑ@&F-3J _~G]nJ$Dy; H$H$AJ$D %D"tD"x@:HD"H< D"H$R"H$H)H$H$ź}v,D"Ht=K~U"H$O-VD"H< D"H$R"H$H)H$H$C"HN!j_[UOi(R+wC}j8܍վt4 EQ,\5u1Bxw1٧?-wc/D"9%ӉᨾjwGA&MܳAUUz=V/}j>r7F D"9hn'Dǎ" ^OXx8 I'b0PU9O.le_!{]5*H$ jr:dONqI|B2J=[VBhd?6c0:#E&wO5H$ B$'82bhNvݽ?EQ*t^-[Ns}kuD!#3ֳ76QӅݎfs^=rQ%WUFwO5[(BiI a> B,"w O_to5Ms%Y);>r,H$*޶jOgjni_>H$_/Fa3h)_r:OƗܾױƢ6H$ jaBI9>% m:HNMCSPT]cפn>/1q%H|t?|XN395+sJYX5פn\1)dtˌ[%NӕjXor6 -OiM'?֋kܒ: cGɾdn|^Цh~AJ$FDycx#od5B*EmܾU 291Xqp<@=z-;'c}6!;jup>*[p]3ֱyrB;>ax/ZLN~.e;Ozռϧ+qiNv+^{6p8f! yʝLXǏ羙}G(::]9FYl?lc?r""En1.{3d{X6R"t:PgDZ)+נYlGF9UĢ i8nl3Mꨫ %U%CعsN(:N'~ ΙTKNEꯧ(O;[޶-[ez?JB1Ok )thў0ʞ%SEPPA!̘3}^gaW$ :%*#ݾݵמKlB7^}{1jY)"9rNDTRmт `w 5r IDATpH>A)9[3Ӗ.f==X둽^8t$ ;yWp9!Es?P!@SD98wm !TUMϰApb,kU*q=4[ %)ȳ+9y)`H*)$}֫Yl*FՀTUuݕ EQQUWp-gTa61DtǀV>Zs/|/NS/!i;F&E&Pt C3Y{/e4ꢈPXj4V[qE {3;;}O29\rs=FUG1>a~?}#R Lne5u<6'3sO $f:ܜyNUqҹ({I;:H%Mio}yxhB!Ru6[ ;v5#yV:G0(u !i* rC:u]fܨ{^:`jjc?"ٳ41Md{>"0D[ *JwƙC1 #Sg /mj4M#XbY ɒr.Y'[zލl]tu $IݒWx˛7I7MgxP*S1~%X/Լ4}Ïʿ`w:.ᣙ4T!~mnDh}yy4F|m+^g1:\uC+Kqp_.=7ʺ3h __y]7W^{yO=0iCG_49xZ%nai,ܑ۟ʭHVs$uMo;kb杨'sA3 Clx>CKVpe͟Qf3{pCQy N qh~Q ԋ}̘5 mqѱ /?^ӿYłOq#/k70ՠ)Cοt:~i-nD 9qlZ ӗ!K i?q%xp5BD*.`۹cb{6=$$| SO`gU\"L0m/܋AJ#m}J4ۍqЛ2{#:o!;.c%hi<_;o'Əq=fM4(35e豂d_wDŽe)ޜ~yfLh#AZ<&\zd$EAϛhnS6 $I=PcBx*x(CuL.+'\G #MeŴ*ݜeN=9˸ HIzDU5z7(aֽZO/CӎI)J=;6ʪت7j9}:<$I#8y^:Zzi>SGpСۣ=79}wW&/$u!mF>iNmӠ}%7L1Ȝz/hOHIz$݉y^.~dYڃ EINdG̩wr{}X%I!EIhմo8ѱޔMbvuܽ> $IG!=mhr;tB%Nn{s"s:z}wo/X%I$e;$I$ $I$`4IENDB`fotocx/images/custom-widgets.png0000664000175000017500000022312215247006660015763 0ustar micomicoPNG  IHDR%j2iTXtXML:com.adobe.xmp 600 1000 0 (WeXIfMM*JR(iZHH02320100fotoxx-23.4:Crop: width:686 height:298|fotoxx-23.4:paste area|fotoxx-23.4:Crop: width:686 height:273|fotoxx-23.4:Rescale: width:617 height:246|fotoxx-24.10: Rescale: width:549 height:219|fotoxx-24.10: Sharpen: median diff 1 15 15|: IDATx^w`TU)$H$fEHUEĵ]@BBIdڙ\ns=32!7nܸqߌ?ܸqƍ7n7nܸqnč7nܸq[(qƍ7nGJܸqƍ77nܸZ̟?۷cۻ6ŋ?>ǎz/R__ϋ/Ȃ 8uT.^ȣ>?Nyyy6?έ/Jnfȑ477w=l6j*Ν-p %nܸRQQ 馛8|ud2& _d8q;wb6q8]Z<* Hnn.Zod2^^^SRRZD&˩S4˗/?\?#00?f \(Í7n:p8ҋO.K/bÁBjp8Px{{c4uvvW&!˥nnP(Z(k CE1v E !P(Ҹ;uw)fIl6 B5B\wq8RwjYf fY\ڻ)˥yt]}v?>d2zU.\}ύtv]-jtԦxݎu{pC///>,j4>A}}=%%%TWWc6!..H;غu+ <@JKK9x ݺu#33 illjCrr2s8F>NFF:t\ί~+j5\xZv;$&&r՜N:ŹsHNNfjv;1eZZZ8<ƍCѠ(**\N@@vZvjkkٻw/vٳg#ɨ444LJJ !!!={ .NϞ=Q(sN|}}IKKCVގ^ԩS444E= E.c4r 455Lbb"QQQxyy!K.Q__Gղ~t:SNȑ#0yd SSSCdd$^]1 |g >FCII z;v1cdFVZ~;gϞ={@YY!!!ۗViM'""pt:DDDHxx8l6*++th4?B.]رcQTG߾}rYrrrXh455QRRBUUн{wbbbhhh ;;X222P8+y衇p8QZZJss3DDDлwoT*Uap͢LƮBfg1m4+EHHHJJK,"77WnML3)=*;#n*l6lDKdff(}Y&DHHѣX`;bUV1c QWW'v0 bԩ_8p@̟?_DEEgϊr1vX-BCCEppv(//6M_!ŋň#DqqO?>"77W<3O>",,Lnݺ|P444>@Nj%K ŋ"88X=Zt:qTq뭷(ŢEĕ+WlV"<<\DDDcNJM6 .Ľ+'ƍ'N<),xgDhhxDLLuuubbڴi"22RXqwX{]?jjj}_Z$''@*}]aXĩSx饗u"##C?PsKg}HϘq7rqq M&jjjB ,"""d6mƍ",,L'Zō78, V7䥗^bҥƮhjjGeo9x p9Ν˦Mؼy3~~~!y'bذa$%%æM9s&۶mc~ܹǏFFF:;ԩSh4x{bbbXz5۶mߧ|,K,\Baa!6 Jnn.~~~u]֒Ø1cXv-{e…={K.]w;:t(=z 60{loή]ĉf<\ΨQ5jvBƌCbb"p8سg<|7dgg3qD)--B///K^|E^x<<<8u;w䮻b޽iӦi&N:ń HJJn'77B?B***HHH?fݺu̞= 6pAO>`7P[[KEEGeԨQ[ݻw`.^ȥKZ$$$Naa!=K.4s|'Op8شi.]bŊqذa8qbDDDPXXȐ!Cx뭷:t5$2g޽|̝;?Ϯ]8q"۶mc۶m<HZ-ӷՊÃg„ 2|pRRR0$$$GCCr ޝ1p@x J%F Akk+>+WdΜ9|xyyQVVɓ'Zh4._J" ^͛y4h'NoooKBBB0`l66mC&ٽ{d&7ndz+++O>ŋуz)SRhjj"99L`DɓQ՜:u~3k,Z-V6ve5:ӷo_&O/BFŹs0L]^Fff&CERѷo_v]wEJJ mmm <N'} >d=ʎ;0ak׮%99FQQ>>>T*N:ř3g̛֭7kp8Y~=GQDDmmmRXXHVVL&4 r>iӦJvv6W\!!!p83f Vի|WTJܸ˗/K/צ&JBѰqFZZZ "44___8Aߑz***$ V{3R$<<ڠ߿?466b0hjjX&ٶmϧ|Aj5jD0 b2_"11N̙3 חDJU_jTJ% 8cǎǀ:E( wNyy9k׮ŋڶ\wvb{)..577syZ[[ɡL&CՒʷ~Kee% Hee%j.92j(Onh4$$$H£7؈R$557Kss3555477cA^l6HCC)))={و#BTT$$F4 kLJ"((H>!C̰aú3nč1bbbHHH ((pjzѥfX曹{Vn˅ :[&_&sz_ Պnn^Q:!iHd2'Wv;,ZرcX,wm.Off&ǎ|R8x .D2ydҨٳ].v3X, 07|jk)hGNNcLN&LFpp0:W^8ի/_|!fN>MII +V`Ĉxyya0XtiJ={_ͱc$!!V=l3h4(ik\tštSRRBpp0{l6K-//7 ,^=d0~xV\Iee%Gח6'N 55O?0Q*dggKAnݘ:u*v3bBCCjcX1_|ѣGs=c9qk֬!..$龙f\Bccz=&99$[%͝Bpj8jeJEIId~tqrFI};$w}}= Z)--W^Sr)ݻ7tN-[d^yF 8JP0rHFɓ'yw3f #,,Vz=05`Yv$ܯ_e˖!O>88tAAAvmFnV,Yºu?Ul.-qKHOOgDGG_*޽;Y\b Ju*]q}544(XjsEn馿ίSחaXX6fGII mmmd$''3x`>#JKK8q"^^^vo 66ZZZo1 Nf)&i Ξ=Kkk+?~\Ҭ0tPt:ӟ(**5kpF- w455 /Ha]B`XP*`0hiia֭TUUruhϏW^yZVXADD7pb۶ms}]=z4r`nF}˗Nn$"66Z[[ٵkUUUFitĵ?˗_~ɑ#G>*s_I^^& N)..p8Xd EEE\|p!&MDpp0ӧOgʕ9y$9ؿ(d(JV+2 yhii_~_SPP@mm-˖-#//s"wޘL&{fϞMxx8?0g݋^G&܌5%n`AAA<L4 ooo, +ЀRdױKUy饗xW;v,SN壏>O?E&aZ[$@N`ˋAYHIIAA{{;QQQYf͚U禧p8h4#9$233YjC%99Ʉ/p ( 4 J4ƍoDRѳgOP*?Sb >Sr96ɓ'3dȐkjar9$$$p̙#Z[[q8& /^̝wI\\ҥKnL&ш\bĈ䦛nbڴi>˗l2L&mmm~1@~߰dƍzp}QbbbHOOgڵdeeѳgOV+z???)8u+L6ӧO3giݛNfC2 !uuu_^^^fAVV9۶mLJ"##)))BQWL3x\S"66:F8M69___~i8 x )nltK Q(N?}s&MČ3Xf _~%L N߾}x"\Nll,g7䮻Bb4ioog?JܸqsMJ%cƌaƍp@:#I&@||\Zk!׺3nܸqJss3{_筷ޒeNKK 999r-}ݝ4y/nM7nܸBP[[G}֭͛{v $#n:/_NXX?k[p %nܸqoB.wkkkcƌ 4 n~(J6lu| I.2plRϢ7xoĕHof^ڵk9t7|3&M3& ٌnκbqF3f 3gE?&~_ӫW/|ں566j*tjb61 IyV`d2v!]BԞ<fcR3 ~8κ;!9shZ?aR^^η~Kjj/v}( 4, mmmdgg3k֬NNt"ǧYB/B!P#_$DEEI,:8_W8ip8Sf_+@&s^*ά:^.zm>f]]ǎc}w+%]͵s56׹3寙S~yߺ.{ ?ÁR䡇bƌ#9S_i,.3Rǽx~ucldb.Wߧcu]ZcʵYnFpf:[WJt"g#ҥKX,9pD"<<(P(L&jjjr uuuCll,v{ZӤӳgOF#%%%TWWF`` qqqhlTUUq LKhh(477S]]MEE---Cxx8>>>l6())j5͜CJpՃnc6)++ FllT%}SRRBUUHcwonn# vy.^ѣ9s 3ҙ04 aaaI涖JKKh4j&,,L6|2RȶkSъ F4p)LEuu5G!**4i.]СC=VKnn.CYFl6gXBBB B?RUUEJJ t:BBBHKK+WDdd$ђSWWGQQVZr>r9{/23wihh_~PSSN.kT*ikkr#22 riIJJ" ":DRRiiisΟ?̙3Q(s%hkk骫ֆNJ-B eee`2'..tЍRV+ujm߈t&%a ΐG}6Xx1_ЀJbС|sA>9"ӧO>$G!55`;^z%bbb/EVe̘1y 2R-ZD~~>zݎÇgҥ{n.]ʕ+Wp8z/Lff&_ 6P[[nd>wYCqq1qqqDDDt=l/dŊR*PHȆ x旕Ŝ9sʢwy8͜9^xkײzj͛_|A\\_gqPPs<6˗؈LLճgO~1n8JKKyٷoTߟロGy\W_}Ųe˨@FbΜ99N駟ۛ͛7KSO=ŧ~VeѢEz==_|}vƅ۷7xӧs1t:2G}:n*exꩧhjjW_eǎHw͝wIpp0 {ܙbƍlذh{=֭[^pGVV:AAA8pKjE.… 5kVgd2qFZ-yyy{tޝ͛7_Lrr2gi&SO=/4\RU*:z= O?bl2<==/پ};/_O>۷^{^z믿Ύ;d>|n7xnR֬Yرc>}:r3gΰl2#9Byy9>>>ڵkjb G~8p_}?7p׳enFFu455qY23328˗/'>>|,Y`@&sf]jGf( rssfn6ƌhdl߾ h<*}A tʕ+ټy3cƌ!((lx G} .IAA7of̙3˗/;o>*++Yn#F`֬Y|G$%%ѧON6={d|ᇔhѣDGG3i$~)-- 4sݻYr%RĎDEE!;M7:111W^aR'|JJ%۷ogڵST*v&ϤI;wGV???BBBرcǎog֬YdffC{{;h4ZZZX,f&**J,ڧO);3g(((`ذa F#xxxsN&NI(Gr ߿??~{Wj"22RT*---R6wdggs}hdذaԠP(Xr%<#jf3:t<222^*V+066t9B\\YӧN$oooBBBشi<@'e5LTTT`2ػw/!tq9n|}}lߟ[o___v;cǎFC^^{b܌AAAZ r0azDTT|L8Q㿚_Pb9~8GGtMWم֭[ѣGyg:m27~V+_Pv4kllP򿩯~R)ٮ]ޒc^qq1uuujɜQ(ӧOgʔ)zV+z"00BAcc#FN>PDGGQ($%%Q[[˟' X,>|dFF'O;$66ÇӳgORRR())!??Avv6W\ 00]f&**J Juu5*=zH(ItqICIXXfD~~> Orݻ7>,^^^(JT*fjJJJjlذAFxx8rBeժU444,UuU۷/|[nnw 2///*++1 >}CI`0j;Bᬇӽ{w>̼y8{,FÇ_"4h[n%e2`i5g-0z=l6\N$j"##*2#G~ƍGn0`CTr|t:hooGPデU\BAll,QQQ\|:.]ă>ȹs(++#44fb!::Z1 xzzb6^ٳg9s """8yTIӓtۯ ~Bŋ,[wmw̚5kxg !'OdϞ=2k, Fll,ݻw'77p~!_lW\/Y?pΌFƅJr] ?*l BCCR|Qhjj"88?W_}ݻ3zhbbbh4ڵ p>2h .\'X~=uuu̝;ӧc7n/"/_$44T6;ƀ$g͎v, rk-\+ L&BBB_tt4aCTp8/^JvL&gft:RzʨQl?p?99+VpJKKfÆ {a4 ᩧBb8DDD`4$̹|5Ξ={(--ɓƒ(ɜ#蚳kz///}Q$$$PVV6nݺ3ϠP8kXSksE0Rѣ%)d2!_=zܹ#Ftrt!h՝gɊhb2o-\QQǪVѢc=wrL9c Cx9]柇7;w.&h)/zvE.wVU*t:2~~8pV޽{N-ŋ|2.999ٓ˗J{{;j۷ӳgO͛nj30<Z JE޽9s|swpȅ ; 0L8gTHc#jizsFgKQ5X[f;2uOU Xy 8yrv>{u y6ӕSU[M# ?o52 j^>(N7˜^r`ovϨ(T{3V+Vk&LV]>6 mMTSYUM}c &kWӁlJjh6cҙnB}m5: ׼YZ|1{ ׯqqq|7`ٸt} M~0L|t: [laʕ >///ZZZ `0Hcݾ};hXx1wujI0ٜFǏ~СCJWiV+%%%R8eNQ|t:F#.\`>##իm۶?Ő!C9|0555TWWw^Ν;O'pFőʆ 8q&bVXACCQQQp8֭jA^^fr9̞=M6aX6Ul^ٹs'1iiihU*={$00{D>}t?Bڊ\.'-- ?PSSljv:9sp)^ii)}f^z鉟gϞ6صkռ|  fsӇPl"HO:ի ϯȜZ4T*˗/禛nBxTܽ{w7o߾r[JJJ0^ɓ'Bzz:|7t:zTMyʔ)?+4%O>˗Cqq{l6F;`<䓬] 60~xv;{'$**3uTt:O<K,8{1N8-['>>W_})SPRR¾}x7%Xjj*0aEEE̘1ӧSQQڵkٿ?---̝;ϓÇ~Ν;X,C1mڴRHl66n_|d7*z/B 5jL8˗˼y󨬬gϞ=[+¶m۰X,(JǬY;`ܹٳ{^{T^ >EaQ+Ȭfxl2OJߐ$ M'!ȃUk0Y*vl66aGV!<8{`48n51} l6JB\.CP?3>*}id&Lz%TJB" (`EDEEE"M HoJI/RHH!'33c&uq_}Os9RW[jE*#I/Dq%&52ɹ]Yu7hTW -\6~ ]mX(OnV!)8^{#pţ?cZGь<޽=q|`~#HD­[(//o;LB@.#Jy뭷?~#\B˖-M}QQQ%K@II -[sg͚ūJNppph47n= lQ8>>>@~~~F ARQWWbCʢ DXXo3f`( jkk 'jHoX|9jRRRxG,>s-H(EѰ`}YƎˑ#G;w.?3tԉ7q  ((Ν;гgONʹsOa̙7ݻ3sLT*O=No߾>|K2h Պ111]zMdd$?aҤI3i$Yr%g&<<??&敂f̘AQQo&>}UV̙3gXv-޼ٱ}v֬Y{Gǎ>}:f͢M6 :WWWNʖ-[xw ''3fAyy9t;;[DFOlӮPTّjj 9ZI(k(*kY{f-52nqyxS[PF2 *PUbՁ\!4nU侭(M}ZkN!l e2nR^g+_<\~ Jme95&:A,e\>YScխ#:]foBj|&DZnƇ3'_;YO|ЅVcu| #'ϣWeOP#( _*&6mPWW'0X6`o߾ r9={$ Cq"""HJJM6TVVɲ=8q"ݺuܹsE.]B"OٳgQTǶmطo$&&rY 6 gʕbx+7Pj 11JCÇ)--%..6l؀jё &ХKΜ9CEEtooo$ :Yfq!._,:v*N c/HP(<#s.]D`` III#iժK.СCܸqxz!rrrXp!mۖe˖qAnܸF!,,$1ԩNONpP( cȐ!iF nŋ9v8~=zĉlٲEd7% ?dB"5 ڵ-DLLذa{իCbb(,޽{1bc„ zJKK7n̛7+V믳~X,\| &йsg2e W^3%='O2w\d"""x7X`%%%[8;;cggΝ;8q"| zbȑf-Z 2 //899!>,[n%;;|fϞ[o;;vLc&M@nZ+W藹}zS~j_N73uH_'}E@gBB˿';khRpY"}a|0}qކmYxgjG(λ`5q+5f{ƒ]yoq B‘gذ έQ ^;'0֛LAQIʾLC^}nX /:XM~ v4bJ.=K~ZۊиؒkYlBXEnzLIP+2dr΁vؙAURxG>TU#4${vvz 2.g䶼)J==}yrKDf0L\r !CL yWXr]DJB*G WX,wM vTIR,[ TJΝ8p uuu1 6RfC\d ?u:=, %%%d&uTj :w|UUU}Uu`;Yظq#!ƞ7)= iETؾ<.A)+$-oz* ydQ#uCh[z!kv6\Be0C]v W/W7P7|4r̵r\8s4z,V~GNc,iv *ҩ5- ̕urFG*`#A.l=EUJGjXmh58K)/d6P^V"AB.rNEEqUUaf4$ Q- @KU` *8qB0Y(s¿DbviT-HRQxxxбcGQ*++cĉkAXhjz***ĤK?3G!''aÆ^R-h%i3aX(..GZҥK,]M'33%Kg}L&X5aѹ'95G5ԜNT_ΤePټ`5rxpXWXqpr͙H-u($d`o'l6"SԕdRfl8ϐ7?O?2,,L& A& D\."X,R inlXM`-I lX/_smONuu5~=suYغu+W^eܹ f;F^~L&[lat֍?f^ʷ~R$$$}3N'""21'lTTT4lߏb+l2駟dqeZ->(AAAh4_ w  &rF#)))dҥK7VN^TfrqnUK r8c\(#,2G ˝nG;\tNuM r˪F}o-B na7bкE/s'U"Hɔhꫩ5c`2L&QqP*Q*UPPS[~ZRgp8!٣mLf҈j`6S]m@?3l۶={ܥ3ahR#Uwψb!''5kPTTc6ٿ?cǎ7|:#'{n_>V-1?|x`M$yyyRZZJhh(ZdF͛7駟pppEEEwM888Eݙ:u*;vK.syJ۶mIKKl4t֍ɓ'uVٱcGy.^pp0O?4gfΝlْk׮fl:v֭[>|8Zddd`61cAAAQSSٳsθ0n8X,l߾]p<<>x:auW`U wD“0o-JPُ@8|1z'*j 9~!^lB\S=2=2l2X,7ٿj.co7gסpWIE\ဏVqoa^j2hd7t Z;XyE iZnfSco?\4v^ˣS0R &COd_ۛ-[`*?#gJ6xҡ龆4W׵III gϞeС5S"i6Mkn y̿2npo y̯oNS-ZDzz:ڵ㡇dݺuUUUb3^JBl7)++C.²j%##DPP=[<򨯯e˖M[VF[BbV[z,JKKJZ뤧̕+W0Lo\.wii)"~~~888`ڲ6d5 8::MPP\ նF`۷7ɿ/ TΞ=Kǎqvv6!nݢ ٌZggd2hJxVPj/gffJNt=/((F7^^^ = aaabOe˨4jk*0˝·}R, zSү_{ HSG?C_wf*-{ 5 %RAQ (nX,8OBJcN:?HN:Ŵiرc:t !!G2`>{1233Yx1L7omۖCO?1j(ڵk/ĉb%ӧOs-\\\8ug޽r[ F||< qF֮]K.]ڵݧgϒtfZfɒ% f̘A@@W\/`0 HbtؑO?T… !11ӧOh"Oݩeܹlܸ#GҺukz*Ç9|0Ǐ'$$zVX5kҥ ݻGGG>cIKKcĉ\vd_ڵkyɓ'm6FŘ1c;w.7oӓ\n޼qvvɓ8pÇ{۷oPL3\$&Flҝ;JGH|BܹRZҡGKl3FagX"}ɿ%%%8qE!?cyhf3*{$AM6QZZJvv66l`\|dחѣGdbΝӿ0 ~g!66~W^y*JJJ… b=T*[FRGdd$nnnL&ۇ^UV6007r!1QV4h]+pDjj*7R͛,ZǏc=B`0вeKٱcF899/ z,XF+;- IDAT}ү_?T*W^ѣ fcϞ=:u  8::RQQhDBVtӧܹsѽ{w쨮Zͮ]ݻwA4GVVG矿kyg6lbuQYi+J8y$[nƍL4HR)׮]ɓ8::R^^N@@|w5҈… 2x`d2%%%X,"##&<<@mU4 %4'T,Cxaa!999*rEP`ZqrrjNOOAVO2`o,22gggd2dggS]]ͱcضmV-B͍R)aaatRnܸAuu5ǏMrmr9FɄAff&/_F~G)^ӡ1m9O#nod2B ""Bj[::r劘>\&Յa8::"ŴHnn.8::b I N'K׮]r ۷o'??JJJZjڴiCTT3g$))`h4R^^ٻw/& RZ&c'hٲ%8q/RSSCΝJ/HIIaܸqr._,ߊbAl<%Zֲyf$!dL&өԩS8qV ZQXXF! P;F߾}9vn"##>#0V GyhJ?{P\pe4nݺGݍDbK? 4l ۋPP lXwuueHd \\\Xj ">>R[[Mcƌ!66ׯsqV\IQQÇO>L&w{Gff& ي9TWWs&٫cآ4R)bR)Jud2nnnX,&ٌ rV'fBVWWhdРA :T,RО`ywɡCm۶ɽH$2sLΟ?OZZ{eѢE3m4;GGG1GoI_*NRR{֭[>}qHlA 7n`̘1HR:vH6mdgg-fP3P((//gOc"СݻwglڴhёѣGEmm-`{P(޽{9<`Ȑ!F)669spe._̎;HOOgƍ|w n&f03Eݽ/1 Qռ 2=3ߋƂHcR)rrssZms555̙3SNpppӓ:rXb0yd 9~8AAA̚5 WWWA@Vs &޽VZ1rH `wfȑ888PVVV}J][oň#8p3؄2~g{OAS[[K^^V- ܾ}[\A{xxPSSB &&F,}gdgg_ٳgE!{aŊ=(N quu5V~~~xzzb"ƍǔ)SuW\aҤI<( JKKYr%`lRSS)--'@Y|93gt:jjjk/t}1d*0oʕ+ٽ{7#GEr}f̙oDVV֭krEѶm[>CΝ;GKrQNzD"RRR}6_}zgϞc6A4S &N͛7Yz5*9ٳ1l5 ׯSUU߿?-Z୷bѢEҲo"?8 {M$4Ti_&xiG:$ AAA~ƃ رAHnn./.mD"ё(jkkYf 8::g.]ʸqPT # o>n߾-L4 FڵkHR'%%+WrEZnMyy9}iii0LܼyJ]ZiBBBJlݺ={ҢE غu1`0j*Zl=`…rYv-/_F ǎɓ;V[ ???ٴiO<!!!1c rrrpuuXVh,nܸA.]c˖-̚5˗ӧO *hӦ R)믿fȐ!wE$ml[Ϙ1FCLL J?L&( :tyhjΝ;GII8i۶-.Ǐ:QH3gDT*<==ٳ'Wf„ Ӈ]bZŅӧO; ɐ儆Ⱥu4h!!!X,*++T˗/GbA̿ukۊrUT_hBY`o ] "+++ɡR)r\O87|S\VWWرcP`V;v_d\;;;***GTұcG>c^Jhh(?'<<~9sбcG\]])++b0zh, Ce<8;; ΆJ6m>-СCm.~0y>#BCCt(tڷoȑ#Y`=??86m⩧ AaРAiӆK.!65Ù0aiS]]\.'$$:k DLL ҢE VXA||<>([laС"$&&/Fb޼y[GGGJKKM`7 Hpss#))CLHH(\7ٙ֯_OBB dee bVJJ}c5s̟?1cƐΝ;Ybw㙖m٢x>|8/f̙3M6aggGUU~~~<嶺knnnLBB^^^H) <쳢qgT4 %`R)?y"f~;Fpptt$00'''hlѣ( zE@@ҥK=?>>*q7RRR8}4н{wH$ <___N>Jb$&&yfvލhdĉ$&&r)hٲ%۷'66RIxx8k׮e޽\p777i׮ઁjlCT2l0ڴi)..'5k NNNtE"MJJ ~~~H$\\\ٷo.\@TGrr8PSSj9Q(<sΟ?OPP;w&11\Nxx8˖-c\zU4Adgg3|$ X{r sxyy!H0a;w㔖KnpkggG@@'..N4XVٳ'h">Laa!Çw9ruq-F[ْ{a2hݺ54F"_| >}}gs4Lo /qԩ'O(t邗x.ԖߟHZm:t`ʕ>|Lt:$''5%Ӛifc}||Uj]ٳ2e w L4L34R??@P0f222ݻ7zY i64L34L&#''NOVӴOEEjq%+**TUUVqssMxj0ͥTJtt4LljZMyy9Ν#662JJJJJjQVVTjGJ"==IMME"\.۷oSQQRDRjRWWG~~>eeebx;:V+RUUT*ѐ|CNCP SUU5}(**"55gggBCC;w7nFTT ulBBBpttLzz:NNNҶm[A@"Jii)HRz=z y\n߾MYYr^lF&!ɸ~:fˈlj'ܹ3:L$ vvv\x8zx/ 6$RswwGluL&dddR Bb1ʹh4XC)..FV^K@ 4L3FaڵB^^/hZ]ݻp1Vԩ-;Vj%?^HOOFp a„ jggg!>>^?P[[+ a۶mB^/hB?.lذA*++s AAA鄞={ zz)\vIM&0eYصkyfA &MRRRA =uVA\裏-[ Fh4Bhh fYxWOOOo$mV(((~'q[-V+ƊN* Fprrzлwoa׮]b222VZ- PYY)k׮:t t:Aرc} FQx0tP[礤$aҥBmmm9t萠xP0LB^D"G0 Baaйsg!,,L5k,,]TgggAP¶mۄ5kAAAo!$%% C 6l Cf!++K2e ӗ^zIHJJ~a@ӧ'9sFɓ'L&L6MyЦMa«*(JaڴiBeek Zooo!99YAR jZHJJ222^H$BIIPXX(L6M 4V***RaBTTo VZпQ\IEfi?I]]gϞ/dŋ8p\NRR2e/_ΠAXj㏼[Y Ζ-[(..]vQYY_ϴiѣTVVʧ~Jtt4fbɒ%$$$pi***64RTsN^x6m׹~:V3g0|y,Yœ9sXb… 6'bZٿ?7ofѬYEȪUHOOm۶!˙7o7nru[ ͛7oNNN޽[󉈈`ҥZQFm6N>M]]NbÆ klܸ?*Kqqq cĈQ\\LYY^^^ۋi+**puu%!!Xqǎ b$&&HMM ۶mW_eӦM|GdffFuuuf^ŋԩsaשS'$]H$rpww'99Ǐc4y饗߿?Gj(j&MĦM2dwڵkbl4oil6c6ET*+f}}=nBVF}DFFf3Jz^z!IHHlذ֭[sNbbbhӦ ɪU8u-[cѲeKJKK #""]vsω/HJJ ^JNNNv@߾}ݻhذaEEEdeeqa4 G&((łsE, F}ү_?~: 228A H/^O?D>}ׯ]v%88ш^GVSVVh$//LFll,DEE͹sP(={L{1ܨ!66ݻw3bn޼ @.]bU1n#,_bA ''s)--%55#G61F())VT*d21h z-JGII Fաcooϰah߾= Z8ߚBI!HbtD "P:"(EĂ(QJy [H(R $y?f4zQEٙΜٝ99DRRRn%xyy1ydڵk%%% 0{LZ,`Ŋh|||| N>F#..FC=زe [n%66{߿?666T*VXAaa~7rP"nba8p___z=<*NGTT'OdDDD#4Chh(ZB-ݻwg\zjkk+++J%TVVεkפ|f3F\<==iժ<Ю];.^(/X,s ł(DVV;wZb!**^{ ///T*Z01LܸqCʯXb׮]ł}… ?~ׯs%JKKE:wLDD۶m#11puuƍw^mF}}=VVVb0k׮l޼ӧDݥi%bj4t\vjjkk|8: k[)''2F?jjjXz5+WøP__;v PTTij>cR^^db9ri44+;w櫯֖S\\LLL 6m{DEEѪU+JJJ W\dcc;'N+ҥKt:iߖ--yyyZ!WE,L.]PTdgg{IKZ-;v k&]w٭z'dP(M6ҺuknP_ٳyg0 h*)A((( ==łlm۶Ltt4l߾jjjxtNNNiRQTHAA+V;;;¨&%%ш(sn)%DGGNAAA8{,}STG.X/H^^]tDyy9X,lllX~=Æ ѣDdd$L&"##1 lڴ JRȑ#|GRk;wۛB:u*...j4 .bP^^NXX#GƆӧ3c ڵk555( ΝK֭cΜ9帻3{l֭ƍc޼y,_'''*++h4PAcwBRJi"&aÆ_ӫW/|||2Ntt4gΜ ϏI&1{l"##𠲲B/H۶m1 | 4xF_ЩS' ƍ6l!!!444GLL QQQ3vX-[EEE2rH<<>ϣQTL>`ZjZ5k [k׮уiӦ3FDD0zh, R7NB{w$%2wgmmͤIѣܸqHBBؘg֭[Yb$$$ЧOBBBPT{エnݚ;wAXXIIIR75Ǐ'::TrrrO>P4 q prrbÆ 7 9mjIѣ^^^fuFyy9Xq5{{{>vMFFҳgO[ !!jD1DH痚JFFmڴ!))j5|޽sq3p@^ҥKihh .. 6¥Kcǎ$%%+9ݺuTVVҩS'zEpp0 ~={tҭ[7i՟RTR-'M@boo4vуJZ-~~~5 ٓ2ꈈ@RI_( x0`'N@ѧOX|9$&&GsuFq2dVVVKkKPVZő#Gfĉ :۷xb󉉉SNseP(V79^` "##Z:vH޽tR Kuuw]^E|2y뭷IIIi mD2 Y&AL&éj a2C5wܹ-_d|{=O\\ܿ=b`޽p֭[KwЁ~w}qttWv޽%KT*k>i&L8~J@@&7xå| ُL&/6lO>7%.]>8mbp9iTVHHHfAA믿ҥK888e;[Jd2-)JnʱcZnmMɃk׮ETJC'j5~~~V/hk׮&/_>#;;h\Sg„ 멮f̚5KJhm̙3l۶Vcǎ[^L6l؀`hI*"yfs4<{}7裏r ֬Y-_~%+T* puz=uuuҴM]MzS[[=nnnbk?T*ihh2, m۶}X, EEE֢T6mӴ4z^'''qtt$** FCNNX[[c4.*4kUU999kA@sUhݺ5^OII 555(srakkK^^999TUUQXX(υ  ""ŧ6]-++pssLIOONGqq1FGGGݥLEEeee lmmqqq&M˩N;ՍSRRR" upp@...tASSSCee%iئ2.--EףT*qqqBAAAzwww\#mڴAfgcc X[[7;v^dwwwi}Duu'''ܤEUU& Nvvv( i߅=-544 k]Xv-L>]*ѣGKCKXXX,***p2s!d:\(--jkk[nArss|Pѣ0{l[_|Q-[{{{O3gpaAرc`gg'lٲE6m$[pttC fqӦM|||;;;A »+zaǎ0c {,[رc krJaN .J% ;vN<L&0c !..N(..ŋ AAA2ƍ¢E^BCC FQxN',[LAX,޽{ K.ByyOZV>}zA0˅Ν; N|}}GyD x{{ }fΜ) :N^}ULX,BjjC .w}͛, a͚5Brr" >>>¤I d2 7nϟ/ :Npvv|I!>>^ׯ`4[0|pAR ¬Y___t"B߾}˗/ &I8{o Z7::ZXfPUU% 8PyS:tPWW'޽[xG//f~zbO?-:Nd!??_AHKKƌ#Hײcǎ–-[" +Wbbb'''AIBAa˖-c=&УG!++"1L¶mۄLaӦMtM7&S0L ln*k֬kkkaȑByyPTT$Ls!***X,,ZB^{59q+Vo"Ө/Ү];Xl-s DQŋ|<ӇbymƸquOvɔ)Sh׮Ge…\ti*pwܹsW^!22dxzɄ h۶m#i$"vvv_?ѣGcoo5jQQQ׳sNV\Inxزe %%% accôiӰ!11L[~4c4oo;v`ٳg>>>,XAسg}]tk׮޽3|)((`…|$%%QPP =/]kkkΝ;ǢEhӦ aaa={˗Orr2666޽,uHHH %%///i,ƍG`` ;wdŜ:u 222/4hTUUoh"\.\Hnn.Gݻ9uM:ҿJJJعs'ٱo>>c.]#/_f<#уׯk_ӳgO.]Lll,3f@TˉeȐ!\p={0uT:wLff&se۶m,J%ߔ#RWWGyy9RkB@ӡR! dQTddd0k,FyFJdrvU%99{6vʹnݚɓ'Kuu5.]bƍTVVCff&/=666DGGs VZŰaÀƛbdff2vXܹ37n`->ڵkT*С:s9jkk@k8::֭[)..nvsE|||EQZF'EJRRRx7ի> ^^^RPArr2ZVKYY{eϞ=;XRRR4iVVV:t///ñbȑ 2uuu\rVZѵkW֭7o&&&Fqrrbԩ4둑>}Çի?!0D||<6m⩧Ӝ:u~pc˖-lܸ &L஻Bѐ={nc>NA^z1h  dٲe\~Z--SO4N1l21L( |Az聽=| >\*ٰa'Nɉ^z1n80888j*<4 tM t:())!&&L&ެ\ݻ-w}7DEE%oe004Di\`0`ggGپ}w}7NNNNu7_&?HGQQW\eP"":trTohh@VK7K7KWWW.i 999h4:t 22QyԍJ"::6mڰpBZnMbb"ZR^( UΎX,?E7n;PZZZFI9)fV^?b+++jjjf<={`0`$n@Nػw/#F !!@bbbh׮X^RPTRĩS ̙Caa!J;;;F#FWRRR޽{ٷo`ccCAACMMOT*VVV`ooB@VV@vv6(@xx8jRɕ+W 33L&j///F˗9|0%%%=zbAVӹsg\\\xw 㮻" d, W^۷~zz=۷cΜ9tԉHBCCؠT*oJQl\rƏ /@^^/lßd3AAABѸﭒ*T)dXt?&^TJO[)VJMP(h۶--ɓm6򈌌>F>hJmZM7%%$CMM уgyfV%22kkk:D]]DEEakkl[t }ݜ9s#Gn:lll={6ݺuCTbkkY[[LII T*z!Bb4:\QQcƌE ^0Һ1Fe5-j)Hh4hZ 4s}}= t:) Yh\+++=JJJP(9h3LqYfΜ^cǎDEEѾ}{RSSƀk׮,Z3gΐƍΦO><Ȅ %t:lmmX,<x{{syN:ѣG),,dʔ)L<7'6%KEQlLmJzV6lJZ6LX[[{L&]8880a @mm-+ӴnAAlXzoZZۛfd'm999TVV2j(FAuu5~)W\tJ?III888p-ZDNAh۶-X,]믿Θ1cۛnݺٳgqrrM6UigvJ~((( //iӦAtt4&ݻ4hRUUUqU,ŋ̜9/BJdee'\\r4bccARk.T*j,Yױ!44Ȏ;.Wj*lmmquuudggsyjjj8}eWTTЩS'= 444`2HMMɓ?ٮ];ٹsg[|9999bcZxyyakkˍ7X,hd<\xWWW@ףhhӦ |oyG\&(ʟ|dbJRj g7믿Ã\lllX`>+ ٳg3o<[<==)++Fsӓ=Ce <0z*QQQ$&&rԩZJ 4HӿE17kZXt)Kۡ,hhh@0p@6mļy󈋋cʔ)ݻ`z.]HYXXAAA8رcٺu+FZtؑ=z`+||||2ИB#GDTb6)--%U IDAT66޽{o9sٙ2Z- ,@ѣYlk֬ё||||;v,666$''eƌ?Vt7Mת)ٙdv]wEPP4ĉƀeRmӨ~Z: )AʊC޽9t萴(3شi{/۷ogȐ!P^^NNNٙ={ңGfΜɂ PҩS' @Yh={$(("4iү&\ݛ:0`ڴiCmm-zӧJii)> ͛73o>1 [[[ёdٱc7% Omm- '''}QV^yGزe ۶mĉxyyѭ[7u&%*  (($5 \f)NoM߾}9qzロ{F#jxb~mnܸAbb"}B?LXX;wRYSw=/III8p"F͐!C.,YBjj*ǎΎRVV| 7uIѶm[E.]P\\,`uVgժUܹ ի{l6c2 R Fða a׮]\pA:ۣhO?TUUO0bl… 1ݛT.]DTT111R/-b߾}?~Z4h3zh"""ؿ?W^sٓRt,Q֖UVk.:D`` ĠT*OhӦ FBl>|8Ү]f\w"2Ԕd2ﮩɓL>Yf1bĈz=>(RLg#d2`0pB݋5ѿ{+8D&fcǎ=CHHH]#* 777lllFd?`P{f.\b!""OhnEJd2L&PZ&d2AJd2L&D&d2AJd2L&D&d2AJd2L&D&d2AJd2L&D&d2AJd2L&D&d2AJd2L&D&d2AbAE@lI&EPیL&=&"FrLct:; EM2Lv9(Éh4f3J{&X,r-n\+NdJn)q\HaACmM;hHNte2WAckkCtlN.nr.ŸRSrL&;bi&_/L{L&+,,ѣ_#\tʖmuuu$J*l¾}Ez}f͚EEEEmFɓ'rʹHii)SLaǎw}L2O_[AIii).K, #G'p[ y8sm {n7|۵wJC u*RZk6`snFc0xg9|^L&^~e֬YlnbX8}4#;;w׶RprrBնihh`ܹRf\]])//M_c4)//wM W^ή)NG~~{GQHMMm?RQQʕ+kgd"??kk떛oIEVZŎ;Zn-frΟOVڭ~͙`ڥ3e#ߴ-dÖ]~o%8k/4Lx) k,_~ew:puu2j DTѯE+++1po a 2dw7;wgϞ߿%KCVVf4|I|}}dȐ!\pºuԩ&MQAѫW/x oΐ!C=z4>bPRR'|Bhh(>>> 4KdɓL>Сk֬Cľ}Xh9s k׮ٶm555L0z! zh!QpwuͷBќE0S_gJj44 E,'TQ]chl1բ u bck6pSS`FT[S]PRkKNth_O XMfz5Dr ZOm}­OW bAe2LFՕRRRJe2-4PRZFm]ՕQ^YM]Yh1Sr* X[kQ(~(وRJK˩1`4 +" j 3,X<t[JKK1ccǎʕ+t:֬YСCٴiFK߾}IMM%(( 6Æ ٙ>}`eeڵk>|8ׯÃtƌôiڵkL6lL&S`F;qqq<裸rAz!/_. ?C~a hhh5kpssܹsL01cPVVsZ2 ڵ{???ƍbaڵ :lmmIMMeԨQ{f{|CC#̜9SZZyxW#;;c2{l]Fee%o={LJJ #F`ո;w.&Lyי0a3f>LAA3f_#S$!! 0sLyghժ{_FƍlfӦMtޝsSUUʕ+9<^gѸqLV{e…̘1`&OLpp0L8???f̘^gʕdffҳgO4 O%R[UìZ5'\hptegbMg'H?w:[{gҜe磏̥WՠTk ̦jc 7*L{"wc+x~JXl1*Ο>ڵy(3^ }tqQm&c?5zյc@"zq{s(Zoh(/[yW(*p 䩗2d x:SƐF{jr Kupc36~8m]499){NRcC>_(RYdB&'v׶y|nbAߑyvcvn~"fAl۶UVF… $zK,Y¾}FE9u7=oMLL Ch4w;Cxx8 Ń>Ȯ]5j/SNeʕDGGs1͛GPP&.]pQCǎoj Eii4J%VVVQVVƁ 6GQYY)R7NCVeZ-7n`ܹ|wL:,6nȋ/رc[vŸӳgOeذaЀRdܹ{{{{Hff&111;vݻ3vX1|?~}T&ZVٳgyWӧSNˋ\.\Ș1c8q"dKƏ]wE]]Ncǎi&CPPYYYL&Yb...(JLҥKyg9~8YYY|g}t:z=[?'رcnݚw}oGQXXBŅJV\I^Pդn:MƫBլ,~sP@DD` ##GGG͛=*aÆѥKSҳgORRRظq#8p?;;;F#m۶ʊH Kسg#G䭷BV3b^y֭[b`0̙3ILLw >" aaa8::@׮]EBy/00Apww筷ޢ@^xz=:8Ah1S]pA7&U;Xy}Ĉx/ .Z3ɴQxKkm#b8jʳٸv_nHCY|t N: ̌:?4Vvs߁ld@2 L|m:>>|)Fi|pwu"ϋ3G0{K `3tj/f;%: 2ڂOh3vCoֱjCaXR>z{r'|鈩 K.B/6d7C֩,&JϦ+5vǾ6~_ wvfhPƍ*- ֤֡]O=z9ǿZΟ?O}}='N _V yyyTTT4F Nkxڔ.?鄄w^f3j+Wٳg@s}tS@r+(ru.^HQQG%-- h̛S*#Ю];ƎڵkW^GZEQ5 @Xz5}%;𪪴a{{ )A@FG"cc,_A23(̠"ΌB BIBHHH齜~I(Q_}_W~$k^YOYg̙w:sL<---=!$HXXgΜ'OzLQmBu顦CYtrҵkW||icj(,,c$I|v-W_}^i&v̙3 ??믱lf(--z֭[8y$UUU<r1l0fgLL6>kRRRBll,qqq3d"11?*),,$$$2TUE`@$FEn0!8z(FqyƉCBɅԩS:uwyQBf'*&>>W^y?3gzl455uIii)6r0 2vXVZ,NGNN?~&E93YgfĈo>z'XQ$Ih4!/q V3 W DvZ@Fa:A9s%kfU}P6z'%3~$&㮮}PPOOqh~>4bوA't>3Sy07.7^zb(/.eϖ/bXo 2q#+-r6aKPqj:pտ3ŵ#1_ ;`WQ&̤)1o^1W]2,Cdw$IL&GLL b;brQ]]^= UUbƍ8p&NLPZZ$)) Eبol/!Z1.CF0 9,{5b+28Noll u1bd2a6:u*SN%((}ѣGR;3|V\ڵk4hǏ'88n IDAT9s1b,c6q:8p#ڵkٶmǏ+BKK N-UU vsl6]B***tb RSS>}:)))#rwep\.͞ !hjjArJ~;<~$1߿#,\{g0 EA}}G%+ۍ/`ʕ$%%1o<1o޼:b4a˖-۷SSOpBLrfIf`(jf .LnYQT弁7R~*5_"&_;'N eh$KwsA$NUE(*mUB淧Nm mY~Z$ YP틇 o7}mV YPT 7.~LfS&z;8PdYס>FEښVƥ0q:RUUC=?\.Wl߉,DDD ==HX,|̟?.$E!JDdd$qqq9rٌ7f;w#m6l2Fwʕ+IOO\4p7NGssVӰ0dYfyQSj%!!8jdYfʕ8N^'==su/a… >>8/_Nss3}S,xjgEa„ ȫ*N'vܑ#G=z4QQQrW2w\NJhhGtQ:%fĉPQrrr:kVkM$I_͙3g0͘fK/DXX3|pfϞO?W_}-ҹ0DEEMff&7x#HZZOh[o%&&Nӧ=O:t3x`fϞ$`N>Umss\|J~`2p8ȲL@@Ak1ODvbvWp)]MtMmv>UNyM=9[=YƄ)S 9eXq6}+ǂνfS &[ZFl%8uO!^K sc1ePR,9pQl#X}(̐ua0%̮Zr J]t$Ѵ..+"r+%ءldbشiw}[*2^^^=zCٳYx1O>$cǎ%;;e˖1|p)((\mFFvO>'^xqȪUBpUWrؼy3 +Brr2rYСCݛX$||| cڵ®]8y$W\qzHjj*?ӧOGƍZٳwDrr2aaa,Z 9x ń]Pxj_+>̾}x,^suq7{ywɚ5kxFe8p 6mbӣ6!`ӦM!oNJm5"47Qqͤgġ_So1 1[-YKT\?^1~${￁>۹}8ţ0㪯 ~̶X}CfQk}rexS\͟{ez!)[DrumޏX e`Mi3IqI2|$OG=^Ą#~T"p/& mj>L=JP0ޟov{Zdj և@Dq5~$kQ`z)hd׮]RVV8s uuuzP,[,q5 2-bҥff̘M7݄lnʼy:[e;w֭[8q"et: ~mz-&NH\\L<G}>s(z嗩^pOIxx8W_}5/oח9s0k,֬Yꫯ&##իWn:t:<7={r8|0Æ ͛7O{ٸq'LG꫼\x{{kVwpBh").F% !xEXXÆ ;w ,hllrb˖-bԩ_DEE|P`-ų>+"""Č3DIII}_NhiiMj?Ka}DϤ"2:FGDH#FfqN&^z~1x`=9atqQ] ZDcm=Y<=b~kb1p8KKDuK=McbAwAbx͏DssJ"^Ç1[DŤNJj" 5K^F I)'˄j[ɽŬ^5uuQ)n7boo?y'Deyp\v -l͵Q{ ///,Beg"kj1e`c_1kNV"\g}3ƊRvė+*F6pLvܙ"$_{}CiE>bۄ-Z䦭'|_ [\QouWKx%^l7zg)&>Oo*u5՞oimin48QUU%Daa(//VSvII< "??_TTT!p:R?~\TWW %\.hllgϞ'OgΜr EQDssr/FII8q(++CѶVQTT$=i"77W444xޣE抒(l\dggJt:=*E~~(..N .EMMMDӧO O,$nNp8Dii())C֊ݻw"qYQ^^. ѣ< iݷ\QZ6yNdff*(J~uuurS򷴶VQQQ! }qIQRR";mssxźuDkk'A:uJ֊JQTT$Dmm~mOo6Cz{ڿLl6QUU%DKK~!ھIuu*Q__//7$!=@5~rh}Q/_˔ *XtpaHSuΉu#IWfΜ9y睘L&yXh]w2 ]NJUUGO>nݺu~Tg9r44444~qTUeĉz뭬_;v騩!))#Gjh ݼy'4駟z=8 cǎwޗ(707N4󍆆nOq4~~.qC7% n|q8(JCCCǠ %>I%|T_|}ƏA)q8lu: EQp~~M(иLЎPqY %PqY %PqY %PqY %PqY %PqY %~l6d $IꜤ+GUUL^^m5444~I4G8vt:]$_1. UMe7@44444~!4DCCCCCCGoill$::__QU[(TsH:Y!˚l롦jBBB P"L&xyyu~6v;ݻw@EEDFFvN Vfl6QQQLΏhh$`DUU֯_իyw+{Lq\`Z&,,WaBcc lC_a j?8 _4ꪨCQ4."//Jn&##wyS$ފSVVPrϧ.]f#''Y޽;>>>]6rw[ofڴi~E!55T233Yb:u M\\s6 ŏFLl6[DKK sԩS!͟'JJJ:=}rߏDOBrs1?acÿ>oGEs:*^u^.Tᢪ3eմ؜5~f^|fTUE$T !ZW5k裏 ˗_~gy)pr:'$&==шz)m7v׿5\eee<8ڼs1pXVf!j",g\.\X4hlf49~>[եpsٚhmjЯVR}:yq|̝9B⼍v ̙3wNxyyhFL&\kJXX˖-gђ\IYY ෿-TUUaX D9ƏJjjjxȠ{;Aͳ>Kjj*[nbp8ꫯسg7t,Yʋ/Hff&|?~'x~7444AZZۗɓ'ӭ[7t:~)`呞 n@Q֮]֭[{k׮_翦]t) f0 JeFdI EQXj2d^^^kTUU#tRjjj_999l޼,9r$W^yǔZQQ-[8rn}rUWySRR֭۹MUVGO< /`0§~JZZ~~~L0A֒ʡChmmeL0hA3. ŢE8z(ÇgҤIGyWjd;Ƌ/Yr%yyyKRRlݺSo>}1b466s?΋/ȨQ嫯ԩS\y啌7=zm lBCCW^y%!!!|xL4C;Ep88vgLՋFImm-k֬f`Ν˪U1Ȳ}G׮]=TMM ѣG{n233o~7̞={ضm ;!C'OW_E=z4 Ϗ*.yאezy***xl۶lF# b$$$*MMMov~anJDD'}ڴizx)))O>#2{YرcO>!%%*xRSS@UUVZE^֭y ͨQhjj/dŊٓ|[WCKK PRRB^ Gp8ӧcPU+VҥKիW|r BlBYz5QQQ6/// 9}O<_|ADDz>Vtf?Njj*@]]5k1LX^xI aڵc9,]ƪUxq\{n,Y“O>wAbb"HĀ gϞ`XHJJ:O`0|ҥK ͛7a233>7x88Yhii!$$۷d͛#<8qdm>וydeenw_vkaXX,|Wl޼}^4~~~~ I!++#G0l0.]^t(G-*rP^zu]ǔ)S>|8W^y%C [o%99B.\Ȝ9s(,,$;;,׿p8p:vYn7o?GQlق^gܹ:tTbcc} ao`׮պi<$4OTa-ayO;qs_9&bAҊ\t=L `p(rq$߄,X}\ L'Z;D IDATHPUx'˂l{f#ggYE@T=CnpЬq۪QmVȠSpp>>ݻZK;ƍٽ{7{%## jn76~ٽ{7eeeP:kOUU;v,ƍ#::[nCknfX~=>)˖-c߾}|8OzN˗/'77cǎuhqtҥ9}BrssӟġCسg:ddd*pJKK ˗_m6͛ݻ9u'Od…\e|ITVVrwo>vŎ;>}:֭nɓ'ܹsի_=FbƌL2MfͲeػw/#));ww^O#//j~é%;;lO[oő#G<‘WUUñX,x{{qĉcv;BQp;z?>+PP̠O)R&ę7fx@n]bK 7܀ɓٽ{7vc06m!!!䐙W\Ann.!---?~ܣ~g͚Ŕ)SL&&ͬYk ʶy*IgcIIIAӡ뉉!""ECC,!`0ؿ?wqy6,ŀgǎL:i$Vn7$Q__YOPֹHѣTVVimm%((Iȑ#zhݎbAQx,c4'00UU $11!^^^ FUUz=EEEc-D#(@A¤!h4ӵGHh9ћ-NF7bw?  ꤡŎPNhu7BNNLtcd_wS%'ّQL~ӈ!NPWxNK=cno3U.&s_B7`4|ܨj8UUv^lR bfرL&F#zᇹ[ìY˗tRyᇹ;744l2$.$IoF?N=*˹\%Idj(:7vc/iFy TUɓt ٌ$IPnhP].G6Mɂ !77 VX7ヿ?/&!!*f3uuu_pir\xE!--c5 NBBF,VӧOzyKD׮]q8S!456-Yϰ^ћ@3:a-~ׅء'$+D绰{%|с(x\v37q;-ˎ{v J~=1|uM}K9GfQ܊^ի edff0p@}1uT>#bbb2d999,^iRPPm<ܹUU=&o޼grwb6پ};Э[7zmm-Ǐ'44;ǷbaĈ|G,YI&8{Ǐ3,cXr%555k.L^HLLdÆ 8pٺukdYlO$IdeeqqƌàAyw?~<̘1c`[n[CMNN[l}Э[7v;111lٲɓ'( >|>} ImDׯ`00e, @%<E7|={r,BNC"jWUQ .H= ؝/MȱWűPns,z O_zN&4<;p9g$n^̪_c;A!\9f/=ݑl֖fd]=l,])ϬAQU!|(lpۚ(?[HvIGii)&rS%,`vL6n; CeƘ+T gPu_“`֔b>-|JXDcF!<$A___&LG}K/#F0sL"##9x MMM`FMSS-^W\ދ?&%%M6ޝGUދ3I&ɾ=$@BEE\Ku-^Z^W*UŊ""D "KٷI2};ǘi$! ~xiy:g\u* &LNc֬Y_><>11ŋSXXxM=[na͚5XV󭲲͛7s뭷ryqM7 t~_3rcg1dol6sUW1ydj5,^3g_ ጉ[oeŊ,];}Xlׯg„ p ⋼k(Bbb"7tǏGղyf:円 G ЃZqq1ׯgL&&L̙3yQT1k,>jT*̝;RÙo۷c4Y|y8سgNBB/yGL8 /pv;^{pB:V\ɽK0h4xp玎>pZ p8رcwq=w^B#Ga~Q3'p]wqẼ>CP\\5\Cff&G<\z饘f.\H~~>vv3fxyWPBR,X@FF:[o+W|r f+ɓ'τ3G G=6ƍÇZǓLBBBp a6%>>\EO>AVLaa!H~~>999x^2LZ>u\lڴ$Əϑ#Gd2{J"|@zjioo {h57d()Fj줵!9#HN'6JK҂B艎AU4M1$")2^Vn,hihBc2%^GG, MEQ{i'aII!Bj1c1H4ǢfSh&.ڀNDSRztq;;loFV1'$K{sv\ ѱqhoAk!/+FB[ĔdήnRIKK ]sqqq= uuu`ǎ7޽{1 h줱o9tyA(k}vHJJNHOOp8hllNTUU1l0z --j0 6 шᠡNdY_LL `rrssX,ȲLuu5{%//FvftX,t:Ռ=Hgg'8 Ԙ7%%%i[yy9san7#F **`0e„ Ʋp4@II O=/BO.555TTT?KKK MMMvfsjPzoBEGGvillxvsA|> |fHDkk+555HtXV$66ЇvVhz466RZZZjЀBRa2HMM%..ԏ㡩 Պ%..q™ӯB*UV.]{=iXp츮9ѰȿOEOA (-II'Sk( EAA:f;mځAEku{?Qih`L%^{-QmF.D8z<[d#E'ZHFox9xN4x"ՓyFNsY']ӿ;|̙3|DSS/f79*X2N{Ӳ#f]N_F8:NCg|Oá7o"E}:T*'moԻ 7:UZSqm=bm574Bk*k(~ EyJ{i4tP:pvxt9"˟h"EN'&r|D?08\VO"9M"kSrꫯrea2`00}t,KĔ!=-Dtg)AJa@hC$I[A>A9. li Cͯ]+ 4ye"p7guPvYd ƍo穧rpB "v;Wnv~.]ʴizLee%'OfϞ=477@ff&(rl6z>HDGGv&%%Df3V/Cz --nnV$**trss477(8hnnFeJJJ+餮.qqq䐘ݻq\ 4{b67nSXXHQQQ5(ic,ngWx+Pd WRPԨ5jT*.g;eAP@UzPit*NgKPA P @Z r ZGU#A`YVZFFRA V71&*շ>Ē_IȊ@E  C۠RѨաJQH$ 9$(˨՚v ™ 2.z233fVbذa477ЧDΤ>%vZ^ynV^~eh4pw0}tyxq:T*RRRXl?IIIaL&.r^xV+QQQ̛7^fcٲe׳n:n6***կ~SO=j%::2 #k׮nW_OSXf ?0mmmt:ʝwܹsZ,Z+*><@ZZZj%uVV\ɶmp\Ȳy'5jTx; o&?x)++cʕ/Vˈ#`0 I^UV/R[[d21gn6ygؼy3swޡgy?^ALk]\tr~ra).tvb zPdښk3]t srLWiϦZ̟7U~mY3<Ä7j؄4v>Qi NDF\rƣ׈pz)B j~:JbI#Gp8OxGe۶m|8k֬{%;;`0kƍ1cFUV( < 9r7TUUNbbbؾ};_~9?),,<*Kxطo}wu%%%|wXz먠 11JVp?tnrssٻw/?8@yy9o&SLaܹȲ_C=DQQ;/Ke֬YPXXx:N' lkDhkl&Eрthp;lw2Ymbs`o9F l?eysė.b0I뭼W-&CѻjxT<Pd̹ŨdwFk4ikm'yxnӁTsoVlN|{_>`J2UvoMU q8 Oqŏ/"%-逇QGlfmfEXz͏IAp~j5qqqnjINN*oA8[+(Ѝx޼y̚5 Yj_6o&^K***3f 믿c;~?K,aĉ|>N'6l@ 믿Θ1c6l68)//gĈ,\Rx &4ir <]tUǨj aȑS ՝$Iܹz.,Yhdʔ)޽5k֐Ț5k8x \r ZEaa!FիWsWe/+2ϟ_ֱT%P6[cb$&MzfiH* 9XrRL )$&;XӼe ~41&T\}E_R yԒf`?z_5bd6Z?jJfE p$x9ki@aÆ!IFFV(|w:tV˪U8tIII j5j./SYYICC^7`puJ$HAA˗ɓϧ9 |z ™!JŰaÐe{RYY`|rUCڊ(h4fs8#h4>]z7g0gFCfj0|i$98|h{v$::ackijvQ$ʿ˯7l$f#Z)Xt<ėZptPUcf@7VKH* &1d=~dFvW6tgKkf"omp]3R`@"sX I5ҩH3n h=LNp҂V%8NVj:tD$©e@ @TTJw+Fs~P~ 111aJj|>_W港̺nn7SN׿5~-:!%Ibh4n6m%%%k׮RNDa0Xd ۷]vvZ*++Yd "'BO )ěA[Xp4V*hPddY\Z^z(c'bGq=DEG} d{:pzdskQ+fmq IZ$jP}sپq8sxǙ t]7~? )JELL QQQ"(9M\tZXZZlܸ˗#IR8hZ ?pitƳcǎ%i&|I>N'9O>$\s xcN-fg$I⪫b…L&.]ʺu#'B)n7555ᆨ@pXࣨIp\r-j?ucǎ=mpb%(l̛7~Պl>!C0 (fΜɫ~;RRRca4$ RRRn4V]]MMM @ Ы|ss3s555Z#F`P7z(--ERn:ƎKJJ d֭T*=z4u1h bccOYv-O>qQe9BSSdggG# `ѺЫnCk%Y9hooIHKy?|QNJF#`#bL$%8tm4~+vo$rt;HBGF0:5)1zjp}3qr(#"iDE6ᨴ S\em# ;*&_t67tfत,d9QKK q/E0DQJKKÙ]ST ׯDVh:[ZZ?zq\,Z28|0---ήyAڐ$ZHIIA}$)`WQ\\?۶mcPr-瓓CRR\r ƍnֆ(KqE4 ŋy?>tvvɲe˰X,5* :ԞE$y衇xS\\Jɓ'h"~i^z%4 L0. Z0uM<wy'֭cŊF}e(~c2aq`njb.(J Je`\6~gkh:N4A?j39( A_Lqq[^Wa)4[QN,$!t:Ԫn w^x>/AUC\CoIgHVcpyn\o(*ǛDPkbhDҷz=EŅŮ̹fƍ@9BU- JV9jDǗ DFQ%|-NMM WOa幬WBIl\p8N t\.NdBb6y뭷NEE)Ǭ,fs8 q\̞=YtJLL yyy( ~?zzp:̞=ǃ#//lذ{ĉ))) wzjvÇ)..f4443zL<>Y`C a9r4ƏӑP3f$I̚5+@3gp8 JJJ$-GO'9TUKCK6 gQ~G哢h.KhwՌnGmG.ƒ=qjm%>] \Ŀ'dR] ^Vkh9Q@N&tJSۊ|]@,q(|;))^DjGs[WFgcƌi e9ޓ׻۪&FOaO~H0 1g (%<hr6 Frr2z0pυ#X8'te΅]/ G@[aE 5j|v%\E.}l#s<}dw}BtZhT*6 ITTTkWxW{ZDP"DPrjC K$@ JkT߿zq:x< n`0VEӅ ~;ѦDNqZ gBWl׿ ] I _R^[832}.n"S"A/D=]tN55ρOw:"?4P䶝$ڙNgb[O2N8]tA8 sA+ "ˡ/+.zB-t*7 ; }t(:aޖ9v"ЫquFްOv+]}з}']n1e ̜ ng ѣG3u~&P]]G}DQQEzgxl$&&JAA\t|(gRRR{a۷%v{t:9ߒ:~j5=\> A o /wy{b&}Օ}Yf ^#FD9)Yijj/g(BnnnóBڕJUOc|>СC,]>$̦M8z:$lnL}}=g>勮J;c$%%˻ヒZ&???xI^gڴi Yp\TVVRXXHbb"V,"6qqq\z饸n***"GN墶 .`j5\pv]v'`0W@ڵk9rd# cDzdbcc# '+ toe?>7t#F 11_~~^ضoիQ /Z?~n~ 6n:j5\s F"==_lذ[2}~Uر8Nf̘… oYf ,^nvZn݊oSz+ 0V^촊#..rZ+I|q9BRRҀ eݎNYyfȐ!}(\._~%pyo߾"b0k>|8l߾wy2FY\8D3tPbccX,3m4RRRh47kt:O1ehll'rJ6nȊ+7o^.\f͚dkr뭷ѣٲe dgL2FØ1cعs'=sΥ|z)w_Ʉf#&&2F`.\xʍ2V6{u]ñX,@Hd۹9r$7|3+444lVTT#w^>soN||YIKKwDQ8q"ͣvL&)CtL0!t3P\\c=W_͞={0dYfΝ޽kע( NI0L>ՙ/IDATN$**c3p%P^^N}}=}H #W]u?p8̚5o1?x~b-ImYoˊ+뮻6lO?4SNꫯؼy3:~;ϊ+mԐ͡C4iQZ3grc4m[{r0LOY ॗ^b߾} <`0Ve̙tL6?2OQQQ]uILL$111!C3tPq~_SOdz>ː!C" '!:O` RՂ ݝ i  @%  DP" YA%  DP" YA%  ˘ 5@IENDB`fotocx/images/permissions.png0000664000175000017500000010707015247006660015363 0ustar micomicoPNG  IHDRtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 247 277 1 0 U{:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:277 height:247|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:249 height:222|͍ IDATx}exUɶn\C<]B !hиӸ{4$ In]vܠ77k $tY?[{/)FYjkk뫍/|a}aEEEuUUU^6h TTTp7;UD]? B/˵X'/--)#!''ܑg: 77+~s`|WVVƵ-??6rAG[ , pb`ffgg~و@yIQ>_gM@i7~AiItvv E k3epWāCf\D;[6޼쒲KcMj,݅k737FsQPϱ{F۴ f27]8{Ş>T'6@0Sf t_pyV3`̙ o?f̘Sbi2?!d*bPiO4`aEiia /\v'MV >/& ?5&,\ЄTt޹ |g1=?L#1M)=`c@ ,#{Sff63K;m\@ 1l  4~-+ۯt,fo f(D=SxBf`O`*CQQ (*@MSgXk=١rم 䂊\\:RCb7ʩu-Ooϟcfvv,޶Y<>mL w.듑y|wS?䕕]e2wk׮Xr#@P[LD % e48:`DuK〝{ ,^7CH&jAMMK⩫;\?3@QA~ $l͎v A| cE SJTԀ-t~O;gEiJV[-v~;qWv.vLX^L*?a~3-жl)Ç}b i…]ֵ7ڜձ+"!9•!-,,,^iHt=UY~ms,N\[SuV_>Kyo`h=HARf$q-Ҳxdaxu : .! 4J*zXqGėTX>g"TG`$5 t~OE֎Cm+cСӧᾫ/߻ #m(@^VC8y6XmPTt.dI@ Dfu- cu,(Hc 'sA#;= 6,H) j.!7Nl>Wq3<5uu(-0u.e!#-8ps2Hƚ +9YHKIC\R*:f8Ae# "%pT!6t:螶s$f>׺ VZϿW'nJUt}7n8tGq%M)_z^Ge@O 72B1+,AMu1,0Goi /C]]-|C )--4DL/C~qg'EGH`9iBD?6&(*`١H*EN7iClp~ GA9SgA^b80AM/?DUu@ 񨩭) )Y21e$ aQB(5.V4ȑ̴ 1rCڜ;wbܸqػw/lOw!00=63w./QFȈ!Al&܂cX#6\=K֣6CIY3=H;*AjvK&jRZX&8e= jQwsJ6[Dm0R\{FSsO-tgI|:\\!wcH+~t 2_`1*1Tl M Ȏn+PdDbl **`]syps$gaس 40Nyר"+ㅫ+ޠ1ObZ"QVU -#qV+a@;lY0 W2Chn SCqxEda3ԂsC5 >Χ+' 3Kd!~^pX]iޜc|y? ?3s|X{sARRR= ksW L0olݺ'OƨQoB`TGA~ 5:Lmq-lo]ā560$`*.OBZ ):6 2abn1{)^E^l0 lo֭8{h#C^w.>As Wןj׷[ r )ا格 N-˵GJsd9]À0})g}n@v`HIF]hi@nhYu&r{9\mq!3=r=(5SU(AkjC&!əi| QKZVkbۻ__Q+9Mi1_рUY5m R3-}U_,?t)9A=шZ$a`hc#h($Hki]'u x9 J4߇j< b.ȻGe5|p2>t4!+-sRλZT>ҪP CUl0{-'!F UuBFIqdi":wNRwG-{SNWv<,܇  { 싯 `NطA$v /4rЏ↫LbC,M^^WGIQK(f|s:WD(%!eEhF ePY6@YAc,03P>O8MDhwtTGBK-5%LY ]oYK4ń%S=HKBp,l_us9]AƺO:\CdT`5oVX s#M Ū]GQXϞkDNJ$N] )xLM_y/":ȡL߿?E2 3aؠfϋFq0%&"+%Ϧ U?t'wrIˬ#R O<&J&|n TsmYLZQB&kKAoB2 o"@ V/9٩w!tՁS(B7I~>C`P0^$$AbJkzN2&A8Ңӂ}(/؆(AT/kC+1DxF"_#2"z8n .:?1t AӻXf3W=QG,?,1iֈj{qسu5Ǝ cL5;gThOyeY8L̢ -Ʈ1b,LLL1c"xFA[G/b,K2{L0q%.9)رb66܌a8sb1t+$ER`cXLwi`GMnLv$&~Щc7 %öD]*9:P5q#Csꛛ\32#@g8s Ӌ:-lwcCVr1,Xz[Yf$$NվG1xp  9a8t4,GLhphD1XRS30~Dݻw2[:("҆n>6,},>!y jk>UdNg=R;=A 3@P1ppYG0e6$qTa P3"ٓf%cy|oZ/K:^2dTG!XTX>幩8{f_kw f81I 4}i ߭co<{á?q*.Ό&PK .i6Kp^L% $g3*It&T` '#JbpJDCdطi!'Qhjk}Ynp둼8W@U#Ǣl țp-IQF!9 F\y-@ ? ~g8 L@,=|CGA|#IQ5WD5,:0 SgVY`͈-(@LC]*zB|J8[D܂A2Esźjb(%T ix? CnL@`& dԖ:8r)W!OTCO_G^U-ז4Lєv@EIafH2eF8"??5cJ+$ _rn6xX*eX_` u3݁dxG=n)om{4rrgxD~NXQ '"!1AxQ{ri.AKs:6,ZS2q\J 󻭡< o8ӿ/ {`>o ~j$M y#'剻[[W|CKh2グp*8wl7 SiBܹ$Uq{9vyT5({e!eӶsQf;l2kȷ%VхP;n:QQS/x-7kP]|ݧ?$e #+G=Öژl\ۂp!Z@P z6l(ۿi:va,ɏi)fa38Xh麺X5A_ES#3%``1AS, i&)E&sٍäE χ";^vyU{1mVKS#%WܱŪLvCY_T7lsh05P|d?lg{&FMvl$+)gl6A1]okks]390 i, IDAT'B:q}m%>8(kMu3.C$qSٵ/=kB߽mB᜼[îus 3.()-!~TҊJ7 M6DP}6О4eyY94-j_ FQii* Rs-9ț`]'Դ86Usi+ML 7T A\Dmln,å6C+/|[j-k+! N嗷x|edN{kQz6Yl *,Ja1~"6w@f ]zݱ;[8'o{V aHجBpz߾,+fmv9>h:8_FӇ?%9bCdш'F:ZrNU`VRMAк*no?$$!sKK9uʂ8}&= 3pp>jbaSO 9iZ{bE9Ixpf1e$!ڢNuw͇v [jk?')|"<|ᅨp$rJ1n:iР@8Y:SvGxx8#bPI}\7PI6KD5~A86P%xcXW&G‘MP yӱK(kBqk\x7]he%L] q~1)HIMA0MC#P \)˃{86Rdsmtw49ta8o 3[#;֔e-ղu~^>>󁇋vyO>5_\ga?4*G >>0'?եsk@S'O43aˑȩBEAk1Tŕ|!m0+1u A\R7Ca5iiJ˭ aἙh9 C`1* ̻>UOSVEbizf;g=#m)σ0ѧ ?z) 20:A(ZWUFo2fִ$U8;NEtάs1PNϼ<pKhH c=FmZfwӈ¬$:ct 3Rц&FcՎOy^w+pz^N~F<ܞ?A,λP[@wxZZ #G?#\^#!5B0N_z2T[0aJx&88㙋77";=^x~1 nhøM-ym&quy!ƒ|8'Oi 47V!>&TvՉ% 4Em^с oP(JɎH!~xLcy=wuCRzvk잊j|CIS68;TG:>:qչFh1U "O]=ɭ>bqƖr[UY>YD/NqEiL =uI岍A/M˚]mZ=ALSx2m"VۄGV^sS ^x"!j,ٞZ[%f1j^_/_$ZAp{.=%+,uؽ[ d&Hu}?;td-Ke˦}ANVA{yy|i}9r~/iZoO--,_ Ӿp~W0SQ? ) 6>6 5{2 ȋ L_ѥ$RtJHN @NNܲ(D@‚gzYi)3G%,znn.w,򸼊P\\̝ϧsR@)zgywUաʢYNVˇ%V{a,Q^9zg(֮X|*~ŕEY9\zqE|&Cv>EL&²*v -*-{@) ⬫t{xDg<-9:SԔd 6&YF~&&"<O|)x(]ONJDDkR ĄauO:#:*^^WB(CHH(\Yq1pw {buJ^/Wk Z*+aYYP*'8(+E`ude! +3feXܾȈ:zѝemEmcm򣣣:el``:U$LT !yR)Fmu5yTnB,D? B(3j~(C#i-RO IdQ)AyRt;6?A3 P -9yˠNBCA .xMEAޅPDZ9E\aZ eZOT AަE}y96JMKLəRڷwVIꓗk* /G(zo!y,]a~.993Oͣxm%(.)W:3N u *sE+pw# /VӲH.-}p#e-|ŵ-%V=OK=Bu b]j C *{E >o?"7ѳ\>DTWU.seOK?\g OMN WW4*~"+/+AAN6dPzZrUk9YD.,=HW>~S Ȁ?#!.!bbpP[ˇC\epHdqb}Yq1>}=|U7@_ʐ&ni ,95S]U1E> yi %|5]h2N67|{AKKj~jb@DZi'? #y0Ӆ&|^n3Pb!FAZVR0?AZTʑP IN^+).|>f 1sX m>?i=Ϝ<_8w{:MU)l=ye"ްRX>@2􄍹V:\XaIFPK~/Kǝ}7~I{u $tX z?fІ$7: k(xGȯiDڃ Jtc9D/rY|^Xj(U#>H`{*Q!/AGC;/;NKsTMc[";,xg}GܸqNl!zjx<ıp uh3ES]=Yixn#N8X=UZVKܹSH̯ 5m6I("-GrTn%l7yI1|BV 6ԃxM-;j>+Cpy=߯?#-ӌP$$Kv%Jy,EJH. ( 9 )wy"W&[aʢϞ={`aaEt"Lӎ>u)d xw{ fO q%Hwx;ը/-30i1D&fFԫS`>z Oά'p-ke( EfM#UЄˆ@PÔMqQ۷Kw,Ʈ;nSΞc wy9-5t=FT6XLH6בu`? T~`o ]w^(+/} Ͷs& s!'n=%҈ӳ2i`1b2ɋsobpN̙3K.{1hMcXt)f϶ƞWM+$$qU.cʼxV-n@ZN A9y\rBt&lQH1*AirD?{CS("v_} _^0z<fגgK[9V>{,ttuqEǏѣ\:B(敓0`k^3K@i˓E4>8dsa|3Α9u&e L-t5|KiI 1XiK|s ߇ \82wZr )bu{ r;5sBՖv$Lj  Nyw<j23!$"X݇[mWf T-B)g E;V%,W$1vy=Q+bf͓󽄡4U45N>*OU\/2F1l ͽ 3~8yw{jx=FsQ1l:~%z 7BH{K3]~X##ՈGm0e LOt˨37aX-MEli%eYFr50x:Vok(cxl;HHqj j&3#: D$̃+[5yPY-M!9qfL>/%S&%VuQE@n˷}zῦ=֖{mi@kXANʡ9Y&1RãB}0q^b 릅`6˙Qf]sfH~aj"F>VtRe5h> yd7"Y  IV`{^}V,YkS߀[;goApn!==@N ϥ%1u| q9sU($yk*bڭ=XpiI,>4`b+RVcїڮl:d%d%c1P7}Wd!=l J*)>.S1f+@c59Pѱ^2{DY^&7}Jᢗ?cy'Ga\xGT_ [WWDЯ &k 77`)`W 9&88SGb| \ D]u<KP߀1BJ6+w 挕ٸKR-.% 5ra'@bO!Fw-XGqY8F%ԃե-Vb(h*Q]ݛz+A`7`&jxE^a*+EL[q@u*xĝPA㤳P>op%e@IHr hC[m9jkd⥻o~{{K~zr 'T->.3kS5T-5eEH} 9kbQ裊_~5Pk40gˋE;y]k?aS;ʏ֝>xg򮾵>mՑ9; ?:3ȋ;Jums2տ^ѵ淴XWE&l/Lu.&FZ '_Yri'CQ==2W9M.9."$hٲ [!s=mР62!';3('MɃ\wyQ9NtTzn%@]EWg@_o^wџyw!(G :5[/gQYcc"MZ*R[$ENI > g۪M⢣h?,]g`aeESd=zX[(ov/.j:;ՑŕV"XYovՃ .iLv2XY,"]H3X](B ˏ'#*)Z%ziG9 &HI;jnKXc :5 -f$"$T:.)k0BbTDe10uVY^yv.:`?y^Vˇ#*+@bhʛ]KX)(EKK_)LAD. X]L?M.)b(/QYMLfVL }0@XCN!_zҜ ޴=_dWI _B{}j%ecE=cxau8GOx5Xh3 i>td?t]Ϲ%*gBߖ߇S+(Ln6as֣7y x~sqOyyQ}`x >/ܐWQy8$1¢Eay3Rp<{#DptRD >Ao#R$eEO>P?ԁ﹫;[?E~ȁ9>eą#GDGc<|(,CrL;==sKM -ʑN8Ύ{ b2:/(C'IfxD@!CʟQ8e%Ep:=}_HTD-m 򀓓^G3C;ꐘGzU 3h9c [ڞC諒<GM.(ĭ QDec S0TRpI$`69KT L˖a`3ݜ`:f4Q )Ch,?xN P)0FBK= #9c d4pܹX|l&An"6=v"">;Nnh1y&ϴƊUqIxx=1:=~D6Q xVWw:I7RE۟Bq돑F,WϮXUږk#H ZkS(w^w1XҚc$AI^, 1vVȑ" ҄0 )8e(M"8L 7<[PE푁Qxɡ"HSW#7lF[.č./A>ؿx TMfPHCAև0f#?7O@]Vkq!bsKד'm}QM D6y!##@A}D{,џ($s *wN6VA>z2"+ƍjZgoc }.gtS]"5:m*.Y%ѳCD4ʊ(#:ώBC>;7Ε]TUo1 \ fĢ"4"]cR Ɵ9.XsH"\aq'Y@@M1 ?o 2CxO#^\ĻW+J}M31bG3R\ 2?9Y]58;?90U(Y&v *8t)nY:Rh3MR#qaZ/Ɗ 1t-W/OAJZGGÙuimH *ą&Gce$(FD,^T# h+aʈ\Hezd=dQ@OqhI R|a5^f 6s @.ZfO~6tWz~<353޽{86͛ai9b?ۗB3"t< Mٸt|Ĕ HYZYnv &c$CϼPI.@19t+.CIj8WMP( R*#'.5FqTSC=<2}ʑ2ʡT ;8;f€X[D.bB5]CL0cœ UM~ X5g zx>9y!7FEUn"-\rqR{g Z# $idjZ,}qZXuUxvh6u𪊖ZXh5JDiN5z^]WO•+1RA bSy)ib+=q]T^{yyAM/㨌MPTW uo^\hJëL7 FMN_ɬ,Џŗ 6LA=mhF!k=BoC1.|xvq4>U6(ˑ|jXs2PS)⃗qKDJF89)@$c&-ymK0h_Du ~^1l MDJo_F#/W%]4ur*3pvѸ)ع؃% ft2B8"`:~,,L П)Ɏñ!}gRdl_Nw 5$G@ņs"/s!OͤMVBu|#դ1yrei>.01ZQxeh^>3,Oǥ`1v LFzj:'S\ 3OF\% !L_| =z}ߋyjʿ8 'hFvN.m"Su1knA_WX4V&Vz_e|,ewza!$"rl`ol\|ZD(@HJAjmE" qlhqs;c9&8=&H,`%ܔٸtA=#sqĢ۫N vpW~\l6)nDxw폡mf? Ak.>xwiyK ~ȧN 0'c3Vtn&Eȱh2&M>}P?$y$@og, oG0 ,tRB,ܗ#6`q)X >}wiX^i;myȏ2az%y١ >}P>a}##!t꭭Aƃ\6>%84j|2)1 oA1s\h4:?\hmo~U!.:ĺQL"=,%"PAq%lRh|2 8Wk3u*]JDyb@jYEy <\ߒȰ RY~5C~C\|KD R0 žcu<,Y8_Fwb\ v<Zo<+1 OFlظ7i:x~| ^r]w?mE:X$=;ar @K q vn߂ TƖmd>|, ԩC{pΝ&˖{Al!M[V"3؆u; _%>8h 7F3XO-R y{dڼs9TWvH 7ak;|333B|N>wU~{v6<{#YX"DOUZMfpuq5x%mVÃg(-uQ9#^^ ; EMd asb󎷶g<'1D_`)~_C5a0n(Έ=K[ W] U| ˱~V2=exD̋MpPFSqp̑'QtұZЉ,4L,1ug9w?: TvfF*bcP@$Gc:QMƋ bX<]"?3aLSxENN- O/nU!!& CNA\faA.RB}]EџboEk_HqSHxFҞ|ԋ E͸ϊ vMbbr̛?o^KgĄDԫ,zixyTνW~g gyvyV\2] 'M,2w`Фd^23FLQ(VlL"x(b343DA66eh@hMX@ YgH]bI~^{ O G[]k?za@$9^ѣML6w1iMdޟPLㄋ z зo:[hbaiZ&g>tСXb {ry./lN3Sib8-,ъ09BcQTcs !ySz3Vk/d z)|!*#-o_$F.#<.J%my~jˢ1u`2#|dڍrRr~Q$4(b [<)`vͥH WRӀtDZ(^b IF Ber|a71F/q݄aańb/R<<-#d{>"_+bxL[ExO~S;Lѽ,lZ6!8w s5y~VNa Z\|Zd޲L7"E4%ӟ4h'&%Tz䌊@H)1A7~/ģёuAf)z}@p*-}#F~f|}|djB $& 'QpZQE9Hd>Ѵ/+2(siPo_30x>yw` M襁B/N5L`NsB+/LyvCPHLx S־EPya݇C0bDe%?n ,ۀ2o܀TK&)y##k0=:km*'qdi&Aq*qb):M,12`7K RcC3سSMFBm x 3eGqϞ7fL!Й 5L m]̤ui Q)*D8Sa0]`-]&AO"^|r=*_Cutp~d|40r6ZiL IDAT,#3l U[' fj/?Ox@@ +9m x#uז9{0m (gZ/ĝ'^=XQw( Jʒj<}t8{b߾}8v nDˈScp1XA͈%eO55>JL^f *;Cjvw2-Cq)y-D(-k/ X".z%&E3t,c'pdAdDvbHeuLddr48\# ϏIJ&Zf1MF2A5?[UXWM~lmXK$H kS*ZSu5gs7O's*w%V&cs'rW]&6c 6Vv,9-}[amxk;Llq=$uK]b7mϷ~%M@ݲ=l?ǚssvz. Sj˟^Ӳ~l:HƒV (OH_}^ ș9ECyNDpؒh)ڿF96 >Y($.l>}d"&2ηsU ylp@3_.nute\n; %#G#噧tQZRBb6K2O__-b-;I_}L<;r~8L~ Ak.>xw5qV_ Ak.>xwZځ/DZx 5y<ȻxѸ_x 5y<Ȼx-XŋY(l]2kZ I4+c. D5j&Sĝ(jg"ƓSTP/նRa6oyu&jКFἇm<8?f`f#dw螎frKUv6v2" c2ӈ B WS8&`#f,BjEadĎAe233QNV%72DP^UCiB$2H#$eUKk)F7=T4"O _b8Euꐞd<<8 "L,JQGfXT&y[6̤7+,"JeƊBf(?`xK弧KKM%, -iC#-ϧh9#YuݶH3 |⸾h82Q=T,lOepe, QIbf(OӲ!eY-e> Ywp (Ʌ1 TMBvr8, 觨~ĵEAxAVߺˣ c0 < 4` L[`aФI8ADmݡ5prI[*IsyL 9bpul:իM}zAS&7`k }MQUYlN퀪( : @n}1od4[4jJQ\;X NGW+c^v1ww "}`5 .!)3uC[_R @}ւcT6LZN-; ??qam }z{o0y > j 4N/8}(vۃ< VN[! .WCg-@,DD|`gBa:>G^^w2OE_\N !Y8sQ{í!P< %(.+cKIA^=Y^BZ9 yyH' iIÔ0Hێ]w?F9LZ;8ʧZݱb/t}=g`@ޘr|^G %^8v.D[F=#Xo\s"Bؿr=5MK+3׉J.68q"CÐW`L^!V; }0r"ܸFa~4 K{~_ {VP/E'?+߿`MDXF[:>+f. OǸxl;c>܄W}z n"%Oh?;5LA=ɦ7\79/P%r@31f(!CP`Wn5b ҉Zc c LVg1m l:tYIPeE|@#]kP|D z4hl=&y.aB_RT8l3W'H[pra\@𹺙^X%5eY/{ ĢY*(UnM"f"y"z)0"e$zLOpD'gQ?I ֡go Q# y\`}+hsAdq@(+ʆS7^˗/eKbXU<L>;A>46A0y[A ޵s Gd[hb6B_M>5(MP(a+…SKA/ޡ 1;Z p$r-m,C:A8~Ҳ*iv-r6Gzy='5p=*z_ظk*\/4o< ?!>;t`0z%_6L## s86|W'7hY6 CUa9e FZ݀ 䡏m1F?ﺣVG,c5os׼@D&´Ka.=yDB}[磷 jR=&orjC(l8]͘fayl@}"3qXabރ'!)W f`j/2j!G T`,7R'^A^_Sg n9qt nn pL|p?:1<ա1~1&1w0',0[<qه7oܩNZ|u8`ఱxӾ+;\#'Ǫ+alDWPAzt9+q9XYYɓ\:qMBR-cܶxIo1n:D _ę (n/9~vZ TrzX==S4yqn 9#.wt4Q7p̛J8}!h(`ÙppqūXgbĚ\i>inɆ 8kw{{QN\n\fL%L[f'`{(Fh(Ppnv9AkwZÁ[|fDb3jfΩMB;rsӞ&N|Xzi)Ǩ`ꊵ<5Ȍ C] qiD /w%>0fBD剷iJ `{ƼULGVMLR4ݺ~ʃq{tl&qn[n2f"І~zR!g4s qaJӾ 1ƒy޳ W 4ssr~trP0zE[n0?hgbD:B[쬀%eUt⭦^Et$Fф&98QD <{# M $6rT>Jl/tFQ^&E[Z6͏#][,X=Sy1zoFm"gݚ-)%Q=C~:ɷnLۧ+k=xwіY}3/o9xkrY-o7 A΃]y4fg5r&cyΪ]z}; 9r^w1wјz;E|?6 m8XqAb%@Hjwa۴Ѭy o,~DXf9+#%E:Rhs3l" FHr23:u:""ab"ϑ%amA΃ Xhbd:yzOޙi)\K [%.:aDQSr&4ФڒA΃j-E|'gEΞX] #sUy o5(; Dq 0"x#+[#D%xN|?d>X kn<[ r.DXK45?TbRBLjrbzlק{7`g G{<@Xd DD%J &>@Zĸ<[ 薳=?H?&MΜSMSmu!.@ z+97eW5_krGMʪBj+: :ZjPVuu Z/QM>/۶reW:/*JZ7r6Sa2 Bk(nri޿7IAc:RA..$;G-F~(y (8r{v-wTФב~<52vsRnqѼ&tܕ49`Tg1xls®Y#0t y*fsjs̆BS;o|4C[ZNXroe`{¢|n2V4Wb}LhR/ -at9_qs on E'!6h9=?yyDAr8bbt3{6,Q+ǧQ%߹p66^9pNve*ƮM0\7KWO ,-ꗝ 6rΙ5f :PG =L* 1y[Y{~4 s1z $n N^zCvǠ *jXs|q| TçGN_nPƮx 7- U-X^GHD*l4U)SHyQN=J$jP|跈i@^_ CW /%?`~7 D}W!߳*>E V:B{DɫE0<)ݗ%mmA)YU']V g#џG*@?YrM@ Mh[l+Liasȩ‡XlrpKCQtpGX@TamM Nn[9y8E&sBfkȫ]sD~b<*:cg&y iK.U6*`**Q^GA{ jd{v@/5}g ,{Q5a-|(zo;B򫩩%UU5ۏ7 i%s]nd14ԛ<9ow:OME1^\T`( %Կ/&/5#~n7}PZYiQvA&8 /CCIG8'Ӭɸzl5h"c 'mAΥjړg,?'v/8o:'\\V)c ymA~1W_sKܜ\Tb0g(OX,w`.NEETȳ -IlLQX[i|I^YWS:q%2QZR|,CTNi|= oxH^Z?[XE觢KwAȈDPJP5qd Wip $' cED֮rIm_03X4i/\PXdz. :Rx\ǔ:F-#6^y1졢4NZ#3Fɺ1._ w\QD&41}|.Pm5莛QRVJZ˿aEISe^8vY%X{AYy5i>ȥe7a*TĖʈáAa0?ix޹=mULk{vV1 #/ۢkx5 K&&c“36cE q1y Ga HCY^N Mu544lcLd㤽R&tgEH7;pGi]L&kJ[89_ a&9wr`$9zY^<ㇸfmk6!JiJj {Nzm2(䕖ׯ!VolΏS3}5$i{ / ҲX,0FiAaOGZ\kָ}Q(&JQ66Juw^[7o","S/E+oQ}cǻp{惜D<k׸o"M$TQ rlSm:ِwElbYHhMtF=b~1wV rbzsf`jVdy 4q?yl-mG7bh}I^x嬌|4ؾz5Rf gn %\aa1rRcA MϾ36qɞ3\f=uI~A()>dD+v$:خuY q Nе`x or6H}Eh)IHtڔLIK?q{ZM^4izqt`S2O!DaǐӒl7r@UH#-8;h9I3Xxtk&z>"^ NgjקٺݮrWdNLI;~ Aֱ+]JZ7M"Z^]hKtЖWսsSv A.ț㞳A΃y<Ȼx_x 5y<Ȼx)mZ?˲8btjIENDB`fotocx/images/unbend horz curved.png0000664000175000017500000002477515247006660016511 0ustar micomicoPNG  IHDR]ٹ. IDATx]IeQQ-,[my" ˜v&X,X;`ˆ 8  ؖBB$#uCUuWߗ_<Ivݓ'/^U^x?/NҪ: D0]9j8NB:=ݥ,0ةNww!3y\Ӝv L4dl5D) ݀MSIN$: 8o0&)Śxy ѣf4Kq' |||/ӟ ?>أ1TE*Q:q8{5sis4#Sq?haB!9,{oe RaϚRRvR`,B'Y8   YQStE`ՙ-h=cW-WmC\#y92CIlc#̹5W1]jhS&DяFLQxttto7k~L|,GGh{^DBU\hcߣb `lhbv4{mzaȐэ]ޡp#,U&@Bp`<S s_طz.Pw^Wn}֗SgTQCɨt롣M\1os>Kk8{ڐ5辞1qNx kL o)R I,N5DjIm+W?cǻ(r"A! " "nAg&PJ8a@{ ' GjIXZ70{pp@_2;TO5ӟ/g<)w(|O2.HuxhB(ym^>̊kNښaKƸ[jjZH2|W@9+?ы XbjV:Eš|w.(:xsΝ;xŒ3ia;ߦMPEQQb*`Ti G/x>KB\n݉ƞ@=yGMf*LJ3`3;Eev@i٭ЂSsUxC+_ru#?yO٭&9~x/֗9V"yӌ-'RӊǏ<~!ӈk½"Xˬ /EeSI}ufJhmX3 zkiM#?g8֭</M>L7O@Y1𴊯`J! tq_}"Wt9/VGx׏ن`d{PJ4-<6gJ;C<Օu2rD~"uި`K>mO\ j0RM9ko|[_|vc'uJRڸsȉ7fZUg-Qu nsYwvϪ=~W!}̔ ;rYa3tWPZHoR(NopOee23tpPqFO"CلHP<-ȵҧPZ<ư[s?ztt._l헾w?C~>yy'AE6Bmh#VyZHGlʳozN,+;6J+0dn?B)cƤ 0sO޹׿oK9>ޱoh˘CI^2ibf}9J^y8_N*TVq-zɿBl媹[ !;Jݹs~|۷;qaNӨCWϸ9 Z,;nAM 4+9LnSiaקּ[R !jxj?̍1wo\Y:;pzxxp\/p=I_#TW㒚!Ԓk§^HOJ6tFZbpsJ[4cP]_:>k"γ&3)uRW Ʃm820 uq #Uͅӷ{+9ڶo7t'|1wy[\%de98P56emc!xkM{[lrW贪pӝn-+> +M8GP#gjkC_9}p65G+Y-‡n~\ʣrT{`{?=Y|/> X^, iZsĎ땪jXR>#]Qn=S¡4W#YCݨݶ7>VYLbW&JӰM:L-M/yS;-.*nIV̹>x"|s o%.U{|0SY\GGaxVL"JP$L"s a'[k39CKVT*˾R\>X&%[Y?p[oyO&lyeP{r%oCmݑNJ1L&N,XM,%BkslS?xZ|J|{wT+W_LV.RUx,ZO^ϚS\IC@W): q?9B7ݤs{o6[ՠ͗[g(a5MXXj\+f4)D\gE`RVXhV#tropz(faTl3V>#F0D>? CD}xSNQTzx\{,f8MޛˌZPdGڥ(x"аO0?O.<)x)`.|XMP/GR$y.[2uvࡊO z$]<@ݙ5(Ʌ!{|5x%~qkk5a~O&@lG>qFA'8ԴN,1]A,?Y' T ?1iy)9ZgęN`NMpmtO}unYQZcidXe5$xypM .>jBI[j$ -qwKl@F 0:kB)/Kj1(Q‰6šTN-xȓ V~P墷4LbQ9N+|Gi!VXfɁ>9hTmkc&*,#"F{-H c^ [k I9 vRۤĜh=m߷ٶϯy=dɲQ0%Udl#lf˞B~\igb\ik(|@Ù/ڕ&Cj[N :,MPwB> hq<=B8a7y{ V6W@gPy$VZکIaPaa=JkbM]LKË3t;zjv[(63-c:]@~cV 4aMJo[p>!8Ow6SoɷjjB+#WCSWbSALZz PjrPe1)'ZZMW~eR}b;T?ȾzBrݼF[i Рk #GqLE"vLUUƶJV9 lB~NPu}dcKqPL$>tkU8wDVcJ3Bׯ_>x .}Oqݝfx; [E-{9kG~[;nSO%*GiQ-ᄯ6`9y?÷7Ϝ=saWY.>{o,1P:0$k9) ՙN7rvu(*fapRoWF*J/|;00;ij/?oW]`,>{gg|6,&OP7Ϛs?txڦM[pgVmR.!kd YQƽ6'78'/EΡZ,QM$;ƝХ+QF%>1^|>s6,ov%c,2RRLb&p΋NsHѹb|mIy1&M)Moq$ľ6;gΞǼuM%d,jg 7aRozj#c8*Þw#p*G u&㲏SVxp?&`2Nϥ&,qP"Zwad"7(u eSMb[<| {SxudZLx{MaU64 55uJ,*1#l["FOD3s4+=6T"7/p%ܛaʵS4?W/]4nĔZ-yRlm*e/'IkMY59379k+Ϛ.N5✮ڱ)k'r}{+䕫W0GI0鹃vLI*#l9զx 9(T;1id+z=Y(\8Pk6Ue囓7^<9tm lؾ1zIIYRɪt7m:ܶHs:@W?^FxE/gտcA /_ϟ?wlb | 1ArocOL ΰI#uR"ABDd]-&U㲬 MĻH| ukDCt#˺г+/3cYcB-1Z=EhKp2IדVt\e;X GzW[qr!_5Kק+vL"mVv4IUl,;l \8Sml MJhkucү gɤ"1+t*sG+Yㅋ|+Kw@ѓt%\D1) czx_B8& 9MX1 4i Vֱ.p ^eF>ջ|/_tS쮜 >r5 !էFx& kA xBm ڗMAi C=Wk%&PɫjŒ^@³͛7nN7S|.^|bfۘ& L^sڻj|(L̦;kƍg^/k`?O: j@\K2&En'˦Xag x%:&ZId}?nJ iPA¡t 6E0T>dsFϊr2"z&O{jLVhu $2wZS3/o=6o{+R]r^>,n@Α-PECP~6h't9t:WOu6Z|KFFldj{d(^~Bj);;xXw7ܼOԕ;WnC#é#ezЎͬzk#.| [} IDATdGC/ C")džFBq/|Dn-Ywv_]}胟vFTr,g ޞIř ))LwLa{DqH;/ZlCsJI%/Km}:(V^qVg?[z%2rY0t|{Of@eXs؉JFQgG؎W̆6YF(ӔQխlAJj Yi 0N;M2h}BΕ+'(7Q`yl'Sm#xw+?޺e/p"-;Mtbt==@[vNcp-jxl ˠ͵Zi&v)sT%~ a\+ fqxgUrq^_O祐qWr/tb$i37ڲ$'VqT^g:ӟ :8k6,֯1'rN^(,}},X>p/ۑ"Md(|͋x'>?߽x⓸x ') RZi8E/RvbW:7:lo]z#paEOjѺ[IrcJ!AXQeU&P1 C0‰á~nU<4s`>F< (#IlK]lLvjS5O1)P%ݼ&))AM\\kP2r x nü2u`' 0~еEi ^7*)Y|sV Q>ąʘ~FsJjڑ@C v}=#6Z 2a3m?EL^4-A21QUvK?LjU(wpa2>?~#w G?ifk00SL59 Yb mWjd Q8=_n@+/A>&(\. ,`l)m'18RǪή*`s2D)MS %|YִAߪ1mMa䅰N5]gJFΜ]R`C&bZ+FkљLmVjmz2 b2m?L6zTXtRaw profile type APP1xPQ =Y4Yֶ麟<_{}e.{yM@DG?"RƎhйr鷳6ȧZ3r|eQ%E >^z{3#03&6VQ9ȁKOdRo5rVd:ɸ"6]", ⵜbt>|l![_iTXtXML:com.adobe.xmp 128 128 IENDB`fotocx/images/texture2.jpg0000664000175000017500000010042715247006660014565 0ustar micomicoJFIF ^http://ns.adobe.com/xap/1.0/ 0 180 485 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?lI83DpҫnMEfִ[k=POtPWnHcAgreRiS|&h1e'HZƐyQî1X>X!bA _HwdO,;C̞֕*R㦇=Dgc,E`-Y; * [=w)n2.p ^1S̕)vy%]AlQFGd]YoeC a^Ť\0{Ufc\Ŀ?4rJozǚF2ʎ 1j:cm,};u Rúi 9=YF[ZI$'%WH}3GoCDEx[ڎ|бbChǻ>5^Acs {㕜5–-6瀼c9k/]滼Sg *ed-] c E6%̨ؓHbgO^;f,%~)-[9dMM8 ltRY><1ӯ~f"ܢ(h؁r7NXD&KmH(H- ВU 亽"iGB8~* \9: ׎k^/H:vaIw}@'>­Ev\";cuA K8{PUld{m/ `پKp['vq8 xI&;2|p1GּكO }[:Z.ܰ+U x ]qҴ[M ;H۳92zpjo+Ia='9c'}j&W 4x *>=6sZgjgFc~B(nXN üSԂ>a*&k3sI'kDpҼMgY1* Oެ}ZmE`HimAܞu<}>F0XiZc]KD[(@FL!1>{w'ҹw3[]#5\ %oukts,:m+n2O3׊Et 58o.!O^}|4ySꣅ"Kѥ$(W' ~1:ھ !:'r:w^[axёң*r@/}귊ui溒+ [̧cN9yPWGkQ} k@^[ok,SIbY]Fr۶ NA:~A>() Y<}xO冫m+hWegL)]^A朔[_ ؖ-F #?y8gf-KzI<ܱ- ٟv:%֘[șʃ-0g+GЏz'bEV R2 Tw^hI5'(%$oo V~MHRG?NPxRj:AH g=ӝkkcSծAHUW'=I޶t2KӒ[ֈ @@B Ou?Ozߴzls8$~<巈1G*Ks8==F1Jx /e %-A8#կem;LXsg#=+iVȌzq}wUVÂ&f{N1GoA+XěNI3EP} B$RcP3\2H(b}~S2cNؠpd#4~]$T;3qߑU#$u@\X;sN *uȔL0XsX&)H,hOި%v(Nxƶ,<88-NjE[y~ePNIfK=fzAWv92.7/ּʘx{nCjRK[{tyf'V9ry)Dŧ{y9`IاryuI ўD#rݶ:uKD_;`㍧fv̹HzU-; .UGA5jVhF99;p=S(SoVRҋVĒd6_:u:z[/8ç#Xpxo}iJ2z7bx6 b^JtLMOjlx'ǘFUՌ{GGSXjdr OWT nY_1<ڽƞzɲ۽%mЩҁ,[U \#qXK|.YY+ ᖷ({K3aM#؇A[]MeH!ElYһ"Cuxb\ѓxȇe6@JHx^Ϯ-3eyntO)kqu8g?y,a]]vDb CqaLideXp2:|t'**R`IH$uZ)MHnC1‚H>_Έr a;vB~Ztw֞kMiaq g)^Te ( }H2K:G@x cs׿+ v-BhKXw`3\[ktkƋ3tX!VW^YɊF~oZj2Sfb;vUxˤx,y7a]RXYȳ@nc7[xzu R@9q+[ˀ{? 0Rpiyͯj;W㔂di\siJ?z.{ԭ E$~+(5+L6$WF/e9$:zylN 21qmSRiuih,NrOx_]:tdv8niP6u]]f/)~Ъ7t0z{/ϨjvF'y8k۩I=-mᾳV *H K93q۽5⾞"1nHE^G9uZmĖZs`61Ӡ[R嗼˩Sᶱ\olI#F>'[h`20qҊH䕌:SA8>j$3gקJ}dt9K )KߥGiBi理 }͍`v_M NI']./{ם98+3KSKOc^8ǧZҴ'Bm,;˅̆TʌV1wԶ4pEn*]cB֠Hvp aӎo uS&Gx\`N9Ds RGs׸ ޘ!@;ӿ_or|#e[iEITtJ˛F|c8}ߓG+U DlO`^PrŨ[Ld1x\ 4.lE[kqsUrz2EU19,x 2+7gEv4P)-?q/I牳,?ȵKP=|%r^ez"׳tƚ-qBI zcDz;n_g>FͲ"1A)WOk4/E=N+O2x88?B-N)'*B 7<0AqAFH|Ъec~2Mjm2dr? oB4+=z)JZ5u+sH>Mki[x #\bqr2 J (ân?:Y}uQ͞EC>1&xg#*pk_fPq5ɜl/'@ ^?JuNYҮv]N}z+׍(˧M͙zwYRQ@<}p:owx҅\*3yVڭiok42>?GegMRGu)# , tMx-JǬHYu+k<~Cںy{ ROllnϽVn-'ΰRQ4hװ#J@APqp>|ԻY]\:CHR}=Zxd1ϽqV35˘ 8w."ʩ3lZ Saucoi$6^Vk颼_L $s=꥔+}6IY<ɓMZx ^9VPO~H{Y4ȮQtP x'YP^{пoXLNW8aGP7z/Lw~EmԊ9QȠ9+< 0;G%'ӡGCDb-*[X(c׭g}ZqxXQtߛNB9 7⻃c'LRBn49a$jGpy ȯBуic3)U =3 k^ڒH(Vܒ|~ֵ*5nStd.Vbh nz{N}b\V;pI8fj^7:MĶO7@Lރ:%<6'V^)hRh~ͦGo/Mjۼ/8{F(s@zwFS].[(r1>\xBQ%}.ҐUZkY Ҿc{}΋yn$WNrNF;F.{,V}8K6"E$C6ޛ[##?[ufXnV61^ӏ^ h>%fFYd@d@1d~VӨN"JP:m12ySg#h/;͍g,qi<}(_t>]F`Ųsҥk_)v$XT$TR%>vM-Ü{pm;['GfM{p N !$!{V)eiy|!l_J M,n$N=}rWItd6gh%r?*d@B qW~$%ίr߃ @;;Nkش`ex涬d޸>i94լhPZ"lLdp=sV8#;>T ^ev,Dwm[+Viqu#|gUÈ!]cOzQz-:Җqkww1[LH$W*+(ꑩs]&՟L +E~Qp/Xr1:wOnk}wI{vՆU>j6&AJKnNޔN,ྻ1yoOiz۽Гc/U>UM>v nZLrD̸\:ʥ3̐iZA0gin"̂1?{=zWkg4qq <#UiN|,L[?s,DeVƮf^FS,q/ t7mhGCg2褫t5Si7>o-=c>+7N&JB+_T}cA78}sM)RRm+ϒïNy\G/l،係q!!U$}@농'N+.N<ȿ̿(8qÚMԶ}Jq)&5-"[h ؀ElEj 0 R-'spPw *q'1 jjz]qF8YZvBL爰blu4o@q ==X ;u"%8~';)`J(`׺쎽AZ*ՙ dk+q&{va+o\T*8gE/@THW /kOGz׳#HvAx]+9V%UAA9?z\|$fgxȫ }sӭe˧4vissǵSy=fLP29@8랝iPR8@l-qciw3ny~~k /fnDvQ%zĢY *n;@ 0ri! kh! iJsǶ?:q1Ny#\:[K)o qԐ8ϯa]i[l1Q1 Ֆ+W#9,~5֟QA͂<\Un|_ F{6du. uXZ4ek;[xy&pN&p¶#'uCʹ&Ff΅6یy;;_C|}>zH|v X]$v8 S|Mum(( |ߏMRRy! b38kKPK<ƛW2͎ڳN{T.c)8lOLqlj7Vѕ@w)U+lvF}NYk>XcQ$n?v=*i{*4Oa09s[s[:_R@qykẴ[5ͬNRE({A\`kr7>k)i$-\<U!F?x 0G=YOFb2n݅A{zLlKMД`` v=*{ꓘm,Xpq8zj rz"֝t&$ ʷRwm2>\H0Ss#Prp1;==p=.MJgf ϡJjJTe+r?#rHT88u^c M*J ڠg}[5\H% sg&kc@gUl$`NG1p?kI1c hQLہyyvfu-$ňw#ub}gY$Ĺ]rHH"5'Vg;<>8@<~ƫsJǧ(Z$ԁ𵹐1Nob&1WX 7$:\}NKtQRKr7rx_Q}SVu#޺R) 8u?^Y//|!8 ~g^9t$ZvRx^6BEEZ{N>H-rGJogG+$@WxEow>,8?YSw*g:who%\n RsʶIaڑqk51ng^vo+ܟV3Ҽӥ\Ae=+NHW 4<)e(?]mZ]GI~XD ]P?» 鋨\K 3z()U Yw] ' [qAw[\yD)B[Oo%,=O`Θڬt CGҼj;<úF^Z=:ZJpzivhbͽ<NkK٠ 1uZOS7%nYM͵ v7a>GRHTbKe!$3?Zڴn?cW8ϵ\5Gc;+Y"$pBhD[?fHm R:TxVRbY~*A#~USRЭdO*J*A?ҧk?i}Y%ʈ?BCަ}Sx\LJ.+v܇GB+76Fs;RzִCh¥9^69PJd1l2"҃rT6N~vR Q^*o"7k#O"C~_w Z3Wefڕf <3vH4 bE̳j9=K_UꪭNev{8-G8ϽJbGh!,:z6A]}4ZiV$yEJ/rqZn㶉-.0$ef# N|w 9Yw.`F1QNuyb9c;dxRzLCgeآ<.UyX1Ak?SէZ5S'?e34wFv`&}Sunt1=<ʒ>g67q%׵M9o|B-dfGy ,]lX:6#sؚ͚{xʹ7/+H ɪ+KWal#=;w)_:[EM,28hP?t:!O ۩2L '5d<,P1АOnedw n~V ir4nx׉%NMZ @V3éR;z^x onnm$Jbۿ#'3tՔ[Ǧof21c9?JZ=wdҴn*mbbbsY%[*ܲpPѴLX6nGĪj qVuOJGof%QH@0MFe5JY#P69?~ō _zm =Iy2Gח\i $1eПN5= ˕WA#okVlNH8;f̖|WwZMZXOl衶~jZpIb,*LrEoSw3|79mD;w.X(~]?$ u;Il~d."hG_-ܒ=;MjivH-. I\c1TiZ^2:nCjF[{v12>S@,4a*ܫ.@N\YMΚQ>0p [Tk[ws6W_ kNQ+2R:b_$wwx<YZ=* R4sZ$g:I.Iڳռ%apm,N3,c t+Ak NiSѝׇYohɉ?.=}ߡޭሣe/&򪬡I ~3rviJ8櫶FN:ciֽz/[KS活RH0rpW5aTn>*(|䟥Lz0Z;żA˽%H[.[r }?¹oMH>frFo,恑@uۏzIVi!%ُQ=U\fi}|=۳Opz~5&vS̵)_BL0;QFz<՟ ^y`^(GQJnQl:~mP@n9t[0wm{Z|GE5婤iҾSz[L"~{}Ɛ}+u=N(9$FMgƭs$l=*qRj7_~AJ%FG^VgV\_JfGFi p{9߸Ȿ%k=.#ֱt֍g#Hkzia/g'sKv!lX>H$C^é [x9KC+ۂ*ƚ)0i%2b=3{z*-57{Vj]]?q:9[HDk?!$qlŮB{Sl)9^U/i&ӄfym[i$ v#]}ȎHey d{jo;-bپ͇:!8/7\:YONKz4fàd%XO.YSA!przvȌ`lsZkFֱytfc'O/a<`?2#E.qcҷt\m_{Ջ $X6:u5yG֩'Z4]1dY| ys&~ҵ,aN8xr-tot[#ub;I c8eaÏQZГJӹyAUƕU+Ry.  YipG^L =^13̗Ӻ[dǹW)^-:Y_3`*Pyo ;qקS ,$2`CE:*.$=:N"Id ?3>j:݄q\H òy dNZotRk˥>[mY0tI?w <^R}085f֡)QBs/LqhFjE b~S̆ F謙o~X4t kj[)ispqO=ioEß*Ԗ埰I= \uȸL971`~Ec-^XՑj23ɯ4&- qGl5% ܰ@!Ad85ji#2( 淼3{ 21Id er@}{tMF̸ҋw9Bg4!y#yw=𖠮<)d;~qyTgC8ϹU|7aM㸫_ /FܗvP\~A nr"mU`$]p+VkX>y'=SS5i.#1F$"B#}ڒoI#\jZtMg)$6`0XcN)2H`,G y*yc;VJy2UDetW#ZgJ:=QK"} ԝ@z{md⺚# R3yn~\+Nhy%V2c]hAW,#:"kcGb J_' :޽H]%],a"ǹ7.ncG[-,ckSN4X2mFԌKQ2ox7Nѐ ?7h<->浦!<ᮾ)e`@OON_HӴdO3Hy(OCxp~J0VvZ@FG5GSJRh-O3-LrĐ;I_;_-uPd9kZ[XLT~+{IԧD9 F+\iTC͞-n?1\|v0 ;նȜcXd~u\tߝڪ̲=F?O]2WOZJyLdA>Aur^>.>+ҼtJD,@[8o^V&qG]5efǷ]mLpLm=1l1=zx~Z_*6;QJT9fydxl-4v/"UYP9o8i3VUdfm˥sڶqO+rDn@A5ZmWa"BB&)nm>B yUz͎*rdRD?q/u [k\? ^)JYnx3֩hnщ[eh Ed(GzuXti9(6ap]]Է6كkI=~ݺ~xθGdL-.{L8}: { XL1T4%x"%eWɷjCz-o!7eNoY[b)7}KHmlnV5J ܜuv:eby9Fl˯Xo*j%',3U8b uӚmEە'ht+K |e0>]wgg5M%OVqW^1{~\t:XnZSM.5-.8''9\2xDlIOl>O?ʖI!frWw h^89akM?Q/ٚ|DxV HԞ?iUHT,zkZ} M^,п\n8=OB3\A!Z f쑘n 8A33كqo=f`m'ѼQL4f9lqաW  XhK_{U/21lgQ4C gOZl"9`0"n$:b5+"۫yZUyrGV z^jGS.VUtFBHrà8$~X(&Qq&/)S?)z6&| )G<5$ u` q^C t$) v*ҔU\ 9AH3'%.ܑ5xãS#dHHqFs֯L!PtHFNѸXzՅB̝AQ=:&O^d8e6:t=GqҲS)x..xcYQ{gWMr"_7 Cxvg"28`\ HL p:5$$(;es7uazs編Ii $[!]Qk?uxm|׌Ǚ `Wy:)IOM4hH?*ӹ:A, dgF?d`jgwix$e%`8ʟU#=zc޵=YJFusKq:OIEt]yŽjvG64vRC.ۆQ#YF+dbf!'dG8?\hlOrY=Wi @ToF~V8JZө34JZ5+9fVy: :]`2gW#_AdI&Vɔ~~XOH|,X;dtኸ^[ʣ2ZOaqVٵA^YA="%(9 02pry}*{}M42>Ͽq/SgQD("8n{}Xֶq=]̯j6L&w \CYGOֹcÚ֭{Đ76>P?:[fGRF|Aϖ=Ot*R]˓Ty^,jMLJr}9^jGq4KX1 _Ӟg#еT7r$ Ig=dN;dXHd pq+}W3GgR~&xP\ l?JSۗ,F[$=ΎZϨ3N5+izU˔h"E#Nk /#2//dw,pzmt[(6h_-(81}N?enȋ9'Q=3V%$lT2 e6q :TW4P֕8n&6d>f7W!i,ӷ称5ռ㧽yŗXF*M{NW;}궞Ls"˼Aޣ$ +$δ4_[@^2='MMzޡg$g 3ǩեiQMsnBa@#]8YKS6M=1Uڷtު wUm|Ȱ^})SeUKI;ق a]"Ha;x?Jw)kz6iykin8ݷgfzjWljQm-VoojDjh=8@ “ֶJ$>ҽ;J!gytD$v.F3|aR`2A<9nèbʸ9GIVǕKX6-1LH{SS湺Rq}( OpjqYX+/h7$AqUW!yA MKsrJ\ I..Ĭ ^m[>>&qx&hb(v`Q 匾[;h3X]XmA,KD6jĪ'O^5u/$[pï֮(-B9O,峽"HA%}>!m-s,W kfdCec× 7] `n<5.:C8ʼrM>EvcaײY*&mbb< O\{WB ϡ'ڋYxʳHNy08q\ , m4ȓp:dXªRWUL- i&y 8EcIO-sǸGP}9=wW.+"+nnW،UB#4v2 8>٭h>I$[B0ߟ#V anՑ8o"d/ J ttrr6sМ\F|Ij-cym9= skY)p $v3ҵ-7H][ rFwi4@73m!c>0LlsMn#F+`;p~Aד|GĶV3K=׫ܹӣ]TiT)pWtטiY<6 H H]:g=Gi'3Q-5ͱDC-6,x* Iu)գVYm^Z8\lqkY 9Gr 2$p?iƭK/c{2mYW9ocX*Qpڍ)T&փU9i]÷j񿅛U5m) pO:+ȬdrG¸$d?^_U׋&\A|GaMeޣ_EvMϩzD;pVw~uu$F63Un{ #\e+qzwD9QtLc9pn%m 9=+<\)6pRm"eS`*62G`+1Vmzm}YZAa+``S'c;BJA󯐄۬.I.KDG5$;#fG|YhN&UÌgջ |FG9c~Z`7WWw?;W6ќQt}{FW?* ?fa!ǃ#ۯJ;ѝ> = xmc.vF%/ǧߥ}V-anU4ݮ KwXiݮ8Pa=?|ge%kFK8Z 6/=Ͽ_rb1<SvźIJy6'G1(!F.@Oγޟ 2oſb*!$N 8jʙ6Gq&ȮP/\27͕4-ͬK묺$h˘Cs~[Yg{[V$1p2~1U4߈mvR[M(9~RIHK NO\{rnOV5-\Gv$`A{u? jPX(bz\`GֳRxg}*z ޿엷SHk\c-)nlhv /gTFhb\+8 ϩeѬ-"%*ImN̡gPLzVݔM:t]r -^Kb Y?5 ܧ9bY(y`# r~glm⵼H.I +n`z;o%щc;?&Cֵع%VI6nwuoo{[tҡmP4NUNOjPF ?o~xViR.2UA9'$ Eu'dsIčkeܒ2nB }kln.`86 $`}z/V[;Oy8 g?f P2F2sU9Bc)jXOD#w0KF{7_oƷ瑵/?YlfFD,,Up=]G{e3F#CvN kͭM=YGAoٮn!Z%6^7aQ}`} g3dQ}0;X>s#|;,>-յuimn?hl4k&H# '#ӽP%_5\`QAG,PȗDK9#{df]'--iu98`1UQ[T9@PGoIks G{8XSV&Jy2-sHo>W_U)^19Ĥ/S#76TiRhŽfa? Яm%FZ^cC2@N'v9!MΔyz6R]:E%S8+3s[ZNO"p0Hn8xɢ=IM.cFk>,ܴVvB\8{ 0:]]NhB6c^/Hp^8;[k^Jȑ!:Xn؎yzZ5%wb\u^%I4*8TsvM$sr'ZnZޕZ*59N+Ӵ4 JѻMwT }JT,N1we_ܛ_ <ß\=Du ևKh :'cnK`grʿsXʢE\ :K+4i0L0`st B>cHbw ^%η;PYOJѫA?Yۆe ϸN~ꖁ9k{?ќ dWOc}Y\8.}ˁa^î8KQ^:|.ŕ"V`vPyc20X uxIRZ =5>jI#>z/Rۉ9=:peEs&4O nߞOnKhpL]-:X!sr;|O~3ۚL|)2U,1Syv=:ѯtۖgu)A?ҹ}%I,䵏LQ'zceЪ[|ȷhNѮ-M`c)%O7#lvђUC;p㶳"1`Og(>8~#ޮdhSQLw&F)˫4f(-,\V@<}TAY4"_%^Ef8:ݕG%ܐ'ۓ0rI>zo5S)e3M;b"G(ۯz)ͪ>S΂HYѾFm،&"^9*SHzcko;]hiW4i2f V-^Zj|Hh_gSgK1?7`=B0{55dUyo&8ØЧ ܌ᔥΑ .S.B{(5FTt'N 5Kس-vDYOqrZմ"`ff1r'~u|1pZ޼^k+sz'Vu^[2:FȜ-u>Vh;`@îJ:u3hS_d6=ۋe(-wGrٹ`mQ\LcYWukt'x#˸@H-$T+w=H>QE*a eq,S>X^-B%F·QEwC,^# o/ՓwN@7d)4QE LhX[Uk"$$)J_izV$$J(|FUv!S3'#H_M1ɂ>q;$Q1 E3 ԣRc s(VwnE۩n+IppP9ֽ>Yym QEiEtg[cB; gJ$5CG4Q_T<|eKX}m'dir!+70qQEqho|{;o23W#O%6܎Z( 3TS,kFP?㷥f3(99' ( Gb!| AO_W) {(・qE[s;Wqz&\s:b+ka,SEܐޣ𢊩lIQ2/?hAn|G?_z(Cv[%-3 y?*ujS<'W~ʿĻALm v{7liTXHH`;~5Lʸ\ύIa=yPt$*a;rw#kT01Uܟ?;f'-h47\ | 6liƛjC$ Xޥ43 +{FSR j\V)]@7i&3=m~m?oV_z>$Y㨟E#.FzFʾ[#RdkkVckFplI*#Ij5jBép4}R2hRJ)n ]t3:  ۄ`ZI!hH&N$ DȠy vIi8\b"iAcCÈ: Xd&(vK&P bΖ,IϞ'} E4ST !A AMAN4Gav(鎼LQ(4܅9$|fR I'tw(4Pw.J )pX1:"C-EXK]¨lf&6J$.;_3Ϛo9&2瀖R%2dG p:8TJ.F`uhʢՎJcdޢg  2v:jtzc@}0`1SBȦYF|^Kf螡լCB=SpocH L^堤b6ǩ6Y5:^76^sL/-ZP1t#T:IFtvFpJ+Tt+MH&ɰ(H Xa.'Y>B1U =$$,j((XHݍhѠ Ñ[d$['DjBS &4Zx2/X%02 OSR*SAe{9ǵu uTӓh%;ܤ X{H62U `#OHR4ufvQWN qI ΤxBEE MAZu_^(z& $ȘֲC_{Qk]j{ҝ:|b WD_P2K|]+3^>RGtkAT/; 4Y^jEF֡~}Lޠi_v..חBK@»HEl md@^) >˗+BjE8F}t%޺?'CM#j █аEGy g\b4#J=ctm THr˲]ftmߔf;uaҎ,F+P,BK֥}ٜq4!%d%e $8F?gx}CřيQ8 qD Ƶ0L*Tyg,UT7IPaAcP((u'muAcPnl~۞5Rjb\ Bѩ<\,Uzݙ+/IkxW*J!+sc>3h'#5g$GMb4IQfN8}:̩MX*VeBgk# W&YnDɊaVLBJ(EѤd'5%d) &P sR\XB[*zÏEXO,Z2 HXe2>ǞTK.2qIünm)M) "3ަ1kT0W.2фq=m lo_a<7ZzZ,%b$G th( )J"Cp =ս8FUAԉm~˭5_v̿\YT2,{AV x`#MH6dT~Ӭ2cs*:v} 2w2|P_NR 춒",xyMO$RPh+SޮxGe@W_=4`|z3-=s_O!G ZH2ؠPq)Iι~A}4""J%j=Z5W|H<ض  Ϳvm#?}s|,KY;zLD,%xHBsr,f6o&!&kWBeTZY&j/hz*t鷷|Vfpϯk3[f&Y9u)RC Af7;k$0:-\MR;NjlO<jHOm8?~GP IuNe h"{ń d-TV6h5rLRv鼨)bꈥQZKFUg'VIҌ+C7pw2{cWC+}eX9nYi#Dgg%DP֭hW[fW$ﭲnF WVȣU5>l~{ӳ|q|"iD xpυ_2 t=q8 NW"3ZVƪfͰ)o؉ƽώ 4O9cԁa©3du)_Np_ldh'-Zf)KOi3ULѣ]3'eT58BQ9?imKzXIyb"19 Ȥ-LrĵFZ,Nё6,"T[tGx,"znk(nNn?s .ѯQ+x""TBB%!5F3=IDݎt~Y)o-:+mG,)S>w{||5z~0 JHI)Td'AbC]TDV*dĻ7q'=Y!nݝ1#{27y|} ^ ^/ooH1m;(DdBHFKbÓMz![G04626k{)ʧTf0I;~0f~IqOkΓtKM],(]Tp"ͨ Y݇}vUnTa[lSu/gfaYLJ7u?><8z9M <\)C=WL"O˜'AyLaiIzMR R=l 6>ܞ>}{}(?f}/~mSUu5DgfFyX2KjʚLx6ie Ϋ&xb{ڸ}ErwԮz|a1-1G̓y \uܥWm^8,+Bث9y,9NNվbU{<$jjGWx Uk_ԒYt]LTˌN|\Q;:YgIRՉl5Дl^2#˜:~n}>~BQj=cNu+ZM󄕶!z@5BaMbM2Oծ9ߝ1dsCẕV>GHʕVTiڙBo%֒ <[E%k`@DAKYv+ZUd<*d{<gۭǚGmq(SQP+ؓd%ҝRq@ ymTY:9npYHUMylIѹCGynnG><CFsRhb:Z)%ɛУ@ŬBirHgŬBݐ ICg A[4٥}#Sԃ:w輾onOwXXxA:[Z:3n+]!oD$E졢-Tp١PZB.̠Htr'D3mofn{s\Z빂d}{U/Èl:[ ZcǎbЍT3N 1Pu1塒%1u3 {N?>o:oΘ]jAIBY%3 \sS+wK7q@sSv['ajm"a3WlСDk9[f =Ok$re|'#IPW-+Wu\Ǡy:hPuhּLh{xUq͜ʵ=TI]tM R&K扞yK^?wUMG2!.նX;ڮoaTxdž`MZD7\֎ޚq-h#r 6 5Q ?!~?SPɇ_Fй7 iXr%o柳5|A'u;`^ 2ɠ4S9s7("ϔf~y?qޙ6mzMU GȌv15~ˍwJV2A3j(X]ms)hcv͠%;Gj=_s<$, بwfc!{ \\T#D5ո.Q+j$Xfh!SYr.L3͌ ??tܿC lt\bL /QxA ⢇ƦNLprEɒ "cN˸׾ϯᇷo;~gQ=E jCl/گ]M y=uʹ=9 6Np'^L|LwְgHP.ޑғJYhXu,:A" j  Ŋz#MwaU"HmQR?dM#t@E+CB Ӑf[ 1 YCfZr$׃(u!l0 IY45P̍qn 798E ed-T673и.D B`|pgI] iATlxhʡz5Să9N.S5JP9jɪK*"=at@'*8Y݃KgyT*$xּt"P+<'1#09^nу= 4n0vqLU\,6\YJw76տs"NW)_ 1Q+*1SbPBu"ʉU6k7R$bU9IBڬS R[u#o?|Y) p[Ci=4&-K sxhnbW724dICDNs->7{4l7?m $ZdœLgv_>-fmo<η W蟬SJ@1 E#XB۪$Y ݬ(Iض#@ٛ֝iE)3Cmo*z˨ 5^і%;tl!廌 H S ևH^!PZgf{LTo3|:8뎺MZ鸓(IsJQ'{x(RÑ8БlH b/_ɖ}$6ng;J`ډ::[kYj] GPL25piE-RA/0èۨ˜ghvL~#S Z*@Pf&$*T#K1r )(|Ey*hN<5;TpoTl9|k=d髤RǐU<9; j9vq'zhlN0hOx& "YT%*#PRb8nO$پrMit'Qw z5"0#V@(qZ`{`# E Rpq L9s>8|* IDAT ٞsu@p$N N2Ȁ=Yo ޲-)[g~@zy*Z$!ÀAs>>,.Hnd=$x# &~`a_?>kN=Rd<|{ f~p8&5~w֩F \i^,655IfsBLyѶmMIFKWk*ì>4Veo;ct?x/ éۼj'{4B%Պ5jB )Ϟ놉P c={MY[Id=FW~%jI~V2Xm>snoEog_WIt8Cժ'q#`Rf49TsCĶ۴P[THd{GUk'}ힻC}ySJs%j9\o_r0-Zc{:C5(rT,^vT[ҌX%KܛnO_=}8GsPjlya#j1p~QDӍZY6ɬ+ũDXnsdvxًt1E,"Kz~~O$)d%$!XiLyHs 7i& WsmRd fvd\WV V&4qVӧ_}5#oD?<GQ/318+:`7KHr"zi-ӝ^qRq*<rq@K@酮9!ԙQ"<+c?G(*X$x”t)8015g;NQʖ_Y4v됶ER#K.T`5 (֑hkNvCa֛dZI™,jCu8'TbLNJi"SfsP9LK$I1yDfeuU{O?#p@ ~TUVF0ѽAAAIf",P)ʸlBɆAK9 1uy5ns}";j+h4\1;$vAڣ},,|/?~j~Yk=ԇc+QOwK|; X97־XzO6`ySyw35D*QVE%dF pS*ga(R VL"w/7^yޫ#zed!IhO}¡%>fk*\Ϛx xTqPn@eX슥K}~nOs=t6+Z${Ł#y5'YDa9TdV0]/Y3r [8:ukq]f,H81LTVA[I IUhBV~l/J>>z Hn'TF5!Ug˧r;Kwѷ:2, ]nvN9=TU=zLt$ҨܣM'iGc%8a/ 5X-X_+k+-;B3(F-^R? ]& m%A `zZ, ch=aѤ)n×N)!ELY5"D@fe0ՑS X;&;J(ȽrXфsOU5 :v6 iHh|t=[EYŒ4DY$Qf@#9ƨ[^09b^DUjEG' ?j'^kQ 9W`͏ " FuE,D[*5$lֲC<CT~*$T@R!RRj`ӤvxMz]!"GM/F+0IyĘ\)jh]v Ejk`J%9P2TM Cr@+\v/Af(xx%4E\*!> jxFF`E?> &IՏUu/*8#/OZ~{^v,#aO 6ժGl q§P T^"wOtX75=5ʧ|kFՖl!6e gtÕ&e1X_\￸TDd-=%$ڧĈ ,9OaHj` 2#]bg\hO,놏`v KGR"aY5'Ǻ^}Sg?`%޿-")CrU>@+(98gX@ 8=} `߉Py }5~YOg~]'@kp`U:zߕr(an.H]Wɻ(U/=T4fKUu3l $A;8~z6o/yO6g<-?A\:@Yq3nu U\q/uDJxZ4-TcU58%B˄äǹ0jWTk/lT"a/C. 62j$ūɃ 9U}Vїh;̂fsFG3KBPLP bׅV%[‡אz7ITkJYkr~vx;y ɅړZQWuf,GŠ3QVT,/ 4(;vLzu ;Ǫ o`Zp~B<~֣+o8|hìKD$BGG4 AǓUEb\sf &`Q[L)$"DOΟsX=zNmH{)ݫZ!{74Xqf&*JZ-q cv[k855>U ҆`('xV]孼©m~(Z%M{R+ÒҬ4/wk]}r:uk8_?5B l6ypYc FE -#bUOz=gm?{W0%/tXi4|ޓhK@<]2@iL~ 5Q B /}õ<8_~{^ݟxzۯьz d%;JX&Q+tm]QCDu>gXBjEg(%1j{f? (v(0u/hcww9,Zz4uEv/ t^=TMM I"ڲO݃(Rva7.J^<<>&ϡnE -{S=Fͣph#' 'Q'~E s ,ZNi4"')vxWV3fVflɣ;ہWok+nQX>Ш&H[Ez$RwϒHZu:ub/۹|Ozo)Y+*K*#ؔD4% />R_:wtó͢OJmJ+&лK~Zu>՚>߭p&$UU5t McnrˊMrc⹞a7RtZ+] ;a]9`R}r|3u=5E'{+:`.^P2ztjɐ*r`;hnzvll3 ӧ#m h5"JpH F0 Z]F3G)Goi%T[ mDZNݠ%Gnu}7I8[Ix z\+;4Lb}qʖH) e$d?6cųBxKt3 z~'$8vt |ٕ9 RTEI;-}cG|S~Db' \ xYWeΞsW{t)) ).VmNi"5ͮq>Cpi+v=4H$AG4 IV3+39h4C{3, Y`߱\fI÷u?}]w/x$Ʒ7dJLn. r5>V;êI/-4&qV欷u}G+OٰK' *`!h<%gxg7l-4}DM^*&,ƴJ!W衽t7 ~}?=FMXlUS35{-4 ݶ- }_zF8[0:e+#]h![zt3}{7=vsEvMnwgrDҵm Ӱ4eO(a4&R d786|h@Kf(1w)jIH].UzL&3,k %)b_0x~[t@6 <\Y wHjx( ^ zH2jɔВX'3WD6: /!E>yZ;n?-l0j=,b@wuMGTD]uӁ;c32 Vy}'{a4="';nr;+]dWL5R2PP-'{j45t3Ͱ~dP|ǽl 2$;&{Q,hԡQSru|@ /JV+ȓѹSpu_bܩHh3򞒖|m'6Xb l AB[6) 6 R@4tKIb\eu_ zp4 l_زW',2 Mis4U/TXr"GR siG ٹjX\ sK_Y7~:s74(nk4.Tg09VD<ˬ8~oЪ[ {- шU:4AM;bpnFSRy;:@|*L)C|,Zt1doe{*Z@qz[c$WDK^!war16{[ d~]c_q/dg֡)vΫbAi+B5iQdskG|ަ8v~+`%vOlqSvwEw<yJ#-i,8&{r3hCY1o(wAfUC'P2%mF%e #(?;d%m*7d;JD/hy0Bĩ~::wo0RKC%o 0B:Z}~zOx)]~Sĺ>.y_QU&~bp!yL0QDc[5J(FvlFfi`brMOY-|"5Il5JO*w("lJDl&YwRy=Bߴ{#A ׭SguĒW}ޤױu<ձP=fXɌOa IDATyv K~LFg"xHsxYz|^9nm!;Vm!V@NSP4Z.2b0a؅.|Ω}Jx6֪7XViڝ9fT_9=m&^)uf ']2D$&Sn^(v<$AIﰰ |HfǸJAKaesr5'<. "'p֣9+MŽpm4 ej4 z!cED[4YOn:(Q^PD KjK8h9ZKX{8z zt٩--+$!yF:m| 8O  Hv B22Y1UiWo~z\|A}OW5ύ)"5@LG j%HѾ7KlRm7YhQE Lgyꀡ,<^hie,j/pGc*Q7`5 t79}#PTRQNJ::RdO#7x"6%  O  =Iq<`cQldTmv=Xhm'ZHe|(@$737~3OVF}?cNG\Z! ӶeBD82KN&;&DDAGT,X3чTUbyѹ)7gǫ|_/zFV@ Ϩ݁/78a:;xJj J `Ҙ1*:Y^gI$8Q`kR-(pJgt1lZLۚHv\$^h%{r7J"it0 Bg'ݏE'?9j|֏/cy|[?h_sXHϦ#ThAUt ƅO<8:5q3O/{T܃W+|/͹:ܰ*HOX'@Dy8 " e;Ќ{TMI&܎CҥPAղ(ͣ IқHlvvH@b \R eFt[{0U=^3̏_L%j8OUwCFf'ęݘ0jp \+ՖNVzxDtmQLD#O[~7~SZS%;Ef5{"H^ wES>FvMjmU^kU(=T HJ8><+X-(jY.\T:'ؐHқm}ۈEh&/жR uRu ݸ!ɹz3=y]_z֟re/H8ME1S=JT R2j2%2e4BpDVi"v6SҘ٪_k27#zg_&āgh`_P+?yu@s1+Cqn2**&weAU(0H2CԀ(Уnr_{|׺~ou=o GH往QbuǍpymxoN < .LQEaSK9>`ct,D!;$ z'"IJᬞ욋sePo`9*Ț`d-X:$c`Y ˜Oß9Vl4$]9a k)VL#&h`tQ9m@&a!jc*;s}y\N<T<16<@hָy7&4 ū=Rń ` XaF7 oC$+rU6 qǘLw|۹&"<0RH60jg>CvhU* B#` gbU)'1 D"^@'axJ8o#e$"A ɏXFF@̸oJ+Wo:(>HQ:Lul3NT`.Zs}Ъa{pK#hH! .B4 H-rm>LwTipE"2ԐGw[Ċ;k~ce>9~tػ9nA(`25h!SւF/úUd**C?3P[W PhhAxV mgCjy{w˳S)2BE'+m@\fp<ZQX`m ,CIfHS!I!>ӷNzxkxۘ `[ܵ/lb]P^y.&pXGυqW HP 1vzu߳ޥ/?=#U"6$62#ȽnW%\5GYFj*tUi4htMM 0*vy߈gQS)Q/~'s_ ]H"`,1W 'I#NM8J!v8X'5w30br6t"":EMQE o o_\ͿzSz ~| ޛk %ҝHF ͅt /? r`{)jB$&;$_豊Qjm7~+^Q}şߨYfݏ#^h;.*nF]x3̅ڪ}a89IF*uUL7]cRh 7v0 4G6oza J1S g0lPÛu;Suzy˙%dG-EHUh'E̽71儅1 ~3^;}l?-Nb/bnFH.^1QQ5P0r$Ep'p t<&a# xY/I5Y=ѭT&qz1=;k t\}ʑr*[lopն`Z7D3AJ9$s/b{ "čx4!n= d!W$sM&' itF4ˠqJ w"3IC(` G?. بʹ+=r G9|j-p@_T!1 <zY2!& )q82"@ C 80:⠓)BfXɼz&\Zh kJ s;2X?@ 6( 4Bm LSj>0BJnTK\*هJqfeVfT절ա,hA! 78 6Cu $b"R8NݿRxZGm .칀nؑADfI,GF8W* ݹ! b%dqN'd7wt2'=-_Z5fDՒ"E6݁!@ 9kwz-p" YZC-.rC 92Cl2XTѾ>RXo;mR` A`= j]] ;me Me2#!m;E< De @ߜU{|޾ܮn&|$Q#(E")p G;CJbf`FP^VTy?|ǺWҵ0ZJf>HFQ cffFރ /iUg9I\䔋Ħ3\~5*'Q">C7(8@&e^\+)J> r hc`HU :^mAB B `AcL!"+þf34G"(r[&؄,ƀw]{F[ @ Y;2Z7IAUUjjZ%Yk>2nԷ? Ɇ?agq 0!U sd{--{ܰ""h$}Πs#mH;h_wVrܩG]kdkP[5MlZl &*>1Xf :1BĮYRĠaLԲaduuW8'kz?}!1I,C09D#+q" F(TkcI>ʠ /mb$8u`B=!5Ƨ~KyKW :Zqe M|SH`P <}E},?vcҁ! ZIAu|߲'7nOe}Yg*dU!2␻ s[Rhl)ܨ`#PP 4E"۪4@ `rΓ5;uW|%Xף p$%&q@"ZAZ)WBAgtfc GۈF$i|m,DF7/m ',[E\}7+:dIQX "!Pn!1BY&pBlnbhK2y?+3H}zyݘ\/?k]I^ٍ-%8)j  #i Yj3FP }lonۮ9Q5y 9W O {Mx_,5u˿~#I s#Z68H~ f3Sq;F\L ch|n3CQSPvE4x~3}7WoXf~&W)Nm5(B$$ (Z;!ly }@/@83@! YIH`3Kz]/WfO 8vLw' a(LfڜVf,h@h&:SaJ,uQ+cV8^$x>'ǯO}Qf}&)0A! @]E@h@􆛌 `deE*C&0;ZJxBaEc 9 t@ GYOkppCdi$*o^p2NL#od_SM","Іbt:^qy"՟Oۧ?zT:xt3}+oY@#`41U79;TKaI:uQ532Ա&NС)垂&@oW?O< _/8XmSp4""&q` @p(fWc?fEy.s|`n-b/@8UENn7x(P9F h;A$Jé"ĈtdBL!Uj?^@'B*PY NyXc'{$eHw V'oBd!G9%†7_ 9&,UP% 41 YJ'* qDb͙5 F밙P`1Ln Hz+7ćdE"R!FI;_N'uRiX(Sc 05߮O^j&gD(HEE|(M olR\}?y IDAT%"e>A =K Al*j``uP6ŗw>xh|~wcLVHF)0"I"P hN DpISІBU5xqZXKKI9H" !I{;+$ưh #L8/:t3lλUN~smTk?4u*u_#_BFl؏!y!L PNHc04Ѩd lPP[LpĨc ׈C 8G|=_/WH`7l{wp{4Ia{p 3$8Y gqA*5r̚9v-vΡc[RdO^:|_V ^A@'+X H@'141=_0MiЀ70P#9/$p/oxuղc)YP@W*T cƵѵMk4ʰ8]GS+PF<md1(|r<.(~ÿXoK4ޖBpݏft4K@;`6&xqc49XMq y c8rCqTͣ,r TzeqϹ[BDD;Hi=3hq?FNTjmz## 5ǃ%btR1RM\ Y=ǩko?ǿӟo^:n+/)ZNPlTIN]4$YmYce,lUg"r 1Ic\2`ba;:Ԯ9A|?NsiRmdf" xt *siĐLogS,xg'9nBUJ(8 RwxVai|'9,xR_;Q`^"iK3c1&8H֒z2(5*XIf;=;  \^1W}9mr YBw).BEkȽBZ˜ьΦӫZRbI`T)a 醥Z0L=8E-Q@{jNcZid#Tw›=AXst6at4AP"%( c8"%`X%5RӺ1&M.1 ^Qu$ÏTdEh !HƻAHMTU!1rT7XQ!ZBeFtiF42'.|CJdՄB7+q[maLq,@Ԗ`l9t 1l6D3UJd]QU2˥=a b-Y=D` H*hr\ SXwY32T w u(  :#t@bN3ȤbY]r(@4 sMililyj(đp/e\:c`#%0:=ǜb 9k񝼭e07]WՊygyQks F[Y!0:౪=3`؋:8.* Y˚bKI 5 bLAAU*-Iu,Md >hI@~9ewgΎXs0SRZU!rOqJ>X ):n&8- ޏǽ5 d"td6o" ڍZg,($ooC Խ ZY/} %=R[o^?}Szuχui `}DWBeH0c35 l7h}]筱8[c..T@Xm!kZr?|bބz뿹IR{ƛ, :,C:v3EJUt@S1 %^[k>Ir΁]cH{?O#d^biu9wC!f(Ըݝ&2ҍKºwOҪU6L=P3HbN:`PVM@ g l9X=G-3YV L٨cOXZpW@.{Kꛔ'~x?ZN'CxXЅ'Q}Tя7иv^5W^/|:_W }~_|lucW!8!`"u826tTÏ;ǰvV 9A}i$EI}ռLPu9N`xf3ZɳrU?"Y_vIPxk4T24 aЀȊ)1mV377 6G&k߂=|W}i^k捤PMBSAChI*&sdg __m*=F.U)+1:*]̛+7~{һp>*ObTj]8 (B҃d@o\P=Qú]86ƹ fז 3E q VmJ|gbWƏ/͠?u픨>?d>)&,u\șj26QG;'"*}Wd@%*9 f@<͟q~7?^kj7#@YEw-@+Gր6etQSk[1 xY-/ҥ~_XKɸw(Jmz޵mk. R޹w7VBCrNe$I_y%jds\$jC ގL ʖP?K綮GMޫC4a\ZLccu_: l483LG'ٰhK\PCnV{\~j%'|U$?[1|4Fa&쏌i$`a|T:#(lkN;[k^znfϽ1b{+*__w?O6麉P^dՄiK<_arC{id"hkG66@2:'`'&!·fPAu܆B@+/1\PBBIL ZlȰ vfވH\8t\u :T6ZYt1@xUw< \?kF`L oZ;}FT>'kBװY9l1,Ý#QZ^c ! B-JF?Zr:~Ot}Xő A_.T'64ȷ1M!mЌ lI sH&³ WF0JTCp8rh'Il&&C!2Bt : )X 8BP@ї[_6nsgt "Co=AH7$S9M Ai@7,A"E[E.#F 8Y I1S%EIj>C!mxD;Q`&jGtSw>kG±s(,Hk>i.jj"#R}K{ST:,ي1\!PO2A"jgĖhpm9FmjZ_HVqݿu'>B 0}/mK"=0۸|Ͻp1) #0rXaZ!B1l,ddxgwQ> ,R"UG %RW)^o쭔b<H(h& 4ēک Ndp̣r,k퐓-)VI]OoHG-&ŢfKǞo2L>0 FI7B}Z6`<4m YJlTvBaD DdMRO_7W>/he35h @cVỹp'jonXԈ[t S8a)>9Nea(6e`+\^~C=A{Ą^|q󘹆:K\gφK|d!uMv1ˌy>c("+r訋oϯ?27!?ȋXdǔ^!pȩ&_G zV[ TM!zK@ IUW$?߾x_v׺6^4 !TD )ց}m!9=8')lݚvcZ:z\7\zXӼܿ,0Up wВR(O"*vq sqf "Y$}։.iź$_ŻP~ս(/ 73yf]GA;']T!pa Ͽhuoi3eoT |_p{=󩿸Y_=ύLMk8 aϾ$H(쓐X Рe_Oj8V9p=cHZ+uMj&l#R0ꞧtM`~o{(-(2 Ldn6u`Ғ"5!Q)^esX@Q7u.jUQڛ)0! 0yz{<$s,$'R,@<2V}0 epOνl16AЅsgIR{.N#Q֗u Wz =k!x$1HY 1ram#*R4AH #X2'4k%DvpX_G{u_ĤtLt*h TI%(.ZIT7x0P"Bx"DVJ $cNB>:t]~wW Q ?BA,{;kICk3l(yNջf`YЪ*!ZYUyvO~s weCwN0E9[3Mՠ6pCmt)p?)RR` ԯ"F YA ƪk~n_OiOFƐȴ$ )vPImqMoX[cA eTPBxR)$Q^Nz?|U~okyJpQ(6 rB:|j5~va?X+7JPVԩS)h &JA'y @?o>8kCKV(!" ,qUPFS/ћ1=k,Tj ]R]B01ƮS.R?Pe~2 l#%IdD Sa hk7%#qâPoM2Ki ժk43c%wMp5w(P' IDATo+oOHK#vpfH%6B3s6IiZ  6b)ėk.Pp(SIHv7цX&@Eox ;BD e"+\2x8eaB}z1zC\1ARu&D'DUWiw {e._/YeـtQ$W_uEW;6~{*68 [AIXEdRZ-cWe)/;BNK> `X <u*}k yуo9* p?Ig8cOR TÉ'PQ,1lg;^"O׃SE0Aed B(E(@Sѧ} =Q|zi3~o9  IK&V($U޸ģ.1ϚEV j[RcP// 8VH2@|tTY4ݠ7~5SU(9y"81ɐS9 7YϾ @BpCK@Ed^<5юks16`?qT*:v"x7|u1.nyi%>M SNYeYyO&uGh?Bj{4IH(aAtuGB^/oDYG+J>aɭ kG;0vd*Fϲ19S tኰs thZr D|oq 7Hm:6^Fa% "G)KP%@!fS'ϵ ep t7wJwrdqgsLV9}zy-"VjCBo$ۯ3h>*sF)!+I^{@5 !P}C No]7|9z Ph',KAIh,m778o읞L>>aֆ 0t(4.P˅ՠl%+|ad,DdD#Z W̙}A1xmW뻗lyxJ"d g3. KVD5kXۤ. 8$KZ;ue>_JB:!*!X7;+a;cۿlݶrua≩z}V޻L2$ni_iFQ"βF2nF8vPTzz ivU] )4K=/oLƶx0M><A/TNI-6Nf_]Ncn1+] dm|uI]\77]/oS؉ѳBGR{Z.gHCK ,CE5Y95jȍ VkBC@S32؜ *Qe c>^?q7G >'!ϯ7tnɒ~OJ}f|\9mݠd@"LLRȐIRx,ծ&U=}NV@IPCWSʿN` g EqP/>?WT$E TXZqݓ2幯^}H-i(6m@F"Ј7s gtp; <AV$p'sQg8CȆ82Rd)dpL"tts j"[ҨA>7vP&,CRl1@ Aă he^W \Ѡel#H0(\hS@?]@;1`!*p1,(A2o|bdx3@2D}_UL.uy]b3aI#V}r(+ndls†ӤO`ʭ4=DBWH*g 5KFh<+ R#AHUy0}(йX45@N&P1d\. T_"L"^$OTd6uGs0  ID܆by@4# A`(( \~7z?\+q/.Eb0F°z L)FiimiC3 Z ~ . ՠu^I?ؠh| |"$ɜ:򱆍\$U& 2$ lAD0M!Ż3CK&[1v z0BJ젃Eո5}R]|O.7tITL:|٪- QB6@8P'c\.=Q'B!"^믪_ÿG`2Ʃ]<N= )$3Hװ,`jn?X7-X_!**e,Q%9e(4;n&'I_H% ˠmTap/%% B h 0Y3Rڠ k  ;=m^ߨ.x_{~ @!˅\B$)E) ΰ0pp sNh.L!;[?Of(^H'``( *o}-{ -㿼=; ]D眄C Yy` 1.qNU (yg0fC MrF]蠇 kQOgBp!$ْ́ELF`#;1V|L:H"s7xYq6Ӕ# "($qvU !ֵ~CFW/_gT)KǮ.L`Ŧ{B8I,P&-IBLP /`d0 vv$I$1Q3̬ B]p;Un*˞@ w37SUӌz{9 ڸ{w$U2eK`F`9_5Z"W:+0yADQއeubvXpXF !-:N;f?5aFJ!8H)Xd@d{^\]Oty> $D K$=i#T9h BF{f@8{&=R4c-Vn?`<=u1rͱ!8X?Yq[xnX@ 1I8s&Y WBSaLra\k h*"4!fmvX,/́/~hZ J5e'C5zfAk-ufSa Meyh:j7#H Q<oGe ~=B^uOp?uWe$I X<qABF V-&8  apDkLRH*r fXbfH6Dx/ *Nq5y-\dmq$ZI6%F!CgOu^CIrdԴTX %d:5b>[[}9h%Q;{ qz"ʨ;ElºXg:@ ,hFҀU*sFN{ӧO ׷_~lW0_q!=X>$$%D v$2*h~zWߥO/]YZ?~7O]oF %)DJcF5:B=Yn.~^b@c΍Q"csг"P+x. xc<9Aa}&Al(tCEbQ(OlWm H@1# T p0IſY-;$ HagF!}4 HD쥃` *vcR/SY2o6;0)섗B%YPt%YWL#ɰf-yq"#ebWl]{-}~EE2n dE܀U\"pi\pc4lk`Qb@]5"K h H՟SuM}}&1*8Z#&!M|ށ22ъeLe ;N$)QD7Gv rՑ쒩g&kp0gM?yvTy3w# Nul۵l EcqBԴG8٠F/K]\,#J1jȼFWRk?߫Ϭh"u$.pxD\dubP`/A=9K}tUMfcXS2mr谤g0>-w2?7t1K"aԂ/%R ][74q#=E,dƅgs$0FsɗԪK* E *A0BSȧx}x:W9ug˲$Q[Fg9#D9&H4sC'RAdt*5Wt7:t3]_P)ULwcU=>{'_l` 0JN FaF82/1 iԊ,YsE BdiUT)r)f5`~=穿~ne0@u7ؙBZ"1[@!(G0(ZX7x+418Zt3]g ?uvw1͍Pj=d" HN$7 b8&ې.EBUf/ !0+'1tLdlj *7HSkX\O{V`!,D@hB#ws/LHv^%SsA\fE'GSMZPBL2;Yf& H Z|UrFx$QO$ndtT2pڊ1Kt *aB x3sCb@u#;8ZjժUv1NGr{uHb+P7r[( krlaah qfhN„jjo4҄*K'E b/D Pn]4cHN|:'+::Oxd 4J-,l%$`(I6?$N80+@2ݬX86v^ D] &z{6*6ۺE NmAPAI4BTZ\MՒV]px]|n> nr E42 0+M:2,A:6h=6dЮ(H!"B!eLt,I\ pfn5z *,g@xg<11ƴ&2o@,?cۈ*.wpe8۟߉7e_2Jq~UwFUxsG}[f,qnsP0I^kQ:hFdwŲhѝF ?swTmG 0I,1 cϼm;ٵ_ 'X x&x 3ēzUN`AQ؈a!T_Q( ]:ي!u/ɼ|2|?#a-$LwCFZI1?}'\U2x$\1VFn~Y#$moKxG4;f{p0yMZ4@HH(Fp" "% ̐kHvf pP<.c;ϛ%1z 3YLu'TUXԈ 2! >F66RSqSX"GFU0'ձH#LIJ@3$%fZ B/no~)7 T$a7"HB k( 8/hc slx(Q1 f_xIn3  @i21S{g"6N~@mȦAGMA"C`W==4fxATpoDZyǤ55Ko!$Wñ6@ tv3Ox0)hbfK@J9m<)X0JL!"NeV ^$+Q[3|}I'# ?&vWآa,Mp "%(4ƘG}\Zlg,V3jr[@$1<݁#㌰ġLTa dAYD+㱍+=Owjaqo7K_O_Z?RH>RP dd@59w^oKjbjJu sI־] N?8߳Wxy/EADE.*Jb85E~½IfQFopWPA]AV0`vNW $LPQ * q\#v)V3K j/(nǽ'JRLKg>>=b91섳* %"  0q]3Ð*C: (j0LuUo#/0Q1ClfBu|264ڻ LA 9Y:6?1 S3.`E=7oڻ#2Gx'DKVbG$U%Pr6^;|W Hom>R9·554R7" }̎o S,z: 6I4 6 ab!2 %@*!.I&)@ACօɚ| ;f`SZ\O??k"f>޻Q(O"C0PU;4`I:T<4XMh*x$č pyHY>'LHp#^HNQ v&dB*JEj $0LVYT2ԋDS2ʒYIr! f%FE1J L"Fu(r ]@_1Ujh0$Xm/]ǟ~|4xEJE? GrD)p-cPtbI5_ *T } IxDϯ~\i}F,>qŪx`#-mZH?Fb 17i*(rG4 wgp&T,D@ۂ<xKyJ%C '1L`B`:r esӨyGTK2qU Q4_5K?{<7rѿVrφL6Fщ+$Fw#3D)ߦ P(lA?RC M=5s ~1Wy!zxyy\K: q4+>MLܺ$΋nԮIs'aHx;`0:G%UV݁Qc0ƍUʃ}믟Mu،3d!OOd X3á:цM':0QuWu!QY[Z-ރkkp4M^C= WX1Y=r|']y "D5hp%dx4MZrLxvF*[n2H VAaurHP*qO a E(̹X8v'jL$3ؚt%FI4IAK4 NYSmh8eȤ){$Ȭ>EV<@tD-B%fR!Q/5dP6oi kJyUJ%m0"8(bʳq93c7[ |vR=*0)Kst𡦂Q ʆ@$kmJx^ iWuaKh@P;pt$ [X:U E[0TR4dG=c}: #I5W0$ Z$I$ 4 ͹, /Ҟ">_-.r#WvQa"70t̔04j!1`ˮ"a FYcY-5".pZXf2q 68A"NJFVtkU8Z9O-.Xe1=!?_3K|P##80aC6 vGCD8a1O~;|3uȃx!fm \t W6"P(!G}x| AJ$ȨSN6 $1ѓ4c- 'y/E?tMȨnL,֯]cn2=ƛd[&0#LQ]byrȿyQZȥ;C] x'9d[V=v"܍+820 ԡ2f8wFSK[ȜKb&uxЫ{!8q[]߼>~OoF/Ņ`F05>7~ H(#ؔ7ɼP-`ȅZDJhZ4.zh[^6UCbƒ8s$z -5BdX;Fk:뮐HgnL،FM<|sunvh(ZͶnDMalۭU[癧 | x QD(AtgeW<2W<2d+jj u !jֵdDAkh&`PsǷ:Gǁ:Zt^~ $L5E) tjLk? !h`jp,T8-4aeâCeDQN7dǿaY65om&`ۗ] +nˁ(:mrt0ȕNatZ4LYtj;! լ45Sqgȷ(y3a(JHKFx# %X񨺣8ںOp4FeȜ~A e&Xم*C 7Й'sBszNvݓ`IC\@/k4{OpQè2B2ti8nudȍ|𮌡Y8|iFP+F&r"6ߘ:&qT̞7h6YyNqC 6`6g;PdE?k~C \R[²{Fa-^d񉬢;`ƯS')J1? cMx[5nR8 VB}HӋ.~KD/^zVn;IH,y'b"Uk\_~ aLpQ+:#ȸ̚[my7GJ{ QSߎ٨?'W6xk!>dЫ^![ $Cx#_{ބ7@DJ`Aգ1 u@kZU7@S0{q\iS]gǩ_aZRTKY$3qWaݍ(x)8ȩ`Bgp6M_/jސ*d6鵤x^'S]d``;1Zh 6#db>(X x-·1hD,Κi0EQw٨Pޓ5%UPA` If؞ (9$^YAJ@@!,Bھ\w|` qǗ[ݨpRC1$$0a;DA[آ ؝@U !7@!(x-U$60i=G,cÿ (@&dUSdY@4vR LWPb%aA)]K[ф30C|GbG%Q󞴪㡁1@+D4!T\Y5HNsP5H:ppLrP(ؽ"_@AἺI"C}BWm׃a|Ljc$y,=$Q$+%ACbTd2F&@׿E.pcA`e{;]y}1z{_ַqh D AIt',jwtBD4ʀ&-! &n F!RāXƚm5:,bg 2}q~ʚ+oɼЮ*U]"҄_ |]d9*Ljko;i!CqV|1=~ &vy8^ Q\wҘtA_<ӹ]`M/]\Ss?vIluG`@3S"BG)TCb`ЎKסCu,bxB dğ_Ǐ=vWI GJu4(Nl#5L%{JU(قCj!"C6A@ʢUŽ/iBru?׷yz l,lt h'V P&b7{U6>j;#M %mGuRaURcKQQ.]&2lV9|I6ysIѐ` =39-ɍԴNJU#C$Ejys4`#Z]xcgy3@IcL2"8Oȹ宙G0BlS4Huhzu4Z;^Z1^q@]Z?~|;`UпVQ/"nAA2|ëb"|ZIKr<=pWVu.iMp?X;Zㅊݼs½cGP.DIw&@ ٘Lsނ)d`R` X)t%r"rKWi O˘7Uf5uxRдֿGl$J"NBr<"f8vmс T\ıqp#\XY9WjM~.284@Z C߾!MG  Z*J;$'q$ ";(rͭ;%0dP7' C YU5.rF1fno}m8H6x($0 V:^)wfD23^2[h:;!I_;\*ePrBU;he^8Kع2Jj&4pt )aN}`^ѻlQ{\t@B܍Pai䏁HeFKf@&$P(Hj T(Q$nAf" 5dIMΛ[BUԜĚej8B<"YvH<7Q.䤌mMH+TPt)dE@+Du\A'Y%Kd39xLLV)Fi=Pbp+ׂ5*: As[AYidYn]Y o(rU7,btêB 1qO@ Wply1/%o~@ Tt\w}>>M,@#zBt!s{{.Q t/4K,kTC\EF5!+Н/V{.Q&fFb5"gި.p$&{}~.x:m6-MNhUjXUPPDIq3)97[|RH>G'TksV `E=+x'Xvy0'rz]Ns@aC+ypbbN8nC-1tz?k30:d mXP9k1`'0Ljj|]E)e agؼV{=%=$Cw T1;Z@9m yi ^wW0%TՍ'$ A!IC! , J3MتR"j|樈]f;1 B, ;yB:9E>$E"f_!:$f68QbR"f{YѨceBkUǿaexMˮ4pQ[@dTBDt\ƾqdRO1&cM g%L-j6(hMH gۼcM[nbV2ye! 1Ek5a s2qt8uz,b"uB@@BD  )HoeU0 lGγΰI ~,-jAa!'6hr(#8{lt"%ċXnut U4,5r5b$-1IUN ("H 򝴼&S8ȃPH L%S3 %2T,ؽ"% aLs'zq@d>۠`!W8ŋ|<; +xWn+!QoŇ!򓻴` v70$l„pQJw0 yqP ;8VSEZT8VR'n,W0Yl~oA j6؁Ce;7%n 0TFJ„lWu.a, \̙ٸMlrH@(əszuJsdri'!a!'x8=*KT3hP<*m["+"2L@;x/y?kl;8V() ^I -C% >oG\[N1IN&2a0;5=*8Ln~WO|!C_oVա R<?Ke݂D,۽,@lԍ@{ihm-cdj@" Q~ͲJ&ՂW4K˯8 mv Jh@ٔ&Db/FIAW R (]`ͨ̚k7l_jK5?Uz׬Qs^RǬv/XEF[R'2V>)kntH羁M_Snnڥ{PC*Rv|Zh*ҨT IJp^uuQ5t5AidTI;ohjD]i`@5COǔR{9Z)o;wS_ӺWc5Ep6pZL\@'1 8t?{kW&FU#b)%\ȸlz;g\_6TD‡V7찏Hh" չD $%T{AGHVT7֩]5CCL|HBǬ[#M&}V/wQZ;YǞڈ|0&V Xtc|9c~a~9{/t y\9ϵ#x7"%Nzz$XwMRμqu9qFeq/Z6"+QꑨDZZGRAä9dHE54lqZAǥz9^)+??v9:.wLŊV'㊣?g8O c[Ysȷh& d<є佻Xt,1ZUGc䇽^3ϩ﷋t8X. + gY7nE=f鑔J>lm,]R^JyaE] ݫ/UY%ΜWP|y}r uJn-BNr/eCnjRRY%X=;N*.3}Ͷ.Jt wZVV^m|Ogtη~{34,2nB)JqU8hfkYVOe#Wu$I(6m"qr۝ [c[QʹD Ai>s_SCԏ.VlѤ8Y l%!.td=JqC2u Y~/]R%}iY dts%+!,ut%M; "21Ʒh٦nbD7t.HYW%җAb4-=u3IZz/NENEIt")dW#9k.dy, W±DEQl6l=˴b䴐q9q+pL1;vu%5$Mo.8͹rwϤ ZV+H'c<^,JXS ]*Y]^1Cn_?>/w}}=<.K* MwiӢr̬H,3ikXX:ː/ܽz('3{8vWopA58{;ueS|".Җe ܷ~sR]1BIKcs4?OuEVЂNNR;$[Cuh{EVg=whz3ui0{9;4=׳MV2Gjtl/k1x=z;Z4IEӞwqiJ~D"2=fB/0qhnIqA\#Rc-]rD{b>wtvi Qr!L5xg z5 :Z9/ԝeQ3z!^wVd~ Mɾ[6;3y(#sox]Os}hx_8~arDr.}I;ťNZ9EV+CjqRQy}Ӟ=*ၰT%Uƒ:OwJy|Z;kJZ,q pNmnce ZCrU+|=ȥb=XspZDK^t'xZp-=vk|4|.J zJMr('Rkeˌ7IVjƚO]0<ߚ5ŗOXlT|56Ц99xn3DQ/B74}’"Ee-įΌQ|T"|O}r?G jAh ՛+([]P2фx<"hE6~ebK9tN|g}~_XH?"o "s2jgndоυ=Ѿ v>#N(2aO4 vaD9i|,yދSnR~#_?у.$Ş|&` j@f&']2xkC߈ 7Z:G}m9%1Ӹ c_QWRb`` d mC\dN"'u'?iJ~~=Pm{ڢw__jޮ??{^a'.ѯxԂ%gvnfLJᾝnRZ$]+786Eݥ_{%A-2D{ ~y'55: E.rD |I; Ezwt7@vItŖjZS[YVݥś\)qEC`Tx-7NBYi؂jJHUXh5!Xu1J8syܖ.C4C! 6*fn}L#y_HJA>VZ"HE!r) h4Шhfb; `4`I/vƓ%)R ,Pd",,"uAhS2=J$QS/MZ)z )ݤ伖BA;=w廎qEZÕ;Vֶ\N)vȗADn2uzdAgĻP3𴌈_RG{o3ҏkإI@`HVR.8mt,[ sV|kѝzH /9K ,9YMF'%GCI+B0l˰\Kd\ZWnSu#xTic%Qj4JU +93}iQ%3z>~ki]ʩSɞ-zC7\K̰݄a-N3pp"iͪ'.ifyan$<z,>>7O{=㫔 ,:[ $,AvTBGtں"n[ZunbhUrJ_JJ~.TO:SsVz4a-xH߄ (dI%U`tX.HnyjUZ%:E7t Bvj8dQݽ߹7П?;B '2y٪;5difR&1H$"ԛ^iu!˖GQ5:;ɿ2 "JvP!:?Rk̗Q1!>T΃`{og4xʙ?k^DZk Hlww(Iy\TKzd7eKtKnT|78裹I7ҙb5WmI"dι:k5>xD/~뚚UjUxɰ"1HddUDdú@Q~->GG:![ !u D|hH{=F7W<{PuъN'ۜHhpaC;&aE/({ڔE&nk%i7йi i]Z@y˕cyӤkh=I1w+$iZN4:rI[9-+KˬVX%$7GiN D,Tn֒u.]zp f y#WȍaԺ| DQC% nۥ4c]݊חYo5c  T{De”(1D[*ުRY R"֍5/^u]/p{!`Tl` Eځv:/I/ M)iX&!5ZDv! K$`_~Wa蝖us8m{ E9ECQp7_n'A5~zo4?/=q㻺S~oŻs6o8QH^D,=*u_A~GEoXyuj-;u뿲cx'ޮt5Y?BO{x7R[2xb v V/Oj`ڋ>Q\ּtu!Qtc7/;@ QlAEDm#҄N3A}EOW!7\4ؐKDcc?h;*=*?ZeN!L,e;'C7`-T 2և7 -4CĴ(OBd0jxx_~y|С96Ixvh3)1IF#[+;RsU) myEХmJ_SR7}rY&I ( Jo$PR+*TcK-{>IFV/oy ՜!5VT~mBnǏߴ3%1\iEiO{ g'}"F=t)$9e `=ylNtZT=ҳfZ^_y IaC`I;3# &#]"34%ɇ5IƲ b;F538cx J=hQ~ Ώn3VnXm!'\No~MyށQ@ĉ3 5s,)Ihzi:ZJl|Tg: ʎ5Ygyzc}$g5VK`E,-KJ_^ʆBҽԼdI+y6&\0w'<Ԃ zʹ$ؖ"Z%= }YEBd ScD Ϳ/'Wz?$~[)fHKڮDܸt Oҟ@B Bf-on:"xf{Ԫ6JTQ(\%jܭ%$],!$PFLj]UWK5='yPjZiZL3n6+|g}./:Vev $-ZD`m!G[]pƟ^2lTh|HxGd@?z:\3Zß?;}XWHd V*lB$n"ORP,$uKqCn/<IXK%iopv0tHCcj'~佸_韺Ѻ 9)gHVb!ɰ7uI͌DNh*]6qn L ȅ+T2ԍkt7#ןxk7eC$ګK! Jkw_jq /3fK>Q'Id<<ʎuǡ1:G>'yH%W$I\}ydVU f0"ENEH^@! 0KwUWe>g 1-1YfjG^k):u :@Uo!. i")JT#R`Qb1 .AU6+>|<`#xy?e<)Hԏ {Gnr%;L nx2Ĭ(ڰHEN|p*ooUq#kmīuPH𺠻.!r&ej t蔖˩|t]׌>W/`*p&ǪCRʣ]1gpE-"@t ̪?aW'|SѬ^5,)sͷHCmE >K'~FD&&FG ؕXz7-8JwĥZd}g"癷vKKٽ샍7۵YQj?EmZe>Q+u$L2n4)NĊ a%km\; ݱ\'uWrȲ(UWUI,z"Z$e|Z4=-aOFB#iUkcLvD 9.[2wҡG=:leCeؔr]J__Ÿ]-Y:H({v0՝6d,P Əm|:%膶\w,إ*IE q-7n邕(z$߁,itlt9wu9f NẨҙ4KKd3'H oP`J1EXa-{b$Q*ݭq@NշwTCWa!v.3vo oez"oΎ-uW3mt,=NNƝK%2&L(X-a@I@'!롘,nKg)Evђ ZdNZ=f9^`!ȷ'Cl[,;4tRDڳ6RpYF[lq!jF.!F-G|iR9ȂZ2ŲFwN4 IDATHԖsFI BRz]/T]邍D|[d+2ZLŠo$WSEV#`)v7N: C nk>:trp!K+QNtW䶮$Nl{uJZ1OGszPS9V#u5duLKѧ};/BKzr4@k>nuH5+?}$ԷFjJnG'&wZ:ν#Iި$r~TUT;/{_[ߊ7?e]#Zn,=__ m6jM"x^_]]^ Q&+NP˥Z_?¹Woi闗sh<ԴD#aZAKYX6sJ:C:C(f"Pt;"e﷫nVұm .zŶ;dIs H2`qU:q`"qĨH~9ZwfkPdaE-&a" N\؅>W?> ''P9x.nnټ{dŐ!@*zzYh!W >\ 7g?Fa04M34+xۓV) .2mBM$x"w/RR8 D/wE5&"{_q42GLNh1 @$00: qǛ4,l@M0aFE@K 7+dRH@Cg2ۀ5}#blw~^ LIm90AD&֒M}oYM}~b4w.M6 7Z4~,RC`B' m$ du'u+’tm- %;FHT{! Q.FM|+Ei!A~ߤOINzEK\bFb=v@ϻ펽M& H&¢>~$G\PS%@щFhLѷ$JN%8ȱ!? ?r%팅E3/\l rqZd!]B^OO}(d 6cZލ^En 1\xΈhKƴ"umFNnZ GE@nnGrЋT⺞n'Eo0QS T. Iހd%Kp(;9-k{o6-tI,5r~#V[] BWrߞZJs6o'De8DmC]qKI+y>t?M 'd0G8nWw п! ÷?Xi}{niam "tZ̎D 1y+lQ9rCG#$ԭR$t[כ9;_%ֻ.-@U E8cY/Svܻ}xNWHqwG<‡l#NaVϬoK7k|'_6-KDJi>|C>ȷ8>pn豹n07X#=PZdAO}׷ v!;ڍx% ]=,+89ȤQu4NfGAMݖ0d,oD1}D)֝Y`y|"|Y_Ͻ|I'jI;߿*+1⑸gFxAOnY>D%};:c;2pQڴ?x::O~$?+'&*E[S+G&fB ڤ^m:Bɯs`S?׏ o|ZP.hVQJJFܗ7"x zyHəIV +nQPXXCDoϞIPTa'jEvdaY"&pO)4lKXĉ7$Y%!4 >t^:%&?oͿF_#^?STDP S#dJ/ E4`ve(6yIGf 3vIҮG^YZ7]ZNx#' !F~CoI92%}7iHs+ 4Ka >!_Hw%[HԸIь}?s Z1d[& /{ƽ,KE]7F}#oH>Kp6o[cn>?R;%&4UtGo`D5~dOg TRh?v_ă+IuI: o}ؾ{֬{5wNկ7CН*~k@H-u= xbr>#l?6ilj@ME+6pJ}4-ʌ’̬ldi3f$oG[")4l /m?3YU= JEWTyt$Qqq% BB>_kb;9𥴽Z9[Oț, QƆSLrʑoCbCa<意}; Y 0źt\*qyxņƍ}LK5ά/tt`wTvd2*k!IKn IY[S1S5G1(]jEP$֘uf/ $c("=JCc"rFm[./-VUG}E}~ FmڥQPR ڌQ' ҭqItD (A.*$$< 2J@$Yʀce|z[VU+g+L"J2Fڰ j4"VA4FRM ; < *,_ncIsJ;dBE-ۡ+Y1Q2vc ":xCYAU=Z?V~.esH " G+t?mWÛJՊ[Q 75%r?jO'|?:G 6*XS͌"x*Lzb*-bzǟ3szJ-%$$mc6۝.u(/꾻Bbb$h&G@$Z4dTs4ƑR#x_HF YT"u?nE*=F1A4H\!hK [;)iwcȠᮚ#wz1GeIQy@D_O_6?5ڒ;l;1 ]iQ?UѠ/`^L 8X^kO!ܙfj-x*|T^#cT[7]cmt QYHKL}%F)i0mTLLGxj]R*dAE@ͤg4bKn#Wq$tBIZ1mx S}&8yu#6*(aY=cf \KJawgmݱkkz ֫dK|IZA}̱*B[]2jec]ߋN.K)!!]㜂萐F $^*qth(q".4ס%@:`JW!:8S"Sw$QMP`Ls DkgeR,6 w?{FKKo u7,DPc,Xy_.յ_?/ Q QZ]NE7Zw,#{vAEҜ!i["۫ޒ^v>n>#|ޔӕΎ/QCp9dEFy :EI՜HRp;H=n*=TЉZc5YMDG{+AMˎzWSUiN4R %x'%ˎ Y#&"pDɐJ#a)#<&4 <0[bgZ[śGO18%8 5;w& Ìs5qM$$QLL!99 j<6/hE SG-ޢ' \SJBxn闦$q1 F5"-/X{;n,\J^hը.h:78)7;)pوC #@qB͚U~XΚ89AD@szGU|%|hH?1T1Y 23OXQ]Sp 6Zn>b_J#Rx7O ?A2w.rd J%"@H;J*9G89yP>E 5B)&Ĺ;ZxB!<37~JPTDT` ay$jao$b/Ggtm脐DWxBd!T ʍ 9ѴQB6,J(o>9VaN3_".6#//3FQ'I")pkQΙufaTuS2R$!PȒ"IZԕ$.A6"8J(,w-'O^A@YHMk-.j* (SĢa^բ}'yδmtL'I}"$#M4 Z@aK%ͯ[".8i"YՊ=ⵝ%M6x:ox8_8PH*ObՀ+z 6HF!'ڄ{V*1"QOw\.i_˶2w-a4Bb%[ ahK Q-6jDBì.fɁJkjv3KMƯ_6'iξ2^*YҧxNNyЙj٭KXAX:t>:1 ^CxRO!dNuR-ZU!5:oUuŽNHwR%+ "ӃĺyK,QhYB{cρ* -͂;HTZNOso^ #R{F`Ir_hX*9`53=Kq3I}X/*g!OeĒ##t~WM?~H_CEIf!?7C{-i )A&єF>OjNhEn ZsO"5E%xS|DKSh5 "fO}E 6Oѡ#WIݣd!1&Cl< f낂FmQIwC o^Џ7 |C'4H[nרolXy 9w3w fߺ١`V?}'-eaW\:wez1#K `СG 4!ܳFaH87\S|80KA&Fg5 iwQ!?d-{.~_]F=C,m@Pki/$Z0l] `0$%sg^;7zCggT^^5'֫\{x&LP Yͦm4?H+gimC{yo)aC g:iR ,oZS7-vioǡ-z5{T`hM)c%ern)ʒ{rۋd,z&t~-dNn/ nRPEۢXARcCVjU# ‡% %7ĵR?(뛼n3[P\_zZ.})G Rk9PCb A[-˞#9ޗa. oQG XӀ+͹eN݀IDAT g44,"9 @yY~OG&bXBFBՅ4JF#Yֲ,+,xloW%PyK^9|!ejVwGDꄶ潪Z) t>*uZouϿ۾,O^'mܲ}P[2WA2̌E۴{rT7CiS\)vwL=,0#݅'p0pIENDB`fotocx/images/broken.png0000664000175000017500000000463015247006660014266 0ustar micomicoPNG  IHDR@@iq*iTXtXML:com.adobe.xmp 1 2 3 0 0 64 64 1 &eXIfMM*JR(iZHH023230100fotocx-25.1: Paint Image|fotocx-25.1: Paint Image|EsMIDATxoE?Z/HT QR .&;Q#c?@уIS(_c4" @xjtwٝgfv$lg3󝝝3Vڀ^cún~fzaD[7;{a+i3cpi;c;21LG6in*$b#K2+:EYQC@?00֒~J\G{ʏb9ׅUV ( ̺0vܛ4p84,0ܝ⎒)~WAUt0 v1 y bb_1*ElH{-G]ijvVpҺlN GIYfWªBjġ*l[OVEy$rzӖR= :r zʮ̣AV; t'y}5|߹3+Sj@_[oʨ*`cAGJ0B] |Y)JvvAӖdc(Be?)h{~AR؄='FzB#߅RV)l* }n`>(%HaR{JPW KLE_<iq 8߫3(8,y`Y_HR;%..eYyjtEW d獕ʱ1`Ǝs# -^K@~_g1y$y]@-yrkբ_@u"ar c=-:23f&^{*55M!#̌?`*|لbNћCrԀ'P36<ۼ`(A5aQ07T _^Jϟdzi0e_I|ZJ4> t'{Hɋ q8EO@bw&$,(!̋~"p2ҟu~NpWI-i?9<37 :eљ2`jljsAɄ{q8>^ fV*Iu§/Ue&3eEYׄgZĕ Z//-TU5Rم¼d7i>O^_Lm3OYS!LOLi<VքQ^\Z6_Iᎍ-3ZrggDD9|w7Kӄ]p0.P0s`lf怴SFpb栓JIqx`fD7^ޙO 'TQO\:[o (es8t.Ƿ`8' ?O֣g4HׇH2.*>s0a3>q He#"EȞ-{?{gEzmFr10>I} 1g! (03:?DN?ղ@=_% e, KtբCߟ̫, $9t콍EfキZky]sogDGL4i+T@)%p865g""KiL3wsHfptB.ݣU|/ c af]G4pO,xlDs.3j X!>[n3@" Loֹ z7b keb1 z2z{%^)[9A]gf#ބQv&QlD >ǟI:N Z+NQ_p\pLN IY蔑}?譵b䋂pk01֝Y!4&Yr/3֣%N/?uQXA|V+3Sfo[ TsKsY_"m#by*ӊ<@w3̜0ޥ1al VWb哜ʼn%]DJa߼6Sc. L 왑 X.wmK{;<{q7mvqgD$@ H{% zc4E6cc"0yB5c i*/*S`sXLǁ)U"DfJJ &ϋؽ_dUH}zI~ۇЅ_+Xl 'MrTksQԗ"#!)='vFDk<<CvqxGk-y d-# YӽӣN9.VBܯe.ń!I6 H3b3?d ߆G~e. /&&gU*3͊.P/.ũ\'&I7'6,+uo3X2RXfƹ`fj`|N:_:`:!y>}?oo7:q@Khlsv3iNY3s \㰑.1)R̚3*'=\-203Ӧ|ZiiW&kas!WbHY/aXQCnfYVA0鑤Ô^3Se''BVC>WAvtPN^;8ǽG}W5*a2z?w^5yM>Y) (C{ZFŠ@hj&dTG%23slOj @0]oG+-L63!3=c:T?HԠVvbi)m9~>LNZhkp j`LP{fkm?yNxOT*fDm|c5أA%ZJq+i -=[ZXc8E⣈ijU]l4ih7:d3t6=KM!կ%Ivf4ܒ0smTIJ6}O2#D ( [S{ՙc޻"$qg<?}?SK)S[-j֗}۶Z+"!33/EDˈhff.DŽcCA&&ND1\ʔo52^ 8L40uaT^-]a.*x_Tb?X_ 3@ M9BVJ_q~3,|s 'ɹs%Fi ]A-33y#"NAkx<ۭ֚vsZ+IY-R_^mrUG;I2I/8A^zټy7X:2 )>]$ʳZ )D5%^>p9IIPZ5F/T_Z1NhQ9OIMׄ^)1?)TjbgED5MA:0Œ %A7-TF5DDfj~qy_J)ۍv߶mT]_u쭵$Y{)U^ff3!m[Yx5ʔw!~pxM)ݯڲʨ I^f]Е(JRD Yڴm!+'XX-VHiscQ̬ܯUNsϜbN$qUWJQ"i[~r^v{yynf뀊IGDH֜/Hrv-#GG~*,[PLr&iiDG>kc0@L mLܑjEWqZ H2GJJ*J Zda;̒S,6W$5UjQXtV&&qn9aA?igQ`4ø%a$,ᴤa+03`:! 9#k {DED4Dfgo!d0Z\u۶~߿j۶R^zDyHkk!:Ӑ3h- V.lz˹jZ3| _ ߘ.hf~Е?OO@U\ +"ݵB*Shʋ~Er.Dd% ::De=≣^Z5\9ce$K!biuZ*5pCfqHRݣR#qZ/ȇ~•HQϤwBDș^j5GR_ jQ@h?!)D>~iCR\j.mNy]23&1ĕL#9# K)REja kh 2i(}*RG^l.LPkȩpff"cqX័FhfUMS`1*i4cTerT~h!)EeP'KjWm2<{#=6F zQhW,">3_)F?`4 TbQ-(19[ i=3\ $<18=#/`N[b(EcCx J3KD'E(ZO9ܝ ɴ:Z2.xP̜iSAQ祇2On^r"rffB-]ZqwUd~hD2Ok!3TZ<̆p̜ihS{#C'{J\" 9"hfIBGE@J݃i[Dψ 3DfFgfN  0jՈio%؜F bdXZ$Ќ@ )`T#$H$1ez5U/[fi$BSA`|(3/0`Lo+̩s QJjQ_Le쓕{SWCݯmYDlyfJ}$i0+M ~3HmznXD٢gsfXV\[|UkRGuL`q2[!DgtlLsup*?y#]cJ~ebϮ]%}bWFފ, Svd aH.޶nQ^k&W٣[r&T=^aHԘ d#;\KO&d+<\DfN {F~+N(4u\Tc l:={9" >HִZ?RGpU"Ty?M 7$0"@0veViOdTdTCq7بK<%VQUjhOJl3z1ݷmj޶mJ[t۶m.N﷛+,cX@vmH6̍L & F)-IiH @$LMLIcq9#դA3+wߴ A<$HbZƜWHLQfv :ԍ8)3?E8XEK_rxT:yC{w߶-/~jCDdKn񃋎 MWL'iQA#Lr໻[tn_V~eE^Nx̌NE_Ϊ1.8ɳ!YelMK{^k7LJٶMd YҚBRA4 玴Y 8+X !;(8v݋UNqH3DoKN6(X}Zy)Bf"b?8u8ΣާJ Fa%+<9Ͷ*h̒  gzIy&.0 AJH-Օ쑡&iT*]&]}iYf6>"gcf6&v{=qܡ#-V3s PˠY}FÒ:!XZ)ZG<33d 3zNl!}>򼥑6.ݣ6/-  hDNGnRbL鷈،H&P[W:seRP$} ;3lċndiF3CjVpJɖC+<#aEk?/d5IN#9fj21i֣.e%-ʤJ#-NlK}S_ >:W-^|nȻ~߷m>B{ :.VĦ Ǯx:Z 9:;#f5[j)[sT!+H@_iG$%IF ;/+04(N9æ~G;#itZ=B"Z8C)Zhs}هɒ^FIpȡYLv˒~D,5]壻#n7Ck$+֕>ͳ:{A%{:"Z8d-N\aK)df)ZA޶m^Vv\y133'džaxq(ϴH44v5Q9"crܖZ'dȵHLCX(Ƥ$ NJӐS/kZ胙03\ `<3} |- Zetilfx T~LW! VhD%31qEv(+! y^#*IJF^J齻o3 *QJY#*PKLm6?+2^}(8A-"YHLd ""Ȕv>ٜxs:6LM$浭R6TB1qMBẐLLPIZgRnfV:;&)243ՒRD${ HWEgjN$?," wґXǏ}v!\G:+ "t\̤M&Yɡ*R?*<{)E=Z7u~ي$Ȯ@#5L0EselAH' |K$ @wҘ4%q8ˮh퐋N)A !48 IDATG43Mp u<|JؙY7 >1p ͝yv]7ꆻ>UK9c%M(%٣2:5M"v9+e*.BWlĪ0"~]Hک"eFĠ™p53aZKU%) AD+jUmcΌʄL/'IO΅^Ԅ dz]5m|/Dļ3֎ffT3]WUDD3=8c;ɭ9dJfR vmp(Պ1}O[SXms(T.Ȍ%#>}u6UB[ 9~6͈մ$ VJ^YY$>yH4q@\u;I9 bfVPRYy0ˊFM*.:Gٸ(~][ a,3mYhH>W}Hs j'.Q*P>3E.⊈֣S&$ݽIVeFLP8H_Y{@`d̈vvyFHfyݪo۶ղmnLs{{{K2JȓR NB,fF3+jLlZT7\'AVӌCt@T<,a &$I32thݾQV Z|~RZ~|?^yǡ-f[)iڂIZ0TG8#j $afکp-4̌DD9rL:k)%g[/6f$ ڳCVܽ|Vq>OK!&;AUHkU|("bUgfoXhC9ˡߏ0,M<..Q~CQWX(Gʼ-$,^%3438M4lH;[c<ryFfnj5`~景?^_?~<<[ȯuCIs934 葔# "Htju nmw," 3F ؑ$?8,tqi꼁O8LL-1@q7|5Vc lvwF$[EaN3w/f\"#HjYIjZ)jW*O':fǁ 4W# ٨ rL@΃ʽ6#G m47+Ŋ[ټX#lx׷_(Vdhbg`^{FNf ɂi)oyaEƗ/+a&5Wb-9g!!ڲs"4[f5O'"3c4^PRnV8_#'24XL%ލpi4Z0ƂYRJ9zD&T/HgLf@Ϩ'9B6o|:3+ ذ‹11LI` r˕?2/i=eԕ2Efܦzh[}P쏌hfV բoR}7ӸGxe8}\괭"S @(B43e9I>fn Is_1 sbiX1Dz?OzmID: DgVRܶ-ݚك3V_.lG2]$nL25JKWs-oܽe<.z(k,e$vQ~Ci|zt :yN~ !}n$)1>9XfF%7189NmdJ33sF5lΛ>j T)ݬm۶K1tN7'N)!#znA:qzo"ԯzg?~QJVkΞyO,̛{rE)mczkًK ױ= "8<@ӑḧ3ǩ17+;nxJ4h`9!ǎp./ݵskfC=p9@f`63S-[<ϣN^ﵾX=8%o׍_~eYjy2zKn_jZ=[1*t<@:ÍSܠ{zCERqv@41LKeQ]"9Yoq9R {tɆrH"*LEZC8.@`f}{66Id;E|۶)6f= ܵ 1@*x~J!{Df8J);_^~oo/n7ܶ4C"E٦YifFd88yuۭ~rjl-x`ڶݷ/ya;yV|ݾ~ZFvƗe^)SJ0 HpNeVL3FĊcBZX$P IfHIX_.1͊^4Syw2@~_C'V} B R[33$Lv23ZN dkZ}?h43\0'2ZfbiA'`a gd4J)6uqwW h~yl{=vǯ_~2/ҙf޻9&{oG?}}?hghcl{y9㨵Zb{D֭zh=/~xǏftv7 Vռ؞w/UnV%IDY{o}*aDZ3`ֺͬmMK=(9>+= HceՃHo9'VOن{#8bd&"ZS H Ȣ8ψ8R׿oB8q8ߏ<y=_}"Ȅ򾟭o}//o9v˯"7{/۽ܣVZfm+nfܪ=[-aദ#uQJ"q-Hr@M$%QDV G.bFezS(0"bNf~&q8 U27mFKg)M`jVKfKzJ^*/fzTN9o[V8sy)[///#T/:s~q8?(|xhG m{{</_[_o/߾}83-o?˗R~8߾~/[{y @؆bدc uYء!b\ 7ciIDjSrTơR :7/ܶmo/\c`)Ie$< 9L4M^r |>ZWUR8Zoqxy|<Ǿ?G7`Vj1ݬl[j)^FX6cyum& 6L- ˺EE~uw` ɖ{??q]~=#%ym,UTyntŷn~?vx߿{co #4R%}ǨPע=y{4&n_^|oެ=[ٗ_~ۯq}Cq3xDiNw/>W/^($j?oKJM[(4@arܼIf?[o$Ɏ#GD.0-225iNuwžpw3gdB@P,Y aoqmbD4D1S]}Ѯov;Q҂p_#VhaN8>@&0d`$ƣ@GHEHe(\=Zݮ}۶~ߣn}hMѨn W3˸zD PԀTt3({CNbat+GqdPNt:]l?LJE0I| _%GrMy1Gkm>"InT+TzmZ1"{kvoc y$*N'ՙow>.RR̀ZT3chcؑaZیFeq%MPȜ8nF|quR!۪ICLh/gAHvsPܱ&:[)%9r)Q ]Dhƺ,/?Z1 m0{qZI2uR2mF.KJ, ssȒ0Nr)+B!)D9 |6H1r74c\m[=ᔹj'|(}}߷>nu۷{tF"s})u-Gu'嬖4mlmkuZ Vd IDAT !b8wߗ$rS9hf3)K53Xt߷פu]$wM^7Z8o;@GFamhtH*}N#gR4VK=u]yY&GAIZz?w1LxFilHu?dʘfZ}~kn{mیrPtl#}wuRid''D @ `FҐB@8)ݽin+rC zקּR t) ̬l{Zlk4)PЪ &""r7X)Ef1F~* $A{0~(8d(}u]5 r<;]Υ1F~omt>M6ml˶m>8m;g Jrv30 {C{zfQ{L.w"$ ‰t>A 4A,r>4}ɦXv5֥js9PGG@a 9KZ,٩.0bqղֳ[ u(b no~p+wF Bh@A$EtEH0+D AB)eiP[*i)D1Χ}Ӳ,}}}}ޮ}鐘2%E % ,_|齷H(ŝ7 ʼn1ʑ+aH@#qG}!";"PeYOO XtrZ={n>:.|v]OK1+󳻗|߇﹕z1 c44$K)@HEQK]MpxFK)(@҉HR{$3 n#m]W/u#b‚!3[{ I"3)̒9$-id17N+$-dc K=Gf˗/(vI۵vbk[Y"X !(dWx p3LDPPTIyg)v:,ZJ)ry~~}/Z۱ah1b$g'9 eYK]6~^Ih+I}$b" pR(=3(ge `2vov]zﭵ.OOO^>\Zz`ry~/O}Sʚ4i&gAH+[ ZR⥖ʖRX#\#'<(XcYl&$ha4SdaaJafܑ?T׏JgӶmKN[k}vY߷1F$m<00c3S&}*cHDH*杽]=<7 EuY/ϟ?wϟ^^_o"Y.rR+႗Ǐ?|ÇRJ۷_~%yOYҲ,!r)3!EDh~ld{tuR*#ZKGeweY^çPJ!y{~9}z?_cHitK08MefӹTVJe xO8bơ!fN7]VY&ˆ#L4/=9!{.# 20|$"ڻ}󁔬^J@ w?Յ1Z"۷;IoS"݊t$>FHR.^1ac1i{M\k VNQ:Ű,Rj1wZp{q3A `An@I _pB޷mKnas&#(AԕLLd$RTEfVR1ƶ(h}~ Io0 teJN9DJЀ6@!4L2i@֖N/Oz1~嗯_^ ET îq}JI}?_ןnfBTRo{‰w;ܽ+EHR}^ﭵZk x}}z%9m]>|O?py~\.zOOړ$}K)R4;m?14zJD֦w8-.^*jV#H0s}rZ$WRJ*&f3ﯵjf9'M$1u$oNLN1Y|NB[\@ du]Z-p#R[XN0#fٴ55 Kz33.u"FbD-bn˯__ۗ/m L&; HD,-_~%W_@)vݶeu$IFF+>nKje~:﷭,!@ttnv{}??zyy崜/?_.F$s8ҹ+c Dd6{ V.SqVs3$z~QR@F  Zk)K);"@eSKw;;LRu֥֒ P[,ۜ!˒~??p~N8t:ޮ?Ӷm>~|{{#uh8*WHZ2Fhi'{O)NWiY`ɋiERfpҸ5[d}ߕ{Yq2!$o#9'Ѭ'e69:BPkFP`D Q-F*ENnH<ܫ\,rc___ܮ7v_o?ӯ_\w+Vz )}<ӂ(SFĖۊv=PSJ===-~O?\Β~}m򻷑Iq۶%4ݬNjǡ%x7R><=_.۾W zdL{'gs3c`˲F>z4U/e9弞}w[ȬAsh2_jcvqe9ns,ׯ"'r4FrtB$G1(.6xp"(4ZCLeHٙ;>4D#2<>FĠB.l7;1HQA h'rڗROH_~>/_/_}žy۔cL ف}}ouo-X6z0Zr/"Ǘ|ӟTk]5RF {14m 3[|Ǐ_^^r>/Rke')>~߶ @Y8ɐHtINr\.&xռ+e*tL2{bbTh'ev}:0us$S=eyqR,K-DF޷9[12KJ;'wsƅ"$̌1uk;EnVЗŁfd }޾^޷}m~Ljc$۾^ϗv?ןy&d"SS D3;-,KdÇO>%뺞Ou ="nu-˗/oozֶW1$h>NOOO崬H6= #)SsWxLu'+.1Da͍(m["$k]deY._F$GX}Z:VA)e ٛ4zM}ĢzVi_bDBLɸB$*{!1w% #=RDo!#$73Yݓ1rcD9OkRz߷mS֚>}omQ^~g3[Kn/?/ThV+m۶my=g \. |^u99>"HҘ#G|{rv1R1[MIc̲.K|;A1FldzHz)iJPeX<5f-"~{{kRVι| loJޟ$iD7CuuMuXW5w֚,?ނecc^dϳɿ #C˲Z a T$00XgF{A71nzY&1|zc; !cz~~6>ׯ52c򜬓04T?E38bfiy~HryDׇjdCh@2$c S@R|S+g@DHG"jALcacad9Z*.OXpl6Zϸzvdl]ק@51t"mۗ_|v>3 GKD)Zk=k}Y_,Rʺ?mv#hluA/QOn.:6$&bӧ^hD.V"@0B<4)ᘤ?&,r.'wo}ckbL<'1kMN-l!6W8Y)sh岞1!jH RW9"&&o P&]f-k轛Yrhw(>I1@jD28+0%'g_8%Am۬Ԝe#/p )bz:4 C({߱1gվlw7{3NvocO%QH#s[۾E9J)V[Rj3*2}8%-hFtHz-+OF&ֺ31@Lo yslC2oaF%Tu҈Ri0I1IAӥ=FRpb>,v""di >{ C((6Y\{HC=ZB4p0Ϝ\C({өI<I/'w]v˲,r:={6lYcwϼR"b6|cwwat^3_9e)f6MЈzQHRzqZJ)G tQAPM21L2]&iVAJ27ifV~1c8Dc)M|rJ -^d&&Z5\}{C44"JHz#Ujbcç4c,DC(0[{G"DQfpB~K*ռ NKdZkQ27w,a#":-wn۝ne t)r93Hz_{1?Bҭs7S]J)Ŝqd Fd`Q,4{7KGQz"3FRl~1d1B'CR; LCa0a27̬t{EY)ŭ)KIEw b @FXOGg~{O>.)rZ}:R |23Ҍw i@^K֬RnXDn !`DKΠ!i. " CD8hȵ(fwED]L$1̃$fMfL>pٱG$)H0a:fΦ!bg vTe:^663 a,(kA(@M;ya>r4-)o=YۚEy̘M*cIJ"Bn6oˣsx;͘(Js2_')1<HRJYϧec/zuqwS0bF€K IDAT; 2JY|! io@1+f)e}cX1o]uqՏTARM֊CRb nibޖuBdfrX*D?eipn1%='̹%GDRa <{I%;D0]h2pW)BK)}pD`>C#MɈY3a'WIGy\ ;\k0,$l4BLD=VX E ɁfvP EJN`=)Z+ٲ,Kn_]DT.6>!ߛc` "2%&C*$C`a!ᡯ!#)SN1MzZp;K6HRRRٌx)xO27a#4C1H%CSeU0)2U,%9Hc^b5Z |,@!hwdd @2eSP_0!9M$J)^t z)r;/r>_^^7% C8hbwjR ,@7*B@ EDOnӍ̬H3 FJv% LJ!r7áafᛵ 32D0r4؂4A]ɟ:H;W=09)"]QkL袇4 >R$zgdy4$N>q)DԬT|B44#eݭwpryzzٿ0rdI I3K]wj+"|P'yC&\LED Ak0I"鴠 $)"|7PE MB0F+fս4Cs N99 AX2`A a& !Q~8&.ݺ;s{kA19B30"6;W~0F80)Hz7)"Ib崮U_J] tyYܽLosJtZOVf|+)ɒ 4]%D>~"IN&23wOPKݿ?;4R`RzH8Q@3r1P>$&Z`jg劒wÖſzKʐ$,WD݄v2A#mF&g/Y/zl 'FD^5rd7&f8'R\A1DpHhH"ҜK3/ ZO˺-{nx) dSN A`^x8ĵHGDB3 $S&-|6%!Ip3w"$F?DA@ 8ЋN|3*PZAIo@hnixZ:<=l_`oF-'%H@"QC@dU 8Dy" gH]m AHM:SE)vsF$x_@&l:Tcf B Dn)xIB-ȕ|fRWx۷ǛvoFAL $pR L|TcDtDFŽD! .|s J1#tBD4F@Ӭ(!FR0AjQt|bqQDfX)nnz Z H'R2/!H f(Jp$ 4D愠T2^Y 1rmŕΚ;˞4!$LfUιva,B%$1gos19=}n2 5T&@)B>R֗kk2ϤRϏ?d&oc,۽IHKZQX3`k Sތݑ]ċLLץakCQߴ$K #c(vϓg"Cܘ!I<%u"K LkW ՈO1acKnT1vsJxq. Dt0aC67$< VN]GI)uP >z<Ͽ?><8  % QHjE7FrsP*UWZffŹUSf Rs=t61;BDc|AlgBˢWH%c{f/:)Emp-I\DW^ Gf5 ︔9C$a&HRlGa$yc(()aM8??S5QtіWRx.l  A։3!!h0S*S}wG|j5N,E # Lmx&z3@ Kɖ~cuU#SzvTFӭv~ȃk$m NQ]W\lDdE(A#11cyΩ _okƳƦ^UdZ^WBLd` ǁ 渝x<3s>8s{طmfUĞ%̓ ޤ,Iʈ1[̊*l  !IXc\T=ek)\ʴYO#3l!:*=q_s cs]4eGk"4,1Rfr8v3"|͋îc1@Dv%SeD!)ժ9紛'(ui qUz#WY`%Eӏ2I|<}QUY*"TYǩ$@D^GFuW G0PA Z Ϡ+do WpO_ 0YsETvT_d=`m&(x0ynG1sfm?@s"J}[L'L ֌, id[Ѥ|?9qH@[k"Ḧ),9Aq&T}DxO~c@xt އ!gFIIJ5*ge-ƃy㈈9Z|3+]-ZRH!dJR*o%u:Oo11g#W`u0qwx<$1pc,*ꢉd&Zh+O7f.Xh&r*oɈX0[/{_&qK]“<| h~18w|FfŰ;5CTq `= 4Ad8zk$2dÓ^|^0$8?睒R9sV8i  Rf@)v"/nyy~՚`C//J&;OלuZۯYkû~L j)=ATXHEoy)i GJoUtd_!gd@~{U-DH 4ʚ2RyY(ܔZ ЏMwt.]|u XNBܯƊbC<\/XIcjKw{@X/&)rɈE஑b2<\Ɉ!IlWq g`Pyi8YQtSr}_\͕3KHJƀ2OA `3$HPJElW)x "Qc[n±C'<'P#փ&"N*&HR*>]lHIIDYu4s7 ͗h t(=g><)2''㠽I`M#g4hIԜ6pL*mv?1>nq;Lw'y[ןuʷ@w&8A}ig|fGl:LVd!,ci6=]Wl&^9.QDO҂9O(bƐ@mHvvU{ed):)iyĸqܞhrL7QeZdΕ[MwXDDԡ=ӉJKLDksʬu-= vgcHc }Y:<ÏaY;y鷕@;[klYKTitblט[ܬHX> G"#)Y U+q"&~Il`K(-s1#bI/ڋ2MMPc=H\ͤ%")@z&JHW4j ͅW+h)d/a .@~U#AQLE|~4~/6~;QqρOA"" ;HZZd g70Wj;9ׂa1t}nDo!s@ck9 mj-dlR̥$b婬2كZ ~ln/C^s+d!]?6@QHt9gXz2ϬUuı]9D߯ Ao契 +bE=/D=JusB>HT933%98sU.˰$T (c!GؤH2D!s"2awlT*?[}*_êxS)14Q:z-+PDޮ9m3<>:l̓4{UvwQa:msˎ-RNv$Ld>΅cJxD#8$YYgW圽rO+T"Rd0VE6bspfѐc)l8i|=u]4_ D@D@6A n6eZ^YI&@ cx@Yruյ;0옣o Xڈ^߁T*^tO'R<=ETfb:O4F Sf x lZ _3c _HIq"b 9]=n-~`ե^6,x6m ڐ-n9/"^Vm@b=\Mn.^[rFsIi^_p!8 8ӿ 9yߛә hϋh{V>)sDD;?APHŇžR[c IDAT^#&I"Hd/k3U*[c|E , V!+A׷LDH *zo/x{8*)O>f8+ncxqhx}d\#$-;Q7ip-,WtŞiLK59qH,L"#.PՐP""Jm0c7 sp/=Hvk-Q =BXׯ;$*1~ƅly"x4,t߯X4e1\p*:Ȗ_$hl|} a}9oaW'!%וZ׸[o_^5uv즬w Y?$f羐mX=ggJ( +7!)z'38~oM~>ס "acp]#iqSf9!eG_g@KS BHe[V`OGu`O0Y+aH.]"vہ$i)Ds[.B[9y՜ Kl f&P_G cd,<މ'* {hmhOtз$@>!#Wp-hf0}MI$R*tJT?(ꖔ/ P)XJ9krw0۸֠OJ3HR 9٤WT㝡AUG<5$xp?Z-z{Yx ;/[s1FPyNݮ/,=iudW]ĄBS@/ZXZ$B~+9W~LNs4!v  (#qXKf w X}Zs¦ .L@)Tc@1K% Qʂ dyVq y yO .ZlߥJWv1Z0é"̔R\6@2tGEgko vYi$)P"yPs<h_u&lN)̠EH 0)X$Ѳl*>R9Uf 8xM"w^>֭_Tm@uB5ƪ 6!#l>D[ H~ $lM_ 7⯯;.LMh ൅j 0:.oBCm$/6v\og/Lk"@j1amoJ(q_9o>vX +Y^YÃ>Y Gjnk[mDt(C$.37].uVE5J4vT$^u\ʭms^^6) 6X<̩>>em&I&0?u-K@bop_VIHZPbċ(-wGz3лʮ~d&TOl鯳1Nv'oNpnV=uuO|SUlJ#%46T'Yoݢ8s &AIYq W[uLWjk`R8bLAH0L0i\lj F_]djp;+*!Gv0˲%/6*.\oFgP^W"Ɣ>E|ɹn,^+sQv&(8dE#ef*KgWK~/WL6}_,/ܖ~7VWɞ4=#Y"s>̻$9"gVaf7ɺv\od*7 K(ղѴInO@zkZɦJ Dv"Z% QQFa_FZuz@0܉fk*9}I2S$ȓ#LjP b\Wv!AB9,D8Iy~[Y HپS<3ϙsf /:o[ze2h!Hjs Q]!l6Yskb_mguYLdfȼnyf9|qߏppGz8>aSaL@L -^:} p>fktk~ 7`m YD0`ͼ![OpZu~ը\<|ϧO3Aܣ LUD];IH&hه'/AowRV8Xܖ/N@E'6U~It:"v|^x<_ I(PY ̂-܅IbPߺUj-g/| Tmt)L)IbܻLEݖ $` KFr&23]<<#b{ꗮj AHfb\ 6vLr!̵<./Bxv{>cO*y朒\R0+<[|Q=Ӣ[.$麾XO&S p3UTrYj@TX?' eFPb؟%:nڊl_ҭ;9VOWH2sO*+\A SCZ2H&A BkqT"`_wH"Fi's^3! Cs틔"B~||Rd" EߠnG+{z1w$FD]i?zjn#\A/7Q+VX ZfUֿI~3{pI@iCVOO;@6 5s!(@twRNC+z I%ݳKˆIS5{+cn<}hiZH=4n^U vI`/ m^eY"#ꓣ%zys|ރ,&&H(IP3pIJm w|R|HX  Y*F pMks>s995ޫEy`A! 5)u1`A* 7df$?f|!)δ1ơcy)'㍚sFD[lg~UO@,^wґ_W9-/v YJ'Z!g+Q(jW^ޟ B5@GtS$H\_  B$9k:&0 2nEĥ%wp+QcQ @#_n$uQ#CDDP"S,J⑐JJ/VqiA`P#dX  əd*rx<6쾛RY#O`P_.P=s_<BQa=cJe/ž\70ڷܚPp0dPʳH@*M_KJ$!+:( emb֙4d z𮴁V߮ `0l{=IUII#b13 a&"2s E*zk $iW;0m6>w7o+^9k7Dy$̪OdKG ڤo@{ *k Zw5^ur"@%+$PUlYU1 *ػ!ω~",9l[QӐIamo.Jj1P 8jH DfN=3Z)VS:Z6-|~h " `Ruri&#"Sb#fl.] X~/f٭VoD(^Õ`p Je\i_-⿽jjF~s pnPq6ސ#ihO/^`kR]v8X33"FJpF55︝+0e/m%*8s=rvͶZ.mX^pA1VdfWV~ WO׃ᷰYSv0e!,3bI~$|2ΝixB2,+:TZ Xal#P ʽx|#NԷ+lzMҐS&EݍAMƗeP.r9tz'BQf-2ht &U lfh;$d[iS.Y:gdn8s+T|f/_EW_6!ZaIk(;8.b*mV_5[R߉M>e4}|*)0dXRSO>cl\bI{hÜ_ @BL 9q`P^G^fQYq ķ`)Y' O*_ 0Y7ǷplP%-f;*FJ~e 0;Kp \xʠ(Dd$5eׅF9sղ7aYT |@(2}0_ ?JWF}-\nm2LsN!"{s$1-+IKeiٮo=J | G 3N[ ahAa{@Mb@pAIŵ{q - g or=@g?M:^2}e&TJW Gl?o#" bwޜvWff+r HM 2!J y)7%lLe|/ҢluE`fF M_azq{DBfN9f݉e*=3!ؿmݲZd@E[v*7H@oѻ$9Q *w[mڸ d˭Vs9Q{}K|b ޶u^эE#UDV;%*($&IN!92=!G*3b/MR_@нfnqsNJ%_dNՌRڡ7%%vb~33~w6a`WNgݯֹMV+aKR&T A3AXF#C*J*3gzCLvM$R Ef&(7eB4}g ^bIdMO :dp VBؕH˗(oܢE뱁bRZ([P֞ZWxѧr^ ZN~oclLzf%pgF "$ƹ@Af;3Tf}ژoy \IJ 2%)FyeZ2<Ox.%xUX*nZ\0|>gds竖+J_%QI`Kv1ׁSWzYw4[;%%meDoݒT>5KPMOh.n0~rQ9礵yC.H`DryAnW]3תHپS}fK-xyfA-I^+Ӑ]~ۊ/ wʪ h+h?@%[pyjpl ;з#j3w˽6y MxA&w-i|i23%H)=>\c`e18#EDDxޕror$78IS/Y.?|Y^j[Au /]O(3Ϝy>9<3Sb" #($)"ԱűۀRPSaeH? 3\dG( N7@0N w$ e{G$ oĬ)gI,2/<{URDڐɬ O&Iߐp '%Rc}f"9<<~l=#vov#n7ܒ6Yx@r<_[.52o=9"Hn*AY4M x!U_G^3gx|?yxs&3n ɱ Cۃ߁)\Wm qk¯knYoAm}KApFDoH̜~%=BNUxfրiYd`~'Rq#K:VqҟmS\-I#)<|<9'1oon7!"jMV6$Ug(bF5e v*k #|xyL_707v|]_a}@ҕyȭLVη߹z=}y~jO UWf|eѥ3$A:=C% itrڿ<;Vo+ 8>n8朡AdBa>>n3H]^BRf>sʡsFN뷤Cy3LyG:v18#.[lXtbMP6L眏x>|>1E`65+蹃r…ߟ!qYM۲N+s1 Vo[ZCZfTªL91k J2"|Pvn^|<̙<?9O+4cNfl3ix<=ϙc܋7noos51T-uFk2ry9k8ekIx?8O6,_'d_v.??( fDQ?/d[9`]v;5^g%΄f& 8=lZ㙙l-drx<UneD[5j08<'e=PE ?3O#ofKBP2,_Ǐ~'91I -_oЮ*N씝~+{Q>R'rsv]@ALŖy? vՔIJ!?$iv#;}HʹF*=n۸m}Ƞ#"셒;|^v"0bB#Ӭ#'NQlZ~$A0Lqҥ?\lCuK$m=jYH凬3„\c]5ƚ?mL,m߀$$ ˵䚯|Oq'F6sI>l 5y GRrqm9:DaY᷼"ph怄IHJ‰zԚ=uۆodJ oqf{cİ?SFJrd*JzpOYtw*)3OT><~Ǐ43D(g/awׅj-rFp!^$r 379| jp#+E֚I]Y2|̳ޝ+nkAMnKFTcXE+*ݐ 9m=x???x<2q;n'q go. `21nu}ln$ݳe]ڊOi1s&׏_c*b 銟Hu߷+!33Մ^QJ;G+7jv!lE^( e"wwɡCTMI@ vO䜘*@@2)uI91X~gTp]e^oH039xH)!` [$ .]TgWtuj;ڞ^<(&oW)Q"Fĺ5lH2Q?T$G_̓/1gN۷ffpAQDR0g9)$%GrBt>r>-`[9ewzgFlRrJ'^Z>Cs<}Ͽ~?CǠ**o_U{O?ҫM7ᭈkZ?|߫LTDR xŐR&*lD:qEI'[AZZ$GqH K0J{ILT[b)smLyc9)T9"Sc/栅,3#@2G9sdz ܖ$q$zޝ^ʌD<8u)E/T-Mk&sΣ8׏ox<0^KAd͑m{%~ '{ Y, k ?%Er~ȯnY=\\;i0h5etq1WԾ;my,aC̵Nk?Г7˭׬Eҙٯ+]iO{Y-|!/y iJ}d`k6b󈵞sZ1ݶ>y{o5#Hcή*9xMMl0Ulʀ`FA( 5 GfSn@6~IZw 6~3?XKn9NͪWzRZ,kIj%ب=~sHV<ƈ~{{ Y b;)9_A-Z1Js ɒ`d>f?y?׏z^kf8Σ>iۥe n =m)/*1չx!N9,- {H#/B W6r6&o&W .{K@,Hܶ`~I/  <^(kPs_-d`Dl;׋a\n4lih0wv=[Zo1"j{x66'WKR԰DвDV7!5н>a~f5zޯ~?c $˭`絆݀_/]@^&< c?(gzWRlϔeBYO~I@xʫ࿤g1@hA*l8^$y]UXeQw<Y;I ~2IDĶ%f#&z<0%5u)lU]Eq{%iI{:mii@ S|gWR2;-!r=O/%>[WH6vb1~eI6*CvM e>m^E۪< ?5mM@vdI9I( 뗗wɘSVvte$»Xn=fu>H M5kƶ1o޿||>\3U+w Uw'`bG#S>?>ޯxs: WDp*UU\)YHek5xnolaV\?^ 8RM>YQJ0@ z>y|bRA@SwULʚj;S&%XyVRD.0/P2*U+LڬFk 8gzu:V5rRUJ"HҔj"eN [E'Znij1Of."K8>LfJ}>~~߮8mJd1"HrTIs:*,V(InK iqI)hKPavK*Y߲xmckyvx-Qi!̃_eڒv?!5ǁ ۑHR-r^lq#7Kx]E[Nu _oϦG>6USee5\5&=ic!,g2muS=qݯqݏym<`w)}\L<_˗y$Ăj7P%Z(L@Q~<}}o_?n8~o),F6EU-|w{ Hߠ%IENDB`fotocx/images/batch-photo-date2.png0000664000175000017500000020101615247006660016210 0ustar micomicoPNG  IHDRz+rHtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 332 421 1 0 ':eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:421 height:332|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:378 height:299|Z4G IDATxwXTɶ>|wQ9猨b9sD193HЄ&59fV54IPT;>OݻZj[ZG߾}U+8l/kM˟YMdvY;6̚5bEEş*$-nlmEEEGNN P= `Yݬ .RPPގsee% {O,n+؀222ɒ t"g`v333Q,{jputp u4bPPnjqQbÈ8{{#cҌE`̘6c2 Y E~de2K-4 ~geg%cL0v@lηM pyfM!0Mq|r?6n܄co!!,WS#_jplE`̞eᒯideg6 #U7nr2q>X +W`Xnç<$擃|3`ƭp{/#&R0zrDR|W/ǒŋb tpuq{T^n]9X4c<NDZuV~zuKݶKP_ezw\.(b>ݺm[`ߑSH~ &̔.0gܸvkV,ƢEtRZ6 ˚5k/K0|/\oL2Cˈo uT׭_E ^H-2f^=cˮK}f{Zd8`#mk ?u=-)iW4$U40jn>mdxp8t!%Cw /90V }Haĕm Ÿ|`-TЧwo )% u-][aٶÈKAYi.bb4Ee(//d] IEt Mg ДA^i/Yy%p%_&n KB^EP2 OBpv톟rrrmmmxM J@_G䓳1H J!PQU ?.ŅyxvXOJJPe$gE GD s 3S`9KbC'-@^v"^؍fzPV3ÖO^SR$(L1 v"3sa1Ff7Ǯ" @sR_b8(dt+͇E~Sb M1tdx9HIc^Hͦ 3!/>]\Z KFBv]>wPW *@A[欄?-l$ᐑ%`2`lY{ l]C~2,̌o6vZ2bć0M9'9l|>x4ĩyV3+oB!ˣQUu1vM'b!'!08̛A108'y;tLֆa3Hn|?v#`fdCs_a1ba5hIsk1g6+jUV'XqyvBmm-`ee0ob@?a?RFXrEUHzg0BMEWΡfֆ2sȒߣGKGCUeAO]+:gM0`-+b?6:-[7,bcu#5%%a`hC`blH}B~t h_y,ޛⴠAUE<I-/`xc`@@^0cqd"=!T~CPSU$z;N"#zk-ts@V!=m яBk#AP2^gWk$kһ"(<2<k%2 kM#Ye CW7B|(/./%$h\< `L2&-߅Jg)-h?4F0'`,A'M]Chi mG^AjZPgi;y|!(g$9%(Q%%W?b3lzeҖ5h3~Ƕ~흵!88Mn&{πS}f+lA9p.\KKK@*_^bi?@VN5W֮ڄ^ ^VN C@b"_ +m)Lr1zy`y?U\iM *=OD) 1I~z GQ1dbrQQ!kbeW\E,4TL!g@jyן؎PYǶK`^n0c$e$!2[_}u @_@]: tQSSHOw!(Ȏae:WƘp|^DAP^CO] )->peBj*\^4X5F}Ic܂؆ha1̒09yC^Q{h_'%[g$ԁŨ8$n1m , $'M(j~+n<Ce1 JJ0 g@ض|8}[yY ĕvڳgB6"dSqzJ@Od1l &Ϝ [ohC wWTW!+%/<'OZPl|(jz%Mr͕#,ePp_BFX1cѕE^I1zq EL'Mߗ%f0$BG:zk#zBB(S` QR۹GyE0t#IV3KKiVNn ybEX2t1\C jwI \܉FY-CR^^ho lr} &kA^Y 7^Fyzp64 O.A(ji/J!YF hE e9x=gv`HchP2ى&r`[kjbȴ.tx=ƙ^ @X@zgctRU3†hz&EE P%,!IaQ(lLII#ḁ^#njǤsj.< 4O1u>u@ϲnpn<(HHt$8*堬7./.tiLI)lyJX*2*k6 0DKXq&ei @?wFOQ7( X.+ Tb %YUM` uQ8$Џ 4O6Т Ժѡb}%MiA*+-}I7bE_^+ѽ[7W&@y^8 9 q/8|䆟4i_Lˣg%53v6QE ȑ#ػwoϛ3M[)_ Ǐ Y5^xC>lق<Gsދgް>ɢb\u&7C~GCBæa!>M~}>w(e>f1SNɓɽkAFPyAb i_8Z+.PԷb " ѧp 9 ;ɝ{ )}1f 6ϗ3&-Gϰ$۸mY>PU 'N 333ܻwO-;vok [ cvKwP\!R.v, yY:\472qeEqߟ6mӒpx:t  a*& T8:w_hܿsQȌ}ա p/pI%4lƊ=یի6f, ^GmW`ɀ.QzCl_duy7wjr~mr*R:xH[ϲ xSP+[)VK FVpb'%#P@UUUzq P4z?S(hqDR=CstD_ബV'v1րK읶h:[dZΝ;[-έض.2eZ3g;潰O__f3h+dG@:Cjk:zfJ,Ӂe\  3z$,@Y3Fވbn\1(irxbK)Ho,3~#C(ES +CIA:&T?1(jR%^ZFQNw,YxbȂj?QKOyI!]Ql3%X!myA,v]@qtKqkH*ìA]13in(u8? Ƣ/RaЦ?CSRrסn=):l8"# iXȓN0p-ll`fbyiwGg.[ 9:DbĨQD *6]v%|,HnKlJ3+[du3mɮ[sCQ-ܟ3ϠE6s>})fgby#&U_R6. eYIҲS si4pK_t?uF' Hm+1P_R t1KvQZg(̕>aX?!?⣟T`'c^ >] : E}V{Mii hͣhZ[Y?u*_bh5>>^vՅRSR%kbQNv&$=ITAǯ'a^HZ*{3sLյv3)Xd Ĥ$ %Em IOӉMuu%%  *Ɵ`HOM71) )Ȧ,A+&2ӑD:Hkj:;^$h鴭<&'5PljHMQ[;4VDr2}q6.HJNA^~N2t:TT_̌4$S?E66C*`;U c/zS/..Oxdc}x2wG"V?&IȦVB))8NLgB1%$Pi|s6߷pe^)I7m헲yQ칶N5mϟۏ/^۞a0ctȨ D@Q7 X([~ ȋ@̞dd~-ȋ>39g9j#2P/Pޔ2Zk?qc+!/8b,Ø+VQa? E6or|Ϣ~*&߲N9瀞 0c# \+} Y-.+,}&?Ϭo3$OOMqq倞z9l|9fԱ̈'Ͽ p@=8l|샓c͜ t p@=8l?sgrg p6Љla;}S p:l: p@-tBg8̱Ҹƶ6=lNnwnDZC: p@=8l|9yY7ض e!ܹ{str&=qϱ)nlj{(/-o>~ʷtXχ+"B?WׁnDZD: #B Mm :`w;x=uGJ9|Í_cL? ̟?Dﰸ:~‹cg7^J@@w`Q578_@BgqdtE= IDATD怸3@lj8w/Et2l숛^3z8!@2J38f"} Sha ~%VgOMKƖpzKTխj=ԗ@^8 eo#QH7~r&%鹲b>\!de!zKr {da`fۯ~p>t?v kK$_en,ίˉ07OxMqj2J:ylj(d76դr|\$ Ӄ&o?. :==u$Mm+,` [ T sp`(Q-ÂN{&M iy{Uo y+ o_>l #@]c[B9zбy؅6v8 t84x񊐚l/98v tGLǣdz6d$' GPHdf":y kIުbܨw:y^}WM/F^Ft$`4=rcH|/_D`n4ms F `,̛g)It'0S2kkԴ٤=FPҸ* Ga GXK7c±#&c1b;΍$G[CtFL17;C^ZK]ƫ4G7L@}1r|8}kNL/„2f-Sq98d_hFM^R^9CfΉ(.&[IM+'‰O"3/O5SѫO?4/]ِ Z7,%3で7Ο9SlbeZ>+31n(zs7MVcEJ]W 4TCoOwӘ2z*vIпUY ] ГŘ8F92OyD9i={ Ý1z8.BnRVPxltx,T']X/ȑge:u n<{4tu }5t3:nlг*,UeE8j ]v4M_HflMU!N]yU8? Ay5;XTʢtl!S!_z0եa9e ("&A"!!(MV;:g%nάH[x>4CRX"$$ )%{Yp^n - ibxD [R+j>{6[Rƫt-:#Y\L>=xF*ז#""&tK_?*诠IY ,Ru5\acN#_%XbA6px#wXooK@LALE\kg5ʃ"_~V4`=e!2ꍾ:٠O]p!.BjՈ { C LY Q̇!_[ϯ.Q5`@uIl T!6d11dUڪDU+G|=ť4>PY|UI8F[|I$&w%߈\%ػv$Uq#<QCabF3$xXEvKD/Yn!_y`t+5 ݔ7wNHS'S!51DzAq#e"VdSzx-ji k.q5{׾ $ qY_cCExD$MU*68v <<oA.B7ЍMYkc0ԧҭ7l7@yJp8wynxeY>֌Ղȩy[˧d%{|F.M0ld]#%^G95[ZY =ꁾ'ѧ,fТO<g6gXzڳԦ܃L_L?Aw`**п#s}#6o:t.-7Lu`4x:ۮ FnU9jعn>ȳ`|gވIHFB? K\װn5 'пq =>}0ɳzJ6m=Rs/w뀛7L4) @졶,Fr0Oe ;k=XL6=eihJ 2Ѝh{PYYެ,GMu27.*١;M0idƶد d`@U#76e8 %=sL>&Nhx;x"52ec#|d,/+¡(bb0]<;gR~ ZyL ĶˊsqbP!)Ƈ'FvўB5ɛtK(rnNF52gMqA]CWnAbfP{2Dd쾕PRՆx׻0od5 $لo8O{%(.k# Xz4r 5..^׷B ;cyАvQ|^"X u"I@C{6XbGDZ5DDţ,.gS-yX6}MY $.waĴyz r=ax5{r FJ ==h3zb20o=@ܿuAgfp ""ʅ@QTLE$Qu4?gOƉ3tu4.5yYsU+PøyKq) : ( /߫ۡп Y#a4ێ ?<Ӊ9:PϋÊVP1–#N/8~P]S4 zhn?GTt 2۪}Sg6B67SogJG`(+ùѣwxES1XB㧟qZ@_ocION6/LURP7Áh-_ޮ0j30t)rH's0tUc,/AF|0e_,*4ummC^R4:qL(+)@E]P4 OӉ0S~`Vf@<3.KSFp_f?CRx^ԕ( ]zQ_tqur=T##)[WΆ*,dUtqKClKcݑ(F " (0K<5%"zV`ҩ!F@J?4V9 ƎrO lٍ*D=l[K(Sf-^ !-!B'X<j}@S6l;CRF>YM+aѮȥO?TPpa\)f>jj5 ԖBdn&\p̍Mal4խ ' CP fi IjJLeܿtP{m=3ȣg7CO7l{%IgX6wGz18q1g(UŠjj*d3zFieu; ]5(kČ3Ȣg+w4UE{FFц.-,>AiM 2bh)a15j8@Ojj}>n`Y)*Cb| BCCO,AAt&,Œ3^K   U?iļKNGxH k}fTг9 v ,ƒKEݓ{B(/=W|iI!bK =X+赴81D.최Ndu20MIA* Jucű E&y?,%" 4JzLz"{`zm tQwByљР:ȮSPQ𐠺ܯhB"WXXM Jr}%5y9سϽ~ 4>ngƊ (]W=mvV>+YI}zDϱ 3Mk Y]^s,iuԁHuѫP&beKtoc2DY{^Txu7l +:(">6Nn.RSz;E? Ĺ~p:6.z%Ņ/wA//D)~7B1thO! ri86Yg&%)2Ғ~G,x7c("ޞ'g6./ xP'ȏ6B P|I/Õ6[b'u;{@ h|n+ߠ'}e}[=l@~`Lx K+c\z0,sL]gwk3x8llzMq: p@cENJ8]rsl: p@@89@sl: p@cENJ8]rG@/++8l Zj(}N p6> MW=r6gsTn 1l6=,8Xp69lz9lNnwY`d8r IDAT-6=lNnw=˱H: p@=8l|9FyFVS]_p:46kxs@}3o\؟s{*23Ҹoozn:9瀾A45 ޻ ΠH[C6"q@H 55ByE5+k>]螊*3Fp?SWЋ { &Q^uk9E#V߄WP<9BDY3 Rs0|LweP,=1b-du$(Efj2x٨&OdrAQB./4(+CB\ D'&2:n@yqC#0 XD#,8A!KG;y FDhILE /!TOX/!&5<ʛ5d$Y䍋d=w'"$(Nph$B#cQ6_?0D"(^cS/. Qoj*L}Bj^)+5M@D6䭏aeB}U :|ñi4lpxӄ}69mכpܼA(m;2"Y^czYș+Mu9}n&ϫ!؁X~3t8߱7]PJx"z_R;qZ]&^I޸+>SE=w.mXfPM[P%Y8sIwD@%鮶1!ػsPW׬cgلW!>5Ǽ6Q۫;]4 P'_Z'gifc-vw? q0֒koĕ{(k? w 넶qVqV]Ͻ N[D_'އR\; E[/Z~.z {.)a~հ?Pޥ~Ow}`Ct=dz FlǻAxDY3j`{\wt41l)$5~}_;gC v;avA܅64@5 Hc*bt-VpЫ9eLW.z%Buf@~nTÆ5c*L um,ʒ\ܽ51Ǭs1vհeyi',ta:n E<#gNi .:^ֽR-SE>bD,l.VHguy=7ƴ9s`3j00w>T֔~ÖcW K ?č8޽@ȫ$0k>޼,+ă NP ,_ sfv1U޾AqvlYb-[Z2PxƤ ca! 1۹s7iBl]Jj>FBM]6 %;WB9*pw 11Lw܍CG`CZSLq#B75ؿx~ Κ1bΌ Th\ 1s͆"uqiXJ8mTa6t.^ S- -7$jQQ1kJf5'"{h6з2~-&=W-?- "."|<.TƸH/(o26 N3kO & z<$0De,JЛkB^ a(MǶCtsIdw(/G;}5PCI)()-EIa9 yɭS{gCB]QPRʲ|\ݳ<^6#/#jbt8D 3+k&-Lj,GRUe0wJU%a㔌2q%v~Jz01ß#??0| @#'uzR bQXTBEPY#'Xf57G"ѮuD ,EM#\ FZFSq54p%$(KQ04)Fu 8j< d& ҫ 7MB}}& ;#ZCKIclAP4 aj;_-1#//>S#Ea6n~죈؄NiٞWH򄕮2 '=$V̯ ֻ;zP0ؙ16р$$唼=4^DkrW+1b0@OS7EQ_'CJK DA=ŶZҞ"y buXp:DX~W;gl&;q$[*BFi(߿)8#Ek#BT>Чb89Z>o&)2ǜZ>r5 :]A+-AZ^[DW+{!!&IKQd JjxxMK3j<<iy Z~ӌ,zť `=Vӷ879 UUUK>X o-87`lДTj Q!-Pݮk#Q(ωîC`1ϋR}L}63,`0k'*sitC m˅}hw }DhwtjttMo>D>ea U5iן,`l~;L S7BZ;![G nH6}7D-2@IV˶@Cs^47n(KÉxI]j:yuH*)Gj`ޅy1БQá a6Ֆj(4ǭ4vwD:q>7(̎XeCkm&_ġȯ$(mo}6$#-s ݿ b׀(I8}hvm_YcC nFm֣f&%޼Jx^d}_s.$5"6ʥCSJø q7PFCE} ~HB FMM-Ɂ k#D6Q4{@,xX)a8x$s! O;rxOjhe@1Ɯ)wB#^x^8w*H?"sJri6Tc5%y~H6 ?;P$EWpįb`G`s-T1mnz_{c9tF㔽##!>%1{ ݽ'hA1vIyJf&? ?R_􁔴L[_{"ďXpMupl1KK&Y }AIia:HSmByBZj0!.Hݏ)kѽE!>t 1[ē  PEc MZ;Fˌi,.~׿ck7O0_uq)e-\aewBINwpv׏GxR-\Lxe]7T3u~ D1llU`纩?@"=["=}voK+]}ߠ8FJb ×{z@Ĉv14w !_:NP'S6xEp̗xUˇnq<Ⱥ8؍R_ѽ{wCWGZ]_鞰1FsSJr6 ^t+@TŒO.̇Zk|4> 3j#zÏ34[\BA];zf½|LWjKs cxr(yi`f`,@.9Čkzf`W7/ ȉ +t~'Я ͡  oEteZ|9 S_$kFf&Jo=}Z:ǎmpB;@s;IsKth?,v50@Tkgno$QR ڴHEI,3sZ$7FF Ue{B}&w -xu5X9J#&.yx|ui}qYޫ_\?x=@%wEebWsp`RȢ#d[ QƧwzg߿_8 :\"I/ L,_%H2;}Oat5ՀO0\M +,;+!SKnPDy&]sDDR&0L&H ;2(K _MK2dH㵶" Wk*xgຽ=nܸkoYx4o7~6™$ c(f*/8z<;JW}Eor/|!&WkJOzMz]yS _KoBk]GgPr24"/+t 9`|-ibb[<"9yyȧn$!<,0 X>VmB Ufc9"Op,MsS7"o)W]Q5c.jbJ!-JbCCfrƙh|BxE8 /It%G= s HHC ѤlHx}%(iiALaɭvBa-#2±x~G8g!%L s >= o0܄ ,kD+.*fM2ʹZlUl瑝>Df oA(9UY1lT_]uTgDFXtE˷L/ܯ>xFpy)Гa5|x8]u52FD\ Ih'G>rD/0Ug@OUCO1@ 3YF%-~oΞ,g`I!n#O+!`d *EŔo)77|;d h K4GHcI9$][K"nst-[VLEOqSt բ)"xCCLc\"slh?4~*17ħ0 Y9mlC ]޽{@;&oT i ]y&@^'0\Y;SVsS 2 atuPW0 ]ge8c#$\MUu4; - iC)(AuQ*~4rdkB0LgaaSf3Z֭;-4ʅYhAN7}#<D0cxqپݱ;&87s-K1j9I˳E䴵c #WlCB^ - 1C随Gc ;3}v+40nby> Ӡ,{!Gis1d]au8lbذ!t 'Hi !)8h)iΓP645).ч2gʜXr9&O}}SƧ"Jڢ}3<0D:C`CaFxzR¼0qzSZꨧ/.م 'l`6a&rJm**+b4VRs`fj 䌝_Uch}|~S `mmӧl qy0|ٜ^ f#1}X 9됔]NF~?t`uXjƎ K 1ufEBMxD@-ho)Le^}`:3r (0BWYcҁ=v#,KPv6~3뗥Xt*Qz`&`lpE) W/JE?1)y0ZM kW4e١طs֬Ɗaz 6  lVе.x=F@^|?b \ 4l䷯`=[˷n;:Cڃ󹮺7Oƞߎ" S`ǖXΖ`]IVQ?PWQԲ˨P+}e-f0rȭ\ /8~Wyq\n͚XIlݵ.:דLv S$ʦXbVgv %D`;9x]#c?z3Xkc'#YP2̖xa x;9`:Zcm SB^j Å.쎀q>Þ.dѮy ŮA0&mt^ECqvh| nپ N^QAᡵrl6@&{]kq!6v:\_jbqpf oغ8""ɄZR_zZ]tѮA[̄MXcN_A!d:A}ڗIn [ I?}Io杇</^ {jr lf݁'! 2:zLd6n:ǧ[~O(I@_TRaZ[? `'nLhoM _-=%|Nt!9j."&[ IDAT?d34> 虃L\:Z+0 'ߦà-҈/ M\ q ]N,@&67ni/ih#mA;Qϸpw}<]kѠ@JRg'WJN8dے9s']\8 4oK믐99N82}g_purZ''ߖ p@=q2@89Ҽ8~q+dz9mw0:|֎nl:zl:yᳯWMY V$3IHOw }{os@Nt9Z~2P_[m3 w.E9Xa-QxiXL5Ǡz"6#0v${=I?"<(e/ *&:JZ;c6;Xp@_&s MlpWmCN^t\`Uiܴ84?!=)C}0ZO36BF3O]d'T0&zVR^Dk*kVA9r@) 'xTwJcxs~ϑ7{|1cQN*|=](?j p]Ǧv(;>Ld,#|.Bf%aKεxx;#6-O?ĝ۷pRS)AL۷ 2$穭*d7xQJ}M~PBٹ:߹GBjxJlS޸Kܻ焠gxtx (qPy[<}N. Q08 QMQVVy+8).}6- fi`xI. afSW2ձ_A1x@(((`ƪ-xV^YۡU큘8i<][9'.kWԙ:m2f]#4 98i tLbU=f4L렟4nKpfa!5tX_FP5l>v+Hʣ|O}]pEQ^u.1i^02Ђ*6vQZAFF02d`9c)BYv-l~=!C1v8 ՆaOcuXP*C0~7Ӆ(=.\?: Xg_Y<hKEIm3 zp $M{"d0v֓Cev.@oi<4}OҠQxGc#,AzX_<{iF.F# doyl4\CIAb6sռ!)XQz$1=9t~!|t3-t O7B`I{ׇh |njG#[iqi)\^@X// l$8"=>&iCb>!aI!**pY y6JM a1L*x^!H(_]5KF^p}j*lυ;?!X9ujn\w@x~[ IiE>s|׹Pņ3ᦻ7GAgo?(]NcdoOX:]tເ'?cµ&+YAtn? x!(=@x9ع~%GHPT]'ѷ[On;%}x K}%LىJJހK+"2Ob` -3-|D06u1{Ad@1EXq&C0Vǐ[Y&zWUd :aڊX~>DPg?2 UN_ȊF|ь,lneB4c3^/W~ p: nN=܋Z\? YqqtOUl?ԒIg7CLR'(`Wea Von WZy8Ɂ>Mqv"֎7GZѷW/8f Ɛsa ;D C^y]9"3GSa~6{jYy 3^s3^6i7wʴZm*<BEFۼbhČ` &?&M g Sw=EѰbG$|j3`kUgV6k<Ȫa-,9ċz-raM(-U1TIh\J H(/ S<;bMqH,ǍUs+W r!-<<W,imolDFncccp%g"Ha*Xᣐӌ0|bh!i`֣b苲lȴW+w=NL/皛xpu>u 1o ~0׸s3=Z lY=bjCZ,/&hREGރ}Z'biv!6-z^ J`sU5MJz@ln#4q5Xy'J=lXonyLJb,nٍ<\1d)h"@ =L%a 6ؼ(ҊʉǤ{bPu a6|lكNn[m" Itqx#`:uB2;uI 0 a'6A3ޡ8sW!C BNa¡\Q9Rb}ؽg/^J9~؁Ұ>v߷~Ɉ02X+'[: ϓ7 %%z //\E2#+G^; VF51}`3v* 5Qk+}!i1;D{gR Ч<{I0}ӎQ7NXB=I`.^ k O=if!6& wo ]hՈg#Lx8cz,mz9 ԔbM`۩o)͏=2VHXe4}.C.̽9\9з pe}:}5!/&fr($$j\T[OQ7<2?U޵'`59YIOa٨5n >I`v{NМOh"D@oBWHXƒZ Л~гd:zcd k;=ݙEzap=Hઇ/b#|1L-|ᘉoN =ݡ=.ԗ=0e %ey,]G2pBCYQbqf$k ƍN$Ą PǠķ">:G׍d=002W\H1:)t//Ȅ;XO%p~D1fwc8 6#T^̕;00k6dW425tx;ƌ qܘk9pp F[@B\)c= ϰe\3'M@_SgVl lcر;n)&m;=]Tˍ ع)؄NY'slߎBxbeڟȉ3xi=/9z,"jo[; 󲑞 +ZL<=xu(2өLTṏiz?JP>F2s2us@']\8 4S99N82}gߩ5pmqZ*'_ p@=q2@yuiqQ!wq4dNQ`e~wЗ!558p2'ߨ ޑ$^w:mm_8p2軸m WN p@}[7ɻ$xz9d..wqsq2s' tq38mN8瀞8d]6is p2=6']\8 9Nd99N82>?/n.pϞ|eﻡiF' |9h/+)}7'|W-e' /wTWUp`5nIўdࣁ>'+nNwK|߫/qUҫ?ԑDžRG VKPZgyxi`ƝH+)cV`ӂ޽;z3a6KQ~=^n?a^In*o_-O!~/QI9܍Ii=̘v/?K7&_9Iϰv_qDau\߿:C(ϼcNHkW>0Ӕ-{N||;εsG}VFXo-wEJ^PnB~qa'iw Ӣn,xUhjl@A5B|j Jy ~ßJ䧷r(:ڄg!03Ox?={y{}7HX;՛E 1unVs~#>%=R#vL|/|l[\6s:"@ϫDJ|$ى=N觘e9[?><= /oWNl򆋋3HO檺r?;/P_Myf )ir)QpsCv`U!=1qə'z^CNpvrBX\2Oi{QnRx(iicH d%X*qiB(IBFM cgpU "by| }`8b(FNfb@(⤣Z%9 8u)+(@cLM1|pj23:!U@AyFĔK~Czf+͎Ma8h0,GPUE03{WMX/(a7nJW]A7D"# ǿ C&S1wJAEC&&P'/OhƌI.@yeҕ۷@ϯ/ ۠>;FBjBpG,/>FBN?4 !~n6TeA: H. ;~ 0zTWW"%X Rv%m1;;5-_{m͐ǜa!~8o- u-QL 4.{UԱeUqt fES@l<~q)To9^pv̹ AX5Nco@TI <Pe,(~`uC5$a9ܞ,-@z-/f*rRj Oۖ@'䔹(l9  2L a8茸(x> # EsV*DSfz"]EII؞w_Hrt3M2ݜDbirPIBl[2 *:z"E5=2yiÊ>}!b @;# )KY(+-EѪW@'#3}d&d<[f{ G!X? TTbvaa8wR9p|2F[S-L_m, #jǾJH&j/Kg ABs$KQE#0r * b(]+H IDATowI3Z{1͍xv2 X8"PA`eL?K2z#=@@x,Ћ+q`D? X| E3*qm(B@ /m Y-x?֖쥈l ılo(絔c\ ҭg+75Y)! Xd V, 10nzj3- Ӈaі%0v.8x]޽p%9>NF#[fqEu.j<]UYICm~ זń+):(dG?[VYZ@O]p~֡m=.@OQ}  ] `2q!H;Md#En@'c>u+r*RUM0Ҁx!篻;'jvTZ#%O&l;wCaT Ezf@6钂>D;EY)XL1 m$ Vm\߾okƪ` -wCm9}ѧ.A?5SŶ#Ӟcʻ_ #G[]m]]3ۀAJN[~TU]бX>6! ˹JNbW7M)$Ev1G,xXgn X^A3? 5‰Ý3h1e!K0P9Q_)X|<ĉvG]!99ʁdtj݅<_,|gϘXgUaA't d>'?8#5ls~D!~}!Vϰ@_YWЁzȱ*œ#x\]F<.> ŕ!e~&@, s}u>7"2^,458@Ҿt= 546!+t{tSH2)[e2nn(itX W﯇s|[5&ֱ=cf:sDf]KfRUR0ɕuu=׀l?h*bκ-gxK W ѩs?z~N.=g^e3榦VEG&8:,gf-Z{{ݽ}{h2LS`o99^8N2a͔ ;ZL: WD0ϥj G+8*BzZJ#܅slsS9"]~gi#&dfjϐu2Jn2UKq%طv1}a1"wPQ}@\AeD'7y;F7>*Ad]U)-1E܉He0) FjdW}psG!c_ oGyA:NA?i"'j ݏzl&6oA[AfSaH=AC؊PniuCl;ti Ujzؼ N:CWkܳ ユ$b|AM^ çڭ۸~%H1D݈H~YJَoL U̘S¡)#jEȔehzÄyq%߽ cGZ`5-*e̴S?p<|]th΂+e^5x50OW[W1uum cp-R[°b%w@Zpcm002fⓣ.Zbc.(s d?pakrܾF 5C]n]7=71fN? Ӂ9K'k"=0eLf^<ï+0<;O]bc=.Q(>ŦdEύl7恘qs- Cdࣁ%*+C*e!*er {Ń__ o[سs6oڄ-[zalx/+JS@WvtN8d௑![7n5+GoA8瀞r2@8m#s2s' tq3ӔZM/GoA8^&xU N XO']E3}nKs_RT EԺ8ggfM}S=Ǽ5*8]y&W)32ĦOG4stս  'z\(?C/ۑ. t[sw}-|f4z軾njF @׾s@9?p@@]9|<သ8u[!]o".F}s@/L.qqg}s@&3ݼz{'*rD!& as_QҷmalC(h"57#<8] q@QOo@(&BԠj:W\/!VHF~{7пAMYv̅䀡0lMɀ(?Xz'}av2ҾgnI^:#!Xբ(/ 19,"Ϟ!!95-2Gბ"2Q+w VJ&gc맶2P]Sۡ_L?CR{SH #F6']- a^%2[EJ8V"##ږQL?ː*#%%b{|W=ȏCTelv]U\/Oz^] r3SEs $qP $AV.|m7ߢie|gk^fbQ.#CߢlHQ/^ dvTT2 ߚw̳f~ ^{AoJ%U-{QδCW_pÁW[kCT\vgoIwp˯8AP'^0 rPRQ4Ta&߮.롣IiBoc<#n ʤ#g `5} )͟99_ދrI8ň+ ߼y-1=H֛:\ڽMN0_}9SCYAGG >qzjJ DCiy%sٔCrߖ'c2䠮g箣j7hϘv1h1y b(]b#VAQ'~C1h`,޼qP)0dd$1t, q&.L_@w/VgJHm`|gf*h7˰}!(Ȋ3 m(CZZvtEsHͱZ&菱g,^KZ4i˝1j2U, g`(IVSՁ͞#xc>Ԇ Ed2 4\? rҘ2e$E`0eU!,6)UUECOQ W'gang)]@7U#dMw MJNRUKNPOىc~ZX }|~,tH=~&spuJ=#ZkpwYM /aZ$p) λ_jNǢ 7C^F\P؈&ʳ{t [X\G6di" 1Z6O6s=(̈́W󈢌hWpUD'f~450VG7nlcbE-1RH/:=b><&cD} |HU%o>Eġz}Sφob/Cއ&KuBc( XJ~ӅoK>7)ljf\Y?2`Q+e]9lUSENHC tmJ!vvڪ| |[c5L4Gfg+,FYoUL^Q+Y1Cn#{0@_!RBjSCBBcWpE?{;}"+w <&4Ki =eT ?q7 3DF{wpf -ap{JFxO܆M|Ce(Z"z})[ kDt#љ/ɃVD8iCD_jP<U ,Fb}dqt.J (W]pD7JюGu6)MD_} 1#7HŎC@{]ڇY)oN2N3v1/!DbvvCӨ;]y9kw#& h.-'AA؜󒂱vxOnw Z 5U EwZ&Z:ZVƺs.|6C駮أ'?kwƆ`j}P/!6!{)aCHX_Ue*E*?Bk}BTwi͏~Y *όwxMު8^Oa%e2 VP ;*?aUa:*p=*x=ưZ2iِQK8uE\olp_B)1b#ij>o(:v_c:\5]; Rۣ2jc_w8+ cm(gp$޽{k['cI8d56X[ 琉)^ Hwx&:Ia3z䇐hJP 2#O xD~IPP@w4j8>]Zjua4D$Or'_8f\G:;yUz!=+6 IDATb֎Hos3"0k # YaV +D>VM5èkF _O"' ]C8yeg'@U~ `PIo0={^F<,7ڃ4%;h ҹ)J|^ LGޔ0mj CPBDϞŵm^,7́.7y BN;LGNCf/Rœa1ÖA\fAeѳzp>Ldþ1`B,zں剉8wx; I-/Ba Q?}"zfpK73 ;.yaiu-,PFMUzn犉pNՋ0o^/=0mS=G |]g} }]'{wiΎwoʫlo.qg {1&Gv@y㉼}wgZQ=诽ʐ~ wMQtP;XITbDzgb,0D3g[!W]#&/2ߞ`deO6zы(yb{.&?Iq,ف؋O}YQn_M[{d=_LxphD &prtA7#1>_/}VVKܹrlr?bDzbY,Q>SDm ^<=[cf< _QAg-bUŴ hO";kċ Di'E+ٵ7[Sg(޶=QI[_}it0O=ۦ<#9݆=6c۞8~)m)6b- cO)$?At 57qi})kaY:rX>qo cq{1r럻Ƈ%U^-۲Fߕ:PN_k6i= Xv*+{ї˜A1yH(*ja=.*kS͉(3[` yfN ccc0(8sh+ ###VAX<} ^跏뜏@w`媅`F "<d F042îQ™}Uq&, U3l/CuUs)hS<%3$۶Zf05O p.֧1fPbxG(_^YKbb"g~ch{O8n6=ˡ,/%ȥӃqx,:;NwcpCt&ne{QO`!4\N+MmM5..2=`O'Og11Ґ&,o j@l(N^'`*s6Fb%[ѧ&,LDxw>;:j`s7yq_BAna ={bФY8luy$H#f@AXj-.20;^E1v2c ahwCw5,~O?ʼn] %#{[2΃1 XeLݼ I<$M>~+)G!bHH`E8y&EuNm% :xfj:,֭ȑ#pC:I ]nbԾ4h웬MGlas0yUX4y$蔷._x,Ln.<0HЁt&Tt`::07AWzΌ%kizL; <;cH+bصuVy?o|v#zHt66 l]12 p59~QX%TB~s(NNgDhw>Wwor1d]0odL[^&6ڛͷF>T:A^%P}80-'~^ovǶP7!4|^9/d 8g10w%RJ+jTW`0]P7 :TyZ=taCn>nl)E5<.4؄@{L1SM]::We#PN3Y|:TgDёN:f.GZ=9`Bs< {bx^Lᡢ8ՠf<v +SmdHFhB+qz9 dz>Iy?2 ҢyJ?:q paHw$A0Hǜ1c~$W1 ݥ|v_}]%S*8hB:pQNMa>m1 q`l݇'Y&/aNGb\EO<۪,5N2EovSq_BU%Oa1{QL<Ѕ{2]1Uq?.G`*iXt"X4t:̵c:2}SW}gQM/Ϩ.[SѨW{F\1q>RaP-yx ƚPgT[ sѣK's)Td3q;[\R*HO }Ϋ1"TѣM|omNtlٚz԰W]̇CJ7(b`ppN~9#n US! T׿~W[I8 Dވ#C4#zǣѥsWxpN^ v3Ho8HD'}*:nu:*o,n"8%3PQ%耄 ?["`q/Gґ ;? r8uQ鿄GtH:³;V9 W爠PZN~Za!g0O^tLz~%xQu!;% #u>ϪW5 ҚCx4e RðZmExaCX)Y0{Ό> sLx\lfcȇ`[ЧGG>Han:rGeFoXIgFq_h͉>?=Fjҡ&csrD-_w&cn. (z #IFzS}5S&S)@{srF2? :o´,L/ty?c3 @_1ry"j+rpqL8M -! ~-}>/pk$jm5BCz8cf ѳ:E`ϦU1lL [C c,Gpl^D~*ACq1qi6BxjAh Z z^q(6\Hi}:+'We{GЍPzH Bsp1dAЧOKP` h_rTrD_D3Ȉ e6@M]3Vnˤf\t*ѿYXb yS j9 lD_SGg ۽Fo {ARA(޻0rS<]d΅n}55}3 ߽B ~X1}($z7bt#|L.;b,4:J`ܾBg"z>Mgp~8mb7Wnѳ(p}ˠ=<GMd;bW[{ojQUPTȥ0sgKDTcۚ\tߔP^ /%zVw5U(ʈ¯'6\~o>'$X"ʴ1{ )SCMM %]Ip.BBY-|lTO}u, 0R刾M}0q^r(ҜPJ`ʏBw=~ˇ/?hNˑKC`tg@ͰosgCBkGzF@ƙipD\wtG؋_D^9r:Ms)kb xGăWUw0DKpqf e4C+/sGQ&^}&9Q 1Z.7>oRR pV}Ck Д \zkUfm!WNVQݤ=yGB~Yё筣 Q0R C?z:|7!ΧNjs\o5PI#TPMڹ3?BbR2RRQūS07Ôe`>ˉS ?kG~HKMFLe1l?@a{v+T507X7kfz 렦hmc0OpD/X0 ;tCqR,w)D:$.B:= )HM CFCiey&G4smM%嵻FDqnX#.AM ߱k<4(+fAl8\Kscf/\L0b0uRt hA k^ڿŘqxV$e$׏ܸ`ĨQ2bx[O>ЧM4Lk:7]xFs-{@~ƚhCR{2Pˈ lI u,9hr=K0=SFC&Lb҄0诇1"0CopC7GNKY4O[à6 } 0wo~w.l92 (<Bco]c89"U,MR- .NGv~kK, -5=nPWj*,چhח=!Ap]\@6T^_/w2 >[[[{"FW4Rjg^]7B΀Pw ] m0s8qMq\x戧QW'Nabe>puGlrZCFOs['z:GwlikB1GU{sD/x։ޡ8? aPz^%0oח}{_%okDϰe_$ƽBdhC3IEmiW鱽=SDtELKLͽ?OO Džs?D su'&'b{kğ+#af熊2bD_QQޮp/.*0<ňwqShS SKNz] }}yKܟ?QG/kOKIj/[3ŝ6؀D߬^ S,$6l@Lb61{E_+Rjb؛ۀ6 &8-6lwDPZ/~u  m]@.m-QE/UK.6 1ыC7z2DqbD/&z1ыm@lq_`ĺ붽؀D/6 /p{8rc l@Lb{sb_DX%$nźm/6 &z1ы9 m/n$z^uЊϒ"ӻ (e%`'ܰ{+^B/~SD| Xyw^:}~~,"4PIYس²e*KQ,F43darqz*녜ޘ^^BYRPW&(FL!.UQyYFLѲH Nd^o ƲHRd'L4`XoY}EQ3YH=p1P>֋vEewiI 1^zb/-"EV^H.NoemS]M肳deE]b$j"e1XnK,$ à eaٞ,f9Y,4B{APFY+.Zow^kvJqAAx#$$/`k{~L8 ||/p?BDx8 IDATӧÃFqOoo/DFFtp]Sc!$GT/.oL?LG&3Y9ޜ9>LwF7&C‰meaG1 ޘ^nt݁"Đ0>,$ a(*K@@@#F9 CfwSS da `za0{qsrttlN,>,.$Ð%K ^^{TWS9Ow,d 2Yٳ}9{Ů l׉+ٕGQݘ3YXaqmda0;dazO@ʽ{W`l큓IXX, 3';sÌhC2uN/|Fޜm# V>f3LĞ>,{g/ds^L/M2 ]0[e6aD6ll8uf,^0mnwvӓÃ+#kL,N\=YY,w,.#NW7g\,z3\>3{~^V233U[o'%%r^A{CL6 i<"w6a#zփۊ}M6BlnU XNl_c/^lF.^*ѳx[G[]".pɷ}< GIQaUN{U,6um l6b9*ѳgQϢI'f?U]U wPL~ʪfD3kk}<䢒l&Om 6'7AOK .'I_]7L/@O7_~7zy+86W] S0xD&e|<)/pd>x+%T^ikAUUOŮG1~\ 8 ===܏xql|6.*CDRrbRpox(.n?wI5kʞǝKx>nFn]p?_`'ú|]3 :(WCY5;~ 8?VfK8y@GE}G[?$ /cnq8bm:8[:װϒr>7"S|Z%܂"qsA2>Y9yPݳ ѫgge9y7в\$%:} WVr+/@bBެaer[GFJ"SRilNgUyRd&yWX>tRgq'U3DMz&5u$_"{vAh++5"QAzCɟGO&]b*t_1{#’MMD5׵xMq (Kw< ht$RëB~<^3~J%a^"(ȯD^vܜm#lKEe"5{(m*AVdԊa讪 M kҿPoLΌJD%Y΋l7f?izH%9M")9"VW"3= 9@P74AkFI?, ³d^7o/yl*黰ü_¼FDFi˶]ԠPƺ{`3;`vXHjș:]J½ ^% r36 aCvZl(IΖy-D9BgDՄŠ|-O CHtYU5BGGm=gYIطi!z(BIEJ?'cåKjW!k,+ t-#cc6KdRGPg +8 ud5:P M8CVJo`ps\?%BI$77΃B9((@k2: ia ݵ&m~3L]nuN,ˢdErPMc. kjl^=e+*pz5J Rp|2Rz>Н=g)"ywFQ1o tZ#gB[FPEfO y((ag>iJhl e2?\__]SAX|J~aan3{3K(yP}$:v 1kf>;5>Cd1dlĈ8IXÏ?Jh4'ot#-C= 0TBO-\vBEChanM6c8|H#ѳ7; ,M-hij>_F>K5L_ }zN?CyĄ`PVV"P,t+$6YGa:~GffO쥪~ ۯB!uDdXFiXt x|#(YMWcPf|sKIQ6yd.x T3j4.:={,=NjPܺ~ /^Gd|:jW@F+L'/!o<,AYm-UytvQ\?TtY@1DG QLH37 i9,8v<+~LᅮP3Y(wmM%.oCN1aZ\:v\], ziz$y76Jx|É]? p1cȆS VţWJ:3y k* b0dհJܿ~psQQGk(kcCpՒvaΈ~P b^f=1s%_D7Ο:sw\P^yD_u!K [wLtS 3! xx%'K u/yg .A/( /l@/"%0gN8=ܻyc`?BUEl-EDو8wzB$F(?v`()3t/}l>}9H ifVք{d"t ^>qHSM 7l2 N^Rݚ}N|.9;xW/e5¯@5{a/2hdn4F'wxHmĔ}gdĵ0/QVנ"'MQM9yps:2} bєAk\9I0йٞ.N'O0bpI^U{`̢H*k諡ݮaNv&츀4V8{׿Ac:֡(ĎVAJ_Ɠ8WM}GeVˉp4H8GZ+I^BVkMMEƺT WW[y}P].`)?m:.ڍ9( 8n$a a}gmuFi@1+ZK9y= GsL̪,ʥ 8u OĴqP gq{Ȩh>ר70T'v{ա(=ea̕#|9yk q~BHuațw2n9lAP/ Lw\I[쭋~ūLU["-U O>ݠ]Sok}K'O? Ϩݻcž(h׎\/4Aʇɥ usjcɉ1{H2QA}xcy72M'uFgMd|fcevlڸ{o^>t_?Z2rL,Y2l?,Dojqd ^M = WŶ ,Г\ b~X7s\B 5ץ~P@k *tAZ 9ԉd::LX乊i&Žܰ9 UteW>ݡ5j1x"cl{h!$ȓt+j`b9/#bc.LUkr'&n p &rU K 4tE176XPiF2O4-WwBUV:p$lٶ oF?=Q4Øslz?|ϢZ6՝靇 M_l&ӉY@5%s=Uq]j]pED]:v'.IyL6ļH|( F5Σ]r|JՈ>#*k|aּሞ$!ѡ\Mxb9Uᮛ_lFg$C&f9!{ oD5S3&~3N9VV8~8>vFS<x88s%idLe0#z A|<&2(ʂ;nݸSbHS@ԽyRDY,Z,a%$3/ Hva3KYAU~ФBk8e:X6m$`P-8MegVruU4-#"blXTW!i<>Od.*3qDl􊡐QVǓQJ (27i G"𮘹Hܕ6.mJw&BDɓ~o(\Yܺb\<-yڮ<<jˋx0`lkK~]eT8m#/n*k ɰ,,F 8rD?Ur%L&b0Ʋk>MDO!Onfr&(G 4zFup8PF#:sf$޵/:k-LgɕߣL4fW\F)U'!%d%yaX~' 8 qb0uڳo(Dm>Oi/.Xa4+jWZe|o5t񂩯I!>7=OB74(H(.G%Dz틅7{ro6W^s;BQq4RSKBh05u"TQU;'=? hV 1B(MQYuX6B j&3v$,w/&CU'X~rHXt M^DE} !աP!0 GO&bCD_Z>4e2f~Nn "!AGq륄Y!a^7fin,$Z1ݕ5zhn.'i7G+5S(KC 9Kc#joHkaZTg=?iY׼j|m?4i"(t~h:y-bш>2ky\x[_맠O4}@, BwD,çIs',9|:*zr8m:A_FʍDum侣+=xAh<9Gr3/ظz,@Mv3ӏMlZ0BHy%4qjQՆHJ՞4 &)7--@2 5x}b{:+ G"YB3Wnl9QY;Afy768~pƌ p;1`gރpOR&H/$&|ba8yźpNI~v/E^|ܿb -?~Ddk *m {slW mAIc&@n쓚2RMcC|=8_G&0RpD.RX,v/P¢BB~/ݥt,X- __ eFamtUȹ+p!އ~4_ KOR9'{4DaxF!l0&M^@ xddedJ-Fk)iY UTk WEp/rJho\:Z? l:>=ۊq#(ɦDeY =YlAGI ۯ@)/FM"75Ee5̧%;g8;aߎ 1{ '%&M=6ˏx84f:B; 7K=}o_eV&rp7}4A4M<~u1n>Mv҅]#UR^@O/t֍rccNMGb+[BJJ$Q M"sTZ3E-{%C9^y큭fݔF`Qɻ$[7A0}M~ewƽئB=1&F-݌S[SQ;ӳ$$aCs%r;D?ddS((#@KE]uRВ'D6,_tV4H2svXtp2Iϩcb. o R_zHM24)i4l9ʞqy@Dσ!ASH-&i2kQf*Nv T"B顀 晭>RYx\P9-5š&}w8ZQgS}-HJJ4k:!\&TD(MaIDATg[d J[<e!MD՛ksH҂sa^l &CL:ŤۑՐ(lOFF'4 Q`-^by%ur3TA &#… 0/΋ƔA}mwȌxB^>yH # Eu5e3mv 7WYWaݎ詬KEn)L3f69 kT. ^a+!L$ۻ*|Ͻ\{/@JR4I E"H {H}sPs& rN93{^wٵg~XK ٺ^WE_7Wg|xR#jKƱ]k0Gҭ}4QF|'BWXz>uZ;PYЗu Whh*"ea4~ېQ'am>ff턜I"y4((h|o7X]T*K`@?Tϛ6\y3HSljJVVVVJjrn"wр?wMyv/s)pr)ϧͱtdhT):aꕼMͼtNy̩W~<+H>I5J9SBGjf7%q" <m>rCWʋsq"=#j}y4a'>ܸu"%ѿvEǻZlgcT=o{N6Uɞ:aϫle {-6_d`|̝; }=hiCפ]]_?O:i%UOkQRRiGnsTk_aW+s}bDYB,OO ܊QFIGK-Ǝ»{>% LxevZʓ< -vU@'o»PJ'$&&}}}D^>鏣YQ w<**RjeAAzY܅1@ , ;7xN^BVz>vAZA͍,N/BdH{Uq6CWad7)1l?9!=HNJb5eeYRI?<CDG !,r,1C,̲$ ]X?_ orЍ²0^HWw-dQbq&9Yه%d̩p6`v 7>$ }2syMe'/QQ$ ʲTYXOczO8"?B,n"O9ۈF/E;YG&G `߰^(o#ۅ X/ُK [_, 0:5B&Pg{;f۰]xI~֛K }IJ2Rl^ ø>bY.!#P9{/#~G]Pw>x!9Pee{+;B cea\{$kѳB5F~yK=v*yBjTJhY[>~YY~>w|M| s"[uy7NKerٜV/dYjeb,K~SYoQd)%Y'Y,$KcYTvn*K˲ެ" `L y] %S؅dgٶۚmToEla+>]xgqܟº>Tg>_r, zr,OC-}h*tPWd!, ^ekCbdY.dw!އEYHo cG^7مbT 0FH=+Sug?VإOxUoS/Rإ,نd}}@xaMRdieQF(>(ٗReЀEUy{BN%%hD1{&'wqm=\"׋M<"%4~A>(yޒM%іD[‚iw_OڇϞ>ųgL stI -O  *J.O '3HKIjQoI[_A@2N_߿<[Tկϟb| &7' b祷3VS _/7Qz$K7B!?Ύ(7z"{݊pLKEDXA\8̤*pRIKMBtdA%K7?ldޭ_UsQ~ dBzeg!4ߠޒ%$I{h5\犎YCv4U޹ٙ D/ MVjwo^c$+ ~[`tlq%<+nH7z= Ǿ 8R4^@cEճ0Nw~}{nي᎓ +8މ!n8r`_EhJhS8l zѴIS3|h*+(Jf{_\sc=UmWU޽V< 0$%'#59Bp8}gT,<&\ۏ:d` x(-Dl0+ ^-\eaq8 5D R4{o#:!D$c傩Xs/_ k3)pvSޱðaCae=D|ZIRrxٟiaia KL<?{ZEnW1wd徥f/^hh8$XFe̙6I4s_DlC\9v6neE+7]ED?J!zʋ>X.ZzXjb+ڹh:hbyY ҒܾF ;XX'98V!Z*9LkVo݇dj"Sx?|d[ba;;AVIHu+`O2ڣ'xp03 ~D/^}+="ze0яǴuD5uj3t0PS]j #i~.oC`=a:;Fu+O;azٽ NދQVY8ޱ=Xb8kXAcg "):!AVcq|{a,DfC6 &ٟ.`k1?p/ Y߂"z껨+`߼}ySFk? |w ˡ7w"z9M7Qw0Þ5`;5|SFϦx C$zIa,Trɇ&=@Dc?Td!fܱQ-bM? ڨK2m"k_8˾n 2х*MM m/{Sb)1y 6Źٶ-4fQo돈JӊQ7t1諩9њ7-F7Q9]ڷf3((*zVAϞ}醝 DaQf`~յxPSА^]p*0+&YxwWx@X̞bP\Q4QX:ot)ĴEvt%x A2a(eId.ɼa 2ѡ 'PtrzVA 7/֝&)mUa .X'EZ=0 SQRKp%(rtI ,݊2TUUDD*zJcۿ&锦Y]=Mapx 9_*q&ܞ>BtrYD` b1k13J@/;uf(Th5ذj>zŃ$n_WxS5x8U2M> LtHd8SO< &}/ ėTSL}?h9|5IjWyyj3 @TDh]}+#OTG|@XOa7!*POf=GucI UU"MMU!.n}`?5o'̛< m&!,3bZ;–g /ZOJ ۻ [`탰x:dz0u5~8[|7o_%Ο9L<~\MBVrąY}^(Rů&zY\?bOpOw>ҿgO}U_,ޣEMcpTvL#,~{#VnFD.a`8M($3SfQEXWX.8y—&wݡ]S\ ?Ӱ/7]{Vtǵ+?%4(~Þ}&4ADB#F3>AHCA*+g3̻a*+SYF{cՒllm1blOũ(quD29)ؼ# C[aĈfao;RJUf>mFbر(p+0 Y1ؿ inhHeL0k[,XsfSƄh-lzUYW*4ܹ|'A0h9ًaA1,mʞ$L1CH|n"j;a$K0=_/4:3N}eq:Ca&[XpOBNrm?gQ#a=;2#_܅ޝah$z3%bX;ryGЃH07=gpJoĦ$+$%h#H7\]]X" CGi 0}._?dR>-A児([<ti!4MoH㭤)*-ix\{FJ,}1x<|h0IY Q^yLD!L8޹kJM(:>42>)Eo CM9;\]\( CtB<}} HRiԏ _ Rl*d{xӗN\.J mU bH7//OawO9 0i'|⁔~TVvE־!eӍ XM Q:yp^ozۧtJ=|y^ vc*K-OͿţ{Ҩz0 6!%ܤiTXtXML:com.adobe.xmp 1 2 3 0 0 303 241 1 0 ?#:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:241 height:303|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:217 height:273|gS IDATxXVY@DDBEV챻 .!DQqf8{ggv(++ %$$D^e `r%/?*]|_)// 06"""O` D9- ___IXZ}x``w y-YJ1tL~~~x{{g+]*PHHHOڑXKn$H͛7뾕K+ Dϥ- D p iKD?K\>_& $>'y:z龯I%uwwWRҵɯ,%Meb"\l{fp)- $%Xe $%])mUIWҖi^XfONG0a֔1 1;`РAL[/]>D ļ9sXa;.ٞ:ŵ~ܽuQÆ1tp؏g/6K3|p&^MKe{G^~T E$A. h䖶% $} &Y%,{R%~H1[k jR2F-{c{QVƟ޹@huܭ>W8jMU0`*O?^asgɨVfuǙvgxsq;&ZUXQl?t>W:Ou~7t{qγ,\|e $lg|煹D̼g~\\\xus/l iiȌv#Vc%zqM)UMKlf·/bz-ZK.NL.4ʪcʸ'ߋkc_za~{/ n2gCJ.vw3wbULbyiυ *ޯs#F!6˹#k׮,_zSW P]9yM131QC²+lvm 2L2kyp|9g}:¸a6m!n~mCm05jQ_`u<_`UA[6 `ش帽>R&֯KfEѣG3k,ܹcݺu+yU"x~?f)$S/5 ͛4mΞ==Y$ӥ1]zuLF1=';hGR${,4\Vee4פFuMUlv@d+V1S!z*TbDx /'N.'O[ӼySji¦K Ԯy7iH=C`d-ESŒY:Z5QIM,m|ڿ jPRF\MSc,;ȏC2_o6.JTQGKCVu*WDEl:w0!{.)A]|x(UFY[QL*hghW\9%ڍYPϯpu$ _S'.sD|(Lϖ%1Iϫ|y4>,I(+W2x`Zjʼn'>ȏ'>y'C:ĞyéYFr6M툪ɢ ق5kѬ0]僬ԛzZBS M&Z ϱ9sG@/]Vuju g{pe&6hQ9gpTY/6~۠Sɴq8q%iΝ;13ϽOg3?$}LOR}}#I&ݻ9RQ-ܹ3{)OM&cmf%Y2^A<9:4VZ@{]mQ,a6k0PR=I֨Q5]rALZmz[ɫȘc S3Wi&n)FtlN}-?'WXPxBk0a|pp=[UB@=sn?[^$ Sm,̳9UvY_=לfg}QG}))`L:F-qہ&'LF=gs[.h .o2jS]Sab* N@+ɼ\| 9Z:sccda[f\h^SNѤIڵkիWYtlf{HyUA2¶ha@ iȄlI~Mѭ[6jV6l؀ž^{7M3aJiYxG(=ƂFn%[prHWvr [z\3A<z:*N#VۜM $+_<'${ߡZ2+"D]4u:f=Xw0M%"zsf5chΡ'Μ>CQҷή+E=3 ~]3Ѭ^e͆uXA=aN`(av8vFTQg}x\fVymؿ?0ޞc~tupp@$A׻dZJ K$^'OαuՋJWr|H&^t%7$I?,($LJt,=҇cΞϒ; Daٟaѐ6j1=f,2;RvZt#qrxnуǸ&^j`X81A,.U5i~ sENZ#Ҁ*u%:<hnXAP^ [4),oBٲ;wvѶq]W8'L?RCU j445Ǣm;ZZ[#Y(,,sz\mQW}vtҍn`rjLY- ӱ@tnВTT1i$^@vx2[dQŸYk:uIf_6MQݰswdےQTUH z4omIFhVR% n;NzMǐ(k@-13KPqVz4kәݺHarV4b졦ri-J-9vo0kd)[qK0W0o+~/+)ΰRY%c޶BO}ѳ{[@{f~;)rnpC^?Wͥ{|j|\ܼ23 39[xL;qc JmCGvCs#SA\%U5p.mo3i`;jR\9J,~\Eue'K_gt|E[[0o^O&]%բHC'7](+J.r*hԨ =m6a T}y"~Ez|֯JbGh":IVu+bϪi fu-`=zLvӦrE]e5M;#6 hUT9U5ES }v<dxnwNMt).>}Gs+&׏F]<ʫ0t>K̊#\ *dyj2 SI*BOK v^ےsTek/>U|~. zϟS&L/^(L1l6`pv: "䥰pt+Xqyy8RF\\U+B/Β)MWgGuήd(!A/88<9:Ghp.pᛵ gW_oKAKϟ <uBHg:J ^g|K^8rRSzxJʢ}?9;J4X]N(R*MN!X&ƒ1~nD/iL'I Wڒy2:IMD_%_@aݗВID$I2Wi_:5fp^"m^Jg- ǜ {KHWRi >|ÏD6I%@I̤R"$̒VҕVi[: 5Kϗ4[f2I_f2d%k,2ɾ3_3C YX0I&LdYd}g Z.5L2d&2 ;,?/,G}Etrݲe2 e@į"2 |?I&dwd`YC|? OV&L2Y}gdnܻ}C^e S`? y1(2KgOQW9u/}d.b vݸN+}]]dv˟? Y„\K$-R̂Mtt SoxUZjq'4DV !Q⼼| IHL ֖KDC)߸q# q?(r%U*khʽLjM._SbMUfY7$'1jh1b%~QRI蔂deH#dҼ;wf5֮c:WaJn޺E"^J6#s]^CWjR#O;ugM![L)FLjj!dgϝA0djj5\u"˧)VwOG""D*hbKőĸho^Gܼ#p)|$L$|]r!N=8~m}ȤO̾8E*M9"ݜ?bP5J t5ʫ2xd9*?d?u2g\F 쮘ִH"=y nlfJ6A[>s<}{b@47C%{"ٮvgNk܃iP_KdbܔIu8^:oJ @?/mzf&:SnJAy)Q `Z&3#"b](ۯ؞ydB~<ɞE7nf޹s4cieQьC7{}.E@+"9%[` ,zR26 <TLI.q>)NVP1$+Z~LRR"wh"v\~F"uoJ!pnrņSٲtTȔxOE_$MN䄷]Mx/X$%--q,s+bhR^z)Aijx']&W[2BI&5F&Ɍڍ0z͵*RH>PU]4qO+71N4USBٱeL)ןb$ nhN5h;z"6ٰm(߽*b+eQ(O38qDA|i{~O*i[l;Or1{m(`"bljLHKl9~tQ"Møqjs/NѺyS,ZYb}(={mfvwiɬ6g# 1s08^yo];GLSJ31Λa=ךekCΙ/#!L3 # pdW gߎLI_;?d)I1\>&6ǨiZts@0QAt6ӡ![R#;.p d \> ՊjT՘N=z`˜*p᡾4P37%9R~S^|Á3 #1 d^EDθDf+N O."B0(Y> 1w=p"2&VD!!&b,)/9G|yJ~pXxVWR\ot[9OX09ʧ!#0Rq|~ e+uڮ<5Ud-k^=&H5SefB3]\FGZTXlsFVDҼ!Aay1T. 7`Ÿf=GސV0ɒpx qr K,DVZ(_}hr c8Q\kLJ: YV;;zjk ځO֓SU6G/(j'Mkwq:گ G‚h?~/6Ӥ [TFb?ciОIܺmlμ ׫ b2 &Y OQZ̷}4 5PEx- ©H=dtqҧKA *OātYmʻWKe^\{.3HCka̬=,M/DI~ma\|/҉1$_Bk'mҝ}ه|d2[_1L8]\fɟ3{L/ #P IDAT$KNŔ/Nmn?A}Q^}ιh'1C1Z2%Mk&vu5JXl{/_.y MVLYJ]XV MGz-C0<R_~Sg)gʋDI&e>>&=`rET4SoHMX'fBfQ,U$FROeʔNJ)2(Qe2y%BL %e_ svTcV[1=AvLʪiLRwL)[J,?d22 dme!$!ˉ&d- .'Z(pz0wOl_ZH(p:>j9ֳSXZZҪU+,㖻O!].faBIlF1Zc1ODW?E GIbFQ, #<a4,4[W3MB 7DEoBL¤x8Y.FB:{)7 QU6M{adFTb֯^uM4t0v BtҒSKS M5543hBBQ\"D"t̅8::booω1nU-խ҃$ gq 5Zx.l7Y1yrqӟs;Pw%,kZMS-{$31W'.FMn/FrRiõٺsGà3ѫ9pF~ɚhxiiNʕQըOzO62b sV_t衧ByMI\<q7b ݌_9NUE `rosJU}tGLb y!8G g}0qv<|@?dEɆI0Z(acZ˴HO#sJ6GFK$[78dFAj+mJ\X8ڕca"8s!dixNc%  u;MhhXd)o|@cW)KÎ~c׮]{W1[T|t(c4=pQ(K.?|ۘz-q7"ghxfhLRj\g˂j:l9rN=˄E~rJ|͜!RHD}Mm9{0 dν V^d'1+SIpzP9N$_؊^UUӪM{t4UDҼtdfAy}]ӻ.c`hD:pqm:~F'kA]CרC^y%o3%%%U.UT?2>[>i d qvzgx}}t/FbB {899 ҧIKM!˕n"2f^[*~^oxE PZ٩ET pz/x[OE/qppt" 8,']#/2AIL}kܾ?RŽ@#Yԁ*'[dTar BGTNBF 2r!|{ dq]>ٜ͛}z+ݾ} '` d~R2*Q&&&ԫW=K{8"'/#(p%z`;9u==R_s>#⛽YA diQ^#1MUEDe?:o Vͣ{t5 6;ݽ3{uk">|FbJ*J);Xy~ڢo1$&&F`b;585RTu1}1}L&D3 `b. `ۆ%27Y9У&I8} C,iЂS(IM b@&Qܒ}zǔD "9K:/]QQCoK#j+ɣ>/T91$یb?DrTPrQN ~%c!k4=t۱1DDŐ*ULd!>)13g[M#) n^]tR_*K)S4wBUJw[GEp`i!(V,G=#F2 r}Ȳ.UioٴaN(=1$׆j,q+W}vl!*N 7 ji_k/&hjPT)Vtb+7Qt d^u(W&C6k(Kr[U.A%y`6-DRb{ⴂdO&H83WÄIa۶.J+|֡NX'/Yvd-hFˡqʥl"УB=oZ MEG7lO5J|#ϵsfASWd>>>S?8B\˻2(p%}\ ZKX(#D[fby Ri:p6qx9`OMv=ʖlG{ѯ\6rs1=~Jbj g.+}!'ʭ?be8] e؛w| 1{Za'ٗHkI%eϘ}ѬTGhE)doE bfAB1:5 ˧I|jc``Y6aĦ|:T m۵üE Tʰi EϞ7y[F / dnUWNp50D.b#w>'(Czm[ac݊ʕSعk7QQwlJw>'v> 1,OػkocnvǣhyA)'Yِ{I}r&$9^d{߭\ ?d)x+iGx[?*7AGΆ7@I&t?uD]*5jԢt2Wp7(N wnI{F.bHtSLnBG΍7@IT*_VH%H#?@Le)!6BucْXYc8{6듓y|'[wX-[ul {^֮f mworsElY͆5V,_ 퇸5-[ bZ+X'&r_m7KIl7枣GfK21KsT f5fI\ٷf:ЩG.0KR\A+bвӫ{\˳1Q Bڴiݜ&z o1E*0&ӽ]+t̕RTNizn` k&x8鎲&W_(ʐ L3o2S\Gޖ@I}Ѯi$&I"iPZԩA朾g^1jRd!&QB߆;npt$jW6bƉ\폊v#V]17{p޼bEyZLnUETA~e$%rVTEqT^z.>#Nj"CQE/pL\(R+55Xq^ bšXQAl__b{PtݍkĈNܔZ]Dzu`H,`!9e g>vޱ0idDSS1߽~/ʄyKI$Z4;%7^QO:Z({,bYY/QMs_+#@j2cq82:u?N3OSJ7d WQ2U]~Ӣӂ]%$lfvLxAx.27ř,_8xʎ]QQoD{kh?3vX} .*9Q\54]%R*u!dݚ 礇'kрع$F D&oa?6?1fւl$/7=G6 )YwV怓,R2y"P$#yp̊k։a#A*-JJR,wͤho҂QGѪ1j8|dg@GcCyp GbaދO2{L7~/Z{kJjxџ=}1"|\q)N%GCґL,;UT$y-,8$bB9wdG c 4DBOdD:Q!n9| gBk*]B,7.bqQ|rcG9̝ׯDnYh }1}XFȉs<}Gfϡ#ċ'nbĐ8ϞɤQ$Ư%ro91fEΨ[Fpxt,$2Y,bEWX'C_"b?oaօxFFOA,qzGhl*1ܺx'dDI)xzM>q$\=Y~4Q"i?%vyD+G5!vWQ[4I}y{sc[$JԞُ=H:NE. Ah<>sƗAi9- tMg*nۃ7b%f+Ĺldҟ$_@!`qP/\h^9MEeU(pI&\ff Y"vO& xcv$;N.\y[tX0-'p1.qp C4c<2 ̛dV!qIPLB:_,{QY^fUIWeoAGO6(dB_XSn:)m b¦gs1>fԦtJ|dl [GX~ Lh |L2$"«a?\YdHqo 4V8bϦ8fo8f W} $p}BqD8Nn!_dH+7LLLԭ:Tl_sv5G y5찹kxaF=S$$)O2A̻#LGQt&f&8Lo! =u2Els/K95i(R5[< $sNWh?LuH WG"0[,?C&j,$2ꃏ=ggm b)$'oX^QoR4JK BƩ#>!{1A;?'Z)7'h5bF q2Y0z,/"lZ_d"K^\_Hc1vIF?zC`&WRk_GL7ɬj'v1ѥew͊NDsMσH?Q&˾&$ҍϤwĿ92 LM&..K{fFl%ʚ5AӸ-8ퟌ%߄k;ulDQZ5-$i2(Ȑn꥿4NnV֬`'&( }-UTmZg S~F|b/VEC]M9zo"֩ԨdΈ%Dhoɂ-HȌ.m ~"|J+zOٛb!(p=%-3F/ap;ٙiS,>&SRUO˟{731;qřͫQ^$? wI9\{GS]:N;s Ju9q;'x*ҼHn?ɤ~T ˷`Lj<m\|k9v{? 4L}LbXHdK.fN2GTnX8Ҝ7Ȍ,^VXEBEi]6o?MW+,&6Lcc/KDSO=rS֬ KTd*@iI2jSY~*O?d0ji,ݞx B}S,][]"JDoIL0:閦IbTZ:5u:9}~ay,-5@a.Pa.oOd!3cK7뢇r6{ g(DX" IDAT[KiT}&(qrTjU(I#%CLSÐsϦ{^\sp&YDƜA"%*ib^؉EҔ4NJJ}SWwE3Ⱥ%-v-ÔTP6g9>nNV,ztffńTNPx9ZtSL,/ %1z-*0a&!|_bY5~ o.~Φ-U *.Sj̸Y!ǗwZY FX97CCeЂvhTe39zLp*i}lC#Kwe'ChԘ7*.uBCf$9GC#)J2 ԔDbDpB\0cILNO !Lfd*F#S2%'ha>&%&"c#JdyGtsrߗO\L"h<9)A!Ĕ뀩)DFgE!=w 'ٿ >42G@&1*d}|2G@&1*~Ŕ-+^40{B]pd|Ui,*~W]ve 'YhGwEVallLyn8AaQ߬i;016Nrpp+bYI$لSy/ 12zu!#,DfB}ؽ&(VRi!~d"BE?_ײ#ҥrf*劳=R?4k$/OOg= -5%M;&egE*:yYzPƒ^f)u'NC-Vi "#m(pIOydz5q8ۛ\ z]yA1hX\ί9s&.5vbR6U4a 5~(;O $׭1$J$KT,,P8=UWF CH#al *8A~ƬM{B2H~y-4cƅWľjI4LU1Ck(;^WlOdײ%Xd/n$w#d$ˆm(p%%mBt;mls S̤[a.5]ZK(_w#ə!F ۞CuE,M3w΢^`C|} Nds4Kl¬y$P @ WN2g4ЪBѮUںTUbD #شz1ԨM.0156"0\jgt;:ZbE~s%!%iӪe Ԥ|bԨKؽk%1kc~e4>,;ϠT1f%ri'L21%v|p^ڍ;ܼk T .|*%04'|:o?/84sɵ+v5ܝ;wijP@1~+woqҥ廼ps2#\DTZ"‚y2.od8!| d˳L1%ۑ,4-ЬM;2FO!s'#iv$tv2<dޙLTbBxp,nmi~syŽ3g{~ X+w&?L(D/|;kXeLq)S=DeRt5WA¨`:&, XLr*/2$ dv$6uAFgT&v/'ǖ6hunG *:W߀ OXkaG`I&z}UX&ʚ=)_=کj3f.m:片OVN"8X&Ǻf=I=E J)'s#{rʅI,*ʚI"l~V̺Q?$;w˭Wj$Z ~O,_RE}rqICneuѬWQKZ@40ICYl=zAt&I&衝lmYtXp]!m"M}_'[=Eɔ;)Ş(sLhHv%;=2VsdS_Q'{G/:eAvJzbW1Ŝo2»xZL3ƶP7&Yo"4V1п4LT^J52>G\xʎbbUxHdv1 2TςXmaGI&`5/ukhc١#:XY~S!QymK'٨y ZZ<7EOf*ϡX؅V'4@&utzlz=30Dbs U tܮ,_jo@|4N~ 'r /2 ﻗK^@$+ *Y{v׷$E@PAQVET9g]u 洺 ( (%df0C0_}Чwsgtj<Ⱦޱ{@hp|^ \MB$< ;ؼ yO$#^qy]W^"?79ٱz}`etD+ |:M[y\|'ߍrY^ t7øǫ<s?0_=Dj`b;b?G4h`M +viS5.E }dO$ ' D6AG#yha<( é%ai0C*5 xʁy7t.*[U5'Aus7 6_ ,JN-Z Po'o: W sCC,/F\ͳw Pgebx{!7/Ң"yB B&tDb!((Ƕ-CMStR~cSfh`,q?A1&ΞD ,GEna3|h߬{M+b2jVSѫ"?l"Dؿq)F α1i2 szj;U/gFo<*yx|L9uq:}; σZ\QP{'+dY DGW/1QHKI|L$̮dpUǜχwbl|y^(yx[x ۂ YI̧LZ:$Ń Y(Ξ˵|g\[<Ȫ,_w;n|]<ȾPY!jJ72d5گ{^.dTSfć}pG7,/$c)2v14ѼysN4KKU'};}A6Z34?!*Pc謧'v0D[- [MPȪkUab ;7:QFID{(zZ@e+$:bɖ&]#bc P\AOˡcK h?/\wb显1SQ6P[ {ǟ=!M0mv/'uZ!!Y}?&#!f1揋)@\\"rr:%rÄnRUK%ˎr[N&&cZ"6R#K3"q`-XI.oĠ&+KYf,۟fQîɘN%8w%~ Ff2m:f&sZOms<,̻X\d,đF@C }ЩicXNډ/K~4Ȏ/f]%nIVy(&%dE8}p tGzly~h?Da92;2e% !<5kI U+4{W2:)y/B"9%` O_@ֿi  dYd3W"@pq ڴ1}fD>d?!Ȟ1L[ H$M~,VMF#}Hf~3+ H<-{`eo&_瓀,CgC۬n?|\aeiUF=A]|y "44+Vjbjgd.n_3Z!s1-sqRo#N]@F[!sQZ\d&R\f}q;G')6&i =/b Ѽd5+玆Zk=܌4\cXX S@C퓂,) ;c+H*@ Z}~8kGw&Ȓdd,n C Z擐${VY@\ڻ @(JUpjc /̳iMUy&كFKwC8aX/| HsU:c-mѥ,@`bzWdLΓgdetS@4ՃU9~7܉hE΢ѷ1ڛ[aptwmu 6Ahu!;=5co&E!1)Mu4\q{>Hd9"LJ&:vprRɕ_Zƍoqd }E) $/k_p=f+$^.?c#OA*GLoLsBjpnhuATE.l 3r"%%>_CSSZ%3q~I$d.2 40nPrksY 6Vi@Ya.<5W-:BKEF Ev~l-ZaYE|Vj8Vϟ-cg)*oATu%;@CХP$sIps7m֜`"+ib\ڿxn{TW@^΅#1]]m:.ߴ?qbmԠݒx Ӊ&;vBS۶ENuxh5d)Cl\N-;MI 5O!(16 icT&+6%tOFĥ{{r*KyddzDo#- qf Ny^VG*ۨma6tOY@b0,[hs],sq+^P}5 9FU kB}S͛dw M?1*MO/L5F uW +CbyߎHkd")b@ AV Kk2d,<_ڬýy' M`1DNFLJrL|yߓVU3g2&S慆d-ӆ: AƃeY=3Ws)2d&gAV gXѨ<dtԓH'|b!-5bKuaASk @  ^u6&Ļt2vAV `E2,%==w7Djwo#.6h>X,?D="V9O,B$+H,r 񼄂2z߻4:Yv~j!'LK@iJ"hUf&lB\ GSCW|`$f x< +%Nv.8hᡏ92bi`v:7,'J N헇- OE[K!]ltgYȑ>AV K`اJ dW7idO<d*b"(^DŽMσƘJKE)2zOIA!ȥ\Wi:?4 |zzLD(*E]"/: i_ЩNZ"ހpӣߙI(VWNyiAFe>Uqp+t6gkx"NsMrZ:dBss1+B <P3fU1WMri7ǿ?I[Wͫ$ PY5"ӁN4;,qn L.X {-͚]`ԡڛtQT mGR;rgjO^9YVv$3}P}5,i2Ye=}ySG@__f]>30y|f*/L}mj;n'd֥#0C}ar*@dժw)5Y11jʌvAv0La˹[Tͣ=;>鎉7#>'v1o19rv 2) 8j8uSw#""dh]A:TAWڎa= 1g!S5OuKR\X7uKkY:|ݫdeyc9Z`}ǃDp?YA16wD>;OO,ѡP܈"!n;e> Wl!%њY9>= dvΆYLk(&T)~o`0m4,]W.ƒ =1c$Xw٘>}:V /AX|ER7E4회%$:[31oha6L@c5 >z;eA,;ӦLϳUɤe czCg{" bŘ1mu[ԊDvCf:mΜ!"93+9Gvo30\R89Jm9>8MF ƟѬI8F'2b\*/D`en.?ZW\pnD:Y X2{,tyٳdm68q&wz+_ 0?4Bp&Xф@_FpN̂,W'l:|Cm~¤%?6;+@{w3=9yIP=m7:𺶍='Q<lX0jZ{,zBDGBG9 WdR?i9 y#őBY3H`naA\ 2aV@4h8G*VП/A&?ȐIr=L;`ΖMHANN6aqf 2E f ;R|VѦC7\3t]~h!Fhf^"17hY EHT>Nklv#/$0IJ{zU,_n!]،/+!휂}&˩|J&}?ş{@|s<"omA^W g8 MjܤeeGF|3F9i9}ZP1Qp(ŢYág5q3L{Hqi\t=.ׯ}Hr|(łL/Xꡩ%D{8)Nj@vzYKE8MGvoPwkTlr<zblSh2OPu?qmwcX@$D<điǮ܅$ztr2*J 3.XڷŘd"I*Es GC9+W3l'%흤d=v%&DhC?D:}m]}F*O$qҚ#~=xBy JѶEsj042vE M mi \4@ց@hѐYm]006mjp\v&{,&{CUcb[JeϬ~N5S2=i&AqyRi:!:ب=Zm"!Vhu(y,//Gi2Lg <֝ð$if(4!@f@&(TR pc]Z{frb!Z};sr) ## 9!֧ }.y63s#3Q9V%V>#L]H1Hhc\;a`+˲6j-_o{M@MV ^na}@ˤ7!Ȧ)1zahݦ=vDgL C0U7[{:N 2a?f}(QH"]p Y\H&y\1eV$$|i=EfX8RA'qj꽻Ȧҙ + unh5gSt2?|Gs[يZy.]7ԧ<@7|}UeB[ G!Ph4y..=8v6)1xDMIjM})P-0=Ŭ3Q}'x ?/>zSؓ,c^9b"/DZ+YFhcd wȝFz5Mto3( oD``8 9{3GFKM=~ΞMAiY\n;;3>3aQ.8/w+#p&1Ο:DG攂073%gO۩fܵ H+֑pv8;c8yqOd#'7{.mT?O‡m.ח5Y*HH.OEQwkv9~T&)YW@sJɔQ sWM 0rF& GU,X|̝\|qnߨdݐE/.XL*#z?lWy弃 m\+˱dSCѣB7WQNN1mDфÕc^G 6bu/@~U;W_u.Lgt*˲+7ρar;>hv+n=5Q!y>Uz hvN"۩e<3Â}LzC[}YLHORG&9@C޷Τ|!jS W?r vwAVc,M@%62/_C<2DzNUԔ$+дG{ gjE9B]f6ט&ԝi5YXwWtz \ՙ ʨL\hG$t ~8$,3 *u驈w®s&}f<\M+DJb\+9\uO.q%=]%d 5\;6mޏ>ʫ \=/I~LwD.e{ET{>hZB\lc4𚬞OʹF`Jm*]~)S^YDRjJhgu(uA_]QV[_̋&VFO}D}V1/1SÃ@V_%2d B72d 0 287 544 C   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((( " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?~SNG=9֑p*HF2-HzՉLBQPc8Q֜e2ݴa[xvgh\ՌަZ&:@TRxe-Z1bͰX R0qօX@wӢ8yPq]0 #TĴEX@@qɫ,bD3S:dhθP3:HZȹ*tAǞP#%#u$mQ肚%g&ɩ"/BAE {g!iI) p=h"=ޤe\58^:sMub4CJSV#I5.<3)fAF,Y>\̪Oڟ!"6dI 0@\aW?ֵW ͵^=)NzM ٙoL^YLqb00:RHG 1L ?Zeʐ23RH`cV²)$jA'=IXj< \t #a>֔gjW 2V\:AR;q9۩Je]pbK\v+X#[/*9ksNH1!⹥$g*xgGޯx,Y"ϙyV)@##Uwr?ZZ).E1yDTG9] qc\ yjsY$SO'Cɒ @`8"լՓ@B rz'֫@PFx,L 'ڲ Bt$Qޖ秽Nʦ04ML)GJ4Ȁ&#]6 z}8/$MS@FN:Cj,m[#J |ƒROlU'Й#60ҨI^s5!<֪~P,#6xuRg?js93\-g9ew|sϵ"7-!G51*V`|p8r,Fe=)@= qfN>t," ȧ U_Pb@㡡 9=&dlC XxL㠩rhԬb͍RmJyo4+ ǧFé5* )p(HMp0js%X]&[6f{r(L!a>lg֣a ؤinj&> ldqO=sژu=H4ϥ4lE 9⛞ߠ-c&%~փ޴{WsU&LFGAjj&'CqW7U$Ơ:r V'Q!-0>49֚LHxP[u>yކP))4I{QH%Ԗ5fH:⥍Y[%ALp9)#2>u@*^DTaNjVzeAn;TŨ⤎&f=r}+BRޥ"(tOU H8{]x<qʍٹlNY^EUT:չOUq1֝AlP6G vxA^1KzO~'֘84H+!~L䠵ɒTYd1Cn$&rs\c4 /?$T֙xylOjnсڳOdh܂yHґXSBГm&6FjsT'T6J"=2)Pox>qjďNJjRD UY:cWZ<:PrF=_)zCdr69MSiӑMnC*Ӣ?>=8{f(ip{SsMstv2@/,amN?*w!^9łMlfH~+A$ߚk49"煣lL%P0zjr9:m?n3֚b~0zUbyAiISCXk ^JP;pO@Nj%Vky3^jyrą>#vcwsU.pF{V W1^FJ=LïV,6xZ2[O>٩.-oQ =*`ҝmdP"p5# $8P+3V%`XXO)eb<_´ ׊rZUq־c);SAM:] UkK]ѯYE\g#"RXc99/6=mm42t ;q[bxa'lfE)1°0&Bҹ+~+Wҹ~D*ڼVm͒MV Q6uj38[ݯJF ss,QŒ{Eܙ+2@&*0tVfe<~4` anȄJWx9V,+@@d0;T=f3]NqYO$dNڨ92܍Q!*48qUY֒Vcz8p9M*ǟjrA943c="lzTjb4QЇbg>x?Zpb*2mZnuH~X}jߔP VCy;φؽi9NMgG6zэC(s'-qQDoj6\7dұݜR1֤6CUq_W L+֓ pjb z  N=榀JC<j?QU'Mt,7PgƬ#p8"dՙݩII#TlgQ:q hh2|u#p"dg}n7֤'E19XuLSяZY;RG̋CIETY2FH)điNZC>I sH ?z"J1G慨=mES}@g< `M'F SE33ހ3ұTړU1uBW U,G$KlwIpVѓ'}M6Q }tt1qؤ u-~^yKb<-lTdsڵ:-+v^NzR[Z;(xjs.ݲuV/m㗔P J%+k x|$n: ~=3\ſ1U j1(Jcxc⺡0 Gcdj6]3XԖx$?Z)(0N$VֹT{s⦤ݎKL풱Fpyc-m?ˊaiP@WW֐=xekq# r}K9!W#\qJI9[ ;hPwW$}zSE*)@w ։2/Bƕ9w f$}? i ECҳ8*Fp}9|L}j6q>l>,$0 8'r:|[\I9LТXea7`Jc{TSIU#E,=*d:n&X~8-zjZg渥;"hB>_|q2@ E^X֡2 5FELVLTo#c3KUS8F~i-Zܶ9t"n; yֺG˸>ODYo9)Ҿ3kyqQvg(ϥS`03۽jC+JF+ZP1y@d1⿗tfNȸ-LqlfXPxRz{U\CF{խ2tA:+RPɝX Ls\ׅI:ʥ38լ`qϥF`⦹ sJiG5_Z$P\g"9 nx&8zַǩdsi} ^"[$sTF2;Tdz\ErVM7SڔnRdt=JWG {HѲ$ui!ȩ'j5ff\`LAǀ0}*dMWU\ⴎSܵjA[:mͽX 8EMNq9"P9\T~UQ}.RVђDp=hpj(@P ғ ϒJ,$O41q7Nw21fcw}"rT\z sw)YpM:ZtdWJۢG#K s銊Tiݛ&PlY1ޤ<z0pC҂Ҙ#xjtpkQitbwүv5c٨1t^~Zl-HQ1Z-e'c?O'Yfɮ$Ē䞕YȱHvV\Ԝz~_AWٶYeltmbވP,3ҴblIAjcuw8؄ ʹ!Z.Ya`6kd]D@NΈE pViY3 KU`<ZWKhʒ}Nwu숒ղIx2{dꐩ!Pp=-C-#Qr'$,<5R)ɫ7cCf.4w'Qr,毜:yV]O+X:҃"o26:I<>s(8w䄞kVG6zE k։Iղd+C&vҷdeEUVHTTg*6Qn֩3 K[pW/FW R9ic1K2VOep#'5rNܡ`q(GIZirV7ZlF-ytU^8ⓨ 7$`NZB2ִ&% y>+c>I9l"Ү >V[ls8v m&|sSZj -̆IX(LޓwԤgO=jvN;n#!'~}i5 k]$\9~|sSCjg#,R OfZhwAjyP,Mry?7׭O*A=?A O:蘩\ԭsA_^id|`U؛mѥG#AUϘVL&k>\/U3rm=yֵ'i[OlS [ 8X8+ S3VR1XtآGݹph4.GSxcڮk>]~xd;XZFG(U>Ƨp3^?c;}F=7_YVf;rR1G^ =k1u$8OЀ.dprYܱzIV*u А G+W22qs4K1^95pn ?>g8v֦Y~[}M#'{ė5$$98sYSqsדQ5ЉFZm$ͭNKڝq~. #W`}"Sg>^q9&Z5u T!sZuhጐ`TYR4sܜ~f 1׭gΦ8`?:kpWAm#/h8\LYwFcR6 =9ʨؔXH99?_dٴ4{V`06gܺtKxiDp0*U7b:kV"BY{K rEO)i"+98=k9$zxZE6[rg p梷XFMS3g!0E' +GƫEsPxXVZ"CdvMSҶkC.GяAO?{83szΟڼ[:3Wm-?1u,99 CN WܷzV]ʐȩ*.D ۝F~o@$*ye#OUZ%,0*eV5 l|  pVsbhVuOjf7l! ҵCWZ+=kRimgYVV9Ox9IfxRn:q(:ۛiY!Dױ=X1^0\D6_jtգ*C(a*HqOCrAi`e'\]d]zzu1*h2ԚΔ*m{WBcy5iQwXַ#uI"71' )Zf4ۋ2!<&HI(#MeMGI:U9 "g4\$bGaVc#R)&QxY'Zw, ڳ%?58DM*D:<tV1iqI ҷ5zi$ U951j NMTVb*Lkni0qJ[p8V) L*8ޢpSILYHc^%pT \@Nz8!D2r1Ebk)֖i 38gYn[w1C ņkn ak &,Hޯ$#+*eNE[U/&‰5k,-Q)[pH\rTrąN}V$p,}Xt[[ {eb5mXΆOR[&W=3ӥuC0ՁɎT27J@Xd J.Cg{`פO!Ơ?-r>$EI4c,*ѩ,loϥ@3Uu2{ +S{LB&2S Lm]}}}kq>T3֝YVڎc\01⹹Yn=IuXLjx9Eg$V# 7Qsum0ݗʓRȰsbO eaL"Z!P^sީ_IrZ'QH5NC"9/u|'upi~X@AF5]<]&( mՓDvlʒrЪe@bb@(yc 2JhfbuC#lӤ/=8-sJ\dSiug] 6:(w+4U'?JpncQЌ:պJ/.VM2l\OZɸO׊5ꜳ,ք.\ľG̿mOx*qO1)4rm|T`}=kHOjqRص3xr$9P#]߷jU-1 kF%T0*99(ʎkgDb102=E$!CX*d#ZAkNƪ%Gbw1+1L`~uĎ@^1,AW]}i³LN(x3քH 1mO!3}kshaVmE9Q`d 1¡vt1K4k֨l?$0 Ry L58QYZXӵ9l\#/A$ {H V,iV8?֪pMje5I W; 2pwB-7OzB9 j岽;qVlRMN}csnY;GOVZ|6df <]: SLmwrĎy |87w.k\QQ fGS0󞸨M;sR<ɴ `j'#=8*S)ɢts2k>T8EŬsjϸ o# LrL$r Eێ_Ox‚>Q $W1ă׭$U"E$zɞ)'h6b=ܑcPǑZv!%z]ųN)+zo p0߅fi3,ԝ5.JQw94vVZ4(w'96!OJͳUŻ[ >QT@VM>Bx⹧ntӖf:n=pEE4ߵ=~^Qltplimfy/Xr^3g&sBL|Ѻ"*J0Xz ņ;H鞵s$d<՛HN:Y4kW`EtɻJN!s֡2=3ɫr}#?Z7v*M Sxb tٴ*IBҡŢ4fN*6+J~AҪlZ,[kT E)u-F6Яwy ('猑6w3^DpUq{̚u3 coOusZᲈƸՂ~歙!˄-}x6nZ G9lN rr㯥gMbz]Խ;jP'>ru!]6{xk=k#4Hr}yiZB0ǫsMh ڭ ֭K?K<F[UASǹUdtcc1.;׉]A W@u~bOcY0WtR!8\cZ3+&)j#? nri M3f[Q v0a\ֵn活f1Nf8'+sAp["ke8>^GT[Zд-L=.AC*W 90Hv1rzTYjʨUDUݶyhajZxV?.Tk&&0J^:VNbqPՙN5\OIyUaX6$ LU?T17ASy*1֭2Zz\ҐX83 Cb(֢|ƞ#PO'hL{ ~RjN¹<,^O]]-zd 9$>[lퟗVSiƖ&G=Z mcҹKYe(("ѳ:cZMdDv'9YF;n1k;P[?8tS7p8~ҕ;oC5Qo+I\t Ci#O^KMqj!x؆V,8]j7 B0jQF}̛y٤$=sTolٳ*(֯iyXR+FKjiĤ+Ƃ@Zcn>^9X$GiZPw=IZE2QX}+-%9Bx/[9%IHqQ1\T~&+mb>j+f >Y{)7fm"6EGLr*ۆ{#gb(In%brxqZ0Z:A#Mnt7 +F[(1SȨ=M=qUZL֨\ȒnNUO=7SxcϿC]iiQgw,I9P'khpp1U6:)H8eb"1?ޜLr -Zt;܀׏RͣOM2DգR Vk6yw#Q C?Qd%{itjť0'>q&PDLdpWGa-AFa$tM*ϾjejGcMGo'8tiB!lq@{ia9֞M+c NPH6$DbF:z-m'#q{Re%wc+\Xw3ߧα%X֒)O'9anSЅdoi& >V_@8q4 GqiÝpG~=*:9A̤3lS$hYHeRGFShH8vln::v BV^/ HҖf jApp4aK"rEI Lsb2g?::Ry0?2 Q<ѕ}hkqqJù\i8n%v";ϞئC 4<݉ǰo;zw+n{/.dXݑ:T{P)'c4nuޫEw0:Pؗrݻا~:TnT7Ld{sUd?k*-"HDFܻgpX'td\i0}Eq  3-?'c+R^sVN Ozt 29l)\S++s3J }8id(,pըp_hϥl[AlJv-=,qƜ1)b2#OҴ|'ld.1Z{#yfH$/.%TOaUn Ffh ^XķM9TU+W9O^Q"zrZ- y92+:dB}Owt=c^^,N)ܩ9f~]\S Xs,LC[ D tȕރn<¨z`^;fM?nE nW"3{V.F ~3^1Zr6и-mvP=+iuK7=21Nn5dXhiK*vQP=]?/Zt +F3JkR8,k;Xh WoAGol~-嵼, sF+ G{47 ֪fO]<$4* u:סpI8 ]pW֕dSʐkEu!gAU'c\ ǖMWs$8("Sͳ۽<#RfrMu^OK;u?#kNi]GBq]eAp8 \pTmΨ3j[F2sJ3>ت25$=򧷵G$ҜO#M(}{ta^k )WZR@R0H犁4ю8iXy@W %Ǔ=ɮXvpGLYӣO9}JT/sTDI'NN17)*9Vh)g'ޱJn[ԤW'Fzץ^E}n$ߥy!K)'>K-pGj swgP8c86 V<" "ǿS,J8MTH18N< >SUy9i)Hw>6N4 @iee)@BOT)ry9!K8@O5ZiR2hl9Sx:~44xґӊa'֖Kz zR/CeG'&p!v` UTTEjRdZ U*lNv/^$ʐOsRMg{ȭl͡4my,Yc"ep*+ʡ'@288MŴ ]:q TM\RXi6V(QT2B1[Ҫ^FHSsI8J`_Ƣ"2}TV[-AGTc}Ύ~[> =zOe#Dp9#ޯAMq"UꮊM,4] TYt0,`[n8"4 P9ǵn<85S*{VjNJm$t*PgWֲ^&<:t}knFeHǥC48~kEGC\ 'kCp{pgc(R^Ik;䲱o3'œr^@qG'd=GJI(_zm\I+K`Sp)3%Bē4ߕgeֵH 1\oҴ0_X0qZ6PMsY/~<j9⠾W?Z\ٵGDQq{ު3p{JF8٬~\IIiEs$.oζ,cP(cVƿG*%SipsI9H5)*HbFr'luU\$WZҸ]6V O ^qrOJʤ5n<̠pd#9="˶7jɏ5]J] 6!P ȼܰ_arvFNI4-ė]84O4nN5fKەY뻏V!^=bO9D:&U,Y/I*̭ιB J\u,DFŔ =?毣Ze8l& V-rEX/LRyEzjܪ7MQ3ֽ$9Z!UœœJphi~41$m[3*z`Q+n=xBdzu%[[B[ҧ;Phӗl[i4$8P9B楶HyKW,Lbi4ɰ cڝސRz+֠ˉbxU?{*diǚV9J;=fJ=*.?R=+(6AI?J|*>{WkylxZCSMPR94޸ Rd+SݼA+֎vңh 1 2 3 0 0 208 500 1 0 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?>nnu;xa2O@cV?uwN?1`Rz0uBF{?M5?\Ҍtx:єd$V4ښ?`9h(P@ٽ9c(Z) 3sA60(Ef&=T꺊xk@@ p)Zv:oΡ\촂 vӭjǧZ6| I&ck} \/L40u; ? rw$Ԩ2pEW+_iv:udkZ3G/k:=1 B$^U9I}Zl?IϽZ,nM+:Xqқ +S/cOPaBԵ <$fn2=F+Ҿ5ۙJ${wӕ&/V'ǯyM' W|V]!ZR3jǙZ},#۞ǟNizg%lOmz.q~3L_j] 񢚔a+'Cxekd;F[Ht/8+tdUiN]ঐ+x] kmF 2וA-̉ͅu =`97pE7k ;=? =h0ѝӤo  \dbV?:PnL(4U *7rWŚ' \S!'#.[לd)pWӑ0zx{Ih}$:I|?7!|Y:I's"R#Ї~9_5\>kܧJ55ǭ >JJzb\ާ]$ w'Ԙ<x #>&kUSN=EN`^oJͩ\:Y#QnM,WbÖ{PS6zr3zWWpLgP@8&86 Q }n7@R?K# \$4qd"?ZFAž%/UЂ"+d ,?>gTK)ϖ+9jE ޟ1vk0KKnojdu7# cg7k`j6mƉ2SG5M8(&74^",)zM( 3@\)r@Sԃ֓CA皓p jyCŵR8 PǐAZXK׊Zw˜qԎI UsM+d@0<*"LJ46*zҎexȩXbƐB7J=x>*(Nݱ<Chu鰶} 114ÃޒNþ7$$|^dS޿gF;?SФySDA0=lx}wz23\А+k#@N+wbA67prG?ZsKPvG OS>rNN?JQ]1Q܆EcN塞og?XFd(R({woy(cQZiֲÒ}6,}?Lýf]?ݎ*̌eB93Bj=fh1GzwALJ\d  f|Ӱ9 5"ԌY$'Pm2W]j%pp *Z< Jrn#U~Ajԋ;7S9bu)ԹCYy3:9̂2*,Nӡm̳2yT%aTgvߝ:שkj+x\9 X1c eu J|LƍR:n=cz}/i^>~ǝdu`y~ο <>[,@Ǻ |qVS¹Zsr-m ީרn-,0Ոh9ww ~3Z2n/xn/#W&3[A39NvHIʭ@pR-WEMb@NOQZVe$.#HoK7X`Cq.猺Qfg',qУwʪjP*n2@7`)>d4UdxQ!MʞԡQpcL 0F;I©OCQkrI&  S@ĪT}*p!RUcڅ$7!G@ Se*6p T.{ ޴[,4h66ǧDamj^!2I=sSn[IɬCK!B:g\(bF@0k)RWњֱE`x/#J #y{g?ֱyъl3z˟R) :ֱMʓ2|*=-./v8W?VXI~osu>ƆF#H ?A ԷIbwlYf#3Z7<#\bQ ;*"X?]L>$Wv CONkydV^2 3]?IOJƫ4~=6zT%|J՝C(VQ%[9zkt@ k5sJ?MZp`.zsNETH֯9@?֪Cŋ¢e!7uqVEx-D."ǥ"L C B'iC`$3dԤsdd8R|5%!89!G.E7r#9旐re L-g~3u@&|9GlLi GHY>2;)^nŖV Ο/f<&Cqz/Ǘ^+mj|2May-r >#=Kd`}TW4,Ǩi?q{̜K * ^@G#*vB)es[FVwd\jԺ*ɆIN[j=,k/Ͻh_ u+6=2++h,n|88G <3W[yk w=(H|Q}c|JF < S.QO=L)PXhEF01;=Ozk#4ASiB7a x G?Q[\T ǵ']K!9W ;U*yjjĤSLQ$`L)5PNEWA$z-},LlBdo-"De IszmevvRL(=Gt^qm%ϐL m[<\ZX/S1;WIE'E%=,@>>Z@>5š$?郎S+~d7nqҬYǺGpM~r>׼˃ڐScV SJOifHڭZ$ncR擰[ӆ)]vqH*pքkCl%fӥ& "'' NU,p)9O VᄲL1U9 AHfФe?Ɣ( t>uWe㠤0€j疥F@ i@Njuw!G+Ƌl;frMX[nqʓqTmV8M d*lh>>}qIjvbyz #z| 9Rzώ,?g{X-k\B5Lg?,WA`Wi?֮"j|Howlʧ4 q[>79񆱰|sW4c9e#d |h@ȤsڰFyRdEIH8+[Y"[1[bHqϧoW},Y?P+"<`~֎q+)iE^"%ˡi^\,#b;12ns] :0錂֮6DqQɐXᢣ9\u~YI4(T=j-3Kǵv>^i.7GNzzWKc[M /&-ǐ0km %g9?.:V1Kr4#(S4S٬;J&q49 jhgZ}MnI104ܚ#6R[!-T{-ėqn\624o2uU7tj8oo`OJ)~9:(|({:\FTJ)wد5oZ{w>\`I;I ]#U$})FasS[ĦGVmqP27<\br@01ҬEjF2 O DoZ.Z[O*K㐤{*"5RZGfCn:gzd֭|+Uاx@҇&(?BI"p.js*%1Ȯ&a3Jȿᄉ@5 Y\2\u;zV3OAt$qWXc7S71(qW3mXJ*ژ`snQ@9#zzϕDWCMgo;"*Ab9yZ&d+cLp~{Q%g985?)+'kl q!AsVImXy<ZzDVbtP r;ΦMo} e,yOjgk>% ?~9zĀL?OkUOHHHFTV؛$/2M~߈s5\q~/ $Chڱ|mkk +f`w6y54^Cwg0W8]?Jg bASHm61R[L<%pvntBVdV" O[[6ɼ!(~|ko$^ė>d_('Y<=e`$r0ʮvOޜ%yt |7tEm$)<׮z\Ēqh";E|*>gcsVbm_L4˰r'\0.oz/HY8bWGsp}5գd;?X5%H|x^6۟PqZt;YQ[Gĺz@"8+B:5z0,Km8{~\ŐF#q=%4ۉ$4vw1_*iSWܩ4/Isb ;>_E[ɢWy.o=#2Ŀ)\qB.bOr 6qӚgPve`gh{"qch<=I-rX1\6SUXwE-Yw,A|~FuE۳5H0 (]Oj{xٍ?ʚ'͞"7Xڝմ2qW5+ۿ5̏YX׉ RʅH 2IJDvp!?CP eo}PjiܬH(Nyq]F>%g:F <ަOt8?Nn&/T_j1ҊŽynhi}lV2~Uh@𮷓޿L]1Ε/SW g=qFk'PLҴt8MJ'Ww qnY}YPN9,F3&~$s3YϠuhm'$6֑gVjo}42^j2mMI%hq4g[U>Qy֫pY&2s֋quZwQ mbBHAvw@gkvT>Y8zֱ2{jh L d=iNAnxzȆB lYc% fn2uo/ (Y)*>PpM=A~]THq oA ]ȱČTT66xydSp],o#>Ybwn=?J۟+(TKƒpnHҞ,rIt-s!B65n^_`r{\pIpeB@=*Gc^xoŸgy4ĸCJMm'S!mcϡY*m[DW&8ķ&O5&d`- :+޽+T;\1YzS2,0WV֍sg,R$ip>R{~Uesm]vq$X9vD;8ojK9[, }%ԪacQ %3 Uf޻Mդ^I/ySֵ4{Apd3A©U86uۈcinkPڤ4+Nr1J/ 'pG m8 Q(X\/ˌԂWz~?)烈' $֞^~`׌{/k/< )Qie⻙`xTbG^&h 3ںOn>3֢+x넻 a6ɯPsݫ{m{v.8qfL 'Bӭg= `ٍw"t1iФZLɻqP9}+7Bozso|=}&i|E<.O+ROk*IjvxjFzRc2G+e{Djb4Oe [͍Č`F8<Z/m- ϐ&3 z[,2rޢ0 5v#o/ֿ@̛='-8ak#\jd#y=;Gz#V:}ݴKnԮs%ִLZأ>k =8(k֡85 UEL3֑8,[֋-I= #&eqSx=tj[g8O զ&HU`2 kQ"+¬Tn|C-pbSF13@@q n '+!+uEY^ Ҹn&mB̲sPzBmsr*(qQG/' =)FKC<FWʼ\GQoblC ^i H(-1)~ⵍȇ[OzBͻb5{!bD \!XH#"F5Me%6G[sskf9`IjK@jQF0ԧottmBk1mi݇ƩG+D4HKeBLY9R%&=$S7c}+𿇖G*sJR)]rJG$AUjݍnD@gҺ/(`FH?m< m!/מt)'fE4K$7Qiju$7Σҳ^dP>4:#p8?Z'{Z#߼{,$zk7#-@6ISY'1]K%7vFQ(̈?标wsi'U=-x=+~:jRpn5[@|sLDw gA5ъ2)~/u)R6:J9m(.=zW!"KpP<<7c׭!̝[q*]k“_72PU'Z.1o] m-oKa1j;|Z +WGL p3V&ؿ*|W)`rNwz(VmH 6>gG%%¢FZ!G9ZQ+9^2=ϧY.wu$Ur2 [Ւ"rEH<{QI#m4'O\d6s#0[6V͵Ln@,Ҝ-\ZJ(2q^i=ΚGK[W"?vAp ~{w;qkjp^修Gx9X =@?ֹBpdlW]?:ɀ|UatZwfbI,zUA7QzeTWX \i1^y>IwFfCbOzz tmƕeջ |ӂj{y!Եi ܇s7q\ޟa)@[Z{=DGoQSRV5#kmx/R ")d !P:u?*o%ߙlAcqvx @zZ8{w`H¦-V'N2IFoF9w? )dm?½6ZjL7 F1'iέ53&qrB誣$,NNBOk&I!*H>s e^xT㮦nM`dZ&R#^–Z}jQVSOȈhu ?i\u+,"Bʿ2IkF4oS]WWZ~qf!`l1kɼccvZe_/{70Z½Ud)^蝱G$3ޱS}gDlpy(Y)v25]6+i-. Q^F9JmqEBCAAJ 1 50^[?B\ ciEܽ5ί`r;Ed?'_ soJ_MsnQDi&Yg!u n@#9w\֡XY|qLP5bۚEITO@z#pIkp7(=KMJnC{ûPM+LO\p;K/I%6`O'os5EwsNw9^%0$ ʤzgt~:FkhyF]c==sByG\dž1kZ 竻2ueiORǜ UJ|%:*NbYe sQi?gπWa?!ǿ_Ƽvƅ`=+)PRw6v+5[+$Lx'P]2vx| InkዓArzjgGumfu4z{*({t)et2Ds?C޹y p$RbǸuqZ/~b}G>gc?ּ{(P15>/k Cyxeh' oqIؒ'*Aڨy9=VT6H'Rm]QZJHWr}G,ܜR\JqQHiu3l+G77"ad]<\\r0>gSQErбwҽ*39G4ӐL#!-6q=IgI沕'&gMX2CY W=gz85xD 9 l;q-y?Mm]41?kl1A>KvDWʷ~'+k wOxְu \M{Sz%x#qZvyiooOZs2Ļe;j=1J~e#ZƲo.b_ 6 '2y( sy Z4Ը+=OIm$79 '6*2r@X:5Pڷb1=8su~5H {/"^Rg fuGJ]N&]*q-کPݴruෲ?$d0#]6nڙhrY70$sԷ&i2w)&N)D'1=i1W1V]Xw=C D[I"G^x/[!q,o@<?*%g $٧ć'ӜW:$byֻtxฉBOξf&k%S7H ~T"!X? u%7H 89Jqwz>UF$FG5Jx’<{{1򻌅ICĺo)W5p3aYCKU&Olx{jQWLQr{|LiZ^?+9$qt&?m@DfA+r;t=땰Wb0y kjj4R8(qw8,HOg cX+ogpSTV[F "7+XEr&;KQ.nQmZ\3Ƴ_,I8hh8bJE-r] ҽR&4$W0G'4;kQN|'A=z_/OHo(ɔ#F8eZp)^4Ưbc|~^ǩꎃop58f1=O;ּRg+?tp_@]D\aҹr|HN BC.OشWR=;3 k?A`3kvkY+Η/Sm,s[ۿj*[k՘FNsM\GAnXRk>aUpc5Vl5# sg]x%B~ ePDnĦHsֱ֢[ebA'0rֵ>'U`pA/^~0a)=r%ɓ_i :Yjܿ4e^8`sIRIo5px6jߺ]̝1Xvfg袺:mqX=Ay |lk1](: H3zk!1HA$ֺ$eXUi*ݶ*5B n]?£˚:2*2&*llD$.H:UAv.+yOX!ЕvZE} ||*fKy/*B@^Aȁ3gڸ#sQM1pg&WZ w>ha??Om^x6qU^<5z{"6w+ks g uu<(ՎݵA SP{Z.n*Lz/zeP\kSi%Lj6Q>ÿ~5J`>ev~*:$4a%FOA\Fd6kmQOl:&3"GcYs٦tPw+kxfEbs_\8?Kx$_ii.W8r{A4{<7x\Eoר7-ޫ(TqgR֭p르#"l;WkzTk[(ۘE,r~Xxaq"͐csY:M86yU<'ۥaͪOoq$HѤ8r;qڝo"K D?$}t\kDUb84U.HIp]w`i6:8`zU\p@c<ޙ(2b?BI5k=ɁR#2wF%[5Qc}B=NUmuzp]h<08ys5- 'y# YT'b8B>U5ڙbT v4KAvBܶ3Qw5u+SzHa _-aצZ`ciZ[+;D'@3ܭ^"^bw≢sF^ޕ~G9Sd=ktb1l.mB\ !:~5sܣaW_x&yG;_^xcqtg4bf\l#NVTEq%XnA;N䶉'2G+ICj-4KʎXthТFX6zS$&AXʦ~gUy#;,UQ[\2'* rY{s Rh:$WGB VLb^%+ɔ׺X zxD)yI7_LZ-Gvܭe[\0PJUA7FK6"m,JEd**Zxܥ-o |rJvޛy}JW |cְ4ӧ~`o\4.-*IYڙ$f tLT瞵͕㊨.lW$HќvnI⥶]+U ZpSҲ(e*?JV,%.Cd#rcvzVz9x]IjM;k+wɖ0ZPh\^x&ZKǒuwuΞ{"֢s}e#tc+Ǯ l匩+P _aOk]tQoMu7%}aLddBrޢ> <·e8@ҳefETztLM]حb:JΩaQ۵g-DÐ@涴 ,{;PO!ޕE-$Bk ǒw]e푶5ҾQb#Brj6}}]SXSɨܡ[s]ڨPc^zuqZhG ($g'ycZ1Lۈe+b.ĶQ/.a⦤6VrTֶp8cl1blPTby|F2Ck/f3e}_[BG?)ҫX!e~I:}"9e GPHJYi3;U~+hƱ2_*mG@}u_&]̻WQM$3DږT|Ƣ~eu Iveܶs*_ sY뎟ԑj\'wrX9BIԆ9ۓO%`]]zXE幺cSGFǩiJƢnfSOC^(w4:2+sqs#&.<+OiJKb}&z)U!{$/X S24 ?֪:չ?w9j|BI(P?4gmTN#F,^!( 3h幽q7ɟc)?b=4OGEӎtRF ' vAը=ѸoiGto#UԬ+vVzJ@<8=^ru9&둤I-MKWiøhbF:Ucqľ;RF{GxVQ\[l>hw%F~xXsƉmudozHcӏd xCeϨ ;1sGШbǷ(R(Tv=j?Hg)Ğۃus nPRqV^H}sUǶrjR?"xÊ9cšUqQԭ `H-ׯa/~ϲwO ׌x\o-t$2@enƽ_-Zw\n}'Zꤥ&2Q _2c! '?H k^k"g%0OjwSFۛow0bZzN?%@%R<!~ +Fx7g2yyT/O<{N3-{~񦬬g>\u3fűݗo Eӛ(U-sǫ7a;LI8Qj!wR:ؘf> :Τ=֧սJRqi~T@YqgM306Ӂk7į>1 c ckZ09ø? _p_3U5!LsS/9?שk5Jk]4i7]]iv&c>uן|!xEÁYn?#NZJ' jK'u2.ӽpZu멮Bdv;8u/"mK1A{}J._d洟_̍on _ ꚅXhശciakB_ƛ/ &~Yr{s5|%%)!)cD>9QsEEn½ahIFx>6xZ3gV?yxTLf7"l~56pf¸X cc|vbi Pަի7 ]L+;V8`ۅ9m^j'$S3yٟ[?|1"=-_(t1/,i" 8nVH-bA*Fp\>.BamJᔎG\U)"x `7ˏ[0khV+ḽ=8S\@Ѵe:}*A:QK%G7۷_¯xw0ntFfF95VMƭ 1 2 3 0 8 590 708 1 2 2 0 C     C   t" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?1Mf/)@?/bHaχ u&b7+p_T1Mf/)@?>e_S5ًoP5OFjG=b S(_z?E7(#QGTjj1Mf/)@?>e_S5ًoP5OFjG=b S(_z?E7(#QGTj>%:m]]iL2 Wk :dg'~+xW^&O=]o MjHk$Y@bB7*Xq@%GTj?j_L{v?~OFÐj6ciT6Ic"_S5ًoP5OF֎ާwjG=b Ss/|+/Xz匉ͬψ(eX\bcF֬M|GTj?j^Kωt kZ{}{N$ tAXWtNN*?:?t`5UPʜm˖̍hjG=b S(_z?E7(#QGTjj1Mf/)@?>e_S5ًoP5OF ElPdovX]d8@ _S5ًoP5OF_."sр}R>e_S5ًoP5OFo-Maɭ;e]c(jG=b S mq~c:٠jG=b S[s:{V˷ȍ}f/)@?|'sz'?Z:}&<#7=U0b$ =z@neSH3v q_uh<3|X#YN),ⱽD Ny8 t hi*x]zVL !\pKz~ே~'k_omk2$o5η qlC1[#A&+xPCAbLm6 G_/>/ M_khnn狀khX>k##H$A˓([' g ޝ$ {j>.5+]CZ{t>-fY86nȄ$1 BQz' _cyԼW5ڕżdsIm#e$  5?6n|# xJ[Z '%-8$tC|ϧ^}7M$7n*>,WĭGǯT|<!oe!d&V2!Rw`` ~~?;=fO^j7Ci="*wA`֍CZ'|y(l$Z]Le!EIU\DG[φ:_ot i7S^ibPϰ^]aX:!'qL'@[#go#5   i>(]JEv?9v2 a_|wi|KMR톽ܣ@w#5\pX1t?_ᎃQq߄u ywew=I9<1ܺH d5]GS0HMCQ fJoiB|t@<~!|BU.yx]rMkʼn?ȖsH sɸls#/>)^|Cg-3,\F(>̲?;x,H#>_&>}9J[VFgIՃ8Q@(|DgqS/Z,z7E]Cɼ *Xr`/#? l;߅~;1$x5\\ # @v Hr?^>k? -<>^fP+Mԩ$ryٙ9'q]E[67 }x}. yf2)vQӭQEkdu?yA|-u?PI^XeS˕`AOCcMkK̊0WVFv*zaVuKM^Qn.-dE4lGF2AuWuް4*I&Y%R@>!bncd~|׀h^ί;:CMb&ے\5v`ob?֯L>&Zƭ5{uO. t,UU<jqx'5(o%ɇWiefwڈ 18Q{*|m3:]izkealǹ0Hff8Oz dxtO־f5jWZm_a0jYvx'<8|P:::_rjۦ WTLІ,"2cvʹ2OzoٿP\k3ޥw-˜n #< b4܅PI߷\K#_<6N}oEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPL^h>%TN'b__01ǾKNwU+?"+e 4EViRXg$ZOl!?ƏH B>w I' A[/OJai??"+e 4),3-'_G$ZOl!?ƟE I' A[/OE?"+e 4EViQpH Bi?}\,3-'_G$ZOl!?ƟE I' A[/OE?"+e 4EViQpH Bi?}\,3-'_G$ZOl!?ƟE I' A[/OE?"+e 4EViQpH Bi?}\,3-'_G$ZOl!?ƟE I' A[/OE?"+e 4EViQpH Bi?}\,3-'_G$ZOl!?ƟE I' A[/OE?"+e 5ͩYI: k.HR+c>= }?_0~gO,w\,}yM2* R 2kOM)3 j_^*<;Zy2P0V!+Hzu=O |cxںkz3O%H/#mu*9A< _:7/}[ڴK啠{y}0!>mŚψuGAMbK-FKc"1b&}?Bj,S ~?-}4kja͠Dyv}۽_(i>վ ~к?z5DžME%5Á$y8& KX_^<։?| \:prC|pHTɌ?u9]{^i~W ~)oinf3TArCv[x/F<57|7/R5'3Ț*m(.X;K_ͣo>mW_r߉]F׬-ԅ.V#t,R'վ0џ4]w^1ޟ%&Kd%dh?)AfIvֶ>Ӿ/ ᫍC WZ`ٚ;pMPQ!$wx~ix/}X,<j6)#5)@V2I(>WVֺ]>յkLԵ+};Ob%@$da*rj>/Wz8Ҵ Rk%F_2ռv3ST'9ܾ;|A&i L^]+\*ʤ;zJw ]O>-xSÞ%|?WI|=+<#x%k:o64&I"70.cxFr]y=ƞ_|zŭjݢ&uCפjyȡѶ 2i~&__Qn{xtD΁Bkx~7zM߉BSmP_/"pnvUbR@iBH*wQjWXohhc2J7*MF{fL8k,࿊ j6~ӢѴ [N>[BYdݷtRϧs f5{]2,Bѯ ^i #w̋t[ە8~nm|\|3Qni ֒V"+<xhZP VBXH}>ӥ#ǧCo|GZTj\Զ^!CǚHQ;?=59-Öv]. Uf2~o#l%3ڇwmcOLWK{7_{rs=RPnll5]6}jHlx#w2x^?eşOxu?0b\(Z#*s}NsFy~ >ڰִR{)|YB G@;X{[ևfӴy.f sA'2{f=gß~<.u˝w0]뷗z|2#MnҘlgRp<=W<_WV=z$|5q(QJsy'oc/ xN{G7Vk?62> *G S𷎴OϭŢ޵.&} "P)dC`2˕9^u ?fi~4<ާ'PYL+B-?Ԧ U7$x04o_.fmlbY|3T՝B>(|QxxI|Cp|/]Iu3o1Exb̪GPvp&w~Ug?ƺOì5\!@۲=P bsWY+dԯh[%i$`$YTu$9" ~?-}4kj`!e<ͻ>nد<;mxoᨹ`Sح=V[V$ |I%H<Aמ:t.IJkwPO(;CnA^yV_|NƇQ}6ώ~AoMfKx_ï_ur-̄p$@F@5je+δ_3Vg|!s+яJb;LDsIEQEQEQEQEW3~C&9"0(2 GO|&^"2qh=h׽-t=G +mZAjyrmLW|pny9A8ZޑOx[K _i)Ll|M(3瞕<]a:cmMgY-Vhol uIX, 0 ;qѸ,{'?3_|Z5/ 1~L6پ*|Q[Oduq`_N9_?~^ B+ާoP daB2kB-?kOYnmo[`f'݌Gz]ϻ'\~újz|ڎ bxQ[>KڵĞk=08zέe-/VZ}3JZA!*bvbhkO'P)lq}}O)Ÿ*hZfWu /`Ri< Se:O4cFIu{Hnno9y"d#qWvZ5gGh!9E8;ֺTss\^n,⼒nH@S鸃z-Fx05gv 2E|C{~j>N\&8mg>h1G+zzWָN5MVEiI=B$(f 'Һˤi-n"7UΪvim'l@+D8,OxcvK[`pdVFI3`8>g5? 4yiI][9źl3<}ێvskut̜h K=^c ):&^"C &=_s&7o꾢(+'߈uKitɌ(ySˑĦ@,W'n3hǧSϾ2|4փ&B+Ѭo΂1OlRip?eCg¿e񮉥ڗMBi|I+[ L$9$-}k|/3FFJOay}bbe5 =+KiʁȎ`vq'$>6k)Mm!/(ْ6J5QMyWeφ8&jSBM?UKݣ3GȒ eԓfO~x~VޥgA6zsLEIJl(@y?|=to^f|=26ki,bheXے +n99>+΍z1kG+7y՞;7c+'N+Ԩw{Vk~?;A>%jQYz9;߳'ËZxBB,jג(hZc4|08^E$mt<x6m?݋u Ffm (V]v.8#U~ <)yiڶ6yuOui)Iffbpw(P5wKڷφZ:-$Gg%rX|{u}&r#0qEt?n^/yqKn<1NcLa@Ӥs- Fq~18nz]E0%?7ί".m| }Si=sCe yhVؠڮÅ'&*)G:< Yޗyk|-XHa,c'5ʮҵi_Cmw::.pJf~QN0f)݅|!]햍^,-c ĭUc6DTdW% ttыGMCKYNe[@p|$"9 8>E jpvgS; MX_1e<g˹'5Oe[G)eqMj5kǷ[y%(Zb3R;^E{ >FwVz5ڧebݷ gf}FOghY$OJ>p3\8TPm,rZý ~2zF&kTќfCX#|Uּc7'Bנo_+P-ľP FA8>!:_ \w:ZjDΒ4+CnGY2>Ꮒzfp5m7K}Qmo8Yy2s݃``vP>xQߊ4AuRY-Y<ۺeb"`PrMYs_ f՝Ɨ_w8;kd*HoE5p&?7Vо|a ]}- ,fX"u,.˸Nc{]ak??]ڇ;M#Oȴ[km:(%XR01Fп:^ Z[ÚNs7ec.H%IP22A? _MCSc.z>jZMΫek}-<܌R4ד[:]E&m $֗6?1??]+k۫&=pu4ns2׊m߀3}65χ$-L*BW/z?/?]ؚEch~𦁩ɩi~ѴFLﻲ=Au]=޺/MCS_ ags:qUo@$28}&?)u`_{.:fv 019EbUT\* u/?]!ѯt LVm抗Ml}hcj.Q7u?]eZqv7LaT=)G.?)2aEe]h++f7nok/)mPn1:F[v r=^#P?_ UѢ`_Ǐ?]Rt{5o`-~W#aڀ;M @zw{G)ⴼuSj u}.¾ zmfHuS U4-HLu1=~5Oo/+ž#,Eu-L2>+LޏgtWrk18Jr7M~^yADr3ލ/g0JSgҵء[%eW{ol*RE8݂8?>'x>;>xb[ -ۋR"n4[֍߭x_ TzRi:&|LT{ażVDۓ7};GW%΢֗7ZuWFL$b|8e' Sڌ־\GA?Fk߈W@ߴť[!{E(`c1t>7s_]5߆#)"UOrqM{}A'>!>6WZ渒UtDav=ZOƟk}PLmnjmIO5MI+nu%}'&s~#I6_=V5.رC%E q\G?> K_B5 >P/4V+fe!9 A{sdJ\S߈GᅷAq+FfM#7pˎ9?j|=K'QxJY@ko$IbByc*n Iٟ_g=ɤ1z{z ?V_ >> VqeyjMk4rp&Qj'O^>]#m;Gdw=O𾗣Xq]M+l:zZF|y2Xm߉~"Cu+@O> }֝Ėw2#ˍ4>yf[ހXG?Ҿ_V;D“H\+RGlyي20q>%j6~[x~ ϝ%<6' `0>sVdk{ W񅎑3&zXI$hbz>@LjxjTK8.}>dsyW8a҃6};qk&Ce.a\ܼ$%6?HZXi.46+iʷQ]]bKU%2lY\r }umxG^(i*|Ocis BcEp$gcU;ЀG?j4M/iږi׶Z_ia&etIw+F:2`mw>G־G~/9Nu-> P\L6w2 U7jGifgKgx;nKEfU0A!~q@Oc,y$܎=+h$I!~$i"1xJ; ZMN0-if dXُfEX[v,g[ީ=s_i/⎉?ZX_Y|^*BpTѺK~7}SY)4/i(n=F+?~2?pZ^w[|;\I `p=O&?nӝ:דu7f3kZWPw%d5 "o/q,;.H}՟v>I=W;Յ]BEIXmذH[ |=3ViAx#A]vsYj]@1#G1ߍ9?^(#im/ +CLl W|`xY֧6Ml\(M|{x/ŚK>!}֟ =CHPsq]̺ï^ ?u]sZα>ui{ $d\(AގxJ= CyMǮçiגK#h ^AxFu{Oh:{ J2o2ךU/7nKŸ4igsjVWLWp2\A({}_: -?IBrܘG'~WrSoxI?ڼY?jXj7V3w0ٛ2n6qa܊oC_$ _o-qKUanz7$V!+%sW;4:rg:t^}j$r?~?5[Zߵl"D4T>3>|>Ӵ s_kuנZu;C14@#%yyw-ok%ɪڂks$NUُĀ2gOz]Rºc2iZg6=#}㚅Lo/%xsSc0}KM* z?iX)ݦm)a Z" ; yf-Kߴr^.Լ1x14uFQҮV6\Z#2pW2.>R.wNi]i&MG'ѼE/mGRE$:fk;]&h-Z&S{ !e.Vs!G]>_]CŚ]NѬOq)dpĭ$xU8=wQ?,{|F3iav%#,!`\TrH5Ai7x4 STԭ4KSwyoQ#Hn+FU@|kx|miLohM$Zr}1w BWK~օ-]g׉뛉_)tH-IS$@HvWdxȲKŵvr9gh|YI~Q,RC2)ԇFñǮk&yּ4'Os3%wc@LVN7gh x^kMJ;Q}=ᶷݷΟɍRm^:iW[xT$\qoߓ|5<;}\D/i{[k1J!$WHvusf\ΙO5S \:y6"`S Էk|tl~ :vn.8wآ  7(;1\?liKO:<;[2zeЊ5˞YDEos(8ox3oܾ75^:Γ%IlY/5s"U+Omw6ݗ{~c?fWVoG§[7K,)$f"τ;vPi/U"P`Dt6(W y{78<Oj]aE%tYḛ}!T$$ C_#V²[ԥӣ`io,o>_/yO[NƷ4aUl86_ş;FJgF .!k]wį;<MDk}FMcw2$VYwt{ _XEqgs Xe&t m u t2i6c^5*8bY1 O,*$Of}?þ /|;{*ou=P@1)Ee  1^IDk^! ƝFú\HG\ ˑgo_6k1خVm^hE<)HVĊ{@ z;[\NSXe4*srmc+ޕ;P~ڤG [I/]b$xxwh._>i^CGap3X`=א~UFc,.Ƶx; (Kx )c7`3=5|-־'6{(mԧ"Tq `]VWCRUQ`z>!2]WTq_L&tfX`dW߲:Rmv=^ xR+ٮ*xh`cH McMzz}eW\qi<=i^]iS_éZrHA$q7ÿ0G SWm+OՎ7wvyF6{WCC(/uϤv% W쉣Q3h/池1lj$mѳ +xkΕV7W>Yi2|xmRUn==/}@Ht~<^Qτ<x^O4Fg|DWahԥ9\ G n<{קy]R/®?rr~Yxlwp^yn"K+oʓ\3ֹt)>WF5v־Ӿ/yxnd ]ه89Z*9@e];]qĿjq~o mˑ |m~v%IWVp+2o!eTKaa^Ӯx[|=6}d-i n%8I @䎵\|Kt{[/,5rV+4plo :$\JIN)l`^x;WUt4e3FylŸð,sk|=*|S!J{eThLA\G ;OSgWy <]0G>5Æ&ӭ$-5"ݽNȠ!5 ~͇X4?+5d_n!0LPd}{W_/9G@i`fb#NPX g"3x7֑q^ kڎ2p̠p89]t^dU NlI2F&nꤎ-c׼??QVLo1ӝ}E_.1ǾKNwUK-QHV ( +7YԮӭ0"9Wdco/i4ՎBA5_wxKm%Rg@uy~Mڟ∣@h+nr::aW[K%hج  IpHiQFx@RT+zQMr"#(H=`xo/_{֕7o`%#dI0GwQB3C) HYOlK[0I7!\g2+Fb26.4'Ͱ^UMk3A/bu;mB[)LIo"A brұ>ͯ_u tByiH 01$Мfi-ŕ׍\=A< FOIf#89:)D+\_:=OF).K3ΔOfҧ-}Ư7UA$ 9U` Ʋ=FLE]գT kxB&p\${"o/ce9$כE_+ 9L8Eo]j6hdgj.O=mDǕEd ^zγuI_h9hpcI4nw;Dp)Z1xS-񦡪"AeM/OEY(P7$ƶ! BNq\J%YDG[xËp˨\cv84ʋArohx@2EsW60ǫA;G$~t99%>:7ÿx;I15gk#RpO9<jo%ϣ9^5G]=pYmrTƈ"8%;)YWڔck_ /L"}*y--H`B>ToV\=l >[Ns|3ǃ"&cGR\-q<3 Fkφ_YsE{ b/} Q+ecք4B9K5U1d*9}b*8ǵ]#aG#KzOg<Eecq%rOqm<>T>fa|8|NJҿ`G#Kzg0 MֽgT6Z ^J,M8O$ ~0GsSx=;_hSڴQAlaij,CrB:W燈uZ· l|}͞R53\wmdo!s߅t??n5]"SKm{t9-Pdtm\ y;>~!';]Abe C!1 2p9QU;|eSNoxÓzzlyR%M- bޘD&ݙO$C*(tFod-Aw ]trETK-kO|k}_R9,%`YF np~:Ė^:>y:E$Q#'y"^ A;ہ /nn)hnd~̞#)']Đ_Ownfk\0U]QI).g{y7ŏ! Y<0\ȶJٝu'<"|;,^״FJ 9V^{?#<=eI]cMU;v3,r8*|A'Gu.EqiY-tmBMK&[$F;wFp0k?={~;<bTxin|Or-@'ƥSzȊ HwѳHoF IMZƯw]C$Z6s1^x~k4/AuG]V8mY_0nPs55vFm>#MTk]|9ǚd tcխϴIqyevnב:FB;Rl)a88E$8+hz~Eֳai=a5%B =GJ6hCi/$ҵ Y[mg25Hci|v ɬ_]kߌ|=g,Si6ڻNuOE!^IgB ҕWv>ğ|A[oh%p4mB$m?ş$śǢpx>KKm0"mNrefŽ޼K%|yC֙)tfMK6hr\u]B>>?h)<–Тw?#l>6Rz.xo—wU%λlmdy%_WWV߆VXEMfIzT7@+A] I߁Uu)k=H#΁ (#?q;ZWD]m0ՄEj!aq sSU+&0||ޮ}i/F_';-+[9VICMй*79 qχ"hg\|A3֕wHZ2W###$u޹y`aׇ~GBA+cCj/ |Nׄ5MoIfՑ|[Q{]?3}h9QHхQ@|t?xsWtqLLCckf-OZUA;n,^*Gyͽฉ%MB]]rMԁ۰l^SΝjiwD*H$8h%F@̗t i'mУe.XrXOonZE)QDU@?S}2qT'=ďyilgѠ缆)e.U x; 8{/^ ߤ P+y9㍯"qćja rO_=[Soq40X]y^\eVA(y:sTw)–6犴"KMf[1y288@ Jo~$Z]֡pIc5˖A9Byij%[H.6Dч =!H c:[ӥ_]^ޙc< i#MM +ChuQ\xay]:l=9M?nY|yqwgnn<ɭdxTdFnA T'߈ul]}!4fHȥr䌃ߊubP]Q\K4 .qK&"8.xV}2PVy5es_Z?&IjwKkHgyR1rh$ @8*s "R? yk֗Dѯmqop'Yb؄Hܖu*G\'yzp6'X(%Ho#A{J}v7.Y%UH%lN νԋg( %?\~)XiM$7v];ynGD5jX̆Df ɗ_Lզ[ Me꺟mFQPH 1云cSut?=ޓXvw:Dٹ9n3vO8^+Vo,9 v>+{֛^ZM%ϕ{kiesK)$0s)5]M]"ZxD:#4AFl=啽7*pB%[|z(љX[~ kX&Ɗo<Ƀ`+,>$VOPY侸 <-]QG8-xsexn[lƱf!bb xRh&P> 4<@i:W.v,n݂ q9OI񍯇5+#K-֞mnT;NbBWMJm5{- x,ȝ & 1TmRw)G VKJQx 5˪[R[{:W*7˟X6WڐҶ3ۼ<uMg9 ׏i^4_e,][hIbB c 9*z5QcTγVZ V B .;X]YdK|f6B;x*=_R_t˯GaiX>`8$AqN6OvGV5VmO?-mxGƚ'/[[ G.U<28UJDL5y<7^ssq ItBie7 '2pgڐQxXn뚧6M8[">ī1鏩NsKݤ`R%&O`19uds~}i(C&^"L{Ŀu_QW˿Lo1ӝ}ESԭՂ(0))Ũx~⸖ {yMȦuTR2z|M>\֨o&/ZEyuoV#I<ƪYj4{&ϕi5ɎVUR߅x?gJO|XT_B[BUF>Ut׷/2Y*|w m|"|+d$]6m6}fro~rE5Gf.,#g-+*,E6YN1YʌR|s't=gzW,[[D*T 8VG|Wj~26s.6`-:2ONFsx0\ xkFK{7Q[|9^V^2q+G3M&UVu'Lnlc#l!5RZu{ =S4E:`á3-Ɲ W/tO eX*nٗG_/gC/hR{_jH\3=I ~|pg|;/4{:ռbEFvbFy&2NNdFZR>u-n<|^x 9pw0k,4]'=Li!g.!n9`~Ѻ_~!x;z_|5 rsnd.͈߀FJ՝Cj-[7+i_Cm*|6 ~n4;ZuhZYX]^H^Kpsʁvf)-s> 񕧊!FQ}"HY2Mnʰf0[9VN'EPj6rjjvkQۛ+v[|XA\¯⧏]'v-g3(ٷc_6is=OCˤyk0|}+ɾx~լN譍mXJ9!~m=s~_4McKៈiz^7.ʧfXs+q Q.ui.$pÝ#=*J* seu7ҴCMwwEhhpUzET0޾X+|R6w^- u-f? 8S u:W7O,+(,vjߧ=+^T\"Rǣzr'M(Y3~ǂ"Դ|~qq:ݭuIj`qqsc'?'n9b5W>)Y|1tĚ&m4H?}] 0HRąG />ơmk>VS@l*0$3QZr|]Gƞmk忇/u]Z9*˜^Mt!<> 1x[Z+~-́7ª0d_2x{&JK6&;faU>j>Y |^8|q«+;Q.&緳+mpx+ 91n:3O1k}bk_>hT.N8~$ ㆷᏉ?4Ijnmdi?o8*zxrEh]¦&6^ MEqcyF,em0z渭W ? +_[͟ڊ#㔹?՞~/N1٭cZ||Gxmtdt"o# ?#n.y]%j%Cf/d[[6弹W ^)ctB֢; t`L/Brt ֕[-։隚Ff]>&XfXzW קF̶+Ya\x~-(M0Cn@qlp硯</:<1xŚnu߅71 +yQ'sNy y~ǁ^CQtIYH |: |; ^VRhM"7M˶`0/rT%4+Bi7GޙzyzeGmA=3g!OjZlks%yHn%F3@;zONWT|P$xƚ?5X twַ7 mu,; \(-1Ǿw9| $G/_oɫj[Ộ-$is*DK8RNC{'&{.R#P;Oޕx6c=Đyp#2r i5Mv?Ed 6@$A 5|msk:1:?woy#ϲ6y_4DtxT~o|7ߧk/wi\5l0"y[W i[|AOcYwZ^j:mմS# n,U8秧 O>'鷚5m:K R%)BʠyN xY[FkN1֢thw {Ҩ3;Të}>߆'(YhW]rwt9/⟇4[ [/Y<:m-& 10?$g|D~)FOMեY-ijDe"#b ch&׊~>i?.j6=04CHv2 0Nx柩itmNSd1q$a"#8' ;[izT.x'Ӯ7]MyvfFh uҼS]Xh/X4˴YD<1:ƹV3_+j|77ůx(Aag-5M?S AHU0yn@_&|}/> hzM{ b`HWK?̬I}lu66ڞ51huޤ~~})6DNv`u5Bnta)E #+؀}y.$~^w? |N|Y OݲBvY^@8D/o|9mxӼKhǪBAHn$ T`OZY1]ӾxmvV[u@ Ƴ|:]ZzfG F:9nI kV"<27z=qV2Ζ]KNxh3WHKV.M4^7bF⎅6Ұ>{y 𷆓^Y` RV$?.,*DO ҈e<]IA m+?G!:W.>.Bt]|]-Gm~'(JOQN˿+?Fm~'(JOQN˿+?Fm~'(JOQN˿+?Fm~'(JOQN˿+?Fm~'(JOQN˿+?Fm~'(JOQN˿+?Fm~'(JOQN˿+?Fm~'(JOQN˿+?Fm~'(JOQN˿+?Fm~')xIy!hԱ?(,d3Ԑ; ҿwtq L<.%A-(`r9SBTI:_ǭ{զ4=oW:kx0H̻v2O4Br7?C^8Ƿ_W+o? ?LE9PK@3n#Nt/wN1b97Ox' !xX8qrGLu?[/#ź彝yq{ŧ#n0V0NI䞝+翆 v㟁~to]^5:EO + B5Io?.=\:[ŹBጨ`cZ/!G7<> |<>Il'f@74lT8A4_o*]miφw2O Ct}VKґ͕~ |᾵+ msnm+Y̳<3g6{w"v0 :O<[Bԗ k^|#ir 3-\YypXebM_3~ҟ< [Wnl?nHf^8K߷9/A?8A}OǞ*>4 h{~P:4P5Xa$L3p~e 7. U9=L/skK: ukqHѮ wM<^{G$jWgLiƝ/f?|EЭ~!/dHt+;Үc|$23@]??b߅>U>izj3 KpZŒ|Ȣ~6sĝ[&K=/XEw%{ѭ+"ѐO̧+O lk]ĺ<74väeNc8)`qwD!~o6Ot,p}MǿjO ~g?[kO\g՛BLa[aڟ;!'v hioXO̖F qk~'?5,%dab͸X*ds4EZS>c_*D-@\2ra=O0%SP³,abWʤsw$s{lj +ҥP,f'8RE#l 1@Z뤌 ǜsTIF-g?0寉G3i:PIxz)Z0r d\2Szŷ6|Ż[0S$,=߆>!Eg͕7OY'V Fv N.wg]]LGm&3$vNn=]A ~!6nM a0YTbr8__> 8!Cv|$6c'vO|%.uMom)%ZV U`T| Ư ^Hd˾cng0a$`fÌqXm1NKZo:'_×>+gD4g_-E-O>}໻O Z~cK Kb%aYH #{ům˨ڦ xNm2r|ԲۓMAk3nOo'#vì|T˫N|[ap!^3؁9֮Ʈh|uz4o{>5md,w\nsn̓;צ>Լ=m-0e>|NC 8⽱eW_?u/Vzt i4,KP.By>xRƍe h"UbwskfxNWi迲!i&Wyr^Xp_=7K㸮'^ º_>48#,v2C6g1|dt?GZ,QLfm8+,`*@;7= Pß#ZU E= ImpFq1eWñWi>\9o_1FM䝊wۂF:Rk3[j~;UEVhve`+zqNrQBjQ0{HJ,pd|2$Ei Eױjq7.'Ir 梫jʧ훑?f/V0߈|4{;0x*Hm==Iy!x^95 xCzUV,7|hBT޿I>O< i2-Ҥb bp}z׈(O@uK1)7e${uR~Q_Cֹ%987M:U4\|9Ӌ $`e,~PW>T ///g.5"hp0EF c%O#E s( ;wZ5h7DQ;{6#:J0u*)>,!gϐ|Y3:Ͷs|./f%#7$F *H+*) ;*{𭽽*AR"PTp2\_ -|%ciڊx^n.$H w3Fnqcҥ޸pY_1̤78$MzW}aJ*sI}-;E??Q]v:ϔc %;]cɏ|6*EQH(aES)zQEi~"'⻌a.2*JKV/rWOp.N+@(b ( ( ( ( ( ( ( ( ( ( (Š(ˠyQMhAERŠ(_0~gO,w|t?xsRyK IdW~z6c<$hd1ֹ6s*='T qX^(v1jޟmAm2.|Q9U;φ}7u~Oelp<)L͹ 1bx]j6ڛp,JQc{7pOֲ{cO{ZsieXXgS!H)w{ 2{ bseմbKlċ$Ni?td f*׵}(k7)ю8Z6eS.‚N'5>cKKFR6Oe9s8=,uBigFO* , xR7 ՆoLI8^o?_'Vڎȟo%$$ǕzVL}a.3hϗsZfKn6wJgXg@6908Nɡ`H2‘#o|`=}xu:מ~^O4ox,}iOhnmc(m"G,0ǩfe֥ZihZBg&_ݮ$-N~i߯,t ^8"8WXs\Kۗe"DU2!\0'99X~}eva\,gڇ!H(.#]6:m֧c7F o@*:_^"mMeëXhCgX7DZx/ZZF$vO"I!lvF@#5x>M毮_ٿ4𽢛ٷʼƸq~a!6GU|Uk,J_sj7Mn<" 6IZ^Iv,.mhpG ;X6;Ukڌ\^/m.]^E=K ܣ ;mZQ[KTk5F/FM?1'4Ģ5oa[F#̚303 z⻘%P0XgO\Vҵ*k>kZV u#䜀d`xQ0)ֿ tشm=n#omIF}!cnbɗk ShFMv8 uqmRËKd7;#+nF rFkŞ6ZO$"}!{V.eV| F@Twq~A܋Guɕ0P/4K[ԭmZXԭK-n c$[F)YVݕ Cŕ$, PzzNy]hB~Ry$gV~ZΓ޳7a,*:<ljx)s=Mkskb6Ug(sQ4Vh㺵Mʻȯʲֲ[mxĶ Kv'٥mVaݏ)r9PI<` V|2Ҧ4w {4c !UulK9s>ywIfu-˩ BiwrGZ/ ޴j,K)8Y;EcNQM֦oIM77? G8f_M :%>afXf+x# ghW]~5gXRċDĠs-tgh,X$H"iz Z84Jmm&˴`979țIw66ڥK$6 $?<տGJt{ 8=A捣xؾ~v%r^'j-Wo4ҵ!D2$n' $WemN<֏r9Ggx'xo:.V n9Gb>j2iφ|?'nuhb7ɘqب:鶿 4>hU̚IÖ$jtqx5&ğum.mS[ IaK$ֈ. x~G_I5I[[FYgUL:WSBmWUcW~mi hdero6jm٧ =Ӳvy (Ff;o Zj^i<2$7)ϜulMrR $iaq7gZ;=(=yxf>bU˕/?tןi_/_ҷA^}RQ'~:Q@EQEQEQE+QE( x{Àː9#籭 ( 8'Ԙ0p7`604+$d`98z!uΌ.GS"g-}S̄v>"9?u3|MyGewf| > > SkpJs<ŷϯZ嵴٧Ft#Ǘ{pNޥjtz4AQOxEXό`&duxH d_Jxo<3;qrc5ma/I`vwty`G_8?_y].iZOO6g0Rh"PG r;3cKS-]bom~[a]6-#1Uh\s"⇃wikoh~hu]BW"_ cBYhZexWfUߨ!p}޷#jPGqO;:t:-.཰[]u ًEY[J|I--O}vM }F+T8VOjM qmЋ/{l (8+nfׄxb(6!k֚ǃm 9gPw+_x#xZ}6ͤM"_ l06я-!HOE-|4mlϺOizEΫ]6p#s'6 ƾЦxRՠhZE-gK@$t?i?4'; ZV<5-׈D:Ά5(_&DD ^/?kߎZeǥ6wn%UTvSvGS&7[xCk9XpAq]cqy{sM4pƠffrO_0rn>Z(課Q{ h_ϏTh_#>R,h ]y4='ƾ5"YMխh#XR8}+/WQ,Aˠ5{/DVjNC~u'W:#;VchWYYlQ$ bx˱v;d){GCot;)u_k.0 ѿ)]'u#[zE"$r_ĭ` f Õ,#5|M<;>${/Ǻ~4zFE+Q щKk] SX>k|JlRZ-E14Gc`EiZ"5@H|[&0j~&IRSH\LVWel8-U' aG+*q}q ~]0Zhs0:t տy K1>gonmm~BW0K/M_| Ell;愇}(M$>#f]2j6̰Ĥ;ɻN3Qo_#-[~[aM6ۉ/UF\^AI׿ou]>P'ۙ"O._Mfc _yei[V+D!aq/Sռuwwik~[Q"@<[ž?o ]6y}B+T23ۥ|_+P/Ij?Aix:?i~V`YruyRO CSObS_ct?JoYjW~=> mY Q ۦY5z'w6#M"V;v".dp9zK“fͮ/o%ZH1+ :>*[xZWOOaKukwL'CM/"*)'xt0M]ğ< ˋ5xwB=KVhZE-gKf@$tO-5[{o,#YauxB 8`Akk}ĿK[I.t x伷Iv%UW> hQ"z [뀀@@>GG%otE 7y;0?SeeᏇa֯ }>,)$6EGtTgh\?0_!> ,Yơ3nl睜l=>s<e9 ̜+B9{ֶ=w~7th#̉D$mҧ ۸o,76@&jndVѣgpCg<һnl|%~)^xe ‘}q[oïݛ]WnEԖfb'Bmqrqz)Pq#S==a+iv=}OOK 1KD3woA^O=ٞE6}.mow:}ciIo3`D`M=⋿s;4^J,K)dې3"3y`>aԎf|7|LׅSyx?NVj[}%2IV]YgNIuZ~· l|j}͑:SS5̄v7 !<˪vziz mwR)-2 $pjҎ`NΕ_<=xLbE/Srg3EnR:;c$$t~ u|[x[@ z6 Cc^E|Z>iac?^]A%ս,1Y$UQ՛"j|Qg5~]hz$ mU 2'a/'}G_ҭk}r k\[g;c8)pNNxG߁ _Yx[~%H %e^H:W?;Kx;Eּ+/CؖxwIwVHeyENT(tو0NER(((+ۧweß⾟?n߳?13뎢]6Dͩ^b.\C]j*EIS}?j> >LJ.5"7?jW?h߈/_'羸ie<>:Z7ikix[bӴqYq ݸDr$@< ϠMƣ*j_U|/푩x_ǒɧx{V3am-aZte$;vZo/ |%i:eާ]juŝƏZ)j|˞ >y8qOC_~u7j~:K=SKf/dᮚ%G.*kxS/ҼM Lд[N[o( O<׫ootAKC~Sy34y34 C~G5/*ghghj_UhԿ?oSoS~ѩ?T}Ro1OƏ1Oƀ!F?߁QK?NI5'coSoSqR⩦MDǘާ?Gާ?@wdu-Bۣy-U$xD~?7[$R֗+ 5-&0 n]jCZ>jíx*ki-?m5#H5+n(G 1Oq*.=ԛg6?'_Ug#> lźiek Gu;4;a# ꭿjwV_Ҥ̿׆azfVp]8H&PԻ_B{=~P-E֚iD GW;M~mRjMM4F M?Eh_?QTIO:[ [7j7׽'?#P-8猰s^'upBHN?OMx5{jܥ4,K*c*-?g&-\d^*qgdzg4lj,jбEF: ++^lIɋW'EOOUбEWPcP??OP>/X:5H|wb@\:E u5j,_EPv2loeFa,6pYHgkw0H9xh^ մy~a͍~8ݜdgE5|D֏2pc &9nI95C9> o_ -F:m&%~ͷ;sg*QE!(c (Š(AERŠ(( )XoP(A:E<ߏ%F'>,Cx]B;*1Z\T{9]T V0/8{E(QE ((((+ۧweßq_OO?☙E5xMwSsNvgq~8Rҙ(bGx&|GiqO_Z%c⾶Ԣ#$NF$Lӷgk_CxYMoO i-!U jcG*ēE{/j=AE-x9xQkA RYxv $~XtʀrUOC2Vxt˭7"'I?!XizXўnSֽZ{k,WMX.3rc#1g WzKmbMmmYe v^O'2}+'V~$zD:]Px# υ k^)iivc̢$^p kZs]F$n2̄d2.rAQ JԢu:\4p緯jC^ϊ!Km|NCi:|; $X2,[E7O-ZqIq ֥ M-1W=}mkk xOd7eq^*\.sq 0} 0zd}k5|?wHE౲8YL^am;{|+Y.k]s0I[2[e~dAݑ wގٯq㯄9<;帻=*3n.YUL2(J|9(|g IcWw&$ 2%ho>î(&@sPw@]Nz׋=D %0yN{q\|ZyxO֭Va|RJႜcx >"S yWedFCeec=}yhH>0?AkyoH[{b`3;G9`=zm@ (~!pH+ɾ~?>$ _)i q )YB1 :P3ir0IZk-֍~"e@dW`kgc|E]RoE?*8ew4,:Ͻr x_X->+ŤX:Sxf;GpPaaGaאk[\)|jZic$2 @Y+r+C[I״mv\Kgue|&T i{}?!,xvowZv߈<'K}j^ 2[32#p=>| >!zoPjZxLu/Q%v$q$H,xï-j>b<3ig(xwþ:ssa,hB6Ȍ] 9n7Fp3{W>־.x#Ð6?iqIhyA6ՙK0e3@>Gw۷4,l-[Fb $ E|_xq~HGS3ŔU* Wh09*+?0nlt-6h_fUB*p}֕`<_O>.м75|}FFb8>{6<)k[tGI5 緭|s7+j_O촶/u#s Zۋ9bBCK YxFmp.lE4NIٶ/Y#,L+[j6|< i{/]Hnxv)e Z^mᯈRhZhn&sv@0rE9;AO$WǶ/U=?umoWF 7V^dybu *]X'ÿCW~K"leJIkw6[,FPO<;NF%pN2G;4}KBӵ>LԴx ,M mR <2ep:G~ ~=>YHúWu?c;[ ; >, db{|Mİg~+wN7cd | {,V]!+ΣsG(#Zi3x_lq4rY+n?ۈ 뎸% }: m@#s/S:W,>=1mme~#xLζj#[#V6~v8ҼӬ /h.!p[΂DV GL/Ҏ˴Yǀwዯx.W`&8Z`W=Ǩ|;C-] źY7Z~C=X)d+Ǻմ nK CS}JM(v!>!cC550,-Ю#;@CsyFݟg&n&MS:ΟqwIogGlq9|$վ!G 'Y, 5;UIE&#m'ߵVNJ,jizdvL5;d60*ʨFRr KIX~|wiko~humFWgW`_ j|گ|aeua)8FH8wo S+6"4}:~ԠKmo2\‰enx? N|ga;}?>2НC'Ds)X}Bw]>xkG=ͩu6mǺ1i^Q(hAܪǀz}ΫaCq2A&p$6vFǜwFᏏ |eK+Ö-[޵Ŭboʹ gmzυW8n Ұe`G %_#&W7Ώ k&5_"9H%ci7@'i#}+_Xv=3@m;J(& 7.]6@$ׄi~!Uvxm<kfcUBzxoW I5oȾ&ݡtm}:h%KK ŶN>ϬHgF21ǒ>p/1x H֟+xn䭦sۥG1pr8'|-j['k9-]y2Zf rwl_ǟ~:a{^1Լ^׮Ѧ-9U`#G @R+wu욟)m/_ dxW;-iH0Owo>AxInoz X\$J3UЕ<8=x#3ei-PD j>F p8&7g;yq\Z#8VN9|?Vi_j75ޠ!{Q4c$tWfaNz&w_|gu{@Yiόi==/+\ǹ.!ݾezQ/}I[_NKt5[buHUln3)>z{ Y7vS6= ~0Gs_&|=t~/sk~+>KHKy N$v`u|:-?a[vIHY5m>ȝR ѩBWv҇i;Hu\ޟ\i l~|CcyUҬ9hR[d@H6Ϯ=LJOɗ,HޝxLhuGPlqCĀ?B7 CZnYm7ڜ7mNv=z-~:)5?j1h(hUb€$?g!\w5ZO>M^[ mSC!- qaXRu)j>Ӿ-xV񟇯oU,*E(͂FG~-ŗg^[R b\Xؕ䁜 `/'}G_ҭk}r k\[g;c8)ه^lK<;;$IUcZ"̧r?l841Ҿ`~ΟX9Z]:dl~WAҙ+< )ҙ(`(Š(|<;&D큮5'olX"O! _MȬ`c$S>Eb@g @A}3@ϭ ͦ1,/lkl ,(+?>6-xE5S_Ե?jrZqjU6~V9@HcђO_^r `x8L_AuxK~-Zmt q6k0vxVR u_/>*!^$yu+2J\ʾo~@ |~PpGCg?R ӷĿd-=tφ֕v#බ6Qi nvvmoῌ#|C-<-OڢY[^U!u!Z309̘t ZT3%:~jgC(VBnYZ,wjmŌ8ߒTs]W>5~><5o mؽYo|>!OU&&1$2u 9>=B}: RpF秽5~g^WV5O^BmrLĉwscq0feaoGs}|57mi$blXz[.l'~$ns>vץ!}ZgvA>@Xx҂h6.޷%ީL 5UH<zyPx\j+xm1Gi#q^{6+瓜C@|#; 8˥@5|Y̍mfGoλWkeߏMxU]8"L'vx(<%-uҝF)mE9;fCf GkEgi- |m-m;Dm37.x $ 6=OҔ*q'\vZCg'$@siV daVwFs:ȼnlol[K8x2GRe#Ӟ?&0'm/9W$'%A5 >:TëNHȼ!R{cZzyBO<]Fq(=asE? |wbbMWgEJtPǖ,ZoS^gESNc}tS%?):5Uw@Mo(3"x<#m@11׷hXt\SZǟ|#N nu)?#_y?d5s3+Џ<8+ )QH($(QE0 (QB((QEXaEPEQ(`_Î>/<*6abSiV~܉ʠb!ykߨ15tQE! ( (|t?xsWtqL}'Ÿ{a;)fk}?ҙ)F# (<ϋ<__|va;mmW]|YeJt/S.Γ6%YY6N+>/|3^e}mi.-#ew3V>j?9i/EϦlR$ 3g?C5Y[xwL'ܐIhKsCLa'<9-ԥǍPum۽a5ĺUsUtU+ u~z'njzOcqqâZ=nA䚷~~+kZķڅA-a44D9$vZǜ֞%i:LJ:$ӧt.,cd %8ᐕ9H~-|C_ŖWĶ^pVw,.y 8߲|:-W_񾵭&NpE G>o(p'S}Z9|D #;s'H,d|IG^N5zFfAٲ2;MPBdPqbz音!xs[2N$0[+ ʎH xB,q55xix^)$M([nP~|U߇ߴ_eF|{A%SS1X0;e)cc+_@i6a隥Ƴm8<[׹MY8+ºK~ 4&k:AmapHV=v9,Zǩ4DU qnyoǟ V}cPҴM)gjc(cs3^ ~\h*>Osk7 7im.{i /l̥DYsgy?RG.M_R 绳V*vlrN~P2)/wį ˢW:sH&ֵdΤ0SdW_f&- j ,do+QKk$[Uw+<{'UWV6\+*l m']Wuޛ Σy5;aƢ΅#Ŀ~#R}UΛ#c1|Q+UŽO ux~2t[~$F5ؖH{KDXp'୯t߄^S(NJRۏs\og[V:h-,l !)(Gy"9~R ~`EV $gÞu_F ˨"G$ܒ *lP%QAAT5O@5vk.e nh??QF?G׼&i~ մ7ч:רҏ?ٖ|oL{Ŀu_QTg=2({JeVg=2({JeV@?O+ZP#W,?GY:hQ@i_ t ?ҿgEg=2({JeV@?O+ZP#W,?GY:hQ@i_ t ?ҿgEg=2({JeV@?O+Z F{EdKw,xVvb\*8Pi_ t ?ҿgO䁟jd*=czԹ@?O+Tnc?+_G=cz@?O+Tn?c?+_G=cz@?O+Tn?c?+_G|w?O@?ҿg=2*֝uto VAѴz@\q/ i[iUT |s=@@?O+Tn{WϲKz?nc?+_GPܹ@?O+Tn?c?+_G=cz@?O+TƁtWzKj3ݥF$Փ*e]I8$O@?O+YĆ5+6&"H("?VV099M`o@˟i_ t ?ҿgPx~=czfе[yl\¯p%@U + _{JeQ@?O̚i0$KFmؙ 2O8g o@= i_ t ޱv[kh|d"$U>=+裡^z>+g@ 0>|djoY~ʋ|f26ܣ`S@C\?]/ciq|] +xr'}^dbEԧ9Ε|=8O.BoU^¿z/*J(hM@sBoU^G|7* }U{EEz/( ??&]9U=qȠ ?.ЛwW_QǢ"(hM@sBoU^G|7* }U{EEz/( ??&]9U=qȠ ?.ЛwW_QǢ"(hM@sBoU^G|7* }U{EEz/( ??&]9U=qȠ ?.ЛwW_QǢ"&]9Q7*qȣEE (hM@sBoU^G|7* }U{EEz/( ??fe9U=Œ>Qћwߒ.i7Mlloj{bcQXO ?VKji~Yq}*#<nOa4kP*޼U;:9h{A8ARh_?QVAL{Ŀu_QW˿Lo1ӝ}ERPQEQEQEQEQEQEQEQEQEQEY8۟Ig QƧ_?MJWծ|~!?kxV% z6WO%}ki,JĬk"KtLg\Rx 5qU<wen%u+l,tc8q~>+[O%4 ȡ6 n`sԂ-WOn#/I-KJ|bkoZmGAd\fbBsۃ]>6D5r$+HX<,r" 򿇿Û'IO|"6_ !&HK2<ꤪ$ >_ψ6|<_j:խw [ 0ʹ*#&اt:TO37^6lӮFDUqv@X "[oY C(wpٰy{vsJ_|siVh/k״ ;(Y^FA"o>ASxcRmI%IPE d*1FI0@שغڞ]OU䚤T/.4Gf l\9˟W޵_ -usVx]I+j]Ml\( hp[_c1+x;wk)W8e%K#*%of7}ޛBxG26h^%]C' A8 Ӽos-i- x Xrj_Gծ'kPY}I7]pG4}oD<&WK{omjc>rÓ#A ~(>\xzEKKm:ᥖ;RT2[j1NђG-~ZOM/]էc񵄿62tv hAkV'oo EwCx[/ xOBKIgkasrĒ-0˾%Idv@X2EXoǿGxc2–p7iK19SAeAa>7 ŏ7HX-ZCEhiFfR"7+(xw O?{V4 |8^#կm|i'iqBh(Z2p'He@x_t VsH dr24bB%;[s?7)O%B7_x |;'- ŝi$Y׌]W #&8:czhhZ%_T_9bZdžՖ5wIi'En G rG8]HRcB|F-56um;@ޛȺeׄ/ZR[j֌e!uuPmp 4LOW6Xt[׈6gX׶:Fƾk+d]Z#Y<n &T;|cKz'[a5hti:gwp2;b-h I#5{- )|_\k)fTԝk{Ye!l ! a(zb~U{_w𦻩Vw$: r?ٹ1\UdcKP:W|gS?]kx^NJdƍ((((((((((((((((q\E!h4YDss͉F}Nz9SS+-7²Ѥ(H$u_ x㧎5/Ac T>xޡ)|0Zzߋj6>n%Lew9qQi4 UgO~{Q|=xNw:s_%k;lau` ;q0cCw4AQOxEYLo1ӝ}E_ 1~8>|߲¾%y_fs,q5v9Sb}+E| K6?cm3Q`W3_-GkL5v9EҴW_cm3Pf[1(\Vo?io;_gsj+f_1(mrϥio;_go,>im?rf[1(\Zo?io;_gsj+f_1(l?rϥ?i;Ogo,>{F՗%{yĐ F pr$s_=6v9G3o-GiLYEZXҘ[K'9/??-_Im?rf_1(Ieg4cG f[1(m?reg4cG f_1(mreg4,&oo??i;Ogs?+/5}zXQƝvX"%$u ?͟c}3Q K7? XW_}#Rş?W/$׍6v9G3o-GkL$; i+hg5_͟c}3R5v9CAs|VWҗ=K7vkAцba2@7Hq81| K6?cm3R.{UuK{5-bݩ+ц{g&gK\׍5v9G3_-GkLGcG 䊹xn5կhLQ,[ܷLI> K6?cm3Qa\h/\+s r;d@o?]*Pom?io;_gùgBL&D0^Ma 0=A߶m7ŝbĜII|ַ3_-GkL㕙}|^xG𧉬2SjY_ggtK(??_1E J??_1GY@ԥX.s5IΧh4rG2] [~b?_㮇h27tQq H%"@$+qOgMG Fj[t#ԥzwaƳD[}0 61wATmP8QLG|Zo xt]& H;ؒrAcپ8@̊582G\? zm-:T`;: ž+~ \_k&ReD.zqҽFM/Sy>;]U0RXZFܻ5~$C,r`8@r0IpkOj9^\jl$I0ћRsWF_.&ׇÞӤiC3sբTBygs &;88±nj?GK}~_ӎ ~H}{g5W|93owuΚѧ7[IW ztkq~Y&rugD9RL4ҥ;w?qf8w`=PDqJ,l#?oW~~"궚V֛'H]ٮ\G]u/:.g[RbGxcK>6%0x?o_g!x.zFy,K<i%}o:onq&vG^1x K٧7ۯjc m TxW6,lEFvЩUGJuKr"*^Mf[03˰@r:;ǩnW]Q A( A\U񔉄j?iK0ZQvKBx?4aQgs|Sd˭ p^gu] rbfdz StZI=X~?\.ma|s&m"<4L0Iڣ`ok(&';v>3X}^aƳlE#yLϭ9ʟB8j 5%Ñ:7bYPX$2/x+jv$@|&ܪ8j]PZI+3 |͓[|HAcvR߉K:V2 [H~Qgey =L7KJG!<#ws;ss|vP8XzO:;)cϬÕ\YFr?'[,Zd?rX3T+@$ҭ\ZH-H1T[UkSH ?@+jQS8kwG8F`.p8L4`CY[g{(݅O#z/$¼EeT>V^O1#dt%~3 x3z{Aga}~x"xfr I<+w*L0=ZycU99=N/5-:a9@5s~>4}qs} +~Uh)WQV3waQ36ʏ EmF=xQL58 >t<s>ԼGIx~`.$S",HgX}۶i Rr08ctt脪_$Gq_E>OQNv>|xEO IkZس4E'H#FWE j|A[_ POghbbӆ%jBϣc|I&=N]bkhl3H۔w`@ꊼs@`?Iԥ:nU@A;ߊ4/xzYpc8[b\qznv~О5f*ڔk3??o=^?x/#mEy>'+1#Jбyeߗ#J)ϫ=IӯHmʕ=?* 9ad |WiYӵKOP'׷=gΠؿU_nZbYX;ֳe20AޥҦ)\5os ځrOE ` :gƒN4)эJlю/A-*ioLvkhREyAb9 ^F59N?+| ^T~~3vNO >?xi5椏W##n"処kv{B#>:?Ǩ"8XQ mO|jRRU A?\pJ3?iOol$Y)_̅=N%^ Zß{]$VY=01]"]ZU$Ot}rR%Y˩mV &OO¯T}v/WxYyA~ow}{ևt|y'޸S«]n!(. I2t#GQJ˒BgA$۱$71ՄUxxazW;ɋEPPQEQEQEQEQE?ιKpC;pp;d`5of7ViZeErQh% N`U\> GO޼' ݟ&Z4ܠN^ٜFI&la:`$s`:map5M>/:}c^!lm5 hd#g^!MJxUuKK]~ x0㎕c*1Kċ٧Qo+cmaȵ8T/ 3V xs[Gt) QۚNmqf캝խhKerH8O#_R{׆d02np8@=(sJ:M/Ɓ7'MhW:z*L v;W7[-;QhZ#iwz!i hĊzzV}4HeQYN.X,+IՙON3޺.ѢUVpy",iͶKLI^i֧5&S5F*џLR8"IoV(Č~@+{^MII)|@H5 W,bogm9+&y62KӺĝ) C}xe}+~#X#w eۜ -IVIyQ`j"wy^%f/1ZƺHRͫ=٭i']%L+Kǂ|m%!9ӊ6GEZ#r=}E:FRAՏ1Ld"1'k_[<r"LgR}kFPAtazJFzQsjRɫ: /<6ߘzc֬.ҩpUN:,.!l[{'sqtz7P䵄n$x97s#SLRZU*`rO5xsTC `Vf*vb J_pǸd?ldocYO*OԳ$muʣZ V_UKo/>NKzQ$վê[=*BAkc!H=\Ts]Nm'٩th=?்%}Grl Nqנx}>kaF;hF\zUGfH8,}3a^ ig,1ClFh᰸8Fڮ?9gOVpZ{TJ9ZՅ#ݵp#W> 'p$?5y>7jiͅ}zZj3Ql2$1h%d[JsT9k[=Vޠa$oaԚSGѺ)Bfl7qK]cF;#(Bxʯ(fosB`q+*=wHu5@aZ%T MKivW-qU%zWBh=*>YCוXxdE۔~F[DjVWD: 7D+ޯX@,Mpx9 ;_W$$UvWb٥xz H4.E5Z%ܐH!vQZV׋=~ld/I'Q7J:['<i#ʂȤg&M0N-CdQ=PX`PktDPyWPp]wC|mU$$JOFG sYe!A$Ӣ1 #އ婋Fi!>\b ^3##d*lt:&*,\6+4l#?ZH%T溍Su'*SZ{3"XD"nGLrӚ/#*src/mMmdUҫXkX_8=QE2(((((hۅ+:C,לI|nPA٥#c\M{V>b;{},4x=78eB2ܮzG#i.74;~1W.[#@ZbIWy8wYB5} }+-DLQ4r!GJ2.RKr2V֜XEpBޟJ;}Hѕ(9*"Z]?ʔ' I=*8淆 lx,$ RlL[Y~UdudtVicr8GF'ksAcC sƑgli0, IE 8q۵trnl+#jqXYn⡹~7h_O+OfY q~7h!6&iQyuڼjd,OW*sokW7bI_β=~ {hi|wu si4q))vlb[F{{eA1 eӂOSfmB.b23j'7SWʣKnǷRKS 沔}[X'a1=ʊp ՗8m`7 pBk ObwW3U$mu]1xr<+w4>U- Y ݼ=M[ /$L%WyR^kLp1 SMF0IJH)8mu+%-wHdpXzMRVYF WKI8 v_E:+7#uʟʭ;jLcONG 0JW,hƋiQ%A %͞cCX$nfY& |oB9z7ḹ*MJ}x+Ok-j#*x ;ƾdY_B H] ʲBAFE6ɮ'm4=ڼz5qpUݼcE{Vi@Qdr'5}/^i%D7``v:Wg ug$ \m}9Umj$&"') ʺ7eL,ãWOq, A Cc \.}3Z6Kq34x_0bJ:Rm3cMcGw+ bVsjhu7Pf*dRۣU >?ޤuĢ2u5bzk+K?f^$[f#/^Q1|ú]pEaPdnblꀀ2ÓJ`xH#ٸU&@L.#@UUI(G=3hd=e =hOV(X!8nvڬ_;Fiq~pH>[=Jq )anfXUفCZPۀAju*Y ޹om os\?6v[e<)=ulLxJjk2|^-JkF{V6JU8ZϽ-"ƾXe7ﳓn*! >cQ њBԷQ`TSLBd&oMTJ)Ǩy'{_,s-xV;@XMvV6쎘Z6R ٵ9AGS=$o؞3J)>\J< so6IQ۞y(Xڞg0= J}ъ69fJ翜] Iv݇2jŨ 7zуSO?[^ZǛHO|cheQ@Q@Q@Q@Q@#ᐳP>i+XD(m>p~,I#Y`\tGy~VLF /{hAMGt-P ?Z|+u$f$yA"25bxTfܾTC:2WF5o9H&FUOVHlJlmǡQp9Bk2 ki[T v9, ]ZJFĞљIhv :EyWOr(Ucח,\~ GFC#¨1{ח|K }"͕Ģ& կeәXW7zijjM-S$`Z>%Iҟ#ELfbo@ZԿmm4y#n=*Y".!+"dgҲ.5VTKu Nq#KDk HUQC5}5ku-k,ʻ`.vǂ38ᰒcƨ|3,`tHfe9?.:փ/+MkZfc'\)l9{`߭T%YYџ$AqS(@b{+hGMX[ssZ(-v8!]/dزv T>}^MHmuk)<kmdtiq*JϐcyZޤ12Au\gs%RBoǧ'Igx\Cg \I3 \t5vؿ}u= ETQkqqgU>+>]CXtC oʝ6=n,㙜N1IݤW-۲0$pH  ܶ=Gmo'O5x4y  cT>eWqwa)+;ŝce7sia8Pt3ҹtdD-rЁT%Ni˩DyV08-2Hx-Y]JfE0?<JoKKt 7PָjhT,W?aQGFC'}sc8r,~S[H٭I 4^s*O55t mVrҹv|WҨ:ױ訬L>gƅڴ׺da**HtJ3$fsO9#;6?)׊oم-"0U%s╩8iRG~Ήo0!{ɱF =F%#5[\% z<v;1 Fw,%ݷq#3> 4qD}y\Ӂ]a6d[DwN7vDj֪~mP.OC^]\lc= X'/zƌHfcq2km1"hR}.x5kvq[M"2^mL]NkюV'bk ǢZ<1Kf$ W^" p9CI#IHbsz^6&C%vϭg/?{TքwIݰ+~XcYSU#B/5x(uQAaEPEPEPEPEP;,+v>^a4n̢W{}+h?̪F hR2W^'t t[Ѻ8)ilM7%߼UdI!v8 (# جhgd{tZy!fUvҾy*JVgBՖƭ:RߐOǟWl8J1!鞹KYdy'VQlleaSE1nTGVeQ,zߊ>#Yx{W#X+TuFYTq폟@kIftYSq7ʹ}*;NKWD`dU`g5Jњth]>!xPB{6[,U/W6Z>^ 湊8=5w^#KY+8Vd*{fj*VkRңH]e.r $NrDPXkm$M$/dYNkE;kILr1eKh2qWtl>"*uQ: RK9"Qs$A))Uh$IK0ppb2qTLk &(ϙ"mf-Ion̪ZbB*$݄&)_4FcZ$`[Hغ8Qp}{{niM&8\{{2c1*X3G~zjLk";;k ܞ=@DKeHhppqԜuMyWRI-OZ-E\!Y!iI=)ܢh]|+5;ۻe!7ۈXԭK9&Jf$+vsnγHzBouu a|/,VU&0~w7ۢF#x݉UA!ǘ]~֮&e8Yn}b.aL$zEi<M) 򿇞-es#yia̞i3Ҝd"p"޲y#󏨦19 ۸֌y@ 6j fx]*VğhY[y2Gy7b񓴒2jIg*E(^w1 d"WI*OO{Ҋ$rEo0s<1z;~J٧1|י; -%Y~L00+f i?ϳktuaݿh󟆲5@k䫘cU`0Fs_U~dsҡ}M|ak.c`qulnp*+|E)MzNZ?+j\rIjԥW]ˠk2Xe8R;Vstrv4sZmśRjB%-ite%q4Z5Pʇ+Տjix!yV*A'*ӔyfnD~\j ?x gBP[8f+6 <ғqDU"F*g¤B3HUc 9WbXC(RyJIShIrٕb;NO֮EߛU 5!؎#qOzgSʰT GFbL'֬@F4p6Gvv9v#)pݸ~Ќ$Iq8Ytݮa9FZuBC~o-`O*tG|28FdFcֳmrIAYw6PpszX_jCNUa:Ios#EPPQEQEQEQEQEe|ZLϥ%lPrOBڶWYm$u{gwDH^QC$ Ӛ2扂˩ig11+P9}:&3$n;Z[ok) mN;})4$tv̷:gomEM"B~5SXԭV?n>q{-B+k{yY$e%x$sT$dA ʿ'΃YMɻԕ<'H[b4*"oZifOzmH18^6ȍcxkU\"{泧N $+mZ:jA - : qa[;繸1 s56-1Oʒ=N8| ءbGCiMi{caLwv3lcϯM9ki.Ubi%U ض=SU,A,?HY=fV9 ǛKI씣nb'h\_9H>0I*P@}kѭ \ZQܫ0׎+O$ Z7n;J#٣{^'kZ6.A,LomOtQ[h _Y)=r cHD'k@wXLR5hWbK)'Z׋BiM-;rC)<+& HRq)2 s"?gg<)3eә<+;vzj密g3͛ng?dKn 35i)fg]a )='Pт)p쉐6wkz*T>N?CZ76p: O{MH>$ȁXKq\/ftRt?3vw5(eMn~ol.JbК(bS޾GVPvL 8`'RMV"LWh5zV8yszѕklnd68#=NhW2c5/qSEx?Kij%][k)(A[x~]F2pzϟQ#kƵ zkbƧ8vcVh%.jRʢ.')HӒȇscHA'yzdy-;ZEFd/y).|f@ќT_h1zjd ڊJSȩKE&y<3W[Ĩ[瑤+(>xbrqbеs(VGѱztks#,;ܖ;p ڏ_ +N5L&Ռh>xʒ@PϿaZr$;$r9{?5FsQ6{]MQuS3?Z%o!yg9\0<;s[~wnIZYxႂ=jK.Ͽ9EbC&t,roALiaRVPɩve^:nnꇔE=yLdg-R3V/=(Yu 1qَ)[R'Ul]x<zb% 6GtȌF v"feŚyЧ'8+S.2)'NZo|1۔f@~+ԅkMT֧G dz͞*7(sjg^c6ݚ9ҍ#GF$~c09f88j՗#fdtQ}Z͜h$ĪXڲ%FƣP@`JRLSI%Ŭ@qYQPZǬ_t(((((((o7Ǘ09=ytHYąh80]m|l]ۂ;ozY'6EcH,LwapO> M4hfmjsrc QnFpX})ڍJ$ 6W\JO1BvkJ✕XQ-qycPWv㎇󯝾"js,fWcmFq;w/3n+ƂOs7K]<7xYK>R[XC͉62όI<-ٚPU1}yגKhgQ~[,ȍ,p׽(-ϙjIܻr"yi˷j1QBa3IsnXp1j%1l{Q{X [`ވÛR#RIRl72og8Ծz[D1UW]>կ)o<x=,KF3gsbp}*/wvgOo F4F0oY=^@7FŎIƮ<ϖso&xtI+B8{P࠮.v,p.0YOIj7bBUXj)I LI=ח[$NC'=BhT:8ԡb*Z_Vm'I,Xdrl[S.D(amGeUcXN++etm?#d6jq%%envU%BFqӖ$nB#٫ij9IjP[hI寖Ly%ToI7Br--Wθ v?έFxeE#*pƸ*F*WE(縄\lE@_yR8Ǩ+452CzWi.,n"Fޤ?Q]V].Rp`PUtw=8$KZؠ#dQ}c~U sVӮ$Q1Zm"69j+hsBшQ gF InEl 3eUO'>f+Gf I95ZS\?f+KjPHI)LWW֚>m4&%rl.{^[K<̫g\J`xTp=;Uk1ܢPIw _ol/q-ݾU8uR-DU ~8fPnN {潊SW>yǙmx>{.ai$k٧^HYd.˝_xj1PU;rkٮk ˎzU ]TxcsMHۚ(}-]1ryҺ#f*NsU;{W[O<bwXU_"hWc2&t95Y%hO˴g}SosGkk!9Is]W-=+[QK\\n)y#܂uI`W-+ƾ++xF܃jE28P@9/P^Vb8-y3ղENjIrczvѣSVbYa_D>^MR:31#oZZKr ӃL2K98s,(@,|8 0RZS.rj|Pϸ09#4-d[r՘KDgj"x+} Y#n$f?2c%ORIk.?/*Y& 5 d'RmѪ54ORh~E Ңy.Tuz͒4+PJ-޴Qlf4rNZ b8M yM PӒL_h*cڜ#mڵH~͜ mwz洗Hf(V-o Һ]׷#1X*0Q8$09=͔2^]4j;F8&wO7$ 6:Vtb;YpTIٳ!;`q^ťXGd FRâ4eW[A=6xwQ*jAØbHvMms$d_KWzb#y+Х^#6FF=أY;3E\ix2ᤒc`lUϥ|Zx s־u#JMM6G-iVHV t4V+rـ}O]9X"qҫVT{UrŹG;!+kQiΤ}k3ȫ]ƣT'vJ; (QEQEQEQEQE_Ifc[NNޒAIY@»wTm;㴍$;ct MPb}E[@Z>ʨt:ƦYO:0g?p6#q:Kn^Gc9L6sjݔd}pC(x&jœe+h*$P1\/ѧ2.sWYc%Olfڕ7ْ>lzZQY\yi>q{rVRq|R)%ޅSf=HLU݁>jMs}^1_ uvQ%( 5sRE3c 'ڨCmoCp{/qVsI5͕,Pqi#h65eaYP*?IU8簮 ̸1$8.x$uF<5\J}Ӿ  ne2ڥ`q#ǭxvVqbϙ0ϥ}.+ۏS~돡e倸DJb!}ѨO x pH kqu,dVrFo8 ck_ EەGq)O#8}% jy\={N-%#/7U!!WW֭<g䜐W$k.z/~woS8LFs, n#W]{gr$-d,W.ĉVυ|xzcXAh~֗%Öۋ5/6C#G}m|1]7Udw`@&?=ejzًp:{W'y sޫjG΄r^ c*\7A^|!)G=oFnl3ҼILra9<־43$k|n 0-V-E@Y ziq#1S=sQUȭ& ZZN/m4mm'asU.uP9泮eʪ7"Z#Z.TӼm!mq+Vy܏#uRXd؟/VaA!wYIdʖ'1;r jy$F9=iީgWP ;MUU\*l'[z ]Hf3g [ǺY=)XlyKdW]Hvm˶sAD&kޞ5Uُ9].pt]C} a?E@GL]f?JxBYP%vfJ%IhvK2t UѼ jlcQZ ww+LA+yu+9=V(6t <˦:WN`ǧl+fV"vwnsͦF@ju`2Yc;[H֨uE\It$ zf{ t$ʧ'uGSQ&7qIbz>>fbX.y Ie<ҪG1OI'V+2`};]c'PN[}G+[;/ -*䑃_o|/|K*X -|5.l#eYu#_M ԺV Zl6Ǎ/u]H隢CoSf!V:w.Ci=^LA qVVTʧFd[0#'x^-ñ5G0ja#TrkհQE1Q@Q@Q@Q@Q@}K#MՎ8_1\ks4J͖OLUR)b_ڣܼGYH3́GWPc 3ywR &X RYdZIW!..F9XwϦj؁pf/&ji)Nq[*J uYJȵJt`|q?*-.09ڥ->?BqAQsS`̝4gӂ=*d oL,޳Yu"-#{yw1c .2qZs[' JiV') AMGbcdTCg3[Vz\[vXc9)ElRI6J$pLwȼ}j9,yI'B:w*ie|; rcқóȏon uRW7){ԒifA!Ɉ=F*js]֍,lEURfo^ G/JI^ה]z40{[7w[]/'iۂ3^7|lR#1.ђt5j^m TbLJmKNJf`{{ם)ʫrg <`m) 9ez xllH/ڧ4Ҧ!Gj} 1Hr3S~UchBL (|#yk'#5J_[{; ڱFAs"ٞٝ瓻$JѾm[)m۝9~+e=:sN6lV(BFN9N9 Օcyұu89dIތ'#n<re5U"R FrJ5o>|HRʂpvkw)8\hfm.[ut do8}Fc rIm=rK`Uc׾Э4 D0>> h@ռK-'Hʵ_+-uVǸ)UWN6G IFڛvV0`2?U|4w`pu#ңmJ x[ Z0=OaZE9lehq~%iGg%^x_bOy֥-{bDf HR-Pg+t֗5ٿg۶-Bg8IMS[p@d7E0%NjV V @w0E|ja$#kLJbBH Y(W]wv{t2pV$$q^2,9qZ~Xf oZݚ%J):Vr&ɏ@.O)Ԩb;_ ΐf@أmx5a32E^_Iw 0˞O־ NG$hEnlv9_T ծb`1x7|wgBT[{#+dn⾣dQ1za鵹Դq+]*O uBC.Uua Aoʺnx= 1)tmUi5~e jȄ\-uv~u$(𕿀|+k!F{kpWlWecl][ҰoYI|`j0pz4a^/hf4ʣF%GNc"BުM"FTFgy?4R;qz}+Hhwu&A  㟊bQ~+nH"wϔa ;9ҽOm9~%D#*]o2+ˡђ7$neG:coJko`>cZgFڿ$U]U$|Y3U-%xgM>6Jp$n%gG .xb1 zZX/E@P6ބX2~48Y7KWZXˀN;Rq#g%ͼm 8zSWaQiZID?V-d&c{Rb5AL㸥SzV/ȐpGu_QEǑ8Zͨ -ʤÒ[u:~E`r{֌21I0dRFDž^]j(aX]/ 8nҴ-<";wQ]%D1rO 2)$a&NŅyu+5v#D,7A (*JZ,c$WCgyqW*oSSv2<6t}";B@+܁Nzⵇ3_)I4$QT5+|Np+j&UfeLU=HmsO\[8C576"wln6gwZK1:\Oˎrk'shFj- Knb ݣDǸn`{!c|u$Ά6DesPԾ(y"SS^mZ<2I(4P9$m=j+ǻ6R*OC|1- SZ\s$vZ$V;qRr4;"(skD~[ .;xEa,GgxVKfFYIQO[gɍp;1ޭ%aEGIo 0DÇ.;WV\jF ". PsWO鸖8cw*Ɉ?R>9+އieNSXISt8@YA*56m"FW' m\_{Z 7 Ct#9,RIt,yW;H#_)^3>ƔnőuT|= ݳZ(h%-"ӡf;`ZL6TH+oKHdft Cs^sugZXܫ<Ѳ?1D`3/U<ԆHgcTFSOy!>H?ŚjK%BsRN¥#*[%#F$ YOpMQ*tlq֓Sy>LI.% p⡒5󤍐ut]T@0IVQة{Ha'COy.nec:ֽi$)-+=j&2ʏKɮIUzz!O8Q𭎱:Hf'Spӽ{>yr3lK/ iۗga/vƥ4%ѼXagX6Ϻ@`:UAE®{W?RKk3?zF3Z};,=ܭyvHтc'_Wyku)/+݇ .ٷZ#c]q5*:M >e–=gGncPn}N1]1.V<د3[V񖣥i6FR<]yT'.柄!{q al >}ry1^6h˝qb Ux~UfxQd7$ ܌Z{ěf5t7=M>)q$gS5j*;Ь5Z ڢ H0Z0iEJ_2}X޴$EqBUHJ׉^OGrRGqkA8ݞU}^xٸ%oβ.#H%n7<ֵݩ2J j1y;ZM9"4fu)]I; d^֙BC/9$=*ܦS$ e GJ\y<&Ld ߥ)NJ<ڱy|af\`P82}`!>xLjq2kDYkIpw&8Sֽc-ίS[+f[;/CKD%rwzd:γei/krx*G:^n C̮w>$d :W}2]r 1^w2/%d޽7F|!7py˚L/64!tdCv';x -d䃎HTl#J95-Āy`>JrSG;hJpQ}J\<(Q7`ShBCIٞ ,K GAj3Vw#ei&m\kiL#" ۻVeիLJ\~B-b堬5來5>D=0F*ƔI2ĠaAi_^(O0BŘ7NXTd>QtH g~n7j C^Ay5Sݻ«xFi.+ͣ%cgtYS192.y|/|BԱH܀ZσNmf8Vp$RȮjJ?K GU#+Ѡv#O!&.DڸVz9=%W=;fUrQBFBcHݤhі5'pZ/Bl眃WYtĹqB[>$̚\%#ڏj0U"$UvIq|܊F@ǐ(OBf-Cax9k#~،)ⶬ<@Rj$c]V̧W e˹),H8V4DŽL71H,(o;>dcظ'U@!pS9 m8ffSRlm#?N+p5c ׉cJnWc籭Nƺ\1@7kq׵RQW/k+oTOֹzܻ=e󻚖fu v\4A # :zW,R$sEv›ё;(6u-E;suB+*̖? lO!^=?N|1y7< \7rF9~9ӼZgZEfYKAV fyd1gֺ]oт[*9U%eG@5+b9, vMFqUx/0!#;]4 rDΫ:\6twvyMj7FId椷KLrvk 3ٓJE079%VZi?wS[D A: l+嵊VrvyrfyOl?].*֩%fi}[d] OwnT6o`\#a__4G cP>Zbuy͛9\_Jti]Bsbz{t$n w f |5ږ +p4j9:מ.{l;V4 (HTUƇ~I<ԉ0f_J\2rro$?tqS^(`99a.%c^֎~maW#wCbjĝqUKT"?5ݱB885' R69u>)?:-Ii28do,E#XֶKbXaL,zzo?^>4{\ݼy# 7˸"1ǧ# XҎ[[G Y3뚻6G3Nj7LȞ5I!I3;uN;1FeW|(v8OJȃL99U-;_]dlf nִ1\5d+xNkԑ@VU\KDž/a޺?ߡm)zY^IUhG'IbtvZ(Cf1ڟpKT;S%{Bf=w0z ,W?- jiH-XϨizVfy\ح'+oA'\blns y4=fN:WBfHCo`\dں:nv+FCc%I2N =1QXMX7=ҴkN\AtBCORhY([ >Z#F~vk\4nrW3Fǎes"'dBDX)e(@0ҲwMvx@==݋VK)s;T:1IS7RC0#_89Lk`e2HBR>H癙,ORԵX-wO'ȣNrjintZt@B2$pNth4/O3$g^kK%3JEsz7M,1cb q^3oC3T=+۹C%; I½U"Q*ΏwSgAbeC6IUըsYCiQn*]CS}HA?:ƏRy9Njs3<q'p=떔y'q".J/rZ 9@>XN+hEV4#E&ӬeqQ{zVvMJIdL$yex+K8^K2W MU0Lh^] IŝVPhl~d{WS$$=zT^bõwN:qڻNڕތ~lq-bŇ o0H֪{B_ 8?(+ƬzAI-J3 Tv`z'QPA*]B PI' / 2;sNŧޅ@p5X4C1篽ye98'5麚K"98^uHуM\IN*5yzwRhIRO o!GS iOjYÅ HVڄ;k^Tߺpr@9gJ0qҬOrYzFc) kƬ|tHi#ư[ޅ,Qsֺ:d.4OCm\URd72JѰ#)wilK '9zEUCtǠV B݄ٞ]QRj:^D4y F=ESR]fmg1:¨`.Ֆ(l>cZUp(-mo9&B2koZ$%$\7U[98Vս[8J<'YLϺ ol1sVp) 5GMw9%j HK=N[sl`^gL  yi"cVd1^i[ڳ2,9# AHH w2ɦzb`VC"f߂tҤ0ykb;j&`Q̩ǗssMKqus_SɯR;#Ah ( ( ( ( (??l~:H@ҭ2.N7IҾj{]#AM1k5O/vEDvҭG895h *o'nOjVCƵX_Or iʩwc-:ԫ`G>E|B^a" ;U Z$팄d )i ݗ4{Z#lF؈<*HT9ː'_Glu =ZbPB `nk 㧇4{%:hq^tVާiϵYeU92H؁-l2a N{駵IY#?05Dl[꺒ȣ-I۹I"bO,I#RL5<6L8s%Җ/-[q\ɬemGo$yNsU6"61#5$g9?7IH㻏|[pO\Y. WD`V<>YZ2"pB/=NxVɴ2o,;|\/ YG'RSs v%H3c;T6Uo+w),-bJ?K Dw1o%j&VPfHʾV̈Lŝ }kظz*-m~\J^2Y>b nЀI[żVRYzXQ,\&q5/S6ОPlBk(c*+];Wh=ݢ HȠvi55 aPqbf>Iu+tW f9*:xrrkgڮl)jx?..f1b~P u_!md/ Ϳ 䢁]?n[HI  WEz|ZGN˝}u-:DvTtk]j[2L*kKmE{+ݑ"UMztKmGH4Hx0k9֖kG:G5-+aleܐ3t_I#12 u13"5:LVHȱ&\=B/gIf|2')u;R\32&Gz{w=ƹ}HVj2V8+K[J*ܐZ.GHr}LkI=*:zU#h_;mAJ"9ēio:VIF^gr˜5̋q$\VG@h.Qỵ^xQiݮ #rzW Dsў<6ݕOSҺ]=K"6H'hxuA= ^Gui}\#?xRe]VhO%b 9F95ɸe$8VWGŠ"7c2w*¸B0g7 +A=ӵ{ wLY-ˊ$\`ڸSq9G$pO5X[De6[ږ+& d8ڻB^rp:v QzUb0X^gk2 MH AMTf|sZWkI#֤yp*jjCX Jϒ̍=Zo NAKQ,$n9'2RXV%qVͥrBvNYT?EmI\URvG뾞6|5SOUhtn;#Z((((((Ϗ3[Ӵnotmr♼IۥD_BJIlg_2K`B\v?q:\an.9=kuG.~u)YWx&LOֹ[ko\  nifCė$-5(>]zd{wAEoC&QLF *# MSg:NweTǦk뿃xmV h4LpQ_g8'J>+sq8oc2ʟfL!V]W#<=Xqn!JH #^x*T3{Slv$S} '*, Dr?LԲ݃/͝qf'B2$ W!^}ӒMEx*{(ݟƸ7,1]|G攼N9_ʹFvdٷ|#a]0Wz̫Tbc;~$~Z{WR J5 f,EWq~ ӵR[iXZ >͂ Ld>I3 WY^(6pʒ\ƒ ;{WCyt(oZie*$h班B]^ .8 v .WLI9he-9x'k:e^A#ٖRr8Һ]bh=*q+i1!d19HBMps+I|9="  :V|,my{-z禧5ܘeQvO4iw&V$\3ʴEal37Y쬻#fOP]2Hd7{< ƥs(ʐ_c,-,KcqK 9ڊ_=ջB<*МsYV;B%ح:/ YNsZ1;Krq]Ui{[N#"'ZضXGuel f+4hAaGT' (M vCDa{M~z.D/8I?.:lB}k M9Y[i:3ݫ1`p+iיJ-B)ry^&@+9MU{W">v~cYݕ[7&F9ii6MeS+?~|i[k_Sa$rEzhd"xJHԍHCnHC6G_Uc+WM5UvI2Ga_9 ;Sz$^4QV!1tP+Ƞ+g6n9k0zWw"{|+XCkFs^}H.^[qFwС)G ѵI.<t}Z07n`{ۇwٵtTx}5}!\Þܼ! Xڦ%˸(5ui%wa7c-M*_;Ğa܄@[gؐVBptҦ>iwg4Whq5MGKi(89ϭ$ ̮]GOWM;\9[wWC35e`NW{s֠ n5\DJH3WKM#TdsL-3_*Jan_V5QEXQ@Q@Q@Q@Q@R{`2جlW!rP\07*uھͳ2>m~ϛ1/HJG/e𮫆ǩHbѢl2˿ܞ;KB}S6RݢeO8Qi>)9EXV54;1_O6cH2?.y$ ++9s §|~5|? h,ѵmA#rrvfT=;0su,}h;gGwQn _jim!PAu@sאjմ"S 0'o?1y~|GY-5=Nz/Zz.ǟ|P;$ 116 z ÙN9$~fcDfH|Jch9˕{wfZ襷Xsnvy KMehdեh.RNNFE]PsuT8]6XkDU/ګ q}sR$%q:^c)e#tQ w{VEi!e& \9v2M0,`|8洭_2S\1w=Mn+HCtpۘ.AxM2b0Xf X6P< Rz#z/xs`ȰÄ7s>,^cGn1Lg[{ˏ5"\ʯzWG4I?"N.1g3?_-V?pt$nzo2]hN~_Q2&n֯)jo>b1Zիb F `:9W2F:++~P?t "hQ1R4r㿭 \BKK`gWY뭧jQ6q.Vg Gzavd]Ƹ8/eUv4u- һ{ӦhʡUJ-LJ忝w>4-=WqCTGE̓Bv2B y|t8LM+OkK'+w!9s,ws&ȖgUH9BNK5 @&&7sj箆V,}Mc`,:zE:x'-NԴ. wb{WE$g4#~"pkwOZhxXHU-ݖa$jHH*OC,56f./ &=3W@т3܅{W4$ifz֝E3Z)#=kȭ5i023V]ƭMF5ΫWSa\xoDq)es=\'ڒw~zV׆Ciӂ(`Sa㪩is<{YE1Q5 L9ey8\<mSUWOa}8>sJI;χ+ZsM,&=NOQΨ=~ǩ>M/a9_M[f-aҴHʀrpn mJI%_ڞ,*V~u_77N{SӾPW+,.~_JyT E9a/Uԩ&լfl*,z=%BPlmּј]F#zȻw;]珘Z>pwFNGDnrrJqso!SsՊ;>8#޵ܚlpm3M o俞*Қ?_*v;FQE`QEQEQEQEQE~QB3V$夊|=g"LW`o_-esjq%{S FRބM l~BM/?!\{KB''"7H%'I0Cc}Yjwڷ<#/%Mk1Xzd3GvƱhe%G4߼ڽFWǥy7&=?|qSuRC̜=k~#J$S"v;繴)qX޾Ӽkk QfBv ^7cگu[[7JL \7,;*==i)=1ۻTY\skj2DVaEwQFO3ڌd51Z)R;x?(o@bjV#Cg;I=kQMxOV3^EQ!-O jpqWT+g֦3rk+hb!naVq U BcGr}*;Eg+fW2wdڄ( +F^gzmR8iA(,niD3!1yx9`އSxKѲs^%/cP uQ |}g>f"l 5@/cC/-+< nGl*M94;_#޲PJ*[n KhRl<_eG -X;ޫ/ YpHzUhw )+ݡsƩ.] k\"n1گjNߒj}rmAnڭՕ.o66sLgu(䞕,X _]oIt8.]L!Uq(۞ tanH?*+ѮTX!^[/%qk1UQGa' [Z6VWIo rǸ5G{#*:Q%ks5\{k!NQ\RdA<ֽ I2Nm#vrHlv bC9|{e*nq]TZWgrVe+m+v0c9xWVL,GS֑Y - PJ$sz&]zP:R2"$`$RO@vԞtnAϭ:S_x- #H^ILzCGhEʇg'TeO;d}lJ8C^22{\) Skbr[ҟpY}zeMzidiWOl!V}$6>iŢ*QEQEQEQEQE~HG ,HnlW4eqW_Q[o~lh6~ [DHVXjߦj\- QhvFΔT h8dޒw6$SJԹdfF ~zPhĢ+M RaNDֺe#//ۛpڢԧp#LUM6I. ;U;X0y"/H~mWvanbbe9ێ>jwc 4{Ⱥup UyjDUs{{kmWQ>Dhc O à|Y`"$9ˡ9Z%i ;JʬX:ƾ %펩\=ɀZ,* 9siOC2άTN#vMam,jbDnF{?u۵圲^Zʸɏ}qmkc%,hV^uψX@}y# ǕavBs+M9)_4>MIy01ܪ5$cD8Sҿ@SڤΏ"m$*o-:{Vumї͐]AIX˂l gAY[}KWbPO=OӍu+2i,ʆIv3 ilĪF8?3Zv,AHJzcc}5Hh{۫zђg3e${oyoK8Nj/xO ;ԭ!Oksr7pj> g pf.H'7VW 5-;RXܴA־WU1|6]#ADS;OkܬsuSɼ8 V A~xPlݤvڤ:՘xp*vLIFvt <ȕ wJI4pwEIbdc:ƟzPEhnm(af2obfK p Jn:^[DJ?Z5-ۻ'ڨ^C\ z`M܋|T{b^YSO;צ3RCgkmvv4us_?$Ry`zGvU095P:,QQÕsaeYі^)K>Gq'k]$E| +|golk7vwJoi8Z֚lm2^d^s#y.VgIK75qo_ThyG<{BI;~NX9~64+Oxp{ndq*|m!KVv xQT8Wa8+S)f`CCfs#׎jMpOMSܟTzZo^}@ *UccAН1nA ͝*qzWrjcppNS=ZX;v+eG[OZe~BojldrH3 xӵ[DDdAY\׃ru+\KxN|rkꏕ~E+|GBk"klJ]be@U̘S=5A ,oPjk) 30J( 3݀}x5u㍔Xv^lIh̩"f@8@Y|5gNr;s47^R(&7<K%!.>"Y^i6%o@zBuwp{Iw&;W|=wGڦi`'R9,8546RϧI >S z֑∭`:wt."Tw>rꏏ5-6H'BN #cdRVB9"-HCas][stUG%$q{2>r_pwv}$QɭK+x9mFY F1tJۜOw mfNz7EН̽zW|Q.tA_K[zt_cGs0T|[x6iVqְaw̪wǑ)m[*l-c@ҾҊNOI\ CTXhPINWGdgwrݚW$̼C+ Y ޸&Ԧ?L+sL :U4[{"!WJhl|\EVQ@Q@Q@Q@Q@?Q]FH?j5eH>d +83HY0F8EG] {!=E:"hQdE`3M6;ky 3~*÷71AqGE9mдwmPs.[rE MB+Ҿ7]Hh[ha?"(ݏ~,$ [g5SG ^,SwII$E|8lSIX1Ef>=SV5;B$9E>dxu~uVKBW vk<~)cɡd}x_L𶞱ilC .w&Uj(0ϹthAYpG7SK5÷W_e ;OBIJzbd_I+̊1W3ѽ?m<Ҳn!;$z(籒#7y>[w s"?c+h|&p=[ෆt\=ݺqGgאgql5֊+ßs 5Κ(O7>lt|SW{S$6sxQEq?'b⛭/M 6䥺(ބߞki,umhdvCQ]Ԉu]6iwm-N956Տz(J佡_R U pA^&Jh{Rz(ޣg}&.c-ZWFr#K1 Wg"2k K=#Њ(dg0!035M's烸b)UQ5Xiy 7J(‰N8v 5;Y h8W/v{_$E|q]¯XNkB/ė9)+Wo~!hVvE3tku2E}[<92:MHwJ09= ӑE3qǛ(|Qj'|(f㥹/<3Z|ikla r~趚|7q:nBEvjT~}xy> T$γ.~K0}4Q_Q Oo"N|Փ3Z&E4~[Ncl8lHNᏥVe@f=3YI}$ A: QEo?;Ӡ5. }Z.`0g4Q^+g"V89_O+LiiTXtXML:com.adobe.xmp 1 2 3 0 0 191 335 1 0 'l^eXIfMM*V^(1fixHHgnome-screenshot0232W0100fotocx-24.20: Sharpen: median diff 2 12 12|fotocx-26.6: Rescale: width:302 height:172|7ۖ? IDATxTUɶ}'=̀s(AQ@#"9" "" fb@TrTAr9xsm؍c^j__͚U9fLߓ̮^VSUՉޞn:z؃V_X`T[Ss0bD?_|VU-͍DeY1K كV_\EĠVUTSee8*Ok+AcMU9ʊ ؃V_aSSC^KAAެ)( Ov`5j] TUKMMuW.TWbGXVz 0vrИwƾgG;VF  7'}LEYOeDZ`mjׯ0Ң|`mjì1;Ȃ7VIcJ\&AdDRQh\DP' il$D"_lq3Q}1Z[?|6b5j:|6Y.0v&L$)KÈ+3D\p lsck1{,w9ك}20Cdx%Uq)<5:}Pn+)uT=F pdBrMv޵ yL"KHmLlї\|0ٰ.W3Jғ䁠&nƏv|}>aqrCvwΟ;T 7D| \Lo,\ܻ BSjt7ѥƜ Og">;;vn?p7<@ 0сwq =ak޷q9>8z<š_Ewf88፳ۻ gn-mDqAvY_7|?~rōo9sg"&L{{;fP1qpGߛרv'rx|*<в؍z%HJ 3 p%pw BQE o.;a"lDžqy\|y>;._Li VY\\0^Qam1-# m.a^nlLG]E ^9x&`v'j< __/:2t#OSS; $q'.my!H@t|2ja-C^6Mϋ8"X~bC/ACZSetZW[y8׎XB^\ K C ]&Ahb KPƤIAi4K` -HRk7,/;f K}U *h s gHC *+}1.|ЎŘ4Yn=Diu`)Xyovܷ=0U힒7Ub$3edqlNg2{02KDQAD88mm-hy:nDHI_@~|wcY ~rѷ\| %_ P7 zQE6,CqУ? 䁥fRzF[?LgGZמ#vpOŚsAxx|t Y0PT!I) Ry8 w4U"*}B@r|0.خM{UAFB t"fm=&S`NJ؊i5S6HfېNyF.F^F&ES[n 3-%|¢sr y4T ,!Ɂ4 2Ӓ32)Q=F \{\|Sz*J|r xa }jKL񂏷G #/M\O)ߎŴyR~p6A(&NHĝc5pv@˟`(?Ttj":8lX4:F0e뇧qIheɂRp p1Ъ%? nnL$-E_5)A̲<&S]ZURh(~GT f|?s0>w_xJ<^cO"Z ޹x<{$H{># 㟴 bx{{c* DߏO}tYp} gv.Xw5uO&f,& uyR$`y5 EK qΦu6\wX%+Io'p-Cli J`4Wmyk.:BAJ"҉pP‘{ۅX[N-Hn;Mi8E}pЉH879Z>>/-/mmi426ꬃ:ch#i`ڵH s" =ݿZX\9 (6U53>;Gt7FnIu\ sForaFHl<|9x9 i\y\qJ4}dr&L;5fl툼_lO7[ 9i}2l;t!2f)J =V%'e[J:޶}55gDjm2 W _$Q =BChWTP]X0KGx!((,u ,?䌬aG#49/Y Z<:ȠaTU1} @pH(26D*AtD(=ϐQ/GWp+sVlR&:ښPmBBÑW!pmi$% $8!a*KW#ٰ󸡔t i~UH#)hnoWG+J 2 j'M':a&}➓-Fu-,K;fJaQjIt եyxAYS,ϓIVV0NY9:ztw \ MuH+4#IFhz$'%1 A;yH AiXb%֬]L ,\bcoՁh_,7Ђ*Ο{B:ΧFmw XebEUhЂ6#:p5}fM4M72X<[|ӖpF(* cn'TۨO.mH iPS{_ tw#'![W-4Et"h*+L1w.d @+#6Aad?Cc#ϙ3q7@H< }!-͙3 ̨ml+'f cs d!4֕c 4I4nLWS٘3W&k7CZw 4U~6^s!/- گ:/6zĄHA0x9'+(+Q}gSٖ,iPQ xR,X[Wٳ0|9PU'QȹW{KBPG=,Y4'654hFnjnCJv{edZJBXZ¶e:,9ͨ,ʀLqH(pe&Л:p@yg{=Es4 2 0LTy(zwg+C`f<JUb< -,pc~48BJfMj+x?ABsxvO@sn0,Mf ZihGEXVTWW*NZʰct+ͦNi:yr(=.;HGQI)P/oo:PRZYbzdtVx Q1iXtV溘#}'\$jB백<ǭӶX٨'7zp ȑߘ$aL,jPk5a&kJ2ifC䗕Ѭ!kCh3ڲ47R1naa\W=B"r8w1Oq*XB (p1SŌ*\9+<:bZ ai֨}hêc^(nd٫ 5Ctveoϰl 4,抦@wS&lyb8AS%Xg8Sׁ nB\}q<kرmPcrʇr=k#^ G?QAq:c΍+Q키(NU.AEq:/?!u5(g#Fa:b x 9IesA}9]5h4\rZEau; ,.  77ATR dyDȵCPxO/^v0+ r"X-==x݌ :zwYcP" 3q9ڷCͭ NJc^ ؅K $|aӚל21R[[Ofv܉C`<B@zuH`7"e0SIIo xi%I*eVZ-v.%K}ʢ-fVHiUo3($߆68^$[! 댵0YZU{ª}ggk!W -T,j { pM!MLc)K/07"ŀk,\n\k5I:pd>ɼt'ψGwx_p*ZBIg)2 9oZ4TN.np?;6Bv n!fCu>T5F[Pk*';ǷCTHwRUw#)P581!h b5 Dq7M*V__qFLՓ!;D!ՙ8oYn1YWSˁCS=4A); >>q>7Dm8am ..Fm\SWGqłn߆mGaut&D)NF`J}ŋ GoUo\\CeĀk =.`.$uViR:)Z_?wK:4'`FEmCZ<5Crc%{W z "b v@ Pñ>G}o>v(RJ6U:?؋w$%]3!1u oE0)]״*G5.Cy;2bvWCU<:rbX:ܻž\y8JF[)6UƹoW[=;S dEr>q5w` )Qs.\v/6JJGZ\=p=DwpM>WESkS/?4|Ɂefg,!&۫^^0x}׻ wqHȨgԁ.PŠOȈEl78iPkb\n{_QU:2Xq^Rȃ%k 1IJ3U%pq +QU a6ߌ_6c&&I2CY~8T @E?S1Fqu0"p5Uz"m0 g7_zn=nxGd!΢F@XaCȩ O>{tb-&OZì\?"L sqbN·ʜ}\}Ra]8Sq-Qg冈<I%u!Yrυ! #v t-$378,?JCra̪M+3.y5U*ZU[q.b7:LTiGN{&j-+hꥎ#}BA=떀gX-upw\M昬!W7kEkW\.>!^.^ƕKa oDq+a%-J'aU s1GQqw5!iI+ NWns;%%NB~~<\Z ngNr" `S(;^8O]\ek-YUFYj,hUVBmg`xhk"惺Era&|2T?r "mk+^F D$e )Kqqt(H! _!t)~VJEb+ 945*yˆ<8[A@\qel_mq) gNppל@HRBJR4-=1xgVWhKbfd79CIBJ09g pxٙq8hfPtauvJx_^7 VoÉǰHS ZF<"pPE0YKIpgjt,0[O1TfGaFl<>(ƚLl37h9-ssҽmV4%8WU}`bNgJQ.c>.ѪНu5ɾ =7+߫p@p:Х'6.ͬ՜m=Uf-c\Nߴ{_LiET5fA7_MnmK3jgp"d뭦4 1]U j0ٸk:(!g=ikhkN#CD`+P;oMhY "7Pԣ0G6AM{!n c{'//3dg碖uեI%8ݢ{WŨdHvz4{X`s~S:׮Up:m͡: EA훩Ÿm y8uh7LL=m, "?1 ݱh!Y]GfT-\-w"5>ݳvm)wtXQ}w""δf^쵱űHV/fznZ4Nq ή|\_q:ۖ_-Ypӫ?ɗɗ3 .\,X : bE;DGw~_Ƃ .VN,Xю:Ѳ}6ałQ\hGhXpbj`i+Q'Zt0J7 =,'ks\\UtܨtiD':ޣ'ks\\Ϣ1kc;tǀk4Â:~Lן/P͂ ;F7iC'IHһ<͹tɂ'q]:0_ HxKg)a)LO%_WOk%P8oܺu ãQ ]?y9˛2S$R榞S5,K~w/r(1Ic#E'(o{4QܦL! ?msUKuw7\3j~huȋL$%S 4wr6ߠCbS'ʜC&`(?筋W`Aĥ>ڽבYTJC]vq$t҉d\w?=ak7ċ~@t"=.ǜ#,. QZp~ǙvQ2ΐϖҐ\ǑejmBc869Lā>p8:YջA@ a^pr؏]t-]{(9dHgW~ wÞݻ`!92GF8OθrCv#eQgHbd%?3Bs24VdNb/]ss~\_|K 'q  3o9"*;ޒXÃ`GE#3!:c [g7_\pR&'68`VMKmCA`leHdí #'=د'pv㙛hc7"1]PJ>זf3ݻ;S(6iT!N ܜIw;qtw x^9 8f!kg4pI,)Ҫc,|#ޡ6/O}}5!Hn5?:E(\B8|+?uőbbY7 c'aJ3ݺV.2Zkk׭ML`b~ϥ*?;)XMV@NR so³<p6 $z`jƺ̐]mE+Ӛc5wrº5Йmt fR$Cߴg@ql{lPC5৬zsi?0[`ӕt'-s4YI}ff#|;YCY 8JRtsGMom[.AyėejEн ±K>y'+JuEvA{,^[mPsv:qh!?ELPb=7اp~w3,h |U!Ha8{{6/2r>Rn;LqjLW!޲&ލ$muya>Z\[Cm) kT uKF+aef+bFRnNt2%yUJpvqχ \og?C17):G4(L 6ۡ{zxvta~^M/.3D4%D²s: QQV[vQvʄہPNW:^J jJIRIJeJP`26cD{g-z +#4•` VnGXJ&JJsJ)7oꇝQ(Aym(k@lmDq~ ^u)GER_wY5Sf#5%H}t\ʢ}d \n.n!EsKы>5fc+F=*ͦdyh1CEp˨2 {J1]xG ~D#7ͿQ/ .%a$XaR %mCuYV΄!z_"3!abPVZ0ȉc#ȷIw .R#R&TclAyG _?JY`siyOE]5ay"ڨ3eR9Zlhh`3ryoP]jdld曱K/ZW }`b d(٭s+-ݔP%^uW6oҦCPBגI ]]6ATiE$ ͵YГMaY(HԝGh%h1jk*WGw/CTDwFTj;).J5>ש} C;zu]הn|ޮ&$Gޅb(CJ aĩޮ*ܹb ڸ<2Pr-q^(x\a 9l=Al#4ʺԱ a~"lZ2jp U-)6O!ƊkFPfng@ڃ'|?4Ba:S)=tt&K;QG!%#qB{wTb"tQ5J2a : Kq:̚ 秵(z-YjwOt⨍duW"<`0k}E.bު(,1H@} C?2Xo4əU XvV˿"<>m鹋]|/ u1ElR:\5b7h䪈SG zjI/2im QV\jp&pQ15_DCy8n$xyy+klPE#Z\aS!$"|.I7Qʪ;B.2 яae] _JHNANL.T-T7zO倨 |_b8\nW|elf1aJGKiU`vU^]zqo1Nb ?yj`+7!&3d w1k)@gRC4ӆf-"js`klMnbk(6C3Ӝ{(1 b OI1gS,\g"B5_Se.AiB`\-Z 5g1"~۪\.H5Y :Jp<}W.'c'5/܋^sDyE^V49H:5E  B}S#JJQTT9 iY7zĀ$BwGny^IE`@)p $t^݃ݹE1.y{\gv-fHv(vw8~>zɓe:OI2Ȗ$m04 ::pTր߉qT UO Sşz($&o8\Ox\gaz(MS6ᗂW^-y\dž*<.^Y]tS;6!z ,e&,~QpߤQ5$vpU c#_NUx 8]Dsb\;#5bSsb\*gr8XiŘt\<ʆW(-BJJ Q[St_L@gGc ,ZQ)(+/8B 2Ӓ=XC1[G6C_~EꨂȪh8ڎ<:,.>R^z| y*=]-H?1.(* Wܭ!+/9ӐLs\ ^:)𛞒Rj"ݴ*_@=0pumk=bZ)kf؆V8z6ipc=*m4TVW0;[+Cb\qmELf.JK Ήqn<. Յ s-U֟Mm(@NE 48_;ip𸉴TUU(I/bM p -PzfM IDATGs \Y98*Qc5p]Ntei{ / Pstq YO蜿aޚzxOV𼦎c ;brvkh$PU+hUQ Va吕U.4VeJZNGqa,]0S&Ҫ5qhjR݃Ƴ 2^NCWk:f1&m}X "Mɥzq t`Z|.6c&&†z1156C #/pm@]&#gUq6AeW7 #`NBp쭡|8JՅQX3ujF݉9j)o8P_O?u#'-o>$ttd0 ,;ziHry#<9w01 LJ pm0P6o؄ݴƌt$,;Ux**`: LS,#.A:P GhOn@rFX:;b/VwXAw)=g?={p(|c4'N8po^hAt/ҵv>< zOXr]q]wwi>ߺ.q mT4u>aOIqОKO@kSݾy;z}#_Ww[,6kkBCM cor60EdB:G|{ʱ\Ǎ&T$/&C Ͼ4BJ:88  p{E}\u ogi'{'5m%x|{Ɏvӎ'ak7c~S_;tMFkn.!6ՉL#F{C8/~\z w=Ђ_ 8W?_5-x'fc̥z„I0~vun IS:ƏH۝#u$M<9_%߽]ܑS\6M5Weyn'NΓpԶV}/ X)M*oW_cpQ?ߎ뇗մgm?m{p y!퍪9z YoR`?UKXQ},7N}GP:zd{břPMs?:YpO[|)a>,Fg}?t .\\5~&|4x!&:bTCP߿3{@odm>Hv~21}Ne,Xpb504/煱bł .VNms\,Xpu`Ŋvԉї}Xpbj`i+Q'ZyX9 .\,X : fpS#+ɑoe(w ɾzGɶУץŅZ 6BG[ kz0jN0<[ [j܊*Gfq=:)! XLRzbf%|@>W?=A|sR6m埭m> \ R J6@p)4VB˵jelaUWY^ 1:ro𤋮ßFdew2c>xܖ$QN3O15w/#21#;_>k'p?wå{wǾ(pV6Z.TZ  Ԝ(j&2U?1sP]fPB]~w®Ƴ=b`&yxEl}uQTTrPDEQ1 F 10a&9 r%&7Mw }u,3WZg5眊k>7~LcKh iq T){m6Ʈ(D_ Bv%mbT[QAUo%EBT9}RiŌ(> q2n^~lb \tXLN4'߃6nڋ=vR~oOmW~74avNUt5f_#_ u \(0]"c;3 h,ԧ)ϡOll\qF C@Opd'D`Cl;uWtߺWUk)z& ~W㎴H̝d߮CmirñbٟJ:wdR?E-I%x(~Fz8qJjǞ۲A4f> #F=xZMw)~0CJ]YX?f*ڈaCFQu4#OﯷOU#Qa_-LE0w uq'ъYkLSΚ(;m&aG]wE `=ov8-xE+8m(1Xh3\;ŽjSpO4;'oys0o_V`# Zp-ly)΢^ݷ# &zf]Ĵ.Tz;8t".]>% m=uumnb7bYsabs?< z`w-H{kV`63fv9Jг^Ed?ǻw"W6׵ LÉ ʥ 1{\l(ݽ8MA7Tʜq܁ cYYd 7Q\>S"),] ksECxxn=~{}@,[,0#0"t`džUr٭JTbO7+^X0PWऻ'JŒ:pz QR[;u5-_~!k{Vۮ*QbZS8"C{:8.1;Q[ZdjcL+r:Xi'.o[0rv; )MʩnX+Ǩkh5~Ԟ R+ q?VNm/hN]NšQfA 6m |7d8v] J.A\5XM9)PQUuHA*`t]76ͻpb7iۏzV%ľ_WG]n(&!g^~ңzxoXL:y [Xe?j:_Ƕ+G>CIQ>EQ_/nHs]MWn̵cq2pe{`ٲ8~||Ч1nPx/&Jx^|qp "Eϡm`_{ l jx'M3+0YD5W uLZ4*pq< eY3}L["oqak2䈉 <'c}B{:V,Ρ\kc-mDSr+ؙPH VV‚31wT <;['eSt`2R)?VC:u50q4Ѵ K(.zHŨHtHX[,<?h\ mBeC^_neWP!lt-[Cu׮{%~hVV`776PR[((u2B罂%\v? ڣN 7o̕G68BƑfL|mZ0,#| &X~2zr%p D r9u qaZZTrZ*I\wyD*S^(L76Daə4 , 1zOJ;@Og7rh;a`Ď*…oWȩ@ůbt !\Djk廝QJ `Pi\.y B` \Ck=Ms16+'1K(<զcPʦ,佂>}4/ؽ Rb.&>qXyupӒcЛ5toAѽ X4K ;=;N+IX6lvB,mR"}LgiiR>Adr2H`kih+ӛ)]8qdzMŢ sC hA>V! d8Shz·4ʄC ǂiNб'7; ^db} p&tr ^ 嶕@wz(SE[vF};hyR߇O@r]s]xZGU\Ģ+b(CEcwr*!rcֆ] \,'`վ(ΠČʌkiȚmh(Dmp o,~D@hWks%&W6kWU1FC0 J=>.1G\|{Z?[jBw/GtML5%[/A8Wu8`|?+a*$Ea~2p*ir_?_W`lJbOϫ )ad]LZw2>|*GduǩISy"|?jW9(/Ʉ0!HVRJx:o?jiem<ಣ>nõXrik@Ӫ2}`WWg`K+]a.F\ h2:i]=6b$Gxp)pfb|7L /Ȁ߱m}ѧ7j$Jr.e0M.L\Md_򏯠b+a@i1q3N*0-lڹzƈwJ!iDBV4}#d#9:kfaE4}lEYvVZ]QK ee%c4c,ܸOi(?C{PZC,#qUR`04rҹv"23ť=!fkQk\z=8=s ٫*c>oC#VhvwXEsr FjhÉ|R23<794SӅlnIʨf4&Ա[vgid]I.7}-3c5R*ՀPZԡV/W𒎫̏f;rpI8ZJoC"qMVk\<7 3FV*zcmL3BKL*$wiU5eiX?:EZfWۧWX{\j)v{HJ˳EݟD$M[X`հ[a%\D%.f_76}^ -jeF9J]? ia5k~^0ptons@--jL\'3(e853 ݅¹ᗵKKƥk Dؼr̚mؼaÚ>=*M_7;rz(23l1}2-|m)|U~n6y|W9=/~?̓LؽlZa\0ll]XjL5X9~&*~ !0U_#qq2b8~>]h uuQ*]G@IgmD2@2u8!~-D3xQd/"/^>A96W>*H2{Z:Eo^~HzOxz}kL*)*p^fwӣ0&b8 0^ξD~˗#.9^a%~'iw|F8,/B)h92"TxoN_jD%=ej`_\@Ne>T*xrY8 ۯ :B;脖k!=k!Rppqpqpqt2Ņv Y]rpqpqpqt2Ņv -BzBv20d oIuY20d Z|Ke`A'ߒfڳve`A'\ Y ڥXܜl~62eૐƤP.Q\ |2Qpuj9._ tӸAe@WnjxW!98620d گ5R....N8:Ηp6 P)P\ĸhz?`iǼ@n+*~juf:bG~RZzHIGu ڞH<_V+iiV"3-ϟBTZ99e|TW"@]SUϐAe`i"2" y֕6W?e-ߴ LR:,xWhRȻ-m'Ţʠ{c͛V(ϟF[]呃 wN{aӳ'MY5IDATKQZ6J BZ rpn驔(-.@jRBW.$ A+8< [5icϑNգȱ/յ]98zv!WOh4F Bik$<ɹP65 de& 88!+]m rɾ)fU*E`P?P$Z\g_\YN CɶUW*ٱEdWMhABW3*A<,020Sq]׼> `GPɥȌ%V0CPMc=k\ق Cr &;d9,N),f̝ IOQ#-h5.qu4>x b;E}f7 Mf< Gll *h3¡^ml$ A0Y<e4+Qz~^<6 FvgXFV8~a" <{M>OB.:@Sch15dSEUq3@hToI@,XTfٰ;e)ض ƳZ )? M pI$Eϱa MxHLa*ճU,\TF0tN&@R ?C^_227";.·mfld+1HSEGwbǮNYR©N´(;Ϳ- %5겋cqlO7oY7$g \R.kYz0.Mb=8 1zYnv^Xk;0R'oI1{1/bE0CpB:۠\y.C4&,cT:-@-=V7)",Y.pws0"@+F1;d8Iz0B&W"8%gMiظsvmʵpzJ<)6x# ;Þ2 +vBJls ~7ͨ!%7s3k:lុ4Lq;TDjCSWh37!s517`=iF8vch{54W2OS@+5CY}ʡTTa*K n!#U%8s` fvDtv9'ŕ=q9҄Xz󺀉FFp CCSLHwK"z%V&]#hFCtTQWYTY5^c zZa.湮 Wħ1l:r2xzk[n]˅H'Q%rL q4:t+ Dm;D/WFj:WaP \%f ^겑UWMӹj\ܽ7ȧKm z.J4 q%%v삌^Mblϋ}6I2qt߹,겒ɾWrp =x8= <,2/k\|YIx P*kPph Z/֗EHMH?Kޟ>ID7⫊jBo]y<ТA^]!_vڵi&őGzgKQPW9brםWh;ۦ0Q!]4G#3JI@iOV{ fqyr` D4$bT >kմM{~rpqp*]` ϕD硔>()GDEF [{~̸ݵA]D]`9)OSWegm#m T= D8 4}w:|~ig$VUcO"PKP>]g}\>V_o$([쭮w.>/纃 8)yKh@ x::^T@+dGKF~Uš}8ױlVɨqpqp}t@t;x|620d Z|Yklo....N8:5^/#*5zIENDB`fotocx/images/add-meta-tags.png0000664000175000017500000021332415247006660015420 0ustar micomicoPNG  IHDRKF}tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 368 497 1 0 )g:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:497 height:368|fotoxx-23.70: Sharpen: median diff 2 12 12|fotocx-26.6: Rescale: width:447 height:331|m0 IDATxXVK7~HwwH) *݁]ب(`")o ( *9ƾk_w=ZfsQ]]*dp:Cq/O?d%9sN8tӁtqO) p:8gs:w(++Cii룼_Y>fYy64;V`\ȟӁoWx \dgg󎜜2в7`un3'+Vx.ooX^RROff&w0(1~)}fee,A\7fߧ8WAާ<_Ia.p1=CQw|Ls+K߿e3YU j@,>GF ̪|:ɬ Xzw{Ug~ީR!wBW"XҊ?*<~\TV#( Օ!< [=΢<z>|A ,Oi[ =: 0 c1_vݻ,@~2p؎ m 5(A}&:-Ȥw^2W X @,_cѭ+`eaIN)x@r*bDfuKnf\m!!.qa߮ߛTVލ _kߝ.wd`6BQ10=ay;7u*G# BIyI̞bC#k\'0OG:̇)\23hwWg~=Dgz/.Hv F$%%۠g0_\B2ZBJXz2آ՚TL7TAC`bܴ,>'BNH P4q@++ Z {zR^GSu 8FGd9#dչկVC; {#P\:iey\&aPq@go qGuU.W΀+Y{L `.K]2g.hv{Žu ޕǻ~gήyÇHJJ~gwՙ5~=Ժ G{# %Qvs2.\8 f|S3(#?'1 FHh£[TvWZxlrP(gv^blBBd壱1 "*ZX5pD&zv)F@EEfp=J0+rpq%4UVlx% @TQVh<SaQHNDYEՕi8b I119rh8éڰ=Y}lc?c./KKKB]]!Nyu 0`yGFFB__˗/,K||t /ߥKqNug+o&enޮ'''c>հi&bl2$&&u K+x9q붃LU KjVĹMAIY눽 صr*E9Sft;s(P'/]ށB˩C}} zAAT2Jc?sf * "Y"P#+,.1) aQGCUEnS ?Q1荴¬E075;۩~EYr20;h>LN^ܸ!#.xtHKlƍTNAqm  Pcf@WQ#,Q1D |#1r=+>E]}4i"ڌElb*:/(/Hef)Lu][Ð:Y˥2ڐQgFz2r+3q`$@עPYkDMʦNOi8Cm DV 66qIi(E]y.%Wg  )̷Ђ>B~Uv/y1L L­sa,~ (/L~BL@qQ|D*p;鋂7<<,BbhDY,ٰUZ~\ԩan䔷;k3Z'* iXHfm,Ky1t8&. #pe ذ~&dcܘwea0)r#کP!\.8KNT.AIE+$ ~#ƭD\VgQlX.%.BSm琚u3,!%,a#2-ЍXT56(Kp!- C5ȫ7~##\xe)­˧iJʲ|14! ǐVP':Ũ#Ԕ׃W塤m .p]˖hrJ)bm"h;7 %de&suYĥJb1$ ː;=YJ+Hʡ]>((~,qj ۶mƒY~nnn+TjJ)H#)&׏oH@pRK#xց.xwIIrY FRY==.#&vv4/&Uu-d6ͷߨCx$0 1rAc(wXInϙ4'*1[u'U%I~~q.F;!>ZJ*TvM)x42uKbHHR;S(QU40|pjҼ%T53ϕMYu1uh$e1b4T!#9n'y+yMr$W- U5e9-C1)`Ԕ)-C:rYdiS9 -:%gU 2h*QY?~4j[U<^+CGU~A1rUZ9"'\MƀlhJ4F`'92TV I,u&Bd* +ǥ9AD]u{9????t{3歹/Bf}s~,1NeߗA~OJ&):FVTyl5\;--AB~XEk/"(*,:**M #"[ +lz{p!+cv͵2j.$,R}.'x5" [444>\^m (Kw"nY cc2 &Y”Pls1y>rc7EhדEGD#"O qi Yb1uFHE=h~)po@ndQLxBQܯ 0[掇8T^ ǖ:R4xX~$y=?AIO!z(IeexL)@I+p3g}pZO.+M8{^krq(+쀝nQ{̢`S2PXynOfN^0_4b"+gcAғvV8@U:z.Y]]ot^||}}=n޼-d' rbQQQwt :yNjd 9 asўߧlJ hp3+l޵Ξ .IDh~'iqz-?9[@ X`P_8ʐQZfqV4G捂Yj:#vBޭؼnE$FHr8\? )4S~C!DVi |7c|*:.VIsS ص~[wIJT09UdyDc%\-k0utEHrktaԍ=P#x Q'-HaQyBص r"(0WNA!!Z! !jt#` *#1oDxQ lHAՆ (RBC)-ʇ!J#!pU҅ lS®`D? Jak.ˀǶEPe0[>}!JQ(RڳC^V*j<)'@ۏD_~x9a7`h>t+WA!HjhoyNG?3yw!> gb Lf40 0y1<.ߦo,̙k0669ar[ 'iۏ!#utzl6.qP1016[c.ᬬltt5爱1ƣzRiQ6Mx{n9gF&p Fuކ-%ޟ0c,Lp-~Ѭ(lkm-mLe 1rf`Ŵf3"oV ^YX9J2?{7-hSeѣIg; < 6eжdcQ&c5V0g)n]R5O3?~_|T>߂pN8t? N 8qtN~:)O܈qs-X([ bNp:?01)%%ɀN8t;ƽ?=jiwp2tN8tnt:SN-WWΚt{p:?N:Fݏ9prt?~p:O8gru9Nׁ~uU|(灠 5>W"G`hDdM EY}k=QoIٚ됛F $o~i;F#QPJ BTP BzԀJR1\,^\ޣkX>=0vǤ@pu, LJÑ)=LJ;Њ Z: s@FMzoiiyՔ\(mEsE=Y#idXbO]AI8j>=ˇ4V8a IDATMHyOҌ(,тtWĖ2cpH jN%yQkBu,hl~;"7.ti:gƖ'BeloZN0 6vh x6!c ĕUI,nLgJ *ޜS[Q;gɂ2&,^IwT%!"qӦcty{#:Տ˳Qb҅p"]8 dr76kUF 5]6ܲj1߼ViiGC?[ 6] !QmǙMP3Ԕfp tc:uBRp0GnOtwOb|gi1{.v=w gX; )hjnKya&n[#mB<W_.;5U~Y+kj^ۛ2u*f΂ޣH.z]h93H&hz D=ύKy\~axf0kXݻ;Vv]Usv qK%k] c}:б:zrlܽ 6ӝ Sm1`.Fgt&ܠΚ%6R+6@SY&60\w$ţ,40r QNVfs4I&;)]qi;TrUQ* 9YyBm Eml9㇖.i jĤ0wFm8tŽ4^%ijeQIy͜ ׅ1BW :q#$\F΍Յ8h-4klKa)$0g14ȱιpx-Ԕeh8@c3y]k]Yh`9cʈYgyP!h(AACgQg>&u8F(Kbl$ d5a83fLz\@qu ή5$GAQQ3!6#M] q})t%a>=ࡣME3Y7ayj0g l- #5P2f[;AmfQ<"O"Єۜ1P32 ;q18O9r Ԏ`|[j7p^a &8·~4#3',.3`\Ct"DgGT[7AKEFfpYv!)%'sĦn/: 9(Zb;#>hR6Piɏï.PECHjPT̴tG8Cp*1w`% ө."Fa>RjXE֣M {농|#6@MF"PGz,a@WA9i$呓Sv0JCUtdaЪ S QMexxS?Gs=,On 'Nu+ULBiY)pm"DG"F$X^@[哇 Oͽgad EO4#uil(MaQ "Z߂_ʽӤp=RұG-eqe}\hAakٙ(,)#+֎nd\fC^Ev@Ni9۬Nrk2C`&DN-ӳ:޹%I+ mIjOQX<47vJ]K ),4PklpgDc:#ϟ=x+PK8\N6ED]&+.9|>h@q%iB'4!;Jp b^׈{'@X^2VtPIUl9q9ih4؞6'`DGEwD`Ӽ1X |R}Q~ {=!b^;[!*G.%cV$,ѤyEH'bH}LpQƣ]ʳeݞ$a.D g"M,q5w+ i`!Im~AoTulG!΁.]{)1TJ o/MIP5| R(qM(F_}BFA"bEE $,k^ ~pZ 7BBJNDX{6VAXRpɖecx~9:U߆a;"? ~ Ƹzgw~)XQ[6!?( [G`at;)ڰCP˥n)RNE& L`[d ~~Bhr5ߺplr4Hy ) G(Q &/ڀļ< H5gnS"893o {$;OQ ,?}mu5(Mnߛ+{~3_F]RKk@BD@M7i0m;ډ:ژ ݺhx Y~[-LZ~dzZK~EoZ-$W>e;hiEQj(W8+]gHTFM|(&*W'Q5ܣ:VBf~>s___!PLuZE>5S0Y~o+ͻ ~X:o@Éu xykߠgwe"$q>x ܍ϤuJ (؃1+L L'.܆)M;Y Q1lzkx<~ٞg(|j[kMuN8Ӽ4܎^@ kxFu;E10U'Q-= 'E;NṢ溼|T5!AHJuOuq6LIΈm=ji@\,a:e..SXrJ c}dY;X~|%J]B#9AHfQML *'ZXRi4]As~+(x$W&)*`MxHF*bXxr QXX M9"␑ 0,$:wU9{i|*gg¡uTTVZ[@TB "61HRDM@=͛qCq!:{}؍s CzV2wnG18ѼD#v ÐD2fyp2Iu%:k$-zl: U4?Թo:oUUY?n qFⓒL:Ĭ< DiAmf'9 34-UaҠj{IF‚E pa5ŵ\IA1zFwwP4߻DS5X!,-g5QMԠ2b =@jz*b)tAӲ_[ls)HaOX#x8?υWUgOg q:*#+a")굩wn#," )4^DsǷ`=tOp~"H6d^LKN@D'!'S:0%ef!g\t8nE AzJ[>Y^TB :fnXYͮ)h{<\ KD3yBB};[2ԁ>V; Nתv-dhz_FbvhOCp,t 1{ #*9a;48̀H=s_(mA۴ĉZaj=N3fvxQp,)(aW,Ǟ ph鏀Zj1c,Fa- b}sej+uPck;Z2.}>X?vi^]͛7c˶8rI1qWou]KZBXy 5u9ųi7r Wi;Vi.5ضEGiiFM뾃&a׾ônuޠ$yam2صD\hX[Wa7ʷy;|щ*NSؾm+/;v9Ĥf¹SC}QnZ;߆rDe ՝v߽Wغ0* &cAOdYlaNVm n? z~{zohƔ8Unރŋ q{CJ[TraZ4<=74ZZBLűCx:yV9hsA-j@=j;q~h_Ks=RcCq kV"O-o sx원'㵩{ugmK$Cn7KqQCcm K-$x@[1'}nyD+Mo ^1wp,[^\vmn|oG&C;TS}_tӁ/hT%ɥɑN8~t?p:O8锞?s^qk?~8tӁNނo'wp2Iu4K QYYښl24Ytla3זӁ?V׺ͷv2^~f 4SHKZ#&&GA~:62q/NX 0ul3?p` ޭ^G(2ynb{C `H?8tHHC;/>>7nKk`*rCߧN_VW^RM۞#hx^}fo[N҆v9i3VekťI K+}*vڅ;v`i_SMv^Hmvv`D$S$EkD\R |^|$oP4ALKjIژ!hvA~aY<;)q&mi˭ݼcp}I{ cЯw/$ZF,u˼:Jvxy˸9 W?%"t?76GL3^d\Lu %}?? '<;)c.vu}pǼ)\_Aӓi'b<}}X~xUCg_7[Id%vCz]:*U~/p*H F>}зo?h݇x7g_LK|Z !0DzSzVcx[}kLO^דEr~q ?ngΑݞM:\Ň'݃ųF]? |7!\5/+&\}YHc`>1S0O3@]i0Oփ":1JRT>}FSw Ư޸y(if^9hHp=ȉ9b0DVZ{-΀__+!jV_p r |2BHA{1k;#F@މ4Mqg\u%_9Q^k TvabC~ìQsmgoDM [W`o"j:B?:N9c mc1_y8v4tp19`%A*p;p,8gS?S$cKxxc'z WjeD`*{H8D'$"fν8 |kdM I^zcp QjF<4?szXjZB BCBv7=<~-ui~^6_\]čQAm̼er s߷L?ry6^< P3Cw6ҫe7V_* R¯A,ߌOO A}q = #&r}QVpd-Ez~+*x! %رK<ܠ~-?}(YP_ Oƨ|ܞgt3n%U'oR 0T^}:P20<j[fh CNEƦ&9g8b_ib۵h{|^6܁@9"Γ+a7BU4| cJk(( @/)#t;{#mIVǭh*J  ~X}+^g d4"6O$+.OsO]Aezdg}5ha`]t_XeO~T{cՁhgmG^Y/dr/Nߪ>~gBOq !jC9hOўɰ'?,4Y;Co <0vZVP5 i@A^tkSL~ćȮjVeʕ׆^X$n^=NDSS`9/CFs{Jam_y'`f+d ~g2ai_ujp,?KΕ ,&M6 DXc8i$Zx&huk$4 }Tq=(J?>~y vU`-zYK!0/[s(ړ2~m;%1e.QzQ*邖/@OM{~Q4'W1SGoHk_9JD IDAT>t"8*o(⭡} Qy;YgBD~8'6WW̋6 ~ C>ZяAq?p%I{E07UCpMC}( fe aFh, 5  'ۡEP:ۃ`ev.31FG~s{Jq O^=m?> ~L0Csۚ=+֊ ST|\ !3+y"e3o^u}Z5*њFzz:r ,OI?VdzY9yklm/P_U MU6Α?n@Q~ͻFdefB5 S =Fxф,T4>G+#;;LO5R:SNYe-/:QS躪:wV*c~;c ՁS+q<8 T fIGAV\8 |=%8᷀+'/*~_T\b?8w*~?QQN$Kv?h[ux^=AX Gx\G d$Ea$e|p>Ge؁,g.7<浂+[ Wkkz>cb{ٲH}B?s hBn.($/u/f {~ W >U0^Oqf 󾝢ǺKŋ:9_y-NVo/~/_`ieBRrPQ ;xRϫ˫ggq iiA_U ;C4w糸oo |h ] cp&^b 3O # yzDž nK! hF/HkÏySnnCP\| {+2Gufzh{@L&-_ 8 |4R hyoL^dC.iqVK~!$+6`Ww[Gapeh&=z˳Чo_5fBFx-g!65W\m_/:BOrg(^Ń_m܇/kVLOܛz pX_p:^fAGWAw+a]PTRUq !8y;j;'IvdܗYP)lI{g. __hNHSnJ+%gHwY秊3^p5^:1F <4a ?E: o7Sʄu@xޔk@ENh{7RNi3?wi%Iy~F6}Xϟ>F6Elya#t [2+vRJ"9ڂ:d=WP[ӞI'Ï=O@A y5U殸 zY~յw1iICߡx[qj -Pa H2H ƒ >s17ǩϓ׆ߋ'HowJCl5P bp_d_wZ Cj2VzfwI䦺w_5]_~ۦ%^c&{?{oVֵ _c ݢح݉ v "("HwIwÆ}_XkoB|=ǵ vs9=ǜc!Բ#w}s[w)mq߯,?IKxvdWx b=BEBVK+( 1`PTոrr+6oÜʨVVV?+LZ2 m{$'fKDU-0_9 hdBWV~޼☹v?LHeu0 g[|<# f)a~Fו4=\YOj|\Z"r'rw`-~[Z(ywr |%_KXHѨt\<9}+AЖCGː_KGW@(Xa!QE{Fnaj"jh*<+dU_ ?[;mEeq#Dx1/d+:7j|}t\vwh9m{JdVJbj:/CZ+Ywxu6\Z<bZxKQ:jIpy-/?\ T-IQ_ L"4{CI=ʺ,06{Yl*rSjJWWe-?>ʰkHjXḇ/ބppCBQVP5ƥGtJ [?Dhq#YD܂+o/N8WTDdNcWhrDVɂ߉Uc w8:ܺ &jRh D*= "jxb|(WW#7; 9ibN˽D["yX)ab< Ǔ`!^مg8vc@X~]~$ |5)_9^HC ٣-t:`Hl{Vz*0 ZKR0/3!feM=tm,``j]g|b |ys/šEp\fpS↓,ytЁ>6^9O@[EC'M)af2"f[#+aC8w:L wG y88`1zZ3/̚4cFrBL'L'^RD8z:'}6րQGx? PCd<{tW.2|n"-;Q뉼ٽ+^s^7׮zqRB'yIxOoo|FCݸWN_#o~L+ߗƺ@g} .-N􀪒Lܻ}猾 /G m{huxz\xlD T߼Ζ~^gۓyn+~52Y~M>3;wak/SH'^{\)E< /\8 |; |+a/)~HGs: XnGru~@'sMz Ǵ:|}8 %߿wck,W'_@_~P\ה}_ۥ vrl5{IWxDzt}<|5(xuct)`daE(*H“/S؆}#SsJ]m=FxRI+^=zPtK* P`[ -z^&9t/\~K;v)A[IVUӅig\軟2q3TL>̌Ykw#M' >y?f< հ)z`۟)PƆ UW6w׏#/2-:Y2}+֭YI P3%qX̺8jo@K#0Ʃ=!jGo 3-gU^xp(<=Į=,*ワ>?4XJl?Sj*g&x>"~< |1%cў,/bhVŝر}.`Xpvy C-"V-_B/ ; jYbcXD1[i'_c3W6,_0rBΰ/X+3Vo`lV0Ioc*|-W\/A Wo~lya;&rħسu6oYKb8wpw6/?5nvbE8^z=S^CjY}ڼ]ƸW{|V,^b?%HOϦܞ gX/yP2<# p~,cDFQC;(N0+XzƢVXG>'G^j"g%y<2 ^u/};qbӜꁜR%`X@sM{&٠ϙ}Xr FFi`8BÛGc)AWᜲwm.MXp.Z4+y[{عi ,i\l胘7O}j9֭dqvY|]V_ ~9" }ƟW`X. 0j,L8g 93q]am5} 8iT<}J!jc9dQ.co Lʒ^U:+[ p?X"7F6,]&б.6 롯$D4x,,O.cP|nI[ >k:OJx|Xdjs!ރ_}(+#ioa'bƵh .pa+g׈j&d2@֭k _a!PVQ1rjtȥ'd 7BKCTF )E%>c&5ѥ# 5MY}%Um tuw8LsKcs:26_i=ғ^`[b@~ѿwZ=(XU !*))#k/qlZ̝*ސt¡`u8 Cac|Ѣ*n8Jsl[h_=̜c? 0>a hߦ- kj=nOiM0}<р`_|ZC]kv!NO!~/ l^!d zיGmNQ ]G %ztTWgcN=Hi֛HJZ'aP& #߆}vJrxeMu4R壺UAvF5KGxXRߣzߟ"=D%8a:dUq6  bFKpVh(cΣI q0:iJz[isӑOW賎XmF], ")q\᡺( n{'6>lt-^xU%5ctsJCQJ~jAuixX>D-ǘO N!a"9FMw6 PMכ+B\2-Âг0=XE [{*# Y4ǽkY |1eބT0qq}Tjbv86uSbm6"4$ *"#$ۢ8fm>hZ^rE[X8u‹̆-`k#0etgX ELj6{sin*;q^4sl) =ocA@3 |o+ = ;U #K< EUOǵ`>p6nFc$ˊaxGNgZM+){SB,& SKbAV~Uqع!.)V'E)y%.Y(7&m{ewD%Юm{lzCҬCǘ<2Reȱ ̭=n($7f݀zL ҶjGsJ} nFc&~`(I"6F3o- 9DYFC04+yXt zXz^5Ԃ=V -?Ui(=ƀ߁0?>u\LQPi> IDAT*#t"e_ -' ^􇻠:6X,?!> )k )} QW)EmWV눹P,<{wmɭyeH?_pO$-0 7Vv;ɩtTO^DY~ff7f^.-7 qHjӗHNE qxĂ3|v6Ixќ j:+.Sv(#?O#hΨf ; EZ&݇7'fN<7$sf&֓33oܶхƣ}СXl۾/}U5ɒ5 u1m򨥳WN8v9Sۓnrlkg u>d]+)&'):vle˰l l?pɹ,0q~/>SHhlh!PJ,]W®C'.1%Yطm} nރGn=3a,!SVvSvnf ke#ޥf+6~*[7{i$LwQ2V}` ;:Iq`Ҽ9W9q~ϰ{g~+pfl;ņp-#W*'O-~-$`s)A`-_ۖxi6 :S2 psW,$?`fn{@[mERgâa)j;w<~߽ 7qQax IRu?C|}tLJJ%k\ ͅ=,:^ [TT毤1fU㣦 U A>;rJգbҟWKQA)ۖzeR|UXʪFz?Y.9[I5+wq *(&hCDT"EոE~Cet>^j;&f'aK˼Yoy0% ..wbd[rgb'%Y{W޻ qn )XCGfh=Y1}-!k= q?WJ̇uOa@Uoq}x1J4};b|ėW4vRROi/_IAfUjYbz!py?wng⊻;_EwQf+yi×ܲ/\t@WYas}Li|x|/^ (bPWS\=KLj||GN=x"3ה@Kxo`Yal9cZ"Jtg=C xg^ LNkݯɫ3掼~2&4xG)_GgbH,ҋQLlu9e|Oݛ^8}[]Mb^˗Ax-< qF RS_Uw\g%{B>eIaڪrzy\A(})ut ),`ME2CBNL <|a<"0_Z_ ~9AKw9!t6ӂ5z [V ;h (zZA:}n0ReۨB2Zie(Hƒ!}DI[c.S!#6`ƂI:V<8 KGHU b:]0i40Y /=BƳ"3SA qJL uM YC}TG&[6\/|{V]{a@7/2(tO&/IAO]z&TҳԖDžLK OBBrDDֶ03҂Mg80N_e`yBݺҜa WPh'.#F`0йGEqx LGs:tqS0i <` r^9 |1e$CU[ ZRPu"WA'>ŻpB_w Z9 1, =àd;x`,bB4d1Uiul\∮U'R3%:L."#qn YQ:z EѶrhQHct(^Vp,dC3H-DfV6e??M?ZIrXt&St.|"D3;fCA^ ›(zh{M^\I`" pK' DƽmS^ZWn?PPj;`D|}K,</N@^,]8s&7"w04d$9 Tlp$x9AiT13ewF_]hyٛS[1 Oz솥@n0w[~wX!>n;o#V }D$P: 9i97? !5H?)r1q\po>@_]l;(A|Ъu:ibCa<>ʊN(vFa >3@b SD*O>mԇG鵎q8#Ck!'ڞo6e6ȁ' \ p#&wQi<,s`ϻ9N&!;d1a%>bKPGpSYyOCSe ^y |1UbͺhP*#9WR]LX*awbe&*[fAIA "|/k5_aBXt{oX~B ZϤLŹM "#UD'0Aĭŧuqrxe/31n $M#kSv/?D80hi`[rt{3hWXꃧPFC+&. 򨮭.ƣ{H{ O!6y^xJVC@ȓa}qU~?kosMJ>*X}*B6t1&8UIYu, ,m Yo8[~cy!%slf q1(y~ pT* //+`b g~xf"?Ab?GPĈPY[ _keA_ ~rLmt6Ow# _yBlYYY>.+fX['ExZo mMcghҶr<=Z~:85\ϥ I@e҆2m._fO߃SVJ7ބn{*(R"r|'owI6kkK? Ң07 /#Oi5hXW$|>n_==}8 GnNZУP#ϧl>9>zPԷ5ltt2ąI Rx{`dI5S_WK)/Nז5z8Lt`f?QF1O1w 䵌pzb'M)>I\8]Mc=ʃH} SU ᇗ&´cg=ta9m?kryTTTeh^cCD6#Jс|nvۓ_ GРD 0\KאHSIhU]-̞8{D/r?{1Ig"e98a.酞zc%x*, ZEwVn|M%G "\íQ {Jl}})Nm_}zSp#v2샙FOoҧ0dDavK*sC>1~.|8ޣH&KQ:V wt`KZ}gQ!*$K{_Z{%elO>n+hz/Jpd7gD6M7Nƛ JS~r9Ĝp,;m=98iuЀsC;n鎘:%rkVz\;Q#F>m6Xuq q4hC6r'F_~9 *Ȓk''Aᇗ~?|q$$w*~՞o~֞JT\a8]Ug~?C/qu$bKfŸ׎.?zFޖQ~֝UbāTS*b9PUwϯ,ظqKL59'W˻碃e5XpąqY-`[ӴuO}}9xĆ]H*[enSq.Hy58{|l&NH'>$bK:64gc#]1JbR } .Onh'&ޣ&cYjgAA?/-PP71{;i-~Ă"m[üp>8q|+{RρQ3_XP0é?9y59pb9qFϯw''!/+~"poCU-+35(<""W^UGaN"#"ND!(NFTT)/&1X+H$bWTc(\|bmBLT$.)"2s yeHOGtt$"dd$]D$) yIGQ`zrۖF>2%dz3)bS㮪+ˑXEuGipGUY6ƒqh\(ka!w1r"šZ6soc7W- ~| y0]ϯ@PšCi'CRGB &9M@cyUEHN8 iD#UYZĸv,#Kaƺp0QHNkԙdZ֓VzvlC &{4Vy5Jcû0"Geiػi-Gxe2KYA:b|윒&S}aNqQє.Q糈ա!>@_V} buSMvR 2k楆b :PǬ(+Dacx酶5v*0/2+ډ"8JPmFBII F&PQ@畈.EQ=8;@NU:rӷc/ktR9H ! C](v0ǀ:xWXNEzݭ -uEuK OL~zLJ:uҨ +t ڶeհE!ӑ-hkJ`-!X҅k۝жMkL\5/`s( /19wZn@f兔^T ?OcR> sz'4E>=a ymkx^u^ڀ,(6P6Dk] `!Ԁ)L aHI=j<;I4O :FVx2t&-nPϫċdcuUYțĵ-ӘW71ՠ sl<~y 0~o/AS'kbnSr@_5nIEMA8qpN M[ z-)-)!mX< &f8aG;okX::­x<">)2K?ѓ:j2„¾LD{*+KS|tx̓(.=EAۼ?>#qXr~{,tn87DfآĸаZMǾZmmODϢ`?nGYiѸvr,:;$ }.Y *>4o.k#Reak3dΊ|'K呱ho03g!Č~ lƥTƞt}1b&9oB IDAT;`Ds4\NoEOcE owlk G7i(ti[NdQόPJ8CV~h +X|f&ұ8vo)?'j@4zQҬ(x]qN$;knHyRaQPt'1m"G]H`i<<,諉`Ȍ!GVEO45̽%ТwͥUt>2K|^sUq ]m=@@Vs6JY6x;!XU[څU@p|*-AFIG)ls oj*b\$E{HD/LA۫>PS|ܾ~O|GƕQrJGK`Ԓx W`P;7BAetwZ(!!!@N]IysoFx 7g%"%65qVyR"ݷQv|^6," a ,ה.01oxi7LMC%W$o|3]KGAĹ0{loGhJM󽎐 c.z7>e1uLWH BtJ%)XWCmf#R<$G#4{E c*M.>vPƦizb:DrNIx0}9ma-o"xGk)Md7? !ϰS{~z2?^6cIBɥqnd=xKz_ȅO#+©^Q.MFfNThU *28tOwYmС#8, Y%SzGJKՃ<1yBsAGJ|bxϲ2m˩u0%O1=~T>chfʈ#T+HxX_ҚHg7/4J]$ t0gS]");cj+|.ȖydD`Tzty|2;x=xAT}!Ts~fL[rx3L F 2$c^/% 0d9I ƚJ,#q~)Лo ~w€_:̈́!ݍ3gСCl;ZD{m JԽ!j~dU p.~M=CkiCSљD$G4 0-&_C';C2b,?Q1s{~;,֋4{`!7 y"4{ w2k[;$;tP~{[Oҙu>ќਲ਼5D5AEw dUp;cvh5YО6,s|m?l4ıo%2:Xq4I/31T%a:Wjp~3&B GuIv 7B^';Ggم-=`w {y<4"e>5u:$W Agz 6 p7P&ktwDN8x .AoK; /b3Nuk4Z띹x6ĀpV ۥ7Tp#e0F 8a&VX=bxO&H'+H(ic(K}@lf)bk6ׄ۞}Z~05 /%ynP 'uVn; NbBļeQn=%5A3\"%)k}~9UABY)YAq.3I Wز J}qC F~i9ɠ{gZ&؊Kg Tl[fÜ>d!)'}gVf{-/?f?59&;A^V W0H^W':Zue7!TxĻu~Lh˵4`{|pD!M("1cX7HS2thmn,׎dzX$*~y~b9E+c,6yE0c/sN_%?>u߳Ç o0_JU#=u%#J;7ycV%؁5'%uHMxng**o$ C|d kSuUtݬ^cnŵ0"K :yPQĢLwq%-8vFtB+QX ѫ~,<2ңͫ! ۡ 6.B { bқ@zsc_yu%WYGA]dl=w_P\$ bjmJbS ~L|TL4kL3WX- ~Lk+Q\#!)yz %C`lquDL@Bǹ] ")MaOC1qא_G~cN ?n$bˊo=7D{>Dn4 !!8L&ѵ,l!CAjYbDe؃rA5PDTh{tЬ?f`?BFqӳ9rN :K=Eh)@J\1NҊq? (EYܳpbI qHHJ@NIk;`Ag(IBQ϶dۡϸ,_= nD+]B};X9LEJ)g[#V,N7_eQ".n #iQn"2% LhT>')4'!>H[mD)] ƽ:JG47#[=߫OpN<,K(ib4(JmįC5EʩD]614֜{o_&%o,cX,&Ë7m>|W<Z(Ud5GBQ <#Azb߁ewr II &ss rڶ#=`3 Hf3>)a+(WAM7,ܻ^ Vl,X%O,o ~8 RqJ }6(-E[rz7X sƣ|}S'OS(%X\L&Vnހ:f>eNB~Amu{Nm%qpބ*͂V8AA z^JKhա(/ѡ)m-BD3(HI뎟%̝:{$DŽf[F4E*X0odvRʘacC_Job!Mt`[Fc/q\=]CT lnzymi8SJl_G_ ~iѶU{ $M«(s~~J55tpA03*BRܵ|E/#y B5ɣmώ*DHU^(7O;xs>%]1" FMaas^%hr0:MTUU5;:tM%qo8 *H [ r"2W.i"r~5G(߻KV$J-I ĔnpHvŃxVS.C-Q_F_!\LNSNG.P#ٸCG5~o-=u[[[HE[>n{Fb1H \Ԧ3b"0ffT2JrƬ;`i><>Oo0,cIဏ?* {@Tމ 9$E J:8J_s$p "b5cո|x쌴`ݹ;+]ǥ{A&K-2&v='^-̙h;/}8р&>?4OFC '?ʧyS+`;&*._SN@ {CPpj8kWbl܌.F+Lh}S 8}{_;8XRhzOu B~wБjCDrq d)ڣ:fkq,?1%c;wi"ۺ^{ H%)Y1+0q9ssN* @E@s{TuAƈ*s98DGGaޚ߬Iݡׯ2 qy\ʍF`Ɲ8|"BR+`sDHQ=e RI6:XrYȭil<,CW#]w84Y< j_Jchn#ʋTƭ(`g"<_Fv.mCMUrH~me'WaG7faJ֯S 4ugTvU4_N~TvNO ˠMwϖB!P'?Z`|ő_l%Pmb<-Y6 M6u:sr'hS!Gs'wEӮd±yPȩcD̙3ӦM+,%j[ᨋ$/238%H&mu/V/_IíDCWCωETt|Zeb]]D`J҂62o8/Q `c 3 m?&[k@܍)U",K_Gc6ݔ"Z@2G~yo:Mw2,D:W6Qai~us%?jXp-NLf DqPGO!mSה23+}M~Fqey%#VCvKLi AKFh1">2:iR,rbP(v~]qנ^#?2{2MhҲ+R 3 Ga`h'ja[FW"9GTF!~lv^ NN)¢mX mmf"*3i=9(]/f 1r{AU](B7닛upHKVj"B߅ݫ]߄nC|R%^N^'p7 *Tjaq2sqsxZ_> ̞}"gV'|i^{CG2/aQv@>9K' H\y z5nD!/-sG2dٵЬIcZo_`Ϝި+GfO"KХ ñq58Zū6#UF~+2R`C{SPP0#Ð4$cHH$#*Avj<;p]F0<əT tU1|bx>yhC b0#ȫ5=Ri a SkܢRc3,emVg8kkvc F]*#s6j<Υ0R]&-:^P(Jh9|cZXP\=ZbXkh"yq@\F^LYdNo\=ǧKkF ~L\rLV»<2ɻl-_kOTi+)ƙKIUyW DЦOe?WW3lIuh-M %Ǒw彟=հ?̞Xq"N8`ԃ͌¢&^^z,- UhWNkB>, u54VĨH+}S CA\Vۢ"ΐwѓS_) /uLz-'z| Sbޡ)ICЪ@5j|VL =&:hC Q][B 45ՠehMǯ"K/IS͠ad;)MgW .NB]&G*k80$#%9!_3Y!)!1 yt wvFdOҲ4ǂlS&gp[A^!>SwjRR3ˮ)|iL~y`/r3˿${ʣQ ɩ( ͈G1#-E[L?~Yٲ忇DE2F9]} ,k# {V@(t"7-߼4D4WŸh?QL~i @7)bƅ0ew&{Jgs5EPK4jY;o a|ҠRK9v/C "5 7EL x)} i ^D}鮿n_> Ǣ^-r[q.$fB|IqOC#El_rY@~9rx0 tꁽW4 g̑43Av`0c@`W% j_a~.؀WcuپN;"14f!Q"J“+ǰe^qeg}%ř򼈝.!2)A 7+ܾouXȇؼ}x(E IDAT?e  j_~v:-ТiCSi (2D[D/1wd;ԫq$gG3h`ڲ +qhfJNbDuCm2K(D/T<Ŏ#*.c T`kXe-: G'@g`H_c¨P:O/jU$S".@Ļx2r?/Q0fn\[}1(G,+c<wMEW $={vpUݍjtA}0iv݇ӗ| 7Nΰ0%z +bĔa 6bٳ'^){Sbۛѯ[G]^x4)uI &)Xq!w)Q*4|o|~d?Vmjț^9r^R-У(xGE~b;w u;8O%`I!XAi9-,;Ē-g!)1@K3B4t)`ݭ-`4\}^@HA9Z@QMff1x-0qkcI[#U?|˿Lv@"{U+] šD-u7,7d@+j*zUjaWC' E3_gʒ>"G5: A vƠUmr )TuxZvp.mCJPܭ6ڏtNG 'y rf*klmK45Ƕs(W:#1#vRۄ70{KWΘ?;6l)đ3)E܋5Kgp|\>f* ̢ϞCB߬%Ǽ15( ZqmsLGPR,DrL0d5vGmsrS` ~co0)[836uFK]}خ= wyz#U%(/.qpDJ e5'==.ZT0?աinw:1VA|])kKl8^pge6Ɵ H~+_r(hS)DO`܋R'{C$r,Ғ8<tq"/+DV:7Ly iJpYST%ӆGƦx.MO64Y/+e'Gazߜ,Z=J*p˟_&cS hI Ⱥ視0,,oL9SƘ"n+eCk*<GaUDդ_Ŕ䦢~m?>ww/2ˑBcxJk?z= <#gH>#U6{&[H䧃 KoDgDáT Sw$hDN]Eam5]04Kɯ$!tG]eً֥ѩS';cL %ŠfaCOԑWENڵNpn]tC+C*Dr;I":-{)A0l7@GTaZIɯTY+UupJɯUpC'K]PF~1]c ^ D{bcxǕ -ǸtȯM& CLf#B]#\An҉U05&%5sq)̞MMG %ͧI)ȡc@*f;NFHdϨ@&g{)f!Xf> jjHId |'[vUZ?nkջ x?t#p̓Ł'Sj5rlCź)glK隧xN?!<>qAx Aou+< 2±a McC!n82 w1)F݀h&Y2է'Sʼn_]4gY$)K m;M;^Z3U1ƍ571‚=XX;D%HNF brXb"TdӺi9 $g87ؼt<4hcOᥡ )g5?ZW-k1sFs"PmLRۮ01ЅR@ MZ Ҵ(͵PhnYINfO#?&"Ѕ&g̀Jc m ` yyl=qOpkԶ9fpZZZp3DEcՌօUhma \$(}%бSG#Cxevr(s@K#}[E;+K4o"ż{r{6$f K&|Qۯ"*=L Malf#£MIHS6V#/TEKNŬq07WCؽ]ozPkfsּ,Sh0!#LZ\8 54ѡk oAMƀ}эG!, [u`?R`>ܤ9vfMa3}9>-oKޞTW#T:氠0V3A (0ˆS"Pm WTH6;!wy UT x=Gjn'Býww#xܻ\B޽MWW07 ̊s 7q#Q\ȗ޸*-<"2߫ڜ /ו㎻b8Ăt<[7SD*4IIbƒq6ϓW!ޞ!|M2>ڃ;\1㛾7Xmgyxx!j&J&.!>"n29o?@R*W{o}x@յVLUoߔ}.ǝ;Hϗf͂=7 1VL ?fW' C5J~{ /X~9,z Ýr!Ƿwxѯd2,]DV2ɿl5ATG (@\QQ;േ(Uqހ :mF~{3CK ]ߗ0k!PU5vCE;7LF~d0QG~T'.#%< Ǖ{^OA/V,Lĝ۷,KU-%.L7%Iɒ=WJF~?0*"/O8n:M5oAeގ;Vǹ7#.<zj|"D"±їo 9q>s)#3l j0W͂VS]\y#FF}? "o6> $}za׏bP3ǯp A2QLL@6eEb%@66>)/Ųti'~d,Z~o#e1j%8q!͜ s1i$1onR"??V/5nP9)fMXIk=3낹L$,XO(9t\4exV ¹y,˷i'Νΐ cݦpڼ ka2ɸ`$yDWRTHuo294Jfo#jnb|T<^w3|*3Zjh{(O M~ ĤЅŰkVc{0_XŃT5C;4AdɴPF"$MΖQ0la;qx 3Nƞ-QN] \)#*3% bft"k~ltx 0m.AP pqf%5bنزe\[_v#<&:CT"Nu1dڪ:ks9D`ˢqPWD.ŘE DE95J <=% hj;)cME:ۂcNJCff:LDN6VAU4!뮖A )z~AY/A& y茆Ngj [AIvM~bb1C3/,0᧐ !P j_L1ҸaÚ_I#4U ]Vp6l<ֹ# NVrֈɊ~:4='H7g{i#9^FcqqPv %a&C<E^+{Sp * 0z)a(6#,- [ :D~xsf' Ldkm:RZmƯBݬE~^kj؄TbnA3nAD.[mwm'6ĢkwȔ)%$3kv}f2EX<tEȔ՞f;o}e|l‹s^a>U6C 0l{&Pjdct,{#%" Ǣ^G~Zٽ{-ԯUdee"'"4P!Œ4 jͱ%$rsk~#fKɏ u ֳWvYͯ$OrSST 7f!ȯf' CǭF<.䄢Tnf;xY &0uFxb:!/%`! Kc]tߠx9Xza$qޞٸJ'$Yw=K`ɂaC^za9U(y.  ZA 316T]F/68/]'5?9h[DvI[v*ӦcD2[n%؛F~?1F_L)BL?نukb:G:|Y:0w.:];xMn=աb>#߸mb6q15= ("\Ŧ޹bx]FXKLjS n:Ggv]iM]aOo'={v(ȈsG㤾bJj4A0WWJa^ %)9ܮEoF|_PJ7EڅӸy  8ki`%\>`3>{MDD"vjh UǙ-fm!3cȨ:uj=#b2"?_F~?1CM0I}%AW5yB%XWxE!1=_n03" gGDߏ8kLfwGyHLG\l,㑖Ybdt( Bg1( ..?ߟ Qe%QH{˷de精˂˯(vn6ac>*qRS6$(!+;;>Mrp$LC|bUM׫'_F~_s#CK"P}#K PQQTP؁cqBqs:J*:})Rx}XZ^A JJhHOl.ibӻ6[ )>/_F%)X|:LQ/j$ M9b,/tk*$zAV,RCF""fH^l}z!azb| M~E _5T1|=|Ϋ`0[FWihsOf 6_yrDX8 cѦ8th?V,IWUx.{Q^}跣$$0F]u4Jc0%F#3ҩ7BA(6Շ\!,~O#fNެqxVzK5_AP4jn06j_j7,4i M yoy4o e*Y/`%肸ԐvʛRI $O0{>ZM99 ;4L .mL*}0)OFMgugjBN 6o߁=_^3-KptٻL|Dx  0w:ٳ/q~)|<}5 9pix-T\?'݇.n44tM/*ʇM:{3Wi0_j_˭נ֞[':(QNK/"&4n7{N|2?Q|\=eLXu+nBj gwa,;(Q8̜MZfbIG Yp9 JC\[f,!5͜ &:`X(kVr[ "N*j3j) 27kNn<:h~s%"ukC4ka^=;cGLJFA/#/ 0k!62u5Ҁpy7ZJMj#f]Gļh\1 zrv& sq`Ԫ])pynBS!AhſECt3q,&?N +Enf @'OrSRӐ+%Q0 am ƶȏsNrdaQ0Z'UucG~D~Ć=Dk]eJ=Rcg'ȍƈM̢κ{!('֎).B>202V j_ɱXϿ"IÙaMq(,.v P7=E>u`AO~naلPWP"'Ut:57O%/B(xPĸh ~+'CMQBV{$$>uq,83-goDOK(Qʽq䷎gЙU.i䗃^ 'BO&Zn/3t7~ZhF{Wl8ueٻπ#"k!!PmK ru9G-'.)F.tk٘樓yE%َ?^^ [ۺkXe7$X<3P*!נ6[em0_3Ri~) [IŔioپ%ͯCsؗi~Ei4gt]8 ̳zʑ_VqUqkN"** ~~~oRɼ\6Ȳᰃ/#/+k!6eF` Zv)EVt2T.#)m5TIq#6!LŃsѱ8ywPim3ܾr-a9bIVyCLQq g#_ Pq@bR3PXXHARs"WW$I }F_x2!^dmW#PF>`KU\(} [WE}~/266yKO0%jy*z2rDff#z}=}=YO @O\\;`=V6{&zu4rc |deVڦm[)tXwfU-7#:̬q?z>8j푖w>%" 7@CKś>%y,4nXmN5θq9aQPhPP9{p :/F8Zf~$N:NY& ;R0RȲvE~Fd+C#czd|I}ItY5F~5f*@<!PU$v CBZǭ5=;Ĵcq&3~T8JSI^uʁ ~v4\~:&mk߿cLFY~/Tc2@ȏO,h>W5ll@=ٚ8$(p_Gq{u~Nuf=0a0~$M~Ӯaѓ扐[L3r}퉰I|S ?,,ݕk需IiD> C~3m?P:]]i?.UOvM(F~?S#?jXo zO8"BDl1v ޟ1)ċlE6N-DDL>&mL,;nƙSH:]r 83Qϧ)}km'0Ä]6;?\%\Y &wMu46S1P Nt| ]6EQM?cb<#&z#jW # ޓ!RkTStVS0@*KXD!HVJ~_c1^'C&ұ"$Dޛ1ܟI%oIpNz ؽ2"2+8jfwړZ9[مv{H4VnDXmH#P $GIEO&ccǥ!F~?#&zR@&J.#'Y(ƒׅ-%өt3STG-]6rznqh#_mb -/# |2Zڒٞx)Ϩ fW~' з.CEa{#W w2{1b}F7Ex"x}E&bq:.D`j 2J.ޡ}/8#b</"ad޼$zTwqE8]ۤe? /µ{93Kp̱mxm0ۛoEUAdȯjvCGB6 [mGvDHջym`ɱ)z,wHx\;\'`ݡ7ۼb\GaLZ+yH 6&x[8r5I_t&p5/a\&Җ!"% 'IHZHDx~i9m I녜fKW V&vEoЙ RNB2RB뽁+ǃEn%*9XPӚjv1.M' SO-Ǵ.Üb`4CΦI 0O 8WF~?#_"8= cGp'|7,s͇p_7q-]xp7aX!&^ƞ`;;|Hǭw3l#0Jksx!dۇ"2IK~/>IxLTs VE^DB"h}ɤYnJ~Vxq@y:5јp= a7LP'4\0fW`s1Og4kBx* 6WGlf4 ivU}ȯjvCGB7 -?CedL oO"UO`4-Ic:7ΓBx<>B|)`~,DLYsH&\xC =)Wa2 +ޒWfcr2Bm&0Ҫ+x{F𞫜`#OtXG~qgKWSy:"?;< uôOa3{J k8L|uiLv7b)liؕ0sߑvP'n>xRɳGz1YUCGq~}~K6.:Y|1¼SL 8;oA]f` '#fch E%grY}/ &7en.7g#bJ&.0}Ӱ\^^,lk|*[Zsq~R/ cHP \9GN}3IݩX呇#w1R-&G`햨$`lxF q3jHH5G<$ǠqIB|(E}sz{>Q*dy) [7b5_&*@pM,". @TF ̇7SEZF&?)7 gX +z y+aJZ8,rrE`HbY2+rihg 6Ep#gYЦ |>¨2Ѓ eЙ,T7֠Hܘ mií+OLCgj"!XnIÜN(F,7 ܖExX"*{zZb9O"\a3[;r GXcF~?#&??<+=?C6ŠjX8ܠ5XIq̓QךOc{|31#{׵O_&*@p/m;)yk~3X ,q?VH'Oyk/YzdeTWա\pbZBe/1?]{'9<zЃ8xK{͌|rFhLhUH4_&@ȏw"1 }}oY9ɿ?t+ǼҿH_j<_w1{tCnKO›g~!PM~Uh]1b5f*@<Rcqzn{~##Uz&S0ߣ:f .<mUN\ vEOH$" ҥ]?^EFN q&<Ԭ_ه? ~b2@OT['@Q#toɶs7"rzVuxx [>VJ0} q@I*RLwS@Pť^0& c;`O!TҒޠv=?or(̏)а<@,XT"E(,,DAA!"EBJj:E/.)/BqI9|"ar !4O1L !5&!J(n Q=~^Gģ/ HʅX\Y+LaGi%Rdݰo#o>LgEq 4ٛdfCW@HbdicaPWUBCyX AZT*"2ꣁ%6\ip8 ԃu0c.$8O14cgmj~9ZP~[GjjP6k'oKګ"TTT}'.ETz(\l6*WWPiƪnt^Z0/UE[-4ec($zn B^; ƒP.AK)t0ZcE7nF.˚cF~|5C PmsBTTߋas]C@ ZaN*vL4/a=^KDZm$efwAq,(j`!JDɡ,\~+CϠ%r(wh/ۍ@Tb= {&C!Pm Xrr\wF+my؟|b2ڢvhlG|b?,R{_ em l(tdfd0/VشuۑP\a}%HȢxTUۈd8cj_$%[n\ paԫCPPv֐ɑ_XJ^駕_/1Φ l!6tSBMf:#NQ r  m TVLxP":g|vM~ޫP &?WF~/f\%͏ֳlylF+ 9Aȯ{W}zb5۶ovڷ횢LgEJ}LpfIIv. %EU\yMUٳION/\q([Bc~~>rrrhBF/OnfPd_PesB<{'%,ot +'?Ii~}d܇}\hCBN) q2{*c=f<8w%2ٓ[n ȯ|ֿ#F~0B'N*VPP\-8g `ge$y{nm }]E 8W̡5?s>qaQ䐒 7A[7q1m:_rE.@lOϒwf)QHsDҜb+$QSND(kisbjr7²HCa Oe>}83JA~.Bi*2RHFlF[@{^ƙk`E/gW}9b4K7{6D4/?} &Cs!PmHJ=L ''Gk =)"9p[iqx,[+\,fPrrJDvCR9IؿB2k.@,:ȩ7> }~out4VN.ФQ}(BSP*#{&5Ӂan0֬ dCK7 >>f:P 5sR/shgQ/o|[3p3)%"ފ{ pB)&y0/%עBobMLV^n>Q /2?G.ɟOq(. +3O 5bS|ފc)Lrm &̹Kǔ0؟o#o>!WaM2K}„bTF~Ն3!gm6֟F~?,1kkY F~t0aW}3bTj_qޗwb_q_'S{qe%8sd-_!9ӽ#_>v8rʫE:ňNɾ+nE8e9v9O!azb| M~E1С ^zw߱/cp\:JĬ+;g$xxv#LǑ^Pw~+(Íەhݾ'N.I 0T6H$|&>i & IDATj`cjल!Tps&p'111 Cxx$2r+ |)Br)Z ļgy2*u(խh#gn!KTlP?E<8-68xݷ rЯ< o$w;vƶ;+wi)|8 RSs5`|[M~(̄>0c>e'i0롹>:m+½1~@5k u? Szߜ5׃u|Ee\+EgP oCf {zJmL`oâ6sorc%v*R X X5hk`J*84 >:g`(jBa 1v.} !85zoLg4ė3LSK_ztEt=й - 3)Q:8acag1UzCC\sG+4n?w]8|8._4ra [\84MGS//պC-ÿAOwa[w-B{t졀VcӺ0bHX|@;: V1\r }oz/6ƨt/s?lNaܪrIIawOHwn%x.1 F)CJE;-r#tk?D8? 9 j:}OFKPZߢM0Y0o( V_ kϝxܜ 'NۛKMGOphױ3 E?Q(-J/m"\Ol8Ƈ9;PT=U7rnJώf$ S#"b}ex}\\8+=g;g(2Io@B23Qu5]NmX8R7 IBT u{:M^l\LYiETM ˭ UܟT6uk˰O <}4.O/laY0GaCt39{#g/ m5,# yut:ȥvN@5*P0^ChbvFŮY2{NހX}p7-9]r'l2?<'- WF{]<lBGmU< @i؂w. +~9Q-dRs%:wo`skH4_u}5_7K) ~4IИ_Y%[y&]߻f-ȡ}5ڋ@&bȾ@AnOu@Zv6n[/'_YQ1 PȤ?Ô)S0n8dR8%:E-!YG(/4nwE'Ehl,k]]/Nt4~ O¬ /8E6]Dj)WK)+h+}_aЌ0<: }zt3v]p5RoBGUvЗMGTL Yx7)Z<Mxq}wKY:YIqm #==6ӑKnMc~Tw'C Etp8RCq,7B:PIܻ~N ~6SY4+S7J pmPAF8/-Ų1覬mFC W6>!גd;~!sҝ'o 1VG2f!&3mj Nr\tU,0)u MXu<0eNxH/r/+z?~r/hc}(anZ=PUD- 쩀I 6R7x~rcAK~rÍ&Q QqIU_ͫx <$Y*'xxUr6eaNet_4| I{n _x ݜ>y vұa ({7|:+Avq'BB%[%FYb*`W՗hj .4\}G'6T'77lgդ ~Us2Q'Kë O];n=0睈O?Qv'Q2e 4 ~&-K%)גZՅ)01+` A:Na |F |4DIp~x7>(.yhl-iVh7B"6ɥo 0vej |hj%V/Cd]ӈZV?cf+6i$o0fgn |KDprv]pI$4qPR!tμ Zpk}2>,c@(Q+̈٪;cMFCkJF-+{kbb41'oPܶĢys`b2?ã'~}ծ>7`ђ%jfWv|cC| |S 3M0kr\vEpy K,L0;#[V!x]S06(B/+L&X|5nHx)mb09 B( m 05v`` 48]1eRc d(| ~0yTL2x<_[5a/aQ&p QDaWlٰ ztvO\2'^oH$'~_.Ax;Жlsm;TBQ7F\?wnÒsav12b|i1EVɢX:k$:vʃ`ZO[>~o"8]dbY_  eeŘ2a/: a}b i'1t: GC QN6XbƠ^~r+G@gGr,(\KcJg>bzpSt <9|)J"@;m/GVfrf H!;;Y Z ,jaͶ ~ͶiXR+ ss!EN?w0% [cج"~T@mD$Vbƺr@v#5\:2_<*# L _3B{ ({3]4)~Yk̯ ~a'MxtlqzA[UӰ$RK0r*q}!:(jDZ˖_KoaV֦@W5#Rw8θUL}+;gQI<~æTĢR0YW+.!#6:|6BYY C~?Ȍ\-L@GiE8"Zֿ mb!,R?۳:^ p$HH1DoSŗ_CJF6 yyy*[7DrYbD߮#r =J<"x:ݞnsNT5Мs)uvãP~ݾ ?]АBT-KqbbiE"$$$eLHnz떢_KiIVXzz v=! GxOnl,786:*3D š sS%Wo Y$m:֮^DlKߋ vlN)8~%aRG(FXl"RRQǕf(F\A^alAۯc~ u* ʳ* nM3hkê Cdx8эaTu6{`k-iqI=ѽnCp•`AԵ]{Vx~le`޶)/k&;b¬X:u6 d䵇aodt{f{Ae'wS`8L<j}0z $HUdZr벺F Rܿhs##+-ģ{Way&r:6+;073É3221 9rGq=DR$ʕ~^wau, >>Yq8UƱSp yonpf8.>2 p %yV(3)o^ OÿZ-SٮVWz.rREm9z.u'ZvS)Z)q 4JK0wLB69㚉]`-g 4?Pcr+$$Tٰg1JRh~MS S)`k YLS+-}h!j/YPO8ij4޾}Wz#`S^鉈l`kL*_lV(@72S`kZ 222\/H"7ԻdIqBLSwQ끶_/ʽ!++K;@aE7Eس3׼ee+UUN$?glp \z7n=DLFV ܹ+1ypO7q-ظ=Kio3ao}͵Z5635aEc Cz/'#&Z0p|Kmq G[⸅9iq23ؿohWjK؏}9GT@S^v8r}#G-IpąGpYLrS=a'8u܂OixDH38ȗ߲GA{*Oʒ\X#\AjGE}SQpCĦH zCℕ9XW Zox"R:}>HiF'#@JQ{Q 0}|b@S#f#8Gn^!* sAVmn&Ѕ!ؾ}}A0 |6b5g x"`2g@CEc0.=vUt13Lȍ%~8 ;ɓp?B;l]%EE7 Fj^sW-Z ŒK5\@FNbr_~ tPS' "vrDRt?:})ShuL0]D^C_(0:TEwU #&N"`LƄ 0aEl1q/8{a7hiaɛ{o`0)|Y O^ P'z/EݴAQy>?_wVvn_ ׹6[;#)5C* V|<{.'p$_ҨG/cHHL@ D0.C=ƽgtľJ \v/S ==$.(=!+$ 3GHc)mL*/zGo}\Q#h̓cbX5vD= _Ra 4>~]S;N]vZvIigTZR0@#U0kDeUԽR誤aE8X[1Ba*@UP{ ?{C*S[# _%9bg%j(MƩ!97=$33EyUX}l"wBO9p{7L/-L U'a((/S.MFnN ];K!/3QQHNIC~^\CIV[ߢqW(tc-F9(k#W$/B?qEH典nQ¾")=Y4M3VNӀ^TycbġmО'"Bjo nnd72Q`i)I&Mr%sEUٟP#c2_"n J0^02244iK7^y{10:mW<oL8S$/04ilٲdp6ao*7wn؁Ji{~71VOGkhWu)г:[_V.P= 7 պK\;gĦK.c8j &GG\S\9VAv=Sy)Povxb̛;s / 청9`ۺ8rم?Yt՜gv`yXzwAqŘ!Ḷͨ!|.*j.&zǾ"o Skz ~ ~j0{vg6и6uECEVHs9y!.&|rb<O ;+^C+B3DG kԛA\䘾Lـ7%Wx][M ,çHu ^Ԩ7_ `͚@ۀ7ēGVHph3mF˻Ttzs~kԛAQc3E˕dݽ {vqغ -IKe+rqɒ3_у8lq( ~~^ϽN qp^޵{ BfV;׾Sr"0.IRg ~F`l@1.&xܴډL4;@ GǮבEscH#n "h+%l0JU,ܼ~ȧs9}ۓ!=]240d!fcCcS8z=C^^Nk*EGWpIx/y~ٓ?{g6кmJ,`Th%쁐x'Nzp(ЌL4 Y KY.eL?K,BW4k {y/^kݝpEn|<?{L!G1ib=\׺d&ڟ@oO^E`"ʌÚi;p4F!&lp@]"]:c49&`⒟eȠ19_unc#HkaK>ie yЃ4c.,\#0߳CtMqv tN6Nꀑa򳱄V%h ;aX0kv4܆Z/ ÖG`~ŀ3r~KKԌHKxe6l!u& A@1~fD#摉}B>F x+ !%+^ wd0y]viJϏ(KgH #j],Xbvz2cG5bBpbZ6c1+RVI Vx 0+0A\c 4/XrK#8'bP֝4nV,U@r|occ$f<ĪFlf#`@XDE|\>itp:~nPĕPXn37[ o/ 8^0s'ÕTց}BUj<mѲvo~mfM32 I[&GP*v)<2B1o:MF`^a:aӢ i3hXyW<Kc~b//;V@VA}_PdGB^m0g!v م#p"Q&n9iWgRb$'#<9ع_|<^a۳ؓy{2gmڤ1mGL70i 5OsI`ocKaP2 !< b˼jQi Ao͡|)SWxpIǎճԻ8kob/X#;3sGy Bg0ke)~7LOMsJuIljsKU [,qU8xPh"WwlT]K۵= $0p4_iE-X $y11xi3K@m_LT84ufZ\ʅ30@GA ;7;;7+ܵpȥqh SWid?K~[0thA` ðxvP(; w@?`⅘3wF}up8C=0J~uzB{]b2?{Sc{Àq(Q=ޘ9M]C%y= y~u7HeZ1`66Cxy~Dt#zWǰG'gn-\W"g^pA|bRt=yA?R)?x~iiKf2\ v-¨hdereʙow* lCu<2'*kdt4DTFa#&%ERԸxBAPyui"J/)Fw'I; ,"K'] O)?Lxz!&.J"=%"N%d` n53huGr<*!϶$O.< 犯ǍuĒss'T\ݞiVƧ]EU+8V/#W*k9rd(8mLN}E\8E jԛy~GP(yf:3? 򻐤$n }$FۃրW4ʗtC :O^mMė§ Z $'%ݙ9Ji$E湅hL) 5 YOVVz*\D.=iubcaՍf b646G;DR{|DA(74)ّ6EAŖa۶6NN \ " Cԡ>iݩnOۮծ7f8$Á6}paMp}89WDbU^84:;yNT.'<>o7_30^7͓6әmfhrnY]dHQ6ExxW[i]S uSSz|\>$X3`0`6Rlfѷ:o)O c6P`ccc6l@0b5RIENDB`fotocx/images/make-waves1.png0000664000175000017500000010021215247006660015120 0ustar micomicoPNG  IHDRGetEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 234 278 1 0 '+:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:278 height:234|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:251 height:211|` IDATx}TV?cR! **(vwV;@nlx1x_Zk=5kg`yy9󹃓T^\PP=; ;O6Akzg HKKCrr2xGRRRSSEY~km/ֿ/lpd 116dmv븀϶Vrŵx0|I13z?6_[)YSـӚ!16o+|33kՂYZ羳y֔W[>Y?ngV1 -Yy3xxhCFZs`o̙V=c`en܁ 2 6͵́x9x [Xu/b-3#V΄ FO n> ~oNy:rѹNO"//G6-`m;{NEn dð4a H{ʢ5-1ؙ3 ٸϮkEo6XwfK9@g}`1O9΁07'7\BGwBoa + AAAj`AgJy3*H@HXa񟥀M)S'CcEFMT"Ips^{Iؽr$:_ǝ7\Vx m+ׂmo4&γGT`sZV4cۈɪ Lie9{/?C^,3mԥ , 60z@-Kxr2RVW\,0JR"40a3 R#qf-c3nAi(.)%W Zwd'zqƏi@S&CCC޽AǎA.-[>uwao?л%6w@rF)>5`ӅSxJ ұiV܍3VlBdr b{cٌQV(u1bbx#jvi@L\C_V* B}@NN!1- vO5"e^ 07 C?Lع]Ͽ`ENV2,F_A"X(2r쉅,DDŠq;8!#1V %iq= [;#5g53>o^ www0+[Xz5>YضY4yێ  ..{NNNPTT5?yEM92S2ԔUafVVWǛHG앵PH 6ׅ%R<{J6Ye @\I!0β+y89P! W#8) ~bk!~~(3BayGJEf9A=N uu(CVs2rxL!Ks:J==59HJICWW: *, eCkvBzeNAsXle?~Cqa0j*)HQ߅1hG' 玄 7ݣ67g,Lŕo\vfvgl.F9s`nncС?~VNH*)CqV;۽֙{G1Et Iyn,zn睘be L\EȇVXBUw >~JPеv;a^H#3 !" q8k1L fΆ1Y}E AaM'*PӸ y4ucLu aU/gF@ZXmKRR7ZO@ clCpZ2Xse ž}ca%A8tAX0?!7;W^oHLjO$1P\s;ϫkMkY|VܹsѥK7QQQ`^e7Up`'iqa;g-.\8l X~jPֵYo?"b *QV 8 {{8Ī}s8"BCYCS[ 'UUU(/uS ݁i9q`-FAF/C2 '/a{[RZEܹ*rWN49ERJ1d.%{s.8`{ր"\+O4u`B%$)v/ M%E(C__{m!ILYY Ov"a1sO %A8s+,+ѐUĠ8eb CLh@ FF5}W5=H_vUru &"i|4Rbd'fX6 Se-Ҩw),ܼ)4gBzk(V=0|ZDVͭ_|K.mصkWtoj7oRɍoj ~A4bƌêU(͛7#44 ,;=ଔK],z<5GVBGtIY-OGFB6 ]bh3w$\}s:ׁB[m|PSEXf * qYv:S]xӧOQKepY1J0謑L'oGm vD?UyZbP*^ #cá'rFP̰d Ǭ -Kw! eA<ˮ,{B}w#Xߏ=-K.}, a1Y$o*0C _rioܸu5y:t#gm 8XXL8䜝 YcV hBBBx#FÃb)SÇ?/s>ˁpfR v֥19]O/a&zvIMBVb(3A׮=0pJ<6Ę7CA`ojtқX8 Рh)q^*^Z`cx0ܼrNo!6 O)JV<,"oWQǼ[bJ+thAr4v_zbz1 Ci@;ix4"YwcI8_Dvňr߇~~=jAo?GE qx (ќ?bk.H!1;GRMm8b~ r sS@l\[7U+؀q޽a`oM 4acPP`иM8x>.Q(M0F4Φ79&ˆkS?a2~ "|5 ~07}u9rE1rJDgFr}AD솱4mN]@ZG^ Ug@#.de`8hnD|'a$I U2 EEyi ԕhF}&ބ!F踺M̨}*K7QYatXHesS0Bɫ,ĥ h*4 LԵO}Ӂ EMO= %G=mط LBKYB1sRnaY4cuԖYׂbcc[ݟXIaAW!o?'#859OiHLHD)=V{Je@͌$ !1m|O @݄E% *w".+NEN?_1-qوn΂H<#h]={BO r93@- /#|ãnw_Co08Owvf"]LJKC\M //NۦG/) ZͣU@ۘ7ރ!^߅Dim6<I])ܭ{Hv`bmMS\ں[d55nmm $´mv]Kk Ϝ Y5 6Yrɥu|[vv2kg&a2ꬭ]<מʢ6kbeew^x7Zzc}Yk2 6Կ7s{\m[fKge"ylrm}ٴ?Aj'7SXxVm^RNm:o=K6Gk@^+#v]Kۃ9SB7=ra1D}oX= T:CUoM۬+{΁~ߙ,SlZǾsϙXjSuwf`ڮ< v_\I۪ԭ-π\df3 ܒ[*f4nSz[3LԂ3dmp`݀Viϛbq`΁?ȃYÎ$79Aw$ y)bQLv"wp2t@-o={C;8p:tDޔWUe_8s7 :yМSϘ;vβ :yП;΁?p`A4g;3΁?p`AF}o9s`,Yo?9`IO5דvY"S~/Y?e̜V'^Ⲳ6_Q^[.8u Ymd}|a%̦G?ɣW|klLEyi ӂ 8`xA4c>)i᷽LvβSf_߾DQ&cH4mi8+GjATQ ¾҇e+ |'VQȭqH bBW^ZU ʏx C _1US}(-Uuǥ7F*wa}1}$WJi5p?5M-TQbۏe>%G⹳IJmp=}(+iTŽd{R/%pie sss ;d$հl3Jh5bXq9[ E!xFnV`ԙ)BqniϻAaL7*ȪS ,OYػv6SYQK`3r . C0|jXQb΃-)cbjZGap3jRܝzy`%g G\)usj,,,0r EyY ~,-\+a\d Ղ 8`O ŬٰQXf=V,A0J&'9 [E^"0<WFa~o޼FB'FI`/X]uIRPszz*-%她qDZ#₫W6H"K_vyª';yzPvIIst? '!S;;WM 6,&]@i pqRXƖ{(' ̙l yy8ִyص~z٫(yI0Rt[80"Cް's²PJE>t=Ica߉pqPtp/_]/?ZHw^Dia%^LRm`򬹘6e< %,}HFskd 8zo<PrI8KXTKѽ0fݛ*x9CIL6"<#E|azrWJ{a:F,(!e8Ē̫ě/>eϲHhAJ-Oc=qA_ڳёQu{7X }Ad6)sI!³/4707ǐPBn0[Y㍔_{&/dqQ!2Cp`YNB$yn+ث^o:@_AmG \^@t+F:F@)r&ݍlJY4k$rˑvw2PQQ4%$7sp(Y+e$Gx,]J'?c^Y9býa 'qJ/5KҌdˊ9MB2>dkQFϞp'^gV v:k\_aFmA|K2/y`S썇xQUlEYiE=_uU98o >5=epG`?DWoCB % Ѝ_ pkїTVIy+yBB\ BzARJݻuEg%/mn<@,rFqi vk JvR_;&<,K|tۂtGK`_1BcBb+Y^T`dHևw!o|;@h NQK!Y`uL11L#tA@D Za}!m$5ХX=K)KKCT 5f\'Cˑ-1jzĕ}P(̲7{av<.Gi1uQ4 gG1etѠkѝIaU^7*魰]SAAg!Jˉ6m}BҫT7 t /PT'2-&b5kzdU˴ޘ Ɨa '[-/4/ǝ +}~XQO=tY[ XLfK`rv!_o'&Νѩ3?΀ghbj{W[gwCFQ :^EIeU]`g:WOtԉd*1['<8X ^=!# bP4gzr_g(' ^78H#pmjZFL~EE qwn­7h"7&O {C?=>APL"<{u15!i)M=yˋ1MS> ԧ;Էjn&.‚[؟YOi &k7"4 ^2}d&E$ ;btw";8'k` Ń{EDF~a{f-=r(' 'oۇ={ኛ'>8%+DuFap> Fj )cKω$ wu2W>ݡo"?c{@CZ|*6JFCof+,E܄$Nqd&`?b#idcn MMGiA6.\ETFZ0614U`>l¼)64Ԕ@$"nvFSKgdToE9)XSx_Do)>lCm0lp3P\UgsR#JxeTXJC |SytOh  C1tX ,G3`fn m y$*uGQcm٥o ov@{b6`Dm"4;Q N6&nW({Č-˪R̶yxPy jbYTzp,3C ]L d30{poƀ)Q@1^¢2ԆBˉ&e;"0$qQ}j*fQJBaW+A} j4" SC .a!W!=4 w`DmS"?\۾ IDS$̉O$&lLޒk3Tr$.s%i1X+}䎝kf@۟0:Dd !i ]'Dak$OSy-=Z(w>ӷa-زm'vBTR/x7tW ]| j E~οg'C,go-[I;p"RdZYΝ8x'ª=Oj^`./i{hzTX*>i zvǵ<ą\e?cArC_Y N\&78S+7=cR,X0N$ziZ!X5ұk͵ B*0v1}~7Ņa5}-RKj_9 ]`.U7BǻeI{79=xJYI,݃SnNH|y>v2j\/~M4[<*NAu"raxQ7/H`_ycb݀Z`сD,멟i؃o ? ,194Udѹ0Xq)*6 h8ͫX9Dk`w|$לdji EiQtyg=(y?AcLds^Ɵ1ʿ&?Qg ًkg z{X3;erp=^T!/+kf'[CLm|F&،LTU8%1g`ϚPT|8WWƨ1c0l0a;=v ui0gUuKFS7![YvlDWª8x3+g!Tɴ$R_+Ozq8NDcP 6B^{}=&@7vVіxi) |‡}m?[{)e,qwxHh8" ߄[?SP}6$Oj0c>>{^J/BvQ8 =&>xIG}__1<{C>=`//,m#a6z>2cqm=N%"ڏ dc®AJD6W B(slb,@JSLPلx#m3a i(H) #< -bV:w0 ˮWvUچA*Xs, V'!0LFEd~ /PY)KUTr6WVơ>\CuP@trZ{E61y׋ Js%쫝H@I\CX4p*e) 2RC*; '#[7?W;ϓwP@strfâܷb7+QFk+p|/!"ן~]85B2fY-! (C !' 5EοW>DԦ-30Unձ{4O b}8}8V. ]-G%͏y#̒ga cB@,0s0UKm.bm^|C1"J@S$Qpx XN#8ŭ.FD=k;&ݰ֓:/59[Ҋ[ά -4a>;zi=.mA?D0~=TTQJp`,t0JG(_;i>yD'͌ O1o%_OSUZx󪊦Ҁ/*ɛ{Q@+*PWVDxSǷ1yX?(iuV%{|}hL 5f|Xw RfZeL#yVmM Yu2e߻tM /'GB cat($]KgBKC4[F&Q1{p]lr:G%98f)S񹊩77k9?,'Cd<,GZ]M֞4tOL9!z׽vP)>ʤgs`icH!# ;T'YdUQ,CEJU1hX,E(oXԕ_o ( F}ajlQJ߄3t:׈=c< 'N;3u*&^=E5d&Mss( _YQX ҄GD"'79ie:*b'iJwˢ9~08 )DB2Q֥3e am Y/;Qzc hA"l !Jnx%B|ap+ h +)jS&EdQ Ң8 ͂`ZW/1ݠ\xZ7hkm)ؿ 4:^-{G{.9b ;~ `ƭp/m-ˁmY6[*ρ{$9'{<2}Jh.ss*GKwY߿0ה;Z/ddƁ;zT|a˳9p`t128Ъ9+O&7us-o[,[z-lڷp;I;jwZ9mk9w@WVƩ-9w>|_ pedF퇎#1>#)6/Ŧmjm; RaB\nb8\%X(cHRZc!GrjO0J }GNēW~8ٻ׏8ca>bPLgaMl0^5l; GDνa0a2[c! 1gfD'K޽}~D6#Xz \XR?oE2Y> pϨ!(E|t3j8چH#YY`&"4Ӥ}s`6#)Yy􃊼kO,OXbfeEљOļcxﳫغrK{,wД@7I+*LO~C&ELZmz=!ĉB] &MQV>~6;i18u Ԕ䉶I=zBRNN^{)c򹘽x*$D)t-G#3r t-{;("Fo-z`P?Qª=ǐ-r]EqRx[#) &ZEN#H*N/P/^0 ǽk&Zܥd ƅb`$$WlTh4yB{`X=V f7mԈ|r˲ȥ|.II+I%DUN ;Js°n(Oc+^$e( wܦAo+[t0*W/sL5qqܽvi< &Ӓ ??錋}jTⓞxw Awq՛!>0@S =zI8B 6 |]j1zXa+2yd/F䏃pQBa8 c-9^5Pc(f?TbyQcKAHR 7Rr(",i n%kH SyیV>/~7AQR}ܿa&Zg:3tD5~!:R#ND@X=́IyW3ņsěSJ,x{쀑A;kR'bӒM'|8dɈȚ=TmCt&+c9 7uRvIkyqę>T}obMLlk 58EW_|^Tf؎%IC7r9E7 Td('vP=d'E` :$)%`yO0R˞aP&c3f,cx[<Ʋl;cٿiD)} xGE߿3iO_SFk50\F:󾼧d'q4uq2:&-|uEʊj2hxeLwBVe̱#IIXeSnLIfc +F(%׹e1gL_H 8n|_P=paybeqD -FzS6ˊd̝`> u:?r$D{ 9] `[0S4P "z,+ #G޹ܻ|=yn<;$#ClWMOFy{l]2 m2"Q+7!f0I|@e (&5u ~ɔZ:){S]753(tR {%/I偍s^zF07뇾FM0rŹ)xz't(k+{(?6KFѴL?Tk5w練{( tb# ^pӈغD))?om^cK2f8g(޽%_.>$J#g}n=l6O)#>exG&}U:/VIkϙ S'@L|<=k_LIBP8!*Ada >lFLK!@PTYY 6,0IizC2Ĵ+.D$K1ҚJDȐ"NnduZeW[;SK{,)?SL{A~oVޕ2lo( ͇([S @W>axnX!`~N]N6)S>r)yG/z}yFy(,.˯ǐ+Y#y2.UdZH2-︷݀FCF^ X:Gck;n|@Ơ3_ti >}*wnvXystPDr 2hqޤ 8v<.=\?/Ł{V[o{wA-^i^ϛo,@w%9w|Za^gzaZRo7n[zkGo_ۦ:;vmw[{{Z\BxRj5MT soboeo۸ÁÀNn֝ ւ{+<#56λ8q+tGjvG)K敻糗q^LmbG}'w}Ϻ e=sƉdw=[T@c>+5λ\_{.,2W+zl'ٍaQx렍(VFANR -KH{a#Ϭ#}2vsFCH@::035mGW8o/O{]%&  x2W4b J]As^v$fp/I!ޅ"^E["~oKpŻ_9BVzE8~><66[sfcƌ`9_BjfNܺlƲv8{v`9|ž†UpIW`Y,Z3WܐWS=k~F8=% -[x%xvP30k,ح\޴ڕ0ll~zc%ٴ.!6@U7&&t+m=vT[s3^Rh/-YCNWq%m; }uIDw^~0p.x%Xk\~Rz<.j2<ӗq]@N'V^ぴ8/;b/_-a j(%L4%^;5®[UG"2Ȱe.+BA] 6#Gv`hi`{(+-F# uAI 'O8;V ::\}{s`g֥0?o p||E ]-c|J NFk^ #EU Y넴C`3ܼ@}UmSwzYUМKE52} ϓ P%G^P7lck^/[@p8CKbqMfp@>Kj y`?6zcs"8R쒒bn(?v>|FTl0)EZB#I6y9H }Zl"j(JZmCn!' eD{ 9$ohN @]Yk">!#pӳP^)zCQށHLNFR|$܎, L::yX鸼c"zu&"ͳ7y.詿 ?.Y&5MtKi>~k؛=U@eY$È{ᚂ0XTVS~#`,/3U[\M`c 쫾k9)>e!=b:uRs9*Л|ҋd=c~b}8{#-`#Ї\Emֻjњ{E,Nm I%氓Kc(fU!2g3$E~6@@<$y@fV&C:Yf49>?;=ϒ:%9:|;>rEjxD$bd%kmB|&Ƌ}ZgkP gc=t{]u [ziM"6HAq.*u5u2_&8,^ǎOPRذҽ֪=Ƞ#+ˋEFyC2IH#GCRq(Uo^N MuZ~Xs䓽 v!Ϯ` JD Ib[ɯ9-kӞxJ28Cu<D$!dmM[00GRJ*2@zj{a'!Vҗen=栳I5ѣ\75Na]ٳ7nڵ+845;uYᚽу'u (_5gߞ`x.]8zh)0~ o",|$8؛]@ N=D@Y=OZAbqqݣ "1'aPmLWE׾rXN喐)S@uBZjU q7afL b1$gW"~ 쿿.?QiS C(3DQ~,V/NgACK96DoHj_OA[}[ Sc#\20Ap1$vya Ln!zG֮Ho6#) 7]~>Y^"/(o8ˁs7ytftaK6{G=)g?g<<쟳?uظxؿ&?6d{ ;{ck _ӇFyo{go>YyZToOj<t ?߿G[c2܏igvv嵐?F|[Z;;/ٿ> ^.2DI_<1ZS3Sly9*<={_<1ڂf9x;֜ < t&Hxyy;xhMk;K75|g'ʅ8_Ǚ W#9t8 t㾹%jgzGo/'ϐTQep[Wq~Ww[~s?re0Ʊ)}8xY9\ h0&Ápyj̀U] ت{(3W_TTU!'ϞGb%)xlt OՄ8M؄FQ,Sgc?{ KT *`LB* qtH(cgoΣ,4 ӆKCqDA@Qz#(Q&qy T ۆ ~^Rp+7;UX|կڇtJ;]ކa1s$OAUz&.ބФ,r^_:[\g-]<)Iqpzps'¡;QP]л; cwh Itb FN[ Snx!.9SBlXS(VTIgӫKb ::<%,q΁aHOOCTNUK]. ~6s?#6:>ȡynfE:z)K>I0֝~rp/˺J<{tc(H ^=zb󨬣ACU) idlƙul7nK ~GF+ͱvfDj~<޸Ruf֡_dZ˫/k9j&o$ X}`rg\\DS.jy˺\=$qigTPK^2W/哔5T+=A=h r;vCzxܵ!YZBf8f>+&O!`YqyP,uUBڐW`gײb]R{4nG8 z/_TΙ(<^ ]H+M =!ֽ.Ui?!_ K6C_'ƹM#7 ɽnKd$w@{0N&m<  Q^{/[!!W#MI4;e㉣^0~چdff %5!TCW-  T'#2{tŨx v$ٕh⋫I8]t-GPWv@zOfj4CjZjCҳrȾP:#v\ Ӈ5kFؙ/z.&Ҵ`˭gHt9 b{ߕ߫<ܾp<%#Qo϶`LHL>6ҴGNssKxIlvSwD|Z i GAm:g|7F_0rf& hhX5xpx85_V##5ϑur3r@LIAϰRCC 3+Э4Θ{͛:Y߆Pel>v!IG~n6OWF]G~qIs² 1e械l^0gwέh]Pg@m^ZAcIsaVS#(GSU:A5JȮG_2f2F~˯xcr<}ɪ>Wm޽0n2 ˏ,:kv+OS,X:{tvRwM*,HLS`)ˏz > CO0CJ;]A-I`{eUU2>pOA☿WdUK <;v[0cf,XRTɝ$' ՉZXv ϟc5aɸzd-d)c۰W ,<_ۻWYG&6\9I1 ͭQ^+A5ڍ~يS59v?nwgq&"i@K~f.;?x;O/l,,i =زmmWR֤:{b0bÆnZlܴOx45p17ĖMؤTuvrϭ%6l܌s!$-'<ÒC)0_mƺ{⚬q3X a&zoNڠע4/ c[3?x,SW[X߿ׯZ = IDAT*MUVZ܋(wIqϻod-$OUC]o[uX1W b}0id̝=͇Փwx;ո{d -%iH5ƴrt*2Xȷ`m-ʎSpm Ç6Hf}?xؿ>+mEj0MPd_`W L"#Ů/^G}j<v铣akmf*(7^.MFf޾FZ<_"6%Hw\_g|?kxIȝϝs n_Dw`o#}<|ہcےaNs $<<=>60E>h̄5`|ܑ be8XXss}<tHJ:_]4%V *?י ŅH!賲2Iͦ$o >JoYi<ܜP\X` n}Y/W, n|< KZ '+ $b;:z(-)&m&'Y<\p v 3cra b3u7F_:VLs ~y;(Ucy"u=:ǤY[]`{l .v/O};6:4cu4𰷨Ӟ߅#,N4P8o7:,2H5s,4 5dGP5r2ڄ Iy¬DXoصk'韆k@8h\:u|T<;!ʇI .djU3؃yH8 c.ïs G9 -9<}Hj3:wP[T8-͑@\#ѳ[Уny5~ v7B8A0d@ӏnLk⃠k-T0dô!%ٟ\kOcKT,pۘ0D s@.~=L{d䕠s22{셭7޶=y<1j$hϙ- u D'ođn珍V($>TvA B8k#1jt <TqC%|t_\ pHI##]NV: [o1Wk4dT BiOuJj|E# tʈh%cg/DDE!)1czB_)go뻎Ҳ7،{uFQCy`g%akk-Vt1XV {lpvOyS] O뻘9ysa"[ :#>'˘vC{&I :v&U Lʲ{Yϫv4 zCҵ7:G=-= 5 S1LVlZWMV(j%= ^X((K,Ѥ\zD/, YEt @ Mi8{([]k j%X>j*QB @ʦ(-@{ آ4wVk0Jm Ccw18srӭvF=u0V}2۠/ fha`]i0&k/^[S[ѳY} މT $ ֖bi8 (v:CКֶ+U"FE~q>RiΚ@Ǭ_@670X7zεˀ臥w!UI\v(cI-{QH`U X=w*#,-oBNf:<۰[5N!ֽ'>|ZgrpIdr٭|#b*PA/UaL(1k,JxrPO k<\VB{$"K5_!DjJ@AeY; YHIN@bB<pdj(0zc[jDZchgb]cAcdNJ5^eCCYjZzCTM3X0)h{l7o["ЋIz X{ Tp!k<> *RtSU^{CnO0 MCuU9"䑃pҙ:o]NPU #_]Bg~[0`w~z;}B"9{ס=go,;WBTT{neNsat{N$0,cd1n* P)~ތښPP ((zF$xE&| !zO__lY2CT0b*Oy9[7oRW׫օ6X>e_BA| ֭;ه/k{uF)`Zxxy3i]DLf!85YnyCLGB wˆ$;Q\TWbҟ 0/\-`!XbXH󺇹UpE2`1I`E/ϡ fg1Zi .xԄ6 W ^AΜN1kn9b8hB5ƚ eΫ nenS#( N2bzʄ4 vP3lEbU5#,9+(}œG@n:\P\!zNԆ/T2W&aqҭ/4̟ Ѹ@ȸ<+z 8Vn^\6b.m| +6C2ezuA@F4r]1T?zI+cƌ3)t 0sZns}`Cg?#^瘨 ?1 I, IZXtfQϚE Am٥{œbYT$yp3хXy5`;x6_'5M} X]qJ[sG(ov$On)i8\rD VE=gg 5a&` ܱt0 ՜ hT(N3Ч~;irBUYMZ4F)@iOY<w98[y&!> PwpI]2Fe-'pC/J1&oԧ|m#(ō렠<>4ؕvʟ(0} #娫T-Cv5LĀ7Ǭ2mv& V,628ssv=H{(/[JЎ7k:K!<7#q!+9/lx\C, qpCJM4v:Y, qȌ`r @1nx$tepw d8er**Ert溽NHe(/ho`vLX;Мoށ5>X?!/I650S`:--?4(uL%0Fȧҙa؅y(HMӗN-abl{1 x@ JRP\8g'Z9"\=R\6 $dL;(/ɾf3a0֜[jKq~KHWx';<{p$)X?sDq΁4rKo=iސV {Yvk{Iq,npF7U07c 2@ uO!ǔ$Hٳ ,iS1XA*c4`dbQ@ Gva٘dzɅ{]KP 1R>{}\h,KC IO7/.4Ҥ*{P^ߝΜ`zٓ^ͤ P\#8Z6[DT /ƢXxG2{U )k9J Gyr/ \Jhi2^׉i!JJ35֒^̣\υAYj58CY^q- VL`X8 %i \hbb7LQz}%uPڽGw9 Fawmى64(S ":,+i{A81Z;"p4}3lR,|φ{!J|nwk+Er56b=#%=읺:g;?E{z+* yO4qd;y$ZF'+ N}>D;dг8&/p>Oˡ`?FZH᱌k=o1ҋ8 wO:?T1qwg*ʊBFwAagљbl~@`? ?7? h \{!V@ƼBnSL3`/l`ϢbR% Ņ2/=GPBjinN6UJFi0\ĸVUI/M i): i酝Ytc./~{śOLS֎asў$)Ɏxrk+KShOsL_Rn.ptɊ gv}jMmrI8o>ޞiێJS[߻6-޹MCgn#Lp!6& ˞gi=4OS~@ge$;ڮ=mOM ,3S2*"Tnږۢ2V[ӞG>g#.6}bG Eޢ#w =n$EgE#.&1D MB6M;Z!3 J%݃HfTBѱW!Vp˖mgҝgFOLSGQ2dG~i-ށagWG<#;Y9 -bO &'ִ@i 誧40ol]һ(pFL;jf  Vl(?J~oQW,44ZmtVv ;k |%SFGI3^iص M|s[S&O(Wla@$<=2ӿ;2TPY.gۋMU#vX>O?'};ih^"~DV 2QIENDB`fotocx/images/map-click.jpg0000664000175000017500000031324115247006660014643 0ustar micomicoJFIFExifMM*JR(iZ0232*0100fotoxx-23.74: Crop: width:869 height:518| http://ns.adobe.com/xap/1.0/ 8 518 934 2 2 0 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((e" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?g5 j3n~4cwma4HFoR886n|_ -[vYrJH axa_Muc_!ٮdy?{$du/-肋WcjJ{ m8#<ۯ=-n Y8e;qN?Gj0:WPc5plPW71L _v𮱮mh$n& ǩ>$tK}eti~'9{iY,لʒeHR *xQxn$4Ҙ˶2Vv89?5' :4kOu k{ͅ\p}7Q&$W?ƏM|ICq0;M|IC_dz<zZkOu hğ0'ğ0' ?a6O?_ëlG&$W?Ƹ?ޏ?ސ&$W?ƏM|ICq kOu hğ0'ğ0' ?a6O?Q\?5' :4kOu k.v_d?5' :5yv_d?5' :5ykOu kJoŲ Z,7,f\'=F-iS468gցMad[j}N:0尵62HHN޹⾟F7HKq3|WϚֱkA߭t#G>bA=ƾ@u`d;?:qLasԃ83qޗXfG8m8ϯd" 3i FA {Rnav\*Һ4m>h(u @29mY^Ied '==r5- N&5+-!'ϡ=6ZʉaC,c%!=m.9Rm=Er:>yDi|O'Alj24R<r;dNp9BFb.v:e Yh I)qH: j^y*[8ǘr9@?wq^I״V_̖ [1 Olg21ȑmx\I{maZ<i,2 sɨ9I2;p=8ʝJ|>fe:\1bHJ?iWlP=+͵ ZYZx4a#PYFG$wOҭbn(eW 9oLdtZ'iؚT);'^ICn=t)V. GqgֱzKxhQ\gS1X9];yq*=;| J`zrNxsQ9Z.HxlV0S^H}o]Gt/qQ j񿈴o/Tw d;{Vn7w2jw(h^6o yOwkK{zciqWIR@ {RSapo/Y=hmg~}N_;_uIЄ.VnC:q]Ň?}w᫒ۣ*+㡮_~=K3FMAmigLrOSkO]ty MF>Ytך<5NP4?gvf0uo-'24nې<B`\yP|}$sѾiaI]CʛAF6m$ ͿrAGA+T%G0G+aT ۳>%$mJVW;5Kwm2Ju^*nȊҫe+Ђ;d,+#H2+0s܎VB.|>5VL;0QDO0➻vORXT3./b# %R:p?zqswsyn}zUW#:L"*H8=8O[D6xLlYCA+ڪn #v~T. "1:y2ml J ߯^i.m*8$fWDF!7ŒQ֛/=" ԐcqKEaF،gwBvI9Z p҂2yNXFRqPݶJf=,p;{}?iĘb ;H9zڄ}aj2G'luޱmSX@˒X$Wq)'MYȸUsteB><ȚmܦX v9QuU&vP ~|9,CVfNrǽRgp08֥O1L~'K9$$ifC9a9zJ#5Tp=)dw$R<# dcӜzn bmS qwk5G:؃ fۖ`2GFz}{KȢX 䁁7py=3eثv9RFۮ a$xj{y sH9Rycqӊߕ,?js3NpIsK+Z]^0Plp+@",{@9=(juV%Yvv~\u8*"X&&0AI9nAu c<j»#yJ$n cqŧnY8O&we@m F`:< 4m/,>^AǮxjCA <O_Jm/䑎;Ix=sZ>A֝A[$u"+.$]<21SK3VaEUQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|)c%dx"1$2yqN?ơkbͥ$L:м9g@y9v\<fbI?{`,u'ʀ9Yu~<Qb@l Q_Q!d_zN;u󗈴M2Dbo9PH :澋BC Wl&6\ wڞZu_xx~"0u̿@9P2G8pk{'d,IY.xcfAC!)cH$o PXdު}NM.xHbIb7` I !)4A8@!iٖy1m}o7ڕwps~>$T7׮x-ߘ: +;AׇuE#̅Vc`T2GbيȸU78YA=*jAruqd.\2knsl #9{cNZ=NJS[['n1 pNIiOy}ĩ^') nuZ7I2 ǘŁ.BHʷAY#B63xʒwhR|dljm̌Jqsr>\!=2?@j];!TRLg2Scxlr~G)F;ե[3e{%H} >S>Փ;hXj@-r::s[>TV_$28~Ϧ;7 }ѺX8 u㞆Ǚ{^X88ױےm K 6mG^+mBqg:To,PBĹ8 :Z|a$`Ѷ#\эJSVsuA9&-y:QSZlt]2`/D8遍8?79# 6 ,-FW`3#ZjFN)#V[s1u"3YA}&YYc0͜uczI?(k>h,"mcgy5I5ǒX@`0f8~44eqW7l~^3Sc0ʠ=ӗr9Qʃ;t5{F׬[j\wokI$qRopI0B]m08?Yd})cjX"9$Mxn Ҥ,BTR|ilw-FO#=lh7n*{@ߖqjA),/]Lߎ `c ] Hf cӏSښRmBžFl߹qߨTN~ҦRWьnVksKH#vېFA<QmdXnz\q" E @?ƫ,@3G$砪F0/m: I埐$@q5f:3HYKdmP0X|Ej|(BA?`p7:z[[(dvjDHګrſ;G3,qR;`.0sklE}I`l%Y|oILrTI8hҳt*hةpzz/H?{uU}&m<;mmdZzھ*tz Îw*Y`7dڌcc62p3={ ;[)"ӐW=pǧ\ti0@ۥ=yr{z ᙋ0H HgDxV 'P6+e7$0@@9'"n5[b99 ?>ccr# LO2ƞZc<Ú\$2~A,,aX՝W|B-t@Qc[ 0 ϷZIF G5^{ >yrq"*carxG#Ҳu e[uxR_ $J.OS~E*\63A1NJ|*@d=ꍕĚ/soA 1BA$DR!:  m.UTQy#~xb0>C9R+ޑ+"faN1ߧWG\{l1*燒2Yv2w3EPHQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE$M?km>7}zW_AqEIH'iw:+|ɷ\w{E$If?JNP˸TiPqg@N? 5de];2pP1r{u1N7Yj6o;:?^<yrAOw<sH.*Wfv8'rFx5 ^lPĬdt$y֒Vfmp)~Wz~li_7Aɞi$+v^) ;sm!n2iڗKo1 <)<y^lt˱[ݙ&NB{g"\{CRգˊi9^]G'ĚωPVj휜;Wq Ǹ^LȐ+:2I+ׯ=8?X/t1ȣQuiLrSv@= % C6x'?w煘4="p,I&@`r= O&-Ŭ2\Y77S9bzp-5srhv)lG]5Eb /׷Sw}Gtjڭ,L-\[hWu٬= Ru%yU>);^Lcm\h1ק=5$aa0FW;v9jH@DRp@g1ު uUxbmGEb4'L1WUiqzsPFu iTqG'+t4p!#*OV5;EclR8VR96dW$+du8ɥLGm7#C.X,s&R?oQQpbc{EDK<~U8$c8fFGqI!$tB5+wܲ \`0{cZ?m*(<8'5"HrNvO1:>}GJ+l[wdG#n$*F\~$49$RON AUpr@8ڡ"4X$DT@OaۭIȳ$opu`r2pďֲyX++QU&  3DEY*TmՅcvkMC|~=9e&%W} Q "$~^36=NO5vaEnVЙ8{jpGP%S ɂr*#p Jͫ2Zv2n, ^mҪJ02g#1,Jc,2a;حV.Q۾;"HKLjOAr6s3/G~lǩNC 3YͶ +6FB9JI4O`:)w=6qa ÷F 8jVt%rی`m%IxNx,cxDL B>8H?O~3JY2͌v jކ4\ "󦹎5fe$1zc>Y_-%K.rN#qɪsEUƳ ϧ$am,ʹJSvн0c9چo>"&0y 1$o*YM3ZE+4y ~Ao;X`zb5[:< Yy%pFI3Vh(p1t,ؕR 9Hob͒dee*yg{p}/ @vXf-cDh+Jnx'$nAm;r;H Ӑ>aP0֤z ~F)fhf뜜b1i f5gI(Ϯ+R Im X/0q/\HG|V7`HI-` H}%Iᾚm3npp2TqןS7:<{d=k评O$9~*';2ڙq#YB"،qߑA9-@:QY\\C%՜SuJ#!@ 3R;x_zag5VYnH^4W0etl9'IKW&7OrDi㿽YP28cڱ;"%o6@2t5* kq=Ws#UJ~n:]p]70R*,c͓ n815id" ?wo]#1W*?/R.Ucȗ_|槖̛$:w2Y|*pNs۱#,]-QdDc rfzsMUx' E0xANnc4+tr9PwsϧQBZFQc8zzq?r7u}~7NG&}QXvFҽ3z3s3ӐGبRp8 p<+tV%UB`qOįսc|Ԥ:"IDw$(f1̏āIżdR]C/=AN="J90k)lg/Um;ƞ "C>-Nݤ<QTC՞#0@ ׀"ټ^YjCb^w:M W^?ږ_#UKgmͬ9#do r<8Fo>ZjoY⡋H?$,O>s'+ Ƌ[hbbReUUC}Np1U 2ꗾj$ } SH:㞧_x65&[7AglB zH!xAVZJs/Nڞ*Maʨy6qgnz}zm4 T(fT`'"cA#Vr,OgM%C$K\Ti4R{XMm@yY Nҩs^Ɵ>Iy{z|UbH5s5-;%WUGQOjbS5n넼~Zo, #Rg9$=GPB٤ pxqϽKuN7 άo7O|Hy1=hybBN:g53Fr =5+;Jo'<4~%xIXgweu,a9 } i Gr1?\|&ycTmK%#$~T…]]Gcia}NvvɐO8eتY#,Iį 6|X \mKjyo0JpA 83kf6{.]מ5ِ! & rp8,XS6:cM٥>Tg;'(ݴd Xpuxǵp/<Ǽ姟~a&@e9a$ݧA9{8W^ᄑ4BY *ach9<Gs>$Wc>UҁqA0H}SH$`hL)#wK@*29dHHG|>o~0`CªNΘ:T|Nʭ|drE㎸8Ҫ+[:؏l1. |)7U}PpN?2;mmB)߷Zέ'9$Rupg]r_Vo"53gsW [Y?kx/_+7Uqq\?-ok%f( E+ EAwQpA5\85_Vo"qG_Vo"Z JQp;(Z JQ [Y.qW [Y?kx/_+7E8kx/_+7G-ok%f(q\?-ok%f( E+ EAwVSxa[tvqҷQEQEQEQEQEQEQE $N"C)"B> w?sU4-#:Dʉ⡙rr`R$J-3}䙌Ju?RY$s5Gk(]38Q8 ͬ=+79)F3qq_P$޿޿?ZZ]*a2H^003w%I8gZgZMQDqg#92##۹q׿=ni9eQb@;AYqg7IGin r'9[u0yT.yOzӖ?:=NwcU6DH/9njuvWi:mmeY̐1^s.QN!n$J@V3WZ",g9<W5݇c5{i@@u>\u 'Ki BY[89 vS5FB6)#p=99kq(VO Z M {cSIVն/,v,Ŏ䌞qǹ5 6w `Fܒː8ϹJd)&,N@U4/0bqA*3}*i;_+)V9f;Yr2qy#׌R`տo9䁂8r?:\ȸ0-;z+h'9Z|cfyX䬄'sӥVhc;҄.c8O Bꣷ=s횖5߉ryCz-ІyIn{?^+#n )9?ԚԾ^y Ӝg5 v t@$`sZeuR;vZ$8}4]KPoy#Ry;BNyִ{T+~s|%ս'FM ̲+,.elq'=Fq"2< ,aNO^Au[DU;c략5#' Dw Th9qn]bv:KKS qQ3'VdrncNOJCV׉MƸ4DƱPQ#ӓWiZt(g JRE*UHR7{qsߚⴹhѧJ[o5#QX~6?_9 sOz֭3m_ |ddd$NBLlgB1N4g>Y꼶\[V 08<ڙZXz<zh2x_K/&~]\<z<zKxt/-_?ﹿ;?-O෉21}xS׿,8?ޏ?޽HtI?O7sЗ/b?M?7`z)t?h_7Ey_Lw警%8;#'/8qP>[-7V7/+=@d(݆኎sZ^OJ^vba>Դ ~Q,֋g-)4F $ 6`}EXtu Rf}EQ cH(~k࿊Q\,wO)<׎M"RFѮ\J/X_YOgckf-t2edr3ʐ<Ժwo㸆Y-DOVf g PNFFOI'țd\c u1ΔS>,KJ;}l`G_? \i1i^ ds&mHT m1ݑ'43KdI~yHpǁrMl›hcS!K&T:Km͙yJú-]xoF]cM;dhXeU~$$_q Yz=ڤil*m̑lFǦ+@|r4Ńd\9θϥ+{/ >nf;~NE; 2 ?v2jHn,吝VO5+gva[hj0kHHaT#:3# @Fr|=Goų2[zs#? mtm>9dIMCs2`cR<48R rO>:> P&A Z20]n >c%C9-ұ5e_]Mp-nMLaT s9bA gŻi[npGfO>, IL LA>&yG^ C}7t15,s{VҬYnVT( :M4A *G@a_T#mt{WɵOH>(mT$4qOaqodsʜO-\1#=015"H,7.knet@9x*@"@r;QLK] ff)XA9$`cL AEgcx++N[;FYXߦA'puR"؄=INjHj;ԐY3QMGk`K"ݠ/ 0>u犞{x'kuaq_|Ux3צK6ލ: J l,U7*Lz㿭B yeU'q|2yx9LG_|U55Fc RQs C8'񩫖IauaG~%Nhc/UYfG֚DMԊ97Ȥg8vVf)*@<0#"بy^( 2}OjvLl4!bx=S+R9 Y\=Oc4"5o3Ls)0fQ֜K6qvR&Q"?*3k> V{Y]օsQ*s ERqЎO +{Bi=BWKC-G|A}GQa8dڤdPq"$rrkЖ3{źG ~a]Rp+Js2[;FOcçVS̷DFS9@x'#4Ͼ-[фH8m7SS'4{]5tk;E&4+zg۷:t< kZtzKIw0xA0>=+[Wk>p!"8x8N/,^Eh(~R?aMw1N7F˵דYihY\Osֳ|c[Zr?g67zepeV9>'%TFў?#5;^ia3_(A[J+-4:}IfJJ:2cO8-C$RXqvTY-Ķʗ}}GnO-'Jlsg43籶TQowmuhWts0<c _WZ(4H ݿ2@*6G'^_oOlBrt[2Vq%n9*0?1L"}Fjw ;L+rW #"׈H<4,PZz`yVvf Y^$j=-jTK`xEO6.X,N[u٧{@OEċj]lT8\'+ǒWѯI$!0n>v( e\}SV52_ǐC>^&=GkI"e+@,3j]5+$UXmDquW!# 0@O@Oq@p:xQZKS4bIJ02pzO{wuc{]^u-*!#.1]OoҀ[B`I}ZPdC7'kmq{bIkPK3-& zfC*%x apy ]<2ͨ%Vm%weXw#̫ B,`r0zr7 d)%d&7s Tg9-?Ɠ'y4o __g)63S# N7'y4d6?ƀE7-<4qJZ)2~FOohhmo7@ E&[y?oҀNߧѹߥ-.)lj2ohآRoҀߥ?j .i7G?ohߍ[y.Oohhm?ͿO'y4d6?ƀLߧѓ<Z)2~FOohhm?ͿO'y4d6?ƀLߧѓ<Z)2~FOohhm?ͿO'y4d6?ƀLߧѓ<ҿօgi9̹t֍(EPEPEPEPEPEPҌ ]hԃ;HpWc={ZvR+nkm F4ā?y3 ´Bl#?/VfvO\m401ZJ 2E'Fd\I"6ӎ9`Ԓ!|׷~BO3ǯ9ҋZrݖ 6+{ר8K;G?:ٲ Rrn؝y?jiZ^\ o>\F^{mYf!I=x-JZ]2HS߯P\eYa! :枀a,ܻcHնO1K)=N*喯ub0wLj9Ms02Pet.zzgbS<҈h\1l9$tO=1Ob_5+ON>cz$ rͦk^; yY B8G$を6 hB"` myd$gpIyE2 NIT ֧Leˑ\Pw-䐀`BWB3~G#J试*:kXJIg^jK7&01Ubs9<;/"F:*F9`AorpjҽPQը-zT-wC)VR?1VS|||Cll/=5X$̶̇ }v}Mu\]C=f)ZHG#lBq}FEa 5Wƺ!E{zTEjbFR@9f ֲ9r4ۂ9#rY[tP26>9xE Q`=}k9+]4-,'r}3]?:eݝdhI b]נpŽ|h:?,xczW9ka$ ?Ry=q+/Pе]:L$>Qgj`|7OIrH p1^k/Ӵa{m$)#,p9䕜ByqIF&M1i`X-oR#F1J 6~\7NnCZ_3n(>za9O-pqGFR P8\]-ݭ䳛p&tPvX&Ny#ҴNq=vNV%d ňn:pΆmkm[mr`EL}ѼCAprn Si:uzjCcy-Mrv/v8 |UagZL5ՒL.߽`0HrF@䋲Gգ>:\lpxd·ͅ;a l+e[#Yd)cc7"ʜḦ _j.iKg}[Ep|8#Qr#f"!i[3o'd@An*ms#Ih"f&vIb'^ !`Kt5k^3֭/Z.^nք9XBۓ,NV>"jw6מ{6{Ss yOPX##8mC:fU#zT~Ljki4ԲҢ2\+JdzY^8y,o Ų4jP*c ,8C5IwBWGTr9eBFy$zEvu ?W =BiKh7'$]~"F%6;;M$@ډd\][bwvr, H3Hс]y䮡зŸytQ~EDYd*g,A&fq_ٟoZϊk,+e{,y"dF 1#9'?x}gek&&,bOp<;fqsME|O @Z\Xݙ^[/GόrNHO]kַa{c <;\+aFFA oMBAr" * ͖^~b1N[!26iu%Iq/1FV` @:&Ծd61|,XeXfbT`@=)ux}a~ -@c،GRWrps膒FIx&?wA[+*2Ŝ ?ѲcVV}'h 0 h٤kU`U+}.u3.i|>^xG!AbqY|_4:ෲTI%P˴7R R6䞸uİ5̩YJ,d|ah,^aE/nSH&!@<n[ң]8%&иV*C6v8nOަ] %-)mRq+om15WI\ >c;,@S濩𦫨iv3[C;Enѓ.[mSIP҈n5T8ĥ$rJ F q!_R-~ln4b/Apc/$pSwO0kiu F=>k~ȥQ,=sڵ[tI'3+1'´,ἊCm,r?^*o-fpsW '|9Y0$נ2Z M8gH0@yIkd;47E98ssҦH,5+}$wGl]Oc3&!2 NtJ $e^v2r`|;ur3ٹ]] F -InA9 9֣vB&#ڪ\ =+PoX4I)Lj8{VRc*9Tbcvҧ;}ktK*?j2D(x=?2I^N$+2@'Y͑Sˌj檖 Mhb2I9x $+#ߏ8 ,`lATr8+jT\fU+(hu{mg wq+t_ZEn΁!6 o`O!b  On3`tb'EaA,FX'qkwB1sfO =I~1dL}GJǶts,L?']OΒj+ۜ+ Дv6^2766v}Szn.5exYHeW2|ۛOPREqm-,@G(@FuZ:B>Y9$ydl 3U/ Iw*:SKs@_b< ?IQvM+O- 7aKA#<`գclZ0%6?3؁j8_00#çn©T]bDim~RI#8*WRw9Fܥ䡂pzLyLq5Bdg'*ɯM`R[(yq.Mm;<[KPHY^7)݌s+ilr^K(d|#aI`3=B]?!z{ҕ52GLg5Zu+jj)ܔ۽+3ŲM)ˎx z42E-ERw1QAG͞pj!Gzƫ#b9ҢkCxTj3 6V3̑_$I'հ.ѣ_>ppqf JO.[MqxŌ*Haqk|yxNc}ym3rQ2$.$ P~Qsf3B*zg}:6&J,uݑgI݆؋ᵊ8/ge=h'(ι[t, HKfV=0N.$>PRv< ޼~լ1ISy$$'i'_5-mt{C"FLHv䪎q xr>?֠kt$qm"P97GDsn pBEr3mŔs^Ga#=#G FMVl#񤫧r.m. [6ۋrVk?:_j88w.d?þ#ֵ}ܥl%uy _,VUf3 7n=)]_7U}/XM"[k{*G~DSIap$p u?u BgydP +2u$f9JƑwFfCt"t6*3ߴM 8;GK~ mǧhSV#0y߼Jd$&Xn =*G.M˷*` )pv+xfR5k !gVjf`s܌s:Zy49ka?wtQg8FsI|Et q&>H1GZ=Xo[xR.RŚ;o '  ] Ei-EվU"ҟL cn$n7q}(h=@A҅!1#=avYE'4&73Lm| |gK:,hە)q)V,ZmwyWWYo[jq+OP_3sکHNI|Q0jeŭڇuٓ>L1.)L6@bOb~ Pzcʢf/ݎ6`OSik-S9e6WrIxȦHCda\8q'vV?wvO5v8o#? CD0'{Ab-45w0j' BX n2HxƱeJ[,23_/p%rGI?ˊqnTWRmWuffP›@NON^+sڦ{[7TQKI - t˪auMqoGiq<L.y~_["ݭ#(7 8̀cI`܄W!GX<6oۣȪ,k";1, x]ė+`v@?v1˟EOI7/4źhHJ]PY>Y%Ɍ;9۸`Cqs!?.Y3u.Y|`GrͷVdpO_zIOҾM7WTdk+ =kτ ${_TO`: Ƿ? <ߑ$0\T,g$?0=J q֡MI ᲴO.P#UFIJ>}{/JP !eTuX3 KwH u^1]ieIxU$.=~?#Kv]9FsJ0FOBN7nLkCl4m.6GWU# JzztQOy,g ~l;眝rmsXzvvYE OQ8䏛뾖s(]GrHLXUV-H0` ZTUYҤtG)QE22D+O zң\`?CY\ 8QdR<6m3Ï2:`YyrLP.~z~mv.$%,eμѸ2G& ? +!wߝC dp@޷JK$qv =z>yR=:lɟ\@1ݖ,SFLWOumZ35K3d6I#%(6֯)`dK=PcSVm4vBt9Fq{>6rK)N2*u9"Mq“x赥x%@UݵNGOo]sGu,[se?a,B${8nz )C޵2 ZY^DqpytqmR~'U$pqAkGIM o܎R31ڦ0bS C c~o5KzZ&neFڈR})rǚG%:QR٫X'_'ÚC=z&:PHݸ8.Kȭ9|]lb1d1~fQ-M!NI۴_2ykt׋5&h8nOZܲXTQL X)3G^BI @?Dc#~mLq"c溢.du0ݜ 1Nqf״-?+Ĝ9ƕ;+HvL˩<6fRw:yn$H\J 3fi+$FX~\r˭pkj\\afc!|u?q3H} zWax58ӤSv*;weiMJ9,`c稫 㛃)Z3KX]1R3LOw=!Oꮔcxmm]gVu]HКR!p{n8+R+jgImY_.;*^1lGB--V[72sʳ RN7Hr[{i6 װ ffTU%+qz׌|F\(k{kt{y3^u\lK3%'<裌Gס6pcx;׉7u?[jcUx٭؅i=z ]i_"Ay}9>=7fVM2é#J4)λ^`A}s^1ϭi&mn>==k4g:$w-J>h.L7eO>}{w_tBMYrO1v1U'{J= WOrd#$1Ѹgc?2.Ec>D{sYޠ[6-u-ߒs:Z09 9JI݆DgW-T50=C?sJt4.Ui^_1Ay8SYP58jbk-Wi ¹bdw8X{k$h\ٚxǜx?s1Vjl RX9+zgvn(n{#f=S//wpsB:Yɘ.Z9H n8 {KSXZ譀OʧOh(EPEPEPEPEPEPZlmj3A,PHv*ݱO>]y*oTŽ gJ3EuB88!xu^Nm> )u9ᕦHnݝ3(#\sd,dcPJM@AQfG8{]X0F8bQg׮}O5?!k4wA,RLɴ>a= DL1tb|XuYK׆,Ҽq $l;G'1=AY1nb̠=0qӽORM%>XKDe$>s?t'#k<3ȿe)۝r:3_CiP$L|\¤NN-P"%pr8G\[h{^!SVi/3Zmd)x8 } wZ/McO硖ٿS&WÚV:|Ȯ7WGe>d/e'?ZV^3J_utmRw6w#n}3}x5m{2u|q':h#Ud@~֡;)b@Ē<+۸O] p!$c?Q5t48vVgI[Q">K#9;gڷZݥVa('R\7Y\Jurj=[m:. ,s֊7O;GY|H `x0r#_Nw_ t;7y8p8t}>;Mci }CJMh-j ۛӮxZ)o1۞Z~2_ȳx&L$J9=OD},R]N.;ƞ.1t?SǧWQ0ONAM7k%4o#=;N gi?C ,ܛ^q-ч?zztkOs'vqǭt_W~![2 dݒ9k,E.*抱p.mO/z>FU=;I2D2sJ*\m~[45Quv5 (/o5c !T@b{w(.Y^/#iap#E$O#tF/;G-̎MTgj[K5V<~[J{DNIb^9)Ź{{M2YBB#JәkB|\ĀQj0+`9$`{qg0[ySQ.&vrI䃎#jH#mR][]:BJm˜n :v>pEcrU;Ichfwwq c97(ϧ:)8F3=3W5- ,V/o-lH5'c4ѷʠrkc侷"Oyp[\AlMGVp]]1[^} mSג܂ٝmܤy?Z&ehBGߓj`EV%wk@ĀG"q 8iiIbm7e~b22^5+4[ "c8F_/4c{y8z=R͡? i~\20:t=81 ŵQWw#?w#zbkm|(r@ ?_+4ylp6POHcTؘ$%^f-,l[ O/iߞ+F)Kxb2Gӿ7E1OQsh\>#t,V&cÎ[u6466 U?x\[QQ,ˍ$ը㹷b]"H#C$y85bGgUhI!2Udݛ;}? ?&{7%;H}ꦡSKͷp9izU_qj+r1)'?^n<V xø$ ykz|]֗hHvG;V|ɻ%bqٙzY);xqHn:ů^ܪb@+ '޺+ŨX_1A#=SPE!92Bs쏭|=G?fw 1aMD{ +[4iZTiZMQE(((((("<5ss+&v'$zwaIw ;>THȈ#@4V>M3&'AҾrnsdu(% |&@9W? Kӿjڎ6%AʲUN)y ~U-q]V.sIE ( d `:Tt&I,0{_z<q&?=n2 ,gִҢ sёoRsWUUP)QҹjbRqlutY.U$r}Ur)8 ?PqǶEhjфܣO8Yfw ޛF.G\̜5N& FHOd:RnSJ| u`ϚUl/p8 ѯ79vR1qI댌t bLTY(.dR8OLv9,^=.cc׏Ξf2 n!p3L+WOGArs2O?ʼ[ž-QWIlɜpG|.ȢX87 cڸ/᜶&R81_S*:|Z3鲿PDy֣8GOwv>Esw"Xʻһ+;8t|HU-}PX ]8|h՜9TƯaIZZm3ua~VE=AsZ^jcNW~GPG''rcރt!sA?ebXZ^>"kG{xcƹP *H\=j֓ ]O2Wz*kӴo>%ũAbaX T|Ҙg>eXg؛xc&]󪰁^&pHQnvFws#nd`}h ] ~[I욨qe?j܇ m<tpkA= ϶ڍ;vih IGoAvdxg w~2F8q_TcVJu*Trc^?{WődBWf3JCPvk9&I jqbL(73~UoCgX_%kuXsVXh-kstZ; Hw^k-lyaQ\@JķZM4Eu]֕wӖC'1c+<}@ ' v^ǜIc倖8})?"#N'>l}FHO]Q$b駩_1 eoλ9ˮϠke](%yՅ~2.g3^<WîXIg,">`^j ֧qMݲa3z+ M9Q6Qv͈EG!Y~5=a㸷ig#dc+WRXb=Z<weo`UzV44"yBk ,j6銣-MFOzKRli/\Sdr?*I+#M73\M5;lYmp"-L,Y8=ZVuq4,mq$yPr p,i($Sm8&?Z>1eG9XG|Asb7ˏoWIjk#HMV<%s_*䧾ӷ~p9Cn~jgH&VY$LnG-:Jk*}gey`$qʣ8<נiVZc\?/I{(I yb3o9j*H%, |Bl0A=A[D6N>l jφಷ2/͵y ]ijn#se%:Mf $jD~-(zbQC8ݸv>EmN}m ۢm]s3Nt[6geëB۝VNKc rZa--zurX Bv܇)#KC?eoڇf{`Տ-;qa>Ut䲂ᴀɶH3JOϜnPIG,n;ʳ=qC,̯"t) xb4,Qgh /?/䍑!>r:gC[kpKT"E{T,`0\޷u'b>8X20B|| J2zus$ !M8F<2He7 %wg=+ӒT^M/-mHl:HHi N@9B-5|w rh٣o6w ە*7uqHܗ:d ;Eyc5e i@E O>=k/.3B 8̀]dtVzN{|&I3AO)L$naUD;qS:Jv3#0@Z}ݽ֭o(/- u 9I|?=\K+K/e?y$q=>MM>(]9 ! `xEJ7B/$K>`nQӚORp}XvnP$W2pHIoebԘddVttbKi+UFy<<1Qeq@ۧ1dan[7^FCE6~t- Ljô4Q#.d-}@Wx$v;2i͡i1Ǧn3.G3j89orXˇg A@W-b;cz;]R1b &AXZiǵ-FYf݃69GjcGi_M*[]L )1\ |_;>8u]^]GKaW&l2}y: ?ߘxip隬"y-&;8 }Ә|CVmxc 3}30? l,{/ Ϟ~㔟|3>ZWjZ6IrJt] U۶E2;mB]NӒe(Y+$HđԔ'֋_3>zQ _ߘx_5Ț;)g-xSgdCq2GhifXkMi(V~M! %Z/9G/ Ϟ~vr[Ξȿ(ɓkqIll"Mi s-_*x'x\,fសcrWQ-tU%Vs xUmK;f/曧TH#gXawmSPAv=XQ?yxg|IЖ [QN+̧*8994-M[Q( *^rEH u9^K]G&" WlckIb$nH5ܬ ?NJ̎52dPC=pztU8*T>Hq_?Η9[/+C;"}p 3+zJT:9 <Oғ{9/yߺ͂rL7,08A?oZ1\9WQ\U= 5Xo-Ƴ'# ARVa5X6OEO(BR{ٯkz~s70۬b O9U.90'$98c5&&12qq/raTHޜNFzRM0qפ-l@`Kc#=iFHon0ő VI sGOLWPT'<{95VmmFc+{ǽZխoD 8&n ퟘ׿Or[uKo)hcnp?/hxoU17m&;OA=QV <\454fwH=mNR>E\3w[d7O& !l;}+[4Sko~\=8'¾鯅ZчiQEQEQER撊:J^hIh(RJ^Ԕ )E%R@ GSK R? PIR>i-k4`F^N=OZnk]x--)[ cs0I튱/XYyF]P=Ou0!`OpzP9VYWH".@A`\jVZ#G$1 2q^?aZ- Yi2<JڈzemZ)嬚L@f7N1Z6bW6(G^G̬U<\zW}i:~%h٘Yx2`Uþ1“;V6bQffIZYC{ҝ\[6vw ׊eY>"]k8l ^K9VmMe*T$O:} |"Ei%FB'rszv6V6ޟ [KSLdBG\, ?POZWZW!?fwv.6MZ[*q_p2@ ?- \]Ja:L_WYZX7Pxn #9W>b;r8G6m"ݔ3Dd9' 眏6FO4w!YǙHUH-GS׽.zK3+1L׫^aqqu])maYeVH#MYn4ewϹ%-|xpxRX.9? lUoټQ0]]۰zNC?.ⵑe.cݐdjb(;78 mCsEcmoIiLhO%\!IV<c 9.p?m$ű,žŞq3sMwhu{_"ɦ4l8eg0#=+JkLJ]Ohl@<ۆ=hh'gSiM>9aa 9&Ǝ( l?$}ܞ}z/HM[Ov'P\*wky{>J4vToL'$`('ӤhxEy$1}*De`PapS ZkHZ?5nXY7v'Lr89Ϲ,ӥ[K2NF c$qNx <=sg4w[c P0Y+/oc*#haw0<,*ƙy{kt?.Ԥ#=8VVTzֳ1E2'&s?\J; tJ'^;!?|,`8ws9\[KͲ'2V!*eKX^5} #8'm:S,bȦ[s[N ug2GVk.*w0I'yd8RQ dY' i(%n5<6F@ǜnBSqf-ktybG珠>Xm[IP'~1=5:o;Q8nb<Qjң2 pIq9UG(()#{l^M`Aw*DZ=FCrCX3/\ITVvJbfpœN,iE,-3 1G^^ჲ+P%K۸Y\<˥pTSN9=z)3F_D$W8n_J|xhUV FGޜ(n{AV+B$@, rT׿^!+evM8r9*A8x'R.Te wBNcK=:R u"mcO ,y`8S)d2ci/Gak,+6 qmectYCdz/l,5֏2L䈀3qM ;*FhMmhMHq UMCL:?g3VI{f p95|g !,1HE`p=1_fR((((QK) /)s@4v'zZA֗&I.i TQ K(Q>@-R "-=$ĭ2! ? R}d, 8j;@"/\+lfKPM@\y[b!pO+k\ >Y1=m: !F?/?tTIP]P|iJVDzE*EX;)0gT_ȧQ"q+ѼL??Q.S(E0Z~T*qtWb$OG"1d&#+#:2p!)~V8G4{@8+Hcn?Gȣ)]ד #Lq v8J+y̍]?LO'֥N:V5O)[$Ò <=2 Yv)eR(bv33sяcE4R'D \/89$ s8&O3C$Jqힹ8FCZffSvHLö~u+i]j!hw5i E/MޜsV* C _܎iuLWrR+g-27o#[4ٷ9#Tm-/#VeG%NK+ 6=ܓG& DP.؜ A=ɬn>Yu( n`E R6AT~f>EWlf.DgQ@,zZ+3I,d>8jdQKX q$ '}k˛Y3ѰB;}io54b<;W 9hZ?A~ NU [l pH#ȫK/;ukcM`0p\7yMæ&`KcztKv"y+NGVAotQEQE88_A446"UCO dր:z+kX٤*n+sՇ;Xۄiq,a9EtT.5.,!qy nIJN= \ vne:݇HcFc9SN8i>R( .(K\׏+O]i7R F$_`@zn 3-o L&oHc+y6TpGN 1Adqޢ5{{ o.~RG8pt3L)12Y DΞ2ci.5,sdV¤gڏJ?iv{$6#)|´?"ҼMy 93M*$="I1pO9q^@Ӌ G lovxUR1apIPs#Zz(rV,Gmƍ0`CԌS'vSDd63I؃%G(֒o^No r$g+]j Ft670n{VdwfhN쬓6$I-O:S~QO#0ZϛlKKG>cƯ*?d3[]'P}>fm4)Ia;dS9q:tŨo#yV#X DZI]4g~85O [x"qI%ȃ1ܪ+C<^PϴtUDTQ(8=F$iD8c3PǍ}I,&%$4jsqdɛ A ĨPWgKm;-8k"{gb̀K[$$NOk+$7l\Ș_7HX3 xibmCP͑ .J< H5_B]K{a-]`3Gl  >"{a57s?#=eck%X*STŚz`ocl-B7*bUSJ98< znXGn5"6[M$(@ c]yoy4V,.wvne܄@CеV6o᳴d_xbEmӨ_r`bsӰn٪^Hc-m t˸Y+S3  K`$̲ϱP2^=ϓ)\1+OrOtprF#F]ۏA Yo뚚x-ԺD =geR̔di˫hSO[yf{u2<[RNg nGLM^Grf=|lɮNд:daRk}A}GCQz~xCp64 ,,~b2V"z(41躔ZFZƏ ܊4Lr9AݺVYbFj~ Fdv_n''X](׼#d>˦[Zv3~%V0'ot楹_m|66PWnbb*PzB]j/-n56k9LW)vpIX`yQv$2y i"w+-e[O`rD nP$ӵVB(˸ctV^?:PLAIZ\'Rw*/88Nـ,/ V}jt' FP=B:ԎFzt֩;J{GPjic3ErFrʫ'9^)aN¹xM3`gi?֨n˜&3 K2d}{{>pV\cVAwi'4rՖi1 USs ?z$ui|=qM!9dԩ$dri؞bVgSASA-q4npHȫ#Mm/fR1ܛ6?zs{׆D$fp<❺M3Vj{qo%3+V gzwѭ_5ҟ Kӿjڏsb+ ( ("Ұ1>I`OS1t:=Ҵ"+Ipz}+ Շ!uob."~wی=%Cu(pzI1£!Frsǿcs֣:mD#݄;i۽qSrD:edk鎞\we ',n%U&=i?1O\oVc&KEWAQEQEQEQEǍdÑЎiQ&C&~5Cr+xgW+9cnzլF5WIR\m5EilpOsq"4@'4N?w6A$ЩqeQ*7A\'K%-Ŵ l6sھиޮ{OxVkeys Fvᛌ>em1c;[{jMkw#qzv=2Z%ŤFրI$!* $񎦦úmΜK`]Z"ŷPķמZW t̨EY#+HcYž8tM%c_> 1):8o|Þ*"n6߲ 9jė ?ТK-Ii-Ma-mS%ĄX>٤&@ѡ .Cp8os⵿ }ƲߕVlg Uh#5'x*A_IuS\*iFy>Up=g^/4߈hJL< &xǿJI6=ҭnCs9 E,d \QssOkkouiZ6ITav01N|_vqT9#'=xq֔槧=|.-6zSkvMZ\f?(_ms8U,EӦOm, V EhB29>sx3M:==zUvKayS >Rz|aRa3/80t80A <1FDFTmې8S:zHFᗷyBPerOvjw#۷GEt!m&)핒$SI $02y<~EƇ#~ű_nz}c隫.l+>M-nħ3ӼOo}%ŴvQҳͦ^-dže{'c $ 4τvkg ҩ9$ xγhFWigG+GR Ф{&q]AC}ޭOuoy{ae-ͮLIg#O%bWH 2FrM;oǔsϦ1RN.FZnN淒 +3n,F$O&m;JJ1xIQQp/PHYӮmIs$,\^P<ǿ$g=KozgY2 z7Զ"hm/1NӫFs6q*o,¢)$jzeAOF"%{Թj^_Y#-Lvf1zµUpAPpU cxC eDfQ~wF FB񎱨z[y)Eu`29¹|AE9Ϝe\;~ԛAzyuҨ]\yZ@ OjClrڵl#rSI=OR6ӕ5"^\DIF>ԅca`V18>Y 2>"?$LF=Mk`Gq#zbl2(Vױ!@Y<njh:*(Pz gL~ٔ +6IQ7 FMK^c0d [Kg ?I2Unќ~uԾRrg$FJЎ43Os^r bp:V/aWp0H87\=Hep?x\Ze,9ޣJw ۏ86K=pҜ=@JnSu7Η 'L>&GtۺdxhsDv)(Hh'~8qA{ NcQ‚LM\xllp:ƭY511bHn({6lɹXgWUwֳMe9Oք"h̍֋*cJd֓i;O %H~YT#͟B. .ژF~:m2lA-N }۩3w ) ژsڋ ii6qX b1z<3O@ԐHE!Ef/E(MǑ>_"Ep!@ň=N]/{PHtR`h7H#p"ZUm yr}ϧPk)RӔ+_%F|Yͧ_gt'0>~UgokZhx騢8((Tm`T3s~Ux~51K!AJqv4Mܟjxeyׂ^ٔS?URq֗ n/L?2+?k*3sg7GOWv{w5Q[EPEPEPEPEPY'gVI:?:zM5'#h5('q;YE8'=Z&KUK+i.@.3`g'`µ.XQIn86\9*|–YnhvK;K(mƖ-$nxb( 1{ņaM%2B1޸b'=NQ|c[)ݬ~QJąy/KFL){WJ8VTmcsӸqګ`_Sc.Cמqt-T^Yfw^ 1?ιMWF+)?h$ A}auf[k QzWdkiS:+ _f 8|<\%z!ËOv8sՆEoߥ')f4Gcxf :e[˩6$G %ZŬ*MAvYuxvi[!ޏ38rw&-a4T-8 :sWmz{VTBaQ$Ez] E⽻/b!p+nWTmlxdO/11+?hUzB}sSXSI n dߧ5qtZƳmg'tJ%|nujA c>Z!Xs^ Dm1+N!҂()J|c+%AF1X~;Z46[wNp"NI#޹4%Kx,m/rܖOjþci/IcFIß~nchض\b~;XĒR[ V3$\d]:zoD?6p~ qעe4r 6\H 8ysK 70"'U@#2OI*5ޡV!FݬdTU9F _2lI-hHq?* |]rOש.lEqj-8~$i^ }#Y،Gх|/+ǘFl[~_ U=}aU[Snͮg5a/쩙J<#] %gߍEW^9hϮZYvSRoLˏn~^*}ڭ6X# :EQXM9ڎ}:J eS9zbZ7 JVT"EhFV}F*r@P[OU-E;7:[ȍVLnPukռ3@l?2i=IN1"5K^\2 [q㹯ȗ_U}+D;֭hlWtQEuEPL1Ÿ֟E!&8JQQ  'nk4U=>Xq t٢Z^46 >c|NƅgFF8*zV-'/P7:]Lg'gKP qy70GfIcw' ALv|pߚ'x4j+p$2:ºoHhAf-$ĩOW# j8.e7('l\Sb)m&EU[e219==jz}:;{R,+ [? ٯB]nQ9}j&*%qoHԌ$ܙ{^!@u<랢 VTiK0dq^nZa$eK>yɬWJ,J:~Fkۧiss_Bj4"JY #k #7ƺ~au9Qd:g I{rZrJnGjpy`U* OhCTMyϧ^64nLyu"o⻛tyLXv -[f^VKe!Rz}? 7c"Z* + h$x3◉.%#&UdF<EjS۽=FOoZ>{z[tq9):sm Vr9u#<3^F#/cxWWLSddF6 pF~7Ŀ \4WڲLcp\=e 9w&mu+:DZtԝU=zӼeQ-jg#2'Cڬhnc8xDtmery|{q+SžLijۅ0"HR|ШFЫ)+Iףvlm8l6}qҹ/<3qyr;(E%G%I=n|/o&vI$hĖ;J7&_FWW{H=݅zlxx`G#P*%8 z]x ZiG23e.qrW'%{׭Xh7riշV$i I.@Vsx-k#E dq#Lnt>)׬+rHs* R~өuc[LSџbi&uV;B)AǯCvphgQb۰*ۚFE:Քddo,8¯=?z ,dl1QZB;ZIX,ysQ(F[6d+q"P&Uc@^]GN!-u i\Eaj_1ޥQi+ɭs -j]I:9vKs_ҐʻBRt+Xե-'_ CsLWOW>lF#Nj/J{]Ԁ)u^!Yڞ}q Ff#  !Vd#Zщ.($iX}ZPaQ80nb"/#4tEC2*x!HrA 'EPX_/IV?0/iG±bA񌚭$|EITrLEϭW*yZ_3Ԝv1X5#NO\t4FN zG#y6䞴 RIHOJM)k욖0`ǦtΜgne{m<[i:͝]@!OBA=+߾ȗ_ż$EoR3ȗ_E{.':j(N((U:z7jZ("X"=Fyh ( ( ( (KsarZ9KF&;Y\-ӨCХ‚6Fm׵,`F_L3ҩ:]2Gʹ fH*HR7|ZD'WSiS>c<ɞ@j6t]Jpn=mϡ=/2.'~`]C(O$HHAFЏjrrX㞿ʳN_W$VZ %˟@Z`W:3ŜsS-yu>u𮂚K#19y 8Pi>uK-#ȚI>DNZopwq0?t'XO琿@OaxZLՖXt0\Z Sp<~go{R%;s =>.cǺ@ $ݖ6IڼUQ[_A{ g }6e4l֖LF @~JΤ9Ձh|kT[K}8vOBk_"ZNko D13Ni|Q6qs萱?;?bBɏy)<hpo4d1H'$G٭ȫ!GyYF-PY\rZsk0E| >o>͜:Ɨsazt*Hczm?Mo4qE8yP64 C1ҾC~RB0m` TN*{1q<W:V7IYK:{fj\\HʎDHϷlZs93'rW*PM-CmAej3|vD?:@l!8?}m-[x@xZXM3湴P^"2:!Kv1e9bZDZ[@q( 4L>kKb=SM;'fxDPZ@7Ǵwܞ p\z֕oX3|Z*Av%+BMO$yckхetyu φ/ *T "X"ywλ 8N}qk-[@v(_ΠLC$V6!,('>~WB0ƪV>`LPY {~{[@8h"XNٮADD=W)U%.£Ǐkmyܙ/bƤBpgf `;״,0aA~+e葓j]kS\ilQGl'w\S h^M8Im\Mf:R0q]@Ubkuy}f;EUx 9Y]@o6Ҁѳrs3Z퀒{2hypUsr5klifˮ\}E 3+5 5]R@k!oݜzs]r {uFWvܘ>С\0Zͼu){Ixy?J;m|@NF#ҶaTE ҳnE#:Uǀt#i ˃t5n1Ȧ4#c&E:h?bͫm֕~ ֬# F1W>lrH_Tҭ/PT2G$Gi mV#NeWSb* 7 ds?z7⿏HG/>^ 7R^gtHyR7"4+OQ5dvrvui >cRfZGQ^EU/- ח>?kku_t9}:xEHX5Kaζ}LC_hE(D 91"l*I'sOZ+6a AG;uZB݉ZWu3 ENjwJ T+rO~$WnrpI|x4ۈ㹊b2O\L~ mqN{fkIvcb%s08)'!Y['לdtPdr确ng{m+Y.IL1?^ߝNtRyee휊*>aQ-]q=O^_d.&';WZbCuĉӮ;v1ro|}y_%i#͉TN9zr攩+|KO^U֣q,q0Pg#IWT^DK![Aq{֮'sC&W/ Iɧ,ܳ)Y?}QEQ@Q@Q@Q@Q@Q@(y(hP3@ K)(IEQEQEQE|cGЮ2#q*B,L *OJαԮl/)9"W@8nj_i# `Z֮cK)ΰM#AO-SPpwO90;Tg$n Bi\<Ւ44k3Kq 6?Gx*zUIK{1 ]o[HG qG8U-vctJ!Pq_"3L-fX-#.W 0szznDEi#pMmo9PHa;_onvWI zyJtH *2򢎼J&@vֹMLvdD2d G^5xD4ǜ\1d|= c***{Q#ԔM `wFy^18s=0yEþҥŒ`'5Ћ+i4mT`1wY_^.mpѯ `ŷr:taNjF̓Gp.%1b2;1$n^O$Z6(Ͷ8khvdWWybGʓ6{s=#hwfHvzz5 -#U>`'jg- MF; 2"ʥ ,㌜}kIteh啀dD [iu;}CusVєWRfdSx-i|R,t>שxh$72^n$! 885Ri:<_SQ^5 ? _C$p-IːAvqr1֑\Z30@8>Ik_ZA6J ģ9,Z<3mZge2#9] }M9t81zuo&yN2&IYH3g׊匕j#[37Mc=n0@jZ3Zٹ!Mn\ұ=mʵ1`:q]gĪ8IdQ7Ofr$8_ 4xv2$TilDSS35Y bI#oiגx=YC֍0aGL-QQ:ˍs5':ՅrV09ae{uGGGj:`T 6ˮ$9Z\XqӚXIqCֶr.*k[[Wb ]'T2dT5TSc$TҐgΥQܥV,< a@ǵ@f(2e!N\sڔ]qɥi Еei>(3+Hk)M9h;Y ESƴ2[X!,ow {b'AJxXj}5E9QﭔcZԂMfT}.m B+Z3`U>ȗ_O/8ReHbc U;WNX?{=kG9)tT&C#l%8œXVsFT"9I~OH9ݺF'PW%Cse42(o)ep3M}J|"v2O3#As.eܯdK@x=q?D@ʱYrHVx*9 =u,2q:Ӹz o+*P9>ݚrB4/厕ً` 9'Q@R`׬>ޙ\pz:u$ i[Fȭs*!Gr `LI@zaOך{7]8tf@$`duǰ+ovuG lRH` #NQNBw,!ή^Fs"Fhlrs:Ҡ {BwW8"HVǡk²d )4LInROn>Zz2Z%=hܴc!enTi^~:aGjm5;uTtҺkcǶ;Wu~֟ Z9=3V5(loJ2Im"ZH/%l3Ey<~9*-a )V?Q\Q0+3֋م2}MƳd?Ns2ԭ:⳴HG B c IkƖzD^i7dD9qJϩ\͞!G[t#Woivn*G_Ư}NAi) Mf^[t2J r{K%B3#[j-OV߮izwYmnv'׃_HW±O}CQEQEQEQEQEQEQERPh)>PEPEPE (G5Ԧ+u4e*ONuFOm.=:i ):p@*]h:0s4nYA#}wi6m7r3S:}hHHPF=⟦'ڲ)yݽ=JiVQnL֍eRV8߿Zq6x2&U]nm*EUن{uqEo[M\1S#|pZ݆E2^{d.s9fm. ab`cb}i tzK.= N:iKcB2A֣hl~uxwޤzݤH6.2x# Z8 8uQ^,˒<)B2dæ+Y7*AkX.D0䷙Қ+dlҷNҾsT9,*1ݳJ2v{թ\Xd8)G~>kDE qP`G犫b[ΤN;J>0sVJ&+LѿZz 2G_jvס]f<*A\YE&zԺHj"N;ʚcNʂvq*H,NT {zE>eDJyQSP6qO&S#dV C}'˖huɠKKV`/N{mk Tg\n2MiCܺGmd,T{)kWkcge+ehn,yJovWxE3M+m** Nzg}ixdhR8Be?Hzk:uA;%!II#*n]lד;}.kgqsXIDeC7Ȁ-댑 џ]^H.Pd\.I8`ǒ@玔-q[mखRBCnx~<ZVv9&' Q\xE0v3V s@:sCfl #B|O#zSsp0Ah[‚8=8䐠M 2P 8[VJ$n"$;HXu:shTbTŶϮ:tuEMFtZBLQdN $$ޢ|W9 K[y*ckvR@>^Tg>õTjr(lS8fCdrIy>ըywvҴjBPq51"GؒJSvf$yp2zO{oYڨ|wX+;˓p:"Z~}lifK ?'EVf޾ϧץhfb[FOS†bHUױ3Z^Tyя:Nܧ5_pݽq $:fM3X]C&a~*𽷊O#xo*-́ܩ!!Rxв}riiK D\]P 9 tSi$k"]D *3ԎF}+˼SD4o7"= E6Tˑ$N1zZNJ^Ѷ}vvi7]e0\g dP Z*궋w[^Z*[$BA ÂrU5K5m>'nK\g+hJ.y!HW3e981ҧ(Mgu?B򪼘Aםk~ oՖ BjLH*qI 1zH񫩑1A:SOm^/Jaoj6po, y8"NBpaKd>`9y$;PDLAȪFpI䎸 Wk\mo׵VYV䲽tiHq7> Zswu-9,,˄0v33IFlЈG,x-PKGR2acYð&0}clxn~Z,%BEvkc5QEX_ٛb.۴5|͠o\dq^a?׮k-f(. Eq1drYܩFzjIW*[iiC^F|or[xc–XS~ewy%[jX?9FFˑ?Ւ7iYp$gz^[~/-;Ƴo=Cdu&@T8b A / xGRRgT0L1v Ԝ`@ϕ-.fIehNU i~_Ύ;P:j5k{m>9y,ݛR8F>٦yffy31$'t\\jv!mc9)k>eK5mV RPf9?JlZ F9Qس#^}?0K6mBy,?'۽eOb<2^zUXcY|A'NOGVeHV ۜ <י:5W,nweȋ Yxxm?YO~0 {3߽cJ|HwD= `A=)׺.ꚕkoi)̃*NTVmВo'IR0p:QcU9sos2KsY&G7-Veryc;_Z$іME 6qۿ~VKSMA[v|V7;&n쮸0Mt>I" I4geh2ONpk*ӌ^9.-.0VRߦ*ZyO +=G5{SM;Qkw3A2R8$ )>CHe';zk&sd }?[#dd>o5_Kiq^mmO'pFg'nu&O#-촋שּׂL1RAk3J 4b+jY2yJu]W?ΒѮ% #06p?Ҵ[LkIC)"޲y.#<_ dgJvCt4t  Uez1X_Vo$R+κ]Z!@On%܇#;8Qp ?J]NhpYr8^ Pm[{8=?umCgNn sNKՔҹ7X'ާzz*<́\ D#^8 Ƿj᮵O-67'i[t8azRCw;{cPb6܌`=OJ5İ\6 ?1Vwq}h&Q"SA~52[t{ (y;V hRI~'g]vbGk|390 !HIAKJeItpqs$L&9%d&"W+m\ 85 \\ ׌g^^Gi " b z3 Yї.q'Ԋ,rضaeT7'%^?7M|]J.N@$ס M,u*9 Ҵ}"=/w4nPy>b~[%,#Rd !ێ^oΥ> ( ?\RL.2T'A:2*!b928^%a $?Ȋ7 ۳,>aB?+/T7;}Gum%Y*nڧc <@ꭵJռK#p2zۿ .A9m%/A1ߜpO\sE˅7=#\ vb-%kAJy?$p3@<:k/_M}[[W°m4Wm.uiq-rJbY=X 5QAfdku *MX[η\Y%:$}+ΝXS3I&yglgҾƅCkӮTmF Ye#(q#22' r?"C^kZ& 2 IbNWkH#_WhT0XQ#A9 CL,{m4 ǵKMR q6ts!kzsmwڪw{ :{UJ jH1L5ݯ_M fQ(O37uۭKctjm$șHNA2c,Рv#ۀN)ׂ-ufR5?5BòգtLY%1 8@.h)-u%'T$iD1PlT1o,מ Hx*.X +}rxI+kSG=dl8U򣑙z*0; ʻy.e[E[4y#(*|H4#ͼ@æm66=O8ňcrtk^&XlM(edW?7*FF:pk5i76wz7X\GFAEU '4f:E&Co.s;$a؟0 @fB_}{h6n-m#E\F=%TJ紭?peMź;Cf9W 1;_lJյ{V?8"&xw%l$mljbOA"`z*'|?m<^(^f۸ng;Og5L{Z槬ZMm8-F6ttev[a}wilcn+/2/:snxlu}R uXF>DBpc$XiI?*ZK0rǒ8Զڥ"+{G sߊkz.O3J$\9+WoCdNVD~2N<Ϩ^^i\0>$q0Jg?yoΌ3맷nRī,!8I=qwe=J%mJYٛ GǨd8IN{tG6͝gEY]ĝ䍗, j''*(idn™V5&B9{ m2߇Z+G;#:۫~b%=U,ȗP$8sW5m6[U!*rz:zPj$6בAۅCe6yJQm4Ł `3":Զmƒ01Ny73ck =d{1[n9n!Kj#Q+&6Rb 2&ROjZѫ|93J{M|(AF\L*j:wX. ^ͶKgmsDcVvi*ee8^qK]M,I⻟4},|j!][`Ĝ],>17enK @" yQA\E;?Z|I[Bj@# 1dkXBcUF7u9kvEhVdV%Mрn<{VЩ>dɧgn9zV՘7#5a_t^"K9XqVDorX|8Lsg35́z`W wcIN>n{gGpY`GN*95u`w-\]6T ys{WEnBz,+$S)n-& PrIO2DQ@U }q^s^FvrO\ܗ$Ȣ8#'2_"A(d/_vnguE,rO8(8#Z9sά~NsKtK9 x ! q]ca\##Vp2D+5]"%tтY629T#򣕂g% V?L5\FRz֩2LG"\ OГʱ?գa44B ?3zs:jtx,bJb8?R($q{3fY];n({YT eǶ?(V-볤/,02ݴpS֯:o,0i$`qJ4<WfJu'=1lI }KQmho,yɻ㑞}YG3إGqYNOvZ3|=˰ [NdIA񞾹k߃¿thm.33񎴘ΰ#\9~?Zkt;r'Gp2\=G '֕4P%(Ėcb0r@%y±J{2o)rb}x#G  >X_ܝ3nTǂ>lcq[6#ywa@+WD Ѻp"\,"o6IDU <i$v.qzqޒztŰF+ҹQ Y;$=\ "Qޘ] 䐂 T@)f0IA$(1C`fN5ghH9ޥ) }AmfRʤ^#zϽkmwv=I#ڪ+q}s } 3<ȑƄe'CK`ٱs 1+8-}U>%[3k2\ŵd_(H$1)=@ SL  9#SRz$q xԜqO(@G=[^ F62s O]E%aaG\;()v&I(;HIoz)2^PɄE|H`j(d$/lb߇7}Nr"لV lgǮ=ߤ>afk/cGotKX d'5'݌rsJtzi(LS&3Mdmc'sϥ{?- ^!cu vnNzuՃn1o#?:Ⅻ>ffq @9#=/HYYmq`zi-Fg`$`s9k;}..K% ڲfI _30qxåduH`yYcH'AHAݎ&%H~㓟ֵnuXb9 <{@{dtЦ2RVHLQՁ1(Ҍ8ϭrڜ_ir^9"(G}{ԭr3:l:RHq &u$hşRwzǭp7^:C` w= 㞕/5TƮ+>ZźC"tE|I>bj*Cnbx0۱:Yxc㧭M=\;0*0Qc{4`ʰ@0xZ 8혘a]/V+9<@!hkwSkwExf @-9TW?wO4؋2WJsǭqpMĨnVqtJ_RLJB1HS+|p+& YFrfg\.Kt:eN.c0fvA ]KF1hn.%H\=p1ZКT[*quqc\ۨR+!Eۀ?k2xH,PRn8ԁ^~a(hkFJ2s䕍IS8ϥfIK!Im;럥SUZS璻z?w5-~ V"Ƭ1G"'N(l5y{9y(GŎ:g* 5eis:C'$$qsXZݩC;.QٹB+庄Gf?(efy' nv8nC.󀲬k6,2 ]VK0Umۊ+tPG&XrB!c;rON+=GJB0N5ZSCCc7r Ԓs^˪\>%g90s:.  ~Z)h` FNscVc(O@wpK9>Z0e aʨZK+$ ,czzmRgٴAw|RAJ {T;LgY&hJ\|?.I7fH8?׋h0jKHdO޺ՠ*K R98NZ E;WAN1)#\8XX uګf HCnߡS佌HnQVց\gEiv.I QXVzx C+=?j2L%b0sT.Qv-;Ң5Q̉ڥĪ~9 EBc=b4E9&Eq(TFHbG98hPQwHJg# Oϵ;W []!%Fֹ9*x+ڽ*rMMYaIg+R2p^9 rw<[RVECBq\ ߚUvW8lϴSIoZԲi 'w9UƩxv’,l`@A楋K"!yaX[< Gt}{-#9(>5ɽ[@1c vֻO-Oʐ[ Z&$o.!Ps/ac vgĠ#xHtՑy*@^ Yv\Oj)WE ʜ~cI8b1qr611QYwqK!ڪ;ק]|-í2HDLwH?÷3 O3Ey T 8kꯄV"D̈& zt#y|íXUV~~j_%0A v(Uazq'ڹV%,NFj8S!Hq{gH ֥F̘2)Fdu$qATbղo gg##֔ (NBAz}j*I$sDe-qߜ0*]%Fe## ŹuYOh,,\d\H${iQھeZl6]7 qY o +P r hIgz}=ꚭxer Jgqf1F(,`G1Vͷ\$\v>Zdn7R}:+CqDc'ފӭ}㙥0m$<7_ѝui*_!p?!Uy-h L* Ӂlu.rwzYe9ڱ4뷒x+෿zMuW'ڮC4nȡz('s> +{-ɏ`x($=p@pj M2ID1+< 2_J6Nͤ>RO;}j+)ZPA, .Z4̑R6VhN+[y7QKF@^^Ŭ . $g`g۱Ox!DI+NY92sVl2=ڽ'{>Hyys+ݩJIMpX~6^k^{dVD H MgI Fզ;Xdh"I1Brsߊfv۲W<q5&lxVdtS}Đ20|qsj!t13B鎃=8vlUc$ɻ8TS6qf1=~S)\g]xƦAˎJU@: ޸o5Im['P6"N6{CFͪI+6z8U|Ua#$1H x`usd|B.&xͼPO\n?qe;+5ǫ}/&-kn߆γ UI< mRҢsPQ-+OC e  ͏P1aӠHN]k`lӥ$~9Y^x秧.HMry~5|AC׮tvvc8Go¼wcۯ׀WkXXø'ӎgŶ7W]-UC_R;rq9s{r-){ FpԟjqWCsPj|!$o*4FAʞ=E^_^"K5Xd>dFo~LJ/nK,-h^{8jXI~?,pK o6`UF#sk악t"38pI\}99>G^;9J;,69 D^\Btktn8=?/«\Cw-U299 䎣WFUIE7 %Wh Ӷi0F1`PiLs\$7Y2zn`x:*Xi&Bo=O$K"%JK(:%R'`:WĊd|#'bmB[rUN=5JP6-$Cz<ڱ1O6c1zzA{5a<.pARj:mzmU$gl0Am5˃c ?ʬX[>=2G_ֺ'佞CzqZվuZ:k1i^,MpBHf-^)C9۱`8^׿a4( g |O@ /co%|rDm(88_|V鵙$Hu8ܮ#vuCL:|o!yH¢v+uiJ]W8@ ʬ:ozV@`V%,>rycBS([*fLl|r#H*TOjg0"Vpz0~S4 T[JqkkE"5)'~:)If^;7!xD#<5gvȸE=q7rQ$c&׷wBӟOΩ$i_[' #y8^k&7'(źCe8;S] P%Z\NH 歭3Ƚ&Z^ov򔄎%}Vw.TG+rE<k}62Gl&C1/jn%[Kw]&UNVGOwIZGP0qg=:.}a'àq]uh%Ģb įd^ĉcaR8~ v}NJ2vjd`q1S!ʬo rmk}m :`JՃZKmHc&! C 3^ln'Yh ${Zt+` Y A z?ҸyyVߴٖYFø? l=1nw,39$+c$΄#dP0탏^K/cr8$ sZᖬI:d2ݫ!.ung sVSSKgszsšgm&Dyo,޹b2&6Ik{rs~=ܭ #*G+?(#=:Z 5fq͈WDo/$2w+ZO=w4ۙwdҜGךD1R;7rIq!v;8?\)RE+k$3<תZ~5%yξ䪜~r]ڏdVPIv]je3Xێ𮈨dۺ4ycb@ '߯V.@+.0ᵷA1 pzzK O)s׾yV;6WA xkEE"9 aCm,?|5y D]֘Sퟮ:H9<+䄹-ʎ= %de'^`De@}htP8du+u"KMPZQBϹxa9t{{FyqasmIdHW\Z$sQ)d1=g`~Ur÷oGkT N"DA=jki~v?\qS*H<=:tmLp)N;b'Np?N:fSɐNK9j3󟺿 Tg}-|)Z@ϴdZma<1~ת\IopɐrOҩܴJr>I<,{Q^QEQEQEQEQEQEQEQEQEQ((((u"?qk _#)-3PnVkY7r}GssK;Ǫ1vTx=9"6VY\_1:F#'޷5mrO֠` dʹF2G@:YG*[[Af,$jo>}i"T v7}w 9J`|'9×Og#3ymG~xy  `۟ԑ|*87qR d~P7_3h$[@k(c7IϜb[27$/nEJ6ϨdW״PL# &rsVGw5v/eM+/ۡ=+:(Ⱦ 3W𾫩Ϫ'Q+&aI׮EyWċK{F Yt)vzpFʽ~ ذ,Y?ד_YQd8uNBM?L)5q=\PIĘ"ouur@\S5:R, iMs+*';%t+M"`M =[zdippFsjld5䇯K~I}c;zgnqTͪ;~$LztpʯyK]}x5M|#kDgj(ˡŠ(Dw6_+C ќ|L[ wv_EjM=ΜHY:c@mn,Y*|ZQ$qwZH{*2̫$Ej#xz#rƧ2+n;D{eW*&6u5Udk{+uLHX0 wrO_ƱEēYۮrHWօfX#y#jB$NFHֻ)1D! _<UmU'ۧ*ANx#3?U뚆XrbT䝿ֺW'EXNv{UyqV.NZ) Z'PsǽTߏ4;\-=i7v泖R9$sEbnyuʡUfrjX$sώ3:S%G4;}SE[=jNGhmt@AAF:"*H=9G?Ln`OfV3PF:}*c)N3=>sk B12'$gkE yEt4Rf>9uQ]QEQEQEQEQEQEQEQEQEQEQEQEQEC`ջX^:?M@xR'%yo)A`, qȮ o<-$1=qWL:n0KÝ^\(4. yY"}{U魠ϻv)H}ac/k{?vgozz-ǨG,U9NX~ C|BX*wh_EW+Ҭm=Ҹetڊ=ԵKk$uI.bt? ÷hbBEs.J{c hz֋zV&5O c鞆ꚏ-@= R1#פE5o\}"/&i5%PR?Əjk{Ot$c\M]*8.9lG5#{y-e`['xͫbݕ-K}+´+ n'\:Z8Am`69UIYwSCQ:2oCG8QxWV.դ$0@#V"Lnc$`{dU7Q,nwg$[0Td#[ƣ쒣;>܊Z/ v٢9l\~Frs'z!Bȿqrx9 )<8譞}O$HU`plU]ɢ#3HlF:sjGk"&Uvk'x䎘SF$gRR͏/?ֻc'6IQFA鏭wUcSa>Y?Z`l1k>%wv2f !TfSMZ~YP%ׂjDXd%}yh1*~Ï,L(x^}qI԰.c30RI K`$ 34_vVtRc羏h 1n{z#o$:Vr{V,摘ځ$sRuBU+qjȤ͟5Yھ9榗O[7?g/Cm3q[6Zi298 DڣLֶFo((ݴbεV9A$Gw?bӟn$+xnSᾙ5NϐT׌:2J 1$O?Nj?&er:DV@20n:cn[]ٝ2ݧ H c?D1)`O#δbFv?ΘyQv .Mb׷aU% !YH~d֯ڹ8}>Pfziq\ӊ#rOggɎp= l$k+(((((((((((((+3]: D_kɷvW88LӢ>~uH獟b+ nj{ykgCfJ(3+PU=^/i(ؿ;Gؿ;W( bb\)}r/i/i(ؿ;Gؿ;W( bb\<. CC$36kX/ yt_k RVN[EJM?>M?ڹEXb|ת~ʿn&yve۹|zW_/6H[t^8daiX5zO;>&_y(~D"i5a'ԃĚ|n$6Sţn@8pyhQKl,F;H z?[s.; 8\jQWT%cίouh Fa?:c)~xzxn>\;* ZO1^2I;6ޡej*6q:Vt)?Ŕ=Y&U“N;zqWn9MߧjnOEZ5XVyU#ޫ ;7<=+_۲duR.=GT3+/1NOoʵ Fi o- q<sseY <*rFuV)$l*xauoQ|Ex^Qߞ+ I%rk۰g"aaEnϿ_Z˻xmT;r}1׫LݘBϿLi4&bH,vAݶY#T y+'0$/-pA׾#C݀+0Bۼn9+1= I| I>j|gȮJؒKn;_zQi0.qPBdR?LSrKarrB6}׏UI=x9?lWA,5韸^41gR)d$̦Ĥ-#GКA[.X[d Ж+0#Qi) (tR:VCrlb_[j٣L@1O0c׹FwgSmj.eа+LsCo5$6 *q'^SFX5J$h;PI˳~qǹ8$ci59!I#ZzɁ~+K|%T)n8Mܜb<8Ǧ*g'ބl2:t֠32UD'֫tOBj OsDX ej3qLhc84H$wHiۣdgh\n=)iv;X p{S2Hy?0a?h@R zI 4qC^EeP+fQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQAh^xIy"rq_Gj8f+pӝs?Q/:ݾݧc W|˜dG~:y1鞟cVeacÔT>5rI$zmR c^-R0`cG}./E$8ӥ\oFy3ՖBl$-O^k6so$_1W..?tI$1{׃$܎e4y< @sgnqp@ ZZ}iW  :tkF ed"'f?JKش)UB_ePI8Хxv\ow$N+Kqk}2hOy 'jdƴZ;y^<9[ѧf'xVqۙNqnBx*1|8mCJUY%! I<殯.|4a/Ơr{5hӡ*;fi-Lw1;c=kKBdVjBo}sЍvݿʭ$>YdO)R=.k}Zsz (";ppWCԤG*WS=~P2CWR|J$e[5Qi H&>L{ z⬘ 6O ?&E G?jQ#>e?捃4) $dӼHz ?J b~Xy1( wleU$u죏ʇSD?Nԃ1:?և 9n= J1dF)֎8hTeB@#6F,lx`ִSo؏wHo_?5RQ J+|P#ᗁٳj)Vug" 9qX3*9wB\R3˃Z+l,#l9$@J:\t  U&&zrq梑\sV qSԫS529W#$Ӹam  pK4MMaVSZ(|5 ,SV Q[>?J-0R?SC,IʅYT~ |±lG|w4Vʈ=M(MB((((((((((((((((((((((((((((((t6Z[$(3۶+DxzCl5TeJnA\F=xt3͵@<ґ8 l9+F}bV[ J8-&+vFpҀ8k>+hn-)>YRHZE}RuP Kd`2}>~9#6 JDiIqUWٻMDF;怶8cNH+v0nŒ؎§}HD1+Pd[SctVF'W|Ԃ9n5S].Kqi L1o8B?l滍Gz[&22 s4je;(0~]}}6y?ͽQ*A+ct㹶ty5#i<Ei;98#`y2+}ēHڙ9dg֦Os" pz֝/*Խb<֥=ǩ)d\1M9yi7{ڐjMcOt!#>E5TDC ѐSs#8UfY7p˷s_1pgQq0yT%Pz q€9 0)ձ'4*u(HŻP/8rp~f"塌P) p1`Z-LW}P?,p~pR!# c>9֟+ڱB}Q-)!d փC >?D(@fZY7 +~uJ09ƖbKH4yv-bC.V ʼn`NnzHWgrOʬ >njւPAlB%gW1:1*&xpCgdwf9r'\R.71b~\~5\\] svW3ފ9BTQElPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEvKY.$僩Sqqց- il-)~͸?1EGP.᷊=~hfeX\g%>~6E-3^(LWFWWFW@33P ?+ ?+E33P ?+ ?+E33P ?+ ?+E33P ?+ ?+E33P ?+ ?+E33P ?+ ?+E33P ?+ ?+E33P ?+ ?+E33P ?+ ?+E33P ?+ ?+E3Q@fotocx/images/engrave2.png0000664000175000017500000023247715247006660014533 0ustar micomicoPNG  IHDR( IDATx^GYr |gWVeUW!"PYHf).0 $@c @0 @"m8Az[hvO2Yi^g{|-ޛ7_f6[(/c?q. "M7]s䍺+9o"`f}64z_ve}?kzw}YagohSX2ڔ33oUmOO꺮ls̜Cr, b3@JI1:Ͼ ƼX,Dcu󥵔AbDgv&]!""}'"{D}MDhb25M#1F- >4]ƻc".c1ZVD! uH5s951[իsQYlAXG"̈XeUU̹(9kmJ*0M{||7KDwvvB̜,9B S41OOOOj`9_zղio}z_{!ŪȚ ϯ$JoRfkAؼ6 6E^oK}ǰa{3c gso>::jf4] ǣÃ,WD(Z{ܽ:y9 7GϺĜd Y_̯fǧ'͢m.t=3{CƘ eYu-"m+rwws>h۶7nh4J\I@btk]QiND"9cLlJ!` CN/_|cryyy9BV)zf|paY)!bӧO۶OWu?{B)3 23!gMA5̜ b~rr9B9/{0ld D>ퟯ66;]c8;7kv~;圉[r4MSu(a]׈16'nV.//`0Im1h4jiQ71!d 9! 9ah;WTsb:,s"RUUY!r EQw&|vvh4 "2NGYsyyi-yDTvR$C m `+6` s(s"KF$gT ̬iACmsƠpd1)GkArreQ)q,`8m۔x<>HH Iҹc\i۶, c %G: {WfDdq΅QFMDZ^VPw #m&:,6hnoqo4ެ=K!cZ.)`̑dADKy۵= FA :`ȒylZdXp]ueT43w]GDDh"9s6Xkc˶U( W8ѠM)]]] W:\۶X$,vv5޴m1qJlB dv5%a]%sV1"Ruu٬( cd-Bf&(֒A`љ)% FOoڶfX 1&5%,I8e9W/_.nlK@aAɊș*e!1FE'XkmZQ+-z@w(Mk;:[ksΡ%Šes9sǜ82sAF!AFXYSD xuu4p8rc,ۂ{sJ:fv΍;"X,b:kmbQ\!P#"wΉHιmҕMӜ]\(0p^D PfFD4鈈su=s޺mN_"yc__S4lADAUUmSJ{{{ܿ[|>p":>>~t:N*P9;_望yǏfYhbw2dhmż27qot*1f^V&0{߼{Gku!5ƞmK6aߘ:"o$9gD)VUctR $ kȱp0d`IzR9` M@4a}9_Xo,M &c`Y4K,(`o@,Bh{{{X_dhr6.$DD !3d)ZDhJ"s^"r>jڶM4yWTEU}f-@c2ؕvkHx0]zoWnܺl~>d Yr#,EQ]-`)ucdN, BD9,kMjK"B4^y??^&\k6Ywx|װzV{{\eMPPbf |V)OIYVEb IbeYzc߷m+"UU9cO)!"圐 Z2@3 #!+m01e A`œsι( cԞd B3HDhD `N!YWX !UekBP'v}}<R pvvvB]+ Su۲,˲b¥kcLJi6X"*|:#cuK}H90cH&c,}+6,K|yyՅ[EZyƘ="R/7cD`SR2hބ_`K{lm~LHt "okmW|(BT7:u!BbZu۶!v]ڶ}OD*Q"H9:gCX֍j8&"rB$sHw@` ]8òrL)3d]brE`bJ"EQ"gD,3[@D!v],"9mW"}3)Nųˋe`h|իW)>֭[_>/8>>.>w^sdvF㽽(rR "!kf{6X,^z3jHI M_g?ϙZ{y~#CB3L}_g}6+(h "Ƙ>0C"U___Mu7mPx'6 "ltɿ.:j}JYRyi`X,...8mzz7.ê.9gɈH9Ƙ8uRBAb[87[,N_ҍÛo߹u ٗ5#ё]>(>ûw?Hy0=FqG_ n ~?nG/?j!"u~wn[8>=E"l56Mu]0y֑sEYEQXk$aes/gˢ,!<=?;=&A̲lr0w})b1,EQQ4d{]~-ZD+C^ TYU}~ٔnê!Uͷ}]Mx_ʹ87s&"eQBAl1Z{;t r΅u*]1 ,:="2ƨQ DRJ)/˝:5ofy k +7лG\EZy1"Z(sΈҶm۶l\"˗χޞs./Sb$cf5kcED233Zy]UUW$@ڶmA}TCZBD}ΒR$5ɀ!.$bݪ(%`9;y3cھ$E!l,}N__Nϟ?}v;wxU.:88/իS":yCwDsb捀GDd zb6@&1x-RLd6s}Ld1.&cs.q="ڶ===P*AV< ֔Rj.DDD)ʡXkwvvJiDd { oCo3wqoe E.{A۰93 ŋ/^|9NӦi1d4U@a[mn634Dt(|a RlԶཽâ(sZy1ƫӘӲ 0`0qx͛hض="k` |G`Ԇ^$cЬmJXrΕ)g<ۯG|VrِNކgWS|q~:^\_u=LʲT]]UΎ/_`gg("BDN֚pS5U,d4U8;i_V˦WV1qQBSE X7U+l&$a' }cTdXP̌oʊP، hAa a{bWɱV""N9nX}/"].}i3p'Cmuh] h(( "$j c;: &Z(cL)eN|6 !"adfcL5VUef`p|]_,"3<ļX,eòp8(D6 @l'_|EC}L0(=-NOqŌ8EQ}/hED$P @¯"6{WCܰ.)YC_\fiY˲ WWWJF$_e}ꐳ Y4  j?/~?6m&f6섈 B1:K1F 1eȹ+Dk}d_"9DL)2_ ΩiBD_8eBk- f!DdDBUU)q>g,⫒s֯bھksa2iY*C]h 3Waǘme3mm`eW%"\e\.]Yh4s"7MƋHIRQz!"*rV!Q33[Ⱥ33e ƶmk띈t]0XcDDDP )Y󒈨r@DD BcC9gW{m[Ww6۰km@ۮz۠S`s{Gzo>==o)j~ߺa9???9>f8qe9Atd`<L&oE"9cLZYؤʲ`ΤBD|BMgW}φá圇q]9Y7RQUxsNm#?яvvvrtyy˪뺾''''''}/f_~0x}5D@OS!JG1xG(ˮm3CUzىȊh/ , 5$gfFD%Y]( AL1 xABMӄ `2@H,Ãow;S}]魥﫢DDBlBwe_|:*lq9>ei .w(I[޷}hr] y[tNְ3xD0"O"` >XQ{A0wmu}GϞ=oۥ"O&DD^:A@! rDIrZ_)Ķ着ַ>(ИϿt2]jGnU"|yXvUOVYo݆7%ZR0fZ%~#,uRfDT. u )-u:0"V 4Zlc,/U;૒M3~ef^0뀾1Z)@ *ۅ1XkB )z03\Y49* ju]CYB(1 "ޘUU&zs.9`97͔F};[&aI9$)#1Fr9 F"Y}q͛/\׵dƒ9E9}Y,hZ "dDCD t4NrU]+% c1 J !g|_7$ ]X.y'A7VV΋;A@:Ĭ$+;"K!MB@Dc0u)m\.۶],ڃҢM~Z-*HgBkIqm[f @(I!>7UeY6M3"NѸ DDļVڹ_|4Mι몪1j:m;'{-mۻ?{n]ף ilz1;999==9F,UZkEۚ`.Ce]G`dҸi9sh8@{fnZfn|Hh j`..x\ޕ̜8Kf\8M1'O<|i|nX }c` Gw6hM̓Rͷi4C=l1en)3rJ/_93,+Զt:}ߧY78 [-f,pcL)yȑ"( >1FUsnc# 4{mggg<C9go`0٩bEHr΋b:<I));- U#4u;I "ιx<?MDV)r0sTV{?yŋ1{޿`0 YG9;;;9>n\.Dգ1[n CcLUU"%L|+\.1Lv$3/˫+j_g)DD$zuvqFdowggGO̲d (ӣ/^4M?o۠R٤mۆmvڮon_9 +]$ bY*ѽJ)%kitR 4c9r4e3> DhsD)D魠Mڕs @-2s.x<Fޙշޕ]-i5 )$ z\G\1U"{4mfT3X'YU>-ĜRB0$ګ *·f7mWx1eбB@ س0@m h'xRaoV\t66m ;@csI.//w6MJ)Ȝ+~Ed4ݻwMӜm0R;w_xB?d2qdcrmT|xJ>ծ3s:2"MJ( foPCh9bX,Ν;ַݻW׵:6!p*";Ħ}۷/8<<'}sq]\N?''g"8Ϟ=@#7nP(׍ ;n13qFUQNv^9=~ f&U QZe- C/7nSUVя~NDAt3o6lJSZ]QcVװ aNBDu\bSm,YZիWO?9==uΩiS"HCDQ#ٕ(݀~CQa3+PtۇUk(e(D¯>{օ]%݁@Px(\ aRg ֌*S 1 o̠dҸ.WOKcLk@mf ejԔE`;ƘO@mTR䜳nxۮZdQuUUp7n{|mKDYZ˪"@Uξ-"AD$kǖPFH1|sUmZk7!b|uu_>}`sEu2}z:y]Mhkx}cmӪ&զ ["rJo) stn-WѯC#^ZS*lusuQL[cWĜ3VA4T/%Wa͔~Ιx}O-^YGD7Z11f#7拢(s"駈`|>gp\. .&JɠnƘm݈31!ɑSƘc]]>c,*sΰ"Q+B=6(2!l-9I^+ +W/p֧ )%VG!S Y-&k NWD\^3+M)|>gWWWDTe1猲yB1( d28UuUUOOOh((%1sN&&kmAst9 v]Vת*GW4oPl@"1FMkl벬ot9q)%ufA7ұ:ѵc1ιr꺾H9s9knxbX5;;;7nۋUMG޽{Y&< 4-"9«st:ݻWtz>;wn[|Ƀ7޽+ɓ'ӟG~wꫯb:_-B"A*_ŜSb3wx}]'''WWW.UBfcjY*RFjFE6@DEf/|{?QJeDtV-U:634b~5Nu^88ש,y_o^Y)x@dQ g!,)gqrf cX@Y7^`{y v(d+!b2X" fΙ(¼JlH g.inE4SA8Y$D̙8sgO ۷rţ# pdJ[s̾,D0EUGBRJޗj8V8٭}lj*"0F.X3kw;^_},ϣ؋,k9},fιүLBu1;o7X"O&=QecD1eYWS9c*u:[}e2оc*(pR\9gh("j̳)mFƘ";1ѹm5OGx<^.1F-/˒ԫju)QY髈٠ZGmZk';<p)ڏY_)s DD ͛9~2]Q>!9t1HZ )Řp<2p]{$I)4׾\J XQA-:k="4'!]iDD G45,uAyUq8}5o|QF  X,^zurr_<~Çzݲ*k߾}azus˟gǚ Bm۞<{l:2wbF)ϟ?r4YkMߴ<c *?h'RUDQqmlTjtqM&[niY)5^; tooϟ"駟޿{s}1p<{~xppt]wtts۟ݺu+3XV5&YXW!"/_ٯ/ܾ'Ov>`.lv霫lB!yff᪨˺6.1T}ȒvbT)!˥/o?Iʢ±iDT<|ã#-AE"7*䶷d6=\S@NUlzlUU0c19g |]tι ր(I 0Dd_7m!f^3NUNx93+c [&Q1Fh vPgs,@D7H}xk !8NJ3:1I)u-"Ϟ=Tu`UX.`gd>h_տ_߉ώhwo( !"!t9J ol ""3xo(D9B-~ :A%.>,kt7rҏ0W vrVRBF- Ej1?5&E*˲( fV*t]Ŧ0-_MH吾^yk3*\wܗz HQ3?AHoj[ #3]D9[gDdmsXV 1z#!Rvu"jl5r\.:WYZ뽧+ (JsIX"b1Ҙ_Ն: 6Q]7$9u)!5](R̬9c4.j1ǠVbLĻ2眳81UYcf3h۶{Dt|D$3( N"!"Oڶ(QmW١sЍי[kQOYksd t}9e3ԃ!u 4U`09BU]F1Áw}3{}{/Q9lׅ]{: %=79Y ]aMq4nh<ֶr4,(z0eՋ 1Eri9rBH) f.y`hyGfWW:ι*;`Q&<99foz+mšALXYFE@_~ӧO/..v,YK9Ĝ(DZx\׵N e۶3~bWr"|C?(Ρ#38!0 !1ڴ݀9%yv&㽽IV')󳳳K!eU"ZsF0DP:_U]'g}F7nY"g  }ߟ 4͠E[{{W_G۷o߽;L^x8F[nG s^6 UEq>ER~oB2`{w޻Y1ƕl6W>A˩(i.zu|i9ƨJW:e'/^`0^W_}9;o `H2-mmoJ`KZ&@lap *"S"rw :9ٕPEѯY|hJsdZk/DXGudXnAv 3_]]M/.L:==U XW" +]]p[7Dtvqի(Vǎ1FcL4'''/_Ԭ]ZU*)&:-t֢mB1bRWFDIN~x)DCۛ%B=}C~93޹vT j <? xh@iݭrU|U=ӽg̓߸5w3YFwvqX1X"nܸqrƍdĸ7)IZ"wR*E{D*_|9Ⓩ?QU1G\͚Fbo~/عX//7n"""PLC]uegϞ#GO޽u~~.@'YS_C)%D#a=?2x@1'#0s{"2Z#o~w9u"f /֤n[YxOC_|Q-L]$_s!˔Zz ӫ3IB_A)Fʢ(k7unsWb@N)q(-x_EQx[QuXLLNf1vCb}6}a'ɞCb/=,6H!RB*<0ME`JBY&ɍ[]׵ί7|{iMDDS ]ݬgO#vH {Rj[t+&@ "J(hRwhַYQ$cF9P Cu ۶u%D|^ƃ`6ʦ/RJXNkm$8:"ʲl]o`)ffD1nKs̋LzsZB% ҘBeaffBDbbGc: _pgW\se_AzTQh9yyYEV"Y:u5^kmEDNIjR(躮ڲi|U]~zio*3$"2Jm ufbH{c2fFeRJ 37+%F1zEAJ!n c44ue36MCR^!2iTOuc4&" _ڭoo– }  R$>="J)]]8??ŗu]͆P64.Ѩ1k`rueEQHDE7' R@K yZM&lf !P⃃ׯcsrRfd$ <8vJ)%Q2?l6w/^<>ɲ߽Se_=~tvvvrqBPJ!׋k޽lF81cH(uڵx_b_ܻwϹPUfI}J)#,!v?-ؙcd`AB!meW &Z@$Owm6;5'BBN `4H'cD=Qԓ)w}x]A#9ffk׮u]yN΢(3R"!X:&M1-(/ns';M`DHOc!~[ܾpUd8,Yf BS"B@)p*$BfFID}V7zH!c %,lc IDATDFji,B`cbL#t7n-""*cvuݹ&HH( D@%KXEe]׵mKD10uH̀!413 a{]M|$CNxWb1 AeQ)UeUdJf)'I8Vn+=6, cD$2^ڶZKchT@J) \qUw]ZmYt"+ "j%'0;LYI11*]P!]~BDy:`gWwFs+% bߪG3v1y2ZkhkjQJi7"hDNbE&Y]./FrYffƆ.Xk5bq8;\.Zk2z:6Kc >ԃ&m!9ReеBsܗez֦>}zƍmyaYkCm pBTJ)HVg<~]3O;LDg??uߟfeY#Kl}ZQeO b痗G}ߜN,vaɁhTNS mL]MӄܹӶm *$Y{?CHǏkONN3Օ“zVx6,4DZak>rR ƶViq2Gp||D Ik=M&HN@JYhYMDh5f^>|p'?Fōgٳ|sÏ?Ù1C12*ogx65<3:ˌ\f%31ӧO1X?yh FoL`Z.kSdTVEQ,~{.r<~r)˲O&!DC*Vk ̜1:2u5Gɷ&mSv?FkB!FGt:-Bh)C᷶GV:DZ/?Bn\:ϙUeY6FVz H&{YcZQV몪ۃ_v9ƘYscDl6Ո}|̣Qypp ef̬_*|{߃PԖ(CHiȈ2&DtvvvzzZuïSJN޽;ϭr\o6[2=;F-LwKĽ=!*·䝈 3ٴs.F&$RB<<c uI} PY;??|vvZ7 Z۔R 01Fb@͓f#f6RD( <ϫ!t:Ͳgj\DJkEލ[h}[q'Ii`bJ բxטB M5F!eiU1FL,#BPzHז^$}4 9dv΅yjLNx"OF{2| "y4PR Q,[ךϗlj=2#7Lj'1'=3jM$J!3rZ)&em,dCz ANBDYD$Xu爠Uy+gFc&P5"9@!h5ɊyH)EGD.!r"~;QI /.R/._\,B҈Js(eYfn䆈>t$tBhFlb휏QZBց7쏷ؒ.veNJo7* q{ 1ƨv΍Eu{p1_^xeYuVd/^/kgϖ۷,!x;<1FD48B`<ϩ,M nDC939&ĘRb^eWWo{ׯH. 8B5.!anOiTgff@H"&QZy# P7t6#Rښg>/"jJ-"R6MeZeu )}n3z3KD cY֚.GbderNض.&6V.x"!FIJH#rsPk-R&5S7~[zڞN D b7I'Z#0&&12ސcQsO?g?ٗ_~ YE![Etyy^i1nֽW`<+1F\QڮB׍F;wܸq,K/ )幝fH [B(Mv~Km|\sUUeyvvӟ>{blFT::y݊!,!r riPJe9{Sxp"g뺶m!&kmeJ#>NNN~'=(8Q!)N,#$H0)D^^w~կϞ޹s>ˋDGhw]&,mgOW+`͉sJ,%#SbaR)A)5Ng,ڶ%^;C#:&ϗOŐWYki̛fL&v{Xt/Wy1ϗGĢsNYm۶mUU]]]-֫RTkJ-h*r2TU^camLDJ)).N!#"*φy- 3 a;)9h4l6ϟ޿ b|{n; [vڂ|K>2L&cPR)  3b!]th4Odrrl6CQi\.8QX R bHppuQY5MX, -t\>KL~֔v:Ek6"JΉRi,S M[evx}w~~9L+R l<O&,̐dȢR Q%-"W|جFa]tH+XE@,ץ#v/Izr1"jכg._u1TNDm:* u1!,BpȈ}b$ֈdK*,"ƝeePJ+>e\ŋ!!OmrD4N().!bW97,Ui>|W_|!^u眏Hu`;>( 7R\~< q@3sp}8"BLSh\nݺoΝ;6bb2023(BbJz< aɱm<ϥ%W/.NNN޽{u]c{YEn>__̯m垚дh<>>9џE9>>KȚeлVmS̚|_x| ~k%;Ago"$s"2pL)i/BŸq֪er%42!ZCB\) mNcRm[fǷo}-"N;cLeҶ0sM\\\RʲZcc~;; oj'i`<6MS׵֚f~i{/4gH%cU M3gY!0%b-[D( ]ҎQ\TZ.kV&dL4M H"GeX#(cvrz0ը`u]G@D!nƨ,+z)YS5!s,]iCKߑ ທ_E/I&lUe]1cOsbDfizH)Eࣣk` `DDĜR*Y}^9~yX= OӺERc{!zyv.;i RȐ#h'iꗘiټxj>Zk(s0F1FY]nZ1s`Z2/VjJ)*v^XL.Dm]= p1Һ#Rƻ\+Bed6fYRJ)r!e"0)})E2hMDSBRF#$^R팠ckHR̤?w163 w%LD1yS@ʌ}W>}{&FY. J) 2a "ڴ͵kd:Z,ˍAd@na V0g//WeY~ᇒl3 Xڶy»y`˹:__ !6 |(75vڅZ΄utXJcY/I yYܺq[M<=;}p]{(&"˲ ۷?ןz rW+ l;/NZ<Z)C }Y"f LcbE)1B`2!&IuHjAh4ڒkv^GD"E޷m+ԼyHnٍ7~^;j&^SrFh1F^V?~iݸHZkcK&i bJ JlSL%T*kZO0eY4ѵzyJi^R<3j֛k#"rYuݵ\_WV0B6;Iwc ŀڔ⦩S`c0F&"' H]ͺC#pa3Y9Wf]O~n,۶-*dfMv?Dh"N!dXk҈Ĉ(¯Y m2BJr<2ٻ{<aaJ)yRJJv|,3n!ɘWyϖydGn\)uӲ,36;?`|YZA<oa513+ʲFkI/#c|CJ$sq2FԨm[i9Z@t΅أ=Ƙ"qom"~A%q!iIYZl\\]!:l2Ͳ\-J)T${QB1Z)cWW@M:̲R@DE$ X1I5ƈ? S^a', B Q!B|9rK)L3jxqu٩sK"6UN{{{03"gY{/D)f3ck׮e)j׸R=::"3I^RN[d䝓yXj?^, bNDet: ϯ^\A-[vt:Eĺфdͪ(ɷme2fσp|e3Ͳ])BJPz8{<}m[xͣxRl&&$e slc@J9kbW2zRL)p|x1mr[WZŜޤ*"Choeg`R eq첓C!sLE?߽4Mݬ{TiY/-BI@ƘI?!hI1o4׏cz;IyD4Ƅܹ看1fo}weY_ꫯsfvڛ ŭS1?xgϯ+w~;IDϛ:DyQL٬]Ǹ` z֠8!OI7ˢ(by;`:^~] ]~ ;ImZeEn!zY,O?[Vg////뺎Qv1YHQ+ c!=)e"91#j5N[U)$ IDATҚS 1N|n6kRl6|x=mt lC`"Ff^l0ĘRu!<1Y]] BEl_N@kkm:ut^e1BZLk֓(/I)Z$e]@LZャl(զ_>0J0\*ID "1..^\\:@&7;%ㄙqp RSDfe9 Bc;88X,Vec\דHR.H Ja ;R*cD܄HW9&EmJw DDȱ/7=)S>ZC)xR`ԇ\JZ ӟ|%ϛ ^va$՚Ґ8wBL)`A#|,|>_PO ;w#$JC)% R<ƭva{R^x1_Lr=MԴ5SJo|"Bܞv7kec)%MVHמxC[~m.wqk14r>_VƘl&K Kv(c< |۶׮]km[TXm!v(4 1"NҞm@dt1%D%S2\!629'qCy2*7m#,CEȄ]h1a:Ig*Rj7lnlQpmUը !X' (3ض{ҍm^l,wf2__~7f:`]7UQ'''rZ!2 x-;y3;N%{5,kFH>< NݮmBYw˲\),~yD~&" fD\[/CQ@:o)/e1}aڶ?bMx;Uy6I^e(1WU@DD$~Tm,nݺUb1kVR1̦{G}!,ڼd'Lҟ HXʒV)Sow!RjY?xpGV~x2L"m&7oID!9H9h,SOA4WMOT%ƔR >LBhb,?l H)Kr,` "G[]Qa9R2 9"V{] W"}vޜOS"r.Ȭ ֺi묵(ZR{{{/um$hV`;:j i'K]Px÷7oJ)C,Lk H)8B7I5(/69'v|>T43ǀiX ةIv|f3fa,qefX0x<F}`?֪aaMc,BZd3l.~tuA\S2<R EDTZ>BZŘVˍ0" j;&20#%$D-1\۶RJjp Db fs.Ru0y=Uӛ$U3CJծmsZǏOQ4__gя~tuԿ4D03"HVl6q#;QXk] 9ʥI;*G Nٳg]mYt]9NMSЍ]5Id{9 $GFv?ႈ](ˊ'~駟}w;Z;Ykё3LJUU-k׮KCJ{DHA/SsFD!8&EGUURXA 3@vd6[Aj:ۗVyQb D_gb:^]-89{_m3K)uc{U n<|-EM.DG=}{-IؒRʲLV[ۏ(k[nFeJ!muBR)%NJ)y鴔/g CeAߴn^W_/8FH6fa'f!Wm[2+~дX<_Z )R_-|fc>$pIy}Dtm{{{ݾtN]k%-D<#&e9ZBLeD93l}""*̒1$N }u?~] 5fSw_\^жX,TLжm]}ixYc؉n"J"_w IgƄƘjaGbpUh ,H o `mx`HHS@NDM0MO)u/_N~d2Oq R0m΃PAmN"ʲ,_tS1y QToJbιY.5!cu]yG.ۼ$[.UUyrw IiR 9u]'+1yu+eM(eڶFcy3 _p%P9Дzd0V@4J@ H#r["c2mk$s?dQCEe RJ[uYv fy,c/D Pt]Sι?躮(?y"ŪTL3">zH d$f-j4繵Vh;\j=Nf6ƈIKge%WURi6!$c +-(/Q( f6KeYvyͭWw?;{RhPM/]DcLJ{xhCc۶{5y&h4e)dAD1n6b\.Cb"ߟL&ɞ1&/ @DQuއr)Τ%0Je7OӲȴֳف|71F@N-Ԟ˳gO>}ӳgcl6)",Kq8IE[7^V ]Ygm[douzHm1e?t:1̻$ZQ0'1;} ;a=5(|iy\*A2VjEDTJi?製"%j2;QLl*rM{rrr~mzMDFikmT''''''pȹ}6Cx?O`_J "zwŰ=}SIlu1OmrRxl6ei۶m[ׅz\.cUU#*d2a%0Ϙ9JQI7 UJ$x\zjzzū>bX1F`.XˍiыN=P 7vf(O[kcN)bq~~^5"{?glG-QL'fYv}qjG4gbI`㜋,MUV2(j K "0L Gu/7z6f3PZk2 k-swիן}% wwwwvv1|"q[E!dNɤ( )^/ԣ/oY  /m76܁u<@D%1Ƙ8bȬ꺾@,>.Ph[l?OJ )et^J) LWJLGlsQQG>teYVUŋ+"o6j8/Y=|>{;!_-"O b0RRB{en3>'˲>+ 9L1;!""^__GF#cd21lIμcTn@HM/MvD},vt]4Z+8RRJ;WYf,oXEdG9MR2v߉o>x%z5Xѵ^,71ƺSJe1BH;9>rgGGHRJ94<>Ak];RUfrx{c (d!H]g u]A)%s{C 0 K@t]׹PNB( ,-qo`k?\$&U9ELc\#h')Fù&ԃ I0!P" ĐBHJ)u9HrvhCyzbk9gX~ "O6_17,d'2u̲L+cucSz&"}VRbRje1$K(!@Uj}lbY'5UzݐSRR;;;JiSydxu1z+֘SOfTDTJYkwwwH)~^ Hc2"g}>߱vOʥ7gk! W$"s."UCZ}'—^*w- >]cʲm۽OWWWyYQ()Z(ۢ~@DuuhֆY1xcLd[TFT?ϵ{9, !Ob{ㆃn ~@丁Dc_9gR.>hhՈ ;dK7Rcv`o q܃֚i 9 n+-hnXq[@,RJXEqePBk{k@ЧHD|%-ά*P# DB">+e6h[׵1nSbLeBJ:@DFBX˒Rqث%Kc59 JJ* >&JHB \Rɱl 4#ӛU a1FoV %zv n6ٔ@k]׵ZRN[I)uޅZk)4y 7D RC:RR m۶ /F5~8VnSJ@g? ƍi:^&dPœ˟@Yez1?OzqqquucZ"0sWR)%d2wo~3fW޾t:KNU(Rlwx,b&lFDBKDk;wyR6URr|R!#rhlEJ̊|TUS#RFoFQ]Ri IDATVJ)ֵm|駟~bŴ|Rj۷Ր,̲ !7#&NRJ<_|A>xRJs8 ^(ݣ;$裷ژι6ˊÇyaOUU1M[7/~Wu×v^x1VZu^N eZAL@ GD2]^"xv5G 'AJ@RRiLAѸx<>9::O'J)ZhRryrtÇwww=zt||laqD6*LUJm/_2ܾ}{ggG zgq:Ĕ\J޷mK.7is}en^L6͚R2HWض WR+tZ>:##b |6."qI'a'+ύ\)Ű6fz"2D RXV) +'Q^4@ "BB!f}S:b$k-%<σO,M{>X(wb-GUSߴ`,K و轟Nhe aQ`޳Pܐy-ZTZkBJ)2D-QJCuJ BBkcZ,DĺB䓮ιl_Ujj6˲|^#v<).sr\.DTh:AD"D$Ld33.<9x!3,Kj2BEZ4BbWSw:gjw/2k,[.`4xMct]lŀӧAs,"B7(o"sv"_݀HDWWI$HDu]zv8:H) L) va !H)wߏوpp8-&˲(ڶ]VM sl,w !8H`RJ͆D^1RF ~yyb!9a\^].l@tBh#( ! Z_Rq\(Ґ 5Oh4L&Jr4h4䫫?jww7sFsnZu]7& w쬮qzYw]gmYs8(eףq[dZˉ9j!ym >@/ښ|\>lSWZld|~~~||LDƘqQш 2hǣGo "" I@)A ys;m,|IkU5`l4JTl1]imMDR`JDyf1P ! nz7rPrldB8BC7䱔2n1m^emf,{qq4RJJڶ>I!u?QOQp1 Pȍ1 e#*E6i|H]ץ򁌄!D1F6OT/.˶.=]B1N 1J`/J 'JD  ʹ@ %jpd`b c3m"u/EaCHR('bYI\K5M#Q\\\!8ʲu{وٛyq6i\Rzٔe9LsRJ> h2H)Zr2?!B(!' fmZrQRZ u9痵d$wlV)uga 7 m gcs&u][k*8ͳ,4z.iR)Rr΅|$V*Ĩ$N3-b̌MUo*YH18?|f9efBz織뺺yԈ7'gaW9!TYf,Đ"h*Dd⤔*s5ê-wue9rC=tmLe\J %")+`h6uKDY^!W3Ƽ~zoo{_#i=Z7^.,&B$f{}Y= qcU4L)QJIW}Qen,ӍƷv;Uy_bXO~j퟈Bm%1Vlv]Wc}4A-˒/q.ty4 GqUU֭[o>88EQη6N%y#BrSx}}_Vm۞m6/^^]]!Yj (auݽc?~Z(Ã= hi49uuy^ ^|GG?F)OWfh繵UjRRc1!p㝝#я~J2{CQd2}l6BLgcf7oޜ9x/,ׯ_uѣ=D;888}k:*!z:JJ#)o[4!lVU 8|)%T۶d1XV!^(3yJQ/ِC7TR޶_Ƙfszz*}v^rr;7ĠC$ [FDDq2|ӿסkR /)ey` ! ߦyk$GED1&"PB6,n8gBis)R. B1cdKyf,31!wBݻ}JJc.j_oY899| ,iV AaeoZfc|̬=~#oL&u]V>l0l?~yӴP91yV7oBbFBr)r3SUzf y1_ l]%@)i2?Y]\\??X"D$:RQYeՎR@(RJ> :6LRJ=xÇRW^=nĞg)CIuރwƔ7ob)gǏ!G[J4mJIJ3!:)eжl6뺎_9"J) 2/B+K T"HZKkۦ@JYoy}>sa(&/MӰ b/1T\\.P 5k~`r10N)=!oZZe+),~89glwwc洢(Z+e R d?|p?&DDFcj\*FQQ^zÇYq3,iY][GRID cQRJEJw(ALI;߱J)SJ\%|HBao~W2fRzx4 2MJi4 )!Rd)*H)5T?K2?Hkؾ|9wwG}?1SBPTF>_\\IxQN???ϲ<U!9Hhh>:g8g? iHF8+rP h2\;xaq^_].^~}KcL]#lbHcĻ}&>7An0U\I_n.75"ZH)|YcIցs y1diݶmJcL $hT7yps}#gߎ "E^AEaQ {bl")zMLW*( 3'*-(aB3r뺾w2:;cmykkEu-m>7D\ח}Ruǣr\ T8S x/X-m@$Xk\L 4KF [\lKVcRJl]כ&&OFUUHY MRR)e1U+%Xp HD>+s$K:T(Ū $H- +|ZWf;͚ bggg֙Q!iZ B{yaIOEܾb"^~;?ş)v^,Ru])ZkA4mhZ!!0*B!Ĵ^+lVMy3Bi *7)s.ƘvTFJ4NEQE"nr1L&Vכj2Gg&]׶...*ZDD֞[kǐQ2}gy& m!HmRҽ{ΪRJ\WƘxBQ!dZĘov<3baa !Br'@RXkksdѨnDT< A_RJ z/4CȟY}~H%#AJf{Z67JXRCQ5$$7a( 6|yxݻwv޼yŋ/<wy}uu||3 !|駗W;;;1ƧOZk(Bo0ѯ-p~~_mq+!XK)Wm[tWueљUJ9N/y޽w>׾v޽<+$WpRZeJ?ݻ,CX|>?ꚈnfݽcuZ;L59Mb 1f4.,QJὯuu_\~u cγgϘ2(o}֭[_u^M&G#,^1,hڶ_|!|aQL 4FQ9wa94M۶[k1UUVjUc!zB<Ν;G1ƺ鮯O/.릋1:>__`4l[ym0!͌1My_\#5*tp~I)(!@C]R!"P̓/gӺh-lvkjv1*#!ʹef޺d;wּZs\.B`"b 2K<ψbz0J˻w~_w}YH0ݲ,w ϓ'O>S!l?%s{_*F+u z .%#P hj4 0֏r[5mS”<  `\krdEnmz>I!BH@PXնU}p<Yk{*lVZkJWJ>V:a,b^?x,X.e|nB buMӌMhq qRj6i(6l6Rd4ӓS=Ff4YYkeGDr<cz DA11s-"&-U]u\\\,+·$%%{oXeJ)/ !"]UUqT<υL˫EQZ- IDAT2FoI3U͛?Pg)fܬc0DL@JH69T{ جkD|ٳz?mȞ|bNoT*"@kTe*&* u]]ny$,{u;ĵR-J ͞kT\;{"{#œL 1=ZcFeYN'#^I\Fg\h^_^^6%RY<UZ"d{TRƘ<<"Pↈ)%\]USGP~KD.̦J !*%m`2svF+!Wej!6%Y۶)DapGB((xӈ}7Oc` "%)@)\8r<hB+@`ZֱZKDl2;1E9D<Ą(DHǪZB0;0UU%`MfLVNmSeY%:纮 !kvg>N  h40f DByzz:9z&tDæ8nB@D)%3yJ) 麎AM)ŋaL)!1sZE%rFRI)ʲ,*l߶-">$UBs!hxXyDH)@mێ Jss1F}YŒ5`Tŧq.HD6(7J{A4 墌1J=۶ m /i.3XkKv5MS%J:REJBmf25-&Jf;WE >4sdv<oF,$!A(A ʇNo6JRHL&m˃RZkmNFxS"nKcC"Qw&I^6 n]ϟ????q~)ѣG\ԒP&j:??@ɇľW RJM|[{5ϟ=j_{ރj<^)o|kζO꺮bϞ=[W]׽zٳemW"0W8B"E>Ǐ( ڦtZ]W)|ýճ/.W RPq,EѹhRuK}Jnp=˲Ե#%df8B(ލc> B#hQIh[ ǔ]__/5M׏b#n?e7qbDC?N[@;NJ) ymTι"3,]e(2Xϡ hRs vE6q;5Z*Ba{JJP 9DʲL zBmYIRBP̜io{_#Tn-) Q" tc ThK^1Xdɓ'ǯ^,̋[nl^gG{Ji ;cnX,IeɵAs!i.//RY"JVub"8 "d[,pfH{%N$qeޢRnm܌=zsJRJ]|F&r!DN7D%"QԺqh4J)u9>>>??$f!"5s OR)sMd:7޽[EOǏ1/QY^ٙݿwf9u˗{!E嫓ru-d/A86cuI9W/XW,X޻wo6CD'O, k{;3bx!c #u]! x!)eR&;dف9wM===2r3&M VH^I h6Z ԋ&B@pERFJ*29DƘ1fvǣ1{Z"ܞ{==CZb>sܱ kضE__;I1h( 3ƬO?mg7! h4t:sٻo+B⫯?3Cp8l62&~Ʊt#w4~U.k`01> o8핃VZ[Up8\-u]y Q1vd,2mWU 1 b۶޵EQh!7pP !B(ѹw7SD}CC2YJɸ tJ,ˢ(2jˆ6Suc.c 79zEOK)R' 'On|OoJˆH7MlH)QLohϷtn^9 !xC5sJo79h4R}-9WoEu]Ћ/EQD\UU>r-˜b}b,[Uz! Jv[轵<,SJ1`_.YI)9+y3BiR+igQ )ƚwwgߜ?B,˞>}ƌ{c6 bAJh4*zbl(L@~L)cT.nF,Yr("4{w&":Npq#y4y}ѧ~'N)}?~GQ5ج'''Z,Ƃ@3z|z_ܛu$!, 'OBR+cRq#˲{ [cٽ|童k2-7`‡&/s)eq\=|ѣGp?0ܹsppZ+f!D4^z5v{ު{Yk7feQooѣzzn4#z޶5 @fcA ;o{϶SQn|9ʌgJĘb%AI}L*H))8đ_(yiYh:>9:>><$.@77 ) d@e3+'"ANݹ_xG_.M2>Vb˔!)`0x)!$46h!g5`:ߋ1r-Uf^ ī?}u:SֲN@T=X8(S%em RPE4>tQBcLQdyѣZ"a4l4( J8}J .\KH (fk@Sσ:Ÿ;GĦiv;?83 ~2@ l'D銸A ]\w&f1F#{*RZt/["b9Fm۶M`Bf;G b!)|g( "Z&+s,KvZ4M+zcdC8e:uj}X.Q樥dV m?Đ!v$RⲘDdYj!B/SJS *,gx<B`.".d.Š\-aeH) cLZiL^TROY1 #!s[nuݶ-Ӽ2reY.+"f.tNuVU( !T41F)sBLF*)en+@XkqP"˺R-< 1G}1o@J6س׏ιDRBByA _]]<}חW>XNOܽYIUU\w\f?ɓ',/..ݻwsRʦic{qH2q`F9,Gh4ʲl>?}4&BGhwW#*5Yk]hbĄ$bS9`$~=ECJ)k-\<'{&]~{{{˙~cZ߿/uNQLB= XU*HK1>X2k)2mZkGNOOW|J֦tz_U,,OC<=|E;JYo7TG!5$ )" DEQ(, 딒DX,fY۶>t-#W՗$BPJ;*)%CU_; E2߽{w:Zk_xQpYdRoJ?0<|poo<}ߝ>}zq1e{r ϟg?{IL޷MuD.c`0hzN !|^J)ggg1U\___\\lֻիb5xbbP chT|8V}gϞxxxoZ`pr|+o;>kkƘ,@kǏs+4έTzf@"1|i LJ)2Q8OjPV;m_[ I@nB#IDD\Gۦ1JL9~vUJ.|^""qAJE葊,8= ck' D,gs8MQU4Rml$ݕ;,nyQqeL1FzD.TBѠljP|P`0TUŜwY!"ȷ]S R>Z Fkٰ(!D!׆\1H@TQJYpf1F#B DL n,ZkVh %M)!@) \@pYv}&BoAe5/cLc)i2Ⱦ`YNYO &x4;5lO)m\1~9ƌ>`ڶVr( dR?xJ)!D }JI#⩆XR>HkJ)QD4*"ʵBPZk)uM1 j D挈x#9} "m+EF~Y5lڶse,c]5fsBȬ7'oHn۶m6p||lY!zm2MJk}܃ ) !RwRi[x-Ḧ́hXVn (\< sD 1ۄ1Q'_EѶ-H!%2er8vaxC=DĵFbx 1F!?>2]_b/jc)%w-čmá1fX(ynW˥>MYW* BQƘϏ*2[rpp Ymi*&ɽ{NOO bٜ~z\T(2ZEEqtpXUavǮrEDz^Y9 ꮽl[) *7D|iS9ĸ /XlRg\)ZfWϿ/RRJ1+h nݺ}x<_fxeY+BpzvvG^+eY|۶D(1kzǃ ^|yb+ IDAT;wܽ{]D9"2pRRZ7RJ^_7Xkݻ׶ϴBK^,Ϟ>}?ǃ`8**oI G6G=9u&ȸWY5MeQ¥t:>x`4}B1Lh[<ÇYޛLBj6ٶZDAeO)y\2gd,W H@` v?,|ot.@7 9'2#JL~p8Ze{/..֫mmJ)9c Թ|v[|s~~{ooy睳gϞlƪ 3jnZ݊xQ:6| DD)eJ)Zv!J,k+%fY?|޽{~~/^fYe(@"L)ŐZ:0PJ 0ZyrZ.xکxXb:dt(P,=ݓ֚ZKw) ԍ%A;>@}ria1nUJɸK7k[?ľ97 u)۶rbB@{F \Q4 *VlD7ao+A8RJ<ϗx8)e"b8g7FF1B)y@:LDC4Aj#) V( "h"c8Wo7zt+ ~`So999-c/cjRJ2 !,޽ɓpxq>sެDžoC7b$~C$y uBJ P$Zp٨<{/B1)s)jf~Bt("LHac` ƘSbȲ, @Miv>@Ds ߔB@d c&CKdH7=.BF;TKJBUBޞ$p5J5s.AF^ۭB<TJDŽR*p!PJI9cx JzHQRMm[ 6ЗDPژn xg{%<3D{oWNY8/zlx|_g/1F(F =( Kh:=e[kw9!ѯ"_=RJYCRPHGSJ1%TZ*Ů֩Ji1++rB)uaYV*s9!Dg xm'F%wwJ)T ~ĄP]UWtRF꺉JF%en 3{#JJID.`A DbH'YIŅ@1  1X=<ϥV1y K)Y9Q*PtNs  ,AsPy4@d;' C1RL(um< ^iD)C"LчRR!Ͽxpj<=9iC- +Eyr]01 !8FD1"@J_d2l6˪:11cveYMSj<t6Û=@BHgcFZƘ":ਖNj[\.CUUj>y~p2#'nS_/C&7a:i_|_?O|#PBx<y1)%Dd$s1!r۪<!lcAY R"R)urnKR E^Hl6"br/MX눈?Ni[0ްxh! hZ]He1e(SJXe3`5H!$4B^CY%E/>޶:ʘ|8muWuQҘL9b)SRy^ywpBpl^Ԛ7jm!1H:UJ& !WZD) QOw"syR"U ?NDuarݦieR*E(RJXJijի>~b)ܻIh-#`NJY !QL(ZbRk!qL: %2-"*s̵bq/RJ3!D !00 l8rZ{||M}tl˻w^]ή_=q_}vm\\'",ai(0xe?+UUMSf?6;#J!vX,3"{~UUUU:ڛnBٟ^^^2U_^ʲ<;;s`Pݽ{`{^k-۟B,Uh![2"b-E"" r%n.o>hfZ# ʰBcvWWߙxn'ϐo}xzW5ɲod2Ym'|k2GGRǫb\R 1|)ϔH"R6 @3TJZ/9W Z><˴N:vӯpiDJD2Ƥnfu{\EV׵ȳ.Zct&($8GZsy]Ea1) 񱵖 OD{1?)_vҀwO)䧓=f!"e )1F>mjw#I\nt&80*)( c?"0FZSJyεu%^l|}fEhUiR(.\zz< !883H,t:s)%"s}c Cs^KWL{^R,˘dYZ0r0A=E BuTU5L]12á4L,ˈ3%}U 9Qw4Yk뵔2ϻrQc02&-k-c4\~y1DͲws8l6mc9%өy;0Y#hCv͡zAMf}|Z18!mepڷ.KBH)E ȌL DTꂗOƂBiBHDDAP\{lyOQ D . ,SJ 4^ػ_S$z{OUU1`0pu]szemcZCLMض^ZN#=99q3z<3IO&;Gq^>w=>>&WWW6dN{{{Jaq{fYVmEqttĄc4ƴm;͔RB"m{uuZRJHDm%"LcOy~qqC\.kTJ%v| ]N=~RQEʮ@4Qa3tLI)5' BoڶDmdaym"./Q>6<QU!86FAZgH!A D .%A VLɉWB57Ŕ3k-TEUU 7oB0crr>lV۷GbL&mo?LFiJ)t<͖%ikh4 !v[#6fa=ٲtI$k_Aw!WDQjnAoemۃv}#,$jo#JyOw}w]|򒈪uh4 !T]Yr+$sCĔTqsYYkϳ,N1v9M IDAT\__d#"x8ة("2? !"t+!pPJ)I؀ɉ zĒhݰLbtRIm\d[Z(u.RJk*2jXRj=D&H H$Ň.xc(KcnBB2cѺiA)_;RJ)fO2hbBJ|z.u QZkTo&f^-GQiH|kR]1ry|||ttn)R#xX6MӶ] # !XkN(KG"OQxZ1wo`3_zl*/>:urtRRdJ ,'8(}_.5әm ! &$jbiݲpyyɦ>"7]__"!.CRnm R!Wb .QHgpx\U1 &>ZtgBz]m-,ALB`]׌)(B>qevџ/C33 "jE@I}2y{g]Dta_+e~RO?VnBpxm (REj<޿?sjG??|'ӟyoyUU!bqpp9 ɔƵ)%^ ]m?K"2yc`0k opc0;s9OlۖwSeUdEQϲ,XD1lx;yKDaC=f6GD<ݬm6dr9R2]|/^{Ǔr7_/Q:3<{o6 Й ݟRW2(=fyɶ7K)o h8ݺukX Fox؇['''5K 7{) a8-A.VImb/)裏ܹ#4Y(M^,ڶ>z|n2:h]qyy)F3?W_<kUUQLR LmRK>DR4.s1x1R!1B0|%?iTdZD,24-"TU% !,{}9\qK)QO L-LfRriӋRp_y [t_|ӧO}R Zk}DDb9#{^|!%@s+ߋXoxxC}@ #bL1B 5 "wAJ`gYj[cR9PJ b(HB Ǝúms9cXEP%-Wrαc|?/5~6;o^IN :( D84QJ]ifc<̨(O aZebmJ)1qd`BCn#2r;l:*!CLIhmrwK?]_|hckP &+3y]Q9R"61`),oWhXM&<7'?˲tm?޴W$I 3+_fzuuwU.g\ΈKH$AI_IE@@b?蓄!A b,{.UUU̗G~>XDnp CUdfsttd-r:޺uk<;NOO˥ɚ%R]gx^?=A(CYr^f'oez.p7h>IT"ʲl8N&`0lwLK)>!t:Lb'!wu}vqަ\;f?6b$ZD:։sb^(L( xw0^?c qA@ q1fٿ8Xgb2K#$[Z%%()l6&ш9X,{lwf DBQk#b1\) !H);3Bb^oZLMcW2'OdyZ{y:;;ck3`#6.!"tS&QctQˉ(榒x0ZǏu=bRJ>75l̀o9xk,ryvv M +l<A;Scj}1`8OQjz>LHj#TJi53E_6~^!/&ShSff7ܻ9ʲLJt(7hYumzl@QRJul56%fp>8SY12W;HRʎ=J)md[s4MxK= `-p !_z&@#鸛169=U)=ru3y GJC"rT6dCs;?16-Zo7]|r)mǛ$nBJl6D̲ QZD$lV0FOZh4FXHQI%KD mlupP|>!GGBoMƘ@*-Z*I$IR o-#_a=nYUU!Ο,CBJ,'IQ,wGH)%,mc 4=h8xB`jr8rޱy_wreR=BiSs$Y,d1n<HeY1ۭz=X7 XHDU~X,>ʲ:MSY(ckxo3@#0-^ w ~;{!^h7.{&EѣQ{B1̤͒k"DcIQ MHD3FsseR6169Q^꺎 0U4ݶ@}: |xCMY`zI >T<ϼ햷yx>޿~[ `'Oܾ}{[Uڊ'k.jl&@#nxPٜ]"&D69D_Zwoܺ+$BJ)Q׿wybq B (cRDZKD/^f7xl6~D6Z6YԵKe_vm0i\⋣/>䓇T1&8a^sLp8U;:м,|b]ZJ)Ɠ|m8DD"x(Ͳ@)lcn47'qNJ@Yy$z^Y&weY"Ix牋qB~^#"ݯH:4g!9QUrn6e(཯:+LR-P؞F̑ +)%Q7ձSQWGG'?@PZݸpD !&c#>;ӑco_-TЎWG5@4IR !Bpւ0pRv%eB4FJ~f. B4Zo߻yP;* "1JZ!+ww*1"bh7RRp,Zif.Yn׫ \9#%}qu "#p^H*wnla!16)f}""%NS0"J)Z;g=$w% Vbl$Xd${6x8rαtQxɶPAt*$*J"Mfb녈NN֍(lٳ??{Aד}^ 5 "M~/$ӓfw}"Z.yZhcXөR*y]D"X.e((4\h4s[V69;Cb1Ə~iYJn &713Zi~w'xPꪪIhl6Ó1EmOOOΪȏf9k֟[jw ~<߻wo:)$I:>z\ᜋέky$a4UUSo۷oftrzVS96{ N/ֆ(lm6d^]]m[kRP5zfGf !.x: )@ꄈߵee~1""''htjq=~|!di?>>G2C@/~NRP18<3 % " .{.OPiVUzXk 1b:ܸq|kǘZ]4M߿޸q[o5PcQ/^8??/r2o6| yqq?|{omZKxAx@fJ tjȓ,+H₪"jT> h{(| {o߷>~88{<ϗն*!w"t\)u~ԊGF6slBZo.l@x僣RY\70 ߐBGO+bgvR,o)@ 󋽽4K4MSV)(ɷSM tgB`Q<09~)hfz.""Ƙ(Z$"a>1FB`if Mz@؉Z`j !Vvc>"bl.!64&,ns+S.0n( XD&k`FfaT[DL1fyn]m1ކ3ں#RyCU͖{X׵Bkmsޜsn2m6פmN4e$`D%,uA "?ŭap[z ACQ)CkRgggiF(y Ī=P'O8vHCɄ4M,zz* 2c1FD)1v\FYcR7&{#cL47&XU>&sͰ~E]W!|NDZ?s2$_Xbnc0Ae)e1IѣGggg+Fi!jki:"as1FZn`/r\izx<Z*D,K! Ms{ fhBDDZ)Ь!,˴֫bc$ٖls6%#w9Ve8A)d5Hwy_|_P{+k9y &"5ϼYx~?fhjnέk`iyC,Vu]kClN&ܑ,Xk˲t%IƨyTJeQkl6cO`0{[7>C/c'vE=IZ^xq1o /^n6$];O2:0_Vi1(8 5p|Ym{&l*&áݻwޝ썖峓z]UU]׫Mv@:䯣`0`3M·Z_V''GZ)%L`0IҨ1Ǐ^.J;wBd:o|CqͧQF"!n=7{]*P;ǘ%")ƈ2">}R׵-+D˫(9WAg uHFJ)&8 bx $"ǜ06(| %=)%  ITrR#,*eOiz^I6B11ucyRQƬ A[\@WgcGgiR5Hጿ, z)_h#뺎;F1lVEmK!fB8˾H@'u@#f]Z*(!DQX ME!jU2} ,-4 J"v@߿u[wo2x5:j$^Qz!FDrdEQ8BIr{uu}H4ƸnM8v h",mRٯy$om3ʸ*CHQUUYkө?"}\hLཧsY(IAZW41|?H8ʅ]hb[k2lnUUś2v7wl3Zy[VIbAi>7ßQ j5=XK p2D]=ϫnA-/m3ZT7p8b%Bi%Mq*bd-Q:*ޅݧ %B]veyhwpEYݘ)^ONN>r'#&>n!W ;kSBodϟ??==yfSFhWgr^^^>zup8R.e*);exGD) ݾ}Iv8k!hm"ch05UDc|9O//NOOjUhqM(r]UUQg{ FD*꺶!b$/#2!G(d]|>!(x1 Z bCsUUŘF IDATf{<+J)?Yh4fin6sImo{[ p)x(Ⱥvv%"Db%ٲzE]ׂccY,Y ,n]FJIDEQXkg^5ưID5bRι^'[\UU&='UmL M"JE!LfKXR v51.biF"h?,:DdEg٠-oj "rZ%IG !:m|9jRJAu $IhVEDZr$"ɉ$!97eY6k:J]1F!`$`ʤg]xK_7/2l@GD@ױDB@ B^ef^Q&h !(Zkkj /a'҄awg}ƍnjÇy>N | Md2B,Kkkc<(%j4Mѳe `y66kRf=Z>=B@(Dd ~snR)6Xݻwt:e^<>>~(v֊aV{Vmr4L#uc⌳<|1Fng7 & @$Q{6,L eQ]$6B՚&*:=!F )1B!bAl#Qc {/~?I "^i$ǜQNRfSU/VrLzz;K2MӢ(jO9K@ (p2!קml Ȗ<( !ERi)uB!PW1KxOZ)!e` ,RJcď>^cDd{; LWu?9'|f Fu]FJTU(6ѣG1r^cm'lw: bwM&7={fxhV/sJ[nsgml=M``x=m<Y&˲ .z$h40i\\*i25D66#yDO3!28??ϲ `SlpQ$I{zz!uI;Rىlt$j9P(./.'''ͦP?..&ޜBsg3}tYG)^^Bxxppw)kei;l^^^x24*)-@TF @|/Q$ byyyYlh4qbswtk==}tXVBޮX#צ9p)tiHB4 k=hͶ\45J \]_{[ `<="J-!H)"VpppBx|ppODɘgt,"{"i!ۊL\(B*4Ml!"Օ$@98w{I'ONO?Tݺ 6[(p'EOͣV_Fم^} D)JxlL%J)Nɘh!-$@7nsi*"y@,nZogv ,eLX+a@Ěa?׭{Qd9qI<_aZ~ݽ#vdk_H!Z,e 띵Vkejc%"<4| XudA#g:O}D1In֚g'S(5`dzRMF7Ҫ"볺14 ypSDV_hхK qqqas\-4i!1f^WU%Iɛ$!( !R$p4MceYo68WcisL(ov7C e %]lx/Y=Z+Dj ^^x !;Ε!"AM(3"GO0{JnAwZv˕Wnv׾ ٭ӕ'AB=h!bλ:/Zm)HW7u_t%IT/3aI)hmyv"[x))7弪ʉHSe\3T!g?==eFDVJyou$ KD#b^c1^o< RJP7۟4Yqx)`C)k ;вSbLTu]_\\.Ǐ !~}>[k@'Ͻh9wzzz||ł'B0oܘ_]\ ьIR%޽{kG}t{|pxBpZtk !h cTE{ed8bi(ڨ(ݦvjj֚eyIeeyF_G<\,xkx<β w^NN4hl+_/>bR`i뱨KLbZ,}-@ky,d ?Οʲh!o!D!P)B`I9P+' w֗j,˛K}6RcLM4 "rb٤&fsuuBgggeǣIDh8^OHUEQDZm!2f! bH %ij& QJz y9WJd0gy0Lpؖ͜s.h5?0wmv6]k[ {B٪.+QߵY~&K@^{ٖ`jf E;{1~_kgfNDBBs9hٳg#kglFWkqȶCc6jRka*==>y5 {ϋ 1ƈMZ^{do~IHD)mc"rl_$iv1 V  KZ"@B1ZjdJ!/#NrOR l67ff~3nN.h=P*R֮99mSF\.>}^oֽ^/2!1ÇՖ 8P[)S{ogI]7Id7~ַvQXJ(o"3$񓓓mFDBDDԄ [`2Zq(QpѺdMt?Zîׁ76jU;'[>1K2&Wy@vI%)%+&RJW?hk&5#ܼ[+2Bҽ7Bh !l Djgŗ[I'ڰWvS F8 eY"Zkmpn W+Yje\% "B g-eXe^Z =זG7O(<@D;ƕ6)X2i[;A)L{Z1~Ρo9Ny?<.Rlޏ~pm)U $4 b]ڪ.uY6Q (xv""=DQ58CZ/,}xK\Ć zh6)l=%"21sƅD~jտE/9Ni=W+k "KR]lI`Ţl?&v[UPhX.Bq [h7n*v1foo9wvvl3oC{iRn6z]cXVY|MfprbzEUU>XtZ;#XZB( r[qC4M,c9ҕaITU5 RB??===R:j߸q͛:XkBi~{7{{H J2zI`X<~??<<\VPkRFKG*+BJi?uwʺ)bcvB# L-6L!rn\$}?MX C|XwygYCmZ*wDw)m_~|SazbjuttzeQHDr>$0i'G5p8db>3A\6k{kmUUZ>-`'vLBy7r~KJD7 u],ˌ{3'`4d%IʲL)b{ttѣ[bzys%&~2/W?O>|7͑xIR\'ɱLooo~޽{u]?߿σ1Mx<M??~BHL F "eYOMa/CQ0"h(g 3!DŽwxWU"2\C(I2LFQ7c!`0}SwAf2*nW ,0w`H\@s@)mi6Dpϓoݺud^a F3fVU]׽^oooo8eyyykUUR3v36b .4z>s7|s6OiW.|&"v3 t-ׁǞɭ08_=y|O?_..m˳{1j"F5Y4qRM4DPYe8Kh.êSlv  U!{"% Iszɶ!!HR AdAC%@ ho_)nb z#BDB账@# -a ]B^weAۙJ)1XqԳPsvyqg^/tIޠ$\@OqmZJcZ@eY* ! \E,Zk !p}uZ&I~R(@(z3>ZIz3t:ݟ4?99jo#q?FSEh ¯1]"b\r#"1f:s׾<~,Kkt:%^=`uBkO|D[) fÿ˿|)/4ܿ~F˗,˶-x|Pg]WZ-1s)*[CP2Z %Pɴ@ҵ WWW*(ϒ]oNR*}}a0EQ5:эkݻw 3$)[!4Mb#`7͛7R68؛Mo߾%g}xJ ݹsg ~𳮉^ QmpW^~AG׋)[_]UUUQJ4Oy\.p8Lt.D4fm^ՕdxDU823"2##cI,qh414MӬgggϟ? !lS"'}4K&ˬώ_<}rp_gy5B79SdEszz÷у{xiYu RJIJiG}nRcMӞI)˲hٳgƘ~1.ym/UE9j,ɃGp9`eYRJ r2,KsٳiWW,{hI gWVZ)AM׍1f1BbδAk]eYFR E. ُ@J1u0dtҚqODM- Yx41)RG$ R%/Ţ)ˬi@ZVU9/(K1:bu2 ASz6=}zFXJ):H zRg5j4,1v8!-xr+,QO?k9?;;L&t9j2c !y9{UXkPJ )y.%O)Q8єwN(.,zlJY>11ub<&ȹ@*sm( k-L)Z5؋gt99eDDZLRJDL)c<ɢ*ZQ)E%>99 y9bδЩeY6Cַ~0_,B4 ?g}FNu!& DH9.>u||iuΝ#DL,aDӗݝsͦ/_١aںF)Ue~qkZ}Wwm766>Nl3ғo&CxJEG(UUc1B*OcRp8KkQJ)#o֎bgVgJP#sA)_~/{իׯ_f3I? hb,sRrc̨*m@g…Z)mP(yJAf\cb:,Ν;bzN\tAٹy.c'''B+Wo@1CEQ\re{{{8eeeYfYNpyqqa=>:??ύWI~ܾ|ƍ ogUUAZ6>.XٛGk }ke((`+0Ju ;2!0RV+ƘttBfRIB` FSI5z`=}|ё1fgg,Kk-1> 乩*|N h7OS;kK遤Gvj#ryzz:AJaI)FߌӡgIJ< s.9`!2eȣDk== KS ,gy9xqt]v=Dƅ91FĄ-a dYB7M3i%a bQ[[[!%I!I(@DH`!bB֦=`d 3cEq1!7pGGG\ "#+ *o v~kO۽^&RQ*/ٚs9B0t꺦O>*?GUR"6*Uس˜]g+iqa8<2QLNt$*sT Cl) ;l<[kc!lO" >wH_tb]X[+)c"ϲ,ƨZs##p{ч(& cl{g-ci.RW0IENDB`fotocx/images/printer-calibrate.jpg0000664000175000017500000012424515247006660016416 0ustar micomicoJFIFExifMM*JR(iZ0232^0100fotocx-26.6: Rescale: width:450 height:341|fotocx-26.8: Markup Text|fotocx-26.8: Paint Image| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 341 450 1 2 2 C     C   U" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?K$Z5ѝwjn"X]3.xf3 /=?5|Aa5(}u5efi/ZB=oOs?*;Jl^ lΟ]]ۖ*% E^? $'f}; b?_TI=uim7"` E7zɎk'7 v> D_UPf:WLU~ph>G|s<;yk|Vva5ٸ?X+>;(}{BԼ1=i-&):2?J^^_.1s~oӱ߅$|@?S6yhӯqOo"N=~*?ye'i5 xQoxX{H`kc9&F#85Gc٪RjVsKe'KQi_ N ̸ 993Y/ I_Uw^)R5~9ʗ&/i76N}tlΧ觑':/ye&?WdEoW bx gjgޝ`t.#9?TcO&NtC1ؿaV_Cwzt=R\E o*Ѩ?X ݿ:?tzC`7U+jOB!jCg@ W:?k9^A#օt诼7Wzw?]~Sj?;Sѵ-o'gU zKpW6k~cBPpjm-t(WM+FӜr]O xB}Tھ'G q*%t}R=ƄVdž%ןЏPj꜌k(:U>8慟}L>>бo[m5>i Kqg<1WxpqͤݕCvh]1udj d ևuGxS]r˥wwY.ڴ"\&-xks"MG,B/.#ޅ_|a;wj,m^{ P۰ RMyK[37~ v- քF?/.gvh__PPLֱX|'t`fkX^_&v=\~w!Ξ:w&3j}cZ׹A/<"BQ5|Ka|: wZDɫ3/g5OMM| ־i8a=k=?&:!j:~ pư$P3#Lmg/ע>C>r8hO45ܪJ2)~> }_~G/"<`cWGd3;5 ڟs~BAXs\ H(m܄3G+3 -}5eM|<;y2k#iMcчJOU@#UtYOUFhĶϩԓz"v0oJ~nO7j #s[Cxz5|qG=O\glUۅAӡɿO^#.|`1Os]\?&ǁn?:cPJVn\fxr?cgf%ԥq0 $i;r3]Ly"nMw;'+h3q>qmǵGs.~1qRq8#1 szU"Ā('jkIr1(%~JaH> M0uקi#(Tz*_-Oh{q Y DA>jzyVc?μv?MjntQǺ7ĨNNx>O|v=_/߲[ᄿ?Q^Ƿ _ xGJ-7Ndbc 8Ÿ;?^qtcj|V#%W*nU_*şZkO-;?X1IqW˥7ӓvDz}ƹV&/"d`LְTLf<{MK~'Y+)XT*u681 rb=2m?##s:рy+_##ly"9KGi}+'gӒ}WǗkۍWOqj/|YEW)/#1OjL\F9_NU9׋;WȣN?⟰ᳵ؏zAiZS q]~ٺ$6?אJuŃ\o-ˌ/֢xMKeYF+ _lϻ  jN?_DP4?wT[;*)-}slkkxtw$ЖZxFo&\O{mojȫ 89$Wա(s"d:?V5V6Csz*qk>k>"YN+FRrm-`9cc6?&7/x#5ФsFm]X D*Mh<xII_(K:+q_9xk} >XcV6kW}?F6eBFOeVSZRQѳ\cp~_]g?ZOh76V_U⟋4i4khf 0M,NgE=ZdM*ЛZ&};~͎ }xvJ[gH]6߉Noh,M8A&ϲvv%YM| lMȟUe׼]mOElc n/iՀy?|- ?q%}AMMN#5gВM[>?)/6YX9k[HzyI| m[-t+Ƥ&js#Jx rqZȏp$gx$&*Q5N|Pq\` Z_Xu;sS_ sǚx{WB]Nm#X mWKÔa,il&bUZOb% @vkVVɧ\$洣Us2bTfVϢsN?G5tV1=MOW,#cֿjTÙkv@- ǟEYKS0㧽,,2`44Yu(o>z։U0ǧְyu}k s_GBvF+:m 58GGG,{h03:?Ǵ_<_v+J><[u'6|ZU^u38ɿ]zzt(bxO6ԇ@i$__@(3RjXj.:B!"oe ?I$F I%A5ҿj?U\WAN^/SVˡΔq\W+?h.NrUh^WhicE ޅ8j5c$Wq\Y.IZ 0ZZCΌ68Z1- p_|Dۃ={Wqf.s:ݴr*4僃q_qOlgxZ,>ԤM*]m*; ںqY'ZzM5|x'7Ч_qҏw?cL:ւ?O,2?[)lrd~7_vg,(2o_})_no7w_0L?3ВO۵| Z cƫȹВRܠ|>/W>auoyJ4k[nk/}O+^."SFM`0tJIluY'M4zB?G:FD׶@aTwF59jToGc𗉿Y &q"cs]_-4Bo_ʽ8SͰ\ iUwȻ [ 1b֡) HXODϡS]lQknI«6}MVs@k(Q94m4Z_؍|ӗD}SS iw־|oSfŬʃ1DOC_ib+2h Յ,ry^o|EZS׎ڈ۵9ɯo~"rOnEˣFHw;CZZ>%q'5xPnME8M/iu ܐܖ {1 x9bԥ}E%p|`0*CwL,+ dYzRg8.QI_yqWS wNyJaCs"EN+8[+`կ)ͰBjNcӢ ѩp(e5/H2q>$[sK:i{D7K]NC;;\pU)YHas&\IR#E kϳ\&#8RrCNd}Mǂ4@Wo㶕uW/%BXcm ~*IaslpIkhGtOG@5dG_>-Qemik, B`4q湦p4GY0=Óc.{WT+RÕJ%:~5?%,h:RMjt䏱de@%{|O㮛:]2Irf `?z5ւ8s<^gV*MOC$Kָ<|-!7UZ3y}-s?4ox?V n]m#-Җ2YiEF- G'kjiPGCzk?t@̻?%ṈѤm~GY>g# IVgW>?__/KjI%TT_?l)PVqUcßƿX~6 ]q+V E:nԬu *osL͓^G=qWg (__sK_5wAԼ7?W5 e}~pq(W|.5'3\$]NpxᯆX?M?'Zb8_j/3|n"ڑWs#᷆qX>&NOJ8$S^#_+l^hM-,n&XquG ^$Q[U `c(|1?\_ S/^zWWGQ,$o3e0/hZj,[nnS]^k'<[WY[TOW]TQT߸y_/ 'ֵK((dt#?ΉmyȧW+E v&k8ҨҲ6yNSw}OGhm¯ %l) v 1e{I#_!C4ƪZ+|gkPHu+E +a'px:?ڷC?j >LWz#mKtkzI:M>a=M&3ԚyҹV"&}_܋ZRp#ד]W5? #PGң9RRzqMIQg n7Fpl'|뿶>[x+ڪcy/_zG8?kʙk7)S4hu{pRLjBGl +"ZKid/gߝ+68BO"& ;k'ˤD'Y/j3a4}|t_\~izlZq{͎Zq.r~~$e3vpЩaR[*Io} YO4/ŒFmf'5芔ߑ<yIm?¾4];Odmضsך\WC+Ԩܡje|F:06՞_f"t2Tv t^h?KWp-<7q k>5? xzeaKo|s#6WcrOp+>jLFo^ Y|:ީ,U q&>OteGtj1@}:_u^IMv~ })EwbdSRܲ._Vp{#o3_'*P28շ?/C!](5gC(m#73Wa&;~FMY,}i^ı&Yz><dk :Nos NS>|/1R̀sYߝKb\f8g,iԫM9>N+'ЦlToΒ[Dݜ3n h)ۘgXjZwZG}ßƿa>'D^Ѽ09+v_?a^g`e?SWGs?Cvq3_8MOrВ(Rֈq&w/ǒK#3RG %/kҀx¯zG;-ʳ aۏk i4s\W9Fc_xmO?_Vw. g|4/x^YyUBpA+BT&8,M9:oF?gtWxuxJ}:$P#Bm >6dߓ_+RTr?fk;ֲ|`?O6~5dY5/4Xd4 G ]1%UaSd;Gce}i^ ֵ Y$B0nzWw0 ŹV3N rle=!se v_ma%T_3З9N F}ҙGM?ZXZ}ܱsC!u8@myڞM.eG'jH19YSv?x9As+~fӱ_ wRIi.Aﶾyeث "xwe-kӼ?0q=~L#up5ga&pxЯN½~WhfyQ'~#{Y/#֯|3k6zl_'nѾ$#Aj284(zEIMˮ <dGC*-;]N\_ov=zxF𨗙pHG5//s R?LkF? 7.3|E^>2ɳTk7x0Z§Z0Ex8T|A?#F//@|Tjzpz.nɿ¼C M*nd*IZJ3'昪50f>K kľvF]pumc RU=tg?&c_QdGK n +ujN[qvv=?χ.+sɯ#i=/@&s)ps]q`?5gJnW~i*P` l%xWpq.ViqN@p BTõ9$#[U]NZK괥t1Iz1o!5Xj*DG0J Fq kҝ-[T__& _Kd w2/QN B~WoT_Q>V\g5?]_>mW[=3\~uߍG\I_eOa߲g4|/kߥ辖 i. G~c^o?? g u(=݄bv8%'{\sտWk¯LSk 6!4ᐝr6Z|(ȿkSzP?7ZsK-_3Z-r\Qi^?`U k_YN"EI>l_;VObx֧oq;)#:r!#?/}Vr_>+#sڮtNKSqMTu{]];XHr {Q?،o}xRN-Gx,Կ5 σ!֦ a#}5 ʄއOXxΉxk3R2_'"=zOЅ}I#mx~̞}M+~>oyUky(j;>ռ7mi㻭6y$ čT?tᦟc*é5ws\(hSᵏ$O>HRv>Z:r@ ꘐ8jD-گ">ukH ^Fk}N\?v<$x 95-[,iGjS~_ʩP4uΒ+''GbjF+'Å>$q U~Ϲ[?<%XoOOӽZ-dr23~Bxa= ?e*|/]tW۴}K=O֔/6?s:p/S_;9t>"K 'Z?|M|"V:ƥ fE 7xJ9_Q5?zOxSv-kX9;seo1^ ɏzFOE_[E?VʓVdJ /ã5kĜY3oܜ`SP6Z&g'sq__=ލ_.&C_ b^Nt=#$k}QXzQ_yCvˋ njBJ+yO/kO)ݭxz[I__0{g>ozN5?ď xW=m'L.m#@ |m|?u?e^vG&v^=^I}EJWo3(O⿃uπ~)O͖Q K#>u_2*wEpj"*'s_6?8~Gs-Cš]s1ŧapv|+ؖ>*qop? Hldt0_oٵq" :Vc,l-=vRQ[Al/{'+1A~FAD#_Bӹmǿ+4I-%v,$O_S]eH/Msc봲`ƥw,?ֹW#G$@d8'5z+v{hqJQ!-pRGNĂY $__~ !a!gq HUcuhG2Z*&?K:=(Rv¿dgᾎ'i1J}Gsm9 =N|5ѱbjs`T}^n~$4v9WaqRl~ׯ>xseimf-xr6U">\}yiHϭ<0M~|Wu 7+}AUb%Xp~_EOo_  .#0 ˥@p0OGG0Ox/ᔑ# # S1ԃd83Aΐ]v?&NZ/ &>6UǯLM5Q-0#G=_|5?x̃~폺hkW#G?/6J~ >| AT j8?~”}B'SH~ >? m8$=*)U c9?_p"øcæA޿U#0>z{Y/s/xMkͿhX/<; pEP0;Wg<$zyco<Q_tp֧N)p*N3+L]#o9 K5_ [? K) |O˷8uY~x<ѫid|75y\}w|\7"ƩrIR>'jo\1ٯW2`ChԮ%ƒKGWPuK1nZ_ӿ@ieWIncUf;hY51>enߋ N4,k^~бml2/_?T8"Xf8/Ϸ]g|ѧB F*Ѭϴ}R5۵#$~ЩjܕW_n<]أW98M*mYK0ZhȅuGk5(Vlj:9Mnx=Ӎ0g9W~Џ#a!YcjP6?>lo9D_ܟo'ie_f1ۑpŧݭ]76Fq魟 "[?}[}_U?%s"8b?tPh̊[X> ]͌Ɨ$ĹsGTY/1O]w-cflަ/%}r_ō4^gy>?캟VG޲x~xۛo*co*wFNU?{G7mHGU`xjI?U|ےADh7%OLzn4eT_D~ǠGMoO]%妝ꁔ>{ݾw[}xG/h˨eGh, b"XTpӊSlW]G3`w9 kXc/4~jx .8+)T{߈[H_k3!;3mFsɯo?_6qw=q0ʒp{lSSl +G/:LW_~ ?ƾ_K(s;[3iOSaO6@k?8o'żq ?'}^?eO)Pҟ<|'K |B5>!k_[7$i)9>v¡htb7YOa ?ƞ|KO"u?^ T筊Pm\ڕ 5gc $otx1ʶ?]D> NjZ a})7Uӏ?MU"Y_yUkYIigTQv8~hO^^sg||N.oC-R"f2>nLE>oo;_%.q S Tσ*8˚=JkCT2PtR)Tic0Jg/'|!jEB`wu柴rs8$|JT`ݍٶ.hBRѿ# BԨD_vA>+Ԭuz*N`8dzWtjRu?ErgY<@SPe?1l2+e}Hrg|'ín-97H2})>ay/@>~˟Yc_ IɲX+o 7Ufyrxt_)ur1؏?]ӷwuќ|=D'` ?Y>x6R-]+6nzWIOO|!nE}MVxuW4i9u O혿sAUQO)[C_kIGt'b+澈+~;xRȮLV:NIj>6_h;«g;JupFXu\2.* Ҷ"j4~ JturfK qtA/u__X*_j:?4Oh Йc 01@Sÿ3ԟ$΅-R\мC%]/ٖ9a2ƌTe[#1k?.n|>Su{fKT.q$"4hROL:z}}crxwƶ>ԞWz!M d!BI8r@Yd c@o𷄾%xcho4_XeK!U:)20 \`摤W zKN4(t#Kpsy߳Oc}oIfI0"+i2λa@G~ןR|BQ[G{ ?WSe@;o5/?ڋAa >(ibB+>˹w|?? j<־7{OWִEŖJX95X-.\a2k~?h  Ɵ;cyys-o͆,+ow[ieVm  ?g=2ZYgծr>-»'A aO$*?kGG>hZݦ>5 (feʱ3+# o-7ϩmQ>OTg{+y1x͛L7NhCY<>ƭ>sh-6 F)+h#e~<|Vσ|sŴēJ x5r FV eBC,m}'?Ox;'OMEᕏugȋq[J1upx_GcK7hP*-3Xuav("Mۼ[4{'gۡBh,lXƶ[1R,"m S׾|5J>d i^!-bO˜dA>CMJ蚵ե"7-zl $̡}?.Io[QxL;ҀVZG߉ V\4L8AХaQ~Zߌ|!oik .aV'H[>YuFp8rki8: 8U&ƀ=/m8þ"NA ֖bs4ZA'a"ƣyG~No(a] II+#8*%QE__%˯}Q/>_T~>>Iz:k"yNɟ@- h˱_ϩx"L%h;-Gqo)O$51fAd: Z|ANXhR+,[ј<~OVџN 枴8c:rל~|b3uy x?iOX" c_@쩕ɯsN43x{Nkf&=EIOj- cF)Hh4WY?U"V'B|t*>>%iE=}o?4h5}'hu~t|/SkGZ_, n&u?d?%'9 JO{Y^Z)AI)7ssĵGK!EQWi~/CįMFK-6zWcRObͿyI>Eqυ $ JHvze ~ڽ?ׇ#GW9#'gNx4xe,r*qd+MSPzT!*ɯu_O#<+U|nD,.J[/\6PUqg۟ iYvYqxhօDςF[ŋ,=iR5v 鄁?*9)mcǏ5PKB,DF:֖@(ʜ;B-XU 1zυ|%xoL]66fh$P*ua)XQ_ɧZ?g/C]B#0_WP_`.]foLqA)zZCqb`)S|,R[d) Wm቗t^cz*iQVw<,!yo*nv?rG/_-^d??ʓ"}=/TX[Z+CŰHEr(aJRJ[㶿DKҢ{yg7̛%U} a~o+3A/u=&j2'[[>4>0^av?U+ п߅ ?XxOW;4??,WZsx^60q\An>Zhv),vs2!sk}#8oAN@Q־ "/o y8E K[?Z8ltub+Oٓ:ֿ{FJ\w/,vq8"5,Id汼QRQY!|&ߛEfHY~q68$`}yԔW̺ #Rxa_]4X% $d>Y)p 95O#|a~ҖIa!/UTPS,(j+l?kχZ)>!Gwwϣګ \n lsEC}[Mhzg4f!Gnܻs=h=^? >)=έu$Yn<p[ y Zi_ |<3W]>=&O,"7# Ȫ'f=b-/΃|to+xZ;].n&y)x GnWWxC5<mk=+^AY~#ȽT4GQ诐<U|nޝ0>婽{Xs*Ehɝf/oO k RPy\ğp?WLkDji-_G/ÛC=6VAkkws31y8@SO{\_ֽ)h"kƾ%ckټ"^5+cxߚmRcҐZ;(#_5ڏt5}-/t6k ЫS,R~gM{QE~aVk RޒZ>$]o+Ko__%|ir+;l* G<&,DsBR&1w~/5E~{1&H=#C8ڿ=P\9_pzKџ |%6H}!FIN_bI᣹"}!> Ǐ^GsZn+|,mL5' .3xT4/e4KeXLyVA3ktǯ~x^Y5KI%Ȫ5s<"|[b֗u4{n#8+Ϝ>`摤W zKN4(t#Kpsy߳Oc}oIfI0"+i2λa_i0iu~k~i&aX۝N39csF$|yc_d#u3p׷xo'_/hZNWW1ZjLideE(H9JN#w4[Z~jڌcmwW~?"Qx#CZmi' a!.cD匋Fq!]?xwT湺Plf0D Eg! k)e>0|9W?Kxt-$^\é Fs@A?i9/e7}SĒ?طeuys"!o*܀ ڪ 'ڿAe?xC\c>pCQl)$s޼~h?U UUV3I`]m>5>SW;gާ:][DX`C4MT`Oa^X e|NI5dP,RƲ `  s[TQEszOh:<yy>$֭.,Ί so Qv0'<@%Q@xoⶏ⟉~35WixR+ 5:ݤ$v@vtW ~W |.9G~Vm Ur;w[Bw_&gнH硢+~ʱߴlO5C_i;c-2+dV7=֥|] 4Ҫ 3{eg9x϶P [t}>/_:ĎqTL| ^z/H.[O3[5Bԭ&^B``dx*uȣjïXYOsqmsNWUmM_rx.|68n|9fs5ދrĉ⼓Þ)OZz+_346mǗׯ2xOHV%ak k{5+^.;pTrMt'OeO}WoAv?3>%3'oRWPA!̿?慠7M('eW7x:j7:ZF}c"6v_5:Y$ q<%41 __nIt^XҴ_x~O(b12:r>j5sicBԏiio5 g(O\k]mQg#s ["%M|_VX+i7Ɲy52\ss11WVϨRm-ZW 8[MK1լG?l4؏}5g=L5R>iگ'!N;s>ql__yK7&`}􃼰?ʯ5F m#}&WrZeI[1yo?_?-kែ.4>jN~7lA~`(?bA7?JZF_b|7ƟنWuxY[{1wQg •U^5k?὘<xlZnͼp'6, ? 5Gf'}Z mIMė+2f+Kn@3~e'"ѼW[?FerK#Z=6p7ooȾ(xķ^**h>!ӵ7LYЖ^/G sV?g\|gXֺ%?|f|3v1mW[; OYso;{!/';f|1@ɿ <9M~7k~"{-ja5)y؉OʎO8+Ƽ-7X'O7ӼfFAm!d+t'IlyI;5O [Gl?I;U<AEC⮛yž 🁮t]7O~tg{ukKI̊’A$;?7jEG{7l_,1&6Ud32& 3͞%?u1?}SĐk.kzȧXt ʜs[~č< ? _uzǎ04Xr yn(YHpKc&Lj1x=>A{y_ <},M+ltw_7F.<6y>||~!??[:uش=&=w`v[F|c՗3C-ឫWYWȂ+*2-u6 @{'Zxcg>.l|omZ*;o$YGkl`H<*9@ Pw|-_/|gMz,#l'hU>RCb ^–zwy<-j[i)KWƊ*>Hq8a^|Cuȳ{-:A(ZL荴U\ ]k Q G9Bx5i2|13= ||c/d?9!Rfu-.? BŘ{@Uf W]_ݣ?-6=FMS;yeV _U@Z9>V6&:qGf}KYxw*Amt9X3Ӱ5P?1_f~Ҽ|7SzZP>)E}A|ω3+`<(Tʛo#v+)oOՈgU+ƿ'ʰ/Oћ_U?/g_V'xjG9յ_{u|&?r p1o)F@3R`b]=o+H?|OMo+w@? Ŀx>_0vvdQ_IsHdC'kSP<}?ia$t.1GЍ~S)}% .M.s6:VW6_:=eb }x%Vk=? עpqy/?+^+Hʹ}8( M5<cƷUkJ⵻D?cW'іZ^R L~Ȍ.2naMaALhsWxCm#?GŸ E_]B@赯>  :YIkx3_Zubܣ菡袊āQB(`S ( ( ( ( ( ( ( ( >(/*krQ\ m[3^>{S(ʺl1smSz2zV?GR٤Mp㽗}.?©-54ix×gE| *RfS&XU+揆9MlbF9COOp?Wp?aґ_fl>4+5s;m)G8ہujG|Yxմx[W/6Y[InRs {ÿB=}i-#IT+~5y~#43N;%,]Nm"ҏۃ}C-~W6i?`u{ MXR#_U᧍hZ%HϘ=׉ cIU;đοKX̬(}vNov-7E.ߧXǟ.Oʟ 5ʾ૧NJ}Y~%.?$OʩkZͽ)WN V#'θ-jѧU7%ٞC'wG~!xCJi.]Xݥ<5f 9F:ƙ]zN=+/4Vq+Wy*8_#6u?b%GҬx^ľ 8 6^SK@DzcmG>Wd}t!j65 ! Ղm_d?F?Vo'^kȌL$wZ' ~W0?a.k&z*r}Zp 4aZ.G}x7_韷?W,AeZ0 3_ ?Xp?y؟%UGō$Oj~ u=CZmQ-cb2Q9ן2}%E~w|x['\ t[۽6]B;v3ڀ>44_#JPW_xV%խX底do,qz?^>1g+OxR?Ωjd76###U8#<}\Ğ:H%CMeI}[im?ZfXfvyPNxy?u[0|[]V]Kg]n_$2-Xr33H˸hxD?NK > zVGw"rA H>=?Ӿ4xxƚjn4ԃPi)fc2D #eفf$b5# vW/E;bEIG~+?T,m4Ԃ/ d1&Ak /TV?/ Wdgf?VlfFow+6.ۮJ?~?}!s$Ugm}G)|BP_ 1? Śk~v=]ꄌr2+1^uH|u of6gI"K/+q4[-KX6C24v$5N>#j>1nj|{= O 4`r*EohP`\ r95%ox'og]-;h*G,3eL*8.α&m[>>;}7FMD[UNy^ ǿf[nN3󿉿,oߊ!}*bnyxw tg<{k:nj-UUl!ȮI7 מwm&J[(AOc_~XO mi?t-*y<3hRfڴ߷EծÒ|7mHi;fT8??F~8uݕ%-{WVr@R0*H~':/_?A_>!t GJ8H 6@#<s_5Vӭ5EQ(0OC@ٗ͟RY5]wC{x>& 쵽uu̬ex_ożk{>=յi}1[lBCyc#yȮ(((>,]|CryB jXAc 9'e?~rqIY=ƶ>ȥBlc~Sץz_BSJ<$:o+s'%Ӟn?JVfqi==8sHG?g{UŰ˷ֻO?qd9,.@_#ZRnïֵw$TO Ersv@471LqЁ~Q_,So?Bv_O<y"!1n۸#8_avog׃ߙP%t-J 6C߁9oZ~ 7?3=7V+Ies\ד~g|SimCLK8庽$f,B U1Ge?qᚤjr-22 4qkgWqs 8ԪN^ K7h?33v(=/_x{)+ψ%%-sg"6;|-·!i#-jr@?S|6.G֋y^ImM9澍/CP>(0v%Ge?q\-/CR_  Կ}(_ogI SCg pT{j_̾U?SEr⧂O?3|RYA?Uڗ/=E> |]*1KN*mK΢jx+ pTC~8=?_x{)+0kW W=g]*=o)сݎ#Sj9A@3_+s 1ES)/nSWȖiQ}/|G/k7z4 Wap3]z~&گ1X|>qR¿Cu OKONڟjOj3 Wy<}OTW>m|͜g)r '/|FzƯ-) ܶv)G|pƋX5(PXZsz|1|GQb鿴7d?ho c*?qq79œ|-z _YK SN==z\]\jv/vOiPʟi0SMP>1xj°?Br8 ?'?59E BIeMKQ{2c( _^H@X+‘'}Z:2yhNH<_)^_֜<+z:(M?a^/Շ~HH.Տ[| ^>E7}fq 3n'i}{Qn ,k-{њQ<⏬K>V<c($*/Z×g/nTm}fq{q}?*> EIm;UP'1קˍ~ >ʃ#]d \o6m5iEr]v~Mw>ނjQ.7Ճ ,;-RXTIv+#N传6vWeP$5,h  zN`zf0dg"g'84r qPB"2` 皇nzPa*j4p3UFM#EFYX33m;4A_):;jLFx5PcSo9*$#;xR㞕 m1c Nx$tӞњMp5YAy>aN͠[sJQ2ӭTKiXp8zHmws4$ݙl2SU/ȣv$zWkMH dq0H>!}H'>T^cQYs"y㼃OA{MUOb+KSkV!n?jFfPEvap Z=PAN (LTf(c>1^ >P㎔QM6G30OV HOJ(6Ɗ_4vV-;OTkGyAz3BAH%ǕޒY(K'w$R/%@?QE.i}GH QE/i.呏iURg!ϓQEJ.IIOZ|4x(U%}@~Y)R/Í(ʊ+e9w &ΖQÝ/Ѩ9w{Jf9 UubiW.)*䍶-ZxK6~Qퟀ(D9VWZlzKoE (!4Q\7:,jGx}(dqMyڊ*X/<>QP Yx$QE 1 2 3 0 0 496 508 1 `DA:eXIfMM*bj(1rOiHHwww.inkscape.orgCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/0232$0100fotocx-25.1: Margins: 33 33 33 33|fotocx-25.1: Paint Transp|fotocx-25.1: Markup Line|fotocx-25.1: Markup Line|fotocx-25.1: Markup Line|fotocx-25.1: Markup Line|fotocx-25.1: Margins: 30 0 0 30|fotocx-25.1: Paint Transp|fotocx-25.1: Margins: 0 0 6 6|fotocx-25.1: Rescale: width:127 height:124|:IDATx{tE3ICxfB d58r,] b=,4,1HXIpݛNey $@a1 yL׏3ٞ̐:IW骮 " Li[U-'~KRT,~KRZځ֨;wx'h4+K\;w/RZ+p< wy:ģfJ\q^`7,G͔Fؑ=< 3 l-_8oP V]xXuRTv;wZ^rC=ήJFQFgيO>MŗSTT "6rss6BBQQMJJJ%૯js15j_bbbb۱Wyj.YdpaOz%M:U\4MéSiI<4zĈ#f?z)o\iii@= BB 99-ÇO7"##;6'_U*F "o]5MHH<˗/4yd׿nرcAvv^o(K,Y,rݺuRht;w岲2={6CP`0@QQѠ'NY~_8yÀL0a©SN]pBIII=$E^jY999@Vo߮h4ZN555->.u?sUWW&-Zw~)E!C noޠ仕;w @\\ũ6m4ᾬ,ܛsf͚5ZV j#Gy^z=0 { 4&K#GrL4ɭ<?~|zs q!W\F}8N)F9B[lr,\P __SSS+y-J'|*b sЭ} //(jnڵ;%O+W4t±,BȪUV+9_xxxľ}g̘1CԩS*_,+VH;8{,(ػwWǏuv?Ÿ;vڵ… :WϞ={?~y#+T[VEEE޽;JґΖ>BVcƌ벹u떰Wܩ3hР&}{"q5_[[[7{rq/7t}PSS#StuB. 7uy߷o_vS6lׯWVVV%&&&zj*%v,6yln] 0n8!R?|#11qBUUU57,cuu Z;&Iln؂>\z9_wOBG9SRR~W[[['Ţ>M=4-oujݻ7[Ak^TxN~~~ô׻ѣGte˖-{;~=zP -iiҁ_~YbgZ=>&fff } <χ<_"7ܝt:]~N|::Knn19ZZTJ|^fn;$տBB;!C}EOgKz%Ѩ##OK Hz^R<FرC>fc0dKhq ٳg9N N|+2%viisGܸqCsQMff瘘}ZZZK2$|꿨"##좣ի[,By7pΜ96fcm6-7háŔ)IWHHHԩSba݄ $vVUb'* :t:2ea#.;bBs*8~w^ (!ޤ$ƍeKrr1===b1}Ϟ=Dgm8x!/%_z:w,9lB6-i .|X󼦼\`ĉ56l5"OҥK!,, twDd.Kty 0aBҮ]v틃nyӦM+a|_[ǎѣGd4e/ZBhZh4 Hw9?,˂f]v;UAJJb{NN>=z̞={v^z5{YYYe˲vUUUrisK,m%%)M_SSإKI ӧŋ%şs%@۷o=#?CnۄYah4)vh4n/ދ<+OQT0˲{f6^xyRvvOFKq0LINEQA,Ӹu&$$HO>"<ϣhtO7 f)aZl6+~S DQeٿIv1b)Sײ"9s$عsؔED8<<#K.g _ ,n_hIII#"kcF"0k,Y?o6={֫ !==@V1*4LhaaaX^^y$Ljk׮ə,i0 ##.^˲  (Ұ,YL8vXٮ٧zJ1zK?&&Vy+`ܸq[ߏ?8peE@ç( X@MM ?cI_`$n^dGd8JJJl6ðaw FÆ  %%%,:1ZLJJjtP{XWW(ŋKϝ;'qh4izp%ӟ=4jZ4iܺuKRY }YEr+V~ٲȅ?( `0wM]p9xw`РAMwŊ }1z|wT_II 4-ڵ+9sQB_w_-[|9O6K,Q;+p8pڴi^wNاOh4;we0l6{u!, -1bTTTXoXޑ/iUԩ:uJ<xBp >a!<3g (0pB /LCDiyvaY(OtR ˁZKK >0/ȁ_b__|!FӴtVva d"]FF_ݻs4M?᷄P>0#d>ի^.Np$jIFDzff_kZܾ]2i~jfDDt!?C߶m݁ Y4M'"beU4 nٲE|5Mc|6 ¦M~Æ ro4-M[QOӴ AV>_Cf'զ4= +>S_v:aiVbZ |?)رu:_Y&4= o)ܹޓ`fgwRO/QfeK7=ewROcxSLa߾}iiiryaݺj4=S8pŋaf$[Z%| CaXX_/X}ݭK>Mӏ"u1 ;toxdw۰Z|Aībyyys~ﳻui"!|7s̑]6a)S F1/!cǎ_֥o0b8,Qqq(/i]6a%֥o08NDɓ'1**/g̘ |ur+X`tt_{Z/b?ݺbsss%e/T47xZ/eUhq{Pifڞ?u'O@Bsss !ף` gyFv$eZ^ס~ƍ~(Gw/>dȐYa'lܸqg q_XXd2͵>?gm'N3cƌ{BXX­&in!{7[poo޼ <̑'|:tp_XXdzI{yV!.}s4rHn f2Rv;d~qqevdd$۷ >8n wLv4$d~AAA M6Y''бcG{M& *x?˛|՚-|.ݡCf{mGQ`ڵ]t[NÇ!**maaA4n;:{7%(ZՋ٣xh7nȕCEL.-sdZvqq1Κ5 ޽{ee9;;'UX-:OӴ$g̲133322pƍwyZ%q9!C:Uɨg4=efz#ew%{8|=X] 0ͯ4V%ɲ6D7F㸳 ,S>K ~/ٶmm۶z>d2266v`lll༼J}w1/Χ7R?**J~닋󋋋~/pATLU^j_RT,~KRT͛IENDB`fotocx/images/remove-halo2.png0000664000175000017500000015411515247006660015312 0ustar micomicoPNG  IHDRd IDATx^Lɓ4u'6w̪ "[i1-MQ@QӴ.=f9A1Q!JBRKf>Ң"#|yﭑP̈HUL͈Miw"!2"!!29 :#D0 -"{CDZňwS @Ueڐ"bkuGwuwDTqcX<  Z?o}Qjm!N{rp$sDDوBj͜1Й1ͺW'e$uq0fDǵeowRx?rgϞ>}lܭlpZ;; 0Icg pws4p4HlC̺݁:j5.Jkbxj!7" BDGףּ7m̝]mfմ[70t kܭ32'Β05qBFfFF7'$LLf!ZJ1;zpt}Gsi=筻v N7^["%\N 0AԬ@wpw!b u 4$Wm%bwnӴm]~ss_>7nffN@H'͔ -&DDrpvPDrdAvBO?Cc`4Y̝Aс988dH2<)0%I݁}ۭuvCt::1hf"˷~ګWrB9K[j3)%D%BfeG<{8 ":hh2YUB`jnƹkX bf5sr? SJ9뺺cxN4ٌe谿uy70""2#:; 9G ; DwG&n`mfg3憈{~g NtWk(U 98FƙX'E$'PwEp@34t$D$PP)+\g7(Ym ̻pDD̄dx20]]]}u3!z`nId&Ɯ83 uUuS"  &qpP@D u"w"$@7Tw̹`Jw}뭷Q"")11;;3X{]O SmvH(j)݉wbu1LC"6F0ؽQ8IDBp[XAdn̬9%"9<Ϫڵ֦iJ)hUU}Gwq̆!34Mdw'8"b,RRy8X_Uq|(&&>=HN js;82K6O>K:3yRA8 ɺ"ea"k;772_=@Pmn91v"tA8k0@ 8  9"yV5w@$"9f,M)375Dr5'gͼ"޻2`)qfn` ઽ[7usN!紮n5qrNfZn7Ϟ=9պ"£Gk]#{7l6cJ)b]W3+E_!j)%$4I$%r3kA)C9lqwtaF< R y?cS|wzu!yOݠffnnwn_Jݮ.wfd$0m]{zI|`L`@B"!GPRxxL$LĦ{#aʈ::#" ;PQ㸟df^!9Z.T3G5M...q9Bۛ!&>twueB_e8t^| ؍b&$jb&b$Bw ’`: ; K"@ E3hV:2׵ZHn/sDfnNq,RffnfzMMXH%P#!2'&! "b@s! Z V13%0n #pO {hM)2/a;n)E]{7upp }pUU޵ffnn)vMNeffAbpsw1+C]s"RJĎy_2x<.2'IuV2Ntyq~ws7T9{/O@`nhtreB?BZD w֛#." N@ 'ֺ;3HŘ( "Yc  7.,{ƀ1WYJ1;Dl6˲Yyɡ֚sV;jMU]Jʉ%fIZk;ɧ\DP1 Ġ^JȬ LDȪ)xAu]U5'`fwwDGHǟ|؅}N/>VwۍptWW% ˺^\^^^\յznn%nuJŒN耀!(98! !sp7tp&dB"$ &VNڕR5!&rsp`b|̅]  CܬwuspwCSsup@@ Qe t$ Bbbbd!abtnCzumm>·!K֮u7Ӯ"1RպLtUf/͢t`M,KM)h"l6T5J `r "KJzpw&Z%f$¡Rf//. %aI"'3׺H"ffB@Ddf""D 3-."V3hfQ6-?\'1: }^KzAy0MM812 x* "8"ZOt"'Is7øva"[uS&$fO"B!DBNQaЮT13O99898"pbScb; }]8=zH-kbAG튎.uԶ{k62χ2OuYuuUK:iD{k]l;Tn9gdj=DH6ZYp]i:?O֫77xZU4M%KFZjȀ- Cr!f$^e:iy7NBս–#:xwD4S5s9vuuw"Rsw@RAPHDf1133t,( V7@X8jIHӴ.ZWB)mzS烙q[kf3qݗe a"Bbv.)FDDDzjC@8G:"|k!1D{"F0!Z'Ow0q Rk !QK)(e92JJ[kn͆R""33"zF+o2M1m"Z5ԃ{G`u~}>}|RgלRjwpĈĈhffAHCJε99cfq|Ɖ"'Ust>>nS2D"@  9Xs{wO)-󢪀3 >/f6-fP$9:̄{c! 6ޫ31In d#Qp"{eY'?[%m| \ø)!.9Aòo/_LL8ڮoo?T8]]]Zlbw-i$60"balDͬ 9 `3C #":N ':}E2qSJj_!Yn8j ,D7om]eY: ú]= ,#v5SbFBB7?L{ϩb) ̍oQP5V#@<,H__c!6n>_q.y3ŗh["Jzǟk+I8-˒˰ŋWn_f53SVJ&<π0n+9ETE3[5T޻NӌH<QJCj˲ Ng/'F{4A#3 JYbzi µ1 s[3xp"! 0`b1Rbfa4yD-%%P37SwuQeښ8,j@,Ă XJ_BD/bfÿZ}jSh޼QCr<=bxc'*yn%Mk{}}勛y?yz@\Ukbl9jk댄˺j,̪Ã1wֆapfCDFƅY)e٤)̎4fN){CB1{?5Dz2Z+"ƪ|<{,VuyyK)D4/+s${Lܜ0.< [m*"g&9,H{2e$Nź̧ f>)z 9R>_|;o1z8 bg@ ry-áȊvHkח^zrJ< jL{k:盻}k|x8e(sNL5Siy%v]"by6XHcQpֵU d9jW$SCԜOHq:aژl$Qʲ,qKI)!RX:0 1gɑZeٌ䁅<%I)yM[cmUMMC" p֮ZB9P3pp B3O2"$%o|?W//?݇HI2 =}0nxLԔ0nRx!'qˋaCb$u]EJUTzkPk#7x )[[5%RNyIBUwT3|z.G`f̬zz0af3 Cr!Ch٘ RJ{8_LNy$*&rFDw'] )дioff,M{mZkZSU@T3K),({twSd(%"aϗe{Mu 7^ٳo/fx e|ێө5C,ØskMNe("L󴮋R3o=ILCQ0 <-5G3cM.C8ҩd'{gO\DCB qg ; %N,=H s9@c"U]5.rvj! IDATV9g& eLĪr;@lw0" ֺ:@$[m]L 2\"9Nz'"CRws"s1rVgx:`n]ͼֺl,˟}Yū/_̵i67s%S)CoZ%fuD< *ZÇ`~ɖuS0p l/.9giat<lp8lDN%I:G)~ķ!mqgI3@mP尪9H 1hoz733+x݅IDF ^NJhko7ㆅ{793s7;rA~OmMU=RUK~'!f/~eY8z뗷w7.KPu:ށuIX,˴NG7mmuSI4573yj]k*=oyT__ o7;ۃznZ4{?y D>ow>gwNN̈́gQ~6=zNB8Bb:"Y\ۘ%1NoN+2 @ĥښ0 Щk[(")bXkm'JbD  vuGu6M着zN9$&!b,t&lnijfLݝ%w!K u7%KάѺ̵!0Gx(Eܵǣ0fݶ\ɣG?@uwxuuHJׯ_Sa܈33 "uzx]\v;d EJ)aDD b9*9ygf!UDQǒ8b(^ķqCJ);֚FTBrwfW8'Zk9 ZWs`b@\j5b,I0HqBJЗrP,l뉈8?[n?#z.BPs$u\8}]A.vM{o?(B2/kֵGrww7WlKE_1eyjÝvqi5ENyءgƇ2Hbd $FDDQ>Zݗy Ə~1seFUCR Usvdn~R3[$00"Y+$D@D5( AWC\F[H`~bfa&?EtO-v[KK)[<߾^b{ַC~w}rݾoz_kmvC<i7LztE{.$ e$lK֫˫+Fu-X{k*GTnu;"_IG*_!"3q8"sBN@m,֔33E $`*iΙ՚j5IwM;ܼf$R0lv8D`f8$7Zb_F=`u'_ߍpϰ[3??x˟K)2tչ\qY֮2-󳧏.7<_62>|dwSe0D.w2zδޛ흛?}t3nj뼦3!QK,%Pmk#ڪ) #A׆}B̀fD]~8)YDx-){ ߿VvUw͛mz睷s.?ůLj>^eTp;к,]+ D9Vnϟ=_ErRBBv"b DD $hHFN>t.<9>Cb{(3Or@Dis?unm~.ÐR2sHb:ϳPbq8uຩg:/뺺93KHm"ɭiYW^3#޻jkMUc sG3#QbFeYSJ?y>OOg9Y"?~ᇿo8wwPgOۯ|Mt}}^rmǒŗ_hoocsfewq)"<ކqDq/.D0 30!{k=~Z7,TuiY?3jjdG]J9>;Xx(0-;P@$D@R>`%e2"ka{!`78Ѱ`f(¨jιVkZk\zdj뼸Rrfĺ4-˲xi^׺33<"Pjm ;!s9F@Y;GgI;֘9v6_5 ~淟=zi9] ono^vغNZwy(xXjڐq34^_Eyrz!ڰm6e/ ۛ;^~t2hԴt:mP|6 CAQ|"prr|ڵ^0"bUSit4TD1 H#PLi>?D /t~ƍlKъV[$JQ׮X)."2#1!FJGEl<942w%+%Xz)ˆRE;hXbt`u9 }qޅU섁x@NNOAIJ,{Q e #Z!׾B9ak]TR%)Um8sr`Izñ7yO) z,a49kDF|9* ZrJhXzmLJit9g24܌H1fJ(ݕRf^` ̀T@D ^=Ȋ!F !f;_BD49f1Iue<1MӸ9GDֵBDL\3"JCB b4ɲ, >1&ڈ;kN) wsYk1|)6*-˲h]t I1`0\,+o+MMGtys0n߽vp?3/R{$$I|g[ ܔڵ,OM9,e|>4M"im5i`!M>x1|m<"'"!RqV` t*QDw+pEr""R,3faEux˥uyض  H+Sy R!x\QvP!xgA Ͳ$KYumlTu8omnmCRdJ"U"(aE&ZWUeI҄4D7GPi9??_:#XMb(/b\,4܋.]?|TBΦ&1JipP$FAn*,O,%kOTյ ̈eE?2ݴβ{om炆m ,i4RӲvm}( A$Bm sXS(("u!(ER"r]T !HeX:FDmBJŪḧ́%ӈHV^dJ<2(f%h4 !0$IHV׍NMS;"YۆU]MBژ܊E>*5^ @No2 a&A5Lv" OvrzvN"(f@lSl<>_zo|ݺvjbl`&Q!uZOUZimUS*@l۶Ȋf &!hv¶I [$"[~KE.DPBSJ)DrK)?ϐ$+ٟW_~i8kQYM&˲9LO& L&bUm̌¶'6./mrР j}ˣs,@!ཱུt2E@kEыU666\6ZfVf]1lvh(.^ DPJ0x۶mme"HZwag'"~hY,$I,z Ig{=|hMU#B!<ϭZDHTE{F$1I&$i1sIRA#^iKAX✕R䤪~,!<ϵ!xv$@s&QGG{OtQ ǧ˶Wi AoۦW]9O&rzzp|rx|vGB}ڍrٔeLV7NRB֮u9"B)Z)%E:uxòoP0Pw"9w)$(QO=3 ⍎m;$ b[ +Dv#zڸ(rk۲\F;,J!*E^9wyh6ZyyZ먚cAP@LbV:9ŖXi#X9d@:N}U2N@۴U,"B <ӳ3$:Xwz|Y秚D$zUU-Zd̲~6-F.XONσo.n>wY|/lmW׮kϦ卡C9993UՋE51I.@I z1a"UyEځ !28?^r%/ơuT8Vℙb^'$nm$IDYB 8s.S!1q*zi4i7`8u)z|zi"~TDHJĮCL6jι%:A(V ںmlx<&YE 㜳,SJ7McUJu]dy~Є[7]uec:٢tmn8oӤFc(-xq}sspxm)?Rl|ލׯ\糩INlJ-h2 ZS72YJI'SfPZGű'TDZm.^/!PgB+ ! YXbH!)D(EicDh"aUi R9AHJicpa{45Msrr7Xk|Hk`%"J@2{>;um ,!|Qyκ,Kc6Dʘ$ 4ooZ"tɲZ [k4 ^Qz̤ IEW:2liFgi6P)S_;NNOvNOP)Tn[k䈈?lZGBbx4wQƃ,CIEN?x|.p[W7y?wB`{8IҲL * !ruaοgTib[kLH$!5fğ Q{9HFSGWGt}b;{kiꪪy4((ziygR-k%iF{Ưc85!@Lckqж{"jE9Chqհ*Ih4)T[yb;Eދ=~Q?LkJ͍&tcLs|{zyrz)'y&hmQwk!Z5"޸upis89)޼:9ҝƤ&&[z'IT-b@8?x(͋˗/QBIs{ @9w̫G; P!r"W-ub8Sk v1✋KVk繵*/Abak-0+c/oH"R m tn`MbtZuL8(%<{ cLAk2@4gD71  e0 R&˵n IDATf׮oVM[M' A@gw>I͍ F\f`D8(Dvm]W\ Y9,6.G.kgOY+jAüΦsʥʭ]Lg Tgƽ^/sl}}-ϒKΕIۦ ƨ4!""עXIl͍$ɂXU`QJx4ƈHMu}699;;ZkCQx$&󞙽tfhş !D(k"9mfO"b1s]`` "DDJm֤ b9#x|LDyy7^[hu˗.]6oEaH!bh4boooӧ'''":k{bq*4?ޜs.3QVoE$)"~QkK[m<fyLXEKę8b'Eu"""TZ!(/z{bƟUWD)g q>Qy^ ifj ݽ w7|4g'㧻u,zr^5vv>13TmY=4#J|2,I~,A_ݺ=g}7|=cԑ^e4AY5Y3,iݶ^u06² 1.n\^q믿~p8>r\.Q)xfXR6e]5MTZA8[f aֹ xG  !#,J#QC̬T^S-[  \=9>;}b>y޽;N$[>|dw|>^hfT1&oom*q6SohM^s,xNY Y,$+\>:)w^<;,Bp*Ԙv(.^o^5ܿㇻ{r^Wu| eifFɋ4>ݻoo''㳋E23[kUIhejcLtmF cfkmQ*AD4Ͳ,gfu>g*7wOjq']e\UhAoqnCDT_} hXΏ!욦\>}pt:ڳ)66;9?y;̎OO{GUixX> JC(Q*S/}$ PgF_&l[;9_pPJ;ǗUVd6[M,)cqλmyVU_x/?w;rpxXEY.4Am6ѣG믿~ڵ)"g8MSf{i?bHDӺzRB,˚qYk46ZExj&me>_hQ)5 6Mcɲ,l2Y~سkVZrEm+"y( RɾG$1qD, Zׇy:?;׊-{~O>ydw>/N&3o91Dr}okG?x}'v>=m__>.K(KҤiI౵3!*@ ApX,_/s׮o],mF)PQ ܹC wwwRqSFLĠODkWOGz۶{,"z1As|3c@,r".dYβ4MhnvXksU];yUEQ!/8f'$Ib3 6"RJ!F]̝RJO}ݵ奭׾}o~inyQ5qO%q_|UU{д^+MksyV$d8(lw~҅+<e3Wѣnyu~ckdrXLUiIӼ Ё9A$c \.77~ݿ{xxk_?yfIT@΢aPvwvnݺu \"ƍ *Yi !h0}eJEϼk.!mHJ)d:2@$T",QR@ljS6uӶZ5ME0m$`tG.QthIDBiL8IFJ$G0s9aD@2=o}Sӓ݃g㭭W 㽧'Mۨ 4 A<"5-[kGkkpmcdoo6'Iz+5Y?ΎN>Y߼p6xV-KcV1@^wnܺuڵG'gǣQP0xi:;@΋|xg'?do•J]/ K/h,RmC^k!25F7_|zz;;y^hMeY߼uc>G{B̤ ]@RuQWщ?/Lgmc$˲m11 qX׳|!u\cf9Dt!R:  (.h .$I,tSV_j{RUU[ QDD޻ʓ<5~[g" e!wmm< ^xdβoo{k|7\fL'rib8V6l*7al׻z^܍[7vvO& õb&M> Bu6YI]{pgw6_~r\ͷ~{m<}6 )m {ۺ&$M^y__[ie,!鍛7AR&1,q{DB\IRm$)tg""YʷCTH]\eEXP6I(6rdfc *$Mb*1&{6!"!0s1܃diJD"V1~"QWUn9'"iRιH/ ] vmb#Mh!}eQ666NNNkoy'~eUYOl.lm)YsZr6k pOJ7~wQy,k:+|F""q  ]眵.M3sn6^|Ν;{=)DdZǑ}7."@;J1mDcR*P%3 9 u]R1"ĭZ+iei/1"#LY$+" `xsMY.fUUWUU׵_FwF^od4>> %I^YX sd8H/l&"G4//^ڼp3fSׄ}a{k {{V۔ZcBN.Ԁ"1Idi]`HMXT Eh%ZV"ŗ^_}o<>>>?dYZ muU?w6Z{ DPW^D$t:EW_}ʕ+|pI,,XD)?-* .Kd@ 3<m[E)"QJ- TbV;yB"hvJ"PUqJ DtSFBGj8뭀h_yoeY:@N@>|d2r1{ ֫F7?^~W(/@uʪru]l>9ZZ<=?dZ_xkw\Wp2_L6$Mӊ| +(M]OY_%j}trz~^]|zrv?駟pksGaRx1  c>DD`@TW,̟R}QUUѦf"]h'hDafMZkR8It""C$ Dmk"NC]׭u!۴S&."BLT^ v"F'q]Hyu3-0,.O88ۖQMU_ܭ7>GZӃݹmΎ'KR٢-Aۄr^KY%-^[X__;=wFO?y1\q9˵n\߭2 +`/l1Κ޾Ro%2Lʛw"3i4 RFh… sr"Vweet'>+%X!.D죮LĨ4s(42b9wzŠmaG,!u$ |$Is(ܵ D +eP_l]4|rZ&@D}v15Uvk?::<'Ig ^SJ'lln$Yh]c$meYtyW^B, ͅ팽}hu|r&ַ{ iƠo{/( ئOdX}eDPJGk#'kQ[Ixm{޽ͽhN)GL|ų;]q&"R]"F}e"FJ0،uX:B:JcaA<4cc{!"A(RD3:W7 ;;I[ [o|i{Pdj9?ϲl?ūWn|O>}1R2]d\pxt.L[fT71L8iV ๫kQyk-dQU TUpͰz}*׶|v/|մLeӣy,?;x}G?RJ7M HD+`^ɊB) ` D\ `Ͼy>{GO"Fd] "$R*R:0@DF\ğ\ˆ0hm^)09P׍s>Hk#,udFG,xFi2 "2H4*f1>Ee!! GÉ Ab>&D>Jiu9Wmfҵq+~̦DLXYb̏><\___./}Edqֺ?橚'k[Y/oEڶ۲<+gKYVŋkI>)t>k7?s~E }k/kvgg6ji1!XD^~io86 `•a+A?88("j:cm۸ϐoWQTsCq !Uc,{/"aſFD4I""A!"uw%֬u{\.SZ$I<w9cRJLtӴm>Đ̬TwRmh}>kBDRn~ixҥԭoY,`8\`lNf(Q }jIBeUY'Q҅7\]omd񣣳gw1JN|y8l{{{Mc{yY4M !Iym>=~&jrq xADcb8==kܶm%oF +NDR E@$qH&!ULHlD$}Wa/E=?8;9q7 ^:_.~:S&ͳ,d=lG䗙O?bo=XޙΛ31чW^ya[!4m[n]ښ-Y_|9s[79iz;Y 7 z70j]^Y6-w OOO$!|Gvw@+0jBFc Jb֩+sW=z9C*\DOO'>N뵍Sd^o%JI3u]G1ͩ$sW I'ED|\+MD:˶\}N\|5/O 켟)'YO7W~>xx?7/zt:{oz)F_y~+2ˈ7ݽ_f٥/]uM?m7h̡ٲ&קU\ΑX|2IQښ&XV0u\VG'&M YD4ϼ>`0o}ч^|q *h"G4>",X)h9nKmsE|RU|04M3ύ1EQ0t:Gge1Ƥ9"فUdt JT{/^)e@|p{CD|`}bQ ? , IDAT~:?BiS~n,.&˪^~޲XQfcKgڶtsGgr`@d,SAሰW7|Z[e;]6M #(eۦ㲙ظRSq.2NNNA>MqdYrM4łQuOgpߏ@m[fβ, ˵EG)պNDyݳ9iGu"]ErH.[L4b7X,8BtVB"I)-C!Ǝ*"eHA7V"K@841C|hu{۷ou}ӓ}V<˶UܻudpwSҋ7n^]ryUUuv8:-?|Hȳ0֕ϲ;5?s)Y1b,jrY!"A%b󵵵mfn3#b%ʏDVD1voDdwL* !1%B. fNTæMTQb/g9!iҪy9"f(J#jZ3^#"MDM[m۶1{)33D 꼯AU`۪qK4eY=Y ;ǭAHw뺾~d7h SpbVd^6yX՟K/DX?dr(YްpP4G{;/<~s^D\{D}ggĵGqi@ufS͛ڧO2s۶EQԶxZ#pecED#MEQU 8H4eDd AZֵm@EAáR*HlA!ba̫5=$1&"D.^,٦aJ1h:܋/zE|FYEgŒJӌ>G;E Aх';:5#Je]3P;v4{tnQ[ EZEMFý';Ɲ]ڦndYnf%%yV@Rƽ/~ G }pQ$ @Yֳl+x&::بڵkO?ٍVJɊ+ҕ( 0`"2٘TDG"9b+\skN\NfR d)$F{PHdi!vؑ#j񇈨( L6=[0DQHBr^w6P9 ("eX'efEb4aԺ 8@`Rd[kڠ19/gIn\|rl(]NmlU*9<}ŵ eLQVyYF'4Mx~v֭ͧO*P+ォ""M޲,'_ M̜eիW˲<۶%i:\R nq2gV!id8fd1&X^k 3?ٳ&q'gokn,@B P19ĉ4Г# σdO;mR?w?/w;zxʸ4.ts6o!&F |R. \Tb',i<==K'tDdy8/&Nρ0~~G0um{j#eQV6aEU*rCc^JKރ8m%O-1PRJ40 E,¶&[TZUu7)t]琼MRJ!L9˃}uk}!\LWujN9|40*wyrXK.|Ɣ=ܓ)t Ӿkz}߸Y4UAJN$A)fL|{ǬЧRZ⼮9eaaՇo|[atǜE@ ptkWA!eK)0P^|W==CmHUc0H"@y@ʅE0iSX5"30 )%@캎KqLiD\AlAr^_Ǿ΃' ݦbX0k.9U8n"4HX’;O1D4Bն{W?ڵwH*'1,iQ,3!}Z8(PVmZ,bcc?Tߟ-CarR`a]UuF7YojUu.s>z7T$1Ʀ&T뺪Bzo.??>>>6RJel!1fU:B2|0\sD[q!qnf.m[EY`ic*!1dmLR׵2wmkJU뺖":*9ssӑ!aιRJdRڕ~H:U̎wAX+C0Աγz?鷾-[)l""Ȑ[t؊HUl^F f0RHaXV."dū8Qk^,ιU5xc/ c\J4MӘ|>qX(5= `] rDλ`?8ڵNNNK/ZN޺כUP{1ø/JQY.GrBCSݝj!ݹM,~??vw䵛vŵjl /˯~k_m*&0 CADބ_+9bz7O߼yslކX*׎^EG޶:3R5;wnɟD&.ފhh`Se:L቙a"{I9;0x7= 8mI),{B;着>X|Na[39`Q{3 4 ?;<8:87d(N=:;oDZ:>9Kэː}To69>-v6] u]wm۵m{\.88_??w;KQKa.L1q1FzX,Xk_WՋ~8"-[EaR"(X.GKA"{ &um!l6_."PW 뺶ԉmy]E=39vvve.%4  CDQEQ XYD|=y)"~|ݜ-7ooyhXͦ|>S,H"ؔ,>Twq\b <ֻe+W.7M]7''J.ݿ^}ƃ+@.|xbg7TJ)G'( fiۮx1Ɨ_~W_ywU׮^vޮtp PUr7K/V80 6YK)1F`TF,b !㤐AuGIƟ {)<Ɛ[g(7~}׵9b1Ve>cY,ML6!\rζ:qR(\׵nm*9iS=Bbd7ПB׮] /)'Of8j"׳qPoEE}䑇ٕ+<(yu.4zi7n7|_};999[łյvRJI O*9"p)R/''z뭒ʯ=םw޺uvvj@9G{thX"$$^ϼ/=ܧa?_zuD0;ӊЏC? @c DqZBl*XmP6*97V\/s̒Ƥ *")qal6`~sM8a1%}Nia[SUurxsΈNR{lZ"3~y}|;w8w~?uxw!!sz~s/ E{=XUU"jFgwwgԧ>կ}ƍ//9;O0xDZ:)XDDM%ͤ, MRj9R@&3cH Ly6M6;f>1WUDZP31x7Rul6C+WٚE23jD[nUaO="m6KS-&/NOw_,}?8)VjB]'j\XYbU1 t RUBɉn!k!?3?rb!.5M?3_x /?}Ν;#{r&À[D{>PPKCu4!}6UUh%u_xU¶u `izIU 1cB.U YXTa|^ul*H[sy]OZ lƈm-BCUUKfッ̑n6;%<|zuP^o c=stxp٬v|R$ MձX!e.aΜ3"}s12sM|XsH9uMSjw>_{'>O߿'/^Ki$w݋/KZ+ oO|L\"JiݿQmή^#ug{IEcs% .Ę8Ph,+)RX$Epgg.(J}1m{K)ha9MfqDHU}e35Rb9I 9gCXfV}Aaf ޡ{i %2Z8RȰiRJͦn E٧!b=kn`[ak? )Ѓ! Kӿj)I 5 X1n~vӵCNWݞkTqX/j3y>_9z'Y.壣G_gw13:pǧm.|vGWM1>aH;}Jӌx޽fV(Us!ª*R|4gݻN?;;K)E= `*1=K9m4T- "9O{9p2Dj Ðs.̬"`9[%={5f䛦("Y,綶*n=}9g݊Y}OܥB|{@)Q9墈YyHٽ[w=|ogz?'4S>؍2qs3Oճw[_^N]3rѝc?y e;9o]*&uNuDҧvQ ~wwkbeslnh-Ddkn.aR> ׯw}߶][ZHM"M)[.FKg>f[ .9 R9ubl F|do1B Jض8|\\\qfQb9v[{=n,u ]ƨ,RJ) 1FS5+GD  hjfAu]vwvvv֛n\?>AIcl9kܻhw\_^KRV[T7{{;US|oӵǮV(n]= (0d`)̜sιRJ$`o>WU톡 Ǻ:RU뙪[%c}~2ҍcFzuqqUcUDdnwC0 jfmيeqG791l C)bR x ש$|b b iUb A>udΙDxvY-{fxxx:lFtQ(λ&os"?__]8c*es+}Vrgj*iD*aaVUYɅARZ.u]*O)DT-:U4;w8V"U3@kn6b9C~414p#% a"Md"`<ø3'MȚ54 -w$zOD"TUD !HcXED 0 ޚ5p(mo6DoOc_JC%;w.89}ͪmRr©aVW cڜH׷uqН_siTTh93}]ƒ("&'{{R0W:99 wRaQ)1:DD nb]'%朜Cd"EMb;FxUU2d32=." `R=b "!YR)E(ybiEUf\M } R>:]{;"v f?D@ 9Rv/V+"Oڶfgsn^ e2ZЫ}F Uz}^WMD'yl6gTZjuz_=zΛ:1'S1aӓhUlQm{yMuݥHYrOUlK)9+, BH%#CMn97%\섈ގz'P~;.RUؚy슱4prFrӁҾ0(#@9ow6 d(GDoHV{SJg;>$꺶Uu`G.CuM ?PE@GJif\Y0)q8O~~ѣPr7^l6OA"G:޷m'gH3ڡj8gsiWyE$ՋNĘIɩq(4M48ETD@j!B@T"\/y!lL/)gZN*pH1-#fICtDu) ID*VrAAl"brq2[7.!dQS? %2ډ&viEl|b!D"ߵhq0EV58\.zu0_}#vО=kԷQ;<3[c)\t.1uܵi9_TUԧ?qxe@UGq KT u <bt&ol7dhY` )MConC|9֚=bG⢪(I<*sN\₈h]A.{B3l̜ͧRNګժ0LXv$l?Ǯ3n$"֠}s6%H"CGy뭷|e,yRtsʠg f^4j˥sZ  !Rq]K/<7a}سYvS>ykxocfDHȑ"i9ɗ_lcY.eX͘r扔\q"<ۘv9ǘh&Zm^. `ijc [FeƗ eW4E9фI\P"ʄFĥš3&*2eP`5$5O7 վT٨,5)dqSSeɪB1b)\X/| 36Mszzg>n=e7n4sGq{>ws;z_}ħ>wUIIu @XTaEE+pΑs}{_.oƫo9{S[t˖xl@\|![,I&kR$,^W]a'i@Pk'ڜGJY4MҴWϪڶ%;l +u.ή[&0NK}|Epb`|il' b5"☧kZqJ,<ʗc)9{D̅<5uUU!Tr.E>mfbV?O͛7'TN/~}.%ąay|>ϙY-;P]wQ(*\vn=;[Tq1k;uc\is.0*@z{٧8R2&_2\F{CjQDlYU 4,1 \W58s,<4"UADP#tJv|qL=z|p"s6U_h=-EDRj%b$ !L.S;[U*L\-qopu0$QBTȍbBJaEPVQEi=@alvgMATETD`m"b4"Vޛ$d7( J&&:)q1ǩ @ jEFh-Ni@ =}^O;P@0e FPU˘䔊lV#ԷmS{!Tώ7_~oo}VcX ð7l6H?~ڏo+~wOo? $YW=t0piZ9w*&Ƙy ^DoaZ}ng .![(\#vAMdrwt8r:ղ!@U%ut(P[~wy F {@oO3g[|t%9g슶४@iz8}\ 3G0W^%Л6¬̪bԢvJI8cW&8CҐPtݝEI\|dYwf{VbH+9KIy?9ꗿ?ǚ7_\\Zo.ݽ:'UCXrQQ&" fe5_@PW^yg?Y%YDc$,`BicǼuVuΙ{D-F"ݼs}}#(QH{N咐b*@E>½\Dȴ%C"!* bRRQY8]Ԋc"2z@!Ό#FTD 9cF|]shS-X?9:υ/;;{)v1/wmێ]]wCŕvj۱~Əſyvk&c n׻n%ܷ݊Ł4,L"pY2"ƊJaQ8<<|édPEL54-s sCăjLv Np9dZ"ne. F_GG[Zx$C9z[/Aioȩ=0H CCMS0"*Znkh;"WVx'"B`:Wfx Jꢒa,YAhAǡ'UC "($Jy|HSrί۾Ī+cv8߼{Ә|uvwgs(s>0jH)-wr'zw7r?)\ 3yeR"VUB@DDtUUx!UmLU T"V1 (U` 73<ìg+:y[PQPEs]U**XRJeLr9BAh)&q* ΅y,b01:rV{O(!8\*:S@u\UC]Y[r9qVu=tN@YJuȵ( @8o>;Km7c 97^{'?ʻ5ӷz8x :cժbuجǔ4&%("ڴ3ie㶲]E?i* U 1YЋLef?u"Sv2[AU-02mH E0ꐐ'WNv'{40{=R j` a-r)yɕzLD|Ta"䜤q@ei>kf۫b휻wFyw=ĭOY]ϖe.i<=fSřvC=)Dm6SGáO=!Dh;tE63n6DLĥHa`ѭ|z9RvqG *2`ÿ#9.l4ɖL{H%D,&1}@v26I8D$ĹD:@UYDT: B&ُ@4YɏH X,*4zf&>V, z4DPU!V~* jJi^ᕃ;wED)"Cו;WJA4{T:ęݻ84j7ͳ~ZRQ򪪀*y(<7n@DՉ*$ьbXhR-3qR$V5zU"2x!89g ۽?ccD~),".`rMS9RJ֠3aHU(BDt="$_vCIwI=|WD>gb w<p.r#fJ)!bow 1\.-I%HXvcJ)_9RJUU1nD b4KGUHIKPqQ'hbB`i-\HLܷc,"\9 LJ*UUe x"VUލ9UE}pR@U!?>f0 D0v,s+¹S)X.@wxZrܹCݟɇٍ7UX!(91 €1~UsyGrNM6;7" 9$cF]D9Ej=Tzja!\MJ4 CY<@U ʩVD]A# 5Ɋ &&KMU g$\ ūx cL:DD&b@43F*G?Q~OTJj!$?- 5p@fBĦ4 iHlw}9ZS6*׿_x?`݊@5RÃnw|w?||I}R00 iݪб}wyGREDayTUjG_syDķNRP{p]QB)Pkvڶn6Z+Nb$qqZH|>*x63"mGDLlM''Ycfi&xd8c۶)%&k^@D>/\p4nHq ))TUWxAUyq?O)~u.yZ*ݶBRsW~!,Uڦ%$Bbb&&$@3!Dʁ <ᢷ`h "f``Sr?Ҽ}ffyNU 0/dh̾G?PUi1A,5Zr.*J9~ 6i6H8v'ٴ)\m}?Ŧv&/j/~G0Ħ5S2N<7ԗR?կ~v׋bjT5D 1iq|ސZ( IDATv~_Ja&)/U 69<.GPU1n$/RJLhf_hB-]U1jeˉ(}q)žF|# O49 9MQRJg{V*2_l`4q|yfq)jՀHD"n8Ĩa9 3)˩ m,"}"2 "zթ@z EDe6~5}jEԘbREH^ @Uu)w)3M"js3ʜR8WMK.R̬.'&IUk%#Ao1%wYkU0UDT@`bs\{Q0gAeC?߃T9-w4M&d)\%"@B R_NOޖ9<];D(h5!NMln߾mf}ιc,")(ׇSmޫ*7ض4kz!5̄*V MH~̌bQJKf)BVŷH1ܬ,y爈!xmKЪWZ᥈9O%`$W&g|\LcȜƖ#KDD 1Mc?gYg5Iq=|s7ˍz C/̹j1&AlF2#ǠV~?cu14Ӿs)W9v: #aF9D<{^ `?MSQSC:=RnFb)Q1ՒjVꔳAJZJ)|=UaXVWWZJ 891{[\"&f^V$ 5-!)sKUWU&1tKi`x@UE ڑf(UD~VmEB Z\F,.[l`x ey2G8ZČ]J 5C!i9ָ:l[Iϓky^+tǩ\B/B .6 "2o>< 4gRW=3ڐ˰z <8:\4MsvY*v*@UJ)Cd#oޫzvqkwR (3!7\)(E| B s67+hiY.:d0&`!+tuUJ !```Bp-#7W8fffwQH c s:D"" j<&y$).4]p=:K@ކ00 n4ajb{w?~8 (mvmSh&D"aK.G"BjڶB"&r&Đxf))R8 >X#TtߏSBJ1j`Hݟr3̵CB"S+Auӣoz|?%x<:c)c#fm_o#BkI1wD``^VNU qld6RJجf]׬fR"Y)֢*R"3 3R 1@+5M97~iBl6MJ11SDEUD rpp4@W2Rn90nZURK9\jCtݞ?zx<(SP 8L!qdu^\RݿK/!X4N0! f &fEzơԪi?|w g5 C-r.}לaAj\{xHW'e~d8}כ?_ Ls?{-BYx6%Wd%0:qZa6)EDDc`6 ̄ML5SJMVUɋ@_fMBn 4g ){w6:9>CH1&5m#Rahۖs΁Cufb) \)#QӴRjۦvszrryyZ}4q QUwyy޶4e.//_z[g痵*RQTD *uhC~B4@u֡!b12Ϟ"'D*R30"$Ff"F&HLfↈqV_9s8XCġ QlRLm[@12*Z&5MU4Kd (u]"8sNf7$K\3DN7 "/So%3DL",-d"SkMӪjX㸻xt>=jq̫`Q5M.//Ԧi?㓓CdBĩd8991nsrro?}SCUH\e__yjR`^]/ǿbӛ7jU?j@ SОzw} nu]w||9=98<T^[̦i6Mϥpj vImfFj^ 㨵><ߎ}VeA*#nqǩt7C5 RDf&*P+ٳXJ14C00ZT['Bh62\E ĔsjR15i[@$"DBe"0DfJ-& J3ѷ0s۶Q*f*~Kqryެ9gU9Z&DB*92UB$B щkPUHwIJfaڮVjDNNNtԪ~mGMBTbq[n~g/]ntp4U.;X%hhS"~~J1q7fIM!PJɹ23}G×hC ߿̾f yZ:O ! y! -o@D?2#thf% jz2Z+)Ůvv!PabjNnGG>B}_Wi  p8N)57Na14M1v]%0 ߿{_C׭Ww q)r-f^1OM朻Uʌoz (nSH1Ƙ|qq!E\8@ jJ)W8F(C !L85bS.`\hZcf13;pPZDM%U ,%fqd$DFןhUc = 6_SF1OXH1EB"؟M;}֏_\]]]=3͕< S#J֮Bףt!ЬjDvw}DݮW38:y]>:/SO hBUq6ejsVVAW^kfj4+"CLM"bsDĹ.|^̌əfDx+"1F"5 2W91z/>'tUD>Nf^my놋dYL09xޅ_u ,I<V~x1j}tt$U7mۭr`Zs·9gyݾTa&^8%iR/~ns^ڮ]4>:?GB/.8nߋ(8N%5"M0 G/oostr0 0!u)OKJN"i)R23Yvq_H}5t33%RA\T q&QT)ݟD`4]jʹα"Z+"0{ Hȋ|$"@T#@"xa8CCڸf$$ nZYj%$p't${U5mVm٣1"9R}Ӵ9iٙEbWky;8=9ilV2fӔ84TkpmOOx덶m6 L)tyyٴM)iDfU!u-bbic=]6}W (3 `O}?MB%l6K4өONVOX|!DDDM>a}j{8Xw_ܹsyq3ϴ)~GSmb^tK!1 q@h'?OU}UiVUa/&-*ǣ+xr1Wku>tX4h*S{<U򬡓 3#16u[) ]' 3.j48cJv9osDL!C}߻;o}SUQ)]Ռ9Q@Dc4jy殉73蛃ze:S!53o rξRJMӨ4MfJHH̼Zu.ywXDrk Qsm.9kʧ,,8MS*":~:saufկ~?To?ͯ9Wnrr?==~镗֑SuZ?l7w߿yqڷ>;zGW4ԬRT<< 1Sl8uMDm97l61\o~8LSuf3S)9R%HLMy8/;&ccb1&/u4ewVO'zÌYG2mKv SJiFq<&Z[62w^ ]+ 撫ԩ1On4MFMs)AMG`6nJLHej9B&&7x^{oo}8[t7ONONnt-CFڦ_֛o?/~ϝ|'Ds& ׺6}G.o4]Unǁd5ܔl9swcSdNpmRv0 O_o?*""Il@ˮSU9D͌A8"; =u]gf0̉䈌1~J! l*Վ.PkT"4$3"LZ%HUMĐ LZm*#wkȥХv1& so'y$""ټ@DU%"ȬX"Ef~2s 1ƈ왟v5R{_awj_۷_~y~~y~qXtz导';Wg~o˫G$OC^3a$֪!vnMU &!h0qZ?{^iR}55C.bJiBMi3tUp$$ϩb8QmLԬ9O~kS)9^:\SjӔ1 :tZDBbBQcSM8dU*{B)3G1jbO`8DxKY׻ :ZO"rL!D_?*< Cm^\\=xDDbDBx~~~~7n\\] yO~χ{w_y?a~͆ V+خ)fD4 Dtjc5$ !_+_y^vPiU(եQF_"(4fU'/b6g-Kf蹳&R"!a~zafY0J) . 9Ff&TȈDU2!Y8/0)f.!>"&T }O\79R$HcуR2#Jq~ltۖ24q7]'')W^_xE>YWݦOO^zЏ4S׶z\ 1qF5Mm8撇qz嗶ۭJ4+¼ׂG?^Kq\N..bσsq&"ηPUt> SE<"SB@ BAR=4 MEK;r2i*rB@DlRIDATO x`\DR/bDgOCB'@ &Dw{?yB!J)S?qu05my"~qvfk?_zo7~vjq:4M}߯.5'7oy,ZjK MxW{_bJ7+PՃCDUDFYƧQW*{Y8f"r*!'\MC\Dc1ɟx1\Sw38 9RL,0TUgJ6soSDp>_>rDtiYW\7RR{?^]}ժCJM  Oi~?Mn</T2K/`7NOc742@aV~6w.an?s{u]Z@\nnӓ9gDDn{~~8NO~꥗^>XIMS{~q9M88c׮rmۙY) )NO7>ܳfִq\QU/./C0h"2M2Uc tFϱb@D+"WDH~y^x4efvx YGO9䊦 O2OјY?'Bm܎(8kZ|f2auqzo{Ѫj",:1=JZbOL0a݊8L)m`}7$_6R".Bj+z|t^wa0lC)O!햣=wxãRk&p .*9O!0À@S1D`Kv1T?AIPJqdQaZ!yfBӤ̥7dn2' QMHY"!" )(!aNSBTEn@@3#"ǜ bRi {ffjPEE `T$VRT1@k&?V B֭[ ff&/R(J5 :f{;oxS<zDGZ䝪j"-ǥ;ȖiD.99!1ʇe"~m|qGU) Ԧu\kzlVn0xꩧ !|GgWCPje1_L)=ܳw~y~~~xxpa^}핟~탣}>@S:Q k 3*mۍbr5M4QU<MӪZJ xE;tID7$H 3uBfڶ 31zLu!vL0Wަ?Ò&@A23Wy#33=ε%k!sfɱ.嗝,Fx"\#jnC>gҞY_"q}~4f"fa[7rUkmV4M'''448/RJַbij.//=xq^z;wO՗ԫݦ7߹sg>31>^X4~PU7D|qŠ9Y #,'D]8ŧi+@5t4T}%!'2#ƭ [?!"*ly92\TOZ,"ilNirbw-\S{=HXGOj9p:x_?q8= wS(1Đ3!;߽ !l]޿v]t)tۜMo|֭[w;ԕukO?=y瞽ӷxݛoRzſgn_>}zzz0n?Rqdf "w]`9gQ)$_XPXkDaأ4 v=99q]"R9W@D{0C㯩DlFZEkAfI+3T U,pM d9ofŜT1  ')FOЙәЛ !w~b&RUR޸qcrlBJ{zѣGz*?ч_}8=xO="j߆>۷_{oӠ}ߟ>s"uߗZ>[2Cuk"rS.H@Yu+"2br[ڶ뺦i\ #cXǾhfn̎jP@uh!~br&vzEkm+0s zI\Cfm 5z }Bqɶ `f{? !lW18V0)UR q)^Dr.XK]V&^6ͳ>s޽9=iGmWgrzz|x>qϿ{aT M}q~@hխ/lC@V3q8N1%O,L)mWV]QDi-!CDclā 3i.9h֒TJv[|M4xaK"Os L;sJ)@U\,=OhѴGqrӉUD"- "?7jy D BaZ_\\^_mvW&j8"20NzgwJUb׿կkmc@Ә7W~W&~rדQ59SJ8EqTmT 1Rq' mf#\ԝzg;AxSk3ȶPOޠ;k>WE5? b X(b]!&Ibl6G9_@Aa_uzsO?uΝi/.·a8::zb47NDl٫juk4FUm9̈'* yVk9O(d0ATbʔԫx")jEeyZ23P9s«cZE-%XqM\fZ0oe !(XJ¢$cXX+Kd"b:cD 33gY8,%hky}y;OtZUAbDL~7K)]!q9PQɹOOo@Hj1C[UU<4??ɏ6n9???*5SO=uَcT0U)\7(ʰתּ"AbZSDU 52`"9┳*h !O;5px1C }xRbT%V0vabWLQޗO)2%fJn Lx܄L/L8sqB³N?_\fQ)^U4}cIͯSUg @u]1 bQ#< CZɹڗXPWooFul̞vlw?޼mnιj 09| n(:"^3lbaQJIDދ0+݈; I83im(T5 Z6cfU>*'F>Y6%"ʤӺ,"A\"3+[YQޘRǔx{qԔ:q}1ƾg|f͌FęY4lnOOecUڶ%0&zЏJuׯ_޾}v{Yo,;vgŲ`ff4Ƥm۞N뺞p>MALMifנ THBs)\C)K9Jڌz:3Ǒ̅fxjV<)4LĪJSQMz8g7gD{ι8zbU:\TL# }03+.ٷm /PGw @ *u)ꢮ }erM/Ç?_%t ]4]EDوxlX 1 2 3 0 8 0 301 506 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?1i{(HcvBWc\m>]+߅*fҭar*YaPq]Q((Q((((((((((((((PEQE1F(xEA-#/&謋Vq#I+XЩ?$:[+ωV&uZc]qϡ,e(H]W}|L֟!ofUS :Җ^yOQiI#1,b}UwYDdwW%|fna6nof]B@4r R`O̧czDWo[˨2tǿ'zl]eB{A`=.zvԻ-' z{eHE ^Sz#ZYhh|۬ƌ(V~ %힟9錄}}/ oiQk n"oM}ka48w_"\oJk7+IB~MF}%5n/kЏU_?β|?[hz}bϥ(|ĿERb?E?U>* >,JheўS d0O\~Ǩ ?sdb^?F+ad#VPhLQ/OTK*SWqQq&UB Y $gxVS@?Z}ޖ;kYkYx(>#T25(UjK3(td87\jGD:+X\(BP&g!HstCLТ[e["wz2v icƚI}{P ܢljln٦x#JSr.dkQ^gaDԼO wcy@ֺZZtrVՇ#V,ޢ)~!"-ُ`N3L; ~FI;$7R+vvbWEHԓWd?Z* aB+.=[QvyXR9ntf?8`+ֵ@z<ו;{[[hr2MzXlUvʼn*ZCICz|\HF72MGQX׫izv$A)ާFNfNylZZ|?Zϸx򭦕p3\4ڂI7Jm.aVx: T~-NTM;ݟ4S` qm+'^/o[n$N~?/yFܣ;bǠP8\҄z*uǯ~#QB\Psjwq{/I&_=>> :fo* b6[=kǓyuyqss"~ 4 :#ύ',m-`8MbGS|?n`n!(ǢW֧+?]gkk~?ى %ؒ Ru8=v;ۉK{#H< \ߛ)Ԅ1E[6>o*%Kr`c?\Q k2glb+O*OUP#̕ZӆHuF5EoOf8YVO0 iS[4ba)Y")p̣[HtD8ynlSjڌ|lB_"ߵĿu4jsQInvjc&aSLxџJaZqfiR9>fX%1b0RZ-dx Q9^= sF6$V#jx{fTV\w*5j-_^SOp+pOGNlɓO٥thd,:ݔi$+L_>= _O{loc bީ0Tc*_y*RRn>׶6Cc%ȯLXFۓX>=j#JI5[x|jGjyNm#ogNU{m."хw/G_xd%\MpNRvھSkM3 ulZ[6+GL>+Yt[-Z4U0pĞGsB!J;u*y5Jg+=ڬz'\{Wk<'Sxc\#=:fyXn'-,Ņsۍ g[ 9}϶Myu LF6g~[CGs"8V|7yH MʷF >|yc^"ӥ[ZdllN-^jipKfF 4"hou;i$62)`zsן0" ǎR1/*럘c5ẇ7Anfԥ0qv>|MOՕ;Y7*}AeY5aU(s;[]k;M^;'PUjv}}O<>7K3LE|5jT0F6sx[ZodG HtJ>g+*Ws潚툊B>5xQLfbd3IHۀ(c4r#Wƽe"6vU\ӊu(3ZD%ծq<>Zt.C,yoo$(ū:'=^5еo_I$^sؿ;mF.QO_x6}Ԗig5ˀGҬi(/-Ăo"=2p+|͜7gA֏cbsoq.?IR_(u ֿ.</ÍB-u {uBGcFk! z+0QqQJq>۸d03櫢 ojNЫ]F[)vvMר?|/'q7' [2ݸ ?^3H?kҬGN@@{4֗7t۸!E!N;*IV_,45 =C4<UuO04Z9n|Gcwe "šE͡D W񯓼Q烵t#_VXbV~gI//_ֿjK8EniU2;l,;cIqڐ׃\ox{[\[[Enň$NOjVZjXu(F'2?ifx:Fx[.gmf31Gi^ 9Ͻyſ i&H0 κ|6K( îzt4v5İ Ǧ1ikힰɥLgY $}cXK$7L4d:8*G _B7ݦlO~3_f3]Wm%D%ϖ9>ڰu)]{9;hd^^~mZxUL r}+g28` }K x2fI,{ְ.>藚vBHl??֢BlT9)kxVMErU]R2ZK-m'z hwZkp iv#V4[ nRwlT"#yӵ%'~W1_>xZyz>\77t={f/i|d$ڼL]%7$P]~ 79\ ʮD1JCpq yÿjzί1["[rYzr:v (mA! AC!;˃:crҟiI]#٬BVGaO^gL  ?|\Z֢L8N'\Ս~ oS/{;hJN5v]GC7V>wrNO!m{XW| qֿڢ-n$FJ?l4?M9@0(Ҷn.4VSv!x^Y_c-,E]A1 kؾn[F w2ϏoLagɨvBe.9kS%~YYF!ZV#]K[\d;6QM>覢.țD' 1hXBǙ'Pr$@sTo9$vCwVvv+ ';)4߉Eyn,~R.9E.M NsIxFRݴѓ5f'ĝ5$zH`1Jq&ֳxˑm,8NQ[y$'9۴VF=@Ul-ɵ"͍wx۸2*hKO[iViFP0: T5|(7Re˹_*Z*'!DUd^AH1\`TMlp=Eэ;jeIGݜ,W^7JX^yP^ShWb(C*#J!P#%p9!އK}= &I.R35H?ZxZVMQ6@m6ZO*5 Gv1RƖ3|'ߥe*Wvh~6H?m' h`bݼ6U2 u<~\k$Vnav5UK7ͷ$ci;]3"FZmdѕłqVg"͔qD[rȥ1=k-l죍ng)SY a^{0#E+i];VA kJ` i~!D]ND?Hb[-[d3° ?nw݃\UK+#I%:?LEv{kx- 4 V mcMrz7:k-"o+0xď@'LJJ_]du1\J'a@Qʹ}{\kq5Hb!k[JIT!GkxVw! +#>#^M-t&upq9ۚoayuKXv{\]炚;i.$p@~kZ[['6N}7g:MO[𶍠_GckRG8. $c<׼3q|P2.>xw@5d <{i<{f9$!$FjU:'Lw}h*Pmn !CqӚojWJ'D s9Fd]F뎣v:mp$![VSǀ1eӪ8I9-O:<@+KxsN u6zs]es$lIеd?f͑u/c>TWE S8=k(FY'k\rF/ݞWƑ%46S54KG $nHq|8P*/CqnU˩ʮI`tZtRq,ŞP4YtLI..k1+ik$Iuk1AbnnϼJVV.oSOZ^DFXt5~,uf[KNoG>z{aY cG?nxCj_:RɐzRTynH}*c.ZI\gv8>ڧ^|Y"nwnڨ^-|=fڝw#I3}+6NWh 95(s;-ڳMKq}*]ff,vbVFȷ3@"Y`?BW1MzP#^\3^ۆ)3|֜+\m ;:UvZ"[SalG DU;W?Vt-4$jq5$2K4v6NGj$ԯ\3+A< IY ҂fц@5̲Z5PBEc*\,\ i(֝;?ɐd VtQjSA|dOa&^NH\sVK#|M}$%}oH#,3f;G\io}[՛4uS3:k ĩəٳHKm@? JHl5ͺgpn "xDd,RZ(ز^Pݎ>a;=Z؝` H5bY*?³$ܧ +9u)Qd'zK{Dy֥@K,hplVd6 Yv9Z~hy>RecoX݉? g'QbdҹX睁 1nwm㼚#N18S{'%㶜ȫh&HU3-oz<\Y]fS:gZV^կ^'7+'Fԥ9$Y=4>_]߅bmpSz¶߲̄q`8sQH9ߙ KᝀU.2ΒN¼Gx Oi8Q5rI?ʹ5Y5k^Gcg]yD5GOpP@zUlr5[M}hҎ}"RәЁ\^kkMF0HT,{ZOhΟfWURtڐ6Ē[Y? ټH bcc'JmQGTⱔ#5{Xǵ67pÌZDHaiaKXK0'A]x1 Xdl ~U^Mqf`zJ:E&;-;L#"{R׽i6ZqI"L':>$e6 MSp$V|Ӛ nW;\#p8W=/qyyHcΆGOݱ qqyoڤVb֊tԗ*ͽR"s gڢռM-(g@9yO\}kO1Y$#s5;/EА%?0+6l%ٵwFDdMnh6:,: +:p:eA3Vo”yMܢ3ĉ\'u`-ͼ#r~߃,BE ñڠc=-;Æ=S}Ԅ.Nu|uY #IYϵ^Ӭ޶r $ }hGƘNHv]7O̅i`qVu1i- fa{s\X}j ²\=9 io@r8ǭYF[+coL]@zIV0|vhʥ/x^~jƳ"soco;2sV=$ivwX~RO 0X,qv1jI_\<OVπ0aB }o5ejyǷ'YO2n`d*+ѢkAyg>DkMrwPWaPMIF~5ʖQ,F [#9m4g1hYIf$}kq7RRwZhT"]_\1q_yV=r~b]Vyfpo;F[kܱ>E]3vsWS{e A;Nuqަ" ׵R6,._ƹC˓ #'SEaf?a%V26xixdᏕZtbՓ5t 0HC?pڦL`.svXdD@dpN$zvtϹZBrO%W捍zg ͘vDstx*@.A*S[Wm9 'ڨAuq!EI 9b'c[4HUFI5GT2:-#2sT5+. u O|TכMͯww~٨f֖Ȃ2'k1SQ_zgEDmKWR(e?VvTV¯>ǚ]PqRm澈rgDOr_~tJAK~WH7RCc\Y` -Cr0nbߎn/nJ\@q4|e ' [GF{n8Y~&2s-f*"HN+OS&Y.< {re*9텬۟xF? k!ɦ˕#}Y)>~#`VmʃU;%I8~=ը"m>tl\[8:4j?v<|}>N5d"PEYOP2Ƒ8Wwc&ˬo- S'\(O=(JF0Mt!y$y j7$p>;_eHs|dk[԰*Z$IaAeqs!9U:UUσ+%Rþ"o^ _x  zu8Isv7#:5Гo;Y󘠸垦:+]_cݍ\U]G—Тa@d,Ͻ4nOxv+K|>Vk0ƒ2;VlV sGnіC7CLf*JeW I氛ej2n+K;eAҴtP^u P|gC-ug7[?g7LϙWwSvQ!h0yc'o5 õg aO^wZi+J8 Fx/vΪCCj*1ЅjϛVȥ/8i_^U?(‹[F@s/!wG2j~,$[dōR%w?4|Ar OL]\[30IIGΕwh#^a [Ct'khҵ-SvZˢ1~6B.5u'R 5 K`cG: ?d/Z)F;GAuwGo h|/mk VmRIX]7wZ;ҽG>/x2 v8 5}1 $HUC&?/)E2\\=03^g4G[Vi `] >'4VM;sAQkXX*- sKoXNqsvDS5]mb oixO؊4+Z5<4V9܂ [P6Dd@*V)lH(MQ@(4uP-<сAMgo8"H#˺Wo.t2mmVWa. |='>ip㵉w0$R|9S鱠@NfU. ^#, G'5/%:Ff_XsJ*y#| *B j#sɻd [.^hGwKo7) aq~OUZ"u")= ܩk\KC)>7J0k 9g^?JI ΃W4Qi< 7SͷzdqU%W/^@3Ҿޢ9V 7p|k ۷m9(<p^+C a_qQ=>.J6.B>?JK^cI.H&d>-}EO<- !Is3֌M/т%]n|z_es[?'_D tRuMX+':DJI2]I>5}EZMtStؿྗH| {26Z?fOXxu뮟5Sp+AM0i؎-2ZzmŮklhUBfApR=?*LN֌E((((((((QEPE!:Q@ E.> )*Jp(QKI@Q(W (QE (QA (4QF3F@1@ (((4PEPEPEi@IҀ )r=) QKJ(K@ Eǵ%&((/JN+4QҐ2h>8qծ0_#OTX|?/V3Cm?_^kp;Tfլ>G_#B#vWo&mzVfPXdXӵ:!}:e |L"]%ɺ`}kA>Ͳ}gT"!m+ڥgs2јTpr%G.qںIv2s\H2Dedp8`q^m}ki%+ފ3Y72C$ $f аO9"1WE7fS{#nl{]Ls!U]jQ* 8U ,n0n5QiʧzvD'F$ɑk_5j 27"'\Va $Ap6vj Ԓݙw:}Ct+[u+naUA)!\6q=6иI^'߉SSeE`N}[FqF}jcXIM۱~%LOW*CH?z7<_,ڍ?MKx4II=M{M~.`gh>fThP\ǟիU7sfFjͥޭ&`1Ȭ˿ Xq P?:~0 V am~9V5xhBݚ:dQMHu(2|אxw%}wp̱=+SJQ{$wV23GzZ~Zô}0/.s1sY3jڜ]s_/h?#kVBLB^nU*cĀ=Uƭrլgp6c<J:>_S>Է7Zm.<4ڢI41Cɯ'ƥዏ5 O6$7t=z+  t77ĦG3#'5m ]d}xNY5HPkR0I7kn޽k|=-T0v 5wb`Sn$קNVi .~cZCrLC>4m!O,>0mQȲ$:;?Ag5io]Km08oO<$aS)ǩ/{㿝 y<֡~onSЙXfm-Z[$kڥף$4<^-Jw74z](:ċuKUWӫ"\n8pkyL- 4 c3y}v 8^΄l-EVwg?ox Fmm%bފ5=:(,~1_9o%8?ʣhM|ͣڂOW3L`T5_ 1#ia l~i< m495ܯԵFU5an$2T :vn;c@1Zhhw4t>1ڥGڎʧ;Tf[i@4ON:I`?HCNַo/(cQ>IE`Zi8FKcm{;~5cqҥBJǩªN.u]?19βs##A4#࿉mޡi. /a*8^v/K8^@8 siۛSX iw3$-R1*ʯ׍_ R,z5c8*KdLͱ{ y>fՏBTvh5+$Tr9Psƨjbf=@λ(ZmYKpm-:sH/gVl5gGeU&b=k#6{'OJZd,2FBJʍxôFچVhǓIvS^#U;+qy]IE+ˍ`n۟mxUnbI@$8f+/]o]O=(r]cƿ5hDjNXg-_} !Evh1'=~*|]a`~s5©~RycjMh9PQݟo_]Iggq$р$(o@{4WVÌ>ݡ䞼Vjn 'M_9 cYzi<jvZ=1G9ɣk1ɣ^n[4 1p⳼zf('xzM6rXC Mws m@r7¹?z[NySں[Khxа,I+˧c5zYIG&UYkN6[6>dlåzީw&x.'[e8g#gt[t$_]K'M\#ӭueY eg}3^e%9IJ 1Vf[Ciӄ P<`?:|cæ{qi Jʖyס׬-KHA#gR -LvbbkǒFr5J 3+qjM$,BgW9x.1j&vȧ@M_KZ-H ~b. Ҹm7z>Tf_9eEyOsюuܵ-ćks'e-ՃhnkVwRWYvu Jש1eHT8b  NTě;wX(mEX/ vы 699LCCXgHV@;@W[o}E[i|}jky/.irxʢzebiŮtE!]2sОEuc'u.\{K@D/_\}_ 0FH. 8s׈xKrUӦxf$Fxk(%ӵЯ~׈eo*=Vfyk<=[_*}MU]YJΕ`}QxzGHբD5x=nQXX0XrWs[x۰mnRs+/%ɞ?j1m<~]+sw4,>\LjjrD7\[=A\3);Ȯ.w$MpbB[q]~}V.#~'TJOnm{XZ%XSڷ'j=3J[H'VEv=Ȭ `ӞuFU`} oP2JBxv[PAՇ#=+~,Y})Q䘩U822?_Ҕqn4"|BS=T֔/_%vo63p1^7oj$)AP88vib[ oH$G^߭Zrs-~ |7WvrPg;q 8/n-;aE3FzRbӴ+ ^^)1e V]NTd;u-s،V "C·>#Y۠-#%Ƞ$g+<;jZ_n.)yݾ%E֛r-hogQsYzN)<]>g|\!a2Oz)ݻ2=[za/5TДJy ¯G%b"g"dd$MUڮc5xfc\N 0pByMДg~!{ Bщkt~o.ṊϤj橦f[\VÖPg(r?NXrتxdpO mޗ0y (~\־+]WF0ß.l>\iQJȁ?x!GSɯm[{+Xk6I#µg^rTT}u`MV@d(K+!2{VU>Wk>`P[nF@?Z5{\^jv[m[^@cت<YZQj?:+euvqkrwж9׊lwxl˹(Hz_mm} X1+\ O8.U(>% mY*4z}Y+U.b/B *)tz׳i$- SžX܇`>#j2eͩeP:Eӓ'; MHcXjO1^ojWSݶ&$wYjoketװ.җ ~ Ɋ3nks̓w:/=>U:V?ڶe:E,_" dyYcajtǂTfPvO>q.ŎcP2rV7Wnu 5VGc`Q^? ϟ%!>w8Exu1a4na4mjm(Haҟcƒ^Dď.Gr Idkyi;[=@&V^2o-K rkC;4z4]3)eG5Bۛg6sq!E5ul͐l+vJ$$7ZeaY + f;E]5y4@.Czc 9LV(A̽nl ؃XRxXv]u>ėr粇Drt;'7\2ZyEh@v?A%y0?L 2P7{n?~+n/ MNL>t*4c+ȣXn?tMgx\U8'/'1`{w5gcil1+Cű558Tcyp* J}w]w9#搬`K?F#+EL>-v*!;sKZ//410Þ-1~c=;?w3*qg$w+-F[nsAo-~&û=jT'vtx8`=~g$ qq  }03^kKf g?ZQ5#BFLg<䜴:$"5Z[Đi c̎Vqqΰ.sFyO* -XyIl~WMutqoy4J_kG5q{zVC<5B#lXԴ{ a\/杦hf$wib|?85G%uCSQGIF,S}+е9ݰYjKdY/*n}? SI5=(>Z˒^]^UJeXk)anW; }x[&@J^}q 2"uPL*23Un|G\Eg \ˑǁA֭U5|SʓvidY6r#A][xbf͚A?9'`uuU^)J6ײ+Dc.jb$`eOmy }%`*\ D?ɗOHQdIa'sUn[M-w hor}+MfiEiwXufY˧j fr\--[\c8F\Auu%C5faׂkhiZ쏿 +XK40gxKSԉUUVK)"󔅓ˉ Lmⵂ(}F+9Yi@ &hnwtBl/cƩ'&vIIBOVׁ<+omwIw Az.m;Q֑҄cq0~·zΒ̐'j\ Au;Sp,)CXz`ӆF8u^IMIQȴN(K ֬Bw2X$?+N=zU;K[3>_W.7:!̎XS>cp\g:m6\]8`*1eIJnޗ\0G}%[8o@TRZ\<"$~y];Kn$] q 9b棬l79y)#5L.dS$ר59~Zk[#bj8 MJSKFVGɱJ(JM"C:}3^ͨ| dPđ&V>;֍GHư%n[h;mB6v?)ou]NIqwIKES6A'tUb?J}2#,1ƄRVm.mf>-o*.uKdf;8жHk֫mcO:Do.,Gk6m"ቸEpr\̑vT! =9Ȯ_jv}Lk NH̗$W"a.2I,ƮZiP~hKRjYI<- kLz0A{Q]aV8^p8&h`2*m{u9ȅe-68 "&@1+[FVrؙlg۷׌sW6p&v,y¶4"# K]Tf.go"O)X+8'^+`ng6 eo,P7J2Xx7ҥR{y'g?1~?Oه{ 1< 9kOJGn 1&&,QsӟFTi$en<=S\D쒖ۅWf>¹;HF" ckO LRsrRaQ!}9 BC1OJjcO0!N})cbNC\WcJ69\=2- ,(݆;qoJ3Yf#9iiZkl61) v'5"kVT^#?L1Oc?f9=+ïi K${k閐ڣAho1(Z1 I=2>T+ZmG B-Z5cNEL_0 YY`[sVt&cdpIP+vbWmWLw$styWړʙ xe鹀cUԮ6wH` Ld p#g*Fƪj:mne:/wtӔi6%-ܼKs!\C-H 2@sҮ[ 5Hq2g+*&s$XСGiiR^vȧn5+ aY#}F9班kYi>pv>S/#<*WyB6:ZpHPgS>[NzIT!˼MoXQϔom)lةd\XW>t>kkP^C/̃WR^D@;=Y>hhBj>#IAl 6L}+&-OK. .gf'N2idDFTqVXdʶlNiY~WVW!n9- jdsI2]8+2Sc#'ծAk4 y3GW?:T".T̷ :d _Fg^;~u֦a!a㱬yEV67_ ǧN:+AEeeFKTc:ncηH6 3F>jbrp'ElYY[Sى.>觝Z܏꘢w|Ϲ|=㌩E^zك֕&$1+2tyl?)eUQ0<ɘ<=2iѤ|ֲtu/emwғy 5s|J7 iY>"8` ?J8:gJB _qG+$vΣg^xM!MlDWM~ OL¢Ǻ#Rnۻ#'Ӛ{Ʀ2U5gd/PɵEd^xEyPZ꥿F &MkR/frX z8(%Y5=F^K 䶂r{3.M$(lR2~Gےy5=rcEΙnՏWzIۜvz+61y%# sR,4y8o1o+mt@gz6:Wkoo]COL$/wyQ,ԏzɋM{WXBNq,Ŏ=N<4 1?v5PMt)aQYA8vYz1 `9lW`Fa wZݝ=gs(`g.F(Y^+VJ gBsɪ3 L%0u@vr:T$6z3GDfH/uDs60krb5y߭VKqnE2?/eSK&n$>`]]!Lrɿ!W'j0#r\Ci6v?< Gc5pKY29=F ٤k|ɌSSipv.Lg;R6\w$UYo]\w#n&\ = OZE-S*-D{);3N Wkh2sw>kNYdC}1UVd`8«0-UyQv:)uk+~*jh m͂. x&# H¬eZϺ-=yn0OIQW&Uygcvxl2veGğWeΧ8 G8Ńw-Esk:p\R]Gerh ]OhSK+lE&_[.{5#o5E-S$O`| EiqOeo^ftbdH*iq 2\TnJ+ZZ$i6>%:JsE^q^X;7̻֒ i%Ezgך(mW:eΣ(I8 ja?Ue($d֊*h-MmY zsW#B(s)$VoWvh̻Kkҫ0c`1)c">hGmY-1'tv1(Ahs|u|p_`fpHr:E\⬴%D4(L.y y>kPI4HR琔Ty#2 X.,_2XvcԞFK>Nq֊+de(-Hl;tct@qnN:xv[ D꤃r(/MI7`9: R$5!h 09S4pV_ K>_OS^\Fp3QET'-u)Ӆ'KOÖ #(6 fotocx/images/edit-any-metadata.png0000664000175000017500000021565115247006660016305 0ustar micomicoPNG  IHDR }tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 298 741 1 0 x:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:741 height:298|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:667 height:268|g IDATx}uTUNxi$ 0[TD=vbc;@nF޹`# (ֹd5ެfYs>/:\+$*TN98888888Zj '\M5@qq1 QPP|᳨%%%U~|V[T/!ho[7'o}_6AVV222O"==]N:d䒕)eXdugV7Ennn&'/{ǗccS#\D2rڃ0F ?\VfcNgedM:v=qd6h: d=EݸL>+pHC@?`rcƎ+KFj2igyc'*MLH̴-3#mNN69|gP+} c??7SFC^F jCJWBtM-%dD1%#AFZ C#17?|h'%dw%}L;Hg2ٲ?cV7']krI<;R{!)))bbbٳ/:cTrޏ?~08OpN0e^Vg0)N\ 9~Ѯ{?xPbŠe >.))đM$b}0kqS[RR.egp}}-da0*ox-B},6Fu22??؇^F{Ɠ_.8am{-#gl>D.DW}׺}$dłro>Q}mNJڥ +(AWѧOt?GB-eő88oTd0$wBZV k\DZqVNB;AX Ba(](+*BEENei[*x'_(e+CHJO_I E$Y8w5$1I=qD{qc"RFF~ U hΧqۇ剘tKR_ߦm @xtuu泒 ' %jj7VrLMMK*}ŋ_ͷ T[mmm,[ QQQ撑[[Bv=Lkr'fh $/ɦF^ȗFuud`*.O~!0ׁ,iBfI1=ݠ#߲IE)p8rRP$-%8.>k8;{240`z%g5S@ЁT"ջ#od;kI?2q@]ұ'_ܢf-?1L٥OX{ +*QN;.;Ee5ج "x&Pe 䠮o}]2"Ӯ;@YXP$ޱcG|]G9鉑X7gv ~4] Ne[O 2 (`?aOS0ք<̨BZlN.:'AcƷяNcdee]}=+lѭ3kKG>d0`XIh!7>|,Ȧl޾}s[lil269mgĴ54+V26m$ԿuV%K^xrZ]N69l7[2dDmИX<;ggg۷mZnF<̶F=_Ucaܩ05&lFH~c88jF65ta7k6~{WH sH9ȪÑs6$Ӽ&GE1|d-)M`҅;t $|VǍ"e<ޕѓ%.|Ko휁];C\N]}H||삙 iVͰ` 0m"ﳥucc] foLQFachnb5=k++'-??7"O\df8}; 5z!K{JGXCNEMlNJGiF6ugvbN&V"wf `0gSq Km!'-qnRK iJ4Px?%,}q UЧ,V_K$-CnPMPŦmy}"L-MQ7@M/t G⤻f҇yyWR擸4v0LW jFbөCj%Y%-o²<]'h6ԭ>T2TW"96LH'MI~Z(ή ]5*d&K} Qǜ GX2ʂfVU5*CxdV^j,!%% qffS^_CX\$?f}$0m+nb@4sy,-U  >b0q9i7vO8';ήiaB,]+b$jj4M9ա8"?' hصe-^GX>:*6lnL&H>PSCиU.{UezkZ'3YMY%3#mfAU˶9)m%Ķ +fT~zMw|:O}ܹfyzdLd7o|8Lw|e^377" $)))\0ȷ,$?[C#CAJJ*0Z`4S)v_D-%vr=4 P J%m]Ї2½Kf͟2o.scoy}^~ILZ=F>}6.] %|0Pܾ}{ѢEmlL5QP klf5 zfZ< ? 3Y(ha7$E6q{LKAE{ 痣 k$(+(@]]] h̗eYwa0gZz3z>}z%in@6qM~01z% 7f[EG@ENX8d.M~!և a T< C4Uc1;GPD$""" K@eM)b#e*{pV/ЏrGF","^ pjQ~=0/%t!҄xI6GY}:蠙[p!#;젭+D6 .];;<9v1@cB'x$$׮]A9=5U5?l u+dE CInNoq@Zq撒 fUY "ףG؊T2 ])"dn?9w.#yBXe ?nz"66 nWam)@ie}\a,E`psv_\̓8190!g icqa$לNFxT88AK]# 񸊱F4R5 ֣w{L$7h.#821ȦHM{K~.߇߇ȳɴ-e4F/VW*3e1nY7ˣꍋ#_sԊeMvkk6E |k`*&,s0Ŭbvԩ:t `h̪t;@SjGZoqP2~\$QH3cNU"9<ˡiX2j}f(k{G&]"ЦIɋui`ܵ' 1LVkB] JvdE^@#S(QVq6·:w?,ÓHܽ/D203Uѹ-#Og#ݺu쿡]ơ³[ IY}k: @y(JWB$AId@+Hz(|e<$a@ȢgpUM2+swdP H{MԷH.KcܺsȌEYgfvѱs\s _O>{ 0"[/zӧt ]4.XMjemes[nlI᳟D 0d7/7kf}tg(:Ieꊝ),*Ȇ睋X0s 0Jc4c}ȡlD{a"6`j2 (lciւ \h+K!鰍L<xHKK+JQV]Sooj2d"1a Xx>I\0hc[b49B_ XR=!J3d,affs!1Ib0 a1d8_y "oĄ`in!t(r͡z?¼ ܻvsf=C1l6=J2_@AKWVh(l+6#1KꅍgS{ͅZ Ʀc7H [G1iHXaB[Q[&LДר&s*;qBL%sJblFr221H#m#jIodѷIޚDmfײE)j3Ɉc{5:v=#~QYM?9dU`4 / nd:wT| 2ry`˗3ca0p2l?Fj{λ#=F}m]foڿmMV'lr1ap`v_ۜv myQDbĎKFf@FJ_G"H,#"H! n6e}kgQ|{&'_'ǒccc2%䱃}gD=}ƋiYd]E}fogN69dcccccccaM7-[999?N69dcccccccaM͉98888>= p&' obˀccccccccC`dh/ p&' lrp}4p7͓/N69dcccccccaMvo8 fUY1=⡗7*.Njy2**u{K|}`L-kJlw?4Q=AzB4£QVU}S)>|888>8 f^Z,ZB{H2rY;AZ'6pdzv(Co ̜vZ?p?*kky߇-nZn;D?L+5e u~񲹼9888 pb(3c1`D /5~9"%yX:R***k=^MپpDEݳv1Zx\^]0xBlbuskV1eԞqI/ l~r1Q^[WN`,MI&aUC1͟'v&ЇB5Uextϟ;2-Z'(/Ųj0BDU}9)ؾa%ϚǑ-V-|~@tCcg7n}$`m7Eç_x1'H6+3qfj(ICMMDŽq>ѭMfJ^>];bmo"PSQgCUQ?e&N]-=r}2"+l4=x@6|hǪ󒔉H]91u.p9"i8}d%a`>s;`$dtϙV۵չXpk}v6"̴B}0v*- * IDATz*P3r{^یlUPSf-XBRJf:FϪKqnG|q~\1D2 ;^(lɄ=ppp p p p 0 pɑjބr?XXANVQPV*>2bp 8f-`)#l*#;)I-*3=K !f]_Zoo9I<9H?=G TUDށ8Ii(CFrFPD_EfJ^KC` ǐ_RP\Z~ѭ ЯO?lvqGzv6 s UۑZٜl23zfr(F(hrR\HJ^N92SB1LOa3$Uy` MKk5?O-ScccS'YWnNSA iZU3:!ۧ;'U8]{cڽn|i Y 6HtǢTսd^r_<~ ]{H`)jAAܽ/%Jj*b!:ug%,2s0ߟ'c EDr:*˄2 mC˨j٬FRyIc(./yߓ &m|ؐSM ~|Xj+Ki>TM NgqE} httO?$]f ׁ9Вm|^m֤/V:JmMp;]z夶x^W´ܹbİ^ntGM̝ #3+.#-d}RR$xOFf&Jk~}{(mE>5Ep1jfVhtim:h?$wkO!^o5%DQUqݵ3.>}Idh3R/BXT,*_!'PA`-æܣn&6ϝ[sva\DJn zr?He"?B5c& h\T4*z'X0y:vWIcYv&꒰?L&~}rJ؄XDDyڕpXpǩ l $ r6Վg 4_@b| Oavj|@_x>~(#6"qi4ay /?R3h>-г,!24/R6+$] 1q(-g_-ίH˩Fx{{#:.eEʓpx_Z$a'S,m[|l|n&?_jgF#$q°IW-P O3QINMWy&Qs0M̈};1-eE Gd\"**qc\t+] FxV/CБ[#~yF8fiedE7% ?$e4H $ALjʑ%Ȟa$(4) Q\D}?9&?Ɔ<"FⒻcc Si4f2 ٛy-bbqmNSd^Atd#i೹z6tE$Mw/y\?F\O!{ih`D9 =~0fd\YCfp ҕvp8z]4du ".*4s4$[AWACo|h-e8"'𦅃.vYW%=i& ՃLjKLBjJ"Bqd6#7=hBmWהdz D>4.x~϶J6"i0G#TE#5ab;!ɵ9d\FerPЀ4uLq&jˑ$W^E(I(K&wҷ .tDzM ڀd\qޯqy0j ~!q vZٲM53ѽ8Nfץq("Mdb"97J+2jI#abnAV6K\Ŭ+5[c%G^9zJQPfb$92Ҝ߼2RPPQհ1{.l5!8]H6n7lCuЗ:' +Gaf,69 pUP+qqdT2cɽFyut4 EG`l <7z' ?AWXΦS-ʙ0sښ3Ӂ] CG=ozAyrwf:H-a5{OGIy>]= sC-Ȑ5HK[O) 3C3x\rd7Ơ`=ZJP6ۏȕ}U`X3Ddӟ;_mINo%~w(UD5/jQ!'E/@7N@[N +6#5? ]_LP0E@I#%\U';RZXl/ЖKk{ gD/f`e7V0 K">3[xj*6 .A04ܱ6||־ߜlҢ tUYnGQPT k,L (ȈQ͒FxZy:WVP+ 4:E;{[o Ձ,&-U~fd`L$N@Dgv6t}ʒ\=df6#a95=xղ |1 Zb=sf| -YuI32S`3rMXYyxb-$znd]KgNcTcS dnu-xeYM9AT*̙|gcCX8,)œ=v@>t%^>5~ (ZhcٚMؽ{6o_ 86-XN|6-f) ؜fD.||q)Z1Tdp:t_D* zu{ (je:+i_>: GVi1N]z٤rR#ckDbyt",kv'>l]Lޛq+ad γ7$"El<6 Bj<~4Y9 P@//섂T_7=$ۡ'jHY{C6{Лn^HMKCfflbCȬ&T#cmzvV{ ǏL ]:up.cYǖSQkc*+, ~<\>ǭЅ-Y9 < T&_Jjj–p{_p(RSy5EL‹ :46IAi\+*+yi\36a2lV!QwT/T#_ /bc{<< ўg"5*O WN4 41!%AhNhu-`Ub:;V$c$< G)%~յO1XJig&'!g:Q)d312_"4lnn~DW~V";տ>r Ud ,+|٣ -G.gRO;"M'76q~Ui]غu mۆGJq^>S"9"!ҵ^q9/̅a~qyOcEi+p;sIݫrqypځAZ–@|VG\z~֮-g%&`yܾ=;wй-9݆"n`ߞ>{:oʛ3ԮBlwr¡#',Z(;11?IljmVVܵg/̩a䓚AԢ(? Om[z/ܼ\҄ 齰Ȧ&Ϝ sac3`-OL8hc2 &זd_ZɧD] =i?b} Vy~x(xa5 52zicxAd( 6.c$UEPWEOg Y-8_טX&)m3J{f ÙdtC1qiW<^"ʹq /osfx+^tJ0֎%Nj1% h^;лt?'Sp4qiM$ޑrw4rhl=>7FZuk8]0_Bӂ`kY{N"\b,ًrxGVDdw`p}mUUony:ttc!@L5ч)T[ßඅ쯋3jpgzVӡ9xgS/zדwQHtP[ ,m5 n'bs^aF!‰;^naQzAA.4|/MVj~(h/3d~6m/>kaz"ɳ8 YCh,#&l>83r Yu%x7ZSJ2+'1j#jdUW+'kqvd[6I3yg"cy$zl6)8b ;D', $vBz{X . СK?־Ҩ4cK6>kM/1~!##/i'('f?ųY]8l:(ˉ˂˂cŀgsتH*xidD'LGi$!-p"Ν;3g.7%y?""ĻbG>7בfgj;y T51p1,,͡ yOb0Zxl_0V[{:s -ANJVO5p:w9o5KD6#zd+i"DkKEHC$%.s&Foe>xI2'ٻ>\0ij JCDu0Ye'ab3sEk+ͣ[?ЯGilF:;v,Ĺ#1ى߅qcBd~pc nGxNf3km)E9 l?4𾨍,V4EHl< W* WW@YI7l2٦dayu*.^rX.fAsE>yX0o$3~I\\7@}x弎lRPW Pc{3PG~Ec%e=d5Mq~yF[Έy}fIi4e%"^.5 3K`_RȦ3Mys<*< hu,l(6k#d#YJWm3۾ŴJgN6_'t~]l16٬C^CPfti 40cWoXRv<䛓yd>w"T].~3]R-$>rŖM\j?o_w,5!6-lpWz7ZS+юdq3LQe47hzK_;:&;Lj`0Q#|[ME?u\ grɜ}֒;γBlXd0&|YY{D4F@6;l,VWQa孍k&3e39 5d] -9 8{kL6WCWwܨiˏyЭ*dBm{F)8-2M7^bV-Fi{f SaP BZxT@ |&nP J):t3/Mki') ^? l 0l"6w-$Xz!!'Mqs:얹1)@Mu+{܌%7(5y=ձf ZWSB=~_%.# 46v)'TRRw}k|(<Ş?7GS8{8V,mc<5Y8y`1z$zMn{]M .dncǒZG QVG)x) ;jkx`82F02z 0Z??Q\nn7ܣ7DESlؙ)QY1&3׻FU{~nD?ḙ#e yQ,7!E8]m B$¬duskfrOA$S)^]/lnj[B)|.@_M|,I2`o`m'+1KV3=p$ <=/{oI,І/sSC8rpv(mdrOh_%:oXt veشzjr8l [`\\8>M $ԑ>gĥ5OF@f@BQLr:J~/Iyac}mJs#%JdžJtڙ-N!6ڨzLԔl@}]r ʘF$&"*.<&&Is|p5-"0 2E~ -#+C\\6I,Pu9Ңx9ENg$ԡbn `.VQco3EiXgo+)HO}E3m /EVNYWཱི2IIIWR!I>.FDVPWW cz>< )&&Z ]!XX5˲SCZZ" #>{ 4֧8 [wR_Pc)#9͋ä1PI]RЧsG" I-3r1kPNdcc6d-&N-=#7G#n@'n,(ABB698|zQv;!F1}BY2@dX܍xdڴ@ ԠT&kGRp#?cFJN"]#!\OiN7mlY:VAGDd5"$/Ǥ&#-bD=lFJK(GRO1܋_~C. D6\X$x D;QK!fF?0*8z,ҁ4e]6MZJAoǷTU ˩+vAG(+!WS~M_ *+)F6%@QA u Ri9[Ip9p9|P -NnZ=V\:S#ٍDQF2ðn0( Ahzs m{OWf897v͎{ׯbüؽǙjZŘ=cn=+v7g,Zeb)Dt8up O0/P̚A5=(p޸t߽G6w\Iu 0?y`,R#o-Ҕ>m^kcʶV;۷nBYU Cɛ"?ZVfJRZU5~1w`(SɑXb)V\7-rr&?~%O8.[K`Mp޾-¢R'\"g?~tRU߀8_ wO_/hص+lByJ{/|Tb%%H m v`Tx'__yaJrSqN,^ 'ܤt_QW6lffmq--\䯺tr:}2:pkL'>p,|#y?{M`I..^B6#C/Bq1uc"ObvFBVC>- pu/>|z0E@A.,VX..Al~= '|9n |Qd\\8N>s |=xk'<Q甗1dV ?"yև49ſr p |EdYh8c1uc-ߨ/;% zvGO )!,+qy\vN{E5˟HM8rR\\_8N>s |=h7E%[k=7l`fbGOY?~/ݰ"&27f \_8zN*Xs |h7M >9uk W2V^Kr*{^e:˸rY޳hK7xϯxPVKKೕ'_$ImС+/?. K_@Q,gMiH)qdBXU͓cct3D;N'I,P5g 'xӁ1%S-i,%׳pRǚc@;oH = o?7bZdGd P5Ƌ7"Ԕtb Q@Y+k'W/װ۞.gP(LK '_#Dӂ1kZGgXc>i$[ ~GO $%Jrh:Jd!%sܽ(7տ&ğPS^OJ2pŷhκ?zziռzًLfjBO ~v0+T]Q lzr5 l2`2Wq8+Z՚++ ] | t|eGy&n?/}o)`TBL3L/ҹӜ3iyTu.Aq}#w'RwKMM<#<>񽲹LT'ossXEowI?&FԨX󛈤DQ@Q)WfLt$@x! Rf;ޠ{mϧ`3.:G7ҿCS*TЦZU> Aۡ\tPw$'0|ǸIK:wD*RqkMrȺhA\9 ZMѨ^{1˯ȵ>S9f,UauTn_AE?BPLa\56h*m]mӯź׉͞td^ wIS3+ښ6v]۴m~L7zݪW$..o;Єҿ̘6F16z[ٻT_T3nś/I6p&Vd1[n^ڍF̉{6ft^?'WPNg-֋3x~i] $IMf1豓9s[O}L9cEhR*/ѵf)~̲39p8͞_7_d}T]؆B_Nj[Cnjcڸ)Gz NhKC&uXZ? P( )sݲ5 wI}\I7-Ǯt ]I9;RU,_r t=Go_~vvrWf殓ػ{菳֎lNAy%auy; $aDre8Je~t}>2,#P^%($ .n݊x\AWせ;AAAbc2r\#{ c5k||e՘Xi'_ቿ3v-@B%;AL|kgL le>w]3`r;{in6%'. a!DBPP0i$=s.POrE(۟btb7,!tmD쯩ꅟ͸<<= WwX[V.AI݆L~E猘Uѩlyv^ z9a¿ ѬGe܎H@BbdRIfv(Ӈ~T7J5$NqbL g ,߃n.Y70ŐL،G-J)QpH?^X@ ݄ Ԣ(g)kLI^Br՚k:iLRy6~7͓F&(>+R@QU[cKrE`j2me"H#>ƙRf;.{@jtd8*m{oØm4ꄵQ-?# To] vqH,Ii5ѱqFFh&N%-iCK,X NC@=֭MziP%2+QU՟#QaMpo\ӮM/ٜSbu4lܲmN켛?`-4ILӟE I |hS ` S"9PhQhlLx"}TbycucT tKS跟W_؉?Qa,]f+J (S)Sʾl~G|6I;R S:תIEqVaXQkkPSsv54lgXh6@rxxjwmP2> 9 P5lfTk}tշ:zLx2jQEy[gş(Jn.$[$CCdt"dBx; .oqpt_~%''Eꄃc VmX"}xEPn{qr"84` ?*AHĻDF]ʫ_'*جA:ըy\¢հb̛vU[` Go<\9Om( sLȬިO%1j`kવXpfuCn wf\6l[`~kOά+cq̼3#1t*KǺ-=}Ӛ5kRR֦aס~:mmT VnܜƵd-8wWϠf_k/ l֤QO]-O^8?)oyM{TO q_l1 ԡȩ7'W^8Z8?;OMeWv%ݸy}+cuxmUgt} |~ߨ:_*a]j7cבWx 3 ZԮY &ظ{#A[O8DŽiJ;)Ӄ}f9QPybjVe,*8dh] lٰc]y0$buF0@(kWJ%^|Kc{"_"Ͽ~QQU3aA6IVT-KY9^  y5lZ8-;~Sn\Zš](R |3)X?GzȰl&`t 0ₐݳ[ŲYe3}*bغ{OqH[p "AEQ{T 맻)%&Nx2Cw9?[lm^ruޗaLnDeJ/[!+1hʇK.5j܄iQ7QG3NWt 4 u jjPBeW,#TA^Xe'B})Z(W]<ۨ2i 1}pT45u O,VF_Xr*spzT|5,)IX\XECBԩߒq?y|xu zAj wǬNըy&?Z)qX=;8{遲 IDATw wo]Ĝ(˰%3 V`092Jfnn^=7)Fw{OTCjC_Ҋ^*XY#C=6GH>JgTMbpu/0DS{p5dӄq%ωKR&]1F5Ť([^v!2>@/[OEXDF3H,+ŐbZYZ<bԭOFӿ?ݻvA <;@5vڔǻBsF4zFrLh\#ՉUCގLޅ5:a ӧc[XZ׀|TMu0lӑbT (,3l3aF\Wm @"̓=Y4}$Ud(qߏbd܈yv!Hٵ?'Tu`Nm[HfhT~jԑQ&([$ ڱY=UԽg݊ۃkO?A)]K5N$|7n]CI^ ŋe:̝|?:.c*/΋VtԉڵŊ*k=, K'RZ]b%tٍ~bsV!d"*#߀ጟK7?\K-cK xR}|!zKchܘ>F2o1\ÉyܞU 0}dVf*iPg+FK1YIGQrFWYF}o1_3J(Fm$eU/֯'>Z>+~,ߣMIJiry~e܀3zzOZn^V1w!NZVٻAE,G[ ghٰ{V`ןAωBQ.Җ&lS$Q(]W~[DfhW;Sڤ(VெMURٵm3ŷ[5]eLT86Oؾy^M!\79Yf ׯg}}PV 6c<{ ^ 3ʼfkQa8}"~emVTΒ}n6lɋ8rh[v%H,aA~\9g!iuE$Qߌo6';kƭGOKo{[;{6oo4#l:eB\/-pn֭ع0;v嶹uoa׃SױS)زeu]{0߻ټ{u4[6nd=OiHڣm;s5clᕝ͕Ӈ9{7mI3|Cp<HoML{EEsiwneݜ_5 .UٹLySqu0Sx#͛6}vu;zNpX2aSv~!TmNHb铣k6)dl^\Hl̀aZ0gX>ScZ•8:i>^9FOx[>UO6_6ыt*GK*w-|"zvEh1J܏R6( >@e׽Fe-.1\J/ɖO33ml}C_Q@QT >. h"?]`-pqD]gZIzY8wE3Adjy,sln`3ő_=l>ئͮd FmP UZ(+cfGw$KW86bc8[^`rjl_"KJ>'حZU%))hϋF9o݇~ri@!WM&bťz-W|_>H(M1`3_/T7P;;;|sLwOO6ɿrEM" !޿2XAzްILx`bW@yޭF\yhIRz䜿sҦ$6hJj(S$M3A (y\Ց)\<Mxjǭ)UK,:޶?s6GKx4:.<$]Q/VGD~(w~zE l$J _/JX5TiK3k9l>{K UVE(}KgtenPR?mIق2a4*Iv}Iv(  (¦ &U@J>`gk *Ћ'0j7OZӏPVڨ(OT@6?4B(JJM"foq;qݦ23 ;rM]mem˩n< Hy cK~%m:v\ ={ne|nQ]G_Y]ϣ_sREHu|$+7/X(}_AݏJCPu9oLmݱ7:剬<[Ρd)j6.Л􀚋ݩ[^=s,L;rtF]B~UOslџelOTx\u3ڝyLFؚ=:2~uWΥ;W&MGYqU`S>6B")q5:`k<9sρcߋ˽1\˨k>u[.?|ˑL@J?b].eZ ]a`/*$b/1h4ud_ϊ@?<cZ dܱ(v Ň9r#}sYU;|.g>Yl/<`kT@JJP/ʴO]47'V<{Fu~]ÒqNx$MO0dHNToVij|g[|x=nN2 /@x-cY47Fsӗ;gpe8چi9w}EgbT,eWJ_hvjpXZ_z r9Klx̍P}Ysi@/S}q{%c~۝zNQk]?*\1R@!߰&OiK̵J'Ȳi0ϑI7qHXe.ڴT蹃aaSfa9 M}? l*/͚?'!`P Y^4w1ש6߂NX ju\H _tX3uaꏆs\eX6o~H6>?cp:+fWi4qL* a|i\f/Zam z)kC*Fk|dS_je=_bU翃EoCݕ#pAeU4P;O>XlDp*lYȇSGH,r5f[aܙRumww,LC0àm iϨs$nK]X|4[n`^FmZ 5X6̡74T 9G=J m8 Rw+_&19۞1k^6SԞQ7p∉+cW|T gfߜ}Lss-@)z l~ʽ[fl[5) ( jHNބKP*a@Ɵ cڙ:tCo5l:81k9OypZ#9)Vc8V&׉,<FӯFɲYKx_#X. h+\s;sX:'hڡfU|Gyr++l΋t+sX>U[xUu4))6O`s0A6+KUє~Xpt_N$sCRIi]Dp-cfwT9}kT`/~)+ ( 6#h2a@b2b 5jW=O`>?PEc#xfD7IIՐ f5?LBwb}H}ڲC=!쐠\~ɵ8&rE|,R l֒vjج-PCveMyxSǪa'9># [6s͆3N/U;2&o3N 2^R ӘT{3eU܋䥨4X,]~(]T`ox*TPlJP!Kx=63?}h<:ݼ"s"~%^;J-19sǹ6%'qyԵ5tƓq1hcجU=\!D݊_ Lo[Y 2A[l^ 6~il4S`7]`qm"vT#PQ%כ.<A92Nt/ p̻/ ]3h==9z΁Z#.5d>)0SzƳ=#/=4{!pF> gei[HQ';6YGZ0VF;L l A唊Ͳmg1K'w;1V8^ B>֯.I /?B[ e@ݢw /FM` xˠ =D?m܃?̣qpcO\ؼL}d!QF{ ʏŇԙbq+]h1Y~hK=E-G$i[(,~t~fp3WiO0\l:kU6>M-P j5ǜZ 4EnZd}70d#/o/πa 4#MOIQfuy#sfU<|^ݡ>6L=X&-g6$f1rEEO++ B܍gNA){s~( B\԰VK{1m¸ݻHKTqPK#CCo1ё[//rDFG}X }xlDX ze`ko/͸_vNcv~ %$İ揑tЁ;2rH-D_X}&cKNk:Ӡ1:U8%@2)BJuX`;wsuaҼXgVNfu(X\f:3q`54zwl3=?Z6L>=n|rEEO++ L[^KVfiZ (3>GM;v?7z$OWAX3i(>mrkXKS>IvҶt|n.+NM&L^u v4k-YOڧJnD>k$<2kRF[ZKrzuLմMUuOh"o'8igcUeѱm#TQۡjKzX>`Ir=| ،9h)vD3uDqtSq?D^qCF1IBҌ$J%&2A3kKiri~mS\l$00___12Dq;iUwzS[3ERJ2U,v\u"¼ضb"J3cMŪ KYT)Q?XRX@slCQ@Q@@`3*YYr *=i}@{72 s{ vZVæg dr /ol-LץJH"׈+p :ԦNXq΄=/ kk@Fm0y&s{e);s\--;PY'44'7P[_ҥKQxqʔՠټtp!FX[6j< TDqlR+O!X@NuNoW{F3M'9{DR;0XbkЪ%lWF3^?g 4=SGWҶz=8iNȻQq8zL9L?؝1ۻWF g_DGDfBx›]V| 0VG&Uxw.hX`uax7?TpWEEw 6B)n<]@r= }`KY oz%CI&uL/$E]ZYӖyfn%-FYCP/[OBCCWn!VXF{)[&?<#ptVb4>Cd3w.fb~p5c&53[s t7{-AhvsGF&BN]y(Ǹ.ZXn+/d.Temdnp~ 6S9f -`έIlZ1VZ\~li|xJک=)[퍦f*V+dES҇_FQrVH(N,aa7jUHݑ8fq^ѬӝGU˽kJ+IX{ϊEl\zEE)+ s 'U@J3m n6oOuJ,;s SnsI=v8Cعj*ڕy aQiDQΜZNXW۬0:R^ϐf "d!ЮaY+cq4?C;8|^HGtd01nʕ+jr~P~7^;e w,EW4[Lo*R/ӑ= iؽ?Vl@kSLp/kO(Vɑ|6I ~P ^U8CbC:~esƠ#[J{.=yM29P+ /ٿG/RPQ@Q@QV͛/^[>G7!_xrl)5+W~c*jOLP^l'f-.[=ٽ{{vlb6Tј7Ns։ G.K` IDAT~p تjj/͔59ji$2>&*KӵUC6hL.]2l t)UGR80fB-De#Vl"ו~m0Oc*lƆ9Ku5L] Y9.f!?BazgIb˂*a Ȝ9.)!ՙ~*Bm= 1pRǦ7AC˘d|J 7ml* XͷTR_J=SN{̪AFTщח̖#)R>S&4ݷ3VEE rę$!6{Wغ~5m`5rX񓉋U,[˖bzVی ٟ#.6o:֬jČS|5˛YO~_+!Γ)ђ)*mr6~Ai@Y{eVYWVvI1}h۾ ]kq̚]_u;d&NdرI_g.Z]|%jiK./tJ:sdIz0חۅ 4~/[>zCҶXňgv晝˨RX6o`gviLad+_Ǫ-T3 l۟l}SV eYޔ^nL[Rg߉%WEQ?K<H|L1u4Gc0Z?pA[Ry~,ƚi!j{TN,N#9,%9) %oiKB7=5nXjsa.aX-NEyhd܊6OmKK#ػn5Rlp|zN͍ײ#+c,[UrY//&%Kc9K%{xvkWZT7l~D FŒiՃ6xb V,E2Ux^RxP}*6SZRwmX.1w!-˦FXAu?F^ըJ=ؼLΟbuூ$I䄳3D}+(_B LxDB /;f O!t철KBLgDa>k1~-PB#[5Mhs(H!uһO_f_51q85(PkONٔyD0-;xfզV\~N;p ,cћgZzW.Q|6O9*KL/ kސĨgblRFW~W;@#ڭz@hK)޻Ht*T..Eт9*Գ[RS9{Q&3NxVwyL8!uGN+*mjj,lfX4kމ6ӼQ=@1"ӺX5 2a!i.I auRN]["N~9{Jzm3s"B):Xh: 4Ejt֌ێM6r&v<,=䄸(F4mֆ=Fq̙5E٦(=*WffRX}:{ItK{&TMmmЭVSU*TE>Em]:f#td|O#0YGE_NU hUf-u@Me1 d$u4#IߪɝKQUݪ^TfƨZu஋~ܹt6Q"ZצoȜu; 2e>)TĐjKMCYKyqnpMlL%lkzzַܴjPIҿWJ=$OE,K'`zѥ㚻oFR.0D|JPדV)m o)(++LΦh5/`kVY Sռ4n-qt4odžZ5݉g"-@a+a\D}n lJ$^-%oq=|F&NZ@/9P\:~b]9m('&$2=Ŵ8qz$%<\S'5lf0ޒ]04|6I qtٛ,]_`Pgz .QՖĄAEeSfm 6fi͔M):lxUoW"Yt$Y2۪QNؽx®MKiX["*pc՟=u} l~]Kiߤ@`3!YW"0OE/-JOXfkbhH^HQg.-9|,SSq{iݶ!Sr 6Mگ>*ņ>WU"8ka)T(oZt-3O8qrAOnϭgiMIX6 ~6rM\d,V@m%G56ÝӢX-=~PfL/JS.ҹHAZW6pzLszN形۽FUvg[?Fi@`LP|FuڿĒhj6KPxn:RL3Y=Wfhɬ pŧa35{LΛpfː5h9r'b . O-~j,^2"tŰ^7<P2rz]f|J|X~-Yۏ966Ҵx9F=~\& &O֒$-L -}7oN-hִ b}I |P1`<`]] lmʉ~xrbt}!Q#6ƒd5*5τNՋRLͬ&(B-xEWqžr>Fu+Ӱ 1/ׄ2oZ$]1@SL}-:$V#.?|6"ea,S;hn#?K[)]']K+EׯflyB7sC9:@( و s'k 4Cή|PP`Y65?Mgz4n=Un |Ɇ|!9gM5 ތ8$Ĺ2fxVȩs|GwE[MYPJnW{LvE>zPq2劔`8:۱}D4a5:@ọ'Y6;v$Cqݹ e3JDvtu)׿g6b*CZPo&}ũ7s^Rٸr:d%>* =ٮ._;S4*BaUE^\g3=~+M+UPCQM9;S\[7o}Y?ߧ l~yI[)>U} MWFh%#jҤI~/U]> S٬_,*< 4U|QMO%M@-yYK*רAʕeBn#-Sx;>bB2Ӈ;u(3u1.ϙ35t??K>)߿ƀҩ1JDwҍ^bar7OJjzj@:x" 8!&扯6-wc`ߞW(~NFOLޥӯC=Ԯ˿-γB73khz3UJz,? l~ eU4P>QW͍$0d3+^e?-s 'ǃ[fܙ0uyim,s +f\'RZ\mb*_t)jµ;e4ঈ/K\Uysf^O{]1[RZ-!>&l]m{+[|f,:/;R l*ŰJ}lyۢU}(^ }A.3yQ|> ԡ~VQtiI=ԟ2W**Z8:c+(!! (bbww`݊݁ݝH HwKw}eܵ<7=g߳{& t-%c$\|êmCRAw~C!VVy( [7,E= &,J7VR(L̤ PQnOHߥ%0PϠ/_%P%a n:u[tڰccQXqݼwc֌9TBu$l=vUfXsq!UBBk׮`ذcm7 Are6h;ӻ%HOIDTd0LZl*"#PRNFh:OF=ϒx̛>MT;՗-ZqSqS!q $ao1^^?\jT6v1l5 Mb)Rdb!y6;dr'0P }wBZs4tG#jg *߸]ߌRŮN)̇,Q{[`pH7F=N<Sfaya)2u:VJB z(VN  yk&CF`ʔiX֚S@o?gBRU-ݛ`5cr/j "C`X0k:=:EKi LՓ;1j]wo'r F pج=uplPWĢݗ#K2h7@l{p#uXny,/H6WutV%3YYh?> f0m#¼8ݻ֑S -M'#ظe;nٿƔGWObf+tfŅ{m6``7Hƪ-{qf;[X&p*b`EH)dD^ : 35>'ZB yIo5 T!PT[DIZ0aHtBӨ,&|~kk8lr-Ƌ@сjfIA^ E#lLVT(ETP:F=33i1ͨv:@В~hJ:0)3/@[/ c2Aes 򃥙M|cBg-hϾ|dee!ENk6CWV&y92w0tGlkX*2|=e+!D0;o 6 u- LZ$D6Ӓ+הdcWX> / c5I~ՔKFIf1ܨwu@`3?OvR;lGo%qɮ @:uЬE 5CC m\ߨD ֫#d Ik O`IQh1QKz@Tt`ZinC>o/X|B ek6&-`U..zZPmh/ʼq5u`3=4K¸*Jl=zSYUW3%P$ao1^^?\jT 6Q [:CVkn?ȈDlJMMe?i8e=R],*^h[^"8v*6Q;ZJfMC 4P2h 6 $lΜ6Hkfg?MFgzZ+AVmEXJXƿ %%%쒒h!aQ"-'?j8lCyWYHOKAjJRkОBTdge s4jƍƓAbVY;=ANЯ.vVfFdQ=ؤn6")񋬑]6]*]*`vcYfCCXWDG SOw^(꤅e.J e[(hWNRk; $\M+#Uδ!bJ/e`mH .mDI]0T$Ѻגw334GGRbbcWkO.$`mw [OwG[jtktd8_8-ܽyƌdN㰽{/#,$Y$L?4(ϟ>흛St8 ?>ǫ }Q]|b郐<6 ̰=i4n# W+,{)C L x,o!1F(AT/9!m`2pOa\W54Є_DDFS$|Ny3Mwm_d ̜<|a~@iUOk #3 iKӰpH43ƕN{W~S3mFmK]l"R-1xJD' 6.vPï尙Ne`f9oJrrÇE饪h7.+?pG?f^CWWxI"RvAwdf}H1O]TD8p4o9wgOyQ;ϟZ~Fb(v-M6JiVV:,@XXje8u%0mTjR/ʳYT S t[C1FFSW._P!KH*Ǿ@?|*țM֐= P?x|l2(hz<Ը~IFy46@z q_%Xz(X5M'VN$\/HzV, ̄壛عu#lڌu;*X@;qrEf$¦ ae# }6xe,+_/;o~M[ {?j8lXYsy|9)QXZ'9xn}B3ƿ/5Tzl=Y2#O(a wőGq1hvNFǫU?<~edCA7& c}crb? 6C(0ÓFN) sOhj*æ7޻;wbێ޵ [otrrIW,$,`C؞ݫgt0f W/ؼn#yQO^_~닩KV-U+?OooͲq~},%L菙k67:ʱU~'װdxFV;l>^5cFDU}d5:k+~U_y,q.\ F|:ߓlrf7|\?*ϱy62wك]OP٬!9[:lT<e9E l KL*;ϮԞ7C_] {8!`}|o::cNߔ*@oF'fq?ocLc>#"NåVl1)ռ=J? zy6W\כ'kSиrp~4mǜ!^OX0J+Hw1 $":*>S65a$H'X7 F.YO$CfJ"(x\HJ0O`ImGҦh!& >!N0 EJyb)Wh$g[aR{SlDuٸس3AF1ַt<:8-2H@7"#8;Za%p $"yŖ /&sk^#$n͈ /5RDfР^ԩAVjY¾]$?)Jc2_ǐUf⊔I`iI.X߰p m:. {av&  HZ]AQS̰9=b zANA (AE]篆7AEefMCYWzhg_x #%o^D+@^^zq?"^c9 K/{C()@Z^O\FUɢܚlg[7B]VNE|Jp]D zABX*.[V;v L:°45}hؽr &ņضPQ :tR `to#2Aan M-mhikC]] ,HLN}0іCid=6=|,i9=)/c921h\PuD{_ ̳Y.sѸBEQl\31ˆEkB/(Aj|n= AG_XeB ̳3>Ld&'tCRN* Wm-MuPFw|2~K.|j*3c(($.). n7VAM?E%NMM)t0ІIρ{"m aB޷vcmzx* Iӫi zC@3/XoknXI0uƼA7-޳͓ӱ5Z*;>Q6] ShtM)rx4奱%)҆t<>2- ΀z(IBʹN9!+; OoEg#-Xڥ50F1qQ`An{~xt5G!2#5׶MZz1H>yv}:yOl>`gOsdӗ!fsa3<_,Oh\kiYE+Xq--׈EkA=2an3䥥k4z ]#```W#!gy6 {BC 7?f`s,BRKFv[61MMF^˷61Zq+iRwrX!> Ļgq9l܇#.;y _Wvj$^ޣm_U"+.)6P{&$]fz2l7@E=<դQX7o,Mqf3/9fpΑ)4YTu&yny3<'uP4U6y#|@#g)3١9hke}K%t%}*c(g n eYv4eΎ'DbS3)_ -E= ɩiFY6k = ǰha8`4کNda+7_ŭW. Jamў G@{ȳǎWC1Y͇"0Pa0~w#%q/z/MOoMɕ`6<"͂<8^DZ){ n^iY50Fz0r!)cW?g;#C(f„'Ncp Hkk74ݍM{Z[?0}-[&ztb!_s焁4.Q29Ѹ_cLWF_i.0o,[+ME'# t#<lF8/ w.xK9X+V{/{"1g_{IFա7V^K ?BCIWQD$cyMדFö?;S 8w zCu[vC#+&B[Swi:}iJB;z%\2O^ ’ɽвa38xpf+F(`kV MгO">t0ZI@bDxɉѷ1@za0z[m3@.+r)ʡ!8Dng?q5JHJNeP^@g@GAx7.bxCQtlI XVÝֈ}ܑ ci !&ccw^"6j 8lrج5}fSATy&p 6MW!$-SFv,_vƖ-[i"|>smFm<}TE^zr._FZck J{љC[D+3Ǿ6o_/k+7oL* `I a$L4m5U YId˩Ѹ~v$ 6<e&P84ƐI:khۏ!$, BqftD ,g= FAZ-f/^]wS5@Dbׁx#\WT=7=te sZV ׶vRvR~ϓT1^?b-q`QŰ)sl۶>{#HMdȢ~$GG&Mr;vT˞yi=],{wl0 cRkS1d/#tYu9Nѷ% ]4s@9q\!V$g/l^DIhNSU6},0`' yl5ƚ[po]Z[ew"cu[lFguE[_♴fsh |+Suy{ih#D  q`Hxa@^R(M1Cދ 縼hݰ_ċO=FIv^/%P+$afUg:xl Vl"SFJ6G8pEE'#%)ARD)(vj(kP=m+i(e1{^4:^E"/Yt,5z- q3 `3E Fb/'֏^G#01J)-!H%'DmpaF~ E c}pb(AK*3R\R.dIݾںp#$P5{ɉ>E-"lq|\n1z<̵ 6W#+'Sv~O$%Au$=rcҲ N6RP綧`Z !kqǖдx(9 Nr4t|iI2eI~`F:`Tt4gQOL}`iΫlc#IxvahR)}$_0qtP܉hА&y6`5k}Zk}]MI(ex[-Fה|}yi>~|3!+# Mv00w)`sCB~UU^Yp]R{y;oX[A^ 2Cq-d^V.Jiufre/ +_j8lr$<9~SSft+fJ3WxV\,'ӱlRꝷ2:O`g&: *FϘCǎb߮-4v8F`њP&ylrd!7m+< C=m11Zw ;gwą{chքyXfNl*@A-PʃGX:{ Td1- l1<&737e MTm9NOG]|Kl(W Ct TqBlg/̧&>vNN&0v 67lR`UE _fCj+]L)ήVR}p"4Y͌wX33M:O (ˀ^07BY'0KK&ͪtfEE3TZrDQ.pl_6 ݼ >t tdžESLim5k164CxZ1z\#*iwp[lןV"z6ˍ IDATcJclG~1l c?-¸6>!!!q )J7'C6VSUѓbD_Z".\tKgK[BJ ;uF_Z6'_v$˔ 7fI$ڨHBR "(:;/= G˦K1W[4U0EdҺtre#agu:#S[Z#V`H,}z fiI1 Pz EtPBr'Rs(0# -b>Eftk\h\*%P%aUyliH6 <t1vQ% זɓ r,#$y/5WV,93LEt/-e$p rhWɉd:Qn\GIGhDɧ@vzd}$&c#zKg)H7 In"ȣ,"}%$NkD)eLpjD`ZjaTK]Qca8t!H¶Y})B_#&MÌCN w{LZIi!D3EaVOmlhTt??%?MOK$ZVw/Dp>~Rhlv_6!OJkg3"aBu㻘(NSR`O?cHXoE'6ض4ݞUX$C-<#¨)1jF G. ]9F30eT)e۲iR8;!`4l4M^7؅5C0d[%^l+N= _?*}+Eh%FQ&E7rF J}\9 ~ TcbjkA$|!Zѡطz6f`FC^( j+ʌCal6W^|~KK&Av%=5뒩,||l*I R xv4&HJL{7`Hk_g3*"I4ɳH3/<$OܯRl+-7oCpx$%0usGMO<<"1L3ֈ)T{- ^69llPū#Ke5t NVAώ4N7_4F9fSTʧ_~>)yUd29Q;mOD:or( ~y*`48f(b񎋈Qzi!O#5hij8lrج Lh?gO k7tM &#NL*ʦ@_rQ7&[.|@U~_!܋wfBc8(' u,'&DJg{O={{;do<tf23\ pYP `deRefP J;;O핟˾2YY{cSrb-r,r)כw^f +w~ IY[ *,.L6w*'=wUQa"Ve/|ztپVDr׊f9cnTgt5O~K.62N?T6SYe&Pj!i `cR C 3P)cZ\׷ \s%v8bP2OK1( 2Es3b>;sR2rM~_$a1$ :u*&lR7PoZ$T˰^Y#p%/> G@?pxLf& NNp}) Qjt+]CJ+mIkL^#(,% ?Qt%(K4b xDzЈh9yYׅ{#(<<4\$P U[efp׷TR%**BLX47qUDvF B<)O*G*xSMOʹAv\I_@5Eΰ ,[Sמ?~a(ȎK0[{ȶl?Y0`NI8i&uԃbP6`Hĕ@F7nW`!QE61vy)9,s:@(㧗͟ǐp(ׁtzY aB TxM^D#,%ƌ@b&[lyIEl>tTL!) =aqT($4J<Oc&\m0<fJ2`3yOK|&Ĺc`S w F|xiI3,"YCLMQIV-hBnqn_SU%HtF:Ճ P00' >0\j|X! K 8Ue9\~le J(c+rj>Ԥ`6%6>O%p]4LqSM-@_P9eEq참1fS;_= ^ 2 D.Ykfr O9LW|l\kW-QAKZ9uH'YEtg ܰ \MX@Y\,4ԃk~1-1l]7z.FYM-Za_\?8l %K&7NU'~ׁGš]fS W_yz(Z GEk6czhgXWcb,n8|׭(a-pI;w666_v; ?MY)1(YZC%.ؾDLxVMe9~66M/GBh]έd~_RRYM½4oZ䕈$]dXgh`{Oƭhux0fvF_#b 6Xc.5VmE()>d= 䩥dJ)L׃gX87.8l]1e鎪R}Ďێ)EVxd;?331}xhIO&8Ue9\~6lb =HH`B9ɁbА <{pgNGza{dWJww`y>oXFa[R-]?|iΝ܈8yͮ"m{RZJ렃EO$'}Mr py .pJ %ḹF6,ɡ=W#خRRş<  Q4 sVZR<ѹMGC0lֺ2(*CK!۝h}e1FHCVd x!nڂ6 VӭЭS;ԯW[$͒@[>ZJh +k'6y[c 4Z5UgsFV**N0Ui=I0/ %>SV~ %|dk6eBb[4.n\[!KI&7l?ʰvnqY:Ey{eo ZqI>~ 6g{æ1ml`̭`膌,؟z|x`|(6*GU, eMQ'XaŊXx1Q#)@Yl G:"`sGGW^s9pd~h^H* k3b~ @M͚e qׁ 6cݤzTF߿M4M\3F)HO0]%::,%=#'*eZ fH"KZ5l$ '6O .ؿDEgff"##qOz >J,ͦieVlVF©ck"\@r/ ۏ2l][\jT63cXShMu𿘹hLP=+gB_:]&\ IBtڲ{wma¢tRl ។oizu~źS;ARKw]'IKz& b:kkka?z<[8y7J$?eR6]{hڜyw˦ѥhj LS㚽. r4^ .ӻ &qs  y6 ZA'\b٤q <Y7}p:tڰ)JnuQ/rHuFYrʭdǯ#,WeQA&n)WHJ]yJ54tih4+ڋl"T[6$԰ >dIݯSRw Ghڬ5jD{cHai;e.9ɖUPF4e)%K}$߉"R5 3fSJ^*K`% e9i8eG+]U&q:CLZI"⑚#$uoץ+bTGEXp*^9r?lP IDATk8lr oׁՆMky9YȢc6s54I9=$k Mә4=5%t.##] ܽcg#aӫ }KO*YE4F6})[aٵOVl$#-->=1L ]Rr{At]Fy9,".eή^3^~ @M͚e qׁՆ͚ljJ߲#p`l 3wĪ/<)_ZS%?Mn~ar:Ptw4y8x,Â]v 6Dj(v;>7%P%afn:uGZoj8lr oׁ6kY7}p:t aAo]`n)gx]Dw?KK%aex\,",-õS ?ߚ;+g?CM^ᩀwY7}p:t`$/ǷOxAcLy 9K;LZ/7pnB q  ۏ2l][\j|l9cF tdP6~JIe; фeGG΃p e4_3jopcW_2{,ʽ+ CSt=ŚfVPQs(B;bJ*s,i1TT(8 4`j=Ņqv_?6~[=}8J2C-M!yDYt}tiӦI[mp#QL>FCfMMg~N+M{~0loGna!! ˧|DAW ^_ +kf:7|: b?j4\P扔Qtಝ'r瓍((~]a'f^ڰY*zͰɕa}U/k5Px%|xwNC=͍Ok,LGeI&M;󽃵SBu'82:C{zֵ ر};"iĺ6.野Sqڊ\}t A4h(> RT),VGc 0dxn%E9S}0ø4ha>j4c$c4]c,vx)z@~Ѭg3+S R/?M ReȶYW͇!({92dD'64HKox#DuOh.(xzӋcy?(E4q!t, E R.m:RcO7 ^OP5$!7u./-CHFO/(ؤ4^OU|2{=fsɾe ^ 6ËbPhT5EgM ReȶY w_L.fҲ+0l;W[k!iUI[M ReȶYͷ炳`جv4ٷ@C+fҥK5/,Z %0^7|efnZ_ɣRz; b5&<ɕaC #k4ʰOh1>k @WW!,cSUUúdzr &3@޽aV~H3A(4OEq"O!?W&jX7幽زz1̞VbcHVz'aެ/#ٖUw5wẛ͞scp9y0wlX򙉹K;LQRmn͓LG4y&nBj9V^|XsQɊ9BEVA֦X=w=-]bO%p%h$}.nمY3KxyV`$>hp`جv4ٷ@Cˆ9EWTTn$ۖG^8G8S~D`r.a'o1d.^8c`H*B׋?Fk5 @+󴀳M=];1f1(/la$|x)}L?Z~ffh׭ æM?b֬8xq4g8Z4mc#нugq\*+SէT -/Q%Cqf,g]pSx{thl#M꬇3Ơ=<`NaK0B; PT @&W 2d[X;?-۶E[ڴi;#*3O(*Q=40~,|y9Zv 6c)&Cˮ}p;(Bg~li|mqi1CVZΖTsydsp>Z~6^+V@\*clZnF^R5KL[}f/]!/flA6-9m2e(++CaA>J pFjNG6|TDt^Z >՗T¦Hb#/M0p*\B$[ſ+=CplE_L=\)"VM*AI~؞ͱ*$?aJ}` 4$ gf^x" ӓWPT^!UjOT?96#ŠjFDמ}Yu(ѕ"XwЦEct01""j'!sv_w$l|c/{UK]>l _{+Upkt/~9%2Sp}70{8rE -9[J/MGɸujqu9Y ۚƼL(OZ7uQ\e_~u3w]Gv(   \6ʐma=O 10h\ϦT{=}Xl -9! Zn Ƙ{ ^ȯpìvM5j ]adC,9zR?{8hSSzyS |1}!")*|xWMь>{3 Eˢqhcn]vE.]Х&zZ^ʤ/ݿ*l8ɪ.lꭅ[i&E+#(?`#wy0yi+hjRĕ.]:SA 2Ty @Cfsɾe C:a(;MB.K -oBz(]tD56G1L7~hߪ ATK>u6(|6Ά>}0nhhb雔l_5| yR1.h5`36OԄͧ3pq\5 _Lddd"3Jhɲ{c˗0kx [/"W4/߃l} @ѓNRf{@&W 2d[X+f"M}c r£___!ӿC{]|ozm|}bиmCRJ ?[4;'q9j` X`!!Xk5` ^_ `nE9%żXk5` ^_`ý5ýk5` Xף}6&k5` Xz&O牐~d X7Y k5` M ,zכƶs5` XG k5` M ,z?'B#5` d 0l2l2lX@@zj2<ܜacy Vf&Te;Ϳ/lN C~HK l_,`om _/d>fyXv~f X^ё} q1Ѩ(+$%Ú':"L-(;vVLO2;3CjO7K\L!:5V\T@8@<0)rϰɰ(<؇CkU4'{k{Guo}=)`sɉj반p8h>|p"ݗUJeuur@xhZt&,,^TޕLNd95l`dج!WQ4\yX׫jhS)%x{!>6 SE[dJ@R,7 Y]O}2yhL\_^\儸60l2l:[?ٟ@m x:!MDdH2#Eھͮ\|;}IqZxQ?<֫Auq`dT+Ju_^>$k5 8"5)"b} `<+=UN/]]͗$_:^g qq_(Z?-&æZQdدWk@:ݥft siv͛u7<{ Rs{,Κs,WuBȌ>We$94ڙFa\2YZI0ja{x >X4r؜U4Z=.Chnsܨ6()`Si_qA.يa Х ÍM3ߎRSIۡѴ 6ME}Of'cA07 Ŋ>Ӽ69 .od\wFHH(B(Z|+LyN{A0;т M)ln!Zh."Sy^1æP{]_|>Εk5` URPA)BcԕH--4XFHMU.#?틘9i,c&㚓"hN]?accn<_daƵ02a ~)tWw4E&E.ufKSo0Z*_&FaqXy;%(|v& 4c)2<|>fIw=8_?k,*}>i ;դWbE/HQ9J`O &'6͇/!??ѤzO 7=@()>FJS^%czM^8jKv ZZ׈ȔQxFxcǷѺUkse H*ԌNWpMYCe X$ؤ)ۊ}u9ZUd2w4Zǐq&X}7ݻGC.h';1d5o 5fahLç-\:;# 8 ynx]&K* y|l7{>>FLMȳVԷgLgi8_?ZX麮ng5Ke4_́3'|Y ˣ9:S!f0oq :;b FM(xy ,:EEE/M1% )/Gא1+zXP3uY|O`yX*įW쐓_TK}6i 5Q]dgkU1RL^L# zvE&! X㌙5rs42lncq%0F_SzvG֡cV8e󽍞Za H,VďsFYˮ '>SV!P$ESq+Ю>\KiJU٩WKei`3['nC-+Tl07%,%4@lt]$i9TTJvW][MG{uͫUחl]1 | >o[h_5p7!з,_CQZ[M>MN1E1#K[L'`v{M4MRѹuK '-G1tc֑()н>)Ie0h]o)l_̨~S]H)mA-|A# 0E3{b¡hҲn$!OUgQ{~8g"\E "bR60l2lDuqkY_4e-rj>/~n5&ڣq4X2E !}??LYBA8;BS;~<F(` ]I[Вt 6 ֹ1~:D%xDMSТ}78\T٧n_=s3t"(Y;MiQ>N -!± _Ln; wh8@ _)J ZuEYekI/{\Czδ#rhQ|&#\FIvlUf ? ،`SNI*">ku`S9~ux'e%E8]ڴ©x<A0AC#l=pw} )>/Ϡ@=yJ{Ml4+4nԈ}FY^9ѴU'XA$`s ´/'Cp3C.Ek˰``` X PbprB,J >+ޥ?rdxpzpϦfl&+>Nl6%Ү|=U\1B_D6iqRwi Xl!ƎA{ASKkS3LTlR\KjUYNp)/v}H(׺e1;Zu*vÖ `lZ:b3Qz%،ȦڛO;` ׀4-MiqͱGi?iS4HsĴho2rr$\36H+;"M]@6(KEIjsZhKFv=_B)*\<-;m|Ytd7AFp3,F:q y!.n 5{H#E@;e4[bYȡb4zw|} T)Py} 6i-puz%` % \# 5Eǖc0'8Wh +d;`!Ćf(U6ftn c?X_`ea݊رk.] ;;X_ő_V@S_ 4vVr4I1 ~Y9T oFʏ"VEHqgHra֤&H GbK-g-)cb__#HW?ND'+iK|`o$]6<v8t0nܲ@`?}`ahCfRPBL׍ uCDx8PTX @[n}h8 0a}нP<;nYZ Mw`@]25@ fsƹC0dw `0O ,`mF@"oQ5l> 9EHWzkbZ9U9QX2u jvS=kS`%CPL`Ec"+w>m73R_Df}AG'޺Z0e6R0Fd2p((`+ ͞h|~3cU+*3ѧє<0pSÁ[N8j$:05M.ˈ_WM1;F7d.]%d,= 7Nw] : èqkWb-Ү@',IuM`4Րkl~1{,`hs cCu0f 4ҎOp+|׷=?nN=a0j>5;~ղ9v۹ GзgMl99()ȁQJ0bذ2$^*;h WXȦiy} !tr]iYY5҈tE4dk DgMZ’ S(:YL G{XMVV Q96*gr^["\/MWTɲRG7;#Su\UFO~n&<ߖ0'_;:"߃[ >SqNnf 9gV+&@OثfK mK |pvLJ&_#tsv|^LgJGIa/?lRhEu}}) `Si#[\/1F;XRdS;X4{:ّ*+EHod',|>>%zqdS co2+WQlҴ4%TMDŤ>t=R{踀) 3SW@@iU:UZS'?ڼ/Sn:y__i$P;b].%>fsȾvI _(>+-9Z2qEeKeQFQFa?w__Qg6USZFy5ɾr (K?^?i:=_Ek_O4 ;kʰQM_ʿ75x4厄Hj>=\kV)RZx">:^}R\ "qё5l> 5&8 EA,j^mx{ r uj}aGL:کIdx75ןz~^n:Sb 66k`a $ dgeFVGG!^Au)/;i] ZRM=@1Eп72>NRLATDkטfg"~ޞ(ȗհaSH q` XR[1 5xPT.<8"[M9Iͩ8jݓb J'"m![_{`[)#|%ti,!p;+dbMuŞaa _s` : HJM T)7 ѷmS]~qsqDTjtm~CGe^o/+T6ь &{aX<atEXtAuthorwarszawianka KXtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/!tEXtCreation Time2010-03-27T08:34:22F)tEXtDescription"Photo camera" icon from Tango Project \n

\nSince version 0.8.90 Tango Project icons are Public Domain: Tango Project FAQ + tEXtSoftwarewww.inkscape.org<NtEXtSourcehttps://openclipart.org/detail/34423/tango-camera-photo-by-warszawiankaEtEXtTitletango camera photoƟ˝ pHYs{{x$ViTXtXML:com.adobe.xmp "Photo camera" icon from <a href="http://tango.freedesktop.org/Tango_Desktop_Project"> Tango Project </a> \n<br><br> \nSince version 0.8.90 Tango Project icons are Public Domain: <a href="http://tango.freedesktop.org/Frequently_Asked_Questions#Terms_of_Use.3F"> Tango Project FAQ </a> tango camera photo 1 2 3 0 warszawianka 0 128 128 1 !ateXIfMM*bj(1rOiHHwww.inkscape.orgCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/02320100fotocx-26.5: Retouch: br:0.00 con:0.00 sat:0.00 temp:5000|fotocx-26.5: Paint Transparency|fotocx-26.5: Markup Text|fotocx-26.5: Rescale: width:128 height:128|fotocx-26.8: Margins: 0 0 0 0|fotocx-26.8: Crop: width:124 height:124|fotocx-26.8: Margins: 2 2 2 2|׬ IDATx}XU63Ƅcw`w-babw'b((=ƌ3c[ ~sg=gwkc>?l}T->*߶(9f͒s."V^[r6tuM>])5ko_wEnK4mڔ->۾3TR[12>rvl˸{7io%J%K_}Uyk|Žft*Ujg%eCH"M2{^ɒ%jK$Iޞ'FlQ\o>k|'ȑ={A|,_ԨQͻndɒ}i~v*6 ),Qԩ3}Om2g(M4u;@ڵkgYn3sv!>;%M͛kaXUͽ+e˖->eK0nlkv0 e$Im]ߓ'M !͛7wNlԫo޽m~']x=X:w=o߿ͷޱu @'r0Kx){Sݷlٲ>n,u }4'NqcKŶ\1`t:8x`~{eoo;޵}Ǐ_is!kp[L4H2ޜ}J3ӵkz˯|i-5ֻ;i·=߯|ϸ-b|І ClΘ1-`*Ι3gѣFD2ٳ|E D*Ud-crWNJwnߪ&UJ&O3>?k(nݼ1|ʵ1Ǐ>ϓiskp>sgU[gȐ!Gdɾ/Sʕ=Fs{p=c !~`a ,XA۶[F? ԮA?8ck\㏧O_a si69 ӝұ]QV / ?sG;nh}9|'68ubL_{wT#뤏ݷwC~7'gϞfh=zgGhhcnjZ)oGAic6ށ>vd׍zqi 8vhkCWM3S/_^<OXy;wn p`{P')yC  fU~6˔4>0R0綾6i :@1p7r_>ٹLs8bI+Vh2edӾc;3gO{HS"Dg97rS؞ 2QzyF4hXcƺàALk )l\r"v~@Xe5nܰggW6{Ae̶,BjF0 -ZXukbl"X95ÍKT<]zyqcG}۶_ޣkV["̛+YVV G(Pbz?ĨŋD H[Q1Pb|L2Z{]b%c`<",1j N1Vbym|/IC/ywc`~@  \".A_ǭ[H}ϐ젖0F'sk36?G#7=Щc z_\6y) ~1z 6dimF(%l30@I^hX3c v ۷}{v'6?yuV?Ap͈Ag.}\? >xZ5/i\ۍE/dF_-[5OG}v6S0'9%^aM5Bg\6o4ҥޔhе>/,|e4kڤ>fm;qO8Y3wP<HdCXsj*^0*횯Y򆾆qkبA*UlXAC$jHr?v5jUOn<'zՒدUgp(ZXh ӤI9$8PP׫WKw˔.]Gۦz>KwDٲeH@+ӨQCg=6m҇aAαEŪukȐA ?ɩ}ʗIVt sTLOԭ[.0ؾmUҚ;Ҷ$ߠ^];qtl;ѱVZSvǂ{03A͌^^F5b:(;@{~0ӥOg@>#wviR%f)~Q c 6ٲgH. ft|\ĥM,NcJIHsS[OTqfm%]_"!t[k@l-0I,Ex?Ka&ok}O3G'0jo tWWd/f|@k腑Rz6m7NP+׃Wd/eH6$FTS& 2b0t弜:}BN=)gΝsNɹ3rp\tN.^>'qʵ rEvR mw@~1i޲HI\%&1Zqh$D8TȑCBB?q9~?uTNSg˙'8 PpZ.\<+. @(F*s^툐: <~lAQOGBB]6k"n\~Adaءt(]:SݹM)aeA8~7BM%&xȹȱ14Xz-4LI`;>n=볁xΕEȒ^Oߛ^߹Kiۮ[Ad,B$8$P /Rf 5Ġ4kd~;ٳ?RfOVmZGldK+ M\RL@JF#[( k8%(+zpaj PoRPA~͠Xo@JS׻2\37%dScS3ܦȚ^6g3SR~=F|x leH`lP&0^!;0kA E埂藛'uLKTRRA}ٹkG~` Eνs7\:AY)ʺ ҧO/z? k+گ#:k+U`~mFr@ =_&%L\N# f q  쑳p߮^$~wSٿ}}#7_).U6[:4VoJY>@@ ԭ-u zxҰU* %(4C:F{$|oyZнSmx(b.SG-ZTvY&M(^ޞy1ux~\ϗ']Sgn0Xw! xZ)0Dk'hqr$1Ëx(Ȍp5kVUt${U}Xj2HFs#XLHWRSyzȜ2mdY: 0Jj/kWɚu~P%`Y/uqn@ٸ9HBKXxl[Ce˶xϛ`|1 cr5GD!j1CA:ust :Wi_ fE'_^ oB 1iGJ`q}csoܺESwS߄>e޻?v'FU O&315>ߠ2޴^}dڑ\02:ss*sfM˼0|~bjX Cw `:E:DH2ҡ*]R .(2eKI=͵x>U{tESʠkS'dž;gKbdU{!AF*Ok:{AP6L oC01N !Ңe3a]J,.#9sM3Wc6J~7dЁRZ?~$"X$5$zǹ=; ޫQs)q2,ػ62d899aZH&>|E[lV{pj[1;\Ǝiim?K*fMKcǎҡC팊.^0>or8q5 4c[b.#Gm"m$ޙgǟG6N%o/@-X{)Z4SC$Cnja'Ȑ.x5lt8T:/mVCҺSgUz)CRsL5ns=Mh^4u p<^zF0tEH 3x z}HOT6KlQѨz?A0ojZL8{jU&  $$8 kҴE8"G 3eL^-f{eؤ2p9Nz !] }uҼ}'iԺk 56*uHz 9b}Fei:WI $} [[LZo*Hcɱm_r)ZXM6N]pBQz?_\iW) Rp<P9V[MaҾC[pB3d5p/ʴEKus'# Ha&)I -HͥzFbWZ]JUJkHӧ{h\y9 ScJ߹sg6Q̀fH 'NS`(6> 0) @Zs@N]{py7JJ(2 ܱc۷Ej֬:ea5JB*%@NelYEVn+ XZ'e sd2h$%4Hgiޡ c)Pz-)cWUJ(EJnF{S.cB1ùOס7E; \T0۫?QgL787cޮ'Ȥ)./AkMb̿xR 05R` u&'L=0Az )] v=zl-4W ZR+S^ (% 6+1D}5"[h= C=2AH #ʖ-)/] W]g18!h`B'͜5?E,T@+"`TRET" h(W=>u8Ȍ^!;*duxA ~oKv#;v[ xzhi\F,Ysɨ K>Ҡy+Z^*֨-e+W_JE+(R\7oj& vadN }p_ҥKMzT|Pat C402k")\oI%+B1J|HJĮr\ $ o.c6 u;u~knXm9qZ.ݻroJ.aX>rD#[mЍdp_("* TVƃ4`Z<H7d{d,_.fΔFKĹW/>0CeDx9%`m@ @8RACe@dH=律 ÿzݍQ{wH˖__(Gb)Y|tN+7g˰j ayx%Pu0rW1,VojTY_:5C.`e,/\t}.ˏO~?^g->.?R IDAT?~,{IӧK3Vp͓*ʕ/,`N} IRF-J h`_(KyZ-,-ݵ{{%-BL`_b 'PRܐc љmO,eҲ `[N*pcThi%ýSOBZ!ڿQ_'`G[rnk#(2F"T"r0* ýSgLF?LP}VEiyO0].\!Ŋ`:@&TI7lAv1uwvݺIqRr)kP DS rqu5aRe*T¨\$+W/ Щ% ?8irJ(s]:JwGnH|F5z0jթ)kV*yK@W:U.\"nKVȜk8~ =x 'OEaX }NȽ/͓%K[E <`\]*VzYh6MPVmtQK hXhmd(+;QHAZ/0ֱ8nTvFZ&>}Uw/ _ݸ<;RjQ_HQ$^2[//0ҡ-X(ʽkJНt,R 0VЪ]2E.5FJ=wyVΜ:Λ@2Sp']`˓'2f)P2uv>=C//ǎ4sMܶReIXRL%7l(5ʬĘ2mm`Ŷ4 0mH@ KD3M&JrO*%@4H 9k̼Y6M^[$ ]L0Ȃ͘xpX}(qJv`v#wUiݾl{.l)S?;be>D&lJ:Llf3Ƶ O`ҥf()Pn8@'HLJ1ȯ]I< X@K: "d}I׍%1\ #eW=>utJ1{q%A"d>r+*2sÚu֬Y/FFT<2"1'8)3GB†76N} euN6n˚V%Onb<#zDLj?cXb+kݹWo1ءsR@M @dӖPp%7X-ʖԬ =pP׎idYjLL:LtT̷:R Yz*,!`1650 - __,&T-m{(W4jS4Bz8n쌰w(-121B1?_>),  &bTDrj10m^K VF"}{MhVZtq1:>:ɸ8$)rGpc V"[0_ 3M6a"Φ-!ҤIIS1`?+`?`X 5#b~v(HaF0@Զm[m!2r<.\F ]AJS$KJ˗G~ ֵkYI=`]'̄hvPW@f5N Nh56nx031ĜPFMq@C1lkgU~W&@ | ӯ&G¬q2;'OW׉*U?I# (zʕS5}8:9t+$Fk]\ʜy3%'%G5֮[&$OXVƀ#1lUb ڵ+*E$t۷W]tq? ٻϒ9 WQ=hP$K|` h2S_Ebehp(t-ׯ_3: L0XGkٯ 0xm[!Z_kڲeK8pܸqTs_%1cb<E cY5q 7)Pe1> 1Xzq;ztu)'͛(\zYM%7&81 RC‚>xA0a㏡]ȝ;Ǡ͔)S9u/5M_(]`ٸ1DsIb,U؞ @[iK4oVY%I `9 X5J Y35ỸF2s44lqycƌ:WQlVgӧO G`B޽*R3'¿Me]?`CXLfbQ=75m]Ffc%PaItT]냂)=JgɡFZd~60hk 4ƌ~.Jt[#9ٳf"FFšD[_.!&ٳgW@`ϧ4``=r ;w$5tM^_8"Px*,IrW!n eKT%0KAsh (upl6mlD̍=V(dL0j`̚&Sߴişp0D)9/~!/#%R5m8::b_7T+ig*Rt[n*)pY7H %>/y= f{T(kuzqcQz}: O_{NredC2z돹1Lc$r b-{=A@I@/w LydrD%mq.cM*!k*jذAK$@ـ)0OGm^zsSR\N5hpX( hMŊ+K 0v| Op[bQV8}tP p*9{̙3hȯ>4',IG{.TYԒŮ) +A@uRJʰaCe)5P43=lԬ1>s?G7 \K j] Z涿 Цm8uhyIFu2Q>+)1رChhN۾]yjRSf8 *d2rb5C:$|1? Ls60`mnßq5^\U`Ɨ9P (g{[n'O-L)p~E ٳ[-,k[ =2q*-;p\|J s*,`]jUf<$_0y[e3Tcm5kVB1E.CUݺ-[ ׯ*Bѣ(zZ9rXX ٿ*`:jp,:ӧODV`\|Q|1cKbS6*7 #T&n}dٲeCϟt /]0*xGwORD@0Рd6pQr9=4isplY??z?߯@D+E(F=74gV 7W*aLu97sWԨrx\!X;КL0LK g #vdCΝET/Ǐx}Ǐə3y|'9'NMFsxj@=}(\ a?c+t9J.fP mxD(?s G$7}LJ7 <J))yhlgd8uFNC%Wܡ4{G u>>{>2z"a3S JΈ988w6PT tEhsP1N0o`o_+|ǢDsW >ř7 #]uz?2XBBكO#sxgEF1}2 X|}{ >y}2ڵ !ܸq]GL"۷bt+y4kԨz;۠F1u!15/P$^i_L4f n$sU~MSoJWO3\:jjԬ5ZX}=)^k֬V=U@;@vvv [eb*4X@4ixL")KWmRҁR  3"t c\ڱ߸cdъ>aX̡Cv>I3i \-WL9}]@~0;G9@@ *`ܹC%ڧGO)@0&?N1˯1׀ǪV qperJiܬyNp7iL}Jor /SW(b2/)L d( HDa9H k&JaôQ^1/M pA/L)FfqQ20+5{+{^H!ji+hwy|uVcd@_!A`}(*1bJ6e. =8H#/Y*LUkVad׽/x4mnXF;8HfvbxD2dbQ#gx/¢< 2RaղXeÍso3;Dǎ$~"eϼ, vp@ 3vȋKz/k@B$@E׿B *^80cYZ/ZUVLN%sbJޛFc ۧ:`Ct}~>8^h!U@\b2*W»<@KiܞAG[, W9PT7.\4 Qod\1?cYDWgfbh) &f28Cf=mTx>J<abzNCpX̙yh=p888H:K}{& \nCKr-Ԁ%7yoDTA!A9l *gJ%U7['XCOq7_G̃˖=酡VYA~3ggV#M(jY;lRVy rTz&M( oӦϑ@Z /F0*$H 7֣ sP`4,`q;&QFs/`ZZA<∼Ӻb[2V=A(۶m^F -@D $`:x K @׎"F^͚50eܟ6aaaJWq=qzLWr9:ڂZꂪ*J hڂ3Rh$7'x D>#N'׿>/q&N'',Qh%.ӕo(c{M$"IҤmؐ)vPWH-sFG2]B 4 0@i@ P"MPZ2CHax5y]w j"|I}PM{?ޯ?B)A$5\A,i9=aOXTx +ť閵n3ʏ0>+GuwBc0EFxF(1%AP19n]':C:ȱ}IJ_`QsXy%R 9[[6|BD;F f~ySkџF3shC-x 6[!rAóPU{Mj㹛mk,#ċA%`m: !p]#`tMi{T !B6L$I9bwL&n.Y-}CF&O$ wӔ`q832fz]DkL/ =mN>d<{=; vl2IA<^jT ސ !l?0bZӤK K( =>Sl'%JLj=RRw b$/tvV ϰg @ $ؐ R* oH"0HD!\yRM; L=L(3{>b{hC/Ţ J1JUJ[[Ev?ASeVIDAT}SԳZd<_\qIQ* 8&e/!H3`>/Ma5~i<U{9-2=Uu2mv'/(2j7_|`/N@x3CC$pq9EƳ/`<M=*Kt2]slg9۟|8.u"A!.4Kq>m 7m2µ_@Gp#{7+.'Ptܯl6&S!G-L17_pé65)(h3Y?ۜUI>r蕫xŋ,9l}uʎxc/72">^7{Zb匈fk7JExn9ifS3xo}b@&A4C:iҤO%G`| &(EӘþkf8딩:'M btnu/'ߘnǵ)A aAT(5  {4D-l??hkm@&6jӸnI֜IENDB`fotocx/images/album-replace-file.png0000664000175000017500000010547515247006660016445 0ustar micomicoPNG  IHDRRtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 248 496 1 0 :eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:496 height:248|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:446 height:223|{ IDATxwXTK{盙3'Q2$1bDsœpY1眳"(H9&Ӡ3s6AD0;v[+/qaq\倴/9r2S8zOCP( Wf\?CfawVb$DŽՋ8~rT|<O}`3P4>~ ` (̳r> ^x?άlVgwՙxdgbdbԔH~%.ӝ觧]5rbQ ee4iOJDuc0`H\q~ Qy16γ { kbwTZ#{(xǎc`-C>Poi t5xz 52qת8ZMkS5u@z`{Hb5x_kQ3"7-]bPyy yM="?AZ rBAE%*aG? Ļ!ۨSTCASSPRR]A)|qvt'+w#:-{Cmk< ظ`> OϧPx}YY%arTTT |&ܩt ahݻw@o5~˅ s YE9p6 r04^J}|+w{sKEFFϯ-<>E`p((W\_q^ /;^vB/acÐLNJXT*'O Aʭ S]@"c_t\ڊuo@56F&Shp!*. Eu)܅F٤ ' ApwwHPVQa>b"COvd&!69l1$0_£[rx,/!&9txzzÇۿ'\CgcZΝ+tttSQQ߂ΏKJJB^0| ^pll,mۆ>}ѣGoݚ8ٛ|iuwQ&ê!zh櫏YB( 7a.T #umCL[< eEy*)BY;h?nGH4+Jy|Qt2?2`GU:MQY֋7`]E&CwP끩/7uȲRiYO/CW=_5dJQVVqq|c4sj(8m7tWBaqCd?0򞍗}L%[ 52;v-\~U1Cۋ:ܹSZ )))8u rdo7[. } >U uHG1 } iW[^߇'SEJ=0lLL4 CTUҒ,7ӥ,f ̰ mut&ś2Q[cgWa1b0F2 0s0hRTY?\qBIEB=nc@W?}0vB&f"!! fS`=y"&y9E 7 #Z8~.g1B_=z[p9nPPo}Sɐј` [HtVKDX(]\ȋt_0`n|Q0Rdw 6+| աgfTDrkMCuFkbl[?sOGOJ)v#tц-x-yq!O1g(ɣu6&Lic 6h-W ]lʖ`;vnm\S@28ȓǏf͂6mڄ෠Z <*߯|C T($֫ჰ۶+gS‹z MWaQv%<^}`k`b%7+8"FЃ+#1{5;S3ƽx6c[(' n  gy ~1#7]Smð "1ܞ< -ш GpZQqN"AeU Ρ8)Ì)SS.P#c|r3}\cSks0 ϨӐ-} K\ANKTb>ԡ#<Gcy=tYDg&%ڿ7% ~hn9rz`1bNuuWغvJ^/;]@G,r=[!UWսf;lXyh'NYO/s,3%f ВZ]Z*S@Z9?gpn ܚ5kЖ"3&M w2%[g: Jјƴ ad<c.$\w,77NOkb ̛2F)4%@H-X.F@=P(v顪]frKJ Rp 6+/Æ+0k1zC6A^c[ڨ,?8,Ku%jX<4jsx+$H8w>zC=DRH07V[È~L'oC`[5 [Mn&f3 ս1bLTwMLhj`y$PH)i7tTpԗJ/< -W)(퍱PiY3g21\*P%a`Xmk5l0PBa)O4w%>|ƍ5~w>q2kzC7ao,;v,A`go/^,!lF@[((RkO_h*iLKދ69F"?5&.نTe裫 eJJCO/=.#1G ϡkۘTSW/q?Nhj:utt w!:V0GY0ˆ/1c06pByE bݯ3UK .:.`1@ꮉnTm?RJcL33n{ >12@_]w~ʋvu=4)b%R[~4'WێG@@ 3riODl'0 =`'U0f9[uT[cļa%S:G̛;s eƦpg\#@@3H΁ 44ݍ'PEu/~8XLP(B R I#/_a,+Eg]{w\Πi%M=\z;(a>pbyaGaq'$cBKTSA+//<Ww-qg GD2˂CFI&o> Rqg9t(Gug7'&/Oy{.&,?tel:6yB!2d >Q*N@]u&N"/-{&bw-L[sat- )Ps=]UYivϋQ!NM\JjQK/ͺ=du- d^&h_9j2tzx"qDHxS#6!IHieu2ť-99-}ɬNe-vMY .?6ɦ2<µ- (S)9q0gTT0hGM7O: cγ 3a+-%(dw+Xd=)ÒD|rPu:B]]&PQRƤLQ^Bzyn-+ᮋ+Μ< #$)>7aTߞOP Dw eQ0c)n_sOhܐ~.bQP6pN*B-C9 LjW𢇙c4}lhBe`tOV#@;`ڥ ׍E4^B()F>|܋wc#4o<<܄0m#o0*Fo̅1>Zʱi-=1i$t&:K!ո1Qa~Z|bl?c!=;uw_~m+]G~L8 gտ+|fDd7)0{2XRN^1gq䣸0'7XCsF>-}c (uP;Cnn+a1:dieGkOtd7]i+m&@\( ڴiC􇌅S`9y!,Ɖ5h/Sg\(n^a E>hr9 ز`4:whvfO##'J:QPT) :w㡰'|}'4e)Ӕ@S54ة3z'/ڲl?0cN PD+޴Sn,•ËϿ /~@Ǿ pwu6'z8A3P+ן`{2r(VwE^"G(/Jƾ De%tЁ2Ad_=c\}=Ze}k7cB-ΎkeZXl[qF&*灡'-b, a#0z%4PQ/O^^ LÊ 1,'csO}-lp̵ݎd;DS)m^QÇb:h36GO+wh5:o-+) b 2͙bp|'!7#gn,0L1zVmً7{bư|h#̭qNPFQw$—沭7 Lb1!}vjX3qc1 ڧ].7ܝ{cDs1c1~5-'a{dk1ƒ=0i@k0t sSp&S(vHK86"tP lVJJi{4]bgݗo T؜ɳ|M{a±YI~f?MH 0|J&ޑog~ț$|lRKkc>6ڴ7õ%4֧ݜ 3͘<>)du7}r:km ^ۏ)^C4̫kmAka4EP^+f6Mc̮>rq}0\OBcg53a_4كy~,l~Ơ <jZNK30`}*1 4e!gMfՙ_.O3lƑSgn.˃=X W<1޳{J016?Sw-. uf53V28[:7r p |`0`^M 5 `C.MfuP5ԃ;|C/ߛ665{\\\R>.x>>T }=A=~| _wm5555j1/gLt4m5555j1//jk7ni?p p p H8Jң@* pqKy/^0 hkkk@4/U-'޸Z׀TiW8FE &2cRjTkmm55^1pz Ћ#|W[t$"BQ1r p p p {x?ܜLT ..7h7' A||<\]]`xzzgqs"{bbb\}ll,<<<}p^}4Å%sTf@=;dT$mQx bbck3*+!O>EfF&DQᡈEE9xov]|tQXLJ B`̦dSX4';(7=-M8=Ͼ/kNvoyTV:}l*/?/yyHr %aߧOٱ~X#7;xokkk@5N8ׯ_ WS]wU[491Qtxyokk@5N(ёn*TU"73 :8Kq TUUyU,TTV|1rrq!h\x A>j(\K^6v7rPS"g"11JebdwC\ y_[Y;у;ط~e JelZ]Yddf砲Z<~>׿[HD{p6r5TW"/3i4DQ^U_MSPRV/9+)xWZ[5茿~3k+ƍ#!G =E޿U"&0zrDf}1v^_;ndcQ jdF`9PUV*4DYK@=v<~i& 6h`=H/-b-/s~ >=Xt<kl,"PEΙ)51t|es6+Fv̎ n왏6?>B${aLAXim|7(YJKa~Z(N#܏w رw̳YM{7cL yɦZX=}+*t;4YeI2Q"W/ IDAT q6[ZOqVhuD Yg monB]=] S’#g#vnl_0T놕o ^|/$8t(zTaR L2 D9S,*¥s89sosߋrSڲz Ϯ65F5y^ .B_d\Q>>F,jmuߣ\;#> Tcȭ 5jTQRBN3Iݾ8p n9?'ABC0 TVg(Mu"p y/=(cG™>f'NCdJ0|ecr ޟ(/o]v:IG6 JgO mq%:bǜj3˿M%' #-=% }<+Catanj~g1a,OÝk8t`+0j &7S%EĆYP鈱Wb~:tAM4 %ɰ}sH(Cy߉Pxo^N~N]3'r妯VMZߢ- >'{a⷏1j(`,<@G[uUQi0&OAve-=a7*Xh5rlbh9 `1k) !`b,K(+`17n ; Ev0mlٺ O{h4RRW@Аik6F<d=ށڶǪo;}Ť)ӱxbL4~&}&D 0o/ D#a>mf̙a UA@vPBTY7>(Q` T 0fLbT+izw8ƺ鮎 5H'f!5샩sl0qxX!w.HO c-1B 2MG`$طzښ00֓'z i|/~`6=0r9F7Am]جH,xt0z4z`6t0{Ljxz 0w6ڮW_ qN v_5%:&ZP_'/ Rb9c%,)V0@;_5c}1|sBC{ړutSf1Եd!ƚu|Źسq14T`l:Vdc&W`8ٰEgl +v+еF^56`J[xƵܡ{~#m-`ɲ2i,z1.xp,ߺQ^*m[Hc[70f>vG\z6㫦'2`d}DJ á  -Y=v!ĉ-sе"v^sDX%En'7ACG"VB_D!٧gVCI;n IJh;00|ɟ2Х]{,ټa؋h׶nu4oP=EBa,C|'Vϛf[@ L[Ds#`G6Qŕg cr)6"4>ވOͦ(A;꘲f;ҵ$Z5HPs<˭M=B$-l;lc{Q(rPic#8,ax憨LJ*5;E(QRBJ?jJJX$Cé1x|0‚G[Ukm #c8d$Gem<ښ2x穆(۳ d̳QqtCt\"BC0zxY~C: v%/9 Iqps FaΦȦhmP{3 ѴR8v8{"TU(ʈObٔk0^aul<:B9{[Hip{x:uE!cO"<}C|IY3,?n ]˨"&btP3Ceu١/L?5Sw\BbnFkC`$J^!TC, ZM'WCsWJlK!Ѧq_P秀NRؤo݇&{v V. ;*s 66S졂pxKǽ _G"R0҃OMNxz5p|Z]ޙE8&ox\  eBP q6"%b23FȦuD-Ha̬p EaY5$ tUWc\ Ȫ`+߿%>ϖGD-seKH}X.ZIkI|Ѧ<_j'qy=g`KT GsZe}6miI1pn)`vԼuӠh0W()6.q۰SJ E:OхBKv!V≎!86b(P8o:(׹ÅNߊ㴴_UfM4R84=wRF.0܂NB "`=@;,y{vV,JhJnd5}AD9y^'H'[@L 2p`tUWJ[u.C-pMkMyY #c2g/C;<-lxY9y htdfeN AJ(YQ =|H4\Ld %Q$C)Ŧ#QKKC~w0QFJY;BIY 'y!ց-OޭvkgK9 N PquŊ H(:ؿAn 7s% Š4O @4 (;fӜOݻw-82s~%/Wה#C]ϑI}sh,ͩLtZ0+i!PUP2L %{Wï=''Wc6Q7g3; ti zj?{8ߊ=(&/66a؃41lXLɦcFPBVڽMD˛5_9Y38 eai> ov..Z<:90~(*Sz]32v^\O|3Sc i(a4ƨñx^P2#.A&OiWnSI, eu~WC=2x<덕l1qtWªW)o6rD-'kW{^9P놟;C5P]' $%@E ;vbH#gñf%ti8ݿ}!K!&maƣXV(ui-P^0 3l@Y|,4;~uCbe ;AGOb7cy衩y`,i^k=c9 O׷ ,/Ẁ% 3¦m۰zb6S"9)V姯<>wMAAY7S'Ro?qj>ZjPփ치=kR L4. fa}pA"ĂchQEʢ-۶b٢y2h08LwNw0#(Ż}FAb̅_m;ϕ g:OC7I*xtkWc{nB=N\PPKtz•ظaYNqdt¼-6,]O`ͅGp}g9^)~dL>lGx% P16*/Y)S`*o3'ϱiq!8m5hraFoŌ19km Ϡ0KKȫDNR6Yit)Sb¥\Z9w/Y3)M~2nGAA_HT/NocuF R;-3'O}vC=؜- \YH??`{B N<J٬m5\!*.q6f=m4M?JPuԺ勚7Ʒv1=yBkp:ss{ZКF&uo^};N $4Y~ ( ص ё49aly%y d,QF!wou97߇kP5N%&o_t NP'\;wnϞ=ŋQ>twM߁+?w˗G\_zq{pvv^v%ʕ+¾`'n޼!Ǎ|E0[oSC:ȼ555Z(c!Bg{>G,9ٴlV1l}R/$+;+Sw}AT޳YZ3;';_6_D 5LY_}}Y\عܘwǶגJ ٲe%_7>׀4jcyhpޠG9 }ۙcq<\P4603q p p T ^X>>T SzUp X* pqKy)* pqK?wȏ^>>>T ;oOޞ>>>T SzUp X* pqKy)* H-n^;ׯۀkkk瑑w-d>_켆||>~Cp p p H88C鼖7TY.vb)Tp IDATJjBR]`ҕmu2Q7v,90gTDD bk8$ %ơ Эc\ ~ |^ )CQSwCG_lue%ZEoOt+-- (I*1TO = K+=UQĎnS(ѾW[vA^F/E !N$Ц=qֿVո~`5vj|/kE8w%Uq5I鸻m"z 'q|R,z^unnǁOeei3+ `m؜rA^'4UM^9jc-[{|/| :E4*wi|Ԥb-ZcN;;ΝGfuk(tמ[[@-Q.vR0 #1yHO9dy %57$WMB{5Lee˖aѢE¶^Wmډ'1|R,z^unnG"{*BP$W4:Ai*am7%p;0cgAN^'n?@KVb@/W8c {!Eb1DƭޗWmF |X=oat>pKG1f![^Yٮ )RoG쯍~fVx[ ?CYFCͰyxwoǮC',sOz4k---> |,DYRkgA^V򐓓^!8u rzYsk oE& *ˊI3z؁Pku;p|tm q3;[8 ΰiK|P^uO`¨APPTDw%e()uz=,l27dp p p H>| ~4<3# iC~i%"##e4\ϣc+J%Fde0/ YYY(o_ :WD%aU**@fzJ*)YFT<†|ڏ]'+333"MhӾ~N=)t[镃Oo^{nn_'=5n pqIk-- u: s p H8wEDGۀkkk׀}&7&CGJXF!.:o\\\RRc }= ۂۂkk{׀z|{O_Ч ۍۍkk{_c{/^ pqqq p p H8>Pe%b!ۀkkk@EYi#9>|xp|64x6)1a ^מ[[[;_=p/[[[,onnnT W[[[_m1KyhKN~p p p |W^usFm۶hסL,aPwQZ]C"D&~10r}W---݃/;v"x)Vp C/qqtS}\:<[#'A|:!2>`>wFTB2*R[S8@rVjhFRׇxrsׅ-%%ܭ;ʰ5=x|:7Y@FEE,-BD:9cP%p)n-Q૭®CϿb¼7 VAOG f $>"X6gлo?飇nowy"^FbGc\1y.a] QJPU n1| **Z*\<S/H+̙;SNA޺;ʛZTq 5 M= <Z06~|X!wy~Rnߋj\tm4۳J8/^ՋrX2re?r~pg8T'aF7D!5%@xܲjԤA60F6MR) d4`4 UUpvn|0xL\0ᇷ`p b AP>9߭>|`Nϔ?^ [m뫉WP,y?jc%CfGNe4$Xx!J8h0C`Qۊ13a4k qYHo2JzRJy tQnzXIxn74IGN08ffcm:v_{jy|-;b4M Pwy'WS!=\$'k[ řYoǸUB_[–X 0q y;b&يwL2XQCF[Gp$szI|߷s p p jO)SWS-91hQ$UVMcpUqʊҰp.Դ:* K'!C!Mw| !q=[ Y-ǽ CaQ$]UלIń9愺yM`VTXsV̊(I@J9fJrHtƪS`z9EUIv fNttua8|$؄dyzX{ {؟ń0]Nc1$>{1chظQ:Y7biOSֹ(+'-wbH@O_&Mթ+HLN|vs p |(Sv=6p p 8'p}]Vs p 4~ pQ[%%%lj#‹r p p 4~ pQ[%%% g{ @#6HMNTFtsi f!ˀcccb N7-@zpee110r;VO'>N|888T 8U :Rskcc'>N|*N|*x>ZouCO'>N|888T 8U :Rskcc'>N|*N|*x>ZouCO'>N|888T 8U :Rskcc'>N|*N|*x>ZouCO'>N|888T 8U :Rskcc'>N|*M|e(- cHudPY!R 1ǂ`1`ࣉZ18ꚏ `'fQXps%#\M؜?gNųpxtё8s4בrM |UVT 5G0,S1P6F67;6kj>RV`#D?1%:VKPH_]cm8>Bjr"^zY1QOdy9Y٩E|z&dTd_$5Xkk!<)YLMD*աLpj˼ebļ @hD$ :%GxlJ>Q&_-3T[wE|b쳍D8#"wmgcyߋCNA?rb\]ׅSL?}*+an<z+.Ďyz2n )Dt7":2«ߟgO=a.r?+{tzS6(lp %3;mK%tXmY{bԘqp9l=t %_w KjbȌyOmx91iDfU y&/&r20toʳSE0yP^e8N &)(:gh%X~ChGRTg1B(a!k'i誑GSrD<#''r#SVR"ku~y~>^xew]e1z`˵(*mr!{tAW?"ߑfz`&IY+DzLǜmXV!̓6Ԗ=;) k&y[`]baL]i'b {˧烉/_T ;reHa԰Qlttme_v㾇EW%#{}uʓ5HtNPK|L<\ɧL M0p0u_ ;C 5< xJi ڵ(Qʯ,ѹh׼%e9)nXG* ~~4EPWWCvݱUAוN0-[d[~ eU.jS`܊`Be!Wo3 Or+o+G6۾*VKѦUN{bru_j(wuGeM1D;͑HHc1ڝ9)_W6q=`.ä? Y8!XοbٿaR"ae̥3. ?VHxElgtn9zBѮmm۠Y&iu&+C(uE V/ "> u޼.c {I zw%Q*~/AV;_СKWtY^?cw`uE#ɴC0a^%1 IcP Kpޔ% Eћ~/uecN|wn\4먾S 3'ʶ0Tʊ!hNV;X^jpyBWi݇J5 ۟`.JڢiV0vF9\m*+Jpnzti #gruɑdW"Ca[CZ/l=H K>7Kq?4m=Xn߶56m#X;ǣ!VfNR&&K?Z^XCV8(X.$L3j!My 1}9N2{0<ٵ IDATՓ_VQ9LB"pJ1oP?ǬWc n)蘧cF`.N ], ^H})bowLud & ,nd ɺ'9y-Óп{;%I= [bڽ(gwr Kbx:MG|F3$@ؓ00/ uM|(eF|Ü,{-Ͳ. @֭1~>3,{& (ۖK  _BNeYn*,aJcߜ)",D<Y`'>UӯL|iy@,:X=ɯqK8'w|PZ'<:Sհpw:B.4BwTdg!91!AAdhֺ3@Lr*23R{#ĴlO*::G&Ki2t72keψÍѤYkGj.zXKXa.%\t(2 )aQDD#;S/Q\Z?q釮}6>Y&b4ǧ p+4nZ:ʣ(=P!o^QGu [c)ϯ=oO86m..fAaAԒRQ04Ð9^P$>EtѴc_Pn%-?4t@nG sbq`b.LL>""d%7@74,=t2YTSVaR#h4:5(n Qd޼3? \QJٝSѲMgL1Vb ch酁É\c4S{pM̤x\ug.MK0 n{WEu.GO2v,ZI`,cL:󇷡&5cc4?/^memrC]-@yƘ1ihhbX)l?^:#d5! C}\ցރz$6@-)|&u8>Ȍ*P^C=cMA-I-笐aﺹڵ;VVX<*w&m qDQ=g8f[pPo4k#6]-U:~@-ϟŖߖA_~yY!3W׫]|Vͣ9` 4m[,נճ=bA(o(';G-27s!31.^u`i+mtT.-΁O::acsF,Ho`جE0s'g!8r2ءѮOj#O`ߧ~a6|(L7*Ƨ1hOˠ-Ζ!Xkvʨ+H=6(`hW8biN9QaڊC?D5N`EI7n]{'%ULǫG`qV(glb DX(/ʽ04VB~n 矽r['Oݝ+BϦM,K*Cjl0&j#{ΡgpOVE^EY8rL&ʃ;t4N\=戤\ޮI| ;&6R:._8v⾏?$Ur .v[ڥسsB#d]gR&t톃ܒƉۮU".֔qW7ܞU!GS`y8Jg`wĒ.<&.Wr^6\eoWBk 5[)iʡ},O`)cww{G#,Xc,L]"A]x ~Z:v!)Y>E,j9p>~Q~t +)Ԏ998>M|%˔'Yp=S{bCX9^$DtDPlG\3E\O\n\n_ a657/ON|*N|*xUvsc8qP) pW)Qo˂BU1'>'>xpyu1PN|8q p p 8qzeeljǀJaJ^UGܺ'>N|888T 8U |[=PU (a|208NAJ⫐T*wqOqcccc{ƀ_b8cc{'>N|888T 8U ([iN|8q p p 8qF\N\N38q1LK3/:7=vxW' DQA_/Co-.A~KE {Oxظ@_fg6nN|k󈏷-hR!+/DTLd'nj9rGh?ĴǷԆ/QRaɧ&7(& ?/>C>ʦL*ElT<\vsN`pbpbeAcH%b}WT7HS S,*B3D7`|zcmS%+# ϼ=nJ rW5oEh!N|=п1/$1 KU d,!w]gHO %%"ܷڎ]/Ri ^#>6\؀`3~vJ}zlj(sGy-U"RFG.oz.zHKso9y#DE4}ʅ)m7'>N|: ?/4&y>~F"NKOMSFю-c&A[]1su.X0SvsWuA.TlRqB|q5,ͱo^8hWo!>#G(WWO꽇H/,R^Ǘ7D|y*'X|>5#C芬[R|+KKe+ˈmueխG^Z ݴlINO Db}^~v=ՁJT֏'zߪKp ^A|B4'(wѫ7qc;j`m(틑/g :}mxթԇNĆqʲk^GE`lzUQ0Y=Cc.FQWSFaiYR/alRܶ\~Õu _C/7?;|wcJQ^Z׻L[N 5"\szt[vX7]~]|uD2[9=uHnq |u ,nq#(eit~aXa7(M#: {SUF̤޳# b(Y߿ǓЦM<#rj^(W^&ƒK٭-HTVq) QH;jpu3&u1wXa ff;1gtl8\dE:p`%KtNs jǀ  Q8u ڶj_ͭV*CCػ3V߉$/$raKYX3Y]4 ^^gLҩLv2JaĆyPf7CH4$v$?܅]z]A1R'l܋eD׮!z` 7A$I~dD|N9aKi;h-NZͫipyNiHr*SUxUЕMԶS蚄@g,_,Iex]tѦ:oEĄ&Wyغtv< e0;O\ = Y|vYbe\~~4'zMKA*I ;LfA^nh[})ėIWMN|8q |4 _iAC 茞"cdkˠNql!/^*kI(&ma)=f F%F&shQ ! ,YYɸZ}p:wVup.,>amOeblHKOGbJ: ت.2OQ ѭ}[\bk+=mh׭/E~>,"E3Ъ.et֬ u2¾$is1H)QFau~.D-4Pf z੣:v3c/+rjՎSX|l1kdj &ia0D?8vwb E..GE`AZ!">^؋=`՞wT@xy+pcIX1c-Xx!Y;qVu{1li.M+ xA#E1"0k ?8?nN<}rh^*>ӆBh_Ooo8 OH0l\2 z&~拀psg#X(~DS רe. X<&͂ "<\Xuؤlcӕbs| $(̌%t8:9]:f[;KtHt/PTXr]pCuU+ҕ-[!ی'X=]7Exuh٪-~<g'ť޺ wo]؃jXg~r'_ i V3('܈ƅBa[|# nᩮWW؜m|s +CAHH;G.\ryYo` }'\+V~aDV= ){S"Csἣ#*x?(nnnC '.".+/w&E%pŧ(x2JN|5(n.Έ Vg_pqy VǏ]-s v)%Ӊ Bd'nF!Yse"S9y2 AT'g" "Ъzˉ/\XTYržLK>̪wOD%@D)zAJt2l ܸrIPB SW7Ģ |0["`ǙaLJgS ;4؊ v;RC=т_=}Aonp TcKMNȁYFrHn!1"×Q nHct^8.s ::@IyEb TUd}%'Q.7m-[iX?l*9XB% `ԕ\nN`n>lj(`u/)$#7dj}t.fsO,}muD;fkOOij=؃Cʱ_=P4o%\Y{vsWuA.1ݳdr:Gofo x0Y{Ywt s9Ydvlv| :;X*a&ic<d|kab.wY< y(ߓ\>ݜx{ն pljccc@0^Xy;11'>x` \/IENDB`fotocx/images/warps4.jpg0000664000175000017500000014001015247006660014213 0ustar micomicoJFIFExifMM*JR(iZ0232a0100fotocx-26.4: Margins: 0 0 0 246|fotocx-26.4: paste area|fotocx-26.4: Crop: width:815 height:181| http://ns.adobe.com/xap/1.0/ 8 372 612 2 2 C     C   /" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?/,tˋ)nio:e׍ܿQXt_5Kk;œJ+пlf GM_9n|ʜMNxWZ~_&kO"%o*Z/y/Z/c4[I^Ok-WT#x6Mޟ7䳸+~?.-[͑JWX.X>[2{`UI~SC{:q5-}^_? Gɥ_B_zBy| 4S~fu<_%W[dGOO㭻4/??J0x>e<qg|}_>m'48um>öm̿\w.k֑ɚe,=.jq=R +=n<;.|ϖɊ_VZ%+oV7_"&--MUiiV%^u%Oj|OO,7ƋdyU&~Slo?*Aw[%_1_ٴ_!STmି Ha;{Jq7-a_Y/m.+d_O| 趶7if?y/1*cv'߇8kZ 3 UfͩYY̭xeѕ6x_Wb֭O~j<]}º6U*T ~>(7Z~3y0^'⇈׉9a[ZKyVEoz¾!kQK?L4~;$n,mG\UT~#;AMۊ|-n_}7C7W}*GdiSGL?Ϯ|=nFݝv{W|uo?ܻl_ޮ_:})3d,f yٖ.?(ďyryl?"~5j]k}ny>O^ )a}Jk(|;ݣc7NⅅǓk;_(ŏjKx?wևk"mU |? L#~i紕O.Sr.#MgxWоowWx IkºixW? rʮ{uj|5o+\͵nVj֫)i`0=8S g{SKE۶?|sL>,n߱\Ez>i7!K[Kmj»_7Ÿh%֥*O%%z\8'zgMt+_`_ھ8fߩnߟIi|׫1<ʙ>~'xM+ImyUB;OwǍ|@OiJl~Zwi6YپY?g Zj\fn Sq>\~mBþ i7\XLs7h[Wl7]E|;6C$ۻkZ|tOhU*T?)ůjV?;̸UvE}_3ܑ펔 y37š۵(em寐ޯ>}kIu(G~'_՞h?2u[+VZ/ʫ7-t>]Ɲ}>wټ͵$͙bo&k>c s7M֝s[m'f]O>g }&QB?_}ɕ .Z`}B?_}ɔ6Яe|E}B?_}ɔ6Яe|E}B?_}ɔ6Яe|E}B?_}ɔ6Яe|E}B?_}ɔ6Яe|E}B?_}ɔ6Яe|E}B?_}ɔ6Яe|E}B?_}ɔ6Яe|E}B?_}ɔ6Яe|Zzv}܈l-fFڰ[CH?W 2}' 2^%],2]^CeM]~5}_ 5ľ1{Ho-4_R4r]z|H#kw7ohx@VcHY-{dn|oǞ|#ɿwU[x;GYiXBCk>}>\z|oǯ G>7Cs?+WPߏ_Ǩ|y kGdkWhxKZltdaQEpJ?m4=KP@RK1YLnpfO>-N1hz]/tySef++=> o'Уl? D-ڊb?μ>'/ԖԴFKxͽ+|zk? gѴůGv;w&#/E|/ i:qckdzL%F.ߍ4;bz {Wឹ F@ƽ: lBz_o=G>7Cs^}>\z|oǯ G>7Cs?+WPߏ_Ǩz_o=_ @s>=KWۿN/ǿu׌2Fhfo${7X~/_"ߊK@@~?S*__aWH-x8{t>DWW :;XJ?iwc+/'4GG||]ou]K5ez'[թ-uHy -OYZM4rz= MEwY}^d1y^f^l|ju^#&F\Wְ+=CKIӵ5#A QwڵϲK}?uYJeRF}yWmw宿VgK)Ӕu>mj?yej,ɹk|]]BWM\^~Z/h{5q05K [oYcC$4μXgyUgic4&vv#ͺ|. Zu)$ֿgԭ丽kk]yvjyuk~y/RhzizŭìM~uT||Leܶjh$eμaBmנM9M'Mjj#~[˨sr?'URicFo.K 5*Y?2-.͸#_Wo,y֧1?u[ծeky6lgkB5ZIf`&j,|[5Ԗ]q#ۤ֏,n񽭼2+K/l~6YA8C ݷoG_~)~8\7ߚNjgR+SoP[v~ZIBikTr'RZnW?)tj ?D;~_sV{G5 7n-y_}j`i/Էt?hgXw|-zuԖ7 45kԦdi;mNx^nu˅?z'v7E7_1~VOCFfvYҫ*2-z\/MSY֯Yuek >M4>Oʱn5[ukJվ#, ቩ$~bƿUd_&O/מTŭ0!fۺO:|l/MVt諎rxECP_ܮۻyׂk7Zε"mVY6_37X>*ԮO;a}/vaNKԭZ~WVZ<6`R n_m+~7~Zwv١_Ҕ|"yLK }7<_,2_ݯ@M>Vfiswյ(HjՔeu^X\Gu߹j-ǟ7⶷Fs[R\[7w]>G(}!բX&(w|A3GL䑶ܭN'~x iz|3][f-]ane]>GQ}K^_\d ?IBo%xpWf[~+ܾ$B'ђWyyc?]/xh6:Տuj2-U^,B[q òK3Oi ex?>(Vk \ZO&6%|<7j]ĭfɨiLgŕjይO{$K I sߗ }++/~B6E _.1Vo _³ȫkЧhØkm'.J;]7l[n﮿c 1ֵ&Y= ./jQ>:)/ Z}cSǫR4kIF]TƧqb0,j{ӶA]|%"6_o&?;x 2CjV5\ƞPW.XDҗA#o6 ՉdAo$jVm_3jV?Zr,JjmvFo_jVsK$m>_q^+𕽆} C#CݬKKHvwmibd҉e]ަbUo/-P/ZZl_g;`?F]zhw}ViH}v晼ły5ݎ<+=.;LaWOhưmt5Լ]>*ͺױ<ЫS@|PAyzy3G73f<# /ke&oh-k~K}OGy5p> [.f7KtL+Z^@+b?~h_S;|UVҿ<ޮb((rZ'tu~~/M 5n#,wZC2T;$s`qX/$I5Fvھlҭcyg#q:ޡKTfrL"s]&lTOkVb,)kx20y4ȿt!R{+ZGXUƛ8*+~3[,GF8Xψ㳒hrZF25ԝ>t79*GVUpxϽGL(UB[Oa~E~SXj#ċ/0?} _5x<|GT~7Z4ne9Fv+a w~__7@uסXtc%U,7~(i6,iXu/޵ C n1ykZ/{kqggF\ODXY~WlY_<$G[C9V߽](ofyα~w\':>*xQFkX$GN6Ğ.>no`_t#ǣK8F>ΜDn"jhc{yiJOEWh?{UKrBХL'b%מ%ms⾣" iuݺݷ~j9iWk霵3*վdxQn#?F-{૤{7&O:fY7mu5ڶm_V xv;TE?z=S˞&)[;RVEoZJqyGRj${N;Fۻ XΤ6ߺ}ŷʎo*^{_Gd]r]5xǭ7Z㑿ޮ|?wORys"Uq{x7/|{hky/o[WZҲ=\Vy>y>Eum 56ͪe~~w~>6dW_y&0n#_#v6<oǓ$>F}53MԑVHӡ[fg$:JϾvkDF_OZ_Zp{OfwߴeY~̟sEǿuOv~U&ej.g=uc.?iCtV[ڬ{[Z3N{-EoKDy?LyZ_h5ƨѴ4Ymp^/I<5CMoo$.7hkWd!U1ժ{ґmC[!'e[u-aTmjIY[ ̖UXkĕ7PmUmz^ S.|ai?xKIoZy };cÌ&k'o5\~b\|]eUOUjk]L/ުӘ,u$2HЯm6I6 5f{vw͹jpLr_ՙRgsVZ6#}_%}Q?x+_'N&]xV/:~Wn_V|FOIa dψBS9Y؍vk =K7[Lב0%vm֥Vm&/pq<-Yxx~ Ro76ߙkA`q"\얭ےc [#摿y\-'R(N5<}.OPο/]oϟB;Ԯ,-dOb ҺrE ysApG;xhetm-_EX*?=KVO-xC}mkcMH GW/ݞ፭ih՛i[Zno>;[U(WZo+}|Փ}2\;~~qb?Yzf_O GT~vެbmݒ;?ovߚuϏkF<{|m5rSRG]lUq1O d6tG$3f̕qc_]_[}Ǐ5IHu+!&]ͷgkgZN_hZR;]?Y,oVn*Ծx6ZX+ld;]湭̺|3tkcjТfX7M~ڿ/Yƣ4H۾ fǫ^S;rjXem/5u5g-YӼ+ʟ 州'Uݝ8lTJ7I'-u/o+mF?̿-^Լ.,?y*VHdI6:~ʛN,sq 2g& ?%g_U<(AEP}(xo~64:(Q_W>ҴȾU-1/ݱ8鯾aek0kʃQ8ov<+c^Ap-a9; 4v@|~K{pҷ xҼsUQξ綆 ;Q uUojVUɹI$[9s*[2s[gh^*z$l}1/  qwV6GN{IKОlf~+?|bMǝqk$sSWuUmRV T@X]T0cZ{Ϩ}TEYZ1n|ޗ~mK@!YdcwJ)Gz|Gexj-2I79=kjұѓGij$k$كMѴ %F͔1A}m{,ctWG6z+ ^[\Dc?aNOQ?= xNv鑋iK1E$gu|)[ҿgҵU{Y+@܎w}F1jw<\C0&1V9=~~o+E onEԟƺj$ z+! y~T?_~),?~W_"ߊK@C؟Syi GM^'5U!H D<,Z%#Xևqck J}KεX=Yˮ?rV4>$s}5}k谬U𧈼3ǩilirCq呡eRx~tjծVo-i[SrFZ7ޏ5O]CiMm/3V:Kkw rW|@mo{eVڧfU_hҼjꇡLƚj73i iWfu7$&/Pk^&7e_6%?4^_]k0_uy*w'eie[5#⽍NYW_r/t5Z:~(| ԼCoe5kqg?k t>Myi# u*+4i=̌ƿv6P|G,U$|gxZmĐ/4-V^+R;tyo/nO?nݷw;uze׏ lb3o3=#Уe|?ςڷl[Pd_*ɷk}y5źȿVm.[Y#/lm岵og6k]7G$f]μhd{M>QܓH=^ %*/Ծh'_3RKR=sv-p?fnԾ2’?xySv7wn2TBr|?#Rl{Z;U?y?G' ?zS$y5] uZoʒ+|寪<)%]]'̱2_y joBUsB^/ci^}U ~>6oO?u_<2*-쫲π%wLOM#X-HDJ}"Vjj'~*v|lY?4WhG׾X÷FԾkZ$J\G2~t~tUIῄ.5տHkڦ?[-X7vkMnXofW^?8ZyȕÉ+9sDޞaEGٞMK6V?ׇGPhdu|:RjFKy?M+%|/մPݣJ۴mG wPu=?iz<7[u7oTա<ӷ˺Oi^ڇ'Eֵ{h[--h_kK{\cPki?{{YV{T3|i9hVm -g~OxG4{[j H9S̚+{I±oڷt,^f_.t⥎QxWPo&Ugo]Z|3uKk[u,M}CTm[G_GvQ>k7Zj,Mjg\ʩF?a13/f|'}}_۾Usg5WCn;.߰3y_1~|kf\"2~x Ԃ+<^ܻk>Ċ,cWX;ua<<ծ6kʿ&dukFJiz»n|5y|2<ʐhd_ⒾKŬfV*Tr9uh-EvuhZ5: h7pۼ;coko\Ky;a8h:լV(v#yMa dj~(\Mq;q"p74kU^6snѕT>#9'gŷWZ|=ʵoVMbI/ i˓ξKfđnFWcTg6u/jڭtOx~_7^/Mku42<;X|w [[^{G̷k'ͷuaVuc̋ƹV:i%Vhx-nI-ժ/ +s-Z}i˚4V_A?im%>_YW\ T&[UKwJ;s}u4si̫ںxxT)Ii='ܚ,_Ց~z}h|+B>vvd|~*r"\G^k-?غPxRԼKGokje?qpwtmji~k& VZiӉ+T#վ#xKR[?oy[kOk+u?\L\\Hͺf*ޯLH>+(UZFVkݵm_l{>U5M+_iV6|o o^3܎,]jzռ/4P2۫ڟ5I\$v+^)dT -K'̿Zuy7;Q[{Y߹fi,](kkqu'ȨV#O3_}KYh6wn.?fMb{xՇ=to&OVU>~NlJ00+}ǛQE0 J(z7 [զ3]kH)F?4R.LCih!@7?F&I#ٴ!Z:#hEYk:RMy#/l#X`~ V|e?^)xm屲%b[M54 :BH_=Ui|W~!_+tXE8 _Iƽ>G18|H)Wa Aq,lpp3qkK>"x# G ߎqL~[I%xzZ]$gS!%.߅x-$׵;GϿWݶ+!C>S#*n'}O}[[Mq;dvFOƼY$7cj|= Yn]鰶6n6 ?~z,!uX5V򕿳g!rF/Cl]L-npQUIYuQ P|-7"YsNE?_WƑkZ^+3*nnkHK`8Sϥr(ʊs'|:Fo$bC[E:N>u ]Dpz >98_=haUfNkZ7NO3ֻ i[y(LV̆UcenEu1$T>G7[~־sg9y5j/±{bu.EG+CkWzP!'%;KL?:jxҺ>'ikPXt֩ "^=_GM9x6ex'Zr#п*ϗ8C>Ә~,xI|,b{㺷f4r+=!;=O&LY^+Cje[x~U?YrYS[ϦM䧘:|Lз4TTo`Z4{l.}ƞ_;Ѫ5姅:*Ia&U%z~h>-uK뫨8mwmmabKuVm>8ŤX7o-k񚸚?}3/nڲȿQ6F>Ϩfo]<*dJbNO? i]Z}ݫ_G|/{i[̚Ŭ%Ų k|]{ 4?h]m"gGL4O=WcjyůF|v˦O~}Ꮁn'eжU?7^+679Vo|h?9xĭxSzZ/ 姗$Z>3x=d~˹O*kjb##6Th29w6Mnlfin*I?ٴ&6~裞6Pdoxfڡo&f-?J:Xof|LO<6önj ߿Z>ox}fɼo1W?y˼a8MFo3ϕO_x/v^C.+^noiѥYGG]m&̟jm: V0%[DGͼ:#MkVWu4UFU\4}CXY?uW64?i>[y+}WˑYW:^!qS\σl|GGcuu}OM'.oݴ+g\Λ҉? =KO}6[xǶJVaǚ<;}\M 7s|FUjGoٶ"^My׋7XW BK,5 ?ao4ڒG_;Lj %u ߼e_4J<:Vv ݹgok|kjIq _2霟ҫ9K-MZVUf3"Vį 7a\߻ uS)Տ1E#>Z]_i0ĐLӯ}uz5 _km[ ϰ|Y_m+>_4Fuŗyx9?*Օ鍊Γ쬭 7$?OK:%F<|?9-euEf²4uxo~[oOV~>!X־T C3_y|7eM_y_꾲C>ekV,Hg6څ5i"D1i;Tdn-^Zyu+ ~/7_$?Vw~iWTH?, SCt4_FZ}not~ Ajf&hZU? sO4?745x?Y:nc_V>Gȍ>(|76y=!$A `8c1ys(%kv[ MrFիgྩak`ev_0ii2[[_!Aٿ*6=7 ecqxrFph+|N/N}o.yc/>٩6ej O"76Wf^x)^[{MY>l#P?ҽEe%^wi/N ܋n?5h g\I9 W畕:L 4xOlЮg'!DL}6Fg!;~>f˯\z`WվFZ;0_'_4]XIj ,kJNlxǑti*3#ﺫ_/SZQ:9 jڲ^Jj: gu Ӭ7'?:n4~?%|?p~]6~͍7#K iKx^$5բ |[//v _H!6{|7{̯OWVuo>VC,ψmo+}i6}Ux8R~ҡ-VbTk-[=e-hOk|#⯰Yq',ḽ/Y<ʲ7x6kK ~]by *n<wE.6̫$m'|>Z#֏udO;A[ןZTU3\32o|*o{-2%UsGSW' |Þ"cM4sF{]GZT|/o3jڵuo 鮭UXaUGCVJٷy߾i\9(pɆ~αjWPsjaZfijהFZMo !|ɮgmUXԾ&ɥmśXtڼ mb̬6>_A`!kGR>{ŏ=&QΕ CC>1Yk4[[omw5yOBcufk}k{:}Ƥ~_*`#._v_12OFo?W-RgluN۷FwmkFnȏkB7neұݤwY?r5W~_ެ~[ -qNe{I gzo"_|:ύad/~ux7o>6GG_cu9qN KZxdY|nG_hlV;*47_jYVxT ^۔VRQ~ I ִ>*4\j𮧢z|^od-s$(ƗזxE<'hCꚇ/֒ݛlZÝk↽[U>_kklnPV{[ohaK-uX9&1.hFwc^/Bֳ~X<DֻWvX?^/]_?Z1s37Yj j3y̬۶/׷=11^҄O4J.6A 9>u o3Xl7~bͷ_MQm?kܻޮA9cK/ mf_wg >;Za׷Q6vVռm.=CNmm,*-?¾4|/l.Vy _f:|%Ծ_x"ͯ764Ud8ޮ,EIK2=<5g*^/Q-&Moihm {_^ZO\M$LѪokjouGyry=^7UM6;%4je»RNğ x_P[]&8>o;w]f]6z۬0iɓɸnmG!~#\Z/O۵ ] _W\c׳R:p5et^4ۡ*->Yw+)>UgSx↡]Z_I%¬cCvO.}ԭ⢙c9?zDgq[A[(xSOrxɋ}2ofmv?\j([uFm/W}CY<3<}/cb򼽞_Ub,{<jk<1|ַWtjc^skkY]߼\ˍ\ښ# ;o:{f_3?u~xWRUɷ6XeH6O.}ocR\=BLգR5C |TS2<-Cr3,7Y6L:@ñOhc->>Lůjhn5X-ƣt%¿{nq4ayج(EX  kkfϸXjMoگXf_/ /EOP{og&7^ot_ ڼ"hVK-vkxwG0[kGE _t|?//^ƞtCEnX@"HexO:/}ZoYyM?^o1{.X/m_ݷWfi +:&?yξwE]/WIs `w7߼oi[ֵ p³+@u⮹#?ʜռ?{O𯈵5 jo1eY[߇ѵ i񧈼cװڭoViH_n|1,yO5ǘO_VԮn'$ja]>egaY|תh%,s^?3yfZ˸ER)5 _kk#aeW8U~޷fFݣnoD?k佡~#?hU ~!s]Co5%3"?J=g O c]zzKட |\*ڿ4Gޯ 7!#(uᎈ|ENdYޠg([x.FFy߱׃ω>%Irѳcj1^*?C\تr%mVȎ1ف赅xGiKro<1?2H~+4ȴHaRYFy? d_mo-B]Ͼ1޾kVr+Jte TWWfKªF?hxfvqj+3Gk$2B~o[5kVT%PH 0g׉]GW.o*4fq8^+|=xw=,0rSkH+COmnn@`F['׽,֫1մloԘ1?cv6ǽ| tM7GMnl־sMdO]W4`$l ɐ< DeOR+ܥRN^I] xž?ԯVKGitL,YG{w^j6iaʤjd+Eٱ>Ӻvx[ j\<.;5sA$ >!IKɇ$5FyɯO)$c? /i⋩-E|` ԚgÿxR66V'FlR%pwq^ߋ]:ccx6?zG O5+~ 6zTv7$N=Z!sӽ~KQݾǿr-uY3u"+3q3ëWiSUJk/v7v[ R~W]/R·/#M.(n7icƝ5c܎*$ᗁ6h9oZխfr;w ⥚m>VPZVݙo^a׺- o]a[גXޮYeYC fSn|G5(\? K7|ǃP~5xRluy [&xuOƇ.i3}|3./x _efe-WV.'t[yrk?|_%X:qKDbm'??*mK^6nw|3gg{t7$uc*~0o%d[m-oԗ%y*Qy}ٿizOT|Z(x|Uh#..<.Ay/=_JiM?7VEs$>]ٖmG򿏯 G|9 V:z~{ho74k_g]>ozCZPp}x|Uw z|%}?Mo617_$3j}~$kl ~kO|KbukL\\}J?L'Zmdka5gaO-k+y_y?]ZGrM,a}27V4:D7zڄj7ח/RsV3^8+Xume~ZHu]kzm1Rjޯ=^.ng5xz??$ZۡcK}撼Ltʽ)сxgY]ȱCwMfy<+6OIצi6>LlȳNF}.i>[uURm]}dg_QoIɑdi Ϸ{E۷ZU_~~.QϏ ~:ɛR6yV1d_t߻RMM?_'m[ɍvmGQ5퍞/?]Կ3?iz)dkˍv߾4>S47d?MZ#W/$]E-V󥁼QԼkk=?MOC7`|:8Ƥ~Χ7%7 ʭ'̨eW^uy$efV$zr}յ0|BmJUmUo#,eG Dj<.:oP,kL2fumJS/֮R7Zce[|n/un4Oŧ /xTNׁefcveoL$dkѴQo?hGm漸UoxX%y.jk ~O[hv'?3WY֋g˨kۈ7*0[~ymlL~xn^7P4h.}q-Z?2M}7|__^ Yv?zYƼ; j,S\\|׷7 ߗUWºōռ2y-y[S$4wm*/ex~Mk>[[kP_7P_W74M\\;dw|_[?̇Y#dm?-|w^"˩iIq3H|#W-LLT tcCB׎9..o)<-cFFv/OޒI$o2=cᶥ[m6Orͱ4O 6׊_}=nWtrmhگV#VQ4 wˣְxwTԮ ?Po o<}n$;Xd_mfڹ_xZ tο]JN0)sAGMw#7I[}8bmrư|+gMPռBF+7eZDZu6;`I?.hmk__3|YxfImdrҏr_OTʒ/v /s74N5ŵmlVe'^Ycԝ凓`k]bn̍wC|YWjQ19~'7 >M?DY.f27ZOoZB]ayL/Lpy?v\׀|E˭Ji_T[6|uFBW*:ǃo!It[L7ͭat>+kV8w~dҵ6xӼE,|/2-*~!aV<>OC[]5ڿݤiGƍGAomfUY#B!=_t6g}[?hKfrʫ rG^]eW0GCu8lcaqǻ]t&|KJb[s/P i-Ӳ՟}wRX~ْ5-?E=\Jkn 6m&Ue9#x̟ [->Vo/Ե-ChM|[?i\tg?e({\u ֱcrXghVOg̮񦠿j cws|ЯyX:ok}<7-_Ҫķֺ<%qu#*5~,&֫.syIuY ܿ*rk:/#[UUfaUVYqŏ~|{#KMO+].?oPh^^hujeQ_bwkmL̸km%hC}H`ObuQ_\m,|hgViS땵~i_Wc\~U~i_oC~G-Q]*k؇uV%Ybcu 9_Ep2s=c~ݶA"Kh3J+|Nr ;R-f{b.x81Cj^A{\XӶ$3-wr#J0rOO®kjcIqjn7MM6܁_RX׎&Arm ZUc{ͧEnKg׏ukp76bprx ⟁^׮m`N՜| Wr:죠j % Č0g'~K65Ǜk(C'$;VϵZN_k| #:}YצU$( q(S{7ÞԴ{IfPH`*ɀp\ﲸ-. Z͆gpZlw. xs7hR8./π?K3c񆫫vϺGwyW㰴+ҕDs%(˕#OT^6aw2oRkɼ _Sj}~^.b;y;+vG(#ZVyd{w৞?u4X e=+ }U#qprG~lB\\.-u%nMgu}6f_aXW^ IF2lfn7i[Qu }i$v~ 9| OUuf[m{vj^ k:9m.(?gHt۶_ 5.+kٖ?P{ \qtR| eTVE9>f[M٪<'VU'i_7X"a=}l^kumZ:ެRYۮjV|_<@Mmv׃' xluB*A}3ZWx/Rdvcon[m?vx7>-J緱^,go9Z?<7t1*ѯK{ǑW V2Nw\60mykYKX+nT|M'McI?izs^i̷X>exXnݹuy?/Tyy='K[+772u/jOq{go߹ {ƻ[oV8nv6*t߼z[_CۈKܮ~Z/[h!o4mܿ:-bE&MM./g+<.tn_̿M&UĘ|5cX`)Txo|j]&$uO·Z,S7$3m;xVR$>o|b Lj+,*gza>AԵKatZע|!ѯ~!}RMϚ:{TIG\¾\>B;zg(!~f_7(j5PFQGsx5mcTխm~uoy5YqI_q4hR/n륚=n¯Wkk3Y\X 2?گ9|&k%=e3Zmjܸ'65K/nxl~:i˭WeIy+nZo%_rhf_g_DM!JFn?+Y2xWp%߼[!hW/GU }I+Չӥ/oCnI&|&ukyȿ/&5o M,K۷U5aco4a}8bWAgX}*v|%{߳Oz.Xo׬?-ͷ{nuRU}Lug5V^}>AloG~oiiu4\Zy-'×jWWϹlnyF)Oի|2˯KufiśGZ []jOM]C$5r>]ƥk%֝k7͹co^k+sRYt?o|-_7ŒoʜOruH`Qթ_eUq#Aqqc X.ݻWwGGu t؏V_5{ϻֆ;˹̵ɡmK5F6%̛ׯ7֤4#}'Tokҫnܾ^MMMKɺm.oݲ?]wtm,1A3C+7zoXV]]6|v?D9}7&*]6nw5ZRO:_kTw&I Jɻwj4ej6y{歖i[O:+TO2|.u;=wu`_aP~ݭ ,mV?M:9 ӮeizwWVj{uY?o\l[CI3IeOg^hzk43ylXedn?v2#ĘS){Ǘc=}|ey2in_Ū\ûo<]~e pW.*?/uz֏ajZ}sMe_̬(ۉZ'eLiK|?[g!%Yto~y׵Xvp‹mۺtGV{]bEoS[ڭT\|ʫ|XmUS_ oG+|/̵xR2ߛhb j43\y7p5 Vl5+sw?7Ʈjj{ĊɿyDŽأ+mwY_2Khծo'kе/j$jûk}foGV5j1,TwVj0̿,/]G|?z|v1nߛT7ͶY[%U"J9O)}9-4 jcX͖Co~Оbuuzk]'&;w~exNO&q=|Z!ԕܖ|YrkeEPZ?g+m۶?5^F ?[q[WpOfm ?g{jzi EۯJ[:3f,W Ng좏IvFP G鲾tl7iOfR~^t Dc9D=~}s)v~E`MP3)'z5Y#*Cq$kʬyj2ѹ;X.Zt/mJ0,NH-튣ZI;{+F.1q֫f\ <o.SdvG BGvVǕB}Z 7/ #HWi|@ W#j>[u5"H:r{s^CYMm[Ak|պgkn8?ZeeuX3~5U ^ ފH}K͗[[Kjnaʡr}(FV2\@_l>UikjIQ }=+K4T&}KNS [2|?.4 a! O|Uyyq^o {fkTsb8U3:Ɗ>qEYDM =V>zZgdfn?ݮ|Wi׌txQ$܏>X=oyIA5_Gokm톓 F" G-]I^L}kd۬9FA3$& _P|e+IAw3ޱ?ݵ_ Nml ¿}$ <jjÐt4S;(_"ߊK_+CkPi<t*L;eMUsy0캶o-/sbi~'X[/5߮4~jv3uq)}vTj[ְ7$oSi }v97G:lo֫=eV:c'[n_eȪe[Ok 4s>f]\Gaњ5'V5z?54l+|ubꍤ$m0ͺ5tO{{nWokbTXA&6oV >L26eQkoaou|^1թ276~j_?[ YZ̛6U-捒i|u^RmdzLj5qҗ-]/Ý{\լ q+[_ݎJuϵxkO~"h[w|N|׿ZZ|ϑ ?5UԭtjQjwnx~eY=k*g-:~˘_~&_}?;X o,v^ sk_Zƹ߾okzt&6>dp3Iv.Mŗ e{7%ncV#6K[)tc8?RPnlz7S̚O4ĵcM +Bbbz5kmr\3yk/ߙ^M\Ҕ>4߭QCjI~UHt鼙?sȻc5_%ؙ}r5{tYg_9exz̑hoU w>\/gL?xu`_.cKHEf~f48.RCoםW*3u)'`~Y/3?~#k$[I/74+ȶ>\~QlbͿݭ)/Y Q"1j;]RoFپYwΨóʃ^g[ݯ1I54ۤ yo\xoB߼6o ;u(wEosCnfge,,mv{[ºk}>iiF__xO+E  -dU+m捿ݯfsu$ݯ?Կj1Occ5{gS>G2]Z}5j}nvYf*?'ĻpPo.Sl,ՊԕDžg? 2?Jn<hw>gh\k不wM'ʭ7_|So/u82r|E3_ꤿ駱?NnWBO*ȇ_+j\7fݷo,?QOzjڲXV'QT5 \&opG4*L̿-jX-{;oy5~^迶Hմm>eUL]׺^u~Zp;]b n~Y>foj;[[[ _L3_xg Q̫O jC=,.f]k|,ׯ?uK6[JgGL}cp7"Xi?.7RHo5_4_4=zR+[LաxFXaHdYU/#Gm}H?oS]&ogeS}ݭ\5U&~+4=L6y--G Co1kqquدC>uM"Hh͞i`?gҧ[WMc} gOA͑C z/E3SBAo4ۍ>2kyJ02$WO.!W \b XV^S^ FHXUҮQ\}ڇ<&H{ۆN=7|!v.t}RMm|/hW֞prw>#R1;,QֈoOL1!;WľiU1zxrJo*ٽw;Aup1CV՝ϧ24{.㞿koq+I4jb%m{WO-nnk{.7mBxrVw:nds3mrT$BLS7*rr?*v=6VdvH1i7ֶ5ז1'8#qSLx6;sG(F3cOr0*ݥea*>뎿j]W{"ؾw9ٜmuc(>x!"S)ǝkG(',V ֙+!+a>2kG(7 (~E~SXj_Q_D/Z=l|MʚG!ݵf!d]vguW/V&羚fԡ֒Og)ʦ6gRGjIn%as/ެyѭ~t])Zڡ-7WL_uqqku%V7[]ۣ+RN?\_Ysu\:6-,y{|+tS*CYdiWɓ|Gύѳ~a}{3ķЗVg+ċj^JM"6J;Z5yCM߼vᮾ'ږ_/l~[7 uyqaKW3yJMkg\\dn=_}o*;oMԼeF|iWdesr;eg<ͶI#ú,5v>=E^9>̲ylcOV?fծuDS+y;wY?=լsD69oݯ:v=Žדt2lY;n#>luQnmWjǻoi.FkNGCh|b{s.uh>Nۉ.nvi>xի ,.+y:,|Mq~^EY#6Jޕ{M:zM(_Po%wCy\I>m;ZtB8[I9uuX2\<ѿyR|jԦwI%=ԖrU+͙o5e\51vr1;+{7/4u'Ӥ~fY\< O3/~گ\Z4'mgY]\_i-ݤmySF4+/jt;w wlCekiHԵEo7K~(m;_xR6o{Z2tߊ}_ͽ3yܪY#W}Tq Zۭƪ<`]}Io'2礋ZC#'#2Y5",]jZ+M4+mUƚ.Muq2C}% ǘ.3Zn?-mH=ìW;ٗmϻD^Ga}i>o7֛?[gi6Ju˯40ʱ6.ߙVVE .!Uj󥇩~n1[VGCFUWΝ?uh+BK~tut}h&-vۤt{e)ڵ&F!fʿ꬞Nyپ[|ͻ~I5u=>Kq4ީoh[u4{sJ4?z$ܽm,/.U~]Һ+]ThR8Zd,>M~wHVcGZKM}߻'J>)XqG [~Y~mҺ+EY&o"M4˵kԵ{]>)ΛjJX{eI_.f̣TLi7]^XY,j\z5%#I嶷2m/uŷu}u-/y_?mvC|o;/H.&5ƻ۵Haj$,? _I*⤫;[̶,ûkn,*mѭ~K_I?/{MyyX*u۹oY]A4֏fީnyt7V~uѮwYjmGjm*v/tXm+uqE63|ۿ]rϨyrMry*fG!jyW7qkIn2ҷg9_>1w׋,|9ȶ4'4Uטk߶>:M֡4k5cZ-ڙ_]K"|G_]-ծ7HV yV[S4ږu#6Xk٥KቨfmkpMmmhhFZ)6ѶMmmhݭsy$2em^_G8~7yWQQV"+bx? I~"톧{FhdZm45;]^}xU[(?.OG5?UwpvkizW䵎uL$ m%x\,v'}Bj)ؿUw\c4&ڿ7ޯп)Fq/Z7WR>wvILa_}N<{#Z(((J(u^S")9O$QvP'_< ra1X݉Ow/t^HvhYpӑҾ4K4<_wm?|c\sa-WfCp ɺ.̇?RPC2p[Z~e#`@z']-4[}b9[&ͼTpƽ_߀> (iV"0ᯥ*zK% Ƨi$A\Y]Z <`T(㵝gPP:pkk}'ږiSrU%\WuNJͳ7OSYƯjFC(7nc!"זJyno'nev,_)TaMtV=+Q[QE*P!]_DU7?sghc)mQ5-oGSX~γH7_ѫ2{wjbF()a(\ ySxjtUGg9:Ӯm"t/=^ES(g7i&qI#.U2lm2^f٦*K{R ,u jK1>OO07wU|26kV?i,3Ir*͹UF۾e!x|u OX爼A5} f̿,>^8: KVkhz[M6}[}_m}G {w>3փu}sY,H6ߖ=V3O;V7_+kkc| jsvA -G 4#7ڮw[^Aq}.&C5ЭB|}CE~xq/4>W{߈WQec;3Mə5M7n-v77\I Fp"X{[֩^utMzo2隟԰W,Nuydž-dglykV4UzPûhX/jk|Ung-qhŷIW}EP(<;FϡDWjO*σmEC#Vܪ7]~}.5%s?ͻ##jQmUG~}?!h_Bo]j(7 $+n}/'Q? UVP(by$h6}oz' .!ɺo2km͵Pa1$O5xyw"/ƑjZho yѨ:\~ m7UcpK ?u|>_zT? ط_}~h *ǵ<=O*a?o ffm >om7TKtḌ--/ڵNq-JvݶƆhZeˣHQ40>ΛǫB/,5öۗW>5xzvh^"Ƒh7$&ٷ~?|1to;_^j?ki[_fڰuYcUL??g_cͬtUI7/e[wXi>^=fiؽۮyVC _y,c4sڎz;iz]jw4nəV~GW{ -"fSi*t_È<5j&_m7^0Ri7:p|4ITT?_\'Ÿ ]\xA拡J4_3hͭ\~Mg+wO9"}k'}@Y?Vi?'or+hm}'_ǨhbaZ?>Pu8mdkƛh~o{~o${X<(OpI4(F/2O*jj(}?&봟U?Wk⫻~}D=Ӂo`ݳ|ͿcU3|l/ WqE_8Q i7`[}k| ?❶n__z''*𶇪éYi}75 x[ֵVZLW\fi3hRģwD/?/}^BwD/?/}^B8/=Q'Oޣ? ,?7;Z|;{q{o節9*v^'@i64䚧}-kZ}BUoYHy??g]u-ς)/o qqI$~e{HݺFP_~Os\/oea>ڦo.?&&oc9m?ooa'CqoGoqB"˻ov cCuZ ﯾ"j2hR -l>L*XdPûfFbƿחzcW E ZojsIg\ ~k=/@njnf?268ZmgP/nd~y,۵ U}Mҿ`w|~ٵ+?v}~/WpxgU׼UhZ9!i_3 u|/|4|.cMsiEW,v8f776~ƛyu]I6s64q<~~OE8P55p>M}J­9a2?j;?j'ψ Ɠ/k[ƺ?ygI}'@ bٳ◁lIm ɮ!X'!λwD/?uoq~?K?2Qe(_ øg%yǫ (wD/?/;sWawz<߳sÞgIvZ]3xQ"Gg/}Ql{=h {G0WD(?Ⴟg%>-Q ?)o*O`OT~J|=~[y`j]nM{|sg6lvZQHrb7Gv_ߖ {^mZ7)jޏ'm-yQoVi-dx#J1X\Α<~:i>ӯtI< '> #nܴx_`OT~J|=~['?6_[ Y'/}ϫK5]g].kտeW2x_?l.r<45۝~w?!]q@-^A| +G'i3"Z$^](-+}r*Dl5* 'DHz|mbf_;bB)ۆsG×?:xV6Y˵4.ͳd>x#J 'OphO\, 81[]0U"aW|U$^ _ iZF.k*," }[?||0~& --./| 6#pP΅f#6@b _ < |зXݰZ?gO Ӯ,5闖w b#A;`Ҵ~)AydcK 摠%̆Uh'oznw@!)? |Bpߚ( XR /QE'<ʍ-A-EB?֬EQEQEQEQEQEQEQEQE3mh"c^|&u tAn䚅 y4y7vy'(|QDP!Eb%ڴQEQEQEQE(MWEy^WEy^WEyX/ң%eb9E0i@xsCFbxQTQ@Í+'}5󽘍 rX5Хq"UC6(3@gyLh]ł㍌smPtdz#EGo[JCq3DjוQEWGQEWGQEWGQEWJ9Pfotocx/images/folder.png0000664000175000017500000001562515247006660014267 0ustar micomicoPNG  IHDR1Qz0& pHYs  ,iTXtXML:com.adobe.xmp 1 2 3 0 0 238 305 1 3\@eXIfMM*JR(iZHH02320100fotocx-25.1: Margins: 27 34 12 9|fotocx-25.1: Color Mode: mode:2 blend:1.00|fotocx-25.1: Color Mode: mode:3 blend:1.00|fotocx-25.1: Color Mode: mode:6 blend:1.00|MIDATxkl\Ub۱8~خ]i 3!L$BUWm?ߪҪ_* ;O!a@hhڰHdvı< 'D1ZpNlᰑ=1~ݻ}ި*3'ƕZSq;uRqw=FA uq; 0ZBbT:-U *,O'+b./~d #}ZL[O"n8+W'&T:KK3ȖKzbDDn0Ĉh 1%˹H2917 *+B[W-Y@sٕ%`'$d6%oz?[-) O@Tkfyb[HDRSgKw-)?goIMb[b ǩ:h RN?禗w w|-XlZpL% oW*V'!w?%tC׎cM 5(@&}|n*1ݏO@Ҷ4c}waeW `bb;$菄 aTp"OKpbai8S: y*tu %ʃ( [tNCDa`OFD7b^(B`*"Dg޳{0t{ʥm?Xlb?TFpUrrx1sљC??E/V45"Sy`N?r@d&* F"x`DÍ7݄-P^^Wrѱ9!Qsk=wh[JD>[ގZ[=u onh߫1Dl.ե[ғр;CDA*WyrV7/F^ Q5Fr}ubJN愶HDKb!5gbDT_v3}[bDT2UOHrRεCVoD}5բ׋7!OI IVv5/&t, t%,t l.,DND4:zxu>zaUWSçDU vT!V(mCpBxk֬V_H-Pr1DQ]:mCbn[BD]V.b$?zF"X@kH|Ub%c۶~h4N=UzO|iG##tתK'IІӣfFdkWU!.À"B[b2,b~bl3jk=йUq6-2Į^S>zMMD8x}\K&a>tKON`*c'$鶯MdÈʒ:BLJuţږ-(Z[ZT)A9.&cFu~!"ݎPU|z΄I ]9v5/Y01Q]*k(yfPB]YW̲ B aOc%[@kHzU,r[יCBbIgRsNDfqXaɮr wLlDdl6Q]*{( 'ܬ,|R' v U;uV܀e˖"\ |i!sa@Blffi2Q!"z;5euݾv÷?4!՜pg̑T*Bb5[\" R;}[:-5DS~vVYes:1m+=NsDdsĎ԰y>" Bmo.U<BbU}#2RV?PW>DdtzR;W\//ʟx?È@or>,588綮 FaI|ucDd˲}[KDxr4fA.PTe> A^Fѹre!")e+]l'CpBxk֬V_Hu[j> 8FGGPT,tRb#K'h;4#Pݧ~ADlV}b=aH+YRaBTIYD5g6!""IInPBl%*;> "CH ?u+۶ǘp 1GMfxi%WCI7kjnVq>xN/ޗ!vi[YksוIŐ'Jm/ 1fff0߻֯&z,H\򾾅ӣk\Qy>%O!VS~aDN zK :b>oP6W"2G^D#0r21m+{ a/!t|P(m %B8xH.FGFPKrO!j6֢]7$rT=~9VpBtUjp qW |,i}D1˲}[KD<r4ӛ rit/CIS͇FXѹ[ǒ)c#Ċ"m8FT֬Y*288W< K(ZG##^ޖ| GTNP!lkkD䃱lR7<|f[Y4AWW%":)BTII)1a[>hT[I7w{g!v%*.pBJ`a.;^ٶ>g!Vw5%d|*2꒯CI~3!Э޲ LHOBLJ`__mFmm$"uPnސ ӀP{G!6~ G>xRT]ڿor%OBCWSD|=!,noiBSS[ҲpbSSS[wQ@zz+ >ٵ31w[̩9=m?̒f=K %=ƆeyÈJ&A-r5ĎﶲוI\ y?B,`r]nADR\@ۺt-t4|q] y>ե@8ݧ~ADN zWO }mu݂Wl a:%"fS4HDq;?8w[`I{WsxdTGDBmoYZx|d_'2~Tw7B+|Nۧ'E/ 0Ğ "NW9J $B |bY}Ku8^s7BGy9( ŢRxb(:WvyQ5(vT!bÈ5UWgդ>Q \"I)եk.I:OD)3<h$nN.0&D>h4Z"Y3nM=^· "2ʷNm[bN9ǯ"˫.j( hVoADI&wH!by jkkuVID\q8[(X0@s[uVGD8x{vnb''"s''0QfU膒NGA'C |2IdVam)B`j&=} DyFwLݖRh l'uUg_P0JdP ™x"*E(-N A7 Cׂٞ݃nsbRS!ͥQ~͇fDdr!Z$!FD r۫0Ĉ0ĈDTpbt bDd4'h 1"2C#"1Ĉh 1"2C#"1Ĉh 1"2C#"1Ĉh 1"2C#"1Ĉh 1"2C#"1Ĉh 1"2C#"1Ĉh 1"2C؎8IENDB`fotocx/images/tools.png0000664000175000017500000003660215247006660014152 0ustar micomicoPNG  IHDR>a,iTXtXML:com.adobe.xmp 1 2 3 0 0 311 323 1 yeXIfMM*JR(iZHH02320100fotocx-25.1: Paint Transp|fotocx-25.1: Crop: width:323 height:311|fotocx-25.1: Paint Transp|fotocx-25.1: Paint Image|fotocx-25.1: Paint Image|fotocx-25.1: Rescale: width:128 height:128|fotocx-25.1: Margins: 0 4 2 4|fotocx-25.1: Rescale: width:128 height:128|0 IDATxw[?U4}l}\pl) H!@鄒fIϒ@`B C0Mqclt|if$ѐٳx<9?2HP(I'\@qqqo>vџv@ϜL1D3XXq-ۻy뭷H> z>}:^p!F Mdbtz73i-J޳,^/UVw]W}{ee%^psHԥ{XN!mcb18x۶{\k LJ`0ȸq8s 8q">/sWx^f͚iFiiiZ?W0.ElZ!$KdXE `|#&\a֭>|4e*󩬬 ɏפ08HX,{-xm<A0PA #ui@ԕkj˘7oO>_رcmmml/HuQt)%%%-B+~,(x˲zHZY/R`0!CĹFu` 8diz2,^L]]'p<?7ofΝ߿ #x+N:ѣGcYtMtkuhn"%%%%_X*@08lHk :`#*eY`鱗swXnyf-;v젾|ϻa9j4|>^o1,X쬂xvBfRX `0(&*0py@*Q6v"1`7"b.v:t^zg>ڵkٲe+===9=BPq/>0\v` f8FDRˇFN`3 &(ٶ=&"xI㴴Oswop6,D #F\D@#vcqF,l]LI&d hv9/Ǎ1!` 3 ,m{108X <weYs֙g2n8B ~&Hq#q dz&  w^.z`؋VSͽ71!/ aWtm.bH&apbH0;5Pw "FHv+˶ml}W@"r5$Dx,Ï^ Ҝ6) G/#ݬ[O)Ey-urp1kpː8!)P(RGQ0bLkێ40ӑ1G a@ ȑ#>c:UUl۾ػT@BbF+| n r #{7s9v7,t۶_&w&@f|q}@XWx폽`n.ieYL23g Qb7HO-~ -E$?7|8( Ɂ7m) )\ {z6 ƘCLx<̛7n1c` `\Mۍ=VDz𴴴̌Fs"G~u.p-͛ÚYs[ q܏9Ƙc搁>>cYyƏw/`nL9yh݆1gV* Y&b){-[ve.5ƌDa`n7]ʸ/(xQF 9c; g-Ƙض'ݗJKK 6l+`lsoHz (݆ňGM* -ڶGm\(sw;g\ fmAj:e- . 'c<7s|_㪫dYeȍtnwJu~p+ cl6k_sޛHRӀ 1磇/mmlr](N}T{^۷aơu[qR}#Pye,ˢ&:#}.eŊTVVfDvˆ3" >Vv5b/`k(%S0Dl~<Xܛ$!}`a…ڵk7Znff>{ ;Qs b[p _IF|>%%0f @e唔y晵ʭːt{ǀ1ۜK9ʀHHQ6Ĺ>>נ0v-Q"gTv[NFJ!uS1STTDyy'Nd….AQCE%tsND F=-e;*.Gދ~%R }=<02$'v1f͜9`[7p1 m#Wүb$N$5)TX5߅G' |C(rsŭ_".3Ts)qUL$9ġk]gL^6} %\mE9RP$$QҋF61pS$ p2LۛkI۴@@%r9&1SIl ZP|1A}uHDZ4DKZw, dI@1kܾ$sX$-.@d#ZGOAVQ=1^Wv h$AYB۹vY%)z"969֌hb )[7)ݽΑAա\c6_/o|!dE~6|1; |Z{K㼿Q3 Av-E 8ιIS0D3^#rlABxG ͹)HLpλ =QV@C|W9 ܅B ǐIMu&%>D'P=3(XԎ\-2_'ur{PK2{=w!CL0-I v"6|nˌdu'~ٍmDt"O! ]~EPքVļ;HT'c+br>" :|6$@WWg֮D?؈6"ߍ8rsSnT$sᅮ؈^dq71nJ4$VзQ%|f],r; 'dvAsc6~.Q2&FLPUfBض|^)0 kދV32?=ĩGndoFD?Ur|ס~&chW >%!gWw'KjN.ˠ 8|S hCf$#<crVۅ [#\D2>O&H/DN!u0oPfPDmbۀ!$1O"Y OC RyH"<ē5m gD{y,]$Њ<:jPg~| 8ҥ?B`ˈ sxDI_`p!M<#sYgitbI6ރ\T6h|I2$~T}y.ZHuu5Bٍz%Q\eHϮG+c?z@$> "Uqs]kQ:92 N~an&^㊏_̙3m1 }isH- O# *cܹ;p_Àdcm .X\G#|c .H 7sy27p d^1%chG)L68{կ~ݻ1ưf?/RY$E˜kZʝBv(OwaJ/e;;;Y%}1{wxFaQ$chHZ O="Ur;݅> |:t#1T[n!cdI|ۖk5˽kjjױaÆo¶߶mcUN^uehKbB?gO:СC<ձt|wAy'?|Rbd]V[|zr7-=HtNꤋ \f3*ظq#oǖ[Y|; `#slM9,qH%#)d4@(ZXm{eȑ4xû_@#.W~D w_|W"&I=hXd7ԡ;q$M&>Ν;җ̾S@<ȦMhnnv!;g!ȶyƘ8bsϟB(Q)*g{.vEGg5# ^Ty`g!&3> {WI܈u'#tR?'dKnWSh4ʖ-[ټylmTA4; v%T#⿄"S)+x'=UӻH:)cAg. Oa* "]8 TRDRd1BFM V:OY?m6n$ ٴiS="o6"&M"X\\pc;Ů][;gSO=EI8L8fx<^< i&6tҮ;|@!ԣ%y;`bpc#p9sfsa==L<3^ľ}yw޹-5W.h$ݻwcswc>q}>՜#Gp`cs%0w݆2Q!RIR+HfzEM4Ue<Ŷm*+7o{+ :n<9W3i$po^*fp FD"tww; /aO4:F~f;sܲee`1Xԋ R8~8^"[ȻEbJ m[.m۽6%%%,?q9O>ofZسg?yu㫬8yG/ZD1}2XHw7444mvmMi8;s+ˤKx49G?aN?tF- A%Zg9ۂ`3})K|Y -"{9G؂vcL4$wƉżjJўNxI֮]˘1c8zb1rilldϞzm{}sp"'_~={c..BMݐ?XD'Q8XB_FRf*Nadwx: ~n|1wU۶DgYIDATgcޝkkk9ēؿ@DEzzعk;w] zp BrQ 5.Bѿ1L=ݳ8&ވ^Tsj|>M(..& ,.& 2nX,YnSrF H??-\}'8StJaoz~ru^mFf1 &߱,k}QQQ'z<5m4a>Tڵk1.\Ș1@r.F vw-E$35Akk g!1fڶMԶϯ  b lٺ|GAdaɒ%<D&H/zQ|"MN"dQC//>4e,]p8\Cs^@iiis7K(%AYPClъB~S0 'Ƙ^7f魲bE̙=s=cY[B ƎUW^I]ݤFNA"?zh?DN g>At: ,V@E(NP&|>aYV,9qٔ`|/][ ƐT@ee%^!8c$|C?62`Z#o HJ';6K(fY Lw @<>ō.X^r>fHeBD h}8ȣ*FYNyۛS% pB{?0#/t\ve7.t|㽨_(ȫ UJv2Qd܂"6ݽ^vy|^Xp ,3C `Y-_μysSD*XAsD$_ Z3ߣz | 1"~UگcVLWBuu5Ҹ"g0}Q\ztiįB]w`ϑEMؿYGPq w2T{]rYޱiU8ä1MoEEEݱX ǃ㡼I8q"wv}ٜbee)G PUbyMJ(n?u (7 /a,у7o@h>n^gyaWee%&LcܹxZ|>pgyf `v\f"%9> vkqA9FnD*H/yCDN,ˊy?ض2 9z"zzzBl7n|7r`8>}0D"(PwQ@Q"vݩ.QQAտ bRoG&uEڲnws0e1{, 2y:0AV 0UVqPԭG/V܋Vo)8)Ȩ{"#Hl#uL vDHMεK(2n>\/[|wSI4n8cƌ! 9ן e˲;w.v#FZ7 hAS8~qC{?jxW"&eY-ˢ_pII eXZ[s&u 0rNX~3fHAoO;P1UcԢ"⿁Ƽ=I6m܉R]*B:Q1ha!&V=/z<1 K8|}~Hq_dd%KXr%%%m W {X[),G+߷ & 3vliG| JBҤy"G~\ӁOY1ò,|~?@`O\u%6 "<8q"gy&'ץ2E{ߟAQ7RV(QGwT2w'zmzzQ" E AƖуFy> ]kYz(.*" nss'0㿐HPc9+NJf|$®!tӟG/${]q-{A9h4JGg';w`ǎߡP#RAFPЃ$ͨU}seY~7R |k  C]iv4r2F(3_FH%}mV6 HNǫ׿ ziu6\R#&n0\iYVur3XW\ R@srq3߃V?(v7B,$ !lEV ƝDX,F{{;b߾<ӼzZ[(/+/Xp蘭(WTMI1:b  2Ʋfc ~/7SOyH^}6#GSը4 Y_G+\ 'ZsL-۶TWWF9X|9PKG{ *HנH.DQ|fyzv_1wm?Ə矿M^T1qq ' 4|2JFv.X.(C^}зeRp2eQZZʼyX-\HUUHuAFᏑ+[Y]a(#Z;H9 m)r[򋊊*++D^tkxQBEc$hFj"]5Q Hm~IceEJKK8S&~{yr Hʊ ,[o1ZPlVd^=<{ cneY}$I6mLA"}@<#~\(rAo>b B԰r>-CA0P^QΔɓ}>F&8Q?Gzb?;فQR$Vܮ[X#yNcx]HG8}RBoEk r-)9"foA*Fcq1}:)"sO]]]jH쟎VVB;-5;!"Zs`bew0f:nGfkSϝe -؎TIUH]A\ιJjjjXdq2Ї," }4ɯ&::9ÙTΐChCLI4l`y*+YH~q4 r] d!h^ҁG+2D⸐>BeѸ?dRZ0IKdZ(Z)m|mF㟁i_+XE]]G4i␘/|TUU m9AN)l-U^VS2~M!}u!dHM("D"dz$'|NILTO^Wƍ==_C?ER3Q:fNFۦ~Ԍ:PvZq O{9EAϦP3X'yKb1ZZZQ$Q~1 jӝ%`2f0@ V#,EԍÄPgxd7胲2V\+O+WЇMG ִ؆r'!`(%^5'$"?`R` FU?Fa ERFmSnxnYJcը̋F;1ٳgqꩧ ]]]lܸg{_ﺝٌ?#p ġ"Q@.$C:s1!|NEN?${+"r -9h wc?3z ,)S/\JSw0&%oDnE0Fy$=1s .!l{`")(ю$GQDs&-޷.~ ^TZlnGMu eAHgg'= ې;1(h ODY;P{x-bVu &x46FwAK 1@yQ!QoYn9rHLB8jbh<իW) B?UB1X(r;<ߍ|Qkw$ A<U3y: Pߋ&z,]@ @uu`ph c^suuu̟?OiL_{ F g ;q8d"F @_bv?tHe)IĻYz4ݼ }***8qb_bz1A12fR ^ #)^BsC24sWPzd+r_Dz'Y& #n55?QQY/ѣG00lH&xYG9FmRw# f XC%[rwǯ<߆`3JvB+XbK<ƎάGf\_;~{~]t555%@uUl"/n ܫف#l[x/arq ُFvDZ<S#iys&q:::. ض]ͯC,}]Dmmmvꠍzz455XD>/S!]-tttzRq0HO$BWWݑ~gcGGmSQYɨ#{7pHV 2pm8|09TYm;wq{sf,.%z7mn=<:. k:w0HQc¡0֖VG}^-Nݻ6cYzzzx<:vq1SNe̞3#F\?gپm;mmDٶM}D[lNcә8qbevBOb[Jn5o$'6Gr$C'OAhii)<(F3g6L$χOg1A?)}֠ԸkPdKK ֭c[o̜9Yh1r*+*zH$c=w3[nп!>K|SSl߾u/@Ue%&McaڴiL:ޜKdWmidHe?S_m۲qB1B! B*++98=z4C]2>(߻^M @ FTW3m4VXE Q]-В|ލzGҀLmSO?7/Ymܸ9s]æMCqыXqI1]c- b:|ロ;3-[ ߿w׭KrL0?߯zP(z1²LoR&Fp}TD"lڴ5w7Y Yd! QZZʈj,\)'̌3Q]k7+{_⡇9xMX;$fR]EE~=z4ӎƄ㩩כItb|7/~ɽ;hVH1b*++4iSRZZJyyCKK {7wܜ/ cLM ]r** Bx^jkkYr%K.d=]IMwwr]wӜE?%qs$;o\ Z ȕ-*:顭-k}GȌ}*?*^ldIENDB`fotocx/images/crop-image.jpg0000664000175000017500000006465115247006660015036 0ustar micomicoJFIF@ExifMM*V^(1fixgnome-screenshot0232~0100fotocx-25.1: Crop: width:362 height:283|fotocx-25.1: Sharpen: median diff 2 19 19|fotocx-26.6: Rescale: width:326 height:255| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 283 362 1 2 2 C     C   F" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?NET(((((((<חW^:'u隸mbFe\<+ךXǃ&aӏ||AE~"Ҵ-V;K?b-Z\w*܌:Wc9$|+<=^{VD-CO$  OOSf| >(jO=MK>^%*#>0mf?AwQA`IWŏg?/\@$yA77ܪyF@W펆5X5{K['glxOU0HhrHӼy;(W$`to20j g \m4$u'W^\y k>?^i >1yo;}gEU ڥ:0$柳S⟈z,MBJt:Z}+dZ2oIY$f-샃@\JVD<* 1EdIJʺmÁAmMߟW__]+?︿?UE?︿?UE?︿?UE?︿?UE?︿?UE?︿?UEƴOLtxwb&6xL[zm_\Z9׾}o~]qto@/.C|#2 ^ &-6{~5;,@$|m| KZD]U4p7|׬o@/.u}pů&3x~},\m:lc+@P08F:W2QᏃÞbiݜij9'T ߟW__]*c5/ q^ߵ=T%yfmߡ< cᘼd%X[D|f|IxdχߌxM.'54lv:ܜA+u|.Q;]se0((*QߟW__]*cd Eco@/.u}pEco@/.u}p{hp#JJF۰\**Epi3G qӐX*~]qt\,XtD$C\xN]]e08=8+k~\qto@/.zf4t95xߟW__]*bWؒh A5Z In@<p\3WUG XԵ[XV5;YkI|c珟ɨb }zџ%% R`<#Ƽ㯈Wޑv=k7Sw TB)P ?\W9ǿ ~-c ;6׷ne`,-K$o%Jl9 B>׍x3}mCĺ?e6ko,ptѐ8TLY$[пi_ jzγ:ot-Y%@LY @#4ڳYџx_kYU!]"Pb2A^c⾋oƒ:Wi2,!JFڧfHev,iׅi6xGz'DmtTR6 ;eCGRH ^qNݟttx;tYmÅb}:EYxwLF>5Ь"HQX`aF{+{Vx8^q_9#_xE.pPS&W3ܸ'5xZu|0ZspCo]E`G8 t}wJ3 ?h}_[ԼO/]Ǧhh aRR5$Ā  )?BOӮDZ5["eș eYXH!A&gF~^+1mS1X<=8ռA6g 8]́w#kR-ǃ4 x:e&-]<@0@bA8$ ]ݏY֌kWECumi/.^,::c i8kړzniݼ7Wݚp!1vW 16wvb=h>5/n|<4}stƥwMHfAQ1 ry4~L&umMt7^M63ey36ds(;  s؛{~g^KCEߋ5?otXVmNO$Y9_͵A㚧}Sxr[[? 7D y?Z 7r<LcPQ~f=; >>Ľ/Na/aдIfQ%F)'GUnQ׾E'!=GmR~ċl%Ao!YĬC xoo75 NM~ ŠJOV%{p9_\g=yFxQ_j% >>4 Ekvq,;V;4?@T>|=~%;O4f.m-A쑘HFBzU=i%<ֱ {l΋7bBUIXHe=GN+_k:'i>SF;9V)Tm9r[~PpiNKRT>E{.Bjxjf<\-teZ}#18dzs]/ǍV_o [-/4 ];2mBG3L`5n=L~Ҟz {ݿ(w>?C7j H#K|K62z_5/D\.D7wtb Ay5nW_+GO1փQӬ"ܴe$Gk+vs=xXxkPfԠQ[r%#:wy5+ 2gW$skV~1E,a4/ wT7'ֺ_uψ~<.iik>:=䓴nb_`q㧵+p?fK)MM# (9Q +W|  zmoE4]GP6i T6IOFIk0*h5I|7?-Iv]sՂ)b"!`WR]q^Rԭ!YVPyxF )\&ӀHuv&NW_]ZOM]vW.Cy>_LߝG[V0JX>oTX n6NVv>To?5?49%J/9 ~qc5*M;EAHMHo`\1~\ )jz-O|bGž,5 kv605a4-2# '̥_AE{ߋx¾Pڶ.wa/B"yHy `)](i~"ö~13nXd{9En"@>Y$񌎣o/֢ҵsM#t(+d,}yRFv/kƩw*}n?Y7Ύ ʃ"+n9* 9{U%jw66\Io 6{;3S*#{X{PT F?4jf3!o%Uϰi98d(xo: =_w9mo;e9u #ҎKR9/r_k5_8;)wQu:<.ڞu[uql}Dsm;y'bhGA>&:DvJc 1m\ Sjȅ+UK_$?jYҮnZ#.b@bkcr+uS*CAd#d} (E@WvKo$8^vhSjـF7JƲxPIRRJC ( ( ( ( ( ( ( (8 ~ :=̱62,fyNY$ |_>,cK/+ /c^# #;FEzi4I|Ogu-n[8 ʃ eMvCeI=E{"?|A躜AmyoF-RvyNA9*)݊Wk~&O O.'Utn\o*s^#{rϥ^"X2ʲ+Zڞ6߳&{cAuΚ"f  ?:Zx{]"6xBF R GPjj)/d{s>.uC޳IxX 0c2[H$R+ok|A Cu_ކ0ąTF@U`QI ~Ҵ};ojSWo,=&QCz߁ͥjwizꊖ3ݙfgvAr1G#G>&WY/l-}FGHRTin\+<uR` u5 ?i4+ks?U:#Ak" <Z[$GP9^@p~L8?SGlG\`tNcً[ X->\KH,%)撁R(()q@ E-%QEQEQEfx_4 oZO3\\p1^k#zr^^[u][FsHApNkC+~#|o.V֔F!c< 8^Wx⿉+S|ZZȱ;24O,oI*O.OxHe޷m}]ѱG2PHu9 5_zYE_Lj:bByjcTPUr YZ٠x崳7o{X~dB~df0$u )>]b ??BTV~y훨';C=dX\~pu,O |wOVn %yH5I ;ɹ6+>/ G ᦱQh HQZ!m[Bu[kk$H]úb PBtuO4Q- ˰! *&_S8^&u]]U}I|ٚշv2 9^ժrKfPoğ:7u[{ז@P@]Ҁ1kO&c7\Ҧ7nlvҲ/aFA?ᗇ#s`B$oxD%vO+A#Qw];᷁?gz[/˨97bm T$o;~7!rCN|eoON%:iaڨnO0ebsF|Q7P4g-|]}ke_@fh- ʁPO#n=IsS_e ELk#QԼ?g5Z:\Hܼkfo- "c`!]/#s'6a uGJ> xh^|? YZ]+?;O_h_j? x> ^Zw=m*eD>bMosn tGbkaG浙?R6ݞVOMvIz_G獾 gK[ZƃNTtXZt-6HVke 6α'@H'^_'sk&Mxe)|6c3iv-]i-(A3uGO)=~jȴ+X`rXQ*s֨k$4@jdFգG[/A(PxֲجT/nLԭ}6\ijFJ5߇Eq jIt웗:Dv/1>ⶾ,귷h #emQ'\EBqI$LT^Z4 Z}$yLYv"`̠rrg7v_ZjsxXmbI9T7;p/F6Vm톥,$b#1mnvn٨r]ǚ-% 6ck& HHFߍ8<*]zO5MOnLzFHN+iA|ռp<gx~eArs0K'oI/$].doot y&&>dc6+a^Ncեi7~sB2c'3&咏{)^VOSֿጶqD5 M(_TFj݌mwZ&iq,w6o9`Av j?We2\<~ϏSXA?ˎ5?VxactTuщl%qS}>W)=~v.}B@jJS֒AERQEQE_Pӭuk9-/m ãFR"MuhZnrQ' A({/ jZj~nA+]McH\n+aVº$՛GmTc<cwAE0*UdzൽK$lAʰ Q]{J]iw"̆[)OJE Fdr\J:)ldY6|-ޭ埆KbqI"ss(Xțf%д/d{ḪC19^{qSiF鶆 6 m`#A)ح (@*667WvVweMD][3Y pjq4[4a4N죩oHgᏂ~'x_7W[6_D(.T,:_}=^t-$i)c9ky>~SXV9LyR֧N$mi.л}~x7'~x n4gn)ddٛq';@kG(X|"_Ե֒)ZeXl]{V'n4fKl;s; `pO",*!QCWvFm ivcIe*l>ΞA/pO=)mn ]GH9d#8 q@2h8{)}k>д#4Dv` x':גZ!kZd.VQ+7#DGjn:WZH{o$K+u5J$d2@r?ALl&&i6~c4nςZ*N-!’G rqǭzg(4+\$Nxdrj;|շgb>` p^#'zri |.{G( <ǿAOeWG 2.A*@3kwBc{zEE j|9 +[g<Š(((9W'7Zn.x"7m$^]_cXӾ-H&gcqfb)3$FkSͲm$Qko׏߀>&I.qlpZ<'rpīsI7+;?h~!Z#Ls\^"1' #/N mh|9f^:.+kK6{@  CҸo |}>x+K~#MJ0KuĐsD@D ohUtDRdFv yajľݾk"Źs-iZO4.N$ Cw?x.XhQjɨ3o_}n yT6Pk'լv~S`x{[|_3Xƀe飛\emTiJߠˮYkw?Ehz]Kbls<|$M*I sT[x?Lռ3_%za{f2.0l9 .gOriеŶ񟄼)ݕn5j6,IPl$Vwfi>ԐxwA/.axHl.ژ`!8'\Rû{- +Tm3RIcPz99t_Z+E4o>Kr@P,v`B(Ѿ |Tw|)};CO ܿ~ZimEɹ$[+#32~P3Cu!EohO>"麊]DF ndR$wOO񕶽y|1yg-oiYGP7^ :ig.y ɒ[!aR\Vz-=Zo)$oB8ԽyxÞ%OtzJi N,x`I=x >"1O k^!.׏صʲ`m# qyៈ~ #ޛekwz]ZBR$Hot~6G kV^%(o|`ܠ*2Dg~usU-%u<tO?"x]3Rsx~HmͲ\fdIdH:3]{3/h$&Mx<Ȕ;DJ䃑ެseU}YZe9pv4}?''*cž7tZ\[YY]q{2y `l@(t%-?/_~X>X ʬr/NN+A)xv &[{V m7 x& dSzB(,Lf&B]OPү'ZSs# fh;y.Si#4w':7sNoATЎmܯr5j12 PW$+fIi3qxT),f3_)cQ.ҍʒkMMmxÚ#4{)a62;nb7g.#4%K[bE#i,Z[.2*&QonimZM}nXg;J\G/)נp>!A|e5;}f:UeppĹRGB!0 ~6iixGYQw{6Ds.IxpxXgŚޣ`%IFLm*G؂r fosyE]} ټsz5Ls6:0׉>P^j: Zkլ* D&F+sz5e7+k,׼I^r[{@-d.UcJ$fbO^񞿩iwwf6@Dc.|O׼at鮉cF6T@P^z ;Zŧ>tɩ!m>vU"E2Q7oٖZM;>#+iMv@ J i{i2G+ Aӿ`YP"4/pI598Ӵg.! ( rG&Z|_wVthsjZT}a 2Mbn^ǯJ;C>@>|PUM Zִ _RxW,E@(Cs55.=wm"%RoP i$_DޛkŞ#񞭥@i]GK2:*"ΡA'?tco[k^*ԯ~ږzITFXny} SfY9x[2!4>z@2*@q}/<5o]&ѯ^> Oĝ_ǖ6qZ_n1$e f6O?zY[fu;/4}?E7v4j5@A$]P{_NhZ閭hTH &p@5[=7EEwo#<zm1Ppy'&&S6=sFq'uG veekc[y?XhFLZ[˹Zv+YM*ezi;h|AZWKj>547.kl TsG'#b5gxH%Ls^5#o5y\L wt sƙg^1[>$tèkf5сQ 2j.&ĉ|Ac`[|Htn  E/i:d~Z]i-cY' qRxޡmf?5Ų "$q(h؇ ahK/m pLQ}\K8ޅ=]O#xGK嗌 e'NT- ~oІ ڸ; 5yYŪ\w7 "]Y2S#znuV eK8K/ g,׉YfC%@P99_Z_< [Ǟn^-A,s"s`'jNі\ SjqAw]n4Ux^i|NI$&leٴ9C iF@Ő}QB_/fŭw kY^Z?G|=#n"<Ncx;vE޶ڦ$n^MֲIq*0v}nM_W=^(b2 nC6Ilq gxL>xSb4׮Qѝv*"n8MB WW#3촾5~G&x.A=Ak#4|Cbj?P;~ꚵSx\yzLPv\\ώ7^E=[#MiVL˙ #3|^xSA6Giѕ|,S'$Ov6Q5:3?qs|w˷)} ny/Gh&Vֵv[ohgTr.Uq$׻xu_y ƺw%ωtٌ6?-ʆ2NI}CܶlJ|xx;F8?f?m~_i>ҦExe|gjcNx`W._\cޓM+/?~z|P<8N9/[x:EK7Vm-"H<`U'گ|Ha)x_յsL,g1(9 g+ ]^=$C[K)`ꀼĠ 3"Z4ޑkkך55gR4N " w֣iFc&[ Yon5Kpnnʙeʹuqik|#OR2,Hrzyx>Po[{DŽnxٕp͸r[/&(~zl~[=NA V^J٦"ïQ'`K1 b\=t~r@(,p@ʁ^"GO]vc9ԠMfpG>~E[ (Ь.ή\>3q;8' QzΩq]j=vlˬD,nZ/Ԕ՜Wşjn]#~#!񮹧i=J2V$8xN_CzYMկuH>d$Cn~\UOMoZ]bQlNV"̘crdӼC+a.q.Xa%` Sm;'dIP无Ak{5˨-)텬)]#fP6U5'*} f}AE1iV7S_̶ӼȤK1<Tf7@aa=;|-Gm=6o. o}t'@_G@_Q`[k {_l]^"ʟYf7@n4K=3?MF>£7Gٿ M}_M}_-m=6o.$k~W(s _Q`[k 7@ai+ak~W*?Gm=6o.>Rak~W*? o}t`[k ֐Y[xc4 j7GٿѢ-m=6o.4h o}t`[k +;{_l]fF7GٿѢZqZ1I;N~[-EQEQEQEQEQEQEQEQEQEQEQEVwI4m"[cY& F~VwuE?)MR(_j"R&+` 8ϩ'ޗ m[7+;DtqtI1d?t ;_<>z<Ƴ\4qD`Xmx ʷВ]y }{C>|Z?fտݧS+֟}xCz6-ŪY,2Hd"2Aa iЯxޘ?/ ڷ߂wW~85|_=RTtA("_s|dJh?R֞(-nOxYX!&jmPyqZ.ֶh奕vtD7P[@#./u };ӢK4y:UGؒA8_>>Iy嶆Iϟu;M,a9wf$tӦW}z jI{C6~?WxUc#DW: bEq$ikK"ebn9콥} ]ƻ yt2 @ڱG9$dеRe{"se(E%  *GZ((((((((((((((+'ogQgV6Xx9dF* >ѾYi<Pmvi(걂r Iםi_N3BEhךܺMGY\y-rg0'ì,1eUP=lR¬; }O74/"?kgVY 2:5䷸U2U]@[QE 񖷧xtc\\y*SUegb מUw7G*;p~ x?:6rޥgܗ.fGm`wg>{3(u+o,lw-uW} ? ?<>o. diōPgŵh0O4x]iI-y } t Id?vvw1$twºg M}n^H䑻F=)P<9eK-RNҵx]|?\FҪcBs` r9T#^.bqXiH0B I=z]?*;g9~?9Y<n5YTp@uȰxX7}N[޿hh>4ek rH0G$wo#o:1GOXGFZNO ƚ%d,ɀq&ߗ$|:[/.Jo J X$ q*;gWyд^nuMzxfotocx/images/batch-photo-date1.png0000664000175000017500000017536115247006660016224 0ustar micomicoPNG  IHDRy* dtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 331 419 1 0 deXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:421 height:332|fotoxx-23.70: Sharpen: median diff 2 15 15|fotoxx-23.70: Crop: width:419 height:331|fotocx-26.6: Rescale: width:377 height:298|=> IDATx}pUɶ}1dwwO=5$. ! Ĉ{qw;q;9!r2sj>٧wի^Շ˫,//GYY:m/Z_neOuu; PTH)oOK(h`شU*jy -cLnM<Ff0k)^8s}==XX5;yext|5,ACAVVg(WWANoaC1czxGƷh/٣'O†d#a6zm)8g)4e% 6^hdy9[ThkSs+}b\%맚CJJ/ On8`̰`ncj_CKS lYLadbcpͯ sRp.N4N-1y LkQ[q2.3ixHPvf:z(-k=ZV;ӨÇall߿MLwLgyb@/,Gφw2R}[MF,u@LtiLtʨ)*CIAb0qDWE }?iNĥ tyRS֭;&ڍ<<=nˁ! ~fPEol܇T5|@g8lFi`Ȕx5`   G>0: g$j8$ƒWTTЧO_G xU_7ŀ@\Ei~< HE EZ4aƖ)"wurv::2UO55%K&[G] 9Y-Ϡv0@~Q})*ww撆QD}ѣ|Zc1}akH#J`ҰsGݣlA6@s߱cs3HW:Lo1#GCv*Fff01'RCdƉW\NBr32)^"'l3:mBcˏ` P/]Q; @yyLVQ}{,X >|koܸqx]ă}`bb3`&CgWաqOa "cQK{B_zb+*kzQQU3kBQNچryۣ%i 7R50u^ O \ m c4( %CiAS- c:>(jyyEm^wIx@,;E=肖+#N~9˫ g!yp yS=m cq[%##qqqHJ@U?*x0N^RZoy>0̇HMIF>m^ً *':G64҆u?׉@~0g=RWX 6:&u)xǗ7@UZ VApZȫb踩Xr=LX`'.:spEE ➜ovUL]Yiڍ ΛQ(!8RB{Ĥ5T@\,F-Ĵ&W3  N;ә{8JpĊꐁ9jB6<ųW6A_M2t;JziAA^&05&Qm'GX1W#]iDU6' ֤Z004aSV<'dBTTЂH~E/s4 _+;hƮ<д2TgaZDAD^~Z$/f0zMAfE^2]#¾}ڽyMLj; Y] &c{'''>}:|||enbig;QYE'寺 A74)*,'P2 ^OC@#KBI^FBp3>G&mW Z؟{`䲃\ 6x@"7On:4̰5GaF\2o? yZPPî R{ vqXu(aɮ #Gĥ0f^ UG t:)8`t~~9IVLGU@+QY AK"jFQN@2RҒtl6XЩ[FyCN^ ~: ܻv4u0vn? :KE1QuDąP32ͮA ȗ) 11'GKHse"5v=}V3zdϞ="7og&4ws@hgbi';a铏=j񝟟Μ9lagoe'(QY64q,CG]bAb2OQNtDoH*r,O#@*Se piz.F](7|.@CR7)E] YDn>ѣ"(˂Ӊe٥ $4w`ܡC_'a m N>tzr}%5ȊpDn]AE9^=1I/}gGjqe>מ `$$a4hY`8A!4/}maw<8eqi%s*&(ݫ741jt6j:)г{t´ypܷD)QrxL4p9&#^J}M8x2%KQ}N(/+݀& H?e6ɪ@VRCEY,jXz2 ށ4Nۡ. ]a;).fz@uq="X61) ˑuV':%:&GZD`tCڔ5dFXdĈ68G-i =6E嫿Q} U#l()9Y{f?CA>=gً&^ G( rA..t`GZFD_(k^P8)qϱr(: *Х)=3冗 4} &Sfsl\0]'GܥEwƿtP[.m}Q0@2j&yȉ~򩽐K׹5.i.EE\37ov.<ȷ3Q9'&&('0 ̲,.RRP}_@2}%ЕN+}cC)M̌ԦY4: N^Te$$$Е*D(uQL|fJޕ$P\$%&Pd!r6YdgreL&}/W(, N35I)ȥ@%WɟEupJ2(@UNܬ4q2|ݚֿ)(4Hj#%ƣi\3B7FƚKF0H'@aҚ -$YqaHHKa-Nh;Byl$82=gu\梢2HߥnYD$$ē$CQJKKƴ6-T${<쩩=q>ƀ["So M﷚ (?;^[3)>uqa2|-.<ȷ2փu-vOBgW] FpJ헁VG=zƥ3cllѷvVm*U{Ϙ/i[Y[<=C3n[Eg&t(2 =hc2cOxϠI\m6,l錅 Ym vN: ~ɏgXpy,ɲH؝#R;s\J]vYg{kYXc̃<U^.xlyި:n}un.t/\(+C| X[aRPDvj} `q ;އ@CUEO ߿pTn8èajO. pe $ĥq3:dAB&W(-$yY tj 2,zjm@6@[ `9-Lg6~݅(r= 9sŕB]U!_ - -Lg#Kǣ2+y40`eԉ(='Ua(aBzsb=׊o\^ݺdq2w- Ve1uLDNN62S"ё(W}b &,zo%U}-^Uq["*_j^S n~(,Gnv6rs_P DGEo#`~l>~w;ɓ/@ppƒ}w&d[xt0prFD#)) I񈍍Cqikyq#Bwlo*|b ,ƒT.<DĢk`,?~ AxxkAXt1f= oC~UnP~#/ܢ́+$vwάE?d9c6XKCCZ 䙬q;$hvran<̍qI^Y^'cJ[^H<}*VlGUeypܷl7Å 8Й稝^7{cҼVχ4 Ƒz87AG)4)j z$CR\ {I|d5ǡxAP7'>h#gQ ~{[ + G!U;u(Y#Lh3`5@ƈ@߼엺*x/x_9<.hIЇf *BUMlyp'O썇 ?!׾obɤW4Fx/:8" u0j3QłpoJԒP&NlE|}M**`4b:?'̚0{aTXs-mw@PW:/0@\ }hTɣU@oۏvg:#Pꋌ͋!/[Y\cwՈ p\^]yE\ !Tl5oA\nۅL>&W+lM{Ky9#!& ,Qe@zEaN!xj~Qg!WPH{-W*vWlgPS+/ʅ"̴Tp?~'*NyB^mq*mV6/.+S^TJ8ެݷ?F 7ĺPHule&LMlP< 9! LY,Z4ӱj7B]uؘ,RP Nرe=fXMB?-YQ ?j‰+ {=>\I2~Y A iׄB]/χwV@wp Ot F?y829y]]H^wh &0^8a(:g#g}R(W,XSAo] *m,+^ʒY/1R cAXb:#q d3}6S-3j.|cE"3p kk0yўFv p>EQ0șN46M 8Sa6ºjqqJHQ/Prtn+2:q>$d` "bAl`D?bA1woNB(lFh5/53H$T`5c&L<&}PFRAnC[3۶e9DИ_p8̍X&zrNbiܱi-βxU4HWQ@HY]t{(a:;e}*ˊZ$l\>zbIfeEkwYَ@J|)ṛ=b<^MFB1t;4z iJ?BlIڃ,!s?wA7P<ߒ70H k/J5,8u-c]!ŭdS wD݂{Pݟ_W~4t _ ?@Օ𹋅sa]x*S@ FIvzH^p^>qo=Blb*"&qz+4a:vx/4VrQY]CA8UI"޾2Xu8-yaCZ^=p9˹gs"|PSWtuu讏6FVm2VƝHkֆ n:T鐊ab1W=n9 Rag5Uՠu-}l"̠X%Yan I 8bEx֏ƫBdTM/õCߕec: E\re} 0fFw)%ehhj̄2N (a3"ItMUY3"{_u!=(s[u"Sfu5e{0ԡH&U16Ħe6O>'(ŤŠJ :t,3֩зGw~Z`U"@C݂ P10rH-0`pv%I@;KiaIXe'5[h3,+K2qq )R ц9ª /KĮ!76%xU_ 3}WTlf[c\1ڋkކ1o֖a?xj4)O6annmMϣ WEP2)Fau]cl=~%ȡƶU)lI[҄0DA>߇]+RArK3#2܉gL =NXJ gH;偀DA:c(v!<Z_p_W_?iymsm C;Vx݅xejOm?o/.+c;$> 6 :EM?vj_˝<SvY6azxm:A otu_g< xm+彥[uKy8xmxpTςzylyy/bh,=+3x6oc3MR gtrro 67t` IDATs4"A^u|k^׼ 6g@ Ol7dxm௷ ? f< }i&oo< σ 3 \:wN|u)ܾq /cQ[S=O }6q|_> ~MDG~w&'m bdtUWD'$w (F3D%$#P8W|bQ[]x$iq!xr??o߾GZb, ?y".9Gyo?yH4b|WeLBsW浽)CLdezrG`x,ҲK{N_%8 /R JLJDv7rm<`B_ntW KKptGh*/&}gMJ 6[t4DV;K?7N ݟ;=v 4[uW{磏"!?%+'`ܲuHi9o`/(Ķ|N_4H-gpܸv{6@׮bP< 5mUQ6یA/~r!aArj+$ޤWįxV߆݇pUܸzkmPkUpI\~NWa5zE<7X>f9?5ܼbb g6LQcƑSgt ''64}p==~ g1HO=է7%b?#<, E uQc\Z2ͪ?~ _G[l߼˖+WegjjJe6pe/_}"5'o^^K@BIӗ갿~em~ncۖXlRk7lOXA4 9^nضiު5q ˛=;6cٲt-Î}GF[޺z$`ոk8N*۱mT[V(lX ˖/|Ga%4a^bށv+vzE~8b2Ôe+9wDBN!'_qK8<˹>߼ <[AuٰjQHu_Cq(c\\PVYP׳Xy+³g$΍s'YoiNE\J:cu5 |[7]I{0_!,Rg[ D P1g/𑣸Y+m/qp"? n0|!t,,pb7f l74?4᎗j'3! 0*&Ϝ&CG[ìl\o(BQGd7]aw2.:eֱvՉw1\R.đ$#΁|^+Z_!0 ҕkg.,9Fq ߄ ,^t?˷!HHY?vhCbxq6#!/'8][G1XOcϙs8x0ܟ 7MDq842LTBC&M%9W`>dUu`Kq1S ۏ<}M1( u5uh">YM1+ȶ@^< Tu1tD1'C],wGY3O<}Ȫú0_Zҡoiaj՗MP-OUw@ߛ]3zY@ uô}o9d, Ӗ/-`=e2ZKV"&WJ_a8 RyW4+JBwAҸ6 }dˎSf9ɿS]~ς|}%NB^;"yHIGbj&ȠˋS1c.Ý(dfg!#%܏/.&塦$ 76YTsU(7W[Ux,lY{߹sόcJ%*A(1Ŝ31A $A %Qg^D4}nkPU_jڕRT %>o={" l# ޽HK|&ZX!rlfnj 7T՗`(+N@6m? izXXsbp>ئIܶMH rP=1g:wd3\AUPHVh9rɊھ F~-N |y%k]^{‚\Vgl17Gf3a}x  9l{ S#y:ij:TWUc6up3 $] H,AmVQ;IޘFI3iMGfZa)"%Ȩ>8Y99LP%(};Wnk:^#`%+~uCĪ3_TbT -]:Xoɷ~h2QU"FTƌMB~5!?EnkydE/Z~d g`_(M2GhOaF #5?bvuvl9! \ߘ7<CdAhF߈ OAv!:?4-p7 xx5^lWM(̺OK>y 5htW(ɈaGjpn6T g Fnt=M,Iذ 0Bbde%?AN>xҳpp{ UFXx:ߛB^|-w}[d,GNi%-@Qix(&^;waҴIF%ܶoW],4% lzv&iq0<ť}Yp^b %6 &*ɡu jȴɯ* wN,lxe]jC\%5 ?JC܄d<< ?H\~Y>VC.b잮e W/k`%t[y@ef>4Ju%x¢gw|P7yYF\;b T :ڃBċn}0}A9;C9o;;nV}w: # 1OPSmyqHk@u{0ṁ͞٣|ۀ*kL|:2 _?>n=1lmݻcr0Dh'"L_ b~t<]j=xEPehl&a> 䛪D = >CiNk>nl1$jyy1X0C!BQ$ nQ0M *RXlud3OryI򲅶6]E1_u5e0/EHAvҡ͋п x$$< ^tÆuu/Zq,??v&S ۫j?" av#wO}cԴ,>8W/JfD! kiõ_=%,ڊb0KQ&{\yq.X#={SN`[[/i,8鍊vK Sݤ^uwV}:[:cΨ(B{Cm kzmeL&Crz!Ǡ-,;#+7iݨ{*(Uz}Z cq꫊vZ-< %eN\0j$e5YW6*_,k@p&byMA1rk$0XLnoݜk*hț @,};X2e4f=tg75Vr>D`M(ӑG{ ) h P~TK8}7-‰m 1Zq$$D!u2iTZ˰}/ x\U A*.(6p@t5PWSP'̝ɒL+?46^q3*E(#66Hbe[&&4\Tu@HgQ ٯ$Q4 T\: zt$^+(Jo3SȨh7 LWM3]Xz '? Ѹ4O}vܢ}e/,EU3ۼRoMo+׬G,'9aX)L˗/F+i646^k+mT=o?{`1V]e˖AGGg@b-o4!&)AEQ#( 7/`>c9m/^ZzX"m7ȿ[1&qqq()S4zpƹura ~7M p8e h+CHTٵ*@gT!)C9SYlF;{yHVe`h2 *-QEA^`BC!"/J8P4C:)링B`-*mg4PSǺ"plۺ K1&Viof/S_^, edx`(V>oػk[Ǯp%n{F__Q<ۺu+rKW.axZu%pm/ûWV ׊簻q;,|ݶmP\9䶞DȒ䱙ʴ @%\'M;N~X"X=S/ҡɣ>w^<%W9P_:z פg/ޤIJBA&;aNz۹%;br{>4^[ZMg>{w!AL-UTÂݲY[Ag pA޿wν{=FSshdžog--O^E;w4sO$]s4Ә(Hg죱[P@Ƈmpsqu>BV9@9I܍E_o^~>xx~t~o5yv$Ԟ98=p<vL@G/K1().ȩ 8@{& _c,:Z3ϊ~]0Ǔ-_ ^r)0Nf4qmZ@V$q'osx«.Gp$n uWS;wGp ρ'\U"2!{"3]xvwQAD G;iN" !r4Y14TWb aʻdDÑR=Hoބ]7oʒ,xM޶CpD,InSh&CPx W42mamm woSzoG>rbx6șu\x,)! igCeߢ]x!&,#[s/Qdꎖ{ֆmףO@UZg(=`7lnY-x>և<[*? u$&Jq Ň=Լ|̣}o暲\4Է[pEefcj)i#Xݚ'mC|x_>=zµG@O ^aU%8c$pɣ9; `1q"qv"I*ⲳg:DC34giCc3#(ݎOEy;U=Wi%t1Q{ $dbAݿ(ՠ>3ŘfxH@Ҁ7BF/LCFS0zp7ɋp)^5V#q DgmO Ǻ,$ mI7Ẑp<='1S0TDS`1[LGA-LVSMMA+E(]≛Nl6_V#;Wa0j5%iHKf$L8AZIQ, %j1 " r8ekm+-M U!E9''WMF7m_ zzр4o܁cvb.'ANR x a'7T[y4olX4}wƏX OROJbg4)#K7NGpIcV%biDcohuBc9MbK9 ؽF@@uUj3P)a5S  ɗ\^V^=oMom[ _䲐a}_5!=)r1s~:&w6>BY`^z#1b=^}/ KbM$ÐV]zTWzfOt=U*Au{h  IА!Z2 5=Q"? 17L) "6['CNk ;%+MrʡˀwuaVLxň.|W_or{8>>͊"}9ڍ'%1PKk0D\ ^%,O^Q>ޛgwӤ)nh횎B"::$xKa\|#%H3XK_ C-E*Ó-CË&kvmjYzUsݐUZ =Q!ڬ p=EvP^ - Z,I(Tyil4Gr:os-fp(@͋)^JJzJ)i5:VDHu(bȈ o08^$шh(("I(#nvg<̱a02dGxJa!wA]UUU,sI^.a砦a1N]&bdCX'*}]~Gb3J7^j+u|d7_~{mnYax\,L0[S6w#O,ai<׶LEboY!#QE`(&`jN? 0(B\J &אSVE!&0\RJjmˁ<JՁҌP, 7x"B8A?X3-nyMwi҉f&S-7'=b 2[#X _Y ~ʊmǩSgHAXa*#)B40勗M,h%IGnK[O@ |(8(5yKcaEY%0sNd4ya>Gl;෽p@fc(69<9bp^( țr'Yy4Q#ka^غEp47עrc?OMF m~EI_88ujMxP;wAQ~$$ c9*[̓9\ F4bTCC46ԃOjdo>-b@~BkZ£O@o[@~|ȵyj+FN `D%xbоX@>,1g"C"{/Å=176\s@Q+`@~c8feG6: LXo7-l>CeE[yNfvt-hqv*^Vjt`9H,_#WE^0xP"!<~"t(旟̭ƺ))}9CB`8ɋ>yjկ(hp|6d`χUZ ذGgeyi>G# oxպ%,Y2 uX?Mi/&0<B/('45 3ƺo͞xzx;_,S#yS1/+Kfc(E0/?maN6/{  )&Hc3Ӗ0}hRd#lܴa׹n>H06---Ķ0#PnV>1nXfn4q wNmقexĆnF~UUv Rr>TGc94cAl_> )l1yBc{~*Q;Jb3өp|Ow^T";= g,=PX FsZ@"y"Q圆&""^Zh)GF0ϒK?n ;d~d"+L}ӥU/E^*y?$Rw>⣃P9UՂKpDiQA{&*hf6h4kӄt^E |6`xŵ$6W--b_:G{ce5koJ{r@T))F9W(SVpDiLI h|Q^]mh~D^0 sE؈|-`Φ:s 1?œRX\q:C8@ Zx;39@Np ߅YZ?ɉ_s Yqp:Ѕu.,ܿ:ON~ 5(*,.p:<:2 wJzxNFF:wqS.@cIp4Ӂ*sjҠuڧ?zi(Χ0~O @UU>̘ƆzVW@(Q}] iV<^xoۆ:TWjQ[S^﫨?u<^k[|5_~)׳<ǧyu[^MɾaMuߩ\]|VcZ/hd䣗U)tϔAX.W?t)\iaHBa> J>xonZ,M8*`R\: CPaa(9{gڵ~g,0rRCj>؇q&3IQy;z>-ܶ,-> 9;!3k0mvח$lǯ(M]kydWV/,\ Eŭ~Rp,<}_\J?__NjXk~ 2L<] ;ZPxX y>rcz1F+d&Bn,n"fQV1!,*, 8,ЕRW! ۖcPސ֚ `Ӹzd%FKM/[9sq?lܾ|c1JI&Cq$M WǨ0eZfs ,m.|n&5k/BY]=%ػRRR52)PTmx<n0Ym8z嫱`젶'H;Hjsuהg` &y昳`!2f݉b!3hJpƫCZn4ttu0Qo*n=p=* 0XX 'aX-[NC=:|V\0,yyو u1aĦ堁W [KcH§_ԯ:xٝ(0۸,>N׎b%,u]-0{nƐJ#/1kMT1u%HE2E%0[ tha\G#Z hAVs 6[70!~4BLI)-œ0LF FXTCayF)1"Vu<sWo'WǷ cU ~ ~WoYkIjNه ߁Y̮ @z'Ee |xM8cƦ{M/Xה` (3Csly%Y:Sz W @2ݠ*+9g^`WB>?B>yu)8}`%d?@kwi9di~{  8yDGV,ǶxV,7Al@_hXCӫWxop@~ IDAT0YWo#yy!8˶( 3j4a |{G0b \zWM4%`4預/jky9Z,jsXXAu Jox,/hcl!" ĬVGCY͆"n55`l=(LD>YLEchrM>H=롸/jGN׌eO=c6D\E5z?m%X͝%DMe 3iTYG MΪ<'KKmi蚢f?y ߢ\;A滏 F^Bh&N_?}|f/fC1B`}qx, Р![ -%Y@o,U#7;Ϟ @**X$]ہ|=wB^}?5PĄyhfu TOnP2^:P<8LuuVBuP~5%b](O : CcBn,M"65yyي|ߒ(al~ _K ?g0` nZ _^pzEx_?vAD2ZVGğ]9^|: /ʇK ϗ?"i\PԏB?=!@F&k92D FrlD\;K,d T|%pX|0+F:uS~zɕHaꭧMR\؅QÇ'Mr;,y)xQY0.Kd@ aA~ 3;|iH%*"C\;DfdTְU&c +j)$g\JM2w0֬MS, dN K oeYTܧG ^A{3`K>f\)j H"1CcdUS0yF<SpeW*p0 I m͂d$*2 )tdFP|تED1h#M>)N|bkү5{ i=hd" Q.tOqw@VzΞVV8}d3FJSÄ9#@^K!yd6[J6 ܿV\~Guhò`k@r5G[+ɊR&چ݇q AqIPfEc" "q}LO eoEI!Ծ:D q}!U [}3=xXH"0)^hD8C߾g^j9fK m 8at?ֻ0owl}ĮV*2pb9 ,kk"UFn{ǯI(1\npL. &N>V'8pܰf!+ = ԯ]׷?…+HbY&h3]3ƙr3aA+$>t]%sYLxTfzVlۇs^_T (DmU_E:Iߛ 폱sڬoٿUB9 CzfJ (ҋ\W5q.kC\\ ;LntOg<d-_u}cwqܳױ{RP I_WGظ~% '*m,t_Y|: ,7:Sq9;vG)p!Og=OMr2:E ؜p:Еuyjp:Ѕu.,ܮlp}oN>O8@8t ]Xy'O]Y8@8t d0l|rftyP^=G{Wa?쬯!&2⡛?` G?tAEy-~^nmw5r wcfU0<_ߟK?/Β,f+' <|mp ud<ȓp uk=_G&MLnWJHM<7Jv_]' HܯmθHp֡3V˿qKY(W/+gJ%^RƯ}5Te$zt|;NSBjA9&y!2?,:R*< ңa#1RAr2QPÞ3PԜTGcxL rЙ:2uX=E} %sAKMgSAMHKC]> ="av!oY5 uɑ0x)̢3 Lכ[ntjƌ!!epiL2hmťڊܻe-uEHHh% & ykBCcDLfé##q LC=1rL24#A^ &&X}-&Nhy) *gnHmP0(9$"ep9ics0wL{S%r,AepIaJsp,*KCBf$XK7`1 ϸCrj֙Sm'.#k4ROHmHz q14C%csX MmmuT&x9ʩy?gX9 =zĤeqCyRV3?c]ځA||#s)5zOnM+w,Y=ўs^ I-1fȬoF"]a<^WrdQ C7Xk!2r <?Y: : 5xTWV6+kM6F_,3[AQiE6")4ȗJNYz"Qx #C4X[ضu3֮YukDWªN$%n|#Hj~v#^@Hۚ0wL&?҂ׯ^hI߾.pުk^դ ˚ֳx_|y$O"8sa5 4,d 5%iCMU>e2\8ZGQt. eRт[b_¹N+uu(([ }q *R#kxJAjUa:cBk߳rf!½B^="y "{!>5l~CZkuHod4NK( OWCׁw%a4$."28s \jJ1NKC򌻆!:D>C~ZY M< >{F6{=) ^W]Ukl-– c+M^#0C=r,Y0 nEj}\C!!~_ n`oBav(,%a=s)rrphH*^`Z){]>? :9{69T;  (*DZ͎Rltގba T*Q؀mS!mZ Ik@E[c'bڬ98| =dj_>p3MǿU%<16@B7|}.ɻme&{a(ͮPE R솺 q(υˮ πNˌU3!9 wxvrXq ʚگJVS I>qyn$ Z(b5HkTc  &[]E3m64KVoFdf^#ɿi-'6tAsD!k?ح>]|S]vo!rx1& 5ejike#*&4)Ɓrd bΚ]`,4Jg4J)3-i!3T[[iM Ť3qdwg$u1M0H £бj~:WMepafz#[iE"nz<\vWܯ% BOZsLLj:+*n9yQG7Oք!":VH״8 xcX>{4J)aDZ ]}$75B%8SUI8 ؅%yWr;~u<eɭPĖ WPɵJa(;:"1G@q5\}e m-H#w])gf#ɓu"ŬC(ʨ?H%|9`{hI]G6B|'<;^)>_bDud<=+P5-!gS5iMZeV$\<$`^zElu~SI(O 5#\ IDAT4,4 /]aA9E ;>xh5AQR%q.iB%%Y]< #`m¾ۏp;޾GKMQXz(f@AeZ^ ->ŰyZix}~?Ahm=QKٳF7q +`̤9JNGqFcʦу8dd1v&N)"R8$uHμLݼ ')) 1:_MBvHe[[}o5;WCQTWW]._e%e<= W`iP>1זnFNme'aP81FP&֟<:Θ7NTV+ܦ4IfX||' .&iYyFNj ٚ`ʵH)|f(=xE+J>+3#@9R@m&CB~.Ê]U Hӽj n `kϹH6ΫS~Ya&⁶{̽cIxwQb(i>/y쟑<''?"oc=}$B]X8C!5 ]VПD,77j,Z; +COO21|Yx6֮\eWw0ؿT$9t $)(9|_ \<`)3fO<~W83rk}\b|g,VZ\M ڷn՗|83!%[>IOHt5?22' ^T{ڮ]Hz>_A>]AMܾC."%1#>6]p;& >$3o7{~?v?η[l$ya϶Mx)WQ]F1A-z|쿥cHz[7+w]q|Hobc(%Hj#7>~Ƞc>ߢ$;bG8qG' k ~\K \e)18|D>X̵5ò'_G$^q㇍˜d#UMڌTSyIW"?ʆ߅͐ͷr?ɿ~FlX: pv8\FPDz jf*a&FXȣbjȇG>+s#5 V`P IƁ%&f!$0YE%\V7QU.eJ;~Y;'ȧ"1$S`K ՜ (ªݽ9>ɳ}B8QC0>"C@CI Bj9VfT=xNHH\#XjL5 64Q]OmMy!\l堢4SfrlWQvi*?;N;Er#0a*_m 5((kQL< 0 򐕕:f,>߾m; 2HDJA)+I'XϘJzN56ofy $He[ή%,8e(I#oCmq)*Vm݉K9$όӰfy?f|4b9Tp.4U 1 tT'%15'\1#͍9c-Ob@yb7>lVJ*jə\」K`8̔s>ɍ0b]*USqVltqZ(Q1Yb/llX3֯.T#\m Als{*DFW?τiS?yO:#yv<))UtbT8{.CK[:>ƒBoBTdPSQ;]1Q@2ط=TQҜhL0D~`1y\< S0ʀfaz:nܸEfa꼕N}G?߼* 7*VPsu0b)|~$@u<Z+^}m>+warhȋC}50z#ލ&۾ZO\w@FhֹG)si~&f>`>q6HeM mq<9*U՜\O^q% ͍1 n;%" Yd4QI9!0puMul߸r5Ҡ## -cwKqXI=~7S<5>3߀^9ȼ b2m; tg!( B*~qgϜ)pX{ET0"-8lۨ QaR67V %c,۰֯Ȗppc=sDWBEET[Tj#"yӾ߿A{8 L!C`2#b873)]=3m&,ojyP?!6R|Hңؙ1c8^w%] &( cH`0~[NWc=UIuq";S{wAMJ{}BLeiFT: .B:tS3EvF)$ Ln-іf6NPV!X?Q Nɬmi1E [pǐ<^bZ"un"xkIMo1 ErčK '"UwSQW K-ڴCPȪ)i:Pgv#TSj*(ERc1\m(&/[.9X^Ub^/5ᰋ56qG5s`$Q3_~,Sqa_*A^BUZC&|#]1}~ɳiQsR (qhn㕙Q/?Ϡ둨+nmVSCu)h$vs# \(#(MzCk=um|yc\U[1!cZ.VMpݿCqWLũl Dr9Cn@OA ;Sm)K47 k5b+N05 %<t&1ŻI5" 9ru՟dbΡz$Ou!O庂: %0ӐT )ngfQxƿ(>;QU G*)eZVs#S\;sJ`ݸ!aX]f>닶6Ro[p R㑛(g K";&|y8OՁ5B:"؉TSbSJ 󆲘VoFy$_A>ec`3"1D3'g&fT>@f0m5g wD 7" ̩*o? 8<4w`>zǿcj.n7w1KKk}2~`e*~I~싰hF+ SMA8=UY8 AQ- ;oU0~/q4] EU#6XS>kibME5ԑڛfd@`|wKpc;GVBT?ǒom}F0̴c O_Tgt{&DL= ]Ͻ4a3_\*o i nK0א{DXny+w A'BAO 8$\ %©OeH,8X(z"!`$%غv9&MHsC(+bt'|Ai?}$_SO/d!'lt ;'N " nQ-oAbSDD>v,Z/ApI*'qP'_e!E60G"Ң-;D$?.$jB|A\o͒o'yy~N/ɺ?Qy;kk +kkiEHXҶ= -W,1LW_)9y '`砢ȹ{j:Mߣ%OXV-qqaa 98m9zT<b =󺳞(Jw'W@دMy:Xzp ~QT5 l1% u #a+7I82za>R; RB8$+)*Agi~ߴEy3ɿBB; mi'a<7ԦZB1sVH}k L\1rN'!F+~Ɇ.' w$/#37L 8c1$DŰԒ4琰1 026:+!vҰ[/8zec)3]I5ɷO P$՜H'pYyJJ[ ڌ7o^ %U %S ," w^nͿϒg7fAWoN8.^0h}[q?ݒo׹d3s RDdS0[^88WBvBF]eS2Br ; z\ -C-/0S/pƸQ.mp۵B&{[k g5]_I ¢$,no$iIGV+" % wFmŃ쿚%nj[UHh"a4Uw67$ߙ:rP _?K}eHh# 5J8 Ոxv,Oh8LHyiјb"wXՙ_Y{M#5)6΃4!$ч˖zz T,lZhۗx &f!{Ȯ*TAe8d1aO]3Ȓ/q8Pl'lIQ 21g<]ў5{ah^eyX?g8,q# ^4~sJqMǜQ0OHB1=`ĪĞ!I憃Hx= C.$* þ=~BÑDuCLR7?[0T⪓uUҮop}l 6xSIIuN}q}DEG#. O4D5D6*}-uIp<r{֕`Q*%5<#'xΜWX,eT`B Ck.a!$90육9e<+鴴3.XE N<8CZUn%%&&p%,VpM~_1L|8I|oB䁒$iKBeP:ӗA u~a핻GI^@k B)Å 0oXv!;vCy_PzFOZYX9R ۩=+ '#u}-oJlD~Z(,IUօ45ԡ?bwZeAILVA{w}< IY(q-\<_u$OXPbyEHjZXCrJ5lLܔ`rg qMPEP $k?ϴǻ>o>ok71 #sEa Ҝ|Z|ͿF Q c@(S&qTb7!;5~O1=z#"&5uu5/Oxz>P08dr 1ۑn#BNjs}1$_ic :xĆBDR jf2[ϓoLRdgDg0l+K )$%9ȑe+;gn{Sf 2$i5(waH8S2sXz(TԶc sHr`{43c`̑'{y!42YfSH7P5'9BˬhZ-}i(HV)Wy>B{WeGb>UˋS~ H Bt)~e| "cIV#+#ENY"/:x:w?"ydepʥ, "egIϿK>Od0Tr@fv ex;, K/2c1||#:~X|K;$({<0>(?? ?|^}2$ޕQQmۜŋzX~ϔS8~/3$aI(w%'~{QAw;#ϳgg}ؗg1ʯBO";~_n >7|<_~` .-0>~| }3>O({>AeǑ>IO|,|[c?5ǒ$Ϸ2X$3?<ȗG$'yǗ 2'\5Xc|,X~ IO|+/|eO?0:[|qdO|[q|,|[c?5ǒ$Ϸ2X$3?<ȗG>J'ļx;'&z?=_`~cǒ/ߗ |h IDATWUb~lI\+hw>tG`H< e+|qy {d ,P9xOy?&եp=\"oy!/vK37OHM\oh㯴K],=t5}kDb8=1%ĸe%ȎM8u=50}32J+>~6@YҎʟzwZPʡ:y??hX0j[{\ AP`Rsbq*+@Ld8D[TLJ+LK֖f4Ԕ"6;4T֡p?sXLgW!#%!A{AQY9#9I { B|b2j~gV#!6/Q/.U[(&sei>'&2JCxXʪۇƺJwfLRPЀxk5.#&#a6bPZdW#;=b0kq(CtD(ҳL[{eIG:HNIEzR4o}p'+,>&}؈(7 !icPVYq ޵h_E+HF Dzl /4Z.[$ёac@mEơ]z~}M%c#x&vMxD]jCme7 CSC5H-)]'oz~߷]ȰP䕖rƊPH&&;%y Aaʹ&njFwD0se>=!VOңI\q1Q!gĔvcSËmo0Npu0dWcmR: GfN=HĵCs!jr´Fs8ᠣ m^99-|ͦ1ߤ\](7&"7%} ԋ50;Ln.U7ooiήCH挆`JÆaiwהf`'JI@NI* Wǐ_Zmsnġ]HcyKCԑ z6c`1|8#05f2G(yT`/wXӅ& !/' 5=h0Wük1}A^F &p{ ltF(jJMPQEE p\I92JrfJH3;4Tգ O4#c;5Tэn iY((R;220c j]8EL]ςIIN 8u\*H ҆ t{O"}yvJ`9y,FHk+h(@E W<;^Q[ArJ*с5,%a2i&"#up; RVP2h?gV5ij*AYSƚ5Y~QLř8} % Q1iGu|[k ]-(羕䠠U"ȶ>d1FGJ:;u",`ja1)l9q\yh)"ْ2$Ňb\%IȊ qeu ia8xl΄I^-,\"菽NEϓ1B# (+VBd@o2ְ-gQFsLLo3 8@#+u4cchir \=P]_'n{aL+6aa1Fxf>Y}~zꐒ:de1fBw仹O ѫ4L,1j(XZZBNB? 7ɲ'ï+s"ܿ=5HrR5vb&g1v!4H׍8ec5mQ$o.U7A_cdh,"D䶁{Ȫ|uS 9@,Ӂ՜e,BA~+Jo#Kn}'%SKOBiOt/857\r9Ehjƽs1X@kQZZB*4)&tSWXX6:8wxt6Ξ=KLM%DAh ckddĆ~(Hr|\6.qq)>xRX9OL&kc4FM:sDBC{mH>w7ipd\ oo\wwg[!Ґշ@Vs0Pxd6pVHYr }M0ndM&޳08w2{DL a2n`1Qž 7P;˗yba6B G\?n@XXvf}!d&srrQcw͐2=ЄF MĪjt_]KS2bI-qzX2Bp±#}7*xY#Bt*%er(OX(f hIV@dQ륱 XffɛBb:M--xei3+f2&Iaa,'A/hB6*#w?HC+!o؏̪N7p8YbZV4 #'`06ek-_adݻϛ*p`uEO4Jw}ƍ[!-<'}Q%tӄ䙈'b,+Pºd)ؽhkE[c!w.< d+} @ZU[ri pI&Bұfv];iFVaD p/fc N>0[[s mK+H} IjŭӠ>|<<'i0}ne"FH|/S;@hI{7́u+4K[9k*tȈz+Cp N\{%tx0ɫnɂ28"y+Bg\3Do`vp_)B&6% XFsM1nn0}O$3(H+;H%+5k,u=:*P iu}0us]H~oϮ4;ch bSiUkKeC4FBXg*k;'a2v ݌P`t2Y$if"y!\}Nc*Hͩ돺YiWc2ӛ9*_F@^TgrL1D\k@!)t M50S$vxV<6n uEU7̝iA ȏ 6;Op3cήMrQ=H vSa֬YO 4|x8j}{Dup1oN|ɿ`cՂԖ8w5kd [LWLH`5n;#eu; ?YPߚ %0KwJ=c~|3&;sildzNa:N9gRH)xJSu-+4|\/%?X®FTX= c;0dϼw%v؁eQ3-)O=q/ =&"'-#;5 >_DJݐG`)bӲ:(Ǘ.UHCǛAaN%b'A БX% xpn+Ԕ`vfNc!(otvft.zJٔ5 m:N[(.V#W`*;g8;S8I׆=.wƶwHy-)Ȓ_:eZZK1ш_YO>2o^,߾yM @{/]';Ÿr1N[S硘:?'y n[>(JX7 ɢ/PuxjP(Q`X# ⪄ϭ01Ђ>Fـ=ؓWBC~wy!$Ŗ±ƳvbnjDN  ;87b"{JÙ,r ڴk^ʙ6Ӝwf&c`fHPg71\UlE;wUuN}  ̶QbL;5Mph>Y!/bЗÖ}ȩ28}joHn!Xq4J;VTpmFA8ZaN48R+W( x-1Np r %!&X4$*#ccXj ^c "{AAŸk5[.3ZuٛʓpxD*K?x(*;Ek5X)5\|ɰ x7Lc $\I\)Ytmɮadq2qCPIGAtӱSeX֎`W#Q M"z͝%U &sNb93|wŨ*UCgp1bR2)0Bi :&qnݺ`HBj]~B?sO]L)]O41Gގzi#)Yʩ-J˾HJw Hoi^J%{=gZb-xz$aWsk)kh\ȐA|G].i)a;VǞw8VpA׶CJd~7V\NbP~0~u:BJ~rn6wp9~W-ICÔ1gAsxMzX60P{D&qz yG(-\,)7&'%u e WP]הa1 aB.#=B]~(U E<w@ 5OBAMV"2Xn߽`-6=K>,Iӱ =VVb3`1ál<=Rs?rP4|R' qL"G!!<[[`!%=\c_:1Y%֫%q - &b8fR '1opw~/X1Rf8tw=DrNa7˟'mqa𡉹 #c ?SlaFeg(O^DJ+}̳-7m`yX|"yWͅ8;JtSs.r_v.ٙ`ҢBC)BHH=l !FilxJyEqp6r6&"28~.*j(Ʀ!.&FAC!Zq\jdxH"{*.夓*bƽe`{T|FQ>9m=Ivb]L]W8uqG"s_XkA\R23hCj5pޣɥ9̳$ )%s"R#S "MM\l #skj˳wb(JAXHJXi e(zʌzz uUmTqI- 8?w6$cL^eѤwy*#ФT_f0~Ya]N`yNVjs)3CMC|9>˦"蠙T%Ǧi:)uRwoQ][OHbEA*hL5hћDDQ(kX , ] 35s[ 3&99ZZg}!YXZaSq֌:0ƭJ6aI8#؟mMۅo&CT*>IDAT7r:s< '֖Uk+™#4?40Z۶eR]>: F$]h0H|k ށ~ǝp=b_WrkvڙQRSn M"iqci]lExvͰb?ZA'cӖSuLoH=mZT&X>|~x?ŏ"DjmћN(/[:o¤q0Ÿ.?fܻPPN<б25ꅟsx#L6"S_qߌ4 NZ^kVƷ!qkSOV<׈ؼY]s~6]$wwA1110I&`<'y<.2yy?9V9s18ɋxps r 9(cc@$/#4>||9(cc@$/}/ex41 n p$ϣ8cGh} p$ϣ8cM< ǀ1+e'%%m111`hhޝGGǗca'G|?9s18ɋxpy&(1a<'yq p E<:9ďNy11 b p(MQc>Ư'yN<)j$Uy>u |EZnA~70 Us#=(.W .nat8*+J_7'yNyw~]`{[+J L< E]~~ Fqa> x-=02 OЪRM/()*@xMzI(7q 5ɷnLGkeEbcP[#u\Xd㗟F̃H*$I^ л+'?Y!h]i1[0Si ux1UJ%2S N&.Ha~<"Q{+Q\JSD.w^NҒ$O?61d 4[Xl#rn9" yH>=Qڄ.'yNz ?7,%QɌ:X|9.]e.Xn#.N*09+*< _C\qi)$F:VġX嶒l +uF*߹U]P#ysB 0KgäoO-_怃oV.OXƹ()zkyZ~䃵rmJ$E`Ѽi08c>_~a@٢?UJxK|7<6/5gBuX\dhFjU,>3=Y%3ge3MhN]OoJ jEJר#=ya4^w"(-A~v2ϟEpD *Av֣oh#yN<(rD򌠩cO`1cjk9pb3Tm6gahje##/߭[!֖0660lMJPwk5hj3#z}e>Nyn-LLL`jf9K֡j[׶S+ Ks3[`ц}=.|xqgwt ɵ4vX~䘝NVeiap? Vfww솏])z_m=O)2vtۈs.!|9!r!ʃEg2u؀a&pV4Jd!3Cɶ3nv!*~\ KSoZL_5ɿbw YN^Yk@ަKu:f^Be,] c+ڌ ?,Cv'b7rz8p*d͑9Ƿ׻`s ϝny3{t փa0O{#ȮW|'gQ1\GLF d&`9 'Oٳ0nh|+~PRs1F6">br`rr$ ˼5xFĮjLq8Ad[j]9EscRJ%/V|';axPc[ɫxXi"Hl$UJ94C;EנxT7yy[8J J.V_ƕ0ͬ2\;CqH Sʫq.!`,wſ/PRh,"a+dVrX 8x_ yV EϾ{-g"|N| zsnwQ8'R4vVztYȅkNQ@{èq-((vc+kz#A#- '™d dY,`uBڥs[oym,>v K.km +B@}qG"׶N<'y=/'։Ή|2kTHJSqذPl #Ďf9|Q/ZȓԫSwɓ9ygCP)$\>6c&"^a5v{]]-QoRpoZ͇QA4 EN|%8p#:ґL[[3/b`|s,:*k|:S$_Mdn:Kdz"99,݄l {^@C)WiAt|2aX 9-0Ǩj,AͰm'CA6Ԓ9iltQQqNJo@U qԇSE*;"T$cgp0|Ͳz܁1Clm1t8MJ4 /Ywg ;1ž55$#EdeM fOh1iǍ s XXYC(][$g=LÓi7Ͱ1ӺLIkӧx9L ^.ō| S1u#R ˄iC;`?VCv- w^(5 i;6v1r$^NLmUIm{m|7<6|awR!+uU@Qyp󱪬dP-)CB@/@z:{ӐA-a0ꧣB&EEY12t塡 tPRY, dlaQ1d& _'#kw?EZZPGNn.#3+5!>Mk]ImI(''k9xxѐ<#V ;j~=*ԍ@wL642*Jtc#d5Ts=#y}ݩk#IӶosM;ZLFM_ɼOLs[l <'tNX)lȰ;92RWr.BBFw+b ;+=zzHLzE}Q`kuTP*[ }I#J葝0.&Ŕ]j(e8>}TOoN@6wLl]Jbiҳ\yEb#5]}̩DRlZS`f ch2[x&%c+]9s.H'۱'O%U§"]- qg/tdOF*[gB`{]NXm?6x{^8>fmE;2=G{h,gCKg@oN9s p E<ȅ 7cb<'yq p 8 QIENDB`fotocx/images/sphere.png0000664000175000017500000005577015247006660014307 0ustar micomicoPNG  IHDRmtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 164 282 1 0 F:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:282 height:164|fotoxx-23.70: Sharpen: median diff 1 15 15|fotocx-26.6: Rescale: width:254 height:148| IDATx[UY6Y_m󽐿0 : y h---`툶;~1 .6fy Kd]Lǀǘ B&l6b &lPySl:fi;;Qt4u.T|`9*ۈGgϯkR>,Ԍ߅i_BK&<m _ ~fAg cfBj1W4AWy / Ycʶ8@]U fQ6'"w!uhɬW_Khzcx}M(kQR&-뗠Vؤ ȩoZ>>Q0 :_@ƻ׶pEDZL3#B>}siQ8eՕ!M=ixqh阿l)4֮S?< !kcÊ+!LWBA!&_ԈءBNNrPYp~r2źy骄)Z?I-dqL= p:v u)_1pW{6b˱ZBO8vڅha}WӛY zv,7gX7k:fsHO?BL\JPRV_&km[=` ?}ڦRF>8_fM0` 6H@\Js>=U!%) UMhhjAIQkz8tvt.i]olǓ;WSKJ]N{-'l7qAqϫ4᲍T soij}Nrr2"##g=rssihof1, J$$$lZx󢂁}eӖXN[NBU[dztts1J2d$%&")9 Ym@Ϥi|2X'=KINErJ*2rP؆i@AGs-$ҵمhx);;ZQYLDj7*:)م4Ȉ ]IE{D2[jˑO}MO}nhAGk#r3SIҲQ@Rn d`p!GY]c$d73T\_6MȐe(-fiAnB¦*P%~<b!𣣣_ìgZ6;Wh11ˁiiipuu_~B*Ġ\p;8)$_if>,U@mN؜VJ`Zy1igK|q ihlу1ܵJ2X%2NvV㱻)dV y-00.(uV)fR@95$q47 tu[Vn@Ї8nتVٌ`p@:{"6TرCf0#@*KKV3j Gxg_qn m J! *N)Ob*8`}ƆU* ,v@+~+NMYY}^N~N~xgTw GH)p~h+rp66]͈ #q~2zM,Cp#K9C8{p Z[k>4AH7AF|nSP:zQMC01;}TWLLK/_9rY@gq^^^B0$'΀1$5`ߑp N3NL&G^J(\BEZi)q:'M}bבXYH/քE醒0& MT>Ǖ#!v FiڼHIZ[R 67 iɴ$3݄Ԁئ( zԜf#.> lm@^f*2rPJ-ˍJ(`T%R3?3KC{%9i{8BSe;NN iUY 2p%EHI@MK<_.CYT8FdTqTH 2u{Zv 6ְ9d5b/ =(5/"KOW҅K RJ{;JWG[^(G 4%Az fV?=9 ICG#}*QXnCw9׬º'ԉ쓓:-8雄Wks WA{(zŻmۚ7Tr'Cɒ@?td @B< o/k雔JKKFqg .#tj :Z9/~&A37l5NW{"^A7.HDxgF;C, q0 J*PQyuc6YL7?jDw[Sn ?𚹼y3vSentox1۬9dv:"i'KNA;n-HcPN7`7+Ud]&DžS7σ:m9a&rg8xL+Wƶ. ߛ0? d.TTjJ(iniLν<ĺ5kNw !ijDe3Wƚkgpi tv).f5虴lRnEl|d܁ZZ:0{AǕ0?gLsyE} j{aLK3mfo~gk B^ugGX؈BfZsphɞegajrq':47`&֯!7"V&{^z&ɷz:Pkq(69Rh*8)~vZ m$G^j{%Z[a8ٖ&v k.9Xሱ1 M#RR~p9uGS(kbn.MԲ̉7Gn A ?іSKY&ۻ~]mA|b&-Ӡ9ӀѶv DCooA]Ub` ?rbiF˴ { G~f0:j[Ob__Wpj~C#JZ'; 9t{&rlڠu-; 0\rQc8.\:nĆ=U%0֬ 6evvfۺ*ٛ>}B/tӐh_X]lN=|EoY j8i9O"=. aq`+dAn)D],Z[!>g5WA <>37,mv-Bfj~vMgQ/iw?A}%RZ^iޅ~~ c.Ndyl&^{oLMf!N7фY LL s$R 3&xyv ;?dzAEbf^gIF[<@ !!3 t L/Ğ@Ş>Y?XXKem&g~g3Eh_}s`χxgW?B2[ 3h/|^/A'}6 |P7 =1ϟ=óPNz)S('hI[G\SҊjlxeG'F~j*(o}C3GG?~+/|Pg`r,р^s&8(Եuk7߅Ws7=GA1xX~G(+"qxtYф gqMX@VVshv?>6$ %#.T4%{Gj|j'69Ol5dCwQ7562Q:ޅFqƵz>z^O/džU=TMU$j8%Q\kHN˜H^=3vTjG(ï5`|j ?>*}GqPCn.F-8]qGjQ 1K+\}> uYXPN.,f WSNS3\pB>k(( 2և.w\|QK)o}U qK ʄ{zZM*6R7=1P٬Tcw켔6jFpM 9HeǮ\pQ1=BEkƸ#=(L ˹S8jr=S0>6q0ˉ+=V'|&X9n]0ZHkb0OSt:NgNR?r<{em]CTp$-g`J~b =4v*}) wi.)a\׵rhkU[V\BhkDS1–#Ch.Oyn-(u=ET ic##xBeF?r>^7#0*25y1V⯟`lxAyb43+wv38Em5Q%3mԅ3xBo"֩!mB2>:  e|ka+dz8oarRSM#Lߪ M*ԑPCLb#p=a@y7Y\8}uԩ#bFpb?m*52 (ACSuTk/ǻJ8˗yac OhwΙQ,U? 0޻u(bRЈu)Oof7Y^Dϰ tb16TXӶGs&Oz"s0&;4]D9ف^a0c&M*}.:Ág%5m^{<e$!sl8Z}͈댍UQt8x*TQvƇ( lߠUS>C-CNY TtΟ IDATE&NqVƔFƝ@ܣvcWGv Y2[@~B|ѕI `6yJnwZ`pꩊZC5mpW]GBVBy&1։ѠrLOs1rOO 750A*5a Uhl,݁GCtn"` ,pV6t";&TVfQ DApbm$pI>;C9Bʦv*FE@ܡAgc .@UZHx>;v*JйGs(I 0| Cb2F)-sF qr66 FEK7EwG+UMFU}1>Цxv mt: W.단Ŕ4#4- N8Fu0Fয়eUA^(Д3L9>ڃ0Wlt7j}T56Ek݀z*|x baJ9*A}BP }Pb|-8C_Bz%tQmS#AYZr$Uwދ֪!́Fj ;i$(^ n/@j?QV$q{!G:d ɭ E)'!/?0?Fp~^  `ޯ,W'VT * _/[ C/x+yZCi5OcY5d6:ˑa<:UkEepbz{ W,u!8'&q7Ai1dw[b n۱*]yTUwp_I}_GvC35U#m7A|&%[??N_YBR&21Y ,JaMT&(I%`*l=дb+80EC+ͪq*"c,+{wS=߼'GUI}K8-1|9އd/lڃ5mk qw3R{_/x01)8ʥ:m?,HVi)_0l_ d߄RNEwE>nA Ȫw,IM28PoCt78lWZ@aiaI)DZxX%bғ~e'V+Zq3rM#|ytrjYSzj8z)-ݹ=jP!bR1GbfCVQ}ـ_JOY ?gkHofJ_EACFz xx3~a[O??O#~?H,>B C ح"M)+)g(AE{܇z[iEK/g!$bW_W/#8cT.[R^הm|O`7W1?3\@S܌DvCN'"調/>1QyiL-ܩd3Vm@ (־p3ՂqDCE?ڊǡcFIAK4(qotǡLL8dNہD.J|*)tM_&j[AnrsGTLGBY\sJ9% wՐ(}QIDU||AT5 ]S:*Pꨣa]88ٜI;/`M %ѰБ37Qf!!А4$ryLh|UmnZ(/|]+XЀ@m(Ɵey".$_n܈,5v,*c6 MhpdshTZ"*((٘j;/S~m>Lǩe}p;.5b~dJmw_%0"h|װI]~QЂz5e()$롣qj+.֨ |j`֝6ϴI)vTOCCAD@ b2'uK}rrJ>C0_--Xv*Ui ֈ"FmuAkYr< &HF&s}h-:v;ĒtvSn}*4fHy\<MOѮXS-rC `  mf0h:҉ >ǙEh]hoGծo6yϐZثz8vll!lۢ0?-?!F~MlFSsmV#Kݼp`Q*} 7BO9$"OT2-S%$TpNbU0닓_u- OdTaȫm=Nat9!|b R5 Gp7ݝlw*R+id"wmk PMvB{9TrHW9: *Hofӎ8d{U=!:ѱGA de98u0D˖#;!'NvlsT.,i!24,ԩ'qACs#LܟӚ~%ؼk?,OI;7k<)Bhi F3X?q:6m H#%TT6"m̫q o=>鈓Ԟd7!l('=->  (4 ?猧 ASsݻZ[vܖ`; oFE$sﶹ2K"[C3j\xomm+++؝t5ogxHLcDEZ=E&UeA >p {H,*Am7ܼ}\|msv68akTmvsTͱ=xBL>θHq*""5* 8ОCS]9Ű83;*:lNؒ`JIa5 x:g,6q!7I^Z!}]r X?g'LƣY )Ap:wǭaP(&5nEw[5ݺ’'x= %\/7N,66; {O"qATgp84&P<[H7/ 4^w xwMN2 ] XO>ݳfyIaLUv'q UT qu2;8 n?x.w6S?Μw  Σd \U(~scIM@\b*jZM ݱ9}oj8d?: ϋ6Pj5JiEX#rg A%d5V =% #=#);ԿtkrnʃX 4 ^ ,A'})h4~olx5Kpymfm> ˤ huqA.#0f~ixXsL{#-)vŢ0($>K 򐝖H4pI&> śgb)J 7ϗ/zCV#i0 |38}k1f+ɢ$׿I&=3t6M< A @U7n ==담TܿO,x!$/) õkPRR{??_P;Q~:= Cܜq<ޅ򺉬L< } `;-lܬr]ܻ,ܺu_tT4{^rj ]???sn99x ee`j# lܬM6.F:s=Q\/$$& **;_YYw>ҳHLJgsUS[]hlVl\uu/эѰ=)1!;_S]EtѾ7h,-6(**$?g7!!x]3gT}._qq,6&t9˼9ϑ$u H'&O#ͧ} ya>ۆn!49(Vw3ߋ~zwux|X"dq`*,@'=WމϢo(mAnBA14;ª2䑷2/ =ASc(L4ɺB OiŬLR4hw3kȧׁUOyNQPQUTaQԗᄾV [a#TzT:8ﰂo UUuX_"Rb+I!T*=[:9f3Fa|FYzo`6mԄ4Z#v*iLDzr@|f/*). m-\FJ9N Y)4~=Y:L ?R.2ǧL_x*ʫ^KP,JHE: `o$ @I;B%v'%|vv! gvSN^2F6$ހuk2<wlK a@6wEVm'F~Tp҇^O%.(D<//4]?g#+5?x|xHKB^V: lY%o0J7BZ |.sg4C;{vvpJkVa<.e3[씅k|*y}^kնN[vH8Wц3qX;g;:O ñõpܫ=Q3GZDP@o42@hiZiZ wf IގV47RuǙ3?LV=}9dzz4ȭSeZps{DCBu?MB~ؿ-ZA)IŷiX0~Jl鶮xĄ/M:Q 0/`Ag62S灬DdlrνWZvx:*\%{.ލA}['/ȅ4tq lݬj {GC W#_0PΉ(u5UN!z =eQ]^Bψ̪&O-͔Rϱ s:BX#TtL݂qgn߅ԏ?N2r8z/&&wٹ}T- sEx`+mܩ'y =1+ 9ݏЃYlP)a62_BU]k)k CWU<o܀ cTID zVJCqi5ꨲ K{߭ǥTu5MTp=O);,'D=6>yT|π^JMm՝*5i ;}Jq؉>rLk;}>q1ww#@krX\,>,,bYY0췐!D>Y\)nbɴ_|PR\L{֗,˝gqp6.OŲ=)\Lɴ]HPjPrsm3>GDDrnX\UtDeE&ڰXw!Ųk`nv?3zR,6ZP~x~**(Fh ZEFFp᮫W.E>AyYȠFǏʕ+S_Y̿ ר/4-7j}i\OO`Wq~w*/WWRO,F_FsγY T-37{z7W[~(n9NE̪FpVX&w P.z'Ȭ~)nOiL2Ci>.My|ocTvY݀SgƉm8o5vw)FI hjd*߬T`gEᡨ(-gA0+mG A P#'(D0ZV/%X'3ӒbPWEe x٦DHc/,%zc}3>f6!@@Bti'1d݁cd  p(AlD(J(" jF}\/eZ| Ls7Ӯhq_1ma!5!iQ)5,t\ef?zZSUTEG *,FE9QFы9ykЏ 3xM''/~+<-L$O^,xKx/I_f}ZﻟXʲP1ӍUz?*xF)yJzhI?If,E:7TmϱzY Z^hH!gO4 & $BSVlq*|?EUK'\"󷘂ere.0M=,9sO^w iVೂ_ A4JBhv嵐7FǘnC%ˬo0p /K)R `ppެ{ɶ.Z=51KRB$ZfS BVNe|'k1PVہ/^- 5ț=B8{Z haXGȪnB %Zm) ̻?XcG/<=5$R\͵QUa vXzat!v"1 ʥB =`EYxZz{p6X~q~?(ΑS(ob:8mڶ}̟ e?~E)TLXh!,e{cRüRo]Ρժ08.22YIOqPisV9팰E=MGVM$BAH*oAyf{,o~@D焀)5Y]{f< CbiIDAT=8̽k%zК 5Em8U-mU8sW+YF!F9{A9~]#"!s[x#+-qdR D)^Zz#=z-Dڼ >9Mn3$6$7 ,>—-cTw4Ǵ3c/Q} UX^ A$ȆkhȮeq*M(X6% 7+819%`q+veogORz= YEkGڭXҁi%jZVdRZ KмKV7x{;$`5 X!khiHէg]ԇعm7\)UG[_nM #}m|;!!-bbPQS]YΐW橚w/GPs>i?](y$Y盂k4kY"ijqZU2^M$@oq~1s~v: "TLl. G 8 S2~e j't$AJFƨRP iᄘR569v+B9H9.QY/_^ӀlO[' > oHsB9=-#<ҧA|\F^wx(-~A|QC :=sħUfe[Eyyx/;(gHZm6(l)w"#ix]\"~,X{" UA3 @a/6o…zG;A_~'_G uҰ5{?_I؞ۗ"1&ϧ5lnؓGT[5o~a7 ͛uRF+'3WOxVs&WT;g ,S3B/1pQxm5AƖᨇW?oiϰU=uu:nedaQ%އ0t};.&ޒONgw;t :Z`< +0@toA\B"VK@ae5&jq(k]˘q9v+JB;+)|.L7JBܳ2b`|SMv Gq%y;Jc#=Hy^,,x韗'+=,r֖$;g Vž&/}DFI\GyScA%woi~0?~g}|W|*8Š_$6i,}?|7v"|wq !' T">* 1Q2C%TF< NZڧ2 ?/}~&Cљip<@1Lgu XHcCs)Q7 YWV*زOB_x>%|N_du^.jXuʻyiX<*I,o/h l,-M $r^P7O.gQ!ΉlKbG]0,S0vPccacb˗FF,e^/`N=*,}8Ac_!dQoهlS~N9Jx̿Ĝy_{M̴nR\ ӋG2TU +=f>ijٸ3gիpuAA>0$CgHx{{vlz06~Jͮo}=+nz eo}28z5$,IGjOhY*P34-MM8d|va%2K94gvp ! db. iҞ0O<؅gnPSV~k.BSk+ij %>v9Hl8Jw`E4LH`;h{9 q1( ͽ&ہτ0[a[bZG44Si*d$ɹ=\Y?1K땈z:4O]Axpe ]^SPPۉ1&sJ-.8YJm S RME/jd1ӌ{JXM,"6A]MzgWB^MչY)\[=EPGZvf@[u:O@LL _-#V+#m!\&W}, %:]S[U?hUTi;EⴕBXՊRǥ(nӱSG@aP)la !!aI d#{o<%@D~s޻{^s]^4$ :_ `oӅ-O"|Fth =JIrL9|*c|~ Wv"wHqt,/(-|v-JmCJyu ˠאq}MQ}?<谸.ģ۲qU݇) l6#~876bc?1P,JArk_i@(F^o&؜*Tʟ{yV,Qk ߓW7ŧgS9؞6jf:GxHy Yx[_C[7ӑy 4j((#v;XcHKٌ*z8_ʃF8N,z)]~3*NjP'߻ܖOr=~\<8f䜹 ++r{`nEVi-vݮdwQ %W;K4$qr< :zSGJ w/#땝n thQvaG hfRDzSK7:hL*{-|U("δXŽ!gٌ|s]16TK(~7zOOr!ěpB 9gϐ/[|oܖ@ mt?Lu[.歙8WހQh0Ilyhq9 'thmh@?/ p N^?A-ߟ;wSԣ'w8Rv26wVq}2LVhee#]/i,/yFn!, ˃ رm;Kч%8yJ!5#]|4> Y>3U=[ǡaq.HM8;صk79|% __yQ\d#uEؽ.5P!<#50#>I෷4$66Jj4;09O"rYe*4劫o֠R>,м;[||x:ds>BFV@3 d=HEEE%:nu06uK#&grڛ40eP7[ <^R64[% T Й0}]P^&~QAySY zW7 W_D;F_H\ZB S|4渣sf7Y.yx)zMbEPdZzvGOFKWMxåtɥy1y o1}Qe%XJ.OY^ʣt2r[ m)/, kѠg7x,Fcf_Rӭ:[fJ*d˶^' qrPqb#nhV_Mh(1탗6%$'x\_ |u;0>:\vd|@HF= .ܾIM:%:gKdžd-+ c#F{=|bOO@_q"sWy;rNz&>:i,ODlԣN O>"Q.1R>Ru2Cz Fy W!5}nM'kV"ҽRb:aIDATx]r: vU}Ų?,HT*+(BfQ!HʎU8r+t P8oP8oP8oP8oP8oP8oP8a߿Qj܎ӽDDo@dO9PSœ2k(y7w$0RC@6?OdYm{:qMD)$|uZSmaR>_b,kd0_p?9 >I @@&$!Vdмhx%qJ'tFGe*N0tLnDQS@'1x-T F 㲢S|6PRQ@g0ߚ lV* F?}"Q60{)FHW7h`FHW7h`*zXw @4{4rw৾ Pbp+9g~ xw!  wjY`;@kpFCG.Y(-ɴo}ԍPnr˰Hm7p.6,{E l}qmvc"[@bo @^yvZV [eͳ~hN4jQ( 臆"(|/F4lQ"_ 6E x2hBNk`ϫnfǛXK:PPMЏA$)~*XKW4x%!Xl򫎭W)PsXM&'Xyd`#bQ R٨>LrSE!8}mjYC=E 5-7sH3#1o6 1(|Ο4K]xƳJ-a]O0V} Ӕ=PC-$V٘FT$@Ztd,ۼKeI(hݨI ThcH;>Xt=%G8s}V! vjHD&]Ʃy1kU!AGL]?+xS PDdV/ _kck@ ўj,A ;u=j78.$Ʃ29:-Ch9QEI"`DWAFNT $@]m8IRE#$ 6(pFItmP$I*hI*~}ϟ!˹Y8ʎRx7OUu8Ǐa-~=r՗/}X7琔i/yR.eXIfMM*V^(if%vHH02320100Fotoxx:resize| Fotoxx:resize|paint_transp|paint_transp| Fotoxx:resize|paint_transp|paint_transp|draw_oval|paint_transp|paint_image| Fotoxx:paint_image|paint_image|fotoxx-22.0;Resize: width:128 height:128|NE81iTXtXML:com.adobe.xmp 100 100 0 MIENDB`fotocx/images/whiteball.png0000664000175000017500000000743715247006660014771 0ustar micomicoPNG  IHDR>a IDATx]˖6gᕓ}elN>g<ѥARKB҃t# Q{Jt{luΛ9pr\prNU.UK'G_8yWprNU.UK'G9Mkdc#zZtd6N!ccW^M*MUC@/Ř+ J:Et TPU8A|T)r }uS|@TPSpIo_⑸M<·B[-^% ծt/3]P^A⤂vdQvUϻ?`Pe [3$嶿қA3mlD>W|-~`iYAZ5n ;J\oDTõ4ŠB՞ mxSp`"tJi@$*"u@At*l|( Dk./{ _U `~0U `ss^dfo3^ged&$`P80K:q A)*r\Gva۱IY:h_2F?_ung?J4{r!/Ĵ L0-sӏm`zv\IlKtG=l1D/R#ɭ9@Lv#qG8k,|5+¥IUWk:- j(VW Ga[?lIY|W$4h7aOV.2W9|?x2C\vlD F"!OY<h|I)de!JR|>[*EAUHK>K/yu[<%0ے1.[xV@F ryUU b)1gTu H xc; c*ly=]w>V iM3'>T9K> hoSJw#@m<3g)HޏnPR<8x Ҙ<$ Y:ֽW\{ PGW\9T"|O-!m]K3.vqP/YŗMqqP&ϾyqZkc4( V %[CycAںxg\8Scnܥ`DdHd}ը;2ԝ:Rd@jL 5}9ׇ5hq#6/@JL΀u?܆bYcM=|\ePH]P]U vLFV$r4q#B[RO@!@8}1{:CRF8#;ŹfoȰrۗ"H$\X#69t vR}پCo1@Uu %TZ*18CvBt[V}r wA> bg7/KZFi&˸s00 }8>d@*T*Yi2Tr* Uim@<.$b K|q VCdϷ[cY!Տ`$zOn>rzv3Տ@R$"Co9g, g5QH\e\ɍaLBR-s~:UFE#B:E ]W#Vܼh $ řۻ&_2`]/JDK\CYK?{/x9SWYK?\F}7W*rUE2kIxD}^* UJ?玢E`;G/y3;qTjPGȔ#u =Y|:?䉲c^#).aJr6=V>|g;޶oo{m:s >i.D(ڝ4FuM{o!6H(CĈN0l[! FaZUwsmo}No K !)^kzoD>X6anHWƏ{ڝ>tM73s5#\t-ygm*$ @K{Q5U=W8-DNv1>^(v.4HJɐ.DA_$dHJݠK R2K%n%I)%h7@ @Iu ARJt $ `L!w݇zM?t-:/ې~=ftwuݟ.y^]:r@ס=eXIfMM*V^(if%HH02320100Fotoxx:resize| Fotoxx:resize|paint_transp|paint_transp| Fotoxx:resize|paint_transp|paint_transp|draw_oval|paint_transp|paint_image| Fotoxx:paint_image|paint_image|paint_image|paint_image|fotoxx-22.0;Resize: width:128 height:128|NEfO1iTXtXML:com.adobe.xmp 100 100 0 MIENDB`fotocx/images/mashup6.png0000664000175000017500000016553415247006660014404 0ustar micomicoPNG  IHDRRtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 376 430 1 0 :eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.76: Crop: width:430 height:376|fotoxx-23.76: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:387 height:338|Bp< IDATx}\Y{w]FlX{ε]E1@AT300`3yN>uיOtӧOS ,~qpox9sI.8px Df0Y m5KiL3YV=a}Ӈfa?4fgG΀UѦUPP@ӦҘb=ke=d&37Eٸ0iX<4s$gVTfky>3%3pz&AII [[c[k!imw*dtǾOa^f644I5&ŵ}ςu#;ImSž􌤺*k|Ǐ#$$}|m  ^ u1lċоαplڼW>@bZE-).ޏb{//W8E_ j0@3O\s~/k0 L:c!ǽ{s&bF;`UEs>OEg{^y,1\]]AuEqHDU I06^CcM#QF -VZAbV/N3 qS1z`ffiӦO իamm7oLm\|ީβsLN `f Mu5XXE^=`j_  س~GZvGjn莦BW97o:K3k+;3 N~Cf3b}a)9YqqɊՄ2 LsXq+ oڣ~hYzO?u!pk[fXFFF}e]$M2 Bo,s4$hcC2|XVy{&9w^m`R>]f.\ݻWSӧOxYNz3d}~ 8qvڅ;wɳxL\9IJC~1wtz5`hҤZu_ M,1hx >]tǁ$YOqM=r~%;,0GhihC1rP n5U t1 nϣV@Ng8}7ma]8x.2T 1v ? @}M_x?%p,I06DCg9> w s޽ 1|ժU7$@2fHq`TѶm[l ~G 0/ G :7?D?ljT @XzM zaәCLjC##@ \rbMsѾipѥ̺ܶ"&'5'NBK]t;& mhEDg#?/+e1, _>O0pŅ9 $ǀsX[  , X̠6+NRz3d}~ʪ f?{{{̙3cƌ?V;0 Inҷ);d5ı 0e݈5 Z~H/"7QZv, kS Zwi⛏G3#hOAJ(!9s-`CHA6}]FGI~q[~{ 翺ϟ2hkYYر ɓ`l2x{{K.np~m 4t%I|Fv.iѱ.׫-t0|;<6 :Q̀`߭HcD{-`vf ZY¦kW5ÂtPQ5[QF zuĕ'PΊrYWV>\&,߹sZ//ZJڴ폱 3+hnkk Џ c $He&^mC) _P,++CII }ǐ0nod)y㺘B[6_rCX9gAVjHO-~Zt~&?'I}.:M =a Y9Ο`m =޸Xh FϙMҢYB@$kͺX̙3,Fklڈ+t\+L-j_!RntpBe9mB4`hjI[,fk&{>\^ޟ2|Tжx׽xƯAjBil- oFЉp{ 'dUe%g6n9 #;Qb%['$ GqW{\C=FgbY6{.wq(E ^3p~zAٳ':uTu;jܽiQ|/V/C޽1p?w dh0[a1C&>SЗ%tbN]a݁AzZ8>X?tA@ض F EѽGO7l^ߍ=:6X~ЪH І~ޢc>8Ԍ4]=IC6Dx8\tkזaS&45"e4}V`POM?<4e#-Fpd1+ςʬ+ $X XyBu^s>0ƴ]$1"u 0A+ގ +˞oc}gc`c 00}h 8|2sƴ>3LfZ8f}Cc-?0oc63l,lL1-sC`6h1.A_m֞x۟xw?1>7m\|3E?s˄@y8p\p=gdը/cI8y(=+;l0{J Ӹz>QmWo[ߗ)'C 8p 9aYyrP\Tۧb)pO//]gs!0~їx_ _zocȑkQoA&՛Wm57 q 0qӟuY}NFVO莮C?apT/*ǰū&gNٍ.ϧk=KsqZo s! q: T"~>v:dF: tsR"))Hs< bu D]3 #%Wer2!(zW zttTq"02:x9<[BI'+i`exJ?9 CU`<|b3Z꩒j6Ŭ {8)yNO•]sOBA!!!1 Fv.&[+iT"sd#+)%u|Oѫ>T -pY$^!3zY R2@U`o(B*8_|f,@^:{⢛*B8J=/j݂u*VBf48^cV]+4q]Ę0|Z% 88Iwr84n݇á'n> g5GńA,"wrMK7nvD+Cm\JRAZf +2?+& niBץIᓚV%@n]}lH9IX6 490D%K6|]CMAmlya=}cv^$q#7U8q9GߎfhҸiM0X:Up;Exz|(a;io"R d$ZVkLELB<`^PPŤ+p$O(z /bB7C4S;HJs+am%]sxF&PH{)#JX1f>2h{\vڐ58q>3H9=YI14o6~^ 259NyM8v(*¢$ r :mn|;gM%$NO=Z͕4`nfffӃO v$ˠ7#qKCb'f7'*4{4a ʸI,l(+Ɇ=0t++]E9Iq,{ Bg11Flk.)dϛ74]Zoz=o& 777ܻ@ "@%Gb& )6LA9\u*4FH_>rt6Þ4Kㇱв3>ɈtЎXv Y%euL.B/Ȯ92̥kajkH`9wEZCig iY2w;hB__ƀ6$WhZ'd?6BX4=gӸtdMfC@hkRo 3iXAX] jaKV#H0 ]Ќ9aXyu0}dIc /ˊ{uu[FyKCHJ/` IDATKלX?H0ؽwI1ɃPm!i]yOq ^gBM 7idT עp-ILA#`4yr5i\ק1xq8zib幫BSRr_pMEY n'?Ds954fdvf[G'L\ +KPMDŽ.QPwB\`2 eRꅍ۶a-غf>z'Nk8>FA})(!3nEU`:.h(+qvPmh̀]݌1|" ]r zOZQC{~G.]0(+A;e[uǩ+B^n Fnp'򲒰yn_Xt |a8r&D (VMT$0 Cwa Lɕ `0`5 2>5[a٘:uj%oO$5X;liNkgJ!3  0{~Xe6Ax|ݞ$EkYZ6S!C`Opm N,K⍍ K=`yLH!;kvkpIU 﨏"Sx rRҊD6)Sh?msB<-cT>;)h{~^6`0 RpʬLYʊqhB[aHqFF:ӄWv KA3Rm=ޑRǡ iA7|."dҡEdqzYg[7k< _#Ԋ@eY`È\`@Z д&͛faB0tU03RЏb!B1SPEUh#\.Z-鏲 X68NUxA;᫢*5e2s|dLaw~D!KfVZ=EX7sT ^TMZƐ1нC9|d=Tz Blg = 嗢yE ˾UMd7- >B zYCU/$U|Nx9s+.ˆVnsJe$^?6zJu^' VXr 87MwAUqŎ8:mK ( ݳ@^*,C,v<KKyzE u  9&%'&>?uzX00-323Q\Jh0뇁^Q^08u@r!2c>W`rI:}-<3+3r6"+cǵb&p+%9 G̀WTqjd((|i !tkni?[Mظc/rrISg9Er$R?0Qޗߪ&!K;)|($Q0npu5;ុ;s?nB2٣{wK䡝[@E;OL^ӫxH8/&!*i3pₓ"& ~x>H4H: ;qAw1oX8n_8C^xX;7m <OiqL y5]l&$*&P\qgnGvб~$ (sކ9iN7\Vni#%>G-B ]e7f +1[Eh?|&QP`~`';Ԭ <{CiHcJȡ9%aCHd0:'- fOu2vD/zep:RàIp*^گ~q UnebhR6ǓDa$ 3 (K7EN$7,&4uX{΅lܽM0vD! ںx7̃kM شt2dI`;{%˧-Ѯ}{b -L޲WS=􁆶.,Ѷ}i EfALDAAYԵto!v#'FcٌaPSU4U)E7MJ=NDŽtfEFD bRz3"kBτx]ą{~`@uPYI 3>ûCE]hl0g[(Ja ł4Fdr1 835W1h+I61_T.A #_}gnV:Ѹ(gҌ|PIА!M@yȚ}.$sCX?#:&1QB^\{g@ײ;N~Rc,1գ?>i$Y{F$'*Sب1&$ - k+1^UVDOW&Lc"&x?ZFL _61B''Wf$3 XEIPF9~M@>x'[_q 56JZˬPk|bRxBoU@BBX"""%_Td{@Ɋa|A[TZ\dӘ`&h&װPJ7cLDGW ITtL*TȃNӶz }:|}u%EcT;YdJ#+Âc4݌rI*WLn f䯟6hc({W`ɤcSa.sкT?,K)EYY;jn6:#F;Vj㿹bEmD&sm`zW+ERlXE}S2k4Fh-t E1A>i(].O)gG+vLVHhCLbC;#v9^uт_|Qqe5rr<<-p\ ?/4ϑWYX0~"QCwG:C\p p p |48|48|;sG)))hd$<@^]ann^uYXX C0/_䬆n~CGv]ul"Iromi,MTEcyoU_8(0p,c H!8L `} ٟŭWbh=']\HOrJ`a"$)/rp1t4p? II xkq$0`Q -S)HHЗv&tҁe1~/o]ǚ`#4ܤgsfohJa2#C4Z%2޾.Xe0"ҳ]*EY8k7*mY2kթZXc-pt<r4n-2L: nE3?mͭ`5l1鑗ؿ|4k8 .߂-cvaV`:kc: 3%@%<\5VXq(DlCLmCsXnsOcP ]t`;Wvf? >Sir;$m _0KaG\8#ѴY`i-)fA$JDK]SAc;uyG-$QುABN ja`y`wP*+DeEW$͓, A/ `)4d ? N.GAM0xS1K)aĄX~=6l؀ VaP c|`+aϫytqYK'eй}HZ]'SJ=q`P^ oDg24(?V o. mH0Ӱ gvh]'>,5u63)yyuzo?͚co}qX5g L ѦLGF?@N,u>ngnc=u/0>A^_kɕљbg2`&}3`з-|PYCPy<†$!cϒPTр%-+.r8*x?p, $۲(]12j9a֮] ;;;ح,b_eĦIЖa(؟ /qk`xC8~ eif+BF .޾DaXH ]\6&KABNXjZVAUG2CLp&RxgWX@hFwYUdTwZI'.'ϐFlВ9D>c6m}=8.?2xݤ,!3,n搪t1`?>1 |60H,L‰f^D"/7G2uU@FeU.uĮahn=B08]ף+(H?28g;~әbD'6φ,l  rJqf똢=p ZX߱J\كvVuƫ"F帾c*dcK`B\=cw'RߦcH+yɅ+ߕz$LJ?+Im DFK3bnbݽ*͌u8 /LtALػrf3h?$x 71[Khkbb[”gtL^LDw}y43SAGgu5 /R6{9uzYh1~M 2I vsEL݂ܾMTfv.77v6Lzۮ||ᅹ,1C=dI@ JHeC [ 3A.ǡ&Se! ~ҵ~dToSґR!%]SK|Q`P팠@}Raʪ fD`p7 4% j_Ndf>}^cPi*=+wS8~YGmw!>H{0 PYQz01&}7KYq6? ]HAJdY)X0~4 ֔u(m]Ǧ3x@4\s)ȫ֛`{8B|naX7s5!-2T(;`:*nѦGA¯ se]h;xmL2ʚ{-Te$fOAPMp;Fl-%.xݟHpĔ-'i` UF M(a^eE0SySJ_ڻ9Qx0<m@{WS/)mL~mZ}JGTVwk]p6(mޝ?WE~w T}nT󯪏ۭYx>wˊ[iĿwDekͿwOQ=.a;=VA۷B2;i +R^,C 78d0_o> {Br$ƄayIMub/ kqk}JKYNo [<0xL,})b Ar |:8|: y x p0O!S _8ph8\q@rb|UY9|h\ p0sW'"%s_$YL}yAPgפ/O: s<1Lb"8|y-p -(OC`"(.,^i?w<=!!!f%!80Ya`_{#'/RaAl'~~x B88>LAVjt χpׇCt\G'bROB4|{@3`p&D" = Eh_AE %A2?It0yj2Aae9Q͇6tau5 ?RҀ TTTR[C/FࢂL\?ZhBQNZZ?k/r3k(!0H žHj:Ձ4u0wV$Rf4eɵgS X77KAOS tiIG>{ "ei|nGFPSViKxxEY'@(3Ӏܺy.nO%& ˰rz qutHfz+ kIi[ q=~Vƨ񐴅g ܐWpׯ^}x^9Z[c?s勱yep0A{S6 E98tՔ{4w9V.cHa`Pagk!5c O\eX#n.Udj/ľ|M/G n 6X}?nru3!T&!emdt< 5YltOJb>,,*{oŋtlٹO ȃKXn`;,Y+V™NHLyrSCMz6S=q~4 CfXY/cˆppݪXk ."]c֮Yu`a^BkؾaM27 Kr}71yd`o^WTϟ[7`5Xm+mW_hei .)mۇ#5XeBdz5څ>]Uk7R$.SF 猆!{=C! +4QErs=&? v(6dX^9cْXh!/Z$*%p Kg㉧ ɉ$ceu"@"˳01W{*R;&"~wߝgƌ($*E11b9g1+ɠssķMTQAi֪9}w_P1}1WYWhqZiދ_Ɓ q:ǑB!'+BO! QbN9%:'OǝC+!ݥ `ʍ8|d?fMM>8wݔ`W6CEFv!H"x:zq chbΦH>ǖBBT2_AG.m~S4Q}BK0066>EauN/H.>Xry;߃N]{O$gv'-E(| '.S^_pX?E ]2•cV%|"089I+3h8ƭ>a* ՑNbeDìgG@*d\sqErsCHɡ^@O 3Cc8m}i9&"F;9N8: ߾e>2REڼ8?mn cy)ZDH%gMC̳L?N]+W`߾}Xf "RJt&r2=}Q)=rU4/C&tn^u5U9:&H_C? Lkj6x75g~١r|qB'-_!ɈsOAk263>n7CIJWBX0rfѽxpp:Gi+7 huϲLCo޼AII)ޑ*iwp6dDxl>;dB_vc$$$ ѥ1s5<^N߻`啪BerlSm0tEhBB4ӫ0RϑVZphATel8sߑ}1\HTA=)kwЩp e} HD١3H.oh֖zR )SZ2Uea^X#]1mb$;CΝѱ(Nmޱ(ùv ϠbJ~ ?OV[aN 6F?Ĥe[RVM`4H͇ *)AU!`|G`PH t21ڡg6 )as'+#4q`xВ YGHHH@\\[)f9JO⇙O<% 4ȁv%p֓𲲢0nO2 cW >O`0`PPǿn4 ٥Mck*@SP` r!srg|< 2jy:d& h.y=!ݡ3x*{b~ AJL W)d@||bb+J,"S?nc|@<)%>eHME7i.kGg1ؤT?} + wBB#6=b3BrSqh|c߽HHL@LD-e%{Tᕤopսe VUB]ХcgAvfR؃ &ն?ܦB`p$Ҧ\Bg/Bi0ґoK)lFJ"_Oh?\~>aDll S!FW#u//[@CR /<va^/ͅ8 b a'Hy[l1$U:lB$Ć/Q1q'Zf6X TG@,?-_!'x뇈:YŃ!fH@ g@rDol7&?Eov21`0xx"t(ftd|D3W@ϣ{? vp,?Lj} h"+hïzյߘSD^`ޤ즏3fcִq训Ӊs×z}p$iaUψ#a4v^EݭaM:Gb:XQ_t<[}tR# !Iz`+)<JBMϞys@Wzp)hL8^B]Ly+(CZY6~0m`8fR6 ?x:>][-UEF&x˫/,.23M ] E+aQnjL7RXi/4d?MJ0{-43x9 S$V0bVD[ l؝[Aw݇P,ˆz?F鎩scٲ7f8upU@& "b%ߠ;HY 2a3XZ= rlAw=kvApm6 l4//L tիV;z'z077r3swnA5DBp k-RPXCqGFL{vVҥKu>G?qPX/~9- \z568^ۋ [N9,Jypzz6az 0_u[`:W}(2(50`la~8s+/^E|*;w"*M9:ņ+/Lٹp{n= payYh1uGVc%Tw1Wg]˱_2]ʺWbŪ09%dV~ސ*NhGCaE[LȨ`s|h q1!2wu p?_j~/O%`*Dʗw 7Y/ad*Z80h*1],4JjH儏VfµQgQW 3Z 1eV?0Al.T90hzfZ((AS`PHSpszX@P̏,f"9N#dB ?}s,j8d2H~12Cl^tNZcϞׯ=8t,d ʍ|Up4x3k^TY(wW凚@`2HCjf3s1KW~`OG jܼ"+ƃざ7-s0qƍTH % w78x5T [Cs fp`p< 8&p<R6LэfU!p/0gWL؀Tl[6'[CiA#+tJDJJ $$Y`n`qJKKXRͬ#yTHICǎ".Qs,ޗz`ׄ9tO't=q!%BX_ 9q= J"*f!:fFȗeaLSt o~޿{WLIfciC$ A\\ _Rx-cQVC^Y K7/>`Ӵ>>6`8x<^&f] qydtn{Z pbaW5NvW1>:uj6UC*XK :teqE3 Ì5e:htEǎ  zyut=Te\X> r,([4~j2r&MDt=tg꺟AJ;B9TެAm <{fOoa΄Aj8B'fO /dabW}{VĒCX iهdR˶Ϙ cX_ Yt|nƋŞ3!l;d&ؐ 1|D<ǀZ0y 77N?i={1m& 4{- )!c6ȯǾDzfWI{Iè'LdV%:] acŀPWm )]q)ۜBoZ9T fq2 j%BBk ^ǴB kT`Pd2ftڋr2t$hw6:MG &*ݍ:|eUÖ>t*줲 qcEA?3Џ 5v7-x& '3%_~ݯ}1/1&QxiM& =U$l`6O8ݼ*$}tgA5#gx^}E[B>pd.2_ٓF@FZJ*9 -b:)|9kx+dl30V ;&CJZ_6z$I s9E$ls/)Q 3Qs\xR^zbVZG1p ~ Maqef5DE8 2ʰwD杲B0H#0pR^Q54stD!#|f̘iӦaEJ5%8 g`#u0$a)Q/a7jJUA!B^߇zWZYBffFED&@sߏ--  |&ڐiL=p$.\<}a13B+Mdb_]-NU&r߿U9Ia@U:c/ģ!/%f#޿S@\KfRY NmqVZE nD.)-a>]cBXvf0hPdSߑpDZb]ͮh#,Xт62+X;Xr"?`8x ;8!f]OR,%}іbM&-¥== RR<{H<)3ͳ:E c4JIC"o^TDx>+y tG̃[P;vu'PQ1nO.% 0p`H݌1 9Pe0dF򁻇2 Q|b~_il3qH-;Ql b{! V4e EvZ473A< f AhR8ٸFZ`KXOH' yOH{wciAn((ic杰g|8.2Wx9ЀF`D&3ǑVO3(' (5]#=u1ܟ`A,٧%kd<%!άSc`& G1ڼD\9 jr<{N .) wp%cО~Mf+ !VwU+PSz7tﮋ~C@Gڋ5 c> ׀&Vo]E1udSLMT4v"Tz`뱋HΡUv1jaaKKťpND e--ЦV9[}B [-ݫ ٱ .!|@WL_KE+v3@RI6!18gιjIm=cOOcWlNI#p*3x3\_3:IXGU*>(̈́{DGy?50eGO#"Z ;;o%e!FFj6O:zzelk VhgQ+ ؆4ʶ$ Lź=fˈsǘa>~&#zt'DdЭ{a;%h 3<̀J"`P"ÉUC *%mc0ɴ;;! ?AtԽI iUVV!׶ BDl<2Ңpp"tϐK)W 7 W, \ OO0!0`B6[0d4xʔV{~)(7;R9d\VȊbeqL8GLo1Ӧ?T\,C꫻GF"0WYAq6`( ϗI|U0k,IE|_] 1Y :i%)//wy~OT 䇯EYf! #=eS~>k8ݰ}>tG/槍?Nv6+5RǞJ jX|Ŗv3޾)R!^^б>Ꜭ13nk,E |_a!`߰Qȫ!?$uqӄɗ2ކC[W?XAVϼþD&΁ $ pZ%¸_?dPo }SHY,>btJ`0@n`40R0l%7-Dv !& ƨA ޅ/"<kW8<74ū&_jEIq!?@1.)ʃãcPRԴT$%5-LJ%d*BRV^kuQPC! XB~&H`(GintAa~ gC +]2d$?ȗwiPFUZ=4 RāA!|D5L<P!W7FCz~8q  '-ρ* b=1epHi#`  ArF&xV -C3mrS1 gVpF(za=,6zK)6 ȵ„90AzO E57#Ul?ILE!ϸ/t`2l2qe1~j%iAQ3 OB* p~To&L#vmf~6D3xF֢COY;q>*sNJs`P= Ud.ыWh̯}Yn9] rm?0(H!pȭ x fRGwK{y7tL K jY)&0k^+(&zj{sǏ‘#qnҔfUOYÇc3; ɉS|dd&dk+a!s廷{{Rn?DNn/ 4}x DǏbv+ּmس{']:Q2Ҿh&㇭D|n}G) vWJR݋fY<);MF% &biU*G <4 ^!2"oJ}v0ic c:m|h^MbnAص3w &M|t$c۶mpb͛(&GK'3e÷5;nξ6ѹ8 p`0p#K`PV9;r`Ѐ~lk  UvlT(k 0ZEhq4\0U\r9gxS𰻁 2=Vxvӡo IZYY5k3ѭ[7~9;[3(+{`XSDҹ'śH] "qy\ynYY)|\`pސWȑá9UcяRe ko@f8]Jh?+Izԃ >W;ܾ lg v7w6P?޿Al#ZOr_%d }v~Ap}~ Frh6 i4wDa*isP~VyKsѪ` }aW\l1wD 4M^bRXoJe9oT 21aḪYxfNA0g2 ^ݷUma ֱ9 g̓+%Ya N=l 6>u[Xs~.dtb=8d7mEPrzU?691:z;m8kaUDL?0`v#^u -=ӻC\~$"^HQ=o[ze.<>`}/ccc)xF1nY9~ 8Wsj:}Ѿ%7arj ],}+`:l4v8˗`QPRVÖY`R]>JrP `YKR<: tPa‚Ar7V YEl8p잏!AQ(@2&mc8h9]D%1w Dx?!*Y,aRq k8r˗LS -e L$~6$rMae0x Fot36C];_yUgϢM ;h팉V7/6' >[Nr :˪c71't *d0& r:͚B{|$g"=9&ݤo: Yewf'k33' M"{ƐǮ?Dvo#TWc6_Bhr$aBw ~yr\pr)$Ĥp2sQJx `2m>sk?SV"gӁ[?1qr>~"Bk|(#Ã} ˷%Q#jhG 8'~0_7'z #O$%^/QW3f@p9> XOC+߽E)?6Ve2N)aa%EaU yk&&2 ttusށ&gE7 W|NøО ~oC`0hFu"s`9~>:Myn`0@ JPR\T^2#}fjL!߭vׁ/c d0tڋ`~ -Ea4h0f=DdIHb d 3`s\ x*OD;a^y9~~}$vpG^HV] ,@8>}E1xMŵákDf7Ol4mڍ 1Atx(^f"s4d0`00(Hlx8 Q.[ ptDHbS}/PI4f!\dDbaҵ/v]?jw8D;Ad"+ Py?|y`P鬓&,CGPX1h7t*j;}6ΛᣆBAV)!$>G E=EpJVՆ.(ǗP}᢭ ono6M$M%ˎF* ;;vO c5?\3k:+0f6Y x $־IKe,64^:PT;AMKzp%\Cd &D1` w71vW)Iz_aڏJ4Sht :7is]xiM0`L)wp-}]~4j}~(4΍k8w,.\[gx`sWh0!"-~9F1mݸs pwǥu W+~b*/$Dͫp ";ӎK[ܼg*!' v&x%0 Zŷ˽ 0عٛ~`W?0# ŋq'^fV})b# ܼn7Une/w7㖍=^pQCk[s@u^Kp9!-Uuml9}|?·'3QKl0  Z֜~[.9)BJjݰzIvD]-FwjAdd$,R^xPr7}L'D]Wo+xmKOKeKfF *6ՕI:;\M9qƵ1xC|!E.5K9H0@cJͶ+?3mx(81{'x8h^wvws'B)REBϠZN9wh맂AC̙0GG'G`n0\cN?th&`N`84n 0!Ҭ_>RRՆnO(k[r.mp粚z h{~6 ޖ p t(36⁝Y2:iLG|\_`?駆EX`,vqܹ j]'ߒO A`cU033q+0Oݶw@NahE}زc72-XNF"3s-7Ӏ(ARQ;rZp!\>k,`N}ٸe>N⒟gc3YZWcr(3f켼't rS0 zЬrH9o qCiB. 7 HKL›540 V)guiIp`A}U] 2CqrT{0̚= F:PcQΥxi{ XsYͤϴK2H!-a8nx9-[X  $:ŖŇb|/`ؼk/o\E7N ; 7n:t{ys1jTjhu%Sչ x- Ɂ섞3 ]ltރ^2Йsb300EJq~xnsO\ عU9m V/0(ٽU p AB| m//ç"FPD`pݕıI+sfO(hK.C>c]HQl(\s@!Gxki1X1Z}G3dd '3,ƑWNx!>SCf,/?'#"׏ZOԗQ+Ofpi/~6 R0;51W1VU :5SWA7p/i_W4bA*.2_~YA^쒋dYdTE +hTG?-ya}%~f(H,+Sd6\b{߽A bxS G!U=/BFⰺSo0t}IAޖcԺyA0yiA}7$Z9G RDy# %s`P59\yc^` ȏű]sѥ.?p@Q Rj=`+{k Ԗ"0BX}ϣs@Z A5c #1T f-DhaeEHNq!4A:lo{e{9ܳEŀsT 1955s΢"HN"J9&0d>7 mM{>n ßk7/jۢZ`X3U6 J ҂1[3/D 탩w!BC#"=С@8ecXt*BSY~~~g *$,1"XR~c>4f#`F{5D$' ͹#3 0!0j%R\P𷘡7vr-U&0_+,:WqFRRc %1\s0PRޞp,Ԟ޵mizeንǢSAXzVYWqH zl:SD5ac8ީ廒m/ow=KC&J[G1l@W`%!᚜VmˀTK.,jT+"bV 1~Hy[O _MEMD.nF^|Qg'p0(W^\-  o mNv& Lx7+5w; )0Saρ?$G$9݅7Pڈ?G/IB*U]}qa"]xֿopjs~4.@[M_8~h6oQڲ2i"@)-L 6۳F`PՇ]A`@ U׏>A8Nԭ_:?C`M3ՉePk}ei`Pj=Tl/n Bp6Q-=dtţfeq0zJDp0`l AbBp hvFZtFQD‹n:(`P%=\'2q0` ů 5D_/X=U0naLz[&c%`m2ɧ GnaJOo_w?˯U&ه%e#8S"́DB$k4@JB$Q8('˕*E_@w4xS3{V_-,=wS|*9Uk52aVXC.{ҧϥ`J_Y8!0AL % W"sIBtI.\j`Ů p1ܺvN#0~1QȕŨ<8ホ IDAT/a! 2e*ur%d'2W}$ ʨ,{ՔډA @B^aÆbyXfUJV-ǔ) u?lmnJwz6`cd`^x~hdXwOt5]ZQ`p0WpOIq:vӎG#3-ZY2-QU"s ,LWq0PR)@r0xdz)3I `8}}Nw0.=5N- J 9 ޼-u08uNjށ\%T3Վr%ǕڅA .:E28u`:;!A_[uŹjʺAMe` @fFFKU`mHO/u28FgwDش&= \9Q_pY+PRS _ TN\ j&_DB(Iؗ_Rt%)./tʚ;AQaMIk!|"Vi Nm.Rz2W5 rqtm]ڷEns,Qi1%jzoŷ{n)ƭ?dqھΣAF5F?_4Jv/h}5MZaAv&-t `~OKۖ8bZfצ\tu{ Κ?4[wNwI-bW+AE ~ks9sFHw܁5L,6[3z- ` 9BZtŮj{[uVVV8<Ξ= '*>UQ6tfˬefxFn޸ׯ;w񂘙G E!cag) {ȣ,re$D#ܺy7_ǝWnet֏=޾[n5M']N~5 d89BYiھv\IE2DƃO//N ]g/JOp|B7wMK`P@̜1NG1|S tf7 - ~>pC]k$oAԱp>d. >Zfou:dZ& ezΚAz?6#$.~ mG5Q?$;4ᾍ e_ޤ9FƢ7Y &~Al%͞[buv o{W"_~gX<}G,FqN"@wG5w;J ǝpMFt vl 651hۼ9 @NAi#Eh;9j-hFhy")ϬDiBo6-X8۲t2C=h/=AG< hD/C ~:>XΚAj99H*oƘus鏃tGtj_E(s}j 2c`opDG G5=F/O rũu'%tF7Mhច#IJ<-}s3ݤex"Hr~ht 3Õ[w%fNENĠhԸPa^kѡU39Ji o[OޮN'{sD4/€)aF,нhx+/Eط`a͐~ { `F-jFCh5zhtB`26;gDԧuA(FѲ6N<3w8a9fN3Coߨ)0 BR&ORwh : Wk > $GcӪ2y"Ǝ }Xr=W,\޳󖮀OjF,; L{YcټYB9'Nƽ0qi,L$ܻp'a8}^GmOYiqwO"7ivQYUW^S0() i<0_=7WDɟ0q`BRSĄ{RR=Ta(leA +?.-`@ˁ+"\ p.\p2e7yeB\"2ens.$|̀> p2Eenq2ed@. y]\ pWefݼvdtJ EjJ tU W:0/*"Ak@s%bq2D_`^k-m;ubw‚0:'Þֹ^E``fqN䙢)Ϝ֦ Ԩ=uG|YR`,t8i:hӦ-RRSCvПxk|r0 *pUҭ do}:bLȕ|a~:'*(]\gr[`¦p{0~a&8k3n[: "v ptp˨:2gmc!ܸkЙ@eZR=0^n/tOᑱ1n_]7aNSx`@J ̔PKl 2_uR,˄]sgҕ{\ +/ŏɕIǕKajiK\ܽ[b8zΞ9 D;wmÅYy?Jn˯-TGSxS.蒬$8X phVO+fdgfSb~.:i Usg(E0/Dm%Cؽ\`@!RX;=acx慨08? üM/ jccxJ= ޾4]CRJ f`b\)#}t؉@k qdOܬSo~`6+'+oy&n;R-_)%bJu ? YR[3˩;= Cȟ Pkkv4k76AѫWo ={tG6ȒN<:k7Y9D 0b6)dRz520x܊AG_DG"4ߍ[`( wsL!NvOУm hO] 1)`8sarzhb׵GJN,;+59 䜃 IDAT/y \ػ h_swdy^AsRtSO& "Ombz{}:;e`;nw##m+zufEcݽ6p &K(~![6rd MH|iȠMm) q`Gg>ۇЫؿ8Cqe\Ⳅg9sm20}lDtPјhaKWwce ̊\l6&`l[i;pdTroyj7P["3-)q.kf 17Q?9j )j0l! /+.F11v&D H᝗BD$I!@}!yDIlӕ~+W1kk,9z^tVLalY`$Xٴ{i7F+I[ 3 c fs=p͚iS'sv5ݥ6s&;t^#'O`hI+@lL;# [VRdVG 5;ºU3n lލtX<ƻY`=)6GZ&'Txƞ X ؿ.̈́ 1A0Xo"BH9lzzbzLwBg`4[ 0t+SkЫh/=P=.HA ]1|D߲7}2B~2`Pi\}<+IaQ 3-?.1¶+GDco46m/[M+vhj 6yc9ؼ irar| VS3WO|R -6n[M,%%qa>݆k~{|JYќEQ8Ot^!QC\;Au4;,%٩qx~V,]3cXj^{SX.DJz]X =N>91s?yq4/+QvΟ'Ŭٳf&5+q1RɚeDr0('ՕqaBwv;֒"2Rif,*KlZ@MEOQn1`g1wW}l n +&+"W4 (,W(SG(oYLQ4 ;Cp2:)H("}uUN-U+H[@#:Y=@~(&r҂w{xg(SX oG LQ7 8(qIRPdZͩv}tŶwLؚQwlZ ,^<gz ~yY GIUA-kD5QTqa07ywJ 5{llAhk_6;YMD_U/ɟ! j ElK,:BL¬[zy%Dp ۼ #m"0SS>"BLFi*Wm`gZrx fyL!¡uuI2ZN.,YIt>ɦ[޼;(&2Bop[{3 +" Tԙ \my]:AN߿f\-q' Su~HK[g<{|7wFKm^kgRX+`;ګxC_ 3232N15%A.RS>єI7І-jAgVDYWns΢RnU-? p:ۙ3|fep0B.\8pf&%o7n\ pˀ.2೛5@d[|Fg\ pElۍ%23>+2e anx2P3Y!.\eg5Evea p2->iXޟ? L> 1Ɓ<62e_@ ..\ W ffo7n\ W2Lp2e#9D pP pˀ.2Pr ,23P,F`mn +u&XёU꣘!?{.QWe>ߙ\Ahp/S;+s#+9p0pYNUhʄkGxAvf Tϓ!1> l?m(ޫkTUgאJDh8X $(2TebeS٬eッLX3tC7޿+b,Ե?}d(b"`@ue4Tʞ1br^(hܥ+{$ yKTחTLud(8p0H(/YK`-.,ї '[}h:G6n|US񛓕[KȟʲHA̗IQR de3(r 8|$!~gf+;k9YxD43QWV/_@*ʩ<(kʗ2^gY?*sx!<$ve GGBeBCbT9>QƆWe>ߙ`a\)y{~d`uU 8|$!~g>S w[T!DžM=|áCpU8z!G$8O݊ 5)ˀ=gW3. .#-+Qx30-VVܪ%LBܿpIܹo*ש4{ZSUOρ-V,+?Ww\>wx>q4^X9"#smF&/ȑcy#@+Wf 0($ \ZbҙұzamhjjbX98#/?O.G =JUQ{✬ς#/ϯz3r1DɇyxtjvC5aHK\OUJ YCѤM'LFFs1niiF7ZȻӼy$eT\\1#&LWzU}(ݓ7:wz;f4wf!X4323hc0isZ.B~N.قc8y 2P2L2Gb\}lW Eqmp,3kGz4i=Ǧ k+7 g 4ppLh .]cO O;ݯ3v3AFnۣ|IS"pm$; OݣM~pq~g7AYS`*XD}yH022\\.fAUzb_9>Я:}K{ S`&;y lb/h15S@~%jD;÷b$+v3ł11nY'sId;uޛ/U W(jwqԻ%$)FE$[U"Y`Ue֍aH&K!m% IƋ}Ӡ3u$d,Mag!X?Rۓ%|qkwr%p9;MOV$(L`8(Kb-K2uRy1 $ɶd4C! &:|q~4|~TӸISt>k#2ST`Q2PT҆]Lʲjx|׺+|@fʓDp5,S6&G֡7 /O)z{>Gh] 7'ϯp.͞0`P?|;b/ha$Pa)hq]+͂ Xu"HIڏPkg]x'<sw)em/nn/R.|Qh٬%fR0wi@Jn6 Ss7F8 wN@WZd"w0:ʗ,`EehgBZ6jq3 I;m9</xxz9 'ީdAr%E{[@oO%_//x݀Xp"8rìPb;'gNؽf ̂w0LQ3+@ꈮ4h<2+ȁZ7[<ˇ}zQ8v93i͉ڹbbu*k >B+6 3-i㹀|{f8P]=3?XL5Z7,fl8 :0j^{#Cddfچw\HRBP0kcOwY3mwߚmTb(@(SQ}4Z3%e(d2_5GڅeEdNda2~J8pT(S.gqy٢襡G!$xh#A3XH2ȅǮh&̌ :2UHٴ蜛 [kN߳Lw0OW =FE6aJ~F4!e}%b3.ح&M5x='O(r6q"d#|'_,Im R9o?T,_I4mF!`4ęp!tjO6v8v\d TmUJ!mìbQ ]q pzt0-^#3;iBO-\"B: ګADREh)i,xf l:_ Y$ƣt8GBLfКOHh]4x#4_v,\NdYy`q^?~d9€Е,EV>l.2oyZꌝg!ti:|?%npH()L{bad%bѦm,ݺ<Lqa,^ɽ!%e`qn-6d8!޺ 'Z=wMG__EnݱrID%$">7DHL%@w[!}R00SWHhTsExq})$2>a $ C)4i #Bכֿ-Ǯ\[M"X{٨2cx Nn])ޖ71~Hmh'R}slCXK`r+y*_,_v|0ήM)i w7xOъ\`!-|py}a*1~r߹Q?7%WR(8]('±3й@>{v 뗸})Am|h4zW CtL,),X?[u̬l7tnwanTfݧ2 0b` ɔ?:jW%iMI;ŅvBQvBέGˉYa^vX3{ -h)"):ϗ/YQXlQWbCK{kӇqMg7=w=cѬttAb"">?~a0cfM3gZSt0Tn5& րRF/;#N&4SI!icxKP{).c`V8a^8XzS1i pDp\ 鴿)0sd_LY0a)>I?N1F&)UTkSˎ e狓aڴll=[6 _,oJTѦo j6zK ڀ5{N]gp@3/Έk7.Z/%.NUOp0aJSIS`~} lF᪙3$gUbęiwwYRza";2rr7YYe VB^/v hNO^jA}L&R?-9$o_ 㵫RĎET~^pptBDTY>[UfSgd+1:$'XLWl[WMH*-%:Kh3'7gY n">cF 0`b eͦ?}+Ub,/³ =g gk=+~O@|r ; XH%qV49MQ݊ߣh\m߇Hޓ77ug.#mRΗ7n ָzf?S+T/vW +-O*h_h?QQ_9e\ϊt~Y~>~ȣP&Y&7|T)Sry-P< Q|5%K8Gͤl7Z[]O7dԑHI.V<3ހ p>ſBTZ'}~& ԠMQs(:J|l@qtK~a}i=<ҡu~>{.-\(|MJ/p8)&󥬎,6*o^kfyT0x'+m+U𑑚L7U~ >BQHb ͎NԤxa*`>֎x}ŞY>_4Fy OiG@@]TId3#YLi3SU9+fu*RTn ah.qy;r֘?$2Hg IY>=k M)ޫ+<(W,$4R\U֏t(L!A~lAY5be2U >BPۉ΄q);@θBz*T~󠬝*_x-}ܑ682?=*2%t}+ר+`aɞNLJS  >)!~gK' eFE1Hwk%EOV?ۜ% P W惕xPVgCK왂Oŧ\hͅml (t>]eSTf(`/ ?;k\ pn">śo+. Weg|VeZ+.kIENDB`fotocx/images/add-noise.png0000664000175000017500000005122515247006660014653 0ustar micomicoPNG  IHDR n]1tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 122 295 1 0 Q{:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:295 height:122|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:266 height:110|[bc IDATxtٲzz{Ͻ 0x < q!0W: `Cgӽ{U߮xzz&UVVRd 逤TTT/CQ^^.)H:P͛Aɋt@ҁt (Ι!\!''B\WpO-Kog>2o7%$+6g#MOOGjj*$%%!%%iiizFrrb| 1>!&3,Ps%}S~_X233ÈGC ]NnC=6\u!y1505/g\C~@ 8?0# 8yvLGp~켆:*eٱs{bۍN2`޶o晽siO>gY5-Pgt366=ԜW{`a .{2rl6f]s#!+mix_a)ꁅk#*-&* y}[mfm !@'i ^LMеkWYr;E=K|&-0|r$բ%樂WÝs`m-ŴRy8`@s:ӀזMj hFp絟}g F47=344G$$N~m@ipm >:Pm CCChiǸHʩ,lqQ."Dsu׼^PXc㘬^&b> m&@dKDbBO-nZ04-M .UB|)MYO14 ,pkTyy|;L CAq$?&; nmQ`cEE% 8 5]nCl8odd# :KXX+``w\\oBDDD{QQQ@LLL3M]}t( URaݣ;LML`l5 ^3R $_<;]O^Ffa @^`7h3C)8UJE}йsgNYs5^==LSSP,ʋBDDt<(+3AAKA!Hy@r2M" 4ژAӰGJTD"(_h? QHz1OKIςBz\+=Du>#aFz^A(*-AF#lbMb2LGc(ʳ#:R$%Y|㋈je㢉w?SPH82_-*7Ǜ766>97!x޷o_(jkk(۷_yMAJ&#-Z$!ñi&kvrrz O/a sb j]0o^qz{fCW l f䜌x\8MuI bA0j(-VZ̍p25itu˱郥UoтK謦q`͐rLI *ԩ3:vRNk|Zu.%'3NaܠPuu- = :/ ޏaa0@GrU5}(x Y9yz/zA]e(k}X{7*謮q7"CŜVfAݥ z_D>Ι=" >d8tZAS3:acp~4 4l_8EHavmۢٷѢu;LY[HN0P|xkut ꤪk[|)r@& LѨ:6 40Pܹsܽ{w@& X5k@KK ֭ra` |&ٺ<  9juaז Rx@JH~aA\ouMtT.1glL;zZPb8_cmetC0wLL9J4Q0P((à;(Mk2ں; ȊĶh 0c`a+ w!0O.*=t4/!,vE[W8JJq ʯ׵&M3@MQ8 /*F@Q-tG' 4Ʊ[.-HJd1m.PSSQ@K3ZQ²בJbW n>V7ÒCC H6<|o#u9&hݦN_$fa^o 4i=O?%7/ZCUEhX`Șu"&)ONFV1xHhN;Bg'dž3r]hk_rouˆ]Ґ!C0k,=k׮  `[ YQ MU _{IHz]45ah5F[Ң$X3ʊ3=W] `E:.ö@" ;/BH8\ځ>i `Y<9ذ(߅7E+shaԒH--GYQB;R)ˌE##V "/QOc}tR6S7SB'u9E@vT] ZF+C\ !LCԂ4l taK iv*p3"hp.nE?5(oܱer/w!Vw~P.V21xph)t3j3goʼnDm[zEc`38g=CkSC픻̣*qr%ڵ7+Gσ LL><< @nV$.\J0 |ca~cY2*GN-3OЕp N@^|>(%pͨ E%S >p(JJQ /@~L %ry@Ѧm,Olчg)Е'E~= M}LzI,w׈Ax( 8N늡b},Iٵ1ԃQ`%֮_c!u0dFD-!x 7Qp"~1yd!ot˖-u G!ZŸYߑ„~V`^cֳLxbT <9*PŻ`>Pz6o" ꍀBYg}1`XfN1(%(/̓Y d*Y[ܔr,95bݹH-.EYؐ+QM NP.% wρc6~3% .+@C&A@r^DɲYp~gR8D y٩p=N't4 BQU @a KomE)CFtӧ$,o c7EUh9rKz WP@"/aЮP쨊%?Pp{H 6`D_ hӞ}JfƃhqtӅBNB^&",eұakk[gakvOQpRWW+W,<(nڳg^Q#% g6m@EEEP.]@Ǵ@^2\i!cxSʫ@ Ӈ@GMW;u= =Zn6;Cz&oB8y6i8}*:gf/.NU'PSRwPƑ0TA 8LQ(#pBL 1;%wGJ?e <(lCѣ`p5| Llnp`2Xz@MBq~*_ssKtQu}^J%YoΆ=p+R0s4юA5К>ݾ&VQG{A-7jwNZrkeB|1J _5,,SX4вeK[.*vWvCKLG˞ܮy0mRIʟvt:|Kˀ_aBqڴ}MK¦%؎Qf&^b'U Q";5kGL[gNо# }07G-Fǖ_'CIK=ȣZp5Ei?BAi ڱmWnv#j 2/{`M6ဩxN} z^AA(R³-%.m?4ʤ`Q{/, Eo6,Ue]E1E%ˈsJKmPSF#Ц"Zݰ8})2PlS߼CA7z={c)xשM UOOXQLۻw?XSagRXaټѽ3j:> $fddXH3X||'!`MqsޔE7 t)S-*,i󖶮f,ZMCfJ4ىqڒx"ZcKտKH=d-zaA#0{f6p?',>n^}0e/Kr)+6Z4  ~¢[OJZOdBurr/,afN n1j,8Wד7 ah`l{s6XmB];h(X%1E?Pp*IW`91W߲a]Ե<&^&@tr^&}3%n%@?9gF:9 6. D;xbCPMlէ[a`3&_B!\FFF)θ| Ҙ){ܾ7/}5Iסfa`Eu' ($ Ѱ(c`k>'0ClȳطؾP|1@!*t|PH@!@: $*4 &3 ($BҁFu@ IIUQ='uH2t@yRFk Ç"@Ijcc?~~^ H2t@ҁt@ (BҁFu@ IIUfޗH@!4PHJҨH^×544PH@!4$ 4ҽ/ېB ($hT$J¯,KjrR %y5= `:E-|zşUxↇwoU+5>y\?fݼ{*c[vns+/+-t"=5snx{<>٣;@qi ?A! (]k KŘG`PH@Q|y Cӻ(\Ϭrv褪ՀRY}[BME\^}~^Y+F@!y',:+ˋ`wa/ u5Oյj:vyρ8 E?,IEW+=47?C(;~_t]<@LlQsI~`,if79hi(OxXS?a~b]~AϿ7Q\͛x5}3/~~s\6hkqpy-`a_5.嵄,ЛW=˯c+6nöm1mXtO X05FOm{в)4۠y&hF]cS+Kx S"Ӆq@,?_v-_]G!-H,3Z[B;tAߥ-UF@QڵƤE3aj'Ƣ (vV-಻'*yAV8'=a/,6Œ0K,+Br<}KxERFN3xC#Q^SQ1}i U?{N{ʩ<ʯd$DP>(|+J%O^U\"QYVLb^IEڭ uPx^݋{aXf55];j8t|i@QSg.Vl j˵jLDݣ1 ByH `}5ex{&fƶiI6%Jd'`hSBIjQyIw1 ު):ZMAZnQ k,;VOA> o_Œim`9i3JFwϛB+ êV>bBRص%P<'LIJ# ZqaM UZ`"s[9q76 VOCW谮6TTձ=a*Jv G􃪺: ᝠo9w{(/ha rd@Qs +prH4!NR. pVX>ۣgX/ ^v1~zTWYo\xV'=5/zɪs?cy/R"EM(+DL7֘2(?G7ND{U=bʪIyEvo6A4Q#'Ƕk/`? ]RӭT3j 2 ^0{5Tɘ N*3SuDk9;<{+ kLG.2 (Zl+(^`hަo;gܾz#CE~tR]J~}ӇVCE^BHd1đG@QpLzǓxL3KG1t#4S6brVAMs;ɓt&âi/ *piX4kE\NCdx}1i1*c[T IDATH@FBM -+OՓ5*}$ $:@7_K ,blPԚ+퇹zA9f!O0*L5;aMv^fA7 ՠb>YɡX6u4X`p{ 5Gg.yMhB"珗OV͵'o20s،ܱ’^(/ ^9I"ѥ0-Q@1NUny?awl=v QY(.ğ!%=8J36xtOfprފ *5:n (١};((vFaq %ןag*"s+*So0#7V硭;O"%=y[h{M?-+rRn q6#(6Ҕ< Q|,hi`ѮSȖ'{V#z'"?%[p 'x+[DRy]ys9OP^=FsBzr\i+c[(gu[կ[bӂ^-rxi;t{`u'=]U(wBof*TTvl1JO"n&@(9j%՛La)  Sc݈o?uhFnU5{6O.+&-; f9R#Fgo\2,MC@tbPL!x^_ncÞCa9/C^hִ Ĭ9s9kL}zd}4Qǯر|ƌQ{UxsK@rh֬^&3~.s[a" B%]xd7<ضI5v +,R\8?_ nW1|A/nӷ "=0bM83w5@ %5"2[hsC@ PIe|T\ؘ/3о"-H ܿ m:cµ8s,N:'Oĉ8y}5Ll^Ҍl]0,q/ HvŬ=m ~zDHd Fe\Dk3g@ϩSd0McGp4(7)pٵ zu1#B΄7o;к2]Y#/3x*L iaʦnn6i (/%p܇m0rW)xDGa2Sޚ(*prT_ >29"q1: c7iy<0eyp)3߿ o($$R]]{# iJJkGI%J<4BQ?]WNCkQyk`SH-*AYi JJYoe* F[A@y퉇tU(L cas${| Q$yQgaY"UzJ);.*r}ƁB^Bq=|G}V_FT__Go>g/fs<{z0{HcL*Hl[>nZzf9w`ik"vPx3)?J^)ﰻy )1#2y+hiu7^^|goQ>MGWHжeK|ݼ{b ,!B7.ZZoDm&UTRCZsck;73.ۈv-d QΠ03Y#FLnPqV|^(),+ƨ݅Tm۱eJ`͚vr&f Y; ZzePh[Yt,bbcN 'O}(;{N=3Kشf1,{9!zjF}@V +>*B8G1. 7áCؾcP>8<m(G4x k!"XwD٘p}0LZAz }^l +{LB6a;v*N]/c%ջG9I âFF(z9AgGmZ(8 F@TvExUG:z@[UpM?(m PW`q;8:h۶-:(v€,jIV LiLءwOaLv^g"\.zZB P\r80ɣ0 A'%ZB]m*@] 6BdR6̼m-jZp rCi Y6mкU+jR(JjCy 0; gn.%0(ae5- r{FDzj?(О&05D`_ -kmE|+f W@kqLZᨽrq&И 8ZJ Lmv2 ǩ('܂F44؎ƶX<;M ?3{X2sf hb`Ɯ5˓mR8-Z(~ܽ}o1z~)kW|Em%o|iLF_6)IWЮ>GSC6|i@ј;P}^PxzPH@V'JlprVx}]w~}+c;I@!Eλ4 WsEYhmuwxgߦ?񙧏\W/qx̏ ϲ~L2ٙX\^K|I2[&PH@Q=,06OM.PH@!4$& ($BҁFu@ IIUi3&s ($BҁFu@ IIUOmvPH@!@: $*4SUO* $tZr_~ڣxNﴔ$I$u@ޫ ҹjJ: 逼H@!(4$3tezPH@!$u%w>>}m7&:u㡡n&EPYȢ ++!~+UyY/56 >}4QMֆmI]U"/nCw[Xיf^O*p`!' KWRTXP껸נAi 6xz}cEl/DuO](OYX =NiIq^C<|{,fz t`^n6B]ܾ~]+pE7铆\>O&/=uuC}.Ag m}XvM&ڴ0_.|FGKk6˱xq|5h>{~ޞLO.k &TCx-zV-qJ`tiߺ~ pjRpu ,.Yr_,ۯ~$˯D[ˀX Ryb`E~s*OLӗ-3a|'z|*LAx2 ג㩎CY7,h b"/(X YX1|ؿ _晌}i>3d(AYg_Vf$9;\I_^4.ς͗I0Kr=KRΪ*@Iw<:~Smcz,/ȡ7gҒ^TxY]آx1~JMDc##sSbzW'{y8~LRzc,cRe@qKXFqj>c\|pZ=uA'?ů/~Fn=f6u'E+*ya:7:tƚ#ȬݍC(!W7Pꀡy;5gAFDX('x6 n0Ϳm[I9:@{IУ 0ذy L(h8sv ; zI>/-Be]l:k/8\7%L444`baMO!bl~.;9߯_3c#N3هB_FFB0vmX .Ф6 `Ȥ6#vbw|+VT6M #-Nvd+@Ayx]_exz$&؏}KCER!)A 'cQ0Ӆ  z.71v5f,c@OGZ:1y.ȍ;Aocu(i6t1 rtci%#'?˜2Pd G` }d:**)$)%9V͚vBd(g,i4aម57Z=[ 3Q^QsmBBQKphLi+Y0 B>@h'!c&1sFG yNm.q{t3Zb돧E]5e% C{&o̪^L! ZTQt$# вyk<$gL)qRb,FM޴sB6<.2Y'f[VZ f7]07lm1񻕸p f ]UU=uYUDKZxD7 =N!g8Iɴ% ۹M?"OmZ--.>1>/Gd* `kֈ.gE)1_rυOi6Xt\16>bM`֠e;el8yG3<^Q!( Bʫ^Qq9`h=u"GEŗ; XrC1vsLYEǂ4 38&(4CmI;fWɉXLOR|lUhWoiJbDGEROhWv Lɧ#N=Ƅ%`9 <P6hzA/*30gX7U1WmW / H@qPQڲb= ѨX@fn:0{bfm:a1 ZAk?ǒAb͢hG] >y 7{qY'/\; ƺ=| קKI߿ |Іcj7Cu#H-{ PFHkzj2δePyUJ(,]C M<|i4R>><+8#ԋ~QJ&YnhC.QLB\/cH WZUq7ѦeL"@-!o&QpYT]лUq! z||zû7䋷JUEi|\@&)ɼy UdL-pMm 9zƍz޸qȡG@'lg.ŰhN!Iɯ!%;! '  hA9 2;vZSýk~b@Sw%3[إS% P>?#'ttY߂=QOɝۑ+ޅ@QJͥ0sfxG WDN_EX98RM2t(ʀ?k{Q ܹ|OAam #K@J#Y X싡ÆV3D(Jfwr)@?]c?6Pbc=ˆRte\t ~X@ɬ>qHӃ iCH(c Kw7q=PhcɉH+" 1~zK Z"hͳkQpyula>bo`yA.7 sv<\l\<,y³U@{ J)Fq6zǐJ d$ 9"&39E(D3m MC7^6ہ1jhؘCI  u0 Rf"%chkuƈ5(ꕕ n ?%(+@A-)́? $IDATQ[bebc5"-|V 1"eO&cp3[㌓D3${QgV%&.߁p$"(QN+\C{#vVd:mG+X,Wޭ? њGBIF9 BNl|_t(!fO47 v΅).wBqqNv(UEtU'pQ`QU%Z6SFDH2ʤ\6,Ls:Zh{i3PyW^/(xٸ(ܾAba"&FA9-hɈvQF^C&ƩKIKJq)\~ iѸ'xn߻<K9r&2yfzQְ6\^xOElN16HNgC)<P8>Y >BsQLEAvN횃JX4w1DORRS}{+Z)(a)' @azݰl, Tq3j[ =4йK/;p w4P3솻>TZ3QlJ@(Șfg0ZQ9yi}#ɟ{(@.U`a^q6n]VLS=90B{|b"i>|?+bZ]pkH%3 O ( (Db}@!3@,>-)Tv3NWܾ+-k'F ģgaJOpt7 8ǎ C x,i14Yp촇G6N$xC{8~:s wѤ֠cGU۰Ó~N=Bzܢ|-@W{LmຳnpwCqkWssu5ů/BhF2bЦ/{mg!dJk (h$C,Tխ/ 엟cUXl;֌10k2 5tTþ#f&V`KfbqB=]-eU!7TBpY!$Q%xpa#ړq޴y2%7 B[LKnf oĸJ{C4yPhVᩏBv5ؚzJ$Wt!)ij9BQP+V>ƅzǝ+N N4hAC=YDσ֙6a(Z8]ٛw)ᝏ} Q5nEVvV S ϰm,hBzXCIČ,f0ր.-[=Õ[,g7Mp+/y`pB(xKv- z< ivNQxQT0z+'F~~6Ä$#ݷ=Bʋ풒 :< mp;)B$p\N>'<((8zţqIALV*>v2j#㷈FB֌Ǔ ՙxrS)eK;mYβz^~>^z2!8* ,c⹲( ,Э'}B"E|.7'SXˣdf6Exq{E9v<,G#2fJlĺiq[@d .ST@/g q CMHyTxӯJ]H?g맞$'\X1 X{ FQNHk92CK"dT"ℰyǛ< &g'xxy!J)!*.Ύ IG cGA@ąTɌY.#nU׸l棬_U_.{v9Qj"M QEk-q2Bv@HT-|.Ϗmk]顃[w#Vf9M3%GhPURWAF)+Mwvg?Ai˟_6_?NAY˒yj֫{leϋc'U=h)T`1 (ʫ8 mLUuy3 /ZNVQzmIֶ<} gC.V =o k4N%MK c|67\Ư\GIʌz}@ wEG-&MB[\ud2mM _';s3㝡%|偂}^O GߦOXB> ܌U@TكjĂ\JA^6Η߷ڠDc8wٽ ?%92_Dp .%_gKϱ\۪3_}={f}kN{:ٓW "/ʖ *+#]x+؞/G}i"-'{ʞ'鴯Fx⁂E)XHba/v~F.7t1Ȣ1|y,>%D6;|5&ڞ\E}aP'CS967^[m`C^,2Vڿ}s4Q~:ɷ1xbz?_Ʌǰe$ʬ.c{b=9y9_"Wבia}}|K@QU %_De!ι_\yZ7y-m]m6Vt7֮uEcByML$x|^Ã`IENDB`fotocx/images/set-colors2.jpg0000664000175000017500000002724715247006660015167 0ustar micomicoJFIFExifMM*JR(iZ0232*0100fotocx-24.30: Crop: width:405 height:158| http://ns.adobe.com/xap/1.0/ 0 600 1000 0 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?kW_/j(o\yGڮ?缿٨h q=jf&U4}{}W_/j(o\yGڮ?缿٨h q=jf&U4}{}W_/j(o\yGڮ?缿٨h q=jf&U4}{}>\iH:͘ _SR< t혆TXO_)' Ymo%Wjf\yP@}{}>q=CEM/hU5 7ڮ?缿٣W_4Pjf\yP@}{}>q=CEM/hU5 7ڮ?缿٣W_4Pjf\yP@}{}>q=CEM/hU5 7ڮ?缿٣W_4PտK #>ōĜcgoqۊ(Z\RS]WDiœq)|xaBlgK8WL0tByK{Ԣ+ ͐ޏ►#'}_~`St)¿/i"J-J)ºa"K!UJ+9 {Y~¿?*)º# )gGz|UtS5H?/jCUN˟Y>f=Swy;u3%}1k,ҿ5uc%+__E~K4 E'ܷ֧ KUlfi@>c)Mf|dXt95ӠU,옼e҅?5%XAT8pSO]v ҟ(˿i}΂7ONoʽ.:IG]&R͒'OoʽY>f1TQ_yG~Toʽ:Dc,/*#R~U)ҬGTMe. K~'mSR7c* kY\~&2Hw=oS27kVt^.ԏ&2ℿO1H>$L`i%}k,ҿ5q_qbk,ҿ5W.&jri<2Y9FgTQEsQEҔ5E x5Ұ[ٻX歈n9҅9*qF*. s)kv!>؁0#5ljNXv9lCJC^Q@?@Pa}'S6އK3W'9ONWȯzdD }1XTSv_[>'nOpU0AL3k<qڽL?hSPTg+,$Jf8YU9g$*ՔHGYHf9# K1ʳW}i Na)ڏSVc|Ʋy>%9'R$iڬHjvkߕd<[',D:4vKjY/17NYՉ^:f;X&> NY։Y*uf==*?:)XJrxUe4'™:MoC+QGzz&slVw$J_"z2BP+6}MN[w_UQ^EP?LkjGĢP3X%vr[mqZZ7d=+yf%5jEAUkGGrkĿx%Z*G04q?$~Mt}#D_u}=+0?yjǚ0f?ً=ZZ6kHȢ|Qjz{t!?/X3QG˥kO,CQ??C3O ù|_ 텿;Wm/%,_ҙZpjlqנnhZqerip.F=CF9b˧Vc/ЫMw9gN}՘ǵQ*w0}%hB:ҨGuob;lq+E89g4c#ҭGY?U8JSsxZ?ҏ5n1YqdYQ7V{q^e1eǩXob=NǏ_j;_qYQֿƬǪkWkEZY.kVRWӳ! OVXx_U9gs6X:_15b=kK'֊?9'͘uޕSRj"q)KgQkO!X+Q.]{M=J{UgBI.0Pi_DO^Ve8qw>*qmպQEjQK@o_湽2E^CoOISW"-C 9+"OƔuBO'+E#O:VtV [~?V3yéq_jSI_Sҋ:jJa?SdFEJJ>WB-e?hT7nt]WOv2^ۨ+ȿ[C[_?ӞqX K7-%SSƧF}Eaǝ,Ό"t< {oJONvMN)Ϟ]qT\]jRVH.zkwrG$^o1_s5sY?hӿ)?Ɲ A};h>;|g|7٨ ;O]\ly2g㡢{%*qOΆWJEfgMH*:zW#>(Tb:"ԋQJ 릐*EԫYu+"ԀTKRͶu1HHF gd!ċR(\Vmz\TBZN;!늑qLZk7&vB;!늑@/^"nLʾ E0j:FzԋLSRP.\(RU*+>,rVT_*بՇ%99"NN0)pWGE5z;QjyV+ 7vAaB.zՎ(CElAɧ=MIܧf5ф* jvvg<o$"̏槳V+7TʞUdlG5X͋Su5c\3Geܣ~Tijo\3HVN[cj?c5~gsfei?7ٿ?3Z+\5<..thE[Og|/?¦M>½fr.LL5wQ}y麇¦]7QuIUVoļT5}U}xiz/OJԻir.??*SIƗ,S.+RI?½>ET?11McĕGx3Lԓɦߢ-E$u?+Q4>mo%WשqU^%V @US *$tقN$ 8&,1 Ս?k_\k{7kLC+$`'{~= LqLu9◵rg+GjJ^H>5O7E7v9Ղ?”Z]ŝzGfȉԗc 7SŭWA?|cZ= yVt?­c:+Ӵ"~Wq3u6 Jo^RNUlptCeʬ}{-C,m(*Q5yGQ0Y_v:I7+-o<[_:T;f"=~'TiztOjH? ~1m&t2n@ShM}%zQ+xh*8{vV۾Ϸυݏ38{Q^ yE{,y#}=/|i/:Z~ # :ոU\ [\-CUzXTc95z%I4gj :,,,Uv.1/:J}kX|Ȓ*2(S@s-SCtgWaLwYEv5Q jQKc]>>a,vvEkZE\1OhCRCg_].>\[RUTCW"ι~$1Us 1ֹn\]0<ן|Ouz ZAS:VƇp Q[uksCnpdcv1T*%^p[&9.*_=:Wo >mL>GY<sѧQr]?? mxSXZ-f(pyu6T=Z^K9*T^؆ӂ9$jaܾ~.֊R)׊3t3~d6i=ʧ`?J+:~bH? d@rs 2"nzey}OdPȿ՗y}W,m~Ng4W O W7ud6qZOƽe_!_ DfG.x@Ωװfx==kfu?Dj5xqKo5@;jQ^?o5VcXΡy<5zQ*^uf?(^/Ү^/[K|?n<Oƻ3n'Vc])NP! ]uQ5Ο<՗nj#g1+R^m$=*U^ZMՄo {U{U=v̐G*z-x3 =c'^¬e"dI+Qb^mB?~$x.H,`PKkuB@*shSOhT|7u*0'UOjeSß?:hI$x5юZ;k?q7og?B:W&rk4䣠^?gCC?ូWA Kƫ4g̴7MXչ_C^>h|Ik:<9 eN}WgKҊOTzO"TzO"˜J,T>] u@ ֛E;^?Zo"gQh?5[};ឳmr$N+8V>ԑH3ٜMyبJOC[6<#`kfo&VzM8;^4?? ^&oϣ7V\o#|UzqvfMmҝWZ|021$^czԑ%ڍڲ=cE*ffotocx/images/greenball.png0000664000175000017500000001004615247006660014737 0ustar micomicoPNG  IHDR>a1iTXtXML:com.adobe.xmp 100 100 0 HAjeXIfMM*V^(if%HH02320100Fotoxx:resize| Fotoxx:resize|paint_transp|paint_transp| Fotoxx:resize|paint_transp|paint_transp|draw_oval|paint_transp|paint_image| Fotoxx:paint_image|paint_image|paint_image|fotoxx-22.20;Resize: width:128 height:128|NE X IDATx]K۶ddx"vވ:Gl|T&lg"0=qOan۶f.ccmx7#X_ؕULK36?{w_cb^E|z1r0 kެg%W˃cgn! 5u.Iۥ>''&C^/#A1pBA_.@*GU$hԍE.vo~ުX;XG{fӫ>v"e[2ǛԲʿ6ѠE6Y p']؇/!E3W}%P}[=A6x5q81e񾒝Gճ *=T堿>lrm yEO\(=`ei.ۆ˴x 9d:6dk7la&_p:%'5,#LtD <(JM@觴{N5  rrhZmcBKA2]F?7w Ō:CBjʻ$_ъ<7}T{$(GyJ+ 4G NȲcmsN#DudYQ@YVȠIMYS+T gRLx]BEJG՚RW%}Ə(@/1>B΃r;WfyGFJ>/C zgMY )t09ʹH7vb3pjtkI!pM<.ELwAtrz:$wC'ƶD)Y|?;xC ¸q|aHSb*pztwmaُ-Ca#/1T5iS!]XП\cdxt OWSw҉<"}qw^,W!$ x58B< #O.*wC| n8YN2)yE*{=3q'0V&Tɳ 8'h8>4ACy>Q= <bGk[':OCβ~3N D4ZN{Ӏx'>Nd#9 %`jTe5 gs?<"gى\6z{]ΩQ*,\p";NfGsK|1̖Ez@LԛE] tTsxR&> @^ba[Y\_^x4#$Y5FOSn&>Pgq>MYw5&HErN/T1]ܨ*A`^Nq&zL^gs>h'.)aL|̛ Ra)2_ q#u7HX{/?7mw4E%U8"it&߲ץPE $*(#yb_ꖪ؝@~ `m=q+Uj[-mWZ>W!Shg$Ir5#Ӵ[u'kG} Q rU _%ȬwމCCBKz`ݦjt]NQfcC2TbZi2Ppn^gێ1iplAhY޺˝f.@T[~}5) pN;7FAGs ͇=;Cgz4[~MB~t\w̓Z OW=%Yr@۬P>&3Or&©e3?%Ypn2QNoE雓V?HF1^ V|h:d# rJWgN gݹd>睖?$%&x1!<98-샓}6k>;>SKiڰd=޴gBUhyh"grd! CY\n$?u_j ,. IݭMdS>~6cӷ >|[0E|ZOA~ε~vkؖlz M'B~/}[$H1G>w.' HRQkݹ z7W>;%Aټ[SqCV}@۷gaڬ9 XLn.{wۼk~%1_SDVEV,R!.V| ]sɁ< fBE^n |cWoz?He_5`#=Cٟ+ "Z%u$-evGV @@цn_<Þqz1qSs{NL YQnCCYw0$Ph@Kdy1F}pRRz w+PH)UlH d7TRJRzٍRFޭ@v#@ T w+PH)UlH d7TRJ~sׯosæ2;a?C_Ec~ |e?꧟G*D͛q' BIENDB`fotocx/images/alien-colors1.png0000664000175000017500000004045615247006660015464 0ustar micomicoPNG  IHDR>=tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 150 250 1 0 -##:eXIfMM*V^(1fixHHgnome-screenshot02320100fotocx-24.60: Crop: width:250 height:150|fotocx-24.60: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:225 height:135|. IDATxXIoݝdGE9(APAAP<00c9HATdAr钣:3;;p.AyJWTU:MBQQ /IsUTT*N%[K's2dׂmj  //!??MiItDe`i22DZZRRR\RSS6Ǟ˞MCǞb7/ 'ٜ&$$V@0s[K]c@|fϠSLC>[rsNm'$}O=Ǿiѧ&.݁RT$%u}D᭎<k|)IꃁW`6Ha}; ?`GЫW/ر=,M`az£+ e0 @KK n ; xp`&0V-V? ^ ǀh sSaP?MF__vǃ"#.[W̓ %BJV:X$rIx>ƛA^F Jrq7=ZLM6~ٳ1n8۷*,;¢4G{ONچ91^51fI' I/椵0&eS#d :6 )'ш SGAUI F.ApKGkvǮ!&#/n:ձzR؀^6u 44`f irHx19AFN #lgBݰwhfԹPWrxqz i5l>si<9rd Ts_`_IF~>O 4&Q9V2|ř!+GvlD13Xܬ(ŋE׮]rJn'.9BA"6OfG"scz7փΰ 145+a1J?4L0~b\,$PR9Y1!}$ձ $2F#հL`3 )NV L(.`=1N1֨$ckL#'-ہe(ÚPHycp7ln>}d0}6z4 ׄP ?2${Ř?L SAP$axQaFzM蚙`_&w``hcccCWWP6A4 BZRGЀ*y8ç6}~z䢬=k=K,hIiE|7 %iX2 22rz'8Ȍ3l:zј'kKe=k0fTH#*kAۏ^FVȤ .`-;;GCA+k`470`i7M.iT]]Z  AllE('pxtli9>qZ`<kdmwPH8J*ʐܝ3Gk5MItp~KfShL-]C="h W^/)4H'hJs=`UxC.o*%ޱYHKslqTd1b5Bq1MczK`γl =N9)4 7ahCZRQ"Sz!c͎:w^ݽEю!i5Fpk#XIi͛7qEX3C46' M }38爄txm a\#XR#]E$޿7iz*+8ӎ BxrôTB f&>Ca PSӞ(./SCJJC,uܻ~ 3M CF}Ն"0-)QX1Ӻr,<0wi64G^{.#[ >[FD\ `PWipq$ɇ=AkGlaZaKlZ:-]kifjvhKN Hd7Aҥ tm#;' wm'h[̂3X?~}(+΅l)Hs o{Sc(Kt?=RdG߂B/pȥc 5U(8o߾Y.܁l\aUI>eI> d#'3V/ p|p;RhD-Su"MVTMd!G5iտnݺqKK 4-Qߘie: 6nFC \LQ}]2Eu;̈́=&s lL$ņba:SHۼ@[g\bekpdX4P 3%-E}AV E GO!Lٸ{fzr;D ,Tq01,a=~"f_}Gc.AA>B|\|4= V>' [d.$Dc Z>:Sr”? ֖07g`ޓ3%شtthxHx,g$c9F022Vlڃ,zwGEyuէp}'!;TxВVi`7u/* &PRy9"'mDZJ˴a9E,,>Un)mOD[jpi%Yp ^KLE+edZ6j_|2X'.'dym @\B6ѬL`L32g`4V @ |a f`aZ2%2Yل KK켸>M  L&L[L5|G|KgB wlZfM!'yxBBvvn^C-uCCkvvnޞ/x76˦tO/OwlioQxz˝|2dq[Mu/'<|'w,<j? =!! Yx۹>ޘGidBB^ a"'avPB<ڰ}!aB/ݵCG[~C؆.aV< :_B\ aaJw5{UC>fVظ8,Z WM[y۰>%MCؾ]@ auUn\m+/,ah2<&'~qh(,e79xN0M~gx;7m*GVOķ_}b'WZn=q9$Zlw-dl'a%xW^N²&1Ai "6,h'ny+lCo՛#*+IBɏ4FZ8o5%}n'j+Aר  I^ ;N šJ\6={QfgӖr[VUUu`TyTt'#UxYS͝"Ǖ9YH{RSi9rDUA~-]W\&*bHЊBdnԐ..α+/}Ue9i;KTW֮ i2UU"/{z:My~68;k~4.V^}׵. VP5cۮ_0k)y%m_RWN|=` KR&vxEqx?Ki 1#FlDpl"Ƞka%z#]$&{KfHN@(F fڌ"'(Kp^f Ahcrd-ۻE )غb& O# m93?uLGp.Nìɖ''JTEErҽab3\c]HPޙOzڒ $&_,ٍ1Y3@o'lu|?9^| -U#K&7ӸјgEɸZ{ t.k𲺘%`v'⁋#،PSSo I&(#Y(#)6 ѭsi?|Ҭ_:Z`z_@r2gNdY{ ?#>ȅ<@aڦ}p93aۃzӓnb-J= U\r?>bĒHx] r{;I`׈gGŶS{RڭBxwXjjTf!o4|I3!֪ցpDw/<|ũiVaޘcMطw5L-dad7&n(hcۈ1_IE%w:SaJNU^PkaǗEp<z}H&?εvQuHTgV'`xF5˫b[<aD%92p׽x|&4vL.YJ~tpIaŤG>ڐU^zY4&9k" Ǐ ̜kcOLyqzY]1@I#/ExZ>4 ,Ѝ\b/\7n q Lԃ0\۸!l@lS[ []k’$\18rsA;暩d2kt&=/0q@3}' Qv<rqI0 K\HrJJݹYY1 Ŭni|ϿC6ܢbD6n {Orv㮉PV%P1H& S,Ƅ+cŽ0b!dOAot<:`8HE[#`b֎GM߫ylF6Vmߋ;wat+vdqc3̽ 8{"܍vxZ5fې\VB5NB&8[۩غk?z>˭c!(z)/J çӄX64p_?D&fiRi` < XtVoM:aE8`Xb6oLno`ת_8Ҫjdc~w* UO.dDc(OgiGeu6mOso}\sEݍ`S28S~+ܘ1ϴ-ѽ[Wt ݺ+w"j8|/ުaOޘC4J랪z"{Zzc q|߽Oý-%!X}CqS)^~ETϲ{+}};6kq\]jҷc@!lC )hMy!lC/kiNBB^ s4JGKBB^ stޛwipBB^ ~(Kl%59 \Qy=I?>nEwMpu!rC+)mWT(!2C+X"ӄ]ȇ@XSAFCrKU3FAnn 'j,F!E Y]VwVJem  W6U^C;pjch+`p{B =U5o du9NM '4VPH9!lޖM;ؿ1az/Ξ ̲([= muſ}<5_M ƶ 5n!0cm@c M?B.XO ŠiC {r6E5D@^hz4tհ*ipKC)NK #*op'C@V"*cakㄨapѭ[%"a=Lc&u{6 )x_m6LkC(U+ rkW-((3V9nJ5=BӮ!niP_r;d$z@g5rhx_L[O"gNZ~5}>{c!4J^j yA1"7&̧1!nB빋, ÞѵSg831aCcQ$f2+ЯUM\emU H*i(BC5JGS,մ0PC㱙V_|א3)%:G:wk+{2i'# H4F"=]G/ %'# wUoaY 'hX[BXCJ YKAra|9\ G7:@ceK K. VE^Xƅڬ^ aEI Ձ9S-Mgѭc$ [f7½Q%/AO;὿aׄ*RiA6> {JaY۫҄an1\[:/Q0s#`t͘W?KvM3ԙexz }ɹ/8L,nB7եpvJx&73[YY.m!1>evb0-mmX${F`kȥCpbt^\U{L MM-~DNa\H/4Ke@e#׳a0hc%Ril.ųÄ́pcu{6l1U[/&iqdՕ]!|*{Z'җ·_r -{L!Go{W DAR{9-i,uXB.2E&S\ _Uaaa8-ܐ].6kBXs`Zi, tMwK30%& g^((+*);ݦm^mBBqCެW/sґ{XFx?p {jz9]APGa{4.f0yyy-2C k>d;򚰝eC;!!5a;a;7:CCkv’"^> $s# dos^> ˛l|ȱ1!!DŽ,<C!! Yx۹>d?chYBB^ sڪchN<Yxm84n@ j]յ&\ e5v""|{++}G<17MCNI< FY)ytSFCH{?EiIQ3aUk#=5Y @n#w}Q_WVj.ݘH=F%a01>A~(-e<_5;y9 buUYQ h>ڼQ^۪Cc.]0a0&*zgwn Q.~rb<|x7KAhWGHIJOC4H ZC3[c_ z|p%׶X<"-zVTW7 eEpr7n7&q{Y19Yv OAlv;:#wc ذ~=W8!-+~T[xtv? Ȅ p1> qb5kmZWUpx [xxex!ڎӷ]PT\,r|{񚰣B4B`!_#TS +Z8m07l9O3)7AؐxJSaf5j$4BYCsVnFLJ*vq~v8 2ZƸy\,Nك"a@!M6߸*+.tC&7+]In #g~F0M,SUeY2o<zq!*iz~/KïM;r,g1anKc&J ӁT=A\# [Om?|ҝ:b U/Kq>,h1HO̘u򔣼$ Z@EEY{k#-C9BH3}U >vCt0{.$)1S#r!8zrD^jӑ#36x:fnnn yy78!i^X4c,ui"+9 NًL8vKre*e6m'D$jM2%zb$Tʢ,x51+AUASVmGhB*RZ2$1iaשh}&@S}a!6s䃕Bz&B9<4;4a% V}(B0[fa?y]oN00 GoyaѐUIcUYQם7b."Bz[hƚe 70 &kOFo~xr[y}nBooL]Y./b5a]hU/0X _wDdI-eeb0J҄ Bu}#e`/ǑCiA/BmHse.tNLk~".B&:0~x^3@z.Iqm(HiLUrJHW WPܔ:"5\NBOM_CI%-&Ǚ},`mEtA!}o(8m$wdfѩsgH+icƖSxSi&%[քaMspadNG<&4R ј>?BPa' nqv!2=))OAU}toeYުaP BxQ2 E9u1a~)g& 0oH#<% Oa* L\^)M/w6&1 ̸\f,Ҫ{8izwI(g@^?̛ACv$fлuTwL'մ:]W[HlfLuՠO3Wad2g!4=&'֧˯v`(ZN`8tqt8\9V1T*B%z8?=F+Pu0Tǫ,yiㆢ!RR Ify(//ۅ-PaXp I95˧0oWilG 7]z/~v(NƆycѣGKL'3tX)(W~UUu,qq(+vo Mω4 3q)i"*!NϜ&!lu[;9!\[]Ƣ[1v"ǎň#a9z4,L !#)5g"W{)ew1$smMhL,Q$D8h4 q-jdOX ӆ4ff0;e@ H.F.;3i|2²H]gG,5MXW;;?4"XZ(k0WR~ ibf4$e #śF̭ӄ>O5h߽y>hK iVx8H+ǡ(/Jƹ]K_@N~yM؁5HW mEkfIIX;chL]D_ZNzaػym_uEri$9:z`MpcwX?*4۸EKAV0QNΠ{*+CFNkϻs_8jB*Wmbd'a`ުX nu3y>*1U5ЄRqn %^k&<u?D_i[| W",SQk!C`mu22ːɖ02o J [|5 _ &fʊrqrsB%AK3;9%uyx1uAN1yH>}ڢ9z4KJ#'-vXשy'<#~[MM8S'f:y4[`L1fgih^\SRkp>:Pj- P`K.r9b_;-^kGb!KL11p}6K  ]SaIB(JyE ػ]{J1LJ`xȪk=!xMm!+v鎅o篘~if_#Dۂ4W-CߜkVna: ?s4i2i ۆ~YA3zSY=7k.YQEF?~{i|6T2q[dJ6}R:fӛB o>ˏ^wq| >F[\h֌lC9i(m=Ҿ2`l> f|r#^g=y~|bAKϰ1k:m"&+=^laC؁!d^}Ƚ.LcXp"C ~g7{-쇳Ba?d"‚C9Ӯt q4B':_.^ڄi݇M=eѺkE}y;0LXخ`i+myx&4{k 'G[pwu&|F{QA mU.Ѻ`օlKx P@3øiɦ[Mq[>Gfң%0!kH֨lY.(ȯ{{yay,P8ۢ\Ϭ.) #ȴ4FmԴ^W8r7C@(NcCCC2C ke:BƻIENDB`fotocx/images/gallery.png0000664000175000017500000001025215247006660014442 0ustar micomicoPNG  IHDRßiTXtXML:com.adobe.xmp 1 2 3 0 0 128 139 1 0 !QeXIfMM*JR(iZHH023160100fotoxx-22.0;Crop: width:256 height:256|fotoxx-22.0;paste area|fotoxx-22.0;Markup Box|fotoxx-22.0;Paint Transp|fotoxx-22.0;Paint Transp|fotoxx-22.0;Markup Box|fotoxx-22.0;Paint Transp|fotoxx-22.0;Resize: width:128 height:128|fotocx-25.1: Margins: 0 0 5 6|fotocx-25.1: Paint Image|fotocx-25.1: Margins: 9 0 2 3|~ IDATxoǿggoԛ PÃ\% <QH}mZ)rUB5bHU<@I@*q]TMokev9;gnƿbws~̙s9A8%t" )H B " )H B`:WDY\=J B " )H B " )H B "t%ѱyW#hhJAdjORcP @UUp{E.[G~ɉ),//;J iM?߇x<6` /JgN 9^D">84 sp(JJY(P,bRyo`x!`rr j4JU"n~c*\߉x|q=:+WU_q |p#g:JeU8vIcw/qbQٳܽ{ϗ8Q{>//˘2*d2q?T*bChB " )H B " )l@aKP '4/ˤ(9B.I#̪csC]lGV ]u$6m|T>G4j}IoqC(y : v!bp,9RqpS s~=vmZs;'N|>? E'O~9ypۋk56|++ /Pm6Wp,j+#ϖd[s\h-nDb1D"?Ju#pu}{@'q;wMufL?L hYψqYghA,yUòӧZ@zFl$ XXX쬗YTbؾ}{c%h4jT_ZZ/q(;w6t_}@b\,T*GzFhB "8EH BI v⠨'"8w&&hoo>{?\<4҉?(+Z61\,<{7Zs1&= bBH&kJ"ƍ(W*ؾx_5%iEccј&ܧp uF8T*BD"EQ[ԫoF7-zr|c ͕߬@xM(cOqFJ?/[zڊ L$@nLp*!'i"_ 7Nٮ.*qԌ^Jon3aSSW.9wjDa4Mc7ޤL^^dtTUE,&h3G–-[jѬVt$ hEQyM9G+xFtUU/s}'0͆qڼ\k@_~Oܾ}nOKn^l r\M ݍd2Y󘝞ƥKq1۴h%@ӏ/.ۦI4"PfbUCR@$! DHAR@$! DHAR@$! DHAR@$! DHAR@$! DHARi@IENDB`fotocx/images/emboss.png0000664000175000017500000007034215247006660014301 0ustar micomicoPNG  IHDRPaiTXtXML:com.adobe.xmp 0 141 239 _zqeXIfMM*JR(iZHH0232,0100fotocx-26.6: Rescale: width:215 height:127|HS IDATxgxV˧g{W{{I&^CK.`m+os7<9ɋmIJr24$ 54TZ;wvuu5LYoJJLJiP&+GʘLfNfA3@3zUT233r jXYYp1u"?(ό" %WG+ߊG|;_+BWaKjTB : 7&///77{oV+ Kl⤥QyжS999iYYiiI9KnV] 3~ '6sm_{>C>8* PՍm\])$(S B#doΜ9gd~kB\CPIY9*TBU3CLeF%5JT;7y$WJW*%(n$A0A|A,xǗw u$J% H4|M!qIT?r\IZM(F|j騔J_IRx`"+,%^ BZb07a>+,T٪xpS;TJU͓$*Ԥ , )))ņ$-T|B\i^IS ha8 R'\P"e [ Lܬ$B Ҁ(F#HW et@G'RC'h "##5JIUcUKS< 9ŋ111`)YtH=ZyBTߑo7`ԺR*@{T,4@0-!$kDD8lD:eKH(ۼჿP鞤Ae|  D:HhRR@Ml^QHd"XuC w1dȰΝ6m:::,KJNIPaht*7#١Onڵx7>99)##)==:>.%ajr s;I@޿_WA6e$wݣGٳz"XdxOW1#ti-{~wk119F eˇػ{]\\`4Fu޾}:ׯߴiɓ'5dg;99۷o۶mx~!!!H2d':R3JWd` E M̙3f͚5mڴS;v j<8⁲"C%iB2Gx'OR.߸q")I88$?D Jsx6mڔVZ[c7O? //߰pSu}ڹKZtqvv=vRnݞ=z]:>756iw`]iԨ]G&<|ݻtn۪e-6m ש/ׯq-[lԨш#^^^FB7hժ{{.-0Gֶ @e#("u@ PPC&+V>|j$ X"'<.:%4YP(•"y6l0q-[ݻX/[B4A3eEZ~~˖->yҗÇӧ%KǏ٥Ik֮ض}c[i6}Ɨ=z|e1a!ӡ} 78zdĄ4d@'g~}6j~Z^= J͛ >H>$ѣGګWٽ{k:tT!"L}K#?%6_(DtQ)ë`Ȫ#ŒHD!'  ,Al FoK,8It:o߾W WIW2)($cǡȨpPظqGN>kmv:umɨwh}q/3gMiպBB֯_g.<)ؾ͕W㎝>ձGݺ:>p`_'ɑ#ȹ޽{"c˗/O[n+WDBju5J$4UXac@&ށBK0Wǂ N> Dǎ'O1,$0>l#6:BlCAF0& dIHw*AX. h U<|7]]POx1SO 3g'|xgߠ~ßwӛ6lB6Z_<!}[bc[vmw;دuVOGYOMv6Ziʯ}h䨡u&NrGwgn;hM_-[7^~3'L[5b y&!(xDF6*[zO*I(+7х.n K(An Ej.>^AI 5J e/^@|1rܹjHrxy]w\da%fyy[k|G;{gfM?yGe_Q7nQ=>{CQ-6oRA<}"-#5YȚu]Mo_7n^a`>}Ɣߠvu>#F|twF0kOkwS BA!v|Bx%HA#@=M5QЃrFH>(^A x_Lғ UA!>ҡ 9ig% қ !;Yf BaaEDgΜ~єg̜=ciS>~6 nݴa##/G\8w~ V}e0.Z~͝YcVm/`7nZ-f⣎8hs/n7.gf{.^`422}Ϝ=˄<@fQ&Ƅ$cPH,qP:l 2ڛ+"y8~Fc  HOO(Af +1$;-9̥2jzŦjABKCPBOF2d@(@ Y`R.l);'$1:.Ѕ-M!"ɞC|@6yF$ t${ShHA4V{j[;s,x"xF <`"%A$>G mzIl_G | ͈.4% A|$TmOyUn(<`P+uW%H_,#9УЭ.BV}m%9AKtrQU* Q>-@$ij1~> Fƪ`U5UTeoU6OpC% j!}[(G׉SDӿGʋAQU#W52d1?ˊlhfgU6j# g[ammݶaW2jj}[ lnGDŽV m,fS-hg 5v͹:'o wM֜{ŇE{ J\(Fn-zq`ߺ*fgArƱ7&]3Ta e!!_18i V^&`  #$嵒6"⯣XQףےUgmձM&PԓɚXa#8Fv&*359\r G4hSeUJaJ\MHCU-NA$0Ӊ,6?zymڏ<0P=]ݟq{cWOnnn<~͚[=j>5ϖ.G^)I趇{Gf.'$8800 889 l|BCB[wh?U'8!ءT5Y < SC` $ VQUc͞P-3UVC<5KGRLBgO[fjTYAyM FyƅӧF ~` )`\qZV_k-&LAC&fS^a(ϐS̛˛':j.ȷM-ךe'f,C>q[FL+cUwB$X9=OxR_B9sL( ,Dܤ(|!F^apW=|W:7l3@JnŖlW+T|`WۤuHo 5 ziJ63ӲTmBfÒBɿ.3= Tr1/W|mФr }%EB=7p7BןY??=[Ry2I3 qHPaPH6 DgTR&!Ía[&EC<ѭql 3` 9i1z,kh臘ZxS∍b?Dxz`P aL8F7a51-6\al|Ι*H&v1[c˽<ף լoCn=o/O'~>UO Mո"El 㱛+\&?pAq eTB?_o!xcsP+'+;@1͗-?_?FU|+'8ލSFKK+6QSIERB9(nlKw e^ET uƫHDBBVC0aIH BJܹ}ײbhJ˔kAS} Sè?rKg@\ ؔëYW-Qxj sOlU21ёdeY 0̈n*,,,.)-*V (LqHX8 o[E:CHb&YTL,^)*exxR^H)q zZ 6BNƟ` u+ 5} @J$przYUR+Wl*.)ijeQ[cC=I 锅'*MH0)0V JvQ^" oBA#Lx>X8,j6I#鎥 eYB]VR^T{ KJ_,S!K MTlIi|h$!݆oQHɽp2pP6eJyW)t)#I CRY̖cZLr}$-"BSPHy fQNᎰ&C엊 UҥAբ2 s*#lVE L0(x#H"0& &D>A8?KekC-">.FDkcEEV㫒ҲW`p| *aiIS$_Ai"oy0-L#Q7PHa( R5ulQ/! :Ġ-]t- jt޹p`s !A||J0R* mRB@Ɇ"zdKQMa\UNS#`wPH)86cyvFxEdb*%XBG+x!qzU[B!WT]IK c@(QqAIRWzc fщ/^FwQ\V`)7 Xp} Ϟ"UKJb[xݻv^r÷׬YӄI\^> ˮ\u;wl#%gGFE?Kt0  ,C;] U(SXe#Kg =f1tŅt$Pm0%9ZTظ~ݚM=w4 !) O*E>Q9Kx7M!|< W4_𐖦PoaE۶nckW6it"V D$"04z{ LIs3Z̅%b Rj)9Y0Fp E~!-BAU!X޼߉BV|2HƶF7ڥcQCCoܸ6q8Gi CotvvDq~2 79[7Ν}:x`j`NaLx62vvssoXPM IDAT|,CGidj(Ԕٳ_v٩E7]}۩Dedae[i$H8 5 ׌>+<=B}ݸa}f͜[>>>2>1E|.8;\>\{ .ʙ1} g%ǀ?.NLvv< Bn/(oYHyG ߾m+noq)!^m Pxzق_gϟFٲT0>(,3SM9}vٻcQ93;k׭ӷk9Z>bĐ]:߻K׎#G rb! hŽg/ع큃{Lv'͝?kl 1c-(,@޳]i)! n{v٫; yB-@ r7eL-XL()X-yg|ߨasׯg.&pP#hŝJF _H{Г)Ǣ fj*bs ,IJ=~D^]9Fl՚Μefh΍{|ղ=գW\2ߞ<~,)qˆo'͞9e&"VnĮg)O6u۷׭ʯ?[Μg=X3laYRnYPB=cE Zj{\Z-b1h:ݞ}}1j_O^a,͠x)Ҷ|u#Fa1`,2J a74GVnr! Fc2y޳GΞ?w|@ߔԍ[7ljg.<~>CGLYqK@`ѣ2W߱k[\efݿS|}KW.m߹/ Eɪ`,p67]/_2gcq=hP f\tqufE#7rlOo0 КS.91=tIo];k7.&'>^m֑~8>(%K>W.]x!7k֌&MfݾqV~e(9)7a#G^xk!ٓIu|lվc;d~|b\zfFvnQ0#W'UQXL_eQJJE۷osƕ:u>۾}L!sq+gL{DaN5ƧD|L]^MEE}3ە{軽~} Oeμ={{`\8vݺ8=0Z4EڙYQ!_-vղبp wn_SCsxdνy*(ܶc F^i.e&/RPg-(4Θ=anAxY^j2|e߿k[{'5YX0MeHe 7& )F1! ly[ipv 9π~-tK.ةm^]{ѲuFMpm[<" õ盵lp~57!)vF}B1qSM;o>(3j}amyz6`Pn޳۸ Ϝ;,UE!L(G޽\YQg޽Q3SZT ULw\)dĨacv%:.#{lA>o77o>z޵kz?!ؽu1c)7aH1}͞ k"LF8;9jÍ"&WW=l޺)%-HɄQH OQfJaXsoֲoSKdڐy3ԡ]؋}G(')*5@[tJ=r٪|3ٵ{!첹,#c&{5oڬq)ܵhgm:2sjrFJaiyFM=05=iʥ'Oyys-`!g-|GXy\FehAj׭UL1y+ rz&}Ə1o4!Sw̉͛r'{e\5z"8VpߎB@,d[-YنQG G/D3rS7m\ɧ\q{vwnDսz%).7[7r`zOd0DܵӰჀiofuB {*:)z=ztۺm37J;dAN|qdka oƬ v~^83\1`q^I/ܸs|Aq1LtPG~u Lh+.Z2:)0b ֵ[5߀w.ݺܹ5!>jPHGv-[7qfL\Б Ĩ}vԮ}͖\G_h?n89,)[ƸX3Ȅ~d~}ו^~S\gȺpT6Myw~=̙S܁#WI*Nhv}{< LMK+⢮]سGC%Duᾁ>I)Rs!5>~ʕ[~bZ3 no, .]4Y?9NM A$}޴e#=:1 jPYsW3,nޢghAW._.?{w;>qi3g;04aF75rNL|?-$v>',,mۦ\Sk^~gpxѼq'AfaӨ ?:s{wl߱y|vdfEΙ;sРaaO}{;t0o<޼e#}\7e]~eś6m8p`W"wܙ j2SY05YsՊ12k6&G |>x\0֤I?ή׶m[-Pks5TC؏Qh+7јah̭4?^xͷk3{5) ŋ˻Un=:O%ٶ}7߬[haaڋ=vCб4˰Ѐs:`-ϝ|4zu?z2葻-_arYRj OЈ -iI11HZvsDdJzlR)sf1qjYyBB)r)(s55Mj1;yȗ__xy|qcGݺy?cÇ4i% .[]woȭ۷ >da^r 4BnXt٢ ,Yx-X?aT̹Gۛ(dui]LݹL sǨ(oD<ʤIسT# W&ntt5]00\yRMfQ(a,yVS.?hт:0f(2|Đ%K^v Iϥ\&!>!fέ&Bؑ9b،)_> ➢ k ۴~ŋƎaRaS|0pо/'֏1r\, !R0F޶}…u;mW9H֌~Q~1nn„YI oU/$i}R ADjd!بL434{hLbqŷ>*ɜ ?]xzzpzt@:heyMzdb 4Bsg߻Mφ`9(8Xj  ao2`.ZgQ>0vVt\E\F!OKC/6yߓ'!Al:jD..01. ^Z/4I ,q/#+-CcBX㓬Ydj\|̆ 빵{ʔc~9m9K/_,旖_bC5M3g8n.jb\\3 hB޿}JfS FV%F%UhҢ !6dZ4%jopA,7a8@ԘRhO8@h󅠐a~G\^G#$L՚Xu s'_ 1 ZPǶDʥvj*yQ7~Tsd^3v+u!QY aW +ZԆTͨ+TIba27>&jF P]tMSU#pTDToQjÆ? \rktE-ܦ~% _T}WD>weڠEl!9c%_&Y]p,+"^2MYԷŖ h8M9A?QpU=jV%fm C?R7wO@(tJ'`Rs(| 񖆶eA^MFoeH' `#eiBQ;r(Y͡)+QL TȫBaޑ_'UC+EHKPh+QЪd "E:`Tgy_~4BSkS_F)F!;M*" y0` ́ODBNEF'ҹ9:QjP] Xd@k" )dX RUiKmiB9zɖF\-]վ|]EؾV=qF|mRD1j9YwT͝v1{W݇W .Y`5V->66%nzXDC R:m X)|OGصXu¢Df`4lܵlV~t4o: δ:bf؃C`$S3cdۢ,ik#6%"8ALq&t^L'WBG+R/aR8ȒDGA>v{+Sck:b:P"H*DXfOP'fD> `]r.Rp7AH}#rXsf l`82$7T䎬) Z,9,dz*Sl)4Ѩ9G e;/a J#" LrD( J?tH**v   bF%E-ilբ؉ǡ@4 :+єcZ\Nr[]Uv9G4;KSȺ@V5k?BXA6C)YlC '` 7e7J$܆/kT (l 7jxrs=E@ 7%%- `Q u̞'5Z4fZfKZ|B')Kt顰͒i*^gu&6ͬjaIQPū x1fUwAqdFJ>U$!#">!Q BA ɰZd G8vR'OXc 8bӉ'XzEE66J TyDDgJ-= t\gPMA0ZTbrH`=r IDAT_Q>:A)HFž~풶e-lWvP_]ԞmZ%uHQ\ M̲2SvnOt~DH[1bɘ易Ʃ)i,m$iS'{va!wO8Dč-̠tRWJ5h8goe0nRT1֫YlE(8"̎M!d<<` GQHjed%V,_, ?QQHxF05%Y&k6B9fp6?sx 3bĄ8,T ϝM?Ba/5A$n7#!L,A!8`7Tx% !D a,qZrI"05%a÷k6Wguo~FrO>չk pHƍĜ>q򤫫+Ome$驍}*H,<:3͘>0*`K+ Zt(ݱCfzΝ@8/ 2J!2xNC@,`R|\t.1Qv1NZ͙3-+3+Oܰ~I&^j|_7p/HxMNMZ1wˇ ߴq]֗ŸPIvرwqfT?tvn.1 :T^igׯcN/5gz[j|;!)fCq{OѳX}<5kKr M7=Ϟ;E-4=teK?bIbfϙřK^.[2xȠ 둖/&&GPg**@Ɓuχ\~KQ9:ح_;11  ӮGPpؙ=wugln)eO2I9r~صETKH_ؾk.~f#ΫrZh?ڵCڥ4Ď:6jآY6k/ON3gvSn6sy9[ivUPA[)X*WR_%A0plm֝c-09:ܵ""ø*cV2e'&"m֠@.֣&ܽN~8c`c@󓁨nWa;HJ(g:Dؘ/5W8f3sb\.-=:3xЮsrر>_i_7d& йլSGnձK~Gum^cd&D]8kcdžq{ 画wpϚ6[.#p´S9Xef8c\  JcPAb`=:>ΞԧO|py1sk4tG~~N-9?:вu:uA!] #1i\`?/#eaB 9db"3zְqM[+n1zJz*Gsg?L<\ "d;8T0T@'Za+(Ϟ=)HO̰ w 1ǎm޴ 2S'v,2*8ǎ=u93"{mQQ&skF ?q]l^LdL774o\{7_-81s̜5FtBASvީ}Oed3 ޺GqW#sLtl0-VB4$Ҝk#qL]ZXqNm-w-[v޿Dvhɞ5w*Rg~> X%.jҎ;3ϔ5@Cˉ2!1DrOrjBtldrjyOj\p lБ4&EF@8`gڪGiC2xdpD^M^&.Cx6h`ٳefC ?vg?z :\v"# yI.kߡCl=2E<֧WS&&GrIwqrӧ}9$ 5W.;|hܾ=jжmZ\|!-5u{_WZt~F~0;7̹=zu_rŽN7ߘ3O?k QQaӦ>n蘄(&pg`߾isȱL_pɤ'HF^T> 9nFAA!?``^rJ>ҴY7r#ŭ[wz?odn5ԥ]}=?s漆B'JF*LMz}^ _녦[q!F]q#0:;n$w\1cV͛?wo]xn}׬YբE3w ~N-1&τ DvQ9Y䁕?ĥ-7mִ1x/c/&d$)Ӻe{ 1Lۧ{\ch߹֝;323X=uSa&%ڴޫ׊U_s(C[Sh޸i;ٵs+ 5kѽE:iҴcb#W,x֬Zj߾C.]._kW/OKK 7~Pn5虓תi[QF0W\7nLfM0Zhݺ|RiP :XgcF͍5}Й'Oqf/wt34A"f+$R,1oArp avsw?o<_-)5GF{x6 u*~> .e^O;ww'S!z)mI`/SrmfL c%Vrbbb<==޽smG\tf (Pwgnp/pWIgq3ɮ ݻk94S99`8? 4Z,eD m 3DfMnР^.]Ξ= F?v0a|Cի״iӯZyG rVBfv9u͙\W[:rsi y^bR,_;ޡL2SHPdWW{:K*yauuH%!y:~" dhuQE>dd΂>Msr߭k r3XR2(t(60ֶ$2;v3 i֠Vb^H= L`4R_ RତR.E9,h Vh1@Wk[S]#ET;Mڒ 4aZ&m~ ophN$fCZҹc]ŀ j[h:D Xk%[T+z>+Q EArJzHiRR8$Hqa -&V8#FɨRhτg4YlS?z%3AzrtQWWP RB 7LjV3 (F0WQhL5e=݁eK/j)5!ܦ"U8Hg:GеMLW&@uW'Y+^B}si^hd%lq0A{ƐAk끅XlK0JQ q \zΚ5n"Z)dχ[ܓc')++*אĕ.XYV7.i>!~N~}|<{ &W&O@;0MB+>P|2lQ(pGCa6D EQ8ya/@!pE?VBKOOܤ'6WP 5[ 9UYv~B55̷2&yi:ɕʰR訌`>B[AeB bx~OILNIILNOM{4_I1ƒ4&DU'XHJeN ŧIg,)Z ?vZ鶠P)kA(ҕTviO␺'(,W^K2$S!C|R-vR?U \j{jЬr*fSc /IF%YMy +_)  E p‘a/s3N-*AQXHPщSPW䚡ꕦV!i/l-s#nݖjLkx)2傲8JH'$&P⅔088 p->bt_%Zr%QAVuCɹQ?תWs&5 %Q>hur:j*FWXf<xj5$6_ B_Ij tIq.pdj篁אJy`jGp7 @-u(̔2݀)8pa~UjI趵U93Cen lF<9&(kkbW*PY\UAhD% Bv'0qWZ5Rfc_5[ϛ i&B]5NJ}hD{w9|wW-HZ2;/[Áz_J$z%})K3|B*?Aw@/_U͒Uϒ|_+9їE| P|?^q"jbK`8ĈЫSϤTk/jg5:Cޱy8as8Zxö6AY`Ujjſ;_VxJIHϛBB-m=p;%.6p'8(FÍF^\7?ȧ RtmlٔZ*'Qٲ '+&efQe-Eq'{c"vή?w oi?w ?hO$r!QrIZFjbHcGΞnO8)=>Gss{AO(z=pwc.rw|%r ?w_QYKfN&f9cGDh7Q"*cAĵYEY[ 4M7M-`,}H9ɁI:{Vpky[u&0>.Pȅ ŏ}A b[zIy58^q"w# ~УGwaShh/O=(T6 F" B6u=$Fl,OX\R\`KI ۲{3n6o8+au:]٣R80 c!A%FaMN O#kveIH S+g W~ 3kn.:p?hpO7LЪzP82փbuōV]^[Umx3hx ^TP|sr&ńѭ]V_Qq` f >Ej2WW6=:.*' 3P?s˜Q[5u|K RGbūC/=M͐;L\:Ŀyl¡PȸURJMX~(@:z)@TB^{MװUpBIoؠk,3…Y#ZJ@*\@+Bu4 IDAT^x`oYykk{ wUհ0s׃F!LodۭgO}`̚ZZsWYUYHsѹii*ZfM:@!}/B'xlA!0bDzL U|BY%_Q[CȯJۻz^SX7zDFFf| `QŌW\9<(U:aT^)7;i>tۨ~~f :~Usz!+++**jݺu$-TuCCZU^jC>c ̚d4!!8L']*NVbJkۀmV;lOfXJݎ*Ek7 G 3"CMý[7, M.]w^rb'OEiӦd +WCnٓ/<cV]àmO?K8"L+)i? a`2A,VHD 49\n(wZjz̘1N3E{T'V-) :qB&Cݪ۹Nn_t7448di9FNhVE;'+ұu0Z^^Y\\x5Y)C .b{BPȈ |7BZ.Ff6F€Qv kEDoܸ!'' Сt$6../UV5Fsnצ+**Ns!aIiiEo߶KvE\7nܙs^}RozvjF C}Ϡ''icϜ:%xҁ͡؇Ĩf^SKѵ5Ya'NA444Y#C)VUJޝN]&y6#B;(U]63o OHrgŽPJNH8.:Vy߼S'AJ2ڥpILꂺ&G[Xj-&,ٰ#6a%ɽ551a ;--bpa4eW'TpZnf6vj nj'Oaƃ"q>6k޺a6t&?~\7;,..pX n$&nhjw%Μ=?hɒeaT 7 hٲV<쒃BxxCȖnĭ0,)g Pٞ8 - xDju-l7Y@ yV(pOeKGR+nuxLdxv_g^~ga4#2ШoEZj~y\g0sebikkwFr u;v];… /tZ.vj8Y,M L 6 C0my!B8Xcb`T" OdX;A!1:}J:Ҡ+H?1 ]ظؘ5)a k4cǾ책慬N;-׳.ff]iE6f[h3']&]ފ- X8aaIi@"Y A&vO={w3bҘb 54h ai2aLmks<2*":6[͝&cfɢ'@--[71R߼m%hVKH5uzylq_[\ÉB-[?5n޲i\;dfrHrh9cc+*̆mS*,i7ff,Z`ֆB!AoV?Io߹iܜsPN^W!HaQ {{9(^M72_q6BʈZ;Cy#:1 ]4Èfp[#|:ccT0 &BB?}";p1oU Ɇ F iVX"|Iftz$EC(SC>z|ɼzt)V.ԎrZE^*RK;v bVk?eZ*QqOp=Rخo@-SPH` @ \ip#}#yK0!$D=?%SЌ<:)B 4Q4#QN"B^Q#y#A. EiQELGI@i g#% 7ftry19 E-p^'@?iJp/(ADE$I @^bb=BV-0C@"=(t N%AJJϑHC~A3Jq| C&$-1KZKJa<D1"C,9zIhG gYAᨢc #5#&Nݰ"fg}I#GbyER 'wQ QPNTqp "!jɡ.@zIAHRaZKBKIZԲI^Q^??ăQE!XG.XP"W:R I  |%r+EVLt3 2" P%DQKq/UrH I1vD4G% JXPJT6"! &!:yW~L=(U w+]B0 ?HK Gb L 19LYbotTAL7cx")",AS#ifi MuS19R-& 2щ `#`& G@e؄%f v$ʇIAպ$[;3i H-bpJ l*KJKjT Gnqytu8h#YPb* ]=-8T'? 169K[Mlu=񿉦 GIENDB`fotocx/images/batch.png0000664000175000017500000001364715247006660014077 0ustar micomicoPNG  IHDR>aIDATx] \WAPA"EExd՘Ĩ|?Dco{~a1Df7Y׍bFB7*r(rx9l003=Wt?7ݯ_Ut% W*pP s(P s Ȝ}eP s Ȝ}eP s Ȝ}eP s Ȝ}eP s Ȝ}e9ſqww'2<=x&wZl ;.]|ȠAooo2e K<),,TWEEl}}ijjr*@k׮$6fշLZ8_}qKK \[KnݼE)`$X.u*:t@BIi'1~~Rs9KV~򩪤౔jPT$::,~{|ҹsg)mӶݾ}joU_,Cs=E^;3xp,w '8F_u_d㇄X=? <^ݻrk2Ν)ftHXX(8!SFg `U4}T&gT7 0 d՟Wyg>]UܬK_zzi d+ 3x( ʓFRx:Hfabj$í  '3@k..uˋ[Z{%%Ѷ]pcI~~!hȊX|u;ƚO:Mo/_ @{xx23l0ߺLomll2Mǎ'y e /)1z+enGΛD*UIoV{mQvF%{G:&=ium]@`Dl \ yfL lԣwAOoNܑ l$wꮴ?}C5j-tcNTpzqG7nHJ lNUV/^e#k9j&L+|wJݻiSӇ m8R\x\[?v۹ҥ6iv???Tp/8p i 9nݺ?FSG1O<11uϻH}}U}*hZE#믽ucnGLL~ھ,:Z$ D~ɢ7ʮu;L#"" sf13g>K`kwI;?*eE⼹͛c޴K(P耚6~.eL$;=`7@䜓ݼ%?W=O=ID3)CCCh\-_P }Ig5:kgAb'lv6JM&^eYy)@IVeI· zkYqG^]N֭۟˞={ZN a3cH `'dMƷvׯ_e?` ) L Đ$%8)/$goܼ)W7mpQ`!I apZ . A\W+íu9)Bs $e5_BNe_PmWopѩDpjcQz ;gPYy/{ ѭ[$-V>örh%!OxT&:*Jlbᡥ.tGSi$IU=3]zq&yO0Ɓ19ːd7#"Q{=zۼekGM,d o\ K' X:mXQ}|/Owv&ACUddM0jqСqLzRwo6q&I.ae|_RָqchcyBl oH@S >ƮǨ Cr-q928'''|N2PNwjg̘Noٲrw*tfւ|۪޼jpC \%iǐ+xG0b#k s 5&.;G-*|z(iN76rCYa]NO[Qs(5B 4;mڴG> O>91lO &s_MV|@pp0Q 7^D1=Imue59t YAAt{6cSǾYƌIbcbg>n'aCgG+Uׯ  =џ}xyzʖ ̪_ѕY䟛6Cb AGtIc)F'ahcIUUuƬo~1?nX Ow F 0?c2yyYE.4s}Xx BD!{"v.c{գ@H*(;y8@oܾۛ(DBI{ˍ^I ?EGɓ'2ƔA7A"yqr,NĚLT=CBB,9kNͩu1&2Xh1^-We/ ! ʡx`bL2ir,F4aTx $Tdol!j;’OlFY+v íwTҨlc)BhP{bL iH'&*\NwSAdo A 睒qѶY4pBFg'Ĥ,pd33%RBl==tL!@BL9s owG&6Z#)jA럆OPpp/zĈu>LVyt8ѯ3Y a*LiE=J,θk>㱣^J@ss?jvk2<6Cvs` "ѓ@]aaf薙DDfG%zE]Ӥ]*8u4_p99&lLLLCD=4g݇h"Yn\~]jX|7W?(clDdvi@2V r ; c!0WMIjdU s8{0S %TP`oEpvꞮbaA `ohGdžwi]u3l_ֵm&&;_y(q6#Tնl'|}U7;ߟn )AGMg{XWxC.XqoUC̽pU~m} 7U!q$%4Ӧ׮!4xZPpԁ$c5L~BtDMGG0d=#h^-ٽm^aEYΞ5 yTXXDMч+Ui숐4A@ay $qd *ܹs&BA*LxhKJqҧ Y@+ 쨬,DDrrA }նQV8徖I@es8}Zƀ8qݭu% 9%uuZEO?)@N={& 1000 1600 0 nIENDB`fotocx/images/album-mass-update.png0000664000175000017500000034133515247006660016335 0ustar micomicoPNG  IHDRpStEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 409 435 1 0 0TeXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:435 height:409|fotoxx-23.70: Sharpen: median diff 2 15 15|fotoxx-23.70: Paint Image|fotocx-26.6: Rescale: width:391 height:368|'[ZW IDATx}TUɶou4H9gP0 sns1猀 ((!sWm8]=j5ZDt\H[:zY=r*g uq11%1PXX60zȡo\Fؾa%Mg#c*e.Pj_~{B*KKN6 $<&O{wCv/ĉzi^Ew fN 'Rkʢ<˄ 4m.zp&*J] !Oh#cD-?یT+%^'jM,*h\Kj'~YL tz >90>sr!k/zYASCʪp'r߱Xrw̴ #gTUU ?&҆TgUs)(--m-u~Sf&a=$/UU 8NYz!X eyt(㐖iღo\>ҿCl@Lj l:? ojr())Aiq:\[-UtK!OP.,{St"80Zm]Xh rgSrݧX\}0o9&=$CR'd}fON5%o淢dX7033)lOAHz\Z}+Y!'7`5bűkHL;_t Kc#qneOX7mLon##uNadW HwV̽[׎[M"85~ptU v( !`́ǽ8ߛ+\Q, *&AT#O݇y ^kf@Kt0ͬ9s0ѻwF׳?{`^Cz1L2/F}G6"F0ͅ89|Pf C=CL9 ݭ,cj &,' M#Ȱ`,`ӽ?QH.)BV^OGfA!_ y.PTntmB/cfmk 3hi렛 ֡_07eX<̦ױv3`aaSnXp& 啕(Fjg.c~ ?'G6υ.4?g &'**@D;;PWAF׈Q& #=:=| £7 BO qn p9,IF0+DtrƛE,pg`/[X g;ffF^!*+05ԇ&:q>D#S{CIIƦ"O;O2"`[ vXҚ<+/7S,$PQ;S3mz߿?Fw۷oCEEɶ2 cy9MqŊܹ3-ZXh_0Ο?螖Zgrem%lUkwaXG(*yBXg͓) [[ZBOGJ $GɃיДi~ WPP^h3ſ;b}D8k5U@VVFf!Ձ2T4g`R dMRꓞ%iXz`X"*+  KLlu#y0uZL}(7{Av]mMrQ.FV~⟅"a`d]=R]d`8RC7}M( # }CBn0B#4hǒC.V U,ll)A<7UetQI >B{%xxZ2B;5`cc KsSh pAqB 'mꯖ*:Kq B"cPRSԒ9L!MMt&BRPVBJ<5A%ޛR-%Bb}7ť"~{Cє"롥[bܹ֭Ν;ר=zZj.[wLqPh(#xӿCSU fx(MJXLpa%55L[AOp+Ũ(  ~18^C Td:CY=crxCla=wyCaHֱ)8AcHOsȓr=kRgU9FmqLmc[ljX;Ct;W̓t,vͣT u>t1I=K&@j(3 "N\Yb2p?$y!| 0iA<&;p5 O!m,tW~k M5(j.\CIe6ָ􇲂Lm`?>c[²s`PNc ؋{|Ԍq=PX0n]h|R?(,Rrz"${] k];B?5k }mLPֵB JvU1)D Uo^Ĺ6>E)LY}p;GEEa޼y1#ϟ7"1&N߭oypep [X :Swbѐ41mI+XDIŸst[r*DOn ş e ˘tOy9 Fٓ#ޒvmp\*FY}J}I   դPvތDbnؒlemC8.%塬0ۖMTUH&jm #} @@z.Km,3#0}JiE4|lBNK!6M;YRj+1>U ܮ lnPFtGbէto@͉AAA 6h'-6+HrLzrqf*t0WGG]mm`fl]cRa9Lڈ @ G,ӗ^t)f,(ccc|&:S6&Bop?PDrSꊍ76yܹs=avmS|k< < |vrr-qSi('BisW< #y0v̢;)>IJzX][(FwWoA^id=!q@cr(JPTP1OB.8= aMAFٓDa㗟`G6C!SxZr p Bnv Eq7ϼ (PD bojг)+vaV IYOD@Fe%DyisǞ+0}d? RH񨬪"Ş7oj7:P԰>-%Bb'f 0yEAkE**Td!m2s7Cd?ísPÔ'<>ӜASM Ns#֣O,[IPQȅk^ظaHpbCEeB!.ֹ ]GO8pvލ-\t?;rQyz)\e;n~qMJ3+0) Cn3u;GHeׅgcDRCSp!K,)V,Hb˔2$ |'N 00=ܚ#%N!9d&=àЙQ\\n0ncyb)nڷEmS};Bl{1ЫT)HVIb.GzlOYJ6İc1R=Y*kemrbڢUu:_:cwh%A'oš"/s~6? C[TD[@]=vPIU҂ ̜8Sf-oCzE<rMl HDJqhu&RѦ @gg e muX-7h(*Ҧ9BRU!%hdfi z*Q4>O9JV SiDJTv% 41o$e墌< `hh#yX)9 )e7H]r#FD?n51DE-X+ܾ?Ps4)5zQ|fBC0`սe> c{Sm UwzvL/=C闺fi@=Y=!fu6S,a 5<_;oh)#"<:CqmQo1TnF.?rCHxmKB_] Uoi-wK]d `n WN{-TE4vY PTU պhۗK__JB YMuFF-` bjHKa~.vAPHcXDH 1p<\{'LrQ&] C-RR*Ee*@aZvm~ERҝec҄>ͷ= ZѮ/@D*չ x~$7(3qvz Hs4 wGoā$[8zY0 s=(LQP*WT =BsHuЖ,y|JE j8{$h,:rH}׶01<"Y^#" A$J+;C')HSl̜OmϒW|/S_o$YX|_; e5iM,l\JkzѬnN$[--REwǀt$P96o3/' IrHlrY6ڑ $MLٶ$'F2NL 9!",0FIN&G2|[w6"#=)TwDtkڷ`jt!$--]6/Uz>0@mi ST本 a>S I}Bj;m -7IߢsXɎYҭ1BoǪVnLI7|[MBJͅuU;}-R̯prh恮?+>.#QQ6M EYit7õiqdafM3ےdD XXY[[K z,>>1|1:89prgr#y"s]Π2SK*gϏdM2` Qrw[3X2Yk P<'دL3뜥}2,{buYX[>7)4l+TS}nɁ'FA -{? prɁccc89pP4~V"s> 1Ɂ'FA -[? ǽ0(m.7/Njjˀcccc>89pr@# prh[O prɁccc89pP4"w>1Ɂ'FA7&9Ɂ@# |9T KKPZ"2z-dEyU:έ5ǝ;aEr(w ? uoz7_ݐ[H)30Pp9q9q p 4KfaxJ$O_E Rpvc!g@# ׯ Ԡ8/ͯ^DzZ ݹ\11,9E~^PRh@^ dN888>͒DtM>HE1112%^);DN`-准ˈfCH]eJd&Gcfc}֮[!eZvP?6lCB^A6WNsb5xըw>jx 5 w,~TUU E9XgЉ8.uRNʗ \8ZPPTmhUKE%@X+\# EE%ic}yiO@Ry2 ~QqB߽IsVMA3?R"ah҂44`.ATVN 19&=Ƃ!p1 3̈́!dEYQF2g 35iL\%򭩮 v$%F1wƸp_hjCVF ]~ 55 E:8zʉX* qrRh+CE]C Y9y8O_(U)CUM Ꚛ.6 ',A䝫?7 '=O(9u*eE8c zW| rDD*5('\ھګY9BQE kAͰҕ34M͡~&ˋpzZAN^&%% QԦ2Xpf詣L-0y ,kɁH{PMcp%B+ˑߜ {%KKLa6Z&Xuopւe @J$CZ!S1NC2p0\X:mL,pVy/7άTt 艫>سc^FZn|vςB%xd E{Y9d mk GXn.{_ClB<zbОp gn90R1keqa,ۨАYΈ=¶= )=ߓG0S{^7o]mEO18z6Cp(Hq;7=D(-t۽!Kd"3eU{O"2:ޞy'5i0 mXmnıkH=F@vUc*x^1ex\̢y]"PR m4i>`u8}9p4J*& < 2n*}60n|&v#-LXE7{I-,2;'r{ =[lتOJ𢺌0?} gv<䐓a:p2cAٳӐnx[97a%1 Yu=ܮ u5D!~1 l1fL_ AZa x梽+Wbe1g|H)aFg]IAV.$7Z= P Vl?h>c>ސkuY]42cU%1n%,Bh9ɼ30{+5!ogc,~k2i(lȡ&%S"g@~ hvBx)•kY^={}lݶM8\!i*D +#!*’Ajv=v{;&Ga] S|ZҞ?ȡe+Նޞ+%֥2kEC ֪`+0sl_hᤧ/RhB$7J"+=0)"X@ ϡ+gnمM%rxsxp8yqdɳ([98!_usǡS'JJ-NUK8LlDw&k%2,+DԃP?{wniCEA 6G|?40nbxmP<lPHaB6mmk׾$!5 =8F`E4o'No s=}6K~kqa>*Ki_ ƣe *+ ˉ*{F9ήloy wȁR^e9-!*Or*n8 zdQזPGCV3.)YXȡȁe+Oێtʔa񞇣)Xd֭W)ƵhBUN7IVl C"'4oP)y|R`R70P}?8Ya~Z߼&b^2]u߄ZCDl/-F8sJq`4(lmThօ+JP!J0>y*{a7M~aȡIt(yj aҫ 7׀H<-(!\[Yp~fjP6WHTJG" "<ڦ8EͲʪعw׀!ٿ~d@a%o o{p """^ z%`.W]>zMt2d%Eb!PVx6Z1R4ć렏!R?7L^Nز <ڬiVʵr0al<),F<RۑZ\N}֥ ؾ9 #k,~WL3nB_6`~nX8{=w.o@yDH3CGCڵ/C]n^7ɢc/)kK(EƔ(ہSRߗ|G2f^ST'y7QFZ?So )-\G׳_Kg *؂.!KUWK'[{W,3Օ}'IǟP(ePN)_kWr{YX)= ?f!VK-9nB1`YrL['y?lt/K>_͒ÓȇTCL26Vxao%ɋ8ll9 4K9ٸab" [' 'ivR/G>_͒[~k>`-}+\A0Rhˁ˖˖c@D&m, >h5$qdPD[[sb~@K/Ɂ {# 7uPY91|y ˘ckxh V>1118(%V'N89p p p 4'FVo1c89pr1118(%V'N89p p p 4'FVo1c89pr1118(%V'N89p p p 4'FVo1c89pr1118(%V'N89p p p 4'FVo1c89pr111-CU-1|^": Z 1ɅN慠7WվRaF^v"I*eP>Z$sءڷk i9%L[q 7g= [uvQYy&d~S :;]]s_#)~1A :v F-لzן" # 9)јGNCp7%j?'>@pc7)}YD< 1v=;v’PT^/jީ_v|U LF~‰'IB?#1N\D71\yET ATuY'y:J&Xs"Ґ]T#0p0WU(3sM`=h$g4_,}]cCAeDቑu2DUHz+^x^ą}qEx_TS\< /˸t"<<<| K[QP\;R,H\/\)Yb=g߫ 2zFm˗/Vhr f#m:m`ʈ~d˛ ᚏ7/ m7mI{r . 0f$ qaXtt KH$8WJXb<_^+;֬_Ȅ$TX'u hA.<_*(DI~*}}gqj+/Ya+_zӧZ{#Bnϱl%zoRJ2/ð{!{QQ@a .Ҹ?0i9od%1|+W. .υ&=oȡ s!)W O2 csqx v6Tf!q ^| Qsh ƆpttT^51z#= X Ϡ0|-F gK8 [*COij71n,w tJĂ= >]ӱ  Ǟ`ٵ;QIɡ(#+ֶ+`bclA5E׷@ZJ7/ENի;40d<#^:SEXvn*vCPHQV!qs{4>vlf <&^([tWGaI?~ 5 ōȁ)߲zZj0Fw.LqxvX=0p@q  m,Mi?r e^1{ȡ]gE D5M*CFj٥xzx":c̪CpǢ :Lxq/<~[5U{V_8g\ݰ =POj#\pQO1H] g]CBJ ҸxQ]K'Bݰ+@lR2"~wKY18},=FFf:ļ)C`g89ye 5%&!=%>vBd=#;JA8{9l50jzQ*LMC<IwXM.\ X61uAܼ!>141p&rtVM&6:q=oOPMd0r('%],*/C>Jp-CNYL( 1uL$o)**Azy2{=\Y r_a{(ƍC }} *II<;2 2*T?x?^a袤 APUXD1X66kBVIw-^()PնA(p D uS{?Ʊ݋e`;iJJ)%&^ֈ~j5 0k><@qO[#.ݫp,Lrqx8DgU#'%:rxA}ZܹO'b䑐g rjLv#,Wu>}h∰X3 c$Iy<dXI~%t9zjYue:Zjs? /_qEh)tPҐ ]!lιCצt F}vB8o ) u~8rxM2qNrI?[e1: |9K;8MYa8yE>Eq){(p_5RZSW$`ѵCPxԛ$>FH'a׳'+k$Y]k'6`A!}zDvyGZ=̙8:zZ ^:w3H}SGBWW6週g!<9rݳ:7Xbd4v΋֐472ptn(#9xnNdP ^Vg`q訨w#H~F0F nʾ< ]dq)&/|^Fx/1}F6A/ʲqt[19'?*0?CocƵGWh@(> aM=!i9Yv@BdLg'(vIKnfF=m߳X9s:+c(⟒1 -ChGJޗ%"ޙ9!KM8VSXmQv**JŇ"LCep]%il "P%,ce|θB_KO]A.e/w쨠0[T'`KAY:*J20Q: rx)xvт,mUC<+5R2ŏRS(X\5 0ϡnl6mW˲PŔ";X5U|f M缟}KzKi$[Zc ӏݧ*aCq|axAf8@VM:eg;wVW s ɪjV9HzyO9y!qulsxkf!DQ;U¸PxX5leuUb#0M/C.e]1a J-,,ZɁ-OmO#E*!|;JwդACb'E>7d UH!?!C woXr9\Ǝ@ʂXOi2:;öM0ܹ; y L̬1~ :}B޾Xt>F2 G5C4GDy bPoiGP]:wdys8q~G~P.ѭEp3޳aa;1 {agi~_Ju<7lvS k~5]WMnm)95:끒:O.j4z q{8g-usK 0mL%cgTHk[j,ƽ`hwˢȩ+[YAv-.:8v5 6? Ff 4͠, iًV/[={b]|v#uwG̘ObjaSdB.|B>aS'!jt!M =~:DhF;$EƂ'5,,,gPv&%Kf]W[]w̤1ٵJQVmY>=`anA4[N"(K^A)T9laƒ HqEn_?1CpڶyuUE%,0dx] ū9߈vpY"Ԙ,: s6lC{ʮ*ˇŃا E[c>2$gX^x'cڲy=\؉;w`׮]8|$gOe'x0]gN';9O`{0=9ϸu^zUz)OaYG3bV'Da7܍iբϼ8 d2k_z\$Ν8o'FL ۃLr2:곑CQA>Ξ<*1H3Drb;N ~8h8&6=,gu.}>q(e16~^eyLiîcp7}^#!=aba7αzĸvl#;a#T&y}vEmWeFX70w k7)hӏ8+yԗۯY&_m pv=W LOE$r猾hA~PHn_5| }U1u!dL9_D/] ?CS>%+^g\Z7 (Vzz~L5UoL\2DTj0mC^୆_^˶@iAăxa U>1|wϤWN ?2;UCu^,-3:-;vĘ<$߷C9gp˷CԂ'.2'Ջ1wC;} .3#:my6Sâȯ{f=L8Tv?6GRow2ܿyQjܡWO7 >BP*(j{WD1 #Na˩!={Emߙɬ9#A (" f(&̨`E E2J$H9T`uN}_ԩs^{z~b.[-R\dKPƭgO`zti=ఽ ~sj]yN߈݇.3gr)®\Ě뭧'nݓ0Ne0wظn9_v_/R±yjE`X*?v2B?֙lg5b0J*2pnvNC"=촴E"dE{Hw&f0xe:c`>.>A풇l-GMs]vRmEN¬C0\ocݪeX@\;g å`ɶ=MfMk8]ױv%݇MO ,; k8l ܽՃm x Ebߎ,?/o5G Asɣ}nQ`8?vZ|,^bo0HJLrl+V5uxK Wы9G#m+5+3?~v:`0mEp83f` 8s fkb?̬CE0BR $:7OnA޽G^rh ' ;Gp 88 wCFZQO-B&=I~H+d6߆ԮLȈ BP\;P$$xzHɍ\D޵69>ЛY5 ?Zkug7elZ$n,,>p2!8y<މ^A^em4̎E8UעbPO72fK AQڅo܎.t| ^%A<:[Y+#qBoV"d% ;ǐ:Kqπ"ٟz7Q n'1pm9xz'b!zc!_XH,V!~cVЙ-IymD"ӱF0$#7*5Ÿwr=g:lF6<"~(gpoºH A~:D9mpq#,>8xr!+.Qil]PU2ߴrP60Cpj9Q} 9*/Bn;}GդEU4UOm:AsN,V̄qjBY] 9ے`Bx )s`COg+=--hokE3<ؘBcdӦjLHhyU::Ift;: /m$XZmEq]τ͇Hd~N7[Ly6z., 06*?b$,@ =#9 zZUTJdw"77w PJl`˹k ,˦*(VR+8r%͏%QZیN p!9虚6rύeqx2 In3z~B;kJ""-Ο<Bno@M$gMH\ytfB$vKAITxQKf G݄7Y(5U,Vkbh:=쁺66tEkM< o;4p+W᛾ٶxOE` _j2[Ӄ*DoUi0ߔǚy8^^Fy9a`-wgr ɰX m(k;!u<"' :8(-뽝Ж!Š/G;Z&ACoʣrR {r 23pE]WC 'Ni;fڻnP1d&,ᚌV*|`ҌX-ZK;BWd =?`@fNcgiA1>NoW9X-!L&k_Əة(Ƈ_~/[vDUp#ptbﲸց(\m= P c'`-!1g޿{g41 !!HHI`ʔI#Y|q^d^ǧL' |PY}t环$bގ(ÿhFekς!+'Y6g=?{ֈJP\l`."C#d L.a0_vH90zL \%:0ob=.9Q/YOC YK0h'R U?Smq&v+@eaBЪ4e$iLVkwA94ZGMtyVd6y29Wߨ{\W Fx;FQU"?6;` ao?zIW\RdR0Kɸ^~ҟqߕ)0<`Sn$P{a;yWU??t(o`t֜!0N|.~g6qM"PjB),F9F?ah!7QctG264dq440,/ QC ]#Sv`Ӛy"C!!WdVEzS?2|@AL+⎅XPHI6aJ*_8ayĐ4({(k6HoW9P΁ܞ@akܻbU)$&|x;񇱐S¬PVV2fKs>nÎKwP!LiƺWCSL7+Z3@7P&i9prFjf6@pdg栯9 ?}# vBԉ'9sBEe`|gĊ'P>"0j?YA!-<>)w’Rva ,4"xS* kgMdft"܊ye Temi9rh 9 MؤtO#儎@kN$m!k2EW.`' [(IxPLJ1Q`Fl⟌w={q47 4ݗyh>Ia9 c$`_>BH T8>hkwV!ME8mt(I Q1< ;qs=qDTwkI)3et1r*Wd>,o9/Z5eEHKCm!Q9T} 8{#>nOu(fwΥ0|]{АѕCoK (0M }hAr-UP=RKɸ^AAQiuR9tg@d8Gނ7C!_68sa@2|ۛ9$pg.=*ߴP+CV9g3ܻD@;uʡ%( 3o.42M=k^c<3Z9D.,7y07PƲǑOc>O(N[Kp)Ź[!+T&<ǝ TU8Mz6RC BqЂWX?z=)^"7;Q!jnfF|UyB$=t,d3@C BU}6TԢѾN& .#6h;.taI/`Ŀb,=;SҐx酤|8I6Ù;hjoGuI&n7wkw!;b-Tw0V\JaIVzePOŀM`<.ݧdMi…&8J^QUs$a|nFJ!.1 Ue Mif2ZCAKx݀]+fC@R< qQ~h8ijKB٬ ZxT} ܢP *s"O4*@ ,]e5,^jK(,,YyF_Na +L6`u3K8z6S !~M QQPN3,[ ''B#ll$3*fBL} IDAT\jsBKKJ8E]a}=0gB MƝQNc +9 u05^y1iOYnJExBGaCpByJ}?Qyp' nYT@)?+$fj`5o{!8`?4^?xJ6(SZSkn$~w8 FDQh6fbђzk HP>0[m@?W`@)Fjɥ8~JIb.[ t6{.QXM -9`~h(c޲ xA]Q< (l'brJG/C&td:"*:xHUOp }Se:4bFsoSLuo0v4Fvd1Yr#uGh,% 50zo3c\I@JY5T!AWI9X&S1,_8@J`"6;>B 噰B;QkZ絔y[zBij!PJaG y8,/% V[b$A\L#1w6r`y=g`z,T>/OJ:ZHRDU>d'K!}xxzJ6)aX@!'MV2'on{=x!4iDx=ww&%!F= Ex@$%5`RJSx>A ǟ{QS nId4X؇ Z?w{?BSM"|D%55<,˽{ G%=C!<)42 Ҁ'>xF^SENiKSG^C{Nq)A/[Eg %^7V"<$``NDs777# /1Z_3OGHNM}HzCOoWΉۍܔHvO#~Ӧ# -% 3)tiE&ۓ yDC 4~^tF#σU&4;-Y|n/~$:c| {2ԦۤshÁ5[q%Y 8^f||$%vYvP4؆4e thDK_뷵ej#B̨ et^ZRbʁA-sꅡR 9 [A9|A~4a#LDHΗ~L=KO:zD>y73=8ԈMgÇzKc9Ā;KM5xq2h,ZO9ֈ ΅nx+5dNHz~K *-l=焊o|WEXfT x<$臐ϕC_C>\gڽxVҋB/? g IZ-ih7I;PYV TVW{]Y98ESxd7E `!HFQA445?`1t~_r.q[LSO=KJ2ǟl3zV ? qc&z1Ч17ToqRlT|dj\:|m]P;ZѳZ[1Mݚhk Ua]%tRp {j&~L Z0mhzw;ڡWq[SkvfU1<3_RJUi\vm=_5| |RۜFV}=J׳:sX>\[γ~7ED5 }V:ɖ]~LWڪ2'OģD(-BEePDf_V њY`fY\ D&b9WX)6HX:Bt?K5=PWUN`GN73!bWOwneD: ?yEAbz0qόhY7ؠPWYj&/i:K ZsXҧ;s,`U߿i11q5L8Ƨr6= Lpb>? xӟ"?Ti`R=R yiqH(̆0fj2 >Őf4*JrZ3'Q`*XXFI8! ~̈́Z[A OAH)>4fā͐"TLB vOQ N׏le!HbͬH)[j^@ > ΄| DI)קNG7-q?8h(g(=K^c|/6FP*ұN[3| E 8]͈ vŢ(K]GEs'CCrxeL@A[`,28,A vڅՄDh+9+7eU ٱpH)]T)݅Ic~ksh(A\L"D2d\ji堶ʜ@YZhMEq54 ޽AYNdƲ<{<?68.RO~b?:[ ed5M 6{cBSm/Мf`+?Acw5^ iEu&g-,|0e')dGX{6-"F '7:+NI[PϽX(, PGK%lR,8 \c(5 PL2yH RQ u$#ְ%z '&:ׯ!>GҙSC;VOD%l„B^Ϫ56҆Zj^OB4  v_^^Cԋ| v-Q*9HLo6ۇۓc߲4%ۏ"ejh B"nMڌ)a!Oż+/&2 L+3 Ug6~Ez(` 6OMPDkC^suo# :eq,lVߴ:+`\:gϧIP{Op+ŒrQµ]8kSg#*n/](}WtHBb7A݃XFt ʺh=lYT3FؽLFP1g8:v޿i0IP+7nŁ{5& `|_޵Mҵq:t}#v 1\ /bJU w+XJnxa Osqv+cvӶ_ H!Nv0 K1C^vCڳ30J> ?9m[MMڰ 4:q RUyz0ݹll'`;~3PWM!'2 'bkIV-h,[1.*1ߣ)ԡ8S6a~K_iJ$!4İ' !OEq/q|%,.BEh*n3P>U/YL# SŴq aGQ |Mx00xY|[a"v;ێ(H-::_w(dFy ҂׫=FGuzW "' wADI?.,U&paV-}&OalT`ͦcqEq]3+( UK grCgCqS * Cgu=v-Ǹiز{?d`c!9w%ӪPy:d@d/m(a)(dCO&VajF~SaE!$7kK|*kR57ic o^v%lBP %wꐞAL"$g|Gք׽f]ptråK$DuN7nsX5 fYE8)PccPT9+T(钵J]Aл .3rڣ1fT3&ի^28>f#mƒ[ؼa^S2R I9c1LXW[JP]\8X D\;8J1;ј/єOL::)zw| H&֗ 1'_QY8c]4tQm4$ 4!)٨.+SSE1vXhƅqN@NuL7z+tpy5lX7Fm$M|f <}*̬ϡҟ@_S1o)ң@IN9 QL IDAT{a(9⠯"" 5q7rDL/B]m0qdhuׇnZ2iKg$$9xRSt$$0JG׫ABUxǹB{(fQ78* 1ıt^8ym~cTƨcbwa̤x7J}/VbZ`xzG8ip[K1"*ϋ{hQ Yҹ@s&I`>R?+ރy-b7q*ص/N]2D2<qXr/(gU *8}4~!܌NCaFK OCIZbfT JUO#hÜ)Ό%>m*{S@J^ ǯn4`P)!iETmVdf_0S1DtD*uaykMb[aPd3aDҦ 'R5\˔,kˣ/x<SgЗ?[p|9߼ Ow)ίx%z&x<Ї/:[+mQ A}PW̛kˑ"Ϟǡ%ȢB$ԏmd`^ej_(? }hoEFJ" ,AbhSѦ4ϟ.+B)vriWUIP{{?Kyy|1.*`Zn0MOArx:Ga܎v=?/\R[B5#WfLV-xݷQ{ߥyydf;g. 7q~~Wq~X-{, W? cA^W!9J4wcgy eQHjUQ^Ca}ބwjeZnK񈰟Zv' .3NMH ;kYӝαLǴg8Axq,s7U{XEA=L0c,#xcvz*ggƼ`2sh,ãas0,, Ɲ| )M)U2:7a5b?0u<΁1Ք=Gʆ΢Y{?w q)ԭul“xqaiy.>oF8CG v>'NClzK ܹlO"F8L!9qC~YՐcSǎ}-p$Bx( pd2j>Z5`/K#f_ʎ O|`wt`Y6[¢hsYA66_fhYjQ&@1$15.G'Þ'R8ɣ>f `-ݬ—V{Uk2C\y6ZZm-$.&# O"}PєpumDb õ;( AiKܸ|#p~"]"bL6.N̑^;agsIο̜N+8~5r}h6G`ay RO{%\gƔG 2 Acl/G {f!BV9ōODGY2ZG< ;Ϙkl@as*N#%0-5p߀# (+Hc2jCu: a>W1GM alfKuű \$AAX7CǮ>`ګP~x 7OAQFf$mp -@єUSO* k\tSgr`$WACIbZj.xׅgm -/ڵdzm^5e9,3FTr:͍{S;¸ЇN> /_<!z& VCSSg\CY:a!aTlHWЏ$_jU`^[|!Ok.-U_篲>Bι$' g-6@h6Ϝ'T7AIN*saDp'~{} !6,mXh#2)*H߱{]w ;/=J`j-C; ~;<)'0R°D[ub)w3S̙-'Պw̟) yn̙}A 0vtxe4N %XTiPT ]pzxpE@l:VWm+!$*ūc1t5!OBJ "x8.<8NȧCmК񘱓`#.sg+ANY LM`>$eitR<` ??t d-aNO0(L;M }QЀʊ2eg"'ے M-X6FP^dbn@3,JYv"BtkMV.T F?oXn}yMZC`*Y=Ccy߄,O#g_6g=Z1B<)̕f黟3 +y]c p7 W,VŃ(Cԅ.Q}* AM|ff xdpB6,L*G\/Fspk& g(1AM0pΛLkMVȬhbR[!"KXޚ `d@doıcKʁ@gB`4lڋHPQ3^FRqre,&$\2sP3*,w;3=mDQ$'QD((ssζZ* @ "9 Զ{fooQJm;3\\V!TlE <,A#FRZybN <̓$79=C"e\sitLD&a*9Sj^5QUkHjn~Sk?BWE$X`lJ%LpK2GW A.$LźǧщlN7N$7QguQS--_\=ɭT;f 9RX n~ЭTQ`4|n襮d|F;5*)P_:}E?ë<ܹFLF:CvM}i<̦,ی~O5qX4}дW<iѾ]hw=f`)P&cWr#Pz:mCKR#(~Ё nG|ٲ 1Ȥ;ĹQ|nz xSx!>>ʭ+Ҷ$ nWe҉m) p^ a`9> 7Sƪ/K΂@xf3k9]Mh0AMTlc߇%ݣa~7='yx`ьBNo3pJt_s-# 0dB4Sܻ$E'e!:we^+wC*c&+=nnEEr,y<*YX<\Ezm^Ou^Kрkxsqt zh2,EoTԤn;<'@Ӕ<|OjnJJ Pg(ة}DdY\ HW% ?!qFp,A 0TW.J( Ú2ph:`!HBdE(Q{w)@ZzZ+зJd :~<V5YAkУ+l)g.Ь']6Ӑ]PL鍨y Wu(ˎǭ[йCG̲ނj"z嫷XSI ^.f9\tyt53S:TBB쭃 sO4i9*T4+r:)Zi5i5xt~h98hf4(0vA i;79u槗OTC=M1~#N_ʄfo3ݷU2vAZ,lc6_-H%)5C|Ih!kVN,Z }rA(j!0~1U]HEr[<̷K:$SF0>5k3Uό]T |{;HKj_ڴAsA =!'m-{43uH%F+X&>DzBGt'_Wu|$|7wɳ8bbcppG$"&#}7F2Kp=%=ĘoAD}8tԔib5 rz –r若rhD7i~`VL ҞaLJN[ Oܜ,^Gأ0C 5H}ꇙzt(d 2>ek룻`|B<_W&oN;G 2BbJKz TI#Lsx} {`ٙHG~^>y0Pe{hZ \ܲ r0]#]tIC^^.2R42I"ÞhC^aEa]WSXgFbre\ʋPwL4j9+qh_# س\ڰcu IDAT]1 _ wXSm,9"adJh¹),(dU 2'*W:ONYwsƹܜ ܤ%bh$RQO.b,PŗA]0 [)$w 7nUhf'!5_tȥr㌁%tG(~~0L>+*%6+]'n`"m#!a> Bݔr wCC^P w=y~r;`gWVLiNQh///Bxx NEB&uÓGH`RFF㇙p;5s`ฎ1!=\sh 1 w27z 10xA1$"|aO7D*]29fM+R N[;5QQOD娰0Xh H.ud1p(apEjq?ܻ& [/S\l\$aͩ$JrПd iqph%zc-dwCKY]t΍"X y)b=ڽ f~\t Bh4ſb6tFPV+A Wλ Bc9`%?f8?3WGW?aԊH|͠w$O(i^-+@S]CNի`L 4zLRV̛ކ&k9;wlqDscsaMNxk^nMz}u{gCxX2(8e&lV`)07~&_1/D߼z 1rDl޲fD7>cq;_l+`}V!';bqOj9s1iPt)7UV:dwQ֔A2zvčS\8섆eb՚J-`ނ0偮mgn| [)V35*ܘcHLEN;tG3֌gS2Uw/Cf+'d1ULW^h2麚l+j9GU%ٸHX9'@1vg+1͸<=Lx38okmyM]VZ=1a<߻K8a>y.bk>o\@7ZwtFGd0 3Q_^h˗`3e2C7)Ҭ@yI^2l>6o1 Of{|J,ס'K4 9A}ut5 JI~G6H-<־<%lN^/} 3)dXt[=P~q߿87M-8@P+H ߑMd!wnġS_{߫6j >BSøqvUp(܃$HjJs5aw#k{Uy nއ?"%3p ^ByCwٱ+ml`×pfAŽ|x߽> /clXw<A NA8oWc8O#;4kva%Z;wop]Fޡ+wXCƗ)jMH-? z\nARj*]ҏn.fu^_ KK4{WCDE<7?lr[37uM`oC1|@fНh]_c LPM_秼϶9W7U[nCZZUZeUޓVphUs:4uh] |Qp(GB\,Qp_JݖOgnVhVZ? ^ȢgeM%#Zuc@ _83Bi>SBr{]łjͅ$7vG6bԩkʔɘF6,og /]snM'>&? b8,FbrkI([Rn^0K_Qm,tid15WUsﺹ %mKUa8%墢 84mu_fu5 e 5QP_@g1rK%p8;l'VaiV,1XV۔*XؿMHx}kDT5/6^do2ɍ[|\<-VIKH㰂%E͖?)# OjVJphߊS,'ߧ>SIW#UP'?+iE>\(}*96F+ *4:f+l[=edBЁD5`=2,,BT2ȩc0|`tٛXk?>ElGfup#uZ >jBU͇;v٣z]T4T|WXIxhRhi%:W]Ġ[O 6g'HHқ,WҲ 'B.:xMϭ? m㈽#XL^RHga:@*_&+Jzw$\GN00| }Ine,IԙAzYVxBwacs(*=P",lFZ^Xv9ó,zah ̲Uwg5܏}s)YG~Ǿ0q):q:w!I"촲@ϾP>:zQ!8wUb[J+'oY\PwEYCu%rQT%P KXz~ی#XC`#to 뽧JŜ`]F6U%ȑ Qx4i}] "}hpXwb~C&Ц9oSBM Aλ**abVmRT<|d+ɸ,U}ΡA +rq7RkC}%ǼehFp,k Ľ١C{t馌kэ)u[޶#'*]a#ѥ(`r#S֦?хr.ro%nE7KKGWT.ӅkI[lby3*5z=]oඥ YxR=L]Y{$uyHrn6\j1z#85'];9'>[[ S7DF>uz b8ۓGd|"D?FGKr8!s8'9`c ȰX6s5q(xM}F%) ,bvBv?WSp ^-1>uOpItmtVN.6Ur" 1kNwǾH*9G-m"j[F"/]+Wult㗠ea V'();=%OAcYNv u~LUЭS0Pl 5%"7m:bexdM] *U%yp݁k6C? a\f ` Hha} 8TL^l'7-"_{Y}UoEbP[mЩ*~t#9rӂ֩=N]B< ЅڸnԼfT$L)ҷF{]P}JO,#*Q$ݹmŮ"`8bêXW!&B|ȝ"QDW=qLjNԁKN}- tzmi/W٘o9{ฃݰ&g_{^KGW Zfq+|4{_wS>&'KTt-4+ `!a#0:)ka1S_@QAieեq#a-9tӍr|wL=F$pa!Pϥ\]^(&FiB+\Vyl$ohB}<9Eq̪mSYt:-KPS芕N5Z/1}@ѭ$r&]l ʹV. xY 퉷=Qo y@mGΜs{ 7MN8Hb*ă3o1A?v,*1S@e'2qO.n_lisk?so {WkM /C*nOY/uh*>)3aˆ}1Fd=H5wHcTRQ+&&p%W>FRGV5~N8[~mhza(|߱+ȑàvTp\_~*MHj.8\{{uat$m`k*:vu?5l(Ⱥmaҭa.8~Ĵ0CGd$F[C}Ca~7;W_̧fcۍA@69 IMl0Ь/LI2v,e`M i#8(hgp>n3v2GDrS +,ߖiy|A_CxVSGc%x\(|kyqfX2Bg?6g O7(;Wj<u8wlظQ%e1:r:zGpyPx_2<\Fh l[W`͂12cО nTi7}1{a#=r89aN>PR OF#Ln*-ݸ.\d̑Ɛ$Y8usFl5BvJ2NGT H(gW96.}7qrtWWHNfk78$K'9~igz ǀX{ D%Q q:CLՒ%X`^tzKn9) 2`iI<У' \ez\YS;hh#PWF-"8BkG(0Œ˱pѢc7r_7_zr;퇆 'ɡV!:*5Fs!':XsNoۏ!3' IoW`կ3`VH?#?-S=j H pi'8Q l>VgCa?9ؽyz`F/Fb(l-ג,=} y8mQp4I,)`8!`CY i}a勔 OźYˌ|C_S fR3!MŪ)C ՟ bx`%xlܹ^Dp,C!n;lEG8y^`ڦIu*ZP5ݭ;x \>چGv<Nz4Ժt#S]&ϵWƘIӱʊM{x]yJnki-mP:٩vc +̚4ut0z+ sTe9T FB^w0-F٨-H17us0zumh$j@֌6T8^!57 C͍`0`m]7Ո<e]"I9C dywBx,g& J,0xN<( w?k/5wMtjc{Qc4ERz*:i5MBo^a:GHKI*^Ƞn.u59=d p|ڨ':PECg]PY$ GaƤE 5 ka>>.{g2^5hqC7Cc(hp-+ST;= ^"/)88mP`&*OPk,U4*uyX4/:i ia?j9/!p<UȊwtiqja=&YL&$ ]E15o^e@_Y||47y->e6ۭ3ѱsW^M[pePN x_l%̲GBH@mp E^Rmmdѷ '-!&SoU@q9% '= [Wvj4L@9xr#4%B5yCa1kb. ֏e@Z2~ΰ&+=5P*'CXyG$7oCM#8ɢs=U:cUoZ6${CG F\J±- عK 3c};a 6_cό=lg\Ĥe!3)G6̓B[7=cbd@z&, ٸïm?ӋhLj!cd[Ep$'Ew-j+x_FF4_øSAAǵi5SfXSDVq3{DRg@d멢L}|-=}чwGSH%7s];U.5 Y!Xf\`bȫYNJcf_ RS-|o٢LηuVM'.彌uyS0pǜk9Ye(cwbcprug٠HrPRVΣq/BF/O QWNKi .-CVZNbt+, gӚւVwXrå03# PsY3΀!C,n?@ȅ}^Kp (9txw Яo 5vVߓ(Q/`Kn*PQQS9l? &zk޼,/}z%4`db>=sBD%TF%8^Ľ+o qq'W9M^=ՂkNtt²Q[UŰMþm F} Dwo \%8,=??mҝٜI:c8 :{X[ގ4]P8< 78ݔ=mdZj?$*+B*Z"u Or8O%9pbGH=WRQcZ:XD}nT;.{j؟iϰz1MO\|Dr+Wṳ`%h>F޿8\nqXM_>/b=[7V#aTܑT"1![*f=_ϟ?>zS]8~1x/~&mW6j04 y!*59 /y)/KۍC DjbKP^Ćϱ ]bfpOֿxVYES/Aa^6)k3wH22EdrZ SgU}ؤ,ˣ>F,T]QD>?5 Zd%c;ɩi(3ˊFsK7G]m52?|1?i}9iKmu%2ُJsAXf.NHH@Ff֌5nCWp}C0JBr_PR|$s\ٍ! űkJHl$Ɠ$qeP6gNIAv "SBf*ǝָ4 %Mj %?qqHJNAN&yB<&/Oyj*STbrqKnW",/!.(y.]C9m!#̵t NMnb ~}]ް7}s$)SVUW0 l?x$WYʊrQ@״쐯c܌d騠 $0ϲ>#1p!E"o8q_MƠ$y~n'-gS@kmWIu.=k=a=c(XʱpZXu:዁@ ;+ YԀ>>SX rKK LL'f2Ú'חjSE9)oluԘolQLl]ïw [߿6_Z߿kк2*_BZjM@ {2 BP| VU2  2*2 CP'[k]2  2*2 |QpRS|?ss.| kmUsjVh'_ *y+|@H郯8 w\QT@XPjUEJYHԀ}  &oEY x!Ov+R]RT񶯬5( 6dsS[奨l|J͏HY\WoȞ]9+o7֧,(\ d￵҇}w,aIguLZ # TN(}$;]a*I nE1 ivӻߑ_g2it!뚝ޝO^Z<CZz0lgw`5gBQϯE}ł3CZQ{_/Ejw^v]7LI)L&k?h'/D<~+g؛&c KMUCf!{пg7,>zmk U1VܽǑY*hH5e&] r=Dd/Zm߻ }f\UeH\q8¼xLp\rl0 !MZ\z ׯ@xScq:>~ߊ+LKYzKt} \ÆfBD〨Qp|\r>(eL<}m5콢xuAPTLb~$JhW '1<1RqFT Twca 45Ё04sy>C-e,vDCUmFЭsWNǫ>N9?dup8jv'< 0i!5X`F,{cNV޽ rTy" 99-jӵ$Z5m/rre}w}j8\y9id(ۀsJj!׾ &leR:T$y*Xse58%,n)e YBi:VH[+dgà9Q$6͕IY ɛLn˧7RwwҠuTda@RZD{(cڪRCb#+J9(?ydXp>ec̞ F)"?2 1vXg:zP郉Scԩ7n-_M5ia+6#"ωwAK NGfdȸ44a}$B2Y2,v#/PM0vz;ZBIog4ju/`c&[!(1M`f%߈Z~ {}$ #}ҡl3a+,%?LTw3@KW6Nmv,i;/ l~q_N\x]:"p hX'R sw1Lm/#o1&& =OO8s%? ] `ws$rZlMdm߿jpP1ƚ]G`w M@ry݊r7ίk4 /S6W^(L0]'<l/QCh~zjkDhic̅8qGpƢYc!ڛq+iX4_^]5 1ѹ=a9}RW;/ɺNCK Nf\בLm0t!uo7zlPUsƎE t!\1lEAH9 ;+CmpxH^]qԷ) ]SK-AuL]i<`(= y(-&aHϼkBZ盒Apoml^Q%yDA(cw jXf ؆6 1kXOb {$b[fax=1-2Io}=Fw9üCR>:_ŶčwJx?ǒ)ñ!658 "a5LVP~ÂM0Dh\ڮ݃<0Nx{`*Y:mðaQ o^# p`${Yȧe"zeKSU8̍v]1lԨq05R0Os}u5- 7F|3Ɛ;z!@XJ)@8T[?s[g@EmL RUCMrUf:Xm3(F |"%#Ѿ"P pncӡ3 CnRoJLjp>Xgi9{!B*Uv mkG⢾ jIB}͕dsmr⹙oa o-pU(uD|?oE3+m|xb=dڻr& Бf HCo#n8*>jm p{'Bh0|"~W5DS0>o'<'S]rτIC?3^T]v0j=j~R[/GfGg‚i9@bCPϭ]n" ]>u0abǒG0SV.ޢ;Kn ZMVN^yQgG٣ YVS%na&ڪ6&8m>˛j~s 5aHyע|}WV>&"K0QC! 򁙮IR)MIJ=1\OM,"Y^>0= 3Q;ˁqG rۼj 2U #º Sb`G V^ѭn~Ԑel^.}hMkR^*%X;{8:)?HT{}blGziT]s|mǫ7kU^ad1Y!h'/nWuy}m\+X] @2lQI=t0hERqfݱ%-{/h9ڥ Dۻ]DM²qj<nAэ)ɯovk| )|%>Cwc1`1%H}|􀲦'Sg`C&AJCZc;%8!Д_Y/K1mջ5E:c1ԡ-SE@$E QU%Y?Nd$)&PQP $EPD 1+& fEAr1s`ys.QԶ]=]OS;ީ! !,@Q4Saa7m]QC !<6l߃3gOTwLv? MW(){׏b{.[͂-# BwH2M"iO͘Wn7Bz6H]:L(٭1gBCp'HȤr"1Ep4 +Εd'GhسRc旜! es`V8C;>̈́1VxZ"bb6FN_|yv L5X4/ظZrRVBeH5E+IPFli'|[Fa}V)+|ų@&PמO/ZtKa[Ğ0^~꽛?; 1FD9_vV7Zi % t-]4۩n#ą0KU{䉣\c 9و,Vx }*%@7Ϧ/ZgۇxZqalis/`Vhkf1dź:&lhQQD͡'AS Ie-v .WIg|ՄMKdq !A(Ha8{,v:AUe>^v#'ynXwszT 0}<^o 7+'E>q>М.ՇN7%xH*(aح3[UA)=NYaB C[9*Zz5rhTI'~2`v!D^ԕKPK Juq(df#JZZ\[ 'aL @UBO pu:x󝆍'Y',Y `qyx58yt_-%`ʀ/Ӱں7BO߄B!M0ýafU/&G 킘d XbXl`s`NnŲ%BBt)֕Bp`#+Dvz6[MOAoaS;K W酥C&"j~E#wEyD_ZDui.^EI:qd5 W w/xVbD^]9w"޽𽾲7V8LQdȗ\ 冈%5 JJQG{hVuqNrxEj>dY>N&ڹ-Pm_[_܁.N܋`:[8Kٶ.T׀A'XYB`5GBLO\ { @9tʩXU k>Ƿr69\, FKq60<<-c𪥣 =)R_95 6ѾW`l V,\m8+G;,3ZԊi{EoF0!zE_xBLT8F60jfr0t("US9=-v27RS5tPZowl5nFL*J$'Q2=s8!6=?%+`2b N(!soo_2 \9 ձY{ܟ Xj L̡ƆϿkLJb`TQ.#8>]9&K7>M 8u'u|M֛> }adׅJ@90r0aHɀ1G9r0a`8r@1j'?#8rȁ#8 G(ϸKic#8r0a pb('NF pG8 p8P şq8 G9pa!ȁPp;;(N<ȁ#8 p009p?.3p8rȁC0!vPwP<8y1G9p0a`8r@1]gN;00H)ao###VD}sta!V *AI3ݹPɥއ:c>~+vTqZ tu ˤiiF7EǠzVTwuWr=R+>yݷ&/F.cCxQQ]7n ktx|zj+(~fVx޴ܼ6vDy|kQSaXfΞ=mCa8D:M–Oٯ<Ï 3J"Xk? :)4W?Z}5p'!Q0X ǃ$2v; #~mh4+Fn4cU9Ru>d#$aN:]= u% E3kl(x8GOʷ430}>D@d9(+H4am7Ǒ~YEr܅p*-h#sPW!/TvAކVtaM6UeŨGכ.xxOyqc0X[ROp`b[?/2WmZf.f o޽}wg]E${yyJnjm僐y5P/ǬTS@VRof"6%;Ỹ12رuuz( }eWd,vs%y52gzw 3?'~{l b8qH~pyA}桺$ 'bi$F0_OOƄ,6&1d- D9EQ7teIWBD`z؉g#G?)4BWcDe֒Gf‚h z7JkI}ksw-{x6}cGdUлqnUPЎג'^ X -: BDv&woaRBv woP"zj$Pnp<ni#l!u1*rր&:`fɴ(@ۻdš$p(@).Ce<c8t7N`;S (= )4)s "pe94QY$a8 l^bh᜺Pkp2قɂcԆ|@Cf*2p @K[;**ʑS`}Gɡgtޅ= ڨ%"U(i4Fp\q=v9@]-0C4hz45mX W[Y+4הl}qx,!HDv(A΀v} ~XRO ޽6u" 0ND,psLz:q\aNѸl9QHZWpVeDfCyb8&Nb OF}vft1+C׬X^ބP!EuÇm|2c (byæz7NA^NLmOkHN(,E½ӘCd{/Ux2Mi-G{>ݎ钓 hi4G|E7o! ơ ,# Kc8hC̒AZ:Pub}|Yt7+Z8ʪN 3ۮ˖'YRr4+s%f;Ҫ{U3!$:ZLfQ􄚢4dt6G)|гۅ#3?t1)ǫ֏x;jFI8[cu7t$mڭGd?q qʌ, Rڕ3ck-ţFɻFmE%=A';;Q2* /{}ܺZ 1s#G]}2fV_ʤ.6߆{t:Q>˂4'x=&mߗL\٪wy] -khW.OHy.3/®G 2otyKcs(k:P VNDO ^ugbgȁ@̣{M&H*%<1w:ibi\ᆐT71v\>М7Jtp!0-fJ=Ӥ@ؙ`FP_4#&Pr(zX÷˾AWsF#4L7}19$`?Dc<֚4E~= kt0lc}*LI쾍uF4?JyzGl=='{ی#ak*3`T 3`]A..VFr88m=RYN֨ݽjeh)JpU`R[@t8[Vʼذd*tl#^c,i!00u;^VbQD,^Rg:֟FKtbC;1"y% H=zPXG/sƨ(:&NNG$-CAd!^# zea. IDAT=<{3s-9GP+x2|go7w.H"鏙zb{j,y<y %wU c&MԦ aiLEZ}hϟ9 IZIǴ^q߿Hs`ԼwQ^^ ԒɠÕ-',6ڥт=7b<-ȁT ÆFv먂<ܶd#6E߄@w{1:#@lmaeekzl![gxՌ =[d*%dq7x]\ZlN9{k/$Y})Ya,.y 37db.XrPɞojI~=9H `i'Mmw!!E̜<G(dg*"P_a6l3ץx!U6 3UV|[%z3fɣض+t ##c](a6N"ݎBFx%tb%ea;$ɨY vmED@[E'%AZp6t=Ĥ#1LTvmnʊz2S;GʇCZTd~u=mnoD䩕!rxXAЖ-VTDܾgbϐCk$"?ژB2^y?gU;R`\҇5l͵0j4֭͆ }c-L*u"4 902| e!bH|ywDqc7;ֶG0Ah N\js׽C+1kCWnnȱagiZqe}w+ŇAlª !$&3ɬ8ta/"҃ƒF-"H&r`7j:`C+qE&gq+okqFLǭt`ݛFx_=)8{7U hhgACoj*y.Ηe'@v uQݳDZ}[*rS`PҳO6}BGS,TueL ]n)Md% Cr`Jz; م]5>~5.-t`0.|XW쵦@j>kf(Űz3 k d___l#߮f=5K u_ƿh'( &Y^:ϫ4L`ɡ*)6.Um905}w! CJy17sA/%^%o7afOP< gɁi+mVPS;,ƸIxJ{}E2)B>2Na9NS͇Y445ۦVxUطф3Hia(ZI48&?I79ǥ`IC8ohw'? !a "jqby'hښC|ݏĆHܦ&fYK.y#q' {EJdK7kp9<%lыh.]jqU''#&* .gq, +v=wD\8(E][-"c箽l<Ǐz- :ׇ (!Y*y&d|7J.Xr=ea?L~x̕82Y:Ȅ$ݽUZ/*'9bU:L1P0@L6u.F TR!%! :̊QxGlزJ##4}r cIc&7 FiX NLf燏ŷ1Yv:6?ȇH+pش5x-rZ1a dPGk9pȴN^Ʊ򓠻y}NVX2fEzdD&aV*.Gq#jal4KwH=@ay%ia3"Fv==9AJԐ,r6|J{](J |i:ZƴE{ FP>_֌Cz6 6\'<#X:[p}6YAs1.bW@'ض՘4n4}M'e6HcUg#x3Kʳ݀($&n2!3œ.R*\YQ"V)iéGrA1Q(-Oڥ 8s*kPvZJR EtJ:RRGRKb ySi q muK (M2eLU!$MO&~vG߅ĝ? ݅ވN&X2+s |L0|5\4[E:q%^#q)6fU#U8ޏ^x1)@J򪆬w/щi'9ߗ_$GW/+cDhB mkFyR(E!*&u; 0N>>:8v""KCNcO`1qqHnDRr2$c}Ȯ%.r4C~?e4&bҞS$G5<yR"'L5wiEA|uiHMفq&]k(iR0֭XBf-d4YZ&ɢ~x$kPh3X"G+qJ@m-Gnn.jh@{?i|bJlZR,loAeY rsS 1lCMerӽgUΕG Xc}5>}E%1&N4 %t6D&zms=ee(C=Lj+67,m(+GEe9z:0L2koSq!Mt=UetpU nF }$ƣeURV6(]Au//|(ζ*dϴ>+Eg-$BqmS83y9ɗ#,ڈ‚FQQ1Z>_>98loeRVAccW'kҠ6L⤌Br _Pׯ6m }ƶTAސ֦~P_1xd*e<|I++GYUu(NxjfItSUWǒ*+s~t]';- 3X',e> 0u8ʞ^NZ&eKP7k8!jWQI Z9{QA!uLLxd*ï2jP77sR0d+~2s;eq'y.*g<M=W;k6WG57N>yt21a1qdL{}ƍɿoL8Y^98|(|~|xt`q&Ř@US|"A۳3اeqx}xȁ܄0a pb(Ʈ~Ǎ79p`#C@{vo*?8rȁ#8 G(1v~8r{0Uɡ !';Ue%t =[8 pj ErBUh{C9)!g^޽SuDKj+^-SU69X_S*RR_K{;ʛ2mSTqȨ;keELՓ@ъf:I{mTNs ~xg6 f(A 'gx.& :ҎG@9zxȡVo[=g|yot/Q%$ @GbdrG"4A7L=r*+OGIѼ( V;bJd9Ai_?xx%JaurkbNAw)2K2.)wHxԗK=e[WY{J-@1y9~󳒃acIMkϤ$?'(xqLJ:gwL˱꫑C=Ur2_/:޹ 6: O)hSȟFOW_yRbKYdU2+Ӯg@}9R^3NߤEI$ *ip͘ʃ^#-o2tTI8W%bl3i7?o}>){͑0z8 o/CVlZ{YC~bhX]+ifkT`p_&V9}UM`Ff,h+T:{{w0Ͼ{ 7'HQ KOTeyTeo9&!v@5{2 e/g|2n̹q!}sr ѨDj]6R*$<}iX\'`MO0mD)O{pʲpGlL+7_dl"j?CLBOsKuIȘ2]s=r]KU▮*2DGJ뾱ak+tRQ¹xp<+wwA^f$OLB(ybYɱpw dJ|;[\Y29}`>!~wtU=bG]Yby7n"j7اE‹sM>)x+ 3s}sg);mX4mO&]?$'nϜ{/}ݼv>;M*@rw&#{/)gt%!.AsM4]rgb2&5M+MaCU CLR_urWr:eeIf&PWyKp3vS=C_ɔ/g\̛ 8p 6=&XsTb<)Lúm]TGr*7{7BuXe ӕPT ;ga-P>ƍ=#lͲxX.OT./c1SudgBuatmH v8b,Vs4^V9`XFVbr=)Bu n}"%5Ӆ4EC{&*lY"ֆɁTO2PU30K;Bfƶ!k 2RPTML#9jR5(B!Zkzb']# YX@gL? 7,P14 X /^uRM(LRzzIeGݻT \vL0ª5Vd?M7!8f84ɬI<) |zGV} [RrN֬ Vm5eEU_L0oj@K*\0]b<6^rg2=F!!%Aig!Ww6,SaL[ KX6,_j. xhL1thN*OE)?-ML}D&+}g;]LSOFUkzCñl ,_ 7* $Da#Z, fU G1Ir*=U9< ^FEy aJY찚˜J)Juo% 5%HxI\=`ToMdڱ=IO#`{UٛkJDJ\J;VO/ҢX !HOOCTx¢bPNt ?UNl݇*9]Bņl|?O_j(\ak+I͡ZTN&_^[VBXnI~ӆk,0vvb+׏u)4dB>ixxK) ;m0Uk-|cQR,ϲe\A bS<"*lXa8'0љYe異[819Ou[Q[@HP>ϳiuqjHcñ/DV <$GS)οжovP[q҃2,8 G[tRp!GCiJMǃ|2d=6Xyґ^d[H;n|hVb5Ӱ\+WDd'c|H۬cT*kԄ _L)̌K++ P*I>ASc2 y΋ c5"Ƒ?֫$BTP N]EKO^O?ML=wbq8p'}fvZ0ϗ}Ȫo) AtPNݻXuFBOV.ԫl%BPcedc 1pqyE}gJd2adfFa(FlJXn!0L\:dvvl sw+?"K 9>r^Ct ,w!qiAxO, {,ir\۝0cxn4ǝ[2_se_a8>aapʻ'7-hK;d}i(9tRHR(=x:ɞjfƊMCLtՇ IDAT(&GcxQ,kcf7'L[n<2 S(m.'h 9^ވP7Go&A:a.'[!)ڃ4%N-`BrB2caPr{Y$r88-Kj>Bԗ*]y2HMŌskdӍ"=eԶ_3ewБ k3u|7l,.PܹU )\`PXP$Em.gL ~.T*RN!}z҈GF&!;LQm!8[oE" EM>rbρC{N 5ͨ58$ťporK<&} [08 HHK#{Af`El7yEvH2ڲUW(9tTcO#a 7CH/-ah!3=I2"857חkUXb`JS"\~%ZPf[Js. :kGtMGH(bϩ+Hqa_ i(!3 9l7Pš#QF3.|vc,?$ J}8ε2ޝ9B~! OśF/ BS`ۦ&$с19q>`mn;9rxݎc*P,\mx̘fm{ Q>`GF%^L?NcS/ϒp~F='#EA!#ZeыP9\Vrx2@Iƒáפ9JQU&Gyi,EeuTLٿ[$9tV5*>ye+yqP$ 5P(O&+Tmӡf:yg>劐]Yv3dfʌ qlwa}#GA:T4/b0_s&V$9\˛hrj݌&z~+9I ֺ RFPUC}[F]p9ݽ{%QxToE'0DXrNxʒHʞh;{a,b>b;! , E8D}+ F`Ə;}qLd`q|mΟ 5PފNp:&j pc5BjG|PtR)JFf6-Upa2]=E#Ei(J@*=_-͍t诖a|GBYo4hjƅT{\7b&+0_cC=Մm0ah\!->k{45(P! mm燁RW/bNmWG;)+=a0IcL^<#Ȭ^qy.9SmgyX+:plc:Ll:?-AD\7-f!_kcĴP;F>;@eIN*šz<:ˋ`߃֬\S&bmUHb({tJ:kUgIUW1k0Ff9F+i;h1io5"'aK?{5@.Erǭ߯:L, '>= ?yAJqf=zr:Gb.k,GFC3 `HRP5X\(zh9 C 5̳Snb:uմ{ӈU ?}DzS]xߏCj-i.d6a 4a[ؾ!7 Rb|yluSlg Ys|&&|u̐!? c} TT{.[VZ3JeCp9N7!ydF膻F’>3gBn{t0Fr<}PF1Ep4뫅]W+ KJسwWG"y,]aSprS$e:ߒ&4E0{>;Gam r2^1j@u~cDA݀3aN,XN(dZcaضc+g!|05Y0֚ I% 8/UY5:*y""Pgu:GcTE"tZO;EmÕem #9\Cu>._;ȤS[r޺[1g\%?m,iRd$af)fU=ހZk&?Oj̒MWXHXnPf7*9,qқ4/DX6f﫮 waF,'{lrH5]Os#z6fI[dQ8l-̠kA}+>͕xvK`/уe6\t"&}hl]nyRhP;bC /w7h&y@S]R#O`> 3c=Pg&{W" 8z |-Qc;6@FvKGoH,qit.GTn? w{'9x{/z{zAy_z{M{b+|b ϓ[pRe\gabuE/U,Ycoc<6z7=a-<# QfaI+gB'EuFsQe |5rQ~`)$$ψFL1_*XT󟿘_F`8P-u89/ÇqwA4 n_9T*+Ҥ. .'a^8{"2)YſϓpiD=T < {nB^m=+ڲ<*NL70S͋+e̿7*AD~sۛ둑Ĵ 4,|k.g(36߿M(SGjR_(;ۍ/"^`"$)b$UP5^ 6V^DC'LxA9.xHeJCz{{~U⽯+_!9(J`Ukmmӯ_Z5]h'ŴQm,QIh@xyO`0G7nC.%̩՞]UzsR> !)@ٌwn~=flZ~}5rkS 0PHTc"L^ TVճT\rQT hED) '>z`;gݧQ9KE<*^ˣL݉S(<ūbJU߳X0I3i͖Ɖ \ɫdXjN -_<ƈa#Spma2U*"orDnA޿< 3$(=x8:$aI ;v749 i%*O$.6G\Aú=,ƌUG-B TكX%٘[]@}iXؚ~fZ` WRgêʒ?nۜ0b s9s9g%gA$g9Ɇ}~o!jt3\|9gjUZVzW R`?°1yŶ{OA|T;2n `kqiTfiN 31?=rSvz/F B1ac&ˊ{`B=͎)ET#i_qCmd*g)+gz9F ٤9J\lUؤ <|(|# Q{`ZYAؽqB=`H)DjRU&ϜPP2) &h=ܻo~)*f`2BΞ=vb~}GˊTQ~&.aȡqO$r cEy`⩘R"*#}o/V݋ \esxD&y.혇) " c@]bm|.~IH Ē1s&\s&#(1lTJxD>&0}x^,j{ 1f,ں߂xĜ?ukųJcԭ aladTYrWO\*|642i :W6MD]bh.SF Ks.ϝ^TT.*ȅܿ/zcxxi7toX1crxv:Q5H5]n!psJ+l[X?ѥA1Zb~G QV=1eaJKP0f`Y|߀8|Z+iسb mމwՌ(r5 &b}dbl}rE5 fwP>a׉g_u;=hJyS. 1?m0qȶߋ:Y|RA MM P}P'V©CS'..xK1B q0GTo s![c s2oF#qy?оM,?r81h4m-.| V\B1p"{ #ivٍپ3VPonXBĔ,.vfШA=tž+Kj!/=gGVQ ,#7+M0x/?Ybn}q.ӭYMb= 쉏K<&Sp]߳#K#0k`%ؑ3 uۢ7P.qX K`~l9Z:z| v84n'o>D1yW#ѠIKl;u o\żS0nBx~RGԺg~~ơ+JB{מr OepIjaUttj X=Y/T ߉dƵ$ (lRS+%ֱ$NZTeۘ%p!noJK q b٩HĢu Zw2bíYS6U\cޖ`TBidL&6~ DPKx69 i*ɇKS:x4i ^d(UP>b$bVI_V(Q ! piƗᠽ g:-ݵ.aa2, [2&99ʮAFfXg;`eOW&k Z4m'ADG{u3h>ix)C0h$gMN, 2/bh |v}jcU<C`V.|l\P3>m ]Ѿe#L=8Tc.cۥ^1=J>"K`ɛ\,?2eE𴿇51oIT̗<_ÑFƘb󋕶:Ѿ8&+"#C6kmwVM"7:c;wӽ?@э҂x28ݟޒW@ecli:)ΣQ^FZ:8xǞղ5Nz+^K ĹC0l <3|<q[T|egIASN⅕!7)wPFB74kgďuqDR<ɅkKE 7?nmfb_c;a֮#xJ^L\r֥?|o8|W 4жm6vM׷0Ʈ\d\7fG\|`H ^AReA,=u_ {eS1۶orG]K+<C:_!=xֆOcHY ]`Q.؃TNUdѥbOvhZPhР)K k ՅhrF0-zh<{=- 4{C&M0iF`_'  I)( p4gh3>@<@cհmFcHSéE}LC@?3@[ NJP~6 zDEFVKY!#{b VL!zp8f"hzigCls6u0anDVYHoT0:X\#{q3 }O]ѳ4;TVs3,CV@HʛjaeY6q.U/OvncMrhм=0E^6LQ~X83F-]pDweР7sjzrÍu09M]WE%oRGg=i?3 &e22ڡǐqOeXd,v_tS;|6l#;Cmq~|W^训Eoi_7W'( IDATxln$L0bBi~. `zw/8)(BK&h5m{q<-Ƙ(b w?anact_PSQDïn9h5-[/DE=0D.f>s ~:3zKvqXH(~((tz5׮+mii8p:89pu-v{@Jm~;~1DvjRu!Cлq}Fs}CgJZ\wr۩7)1FAFtoB>77oŁkYlPqA獃;*1ٸ-&R@:r AJyAn zԅv{ iEoz5kqƧU74OmF=xһr:,`z}#jt™;J%,blu(R_4k4] [,>x i k;iT|z^У]/e8n&haH ¿ޔ}য(+ Sm8Nf8B-U1g$ g }], u.r3Z8|(Ũzho*ơ0Е^Ќf}xaLct4Y͈ö5K8CvI`ZݯMjgtyomE g{6=ںs!ҐJJȤ)aݸR\B ^PvU8|(yF4 4кa.ZBI OeI,Ew IRXmU>}x91}a b{Pq()}ѾG\fl|Tc _ _3wS3LNEzzZSNV~栩A" L|b [>I]ɫ'x[lPch3+#뽸;&F(l 2C)y GaM? KӰk3 -LN˛0#'wTȟo}ջ?b6SÐq8{4Zh3.VXY #gxW=~6ЦmgleA7ah`4ϼ'1dty7ϡq(EAIJ{x~v6Caz4 WOV0uϨ)aq[̡F_*OG Pz4x*l*3#06ɜ/QNƃ' D+XYͻH$m- qB`uSЬmWTߢpE:#b7z_q=x=`r4 />Y}JBA?Η"Wb\K;L@*J:ÊѺLͽ#\r(v֭G(3= ~dcr³Gx^ވyףC}yR?__8Kpwn\ ;͝_, =oOىZ?E7[0AݻagZf f b̩e2FqQAw]ja C7iw\ ._0d"f͜cӽoZ_qc]t 5tדw;/G&㕅ؼ|&:B{m42@7́qww,7Y0y0 5 jdX.t6Kpe8x 1N00 ~= >#a"ɯ)xѓ)uBaOtc]7/Jib74k4ja٬Б3X>#&ᩛ72epsZ| <~|{C6q>JonF" FCQ%v4ܲC)'㓓AR:!!{As7=x :?#<53]m\xB35}n?T /'tcVPOXOx_5  a :#Fo$"IO- !oSKO~^|X 魏vuTQ#[w]>MzZڢao 2XIoc.W\tE*bzS.n2s£dGΗ!&3 ,8Y\ȁF Z{4Pޫ/p#\_3ܙU :t!׈L'{ yՌC^nR>#4(oIc"R*!0/ޙʜbMNyg7ŢJa7,x?׫653 tٱSpxflvZJ)hm܌x=P}!]'ѥ2l%ȢԓvCc+3`oHhjj [[z8Z(Ey򁅹~33xctvTH2clk!xp t<|ݼͪR"BK+O˭'-!vUh& v4m)4JrB% ,|!iH cEVdooL%3uTm v!uiсe܁S)pySJCؐ)M-P1A;0\~oYi!"^qfʘMMZIGnf*O5ڤ0oF#LU:/) 7'SNYGHdLwcy qjsD4Ch>Jl0ETFeS>Sm <(_,D9Zj>Z8p3&#`m}fpB$D*`ʴJx^VZigT;s`K}P3LxX*u>㵵RB͚GtBrDysTcoR%m18ђBܥ|mO?S+EykW3৸pwo^-K wa?\`0`=˴_泆75:P5:P_8S ϐ/^B~ޗwLXAhaږ]Wv+XN /jtFuoAIq_)wEkhY\jtF57kYjtFt80 kT5:ԁPcjc@BjCRB)jv5:m@q15ơFjtF~_8de⹫3?'|K{pugIϕ56i.F.5:PtB`76lRb ϔ$'mJ)5cYTjtF]tL>63ơOGt &Ÿ0zưRcc;j\?->2v឵+J}?F8:mqͫz?{:22!_6wG; (F_Cdiuuq>~^J֘_9}. J9i)~fmn~]%q"bG=e\J Spb"hT[-L d_'BV55 dr ha?Uz_k-X2Ji_,}tե;H*Dw.z>3g/ "gvKm%|5CCY^7\a/A٩X=Vo?%\[hq{x sĿoM7m1o!Od2؏BiƾG/nD9\7K$&um}) tq:`$Be"48~|QT}ri{mBY8peb{yNeZdd?Ugm~T {wTL,Yi"ZiacpaQ>?__$X/ PCxdn XR[Ș8Z!G*?Y0L +F%T(e!* 7 Rt03-DKV#eC84°M!+]kiSKӌgu]mD^ G !U^ *5ոCX_JWӛ*N02*ɱ,{e&E)`b"cĦ ?K"^#8c)ABBW.o//$ˢ"g#Ut&;U'9}d$G+PFb! ݘs[%lA=>0)z(U,[vў>.m4 XYE䧦8` Y>y 0EKV002Ąyjơ Wn$Qr_4or {9۶fIp=tQ);nNĔNc}mk-aYvm[] }ld2ge Mv[iK"^'W{ZjB6mժ ;wK a9J>gs/C,=mHS;nZ cfbY`[b20h =0fb]=mqtN`*.:$ܽ@_NM;$ڱsq%L foX cg0{PghnЖ5uw핉d%3#!ۖMAKb2n^oW8y Y4w1~SWC~}YB笎yjʻ"oN,ڌ'za(X Z*pR< s& K:mZ-a8t"罸XW AAN2G%.ZElYeQ=f^zrP;WO%Hx` `un֭cD3#۲6XZCC3BNnnN<ڨ״zC=z&ju|>k=ŀ.s1FL4! c_ rZ ~Ϛڰj&;/̻NgbL6 +JWrԪkOީZ\V@zKu0$3=߶mб{X,D o©iRnjгW?<`eeK0;BWZZ09VR-5h_(:VRW1dyEyjjш)}18uG_&'*zֳ['B. _W#.%VvwҞm,Vc~fCAFண7J"K0g_`t;'oܣ~Gףu4]=wѧ[;̹7'.u#>9EZ)no^<'(9\dT̶hL s7r53OX @Xzxt3w;Rn\sXxϬpN>O4ǰV5'p =\s 4s1}֎x f7I}Avh<{>k1 lL4\=5= -h޸1,\,_{B==Dr>3c=̝_ &.I!8o9u탃W"8<cpU&iA@we8mjiyfw/`젞hե^݇wE~lDte00?p %TZaȜp񇷗'n^9͐~w+<>[LAbB"r;᪳9c z1)xm?Qyk$λpv ьFKxN,-Hq.81Mff퇦ǒEoqld4gx 1MM6<)8:us[QTq1~@w5HZzfyK `}ƕw$"31T@v2䶸vf&u0Y>-.GvFݱu%"&9f뎆^PBP|<]W`⦅g7 :R}Fo<`6.DN(oZ]MP{=w n d^ymE ֻ]qx_K֣){^][|8F> ݇Mkb*N]F[OVkc:`)L^}ɄT)P1_G;8A- 4Ôې>(}8Ȏ\bt&5VL6BQ3e =tqasl9\F4z6@QiϘ,AGÑ|l"2e޿Eg׫="~Wng0}}NSg4&Ji,\+uk-P'"ٹ%BJޟw16LyP.'hդ45Ksp{l4 ݰO,% X3gw0sTe(%Wyៜ~0wXy+8^*d9Yܞq54=7vĢ=3֯n<ܲr~)DWb.WNn$s[\|lKV=3^ ҳ>b(gX8\Qg-LvZXN$`s\ U^5t݈GAg8U}i8LȥD Dz^}^2_fvzRq-,BnWΙl\2M[dcԞ?{-^eJ4h)Oo~dͧҀH i6CQ:؁6mte܉ s":8w.Eˏl*5Dgptl4noD#SqӜ4la\"KX5: nsb=K;@Q#nmX K/Q@i=~ajgJbw4PҥKU-qu g:j}$4 G_P  !gQ{\YID^РaKw Jbq(%L'CH*\R9Atqb@s(|=;VsXySؼ-@hTy#H%p2%*\4˜I31o&nTjr7lTV+ HjcBNҸc5MOoԋLaһ#Vvw?(!9}QnX{+ހv1x!k?0oɗW.'P~s"4"ϥ;FpyZ.+Db^T .ݒ3O6W‡b;֫Cp7 ǜY~7TA9x ܥ+aӎ}Tt(7~a8f0z&m1]%o+[KѤ,)(ñsЄXO*Z] AB//F+8p %8͒V{%>, -Z zUUެI-LXagW57W==wbk;9 /V'Rsasb!՞ U'HeDUzw.5GP^XT~.eՌCƫGk8 Ѷ1mxT2KƁ-1[fJ \ ޿{A(5W[4fkX3S)V9[J8Jd0u[%4҈^W_>yQw7ͬ,:YD9BzܰڪnRYpxhg.莥ҩ=FMG:ÑH4X֧O{ݳ=WDz{)3z#"8&I4SޏwW]ϭ|!gfDa&*UV@3{nmcƵsȇ)j+o 7ĕLGa =kzj&[1? b#{7. i`aAܿ4sΚMoD&Ck..4b"'O[]FP,:@w/wMHx]Y*ml\=U ?]A wr_nF(ukEA#!dd'ҮEh7!Te,_ AA_HG7 s\͉) I$+ᇋ֡y&8 o& Dy3+.JXIK"19kbM|>*Z6opp ~_xhѤ9_xs1x*AĞaT,M'=ED yw,p8Hee%cRO hd.~Y!cS0Ksa~q':rqv98^=9qp@#C\a2S`ǻ<i5Ta%-RLCw ap- Si/u<nBh޴`,ZӇUh/x'}]cDLkb[/\ՍWފϊ&hD 9(Ii047_8PoَM5pS䗇1c/E{z9:C'cql8w0ǝS`\&/ڰV{2/6!;P' AV֘n.^][cepbl?=GvC~cpԒ8v%v^ʰQ 0nc8k q`hafU1hgw/E)nuj2cSV/%pV=w@,qQL8E ]3yW:3sg*~ߵ4nV+pٸ}|9o'܍;xnŐCaWҡ2UӢ1iLg/] .0AZ8xʨg6x^RGx̤l^0 u5Eq5lZJMW(׎\ Zp ~^2^܎!4Xw-]?v-hdߕP}+jA*ݿ};; 鸘7^bnk3 nUa,ye=莑sbn(5m&zUB[,y Ichx`N5`2s)Ҹ+G߹B[}MaƃKB؉Fm7gMŠ?u3@iG͇O}Xw DҐ)IʬÁpkw`Zu*}%L&䥌) { <'o^ \W1p,8z(9b@.v:K50v~i|&% bJl yOyI[B9ܻpvr8hCm+rhbyC%0tE72)@%E3) 6@f =saezLi7bҳ P8n.>`\zMZ7iA4&>A<}Α_ۃ:Pw} Z_8HGb rs*_ܜW{͂뀄>,`Ř5sfZb X)ooa%COG.,:^s]xCzzQaap+Aa5ww7;gFddlmmbgR a!}^/*~h!!pdه`xu+DD+ |̒^|E5lmBdR(OhRMurrTogW9.ո^8ȈoooҥWI7W/^Pa_B '/5JQ2HC)D'<y'F.#} YB:Bdҏ=>.VCpค/9+|Cמ<Ș02O窶(O)r'#ئ!}% -}rS%uCd+y NN,ݝݑuAn3+Ǟkkb_{[tDžEԺ!z>Y"FiSd"IVt|rgl+T PtO#}yK}Nd <P@\x(w" A^^j\说%,ʸ(;[$U=.eBU/tr1 J_lS)} -Ij*ʸo,FҾA5Pe U$e^ +Uveܢ;Bw<'YH_"y d\"KU_aʸ#u[ <4d8T}+<]R2d"_tQoE ;SW9^yNtS#;A42N@-}}(>ɸDҎMCYn 3gSw,h!ֺ불/^_`КoIV矫45o뀄Uѩ_%ӧ[~q>\Px 0 :rp:U $u[)t.z4pvM-1wnĖQ?KayM1{߉xSwG92+5d]<~00B.`gKEֶqN&d XwwJZAhezobqȸ/-Z4ғ߳ry@*~<5. pg~,N|(ߗb24:V#}w|]8GX 뫄a~t |_(_m1{aW=uz YS{Ar%uLqBF!tGVz =M߃OdbYn29/mtnB탎&=s#hk&"lcʯS67зsK,=} , \oN0:|UKko[<( xpYITϽQ&ިAzDv%p{zmXŻKɼ-#=qaJ?-ϞKrR?;3!Wd h۞/M 韄zU8Bk~tH%j{U/!.u5x!g|O oV6|÷2oZ~SbBpBz #SYIdGRdo8K_Xm((בtK7 ŀj\9ˋU@Kq%U˅_VqB@yxpVĢ dry!0a' IDAT_"Rmĉ'q~,[-®'btC0ػs+Yl{ոxIzA^vصu#/^vVxBA9 .ؽmŋc;AR?jᘬLo`J n68t <%xjM ɐ*wC?/=IGd xx)xe8kv?t*vrTaMS;dr{Oo=X^3 ='w%dVB;wbmv רtj5KSy1m<(xܞbMJ+׬Z !e'EbT͟xiD4ACsl!;Y}1銕x)r6jm v߳x"nAHT2Jܲ,iaY%ٺ?9z (Ir#9gms(J%I Q@@r9g0t9sA=̝ϳ{jUUkwOoi^2,n];wwVD[Š,CcMر\~ gc->!,Nm]U)mێW ʊ ->P.%O-ef'F#|iFɣĸ'G|ˏYW>)pu‘{X o?AAI6%y&:vt̸W0;s[V^I}wwA ~,hn}--go0ѺJ+(_:`K{ع 7׾JQ_Nv PLh0b ̊q̹G]0لK8^__~O!0z+U%07;QЙ4[I!#q=$2'ibmA86:y(V1y $\^Nb)ص.esD&_BG=$b>Z s,a8EU荩5!K/^,ELYxZ@N*G%Y8qΟ>7k| 8gc =$e)ڙ_ŁvDzau|ÈX֞5CVM==AG ,ol":\+U?wZٿBHϒ馚f^m)$ov8ߴ'jAV^ ?/|@1p41 +p=w Ξxz̳lH(:|)S_0yBP?kCܟͅN\K-3WL]LjST"dHVեxH<368.?E'a>nXjV߉ 3Ruu/Ȏ"C]:];c4\vF6::tT^i ۀAIQy,57D},ۀ䌨Rr"uYF,kk\[l*UҀuH :!:ݻw0^?kd48~ Jk:΀!4E[F;n+ʊɹiev(_M E+EM6e4e'-ȧPfڢgzVP07, fwn1`]lALY{ Y71 NJc}w^+*>%o˱a:FiNuPc,:BSەûZ8=4nzQId%' Z/Y=3B@Qvv#2199YHKII9% Ǎ>\O݋ld*S&)»)hR2 -NjޥN_`-OKqzny֖ѕ:f<0nxoC>s3xKjiDڋfE5*N%Y h9ON60bAT4鸏fLKACSC%"ȩ~FF o|GsP/E0"%f38=:kI l@PGar2 Zxrzz J.9hσi&QĚ5mAxIgAyJ|˧/IY|_Xe*}L߰Uv3=cp VDI4wA1x sX vV&`4@p$ڍTᤃ7M\]'Ka ma8/ۿ#@N PL+9@ݷߠd!sVUYq|@T3_F 'ADd?GCf` lzz:\=/Ӭ6օ#\_ySmMPq*)-86&a kb=UåpON=8i!F9Gmd5Q2xv\x7b|@@l3JcT'jpR|G]nI~?aPXeb'H,@-SX_c&FE8y&7GriRlcЀ!x 聠oMŸzf' ƺF0'N?p M>7[J( 5GbKYJ:)kսW6;l}Q"0ʸx25T'w>_ϟ?΀D3)´k%xN*7^c<"L Kl?CX9 3p ёD½}0rdy׷Ű_ЗX#Ǭgty a|-l5wl8h<>*')cT=MU\tkjQFTA:;uKyw[[%w1jfↅiRS0upUZM LQx@T'6gX3w:]qD8 %߿kBFDGp9!ߐN_W0~n /],\hgfzy(Pj`֦T:q'k & R!-W6$8U"uLR&&݅0򊧕J#r3"1]cQyK7ʪ4?GyV̑\Kӛ5{#ޤe!d{N&gi_k{oB}2hҫ^f64{CC3ӟ7 IFE/-a%xbǟ h ~sL[9b+i-1MC{Y845a?aڕg^`fC:q2WN3@ԾOP\8R s-s:vH9T2QSgi]{)hス=2ssæ2i)WVW7ҌV`H(<ʋa.X}|037iԦzVK@W;L\f 2aeM;2[zt/ˤ)cc]~փ{``Y[胅ab *K`:h>~р\Q [@fwNX9  8]@wп 8yTޒi#.6YQ=0{NLCS!̯ :y ϲ.v'0gxW+A&D; ;ϛTSc$9+i*2+ĕо~Ӷ 4T -kOB OPZ9rd>ieDuჰrX/ ԗ~GT5u8sh5qN%uWtq֘=yb&h4OD}\t`~QIp xxz|mCubaa :E⬏U "Lyt dKWXC۳xQQ|x߄ ;]`ZL^U4$RHïdA3״Y9@|Vr?24epw[p}$ nȜIt[7DA#.ȅ90iZf@a0f]RS9Т_ aҖ{A}wꝀC 9̶uoTCMUlD:a-rbW(74 b簓|#/­/E wA_Mr |oQCb͸wq\+5%T ]CFEX945c-2m]@%&"91!OHU@!aNG;&'Ejr:4~ kV.$;giA:'3 o:#ȧsy5loCD.*i; ]@V&\N_Cr Z*+LUL! vu#z۴#>NEd'[2оG,QT\at7 r5 )ӵN啖7S ɤ5S0cV$TgA5ե;gHv%}aFQU4cL š:˟֨&,ޫ _I6JC %EHCF㦋7⒒ 4xP~|zꨝ-Nķ% tpƸ>N%qO)$PIxi/9'sh*6 d:Y"1&G}O%X6tD eL/؝QUt/cV|)vl# Qw !3SH{_ ~|D}p5P; 3 `^?Vbrgwg v4!Iyܶj6C@k+q٘m7CP^qzFl)1mJP@FVNHɑl9R(5FuԀ`{K6 ؖdc,]<CeM?9E:1@G)`?z:cqgKTe`G+R2lڼA[g<;9ܵȬ)fMЀy8{/m74oE5PD Mpf+ӵPl7 49 A9Qo(kEt>@ (@m,صgD uezͳԤBiLEt5Exj~jJP+`:FҦ JR|HBdaIK:M4h\a`OVlYxdTM}رm;NC&'?!?NJfZ]k7;%`ۋzmf#rٚ6`d4 hjf%`,7755VE3L Iw*7k֯Mˡ #r3pG̛> ʪt%6nڀsfBSQO׎&RrV$n*+BLl.&N]GRQ$á3_iS&cUN'D6o[d*~&a_7LCiL_h%g9ؼz1OonttW W%O(J ƶɗ83,0~<ѦlQJAw.7;lZǹʢ905(t)dPǹ[Vz6iBEDZ!6ST ,]93&BQIkN}w8fF#̺׮w3zV^KI CAehNkaT[K-|$;IC@Y-'uq:Dz"qJb08bڻ:LoCGK 3= wnOqi9|G`J4r.xh3\a aev-W8 BG Cgϛ@Rf\IÕi)^Ǵg%U2>q~QX_[՝__S/G;}SvyTǻliVӀHr6 xh&[mN2I}G%rc9DS8qެ%7.Q ;hFϘO8v(:<@Cܫr4h))/MV3d2QUrƙS'ZddaO)7@GX2}#vIDATxg_@tagq O:g>cV#|Vڛ dzNAPM ]_[ f03l͌ؿTyoArLz17h;u Ȝ8<7JR̋(!rK[y}\vi n[o:ա^E*iQ-iuȫcX6hWzKS^Ӯ^',Ïj)k(YfWk{n}wkk E;h^MmV,c yi,Cyq?j[.1KҲ|NemVz5Mx"CI ՛۶,ֶܷmWߐ!yqx[Imq$-͋qۖenɋS=ߥy{~qY8=i^|rgR$-hNg=/G!(86^<BBB`me>/`|/\}weiiIeo,nx쩐 S=I^X2p^O>}kշ9-ǏrqQ+!N\T'xEu8׸Gy|/gKbY$2$3ՋNSdy,^BYX 00N's+X[L)p<8/掵E(Ʌe2zݧp2J!ogxxPwXKyq "=ӊԞP_. 'A)&GHÊm@dLu3n$˅ۓ2|%vc9_,c_C.5Ƀ8::"::J1˄YҞ=eYƞ1Tnn{I^lB#9/@ u7']Sr GYX>NS1=ea}}^ȋe›+t㱠{ܖvvt2CP\/+666HHB I{}YSaZm{VT,ܽ{vEdry`yee|Y'XF BitP{'=Y6\7TnO.SἸqR|lWDpm($Zd,wnvP7w#Dp "cT;M2{t_޿<ݜL:Hu|G'x:DFZ1|%WcC1%!4eRZ\ ҀdwZo"8Хr}Smho 4HL'L(_EOLFl\ UQgg"8iJa0Yk s i?xb[ʅ]T[T tզ 2z -oᄱ1?ǎӸ yE-ɯp ãQ[W'|`Q= dK&.\2J;|CJKtnaXTG DR9L 8xj ? Cuvv޽4 3LێGFٿ9@U@P)PAZ\OeYIqvhQ*&NnjPSU.ܸ_]ɠ/.CE?ܵDY"88:IhIס4[jcN%78j,FjNB#m2".&9?TJ Oea*~>n ML ))$ͯ5sTοOD:Gi/*EkWA\ tmO6+Qx#_)>>Be*쁌.% .9.g`ӦUƄFH,-c324tǎI4(Q5~v̀4a8kPEJ{<ƒ3 -m,Z>dҨ@#7oo+au$&ׇVn=;'1^}$LCi/o~n6pH?P_pb,|3M&zVW" 3AN-*qҵp HI/b)89YXlg|!_Λ@ۺctAr7Ι!AsS`o ƏՃ&΂]UB-^܀,LP\Bxf%qpRԁ.t@ ^'Jb-߾Мd~'LBs .׳7v_Zɠ-ߥ9ܱur;~Np5"4&͆[T S7 Sg6xX\݋cˑs(#-+vą a2شAIY(N ºSѻ@|e/ܹeFc1@VgnZ]^;$7Z9p"8t!~J]wgpp|bzUBM QZ׎4[ %q YKPšt`-V66Fk,m!;7QC6X^ũxxh.ډjvKtkês E{ %Yӳ<#v8z߆,?C^e-F$_ܧ/;W A_y܅X%4u/~Xu9 ӫ7fo:! |<@`THͧۿKp@u>Ở tGp:K잟 K0AO 55u2=P][ ۫U'p Pmq&axUT_S~!NCF^@{Un_wFHp^#XiRpp%ph"8 (@:DhZ}L\sH̢hscC-1Ucߵ@Jvx+:izš?f88ANd~[~Gќjh)SZݗ-Q>1h=f(tF`T~=4.?8Z}hd0.uv r$"-.Wcm!ȡp0)]'ȴS _Ф\pDisY2`sr1[*4U`b ՙ*oM\97ص30mYܖn D7W[q`b`gg_<$`KN^vӀ荽K!M>vH9< d+7 LQl4-jʚL~S {P.)( Ab8 t]2l-/+KKJO@ea0\w L?,݁r2paQȓ?'tr8xu:F^R*Ćz`dh^dR> (MG\\j`d'1KV"5zY*Vph.Kuaz+8䐿&{7G1H-mPc E^E:: TO8f%qS|Zg28@BWNsƈ,TI ry *õ[ȩ)/US0LA&7XhQچEeY옏a8F>xA+5Kqx5F蕟/{Ur*EUڑAMXJݫp|!Q:\}PZ^XroXh|n(ꛗI ˥%ٰscGbƒոv>?;7Y3퐣=zbć{iG_8eyj#᤭RN>gAcBx'U >p}ꈴ|=IdZy;!<< ~ްS7WUP(5h+ qgVR{QDpqu: Z0ؑ^ i3;ɽHQ5͐I3z9rq,ȏV>4Ք=q[9L2o2(UM-hkkBU]VN(oQVUe%hń 3`K&j_7)| 3aHaMJ'd 5WĢ0c&)2\(w9?m^W1gx TT!?j&Z ^P`W,3zt ,3 sa nORׇXL(KQvNqp sQS:ttNDZ6Kbs'AYM&MŎN*0 ۏPܜקĕ8h|rZg_[QtMpe"4/_EmYBTbi&*#`YjFr <= 2IJ/"|_xUiE2P:yx#sqqBG"ƷKM(}S(|SCeI<_bRPEo<;HضLTU^7:xyy#Ml,PSUB߼;\huAx>^B5囝@QRMKm)Key1"fҪ4a!ps#"&甞'" LTXQP!?gʏC|R2*Nyx"&5//v:&0Ҭ4(}^+|6HAB☥4_Eo&^ѯ'0%' >t䰷EXpbG ;@!I4!`gvgg"8Хrt4lZ*+)FLt$^x8۶8y}TN#O KFtL.޼rz :QC3J MԫT3U@w-80|V$~Vb~m*"8: ꀨt@Q):(8[zgbۋm/DpAQDz+rtPIENDB`fotocx/images/mosaic2.jpg0000664000175000017500000007562515247006660014353 0ustar micomicoJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?]^GOƻ?TS3)uU;C_܂su?LMr/6H ^PAb? Η<$40շ(9+DT *) ݁8>6]CW?xݏ`p>Kt$X\B61^[-m,Q7E]sMb杘h~['k iYN$`2O< ¯k46ɜT|<-fȧy=i걤 sʽjiak{Od[@uqtKG6O&׉qabqN`ޟLFʹnq]c28q )ٷrh1<\cr>{bO$n!bn_zGg y$}8oV}Vv*י.┢:_ziƒs)_A#rI?TjI-|Yf˵1Nq5m+e,0fՋBd83OQq<|yfvqqґXe>t1$3:&wMD2.4bBʨ,6LC$&ٟ}Vr Qn)hci k<v+#q:jE#IKF>Y@d!F>Qٔ,eRܜVwܗIt&\-ʊԓSKӮY/bJƧ LӬgݤMw5g)v ާ52\q|KqonH'^%\ѩn[+7cQRUfC; ϴ5j$kq9[{5ʙѿ$⨬"%ẞVYcsMnbQ: {uɔ\8oVb2O$׳rԯs$H2ʶ9/ c*cmnmWF y^E!y+Au@Iu#:`}p2 DG<fF -:z/=3d<̓1}i*V a|Y2z2\tBאo)l3$屑U Ҧ̮b34V主f;Aڒե}rVn'Oǯعܢ2،-O_¸|mlVkRWw3ߡV1*lCx-9aqj{] QuUAQ?ZΒ($Q I!$.I " VQߠ+ϝiMT5W|ҹF6!9~=JKRlp(|q\EI 77M("!r7椒)S422OeC\auSQV?j[E `B3Ϯk}Srэ=;QȮ7Y#w7t >eڜz0@K$&9#:rK\]ծq$_Sh߯O&\nԎY;\Gxܒ@ҫT}kFi+{]\SCfo<-cDV\hlO޳3rXNyL΋[_MR(#1UO}|<`}>j_u_sNFi[CIןZkXhM\mTE.OS><$`KsucڸW񟈇MǼRuWvZ$hccDT՗ RoCSUquee/g}h&AT+t5[X5dt*1g%cE.OSuf}za.J:iT׮26%{|?Σ_x +_o]vPݴl{`ʘCzG5ޣD ̣-.vF: ۺ`aa*ǰNMze0$uOl涧ֆr(/<+cM:k˛S՘Ks"H{n8A]&7 TrE [DYel`;֩@6fHP`*м7=D}9mfĞK!!=0zQ$U 0=B$UBYC+ UP< uqi >(Tlqֺ Qk1E5r@'9& 1Ci]~Owm UdId n};meXgG\gv%{4: ( 銲;Q` 8WL#]銧e)it7rTU8Tvvr4q{h9v(=O-'mʬ0_jE&x<#lq;Տ"5$9MEٖ %@R]YF1tQw+!R8?žT/,b5"EݏQWz<1n=Φ"7ƽt>\.9ڱ5 oO$n S# ]jy|ef P3^U}4xcZVNs אsˀ յ3I_<|V- jg1n70GS`1+12T_1J*1:¬Pocgƽ9幟%#lWS?)$*Y_KCXp9P ڽf NJ9E8Ǒ\̒\\.Cbi()X/M0 ƾ%[2ISu2iVNz\Y.tv`HZVӇ6fh$,߾] 3K~ic AM=ImCo=M̨bΠ9##U0$.#v<+7VQkI-0I;E,A3+р[w"ʼʣH$}9͝gynʕȸ=q4w,I&F j^݈hL8S;q׎1Moi qI6ݻѶӎ8@},o%,!H {Tv\(NrAB^ac *{ˋK- ar094b1dk4-FDRso#@ZjQ[߲;*H)byG=?*IV(Pq|F9ֵӚYDiH8{֎r60k4+uEs$>y?1ʜq/ #x;K#5<J+{$g}׶sdYFt8NI>GӴs :{@JC1I#99+vMX|ȼֺUP\8=9c[5.5mH|E*::u`bM{s_=|jˬ]!T̃siu8OCqd2 Lr+{·JApG[ 8G=qPXi$dEhnʲ i4syʌ]q?t}8(TdO.q<#`W]LQ^VAbzӏj!n;׏[j0Ku$CpQjg^rֶ_wJ?hyiˮ8Vd9& 3rx8md ݴd*w\ (Iu]:"g„}ųkhy]^7p0iFz.}+1 q[eb-͹f@uGqjbo6^HhLlpp8Px{&y2NA>uEѴ`&Ʋ=ボ}kǫ9NZ©l\1l;&P! z֯ZBq峄1ϡ9lYE‹?ǭ^g_0qq߅a)vor6 ߏNJhɻui<#Ib${`c1N<> }L-%2<sxkqF@ayz{=hOs6o ~̠)E-F}3#FX%Nxk5@7 F#=kb 7֓+-4dg:5/ *Fb $J↱ub\nS_bz%nb`=q{W>=zsn/ۧ`XQlU=U+K5p(`_'/imC*!w?@ S[yx@ud,2Tj%NyCTޝsTfhed=[\ 8@G<}O:U@q >2^Lbw( |uH٥X2V2OSX^#̗ RCRG#ǧ9jxzy!"F6z6~iT S$}0q+[BE3&0H]*}=:5yӢOsR(-\,dI3 c8V,QHUN@Zɸ[<)n\2r}nַ}ABZb D98⸣j9Rbb#jAD#W=1V%]^\ڻ5j"yn/,bʳC튽yz!{ 6y 39u+G_~3J+I9#-s:MDkh}G,ƪӴxw"Ny L '{yjRkSr{g*qU/5!d+D?;:OGP;P%m815&mh] `_=jc 4+x֤9LQky6f )٥+mj3v〥0GZc&˸L =8jɱY+aG'r4V!AΓ$I&uZRc9s:cJ_\mg URͬV@9'zE44z,nbFx>zҭ'WHܴAww 5`Mtm# 6FT ўⵧvjwoAkwBR 3N{γi|\xAbHں=MF8̌8Ҳn|*l.XQ/?YYR^)x=WSՆqfHɿ֦jɮns]H^ner&V=鎸*ޛɣbio]qϯ\.jxd9Xo-o5˫;i[X8Ls޻irj]6lfmX<ך{PǗso2OQHÉ6ySG\.B,{lۉ ֊U&%N2¯簆X3*8:G70G=4 w7ץMe#I\z0vW`H )ddWn8>YW/(8 J %cB6F0;ӕ irąsA>bJbYYp=knmSY $·;Ͻv{t~Uּzl~ y$?,LMr=)7˱Iv3 >c\ b{)9a'y7OZk24 M|XL^iifa7FWj~۫]$&(䐲(}+j.q3,$w>hjM)gbV*߈`y,R~nOlc]t0 >um\v( G%>Atߧ^!S|W,kMgg Rs=@LHAH~2"˪y^k-[x~#]Bhh1=Zh j0|G5`H|2Tw=^}Ig,-&HW_7 #r_90@(<p9 _kU<۰*MN,z_! gC62:`Nyͫ&ȐB1Hz~<Ԃ 1kG@39Zu݌e6v-)\D&?mڳ.F1V]2'nFFןjXd *8psWa2}<]3gꃊ2f8 vӜ[f(U9 ғ#C>w3ViZŲ_,N@?\5kR6RȈːzÁ]oW$ex˜:N=+[i## {]Wc^MN/)26r$z]>qO38* .0 <<\u0)M?Xl>G 7gTm K`F>zַqjɫhvĠϻ$WӵC͚8EF8ܙe('(YR[.) 7w;W;krZ'MB A,'+k ,d~sZ6+52(d3i l>>Q& W_KpUItkN#͍&*}@28ˌ?)Myާl0; _)@ v!@m|9R? S26Zmney"])$gSB18*aY]Zb,/=Hh+CFжRHq = SXYsu!72t{Յ7w{^9!Һ5N)y2 \NSyZi-]{_[ͣek{Fof?3 jYk?GE1YFRNFP}| 皲!L "翋 }0I8ךu[e۷a\/&uvyfE"j T"&|sZП3)[c?Su m62h =랹uVhdk^Yb8W7 ڌ鑏s֥aVVt᱿->15w3ozx+Z/\RG:ץXKi0 1+Ӵ(7eǧmKF`(lG tyvtKCEg3|k^q{,D"OHɒe{ƍ|ۡ91J^Z|\>XPHأwҹ4)K6ʤբV2A}^eJvN/^C3 8L6^=nmX B| $j|Q{W~ԹyԮ0Ms`|r?Z8Mid$V}ϱ%zzM3PiE#4(G/;v䱺O6>B3Ic'1.O {uudn#3m[Ί p-T)$B%N0Gq.IVuj ̤jź58;;KYY ۈ=s-g$rJY~MvsYךڣӤӯ!Ӯ_"8?ZԊ삂0pgOy㩆q$S470 };ֶ`XR; .Ab>F|[0:큟Sz6eF(By,O~z> ?˕sgWJl~F5)%C`:\aZGxZ/VL'zsXTuy|dgvqUyh7 clonq'>MnAn,*60׾z{~)ū Ic4J\ѴjFcyp:j /2ZS"7oW uL(VVK*(,sqlۢ:dr:gJS+C=s=hL.A!xVm{i\FO,$=:Wշ$O.b8<xK-V#I&8h>#R!- A@Ҷa>1Mɬy.n$[>Q4H4mdZQGl֊"64tuXlV 8'=@1PP6 2[M?i_7f~p=jMBVBysw>?$6fL0o3n1ؓ3ٵ>fXN /V$H]N4 V/4GP3mkm.[auvޱ|g3}RZ0ȟwe?CUQs$~!!Y$G|BxbrwHQZEjVKڟ0۞{q ԬyZ%,oNj¤Sz{kmGt$ǧ%̚\e"]̦4f #{ 2k:֡culHW aqV}I)n`Ü}y]((N=M7I 6qsnqZ,F)rz܁bLMQ )128&}:&vH`oOZ5irҵk=j[O*x>T6{uKbukp~ܟiUo6fi[hIju=> 4vp;]̧lyg$ ~ѕn]ѬmjO퉓%OXI1 ܃皫Z)_*bKԞJ̖R[naU9w8~p{T`':{[;#d$ jb8"=q7O{{5]zqD7s#EE >] ޹ptһZGs"0;k๝ F?J/>Aڵf5`t'Լqx ąX>{m]6O9p8^a<6m`xV“_–Pry+=@YXŵ!%?=T7͒N;u VMmkGTrI c5<6.#yUL zS5(լG +G@ >W1F2>,Q0D@T/N;~xG($R`I^:yM1~IxsߟzࣼBRs"\=7[:v+ѥl+),ؕI"; f eoJ喑P\<w:Tҹͭ?:v[R]bT@xtѓ!f? 5m}ms}!PAumʂ<_ҵm[Q/Iʓ"<0IxMH .P{cڷ燭#τpG#ѺvGeFzr+5sl4jt_j>Xqx65eѭhdWi~thc+0Fp )ݝ˞l~?7)}^E{X'[]Mlħ1:湻 o'en`9?|Gv,t*!IΜGM6p<YEknє1IQ;yl^DRNq^md:t*j75Fher1O8OC`?&2{Н S tE.e1y^kԎF+8h nCGy& YcY7MkT(NG{cV咾t&rךd}2RAF{(SzJ:\\%9,kI'ۚeuhmт:FvRHcPTd*l^/0Il0@ /NFkYrNMw{6yt` 2r?z$jWw!x[ĉkIRAq^ѣ#[nX̅AG_Ҹ&z\G*bdكpOqJO!-} {K.Q8P [yx9Q}N#n Ҩ! d Sd=ָN 4ZE*6*6ʺO[4wIW#64sM*8<mj?}H֢ H9gMzUt.p̭64)<<z)$]Uy9vkP5¡U.G$:zMi8 )=cRYMgLZl{}]\1cҶ04]=-XJTq=Je& ߟpڴMvd3vvp*L1,Nki,`*(N Ae,[-;V[*B0Oh"Kvm+_㦤] [ #;e m0477|X#/}e¼Xw矧r6a XZ}1S E4֚>omekbeI[*+08gu=oi>z$!k@摴pӣFqgYxwJř&ޫ4fWO wn#yKN\0jH$XH8Y piKaYDѪ`wQ\V(|nF#֭Zkp!|# ]>$#Df@˕ G89uQIrv]J &F9VO5SOY,UԎ5HeMΌ=?ZseErx8+D4acNN{d֬3FgD HF<+dge8*W.ػjPMoаܹʝ{MQ. &Kxbf\rǡ㹍f`X)IFq(iD̹ס7J_Lʋrknd * p@/ʒ JѓeF{' =nK$.r0zZ-#hf  U q#ל4jR<`p~}V'VGX46ХXcIT .[I9ۯNk&`a(>[ds%:vof[bg̷[+yPHWYksIkɵ %qɡMIǼۈ^5I5oMkw90ws޽{4"r\[$19'9:}+"]FI?'e`y[k+[mǜ˯kAXkCDbcO2f|ez+w5JUB)GAckK تPX'8OywW\JX@q^X!'zgi4]5:o݋bxFqN/tujE,ܬQ`'z&y,bLqGn:}st~[+GS0l u k!Hݢc *\6=s>q:Op-2GRG^sWaVHm+(>Y~uF;'ݷҦק~o xڹǶzJVHI6u*S%Bݧ #]]Ķm u b1{5*\\[\+"@:AJҕcUPNU _>Cq,.q%mEU4{e|w)cU)d$h2_1S˵)QIU?֩MrT=h/ћLɸz"S=*Ϧ$0$TUىRv*YcXdؼ0:zS r_w8RGn.`{gʍGS.R 91^j4o"韺}(T0%s吜_ZtyA^Zן.d:fbKf{SdU<Ծ6Fb̉It<իWȈ Lv'fOomg.RHe,2* >ΉCHO A8}xF.1y\:nuw J%1shԞX6[ q\re60 ye7v# ez6yC={ouHbP/ʪyzyp2:6=z41bT?o: Vq"v ^hj3bI#gzUZ=@Đc'=5vZ]BbbuF˳LN1]FID2tҙx8 :=}8nb]wq B@Qn+s^e|FK̛>9BЮ+MNvgR E\Ƣ9dB? v'YfBZ' 8{ [{3,Iz -3FP:gxv5Uhf?hh1^[ݥbstpxxΦqZ z$ӄY]O\˺#4oz/ umϗׂG8W;d6mć[ֲJַQsFK`)!e|8Jm\yq& SO}1,,U|I9Z0"HU1)w5):bVp-2lZM$ݣ8]3cbK;6 t[X)'\ԬouM y.sFq|ʹ[/]1Hp??^ɶyo-ބy%ymڡn'r8>4f1yp\"w0XK2w ִ>4g{ğ^TaB~t~!s)s~_\GCDCPJ'o!E@J>@ 9隸!XXY!gkUF- XGN ƋzSu缯q#KɂuMZX"ia rz sYё8lxZf>af `A8kYATPCI \Ιhm5"phcrYw$~5Љ<-1)‚};q{;%( A*$/"LN3=jBLf(rxϵh Yb(\qnһ؇H:_nuqe3̑fu=P:kԮցosmqpcGSb5^kΖKjR$\޹QfÓ|N7 JũXwdW- wcq5FjE˝f=Uag 8QmVm{Xe ˢ3Is6c:ϗYteH#\ q\Lk aVA]}ƻo_Y]G&Hh=C\M7ցɆ:E9GVf?,lpڹ6|FV%֢ROcX&SơsdXt|uó+2(Xy_†o"ZI!pɐqF+>"ž.-mgu U'))=ӔȰLһ،`֪f bN+ɯ:^+5^2ֽ|S \xq) NyoA:: :2P^ us1R\Rݼdži#^m.RKN91H.b+t-5NWQڈ0 =p?Jּ}YcHgֶ_80rPO\LxF1p>oSO܅K#h x6aϕ`s8v699&[( CiP\5PI-w:\ͪ,R^`22}cVQo ir(\QgFK[95j 6+x$ukR$Uuӵbˁ*5-ξXp#jUg cSޣdKwe $%yG,V` o))8EJ# o(\]CkLf88=O{ JaSyds\vzd[c?ƭ=.]9jy~SI=ޥ E\#ol1 AcyuMϘx;p@# qV I݈RżK/ !-@Ns\/ʶ6oq\N::&(Ava@yRB#pmMy#'#4'/de8TSŎrYQ٘cW;:iQƽg˞K{tY"LH'}ԵJkdڥ $}9ֺIq=hE<hH:OgvXxu9Hm@[Z}E;X'ATW۰Hs4hB1 $ǥU!>M,z_7R3i3)IZAx]kiW;R&HQکhEk4 `psZ s#`^ˏJsrmmAlDsI 4-nX؎ZWdsOxZ7В7{\c. qvo:i3Թf,B9#ʫGgO6҉eSC ¸'zןuRgGʀFGl^ n&{[yDOS=qԠ+Q 59xky\7GrKHIx_9u-},!l\w9o%Džd_yo^\=x'odMlB3"*~Ne-23c,ۛ8aSТ1B*7ԢR4s\7grgo3#9hiaYc {{Ut3 =Jh?$xǥbW;mm?Om X.IH#?|T'obcmzYq4")7C `H'S*u;62_<6yox%tO"E1ak[x/!l>Ŷ7S=H [ˌ|8&㞒 One9;Gt^o _n9y]U?w<Wۄ7烌u'=̮݊kFR*L\h5K;Oh̒FdyV^iId@#X ʻ/=S?<)6\VƽX6ZI>4b mjTi;#iLEijʾk>-,,,@cבhKQoS\Y, 3aYPl(r< @so҆p,H+{V-s- %9<}*#(.?*hvٴ1)`a@ғCRESNj"ӽ"!#oSSdHJv9sU<7wQyW2n` jm^IqPry8GZ氌>vIEo披Mؿ)ySF\;>L;O=>gX&?X}3U三sd8s޽{,>Rqת()1ӯ5`0eLd⡞Լ%/4&b,LB{ǯQy/$Al6 p&ن =;{Q|,;(prN=5㺌i d 9b9sbgecJQ}:)ș@7Bx 6~'0 =ӢR)IK.X.9^>r b-`P89?51I2k&I4]ki"{z 0=O9oF9~BU=69fH'۰$<pUwRFҀBFx>VYē0Q;A㚣zn/j ~_1YCqyEcX$aO e%vOt d|<}OOGm-H4 b$+ƴrK̲.A$pt1C `=sȮiIoI;%f {'S%Pӕd *I$&+<`+۟z}ZR\9ݸ;pq58sz!׬( B.rqӽJ1̛aiJ*:5iq6^BH$%>1ZIh r~*uǀ*J-=HּL]Md!Ay R{n#CDg*W <:DiR%>a [R iZ<= z'^;_%bKG A9;9u[[7[V'1wwyw<'iK-V q;cOqֽNsFa:8oRZ-Ȳ`A\NU:qtݏwQ Oj[%2OpA s9[/>G=܀nU3^Wz&km"R6*Nk~@dJF:s+u;@b^, tC&78uu0#fw󖅦隅/`B<2OsVKkneκ7%čN3dȖ畹!R^Ǯ+7֬kjbep*>cHt Ue Aő| zWj_^Gn5GlId/om >;yh#nn(IJɲSxX"m6Vnd8`3ǵjCj\)g<4/j 7ҽfՈ-`#m[nU^[sZjEFVLۍTy3##F9犿Xe2""i9f<\#WyavAjH!zW|IAA-z淥-.:ޱY+ MBe;>vjn[2_1P_\皉n${b ϯ[6ێʴ[e)i{hQmuۚSZԏ")-бm fS-cV%6 {4^׊jW2kSxcYUM#9#Z |T8\NqehD 9IaO7vC H0rq늃Tu崥 gDnpGS'J#'{u"z@NU=n-bmF?5<( Ag"*0k˔A[SΧlOmu"V~'[X;W=K+(2t|SA2]L@ gҤ"5R:Mt:sVEd;`zZ ݩ Þv5Jon"IfROlvC%ʹnb1+ڑ 9vT5,dRR$AeLzcRCm+2u:BN 2i.3a4^%4~<ț 1L)`GF3G;~cL20=Sh|m0pʡ=R]-&zOi}[ٗNQSrĨQz̛À 8Zw-"I-АTQ YêA-< Gјfb_cz~UJyI 3 19s޶/9<6I08MRڤaKΡ91T|Jɒ8(Hn*8^-{POIn(2*I88gnm~܋E*h*ۥqg֤u]6Pw1\@~lc8Ɉޜx"%PUԀ1}M, >:W:9' ciX|4}xW$w*31zYM*OU}vךtUG1=3N}2EV&bI9qbY !Me0FwƧTqDIj*{C VrȘ_ˏSC]߷lR%r3>Q~OmKy$rAZo;'ڥD8(]oƑyhѬjP)O9q?E]Meq;X c:^)?CfhOZҲ:YdA^STXxcPpLt XgڷRiUb(ڀ7r{+J@<ٖFF,ޟLtcw2r_{jdj94[cݢ y?δRL9vfGrxaǯ{gi 6n0>~+?L]O? %:,6y=ZTN֩WA$!+Cssmw}ڏ*oh rk>]c:q^>\hI.luwJAmd-\50fڱ BЩms@8x_i"I'm9{ӏI c[o ,6q.\gFt"Dz?qmKkm#%yz{tݝT`#ݺ@3f?{ &8N|6ӿ|mu1ydc;~з&,F61/Mp q~*x2oh60 E6dz5dkՄL^En>pHvm#,n⾀g[?ı<Ӱew>[RyİǸo؏Q5K3&W4=0gc߁^EU:<D˸#QEr=>m&iFco}k)nWF8mH|Q珥\ƏqDHю?՞մrc*?PD*Ӷ.U[u; .b%ǖ*T$`Win"Fp $}id5 T(5зH3D@#@ϿfI$w9Pʒ1>j @p~aۭXY0w#xUY1ě0XKs֧B)o9<i Vk╒sq>ǥt6WvkO$ܤ8ڪ/1/zwDsS*c7Slfr60s+ jqkڜmm JIy޽wc]DgRj~)ꎀ@ziFكlX4y.\(Y\2d2kbіkc h°^k*v.l[PAf|xG8R}+X1iIҒ9jBp-{U}3~0~_Ér\ǦA|cc짹JqH'\QEv {9Lfotocx/images/image-array.jpg0000664000175000017500000036230415247006660015205 0ustar micomicoJFIFExifMM*JR(iZ0232n0100fotocx-25.1: paste area|fotocx-25.1: Sharpen: median diff 1 12 12|fotocx-26.5: Rescale: width:777 height:546| chttp://ns.adobe.com/xap/1.0/ 1 2 3 0 8 628 894 1 2 2 C     C   " " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ŝ2dQ9s]q ]D@( ( ( ( (*>aصްiTHs{N+//KȣH,rC![񓎕TM_xʯDEE#*~bB6@9$H8 zx8=kmmr4x{MMfID@>6%caQ|AOuhzu'O%mA6ǵ}98g)?34~YG 5ch~Vo?⎱2j=Ē f\㤊Ri%VʐăsI#P=I4mN+[8u?nC;Ҽ'.$y7b;U =z"'/g-Wqϫvc.npX =7+Ij>P֛L 24{5*o=k+3_zĶͤxs76b4psG uH??ևBIDža{-;œh^ + zq{kǞ.2N ?&=jF['֠yncKpGl>;%oZSv9wxBr:^_s;R$BH1,g#p8#!0zq^'c&F>Toh\ߧ]"ыE_˦.k1OҀ?a@- 95 *A+<qaĻ]7֘J%T>WL^"NsYE +-lqŹ8S{ɯ~3ľAOQb-L= dۜF:M}ec|plv$)y]B5žM'֬3v'Zu_ ޟlHEVhaES(/ԕx:C ETQʖ$3"OC{wIj|/Q1*+ӎ& 5FT㨮+Fcj^8/n#Ӡ{ !\qj&؇FQ%WVhyNosrqBy 'h_a*ܓ5?&GS;_9;MœVY]qW, LoYo9l|B^ G +;Ri-nmΆD؜4\_i %Y>X֊C7(_ {|[Ӌ@O:&g^OB䄵&5yhKſ|=N RHnMlY sZIbjܟ+)8jr$߉t̳\yXLxLds^?T׬亴^( Ytb"}uJMS +h^{Ua4i_—Q-TL 50~W<'tN _k_kxcA+ :?Urq]*oϢ4¨/KnXj]t C lhTdqz]¥a[SS6e:SҸsœna~bGvg?52y$(pWpǠ0i'6#$mMu =W žaO;+|e? pp@? mOrJױQ\"|n/+10>3|a LNq*۲bqi]n(=Kx^A6Mh}Ģp_ޠo[a@ 򘟠V~ 7_3z>#ՁE`|5;G?=oQX?a@ kw@V~ 7_3z>#? ??=r!|Oo/ }>'4'@Nsldi't,.]3,F1ר|5;Gkw@o-kGp]u+\#q|ʶ /lY [~4Tw a@  M?)qu)~LjiCIŏ@iezd|5% Noͪ%{I3^,> 7_3z_AogqMBK9|ϊ'>;WҠ6ְIplA 󻓏ه~*-*_X]i.r`KsLhkkwG~ 7_3z[aog_ ᖋz<9 Cr;rH)g/ |_.w- Y, 2q Wi? ?Aogq? Z:xgo|=ZtjIu{]sv7pz*s_A|3-O*iyVs.?|A4 {h/#N:Y?a@ kw@ƶs`ݏSӯJ԰a;㠬ϰBgqԿa@ zu}oA` ɊP ?Aogq}m7_3j©-(wup/@1XboTj># q F sƊi$HavcsqkwI? j@}tՈmETDڣ;OƼVs3FY|@B i*:S'G7C&xq332)h (`QEx:T]xO E>Uqğ>,D/E'k>U:=wJuOeG<$T?6v :--e n+O|}e,sPn_6ŤB f?3_;7d,u.<6fd3zg?>^G,Rs 3~|z,Ӽ2`O{%灮o[ڿmQ2rux:pW>o^Gq4C>aA@|CY&H|6բxdfR0tIkR<1!>m`i,VF*#S4}'X*KC< k-;Q*I,\[ 5Vi#d/LWw.ᶩYiVMqǂ%>x[Mh 8ᅁ9Gyg~ jZ;H2^ʈdb\>rYAg|5pT~eU +Q;4K8}@M죤˥ŮG! m^&&p,z߲%hh^DH2`}?UY5: Mq9M}-u_zg\Q=I־!eO uw=c5!uߒbudƷrq$ħ ֹ7FuIhUs ={aBpÚއddxʬqs3E煍Ej}=7:AnmE<ԕBz1ψWط\=>768!Ka`;}k0ެ۟.ܟ )b,Tg|;) F\GB?ƾ(bm.\632Gӹ&NNstKVQ=ԒO:kS۾xjNI1(rFy4 Zi"YٴEmm͑Lg|Ojֹ"`} 0j_f{\?Q 'ty._O3ZI.{OzЫGVǒw\~j#{;uGv' X1Z+{ R֏'-q95E֪zAРH5p0<c=k߇'u ORf[8fQwi\jx\L 8"1@ekʐ9}a ,9S{*pǂa)GǏ+cFq_<Bl#`!Vf#;ƅ#cbw=k#|AqpHqN$yXxbKrF&q;x?4xz`YvA5? |LѴGst&(Z$}Ž)H6Oi3=c鿲wxU>kВ:+-T9_P%OC5ʜ ve(|HKR@fISŹ]5)r3hqZc ;@P/ Ï{4jSsYwyG||nPR'=2eY75>-˝j4mk583(73Yk+6Ia W7[bǂnԌnI^O5WQ_ 4ty4n剣Wumzbx3R$n>r[2ֱ\[hpو0Isx͵gysʼx< :g%o 8\3*6=AV`miA0 .YV"wփ<^mwjJÅWlNO/m}){%|i+Q=2{ snn4/wě_WAX꺆 OZ_axmNAJW= xzq5 k%O0?+<%_4HuOO妠E⋟)Q@anU-D^Oiaf :7z.Kv}Z2{?ݔY]+(H>)-Fz9qCi0=/jCjKZ.ߵ?,{% udFzdcpxk_wu G/I#ԭ$ 0Qw 71KWִ^~msx5ihd>9=G\uXa(9%ͯ]i^;[gou{j̶ג"'N96>G x~]:#j8apf4F1GSNW>y&C7_4kmd3G/ɵ)d8$GM1g.5y4 s4hs#Z}9Ex'~ D0yIB3Ҽ[5? 5J@Ə/YI+̸`>޴Hv>'n3{MWxJEtwJOY.bb 0e#Wַ|g\\h>*vZEͧAvu]],dU |iLn܊8ܟx,?SwQVYM.Ku+m&HRmnMe:[o|TcAuP"[wlB'$84ߍ4_1x'Ɠ4h4}nfXZ[h&&qXiι_E7W9 _/jdR(QE0 ( R?KQ_sb?"et*47R!49Wm [ݗ']t>gt,78n_bKUszDICi<5\oHm"*~赌gߥywkItMΞ.S z? ] 5['. w_=?44=7.xۚI<7MH8&68ic vTPv'DgipQ *9Zҳˬ}J,bl5q-ֵUls_y)ZHB;Vlw?§Zx K 1"~bKqxzK;bF٭dw(ZhԌ̻X`bTh*z0ni-JT׊@H'1rSuw=i|4nKHU_j U2Oۼa_5*\i+txX_?:OumG`N|߯fՄ֧fP84r&Xc;}F_%a344'dc!ۻixZac+Z2-$F]ĎR(ǜJ]ԑ4M@pveܼűTnq^}:ЪzUfzWdA0M+*Lzc;@-!0N>(&4%rNIVVnKtzԣXc"F8#*ƣm0Um%&H7ºpuajQz'cag W)~\9|]稯O>jyxʛ=RC2kd:׽E<̣ VPZkD1Sїo+tn[i &gi zKii:ŲF;bf#稰]?j֍<܏0a!]׈%Ke\1O_yf1xWU)(P:;Q[{?ihzſM,RLlQ^Yw ȵk9.1(|=Gl)}DܽՙLu5JM6>iX<} qޝym|7<242`.Nכ9EoF }OA$zsQFꮶ35% o.x1x;3jzB]]_J1HCrO$(xį[!ѮYSeYMG:Ϗ<-Dηg5tFeS;sֽHYG/4X.&֦Z`-&B[s_+*or4~[yo7u[ +}͙ԧ=do]sm?#[Ofnd9UlqߑI{SkhziAwIZG8Fޥ7瑞r*xí#LKҗYWu=@, 12$MĒ[mWTJummgQ/ejb`pƀ<5kWu-3־H[[v_ XrcLjguy^=s2$D7RWSYSV[Y-΅g^e~3g=p /o?`SvHDBu-6+^<`=28)Ze'S!״j:s,0C2GtJ),rOٶXxXOe`tۍj;x \͋jkC ._'H>@/'Moqt9{4PkXG_\oF42>\WG;,tHtҵ(55keV3Լiᶰ+䗚UP9ϭ{Mx~4/,_×{0-C9W j .5ߵc2#}Ocn \g{e6IR-#(Vg;|W7rE!ge\ ,8s?,[Ʒ4u#ePu9o='m_إ+co >"|[ukP6>_]YZR$kh[!B]'#xkg|}MV/X^Z;fdS=/Rq" qq~tɩO`4J=E5a969ۏٲ KwE1"jʱCy{JȒ(d`zr .sESuَ]k:.{h-mDwّ2!+3)2%sq}RCPtֶ_'uhP†Qߡs8߈ ԼcYi~&Ė󉤖(A[3I>խz Qč Ңĥ"Qڤ+ԓ^E&{MS:lmءPOR1/f?5xSY/ ʹ/em+sIMM/? xXQjRY #@3oOljӰ6kVӵ݇T;Y j],<3EDŽ&ҭ-Y6i[veټ>-[_K3AYfa𻊮' kJZk@ju= ?/k5!KeLZ"QY(EPQ_*;K=NlORuʾL&?iKjMa7>et*ېI}"vh͑;vTQ#4&ĐG{CW<`z:K 8ՃYiޭY3Bh_׆oS 6^)N]ojNi43H7/A8-EiϘ=it;[oo٦]/'ұSіnQ;. M,< TXkhl6q+b: h~IxPSq2qQjz7mHaVp/Ƥ9);0%N\5 Ktgf ķ^^gmKKZ˧RqLx-kՍ)#HK|nv|.i2]5QܬtHʞȀQhT=Sx"BeO%{5>Od9*N5V(уm ؈st9CsF E[Z.th*Jv)FI!M"lļr oh~iuhףxPjv.AyL.\އ~Z\MOWr^60KaXߧU>jeA2:2L4յٞiT+$KrW-ω?g31m ׫<3~_x|DB%*Oxijh)]7Y!} F_͟_%Yݷ vC ST9 ˥7hO׉,Mgg "( 䜜ׄ>*-#~ߴejV{v7=N+Z^Izm`WT5J4ncUp){ic4kCb o,gU~]:(Wšd`TMdB*WO=3O\Uyq.+24)m;+(|Rt]*MSc&\W(O:SY΂[(@R1Zo,!d 꽧oVŋyJ#\r-v8~?߇j2}g#&"9(Ӎ  Ҽǂ.L6Yy&y!vcv><|8l$m$k <ѳ`م܇&3H$S|3V<?m._|#zKlKva2dn>f? 猤Ѹ~`3"Ojs)asYzO>XJڳ+f0?/JO.oc&R.opY CϵUQiS5/sW˂Y]# ]W|&5|-ؼP.Z?9PQ\ӲkŸ>jU_ʬ)&a",3uOuFd0zO><3ƑCm{UI/*He5iW!~tGJKIPi$~;<ڔԧ3[1ǭy]&_ !;Vz4X^[~ |G㯍A_ź;K^Ya>RzRÏD^>YׁcOdiI_߳O˦=S(X\fa 8qM{7l-O Pʹf9)^o8|okYյ{UK@w<.6q ݋Ov)|8> uo ^2q˼g&k]\CVM5nXLw}3_O={HjE!P"lFgKЗ"2}xZ.7ρF.'ޥkt?zK̎l8!޽; Wv-OwZlr[>O ha/5)d' 0@l/,conw1&RGg\lp+g9+R<(We_Wqe^dVՂ3oܞ*4H6Fsk?CxGkxۿ\\i86Qhs_$Kt/AլDGXDl0>Rr3*}KZf{.fXשw }cRjҵxmFiO2:g7>Sl*Į~1? ռ[aoL:HśQ1?k]r 3ⶓxŚ0 w7w% zm C?t;ql% gEI<\G_ 5>474{_O?5If(dr6n9W'7n>*Xn[K URt|%m*B>J4'S9Y6X Ew.u g@ ,(r22 9($#>[67cÿ4xcI}I7A`sʕb9oX_xZֳeiE<2dH1ڗAC_|KӬ}x\[Oqs{ms@mE]Img5dΤu=W_T¿Hw⫢<OZ>D5Dn4ftJVPWq8ޯw\x?/ģ=yQN߅{b>$eIM6QEbjQEQEQEQE#}]ޥ_2foC_;Կ_ ȤP+40)QETw?RTw_S){/Wu=gZ]Ο5RTo=8;/WZn˫aNWq?0<҃=A^A4# \h6m ޿A(6pl'um>&iͪ >s,n?1<qiJ)|ψtQ~ a0^S{}е@;AL%fLFs[?/"i閡-v&8ᤒSkjoڃTxzd¬{[Ns)^ 0F.}tEv׾1е?h:^Xbp"_=<Ke}ca_E3rc\ԣ~h|'5E^5mn=}aytqDLdFk]%` }m7~z#xm\*#;[KXctyV.<٤=H:cmV\y2~aڵE]ʀ8~u񾕭.A$,{`|-Zy'c.0cٻU#IC2u*GuiŸKqLix&[X+is8=E}aE1*FN}Ǯȴw(y>g,9sic)3G{ hcD{e̊QكE].8VHnSu+1ۚ)jfq}̆WC'?K,Gc95jcTd ִh^0KmMZ_ϔ)ݓXUejg#i# Cδi;“ 8>;WO|GΝg1qU2>><aCwas?*~lGNCҾ%7 NV Z'☡dpGPjH#Hm&DS#z׶j7/g )Xi>1V&!Qc:gگp=>԰x[SE=N/w kXk܈0qҺo:j=lٰ8ǭ5cX4 3bl?d_v i9 w~<_eΗq_S찵oH=[]{m=9B _{EN)$HJy-*՛G5(8Ϗ>ⷂy1q־6~hskQCiO l^|R^k(k;biPg,=ZmIzڨ@ʤ@$/l_8z9sߏΨa \gָO|GMR]KLۭG{< ڧܫ ay!cIM@o[zNJ5[(Vy q'@(xr xI|sy̩e JАzO*3*=*/ k:=//uHփJO WGu ؓ{ Txw57VW4/Z(vH^+OLEP7o _/k5!KeLE (C (Q@GsΤ/n >#R)B?urpW@Fȏt*.vP-wq(f zs_gg#]#>'ko[oJQ43Q񕭯epBd $6ӑ͇/oX-:D7VWw*zWxCk> q6hcۻԒrӹY1oĝs{%* Ȭ[8} ŐCV/6 .|m|YP o(#R ^:- FJ TB2n]EMԍ_7ŽO}4v/$!l׵|d$S#L>Utxf_MVѣlQ"ɗ70\v'^?G<Ե;7 ͜T*zrsyǨ\\^LHmīs?GhzGk~1 TaiK0YE&Y3uw6dU0e }Obxe9wA%Lte{-,5=}'V)W iuM!`f+,>8-"[޴ϔ t"bUK>J)Hp>'ϋ>/-deP@;+neY.mZiDe8'qҺ)e)J߉51Щ}B?c\`'?XՉ#kWz ]Yo !qrO`ԧ.En`}yt8lUg>s3+.db=q^۠x^  ,300w)a0kgSP C?e IxG_־zMm,\); ov7 { w$8 a2O,AYX(zI4Dbtd^~Ǘo 0nOWS,2ڱwk:5p? [ůOh)wG {g+xO:ƃ2E !=V ;9O޿xh,k#ruJ-gN#zJJ.qqD6ַ^// : ױ|_߉<i`|8ֆzV==lG隘x؝>]09] x7Uu+CZd :sOҴϩh}i.4i| X}]%5_Ɨ&&X"|a/FAe_ t#u~'WGHt[yT!32*-.X^19c{Mea3u!`u:IkS H/ӱ?p1ՇPqVvܞ23һ?xRꚅ7yJ݁ljUjV2)BΛ>"Ιy.uL.T"1F9c^V-KúVsM;gf$g^M;ƓI/otrYځ?v^'k j|n˻WqXt4bo}f{٬h|7Cs1>k;RQQKoY-ͥ#(̎TKiZTf' nkbO٪]Ze! W|"O |I[҄򽎥ΣּKܩ;5kt )ah@= .@=#.dtLh~u+ѲGmz]|BnHkK[DV/;D~V^{)Q3k_|Οm-巶DOH~=kПzč5ر>zxF.A9Ta-{9:rJ{(v{/IFeFy9|I=]IaujѤftRe _r˒`ItQ$Udi` hM:M:l6)ToNk_S#G'KMJm3NKk2Rud3Sk1(>6u}s kkY.numN.$nWٶ>4ř-4KdBJ$P0`sMiO,֧L f)sVZ h#8?h4[-&[HeE9$mY|_ whVVQi,ΐ_(q+5φzu֝{oTMWA+Nv;ә5&2:,T7}:_v-Nؽ0[ >ohvs[1ZO#W^[1x^WJKv;63KpL1Mt=+ӿf J[klưV{cl4*Ǔ<^cMK+YԤo T8ҭiM%6+d3r@}i]OCn5I,%;+D/$&}$?_گJ]V#ԳWwl;]s/̠,IjxaɯMSĞ A>,Z'H`R QKFT$ֻ?غk|HqZz{V|mc W34v_Ә§`(ǵnxG>NK ZFunݛ*[2*,rpOA_+~O|NҢZ6fKi<΂dh~`z>*!PqƧUu{Т\ndP{ݐ=e_FMwX>4xKx_ J0qn7}h<i-.`/I/-^{!H!TUWk߇ޯxnS?Nj$XCKoxj94&YHYC 6 EV>@kr;ek#0 ç5 o[w|ckZ&iQkYHxn@:vB-Zjl2Io8K> CpA r@Cnbڟx ^=ɇ=/N*/_ؤ}C}\=G΃ɐ'gB&чPB14Dt?=+PsoE KEQIF+2j߱cyӱm:ޟq D3_K_iu]DrNׁ_ҾL4-^=6-PO_{kV(֟i-"wdRq_UOVZdz_/.Kl]K`S 3sGp=?g-Q5pNJy`=Zu(n-e (˩^ۥq߲\I=!&Bwk,ሌcN3N_a^dOaZ>(xg5_Gei&3$zJk>.jSdZyn5OIjHѴ?,BM~gN NE'}^M?? H5س>±$<>SצZМu5_mm qg-b6>FO+VҬ4W72HqXnTob21I-f]].Xܔ}qγo-0~Ϊ5xz?5%v&y?_9]O_O^Mud22<ӹ>׿C%iz>H؄Or} j\]MTq菁_[bF;rOkwY׵xKtIl-m"0JSjUDz]~ Y'dn(`9eI.q!q~|kږms{j#d2m;lid$>Rm |T>朱~X|akOֵwִ ia _}zJ.3H17Fx d!9CG޿;?l/kw)CN(aszdQr%z"i&x1W֟tIn=wqt"kWh?1YN=@c?L@EAɫ&~(OOyVݼT:zg 㹦|A~tK'KQH†OX^^n+(ptO3@'lQw%L+8'J"yXh^ խc+gk9w$?a{aGTuԸz+_grxZ]$A~ס| GgMNZI[Mwh9#4VX,2_E&ȖEIR^ Q־4)$b mTv澕 ;,gqܭ7|Yvx XmOI-}]H|FQ%wAugxqm7H{z拋ش9eϓ{'UEQm; RO`=k+Wm4 RQ%&Y@pu0J<,K*juFԮmfX=+⏁[TJ=E3s^? uݧu7 Mrr?~)x٣Ko\K s߇:턖eƗoh)#x<U|)iX1\2F}% /[6ZMWRheX>"pJ癏Ѥԥtz}Q^hᬿ}/tNok{]^}&6Ԯjh`x>Vѝ/Q~? AIG6c6s(Tژd37TCG>Ggkt=fH%:xy#?cNּ]87hrB6s GVOOzX=-bCwLgұ>!?~(Ӯ<5OOo YiM ľAYcv' V7x{Uׂ sko:,J^n&Gp -ŏi^t]5`+rkíOz!&5m3Mh&aq?G+sr ҩxs?YWc<6z|QM$M(̱LB0~Z/u϶9RjZkid-՜$lGQq^9k?/_ia& 0%$aYwok΍xJt3jM?5h ‚萒^1~ηt5WGRq++`:cׅ}@9>2WAҴ[j^pOTR;;m )6&khFXI9ytZ|Wx°Y aMHnws{U|S[-u2ZM+9X ~P~㫻}'hEu/]bQ/jOP[}3o~̤c=w#ׂOLmƣH&c%t/fXEee|݆b.V_NEnyMc(9Y㞄 7cNVk/hZe"^Ex%s;Տ |_G= ŚFqy"$cS_2|c7]t{G[uXxY@r.N:f~!s/o4-?`1nN4\ d71sźFMI_R[AK 蒅m ~AJ߀Z'4?xv|5iО wVά  % r8+$2lcdjGHi2xTjKs{a `s }6 0)=Kǎgk/l8Ҿ!^UhPͦv- M{WZ"ΚUڎyqMe>pߥ ?V3*3*`p?t!𭴉mnΒnOc]1\Ŗ =t2?#m]?((((((F5!Ke}uw7̿HEVhaES(*;CS)GEt*ߥZ\`Fj۞}+˫8&Vhm Ƀ⋽#}6V#mepFzb$#rnfm'l,@tWc?WD|W=*d4>-*3(XRudeۃ2 yFim6R(1扣,!8Ҩ 5(/v|pr;$_pާW4V댆N=x{E> DrHBBJW,܅_{5-_Z!UE>c3|'WW2 qe2Iֺ)&U.gr:}?_ em{h{3.JK ;|$%c1漿BHDB.HYOC~^K)Q9H\0*S6iHEi2W`[iE,>]O]m3$ l?Y44̶9U =n{K*Fr:b<^C?x OP&xJ۵W̹•x;kLO؆lx96=Z.K)^AgkAq%e 3X޸g[E~K_jHnp܌>h9-ŭ|Y?Iu>tʗ2)!b0rwsޭH[0< +Knlwb?Ž[5}wNȬJ7i~.B;yS/;_ŞYK_0\"݂?}=zt>f/1׵?Gjiy yS ν}Msw]~/H,4;d<-UܷL:d:f i=cao Xo[O-=Nǵx!$Br'~ڏ#Oe$x& @Gym[gMujZզ;L{TӞkؼg?7~o 7 I^GZCᛴӼADI,@EL~-]?\owmMWbH#e/_蚔W^q BT[9.Ji OxSƓx:-*XdųA&L:&W]7]T6RIrַ 4[ҊrŤRPm{f`YC,-C?dV@y~xO]2V\qm30>Hh.$TN.5 j_h|c+UGFjrPU"~eA\BxqA ʸkS2.&u#k3Wnl,ӡO[#|Jo?gfr.4SdwkSՑ)6xJy p9n촫s>`W;I-6ٶʩ)3ףSkӵF]6 R-w*0Rsڸ'ubd<Z-ɷ]f+Yny!*2fm-=6% iV<ӊſyv#eVUrNp+g9(&U"^ISqiՏ*OS,K$ *8dfk2% W? yolr*"?#Thi @C}S'-|ύ>,Wn-++(tHmmH-AqDU@ӧjW-7]{Kе kK0Γڬ;73Șhʑd[~>:m޽yv;ka M 0;N:ݓܜϭDpl#ׇour5 jE5Ć(Tw*T<3ĚƟ薚xvK{Shk~Ť "v@A >9zv=)vqҾuu޴|C귖6mSһt])f+d C rG9'ѻɹo ׃)0P#=}zfoPΐY&$:FVHǿQ\|@k/JE6A2:e]òu'(#}Hq|LjM⛍GӭcIg_3l1($s_Ҽ;}[~!ӵ= k8y`%.[lR&9+'iٓs݂ayk6{c]Wf"c!,1'GYw/528YL n'8 $]'|j~DE-5*p]C0\q3XGqD,N9X3rsZW$QY>oaTLmV0!N@+yLx[>'MVe*'+FD͒Tdڕc>&-+h>&-+k???_{Nck+ gâ7A I;C  E\v#u_L- 'woxЭ32.f-%R"O`, FuoH=g| Q<Ř"y6LY[b08Zÿuo|]yy/Ɩ}6UǶi^}gy#.y=8X:Ʋ2$SdmV5v$ ّڸ/⏉|L /e&)HdDa#rkjg~r~Tڰ?5A'aTkЅO|3g❟e/Eѵ .S};t"YW žA1\hI&ᙼ9r;wHdX9x,WEZǶkЅOW ğ݇%V[|B^K%iZGw k1nppq}eo}mkI[sݛS]ms?6O9?tå#}]ޥ_2foC_;Կ_ ȤP+40)QETw?ԕx: E.BOk6iWQCwʼ\Ek}+K, ss`WsrL|.oǢv3ܾ;o[_^ Ge:zV֯/~#ݬ>[ :W\ o% Xu^xҌ} ZĝGSC4P;p8U`\HcCm \EGQJ;r\Q+{i-PUA+#Ub5=&vrD#q][5He<k_~+t ?~1u>=w\b|q0W"Ǵt=wZl\+6&q1=+ i$<غ}E|ov@T{[oAU:+1bu meU0*cG[W_i ,WJUE2##ָmk)|Cixr9Hm·p/0c~ǯ^:V֕'TV{Zݟ.HO4f\k6,sq,}t⋍zFB͇ڄǮվ+3Hkm5:܆Wi_dIؓy#kӖM*Olٲe`@zz׸߄f?0%gGX~`Ƹnlm^O9 n#s\wFͽ%@?&\LR<ބoKi<] ItvmuOpN٭Hp}S[y.|֬]ӮPO6AxOg  ,5(˕+"c2ZщѾ/<iQv8es>p wo18P# g fOj$&;3鷭O&=>QmoYDB$)Tzי{@[<Aqy2PguUK3֮( ?t\,I{м3R@'mthtԷ."`|pL>ަD݆A,) H&B3)t4ټS8<_CmV?uZ_/;!M:,N3kOA٫|B -ŲA%픩ar3tQi`eO6  4c^ kVtRҤ^DXa ߑt}a'M~oƿbyBB7BGQʾ7A.Xݥ~M趍7yK 1CNG4mb[L$px5[+MjutYτ?5k니nFIO.8bMjGVpƱ"=)>@ȪvCRԣcG%;m.sԉct)nX,)glguQ")Ʀ-ea#̂Hǧ@ҏ11T YR|G~/|b"`B8U໗?u> Ǿ1MOF؋YyI!tz&]ɤmI4.{_sFϒMĹ#t!Ffs;]Cgyu+cL')KLzs_[擥b 6` F|:)մڥcHsqԚVgvI ;,Wtg5k"iA3_كm*j\L0X^V}*WIp޿-}3Dr:ٲjS-Wv_T[gFf˅gw 'R!`V6m*YWkqY⥉ tIO 륀Tf2R<#լmR"q=2iK[Ta黎%<'=Z՚8\ݦ-hwR< !7Na+8 NNcpKt;ױ;jPZG~̌'fq$1Ic*GΰZ^T6 hү {4eRw%;PҵD49݀-Wc yo%ʹfhxSy_<'$ko-խdb2kRU r+|VpWԈb!~']bit1k2ZNw#\:OZ~< c=_`Q:W:(&m>#+KM;q?y<=3ֺbaMʗS̝9Ѽ^QE~g+Sv0}>ZO| 3H|Q hWWk]H eTɅp07^Pt}B[w Az?)+Sʚ:χ{y1dd `uV^ZO/4 ib֙)Dfgk li<u%Z&sQ{vk}>?;X=韲߅ .k&H&7O5#E?)RNx|CR}麃跚ZщA W?hc?6ӹK Vk鏵G4ր|Cc[?ĉtK"Do5]=_,F =3]_~x3M[JմѴ/RB֪Z& nׯhe_N)os}G4`z xHޙoo WMo$rG;dt6Bsɧ~':ņxQ'_^1Eb1,0Iz׺hi}:h65]4}.c?5|{Kq{hvMH1.ܳt Tz_ÝR㎻+9& :+1 yѹ}ŏA,ߥvhcOdu}<OQCmoُY ȵ85SL׿gOxVּM]xV kmh[i)*K31$hƟOG4[N'?x'|5=/tе!(I6}LOzǬ S[IVfVI#ZCӺQ={W ,)GFL<F_o|Gk-Zk:b=8RN0{W-~-U7MmoW/)y^C r5CG1,b}=QFпh>JQu#M=I-nWC<W&x^g> JiG 1'kT c=.1½UZy*Ҹ\ N@=(Պm_¿.hA[ݿ% }>"=O^*> Tuϊv5އK-pbNIN(^B9 G{΁p. jGTedSw7x:/ ږ{m*+8ݺE5n?yE :zj8tuORV_u8ѫ. ;P]-ΝXݯlaЀ_t*?f}]ޥ_2fW`5{H?Ƽ'[pޠSq!t?9HEVhaES(կԕxWn 6'R)t*/ݤ]PWbdt_G+X+[P1%gp#juhVj 4246w=kм07(TN;}ixfOݿw!lօʱ/@O Wd?AMAQ蚰D? 0px_U#1;Nr+8$)+ߎ5-/>)XR꒐ۍ%[f%alXҼ? Z;䄍Dez$Aj@%4z7Q%&me?v:Ě[xzYwIch-I]F'xy}MK/ڿAHrѪόU|0ZxJrK5X%Aٵ6^^C\FP`׌YYGhmZt`p`.=pIZ-+X.nf5`Â9' pzsYU֣*zhOs\ު`ApXW'?ˆ"3d >د g}g^(sJ|guXMk< /OV=$o2ƺF1?М۩aJ)AogЈsՌ˸ʒWdֿᘞ-XKTSOPQj9a׫O¿h"Ƒ:pO,)4z'쵋P6k6dǡd cܓⴏY@":X.JA޽H"ֆ5+i|矅3?M~(Eu-7 A_ 5.9ij9Sp#'drj%G{ K<hSRRffڥkqYSj[M‘ޝ>W5MCUs`эNG޾?N]A1i5;~$|4q7+XBN ,lvƾvx),]8Yv&%-`@sK)Ђsk}Ia2E|aמ~hq? Ln5xnX'}JPQl9e*GIο $.$kt9f;e-lG=M}/=|GKyArwpY$7o}O=pƺ!5`tgUm~7'x?Wݕ;Oj~06nz5XJx-Vv(HŠ((PU24Q@ 8D) xSQYE/Wd?axGm",zl5?Br& m9QI+rr`ME[_@r[sHc.5T u*)=QE'|EL(#^=~u z~Sf|h>hf|}/'G٢4(f|h>g٢4}/'Ohf|}/'G٢4(f|h>g٢4}/'Ovڌ}hĶ6ym'$*΢ҿ/׌_^%z%οx4i570 BJ| $xyuú/< tⷖ)2wCJ?Iݟ_3c/t>I$chGCJ?G?vƳ$#E:thoY 7>1i445f$=R'+xcG+PTv\=bx/Qhޏ5vI,{XFFSpAv3<W :GJ?^sf&{IF$$6 0_k xVZ%cqYRB$ 3xxqݟ_CJ?YqxRr1]: [iW^vU_ yt{wӚ`ihi_ghҿ/kq8G¶'>i|=+x_B :|jي[o&[y?U:z"^#|($uZfE[[iQC"\KFzkT.`uȤQ+40)QETw?RTw?Tsb"G|kjqPXF3zC?^aZti7vLdL>L_[ѕl#U>o/]7'a6%ȏ۞3Z/y/g̍95[غ J5O;<] x67>cH4AOT`Td=k|Q+K]iv8 <{ %X=$/|<]ĺ^M?Ҁ$O,Rzpe"`QLT/Kuh< [=Oهg6<3n^lͩ@.%s^Pទ:Z 3f\oqD#־5M(9dӪ+(ԕ'M߹o>'趞$q2eV8qh %[NhLWeAONy'}ֺ =+>8^xޑ'\ԭmT㧿RHu"+ŜKjqXgn\$ 7Ls>głU/kvm݃b;[M(:k>\ !Z!3S|,y߉::!f xC_hlR؉ڨ3Սq>l?*]oeX1$QS(-^Eʌ+ʥ*.jWg_ AWzE״e]No\k|L>s:|HX6sφrq=L eWeSx/I^!ť=̛o*Z=sSUr+NQ34xsGmYop?;&GRtE+('p G?T̚TϧH ?Z:~0[w$s39>5x#QX~kt>ֆ|'q|yYiqGw2zReEk_7$q]duuQ_kԜ(c㲚0^Q/|Mtm]N2G/Aտ麕ʹ4 /vû]f)8.D#*rix}o1̝`nLMJg㰴aKE~+mteKǚ랠J6I:@69!F\]o e ֡Ҭ=X)dIh!wZkRUlٯ(qJ"xok#O]jW? S\?[GxC3w~:eҔ:T]/4W+1LɌDc5XUhN*0gMɭOVoum#YegOx bn}7nH:y}k|`ԛ?="䣲 (B((((((((h7 G^^ym[:^'hmF_Հ)~o4)~o4)~o4)~o4)~o4)~o4)~o4lRmF t4ow*GWHԛH w-@ +T%;Z/ ' 뚕޽kΧtT.\D3M̘Z:MgVu5[o 1U8g5jOLo`;s@xMtȾ"Zꫯ&Сl(X/L9xI#xik.oS?#$Z[?k-oY.ݾx-fS$c{O?cwm+T7+I-%ʩչoOml"b}*Ǖk&ַX+Gܱi| <~?&M3R'}|q=6kr|@֢lG._6#o*f8>Z09ogRa͠9뮓_euA #"hu"u+TfG6qQ86ӎE5ox}B=#znygy-i\1]W|fikz3[,&DMTm6pA95_ xX{-ZhXI-RD:NOkQ(Ov[u$~ =mbχjsi>iCw%z-A﹕j! x{1ut`I;<#cXYǀWNTntI5' ;/VVbs =< e OGINﴀl y(MAxk͵$>0PMƋ3%z"ۈHє) }&L5ԒV2tBX'\ 7u~cNA 4QEd (Q@GuΤ/f sb?"_ֿB敋†XQoM!!,^_>#\K=C#攀8]Z|8^=10ݹ[? }oDִi_F ށX۪WهUW$~d4Wm}ǗL4u+3XSq>8Ac}q#I$-y+³^G7QWo|y?r"Ft +氯dT=st?IVPX؇lJJ_ obͣu[;5=q*{)O[)>t t^4jZ^e@F}qWک9Y=B8[]O=M51q1Xɜ2Eu6ǻ>+*d~_'6C۩Owi#Sg/? p`>+ry"(4i `'n݌C+ʞeQI}D2i>}md[fEzcf4זh٬ͷ#ws\Nep!kl<;^0\ Q@0\ +3;şozo<1RnxE@Żw;2@-h8k}h6_E(`tL+VG2j6Oǥ?4).nIHaO?_|gx[y X"ٴ6נg,{ivrT^;oK.Φ"*Ga:M!jf^@D8'h<`{׌| ӼKh.f.O<9'KC>6j_ۗY}pH?۶+{ap#G//+r?nidh!2Q"q1*0י>5զJ%/٢M2q®LUɼi~Exj9oʣ&5>Z__|A33- ǑM /|!-;IL*\ĥGciХ^P׼|IPົhewMqjn5;[QG}`Aܞ'IeʐGn:OMn{u;NrASf# rXEEH'ıCjYW/># Q>=ŧxcҬn$y5Yq^qӵs~^pY,CJnky,?AM/N}OF:,<? ?&X~ ߘtn>1/? ?&;q?a_G,?AMzv:Qm{˨-׬Ӿ8̤y,= ~ch/KDiڅ!u Mh<=b<'? ?&A15Y FjZXm'|#=Z,Z[k:dȗroNq֋1_,?AM',OAMzs9~sjZk+kY7Fv92% _G,?AMzpbFr'tYs̏o8?c_?&]meprT0k,xlf _q4Mzb`bAAI,˻ދ0<?%h/ 8݈БE\f{ _q47s!.?&7q?T̀YfQDqH]z̤Ul#S:c?'p9X1=3?_X"I4T)]tEA~?|BA'e\]|C511=>+O$6$bqrzS(0(((/ԕxWf>#R)v_WW/t |[щ专MV*9ԟu^$>dyt́c\+Ge-wSnܒ'?Vë+C`nh!p\ɯ$1R;2I&ݻH>5>3xMQ&[}ѲaTcG5/,(?d—$~beD}ЅL*Þ=d5IB^E ·s^XHWv4pkIźcpƊ>U֌qnWmdԭlܱ"0ð#tڷO vШ1_+/u]Ek=ny^-fnp8$9Q@\APct碕"gpd}5- n]ubUmF<"6OԚ[m7IJ[&wv+"|kI {Ŀ!%ikuswᙂkԶ%ұk~x h9[p\.y.;IximZٱNGgؙPľU%Ngx>"hefө͗r KM!>۝8r_<|xoe7Beits&SxRt;ݣҞ>4։m42ujul1 /^ -M.>3hxjnd3rw+?&,rCo#\-_hߓ8hZR6!Bq>ڡ#ST7?}<>$||{lypToiNXwvvNҾ'IGIk]~0ܛ3ْF5ٟՕpqpdz2zXmmS]Q zg5Ɵ85k~9VgKr\ddׅ|uڞgky=aa~u%䟳%{p _ΣLN h׿'aUo-Ț9_bSxS_S'Ow4߆c^ԥtIĆ4&J9zm░τ~8ZMC%\z+!g<;jVsƋ+2sqZ7KCW4 :LDxؒQt ~{M\ }剎vpd'h^lbEV[Io$~UC~4ӼQq,6KzDV3ێg5^tHHn :$UTܚhi[nw ՠ#@ s F885=CAđxēikj 3~/n%II%l?4$ɂ\]d iiB3-`~T:מO? ͩ_ϦYa\}9k?T#2~Rq8a@&|OhpQ,C,ycVs~}Vc)˚MXK𭌕S mA <{ t>QHt}-fPQEQEQEQEQETw?RTw?]/z)!_ROX<fF/~~^h2ZlO_c;ag[}*|#n|I)aÞ}*|7h./dU58D?td~5xK~ @ [l>9csPh70es3)f|ǭ~1^nذ+ݞO;χ'Ӽ-8ʓp |!0yJx >+[ΧY ѮF?_W U1jpR>GEѫ(>[h4+9 v,~oX?Kw ; pzuc:½<\{UQ&<@? ޵IsS:ug)t<'Z /{Fs(ϥvY:h\2+ANI0-%}q њ^A=L+o{{WNV_t'ƞ{Gڡ^:޸{K,ɘ@8/{Ug,Lb35㆑R|@<e۴qe5_{j",G>]~&KkrgF FǽpccƐoq\Je8q_G43qo Au#i'qZr~V|a9=y*5O0=.j2Jg\>'QV%wgqө?J3SE"c;Ny`-gƎ3E0uTӃW_#ѼOO 5tU#RDӝ7#Z<qPg8a}|~$|g>+Km7RQFc3% 34dѝgN:؈Ħr'"Rn:a2QVQU~ըF%I9NNڞV iQwr#99=o_EEJEo. MTǸ_ɟu IjY,P t ~#iixDIn/f0;ʧtgl;Wai)ECS5(Us>Q%.|Ԃe3,Y('wiz/?h&xm9 \ {e쩯5 HD+LuW)|kx}'\!&N{SNwYJP.Z<ћ5i 8EMP١Khp@#*&<H>+ʇjO77+rt|;J(s ( ( ( ( ( ( ( (4A%/#K4&&4hJeTh??J7z%5m&dXkǘހUYh߆I ䷵ˑ,$mT䑊lI`>6WA?J4OVdl5x'OZk7A[\F!<.sס>6&G#}VM>c sULqU` 4#""ꟴmZ/[ag`/ e\9˯'zHk˪;urTJp=4h7?DE8A_|z5{]3B%rKllT+ﴞ㯈kèVIxIQUA,I݀Oۢs?Kh8s!5Xڵkpo"2vKci0qT<]Zxs)sw,7,;$ȈP ̀{) +獺}>> _wASTnx꒘aqpZ`ƧF5j/ý"F6~VM[SmS8*9Kh??K??PD7Lg28"f# #$jyL|2Gqap-/)7Q=~?^woUɩ|$|Me:|>tۛݤ[0G z:*xhV-<噭I!clp;]')l =?"~|c2A]^] lP:H֠ YOz`z0|ny٠x:W73V~(xcᆟ 5xtI0,ኳh<2S?ӝ˸`k7#HӼ;é^ټ78(e'4@E YQEQEQEQEQEx:T]x? E.U'we tӛ݁}/Pt_&ieͼ]OWSVR>2o +}/2ς~>W㳵IDS烚:f}NN :p7/\lԚWMl4+HmX f6p:vlU(ZgOA&X.$x~ܸ&gq tW2#C$<0k]/Kٵ0F?+Ǵm?mt۳b)-|Ak;|a`@1˪a9uSSQImb; Ӊ9Yx/3ν[E-GHEPk$ו|m|7ӒWa م~ dgx3>;v>ܠD $ՄwңUٍ0 suuC4V4*ļ#A:`ntPXn9? sᵈ\B sO|VMCGӮdYt`zpEtFNK~Z-5MkG]I49rH 1G=zXح-( Kw^a^Db +۾S0‘ܼNW=<{׭Si|w]M_vZv f :/lV6h~:&QR7?5{PꡁcFj>K}b3wms\BwafV>W A;ꑼi:SJ)^"jNfH2J$V"@sjRS?*ngT>ѫ V#q 5K7_r7>qe?VoW%c[S)#qk*>I}ޯ3XxWu |UO d^=):3,WZSuq$sy*I[B1Urwl(Q@Q@Q@Q@Q@Q@Q@Q@TPkc3[>2k oXݭΓV.:̨BbA9jDz|K(+X^>MVl@ϼ $/ x_KiIW|ذ֭"oS_ ePԼ-ZjDt :asڱl HÞ*ZMN-W;ՑL`bt'#AմOj%3xomCӘ[{!@6ҙo5Y_Kh>^転mܭpd^~};c?p[|>fO"l[m#~[{֯Ǐ ?|Qcīn$H e3:&WvOA^bHKoL~>`u=TKh| זZ6g囤PZ7BNӰ8$ fZ>Zku;n'[x%]'5js5zyғKLD:oZ%d`qɐW⏅>|w}V:槥.е}>ED}2 5HR}%RkwdZ[oT6ev⋭B26M9QCcxR}+P%}wIO,q$*ة$]5RkXڠO0xg>дvFG&RM&x32͵\> Wl"&?fZ̀M_|Z'.泂imخ[nOJ :V1;D*1V#i2 >mbŁKjgF .-c6j[v0ApU$%w$ x9koBⷉ.4+sN?.k$4Svh'>H_?Pݮ~mMz}Ѵu2)㨫ںy 0?{֢>bQc=" 5]?.5$;-L|8o0> m6B$"&N̬F@~ji?iGL x@v"mǁ+3Q𶓦[ͭZpB} o)q*փ@]WO𐶳]\} <<`m< 70ro-',3+X+8c9=fy?JJ0A_QEQEQEQEQETw?RTw_S)SyLqҳPO NMx[ON!/ Qr Ӣ/籜~U;IC'Ƽ[Fì~.6e*9>XLT{`2g-#^3W7$S'Nb;#e8`]x>2\65/ogKkKNj$)l:btRR*nǖxW˷P͎Nkcvfb"$x\i7{>FW] \\hʴj%4xo|Qhֻ[ 6o)Le{omMZڇIlmPlnh͖ῌ5ydA9 B?t V:/7-$`0sUm)VvQ^QL(((QEW*XQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@TQE~LЙ^ O iL#, "\U$_cRL}*Z(/G "/R}ܞ`|wǷRh!s\3UY&H؏|1ƻYZ) . I'~ /)DUoO[+ > }Ž&@c8$`GwoX|Wʭj<f%ڽ_6UR GVɔRh~xP]ouo8W؞4,T6 Q_,GUHEi ]N;k-R9fVeh({ibRЭ>sx8sv2x☾C;v흾YN\7mH0u@xTvUQ484wZ7LM ;ʏ_nۡ=}|pzO 4  ່x5^df$s(Pn2kQcPmL-K L?fvL:+ɤhz=HRP'&'Tjx_FW=Ψ_:</Z6/2,\*Pϩր MIPXQEQEQEQEQETw?RTw?S){/Wr7FH^QC>j?s#y\qiP_VsX;7>CUQ̟ j3^EkfnSU(Up[a5)%~<`W<röl:TQ|I"lq:K+q<ޝZ*ƲJKW$ վ,eRΘs׵~|E88N?>ǡ^VhKtX]jz71S20sqU0+׊WHF|MOln;iD/P 'NT(5~YW cί)Uo.%f7>>_텴xb 03^KQ@Š(((((m/?KWOOAl-JK|gtᦡZ2Fa^.TG?*1^m:w(klk0i&5o,q^ 7Y/_QYO?-aqkDyӭ8)K=m ǧ^ 3X/?F#M/e}\YN'?e?RԜhIpWŽֿ&QXo\Q +gg1RpgD=vWŽֿ&QOGk!/Kq6ף&n?_5?Rvy1^ 7Y/_QYOtRv<5 &L/#O8FoQYO 7Y/?0΃Xǜmz7(g,hMژoA,GcvѶn?_4&L7# | &QOtR)h^ 7Y/?F?e}?G}K󝴘GM/(g,h:b;oqF=zG(c,hMx_A,GM(IJ:g@vR>o WWZGbB((((m!-&fT18e#T`秽|3gTo#>[`hwdAgNĞ},WOApI}h>}~ Iae"E\Uvg`省oOh4Wodɭ$7=ÕjvIu P l\_&G~[ 9S8S7w*%vV 3@N)tŲ@_p2@ 7P@. %8ԟקX%r@q?Yw}1H"q0+Fm.ӌQmm[ޥ= x/ř,""5nb[;[?Զ_^3֬&OVPdI60™r~zq I&+vYhb)A#zрoztAoJ/"(߃ƀ>^nukجտoP~ғwXDs@~ٮ6g`au#oTw5jK.;ı-"} ZȰ((((((cŅH6I*LwPnf$2d.ةǦEkJj+IrAɟQG 5.o?z}i:_DJxqOkOC;oQUSi>ܞoOj[oQGޣ?_ƏJ̃M)Nz{~ޣ?_ƏGu?SF\?4atkO'ھVo _}S=ޞޣ?_ƓoQG%_AzQ}_GZ?:5[ڍ_*mj?uh7Wi>ޞnOjWkQG֣?_Ə:΃M)Nz_+gPsi?oSj/>Siw?|okPKSF4m?uibUdkOw'&4Zyfo _}S'4b_*lomjsibT`_}S;m=WOC'T`ՏUoQztWʧY?7ljsiS1=_+mj#_Zؕ?SFޣ?_ƏGؕ?S1=WzC4mj?sibTdkO'ھU7oWi>ܞԛ[kQGΡ?Ə:΃Q/}S=ޟΡ??ƏCؕ?S1=}h WgPsi40i>ޟѽ?ٯ54lsibT`_}U=Q?koGZO$?U _[>7׻s+_,<[*9:)v4Pk=Ѿ鷗=C%;뿰uo/5{E?uzբNsV?G?ƺ0sץs/Ox\K!} B#ra?MP տʀX:ABs:ߗ?uo/5ЙPA#)V@3<`g~_hտ֣Ze0 2HdW+|a4mv;6s*In@C +NxU?\~IQ{ kH+q+*07c&m &REK4^|MaS@"GYߖO[lt-2*' :N"rhOYbG?|9=) 9={V?G?ƺ6uQ@I.2Ns:ߗ?uo/5?Ý#ēhP܋If{)ŴS>-Nx庑^%B=ȥp9[l:ߗߚ("Go%, zwhΏ+=* MCM&k <`q-/oIYQEQEQEQEQEQE|:T]/z؏HG:ii,xd U? 5[-ºޣ2[${L5XL}U8zJNV7wR?'jkJ1`2ɲ:ҟ f$kV[D]M}K|ԉ=bQnBk</,v|héF_GO;[]?G! ZƯoNM#|Yf>?S@ΧNJJ2>Y ŞTI&aqP:澐o0iڄWrwXA_/x  kM+iF8Pҽ,>U)F/+ܪ|wg֝ -i|INk˥^K5DUGyM^v̨,Q*8)5sxgk6y=?z9i XG9þ(&y,2|=}VY^f`YO: &g~'Y'_7|:Y{@=LkOL_;ٌrҴx {Y Mw.\\B cv|[K> xjRU52î&ii冲$67pἧ ~|xf(H[Q%d {{WZ:ſ<ƺgsgnA]x|Qc<,&{Lj%xS:Zx$\J>8|??5W}ıкT6Yk#RԞm-R)gBz쭏ѥ,\DJ=o@%:f=|Mo_PeY(6Gt=?0{-9ZžöV d:*f;1 L^j:y3S%+}Zp)uypxIwfnTuUmi8BZ)'ʂIL|KK]{'y a$03l_+xy8~^_ws2Cmi@'ұ!{a(Y\] gGo '|-$2kNYٳ)@?<4:(ۦh~񯐭#76)lQO 45Øb{ۋ u&ra'S>< Z?9q[UA5_}jLmlu]_> xԆ5%ـ-q&TϩCT]M.t͚8ǜ:Gt;~nB_.xZ)gB~bGf_Z6X/]u(FҾ:|6Y_1w>'ĩ$Vo$g8`/u;Oɹ q5?ΑG|S1|C濘Gxuaz^c^+ J l^/bSi[ M|IPҦVKwؕ{9ǵ?்om[ۡ>ȓ#chbzQms#VS$ꖠA_xƺz ^YzW1x}+a'=i>%p/.r)JN[vA<O=ҡl+C`܃ lj3{Y~nr烔SwY7$ X̳7ݍZ2,/͏KX4k+R*(-dN܌Kg_j2Jum;X<|W˟/2zV })c֩4G:+,ÿ5mkKEd\ ZT-Zk2|āgKjwUFnaq$g,ê >,>VRȊpY@5q/uomQAsq-,r@^puuu76渎gړV:%mIqMQU!&8ʒ8oy5[H.e#d[~zһ@2U[Nx],:v8ywթ8JQ^^7VcntpQOE|AǮ| xv?{<|m]i g=xv}F{>`BB{<}7xrsdկK<xM5BityN;uhsGf}S#׌<i! fȍX ll|S}N_ig]EK9MF(To56:_iڶ9(W̚#o' *5=.krzl)l ~A㑖IlK|?⿏W^!QcqJY΃ ۸.y3\g D.)}'fan(Y`ǥ{d$&%ե<٥n$,q^t ;}' s^>a i\2UUVr:dt|RmQIg>xsJ3XȈ|'PDž,!' \h7wGQ7|&-I:>pF:⳾\.E.Auu%6SLס m001m.Mn^[ь:;vm-썿hT8LI |Q[4OzZ[_\_ߒ[UF wa WCZ~2|ujɨjW ,nQ0S]hZlwFX.I8=9ls極ĺ[ !- hi>7|[wP`jo+~5{)h4S#)!+[ƺ߀|mtP5'sRWukvZ*ePqVl7ýO@´.q}^iE%$[.1RQLY~|0=&ԯh2% |ŸRBI<`c/Ӽ7¤[sFI.\$u1V04 9Ro~i؝Oo?[xnk}vHݮ T7/ Rm7 Iu;SZiiڜ[ۍ>\E49oBk=B= $ JC'#ORsӭ+ A io)R? ]#mEƗSP=7OrټvrWٚ5A4ZhucdV 5j'h3^֒ ( ( ( ( ( ( Z?IQ_=NlOR]\soQ *#S?n̚_DE4XW8Q_e+^`8_OHwo,wCʾ7^^uUl`Vi2MOdpّ}kTKSrkcSAEa| g#k,ZH9tז/ǝI턦8S-H*e=:o›-]?О*ԸAQl+}Ey Z)c@evA 'T,(2H0qS/hwNX -rõyśYxKI".cVƾ*㸂$;-0l_귑A G򭰱rb$cY>x{M#^w `eR}GSM~<4]afXd>l.y}+SAgXG+>4j]`01_%9aTaJ/K8.1ܺhr%ny~jw{Yv*d}P)$`1Y{LLa{ Q=l>҅XOKoS2dȀ`w>c߈R7N6f x\H- uQTpTiϓPS4Ou"6=zt?`/ jZo<,&2鞽j]G~/s i=:Wо5F+$*T:uq}.QS ,D\lz>sw⿏:tQ m C'dR\W{$4qqnk!/2Oo?>K2Y`E{V CORp +׏ĕ&Ҍ=MY|24xz[mCRk c/' 0M} Ai֦=Xx]ɸdd ~-.MMm rՒxO ξ?OϩRTzx鼫M6㳈$l~Wk_jֱyVdcWx[I2iN~cux'X.a+ucjUON"gtǞqT|YH _ ~>s=Ej*ٻ/5ۥKo:C$̌ztW߷!2^ G8lzu8rc~/7+Ώx6z;zП\zM8?U hs%CM5.>sԉKϹ;m9 Rr֫h7%;iY1\=DWcrQ5unֺG䁾зR%C;"+c^o}h"ޤgk)Q~'zj.S\LB Z*SꩪVCauh/$PXC)i6èu{fdgQ+na /q#_xķ "ׯBٳEn6hFgd`ֺc*9BQv <ɋW';RKmID{GSI:I6sUp5|"HM_qbFojUH*j)F[]i^m'\^ïAHPDL?w+'GQ>jJ:%(3@ҳ!x]Cɦ_'(J6.$Mx+v6ך='Ǻ^m}^DG,G,t8=Gi&[D i !!1֣ῄnΑ5_M4Qp +2]{7QڒV Ox{S3[mZ^=QwZM;%PpXcu_xZ|VMokAn#C0ױ_/ͩ.MR4,suI= ^~4 y[|qۣ7Ͻ a,J񯋵;l}SOC[A$jnkE&E݀I;GM|-YmoY7x1n5!5ZDD۲E'ԣ}A⯆~Զx>%|"1gqT/åC{.)ĖgLtS7kOyko.qޙYgf@M.PF*|a|?ϭ%fXQEQEQEQEQEQETw?JR?valORuʗI'%7e(BA'zt UK_Ià>x @?J\ڊo/⟞73cNH9ITGt[V/uGCj$q9tO>?/;t!1&$cgoiMh<&.yI~yJ ?Kmѕ`-ndZn;|2FW#[ ͣnY~*ު?-lݏ_z&%Do̍6ƙevzS.?,x$X?95wq.2ξ4MbBݫQɭ:0 [콢~7庵zɴӵ+')2UWMicv\S>_Ÿ'MrQ-Xd8TԺu}BdE+.6 f㺀f&O~f>_[M!KqX+4#G+ѿY饧kk>Mz1Nn_JZ !__Q¼#J4|rvڅlnr[w'f _h@xz-~޿aZcfՁ*j*ˁmv-O%Mw'*[?k^X}?Y)0le\Fk)UԙhաME|mi[ӵsZF̎3և>>ĺbrU,=^ZX#{4jEQOBҧO6S&|OTkUh",fmqD:+kl-1QK AMZZJ|GGo,w_ u٢KkB?Z2v?־~h-lT{Kvp` }&}WOjr3Z;ƊDo6;k{q+-"l2p1MÇBstvxHѲ9 ~?Sgx[E"Oc܍z':"qIA oX՟m ZZM#d*~C_Lkĵ֟HCx%|~l&/FPKb~S )6\^Mr|0? Y߰3@+KY Gx>~<^[Uu-B#wGrI[SW۔\}I洝,4>$eN*v>c4,f- ̹s/'ڝ/EVm{Y7( 1w>υu%Y ]ЮCW.[u&AMe9ͶkS _ňO>í}|5qok8 m6.gAgɰFqYiNe6qscy V#ocDse`犩밟:څrJ ]?q^=-2"i_ҦI<)"ڽ\!]~>++רxgx~4Pkϴ=_<˓bvV.lIOo}QL m{orۿZ>w@W( m{orۿZ>w@W( m{orۿZ>w@W( m{orۿZ 8lU5 t7-p0,w&ψUc[Q3ô?Zelsլ=h$t_;Cxؙ;i yw$#kV=ԓvztJ$~sKkSh#;4PSHXm'>j|G5}mGqPo,ӹBJb23Iç^֒,((((((*;Ku%Gsۂy͉CWU? CY\<^\(T}U}0Od}1b>?{{IrQ4Hdl }:^?-اߵo;-COX.YT [3C|cabk%|VlY}3^eegͤ$$+Eq݊T5<~Ax\*;᎛ UU#eB4Y#* _~ntR̿C%6KiВz>$xŗ^uqxUQe\ 0q🆖z֦*]#l |C':kiNtsYI3_}̖bf ;5ok)誂fYs^y;|lX.$HL|̓%Ӈ3h$A%uǧ-:N^Y  v+Sne G9㘪/ *5r 38&W27=8'%AJZvSӬP9rMg-sQ#{Y[v,7.[9ׇ6\ {ok5kkb = n#dyyڃZ1`˧1Xq;,HX0!` ~u_5F}FmcГߊ⫅<- A%ѰIGOJ> ׫U5+%F5HdWvH^^Xz澀|d/h6.m?͚/ݓ /Zh5KYA4nwH|U >.27HE8Ic2WUx#ZXX#6j|gEg RcṢf%m'F(^@[x?\Z;T]I67jڕ)'b'(OϊZW nwik6vо&ny!zW?{z1y[Me :JݽΙooiy3)?Jsn*r H^4;f.[,H{wė1j7[FZ?߅0sL^T> +'Inp?'Wς(wysZDW5E4q{{P@kqb~:O7l9oºO~ }oyk,͆eT Z*'ok6%,pCn6u?t uZkxֳ.xW@ݘ?g⇌k{?tp9q3^⇵~ [vnn#gy*qu/#&)_ʺPH`"?,Ơe_SF'bUIuF(229!Ij_[=qok/fWk)ݛcopkJ_UŴBwZxcÚZ,~|fNP8-NjJt3L呉Ss\Ǎ/^#HWFHx!c=y+m<\WUZ'sjYM*tራ%NKr,yM7z-5ǖ0U޹f tdQ[ZoIL1ʟ y5ьxn^dꏣSZi,tu%ɉd6c'3<:gjaTggc?oiup>NۏZ⥛P.nʖ%yx*hAFoBqx5{_SC\xdkI&,6GҾ-zb3 wEnKgԑv}E} kCY/. \=ӫ,Zr*r;t=~{k~ك|u#A_}]-wu|v֋bB(EPEPEPEPEPEPEP;sxn4`MO @??hiŨ-%ҭse΢p#2^[R̃T=3?6`+'mCĿO^h# 7>xkp\`(D<ޓ@?~jMŶ huɴƂUs d z&< L{iæ_FjV-.{q3^Ed|9g{hڕT[j3뚃0i<~5?fkX76:H|[xG)ゲ(kuxGtF utr2 1u m|7munKTuֵDM3ѕ=j9IYQ@Q@Q@Q@Q@Q@Gs%Evq?v`A؟H>?|Ta%$Gk_ۺZLbpv;8P*T'Tx~O0@\Kǧ>P*{fu=DQ/=+jv!1_;^-(W}5~hkw8R3{sI<;lSF_ A},lK"ں}Ś,wB x5>7ftKc_~x L,`I5D7Hc;'5jV+ s]Yem:VH[< koTUHaGF#PG|⸞>ȞNǼ~> 5oF/q \CP̿ ^ySTr@ yÏH4^ 4:/CE-M"|7}o ] $"YUQ'}' Uϓ>xEOs' ~;]๹y˜݇\MI>`wX˚7m$ꀷw_VRR>ÙyɶYH[q.hD2sX]IO:WErylf"]u6 ·t\B'sg܎ br6ɰ`z ,~ԣ`mO\_KPŚ>s^n6{0#M{F˞.צΑ>Z(׬ðHxiifgfԮI}n x`qu<,aeci>94heXQv>rQ|[$d"Pb-c ֙:'"}SkH`'k?7+֛qrup4JW>xK[}= $*WVzWoאy*ߎ_9[bBi^_|GIż8A:+VR+.pl6kQ% 2*8I@"/ki1^]Xivm#Vk]kѼhdC2d'_7|@A^&i򼕭^i;+j|M{8+_Mofv]M+SfT0k<]VxCbf"Z\RX*~cF~^)հ+YZFq$UB=jFxl-",Фۃ)SrMx(~&ŨAl|/]X g_C6T y^q71 |LAUbM}Ko* u;#3ۭfA@mCl4<E|HaZ6+_AjߵZ[xJ鵩!Gٖ,s޻1GBmGu  |E@ {_ƿ0 [q&0=E܆/ {"V:lv_k}8OF\ Nu.r#_ +狗twuvUKrAcOyo'>gq좖;i@ĤTruMn }ڕviA=gnh%f[ɷn>շImfY%p79~G-`{;H$-kC2nJfrΨU앝οYԜ|OATJpJgԲHJY@{fXO$W&$s\|^r&5ڢn*v=afIBpH" Oۣ'?ξ;~bq־R>&}6Vӯuݤ}.zWy޼ :qGZ/GQ5xCH7˨-?,ÿ9[)l϶ 53BYl^p{g5WZ?FHNc?]$ WB+ѿ-cQf?'cOΝ؎?Q ^Ak+'cOΏQf?g ^Ak(FŒ'gG(?1OΝ`;?Jo XG%z73d?:?FIA%z7?W 2O $ һg ^Ak(FŒ1'gG(?3?tWZ?+ѿ-cq$ 2O +vJo Y\g(?3uLpI4 B5;"q3}=Xi8Aq?5gŒ1'gG(?3tZɱ\;~%9[} }觼Mۀ+/d?:?FIAT߇]Jd1 cdIy>300dIk3d?:?FIAvW?NyK[?b/^Yn.T6k/d?:?FIAv}}9GtcIlO?]MWIlO?] ]Ez(4 ?FAS`W, F>;t 9X\+FASNS`W'aƷmK 6_ '..GlO?]4`q}:,<¢ν;P/-H!-}Юh͉O_C0bX}>t*ooeh;,`7JUg`u:|M]^{CUf'SP`3ɒ\υa(gcnJѽuOlVE#'&}lhҿ?2.Vi $#L1eFU݄G͎Uk(X8CqXCLftx9~KރxBk?>fA%\IȌCxc~bvjh `ҹioY$ҴKmm!ɺe"v;gcP.i$-&"207qx_ӵk11ڧv"<-Z6<r y>X֠rb ]l?K"䁜SNQD\Wn:`~DF {S.^$}ຝbցVR-os- ׇo24i\*@-d"ir6Z&,:jہBPPy-R` <М=>ih$U/`ֆ5p[s>03Y۞/K!`1ךе݄ė1;axTsGlC#Nc_>)-Gv/|kv25KiF WSSQrjK?zikb} }T#C?Z<XRA kq} YI~ލ| o C NOn|Z狾kF-GO xN)[47ɇYQ̍r)J;7ku=:xlN[V20A;hLG/St/ث&sܭȷzOHw")|`Ǐ3|ͽ:=˖P+<?@eQN>[Q~Ǟ>n@3O ~4FpҸ(-gV5KuF}]e[rʳN;2ҵp({7oSqqYW]:7H0m_-6Iٮ4)UB {WϾ<|[xkskw-D1Hȱlhڞ7.v>kXL:n.ާW8W*O=X6'W, mWXRЙco֡w2 ]NQ7t`Yx'; |]n8~4\jkQDQBǰ{t;?jr+{ CҵQ4 G8Uܸǿj7|1[s-[偊ےcu{_αU _Zx::,6wk"cy;| Z5|#x& &;.JIiy H]d'k|zWߊ cvO &jc=IFj_C\k]O]!4IFY=/ZOŚ9Y6 2Eֹ5EQDDHP'YwﳻwbkGM>nu| #ˏ8)NON-0g-K7vV2LD#c E|sZ5tHo._.Nc1#8.-|OqcxkS}QVc{$ .[L'~Zt'𽾮4nRE,\!`La9}xGK![ .DQ ڶ5O^4MuHrr=Gny?ggOCzMkBLqs6ܛ@??mo@HƱ=I$4#8Z|s/? { YBznyeeUSjWڍ \,l\qA˃z:IqJ9FZ9x)aúIsk"庑kK|κpLJψ}'SO4[%x,dDl=[?x߆;񏋭n3ɩX =р Jl~k'5T 5L&44p!vu$7QsQrq|'¯*s͓"iOKM5veq ;`u 0rv4=׆Kg44Zt(ZN3=q\Λg9Eu0Xxd~|`A e8IQW8zEwόķR}ɕC/UQԩk OykWKm/Vbp;UUot7)mg|*<)m&= ʊ15_n[×{ڲᗂQ 7uxdߺO"iO-,FKNK$Gy1q4E1-_ ;O5<:7o_}u`DTyTm@y2LF1k2CSTVxhhڊhԎydA @"myF>ggMoBNzZ̢F-qӊ ѻn6?jwG%IUfQ+>-?PUkKceܲ!W'-]&2\ |lV{eYbVܫӐO+ȅ|Zn/SѾ4q4qgvwn\ǗO JM|}iwjL$J/^ x9k]IY طj=[5p̈́ xPXT>S ~ҏS熲Y<Lsǥr?so+WԷ?yb~9>Fk?hbO<n*8]Z;XJ,m;C?WSXݣe*pz} _7RҭXx?×WJqNk5k[$ Y*8#4Z(ƅsSB\u6!MZFBncxF?:vLp3 ? ~طcm7=M2td#ߚQh9j|g&aʭctƉ?6ψs+?g>ᴆm,Z}03s_z;~t5=';yhRRZ\<ŒeM-zEa< ڑ?Ƒ_̭|pPi4<[tU*t֪7#hvS|먻lT%9}~l࿆"QF>< m$>i-Ƞ{Q<,ԣTpyaٞQ姍]d/@SXS1 Ud%R+]RҺQ%Zo9Ûı|!N:LoBaN=Oa ~+J,&a.>d s_Ѣk)?ÆdCI9Wu ė dk3d&ц< ~`Ѹ_c77?k<Vi沆#ƕ߄?:7mcgڸ_?#𗋴/GX8(FM{vxYӓOl ]2=@-ZuZd7禇şB;Ӽ1N$tܾQn~hѲ#|2vWM.VP<1@D"5#&*s 9E{ ju!_{h|QAҞ_[~6|M[զ]7}kE6=8av-cWk? tkԨ37>_fo?tll,_Lf JKc2J}P[iRpOz3> %|u둁_+X!xztB.ay'UW~t, p}krJ Q|sttvxZlm2;$"vki~9x('*?(=真f#k[ƾ-tM&I<w{_5So3a(cfJdG$ojk_h7Z4Zmo=A)mO 35<=Wf>.̟- #aq'IVz¸/ w^W_|M϶{Vz[_ Fڶ jC|7U(qXk=G?Q⋎[_ ?m*[_ ?m*RXk=G?PޔE[_ ?m*&yqhhjC|7Qk=Y_mGmЧqXյoVz²m?bo)_jjC|7Qk=Y_mbТcWVz[_ m}~# ˪[1Hs sj62dXmGmxxSXյoVz²m?BآcWVz[_ mG} >m?b_[_ ?m++)~m=+O[_ ?m++(m5-OQk=Y?mbxEƯ?(խVOmأ?Qp5[AB>“Vz²*̌Ǡ 2j^(X?ږZ*QqX5V RĄIF>]c<vbjy3M|sj^  E>U~+TZvqm [~{et*͚/iUԬ'S<O T|6xu4}NOI#!\rI_z|;j֮෰Hc2Vy p<(}H߰GY˝6ķҹ `4MrNz&$kfy6hK/ ɡk6v2Z\DRQW?0`z?r=ikqIlmCЪ4mu,YZ/Y0+^johZu 1I J~6[<1ga#;UAUԤV]Ϝu&}gK+;kkKf$b+Í~hU&a:DkI?^ o9t[ѸNF5jBPUҜiTSkyzp~!ԵaQA$kU}H{:aPqE|XA%E)r+mOSS,vz Y߇+oڻ_ho=]]xr9.W%'56fuMe\qZ#FQ_?UHsmVh^= t#.D,쐷̹+s^cuj =ں<dd{1 E[/G8ŽkŃ~Ti-U3]Ov4HP&6ׁ\zF ðOlס\%f_f:אkSi+{01XSӃZ*\;K[(OX3Z𦎺ޞ~*M:ν ^#>O6vPq־AsArI,"-FE_^' 4>_ze?_wpE`2I'+_J_uEڣ c죚|\z?O~߉~$[ ʽW۞>.m[yͲ(T8޵gC h\lP) a]Hkwk[u_0wg]jCgkHVX29@A=ǥo%džUh۰o5h~nlzm Scӭ IһqJ6|SŵZ^޽zWĿhZ9 "eٶx[K7,, $u8/cV 'Vf3s!.s ְvi`283?Q&MnLk?&Z.F?׭^gB/9#Nj"ƢC++{8a%[F+~ j> ,|Uƕ1h@ A@:%-h]5pdǩx?D5r&}o/%ϪP7So |BmGPk/ \%zWi渳?W>*4}rd|*WY=vEou2`r?֒1v")ZO~596oZCodz>/ЧbiiIW:)ӵ<@Fd}kߌC &s{l$bMc#9BT{_x ZP׬5i:y5"ojru#oKԼi*ܲDd\Cr{_a'>+2em;:TWw[Zzv\H~_0mc^>:?nwͨA?`c só=2im@:Lvxb|:aIRSP䌨,v쯈"ZɎҷbM%4_3yAUqZO Az} _=ȯ+̾8 Gfe|.Ğh*j%] ~Ԛcng(cin:-sVK"P3^g^WßזWZ^?Ǜ#ی'wcފ/ŏ ׆Y7یgg߆m\ǢŦRi0HLPr>cp==4_A GVYP@'^~nmcFzV_uk)+yz2M Tx8I+'ew}pVo֚J&L 8u;W8'$cޱ-|zҾiؾ4;[FO݉UI#;ג^.W"7QӬ-CFq4d`HrBũ\-wec*)xF V;sV]u=ogs5ԾTvkyCF 88+?ƿjtoI֢5;Kˋ=>kO)"dU))ʰ9s]3Q*kjcz^G-FGH4(&R/Y6i-cQ{I?kɣW7nSc*ͷyl@WDZ5-흦;wwiBvРӭ|Ꮂ"M<˻WZo !PmIwgs^_ ^<%Οamz&٘wU ؜v4>:ö ؤnK*+F8ǁ3S}v/jSIoj$2 t<ׇ_z6M[Czĺ--/Sd2R'ɂxMs"x<5Gi5Y-'Z~wO=N|Oa "e%'6$a# \O]zԄخħfLm 5ÿ o.|vڌq_;ۛeg=V-.<3}jSM|/aLDəelC ےTvI_/>4_kz|5Ɠrm.բd &3H=FE_+cOII(aGcYצկuYt t K؊,[`ZӾ");xU+:=Z5e9yTeu#'t–i-.YG<+IM%Cd2Gv5 :}v&]uV}ohӟE|9?g{Ugd|)>9n4_YjP[ܖbgeO˕9=yw>.Ocg|?,ÉU}/WG/ZƿzōӬyY)1)ȧ'K{BZ6Y; 3I]X}̖jLR1$@FQnI$?۵֜hTK3W~lW^Axz{i#i׬[YHIq'_/2_:4k;P: 3m6um:i^S }U@d0$Tī;U>SdZZD P;k/UW_$ݴwPM/OXmۑ2@W= GZ|E60MSsU$xs_4yDe:)DCe8Rh |Ce?}^ UO$uov˸HS'./L~ ںsit-+\~9یW/;f׆Sӌ RE8de `z3_'j KZk1~-kYXѣ[4K<ۣ'xxi Gm.|RY;x!d*{22F3R=oO _G.>®P2.>];|-\ωtKFҥ\_'aO~Ug~_=cWХ-t[L,tV8$eO= GIs_-(u~#-?bBs`dK߮+p雫P rW?OJMG~"$T\ :>(|HNKF,["?8"Kqcux) #N[p`e;:_^chÙ$A{V>'+ķu 8#?8(sbC{E죘۬V+;BgoQJes~*|m='v8.:G[fkbT*72{l}?+wD#7;s^su]3Ƕ4"k2游 vZ|Ay";9ڏnt:31=![ vUk)Egg[ז~~ Ѽ HРv!ש|~|^sƕ'W(]h{HC7ˎLzW([m5 .|Cj1;L#` +"SvY&6 eDŽuх~Ntovp'?ʷt?__7n$h oJC6{+e%̗Xb, D> H&-ˋ91ƥԵ-,~a Hw;{+~^!5/_y 5V)F䞕4Ckpd4N䳕G%TҬ]1_f??NOaۜI=ΓF& Hc: rH'>`־yvn+$UE _sb= / 4dF=G@ğNw`Z57_04B.x^Xa;}J HH y3MC+Ц5%|"[>RhSOZ]yC%72 bZ;m9d\edgm_OIi Oo?xR=UEzNRCյ焾,4$q3 BWkFP^"ei,z#zIJ^6ffXEdmoť| [$p6qֺ5c*s <%NR+ |C>:1C4H &VρѶ5s_( >߄Z\i5+fe&5;P=k9gWXo97{f8*I'# 9E~9h|ا?}]83_$ޝmm;&If6O$#>`!Hھ _9į2/7C$/9 @nz 68o41pB4 X ]}HiwGY ե]_9О㥬J69%炴X>ln;#ysͽm>2èCHc_6j>-NkyEwheYW)֬Xu ۨd HZN(ږy'\̎cTp 8Qר>-䲇Ki6;g^q}_>{T{U/uK* ,$;b=x\x)қr_f_^ 2؛i %Ga~˞φ.BD Rҳs{6N34wpB7ծ4]SQgW*F A0kSx<֗GQ_Af_Oͨ|&W|?W#]pa+UlSJ4lڕdnݫy\ Fx'Z0GJJ(4fQKAP?*Z %@^P;AߞV+[\[Đe#Fq@ߪv=Ru@ڮs<~ݪvqIҐEW/۵\ǪBG^SՉ[r?jݳǨ7کgTdj:݈ߪYԟngTگ=G۵\}?z4O$Y= ( sڨgRVqg2+ F`_j? [CVǪJ) CVǨս,ꒊzۤPL&>^1w֌@T_< ^>ڬzNnf.׈!%fO˃ҷS=#ƺDfab1L00#؃ZPNKHxÚžI&1Vٌfc'x18= jo!'iؕ}+O?"hO>q+fKu[#@+_G>3z~9hO6p FҾ6u~G,Zw;r-5KnGʧ=ڸ4fjw,cpz֏;{Ⱦ+-$xaN5JN!ur$g C]w-}j.]R3 \f_Xh;8vfq`wr[ִb~x \ͦVRgiʐG \σ~3>(~[~fX7 3^}7f.}͏Ώqy2rqWH/ [(XWk*n+SsRjИ䌝x{s9t[{i6;~OV__xSNus\Dيܲi'#޽GUյ 3OpPUr9=;)|7[*]pg7pyw{ҳ %Xd½k@K: :&sջi9;ү|0>KE]kx gz*q'V};Y\]Yfǘ 1a^Sjxʏ'2sZ̑(PE$g66ֽݱ j ;H"TG?]U䬏 IJ]<7| Id.|V4-:Veiu*MP|(y_k=L}Sž0'֯So9 y%ҽGR,4jR07(;G1\?[(XULH| +0p[uzͥ 6m!>q zuy>og%jgdc3Ҳ#x/F]z6܆hؠ)/P<4z6z5DE1hjXfiI@ ۂ9?|S4]XkWמ'r4uVA@lB;;s,Sەԩ ZI;Ԣ>S#DM {  9nOH¾y/lU%=?é[, |Sb\)4OTt:zHd!G91һb$d=/3?J/봾 .nFuϽtӵ]VO ]$ dM|Z:@ϻX^( jg%8ʱ##j}R Ԑ"rа:n6~/LWg⿈xWVid^p~Y6w9=뢱$ڴw-;&pWg8|u+?s+xfMIؑ4Wwl=[ [ZkMn}/ˏ_gF`TM6 "Q&?_6"zuD$tbђYUDka5$N!m$*g5*QO=V ߅r~^'bZm.Hd5r`Mc?]8} 2h}O8z煿k^hQ^=~4[6us;yed 9_Q]}(QYvgW`@:{E} ^e;3Q~xF {AV / DSjNhO-PYl/\⾗ Y]ѭR)i:*x㖁+ Y۪7[؋(d[5O 4ɵʦ"/n67SƺD"oTV."o59<>i?u|M1< s݉g(՘I,@ q8|< x ID"9?JMucSx)Lɸ7VPLU p9͜2Uv2u^=bM#ψB~MHRI\M#*$Y9GxS"|T7 ö6$1'ib٣6~94Ntdh%* 3zWj)Xx5G`%um` cy-Tz ھu}O±ifIk>%]φFCIHn@D}z=IɪDd7?Žg]kzG4]A2q]H$/-Zƞ1ߩ_ fI|1I8[6{s6hxwRyp"vխ#lWz-׬Y+G:mbN۳GZo3W?h˹<8&Mcw*ZX/bf#$%|sO|as[`ү~ɨL8l$~dl1Z7?ƿus\P'[s}ne[s持r/S~/ٿVf^17Wվ a!5Ud((B;IY%T7{|YF^ ǩxjFUK6SsddVU|$]7v8kwjB3\~*wzݔ>- Na K1/aS ^3w|u(l>is%ˡhfIH >D?o}{ikV𵧈Ȟmo/Cqrc֬j|#m~*|]eմ䶿c۾'mkWIq95m NmQy-0՘3L\>xŶ[꺀et mMpvBcR4-p@a) JYph8__=jTrhc\y nmuxR&]?Ϣ]۸'~wn<j1 mX !- '7s28ߙ>|΍Tu Oz,e&ty\ x>1AJ=j^\v[oZZ^ ؆yn|V]܃Q럳6'Ql4}9H29㛓Wd_c'^вBd1hxe0WOyhRqfd d6x:_C[PBGyc۷=>ǚο{jv6ٴ# nDc{ +ECOᵮj<[Wfjڇo I2P9'^k_}BVM61]-$"닻/|èx ~ jTM;#'0 ;W25=\k:x$`$qv$h%}V]qkj_ xq,֡k>&'E?6@㩯Wտy\_~4,}t{5U՚pm i{na~Z^,<}i]J͊~9Ց>R8^^3o4?~5B]`oZW7&IUIyM֭܅}Ezx~tSCa֛\zo-}_sfTQEQEQEQER4]@[_<λb^rp8򯡵jgNy9q0ك0G>#2Ԧ>?yWl? x&-;Rk 6G>ꝗ|9 ?gT]z0wCq+3oW|^~wz"Rl4k 7 ޙoMԿfHC5laumyŚ|;hN~$2,z\KsF>x E~g5HҼ #pCutWrZv=^]LF-'ֺqZx}2TP,۴r1+φthjz]NT8:Wx#$z[BpmFwQK)'FrM:8%Z|J⟷M'#. \X. OݎLҼZҾXP]Ņ~ˆYO;sl^/gCmr#p?c>^u|7ᅖ-(Ũj.) >zV2aayCDizg¿z6˻vwtN»? DwC5nI־U]=M֚~h%Y`v\jS-Ŭͦ2+kTe#|Kq> 5˪1Ӡ? Ǡ''_6|᱆mkdps=1Vi.I䝧?mCxI>xd[ ?JS~p@?JRX̆H|'1=Qcp~S]eĶF\+,mWC Ȟ]{3X?M;=Xf9G12ԯaTfCξ/&rl- % Êg_ bLK@N Wg}WS5lHS%p<"4_dHmH=sUqOCܪjZ$]JߏZ9x~M_6ZЁ嵝cY߁Gsam'ưeY5{:(̃ g~)k}+0jyj8@F[GbUń}Y]F5ԃ⾺^­^=>f}Dʑɏk澩_]|%޴g:=qokt(l&1FDdžle[E/chpO}vWe5Tgsj71CRI5N# "Ms8k=API6闭鹮GS*fڊѺ0\|5*ԗIY8s%|1ҵXH5>:XQe$ %Hד_m/c8i?#ދ}u43?v'ݎi K+ڤzw,7es0S䬙g}㖗G,2vn?yu! |OZ$2Gi4Lc큔?^IqϚHsWVSvn."n6 +})#.N#7}Vo*Qw)8|;Eԅ6"y{ߌ?JxNh>5ɱ\4 hdu]/ot+IoCulfdE vH@'^Uӈ_69Y5d?$.^ >fL tf$%]FfD/T>2:x}NOrȗiY!C^knj\$d~z>`ɬ}GFo<ymcP$)oWtQ֤}HwzR?F |_ v^5Ls_` SpE|Sݮ{mp]&Hw>}_cUo\e"Lp'|^2gq9R.+2ErK".wӑ\^i-#\FW/R;bCy9l;}k;)_}mՒ :^7s)SdqDž˫K(3l{ʀbK0=kw^\7q59M7$ʫNM,{OsXh|X^xoֽ/#_jKvc¬ňEyonlY:r^u ]5K7JE-Ke/.*J>Nǹg ϵ{oko:Ɖ}nSg>zis!g][Kp4D|?ȣ# v,7f,I;&:rWV8ߴ}%]nqu^x3Ev. B1n!_/}<[d)opˆZ0xZ[YYdt#F:ٜꏳQhm5+RrK3STu'ˎDN>I_˯ܴd]SJ`k ^A# ̟l?žݶ/-f%[<|zŬ].-N9gm5ωm(]>6=wӯ3X_cbI99]yD=-Yyx}CwVܤ ;d} |/~6ִR6гgTN{3u?{cy-C,ޠ$'?<eO5J+]M`FRuWU4eG+|.l_;W_\|?WjQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEuր35=b;gmi嶤KrI$-4źN|TsW?xlǫ}ߍ5].+IuLIUNp+ok >>|;Y[th2<k9-T# cקzQջf˿Ɨe?|񯖴- =^t2O{uEe`JmQʘTO U3g}ZƠ(]Ej2p%WW>d+,,}6ZlzI_3|< -54zQ3Gbe[yw-1+H@"8𴧧?i'|Qm]_\m:"YFds#8#xEmou8n5Y<(35c8\g42ȟškQZAy+iݟ5w7bX#.8²1[PMkK +7 ל~ Anm.r4g x|7ssmo~&X[t&յRվ۷*Q.z`Up;kSKw˨k_x>}TV&a 7cɩE6DHө)`n#,/!e8#Fؚ\R*>{e:v<·ijz=;}5A<1=-)M29|ϣi OyQeI %֣fVz# xRn' ?|Bf/nL.,yuj Z׎3]*ym 194ʮ5ڭ'~5)' [<ͤ5fT?Bmm˨c ?2>j%ocLepxQ7/?ñBpJ#IPqֹ_Un/7K%r zPg <5k[D/fǩVʾCHk}uZk$e|H$έ>8u6209_a,a)$]YlJFincnhÞ~'|"5xĶ:x[#8X{>W!SGm%=E }XcÓsQ @ߡ >Y6Om'bPkך5MFO<]ฎdb[{LfGrgJܺFkHluk{9:Fg]!'v޵?tgko_ jWZv/m/֗?m_ KxhrkvХΒas|ͽѼ&htcď&GRH"1Yo=u ,~ϓ+P :dRA Lʓ7q\-Q?^,!G,FmC&1WAxcOuݧQmJ[l̜C" #5S{ an8IZK}c{3~4|Ij!ԑ,5ZGxWh5]_ xv?XIe19O0;_ %.JCcd^W<ƟlOͼ|\*% ZVa\iy|g讥ֺ+IB$ʾJɷ{cyHB 1aIzWr~~'g uŜoąNsg};"WhKQ}&\:SdxJS?8 %8&?"˫դ8 J>ЙTMȌxKIݐA**e8iohInVRE)~{o6[vz%FN&̓t-: F{}$$~_ I9{fʭK \V+bK-q8dt#4K{.&D_WWφG3B^Y5Ĥg>;ķB‚cW0Z ЧM#ϮVq<}$}e _%Zk ܒnQ΋'{vIۣ2TRc}v .^_]q>~["B |g+_>ooΏ):ooΏ):ooΏ):ooΏ):ooΏ):ooΏ):ooΏ):ooΏ):ooΏ):ooΏ):ooΏ):ooΏ):ooΏ):ooΏ):oi M@ H"ohCĺfͩ麼0H'IS0?q/h:ڵ!`WbYP$:S}8ˌ <~ %uY1d?eq#U9q[_-[-+k(LN{mƝ) )]ny֠լl;]KtGj[1!b<w:IS%5Ξ @Bs`mTC/~Fl,)pc`[58Dr27aW<ӎٷ5 䒢};|`EM=9Vdp"eicaƮG?ξtl=G6p~S^S_K4,pMva$" 9 Fp8 UxwŷϬhԒ=@{Wq^Ī?ڏC5\u*M|gH!)>tlEH|ھzM/]]G!r:x/#e;qZ{cbV_}xKLfX+} iGl^f@B6'SJ-+{|&&>k }08ww?wW?O ud5}SEe{,17VUsww? *'9;,:ץF]``+I>-t+ Ts+3]]Kn@╰]_ݞcV(v;E2clm#[}2aa,vk ww?kaw?y=9Hx_[S [9E^@Bpw%v`_CZmwWGҸ~v%7hV3]]G!]]R5~f Q53FjoCu߳G!Q|#rĞ2?f`??w3gLF8jCww?3\UKuAψom xNOj#V15z_Bgh~ h]>-=fm7^M`xw~!j^#՞F'NJOB*gK׿7SXVU|?>Џk ?s|Qf@Ȿ/ݞ/'HcOY4QF,B@3#DZrUH#o3\UG!?; wg11ʛRŝq4_}f0T?k3\UK^@xO >?fVڔZ~dN%Y1`á=otmBIP*sw?Z&BjU~LC4_FxzgG5aw? +g盯Q7dt BB& VqxGEcL5芠U}G!1^1uC5.-Al s@ky!laF\|*Mh2+IYݷz1ss{W&OW M8ѡ5QGFd\ p:R}o'h0 TO紟Ѣ>74}o'hM=j{I}(Si?GڦF(TO紟Ѣ>74}o'hM=j{I}(Si?GڦF(TO紟Ѣ>74}o'hM=j{I}(Si?GڦF(TO紟Ѣ>74}o'hM=j{I}(Si?GڦF(TO紟Ѣ>74}o'hM=j{I}(Si?GڦF(9f)5A>|1քH|DOc'M;'֊+牓hP!GZZ(Š(! 9IE4dE>Z(4dE>SEdњ(4f(3FOPiåPaMfl(f)'֔QHiU EPHQ('hcz~O4QE2y&)O֊)! 5&hfotocx/images/view-metadata.jpg0000664000175000017500000030126115247006660015532 0ustar micomicoJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?|Cڤ<#Uf$ '!TVg}LIgdQs> <运~gg\OB4/*G@<运> {{4/(OBys> <运~gg\OB4/*G@<运> {{4/(OBys> <运~gg\OB4/*G@<运> {{4/(OBIl罷9Ud.y:Wizo [hl*<$Pxҝuť¸%_4/+4k{.5{6fgp{mwڠcdE;RԵ;/5ub%'#Qml+sOB4/+WtOh%4 𘕚C csgfx*) mZ농w 61׽$!G}xb[_A5S_ު H _UKv~L݄͝1 v0qq4}.qi_Q 4}K\Z(?K{!9߷hN χm"Mv}"hщ\p; si[ap} 7Ww6ŚΦ "ěw ,bF8z'm,5mbēh Y+eA8运> 4o ]Zkm]f22%T"y'qk.TQ-\OB4/*G@<运> {{4/(OBys> <运~gg\OB4/*G@<运> {{4/(OBys> <运~gg\OB:1gv,T;;A Z( Fz 98de"d:7Y?>jWQ+%D|Fdt sXG.5)dbX?s8?ym| ŋc9W=eY8f~a=5>+Š((((((((((((((Ĝuyf+X3jz`/qq?AC*,37Z7ZS ֡PŸo x&F^ ?*"S ֡PX}h}kO7ZCQ ?*"ϭϭ{)kP?O7ZCQ`<yy{? jG)kP,o>o>AC(? jEM֍ֽ5T?EAC( Ѽ׽Ÿo 5T?E7Z7ZS ֡PŸo x&F^ ?*"S ֡PX}h}kO7ZCQ ?*"CPu-F浴]FU@}@NkO7ZCQ ?*"Vo~jR%¶qĿu {G%ZԚei(+.68p+O7ZCQ ?*"Z֟acqpdC[T󌁓Bc ]:Z1)! o? jG)kP,ǭQ{*Ɨ&qr0dߍjΡoQ^ŶAhʨ9c? jG)kP,7^n/!oxT;r(`6 0w5T?EAC(\objNkBbbPK}PAC(? jE}h}kO7ZCQ ?*"ϭϭ{)kP?O7ZCQ`<yy{? jG)kP,o>o>AC(? jEM֍ֽ5T?EAC( Ѽ׽Ÿo 5T?E7Z7ZS ֡PŸo x&F^ ?*"S ֡PXfܤìML8'^ ?*"S ֡PX դU;{cUE<B eW'3^ ?*"S ֡PXLov7P cMj2NEWt=^ ?*"S ֡P3EJҕYњM٣.|K#Ŷ- bOz@'$/])kP<AR[Eh^gl"6VU oY/ NNW6͌ygQ0 Rztgxnm`xX֩ig$h-%Lhj><% 5խ1 4DC2+|;ĉ;h7:@e6쯰?\SKYmwzJW~!s5}5X) ǐq8#rut"{]&-~qpy*޿ {>Qf[9nnh˕!ȱ0x.:u[o 'H4ߴCBLlȹ.#LZoD4ul8h qyꎡ2V$o&xcTDigXC8ԯ5ۏ{^'0]T :'zyPI2IZٔtz.wiZ`g@ #8XZu2B'&6Daa?)zUmMO՚C}i*?|B㩮K>ڝU+vSH6*nV*l7bcs~V7纁/'$.1`vHm hڞ&25u/}^ =r4ĂWpH ȟ OWVzq5^e"Eˇ ;wqк{]@//Ӥ,eMAd{F9c9}7ZIlٴ*=e"R#+&¬p2wnӽqx7_dNl[SDE J"uPF3N95%ׅҭ,nSNFWu 2=#yg4cSƟqkmKIjww3Z/\ #O k֟ tCi tnO Kn-\t6?~ӵ{ <][=)Sۀ{qzݼ/tkKNU"Y^+mgkZf>igkwo=F1 H7~> oj^hiy{ ŶhcQb 4e +gz k k?Ofo^1ZgacqytGooK#*?/Ӽ+iR>FW Ir$_ +Ws$ЮZOEu-0|+=7_/]ޝ+&5c뵏N2~6⡩5Ges}ƠMW'*UԂqָƩu)բBOֳ[i6ba R÷t ᫟]M5֥HX7,"j6ɷ g&P;K{9ؤW 8oZeqkkK_\Kq 6e0.e]WnTrz[Ŗ{+Ѿ{)⿂eG``e,Yi>JQvLeMCw.ފ2Kv[ؐ*$iG%D DԮV^PnA`X> ijQɣEg&&@}eduxĺ Sx}t`ݵ^E"M ")UxbdMQgkOQ] bK[d%r2x-{|Uo@M|CD_6K. m9̣^M۠(%Q"<EIEGxȣ(RQ@(La7IHj@޳<]ZcvڄЉx#$CʾGBX)_U}4$Ӻj]ݸ & h-%Ie$CםH<_wS= Ibeg/YMw~.-g6[gMtNɢ3敬077$v;(9((((((((zC_/:ޱq.-fVTWs \x#z-;g\kڵόe2X5Pk>p(X# p{wԵ-9 x1\ebèozh^_ZݴV^X\[H:㡬V(5K#Jua]m>?,vbx+\<1-+ZPcynu4yLdlMZ p9$Zz\;+rNd4"I$SKESqp5wweEx5reU3wLQE!Q@Q.{x+mRp[8KV[. a\gfړks/k2mfrF.$0%]98ZMZ-i4<Ł#0ѴbE>Yەd;pzEgKCZu(iӄZMp% 3\j_ xGZ.-HP4'_ BuwmngR{ mjP$ ysV|;7S'Q1 tAQ(H1 tD >z UDI2AVF;pw*[JV>K3 )hג>45\äGhJ_|55T!x17v9{-^м1uH2Xό01zAOx_𭾛hKBIn$ |@';\emJ?tm6FWHS(Px!\f [\Kt|YhvB[땂y|kY?)F/wf|EqX-Tw wq$@ϕO$ S '^jeIn"l<\ju|aizϪחm]1c#'~Vvs{iM>FDszY~!mQtkdbt# {:RcF_GsZiaWh@JW##k7ƽchsjv}kw|j 28o›}'^ѴR+ =59fk˒-/j ghN&B^k WF-u8#1`Mgƚu7@/m#I[=Y|aPHeGWZw2C YCq^Y/>jMT{ o9|X.rN#j oomv׎ 1!sӏz;c'7|Wmq:,qInVl |W$ӭ8|N7?"lWO;xpR//P~`z\w&7է[IJZ}?3V#|1[R2MwgqڭV$:'79>~_D(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@iqjJd #q9 sj $w=Z1n0:~\b3֡fhDfU@&7'{lThŦ߮[SDѿk-;eʹMj]jo6o!H}k4馭t74i/yW|uc:LҢZke;Ga9?n4Zn)k :f%aHdX9FOR◳m&œlw}_ly׏[=uIŽq\ |EwZ.Dē 6J]Cԃ5J6oƥ~umb ~85eD5~'$Vq2G%<:xңkxA#FF*2*]5hm nNwSueD v4:|˨Kt}2?NHcx/DY.ḸG;# ^m6$*J@'':{S)LhIgKٻ} ^2%y+zFuyim۹W>1XuK;閶 'i[G\Ww1Q qTNjfAŭh((((((((reGHƶu+SYiJtgY#h@r>^îreGI5[sVΫO Kæ /w|rh:G$s qyS+z 6dgGZu[Mtq3=IH1Xmrs)\n+ţ.鎒7ȊlfR9 qzoomZM?$HtH9sہ߇MݭRy-:CoCn8S(QEU=Nl4ǍKxVH񹂂p2@ȫgV*eƅ}5-@m&pěZޙo}_EVBu 2 7EjAMMԥ-5Kk;%%F5 A8`'x^|!ju}FnNhhľ[Hsj0zk5 V;h%3줫8Im%L*KT?ΩLmmn56dJ n}ty+_4 1eee(9- _^mju9Ye&$jI 'yV/?⛶?h m,2mH`b=Z 4g4mONolLM#g  WK\VkE惦z%&/4i%]7a#EkvfLGbG;oۍ|ďsf|FŐYmqK7JSfNeO]&֖DX`RDHH8r3v&|S>pcVnp=jއ]Vo.ӯ%oin[sın8945<{6ׇ(XRGڛP=ݓ+ow0hS4|iZI:ʅC;PIl57IС҈/.剣upY2`AT\7l~ jlE@j[x[^ծuqc<35c1v `T<{zӮtttn෹kb"p zN)<7koIx;=ZKo|F݁Ǟֵm/N<3.ack,Rq 2#ƈ/Ƀ֟U'eu^XYh=Ͱ2m̱rXgv6GÄ ]<޼7)nS` p895v0G*nbcy'Im)z,RM]<ڵմ25A^x_u4؅P\@edynF: s֢mG*khO#dqmۺo{z{O:6WI+(#x-$]>`ɼB٭d(X͸98#H1~$j+~;=7PLv3Yn/@6[#u~+];ZKKM[}9͹1lH0YݓkqjkWڞOe:-6YwllU_OI$y=ox*/h6# [%սlʤDms>%_^riV{i4rqM !\N1U̗]=BX&B8"?L{/Nkk$Kӣ3Avn;>axx#^&cѭuy,?ZX+3G$ U{?zo^y7 Z09>"Ҭ_mb6M pv*H x?֑ktIun;ۏï_\@ֶS\@ŭ_3KO5dӬI-sE̽:@OjqkkDs{/mBw.,,嵶,p̈ӷJZ3[ώO=,itK9Ǒ.z8roo=̗[Bɱ7r +žEֿ>qzXVdx77hxM+̌.)%(Z=[iꭩ >6嶔D*l ]5 ZjWO,5q!$`\_h`Pס-m<@s >x oD;ˋ'4(呜RNݎן3?Ǻ|?e{i֚LMN+Y0OsS5?k+Ki'27#(gT>[crK?qݴJpqh #̇6ruMo[N/-EfL6O--K:FjIvɹch$Qٗ|!k*״}~6#a2l˝!|n-ZG^mSN?//nM%]9;O:Υ>wI$DwiuF`5[{rWjnp7~$dZ}NzǺ֙kKPҮheom)-Cw'o.хGue!{{USFǨ=FTW1mtJ]{&_,k,BB"j}ޛEM*|LI92Oriat:KɁw O)#=ntmQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE[zK?Vm;]N[%ݚic; `p6xܶre/ :^lԻ[xATF6wd))*ø +g Vr^y5ٔ# $pIS`(0vit]B{fT;y6e$;ڵyi''HWpRFqgE'{;(o]Z&ҵtY5)' ~G.TgyPI<(qdf!ۻbyjÓڤ_< ?ʊ/J(T nNp@yiIPyH!ӌګ2hZ5IIif%Ex,LكM|?P-5h἗X]Z1-Ÿt7 `Y>jV}&^.nnVIKvқ 8 GZn,/Mcsk ,$$pk:❼"Iml-9DUKy!tRYix^NMʞg9pm<6:Okn [MGHGZ`%*y!n~Kj~(iLsO $WJvV]89,_qxk-3C͕Ƣ%E$-'s?)8Exg[񍞷Ėq0)6 Դ~H~ϣ]^5ƞbF27 )oXm'95}h!F=ˀr2;޺j71{[^-p0nOZL#񷋴)e}69RhDֳo ;]JA gt#ԭmeo,/1_Q?^:}j~o<,M !;ı,I>ڏqjwֺاO-rCnĊW ןw7Pƺ֕ 4̉t-caTamRN OJ)@c'-hK`24jږtKx-.7.8GPOJnm%Βڵ^( R.1ui~ii_ɩ{&dA1*civ2*>[ۧKƖ`hvXj9ʯKsS%׏M7MίA[[ݤP^"9.KaiVxp.A^Dc.QL͍4[1mˏO^.%mPtu}zFXԎJ">f%rj~ئ :CR&({1j'{ihfTK-Mytpry'o>!jz eޗ]Hw+D6XKnnx:|gcZKQ){KS06[zƠo%?:  69$9]?! u[~P:}$ y^) UTaA> ڕ ٮ[}YyOn)G}]^\VG*3U@ p*<c[չT6`dUV?2I=hKGYqC' &(IW3[ºV}%Ǖv%szVZߵؿ s`\K8_KI)hO=B}ʎ)lkW eq|P{ fk6kn}?B]nШ' ݆]tGxĞ1amf{K{;8^&:H NY3r@28שW7KLO)hcUMmA,ĒNs1SOVr ;ƥ3]Irq>N$F83\/V~#U֟LY FNt}!Ej.I }}޼zt'!7'Q-dy7UMC]o4'n|s8'-5R<h1EwX=t-[(`:pp%.`v#::6r ǿuKmDOubF߂ToFLvM?3Nc$fͬSsK'4m= xncq% W 8'10De6ɸH ! =q3[ýMjzr"kK )BJ ypNwxbMͮ ^u8.0Brr{OP].rߎA{.eiG#Litc\>q! $ X;t4S{okgmdڅ NtNٶy{E]۾P+;]:/fѬ_k^#Ԭ': 'ܥB`Hlk,16>XñcO[;^( um;a kiaH,%zv'\ v2Ol!4뫢leڱFzΎ^`!.:lG>qY4Vn[@ 1!V  {]gI5從]]sk1U6̣rǽYwdr3ejVZ}AeqxR9o@F[YNTu[t]ޟqfI%lil'c7 sHKI.K/B*72_F:dz }4K5n­pV5r2BIɭ:($.F%X)Pӌ?NV3`Rk 3 O@Zzj gt#m4YrX\ñ~|1IwPFn;kǷ~зdxmmt5x5&xgs$ ϳ Hgjji5W7Vq_-ӼxsC{\_jsx+OXnlu;(W ۜP{֭*S=G 4+\f]o̶ o1`[a1]1V ;Z XGHUQjJI`Q_#O/SAK\Q_#O/SAG0X9}(_9WSAG,/rQ>G_?ax`?,/rR^)uG0XCH^_X^),}qE| ?O/c?o'5,/rTi]f1$w=h ^Q_#Nq{K ?s(axX^),}qE| ?O/c+X^)9}( \Q_#O/SAG0X9}(_9WSAG,/rQ>G_?ax`?,/rQ ?s(axX^),}qE| ? 2J94Wȣ/k׹=_X^),}sE| =|,/rQ>E||H3|P.vA|V9 zQqqw03;o)Z]x7Fk]"=KQLH!ogGNbC_$٫cg,˗vAO91Iopz'E_[Za[Vke]AgqQ4 ;SԟLӯ,/.X0  1G<ոEˤE"LF82H0v|-S{PsUĶƗ/"y崌2Gf%A<ײk-|n`쌄2y3:D Xo|Vbv Vޫw+-澯= We)c1dCcCk=.E?9 S4_ %վ`Eufi81$p9p)n%gλxW¶Pxι.K˛xmʢ19m+6c\VC̨ w8Wy|9Pwi07 +!,J`cXg>- Oi؈K0䜞hݰJ|[cCnƱ3j v6| m9'-\]_jX(dZx/ֈR * 63fNz{T ]BGmBYng `u1čMVtC^ZZxe#$ϱ^6#Eݑ.d*M.{~{]" Z+m繵dAWG#>AE+W^'!{x,`i3BxwIņp5V2,BtWi6>: (SnΤ;`KNK׽7+g\ƽ -GV4{xHZURʥ dH?-V'n).ˉPCǨNռvQ Ѯ dOr#*м=Q@Q@Q@Q@OuOC5T%_C5Vv(QU?22˞eeS((\QU?22˞eeS((\QU?22˞eeS((\QU?22˞eeS((\R*OexHBB~?ȩ$ZG\D\; 6"@ևq_Y{æk$TUauEfVi|:s6 P9"~3}* -JLYyKW 0O_(}F?c}ZЮ)Xn,>T|j#S>,[`sBUv7iJe4¯YZ&}%QG+/qxO4ًqu0įE#>u7~S[Qxb2 -X?)93x7eZmVɐ7<i%kk 6KkoCv*E Hϭ&i멡iz]]47׶\}-!R_uT> Hs{x*|L:p#Ɨ6M=Μ-+ی#*n&ϳӭ,.P]RIws$Cx4t o/ԮN- Q ̀Zx6+h1jSwjK ,sHraWY-dt`ԆZI6ҧ 7K:{-2W_GĒȻ\N!vk_M 5ŴQ,iE'LJ ?xu"]+#Fe'hՈw¢V.cG5PV0m;˪xSA LdC O<ٝE[qw%izvӘe+Szn< x6U-o7~a*BA/*dǚ wpk7 u=ЩT6^*06}֛ixg٤W\aZVA=ƒS{9wL$˦@鑜g6/ =ƥ[X6ڥ6bTc$8o-x3:tLQ[BNcs_Ymh/4{te$wedAAIo̗ k%g11U|ʵm~jb8aB $Md(lQU?2222yX.\(*GE22yX.\(*GE2tj5D6ڦB6?Zʵ-f-uk+WCl.-fr8_qthP o0vrȧM  ?:˳{YT;t'o"DG0 3ұm-d@b?t1 uKtdؠl8]I5\RA_qZ'gb鴤=]^6@*mnd?u=rxq/[ FɎXېGGUZU4~[e ?OJ5?u'O^NUt3qp %'{Y-](9svMHw|6a,]re񎕫OKc?i̒ۦӏ~Up+-=g\jx#'G{ ]>dp!fq3P=cc|oRNNb[ey.!B`^#;Ec?Ygt!dU%]F񝍞F@=E1ĮY!i=AubeHP[ C'8e5<=// E*r Y ` 5z?>eѴm.{KXLSmlʌ6dzQ6ƕskehW)st\_荀ǁ6ԥR7y.}&,ZݺO \G+"Eu&|1Ŧ[f#{ر¯ 9 (aY~#J` mǖx5*X&82gc9<^cޠx`f`N0=t^_w5< ht!V>Zn!d%-$0UEI'*=[=$+G{QEQEU+KK.R O&u@';X8<*QYea)/;R8V98PQ@Q@kZ7cBcd$m8 +N +7I,ucz,&2'21y8d{֕QE|߫|/5[ۯTNmXsު‰?9k~kߥZSL 'PoNA_^E?D 4‰?9k~kx'(CƏQ:-{Xr7 'Po{mG6q]QPqn#=; 'PoNA_^KϬ=64;R'x03t́++Z+){KX>y<NA_G(CƽxJ^Olqd2>]3\}6'iu²B@-濦ٝH\ܘYȎ3#=3ҋuZ߆?D 5xAPk)5 2uHp9>?hrj.ڃ BFWr0}(\Q:-uZ߆G:kͽBa ޹2Z/;|,nsjv ? 'PoNA_^Gno,a 7g B8ݷ;{~izƯѐG<0ed{|R쵴--oD;\i z<isxxWMU.&Ll[)ٮ^ nu.j5q=ǐr$6-弘7SdGmO8bF@ 'hx.]QϫLBB!:{WqSSѵ/)[_=)/㐪1c2 d(>,HXQGeWlVH}Q@Š(k_;UX$$Wh: +t7֫BAP qUAh1Rz݇,oR[m2 js8KJv3!b#{JFDUT@DqG4E=B K+>Zx# k!ե gc Ю8MkM 2jW"L-ir@uTNN~jAoYB )D1Vd)>PzMq%k-j8|?xZ]W:M ?g1糶`=9זz~#c13/lٻhpF>lv0(LhJ}T|OJ 1=ǁxoR[_mjZWq6wsd+orqթV{W^uB -nnA s8@^;q^аƁHGfHY&v_asegxVK{5IY"`xd!8 RKj:'ޥh1EVM* Clz!j.^odĈx_czkZ;hc 8mP2=3P^gũɩ}JuRQ!whpw0n''Urgk>ۓPb[z{4X*+și A>s^- "@r(ŸQA(6g֟KWÒZo2&f޴iöwՐ(Zyc:Fvx%4BHtm-YVlaꬪvW62G6bP]]D]r{~TXQWEfE杽==,fEYyګ)e[l"Xؤ~[HBI1K)U٣&*s)udW%)9KHko:C"ᑟCL#xtmB-:ѥ2]WX3N 9qZn7+JB\?/6v/4G0q^('tKku{Y#b Ʌܒ!ʷ 5G_G-I8䶞+hVivG9&%p89c1 mEŜL94TY2+d1)K7r(sP**6J/4DVnac2*YIS铴c TUk)wQ\ʊ5 moAaPăq|#ag(JEM$Vr!tw!zǸVok$q2!pߠ#jwNA _o9GNA _o9@ BQBPh/-,myi#nP33/$UGrTz R ۉav*m_$oJM]6ìKfKq嘝|!^BQBPy'5?e,>`;pU+kw6p]tgxZX%Y<ͬ&9>e$(?uZ#?uZ#*wm#]ǴJ(hSC_=g\jVORIngM>f$d rz`Ґmi^?5:CnK%Üa0; ZnA(̫zgxźvnUZ;YL'97"ۯY|~9ZqE+@Jc8<OMg<7@',EQEQEQEQEQEQEQE2NQX,m=jȴF r{'hndn$]z0S Š((( G\Z7ZR-ڤ[[+ifE#Z7\Z}[AcKɄ-,ǏZ$l[OO+KGۣg ClD;f-OUvwYxqŭTRHG+ ApH]ӓFtk8l%l.!LgG>taȃ# 'R-YntK+8/]M:XYV4(Vq^UQĞX/ǿZ,k8A][2# V`[TQEQEQEQEQEQEQEQEQEx@.Gfϲ,g]p69=HP?^?tO'?2׮!I桉k^ kwn_Z.žn'hLZ6>,$zmYU˵pZFYsxwNΛJ$lr[Ҵ%WpU9szyϚ|7qZ_ou 0L8 0 H91.a]LK,03#A)=WZkim,/4>MDF6{ ޙe X\Hgn;_,cֵs'ڴb6Gof\Ѱ?CjSj\ko\4Bgl>fXH(黓 KjxLkfUSRVg #!'{֒V)eм/ou~V{K*-YU +tK+%PP3NI  NimZCkH0 9v?3~f* ERQEQEQEQEQEQEQEQEW:Կ贮]SEnZǴJ(hPl딿-r ܲxԺMjy!2  ") kreq_xhi.ۈDE?ېKmeުx~-:\i b )9) zM^MYYS5hX( 7(ȩ/jQeX5lJw%rjw~4bwi'ɴЅ&+ϔTAljԮ]Zo( 󼕵E;$ptQ.¶#eixfh54B'K{xq^æizeٴH--@Ԁ8G[QhQEQEQEQEQEQE㔂O iyg}}nА*ZiG9icgHQw8{"8;6Xs1a_מ|hֵ隞mrb2\I8s3%['>6 2 Q\ߊYnҵ[]#MhbEUٝpK0g5E]"uaDcCDY&k-L^~t3.FqTxn|CwhڭZ\-((ٔ08iC݉++eQ@Š(( G\Z?vmw↧o0-jnH^Ix#'=Lگ4 W\<[A,NR`d *mpx ڌ-[@H _;x-nGmoj'Zm|I+,;vn2qw{c}^ܧٮbYg F ?VO57ʮ]-lxVi;=oj]Xܼ] >hS`NskY~!xFH;ȧ $e,a]I4m"@U-7Z,nImg6#W gr29!jQP.ѰOCDw0J"7p2UXZ((((((((_[y2ɿwiqmBkP&I1v ە'5o!̵gDyȾn_-z?jA_:q='gJF%cqC뿖ZV}6rxc]S6څyJ ~rQŸ𒥼z) _i8$ znkZImnZO@zib.]jӰE, In:gu7V 9]H V) ((((((((((+ _?ZWE\WRҀ7-?ZǴJ(C_H>|4٬"ͷٔعfo玕[vK$.2-H"o .sݽB29…=jE#CԼ5_X]A \ZID؂c:KO49*@8<6Ǿ{Rǝ?->PyQU.aTdG"B*QEQEQEQEQEQE;fo5w-䉹.VVxye`ܚLh:Y}jm<'>ޙ~(Gv>uvXP"2;:N1]7v\ZʓA* #6 dGPGz>#<I|o^g7Ҫ ªN:u` nKK>/:X[TpeHn-C\eG3APwnuo\i [=F=ZM̀7!YTcW۹#ie -w(QEQEb?{+5\%/en-KQ!]@8Ȯ7ֳCKih~j^keaiפ1ڶ!$ǖp_?֡_}$~2lz$0+ it_[Y "it(|0spHfWP%.~[N\ǣaWr5;DwbT&,;o9cUS^O#K^Ηa\C"]d'ҏGaEr: h\mZIT6P T%fj͠ommǙo2ʹq$gLe( ( ( ( ( ( ( krLS,U#I#˄,? _^?tO'?2׮!I桉S79mϡXkQi}8:yaNS̛G 3ѷ,Sͭjh22 EqWhgUNI$,z}âK\G}=zzZ>|?c%RKrL #nqx{3jyqsԮ\tn<FHXcA1ºfP}B{GG: U~6z^=4`Z; goumq6;4`Hv| MGURϊ,5I/Hn!d>S-;H.F8 pkw g#Z\QI+;HEt&THW$ T JχS4 ! z#t!lkܸ\/xC55Kui2˸*2FU@OqkE`:+ 5"ԦR[2$9~7c &.qg@ E&FqJZ(((((((+ _?ZWE\WRҀ7-?ZǴJ(C_"PDk>%ޞF-G̰\zl딿-qZ=KTexR+}Vm?ɛReQ)XJ@49 >/GEw) ~RNHx?Wӟ:Wl֐.uw3U%8 8x-7"+f@@pQ)݀Nr$7M^Mw'--J6m2 䑒:8d}K՟/\,QŦ 7@^{=q~V0z /GwBfP޷>]M5ŹIHbvNZnfڈblg~ll7 5{nK9=;~"Dҡ7Is$wD w/"xšߋ&o$WĆ  >cðk]|Bm4 jgI87 /RN˴R;sN՝ >Ԉ򵘴܌2>ƸxPu; ˤ7ib|tU8;u|HKkbQn u;@W;A ִ; R?gKk(a>#]x->M&>F"䴞X2${pQLJW[Eyk|Y}iW:l2-bF'4t?xD6I}k--eve  j7EQE\cko=ƭm%k$bX%,ex87ֹm\O_oKic u8F t9/:6VOi6,;ld,)`P#Yז:in=̒lϩ+FBŷ0lSNllb+t3ܨ!`S_|K.Am^Z6d̑n3ƚO_c4i-H5̍R=ʼV?C}>m./^%ĺj (s@^]YckmL2ڰ+@E]Mkߴ<vIcf O٥ڜ5}C@팾UMBh'_*Y;w[ ~WBX"mbnQ^xK|9;p6gu%[i"M??#c ׾;{=[XDřrQcp:IYYw]̝Gzm:ɖ]Jag=Ww\7V{Toђ{6P7ܿfZ3<_ 7/qٖv O5 HtO2Ǿ%77%Imtk{T7S& i[x_C幏MhEY3DTY0v8Դ]zWխ-ReL.Q_9YOn[MjzMZDI#1e(ȧrTq.7 U4}2A|;~Il-*[f ,H$4==vIu}#EY4+GduW;נk~<=weui;ŧ|%TF292*4)|>ƫBDv#g` 2j tyL|k<7 [ 5-E lTzWӟU𿈟*,&dqoMw(8@</o3o^}V,[A[i~2!;XCZV>*ӥ'u7EcUkqݎ0r0s.|+oix~;.(4/*["0!%~稫ٗPxOizzy.m9=*#+zu8)5-˷S?jFY#QM=-%t䷸FZʪ@fS ($th&q2-~"z; M0gml,yyd:ԗ~Kv&['BYuX >p>a׿xA[sKnynAp82OtZ.ŬGMGHk:L#۵$V<_ >7R7I<"]m1ʁ(GKE5Š(((((((]SEtUοu/-(r=QE{G0;g\kχ©<<wZtZ!iͽ6)-yr^)Z2TD@agE$̏ŧx{R4 2Bܬ]7||o4Ҭ|;Io bhvm(+eb^bcjv?ۭ8Y7t\c]5o<3X4 KgeFq;pqqVaO%PodF U%Hn WWЗ*VoVQE0 ( ( ( ( Wqn!La? Ҭ{TE.M&#wi˨bQ17msq[^][Fm0\g9FAV- Qȵ :u%ay\ii^ :F.o4viߨ4a6Rv ޲m/ cD=EEXd g 8\w 6{A 7Hc11hPCx zJR;hBAZ{Yt<^+{8vLt°cv^Imw.u.s5cuy*ϗHхX=3Mz=- ( (1sk.'6 #=fDJ%˂ sk'4ZMzLZ62jRFyf! Jnփ^G!{Qӑ]zM* E& V"2#~8ⶵ/ ih<=i>`77cR!QC60xpu}!-vk}NKVjo3pƒ7 ֬w񮝤þ sd )$m)RFGLN3=׵;ht{/Q$i $,*FÏJ7Q9ѥ׿Lj.>'ehĸX#U4&j{IYHp2>g_+ H|HmgE}.>i2Pr9k6 jZv-ƛw{)" Fv7`+$o(Gkj/ ӂ[ y8wqwA7o ꩠ/t'{:F 18$ѓǭ/uj/k>$ o3`!5$cGV&K7++I$y! 2 LNjrZ/u5Y&unΒ.ߴK))Aol]lnthV7X 6Xak gVѐ-՗FIsm<쬮b2,FA,QEQEQEQEQEQEW Y!yaP#e!qϿWojk's<l~}c3o!̵gCyȾn_-zj7ڇ|c?umOTh.maV)89`p Hc}O.WEӢ{P"I"iN;9ֽ>Am,U>lcK %4 muk?jV2Xڦ`NAmg{^ [#O [yAPJvWtm[+Jv$*3 glPV}I%i֩aO4۔V|-d^E6t]cF C~TK!B[UR2 .sV3[T:#/O m/zg { 'a5s˵]=ww>Zo--1H3!xXw`1_ũXx5๳KO t(U)c<$WwޢEQEQEQEQEQEQEQEW:Կ贮]SEnZǴJ(hP%딿-b~֬oon?oWo$,88mmZzKӾȇ襤-Z]C]5=>W]Ȓ4j#s9~NqWg[ZVڝ tojTv_._ #@+cY76;VX\n㜙 =j =־ӴK`.,T%C)9Vܬwʊ`y{8鷶ǭw4/e !6ʅpyM*8K׍i73Kj%yҏpۈ=8IWVx6m+Sc4#,-Oəvݏ4|/P4f+(!k/?sGJ6YS@v4S t<L-;k6O~mRI;hb.$נQE@QEQEQEQEQE^_i76fm䩶;e1P?ZѢ)OoZ{rnRYb?5ٮ_ž5gԴa_No'r˵Ԗ܏(Сi6cYp%@U(47pJQ@Q@Q@xZ DŽ4qs`u_̒)E9*YÌxc7ָx¾!tմ=2{ vUu@AT?{.F4iT{MlH˅. [Z')vc>fvyA96Jd[[B$T1/+Ss |qshn.w.,1G `#>QԋdcAE6 WrMiỷ(2]Qg0V'zU1R^E`լbN,V37]żI8Gz\]'?CFbgKD[Jm. 9gU*@-SFRbIu+{ۢ2HQ ORiWzm3ƲY 22#Nۛz(AEPEPEPEP\WRҺ*_BuOk(=Q@R/` oi20Av I76E1]J)OrUmKnV@O o7G@O o7L + [R}} + [R}} + [R}} + [R}} + [R}} + [R}} + [R}} + [R}} + [R}} + [R}} + [R}} + [R}} + [R}} + [R}} + [R}}?{sxfY|ik\[KK_#abl"cׯk3(V'$~5LX-.nt}!da'gꃣ:x{P5]#T [8L.mLȒ*WB0UNs ԼG}mef/+g|H]ۆKd:ƥu;\,fDl{y ?^.ﳽ6WUܱxۜ 8Ll.K|qi\^i-egӼJ #^˩O .VO?ݿ9ٌv}WewXؘmndQUT0[BĮCv1X xⅶ}nz|UM'WzK$I 2+"qyKPmV)%ޚvccb/rٷ1]+ij m )ZbʪpHWڨx^լ"KZ0:V]Ã#[((((((+I+I$]?5'ָƬ|dasd9ǷPEŭ`"n(tgCy??t?':(k:淪xH原.cIB*dt$Ck> ۛXuXR{{hUbv9RsƗ7ZK{+INp~\Sxb,޿Vznm xsSgs\MYʜ#+;-}uѢ>25'HҳiI\dV(WmZzI#[&G^YU6 bT=:sRyK ~1zunꗱiu m+EQ,oui۰KfǦ< d>2g#Wm9jtd+][IB@#AMzx˴`qu+JXH7MEI_ofg mkFD$+̓"rŚ&ӴxU&sPd }ϥpv9'tISZ԰un jiέ++(5"i#D7?pQK;ӌJI'mk+[{:=h] dݜdҟ}S:^/6m6vDqǽrUa?m-b6ڬKFD|< y]MRO.Q$D!9+ƒo{W*t˻[]O? mn=JSWLRm,NAE_bNҭ'h#M]8lj^*x_2 [\R%.HCgԴm#ks;r届mm};0/{Kmn]sTθuUXUF!$Q]~x:E+⛗y20SI ~u褏;6pc^QJKuQVrQ@Q@s!]KJ諝 _?ZP{G_Eb:nˏCMΤgz?Gu%tygz?RQ@gz?Gu%tygz?RQ@gz?Gu%tygz?RQ@gz?Gu%tygz?RQ@gz?Gu%tygz?RQ@gz?Gu%tygz?RQ@gz?Gu%tygz?RQ@gz?Gu%tyGzIԔPђqqXxy'X `2",Zx}k L^[k+DE4hs(ꃣ;OjmnNӵYNGJ6 V6/;/ XЫM|ݴk{~x[ѬSNk}MP}VmnW6yT<{.xQ坃iԷrUv<)kksy)Ă`]@8?Z<=SPj/.4oimֳ6mqjmL}pH ʰ1I .h/nmceFx;cp*T@=ϊ:G:k O9mImv3\uֻB(b{iJoFBWќ}jZ( ؁mGvX^Ln`ǯ:8">Th@KE 10hR@`9 #G*r}*Z(E'b=3R2# @\(cJ<@ɣL\vi44'RĖ!N;tC4{RqL֝iAsF.q{q3q*ǰ𮎖U'*rZ(!EPEP\WRҺ*_BuOk(=Q@QE ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (~ Ķ~#i. 2ebF3ƽRZkIGos%K}P6sG6L=x/a| QQLI65bUd'A r*kZ\ַ<]Ge0H Rz IF+n5 k]'&xaxZ"]ljp\cGJYծN&irڽyH.x 0sMv%vtp:`ຎS 5;{S$~L3HXɴlpIN1ZVWz嶥!*؉H1}wFq\Gksrao5xcd߂I8=xLWQͽDb.>coRm dNyyv 5 Ic 8SAs 4˝?T׵NeFS F1Ƥ0 rI+- ?ﭓM:LlvWaGN߮i66]K\tmrΑ'%xIٳ?xgڧinGg7ηOi&s BaBrs? []_?*`\d`A>:?,-&Ř#He9֭~ԭ/VN{h>L;scx44R kYi9Q󂫘,|=.-KF)cfUJGЊNx-, 6^|bSkkpFb\E;ǝ۱Uj6\.4siYYgRoHp08Ǯ/#<@w4T;1L~g޷u4j\Mwyf%rr~V+F7+[Кy$RM~DdA2~P99W:,1MqLl<I0b W}E& uDYZ[iն:3hзMhhvs[Z<ܟ0CH X֥Ńx_Ig7V:XD,WY{i~ TkF15W>yˌm^*( Öw3+ϸV1)sҹ/ (,խ8l99wP%"H֗U}WU/ة|ڨ NNIզ-.P ݴl ]0T*q,~^UxH_TaP?1e!q ϿW,g~·_OV$+n O5uQEQEQEQEQEQEQEQEQEQEQEQEQEοu/-+u+Ti@Ҋ-?CSzΏM?:բ27ރZ(+SzΏM?:բ27ރZ(+SzΏM?:բ27ރZ(+SzΏM?:բ27ރZ(+SzΏM?:բ27ރZ(+SzΏM?:բ27ރZ(+SzΏM?:բ27ރZ(+SzΏM?:բ27ރZ(+SzΏM?:բ0z3@֬_\@2YXFez^c A~(h͢:e\E܂꺤5@xyX2EuiĨaC{c99M:^n4׆XcH v z֯+EӮlm/ᵶxcA,Z( ][˫_3zdSuk:߉b֝5 (4E7>xcӊ-s ^5X6 }'>w#ݰ9R iO_j*/ JlW (`2[ڴ}en-Es ,1GxX5;=sSm m糉mF>S"T)$һ;5-Z-JK}C?j]VA) HiO$29MK7S:~iqxѸ# %X;NkѼE^i1^I c>7 YxN}>.gZS";vL0@QgmMCƻaI UP<>w8QnI'JݗG\XhIbR_1e۝ 8W;7gYp΋ʋ7էh >qX;^FV6Er L 4vњڧ| fGB}U5R~ۧvWď}eF猎+~g? ]nahL2W2rQ7\חIۙV>n3!',=W_qV=7Q/R]F_I/w4I+FAFtG `rAWU^'eKC;[ۛ}qlC+ w©{QHaEPEPEPEP\gT0lÏwmvuxUы4c kmqƒ|+n O5bG~·_OPQEPEPEPEPEPEPEPEPEPEPEPEPEP\WRҺ*_BuOk(=Q@ ݂q LyøSښZZnF{ٚIfr' dU4ڿښZ?45W}hO.`?ֿƏM?|UZ/_񯊼G}h jjikh/^i>s44jikk4Z9ڿښZ?45W}hOc_M?ښZ>y֎`?ֿƏM?|UZ/_񯊼G}h jjikh/&m$=M!9,}_SO__yg+uJ}".m@{cT±cp9|%CGO9O"Ѽ!&ZDbROS}/D^usz5̨uAO-מÖ (u ʞ{Ss=eZmǥi>ّu6]?W{ )JYm`#=|G}iu [jHcQ\9} c]~Lq~O|ZڿښZ?45W}hOc_M?ښZ>y֎`?ֿƏM?|UZs44jikk4Ԗ]Kigˀ?2@>/_iaq']1v4F/o']3aG0XSSO_I_RЏK<lHČ̪UFI>—0%}_-IGP|i>ϧ\$Xo=$ʷ~MAΉ-#b)}E(Rعҝ=&}oEVaEPEPEPEPEPEPEPEP\WRҺ*_BuOk(=Q@ 8̪{PQṣ̪{@<<ʧލṣ̪{@<<ʧލṣ̪{@<<ʧލṣ̪{@<<ʧލṣ̪{@<<ʧލṣ̪{@<<ʧލṣ̪{@VWQd0c Elm[x;xM6ҋ(*^q?}2+7ˍ^OY,0=q{[&e}&+kv$2@8SYhFj:v0M9.,v\<;!wr Q\~"բQ{h.)HDr>o꭪L@.q#= ݯP<=:F~kxtv O7l.|)ǨDuf`3 LAԮػCcJ`[~p1{`cӯ4kI|9h Cힵ (I",ldN{|ou&=6x-b;i%l9.zojR w\2笃F=jΣMcSXQnDN$lag> {X.mG4]OxR"N2N٫7~!TH.tmT 'H JP69P}rmyX7D9Zkx[mOE[|?{$HmkVWz[tiLղč8'>faɵ g7 7 L W ص/ծHO2 B0G&UEq}tw 4d 0 `Gxoúebi r.'fϒ")mZ@Oa\8O5rZ克YYp6¯uއ-eeSFz`\(*z722\(*z722\(*z722\(*z722\(*z7eNA6PC `cL+V9A(] -e $]!RܜHOzʱ$xk%dm6XWy =iܘ)T&9(#>J,[$95_ w"P힧W;%( 1@05E䖓0 0zk E9N^^(׌+w:f{=Ck( DZA̞yi%p·yA-ztMA{15yNw.ܡVH`9qT|3]7]g֖nМ D`IF@<-DkrP4 Xg !cf@S ''о!ƃ7IX~'ԗM&pj[w`8oV?"?`·yAO߇-kMUWnA[$ e*l`o7sK]xWa>s)%)n0sE_Dho# ^=.O%同VvFV+>_J欷4KmFMԮ'I dXP 09$ly+0Z?[<שKmr}!dmJ chcnT'yӼkjZƛcu40yM巖vI6lrxyo+0Z?[<ץxcw{$[ (4ެʬdc/LRXm,oK/r20qE_V?"?`·yAa4M>;ȐJ`I dpy5EoV?"?`·yAyDho# ^E[< G ,·yA-{Xo# G+0Z( G V?"?`4Q`<-Dkhx7+0Z?[<׷[^Sye6TT厙4}j)*_nCo# G+0Z&nC%"i˸Vl }EGM#m"M-HAh28<ȧ+G G V?"?`~9^+c2+Hs,C`~銇>ƺkం+JhR-QaʀILd3o# G+0Z!r4Xo# G+0Z( G V?"?`4Q`<-Dkhx7+0Z?[<׼EoV?"?`·yAyDho# ^E[< G ,·yA-{Xo# G+0Z( G V?"?`4Q`<-Dkhx7+0Z?[<׼EoV?"?`·yAyDho# ^E[<~|;AԔ8Ey>5OU)72v,^ #¿ k:hYP0 1#u>I|0?z&Iq4K*I (\=h'#KGF@;_dzё\OF@;_/v#ָ/v_:.mFGq?_:?4b:Й"Wl±>mի6κڶڥ욀oR_(qF$,Nz ]ֵ#ٽ īB̭="9ӯ-)H%hmO\R@NVxX6ɉ%>gbw[_Ӿ"]_AxYbxC~|ݻ?˨Zle;G3G\A VXiw6S _6f Tt\0yt}s3\$$EeaRW`AZ ]sJoTwDr8ݳ{3@3;mXE$X:Rt?mRTK[Ef4"7(Eۆ~Vu?kZG @f`RtA2;YuV1ƫjw:Ű(С JSנ+}ONefE Fk%}"/QÂYRFgZ]~N kbw)Ys[88Z:(qv6xN!ܞKfkՕc}DFy$p:sL|)mr-JO].8!.s#9d vz--n3]ma!u%!܂( tJ袚VAQEQEQEQEQEQEQEsPM'Owj2Dcd*cpQ=P߈[ClWMZ8E89'Ia9}7\h~-h'G u7+Ҭl5e!($Mڧ8ڳ>'m-j;Ϻ1(d nI5x/Y}{ڌŤv~9 A#id+-]xMcJҴPi/O _ ʝ0 5ņ++X,/: 6.'e{9& d  :/k.-k=0M43$؁N~JPxM^V6{u5 r * ǵJO;_xm~gc b(5GRQ^w_j~$ :JvwMoc{A1^>lbEp>ΩOj%đgXL?<9߀9MIPmMX.,9LEU=@={7giErz}2}N+raOXcH[mnSdӬqq)RM_]/ +="$Fi Ry/"+F2+A1z ;eciv^?{fo$9 0;+i͞sAɹI#{3ϧzT񾝧kheby#iB1s߃AuW kjhZqlWR4jOH`qfxfun^E4(łrp3p::+^}ٖ9;ZH%Ny GlZuߊ6Iqiv]5$qm;#$zP\\%RZm5Ž#dہ̃~ҁ\(ŚޛZmޝmM-dqːFpN;fklk҆h7FfmFE*X#$JǭQ\G^jVZl 9ȥUQS(((zscjW*c' lR?4>={/j~'&XSE HԢ) (()"@)_PCt_j7]Z:&hVkY%kc!URH"ρC]JǒG 䁷9uul>~-]$er1׃n9aK<(_p %8;w-6 o27L2kA/n?\LZ5kOAm-,h`[)72>VOkm!5͵r$4ٚ(p!q~u=hZxCn`ZxMH#[K/5a)nTT|mKHZ7)^N@&3:uA"l\ہ & W;1$;8ݑٹA# WKls]״?ZǴJ(hSC_%w/Aua,׺.ȅW%aNqZ6R4lfWJH.t-)dwTrYX,`}Io ckÚ_m_jz@{]T4@6KqVt~ |QNYdyeB8n@o/]K[ Z e~QbͻnH~cgi5Ss-Uh.BĒia0`ɧ f<'Θ$Do1ڸUXPK[;\G5BcXaS >@ t6tb]68k2 Q+@)KH##T-񎵦3Ul=uo{fp(ho0Q6rJ u]5 J^t1=ݼʪ𪐰Xaibu}VF1ƒO,8F!C `=u獦UχQj&S %f (*9>!ZgB"Af$xE$F8'MOF,fQBE

H {crAVM+$NXoz-ƙcxf;{`v/>.h.$կ)4X'6v+V_h9sj&|4X"쬾fE#gA'74+Q n.%csF=ST?@]שx~iD-+g-u&vOtL2ā '8l^hv<յkwcoj rI^{?OҴR]6i زS bW<l-m5Ԧ5G-ĥ/;q9$66/m#R(<'aP[;V\cq']KJ{mSXng\! 3ߴx-"Vk4i9]2+Gοw'ťGw 7P1mlsTm|MQi+}  3F\9j^4ȸ ,Jʑ#!A2랴۾6/h bO}|ZݵSZj<#BI#xo>$Û}/E_iog߯ͷ#pΠ> _ jŪX\}EFm\`~kc ՛UYKtH,gܸK:[h2_xm*M2 wO2fQ-|]ƘZ[Z}1Ȭu8ygBn-6A/JӻYXMcPkIB/evD<ytuUԦQ{ѓHka_[YO?-#XEfщnK%DD<y~":2G6Z 9g~z9WPO5mNi?pxͼ6 *BRVW(\Z"h I[%6#.#AE=9ogp[:uTZΚ.T24~vA܊)4|(#Ԅә-rJ  1⥿ׯ/iAg<YRj0 GE8Z& l,5PV!Ad)! 'VXz/$_9 vw  cR(>hV#GӒI(kwGf_ݙG$ W\%綞։2%F9..;爭>i֑E6VӡHKYPN8*= u_3)d 71PI9+ɼuhz--.v$[4B'1A#v})W;𖶾3}tkzt"]1Aqm?t Ef&uY"^xː6Ox}؏Uo`,pql| 䝠)ȯ},=n/]hͧ= =y%b6pN1_&uV]y%/#Ugkh5]?[4?>"h^k9Ӽ*X_vS#o2CQN5_Gz5Q.+UDQFyj6{ )uy?uW3Y`WnS;jZٛ6bUOdBLPfb @'IQE)H4bk6b9{ '}0<.ѱ8_ʥ}濕gyR@}濕gyR@}濕gyR@}濕gyR@}濕gyR@}濕gyR@}濕gyR@}濕gyR@}濕gyR@ * :ڊu[vKg@ӭܷ _~w(QC_m&tvZC^fmqw=vu=/* [KtYB) 2 $~hϣ4a0 WG ]'Pxb+\--j hs%6/#|C~4WQvTt pxFzc Zܳn<pG sUɣv=@j"}Bg_(GٱWyQa'O[Bæ͌FGRPۙ/FiE`{P#'ZƵƹ -2OMe漊bŗ.H|?%G<4d8d2c`A Q~ֺeX[[Iq-O)@=jyGō7^.6)6֌ѕ`T[93{@-5Ź@ p@go@Z-&^k:YG=r"S\E^pBI>ڥko3MqW;ywK;9G[EyGkoE]WL5a 3CfL%FZկ%KɶQ~PR6'$(ZEbC}Ik 4JHŨDe<<}+ Y ky4žh%Y@!o/ n\ ),nfRKa \~jm/cẊoA-OeC|5kJ.č{2Eא lPd g=sÚ[_˥kZv1"Z$CjJz 5e].j: m>tҼZm$kV񶿨\چ 6 QLgCʣ݌;Ỳ>O2$|crǦjCOa'up(QEQEQEQEU=V@2sY~S\zAg'3`gi?koW= |7O(E ((((((((((筿;g\jm@U{Ie:Jfp]‚a@QCk!?/^qkmJz󵎱{g" c#݆P~^8%s<Nk̠ h' @F>cc4A]695{,5S)apgtnV${8ɬ ؙe{-j.K_6DdHFN8a[R [ś-_S0U:Qu ^gU#hm_].mb{KmP6Ӽ< *M_f__q-\OI2+E˕f9'  V4ys7Au*6G}_Yҍo SFBȒ#rY ,j-gPNi魬SGlHݎ+'~$񎟪ZR%.-I Ty89n/Eŗiip1Ǧ9gJ PLU|;m ?xOfc]I{8%:{^*͉#b `q*GZ:lj5?v.I<0Htםn3+#=T.Jӵ5{F㹚(evTP~fnKѵ&SI$VqMp8bq6'' w_h:]N $) 6F$.-H#hxSƾ |KikIฒ!F 1gS3GeoA] aՠQӵ33K00#Jݓ 78 xr={MOU2Fǚ#T }O$d^}j$sQ"վ5Cn- \2R O@~}(((((((( mCD:oxylʦŒpOE/ [xDJ6gi$n?mmwey7I;;cWzm\M=ɷ`!O|O`[/KY[MpkYS*lHe}y}ѐkr[sW?ޛnOd:y% 33]셀,x4\O?}zMOWD_8rA#*qh{6êH'n~63B.d3Jlcz:ޑKu{kH bz|͌qY? -ݭΤM-N3HU#JN2B)iw^آ+뛩٧P`X99?ΫRU ׾.Bui;\x9΀X=@Vmn-I&Cw%6\wUd խ^/QWMlr3Wgh>`wū֞ Der2vrKy}~GEoH5r绺]]U'<(p s5;-/-QZ N]tUرXu]Fx4SNH8yww5ou. Y.ni#ycKz z ..i-d 7I$x–--nWr*ou+ i%Վ蚔 uo Xx2rl#5Eio;@k2,;=ЗRu_ PA=wiS̝[} tJn5]ZS^GxK3!$,(9 )KGt^v2;.m, ,E,NFNkfK߇^ ۉa2C9|G\W Lj< cO.irTϧSq4jS=ֵշGDn PFrO+HEյF<+X-̑/;ĀHZnjuމy[[@jyQOT?%яqhKmnL s TU \9~m55>x9grNs޷ֿ%[[_h*ə^xk|q_E}K.ݴ\ \; u0|2NQi!/.VZDAb8rrNIxkC,ZxP7$wָOҵ7PԵHe| G;&`%񖯮|5Kis6lFl#drURxA7M*IGX-™ng,60 `m^ ӹtW^Dy|v*.>€1ҸKk{\ml?\6'ҫʮt+Z}MCh0/g8qY8NI_,zg@֒Im/f&78r395_X}ji5(&]G$@?LGH֜6z O}ydZeޱJ195!M/P-n,t;Ɇ8y#?ZIp+ TwW (Q@Q@Q@Q@RDfO0m;M]zscjs@ +A]?z?koP#(QEQEQEQEQEQEQEQEQEQE[vK'EPm>ܽiq;F` p*딿-y7 /HF(?1,O-kƛ_Ho`nQL̾Z;L򑍥1zԚ=V-GPZR2зi&g La[@'MT:t/x<6Mo9hB 8<旭? *+I-fg4(cvh1>R?]h%׊t4\.MpvFbZh,r]덨\^xwHK=(y`W(s~+|Keuqݘ`V7. `.7 rI!{m-xeyXx+1yQ-[ feC#i3gh׺ęԖBm 9SpQ>cݨ 5ni4vAKD3cd_u5m7C+Ȓ;Y"#̳pP?wrހ S٨-巍@2eFGZZQ@Q@Q@Q@Q@Vcas;6nIp:qPxw4c$ֻB4ePj;Kj2%Ƹr1(#G4:Я|90TK.,bB'y{܎OSi#N ɭr]BU 찦MO\xzKIKv x9b\${ז]hrX[F(Oqos%v³ r 1Uk-WVrt{EtdgXBy ѶRGC]*YcO$kΥI;7gnxX47Q4Ree7suyDݲ&^ w{&O5>ZnVC<)iZEH$b̩ 4o/F5ծP5+T2@ҟh_+ini\mmٟjqL6ֵ9aNVV׆)8X1nJH8"-8~ c5( %Lq g1P^wngjGyܢǵCsrY> ˍAZ;x ;ܩ8P30 fkڶ_iX3iY{ymú2IfQ s c4D)i*^!nuMqNrk6-ML/!EDR9X-$Uk|ke-rZ+r2;!^goh5F'Ҽ;Wp\;;M7O$gKvGºG.g*4O#*#1 ;(8:OE ڽ hЌJ6m7ʶG*-S{ Oģk+m5uR· 0 o CƷ6PMhuqv$\Be@5w7Ʒve,RͲk'hw…Hfo9I>bܳBA* CbNEP0((((Z^eKtdڥ=X6VA]s_}tMQ@Š((((((((((zC_e2{KK"XRxces{k!?/\C+KKI`+qgl@NI=lkFxJկӴ2Pё%xmq% dwt^ush32 RkK @}+?Uؙl B71 |[I͉Ȑ uw>vwzl5e8rqx|,1iB.>ȉL /^+= cm_Nm%յu.CtgU.N8oZ߄h!aY_= f˼c,:X.zDŽ?qlm4 3ƷR ۘ-˂9m%;TҼjmO|Gwv3Bȅ A+uW0i^0L gLc}JVi ,͸0s``T> }gCG-VKl^8WN+N:EX\TFxB{yrLLbppwc%ac]4k*G#1 qX zuz`6rI$ހW\vCSI4]:e9p9/,4ZeW#yUVcǿ 3p6 :mDh}vv:J,l쯴6?fKdd=v0:QK #:kׅo*s˧).tCjwrڵiBF)1a`C(n Г{?h_`&g ˈ/_zuX^_ZC5L øOlg\ƅ}/Y<) `HsI%8ۀ>Ʊoi=O%G"rs< {Wq [YGV/2:ae4 }ex4]:=Q- 7;L#+ &޹k;Gyưu!܋2ǧ2{m&vUiqΩд.bm>+HDG'zWUNsI$nr2~MЮuۺmݾ_oZ]Iq뜞b4==%!mX03J~:1Eiַn"FzԢ9&д,b[Ec1 4xm,-Raqo  $Q_7Eo7+۫6Ӓ: }2y S&@@?!]Fڒ/ɒp{I~U+:lneCt ]xgCХMIEoJ:Jyl}ݕH`NNW_9Wt />̑[S⿒颚U0\y6R OOוּ緲 {4\EAvRst=uxvYu 0Rt>r@ ]:jg%Iha6r⸿߆Wm^Ho>%)y $)#HP<8^w7 y[|j}JUL,h=NƓ4ޛkK(68dFH:85,Vd%0I*rGxUVmGחVzndDA*+FAPMqלB}?AXFRƠ._`fT"_,D@l`g4>{LJt[N?FEtӚe}_]aU3?tv{3k[Fbiч*yH5MĵE(t(n^ ;xҬJrrqxF)>h#&zkVC) 2˚1cj#U.1He4X̨%;}rxJECim"+Xb1#@~(((((((iekhf-2F{O晬Oamͬ=iX_V\ܷ~]j^:L'$At)WrkSĞ 9gֹtʰ]cqu8/<'..>)Ɠ©T2xq^SF9崙]>lBWpk#yn{]Oc5EtsqRUg#֭xG>|+{}6T;h4.979z}.+c)iv-VvLR4wA;y㹂9u)::d^jz̚׉Ѕ14F9\́6Wl'ˏ/zù Ev_Kc ̾Pk@}N(aEPEPEPEPvXfU57D\cW\?RR(դ'tk"Y.&[)$6ҰP}ߡFjNmo젳o瘋!Nv#=j&^*֚PJ'cDg8^%, ^ۭohȮ#ZUUaY6G` :s*|B24 cOfgUtUʘیz{ vݮe4k7Wwlb W dd8k5j;-JM>f/4sBu9̡BShz'zNy~+m4Z6TȑrVD #'4ǏH;u%Mr4ʨl $ңsu*~Fױ,S协tKXoqi9񐯐ONFkwt;q{񒋴HH:k^owc`zݯƳVd92*9H T_ԭZi@<>fdH\8@9ꮅGR^ۯ/sz}r FMQl5D[AlOqwgwN1Gjg5X{9QE ( Hc=V@2sY~Sp1_}tկWCᾃA@(aEPEPEPEPEPEPEPEPEPEP=m!?/U >>o&5&QtȒR=90A9vR+xzڎan5٥K08n$kM̤RFs;5KV-/QvDdp]Rv$#P[\ڈne;\|Æu\_.t#QԒ@ؗ6!}(^[Oo=JYR IbLrWA#u}rI7Ms$EKrv%cW9<čj9W}Od.7H:}Kz&.-'Ro%Ŋʛ$~ ƭ(@%"F\8=WpRѴԐ"E䃊[ۯ .΍-ՓDhUЏ (7bOc C-[{f6Cq *(`(0(((((qe@3\!/*Y;Qylm5 m h.e0qg)X?14E"M{we'Z l*r~_=w*CPsNK$qAn $8VvQE ( ( ( (8O,8 :d;f7H5:IX*ȡTO05>K"F\jzMMF*ҳOJkK4jw$VK+lrv ܁z49,WYŧLLP+x,vyb_/ov[{xbiDyVy? jZw`AjVᨴ[hnVIb`;r8${~.Z$Q4wAX#2Jv[I Ȍ+g8k;4Wtv*Y;? P/e6"~}#ˌzC^q w43Ʋૣe`zQMA$[8]IjqTKkQbkAM,}n #qg'۹,,,VI0)GGf@>^/tom4 ϯְ!<;pݽ7,`p\HC$gƗiZ6wF[3I0`O\+t=7LwOw$ 5=LYR+b?GST}-{&|A֭>m6c01DP=FxzA.gAI4>}$ '$=*ӝCKԚE8|qG4e-"(TF@˫;qFj]2cJ9ValĆª.duFpiWM3S]:|1tnF~Lu{4i"X/INғ@2S?.9Cm]ƥDZi<3j ST+@)տY[jƛkisy#N;Wg6y%o:qm',ay_n2857O֤}Lrgo)²2c h ֺ=:R A"X^ :_{H-#%ӫʀ(XӀM(C ( ( ( ( ( ( ( ( (0l ǤI˟H.{*UV%Z6hg+$D(,4[ ouLb DV1sI587Y4xM% p,V ,>ags i$KĊ9vU5O#ZEդ"]Y~sfp &oi~!ѵi<+W$mraI:^/Yj}n<$s_C^WYTrWȚT n,f֬';&uk] YWe#(aU$6bɡ']u 5Kg .KNqʰ5^c_7MOGOm*1ֽ:\(QEQEQEQEQEQEQEQEQEQEQEOUE{waYxKU̱6)nVA]s_}tMQ@Š((((((((((zC_^xv:ևp׮oܬ{ɝGOƮvK=hzipr$}Q6NNq=i-t&ߎ5-}? ލ=We5ͭJPH?~7pJw |?^k#n} O 3KD(.Tېǯ\ ֮]سϫzmFuJPi݂%^;kxQlvILs2*F!YOONm{ۍO˷1]Fp)HrZ2[Z0 WVZesKvO'hZ^{ImVgSԖr68rʹApc`KY~i&qǩ3,bNC7RqO`NOjU|-,:ƪ,i xV!U=f =^jnjǼhGގu^OQHaEPEPEPEPEPEPEPEP+ BP7&5LW#c Ȩ;L}Fd-eWbMgxJ+Yfo%x%OړLI7+C]n%e.-#/>&ܭz?jX?1cr (S[@-t[P2J)ܳ rI@jtM_MEoDtz29͎h:|= &+ɡ~_ˑJɐ>I"\k1#4}SOqP$峹(=j亾K:%wRuqp ^MqqcvipKvusYIG+/Oд:Nmnxh-^s0?jQ@ʖVu[X[klIrI?SK}gmg576)I!O{Egh6$:>ia KXV%f!@>գEQEQEQEQEQEQEQEQEQEQEQEQEUYoAcmU\9/=v=688կWCᾃA\+A]?GSEP0((((((((((re{GgCooKV)r(zK#xGX5BKR{gncY 6 ~TC|uAbOur'>CZ%%\|7d~XԴjtThD0Gp+Dfp$*0Ga~O]xd=XJڥNǸDTlbTnld`'I״O]USkJѱ8mhPs(EioD5Qw 6Yϧ,JZi #-F?+ߏ2Cg8FhC$*eqbW Qcs*\ywyy9){[7⋭Rk-:RJK7q*KQK3=jH/^H Y$QI(31ʵiA#t:-F~QhanJ[@rDl ]!;h2?xj ШSJ^&/×V>?5{(;CDyq?25op74}+BJe[N{9|$g˕Bc~3Ӄ[/t]cW}V."KIcm{ˑ+ؚ|Dm!{ jT,oydn_7oC/gP  S&۵[n;y U's]= ( ( ( ( ( ( ( (2MsN]\6gs&7!qY=?mo}(GЄx=:MWO6FZOt#Ha/Ɍ&O1{!ӵJ=MMSNk{"i}1e,E19t&i6/is'\} yj-Ɖ,jjۻ tٔ#һ_=7KԾnc(ˡO#&wiOhoFi$̅[D|Ś5 *uxyt.V8uUO+qxO_S\-{ d33Exf'UE?č?\Iϵhtb{I?-#G-#2(FrxzӼ\i#ilGyɶgɆa(P>OxjRդ1IT@+A]?z?koP#(QEQEQEQEQEQEQEQEQEQE[vKטYTNn-}.ֳ',ĭGHy8n9o)Zpbd.mV@^\^,t^r9~2N9K[Xm1ON 䶖a* 7`+nQGx. 5A s20`f;B2rk; /tMSNQvP\AEK @ξ(((((((((((((j+ʞjRYO0g*x@+A]?z?koP#(QEQEQEQEQEQEQEQEQEQEvKבi_>oi0Y~Cu N h2x'5|- TԮ=7SFX` .-NiUžJÞ0nuVַ׷gR[Bȧ'{W]>K]^RT![*}j){.kjP(S+**4%NC ro?#tkVlt KU=Gq~/&u &] x4f"Gi,QNф^[jWm\kUgҨxymix\{Hm 0FI{zSꃡx)4OԦYմo["2Fnlvױ$^i ΔMw l%T~ !յ}?ok=@b^NH:|s #y8~g;7gvKP}~G Oա=N{[Y4ױݑbDCĀFN:tYj7ИW#̄0uWK;FWw\YNlps~i->A;5]bRil+[BF[!IchĚjv:CW^En<?ݒ}OW/? u{{\j7U6!*1=I?@:(QEQEQEQEQEQEQEQEQEQEQEKV)<Ï=Ueqfi8կWCᾃA\+A]?GSEP0((((((((((reX=ׄϓkqn@F2-W|+5zK\?-Wz^C6\M3gpvRf*l|>񿈙GXn44kFqBNU @T>j6ٝO[r!2$p}[|:-i5h@]h;9R tiO>$#[ZAݮ-PAFy}l%{<){hwyoe:YĈ2 gx_5_~5;_qNSVTu#i#>Vdw;ӦK{CU^Io1:41(i '9ɫvӣ5.klsq"Җ@ʨUª1RO=kv>!ƗPop#6V]-k?5;O^ii6w,RHQR| ggȧsu> []*95ozl_&F[Jy|etmR-Ƒq[ 8B09ST_"ouk_x"6S<2k+8w?/ݒ?7#ToVZޢam$tJKa?7"m۴W994۩Cy'/asO{|p{χm޴^b9YPAq< P:~>f\M]*}rEIg2#&*F0Ddzקdtί6x-~=k%p(QEQEQEQEQEQEQEQEjE-$.68'zu5/-.ot&ӧa1_BP#PeݏDžAOXk͉|~ؠ aNks^ Wxu R8&Yd%aV]p5VIP_5ŝozq* d5|7̳]ζ >VҤe9H,o;[I]NNg, mKc_ާwx7M]dd)4CRv3]-gh:MZi km0͸w'}AlQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Rbl [&YoǞMpq_}tկWCᾃA@(aEPEPEPEPEPEPEPEPEPEP=k!?/\%S:V ֒g*[;s7RrA5zKյF.8& b m89FO|:&k_KKo Lg$|eƗ3>n{o%-ۈw306?/^blqm5yb=.1>Hmk5ӕ*JF7(wޭ+'KKq.켩VKUDw%ݞ3Y0>|CDm棠q XصȮ劰c5jqjEaIQ,%wܤ10zsW y<;}YA/V %5nwŎTa+Z평<'ڛuK.%(y'<JTfִSyy$R $!&9oɄ_9.<XZ ٙtea.8k xb@4PX܃`>,O͹@I7 8UF_| t{X9?\,M%^+ufٿ4A=r8kЬ'4٥3FTj'氅+ǍyWAMiy[eǍ/E#<SpQ_}tկWCᾃA@(aEPEPEPEPEPEPEPEPEPEP=m!?/^_iW =fbm&c#29oUǥz딿-Q<.8L} pMzmZykak Hc(f4-ݝơi-٢ [eGA15=;Hye 1Րw`{Fo xK.5iIsѻyͦw6滂ev )]T8*8;FpsŧZӼAm?[H$KX+9ɓxmN8#9k3xKA5дi]j0FkSPӴr%,pDI=d&ZdVwolKWʹ|p2_ƶ*NA3MeRȘb NzZhQE ( ( ( ( ( ( ( ( (9 \;^~ceD @pJNz}msjz]:CDl#O7`D`4Ր/Z}}s0Ɇ[錒'յӢIJ4|*F2rOo=gpYPddX+ds55Jo=P`╜c:Q/aq FXn[dnǧK4-;MXZi3eC!}Uqb?] (cy"[NHUz#$^^nߎs٣D6FTEu&敭ۼ6eBk=*pJژTU?U7u[HaA*Ulkƛ gPL)ce +Ě%αgt[%*L0QGOZFY2 E:ƾ.a~Λo|쪶ܢHIRsM-Mtk!E\mrr(^+4ZZr魩YB(uV?B *+#Fq=F^Kdy%`FnO4,Mcwkmp)Yx#8e-Gq&>=4.~5쌱jmCgG`^Iu6F3^o6sq$Jf@/Gz.mTd丐@:9pMÃVWī BVn& *iyF&9+0B31#<8K]BH3x"]JUs}!"8h" 냁ְd hUĺ4iֆʊ8bt/"H9uӼE]X˘@Hy(`HWdm̞tA3GBC]'՞5j|Kw,v9i6AAYWvݎsUKwxV<:-ݞn,mt2ǴG8GG}IF ca0gs#Fxȏ [.Cp0=j[FE8Ąmۜ}J9:Q\(X}=H?$󍡃1Ү ȓ<4{,jQYrkvK8K)h{?RExE2&4kvrV8'<ɍ%ަye']  \XΘ Bx!}6\wnǖ~5IoE ppq2@]힚35АhP m.s?_}nf#ehҕ<]j~/N"51$&!F]Ō9n'UIcI-ƵeE1=DsG BZ;M={_ 9Ӿn|edzWakvjO!SDA1:Mj  v?fp(֬Έ7c$y7ƽOL;[}^^ZPaTJƥqYDM9K٤!;G~m֐:+7jgGBIg$Ex#h&# :+2[6hA,qO4x?Ԣ[73,aG3GBI&dđhGB@V\ݔN(?ēG [j%&l\ :+2]j!'E=l~V_g<?:=?ZҢ"֬䅜dtG<ɱ[kvSn4PzM?ԢvV8'<ɍ ٛ5Q- гPRQ^]͌+v*q6S-гU]cT{v'RۖXJVA]sѐ#^GA] czA@(aEPEPEPEPEPEPEPEPEPEP7hR쁘(@^R1}?Z;a'& #?S=Zy?&:m4cv?^?z}O} O ݷ׬}O}akEǓcv?G&:m5akGtpݷ zt?z\,y?&:m4cv?^?z}O} O ݷ׬}O}akEǓcv?G&:m5akGtpݷ zt?z\,y?&:m4cv?^?z}O} O ݷ׬}O}akEǓcv?G&:m5akGtpݷ zt?z\,y?&:m4cv?^?z}O} O ݷ׬}O}akEǓcv?G&:m5akGtpݷ zt?z\,y?&:m4cv?^?z}O} O ݷ׬}O}akEǓcv?G&:m5akGtpݷ zt?z\,y?&:m4cv?^?z}O} O ݷ׬}O}akEǓcv?G&:m5akGtpݷ zt?z\,y?&:m4cv?^?z}O} O ݷ׬}O}akEǓcv?G&:m5akGtpݷ zt?z\,ykNys(Z+PYi?bK?c&%QK? +[?G,2hoXqd ɠ5K?6$Pt~AUa?V 0HD2gttQEQEQEQEQEQEQEQEQEQEQE`QF@AE`z 0=P(Q@QEAE`z 0=P(Q@QEAE`z 0=P(Q@QEAE`z 0=P(Q@QEAE`z 0=P(Q@QEAE`z 0=P(Q@QEAE`z 0=P(Q@QEAE`z 0=P*@W,H8;cfV+mbEgrA$!@I$ dߗ >±4K>jzL+4 y(GlszE`P@$ xdߗ >ˆ+y!ycCuG!X\\ba*V&L$GzƶR7Bm7FBFYZ@9^͖Ot_@5QL(((((((((( (Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@q*<,iȲGyLD&̞B3H޹Ng,E]&e! AbE=( :iVonZ `jݥCj~P$tTQE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Qڊ(ϏG|j(>?}g?Qڊ(ϏG|j(>?}g?Qڊ(ϏG|j(>?}g?Qڊ(ϏG|j(>?}g?Qڊ(ϏG|j(>?}g?Qڊ(ϏG|j(>?}g?Qڊ(ϏG|j(>?}g?Qڊ(ϏG|j(>?}g?Qڊ(ϏG|j(>? d99EPEPEPEPEPEPEPEPEPEPEPfotocx/images/twist2.png0000664000175000017500000011377115247006660014251 0ustar micomicoPNG  IHDRY IDATx^YWv&x#323r@\*ȤVYL6?yHbdqAbgDdlmnfY"Ū,,~?@w}[8?  ӿB܁s=7V#xl?2O%@p$_lXwFr/ǝKrG>? IN= |< rƚ/v8 @1ٿ~(9t|) tOp}59B[^_ֺɳ3݋!_74, B 83p- s9k9sNfc/ok1Z{|7Ϙ")?,q^f{.pgV9I3GY*ks?揀 <`"0bJ9!(Ku>59hC9:` :l+9!@#XerUp,aDJA1&8gJqJZUB1r0WRx0eU*B'RJk)Bk @`_{KUk319gQJ !t C@c1KɃ .,)A 9#c!F9h)˲dlGJi)e4XAc !t:g,ҳ٤( ?xyY/\wUqc|%`L " P}nQF:k a fzhkY=I0E>$Yku'ӧOuU5Ml6dc"bGp铝yYx<.B1x."0t:O| ԁ ouGƏs6xB= s>RJc~<1BКsq45Ng!˒41F ) +Uy`sZٝN2QUUB!Timahp<'x|2)=N)e3vww1ZyUď̃F !&c> >Ӻ1FRJYOZ-vz%A #z1Q$ct2" g"\ QAs$Ic 16̋TںRJYhxr!,TQT&|>w!AsGoPƘ 8c c V;fƘR9ð^7[4MnYZB qQ@$>~s qY`*]|6yaLYֲ^ں )!)c,|2loo߽{wgg( 0 elV(,9< ~,*u{{bBmks{l4av1Ƈ}$ !$zN)?<<A[Z\aoy(eFHa*B*)%:gC0ca?^ Q$!DV})8p20 -u"xGB ҄yQ19Fb.ta}cjSJ pFh괒$Y-,^Aluht:ٳg'1&<믿h޽{<%Q0Wx 0M3IIfgvuBƭKEU!;J% J c a ĄP0f"JR pXP$@{{B$UtAgB:hBB),˲,1Fmyyiu[Zjnwuumm[tbD"A묅@A^Q)clsݻwݽ{P9'y΄X^^x8&q|rraeYq1Zm:c,K'`Ee8w޽f%ekwߍRqE|IYiq!$ZkƘ"4B!(QUiܨj;;E^T ɅA`UUg3 ~'{̓Ө#,ERJ1t] յjl7$ ὿d!D)R (cXe<+5" (VN֨>Sxaa'DQ!Bx"% $:zϦq^|Wot{b&ʺSι҄R  _Mdjiqq6Xk0B#  Ξ (~Ty Ƙp΂ I1FWUMxeeycc}yyn6F&Yף0&QJ):!,wwdc!!$ äVk4ZcRRJk 9B²,cJ)PkB !!Zuij2Khf`#)e?N, s:O'!wA)!϶(ji y.pPmx>@JYBHEaTkV[[KKFVO$ "1AH1AJkB&er Px:O&3.EYUZ)%D,K)%< cL FGGUnܸyppHFQ\%1AcBgieYBjR*h[Ro)I,Z^i$iYRJcu$Ǐ-.,8 ܼ0RF!V?lx@1Ǘ&RVl63F%I;VA(R J `"$B2B"ښ˪q VYFeRJJs*!`\!_wwv]Ֆ&o~?weYȭ1 Y'Z&0ƨJ7g;R^?x|s&hU"(L4Ig¢|63!(|xj+6#cu^̵Z-[__ۺl6, @BJ9%5N)F9Wx< ;<~v||t7h9ZXXR޼yڵkwMtee!T%eX,њRJ)UJʲe 9c RH]${Q)OYeRe,Id&2 Ã9@nz|2 kh|'(9o q !0F8ϋ KKյn$qBpι D3Vk0|Z;NVsnUJi!!^E)){O>}m7o޺ssn}}9wtt$\ZZQݾ}Wv^o6!m9pV 9pj*|J+kl"dYfYݺyoq1^Jkuxxh`\09ctYOf}q79XimsƜ5N2?Nc;4MʲԺ ð[X_/u)E`H)@J)1&@0ΨP)ZM1Ƙ gSs &"_ .]7޽ !]'N$)c!1xR?x!Ea9oyvc` 0<}X]fi:N1BcJ5Gǃcɻソuc $#ZΘҺ, ]-0b2$Iym~4MZ38n>BP)H)Cy]ZZ~V7nݺg䵟R~{{{q3ƔRF,KbUUK/]"`:ιS ||s0^@[nq)s^1P[bw2%qDaκ|1!Dis֛@<c2DQ޿pqkqq!I88s9SJ a瀳C rjc"ٳ/f0A؁/"`B!FZs9`k•+WR׮]g J^?>>sNQREQneY޿O F19'#+(N dQf^(LJ9iYNWi[ͻ-,(%:v2DeiRJJ q/#Oe{;^tG4H \Yօ(8RJƘsN1Ƙ?R֨ղzY\\ZtjzqcBY 5pSB :UVHRT!llnn7>)/_L) 7nHӴl""lG Z]_(@JJiYBqng\pt[yW*`0P*,*p4IeNSt6s+/_=< ޻{J)!O'?i CkmUTI&`4aiY==g3H5QCĈJ;Bwߙ j5!t2$I_tB!IR:0aBU^FpowӧV;ƘR8)r:B0||B 8 (JYQ~Zk!#d2裏qөA,--e8FqUU8w 4Ͻe>; ϫNիW9ˆsb ֔\UF])0 0M ZPQBEqǑ6d82 Ί\1B)ݝEkߚ0&$)UQjYm_sN,IP (# Ax69礔al6x]-2`x219))cZۧO"Uh=zTk1Rbs"R4L Fѵkצi̲̝u2ƌ17o޴8B1aYZ!Øjk\{W8Ru690R !"c*<<< 3ʅUY\|> `k]uPJcUBo۷yysBF)Xt.^גD ^sLnl%8AY`Q7~ٍ>d29`Rӭ͋p:֚uJ H)AAʄ|4apγ?ce|>+Z3vww.^h6W*1f=g3|6M)|RkV)1c !@$Is`Ip1)Bl:BȽtF)AkZs yB<lbGWj>K.˗^xb=ͬ0i{aVTUpd21Fk=>|ӟ3 !ɴ([n}U, g.Z͓ݻw nw!M3!B11FkmE^q.›O b>88.--AB-=+x~Z !k&MSk;STdϪmAlQVRJxtƘh^z hR@si>Gael6e%Z+ <ӷw>NDJ3( g/]xeE>LZW?C(M{}ѝ{w8 Zh>糍~˯ !Fpt;w‚ R1..x<ϲUªԔ0_g2t8o޼yxxaݶE |+Ƹ( ?̻_91z~ݣ!h:B8N,'''\h8DZxp|tx\TZ:_/iw=Bvנ IDATiJJU^[[[\hd,˲ꕗ0ҕN*5QW_~B<ϋH 8N(Z_߸rJFT7nܜL& 8 R*Il6{h4/y.)!ҪRB!Wtk~^YYɲs͢(`0fykONNáou@椔H)_tBHUU>8Tf9G UZ;iZt™b:k,'q'hTVE!':ax;%3i4C#xkk+Z0|p8xYU'qR !FۍKA}5B8d c @GJ;g1R/9880>~Fl D^z㣝`󓟼Q@BV c1Xg Bt҅$1lww7Oy[n L!cb:g;h6n9Eqβ,c*s۳J !NeYٌ'Vkqqqmm}yyg<A竫cFwcQMk_e~B@2NYz*`c1x>o^@)΍cX>3r꒼jcs1> ("NSFWU6|#y0!B/!$‚Rj<:εZͭ88>>>r-zg)aQƨ@sՁSɻY̲l ǏUUh:cd6 :6{GY|,B~;av{eelK8իW:w-\Yk1S5,^''?#8DhB&ɽ{.]~)dn#zSrF8UƓi$BK*/~ogVQJjYH):R|>7be^oA}<<~DH!rb?Ǚx!pΝ䛛zE!C[gh.Bs: uႵv:>xBF ){{{B4`2sWyΖ{Ӻ8xK%X_[A Xfjfytts~Bf읺1Rr!!UU9犢f^BBc RGZkQxrƍ,ˌ[\;#5J)c̟hxmFVQ06`(9眱V c*?PJJͲ,y?ވcQQLTU%q|qsOFz]z Bʲ*i*ʂP$ Kb:/ ":(%ZaQ '?]\XrJөk``3+/]h4^Y9wN)ˋc\@J !,BBg! ,(JO?e_غ͏1B`1θDk9QB6Y)NS9}je(.dRE'σs~.<8_<81M'AkAYW`eynt ra$ˋt2-#ç^*2 !4LRs/@e!$,r>cWʲIAO/Bg#TUUA'E8{9WU5N c7nO~?ɫBYc 9='xe!DUU;;;Ii@pZ8kkݽ]`YL x/ZAV3L^,-Lp,B0H+sttt'4bZ+BPJQJJkEa!UY9 @FFD+m:o<}nҜ25"]Y!:cWn/٫ι!DJUޠ:g@|n{5!1!:笵Bl{nlz.SHV; K! #**t!"C Ӽ[}N| | XkcZپ>C$IVJI)}}||S+t:F0FZ]ڙ 0!1nXg(),&gu}_k-G!.^n_~&oe)Xk{^y΍7^}U_4(`㬃!h^'c!hnѐ<nxqd\m$SE1~1twCgw@}KB7PhJ#0J骪*d?OֽW.,,t(qUU>Boп?4\4˲$I1S[oYey>Ç~BB,p9BHUU$Is֝ax2 ]Ƙ:}~o ,iJ)-,$[RBXiqA!DKs\=1|>xGZf...^r^k4{{{}ۿic8' :⻛?WPVA0!PUUǏ}<~8MM/B[kkY ,+B5( Av>WVںp6L𪈟+z|#Aq!huuW_RNS)E ΢(dTA<::Rf3c,|?v߿!E1Zqf]Nә ^s|gO|qV-//Z-B)1Xk)y.\`QJgٝ;wKX¢,=z)1D,$MfQ unx2 ð^A̗oseApM_c$ٗ>VVM&7o޺uk2x+_ B._.Z ʲ< !W\r #~6AUU7cRJ)-UUax<>o;>>gs!ts\J϶%JWtp nEQeΎ7惯q^<!n )Zm'c !Dׯ_v1ի.\̞3?l6ׄ$LhqgY6*w\g=(s^/W<˲t:n,Kc|>Z[k^!$TJmooCgEgFn5<>L%wz}5>]!HJyrr+s!8cZ#vpB<~rdkv)%XkB8TJ)C)ϋzg8<,NiWx?6BWJc RZF)K Еebc, qJUpT{|ƒ^Bl6H)WVVڇs{ !z׿~kww054G4UU?x`cc#MSp9 !(>|7!7s7N 4MSd2NW_%,!߯G2[n޻sck{?O F+0ʪE>eAf}2ι !BBs( qNƓՋ/M7~{wvvbLQYVBpEy i7zQJ!p~@IRS9Uc`4fY{tpıQly&iiAep8|<GQ [(-1,K.-//ӎ(i*A)>zY~:<<`|r2y䝋1&z:Ndl*bwwl^~˗ RZ(g1$I1nid2裏={#,˪!H|?8v8qťs=\KbQz}nn^o!4#!y6 /'j vA͛\typdi:QzFt@vNS.[V`0D B#F9B P,"7o\_^Z ^ST'zC"x0q9HPcx `T8砏gg}k !fj'?Nnۘ k֪z!D)W^y5ϳ~_U1#GVVV|#GfgjP1N)4'$I$ !ɥRFa\mnIa??w;;۔`'j %$J0#95FX5h!xg`H&dXk d(!~w:u2Z-:yR9!530cƀ+x9<ƣħy]u:F.KO>y]ziT3j Bs;~c+FJu"^/,VkXm#w]ry۷/BF(FcH[c!B&FR?DVu85dY y .꓄Gׯ{1C! 쵱rHFk16tǍǣcD@#,V./) `P,(n4OrA"U(A=_ .X]Դ֮ir.`nl60j4(Dli1;=#(8is&Jn#jFczRZC(PDq01Bӫ'V%jS*RV>U+vSZZ(c)Ҕ,ˋo.e^WVժ~ 36&Ah4xɛ7onmmMNNNOOjc(x}]xXT;jMMM/lnnNLL2ロʊ6" k1i,/`ИcFRk)2DN7`F!ˆ1? d81F)Zc1ΓZ Kno3gKf\Q\R,Sgy̙3{[X~݉}BHAJieAf_b7sBw]) `l<=sbgg^hZ $\|˿4M1À[k)R F18BƢf8h 1F ǭj:Qwbtc\KI0B٤J?kz瞛VRQDZkk0TiysO>uD-˒=1xH >ViĕR ڽ 1h,1c7nB,--5-*;_{a ]OR3s( {n;19.,S8[i277e6"d\.qˬZ|DTcq8ErB0W^ |" qkc6"R(AX!dBq,ZC… VkuuX,RJ؟9B?|y.=ϋڭǏk0KỬJ); *Zk|'IF׳>q]w}}\.?Sw9ZK0;;;V13di{{{A9 GDEP%j211eR88Xܨ~7M cBSJ9J0 8y`5zh7>Xk1J))RϜ9駟٥i >!bl4Mk~Z~w~~r< faeYRBPJ(Űt@F: A#4?PJJ)H(0&&[~ĩ LE !dnn! -( 8:Zfn= gÃ׍sԃugqq_z7`0#<,$/uo}%paٳ!DZ(2ƶ(T*4hcf13O4JbB0|߇c=ݻ' ւqlmPԹ4Jn_>|VO3ǟX{ CkDaV7KHW2+RAsϝ8q֭[}1i:')u;?SN ;w{{'a,i _|E(JA$I+d}~OΉsN)ÅB8|g!""LȘ(Rgqɉ(/^R9{aEȢ ܠT^ǿ|W}cJC[c*Ae $zҷ~{폠|ߗRioӯj ft^}cǎ[k E $!B7nt: r/,,Z[u0Tpvc ZB{f !1#LB1T* !v{&Wq{Y<}d`65yi9t!4dY *h$Y۽{~g!VVV~ӟ:.' DkxC59 !Ƙs=z… B~ot[o駟@%Fy.R*MS`_.(F|ooomm^J%q׃( vZX,J 4؆B%g'"SSS~? C!De A'VW1%()c<TKǎR߸q#MS% FCX<~~\V_xq~mmm4_y_7߼sg+L϶Z-ɳgB yG$j.^S$Ɉ-!!.<#:uh\zukk !Row ZTVbP,BB|'B0qBPr]#r}}ʕ+G/ rBH\D\޽K)cLCʀ'}H"V$IÍQFcqq |8aj(ݸ~$<`chNq~/ezB8$q @kSBJ4zyNAI)औJ)#kέe[C"ds/BDkIc_gJrP""D>}AŠ;ؼHRZm qBcT*FNGV.hRe^rR( GaXK^|E2B<)Ì1q677A{ʊ<è^0 Ϝ9xCbz)0@%ddh)ƘR8 0YJ)k'K0C+++ ̙3`-˜aq7QɲlmCkch< ^w, ӧ( 2OG_{r|S)W766|8c?O0sssaX[V1R9\1'%Rzx"CKH8s~gA98i~sssFC!!t:Yg`%I;N|F0l0ZhKcE 渘07w,&`%&(wÙI'y.gffw>B8 By.\733 4[< DZ]]B Ran3MS3ZxѴ1PJBZxbӹŕ7|… Bz'Zkx.8BPbc}___/;w.|,xƘ#3+0RիW/^$SO="cV3ƌG"FMB* \׍ɓ?cvY\T*ݼy?~u]TZ~ze qh>LL !5C"8DZA8 Lբ7rVk}Ϡ5 c{{{L_~eYyHu<8=+vvvtP>[w9䭵P}@臎íczI0:~ݠ<!ܸqݻJ!.0{'OV*.[<ɵannn^t)c իWB) 1@:peƘb8??K/MOOC1ι1& CxwkւQ}11!%z=Braa1aw]qy%b)ٳg$t\FÌup8LRT[Y'À,BXѥ(SN͢Q^sE9ܽf쾇~E>qjPH48,tm!djjT*MMMA>7(BxA~`&^W8afK @7 CXRy7zz.,f̙3Rk.`,d\!9H塨}Cb@Qb~E; YkB$IrMбcǬI^(>Z633S,O:UBk;UG !T(N>=9YN1^\\XYYT*sBP",C'''k33[nuӧO/,,2ƲQ}  B8BXE0hd!c1FhdG&BlӮ+YSL@钔tx/ tMk MJ)orΡ=kL4ZzA?VJMէ, C}'d84X/*<|h0 V$hH930Έǎ\h)$-KV Kc`kc:^ej Bc"̲u]5#R ;8Q'|ZQH'1B Bqz'xz=^qGZk·1x >z#)oBᜇaY^6[ZV.qoP$I|׫NԢ$P*&LKIq}k)#52^BϢ IDAT^/"Bi2˳$5JN,WK1BH$Y†eW]\XXܭTj_b0N0Or90{lt?~Ғ8q2m4c)pBZ(6%<ϲR RfB!7Hf~ܗ_06$_` `}5r=Bܺuv^mLIA MS)H_}枦9,C)Ej8(e`0zƘr$Iw%f@7 ޼q yakh"KRFÅr 0AA`R~T*'Z륥%!=PCJLN>s"4Uj!rcC {'O:z ~ZɕTinւs,>>zR,ۃ !l^nV+,%PJlƘ(1@Μ$I|ߏZJ)? Tꛂ-~}ʇό~*cnX;RHfYW_}jGI5-. Պb988Fl9~p싐EYd!ͰRZinll&*r V~nnN)111~;pc9˲?/tz}vJ'=zt__ $8b Ν;7ozb<0drε1ԃZ1VK)UTRB`(M ƄRVĹB; 1FȤY C9onnfYey1(&H9#V 8̲LCEsl4̕d[{_g?ŋwPF$Ks(Hġ8eyM~,-4ZawcL,㜳 Ma)e\8jRQcpfyP(JjX*Z߸Q(RBҦTK.k‘V9=݀ ,@~?@ǔREQ8Bxcc:55E͛7ErIJ!BxbT0$f}ڵg}\.O93Fk5mzRF51~hL2뺁RX,H)~icl/@NE#I00Jq{+8!$sIX| PJl9rDf*rIQTYxR:H1m ܾY3zZj)e~;88( fypO}gRSSiuRZe1BFkmwލ1&l!?cZ{Qu:!NY^Z!$ g\ӋYAZJX ,2~ GڀB1jʯ'8 _epfi?ɉzNznsV*WVggg5Zk^ݻ7n Y<!r]!!Jݻwֻ{LMMr)eXc,4So߾> Ǐze]f#^5]gZ~1֠I4MR*=88Bp9 0$nݺ1(8h/G4Ԓ1BcE!x'Y(P$u]*2&Q~5qZjNt:vSSS 1I!c+W|ߟۿE0Acm3;#Sl.Ω6ZAǽs` B!1A[FyK g!PRkkц`L XcZB,v%!1FtbXP\8{~pdq\*"k]Ma,O3WuZqT*qoy'ϥŘ1lIGs,?cIRq9ynR(EMP_X8v'rBf cK'N@B/-QJ1F`k|BC54\rC*n8f·iJDBHB^ʡBJ`"J<+xJ+ cYjڷn+A/OlbFp8Nؘhy:g/1m%$Lo(b8FnRb_rG~yVuW=7GjE$JKks`z3OHIQ+3~I8S#,t\[[FSBV+VZT tQKyH鄸!d{{W+h/J}8Xq^SYJX@]@)9Q$( +ƐS /@9@4ZϦSFII!|`6VfcQsXۻs?ݺe\heG3y^8EG$86AAkNi5!Ou^{ BuE{WWWVϞ=eъRGYڢ(^/c\xQ{AHB) jZ[UUzOZoZƘ,˪㜣$)N(B.n`HFóݝݝp&V5A7U}'7v=~=;:-lvopE i4 sJIۍZk&2F8F0ZWUf= X91JIx3bF_2`^*ˌ1ay5{xdBr.n.gs)DῈ(b={2kv+gQ̋ᰮ'Ow|@wΟ) vy aƘ4fYV?#~~m+f38DQq_.FZ,cD(,WWWoݺuɹ?' \ꗿeYRJi]׈bVw0\ 0SNN%xާKA)ƼGe^l|j$Rh4'͘p^AѸ<+(i~?lft#_t8Xx Z}Eu]͵$IZ) nSJ^jt:\__W^!΋!"PB8CQ~Ȳi53FYj8 HeGiJ) m.hܐAXi: v… ~w yMkK!؉輇w? -,n}:'W}#EZ-UVlyѣd{ssAUƘtf)"Ng8Q KFl;,QY, @/zPx !~G? !Ƙ_tJHnZERNE!B ;NGS{D:b(oϪJWWW777<|mg7zܹW|q[޽x߆ SJl jmꬪR"Ff^?mllȈ;[d%I)QF9gͤRG\Hy^V\DEU}vͷ>xz_YˊZeYUWaiԁw[tgAѠfYVQQ:EJő,*3^Օ†ò}GY>LE {7Gk\ع58ptE1dr=BK/j& Z-!DUUW\ B1G!hDs\ٴ(trv6jZ?髗/_f(UV44rƹ{ De`u_o3jq:U# A` xD_78_{X DYU]Bv#z00JuZ))Rjxzh6d=x`VǵOO_}fBhR[nmll,eҋ$JҪ?^[[[__˗beE80GĢ 1hV3& c,M8n ÇlvrrGI9bc[eʘq d{og*Jȋ0E΃Go8XşcQhhIDAT aRF<ϭBN4 yϧlo&ɳõ ιuB0n` llvۇGiZ sNپeY p9EXs x H~mRJQ{g{뺪UT(s9UUV+r/]pbˋ\F ­ţ=&,/Gd< @~`||aB&ܠ>99Ѻ]]]\pJ*YCZUy^%*z R 1F;9sq6[])c /Wo+[Js)Asu:w}0MVeYX@‚>.OEUKJKܠI+ux <Ώ愐"EbBc(qXeeEZx!DY3MwݻǘhQEY>g~Gw_KsZ+,cTJaN0iAO%!OnnlU= 6ͦs:{g?M,8n9D ctO>dgjucZq(g@$3D*Mrӏ~d|VχyV >;M3F +E[i;J7XC)Z3, 6$ .DU:)#BHP"(G$֔HF:%Lpr!gO?>OP kZimUJ'IޯEQdAD,!s/B F0758nzNh4B$mx6{B!{JYgYv7|'qy\ |~!,"0t:+2!D&q#ʺU(=T)Ye#)^Ӄ*;q헮?C׭:/ ƹb=N Qu]q|~?NݝL&Fi{ Dyg5Yʪ,J <5U+st2ExR**R_OvU5Lʲ\< 1),wQXV=@-2Yk#)cZ}Dl;xttoZHP P,  "NAh_k3Nsfsb%QI)_} .E'5PZk38Jz,;>9ydww82ksN Q!"z?9c\:_e͔RaE8(Zk$DH<,(3q!Gi4ͺ((Qw6IYE&IQZ?~Rn,Zt a\$zfst2eY4 ?kW"ٹrrLq*q!' W_%|DŽ׃!5C ԵFR4m\pK.^X z~R J) *X_+E)LLn޼0I[:cɩι{nq hJgR@b)rt6qk=jE(%(U !)#elB@)eV`Vl!v>sRjeeq^e0TI3 a¶]tr<K.]~N&p|Q$",K/_ eYr9l,K`@rE"gP$M!u,˪yjmlf]?oݏ !{<Fá84[_׵6 $Zt:u<2Jmk8^/n6CeG;.Rs7np{t2!3J%$, p-zeA7͍˗/z=JiUJdr|r4jeV"1Z;뚍f#nL㝝, )D$Һ*M7ꪶq ^U1Vʨ,+2zw}:OcL(ó, ngچA HQPe"hF md<ǀ4u<錳8w>l 1-Rb[O? x'n ,ˢ Clmm-I(!qSJa㜣6(n@׻r۷o;"$1] xB QEB !D]U2ֻdBVii]?䭷?eYnwkmYV٬(\(h~p wNkB҄P8QV\FN[paγJ- ̸xx6xReҋ[D\E1,/_vֵѽ{۔ҍx4yGQ˲ 4|'!d1Ʈ_N'{{?y2!͸A zcGRFQ/(#yʸRlTuB·_w8 (j:˫Z Bhvlyc56i6JQƌt:˪Ly.;cQFkE)YA%p'i+Mi^p7@rшq[o\YYzyYq4͞:: d("\vm2F#)eՊHu!I?xtv6 ֺv:d<9~v8<=-\+e9'IYu]E1MȊr2ʴڝF|~wᑪ,ϭu \GmaXXg(VZ׵&STΆYgV2"e$@ĺ5>sh<:}~괉e4L>8VVܹkO>RեtRǟ}Y%^zumm?Z !1ƺ`lmmqƊ0JqγٌB)1XccRJ)X6H0(QtYh s(tfF >BVѓ`*x|FBEȠbRUU/9@?"p,yJEF#xx5|p:͋kNGrNٵ"0BiKy|||Ёqvڍ8q`ZD ku @x${Oz2Ƚ\d{vdYy6c}ٔR*ʲlZUUy^E—:Mp /R<"Z-4zp͆9frac3,/ls^{h4^Xo:y>+*i577/z!Y *<"5Y~|rpѓYQZe .E3"KNEKGzj kt)95 V9pRNjmmnj9J4MSJeQsA;^Na@|U[9l6Lh4|8VUU2{o<(mf٤t`He8@_D| a,::tuD\ cB'z?R(BYcLX{pfqa!FpJ)H xkٳgZ[Tuk0۝^8dUˮy _!]lC/mXB3[{o# oE8U P 7!zOhX/Xڐ&}`687.sl4Yhya¯_~4|D c䜳x Ι` ½ևޣC @ F(,d`Zu% Ft&~(tMDDJi.t׏ ~qre!Œ׽n?ϓ8AKK %Byp"A矰뒖 2‡yzA%9B<8NjpGo`[x|#Ћ| _93k:=}}Mh.?ǥ <2{~ 9w7q6c`[7IENDB`fotocx/images/jpeg-artifacts.png0000664000175000017500000007242115247006660015714 0ustar micomicoPNG  IHDR`m IDATx^y]Wu/p;\<l,#ydH08y@ɗ@t_'xh,#-ɖeIkkp=ޣSƎw}Yg^k}އܹ# !$r@k J@1" 'I8*I DJMNT+* M 0 ()h@@PМj I4 "\E((4(MK@@b 4AHKDj1J)M D\qRJ !R+!@5l: @K (!Z<I{AH))m^~wBO")^ >WaIJRJ)1BH0/JeR!hr JjDMOM+GěNΡ ֒hU(!IJ,iEٮ FT,q*)֚09)֋2IVř n^y.2=fDA뷝ƒݺ$b'(R8N?rR)%Rsֿ UefXG ѷe]((P yht['V{>2M![PAfa`R2Iij5am(J65=/,I;η@m!9Њ2u"3bx峟:bɪ~% !x/Xf !(Y)R McV$8˿vGȼv"4iC M3B#4M5P$Y3U!3Q"mT Um(@#N c8 ҈9OQ)H Z8M@iM4MXAc$B RZRJko뗳{F&,L)*JNv)e&3:֌10'I,ğiۻ`ӷ!왬DI_*T7J4R pubTr4&m"]x @(4H$7c0ւ(J,iB,ˢڼG&"/!J)!:R csN)"s+vBh4E:"#K2 g|@!6/HG0XRӌJ@A9:Php TJ50-Vp* ts v6hzm|U˒6;z>%jB54m9aa؎!,;WoBɲ,BO45R ̀/H4M4L!DARC1|d<2I<ʳbMFg/-xR ;OI,4!Mcv <(@%W@("(h\cy"hAAk&DXD@0 X'4qM59K,37tܳ@q@kZ!tQPrP @05|ƩiD$I |!,mQEAm~(B*Zilp5j]kB]ێvReR*MS)%$22iOO$,Bc 4p@AKEՔ-b g[!hP@H%JC" %Z( Z3- (xi;g9sN>W@h3 8+%$(A4/ٻh=}{lڜaoϛ^q 7̜6hDa$Iw[3 |ȃ M x $`7[B0 '(/@3NǬ$ 9Ci ]a$q|D>=劫X8g?}s|G{5+Zz Ǿ˦ =g+ja ztGd5:;;{/]7LEI$R.AP+ Z?D>FOUj[4MJx"(Id|[X~7ݸVs72<|_:ZC{;>{ά0 }wluH$WuMyaBGBH%Th0 )ԩc;0Ep3c?{᷼]-zN6,GqjxVgwo6<^Q,?xo_>5[l;vKV -ÈrySO=vڹa wmZ(3,;T*utSO?!.d%ͻr%KNwΧ=z+޳QXǡ$3MZс@uA( 2M[i"۷?CQmذmw\,+c۶-ǖBQ\Ga&^e4<"!D,#BaQa%@M+ m ^ ֕JP(4z97M244 AF.I\.^s+qN>9V !=3My~t$pRf0PmiږiJVB{ҷ;<2t/G<#?$Jx0vZU=}屡w?Xu_rْή|2SN+ J)8T+aѨI)O,WÇ;vlJiJ=ё Hѵk=9Y;wTc%z'}|:{4 c[;zhS?yr̙3aq΅+WrjVٳglllŊs=JfdMmYVRV*CpLL=v(D]8#<$^:6GY!$o|c۶mXu0 !纺4ESjvF FF㳟%K>ő7>3MZ6R8I`,4q˱e&QMcђMjOkF2:n}}SϘ6gٜ^n5Z08ԎO=E o~˻}Es*%Uð;KS(~ $ 8}Mѓ;vg?]xYggC~uwؽ{wi?|zjQ}O?wK%؄ʓoyڳ_S.Y~SLYjջ种lٶȑCtww]a=z{$Ii͚5>~g}vZYr?hǕJs"DB.dVP1E!Z0^h$F0 w޽i&XZ4"򌎔RB8֭۶m~ni֭>u]L$%tJBQPZ$I ,INA$Q#Fʵ4JAD!mWz: >u*5.ls)gaRgG8TUӧ}َ9tN9t}@oo^T*B jfU널B5-qgӍ`tN쪜Bt :;֭xS FܲeutthMxEE/տ{~8`Fy^OOq/_hѢSN ;chhhŊ,)BsN3X(%:zcc#Zj\HIMӴ,<˲5팪͔:s]*̙3Z 022,  tR)㿵Z@WWy7NFQ?>-KbG73-MT{vw^ /]}ŗyDFŢ$~rytW͞=?NڶMᆵa[\|IXs颡b^wHgΘ=K0Zp[q5~wwR]8N)c_x衇>\T?wp{_[UǏ+׭[7wjhѢÇ:usݺuW_s|T{ll ma`R4 zynᛖ]p<$}s. <8ob%#rT*r9u !aBRZunmg< ԜRկ~udd?c PT~Y#=rY%~ f 83A+IjۯT\u٥K$2/utU )sLZ0I  袅KTRY4<5K̮*Yn )-h?N(6o~\ 4y(zU?vŪadXvZ EI5YjR*IMҋ;"Twkih(ŽRӧs]wջ|>}mڴ4ZAϜ>1?66v0 RJ,* 2&l~z6l]vhhh֭F#SJZkh}~e̙-:tȦ5 U,Q%<,H0P25W$#+>v `tttٲeϟmO>_-SK%XT'IjqޱJ뮿Z*͛wwq=r뺝RJƘehϱRI};6n,]t%ϧ#1^ZCG):Q8VkJcF}0$Iji__O?p`w|o,r/w]s^.x O~ .Ydiyv+C aBpKDJ)mR?H54NH"1&1֗R|W]uUwwiWJ B^2!X3z|PJr-ӧO,+Iq֯_uy6 ð,%d:nݺuO#9K.X@ѨV0 ^6 J\)eR)CCC8?\סX׬YaÆ;vؿϕ~p3CnP.c[Z8|'|g…W}?iSmٲR:44o߾Z6<<\T$ITٳWXw{7h4>?iǎ+˨o A<֊vww/[l׮]=؎;Rm8qbRiݺuCCCwy֭[~rw 7Y7n~߿v[o5IYf 'ZR1 c,WȍiVJBe0КO)ؼDyG?bX(lۖRq QJMBK5cyTZmѢEaX,JFcxt|\)Q\TƮk]?}ƬB!qoWŋMNT,4QJ2Ƥ0{Jba8F)Zwww'IR*>ر͏:vc]yݽ+ e֫cq?888o޼J8y#Þ]zcaa&(ԪozӛT{T*ԩS(,-[l9zݲKB&IVcժUAڵVA7˗/|߾}NJ$ˡK+$ٳgOZr}}}W^y)^|kzٲe8RAziфH)X@@m惡ecPΌ|f3Ҡ+ ! Ȯ4\.7/ r]RׄaPJ;::0Bq塔T5<<RCgF}(L|wry۶8NT 9(!I!ʍ ZUǑ"a$Nth\4MJ SNKP,dkJ)erc(}h@knBt(N,J*yǣ h4b/RZ @)9ǿBZ@I)cqs%4 #z FG]RJBqlF$IX+Q ]DZ89!Z۶`llh5.vwwQ\oRJ0"(IaLc4M,F ؖRuZ9n98ZlJ)1E"V.s8NJJ\(;JEd&i|)#Ҡ֖e^NӐְo!U sQ(,b$| U(RRJp~NmvR#TFQa._ q)fBLbSb1}?B|wl3I"Jy*mیF`J J΀0T3!$Il4M$}_) kB뺵$ IDATZaiva)erZ#ضmۜ(s,8Nx&MS0hWUT8rα09"I+2ñ i+I%-;+ɑ4;ʔR赲HM)e6%3A *}`|AK~-z |A=*_,ŠY|Ь> 7-xyġՐd!Icx|iH]Z؅*hVN(0~򿁗4gS"  ˴/Rdh~݅kÒd9':gfak/|ηs~0@f/Q̗XDtۙ^p #e@3L/u ~Aw El?VsФc\q hڦ ^xQ1 /Yp}%ٖybF/f:|{ ՆE#~DC/$tl#떎eYP4'LMoċ&mL& m۴|:@s>?4r_8mr>c2Tgq>1>"yɠ M: ɼk N/5g:p1Gz : N0BH %_ Zt|`O[Q" )b\].i+IL[ |8-#tZEe|RڭB(\.eY;ER*D! ֶmGQb6>QǸ&^z٦: ,@By juy+3 !&f_u̐oHVAJ%˲rtRk 8h)S`r9@1FlL@  !B 0{>MS Rѳŋvzd QJaJ뺖eu4;6e8㤭=ӑد#7o< ƅWe9|iA{\ E,K0Jiu !Bi:::yAx5adq#/9aڵkҥV iJ)?O~.zsY:::sR>H ^c~g{Q9u!xw'`#`ipXgiѣGIeU*yurlY!V[lk !i>I-1 \-A966Յ=Rj&w9Z bXiۻ|ӧ(6 ja>hg̘rʾ0 [l-oy8ih|iB >oo?ϦL/bZg[@A>M6~[l ð^_{aƜxWB:V`I$J]/;o߰g\zG-?=jB./SqjvI!DP7o^>>|H:`|…-k3frEdymr|>?66tiZ5 \f*~v5  es ,L|F't'ڶx#'q+<#~{'|OL3gz?[sç ¶'4+fO=q_Ç8d.?{G>?_o->G] ۑ/tO: d g4M-b(%(;wxG죷|P/3铿7ۗ,]$irDZ4SgN>7ļ{{[COTh / ͸Ys|=Ҋh RB\wnl~|Kј>s{Aiq4]d%]:V.ݻ ۾Ϳp;w1c?LW_}#^󦥆a>8xbs 㕚z#׿]vٳgppR m4s`Z9՜FQZZ/\pEw}]߻{gM|xc}=y9h$Ԇ;?A;*F/u( TcǎQJ-[Z(tggi?ٯFFF|?<'kh۱N>eYVCi\[׷v=mLJh{*7?ٯrjsq4dɒo'ؿY-ZZDJٳg]80u(lrmWթӃ #W_}>7E+qN-rw^ 1qdE뺾@$HG4JIJ,Yk۶attt^zμ9rdǎ^}k{Ϝ2 rCr܎8K(D:[l722h4p۶5eghCLuSQ`FoWw֔0ƍ{3<<3)P,猓cppG)5(sN $9-Y߹Ӱ׮ L:}'N|K_:yE]|eYw<!!$ήbhc 3$8zQ-0Ƭ֞Z8ȨVki4Zki*\SЌZCR!!qSJ9j5IVũT 8@$S~\!P(~r"U#ô4=34d\iH\ggie{=߾[\sgڶm[}]Pin1@+Zxr7[DEpLZ,:{ΝiӦ3g̞=;:tZI)۶[oomoͻ^oomq10rBFa>o2UFCkmc4M4Qz].86p,ŒܴIkC$2Lh}~RJ Tk- U SiX i*\_Qk@08RDJy c;0OΚ9skVr˟wu %KlSRJ;:M pΰEtM^}͢ vgʔ)I_,-N/W4j|h4\r]1aÆ]vm߾+8OZ۶Mr4Zz=۶$iQ_a ϛ%"}? C860 (BQƕB T* rǓ8lǵmN% ۶gϞFsfڎyf˱,] RJ ?ԺuWnɽ7?S;vڵ~z@XL^N*=z$Uͷ 'OZz5k.Zz<:j#Gsf/_(H)o]v_X(aUxrS_׺=W\qn}{3⋦wttl+.(G\ӧ]Y^7 CJi6q\T?xj'M˗cXNʸa)';wARшЄkZA}Sj;~?%YuM²,e]dɒ7yӚ9=[=Κ5 FX 8-\0_kY-՚ʕǿoXb޼y;ޝ$IKDBH%f@J"׭Il1s/C~c}w5\3sLʙ|%];fĜ;wW\;5>>rȑYyq.\8^N;::8Ze˖tRJav8@3gΡCzFactz+gϞׇ/fΜI) rܩS._DZ_32uђ]Bao݃#xz.ZIӓ9I8NW_u֯ϯ>|7{?twP8p]~{wOGJ;Wp(MzjE>woYiJXt(,l$R H jh`uY6(I(6ʛ}ڗ r4PU?Nv4U \ylC4 8eX bꄀR í9$I G?z.ز,8~mE=v׬63 =q?<0#|>nvJߘ1c[~/4͇z @H(>^e`Lewak:8# 4*Te5R):uJt<M"oRs2h}IP1(Q0XB)fQ!8\^f@)c&4 ˢmJj53>J)TpzKJx2F7U8eDR s9:QMvip;@~@ *M%!s&GZajbTk1@+D)nXnpLAW Ҕ\$RZ׫)@` 6'!۬#v0 1 ^@M F_, Ѹ ءW"V&D4 4ZkXWW/2h%ed2њPcs6-KF夌m1Rvwwoܸ,!P 6@CBHsͿm۲IFf! @ڶ_乿Ԥ NYN&)B4 !̞=)m&2889猚JR%0 4✆qP*TRu?ˍLS8eڄiR t$ToG_,1ZhZz". @U~I^?ih< `AmrNֲ0XOO0 h.1"JQZkQPQ"wR0ms)pZӦMcA&2ܠ!TGGI(L E !8nZv6TSМW9E 7q̪t˽"G}%3V@׳;=}EAk"cqcFOeG{(p )RMӶ,fY 1&M'$g\Q~zSW-8ۯhl< MS4H`G-MpP\puy)8~hf-ҿ¸MQԗfmoV9@a>.O`U/An<%xcW[fWU,py7""Օ :BljReoB-(H> cB7xzAW^+g^7gݠom5ߠ+ T:;x2q2k6οZxmPuӯ0Ρ#'5(1zcFVc?v&lSx{U:/Xy1YZ[ i'>4ŕZ0 |60 uE(iN&dcjy^$NYVV%K cq]7ЊضmӖRRJ0Zk48ig* ̿xK+1NGQfc|rP(BeYeascT<8>'zmHR4G]r$ImSJ04Md+JGG:Iܥe%8cYؘyyf188b )Ȋ1B^"'PNDl@h4REi:k׮0 ш`B0UDΠɭvfYiiT96=>ͤy1!4MuH_R)EjB8ָcyRJ0Ю&(p A`3yiY&B,rcEQ6Exw||]>ADgg'S(N:k׮%K`g84bf8.V˪Zg&1$ah\k'ݠ_< 0M.0 yf"$V?쮻x…w}EQK)i2Ɔ~oڴ)"1Lӌ?я<>Z)$ :u]wݵo߾z8ɓ'×ɓ7 IDAT'68|mݶ{sn6c 9d3<я~K/7o=cr gQ7W\cn翋(d=_ $}?"b544|ݶmw1}tc0ZZZ:$R.ٲ;߻GxE5gzu+ϟw_ДrνN;7Gy:yQO9g[_~)S_[Cx˖-s{/obժիׄaE~G.:??8Tw+ Wʲ]3"n@qٖL"?ݼ/]qw޹`}+榔.|[{'n3zzO>>x&){7.]·߼{߹˞^7)???j[ Ip̀#}>K}g3^g P,"K|yoVǟ|>=76kA&yl$cE04) `Æ 쳏1z( |ߏ}?>aˊoY+|߱FT6nRsگ|ߺvsf]zWÐ>y~K JZ$ۆ sٓنb78`+Wя?-YdppcXWWk&w6 p>ӑܓv!¶2`TX#8ȤP:ъsJGڈԋ/p 6;߹ uǟ~G?C^ݝI%",\xL)^{xIq8mTƘ񐌻㺮z3HCqO>҇um@fΙ=s+%cEa,!x׿rܘkq%N60ZwdRa㚙c=ɣED&gaG-$yg̘q4e`.;okmFqc=y{=B8ě9PY"<=}JcS'e˖_~9sϽ+W3gq{zz͛yVP-Sj:orgG,@Q*",.j M}ORT*א&Oc8 V^/|}ӦM(|u(hRlii(6΍Û$I;s Y~RgRTZV*֧_YS|Uȷx'tҏ~뮻n^s7/{{͙3# B)e\!`ڮeYx~P(,Z(IbqUV||?tnA#ض==ԘIm%99\޲B/Yl/;;&͙>%kI&TT )g_O?~uQ,cCCCwueY'OfoRbO~GޖȅI`ەjHR=FGQX 1cVEJQaXBѡJ$N"$t:mvRI w6Ue===iSf2 L"8;qePWÅ >j쾶Wc:)FrgRqb˖-MIlڴd _6,`BTKǭ]v̙3,Y裏zn>ov:zߙgC̙?K;T׿uk{{Ng8gv>D=䣋RP-;ṞrMk馛ovwwwvvnܸP(ض=22Oa9tYg!l1׼hѢ~G~I"$R{}%r!N9|k (2S]AT&CDeYtz`ۖI} ^&NB!Jr\2Vpƞ;y]r`Lض=>{\g<.}mS{s۾cxxjoϔfp~-Zte:蠃X~M7o?3ϾpwuvN@i:}tcZ)$R׏,R DJ)KV(x\RZ0n9,FBMVJpTRU<C+ '[Z)DZ)1vRjB2" PQQIzJsD:+MHaL$+0Ue,A"zq$fَ` U"c)Y]dj$8\8%*B-c)m!R;fY\.?svy5@&Q̊?oHOjSJ$d}~[>u'x׾u|ᇾ~^ZD,C[za;#$$zKIukv衇ahmNh|C5%49REh&h+:Bbf#rJ $&5w9H%pAR1 M0-8cbBZkSCGS1$: в9h)Y•TŪQj3rSմJa1Df@agLuŸiD mD["hAk RBX_5J|>~ENqbXƵR)ox@skHqiT6sRQ"KAv<ƘT9jD 7o޼aÆEմڙd$"W ZFXJ9G!rPi%l&3ΑKI!!֌)OB-"1M EC}\GD&`1 2P41,f`0f #3P 3Z'4 D2D8guEBWpEZkDZj9G&1r @7v@ŎcD;ZJ>?CX,z~j2J97GR(-씎4 0խG!Ij@3kBDJ^DQ""H%i]%PFE^:Hmr B-ZrFȉiM@4"̔yv-k@HD@dD 4iD@ "EڈB;A$^ۘMTy8,!VX?|wlZWʥL&㺾k7n43AB0 MR)S&trppī_*rJ ˒ $aLXUP#f5TYgM zͷu 3_Mun^hBd p"2"JE@ C 5!f41 @8'V\4WHB @͈F@BƑ3yEP Ȁq`@ӑDD2vy@z3+97K> ZkK2N^*N *ن4i*J̄四wlZI˹U( Ɉ5:MhY8hFkatʼn_#@mD&uqhLiL'  Mq`+S0J@&91I@ dā0=_C" 4a-ף$D4!h faѡ.Iq8ܹsjccJ5B868J&m!A65@T*ZSZ}v8|0:FQ3ZkD4ۛѴi@DeS~g @M<7!$DD@"Ҥ@AHs f2an1S泹nn 1MQPkJ1fhblG #R3$"4# 䄈-ADHC$Dd„  "8$Im[+cB'8P*P u֎3vj5p]WJܔ5:Ky^,RJR\.Lb>s@5f|21a QkA"e9LiPJ11 HEHhqn(Qؖ+8oii岭m-j5IORq֭c##Ì1a9e$Ii Q(4[W:q'Ͷr9q@Ru# cq,d7PʪFa3a ѓ"@,GǷ8ƘI$ӦMC^;?$BŁ\.=ϓVJyJ{bP ;LL{fBƘōt`qR& cP+ ̲r\**|ɩT*˲(2[ŧNBDRH !@*-!RRʡ=#tv9:ZXrPmmmm2nc6aHQK '!P0R ! <$ܾ}{*jh=^  B___ssT50DՔ7~l7[L'&MHR FFlE܈Bn:"noo7uk22R-FDBθI*-i-nC-S*AA@m##RZz Aa1΁(I"1B\.nݺ$I<3K)U*,jmm8eKEci%0%ZJ9qLDQd캮P?Quݦ&0 p*˖I#︠%ɄCȘ"xjiknH!3THg#c|R @ƉJzZKIkBDM-Hj@42@!jwT)ɸ͑8v8X@kkڵk$IDJmn%g m8iHf۶mٶ@d9-(Bι%j3 C2vA:'zDC/*g31kfOsqb[mum>~yu{91] g&I"`0fYW^׷ør@!c`|xkib\H@mذa$g̘1 .Hh@Jٶm6QXnX;L" QTu\_ixy+;cM{̜9S9b+^|{NDHp}.^sn<$dc"cc ao޼`g'-<:N~{5FFsMF:"Y7U8GReYq@kdL*S9n5\dt*--amaڶT+5ky+̙3c)![s+&PJXeeg\&pR5p}R)|+Iڵ2)o[$1V c @@ǜ d,Zk"8%?wܱu㫓{m~679cN?ŢJ'> 7zw͝;wѢEXxgH$lRJsl[w qZcñ'ݥ?G_)۔k ms@XeDLkm6zFqd6ٖ1D|7:nдIDAT;\rvfk""њ5k6oZ_{կ~mpkGG|t޿e7|2:u)O<ҋW] :ڻ/ٳf44h5'0<~+WR~6w‰}ֵuz=䘔@oϼ >@S?`@X-{`c]wށγ?|b 6|뭩TCPK#"c1(c.H&Os=o9=G7M wR[neɒ%gyq'E@T:EAhҸ.HG36JT* .Uؘ}~c#;w<×^zŅ \=ŗ|۾}Мn~XCO_yZ'x૯:<<|uNzʔiIcc7ЀVJU*g3gyGk׮ye3{__7G.-w7~_w/lSOy!֏K/ hD9͝}Jq{'?K/>ә A{~Zqb@躮ysdE۷ql}{`Rޤ1O}u͕W^ٵ{=ysgX0:.㟺?9s^]iSrM#h!D]/z^\vdh;T'^s駟O~c*O<ؔ;3\H-iN֊qĀ(ϵFZzc²0 `8Cѫ{5TJ'ez>:J@q4iu&FG$QZE6)J7t?dEtɌJel͚5\T* xll7B̟M7ߘoijnnnok']~}kkk[[k7A%˭Qmڴ) Cywwwq2iX$ƹC?tAa0o޼bshѤ:b⸽#2Y-N4iYWhlꔾuv؂wvvq{x3fϙ$熄@JiK"8#GQ8ضmN&WJ)3:a8NZs /lٲΎ#:$6m۞e3ʯa}脓Obյ7x+^N=\Jkq/QQqb8k֬l6{YgeR˗/_MMMӦM9sڊ⊗~K_ضT>CR`]&#iv5k֬\gժR0 3gZswפѦ|P㰵TY]Eg# ( ٺuc&6lڴ)r{ޫիn\#T9@waR\i ZKIkeOOmI9;JR+/m;kJY,m۾?o]q_ha4BN:6RsW#+2ш\KG;;sy=uvv"w>e>8s>y>zI4fwݛnނ {{'wuvV+]b!eqf9g{a @Șߝ0- XlHodB!57.{9ꨖC#;::9#k Ͽ$k DZѱm( }ߗ2QVRgΚO}P(d2^u_>uQ‘︳+%'|ov 6wtfElƪU>l6B?|3gΞ:yڒ%Kegyf___V862hV>̘7o=iYVss8lGa}Tx)SoX6lذ,:c|!¸}[AP)˳uG ձ 8іe# }womw!m$2<Є)eWWg>wn6a>K}( %IR*}={_g2sƛy,˚={^8sLsq5.^xaڴitSN={6P(QCCüy9眓$IXLqҤIzyZ<===mwvv~߸qcSS8SLq]w|IFk6=Zk˲-Z1e˲$1LSN=g3gl:9~}777Og{[cȲmp9cʔ)]]]/($A$I;m4Z"RKuӟ;\o|'Mtg$Igw%fYSh$Iv 'M$ٯ^|;I8$I\&?"#̈h#At:}X\.;?mD$IX=Ds='Ol:MRήÀRR ,kAX6䁠ZMP۶mcuϚ=̺0T*uN*I'T~i 8]5/eDZ__8)`ti )Y` |!L)hi8~Va-#c,C#o-2A~ B}D4(kƘ93,t&˲=^/JƗR2ƌ4$BbbݫCDZ8JlCP(X"` Sz*qooX,s93bj;00JLk0ƒ$᜛jJ$JJ̠snhgy0Kr9\.7~}׊/lf(1dDDD!J(<~ܕ VB˲ ҶJbێbur)&.p]O) мyRJi3Ymv$Bu(Z ۷K)M Mi?GQ48Ì V1}U@1 rX򿐎qy<>Tŝ cu@#6ODǯuO # hז1h6MX,0P6菓8屁fL4aNV]1bzR<5MIENDB`fotocx/images/paint-transp2.jpg0000664000175000017500000005503715247006660015513 0ustar micomicoJFIF ^http://ns.adobe.com/xap/1.0/ 0 177 555 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((+" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Uwq *i5zEVpjYER1L=jg LhFELj3RD g_q"UU=@P3`Ч:j;]=]WxNL+v,\_Ƽ]ͥƌnd%Te?:csǿ֮Z{~Wآ9YqZ/Ύ@b+#ʰ[9\z# FEϙjy}>2UH${^xiS)^Qy%&tdhԲ~`05kͼicxO%y<8Ý津]3_.4ivW*YcQW7i(76,zd=).3K!_Iֺ9=#_ͼE5|"jk{cǩ:Ju5 )(((((((((((((((((Zך@Vr*WUiEH-B"H6)Ҥ@TqK-8DVjQVUi*ϿzF ?Z-1KdppF9zf<ط^l-"wWޒz̷p,Q]ǏN*ۺlqe 6 +nǡNJRuGðŽ9?g,~}vD2 ?8]{)XT8p:k-8H$U/J~9Z{nrο35iF$?BrZ8N*6F%-ʁs4nBe+T[ާiyuH򲑞q' uaQ^uǨK쑓Vz{iȌ$nqzʵ.d*=s\ƫ~Qh Hi$ [=ִ=M$ @x+$?ֹbƯѤ[E@_tIϩN3Nvg{{ToԈWԶO`kȵr]^I#|{׳ݔ t7@]ŹVp,{~]HYGuTJN6gx[S<$ :Dƹac,,SI=TK.]'00.s/?rݳJѮlt;tƺUh H<1CC:] j_ - sP[-ſIfJ`1>:gOΞ5;hkXl2@=#2_iգ%X S'uWxI'ʓmv(/w"y?+>$KUڶݪH0O$mJyV5$cY_k]ӵR*e@y8;-!-`SW̿>ë_nL'4/ C"K's³z-IkbfYK1 nXjω4/â_^i<l`gq.뚆kBjrYJrPkEo-[^b<, ?o79b1n;mwghێGny1AwL<㌱zVf \ $*;ujZ4r[ a_vªXdNEg'drj:R;x Ο[X/ L`q qlUk,,c/ʍ OC0,--f:xJp rCc@Mm/=ޝmfLYc8z> `Xq +OOڎwoiV̔+}UPr}IM}kW~PH㍠O~ED/o G{"=H ?3Thwr<F)d2r!_?YKcH"zD1ǩC}"$l /Sf5-#4vݎ3իi#ze"GJmZ;Z߻8}G޾n,K &H]D_HӃQEb ( ( ( ( ( (."̞E=XUo[NnBZ w4_7r!(B2yMN,2${~5IIJc-9'¸1HkmYr\YٽI<. U;|c}Tim%\aa/G+&4$Ҵ#GjĻ6{%KGpS?E Y!+J6/ٹ-Ϟmb]QR=xʴ%kFy;QCg#;ׯO<gj81Ucu[5;tKfkH{_Wbi1ePcsMTJC>ODCKymFÿ<t=g>tc܌5([+yDǀA q;e$cZskdW=W߅|Ewd{+.S{YT {u}ZޙGqk2WFczTNQ@Q@Q@6 ӥ`k^'_^C~*95\TS@.0Ź4inBXuf*.~e﮿M#{b7':o❄{Moݯ^i_6ỒOkZn ҟAQHT񾻪1H27یb o̸f/!?5Cm >~[~Ui G))ÜTҬeu|iG[8?*SQܴo:$ETVvcd½l K \^hZtM>|c̍72kU&cz1q<ͧlYRH!LףZx LX=ܲ*` \IV8~Fs,9yY}s9[xj-Sȹ9 VènM_UV3?A:eDhy!F*7>X߻&m|5`-SOLєb= TKzҭ/n=xe?z%g jP t{kүO!9؝sʶyXW}/LIcXJv)3ǩ5ieڛ}F9]kJuZM vn qsףK&KngWȯc{rqJgk1<|d~UuHJKI*QޤVxZY& n5NI*skڋU 滋qM)uai%%ʌ,_^\-Vpe'c==*0$6Uzu#xՌ9ǸUF<%;D 3C,7~?ʨ*"I?waRhxլH&7g`?=?͈4+[E;k)]ێC' Ty^r1 Mp~bcbc1wٻrXJNs}SQzFm=W5`3U=N `Ї_2M#ncoɅ}^VFg})R.mah((A'O3iG8'`jbƶx\6e6G$GAX_mcN팞V[<~7Cqksj*:Vb@NwScֲ?[Z]?VRՕ\E:_Q:*%*32H^svg}>?g\gmP/IGh"&/^TmX`~5MgRY4Go8q.:;?Soi!rqHmLnFJ'vԥNL~ Tt` EjW[Ϊt$Zj9[ZΉNXuUm.Ms|EzIY< %UsF6]ދ:#=)-^Y*ڮed>RσOL|˝;F|G_F1udOYAr^'iYR״Ili6A S)<{o᧊-nhep/,Gp3= - KS `3}- ńʸAt#9J*ZSk6>!-uM&.ln|r)=A"+ٛ bhWFd 236M(#[X3Ü}@<cp?AO<ql=3[z8b%IJ#sFAQֹOVZznI둼48 HG=j-a$MUGzu7I/]EP5+2xW tzU÷/% ~gk*~o7~]kepej3o >\t68)|VU&-Ci31-`rGjP]NG$ݹJn,2 y q'&=~`V-džΩ~־"r/F=w\.5]\w8Oo*/!JwnweJm);V+x~[]I^y|=M")l>+Xn+6殆>'u&R*P%f$zm孼Y!ֺ 7K݅f'wtҮ[ψv56ѳM"T<ǹ^,MlTdyR$+Y{SyQi@:}+Ӽ }ycu%񴵖 b\ʠ6utZy :1 gU4\C4))[ kcQˑ; khK}$C]}5QQpr~,_gGp VN{ublUna1s$|L05xN)=O⻛<IN\WW_ n5kXZU\_BPݚ"EbQ^Md~"TmbE˷_!ON?{zu;"e%vv)G.2!OC?Ke];Gӭ6YYw0(ˀ:u|jwO5̏#%IhmGpkS|{m <=c%Y%Hv d.FwUUs'A 3GAmmaiHX2pFsǩ9j|I#SUƿ61sGCBw lz@99Ey~)QWR|9#Z.v$~g ~I8`b?tnc}qu9[jTZ5N5GrGb8 xmT4t6rgh?nF!KoGIS9u/Z]>)g#=$խ$$`Hk`G9}koWuwao Q1e9g#p= YO݇?C~2ׯm5峠9>{ 5aWshuOUr >s).nu}ZO 1"ׯ9a͏ˡJ*JV~OkxJ7}QT #tGTn㈬6̼fog5_P(]12c< K}۝j;57$Ƨ"ӴxyΔ~+3P LFag#\b%쨇a>X~G?a;3C9rrkХGk)VfWW/AH??j&ڞ̌2qׁҸ6 d` gں&VԄ^?n?AΪ r;ɮYJ1yO9f?4å[^O]+Jm>;6Q$7/<ݏh+Z)}kbq'H뎆Ȫ (36㩪ZݻEf6EByݏ@H]ֱ́!aec:t*:#?^ URxcS=. nUsTbE+[R=ېp2} 2{m?Nx/TT`}8h%ծ鹉?~yF uˊ[Y#B{zΰG'΅n69 g\q@<[&d31ȍ0@+Is.%gcAC^8lqim2Mwpj9>ֿ@~<'E6q[ >iy۫15_B((¸M%Gzc6sQ;\wM:WKD(\d)_j?y+}~%D̎s<kz4ԝ3v%q]|W}}io,UH#uv*ڹFK)[4;Bu|`KG+<I%⸧J4N΋ڊ^GeaR !,6~vaŽpA'/4T؅52I8+:3k^‘Hj&I9=ykPjDJ>R1A#^ΑI,n8X+;޴5>!Di%HS\g8cwk=?k;Kqr##c9NztzNYwXO kŴ.6mfeuUjn{u=+z{EV[ۖpFs<;dW&*I{6\tf{/Z]< q3 e+N 鼄P++R5unGI⫗n`n|?Emܿ[H=jϐ`P'zYg<+wqߓPJk:ӊ%&`K\b}&20FݿkvĖ>`'O"Vñso }"5%rX|g{X8'7E9j&^.^]Ө*Ilۯ, 3?շ$hDF؜qGt(/EH>$F11o5y Uۓg(_-c>d '~kƗ_g6fGieLX_@J%(F]V]7Uں)""Ajck=OPm>ik7]D_WGv7o_[ʩ+(ԃ'z͍n~$_ x[Q.n.fi.'{_q@>qI4pM,W?4}^*:'/.\^\M"e? ZSPՙNLϗSI]F_$#g$m`q ]7c8n}("2Čz k%tm>+n !Q Iz87Ց*Rݜ) mUڹv>|( = ~U͔y`z׷pY{A?5C.?2,3+g~EI+`=T8ғ]{Tsǥ_UYnUsYo.h֫ri *CghKqABj--Ǒd60㞞½ x9JNRzt8剌UZ$N^ gU[Uc{a \\ Zf\+q]Y֤+O6Fb8RH8o[G8<~5̋{,G`S {`9afs5 ?afOAc ֱ>n5pѿ^ Pֳ$0t9k9;Y EIH]9wUbH@c~F7;n$BV'M܍:0$9-Dzz XO{kek.橉杣!U`X>(䉲Ž f OUbQөn\+v۱[{A@wGr`e.>ic_zol$be$0=;|M?>lnbP}اNΠqZu){4UR5WVd1y3#tq班{웡CK~{KF1Ǡ' x4Mc⇉k*Ḵ'rǦz+Lt=61Kj=K tcfMJТ+((Mf\l$-;ڼ7I#'sp;-ek&$>o_Zµa sJ1jiw{Gk Y=J/m8`1];qYL|#Hj8Vuw\Ej1j: ~37z*6"ufoRQWKS?am ]ލnp]Eq塌,vcv]|P Tĭ^1:ĄUsrGV#jF]d9ɧ*d:M 5ί5ҮR.{MX^2l) @F7gtx*1 a:ڶeUJz6,VvE q>c,F*ZiM>&)40{CG>k-?ejnǶFV'l7ZD|X IrQ`IA_EJ yS)n6ViEfEG{y8K7q:4b%-N;ы3/?ImylL:~|rQ y*|G%DlajtW7 Ğ3{ڽ9yq_)+FXOƽl;m]_ǿyUZp%-bw㊭43v_¼^5ty+MykX,Wۏ*?O_Ƹhdk+$mS={^񖓦YnU?ߎ+u:h$'ˑ?5%ct?6{mO,½>WF8bOMvR5%yecr_ĊꆧrO@?6FG5w/^u?Ze>gI#׼aF#?Ʃ~/ aԞIQ@{m\30tyYΜj+I I~RXYYJADhNy=Ͽ eS'5m )**MطQZrHvUvό=[|eM|9mjٴEQEP5Ҵ=GQe--#)f}K#M#bI'󯼾*ok+;ƛpF?뙯_sIlqkwy?f!#LԤy 4ne%xߓ]7ZͰ7X+."/xǧ\YםVHZ #xĒFű* JY?Ͳy{Lp?B+?lQt26^(8 -5 :X"G@jgnvrGwW*Ӎ7{,GaK~0$nkЯ>r% u+QԶťY"mtxW:Cm+"ĦP;(?je]IX2Q;u,G}~!eyiL}2Edw;*XLg^~]ƚ~c0dIA,(wjIyuygөVΫ#dFiAu,VKss!¤jY[&Oܐ?Չ2gb1NI^9dp I.2 *rۼ3 ;|wHNd-]G*h$oxw:&GNZ3?:ۭ |7ZpY8M,{֠6h #xTd }ZuZĬ|?#ϊ96=jͲ޴,JbfnMqҢ7i^ K{Zz&j ai?D76=Iߧzֽ]xJӸ?g_O#zn}O x_G𦜶ZVTe>Xkw$Q<3w72Hp`l(wm#O,#,೴abZT6%`ú7 Xu25 ~z) 4M3B66kc;[q֕PEPEPEPcHLcR 4k1կ-a\o\YQ]XeaI[oÍ<_x2n|1"׼DjBW9Vv`z -KCҮ\jq!ӿyLB9RκJhkink{Ҿc, ym&.CRҥgr+@1aoj~(ZXŦ۲[CIvs' J͓kR]\϶&`ްbP<גz{UhcR2(ܐ))軅<3F$p_\9g Y h:ɨiF@+m@Fas,ޥsGHZ&I׆Շ~3WT͚OaMn|8VvX$ KApQ,#b4{N߯_jlȶu+;o}8^^t9BL*lf3ڧ5_:5d,2]C$.V6W<4dY DK.?U`FP|?ķ/F>ð$5IZMr=YLs{M:8ZH8zS娐G ?{RDԒN$ExbS +tw^i>V>YD4<OtO@Fqc7S%)oq^!W$32{mX4ɿͽ =R>he[=O]S6l*U!`0G_SxN8W ֺvťӲ ]kRP**Yb'1ɪ;sѫ_gWU^C(?p?zg־Чq`*V-Rah]n4/j:Uf;IS_5I_?~(^I GRp{lk&䡞p$ nU1k !IO^#{eH9<xμj>dO,d}?M[ZѮR ?O gHbONR4d#IJT}zݱ5l<kd()3=:&rG,!W'VFR_Rqt:iXlV6d$38RGR[S_A'ypB?歫|(z/] -ε*w0AϠa\xKMFʎ~lV =yǧJٶu2ˎӽtڗ/<.%9ץE^Jlb x0|Z֝J#b=ec+m1(W!oqxo_) }SUԠŋ6bnN}N*7) fokΐ>cs;Z8)s}p? x?A𭷓iZ.<νQ$p(3_6Ϭz5>h3dJ ;ȁҬw>S8`vVNM%`*FQEQEQEQEQEQE~~f-H[4Dki }?d6qJF&鷑XNNujn&jvEwok$@`1W'CU pYL$qY΍:9-Qg$MqO[׎*sϽ{mχuK\C!)8  2NVR;ykoƑj3-z85*IvfOGu+>n^Eј~O/|>6V#CieotWKg 6exO^>:ʩs 8tE֝]Cp"ծcyT.}*[yGalj@'&G[108 淩+Mw,M0v\jIv%o+R29x5/N FHf[kH,f@Ιf8(.U\:iA̐]J@Nj]4ys,ם|`N -EHnRE>ÿV6BHAŒZ+tI#qU"jVZ#udh{U+nAqQ^G"E8'\nȼlORrנQ- KXʠq7;jݻ3ןU)o2˸'~RJDmq j,٪=;Ug#@R%]U,OV)X4vYqH Fdn@Go¤UÒ-=|#i}_ 7#kNpÑ"K (AEP=_xwY_2ז1~>a3kWv`r,AG<7 xNQq֐?^ xg~RZM6F =ӆ=JEKt5&>O >ݮO%C&}1ֺx~|PZwnܫ((E$76g> Y<]Oyp-of\KׇHݯqh{30hVE` W/~<rR{xJ.x+{7R0r:ڎ5^i.NI$,J@P" ( ?kE꬀`ݏ6N}MO=&̈@׭oWF˰eg, m:fY&Sa޵&-ޕmBcd.d,I764P ivp¯ogt˂.c(e9rq/c4j-Y#R nY$ U*Q5 N^YyJ+# eg\q;3XƾL6:Q?\%Ħ[2?zVFkPn/7,Eo!\ @~UZs\TA9S4x4=֙- Uߏj4'5L:gU!2p;S,O=>J9ɱ|5vd2U'%}_|5G1!kO8QT ((((k Cx6{)[[QE'i>޾Zƙg:~\Y!Xd04+nᇏm ~ ͦ|9h$2;k\m[G$ctB~BJ fhHSGRpkcZظM#>/x.69Q&N%"`O@b0H֛OI'!72zS$dւzSPQ!`q1ց g5ڂ~F*zLWb{V.?*XWBeTL@I{ cHǿjaUjvOcڳi^[[k>俾>Eթ} ^D>I%=筵#n"O?[Yp"I?>kMtl A0e h^O֡Bli$eHmϷ;y>j!̖dev~ExF/Rhswk/c;W)jeaR?jHLI?\{zjLd=zs("y[܁c{cӵ#F=jvPH E;X$zTgsڤWcWKsjAv4Ðx&#}) &=iULS%{MHGf5B:G?kgY^-i@ĖQEP(((((f 4Hû &0zuPEPEPEPEPEPEPEPEPEPEP=!E 0QRƊ2}z} B>) :E }hPj( ?ϥ:_E&2՟Z֊+ #n k]?VC:o@WC8QZKauF֊+N'oq%oڠ{E!> P"1x*(%}‡)/)^ZK ((((((((((((((((((fotocx/images/image-locations.jpg0000664000175000017500000033311415247006660016057 0ustar micomicoJFIFExifMM*JR(iZ0232D0100fotocx-26.0: paste area|fotocx-26.0: Rescale: width:799 height:462| chttp://ns.adobe.com/xap/1.0/ 1 2 3 0 8 578 999 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?HB@qZ]jQ$ hzv?2~?2~?2~?2~?2~?2~?2~?2~?2~?2~?2~?2~?2~?2~?2~?2~?2~԰wrMWj{^PNhzݖZj {9fYIm^:W־տj/#MBe>l9>n= '#qɬfx}+jt+(K3sxYPd }|=^"c2Ci,kB4حn㍡ˢ?3c9s]NƟ zKk2a^{ua7 U4G+~(Đ|C1խ-8\mTGܕ1xJFռssH\i 8vV^ &i-Z%/t- :[xn"K_qM|xK^*-| emu<.sjrǠ+-kh1fkw(toYU<6j'itY_u̼-cXjc}mxpo*RAZ[570ṉ:8ZoWy_e[;; H"F9.71Mi |VwlڢXM6MZKyLgeP7S@pXqe}mxSy+ɫXxo{nl24$#sE;x>f[2f<*  '?ًc=+ž#k]Sǒ_abk~?ؗ*Io;`?$tMa}k%ͽży,R"㓒CeM#SCg]LA>\kp44sxvq]]wyiq4 ỹ|#b:\ڔM$Dyh:cp#so0YX뻞?{jvk %'Ss_xK]k<3K⋿ ^ 2Ĉwc<rs]%߉4s=  4լEm %e]1Um|U\$ڽ37^ 8;F~ukw䳹q%p65|=IW[zMΙMgj 6n9NFݚU {y̿PjEl4_kA}a<>-o nH-yF<_]/uSM %#fP7\n0o|" Ǩj~#u9x"/EQ5X_ x'?'93m"V";ZIv֫u ](@$+gox+j=#Inzg-(K^{7n   /W0KIj ,T,܀N 0QFdRPI)]Aĥ_7clh)4Owv6cuǸ+Hpă} :iooΒ_FPFPFPFPFPFPFPFPFPFPFPFPF(`7Vxhz`7Vi_POڞefڎ/ZfQ\ϗv?o3Gv?o3Nc/Zf7FUi!fޤ? ڄњPQk#^9 5zc5$v&H $ P?sc ˏe~?\,jY_d~?}_QqVWee~?\v5h?w >/C(Xբ/C(,q}cV,q}?‹ƭY?GeZ++??w .5h?w >/C(Xբ/C(,q}cV,q}?‹Z`0Ve(t!\,\𶕦kzke:n|.MchokO?WɖB_}۟G۟E]_2[[MRF.ç^j߇GžXYi7Mpd`?gngn x] \!x 6ݡWI -&+k7lzyQyQp~ϟt.m{(ue7B 擒z,2Sz|ZxOsޯ}o}o\,d?| x~Cqjr=3޻ ?OҬ` JG: !0_\[kbbDϣ֣֢b?VƂn?Bo>>B irkbA00u??Z??ZGP:EZ%_v[Von_)!яl ֣֢aß 뚢jWMY'ez2{⹭ pk᫷|#< ʟz7]z]G۟G۟Eg~ χ|1i7 RIm}3G x \Ѽ/ڴw_=Zgngn d0 xN"^}a]U4-<^FR+GY1|*1ouO'>5k֣֢c?O;+O[O ik!= }m+R״j)M9$ɍ}vʩ}o}o\,T~GV-4;}No/#<!jc߂u[PΟs޼C~r1ho}o\,Px3D\%卾+3=Ev7j>7j.5jeeYOC(,q}cV,q}?‹Z++??w .5h?w >/C(Xբ/C(,q}cV,q}?‹Z++??w .5h?w >/C(Xբ/C(,q}cV,q}?‹Z++??w .5h?w >/C(Xբ/C(,q}cV,q}?‹_Eͪ&ayu&-_@$b-\QSнpZaWšaLU'/ ,qI `ΏGowvp: ςoQMƾ5#:5ƙ'z wo"jOYX^vkydQlʤsj/cBLӖ8<+xAh9 ^=YGkz TNlp9듓ޓ?Ws w\^ 8 e Ki $V6r?PQ*G+I}N+gki^[iT3ޡ[zTShz<ڣjF4nd܁t8 W9Yn >Qwo7*|$q\Ƌ}CQ74ڤ*`.>A#^|'".4NJXٝ2$eVbIlwi:|=*#l䴲ZZo'_t?ZO$jhPTNvoBbZMMA!ҭ%iAm[n0z5 sicSٛvEB+lmuWa?t;kF+c9l8;=y^đaQ#s?0g!V^N@#eTar`wsGn|Qb ]V(6,Q)& ,ŀ8njo Kf;Wj{[/hz!aη G}y$ڀ kWz@/,Hт$g#Ou,mnX iLex_,B9*+ 2L{2~g82CHJ{lč(,6$9'8߉%-[l2\^cq$X@XD NI;vzwzniP8G#:ySc{Omi)Hw>|ne O v2)@<ր8Z:֗-1(ΫVV‡砭{Ğ".itc^}A'xdbvXs]-υ4ىQC(md>X =*.|:iKX#I;ʗCP0}G>9?ʀ (Ts*(CQϡ}G>9?ʀ (Ts*(CQϡ}G>9?ʀ (Ts*(CQϡ}G>9?ʀ (Ts*(CQϡ}G>9?ʀ (Ts*(CQϡ}G>9?ʀ (Ts*(CQϡ}G>9?ʀ (Ts*(CQϡ}G>9?ʀ (Ts*(CQϡ}G>9?ʀ (Ts*9lM/S#]72@UF+o\xMuȶ=Ne|OMvoM[";vwWn8C] -0(EfE:k`r~mՐaQOSTŶZׇ47GMR7XK'wy JycPsZ"jinJdgot[k&rD E,F&`A<*49.ooN7?){Ql-EoĪvRd1;XWwߴcƛgyR6$O٬D+vcso?)qg??¾hM=B#}Jh-l$w >fVBφv{gKGď>qgC2 8M+6CO)qi??;ǵsm߈Nm?ǵ ͠RsgGXǵ |shGqg??;ǵ.=\?N,Gqg??;ǵ.= 8Q ş߈¼bY(o?^w\G]Rh}iWr"6f ('=?Y+?;WDZ|AT,`ĉi$ T̛P"xs>g-ry{,MB9Rv7ұ"3?Y+ه׈nTծck`ʏ=0zׯڝqg???y=1Eqg???y=ǵ ş߈N,Gǵ ş߈N,GxX.z''y~# ?8Wcڌ{Q`Y(o?^w1Eqg???x_/^~J[jڝEo}0_9]~k+-VmZk8Rm5^f[cH6(wsIjEs?Y+_umHc-pX7Yݡ<Ս Q^2T'ěe;7RDmĮ"b׃Uk?Y+1IVDo?G'y~# {Q,=?Y+F=\ON,Gqg??<ǵ&= ş߈N,GxDo?G'y~# {Qj,=?Y+\M!lUC\|AsIN,Gqg??𯀼qľ4z=,b2FE;wr~\V='k 嵵ĉܭIzLpf9N%wa\o?G'y~# x=n.t3Ȥ3$*sM{=LS\?N,Gqg??<ǵ&=z''y~# ?8WcړXw=?Y+1Ijv ş߈N,GԬ=?Y+Kj,=?Y+1F9¹Y(o?^Ov kU.8KSIW~! xKŖ"/?=1,r|qF$NJ4n} ş߈N,GqKx-2bMl15?eȲe >\XGۭzß~.GǨ4 fGҮtcq-%R2Vw'y~# ?8W`zRcڐ^qg???y=1Es?8Q ş߈¼ԸùY(o?^wj\{P=?Y+Kjv8Q ş߈¼Ըa\?N,Gqg??;ǵGsqBb{ɠgqg???|/|m8M.HbZ"$]/㋗o[A-t9Fm$yqFqR6~qg???|'ğves隽.b:~HʮGʀ09}R@cXW=?Y+1F=\?N,Gqg??;ǵ.z''y~# ?8Wڌ{Q`?7ȑh-fֿUW~@ 5:UӜy\8' l|?I sZ^& %$U}OB[{hDP43>+jZ[pḭOG+|m""+a3˲ ~B㧗s%agoҥǚGy&h[ XiW/m牴2dpRəQIf%p1N+͵]%]Χ$Er[ZH'H4LduW/]7]j}N5 AHuSs\ j>8F|n-zXbD_̛BFC ך|U]Ӣja~l/Ϋ$2$Iƒ* 55_ |8 >4s#h. g߸ G"8|AxgPּ/75->yQ2ƪ~u/ |.̚]c3:QkE]ne4ZO[3jMKy#sVV;?5^mh) IH>вoȪJ8=]as-\YZ^Ob[%Aw6C<oSi^x~H n|b$pśH|+Jtٛ&j>6aoaf/ʸC#H>$87щ=ct=Kԭh.nmn#QC?bq=@^ן_|כ|[Ŷ|em$pzEuyǟ|9qn麭{(G+*7I; zMyDZ'&NJ{f{VD,dm΀I$qRƕ,<{ "[F:212ǵԨUǵqߴ><Ѭ-5s[ݴn."!b#vI5j=%iw6k7:\}LօK9Y }mZ2F{5*"RXG,9psQqO|q} '/hJP?4lU[cv8jkXO}ch1X ln&5ɾUHWs]ϋmF<"~%]>;W oBr0P//i^sg=פ}-Rz lVgZ~%>{~1э\YikFXpXnjw ]WVx2#;|:kM_4aaXD\<(Irz>x/Ha/mK[*R7|74BOڒAm&|=fڜWdEwr9=*ޙP0ZxKIJ^jR\$Vy DQ߼* q&_ xzkzVk5WRb͊;vj |AW~Nӯ_X.mhVHHo0C+qJJmjoa%1KxlQ%w$@O>/²ij jЬ<E,66y ]nu}o0x2]>.b s+\4Eљ>` 9 wç4KL o;K;ͻc8|ɕ!{U1v1$-ǖLU>Z#UNFxP|m_7%!@ ГczѬ}gEQ& oi8ݷ9]>Dh~!񥧇NH/fj,QۜUa|%ƕ6 "Ԋ:L2dwG;cҵ4߀>~)[֤ge]ʱ#:f 2v&QTQF)/k~]?Jӵk uI 8ٜ$6@Ǯ+?Ү4m:=/Z\p99#$u ˌ]_{?Q|ڧ].*drK1fQwɯsV_ aj ˘c ɟ8[#M]柦w-$u(#`)'X˝.j_I4 ^Lc!O89soZ4]-^࿻hXnK_SYCbx73]2;KI2'( nU Jr,'/3i5O閾}.`W$HK{ԻlߵXϧkijl BȒ:lR0TGm=cVZjR-R"Jw`yb"m3@:vݴGN#_Ff&F[:>Z~i..n-u[BvKλ }Lj韶u-&mBKJCFhb!d)`w>Sh Kx&-Y"8w*Ҹ SEc~Ɠ] _A%枫'GXԾ<⿃toͯA=zjks1dȎS[*ID%kU_E捦GlH)%3,n }Єm 'k:}q{%6hnV˰Hڹ Zc"֐qlm  3+^mܰԢMJ]Qe1aGȱ-dM3e]\YZV(溌6[9 ڽs^Yy9x>o$zj¶֖#<+@\@ɯS'5{5 yĶ:'QR%RbpH##ڬouKnk[ȡ_O8a;y*e{n3_Z*CϾ]v1 'R{ߌ.x4-QQiE%`_8$1޼gE4M9|um;t HߎS;m.].;{E713A*6$~֚nju{m4m+K=Ri?.$XRmLǨ1A g<,Pj6?Wv> vfO@i5oxc?8K+~fC2s ϽwI|,|;[MMI=XVHv4hm-^餛M(HHv OLfUW/h[k+\}Ϟ7!bϜ )~i <}gMx2=Z+*WCq{d7db!2A)tԧO4*o跗-raa W :::ω4m$lj5}> RO)r,s# 7o&E/üOl]T=}?WRo+7OYlFkIX96vPҼQV/lE&ѥHm@-hWGj+╏oZO*bgwJd0+>ε^_EkuZ  Kv$j? +Rk%ΨגeFA@08\E˦dKYQ%avu9GQ|2`I/Hm1ƒkE)gp@5%]k÷f0QHU v#y3^iQG\]CG-Dm420P@^^n\Oue}&[\Db~w\>i ua<Β [ucH{ z21yj:m%(5{<iVBnIv $I_AᧅSêj5ɹ%BHq{Z|FO]_ص֙oEww[p$.2Ӭ.&繲[XBjʲ6\`WA0x;_l.ő?imy2X'?Ɵ|ikKӬ^gKm8,a 8Q%-6u=:5dKUV@`_ҤX%;S*GPzb[h6E}tf3/vy*VgO7 ;ꯧ8gB$ɹnw~`+F7=CT׮KZ;xҳ;*)s^Iy(e|?}P.n-F$<2;ls**OixCvRx$ۃ,A@ ?ho* 3nB]ƒ@?q@ەi?j]G?uO >në]Nn ~bMןJWq3 K۬s˜2Qc5{kχחY,3%3xf1xNZ;|_oxLta"FmgMKޠb * K45 "kT});ߧ8´ 7l5GZ+hg'5OO?/D5k績Sso6}7,`+RE?a{Ftm4 Yh.K<}kM-2G%%`M{[V2>082=*#~ޯv[p` nŤ XUPx⸹;ZOґh bAof!.\ȠF)L?k irjN&k2ҳT͞FTWo'ѮGR0aIّv쬧+}OçŸK~[#3+UմyUFYX1]zd9w&CRaHdi$O?屒IVY$cftRIJ$$FL2O [CRӝ56sƫ:OgK-֗{%a-ԂG9:bf irjz ZsicH1$ҾHjxU kihMf4F?4z.@P8sҰ፼64Yȯ1iZb"o 6qc;A#kkLj"LNY0q۴MlZ؈d<:SY{Y ,%u-%sȳ=d]c(_7 獿6$f#뎕+  f?wzM4[bta57:W-7:W3.qg<(NIPOԊoONk kp z e O?Fqkf0uW_0 qi*R9q5] Nqï]ܵq$=ci \3Uu?٧Ꭽe]K7&.131:(|] ]U)3/ `ٟ> VZ 2MG]erT/4 x6zW:&&FYP sޡMfU- }jw2 aPء|KH5g,Q]PK%b&D̀s|`h_ˢw%Sez-C%vpy|hS9#kKE PXzc5@Ծepn5XtbW I8+hR w?Α[RuO]2{KUNv:ķrj7w/i6w#X)%c*W9=8A?(EԜ/ǠQ^ùX=i,n bb̬ѩTqy$\n6]KU֯_O. .WEoz{7JoUv5VQi&r{暣 L^VUN'WYkQ"H>̻^:R\~ʾ O6-*ouNg qrþ{4 ys{֫ JOYUASܣ1Ytp:_XDObϳ/lqas_ڦ(َFy4 |srׇCk!P$~`ON5'ȩƗ_ȥv|]a.fPTΉ]ao'z89q]?x?Ě~#м&Y.FTؽ0y2Y+ `yRV!ˣ5~!O iw%XcɊ"*Aۓ gwᶧ_]k.^p1@A=k@ {Z (S/`Ŀv)5c} k6=F n |D {x!i2=tZl6[`f$2!A*r:*Uڪ1G{`GGIυ-꺍徣}>8#l1 '$U_? 9<+5Ki|4j$e˜)MFX/*>zظn"Lbv x~, ,BrGT$OԞv{=,:l8@FX?Y?[DJE p9Nٱ?#[C^MηG/{m#šl^/R2t/%Ia0 Y~j֯>|7ԯme@DvB8n&Q H0TяV"o>Qu˭WWbKyn5hʊ|3|g#%-/t mokx9%k)1Lc1YE/uu>x*uvonnuA Oq=20"#PSh9zsN '[Rюgȼ+gMRDP]N+xuܫ v_3'f5?kZ~[=, ;Gj50)lN1Gt+#$_}.N|qa9wL״_&r_t횋#t9-G_"#ikƞE=@ Gtȏj>'uK@_߯ջ <,0-]N뺝᫴,9qTvz,|Qk.i[n ˪Gu& +eW9!<1R# 3rG&gHL++R yrZ0EL/PM}8G (UjNC’OakdPKg3t$22> `Sd[@= 1EW?$pEC<,wĸڒ=#?x2?bfKˋe 2؇ 3=[_<=D:/{;Xhb ccq8xص;YN.Fi_lbG|I~':%}"C5v:k;+ 3XڏOڞ^kf'Q4#RQ\4z#ҭxZKqGLS걮&=~gEyj>_u 2BJPض p>xF5+Lm\{xb"/%r h\x5銈x}!8p{R[ -=X _y=rCͣ^ζqMb,X4bBe, [/Yj^:iwխĐ;pWF+"y z7zyiaIGYhP 1gڿ2?A=KJQZx:拪M{![Y!SMwm2s>O}~|X]{t9`J@IxN|d&2srK23\~!3b%x|U4; .,=4x\6. &pqd|;.;..-g|'vߨ(t>&xgt%xGQ/MF[C6v8J~YOizq[ʹdžx]R1/KOqҾA?k-X4‹V}1,kiz۠6>l,HRqVa-Lt]K?NjV+⿀Ԇ |kb0j7B ҚaUBiyyk}\,5 =0+@i%?1pc|4)4.Rquo0A$W-jU-IÝFkvqbJY?w; m x~Fp>ZI5H$uS*07Qk)4SVK٩u=&+[?:i1`0ڦ-.Ƭ:?0H}!bqNV0dy_ ޵pkoH1IG,RRعRiD]N6"Xqfj~&EUIc's^a[ Y4B#Ik^Eӭ/P7eP[n:tCZ4eڵRM$]4gRcJ=B1Z3~;9*-c ':cEsF}\2Z|%~ q)e3?J~O*2#?ݖ*߲'?,A:2Q îȏ$Da?.ҭO >uon5\$jbIp qPo6Z%?ɻ[y. FuO? %߄m.?#;qty#mNEKF~|k?NO^%mK@$+\11z!:惩\*.# +6 G8<%̖:QzM 'h (r.M޿hW]J̇BR5@sFz`y+|8<迍fV/g5TPy |2.>ףMfi?<_v~ݢ0vO8M{ĨS]?X]h߿Q ŠcZ'\{%֪'괻6~7z F\Dj>W?USŤވ?j7V֝rHF~bHzI$+MyeZyOOZum?5R.WA2ĺ=7W:꥖dIo53NKF 4Ӫ#}g',~~-4/?ezjh$I}7tk8ⵔ99V'𬿈><~x/SFɥyқe}@=i<?YVxb-ͩ_5K h5_CXkv% {I[ bݓZ|Οs`oA&&Vk//:ٗřT4xu- i{񆀶sN1Tqr:9䌏ΰ-oLڜK}.'4j6/>?f!-OƪA8xWKB|Of^4B[ڜP'ںKi6VjP[Mi.Qt$Ŵen6t,i(|V??n52;ˍF IyfUN [+h%Iqx0#؎jbSfnS?fB:R9x9QΣ*:O3I4[MGc >|jO^1^z}gWQ\0:jglBďS'i_ޓ@?3^EieZ?xAski1)n()Gை#F~x{K]}~CO o>%?F|N/amUTU}{<xwTO>xt_?Y!}>d,'B:'TM915_FQU_l_>moٷ?gh_5_KV~fF|dګSf῔̞1.?jؾGU+a~Mzy"A*+/B3\qUk[M-*PV7fz N)Ƿ̖MgDP{g8Uu}{R i4QMr'}[ԢխnC"@ : d~uK7Q&qʰ7X@o9dӘu~#YisΡ7{lR,ѫ=SQ|yv %(bf-%hd6N~K>-K46e0ݛ8;:zq-NKjrGJX!Z`pfeu2-EiA 7pRq+"{gKy%d⾀o[{6Y#S ;};3^E3`䛌O_|Q^\ 9,V_W,wgW7?iBgM O\k,wK(v2JFoƹ -Ga RXVV x]oj2$w} 09XNI$%P^Bz=}?|Ow,ZFሕSI}ktٟE Xe@?3^ֵ'y=H˓I`f߿nZ+~6>cN-П}^D>NX&-Lԃ+_ |D.Ʃ+̌Yz$$wq.YOIȬ)O4EUմGYwH$qY4os+-w"r yVNE|y]2HԖ_]5ȗZb<<sVjJF&{_#6ywp5kr8܎+[]V{vHLspqVa,dEfId0jο#\nf e9uV8aӞ>&+)' 6{=:5۳>^ K`k[{b&9Z鲷Zm,BFk Mam{ \ $e rʶ`e-+ն6}!)x[ko,*m խ*:}{nQ/` ï_z>'mB m[4"c2,epYALqt9N6|cAmo յB:Jr@8^A{YnP=3x5;O|\-:g3ڕֵtɗw٥Aݑ߷Z¢axv9W[FeJ o\߇^!&3yIu Q2O5K{ c3_-f6Rds=Ej':瀍uǦ6|4eW89֋G<OEp~/ o.4{Y'iаlěUݛ`潫W,oŒݫ̻~]ō~E\AѠˆ7̬U_K$ZCDi{ʲunR4b#NV8OS;Kr~鑙A!c^r$W#7^"^ԓFbzLqW_^-+,1ixNoFqzMOi┼t87d~Q9k[>GsiR6hq][\1vd5~ǵI|0gou/:lmjÉ/ (eC1r2>6S[͇|%s6'5a줋Q9 3O}gqN4ր珥MM+|!֫z6;O,%R0?+_f8K&j gcl1 QFNjoZov?jЛu/T??IiMO&UOm4oZo UOm4no UOm4oZo UOm4oZo UOm4oZo UOm4oZo UOm4oZo x63Cos$dC=FXe oOm4Y {I ?PK,cMee|Y\v9Gm7P0k>=RIT״MKiMO&9 vX濰Ye#IмWxD֠-t&5wUA!@>bk\u*fSIMR6܉*Qk'@a0ZFI vgެzo:)R&*zm'?xǁ>7įkvԡR'*-q {<>0HMON,R NUnZS6My>Vf8vI׿"I3̃Ol!62Z_?E:$(6!9^|`y[Y=}!w8?]4qXir<,U lT]ϤuNḗybػ%ŕ sn#wA^^8OkDi8uU_-̗|YP] t'Gv~񥥶&8d<=9,6`g!,$Ls֡rHҠNtbp]O$?y'ٝOk [;9#w8+@_1b !o}CHGĭ+7*+0,F 6:z0*u xh?(́>&xcTmO}E"}|-|9T^F(_dY?]xc {f/ OLR,YO3N9ͺfҟ;K+֞;ݔxf^=<6TDZvRN;{sQ1=w1m~a:(HnzC]iR4L6/R9 ڈ7ڪVX媭ԞYp2_592)Jg_Ģ-ăN+1JcHgnx?麜NΒ1`|ҴbotJnp6ʌNrV\mVL1]]@LȼzIh5NOT#uC1QsHU>}&l` QҽKPOB*͖ܹa!-s4 'ri1K6R͸]1i2^[{$%ubi ps~КNOT31)!ZKW4BMN4e\¤ i`3G^ Ȳr|Z?ϜӍ';WT|/ca X]_k^ߌ>BΨ/ē0'? 1&Ӽ'sq#Jl#ھ$|M?_v.bRDp? tjS7SRqQt l(N>_|s},;o s'_'J/\*?R+t٧Hƃ><;i_Z]Y\i*(O[&vC?_R?~|j 'C𷅵boi u&\Y_xo/a^>J&Фik<ðLo$g4 Nmuo.5}%b{4>eIC[#J8}>|_Zg?l]h0?Y]F{ɛ ,UrB5xnw&j%|YD[{Z.1.XP+5CHwo`jVC)[!_zz|w7][Ɨk_dgu$V$"`+F!oQB)bcj?C(!oV;ڏ-?[!㕷E ڏ-?[!㕷E ڏ-?[!㕷E ڏ-?[!㕷E ڏ-?[!㕷E ڎ?!oVEg˝Z ڽأ;y$ _7~zUf Y-A{wM}2BfEKz=#Pj'E?#mWk'+oFkcsƾN8cڥdJkkZľ:|{{ͳxn} Y<;P5>OTDE,䟿\-&׏ {{'mKBIdnOǺmźFv&֊;kĝZ8c <XxobGg䭼6:K Q('!%s(.ml}I?4=?VbGsfU:\Z?SہכS+kNJ"Ҭn# X (~nhÿW(ׯ'Po`mX5ؽ`ym|#<gغ-?[!㕷E"1?[!cj?C+n.'6A ?rmGmL OmGڏ-ۢcQ9G6A ?rcQ9G6A ?rcQ9G6A ?rcQ9M:6`S+v1j"O?x|`,'H㘻(eU1*A|N"I6+>>>xAӼw} Z֎,v0[_ RSg&|{⿏xDm2j !į3rTôp)]\>M6:ͽ(YX Aj"m ڦMz/ 5KZ.T`CGDзJJs|g)9eY3F`,"7[D M6FJ% cQ麔rݱ#V6q9: srNKpK8orv$,*/U`mUJ 츣Ὴ~(>(qy4aj+Iӯ5JK *]+hEC, `?νNAW/w+C$Bj8u49=|x3BK嶽[UvA" YnG\)T}렴 JW橶urӬaIެ;S;"jTIr~r7* W6A ok3fMt4*?g)89Ȫ_W} Ԗdpn2V|r&ԤhlEE#w>!k0_ v5[ʓCe?#$}3V!-ptpX@q[&җh[y#NiZ]Ͷ\$; ^&bC!w899!#p}xX6Ӽ;'r^&toCCCNWwόSҾ+.#GS)Erv! uZ#J-p},&n%_364tn6e"ءa`(;1f_ZI  Ѐ_{^Ӭ~).Xh+C-K[M5 \qn-{^HrNAx'_=׼e-#:~atl`2=YLmnj_?ԿߣWG3EsԿߣQϨG4fssRQ~G>*<њ,9K}G?UۚFh\?5/Tnj_?⫣sԿߣQϨG4fl뺈`Q'&Jׇ8unax>TQi#$mÁ4 C/mH 8 o})mQ44Q&y1 @~9aj|(|ah"xb->mVPD7^3ҹ_BWM6K.uRɩn&gc( āc4scL-`FxK/a#wgv Fq8Y_%POAMN8T]+i][zPp~k>#}<; Ed꺬fyVTwəF+c[I *C$e ~_&ʹ7a71?rK/MmGI-],s4 a#csWiS_k3ivwwy=`!B ԚgN߇n%I[Mc R]yoB`Z:\H7ĨIkɒ?L*K}G?Uty4X.sۚ?5/U`nj_?ԿߣWG3E9ϨGsQQ~]i(k@/7] UѮ*!LKJcem]?z3c|?_q!'9>I>sK-YԬN&Kl(1Hxn9f.tx$iАs$iN:I}4)$P,ܬ{SGŚG jIɥY xw '3B׳evZ[B#=+rEwWn2 h\28^{mO^\֑wFɨc!_Dw01gï hTq(}ܶ]T1~yf-M$GIt¯x""&ϔvq'^w5h~aj63 []²Ы CuX(=[c||q8?sRQ~G>**\Ұ\Y\sj?G,9j>1\A5m_x?*qUe1h rwpx<#PiTHs D̿FR V;_z? ^(,.Zq}5D +N6៎Gxe,^,TA|F%(6ndbbȜP$ kmM]Ďv#o%~ҿ;̤*j&Rο %hE\=9䴶R_ yI"BVs lI~~_y]vݢwzu*C#ҪxO8EḊ5̏$1㧦=ŜK#/1}*IM]H~6Vqq!GB*ޏ_ < dlz5,R?-J ۷ɫsqlJrH~X+l4lt1nI5׋v們@ 1bYZ1nտ\7~ltq$}+(Ӝ䎈^-=ŏ ]jb9.'}@Zvh[ED `uk~?h7y>F+kcm'8?P?}hPls&oIFBNO5[}$k_ \ƙ ;X&}Oi_Mnc| $ʹc݉ouGgc1gwRf4J p> L]As\RB##a8!'Ğ##s]yËǛZlXNWWG1l(V ( FKHzPf? |5%O?_r<AME=s8E+r'2t_^h浴DZmk~=heeGW {Ek~ rhmai.<1k"TW-5K߲L,|۠b2Hx)orYOU%iv8&$K-֬&fvEE エ}s <#F0YltD Ҽ#¿^Et&,,-̎QءQ^Ѱ:o x /kk6xmpiY-iX (<>|FՅ[G-\E , )\2+c+J4++ynkY.]Q<SN@3fkZ<:tPYL&Kn'GlWg3|;\<7nEҴmo`[ ڣ\{²u-$_5Ξ 6j8bU0 Ni{QV0(((((q^7c@s|PO7CãEq lٙQP⽑\W_l;|;fN^H3"FQrOp#_PXGkkZ|PHqƠyHvV9\0O 'ľ5-5jr=f[\[uz9Z$%EHu=1.,moo-y^&$p >~җPAd`֫7r 8*+trrqYo=JM3,$D ' *GYѬ`I&< &Hnks' X.l4;aԢm/Plb) \BJ|29&/^?C {R4M~eW&;;k/iCN(aՅt@?{(OzWx_߈|m7vkwr-?.FA"|Ք?j[$mŐLo.cfH;RP BIpu~=7?g#TO''6XqHm O g/:/e<[x͊P[6KyEv dc w17gxvFMjz]Jl.f̵>xU.gi 3ۡo;ُ["\٧HoMȤ`rdf÷z[jw]u'<|R .5cƗj~"XI&+1־i~|8O-Ul+C=UUZgQҼWV\ѿi/u+Yүm_,[@ P؝ um ]'Y> ;M]>ٵ//%WtPh;gi'q7u־|Yw {cCN4"D Q޵2'K *Aih7Vr k"#W%S)<X0= -fxsV47Q,-fI+NIQ@¡v2qjC 'u5zkoW^i`EVxr 7nj[hfM>?~H׵mRK*_ܖӐ+^/𾭩kzmkuh(H4$BbMgT kd.ZUIJhc'_]ޡ]Ջ͸cqK`s72k{fkKR<7mD=;ɚ%9+/|m<6KszDDQxQ(o?]Iދty֗:+t7<]Ķj[y5tU4n\9ѝ^GU[\D+LQ(#h3Ȧ.c>F  zu1bD9TU>b]P*P*QE-!@ܮW?T#aOW+*~@F|bS4?8]31fi""#FwG;/_ I&u{Z[PO9. #F/tgR;xյngH#h?w' |>;5%Uic̿kYCa <#yJX2)=V>7OZCéjOoͦ-;E$#nrr͹x' X++JAP8-KPk: H~w);y#dO1UV[\1P[c+쟇4]\Mwuka s\K Asƅ7G<j_h;u5I|9u2O>{4McW9dKe.++kfi'0ʦ'$v{?)%xEXuΗ=9{~k,+AD6zX:~Cmf(-ޣF2WGMbV V199Q}Z=[s.PկtˍCT}KJ-0{vvh,Mnk_Or-RM]6WƺŮ&iP3zׇ:ִ> |=ֵKt9ˑ:Y$ȒX0U,xķMj6Go&xw V»+W'B`B€tڤV6+dazV* w rCԯB6Gj2]K' ̀c|^1!mK3kxP+ taW6d" ]烃]aii)\UiC7 t-T(PQEQEQEQEQEMyO/xG>5ƹ^%+җKdDz׫Oj/*Gφ:ީ `ԣO,"F#$zToSj\gq2.۩3uأ'_x}CL/REӥ?w<:W|\u߇Fco,=;RKieOI"(vWDq^:мeIh/|@KxH"Բ̭v9$€}&->Hm$ٗ ҭ.n,RfF&Co#F _bs^Q uS`tj I'>d < b~>OM?]wa4^P i Upw&(οH>âj3ã4VTqg+]Q^66拷hccO5񮣨E>To=bRQKזhC"2@V-ˮy\U3pa{/;ƁsPV<N [~ |>3mx-imFIᷱ:dՙg _|:> ºE,;,03_%Zx4зéx3HGk}u,40p{vdUA$ _gPB`/l3Bj*|&{ků˚wsku꺍 њUKJ3R u_/|cqvj K_E%ۻb>R~ڞψIMC1#*I `v>BRLbQEQEQEQEQEÞWƝ]]MƸ#*z<'36ӵ=WMuUV3Gg( @ۛ*@zqi?~9Ţmy/,YΥ8J1dg| wV:meўѳYǕj;``v|; }W"vXxrKqyk:a'GyR0]º?YCʟڣXʇx22I4 x֛햿jX>XF@1#5{G kJ1C[r,q2gm㚵oR}WÿUx*ެ}:dpmi d=[so¯';]6&lMi-eĦ0 2 xi<{5MH-Enͬ$RnuɯnJ/Mxfk mmB<̧l'$kkxSU׭/ q<]Mm!0ȑܘZ0d16;F5Esi7|سQ}3[|9{%[ {;;|qr[$ɞدm-B-R;t*@U8* S7Gh(ͯm-mcTӯyVEhYN𮡡_6,l$.,?%0VcC^w~>7ߌ<7]sךdU--n [K>ͱE ʼ`Q쭪]hGq']YNЭ_y7^lY3&9it+;-g|I OÐ^4nXn;*c ǵu" únnOy",x^k~~%xmz_v$0®T T|o/k^6$ڞͨ:6/5ͱhH-␫0 Lz7V^-gx ahHČ6dsUz:eiz]W/eq e˭I-bYגsm+tP̊>-'|kxĚΙXi&lln]1o78*zQLaEPEPEPEPEP? ~_?h߄,<;kue{\M++q.z׾Ÿ^05g/V'" 6w0dBM9gu Q&jsCiKrq RϷj3zO^ݬ[%ѳZ4Y2v;TҼs_>V"SQ 6ik W`H^:_~˧<]Rt*i'BӖfP|(`d3[(4_':uYkZm3iY|T!~b8Np+[|?fme[m 6=NkiU^7qm(30ʃu:' x$7Wg)`H|I1nz1ּMC{{M;>*GѠҴic1r$Y{:X?gs'[S[Ag"U7Pr[T~6.~t;K+x UȗcnϐNsjxEo.yqŤ_]4[fx` IBf&~iz''s=ZmnU`w]oJ'ɕ\X L:>=Kw7iMuRE QHPTv?}aע[]2b3Q`s!Nq/}NӬ/ 7?lT-+Fj %TKx\Fι*H^GVu-T/5cÍ&mo![eEEbB/9'luwǃ;\wZj"7`|F S騵%[o}8x{RR"- 1zgoǾ:t;K@kClO99F(=O5⏇:~9h/Դ-&,ŕżs$SyFc[haco6~+:ާh~"(et!WH屒wzPOM?g_SY[X_wejW_fgyfj*#}.ho|)O&"mn;QdnV26UoZy>ڇ3m>.lWcxVmn񝏇5iz4;_T/ f2l"BrsSw>67Sۛc iUz}wވh6A.sV mB(aY#ԟFuIkm$Rq-ԚUX &Y6 dwG~z]4+KbCs6b4hGmF8&FW7o=3zaiwCf$${33Ijl֒zc׷sz5¯hV siu]D 0F^FQՒyesoIq=i]i\GCG< ;f9_<NE}+VxCsc ׋lJ 8uAᦥb<9\Y=BYcF_]V>k/+e+ ` ӵ5|Qh ҭ -pa#ӱ5<9Zj6bjDm FL"0X>a|=ě/|)ռ3_[IjZ`H^137X%\ ^ihp3 (O2"x{O560m[ 8]cyՑy[>о}{-WNuE R[@sf"dZ[cW|qչ޿lQܹ. 0pU t¯מ!CѤ!e*e ) n,mm6Ɗ2p}9]fxR/jzƟ I iR3"lĺLzQcWFigApyNuޭj7}g54˵T~,>#šgX\4,qFEwWbG T ۏ'WV_Pު?B)¸p+K ĸu=GDË|2E:̰= oH%E;Fw~|.[ n,8;@UFAr:xzr_ YCvG\i&䆒FjbkK#;Ow: ֚us`"S^,͉n*=~ x!i^%Լ=6.mM˶H+c~ : p55Ξ #2XH~R558u=[M667jE4U7gڪ?FۍK 񝯇MMƙ& $X\ڷƷcijmڝw,j#ctk(9uɩiqx)e-$/Yيݵ៟4xB-kUkv?ݶOpOjgKg[7f{}vLc&SBl8 pN Woh44P7:auk2d :|2ZIo3[.<@4ntդҭ)%]I*S'_?H5-~ 7pIumc,&yL[nNw٭_xƉ7Vg]WH6ɰ3#NK㓻p߅:N'K+I#QR;xU<\,_ڄ}_GMݼҴ$ٕ6[brK|Ӭ q}ygikm=Nq#UR᮵7R]9HuI# w ;A<ݟ-k7n7ZLZ-y]D,qJI!#Cƾ vj^!M(#2+]J}WS\xmqp$4Jw9"jflӚ7{f EF͸cڴ+N[Q@©kVpWv246D"HceR}ӌڮ;mR}+̥~ uN%MCM.cs ><<~-~8nዋ%w&ϼ6 q ~ ݵΫj~/.P6]@2y_;hʠ½Cm xR_n͑` w֖^>lokqΉe. =5|$ m7]խU;~\u9]; x[ӌko;8MfW_A#89>iwjPed⶯3s U>b9nrO@A]V[s{f[Iu%d=]@(m.0I39T.TRxU'jAekw/nf-fW*$Lp>+Z~,Zeͮ8Aw3"Dlj(Pd9)e> sG 冱sid[.6 Rb6FMnEXïp=1AglWlI'kr^Юzd#z8f Ǩ̗<1Z96VG BuO>BͿUPPO5<1UhxV2q*$oTyEdA؋oN*6F0=@`qבZV0Eqo4s*Ib`zG{IEjY}E<™8h {z|hq;b [k{A,ʯ'r EV,mԨVxr՗*I $zECe{oZGugqݴ1nqpGl3ڍ+3%|+g֧9Y 3H Tq޴=zW M7z/?HӴf/&&" Y؂rp)1g?$:Xc\$C$c`-n036VF FeP&1)\l,#!+,gNXx.e{ѧq"K[&9$P`.;[/KZL2l =8g[wHBxR|?:!9~%x<C0]+> KIR(WM\_YcXsp$q\Agl-ƻCS9h3~_'xZt^vsC]bX>|8Hc9'5; b3k#{Q<"C>bYK`9p+Umx*b>bá R!Wny1=GJk=&HVVitzaJOwqUd6x5XXw)]i6WzmDz&TG +Z?O[iOx? +{q.I*TySF\)e;c5Gù"Ğ1Ma|db8\/zgk 66s67(y-dM7Z6} Gz'$:w=ƅhiזsʒqH pAI< x7D]+3-Ȥ2rdFq0\dWG}?hoi~ u f !mV|1dP7c摸׼x~3/]&Mz^5!{s>IaeEc(rO5ou|3}}5՞whj6*l]Ku >5paԣR5߁?5'Ě>ՓEI7$6i>kE2b*W|#-;ý._ºmj60i&EH{W~?,oSN}-Rq4?*" ]K>UOc:݅;q<̣pEU x_7BY]ϫBܫUv>#oȨZƇkPYEe\g4JVVnK)\=Z4Yu{ k:]ZbX*䌙%dc8`(O4/xXqg$6IhGbR~6ԼuxT5)cMkf+A"o,^W{Y)-Nxg2.dn#^zxš-߅5 "5Aa.mZƱdpgב|tx_ETӴ[΃nd"Ls FH㊅k? sCA;sGJt?xhk {}_45xted+}*AJi)W&3_[BpWsGIe{I JN qdz/AqOWcx?+lՂN(r@.>!ۿ 73J)\ȡֻorϧezgp~Ѩ<؝'4 =ZQ:uw,RcGmkZGׂC&Tb\?wriwfinLY ^I܏l⹯wM1[դ & Q}1R;C|ChI:5/aiZZ\], 9߃:Y>🍼!CǾ%<mv+%/1gɹXJOyxo=v<=m~&&ip|v`<ԠgKa:xJ+?R"XEʌ`!<`[SZǦ9{!Y|Ϳ3'-_$F dݯ gh-!pKn]/<]'OZu{&TEkYaBێOQau]~? Z+~KV+(cU˒AxCŚotHh \2*~j>^xF~d>ZK≦GdѪVՎÃyψV乛NPnRC?*Fg`8;N1K,uσ_4 ]jm ^FIZ)3/GP29lV*|/uՒ j}&[Ն30 $Q{sRN jɥ"$[ ˨#zd>3<'gHAsc6w$B GMHKl) NZIt߀.K_4Юm|f/ 7 ANk>Ƨ5no.,cKT¬̏u8ڱe"[]_i^ :`y5;K)n0%Qg .C2I%&g?ۛN}KOӾe11-$ m۟S9koh:\2;k+,°Ap[mBz+?~;֕0.u6%yBEr"ӼU W+]"7Icq-đI!Hp>@88t4nRk TNְehB ĄD{[a^ zw*i7vkGnqk=m,y9 -᎑ϭΡ1g1,~l`EFG>xJnN{Wq77WJzio#k*dk@q'N}Eƹyi}%p3{tձv:-K!_:.:um4z]Lf(Vh%I5zOL %Hnd̫ a8d%ui(9#]FVYikGH剙V#/{g E{n-#yOq0;N^MSè JMAKuXHl*A 7G?h?ͮZsWg lH=[G.hZo-ŵݽк 6DhH~A8^5_ &tFؽ[KH3N95NџKCw5 4xw47w:LqEdK'X` ?1|u8&l3agkK5.oB+$2!jkťYvEK۠a "Oomilfe3"(N K=? h alɮi6P{#G]6*ƽ/i# jx}O!6;˛?/ˑɄȬ._ݝƯk>;$ѫ̫!s5gƝkJlWѬWNՇ HmV=s!^1Цkٓڅ^Bڱx%huVeb(b#jnOU>`(2{ς7?~ 5+zu;JC\&^;[$q/\W.j\Zxƫ&)I=ȫ ?/BzSEQEQEQEQEQE#)>_o<=ֆI> Ő6Mwo+(FJS ^A<'ޥw_iv5պ;7+FprxfZi7ou-?IZ=qo%ɰ}0wךd izziZ?C z!w5< k扪Ak6KCQB|ѳNXl*: ݓ}*kPymXH{Nܼ[C٣ogZ!g:̰C9U pyZ5]/YZ֛mjI vU+,܃z|TWj^-gzLj5\yI85 Iw>* 3J^",f(#GHE#J?ʣ9w} s+OCY6s4ThD9zT#t${kinbde ѴrL3bPI8.hO:'ү_hwhI|Kp9کy}Є2)5Mg:?U- O: =y gU`;V8Xxzu k|Ci mT|bu9QEQEQEQEQEQEzQE&_ x>.k?uGRd-eL! 0!5!Cy9ɬMoy&6OkQGA5 eb1VEV &!k]?^5MǨjzPC:N~`qk] T]':BI4tN:Ԯg:/Ok[W73_xTIS-4/w^$is$}@̣c /iJV?[iZWk[83pC)_~vḾ+}o0cfvrP'+ʜ^Ǡv̹0*u%R27ll:ʱ7kK ?65&eR +TWUٞ}uwܹ[ md'-z]ij\Up#v ΝeAE'B+uh-Sr9 ? eҭCHI&`v^I=\m>}Y՗59F#Q4|2$[= 4NVBWg<ZK{V&])?ʳжWX%.':s }5 n~QmXh\v=ɴit]4JN9jb#kpz هmrq|MǜD>]<}AGjő^cxQRt< `cUZPGbq3^Ǻ!X Fb\`m\ \vw5ݲ{H?}E njG[8 >|D[mtۤ@!F[##Ѭuo$=v kσ6Ond(Bb3} .H^j41Ε%hcb{Z:wș7G'UGukV);Z bH;|'G-K7`(,?½NM@>VE//I%Q3t I#}f߻lwQ8?5?Yׯ5# (MgFT{Fkaja14FXG b=YM-ׇ+hJ0 Q%mN=xß ?[I>mv |f&VX NETc>9Z:E>E$2+y !,\\}íoV{L" ٳbq||7> W>Cus00`*e}z*hֲ?W<{__Z~4r˰sǹje?p?G,<{__Z~4r˰sǹje?p?G,<{__Z~4r˰sǹe?'k dӤJxLnP2K#iڽPX?y}_hZ5wbd֬S+́q<{/ǝ _\xSƖV>-r#F yx'+ Q>k-]xM*rSi>f 5/xΔ=l0n8v(jھz^i#~n hܣzoLԭ`қPiG9n^!O_QΟoh^$M ''kuFӵO ( N948BL&Լ5/<mu˫o:/̀\g<զ/ÙtyUetO,"A̅'J xCzgMSN'tF ng ߽yS$#/'P<-%˛s.W3ɥ. zNi}.uh'3& ot\7 񚥤ke~x/,uxEg=WrMx/^(o ΀%|Qu 7L[iU1_O |e<_}BgM0Y +X7V<+)n{G߉U-^EnXPOu5Wx]}gv^Krb5xc(Kaù-|g]}-bv.1`zU~#]/6ڭ*dY6S2s~Ao |,e Lj<5us;MČ ,^{-3%KZCu<+,d),~__Q`rWZ~4kYƟ,<{__Z~4r˰sǹjkYƏk!/9e\yO2<;eY \ھ{f)/VQx;Z՛TܰKk kmD ۶ ҽ q|-^RmKA; b6 p2GRrj!Ԋ{V/+O^1ck]}䉼 @89>,njtKo>GIą_(>\Nyi/i my\2Na28Me m"&?>9ֵm@6G5Z!n"66 E 278;c{iuZ=>O%F sʪX}+ /+};ZGpWC-HѼ rJhP1+Nҵq tSC'nh)`yIfUdsskF+x^ͩ@b2uujlng$԰c L G\VR]V#.k//֜%8-QUGWhaǹjw/9#ŏAPCl@+lĻ>&-KXJŧIf>^D`g^ץxG+O|UkVmf'LxDeJ1lԁ^غ~?ƅYhUU?HՌ|G,<{QoPƉϟ?Yq&| A<V|D9 YnY?iox{PIҧD#O͇3c+d=T 3'zzRhŻ39!8ʶɫ8hn:N~>!lyZ ~槨èq۵¤G ?8&N'Ilu[ʲ¥uˎ\~_v1/41MA;9]O!7#c r_{.{y%*5X BXx2Hnn'ċP-P]Lu@*=jPW`x1X? JeY&Eɫ7$!O]gY`r|_2i~!Pm(`9 ʷ`nFT̎mZ.siH${^1 _?^nI\|-J7muxN=EiC}/ q^ks1)ojw~2\tTck= mN~o栚dIׇx57mp(7m;o$snEgo{P7֪xkOWS0:W}6wfDHWGՌ>+xԳ+UnҒg_;5m\;F[U:F[w"*3T XIn$O 8丌΋#*u=z+/wƳoY\ͨ$U;ׄoொ9}펿bZJthz=Fi"f@컕J>\Z΍O=\\[$mO^_~%4xYǫk;l,Ү&,L Dr8먲>"X[x|A )*}RW*=8pѧhW3~%c[|*H֩xL4 iI).l|k[QE>$ !F*"WجC|G m"}KKE' ؓp@~SUC4XK_B^_TgjzGڦ}W-Ɨ-Ɨ{OG#>tTտ>7o꾋o4(o4(ڦ}QU_01G01GS?Pd?ϝ>7oꏵM=[[A/ ?[A/ ?'1F|T}o} ? iQ ? iQ93OM=[=_5_01G0/GS?Pd?ϝď?kݕ焯.nPI:v `r䞇+?3Zz' y^Yp̲dRWaƸyYRW1ПM _uƧ{M=ΤEǶ* O*)Wtr>Uҽ5O-u-^f?cyIZL0y%AǭXտe_A4{4FI$,pHP t䚘!%Z-6k8M0QJh2hkݼ3#^1Ь#]֙{o>SzYA Cⳏi\YRG=ϝ7oUZ{I!udgActʹ1`&J r :'ԼEI]-rLON:I?r'1Fxf?տ>6s6zu}?b/s+P?b?HI/~93_K=Ft/_?oe?_ :}l7>7o꾋o4(o4)oeNcSVTտ/ſſ{(?sgΟjzGڦ}W-Ɨ-ƗGA#>tTտ>7꾋o4)A1}/ k>?A9

cihaq]n(Bs3+Bݭ-];UX]ؘ%{=x^և{UN2 uqE\IA/W*FN1_+W&YF{4xiEoC*? E\h:V+Y5ݶUì @Ms4𾠞4lM3ydX6G6##!S{ h-ИՓrsӚҿeKӭ|Ucm7Qգ[nrrk(#> X*3Rx+lWFѤ$ \WVVV36M&{kk#c4`ɳ$9Q$].:,_'1ըEmKFy( >7o꾇_طZJkzL?CkFN{qR_?0r'Ulf}Qfo4(g*?>tTZ_W{,wFmi RSܩRA=3zW؃ſ?}skնQog n`^f;8+T[ׇqm ?6LXUɧE䠍 &~ypFkξ0n8ƽß 5/i5ubqqk)&@BpH`N m/Aң'_?X -PU7 V[Rڦ}Pg29?_L˜I^+yR״_U'C i -`EהV-.oS=,2l9]ʠ{dT>+}jcWU9Vb#?ïzaHɎCܾ3G+kSF"66$dw+/k^6Y#X#hY&6!y£=45+$ Xg);E]~SN֦֭aΏ- '^Y>YF6f(x9?\^y]鉨jpm,eeWӓh|$'Bm|9_{1F g5Q?oiwGb#Euk}Z>wjw\KleEp̤wW^.K 9Xm x;Z)mF8nGCҼ#V'&rS==O~iZNrALf1`:^2_j6:!1??jox ]LU!m{3ҼlH5EgIq3IbO<]v.8vg^*#kEP^iV]u-Vv Hx඲mq К^Xx挖IP;4Ir2``L7(f5ilug^gw[o CIou#]>$Kuo ]y߶PsQI#O&]xf|$z OWJ+V}?ˣoUE14r.e5؟z euw( nW2;?Zg,̨K*CEW.s~LCgV_څ˦Kp!KaN >s.{3\jAВ9j_|9fcK< Q3^Y|mu8Hf,~Ei^xֽ*X:dr N͟uLgR2+<9y0kSwgO-CSᄗOdn:qէnyfjpt 篥y]wsuch6}\ĦE^?1ƾ_C%V$JI&!'Tp?u-ONi`+Z0PIMΓ߳]ܟ#jse{vuiϪDG m.rbnj(r$>h^&g;RZsMlO0JzlnǯJ8K_2qBZC4ˑboj-osguDJxW"lZy"pc Wa[͛qrTjҹ(j) R 0a;z0X6S|:hdvI):?:ExT}~~sOxlD!>LVqvgQhW~'ivu֭-Ay1w I@X | MY+/Ztn8J:+zWuz[1GxH<= p5 u;).bK-'Nm\5D!ߓZב>*3 i~"m ^.?Mp7h۸+nI>xM$6.ZF`q9q9޹ ~~ j&{PUy"2+[̥x29&񿅴{Ox-5+t. G] C創|AZh,~ }Ɨȯ=}koag⪳j$͗,\gc?-rҟU\F!xAi4Fߺu_yjWɠ;=F=Gv0&)p`pA]}uVSm`x -x/ƶ>l5X^x-RYf!cR!p #4i:[| ZtZxT .K+!ݼmEߴp~~I˝;þ%дi-"4o@dOyZp Ys lkӿi [jM+0-|`@ݒaO_-Y+Úƌ:&umg*'2'R\ҹxAڤ'TdP5,fV6B(z+_|Kּ+ZZ폈a{l13n(NP}q3׎ R+9[N0]܌z7dj{>R״|Q{XgĒ-J<=Nmmͼb&Gĸ$&Τ#Gw{IB!,ġ(϶+SKLIXΣ9x_Lռ5=kZ*2Oiih6sm0_+o+=h1ZVW>N𭶷5ot..o-VEV2zsX~#{@=߈ Mln=$Pv2q٦=j<CW #߁񦟬jVվtkuu:={rI*I[?s:VA.k+]n=:mPayMq"G)ۂ8=ozg-=R??LOɘR]r0\^BS $`QE+`QEX, (d} Z(>gw;@/4iZn}"Ihk[O ԥ0<۟j&K mPZ1Z%}(2"d^-cx]b̷HM,r_|(I!5s,BN=OM5o.% }:,D- Ð st[[[:յQjZŽ"PUݝqs0~cEe=ŬF ٹ9; E\Z^C0 ՔȘʞ85/߄$д{\Vxd,1&yq>+8ū] |߇y5R+K]I 2*}B55͛Cĸe 孕2 sQEhV~ dvڄm567o 1S/# @95V5L.980pkmN1jDq.rԺO{+Xϋ'ctPcu rF$sҾ#?Y[oÝziWⰌj̐lm< 8sU_w%$MYXc*;vV>&Y %-?Hlx Gۏk4[Lcdzt5Zȁ' 1淿lw\L9_)rSg9\o$+v\Rh=K ?O$7L(>.ZPۻU"YK/ny#Iu/Ku}widH{/HLTvSZAEsUG~:7mAX<ӬVxr yqoƝ~ɖ[w{+ 6cڼRD2A ^dѐ<`*~FiKM,g9J6wba-3ծ|D v!Sڸ-;IUEkɁ u<}kjM)-;bIn#e?tί+rZk+]u9Q`ZuG, kp Q1FsJ$R89e, dlu8^T쥜_5X2m'S ww&X~},[8e1381?a#kퟣ7$k7YU*~u~k){@,1sڕL <x7Eu젌1q]-ށFQi?ɮkP#Z*F ֮hvLx& Ӄ^=lʽuhWH[WU6HsXkZkfLT!N5e2=v)}p*֛caڤ0vq9?ӭh~zFz&)bpW;`*o.BǒWf%F8ﮧ\N&LI41a34N# dNz#i 6X`Hcxl?hƞԯ.4iᵲuwr],pd p+$%YAl(GivE.a&P|8ޠ@9ş__<%4O Yi g"АYw 0vO]PF4'yCqEy"4ؤJ81:/}:?-|Ykmi!G,ۉSˀX_!-5]K6|f2f(@ ԵzxN 3/^E Wy,v[j䁴Vߋ^>-g~iWB9tW13x! ..IkvvBuأKCo;J<ڷ|#k[|U56MmE%#~%n]OΖ,F;ȡN+g8KOOMd\F/~D́W;wT gєRyG-bxQ'-bxQ'-bxQ'-bxQ'-bxQ'=;לl5=Ym#PnU>w mٜwQ^O?:ߎ%񥇋t7º.}Zr'p֐AQ]. {c^.>]:O1?(¨O <O <O <O <O <O <O <)<2'@uNw;cSi<_ge[h,Eݥ6 cX:ڗ쯴Hgt.Z.Hst&qiv<:_<: 풙ijndŚJQj7v=sPeմQFbeheed Ūh7ֺ6voUhưh:IkMf.e, ;/{k?y9ko6G7Α[nͽ8*L]Q10 Byӭ:9~Ve\|nGvrj>th<@4o3g |ac|C2Jc6:mj΢CǍL: jz;D:ݕ cP a M\|Ny+_޹O j:j-t}^U\#D X^_,+yx`Du[;9TdٻO6}4W9-@j> יp{ y7]ٛ1}]dE'y@C^/[Q>?}I\hɥr3_ sZ1??:Zmͭ 4Rbc)--y7oAYEn&,a{%[U89fvݝ sȻT[xĞLӴe2ߕrJ`akè5'JibxQ!x!CDf߈cR5g'Xa>^:ս2D6r XUn0b9|qskVZQCoǖH9bssji&i#V;']{{WxgA4x忸̰BD[Q@ ׭x6k6.M$B-!ڿ &.ṪBZ˹g4~m]xN/SDy!٘y#ki7&I I #''/*XeHqVFN;躞%؉Sq7,q_~Ji;t>3ZQ[2ZGƖzd ȑJy<{7 J"?  %Ŷ׏[{t,-W?x텅ky#;v@ `0kA_1ci0>k(PnJ7z9t1ȹ=[܂Cm=.0rʜDnc*Nk t)1#$$s!@7NMm|FT9[]5xuGgj`c5z]ͤGs,`3[%}sZv6QrcdP$pӰ-Gsb[gx?E,-ۿ:w Hp1?1 ¤y7E𦛧}o"2,z~UcM;3(Kxhw2mSTK{,VO2@SpbqӸd ۤ ?QW:79hR3aG=i(cزS+[x[OެzpF8۷Ek ELf>1?ΨțgjHOc#gq:nwo;ZekghK ׷ZF۱xmiiKpl, ~_h:<2V!^dޝ}cZ]qdRZX"hrv^9_-ϙItύmʡZn&Kk/Y\2yC/h Ocd{+Ҽ8ӕl7ݨz{WӖ_ʢ}e XᮼAJk"[@P-NO#E{$6ڷ][H^KQMlK積 oZxv5AVmsִ2IshjiIw"ܯa"ioX,z:>LR=\&Αut$0SS^9nm+y,Z466&h*N2z 鍡8 cwE란QEQEfb`QEQE ( ( ( ( ( ( ( ((Š1F(zQF(0 )qHF)QE\1ER1@]QE ({ ((A`(:im#"?\1՗S2?@~ 5MJ4r䷹HXyIvB`*:c|0ʂcͣ|P&_RM mxTam#SS_wp m4 r)1 D6ci_XM& J)\+v׺H7TjjJ+&^ ԵMVn|? -447R#1AW>ףXk>)L:fY 2 1?a|ſ4GUT 7spko Ϯ5ʊ5BV+؉ڟ-}R{Bvh#6& w9: =7P3n^#~>l#aݼ$N(-aP8jtܕ[/k%xWJ*YP2BBdw}3BHo4o:=tw5寙y*ǧ5/'tK[NJs&?>!k5+CuX3=د"r9۫7:𮇶֯}l[|GW/3TI.lq`2!'iȯi ^afm'nQX$W_tKYmo-wrrB ~jz{h#rASMM{Mկ}.}DY% x(Ã|׭!hr~0I=)d͏y2DhŸPWlJGT^>lt;j:Eœ.~5sogw éI}Z1`GF~u`mӬ'(6xY|ggp܁v0LMk%`$s(8]ǡֽo]mٳɂS˥f D>EGPOg~]O$e5g̓.<d4A>~ϑupđ}֩O#^H]"9!^|t1 b\g<}wS)p夅׎3MQĐ@B̅^{; hgOt]+ 7]ˤH3,Čzb[CRsmHVE'"yz{֭dy V[c_aYF=+?Ps;hS^L(k{;joVRjwm,<`֫M|f\^[:`m&е{aEHĔ+)kc~ȸIY]C_ӧOj[_J<`=;5s6phBZVMrj7Il7. % ; xO1pK-V|!#ָسP>5Ԭ]TZ9Vzmk[/ Gu}S5gR#C (NG7muosh- Gi+ިLJ8VHP;JCD=Mykir$syacq^H;+nG*U3ېغ?s8֍̶I 1x0шOZCgtTPʩyꬋ5200;kjᱲ]Z:3DŽtDu .O-Zeq!TeOoy~v2+ WCg)āC&6ȄҲʐqey2ȇ>WT| #⧅.-c -#T\,ry.}W<8Y].x~zTB?u E)b?Xxpch؝~ݟW41qo.//*;#"a!nҗOO:? 9>0aR[ncDd** ڡ۠x\^AhSy\*xDv=4|}gT>)6f)FLQ;٣wh?6?w?h?6?C#lw\w?h?6?w?h?6??_?*?_?*,>4 h4 kCxʏCxʋϬgxC#c?gxC#c3##s?YHƏYHƾL99\w?h?6?w?h?6??_?*?_?*,>4 h4 kCxʏCxʋϬgxC#c?gxC#c3##s?YHƫ|_.nxBx2MĊ;KWʟ'yW9S49**K˱.V>_<-W@ 0#9Ыn}=xf\k{v6V4a(ǃ^C9lJgs|upϏ<6UN__pjt]$k8Kb1$rH߁Շ&Kd69yp}r8*;F7;rջuLJӇu<}x4;If% AodpwK?hPЧPy9yg5|k%o\jpOT4䓫@1WKUftmtE 8m'7 j~KyV"}䁔#9I<~LsnTE@xl jSHC@'փ']KQd&hcI7P@9Ē{krJY<'jcdbfujI'N!?nO߆`?<3__?_qjt᭜Dyb{d99=kѴ닻ղ%kU0qJ6N}E|tdRW?cƏ Nu_ZhQn끪BO庿)M Kb(ݝI)dN=22pQ}k եqlz?G'~X?/Eyb@rOA~@j:lzr46`N@)6i9!k ?z3mʏ=Գ'?<+ё};7sN*B@ r x>/gCU>dQ+|v=&dgZ?NokzgRg?=qz}̾n/' qZuAoцd3:`= y_&+#O8e"a$jxB-5ЫH.f7rAo ֝"/.#lmҼGNiMWm~-׎<=lHp#j~<5pJL9U~:x^֭ylCk!Vi-#_Ç^2ܗ7,OچIU<|6nXV%6/utL\0E+mM]ojiVqxU3[N*)YE'] 9V;|7[ ٫> +8L;e 7dWIxREl :>\qNy(۟>oT=V uL>Z'F*quie+4F"6v퇊?ihs% \0o2e$ۿ fhFi><|6/xEڰgB>2|7ԭ>;,@5H +pAw\W_ZŧAmnZiCeI,P-oϥw.h' = tjq ugp7-PPq$DqWZG>*b:I0JZXBL0">^9m ؽNqtޫw'o6p9~\5챔uT QlV&{ۭ~avvUm^Ƽϱ6%o!4vLҴ5~ _\5heB5kcNxQԷYwAV].L#?XTĸ$Z=y?l]9b][=Vߵ5ÏqUNշP9m@ KsXKP^vQ]h2lXWN9Lmr-Z "x }GJ$n|;ro$x( @]K''KN55eWblQcNV`҅>wG"5 t'uU_PA-JM*MM~Btgt&?94vAle`BHAp a}#NpU"#EUR#kxBm8>z+>'粇\Vn>YnRq|ۣȷ:]tgHC!ț Ǯ0ɼϳkި՛(qN+$.ub8ִXO^bІ<.Gi%MPKj2qЃxL@:f|LW_>ǜ§a/㞿dA7צQGGrD'ӿƒ=Ա^+]6xb $溛v=V=S#VPO--&РO_WQQ< j?`#Zx/2WrD1zoآˮRYķ?Ҿ˞QI%coV5]>Jm,I!B?f~\BH۹m?0(UXR !־\"i6.mz֣c/1LF H־Y~4LQxj-FQeepQe+&Ȋq\jUULćua=&ɫ-[\hbrO(< Q;l5RK?bt;ݣ|Kaomu'ȁ&a|пtZ 0+YiOs=/.k+(03v.e=% ANl&I j3 s˰-Rk\ǰKNzjޟϦߛ|J!RE @LzW`P<㺱/Uf|/!McZqd3Emt{}dž LYBo4ے?\WIFiPƌl=O g9/pIǍAo4Mm,n3Ǔ|xzot| 6Y Zm;669I% 9N`S0Uן5u7s0p9$V[)9":ܖwh0]s= f?/ Wѿ/'=&Θߕe#>Ҿr8t1bwO`j3]m n!(sA ((((((( Ԝb=93F~tQF>4PEPEPEPEPEPEPEu>p)\1h#z{QEQEQEQEQEQEQEQF(;Eڏր ( ( ( ( ( ( (~hwtm}(((((((@csz1JQE0 ( ( (?##IY<´O-nY?<=j"2C$d-T``M~gUMV=RUƢqcNڣ{o<5R#o jԼdWEm]_9u_:*,~"[zlc#xj&{Md-_wL1D!qPl Sg.MWNӬ1jVrī9E  |{A@_ ^-]J$'W Gtx5?O>𾡧]Z{%"a./@%G<}y|Jdž}&BK). b i`dנT{M3uT+-p۾B4lUn{wk;[qs5Ͳ۴W;T@_Xhz]jWwHZJn\zZƟh߳?+[;")4# Ziz+EbXޝK(NaE(F(W[ශ|/]j7+o]/S$WQ^Ͷ}hսֵAjeyC(_9Fk¿V-]q+ au%4,qjI#;>OqúWumImZijc36`@98?gS]][p@`ڗ2=6 X?9$ o%q1o-f{GbDcNdcy||4K1M@] ^zx\N[v>!}NEew"i5n29k..mi3\$eNR70}@=֊~|IM*iL]t2F%@H=+M$2qߵpMy\x{Ku˭F[HcIk1qߨ5W|}.L#anE#*0B%IR|iOk_D}RHbmii# űYA V7A|RUWq"O4](K3h|Wȯr?#kâ67Q~YV=g"ſ޻VKŮm ޕg 7%U9Q,8#E0;?ك#π]]궺ա- "?$ׯ׃h|׋LG4V,kȹ݂ /oVkk-"B$G9gBha\U?> (2/K=765YUeaH W'~^׈Vs,,t,1ϐ7΀8`OtWUãiIW'&]=$Czm70vO˞C>=GK [; $Ǝ+µOF-JeG:ܛZT3*yj* kUMhH|Г${;+߭+{u^ O~ iMhZS2_w6'18q#u}I`މ&w]XȈY!KviS@=ŠM35sJ+MB{+a|Z$rDeEe-$ WӰQH3⧈M HG1+C#_:|u3徙ǺZ֗nZtm; FF nrzW?5 |?ռEY^hƚB#fmFCZ,>)j_l~4ir^I$l|HRFrMJP{1 u֭g{5v,Zdjլ0q\ pTW~̟]ۏyՎ-'7(.UI'U|sBΛZiqcbYe"y.ě 9W'=GxM&"{i6emgQמ87ŽwPMO-? In3#Pu ~cOaz|8C^>3A 孛kYe@{Fĩ_텧.O][iVmtn"ab9`NH(-7>L|]ivpŎ6J+8L*[,;㎵gAu;+>oʱIIcfr8ɠ;+|kj_ ]EV-ݜI- \w鿵DUu [[nFأ6C0"j+k_~ |Iem53޸b9#W'S>}`uV[XԤG=3]ec;GmPϒ)$3Rހ|o^3߈|Wh^3}yI}[ApeEi-8H#1lqX$A|adA\dß87f9'@ktO֥([K|kz̅H'PG>><$vz>VQj,HIoÁ'>`3xAc[>X$+lH2$*XM{EW׏k iwVv G*4`O$B9E0(Jt5x?|Y[F>pn ؕϩh"a+>5cxK XImJ#9 Dm4;8.- grLTޫw>_DYww:LфI'H7uo;5W=wX{f{}OƗj\jvk)r:,  ]s|Rn 46g;qeb$<8EyW.||u }5emlC5;mmo;ynzq]x[ŝ[˯ves"s&qzwSKq8KiݓsmC#5 "A3AԠMܲ6I\d`hZ]EP3'ž žյ I8|/;ψ-_>49 N?wNC&I㎵&o*! ôgdWc13WĉKDNnğؗѣ8>-z >~ПSM|O,T1-FۥU#2g#5>.u-GGn4f4lQfR󱹁`wkOgi隌Pk!#$a>ռ]Jú lLSyȈ3('kzhmj}jKxFM&i*˚ᑞBGk%/bׯ5]!tgh4=.C# #(ZWɑ:쒭hB4%aMʣ[<ǽ{oKB++ny+tHE*9b[Nc?j CԴ- bk"Y%28񌚆е;m"H4R7ngStqOٜ99=ڊuψ?ũEjĢXy9CT W9[т\h70^XپTm'$e<&uK6@9## tGtknCG`Q*ceK4F2pHI-OmO(&"Ү sDf㿭w~ޛ`nⰴw4pI'+XDJJ2#w,gx1A WSD[Cf˱L7Z*Mq_{mb$EZIkI:-e.ǞEzƟi!CHY|gIo1I8oޑW[3Džt C鷚s NV D}֥[_u߉_,u-GJҵ-5wӘ¤@ k_6+O_ X^xj; ?^->eҬ|Ln 8xռ#SS-X4;f"f1*9a늰>_ n&j{əA@6Wsğ}W\K!.څ}:`qHE; YNLjL&{Z;KfX x oim?:7AkYMء6xo`!•w=ޡ5T/vV8-Ȳ4pIڻ5zN{w%,ubqvR1'N:3~οZG>lUG6gEb}EpO' IQ#|1)5o_ɥjg,&h\YZD`0HbzWWzW5i@E4]'rq?kdiAOs(&f9v'#²ja5+\YX,6#9MqpJjଯZ?z r>|HS?GKuv7-B2G5{'kF{ ȚƗ  (6`tZg[MmF[kmC$Vq$sCpm/GB_j[\uhnXX2[5F\3*ΥIo85/3Z4,48 a 3w~=i3 -|Vy.$٥%QVrǫƪF9O{hn3}#CI2SIpY[:VpX ExIڕ nem~?zhn4kֿ="}2B[*)&CI$ -u>ȷy@'MW|Wllu{Nnt'{]P S^Ez|K5\O_'6 oVq.r3W/ 2]ZC5:wi"ZE%|B }¿Oj)):J-R@|ag Pƻ~]PIʄ<Ӛ4;4=giKwq,/AnyO `RᏆ4˘,Ei%Gf@ť\[-_7!QVh,q緸L75YPɏ qFS\}&f$TP*vry+o[+Dy.ܬ,O2;gҎx4O_FumK~̷As-ƫf&V'/` ybW{D~[:=bKhZKb3>bd0\ȃ87‹]K+JK..uV Šn7urSo%EsukgOVn6 ۀ@6T\Ѷmw9ߊ l3.{Cz onah).6VILg[eF[[A++DsJP#? cog _xMs"i!kkf%+ cNbG#gQMm'A`;Zإ%-PQEqa}W_ٳ7NHIf2 rIK7xpEj%+ Dx-1P_|Vg K9Gia'\?q}ewymn[1wy-2( 7RǡV>iв4+($l{9cDhv$APq}&Oii>F ?oӼ UiA#p;{}*~ƾ Ŀn4]J0tIn-X4HUbWk:φ[BNme0tw _i-cQfg.4?گĝCÍ>A:_]E % >`cұo7|9kc R[x]'k8b5B4[gu מ z[νKkWblַ,ۃc>x9ڢ_no-4Z4V:[K,KQrA(ۡ73 eִ h:he8y<ϟpqW)7㋻|8iu2[-MIg'U!'wq^_ tG4]*ɖw[,AzW5 Kqt#*lʅsީ5ewmo\}bVQowIqWIo|..66vq[OnҿXDx}g-,mgu˫k{/vaw;y2~h׀Up1dP\QXk7PfPxQH}NS_w.5 ˩ٶA sk=k׃ z = HC3ʋ+ l, <1|.|TxrX ʬgVPrr@/Ƌ_{RԦj7Nt3*RGLrI4 k?~A_0k4F[[n+Í, ngd2x8ӼGC i >/ښ66rUqѰrwte? \eWX`$?E( 皸gmno.4;47fFݛڎI.eIql148,䑜 z x[× i紿(L) ,&Hf<5Y]iX6{&Uۜ$ؤ={wk-Z7< cUU>õW#՜Ŀ~]Ht CQҢ@.%F"9*឵{v2z[Db]%#x(  ,md|Qccra2Ĭbo@8|5eP_Ţ*uuw7,̪r@@}kEJwq>-x>5gCv2[X )>bF1_ _o`&IK1-̏#+]K'y`xniϏn\O$ϱ<{T^)cxRa-ֱغ3쌳ćn]@oC]SҼ!]?֚5M-e!ceʒSOq+hɩki%Z/ DfU@pO4>+KiwN*[@;T3*L2z$%%gnki7Z2K˃F?mҴ)Qp %bRS*#;5x "ޕqQQ[ImR#*)ɯY%y_^z/B3篩wO-9k1sVE!<ӏȫT獷$x?Ru;@ ]ȦS.s 72]_ÿz? Gqʖi#3ww9f'H^%PPOMR$X>F*y L}N2\Ĥ`=*a܃8:OmYM)Pn5ߌ~M7H宴uٕ +4ӇʫR[9ftm{!y0*Jx=-f_4_=j{KvʑCs&ɢܠegvrNO5+mumNFO V[[Q&b2N_($|gq-V_@gX*vH:UY'GesOuB֞1Dh[,>w0Yx< x#ixJ XŬ74Q$vO\d#Ek8fGC3i| 1)e>T>ꚅzyӣ`Nt(Vd\A48RcO|Q%兏,/Pż,dhIIFA݆JϮxzXK JUTyXU8 *>w歭X=֩^M6ł.C3皋şxJU֫Zj:dkvwa!Q|O-0p1NXZݞ-ŏM[cҊ lYˉ~ IG5ᑺ|7 R/izvAI<-&T m9dgxڲϪk]B(/$ JbXA+v=3Emo哎Sqt^a nPUr]̴|"NpsynY}3@*vj֞)\AA4ړ]K,?T:[ ?%M Դ{3|6!X5-GڸdwB1 Hv8o#Ougީskql ;H*3tli nujQ.n~`fG`UfφQ\fK(MVG8jC[*'mkDl:nKZGϕXqۯ<7xᠸ$VW-0w[E3W$ֻO |wɥAossw%7e岕&`$ מ|)/InwS>:gU^#6z#]hO oK]?gx sȒws\}[ՕB'){b<7>|&7jF&q>le#P')F{3'lj4ox,AHa$`ķ<9&4֯$ud"}ֆwU-(Ϛpw5?~h=Qյ[)imFy䠐#i'}+ujPQq.ed0 e\:bQSXxNq¸NQؽP:|$hLf5b2m#+MI=5ل>!ܐF"9Ltvh7nirhP~𖓣k^z]4wWeWt\]pv/Զ8]j|o^xKR;yH$xF`TH~0gukŷ(fA&a%sb_7񞙢m˷*TU.j{EoUL𷋵/ʹ8\#8j 3&qgok&ַ.!\ukRXc0шU]TpW_/\jC|Kčc[ |eP?Z6:|nnR0A8?PO& lsY@4w$4cߐ+z˴`n*2zstؒ2ʣKڿ?\CU5ԮF-#0=9In}6,Gjņ'i 4Tui<>1*>1%Ԓk%vFxFqj9l"o93,eʁqc_/tiSq >_Lg!}uJn?꧆/_2q!ڏ l {1Mk~?Z?,iG*(# GP~Sz]лDNP%O i~fX$-:&f(LcᏮ WUebd(NA9`}8mV F2yVۺ-[ѠDM oműK1v8>o ^i~ 6I4P/,o-uT|t_jDMo$, 9G*Fd`yu;J—7[!bH'@ ~IԯtTRI 8aoSg^*NI-+j6s+ 7 Tt9s+k/?&ú[eYvVe$8O}{?xQEt7mXuaƽ"KhJǥp_ %HuɌO>\wY[$the[黝 R8#U|5,'VF/sU5,K6;PK)Ǣ6_#Io=sT59k =Zuن1ɨڛErjFcҧvsJsY㓣ҳm rv8}"4s~2sM62F݁#/ ~r _[K5d9°ܢF{FKm]ͷcO鞝+;?÷꩔rT@|k? `еK}JQ0c2xl.K\eI82}+|_R^\4jG۹ҿ=g~+?O . z:Wzw=RyƩq賂:.k\[L @8=o%:k-Bux~8hu-^'m6!W&K𵶢l^M忉ඎ') Գ gho?x`Z͟u 떺Ţ;ZcbJvhseI/Jz8qU(ya]]JUP2I?IyJtTJpzna}\5+"WN("Z|Pik2;NTÓ+PE<7 nz]-ՄhLorx_aWmbQHY5Ri+qT6%ͼ2)#w"僋wGR;YU͐tXӰ5w.$}ECiG{";k?ĺ="nX=+PgI %sۓ/H hnWR[]DFe}0= ZASЧ t9y#hԕ#>LA~o1 {|#ϳb)_qZs(&\ azSχuh$tjeex+6bm`bP)bP!V~V^tYpSFHLNlSfi!yBrźGA0 9*@RnQ4T2;ژ֥$[x^})ٝ>LJ֩F< )'s:NXcWW8o1c;z ѶD>v2ֵ-b e)̍?Aޛb,O+%蔮9 +J$%I&=h㰯>uݒ;aJ+sԼn`T< w(ճ7P/缏"cU V.0kCoy1MbI %w克,#"MU·fN!`V*G_1 p֥rKG7@hٔc^ZfRNCty +hger`>%1ؕ XAk5s auU<;i:471d-vIlڜ$q:l9cJVҚ}d"WMox6[RX#/>f2*.ZmNgȬ~CGZΛ#LO%c_ G\=|K|qr8e4;DH6 q޷ %HuJ <9}~3zF&5ޭ)pxEfJ.q/]Q"6e5=7eU,X pdya'?NY<6;bAރ?*V/5QChAo<1뚢ld(ض|Qٯ8Yvr9=*#!c\BNEvLԛn7֟Zߨ0sҠI[Ψ) G~GMbOr{B.1 yI+[kތo-NS0[3ms~eޘa9vmYim1!q9'^ףW3⺿#)6>L[ACkҧ| -fdB dwN}+IɨU=@ׯ.#XWUcBg',xB"š)kFG O'ڼa5%4{mbʇ%2H0I5Of[kmccPxap2 '_0H5W!Yhz]՝f%g̊;׽xr[薌QL*D!Wn 5:}WOW4uA2;௷vىUE!X :r+/xLCRqjK=Ԉ۞IS %%1gu|[`$I q]uiJq~GcyÐj7+M6wCP&18Su]ztCz̢?]0 g=5מ wA \ԮQEz'yKe|[L~+Sfvhry\w=;PnKՉ8*U0M^Mmu2Tˍ' :sJ19ruK-B1@5 A&q dTo-, "c&XRH FPOf#8bKfł?y}fP&mRy,ЄaޟUW}ّUϮ]Z7+Ň8$t& q_Sf;ˋPǩC./>$HlcwλL|6-l. 1p$^i:`F[W|hmVh< R` t?sTgب>uk,:Nn1hF;qp^/cK) ,Rpv+C%k"->9m§#/ N־Uei$.C۠$O\UkN?iȆcS$Ns#sɬX|76\[Rd*,?NySӮc=-tt,䘆@8>hzuqE$g$h2Nj_z 苿\|j𑼺du'[ypj:-Wණm:FSW_,elnc) zd<_r|Ԋ0ۮmnc%J:KhmʻD$ ?Z7 j xXm 8vP_K è?֝٥ *PGLW [.slF]n?3W~Ȟ6|![H;{;8RAOO)p:v9GDntJ ;l2Glv##5Q8Is[ҼGfTª R[ e-) h߈>tZ_ \fN-ﬠUv| ݏ]*Ҵ48&3oZ񠏇ܘ?pǂ##:~Y6?_D.yО k g˞1ME̱5Zy.Zյ𥗇,4B81WlۼjQ;3TjW$J#YW Q.f"HDa]NYMN|َ)+vZEvgѥGxy99W揇AX޿KhwJ )Y"# NW_&VG_oyyx(2mp;k{;~7)N$4BMmd0^ٸh_UW_/tKCN6[hqJ210tsHEn\w ]F~^9ơ,*ZP{)Oj,|}z'Πcм ^g vlJ:u𤃭-w.k"|+ZxyO5,<ƼNmqRM&O(8rw8,S[yKFr:sXN.SHIhso.qE2Sy2-> -m#kubas(En$bfotocx/images/localcon2.jpg0000664000175000017500000011535015247006660014660 0ustar micomicoJFIFDExifMM*JR(iZ02320100fotocx-26.0: Rescale: width:372 height:300|fotocx-26.0: Local Contrast: pow:0.470 rad:73 color:0.420|fotocx-26.0: Retouch: br:0.00 con:0.00 sat:0.00 temp:5000| chttp://ns.adobe.com/xap/1.0/ 1 2 3 0 8 300 372 1 2 2 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((,t" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?1OV${0 D\kPHHM!7b]5vi5V =7K<糜Vbt/P;qTlP[5đ?@'"eQDݹIad?turS1[XNe Iak7MaRjKS67ڤ^b6kw#5R[)"BŶ9Zӏ33m 䏘8:f9sR]0'(@E;cOB7oV@SRJqG`sңi7)rÚPwf+#RF9֡Y5BOzdj)\NjڑdMWcpOҚi;sYv%wЋNu䚲)2 c/Y+LunqJ]&J|04Ҭqx%۲")vzj)&ɘ/8㚆x6*jz쥹Yb &XB=rN;vG 1\ة9+#mۀqV ~u t޼LS.<뚚F0f9Ozd"E=1#qwF2jXYnȮ11U$/3^mÇ#V~ qfHrjYcbǟLgv9iCsZO5ّu<sP,兲xy)?46kS};jt!8k4i@su?Zڱ,Jm=niʞ򢲱FexZ*c!f %ħܹ"ܞ TxE' (fM[խ-…ILsZ#-ךa*kKIoIe"0>mQJA 7+6P&KGS$8v`X+6s1\g5иVe55MfMvƳ5;o]A9#=JU43IH[d6HR G#"˴C{4 FMi*cMsIo-ß.6#8ϥNo2:Gnco4[膡cUvTv?tiN_RIڪkڝ2f#N'=1~o )J2,ӿLP98?juEԲ7=_^ L>Cq8"'G1Xb$r׉uɒ2!r7cbNO?i72\ڼff䝰VStv]Awds}L%.dkE3#0l秵@Gˏz&Ӯ%JD)ӠV7{4@s2M %i)j]c`Y9؃Ȭztٵ8hH' %9f?x2sVlx{39㏦=A;%\HBHq\djy$"i2=8:뚥w5v~wv2p;OkD|yWK f zR~GJٞ %'ޣ=:޳tP $'|ϯwKq$l6q~08j+uxvjy'q/rA=~]Qp"`8:Bzwa:i4/NzQ݃*Nrdz$@:$,|YSGher6f1n?bB# 6w cӷ5YY^@嫏ή&Z!]mO5X0H[冧ܳ @݋Q}r VHfR͓(Me"DLR `<~I=mBob01]JHCG*c9>]n*Gbo׃ϭiby[Hʣb_<1\߈/F'wPsC<~N^(mۤ8֢j7cW+{i5d2q׶O^aېxf?Gic IxT)HSN|Cam#~ipUˆ=I+*Xb)҄cPy'4L`>mp1=qp-w eבԟƮ_]=`('u>svL p~fv'dӢ&{.Udr=:]SSxUQĶ;4cm2r¬mԀW;A/ҡO1ZT3e;:͟~Oh !T28)3T:bR`pμ{,=q= +rN,mb;.vH=ppOR*H%혂Rck)1ۭ(-gAX\ʖn[d#O]cd qx&{B;8] 4,nD3nぃ;*fbդIzӵKMB2*pTnWDJ'Ov5^FhAʹFE^eP6Ջ۱8\V5%zp)-bjۻXp;Tܷ*%>}jN$Ub3JܩA<{֔dXF ŧ`+\::ҭ4 VU3-I  ki& ?CdsE^d[a>D^Ee`@Ss֢o9e9U;3wJş0L_Zk:bF;+9F*2qqQ@CJ8fBI'-γlH%{Wg7-.͟' Ɖ.P&X#n4-ݹUdɔg 3ӷqX:d^mtt$o>;ֽ0XE̅猪[ª# P9J}g򤥠Ԃ :KYe(fg'z׷JMЊ0ΌY };y9h!rhp :rM%T&Ds僌:q5IEл:r[plyi}G'9ZEIRQͤ,x{U- ςXv'=95ˆOc=s145Qe3ܗo{=s^*ymzHA~'_Zۙ'9+ Ñ"D7#XΥث% 60$ JO.w61#BW͍z=F;,c9It 7s8qq882~w%6Qđ~'Z"`*Cp2\d}+ d/9y3z'ii =u7?wciV6EaHe]88<ZPc.τ e{3UEf8:*Yw9Z֬&PqW4;zbI!2\m\(f?|לjW2K_1$/BzqmѲ1V ʽ]41rw'U>]E+\cʋn$^KoG79ۑ׾2 .[ȷq^)ZZL%0<6J':kFJ-t4Πn#(T`s[!F0=}bNNģ8?~Yu)H=!q#sVfd=,L=G@8?ʴmttQ% )jj:]|Ԏڢ3ܫEw}}̐~D V'3+sk*yOB$ᇦO8zuj @@9>vM-卋FpOFGU)E&51LOFB:6'sXZɇ"}:),>5NT&H6A6O?ZKO/[s+/N;q`cR{ww2p@``y`5v+Ǖts]. yTwc=ɪ6~&;$v csJɳF$"],9X1=6>/'"/I_ֽ_L] Q @]gj֡[Z QW~y'B+J)t[]M\#ۑ+E,;<)?ΡL,笠Ե]9< g:zYփ@Fj7IQKzu?JLK% %1=QnB-DCY'3F})]2f^v@sA^u5-P13tqe)&yuM)uF',O>9Rco+gOn;1Ú/V> Nʳ&9 T5= 4g%Ygpщq`6GA9.K\TkFd+!WUJ}rGҺՌ9viElqTv&%~v˰#GןQibH2sX;#r[8}{J 㽷-m-F2ۃQYh6cJ&@z1ՀV08V"'j6Շ{j:;H=*娎C4}`Ѡ)PtcZ>4,2q 9?+%M{Tw֢`l!q|dddYe]9f qߨxsRa1iJOf@8=>ĺĒkhSݨ<=ai6#eYcR\|jrHH9V0{+fٮ̤v'1{Su\M++E=Nﯷ\ɰK&Aaӽr$w>Y!1A^?J?\ JKm2|I8-$vzqz94:Ml :w ؂4ҍerKmBm>f\|zwE%IYa cۙbԬC2?;y-:GNE8W&ITt"qֹŚa I7g {+[ilmqm48$Xǭt|F*'@#Ir|篽xg";y*|cqsLhf`yzJ-s+lR$$jvbKcyLž3ɂc=://] w-3]Pc8ɧ;ܗ4Ց΁XE|s̷WI' }Vf\GGqjIFVBz&YүC$+NI<<{jwݼP b;ckk^k]c'jPnZedMu|$'BXѣ+8^9TĖVH*˒q_ڢ[y\dtk1}f^ZM+wi-@Ol{q(ݓ1)o PEŎ$)P $"H5Bz ~)H<$zVY8!bx}4:Tζ,fxu$+REG6sBs@z-`.Ì=3٥: +N=jQJ{Ee3 F'"O K&J85h2 D]]GRrM;۳SZ-=A?1ƥ_6dȈA%d8<ҲemݒdQpqqS[js[6cD9VB y[tqM%ڴ$~WjZ:D38iBZ ʽ'<}BūV8 # pEHN6^M hcI~ey'?sQԥGk-8*DEO߯ZUM59x(9#?Ê%fE >;VmcȓƘ&tF2oN_ f%*w|]Sh b5 0eepH~Y9Hj-i ͛*Ļ6qRޓMo?*&`?ƺdNi;D,` lf0:֯kOH5e}c B>Ps8]1rڋZ~bY8m1br'=>~c%KQ,5"r=o-H'ɨZhn3N3:x+{QY*R"@g˞ǥO2Z)q#Tn-"g!s9ڰ$i= ѕuss3 Г`zjJ'@oKk<#)`0[҈BCP$m'on%E vq_mh,KvۃkKWvCk]*)%Bۼ=sS*qzc[ΰ%A<Ȫ-J9SkM嬏nUF78Ͼ>\[[}0;W Iredi 9^x=%HLgۮ1YKKN?ƥP G'? ufaGːOԍ?}jvY^!\GZfi\ovq㞿ΜgIz"ٳ"A3c C28ֵtu Y A)pAS%qSf2^RcCLH"AI^(\F\3PM#ڱvqZ;7f+)$ :֭%ݺd`o+>#2ۖ~HZًWډ^h#-)e+e9wUG<܀桛X(X' ~dw6MBuB=z~ dP.=s\`r2iAҾˡZ['%Ya{d~\VYY31ӯ>g^fPx`*@㜞Xq+Z,lĩn/Th=Pa) Ǖ$9LRO*yIbxv88Mբr(!G#bXM$!B͗NrUPĵe!ʇcDvE`jZmGbz3 norF~q? M%ȅ <ӶsgsU WUKڀnfRAC^2m;2*ei &9ssMR[@J w'bʪۇ9RI}G|*Bjt玼j6%z%֭PO&Ւ@H:U-'oy3B#+y԰\}=jvaQTcdOۻ)+ylܞ3pGVﭦ|YB q?b_(dnsZs5ܔR 8(ҕ= *EmˑקOϵXhna sA`0u;g~E⫅U\l5^Gz/+a^y8=zb(c%ܦu9>Z^;a C``sԎ=(u!ġ#wc2)`7`)+U 9O+3Te9%:=JD&bP &GJ]Tn$ָjaghnBǦ3zZ7Z`˱_<@}+46\S^2%S݇PvڬWgӥU;_yu s"H.ѕ=7RW챩@X9wɡ%XW:Mvaw= [E,UIt8kra8E*FGqMҧa X}e^n6czuljYT(W<=n@OH$ W,yˊa2^ǿɬ+g28lZ5g5fZZ:4~0InoV6BBq'3)͉ƃ#ԷبXdҥs);2tojH5ho8_~A#(Wd$뫀 h=z5%mNrG#׌SJ)lL";#={?>\$c`@ uV?ܟ~Qqj'z8 gsu~%Mo\69 VlI3˝ǎ+Ԣv$Ï~gX̘m°qRSFe`gnWt`lxڠx|1??*Q8^W;J f`DvGG,;m!J7Lq؏M3XD~@S5$DcH.bIX.GL"\vaU$, pARk'Oc;)',yl=2 &@s^{p('i k]$H|>qtRRQ$A dܪMnS@q>ٞYElg׸8EJŘ+8 }8w5H!:b^0݇];zu<-(QNjO4oB+ƺ( :(U*ɖ}V[W8tέ٩1ʤ2w MtʒĹK}!?<Ԗ/5pcA3&}8coJl9q~r[3;fk ~Յb Wt(;Aך2?⣒NzlJȒ0AT7'9ϥUY JZ6$?Wm8,|Р` dN2`|7`rGQKܾnva)˜jJң =3W ̭ Ԕu9"muΓ(E8 sO_UYw_~֥uR=HF=TiX/ʄmaz__(Bz[慷lYznMA/=%G:b2l6?OLQxU<߰ lEt)! $qLJ SqSxQ| p%enUr7I#4`˓Gn>߅@8?#?\zSx6 *|8Ϡ85qJ¶!h@3p8QPJW8=+=WwW+X\H7Ɍ~xV i?^Cuam=,įeu+AF? U@x}F|^&>\ <9L=xgM_C@Ąqga_EAj&F@1牚&-_@ہH:?ҡoռ; C'<_D+' $[*+ 3+ĪIi]5܃>]ToĮ˪d19_A\r nbU`y.>xy[FEԠi׊U#*_OO/cH1PIv39n3Ϟ*T&snOdľuP7:wȸϥpSHIL.;IµnExSc'YL9-$ ?RS]$1x=~Wq7ڵ,h1F9We\13ID>kqñ|C2ysַ֖p"Yk0ټ7΁(>=rϾN{wdJܚ/`Vbd +G7SK]ŇcGҐ O<4''7y| ;u}}>둠lykѬ:RW58e'n?.~HY|K,);w_Gq?#)#QY* @%|Ipr1~RJǜ]v{{ӆ=:C+qq bSľ[{5x{~1*}OIdQqkKNNjh9uoxU'}ky95Y3@trⲸWR:zˠ|H χ 0r:ng?;3&ўNnd9?m '9 b~H9:LU.|k>ݏxgxyyi<Ŭxxr> ]{,+p@-t{;=z_24ۯryx|4n*^I.-LH ;sBp>~OĦ7k$ɑ/ޟqf1IxiSx^5, 9b1ҳ[PNNzU{qsi]U &\r>[n?^{T "D% ޽[hmEȣ9բùWQ"kќ^8~#į*_ ȧCҽGOnl$2G^DG dg?.8A|J iː?E}.Y4|3xTmGBZWB<]K]2N(jRuz桒MvU_Q"ܥySCEWoZ]Ap檗FkbvciV#|~X[yb0 QCsu+1MbOy #@?l[HnqWhTSLn"(:TZ`<9*q5/+ŽjڃXN? E_kdOdW1?jx._U?UH3ְanVm-˩9ޣGr*@d4x޵э\K!M\sXqEs*Trxi\t8#+UffyeA|{zVEͭʤ}{k ӴbPP*f*8U;]3ǩI1`q'0<(#F*xIU39vOlVE\ WyҩH6HzWO KF'3ir3[$pjԔ`w&T-"Y7`U$b" V$LnfHv 7= т(HPoyIک:hhUngJˆo.KfH0@s e$uW+1'mus:w  t5'ְt۩eXNn!d(Tv-;r135 B恥G*N̞KX^(Lڄ^E_R3U^d@U?KҕRHӕ:R.EfЍҐ=b|^UI ['nZ\ucu'8:ֱt75ܶ+K6|#Zجj$``g֠K5I$'$VI2&V"X@@ G[1H NKoVͧ.ZA',γ,۞($Hvư4e.d>qtb`? Ƚgg`@|P[6a2;a@O[t?t`1\WX3B=9D)Nɮvnh_*>xa .E-t;\'a/׸mBZel],ĥd库[UV1ֳVޯ[qYJ6*,ʹRą{#F8JؽaYș$HmR2ǩ9 A T&W$Okќhiɒt?qX-ƥs B|m]mw!9]̤z?08&Euڴ +H5^tk+'.S;Kc88^sy]@<qwO5i7k^K_\A#$XQ0-sRZ[ږXT7=23c'?^+9Ƴ/)QA5wJգȖ͛}?x?yV&M56-'Ҡ|1w;[V Ia*gCbB$29BM)oC,TNt 9=Ft~iLdM-[O^F"8^ޔ=լln˭:Ap9#䶚ޠt顼KLmˌJL2Z啌b% d N{^rI49+w*pۏ=:V. t=2OX7*CMJ\WI-6 >VWMeO4SHdI2AGpx2O^qSj 'd ;{ImX(fL IsOsisD%-$[lu춻0l*XfnN{`1]Ft5M"Dײn2ć*I9VVW,&nDhFW9@AM nRe,<4_W//G!rʠI^xWz^7fiTf 幎0$V7g?t8D6*m*!NqGVj-?mI(c܃daNnyUFlk.ecޝ귶 As*>0 ġ*W*t9h)4$U g&2a#aZ}ɾ?NmRXZM#-uHk =%2xԎJTu&}9Q;[E#FUu l$y3קa]k4u!B# c!^ 8 [2Ibޯ ?L0KlilWso^Bu2#<w.~8ҹb6^KXZ(Xr,Kjlc]n"bU$dcT& S[uu ^[Xfa4c'yP_$cg[^h^5{no6) @c㊽ 4 V[vf_Lrx?qlyq:˝aR+<.ss^X4H պܡiKy0zm铷ֹӍifskV.cgcg}z]~$j/pEaj H9=䎙6>x[w>c7;sgL}w5/)+ Kd@^}r|l֒\qϩmIRH7rgOm~ۨj2AjMܠM4%*@'}A2k]"L.浒GQ2NNZ07NAH|4*lG+͞x1S:B>a'\\nWl_^|奘4Cw/m\zg={Ns 5 T>? ?̻{`O^ IJں.t]υOv 78 Nsm]E#19|AVK|]>/On5A1elax:+*Dh6en>BD֚3rDLGpPx+;!-Ueþ; ܅lobkv.tg3ACAzLSڼS%"#I&Ց@ >adyO:/Ƨmag1O$0|\/ , Xxi$Tk\USnav(9ZGHyR93z{VfY kmĂv-sF8ێ+O{dZ.08@p0kӵ˭,G%$ J t$`U1z'n~B@=[N(-KgbI>>da#9OwJ'} KMOBQjE o4nPp99hnb.'9py Eر9 F%æm\2VE N>MIzŴdlX߆Տ >k-FޅxB[p1U;eo?:@f<3gs3bDZ<ךhzo q]bt[u` [6΋?7b^)u-秊BA#8֢Ӵ֙t{RZKmXv{g'4r,DSt$$?ΊQg#!fck/ =ji֪Os>@"#`*Tpk<;-`${w Kv p1"$S=-z\ӅT's*`t錓yRήN={l_ֺgw >\~d qzٯtkӕY&}JZA,d O#ϥrJN>u5eĻ>e99XYm02~fݵ䁞}iזpjR$#dSd?/N$uU.|CLI,)4,Zǰnvn|sY&2jS[ç 類ApOpW۩UJUR[Ʊ[Kk|e5I"n c s d]Xf{8)q!9NJB .F7{V|) 203zMT{o24lQNDYF S/d\eseΛM[]N"p!U rN;nK'm qW\NJ:qRS--~hhYqz}OL:V%ޏAEy21H8йV=%$L۸:5u#T 2t+SD]3R5YnIg!p'$t~:J3^ G?5Vqv%YmN:K[H0\edY a:_vE7H_/P1Ã6 G/xgP%ӭnf_ 1l`]T$ٜe8l$H"u׊Ƴ gIH+kw$#3qyYkӤ;1r? M^[D ,(pk<9<*]Qi';MH\pg 5TEnuԣ[Vxaɪ]ۗebypS ZuOvR8,!x8aqaf4O3#g#9SSMMq1_pPmn,dY1в`3یU7v$31 M5տyhJH&8*3xyg{{/T;wpl~=En%lht)b+=1x~~ɕČZC݆/w1/!?'(If'.f"^H+̣s/BAjy CY00#8>$>#ng{rsҌNИr`Um>X)c<#m[:x= -e [3EDl4Xa89 1$w,a>g>دN!/u} TTnfUr3򤅊ŀj2s׍ ~]%&`ӭ?ZbrG85fD2F+>a);QZBdN'4!c Y\7Lr*0Ez~w{ő$fFc~vP7zx`-o5??VbH%/ jzt5mryR[`'e]tG+vCG՜oo+BئãZ[Nc $v*~\gw~]ۺU&I݋c t8t(TFZ:^Oo$H$8y=a?XYe64D&p<.;+:vߚ/7ʑ`my@7h'L`zn;-y4 d1>J RñR/p $q\ k4NC[/y_F>Wc`p|Z:_;99Y$d&3OOz.dXryAA[ǯZ rSŚ4Ri#Xy]ӦN5p0b 1{v]CYYR#X6nr݀ZKru l-q3ڻiWEg}F[Iq Y< 7$J`uשn"̡ه͸/'r5ڕ%&v~FE6C{`zQ:sM\\]pvl|ç>9n mG#j/ x/,easPN~@fÒl#zFE'iV& $`Hl4I4AwBT>[pބ*]w p Còݕ0mb\#OL"&i!h-t"\Z̍ڤany˽sZگdHV8X>2p\sͤMϩf]&/A xEXcЮ~\rݓYE-VDknn*C37Q M5YPH[p#j84H&y$x$_D|V-}aFy㘸Xl/ $^<$9C#m$pà=IS$jVK[Ѳp=BݠR 0}"8Xx @yij+(#H;Qok=6=X?tK 2U_s׼/~ 3y2pb =1޺D4v&v[>n>u>(JpyA#֬-;2cJx랿\$rZIYߣ@,ⴾ1,ޘ =Ypv2 s\߈>3ϗ6Gy !z^VE# k 2ӡi jҕ%r 4;(5xJtBI>L6ۮ07vs*RFY1ߧ׶h$;m{ؙ,=cR^s6Y`3Z%ջC>|1|cK܃?.ĞAkB̜E3y #nm gf7j[7,Gc@e&"Qv:|_@3Ԛ[Ug%*NߠiHgw9.\eJIhӿ m6Ydaø>Oz:`7} JP*_rzv5"936:Jm$(b86Ӟ{Ԟ[ o.m9o)(\u?ϚYI ʪ<![ Ksw+PKOߡXח7 ygv',Kr}km/:i56'|9s|_ AE g [ןݔjWrKSϚb'8& TikIu3 w1gOd g㯥颒["m`f4Pe28F{=]NZI%͚(qN2@$ֺ"FIlU31#}sy87^’Y#X[}䐿1t~0CVvYٿ$<^=:/=$R6)@3#54^\Qecq,#~sIeLBt5[ZsQخAiLhճ>EX x~⺖ W-Kvt P+{榓"rK4R\9'eAhYNbdڨϷNwkh p M)^ߨi-I y &&=_+|<:F#"I Rx^YX\{Uʕ;+nkzs 4RWa#!bg}Ďc[zW4Q9kvQ<_+ОL^ymv Y:˙$DZ@~$sqҴ.;{v% -v#߃ۥ\e8mt=~y)#qOZAө4Lh6`ad?*~ꓓ銤dzVzzuycvz~ue,w6IΚ(&ݥm̖ }y֭Kd{XODUQ !ݐ87{h;}e:i;1Fc?_x:{,gi3Оsimv-1<{^ۮҡ܂ }J׎'ʴnM57g\Ic+6 u)Ҟr -֎ؑ( #*{{IBʱIn?daX krdIujKF7/@xVA"Far11:tMjfC)C$_+gԎaf* *d$ظXcosԄ-j0ys$)>m18S>ش+iDS6+ \rݙC_LZiqZsy9CRJ] 9uxcPeoIð\֯kN9T/vXw6vf㴒y#\ƥ+]]\4Ǐڪ85SNNZ u^J7bD62@b X늡 ,DQ",;+^cVc)_0}Y~ƬH%̒ƍW&4'qAgZ݊L$rF?5YG-<@a18G#=q]%Υk鶧lnXHHwD>S𦩧X=Ρf1Qgpv=y&__q40)bUw7 p{5y4,)#]<[8+c$s>#ՓY :N1m@={aBFFT c8'O*7wv4m/ N3=I#Z4CB; ͘a:Uf~Z6\6g?{ڦ6+Js!p 3Z֖k9Z#Yܱ]^XFT=ET^,Q\W/RKy\C–_˞m}FoeHPd1F ## 82Ƶ2E؅-oVF%#Ad<,a"k>Rj nJfUNp9Go ,v1㷮}jjfr}f(e~`]1Kc9y; ^-ђFg,_;zW6Y-Ui3>CڸA#ޯ,޷Y T/ <8XPq~iRܶ|iA֫M޺2Ɗ/332 2XŕA'c9v`u91$Tmu# zqdRn+2>#VQahU䁁:vC;$e>` ^tM5 fTޥ8V @#3T*[¯VCUH:ҖݮerOӰBb&w)qN=}gOf83J%dѣ!yF nیnՂ^=07p@3FK2`&s`q1Uh)N}pՋ\C2I[go2]¿V9#9bқ[n}гp`*zH^٤RB_~^!-~V^[''3 ҪY)iBnG'Ke| d;tqb;He85XIs0@E  $r;c۸Ǘi;J:p;855]X(Dѷ&%YQd< ;,nrj%,$흧)79Bs̒B/+@8⚐hnyA[G#:7tUnV&$a><|Ǒ`:fNk:鮒;`ۖVBHyrZft0P Ae݀%@źKU͛–"tk8wORKkޏ*%FvT _ݖ ˋbqFC\#9z.oRi~`u1;i0ݑ8IgiNUv8'pr:1Y:qrceA#:{A$hm9NwH&DYF͊ %tU8$x5+ڱTMac@*.$[œks>A< {xqrd]6_)9=Ǧ+7Q/H=I@9=.j1[Zxey@8F}sCpҔJv <:騭D}:uϘxP{cp@}jyz4J& rAr*+X0@-"%B?^2I! Ӳ[.'=M"E#yT^`#4;a,q{`r2ጟwܡ ;#@;@ppI?: $rB29<$cz9ga[ q? 5%&ԛ^.GpT`c-ϯnM }tg)+˜}g k UmQX[4U HxFφ%`p`9=j _)،mqc2d; ^r>ujɶi/<ÀGqەx~})ҕ#NGLq9^KQvDyI|'ӟOJ&w?eV`'`z49髐⹓: ٝ.\B.J*Gq 9P>Q4W:y#ܥMXu3ϠRIqp%2!/GGJKD-) K"*G85hC`!ߓF1|Ћ䙓Yq˼#~}9*=*nw#}F}oVv H;AB-Їn2G8X;[W1"iahc'ӽ@%1I8Yn 1bLv͔.~FJC7{38ɻҼn`879XRdNFsop +-9YҼ> coNߕ,-Qi/23ВFH3֍dk@9{?_ƩN]$N& ӯg) 7xEX.Kپ4wcsڎ/8qz8?j}aU`x#9ȬUf9ӵiS>v:]'Q/tQ 2GМqiwDLaV]2sO'Ӧ+He)V\zuHZ[Bi%c\ aq\q6y-G*st}ׁ.d|(;yWU+$6xqΣ9{<>cau 19bcێ8N?:mJB.+21PjEqCP8 2vFG+yo<32$ diNGnqӠ-Ȓ. Isk,-땑Ľ܀g;wz Mbԏ$2=xϡ4OWc@m3c :*鷷KF `Ċ'Fub,C*AےE[CpNr?\z- s2es'=^e&Pܱ%WP$`mN}jLnnJPrI \Vh;ȼtfw=ORNF9SHÅ.0W I>:qZo:#9u8D0c> $7Q;XL ~N2}0F: M<~9 FyG.U|Q|=GV.t=U=%-ߜSNnrW0˘@YLGvI0 ׿(n)/t^=K,eeoVq :Eenoo?~VZC>q [{xjYcyv3}A}W'q5ff8 q̀|A#kFʮ5H9Ze :shMVCܐu\fotocx/images/retouch.png0000664000175000017500000023430115247006660014457 0ustar micomicoPNG  IHDRGf>tEXtSoftwaregnome-screenshot>1iTXtXML:com.adobe.xmp 584 370 0 a~eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:349 height:558|fotoxx-23.70: Sharpen: median diff 2 15 15|fotoxx-23.74: Rescale: width:328 height:524|fotocx-24.40: paste area|fotocx-24.40: Crop: width:327 height:485|^] IDATx^w|]w}9wIW{۲-[md/HBh~BK)tA-Z !;!! CeY-]{+KWG< y>H==}ϖr7~GB2De&aL&4 4P͆f(JFˋ4Mt]GӴˢ;0 !;C:8dr82)nvSHwR5Ϭrehߏ]=/ɥ0 x02-)tb3ω$ ĄWUӉx[w:laJGGGRQ2LDFv=D0 8X,jBv;^q6aňUb|Y5!ҿi8N^UUU >m;AQ r PZ^J~-EF2M'h"7;|Dv_⍣AꗮaɝQ9;\ȵ04 UU皦iL&q:E>?t:3-biri?m=^PT4Gq$禛o`VU7dCc?ӟ~y=orؙQ:~>^LR>ǦzfՄm69ަg/d>7Ms3.筪evkNUǫ. SSU)N7h _lDzNۇ=*m FYG y5(J~Y).t1MӴ/T׶~zN<9@ 78jXz:ҿi$1ɦMp8̙3@2dΝD"VZ5mƥxWPYrd%vT8u ~long߆7i.8[Awe3eZfwNvWS&:9,&Ԗb N4{^z4lΘj.6ӏ?AKG?noȇ(ܹW 0ѕ,= Гpq'5lNRAh)~6 "芝̩N=z\bWg/00 c k)--5<㏏ G8M3uR&4پ};vv6~|:V\9&u]W bCO6^rʘTTJ;;vsSw7QU<!olC`Tpy2>Q^,fK-&;xm/ٿ?No.>ej 9޸3v=L0@3U,*'Oλ?ƵWyFœX(Тx&|̞gYS9~Ξ p wvE08ݭ;xiO?q[xX`alٲe԰t8Mx 7ӧyG[,/?x4b(} HIqГ巯m[uO39@jw*Ytb-[F0`*"~^ٸOa5Χ1m;9}+>jk*TY8-=g35 *"P6M7Xcl?FVt]5 c1< O-b#+W/+/Cy7>o)4s'=u;ӦM_"O>$?PUEqmٛM3 r%0EAM'aX/uT7~n9;٫?'?2:S 8Ρh]eͷ2?G48ƭlr7qGnόB<*GleשPßSnÁۉě7CZOvΛʵ8]9*>ݗ+d-異{ZqZ33Tc _usV;k,xI$|#aܹg ߿AL"]-jA4lRV~F>(pl{=$NNM{G suݤ|]@18ZY̪J>׷q/HkwDzdD$Tș+gRi.v**Љq Mq=P]]؃+hCKmQQ1FQKu裏r-xO~B0䪫HMϊMQ^|3Ƌj:M$$gJ=+ P##a`h$;]ԕOՁ ao5Mx<~Zqpq(6<'NmL2$xrtD2nݛk#p*Eq4@!u6ޞĥl__lܸ1s0|{cη?zٖ_G?eee{クnO,㦛nl2K8aiGHSZjo?Zǖ^y笚u+Ȧn|䩩s@a`_XHr( Z`TtiV~|͙)V 񨪊f+_m4iX?`>'ju]gÆ L4??tb&~\x$EH&;Er Oipp&o4d-4 p1gb\X834jXxx7hko4X,SS77ʏʺ^4ljz|<廜:?mڎihN,r'ogjI>HY\«?LLg6ױ쪫ز}ϯIgƫkŢB!C=shl룫FANuv'`N]j7qx<ԭIt˛Á\nI\߮\uNNΨ2;!:8=3/}2wܶ$ٹ,j0jN7hk;&'x-PT:W"E"ڝU`RΞIE^Etw1py/be,]GIe- 3(4z ^܁),]B˱$ )Xz%եxYhy p{ͧ~vK_<@R+W,ǯ sv 5W0GEI]Hߣw>l6n{4+JggMY2Ms[yB8<y98og7ymsl!%AQ&5-}0}89^0L({~ҿn~?}_Qw0EI:J9^*q>/jd@_QR/B\F #R84 …>ķ<[ƻ*=s2˥xW۷Bq pB BaAQ!,H8 !ѣG4:!xWF4L3B )phPnB rQ!,H8 !1F4va/Bw";~1~ol;7 !;Y(4Gr,[9X!.[~ʨsB BaAQ!,H8 ! G! ($‚BXpB BaAQ!,H8 ! G! ($‚BXpB BaAQ!,H8 ! G! ($‚BXpB BaAQ!,H8 ! G! ($‚BXpB BaAQ!,H8 ! G! ($‚BXpB BaAQ!,H8 ! G! ($‚=sek.rc? G!F顿ACDQDM5qݸ].t]'ii$IL@UUv`wر$I".GyxcxX* (.~$ŻaAZO^D" \C!7d``-D"Q4-i(ftv'?//N6ՖL A2HPhN_?]^F)QYQ?+\<^/pKnn.%%PZZV\ GqY ôB{{;}B!rr'qn7TWUQ\RL '2*++QÁrqx>/ǃpU,EQH&at ljD"b1Tƿ}[oi^ysRSSC8>| nPPX@Mu l6LBdgg(I8w$4 466t('OP(f#OFh>L8pǬ+fcXۅC^^.x^T]t83|?O?'p;~a~{{]]200a`B{{;hpj )-+*W1w̙dOky,[E***> :.~yxmXO|()._f?p 2gxvJz}O {{ `̙?#yٸqS;g.>2_6#oNp8D*̾ VXNQq1a#;+kE!L:Z,Yիi=q{~Kzijjj?ƢE.;>MӤ֯g9|0h 4ioo'K]tV\ɂq8vn7~,EFK(dee1Y`}߰G~?n{>5ORw\8665K/i&;F~~>Nt PS]͕KpU͆ntxp\rH,;\(TWWSmmg'_*sl>!L8_>k.{y6oBss!n?̞=kz&KAw!ąsS Ot]gݺuǷ?!v;={cӯճZ~V2D4L$~z^|EvE$tbw8w.X]ҥK_OBL@kIkF @K&GۿV1UZ xWٰa& QTTfC4MKK꫘1cƘB~N8_?C=8*CP6388H0$hݻvqF46DR,)/7n+Wj y2D{ȇ 6G|{ 2u]'fRAC$qٳ7qITU%?? _ϊ˙?>v3Mt]gd7FB*NKQQǎc}ؕY3cGi^ݫ#TPZRBWW=C! ٽ֓'I&t:)**B4*++Q7: #pMӆ˦iJBq9 xf?li,YY Pc渿# 20Iʼni%=ty8pRߧPyxQZmmDgiCSߧ1T 1c,pC[Dt0# G͎.gNtuMms)UYQsoVQlVLxgˬ9ښyƟh:8U6̴ȶp_fr* M?vhZǙp3i+=˜yWԄ͡VO un=3íIu5}jb.wz^Scr[Nkhy?w沤YwjZgNSe=un9CFGLkv*աeBQR+Jjy.~24}f /tSkxpzԗuߍ7=wrjP4c1RVZ׾*!%g/p ;q8F̈1i)sL.FDŽ?+b6BYiY9^L!jp!BXpB Baas&O SQzzzz=L)enNC,wfK^4xs3-Gu\n7%%LQOaaQfB4DK3ǎCu\.7E%%L1"F['ΈD"o>FK1Li)3f" ]`z Z>݋:R7gq~>2.U0h=[q:LIiy~55r~&Me-sHapd+;ngzL+q ;ȡaŪ՗r_ a̮pݩm@GکXtwN>pc"Tw.ÍjW>w*ʪo;#܆+)SYu~K;a45an-Y+(fY={w{Qnj!CLIieL &R:O>v ~cl<ё1qW88Hw?+s)dU.=#iOqdh; =J[!v}33FN<_wuvpfΚ͜ ]nr*o\oܺ㵧~'?ixwß?x5l?¿͟'lz9깈KSm:Byj3z1M77nS5~ }>ǼIˎg7FBK\5op 3f^1uyı1f`Icl6\q ^Zssß?. N CoK|-=h=£/}HBG_PG>uwZ s$ 9pՕ\?N7^s\`2?_?YHbnPRZY5.IyEvlˬbٴ_ˡO2ŞWג,Ƈ lB]UTlv\vI-P_=p؛,fnj9x/=#y 7}99- &XO&߯CׇݭIϼl2K_MiL>cǸj\rJJ`x<̪q%HdV=ӇҳnMBn[ӷ.AU ;3o2;[W/l;ŊP;?*1G!eQIس} 8CK'~|>3Dh4ass8p( cӫpkAB(45Ku)Q[grˣ?|օqj镬( q뷶fGSy添".f_[[\9 p8\|9kn煾Nͼ5CO]TraQb1x}/. 3i,=uܟæbgEQ\m9NOWO<9WS3gf>_qO#\Hu0[Y[z=( 6~D&a`Q'05;.es9t.X/m)a-"HP!Lw4M$6e4i/&:r*ܶl)N "ʹt׿d94w-=fUP[j4-G4I&l7p CGlQ>^zeê%sHh:$ %E.6x-;ݑJ LD9tjvwړp%D{ۉDʤJvSQKbIշ>ִ$9l3YEa5o\'p?'m|#G}-Lr;7Ϧ_MqZĚZ\G X^:C T35vi{'եٸ"G:C:NOf:E`=0lѨv}*cOO7e;4vrrU)ŒշWy*ƒ7?o2[ahm[Udr|SMLVW0͡yquf8!<umc̡ d0BH|͖ŧ/xo3< $PаZ" ׅiC.njq̶̨Z"a]ݼLŭ H& @7tT5Z p顸,RR ;;' M(vy)v}H%Aж TW3Q>r{ުg,!j-~}X\n+鼼/ik=Q|.XRIh8{t @ג)~T[Ms-f]a<d<ΣmYjHzqݜ8LIiv6XG0uڌ*(,-$AɭLJ>}~ S.Ͼ|yԫSpzS9t8N& -m>?GK1J*&܉D#:u %Yڋ%\9Ikq;6C!e&+<y&|Ӭ]j/RQmx|.n=LQ^V@ƺsyp;/~ x>ɉ)*)кE#?vӭK(N< x ^ FT3AaZή SQZC휥_zf(6?Mp9;pl(M/F1&p+O7jl=f#׫M68ޝ$Hbԃ\QRuf2t=aCo,_'k "^dA߽NEd_L 4ђqB~=3RXTL㴝l*sQt]cߞ](WdV'&qd4 kYxb]9{]c^GY9<6r\Q W-`}O˟89F~a6WWCdp|{#gx(*.xQNPYU9(awN0"sOSeܥzug7K1 ӆrlG"GPH3Kh$b1( jW^m?籇 r5̞V s7~ÔWb͒ɼڳ<\a+xtȑs5gLA7RAIBHt􅈆 5\x}> h;鶓oL&ٷw7j褣/L(@k#-GО /6D] A4IRWfQYSAii.*{eAM._\˳ip%O *7_sX`6~7=mila҂,3 ~9pve9|w!bf6~x?cD4 lF]̨Kx_|,* RH"%^fձqjc$FneIdhh8p]QTe=)fofyco:Iƣp?'?O<s||3FsW~i'bز,d1Z{S{9}DX8 {8vJKaϮ(ByEո˽cۛkjd2G(|_>?ފi&;#w8IMGK$HFQ,Xu3J忾ܜl#1'5pG"x σAe|j1uoگQ`Yc\AoOGap`bj&M!7/N$T+G%5j&1iԹ ]'0u\ Nƺyw[yXJ|NV4'-mٹLJgã*>|sL&@ AzAeuuwյlq-(رaRK df VQԕ8 mj+)+="+d䒓unb4{}T@@hp$ӣgq)Fz$ѤTZj9p/*{"f5-A-ZF%MQU$If'/)'_GPDfvTb.`4j0!HqJN66It(㦮fg^'zBYLlq6RIII=e'1-N^PrHIM#5-)@Qjkq9x[;[\$G·2]@o D)'NI IDAT]T,A hkm#&qF#q8 FcH9ܭr0>VZ;ф-.8ȉNcCU'[υr buw6dNǹgXݝ;cĈČc1bVLj}!2^o9(bE38?JYJ#GkmeeWv(9H8ђIt| XΛ8G9ƈ#)8#QUUp:ONtz*D1595 ;#F gdjkٷw7F+466vЭ_#F32pЫO?L/g鈢DKn|Zif·xnŽ|DgjDֽiB6Wjɇ0SLQU|.LAhNHq:TU3H2wwLߠN w_ň\43y S"?̳8#c|;mIY]tJ=Cr*h##__g翅3.W3Y9M_oHFf(:~EUhn*g7gᆎ?pW1o 6 _JَlW>P#*?w>^J*%ϲH$mU9gي[:)?gJ( gv(bT4Z޻n.zmhb Ω}UCo7 : 7uZ Vيz N#",r_ դàaKHB9>+@IVŞltd+ޛǻaa~w]F QoitLrϹ`c w짦CĪ_g:|# ƥq5WQ1vlzpZTUfٻϘ|]\ЯFIBQ"X[T7<$T:*`Pd^x?:%XعρC5Dd[B c.i;[ H=/lݼ@(BF^nŝQ@ՠ2ޟk6mEQUd&^}#SF;~}n6YSBUI*&@h%Uǜs띷-N+!I 5]yf<W7`OdܤKdpZʷksi2kM +}wu'heۺebj\ v*ʫ0_1Zw0[{ !?30SC:.rjIup:Yb}UL2q$-4msަH `IS~v5C*/g6v4j6@H&k~ۻQAӍlgII5"6浹oAnkt_9#-ɠNH $ ^Q/6!jut.ĭ7_CNr—R JP- vJ&QܻxmOF XϽ"8˫}C Fwl_aYq]/&57EQrB~vۃԸ#w!Yq??Q/,s9n.y$(|{= 5gos!c؈ad-cOY%^F ( z JWnlg|% +xR`Eعmv ig)k,Xc95;jfƵq OV/WسH|:ضv%=W1!' \ǎ8Fg v'O=0Ͽ<Ԅ/KV!^{fĜ|KKy#~r$$jL왴^gLEE).$1Yˋ^؉ǯJc?qT"a/zڐ㦐"}LRYk%4 [EIEա3+Nx*R20|yAkCyk>Js_`yX0QӻYLh8ŎӄJ}qꮩtN t%LY܏׎9Ah?A h0=Id6!2FwKgK-V0gkxoa@T Z {5B/q}Oa/ǿ5]S}M1EOrY7ctsOfF\~!bSSQxMH-_BJ.Ga@I S웬9pw|kO*RW+7z?W A ȂD5 ͆A#EA^"LJ|~'ux͈?;n΀x@ 񿹇5O~6zCŽd5L?8#)3I\ӛlS<'tߵ哳j{uӫ0#LIzj%Ng2~FrH\f!3j+;{v*zi4Ac8;7DŽI cDbGȪwu;;HQ<@DV9D$ڨ!Į-#-10vmO(>2L8 :L.Y$ ~ȦիM 'VV2qP^CMm黷QCxZSr}KZ%ΤG#ɬxWB^{Ff@'M mj\aw {|u)61f/\vrIȊKqEi àicYEǔWyii;: 0i;4"r+F#EQY`/2ԻDs>ʸڠ}(,Ʈf$?뜌C'Tn&ZUD^])ĤW=#g~u˖4TNnIP]WFM$+ g4!cl(溁ݑN].2v?(0ȇ>V.Ѕ_&Pz/H; /5ʕ8BˮT.y ڝǖc˺-\؏{'7 ( Elm-Q9m9iB49[!J$&!IV+%s"F@kKބ ދO?gcͿ|= (fi rMXѝdm.㖛bZ(mN<y=ퟨȑ0)=F/.sneWR{1dYh5"w:>~A־8c P‹8$d1{<;:uH 7ΆIY&!j(Y܍8 UH t5;c]AYQ ~L^pKwaEgxQݻϾφq6!_'~9JN)ꎲkA2z { /΂څ!ٗxCѤ[)Ϧ,n9>0#F`0;T0fϸq$!H$DSu%j\tDU#8ik[ ښDR0F>z{ϾYgػ%$97/|!ԇ}2X` d0n@,FE!2f*QA\g}zr!>w^=P(DDQhr47h(]9oMk<fIp~JvYOqYqSzA_ ߛxO)Mzaɋ]* }&]KHtDp$ }CŪjnSGTDoOڛ#/]bUUQ=A_6W#q} 4y:6lމ@.Y`qdMlD*v#;|mT>D3rM3y֦\_M'~c4{eWm^kkwa@$MtI|n>_ҪF^64=sѸQtFr (MD]M .dF98klS=x) i ϡ45ڵ;9_zwwS- #'$bKʨAx]=rrVs9hzwF/Is\_3AC,Q#S! p55Qy ӭ'7-C{"5ܷ%S_WK^ g5Ȯ:j@ KV&>z,߻"Q lr줼oK6o67{F֭Dheądѽw_.F;+fP,?@H2I3G'@KJrfx+ٚ2>y)XF/]?<@ DA QWYjIc𰡤[MLu'=Jcm-eeT&h5h8 a2v}-[w ƍ!l20*A>_[R<|vR-N[OY:a0-UU>ZIDЫW_p Ws3;K2c(p_`4OtCyLT.ɱ|Mn}2?q^}7x5)99(BU|m>: FpЭ[a,| !w>;;~r*p@߃tF:i8Z4 tGFfʩϯ FAt~1 l Ņځ`#NC~w8F?49}ob|K8ƈ߂fú5g(8?J3=z;'))(ƹVLj# 11F`ݚO  8$v$fc &Fۈ\fc|Čc_xNwF]98՝1bO3.kb6÷[hjn!"+RT.f1ǑWIofv)gVTWoe!zug ڎgJcm9t)=z{j:k*x/A=lY>^2~￾ӯgzKKx?%8~A^Ue{2׷!5}'Hc'hǏP-:Þ];ٽk{ViwPUdnWd`(Jg1qxLUӧ3sih׆W0%kާ,p8|-x F,+ʩ5U%LS.vTp$'QS]džoT~O3Kֲ I$Htz,qtMЁH[R$9ID1|Fmw*ADD e_僗eь6Q2[tޯ\r:iDDQD0ۉ3jxt*̙?chSv0Q$Dر}[[B0%[&Ƣi8‚h^L+QԂ .=eR^᭥[0Zh%F;ocT" Z⑷6spnĨGPmyL 6rfK65kz06&&sk(dJ[jxǸbh/Z[ȯXCQUUKv̼&vi5:TUh6Ojty7vHnKB^n'/MMD AYn{kUDexE {aiT5ĞݵLd2W^~5 s8o?73b^ IE$$ICVL6CXLahX<[ Z`/㏖\;9!4aY_Ǩ>y߲ޞsO=Cn-APw}/Vdϗ^7zv+1w ݉3ݶzW[BQ,l$ ҉;6z&a;>Yc~3"ACVR*:e4)>֭|U/7OBlfdq/'/yWY=Mvb##ߟz$l78: k'e ù~&3oSm$̻/?;g7p>hcX#>⦫&B`egZGjAow1jrn<$;rη5,ELl֭5;x82 G Ʉ: ըGܽnvE'3-HϰP-w[0z+7pMvJQdYQQT6* :J0 $Af#'ACBAd2fDC(1'=phK#>|*ݿleEAb贛qy_LZ N.-V=;cKNwl޼?& TUf)IM`V>]`( " ;7o흆d#ΤCgrw2st 4>dKc2֭aĕbO M5xoOwN@_GٲF%,T5h f$QKJV' Yy ٸu'$!D¬[)vh5HͥȅԖRc.=O' 9on&ZT0vn\| zfkEK\̦m[Xf=\DVN0R C,Xn$xi}{ʙvqyI`Vz}ױͨKƦ4 ˩o75 :FpNn8BVK+F7cG@%=3ODDVC(JEmu5KDI1}r!q2@ Ҏ}1$z. 5ā0ު pmXO)TFzV!!a99#HXcdg$<}#2Pcֱ2=kx_Cn">*Kܨs"+=ze׀4:LYy UPP8Wfbݞ$f䐓FzAhk'tM5S\-]3HO i5 ^w[UUHK"1t$[7B 8iliBi3c80# CDBQF!ȦG x2&k7\}.Cu;错AN>l f-;79/Kv<2SHCQ5C_ (rLFKD IV1[׉A> ?$c4jIO3aEAc]u᪢9_9=D$x͚ظ _z-.uԎH̟F$JܕocKϰ^ 'K>fKQr'wt`ψ8*lY<7I%<|]H a{8TSE 푉N+TQ@UBuOFDQD՚VeTb<]JcʴMiaא-dgS-\؝TCW)J$AD%@QP>M# ѥeh?Վ#>AU)I >%DNRDnUU[[)پw1i̘:$m\;6zU pf^/맒B͇PsD:*FbU@VysyPm/2QB$,qvPd]4S u!5qںz\uٲSZ/r7'fe,^͵7%$5ю̎eM2,+8B|?* D'(@mʱ9ß O6|̩I6SUO>zN[nz6>wpŃ)4yeq:).?q`r3I1&8g#z5˪9Vjj * JH@(袺uE$ЙLr@ 9*hW`L"z*4Ltfe\ۆ>g(y&-bVwY4C A7Ej_cUN*ޜK #^KU !hNӈB-˙-(C՛IRFiuӫz!k",@`VLQ-GRjESqEQ5⻑lƖE ]/r*tzcD!V  ċ9)Z>?:pɄ|k;@J8&$AKs wU2`H*xL#K'?TD]69&d&\3 $_fJϾ]kywy =/ شg1NH͂hs*zOK0|-Sm+naE! jH7V.aL׋x?葢c֣dM`NBg0`[(QŠILvFNM~ѩӏ r)thH׼lwW FIVև^=sJ(" y=A0Eos 8}fP@r%Ōjd,?.qee-7MaýOr9wc-w&dHK{@X׻|}GW0yxy> K>EMح|lܴa жTlW>]qO' s̘X#NoYǾQ}/xJ"j{8.Uِ쫪Y{vdX0GVDü D"$QD:aqT[yՅ'j=YM7-Of)y|]sڏ|;D#JO$ ^ .ƕ/@|J˪,,ճ)#Ad%:eEOJ(jrPECU9 AS^.d0Ghp: οd:?|"IV (L\rQ^|s!^6`FaB~뗾Ɗ6nI@Lx=IOꙿ[Zʗ<32oڰ\=>+ ,ڱR?c; uGi $g`}*^7N:k v;gs PM^;,: tEPU0IH}^]aT$A?K#~ #$g4qc2[HMM>~FlFg#nG~nJՄ"GhnHLIir G`u$`E"! CVfg;d܍̈́a@`2AcU%㦹C$ &9',CfVZQXC?BRZ:Uizp6!D„" it:\ 5Z$geai7r8و_ѐ=]A@RZTUpNhڿ5-xKK)"ֽ$ͳl &Iۃ5>LXzC#a?uMBavhٱYEjmCUDQdj:2P#a ђ=LEˍő@ޏTꪫTs;wVĽ3X=AE8"G㉳Y{] 4Z~DTm&Z{t6SIKkGr2Όr$FWڧ⌌cKK vlaZ[waV۾93303 r YĈ9ĜsV 3P$&p9q$ "?wo}]p1Cw>]UoWUz1=^tzqI q.C"b`9|M}a~[z sW=Xq+W?W7>Q4זzJ< $3E?yrm)'gx>yI$wQαȨ?MXU"`\1~s+u= ӽ LΟʋQP@f,s2f[Ť[/)փ}gЧgwvLh-|K ϼCKV6}eS xj w#3+nsӳz@HN ,;#&/+Ytݟ;xumg >yvwa蒕En~ *^|?r7KVٹy 9E; 9q6FvNY9 ;/ ΨOs[ `pN4>#H<+֦:k:$I~g9Lto+;6'+cnG3xQ~aCw}r^`"[I0X70a)ڌn' lQNsqiѥKg7|MUnw\Jvoc`zeFtDZN6%[O^G̲U VS,3o6ӣ4V,g&Y̸w2֬ՎE$ ToqL⹳xq\<4bGy%+8gzeųy79;RT(< &$ML^&ە~|Ń>cs_3^_@f~\wi_nE_q{E 3}^ T\W#xL҈6?U멪BHmP"n& IDAT/‹q#7 >ޮ=6 ]%WLz]&C4 r쫰1闕|3 ވ,KhoAfsSli̝M;t LeY=v0b~vz½GDH$\v%D&gq #Hjw|,\Z|?[!Y,KtF />y?L]f|Iq qn~\MUl\ŠzD$v,K{&]u=1 r?,8:ivx$F'F# &B"͞=g.G{É0E_ז1xjubzTx{\uG4Əe㮠d&<63Q!h=ƽwB#G\g]cu .wҟ~exIV@N?fήD(߅wu\|]rov4&IDSkQUM0Gc064E32cί,\FweOY[z&"T]7= zNj1bϽL:wxߙtHbD FOQqHћbMK#\[GqK3vm;Ku6eJ&Š@ # 4ϑ\ D*;!ᥣɝ/~Ǧ&'YI>@d u# Pg .14cBtg~DYkWr^zFO3籟WoIA! 62a0.0ZלKD.<NςBam~1 vHL6yAvxN߯\K$`p_Ikڵe9 Deْ,Y{[.O0IT羼gtKŋ< 7YQǝWG!HME=12*]Б#bپ #ڙ0:VRRS) G|eLʉeao]^N8 1fdIC!4j2͙|jN7:EA(nKU1NGZ~wz ;VsP2ua7it[q`,mǡX섾 >~>^Atƒ b)X7Y]h})+L2q֯dn\â-HVt$Gjmus[,:x܀$O]NEmFEVsئGr:)/3_ ,N>t ׷;CGVF IQ&T;in8C!Rbywi} Y 1QU. 6MmiOw5\:\:uѴ)@zq{1ރfkI9K8XJqtAN^??/ן}[+Ňr-^~IF=@tUU}~7P=.AU=ft:1Q"2"Xm^8R%_~-y=8mVPtLG}`2q8r1#9+4SF.ȫm͕[UJ\P$ĄcWLx$_nvSgqLX; mBhHz zN;bۺe<8I=X`Q`z,pFNQgk=6s/o2>D$P}{k,Ih^*L`h>9v& 7wd 6$IBdct!@a $47a PRx&'I!z : zx::ºKXp'%ԌݙGlز Bԥvz$IBd$7!I!hƒ晗~۟@`sߐe NwW@pWdB㑱S]WD;k/k.~t@ ᦩCMF&0[ EIn,#w*t,!I͆[#;LЋxk xq$=!AaU7]KJg ~b޳m[,Vo܎&>r؎6BۋT6[Ͼ \^& ׅAd 79SKȱIBŇijfel:5YFWP=FJP5/E{E+ESG14A] AN̎uurh7Wb49ЅƓEQ ߬\,=PYUɦ5Xt=1)uC"+=(eVn^JuR^ "U$Eh1ckipjjihjsn8mh))=ֳMwzfR@2V'r?;.R0Y:`i'c%%L0鷰7hP5x=nc7^U҄IAۋ Aljji9Dr6lQUVJII)T԰{~cH$ B'M$ 4YXk,ڰVk[\ȲIQinņ5Xf+M-vWB;{UAݍtFVl,[s_)ihd,vf嶽7"4s-),u)ei Ǎ!~MӐrR'?wm'TTVVvB߶fFeE凉?iI̧[naDF\BzE\D nSp4})7v:H̠w,$%ѩf@ph8]r8/)qv;ЫOo0Gl&)5 $:)" >pHdz|.=NM^dfu&$0">z, tыܬ%ZNɣI ?e7_3&@߽+ S.$#)"c,X^% ƌ?;'Kp4靈 Ǡ$u .}K.dEO`df#PD)-uCwi fRIKh0鉌Mb9c2<j%8:gEBes"3fS3=f8iqH2 tt?U̼r2h[uFRлI1Ȁ$C&}&&ЌDxd!f#2 C*i)I'PMDh׮jHMb!w#{ۅ%4^FBhT"Fʫ.%>Єav@QUZqxeEldeӿ_/Bp;voZ !-=[S#6K>э.ӋPN;1?k0!ny[0XB霑ARB,fDXx$=2/1!%RɌEAN~Gt28C"MHhJ;ND$X,d|rK![B%%;sI6FG`km_:Z][wИ5RF>=!'/?~@PUYIIbRz;WĂo>ggiI(C eI?aH Ʈ-kXc?q}VC|$Btx\؛bw?~8#,#=Ƀӡ( z%0h kS\^qbѩK_lڴ:u&?;Ub!{6.gہJ=gJ㌃?~/ݝǏǏ?~Ǐ?~Ǐ?pF8\N')E$tzf?~7pF۶R_W=cQdDZzgR:v`8~l?~O;z2b3r, woAfAO.Aɾm<\Of$m(ܳjdu=*ghHKMS*9P[y&D$,WQQEx*zYyD31 *J9p4:&ķ+rX9wͪل}jAUA9?( h>EƧ))ӿe+}K/_J?6q=pԵ 8us|%Uv"N[Ͼ>۲8m#p}|{oſF3Be?xJOj'h.erϣOڧ@Esfc!!~]Rowxȿ!~7\G`s{ӽ<@`<4v/j7g!'NkF'‚8}e*{v:,ԗ N2"XC$,F,c *7`+t CO^MQW0u&nV wr.тO8Ԉt]/s7 ita!׋!PuAo" 8),c6ЩS*r_$ A3y: z@6'$a6|KE%p>y%˘|fK`(=:IHO0 'u;ٻ} ?ؔtDT;Ct!eʍ5Y1Z%(Čw&jkblyV7hKb#Ɗ|Ʈ =ٻqv79yDe$IhoB+ˢVh ?<:'@qYٷs+k7jGzԜJz{ NZm,C1i~]C%^08s RXG7^ab;vfAt9bwM:b.Q)LHekblضӍN~=I GBeVm=Da}ٽf3vãp$"$`@K jW%(wҷwox1tPOF˶f!1,'ds:Ұnv^yXn+]XQ5 .6CI(L&$TUczF]qF'$A`IX; y-QL giq }?$ɲ省Bv|ٵZ?ի3ȌH0N&k):_36n^_}ʸ]ݷ/bBWef L}h:qԗuODe IkC=RH]?3?" ʎͻ8{<hD<>}Ŕ䞛[yGr""6nGC1i⇯?ﶒSЃsV"WYSucdW5t;{UM ԗK~a#3ؽ^ql\>[1Q`I;} %sA'Jv\UAғ1xoܡ?5!>D x5ziȴ/}!M6[-cJ.>o;IGz<*vnV %*,Òedg$,^ǓO®P@"4,fs ;^K`<.|nUR8ys_dy7qL.u#fwbmlq>UI/`L0%{OFM@mˌ2Njz5re'^]P٩,wKOE?}gENn.] z') SGNnWsr!k>GVmRfrQt{y 6<4Ui}de5.Ydeе{]t5_W;YFPQo8KnMal.;ߟCMq4Ԗ7^y?RhS)]EqD.i*+Bc?>o/u3~]ua[x LV v;Ax$I!4Ѯe彧o~D2ЭW±Wu6xh:sq-Tdw dYh:4N$IjTYQןHn|C"Ac} Ƹ \8@6^Ĝ-7` .,)?OOa k$Dbmb۶m̃lWfξ|*`+xyQ}Z^-Kr1L1JHB^4HPCЌ)6՘bpŽwY;c%aؼ1uuy5ggwoys? ~# BO EQHDAM81i^;b~DR? j Q[ЬvDmF_Kp~ǰDA@UTQ52rh*ȤͰixS(먪iN>hLׁn#bA `4 TEAQUNAȲ$ HLjnOADUcDc*łn ` )[S*4T5F,k dfba*Qb1͊A$Ɨm>JsSLf)g32N38/ Av^}m5\sߐ.jJۦ |ڋ2x.UjgYWr8/pʼ[cz8hJHL4MDQn(Mf]{޴t@rڹ<; ,V;7GЈDbh}KD)H`(X%]7:-^EV 5C L$h?H=>.bEs C' aw)HV+65)ijxr8Pέ/"V lI7Cr w< }KjRf=Ə;i9TTMm =_3i8W0qf㏪BkAGs5:*FToeGx[>׬^ǫ;&O`ٗѬjtob*WTRQ9>Ͽ`LA`gL0n1TƎٗ+\o)a tvmu<;]OUKA2̋왤x=7i|^0 tSfb ueԈJGb7ձ0Y6qN?~,7?-0ش 9m#FW1b(WT0xfJj7-{U=̚4QUcO~ಁ鑿1stƌEW 7rgp?dY}+M"ܲ[o'Mdጙz sE5Lz:qsl鎛&GsɣhEyG%v8ƎSb4\o_p{:#FP^QA*;\{t|"zO;15n2Qjں0HuTvzw'>iBCn_d J؝Nڛv轷k77dX% ]7D Ie'O{+3.__w59> ^ugR?;[f#[lxcG2Ә58b-;+tJqrȼ;o-^sΞ:yibaoID*G@#ֆS*O\z}B⣴^ ]nJ8ҰM;>V=b#FϨ45>xn]8Gv+>M Ge7CwKO<9i81\p1h!]>%ouωjK4vl[~/H₁nAEZwe{OVf_<)bX${R$9ejVس X5s6%n|m'&mnw0sY#q;iYU?Ɵ*lMVtxF->iSQ*膁/XLeقyFp#Ev. --t蔩=YCQE5P(6 c4 ,r|5O $ {B{ _f*똆h rE50lf|QP0zMLt R/ R.gˠi } q6I/ |/" "$PSA M):YDY8mhj-I&`htߑEӌ bi P{ ޒ-XrSEt$rd ~wY7ttTSYViE ݳvqig2{UttM'ۙJ(H 'gʳYѻ^cws9>T~u3܅e")+}0?8m)ΆN };o%ڂ f#H{#JNλ'l ?ng!vlۆ@C)"1 EU QQ6Ɯ-Drr2yY)45@Ng:#d0|T,?Ցv1 )=#o=.E @ BQE +# EC >ze+ٸ~.꧜5iarIgy?rxNZ]SfaQ/OTӓZJMPT%&o2㧝yjq ^-u{k"Kf$jfX$޸8vc1V4%=a%&īa޹P^1ܼ5kzV:At@%\dBU,_ITb`wPd'Q@ٹm3" `wz^UEY~6;V-b:Ɲ6RhǟKgԘ~y;{fDה(cͦ]1BrFe!bs Vm3$7 A,ZV\I#N/5y$N:tb5fϮmlܲ0&CJ: 9{•Eo/"w2d` 6MYz+ECHIMjZ;L-|z)eTXt%uzv'%5b.Ԩ51M*Q~ 1ong͊OCd̪2VtWR*N!lZt7dd A8-aNjVیFNFMe%)3 W\̺ZjYv=h,)4 b.V~!ݢ'ሏ;v|Z2Ɣ&8:8664iz ]R$AFVrH |#9,q4VZQzFCE\n7Yݞ~ $HMzXt=%B|UCQ&H 7Zޭa` $T.A !! $H qL A~Hc CB$H A $臄8&H A?$1A !! $H}0AcMhP H$%5<^ow.< HcC׮FuSRH%#IihGQ PZñooc0 l 2tٹyxp\H7PE 47cV:;ک1$o[Db Aظ~=[6o`)b}_MhgX,FWNxrDıag<juQ2j\{%&g&<{ (H:Nf&ԉrե*v8(7%H |BϘI~aѡ3Mn}k>y ^,'z1t]xVӈ)(6'L$7g ]aޚ[1D#8񄩔g-{x7Xf3FzN!SfĤwV+ Mu{[9+9iqx /?z'q[ ktw`Ba^!?{v+"lRD,}E^}MZ, hcCYb9#fZ?MbIl߶wo}b:5y汧XŸO`Jj6,晗米+AKv~qVS5xfNM,yC9H+>Qsq⸡وfdīfSu Y)8-_4xSc!ڰ3/ ӆ #)3lUMANnY~2s~fV` Oe5C0/;"( ( "$!2&Ӎ*cD@@e'6f_y6>g\.^9XƟd7-wIfOϥr7T=Ο}ǿIEV)R~cppORF73ټNJieɇ?;B_/~;nL]pWOǧ#̼W^ o3/oɊ]U `Ţظe60"\>w=8!ǟ_/9.B {aٲi#"GN `55{4eVp}l",;k8)*.axDUvFqg8*&i:ݎ!SF8^&⧹3V{:Է]-`sFӊIaLw܁iuibNqpح21 \/.57Ѹ AqVmG&f b0e0f_FARz?ٴD@#5\O*k5v^; tO]1qX%6S.%?)Pׇn'  5"ӛحaW\4x(ʡݔ  "`zޛa  3ꥷmol8Lc5U?^/@RVeC(ε 6-^dQMtz Y6F150U}a(1DT%/a& :D1t#.j$B,`ˊc J4',܎ ~zݯpd&=}]-t \sM\tdWN淿5sϖObV;;,Ӏ&ٽ?9NQUjT"Y$Ba#/ﻦÂ"!.jJ4J$uڇdqqʨ1S!qhH$f"^3Nr B^ w1% wtp$GAq iBL3?GIhO F `<8$šxVN$dg&i 6?\},^Sۋ"&Õ(&6\y O<|NN4 )GňQGCOilhx@i|A+P{7o*Gt0e["6䞸(F4FUű#HLQhdƠH~AeW6.U3P5h(Oð/UC[UShA/5K!䙻{$9]tMI]y 6Դ€jj/ƭYSedL,f-94KQcH$5-͛6B@͛@/8Ev0|,[Xl;`t c'0(w7m٧"s錫("(6IX}w!t В_`N=xS^x~9i^Z[axɣ#}ZDz%Z fOE&53IS&a,~vtLu&W[jd2ly?j>0i޽O+lwQ2x ˟%؝$jdb\C;z$>k\6-(0! T7u&EL|Rg K m(Ɣ ٳ#^g1~@6ff\OGwÌR=T-Y:X #4K $R51[sPq~ |h];wRWI$%FvnOR2e|S ȴHa!>}>+ՒhDi3d(Anz~1i,A(৩4M#)9|>_B|FemvviVB s^#AJ4% k.t%AV׋j"T=|{VcG A4;mfnEaaKg:7N"! {wrR<^/%HD,A0gOncȰr\C?KB$8abR6_˩g"'ł(lu3M 3ݰş|j4ԴCNI㨋kWE[AX,X,\jUG 4Yx1559p/d)?0 tM,tHihH~}oG AHqQG`W ??}]E )Yr΅\qyWޗ8,s'8\vlg˖rֹμvY55XMko $AzT*vM e ΝώVe SOfl} :w^`ن(/-)3OUx퇖wzRyV?g%*8Yg%ncڵ,~|8~iP~1/Z̕/gkRa 1W¹=b(׬fp{<""Les),.!;'B<R.|܆|^yP> $mPݵg~3\|bwz9s@p6# `<ktN:b oѐ=c,CA%q4X>{a1ϸ_=`H IDATPxo ufc6 um- 4",(mfp݌70Q~\6StbcwXii$AKSuǰ;Z_[nQE(Ju.`m N=$K2JW]DTKϘz ?^JcP_U``҄tlV~.IIq λ2Feƿڹ'Mf5R ;nah6)n;=il8xο˒ &颓[vɇ5/3 =.8c8 :H#99첁Lr|QBn܇Zhoq6 Ȳ/]`c&!&k" `*f"Y}l$Y{DuzKuxEpE@d%6Qj"Յ" p0hS)9B k sN,K퀡!<(=Ջ!:`@DE"ECsdޟ45V}&O> ۩E 7`@h ?fSS r2d̤I Pi#U/כDkk3-MTL%0U%a׾4\#^  )i}(Zjn MC4Q:`A,X$Ci<}mx[A"bH`h{=LDU 9*^vR6wLI}bBaE-0q8*_4B& ~$]k㹧_p„1d%aƶDƛXj͍5lysxojT⹿icZ{:wQ11q{tt+knjfxpش"HMKQ- ۊCcFF\l=E@]<6}*łn!R|.M >GZIJ/~GEӹܩ,_Ams6s:`h4HKP!H:r"CGND;o牷>`Wd#97Eaq/qtvuPWG_CFس{nGcCYq:hh @@n4\fPil9@rhoS!, ˆ H ,+;ٶҊ\$ fzܾ43_8bs9K6Ɠۨ('#M,Ŏ[ظSι1q,x%}/sfQbwxÝͼdPHTPg]aMu(l20o?"9ǗcE01E(x~ђBvjVU*xy]*a.zwQTVЁ%fvշbELHL4zrUk&ť%xu_7#tnDKS#.$hj{Ht cѣY-ϝ2e4#/&('QVK0:7 I0NbXXlxs^FZGptfja.9nPZYŀ+Xs؂V%t[+'>{(#x29̜wYȒi6cΠbUǟ/;9uZH8d؉p^4t1ݮm zEUbJΐ鳙4l>{GJV?QECW$qٕ?rnf>XGVj]hmbˉ$h(K! z6U|̼ocՋ>|78'fI~A׭!#3 Cg؝N !Yl h9On_$8}pt`nbd̞9$S0p$>\ӏ"ؓҙ6x!u2;w>٬H 8Ǎq]8{sںAed狄5F0 b!5+}KCZiEaV:ViToN[wݫs$pӑD~A>su5L:2ii[} P@&"1؝y\=Uw젭+a= $o l޸LNv `ú5RPTLA_mZ4Mb mm"1Dn/)8־XٝBAv|Q$ 򐚚n'h*m-tC膉l:x#mqL޵L2~A  ~j:::Σl@nw_38&Hpt]gjjCǠ!C΍bNg{+;mCfN.%%x0~Ic_i477S]]MDQ,CRr2I2<0it  =J$1AC4M~?--4UEEN'V|4MEm۶P_GGuVɩ)3h<obak&! t] FAQDf 47S^Yɠ!p8,8&H5:u5[4Ǝs&{{>>'=8]*dq{)4W['FCK')9$TRMn 9>Rٳc+ƀ%4hnjb0z̸CJ0Wb1ޚ:IbqSۿ#H4w|չ].ٖ{ƅ %R!=ߴ^~{CB8;q޻Vc%ٖm0ĀIz /;gf9s3gy>zzz H8\nRR[Ov9] ;H$*$asHIIiʣDbp؇-6SSIt;Z;7'p`7^yY:0%4EFVTKCq8[_'~| Uc>!:7<7\[?dm9_8Põ5$%'0fW_z#TM zܲ.`D.^)%UGw?Vo#Uдj;t,R@dW5n fr%&/2v?]yrRFlokf{9|haPd`xǧ x;8t`7Cg"d] d7ز8q&i}=xXtp3a٨5-6RXTJajvںmdLE_{7m 1)+]NDE\I_dl&ѠwyzRY\=(o'Ϙɕ^HE^2 1\|%b#Z&T>k $lDUc4EA$@Skٴ?KmUPd$:i>Gܓx0s.Y|e^L t6a۶8 '3{T\&5ױ@#S̠ao ~}cضa_US1,Nb)$l~*{nbc)IKK'Cn;wCTQ0,WLcɼi%pu/+ʦ1&iL\|Cq΍-G| ɩ8.Z[R5#f;Sg7+I6DASSEEq$͔N[@XG@"*mFuLECu\05Iϲ up-]KQήVZqN0MFZzpfb} 'T$=+B_W+}~K?>sJ"#~T]ңETDd>/74)_]i}+Lqy.ĎןȴK1 #с˕J0cWxŝefjkb\śC 舌%ȺȤBp5 r1ӏ=#O`O$-NOk#Q{667r9Jȓ{sx,.\0@Z?wX4cxOOw"xqNF5{{XliB&p8h+HX2t! =2Lu :F22Hr'VuUNP#><u Ȣ$hEiI_oባ(ڨ>3do>Jav.RT U-)3())^#V jA٬X'։񄠤&hd!(!,,E}FZVƟ׼L FԷřJI;ǟ>ɄP{0~7^r)+"@ey#[wobO?,7X~%T\Y{︍ɩ)eQB#4mo#YEQ%};;T?0ؓHv:Ϭ V.U}@AK E !7 Մj$Y^sNrJ*-͍476[IxEi4mN(nwL,rVhF8$P o7>:hhPE EFeW^MGS޵[%gh5a6A P/ tٕzXn *s U_=v"k_?|i>o&ɉ-a\yyF'JXc`$ ?FX^8< `p45QRZ^#m$ze8<6ʲu<78lgC4}gi*^sDQG%&UzaմS:Q` LRϮX1IRK2 _׭77*L#&k!ygy hrd&gマ/~!"3uLVf/ǃ?{o|kXqsR PXAU18|e6/E#c`Du)QA 1#IR%ˉd&WOCbA<~;Yh>k־}cGU7^okSzDȊJ4BZ,Ok`F#C`?O9kt=vcsh>z{INywTUP(4GCcmNgcGy?1r1NmկAؙIY^66CLz?>NR2#7&,p=+rUar6^{x̫5ie3 ɼ/(6*˦0b;`ۛkQU5;Gn|:|~q-|G˗a2ȫDΤ*i*SJ._~V?ď~-F7]

Cj>kEi;_䗲rdl'nmT**|rJn4MϜsI0 N(8־H!c3izkqlt`¹s0Z2800߿UFPM9GYG$IbQ1ƻ-Zc-Fq@ "muO?^:]5[$s O곟=~sD;ܘZ^~o|cff&8)ѣGvS,%RqAsaB Sb@eY! ٙBig^WBޘ;"h "M)͌B8 RНC%XkJ)s9Zܛo^IiZP(}}37)I|/V2|̷M@~'~nfچaeZQ׿o~s~~k4jbѡqwu0TޣfQ Ƙ4K ZBRYyBrƈq ߵ\zMMM]x?G5 ڔQM;1F,3A %I]'!9"Blu{mci韼7F1 |#ÜK)9Zqn)x~BoSN4M T)jFy+Wfz.Ye@5δOQȅtjm(% @t]par|!,-(s33WzzEh1Ƣ? hѢXijm;C&DB 3?W..lȟ?#c{\VN3Ɯ5N p's9:BBHu3F'Nx{S,QkziiիKK`TBz1ƥ k]Z80*֠3ZRquPba~aǎv../jA>ǣGu.˲4B$Y)0&0 L.^_: /v[u$@PrG{O|}{htt1:D)`~i]NϣwRDsj /WgfvQk/r;{{0U Ras+!LZ,MzͭΜPiިTEB;(03ocLt;?,8%\[I$o\8wHEιVE)Da?㓓癃12( Uwjg`-J}}RJ,k4_ןzꩥ%fqc 4pG**;9SD[tQ8g{njb瞝S{땱Q**6 *19918 uI;m˗.]qmZ:D¸ȌR}=#'岐L(*!k w%ѻ^BG}>c|(@eZk?ӧ}&IRJBP ˅}{)t94N;BPJ鈯"r8͇ݪfƍ扣g/NNn Hd3\Ji-RBPF)Muy}իnZqVs !Ekdp622я\. ALJ4m 09焠ޮs)֞}ٿ_={k5gι|>ڹs]v垞:%Hɵ5sqx .^x='Էqc;w5sqj^9k-JRB19PJYko̬mV*+fc; O}S';vtYiBRZc:N?#60YE2Ju+++7_y٫f9e "rNVP&9s|lP)n6Gꛛs B ^\Yj6:082ldZ3)f9UoZF6wcaaiqkkK[èZ 1&ヌz  cGSa9"u@᝗hRF)l%J)%δQYff>9~yi)"R.0~$&MO)sH<7cs0# ՙm笵\5'\;+$Gյ7ϟ{W|Zn7 !Pc ΡeRFi.Q>*JCC>D1I) ð9II8MӍJZT*Ylnn6ͭ1Fmz8BisǏ?=::4\%: t \x眳@SFD]Y<,Nꎿm:}oLkMr.8ظp-BEDƘ6RSZJKBX,z{{R!r9()M)f(cJ[t̚[ͭj}}}}ccl5ۭZV7hCDJytl=<#Nٝi)8R31F(O2p{6sH~+ H)G=pDtΝ;w;l,wg a`J%"*28ΌM$FBZ眃N4u.1srrЧv#WzH5 "q|>[Icǎ=ztzzzjj^%λܹ{<;@DDښtҥ/g?[\\Pc 1qPJk-%Ykё NYZJ3^9IPJ E ;vĉ@J(ZkCv蜳2Ƙ1/\p׮][]]ڪjFCp!T*i{{JiB\>xp-)Zk ޤܡ{/<{g>u*%'hmsΜy}aaac}s}}ٌ}q_eVPaͲf( !s1bq``T* 8pѣ1ɢ~)/_{ νUN$cWTn߾ZT._vVi2c:ZҞr<22200]*JREN鮗($I") =b[_{/< ݫiD$C?Kc}see퍕7o-.//6$IqΝCO0 o\.n)@d c'! oe/A'&MIENDB`fotocx/images/find-dups.png0000664000175000017500000013522715247006660014706 0ustar micomicoPNG  IHDRa8tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 250 392 1 0 z|eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:394 height:292|fotoxx-23.70: Sharpen: median diff 2 15 15|fotoxx-23.70: paste area|fotoxx-23.70: Crop: width:392 height:250|fotocx-26.6: Rescale: width:353 height:225|fP IDATxu\Uc±iP ETl lDR ̼z>^`DgyùX{^{_F]]QVV xuׁwp|t.xeu^`~$@@II PXX햇΁ay|Y윕Gy:?<OWTx>c}rss #--;BNN1K/??Kf333r1(~jں,uf:Ug<]9R^o. D 4 :<g鶕7++g{X fo+_!0ca"1& ?yH/q)R#qGLv!|GȀ@1lUu b3n듕YʭcÞePe鴕_ufyCJ_T U3?kGbng+jii_*b3dSZCQF}J%%B%KKgP#S~مE-毿ʂAS %k2,ϭ3t:: f7bX3E~%%%HKKs(࢏?3C{gq+{[=NB[gt)#WLKĖc!'#JPSS6 -qɟl=9]Ka~*+ #x Ƥ|̀QXL = qf,F,IcƆ#(d%HNŋ9(%eD>T4NSԢAOB~QLuy0ע(ASg塴JK x>tEprNKw/|}Ԍ,o d57}i)ГbZI."*\݅Y%7]tŀp#!*;3  m/B¸&!80Ԟ,t՗!9>~TvT?@DDǣ̘Ufz2H~~\Y9Ix;j`e&qS}9dP)uj&;*oxt׶KIX~ͯ150`C ?hkt]]]ڵ Xd Ց^Z<6-ÕUUU S\)sIxt L #!9YK@\JGL¹{[ܐV~V0=uH@EMƏ!|y7cT9bͤaD Ϡ2wŽc {K` i(BF[~1*c촅Ũ,³ޱ-:a3Ȩ %L4у$Nt< SQ띹G2kwE 5r(r R('#M 5iu$%7CG=V \@|#S~J5`" )hGr*t 9(f%Z ݺvvA#9 54@]BGME !!A.-:ĥ0i΅TZRgZ=T!FKaLXːۖc<닮ݺ.`2k=Ze l/KA9d?t&Y aaycٲeB!)+l2.44K.ӧǏsnM6q屲jQr1vW7p%8qfc09ҹ;Lg.CY)vBWI41֮^aTOD g+*,rx=}u9Ch XyE6!,0 3я, a8<\%^O #QMн/ދ\ܻ 겢T%+dlj?+p TU 3Mqtk_BuT!^W0 ۿ(`qP׀ŲMIBun#ͰtB̜8 @8z% il ,-Ó(zqbT61I6J@L^ pvŸ63_`M5rAAM{0gͅxSBXw.YJ] 3HӦ0DО9ˊ!ڷ7u1b6,L Xe 0uYQصj*$ECMoƚOìƔ$DUpŇڳ1INy gb%0nD& ]0~Ʉ\#??- , ,Opݺ&+d 62KҚ,a5h>FDlaJt{0.,k@:!3n(|OWC8 LBJFb6sCKk TS]bƫ(!kq|i4\. K`0P :Fk|=]Fq o=O"Dd}j{Qt QH !)/<&Yp2vy rq;$Fe;O 53/ ==P2nq( %!+.#6 D417]G!ts eԇNgAXT|ngPy!**QNI%c wTԲ];,?W`Xv 6ƜQPwRJ3RYjTQV`Axx,X6nu 1rHʫcH}/T%ꀊ 2R4:bӈ4p4|5/_ [cuؼy#6[Nm\՛'ٹ u CoiB~=P+[6 B $9HAM'ƪ6~BvQkxK˃ DWDaev3Ыg/ҋl0P\\M#*>%('Pf 7@8ՕH9U 8L`c % Uא&>#J3k U1ɧ4E{1VG f4J{,.`UZ'\*o0lQ¡^R&kkj .)~e)lCh>1G?wL!BjZF|E{)Yv0h# \hO욢 rzyx2Lː)9>X1ljyoǁ4 3GrQQDCၩ 9E< acpnAonH?[( $$ާa&WiMɉ媎!4=bM6X%9~h0` /B&XYt ER'TEhIa eX/U{IB!Ztvxyy 00зv/ \|tW5izi|.+pz!#UHVSg{l'|uHHy‚͸wc0bYi" g:fy&4H3AYg;1:a>aD}F/NX̓,D$Ukb<.5Ā- ]Ymd5Jb8 Gw9q .9"5Ճ OhD Yא\Rk{i[L)?N8byw< CTqqyb#p8ᒊRD^J*01_3<{Xz7J*QC=nax0?\iI9ߨVٚS ?ty@wf>w m7 _=I?DdT`s]rdCG &@89,WtϿsQl{|&pi24eAl<zPdfEnkʔ<513ѽ[7M("٫D-E!TKvj\f/6Ywr+$#{FTN ;^n117@E::@QIhNn"74duAޢz^w0|@_D&`*E+'WI(MsO\1 R-Bl,:A{Âm{^Nn[0E hoIex^7 R ht~q;6cLkWQM)A  5sQ( = O?CAwnl5k]H?P$Yk5:~w %,h,X #,M 䭁V#$3x CYOoQ@v!`{ZHffl 3 b![{dY;z{444031Ť*\^ )g)ža׆7j7h6fMpc#c(,Z/ YZ/̵Ѩ̸pl  3N]Ze)N#:Ȣ?^-?]PZ[7spp4=e (Mln1JDm6N={DZ*/}vڭuCfU6& J Fk7ZؘY9لdž5=:Oqǰ2Y%,o~bB^o Э .ƶvK <3-rtBZ؅\&l&f܎ܯ*kbDVak~A}930Kc:V>Vϵ@V17s`/ks+p]۷bmߋe{^N&o_6޽;7 <3o#.t|h%206Z V Df ~IYz,]>˧:f3'Y,W:Y۪3o w6oLc˽Ā,EGv,߶@mgX,vo[e{,O3af=I^ߞLy!<;PUY%|mu0a uׁ(VߞUDGG/^xu+?bǫ=?^:W/?^ׁ?x:oyt˝/xݱp%->qɉG<aᨤ\NBOY]M:jd[3to_7ZZ$ÝމtvvX$k >ϼ ?/ɱ3# - IDATOPx` jIxL,R+3 xި@'@AECYxH<|'GG<|YyY{}8ܹr)> x##' >puuETB$Qڬ\]dT2  KǨBT^`m< E-bDrOEWH-jh_AMR7F&r(_ LZk|rz5zu ܷ#ڪ2$Ą[Cxr3 (ɘ8e L`Xo,4tteUM,߶Y`햙ǟEs0v9L uUe\Є|Uӻ0P/s0y968unhq-( 0:j ~GTˡ0vHhP/FX*ա-NMP] _2 Jʔh*@Qs(;>I PR0?&XukzLZUo:zAI>x*J}=h?=8Y ai|j[8 X "r~Ő7݅gu5ep}D=Taa8 >QDME'[5(KpŴژd}y(@&pk,fTPǶc^س|TQ|ʋCIBBpL< vꅼFkJJyï_ k_[PϠPB8\/gPI.} h$Q.hp'cxuh !eH䕸ldff!39*5h$\OF~n&.2Vy#[-3p θ{?uY; (6d9ۿ2R*Vv/5 axZPAuGAaoNd$aTdM{i_⳹_:W&&!FUnBYB ^,!,@z?'KO[0u0dMGt~BMԀ0:w1ɩHKMG hBFc6*YH_h4޴:v<ۄȽ;k2U<>T|rh(KGcбpK6A!nڭ< $+ ~ *A N$ZpeIE`h'rkAʨ[!=2z!jImC~^!' Gm=л$&;"-m(tՁRԣt8u"yJrdh1/}=>d&ǵ\k_ky08+>[7 #*ɫoBY# &ħ#]SFhb؊-` nz@mc'c^a×[x&m=0:@NJq3w8\XvgM.&υW>Z\:-& M--hiiBKU=_*#9B=ĈM9ф;76w(i%.>w̌  s'̌e0 k8pƮ3+P)!>4Pݔ$cԐ ZU [/솂h/):${b,fZ %gՕ74,\/RPI׷GIpvCK"`pU,=²zŁy*mű{.vxvX8srQQA BV"7"h ¯KI97M{I\q& 19SeJnlOs: Jz#qSl9Vl皷gg۬ kߟڄt6Է'C{O'ޛh_߰~=tphHyg%WMJғR޼u Ǐϛ8}ZZsB*f=ᓢ#}%\^05`#XmQ ߸YRm$ι=x_2TVٓx#>&: PNtDAZ("8|5m Iǭ;.;mEpLіΘBXzΒ|"dAD2f \OQ>A } ¯}2XYCuBݦ 0AjSВpKSЗ 6!494vC:Z6y"{4s0xWNC>qF9Qҳ$g4!1ndYqߞ bҢ x:\PHZYA:l7MEoZ2b.]=k-1H]Fc:^" )bipc~Tʟ ٴX#;4np5~$,N'R#aQŢ>_K FY.Ata6o\<<;uƨ%^|omB5TrV&d̄.9`㐄7񤍍\/(ŦSo` 䦗 Zmmᚵ%&̜ ߴ4bf.(oeFN,536" ϡ8eFbц-H.+Ck3^({v# u LZܴ,>ªA]]Zc>Pc]볆&GpIU߸afF D=N7iysd+XҢpx 7 Pز(L!k9Ir9Ka)Xo `M@b/{?ҖqѾ0季)385u{1Wgo}InX8u4>G~ɩ8;ф-4Yoi.D޿ Ppr+y9M߹1zŦS\v`2kME܊9 M\Qgbchء?#iq!X5s4Vދ䒖mtr 4m@ ,\:s Yv8ؑJKs0hfLHQ`~{^5-`/BHR1n,캝Ep/'kOrjOWh#A v5v~ё G?.nOY|JZl%4 cۖ073 -yyudX|JzuU8k-F.;!G,v PXg/x `\Q^`xٷ"j$v?[Ya۶mmmQMYոxl?Q9<j|Vڗ\l|*Qd-^u_G^/7п!_doGC0a^x@!܁筗zێo#¸rڽy/iNJB֖\[Q%$*d'ӏćriR{L~sE:/Ö2 cP.}š IIIڑV6 S0V_S7Dra ˙щv-"Ñ08 a-EʊrЁjG{%ƣV)砣(5GN 7j̳8'm䔔(&8& PۖAQN  '-1Nr(e3 ). 돾D`2OCcl̛l: ‰^0TU#_pݻG[;|p\~ \a=n"(8bϮ[VC\ 7o |Z)AZ5 !-*M/gEӗ!/bu \8] qکa:z>͓!91.=[a97lƉ3pEXoAw ծ%PWG܂FIU,ׯP;#/rF>(~9p}{ae ;w] :vC8InEYaϾx-|2bp[;pEǧOoƚ6d,,jfNJ .Mw8ؐ].WaMyzv{/Jt.O.byt+ K Bݜ?] <8TT:WX;I*WY <: /QJ / ep{s_9m>8(˿%wG-l6|YCUѥٰyY˂!<rʸ5H tTC%o؁DίE*ĕ>Z9w6FhBf6M +' 4 Gqfѣi <ϋy&/. 4*ʊ05bi7ؿ 7 }nAPخ‡pIXz#wmAHuP|UǷaa2Xq;w‰7F,~mXΪ E$?>bj!L>7݁.#L( K7PRO2V@K;4 G!1]/ !j4zYcdAU;Oڷ8^N<:J.fnU26/5zҰY MGb>|8l#wL7R\#H`Cw!\>h-Zw`"* 2d |3Pec JalOx CDlMnti) !8j rҲp/`z tͬX_וŬ]VPfХ[O:Imp|:}JUy T[9&]GViIS і"W޲>Bo57Nf3STǷ.V_r* h_7T|2b"ԧlB 1-"ݺ`("7'Hq\[aۮ;̹#&l%#$F9| - Y8{ Ξ;;v;s Xp2[Bbܽ 7hv_nP:% ?E`akAiT6.LKgN"BV3ѽ[Hp(2j|ؽIA+wFa:rð2_;b .o(G`jJ`tf?ד~z5Z`2a vGW+KЯK' =\_zaeLZbpj t ssVtc^g@SQ :s@.WAA)YW/¼xlh'<3oeEzjPꉕ?O1[>=;{XohNX:! Z]C >d*ks!Ata d &qV2З<&,D]g>j˫F} \:"Gȭ&-c ӫ3GV3K< FZ24k&\'g,@n"AY{•xpl</"8'/uu1M̽2Pq>,__mPNH$wDRSSHEJZȿ^T@CN r(o vg FcPuR6FI:ܨX2VSwDRC=]Zw:~C+hKglT*§W%LU {UU] YѸA1X/{ tAn(Dѽ{t }uBs%-ECp_!=)b}j.MZ莙ZW/sH/ EkS]UZx|ßP7_2^6l>B!\x #hB9[!&;c{ l.3Э(h>0XSGP\ PԤ {-&N\FZF&2lZ@>SЕy#fs2p`uE}y+膣A{nMRlCHj( ѵGx46Pژ"2|׭&ndeee"OrGPXY~vpvǹ'TlPz䲩(J tqHIMUO=0cT^Pۇ,G\;"N!&!H,ATA /qL 'lj UxBHAQQrXy&>@wo ^,>GB-P󷣠"ŸM L^Mt!L IDATD-n_"PsVkEa*U\3kcͪe09 F[ (,-!VVfM. т4XY)R#Bmg 9LfN'Ӑh.͊g<Rq}5 &":.p/1,0,Q˭[]s"2vnIN21WS-1b2 uXFcb8{ύ: 1ʥAol=oG$ibI9X̝9SBN^3 3/3 "?6d1{BL`iYXn?EDy@G~% anklٺӦ9K_\$e_6^pJ'vm^޼oAvq#+%\ 5*|"֭^`%VY7QlIƎ-뱐qSUbnX,ͅ9f~ZRGĢ|W^ǎ8yrߔcXb%BU ،שnoc+˳qr,\̓ͱӈ._yV'v͟7\[qLjV-^-FNFN -ޣ琔[W[@/$y2/ZO]AvS u-Rab< Ԭ\E!XHHn;۞N%\X\x:@{aު :Ё:C=*o:a¼<;PY-|m:C0o:@~{|z_8s5mgTz'!(#LGL opM9yk[`8D|P su $uH~޳w_r@I5;DP]ݳt2AU/?ꙏI}ٷpQ_# >܎ qna^{2v؎;w-GzI 4=! Rp.߻7 >v]ˈ&?~l4ipu w;he\0^]MnDZVv >wq)۷oǩ ׸=^Q7ؿ׆+V8r BY')8i.&pmU)-5`/d.m m۰si?_K8`k J2^7ۺu ѾoVtmV;hPW=k +m\\_!m 8~,=eNUq1~@S_L爰0"vuuGhl2_ބhLƭ[r<ڟBZARk'qf:unѨGUEGȕ\ >8~;wf/Ӷ]e 暊"-2(50*Ka{'Lg.ߺl1.# oFd^? akpS,]LPǹR^Q[jV'T^f ,3(~ Xdn.8*_j_G 9gOń`PT[d)kay>zvK~AMg+ m)-31yl?gN@5Ea6 ӧXG "diGJfR 1fL,X cG裷oك\ο*{gd6U@$ (JT1 bNs D$Iɒso}Qv0pBUUfjOL7 *`F:;/x`R)L Fh)P(%͐_.$@K@.̄{x#HX7~yv`Fp9N_ZOœ|!,N΍@ڈAS{:L6ož}X0wէa a Z Bft`ӵ5p5B trmT"Ǝy[/K|pcG':ښ4ø=z3=`Dz\qJ)`!`u%D(7,Řc3V.2O3X4F4P$s^C5iH"d TF&Q0P}#63L7l#<0pNi߱YcdV^0rXzq$y뇠*+pFNnRc@JZK;+ICRk <is`GO ^sOgU5o\&ZQrPmfi.Eb\ )XUSxڟ8e.$nAUZ\Q"&\Y ?2Dr4/n0O A5BKS=++PWW\_DpF@O]F8<m~[;f$)#4ݻ ~E'a !5zs̎ )+~py,`l|Cz՟ =F"ӎDc-*)AMu%2BO+LI!#js+c-% '' )l9 x|Ȁ:'(X#˕iW65\s:Vؾd`i^iFj5VP>u-Ҁ&"4-vDDqY(FuPX!dz?Ps,%C#mō3lkLFa;X)Efʀ;)^Wɱ< ,mP;%-٩PFho,ӖWU2W/QaUfI3'n)eG XY9ⰿ#&C]m*U₰ N:yO/Wkbae3qfkHBX[N>YrX;dܔl,S)ːG6uV?EP_9/=s?@3#&p)8ڪa{@jKLM0/aSe18@U+?uWt&BZe𲣟`.YR[CB.8cm)'vPSVg[#/.l1 / P'9deHzA\XkLO0#?&ˍp>~*.y@pvw1b]2ڋҚ;Zh _(m )x<? ǖ }@fS .?~nף|b|͵ؿIwy3|utC{&>2)?jMq"WDQ TW!(:F;)si>ŕFڲg<@tJa¿[a@8S`zŒ@werX~:rX Ä^^ 4 |@{*VP]ܜ { HQg Clס< v@v;: : D8CER.@rY&C-JixTVW0^WQڔ8.뗈~r2sϱJyrz1$Ug]4[Ѵ|vbvuv?̏5L8-L!SSw :`KCRS(PI~Z¸v))84/4X 'uU|"2L~:4jGR#PJȡr+QUYN> 3yQz埀5W+ iCe}e'LJ@@AՍ'^9@b': R:xL _tܜLĆ~sWV,"x&:}WQO'!rkpX6Zd[|˜\=JhlsFۜS65f&c`ȗ^ggm CJ#l=NהOY&NsvGYCS3n#3>*!nOQ.@?(s*)B*cVZчO+28L)iM=P%9ؿ\2s~*?+ Lk`}4h)A`ϘnK_v%eG _K驇2;`"e!l:qM\SgG#e4Q@[/Px:X2p)v8f_h(bSJT(9FDd&9&V6|?R%niƾ%JLye,)J( Axl-2³B́u/dg%z`#l֎Hf˱q6LsWqy,[8Ba8s] { T#t+2=:"+b}0Y {&JhxOzcPfTWON}ȮeLA$qSྻ=,o_ÖMallU.=N >ȡT Ky9tVbؾew +GG7݉;hJ Ǡ0vbr3ݭ,p$Rs]E87_XbZq3}p !ue9auaڵ;CR&2zatalb;Ͷ 70$?/~FJctqQ8Z_3VU? Qh"{#i>Hc9"BИ1/CFˏ_rwDZ@>Xajf8&2 acʼhoEr/ڇLX߸i3<,sc#8ߔ 7̵8};ۨvSp!HgC5%sa^GSLmg}'! oiG qiym#c [N2 ^~T=8}{-vg IDATK׀0aScg< @p \"aIr:7o7qxdu+J=D<"-^j$<󄭃#^T*p,NjsxZ)}/fD X޺ +ۈ#Ҫ2݂$4,F{ŸՎ >Ǫf0*O]AvƝ_c3Aq}a_߻"D"ᘇH{et ,]l H1$مPk4~ غ׺j;NH5JD_8A찴C4਑H|30W@RFˌHhaF&ic嘩=bH#&F_jMȓ4|ypsM0:q=u2D8cќ/$g0cpE_blWpI O;%Yv$Uc)/ވ6T=CWg$Wcڮ.+\C,I8 $fh%<#o56Q02PÌ-WZbȌ\L_ a(*.E#21mtpF|Y> 0oB|GAl:y:?PVj iW $ 9. W(bd fkgXNv7%3'ŖkPپ8"%r1 ACǗ͡@(TkC͟WnMqI Vݖwb)$129QdlETcfB

6:Ltxu^]UBhݧbn;SЙ<aw 6ؼ2H<>B|yП7sfc <+GCY:N2<}r#cyhaͲEiMƫ1w{uu5+{ЧrVд)a8} .V݄&qCU\eSo6Er WED>,abi_]^@I]9p[}!"g28v[9R#AWABu6s5$bh$e:x^ۇMRQ XâYdώT#=x"bԔfEs,Yk,Z@}Iׇ88}OnU숙@F9W 7"3s+C°x;vm3jΗa YFP4-7[p.zo{Y{ 9k穁oȨibܹ4-6=p wLI*w//A6·B#m!pJp*mXXo~$=i .ͰkHBEwQ3% zb!3YG,qtV̘ÆpKc5.V D׷zq>"b W/)%GEE>g+B{\ $&yظb.FupTW85X>{0 y5|lci 1(Ç`BB"0xdE0>IsWm$~yD1y2Ԓ?1zb+ƊPYqv] *JjpJG[c\Bbh(i`ϡC0YaaQ]M=|h}f(~ "#cMdŷYpS(K ci4WMHj!$j(IAZMK+P 9UF$Ab0?iN[xUw \[;WR9Z[w{!ǣ\"8a3j(`_w›7!}Rm8V|"bde¼Cu%d>x֙);vUp$Dar:<||ak2k{>}->ۨ?Di1:x9 VlDRm]#C)vuZ48{%l(e4g2ԗ@2+9H*Mov(ѹ ]<.ǢVρ0z!NZXF4Vg* GP.nɡy9i2eX3o ]Ge#7ero:^6b;8\F5z*-,5;f}.AEZK.2N+b0g<8J42D[nXY<.? W`MND+-` p< |DTӊoIXς$kP_TVD'cq76C\ao]刱 ap}Ν<|<4^&,4vŴkAyv8-l=T&m(Lzބ Ǔ: O oǫP/]dɆڙ́Hl| wv4"DGbȥr9UW[JQ[| ?VkA&}XOɘ83:5ial?w^;;gCh,J`u$֒lem]$6N󧷡$QKnAF s.:*ktό;b8ǟh||)=8\ 3 |/[N%S0oTAxN3Æc:s}xB_K|_Φ3-{?3= _!;Kt$ve$\oY~:c*vě\/'B'Β8:SBXA+ ^ V^o˛v\ ^Ca,~݌$XVM}?9~~DC!4wlFD]L|PF]C?e@v> K񟆍0GAh86F6V-3۳3w )&Bs CǫxUkg6AXV6^豯\؛|ςpW{1.usrFKᆃ{ZA yxv#- s'a̎za94r'ρ]wuA n_ws @`9<)DN{>/@cOXgi$f =3fp7%㜩!F`šKȩkmklǰPb{UT '7rCFVes R~ zNgZ5 \ Tb*cnlI211 픥v^IyHq? c` xv ?~DcRkI0wDM^"d632.;1W=-NM |xKDd;/[Ggu/ I)s sew]yvRbo|b~!+ǝ}1]PgAӜ3Wa*E}4c`b3<܋v _CF|IewX&|=A{:1w*3WEa( >ɬ0%1pต33"#1}dե%=RԷPΖ9 75hs$dD3.ƎSև\***kgu]#)E qAť]eeFx̐u,℥#>2wwRj}HHHc(UZFVF 6_ ¥!÷|g 0;"&Ap5V2DfgCiEJAE5uv8ua16eg:qFKmÁyů QO`8u6%f }98F=& #dF3Je%r0?->a&EM[q GMcG,‘n0|{&x;\D)qs)8u!뻽Cv>*dg!>:nH)(B34E[ @TRBc(3E10];/E֪Qv:B˹ԐiޢJ(k4fXa]Xl]6r*pOGy):wdt, dNy }7Uv}|2E޶PS#19 Q!xyՔ-RYxNu>I2o (,+A{ "h vlf B3w.uayq07XũxI H`~ )9yͣsaȻ~"cGӎa+35(HgRXcAҶң=(Em}ħp#> Ӕe0A{~UCFFfυ!Lׂ6Barp; *HkYmU9 yHaf 07]H Rv$&-ލ T0(7E0} dRr7TdI3(ICEs:.9WQJy7`4O8iIBƺ`'*As7Tj!Nb1g^*nv^ۂi9Ƕad(LIjLAg[ba;kS;j/N^y0NF\πθ#Y((>P_ 8eT6,r-D4֢Z\c`v6h\G)`:"[w К5:v#IЖFSM,Ob)`̙PS)0BK.'$E婔R6da\8Eá:0IAzV`A]a E%z#8e:e51ġӂW΀؅UaĤ0R,^ɹ]MŒ-&DP7-Ě>[,0{lNLy=A'N}xl03oĎ:?ƝwZPH=-::|>s|Š*%ǖ9M Ľ;T-ܧ4dwocLcGr5#hW;In] x>@]}POY <9ʩ 5R"?CqO}7W `O88#EɀZo7ܳsFa92;l8zu0 :2؏;̱h[;E'_vla>=s[Y/s ե{kǷEPT{j(}#7XӜdl{^pwypAHb2zr;JJ#9 ΎGn߼I/zr0fl, 6(hjﳍ? ½{~e` M3bBr}?(jlz^?ncg@1b\ƷE  O? &$@x-@?0ܘY?0~Y sb@'o9RI=ꆂe5U!*$6! Lmd;2Y1c-|9)Qpe{̽;I +6dgSr K#Ô}cY, tYxHR].^b?hk,cwg.KI{O3}z)wZ达A^t`TM{mMu{2GGx䃢߭nZGc߁ZRxGOPsquE!)*\KG[#'Fcښ_XlàKv]QDv½5ݧ۟k쒹rAV<{_q>Nn^4J>gN VUSmMŸ{51UM 7zPR] 55ul>tWOc5N= @3+J~r0FBJ'C^ngc8i0mYa惆AFD#3-fk1NRgm]TV^h*gj_E19"R]k9?OCD8al \OO}^sbwEq60jښeP#WxD#KL /V[ڒ F5a~Ysx!L9ZlЮ(9$x *'%ݤ^a&sB}FD3D`,Hh0{/U%j#7)KVnd 1PY y+g`>_g Gm,_Y}F^Ln8|:hU$Fm{GPf6]ILa.Zg >Ckӟ}'əڊv .[] IKKr~ IDATvDz #/]&+pIՃ>v?wzlu%|+aL" ^j_!#itm4ȪDlSO؝'tΙöd E[ޯy ?#EߖZc?3J4.=tBLJʾkJw}Զ^[`>l":)Q8 |VW]%8s9F-;ߵbòY_ !$öя`:KƋNzف~Mz%^xMªkT[wDVn"8 ӌ"\%8_ SןӌP2W߱5+C>\!\vB M`&~fk%Vli2f9{FKqlZ2y qԓzƓhӐ#k10-#{tV8|ix6|yՅ%8uJp)X0޺TəAVljo,?}u5ՕF+|Ѕ|:.qaL֯^~ֿp .?/ ½14m?f~N,p!q܏X)Y;Av!ƋbǬUI-eas-^u䡻:09{`0@x,FfAY<.a mɕu1w N= E}gnXWCa׷d%`\ )=,?|t?J0MEZ:0X:ؽ tU1_=Y΋rx] 5`uo@a+%GAXb\l֓lDWYU3?Rs۰D?m!%b=ņU~X߷Р]z0uh 09w>wpBvY5Zt0$Ǝ:AtFvj &JAu.N_cGBo6_F=Fb7s7 snA$;O]DuG͐Ss0>qhט<"V%4/# ;VƇ/*7Â=Q^!7c9J)'AIOD)m'"%#͍Kz6ڌ d@Fw+O!}o, wDN $#b8Tkj3ТݗSZ+0qTtWvӤ ObI $iCG) f9BOY,RTKL 8L#a֝ 2zRn=h+(#7\Y@Izb 58@eg/',QePYq$ڂ:4RhR0}Tm{>1F~>/a_5K@}h ŀWG)v,PÆCJa2L[Q@fc1Sw]Fo%90*>>>ڞ ByL){};1# vE[WŐ!#yo< 5܉tZ9PWe4MÉ ާNEA2oY j(n@F:oo4C$V6fm7` W_~R֜ =uy1X8'XU5 1 \v}TGC-rHR{]!/!)z v-&\_+y854WTԲZ[S1(ڦՠlvm- H<tgN{j %Yx6&hiЙ4 qhll@=)UXmFʻ.Ɔ:ԑ &2O\?[G=^0>xpʹgŐ'\[cۮg7M Mκ!oXa @AC.Qx*SFݴyU=d[1;%j.3h1|۫[̀+ 0]yΔ"me& ng7@G9Wyy;L~I5ML SOTKkNZ"P̤)!Cpa6zcc뎺.nY;~9dgYwkTW ['@#Aa! Nw9v0VPsgh|Ą_u湽w3$Ed 14_ޗ0 }qϟ k>h/v!?F XMAM.҈gvRSbxǤ.nocmjĤ.u62 (=ϒ3Ilb\ >;N* +pҪA?!4V oڢ$k<@  ⤳;n)מCn/y^TڑC35cF;")hh5;3&=RF=A֧Bs 1q?Ԃ1ob{Aa]0G\4۠EGYF=ʴWҚ.>HGEU5ئ@}.h,J\W(!aMfx^q?3%s)8/0^U\̪L,'cؐ!p יu^-E/iAHLCQ/֐ ̕plZmyż9"oG{Nf:[ti9f#]ͰLtZڈ$S_PT`(1=na'L\:P81O ؾ׀}0Ct Dia) , VLk> o4 ! >Tng#8. D~GE 3j8_44 He@^'<4uUy@^kN̍+%~H{qG`Ooˋa4c|͵,zjCnHs @U[.ц$]6=k# BOD+7i0inAƪٹaQ? u#?D%%XRւ,q!Z%(qc0z,ݲGcK/9g+;N]zQ뎰;BAc{Tw(#w|V{S)Α+HgV$QdH("vh #)}vgC.x ~y )!X8E 1sg^@z9XWy]9p]d_]Bܵ"F49i5;Yka3#5 }d4*1yBxBhEIF-Pd=#؇Q~qÆ ͻU4`B'gq~)p߷0ǒV\ Ro@X&~T'ӾnzWVSƺ*XiLsvsy[FO!{ܻki&vgcٌIv8M[h?@^9!ABaspGӫ4oޠiҞDŽ=ACN &+""ZP?s{3\f# &0'~s}?0G ]tS`.nE>tZ!m:݈UQػL&NePT` 8C~| 7Wʶ(KjGcM^:iam2́$0o'(ĎWQA߄rĄY& $ )*Qpf,M`E|tS=eqȧzl>$&kIN-˸NR QTJu #gv4uX?#zSdNCM6:J)_B$Dx cu"&iB's%4暙Tt" ~ddFhH ®%K[ˠ ((@FFbcP@I`)J$f/eD8]?J\q,"FKΎ&rD:?JQ+{Aʘj 5Tg+N@BTkG@xJg ?c0FZwsf.ñrR@{8V_CJNDx5ijEjz3.n(%pQN<<Ga5F83)9Ѹ}ciՕRv&EM 'n:)ja6I#\.}qSVNHDR?L@Øľ-XTGf!CnZqd:&Av]uFGu$v6$K @d2"0 658a  r9Gq(ڻ{w^UagH?\iC꯿}X9g"}-Hu;kx%2QU7X 量ݼIY6q!}#4ՙxU0Ym;mkXDϖfpH8BNsyؑ{@VtEG,(-2)pjrZ38D쀗1T [PY1͹0m<2Gt &faڂ.lX,=׿.jsynw1j4Jhw_KiKd>Ʌ9s1Fwc3l ?}4 ̛[wF9ǻd$f:×'=wu6ܡ`k3 v3;uM]Ħ[a#1c(X[l`21tr8 OCڵO.Ҿ*'8P0a&ji:}.LkXP50Tr$VǼpZj8 f[!CL~䕲MO}{?` z[KXv~zKgv{GtAa(ܴVc4Xr|{R&k'QGc#&.XX5yfV4w aڔ)X$V"Nu 1uRTڅ46N4[aXk֮G@z!4dj8P<3k:ZJjј8u:ƭl_(Gޘsw>O1)XcewT 5RA<:m˾91=J > VX.Df{ pT*/NS-Q(dnQZav,/_Op͓  G!MxN8zw],ɇG&<} p=D_[[#V aG("Vʢlx^2zhC:‚n smS $21:Ia]L!ǎPhM̄ 8}LKӇZl5,ǺC9R =gyœ%pCL}H<31##>gGE\'I!ŕ=vNx:.ޣG!S ?uMi Nx*bM;m=a-+u5VP+\Q MH}r%/U|G]H ,'>&TU@C{&K`_G|TTlJʨHaɄH0H6%{E;S: AXdARQ$QT#Yԁ%K$u@un H:` ,'!9 K:`D lDKa!.ޛt@aɂH0H6{l,"١a ’I:`D lDKa!.ޛt@aɂH0H6{l,"١a ’I:`D lDKa!.ޛt@aɂH0ni 9)Q&)R<@hoA2a#΀iI$"R%˥F FdaRRI$K,H#a# 7Ʋ-J0H ,YP/Ձp{7巶Mp/}q6v& X:;a:$s9E򼟾(aYJ+AmTڦWiM%Iu"y`mն@|Gj4 k[_3gUkRk!.c_>r_a ½N5t̔x"\_/w\vw#y^wןLxw量}JwbK+mi5D_rtu29Ջޟ'bQ^Zj~K ,A:@m #5q4֣4Huhjjk4477 hmmE[[ϖh{=t"?AeB},Oy_.w\/9uqnܸSQԯ4v:!TRt Hf\ne&|$ǠU4i yypwwGll,RRRTz"88퍰0 ~~~BBca2IDAT@@CQTx 4ЫW@aɁhy+T^9)+..NS[)]777DD EHMJ*ˑ:u ~!W/&%aKyIcE߸a ’ ?`` a`|L-+AlNKo7fz554a䡖8&<* 23@VZ*8ho_ :=1.Za3 xsȺ{#vĈހC(10BXTWVVtA8L4Y驔S|yt">:B %K&u@0U1JDYI^^>lI?hsmWᴔ$a+W~Bo] ;2> AlSmmn@ȩOŋcѢEXd oxҢ/Fu9yi5HNNae9f  sG[+R½WeBN˟]7+IR>_m7[LBPL7+ ?`$ܻAZ>~";XY {x'>A.g31mHoii)Ą6a &Խju#5CLcΒxyX#r3!z\/Pq)AXa%J3tA&/(GGKb]6b|֣5 Hw Q&xxصC >-xK7=;R} h"H L+CۄA ,& cNb q5›mYQWCG[\*Xto;'/tDJFpb#7<=O2a# Ļ1$٣yIsz.r44@[EpԝUY7_a2t$]tU9q O<c&GAM~ Lm&$]g&c ޴ieUd1pSG 6F!1T5cb֓@MLO< ž/C m0f|{3DlԮe7G( e9BdF+ 9uaA2o)_Uϯ+S^Ah䶖::vs!IvM:^\ L'.AnQI;l.K[1w.50 lM68|;v `5} .F`ώu05 g+xe!,-Ũh|y 0a=mQcʉzEL:Y'Fm},?b" 2s }}V̟5ka=[I"y#8|$Nձg1g%>񎃮w\E2k S=/(aJ.pr;[aPSweH6€#=zY($"CC%m9QUjjT1$&i%k'cœEHiT/AA' w, [MkcbV<:Z+ ژ]ocf{ضmnէ|(۔h [t}[=ux9?6j(RN:u+rL'D:m ^X8&'V& Cnabpkn4$U EQY9.gOGT0~JvuɳtkΒ yŢ5B NrVTdG?cf.{|;wȋbl`&Q{S e-!Ö%Qt@ s/K<_E-@b<\ʨvas6*{^dXRK)v Fصr|K qXsikd1 EyerjܳVfl0DYpb6bu8:L0w!4CzW=}6;*m6V&`TsZrR VT sOLMmm;?8>5:jh+~jШC1@uVznJǯ.Pf&L ɺ 3 LGƏǗBEޛCSȬS-M1g䑩5iꏎ6;O* nA@ڄ%}hoy ¼)pJJ2~hA!gþ."O'8LMH-$`,m0cbRȌJʻa( ƚ||# x9cϗ_#rgp^gZf61j_<1u]uu5j脲ZZ"7J=8_8RNzr(O}]-c%{?p=54p=ܖJuu5Ռ:"3䈹pu)IMr?tԥ''G&!?P'@l|B*4ȐeHJY| X\& yHfWnkM$3<\WdFxL/ a\5)J(N:R2.fg!=RY0.!09BdFHC6G$!t 6+-)vKAӒL+-߇ *tJyH6Sf{|ٰ¹6t#E2T*rW#L:H|ζⲒ5:_e|IQ}m ΗCV )ZV .rf N(+#C|gRYtKKE<*JZ*q[DYYYtEh ^A"y` sFDS 7XQ`.0ssn!sÔJj#Y0 ,AX`# SIg%TAWUTYLtY:E %) tQ -S) qKKQbqHMN.>2<!`E:GW%%$ !.AWhs>6\#p|G61=S*$ATdp?_іx*I뙊iZHvW910[\:-s^7M13>=L|_}eB%#~t1@>ćώ AlD(]yU2G/[)*\uK͟ b˩#0a vqƒ:bOT"B?(FH,ٰtabޜbvL81>i-O݊&՗R<]i6/$<|0`r0$#2A1X˅ IޛR,{ 2\S]DW7 [a4 NayP2nKs~gސ m 0HqE]oҖ{d%B6g$@?̎ Z~rŶkor]6 )ݫ+M3?>n6a  BezW/ʇa^[))ͯ?z`:<2IENDB`fotocx/images/HDR.jpg0000664000175000017500000012237615247006660013427 0ustar micomicoJFIFHHExifMM*JR(iZHH0232T0100fotocx-25.1: Crop: width:614 height:609|fotocx-25.1: Rescale: width:307 height:304| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 609 614 1 2 2 C     C   03" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?_^6de>f|A:Y BPsgksjF$D"\ zsY&$]_o΢R+A1 f 83idЯ"%pԖvK*/>qskK]e`A89D]Mkk}WJwsZ>ҭ,.#o=!_3!0>BTAkϭKRD)c uQ3[2ɯ[Zۏ8gںW0mPӼk$ZEj77J ĚF=|a|^WiL{yѨ'(RB_Q%C.bx5six|pS$wsּľf]>YƱ+=}:Tb $~ ^ͯsDL!A۰c8=*֡q|y=[PBor9]g4ەگ,|̹}1׺Na07s䉘$㟭ysӄy{8fkes#s )?t@\w*$+"K.Fб9 zΓķ^H˩6NԖl=\uG[{$c22:pFqsӭ3N V #,ZNZ͏4˔v7"HG;N;jǹ4Իf$\ *9`zQyƥٜmk&'}Jk.hdmFFqӵyݾ[j_%,95pT]ۘېq?JK)i< 0>{ by4oh8Ʋi7LQI П̂_(#(}Ĥ%"W6/#$ICkȁ ~Z  LP|-5xl1nKښijēnemwڶyu̮;ҭZQK4S/|"xuH'Hx!gcU9S^ ]"bؗ0G$**8+ŧ\p0YX5sZ-ƞ4$H( q<^ä}K(@`K~F2{;x'š~.YVI-EyqL`*εcpB[ S:hf&vGMcqRҴYªy2|ٮ?Z鍦\<24de"u㎟JﴫXb[Ȟ";6=͏緞4`;N?ڥkf2\X`$c gJ[OCwM<meds/Us+t;-UJH (@kqoo焇-,zznd bGGk,HUsw#;oOzݴo6շR`L>\''y%ԒѢ9x?8^1=p2:M\[1)@@$xS4[{7GmP]j!|Ё9lu:;N lsk6.\y`HHoUO&zͽũF1$ .0 :eex[i!#Y% Ƞu` וV=:3ri%epB)nHb8\qԞdжO ۏ>Z5) y=>l[Ѽ Gt YH}YΛX.4n#ƷoxaO\WxM[R!MnP8<l׳fCBzƩvaURAWz7#qT<Ҵ_6wg/bOK28;vpsך(w]KG]ç[R%mR~W;מ|EVfe6dʓ}6 յb[ *7 qq~1fS)N-A3H!ۄRaG?/nLʁcsYqM2F*w*@GAxGs/A~k5'?֖zFSS|!DIqOWc=KƁw2|XԿ-7i\>Y-=.61p:)C\<umKZ{n #Nn:3ڴjs H ;.<wV<=BvOi)B0v x*|#2?.ὪsXЍ`2WK7txJ8164gI@V{\V zy+s$k==D.ѢYͼL(Vv2FvTcyNR=X݄Nb\2]{=]x>K;#h`s|W|@4s_A{2)# @{gSix?—1{h.td9y7 :du"^/TM*KF+{FC'2(۴2]rB1>akK g'G|R|1ҾuY[yWt8K|T(rzk=+em>ř2)#x_hs_j6s5xe2ЪaX䜦 }^kפӂKջoӮ8I@ FL<+I] [#sn%d.88d }[_Y&K_=)?r2~H+|nW!#  +nunhx$|nrXty/O[w 6%=rq 0ˎ1xvy5ओH?VwEYeq12վ^?z_mC$2C 䵼#껃 ϛC\ݹ*菚.Sk|np~Ƭh%烴S q؂͖h疇%/$I>mg3 )3jѨ;oֺ"1^[? \[A hBAmʃ$aV ivg|8gs?9:H|{}y} ew v {\_Zj:wm9ImajzusR_E$otdTn9P0Ak9Sr[Mᵵڵ $&h3z2=?/>[k֊00OTwvpNq־_iGq+2)Ky% cG/>,v5$6 ݟIdëW#λg@(%N551,X% ֯ҩ<3(2{2dt{>Zm9u$}#q 3H,㷉;PT1 ArA?NU-Jyx -V?,SGn$h28ъLGg^k.\Bb@'$eI׎G«xM9aV!JceQ^xBnKգo-d- GauƢ\gSmnt!uo+/C\9Lhb9gL-[7a6v~kSok&3iw =ĦVNX+*\:ne)cS2y^mj YMϛK;pQ`=ꦡoe,sq hc p+j=zFS,HU 1V)c,.  trrk?fT8X|ӧ仍j9aqRx5+ӣ1DZOvgbW8-d 6{u.-+>f) 3 p++Wp[}O1P-1EE%k#M%Ir9݋'8ιY^6MGN \"JaȦ|)׬m+[rHGX*yd <%$%µУ 7i}/;Om"ھlOku xQkkdBx5bGs7 '= Fý.e?H,ԱVB6[iVǵiVhRզ|`a >U>W`i0wWVs\y9N;Q\fGoR*|9~24HcMf/-2*?6II1okҼ0 W8''-d mHn?Z)}> BԚrg*"8ܬ:}w7bNJԤnVIjO=O_]? Q4!1Z6#{~ i8*;5mM]z9G:B<ߢa$>3gg*%&?դ~(Ď\։jк&}߂w j jI}|*X}X|g؁Ҿ!mSC!܉@J Xuk(a%k@.P|b>`0?J X!,`8Yl\%+]|y>?GKD\.6W9s{:֒y>xR-KXrcǰH~t/č~9tV%ⶸp>P\ׂN8>cҭu]FNWrMwsǑ\G]69Oc~𥎟k ݉:qExQS+T8+kTݦݹrNJQm5#ݢHfHbʊ (r0+Kgge-3O'gA9)3b"G8+#}u(|>Kd24bݼqz˨/ĨEC6̝@v`WRЉIW+>koScǺEȑEkVm6G2NŖ:j[Iedga* rEq~kxA 95W^g}a5^"xF1Յt٤q_Wc=:It4=ݵrDl"Nry^6Ia_l?_qZjW{H ò@nGZGGѮwo7[#O>+} <է7>',ce*|oQbKt"O*aOܜIsm G *~|Yᶩ u../!y%O )'qsWe8$mŶ47JRq3"5_կS \JlH+*c+ө4W%sk?.,eޥ`!ZKU@󢀥#M͞NOҭq5 4t^Vyk~Nw2mݫǏɮBfV#'4g'9,^/t%(20>֞ K ڼhmf漟 OZ.ul]j#V2M윞kG׺@u >\r \\tWBW&:ߊ#Ҭ,Ң{k>e,ʌO\nӚ#%yT8$ckt/_Ci&Qk{k3$Ec=skզ;aZjɿbfO.C6G9:Ց_mn\K<0OkYUu8:pWsta6?c ꤽmx>/ \e O]G4vku`=ԟ¸n򪞒6;/Yj/+ ظӿ4όZ댈td#Pkg;i:?_?UA<ක]:ce gs\_iڵwVMљbrf.rNs<]!կ-nRԠԬ#q2`aZ.Cks% k10I\ d@ۿ2{w bNǯČ~ `䬒}Z!7Ә1e8wI!ۥGMFǰx"]ʐ)oMm,O$:nu O^1\߃jjy <=7&[W1zd[֩1!c,o'J cW-MOͼ!I'?M񖑧$ӗXe0kO݌<7$nH͓ǯo>L-pŸ?i^VF 4b`$?Z|UwƓ&kL-'KYk.>"C$wM`o*/I ڽ+ m>yjUKu=k[<xX[/ڦʸ ]?y[iӴ?N}kk.#99B@ʏ֣?Y+]&u.=S4P˹ zо|5!y֠㍇U8: sY fjGԮg0 `m\iO &hHC s#5k Ծ-&Bc“퓓+}p Ao)I]9ejA- 36WuVweN~p K*C8ŗb.4c? Ƶ"LmOٞ>ЅqH*?VSWHn˸3oˑk[ȏ(O#+⸏cO~ktEd]i gY&bU|`zcmuw;ݍ@ϖL\Z[zZܳ3K!lp7j ,I'$AǍ=]8+;X]}ނ{ 2Hc'4dWC|'V}K[;G?Һ}bʈs>Vd?zOOEjƞ!r>*Mլu{k +zt5_YxBT[QqzAUI`9b2T+|UO%Г"g(q.sY 2h_o޸q9+yN$L"zS[?:KFGvf˙E8X+^,u u gּkO[s$|W kLGf+Zfַ: O f{eC4KY 8+*VXY0G5K[GO[ނZ3x}HN?Q*+$G%dgp~k[J󫐆)M?3Ywk#nRu?QW-RdKXh[ }p 4} y:g?-|y1I#`IM MwOf lɃ'ޛ|o6p:,o)3;~3͢#iPG=?ּI7I#-# j],T)s*;\6$c>*-kjǫxf_G!]}bV?5p:9v ] ک YN;Qvމi<&OO1^]7P_Ҁr us7?w::?./n q+8]>WIhq\bxGiqWgELJέ5pǖ+;G;cs]>Q-c!]PHڹ3y|Hh/f E4VTR2\5 \U_cGQb:C͎C7z1>bNmKæb݄# +XPe؞.La!T'Q|O{g'ݚRH֦gu_qǚtl~N>VV?MӵDjht 3>QZ#a6kzP I119ﳴ~۪ DB⠛Ҡ6~͸6 1Ӡu%{ɭ2j92(s5R֚[{܃pGa_i'ѣ:_P !<ޘƇxMQ.9jw4~ x#gq ^3Zr"Iæ2@9N==|(;SA@s}>o{EVJBBhfϠq>#O4)'޿iBjăFx=k_~ٺ&q;+[[s=iDvÁ?.HVWY U`.0\cp>4/,&y?ZX?'=r_{_J? RmdN ze=}t#>|9bIwDVHŽHQh!~tjMׇ.KJb0 U.mym|_/(j7Z,eTQYqn[)~%ܔԾ,DA*XxUIiv pnO!NKS?hg/hqS]FA~!xZ}Z? dh67Ak<=XRo+ ಐG3a@b;W4F;9jk]5t$-ʠmfREs+ ㇄5vi>#$ 6nO=:sUe;_ ety"%IL.s0Kjm~71I M q.? ^_uko:4q9 GR2'6fb/_KG99RbH 1qzq(h[seFSW76^y(0n 菌!{&=řb7H'OS^KmYwɆ0*$TiqW+ᤞ`Ϛt59D_&  bnwm&h[p7${I<]kh>K}KJ &l>9ImT s=J?!-eG phֽVM7”g$,)+;`1ֹ'i$/2>I*i؆Ӻ[U5)#9`j~&FQ/v$Uc(%~~!J-uJ} Q \xOXkUMDl:|Kbđ{#?>SNs}XX@ BAGAq޹qeTP:O8NK>ڏ-tVQ+49vc8#iNݫ?X-N͘l{gh+:!WdsO4$d2mHO֮Je EIʋI9EX[afܳ,n8 }Qj:tkr4:u].k,Ww$PUm!dg<~U5ptȑT8\EӠ* ׍+sDxa<`O]ǡp\iWB+9#IIb+*w&}x>k6 YMh4Xʷ˗\ ÓNѵ$ǖ OV1sɩIọ2h؁l"xy ;TQ٭ z6/ $;YI`ʞƻZvמ sڡ2lc!.GLgw7TS <8 _;$z l.$4̇O!vSL斍3ʡ>[çz"ӯ][d @㯭nx8Xj:֩4C-[k{" ]}΋s-ֳi><" 0F9=so^T. HqF=!2=#Ú:[~\\Q^VC5^ץm0ZCgC\ضi=E| wT@t)&t (AjҵIckh(eJ߂r={UH4[.6n,ێWoƣ pFJd_} q/)KV3;{ .k[eʴGXAx@YaQp RA&mIDc"@-O^F1ԁ^/ 4(zXUDk2(L{ҏa=ƣ{Ic\ڒRJz Pl}Io_,88~-}aILŁݽϯuѼ#m1"k$k6>^IJ0*6: b [m,g8kB;խJ:\Ky,hoʩ(`^M)ϧ>Tci.ZYU8-"'W%n[X x.ưr``C^G/-OAUӀ+ȼG$զ$ۉ6232sD3 6ݒL`;Üd7l-SmI$ˆKF=kKZ\=u3ceDzgҰ$Y4c2738ې:{W'S'cV7JFFT2~sҹlOJ;=f..,cXUUSB6kqX' Aj>oԚaS⫇mWǙ$RqW> x:g֛HxC 3vەeRx5$ӐD=Ş1мyk}w5M?2( l@8㞃5wxwCS"bU¤ēgzw?Y-%&hԱ$Hsq8WGY%Ơ.ceUIǵpb)])7z}#Cmy [\W%p;=MPQxഞ/*+;ᔫ M|WvR;&dy @'c'>b2J,ʦ'! Vu,PzTS9_S{B¾cʅ ' }z-XRT}γ*(܎w@ ~R;++82M΢AS~lp2p* G52]bQ;smN^6308HIDI'5젳ibhT˹#wO%G=%1Q ed:V] h%uzڭlZE̙$1sz⧇.IjJJ_\G8vH'i&,-?mc{u{|8`˺\+{s\Y_xvCӜ, ;Xt9]W"4`U -UJ##uYtV99ľ'l6f}jؖrnm#׃^c)I]i= k1PvFG9^kצT甒y<4|+"O1tPsGms>zl|1ަ5q YAh%. Sҹo>Y7wSo8a(Ճ@4fUÚ-ݭݪѺ9ˆh:?̤[bt#8isuCLG并yC-PN;zbLc?Ҭc=rkJ+uT+b y$}X𖪒mB qA6ΧS\1Csl7P X(INz\1_>1wqd2" Q{g#Svi]ىs3]K4drwHۛ{c*G;;z[ o)mWle=b0*op2#'דEhIa3n (ξHRtfAnҹĒ&pעl23*SlliP@{?J- 4[Brc1>^),#;<>.̂ Ġe v8Wxno],0IށLi,y#JCӭMM/tfR+(7tAlg|7:M s׾|[42o6mX6sW 㯅*EI\3t+KVzz+$F)ڧ—/#q~jPjO;@24@YrqTxݷ棏ARD_} H H.rr7R^+ 6Vr‘l\fmP0298\.!7OLҤHjޑWWUiV)[ F`)/ |̌c':2m=όI%eE_"($ѓOM=ޱ \QڐK/Oj5J7=WV~X@4k6X<$q&þiOdDH7nCu^/d&j?mkɬEc FX8_[Z_>y?RLR4\8l_xiMu1t '^Ь,'pjFCN XL>8Ij(;7ӥń6M 1w$ )xCm%\#8{w R6ڤ m~H֟oqurjd[mDc '1=sYb$_Rk%$G?A%-48h x㏈lf/uK76cvfr=KR-IX!C̙ré 3RH~uYC(9 }zxI[Sԅ>g<#Smlj}N? *FU{0O/g2N^$~&GpNrǖuAxQM2FE4ATsڲrJ*džEXM$ Diry|ViG!V8no{ih68+ ~WJm[V9}b#\+$'SNOB;w^Snll? p48"?z{.Pl}s X \jrO sޕh..pZ[ZC49._r~3o;-N VN-ݭ)?qZ+xK7hq=TMk}Q sLI9 ~cowdpR[npO9.G9⵭+WUn%QfBZRx 7 )&pՊWLsJm/HN}{6kuf pJ-BES֯$f]A"TkxlMsyy³*`; '(lCrobxeӬPAgĬws8?'drEt6fm;^sO֬gN+H7 Mg;Z㏚LS5ko܎i/Ր@WB&MGYBfUhn#0 i}/!S%A]Go┏*<5+;+IZXqSѡvsg '- 0c${Zv_:KV<ӂCکzK]ȱe1Aֵ<:OE gUːc7U}XM8ӥEtMp8W7s]^ϰD9^n69 נWz3%%wF[6VtMךmRr ΊM6ihrĠRzd7pBgPs ͻYa5<gqzdozK!YI77+}G4RQo.#J#f"#VWc.H^w{m>ڤWr /v=o= s}aiU\ zOOe=OL|ۗ pT8v56wvZip[Uee7cqv TNH|b N@*F*[9KK+o!i'S{`ǂH(QvhHcϒ @ 'NO<zYrΧ3<''c=ZF3qܹ\*"ݦqa٥ˉAGf]V9loY`Ǔo > պs^)Dž5$RKn< \VCi~Fb}j vCHqɬ kwVӵZd rPkkǻk9]Z G4%w0'eiXdGU\}7t9oW75iph ﭭWʌGW$3-G1Pnp{cW13N2xk1xt:̗!{p {*dp =?xz-Y 8}+֬Bݙᙁ,:0#8= ⹝B.0a1Š&i=0GvxNxڔbXy\Fd cCc c'Z?5="Oo1ý"1a:f XVi ,t A\_iW\P%Y0QΊazT[G;HC4;(h/-xJrX~f5j{E 7/͎u žCm^kf #"du uu)YY|mտ=2skZ9;>6sE w=Wi5ֵiiq DMv ?t8+4'+-uxu9-Zf@x ` }uPcv\M%MvTG _|cl5iII>cٹU8-v4B1m}]k[X_ohKf"r2w2< gsWmIjk=f 0d8 Y?k/Uk>,7rmyW@b~B:{{;bmccHݙocߋ6 Mm0*C|cq]=[{/+K= |¹)Qዃx/PWVve1ꎤg ZF$A> N7hX)T.=U2܉Q`*W|UT9S+mtW}*fR?z;^s? [WE59Q6n m8>;נĬ߼_jeĺt3sEp!$ʋ"ĂFzpEP[uo%-Gsc5HK{imC+L\#`+#Rʧ!P'ⴵ0_L(K䵫iH( /xzKG>ι5ZK6p{kf{o8| \Z&55FSxk8<}6 j&,lLTđO]%Qî}bMZu[Fu@J֞3P][ccLDmQ&9 }pua ST Sg3gE.q<~u]Rw<#T,ṋp'OL< R3^2MMf4{]8G"lS$wQI!?|^?yU'm]/t|3![y4V7,lRvW2)'">Iy^s?ӟ2R=W>uCxzJ-c ޮ%2CڍZ0;gpZޝD6s [)$mB $'^z"m!ߵM5ʹܨY"yGLײ^A?jfnc Dj4Qxf`½X,%G>k$s/|bA,UkdvsKڗ8J4*OR\Z֯QKXE+"XדެXhN23y ;n#f+]Yz@ܖ5"$ιx?Hs^ep36OӭyG𼲑f;o_m+ְviƁbȣP/7'ut^6z5Hn HfSs`9q1#vpK.|;xWEO]*@w)w3f3'eQYI$Q7̸@F@sס~7JwI2c%2Gx5-ے 1:סsֳgs,E[\bJF1ּY&z 1tkG%  k Z}{Jf6I,@Ĺ H `o14)%"{~{H3Y5 R=4#:VDQKqlϚSѴ$lP\\1r3ڼP>X-xUf\\m Nq77WźܙY[r Rw`.IxG 1pdg#poNX'^ ׇALpTx NG@k?~9ҙdx#089Widm۲r1'i|2ahZO7M _*AGَrƤ͓qg#Z5_ZM@anʼ8_bx^+nd#J]A['|JO'O|ڞa4C%E|?ۭ9#tH21}s{ǗiFn!r+c68}I;3s+?[)Mywye2Ld=sW/"خd&ieDv7xD}(XO=H̛%aZ$4zm%rQaqUZyW#$jRV7@0 y1΁N0^[oNb3.p%Xݯ8gW h tr_~9 JC/%J<(xZ]S;I=;X/{Pk6kՕ0+ѼLf񿇮K'c>e|ikG㹭/v݈rV_NS]owr.GS'{f<mҧ<qXPS9_^*Ώ ~ }huuoeQT:x|3֝~ZKUh6g(#.@,ë`{Yw{;}Q͔%ǑP :1־<'Kծ'ljh8^qpdROP7qA4u% KI Sx+iWDCh\@ *+;}*]7ЏMW=@t <ſt"ED˟3mO{M2;W>?_5KV6'q$Լxu`N~88Eg[,G] VӉo# dWx_iqXEn!Cy06;;85=Iwqgy]c,DHplj;.=ZJNM (a-v!^fnLT)f-qRg&Y& Yչn,ӯ7޶QP>,,K5MԜjO.OgD gbqy{(|[g,Q5>gd$gH lI/p+A^O),]n,<[oi|:ԼwF&U}BA HmfQUUf?Oz~=B(Tmݼb{k.CCi_ELfvqj㋽kVA5e;dx$.>qy?)?y|exK{i9*6fRu-52\mgmEI8+I,HqWǵo.w|˛)i29Mp]Q^xYeRShP[#` 6N x##mbv<>~Kn|)PWyN*A .Ķ~Lbu:M&xDgo@0@=k-ĿCxwOKZ 8XNݑ)8_EH* k}1WGA{0OL99Z>'FUc$&Iz{`ݷ?$I5s^YL趥RktqZS#*\n*W"Ngw 2uWS ?`~APjiwzи_f[S^;ҴiR*Rx39>fNVo(UjTЬ.ͷF'%1}nm - AjalFOU4 w.T!5ⳝh)]ǸA!2^دmo4I$(8 ?%o@t+="=<.&_<>JOz~7xM>] D1IfdU;?0TSmV0_iZ}u:[[K-ČbcVŒv +k rs}hjίf{Dp86yBKqf#A ,88J10c9'ڼCv7%5Qvra*W=h)rg]Z-&i6yrl嶒I ,sj6il`0s Znw?x$]vSoD1!qڱwFN+iz-G>9'A={-ͥ^*$DbXfxӄyK7? ɰ-U֭\yle~k}Ѧ'ϴRsڟure)9%yIRx92G !?q̵k£`hb$*ʲҧSIY*ϊu=* Z; Jʓ?_+zblf?֓Wڄ6fԱ.˞2F{O2<,|Yy];M KY,MizP0w<ƍw3'Z0-8qTfR3=]{;zIhRP \^f I ,v-[2a#0(E.n)6NG\jܟyº S_0}Jy]-sǞ F)7N#LBd֢!Q/ $dv~ӴTiшuAԷ3exɟS`ԮBd&;[Z13Iǩ01}-f iDQi`r'[cpX$u?6Tx-ZK 4ɌmQ~']/R G,,`ǚj6:-44Ifa3r@\pO5NkoGUtkwj!+ >OSv1i7I)B*>ӻW xJ%K\_i1q]2fޞ i$=^]؛eXcw@7j3ž%+Zf%T:q&y ],erp'v ;V,: ML85IA5+ =Oڏ㯁ycvk֓kzvc-H R:WbToU6FDTu$ xOp4 y8M+|o,toʲn)Z#jǴjuu;̇LIXeqnWUK# $yjs`t ʽNȈ7}Iݑ^WO ]L"4l[S4GކiػnbN-&ZG=VUal=-^Q}+{Mh9۶?(a5~3šmy* *[\j4Tsw 9R*/?QLU]~Њ&wQՊ$~\ fb#|\N_KIo:nW7{:/_+U t>{.NJ??WN3&EYmb/- ڸit="f?<&KG*rgkcEj2h+0rGI4u=l'|x/ eIv\ ]5C[`-Fy\H{3(<0E;,`ȢCgOt,NGq^YϮeQ0Aߕz5mGKeP`h+TI VƫIbV-Ɲioq,$拰ß\WXH֪Y4l.9AynF4BRog8A9mv= O6KC"IZq)N!Sß|;4/~X:u]?W5KpjmFY;$XՇUz Kvy*<\V7J? Yvo2xߒ?kB +_̞#%lJC[1E5liu0hdc_kQ\*FpxjQvѕG( dGߴQٛOZ{x 2]GQZljrI&p=3_O5F+UfehOg9k[9&1ָ9_:5K)xxjg<ן\Z7rI)hrmtQ^j{ j1`SXϖBqlwk $DA$ZiAU7]ܐJ[/o#X]U]A>Y]ӍC> x5WK9c/cnc^y{gO`߿GNA|5GAe_)3H;wO?1q P$ c?w'')T3RQ=ƚʲ+)' Myo81ӢyE/\cO]߃&mN}F]y6#r1z-k\GimLmWedN=q|}]7࿎qh:ͼ6Fg,En$/x@o{ '+IKMַMY/P:ڲzOy}Ց9f$Gݺcv"' }U\T<sm[Mh+8\Lm-.d)h&w xZ'+$C[H?@+YeOKIGTlt XBJ7[GpySb%eW*q]ȼ01fEk.c+N[ıbBjLJ8?jI_m?CY^#&yW+~Ct%_($h2?ڽZϧǩRwQE=A4;k7VeRP$3c8k oo;{MbKt\#ډTpB0<CwapZ}[<Yg]R,F['y5k}G7qמ/Rb])$I _Qzc/7 x f{`¬ }8[oBзHari$Ǟ+ |Naþ#oz. yaH/yt,O|I-|[N֦ƒd;iT2m^iuSLlm (Wg6l1zѯx}n}ۿ4g[.v|;O0Qq]8V0N?BE5X;}C!A 6cm'̎O}L)'_ טyU@ .6,kZ.Q20562 W%`pi { xfLPqXI]jC}u5flKY58n[h,=p%.&R>_TYr"V,˖=NhY&̫O}{QBY'E8ď NO#>vU@  |sK}Izhh9,~ӘHpyªY\^[udWtN/IPmݹz&{'c1L$ZA ܑTbCOz-#e T*=80)9@@k]V/5xTRQ!q3׊-G>u1 . 9+>[PЎ695~B"U dɲiQϾ8W(+*%={yѴۨ[B9f$A?,e#AjGUb Ņ=ƊN"@s\c♮.}gHVi3հ@޿yhS{F|rGnϦR$"6| F8^H ƑN{ -b%Z7 iZڴkdqzW.GPĬqr?v֑Eg v qskNqWf'O[]CS̒$u@&TPHx<-^[d6֐vDIjzxڶ@ZUտg[A“hUXВ=+%WwDS<_ڤ |۹OJ|S<]-V9pg_cv:IəORkF $NpF0FkN|au8iM^ZDӧ&ZHE g@ ۚ"ɳqW dpA+tyӦׯn$t g^h!+[v% G_n}jrlNC}LjQn- D?-HA}:z\Z$++D .L2NFO׊.|/L,/^Sx@AYvc9օ#\|Bш s${5R~#mZյ1{C-ZZͮk#D`9YKbaAl;la^ 'KxѦh ҸBEcw a[' r0#o_>O1cWJdb FbK$|fǂ6| yPYcp5΍;t-/!żF<K};Tc12ؕno p;~ߐ?ҤH1JlVGi^.ҵ,^(X>·k6vjܹ}Dnn;x+"P#@UBT?A;\9 NGZ9]Xo!h񎜜ʻNx4?};;bW=H:H_̕8q,8VݏMjNldqTɨAx7O{&1 0v.ߦZ7 ¹o1_\ZouLm3gƏMm]E1; AW)&tv]aWp,\Ŷ?Pb껕g;A+"_[+>˩Yrp| Cw)+;QYcPcSEvgfotocx/images/redball.png0000664000175000017500000000576715247006660014427 0ustar micomicoPNG  IHDR>aIDATxɒ0@e;b'6a_8qNЭ%Q̸[ժxSKrqs^z-^EsP9P*W_"P*W_"P*W_"P*W_"P*W_"P*W_"P*Wezànpzkr4]Tۺ]m<{^ BaCEQxǞ9Gq:ݵ1NpƨPE ;0B1 %'8%0\ȝ3lP?v.+s,f`7t|NÊ +nSߑ}2rc/Y} ?.;u>4x8;%E͐piN6|x/u$H*ww vx4Ϳ8c-fa_}|Pl%1$sx!-Ap[b(襎C=1Ʈ ?ycf_ ٨ɪ;dp/iF` C8&tz8 ҫ+/l%͎s((\m\<_)  ޙrDroR Q< ).(j.ȸ, ){e-Kh)WtujU+)s?gj <_0@<76UU$I >))̃`肥 X4JXv@L nٕWP4 XR2;FT0H J ~ 6 `SPJW\(݃ ,Pa'IW"<%dr!\ߑH.J/TR\ ʕ\&P`rǁv(}Hzp2;b9fi^Ȯ4,@He}'jY ycE5+lY UVXFUR, m n&>X"`nou3\ oXӸhUZ6ztU1RuG8?JH d2H{_A'@ cC x߼q)x>cCh% L9qyX~_AYz?Z 9s αr[ޏ7 .YdYXm3aYvVjsw_&--^؎D4#giva; 8ߵ=Ȫ|r{qo"d^ qiXTnO%3z@m4cWN/@TFrTo{?GGK-I9fG?`J*ji{֤Q \>/dÙq=38-&xRT<1L|tCrP Aحa^tC 4%CB N鞮'z8Ff?{H=(d7g,B'd}(qxkeq*MoIK`?~O f|4YNp 5˼Fq{3{mWd^Z=P7PWA{wmpW}oN9Cgߥ`m>h{73zX0e9<9SiԖg|8 ejռW.#V V_X%X͛@>bP`5o UBռW.#V V_X%|a?~RS㧿'1#?69ļO~)}{|ׯJ}nW ?E8,eXIfMM*V^(if%HH02320100Fotoxx:resize| Fotoxx:resize|paint_transp|paint_transp| Fotoxx:resize|paint_transp|paint_transp|draw_oval|paint_transp|paint_image| Fotoxx:resize|paint_transp|paint_transp|draw_oval|paint_transp|paint_image|fotoxx-22.0;Resize: width:128 height:128|NEEާ1iTXtXML:com.adobe.xmp 100 100 0 MIENDB`fotocx/images/edit-selection.jpg0000664000175000017500000011114515247006660015712 0ustar micomicoJFIFrExifMM*JR(iZ02320100fotocx-25.1: Rescale: width:666 height:390|fotocx-25.1: Rescale: width:444 height:260|fotocx-26.5: Shift Colors: red:0.000 green:0.000 blue:0.000|fotocx-26.5: Retouch: br:0.00 con:0.00 sat:0.00 temp:5000| chttp://ns.adobe.com/xap/1.0/ 1 2 3 0 8 260 444 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?4;Wni>YiYc]kmwYù欪sl|:]黿*?Ai.W.$;~o$Y&l~bN_MmUU ڮHr~Ϻ|g8h5_-{ݦ̛>e*Q*5LJ룦0Tz:o {dToGG~L0_e}UfZRkvWfmf۷ΓBjERXUJoR7XfЫO%˦R?AKC>E᥯ۮW渑oԟ -~35;6wBDXS(O M,41ȿhI*|uM~n$vq/[kScaD|I˘ubNJT|>[4fYٙjLb.8||qW4[gfV|5xzϺz8jw( 5峊˵I"~fi>UZue`6=`w3WG OMg߳=Zj{I3'XźvM /͹kNHdxm`Zt֚| Rnk#[}^_Satw]ͧnvni.ʙRQS sћm5g=7|׶H5HvQ쩇_˹l`k~0!EvGY~IKʻkumof:q=<RR>uE} B\mRǗ^?5Io Z6|Gc>_%7ڵ|o_ړZV]3/_/F?dj]4vo* r'̬*|%#eH.ػ~j>ʿk)F$mUjӢj7|vJ5?Wߴw4o]x_3.y}ZFfUmvz=ju BHVo꼪գR5>&|dG-RKoRmW;"dFehejs|.ů.O=.X>_WFͫmmB_+W~Q7m *kAk+yY ;}gOkV<߼ٮueLJ2V;eOY~ejW]+Sok9,mr.VVic̝.Ryv*UѲ})ngީY/VNȿ5W'ٕNX-V*t06*1![%vZZĿ7Nب~j={>c)ګilݻJ={"űI}'_Lͻ? ז+,ۿ}htu6ۖJVǷLՏh5~B??A-OXwVᙛt/ GoSݻ?봟Su|Y~mk)ޞkiv}m0UڣeYt9#ji_B^H.ػ>m}ZF$m6ծd5嵴V׈ӟW<9+ BeWU˻jUώ*]kz6c_jdr++nV.ů.O=.X>WUk6ɪO|ݶhY7^|?REn!eV_z XGqoa~{y--!wueLJ2?[,e;YawG"eUv/֛xNֶ;dfʭr_.ߚZUy2tdW[/7hGU]1Seq|팋UR}]` j%ZXj#o19H]QeVq/S|s0Z yh[ufZhmM[ GdS/W,2Rɾ_W4?=j{u~c:ڼiB$w>O_[[,5s"2E&U-LoMڏ McoM o9w}k3d_b \_榷Mv꪿Ay_7_S!(gw|ͺYm7~5ZeiUnOW%G!34Zne^KG?Vj=HDrʩ"Qp|heg5o3VG7Z6*ʛ*9LȾ*je[{ˋvIjDo*fUś$<٫K<C{|3I&zSǿOf2+/ޯSwX7vg-x]~IU=yUou崟U=j&v]xw˳ t-vk<^Vշڴ~N\>FQ]3nk?}j gck I$5Sm|'u|_Mi;dmܫהbU(sHNJ>xch̍Ye_nvX_v{|_WzٕWvM4Ut,q|v -Keo+]ZST͖v.#_w-ye]&d65uXk!uӽ/SJRe_._W^uָuxgCMQ[ eVfk,+G_9O?|ZKkn̿7"aU_f LW%/l?u(]%#oG"ZFoWͿg"xv?hƗ٠~ighR,V_mMkdojgU~Z9TTfU[uoi: %\Jy?wս/MI!fWw^M,ɕU~UϫOk =${|eVm̪j&DmcmjCq*}$MI4[kFƗNwƞGml4ie۹|}1*|MH2ګ}ook>ߙ1~U6ͶXFEzt͡*|5_ըѪj:˔y#ڴ敷m_M&վZ6o]LD˷UXM${Z2ڭG09fڴ|ȵ ʨv{ |Ҳ/FuTR嬪̭u:myvזNe5x-[+,ȫ"ȿyv/yu{7/X݉~uu~V٥Ժ~ 巖_{u~kҳh:߼7:nۿR;?xcmimk376[;9R{_6}[RݝǗ,d+Wk/-^]%>chJ)ʫVVZ|2Dr?%9M&PoojjuZ`jѷb ˲Eiڅ66ͷr$Dj)r՗/Nk}ݵ6K[BlF˹Yv]۫g6}E$r^2b_Fy6m_]%]R_mn۫R[;Z/>k|^~*\v'e?-r/\mۍmuVVe[Y?¥&z?dowml5jk i[ʍWfoEo˷mUkC\-FeMkH~x~UlnYVHcUrh-fݻzt͹_F^rMµbWn֎&ӣ)Ujy|@~7դּ5Lۮ,dS#y^ =;[>y7۾yo?I'eդ{(fk\aDVQyOš 5F8>pI_v=ݮUE8((/yY/_-oxzJI5\2ǹd󚫷[O*R-_Ē4/#+n|r=zYR]ZoK6O毤&/ݯ5'·WO-z&_c-3J)w2vݻmLUiW@Hlw56D'ަ*W$W6ZǟyoZaY%2v {浛͸Vfo+W iXY_5cnWhq؛{T){M[+/ĚjI V㦯Y55[ѫ]hm6fV_Ŏ",Yl|ͫ /*_k>,Zlqcxn3ڬȻ~VowWڕ)odG#Rf&Զk}m&ռe]d3/ow+W_zGឆMjVs}fi5k6[=6}Twt I \|lIw)X2:m&ߛ]ٿ}>FtK49!}˙vEmmfeoZ#goZGhKf]7 FߊA6ON_fr;loUoDUZ(;yQXku4YnoUQ!Z9dfV_jLgIXVKXYw5ۿjl𮋹7aۖ dUm-X]~edjto.ZG7agT\iZͺUZoחuck}ny/Yﭵ5n^w>CEԛ=UirNesj)ϦKIV̆feM[{X_UZQ'Qjo&i/VᖾC˔̢\ y#hg6ܫ+K[QLSFb6۪j6mnhj q[ڿ%fOfVk't%z߇~!5 }RZ6znm|[~y˭AԮ镛w.MvZ1?9Jytػ~ j^XrŶ?dޫ%X#W2vߕK j[̿&s,]]%V7l[y]Z涗ep0ōĚMY0B-);hSR6/$cM ݭ/σa֬_٬z~ỻ1|ˑv?yk͎:gewIԠemIck=J 6UVenۿUV& wդB4o65o6U,&$ia5$uFU&k32Z0t6d?ٯAH۾o+=5k}'|̵xoѷ_{ݮDM e~ޮGS /?TP/rrǠM ZO6jlU~ި|?+.͵jK|w-|e`¿?G_kY~F:,nk{p|)Fff_~ej 49|wucLTT7>7|g[h~tv75k/n$.ޯVU4ގ_7ic-w]EWk%UJ2XO I&k|U PXu"-/{akxnF_r/f-y^MvF5j믊 ?V4-`mehV5Ue*zG8oi  Y~uZߴФ#%}u*ߺ~y^E.bueius#R!ݵ~Zxy_׌ V8=ևYcܴoo+zNV-t/˹~ ѳ/ޮK2^xJ 0;{O.u*^{#ujrrCwm{XdYaXl۷Wqu>I]EZ5I-}*ҝG3/P~Fշ1"5?Vݶ|}/4vվ+M>9$_dv)rĘ4&Vz~o4#Y ZKY?.]?ĚkG5#f_/rn_^:յѡBf]v6<۷w_e4'ƒM#6ջ6eoe*W{4wLwMmrIyoۻv]A-./w ԟge&]U[~jyX%Z[|_ת6u௄:cw{nU '.c7R!}IPn-n|]YW_4\y&ּM״vu[koWmkSP Z'ڣv[߻[Amsv0eZk3Z\mV$jvD]]Ii Yzq}K˪rTzV[8aYV^/xuW^ ~oqgƲ]Z'53 wZoڤe>(^I`g[.JVϿۣVV#֎-q[k{kxԢ캊m6Yzú,fUV/-K=+uJ_̇) QͺKn6;%J*tV7kq*ej|]%Zjw[MJo-mѷ_ݯ7O-mo4ٙHi#˷_vAkfem7wuyuuG׋dkx&O֬WY,ws}Z|yտm}3vۤ~5⏇xsAkqwtUel٨?tR?F~[ ^oCvVa.g.S8Sݾ׊״5Uyowy,x ;Zֆ$l2C~ V:̗Z:T=KM&6~>}Fտ,&k>ii!o,Yw+2]g=H9|%g1t۝>8 GYYUn_SZ7A-犼9xqyG xۤ:||2˩5šc중~}._m]h,+{y mmcV۹c~KӧTyk៊M|dnju|eԱx>HVeE~Z+P1߇&Cmմ3B;ɏs|Ѵ-|k )AWh]|5N/dwݍ$&|۷]X3WL3 }+kƟE-tKhg/.V_ITRVlzM*y5D1Okoq&f]75RxJvh:=חyo-wU,/i#N2)=nݺzjmr7t=Yc_F~Ǘ_>2k cn˧'eV۹jV1diK-x^\^k~n[-^?uh쳶%Um׺|=n.jvn$l{cͻhFԬ.o:O7vV]#S e WZZi#o]nM96,lG[vߛrzºmAy W 5q¶ד.VVUo˪5qi7ceߚm[$no-MuoZ^7D&mg+.fJҩ#isƶ6:ۣ&]G6U~>]ׅo$Ei6w̿-}ogu˫(;[TPHJ{V[Xb^"G&po䑤V3u,7mIEG⑴=?E_B }OǓh fogfw+2:|Gk;/̍f_|^WY{--ek5]y6TFQN2.^N7/-?v7U_:)Z]gxZ)\[nkoqfڕUw7չ+]6k8HyYUcSn+'ږ;7΅v*zV Zk3,řvv(ӖO帱ZEmtֿ$^y(}m|!K}".|˥{do#Ղ̷Q/˵ڬB /mKy<ŋv8/ֿ㸒Uu?j~Y7.-eHԶE$m5&[rmY"#M"3xφiiGQE^ ܏=']_Zæ&O5شz# M>T̲Fdm^/OOaXWaGi}V}W|[L*՛Wzm4oݴ۩fLƿWn21<: ַoJfs/ڿϺiZz^ HͶ[⥮/t&IfX~ה۬m_nZ)F<1|"V:}ɵm_nmU}ak+>T5aC/io_uiWfV1_|FEX=ʶ$_۫x֔}Ӈ`dݤ|[$w}Wt2IIOFkvc>̻+YeY}yqp4*5bVngB+˵ndveܻ[_BTϡO:ׅ#om7UvͶ=ͻ]WG/}dhZFҮݿw7.<[u3LͦKϩ-{jͻo\]9m%̍n]Ֆ¤qLx/zOt;=BVfVHf]ջ}j÷-ׇIkheXZe[eVk߂6,񖞲6oXʲmYvY?]]z\h:4w]|ҩ*/)N1y\Cvu6yL834l#Ɵr/<cDcMcRU.٤kW]kGVdM;Ȼ~HRL[Vk/$O_?E_~fmzIn]v?AKސN>O$f~ jMGƾ㙴7Ktpn'oW#nִwI4,*i2V>bm/Wxԇ1,zAul{[_"kYoomjq }d.Xt_{g;[_ Ӯ-[+"UycO6K +Ǘ|e̍r?ȳCs7.]ۿ]4Emj-Scm_&Z%3>xݯ5 u #xΏh^2q7~Y呛N֬)7yvUZk , wݬ#,|Tyi 6Kkj ھfZ m.hf#'Z^!Ӧ44,y/hG&:]L.+ׇIloF|:{e-Mx͸4unZ7LkĬ.涒.-J)><]Io\c J';nwb#(.WgokmO"L k>-IeVf#VoΙpm"iGԚ/Yn.#HUwדA)RfO_ Ω(UXmk[$emc*yky45k[ynߗwOVZ6=IY1V5}_|Z)O'T#?oy,ktٯ[SO,Whesmo7h&󕙿Vf74KK#/̲I'w/zn^yyID#P_ kiɵfnګWwZoŞ<ԼaMY^G٣2ƭ$ʿwz%Z̲iRms>3*ͻdaoxd65Č\'->]]9l'&qIxz_nuYjkxuY#ee[ߕ^{AI4:j"ŶI#wUm5/[{ZV+<:,2,͵7;~VZox^.3[GmX>hff_w7-wʥjRNjq#ټ]Cz_K;Lky#fhٯ[./R;}Z]/ƹ^k2HȻZ?ݷʵ^^ wef_k #J/0|;kE6Qύ݅wXdmkߑD[,7ͺݣej?U&mfe[>k6e62̻~_ }AkJGlv6*7|y?&RO5F_2ݿeZHw4Lۙϲnѳm=uxTW[.oc>O/d>&ܚmḙ+/V?;H4;<̭^mt{}qCuY~eVXeVJ/_'ȵiCl3kiݿun/kM.~|~hW-zhVj5uo[Kf͹.m̊FR){毌4oD]i3me]v\lMG|B. J*Jn-U 1*U}e4.?zZ66w4Vejݯ?d[YnYfmS5>`{wō48mvoݷ^/xXhO^Ok9\nۺ9~]}!w|hoC"M+L"ʭ*۫Kt{ ǪKoyF0Go6-+|.{hQUڻUWV:t9ҟ9qڿ"~hZou~|@u~&_趯ɿEգ_fZ^_tϧm毽?ؿ>|i =fS@??? Օ#i/y4Lۡi?ʦKoSIWk&Kڭk*AxѶemvN)FD=FG ח#j_滯 T M"d_ =\L$|۫=RݡkFjUNGiJfiY6_|/gp4Zˇfuxѳ/[M6Yn_/ޯ7'\@!_yheX~UT`ԗgʭ]8~V&\Hu.Yxگ5<97-;nЫK^ $5mQۮ+fi75ͿV!)Sq jzeq&O̿謝GH!iQ$ǰt_5xu 2KXZɎ/$iҩ5 4*)=ͫ?W~Κ$:c}hYԻXTfP񽯆 oAUh9fmp{υ;ƹ҅Ut=BXSwmxz8++-{7U6W/XjgĞJXǻ̑s{kun|Ekxh6ejs&ꡚMZԗL!/t}?\&ɋϓzm_n[6*TouY[W6~Fk';W//`q_dIֺ; /kxFݺFեW³OUcמhYxKVV3.WxN%/,kT\hm#.V'W)Ո58-t淚Uv EoޮfԯdX![߉O~IeN3Z,&܍N<+}J[o|t錹/5/5^[-COVWWKV/L5صMw/w|:iGxgQ{R|K[1x^o.Wh~o^k{ht{_;hQo@*mormjt?zF<_j[73m˹j~uy4mYYYUʶ&d*WE3{{h]mrbɷvan+;VYZoIq5~o]jQ }"_}JCդmY֯o|;4wmn?[W燿|#I,?]Ry|-HߡN?Aa~/_ILox]M-9t2W̑CCk?Ino1vj&2y$SԴf'+,^V.#GexsSY4MoߖSAhmq^HCon>=[Ӗ uIeJgK>Y|fg,5VMjae5ӫyگX~-xWz'V[dXo嫎\ ="K6o⪿<@I-]F.Ǚi~g |۾x>~,TR9\R0߸6Z Mٕ~^^*/htR9_Y&]в*DQƟudf|Kkvr1Z鶯viY6*_~۴w E=;\* n?Ax B5XnS})󟎼3qjZ-Y6y~Վ\?ixnVPWq*ۣm6ZijG~#ؾk MEc>JU^wP?撾K曪i\kz|ʿ.~\_ikA)6ִN|G,}-/Z6}aķ|ޯ'?+xOiRjalmnUЖ>?dfHg|i z}o&m?AR2>+oP__Bdw/ޯB{/LH[vշ_3f.6k;ml2}oH7]zז1g}ln_U9e^Eۋ[⹷6H?񯌼)o_i2,&ei6%,sjzdފEoMդ**}VVn[y?tlG\%AǻvQRݵn j4qZ?Qypir6U7]RydaVtK&{|-,CMWjuM6lj>%٭iiv,R|'Gǖ z5Vo$NS֯$_ۿOn+_omjJ~4ⴣHjWW*H V8~x)k~ ݆\]In%mVE__1NruGFkn Xjx_VqMjU|kӵKMzD?fVIV5_ ɧmVxvYEW|y^x{PmBWxFū&{2[4{^wi+`W s|:QGc}R|%Cmedoq*ͻua/t#7 ?5 pS}[5bk(ǔϸV[ȭjߺMUEݷZ#PI5uf"Ho&{i:W6F{v欻6Ϛc+h^d39.1[rȿV|m..hOo+76OKkOmd|ɉMzͿP`[==m?ZwG]mԵFW ;]W_O1lup%_ٶv|B̖ e,ЪYʤ3:eoz9&yopmfX7e;_-F_+]zk32ﭖMj˖Q4=+~CbݕH|s [W[<%"_&Kp׋'de>1i:R}VVm<Ѳ;>vEB^x6OWm7=M*\@$:L1Ɩ*~-G-qťI򪬟yꦥueNNhUjVt_1KϷgC}"?gf۵kcğm?VmhܾgU>4d]*Voqϔt. ؿ_)HwucKѼYQjR".U}u VnKhwG"͵k_˷Ok~m{֓t^>ٕ5esK:g_.5kG P50RYcofBկ#ܿ.fTմ{ui._~fkx1/u Eoz=5Wryϵk,7.I7Z:[WՓouu}MUY;ԥ/x|Y~YUh}IhzvI!e`?[o/4/|+}ګ+,3W#ǚ.]=خ魠f^nquk࿴1ٷ]~]i_[}G/F˻jA9xUkUV&eWiI&#}Eiv*j7anOj+SGl./Lrnʲ+kQ̱_Yռ=r}۪(e#sne^/Nr*M*Mqǀ[WRۺ'Lc)|'24ۈmiI᯲>+\2XU{RH)7n/hW$yu~Zϓ].=5X,̿ykx22)DcѼIojV}jе_,/̭=Z4xGMխyW 2 _.n_zh fe" >֫9_fGZp|K&ǴQ՟/4k/|'}ګ+,3WǚI|ɭٯlqx/,kfk_v<i,~"[ua ZѲUO q,kc:&ee٫z_I&Y6m+CjgaԵHc?礕>7)\<_]*f-|> 2F_0v_{Z\+yq\I2FwZ }ͷ^H9&X]F[fuHewV}gL 2H)vKUzspۺڢ2k_7,k~S8cm?jʵ G Lnhw5zճg~jj4vmMo&0T-e%jMY/5mZ0Mtr~^7Yd%ݵbT[8շGmZt'e]RhIV׭[gzzּ?{yd*zFUiJq63W-XFNdsz^6xIe{LJ'\c/U95Vh^~WRy.+tӗ7p<6ZV+ ~#nI̻Ҵ5ٚVI'/2>=?j n?ezkL yʺϽ7MF]ivZ5$mqF<:/t鍬 ._VtaZwyCס֒9"W4QV4oj׋gVo/0wt[eԶ<{Ws3nw-t5lv k^5y6urʿmشk$n_k#5rէ)N9mdmusqEU-tf8yo}m[_/*1ow_ldjs}KbZF_^)wj:q_V^uojpYI.棖_ .jZlW+}M+oڏ*mRpH2ȿumT~)Al5KEi]#GVSitzXzPm=LپUiU7Vׂ$erõ}֮ծ$KIۻʕ~jovsH2ۚ)CFvQkx;.֓UwuOf6rz%۴4x,*za?|E#Xn||1.c|I{O[ΫsE=5{%HdZ+kKmikܺ)#ng=Dco5zTe-MjP'vs^5@f_^ gtʫ~j (;%gL_XG֫VqWfT\>VϢR5n&cU- Sim6Γylj4bZٯ%XyrU_7_&zz^tHmhwjJQ5>SKhhfo~_v hRKulʪ[ZZMkMcۺ&гī6m^%]XF21txF_& BEjčK>dvz}C7$ }꯬Zc5扙~V^~iy.+/˵ӆq55Xfffk§gi[vs2=©]jjmf2ZtwnsG;0T!e Y咷isZǙOdo1ʵjV7Zs8|e5wRƱG3mcURCqk+ƪ߾Gw惥οZE71dUkəUk)U.1<Z!hwkվ9>ղo~Rz>˦ڬm|e#(HSjKvۦ[c⫕/fY[#5:6Yc۷ZOkNXsHo,7˹[Yji%yIz4J2Gk,,HYkѼ;RѬ.iy~5U*TS:!V?Gu|KՕ+v-4q~ZxuH-X5slu[,^HtMi*~>ڧ6XM_WQo= *_T{n>Y?_Kmv%LJ7r[6/W|=EXmY,wḺVݮV7o~7ZܵF6EHVn5 wM'ZuaF2:kƗڤlq$cyJoۍב\z^[=Beֵ.6j^CsElʿ^_ʵ8Ǜ5c=Bѳ.ݪ._ev^v[;Veeݵ[/[Uàז6 so.u%eܿiRN}}+YG;X^k뵚Eܿ5з̾vگЩѳy̩v*26`楡'^=oe>dR~jE~to]V'S9kxB͵V%[)ne|IoOw OUkԴGupЯDJ/XJ)Q~'4C}{f-mmۙ\neUڵWǖz!mZ2un!%({SZUvj]-__PԯjvjJ1iOv{QP&Hd݂mq$+fo2IJ&Cƞ:8uz#! h$1ȿu?5} Zߟ?8#]^*/4JV~Gs[Ԑ}ؖܿ-gkީ;HX̛jlYr~n7FjrjtPΞfT"Il֠XnUm.WUޫ{uȼo-e]bKp_6Τ3衃t?Di.6LUzk =NMY-u 2ҫ$[845p=}K[V>'_ɸ;jYU÷v29Y/ׇ|9m{uIyVUrMJiSG" WLou_*ղeZ4b7W$_]VR7cJ2 k*j7ioF7C|'I[ZFdž0/vr,r-]6%X;Y>_=buZ vޯ$^~)m?AuuɤforO$HۥV]i7S^c8{?&ͦ}Xoڹ \xėq|4\IZj񨶽gs6d[/wט3G95v^1v61\ۿVWd#JđΡ?zEjg7\˱^S얓Sџm6d/ݨU(JJ\ Z9~qRBr56tT=%c7>bu"7@6ʒ7Z4 f\]6[r ^xo-n~c 3Яl1y+9VM;rۼ^n{l{ =/ yzLX֩_!`JKu_7zQ8S[xDJ`jۺSPm4/qaXtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/tEXtSoftwarewww.inkscape.org< pHYsCC,iTXtXML:com.adobe.xmp 1 2 3 0 0 256 256 1 jSLeXIfMM*bj(1rOiHHwww.inkscape.orgCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/023260100fotocx-25.1: Crop: width:141 height:142|fotocx-25.1: Paint Transp|fotocx-25.1: Rescale: width:256 height:256|fotocx-25.1: Retouch: br:-0.18 con:0.00 sat:0.00 temp:5000|fotocx-25.1: Paint Image|fotocx-25.1: Markup Box|fotocx-25.1: Markup Box|fotocx-25.1: Paint Image|fotocx-25.1: Rescale: width:128 height:128|2@IDATx;nV1, e4 UYBRD@J;[Kvio!N@@R&KH%RHh )4X)?`xs_e#MSN2 |javAkh&@}g!E:=.v( ?F!UZ '<m0WZ LFme0)B-H&#Z{LR)mc'`w5XtJ&4'`ˣJdzd^'UE&V /Sm3sE0.VߌI?( *,//ʋhel1%_#xWo6`0&@|b"&Y=ݱ["J~2T_~7v-Akxb@c`%OO7_T}Be0DL~=Q"N T#zSI{l-fF^Z JWF^3qoR8BIX,~sT{ ,d}ԛ>9_;bG~Yl /Bf74uT3z fl%[ޕYP(yya/m*MUlZQ z`]f#WdFS)Õ;@OV+w$@S?\Ksib +p(p(p(p(p(p(p(p(p(p(p(p(p(p(p(p(p(p(p(p(p(p*:֕(   02ϺO_ ((9om񁿖?e+.\8'g w~Ra`;bX3Bd#PPp@8(+p>Vdp=@p6 - cgـ,v`7 p0( ar8*  ^UN IvS~?`W)oaW'`Wa=E_3O%j^=VOwFzgBZx{r`* :=4m[O>"uWN! hw@*tH%0Kޗi/3|}_a}yC^*XKLFh@Wp4<غ羁"t'Prl |DK(OؚvV2L>`Hd2*s((Ĩ9aOwLbE"j*@Dl8!@DWI&#>r-9OP%zIENDB`fotocx/images/select-area.jpg0000664000175000017500000016746015247006660015202 0ustar micomicoJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?" Ub T@(((E!Ͻ/C^SU^5;6s}e=0xjQxW注j}GP.FMJS+UBH^?y3qbr}ZjhbdldFk)Puu&7vRM dSpg-owgosjArVis(@=<LMy7~)\\viS>d.+4ndd~t7^OP4*C.%+mg9ǩ=)c49ּ$:q>3[fdg7.ۏ̒1ק5G kޙkKhwy6H@yhњ_wa}Vmܳ`;7sߍO -׈-tC^\&`@&I $1CꙤy_"j:׬nΉ[}+YȤt%\S<W]kiuʷD&^ۉCڍywbKm'hyd31X]k<1ZZ^:oCޠIH`rH_í7Jò_i~.iyًK:tOZXrMfY[|GC@iQ"FCwZ^ 0"%im==o:WçԦHX~yYDaH#vB`{vj9fTן|/n4Zz{IDZ&H+E=;YW sVSJZ!ʬ{>lرۃҁPIpIx[K[G<3a#ut{Հr8#iPI[^ϋbB/4\{kj2hrp9t3nlDkhBH9M?݁zcss֭-8b?ּwu kps+ܞr?@d' qE(((((((((((((((((((((((4f=FZ+y9[i~aqM|%hhS|h|hhS|h|hhS|h|hi*7/G7/@猼?jWLHJt~\+nTէY*IW'$?Gy~.٦7O.mgJE7 /nxM08EC n-N cm+1I ' u_^ִ}7>*@X$Z% lgwnxM/ۣK x *v!LIPGĺƭyՖws >IS?$MP<$xM4Rh/6z{x-)3`۷gw͎q^\4}<9< ķ{<>@lŲm$ rr:cyfD$jX S?{4ox^$Mc&DdQTkvAK?K[MR%."G*2=kO7hGޛ\4IrFsaMUv%i~9"oR bip}Զd#%7uǧJOyr4>MPt{I'kh>O:R@=8af K&%IB(hQ@ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3ERf\њJ(sFi(Q@Q@k|O|d7Hd6k$Ypb ,q+gzgi%C3 }u!C{ AEI'[;4; R3 b 3+JMp'/uRht {In39jMƷޭs-^k{ .ߑ@\ \oRwwcy5$C΅C:H98'U~]ų>͡ tedB5 &[fZn.CЫƥk:nl41[{0Cg I3:GAE&kŚ4-w:uO~tga# S{˝BgT{̱0VWqq^( i+jgm_Qw!W=ѶW 4/5tOEkvy&YCgOs 4+gLϱd1}3ל(iyx+SYʥQjOպP#ԳErZWn% hΔms2a##߽u1hZ3IE.h%4PQE) - QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEgA'i \њN4v4fPnihh4\ƃtRR)Qںl_@^|c+[jpڈBP[>q4i [L\i#wB7Zғ,y߁u=O:-߭ڬ])8<Гj~ojrvozKwifctVL1sڽ3qH1@X|s\iw1L E,G {bų(iXp#V)( .-SPԯYH p5@bx}MlxBm@t nq(T֣.xkR:Gu,hUd*F8' fwq,idN0$]8q@X{Kojz=o-aG\ߥC}|W1 \Q{tڀ /9 mR:hXHձuF; vbpn qߊOHmj5o%Q9ۀ9cjn÷&{}i LJrnV< {M.KA5:b+FGĐ~JIkO߳W6w~K,EB0Py/dMn^#{}ۑ5j[=.m5:\±|MJ?0nO ~oywm~η[o3ÕH=3H}NBAEԏQڶ1C%Ñc'q7;[K-VMcMӯt+uZID{8;~OO 2a6E>{iJV^H=js=֑5)moc6 Mcž3׭#~MD KwzV4oy bV~x~v}9&T6j%u; u kLJ嘵Uu[%wR)8|Ooasp .+ 08eȭ?.c>&j/%9`q\ݯkmM Xa2ܠ:ּ#.\"ږkGo1I-0ސ~#jvk.VyY CP2MӼI{K5/cg H؝#P1[)j޻)$K4wwy!ݬ 2܏g%ޓ61yjd/gݘ~5hAֲM#Nҭno,mn.%M$'܌ֽciZ~ ͝1X;UllEV[J."]ƨHgF295O 'W,SSA%8.3ǹ+@j>L[\YH +ǁּEgYC]T/!8#{+B‡Nq\ZZN_1#l'T1}R=Pg $Kb%biQDd09#=jb>a,{tэ[qҒ2iwVΓ^UV;#YU>ץ!u/xajv4I%xE rܣ 2Iބ3sRE-ΠSMBH ixS1]sosipF# GZgat7U4KQ]IKycXm Nx"/]ņc*ůMyj] ͩA,7eIebR#z]r~-u/loRu+OcUee8yuߊo!Νh߈ouêY"2|T8F#' Qpu=+VoSxr` hew(NAwឈ}ĺ]ڔ'@ ( /Zd6:yٶ=IlL(U1DU.~ܷ.y|̓LcP /~񥜾&Ե 8i ;{d]|x[2+tD~Qm46rI=5mI:nmڥαoKˀ# "TI^Oͦiv?lWgvdqPN8r"!Feo ; j'$ֽ_3iyuOi2Gqt!G#$!!6#nx{Eցij346^<0X|s^|<&4k /iGFiV7 Am=s\O{hzfe4zk :M[{&P6g=Ns@6ikJ/˝-Σ\:I&Rr #>O6:u\tݻ9jn$& m'5Z=WRmfJ"kUU'FO'5[l4YSO,rUB 瓒h_D-:,:ٸYn$+qUCF7g^X'|*#c R891Qwv>Ϋ:Px&D؂ :O:g\ikUR)<321^uk}ko>Gb{RFp;=z|!j+i{JtR7m4d8~Pӓ@.> -l.dt O2Hd<`t#q{`  ˍo]լwFc` Pg IMw@ EPEPEPEPEPEPEPEPEPEPEPEPy'@3HMgYsޙIpErBExuc+Ju#!)8@?Z:Hn~1jNt=3N35wE=u=JK֖Yi5WU-~`xt$0=M"S󮦞q*p%AuSRG v/cԩx9~"hzM[E-KPbVR\GRV}%öY\m5؂(1%n ^1p'ǎ aY1Km}| XYY+gOEV|?ԯң74rydsШz8kz凈tӞJj~`rC8\bi7]@!ő倕 zA{}M`Qx_ós#l]*{rEr6 dagKOp]ᕄFXe1rh齨 W^7O MI[M=ay"uAFS'<}ڧ|O{ӫ[.mBO}B>;^RӪ{hM׈4첼#bm;rsO3Z^uy썋^D& fl`v7)ʊY*I֝Y,'ܠas@?l}K LuuUl+_žH@J;EJ@hwѼKi_xOg]ʑ]{AmRL5)Ԥ`P ۛp<8EzJ8%/m<ks-֧jv˅gªr["iظ'ʹ;1t=4fAswiVmeo1X5$u}d@a*yDwQ@ ( (R[Ԗ~-Ey?Ŀk:gZ߇M.7U0b=\ڲjd?dWc> UA<(޼WtQw5ֱXɨ)6TJ1aG!$/$r%ĉܫLC9,B3}(Ӯ⾲bOʌAVycxU<'_[NDK#HJR0c|zIҴ/|<ӊN+ʄ,|gi!F=E4X19'9' sxĞ.|Ajp,#AcFv#@{Gu/C`HIYVV,G;TqSk>qQ]lM$DPpz*)#FyUOJo.]5;OǢ^C@bim9XބN\U-m,Ïx\q$qR<] o4X]Z9&0"NO95>kMgw!FM1SrP+~<~fy$~b"hm dS$Ş-~ZAqۖFUNHlb=)s^!x_+N=^L{] y>m(c߄|U/4=}S:uHutfꅕØJ1prA#@E"EPEPEPEPEPEPEPEPEPEP{VK6ps\4H+J< BO1GO?qQER ֮ hnŚgX%|qx|3g?t?_11<2no[M5~1~5'{jX\5&;Pn`$,2323^yGQyG?&:桨il }+-.7!ܻxGmhOjznhDA(I.8c]&?Ak?@#yq _w,~dOxy *q3~'l=3ʃ%2 VyY]ʚ{`W ۾91]n?KyER\|4_ ͨ諶aܲW(IdFzQx;ROGkڭ%ul#bMŭ8ty00qPkІ*?KxOP\m?/?/€,m?/?/€,m?/?/€,"?/­Y3P4zs\חUdh~5Ũpcy+ILGA>Hm\״'u#lt  O}Rγ"Kyx"2!#IbI5 L{P+U Ե_ G^nQHl} )/~]x~>{o>%1` @ n$]~OFGUKGX TLn}޷Y5>ˤZnu `m7TƲJ ,GL8giZ~5fܺ> "fZ\R@kh׺^!xePpJ <;឵{oZj4n"6(Kg W?/'q|Rb8X").%^v1B'999Ҳ| )u,QZ"J鼒Igקb84l>&x[sdmZ*Ԣ*bh c>~Wy$IK|MT|꥗8@U]enDnO'vpAzMΙ{Ő5W[?)3u<2xz3֗i z⍷KF <7~%_xs\mU6ཪfߗ`#jޏk3^1ޅ;qƯC*MIF9E\*@ G:!wۛ~aU,6ެ@gh,9)ǷZ_uI85[G%i-J͉c8 UOu{}WMԦ:M̆t +3!JMFkWV Kl"+nZ[*Վ1=f 4^[U(O^i;X zS0wZ7O2aڸ167.zfK&3 <6/$GAy^GkZ۽'Wn*̬bjĐx6ķ7V2B/専+V;+4e5ZW5[{u;Ż[ .~qj΄8u1+# x]Z5XLO5!]v#_@\Li5W~ּ>Юvtο2"pPƹ_6xj;E˸s4gopF?dRHsּ?]{;xm8"w4`3e=[kc!]X]Ko bz\R8ӁJw\o<%icw}aEd_e@$kmbOR+jX=ߋ|IiW6֚dFdpNpywQzN.='TD{dES>.O M??Lk8/ݳ*#9}e^Y} {e}x ^Ya䃑\TZ4rN-%A Jv4 ܊3^aw]5{YOdl]ukv%PCӣ(Ӥ N8V$GQsI]w%֬4tHBqxf> a }k|'ͬoNnmX$R nzAF:ІmQIJ((((((-FjK@Y>$-xcOSr3&rN:qZƾl׆.7 }e}Ra&r`&E Ɲ`W)ۍgJCug o%HA,R#&9x1^YK߈>6S𵔧+Zf#B0QD{NrzRZki>ǧ,ue1p mmʀ}ω41 $:o8ڣ)ڷ]Hc}>I.R#!#?|Ӧwo5 \2t$Ւ?y};cM%<7 MVF<IcYk[%0IX[O_da>b^'yW⍈EnW'*"ڌu~@{Xo'Mkxz=9wg2,7g;amtQS;y.;&ktViU`g:q\rSB,$,\W6/¿wZյ&3@6?r=4~ -V}3>d+&WXӎ:)x8x4Sot`7Dy?.텶sxhv)>R4$}1+p>oƀ=={H,,^HR\;wXxEԯӵ:]#ȝT}k, h bW3 U 'FT3o2c;r[ ~i&֟e"3;qӹK,u[4-m\[ʲ#`RA41u&;.N6wgmbm'˹wvOd71xZeI-=&ŭ#+n*Kg#ngZE((((((( Y{6>Cy:Hc5Rq qs \kLBX#cp1kot8潾ٴSd÷nd\a1WdY# C@uho$[TXkɷ0v]AyYx*+h]k]kVĊhY&#yM:{]*(.u)Eլf>F8^:mi~ҠեV!8֓Iz`9ZiZ\jr.἖tH>FlbFLk9wZ%)éY8-4i50kq q$z<g]'OW+u14Zak?ާmshonS>nrEEx]i5 ^LUuDu~P^zW>]6ű& 28/Iő([>ȣw\(J< ͤjs={w$sx!cV-ojw1s\JjϿc9+iWQ),oo_ޏP8~Em9gojڜRN.u5'+A>I;=YM3Z ?56ǽctt=aݱF0pqY˜hsG[RFY,Lx؂ 66zNgz.;,xKeev u7j\#"6pJahnob_~@ۜdt$1 Y%Ç`۶!B\kȧdS9MWVwiwsap#,#wZl-$Uar՜@"uRd 7s+Ţ=Ͻ0fN(t -p'NG@3_IIfߦ>w1ߦ>(Z/|Ckaֶ` $ȫԓW @ jKQՅq}}YuI]2MIX{X`Gp?:Y4M"mWXӬn&WD8 A$~̚}V/i\Z,4JZ z@9/E[gRٶnX'bA\?eO?cwZ5hԐɬi}kd`qz}M?PP4[qr#I+EIJObw:Ĭހ4捦^\^w7LYWxwBFT9-.V{MVչhn"Yq¹xFIot)A4!0%v #믯l-6ʦI"}I{(2? hHXH{dQi'h{MZMm-}V`.68*Í䫯&+3xs籫I/jb^la۞fv>zUNccm'ކcU>N^6xHȳ4ieH,:iMWt˫ U-%WJ@3OqYΏ&ķ7}#N^ [T9 3 u3k+t}=tH%D )$c`Iak>TբyA$b&Y[N?Jڦ]xwXѮn@5 4FcZoL^A1!vvn[y>oq,uw7pZS<ȀR]xkEcӮm6O[imQRNr{Sn|]k {Iėr`bppkZxah%IbC 8 PtM: 36:=7nϲ$ !'D4[ml[yKz@ҿtTғS}_Okf< =F:uN4KMe"I5K̊)ݷn PYjiYZڷaeBA`Fj=*+KKHtem$2/GEI/^gkIM}KFJyU%f9A$78+k}:]4SiٯtM>d?Ojg֧%gX`1*;V:tNDd6 .{6p}&:iZ{H0mlޤehe}mXsRjΙm-7#ȿhcܩ7#'EQj;K[lRf$F KYƹhΧedaVo@XOHN nU;0$9P _Bja7P 0y<~޻szgCկ&6L]$*GuKE۴Qyu KXdºSyX)=_mng?TГOO.@A zq3xMv\jV= Gio-F0Eز]AiZ}sW%͍gcăN+-5xu CSTXD1v(Fr03}k/b:=xU`ڃ-[qd~04htV\i1]w{ @ ;'ZmjK-F}-]Pe毭M{k9E.F8!vqLINj0F+SKMQdFWc$px݊/e<9s}silL`BTHƸ4wZlZ5սлύe4p/ Je8`q@׉yKHn(Ȣies;Ȼ¯@PMu Xh$0.s85_XE&eM,2XKTaKF# ;O[M*;)g64NI.GxKZVYx;i͢',-<~_7^'H|Mut N+F,,4bĕb \zsuutYzcܣ[(lvݷ? K z6Ygnш܏*,L0j0%PIɮbL*tlGm9R.ǽn|F5w:LvO[Zir8m+È./q:m0OLUx~VG7LAs: S ǵ{Rsg.oS*_j6vNdwQxgZoM_[cm b`# {V=k Ļy[^BFuvbgTQJAx!(wT!rJ ]BF,Us5?!_fRfjrƗ~/CT5hd?q?Pk׼.VTѴۨ#$t1ezuQIY4۵"na"T˖9fPLԺMPi^i}`:Wڴ.MflH $tմ-3YH56PV;USӀ>`l-L6n$C  aHGLu g|l|AFQ.^o9Iy{Tv ҺGa rGHٵ yapvHrWx{E!/t}6P]Ѽr ~6IX0wn>0 PxgoEO^/. @g[Wvc|*=C+JJEo5HaV?0E[XZCp-*!S`^ ]A;n6:OO0K[*:#DxYdq=<ϴEJmi#◃MMѷ7Dyl?.훶_?/\kZ: >FF\IU3m{5jZ]hLW1,Hp{%Ex?\}wٷp(~u͐S,7mv׵CigLNM*SEI02}:@Ѵ:}:Il'e' 0A@0F8#4^CL-A/쿷f~vgjNԴ;;h_ x%'EtXWj5;8,-'O$q06\vTHhm!kS ,ј H2Gze([Eվ 'Z+jm̎pha`^uRO ;O++eѓ].#\ kIݲJ[Gm CmpƒjGU(h^#־$W%2%a z1{/έmt./0r[E$JAt!6- E5ז<75Z/Qiri.YVLKnL`ߚy o,( ˺:(tM3L©,89}㻩^:گ )魑$gi:`SͤMRY[ dê,(;-88WxtM0?C?m^.jcgkϲ/GgnyqhyjEoJeܱA Qy\tQcΗeM<`+(I>\ߙ}{׶MZwow-unC3F n i!o}%q?˴mm1g?͡'¶?ن?h+ߓ?ŷۊǵ(<1Ѭf-Db`OA\3:}FQ4+pPOj` A ㊖}}0ZK ;>:qw"VjS >owueҒۜF EgEk> Iio<oh*P·<;VS?K)|dld(0˞q5}HIѴs[kT''%@&>qmaSd߅.dVBdjϟͿޝ}OeE-MeQk M~<k`s@((((Ϣ) 8(82b+:(5 ,;ƀ,}~O" xKo}G˂ebJڈ~ކ4N+Ѽyhm7Y8ZeܢD6d{R6&u᥃C_5Y f@S gG8rD#dWh׈+M޲4(x_+2A=MRNƫcr$LXX–pFJ?kf%LJ}Z?ҿ բ\δl$/okNzFd րԖ~5%ߠ })&>0Z]x[.DҾ_%zTZDn=Ro"3,-GS;X>X\xm\XnʡrwcT-n3~5}GMC]b[ymDp^36ǭ{Z˭vw]rvom测9}KQμ?wWW/03yۉ,ç?1ӊi-wEqP9c|!`8ۊ~i5=gQuh.&L&ٜFG>$k,bQi@#ّc$974BYgJd sӞxz^Ñ_xP70G,J^C}oKt)qٺZtx,[2Ns7vN=y ΅il5#o0ɺ%H#cr`u+ Oڟ,Qb3}~uKv])՛>_f-n{^ uZ@F2&'@ַw>[mΕǨ\ighH B d_g>[k?>$3A{o8bGl 0"=HsֹCv1j{Oζ6P3̲6ÀH}y4cVIgZ귂+ْ{i'`LA@vsw֒hmGKԵxnբ$|@?fbyoWw]/A@EnYOB?:{{xkskLnVL6XDҾ_%ƻ⛏ݣkdWڼTWp<-ywot +BNKW* b,]b7zBGQ@QEQEQEQEQEQEgRD=2q񤓖KVH)*?EʙzvRZν {ȭR9"x 6=GZG\6.5M#T"dR#Ǒ#H8+g#4ѸՑ7h.(G{hHcRd}6cZaO5ŌeC9N F9a4rK?ϬizVqͬ 8#em-ՄZ.ks}Ȭ#md'aR)_8jVZjilp nUH<ǯZռ+.k=Q qCc5ĨrcF۷Q-ym}ZÖ Z 7E#k#$>xKh1j1r.`+;go$Eujk{lH[_5B o%}s{ݟN{lڎh^eݒ U;'ksKB@xKXEK8/4fCٿ9#; xf#Buu5(e6񻍥9Ϳû>w8:5 B񽖝,{1K #&[]:eƚ^DҒYNT9סE_:曪蚭of3Axo0 w'+\jzFj5{;i-gy,ɊtvV95E>E YVWVuw@t^[\‘ֶbշ rr}ihvsZ7e-f!D2 47wZ_X[xjm#W _F%x猢ݐrD/zV g4W7Wh0&rvP6&F)3LGڟD:8}ɵC)8bncE )зc|?M-XGhLG5뿳+9ҧPRXU)еc-῅>إ՝֝zmQi='a;NBN1]N׺};BSlG \:V@HӣSֺ$&e.T$䓞xCujw*60=A=ju4it{ٮukW_KWVpQ@ 9b;4Zn{.6c7bX-X +* A-tt^5Z&Ac}5hQH+~_LV}q\iI|T}a.P[\@#98$likBPյ+Zͬ'^uT!Ba}[b{o,weM`8E*[80޺—r|Pi? 4:M]S[mtac}wAl3.{b?~ƑKczR{(O_ͧpO˞P_Je4,i}c(xKA r  Ǡ3%mzνM!S#Fc<(zOTbo}wmNqyz}?u N]JVtk똒+|r`o8 0wu:,>c`o4Vys@a 9ֻM7Z᎔ViR{onAp:@4æiK g=ݫ.l m˹I=Ҩ[,_XºBmanR 哂K`i[Ÿͻg-MayRum݆3^^Mem#VPXͬkz ܌T|D>Gܶ= /@" d@ϥP~>3\iKa*jX%@ rU J gN{Z˷!FVN\P`p7?rÓʋsqlK$3)]˞p3@*vz=aAs"H?DNT}GxY@f}J_:=rЉM1_z~VxVo Eq+OY5jFho2Zji$}zJVGW[xgASW"ګcق$zV%׍oR/"Hj.c3 _n~o=>fh%.C($nI2=+S[ b;t lw}(?þ526Ώuon|וIUm6ˋ-o9_[m:(TW>mjO SGbҍ2OO> >Y!}s)|K6i}i8Q2ʏ 0sAWsk=.w{ YJXsU} kfxͼIj!++g>53P^7uŝZvVݟ(i7:co1nႰQ@7OJquY ΰR˻b.|_Y&G>-I;]X9ZŬiKr$T <}f5/[kZ奍]iiEq 6Фuzcd7ĨDLcq{K H]sHxPKoG=43E*Cn=f(SOs3,Rj 4]:ΧMut,tRC;Cp ?Zljյ;/SӟLcI&eekOLl6?iTmR>Ϻ*<O|+?g.&A3""e7gsua >&GZNRNe$R4'XL\T oraB7RwnSX]iaլ><剋!cg\j^𯊴{}f&ÈԲqI hSŽ\B96Yg5yup:R:'u{KK]d^H*g8U6_yJ|VG} H!-@~"G}mI5DAi#&]FC>Ցk:Auug}cNJ<ь| '#=hic^h/EXqN#- sjX>~g~5c+K[0g۷嫩xkz~6KaJxQN09}g%J5=GEE.|}o1 &5ـ'UYjXr;.|wm+_׼jvWwzgl,XۂA|>>k~|G{\6jx$1mF`=RycV<$I׷v1]iU H HSᾖFcgsYtאE8iW $y_{dĚK'VerdPpx9Ђt"<Ý/T4:G\0.:(,yc|=V4SbFw]`IkXʖ q9Ko[^Ms_jZZKުG$ 9cQi? t>M]S[m,,oİZ+(۸.m(Ϭ.n4-:m8k~6m.8tY)5?j#,Zyt\Y2~pp=N{:EƏ}a4.uGe 51I6!VPյ+Zͬ'^uD…Q~'n4GuZR{[J8/9ſKBrS<`$>BךՒkDbi.@ 272#A k.y`:SDWvR'#n=mnoQԵ;Ћ=0VT'j|UTd999?5 _d5]iXwH"<)"x؀:M[Zu/X:ظa$[ $=J z<xE M&o @fRc*柦x'KoxpuMJP j(F3sze!Ҿz-q}* !nW8Z~yqៈ^ ,%5I"0F-}vkr6P;oݸ*}ޕk ]_Ң֧r]^;|gz]cB'洞VE + ;ͫ趿=bSy[sFK*p@cw$k2:B|Es_wgOj}72sh6eNy? y{5.4ɬV[a :qAsoZv,i5d2D92tM8zW|;m}&I㷙fx+0H#).|9mq=}ayik- FRFV9 8 ,)WZG˾-"FgFK98"Sn-^կ,|1y[K=ar~zv?4{/P[nFt$$4L8N 4`ڣj֥lln)Ēj|:jE^ҥMy\:wN9rΝw$Y2_ZN $Bzx,hXׯH+UFFWsNs.j従3\]iP]Kc@nj)!He&\GkjjIVv%5 .iHT|]O>'[ys WVY@"r&y_zwwZ?W%IjVie{\'h WNzTYjr;.|W=hx/J}d_D$vMRÄLpXN"<j!us2Ky2XJ@U\]O>'[խwqç>um'e@r}s >a:l:$k+ ѩ Y%(ʎ39Pj 4IԵJS5iw3}Wwz-Q6Tu-*'vby NܓTQg9vz6kHSsQZML8ۼWxVăZE:iɦ$ TBP-Y7_ {'PSm]gIBMkr|29<9='@Blj:h72By|C*pqvw^ RK紸cY+8|<ѼFjZ wkBulaT>f'$<[/5X,k}c/<;)N PxS;뺍ZsiwVwNM)=«. $W7 Zlww0&' 7 9 <՘>húƓy%Ws3.66 F94/եk7Zƹjzx!_tWB9$`|%𦉮jZ_- [q,3cx؞&'ukOLڅܿ=ƂfG&c8xc?JLs]ОSKFIP˓ ۾m܁IqB )pQjgrcPzMR}2 tDA%$9bzl۾X6^>qf\HC68`Ewa6_Ck6PN$`K7Ԑ;sޓ4_2kpIծo൶BK<4]$ r(qL=j@.(/6@d"px@g8]րSwg[=ơu Y"n5o%͹ ㎹^mM?h]iRto!}? OOZof2ybj;}|c9=3^*-?b [.-z-*>m$+-1tz]lV7+e3zWkaKF+!#1LDzL.uw[սKgnnsGZX#6 خ d ;ָCF?KRHLhk>rJU,86 wOޗit. 9pFFGyDBI.ϓj$ zNu>efbhxV_#o@Э\6r==j%𮫏@*vfg[ۏcjPY Vn-8q=*|m&vPq"(9vxhOj]_k_ie,Z0[p=8AunEy*%j1'ȕv?6r)k3UIIMHܵm^?BT<TӴ$< E$s:DŽu{?zj[kʿeS)Y ӌJn mHWCAᶒ1,N As_Z6愫.!h9^qunZ@𞡩G@ƻW{hߊe~u$5͝XݴE"bN0rMzF2 T4eeaq8(d+'v 8GH9@boy]oR/ZR+[ f O tz=_{kg> 8N g:k{9!Ф3~/G i8H$mD (# x]{K\wxq6.ڝ_A$LBdόuK}[F4+nE%וCrwtjj73+s5ի.D#= Y^*t_4Vm-PD| };]TfGz)i-IAEPEPEPE(4fLҊ Io3R[kA~w1isklWz;05D!6=@^ڸxk1ĞLyRRޑfI 7F0G1rxSKhPh6~*Cn`uS2!>2HfP[$ђ7 qT;}rqxnšݔM-=rJԞ-skw^2+WOC2H-v9pI>%N2,>ki,,$rmˣ(Ҫ'4xz,Ou]rOO*HGD4%!` /'>)?%6c)Sn1rY\`w`Aҵu+m= "GJ&8%iK:me[l]a5KL[Emai,dcdii }`c COhGcmE;[?l(bXy(8SO1޶^_Ҿ'WflaWhs?'EN nKk|y(J泵_xYveiCQԧxm핒8G*nc9#Fx/?%;nt.*'y7o^h6DcŞHd kTDPdbSt#*hnG^iiH<w_4wlfp7 SW:,4nE淺yUC i$䌊o zM97ڦhaT+ IZĎ:\Gi,%-$ +-\c=o|1:.4W$[Լ6] U%N9ix?^5 }LYcMzL:;J7e1Ӛ3MZ~/薺v&Ͷ<*8 ^kuƌ[ǖ:OX8;Igp+}uY<>ufin)n)43P֌^:]OB߰I$EZmRu䝫mMK}^KFc2ٕ8D&MunNp1[.<]?U^[O`_˕sk?1&twd!JPUz֧z_O5) %jyṚuUmB䏼GsuOV?Яe}_{4BP K2񜟦h@l7]?@r/R'k5\? 6K+V~X,J[v9Ƒ{y )-eA9m ݻqތ #KMH6e#i²rfRO(Zkt<{5#4 fLyEg~@hyƫk GM">={WUO[xO {Y`緺@D댂  .n%7_]V>yuh<~R, fqq UP5;((C' Y P r8k3\Kk{eF\Ca( $I׵ZX^Vv}{lo (C<,$IՍķ 6Z5s[UfXYs=&jvo$RF); 0G9LW=aqkY8 ㌊UA6Xy (fo& ynI|Sot%ȶ'ft7 '#85kۏxж{F;ԎB#Y?!`bּG|Q+} _M MѮl'Fg'@zF^IέDd7˩éA5TY2zSC[DDS{6, n$hD p70RO#8X x+Ěe5ŧدbpLAWjOèhWXԵ{sy,fH1nPOeF:QW{[Լ;R4Y;$E`w;0Cf4mSmIqv+ mx nl@z}aiww:duFr8xMr$+u+=RM.썡6``. zi#~#|=Ms+Zypw[INOs@Z~pLrld݆*x`աz׏x7ñ.׸5Z>B35c>(D MFJʫ!s$1ӊ֝^]^u˻q _Ynḳw$d5(2iwZO!zz-9yi[\',<6Ak~6o_֚gʖћ-]HJP34ʪ ( cԑ@yXY~s>x ``0Gja/!k떲Z^i3IP0 0V-o]pxT.."e^"}ݷ=j_-Y=ѥH 1H8ONGyu1HM*z&g+cQsml*֑m6 4 c< 23Nh׺^xĭI$i5ۑnc IZ,#Jox^j$}[bXw CF* dg]>;]sTͻKo!O+1 dznL׋7~;^=jz5K ܱ?RǃsY7uVMgP58\Ooa2#<) :=>kV -M"XܩhɸGFA* jr5i-gy-R2T xo3~ YL-bӭeIk$1 nÐ;zѸtxEKzi EazLZV$V߆gOyr9-,un`{c[$(Ozp:7+!񗈵M6M6(ωuɬYlV̘vcSj%s QSU WOkXa2:(,9P S..#ylQ)wltyZokZվwmks882HÌ{/k^maA-ݵmD8K!id?:o@^:ZjZluK<2eތ  \t\o?Ux@?m /xwţVr{wXKcIA*TmwQzKz5[ %p2J݀ 5*5~ZY$)o琡u@n<oWuYBkze R)ac w>~,OIkwsAu&.[4r"\a2 m984z^+WO5U-溻t]>K1DG|͸, +Y WUִRk{# jwd p(Ѻ(ܥqA=(QHQEzzטq=ϲrjMx_}Yip0݂k4nyߌ< uOjwmq 67 ijC1ɝcfvseO3`ym67dףqFH)*F~Esq/qrny}*_x3^]My.#u-fQHv3uzF:Ѹz+UQ_:gVڜrS۴NAǎãI_Gcbȑ"\s]GpcuOjw =9l`hAp"P27lu~/mSS!Eҭ5:;KxtHʠ zGuGԵteIEIJrEp2OQZm;RX}Jfo%#nT퐃kw RH-sl9Fw(ϵ _4M@=C}i\\Fo%miIw_Zj>kPᷲvpHŎ\n>_uѿQ3^]Ky3?֫ZBn-I$OՍk}=t]B(wA,l@tS#֔@IwZCMug}\^)B@7TN9}\lv_0]oEw `.W+8Y(Ƞ,xíz !t{kx-mm>X=\WU?#ĺo|>^ڽ׌*"2( L:&y [ՎZq2frN 跚MekvPk|,U (7˒Gtir=h@s.}c_jI RadS2:3,ZIK#YGv60 ^׸QB6̾w,Eh gj5ě*+Hc`[ r1ۅ7=֗/FĿ KtRpA$Wa izhs4"kwd*:k c;#1X/k\eW^ռfim߿?cix#Χr|<Լ.5@ ܷ_j6w}ϟIj_ɢ6irDp G|35˧j:Ȼ"8~M˸^$7z[LoC$hlF 9&387_7qymiu$M hJAs(݁柢\J]coj '*2z/q@Ǐ8+֎?e7DwmI:duَꗋ<#}M4]]tNmMj.b) \6QH |8\Hu]~=mw9 Tu8ػWo&7 k^,}N}Y`Kow)m s^P[0<-kpak?29Vr|h0Cm^ƞ$_iMm3_AH% gm$)(tjkxjZ6RYڴzfgllVN'ïf,#ı98%8tEs#yYԭM(JWyYDs9َ댫bx Roo!94A~hH̊JmrNq z8[oCm}IV{(.aqwd3 r sVE=V/' 86 Q(o]? GB.UE$$}qEu_ ]º=2->{\>pÞQs>+khofjQj#{́ΣnwuJռ'绵9,8FboqGo8,ך =|kwI0 I!zV+kW5dl+ɁbV$ 889jO4};v>/zб%0L: ۖbpO539ՠUt=Ni.'KEHCw' v6ieemk*%Ř$sɯ+>^K.RVYU.)bQ# y a(W cHթ[FD F=A5[,~~ /.|Gsqwi.$f]33<`{iFA7X߅M/LK ODvԩ |r:Mv:jZΧɤErau9nIo8qKq [xwV^awa]q2\{%mI_WS>Zig[DwF&Q0鵱f;8 hm i:17?`ٳ~ d/mH~hip\?zg'ڽ8+\<׉/5 wz;Zyd!rל:dX|;$"%մ&di 3m4Mq380>j3'l|Q5O5^TQwNrs@#\GLM>K]:>xDy`bEFrrqϡG|+:u=q*/n,v*\)Rq1 tu cVWԯVgAJ0@r2I45cpZLQL~eƦ;h28~'NWM?,RDmk /$aىI=AroyN4_mP<䲴~UhH,BHfg h7/!o4},p_oahbV0\~0l-?ʏJIxO#~?j_'opȤ 9*NMh `AXd4}?Y?X+?Y?eOV( eOGc7Պ(c7Xd5bXd4}?Y?X+?GڏV(>:?ԟfV( fO}?Y?X+?Y?ZFpIԶ~- ZJiay a>y0(n4Ɠ4ö9٥ڗ4Y 3p^4SsAa@ K\uK}ϽlwC{u쌎83wC۵)lwX.i7{_u4ּ[3iHA =Oք+=ڍu5 bu%ZMMt@Z6F0WOڥ8XM-WZWL!hbrD@g5/ }HH cX:ݓӻK{ba+Bq@x}DuZ"~/fQrYWcׂgei|Xw]ąn نޝ=1^xkD"N8dokbQG#znKIK*miL p> LJ}4S.{Cըp7hD908s[ާxz}ơ G Ak-Pцi r:WW?Õ~w}hm/84ؠMQSwk;.u!Z9JE6cf YNx {W'Xl3cMNXyBPc%C R(-HB$h* ˃z\w-H'Ұ3$څ qj7Ayr)& vf((5oT_i uR{'u&C淖ǂu^T cӵm'Jtomծ--#8=JO'Jþt4B+tVi^Xs8h \$!,V. "o;ۓԿ~{Eeb1H8*ccbA&8b'!y Jcp#+$}Z$vUZGoo!!Q֯CrˑآH3CQ{}gm Ӵ~d, uqQڞy;>0n\L/֜KH01fOLF:a^@Z+;J"3# M(? Ѫh.hњ(4f (3Fhњ(4f (j[@MyxڼFt۳H`12psJYIjOLZZw7Ŷ8I_zb<(>_k/麄cw%óڤw~Zd۞9Ϸggi~11uv3*BbGHʼnaݼ'6s!q+M,>ky;=qU#!^,;<%"Fs~LG^hano$nfVHdv|;ToFӵz\2M&ͶX4e@q}GÚNo,bm!c6ɘ*T# `ӵiZ4{fU5…\w9tw6Y5lU9q `yOcPjĨMsDt^kcaWjn xsš?>t{1eyd; 3/e"=-#c42cvSܞkO>Eihdd3#ú}Xb[j;$-+F{yflE$x< }7▋oiA/4-s9S֑~N$+aOan4eҡθ6Xٙw'~9QxöW֗ F/ 8eԮ9 >-Y--Im"{Y#0Ub2'x!so;i4M;DC6QU.Z5 g8ޏaj]Yt 㚡xKD#M.#7XFBF8=(U,/ RmIV`s]clfx0286_#+12$jt͊58n/<2MSt8P<97WW7d6mc.v9)$N4ۛ=6k`i=a`<zޕָO.ߙ3Ts,W9> EJQjsKp֦fGcn.+tllv[NIc̮!!$n$82);AN4t؞ 3236F~\s\W@ydMևmb4k;s,]9VpyIz"gŽ+ >]7l5 ;=<,Zf+ydYPLKdc真ɩɣ4?ؓ4}$ N(y|<g'j&h?|<g'j|MA9?GL OZ9?GL X+9?Vq GJP1@!1F)M7p(qF)EbqF)EPbR@ 1KE bK逸8PbR@ 1KE&(-PbR@ 1KE&(-PbR@ 1KE(((( )p x̞9RKmZQ%ԖԴVϳۼAvKg"YQShq&e $/y9=/|O}}{]F%$@+=E$dQ^7x ~ͨ^躭. Æ*m3.~e'uOҭgWRNTIя dȦ^Cox, ʍi62#_Vz.iwaqc\d!ocz qD$C&7:gq^ai{=ri9-}Hc@Xy$ҺżSyklo$T8t(=;?&dZwqjCͨHVD*G;'Ro/I^ڮ{%:4ipх$()c#hg)s">Kle2aX-yM—#5ص8ӚYGdh`ݎG$Ei\|fKҝ=;I5nzUڋqj`in/ӞA42`?T#ʬ?o\ . `s8׎{Iύ|j|`˘-`fAg JbwT#ط kg:_.ŧsq漿^OC뚄 4 ]=n\p1LNk>̴ psi^?KK$r"3HVgQ׎3ހ>1JBO x&iO _$|aG6UV Niғ7*I<gyqn]fl3FFK0SH<=^ΩFcniN< ./[J;<ogץql~xZ<gbZ.O jJJ˅9]JU8{RȤd3Ǧ)<:Vuxy/nIi֓$Gn`r,lc^w(Ee} c$h`H?>dV'dWZҼUWp*?[hۼ#VkUeU]=km.UC=Zf^/ 1p8].ɧҭu ,\m;GNOB zREPEPEPEPEPEPEPEPEPEPEPEPq# '4PV\}_?'LnϰwTlôΛn 2=ZvI#2#TU 'VsͩJ)HI"U I:WZI[4-$Q|Mn,{d$nO1t"4iOaBe]JV27kLN%lt5$亝E0Y ~itiZnoFIst^N1C@|?cӵ;`[o7q(z|// rflX$\[Ju Э*N=.o-"DS.F'sg$䜜 aU#9j84MntUkyrMq)Xۿt7b#};WG{Nүo, hoDBFDI(#ry(8g$WE]iO'N/vyԾoQf/4}~%chcccSuQbxoúttXbY–lhZi1ǥ\.dG@$pU!Hw8R_~[]N[xu1 ݆ [vC9jhv6ZZcԌmu.o0ƛ'h3޵6ZHeO6@bے@ղO ho:WZD[XC4fwWwbY$(-PEPEPEPEPEPEPEPEPEPEPEPEPwdUMY;)LlC_VGmIQ7ƲH>$ 2!CRvy"ús˛]Xpe;YO֓6Td!xjbLFEcm^S[K 8>f}6e{ciuwۧ s (O̓ҔV>mmkc5ŭ0K @8J!`:zgxO qkr}qk6ouEgqJG#BzQTFE?/4 h$U/i~S*tKin.m,$,Ш qjƳh#Xi$ l$<9K-5V[Bd%zsҩhZ͐-g.ɹm#g".y-c.- Fj sڀZ`:Igޢͨ[&LeR=J|Kxk;5eJ[uRH="#a~SO[K`SrBqhg>i~)oi4$Hz>TH $C&\(9\no~Ywymؤ8:eOTh$v8 cڋΐ03S. ZHkdx#f Ms$yL KH)i(((((((((((((((((((((((zGVR4Bm'2p9^DYȑX`9<7ZT7]xK7ȑ $uRyj#D׽Ya֢)#1[l\3$񽵕m}M,]<9#Q"n'iÑ=靼?"\vl2i6A_''y.HkFf6z9*\P XTɗV]3\6֓ RqG+9 6 jWJVnK ׾OZn,)uk ޕOm|GXu {Ոa+[Td[\IR Lq8EcIgq=! k\i"⻛#' Wkfk[ɦ ældrk(__Y8+ĬL/l|IvӴ9ie}ˤd :#Kba-up xsLյ!ɥy$WY8~ȧɪQ[X:C=v} e n* <c#.UY&{ 3}Ng[Z}C4gWmnoRrijxJXho$dփ*dWO<NQnY6%X۴0R>,( PdByoۻ>]!x#EoYH>+vln&Hke80+uiVZUo67&춫 X(<y5s%-FQCe>$S[hDmOyjdzhܪtWX8=ҵ}\n!m?-Òx#aXYOMZn܌6OXH=͟DՎu-]QE8$ 5Zֳ{iHKȒ/Liͻ)WAO^Z\ww-q_6/$Ĝqӭn53[ꖲiahahX/}'Z!t=& oi֖i$$B09l ]ht c3V4no'}Ҫ:Mx<'=q]%Ehhm9W?ygK]!-?i g+jsxW,Bi-A1R+?k{]BdK_q'[1;!y kRG[neAtV8U+[O Y}J-rIOT sБք-rn-YCm[{Vk)dd;o݂MZ~ɩwsoO ( ;H [Ic%Ps.0rv[鶫(-$̌SsX4\,l?Su_mȝ"h,mcQ}p1* Y\۫ƅ8bhh9sYiza֮muY5.ci-CAǡn|-I狷idr}N k:^" !7)lO6qo [I,omc+Ъ GcGlRc卝nz2)3ovlWBOzn^闷\g hrm$jBQ]V8bF?P- (((((((((((((((((((((((<AEHҊ(1IE s sNb2)MҊ)zQE qKE6F{tQH>Š)(E) R0(#(!ZePR(B'j(siQHؾQ@ R* آ)n)8sSQE[)(((((((((((((((((((((((fotocx/images/defog2.jpg0000664000175000017500000004327115247006660014154 0ustar micomicoJFIFExifMM*JR(iZ0232U0100fotoxx-22.40;Resize: width:720 height:268|fotoxx-22.40;Resize: width:537 height:200| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 200 537 1 2 2 0 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?:(-QH)h4X(.EPE'j3@ HiiQE (@%-%QE+!4))Q@\yȓ&=[B D>T}M>RiUjALi?;SE;?iڀ}OA>pts:@ih>t}OHs:3Ih#tgt>?gJ~O,}M34,}OL$΃Hh't?!Mn?!'xtӞzxϫ~t#Y8[85j41E-&ixQEELgZm#mPi3Fh .i(J3EZLE4Rf M3I@EQEW{ȓ'*૽пIT2G(Nv)š <ӆ;54E =hXRi &[ҋCM&M0$&ifP$RS7Qޤ4ԅ5z .qvh34&ZO4i'aԔأuPRvgnJj:Ԉq±s[Yg"i()(i(( (4RQGRf EQE4P1sKM 3E%QEF((EP]"K_BD1Hha"j HAJ 0),I3LXSM4PM&M4fau7jJa4 4@4f3@4>(&Nii9!jCC]ԙvh 0x2}h h0=o'ֱm@BQK%-(*3}jto?rHʥ 2OaV)=Q*EW?Κ7f'ՓƱl[zfE{$q1}).7d83J FySdSc6U=1Hlo2=Nc'S?Zp UrZuQEhQ@ )QKE%b(PW{ȕ'Bh|x&OT1Ť=) Rg434qKJan*VJ~Unm&M xjD0:T3GYw,݅sK)mhns莗n.`JxB9~?:d3U (l[ɦ1C43#Z]\beZ# U haVK6RG[yCl8#=ku>NT |M7LcdtNXbE01R⍴HWڦC4!Zh@1ZҘBIF@mSmBFEmz~@UKW)R|k>tkfL,⥏./ L;GCl㌿*07V bU:x):'Eg)4:F{*bP'mAUm RZ \G*9xn1'?/JpWwSjO00@6O@j $1yaRD!n¨`敗wBLr Aꢛ)@(ԼeyC NpGZ[c0EZ%y nHZl*N=Ё{= TE-Q_ʞ0s YS>=_ sNYU@QIFuQ) G@QLPoP7g Iڡ?)F҂]?HWJ]֟xn.eꔝ%vfFyNOD_jVBVPgs]2 3(\xpKJ3ԶV!$QH /b%Լm4ZMUjrjDAH5E⸷&F  qgFzkx-ټ([dm|*^Olp*ðTҹ+_ea&Q Vmq#u.hLr3JÒs?ȦAϘu%s *[9K^m7a.V- BTGQUn9uWra"I_tT_@?2_K"KzUbFwrAidg8=*7J޲^zTr< *ۮsP#>C m;-5!fM GZE1`wV Dw#U)&fdcNZ#tzD|t" sR:4Ȳ:p)s\L}jS.2Uw nzZjtd{Ri@A%"bAIMZy? Su> 7 P}4YT0+ȪO KUoow ;b@$Y)sTnovcֵp_ڮK}*.MIsC=?F}M`(Y@_Ul'rh h88O[xӑFRѰ.[ I2{sY(B'(cv;qYƉwWPI6(2NWc԰>Rs^-i]Q,BSN ӵ9uJ~igA#c)-3=)7ZExW#iO'j73wC&Kbn[}݉)wpw ,g+#%ew u):)B/Сn!#"TpaI#ҧi`P>*kڽJ2Ҡ ;i_ds q3EG 0yNTU &;FY@:}EjfVh_1cnivM:OQA$i y|Eis)WB3N,wAf&kR$qHFsW_r~jNWkg+*ejx[VFM[e8?/T}Տ5Hci9nӊ$:lIv\sj/#(&8!p=r9 &EÜ{j#WFw(x8ְ`An:w"؀C6{xSڒ ~9#$֢pMhi4;7`qq<7 Ҷ9 7n(/;7ms9lԦ^wu #1yVdIagb'#Ҽq xMq!c[AVY'W]/zrUMvrpk_\3bcj1˓"^G,uь}+z1p+$ƶXD84;!2.Jc5 \9?ίD?3^3,<= ^u8sMl[UdO m;X4/L֤sк4$@:g߉(\5$p.Ks@oT{lWO*EwP{E =L(Ss˞1,3]NyxQfuxzޢԓ- {]BWК'>)oj-bʒ 4I<+nǸH-2yute1ڟpg_iсᔏ\td^fG"MXy\P-_ 2 Z}k-,iZ.B?JO^XXL mta\GSM|=ȣz6)C[5C:8O~!b2Aǵ4ش#AܼԌ)ǵD981Y90N3EE,C>S+274X=GM89Q.nۜqM2&9W-@5 %^%19J9`ҠUf :⭤dEZ\<92o-D p=I78'iQ txxWʼΞ`S쎦X>#̍2-nR9d?jBX~6;5+yjɃU ޷L!8nǽivdʝѹKYldIUC4vl8|W8 RmB8 hYM`"ҍ31<їU7\u<EA#4 #0z|й;ҍNܓ*ȝ&A};UkQI f?wפjΆ"7(#6,6Ksҟ#d1Q ( =iM"IYB G|WUg2]!Bun+N 'ЌTQpNsJ{MvʲI136K5EBxt#/% *1sՒ躇FO^uLF *cď#ro<~Uf챼3ntS<~S~Tc2 =i|q D( >dM9A#8V#%K3OVich<~`HZɐK8|QP0T<85q/v[AԛiNޙqN<9kU,fp%!/OSUCSWqY}kkֺ\#Tܑ`$)wUۚjE]b0kF6"fa!SHy#.RZLf i45UP{+E+arن84&ɬ7T[(Fx5AE=N)RsL/b ;vGB9CtW-4a"V JBBQXS*5"J~V5 \hwsޑҪGOʥG*,ʣާIB珔x$d,#<eo>p#o.p*Y ? Y{L=zI\jDae- =1Ңq *PȨ6)8A@ZĭbJ^h_H9'Ua!'p>l{kFa. d9os @¹G)Pl2ߕkTvu|֛mjWJ9#޻Rd_ފTSHsno1=zT r:e ąG@e#, 8_FTFzwH·֝r`pJOWVe'?u[$y@&QڴZ$$=jbU㍽;'H~h9 ۯKm +{zytV:#u'# @3YZZW= \R@PykFL۳8Gj16q85)E: OϪ}X% tO ^M<Ɂ #Z=rsT)v7!{a"!sÜc޴RR ( v.BACWv-Gf! M*BbĞqUH9&"$ɺi(Z rrj3(+#2r+R2$CY73p\a[1MH#~ֱRWBy=_Ź GU .<#KSf5NW-cMr"F3zfjM,XG ֳ\jMF V>b6S:m"6e 9qGY|-hL̖"S˒Alʁ"$zvyi-DC4H8oI`H{h9D0=sU L63F ,1@ug$GۜF4o\,`J Sʵ'zKI#ڳ!?Njݼw2rZ-57G[ A#֠x M IfIr?zsijqO wt\\rřznI\ Y/k uZč#X8lpx,qi1lqUu\չCrsf2͵j,`H̟+MʃjmMgMh 0P|A^~L^s=j"LI#YVQRNjxѐNj"u&YOȪ$M*??*UV:{U$q0)qP  DBSUR9 t>2;HQe@#d`]y#i".x'$0W'Q#$RW+$u9jȌ )q֙03Ufz~CI!A(pjHneB;_Ɵ4`Z%X7BsZ'}7:JU7dd֑#c{QjcF%7٨ .6 ɚow"f\c,4[=G=UBߚ?6f@`:RiAĝT$n4zM]:ѢrKzVѯ٭3Ǻ0^sZSz9 2WLG'k\6 _Jʷ3d7֥{H|c ʤT4&Ro82Me(̬ 9O[`i's icG.b7z^kK4k{jDqtFn,$IM9W)ieq{2$ 1[ >aMcVqmf_ĦDg#}bPH@`>d &R]patveb3SOrE9J;}&`m ;֣1Y͑rX'ҳTBkHw~y#ַTt$Z8W85%m{4qNl3\VD\j?z۶c 9$kEI=Mmǹ WNعFde?ղphgg92,>݊M*뚗"O}Uv%&#R3Iy77y$dUx&t!&`lY٧]-^tkv挨pnpyj<$kr.8sP T㞀Ul&ߔO<bH}K-j&XJqsx=kCӞ⦛W;"S׭7)?#t՘ 7[0]5դl}|?]~Q٣@ۉ'4ze\¯zb(mܦ<ݽϭrxe Լwc ~U Vj茂:|jE$qI\>kKO/u[VG5$:)֋x"P~or;Co Icl}Xqpώ2lUMYRBnF#^oO%NI ~`#k1Efh$+qҺ?iƧ.44ϒ'F99Jmpii L0sPF|v ӭQȋ,NAB:{Ia#ֳVVYWTK gҗ%ƙn' 俦޵mf8+6LkҦC|޽'Im2 t5R'G>^rU,\#, tQȒY1099p gjD{U,]~nQ 2 ^֤hʆn=j0!$85nSHRLM #XRYH.\ԥSR*ܤ{VBC1U=JRy4=5L/&cPc$[ZQVَ@ yApiiO<8^Ji*5 nqTVjddTQu%ě cޓd1S<HWi0^i"x=8U {T 9KC' r~b+`<Ք**p} K4bTezd`'o+jEסe.Vh"[Y5^v2|^S'˫;IYIC<_AWgZN>nϴ<֢2̾ڪI1v(dF޹1RK:M 2+18n`F棚Y&8{h:]6ZI1݆3< d+bjLAf?J9FZjuZpWc(x.w\R˒M`,wSܴ@b9(x<&VnU,Mۀ' 1<}+;dx9j;&'ID\bD$__Jetf)NɑyȌЀqb9`X=?3VT5hߴ/3v TSzl-¯Y*ÐXJ*F≑ gN2gk~Ukrviqn $#pՅ[.:luiQm?1i~Yuh|jO _\EpKa?WQycgsn*㓳~Ut'+H&\JB2?h+5(&x~5?ܛNj$", gɪoXzGr33!}@m{@:E9ƒXظقsV.`Q袓0 wVXF lp<7|j-3)]$;ąFw==)AiX٩yS=cD+"ߞ:3![4,8M<oP%tKP.02CqЎ"qsQ~Qء(t` Ҥ)W$nAPcg$56~ 9H]ײ߲S Z)=S|w$9 (*\:fCGֵZ"#soJ3gƒWnV~m_sYJM3/C}ujg On3L"]̻͟`KcElZ4e֢ xeD\'~,RweUv qaoo ԱLbӼB;#$kK?ɋw]ު0#Zom bN:rj7,J(5}M=P0 2=.`bx ~Znm]FUH}kcI2t ǥrP@)lBuWHfWF1V ߇,uR!;@rF:6ņrGsYJdyJZԙRpq+5mRS#z,WA9vM>%KIdu'AO C^KnI.OmÆ6ÅUљv*"_/ZbbBN9 SgBqGR3P芞8QO"w> =3Vx'QENyQLQEj#2>rNhνEU.v\(FOuQRcbiZƛױ<("ѳKB}P^WD E7LEsIli ir*ұVY٭BAOZ(Iܪl^ʌybA-=NQd@"+Ua9;k2(<Ԯ\U^~\p}(IEq$f8sV#{r#88`dVn)-4覷+ka@I$zU[+m&+rtlq8Ez3/ 0pGU$.= ('DR5mI N;SbfC˞B(:*l/%P-nȫ yfREBܷss5;d\# [O91V**܋qMN 9l\{~QUʒЁm jͨnԮ9Š)Kb~-Ay7JXjʞER=~>QEb.{Tk[i"ܖ@<.$o 'ǶsEs&@"T]<I/c𢊤K$ۀ=H= z*(3fotocx/images/HDF-paint.png0000664000175000017500000006611715247006660014530 0ustar micomicoPNG  IHDREtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 211 307 1 0 :eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:307 height:211|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:276 height:190|zM IDATxXUi?3O8bЭ H(!Xc؉9cc"!ݝꔿ[ƣ7׵};ֽZv_d˜=Fn>UCS~Gi wݘn=Ǟo.`iYii( U*T4`hjdhڱ \yt/տa`=BS;l&m_ Ƙh5³қK 1JY/@j7dII1.%9I 4m@!XmiHbٌ؜6ʿk:;_GςAQ=]>txԜejJ))߷]R>X [RPcHyCA]S P4~"R3]*Uhv_CzaI;40GA^$F*goXEg%X6r`hԒ}sCлW/(X!"C[6 3J-zg&5nC$xʡE/*ڀQLQGΌ['<<-QQQ͞aUG.Tm'%%!00:VpsJnb0N,3",Ԟ0)iyOFBY%ғBT\J8)E~N?H-D%9e& 0Ï F\b $g9وm46@ED#@Va`>PTiU47;a!oǗ[,$ $([3 ľY/?&%4Z?G"Ox\vF Cn|߮+\fZ2X9?F iN 4eY)I'-3qDHIIAII!&&K6{I Q1HӶ[X~="""8 ͛>qRV+_B^~(L-s0wݛSv̦/GH C \@U7o-r*Kqj5d$%8JL\0m:< @18^` IbaÆANNo^BGeqhtz6CLR#Yc/)c0\bԦ$ &.ye-tɢx=̠ MeeaJġ1U@)-N ӡ(# pάGuI2oIwгtZخ10\jdb&wӛ]^YV@`t"c1_$=()Bԥݩql9y1TS rFĺpm$eR(xDѧJK@iAWR6ؾvԆCRB $qNZ9 DyY8sA/Z`qN%ǧ/d^l[=qq IPY)^BAS\nZE*7# %q}Ez;+7 @!&: VT둈sI֋CYn6GF*˓gr_ jۧm8Q_'t H =gIXBR/9 .#^ΧaeQqCe@ pVu{Iod7׽b~K@LT &+Bz~)**ʑG")h8X3U(hZ=)ɮ0")9\{ch(H w a&-?އ-6`)TxF(cTG27SnF/Q(d.(ۂ -~ISX z wn퇑ۜ㥃0;!A7g=PK,ΆMܽׯΝcդPVż]PUԾ 72XT@ۉ@\ -šm:NQM~m`8ėCZJ#,.%ػr$  WT#-MuflcΆc,ylhyKj+SpR6 *:;lܺo]zIcD =_0 9LBY`'߿@DH( @ ={ {n|!(!1u /-IZRMFc&oào$I(E.ǥK K!(Rb}U- !>1F2ƨ:P S0rU1' fx'|[Ғ\^=l=C`16!i4^tFX hk>Ck6ը̃EkJEꗴd߱Z}Q-J1>5Z"H(Ɩ; (%hvPqR`)RSF.?Kvڹ  #gK/aPTT;9 5ǞAo Pr`? )Ay tF.(dK=P={FjIرc[6-[p6ݻwsc M% WgoAhqZEu1/ĠЛ?8?g| W5P$UPgT t&I$RnP^ALq'Ein 5t1v`A|,37hӆS}*-p5=x %u+“hDۺ7zd44:M\s-Fc%EN~8Vԃ0PS`1)[Z#.`66.N)AG%q+i4o#nXjPJk19ihPښB剉ڴ;6D ƓG#'l\ YwyؘZB;-| 5?0s1kPh4͉c.niwKm(Ad7_ %#K8?k6 y7$ӮC3; s|/"aݕm8y~g.#vyſ'T9JY~ o+R\{/GoD7|Yqp`rKJ dD1p~0t59 Tou#I&O 3Kpz(HҖ5giZAAf5!]v.ȋD5) wٴœ<*m˓*dHώmKI:ȍz}Has/SA w$U 5%(p8@ڗԃNx,Ps;1Z_ls#0k&3c31VQl> CD!Eot{}v#R8˞t"Kro XسN20c͞cϳzu ] (qX>Ôӻ/hHgb) Gh01 Cc3,_ yxlqK="-?tk1񌜷r#qt T<+*0a1F*ը?ypu 3&066)^Hҷc#0D#: #a$3 =I 6w,5&F3f7.qq M*F.o73a1[|gH6a! 0z4ca2fv=TR뮟?C]u SQ٧BEAQWaF0q|\trD0\UZ# pS[ Fri4^L 5sF5 #g!69̹e̚j `I 2f$#&6S6 CQNS?༯Y_ ɯU\`1&ƤBH#` F/ۇg[޹5wdG%|O-Ok7w? MXO%d SEozaskAn&lSsRõg},iP?mތU[f&gfқ&`ֶr YYd{i1tTR-K%@"S!bѫאy >lNVL֦oУGw:z` ebMM)m2c̀Ey[^!`"L4u+WNӳ`UX96GmzC5/;mҮc͸C}M>y($2ۃݻvbǎ0N_]WW1*{3aR$3b_ -6@]cb UcZkcf;*҅(X u  @3 ;3IsWamv>z~4fvg!Px@7^G /ަk (<4e4 OL]FLMVޚ (< t SS{o/_b`k?< 4>4 V BA>W^;<=

3nfg!8Ϟ>NPJVs1ٵ(|7M )Xq!SOeX>Ag_:FôәX}1pS^f7ߝƴ!}&QaHNL@\LPlϞpuͮ(>>hwޞ+?߾ ?_]16va`-ÇveJ5O6M.t7:bxxF*U9pc!7 aU8y2l>j51x۟Ŗ{ 1q:pYŨ*cgսqvG"t0$d1wؑa1L1T!2sZ%ަ<)0>EH_ ~)UreX9c"L[[f6V~renϴ:vA˳q2Jv.=mQMs*pw$I+@ǤV݄ݥ?c<^ Nj??0ڛNK(1b<&n=؂7[]u6 E= <ΪǫW/{AAU#n _tLt itTBa`5o&w,=HBm}-2AMVSWAz`BkPGKa DF !7;(hWq/Gs|9uԆvi뛩pӢTD64ۘ[#mz4@)/@}`R[Q^ 63Y-P*à8T %ܾ"B*Ovs3=H.*~ SFjS0qWe\+!dB}>F)Fgd!9d[C[E\;Sq5UJ]]Ӂme29p訽1MK&5gܺR<8 sIb>t UpkHIJlVsJF$0}H+kPX|6a݄AXt(2;kKa-EM} <6+qvaiP*%#Bc`AMmRج@o1,XO p(̈nRO@vtl &pǏ XYf+77Ca^>#j$yͅM&.¼+%{k;#0.P_W`^AArtnǭwp9ﶫ#,1 .ס0 M_SUZbP 7(iѷO?t-;PiQ1qq5 mK 0&{Eaߚb2YG6BmJ˴ {@AZE}!2p0&#$ߑDDsA'Fc2w%MGp4:53W*@_zS?-wNs @PX&>3f|MK $@?NjHN&DmM>_5 |??hw>ٳ'V#sn^Dj;yla&?/7YI;u1D@n7ߠ{^;gn:5 W*nBV _ /p 9teg9ǵ p"b;,{ڶakP\OrE۶(v-HO(QKP**C A Np&Oڈ*iLu|3~~ssxcyGKJf?͵hcl9:FIKȵp2Z w䙏YƇy "h  cTvoVgnrI"ϟ Pvp- OjDKkOgͷiK/P<{"b6 ssssy{(LgYxsYgٞDQd`)Q0Egb)½BMusuE|\BCC,1?::Ϟ 夐$>3DsτQ[cҚ1g}  [TrQSR e18 bCB"4îdsLp黠d22'@3 '''!υ]|wZ@~,< }N4J+*"}AB<04e4 OL]FL(Ϗ' (< t {sK#7'K8K8<ތULwlj,_t{恡u`x߹ǂV4s(<7c1 ֙K|VJ\O~Rе3/qq>1ƒIS4B\1P8 e`! >t ;gCp( w<QӉЂM;l>TTRt'n%p%ʆޞzdP ֣}`k&L4h1dwS URP1Gӑ{7_jk'\KZ?tkp}$P3\Xo݃w9:Δi Pb)m$_|-C4JO_pyR˪a4\W&U-\9פLVp]3j@&vSxJ*+T')ugNa&{,8+{q*GU/-EC7JgcxSw)0j+KAtQ8\^H+Qg"Izb%1ݍ{2(qCtH7 8<~hHkK1HABP-r/XM : #/O7 `E,hIV1xB!;\kHZU^ o7I 377N++E'BcbQ<y5G\腀pK="K[{˧΂Xב@*8zí_Av,>uO텖 +Gt*xr68EY~%1q@tN2JZA ^Y`>\+oT%ĊsqeXY+q00Qxo:u &M 3CH)[(yK T scS 9 C*bV$6 l1RIwB:bt-tӬa 7C`iYxd?+Sa8sl9z)y]FEK+`ƺXGʓYۑW\8 -M 241ԇ+H.|]M%0e$e1BdN'AoﷀI*C0b,35V;"c!c%0q&đE^8ebh00s)1Xch P^<:p% o^ !?KnNu%X:Z*Sq?Mjba:;P3+a`NHrRqgrLRn~BcL) qcsͅr#3![`2(JĽ;pq$$Fk8w#$9,N y1Jۖ@JB WzpvKTx`eX>cz&9FC1 ׽☙Ŭ,D=0vj":>IFPE+ȱq$Dը"coKrt()[X(6,tJy gT 9[CdHb%K+ ʆwTa<9`kg1@eHCj5;O krr{dԽUpz 1kbaO;gCE[!@x]kG+BTsrJ* h`ʅm+-tٙP k8{T|_f^DTox-9$7L@Iũ K*zcc5ʼʰ~ L cG٭;ldOtj+YU`s:(z%* TuEE#!*? &N(PEU/9i-ט2q=Ks)U=*6r\,%դi|F_%@?$+?྽ڔP~2}{S=1!n:BP^Bb#w/L 9DoC`N>TBI@l$${,!I%')_}#|r5`.'ɱ[!ɛ < Zvչ%U%ӹ6TG1/L2y `WF%&i;Bݰd(T&k$%*x_5?ᗗ8u;)Y7rAI ԣc @a*Eml]a^S?~{?RHr P0IgcmU1/@ۜ@!^GdadpR6ʠn$l_;?a, _Di+Te@ON؎ᢒω; (s^0̥dI ѦC ?!86͒7ρF6dCO;,9ۛسU5CBI-h{r"\ps85Em021JY{˾噡bG~rڊ0}O+G mI_;}Ibіu(gךbw-CU x~hU 1?B}](G2K&GjY4oX$&P`Ʊ̣]}ڶ xؖj !,!~O\__?ڶd͉#taN 9Nyc4cibnP^sϋLژCAk.9 !FG+{qW/ oz 4QW2ΓQ%?H$v^"5.0׃BțwX'^B $(5͂x E %W%h|PqbL9 EPW,0UÒ۰hBN^3'PY ?ݗ:h] [ %fYƟ#3ѣk-gd ό h۰'%֪EzRMEyb潈zU} S`#IH@T ϻXhi`X8 ;x@x4)Gs Se~+oG]7|Af&EݸHy[?nُG,'w IDATM?o:|: Ϲ5LL__SjwPnwѾkPP6(ߕI3M "|.*"XDSΘ\(Aq^&w?2##AYJJ"Hʊix}KJA~.w$[I@i~NOKl*ErT]s1x.;{p$Bޢg2)9HmNQj$SdUUhm Ox!J8P|<;PbeւVn GХ-#a tt;Jsqv(IĿ{ W8@k!z~5.G5PbPBDBSocOھ2e2aͳ4Y5xh: (l"ESo,Y;i}f5-B/Fin8.nt֋7PD)@qtsVmAvnN/fADDôt0a HI \k}JXL#@a]el>e,3 #N$^:ᥓF"Lt PÕe ƝWř$qGrb<=pvv"8jw2 UO_M~4i@ae^Y$rj N#m+qc?gh ȯ[i׃ #u@%$ZK6O7wŖUpUUx˫8< |$xo@tisP>R I<‹< t S|u5$+Px@.Pxb2b⥈1׉Px@ih>曏! (< t S/E5N< O]FVXrTWW}p$z[C]Z vn,?n=_߾%DK`M`jBwl1ozF^Mn!"ϸ9q0ӀH>0ݱQ`k?@sS>cm.H0.I#qU-܄01X})%],_vDž֫?V`t2N2H~t&łi"/:K*Ȓ繕ѳ컄O]q:m'd6d0LFf3ʂP|7o GN3_2Phy?ݵ (% W kQ| td 9=qCQZ _gwn]{GEe(Dh6ܿu&wA\ZT#*ԏrqߺyNJDx_8А%FԊzF\9xxr5p-QD7b*t6困spFf@Bd hl w6| W6{:"n+)f`=WDb*+x3 G5%g 0IO+O^i y3_{LHFu Yx-ύy#!@P(cc,g_{{R`&,Nqܴ=C]u(QrPQ( +< «W5}z F:1 L%8ЦO Kt&C.J Pg٨}ca&6@EDXO(UFr\,\ Օqt +BoH !\C%e>(Js% Ŝ2S,gëYp,2SIXj),&X` eHPI`47Od 1HS7۔׹E@Ŏ9#u01SfYPS9I@m]牨#Ɨ2c""cYVePE?: ?3HvT< ~gkbzQap sL0edUΥP9ܐ_oN KϬ&OtG#^:4_6+X`$&>#hOd5e8 I:[YC>'~n|0DQƙ_>%Ϙ_€z8)klnظr6v}6߷}W|<:GԳB!^ E븆\>fO0Ke\8c8KKGT~yq2Si7o|]ggSՕ"deܺ0| WoǞ/Y85A-yvoVt ,g.X<C>+vF*B*v}r@ t1ԁms7DfU&lje_*DKǃa7/^G46l@la5e8T8/ iXNptX \ˑ1>cV@ iD_ &LwDX;a*N#_f`ff9p(";ўVzR(ebx ;܌b*69εF_ؽje_Z_Y6V06MLL3VX8JZf pc| (P83ieFe Z(L\[ƻO(P8pp@̤5fz[Z (P8h8pf3qmoi>9p@y@k<IM5ycy@y4 ]Ի~+]'>jH(`ޕ8pYk2!/w (P83iw4w}P8p@<5™Ik/w4(P8pp@̤5fjeň c_<{)Q-~ lLj%HNC'<kVF\ > (9y,:v΅n$W&*/"-%(Z}uU%CHSW[#ەYĎNg~(-);P8t`B[CI CᅳyZH/oXyEMudz륵DFZ:..GTX > (ɉHC}F &-M }L(,L-j-YKKwcZcPӦP8aֳMo G1tf`bLUQVm'S`g7(mP(CIOhfgtrQ)BzNNCiy 6 њ9z PrI$F|/.?#0g30u|5ex|~ܒ \?5N>2JKʢ ܻǎGqbК>)OFe,b9v!w=Ja~.($qY ?sa5ͿGǴLufǪP*LE̬l}+`I$LX%Զy8Er sWZ.h-7 2<,UEa2{7<< 9HOET?. R_]6QI4͛>kt6DGF&J v,28K'V\Z*U>)^=:#lUBf:䨫ꕣ4= ;6Tcv>vet63q ,rEZ lg:ҝG&oA.E\#r^s3Sa\'|Zbң=f"S3 8nrؚ t'!4zJ$ [d&O}2&  KP$#! J@C&DK$^AY~ZW$jgiSVެt(#8e),azN@C:^u)޷i9n} ]8if&XId2:} pG_"M[P8K@Q@TO.M10)M0qd]|dJ(TyG`"KLuڄBJ 3U׼P)n]v0̌0h0]M-~!$gQ~Y<u\/VĒe1} F!T#WXzgEI{ȥbG !  AaqPg^Z< Ԫ5mԔ!>* Q[+<ӗ!gʨ!-,9-~D[cQZV&Kaf"Q[%Ƃk(\CW`A+ekJV&Jz~3!V|M>AAW9U3뿚&V4 mp w;}aggBA~O%YOվ?"zaĶmmo1Z0DkYϑB{njLz"Uq1`ֶ/[Ld(D=vOuVRM|l$J  6 ^(zordh2hW+?!.'? )n?Vlɉzڊ+uȨUeHMJ ?퓫ލY8p@ fOC[d>OA}SZ*("aE%86Q;5lp&YTW>KD{zJW/ [3YP۝m oϟ4bQޖ|Zʱ{;3*IKaY*qRHTC6&z#A*?Y9p@y0NHzs'?J9HՉ-Ѳ]IVeRU3tgcoo}vߕ<Ǭ+JgBΟj'(P8h8pf3Ygf4P8p@<5RSIENDB`fotocx/images/fix-motion-blur.png0000664000175000017500000014362515247006660016051 0ustar micomicoPNG  IHDR$U6tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 230 275 1 0 \bfeXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:293 height:245|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.0: Rescale: width:275 height:230|fotocx-26.6: Rescale: width:259 height:217| IDATxwTY.7y}NW,C Y,(DQ0DEAr9gЪ>}c~B*{+5׷f^XjIOO(FFFx x<;;;;`nn~obb3hh}}}FGG۹1:u^gs~~\]:_c0]#cϕl뻰&hnn~]]]4_gL ~_3~Y[_?׃NͿmmmh?z 4 3-陨oicml& 0o3.}mvrmO  6BKeW4S>673{hjiEP? אVP_݆&ô]mhq74qxN:Z>$ņ @ek[3߇f44<\GimFjoBx/Օap ff`acgJK}~?I@~~?|ú\qQ888㰱5,-Cw/`W~ghh('@qQۣp</rJhǓ8s8TtP?cq !QV߄Sv5߬ێ%J !U"O8Ép<ߛH-AwIZqo:f{O˟1&aٟrJ~t@_&Ѽo^{,x_-f( l)1q)aƍoo*IQCHFcMp/S1Kр 4uYDƥtڞYCFp;vJBNIRtZ^> =!Qќʋq kC]M Z0ǭOQČy A}h@KS҃ 'Ħw5).ݰ L@]{])AHCߙE0x c5%94Ӳ׍poHK^m=zNv< hkccbC鿿05D^~oGTT) n,o}3J>x8p 9iÇīKJ~`fqvBCC2dV)3װ{n |b_ S |f l, e&3DtJ;(&A ;P2G HrDĕpjP]cرe#堭IalM#xURܽhB;!&%u=)P7PJ`C|ş]H"}W]!"@;Tՠ(+A*Ni@Dtt 4vn[oq4=;uθF@_` Nx"~8㊋9EDz Wm0>DBxZMIW6Q\:=bEu-Ho|& L]./e}scdJ:А㯥644ի ,}f@ƀey+}áC~N- }*|` 2rPTVg3H ^ MظC7^dt`# a1YV=y_Ϟ=&|I4( 66#*XP;z ÜKYQGP<`L68mhQ2`&zIhKRo$k e`.M6^8J/Y}=G"[Z W}1۰ YV{l!KfgTшey.C|*q&:^Bl6H)F9` z09ڋ 6@J߭fמcNekFIl޲r8vjFT^9FgMTƦ{=(`[[m`v-=<#<"##q2XYlC-헽f!))`m̛1˕ MMMptt ̐0AT8,قAgE:<'W, 15:{`42^@f\%c@N0=s,ooNv |[/] __BIl*wKR @ ϋ ۰a3?LN_Et\4|Κoz(i;ahBݾ 9hB.`2{P b[q ?).qJXv>hj@&Id3;a Yl_Ojֽ=ϑa>! w섍T5w"+=ާ ‡Uk2$}&3Gqq[9d]Nbb X"l{EEEg Eq8$?®}F._3a7ܰĪu|9C!EuԴ1X n"4w28Јc&#Enرq5Bi^ .S`H2|_XgDt^-FpW7l$l~=[G6H-COb_#פ|ki#}A #zYyM$PP 6L\@ Cr A\:($kN@Wm>N^ ӹq5xx Gt7v@tv&wfoXOrPnKG ϳ ö,@'(0Jq';`l?$(!**Edሃ3"^' ;C="UCL}$ ' ȓTQY-^Rt޼FO5$TYߕl% ? {^yAfK'5=|X~&](Vꗩ /IA<0xK<7rg;1&_+= 60cK~Dd-wAR{fm0\藍}C M0[.wvrM=ئa~t_6/~y` 61& $6⇜ m|3[/S|V`؛[\<ɀ'$p<#<0'Fy,bY~s*i- a8Otq;w(,wbZVDmHYb . nzg&/89975mS/ܹg h;S0,,ѝ}TgNAj-x^q!y$.,]y Eqe&cw&Ns| IY$q%AvspcוȠ;'g%:F&=y}zI,Zi5řHp#}֎H͛~s1ig{rYIFc#CzQ7vlZxݸUR$v<nSs_'^ҵzA~_\\*ބQw9^授xtpKEnll>7n\J .4gwuģp _&nbek#rv9!P^A20Aw{ .:Zc\ ƫ$ ,!+ᛵp&01և(IG]V3}c5IX^F51۫x3B w!22m隳P9d Ę~$T1[ÛIQxB<6؅'ސ؍={qVА$^\ÁA^BE6bз8O*.AUN h(+ħN=Utm-]. yUM:d5Em9H( ۰E@zf8HRSLma02]GL#%J@X\dv,/ ew"꺺Adrnv$vcjbt,Tas8C؂rm p?kA~(i2P4$\X'q''' UC37͠ns: ) 1H+AG_*0;~H룸占@̭"]%uܸCtv^Ji}Եawmtq-,@pDAo<# NZPC4cTym f1DWM׃#[_Yc04:8` 9q=.:tPQ+BO4q*xxj)==` T.+ 20/-! H }upD#D1SėD`4PYNPVVDгD P3Mw z oA.t!Br :l*9ǸlS+Ip/NE;[eXXŝttM3$wQSR%ɦ49v.AEzd oθj st*/Gue)<=Ow- #j IDAT ݌)$)UWː ZL]񲽶V.TTW CX+Ab6\ÑK9V$Dk/I}u/'=rxJ 7Ƌ2d$>0׿(*`&>͸w{P[%h%x|T۰Փ.Z<oUQ22QNDz@hNK'(^>t[􁣧"Th eDIl 7CAnU^ԍœtdegyy4wh.܃^בeٸl}3O?47;+u"7ը*EUGׄ(d;`zl<dĹ LEq]9f'qFvI#c=fF Y' HZ/ NښBQ|4|ى?C;8_8pJرSji{唾+Y̎ 75燅'&ԙVxBTR-00Ps@4R81f \<#026۠ aذEWC0E*вFfS'4RxC%^cFfO׾Z:|a-X_ 8 H̘ 8uM@lm@,G;qDH梪 $N878gg{ !T.E)vJFH(I]`^伌cKhUVA;t$܍8Lξ1+ghSe9ɷaF{`|\G{qTu#<dq3IlG7ya< ~ApųT6$->fHo& xa!&ȇKϲ?MRs54O5*Ӡ6n z 5.X:1ITj:X\Ew+?c qy Z޼BP(O0wxeC@0H-hGCM9ңaaKQ㋅5Y.3kЏ ٍɗZ{waAҩ/slڃ9曥MR"GLup! WޢtvN&|M"bn!!ɀ>0xܒu7<.7/;BMC$:s? y^OImppɉ?Qsn&n 9E0(I4\б8&2X%IwHM2Z]q1E&,.@gm!5G"$KAhXC-Th+ù#;t)tz~_-jj^8t88;ҍ+033էOa:sR,n߇5 LI^OBK \5WNH/$hGMꍜTC_Webh9sn71~!-%{vn5IqM:BҸy21S6=:#}3Xv3\/p'RBADrt?EhkB]8hfm uIh|5؜s# [؜DFI9mj<,XW2h."Lzl[jKq\Zt ,# ~N⫯VdP s<͠%6R4H:ǑQjUq4-;5JSU!##UUhiACK;Zz;'v 7y|JҌrde# CN>]!(&KM*J_{"cͪ!kQf3 ڑ DIa>Mpn4~Uɝd6| Udi|B׽BVV6+ ġnhW#-=*NёAsԒu9/ tf`h3xv<~Q⟴X m9Wtppb TI20īRxF~qD'alb  8o^ S Γ@gPR]bܸdVZZFpBw#(&jȮ@{NԌ%sb/iv  {.H^;qA 3!bXms{W&{Q};vŜNN֭[KN 7ӂfpJdDG^61u^<0`'xBVz1axy{DBa#n.NSu JGqET &`/#@M# IfGCm=](KAb".S#xp t Ӎ[[Ū ېއtn1jjU@px4g.v%9[Y᠁q#oo /e>AtP,!Oitnx.IB]KJ 8LW5HN5p}V1ZHq c,uWZ d$oBGg y p I'-!WKW[d74(sma$̅Yx/d5xΛw7| l=y) spD3GT{7M-HMhFzCލ; .!?%L#uU8em=4=83n !hۆh/hZ60Fس .,ATy"HOeL^dzNBav2j/o<!8ZsϞYQq~:*[ݥ;LtOKp#Gn!v0 9wQ(o@lZ[5*<<}6_8qD Kq6I yLMvpmzxyQL _'1u.Πяpӝ;FxRQ[[>H!S4FLtvuu7H'epq$qT1Wp!o]Ai*Htx2gX }gtNZGܼl:'9`$U"b~E= CԳXЍH|oZ3666tI]fF<ܿK7KLhF`skGy^'Һj^CAr$Lr)o~zLWyЎӕ:p  G[#UyRNk Arrb m]riCMM ǝܑG"5 ks)J9hB<Zj  ,߇$_x`Ϝt$'!Y9hli'O ~ Sǘe;QAbA<{b#*cKcb/LA$mOP/A]A ')72>cp@]vHŭUp>j'QA_YJ.z0B`4%#Mҟb? fVJ[{oϧ%i!/J|e_ܚztttP\+1Ft{Wg044r^YЃI2\d} vc`Amu&Yzz{{\v0p#ἔXGE$*4,a_'w@ /~O9sVVz*HҸ 4>I mtwc"M['ݻn;7NQZ1r D@_MN7B>C4T3/NSXDw=:m$,Xia ݝm(NMmGJD'pi#!o{Nr$(CO?tcҖ&1z/iBl]Td֘w7W$d(%/S=?{Oϻm~hk͉HZ"՗ڲx lllQ-|O[-B=afzMMaauTӰNeNHVG𲲞6+ P8rn^qZeUn$> %,,`?[SRB S}툼EU.^Dv EL gt7Ç!h@OS9}=akkkkkSN@{FFP KJް{(Q;Rv[ya*.:6mHXJ _ &*R0sv獫8fw&&;Dy T64Edf= <\"MIKr9C3z=X/`|-zQYGp .x(_*Y N[6 J-K?`IkBO{:>8h6m7 6pљiOqrɓ'pBPNUn9%’hs3UfkJ28z ;33s\ t\k)C GUdWPbRՓ%5v`V+'cΞ(ohY<3C!.F~F{ŝp/#D2dp wQH᜷Sܛ&ܧPTyWxP6[>'c!]9E_WJi: cKv< k+K8ySHZ^e#p u WCG؜BNuZHL?Q1JNd)5͕=r0fg6Ԁ>.6~d^X?{n{35q #-]S[TuPj(# e ΦqzR)9PHJy JRBPH3%l4Ղp 0T0ը\l@T6r $),e3F&œ/;`[Ʌ~(;2u~Q8Ry63$u#8܉B $phQe?R *eEHSNΝw1$az VSزSAs۠u=~` ~u910:v>t^3p+ m>eQG;^AjQJ.F0 [ qXO` uʙPĀFO !ɶ.S~غ[XK=c U~QD'\N7@5SMvkDUaeXҼ >x.Ndq3*=0 NG?S c<\~ݎ{{:.*T$J)g) y0U5"ӊG*I;¯|̊~[2(|}ʶ8넪Ųe3߬^Q.45RENN["0ƉKU 6ӝ8BՉZGICZ[C|\.`QKq0r8z25*(m=RM !5.(* FWW ag. $sغy3GP&] '޷47R#U"#? 5)>\=#Ж0JBDVqTũԒ.[V^SRWW Q+?A 3Uڇ%$|}~"0␚R"+H訋_|C\@$P>ONR1W,]E7Q-4c^EaX_G#&;+hĥf4] U0֕&I_(Y ݛ%z=DوTg$V\8sOY|P}>};hlv60̶oE)ydS+SMp7v?"?Ǒ{GAHQOpHNx7_qg?R-0MmqӰLM(͊>*EU)~x߮Y) )Elfi*A,Q)1<d\ jr6vD6ShObwqU~_f l- :ea!K#TM4b΀8HJS.!$0БC}tR,~G ⃪,(x=R/ZRQʘ_L # UWqY IDAT> jy)?X520hު3Cu½al#3`P jXQh·`@Ts 5! oHo+ scjrb: 6w`=Ry6c{=3 3T zg"9jѕ"5 2!(;Tbx-NZV8lAz=0ι#0e$08HF90a cHr 6VNsҏd_\ j HM CeQ#}ɆZ3To--+F }͌C_*%5t8~$L7߬¨wp9Z?D5ZA9|h2oהXʸ( tщa%Gbg^O " $K$&a\Y*PM=zҽ = Mm-ű~ z.K`VU}빍3( ^ jr0#شMa$}0'R ] ̎w"E ܡ}"* ,6^\vf:n$PQj|RדpXU .u?8;+X{8\ VKUI8) .ZJESjf'p`A`{ 꽞vRD25>ס,#`}}";8~DCo-) ǫQMb"-4jV9l 1ԍׂVz2($|̀N隢ihX/:CYA~ϩ8Ky>NqK(|A`Z +}9(Y ‹xt? )^NV. # FM9Y1غ" M\e$# mB\曖O5I,嚿[|z$ }/ Tj܂lƋ:)e 8 X4༝n*zYu4o‘^Aq\E_|Mt *\5ޫ*J}ظiIa[+rp3F!gmo/,瞩/qXWnƵwNvSF5"FǢص Te&~H$ pYYG²{0C{g6= V*2xdn iNey /S ME ȨS̓** OeIBT)"ʱH8."]mロ{b4Yoԉ7S@:dҖQSeIJChR߰nd4ue1сT,yUI^Y!I5%"UArXd)Rr5ث O"2XJßNQ2 Q#IdY !_$ံ AS5"]XnS9:MȊ(l/z7ia<}m8k*0=: u.訩P?bJLUB0a-Dd+R$8UJ8C%(+<2{" y-Dh-vJ[)^ܢ$aDarO.ڌGsԗeP#^!Oj)N BQ قlC -`P΁xm";A`uR \hL)ɨmc=fZF$juޝ yDnq@| eEnl\ "ZSMJN|/]y6vJ}SV\J:AX2p\[R*>W”KAiltAEM-M6LWHO͡"ʸ&wNꆚyR:r~q k.*XYDMjj*-@K4;C5+JNcJMM$yRpDW%1L#Jk C)չ߲.*z_?F9^&SR\W͛Ҩ!ʫ*1@4 Φ=nꪸ1Zd䡁*J컓t:WѼS8zqkAlXqܶZХlr AebY!HS7&;X:[\;ieTXtNm'D5SVYI%$NFZRЖK]=7w?|<Nqys/ x`K <x6۔y ~7`P^Z\VdB.ڶ7Y#7az´ rP_[CRcTWUoF<0oh `P6ESC= 21ɀ?<ɀ'$QQ᳒ z[*q Ԕ!## i6ø`ص%p>~7oS?r:ʈ%Dr8(-2rK-NI܎xŊH\Uey7yꪮdYe,f0 ŌbD3&D Ar9#Pqq-Tv89k_iL?(mx#<'cϑ#(f^W}}{?goE ~}OD3Dǟۿ*1h(Jns5̤e݇r6bL|6[(t Yg YWPc:ArnӉ@W}?3a-QL10W_ .*l m#CĖ! ӡxtMyE".P1dm<uUXdi@@khB*|諷IsL}1o 汥wܛX5BHx|ws.8er=[f-϶bhNd@JtȯZmõXhfΜA;uI| Cmf/[cNI3[e yՐ_231m<H ybvojAI>[uK=XKA,5+1srOǧiޔSOr58Cbe8m*=ЙO MeZ O4[2FĖjO]r1/#ӯxE] aDY-{Z@Q p@ZϞc#, ny[_uU>GB!煅֖-fNpD)LƧz1ؤAښ]9%O58[r,hfm|YD|n -Բp΄p=ݽq}p)đy/N( $܂ohѮW_R>PCs{0Nὧ ^:Ьʱ TC?f4u:SH+,gvZjk\MɊ~UbP =V^ҵvH_(4K>ӵF jj\Tfb:Uh.;C(޻ΘNn(sd̓/mk(!O *=c:&|=̈́8A~#%l}hPI/Xm̆ZьS 5]gh,NP>ɪyŽaц&ܬg JF+BCYE+d>uVn-ςV]!x>dALM8NVUyIخ/}۽(^zjI> #c n56p5V̜ЁΎv7U#-ě]cQyk,ن4T 涣])~ň؛Ȁ|Q^0lعQSd~}hgdo~]T+PIиЋX-'FP@h<&b ̛T `r&$&4Z^.W#,^'~!|7JBUC1Xh%| BFWS$"ݖp?d+ΒhzFG1}74AyISmk/P[=hN1؎ڸ:l.ʀtF&[P4+DTءkau*h*'Cy3m&i(ƋAiɩlvL79 dT|a6|Ξ<=w3tt*RR ҇c%b 'OƭjJr\ #4{<2" d|e2yY,ZgoX*/Pgcv"<#FZ(b,j P5d W HObEԠvñȠ"7 M^T_W.Iz9(Ig^4C譻GU ! $.,2r j +Rsu ʯ^kih".TBumM !a&%2NME bPb1cRu6M6 ZނJ%}INqhaHSznrlp1?9==L#LG'g8x#_n"?#aL Ր?@RW!DÎv0Q"8{#t̑(&P70@l}=}/{voI yv߂[UW#%V,5} !24y-!8f6> |ſ˃݄!T%ybv݄aN3G[sqJ>kB|+!7@y>f-EԽlTTU$ҒbXMl{.mj*Q[[FFNe8a\/SMגuhj4Zٿ6~㈿pUsZ.bJuPKY:جغϕL8|7L76TKAwM.UظBp()AsϿ@,Jܸ ]Ao#yu 7c}pK.d0 P 1$he&ǜavϾp6ȺM7[n^;VkEJԶ"3.O=9Bګ)hz$;Cݼ?nu,ِıA,5P pA|"QHT]E<Aie1n;"qwG < /= } ·⠳+bE$NS6mAb1v[[mt(^>\4d]cwc8Pq%5İ ~!.|ǑVR)KERqLk)00Xs+X[[FشSETWE^ w(\"-#8¾qfvp޽kgc#r9\bMq7_.:}o&֐01`H8*} I~6Rx;цik"tatNb#;v킃=v cx,R}v0Jgca~|܍E%fiDHn&}w9{vc9`Nr g\jJrwAEӑLAg ]j0@f}G;`C`&ld(P]3np T5N077lm2/61/ W`89 y2{9T Ba.{(>ȫ rK_I'FNv_Cg Yc/UeEk-LXS]yAaQ1Ŕ@$% zI]"ggrj*JĴ2-+??յֲ7 SkNNc~y$32\n8(F_.HMؼi#urCR~JgP1{W}c ,QRBdq{vEX7( 4l1PH~LĻʧߺ8yJ߿J f_(W6ԋ+_(lm'׿u??%>:.\]]ϳ;Tk Fbod >RWolK Wub#snOwGOC(IG{Dy⚇vSB ܧT ~ K ޣ(=_D D|!R#ia~0K_[K3[[>W3:Z|M id ,s`J@*R1 H@Z4b @T%ƫ-L"J.{a^Jn!9!x%ALdt]5^!tj񷟵 @T b(R *(eHTE_(z;Q:%\+WAUsL̃ IDAT'7ؼ=@Eq>y_=ܛoAo-G^n.Gv7<,TSQbwtw{{ѵg2n +ɑՖozR1xbx*#obŝ^ĭɆܪv!~V?Bz@ojo؂8l-tupu؈]PmͿ<|^XmWoe~qvݢ uyocGaRi:7־ wS(%~:+55_wSZG+7ٛc>;vʕp? fX\7>QPJ{7l)rD>`Lx/=7Vfb6sLD+<^xS*s`A65MȪ=1(ώ*0wB ]^۱E戠$/{xuF?!\kw} p.=/ DZ0Ub0UsH"]%q]}cb H\?3Ihiiaݺub͗%4&`Ġ]st:B pl2Ӏ",-CjDZwщ';%F2 jJ|iKqOG R"p\=ONdq+@/}j =4mp,p"O 'ׯV7 gΝGty]\Z_xױG MsO– XmI h)FHu{= E寈pS½1փdb b#qi\r Q!j-[pbO&"!8kz{{̧q}](ʽ~.~ w"KHʣ~ȮHUKdҧ&:<+=jB! ϜA`H³(AM?1_Ns|9W<(jE]3-~ >J1讥!'S%J5Nԅi,O:#Iخ]O? goBAk#>+ @7C`c%mħ碾.v ^7a)_k.Vc(xCEۚbٲ4E5vߵqYcf ă:xlEq$<L+1i#gLv6Y h 쁁:V!&-K,4ˈ`KaM֓9e+@ B^ڠB ;lbB[=ݜhIJS\>&|=؞k}EQ5C!G.PU^U:5o޺6Cu\ڱmD\`6mv P_KKS^RĂ%ҽi;Mǥ*]N0YEc}* |/׾w~#E[wݎhѩ~`%lvB!Ҕ27b9-juu=2Ve6H[ҵʂiTv3hjy;0ƬFMJ ~=]hmA^>̟Nw~ݨ}P={e?Řjz&㣿Aiq% 4f _A}K;yϋ v`78P!b{gTUgY[]!>|p28X[%}77\x,;{aN}?cFXb:J9yn邙GJ vGs%w)O_D\B"5V$ih _#a91c _]'߉Cb||t5mn umzTMhDxdCKIpl8\8yrsArD u ̂)MHCn 1Snp@=XEsrCĝX.b-&䣿 6@u鷳`{tJ^K1rKa_:-K{:uxZb]D#&%.p?Bf$8-x5J ƪМx `^_o}?~z[ǰlD=7At&/=r[ Z ۨE/ ao[ y AX<@0ZhmTיfz z$ {́ :Q\Vu+GG,]<Nh['|cAc!Hcf,W.% Ri&؆[ΗѠhA{aKGcUU΍QFmn(y~%wN`/f4:yX #<L=ϲujO 5ˠin-8lsq'#^<ƊtVPcٍڬ*mCDd6h;s3nFs3B|'΂%V/-vHFq |&uP]۠ޕB9@$?"P]5ƛId@}c$)4vBZL.q~^<_oZ  pFӦh|cpmU@zp_GF-Xgד4!ZSZA>0]0c.GbHd+^?f`xţ!> /;^wRŐWz+8^3Cy^]x?CXUu{V-8/m)Xt6 K%K,¹36H~|ї`ן(=,:9_?g Sб P GkmlBX0?c^s)'^sт92+,kaeM-H_:C -I~$' D&8 e' i΅0]?2 Ak_Y:313& K,[R=yk pݬLvK\٘:&`TbV-Z8)/E|f{d:o !*tx>(1 pل NTƁ+Qκ a` Mp2l 5է>"9S [+rBS uLvv6AC] v({R/U1_~ɞpo)Xy1(sSWM Yy$~X88E2S9󰞀b9.pT|Q;t]#Yݔ+z4W+a> [1g4,Q7FI50*^C$^-puȺ `݂M*OO.mhAJ;WۭP┓l۵q8LdzC}xكC'[U#@~re Feb>/^AH-uq^+ rUaN(mt-DcE66a9RyUbO~ fP_:_}.\vEygX}ooY3!Z}`M\$'|5}LTV"=)6 ns묢|}޿-@ԳwC?DW{2=#7#CAi f¢X0W.Q^$w ^%?(( PeffE X 6O"?YQQk[r$?1^LJ’6zz9ԅa7* SVÌLMͰ0s.RNWo`٧{_~O^Kك0h_wPyxV?ڻT =S qѭWqǎᤧ'£Q۪8HLHB=~__VՌw"o ~<<f*\@H%z~X-7 &t)o~6 BE^2mW`FdTq~7bn[ux}o:s/o5maZ#~hUvV4 ~鹠֮1"t4q%s[z?%0?dT75= |(4$⃌ 8|<kmhsFQK;~P[24ܨ =$G0`94̄kʇ3Z's`䷒sNGq* 'l&-]lәW0y1Pu6FQÃ~ڇ yƴS^!} ?tK4u16h/&gdTwNC^v:2Sa4YaGG6usk#{ 䣐/c N]?UB"F_;DK._oroq&AGܽH%1z ,˗@pi>4FÈxt"-6 ~~ /.'3]X$݁Lt~P]T6WA'*2iBqlDlu?oN#QK'!(A|m`NE (@YMZk԰TA,6S4 Xqv 9l`onRZC!6l6V @PaL{,}H c:*q*JK@Z],O;5%xcDya\-_Hfl&4^&v:zXY[Y:I}b /a'h E TF/AwKwbE M@yn$!Zob Ӆ,e|djl$Iۙ pV)yH} U>s\VR04+B_x Ad9McnTfDPqhTӯ iخ[ΰPTRd7!4-C$?7,;*p#: Eu8Y] F{0g>N"vmQ ؙaդs{!ٹoQxa~U7 Ydj"̠,KX`x!TJ WseKhZ!"!ChŽYX%j_̘A0}7P1s`URsD]]Et17a̘G|q,Zs[Q~/&*29![_?mXLnD F,(_(,t ](}pY5 cA5N:ᨆ`2!:s3'4 #aKü_r~\@9GnHQhydS2=lmma tt:v{A\נ(@֫gB]U FQ9sa7fŀPNk!?qb _& p;s[jPtm>'?te"Ig1E͐|M8G+m0'^4vm#6l!܏ԼgϷtcvSgÁ[Ol,_69G#2l^?#"`nfC2̙Fdn0 R F"_E{ nH"=ψP0w228֒6 x$F*p\ FDzY@S1 yp ƉAS5N2*YhJ>^0m8Crg@ |ôsE:$"ly>;sG(d>]|WH]0챷pG/bpSF_.#Ƞcd솛 ApA,5bDai,f{Ċb= mb'wBqh+fϘǼ=\:E}#DM[GIz<Şނ8!^ ]ώ0 cf <$DAy0fJsq gkcvQD ASiBbl %7ϻ`֤ V,כx< ^?9v_GOzcoBksi1ܮIUaOG ez3jd- ]J ,="eYNP9>$GBGUVΝv02eM*#ӫqAYQ~d6A,W } X '„ǔg'L}TH J㢣a^3,$c?=3Ł׹@R'F3nRJ &8o3 \MJ-Oq<BADj|(L~XEqSd\BLɇQX[OD *4hV{ T4pNV5 B%MCeOs`, `LpMR9yӾruDfq)/+}ل&\0&r6ag\ɭgnfvb(,v$TI8QJz<8l5gwm9h jb))Vdk[|L Lqp+1"@* 1G AJbLxA38u*?T%B\⽃."-[T8yuo.g vX N=> 4::b_ADb2뷳% I!t!02_.Pϒ\ppTeD0t~H|?4Rk4Y;De3\Abzη_:d|>v4#/|oQw ) ]np'@XW9s@#gܕi@WXqk|^+p4r 826^y]OsM@JȵI$Zu 2gQ|w:83 E޻0{x8p,yH?#b o_o c¹:/MBت7//VREןc3{d)Ѕ(9>}Pc8L/2тV OR1}Io0eᖟ H!Zo،|#+uؚ=Qr˱G q*?ab+Ǐ!Ÿ\'v$Xw| i{B^IqtN8FX8$|6s<fde 6~*D<׫AG2!XxBA Rx3i^^_~EP0$cQC.Ge[eK堡g)/bF+ܯY ~zUb0V-Y'2u D߽{KX*=4W+|gXF0Xse RX%$=V`Itv~;oݣZk=e8:&Jy vUxlc8 JL#cH#i!G2pT.2}@BR""pkZn~Uh1&wn#%Uoo7!'tFg~Ǒc'^#A[r#=t$փ [;w=ݼ–aѯAH/窟~cI~K${{Q}(ۊo&O΋1ӌX[Բ%`"2ݼ$ $4OKB/l=1Hcxo5e$12*Xay6ϟnI$y'BR$`|0oWACa2L5`)] Ǵi,YEJ$(nk>Cj-@/:Ïߏy ]BI ~;ġkDjKs/{{y ۶l1aFljˁahpr\8;|̙&۰;GD%{$N7qqs–-[p(r[`aaAokt@z~h&و۷v+zac6nن+qufelBT/m}!---?7"=P?*Шt%bwoF%ԭ V8']A|H Gaan4L߱7nD7!OD![r5A/<ݰZLAW> S&U` \G]gZiwvc^ZzVŦ9 <_M[p!9큋q-(y**1nݸHZGҲ= I :j_M-x(epb.c%a˵ qfsreU=[Ɯ{֍_pe$}Ղ(z͇֦mȪgF_cݽq7YXUdE.f7P3 r? Mu_Ai|#3Ft=I&?Ҁ"RfXBqsaX 58p YA ֯?:ېK.صsL-zcb cbk<ۆ_Xz['U6Z|[9 _Y` >C]U(i Nnh-((,ld|+DQ"|F_i.p@!ZSݖژ1sTxēc'(7 WAqS-֕ud΅S(5 3uRz< ~/?=Baj̃ږ( ZX\@Yi)w+Uv/bf}a*<;΄ū4C8eDp1 آgFQkZ' lBr?i*j|Tj,PZSaF;>~.[;`e˦Cވ6fއV(Y"(&\RÎD'm\[XWPTYzTV榃ٲy%Ċ WVQ0`} 14e*6{#5% a~طںwhB[xBd程?3DnZ qd&ޢr[mAtZ&e0PCRxc/}"a\.@Sy.\ Ǎ;k%d7/<~"؟b)ж؆{EeLK!Y^=v}-1D 4HęÛTV{Ok42w3U p϶:K1'4T](`:4Y,|O`GhJ1bYKM98Fa{7EC X(+y!O;6@FAԡl4WP Ԡi u sjJ"l ũXLQ;S9Osn"n#V%KPT\ SWO #8u"cC_FB٩!PZ*k ㋐; ?f*F3U~>TalGv% ]y6@I[-ug_MBdˠ.y'6Su{]!߲Ҟ[ ]@SZIq^o#lA iwnVvn_CYoY] _Okx`/p*ԋ(|dH ,BkIXoU덋X e~ zx"4_u0 َFԖ#}klv9A~g%XQu1'!2qĚb-D @_w cƂ5K5q $X|tQMbW_4N4Ѥ)>h/M5HME5@RNrD [%'j )մYx.2ϟBT1(e~T ;rKqT<-j wrחG8b`1"tA@W5iL l]+Fv.Lr7WG q  fcq vc^D J#g+o CҒpʼntoNL4BQo3<&LKgxzjrݴ 鄇6T3'~;"Ƀl0ۉXa{U7|?|w;33b (((n#fňŀ$A$sAwfSuu^ӍU{W:{E#]Bo GYbMe8z#c厣LLA|T؉qK;ȈX-"ej˳kRb+܇]_$ o fDvN6m33sNAnKz{]BG,ĪAT-&` -SAB6onr kc-b +P[:.>[g Xsfp\<X &VnJ80†;JqX֮5qZy=k>H&aNW>@ez=B8vm :\CI2a5} LXNQ̘ȣm5r$Z+RkTL^A:0d'ڒXjcÇa$m b?r(*A,Щ\x"x S`>ߚeїbLWXoجDL;G~3k,nj#F`:e=MXN0tsv;#UE!M҃xJ{b/X(OYlCVd9sXXLh&ܢ ^00?IV̯0 Y1^7M[݀ݬ:,c╈NdRPb]dͷ g8:h:E>K=e," -0Ԥe mfw's`ЭBY:w2oۍ&ۚEfu%n_BiQlk@YX`)uذaYǵx#&o(o}@c7{*5)N=5VDmٕ}_4_WIzdi|9X`;V:D*3BIz# Zb> ]3~0U]N^vw ,eJu Frv6{y%y ;wKf:.fC/"bPҪ 5%t:9~~IH"4q $Y<7AAA(hB&kHyD&y|M,yp=RjeHAWJҍH= gɍo|F+d4ٛ$:U%=1/>e\ϻ[Y6Ya8o[z-> MnOS} N*dE9SDқjXeel_]rVIq!)))a&(ՏsFOQQVby?2fk62o>gS$0qEk;Ϡo!>?|0P=a\qꕏzcm= u01t}H$F}sϛc\u4>!:@_9M׽[0t2d@: Dd@A:ЁN|*_>/_ $"g555.t2;97r $.t29wk` (!j+ K ^e7 z |;P79PЁΓk@:Ѕuow/SftNtn廈w?}.4759e,/gW8ښ* NoJHUgThT]6)sJkYJ4{'̧&s/Z9Ɠ*\^ZDX9@"uشLOAuU9 Ͼ1 u $ -HWoel1U$1|nVLKն'/>&7r䙇<]Kv^yYW|}7o^Q6#ryՁ $Rdav=^ZZ 2CxjGfLtJ yPHK¨d' (-*PRoPJufa~SY]TdTGՏ_٦,PקVՁ0%CB͠H)G&B(XRO4\f+U{ b%R*"GzT؄& H&[)BЮѧҥYOvtV&2"઎SV*Cn%H Z[x^p Yo:g+2"w,G:X'TÉqork]9"BXɗ= Ddo_S6,e|?}_FqI `e{ov]:YZES,Q>d$+4 wt:WғY!~ |6vÊLDEF #&rғtS3F B_`l8 `4TC ]jT)(FGO?MWpN$srB`t`ГX""%Q8+gbLsp\+aany,v*կqQخ{}Q,W D{՞aӆ ܾx&z1nF^|45ז !o? + p),Y8Ls9O&ؼ,M~u1,^o=$͝xjO`YX@k5:d\eaUeYw,Ĭ٦ys1cY2r`kԱV s!崱x5"v_y`}br2ÌːաU>E}fYW;%8oCIs'c6lٲ,tqxՁ;u۶nƦMcn\Revr#qalߺ[nñ3QXQIOob}N`Ƙzñr6~AlhV S,K 20[|&D1Ti w׽pKoټ;w_]sҦEXo33pe[6cCLJC;ME}-Ɓ, m ^<!kTH8+ܙ[у@Л_#` YC`oiCK;܉JBcK `'M(#GLjHM wC5K-1|>NGYM5h:pXh&O5Ur5ƏKesbipt^A4pVwjEuU>=Dٙ(-<\`hh 7|| llmq#~fQ=aoo0N%lt\)&8}6Q];`h=ϳ'p f1b!\XmupsA֓,㞀NvX쀨te+h7&f.(`H&OCIEcU>nm;Z5BmѨ C}oU]4B#6KDTy1+mۅD|Y%U|ضjfX#\f^n1}ll>y97"9GeO~jcjٝZKwPU7-OJÎ6?{bP¤tp{J\>낿 ÁShOM{QDboa\j"i~Gab0z'bҍ6sZL}$h%85~yl! TZ`ӮiQ__d๋VQbj4p&3t> CIu-*ÆĽ\<{ޅG6fKp?1 )OY٬Y0 M̺J ٘f퀼.-,0j2n*%hLPD0p;?#GaH 4&C'*kl0əT[LkIMGs0'#ףi!@X[Œ _P'T--ĩfb7w0<3wAh =xxLN(_=N6]AyT#;xc QY2x{`8G-"6`r{\(Zݖ)05h@ ^ta%,aq72|^\دީ[Ðf`ד2\<  >W49[n=,9xccO WQAB@s@}? Ņ[~ &0W҉=0=ƏW4? oA3EtGDnKBcܨ8?# 0{<. (C c@+ѤZh@o4d4 n H5X-ɟi$-rO#Ef7]O;n b+#w 1Ga0To1a JG29:d 1 9V!5UAg8Ag؈|Pc 7Xqp_=liT@2g;N*q8zMe~SgQ#|j: 8OZ*p~ n<i,=N]=Y?NAqe%ā(fRhBW];>qpwCkx 4.0PUYݶ7Bo@l=r 4E×,5 G(!>6ppw̘qz4JYqZ2TV #H gl_2G.D3yzX\z`ax8{Ƅ𦯤$/`*DԪ#`pʡFX@we(w꯳nobȑZy:z:O" 6S3P 4- F 9-M JNZ|_ߡ,J:v0&*kaT*PZRżJPð;J>6#Lםt ĂX~bR2QN5R-);JJցFǩM=V6A*b(6kF\ lƿ1x0 `&0 ]HSvcaH:w'K@k]!NnĐ8w3ueZ0]W#RDSRgcXL(!j5kAwu"Uev.:T-&$`8>AlMVp7Tv§ $ـoZ=KߋGI~*Nl_zCIQ-_}Aꕌ!Y%ݑ^o%Y u& 0136FCk}3%)h+W^TV#2O:H8~)QKgvay8z%e(+-bTTV9cBq rC|;J 򘺮3[[0%N`uOZwG="b[ y %e]zT۴#F ~ H3&F>CaŤ!9i͏(aױ qM4$X5񈾧v3BCƱFzx-^$= SѠ` gaն}C>局rJddRbu8,N)[~ u`Ucy,NBfs `j.|loLYn",\ |xH!a3/2w -|=׬0wLجX$ whbv- a|Z- yT o7-0ABPYУ 0[yAc¬;:v&4`L'bXٯ65m2&wk 6`qiea ƍc^7pw(;#L\r V" ÒzL!w6M,Z@lzi'FIc錉`tXZ[t4efq Q`8ޏ{ 4 )(ΈUV?.ts7}?2GرƍDC#[Zb,7Ffq?"WCGVLͶ J[= 4n(';z2j yBcC3R{ݴ2۱O`OӱpjXF_ý8M|.S1m9׭Uo1WmDBob備zyH?/:WZԪ͍ty pNM_Q pEPx$WX\$ ׯ. %e84F j }{o۶mQ&$h2_.fe$\\c3c;p:m*OhA ]UId PaP5FT8wE (w;/#Szt>.%EBuVڻ>0v5^ Ǯyĩpa>È!]Hwp]=S.@AF[C)o{|<:q5/ǡKLȰзvf&fPIնb7ז"7m]qR PIKR)?Ec@TrSqOB9+).zfʈ,"j+{ Uã$cSgil'?mߎgą˗qi$i.-BKvYHHhO|#\q?>E I5 ~w<0udoGk-"C}quis~!ш8!PMS).ׯb&o☮[0D%<ݣ*L^xmw8iy~~!y?=^IHjxɕgPK|#Y w) {% #'o0 ւn5TTJ$|?˴y&=Ç پ6KU[| cAO1 -Rw( =7^DhP:sagҦgTUmw*Ty `jQABӧc":_%g0t%kOErX}#cCKS0i+q|b#zܧ,GCmw+`1,lpS-sz?/sbzsSQ^RL{? hG8y }A2!|rs$4UQ_fnBAuC[ۺ(ߡbcY!A)+{kiiCvZ-f I}wQ35 @M:hz~Fx/,)w尖+~s-Pp_+#_|_D%(ZCo_Z%B(ꡜd#+/Y0MuINVm9{&a(5 ~RV֢$uKL^!8Q>sP1z$mM$1&<^]PȀyѻEFد|S?d)#3ǨIDATMm&"dFZ2bs xep\OB!K$MITO|4 pdQa-RBF1d/z) 1X8$ X6!ȇAΆo0+ N3T\Kb"Åԯ..H1+ l9 9#._;'QoZeAYE yIsq, 9}+2q*2}VEœfTшeCy_% BGHK$( FuҋN Їrt2u[:[{atIENDB`fotocx/images/undo-redo.png0000664000175000017500000003630515247006660014706 0ustar micomicoPNG  IHDRppK IDATx}x]řݖ%^䆍1r'P @HB҂HJU=gϞ%ѣF\3̙9Φ{>|d»W[M@s]G-q70D0kQFD+veLW^,֣Gaʔɳ1e_-ݷo399N'_>lԜÆt K#Do֒3lQլa܂ cv:5Xc;+S$aX$ݺ$NCyz+OX Cۀ?{uZ^Fh,j /6z _Wn7,\03}U= =4|2e\mL N)t=uiiiG 6l:*刌Q`*"'tYrqc/h;҇R3K$ϙ7Y",֞={tˇ.޽{0[|n544ѣ+zzoaaVOAH4{Q[>z$Ps@YوGZcA/)W$io/T]KO< .CC# ]P_2;e(YFAm ̇[oF*o%'o*--鎅BNcssl9c^0ah1 eyXpCf W"xcs]-;_1 8<6VqPKɖOo?BuCܯ ݫWNW\1gZ2.zܐ`X0 ջ/߹7zFaݺuO~g͸ܹsF D3#8w_8s{@d[+"0FDgɯ# D E|ll/W^~ׯBUGpvI)!;Q"^;+@*i<芡 ~=0\b%P[hEyPȄj uED:D.'e`&-q6Fn_ru[cScŞ{6`ɥG=u`wR0ۅBq6tke[Ɔ9&/;rZާQLeB| 3Ȃ âW#e ;U)3R4BU_ê_6~A֡ C]\;lM 6{1[5pZa)2ƪ1[n+iXq.@փy+~9!|HCk(Yq O]:CSHQ \1@!es! NAIvOҞzZ{<ДDtGtV"30"ts. 8 ("B*}j΀|gE= /_}8k$; _<_p[oVUWǃzot*-*K/PGB%\bQ@[ ?SQjR(o⹢cO*l% LT0Ye*!VJh2tخ]y}*~A10@T=Pj1ˮ F mêuqrrsH6+>fb,EPABe 鈳{x:΋t7AZ.M6~隃n݈bR(R@V2`*T~HջAѯ}6U%'-j۪PFmeŗ10𩐙*7u4{XEϿ|C+s aLd 4 $Lܹsѣ'(L9-yĹ C, _c7,*PDp)DRaQW^F_UP&:|c)3t³by0U` iĉW:dH}=Tw ~>tz!k k46It U=*Na !jW AGe'\z"j4AB/ 3ad$׮][`̔UX璝2+/]. ZPg *]ū!Sט hF{g>6qq0͐yҏіi p+c/үagPXfՉ88 o-֙FLaBro}"P}? fJ%18jM. [o{! TO~QBj~ Ag|e88wnn>xܒzQ.rçͿ!xÇ02clTӨxSw9G@?ƥ-1dq=̌N<.4&|2"S wX 4{aXpW5~UiNz7sqj F/w Mu񸥈#4 p8}xϊ%C]D>q]jjj~ۯ79KTqeحAYœ1c&d3rV!*85ʘG؆2z]9`h8.PK?JX7 ʤ?1&W6l[͛7iyW_yC `mjE`0u5?HC1*9s?f-e3ײJ{v܆qV<%rubtbrJK{ A58W ,#3*!#5Obn.!vرs̞m. WxLs 0\гgNu͍8/EqTTNdv%lTots r%)/b/[55;ZZڎMp:HHlq<)BSxqh=vJJJuԵG|;y0#U'1o^HmIv;1vG~i7gO <ۆ O`*DAE ez+s(6z?Ķm۾WYcp26q b!'^FY+$xS4'Gl8Ü-o^#x"֭Vqٲ ;wTToݶ 0m9XР|Gaǭ38GaېOCv%nuCh>tIB+HlM=l̦c5eQcǏoy哆EĊWy`۶/m i(;H%VQ+jKù0Gao8~O9qذCƔM,)]x1 n41f׿?h)8T}$x -Kr&v;Uҗrd}o݊dtj]DAb.d(+8ckJĉX~?iOTT޾jջ[UDxob5x%Z؀EΊo߁EOmmdɜH[!On>}ÅQ4*CO޵g-Cӕ&Kt%(́  HPukVl^P+ =/{UѶ+yg ^ 9D[k]1\`%RdrLjq= 8%R˯kM,d"Z#G Huhb> Vp1c,W%(Ģdqq,uشi4+*vVX/tk\Ϙ_SuӴ츣JqrBaj /*vC0yp8!8U%ة߳gOlժUջwp^#wq&;7AQܼ 4L68qwo!/Ojɚ5֞={bi_DX}KtERV*Kz7C:<P+=/ DUm4 =+r UHN)6-[򮥿'?zF^5ʳ,h0aӂv *k`6%"|]_1/HW. e$ 2 ֥U͙3gX;qjڵ+]QY#+ [t#Aa1AP|noil.Zn;,o+)Q b$/yq(O[ _lI"&g+@-Z`= N8y8l06_1aKbMꓗ< eN73u1ԑnl ӳ0TRM[AF D+sfϺ [V~W㙒p%k.5Fa͐QpWOoCE`rwyai>2w/"h %Y|SG#:'Xgq2:P0!LP6 ;5jܹsn+*,,bӗ-{c6>STrTT܌uYFz6U{fȭj BWx_3va;!_2čƣua,ԀQDV N4"(0Hȹe̜9}!q,xSt'O8aC#+[#HCMDŽf8_iǍ3ea4Euv,Vg9̞=cKMUww:h\3%7 g*Pހ0hyן|DC= {Wxx#ͷ@c lDžz!Ս3C-PJĵf-L7<PWJNlƸ0=Vm"6؂/]<F3Zy5$#b]6a"W(ذaZ.X߱% T>!'SVg?%T%Ꮠ&Qρol%蠇O IOlj֭ț~u, VмIr(~`R|s6Sbl\1yR n[3 1|!>6dwsc]1/˕$Z Jor1l7-^p ?:PRR< "!#h|&'4T*R!A/4r!H':t' T#ר v!er\uȐ!J} =r,w~rP쫦]9r,sQQ芹*gyy|aw}lmF77%x~ȊR m3iJ'buGt^A9ƀ!5U,b5hDSWo"&ug`V3hDžBnhy|K_+~T#\ x.4^Hc^LRY3ׯtBŝft6üE&w8rșx{n`8F㗱*?eDYq vig]$[UU~WQn\H+pmqᏠpQPU%+0¼Xp_] N 1P{\q~<SC%Ɣo޼ϿxСC?-CX!^@/@(IxW,qv/ qi=Yl8vJ<HK{%/iٍe=]= :yϠad7'P܎ $J #{v΢uPВA KM* T^쳠7\+kݶ}{{ݸq7nz{8nÂ8Y=0<5*98ԩ:®?~|_lMpPDq˒s5X5H9U 0,M= %DFV[;4HzSFNV$m#2tNL/j{'6]6ae^D}2GAT oz zn*!{j.\?r8b^I` nq" ВbRA$Ul!!Ί}Uz(YL>P)fz g9?vВo +? 6 kJ)#p~F2&>"c76"D=J D =[EVT2˚HmTyHE͏)ՃѢeG}VVӉ2b5u5Nq^}^~wCBdSdeMЀoikē-O½LW9VޔP4dE0R~`aOq0Q87.;F#Nz29SxEh7A]wYΨLf3p$߅>D_X*4))Hw 0"Bzj~ݭ0tv <=#( rYϞBLZ5B+~I$i|,rğ0ѽw>+Pb"ѝidJ}uD$ *9z[C?X¢2 P8'ILMa y ' )?&% D"*(PxN[q'Ge Þp:)`.}*=@2@j$F) @e6Q'd T}൬ZQkuKjW¶Xjʕ*G1ۈQD2&TRɁIeڵ;vnECi |Wq8 C0|!Skuo3/_,u>O.(?5yt xVYkSSa>h| {_y%qg<աp73[B34Ծ_֛oĆC*{2+,\0 m=DX'/dNcrYk]—&Z8pXMƯa9OGȭwh}>qtM?ꫯx_8.6s \3+|ϝ^` CϞ 1ݾrxv/裏r0eiS\1)ޥ*Sc*/y&z "eX=y$@Li`ٿ!'3>_λ+{YƗݷO>=WȌxʝp>ѣ/-4}}3P(i%Āl$}F J*zD/Qw͝;g\`\B¼=qaxm3G28rT*[ժU߇Ws_B&~Z ,>N<}9t-'(o,?!v LGc T{.<*[2円Ğ 3+>^uh~}{`H=w+n:hԱ6B^ǽN!('5^f1\I<~_h |j2\>%P&1͛{x.U}y}_ | 4ϋt?}`=M# Ju+" `qf\DzB^|bk}|/_z^q@Adrg^j%p38;~N<ՀOk*F|D/cM 2%䊮O<,ť|k쬙3.ˬMۍT2pi',q73=e,]VF^ UŋMW^0D;`؋}JfqK%#1Vٳ_߶m.|dGL6|Ѿ/;Uu S=50D `?;pӃy_7ڵ\{cQg4%Яl0x p~GZID+b)-|4E$#0%jP:u2ov>X  1000 1600 0 nIENDB`fotocx/images/file.png0000664000175000017500000007014415247006660013730 0ustar micomicoPNG  IHDR>a iTXtXML:com.adobe.xmp 1 2 3 0 8 0 256 256 1 2 2 0.eXIfMM*V^(if02320100fotocx-25.1: Crop: width:773 height:775|fotocx-25.1: Denoise: median rad:3|fotocx-25.1: Retouch: br:0.00 con:0.00 sat:-0.60 temp:5000|fotocx-25.1: Crop: width:600 height:600|fotocx-25.1: Cartoon: line thresh:54 width:1 blur rad:6 Kuwa depth:3|fotocx-25.1: Retouch: br:0.00 con:0.00 sat:-0.40 temp:5000|fotocx-25.1: Rescale: width:256 height:256|fotocx-25.1: Rescale: width:128 height:128|ڽ IDATxlٓe}sk`A ( #d_rC ,2DQ@R0Xe3h`{zz^udᗙ\Dn{N_~_rB)p@)t8kZ JJ>91h g-8u[UobmRm4Z'~\r1\ۿ9*wZ) VTU*-Ϡ<RrMBiMxh&I;'הy9tgr~(2,*L0\1ug9$rs11 d¤UTA*j MJ2!:JZiP EXTR",}Vp$ w~*PL֚J8*UEŶV"(BLR'NхO&|QZ+WZ,^͜]cwq]s1Zkk"SO` R]9JmJhD8*^E:( FcQ F(qA 6$V94鮞ny)֚))ܥoE(jZ I k\q(3S L"ٖ*zU(eG7'ڃ6x𳓅:1)Aæ+I`jS {'3I̍ &j.彀h39AS8rָy@3hE W UMLM iP@J @k<$ľ D;h56\)= :TTx{k6栅jIy5㜸8eQ9bk{km$IX]YBi~V5V2Z5 Q^+ ւѽÁi Bǭs߀A͡"I UYRyw *j=Av$. K: wUq/c֦7v @7aQUL@;H[}eE1[7_pYΜ9ULD0Q{hr/< s(ؽ^ͪzj/_ 2r-~;NJ yhkCB7G%L6pFf}΂:"a-IM`PFPkϬyh"ZIx&wp*YEYL 4h&U5anV(wpu}"Qiz`dXѵjŜӳ8*~y iL! Sqk ",Σbs 4F`xYvN\՘&1[YzΛ8 ϞYbߥ;Ԧ?)Y-,xxom^y9^t:ո6/&w6,]xnsf4 ^zӪ”V ! 'Z[j%CKz"uM"zԏH#Vbַ{y4,/2ʪo;ܢ(Zch;!_V֣瀒E4*\%jyqЧnso3gNRNI ?a썽wxBMr)h&1՟q]meYDmpLvUj0q = {ɒ(YbFd"$AY Rwx'<{4IbΖUfianG}YWI*I`tW4/4 ʪLxBYVɳ>npwߣ,+N>T*]GwTQfmb,똎#q_-QB?kGfޏ*I",,x$I*Iml.Opn,MׄLbو&TVPU+ޙR%wM\^Zƻ$F1F˒VoǏMk 6̮UQ|sݶ^;5lZ|)޵63;$I.&)leT? yzGzg}n!噇nVܹ_S8 @&m41 ufvu.@JL|G)ӂJ\|U%VC~\xNCؼ*vP5kSRfK2&h0iJCЄ:ZɍRI@eV#[O]Z_&/}"si3YZhs|uQT&M ib=׍L.FH$~FDž,h2Dkg6vp/lomlEDۅ6<]I|6p>e:>qvޡ1>`lZp[d? a{9) f?9wxtڭ.eaZvIa o]!Uv6KIbHD42c:X[&iDn+9 SRUuH>Szb&? 4WEȜB"TJQ I0I1 ok4젆l~Dz({w_!< VqmUO4amDN'Iղ7ŠIX8Tkp6>3:GYYGR=6FDž;LF9d%1 PI$ J*27r嵔3!26( yi`r:dm6ݦWc Yl0 )D{}<x=ջ~[kdMmԼ~6ۀeh s+"Is2"(SP VIzc">_8 ARoTkq\5,+6vyϝ\p8hNKg]t;mZYS 幁sx{^ ?,ZX~h]npq> AxM3xkS@ ,4]wUXU{ؘJiHh!I(сUѲq (;h#Jgo˧^y.Ҹå $.\1xk{(d񄇛\uAñE,같h" Ϫf.n񶽬,R33s |giig QMx6H`oI T9PhZ< s%ioqQe h@StPڴTGc/_D$qoqo1YrE~[]5ύcu6ys>樬Sk8ܼ}wqnE!KSa+Uptbt0* 9*Wk LuN:`8:H0^_<D<@ ؂K!Ix@5>=SR&;m-V|?bi~9G\qsgOOw)矻L$񮙎 *. +g%/ pUEb V[jg9<wp,A]CiwaAs&\^1AX_9 A7VGxi{HIwu| c&/ E{\}S3 sciwq3.JҊXK5Bu b5 x&$!2PRېm$"=T~`ZS8x3|o4ve:͹{~8qb5ޏ]$7H1b竒,:LV)WpetsluoSl쳺?ƕ0Lh=Z*⽪~Ե\11#|mϢYFJ|{UOjCh;Xf`(,UYX]R*j.uJ΋9`yacSZ)Οfa~hɓ'ԫ/jFG$YAp(-pDFaѮO'ъoeia@&?x<ڧX&h9ȜzfVQ=|ӯPEn3Oo=۠I.`]ZK5&.T"SIL@-jͪ׸u.VL&c~K sLUe7_Ϝ yQW/R:lzNZ|yW!~'OTK5+K;-V|WG8?J$B}LXbL ĺPՀ$Iȧhlf^{J(F'Cj$0H k5mb=IHQjx@Lȵjv6TeśoE+Mqbkg/z (WZ/(a,fz:`7nj+u&%+YAH%Zh÷ZCiJ;kY3-rΞZ#R\ncBZPAsh e] ~R svDQ[9 zEIjZ@41L n3#^Gsl6?;˨s"? H3YE[Y?OZR$#]k B+Τ_:,_仇#)ok{/Ț 4-Txlo@pS]msz gєg.ask$(ILiRTkP*9֊Okŝ;8ŤYqSYeNQyNY3׊& Gs}=ϕ(+I6  )GlP0k+6?1!/x,˲$KTwk@Xl U |`tۆت"Ij{2"RshΟ=Γ}%ڠ$nE^ѭj)AS k0j4-<&yB'E& ;;EAQEhDQn2oEY4Qf=:?jfXs?W; 79Í',>|ěoȲ4/0F'+Mdd:5XYʪd<2O("((2'k]qq.CcpiNe%Cz#M4nձ|E(B S8xg5s)nݥ* iH9t:,K&)ڑ,cQ MdkdX]L I:.1n &1N8?4'\;Zirj[_W ͏Os.6w)P%+Y)ã J)$$tckw$M֬S]֌Rq I1nv;1L @)Gj=1Ca&sáhSTH⽝$Q2k_X2>9TC2f$ѣM˿ytf,z傰o_LBVRvR5I *dPɟEVm|=?h/Xs}dkŅyQrөh}$%rQ ڨ [RE;kcVB$-s:W\d:-@iSg8[ӈ<|fxxijHɶT1Nv[ ]>yGcNY\J2h1,Kg|Q3 U9VFUe%iNGvBqluy';/1gUjs)Y>=CS޺u'BL9]ʪ\cxʃ 6rHe퀐%42|N}:$*JZ' LsZ_Q"#0Ҩ*+;)ulC>֌F#)Neˢ@iML'SVFf4M=o8<0VnC n| 缆mحhĬ)B*LOnϢb{gv֊H|4:Ǎ9֚ sQH'-M4W (MH$H A?RY2:ҼLvl9 J@v\Ԩ *#a&39wBN5㰇 AX1wYx?SScZ`}(NVZr2vsy<،ū?^|;;6(2E!zq>&΁~t Ԁ*f6U!ljгt-vJSU!q2 ]i_I,,7T߬,^7m $:6cQ{D;/l. [p嬔5Y@km069b& 4u;q, OM-tɲkјoc ;x|έL8D#d6BHJ|ˍ8~l'.HTV0;%b0Jt\*+{n4(?,px?z׾#^} Μhx4dž a,vp8'O9Vw;]DHh$bO;'sT~) I!+L'&c4K  G+Ŧ%hÉŻ4uwwEd9>y_6>{%^zyZM>SPwrbo]۷vHY_F.OlfyqFasRUP+-~7>s*ȿ ֲ9J)^rcˋ #]1R >wLs[ ;<ًgȋU~47#'`͛o?LʆuZ$Y1/^ላOsHو6=2dʇdi\ /]}?/aZS?$Y@h֊+J߷tdo|(8{jHeYR`cf6*9 g63G09O=nyST d#&6Q m<ų_|׵֑-nōfv#{ ]N6h%_ByzB6CEQz߲GLSiigT& M$O_\Ec^}c z]>Β&PN-s[??7[ı%vw[.KkOGO;9Gaiq9GO.$ibX\cyi΅𻼮 n;$V(8b)yRQ(fV-%(GM1 IW.poKdZi11ei)&)y3<B Bd,..?gk)sTֱHC+mtX\#[[Y™&S gu:-zg ny^~ϸq./%Z66Ҕ,Iɋ$uk&6ycz{1k(,X4v8w};$;]Q 0BŁ` _ަfRK&Aִm>W12eANd2}PDCU\z&_ dj?X1+O[ɔ~Or\YQ&%L+1SL/_}!Gϲ0'6'Qɴ`ss/_Ghx|* 9Uix LrPJ0GǑghkn[ܰ^ô(wA\z\nh,Jަ6U"sZY Zq9'䲬(WUk)G)bNE8*Y]]k:]j/5d !({9ux/~&WȣGY]X[EHPV%n9vygXZcNuIRàos*J)ny*o݋Rsp4+lۻ('_p##YQWt:'ruۏA+rlʳfAsq]R?䩓ie-G+vL q}CV y >WpU)B,j>k O|%^7m>O =wܼB$D tㅧ@i ܽ7vhxεX3H5._Z ZL9m07;ay~I w/IG!V(Ɠ gΝkq"m7 ΞS:1sgO!Ϟm3ȲxCJipKO17o_/rg!>5N__?aoHe)EQE/ub~AUL, ց}k}/"Y%$|+F.rV67Fi0Ø{m0뢳,{>Ex<&ϧL&#/ _jg_%2nݺ˝;1X_@"@ ͐`H:h<%x͠ߕX|)|x;rrm~hL$l8Ks1R$g.eiaYD'l0H3H֍fVF^ܼ}ŅFֱVEIe߻>UmxJ3Od&x#Z+TEYZ#fPg$eCmeXdd<_/,/sr}s vwǍ[w3y||{o~gϜ`q~sgNx!]c6I V5dkg/V+pdB_kKleQY.dGsfEZ'iNK*x4(9Z,ܲv[QtPP2Ld7;Oy)ݲ)b>gΜ旿? ׮]gmuڝ6e%Z-|%zs}O?yxш_^€W?~+ϑi};~lKJ9J+*<|,,qM> ׯ'^JYVzt|yٳVQ&ysKKcX]YrT%II9iAq G:Lk+ '_?+%LJBӪ,xM%65Ν>s @BN(v;d*)Pdwj9EyY&Q0ڻn.o#,C}Od瓜N+/_e8<(J<}VEkx'\xNNߨ, sulP^HO>I/IicbS<{i0?7`a~V+ꕋ|:vi{mI >((|o-0<{ܒJ E2VP "AlD4g8ڝvZn^[! Rƃf ΢rY\xBTNZm}C,ı%vvY^(_`J6D+CN.N1~g^>h:p~dӾܺ_[( w&Ov(J*"C9EH & Z{!3'ͽykERZ9#nW2tʡ*M^!H.њ8VKI@JS&V6RɓӲTDE)nd{R Ac{gZG[Ex2e~M$;XC>.R*.`( Xk<+GV1'-x*ZZqȒ($҉W¢Zً}&wcvqnɴXm]!ZGbL Zne8eQZ}˼d[e)ZZфYi@YKЧe."IBmPh>\5}[F02)loJ:i;c[ \'Vu4X3-1Ά<@8|!I O1RV@kof4#UA*)mqQ>qf7҅<{\Zx*Kq8"AI,i?k!baqH+m E<Eƃ nZ' MAФz P_\+6>9TdALkwu7ygЦ.IO&^nydg/_ڊ{l쳺  y ^Z#Plln€xdGZ t .m];f2v>iPŮƧ"i JdYdnГHUUqεuk:ų2,n_̩Ks./JVOP%K]ȏ޺_BӊBo8 [&p;WZ& %X5kVLR$Pj" D3 _Rq#a, P*PuKd~3FPEIpPTֈ4V֡\s%s,IhHM&SR\p_jE@T j˪xdx2nKhAix'& e)vJ9W$z!4nm ʅ5*|O&DH@CkrGpY". Ҿ@IU4#y>[U &$NR:}+D:}q< +`%~}x%`ϕ]Кɭkv?'(+$u^X<)4De޻sЊ|3)KߖMSؒ$M(brQ6ɴ, 渿w~6_WcxuIr0E[\G}WV$e~nݬZn޾ǙDŽ2IUY1eE݊|PgkY ${jxQ!|=ӜC} Tv:2,_8hto s ex 4%QZ)?i2FJf TUU\:^Rה%)ǗWy:|NsZTBa|+?6&6 `#&_)\y%^{dFzEYSϰ˕tn6v7 3꜓;bl*E_Wkx4fiy0TF A~JUEjĄ^p|4Ia j-PF"јOזdf/+g+Kyh t!C(/s('kk"M㙠 O[AQzHCkh@+~0iA(G[h1ZȃO;c<D(lUzE~^-~(gqyG+&cF:su1[7 VRŴw\:rP4+4BOwk k`1,!dœZRn. .r؝xO<_΄i8sFLR`pMcZK*K #bme{vaH&-ZrMX̿'H)| voF&:4X!uP>#s~~b)ƓV d]:bhKvĤxMps=9??c>J3UUx!}Dik8%*\}ӯD;{Dx:k0ZRJۏVƚ$!ۺBPd0fнcRnkx !@}g k-H% iČE\as]8t IRXTPlYZ*JL_Y t4S] ϯ_bo)xu~xh#v |bҧG^MtF@.~kQ!bV^dr fp]!`>_( ĴĬj_е*>Y_´vyyE,#}>:as]*"#"XZYْ2\q#hH{3|9~͞؝MpG&rDBq|~ xBL%Bt\Glm.?:5|oTzP`#ʖMk^N|߼{..p|r0Fybogw޸˨X҉.V*x$PM1jop|lPy[IF9 o$1ًO)e (+*|5D`ȹSlڴ!J`CmMm1[apGx vg3}OΝn՚JK >D;Quw{pt̻OYJZā/Z`hSUޔkXc۳Sv @PP0JA*Qȷ,muI1g@/BE Jl7Qd"IPR761 '6x,ARĶ'd<9r}bog''/^@29y,0N[}sqXǚ|*b\7_< S{L,Zu_%$C=n@GF 1eI"C'#BNsTbb k,Ɠ!4fI\atlE,%i8:nkzSհ4mKqVD,![ I _hɤ kKR[j:84!^vv W-7 }$mҸ}NaowYj-<:X 2IJӶNGt竛Pyɳ؝M#aX'h]gFZYQ Uq0:l[%)nn!t \Lj~{okbx4[wZеB 9GxznZ|ǟ`wFJ6pٮ Аiӱ Q՞ӟ?y{Sܹ}@bа%g3oq8 V~e0Y\v8=zyhHm4q6HxZ.z>b_רj$nw TvQ*MYuZl(a y!sPiŅ!F BtHK[oٓggg @X1ڭߏQll2wu4a\vn` U~1p5筘2:J%\ΩX Qe߾J<(J?|J(iB<_M@{F3- ᯡNvci}WWx;GknB%g[-H ZX?*c aҰO7_,.Y65# B(Zc`eR˙DGNkuNf`F|8+E?7ud5VhwC|@[S}|$t=`U¿<9I/kȂ\{.bU%,g'4F.> z^N W YF| t6 W #:5GŚ8W+8/&}{(NdbȲ} r1~@"'Qi-׭ k @_p\;BQPJa8Tl>pk]%Bvp8\oL&#lKY{TB 9.|Nh+d؛a6bXQڡPM,s Ih0(b̝> EVG KSMy;pl>_`<3ܭ\&i2B( )+VĠƽבgBYְ/pLGdu\Z \8x@[.KI&H^B xzr|J&P،tBF,MmU-DǞI1pash ZƑ!'F h4D!y&)B1W@5NƸZdYMAB mbqM}[K`%&1}]\-?fr͛7gX 1q@,E@&p,NԿ3!@)8c"%nD|@S0yH(Uk ÃqCz>_"R,Kyk7O?#~⭝g ơ\f*$6O;!a%n,{T^c6xBb[Flчn@tԇyq Œɳט_]SQ>, e,٧pp ^60TM 3*j jst?;_zenMRYj3“'qp)614x+oV0a>!x B &jY9q%vsZS?w{^Nx#CghGSe_B@@#M,pb4HJXT5~tS{OƘU%;8Ft+bz^r[7y'PN^8{y`gϞc/0\l6Aj- ܄׫ lG&u:" VLjQ:(r ݬѸ/)ptsY< bٵJA^j7(X3@k~pg>!%oc %NO1+b< {|i)5ZE Pъe, Y5`x]t"4DU4k-KȘp&>T9,#(5f)6 탏uuS./4vcY !uvGnqD"҂HBib‹C|';n,%}w oQJ* B z@)MUWdyxT:byv >V(N" Wors^cFȥq>. pD8Q7dg5^c\c2H{Z,qzAijg4]h"صsH15=,_Ɗ)>eU'-Cgcow}x)F)o| i"9CLvm;:{hr1$G#'nb{Eb`ww1 qpAC"VHi_[OdR*kPh;z E7 jE+{OTZWgM$M 2,fd2u!7މ5O&~ I ޫxB܉s; &hzg4 TNZpMX\]ߊ|V&-@3Mhi@Atsȴk\]*,N*D;9agPF+rk;_&QFs2J18I$\>9C[ j`hԇpXePZa I֐k᠀>Kݮ&1ewӵCN)w@d,ˋGdZȽPH‡ͦBYDCj֥-0 ;U/,cS$Yƒ 9GW \YBk91[xhwï~]rfAZ,Wk8e8P(Jכ %CӸ#E)G%bpfG 39~?YJ"Nϥ@t_LԲ M,oNGxy^7ncH%-!BW,EeT&|i[`·y.+2x KLFlI^TK"ǬZNR$pf(6c84/WW!`4b2ѣ$XU,"'/pp/V77ZVkjj'Ic e͌V8;.z66eg THEL±ĝ)کET痝읣E{wӟyb6qq4fS!I6\FC6X7S3`mx4HU:KX~/g ɈB\BJ; a ަT6r! ( N^)xwr:\3i4MI'_&"vXC(YNt;u$M A )u3'_ǜ 8@P:MmDtR&yt^h7VeH@SQ@QMS|%oYXőh {PfMR-(њ±B 1]K{6"EZ8 XY5^A'Ѹ젓 'I)[ E`Rrv]!/ɲE9h My3ۼŖ" c/q{ajfa31"Ȑ1-{Ip(w*(lҾ8R(v5w܂w>?{mFbN ;mbK(cJ!!6Q9s hytwx{|?} W yEDx!6R'9#dEcy ޣz$Ĩ; ]|j\d,㝭qXlje/01 NeZ,ψV4n ",гsZk%lu6mbJ>6Y8?cH=7ecRJr^H)6e7mHw>dK^FʪQ'qQbpTevpoNQ$霣u6L zQ$B$LlGs\'L4M\UԘMf<11Nqz9{_{ ER8IP9 H9L(_(N~V4 ,{MeDqZWS h$i\$m`@׷.3x8@ ʚݦvl\zBNle 4!1=xJ)2]qjD6RKK<}(V=  Ф;89;l<ͯ)1oDg,PBI͈ 2ܶSً@{v%r#8kSdbgz|I(xheQmX;6$̹t`zSf 1 2 3 0 8 398 1000 1 2 2 C     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(ٟeNj~ g\,m&I&$r< #=_u7X}/6(uIbZSvdKctM88|Q=iST)MAљNOLdZLnHI ~I~M9'Gݽ' G;4s}VC6w1}UEF3۽z:}j2E}q<0AVpR?5ˋOdq2҃Úh >zҝ \nMOz.\ɑֵFWX1ODP)$ ~\n3vzZv'9"ѝE*x4@KAQzMO[5M-v]"$JX^=]z;=K%FN;gzF{Eέ/M$bGavQsrp6ڒWm[cσQM"2_(NTcicsB Ezj]băj7y՝9$y=TΫtw:E#kd8=j=?u+i+$G,NA皍dHK>m垙n}g/,?:6ui[.vaq'<ÌnxS vN`]C8ϵ+qG!Y6d-TS-e"K u[&N:?`b22#c!8'88 uo>Gmh1cMB`yu!ZJ6GI6zk<1c?j~>\) x˶򪖿Y{j1kӫe!ܪ+ ~%zj]eaF| V3q<)i"WIL>tHWQg+%<..,pg@K&-dt Qo+IP()lPIn;}qZ2z܆z\M{-шp0zDaYq\i=9=joN#[yeC[mG9$|wJiW JXžvZC1׿C칢A{- `@uparq'ۭum|si=sF|$J5K<2۵}_UJR]ؔxPz:N>FYfRqג1פ.h ~mVVpc+g*}?x85 rL5Ԓ1yGkl%{HT$ `y2 7aH<5JƑvQ;ag7 9A=m|pnLJkMisìD3]BRAݷw\xL+c?\~gd(JzmL.Ď6 t4K&uA98I#ӏ~<^ǚQgjCy+lA;=4|w⫅ΫwAmE}|4滽!j8*|96 nodU7$2W'x.=K~:UmO0!pcygΣk_YiN[ۡ9bOqvNJ֏RL5}H!ݍnRԼS {;N=V_Ҵ (nZ*pOTd8Cwc]H>RjF~Xҥ9iu Rvhjn+dd$vOV|670:n3\t#D^B0=lɹNT dk_L4XS=b'pGLOn˄#=z| 4۾V[?턶ob`MOSvڭ #KnjnM> 7Ϳs=z&j4u}kAQ庸<ő+Z]|,YPgUpKO9N3Ik-q;l')~(Uuya=R̳ vჺcO\fH5mJODƍ!UG\HihXj¶2 Lp{ QHMs]&6pU$>_L{^iiԚH5f43$,ڌ$*ppK~gñX/K$^p դ'Ns۳:ɑx?{kij6N?!sӱ:ֹZkڔ* q'͏Lgt:nUBApZzT_,&~IRd(͌.HUg5L'3^kyoBG6BJTFG=Unq$q֢5"pKs@>5ꝇ|hfR;Xn$5Boz9uH78y\'4k V{'әzSHiQ.S< t=>e%:l#<5*:y/ j._dwu*r33xDTq'$H0AHv="j#֊(Spۏv rǀ-hVt 5pk""*u*H|1goZʲlbL Ã;W5}bDmmr\lE_.@-A#1gYM}g_6.+.,kHI$D؉bN:vnnΡ +m38977qKxfr13xF{_ !jF$(A֦/P&`IᥑQ$ַwB:ʵj=vZYnD Gܜ<|{P]vΑ٣*r˜Cr988㒷v6LDY6Iԏ?xFM]WwQ5>2 )?@3q- \O"[jZdkiI&tF8W1@zkt+3LOpsQmju(S`|7Ҭ<1Rou .C-HH\3W+ԉNghvi2"}4m$@9t^ͣjVS@ښa Bxm wHlSX#vsO$OZ hV^ w{!:r>PTtyJ3C}YoliF=UǶjޓȶ05Wp8yG++}z{"Ķ!OmY |Ꮸ ]LjF.њkكy6>jwBI8˲=e{đOP'<gkSMF,w0 U=R9=kǓBX٬q.j/3C MIVT.2 珜2 =j>W%žEt[KB3|0rF8fxz]Z#=͝xGNǢסz̓É-Ku̖ XAS2jΩdnifC d1yޛ=zGk X I}խsmPlWi- h =M7_F+{-iFr9=y;Qx,VM>7`m9 8WPvQ:?: ]ZH"\F!c ~uKbvَ)`V@6A^[&q=RwZΑJF<7>}DJ]8U m03?dprt`.]C$`g8ILK_8߷ΓFE!U+>ҞETm>0i?:᫼vurp$NC4J!mȋ 4ߐ3߈t频5Yed3ש- `)~Wl;@q^/bF~bR;b|8ȮG?CeGV0-)b.O*F;`MyH~3nҹ}KX[1*$^dd9 ҹҕIX-NyԼssis- {ĩ}8W/m`No1'@,= ^OW񾢖ZQBZ]' F0]dpEz.k}{-l!̫cY@f6 985IF S הth5o֥6b2o$|ˎ}A&e\G $^J$ծ.:0ڠX=2+ Aojwndm}/!PcIF0[3͵VS+\pr3#ֲRPZ+SQv5/%?Z(IBo퐂W8GxGƞa.oyY6Rq 1Oos i.' qۜhܷ.gq5ƫc}ŵ_*c-9D#).fiToMj;KScӶӣ]&B\7 :Nb@qU sSW_4K%}-DK6G4ys}X7MKP[Gq Kym#zcZZLe#&;U֓›ᾅr6g RU ㎙ii>%i6wv7|!reL]ݵ5և0|Ucoqnh' G'Q? .g1L8ms2IQشd[t;حy|Mf`ypʄIG(7CN.: A)0:Vw#|'jo.W|*3Y+kaͱ2"91~pH)VR1JclGIƘd;qҰ~'@/~-'vyA#hy?+sv&roȶy<%V%u xɮGwn8ZMϳ!:=Hʷױ;g5-?GY5m$  N{N,ۢJ 2p29;k-L<4c&B dnlI)|Ä9CNPp:9JФckhFk;H`"%(,`zӼS꺐9lr2*ߡ$׎:FŲPqk̉N)sFVŤZht.&GlX)95ZhU 863+:Nx](˕AGu3vy21P E+ Q.5%z^ ZoR3|]҃0j9^ֈ̋̚yü̬O<1%&;i~v!٤;Pxc}:⦳n#XmR[6,v1(0)eީu~:H|S- `{]$2% `8a axG}USŴl@%[ {GFzօMwéR#TT>ɩEP~qwvnXx:\$Jw@>koX|&S$cb7 Ԃ}o%+z'BDSPQ$tMi"f"U5ݸx?fFr>:TO%e8s! y*))!e_> H˜sEm}~+;?zjBKZ) Wҿh&{{D-|?\W앧G~\lK6OFe?&efgB }ڿ6s߿8W<׏UIICg8^hO;-ǷmrFrct / 'K9L-d ;dc \dw֙!¶zY&!nnS>v[ӗI2ۗ?N$֯tuqEj X ,csLd@iU/ *d$K(K? hvnDwI9#5ڧKM!6V/[?09<W5J>6MEu`F2?>՜i&mN2JxGoCn.Mkx}ぜZz&*1Beu9'.g:I|COSh8FNMVrG-S1 ҚOna:nOS֧Q.cum/Pʱ`mmOFpw`m=hضkԞ2GlKD18[o_DAI!Ż7nQOڤr bfbCـ8MVa%94yŬr[bծ I;*3qֽCH+xJPWqhO8q-$t-#F<8~8<yyEu)&ӜO}z)_ڭR*&dz-bn!y;dANFּ⦱uqdn MCNӬq9s6]y׆-HB ˖/ۂ=ű=( \VV@g)Y}.Sk7Q+`2e3ۏ#?_³u/k~2[]i,sfMŁڽN:U<jwΥnHQ ȫx̬0;c= Cơ=ɐRpz{s׬'Jz+qrugY ;YڭRm.!/)bq+`3^k5$|7c!E)y5u-6+pd Y 9$ s%M!QC-B0|deykiJ:8RIUɂA2H$}q?r9{ ӯWwEfE\r10~]7~"Bm{{.gE OU=k,F/7ʱݑ9G5Qq3hssk BnQK~U7MI-mrm(8bh%8ĭ"Ó_4iW!V.# 9h\}8UPQE%w~Igh$~]|m|/ty?hc9XZHc'.VM)'x+߅ڧ?Pԭ`;3+Fo\O_cҽrP n<q?y'm#{q$@FG98\j8'$8u*5|$|LnvX0!O>޴)4[Ħ%*= q¹S Eg$ dsJMMItUV_Ɇ2@GINgthBnGY˶Q;$qȒK4HHc$bw7^2:GW CMBH<{ qһ(|dĞ(1v [+EfJVpv9 "E~3h,7yymO*3,;} w^'qi;.Ĭ\pw2CH>\j( xem;Nb]Tvs Q?5)kC# ASN}NHi9nG!Lе IE, N8^܏$9qfyyZ2|c'|U{/t%"X܋8۞Uy8 P\Aң.#1xaF!:my'DӦ#>ZI%C>gQm~5=MR1 jeO$ȌQ緟F {ueY0(=+7z_GΨ]/[PSH'u:RpHġf;U'Hr|w'tK{ckLqU,;SodbZ5ݷ9/TqBuR2I(9B˵Neb Je/HE@ws{w)bHScڴZ/421&UOwvmOQ}$z]߉I߽ ௡vk>^in$=A'=2{usX.mOij*?:c+sOE02Iȭ &VF2{[[x䴍rQ\c$8Q{JtK{x[/Krqg$d(+#n%eJC] waOGFRx+L6?fY-;WfYry 0}wr-n[֢{%0ۯ5sivI+.w8P<ß\bv2G*>9'^>5y+w98< ^ⷅKsgzYO_2ȯGR2AT.q5 i^H^}'kyvǒ 09|4۴fBC&8qz%~.k c63c㞧 tNəxeIH$cҊw d0v*q}rVj9n~AEoKҜigsq r9w8#ut^5}iKMELgd?(9Wp9t}ῃ6^EֶiTsϮOԢ\Gb} %2^$G,!m88ǶZ4 4p*'##;םWiwSèi-b:{Z*|^6@_'][DmId- e$`OOQj헄[}Uy4k .nJɷZ8S5XwI^^YiێFûNyڢ4*"p+OP|mQ$y 7Ԓ-f8\ b~2|˖[)qQլKY5K#SH>F*F < R4i ۴yaq&Ěܼ$ ;|q^~!ҠY\p79$9RN՛;JH]%\9OG`Ubk>ք7lp\eB~ e뮍O!жś8>MB/QUgs0Nq Қ?dX $׃ߎc %Znrv0xO_Yl e6Gxߟ^U Nk/EoJ.팰rN>a؞O@CCkC֓)G*׿^pG?=ܚ$ST9dP}9 8w5QٞsMףVT(dԁ^:X B``6ʒjw:Zğ)n}kkZ~7ZCy͹Zn--uzdžum]#Oe1XQU\6r<9zn~ضPY%Ԧ[y c9Px88Z|[ɕQfhbGQ8}R}OD^|GדgD`+dn'X[Dd3l:[0XlA #F&C>2'ZŽb}f-2;{{9{F#G$z.o )]F [ 4Wb90{W"\2m;pIq}>A!a \>.77i^53 p10oz4߉%Ww?]|G} kxd@!MĆC+NîxnhK*b$@'sÖIrLwz\s2d|XcϬ_ -=cpOppi蛣Pr>st5v&w7-ʓPhݡЕ H5x2S[T>};:c3yV15?k^8K Ep :3tAxCE.u nL.>y:pYA']izmHQݛcm*F8mA8ku2xVmGSww"ɥ*j$GI9'5=ĢZ=N7PC]݄iFr1=:m63 #E?(kQO^ہT> '?-ݤePϦ\dcrOMn%k|mnLdcpkA|`ޝ?H%<\b`c~zg>bi? 5Owjrkh 1@I =FH}_Zihz 28*Jr~5DqsRyR88(?vxq- ]8cgTyjN֚˹0qɬV4ɧIѶM64vɟT7Ds;rq*='1i/5ԢT dL8 pjX4mtq$q)#㑊ʇU֮%tص b$.\0Ĝv^}+ujW|Z Ql֢7PNVSsbxKkm)Ԟl._~}6AjºlL |ܑyy`2~,E{܌ 31֥ĝY6kr-@9GZũoԥOWU{x.Ee>ʗo vǩtiZ]XHԎvI83ӷ#ilI{@9l`x f3/Okc/BBqמN99|h|ϫ=;d>&2Aܣ 3eyy[Ԛ-R#KbO ]gqfIvV#i+dyx:c^@PT6>n<8iteo|ul18.F(M܎B㜝I+ VHI>\J@5կ|W/@ ƪ@q2=}y䖳/t̲Mh SPɯ<q]7EyWz6Ā߀|^1\GHw2nb6*t{^)GIѭ.o湔8K0ߦ}n\j/!ʋI6wq fQwq_==?]H/Ԃi D`Ҽ.&T6=UO˥I@>?޲۵!ܧ?ONÚURh2;k.PsЖmJQ`r~԰/ O{oN A+31qߞ港xoNj?5Ρ2>L[ giִC|/7:v`,i&vc(eG$jkӪ nDQyZ.m3x͎-75׺7ڵ9!ST:m 3Y/"3azd}jvѮo9?2'Brs8c<秙''CJ*O'n`qz[;+yҁwힵ>Դv7[ʋuc q v4msQYȧTݱ8?__O¹-J‚y4b4LLTy?!h<-+]\=ݜi;$A$J򾇎,K ڤ>dLf@ņ^3#/a&UV7f5Û J;oxKY:fvd0bA!ciǼW4xI; -)9䴭;>ͨVL& EWҴ;~X iY -׷Vu5s4C ojN|Ev,R[ Hj>y{eeܥWD$n ȭ-e%4 wy{wtZ!u[ VE <дF(gO9zҕiDjyQ5,a^ZbџgjG)/>0aKA`6T_miJH8RXS2`}.[c+F8Gb6GL$GpJ*} ^/O>|e|?x$AqO\4ԧZŝ2tfE(':-mkx\@G^]ԅ0)? 2kb&;h1篹Urm0MA\4K/5ͻeK_-D^:Kwe2U|p}5{;' <( 탢 3G][Ğb՚3< (Wsi>"Ӱ}?c߀M7Q{ B([zd Abb#<I|Wf:WX[!{rpʸd NKu^ďK/|?q_6|?L^#wJmmu+ 0=#⋵:we_P5M2!U < o>rojqxʹۿQxe8^~8][h]n3\0Gb6w=qZKoG趺m^%^$q1ҴG=*6vw_ @sŶ6LK'>EJYq5$$$=nan~ u}7N=sہh2 \V+1o2ZVN< ޽y|w?g ?__L c`X5,@Ϙ?;k{KXլ-Վ(WLtBNF]KK-/VЄ=R'=zӟ$\OA:sҾE__1EsʻO5m'w~w!uCw{2AN@0=TdW7H"]ȱCqt[!cH8g<^}JGxb,{xRq94|=hVq ? '䞼ez 5$FRv|vy9~V˚NˉYdTXT9![wu#qڵ8i[KKEvc;I89#;9eF0qs?Qp|*\٬j|fhawA ttoO>EO+&;V0)@O81O#!,=q8-^}ZU~DrR;:@__|@ԋc˺f޹ 8>OlW?@6m/&ڔH{dG 8<瑁Y֥̭J'z$FP3*>a Z/n<1l_c_xrLʅ1^G3tM?Y+\z /phv6w S2F8ְVҌS8t ݋|O&l\ZVt'|EZ+P޺MӴmB:$pv 4p {agj_* 8yBul.usմ_̳\Txm&XyqZ fkxـYFq*F`4YB6z+0<آ}2O)ά-Gjj#JUXAjY@N#${ս[G𞌑-^.e!Z qA,@#HQ+kǨBqPrd+/;?Gu y=3NubъOMQJ <I #;– <7]M Maw`{niMt-?(mq\~"~) V'9q!MN-h?i]PTg\6ONz~f7&.@b!@5ӭyG >M-HDy㓂0O>دPY-}<$%r:c$18d~--1FUԂF#84S|po~1 c4G۶1Lu?$(&UAwӤ̊oK!0 z+<\4Xʸ9UoCöBt=kft6Ui-d{qJ{i Ro;ap$v@ ~uOo.SGxG"y,捙׌st7o>(xr&GNPn @'~]9Ɵ. ofӓ ݌I瞃֭xI;wo'\ڈoğ qDcz ͣ_.G1#8c^|6"+Ki$" .iݒ8Ji&khTnYH(Hbr =*9f%YAoԞb2L<^YFX A9{={lSrgcc,l2!.FN:Wg9.6i4l=33Ri 5QK;U eyg>zw;k=ӒR ЁpNO^[F `bQ\m;i2$= f#emh n#/NvOH[M>Ǚ#rMޔ]Jʸx}I'#.Uds=]n; ."ElC&TD89E;Iak[ͺ2]r@%yּ O[Ҽ=fvÄ*󜓴78_A\[閊exm-`wƋq16%YXG.^RJ/\9]Kg?M. H̳ 1ъ3Νuk;ioO)-3+`l*zTwŠkJ2#fU~nrIb;Ek~8m OƞK[Ȓlh9Ux,p8 eoTd0oCֱϾѕCp?J_[񶜳 B$|Θ^A湿N| i0.Rᣙ6:0?Zgj]:^؅1Z̟۟43 N[4͂p|)g8 5Bj@DQ |gF8_ ܚlj&``WxJ5 2Z]hKd[nWQx_ٟRͷ`]$Y;HÃU|zAEn ݷ>#ӾoO넮 Q~PxNQ{ n~|ǸgABɵ^o;T GE<'27~=/#\+ow <>ӟ ^kS^&S7-1bV Z+ qEx)&1nL嘝Qʩ5oढ़ˑ,D"7hyvE !p9a.%^:]éYkW@XLĄ$˜vV>$NMŻ1E\OPx]|=9g!] '9?JH5?wx]_D)ck*D'iVSz֣9_ԉ/Czp2I;1$LQzbi#kPu'Ԩx*IvF_EX!A$mG#$sڪO4V~u BG>fF͘93 r y#pkBOu\S}vCA'%s=sZZh2Hd9#\1M_< kx_56c\d\H4NXp9?51sLLGz ہ8=J\۴lڧӦz5]-ְ,ӭJ>`NzeGzs]HnʼnY$1H  +V}4 ck#9…A?!G"]0.8UZMéE: FPߧJoŧ.Ie#'褎:bk^?غ bG#YV&`zǯUso'=@T>{WƬ,4]—\xr7ۆzWŚ#j2X c,G+T>vV~OC7v2~nCZLFm. L\~wwuKx"/y3&\7oEVHv#PWw'?//0\Z-'\Jx^=Wi/K~70Xh*gJ0$T޻9otu/˙8\t^I`9J~=[Hˬi~uG Vބ26y8 qk=U.bBD1PDK18펴?q[aZ>O { :S-洊fbz=k:A cOӞ7O=n,W$efO+J/]$N#EtSv2Zt֒閭}/ޚU}Ig7tOnqe3lz 7c⟉'`yo!#02@~Xz^iyv[A®d8$Ҽki3v vuqHxn[oUTm˩JI@[p5cRK|pKd($(w7^A_oZ)-t 6ǷhA#:5>/_s&xՕQVKϽs;vGl87s\ڼrB"o9MԲjGNdˢ_[ u(ِrqxykh3\\kp) ([/3R֯ǚW זc!9'vT 9GsW;{4\OZ dGI-{lN#6F_ed*+)f(o֔[ x7qhZKnV buuRO 8楧aF\1IZ$wHXrz/5ͧ|i%-.Sz&dG xrĺ׌|A χcKKa tnkHѭ40/o&QE$N1NQmEv&3`Nf>-D&Y!lo+ۺL5?wUb{R@mq9ڽ)ڗZLZDrhgnҝ Jv giAɠ&mMSy0@^30݀22;O̎d(6&Sܴ0U1Rxr=opRU2>eE猌~xB To(;3A5IMwkQ³mXx稭.cn kgO5 S,n$f" su ϧLuWuKozw-? d:Of5?gyp',nT,u=Z߄GcODV!5HV̙-I9aدfh$0L[28R1Ա=>-^Z5>VSd?ݝ P *\漥d+4w|hXtX6eZ!}qkg_~%tOyܠQߠ<5÷k♭9fR1擞;c<+tA5텕rJmt~2{AzΟâuWQwَ$v#nhg;]66H"<_dQғ_kwѮI`!ty[Y) ]x^@ubɑoSmc:qWobt[0G}ܦI{$sW>?Gb5Ds qΙ}jqZzȖz4w ƎI0c?Z6ekjVv%3[^L$+mUW9[Rf8?+v\6=¼(P<j:34iH?s.\mNe0=="4k)| Ii鞸뎵KDľD6j`j3%3Rq\7,(gW*ڬrTu}Ja.o  Op77^ssHds!i0͑G}k|K IxwwIYoe\zU ĺ&}UjЈ$*'<~frDӔc{7~3Nh.s[ "K^-KFw!#]mKw&E+g{r Ddcx>m;?Mu 9G>a=[קc#ʼn`f9=jQQOcV#@"CpEVb @֊>KAk8L$)N9EoM'6~LW]K AsYT 4\z쥦O@ڬ_n#mJNɲ?[-$Iӿp)Q f|nGgo#XKhhP˸ qypMz2zU|5ڞIu)ݶlJna|c<]_w < B<c ;<*( jU[AG8ru=?RV@9I|εKUěOsϊv7][xYD@l /Hn]_H"[dOFǥ.-+4HMsny3GY8s#?ipZ&!rqCwA*18Tyu$>0vWww6֚qmofj{SVkjhȲ<lF2p2jBKr,yŏ<opv,`gf%Uɘ̏a drJV譇t^u/v/&K )xc%8n8L־|{̟ھ-!0<^Q'H&N%;R=Tz_f/\4R?/ɾ@m8|uNG9=Uzn)8$r~"K Uccazy<[?{G5/1]2ZqHGa8v='r&u:tDes`#$[*״_>Vnu c SfA?Lskܩu%ec>oR&KLYsb8]^ ;vH慡q8{98O[k e,HVDY]9)w=kKjBԒdTM/LۥjxWxV k֍4IS/"=X$o|%{h}xZ[:x1#5F+cቮe(ݘ1rqT=o*LaR<&C1O' j3Cr4X wevu* ?/b]H<0sVZRTjXeSE* 9pj~ wO:wd)5iuu hS HQN{#4+nqv ;r65AQ1,IK[wpGgoaq9t ؖO. fӌs85G {uAoB-Y1mcُ ފԢ$$ZDW>M`qMp`xdHcӂ}k. sL{{Z|&cg'rA',t27HE}BN1 IF9{DNnFq88#MI5[ƌѓܟif?[ik>YXav=:|W[jư3)88S83s#y)]>ti㿉z4jg8mr5h@5jw1>Udh9;Xs=qk5 CHkx Q͏C= e|Qt/ b3$QsQ]bVQgU?Y.<1;]y% bq'ɸgv'cfKkn\cqxwx:,2q peyG<%*Awjz$ӂpzM)uGxkz6)I|S9f@vpTsN/FK ޑ/]]k[w'uE&Ic$G+$x'cv/cYZ";ϗ`1另qPAeG"@X%`)O\g\_''I-fu' \1#}VsFfޅDbxyw0L -@8Ͽ>/:e乳͎#t`Yg' lxe)vm0[N@:H JTZ DL=>ԥ*/S=HUUc37Gs_\Ni1 `d!la9RJ[DPM,q,X#?ԎxmA-IrW2[cNM`*.9wOђA8[ǡ?zL t-d(m8! @\{F%gY%(J@&$r=z,gβYi R1[\g[ RŎ|=9J<=,AquG z{Vz)O|8xNKTx{C17"%~nyïxPtKMÛyW r1^j;aH ŗP|pɞv c"mاBaeXz'DfZK{D3,^λm)+$a( czzpFm'sx?³iZu=^4dU!KHnOx5xR:d)s\es@yvw ^3 jmn|g̫#%z:y1% Z0F+u}Z\M&o5Lv}*"8U3 \_5)b'kh@8dͧiE4ko[c `|8^k( %-U+ԟ>n澦4)зg |V^VIm$M hr8o6% Ē.s? =k ~.V85+bUpAnzOktoe}AѭwV9;@p;|s\:LNv[~$172J rHp('=:Хl%d,o7>$GMҾ30\Wƿ<>cpqnۻZx݌&:of t~ZI,wK=Ǚ8GVa$qWy]VB(vJv$zWY6o#/#;Y:A9?+8Td Ǜ#r0;J)uϡ> -Eg HWy v1KWFfyeޖwU\+°חj>-Mi/{HD%v,NcV+I'v45Ⱦk8\ex8H4`OxHŵO _o, Ա8 w7WEi]'bv% ,`q,٠cZmaJn}S_e|n~%I,y p'O~%I]N+g̀^[̊6GKHt22qW{ :y'-w,K}(_lWW?c-'\-oxv+;y}R;9'to^E+N|/rH,MΑxyhdVg½ NcN 81uM"m~f,֐̜j8V-e7܍Ȫe*3kwZ\833Si0{Wm:ID'Miך4 *U\cICI I-DŽˆs .F8i&~*cch!{=NyE!+(|GXu8">+A;5nWC7m# EJq^ Jl$(NW`xg6[ >L:r.Tϣ23!aa .~j7U{&UXs`z>X4x>lI=2wq)xi^/Fz\Qx3\𻥅^oj.+A[Ɇb$ۉX689b{K[(mcX&2$8g"Hutk$M020FA'eWmaT4r}ܼqnvq=Kƚ9A=U kaRk1cۭH;I8 Ĝ#/hY~ B ed g`L[xpB\[G;6;nقqڠrx!"SOE*pNGlWLkE/9%BMU-%)1)(^:パK|@o!t脹$͈\*?uMH/uuT+(6g{8 *?K@랤p0Fyz4^KkZxqۮ@'2}jׅ|#g>%P6yvoIA$ Nԋgl>7 K~$q84NzZ\iF%Lb07N<`N;cǧ=Ɲu%&1M8b5#XD-mlH>k+Wc lbcmqo DdFc'-#U%7WtV^MB|j2-bM+ITu ρ>N@eז9= =X>u{$W6;~d`8Q9,󿉞׃u]RHIYmb˻o xn}8Z&D۽^FzQ]4sIj~SWܿNQtrV֊pU$9'<jD?a XwO >NXH8' L]zomI!2Dqi qbͪ",pydU# uקZ~<_}>V2s|6QT 0;\ouie# Fͻ;~@$؞=yc]kSSOl0I$RGN 5Hnm7AmbtCIm1I y_'xS4oI>rF |ۏ|W*醓GIK`"gH;UIu?8bz`g"tYo15 c PsmsookVbXn# J}c5xW5+ iIu(2`A ZY-tem$m+cόtk[$Ubq9$%Loo\j>%vp3%'\"x젞KVox[ů~_McXHy=k#c볉nxP|Hqy[ )b'fYxZյS%Q009^MIkhZ1nZ((LdX d| ewq1pRgǰ-ǐj]C?ui~Fͱȧl~Wv5bQ=t4e-Xs&2=5wO+1G2i/\G-}=ZDolGc08d П;C;R:rg 888+|>m zƼdV.~\RNʊ# ّF`rNr:wƢ-m?-fi(IfTؿ:IT9 wߝoCog (-Qwqr:W[\=|)x䵒[6g *DI=+,t/;Z\$Fŗ|lH2(nIޚFd "74u(M| lne8=9+SMko]EJDRO cRӢG-5<_9#<?FÞ{J,ྎB0'8*gR g pm[8Vx鏔|D"+JC6HrvʤvFA5j_|+DNYXc!G#H' MāǙ83_Ś$vmK'0>^=?[Lm1FNp񎹯lwGhy$YU8,q-«>T8 84I~jq]aI-bIʷbp}OK y 431r0 EyW]3&q_a7O+qpDِ2w铀x 0*5{hœYcu+X}NPR'p uG93 "K(%A3Q/6F oݻ28-s_ojao';I ڦHy}NA\WΗ}WoK"ip|T zg,t +ڶqc#h9 zuN> ]x>3kIv<oԺ]K=7kg 1cj[jg"Hzr\OZDC|)R銁1Nxյ s#&9(T;w@7VJ Ga?㷿Zm7/5 F y-$r03ҭaW(2wq{*b#0>a[5 B JZƒsh2+|];OʣO [vb*9`S~|7[-8D+ly3=ۨ"omʹU*?H7r~JԭCE$8}UN8X?ǚ6uiijn./Q &j ,8@g>;͵!Er3(dӯN|*Ž!NȣpJ>5ty014UڠC~PrS}NY/a`1=+Kvӱ2;[ joO'i)EfjZ@o8OaЎz&] O1K6g;3G=zWZ`P7,#>= B$vG`C$ByF T5nmJOc$(W%h>:׭6۰yVYP,mO6?*ux~Ny5`ʀ[vpNF »SS7&(.8:)s炌sozZ)\'?i7&q~0?>&|*cMn2%Y"'cKU7~53: }Ez9~Z_v9HEȷU|Il`ӏƿ.&]O oH9L}\#2\1-wemWFb/31 3j U|#[jzΏo,+\Ck]BںoHvDU-*@@c> <#al̈CK2wK|'ͤݩ].O$yɅ8VÃgVw[^gLormd9۪=YZiIl3kltR-գyI(h q+k:yy.,f[i|B)#~V^EtxF-O=},: p/ mm͜v%(y$DP>MR}Ɏ8LN*#i=.WacFpb}: !܍ }H#^q $1$Gn7X`pF~n; ^2f;D7^+)P`F@pNv'3ǭc|)S⍿ {yRbs7mZ]WmM PȰ3 p%y !B3P|[O<e22[q`_p`06UznmV@vFYrA[yn{?"IfݣO, #xI-l&eC[u $]qVUltM9jh:RCiR>c!bڤJAX uW<5gq<[]ȿ{p’0 ]F{9Y|E@ #+[O1|/}Z6z 5[dTUܕ'ßW[opٶw2Eɍ̌!^a9JkoV8Wf4oz2I-仑ȚY>36$FqG@k./-uܘ^3#VVDaeW; ^M#[>u='4Rry\7=A\bMo<%ݩi ۟7/'*ON-/ YIBFS_]B@YeoDWh K0 rIz"O,Y3YK ڻI:-׸䶞C&.x Ķ|! SI>Oc&mt-17u`@Ɍ i >FWT MwDGYbSДsx^:nSPWr) 3Y.JQ7E#1ڄi\ʏ0`1547^- mb2 FߑA|64ZL[j 63'fy/Oԯ .㔡1N#V|8Yi}k;5=R73)1nǓ 2=o;xw+aa}1H`>dp "OLFC!i[rpW$=NwT8#aZjzߌ|MBF$R) `6lnߴvYO"2eb3<Ǖ$aU# ˟ke+*>h g#vr9O6YH]q`*מJ>kaM^fXc}-ɓ y!p?k~äxBīgBxiQX:? gc{7 Hǡ=:=NIkfl!YaRr@8޶ͨQݥk\&vFX\#g1z'%̦Ie"JE:L&;=nXTrvs",q[<rl!s;G 5)96@@8C> ~ܼ"E<%p_˘SzНt^3vm {s!A1ޜ hi7*m+ ?t[j +PF9.N11:~[ZԆLT\p v \׏sQ7^mlv!0OO|ey>Έ[| 0۴v[׽TB*Ks|=5ZMIťtB r~ E$ykfRJdcot]sO Jͨ $!s>=yF0I;K_*L$|10BpPF}ߊOψu[,*`1g}5KMK[ҢIK,Bs$t?'|WnABB}6D]XƦ/h7,jsMwQI=QT:+w1]px4l89k5+ ~E!Մn9A9_|~A(r@da|s|kB x#pw:NJJTry?~qR@>{QFir3I|<}EoMQmPPniH,ZТ_(VnР`;ֿ(>i#\&`FFrDsHs<3P ߧ^k;6s^a}o\Z\Kc4F0`zYCz0c5wfɕ᝔Od$7u9ב.źNu6I/ wp&K ӌ6Zw|6CͶ9WmpvtJɘ YqiE-.[*`dg3u&Hi.If @t+Ѓ@L%!nɖ0pɅ\;o5KV:uωWS27 JU%r;n2Э?cO״du&Fo9H$y|`Gyc%6d;uplkKj}ܹ/x'ks>Xx[k{}?V5K"`Fଡ଼3WYIY4nֺ{?ue\ޝ|v vL~VGʹkR xJc[m_JdKaosou ,d"n@_$=RkoflGn"o$ yzVngQ.y4yo o Zh\nP2 d+FoLM,5G0kC__6RrI30;mEF>$tyG;$lzZAsuE I|-v[O\[\$NBF aB3d*Y\,6I ASҸ/tڲ_"GRg>j> +y/[c`g=MG;ZBEYہqRW;)GVQ:O۝'WvS\[NBy?VU;4iԦ8g%?5|M&c*{;źy9ܛ2FE䥵1ilMl`v@F=<`Mڄt`8. {d;#]<s9!IN*TIWZC#3w<衉d9-|7<Ʃvj/,qw'+(Ǚ昊Ќ]6e֫-^ed^5$E~x^=rH2b }]3'?R1xpYZprM44Ξk2)ps-WkSÔ{>9! 6twֺ2_( "]J{7ILʃ85HӅpAa03[n^8e9 rG̣rs4 vγ\ -,.D8VS*Ijt ""BC9^cVz6z4-n< Ls NF A]NnȏĐ 'C?uYF.r8 WZiMG)X?`G>$g5jQs"[Yɇk 9 % }+>%qx4^',)caep8Ӄtsɧ}1c!h1*Jv0v0Sֲe7隌 $Щ"FA57+~,<|!%.vgxUEç'vMsZ< o/|jw|!'r9}SRsBr6"`Ou9f43\}mewouLw@n@9yHlak~ k:e[ZfQWsRmįma[snZy ־%Kx`xr$`8zǏk#|]xt f9&fRX/pխH[|.06`xPI<~k c9nU?t9N|*4![9e "YW,̖:妋ItU|aP,6F rh#II.,>a g$QWY qXmh 7WxK)ZFagť.Uc)T,m ֒jKRS )CX_\Zsť[+I$+rSIF^+4?Zχmnc[O.v;r mذp>NfcIC}> džYHm95K-G}lMm799 fUb:;]a?R䉼`匪[r*Ϝܘ>!x'_ZJ-lR0A6+0ַ<7i*k,{<^Yü n ?p+xڠ5C0' W hWԗWm?̕WaL۹<)=2xB'+4\.ǓƦHPU#C$vı%Eu6$yi eN~`zz$y zI9}[6znl=Q{?T\rH\V #'>Hx];g$pn (lrHJw*7RI^h: 23.Yf?1ppoy]'I=u摿'Rzε[q׷ (gf2Ol~6w7ZxzFѿI QI3IƔ}75t};KWYSNVLxY<$>&7O~;{d#^'ֺ|NԾ,xY萬݈;Ws 'x';}jr(nW28.Pz4͹\MB:%# TF܌=?kt>xǕǦŒh#;J0yq^/CVkhm*Qs!!Y^ǽykݾxS6n-VYYJ3H9>Nj+TShῴ} @\g$9'ҽgvK[;Hy;o1 '+Nlmm[Pcnw5[NA[n@7{9s߭tJIqbkO!TH֣XP ;+x"#_2`d-IŒrv"ȶV!lK* ·8]|kmyg"[7W or@x5N6]rlx_WXI6rxɢ4QL92&!=NQ]4vgÿìȲEjN2>Hr;Wuˁt3MG \ )~':M?KfY2T2v~0Z|-&(K4\qćgWa|;ѥR±)0Azt98ԗߎVϙ'8K Yړ8]f84 \KYZ qYy;=λmxl!ҵ4QFg eUx9O~ ӯS>ȼ&P p xv Mϊ# [XoW28Kƾn4e5K,HKZrHvqt FVg(ݓO۾g Nv 8_#փ+X E.A̓d?.X9#OWHn'7ZaR2$:"_x{]R/ 6 bpQFrA.O nal) cҺ]̥>?yvq)Xgv pJ8)ZX7ԡlWvf48( F ^0W+NuC$ӊO,1Zۉ4י@1w`3iJ?j&k+{)cᾁxz].%ys6R-ޫ|:/xo&A+$|pQ=f? ãE/vfVXC$;f-JkXaY>&+"BA\z}bm1{bA[Mugil0Ww*X}N<BPg8]0f018tNX -Fn _O-dY~WI%l`wӟZ]Cd8@gye%txo 2g fw- zk[] Hƣr1;-!H9O7|[˻ȭmmN.H;-y=gO^YuН$զacT #ME ;M/;;8b#,p ==8+_%Y#ꯨ_[)hl <.z1޴5|\*4ögjw&ُv ֗|/eF%#rpSqFӞ=OZNT̎*Z\5[?,#"Ku?6qמ~I9-fFsVQ0;{x'xFFs*6`S9ex8;}M7^hy06- 'p1ߩy'eKl8ӯ|Ebc[)rmqRҨ8n.2Pg$kNg9L3pv`0HӚ⥠|[.?P$~/0aH u ;w/,VF;Jm .1xΧi/M?vxGI F ǘ}`:F.6d,^Y%`ps4#,E8!O9=22i-M}u%r֑Ènѹ\C(y52H1B5g,Fq qԵа,=J_ Ƞ2r' +<[𵿁6-p0@aq5VE$r5sϔ篢5Y!jeBB@rȮB7<:MZGEv:]iiO𕙐Cc4"^uc+E:(&ۻp-p**EuIPT_! x' 67qףo31gXT9`8tΆ- n $.V0U>nI;Դ[hvHưmی n29k[ؖkP "Ը+Pttxf;Qtcc{_$nukq-U/%TJK21^zu⨑/-.B(L''(p䫬zib+oꌠojTH$19]J(MF!&vy>ZxjeRgd;8ɯ\KIu-Pٗgޤ1\q9WYӤmi70Y5ٕr0nPwN;:ib,aa!Dhs6B۟~5H'yYjyq&#׃T_ǏmIOgsqVK@kS87v}jIeyoo~~YF0r dx\kp!mxyᰬ } s;YZTZi.ǹ}'?3a(a6gAf~nýE ޡUSq?uộYe*\g8$fľӴŜ7dԗ7' 2 VcQ6|ksMqku|C& |mz<-5Ďq<|_TvFn<9'yo75H1$JJ_ns;M@P\iOtm؜(y۸9!H&/Q5 W6?HnmѬeC0qp9wS74xcw"\Fϟ% A^7=ǃ0MkW;p\n HdP$`rI^igs723|~^x>3^a_LZvݥO AC3ߚGfv:k&,In rvWj$0lkyDUS0XZ|KӀo&R x`dIcϊ:d-d@}gLqX}W[C}sW1O2?rOo3uA){]I.W`zW+Z:E(}Q%rlp{)%cJ]>Pf%~/=F9Nk~ͺVʘ&.Ut9y}ܮu{$ y.&b2@w0Q<k>|׾k^_隄Fg̙b#aP$$pF]eUG#c,yLq~L7?-i7ɤ˸3t_TwKʞ.>xb_1G e#p%N6lq]?/^K-5嵹7R8gP8<Ea'xE,#8c}i}{h]jUdck-ьi%sc(y(ɵyoqX/!Y 3;c)w5 {){W9&)% ~]⯁jX^mde*Hdb'o/K䬚r^O'ҥMtJonx'pS[o?'#) ̼['Mv K⛽_O)Ṕِ+^:2澆cIGz=#MR35"-q8^`u?zSNKh, 30WG#|Q%I,p[gGZk~.Ӭ|YY\6-_+N6NVqWXq5]yneRvr6LfDY6$3 ڊ ]mss<6O HK{r ]#Lܨmڽ x*h'Rn-$1ݶW 3IgL_VtqM{>|jΡk nV;m*t%EˌrOE{j?-owI) XrFO|}GM׃?5.wbb!E!Kg=qWvy,װFm{YKw'=֑IsJMBLҮ485F,%T*@NNv.-ƛmprBIl^:g9\NoVX<9Y~ha``]oXtW2ܣIT` w`䒞աS5 yɂ2#b =zA )z'm/? fQ}{}mn3mzi(pۓ}+%*1Z;V#e'? pKSYN^>v<ڗ'3Ddsô']II5Hwy%|#p[zV'񾷪^N,P1* 0 nk~Cmkfyd[Q%CkciuKKw1`̷p}:VI6m?Rnso UT;qyc5E:>TTt`89ԩj@ ßSҾndjmWJOL[f )aIlc'6"hb1p;M1P#J4o Ng$5$MXOsoo=M ry  G$#?&EI6U*H:BQǽWIZ)ay1 l, 8g P'p+CMnw !hm yF=Wa;iec9R@ zP&uRM#UaҺ ^5<"\0e'pb3zsޗ+BgCYII'"C1#޳Mo$vN 3ERaT,Ay.kdkB8\?-5-TLFyqHd ]،+;hՎDDnO1:/Zn |(h!ڹ};Ɩz:*7ZԼY!V;1` RPs@vNoJOshzTjB \ψQ` 1Agy~KG \ 8$\ .4x6:GA`z9+,Fy?4jQ!p%L|%]ܱ xy ~uW|'rY~w#*9bƝkw)~2cVpmp TbKc/m<텧`Ov;]nsKO#_H@>s޼\Bm-7̤žBCm 103R_|b`̗|`$WCKup6`gIG-]h׿eJŕȏb(WaFXr;ɿY-x&6G΃#_[mƁ⏄$e 2PᶂOOO-7s06D q"=3WM+XZJ,vb;rYv6?6br>:gj"\Hy8Ůy#DHc;5pJ=J#Ѵ[g@@A>+J'h"XFT Ǐ+ x*Π%V|!@\\ 랙|Fup`rSW{"W9%}q/e&Dp-lʱB p =:tǭHd(o(7FPpzxޅ:$n\89))4{uvUW}x4{)l'7ե2* dDܒ^{HX6T#M 82Ex:|[̶EfsE(zN(]:@R$R^b hr'VdԢA*<,,("c[DQ u rTF8掠w4J\ЬllŌtq|]e]:p,Xq^rK.lznG$r32,{riߧsOXN*b$bz*~I0ǩR3†4}͝Kmin0*TTӮq="}M4i&s\{e*rě${3(`6u|I-colKgnz_wE3Oiw1}.`6{QŴ6 19!@~W>v]yvuX8 yNBx3Yff&>SF[j͵u*_*ID7 8 sQfgyeB͈YchuXl٪r $=wnD|3ך˿+: qnTBi2mRC>y HK0-@U015^夙B.^(qqj۞mpG< ' @R{}yitW!Cf*0N >J[O.ey#c >!6r0NMN /tęyQiu\sǚ-a>]]_^9 hu]0TS^m"̓y6piplns^/)+EivN (BuT)M$Ij_*C nT8 {(s%Tcy< 0 283 286 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?R((((*X"yR(#i$sE$ Wx;]tS#^Ţ?_ [y^o1'(?AUH-s'~"FssG&Eg=);״u&ivB_`z|5{Gtǥ#F&ʠ)v" ~|S<5ezAN1o<#6>\FQ[\GaMKvK#@tZ\L_Ir}9'ڜׄ25 X}Mΐ!|[h}6I&¢$ LzWx3I6k 5;'<3늚PiំL盵\Eb)un׷hFC#~ggk|֞V nGrW8ڹ񉷍tVG%sVLQ;\ 7; ^em$A]wFڌ{&PAuerFK2u "G]4I}k>idjnu[+ G- j)H < @~]A+4cբ?02*Ԑ&s)V*:)((((((()j{Iﮣ渑h2}~ӄ:K6}cqZMGp<½k.dSayr_zu{>dDFoY=p=ִuEjC*M$ LPl =+dUu Җs|vH'u빻p+S)#;dGM&Bx\.3bٷ7w77D\O?H*]:xO2q^q0|iP~ jǡ̳ppgg9玝: IX9KKK e%L#rAtiQ۽:أA޺u+8>Y.Bm2;t?*θN&UJdqUvE{4aZhzAh[Xs0pݐ3IN[ESO}xc1f/A1hN0=]9 J% [8ZwHl;ksO̼w;э ,KZ$p}+q ip}T4 -Og_ه5 EG83Z5иEKZ#Ia=G4a ;^%>Suo큁LgޝG+ }:P\&В(,ߐ\v=[PԿx9c$F1[ktڊ1,[xAj=;{..Cl4jTcO\^Vyc.v$U%/t!L4MAOn=XѺ kQ}9)t IgcQg-Jrb=yx=]|ZڡMvBBHy*ݽV7[I*[thҜ=6 ZUNѣ[y)Bȯ,Լ9 \XjK9N2]+ŊDg?}|Gk:HoXx(3+`ڈG9y%,#Prpsz_4'lZypz@>OW3xhD<)_W,/N:#m2 ?u>RMh3_V-l`9 gN+͇LװDJC 8$}082\Py;:JaZ۟1.$G0X0A1=OO¼kĶZvkֳPcSKr=3k7ؾƜb/4 CNߎj6WlwH~*A=AR/6Ӆx*d+ѮmxN7o>oUc%u§6ҺԮmVۺ܌8qk6- ėɘ\c-0%Cuy4}WN6#j`(WO$9dh]J Qõԟ+]Bq,R)WzqStzj$:P?v| r:xu%!ǖga:#m(Cqm8ѮkYrqq49\,%ta5Z}OEImsC pזY]muE,f|HAKF;sǮsU9$* ηFoGl5 pөS YifbDj+H/{8]FC}&c,63rNq\=ݬĖhcݴdҳWj探Πfrn'v _$wnq֫^xSW\C譡,J-szo1\} G.\GMȣQs-Alhkz]BN^lZ}V0+asmrjc%V2n񮟴}YwkJ.)a|5"KxZ?N}j ,lP` cVZUKăsǢO2khw7~ ՗S5bB|)nA n9U8'ȧqt,llysQ/j_ E,jx,u%OuAuPeRU67cؓKiQ\`Uv?pr8U*ncȼI iQOscC- ּw F韩< $Qr eQygNXi$Դ=_S`x`d1^i16!AC|rxzV|HTM#++3Ckt/2n&y C{܂9#:Nzbm"6cq&XG1\=ăQ]Y{{a:Z w6^ٛq5*9UC^SPP+wD'mJjJFEKj푔a8#ןBj6'\XJ@m}G11@77*^UYHsFzs2)L#uI^p}߇58%;>F xDh[ekY;H==ȮVIJ( (;>+!~A1S|\ׯ cI0=Y>_`EBC̉~ j_֦[nyҁcAs.]V I$Jp#pGGwW?0]E@۞BOG8/L;-f2=I Wltq(ڣ?ÎNcՖtM*4+k >2)gq <'+dl52K&Dr@ۜ9U=kͭFN8fQ#a:sK2+}KnV$A^yW5}FH2N2B<ݽj̳m ޛpK,[hWu]j]={o4HX(Hȥ%OLr*j~S> 1A iH0=SNet|Q2SP\f{ַFEQ#Qev$a<W`dpwnwlkKEa僷wzR30'r=0;V*=qyhFRY,!raxCRү:`Z͌L :*SPu;.!R2F9#q\ucKR X|xao_ⵋ9G[mI{wĹG^{LԤE(FyVZiPӏ76 -#?*9\VL3,}}}X{]QH+AHڼ~$WӠ6HyBO"2=?n~$]Bitv15W'=kд3P [<&ŮBq[h@>WSmjzs;[;c; Xp ^%kv6K-БZG9}>ܷ>m0VV!NpE+|YkioFU*2k~>;^j7ID3(x.:|EN7<Ϡj:ڊ8.=CF1oO8o_5O[Cʇ$y6K8=9ϯa^aNmF[l `ʹS_OZ}Nt#\$Orke d}ih?aėK#ڃNT\~mY:?۫ !^(4(]/|XI9 J"A|KAMvW]u#$$a|W-cfG[2~uۜrr .ϙ/y|E@+~#{=k-^GNž0|;pD)vzp}Z RUqI.8 1R+1AF8>khgVYI]Ax)fDi,Rp;uV\*gunI EHeQ^{ZE3O vBqЃǿJޟ&̌o[aKď##<(npΕӜF( F=96>.,HhKx,׿^gtk;H5l-"IƭrcGjN۝Q^{— h~Ya,pxʖ$Gַr sKbCÆ?Jܳ0$9A);xزe*9z-jƉ,ۼb|? c3ѻ0P:|ײ[6a['%X0}J&"[mDeqt;3؁5Eqj' 4dchG]ZtϺOR`;vI2}yg)5̷J~{yFhX6kh7{]O< 麴DŠ8=Ll7/?̮Ėa_ɃU;wu ZY]cEbp}9V@&݀l8\ɯ! [Vf`HǶkRm&[wۯPG>#嬒+g&dT\Fʎz{W[N,]g[Y7pO>x&mi&_-Fdb\{zև8"U[(vfG`>4aEYfKTA'עOu6іmlej\rFnxX Vbb}rsetSvPx{M;Ґ\ݧ .T͞=qպ` BlX 7bDs?Y+8T @dǮ94$MΪ\( ʹ$ӓҹ^ߍ5FK]-J[c"`{_úƘoIʧ1'=;汝! ,wZhv=8zt2co|ν1~z+1{cMkmndS^JT+C*viɟ>~ԼE-\C\ٖ,lҶb>QNWºƑio%rJA38x'j.o^m7|$rqךڮ^SIKlt:@w,r>HLkf)e{j_\DW-n:ՕJT;XcӍ& ֕@$sHFpAJzaxm='[EeLR|'] .HkysT(q7i!i2mATpViOtf7{֗1JFjiO~=֢撊~!xcG{ {Wc:@nakPX%ċ$dk嬲MiL8ߩ'h?p;THFA9#9 sZva'.f#S>c pcLx##]^/a2؉ ϞI=$ǭw զ Bp:FC(dY+4%f.Obp\쀄cp;r3n/# PG?1P견I]ޮ]ݐ>9F1Oelf ~Sa湕합ȨxdPFZM"[#̱H;' k5hӼUO ǿwSIF e{G֡h]%tZC@=g0ϪNkh[ؗ&*cor38߳Ӧu- QKFPs2BF֏9 r]Y]ydRQS}4I4yƣaM010;|ȯ=5ڛ4)xG(Ԏ#5x-uآ]7ƣܣ"2cԿg(X<KEќr> J<[smkvckI~wiH5aj^'*n6?"ll_Ƨ8vli1g+ێ߷G%#1r#铑튞#mhVӮ1zV.DgyXTS4h&,2*pD"Uv+kÖrxXiH- dp6?1S݂G\CkNm3F8B ]=W:ݖ,* p#0;24;G~wGHl^LxU/N !q<!=>{榊9kw#F$ISig I#3\RjIBQ ݔc$}i o+T 4JrċIrz;U>;{#iڜxc<.rc:7mZ "|Ms=Q|ozAZ#X篥g"k ,g@p枟5sgs%CTtm5YKC3-6BߢGWHc7a+ge;O-ֹq}ZږH3GR1q^p $ob##קJSrٌgAGY6څہޠ??^?iX&#%_n8t&",6Dʣݸ{ɥSu$*[j1A8qDcNڋMy5%P&Վ8^J[RP.$ Lg3=gVHa}@$pX7׵v[Nxc~"PTg99ڨ1FWgϨx.bX큑 ~׷ xav [ܭ4VPO[J:d{zLRMASdf8,rSߞ5rt^ FHVWZ&M>y>֟ys pMC$C)1;rsN1%=t.I=Oq*4_hh,ܬs;dQяm#]W mEN }+J-CLFɸK7}8`M> 6[[8%= yǭCMxtYH@prv0qֱv4mYiw۳5HB!pz>S{Dhe6y)`ܹ~n58Y%2ZU/" -7u3P`wyo3iXZ!s]Vx%Fqdi~%׼[\!EVV cx~֕MŢ~+&fI2m'd^&mKPtFT ,鐦F5)OnaN૆s~53LbT]fw6y$B0,A/?ϵVtɗHFH6z#?zJ|O3zW=ѭΊ;4ۻ[xY"iX0%>8sG{eEɍUK9N^cIrΩg93t.>y%u[8r_v2"Cp}*RoCU)-ŝճC$z$ qCu'"O%VW"=W//O|!o\;.H݃ݏc֢֩-G*v#7RjESAZ6m9grZ@-0zgcst,沵_6_*EY¸\rG˂qZWҼx Stsǿdch|g͏|kiw-a$! sp8'@um9 ,Hf%WjRG1\d*ssvPX٣S!%L:.ڡrh[,y0Qۯ?wZ?4R=ַ19d?|UOsX{?tr250aG5zgAϱvRf*O]vǐr0qp J)ڻfHvt*v0r9d/W'ȑyup]S]BOX#Z8OS^a㌹NS<O eHe\##'Oz3mv| %۷>R}na %9v`?OƪM(f*f>*ń+*ҌcI#44QHmˢd33ݱOa-'2nH <b\3E"VSf9ZrZn-nMp@9 @~5ihK+c# ]`r03l.o`F=1qF bq/B T9^ :M?`{KDpJ^ʕF*L[K+]5!hmu `lҶ ]?\m-᳷!w)8/sw۵! /Mt?+KjkB8R+Yv)`ٵY++^.nֲ̪Xd/HZϻԧZb ]xIqPf]FMF 70I. ՜QР$i?6'g`8z+DO 1^8#V8xb+ QjJdH-elapian 4Gѧbo hHxen u{YElouz!<j:g{dAO+y)X>&c,BG-EcjDU0B ç@WOw;: ̟E6w>o_Zr4pΑʻq߮k%n52YcsLƸMw/&? g:pvB3l<3[splR#±<ɮjf5HY!o-?F-V@:B!/*HQbXUy90dȪmRN{N+OLs=spI X9E 6kGR<dG=yͦ8"b>G!ykYYvV6x22*^  ץbhd8_i0z<{>`ʺXm̕V(>צzzYvpPvor~Ww>Y>\,s@2kRYkjj&G3ZU.#WYqѱVAߙUO:EuL?h(z29׊(qy=b W>[tg=sv\WVpHf u-ޙ5K`xvbXbNSWV֖W*#8ߟl|Ա閞 VӒ6l<`r{2@X^# &P烌c=Mg6K,J,U~bp>^imt/VҡhP>:Ԟӥu&X \#DQ{=} :vquN%02F@=xzsҙ NK1%5bJvsГcֳwIodE<Fs M_P֮a\P Cm( TȔ9GM62qvWƞ UMr0q8!cz_~c%Y,Ȏ`y\0 j]"ᣈۥxL8#Ϡ\Ԛ 7w .&1'|nJ)N,^ ^`$1,{ )^z T]M4;1ssopT? B m=i ?Q7TY;ck:w+\R)bCs"I9Gҩz||B?Q&_#ĺvņAf~L( }wxy`6#tdgcvDR,xdw2ܻ珦k(7 h[WV8m7V-2lE!RFAQp϶jȡ[g[Wd U#$KxFqkjt!7$+4s+0T 0rVF}ݥ̮F돔98Î,M%;\pJo@`!c /=JlLذSOl3)MY|?x$*:0gzsPf-X699'8޲-_]X E2F>u8]=?Qz_|8ݜzt=둥{}f kFIɝq ㌎>=vo5824x;H䐧xt>ݱ%!g .Y@ Frz+mfr(^G={ӵBueYx9G^94ˑo Is*e6Nsz}LjMv1]&8SoI twYRO]OZEgQ,n$NA=q Khi n/YcVF2q>׊  BJpLn oglz;Z(+$k³2;gr:Φ [89+gOۺhe2`gv9c#q'Ao#M[I# s r'3 i:܃ai~^#Ҏ/xo;iƗa)Y| ̥Ne^}*^Kiks{ (B >v9Cc g1\wkH9$ R298n[EťVA#✖Eh rʊUaA_鱉S·s g?z?ZE u)BnVDZmZbDv|ؐwx0;[ xIk6M;dn $}8w0^ias#{ _o:O0s'|?L j)c3nu y+IF@^Ͱ,b?*l[ɊI$$Hv3\_jHXxʠ7ۏD:G}QOڒg6<5_T$#z22ߵ?S^!^}vR-=:}o&[jFx/r.˸H BQ}ַ5g?`!ǖсa`s\ޓpWKlIqSMhXi"(fU@axkHX[L[E Mx(YW?{ԑhGZkNռ}Q A{ߨT78/"98pGҗ3{YxX|O Lg,G}wq\I-f9hd 9qؐ{_Jպ?d0bX =0\ZJ&de|8R {(Z Y)A"2w/޶VAlm._X\q?ֻwIP|G!m1FӞA&Fcl>RÌҷfOKt|w6;wQ8^NsbP&22@Q׏ >VA\Hzqʥ5pzWAfF"KF.H(IۊEޫk BFcӱ=렆$IǚYK)[|9۟J#zCexuX.i\VG<{xXo\m|g p$c}O9dJu㰎#D du#"t5'MR̅9QFGPkKW-6x~|vq\.OBIR3H l8>圃tD礙,*4Qį(PUaל%ijLŤ=9&#r^H!ц??f#Z]ϩ^CCw՞<}3=97sXAuj9q"8M\[׶5f\IؒplvՆ+K>4M| } F6VJZoBnsusn} %ӧ[UP{fخP?!Mx|ܐè#*d\S} iʀÐXۜl O^aY.5XRTC\Vm%s kTnd8s pd㯥oSXych[vq7gߚRޡrjMKiIUpG$rלV^H1IS1ȭ15XOQv3n  ^A#'2YV[{wMp760G\{TP^8{ Ka& PGq?M+U"bV~#׭%[I.|c,1)3=*lw+2r$qp90G5WAbun[SH9$>+ 6wewpͼ9 wtUK]qq9#Sϥv~k-J"D#\f݆s89Z #M[ՕKȻH@>5'[[܋+x$tX"qc _ EI6cmmG…#m $k$}Hds޶:QZqՠR`~Xv';ܰW$p: ^l,Kgxfq!O݋TE ;VܒYyc<ϑUں >ıԎ/9rnTyMHK;`d[~?=V9$ziQ@S[.lO2pM=D%\7VCA;E"lUԂk,>57jDWd< |g8#^/bƢ]g# yrEnןSWR74@`qRz#KNM.i-/Jgy Ӧ oXRE91.{<:_E^lA %t yÂ8-QkH,HL=̤㓁ӹK؍W;%vyKCwc闳9KKt]A| gYXmԃyP%w*\dbӝo$*9apcs^cWn+4G<5a]MNrKu$`skwD@O@X'i?Sڗd5mm]q>6,czLoJR3ux>+ ,+@8PIX/BGy'+oŗ:Vش&Cw j5#.mml$f%u|AK˫ȭe1dcn޽CWgHG62H*{gxZš$%FuNzq瞞U]gC--xmm"ʉw0~N8Gi&r4P o^Q[м5rq4|n­9mY/.T#w'*J-nE~@Ns=>cOƳ;C=۶B trA=F3B;ˢ&pOp8[F,3s7zk:y єXHm͞%^M}ixXPlCeL6h8ORp?(&vO{ayTu fܙ#9g.T](_]q+6123!Rxc}Fy*+{x ?F=(O|{Gy-}6@敳aԓԟΛihEh^)&~u`8ݎ9ux)l318?ʺ-N 6ȱcW k }CfPqԚ҄.6H巷Z[ <ǖ's\]^J=7NIi$C$`{]5 1~kx '~U}{׏ٻĢ)QE}r]T[K ){v?,ў= bExnc7Jd&6Nx㜎Vm7ڿo=G|u\߃DcM*p.:H1ZqP墙$Pbp{)^0MtAzKhfR\N\9ezb[j6\]L Ld#zd3ׁX^/>3!m?GVE]#r0AԸcM; <}4~h'sp35glM5O Jy;k.jqv}Xw^}q cz4FKk;ho60suYc?wȬ_RS)gyB\jfy ^iƇUOlr;Q{:xN yUAme`2qOzmmYj 2p#9s3g_d8AgJcZG .s#C?nfrB#g}:[6|}MɐٮDBt9qY:Ω0l[qY.q ϥX$zL\ "<+ NH#۽ ֵdX4=;tO?7_z^}͕QRuǯTΓs=/I7@\4o >| _ &\Xj< 'tw߿< f "tp[ɬۏkt89kV}6iW XЖkۓ`Уuaca;5K} n<U$ %j s:gL C EF$Bz0 +^iɖFsˌg|Y 9${#هxe;,}@Jq]Fan.`2+[KqqpIy Ҟ.." Ug>q[P_jVg͞kD I+R'̤m~n9r_VWgg74fNKX,yBd{=*Jѡqa fm\'Y/5-U%ӭƆIg' *OaǗYq $n`q@e'boqsym Ur#I*Čc7$gU̱,ܹ؊ 0 8 {<7ATR2@#yǹ:[#g $CkHc8 syZ+"[rpTn8wrxQ{yep8$kPf{& AX7ZUI)OaB\4 9?1>=}bZt_=> R [T'U=XUz2GxFm`cDkԓy'rmݔuV[n5 q1G@v((((kgΕKt[Gh Tw`hhg ,/4D֎ c+Eo?bT`o|~>jQ\3jh\Bn8/cxF.gyRM'S#:5Au CR>Q7\lu hwdۏA(#}rѝ 4$`B $XrgCýSҼAbwȨ-yl5$̥YPLs+2eN!SC=JT$vix< Pvs~jO+Iar׮xKK^Tˈs뇍ӂ^EPmZC&RyɝYr$~32覷;@W9hVP۰\2Bp>e-Z XäᤚrAqzCdyfk 95 [Mt4l7''vm*W(,rpY\ot"l~iMZhƩ3aP$9k:LgiTw7<`9 y$CԓRx/d'&ygE@@㏦=2 zvR)$$s c-I$dW$pz7 o hѾgY#b2/=?JZ7,ນie$}LArv*6xr 1n6rF߽Fu {$MYM#3Hn9>xwCKz޴zvi~r' ПhSu+%zPcoshwei*NFg~O.FbC:oCxHnUWlsm?Ljbtku|kpqkּK|X<2ػUpwz8xIkuii;/%p8DO]nUՒS:ۅ}s H5䌆װ>KtY'H,T`E <åG+Kgb=K~:A-4}GY\)V˹$c0 -kpDrߦI8\eБuO\ ZS}XA$ {!>U<!4]߹O^ycҺKCWȈ0gF'a24} cȟ'hVNƥjoYjX@眄~Ci^uGqqWZ] []Nn~G=ֵ'bn"^8={~ucx#RCj1l[eR\"tÂ3[u?m >2 5uAk?2d(h.?Yj03y*CMYK>+y>sqc2噈68U_ki0Oc9|u7?㿭UGJV[,cO@GN0?y^giH I9]GDԵ[GkmF+0cΉdz֊^KWH?ma9a z]{;>9n*ޱ1l)O: uYYDMK[V3#jP4 lu vU=oF8x֯xQng {zwo|־%4y-aBcy$I5N涅M-ܗ2NdSs;֕|m櫩A,Pa#هCU6ٖh,oП15KBl)is}e-$}>[;Y~EK}@+asS\X޵Ɲ#(ڗJW_Ad@aҒ|cIq,mHY\ ]COs,W:"g Jiy_}[Xom֧".N"_q^SԼOhc]Bq n?SM-6 Q;힤usƺvУ P@z`z+>,cA-ʧIoĜvs}\7os}<$S`QEQEQEQEQEQEQEQE-n+t[Hf?w0k-p=*ǚmʅմ-І_XFm#XN}}7cr{׍R*{M[^_\]<'"@GXeͻelCǔ?R ^\۟e+'5x[{{p$& 9.M˘7꦳h^]M%Sr uH1`4]5j,pYُhsV0V-R23~ ]$}WKk}5<,`jԄ-WKAO'B#vgiO!c9q(_$W^xZGhkTX?+];z!sj+30|FIL0s4t,ׄiq ,3cV˷3E(((((fotocx/images/show-RGB.png0000664000175000017500000017417115247006660014406 0ustar micomicoPNG  IHDRJ)IktEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 330 367 1 0 ʅB|eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:369 height:406|fotoxx-23.70: Sharpen: median diff 1 15 15|fotoxx-23.74: paste area|fotoxx-23.74: Crop: width:367 height:330|fotocx-26.6: Rescale: width:330 height:297|  IDATx콇WT[{wONs&%IT *`$E 9X<1(kZ{hmmEOO{2`uxRɗ)LJԙчd>>, B{{;8~13s܏Jdi<_wBp =a1k1 Ȧ4:l;0`@X__YE ͚/syf19HNsչm^ ?TÒ,VT]8m[ 0@5$<1d4&'t.݊DYC ),)P\+epV?^O.y!F _x/ B"!5:g(YIz}qNkH~յ)Q8v0NǛ3!v'/_עk0]KK˂a@뿛n OԻg,K*|@vf~l:\>_5u4WU/XCUAbFQIH!"Rʌ(*Q C{񻃲&'G I啒8D$ # M}sҺZ /6=P=DifIHCBVn.y=D7$$!F򐐔&#$& mk2S +L}w:7W~7i1TWWOlSp%(PS *"up9r<J7!}FP6{n'kO$%0u4Fl [iheڕS MCV=n8tζf& FEkW!-.emSx_ <s]el$ P~_\chbUfM9rk׮ڳg4`1yo< g&H >>~JFrr|HdU AmCNIJ@Bi?Ee{'ze cQIA\RF7Ѕ%^Ʃ#g={]vBGSFՅ!/Jka"ZPRkCL^AwMۈ~^) H (!)) ӏmؔWG 9hLW uH$=\فᴲ PRQѺ2gնBX>GZД&GėTO0n xIC5orΝFVV֔+$$zzz3C| TW ::Zx˗044=Jg\b>huw<=J4ǎ(5M2J I*BFVR4E߸ 2:Nlqq=$׭)MY%!+-6AHI'}Kd<xh+Siq/@Y.АIdT3 dP8ōEgkICDTV.#ϮyPR|X {\RESPSUW)a3FQh>'ʳ1|{6(sM۷gLjĩS Kz˔a۶mBHL+S٦,(NZ ͡@:11HʪE$"|vP4$Jjb$^<]a`yƍi x|XP~rڐ @6Tkmс) 7^/#w9]r^^3!~ $աu+5iumqE457{M5hӸdԝWGS׉8uBaa<Ȩ"?|@<ӁWd|rZxJV؋¼E6ѦyYinV=j*aƍwElF天8dT`he s3kCYGIBj.<)>SZ ߽o*: fYU?Xci,Cg-B ,g*L3ik :N俈]f4Ђ4(:fQL{MȬ_{>u_%Y\ݗ_ksPF7u;c-H `tNL84UŊJivqPە7?@uA0w#3>/ } : ەcXI~W"72/`&d%mW m6t ʫa;nϐIJJICNIf8tIh~ z1fl 7c 2-g~!e5 YLh!(bȴ67vQRH[e:&hGMuh-t [H*B}mICmhn9ҋIc^PGUvd Ӭklg78TS-,Om=0C립u5`,w >v:UG 4LgGC#՟_[K#um#53>N[i\b3Ncd'R&='wkς3\ _Z[h{Y3-LsŇ%g+TI}ygǸ fKCgL]ޗ/Sw\X,(YP.r)n@|_w6gRZtwrc38 v0 33|ɂ% D`2Pb|q DOdeɽ 2Sj&o&߱cy}2uc8L9>,(?N28ҳ6Ym‚%kQ::r6bc J5s 9G*6}bu` J5s\rʀVXM.? X: Jv`JVXCXP! v}ees,(YkVss1z! J5s 9ĎlX|.:%kM::r}.#&[O:du`v`Aɂ&X`u`?(iCAN:ÇxZt «xNBm1M{^l/{ K#(, (#'7#zCK;1QPWMhںoD(UytٵRAn#"Rec[/eU"hW^;r9MQ0U܄,N7i x޻8it4!n(>zE8] .Աgl a<@هgX'5~;U=xWRpuރqQ|<N8叼fkANOT53Qa ScpYPY;[pQz :'}8A4NNNFja x(5_8}.^ڎHx)L )%}q>" B\ 򃓣̵(irNCcUNAYR*&6߅;,GXa~J2Qk.8ۏlt>uÓpw [[[rp_ ^Tr ѷph>Jw7ܽ 2q.8y.E$z14֙di_awSx#!ءtK f{cΝ>{3XL{^<|ކIo^նëWN+7PG}͸{-L /Ù53!"8gqEdULLeInj;;{ĵd/=]?&t[bNPK_] (g+L,ꑎ 3j@^GʦI9;}7Q[H#F$:)J"@uBV$⌍, 8z ׋76q(Lua 8&SqfzpQRl 9=8w >^aoaYIIX_C(-سM2*8{02S3;X smuŹ7q-FЏ`m];ÎPЁd8MFh*+1> ,,#3an v;3glݝtP \P݆$NN K=57ǩF8EtPz^GL34wMw Z-_ +wo\a 3qyw׽qKYh>|tV3}FSs+CKj06QO\ZQn A*(߼.:}N`9v9X{OAٝa蝀iZ@I9?4:}3n]vC RJE,{@+)yȨ '#EGut]솕8YA*`W=n`6.ppYm[xZ:ՀǠe(w  uCB\1XDBiu.vc"ujFMohK1>ndʍ*ˮ@'Ji? |#S*Cz$b"v)x]K Hh Nk\ڿʢ }rrC552t̠3ױM] G4 IT'a~փ9b jvv6!#rR[  @Lu\tsP_SM>Pt6*)gTAr̴!U?Ihj7؋3ؼz-NY,}OTʖAm7Ro;dq7te%' !ߨhpAeV oSyaJ2`VJAWO/z(tS=jZ X.9A)Aaz|N}A4m eY-.6dU;qa1k3:dl-לxKu& u) i+Pķ~+W.rvZ=Ep6P}t1u$`{`>vA; Cd*<,Oȶ)\ +(t.b2p,і ˾lj3%pg7֯H+4Stڎ<-LLyk/DTMWśr B_Bv%T7Am7njXr=~Y_|I DSws(|F~N+X#+lRCHKfLʄ} o{C qmiXRf8%YeY7 Uo9=\}Ɩ8|*'-w,({p5RMV[YWg/`!Kt[d?mN_GТ,8xţ Wcc#OTF;%tdp$ XL"+x5Ȋ +hƽв<؉cִ½|4RڝhmENՕ|4DzALq+n>&磌 / ] w%no_PvSmjË^s#LBCoEcPɨlp@4T}![4*1@JƏXtt.^*qvHUxe9%څyAi-ݭؾۙ8zF0uCr7w,-w|6B&\8OF9\a. |\+bͧŜҐ3G~7B";&jp@zTE#Q 6/'3i՛B' L:SH"knAD@GV#3ԏҸPѓ>w^. q-8RXoJn#HĞq;} _o1N\E:9bS]ڪ_-JQT!|?Ё'BO9z(.CMp%c+}3'zs>4^+it~Y\^t6RiF{tPmV CmGb=ׂ 8~x62KeYV"Niq%׸um ĦKCa,W"C[_掗ݶf^zPM ʙ~978Ј0̞[\z˕JAQ;hnASvt`:(Uh1gbqץ9/[ мRXnQحw+͜r9||ڪ qٍF;3~ !Op;^g8P U ;nL)+^lN]D+;z(Wq(iMlt`36yj9/c??5]X0(E?Ue9_85P :ځ*˯co^☕*lO^ExH=Yl{Ã.=P8Mn=QT{x<8ӂRv:텿>Jk!gr9-c6؎WS@lyg֍?\ (yHIÇH| e 8acSA)kC^ =B\\L@yu-PvN&pcUFp 'G\?j'eoweJGxy[꽙eyfGǍ֩3fGocM;. d֠!Y  :ӈHkH)#qST5fHk|zkq%!. M,-DB|f v?:`(AI aRXlr)'.GU8:^B$.fJ)da_4%in>b5 p՝[PE`@x4CxV7O8G)$U8kdivbњyیwUX'Gk*KB6EmԢq<"Jpۚf:rr<Ӑ [-؝AcܷK!6^]Ȫ_"oNQ A9Xw+Hk[#KS(^Фbϴ6Pa}]YՕ2aWḥE؄OdkB8kgN6Gُ'NPWUft- $)2X-i- UWALc &(?P29oy(ˈSSTV MMp*4 5d/,~h|rA9ܟǭJP;dMwO֓qԢ\)g;9࠹dࣩ, J"2[ 16Uޱ䍢jM[gRG=6KSLX,>QAfc% F.@]}X+?td=܉8Ny\ -boJ2 7D |O(o[xo& Asݦ NDPbh^CϚV;yā>H@}j&{-ӠfnLԩ%Gvj`$PUz*\7TDHIhU B gQ;U߄.Odkx N]kƐַCpD<ﬕKa\IM DQ8M%h<w+6O.r&? ݜWMi#=G9A&6+~f mIUg(#ȩ>66_5NyW`"jH,nbB Rt͛ ޺|ϧ-D~YUmnK]ػy"4"ObqUs/GcȔMցW^Z?_hmnDļQ^S=|6lɾ@[SvD -L@k9PRմ iU@lǰUGc!$$ıq&`,њDؙBTDRp AyovdҺ>h(ndžmMz};Ig4PDZ$Sgm/ \N#?L 񪬂,A>`S`*$eo'p!XgRvN3i#rZ[`aiIlm ʤ7NzĦтAY[]̗PU^Z4qOQVz(?Fiȃһޛ|;(W!,}b+`Pie6шx[0D{=˛p#q\x=|Ѝp{?om=3<>',1pu11N}_]By02b}_Z=#:quWm8|Y:4t'@Ky J촞Vs>mgߧ,(YP̡,(Fk:y J5s 9Z 3,(YkVs} {BXŒNl:y5>lT!ow w#~h*x4-pN}YhsX}gY24m Y D2 )bYܺ} ABLR{:Zj7NAx',〲-/)͑k9( \9/߯Axġo .0;U傕#܃ء,ݓi#OT6!1hnǕWwS>N1šOMZ 3EegʪaMVǯ1Aa JFqGN nDSˣ`r.' Pt_|#SZQC6CuSp͘ña >~Zp?,_R&=ͥ,7U¸q YFg x3ZK>((錑ڣ:=&8q7щIn? )NB ~wm89A_]pīlz8]+$@Q |9ut.e+++kWBNlh0K ;uo)>Υ |vtuEQ|06YI&9mE!oeTpB:/{|2X8E!?NѩzJP؅ˉ%PGmX.f HlwMeCU!{ Op?CfX^;bV(8!6P6$\X4OigfWCm7A9 |* A*_Kuq7?dpJ2_[nۃ R@t8\Bb.Pѷ헕$AcͲaw."kvY1XfVh?:4J; g/!7t`A<#z4;(*pE;=.QƔ[ -(чƮo@zh,azaQ}ʢۉxیrSƹf0AP@E dN&f* pnpW*+ʳV$Q q9l[m1amt0e{GbZqm+L_gȘCyK%߂'ʆD|RWKy"" ndA@9V r46T -bPw G(X{˓\#*o*dC6z.ut 黲ZEO9xoUi8ᙳZcPZ)`< 'IJha0PR(,X*`QVte@E(4"Nc=DUkd }CS:ʩaNAva(t\𤸑aQ2$׉FK.9 k ]0 kOx;6~݇h!+ʦx=ʚQP^y򛁒Q^z2|f%W!$o,k3(ǧG/Nyxuc?TD IDAT7!|5Ç'`/b͛јS;'Y|={fq\m`ff%PDiiQ%Pv ݂0.ym58='(ߐj(2顝m0OdS33^Z?J/A>k +?+N-Ԅ-3P@Q@{ӖsUExFV>ݣqNG5%N۰/ۻn m=xZLajcas1[;~60ۋIY(x]pwDVe~BWuY5Y/-?:b&RX>]/[-?2* ߰'+*AnF . ջCA?Up;=H䈕?PH q9xz~o"Y=rODq>%^8ᇘgvBB^Ta1_&y^eK31FнS_܀^Wa,TjTSXeZme1'`uh/I *D,EvPں7d Y<1GË"Z\ 3X`AH#Χl9Y8::;ӠW"2 J,(Y`u``A9#%[?du`n`Aɂ&X`u``A9vі+?dAZ:0C@k :0, t|=zm鴗ŋ#yL d!yvId] G[x] ?rsUNAAJ_~3v7dhw쀲^DԎ%#S*F6ȮoDzF'#^)dN96=O- 0_nCH^NȤe}$C@e T76J+)>#(!ׇA` -<}Po[|.qOsP3WUR&zh1Qk.0a*E;;,R1"H9 IAP9K9Â}?|i! XTl \s1裏>zH"WDFn\~BPHˉ.D{t#g:cֱx_d( Y2Lq0|CW\_a{0CzUhrBM'\v)X7DdB0S#ynkTa(PnAb/}c컊Ô 璉az ƳB8}6^tA%פ@7c?<m)b`ͣhnx8a6DY[j$Ιy>ui{sWջ0hxeyM<~ׄ0?V 3i!fLNU*jI+/Ͱ#P[5B''٬iSj(t񼤙P&{A?%G6# kꃢfPh#ƨ_DBCEaX"~ҨKD): wlhOgWFG9 ⇙w8c'Cf,k0 HF ;*ZȬڵ\}ki(Z{`ؖ`GTWQ~i$\yh_$#!kO(_`($$2BPLYW] yW1&J+#mZ8#9)U:wPrڰa2׌JVnh@?)B‹dԿ_߲_1,H;d#I, @WCjvV %ɿL<Nܵc̾_'YTEZ㰘1* OreiaoG8_=Yh(X0< $`æ1ɨC\JiB,(:JA\qx@Zil?#]'LiQW ,6(q=DF?DNi-&VCk[!L`3 f%[?wՁbƃ^U]I~^݆yfaP$Lnc`;yB4GPn(A$臏Qһ֚ PNC%%9R8#=x\VOǡG;-`-ͣ(tO~<}_XP.O"M+UY9\D?ٹ4S;⒱:ne8f{0Up tNl5"{$PQ3.^r"DLXš@;0vTFXUCɼE8}yq04ԃ 9BNO׳s6M9>r!oB0$hgh8B, ^Kv̐ieB7rCNxFEeEnz ^B<ť a腜"«n qmܻkW!TeE!aDž xA MT\w G+Chyٻ%Q$N Ki ,6NKrn)kȂ-UT#Z v:,t(+@C!njnPN9 iOBEjC`~9Xw<#lՠ6/A(N!0mVܽ p?Nl(ӗ rbw,!q %=R\iEg$VS/()" y8>/M#Ą4p-&m,")=e4pswM䆡di>d>&Z\VEdQ:B )qנ2ۙO! a)棢}}]h*}rPC4CƲpu.5pE B9T[R *E}Ddj>#}TW::2}Jܻ( %+hłv@]P(z7G#,}v:;aŸder9NDF/j@2R_DB,n甑YGexAx)J~\IHNz{6p5蛣P+å7}7m͹pM`4sm,(_ kWfE~8,zA2j ݛ07?&[YGjom7PS@ BU0}vnR=nyNZ8| ØBQoBh=ܐ -)uUaa  ]7U(a{(,q, >ȫjFqAQM(_no(?r_E1 -NؘC=xLtzS׹~笍b 1[L7R2Ȼ/3oZ/5㒎4do$cYY9D[P+I}sH | D$˖k'[+_f('!|\מ7%JXqVGY W -E` I\F/Wyxv {4dA[q qɟ 3k'['p1jGO€H׶ϟ0ӗ"=m۷1zB C 5{[ऌpOF8)n'TcLopZ@!IUIy?_GZ{uC2bU0ڐ gbKv&+2Gi;uY%Dճ޳CyP:RW3U%~]z PK¶q7#yϴ!>DQOƹ͉?󅜸"ՓV1(M]d@up:fgP y%#DaD 7 BIyސ̶cqnPPk#9Shhm/Sfse &2܆rɠoz`'R=DTB7Pf,RVڭ=𲄄*)N 쀆y&=a"[=ʤA'~mXj7܇mh)FLx0bn@FZ>Qtj<8ȉ!ez{z)rCtKd`nc=:v:"*)! ]dAVm1*S~BK<ƛ6)ȚQ( 5#Y2DKa(F< /bqQ^I*)ϡ*l␞ .?)cvْF?@y &.w@smY}1\te4n~Ev1r*bXT 0 X"69 !))O,}ȽZA )%O@h F'0Е>u~d\tiu0A; 7s#q Z AT\g< ~DB,BR7T93ؕNzNI pQ)ηh(ʈCPH:.H`Ok'Ֆ"\30[epE9%n>.et(WO1L;Vf)? $.Ƣqp7w{S/"%TJޅ,щ brMW9Gh'jcJg􎠠mpͰ+rHIqqqH*h"}ob9BЄmta(xCpL=;Mzzim3&aiIq_"R@`B&8\Q]p`UE9v4&,fƇpQ2zm(I>-O"+ Q1IS` ]( =Uy.Ac`gl^^^CC Pϰ8If`EYTP" 9(hY mWOٱpe/[hӂ0 ^]{Xe{!K ;>ah$v㲅&ԡeS<-#b)λk_VWʚdkAFmiX$DJ \PԳZvŰ7Q"O%18:x˳zu:.!- 9YHf_,~Hdr=}g?41mue(j@SU:6xnvگYȪQP,QYet`蜯9DCZA r2PTA|.Dhq3&C%̓Wast<.ȿTTToys0tS =a.>v'Km[hc#0F$;0݄ubaBXI2RPտZL_7kCh31 32"_{J(AH2p|]̣Zt2JB|uBh6L@M婸L|8RrA0xgq3>3[`Lԡ@rP3#N۰Dحp4ׄ鑺YEIGq W "M (i"6Vm2^{ +3hΊ1b2*ߋZBV?a {kZcOF*ȀkPն$u4}E Mmkha@aGYe̐-%u4TBSqI8d~Y]# \49#]sVzC"L謳E4FWeB`yi/p  7q0?|ss([H.@]jZ/]'ڄBx*J;՘ {U:olZ6u?f&-"C }FԾK +u(]41݈oBCe6 B2Zp1ׂ GȪ[U$x8-"!<8*b=Wmv(=ɗɅ::ku^eEAc9BB -3Ded- qQM2~tz9u^m$LϢ ;|w2jۄț#fcXĵ wNH4ۿ x&NB̆78҄릐epZ9+8FZ}.i@s3E$*BW&Qi )<-k{d]X#[@(RϜq}ˣxAvx]MƜ!esL4%4IR}[94FKEme~DG"KboIIKS͸A:abe)aD5E2Z }m5r`8j&W`)4!H5=㜱1apjU = s82‹gk"amC5M;Ec))L FY!HM"Q;6C:@Sl5oJp 4+\;Lzx1h*JD 9M*Ezdy%v2\N\DžX6`0s݄%W gRFZAý&w&xmI[4XcxuE牎B+#AJǕ0;PxKGΫImX7Ո$d8J-r?, a)DI.v6fw!q5 473 چ^(:i1G,-3}4({J,&Nq=B, zg3ihÝA埜a;0EFXf!uZ/A~Lqʋp.Ϟj /,z GQjh)>X JO_R."C%|O Ν9}Oha)PΏcp}v8Ymq|T6( RCzNs(NYgQч!=?Lݐۺ)'ET?(vyVY$uodGq+|upgeq ֓űS(h;N;S) BQ X#{n" U[4Spv{@"ۣlL mwC( CY(H 0Yބy)>޵8ÙCuYx$5"TEwf܇?cvc(i1N05nrn4Õb<"R-]$%Cy^)d(HIPD\5BgMxH/r M.vF)CDEeQ5*ʧ~ x#=\^5adž?wfZ8֊^f6GtzHd0[SmK]xzۜ@8̅ȴcy*v$.Uq1ADp ki\b懿;<2;'K{S`OmňX#q=[;Dޠ+ț\8n"k pAzbٷkeU]grm %k/CH()x|xuC? eR] Ď7orh?ur"D\'K_Ur12Kr1x`fx J&FWD L oĮܺno(' }q '#<h-zUӸS_~pG!$Na\1:^ RleB=g=Fƙc~;}{̆}VQ8_Cʮ0HLJB>}Sk3HJDaGA91TPmX,|ӢLM +(g$t]kWSe_*DdsН9Y=a)@Twsq$_! iдVw56,RVQb d7ᜌ ?Zh>96K {^9LMOHXj()b$"9}u^;{nVW1(|uJVxv#."%ѐCDfE@ÉWht9;o'2\ۂ#>U; ˘%Ѐ}^gʹI_^3խ/m~}[ %cW4sPK,ɚD_()eEd]a-P[zP cL~VPGJ5 ☸ 2yn'x7=JNP a4ӂC:ԾLɍR8//jz1Δ%x\}+KSLXBɃ- *jLNc(A:[FTJ]U3 ?h@?Ƨ6Xx *@XHz8M\ƢP%yPeAɋ@()"xI=J8XB[M\QG[L%)xSN] =` TQaɕm003x,#^ ؤ~ 9YOVWl:Ѣ!ޝ(ZJLxbW$n>sCqJf~Z3 ݲ:/g[J5DYn1l@E Ku*G1D …My8QVם!؂xO*CJS87rTOZTISX/2CC@IE[>EleGdQBf}M}+GW @[1WS R76}&at4Q78O /\'^#/1$ j7\ ҩnӀA><<^xF@FXMӑfĺ5kSGoYrbpچF0:2޾LѭC0-t}t}b{3#T]QI?~*~pǎڭm;cajfAM01V<,>JF@0S,2&`H( ھ޺g;~)> 6^_4ӏlbTݗaax]= yO u t]4y4g߃&FSO21DšD#\prCzM2XBOqM7&3 Mܻ:#:!db_=+]He~Kh> XK"vS/k-zͭUGP#Yҽ eDNZT3m+pDSφ3"2 lZ* sW_I4%f ǟ]5@KYxpd2[mW1t`AFh< Kax3-ۺ)<D[PVӂ%W8ἔBWڋ(I*L/]ES H U*ly>6A~]bAᩞWU#̠HLSZdG Udd'k(s: j+  O݀7_7n֘O^^T OOOܸᎂyJ ={'70'l=YAhss2#e^ nM#?5w|E5rwqs/m\:DwuaҺ-xZɵx>%䨹,:##?<&ѽ;D{3-ys+!Odz\5oL,lF`8ݏ”xpuEBqǜ=ceFw@!pOgl{vvwt*m9Ѱ~ontx2b_܍SCxL8;։7OB`sLړgKy][>'f>A|򆐵Z>" ڴZwK5DR ܇JEwcx2^ `ԡlwJ2nT+#Pϣ\EF',t RU)%-#,F4Ae?yu˽qgd/DAI IûV䅩a4֡}\.L8K͝X:{;1toy<\xn28$d&yAIB 7y}Ÿ U7 IDAT}AYS}N uH@WrfF{kn(KM3(&( `G'\w+/''8#Ѓjؐc^H8OEF eQ7 4t.u/Otu+Ǐ R1Dx{Wg!g 3-s3%bl3\K|u GIU0gd.Y9CFL!HXD2o Q]%me$Ꮙ]sSS5UaA6~>MGJmnS^&[:%t}zP C# 2Ha8%apr(&x{4AF~\Ťy-ǧ:'d01DZ0W%d\2+#b   ӇRHFг.j+iζnƣ\k ށ+Rkz?=i !:lC 5OȣЏi%V6-Q KtѬ\(!ȻaU\`=M`~&C9@ rC [{nsEnq>UX!!Z|?YACD\D] 7_$ҾU)g~|єJxN/&$ʼ'0qŃGpp'Yp;E͏0ː9XKZ(4zgAX㸶7~( ֦A[0=m`_ 9f O0; c(݌p aɝm(m%Cd<^_ݧ>g [^719oANVojh1e~;?̪[3C[I1 |oPs?9E|?7ց+:00SFv5D?Kkq^#+3Ő<~f \@%y t)Kڴ=J\5x{\c?'t.ii]% wEXr2'b->̣4p޽RCIA!|={vZ6Ho[~ddBoBB> HsW9]4PgHzeq:[1J8e8/}ѧ 4;7QF,wX?/@#6c0Q{[1~$eT SBV-hG\wb(5 !8@]u A`nh)UZ/?C+B\gzjpB _7|n`*Nه~t29lj8|֏09619z2=}{4Hq ڦV~AaP\*.dEd\}dP>e(Ycm#NTƦX&!b_rVzʥ um#"9X nXk"W %)hլ&^yi%y^L,XlDE|{@ p}$+"˹ #8)$B'6xo7Q.z45'$n˙ Aoa7P,MBP5E~/6 ѕ< o;$x)_<Q\pgN]A,e$ @Ò(ўwRʙse9s KLBl޲őGI !&6JEyip 8\ӉuΜ|(٥9e9JW %\JB w&ۛ`j;$bvf!-N4y$?r aI[VE 4!::l_Dk/;z Ή~"m֞mm %B.Q e][9*HJ(hkE404>QA=4,4ثCZwcb V ?PR/ΞD%:) H˫^f["jfa,I+{魂SRǣ  cnA&8\@bac01PNWZM vwAA L)Syƣ?ғ*þ˷BQ]SpEڸP -P (AwCX0I"¿dX( baHEos^@ri 0JA5zڗF\<ayZgfaat}W8ð0>-G۸%)QQÝ<gj7azfrŮ?K E%BEQQdun,-v:e.y .3~J^zAXHʹ(~: ikc`F%.W@h^߹!$G\ ;qN%X P4HaO#S˭ ];O5QgU%%+hii/U2VtZ~-F̣\Yh4qN?D '8]ɦ uFy`,-HDy<~"a /"8uYG [@2Duи2P[6s떄NH.^x_EP?u>‡БFPzαrV+T!z*=C5㚮8`o eFcxy'0qmh[#7,OUSreSA|<Ƴ( 4 ikmyp>T>"wDHAoc0 ~*cx2"H3߹{()7ZBci8D"-v5d cF}X,`ccs?e # y*9i,,z(|*l()ʎ'΢xFYE#A>2ug`!B :\u#BӓhG2/F<>xN^}Pr9\J`d2_ ;%ʹjJNHC&f7 hw رzeD%p3ḶTKE YK<yǘ}NdpJ&q݅= |JBLEI ~!b^PTR%T3H77{2ͅaH /K+F]k6G9ž@I˺dX)ڃEO:ϕ;vM &Dj,ֹ.٩@(lˆOH㶑8(dFr_C:oJk\D^ mG8@L|ѻ*x(E Xh()4Չh/+˨I2ȝ}kognK~5hkD0F$N (: \CeR*>%hZS-#Tn-uZ<"t0nNmz}52*CNi@0ʪE39dS{(mnGC qw9 oHYT4?>L%Bfvi^SLNCuU _s-4W[0w9Zp JDEczEq"H![;B$xSDs[VR8FryYAϫZʹÌPӃ̇;-2SxbMu9DG“GNS(bkv%*{O(ȥmgHԅEbzJHpr!)<7cYl8+C=4nf͎!+̎H̑XұI,NƒbtrNig|DF%Sbg!* ݽe qeSi[ies+4޾Ɲa..GEy!B\q03Lg̷et-#g8M%('M茋sc!x(XXNa=":z{| mupNDb"P6J]5hzQg΋sdmzn3 %=&ԀJԢ)CB?y` :y4MoW*hFUejjM 1c_f6*YFeSa6wCS3ysWj5],v4S[֏2CQCVUVsejk}Kxԧrvv(iX"CUSUq\OCe͌ơơ DuU#>n%bڽ@vԐ|kj1T8;ζ& ۝Lk-W,>2[16܏:Szxn`{F:{0EǐcɞzTԑozs971@_֡&"ߛ^,'XWn_CSzhjk,L1nd'f,mzM5U$ :@.XѮ ͘2mehs]}\Gyvb{zkG7fx>]+nO {nt߯Ӂ? %P t`[x;oLxc{P %ϛOvЁ=JB/ۯ7ѱ5S0qAj_c{8p~<~asj!a?N*kqyt]Q:|Z7PJBiOP]Bewuj`oHCO,f7w2ZoDMדb:}c_?=Փ˄ِ!:i_39~2ڊ88Lg}:9 y'W_JHt=뺔!Jw5igԤDC byjʇ 9Bzۓ}~l=Xob'4DA9duS\o/03(D\_klr59o 6aa*8b 1:- >` JsܫGD~aMz#4 UwQb+I~nh!niz q:ܤk]d(&WѮrDlF^?:,}T oG/[:FxGw]!v19];X^Uq/'VW(:pQRbw։%:9a+!.)C` PT)֑}maa9Gq}7y;7z ]^$y9siLgWJ2in8EJWa[SsyJB'!EH?1FXNtG9 %5 E?{Um {>O'f%#9 9&0`N( bF J9I9s|c *m?SZڵ\s5\s#:OqP,dۓL1Ҕ=jPi<:0J"Hv4^V.^#SyL }6ڍg.GKi9>#a_GPXWsNh :IcY/)i[:D,Ly60/.Q #5ߧ Roo-6]%l]s ݏ@8"GbT,_c3GZR84ʚguGۘWf%,6s'P };eQ4H?>-&  #:G{B9QjDŽ̒s];ee?mn^Ihor{Z m뤃o3'  Pu?R#\[%^sخ Ń^o1%Ə\Ņ7>y Ǡffg(A$'$fq\XݼNio]cP'ɴ!p[avi$x`x=?bCx>?aJQA獠?igؐAsCIJtm~ g"9IDIߌ; O#$0A4I&zT,4&'/0߲黟9F4 ' &a0)C2 hoECCdLIc h^a4FfCO`Pu!FU ߞhpohR*hc>jzM"&Hbr%,hpjFXn/=<ߐX=9d2ۿ-Y+lq)S^)w nKD^Zu)J{KOlUGJ1aף]4vI|QJquB8h 8CMFh`;Dmk|-9ڻ"OJ0W.[rcSf\博1ӫ'_.K#1- R-egt ד8#~cuH=΄H̑D=:-[p{n׎BwVW09oL1k@ܰqq1xFR#%axGvP\o(:P DuN|0%\d}ή " w"m 2b\HNW8!.;H ^~&_C?DBd| Fwxkߛ(;b fnLա$!2V Gp7ڇ%TY/i\Q׻<2Ř o@\k  wMذ %!Q񨨮BQFPOaEf% !XJsvn{g!.#.oN(.=H_,R@' l6Յ]C3 sɈ{ɽ;XE_sX/&.6АCJ4qn.ԷDAxt/f;sT>A唸mf bis6(՗W/#QdsFQD<:X?F@ɀ@C<G y_y-$҈Q> "$ y/ߎ(c~,7>gJ2? N^omE=g:arؙ@N]+0ݶAe+؇eKA!'*,,JAngl6o_+r}(Kz&zqDM,zL(U3F9BJE ]?sÙv144tOfJ?< X8jPS5ABQLD=/_fqy*Oy! (G:p6ۅg FAa%}gLj #`{/=@)9askl9҈O #i|T?<DavDIaFasȏy-f挪^9ѫ)XP` r,QPݻsg&6'?{+Gߐ#[`bIJ7mI9W5>Cr}n7g2]::0TY/ P2S#2w?nv9s s>"q`!wE!K2fcdf!lh vSl_u_Pj{ F`eFaM5At8ivˈ(ENa.X_OcJ|ʰ|I鈋O@tlXLCT=~ PSؗ:'˶2 >iH5 b3ev+qv"Vo:*:u{\}TGvAHzκ_͓9_~+{fQ9Bm |_6gTgKW8mv]['sڳX8FH`_ yRg?5op ]e"\ğ? _{3LA8%KF_/[M͢R[ %Qjɜ޶jܽl~'s?Z!a6{v<5݆b/؎F6?';9Xr{$}0^:+gV5Q:Gɒ痭h/̩ kZMvqDr2g 5 cq`ɜfH6c`#IN7o+OL>~y ĺ,{>9(ryza$a,M(bdΎ7E覸ؙ+^OB`;X'sxEc5jByډ9̘9C},0`);e&Oh}Rc'N-#78QPIsҏGPC"+D|\ 桌eO8uS~2sEBYs0q_|]7>KۏD>$o"P?mQ]?eRJ(E}@@)@,'MDu|@J(hBr $ؿΌ-Y"P@)F> DcOy&Fa:> b4!r|ཁyY<2N4OsrI?uvu>fU ;+ Sz,,?/Fem#dEχd#K+I*=GzKTK:hՆ~233_X^%Δ:(,m󇼗zbX/{o[gCm-\zF bƽK6`?up7~W~h:44AuWMQ$OJ]4XkWkjυ={V~Uoje5*B(Qr|!ֱ8?4aW%/@x?V" ӆ~<?shhCE]h G`typ#P#A/ySr%#EaF0M53Tu Ph%G5܎Ȥ \ 4[oȄ/~PW$KPJFXsp;ʬ>qd㤜 N)JDƚyI*>5G-i~/`d!B~\ԩ/IOHA?]83wo#iڵw4 1ނyظj)@*&M?%7UۍYW E8Am~55A@Mpfht! ^D3EMKݸt[ Ӹ%=T\"}H{mM$<*m8ԕ#ޛ6@~^T5ehc7.ԓyG}NW57vM~y5bz=I}$6 ύCP1?¹y'ϓi>T 'E|E ɑ{BFkmf{v#im,.=m-P 5zc O-gk`wlU!W4!AXo%0;[vQ/n$z9@,~JNFɫׇ|QAX7hhq"^3$TdյQ4gjn(fb mZfNYС>4yc".A*Qϩb`WS2^ *'N؇@-> *28P^Emwcڤ3o&j ~Ο^l@9bz68(>0d4A sBh,}ms*)*EG{28qP̋L~G5@6;fGǼ'1~]B(l1DsCN  {ǣ+{\i)aC(rr$Sz_/:Jpc?@'TTw2.N԰UNGd[`*(v6(Tw8^ '};k"oo2*%X0~b"bM>(-5b E4驫K^[Jodc˦\o(CP7hzu0uiz0B_Q6#ɫmg0_t Y6dw﷙0g@6RUSKfNYC[CkW%*%Z#̌}[$.֛!n !/:V,\$ŝ[dm1 (Z{'ͱRUzzZ16gqh"lfQC#o܄+qʜ{o3u7^R".G glGTtl-7FT 2nYJHAEڦy{'[OrWЅ6s[m$ ߜH =&*uDZN fTa) RP ][pF`!~BP'!a$>AmJlw[/eᷰ)KEӨfΆX`NyBuA\lR2w$Y`G&_+ h%5s8sIrxw<ǒ-Рd9qN'<&nTGBe~ {[S(&=).[Tށ/fčAYg#<)LF9[sx`…8 Hv!߽s{ Bs+"gځN4PG˒n7N[c_e 0=ꮙg깷}n6dT͙}v_gp`1% n]2VF\,=W1Xco*Rb3Wȟe]z mHk=}_E p[7`x.~(#.Vg `-(.Vyk܊Ț;yW|P1W+3zVular?LPv /M(-s/c~ ~qq ܣS}%*fÌ",y]c.;u,}=h=;m8S3\6V 4 Z ·E\u@Aq1͕8*?Ų1Vd&Խgrl&@>L߼ 0~u2Ǩf֋#dJxqHk..؀utOg> PrwB -.1Bs$۴Asz \z }84Ѕol!:Ƒ:V7SՂFtu#Vh`"x@rq4DiLoWs ̔`ǥ $]J> x1a~rkT p++;<6$V_ ˉJf&ᬅv]&jh`EwQ6jM+U؞A寐~3CUbcŝPveH{ ӹ &S3ߗ>]M!P^'JÀr73Sz<)F_O Rc3_Kowt3:0Bvgdnw$s>}okj4L71q#u8mD$#6E?f Kdģgg}ƞh¯ON޷l<ߑX2%2ܿ!2v so? $c㺥_:= פqsALMd_M:\RV 5fLOw7kd҉+[#z&Ǒ6AUhs݇ mTԯk,{eʸ-&\#N+pIC d7>)͙p== Hdm*޴bnuJlHa.2ۚis OщMXftU/l^,,"|oE;}Ed(Wd.M?qdUryBP4驀#`on$ }<\KVNg?=J`g13ʶm? (ֱ<5 IDAT݅NrPNPs7PVT"jj肍ƛ(s>F'-H}M}#w~PoGjmBHv)^".,Zgƥlz;+Zp'L(`!tE$9OTttKPEL7.0a|4Cb#c&;;;!hPkeU%hjiy +`jgnEťhnmCG[3Cm1Gv``j+}L 1ۚPW ڹ}"(k@#X*oJv /e,iezT3\SwVPA ;㰵l(sZ){}5Q0dq)8:6NSIQ޲Tz;t.^h=cޖ|M~1F!nǰ{y;\{8ɋ"+*'Nnu(Rif3F}χ硬9~4 I͌W@َSWoXNA>~6vవ/J:6e8%WV"[",W+fC5lͱS8~f`I _-Ԅyb[vǺpk/ wx͇6V#U8m:Pۉ䖩hUy}-fUu%^Ucрى(gp5j/WKpm_(CcH8 u7auո3mS֣~Á* uʞk#@7ݜH[9k**~~ݍ8S^GA{LkG'q cOo1ӲD|%tOqCtˡx:zq0e0PW\GZ3G@YDe 'laii]vakA;V7N>!?})8v r$ 6[;.1;ٳm;m˼Q3%đC9xNP8l7i쎬nd ֪LܾjO;g[ڹɉMh[Wp9D?v>zZ]{/V7I6kFqh~(Ӈ"9;@9n~ּoS Fmxy5U#h,NSx ]]HmUW 'q ~⊤(7Z{14Lm}Yn^:;{my4@r F<7`ԷOm0?Xp{+ogI;{/o*~.^~+Rf:A]D}@J(-eiX~RJ(E}@@)@ EJ> b4!r|@J9f5-b%o"P@)F> Dc qmfp?%t2R)%&ul 脗ѩh홢l,߳x~!(2V=B99sO g?s$] \z<^NUH6o^k.ЩぽUy\q*^QHz}y{W._1R|m$wq|I7y=e:dO|0 >Om\L< |ƻ7YN 2x)ӟw4.NWpO|Q(733pWpJI:f}&Ng&E=8;3ZH!m0Yn\j:·dvKJ`i)ɭF@Bup);JNKHюLDOBZҬb^#-p;c ߬<VKx[9V!ǵ|5tP&.k5+I(h҄]܈Zygr^:Zu$P ΒB,K󄁆!.pU B$5q(O0x׷)H=-xNA9_zhŭ86| w7顷.SXnڌ;S@d>CD5hS)sԠkg(Fa-NuYrHUG[L0q>ʶ7ׄ:= + })SūGjr cm3~x_D)'w:X}FI}EI=:ֈ3մ.}SxĿ-V8޷mIes 7cyd3t|3Ԭ](:_7|/ƥb{&;ϱ|J "=Ҽ`\8y{9R E/)o]Mn^hp5:{kt,2_D%d S&q63Pw0ï >R;vC}udv\Ì.Nic 7×j|AZJ..z߮FμÀr+ kFX䗌eO9eo Js549U3rآ hX7ٿ{b +\m9뗭Qb*,P $Z Y,ˇ^qKU)48'1&\%bkQ!R=90O3G_=N^pYYstRѯi[p}kmEVQ^sML7L%?jHYʊ? gȡ'l"=ڝb%A#|zS|@#g`i 6He4s^W̨x;v>4s> (DRr:H{HHqjKp%Ϛ9 PNj9vlPKPvF].sDp|,Nuj{| o0@Cc#< |l iR<ɝf3FfV]nR2Bo-ClsDR~12Bews?Q"eS+ֺvOCev#|*g@9] +۱J{+BdW2}-cSIQ& cF6Pkn +$.b y\1:&7) 7ITSo@d!i u(G⌥>k)2iY01^OEEMl*{x>jow' Pvֿ20~ /܎Mݣ B\TK =B3{l#odD\1Pr Q~rv<ox]9^sG53E@u>:dwʛ)1Gd.6''˜Ag0oPrCnpWT gO朆 qwyxjG PIm%".AUo|R2lEI,W0k(Kgjǐ7BLLu/W^,rRQUkA:T7qvGMld휕YF%aAQ ˅zFB[GrdGNkPN)DߋX\7a-nU=l9ܚ:D~ĥi_(Z-J y~E< lQ 9H M4oH@va);0Y1Bqi(gm,BY98߁(0ںAA FВx:PpA3ʦ @iCcs%ߠ|rgR(Fue|G(hjCVN!zЌqh-CeiYsgZgOBkcsu k^#0_{jqnl;< J?*>Rۈ篊Qͺ0?4V,ب|Y>d|sLLO(FFewp ({3jZ:Txӂ X[)hFCm9c&T545 (j`}zpF)~|ej:ՓO]SO8Ȝww+]qL".98 f {$P'7Xb:hj6_pEv1j,6]% R iSP. zjY쇯`O)5Un]|ϱNU59oX Èvم@ck*סcMb,zQn:ƆqUUZ*w cJ. H P4^S_zz=(jA\X=/[Mm-k`ӾS-,Zрk?\Mc=*zha E":0Qp[ZE[(§gX??C,ɺqXPj!͏73ҚXT: RP[MjGuhBCin1 LZAᕵX-KCFgM~.T4cK|M|7-OWzp,=31ևf< _@9Q,ldQhExp WPHg~A5AA CHp**頽IKBtdzhX2v\1ր#~?p}AHIĐ_2[ U,#%UP=j*! GFA%6 G*&b|Dsw6f;)-e&}4lp=@rx=Xr]ڇAȝ8*umQdx;:ꑖPDDŠ Ѩ&0X(aw!Zj-@,%YPP1Ԙ6N\\|V^LQ.S*yȘxWc a"Q2.N|>~BJ;%c6iB|tzlb dk}/0YJ_ (NE낟_nW}N܉RJlT;:~" /rV[ʈqWE>$֊IDAT6 Gjk= Ręy~gfў=> b4!r|@J9=~bŨM(E D"P183,SDR&D}@@)@Ol>0> b4!r|@J9gE{="Pф(8m61݊/> > 8Q(HegeEۈ"Pф(2c)F"P@)F> Dc q}m#"P@)F> Dc?ʌ)>>0@)M> RYvYVh?@)M> R(3bt(> b4!r|@J9ggY6m(> b4!r|@J9̘sѡ"Pф(HegeEۈ"Pф(2c)FӀ9K}c2Ҟ#C_ D}#3zzm#E#qA{ED7s&@}cFJ(E}@9> ;_DR&D}@@)@bD!F> b4$!$^~2`?Er}y9 @YQVBFB$9?) ={Wc@J(r7D8C'JlJK ,M/ Ăd5&D-xI~2#nz 222$QeX@B. \"P@S$@ى'OHB6ۆD<{莋q9ܸdV:%WW %^EEhh@¼=ԏL<|.\"t LmoG "߁}dN~>ߌ]q30g+)#Jq~wwe'#l,ϝ07ҁ6X~mC wtC7Sj`VNwQ7.PFFF =i0,0si]4vvI\7[-|bgC#,[s)^"Ph߷݂^9QQiqPQц=#Ȝ"56%1{s\=؏p3\ ;hȋӊ2iVrx#` [f4$/ 'aJE\,A/Λ`DUc졧nS RL1!}@v&NV}q]D(@2° |F2V.u "qj3֭]uJxM S=-+V@I]3{=MxFXb-,@a7sfQe7F~;-3L>zj"I}~pu鬁rt5 paj:m^%y[~ё<"e,fJ80 ^R>*J7%}ߵWT՟ڵ6ehI*( Q4_ARS_TD" yC5 y31黺G0źd9?uw=;>Mܴ2T|u bh5I/<ԝZi%;(cpP @u=Ćqz\F(fzF)ׯçJs(¼oǿVކ4>9v XO;`Pvh{Nj01(YTox1+RpD ?MP\zԛ@itu܌G6"j~y>~H] %upr=O`(>rVt fmI}څ__i@r| !RX=Ң ]#>ƒ^F΅~Ty/2Ea2 z ʹ.t|Q`Tec͊$d\oz8C J+('\JD͟@܄FUZR]QؖYLs/Fƹ?+𻅋hZ K\ J E+QCUUi"5pwhF ƒ ߄#3xGy( 3cyzoV%|y. Hi a&B*g/X+ Q67)1^qw-W2 jJSoEu/HHڄ`Ykbf,^|7֤FC&l(= {3QmmY1oq,TSƠjPh]Ji?D7}ߊ߾^<)vAl;K%TL}m8qh ) Xn>: 5(1$ҵ gX$:sv'c$?T.^HAH]p@C)؉)UP=i{hԖ#o Y `崆Z0lPˊVR)GWChom*kPgBy]T͖'mtbށQQr"A6™#1M(`f&)N3G-Aa&A쒓_t{YCAJY6@ǟbqPri}\ʟ.sd&;C&B"g/(XMC+uNMnZ$%ۭf)0?sk5>9@pgYC;v؞~n|3s>-rm+WJIs;iU8i2g!eOW4׍Y{u0V P PNp!6Z)c1 [4lѤnDEymM((GYm{9G:vYx\ dxpGm qjк,jdg_B/eryy@ײiZ Q}M50 ~8v;\xvJ*(]#,]y3=M#eX&B*g/(:B}LȆh1?C\AfBG>rE7NkV֡imhFr^ >JiB.$|; +%miTJ7Zdwc߼}=4M!e(1;vj(Fs#=5JKj$a'V eD 8nHGY/@a3 ΩeZ&:ӑ=S翹-n3&$!{|QRRRȀgȀ3^}_^ze@RRhB 8 368 1000 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?mDUjqV۴x#xo֬Ks ;Np:;-;5:eo=0c6O֤Yyb61V;R g(d 7$:8@1QPŦ/zzWOkx㍁\mg\Ulo9% qZ3k+$θ{SJ9t>vo i`wxvܠg)5ۋ]A&f$nE_^sĿFv[ڰ3Ϸ5{^qZR=7|M'P8Imҙ^6Lɻ}NSۀukQx\# p\asK Pyμ$zMy ؐn?Es̮Ԥoٰϛ#lֱI(edY_LR$ PWMi|灚'cWL,>(=Nk{$d z tkKh&̈́`K RۺG$xRx 2=3OVׇuYzH9?O^]J++[uUhf7r;ׄh>'FSp[I$XmJD?N>xPY^6p+H#91_ƩWOv8=5㿳ăKR ` m38۠ o⼶%Y<FקԪJ=mCFT痆gN}6[xu8Y^i8L{)~&ٱΑ# dU-GHlK2{]֎'i#PkugTG"- 1y|_J ƣzc~H_|וQ-2E$mppNy*tSS'~z>t <έ1!9\$&G$.20}e&3̳bUK$sg'/RvTn=eЗ O,G>5?g$Cd^9N?5 bo63횡{7㌓ǵAe 𬶹&bV]+{,+ս}9-I$u <է#5M;`>En>b StpJL8iA#_`}/y=l\GbȌOVOݜM!f10$`3Eu[_1D>UXlO Yik 욨`0xIJB]AiXyQ$rdWQ 1 # ѿϵT[_0w;qU9<Õ xz↛8qԃ[m̞Yd>S{~[VPF;].ѡVOtZiw*1oznA]>VS<#}-\I;MuZq!DN8l8l|"p9ձ:u-<L>D;A)B0Xy9[QH0ؼ'{U=X\`֬7ە[nؑ63ЫuhIJ(;VD"daaNIH+s?,*V>2{޷"ܲ+# ` cVݙI#I{W"c"t&N\V JdIæH#Vã3{V 볛 .NfOf׼]2[l1չbruST(#zw5qOZ@* *y֍gWhQ'>q֑ 22#ӽ[o9ɡ>quT/S|_mэ~đ gſN [vq6J?H<-c%/? {|1$rNmBU]9߃4y)`2~a:uقBeeCO_Y}Rmn^C+3]VV: dA,>xTn(x9icA\j"kSbXҟ+8,HjUE$?,Glaf ey3gcjӱi莓LUO(F͐JشS++6|lכͧ|ۈڬ qW[m^$ec 2i9 ._+h^4qrHI+#onkb{ zC[wHy?z%co\Jۜ14}P鬿w{~}pŭV;ҋ7DgvC=.Ю%HUn.'9}k 3^6R@ƻLIUBӵz55WFY;[kRd׉=gL=KgR3ЙT.K3`mN{c#-7Q7ʴ;1JsvgGgy9XWJ34WO@+QhV. $MBMб8nWd)8> iiG{[өȒ_#Ҿ79_`E4n䟯8;Oi$4Z~u/cXI/&bX;`rdsȬE> SPus^qqsOGo$x~9=~zi)L.FOL{U#"Ԙ.H#O@- WP|>Qk󬐡 3^[U@T/b;Ӌ&W2gFbEv"(;x(5#6 Z&v\[t=+:$<0xa[0qƼ֬,HeCm bl"[1ƻI{L?`D7e1sOhCntH.}G8b޵Oq86kv Y}k MEds5L:gkKo7c'j }q[[ X! 9oFdےŁ?tj+qoRzi/-\탚d?;kheCԎU0e^5uh[R2$wsҴLGz+ śV(hzϳ 5P=~w(.>zguV:A;r2!X {ްWf=BEycI89fDOi9b ː|m󮤺 j<@ި.'t8V𤰸_HyaHk$㓌Kn\ֹru_0CҒdQ#ʒ$g\ZѹlqV8lw+=#pq׵ÈxeèE{m }|#x;')̌3ɦHr0p1߽K4\aU10bTpոYue2);\RBd8qW<wype[$`Q: <Ą,UY7lqӿ΄9>Wd}We߭gW_+9S+]W-|E뮂sSk_p~$>(7@Z~?5aEtNOHĉk(Rd ߹+Ѿ-ey`v]Zd2 ӿZ JfE=kt[[+FXU\$;vgSWFuAfc+$xNIs~B~^\fo+cKrsu힮&cB#8''ZmA 3[9dsַ77´nG5GTjGL1s#YHyotp|(>Zл9Ѥp,2 iv. 2uU5*Ex-+8#uu}Q:ojMz57 əDqJ댵ӧ@| ,6QH?Z)J6]Ě`s$˾:$iF C/=`ҵk`cleYgұ%|S m&I&͛xfk{iRc!G4iʒ/Lh|\`vP:f)&՚C+͐SDr'pPSpqmL`G5_y@QZ7Qԧ]BG ɌZ->}{^c?H>,gB&s0 gp[KmL`6L~fYO!} 1^d8J:S]Io"2r0G^qxiAHX=>z4sJǟʎbWa%Fx=Uxf'/y6">FTV=[|\Zd\Ce|qQ\e**r;yUfȌ KOhh1Y)yР@ִmeIc=EqxbUmdي)g@e0إPW4Ǝ*HB`wshn["d : jִ[mE%a?mbưSgQz#6LiDU"HoZaybAwn7ұƟ(!SޯAOS֪țuCuEbE"C +7qϭWZ̍A Д;~eǡ՛IAʷE)>L3$dAJ+ؗ9;trVTsorI_ZĽơnx T*.0G$}c+?79'iv6%`x~Ny^TzbOBhMu.Tm=:WU)'9+ ƠvP\U 7MZPm-I g~wvwg2o$J%͜dx N~`>jݠW^ɠ%'3C8\֋-TF<)ƣ/;Ze1+%]׭!scwڏ­;_Wm>?s\vR2+7R O~I.5[vv.sqkC0pNsZxWF.-J?U׊@cN׋2{6Qrw汮u8S>j)u\shy BU..d r˱Za_ZP_Jb' ĂAdxH?L{>pa;󪶬qqKt 2oRzVoUbz #<|}0{Tk+|n5 㕙A=[WZ!m䑎dzx/'#9k@8!G,= cև{2zҢm81W0AZM,۱%AE{Σ)pM!^:Հ] OF+hl SZy &sϩ9We*T*BکGI$z֍)nƟ)6+#ȇԱj; Ң;m7,>i_SZ<>dP'}ȮNI:Ua^Bx ^A Ok.P6ͻ@?VDc1S=pQnf8!.I{s^ak}HEW?]V˦^Y-؞蠑P9S=qW4Zkּ3is[tm-֡uYBU Ҿ!6WjzW~ }hzw0мEdh椴>WL(Et0ώ߅T .y׾jCHèYJϪ љ@ܑj̏Ƈfp3_hoLBv8 tkD?`^Xd❫;]gƖlec$N9ֺ~vc[u}ISk6 }Ĭg<9L ʱ;NI&*2tՑj>/dhBg?{+D\䚧tc&}D,LPO#!Iw ZUi{>Spz#99Yȣ~YeTnNx4j7yg,V}̠[$ I?J^GegsaȖ]'>Hc(b{u D 88%+=i2VLYۡiǕ0#BkNa<`:}hj |I6 v]Z.a_swPyGZmu mD(xCǾ~סr٥.±:ץa-uCgxc,U#޸ j5)YlH" O5BQ$rI?uӺfyh\p뱴CnVIcUozf,E6Fl#՟?MImH97s皕t`̠qkv;tTPO8La~_JB%Vy5/ >TK!Ep9(G՘t!,,H\T[amK1[:rʇzG]>Cb9 Wl4XB8|4Ԯ&d-Q:sL u51Z,ʘ,3Kbu*唨qUuk49%(Xpr2:{zM3Hŷs+>7<c;RDZ ۭWg)Qbh܅ ˹OZw[4x%k>q%Ǘ&V<Z7n+JL:F}/XI'ݨt#0?Z\w5b(ոgWq=IOcccK{A,֛4pE\[BNKas:sA8nR"*b* 0T+]}+Fc-3k#Vw Wcd~GVCta޾s2ZW޿) jtiٵ+U}E(ojJoݺ= :[;(#e Ҭ޴Sin9sg;9G?HY%:V? ~4>U[ѦvӬf~a$<3׸+uȢ"DL7^:z,Oi7r w]&UFKx*9 y>=k޺ىϗ~/\eG Ѷ(ɯ/c+ҽ_o\,@B "8n1=iG<5m4pϢZ ܜױrPQkR%c_%[]>+)"Cw=I5zdGO2/Pa-*x#ws[rVm4I)FlgӎoGͤzOsZ[wzJJVgLioLU* cը=u0,&HOkH6D \-BeNr>kܺ5,zR&R!ui`9ʽ}, RF/ݎH>w6!6篵K1ݞ3Z&l3 Ðea89=[gcpH_Io>_`?q1Ҋ8t 7O_k.4I4Z |Y9j4o5yf슙"1R4<7 ,sHe9:~1egm[C+^&WU"\ݳR>=|ɬOwz +G/#)9k6`IWq1U`` BHRjwo 1n9檭@$syt:[z3oC*D ^C|vYKJnc1)+cIz7UiV앞 5]5U {+9yqU+]MӺ2&5̓3c'MVymuku\Xǖ{\ם'z`) @&"+Zˡglz/ukaoCF@akZuک7PJۓwOէw kp8Tj<Ҵ'ߢAWgVؙS$ E2fV$6b $c5}ua*.NrX =k|q3XNP`rGκa0xvN+0l}h}BN(M;W E+mq)y3㊫3@q `D$y\mnr\jPM-y»olOFRF{Ջk*G9ӧ[*V㸮kL$rv6x V}6Ky.&hnma~<M6}* >Pհ@9kn/.2Bpxa_JƝ_p¢YKXd}k>VkQt9<)8ʃS]vљtz};-z]GVipGSԮdȍ`zAT-M3+k)PgrĻ#5AZQk_\AgȾB;ʓ='l&RV1cRiOJ:MIi _+i.@+m#@wǡZX'&ʞWЙq4!NT2D~`m![Hd6bۻ́ aVj9W:t^MJ4#t \ |-i/DY0"Z~&7_-"?/J>g:9e4rغEUUf,7u<a{j6Æ^1}h][}۪ڹK|5xaw~9Ȭ[2Ls&IȮ!BH$=AjĮ n`϶kEZQe$iT:N3Vwӌ~J)FѱFI=95on3M@͗@QޯZn8^crKNE xAVNJkg73Bz8T)YX:(Dn:j8=%'խ経Zazg tnchcw3  |gxbO'C[&>nҭzW?!?G8džu>JS ۾=r)>8Y O࿏ؕ[JqRҙCX7yPzqSzjLK*km~D#^ktH$?|<3ZlQ]^LOyk-Hprz JNזd0bzDs/,,8up~ךIͻ yPI#)^ FN]WγxՊHoQbz^oM%N8UpOg?JKKhZFKr<~MyOikR uE?i*$ Fܚu=~E^劶 Gz;xOCr/ ׀RjNޯj x?Ky6 0/AIC:kٌ2rK|;/_ח) Aƒ[G}7YA!`&u{\iY'<ן|aV,bmL }Oa^M'mR+Ongz"m_ԏ,Yىg',ֱ1>?6ա XLPXFe;.2O|q/=.[Wi0SoI?(:OIb #Jr u1zմon,fXS <3[=Υ@V$t=+żHJ!yYN<մz~o!EK|śsRES/ h>(B4sUW׆<R4RF$p ;6sj`J۱p?gnk^ʉs.0c~Mv̡߈`w;k:|Ԣ]_N$g5GX𭶺"]XVa;kKExKme$j~UwqƼXI&8;qG^Lkk}OUihy7 =QGE<, m 2ɏb+襶Kw WOӧOu4mRb]p1̲_~ JG?e f$O$N+V(T!O sΜ`:T0Z o'`l3 )ً61֧$s^0Y O!synM492}ޢKZɗ{Ix>~RƜB!AdԯҢRx$!I\ ª+cltt1k}EhsY7-e!TfczSa;J"1{ qE:8'UQYs9;e~'Pq{z z䘑I'c'&Y3ŵ.:~uKLK 710FZ\1!IiY.!gY =ʹ̋A<ŵ:RzØnrT%xPق.=Oi-^hR ӊtmEu4ᅻ IC1&Opjۢc0?qR-Z$̀\zmƳjcg1㨮J44a[l(;bPc.]0&u$vws6LNOj|c@>pִ&E[{vg'hrIP?#hMCm+weU~Ծf'weZ{&r (@Ö8JK9c $[< v(#G ;Oe5*OzSѡ 3/ynYWl+ 8\l0ھeX }QCZަBG'ͦMƙ!O}%ﵖ坉':οK}E%mDc\+:Jd#lvP=ZzeG-\ƨ)T~= }JyJƨN b^M&{V&xt[v3L=\Nj-GEbduQ1ej 7Tuݢ #+XS&M&lh w;:HT1q=;=i^dyZ2 *zk6w@>/3nոM==ޣY&%DJ۲?a(ZݳNW_`EswCSV5ĄK}K3@Zkjff%)T·vc'5tbYƷ3(cvx hRxT\n1UmGrAmhged \5Qhų:]u{]HS7m2fsv=+W.^+/ܚFUơL'h鞕7\ȪpÒp_Aș~ jamRTzg=9O(H!uK'6Gj]dm$gW 1S*QkT53$ko4*QHy׎=FZLXp{Wz ۔+խqff|Xvm# ZjM#2RۋN͎yrH"V};}3@y$Rgxy6:2񟔑W{aDD>rWU;VC/i[w>mE#0 ue+a\_`ڝ/W&IV_4:a0TGvm9PD;nlBX`٫V#+6Έ"0\U-TQˎr*햝y}@z=}qPofIi" Ls] ĪRc9JI_*Iݼ y9Ja( XifXmGSvI߂?q.y:G:\^gֵW["W6)0j\;es֩z]vkl.- I2gB{z޻cok`ٙX 0pG/Vs:_Y^ Iw<(ۑ߰kRR+xI,42i&4c?$FP.5 NH")a5QJ\ ,?Eu9F\'!QǥL'qL8##zyF@!pGҡt*w8*Dd8En!R#Ҳ0tի9 W XI]:3&Θ_Vo66^wZ-7OU]fQo &zZ_m~wV|6fA#uMz,?|+I$d()Hq?ZՓ|1I%Gc~+宜# f p s%›=}bsw>SIGqnVGr//)>@1X&أCrK/^h6Ğh$*sN:*v0Mi^T)pw0r٩mKpdD0)U8u4wSu"O̧jM͂qgN]AⅭK"C#T -"Kx>b2:}+(.Y2ۜU%!-6r;\XEVەD!gz~xVJ t]-u+Sm$Ztlٕ .''O宫W0[ELS1#{ ߃ATs%i68tR;bD *y8u{V)cGN@ϮjM"dOܨݸ㼟!A 3XNGN R.hY&*>pG+jm> fO25`:np0 'Þjy)-+w,**7x"ri% Y|v8t zHלץsSy k<)dE0a/Qkcf0 o gh=x/N,6ccRo'yV՞}Jz}-خc^<YbX䅥H#B['sҼSšyu#iq Q#Sn 7B?!]9%E~1Z bKY,VFifc(+OZmeu~cMͱex_4 8 ~IxZ^@X3 Ϊ=.3[Hk$>*Y<L2ZwB7NsH53jQnJj-= h4oJyZ{[B$x 9dG6j)*f5RC ;3\/#1T%FB`s됷R<[Lτ5}*͔Ig#I+rҹ5kB5'7ȏcF LI4gK{Eikuz~U\ZuAv'?qPn#rSngZC^S9AGn+lckLi;cU =?kjDbIiJ,2@@ 0yh 2:kЏ2@v!GPiѽC6 ~Gd~)-(K(-֪rP(O52@-7{He!=(SC+KJl'wAR+XMK7 FosvcFZDݞ܏ֹ5yyTDNU۶oCKo~̊ۥF6 =I帚; Xo%̸00v m{'NX67 IHHnx[֬ 4n&AL1?(boNT= Ay5J6s]޵W!~1/8Yܻr=;W?¹<=ktju9>o =+9SVͱn~)FӣF2ʅ@bO^#+ h^5ӏUeI1MN952b,O0<;-#ߖ5<uo}=]yrmW1Ӷ=MsRV4uI&,Tr9!I8ݵF:ycL1Fq;P`~ҬXI!8sPf <)d_cwLڣ^[_ Jh|IF _Ҋӱ`Ո<,ҒTypt,j0r {֫^YvUTQڐ8QfƢ2LBOaE 65T/}k:uwPjvUzΌKp aUa'b98Kgj *hH%pHz]ۭ d/IMv7kinM3Ƴ2+kăǷ=֫H!fU}sIFSfvFЦ7s^\2do+,6;vZJҤtʓǫV uKK%8HM\m*!`|'!O$<5@:aqX׉d-,HN㱬IwwY8b}(t/GDBIr2H8=kѵHJ#~JY#b`ibZ٤R9#Gx"@;*W闷 w,Mn?Ų!1Fɸ1Nw{/& ;@BNxry,fu`|'˧c_e.!#EGaEs&Y}Gk_uj7xKV'-|!lO7+/\9|T TSV=ZD(k>LBǩLJ|A REg9020TӬ<^RBrw~Ē]]_͒T mN-:X锜!TYb@rp[^ "od3-LVyd1g$+uy$̹*x#籪>!.nǖ5֠3{t|XE[Ib}֯ZA[G'FQB䌞i[CT48Ev'Vre4ӎM{—&d #Ms"MO Om1D5iHɮ-?fėxeP0'_ּ3KDwSQ:?~} FPh9nyz̈"_6ygHm P1潇/4kxZ:12|x3L}65(/^8n1kbfs֞OKѯJ!ڸ WPIGv?/"]q\-찵ֱ(7gjn'׃\x=S44^gr=sgR;#US,avD<IZ(pˀ~``'+~iKj}.8 SkZ֖nf(I+E$dұ=/J5-#F^5*#.H 99:Һx-iD3M2C<~>Eϊ~"K*T GNڛYn4noud2G!J$7ZOrMmd:W^=+[.ʸq]M'rև~\H`$sy#־vwn=3N\O }y9,I< u-Pt{l"q{gڸ14龺(6P?4*ɑÐ ~_(#bj )#тh31ơ˪:-dyψK# djH0܀㪚xvEd9ø_YK{ӍF7 sZudP7! X}=|F;bs2֦k$KIrMEHٽdVM8yɷ2.s7/ҥ.mB))T}յaQEmMh i2jj7>3+CNpTw'߀(kXkχ (BQzMլ^!*p&fi% < z`xDA}"(gr͏LW(Є %`Ql`*E(Xg.n4;b^X,Asjxzd"e_EW}+8g'= "d%j`UٶcqK{64_"tܒ=JEt٢k-S: MvL{2H+cV'fTx$9QE[JdE{$*j[=&6CG#9\9,'>k.ԭfVwq8{qa8=袹0U.[ܵ<{6K[*-0$lQB[޸s:]ֵBt p;h9TU<:i~! wz}~@?'[+^͙%}g%NheՔ+b$72F$jx nQE97Id+_V!O֊+{4E2l< f<\`+ޤZVeKXr&'{v4Q[=f'vyERfotocx/images/file-save.png0000664000175000017500000012211215247006660014655 0ustar micomicoPNG  IHDRm<tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 216 406 1 0 ,y:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:406 height:216|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.5: Rescale: width:365 height:194|$ IDATx}u\U[w{:mHw؅v+*b+b݉b4ݱ8\q1ϑc+9c7@yy9_x6o_ 0lnhh@pppnݺ][[++Rqo H:t? o 6קEu-؀P(DYYJKKQRRD"u$Yֶ]?K]߾4|<6@k`UXX|";;YYYܑ.((@qqoA򐓓õgs.vOkz?xLEEE3|,0r3b-w \9a@:x̃gobuFx߶<3Y3_ 3j<ӵQA1oH3wCX%y KZ}05k1?[+\ >潾/hn@ce0}ywyag3\A)ݩ ;}O#4"yl(BBL|IyA%H'yOpK?A!aHNDPᅥϝ0a%$1!9>^'~~~Tܜ,D!xVlDחEpddCJB$F!?G> l慽8²"E7G">) e*J VPW{4& nn{pJ= >+Qa-"5)ς9Y ":{mK-)-1cp#CCC.?[|: n6<1˗sCBBzF̓vsTWA7N=M XY(s-`&mtwΟйsgHIb0vLh~ NX1$CJwm` %91/\ -8y0T塢 /+cĹشa%F 4Tk:ۏ^BN1K!9 6A'KNM fb+"28ٸsF dz"eg1^P )-NOPsZ-.'YpWV=@O3yۀvY'gcSWtϞPPфŠ8zeҽ0rRfLnޖXrsqsl)_f~75yLx#<2<42"nbP1SemlhۇD@Yڃfd3qp ikbR܉ʢpP(t޺<DBƖZ@[ \ѣEUU9n~Ftr[H]WS\1X VSVwSB k{ _?H$҇c!en| h}.fZ`71w\N>yʌ} C !N{0u*(kb 'G%K`bpqVkl ($0)k6 gqRhȑ;w@}FZ0PFb-[\1R.xQ%\yh)KV&B^e,g58 Ni;CH/PYJKj9/ZU+bHs[bі3H ALK;$GCۛ-' <l3=pcRG,i ]ukZ`(lnmuXO[]szj١@^$F( W-A?= t)-!FZPPtgWd~]!ofK{v\\mۆcr[[[.T"iujBD)q~tԌ̣gE ha% 3 ( j*AU.G 4DW´uTZ;=y021ǀ8/^Y zҏm9# ?/%1Ǡ'/ 5p|޷P83#h=I;'@KY }Abdd=#}# 8055S#_d myOj:SRRBSE t}OdjP+Ly0ц333sqvKRaﲕq۷bEI 1mf6uVvss[m8881ap:c.%4A&_txYƆ6}yPQ˩F3X?'ag5U9J>z l(Tn<.=Fy]=jX9v t ax&eYXE@’א\)8{sykhc 6X>#UUsd' U9c'o-I*iʈ(/ipAuE>ۊ;nJ`F~KQ/1c}УNvH9 ®cp}t-GzyeeT"7>ND}`= ƣo:htW@e%E~,@`|z~)F(p/0{Ex^> e?o8{P6CM^KV˾,K )Cҥ Gǿ~e}s\|v[k P=^ضXxce4g?$cE.?bɶ^6ŊRDz<NDŽqc0rHXcSR#yl6֔5cl0q<\KY&MbYi]+=i.zȈ敋0e #Fa$=} ٭4-B},b W$*M &;",7>(Wٚo:}w,xA^OygE"!}^\;:u e1'ߧЋ84;b{l/'5x2b=1~/+(>deZhg$ۛ^ 6i ^-Io 6i{2m: wZ|ox@= z%mmy/: ݁%{on;mc |0ha뒱xQ9ECC=%[ꉰԠ[g}Ǒ_S+3)]={ |h# V:AJz@Ͽ:}"5hQǢPPۀQW-ĭ3V?p=WWM!S :uO? EM=S N3 ]sNW3"?7!{C{E4S),R#RPk9C[W.{`Zd4?'X_SwBOK ݻwG.I.2yh$f< rԹ3Ww.ax K%]G@_;gz]vCߑF%3:\s_0&F:DC7t C&AtV p}-z?Y%uL<z2$IQ㏼-|-6݀ڪr%<9Ca5w3hbea< Ah|р'7g&pCI Col&رn>d5f1FEԱCXSH~ar8vo^#$" aXPæ.D)} %ؼ|640~ M4U\]u kq1a8k0kuH5(#`~cg7XWbݮi^uGol'o\`!~ 6h Py%e2Ҙz+D ]a:b"N^3G0n`od5Joȿ-ox:l@)eY 6;`˯^J Rm`m6+3N!8N'nCPSz 4:44#E 4R5;-(˗q=TOr\5w_{rx եxg['ovF$D{K{yAP3rg{BVVn7_z+zkGː+aȯhh~{^'AJA {.>*Z8da$S sBRU~{QK/M lB0iv!Z(I9.`n,º`2q9"ҋ@{vA?P }lp QU0WՂH q ݻqeEac(*~qbM#VXWԩj.2Zp\GilX4~a7Ɲ;wAx*pNXi?+ygRD(Ph4̵-}L[{qeD'uNA-Q^` | j|Ɂ5?.] !=:/뫗/Ma8 eTwU$F 0 JEn/%l-TyЖ ۶ϕڿBA  y ,qrŋ@="#>fN1c`_gy([ -ԱaWOl*ނZAZJ>c)7N55^0D7!C o${ՐݛfsOe>K-bGfWS`?6cq4ccB!( GMy:"3'5Y02,%϶99vh?\֬Y0i Ž۾ +c͕G56jWh-8~pbzu{H4j_OMQ <Ռ%(eQ SbB_5yn!hIC@Uc)B,$P촢\H\_PiHINJfv.8b6쯧ɴ cS,v;BF?n5_YɐcvEٜj+0"#)7DGne yydef] ?|;-U`T}oNFVv8Zc4y,ݍ /p(ia䗕!!f2?ePGdžB\62V,[C##)lC2`69< u7R(ޖ> FJ=`6b22uv]6R h-͝O=c,SY1 \gt{L8b`CEjcѦ 5U0[7a(JuŽިoJ$`4 PYu%c%3FmvQy6d E= $> k1\s0yVd DU q}#4T MrrrW \~jJfmb*CgO(**@AAV (6' 2|:uMMhikz,3BEs_X|vgڭ'b0K0մa YoǞɭР,5hkkaVO=T0@AFV \_DWo=nv(dC2b ]1f)[ Oʶ|=&gzI|&'JA._ MU%((rhlfq'_̓%o_ |0h7P%h(..Byu\ZTH-+Ǖ\3%=o)\InEG@:OITPX| Mbݺjx]Wy۹,W[$(m+?/*)qh7x*)-EIq!Sz ߌ&PD-4T|_ǜnz:zlJ䞥K5㭺׊Lv㣌䍉ΚJ'WQa.B "6=E)lz˵TT$`)}Ux!.ۉ&Zгotn<f |9Agx4IxGƞִ3몳}(5ML)Sf>FG_θyxm<@Dzylx@6vRu,/a1o)Z>˔iGLqtɀuq_˗62s)z[Nq1/,vSP:¶@KmMKZiOF Ѵznn6\"mᕝJćPYԩ EՒ5=Cؾ^g1i9E,ܰ%e=Wܡ 6&>PRVt0?u֖gw-),+#@uM&D_KK@6]Y $k8/#!̄2TԡB 57zvѭt PIl&0d u86UԀƍz:;̅TOl+q^ڽGPNv, MD FQFO  }8ۊ;039ԑI1Vc$$5,tW(\Dȳ ڷ \!,>]b)OakA E">3Ia0X:k)m9JFX^Ε.ӖV'm5ʖ&UPŕjq74ouN9crOrr 22w8L$]r9a1k^jA4 pvҕ,68f]E@S+z0= ]{8{ 4ԉza*zb6w% .&yВՄ >ޏ{FlCH pzx~W1T&~^wa,kHovGu$,ud oǮd!h+Ĉi QP(F=Z@wA64?wU$lq YyU\ *͡sWՆW1* F~v Ud1ij+{e/Gw VSV; K@&>䇡4yzӐ<]U$baѢ3 ؿn:d襜f >׭p<}Oo%:K+aꊝGnnb1eD!Ebr"n\wcI{t =b_$`D ֺ#8F뺥-)%g#zY hHɧ0o\t@]Ю-Ǟ%P';xy%4o8c,x?+py\>Oޝ\OXX Ӣ1i.Zbs.XqU'=UQZ+6Z\v.>K*ׯ xg%udxc yX-܋LWS~47>bDR^;s.ŵϯ5𺼗:kMEiAĉyP;%Neho58|%+ r܄QXv&سdLgi'^R2}!":獵X5w1ӆCVwbŴգ"ջAl+ԈG0@C.Cl^ kѩSW:G;@A !Hxeab?I~L/huQI_I8tuM Cѳo?F(sizb*,Tv)«e~v :wW9knʕNcS^X{ƛFŀl>1qt,v\è_h5e% 8+\!< 7oـh?L鯁6!9*RVroF]8sh)V4k@Y5gX>c l]!)ao:+q1F!yi&ciq贈ٸ]>ڊekR #ĤI3{ltSדtʆTJi1αofPֆ /B ۙXizdzd._gu tW5=f4Tζ0s}ÌU=?y`-Zd̟kn5@"h? H*6G60)&'xCb o?sIN0eXd G,q95;q'<'a xrnLEhvN5وIHo[h%)**aCeФ? uQu~ ZC|kZy6 ;nATVKGp5DM!ȠAc] is|zꉼ22:Ġk=UJ;QȦ' $= %Y8#JocIͼr~xr-EB|p!شg2D݋jgh7OՐL, 4!Ti*Zwnܯ,RX&BFQ`M̅0TakL>v`H*U\;z RXӒǐHXs c$ڭۢ:^5%ype,޸⟕}4rj$j_ c8O MFbZگg6ͼ2Ў{hWrq̝{܏ 8$w/\7 %@~QGIIcz$ b & }QA 7 pm9MCSY*&!ɨ(K%5 !nkp۾s;"exlXRE7c!(齫"*cntذ@Xc\8TU}mM  ɔq#sh> GӉn"rP q<qbZ#bc~G _~LE%i(a3-mW@ %s46pzVBl=M< h ,[Ta%W;iBNb8r.(H[cC]N\ ׺R7MƂCB4i|#ǂEΈ#xbS8*:qaW0il&K$R87MD'"a&4D{*MDBw67y &=L8 ګaPĀљ4ioOm;aEXfc@qf#x0已q02A(Q!,=ѣGOYzQ`PkܠjIGctKa6>X N?ӄ)+@܎#h 0HI3&C{ rO,}JHulvMέ0f\#+'S?sO}YQXd!xECZ4R2Jذ*4;(eaRb':w Τl0]LTzCQPܞ/!;#v i>ڑsme!{l$U@.],)Feiʼ g`EPiJcY-f́r49"!,+c֣4N5RzZ(}P"R5(6L4I&\1;?p>, GwЃRK\e7. IDAT$/BRqҀ;g?uQ58rn(YVASF&yߌ Lm_unsaJWM6[jZd_KUYdn! \ X0R=h<ޒa2F`e]O(aD.?K:Ɩ8yefӰЕt5u Զ4i쫸@,7<{)a32(זƔ5Jw10ՠtή\"Ӈ)a%914¤*F{KgU^ % {PʟB7,9|%*: ,pYy7h÷]LO_TW fZ_[)˝&;k{OQ"`%.Lݥ =W!ȦۜJV@On9 e䝋ۑ|h l^42:c<{pⵖ'ENQCmf!8)<,hA9#lYAV/ J[d$E<Ʀ'QLXqf*1ų_$s F@ڝbԽ1i r:+9sGƨ$ @}NQꞌ4v h>}ǿ |;6 lԣA~n6'~ u"BGLMՃeh}HPBCDH}577d^VlӃ|?Ńp%|Ax޼wos)R [V!' Hm&@ܥ{:Jb),j]b"A4ɮ,qє}7`ee@}Dx[}dI5<}k a6Naˋ M#/-d~^Ƽ 6lmN: ݁zjm/%_#G_D؍>l'Mؽg;3s(Mao~邳I_%hS&f,<=oC}^Ha3~^%SGiO0B#8!\tCXb Kʿw}&Okߣ"a.JFVJΟ<ҎwS^Uȃ/<f@4\RW"yx?Fd<ŴuvA_9XwowBRxT/7rcImHC=²K]rǂyqU,_Y3gb8s@S j~ݛW.ÜY0{ް! ac^C8-_aa.݁9sඏ*hYW#grنuUvr/?v;g.fQ[f |r>;t.%5MM 3q8.xk7_BYEKm.)894\ bjDxy+-999,r\Oø%FDJvs[ԩ=:Nxʝ(ŭǰ5k&Þ!zp8=7yv3v4Rs *͉+1g,$an?p-A~Fnr΃q糺gaɊu)j=S^gcM4 u07-{dt *:<ŠKp?i5-yIغl&BFc%n3k6 91>=D6BfuK瑝 9s+moX jiu;#s2;z{\l{V$,Ȫ$o^8\L>VwDK6RbSlZ鈫Onc?5o|8y%x{zfϙv"13<s +9콚 |ǜgصes0u^ KeYuȯb˭XKm|1g>f'jDS!(ęj+xA˺&c>7w*ɎaGart\ 7M[hOL=jk Ur~{m{q1̜0Zp^?~ V *֞;wgn#%JTPP̢s0'PD̢bVQEE@J9pV! v ]aժVk.=jłkj#") A-+ ywDZ,17?;uFg7d\[m) %ԙVW}pq $%$1gYxݻW.c%Pfo1hV&Pslܶ'C/Uml9Ӻ&W-Քi ˆI3a8h,ݹ´hڲ^C8j@SxG"gBRAܛOmU& Rf?4 CK7! N 8Cam?@_;# uشh2|۷SaxncB}af%eLX=NP (mKyA2[FoUu6`X#ȫ{WTTd廾65xrz$}U<ɯDCm.L/u6' g1d"lN^ҵ TOru^>hx?b U1}`f&{ ^=:צּIV+,fމR쳢91VGnX`2~&Ĉ}z1u&L%M],ڸ a ̙2 0{ (Nb6 pJX6:/܈¢v-+挃l/%ar}To9noAhMCCL_v8u XT=S lgݥ =wn#6) VNz? ma c}"1 T\551g\~fCYUBQy!Xi1rr`6s6lXtc4<uF.DbtF&s甩g!"'/3D-;q(jJ|BrE9B_qCcY;N :f됒Jۨjg2* J ~VtUg79K|ހ&nBHB* +5p45{v giw ڵp]#ڳhy9`XDi ;'#i(--iq0@] 3wB]}5B|c,vDF +PE˧1@3F`\2 48\n89ŠjVT9HЉ18c) GLӰ} =^7%`gdfV7 LZ}L4NkARQ %ԟ|xu0BSPX[? zn@_]\AP[c&BÔ~'!ޔ'$>4NÐf+U\/g0.ft>Wp*6O3ZPW+'ARV"Lz`pC?vrPo!ax:dHJrqbu!Ψja)2ҒHQn魎uvW8k8+F(xN@!}:!!!WFө8̬,d`V4rڗ&c0> 㐛d<9 }5Ҹי]ki\Zy))p)Yt`x|r/Xl=:D9rb@q&j;eQ*TjR˻'`G O]G&J]I{>4_〰<#ru2zDqvi{>RIMӇ`/~Zs.h8mFT$5dIADPIa#4m"oà(PDG*+ ӟbD#L숴"\9tfL\ԅF͐'-s:WE%HĖ!B'O T}%DhV2ܸ,K#x2k~6&K/YڵŸpb/䤥1e< G۷oAo}X6k4TѫW/)ӿ}Eȵ( c5|&J@}}XN'+F _}شjbXUvZ@G5(*)BJ':k&-16daMl\@|N)Q5xn~lF<}0}T7@[]Z 5x[_gw`ڞsR}CF/"7!3"3dƴaKlӶ@~ mv :`>,ZKeY4/ 1` Gax98xPZ='浅X4c8TLALZ*df,,#0~00&`7 x>獁KlDZ͇عSܖh?'NYIUK-ߚi'dwt,(l~!p&0g~$F6(@*b/rb@c( K#hW]}.l@voJ*ꧪ}g<~Am~s52cK)Iya:zBgw(kGPmAӛ&>G5D(TG}ĞspjʽawՓNQ4f2Uo"\;_edDI"tn8cLo%6%YiHJC=R/0o*+A]VHD4 BrfaH%AL%I+FUY8{l%Wg^PPl 9vT$ж/`pBuDMn05~狨lqykMrziTfc}vli @?ME|թ 44ZSFF!& `cj + όJ2v졡 cͻKLByi$td1( jKs%oxw֞l0R$5_ݫf{ie ;vա>˨$K猀XӪG|(wMEGG4aA!~k nZn$LTɝPWs`4NA,Vķp`h uDia94S<@;@)uUYȧh) PZ_ GZމ9Һ ,2ցy]{1BF=JX>g/ŝVo YYR-usne/af鏛@ݟuB%vbZ¡ l@nv@Yk .z MsP^M?j%00"j)# Z]4^Oޏwqa#.WFk5333iDiq9k@6֫ eL&*I 0_7v.(+ 'uOyP_&>E5թ8=;a!a: оc,mI<tY>]ŵ7ϳW'9cnBwUXFTZ`F$< '(U;ӳsQ9?0lSۿ@9&,ӎS9Û~4rD2YXƐpLټ䨑T¡{DU|Ny/OkO4>WNMrwA[4{e?l/߄O#.> yϞ=G6학 ׯ]PBm]o?i{O5Ue 'IBJ c_/cPR.STo tlYY#LǑ ah6O>#FF'<ɩu*$?E^;[Uz#JYoaQfIgt/> ȥ WO#Yȓ_FU[eM| ST1m%}yt)T1r>foJ!b+Р|$*l@Ⱦ E,Y"EPEX΅6nGDL2hl"21]n]마Aa;-nSޅ8ab}. +/h.`@3!-.J QZi1 qB \lia!06( .1i)*|\>hגM2X}/)6)!WN"z?u9 =yJ2{Z'֢{N3P4S9{F/rp r01[ȧg:wWHF5:"ZQ ["4<|-Hp>CHXE5uPo6r8m팛IMa?XhKZf}!rȉ4w"40fq1h8N}@Bfy ]V|a mljPN្TN{u E IDAT]rsdu9p3DL˫3es#M``L9 3Oa&0/s-3ZBu;!7 1w}wnW_w]3չ_t8:}u`2b4-sZd\C-"0c=ضa FA-4%ǯ8l O;9Ar^RdXYh-W[ 32 c̚"cx?Ϯ, P%GzX؅y̡{KŨ!&MbC 5G/^7ZˢGSeK1.¿p'>MD%rCpP̡Hysfa?EQ5+L W Z߿X6?ЊðipAP W ,K dk_0qp+H SЛ̧Pؚ&a@qvGLa&7&Ӧq/2 8,V.5T`4f"v8Mݵw;s)G T$ޥi-y 1 q&*DߤHa裫hy0#gw ׫5kBEEf1cja䴅 &{gAU+{/e^该 A#t l?x)3D2XW-sQ26%b3m&Z }AgW(Ɏ hidx,S'Ѧc?pe9ݶ !disM@T )vGmMhܢп4rӟN:|vǎ:RR[*0=r_IѻQ8lcgPTRT,z_7>W uqop0JhrxMSv(F7\T\q!P,vLQ;ܸտ('n_ ;=lmp虖u_rDI'aMuvN^sTKxx8APणN^MF,<p7^pϚ,xܼVM@ Ʉ!yҽC6} ٶ.6=HovN.#@aVn:Q}P"* #$kSED޴ /deP\i?~,~8Jz"ZTWCaN/#8Uw/rD b:ÃPW4R\?snW4iW6=㾚8+.r㇍˷d!88W8,S>h)*I 0Pb!7ՕDm4?,WC̀I>G! a&B֯9 Mѳy߯<ſ'O=[9P}X jY ⺫(nɄETmQ4<:VV%QM&N}F\]c"1=򩕀ϯ%ʣ9x6=jn,ᥣU!( A28)qZ>2J :gIOm?@*8gO ѽ;܄t-o/5zZg[GmaPJQ _ȭnR(&?ׁ?F:m! :6ڼ_|#[!P^v22> 4]&:>˗o_-:!h3ɣs6}g}{ma8}JŬ "!/4OYO>/yeh`G~!9wNt;/b#s>S=p)Tз?E|7*>h-d:ɺ6-l!hSxe64PwQȾcS%<%O_ گB^pZtɊɚQ#YV t|[1iN쮊&'7[ǿ[:.hDQ_ #|e@2"zo8zE<~//~QOU4x:.hyzj2֢\).|=d&ȸ tcx{U?tO +~"k&?h||<t )tl;:M,-;9סeٱiYTCtP!8` ۸Ў1|$3$:{.lDxVoo,Q#&k] n+r"K[o څ?ҏQX@hi3#RZl,FЙ AJAi(/geu?E@; J8W> ?7D ::NgW&խ==1{GfaA\1NIy*+N;~<̆AQAtZSW`1~f tp0θv_Nmoc]}~Kj!d$MCOG TE%e a3EI7]1@G'/:Xj< }`y2Pv깲2Z!x'[JJJzQں.-:\>hicզ:VvT1i~d勎c']A߾vBn`PR幤i W! Noz}Ա:B:CEQܻzjm0V']qp99l:ʓ 4LK;z1h]CԶ*$:}tJnv6ғS nt A;|朒E~;]VZ2L:(3D p5X_+'ژJ*0=;ȹ#DIFT*+,NVVr@;cA6c"ip#O?G*N=;j+pTJ emn^0XK]_IfFZqiARvQ`V9Ga]EӆA`4!*& qɵ~(,XgzzPMk\.U2ݿø aހJ|z k,FL;vb%&!%mD$xlTM!?t Q\ۀBJtN`/ ƥo ӹT p P×BZ?en;T9d$69KHv$/vtk pptDm=hm4.*a6l`Vǿ?$q ,ut-c1`2j"Rx`4{@VN2#Kf }Hq0զX8~$mW (kOЀDo񏯻T`={DN TzmDTZ˴EWwbΦ6zmn}{Cv$EIQ΅I~: ]{h% l'W/O+D^VED <5"ÑFe#). I)HC#0'B@ O.c*6BaJ#>6;"l^ʊrGX,﨨hYn J(%uHS"#X}T:0?H4")Sh`+rVdp&pjg|bҞ_!sJk5_K ˘6̶ó`QybYef w._Qߕk;+3! QWPWGL GBRI׽Q7 (/2Uuaۏ\9bL=aO0s&YlEhF9*CNA_Mb@7xl #ϋEzcx]Lۈy0Gg0bՔG=RB`1q4o~ƦG=YPC9lŗ:f G=W.!\U BNg(N{٤@G K N\ ~ hs~x˥X8&-5k'K]kӫ=@KS m[0ҒRw!)p>=Ub1{G\1u\)u`tQˣ$+4=۾Ҋp Vqd!T!1;w큧$Єs'(,]$'!t.C{8FKĜ<}o9/ݠ6-D?]l:|Z)dT w0=EuST\+&sg =RqL)+p$za0ե%iZN.ekk*.pGH#'YuhE~`I\zBpg#[.Ń݋NXy7:dTU%y 5C#Ao<#'ǰ}CTW[0ׅ7DmM:^/Q޾ JPTQ]ꢍ}gVqp  24tc)dӖh$s %z t3^e)A-@[4sSñ~x2dGWfS`ۺE0Vw:fH *}`:rLŀ0z"H^aƅP6&B~&px )ڲXL5EoH4\lwLYQ{BTCYK $Llr$QW] l,a$S-ף11 1h[\0cuRt, p MŏIa>ۮt*;Ld`:s!*`;9\l=@^ǎ !e'AQ l6AIVߊ96~eMb2ơPQ6d ^ťzV,*H{) Fa'rR l.PAd)T Z1$ 4\:zcfA [ՠ6RAWM;PC_6v UJ`ܼ~ϟt͇N޸Oeecٌ. GYVς ܏ɠfYh8ma?>M{.φu'оQ-cjk+ai-DOҎ{[m˦%R褨,av8֙E/r@ ڕ^\ xh uGڇ]dE,OHu+A)N5'(T'Ԝ1@U_amW Hu֓#)<> =1x (d1L1Ġ ȨE+oXԄ @vQ1Rh"};,]m"| <(IIqπԤ/N}PL ~P m3ѥ V=3 w,JA)c0w@L冬b!wQ\d(`vMe1l9%u,i/GrGBM_pcuj&FTǔ'QXhה5:KTA;׵ }d0|JDMy4M )A`sy~2E=\zĕ/m=⌳gN㸣;&VVG{깒3$=L`RjV=6E O#x)-ُ2A9.CFB4C7I[BȊy97z|"ivk `ozv튓OPI!䆱P"zdþ8Ctvv׼+SGk¾|wm=}ŬIw 髂7jĿ:]z`ؙ8hea>J[кbکf0fpAMS50'+fZ*W ;! +{1op `6e zRv4ccME9ֺ( CIbKԁwFL'_{Ufj|c6NGW%OYi k:V; m.k&ԇdxF_V9z$.:Bw@VvXsT1q_Qd*g]Q] Œ&kOY$e=zIKE7x~x#7YZ.J) I$(橆́V]5d֓N] +΢m\ dlaMfyQMB#׃LW^nvkHY5h $Q(&&ljpi]M.E"\ A#Q[3C{(C}e0&zmmA8SL^qe;mV\Z!KF0v%2 *z}u԰]2PKoq̖7ddU⎛%:u.!ًd%Y-9(_c<L@@D1a*3%zb5 ʸ zDOU*Xt)Νqff;nhO5:_PO63Y܈:gqkTڰ;hܶ]IJ7J tۺB܈.eUWc\Z2dU`s?MS 7@f\݈rYmAj9C ua:~ oc֘d6&`=<F]#t;]]k kIDAT%!1k7lhEӠ" D2NGO\zlV!J&pOE?oh\:wji] ^vusu~kf+U(Drb1eR-ȹFXn]s,&@g [aCCUD $< PlQ3Kcձv,ZEɬ%xUX1WfZ /n EVtʁ,gohDG #+Ս m]0|>v؁ gB]E F^"+Adr`Q`B\/FoU-OˀC/r02fH۰eh7oB^1P~,h3K[B(X! C@x)ΟM'A訽36?+֥@;,mb}/ O=QD18]#[ 7fHk`8} N8AK`.W)XX@l taQd;8k 5!0HQDRgUP?ڂ'Զ0bYKp:}~T w#* .4AI(o3hwlT nz]HI6AǸ ޹;BKpvT]GbߋLKWI 5"UhL]pQP$zhʭȮEn4=b $d5(-׍B_3<EJ04q7bZVs4#Q(-)qxl;kbH0ZTe8h͍;4ٍ±Kܤ]zF}5ə GxbWqVELSmLyIYt0wA|HTQ13ubS>i4g#>fm'iT{di7@#{`˙e'38e *b h޾uxŃ;s>|RI%.3۸tS=A@ Rt]\.yfAR_؋Z<p^Aoi蘌A{g]w YH þ3h(:'.=MkW{ɅﵷV'σ1j LAbs 3bi 2!Yz"Űj)s>DjLq3}O#?8ۄhSʃK(YkJt55B2(&Z!..ݺr xHeahE ]İdmSQx'n2:aYjpdjlxrbRbKw馶Q09+tlY5RjH,vA;?l ^"ea,ʖرgIYN,̊,M)1|&mBa&1kMC j/΋یSKkZVsu 뭖EpKk bCΫj K?P$uYl DT:} 'UKTMSʀ»j,G5cRYmz*i/˃P[+Kw G:nȎGյxw@D\6"$,L_!7*wwM9uT0 /٬.GƵz8;v6@W[RR.VnF.bMFc=h S v%xc]?I8QZR}Յd $xh,B02KeKAk^;kM@&}Ic/% ;^l)ϱjd(Q$~c7uPțrchY]YGCME!CF,3FElɊz)ޟ|hg=0{&/ZRxTsWQB} & LNda!QHJ3E!Gѵ ֛@F^ QsZl0,W/`f0<.7-Γ<{>z4t$Ӟ opt5 M+ ѣ)i  \?>>kzMW&b RRÍ`.??+c!I᚝P(V3{1äf/ #dUSYkR v9TUW[ĵ+ރ֠MsM)v]DvJa6&*9C|vpYG ڡ r-)p>l>J>iޟd~1i_4T}ʮHtYM4v9to+Ywn\}o"$qvAnёb&`>PBN!jh 委S bXOWU%8wl'4tpcT_v`$R9?%xdΕXs}*)GU^ZmaADPܚM!~d=ۑ}hA9K,[QFZ =EyEbO_<-j7>eSw Ŵ7|V1܂)~>mٺj&fۃ،F>vrbiw.O*(J2:OR>9Y$Loo#ki^> E{##8b Z6TӥI#b;Rc_ȞM8}lMn2,L빋H.WAVyUtv 9Op>B]oƶShdr K}xESdedO{N=œ ;d^8{~p{/ϩ6NV&Ń{Χ(&cu ͙aqH%Ltakxm(K3"JCWi'$ Yr j%DbN|ݓQ$騞}x:.h3A3˥eHBZР@G dV_ 1>b_p 1Ў |P`#xoC74wAñΔE7?/Ku6_?Pc;R:?9@1}uR݊~ҧ$^,A q_b[ed @QNtJb`p|.J;ra7BD}q:!ϵMB^_܃VqC29Y/K>ڿW%r>Nv~qaN)OtHM,rN |}\r1:/X#T~0:y^xt/>[|9:6ڼ_uo }9W|_}.Amuׁ/H@mf:Ӂ :]YMv ˀ^xxDh.ϗxuׁO`sPPWtNktd4ԣ:-)IA%Eă6ڭs2>?!x,_?!TeR[Qynr@yu /'ϟ?A|}8fOJlAhy1hVWeOKp Y['NC@h8V϶|aOnᘽ2?,[:@ۏ,mQDD.U%h鈑02Z:~y{gOCp ojcyt:tHȨe<Dxx8^M޵}QQỲGw%ܭ磛T/xe5Սm~i4Ӂߗ*&Ю"*%dz` U+QXTWU"+.paڇVmjkhN*uZ;m*,  (o ((lNL,vܻw9{r2sNx]{ڟ C[Cv; z m'MIr|u EiM]+tjnG{Cm bNZtx ^9U17&[)Ἃ۱ z,MEKqsQlX4Bb ѱq8f0x?S6Ccf0:;iGB1kkHMMR&<a\;%;$HҐբ* 7]j Im4Q~{K# (,d6CCr5jYR,5 ٬a fCOJzz:H^LǭfQY$Qfc0:qC[lcYEXZbQLHRB]Wdixx=q-&3ɻhK2ez>aЛ,u=сv}+y9~u@B&eŨ^㥯7@g{-^wnB@n p I/& g="%~APZTe mB0z߼/b=ULӀTP{_wUeh5*Α}K^ m6Cu_O7=z\EfR,VX<~/)w|v ^7ecO ָ3 mց~ ~4X 1 2 3 0 8 0 546 782 1 2 2 C     C   "" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?=E?ҐtbQEQ@(P1EbQEBO"uω'4.Q1wGWvfpF&eaIU8W}k[q}xxwH፟_IKCxf͂g%N: I?4ώ2ծ)/iyq,Cm Ekmȡs{Ҽ{Qǵxn^kOF/UfK;AMi"\,AO.P΅;T _J;8[{*yN@pAQ) ]N=q^!~r}c{:v0WW1wI%Į#,. "I)_ xƺMMt5٦hZBՠD ppZBT]:※=CT_xPn>'}#OX%7YV`0%M?h~&ek-{SՇu=GFy$r\y)*$dZb0pF w+gwRռ+-;Re&Դ+]BC$+"[LsUk FK ]zCN{{ARzp{zFTr}E zQ_3x |Yxzƞ%LѬ?xjD.b{b\'VW{'ùtx hI>%A^& c11*@"j}# {oԗ )6D.͵fCB]ͫ|\⨼K]j^y^$fUf l!IP#c_.xUwǯY|EՠCGNJy;6dSkSFb,[osqo@oO k@q;X%H-b$˿+8~I|1\|BKxeuҭZfk<ˉH($㘵?6𥵵4~ Mܡ$UdxD,[DC?R&sxV?3}s-s≼3 S&Lo?*8&!ۏJ( Ƿ|E<|:5-HMiG')Gu*x"PQ\b&_-3 3RW*|{ c\P却GV&W7%$Nxq>C'A<+šď\ܦigo₻z}kȼCiw?cm^% [ [ynYfcny~'?a@RS;Ӧ xƺ_zTV=&*?xr!0y N3!i w]R ^ B&m$ OM~'mxkMƑ^θZ'Oi#M+]csPм{QxJºx:Oҭ.g}WT8+؞cJG8 @E/wƣ{NUW1b7L 9(Kg('dW6 u~&|n5=}0~D#J .$_|}SS n sOBj9Mg _4m(~O뚰mSڦ'eE$Yd ~~՞_xCIm6]k+8i| ;F ?[4npwA@ ?^^èj\':-$$,9 IU|1qKZ<=om.sqoRd BFyx?/#g%T𕗆5VӾnOuhd9#b,pvָZ5ߊOM&K{Fm'R D+ Q"5P.zZ_*+Yf_r?z/YSjOsP+I{mDᲅ䕚i 4dYwwfbǹ Mg隬DCm}xm0\-3/Odht ;6k6)i:FBBdt r+'Zֵ}V7N]gM6'Z;e+s3uCĎ@&+0qIBGv/7HMĭ fUX[;9yWBpT ֢jΛk&t.<ŵ!#ֻIyDjHIY'!P3⟂:WS[mtt-UD9۩Zv +ZuUl=~u 3Vh \# 7;֝M+D`W# io<@~u sdF8|&??jj%E:p|KrC$픜^9] %Gˎw??s*%5ό,1/~SI}Mg|B6ME<`me`VB[;?T/IO,ZuMr|ѯ4l/u^_]Z;I K 8( uIk/K M<H&kf1}bw)n>vrs.6z5ֹsc Oumm #TCďLV`8TxogS}AGⲇR&Tڶ1y/> ׋ϏM H,?.p"/,csI!v/睟Kƨ>_6MuA}0j 70)GV 9??_x!<+諫^R[p%lZYѣb#l*7v/-9@4[7-5?hws_EYiWƨ#El(O5>u]SD^^} 𽿁84>I䶊Ien34$Yܱ5X|$6=ZDףKQ3J$H#8,r]o)M?EpF Z0񗎘jnPSIwi(Fϗe[ ǣ1c=TX>PnmJipƭ}Ȣ"|OoA>BkN0O֗<,+ HAq펼k*Z{SUkNx/O$z+_SϯE}oȢ9O|_btBM[YQyI$s.}NEx@xJ@+=TkHo[Pu$Ē6~s"_\cfuOּQ.#j=֑i~iW::\ɺ(#( $ۻ=\x_~ GզW̚eW5 K_)~>1n?먠cgUNJ'o 76I q@3%\՟7E=چM_jѸ1H8Vz[QA'=(c?ik閂a6j+"Rc ʣq[Wn4wO6_X m*AW~?QH.=( {Uw_{S.>h AlDevo(7D?xN/[hSkZZZjWuAu󣷐LɌ gT:>?b-,f3E'`ηLęTr܋kE˷E+Kд2 "(BU">?Q@2(Ȫl}(ϷEs"">?Q@2(Ȫl}(ϷEs"">?Q@2(Ȫl}(ϷEs"">?Q@2(Ȫl}(ϷEs"">?Q@2(Ȫl}(ϷEs"<ؙ}{UO>QQ@%Qug ܅2*兏F 0>7Q@tx hD\ۥջv:dˌcPn=m( /֚sKX턄<3Q *}m;Ͽ?@B$H2v]ݛ#w?FuXg,O+/톏q"[.->g;P~URRTcx_asٌGնmkVFuM#0muthoBY9#vJ )gF,֮yut4FrnTA= X\<9YQ-O=o@h>!?5 r'f`ѣhGý HtvNMAa-bfFߕx ]Ms+cA:O377tPEPEPLIM>G qr }= \ 7[x;bTd/mWj 3\p}ɮx;_Ǿ)hb'B"vFݻ=sSho i-_/ xkwÚe-{$/{y$v}*;8xUYg'- XykaWNI mC"~گ A=Oװk׺e桩w*jqi\UoEU\UQR,s Os\C+xkN`|Ov$T$D5f|6^v潝wgfov&C+D2: <#wv'tmBLռ_&utS`.yq,lUMV[-;ccs{fYm&Q D_:+o0\}3Ԯmt +_RJy;et+,kwVE'Jerlȓ7ɻvxtﺠs|s:h>WA_Z\^\=#vgY2zHͻf 7]2ϡ?!mGsso%iXdOtc9 GgVVmA}isuy57Ow-dEYai\+n*w6T.:E5"Z{}OtMwyCrIu!RvXʞyw_M^Y𞿥} GMRͪ<+VH˓ib6#|g⟈Z6xYvFYq48_NFI߃6.yα,?d\q #_ݑ|M^+llf|0," VIaa3푚stVKNJ7^#M7w~8𖕪i~)BIn˼xxJ ꣙dL+xk$J4'o>e9]Qhz}QjiZlVQ-nM<v՟=y4?gm9ߕw f:IG3u[.KڬmɎu+1~5ΜT^@5*IG|Ew⛍:IGVI$R $䰭|Oqvv`}wn;KP -jmnTK1Ok Zʌxr/lhIJOWz/nw:jf>(/o~ךe#ׯ VsF6['X|eTJj6\ U־;=, OC5HIu$+yTU%Q T0o)uZIAiV7ͥV٭bacn$r9h槯>=NJ5%@!%HyWm1-V'[|v_j}nO)򤻎vlAyPVٌj>(!_ծ2p4lČmBoVi4KkvZQ.uq^mM4ۛ<ݾXěN~ \xV&Gii\N5m=?RYa7U2FT:,IrKq/9wXZH(o῍Zj~iS͹?l܈bS`nˡx2E8љLJzθ?m?omiA a3iz'/Hd^G$dݡF~1u[kczӧm5ѫѤ6%ȫߺnI<7Vzq\C,g1r1p# اvY~x"]$T%ͅ5yUwi䕌I]>iƋ;+CJ-v=ڢʑe6Po6qhn- Ix}koGbIuOşg'Jnh_iA[S!ddhپ]w_5ix_ၨ$t/ ZY+IK TG%#m[_>z֑jv!$|?% q5YYV`t=O#R=EV0Np GZ8;Aw0]?fiT`Q3@fJ0('ҌJ`QFh`QFh`Q2}(њ`Q3@fF4`QF}h`Q2hhf0њ0(4dF>s@ 9'ځdQϵ 0(ڎ}}ڀ 0(ڎ}}ڀ 0(ڎ}斁S{u[;GK,2v1U߳׭e}ND(HL@*dGZ7_VvHԙ 69鏭| d+9}uJFZ֧ בiَr޾VtʶH\HA OAh>Q4NS$ŏqֽ'G޹651-6T=+uW<:zQws?Ek/ug]Tӽ~Ӥx_]|a5|VjZg7N#d3=t!nc5{֗wUTAKMQIPN&~gPK{h.u 2i1in {1`?z^IEMKo8ײ[6wlanlg薣a}+6XQY @K#k6 WiUD﷑ o/[ viin +ᆓL1cs'gQ+N{~+=p}ķp*\yw0dG_kz| &[]JITOiu)O]u+#QxƲN-e:@G+./xz]wTѿ`x52;y]Ĉo򈑈FI9hm"2=j=v$Pt4Mz)ޚzľ_<0E$?qL DqJGVM[ddvࣼe+Hγ/ONVӧ6Ļ`s`.HP9Žݫ3g|a=G)/w=Rp{ Ǧ]/w<|OuQ nQuQ<2;8k/=4=w>Sv8 *Sv8 *k iTe9GRS]Kc}$2Omb,vW1VW* NY)?NZ)_nc#UW7tkqq_U')?|y=Kmpfzݿl"Z[^Fw13r-+~$J6wXxƂ\&⏅1cD|`Vc -70w(A=Fzomx NkwYT ՇZ?ezIA5`/B8Fk l]y tY,Dm-j GOe (!nEa.*GVYdZ\i6?.|8xoTq_UB3- u {\~HaA7eC?7gC?[p{z,kDlDP`bO'kM)OSv8 {*݀H>K覅v &N}PSV8x {*5g$_Un 1ǧV:*,u9߳ǟSTxǟSUv_3Č儿F?_޼՟<žݟ<žmyF?_ޏ1焿y)/ /_E6k#ڎA]?N<<Mcq?gGĭvf [G#!3ןCZ 뷟穿jxuljG%Ùca/oxK~+?y8G-_\tr3?H<߶ <߶ O.Z8:f~y<%my<%m W=xW?]|qC׉us xK~(xK~+?z??j9A7Q7W-_\t^'G s3o(my$Dz_⯎2?3{fo6_9Tzݝ,M;z2 |5ZHz?@2Ī0h$?T1xE<|-As3^F-JTS xaxԡЍK^ܵKuHdHI) :CmbG=vҼ!L$6XXìo%PU{;ȿxPx.KװKM ^v Y.~o,Evg QmqK=[կg-4yZCqRUߏQ] º.w*DPؐ|HQo@\xڹhh(c=+[0vۂq+oeW(Vr ±gOY'Ww?jW$Bq_^"RFW?Wǿ o4.:UwyR3Gm :q#` 8xI֤.]˹`߱O ڇW޵oǨǥJYFIo[T4bwjSу?6# 1^eWF࿈Zó]NF5խ!d[}LoXu*<^x~]Yk6hڙ7v6v"("FfۆF|Vxu~n˴nv^:|SVӵk}>Xd͵N:n|G%Ğ,/4WD/ܥWf2 '}qX?gߊ2>oX/ͅf-v[ \+DSY-Jʹ+|D׵-ng-st)UL, DRQQPշuStjm_?C߆٤oۙ %Ԗ}4 @x'  5 |x׀&P[{x˼y4ݕ`v {/3|oi0 KiopjfvB̹]0a4ԠOO>ew?%sy<`ry}i@8A8GZşOś߄Džm[MLi:ny.۟WehWxٿㄚ_bNˣ t-d{ N q@NrIJPNUm/EJW?BFxښr<o¾&x~IG$uPƣR2;X!띠a|8{q?k~5%߈u]8Q"f@ѳȋT)9'V_?>:ry}ivz[wM>)<-i]j)j]\YEs%MUg$W*oy.@e m?d}s#'[Fԗl̄8L:QMʲ)K8#x/'bt*FM(&3z?hd5-txƿ)1bcC+dIVe/|{mnn44DP]n5|ikBy'^s7{w>߇7%QZu_1 6D) 8|%:Κr|NyYo߰橣'I!mxfͬo5ZV&DyL`;&B<,?a[=[ SFѭm0-m$Lsnqk|yi}2M+F=Zľa7+K\Z=fK˓ؑd4㍫\~:k~#д^mWUO:E.lnlƅ4. 2w-߅oh[.i-%wXde2Ƥ+^U}nV迭-o; [_|Ea=opO7$m PrqY*J3Uyk~4Sx&+:M~ ]}7b;s_T| %?^˨E[>̈6@$g+&a1&x?V^ntYhm%|ue IW OpZѴH5mcEգ6a4vH0}t'Y ^"Yiz?2T}AqiB};ZϏƨ3xv4k}jɠH<m10Xnl`wǺ_7>MI+ m]'* F׊H[ګ^f80AR2H8e_x KZ:5ZΟgv9A M˷2_g>t-Ķ--Ϋ(:t0[Zye̎:ujdRUSi=?=VDr:R)!B~5''5N6qΐsRy2p!SA3ƖڛWfr=+?`}Jᇇ3F.-|7{NܭsɶE eA*:`<A`I@s_,鿳G/[Sօaq>徱f~: s!E8\s=*Z&G՘IR/8o'#_K-xc '9*/$ Vz^^y/"xŌx6A* 5:/?ciz.ji$bX24oimŀPBOReJ[_YQkM ~w Yռ#k;m]h\%jm#[p1[0qX5ժJ\D~#wgpH=+߅ ~Ÿ\z9<(8(m.UG 2:C;v6]V}PL$:*܃_MUp9Z#"m08:}wS]~_X4s_C 0o ɮ&O^,Gټ/1OӮV)/!Qos$\;qBC񅖥;}zvxRA Q[C6A-sQg%L0"RX QZe7o.Zݧ{F7tK6{<%;}7RsUϥ{v()6{WYc5reiBퟙ\w V"F}\4i`5dh`~r@ \޽hyfRHhKn9`ӧk/xO s H&;IV`HTk~$/JѮnmL]CݹU-Ήϕa}FO" jֳ]֙=o* HƹZ|N.bu23op8#{{AW95v:ƕj)$j|~~vYƝtђǏ{Y!)UՙCֻ4:\ZI)T!߃c^Gy(OHSI 'ۿCzN)X3#Hx'RxՠDFΩ_z@o_/qxR<'<ֱ!Wt=wN/ny~nW"LLU~I#jo;Y+>9~О;`TC1 ^xe/=5 =<"+3Ě]>#4mqK+a UЕ!"#(hw\!]NRn.mf*$sx%ğ>5mBKXnm 1ws  p#X>4:bgÕlUM-ΉOۘذK){d2x#$J}펑 Mqv<ʖ yOV07bj+Ibڼ7J4 C ћV𜎳ybIRDǭs{kqhI=50ſRkdE ($r2HC[o5SzDS@졏Lyoln+o,yM'=:|rL'kT%)bL}$svVpZU%56~4HZH&r1y8ݎwŦ_#TX69$MH#ٸul;Zıakx5#•xg[^ H/{6aV2I~@BϞ2:םzKBTmLo x:ֻckh:5OLrwtk׭IK><<]gvR[{k}\&Ѥ`:(FOq|24϶[k/ 6w .W#&#X?발=bQ fh88$#3Zw_2ޤc(w#XɩO}!FV ͼbe >_x`.cִZDaen8NzQ**_uXlX?iu D]C 3ڲ}z--[uV^ָ]Eڢ@3׿IVRZ&KӦMUql~@Nzg~3S޵0̈N9ONG'}Zj 6jH$,o`r3K97_:τ~٩WljU$n(J1 ׹JI ;IZ2xN~ FSԾ=S rx$cU4z瀼;F]> B6+{ko$d.mlqU-|7%?jϨ۹@B#qdĜ~!ElQv|W _ ;WխoHTGE)p:T:E֛I"G:R+(*Bvzʳ)ݵsO0Ha@ħ8ڤ'ҫ?IjvHbMBgJ#eEZ>y_ aIc.fagX$.4o-<4KD>dѰ9b0w63\VTq-w24CWWW6]J,{uZ-`۷U+ZD=;uw~KRiE&Al8?j<fՎh|)fmk#[y >5(wXVwr .iޤrzxu+y)hKŨ$ p7B2֯_|W񽶅-ϝ*< ǝϠ5'ҭwNnяL COx^٢ӵ[YK29%W})U9S?۞G}k[ƞ,ڝrXݼ"G@rwZJ]έى/,~r0}sW~ ePU ??} ^'U}M$MR"2z׭_Gb'WRMHOݷ?] Z"0v nqO!y#gu~U?Q_+CsHA01 mxkj %zt&FCl$&qK#摔['P:?5 ?[pDn?tg-C'pϹF!#!g/7" @ U yx¶[V`UUOR HTO#摄߳ zb"~~$o~~+kR6S~#xN4d^=0y?]h5E s *# H|l'޼*dNI?T+h\[lqR Z:B(EPEPEPEPUx/: 먴XϽOip:FY\}oLҴz͎/MQ-f{Ty/o^9Cn6Uԯ.5InW}ͳM3q(N?xad-0*oH8 eO:&OxKZ-- m%#3mi0|>>3u5(?V1J07ҧȚܕeb68Kڕ75Ы0 'fMUjK5SEY p+\$ĕUSpzsgKɴx.Y"R؛U}΢.<-q[DY(UBdHzUkGm'iP+"F9YPcRp Q1}4#2l𯊺hhؗtaq)98`~[diX[ɥ}$Y S}$2YU#⾿G6كIK[*HQJ5َ:zk|+ީAmmmdxTwPW54_6:mR,# mz_u #⶘uE-[^L=g #ՙ!u: 1 @;ك8WӪR.5TӁDڞ`ᡴ"9H}2ֻ߆*4M(|56>Pljlt$p82@PLҵ[PUV%p|@9=+NOWcFNP Cy/%[7 0 û95$mRNiܔ2rUҾaAמӢDݴY#fu 01޸-r.K]}OU[ft!%[ QG_@# ^':uۭ`R_êxgRV+_*/!6RSqo ʌ;zoUgMi⿽dtoL d*qpHZQYfg ambF9*:x5KM.[;yscnް /Wx1)oo m# ~UVUDsyӜ2㏊TVW}_]\{j/ 0XCun+״Qci ;Ww'5xeT`s鎵ݜO6qʬzO>|c uzld*$i-g5{ǻX..&js$yI>\wick:>v;٬,N_co5}ໟ :uڅ~78݅ =AdWSKNu0))@>!Q {wAz,3ϣ!48m"Wwl/ʙ$`H`3q?Wђh.>g7pAzUJ~nvT';}O~Sj:h^Eh8#IJ x=k~;?<:b[ZlL_He C{Hgqm{Isi;W>pE""$;aa%}H!eenã(v?zxUcS=ӍEmᾋ.R($Y⹚G c;upm;V[ >Q.HWx$2P 0G_JM((EVvS%lLCo\ Q-;^>qkfɕ 0r@ 3^-{Z-CVdύɥx9SV:m; uBr} xnB5=J6--c$&<(U{h ;Mw 9tk=wism#> "o0v81֝u/Z]tB.7cini/win@SXq_/YBpS_3(;^ zMںI]Jg= ;Wè4%ćq He8 GNՍag$6kzޙ"/o7D2YpE*FP sׇ@ze&MUhAPDA0ˁoO (o{۳rboXm&` #tdjg]o Y}A{cy%youwWz1Q"B0Oj ҍ%OXpP,aÞӧT}M4sǧ )t@3wm_ykom%Ԗ.oa[;Iuu;-HF6I  j.EǏ<<ߴ/+9=('wTJ+nq-x/jXmeya+<9xCSW/h/[|~Ys$YRz牤1xXp8kr[iTάRYT`{>U&% *>c6jJt|d3y}Rͭ[ϳI 2pxxVASߋ}']%O(+"˻À ~ xWXu+F|Ir %X¾^'Fn\.8$ |lzXX떺4<&\$a>NAxz~=W H1. m׎U?J?ۋKғ mm!DrfPpxt>75x{K.H$#wm x95w )Ǥ# 4c y٬ijϨ.|o lk P''*>N_.ubֻבؘ9t VR~Q8t$V#['ڮff$׭e:<V:6hUʩ%\1\O$cRo4`}֝4ٙ;OL+jPzO\vy௑eEQ}?j i*9c$`* iAgewQFjnL ֡"U )-FZ¹mC{P=Ij妍C 6zI庞l5l?[rˮl?xmswh(OZ%͜ᛁ#iY׶y''ӊZ?tOsmi>!:Vva强Kx0X*.~3xCӴkvv( Q¹+o幸nfbM+woRO&(\ ǺNZ4HJ'tUT͕>VӭacO-6k}lڤ%2y'38)WLCK_ SyVIm4b$)QqNJ yX@(o9X]JMm$Z=u03fZWkr28PG勏\Cyrmf9L2Z-<9|#YM*q*503Eӛ:gh? hTSJ5k.+{peF91UC^+o;˹mFV ,mZIg*誑QٴFk4&ygWk`*FqW!y_C! e׊5_kj8,ͥIm)|øn: b5avɊJUOm ݤw6dsui?1y%7Rq^o'Y\/hCQJJ9W 'Ÿh9x>4B6 @$Tծ|^̢ B.rIa`=C߈]oM;R'] zv^' *Z5y@k WŌpGz%孶k?p%:gOI𞧬NtB$HH3qc?ַ Ӿ wx$+sq竪0U^}֫R.6gCje+4&%غ!GiÝ﷖npqnu;/ɆYtZymKZ?(Eѓ` LWCis>"4ìE t:PSc%MYb3Fy%,qָW7pKWWnS J~=Ucĭl]5h#9IX'!*r p5]qs5b14 Y })ТZ+L53A=5^[A=R_4j#2mQnr0zzv;4TGH# fV'GSƱ_XY#䐁 }2`,k4W%O=pI2nk/T=m4`$` ܐ3ao$1pDeA8αFY0YP;?(ӏ;}M6{l7#qƼ imJ d7#;*J[vnZCHSGNҊ{\ xgZ66VpA%ĭb]be1SkTי\-i<7dj-r2-d qBA9;٣(*=Zߏo<7ge :5̛IH#rzs_!UiSS} ན2]-u F,+_.̡_5%@lFtuCN^f*.n'IY-PQ26~>dSܑh׫i?YԺBd9h ٢Gc-;Xq5[zoag[ZE D,w|:Wv.]VA11YX|Ǯ} rWWVQr"3(~C`<}|Epb{&W"ʍ玃9HNhW f Аǧ[{,|u?њHYS61\@ŅB8գ\F0OJ[fqTQhŠ(EPEPEPEP5 @oGW^ѼU\x4h#bkkxbG]d1Ӛ=uc_x?EdOZF~&, lկ'񛏑 5/(e j7X.K'hQeut`kφ5$FX-_ [F6>ܬ'fc8B8xcjtdKKMIRĎp^q.~/ne2F~UJ =Xw-ϦYj{CĮ?)'~Juk9tS"7d9%/⦭igNoK5g O8uC%siY#88=yD uY-&PF\$d ydqOK ׅL!X0Q b|SQ)4cV^cUǍG27 9\n\j n'sLM$ I)]l<>ͬ`qJQkc*X9i3ak.|Qù@}NֽMuHKfg >H\ Gְ~ե;x9eK###rmȮjxrƓ} /HE4R2t#־|4u$P%ʙY@ yo|g/DunI.E^kۜ9$YcjSKBࢬ=S*kQz;GbmCr 0 9xk=gX{vʉn2 ç|-[.&H, q^Ohzȗڵq*qgSLlN۞UڼM}?᎜M&g>գ*oC\] VT.mC3Z k_E#M"ݰOu8ʀ{5_h:D38iņ)wa8uƢJ1ЇA;%TI{<|v=x=°#ᮣeE7=\G$h;7cβ|By3$%m*ӚK"L0%Ǩǩ*7~r${$'qSze!3Iyx(C 5l|5"r@"slrRuk Emk+30."}Fq{msS}YbuB?289@QZ1uA# WpN{"&o5VѕUXBEؙ-He4;̠ tկ?\9xtD!ۿ Wӵ).x1±5ڧ.t: OQT!Dd,o#"!e ;3Tg[sSNjZY͝wҶf,BcI#5,CsqT8S`݌,A;I# DE"SvU]KZwBm ;=U ҷڡELIf۲-Rpj^,F(7m#5 0)@vUn9<\mҼ=RM8JKJOe3 E#EBPKc^,`KdDք:hK! r8/ɫșj đ !#G[jЮF}Zә-̒6-<WfF(FHS?] {ۈ"2:! mmy+ɵ;xUZTp#ӎjO:?>S%|$Ov1/tIc#n\ψ[)쌲ڂve E% RR߄bl9#>=M-0y7r]I0ތX%Poª=vL!%},D =z?xBol,3\J靧jzSW]N!@eP>ppz1[_b2 4NA .ZQE ( ( ( (>_gwW^>,gDKFiSxd\i@ qYٱ9c|3)n(<-~ V^oYrdķ=:q_!yq*QB/ r}PU=M(9?"@A5TSzK58‡?(ڝE5m7)f4 (O%\ ެl ]L}-qu3cC0]E݅սH158njW┴d6Ol4̒(qenuLV6V ?.=3]."j\ hʑ{Wr]I)_;OߛlΣB)d!-B {tVlrG Zyũwci𙧏͚im~uQzq^?}n;XՅod{b1 KC< إķkin",FX*$Z-:ɽf}>vP(;~r:ץ$=*S; 8MI`$q3XxxEJg\txK]DT|8Cz{Fc]UEzj7I.g ?CZQjved:BytSb¿ .W}XGcAL/)*3`g=&zKQkǡ s9 2rzPcks׵WULЇY}xq.}>ha֧ա b.:$ f=8*K\{r ojROqggt7NrzxH)*|A1 n!r7NڼpxV\:,r6b}bW4+)$YdH`=+]j;7- ֯^<@2T㎃pGzIJi*wgKH)i W%Hp9c1ұ5dHEH<{S^kK- U'o#97`w3Up3y86cFvKZ+ *e8VjD0+,\3ۮ3RxWsx@6g-͛BdcpPF@= ݅5rI#v'Wj98jC7O]78}/× :$)%b'cc^Z;$VV?Ү!-<e9\`' {+I-3#;CPf^w{&^Ԛ'' =2 =lK$}k:ݍ^YxwOD}Ho*9ǯ5*teo( /J1\Zfi^5ǚ#5Pjӯ-h^e=zYiBKmi3-ʘaX *BAx/j%HӋl[x dd{_vJ˧*u5ZhQ?r0I %@ೂKsuÚ6f4ֵ?xߓ'2pR {O?. yy&Ms5ЙEc3eKk#(֯њQJeƛw$lpw)#nL g5zfsmM6eC_y*)ancxR]X[p"<09F81c+KK/g"G[|5Z_d7y>! X'}SX[hp΋5+o24*K:O Vk^I19h@Ls?_=֖tti pf秵w:XuԺoͰqKcf]B5M?Z ۛiipl\mdhy+{kv+v0s֪_F}+7C]):V_4#dm9޸~!} fZ,ܤ1rBWUOo 4=wC[v if977CʢO~3#'džM1b{>_ݷ|=^-2i"cI"IY,z+оJBXh pʐROڴХK)o%KD}!q\}|L ]sw_ jqhmw=ĉnK{-[|22ѱSۊ tKضz > }2h RBwKМAږ@{;E{Dk0r9}pڍaou=b8YZ=gQף%܀4JǣxOM-SsZ^1'k8qN[K^-%=Z@VO! CVBH茊)=iX}M#V8NܑIĩ_MM $8.o4tSW$񧈞2Xn7QQݕ,BHo5@\\ w"I;yYx xR[dB1냟^+f=p0}?Z:qPǔuf܍ni5-/䄪.˕ָM=Q5IJ ++qk"#DQ$bUϥv{Y qEntsc?攀~9pMMbNUy]9AIZ׵IR YDq1(tfB6s$Cf'BP(4 ( ( ( ( (>_Oo=Ҽ]m<]k=ZC"q1P|^a^]cE uKtY$/\JKopzRCg6Gqh|61Kjr;fЛxJwӡ~i?^2ZxZ~,iIe67M#bu#םk<353 sbBd`#$#[h> 붫o`cm|ēQ|pu߀Sך7 < \IO~&I>kݦg⻛k{g~ҎnFO^/Û=+GſiV6D",y۷pMpRVJՄ[c wuNvq@{4 .oRhAԣW36s>(,#?+]yyi7C7H)!>ֺ0۷ԯQ=qQ8*$ )-ܴIOg'j^?j𲮭 ;RKaŁr+.?\V4dS_JѓhX 6B<6q?EBV=*x+?C.B7wܚ1IeSxե$^wmu*ȏtC=>bo f-Ň#yZY]&{w<]׊U@`HTu_ B/ao5ƙ LOon^6<3_Di=c63s6!} 6'yt{Wc;t[&m;Oz>擟Zat|­{V-e\YinKʢ7L8wX51aKVȄˀ3\}+<:wje3Q2'-xaFǒ+MWᗌ~Y>q,.pd8a_X}iF}MwΒpP} >y|/KK8c]*}jr\f"[|5ۧDeBwI@;8:XA| RS7R&(N-֯ď%k>B6?k^}i97Q@|Y|UԮߦkwQa!d@W Bg~_9K_UdSSV Z>pOA`rw#tnYX=u֌`7|.Oy#^iw3HK(*m$uaxP~O*yl tV> G$/Dq]c|`دɣ֪X%6&; Yv֮/.M2(%|nvc\z1[Zև[}A-|9}=t@wp?½G5sz>/hnmMF[t9]zb}"oF6j]GVjOuKwu'2Oϵw<]c-ϧiKq>L \d}:b$u?'_zef4>I{~$xDMAL" ,[ʐ@^gkUZzv7VO 3^دoiyie4ǗVԚZiZoKi5F~\`uAF>(I4˧ Y9Z=:Dri"_ &}gIMmf^?rq;\<+Ưmj>p(I? _,G&l{.hiӨ,"N Q^aEPEP1ERZ(QEE-QEQEQEQEQEQEQEQE#(e Z׽𦧧[H:ͭ/$3(+cOk =ߴ_4? }P [h*C&[ފ<uFl1ĒřYi8@2kS^ u;RG,om[O="IH]A.GzS (4QhQEEPES`o^^]?fvڕ4 QEcQE ( 1E1hR(`(()QEc4(ERQ@Q@(hQ@QH()QH(b((`QE ( ( ( ( ( ( ( ( ( ( ( ( ( (>_S</޷jZ&j6.nF| =k+<:x^7vAxWIvDj0J&Q\?N(^Z]sQHt; S[4;*:Ƚ}k|53Z/I#?Pw^"|?5X:tj*JoOS};GWdD` 4{8*{,|C;:>aew}hܗE+y.#QmG‰cykKCmKJ\ 5Α,4nOz|=kTu_kC 9 q>EUQE1?fvڕ5`o^Ml@QE((((((((((((((((((((((((((((((((((((((((~4ubuMyL̛[yfXu> M+ᧅ-73HؘeEh?̏R%lӂH1-ezsRz?5 F ekc/q"!:r>q@КIp {'EmGF׭xr+F_jRxn Ki^=vQv3ʪgS!gqgKor%ߜ,~rnw7,LIkieTyvȫ24H[}ۘޯ_ZcJ[}Knx75|YwZɹ8}tR2Pk_mFPG@Qt\>J-~"|,7meZN: sR"oM xei]fh90EWoS}ze爵;O弑>Y"tm:]FEK}d_ZLn-|ylOpC7zW 7]k:Ƽw6XKy@(̠pw{t_5]qԓWivFvG)`;!P}'G+&oŢ.3k,jiSe(sUmkW$Ѯ`̓RT0ĸ: dV "O$pJ8@jNknZݢxڻzm7MCG]縴h-!HnR4E"ȤeFX#Z=DpyF}1^9>kӉnt뵸PVD!ٕo$xZ5 i~nX7/i= Ȉp ǰi<^ ?ÿ:ujuIY!f1ߙyVJ=9< ZG\WIZi]:f}f.7<)sҢ [\X=DeK28R q@Wi?|u>-nD5$mCwOs6޾m"_xekg1f.thj$ך(I%!2?z᳏Ƥ+}{P]mVN@PI.ӽܪ@ۏh-QFE0'&ux6S˳ j.3ٳEdX Fz޹pxc x_:{nIiѬ)D{f~v3kxn߭x\B}N9oC -E8Dڸ zțwj~gee&~gee ,gڐ6gWi^N|k|=áioh\mHd܄aGGZ< WZ_č>/]Ojf.ٷ 󕀀7ٸd"c5i2廼6ӻݴEtA(9Қ*1Fxx<3㹮MoR-4yZ+$FjX;1_7rxc.h `ַJvm$K(IJy;2U8Z`}0?"b4oJv[[o|ĚBf.:⢳7k7ZԂ"E=Tl19 y&|] ]MOO֢r$_"yRfU倣W?IZ{viI=Ɋxx~ߌ+(ϵxkMYui,ᶸ/v1f%ڻ@Q9{Wj\:3J\~_̣̩lo֌~_̣̠E~geeN[IKw^Q/#M].+L06 n{g#Mz^) :u^[}Ʉy#l9fpܞ_zWEM񖕫j2QAexCD%Fӎێ(E4'<@JyjYTd`0=O|m?R~ I- {HQ'Y&ܦI-h8GJ>x u8+|yhZ@*+D sm9'_x{Z [7 Mn;*a0a9lgz?; %4Y-$?w\@w 9ێi\h >$ca=ޱ5񵵌}vw>So$A|y#`f>}Z322}Z3223џo֫yc>߭jG@3џo֫yc>߭jG@3џo֫yc>߭jG@3zpjQQb4 fHBRD9WSS <τ燢o*-u2n&|zm8Xu33Y3I4-ˣ+Q=Q]Q!nҤHXG{Cm[׊վxNҎ't l%0Vnݸ?Z%J}5LTf 'mוjo4 uj|3TF6:^8v1йzi',i+S^<i:ŰٕWGGFEdtd$2!\VPaMޙ֞L\^~s@hϵhHG_9o?I^ӴcQ7(bۃ3:o^d 9 x< awnSXN-JZYQ/Bkm1:dX_*y`19:w5MOqnlaݚg>PW؛CeS9Wmއ?QO$Ҋq?ޗ-?mZK=Broo.f4V C*1П~xOxK?& յPkvM c)IJyqKN8ԣF@߻čku$oǹgGw+z4:%ǫ<:zt6]SV[uR#(EĈ_ 1}1]CWyͫ}%mB0F9G7Zn gD{OI s`~&j'|ItZmbV5Ti9ccSU/cKu4|=r}݌q׽{mξxN j s?S[[``oOU|=jP RPQ d.3 qnA MB`ױ/t{)&!`,F$gqR+SR񾧨G FQ%ťCelf 4 9ېy}CƯYse.`#0р#G^ưC ڵ(E9H|EyxCkiv0 XJGrF_v :J/1m;gյG$ۓGVj7W7/&M6[[}ڌ dVj*IԡRSqQa+Ƴyj^&8x|*)T9{ 1[j6֗ m5+bA?9$ c޾õB|[xIiH=:-f!hVi]8tasڴ-cTfzڥTZ O_/sa:VX:︓yHUqSr'xʟƿ_Qe>Ž`? -W^~R_Qe>Ž`? (׷/+eYϥ_/{J?+*}-V_o~W( ^~Rs 'W7B3&qqNۓH=kk*}-V_o~W(r<xt;8mm-q!#3D^=2OSP[yaͷݲ'Ž`? nF ʑ^~R_Qf:[`G0_kWҬc?ƒYt+so?)G~dϥ_&}-~AkQo?)_6o_!?+sukc/ ן|]XϣjFC) v"Y[n# lǕ9&}-(Ҭ?Ž`?mCX[/#HmwB9.[={xQRdhqH# _'e  OM~=< 9+kcA k][2hXy =rrmNknYd`cL[A`Nsg׵KiŽ`? m|z/|K!.eb2,^@n[>YėSqq2$xÝ%T:]$[rH| fq[sbK[r{?%~eYϥ_*}->`? (׷/+eYϥ_/{J?+*}-V_o~W( ^~R{J}ʲKGU[ߕ 9׷^~R_Qe>Ž`? (׷lߕ 9i'Tgok\mXwKTٖG\~@kQo?+_u/imMisյSaQҎ`?"(׶:7_J;alW)$ӬbBimLW(u[rx֭ExV=~+iL~nTWq7IѬmOy`E2qr || #fIm49 rG*pAb#TO_BxX^{Z-ז0ݔ]2(U|m:N.>nR=F+4_>k6h5p]>Bߍ`!~n垨4[ "xW.[XǨJ2mN@nh"D(ԯ5J6*"QE3>k[P5Fݕoxp-o )u躯m_in|$}Hd se8evX6c־T"8k/"t>Lk~$mI/Sxc=ےy]Ѕ&ͻ:ɩo+ژF4J_hQLϱ md -fQd}R#F4y+ӭb^InD?U2g=kŰr-.bBxl}5Ȗ/n`#ЁNKTVt_6a ,`d;9r nnsWIjvb4SQO< 'seuKb|FN#Mo.$tEesrw.0A8\UWK)RF#PwǡcXۍBQp")0pbH[՝u\%n rzmaB B)휓yx; ?ݩ[ -&HZ\#48)ؚ-.&hq篩HXR\FXSg֗/#xZ?Ӡ<#bl,1t=}6_ڕtrm {(2+-pbɬF&Zi6mk%;ԙGG'?uue&)v^!յIK]P}Ɏ݊Zg`Glm+W۟_{o߳F]n4=Gß7݄zgæ\lK+|~cImN357v:4Ю+gs{FC39ϵkEFdr qs"9)a؁*K⾟e}/=8ܧ;5=$]KPg1,<,ic~@ 8mfx4|Ax{T_:|D̮N3N5e9ʃQw?e1F?9潄yAE4(4f (3Fhњ@Q3@fњ(4f9Xx#>*20Jm;8om^TF.?ŶqZ"5&R08W-÷JW?hߦ:w?`ּIisT$P)jBqz_~Cō}ZUdu_4`]e80T?f]?5oxze MbXxJĤ8ld{,ih +4aŢMiwqE\+Bcf^pʊy@i s~+4_~]~jڏ㴂CM=1P|?Ug|:]Gswtwl1,{Y2%xt׼go;+𧈍6-*ڔQHKyPx| gzOGf5yh+qi bsPN+.5- ÿtC>ȍPq,A<\a|CE ,\hz^+ 鎠/`>|@xk|u9h><5F+xq<5wR (U'~Xu㎜=_^ U#zx2PF-0~׎x~9~-4ZZUΝo˦]?gY%aV#8lgKmRokZφ H󢲬qHq[5|;V?xEմ{=UMحYk9)2sLj~(xZ<9aXkPZxxxaAҍO˃l[(4H2/ M CW71SYEP$㡭Ǻ7C'Qu.!>vm` DaOu^!]D񗊼G4GF8qs]?Owů z6mYjqj%Kylls9tM/Wf: Ʒigw0Jq1Ԯ8O_ {Jf_5}u+LUDp3ҿ~|K𬺅ݙl1,$$_wo[gĖ2 >(M'RoѼby b8fgeirjQԙKg.~ԩ`3l'Z^𞕩_67V,IUޞpZRh/?Ʋ8i9&yGM m4X.A9ϧ[ᶓ747K1C%`X,@9c (4f (ȣ4QFE2(Ƞ2(Tk{9~;G\>:0x1ɯWIeJG.aPqp?*ڳ.n +? oa|3kMM~j;+<<u=J}:;yu F#v:]H*|\u'"MHԬ\Q}9WQxKFs :0d9R!<՟_onҬ$cK%c,Py@턟h5}9WGoCآXcT^1YƜ4+2|nJS dom׶S4l`ZhҡЭΒ5HpE"B^=+-~nGOjB|lڨܻVn&Ȯw/nFZ-:w)9Z.xoTlNL~;.|ɿ˂"F{`p#],=@Ȥ r_E7~xQ"_xk6;FN ^^Y>:֤e VVV_5J$yYJ9ցKWo|s@sIS^Z\iSZC%.cTrF)]&iexK˙-~nd>n\/ۿԭSSM;ƈLA qʞ\`sYM)GiVohfYcdyyn?WtY%kik4oN[<;N=j-n k"e̳Edz^{KFĀ+%C$dcUYnu+[(!GEHHRr=k-umpz[OkCsŻε`H18B؇Kխ"v{) ļ /rƢgh?1_MSo,!HJq.px b*Fo`ET\ĞC䓏P |4. "Y'+^v PjvvGXؼS̗ q!;G$N ʽ$[w}5cfeWzG,g0}G_x^6Qi" Hyrw'#ox\m}ns_Ogv3[F ^"BIӝBx"e:.ϸ8z^WO63nC`vd-IFۯ/ d7M6=e{slC}edr'.A8<ɬ<7͟-j-#+w1<z;ĘeKKx'#;`rsZkh6Ŵ+,h :`g0Cot$S(ch! 淅2IV NHif,h[8zC׭gخd-lxܠ1U_to&5{}>T\NK t=5m]gHu 1k|e$izvmV$-utcX.p~r֤9xy| IcIgb\̡~VDvgM/@H @8E|[8Ț |%zD3ð[j UGe_jwP@"$f gs8r7#Hq#"i5!P͒`:ڃy~j/ֲalmlgtq}V,'lCmhxu%qJ mr:Rjj%ͥgcM7b d*Y36e}wP_ڟ}5\VX]dYS*SlW?5/POejFh:m֡66U1@361I,o}weվ(8gTݖQ3=hgP/֏Oe ku~&9F>Hŧ*.j/֏Oe?K8ETdj_g~EA<Z?kRgѭkF'!I%R]N[X*/$On1Nu.j/֏Oe/G?h>?P]@KweIH2r_LZOA`[E 3ݖpLG3?s^aOSwHjZ9UVoCZZ<\Z߇wS~j?ֳ.MCP2Am!I\층[tL~o8F3?'g:Z߇N [9,;2 ?j6ݴs^[[JA$mpÃ+/U{oA76?+;K~aVM|Nj;u.?֏<?ֿ6VN>p~UaT{_f@5W!9:xA&ކnVGG3kO+#Xdd[>CFL mF #tUakX9OTAhRqz__~ic?Zsh±b9]_(׃bjWtGIp*o uv{RzrvCO?֓Oο<4?+=[<&5G c>OEj/3k (q$ЇnCSb榏?'?sϛ+rCéV> sౖM4Pκ'O\+ƣ4^_7H?z=h͝o-i mG#tH,wJФ 8ʍ2pk)R;ԙUOi1=H_.˞uOz5gLI}i +1B5\rG?jXQWrCxy_t Ysx#)|GX{V"[d'MV|7LZ?}#k?)XRAv<V1{*O!>Cz$h~g99sG0÷e#/Qnɟ~igcZb *en[?3:_hj. 崷 $-aV[U# _ڟuǭ\Lg'5=)ಐ'_ϞP=kВeusW΅D;[f ~+߄@/GxZF"]x^m In^ܧ#ăxek}7ˎ`>3EҐjXڑ2;)!'Mc#& Tc83ѹ"Y^}V`vI`x ~jT|agpr>5E`=j2g9m*濠M|nmhIpӡ<t0xOCd۴[>C˹$16 `^_fR-HMG TQye/WRθd`dk>'K .dVGYTϖ?7ug;k;vڲ$("aV#5w}vQ#MIh\FH@ }9d٣rIXo,wXTITe0xAm0Xq w} ||p%ח/M:-s17l'5P :Ki%p='NPw[9hZ|Mi7RG*##(rCP펅 ,Gxi Ǒ'}Wbf_'nbAuҮe,w]%V9##=OJ,pxෂ5ec:%k%ʇ*Q(j=Cc-mN{o%(v'Ӷ=6~jw0w}Rl}|h۶r~d+t>U',>ƚo?# iOwuoH$lJNOKl|{x6y-XF4΁T!;cbqFCͿ,5G~Am5 BZNnk!<\_A6MJM\[M{kygc_*$tRʿ.ꕸns8A#&H4RX<˹Q yk˾ ]mc?:ΣW1ݾ{%ei7~zH|]u_wῈ4_ k_}88Ro-Ҽi-\[yv,;it K V;QA@YfV?XucƒK5{9 2[A牢@3~}7V>'xß> 6}^%x%1w"B sk|&N<(ڄ_koq\ӖeS]/{@Ӵ+{Ğ&}B8˃naw=WڄOCd?6x{Í:/j2i5 TP+.1/mv㆕4^qk\JRԗl%UAQh5+ SIݪxZۦƋ=?F ,qKN}j,4xrexq>e#٧⯈u;H,μ57i,/7!ng79?CxAfK`$<@5kx;O[xtk Ekۙ ĎA2V`zԭϜ/٫@-R [5k68f%ʮ|ӼQg\R-iV!缱#it0p1.E{/7t^]:LFo,GUQdt%ERg:.=޷ hvi-Ŏ(*~nؗc|sg@-;sh-pJvr}7oDN\\x4OjJD!2B ,σ#ּ!^͢j#&m%թ^OD02'~qkNxF~_Ǜ}6kWPx-FOW< u_lxx_=u?jzx}Ӌ) ,{Iws_B+Ka`n4ٞmn8Uu8qSßMVM+CW5}VWtϚZ1`7߯5gVJxb^oZΐF;)Ҹ B8؁$k-\| Isr~yH\2q2kOi|aq M۴oąu~r2~xW i-ҴIgv<f=oYZ=ϬM w `h,J,y0G^]o>Uc =|K&i$WKi+Da鵏wҽMZ vzy:fMI.p˞vs]/>7eN2J3mV:5[; !B B["J rjRnsEd%otBy8oej+:1! NqnSAoJ{1-kT%k;d)2Pr\9s),]7tcǶ\˹ o.he* l 猌㩯F|J^Ujl1)P >3\_mn"]O?6*07++0yd \9ƜqAEyfH-@yX!R!*xWE$ C*>'bi aֳ^ K9HbYϡ\lj!uFkPZ[ˉuqAҹk9n5Zmn[m,>Y}kma,޿0Eu7˫'mZYBe*PX}kdvf{ wvhPx1khT|pz)&FW g=}Z +3#y$:9Q'6nnu&C4,:i|YpB^h~`i[dS7N&Jt_#VHnd`>g x pWv7-0 aWoxů.n1x8$2s]s@t wT/4-o .tU-z3#v q+bE g`b+@9X^sS\<{a˯ktxw_07J[|Kdףbb7y"SzKmp*.9=x|Xz gODȡwLP>wD]sRiX\\!V䨑w;c-d2h/~ úZKcXV׊E8e#T=q^D>>Ep5ۡ m|&4Km|h5 x bFm ۰(MzqķϥxF 'xnd~5g6V&ŝ%?MhډW4I{fd۳w=)0 V~i6hw)vjvWd[dW|R s۝⟦|->/v4 iQ$аVVeazR!=PN@ `@su|E-g׆UK$Z[^ k 6fdhYv<Ux*ZmDgQk *qhoǚd2js܍z^{iZ215Y!^!oI67_{{[A.Iª_QWW &t7&c%6`+Tk=XCr]E$w?( ~a]V#ݘɕPەf$ b˔izuh9u"2\=8]Geq-_&8̄R7.ݫě,fbtp9j(|Uihwew% g V1G~̷~.nE&\ p$H͊Cu8}:/K||g$5߫ǐAY\zיx/úv £ƫ< =?{W&G]>`8?vCdwԥ Jʾ SkY0[L^u׵$2L#bȸ;#޽+w,|kYܥݕռ~@|$Coߎ־'a !]c 1<ל+͢74 KMfAyq0STc0?T:/RXвWv3ǐfkz)R0$́:Grw1NC"=p ssUdZcÿ>[Iq{/%Ե.T[[1.6!!EH$/}eo$'P:Oz>?94;B(ٴH[=kA+~U%5L?7'hj:kz /vYXk|  ew,#S"$V%DTJ/o=.;'8rGZg׍.|!L}hm<$jIs=kܤKIQ|go_]goɲ=BB'8]^Cd4 XxC{wQ) s^;-Ū1-h{bE~(XA=;Dwڭ{ne<ܧl=U|<4 ^8  =1uI}> ~ώ8n/6~+. W?|{SZxqmI (L~d bP2 9v j2goG֢c!g8(V|EX_5&SE[vkT^`dVrI#Z+{~7m/P}9^mQ |[V6e$i?+k$]tk]__ {gA6VW -=rN@Ίۧ?3|IԬ>'Ţi$+Mψ2OZ|2}Z̟lX9|+'9|r??:zEn ^Khц .O_熭9S񮲗sm˷f Fx$08],3iĺn~$ WF ho5Cu>c_svyMp]i kSJ:m{f.n+c7Ыfؖp3֏׺.xx4:m>t;Q/O&RxɍIum3Nǐ#~%h Kmio W! >Y.-K䵑Տec{{x-|~ifm6Lms?HKǔOe'oiowN0߆/u;h#ymI.DkG,J9$4˽?2 j^(tW٭H&LYU'p\(;em i@'77W $z '/gOg~uM2 ?O1[ζ %bT!lW!xW6fiOH"ԭm<;u Y2HGz;lhw\O>iv6w#Us85ifYa߶yo3n lcgG,Ց~6?h?x:֐SI Q52%s̷co`r+WGo~.т^xs c%+bV " aGZG?iiqxBl~":LSwؒ1Ȯn'#CYL5ԼIV֜GeKk9 _7O Y\J#dZcm5dm Ʉ*2dg-F2kwAv/#W~olL4W0\(<>1|ga&m7 : m[[n-ų8Vil[ 1[>$z4{eoo;%˙?rѮSz>!k7~[..a=U-og HlZ*w)zOx2x_Rmm9 qy$d) &;R[~u_w5h'Sc#ԡ8q]ύ|=dKOVv6pCwx8Y<͇8K5Qәg OS1jg5h湡i^!y04 $BT]%ŵ3C|$ًcRG~+BiImc},z$os71=|'|7|EV.|2m^$w22;2n\t+*uS&Ϙ; TU y;WI LimhIn.#cڈ.H]lzWkl^&şnjnӤ2w"&0"%Ҵm>!]i>%i͖r)9%@e9##{t&-l<c8@c&j͵O)UX K6xBk7*CI,PI rrLV]'][4D/'W -nޥhui *+u"o7q];ʌ CGW5[[x{{Y$=K(ީx6I\d+ok4$%{q]u[b7g+ӗv<%]ΥIk4^ 򼥒T !P?1=:Ջ'}P&~%yB0(@zdsjƿ;=JSeG!w~?SA<5KNepgݹDdd +lEyB w:1|XtMGqmv~~~Zzi?o›8ٝ!nc+[ڵkk5\qL 3٫z>|:%цzWIK7u sppۏҿhǍ`?Ӈf1OB0k/ֵy-j7]xn噂ͷ@@q_gbA XN0TXӕ>=kGƋ2g ?sC<K@|E5hľ:wOyŕnwTVS' hHy{#@~i!/:x1c rNBAbXNpb?152/ 3}Z͉ct 55XuA鐫[leK19˂\Hծ!%IR3o{,j2WT> x~Y{ [K@#ÎHbQGBvC6bhrEgClM3ʑ2߈ .Ul.-5{OKvyݨ~ߕzmH-OX/ 9#f}+ׇ%esu:D|❽exzM[ekЏ,e\;>bv3—y>Ԣ*kb[\kuitt UiXG6vh|- 弞H#UN>@@# kЄ`Y5P⭱|Q| 5RY[|r l;dq#ƀvx^"U,hddiS>t|9Rx#umj6agٸɀFs'>xKJF,pGͫĶМr?\ҚR2G56rPO4CT}OP-ީCI^rTbDQyqNoկ^^߲5] 4[S(1xb)#()(St_i|Mjzή/?LV"ɿvUH Rk3F8'c_HjvkBC|Vw{bA:ъVH,xuMQG׷m4?&FIcGWXKj6o;E7h%gX% gσ5kZ j" k{2\5ȖO c5^}X4;uF\V$Ux.UD~^ߒ2A`ǽ&)yox:e힢:_=iGY)*ndY¨G_x^ᲓNM;;O$[HGſNI$zש`cޓ-do âhjլV1K]M-т19j4}:U+]. =XKo!T}ьy4\+ށk}-!XDa4h 0WgOI(YiQZZ"M%GYD^d%Spa@똥/s|R񭆿{\j6p^ 2]>ae e*_ m[Py MZiIe)%NvX0<_KO~ կW垧 tk)R`Eg&Ɓgm]?gTᮞ~&I!dUFأ]on{#擢X&K`8dJ*7%%qVnf6ۇzzdݷ.>\P"sy~`8`p18-#·^QԮ$֫sn%t~i7jzn2;@% W'Ĉa& ^y:ۦ_ĿZ?_[HusvMPxa*V{1k_k IlLKZ<$6ω4DŽ,m/n4d7Dk0&4t͑p854=& ZsJf`4S0`F;=-|%[%m)d` IB*xY5l)Z/X9xmb,I`ɌB R w$nwu=5[tdn$$ oǭw7m,^L|!>|F "D` kEM]5#H2@g ?$.TKNGO4|r:hm^=ongo[.&$WrK\1B9$Оq kF[y("k@y'yi&mwO+")-aJLp :nO89ҷx8˹QMhzyMt[|"%ӑWO_^֭o5M6Uŭ\lJB/d4Mt>%цzWIK7u spl | CǺ͆=֒<ײPVwFڙl| _ h;CGba3B$rFhYOOxjЬ:M.8;k ۆST%+{V_7Iuj?VV~9}'q,/[{.nMP-~Ҋ*;&~_bu]JPK-b-kR9Dwػت}OS+M'S/ﮄsK4y^rޕ+𿄵úVxSQ佾o"_*]j<Cfvڕ8/!3J l@{E0 ZN}ihǭ -<@ {@N( g4ܣgoɐjE[T^8)$ck\e[+!=/M,mZ+VuI$}} Ҍcyѧ*Kg i>2ظE" %rw$GM^^:\oP.pU^XSk῏ VO mtF5\=G_tƿ|G_4 "mϲ*S5QB]9/Oc} wdGs  Gzb쉮[(C$( ;xjt`ZK_l9~x;otHhW>-5F!H)UC iBi;O~_qk󡹎7#TL@ݓƺ4\iM<ZOi3* I: g&]ZY}Q8ϥzG9OgNn-&PҤ漌3E̬]:dk_3euN GA96C,$I|2U9;WOI:N Ȓ_ӯQ_#NQ&3ʑ曪X5yDȌHR|Dg!TN-㔌|TcY𼚅,2]WʊYЈ rsG|טxf/j=d'$v2+ Q^{./Dkx~PE&),׭9  ldi5\3Cw$@_n'{k{]fz!10*M3X12de +C]U,D-'dg뷶~!Vxnh!rIҠQԣb7""+c8t0Y/,|]O/iOaqwE#F =Ms4MMZ6IQ*p[h':o/HJH^}JB-u/ GX㧩fCmYhu]LGeNEȿ5<Ъ"Qo:Ǹ<9krR}<[@fTPp+_ž @LlC\Kd`9 di"vi. \}>YBhf#7 1\ߌM 8Tyr*UK}{~L[W>IbE );\mm>7pan|n \=+[½?G!σ5!c=qڡddVVRpSl2Y( 2+ =s Po,M^a ,_ʝ"_|/Z-} Ut-ݾ Kcdopt]g mp+U}cH/5%0kFY*&*36RWoYkz3}D s,ק1vB7W#f+I֊HTj]PjZDz~g7:׸6{szc޾Z?!ktHD,@RS pzw_> kw].6&ګ({/~0h^ f;7iUA%θ)QбgJa?Zx^݊fuǘ{oTҴ/SGԬ, j 4KoW>OŞ>ϋA^z [;K$=A0PiӕU(=^? oQDY.Db{Nw޶`:vHd_vcޣg~e4?hDpyjǿdIOj~ Lz4 T[z]K&G9V}vt9⽬Տ} \::V&6zAo?ۚly(dQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@5~4kth ?uu!>& -VxQ9p?1H$ųz}~|}v?hȰI%Sa}NWE+]Vk%$/!ǯ5xoV乸\XxuIhpy*QRy!e)#%v09{W[0N6gZZuP?с#ftCbSƊϟ4L `ǵaiD\>vu{q n>zmM VU) Orێ3Zƶ/dpT(6& eiVs\#67Td #5rŠ_65k2[KGcEZϤ[f`=+OiMs-lKd*O+|4*Mبmjtυ?ϭwVZqv1vpy힦˨ Fn!,p"G* `O#Z|;}At2FծRnKsxTڷM3sr昳 : ^y^8Õ*{jޣ^-YKKBPԮI&I8y+4sYգhʒȭ0 2mHL{I,5g>2Kk@c3hc,Yf$wҀ0)Ph_c5yoVg?ZKR}gRK_2eEvU\+ w,>J;᷆.KmA0ൽ|}õ ]潰eR"h\\pkkXeh֕S++h~țw\C?űҽH4? J Z82ov7_|Y'GH[h΢$8 |o/O9iHQE1Q@?fvڕ5`o^Ml@QE((((((((QPJ @dc>_1jI?¢ѿh?!ofcտկYzpC6QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@5~4kth ??ο 8X}m+xPy0s埵9slo_6h\'ebrsؽ\NmɽKn0Cqxi4]R^KD\3 WHEIgog\m|u&D[Z# sA;Fzzօޭws4:sF㷷$8ڇ8ԫh9##Yk]ƓiZ\څUJ2ޣ=ul!P>g^)7}ź _N;Ү4[ 9BKDiZT݄3[W.wmwc=@`L>2 s^6 jGKe'3-fNF|gsH8VjKO6U15ZtHO?'tf[h-q8bF;T3kxAc^ >:s:NԼK q*#XYF}1[^ӵIl w$@EbϸSSYV^aK^xoKAi[Ʌ \#ZjT.Nֽ_|mY4 NNޙN=QepiXa*{ڳIk[54~X_IqpUe9^k:LV߾2 X8/<:xX_YVo!3Y"oi%޿g^lBOmƌ["#zb'k#1qP|sZ tQ Ӓ>Sڷ,>#_ilF0(`WQyKi;Wa4,9$ 5K-um4k(Js~@kG:Uݡgw1a3Ts[N81]/(o-]&`;1C('a:Da^s#I$.IWnzG5JᎭ1-&/GszwK~rn>vo#+m"= c&F98 SU's\#:v)9>\CgMJ Z[Kr0N9`s8de/OT݆ݧyK_Y8Қ(_0m3\ 9޿bd5/ُ%̪$b_A:.>5CҺO[{ak} fp:"[~|cO\"fXgI( gG^YFdg z$gk$ld:?Vvy[iS`0\es,43HY  QtS>,v/:}^iŵAMNYwpA\|JxՏ%EHq)q4hv1Y^xQpy9 G~YWOj='4>ǏʸqP煍O˘괝BI%iSx.wZiZʾYUMc,}1k+Kɱf!YAߊuOիiwPY!,di~#Hnmէw_Cv/tra# 7ieԒz]n%Sa\n#\wW}=opgd =F@⠴`K!S {8@Ǯ3_1Ztg 6I2[qCONճ.x LVzgɟx h" ]Ьp>/XEƙi| rO$\o*|:ql[oQK˖YVDՙA9*W'Rj~(4nP KyU!'<1#ڼem8g@l<~*jF%o׷ia mm?CCW>msk^V2'`hgH"/~zNuVQ+_$G5~$y"[$WG 0G x{q^b->Kqu>NX,e2Fy]~\t#jm:sy,ZγHG TyCWg-?23Pne]['RޛqƸ/#Hբ_W'%UeQĩP%XZkwr,#f=c <׼cvgzJLl%11!\q CRҤIčbv zqqJ}{;wMH,\nn8=kFɩ^z֯ \f@+2)gpҺ-◅M3IҧQH]H壀1ּgKT)s|gV+xqh^ܚ5.X/Yqk|񿉴+M_N%MmyJ70EqY>K_ <#j4GtYLkd|Q2p*TNvz^ɉ|>-ssm>iۥDzW^?O-lpA+<= '|O}C\uY-x`p8 i]_axE/ ӵ6wEX3l$XTљ~n}k_ğ5~6٧Ki.I~H\~5F⇈V(bA՗WJ$lt,Nd4 w6Ajw$ͫIe]b Ri|It#QO:=z0{ֶfosyv}~9~ogkl>#k>0IHrqcHonqm nYUV6A {Qg9 h4/mcO1{c,# ?=\M3ibQнDdm?.z_...9}e6oeGkq ɄG>*(㯿j?oH𝖵h&56p<I#$ G/t8¿^xG\Z404"XѰ ڻ :m!"@[QFE("`Rndh.}?k5׏Rխ履KhIm'ֽc.d,k F' \}H/khG5ܫ'٣3 fPڄCO&}aΗ|18*qOZiz팮uwnIaVG$l>GωAKn=f970`%8.2+4 jWvQopçܻ h4w!`p6[^ =՛4ϥOlV="Upz)kCq xcHu!GX̄\c^suAٷ7*|ҒG 8h!{iDCM9O歑ұ OޖGJl(QEQEQEQEQEQEQEQEQEQEQEQEө %.\/&5_I%cg\jZy4IMدq.Rэ;Hn(Gu?:_ 9)6KDb?W(+᩷=O̫#osux>#$|݄hY ԍcڷQso,L<tGQ[,wg'D~Qa ?+#' |Yi0?-W_"׊F?vȗ~q|K>񭎳|Dm]>-W2ǟϋmci-ؗ ÌWf(WEs25I/쒯+813mc1|Vݠ18>u~IִX:*˗`f|'{/>u{4s-hv_?'VkF"ON~hrOy_XqQ*7)ZҬ6~m^$5nD,no]O^ E/;[dT{;ƾR ce߬ɭ,_]2wfhc$-aO Mt/,bZc1vz9ivo[S ? ?37o.an|n \=+|G;N:⊹hq$:]֥4k}HPp+!Hhսi}VV723Emc2vndKMSU%ΡδѩAI:uK 2KW҅*ҼaCsJHMthU+l.,c;+IB#vЕMƫu wZ1@9R1SJ(4LgwRwzs[_HݮjW ˡEb<7=O_N3%csywx.Q᭓tx1 r3yK~& 5b/YYGigm ql$289'z^}U5VƟ3MtUkAASG(x}~i6R'皆\۰1qZo!ҳP7w:vb|/Jd)V5)nV<[2G#d!s]4Xp孙Wo8ᆷ [_1Wyf ǷZ5z֕~;w"dguRRD l#ko㷃WlmGH#r?)fPCU)_HF Ɲݎ}=,21**gcԚO.HHHppn쾞P;GcJ 9{rH"Nl[Ek] 1b1ҸNkݴkc.ibC1O eYm ez{-*68+:hA\$1rFN>W8t YxKkbGf*a@>;/vn@wi|~PO9y\ƭV}Txk n~I;3,mkG&jzZ_$b%[H 8CpxLƴp97Iolڌ `:ۙ)k$2.Bp8Vnɨ4=1j'fa_ϮvXsK[u÷-nW?+jESQEQEQEQEQEQEQEQEQEQEQEQES[NOƀ0m{@:o{E o/TuF()QE(`((Q@1EPEPEPEPivo]4߻7~\Gw.>5Һ?\<}a˯klIwz'hV\ؼRYZZ4OYZ6~jNzWxG oNOm'!5,oV@b7ǯ Ķqlh'o髪b'Jf7gϯ 9n m{DK4$ڂj3ěwʰjPߴV<1{__Ԏo5gn'K'j7Z\ tݿ'^%/ycvy}kpqcF]V]L^y ^$glQC_x+'ohWzPM{]D+֟>imP(iiw3Z 䀬dd,]7.OC\;{;m1K"m5KWv)g8m J 1j-mmw&a +Ėroݗnl(B-S"]OT`6.y&X&,.j|ּA obVltg;`Ef; HUYQkAxvs\cvϓoGk/FK{bNͷ̱YtWWuV>Eʞi-1W f4]zdMiI b=Cyk+_ LGk濂@ۿԮ^)M$371i(ǹ|5o/kZRx k~(J#ȿֽl67:&_y־c Z(aZm>DiԟZgRkZuh +li@%IVi $+oh$=ވA-Y͈|5~'b?n>i:@4ٰvL]3Z)7ٯR^DFddpƴ>?^\G~.z#ow1oqA_nIiZ͌:Zl(W?_+Kk;/a'XÜz4}랞_Gmbts[ҹoR7n=rῊ- yn,DJO + yORx;G] J֯t)ǻsLVTa%AtiZ;|Iot +-bD)E$+$ORk'Ǘ4igG$gСh')JJ<H?J5t|9dǙ$HFq 6oZ8OxrkڭnkfTWɯ̩eE88y?^>]i6x2>>r-Aq-~"BW7uLRkGޒ?Dj$_7$WMT`'JtBA&CRfvV,p`= #ҌqsVBԞA0>Z.״_w_W= 7GP4h ( ( ( ( ( ( ( ( ( ( soݛ.?sWF?7_92K9u swrF![|SCwq ,q\~FEd~6׭t"nRͷ 6ؼgP]J`[_ ?i>u->Q ! n#޵ .k~+> \mmkPk>/26/?zwFUDq+:w[V@C=vp6w9\UdfC0NnYrbݱq \1uR1AFI\DA52{ ;#?Ҭ^gq G.qqsXO57Z>[v.ڟ*g[]u]3Mf}k0.&x8a\]f*@:UξZں"x8ꏟ=C x{Q;뷇*g(Mx/k>/Xh>TgKp;q5&'/Ct;OU籭 Cb+ XĭCdoV=cMuN͟ՔqD>u=r[j8BIvˎqM~iZƭ/-Je+/#l澛'$HYkQWne_w;ci.iT9hb1UDk'w^;d0I(c!+/ i6ެ}y<+\FF(y b}^^(b7r%tA1^O<,5)\tWcnr;^spj*ԣy=lU_GH熠l˿5#zlW^}΢~ |^[4+&1]gl_ya})?qbW#׬j\"# :7H5ViN++IDlQr]~#bso^VN6=v>[8!M εt<$~6sK[j[ctMfhϸ>L3(hϸ>L3(hϸ>L3(hϸ>L3(hϸ>L7PIRnu-5~4 +^[|=_t@@Ѣ*((((((((((A5ivo]\fˏԙH%цzWIK7u sp>pmh7yX"E;梮ּ-m}#v]|D񍔗V(X<3JDR͐"AIL<_gPb-ߓ-qˍìh|mgl8˦֚Fme4jj"6KBDž

\d*d#{Aӊ'{u~؛> Mr]: iaἷ^`_o(f6_Y 2[y{"$OBNG{VJxNFqqi5ϗ`̬6 g5|7.U5ژZeA乙S˱mc-wŦ+g,KtY+pHU)4+tK dEr6',32"V!zZo[|-kukZڵKK^LAm]狴kIsiCtLM]6Fҕtz_.­֙4o2k|7qLIN 02\iVrDI&(F2~nM 9xYҍݑ[_m3ʀ~]ZK{UԵ o/i縙Ėb}5Xt;-UK]>mM<|}-uErbϴuh?/ ּW82ײLzAk~7!OD'~՜BA澔ȷ ˠ9 `w&!\^>jFJ+w4i&0&SC]XDTf3-ʪ@N+f(WY瑁O\7&ã܏ʜe:bA/Ĥdw0BD#ׯO𻍦gpEa\R{mo"k<;F3< 岶InUA<脺R>jei%ϕkc<)^o`sy-d29 y84-!!=$=q 5խ6 EY6S׽wZBx!䞙ʛPVHT7hFWXNYUſƗk{Wu(BwrI?&_KPeUR#gi N z q]*=3jhu Gwlp*8Ejۯ =<%}%ό|@֖cbVarwjo uIid^wxZ`VIט7y`ٰzb½◃grXZ "7/Ox{NT_ k\F~#+᯴/ྏk?f}r_???txt^7 O?(O?(B:k?f}׺5OJ?5OJ=дOٿ_G5?ྐྵ/dSҏdSҏt-#o {/K=Ut=Tt Ht^7 O?(Po?(B:k?f}׺5OJ?5OJ=дOٿ_G5?ྐྵ#(0ywJ?fG^7 o% :Q :Qu׺?t'j'j{io5?ྏk?f}r_??TtxGyӧK 4ߊc.""a?eQ킊 w4K lR,}INש??Q \ߑY?(wV}RxȠE??VO#??Տ?E#욖.%X6}k4@J}7EHيu(t>H瑡S|q:P3vx;RAo9ٿG5_m~#u(F񗹖QG{\<}akt×_07JD8V?O[zoMCܴ`==+" o^5>Y=K1Fy"p잕{ӥ!S^MNЯ_qaضZ|X]UjW\:b ߱ڈ":63=PN WfF*[W̺Ou`km~M>dNQnd\{\a|&&I %Ʀ0؈aodqzw{0yu 2AM8t4էPZCҀ=7׽+zt 3>R/as.ծ\J;e:cy$x3^K8ZOox86w~Ƽekh>\Tcڅ3&@ o[sNڐ}ot+x65If59tȥK>Q'#=9o=S,'S-+  ggns^<-\D"98t(|N"16*pL\9u sG#|u= tS ɑRK1=>ͪ7Hɹ&IfĤmt$tʊ*Xh`1S*}zE5{m"|RvBC8=޾Lm;h@͝ı}k?e? ߋ[wUA8ēr S-[\hieLl;ϧoƾwuE"uVz_4}OU>rqwB̀9ֽk×qCl8l&oY^k:qcwb$ 7{V5!k)G<T\梅h(ѵO[&-nDn㜎Á_$xYkjQ?|^2WH n0_Ak0OB08mB>&F36\d:<"](QW??|]uJ3;#ߝ}bdQ@ =pUSJ$f785NmFDE1{[ CLV݌c!y0"lQĺ:&SsDm$nme2E)RWkٚ q$v<x}Yֹ渿_kyBn5&hxWۀr98| g1W>v9Q .R(XC|*㊯,!n/F"|? ._,X2 9o[LK/ E(+Ъdb{v#ӯJ`*'Êҧ^*3hҠ$UI AןxM:+jxX ׬%PЕ H?2W5FwmwSYwͿ@H R>G^u.73zl< DCY%ՠBZjUY&(boSN 1à杜;ZF]m)\cDRj0'vGSMև뎿q׏jP\Of}{[<=*hZyqre6X 8;}G_ mx:FfQg%g^Z%3s4Vt_&G_%XttˍOM|IÈc 7HiO,2{=/rj>Qtx&QHq I1JF`iy|7\Hu5[R5;{{gIMQɧ܈r$zq{=JDW nO'$CK7 ^yE.G|0,uGڞ-sS4^ut@=,JǼ3B\еvӃX=I?;nxIYvOׂMsp[H|OY/=kO(kK][Kmh\~#$W1UREpy+k꺜NpݱsZ@r2qk(JWӺ毬[xc><n/TfI$l٥&1Oƍ!o_-8Qk6dӤ㵏?ZxR=s\RK37@%c|Z| Sķ[EyofaMjCxˬz_&^}ۜפM|+|=WҢ楩.c/’(UT36 kǎwE?ZY,,D A_?x{>I/隭M6{/]-5hٷe'+@"ЃU#4kC˯/*ƒŚ{[HQv;繒##DPK47@\x_EyfZN//3 d(_/98R"kCe:K3dO/?  hV,z%%R$`>^~qw-asm^F|-Eywº:bL +Ԩܥ#$/"tK+|vj-LZwˠxb2ewWˑN>\rkآfFAլK7u spnF[y|d<I.usK=wl*4->h!W+dI&ݬ7?\hkkpnowwtKۀFս5ۻRC[ׂ\H\Lr#0>LK($t]џIj-_΃=ݪ}/×t*5漝o]φ/=5mkto[KrK"? Cwb}a}k- 'hq֐ZCƾ&7u #DPCk4Z,3e"f [^G↳ dWȎOmh+ķ-ٴԓS2o;X0ݷnm{BaY=iE'o)SdHzQFh~ }{?&$UGSjTS ؟S;rC8vONݿT} 2\yQٺ(%7l].+dMq5'L^Cuz@pvH\{?|jM⽴1+n/k޿u^\@YeBC.N[HPt ;w3bF V,&\Ei\zE-ş]-/&eU^ܦ`Z\BaF5W[k6 K8|1*uyS>Ku2 a鎃\K0ReSt?ҹMz^d\ xkUokˋ U4+I$$deT=m~hOm-;pUeO^_2-Xy~k9$m_⡮xtxd:R3 ፟pVq-_n?tP\yxVzo$ic:[jش/XiZۤ }*K25TՔ"ׇtI<? j]MmqJ(&2$Xcaǥz72ιmn2* ʹs\u;y5M>6wgrOA.u( _Mu XM" C K1fI>6a 4aZ/|;np:m?POFuxSO$##mՑg>TQ+T6hsȀѬ\&q+l$o?;q-/"^\q{mXM͔l1`A#玠UPڮ5?j)imዎ/!ڣ{dW`|>=7Wr $Pv0v&s2sk(?ʤ>/7×IimķV_YA]Zb)AS YO=O}.KFVP.Yh0Q&fMݏג7)6gh+'Q|y3wj9׵m']d H6nfª_#gayEފt'H[xND2VfO ]XHrA`XӭAmiec=O@cIhZlwAw2@dPt$df7m6Cݥ垫ee&~et,t=׮m$GVϻ(Z;_O\xW<'۩g=,0Q#$f&W̑Bw3Sx[KjՏLi‚'G@ T1+΃iƔhTщMeo @ph4Vv q;ӽlplv_I(X#蚟ovMH]]^SS85Ce 7PQJ$>P1Y|1'|9}Y|s-\&RUt^g<4`| <Gqjwב3)pe#ӊY>to^:l?m53@bHIb`ZPG34`}poohֵZOƖ>t82VG[x.w6:ˮm # KnUF+,>ƦHMBz Ԧk&H"p RdQ@ E&ERdQ@ E&ERdQ@ E&E<MBA#$Hv񫏂ۼY:}BNӭLUYV9RUpvr4 8 5I[f'r31@^>^o*錍8eyc|wepA%igum{*jRrjMZ4.Z Ci´_?l+dx&w^i=,u]*T6etdFP1Ն1m7u Liwg;ܣux yh|C{G]]uI9mൎĠfv,ǓJ}F*ZENGq5y~E'_\<{akt^]rF]+bO+_Ig|Clntڭbk gL*VE{<| l&eye_V3%xhp0A5'KxYcҮ^xbwX8C;sQ|>$k :_֯nX/̭|[ӵ|J)w~V<"º]\|bq Eom^j3Ov1ؐhRaH:u=9G 433܅$7Yv%@?B+u ͦˬ1] (-RNq^67̆&VO0G5K.-_Z]krP>IA=jFc˚\cѮu#kGmcurDqw0xc88,X?S_":ο\8ilUeG`; ~{I$8uCY;}^:b9ƼEERz4j*OGa-Káf{ۼǕ?U>$x?A'G e=RiʀUn1?4 :M'Ri%wn q`F9+ɡg; X}OZMÙ.n$g%vHl3YH㓵#\>={῎!|Kͥ]ƥ˂XeXr:?SrFVR$XW EcN7NY,=*o]Y΃N"/ZKI`kOFٛsMR|A;ш95(|[K(YCkTA!ԤO683#ּ:tZTLμ9Gw_]B_H9P~'1?ҽX5X=Zqu~u]',qۚ+7Pn/xkfFz~ujVKgs?.<7jQv)@ W>3`|Uy`C12M)S@־oG:JIWEu[KE8̠.X#kTq> ?itGDcH~3^g0LAr|hs@ zgvꄱK6cvߴvWz[HUΌ7nP>*q3~8x5,p\ \YQ&duMʪ l<#m݋1խX9$ֻϊ8쵈x`ahu?!g&xb7YխWr8Ex^R{SSߛPzT%e'*723Y܇lf*l 0)lf*l 0(yr6G6ٿ 6T`P;&(*l 0(m(vQo!7AFٿ  lf*l 0(m(vQo!7AG/AS`Q@lMFCo6ɿ <  lf*l 0(m(vQo!7AFٿ  lf*l 0(m(vQo!(?R0u\όe'Duf*g$q %EtzfOטx 3Eִ2}^_+L 1^IpG!$ n)Cn7.$^MݯVF> g ?;FdRmAU< #A#  _xuk;O -վőVQFK`T O@K{-<}j6^5yu HkkkyDq)$ ,fxIZwEI?{S}~7x×_07J>7o.an؃ -<%;M.o5+{=yn:ʌ8]v~ԎԩF+ >W+-B]G @La#kܹW?^_}-)f=J+QfƍzMREҦӠ mX+4yۚᾹ{74i#V}eq;4lXڀ<}Cu嗅5u|'iZ͜1M "s 6k!N 7c]g5}g%fMiR'.~N&G\K{P^jr ̖!+4?uU6m=Ex8r(/%xbxQ:g=ͤk7u2UǾ g5]R?!-5cG x!q -HɛYdmv|ɒ<9a[Z~ПI_[cnJ\";y _g:j=! 6g+iríޚUoZs]E-/ x4>+Y!Ҵ>=3(]Ixr3)f'יvmޛ0?q7ʾ_#$xO/Y6VVRL(~aaW?H322TAmln-; 2)@a ]./6Ws< {WtL٫F>FF<1Ǯ skž"#F`!hvCBT=6Z\ZMKpN2+ʼ[I55irI*1:̌$eB Z}ٸ""[kG#.~skξn[.A?{% G/o9+#U4J+׫x_Tl`7;W[ w~e8^ m̨A㿅/oɡk(d su>0+oZ6|@^!]CECap<=bA9y|@ŭij̖&B K'^ 4Ky>ʿTe!9juY-۲ʨ}iQW0\$m`kjqRvpq \xӺ4?h'6-/l DÏƾ&-te(H9{_5|p`d(NB?xϐXVe6w;Tp{vd+XeBdm#on.mUe& ŒIu;{qᏊzPn= ʾ?>عϳOzsò)WkԞ:ڼKڨA䜶z|_#HPg_)Ӗ>'\K+$j8|S?i3C搸hDw9F {'š쓈#YA*G>HN<TU Cq%kBiSvrp1 ~NVgԍ{Oh.:Xwk/`ǫ[Jd޽ϥ[c_AnA$G;sq=> R߇+jH͹srb5>e wG&R?iĹ,r@wQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE5_yǝTt [#MY5?]m6dUi),ԕ_#5ui4wm4KvPR!e_I,5FLKA#d_66^gڷ¿k _[_6K4wIex&F3ubz /ۃ^̻nMg| \ēYmVIYTl?^'Ɵx?QSK]kM*y>Hl 1<ߋL2iKV =B+;88+{߇u?(BdT =vH_b:{߯O3+f֬rEs5̣c8U sNNJ?56o.ir|mg߻~sQb袊((Q@ HzQE6(ZJ(8X$5to wX5i~k,Q4QV{,XSV be(&}y۫s_|{u \Es}sq ̣ VvGg ;|]'#PƲ27p}y =S'+,n&ӟj!53$P+# _v.B$3` F>(X}(>n}~x]?*(sf=Èp~9_|W/gQoo$ú%-I8WYiI#țf$W8c|5=4;RfD>TȾlEp{OFi.fx1ffԓ4@ <[InAǵWbtt_} - D1q~Xc>x_SEԵ+ؖys]"W/OZ(Z_IzꖐhM:;mȶ# vqux\tVFBWgc?7`. k+oJeOEp=GbTmTv#ד֏xi"G$FPZ6! Q^n3gncWLh}~0x[5ZGV]j(}z?ŞS۽/Λw*=,R?ʽYXE[ď6|D{f-1uwF _Ef16pW;ohz{ ?>6|DtM"KP.jog"{d^r4Ю0IHUah'g&,|g>g6御,m[lV?GW7pwEWMyC|TT3+5%z_7F.q7Q,s}f噇%hu>:;Q ݀_Mǟ Quoj"P"VLy!LHŠ+#L+4f+ њ(4f(3Fh њ(4f(3Fh њ(4f(3Fh њ(4f(Q@Q@Q@Q@W]KB̒OHǫ3'_| ?L (B?fotocx/images/warp-linear2.jpg0000664000175000017500000024135215247006660015311 0ustar micomicoJFIFFExifMM*JR(iZ0232fotocx-26.8: paste area|fotocx-26.8: Crop: width:1000 height:399|fotocx-26.8: Crop: width:904 height:398|fotocx-26.8: paste area|fotocx-26.8: Rescale: width:600 height:264| chttp://ns.adobe.com/xap/1.0/ 1 2 3 0 8 398 904 1 2 2 C     C   X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?٤C4`^Oc kJL *Nyq ^ǯ5' 2mmN9PAnA3k~"Ӭ4FM:-#IoeO]nNɜ(t|:hU=C~@#n:/RK8%y5[ER˰Hx+>"U,#M`2\ʰ$0afmf"(|I=ORBr7L{5((t_~2b ÷PL,/Lw< c_WQ.䴶7mUMr< GCR'5ciM]`ew(]u"d+v?SwLap2G'(:&2us9xHeH:i?JAHkw׼W,D?dXrb%f6=ܗRMO=!>eZmgXH~ڣgӯ~~FԨ1H}=3v+>#GO'*)c%q+q|E֠O[ l t\!D`lM͍ۯEXgsZ@FlwŴޤu[HykcB>SpArww? ڹֲcQ9tcqI\p2Ztx N_rZv/tt>[|Hp^I\Btb#hTW~?:x.NX\wӖw˱GtI]enn1: xCXv Y#g3\ψ&hI2XHnqs6,[4WY]}6 pN1=sV7Zv;i}UxpێW#ߦ*rMp?\":Y#j uF:pH uƸXNգp{.2~3oJ~&thmo D[E׫ 㿥\c.M%©97ړlG꽽Jl]D=B/,62?'_B#.SƲľr#<}*1wxo$ڋhcn\-Nu-M" 5kwky JDd ` |(Rll'8?Q]ǧ%te$D z-;_M5!i; H=>f˱w&RK Ba|ddgP t{vn=˨r;_8_\h u#g}H"6ۖc "tUZԞE uG}}nq,/)iFrA Y tMr$m?0P9<ǧxS:,%:3O0/%s^o4>wdy(LU'n[dxSB9\S`[Yn!|{193?4G W7<٪Qp_M=ORD; Nu̇}~.PGg)'zu 2d`[90}:Rǥ5˷1z6^g&\xtwƷ+,Go@<=I*|"}źBU&ʼz^ecoQҪZ[\#f-AHgi5j1y4_RkL\]kkXppFA~ ZuxZ-~|;y98`m9*{>{{gxi$($%VRu&SN?yu=Rs̜ڙ'a:?DUdXFv˒DD9+V8V`Ơ'qdR~c)wƠҌi6p3]H).zVv_/ga,2^69N}j~z4S/Ʒv\y? eׁ޽>y#-F#tH?'ZO%2P `!=b\w_jNR,ǒ~϶O#,cm.cD\IR0 [oپi!nAYR@ g+ӯF3Z>Sy;=SZi$I, FmU뜒ij)g8-`Hdn1"u q=?g[.sy(+;fnry%?+6Ѥ% ؟t 4 !]hFNH*ZVGA5],xRw1:`6ޙ'{/)C[!21Vko @{׶15KpYWqMP{ QD<1~b7 1茧biG=ݤ1Yy- mg+gqY 3Pf &ٴ ϱ+Gpan@_/SO^EV6 J,k(YXqDe-c"ul ıJj&o&0@'ae.K/V 'y\~P$q_F,b[Яo.LdyINp;\svfxp4nYNmm0NHO7Ke]C?mrڴl nIqP|xR8`H<,OtVYфka%7PtcYϥtOfE\[L$1HonЧ+hges$|4 /-խRͻ䑜q>"%cNG.a?üN=1qr;\h@#o$~K(vw?kSƾ6֭5jBek ,CA,8#n)֜dk|C}eV[B AMk]FšJ l 5&druۥ«G dfcn/l ābL&pN[ p;㨭Bfq$^wm03N[;mɿ"yj+k/[%׆Rd­9lsw5joɥcĚh-YeTK"E p c'w#SN.|YWBY"$`FO"nuƲg-m4m(%U=# z^Kur)~4$t vQxU者tx?P̓IX*^!/o6}jm;w7y-\=v?{/<=sek6 C )WpW w.gvt\WľֳI&Kiq-2†9#ݜcHSfeh_Ƕ6dc#q)𖫣hz.bAxJz}{Ѽeh{y̷CO8b3 bͤ=CzW0A6ڣ8|2T)W{%jsВL;p$`):\z>ǧAjDG ~qo|Uab)x,\c rxOOzOZM,ŶjVld2ǟԇASԧFӯ$i^cxE<y x#l7}*=GN`O|e8 dHiJ#t߉z5dt$deztVt {]I4w3ilE_.L2t㷦votzil6Y^yn`Aqѻ5p$H{N2bH8=1E=OxZ8Vڴ2ɷ#cׯJ|Gҵ[IǛ\$#AH9#I8^q|EִmF{K+ԼQ-)x1 8$J-ttKh}w>>l#s։a0ߊ+C#Wuau't-b+ϓTָ|4ՓC u&C{S)yYzKAK J8+hU!S#;OE88G+em^<\k+3Rb*X 7)$xYYUPr8O@|π5DRg;}mJ;Mb?l}FlʽL.G2 7 1g Dvzs*y8ھ&&A$M{sy>oFe$p^A#Zy2~('1ONSj1|,c~AYu]¾u̒9]9jxVf u"-7`^ WͤZdX68*T2Ʈf8#QG*'kt}KTs3,W(!p W'5F)ە cwVMBeG@G0zp:c9b+kKY |2;pd.ߵm̡С5c?uWZ3E;2Lⰵ }XSlUL,|={fmYO c18 @~x@뷳<3\p:ڼ[YhbR5@ ItHyϥr%񿊬5}6r Nj<`%֮-cw2O|{c|.xPN\`, Hےr0;g5>h>zAb},4g[-s]{iV g:ckS/kZki@ !N1\}3Ûvz##&Z]b@XXrqYKM'x>y?:vyntb /W4v*H+߀c2\Uo:GkƩl^6 *>Ppdqx'n/, zv#*sjZm=E&Q@мU=uu?k7z!툓LS#{SE ٓon*CÞ/ӼCew]$iH+7oN[ςŗVZf֞ ,u)Y?~ןSQ;/cJ\8|>~"xQRY|"qq^ƾ𵮱$~n1ꩫܠeSZ^/U=mm Wh5?wqQrNI>g{ =>;9^_q I$3"~+rT/u>~mbv5TmL%e&r3gyxkUk=Q.'H};> [awXwpD!BpaxKsgyJ :"=;R)F膧ubx^v 58v2_қaI%ΠoJip3ik'N{^>IJZbUR ϸn6uCs;]a>)ӢoNu44k]Ao981ێI\tGc]cEcOk>nڐH0jxU#y9%rL4&neA`S#έ垽FKawpY$$/Pq5(.R+ַFồU)oAu5[Jty[bT)[iL:vblzo²Mc<5mbc1o!#jv OoZK~>db'hէ"sI$u3_|B͕YP*rA #*X\pLDŽ2nheG~\^ vns$選sJ&eNh\HLAB<`z?Xjk'o8ss.pWnZN#&(;}*]΅wq:Qers[# AW-N՚"VP;p[*(*I8^ְ ԕփu 'G飚b6CLey"`*2^r=j碌zlt3Iq{`tG¹< b]ID1";8?nұ IsϗO Z\kYe$LŸ@ۘuh> qe5S&̲cb;rT;#Ylj\_Fx!/$X A\=F8goL_ Xd\Ll`[i_zKFa{]Z}C̛ YD@zkMWvFV;[sM Nfc99rIm :? *I}XRyFJpHOlVZ\l4+aI ۂFHgݧo4g% +Kzm{ķ'K~R,\1~d/^O0 ˹[үgsJ FY3oS{UgGD=OⵝK+0pi@kGSK)<;m,1cɐs߸שqp[\˾ѵk]R𾲚͘e .ccA*k@*pJ䌑\zW?x7n%kkyhYhAVy8⻴Ӽ?4_o6qU tzTs)(^Jr\dFxmQҼYb$*Hr@SG5~`ڤI7A=kvgL} 2K AZ#cާxq8F7L1 *&kiwi@rU-Ԝ aX -4MMOX!n5kɵ`clc/&9Ll %J:$9 =.v %3 Nf <m@iFdsI!x#u8}DzF'q[ »쪟w\94 qb*οg }}{ ’7Pϵ9kacW m,aHv.@7:n/|ńrٲJH'%p W=Dn!r1ǥtU$Eq%ɶ텑~P< t~[W)^n۲0: 5higXxطn8#z5ХosjmNl'{VWcx5.=Ms-UV?x+="Ҵ䶊 {v{pvaI+u$n96[_u{{+tRe}duW:<sn% 8<s׸`Hn!P$@X᱃> xOnV_' cc:5:I=8]I&;? ºK_+|{YVBClX;.pqQ޹_izO- .; bL# Y2āp:$^IAssxY&$BbPr"Aq9n#JtJSձx/]{%ѷ2V6جZ27c_Ox/Fċ: e~HC'}{ޭ9kZa[4iBUp\QGY[%$®ŐCt= dy߉~(xoPZSQY;\c}Y_[yDw6嶜evn`{851e4r4+TKH) 'I^ 8ۻwsI3H0|ʲush/qcuQ˗!+W j'BZ3iBݖ2(`C`s#Guc-Wv>kB0Ukua}] ZےV9t#s]O[x>1Ho+pGɵ+cxZTJoFR_%` X#pH$'8*ƩbU۬fsm S8$/j+Ҧ9֦w2dLsH=Ϸ?쿈 KFlnX b%$`zW?̌UhrqxLx'34}tX-13kϋnдf>"ӣEC x7]ŏ Ҹ-CIrA8G;GdynRrgߋ~"I& Kd dq`giO|V1|i> ӆmVf$,CʵbPs6 OZye0Ҝ#dK^#mdxg@(#ݸ/02z0m-CQYEmr`15(<3" 6دc[/Nݎ<:qz΃^!MnyKo$3׭tdIswbrOp[v*lCq9=z tpC;iK;)q軏OL \ԄUυ-D7Q2\u=td>-|ۙj2?USិ=OŬ XH'ؑq޴o&;_&228=igo2uc̏ eىUq>֯&a ej R95;5יmUKwgX),6-pr8X;}*w}8Զ Cǧi7syEl 2N}94D4exflan@z95v- X½Ax=Ѐq,'qۭO}{Y5M\3$ w'sGFrT׽#?} COa ###ֽK;yyw\TG~b~sS[𥧍|I9ooZJɺ r$Les4oa~בIj6PO`<| zMQ˪={[s1 Ӷ׎P2A 1^} St %,Y^cw#ʐ98c޿eeō1eVw輰[ZOj^Uv@R8+&)=nycUiq\a^~]ͩO;\u68U |#n*Q`J-7ɳ/,ȡޜcw8;OpٮO՞ w/e2*n䚇N+WG9>xLVo,Lٺw :cִ6=&Mjp$7d*_bҍBP+/(5`d<l'y~si#m!b1\h;\ ~ 6 g=b/1Jp M{OnZսCo}(,g+v^HqV>|ZyY.VyʀӴeEoP2TF0>Rʪ:I1@E)JBrָ7(v*v0йwy|kn% WϘJs<3+'g{w)(\d2z06?4*uJ;tRv4X0Hr1jl͞=r"\G?wé>UI?&+MΟ,<$Pś.a|{;ghr®q08P=H^d|4~qLK ׷xMa9HOiuy"Cy $ڻ]稵HyuB.7]Ni/ !N}_A48$sW KcpM%vްB1{zG`Ev"38C FӶz#Q)t3{b-F/)F!Bps: sĺӼp@˹ػYwtfo~:M$٦ ]p@8+~/.IzT\۞y{ם*j{E&"az=ퟗW|0 \xXRO#1BHё@s|&dnOaK=uҜ|8q=|Y&tYۙ y"6 'ס[m{,旬kf罆tYlA>V!\>oV9'aA :p2:*ojQw$02)wĠ`3Zfz~]_W$ qy~EC\5^FծU_Ť]ү;ͺUaÿ8Z:%xo'{t:V=#q8Kojqi+c,Tx9޺kND5 Z\F[>v8BG]J"g=[ᜒkM?0*Ii3F>y2t#>dDɷڪJeWc5g}[ŚAҼ7G).L*P~ohݧiy,:ôm#FPPgh8qNr]j5+]<k·K'G0V,(1L3rN3kƞZTztjx-)R`x %Hq5kq)S3bY]̻@kaP+'g〾֫df,H [Al=3DiK:G1q!Q2TyE[ĭlV+ /w<3!v㊏H:}RFf-rlmI!3nr'yoh~776Z'Xn6ΈP3uV"-I+ iTm2v9 w ׌dur\n㜃^oIiC{cwuj6;,8H!'Mu]/T1Cv;Flx;~X򫭈3;㨗vm=k0ʀ+O}cᎰ\Ơ^牟d/ dQQ{T4La,'~_s^=-d[pL$xF8 FUcexWZ^t_<<ۄX8zύӔnrx¿QG)s/oas]: ZQ#T`#OM,|TE+4b|gq%c۟zOFwK$Bc=A.-m8~8ng nxR毠\i\=- 跑T*Fr39\b|0o 2A w>nqې{b[e[yJuA|}*WEecԪ ; 09'd7" 1bDchm s8N}gM1˴mA>)oX DW1-{ὼ6$v~dt^G>7kOO|R+tզJWz;we[.a4& Ng<>l sƕ|Oķ Lsq6>!P~fHoT50b*+Rzվ|*V$iN1uj^?ͥϡhG0q*ӂ| '}ْU2韨t”i8QУvgŊ-> , $70pRyҭ]*a&a^ U8 ri2NLsITrkyt䳷m[7-ܖ9Hr3*Rtw\GwNQq I, mܪpH,OE?c׊oU͎&22 %s?7Ӱ5kw"EŻjvtq^ 8Cu%p;c4.Wz}F?DӜ Ǘ`a9T][Jh'xe rF#ei$,{L^ $ߧ~N+>"k^ ](Xcgjq^B0x=lpMhfp:׈FaP6$p9b)>+)$Aٜ ?F&ԭΥ"z|ӯ־&Y2iv?1R8TF8Aߡ_|7I.a` rʼw={ i]fqo/%USqQ`5/mmqeF8 9ڴ~$E!*>󴠎J(!=iR .̉<ǕGO\qRj^Y1┄nCn䏾'9S6+1, Y–˞lwt5o.eWe7yFs߿WD|Zsc7 /N1pI ;Z-烿Eǁut7';v՝, o"jX*ddd_M񿇯nl(}y\0=Jç#|5ԇˉ`]u0''md(W۰bLD'xOnpr${V2;nRGA~F5zl$OӾ3G ŴJD9"6i#\.OV.Byokcm+[GNݢY+$O8޾nDφ`m4A%1|A]{s W/qo8ʰ}sOVc=9Lg?'LB#翉zT2xn$1I,Ư+pzWxCxiާ0$zsƪ.<mX±^_ry8?U#i k+4I}j|sf@|eeq`W[JViVySK_4 gP:ϱSvVc/N5 |1ž ,S՗W8xz무'%:n͈(zRO WuɗA8XJNƴ('ksGzOOsGq=ͨ$BG635x4\ɨsʖ?&AON1M&úmWt.C9nn:֙׾[@ewZJSp]=kme+(UTq<\E[æ@<ē8~o`;g^dq!jp[ɽ~"!"rգz֭kYt(!ɂ.۫mض_ .ӕns^'ˡtZ *- gݖ'ןƴq럆WH|Mˀ~T)ӿSʔU>˦_%ɧ]XI]B|{aQںC|;$Zx|6J drm~ [:P>FV|c,HǠhsn~T^s^YGS?D<=(, ``3\<>QIey\ݏ9a%J>e:>'xB$ֶjŢ4;|89|g&/=XEcqN rDE?OѾ Q [@1, PdMn6= @4e,xsx¦ᾦ1O"-"ۉ2=h|im@ӮxXmn7 ! SVN5_;_6RD` ׺lu+뛛3:&"/p?xn᮵oe}.cM(+d %?'{x D ש]JI4s^ǬؙBƍ![#G|b;8xmcS`\B602>oz~Q-Bge8Kv08 @~0/ =VNaIf𑛻)!w 'o+:q(u>TMi[BIn/Dv[gWǾ$Ҿ#XJŹ";W'6@БZ C{ ǠR4h#an]_|!mw72 Пeq=ޑ_7ʖ ɒ'#۹9t uJkJ WtdoLmn In =;sE7h|7!=ǧd3=rW<Rq2ҘdeX#B㞃^)AiS|7mo$8!r؜u^qr=lBĀlA;^I"⯇Ld!*#^D5ea慢9}?٫JG$wǁtj3YnV̢) q׆<$$9OBe$sV> lW,EwcIcQ57t5 h:\aMZ+Jy*̤p2M! jz8|;~"rڍNIY^4&^k ?? kM#MZIlٜ XzwoA^x+ۇMU3Uz^J<7eNc%cK}1^xGQY$[Pĉq:c#I^v&h%]?PA "B 2+BH>tH--ER(Bi9**&S2$.q\wRxKgbm\͖w@Oo5|֒(F>1-g3局 { @gtvf`>#*+ ] 8NL !g>n*MN:8eh3PuѴ4@A4IczsWcf,e C|soa1PNA">$"HVI@$ddrvm9>PlEcdGDP6AcV#w3;^N[gE[.{H$ȩ%y w#=&9$,/Ċԏ{d#p9$y%]5(@9]9yK%I UUnO<ܜ.^e_RkޕiwMgy—qBoHD7j _JBw 8pwC6ǣ tl1 1a2 FU 'Wk/ut- jaoh\V'p3ȶ9dٔ~,ڼ%ū\͜]ʹc:zv<[ P01I5SRm$M9jDiĩF+1%ss^J4+@ J`:sqߑٞk68|!.#CEu,W3E XBV5m>1 lpNF>`o\Vh|n{&T̎Jҭ|B״^+Apdlr8ְzɤuAjy:eE$ }>脌v9rO_Jomi}P.H5xN0Ε/#Rf# [bř8PrOéxzI$o`y[OS"o[iܭ{]Le'mn,aY_$k43Y!~xg?n~5J*(ƒv8U {ΙMNٕv.q<pjuK+C^GɅ?G<*4IbW\OOS]/+'0lA]8oyW<$[TK9^1|s fv54gh- R匛{+jmk4@H.GpA DHuUW$q*Ē}q %7 4Ik:(!R3sБJ|5:MhTό"NzW~ұ#r$!QX {~eab)l=@uCZ݅EGitkj+ǧSǭz_wŏ6rPvN8Wx6O|e%HBFvaaס~=G<6Y3 gkY6&?3Oܛ ĪWtu<jFF냀mte~]еY>Q`$$ wZr4"_@B$ ⵖ'$ug%fᆸV)j ,Y֟l|*K4N~}RK:}/ %thM}Mǘy]&ǯ9;SDaJ-ц *Vvrsڼhf)m$DR$˖k6*A&9(+ܐ9ʾ\𞫭V:Eeuv@1 ܑu<*T]T*ƊҲ6[M6ԙq 6u@c:wn]$-cTgiz`mCp['r+cZ_ jyEX0m۝uI?EkGд8m; no99>)kYַܵK{|Zfg,qiTF0=?"%NTךow^,&||u9tI`Yg<]?z<9m!6ld;upѦ KMX;q^gjm#u?SmO-մ֦(̑\9|mD𙲰=WP=!$}{+JF{3b[\?h=pWׇV?'岧ڝXc{q^mj$x&bRJ(Oo^6:׎|i-/-wkm*F'p[pfBzZƔ:-{2if!bnu⹿ŵ-͔9 W; 2z>,<,g^E7wi(y|NzISmv|8$KqFȪƬI-y~EΟ Y +șN`/̭4\-?Dg1)19zu5v~y<#:{cT~.ϋ<;]‰%l P=;wUX9oƕ.%!Ye28NsZ.NNICa, y1zd^[ʒNp\EB `4|;Z"W:0k!ߐHC:%ԱkW#b窼maֻTt9&U䰶i-R1p$ I1K6hfV>ļxo-"&AG$>$.i7#$F7i%(!?|Ь\ߎ}y^>&1LŮdI2o;'3[SY^[A8м13+:YZ&xkR Ą`d)~*h51[KhTU`g<x_v7^:}9J>z=WA׼Kk];YRg ˖{V]ʦJܦB &+7wZ/Z~R[E+ksbJOr9gt 5_Gs ?RͥZmGǚqI8Z%-'[ՒKM$9uA\9* r_ 51SI" ~zvĺ̺g5۫g{h$"!B7pw1?dxGHIJKy _/;NL+ >&,\xdv\gdx=dUsG^^0~4M+{YdD gFq1'1)zI kɟQn9IdRvx2@ ǥy֑Y|]K@-6lc<#K8P퓁׊RbB_>kW7]\w#I$ǹ gFTF^\ 3OUmΎH!I99}2jF=+ I :0e#=22iB?e'կQ7Z劜@3Z-񝽍Y-cRAM:zf)_3źh[@'v1Zwtυ?|KA\A(ZFc 18̎sϠ]nF-"5! {_y2xoqX6xUY.Yb1Ȏ&zt'ڤ%ǚדGwaLm,ܳ˾vO^k \ /R9kJS*ؓNL]>Yl(˯8Wߠcn2%GlaNU<: ҩ^gNКx!{٤Lr*pqeGNޜqY6,-=>z5Kuԭ  H;Aֺ9[I;ڼ-~[0*s@=r0j^Kx}ݮ䅭̳oX08 9'kIm-aa<(sҼU~#j6,v9t>S#yv#wOm m-rzvFռSiv}ek$"8%`0U۶nL+@R9'c> zsjiso- nH]AhW n D\Z@&-:GZt֎&qs"]KH< Cw Hύ4Qi15H[8`q֝"YY^)B@Hqr m3f)f'onNN;ZZ~:ll-̌Ko냝רV|GOyY-ش2[SyR? #t3Bb,hwāb)|-x$]SXIǃ:]*rU"" ?KHnmSAƒHH2w~xK{zsS{y$H{sֽž{F2?Y&X&1ʲCsl:\n 3ѳ!ى)ʟLg>Aoa u;pb?d(c>#zab=Ӣ2 >x⼖:$1jPY #$zrkK[3J66.y<[cYW?x,R]f-eKԀDCng]㋸|Xoomus 2!1jgkuԴ̠SR3xUh4 Þ)"@ΗNMz?/@Mخ~ɫ܉.XRğݞCqE/ǻ;8gẄLц:a⊿C .}٠ <cWQ3;?E1qgː8cּkFy8B9(eq٧]fՔp0=+%^w:#8/_-OƸU)Ǎ$䁇]+2ڈUwvpsjnS͡J񨙆Tc$ 4xSž8][b7+ۙ$\)`sRMUr'KuqNyοfG/i.Q鑞O NѬŨind16QNs/2OAhUrLXU補Ը5&H<_w_hC-@0t$z܎}+_[ErJy I)3+0nw?' 'QMuX 86` f5,Zt:2iix.-%C9=WʕN{§-7ʶ+m @_O" {crRj7ݍ< dN;GH 𴉲YdE©rI .~cs>8A8Eə[m,9^ryb(:vhic>@?zL>^-ϨFQ[FHÖH+u^Þ~4Z\wPi9x|\q]׃<]g/P#4GXjJ}u|ԕG5e6K:׵&#Z6BL vǽUx895o ?,XjR"PubLYtM3WI*Oj+b"lnĺ~g[9@0Nzsڪ$R9yn.eV}6o I׀>٪u A,m2ox h`k{y-qW! ޏlFuRk&)ALng;N zk+slKkE7FDE Y$^^:c֧4M.U ʖF4Oy +SAge3qk]SZ_d]1 qׁ+[_ilWw:*Jc˶7|;kٮ7(xG<\@=qq_9j0mpp܈!F c#q㢜dY EYx;H# crK4M6aiF v2ORN{c\%}]o%݉9|'h>-}T E"+%,HA\qյv%{AO1֬f7m,ExnN |[:`Zfn1 a9mtta}(ܸPevkiqo#M]仰큜gןZKWvW_PaVo 4lK Sǿ4. ?zfl~띸$|;׮U.yKuDyrI8jεb3}L$'v;q~j=*i_-$T~yx';G_&H'z?r.~=%fWaq+yֽ5RxU兓]cM*3+z~Ʋ9|m^觛vi6nj3gW ^55ITdM܎sۚg>_Fjq*Tqa~تB(]V6 maT 6;|PRr[9sќoCz17=`d;^^Wbb6~O9P2{Ect$S]ٯ\GqWO{rwy]rdz'YYem:'mn}ZIT\=AFsx_]RFi5 Q]`F,.@v Ă .TaO3&Y|R'Y2 1 )&˖hr>Ꮖ^Huկ f!nHN0#5iw:}qh61U + Ia9_Ӿ*GC 0KLL:}*wMzբA5±X|è1cRnDjr# !P场`Mw_;IcO\.|âRs'8&$=LP +,sN=}~sq?*~T˿ 5]:[%TVn] pk|9_ZQc?/ԑ]Ũ_2%=@Dלp~5#ExlgjLW`ӽW5oj/FKir}įΪ5B/>[grs$ݣol`yd\v*Q?CN>ڙk_!ԵPG3As!06@^+n׺«J nG^t`ZE7fɜF$v9ƅ_ 'AQs>ע޵so%IBPER=jo[Km(LVtK" 30<x'Gӣ_L#Hgs ǡryjм$|I:)c.eSc\il!Nov1~ |KA %@k6AohZl%+;WRe3`7.O:hΔfg7e$gq\rmweϟ]&YKu]~s? 1gmiqpƼ,:>~#zw9JjKOXG_컽>6=+7ŷ㵔F8iʊ8ǯl~w4"&sp<q *72|֛Y."RC~WU)27S{j*JT+KI> @IGEq^UWƐhE뵘I|׌mǷv2ɩZHcb`cU , N}3M5HN?6'"0o^L-)jzW5!۩dѭSY' г i!@3G &$ 'rsXƣeSjYg*q]/-'u"k`j'vAu#t<3Z7IJwc|eURȺJ#~rp$1k*/7.V^Y1N4g`0?_YiZ_tY#iU@FC|ZUwٙ̈bKi~Rg r/$I5'4ܯi[kA{-mY:4!#}Tߩk؛oKWŬV9| -XCl\[|qvz ³E-XYolvk)v>^ 9Z&[kgE 0"9U$F 01TlM_]ywUv$pn~O9ⰵVܒ6h. +)8"s9GV?|'otOj[ I{ d1Cr0Eq6Τ4o h8e)^y^4Ne @p ^/4/hWX"f x`8ưEMktlf`@ hdy& z;r9]^ؠe2CDǬьsޝ'MSwrMp3ӱU[E[̊2qǪv)NxiZ_cZ:5Oi6@겂:\e2>64'ߩ^R,0pfV9!ѵM_$.; k}J"ѹ.aY/d( 'jG3˨fE_x;c ŶESGldnCG~iq,O_Fps3/Πp3+vLZ0Hb&$b ^7n3joZy$D.cpA’=` rc;dngt! >8ZnY;Ƶֵ 67|F#gXa<ebFL턮Ҙ#UeLܗTAӮ-G\jv %!¶2^q-R4ҤHm=fDYqaXw4:kȭǻ_\o vx:pk "5wl76%đx;Iq9rN5i'F -z-aWp:&X|A-֟23y~tȻ0IA<'Q^ XJ9MiegfPHnH=zܿ Yx.ݕoXl!|* ٺqp_ u->%"M9$]#$`qY6%F-f|7͹{K߱!qpHsݾx[\sqN(}8{ħVªxǧPxj{tӡՐ6E*  #$pOW,4cLќ67gq8玼>&}mn.nݤcEY u큎`WûI 'Mu^b%z9rҤ:'QS*xGWV.49+%ڎ?,^N:u?`G}բ)!HlB# r+~'|dq\0is|Ӝ{`W[ܤ߲Dllac'vYI=:z9yRH73u=+vvw m&`X32 *āb5"5UU!v>gQӧJ<>::ʉĖqH@7uq]}!t_ q2Xr{ON!$#$%hSێ2A8۞z|{d_RVV5n!rsA\yGgÓ>m\|Cx߅1xxfia"r[re;p8ǥz4.IUXv⏣4 YЭuf\BH['! ))w|XܤBp2G&/يMK>+<=A ũ)w)\8<}+ܼkM7u BvGϑi @s. 1\hFR*e kC!<*s* m8]Km+Ddͷ,Bg4 |4u|]+!4 `=~gHT<|zHxbd{/uX>H€ w+Zpovg9&x⾕xFt 5--IH@PH=##HrfA,CdF_OVHE(/RH8pK3޾+g,b_-0㌓ԏƪyB8_#Xd["!TSZD 1,H_#fuO"c ci HSwbc_[XǞ i+Wjz_l#OR\DdؤNc͏\o/,{6p1>gM_IJ2i cRb!؍e>/gxXՙ¸X"ʎԯzt'ѡsB#(Esyk C)+8wû<׉'n&Zb3*nbWDy+C8Ⳝ۹ڼf_%͆Of"O?AU*ҘG$D I'sZ?u-NcygptdR{zwX v>/$7 1G6I%sxSWo#%eu.V\m#C 8ٴ~@E@`~&x'\ƗsSHVomkpa%Nͤw5䯂\,6K@> /_iD+H:/T 6zswᕬz{p>թI)E}1-n'F`*T!K2g35uK:fpI8ۖL{ur ɚ7!<=zc༚8Z3vl1<~7deEm%܊A;`=*ŽinA fs8zs^O:OMJOdkS+`ƻ\AK1%L5ӴȵݺDg1 ('8 qtnZ]xt+%lAbr6ϧ\v՜ҟBF=pbYWqXxi݌i/8`Jbpsy( 3_[( պ$*䞃L԰LE?biK3I#,OL"tmdXRZߝCOmODn'043td+`{. "^svqTzόuO"ƚ^`wcbDW{cl2kѴO+EƁGk)MO$/N0X¶l!otaSQZ40[rO`F=;vKu2`~.<K4w˻ih8sןJ4p|o ;~^>J^_Zi>2J-:`p к~-2Ge#h(]z֏H|iެ׮/휕 'hҳ<%'ƺ$7:r$r%a2:`bozͽcQ?eChRxeιN޿kۘ'xȨ:^7SxcMgqHd\:o6) t?LԿ:UwD)>*T:TA5~4>VG'bZ8ՎIfӾ#\ON wުG#GiKyT4yqi&l]h7WRIv1}O Jdܪ[3Ch[$uYn'lSLf)'DQHBeNICplx{W6N@ݬxuj^0vanp~frTVv̏=7I\ڇ38@wn[&Aɴ8bB419p:]Z1Kg#H[%5#,6LȾ2ތ$%":M^7$Z.7Yn-&頷:\QX)yt=K{J(`L&7>U:M>ѭ |X#9$Wp 66pOp' Q%4Ef^wBI u Qz4P..!FA³|1s[{|$9PwnkV=R='UUR(gRmn] y<|6Xsqj}Eb`2py g>_|=ܺ{hTk)RG9N=|c^f&pI%QXpo= pZ;E.N$@@,'i~wZ1fqq,"2A|=9RaW"-~qO 7ˎ3v=Žżª0]h+NG:AbҖj :^$HnK*eJ;݀ӯ{iZΑ&bbXmL: D-`T7|>/ͪ]e]ϙ!~X\9'~x퍤Om^oi,{ ,@9bxDՙfiK῎k$*(W'0+/4]V_x?_W1cFO:W;'_#]kJ`Zqq 68Zt> 1m!"}Il29'­YoJЯq41!fIT&Dg-A9n9#' ܺK=NZ7Hu?rp8֗IOou4t{KCєp19j7^=!َTrպ#Hg=h֎*izZy>&5̷ֶ}zʬR#q^xNTV$yeT U1ָm_Y拙!9#<1Y k&wPlN>\ҫj |,KO<;ч s$5S:ژXRjʫyZ? 4Vޱe-\2āZ?^s@/RTԜg]4͞#hΦ5Dr|K|n8#b1k N9o QI$r3Ҹm7p˨O{p402.ݷu^uZ6,VJ8̠8''\xJr*aM9n|1fmyO\0yShҴ ƻ]p<4`s<^öQ^ܧ!!xsN04mKxDEĊyxh' :sXN䮶:J1WDJƼ9+25xưea3j76o'Q83hrqFʊ1`vk_FޓoG'cԵq˫Zn586F{'_Ki5oyhJ՗rQXqzRkE*-Gp­8R=)bs$a =0zttdyZhx>=!m[F!3p9pE}<&4{FvRf {qy q24TNR:t5x"LZ#*Eqcһvz}z5tRmV)3 =mclV{y ad;~ʞzҥo&i%hdrC8qN@}o\H8#3gx~ZvILJ&|M˯~Z,WDB"$D`9>՜NeiCYN=+T2E?Py"Hޫqk|("YD1G+ 6r1b|"FlW*Kf-3:U9"ESp1v 'kjS7υJiQ"@rz1ڱ|:|Ң%4EPastϵm'‹$vf1`H~8M*Jۛڍ]>K"7 7G8Y’N{I4YyJs.9\l Z&ut1H́亐r0r[WWLfuk.mai]pXgJ|LzdqKĒ"l).3O&Ե얲RO. X9ڶ:zu:?3ͺj2lm H^+ݥs="mosi:,`cGXUsdg 1Q̗D s(Ri6? ݼw>aUs'ҭxo@imf#bc.0Jտ5g>K `a~fҴDKل[AÃۭ_5vҵ+ 6mVsoQX2{{y'}K ܋eKA4(Tzh/^ ծ+k9#U/"efSsh򈄅N>l 99y>i?#hEH, nIrr}UO7xZYj7WyFo1HF+k]l<Ri6٘08-֮_iQ=+*CrD#! Ӽ;xᯈ|M^[0QcfPi'Պ7aym⣥EhslIy$#8 v"ĺ'^B?ْ]a Lsߎ+%VԴ[s-0(>`3)]&mCQNЈYI+s>oO(X^"K N8Zv_@68F|gd[{]6ͦ(!,DLŃ q؎ՋXŧǭR8@>O\aZF+p̟t!iVnH'U KO|DJs&rﻦzUþMgPԭZmH0R޾xWz(<_jH6Z'ßƶe{=, 'ߩ KV̖ȫ+^]I$v14WE-bc-Jr &'cg^'g-1?9'd!Opb9ךn@s=zt! rÀ=+ΧX{67wW+KPq{Dž,4&K,#.>ʂC1 |^\iwNIZDoUwFq}}Lj-eX|19eLxsg əTjFDq 2NU#烞־W΅Oզ0"]K ]ƥ~ \?֬.I,Q`g>%|Ed] &mF3C0k#ۋ9d 0Ux J{ir} *D|7$-@aW&+H9[VgcqwlB8 8hق.˔gHt1:xB+nK1[ @7탚QC#$rF[21 \|:mF\ӊ feDŽNu*;^?#d h"e$nXXԇ]H>'3V0_jvO"I>g9+ Q݅hb*QzRܜǥoFżFrǤ;[)kfgF][.]> ' rAWr]y50=1?CyNe"gɌuR2xȯu#R ;tdo)n#9#Td֭mf>ǥ#Fr͓`$m-4--n RBTA^ǭm|A)VzMǝE[E 4@r`9Qоcp<^]K!Ok.4F&^E.FgPx871+WO{k+3JgI$-#w͙:?N^ YKnWszG?WmG.4KS>8@sO9gsdљbpIqIF#?2xZ5=%񷷒{@P碎<zf1QU)Wgp{{WƺO ٔxewAqo@o>1hT7E$%V1BCW!yb1sWG'"jְ؇)Iљ˜2+0ixn;m?OI7H<`$d;ʣqaOs-o5u<4eemlufyd+mS /xQUs*摛gQ[GSdjZ5_Ơ  30]C@K&B'F0$眱$0+#Ja!hS}n(3r 4|h鱒ٲJۨKmBN4ؖ)1Ĥez4(/ [mMӤS W2*9Fޣ\O_a-.=!nY];J#Ur >j> ռ+/ou& ɅI?1 pO^r*_ǨnG ,a_t95i_4/5jEkEJ0 qL KԧJ7CI5qn RЄ7˗09F }VKZEi`}Ri:x+GO!HAзZe`7m'S^ai4q!M?`:WEG 0ls~&Ӽ@"Ӯ4YlYK۲.^;R -O˧[vG2E$wIV5Kƺ+y|Nn'ܐw>^xGu7oL3  rY /=9EsIlUMr#߅LjX? / ė h1zm'1</W95 ~d&_!(R8JGFtdCyW$%p'nwZ,/WL봿ڮ9sEVfInmau8Sě-,_GkBnTr1WP#▶GkyL,zT6X| 2T߄Kk]I+ڛd:F353oN,+OuK^m̃K #ں{ϊZ |}t#L:5;1-!k%_:%= s0'9GznBv=/2kͤ*$ 9&}':eZ前Ժf8T> / ){yK_,0v0q7tk.khYTe>b*89Qũv< x/Msˣb1a0ϣ/\/-knxšFhbv9{?H kj֑ PjAKZ >k0't$ejb~^ٮ.~%K_[ڋ[2'of\Rjc)EtN:{>м4 &\^wO#c,#= ps[40z]? Vk{ķΚmWtvkE>+^Idm>"nTB ,$/xt%vx{Nn2PQ(Գ?BO$Y_,u}cSB rhGCGnxU֓{ HVƅ aC U<x5w=/S(! OFM8sTqYwOTu"4 X$IAZb\yHx |)C =:\YD+0'p=O,Zy%Z7LYCOU.^fgZqmSRX@/.@ER?]}%¯-Yj֗ Vg!#BW8^)VV2[OrqrcR2 vGP!\\IJmsdǞ;T-*Wie*3=Zg>7^^!>\''@.~,;$rșnL}~f v5_ఁ!_ͺM2? 2F<=kꝏ&;Jm9>fXJ>]eˡ;Ǣ,r+o$+~"{s33?}U_mHth^Ycq\:+'u Zѭ_sO{坖QlUdq u$pw/3f99 `dEEd$ܖ̳qdm',k~2|lk+kI1z"CD sF|)#SWhݻ+!(rTv9ox?UR+ʠI䓞G#KQ[13#F#;nc t㨮R{GInC*599+t= *TtxԊsNOjEnfL0ؠgs?jI{ZEHܶaI59Z$1X|=>ݴzF*n@ۈģ\qxCnl/Ll[V4F]6FfE;w|-&(W6* ?^ESZ.ҷ>7ypsωmꡈl@$63NsB (uGV=s c_|X70مPp_WhPlkvϖ30|UWŸh!PQDPSr0Hkm7HD =Vb}ܮ_E!vb t Z61[wzdJY]$gp=*uVt 7y|AcךC~ I:!alᗉ$ y6uc 'j#ןV7jVuʮAvy9Q`H->s+<+5:slE1sg##WOg%ZOyڔ_k;xaVH <2nYiAWʀKgpl|ā2zsZesv6u ypC,\7vsH$q8<bGsԴEcvVhI%@ i8yb :bxv[6/#Bpv@#8/^ ׵ L\rFrHWe ϋ-B5eTs$0i#i=s'v=LҴ X>|sA'޼x~{!-GF+U~cwdޯ4[l][-Cp/8#wҸ_xKTdK+Ȍ9Ȭ@|q uѨk# eƢ..yGp( ՀimK-u: K+FW @w΅AǑڮxOoCs0Cƙ 7ݔzwF_`UӕʼnnMqm}heR&88WQIsa!bdV,TfH5 C~&- @s1{s]}D^I0FrON;ϛ >G= ž%s-cw BOav!֧<N#5&[|̠IEyΟ]9/;K\.xb>AgY,>!hDlHw*vI,gPk8oS᤼ͩ \i02i1(IQsM!XDMO P`z-aFF6dA"9;T3A[A,V^I3cOW\q G}?3nU05{"sGJt/wᷙӌ).#Yڨ3\ŷ Fr~5m% @2sbM)/|GuNv\uv}GLui Hx&h3<9ʁ|Oj䩈^vfVZc[d;Eǒ?'k|kO Ϋx[YrV2AT.,tw!s毐1e" v7(Xz| oűhz-Cpmyg:O_tτ: V/5SBur^Wa=@Ǧpq#\]졥3NsU o4+T/ _t˸$nbOcN{? wwExܫnRc#t:W'Uhi7k|.r pA#3M!K5];Px%Yh+c`Xu-GE5KB,oxIo倱3FFy3=;>qa4Y4ωm-ݝ#lE]lr֧qr~ǯtXNZky' 0;לkt='@5Eq%O).G g5oh⋋mG!0[BRȀp Zwt|ZaM EVaXdy95qrӲ:{ӻW=^0ԼGyw֝wA`2N^#t7eg̷49Q^74r ={sҶQM6GI+#Ӽ[}bZ=ԢI@ N8e+/r=m%P?͹JIchW.KdѲnU gK͜:tbxZ츚M;qYʳ >m|4hۗK/)hTm$O0P6=>=, GnLA1mW |f,$}G|1⛽Zݭ#_J89 s+=d}!J i6CɿtVs G^2Enil6i]wIs,y'!mC.&ҥ̒B#2˂s{Qai ɂd7z=qI4yįbIu E%*L9gu(aֳ|9?Z䶾x-"aʺÁ= {vWI䶀+8.C#M W&KS[08[8I + O#+sz{?vZ|.Դ<%$ QrNy/ B]2d',0XSӭuWŴaI}V&ɂ9RU7 8 xK[4FqdJ_gUoEbk+3By<#9+Iw/öJܝBXcoN;!FF*HTiDH__.5ZG;dccxgr#S1,zu8Nlm20(C7QN"yeY=N%÷WTk3ꎒ##l BT瀘 RS-{/ƌʞf+aAP}oĭ n!K Pe.sCCukZ 禛Q7orKߥW,[jt>x:6:x./.fExiر>d6\q 6j\UHY6>__c|ND~ n&]YibB h\2f]s->gtJHA^*`x鎵薾o QnWhF98sX>.kKm4%0gYr.T;xxKXkk|̙dH+?7\M9ONG;xwBk""5}^{w o7%ԮG2$n921Uړ:QA4!`(˪7;^]6Ct E47IKtT#ف]tfZJiR~:P-[v!X0 tOoQokNU[3Upf<͜;_ԲqM{ ا;WswED]&쏁7j|Vigx (TEn'F_ xWCX Ldw+ 'KSJRܐ(8|vk|Ciƕ}s<~L.v˒c}߼]O? RS6v۝C319MZQoJtⴿwyP+YcץjJVN$ܚmx#o^k?H[bjxkE!m!N=Ik|V#C٭s{X}V3շZ NLJMIS?Y[A3*xė2 .[npS\_Zߌ~6Ӡt[W?1 H Sq\{֚v~$8ߚ!e_^Mu@3Id?x\dG'V'Nk^Z2"˴眆uU!\[–XEs:ap2Iڸ+aΩV֪Z<(x%$}+hᮟ?U[9 #%un=.r>>7a_|>Ehώ۵o6֬^sмXXMM6Tl<\d,qגoѺtb@8OTWm?d&; %@Fn>5?_d,zX텠|pҪM#8 /StmgO &7;PƠ'IGaZ!d^n[+$*]`,dz]Z!*@vq0 P:k=x[;$:tLgǝ-";/AߚU&Ԗ)pN/s#FH|D3^SսS.{DOТ[|h#Pz7ǻ@&j.ƌF#e+<usi7Mn8N*MhM:o;=<+s^Ե=^K@ɍKnb܌'MF[SnD(pI?5KICi v>Q^w9p8>osç*s: EQܓǠSKD{4 <9[uuO-(yiA#gq/{fͥq|Cm= 21XC#n ^H!>`qPz[`<>b 4Ŕa')8#ɭ"f|VRڠud; 4U_Q hePDT3ye{z]#{%a/"@<#NW|K {m EW.7 H_oN+u~6\e!|.@'wRA㠯'w?vitWQc"gx[#%wk:<+/|www=ڳ4wYzܸ9ZشmͼwV݊Ն08$m;OOQwV?|A4 T: g8 f"Fw[wɠ /K@i亲Y 3190=zǍ_Y`m/m,YNP' SdgIK{;UI.rB bmfGQЭǙΤdfէp WY%";ǘU'@`1WΉri6+jB,ᙀ:qg+tΕ Y$ # NH5-ɪZvb-5]-.2RDŽ~`k_O7~VRI [N5j.x$(F!I?/58}έ3 %6}rNXitv"_>FXf60$Q]QR፿]BÝOc6򝪌=;WMujPP'I- `Qq]hdYLY19c=#pUn^V5_T*@MZ9Vw a.!H.9`~e(|pk/xROȴۖd[,@80'5ڬCp"W&9PIbmu-w1vG; >wfm_C|aᧆS)" 3K.pAn-·$zv&nvB>@J񯋚h{&V kh"K X#ms&bdu A+fnbv4kM=oX*0kc 2Gv̚󧿸q52-$g9Ohڬ5kVCv EBX~5A;~֮ry$J%84&gu @TUR@dz7\jLjdF?w>E*Hd'# ޽_~[G"Xƾc%~Wz#ۭS.iu; BqejȠ.208f;[Tnf&s ,;F$q^]Cj7^𣾕tt뫋ԅ E?7OxxV?UYKik b $ǃ<=7k"jJ%փ8$V<0{t.dRNO|Q-tpYGmH<.qWXz|%b R>etޝis,qZw iR@d8o0~ [IKeF6h@*3'#$=8\c_yVmuyo)ڼa: /$alWABI)FLNEqm7FCh$׭ZFrv=ɮPt>r,|dxbG?rw5В^ỂRǍ 2G1_qx 1NM|@v.;%16|r'=3zo~kF>T|}K~geķRD/PN=N>ދAwgq;]&A4}f}w@J<:Pom/{{ZMnRنTVR2E:k3Z -y|E|[7VT}LrNWH5_7ww D˜BpFp\칮s٘Od; ycW[hY[i1@H$=sVE<>\u4k ~Sj>xZ=)&<${0pȯ'j2i L8ץ|Yo 緎TR"`y++Ofnn;Pӭ)%zeP[䎛sFQGCr0Oo9M?~,2$r|w$JsYqHѥL+EKhcMLA9A\Y=tB-]lAi'SW}=JF \[&R\j67G E^QPV93ʸ8Ps'!$z/˔`K$`"NsZ^1[Gӡ;63CvHbF GUr玉t9k|MZK>W#d7M/<B8RY^W-}Ѷm͎6FhlE"kkk6Y+NV@ۀK!zNj&vm%k\ 䌌HƏM{r_Uy< -Nq G._L\޻2!^ L}x5~2Ѵτsbk=ϕv?Ì[5__AڴmY(.r7=LGK 2OF9'#ҹwi~2;*61+{~CNI\l*VxJ_n,.Z1GqؑbΌzO;7<{{k4(X#*5=Ο@tU..PF$/p?ƻ/Ht:++Dؖ6EJS~j/k2-ݍݒy8ӭ7wh(:sݞ {/{yw4ooj4PH"% X`O??h' ދ:M?u=^>x-;VW#̾f/XTĄtsטx}cInI7Mr=:~iM)\E|f.us7s3}=k|!4 MxjK%AFbRlp9nqWxUrW6ևWգ/גk7f{+۱ 8ggWAnv,dvrO~r-JKf9]ܐ'_xfKZGI嵖'32)>vѢ،G_]3&@T?/F=kN? 4i [9cbi8Ep^..vA'蟳mҿ95 ib5RY56V\&>(FMFȩ y&c`{58Sť[{(cno=伍ȬrFҳGxN/ co1-~+ۤ# ?$ WQZ t:׈tLuC98`ݱV~+ Khul ˶2r3Ƕixy{)˱ ?.3}% RGh/\rOgHߋI: c~$|-Eo,/Շ$) |AhPѤc<YwquyLJ-Jy10oJcVpE^7{X'PFtm:aob2TRW eǪzۢ CtiKPM3]%gRW?<NqLP$HFf]}{~u[(^x(dm6es&}- qq(Pߘㄌ:m,1Ҽ?#If/-!r1>mϡ99Z-_Rx1HЯ!R2ry~ ;RK-Q* 9Np=ObnjڐCY]($F,FpP~~sWӴ,RB-h (3 crESetˇ)e)vIE[OH%$ʿ3(p=p1_NgrO"Ej!3ӠN~!k6:t,ԭ:ĄÐ9N2dsy#6gngʊ44oAIg@DSM E%,<->zZsTeY' ^߯VGKImn$R`]Ծ7V׭x}uUbݣi0hltQbGL5oAqk =ZޤmS*ֻGֺ_ds[c2"a*$ſ47awko#$OjuA⵼YK,kp!0U\F"&5bI=`k>%fYcek/ McL 8doRⴹ0۱{ݗ%2=qsZ~kEk5y5뉭gDJc{q|au ҖFҡp4ΙX(er ]WhuaF`[rHe%"9מ'Fyzw̑]GDaY789$prfⷌnt)e3gvd[X@[' `q_ eֵ V h Nps;WjWwf8;p9h?U|U߳P\]x{4~vɃ%80+^8׼{Ե9]nCZ#1ZS?!͊Ym; /5vh 7酪ҥϑѡ9߇-6ڄeT G 䑃q+-c9kUWmpS#޵| ss9S/+f#3WIyaz\<2+)vDrg9C*ϞW=T;_b#?/ $ۃÆ+Ԍ#o xSo ov CDp>9uvlk^8F;W^c@'iVvR8;ZӤ'ucf|_)\..QcN\3@RӾ9kiqn 1W݃> nH3G![`@JNzb,+s]irh1K>b[Mq x *d 99_|1q$?I-_+p'ar{H`r)BCT29#5oޮ4Vt p[$جZIekUHieY$Os3  _KVkHRDf2#lG~˻hݦ՝̛[žZƑ_W:wSMw!|7:t)VP~9\|*!-+$: bQ`OǞtMt.}ll-΄@7 ԟ }_ln?bJ4m0kE6B_Gɿ !f$6q׎{Wc}@qu,k%OSc8`t젛Υ}{!XVKw{tm!ۡ׊n9ernȔ7ax {vw^"o uX-șQ\.XN>omaǂn.hjvj2G"as^_T.!vѳ-wHH3\='N7x_ͽ<1SMe9v,l8B|]._]o"Z!Y>ln m|w:Vޏ|aZ|b\Xq1G(,pHg&ɨh]G 1,n2)'7ط7ӱx6_ ~kWvm2rps^DJPk k!#F0Sj>#n_uJIno4[WbGhjG >hȓomlܩTM->lVl1?!'#W5 66:u5 "GS\:IA $ڨ3ݲp@(uְE'#;O}k&{&Tϟy-Y7Ğ*'EF6S->>eiGd#xմd olkJ&1:ib#h.uD8ؘ9T A֑\Ki Sڢ Npsq]2)-K>Xgޝ)i?Lg#c!IdXas sk'Gn#y@\mbu{GËk?ѠkdxH•U?ROy\gUTIԍ$V njN+W~Rsxb{9%C1Lmٸ}rHOPZ% 4mc4km6ᅭ: ]zc"jsO'ֽP1؊Mse6Eɏ82N׽6+&%q^% [de1gq `1+j+56ȳvqB=kiTQ4nl/Q51Pʍ}:_ .k_^4I4U $`HYY;`7"]ʡ>K@ڽ]9>ޞkrn6gDcfTQ).#bJ0t#܃Ec||]|&],2F˂2 |GoJd*: PeF͚Id X=OjB:o'E ǗL˘lRn<@{{%|IU7/۱=>X prK[>2JoNM H~BUp<ǭN~Z|d=F)cbr gI~ͷzvګ*M,7̗r>ô eaX٢ɶ8\r>2sI4BiG~Yz!e¨)Tr:&wj]YCuռvo,B\|vۮ+dkA\z* ]R;f160ac-!yϭT[OA4<}f1 f99Y T$ pyfM9XN^9v!8\wSN3zjP:+%9<  #x`{DL,WƸQdn$x9yeëNc|{}Ƴ6Gkn8!(ȯ~GίD٠yUd KKxFYC'L~\B\wtS4[m1yB .syǥ>-L}v.~N9(oK_^_5c_1X` WP>1H[xM#Kq"+xU Ĝ_u+\Ami%ܑH)崪͌Hp>^[`D<ڥBa Jc'TjTgϞо*CŧXene⩸8S羾GčS|4Y&DRY?v̤vRV=sXr䑎yZK}26-N9#i`cޫ%ާ~īO,d}'}>iQ[Bmm y"\0ˀ~^iRYR(ĥE9,N^ZM9&D.K"В 3{zҋ]$ވ ? ]jw6i%u%̃kFFP>9^;CG<]ht-*PCdO6UrB^O}Ie"0;CszX"!X7lGpdrVUy2)*7{tI=K9RY񕩞N.s%RKڪ0rI 'm|Unǁ$&X3A{HMɊ(+Fqo 34M7gbd ^+.X'*k>>j]CS,qm'!Y-c<>3jw^ѧQZ;d]CsA_NvQ[y]w !B>b zړ%OhA2IG ýjmR9Z> O?MlIqw!9 A]>sd|3]7娊-WC_A~o--&g܌A%&cڌ.Ύnk%Io`c p8v5'Ѣebڎn1-9J!KJ |1~W[Iwt`U.noM8'1:HO:{L(G|_h Wԑ$2F쌧#;Oo |?Ҽm=ϧ%NG;r;{oڃ7J˖FeUNrHaQ-(x"<@|1F?,vS⟉mRajvǥz |{ v3LFDq UKʖ^bdvDH@ usbz@2kgi-,z` ʓ@IRӵv^!ouhKCp@2mXcJ--+QOVF>L}sǃ흜o%ܾo %5(WQV܉8:W? L`h4bLnxlqcXuC+x[‘:msIʺk%2]ћ9o,6N9 qKVMu/s&տKf+H|TTmZeF|r $TJ<9#_u!{Muh eSYԐ 6]v,̷Pewr ip˓օ KĆ{[Rۤ-ZdLBc*xPݹRo} # I6~4]-muIr< cCrG=k-Bt涰1IHQpz#.uǔ8ZĶ"[ .|LzS\o/GĺxgG- nLwy'N6#;f_5hoYxtK3@ /^3o[rA)1̡H=yVy9JWz΍}LlHNAa@ ?*=* KI~fzԖ?<#qe8r22>ºK_OKjyRXAd{HfOB NzUԆY@ A$zu㟴n?|gaiV`oe>~X&2x^+ѭ[YYDHm IcqX &|C}RDi3"Mx95>HjIUnCk7~#]dj c9AֽK[5֣Gkvl}ZVNJ,A̯cw'|O֭>2,Hpc2{֮z[{V,2Y >ưiMix$[9N@-'8 goQ&@.=qڪ_ 4v"vĶj+$D 9X^5{C \̰;dpw5yj>Ay[ܣ,Q$ X~uجvs&w[?0t@6 4J-(Naf#,It58-L=sin8[N}ʊw>!y,Y`rxʜ袔1]{jbym5h럼A{ׯNIѵA>1\V\U$3 Dq}R=HeF6HvHRcRGr# 3EFĐ`Rq'͋ 5%F+p3680IZŭcsMZȟh:J(ӈY-h6[F6NNr JV o @)QݞrǯSQ+JhҴHƉFZI9 şÌV5 ]Z]3[36[^00vߑ(/i+ǫ'K]SIdhôɱXePG=27;!F`$LlvN?4QIA5hX~յ(ᱷ伕>^H!!Fw򁟔 Zg߮E.'xN.;r%6_x,"RJ WL09-8[m_NB$wӳ;y#`HW]|_LcpeLA*ȁO$'ӵhe2OIzwb0Egk\xBf5mGHY$i#Hj/Px\]G&,&Vb}Rv RNG4QTkBVֳxNHae*rGV L!rVLT!Tgފ*Y{YkhbPPrhQH/@ 7Amq Bh>fH^q}KKƲҮO''2Ա*l.dt8cv@5N:6V$8Ȣ++&djM9{ =-d1$ gZ\fE!l(\mcE׍]&O2S 4 ݏk&߄/$&ڂ1 v $ct(*-/ J'\:.F:smo #i4ZBw7/):,d^ZyH<%5I7\3`|==hhH>-Vd~ Q!7w[r&>+x"h+iъianH<p~q֦|]?nu9bH!IAn}ɨZ /  %r +)-KSw XAu^Fs1nId-0'$t^Bsx aAYNI~{QEtQV3i$~=x-F''v~H|~Җ_8S^nK5l j(eN'[2|zx?uȤ6^/sկ {A#1ǮDQOo;N>,GG֚cd#9MVYy=0 vV-q%9(<=Jlj gg{!Zx~{+T4=;TPNT14QY(Ga:"OCAdٰ8C>Xqj~~skq6s R1).Ո';w~"UdX+Y|Ikgm*mg%ef YbF89=JsvsOdžkiڋ;%NNL1Ϗifk_YJ#RJBNOj(%Rw+|H{]s|cd9<};V^ Bgɖ.\m#6Ǩu(JVZYW- ʷ*H9*n~x#Gj,/.:)L %&x_zVR#{}N]}흒HZޝf+uQIlgEI#7'b=752. ! V,;> Z=lkŨ[˖O$(e&2v#~ i׶OB*v(?q";;w7t7i7fqYxEbeV5u/i1+dFa;GzRS#Fz+2Ҋ)(0a6:4ˋK0^NRq`QE"Dfotocx/images/edit.png0000664000175000017500000003070715247006660013737 0ustar micomicoPNG  IHDR>aiTXtXML:com.adobe.xmp 1 2 3 0 0 256 256 1 0 \ieXIfMM*JR(iZHH0231^0100fotoxx-22.0;Crop: width:256 height:256|fotoxx-22.0;paste area|fotoxx-22.0;Paint Transp|fotoxx-22.0;Paint Transp|fotoxx-22.0;Markup Box|fotoxx-22.0;Paint Transp|fotoxx-22.0;Resize: width:128 height:128|fotoxx-22.16;Resize: width:384 height:384|fotoxx-22.16;Paint Transp|fotoxx-22.16;Gradients|fotoxx-22.16;Resize: width:256 height:256|fotoxx-22.16;Paint Transp|fotoxx-22.16;Paint Image|fotoxx-22.16;Paint Transp|fotoxx-22.16;Paint Image|fotoxx-22.16;Paint Transp|fotoxx-22.16;Paint Image|fotocx-25.1: Paint Transp|fotocx-25.1: paste area|fotocx-25.1: Paint Image|fotocx-25.1: Rescale: width:128 height:128|Αb IDATx]g@W~.)j(b])*boXKbh4EyM,$GP1Vl;XEA J21;K?MİϏwܙ{ acc /(B`A)1iY666ݻi!w~K,9$$(/ZBP~%{GBn܃8ʕ_x0sڵlsΝ5mΝIOC۷kЦM;׼y$IZV7|ĨӦ>eY]\+VM<<<>PQR7ۥT*UR3y̙'t:ʕ+o߮UTq۳gﶒee mڴtFcS&Oٳ'6jZm sQԂU%:vhxcwlmٲE{ xJUZl_NIIy pH[7;4MKck֬Y SRR0,(%<==34ܹsFў9sdkڷooeee-RrАW&^bYϤ~d_V-;8;;3W@YBPDoקO!Gddf>w>8^^^56jܨ3g|EZZړ{6  n=-Ph•C{뗟{ uVӋ$IJ:zjsӧO߼ܜ/NIM}{Z ?t_24U<=<;v ˲NǏ62mCKζmӺS|%ammO?fkc5k֬[̬qy7OO3OG_t"RSto ,fI㦛Z|ppw6(94¨٥Y| E8@V-۵jٲ}i/:ւJ;.ZeDD˖~y|9W}׽{qﲲgIǃ~iu EQttt̺ǏNy7W@B™cO'/|bEɓfO17ڵcccc=<<< ?@5RSS:977www__...SxJD~Ks1 ̃iz {^aûeddݳR4~9|dXr$߷lС}RͩԳG>mԨassc&MQJJʃU~]؏GXx_eKm6'O4ܘ5k~tB=t5؍7)[X_ܹ_-RYy~^jUOGɵIJucaԢ9<Ͽ^l&M0VZ̍;ayyyy-X^8eO?0Ӵ'obnemG9ܘ.u칓#G۫gtقK.77U`!ժyV_$is+?۪Uz|>c\s%K~&&'''899{SE͜+W~Ԙ}~yEHKK2o޷3jM?IXQFe~0۹sWv?v۶mO?/{#+wlmm&Mرc*EF@ApttBڵx 6Xv-Z˄\t ~~~eKt K*˗}^2mG]0 @L4 sp♙fV[$ѣGcii}DB x^<}vvbɛ x,W\ТEsH͛7qj׮/"994M 0 /eVqA̟->#VӧOqa|7hѢ9J% A\\eamm a@4*V#-- ť R 7h2v'SzSN{P.=V9s{Š;6m///۷sQJexzz@Ӂi<R kkkؠe9s&lOOOP*􂌌 X#5jJ* yyyA@@ W'O᧟~9$bg|]FڦŋCDj5܎?+++c)w) I3PP[n2XWuCP@RAT"33 Px% !;vϞ=Nqǵkאs# dzgPZ50 F `kk͛aaS ͚5m9# SN{ < 8NKII1Y&Q&9V\B-/Z@zz: wZƂ Q+Zj$$_H{."#sNWFll,WIxjժ __?ڊ㐐[J-hܸ1hFVV̙kjU5Wmf18+:&fs͙֭={gݱcͿ_YUpwwG@?q޽w̛7iiihѢnܸÇ*W*U@ >("##111f0 AoL`Y?cǎ H4 gϞ+WRENNN=OE󃭭-RD߾}eK43}ƴV}3&%%ݘޡC{3g`oo;vywZ{ܹ=z5j>I΃4[>|?ۧO@scW^+WK֌%Y T͍|kJ`NNKA@NNn0`YVv,e"'m[ ŞݱXGh4ZXjBBBѽ[ƳA$RRR1f8]Ah4PO:}ǕVTɓf{#G,Z㫀(e[#,$$/h5k֔xrXh VDA$i%Bya=@x^@hh(7Mpp0hٳgg0`3LzHx3ysX,Y$ 0 =3+*dee˨W.pV2z ++ _}%+++b(|pttċِvd+$ Q$Nv'H4SŁH v |gwx8v';w`k@0R 09QMo%lպ={G8NUj:߿fZYzG>223)k .> F\P[PxڵeX|"0bR}7X"-w'ES'('0zhtZ}̟ $I\QBP+F1bNNN?Uٽ{Q>> ~u/7nH5jf͚LA3f;wPQl F-rVv߰!8^(Y- Y D$\l$&&";;[N"I]e˖ IJ6ԩ޽{V!XɎ.1߫RF=|p/o/?N8a&MQ]?۷{שSqcM9cg`er(, "L;w>nq'!55ŋĉpYpttDÆ dロ[c?CU vyvvv΀~uI_&$Jڰ~ozjӱcx{{?j/M]ի̟`RA(dgV]}6m"mzPİZǎCRR={8pY(?Flƍ!4_͙ ATРAC8;;_(/jszspw%ۊK7ؿwڵ0QQQϲg/-,˲SN}$ǔ$IR~,+v ǐ!J 4BgΜŰa1id3g0Wcр]{D=AxMryJs9 CRYm޴7}.pؾ_4oK !q GPHW)88]ZpܼyS8{,*V,11fjک7a IDATk֬Ν%x矘8q&L O(6l666 I*T@۶m₸Y`1pwwzý{%Z X] fB` g')uPfE,7dejR:bqZn|\~wޕ ! ۏ`?E޽Ų:XwT0ckHP!iV-3]>Nj>uꔑ%!'{?a`ߥkƙ .-FFPP,qVƍCQd@ U7ȇ78q ߯M6 ȑ߱m a Uh4jŎvA?@ZQ45ZI,hY>Cʗ\ZWKiY`/NRYA΃V @lЫWETZdXR%&\H:f@.іlmؿp 4 ЧO|""?!>|l4[azپYR(@\xө\<#(Pֽ;DG _Āo^ԵZ^\q{ 믛 [PJIEE JN0F||<?&AA힐+Jf$|hSb޽ؽg [ hZZ+ZyZ^V$8@4wB%IR? g+zT@GPz==KI2K RxϞ( BcѮ][o,BjRY:EtplQhnJ܃Uy|RyJ*bPREE(rW+,%;E~pRH2){v`Xl۶UVėB.AKֻW82frT3(@˵szVsOP@bBvEYLʀRX[! \3U,TałHՌJU!&l5|z>ih{:JQہ,C,\$:( r6\' \gԅ _Ն1Y9)X @O|c4> Tn79'Yٲ")hXcG#5 T9#W=%o\imZ:qıOLvvHO[WFsYjb`=2i/ GtwCvT? {ſ9(Grv'_LꆌǮGjri3"|HI UW9!\e5}=sL-qIF {z'HҬ3v-qZis8#'B}N9i`R/TۀqN[%_@v)D78c.I I-]Gϗ?'d=@[ OJ+nŵz|q+{oۮڞX38T'hM5!YE62qpI8 RĶRA #\0 G"\b 8yH~ M ^P363տxw'r8n;\8nΊ4ݛ55A,3j[*>k`j[gCi"ӣgEE%l{_ߛp܉rSVហ-#>B,( _1iOK’9/1V<.>T{Y9a%ŵBk3ϲKɎ?\֥ǀt$D؁*W4M-'Ы61!Ɲq#-.?@*DcYDۯȏz?U@a M:RI5q#:*lYG%XO4hiվϽsܰt{RI!ˣ|\koJ;VA|,}Q88 rOSUqYX-ݶcc6pcl⼏9TvS&;*XnCW`Ԟ#`rUnmpi$}i)99pzm|\<^4}?q2v .t4ix&R}<[ _V<J4or=+_`#ME&Z)&T.9mʒ]{y]s`qɎ:pnd6klʝ<䊆Mr%Dc#nKS͍B8IHԣu<Ҏ=HomM"q(3|98Bp yٞy8m*#$K_n$g⡓x"<8OI/J[|v=V\H~aVM"{מx|:O$ u<נ/ɆmnF2i۔Δr ,ATfeq. pGl8 1W:[^VZuJm]ʼn˧,213xUPÜB?*Df vZ*؄)]f|/8z~aj&}+Ѽ3o;YAQjONZ7oeL81RnV,2 >FrwPh;F 9/t #$c>SźhT1uq%1Y vXS[(ksCW' ,Ok*|1bLG! ҬvqQ+c?pUtUtp+6JN}lN$`{wo?+\2NV5KBRHi6marjyA xqL5 VDZڪ]pxs >CzfKԸf %BÌωPM$`y,y湝7i%ܫ% u#kVP9-^V41Px=#Q,NxRشאI,g$c#cIe+ .q5hi:i.ڙ8ϥI fsp9l'/m$@({`S 'Akَ& +e݇]P#.| q^Rqe2zW@½Lq>&͌{y3ZTk&i-4yCq>Ueb~یT#j+ leگy3,\V,9Jg=u];+:IscE~`PDI9}XxXI$,RW n/-vw?0qcJNMЩ7VyC9^*f` f4g ?;zl1躌s\ljf.B-c,A8 Qu:,_eAޫ8ZFGVk1~֒պ-/Y%3yaVs#tƖ?:ѶH>T]x/Rww>Grn|ʜҟOLA-,1ON7G<*Mc6Vvǹh3MOF^e]e@*U"+Y Z1FO4q@̻+uޠ(Rl3gwzjr{[IIghEY#i'gvzZuvGӊ)S1͡GQs} zVK$FQ5-QV:y3k bYw5%q:3}lw,uAԭQDy!yUT[w+FHOXژiu+%HUqӥV'4©,xfmd2ߖSN4[lW>?J(K1ɘvѨjֆpl:zʊoQ\\<"Eܣ<y qU^OC&8S46HG=+ћRqyMJU J4I2C ^7OoU9¬F3 3KlAl03\ѓ[i(- n9zgtOӃCNY$K*> v8Hd㠮Tm1j1wJW⍠9:!=zSW"5ٯf[1nx*Z_ fidL˒z(] n6#g] La@Jq"y&>ky] vȲQ8^Hj{+!u~nXF'RL6Y >wQV)Γ+TiD|u+ L{p99Ykd0H G^s^3vZۑUyy89F7Teq>T}sŠU̥ #:~U}y#( X,H5[Wtk 8l]t8 m6O<Y5eGҝiՌ.> -Y_2e@$Sip4PP)e}Enb9z}3N~-K$çC<ʝ'*Kq˶]Et?le,X K_%kN@Ii8k_g R=uf]y39O4kBFҬF;[mM.hUn1䟭+^ZM\X o(5 2jڢL[w:~Q~;F*֚A*S%WW%l_iW+r$p zӂO΍8ϡfeB/v#jOD [u/Zi<.nS$tvPhRdSj^Aq7ؠWT4 OwBk4¼Q/ #yAj cV{MK.Ɯc OᧂT$ ;Un9#'RVw\UՎBMR=Ɇ28Y Piu+:cҴO4b'o* *KlrsR猒vѓX_B8H*c9VKk%N.M`}=jHUhO­ϨAKs6~G]R\VfwrcEnb#URCJUV߆m hZ&e M/φg nQ$ʫ]t($ZmgisI>gcM,s,hw+pjōSLdy. ғE!Gk0|2HS ˶6]j2dTEhd݄3>z"\xsfY߁#Ҟf'~~X-dh?yXpG{hlV$i{t/s5^Kq ]?JtSpiɼUJ+ E5>$u d ̹nj} ,0} ԖhDxuz9LlקX2\'Ϙ9z[GᙦWkF<.j%Ecf>yJ|[i^+bF!$ӚLYF#{@ͱ*ӴKBLĎӬP36Y3Ŧ&M)*FO=qKi0J=W(MJ6g9me%RzzD"#YYV=*PO揬Uk[{mnyc$rcÚ}k7-5P\pjKR [? k^K[`^۠%?wBQWЃqVVkm9cof:kpN8'ՍJH;ɷWƛj>R~6OFٴSH R6$Z{ yLPڰA&M$! ;A܁|U3Z4k_QMnhcO#9Bv;AVCU{cIf 3ޝjq[ҟ=G%J9$Mq_d5kgWBjQZ}'kg%SSJ̹u! *LIvR`6Q}~ Uuxed8x%>J?*8UT )GtbEMEsC_η ̚E}GCY];-<@t7\\]]"qޔqu-_khՌ-8qEKs$iT?5xrINwk|<f89Si̚,QAg(VU9V7`$qIHe[m H0\zV+5X+W\,>\W%'cY= JĆ]㚵glc4-`sfͫ3c*{Kdjޥ";FGT`b1V ySNGp8/W/o;吘AGn?UtqȕFFb":4yMǰ jFɉ@nqZh+uE8?ֳTT$hZO0F[)\\mx=yPƯ3*N?:nli oTMF]PR0=y,vAKV>1#eq2`P=s\כ.V`<_weE:-7(ّƺc0@j_+ȓ{ )n?=۴{1F@)T*jtꪛ e19 rYga%P.T)FÝX6|(#5)fW'qkHϚATvN*ERQ/o22KN bpӑ޸[F Cq]J~8nၭXy1|8O)UU"<ӵ2E6 [yP8Cs3#t,+LdcWlnu̡#jŋ8eԻu%=vRc m;M%ʑ21O5rڲ3ޞQa&]9j (1Y{WOq *ᔷz#L)^ ܟsu67|:֦9[p8}>Idkʩy;yZ7WQϝÑ)sS]ԚQ(I>*+= wc*$"H?xե5tќc$΃L}wUP93t`f9|2- zy{ĶkIp]“\7a^'8[ "ag+`VN8'/u)Vۧ; {j%弶Pն!oBMwzߙh Kekl:Zns50d8Mfn[ŸYdXS8gVbDXw!U`s+CXS,mʀ Ey]32go k7Z֢hkѮ|nn$1!sQW: cCq%TQ[vRP)gG%sK E͹@3דN-Є0D?ָk b[@(!#L1):rf"5^=&Dw,[ɯ4B;(gŷO*hI_Cn?i7s\5@2$w?Z=5 ћ,$ [Қyc)wa"I&ERB穯4d(Ur:zӧ*)nwpXG 督5d.|pGJe T$(Ӧx@VM0Uhe*Z=d' -9l"a5ẗ9KYY (( mޭxc(-iii}RWb}{-3ހcimSй{C"Ļ1eU2N\En:c d0@}ECoi`!LK*ϱcopޙ^7f '޻v`:[w64jpb󪷺dZ6-Až>hg@K5t@xk|iX\}QS4q2Ю[2fn#?tv%ާ`L0jӶ^A/r) [ZA"i$#m<InM>5M+a4bzgR&K%%+!sy:G6:uMA\ ńQ*][XյЯI*SbMTNԞQk{;K F1:pibp`Y\ FtQydS-9޺V2QgSh8F?W?4;[>ē0[**ՅQITn?gNC8)2*k8W8uJ0)NXH.WГx9&>(,@zR٢ N*=O^1fcV%o#5R *TZQ=*fL13rKb?"ڃd{4<6BFp:dujN y)1,ӷ bqOGV{̿p@NWWLO?1W199WL﷌6:x}3uf`CH(rn$0#b06?tv w>T<s3".80gkաnF2Q5\}VLJQY :ƵGds|ۃLV(K \=y h LD8?{ΗUV6xiKk 0 fC&ks|I2 {fi5׎＀ g rpMp>!Y^֚֝y3fN*M>WGq[/`9B/ |\Ú5ϲhPjv9#W}HW!pj K@ڢOtw&B' +3y6x-tZ,S;BI DK~Pm5%hX[됱QЅRMqKYi7.#(UF9K9c`8"]xm*dQ Bސ\w$?f(N͏Oԑy޳cr^*{-1ʝbZHLJtpN@+2'<6, ,Xۓ_<w窡k$/}g}yG!OſuzP_(^|LO^ă7m$l0{N$dQq+Ĵ&2Oz(bM,7|^![H,xfy1'=+:M6m!?h4w6s[:[]>3;' 6+<JKFŸ…NgIV4yk$RLEk\eu+ҷ=w4W8ڒ9՞)taI}+w+z+d={pEKqO2WJn+71oJi=.m&#嘩sTP}̊@|q#!CНO|K ~#L:rkчe=gc*"_Fk$mٮ SgČbǑ?ORY37b)%Ѐ;lj᷋U Ň bƫqhHc8Nk֧ysI$ҔSMRw sJT\1g[k³25tZT6yJ'YS%>eɻePYmV4״1E7ʵfصuD(rI95b[}b[|υ Lv˾xu2r_hGoiu̐4P>~w6?ƝZnd9??/gI=?{|8iwǯY.p' 2䩑W7S0v8&VT'N>f9+tlʗQԢd|T8i|:ٱ OIH^(0U^/pMcU[?1|G1dUL[tl2 D:#rXRxnvzA@}jj C't<S1?:Z V\ֺV u T˳qd`gڱ5->}C8e?LWJkvy|U<ĀYF+ۼ#kNx}6sA&@O^x5`ϳ8=":iܹdDGJazk/# i>>uc&-dMfҮdFܐzTb' J\=I%рiڪ'_c)9u-oW&b 3[V9:sPiDLWvc=Gq]>ȻX.0? I*J#ش2sڥq7ְo& mqk45@S|z?yN 7(*p=H{S_$ڪDTʀ}L+-9LK)`Q~mt:N?r-N+Ѿ]F!w0En\[$$XN^y]MnKHxdp~`+.f>(aQCX#vnƤdKǔH1zMdG ޸߬_e,_XKu(9ʁTe>?NWwGUf%lwkz͕b_208vlj+4 \cfh&g(K7c%$$k"ݣw/=@ ˣoVS)e#AWӴ_ZJp{JԋoB&J\6ݪzj HR-RB70Rk>Ճ8uKՋO+eysm2gG<<&7%Fȭ(Md{nNB @1^;-nn[ȯ9 `Y|5ۮD+D[FO+zQmcA#tV_.#Cƴ4_"O^3]Z|'}py0:֍}Unf:jq5KѩUܧ Ms:qD8kPCm,{\ #WLmd- lrsSxѣI"cczT ʃqxZm,lrB;)lsyqn^&H쬔+u8>ol\fo]}{6_@eSZѷ`_Z>_UYr9Qۑ]^/j1 H[\t'2Tݫu5kHuL2GR7{uWZ~e"K>Fk!%$qO Rnyzvܵ:59{\Wds%vvw  gCHH̏R+úh,!st~̬Џt lSgh"O/ݿ*+p(R }k/fv$aVrŽ_99Z=>oۋF{TP2]Dr@Q:vufy^N*4HePF=q"ܨr (xM5pQhѷZp@ 6~jQ&$!ߕV]ߣHXG,6p.`1䜎ZToͩ }+3$Gs^iNdJdMf55]",:grV:lỻeW,qߩ٩iH<F ($ǧ-ʛf2)I=-cĚM6OʐVsN+}*[cECv9b#+=P$ F/@:E6!v<_U{-]rl{ Iuj K[;f2 Rr1ax;&o.7rw3qPȡ,y'T OGre[>Fcc֥Q32N]ʜVZhԊkK&i"y*u]{ύ# 'Tujug \}zVdměK@8M_ {F|Ncc{B'+zdUt wSk GO*uEYF8Ho$+SH!f|W&zLhȘ g{'렬Vwiy+YITs)Zkm% 4cɬy`kMsݿ*y%[s*I"PHaZ_k[sӰ_(~=k_ vMĖw1xKu㎵j~66wPh:G̠+dwס6V9ܭOE+RǫN"Pi_xno#*{-shpYVF9GEjƱ5f~P/f5ftGl؋3#nDėH(Z:.T\ \݅QyunN˼ zSPיIw/$M"RTc~[J]CV`VF uɡ+hc55j(-fYUV\Hl5=BbmxQ[ɰ>~[9#5qfvFV%;Z)L l+X‹;/0{QX?o~s9Jpc¥BvO_T8,O& qh#Fd#UIB\TPĩ^i[:s߭+t vGRS$~Xn_EӒsTTFEbBEZ4qrNs׃TgdK~F+QV\YZx01 ~unvJZ:!TpRE,b8'Gwp 22Mk@B1Ze F{0JL0VϜtjY%W>K`rTrHjxWXpR5P:PʁU.FfIo-ofC5<. j4Ds=G'՗w'zg`Eǖsq ZOM!xT,(ebv'l2\ M)YPNƻ:{nHmA"?vťl m-\H$S*1f_WE3ndؐqYb;Hbx\ׯ!z3ylD`~ޗlaFLӭ/wE|WtuYzT7S}x5R"+8!B9vUC6][He?Nk6u*Q!yVXr qVGVnnq)%sQŗQ+*?/Z| SO1F3E9IEY,[omb, R]!0X(?4jb}NKf7 &G9ϥ NDi7BV<Ո|%i-#* 5fꚵժBD4?u}OImAK6sԂj/fG=>'lāzü*cQ5xah$^Vd5W`& sˌ~XV ;kcpmLqImFDxx<{mZQaDSEk&G =q֩sadb_iF l⹁Ia #eLmF5(,2{ݸBj ʓQcvxTlHK<@֤W6w.Q6rU[j61d*nmt*aj#nmрp0MJ5ō?ZIa9}cO.,'?Ω6!X^#^Jc9ݳ*YgyZVx%|/4iZp'\ >:g?l[- s1 0JLWJII'c]3[P4|?-$#fG5Okc %ɑIF>kUtKM>G~LT~+ax/n ;⫴hȰr%#>f~δw9(W,} k }: Y $7*zrѕ\ ռ˒֭ν I.цSK]CQdD(O?g.7"w,UC( W6"qmY av c'eXѮ D@+zև$ 7n  Y9cޕ pl2 3\Ѫvh?#Ec{I,~T9e?S⹝fTnzFRlx8[ӥ L$&m 7iדȒ/ O'w*I^3EJ 1m;f۳:xqz׮o)Ac4q^}s?UY!Gz})V瞢jzt쏻dlcۭt(7%ry>-k{!Cˑڰ`񖮲#X7\KpҺwqs޴͚cN}k߅:0l&z@`;;YA]rSw 7#\߅{(੯+JFMRbįy5=\p)mI+8W%nSʹKY?J/ei03ylfT, 1@szW4Jm_z\4eYhaeF~QeNˑzn=Ǯ߶FXZ`iZVALQEGJnӞ^(ͻ3U4fFc`qiڂ1c&MFv?i rr;Z1pOO˰ #%JOSWJ MUĸyKy^-e '4ؖ/D]xܭ˨.Q*iNQ~Akzu!KԦZIq{ut=TkIⷶcpk+wpXxw97<=>h,r~{נB>E"Zƃaq$ *OPx^ݛ0"vμœ)gU 9-H#xH`E1ɕM%eXk`#E'ָNsdQa3fgG[/?:ͩ=l#M䷱KH^yo#F5-KikM@ z&. N 8 ڤG}{?Z wնg }|p;SF<Νgus*yVL'vZ~+;IrNz]&2P={Ա5 kd׋)[Dw$UUmqȲyhc>,:+"F>O›nkC,9 Ubo.&xyze9\稬_:rKV>[7f@֏αwR {JK@pwz*n'Is;?m$$ t~O; 6fb_,mY%]=nK{+i4 ˵yMԴ}ӴRUt.y=+W4-ɹ 5\\T;ugFFBNB$# lt)rmZŜy1Ryzޗ<ĺ-64Kt/CU_3M=vے] xCCUw5?yS~?(?T>eF[cOx/n'"lE(Z^FW/ҧGQL:BMj&z3ksjƵ@߃Wldv5CP56@=TYaQ]ZmLxBa`DZҴ ) ~댝gڌrv¸?iآ̍=j֣;%ڲ##VIFHrrHkߍbpߡoSJn|98$r+-H(7+" kw_{ @|Әb^JNEdS<+ZXdF Td$`R R+^}mye,x'"9-'2$#'_z~)Z$wfdԂ81뉴+jFX =k%:W eǸoGixaNjےCjլZP`%RzUkEaN8ZTjwRѣVLr+nO=B g0b8Ȩ O@jբ1ڪ1޾~M3D6хE~5~~Lds? l8& $e]tu]? cqSa`&⤎q1<>}rySfI'-!rnF@0Cgil:|cS]J;f VW"[*82`UI;[5i5u9Jر;g=2HZI!P?g}4vggOpC{7RI wmX5U,,eA.nd xS9)Ѳ)˧I j {1az|νyƝ7϶NkxTgmm X$Vf&^X4@!c"'ѽϝ ,8ygfhrpDZO4"rc#nq2ʶs$.T`)l,5;}TݭՄϥ{TSMU֦$]M wő$VE l5xB-Θ Vcɼk]IFl p`mtO uSIDXFNpj-:tdmͷxU/dIؤsyܓW"xKQ`/UaWiuH) IngMuջHXͲ'i d`W]tc[sɬŚO }ԺOq:, Vg x+N < ^Z?+?›YLeQ.ϨKVFsU8OsVwJ;#V2#늯k kRyr+W4z`Q?Ɩ&Vqiu*G?hr\'Gk;dyH]:^VdEkgWm:(m߳5ΦtC\ȻqY:zlɀ@U$N`>$gݹݤK+Sͳ)}آghj^FVF\ҰғTAvo9O|~y41o|}xW0Ҩ9 TJW<ⱋٝ,R(G5uh"+x5kxs汭-=(6Oc[B.s[:hz$iěg*Ю x޵2QVr,y$) FI֥7ǺHXv=x=j=~ܭY xM pH⽸ipӱZ|u\{>mlЩ#ڼOÐMJA CI. =k{ޏRޥLp9ݘbWn=dflyŴ`g?# VB0Yӡr )8EyFxK;m+˝Z8&[oMBu)Gjm7Y؁"Ὼi[8l0'Qi NLiWUK{>d EP{2"Ԯɔ`ewiҠTf2P1zѻY&u^7)Y(JNJk(n#FSv 2HJoߵwWPZ$6˃5@ir__<;#$dVƛV8_^N8Xiuw6) 9h%O.Z!_={ֲXBFy7d\o7eT]\2G+棋d|1Uh͍ 7ss~=ZJg;PK6Pp3 O$ |2c,0Όzg>ymaKc׿ݥkO*0i{a܇;gWI5m?7$>IҴA9Q8>Okq(`LPx1n@grq@#S[0cYQ1&cE|ztHKya ȑVQՕ]H3XjI5,fZ)`!Iۏjn_hG_#y`K97*YCld/&K|p)4QERb%%ŚI#Tns 7RŢܑNI~Q߃WX 23=IuSqcG幕湙 rMڭ34V48nGP^"p I)apH*~1KnoN/LX|(\m{sQ} gђ5ќg=?LtҠFfvNI]حI^5-nqڹA"X{JKlye"ٯhԨ#=m$c\/Wi -b8wȮvϔlXģ+!BM>CnT$u?*KJPUmTuη_p`zu;T井dr41?Zհ[+T:fo'!g*FlI% A~or 3*OML1ޠg$XZ)tK½39'OT*r[v WgJMFe]NV1cf*bc!&'Níݠ>:ӔLaQ7chfwU[~Λ53>T|ek,sַ?18Xrx+}q9һi(ʮ+(܂"[5qwp5COj#~j أ.ܪ8=yT Z6}#!梷'ڌκ8#{H=FOZC\v4EKWШJ }):c8Qm@p|,n9c5D + e"z4xY\$~U-3[1J|EVRQn!xZiZS-XRc5H*v{$Wvۼ$'GnM:\oÝ~/1?SK*=)cm$'%v]5_E(d$Cj.P>*|\r#MYDbI85ʞh^4;X<9c" Uu%LN>~F1-jM h %+GfHF~\d`&pVIW9SfI4a]Kz_ ̞Lz,WqVՑt$"J7K0s\676, kQӦ82Qz5 俁R在@JK܃Ҷ 4i5J7(#+iuG4ݵM9Ї~y889UE-KpkL ;~uNÓk_\kWo$(%R kVǮFN$q przxy  m!a ]t‡TF 3~OdgPu_Zީ_iXl pHn'G˛\ pj}}:H$|bU:U.EtQUlԏ:K$aXWph[) sVOuq$QC"$WC@Fpd8=ҩ 9AcAS8UfTe3&:eRl+3SM])ftyMYf9E=#<rTZ't[ӕ"Ĥ0 {K^]BcebPC/=+WKS[ \>Lֿ1gk* CwtanhFu(vOd\>Ρ"i_p9 mxǭt:l7 5R]ZL1x35,FMm)p^MV -S46tZ[K#|$!1 ҨfPQn^:.$#/6BsOV؞d[NIUIѸqV0,{u񴑜~,=jCYBHHrN=Ɩ{wE!-_LV쑒)s b=]0|ʋ9Œ:P°ھvwR,;J'i늧IE,3hdfM-2Gv6TrvB *sYLdhAAP擳.)̊:,Vf}(P9>ZʖB)$71%cbI'뚽 `T0\sC\j[X'Χ+kA9iާ5-.cF['rXKD NZ'j έ30$tHIn2@ǥz I`GLy2N}?˻Ӵ=+}4(lʸTg)#h'j#T2ݶ05Og@4V! ޳ 'eV>/ùrXl|-sw9 cN{WFLNV<ŷ<){e.6H0NF++QZj -qh:1̓֯C/FSw+#ww/cPD]u+[%$8,X{E{(%6^FciRDSED︷ȁ"9zinUѤ9.Z[1ےkŮм 8'-ߠ nx@:~2 H b~s 01WKU<֚ʾ;0O'{sXk[|0]wm.Mc%fM%&?޽y9cAϣA$RQG]1Y3F<.wxm`{Ev+w/ #؋S9^C3[9FJ꯭f zf%xmCͼό󵫵դYNUbRIՃ 'm>W zʍnj$p}V[qXsx%TLT˩̣OE~iqu1%ٰ_nBJXDrI!'WX2c/r?֤Zl.{xҩ986wfc-f0]N wK#siYrHm51z9jXJέY48#1bt ٩`Mp$:2?O Q͚( tvݱ#.>;ecѱQkФ\HEhКwdmFȫ(@Vc?jPꃑ1Fhw97"yIi3{tUq9*jtR%e[P7KnzE\wWjFAR}t7@&=<< JF@,fjtw&V."MB)US7`5w+BCt= KsGwFNӷs>8iY5e&P d[h>ʱKYR+^1Nqo.jgw>\*I LNd]Y#NhA~=lYN't@&|JV)'c&=:?hKj h~XV|KuqԢ͉slE͡X) ~[۸a <ʄwNAq]֚{̵=jK?j1G2KrkH]+9n2گkܼyk"W1ki4*'N9\+1c {m 1ԞR:8b&-J  ?#Ŭ[ bܥG*c'^>dMģ ð0iP +;H-pPlS΢O\1} Wdl9EEYݗ/#,K۬BLP3J4٭ݍŌ2px^[ 1zfA?jxqy6'_jƬqNO/Uga Umd*an0t뱓(CZb68 8Ue#`.tbZ\X3MJʿ"c}YhZf+I~{Y[%N* *bIMM%>lp1:]Vhlۣ,H?CZ?js|ֱE0fFfM\WF7|w Of) GՉ歭דMGSIYE/<o}ݿ pYw^֝ob W}m͚Ɏl-mUd^FE8Qؽmv6KGF;bV5vN*k-X8^I8}D1<I#hj:r\] "nut8 |EYK&ucSJ#^k鮇; ;=;I6cyGֶۢk1 fq11Pmu èYܫ ;;0.!lƭuT(*V)4A%MCʯXm7Hq=(~Jpcm̗Nff1E,ZדE &#`r 拍*B41x+2{Tq:)9Y]\ EVhP0J$h@0~fI+3]t ASEbU Pi6([5hۖ#jս) cM5)v/RD*Fq&t:Eqq]|JH=E..cq %x ;} wuۂUdVSـ;ł9dկWS`,w(+c>x8tf+CI,9 Zmg׶r'B;fn'R 29d5ʂV=\wPS59R =xiZ67NBS>ߗ C}FGr敵ͣ̈́cԂ3Rv)N T'EgŬyG8U: @2eИhIdǿ5Tj.NtK We 4[]`#9+!K٤Ð(S[2:Kc[vB.4MV`cVG56vcy0R? UrW%pVxpT4~k@*FPak n:{8Kjֳ;?Nn/X&@s/F>.ws1TY9nԵi[Z( 2:?0'L Qʗ=(Z2HGƬZވ4GUZ3X}ɸ/@ ДT3XtجɃ 9fƮZCq9O;Sq<{#h[Y%Eo5I <;p?.v+0֟ʞ%;mgr=.I_1^ OUI1X)$CS#տ!EU$;E0?fotocx/images/fusion2.jpg0000664000175000017500000004370715247006660014377 0ustar micomicoJFIFExifMM*JR(iZ0232D0100fotocx-25.1: Rescale: width:400 height:129|fotocx-25.1: paste area| chttp://ns.adobe.com/xap/1.0/ 1 2 3 0 8 129 400 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Q<\ sDXži) "L;y]AhيUnDe$u4aY ֩;9h#:`zY%HN{֦j"E˻eż,!] B!26U";#Bgv*Qcz|D wP\By@p9GiK:gbV`w+TخIGCu0R:]V:-цK1;Ȏb+*bj9Q ir}5b\m>z)Mf]"qt@^ОjuUcqLfOVkt?֥ۡH?Y_<] 9Ki=I`26T*mʧG*y5%F~‘hs?2BV5u߰>"(m.?kW]j H^.OFZ8|@@b3j283fA9?H>ƩTiicc'E .eEpxw*Em$B $=ihsH뚂B M~A-Y#d{)ZTtG6J'YE25! Tn<٠y4 JIes[<*P՛&N*.-les"~v}$R8s֫"[$#J VבYX{f"yn xPl,#楝<U?/cCճR/j,r`: 94{n =+o_ftkMow5iF涍*V5f|/$T)a\V}_G]K(6E~[G6[YiZ,ME,1ԓCc_-;dtr~D~iZPlyo,,tZ5$yUU޾xG6Z$ >/={⋯0_xJו'lvFkGM#Դv[o֐ <Ӄ'faL&KG[[(mRԉPDB*%ͭm\Rj9,/>SdOTY Vg^=̶ksm)*+|O]bHl~X$lNx=1j|8NPf 'ך旟,i{EX (Xs5&LWg"yXĖ+珊3Yd1Ϧ޿׮>]ӑ0fD}:os֖\hڔvi7ot1ϱL-^98ϹIZJf.-n`=Q"ZrgUٕ }+O`_V5_Ѓ"(gU^}~5~idf4q=U]QM>g:Fu6++$|-ʺ?:뙖1 sӶF?jH"5QQg>>3rOcݧ;o xjѼ 5,z -ZM"kKrw a9 cҼkSaa֐SϷwJvc b?QJgT=S&nOc':׊⍱4{q-|t nтO1aϓs @A=U[2ioߏM::F? ^~)Rsh#Of?Ҡ_6[# ?M𦥪b[HYFhw4;vFF8 gύz%7mO!׭-]G")v28(t*BJ=Lc5=w*'Q"8O??ZRQLf?^78-F]#K 3ed./$C/(s\{5u # | &e{3pwpKrAea8lu*XUtJQ՜4(<xT7r+NUG ԏZՋ^rsc-bE9FynO#ޣjX\p&fAEMaCi`ֵX$3\J^+j+4)!6y1Z[($D K^%tT~t{V:[x,IaeRk&zm3@I2`JH[Drwǹ}GRxJP|#W m3RGZlWzz1?C:ƵjɾlXÏPE}ox!a*כ?m~*|;o>"АUFXE}>TF<աB.R+Buh<࿱ A?>P0Wנs\,fS6B~R{wg|Y,6͌Kqu8œdWV{Y}ָ{ZIXBHI\ޜݞߟ`r44TaUP 1}A=ko%爼[mF/+HnC|@dU W$p'nDoŚws _n|I=q\κ-z, A{Vl;n>b+=掽W𯋡,P̦'O˧[SA+,5)t 0炭j|95#ot0yc:xXC-r=AmDх_QL-~=u$%m==ǽu娻{R G d8kzxRO^Y+YzeKe}g.<{H#*AYxpnRw& ߝW_Z9?P_G}Qo_߀#ᎠLdq$ ,)n7 3x_#~Z?'VHnld( 09A996xFZMi'R3qھ_Fx=62`ED!P*ԎT xz^rYk2}k ,0?S^hVn$}VcrW"';ouɭj %SiI'S7Q029{_fXrE]qL>icP"Hr<_@Hۄ;{}: *>b=xX\$CدTcdz厭,NHR.稯Qsge}.fԦo.7In; 6Qcj1-ࡄqөWch׈ZVs,zÏs Te;F+a l\ p=Ҽ?%%qh?JFվ!ae5~KWh_-҅2־]iWi{xƧrۧj߹ѧ$.hO"^⚩$st"dx^=EynjDl7<3;c3_Wݖvtiڝ׶s(ozwSw+hII$h**荿 Z/HF|t)Kgپm8G|[H5'7M8?(=GZ$ú4@9ǔQKm$`-܇Oº٧A?O04Y&decbY.mrW/<-mk:Ǝ>l}aQZ3>1j ٵWdeuU ZΟkBcMwE DPQ'f9kLV>Tn7[ +'Yɜ 8ỘmN!Z,kkoh_`NA:WϢ;Cƽg+U-ï9+юINZLZe'i(|_r"IU;W>wܖ38nb$V =E~f8 pA ]~.6b]++g{^xo6:7JLkFnҿh[5=\o% j`[7KYPM}w/J2HG0߯;(Ҽhj7jɎ"~϶GNN^ ?tzVPiV+cj8vdԟS\1@1o>X찘eL~cvG\0fkcIF7&v/c}r2ka+uTGO ʴ}WQ/VV  pF~ϣ*vkje#"nd!BR0剔%*S5v8T)aX?u ˭֟!`p~du ^h"( ƺ[(~ @Zb;ϲtZiPf~[DEnwFՓbe,`i5}TՇbe@9;&*3 ~ѽj\xoT\JmσUB9Ozݣʇެt8Ҿ$j-iEU;3zϋuMvu&|>zP̝$Ϲ|{[Mi4<M@#cNsysm"K!g`u q[G8ã޿zLQ*Eg8zGFii[}}/(Ju$`}q<%{:+ !NAil"i\[}[X/&t08-&XX;T95%i{rg^c٬!+lj uxvdǩG[Z2;x3jw~Bpȯвc%.{= ^&*WD/#0QGZ,)ZZI{x^w^Oi+i uV=ib4F+b\4ᇊAc\|>_Jʱ8YeWkSM"7J#J2; `]j;\,j[CkemHqd puZVurLf#T!)$u]-'gyVCOL alCpUi;m-of>: IrbR~>",(a$e+{/2ig!? 7rHf#/|5#w, >\Du9''޾ָ׳̧?A^>aJ0fj@U붫 8mdFհL%~޼]_"qmҾ5 kmv:CB*4t}ȱ#V0ў.mMjy3rB6H=I)L6o)9>Ӥ۹7P6KzֲLYj/9< ~5<4DЁuMSQRjM<\mrz@y5qz³&p圗r$W9Tu9Ϫ??iKPۿWEz-MM~-P/#u:I?w]h[`V*7] UϝY#U&G{ۖ?`ґs'oZzsQR˰UcYL#jcXrhd]sPgϻnsޤASZ[ CNJJvmRsO54֫oG#[Q}mU=0r,eݽ)C*|'~ߕu b|5,r}͎g涺o"#zJ'?Jeh։sI#v! Iu[{= ċ ŜP'פiYz8=Gpk^*qYpG|A$󥅙2sAǯNH__xxG0nlr?=H9=q?$kMօX^P6"~PG  7$W0,к0W?Ҭ٬igD|Fku 1)!jWɶծ=ӏ8Uǭ}vr4Rڔbʸתhq[k"l ǭx-vmeV9ݟJެ-m ԡ6}*=e쮥8<ZoFLGT79Zɣ3st,/MKa~T( N3;#\֩k%[ɖF9V #TfgXԹ&"M+%ORA: W\M^e`~!KkWNk{"P>`)q#Rcn:G#J|$^7 +Z4|EgU7GrZ9Udi:KcL`ܷ6p08Wјhm$K*ۮ;+i,٩Z]KWFYXlnqf~e!>KO0_N8n=Kٶ;B;7SPQ!]|v"K1ˋB+Տx/;: 2)a[uf|NFi|cXoJ"u]kIn _eЯ+1O]Q|H.2َ\\{Dgo%x禬? izϭ b.kƫ^,_N?.M0$-8MnT࢑"?V|WfU+KExѐpǒx^i2Oc_U,+uqT3|ɦk0,LUDZY*.]4mS\,w/ZSQգ>y*8eK8\_CZ7Xy_SЊ?JhlZ MSo}1~VL_o|ϭx47+$R=axmJ+P{Ҿ+bUHW*^f8WNT`q^ @)7g^R20xޱ&0]r^=ԀdҪ1ɦ<4ׁVެ}(r3Bģ=*Uu"Ի:iB顽[!$^0;TvF 2CvOsz$͈ʞXW6%Y$n]OnZFmq a+_%1'%eO}P4c t Q@Q[}E#>rcs*<3sUs7; -|lAa&5>~T\NWXOnpCÏHuP.3 Mk ԍ%W+-#.mi(ˏAmH}zVGgF$aHE_Y%͹pk u9|'*һ+4XdGx |JMdvu m.[dٰ<+ BE}CG^Τ~czt2Տs ^=!L]MypsXk=fJzUvV!_EsEă}J2߾^*z0*E!&؄JIdVRcUazG+!1)5`*5 }; s1ڹrG_P]h)ͅܝ#_OV#e`ۿVKVgW?/>"w|8>Ԇ*MLjFqʏB+.Wsgi+EgO2&U[=p'klm簾>r7We%yfEp^$ff\$~?ƾhLJ+S,G 毥jJŝhXgK ['ב]G9_Giwl^I↷䞾`5Iy#6]Rz |rYre+7f),'Wa}DKmI$=\JNrugK[[kIi !ݧ]CV#_ eahVɲ(P`I9$I$MsNc#_/4K{KuKlB~t~O&VQ$1 i_fPmb).~$  VW/sG7n^}xVT]O*Kt Zk++~FBi'ᷲ`hʳ*90}|3l_2;j/Ef6qioqaycW)ɫ:GY㌫ccPA&|S'^ JKCT-.%kܚ.]8w,[*jrfϋ>{s^]*-AHɌ+eE/[BI:DKs$=gg++W\L۷{Vv4+nl\=j܊pI?Zևl%yg>c0"<6H4v$bxsXQɷ~_ Em7*hmFK W?B즱?2B1 6?5G o4{C媚>q+63eυ], T) E$NR>2)jK{grš75h 3ҽN W#`9'* |{ц{7ʶ"+"Smv+; :N]iwVLMz]g2J$#/ס+xn Fe,yG{-|I,I68+WUcsʩG9l$p}W#755]\"hv$S0F6Gr߅4ivFfIl>6#HTۀ*TiYN&\:ďڜЫY%ME?qB7g(\xT5YAVu5}rs]G37 y5{yX{Z.DTYpyUxQ±9?wE8=DN 8z|͸\ӁڣW޴VtFF&KH*qWࢊVݟAE7|tŒ"IE>xX6A~pxZQ\YSU>s_Һ}+CO QE|&+cjYu'J(WcBR[[s\+D4o?GU]QqǬ?-?g^"+bEy?[|E-#^گQEz<{W^ȧeTQZ=G!o-W#}EkEhfaҫ7z(0J{Efotocx/images/painting2.png0000664000175000017500000021571315247006660014707 0ustar micomicoPNG  IHDR5 IDATx^ײ$I%vT̜,IU6"i@O~ X3=M޼y;13UŃ߬FL=Jspwr`GP1'8@DD&"23wW333A4+p̉8ˏ[_ 'P '\-CcjYZ,]4h>)(2c9 }טբVk- 3s`rw##"f0RɝF"07q̛ȦAXlڮo/T#;,ttbBfܲ5+ :U"Icfcj%fJ`ҚȖWI֩ 7zy(NC\ Ii+KTFbc$?l> wgf3@p'aw @)OWyQȾ& DÖY?. ՅDLDDpˁ _8ݜM喀;IxU YD,<͓{aIY^c.M߄΅n"jZnfRJιbwզ ZN%z~?4_erb:]W7ZU5Զ qlN| &f`2sj5LDZ"y3@_0D^ݘ9 10U['N96 M9;a12"H}Arb̵r1ƐrUR#dpp0N$!r "1½j֬TSS "XfX D怓fu9`Fp&0Y<+8#gT*fgOMLY'* S035RtD$28vIn(^ʱwjt9KzwibO!7\PEDh1 ^Zct'K b erLprlE ȉyvo@ ȝ@1@ ѐ"3E`' &g0U˜ØsIYѨ˲`ɝLͽ61$1 qcJɘ`UC D 5"PҺUU 0'I;2 !4i1kš"Rۯ6kNM.Tԍ(V IBp5L<7ȍ^$VZ4WsO\g B]ȁD?G!'UW19ܾ@dY }q' #F%ɝԼ'}uFԉLy7}z}ޞތO݇<$i>s~}զ8/cAk͡ ̺rQ?Ej?FpӪp'W3uS8DdO@lNOx]DhNn "Xx$'v" 8ɪ[JVk`̭*i%˔tiJm)` !@LɈ9 }Q{{e ,TH8p2+̝E85b&f2 RkUe#K. D.\pq"_m$te\HN!0E[l[v\=F7qk\7z{.jjsTaSr s \{lR>1qP!vcAB12λsf(ՠ;W%)yUUboW>|:<~)_ΏePK6if1Į8n=Ʈ zv qڿW#P7V B[R(jV āIݪz0&ZeJID\jմZLThK :\Ba]96>Lowo~ϻw_|]=)M3K<;IswwÛoo?:<)GDNoglcH;CNXRCF;z:@0ZADB )D9b"Z3x c33 RD‰94R.r̗t|}}~?_.~u?}8>no7ݦ ̊Fs[hG!j6jsalVsƹXXpqCh7=cq.j a 372# StFn4k-VS#`9<_Ny/eVV!U`xyxyJ|ؽyVS'~^޾ߓO^t,p `!2EdF' 2S"p2O`q9_0ʶ($"SvWf - S#Yd4@p8}otA/m5۟źiJ//k=xCDLkϿeZϗK'q5M懪սv)n۶*<.㰯GcnbwMHIdf"̑€DD#3 ^Mq1j!XFk)ŵlMJxp(6RiSJ6!6^x,\.^T3[fH$)>KDUb$fNiDpSUտ ~R,On0"Sb%b$XDB&-:^.t9\>Ϳ~zMD(C뮾"5ZYkiSwn&%Cpû^_I3kLd>cx8?`ϯ/ >^o/]5U%clۖ9Z?~8LxjFm$!Dĵ44keFU63f$&aq;LbDr[ p@qђE#wԉYdp<<ĉHJjlHA(Zۈ:>~|ÇohELS"E0"DcBAtxW)ĥJhh? W]2OǶK,/ :rn BLm+ETTjf\zni(~*5"A|a"iU2{n>1chϗrL0|+v>~87?~^uɔU`9\y,?xww3덙xn/!xZQj DѦa?4D)a^om/^| 6]_j8K̝J)yv뻫۫iBYYҳ]ypxl B@VԔJoWw3+1x)(Ԭ$r:kDh-PcBBD$!.,hcjɫ5!FpeY14^]LYynmM+ ͇8as$ū. ó&5M~|e^ϯקþib_\gM&xJ׆ExJ)U=ƸWuJisۖq|;Co?gB,}ײ# d y3'I SQ]U 03_kD^k]jb !.`B8$b6BMktM *0|:kBagvCf&p— IDATbӖ)SY#IhR}tD|:ooӵN 4c`Rw]tNmZ]< p/=ˀf3jvyQ 6 |IaVtϗX rZjyܟؓ1r-TRRxGoOy8fxJ!Z qZ'czմcJֈu2ը*5Pm8|#YquQ͛Uפݮ@Ƃz5׹:8"B*090MƶcPDV?MFi^Y69B/!g'UUqPլYUAnȢN0DA`7ZD6$$LKY4v<]?ݿ}otذ>_Z)gĠ^Ib&F9 Ѭj.ܛ+Ȓ7 B nLfKW3@Gd<|z]^%I Œ%LQ#RJ5—l3! ] qtyܝ.s۫B|d7y=PI鉮nLUy<`& ܓw'"gznb4s"f&"!Gxy7x_\m-rb q*\JV{hW-TEn(#pu.]c"шzF.POxB[U 9D^kZ: e8OӤ:9C !3iX W:[irkޔ>%BjDR~hSfR&Tu]|||}ss?<<<>5}|~wmK0(O41N#P*elWD4̫͂I.s~<\ι6뛫_{ZΗcǜ4Mf&1Ffɗ#z< a׷_dիt"gEz<9 2,)5S6(Zs5rũf " ;t(\o߾i+!vsC ׬Kι:IMCͶN\_fvZ V5"hDU5Dž:"01v9!v}{{6cv033#&rKt=<)VU1C?fݩF' 3e8?>0Lv 9̽ j-mz8~ܧ=2Txf'i0zgmKiIUsZ/zU ae6+o]'\=gg3D/Î`E.Tu=˦iaNӢ]oyM81뛝6 Nݰۼv5Yjj1^!**")К7[%00#V D0$Txql yЇϿ/O>??%\ M.2Bp+fR4G Pv̢ETd]VI1n;ts궻eN!tM;<==]s]ۦC0pw82,dR^s6]_R黡Viae;r)PsJPDRqn3t]W$_x/qhco77i>)O7mAr*3f/"b%1UQD֦SpHSRv4xTT²0noO)|:ͰTlg\&4Mscr]ט7æ ;V%l`k2 V Zöh *?a՝%a6$IrVZ2/Tˀ4ϣ췿nwxxݗ" !#]9\.9,"mOM4Ms\>=`y0lb۶YDeYkӦ]9秣]x=z{54ɸK*þel^6q:a74mo~||8'QӚ9B@Jj,S%Ld9ǻU!W7RJ%eɅziۘrzzX~뫮 hZU+%W@jt@6Ħn,0{ _f?yj-dL p@`DIk~??<M##vLDBlߵ}_ƶ/Y.14 pleYj)%f 9w;ͪ3MlۖeY'`̌jgǧrAv%_mZP(M)v<Ϫ u @Wݝ_ԼRewϧQ~8\ƹxKL08R8"2 5<+f5眗~x{|e<3o7Wpy\&g'%akZ ͖CW5!nDьD  ( 8#0T00sHȱc(ŊV0X;ր_3kt3ʚ?`wY") P #ˋ!S]_e0Ԛ'ͯ:޿ryuDym<8j;S"1Q5O\- _Wݻ>=>>];-x9?<9_ٿ@a~ok6/޾o~j6)Z H:K4!4̜s&r|jn&s xLͫ3?>>r$L,/_hɋoTqcBA]ㆻ]@@*?0[#@4D@& S}|/KY| l+գ!);'Z 8|Oz҃A,i y"""G&EUklDU}z<STN~)_|)n6,~af JD&Я͵TS|4!<2RCb\~xx 2օ!UwДёֲa|q{ݐ9S Z |||>Nİoj;jq +P?4ϳqP~DPJ9:aP("8 h>yk|0M t:b47%n' yXZ5[-XsBW|%'FL8~g1T)٩qÏ-F$ˋMb E2'TH*\h톈Dr9C_iv}Wؔ'+]؞kj}kNֹY""fv&vև7f9'4O2NeIR>m\iͥ|$ƻR?}նN㉙} ϻvٽ9^]󜧥^ƹo9eY9Zrz;Z$RW06Jj9aihIiv6x6h>Ajh]TP5!WPc{)'ŵ!^b@D`Fk@"O  ȐTU!`I,9?~')BuzV;60BE 9rNbLRSY:ُua9rrϠַqxUa)]j]Gvxw!n7C6munʠe9>=|~zڻcxx<^iG4˓n==?3зp%U8"ԛf88#y͊Q5뜼6P]U86ֶm"96HL:^ں3>jVsq{ߴͼLZ^.GӼ mgP*>6M5KU@ADEd@Źj`f!! "Qr-E*c$F`5'XzP .)>wvD)"ê%]ƳwHŴav.9'd uΙY)RkU0 зmK"L=xQvǹM%\.Sfce%ӝ JZeI)#m軦x9EA`UVkmM߿zuuND]?4>`1P΋,%gQ5b]ӳaB`e,9!:*LoTUt:I iՕ'գ9@c@Tgx]NMkjM|&aY&p~ɥϦURHfrf׶mv "9/h]ߦ@>8-s o^7][ٳw̬jYQPĬZjUUV\~WEv~ؼy|>皺`WNcʥ==n8T<]Cqc4P2.p.bPDj]J0@-'n3îrfU=8f7^޾!,RkzTKњj}׽6 8TDp1غQr"wR U8Ed"CG}Tcdw<<ϵEjnL6U֪޻4Ohnzw>nV@JvW2|Xu uCsS)@ۦep8==?ϧkd۶qLX 7```HDLy@j\DtsJ"dyRZD0 RԶs\k^*%;ǥf3 >Er!ָW28!Z8X x`JZҜl ޻~\Ɣg ԣyEЙuP}+cOZIC,Jiiݻ3j55!I%TUy}TK^jZTky'5=!71ZQɩf$\SI1]#&s^Dif?"fд wWf01OOyE8No.t#fm|~FE VJ~08'b:`f̤*"Ri]3":$"@2-8-ٷ}v캛mv\DH'b,:)̜s1ĵn@ b}.BD8s)%ޫ*Z9-K5X- "MTMA? SU#$$QMiNZع{y/fγ)*! Xh-FD|h"αwN") @*"jd@ *% K>k_r_:|>ZٳT3t1vbyZڮkZbZSR9ǀ093S51p6}Gkɋ9^3 ~n&+W_UޤWw?RMTT10!:/Ow펕c0 f3Z(R27]ӄ4*a$4"3j2iM2"1d 䌪c6`z9Ν2t]!zc'YP5 hbWq*:P C""B=GdUm/L Q3Y5$$&"d&pPRM)?.tNΧ뫫a~e߈) 09ss弘Yu]יxE.{IxUjM\e/r<jQ \mz UVf?h5fd*x΄87񱋡غ>~zmN9!s-*B5xMD!sD UQLD<>zZsm6eY>+ϾZURk- )*nJUEtԪmv!6:&%\qa Ā*@*:*SU[8Hb"dO\E@ %UU3eZ˧ 90Mc+Sspmqox.WR]ݰ M̩ }߶-̜sm9/ʁP_E!s̚knr*u"4MSɭ]˪"/zU5(sQ&Ʀoۮݶܸ֑o;j% &Ibl 99wp-+!'͕>p|u@ŴԻϏk#9o%\󄈱u9 G`ʢ%4/z}CLDʤPUU3Z7@9FH ,fUHѢfx|>vt<+U#Q""@BTR HkPL SSGv&NLU$$f.xB,#r#f$S/T}E"`y,Evk]_yR eueI!w)zjKNӘ-v x:*~x9U2-Iei~e,* *jFNTSr|>Ka(EUfݾ7ov3T\"2hDf)K)sE6?xS)UTL$CD;"mM>g=>}8]O֍w!tz:ЈKUbo=oxkf.Xj5y^,-dEkE 18O ffHD_EH@TXM40 1kɡj{\h𳊴*5xF>xѺdo߼i*bӔs.m7TRJԚ} E"PtԤs\`8/%XEӜԈ22UOwǷoos&tQ]o~+m/ǻi#Rv] WT)! 󲈈i%n9{v83*jUU#2s% bÚl^ώLUf:wXz9Ȼ#$f' "+$2F0B"!)"2j5A30nҴ*!ڿZ+V DdfxM׷톼/զiyzz~~Ժ])i{ חaP1shb+@;\y FA(Z``B%tۡnnsf~Wڼ~y~7m9M,4OeAK&?GGy>h.u.%ZR.ܹf/"Z]椠c\$"I];8}8] vwZt~%]6U0v0 Lߞ/Ow뛶n^Z֯$ `$١ FD$zq19g"4 D)M`J@f + 2jf??ˡ2ׇpx>>΀ջR U(0"Кrȉ\`DŽk\z>dj>yCpCKY.2|=S"z,e_zoo!64i̗DkqӐdLRI *yYidCda6B`! jE`ywt~ÇQxke>sJOoo_5Oۛ7o!Ĝ3J43\֒ðM)9m%.?>m*`BXM"2^.iݖ^|!#~ [ CRжD"NX} ҟk) ͩpW4|LwsJS j-*yC2ED{"j!nRi:~C6IK*yI1R zlڍ,9_p:,Suw}V9T9gKUTF$GlXHm%ZZ }VˎjQrl uq#<G{adLB,J~{}c@fFr9?||h;CKɍ֞TZcN)Y)WUk(gfjE3̴ #F*kOg5G\mr0_ Kd/fV15 r?_. i^Rr^~;kl@9#j!" !(JTs.\I x9 fmTa7vJ~|:o /To|PӔO\L#Q8>ֹkiޑ/5n[l@0HLC #(VTp"5z^ç7dIo<.Bߴm3|x.q?|4*@Bo/gh^FLDBR*jwV53$R m`2iDs-k*(3hhWӌMz)!E3Sf&@Me mw׿}<~1ٻNjEDfjJVMESiUC߶Tqts<{w~vөS]qkCD@63qBuk.>)"!.C@U "_Z|"bN3l_Ǯ= T"B\?lDz%tƘr;nZ"!A|"'+HA!5nu]Ǔ̌L{tw3Î[UC ✈8qm-[|yHAT $0%5H3X)bABUͲ2IY4p:(2EMMvp,\{|}^n?@GFW:K<@D#XLN;esIȸ0Qc8ҴóAçN~sViNSNXߏ%A_Sw4e)*;O RV7LҲ/~Vxo?C=;fxo>XWR3&410 i9'sEs:8ڗ%{?`j`t4F0Ó!;b#qy}T7$ fXc@ɑl7rFYv$챬b 95M5eEAK~| bJfXVH8NCSת{A PI]u]W c]1ALfc6~L]?%1kّHSW9\>`ZW˰.p[EeQ8rqsoeCOV;YyjۏMIMU|w6f{vHeY5d44X&B)~bj֫ص-WrOժ*KU1315@Q.9EUq&3Q(f<M(K"@$4?bt`Ƣ(CH8cU3% t,̞2S<)wD<D]Mh=hlhf&hPU,ٳr6Q׫eU$yBЮ=|z.ٙs%K$\((8U l#O_:TThxqqQյt꼺h T,ˢcPAET$&p3 U@E"B P531$RtHD߼O(ŋUJSUg1<_}d^6%f}qxw;LQ]Q&rN9C湬Mk$54Oix^6f^=> 4Gɱh4vެ,훗42~n_|F m߷D//88NǖMRflR,J_ox8)MfP2GvK2#Ղ&M90K(Sp~dFEp(bM2+:@648bJ4gϯ^1Mqwڱv]]<(hI8%ri*io?~1+³(@amtA1shDHͤ@YUmfm"4jf*SJVˬ*Lsr U6h@HO`&I ո_w~O)weYe)) yb+8Ĕ`(|QXTEXo>Ocr28̊ge}"(S,d#wEUE&SwZ,2fuݘIj&SJ1OC<قsz Ʌ%D`Q9m={$|˿?OcziQ"peiS   Ƭ4/bޫ)=e٠ ey.F8"V+"z?@@$IHu䠪"j$z5';L "Yg"$ ٟ$ IDATBRJH3q7TUyuuώ廬@IqUׁ?B?!tAP? HȈ`vP'F`DllZ&fQճE]ta.+5$ ǾiRn;@JY}٫/mx8p=fGH IS?E " Enwftyڶc1$9P׋qv>8*삗rY83`eQ 1CC"9ScYPpLl0Ӓ91]2DBHujsQ{BDf6U4S@230n֪|{zHc"\vllj{*g9{͢yi0vݩm1X/+BSUUY,S9g )LҙcϘd4N>\LE/+.`r(%Y񀁑pdQ㡭tlmzS}Ap|`*J<[nVMy:<ry1 @I ;ճMGw'f0˂dιf "h(iuTN../) |_)@u]eTUP JOE4MS% d`@BD\UtO/G9,k?^z޷Ë痏LJ="Vpva;noawOgWm{B&ADڶib*kqY~77wU qRȔ%ESUu-"ތHY!)w mSr,UE%UӾq*lH x{ ~9].=>]/yڬsAT>Nr}8^\w]Ӕs8vRbr˦8;QyxJ Pak#t.t̐I 3!bJP# $ܭ:7Ϭ"ڞ4bENDD$l36L 쉱9$2vAĀu}ήkպ~x8@@)C0S\\H>e{)BQ wSwOs.H1S1BdUL)9@6}ΙgSc@d7LYܧDf4MӔ~}<1 un˗/4)Eʲ9Q$U"2SJdžlW./_]Ub<)Cb!L̀ !a:vEb4ӱ~Z:΂~sJ&b,.}-b1 &"l$"`s%$ fF>tMlgϯnw/Wqꎧwv0!&"$ X&cdc?.\U|UePNqͯ~]bUԎز p?~38]9NCQ!!~_zyD8O(`'k;`f$"H8WPGy `ޱ=cf;|~߿Բ/׋r}rhzڮVUQ"ќcR1HوӔ!rl6E3~<'Th9f"V4LP0hf0f@^Àn>?EQ/(6:NyJP(I93#2S5g!T@%Jf1v4ˋ/^uCv- p{Sv"ILUĘS&F.ݩ90_rUUoǶ#FTYi2諯Opi`~~y$rHDbs d4C3럂Ln׏J}I]1'3IcwÇF,|oٚb UjJ1^,=(("29"IbY:F%_W34DyE(>XE7ʔrj qШYlaMI1g5DJ.8)055Df6B=ʲleU͆CX}fx<UVhvfo?5MSW#1!T@D2dRABC0@0E9@.뺲.TLNhf UѶo߽ «W˯~_kW(Bpͫl*IJ01""f1n<{vK(ನ0em۷ޠxܬֹ KHD88 BYъ4 rZY P)dK2UաTW*J^oߨynþjօc7tLٙsBbN1v}gW^~?:̵s9 0ڡln(gto_N4gfUM؛nwvxw<uY!45#cu>,4[FFdVb4qΙqKaCjEVC ǿo!bQ7?v=[oV"8052LT;"L&HLp~(j1MCK;n˕e?ߍrSUŦ4rn9Otl2K&HY0Ȓ.@J#-/6U@&DP>'E `d aMF]atlKf'}2Mݿ=S 2ZYb9AKDd:<ږԼ9&9(S?lMY8/fa[v>ƨH.lH83s h9%=;f i> f:f;Fꐆa<Nnw}z,7W_6C"4Hc߷mNw'BTӜ2@̀`%ca5rR̪)NX8W98@ j`D6A@D`DR%h{ff%DuTbSh``H)KJ9WZV@"J,:NCF`4ۘq 9.:D$*""4 !*M;۟m%UYfCjXvSk]ޜUEb*%b6,BYs@L#8f2# @(#3C$DD ```6WF$#x:TсZ1vvao??ɫi/RtdqHDt*BUլ19G$@Pzd+/C 4"IHDP ezbF06g~`WSDRIS`O;(eabf>bjѠeF0Ӝ#SYm?AȖrm۷Y/3:ppe!H)%PTqNHȈH wPE1 xw,N5U31MU}4LYRչOuJ PYY V"")#B6D0CDF8πq iZM툻aƾ;vpǩ oQu4a"2{vHT%"AՔγsSaQuU bF4f&ba23\Y_=x i\,fYe]cb M9M8^\%6=&|_lF1FRkV5$N13ɗ۳󋫛a"8u}?Nm?0B1UD.//e/s&`D0s(JRJ %`jf$ XV,p{sVm].!UUTAECˌUU{Ә ͔@MF͌ ďhH٬뛇ݫK2" T'dET%PEEQNqd1Hc+3M9>!8i8SPجo|`bM]P'@ l7O l32A DHw>\7/ ׁ=!2unoEv7Upq0@MQh6,(.//0☉ỲQS2 !P$ќfDtF:n? ٳ71 ;jGC1Mbkc="N])"qi:tꦔݬj^5WE 9gb2(,в0UKsDMY4d$\bó qx{CaQ7  f( @AQ, _x/Jsh]Bc}x@E"$ cR/ .b,\( P )(*ed1|!@61Q5'HD6$RRUs MY㔺kjj ~ݵ"!ƬʾisLV-!/jQ,Ӽ AЈ9#G._}p|l߽;_o6&Ț/ TDl詮k| 8t7WpxLo׏ΐ/*5Q#S S\;t<Q(!xuYj ={9ԝS֪42tC,f &͒3JJyjrn$G04-*_Eɓ4 Y,oo;8?O Mc0(fg:gg S$0%ղ*EEU f gL R?<|~>}ZhZ9sY#yxEpth/V_Ǿ/"zrJ)Ƹh1M8bpΥժw? onS{/"4Ձ//~ow'n>F@hjfI'hs$R~w!*O?>T5$1B0,.g?y?!)<1Fsj0FQpjWgt^lйW__>voJ_οx~EDC{qwWW/jUUDP-2 IDATS b_xu(7x~sޮN}[jbЀٳ3" 4fobUYj٬0E*2:Ʃ_zxvs 12Aw|bi<և'^1fT1Kq8v7ӱqT{iP@lVŢûo}=v+@6g Щ(9V7,d)%"rq<;;'>|dժteY-YJ2a!.Wlvv7~p8"*"< a@爋`I'*K"JY0un$'`W1 `YXmnnaDtJӿvqfU|wknzY\^uUuݬfQ@eRa)<.&˪oov8'0Ƥ.#2Xz WD4e3"p,2kxni<`wwwoބۻYҧkA;y,^WΏ>F0kDBcD&DfT'OPn?]uUb_bPoS?;(ʢPzߏXl=awyO8$w9~~?nLDtvv6MdFXUՋ/7MUUC70`׷hۿ׻qєʈ8˷WD0B1gUDdv@aH,7@?|ucL岹}|8t$V:F eѧI^8 3+/fUF_)` TD`fE2UM6萻SԟwX՛8vYST u8{c? Pz2ŒwFDaJ5_|9d@DCRA͊Pl: Ȋgl$ʧԷBPfD>}5ñ{lDˆ}i,eyGh0}םF$ι4޲/䒊4LmESݿx_ϺH22s!4@#"3;N)e.q_mwSbͿoZ/8> z\o6УxpBb,Kd OPPg?ӱ(ٷlʫrݬ^\/<أU3T01SCe(!FWYPр HФiۛ UObciKt]XV?}~֚9ZR&Ƙk>! $cev{DRjݿy& z9L"ܽ=>n߼E.s 13B S4Rt&jiN߿OsۯV__MEon)p>N/~=ӧ z&c^!#yTi#ж_R]pf:!@V qV,XGzVNӼJ\R<·>|g ƾ 7Vt UZK@\hH9v! s<-ܔ_1a2{p~ӟ6ͯ~7E b5S3fVM@M/km3tm6mlP??]y?03.)Yלfs7m jZYJ{2#;rc HAJ_I(E91Z}Qa (0NGC7{c Z/yT]Hι נr>NCiܽ*iϿ:(jbp}5 0j_9""3sտ7hWk9)˦%CqW| PMٷ2RMr4aX猈j4Z2-盫#ryI>kz;t1|8_^T2: iAZ6yH2ȥ]*s/_o9Jp02R`sf,KӶ!sr8U s{{gyKyVÛWK)ò 0 İ>u;Oe+MXDU7a! 0"U1TV4'\YO)!+%8Y7?__2OR"jjh6zGhsxiEDlN 29_,xEi|o_5J*%RJ@n痽}|r.0XL =41;CZD-D8 nB$P޾g ""smm Au.i~8ǫF.9yw9A7)g@EFwUzs鷿uMad}hCFO }C {\߾*y,[)"hd yZs.b)0 ;fK)qI 2"5^v?}7WWWe<|ylz@DD3v TUUp:<8NovSS AMZ*SZ jft4ʹ}R1CT%/1yxY~ߦۦ nݬCв'R Uj5\iXc"LFL;Ȋ}ၽw!yZ9o.z4 ͺeK߯&v/ ut8OG}^=?̷7[{9\k&b5@Esx:ȔE?=«WDa(B1$hб) Xt } j٬w_bY5 ^D%c/2.lJ^m 88|hx%5H@{b@D3ZR-XEfhbwoSJr86C?37>T`7m.KlJ@ZwS=F"B!#ZEK?ҧ~.zdF۶BԪVd6DԠT2Z>{C6C݇班nSbla/EG>v/-yRϱkqSMJ7Z \]1wr yx/SiRM7-ͧqVbR8 D% ݪ_mfpiDBhVxvIUiqޏ0{pt"LιsJi;✛3"c9Z. rb$bl<ҶݒJ8ðZo֥8Ъh)P]\[|>3VαIڶ) 91Js4< ٜRSʢ9w:lYOv^1x8M+A˵xﯯoBleAFTVvCh^mQMԬRK]|pWo.t]=e*91S5Uw@Tc4гw",2-٤x@a8>?>?>@9rT)&Wo?}4{||\2͓iYbƹzKVL>"[ zU2m6uje:I#)D.)ck _+v]{s2|QS۴]^13S,|:SNe4@"$ *]߽{sَtfAv +" ybj*`DhHs읈¥$!2;4(j ?\]pp4 v핓bg%9Ƈ~ ?.6ݑ&7Csz~@ɿWLWRb_]4-` !7p<=703b 7JIIdMfCW^euhf6&S*62["GD4yhPs۔u ιZsE 9\o,m׶)QE1"r>}zS L/ oc>D6+x_]]׃u,KޮZKvMƀm7&TSSP100%3CCn\6:\jRyTUJ,Dsh@L>4 c Tt.G0"p:Oaq=?9"jbSJI6|α ip>\uWWWRk[۫.yssYLBa&q^1T7!7iR7jDtyu.SL"`..)ϧQ՚&8VW}?qxfz|0u&ZR WWWmS2PTh ]ٹϟT9=>|}mC;Ogx1R %g/Ϗ///woO|ZΟi\xf~=BӡXjvk^`pfjx?K&vεd\K) 5@Bm2@v*L_aa0\Oy?#z?C<@L_U-d%??|꧗<ʶn4?Mѷ8}뉰ëǺ,s0*I5 !T0U͵Wi.6i7}{=j;>?m6/6Fzn>TQ5Hq{j026J~۵}lWm"@*7כY|V))/4 3@Ē[F6!"3xRvTsja^s#ZVSU)%/Zn+33z630(b;p?l㸤\b wf֪7OȭWEu77׎3C(9O1+htMcʹhu))i}'\dQUfV"&7C4@Cpg"40@ &D ">64B! @t9rNj` ( 8Rcji:״2iv%+s}ۻ- *yZ$/`yYն-yDΧt8꛷w$\e}nWm16L9r>yCժL@|q#îc _3\nCш8xnq_߾ npD{Ws]޻Č9jOTdwM|}{ hއmsIHC0v{W"_^2|Ғcp)Kt1ش~bzIKNa圏MB#`V##_ C\^&j"*v.sHU/&0 Dj-|)#BȁHy15B)T@:JuY|<^]ϧf`y{9ev778MG}w>rЗMuvEIMwH\M^ kDae/Ño.$ DcVT7oWWwJ6 x:8B}C>ǾJwt ]PqWê.fM??GުjJqs3}hÙ8L牘iZam`M5mcsΫLlSaЇ @.%j`Lz7 IDATH-jмcT)㜧Ns82/Ǿkt>ԢNx2Bv(ES j%,΅>W[dfOizu#·톾[m<2cZ\xܮ  D.7&E[d%@#dp   .kZRR$ `fώ@UMUs*dDL C3$r!4MĦdq E%#rl[穔djJhU!Wv'[TKͰ}y?NO@;d5!CaO֘tPuÀ}wRi#3eॄ.#Kf& NʠmԲ;:?M5@*~e~?n{>?;v||goE#ws]>#֟ݮo_!t<Φjͫh8ϓZh|ZF㜖T.,"ZLDr Va$4(!(CBv30Zͤh5)YD }jhDEff YR1c4cP }@e!dD,99o@D8xvL)oKڟ&4'An 29ޠZpv>W6t iDŽ2MV (^21+ j@xyР=g"o{dA5k +}8 Lj1 N] KqyOiOmz Cyϳ~~^Wzx9vi^5/g4js{v;bS-Z"WfuJ*19/]Z"BDȈDTMM PA`_6\KZUw*ʄD h 3ۥ=RJIΓժ|k"ûy9!ZBMSRQO&OOO?ߍ >>d3qΥc ԴT<}BbpQ 6ʍStty._|9T/ЬKSPALj1bC,&FJju4O3n:9qn5\eTd@feP`YU/e&oz#hɤصqhZYDh{"2R놮QDjjh@PkRULvwekPXVe|68<<^>ϒ0bpXv!t:wW[#SJEe^~+&#Q)LPKYD@`B8\a𾤂x:xn9nVԔMMETeq^gr>/fVsv6쨚sJ{%"DVUU rM(D7-KK*K)5ީ"aU$P f DpRku@/jUAMK53%$P99Cov&e*mW񇟞~ݝ t>{@?4ê v/OS)u?Bcnn)y΂%X }cD$JD ,j.yt5T| 繈}+1Ԕo6i]N"[@.Ȣ2EZU*H˒J! 088JM6m߈e Z|>Qi?KeϻWNj6QCDtJU=#c D (]?ZkլLmQYV#~!ʹI.R*)0;f5#"Er*(e2 "I"GB_A$ff4~`!d&f i1ܮ^\[KjM캾1\߼~xܯU.Ő|QӸxwm$-U9-KyctY3;W1)&v:߮еmQ!VLG "1"^d 5@pDBr}{&?Ѫ"m[Ħ|[r kԦmǏ8΃YLC1#-<}> Ľ46S7͚2aMԈy>].4SA#"USPtall[LP$9N] D &`&U5D{uqL""- u vf`Q"ö"bT%\PU-VJ%w_|Ul.qOErލi(jm䂋ڬVLJT4 9Irwշ߼8Li𨥔<DY1u8:32M T9C4C̢sXs*VjdxRc0DC2 p^0AID+HͥRK|;mx@EMy+1l9CJNj`lk`'`OovWJt=3Y)͓J"nY6}#Ti6ƟiU[@TaǒqinMIAV\ٱ),  :G[E_rw}{q윋2Ï?!2u]U2y2ӔsX5뢖Rz>vf6"ҔU.C]nW]74<<}yxzYBU"O4O]sA sgsC ))swZ]` 7 ƹ.6J) J@D/=jj"BDҜJ?D:D4Ӿǩ/yF̈́fi*jʗOO80U"d05VwWsizDiF<+M4~~s?Y`F&X&I &@桸2tV<}ڙw/q`T2`eb̡}Gtzs4iYd`ws OcUr$*M"%*_]]o~qwPEQR1@$*%sb4 @D9y~~0'C05>4 O4M9K` 7.F\xT2ݶ\Ny(%ڊ5Z5mϟ8WH9+ "Ukf.xʮSJ5ʹdAuqSDN cS nHU߼=u1cB(*ÔVuSAԦ,sn .Tu?L΅)S.ND݇@0T-dI^74$g$ȀW(EMr2j?Yh`f* S0#I/ޝRYO.08gX=\u۶Tʜ23RV3ns?X75z,BH)9L4b} #P80yy:1z ZJur>(xFDR1-KND!gvUut  oERӧ/!T1VJ"L@؁HPJ|~<|ᇟ>?]61F!zる1>s|Q3Uѥ4 UC0ZHRTTUM ZrRB γ0C?:r!Ĝ8f8 1w1"✊ aNP8mkn[ Dz|&zm&:8a~6C@7LiS)Z K6d! Q qBHђO}|zN籭Dr6)RT )w`jWH|8_O4ivDiۖTT̤B0R SU5 ":\QL?Tź,X63$vy%kߍE܏?}\lnQjHxdGw{{U]Ws !x&@R50dv>H9w#{t'z].X40 t:0҂ ~NS2bW7 ;obZ5+uÔXAwM]Ifпƹf#]yR$1@_G\b? ReD05"*y|9wѷm"yL3wޱ#gEԊ~݇WUv~n\y2IU> IDATsQp.̑A5RQB>491\TU8U iJ̘}R 3W[c Y_44 Yp33ͶmVmXQ|0_ݽ׿>|xvvOCo_߭wL"8d"Zmv4t )K-q)q B\J "̌"0jq`z6!BJ1xߞΧכncKp(+fIKgIs]"FZrto A6A*"UKO_"m8~RoIiVc\PrKIL|*RKߴ휳Uu#b|uli4GA6jwZDҘTAx>^ݦarsM̈`/D,F$@ <1Dwҝ4]_Ʌ,r:]^HL";,yf9RDUsɈD̈8`Y ^ ApfK $_s%!<X~ns ܺXM?Lpyu>4lڲ@x9wق} 0qxAUf=vHnx}sr/'YmaY (+!  !"DϤn΍ݽy/~%}ץyS0aœնx"w율9X1Ĝ'S"Agy ?/B14SB`C%P [HiJ)E_K<>^}}I< xxi4WQ5"YUDJ) BtJ3sff/Sh쏮sF1^@@DDfE;ΝN"f)Ôݐ??d9KN,wfiA,  ̔a䜿}EqD\oBSw8hsw׻7_}sYU!YPRRcb>|4pviۡ;W~wם/b#{'oL dL< c7.@*DVu-a)EERRs Q`G-)xj*,c`fTof0/4y1FD4yq1 <󱔹Ww}f : a_~'8Li^1q>jbZԬh qo{#Eᇱ2Цi\b]?~r"@lQ" 9XBٲb ak~/KjKIԇțuBݫm6CkymmS`$z8RJ\ j KlZNUs.xDU-⤗F#bT8t) 7D:˗[mm9l5s6뺺*2ƁD%f#`@%r9aCt&vx'1n6\9s/'13- j*h9U*:fTجfmfݮw`Dt8ۭ nen4wxrf`EEM 22"^z&(ghfnWhPg3>~w|~yJ͈,rcFDE,y62Fΐy `7ʀ?/\.GGp<N\7fJ"":4%۪멭kd3Ah5ck*&7\L<71`Wd ')mPm6m}G`;GΙŪ 9mۮvU4c?#":Ȗ,38㐇a&~S !mK8!1R" K,=YYs^\Jf~+v.ME2'_UD c 08 9!A3Ô"]K1T u'IֶU;"|YSU"&g&"}w΁∝0̢0DL`_ѹ_qy#Z DE#H@v?O?t< DN}/mYyR,b[vEGlZJ9 t]5!0ȻP׵H&`!rNv9PyĎ] Czin<Nj8GmQDDUTL_dtd*|~>U^@R Aן- .#U>8fE/s*)۷oߦR>|~@nWx{9˔W7s+x8xS98ϳYCbCUTIsAv}>=].ݺmg:hy~x|Zo,Cyt<<vz}̉Ys|4a`&x"bL4a8!)`Sˇ)xC~sMj?{˼`\(ƈFȠ4Ϩ9KCp잞vowBbPJq`L$%d*BU4r_$>GTY5n~攗E.!'hҒ8a94xcFUvnbM;sW4YۯSQ4 nB%U#$B4l$T_P CInݫWwm릪{~ Wxb{9at%c*Ui*DJ4p HDU۴U=I3"fؑ7X9jwj~~䮯vyAQE^r4'#{"4#&goo߼|x|rmc_1Os{ VMsI8 \1z4S\#ąC SG\SunV 3/iS "\_~(MӬWۦi<32\8pqH5z\ q{}w8NMa&U8īj=N$ŊIf&"M6L#VJ׏zSJ!043HOw0oMGx8\T3pL*8d%f){I"̼j8NøZ?~R9W#MM]߅P!3!,\u(%onnTݫ|]W7_|ڬ50|aœBU[WqTU B$"Ηyw8Y u<>w! ?|?>>>i&6,z~՟ş_wjmzK!]]csaX D AcGa^30pꇔݸt㹛~$r92yִh)SwdӐ\4[A j` UsRbDr^|)>֩C\߮Old`/{lE 5D4U!*(.PT{p>N1RTbZM}~pέV$E.xB4eI)}|>WXR5Wo^vWݻwmn6yszNcXmNh)8.Īi|ql[i&x cC))Ϗ ]m_~ 3ϡiW׻M^ Pw΅CDKjf/21#3 jtT(0etALsn:s.DoC z;9eqEW0LY:u]5ѱsdfRe)h7qΑchXb"!c[OUz!7 MBllijDC桿B8===<=]2KJ1֫qΙ,>IE9M(7Wtx !WWWmn֭HɴȔH-8 @ v>?==y_R}|<ݺi2w4vlס0[RKr!s'SSdfDTU$^{e!Z)+E$UȹfE˿O?}Ӝ;+w]Rr)i.DDDB[{ &,C)̣yF"Dh9Uֈl3!s}W s. 蟮%RZ`YKb?N#5uծ۷o?|x; )[YmvJ!ϧi3E5>>OП>ᄅ{DG$9@PMDaE{@dfXͿ<ۻO_?_<߿%nv;BA,z14M9nf.U3z-jAԒr}1F%rU}?ʉqРjUByQ'aD$=㇋))n޽{'"O>U)Fؙ6ч:֕o}l@e>F?UDs1S) @fPՒ8ym0#Ccmq=;m[V2m y}".DvKi>1u@%4 ͽ8L@a : #8攒Cp+`)& LjіܝWmtt!q2QL#B DղTiu`Ka;>v Md"\T_GOO?jE ۶abDOqԒ*`\Xޣ}1-GĜs)h\f1ߋ#f1XյD;Xr^n6Œ8t}8`6F̎g{"41Y/Hեwч}`B1!zOO󳳶mi:Tu@P}wx%z9mB)'@\lч7!T_Tqb}}#TbRl9&@SDPrRQGX]\ǪK>c.< #YQPpPt.c䒥q캊I~Qob!4"? w;&4Qs5R$[)6׸ @Q0Θ&Ѣɰrs~Xm:B8AX䒈MAŐihn/N%e98`ET F6xګ$- -;BFp)RŸl'WNW 5L͇ˇovpww(?xCU-XaBRp8!fL^T9`rU P 8CNYD҇],Yv{^7_.6x*3<]*骀fCҷ︪yBPI5en?dLw8.4bStܧL 9!sUuO38,RLH euBRFFZqw_>~qc۷?|xX.SsX|h +%[_R؀ jNn߽7;FcF@B`5<]7 n=p99v8)eBB_}œGjcՂ#1+ d(iR]C4 Ti͌@2A) S7ޓR$2Dۻ۪ >~MT!sۯ)ƈt xu5me?Me ˥\PhfhΐQLfClj?w ah'l|?gD$Oe !TMB;MTd2+:J⢌CW˳ɓ'7<>JBUnǡ+ yJC\*"aj?壋G/_z|q.8 g jf0=!j$ǁ8i Gc%,Kl&xqq̱RzRǪ >RJ]!ͼ8f$EaHx7b!}pnEnjTT\wFM]%9 pWlIԦ! اMhhsX/Ngu"3S K9\j@3t`"f2b1B;0߇D0g>ȃ9r<'DTW=*or\~% <4~׿۷"z ){.7>@$ ]|`W)1UPUJI$@3)vL)!bꛯ$=v~-{!V뺪}tEUADEJ))997c634`#SH4tcu}q]4eZ-4LT{컾I i_[n36ڣ2\\>xGO^ ӐK;!Uf/4$j@E?HM$QS))c圦i ޿Ƿ?F,2z.\__g*wur#AK) ]^^|x@Ͼ~œg&C6RC&H EsbPU>xwի)0PD99mPE4lv0s3! !$iӐJΒ كˋ ]{D$0fvW0YYTpwn'7?~X*RVgbZoH'"%Ćg-PL9rUc=yL~l*LD\1e_?dD#FU5dPXg9$y^;4CW3-W-8G媔tzzrS&baQM r͎ٛY23fc0O4iJyDzٶ5/ Oׯ_~rûvnv_eږKMċշUa1 &f/hĠ$Gʌ~w8y8c5)G%&d@>;}P÷}=tgO.O7Ujf`dR" 0Ә0vtU<8r鐈aѴfƌWWWbL#09Dl1`c)D4ǟ1TӐƾ/)8sԴ'66)i!Թ- >xk^,<Ͳr7R.CKadW-b'Wp{㻷e쁱HBR#C$ $D{Q";*]׍65;? |fJffgg>\H%coF /xwñ!~:bL4"30(?Vc7jzSѮc刂ɓ^quۼ{AwxӇc@ùzcsEuXi]lBJWCD$xgg8cɳPB*!nslk0x<À{tp~%e/6zvJ*looOVe_\j\\^^]5VihTRݞW1_V!̈d9PAǜ0qGoii@5DY;g`8/Zs%w*^.#S8|g_<ۛjחCwP}׿~}~/wݾO0rhLP-v{)RW9Ni(%yΓINmzx~Q/[`"S":t) !M\ct RDdS!ٶDx/Gaof콪*_@0MRBL)aHt~MSܛW/m޾>;[_W/gWx_0f|H)çq{E7y&(S*B"лPa"95WMbU 3_<"jΙ##@D0%C31-`@ M~ߏQ"T=m q%r]Wj!m_!cjqZ1PC+6{69)վ0y}cl붪:iiL:X+`i6Զ/SJlcDt (FZ*6EI I<@! I8cXU9FP-y<-n%&ԱnX=ys Ѳ)k]Xn6pzz阒i)p<M C!jU1>?:c~h\9a]ppx/D5+&f QHbP?!圧i @hnm9X4~{#iA^V}tΛ"/_=~9Z,q픆<) 8:0 L @D8;_VۻιFY̱_O/^(j"HF8Ȋ$,c PdHIjb"@x8>շ+bιRLDfQYՈh2T>:41l%Qv*uC&h"yDqj"3s#¼ŊT\-6gO:|$?vc7N=8hHq9 u7osE4UT05`3d"=KN_<'R\D>`ι)Z(% }4Dlj Ȉ9Sd$@Aڶu.@Lj}޴4wD7aEMs"O7rc]/WI߿ͫպn** ޿fjBG }XX.0tDXQUL ~=ĺY,H99OӔEĻYaiD2zUm,rHX$<媪|]5 a<|ss#]\]cJeʧO|͟}a|uJ7̝ d¹MZ Hܞ=eݾx+EKṥ xs&bL>fyYmLVU1lDcw󓪪... ʇw9O0f4Mcd}Ói;tTՋQ)wxv\缧R4 !a,RrD9OjҰr7T4IStT*6f`̢qE琫R !XRM9q"fs|\)%(b@!!;ryiߧ?f5\NJTu5>x?tN(s:NlsŃQ2NRˈkDŢơnO jؾy)TZH`.JI'ӿwONHf9D,9{&20(ʀ9a㱫-޾vw߾iXvNfUYX9fl*uQI/Ǐ"”;݇q,j]IYJ$6q'aCsཝ>qw쎊Hñjy;ESjPQ0tM˄yLMUH'"DZ̮B ~_y,׫G]< <!!#$WcQW/^K[y i}~O\;ٵg~g_C]H;l_p~hndV,SeS/|h ?~x!j B&L }'-?fO?*+)"B%5"JbRfJ?J.9hޡIb2# ) >}#d$1bK TL$OYqO$g3R-M]8)/x:iHӇi(`/޽ϖ CuvwڔeMފdV3+̽Ԥ d4̬qwj^8R@@4 g B@LDGgb'c~)#)8jUUL\JAsp si ,f@Gwy>]/>ܼ~˗"\(%GDzYBSŶ<b]iwLsJ:F^}./֋eaw8˖ૐsͲJ\UMR0I1WLpKDE5ѣf6M-&cJE #`6|6i"StJ#7[3`fIc=tm>_oduzBڍHa.ԍvM ـ:Iar]}9gO}7R{(dfX^(y|~i6יߣMtc|˛8\x4C.=^cCd<*dnpz޼}>%ˋ1 UNUϥ㶪$/yRbf%%\bRP//J9Ǫoպ\W|; &+Y~98),Zr1ˆ4^9gd~,WzϪ: C^`!!""4MÐ1s.@)H;Ͼo Ol&8aO/+Fe$-aꫦiS]q?szqj E)2%91Sy &@TUQ!"v`-U3iMXJu0t]RBEC=JΈȦ!lx8 xrz3ph *hE MhEԑ4Ʊo$9WmUJ)p9_M2IDAT8,O6ڬ5XW}˿~{]l|s$Q):lK+`@h+AIèu[=yvu~yXػq \9&.D>լ!H6L0 UH)IT??9}C; X1LYu;t/ۗQΖY0j*̮*f:;2>yӤZ\z٣g_t*~l\ !Gi*7Cw&{(D s*sRPȋ/*\C02yP1+ly6m)pOlJԏպ\|‹W/no?4Mx}w/ë owTM)N6Urz"mbCbsHʅ[l7nbtO} hZL~L eg_}3`.4 )$_~-voI;ִU}vG=5I1M_4u7IEnyv%G~~;t{d;ן,CXJaf眪P!#W4-ZRơY L0_d2hιc\ղ߮O寿:u6xR-R"r,{f_TkLKљY C"h9?sҐd͢r>#q1z8Mb\Wj.UrscJc*XJ"{vC=!1 s?UN}Ǜ;1aJmŗ_ӟ'Ϫ|}}Ze޽8}|8X;2L4\nC*sk5m;ㅫ| 5MSg/w$a4@3㟆D"2{f2DdGb)]a{ǜFC#JFP i蠤&8nىñmlуw|-STG@`P  ,4#uc1F()MNX$)ٔH1F1CnzѴ#2a0kO\M@H! L8۷~V!?W_.7p{s1tz"l1M Ə bE7:d$+ a*r)YnF$K%E, P+9WYGwy|?MDI.8ͰA$/+FBCl"a\4 msv[ s `f4LJI9OL!E QH9PMPRbA`Z$ͫ30~LQSdЀ08G r.ɠyybfb<G_ȱ#18x\} 0JVQ-9]VQk$}QcE2@#S3C3oou*E8et/۟7Wayl^~D"-^r6{B#ei$NSzX4AU,yNTrf}yӇ_S_)O7 v>rJd#GUՒs LHF`PJ3029Z9z_Y퇡axtNMT35 f6QU5C20BS5D1i8*@SERy)ժ1c.fQWmeGF"&B}+f69dȚ')EELYŌuM325eeJEJsWk@to[""Ǘa88ٷ|f&61M\ׯjox`|eR0q>`'T[1F -4v-QtR^`a Ejf9"¢/L}@&"D9J1ESS*!kU p\珯^j_] &RJ R,h`x<γːjU6B } Pyv;Jƌִ)Pm ZeQt@ܪ.c8uVI[j~:="~Wěnu^DRJpFx!t[O$2֯ަmrtR M,МR}"RdE@h !EQY!9p7+:W~f5q<bc)*2[fˎU43 1qfݛI)SL1ԅZͭ-e[k1D,Ryf䜈R҂Z1V١)b1 2K\+ c" Og.FZ.Ǘp@hљya$*v8Vb |ծo31'F@E:Z5 lʹ" ɒ r͔`f{nN'i%.ts LNZ#FޑVẁ<իJQ Q[إ | bp41#1snuX_dͯ?_m>o7;[U+DsPŚhELjyA% 2Y-cp dLK'm`:ϣskS}1Q\wLZ Hpl`O[Rt'ӂ1ƒO!Dfju0at:9nzH*&z&;6ٱ16.`08"l|w!2ϵL`s!OǠ;gZ4|p*Þ!qycH)1Z*N!h$$KE@ XA3kZz'Ҧ~Nj燇33.w Of]u]bR U;@1HyH)e\2*FL H6 ٴ}m-ӔQ*R $ÁOY{RЕ: 2yffx1ZkNUUUfFZ\4kb1`Ef\w UhMUSUDdff^~h%$#~ʹl!4@j; 9w<>|0r#1/H q4wo_iovnrRdzCǨj+hҸ.mq{Iik zvشڪ+LDjSdfMe) ąE?>=`3%DLc*kR@6]Nm(HwwqNօx( j_-x77[Թ6Cqεԇ]8n6iϵ&"9cTq_^dnVfγ+cSpA.7pq`I^hi4*9A>w<^Z+)D ?*>fھ}vW7ۍ Gj:2Hhl ` z7yj!Gf5]Z:Gh&^8M!*A~^3O,U?K s>.!& fYB3O Z,}~KrGl#&@3rXwYm un0oS&uΩO] Wj+Uyu~4Z5"zmCk͹\EU#۹ZkεQ).kDKnݫnZ6RETC$~.MpQtzۗWu_jk9]ejZ[ RJDԬq̄>t;BƠT9qSSD\L0B"md'-PBDGTO)̌@Dԇp< c%j?wvݷw*Ց~?lMuLAg%F`T1nAU$"RkM Ѫ_{TVɹLiEJ]%jf(ݿ~Akwq*wsi5OÑ-3FK}ƌ("Uq\ZMkq,*Fh@`UU>_w4 ]bxl紾T? L_0ZAjW 3X7f XZ5bkPp+ % /iԿ2T0F22˹<%{""トjt`mq?ϷuuοA!yln^m֯^ pXG"2<ϵhU{dCDU(9)i)-kf :,B X20IENDB`fotocx/images/unbend2.jpg0000664000175000017500000006155015247006660014343 0ustar micomicoJFIF ^http://ns.adobe.com/xap/1.0/ 0 194 710 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?R()( )Ԙ9h(Z\gu Z)cp~G +ܝ,\@Q\a\P)EviY#ÝW4Q]+Hhq㋋ EvV%?*kKm{I@}n>>̍U%ޱ :+Bm&sj"7_@QZqJnȥ:s5e3@  יgo`V?T,PQ^Foո'!>_ hKejQtӭΊ*#'.+6Esαa?๪r鷱g̵qꆾ#i/hiA". ?(ۏWɓ/r(,M :_v>AaEfUE鉼ѴsQYlI G|P$*>U\5#\֌6ĘϞ m'ӵpGKν0ǵ(E:ץ#|QD?ڐV{xtFsJW?F5oDK|Wm\O@9v6wwcZlAOR:~ghF*NO!gdzSqFkI zzKМMyđ^C3GХr ,J\J>i_l}  s@m˅f=Bʷ<^`56ۨX#Xצ@*ڌ v#+/Ϗ^-[ Pf2/^P9*/h֟z#ִ ѴY@Һr20pEA%0dH1 ETAAOTS~azhV#1M RC\Q@ E.(MnQ@DV`=N(M{Oaj~ꢬHl- bETsV0bPb F*ExQQSTҚu8S–RSE8UpNiݨP) ia#}yތZ֣t H}d6?N9bK$ɸ1ҽfz|4[er 1חG5hYTF Q+ \䩴QY} am QRsR21 fP㕼7?(qp(סDU#QZ8:MM0W>jo,iF63^ל:Dc梗ZT9_ztTU{նX2Z|G-"UP`H56tẊ%@}kqsƒo>.rDO wȐQ/1r2=Db"Ԛ#2HJ7 eN3 0EWuOʐ̲U`F,b(LVn(F*B)1LDfSȤ"Lө\ҏ֚=((49 @)8@ҀG)Bg0!KUS4P)qV<0sҀ)8F ;@wp$}Si$oJ!>tNKJV^xfڻ`Rz6I[uQ袕T <'qm-gyH$(W|Aѣu(`FZ=ķ{^=?RtQEAG^ Ňr笯xb2|ù;}˹svX5rH~1lh53|&3ֵ|Uzljd3ޱԐkSx+i,<8: ʳizZ<lŃlt j mV )(kbH}jm$Zn*GL)1Ke4jn=j\JiڜA$@R2b2r OSh iM?an@֮Cw"a&lh)4CdEaV1$U8ހ!10ƣJyM4FQ})WT'@&IGӉMP6(P})ʋ=逡Ҝ)= C ! qٱNiϲ)ju:74|֋ 2ZL;UU&*lĎ*ٜtȭʓvqm=)ѽ+[<Roҗ8X䅙(4~I3s[OcQIW~4VRvS&Qt"CkF"/i@.Uܖ9~1ڕg׮ȃ`@k8rj2N)-nR6`Ёν cat,\FtaqdxQ= \w:qJrwar] 7 r+Yr2NEHrt 3R7Z!JG4IqKMj(74C: ew0c)il&Ϙiu7$NOjxE==jو,Q=bC\S [-{ңR@ [ezK YA@6;Ua"mdQi0x1EH[رz-1"̥zWI-[4nFv4&)Xﱞ 4M;ڬ&:]*Uhh`'ۚWc1SmOZ(QV~4Qcvjw\՝|쓏fʳKkq5q1u9ws$*Oz&7Cnx襽z9tVD5xV:T.y+ isT7EBRЖ9>OĸPN:s#OdWT2lyn5Ʊmf JeV#n~#U|8'֧ )Ͻ ˃ϭ\+ԁ2NOSG#nۛ`7 =3UGO;դkɽHw$e8__5=+@. U56<R%3sF̧ 5Q&;SLS )3SpoAL.{ NXz8}c5$L R5TzbijF\VBzUY,@ Ǜ=i]Ǘ]/[kpFN*ݿ$G0\m8yGDi2Nو:jg]Ũ\D#^Qw1hn@14LH}`= ו7󸋟Sg#TI U ?Ƕw#)ms8ּMsQGhm;}TOxy(YpVq Xcb97onmEv|' S҉62Jm*j}O$tm*=/\u cj)K#1W|nԭ)su=B;x*r&񟌁]vqT4[VH:U=?ryV1\hΊv1hΊ ں/>=s)sqqE_Sq+_< WO?j$f?Zz>{xV`>̃3U#;=sId8uEgԡOJ6Ut-Ue~Iq]H*=KmVعR1XUܪ^ c+ǧ5/R/ܮY{W.fF`xeC\6=ϳ<1E+Ohzσv1jpHdiʙv;!%YGnO kƹkRKvO8oNOubhA8<ɩc[ ઓZf`2kKfԶ gi j.ߴZs*^'J_ 9* q3Pk{)%P67p=k3{|5-Kau*Xڬ|bLxOC=lc7~gm`Gj5 y+Z*FN; }?[C(m?_+yJ=U-UMժaSp5NZ'%vI\RM=YƊLqCU:B 'ksjmpH]过cwDqzcXNVe˷Ϲ ƯLd8MSBZ9`Ƶ80[fYrp+Sc(#ላI3*$'^L w|<*5hKW;FYg ou(s\ZR߸8?j<m.G: Ewۊ4ʵK!$rsa5TH0a%k\ ĂPR7eմO+s,lv#p?\O4[rqZ$bA"=.{#(P[N2l7&NpTVs\f\`t62Qqnm"VKwM  z&'SƜrcap'`q_Einkx~A*Qz(&ӵsf6wm;wems&9ȕBbm=´vGp8n>WWjS,Cqn =Q߄OX& [F'៛s[6-y,V[rOnǵ|MT&IQ{GJ}Ь}+7%0$+yŃw LV9NJ2i|Gx]g ҊgiChț]$WxGqKc]b"D## b·XO$W'wl ˇyTup156lvgK_&d1O9/^{}ͫi54KO7Ѡtms{ iU1Ӧ+p])I)4+i~1 U|闈FY@" OM bAg5kXO0ITMVD.:]"=Z\;OIlWkMB樯,٬|Hܘ5_lS2BewܒP,Йao0aҰfѤY#T(Ld>E|=)nHE'1FFU+ߤ EjUoT- Ԏ0]QFwЫQ>լt<#ү-"{kEH}Y7P %ʬPwc6"?\YtH)RCbHm[Y!I 6ih i#%\=յZ8@фCs]'2=hcY"3H^ܓZA K$G4mуSw ьj#/i$zV߂|CqxrѠ:/8L*R(*QnՔyѬ'Ta`nct@Xן\jGɎ8X>p5=Oӭ-t_JSIE5 |ym`H*el/CR]< ®3D;'[%]C=bY]a%.18iwE,5/kznRss,H׫!qS%doO(*^y݆U$p}:׭_DZʯs,7d{y\0h*[uvU+R#H?:g?$>KOhA'"h4]JK9Քg.8זV+Ʒk)S$o`?U~&.cdӭCm(RrԇzѴgDWu 'Mr?_8WG+*h/--}kȀw 9)Xڜ.Y#}@JXȎcutԲ*?*m6iXz"cvsK{ x.5KC sqUӍf! P|C h֟}QxǎoQMR|E]5vvyd>kp/󬧱q@#8vB~QLbT糵|}k7^X0@$V m.}* SPN@ŗ4Q!U_6mmy+;(8eA`>'$Fxl[w%F3]؈6p~rYHZw>K~2x5^jw295c~LO+1ߑPx|2]L.t8=k&k Jnnښ&g2A8|+޺{-#'|kӡխ6]X@|( u8_ΤQ@v5Z ЈaVc)PU{mFWa\hx h7Y#InuEks09^ )ʩ [>='KMNwZry&saY7K(F{?7oz+^QU|``|įZӵK[7R0@MFzf!dKIDE$rBu㚆O0m,HI@k|m~u֌@q( \xr-6,\irS֤y-Tf y1;U0(nz}kTk0T?g`yـ\f {VnE?/{Bۍzw5{X\mSGyd+2LY?3'½z (&yuyDiKyZJּ=K3=h^KBEӥ/KmUQGY[<֬Z{ n9{֡J֯T5;3unr) ڴѹ缓ݐ:qW.ҴrQרyiLVMw% uYgmMXp*}dXN>PWJLI鎝YVEKT%ǽT՞o)ROi|N:.HۭVeaU4E|c ~ֺq{W.g20eԃ]]i-ƠNkd33Hj^h|WU:6tPѶ]Fa29[ž ӵ٤O.cϘk:r^6<&ǨXAQÌ𶕧 }]̌j g&A}?Gʿ9'!߮V{2Үr>SJe "I-ui 򩚕>k %;˰jI ֦P}q[D_pkj.Ru.{\?X©V':J\ifb?^uoRIܤcW:YFQ] 5&-w=XF})CO ~5HV?'18We::aֽ/X'1=8:|B7I$r03חPIqNUr퍝DXfەL:_>,dx"m 09ē>k=~e#~N{dhq3-!4f{v+`gUn|> 5ȏd^qȮ褸ʒ+9vGÒ*q\*g3{\]7̤9U ۿ/-<;j[ 6oltmoq Te0q֪B0E4v p+&SS\o-5Gti܋ǽoi7˟θXWZ:,Jv:q (JɤoEaTؗN>)CCЎw-q68ע_^l7]OӚ#)>zbRıI:~ ]D3{Mm38;kRWb4h*:JOR5V&Ob6ܱdڬx1w|Zj1BOО¹' `)MtJq>ݮ9ABq+j]G"'G'A?^+mM z?QE[P3QFJҾ:cS j皱(A;tM^ bυ$L`GJ-4`N̺",\g5!JUNzT_5"GE+y|k%E8bOЊdwoڴѨ"l.x.[{ks6_&`H&Z^\ \}4`<ΫbZW2X7ݓqȠpr:^")T릛MN}l=+-"ZN?zn2=k$f̘w".wSNNjɹbZ6$$;JɇyQ=Ts<|?x5)9]/ mpWCGV-RmԻɧդ()"+;؏nHAowZ衏@=+YI= ZvwsֻmGG$+}:He8kjƱBv!G?JҎ_.%2*)BA=5*W $pTb评Y0>\W=~fm<%y|>KEd6[k힠)-ʔZ੤oB[VaȀNi L\ɫtc_/Y$ȣ5BtVb=뱺e+̖WCrM{>*iymjǢH!Uhjpݸ }FW`1eΊ!䢆!5ܗzNv*jY:,FA㊳mgn$q`ZK) %򭔅gs#}E5DA1ҳ)^J^CJr+|houΘP"ƢIs+n3ǰ,*Ă+[mii`I) ެ$eEKmLX쫼+mnkrqֽ ;?%_Ő g5%`#|Cr`+hkY-N'}#9RP~TV-Ǩ]^"ֹ0JR+=$Y\ gheSկxYԦt/n$Q.V"P}Hqt/|Q}p"Gh)bIxJ1DPH뒮yq$Bu*$&t#$ՙHA氦o Mb{}@H lL\2Ni+X4.P"S jQ_$EJct[ (8N\cԵK{UIZ/ka}kվ)*I2 G$Ig :VWTL#zf#񫖖MLcN 420TSڔqzBUs]'mJ+̟2E]Epyo 纷%bN:rN .mh+ɭm7ˍBʢ޹7HTYS<'YWy3< 3)*U[zQj^@k1I֭8|U}9єQ^w c"GxYZ,Dx E%jT>FOמ=ø nX(©bd/DNWpQ'-c`sp@cMˌqDXxp>!7z"$oǵU՜YYЀ$lO_ºhG-pCP滹lg.{{ D6X];Juk2PU`{ZD #;/!pS{^rqs^}m5iqM ^^ݲaNqTXIB{Z*tgop b!a.k]?ĺ] F_ooarƽ<:v ێHYEr,sq`rҸA^'WVHQq7UA'j,Y~f%T;xIGKQp"O&#l;n?(T +>S ?t ::;LB?USZF$IT(^}q@xcr|f諗mŌ֚Ol{80Iz$4a%ƕvЁ;G/Þ,V [cOЏzoA\9G,]Ҋܪ=ћ;o"6~|R>AⲜ4j6=|C]ӹ]*uo{+}ZBy MKIRjYOZ|_S+3 {FʛrGjYv#_PqV8Wge=p3W9x02N+&&c${%s]_jomplVa-,kRDd 36I=MfjYǾr7?ε"u-E:0(-Id]-WjS޹~ e3㢎TsZSrg''eQ"i$ln$ֽ _rY5`T ӬՏq*]I乜hݝF9yMutgOGY~vpH`GN*irx*%vgZxMػT`ЏZVO:¼}Z r@bd'GM>3oiǜmvzT"#O2'=']-zͿ }L~VҼ1bGT%q&MXK V⃪fĐzWX"H7`zu edqGf5 m`^a*It8bW +( p0*)_/= SMTyÖ(IW4k deB|HyX$Hފ2k<e3ivj6Ϥ\$Mʓ ~.(n՝zU*Rc,|ח}[_QH mFeėw,G3q7634h#E:[ƒd_4M.w?B}ؚyВLfzhΫW;K 7 pImS%liB)n 'Y]gLCqfkx.H6 ֣f'T!׌hȱ\*Ɗ<{ÈkMtЭ:9R5twF}+ӧx@=ȬCSas{iWtp)kXؒmUA#w^I_9$k]eky؞9q\ EXui*3޸(L iWK%s) r>e.n9C5:`ќܹJ k~3B _9 x*u}:;]w m+jQS"RqǎGrߝFn's~uZXU( ]w=7?L2wc_<~I$Ԟ*-Bsr&x_pif"1ڲH *Z+!& wf5)sI 땢̜Գ%i XKis>IJ($*Hր=n{Dhزh?JDWi9ȫmO>STbXY R:)J5dƴV+MjĸBȭKʐXFw۽B۱Β:Z$y}A}N ھХȖig(`;B_ -8`sWIYr*WTGemc.#(zqޛ(mBQ,*Ea;-M~+3&eb1=jA vt+FKCNJ[hXIyH||Ϲ*qY6SĞŻ3E$8fL)\" c݉PzS8X+k8 4.#V͓Qϑq)ו v?\U9St>ɒ#_eȿ?@8mXMVV~x{ZT.K#SN1^jS<~KtSr?C¦f5dzb\ۖ?!W,~y4Tpf_[OVgS;ZF7e5itvwd[[o(RFUc}KWxoR=I9\C,-5>#$\Q5Iw*/\J>` ?qOX#լ=5>o"R*kN:oFxmyzD|՘u}tkX1wuK 3t6Y$(uN}g@&iTXtXML:com.adobe.xmp 1 2 3 0 0 208 339 1 0 j\:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:339 height:208|fotoxx-23.70: Sharpen: median diff 1 15 15|fotocx-26.6: Rescale: width:305 height:187|z IDATxgTUٶ.ks;R9P#(* @A$si־a1 PQ-g6kZsG轏1)S8 tvvx:7 ?ܽ{7^v?|Fs'/o_l644ըBee%]WWǁD+F}}=jjjFcb7znllLO3b|wt\^SS(//x00cVDȃ'/Vf@)mc@X}f߳}˃bT)ۗYy >6'|eŀC%^P͓Ff} 8w< 6r4_^L~ `x=cxLYT ԿscYd7qLVFhig.Da.se VJ =5.m|g-5W#'3~gRJMGV^*[>$j#/;iHQXZi pR2JF)-&Sh{u-yT(T_;99RQ\QZjG:}/lo ՗SvEYґwmbԔ '))HKBAIھe4EVe$DR;IK__fŋG\SN{00>SiL pYs 88M)_abĚ+J 0[yjMD6mmB[age }-@U+<6q2}e+ wTJd))BEMf6|Y,܊/cZ;ؘCGC Jy,v_~ȁ*K^^+8Z%F ĶնXZj\ym eXkU*+AYUFVvvTF?V0:ݣ9#dt7(3!7rP5^=MFv}}I\hf =% +`:tH"1+M0:<N8~8ZO})&憏P&u T䡩oM'qA4sJP,~ 7| h -jl-E%U.sJU1$T 6PK~ _eX=jT%@sG3^_?ZҐWpss5’ʐ{^&PRхڍްVl\1JIU+av._P$f39* ,n`n{h.Nno;XX,<-I+a)hnëGLCrjvڵk`h`_pmj,K)?G(I-6c/7 'ߒܪѓS&x@? ~1БƲ,/[[[AAAÖJ 6@Plw6"t,퇀w_N$Ƅ &'BDɕXI.O=DRV6ίYLf8skJe "+&vhBN(ooAp QQgsMn/_Y5GgwU+DIq1DۢE0CVg'q f,ՖU ;31/QPY $ǿ@d<})iu-YKC G?G6*)㑜[F7 ;"V@Y{.=Ev1] YUl ֏16b F1f}~h'7o y6mPFvrFR 6J*Mm (M[!'PVRRxJ DRk'cJ#(kb<КvJ˱f6H͵%HgcvᇵSԃ($ MyT*I@Y`?bbrU'h wW+m"c11Um<vc׮]=8xĖhAQm5U7ɴq >;w`']>px9mH}p:Xj퇃R4Rذ0W%Y뱑&捞X)*ig8ʆ\uQ_9 {Ę iccȘk)]$D,dƆ&;)*Bcs'E օ'8ڌ@Lg^Cױ,U~ؚhAC\O 8Y}b#P@[#AuX f)6$ŏFĮ ee«Ni3@nAlX.ՈqNf:ګJqC+ Al%dP5TiX 6Z@Qv1Yt:[jSw@YjaH.uQC.% دCAc/!&Ƃ,\Hɓ'nj>[bQ҄6c;PdJ ]tuulŭ\qE&Z:% VO v vC vzjS m",\$\ц'X3XkJǟdÖ; V˻]J] mX, Ntuv@8Cu is~/,#9Xsf 'Gxeee!7pX?In]nn.?~,񊊊b;O?aܹ#^b`L%m*0,bc*,,ą m_.Vz0gp!NrQVO)!p;G_M2NnoZ&},фǮXb(O~vPPPS!gOңaPoqKL k?Dstt$2 xO%^; UźSʬB_6")%d~YrSCLp$y)hfYmlT!M F^2ܹ ؄QmE?뜘$eͬ I$sΉCb;6<7.byV[bn^_2BFZ4(Hh0W1Zxic̝"\Gfyڍt |^e^ d4Lj"~|TxEUd24 )p k@ZRΝ@[M6B2:$_s`s[ۑ Vsyc cuڗ$ 'ܮ)$W=0S2%jUrd7Hϙ99Y 'QAnkC nc*GW(Ђ,X ^ބ=>"ksLtaغ8?1zx/tq^W ^t_n~(Cveh x~,m]npq]>a>>} v,Ml!/'kK;;K/^A \ϵߏ=GϡwOW\ŵkv}rӖdř~YUtu? am˵x>;χƀ&H(;ed, 69?6E3k\VhNTOv/ϱ@SAvCkyAY-  1p&2ϵF˟ }Pov4KL,>3 eƲD ƃbd`@Yf 0!ؿxXDhO d^Dx/ HI3)}A쟬-ZW 3 XDL/+t~֞/)STx̃b_]Q?E{KƟ1xu`RbOja ƃbLjAWI5d΁]L6`PHo/^xt:PP?2uׁɪ< /bLjAWIz=q/b< x [4gLVY ƃbLjAWIz=q$b< x [4gLVY ƃbLj5Ss6vvv. _fR [_.nD뛐uGKBlESwWk@*WiANܻnSVǵxZA~e*6ߍ@h.GjǷ-*Hm鞰~7$SMm{N\\҃=^CC2s[\yW||l~cGq`,1Ђ1nPh3 Yc? 3.eᄗ>VB|e7& U~z*0]ctu /F)Eb׷jan蜘6ϿEwF8VpB@l.:9Iqa1T7" #1AJUeՋn?mȏ ,8Š{ \{ar{&F7$  H:t5 g,\/8zxq?,g`eQ\B[U84pq:DNMIػ3S -':Sg.͜R\^&X7P]fρZSO1w!<^AvM 7AQ]ގ;{&M&6֞! rX0o6~6ϚOuƝ{a0S~J08&qG+6bPEB޾X\ܾkֹA%Ȋ :f"= Y$mo+k┧=}t|O0o}Me̜37|:x=}`aSL=,sr+-An@@P[/',~eSzaȩHH@ZR,Â9R+g{qj5TM]ps$Dඕ0T\en]Z;~wVj+ =3!{@N ' tY%cCMqs"h-ɪcDU^:5 ZپjV.v .wȑt9r*:F$2L nMǥ#ސQ'`}Vh/ۂ'e\*NR~@Q * 7F/`AAM,q1EFj.8@YE1&< 2){xbSsjBq*;{> HOdm+\žx Y= Ԗǰ3T"J Լ'}7uWJq%&k+QHMMAjJDcpҷb2YLwWM3shA\1lqHK}H]h@gS lUAy+Rsɸ~1;,l!GY ̝smx/ׅZ,d3-n,W!0U] s/ia`IvC!{NJŋ`m %?Rxr;'Yׁ:|qi4WppE婸C\k]:H_'r8IQsFKfZァ# .ġWfgykpՖmp6 /.Fq)ZE1J\[kҦ?8Dkn< N+ZnCw*tq.6C ِ}*ZA\!1AO! MV50І05Z1꟠.'uEbV#˰Ht;) iM;$=H ]9:pս#Api1`fdձ)jmՉց`2p怰 ϏbY22ɝ|;؂g6@C7MYo 5ۑڄ'AEUM_5% jR(ɋL0uȩk )))Ubd< y}3}-G«8<˘[[Ma WPԊ^fňdGT#Uj;Nv`!w/ß̝9v=ăa}+j=9k (5)4Tф2w1lyU,xȵ|:% 6/׃ӮK>GZ9)͟VT">%爋: -yF Jp,bWN<*lt{ @eRgG` =0212,zNhE=0YzZ?J.Ĕ)3e.R*bÊLߣO↭"jfu.7h9BBdfvgHgwK`;l-]=+Cn7y`5"U^:M0_m "Rn8 :mw#TJmݏ)f%0ƺt2"š2<4eUa®_y%pfLVfnĽػJ˷pz!Qӝh(iڒ `ۉ()-Aqq1wefeȢc e E39g= *;Zs HC:YV34ŚmpEy8n# pE29CMf6,@Sa]ФCCk@FIk o o@ܶeB.V߉X8c*N Á\3\1!7S *"?؇`h*hy~l-x&$=5.$#sNF+l,!7Ҟa| ׎PT[ 8$nxq@l!N&d[d$7ulujY$敢 75a25o"+Q;a)#@]u+ IDAT"?~{W* \FsvDn`7]`$jڮH,{v5"-h[aIN.Vɨw0w;wV8>]agi]Z9^nRO NQ] dػ{ ...>~,d*)X &hOZukjpCk"-NT& lް̡cu'%i砲@ zv>pk \V"F;jYo0؝@NBʞqAH͍{Bʚ$h~)5bbC$Gѧ1-@G]!r;Ff (;Wy=<n0% :sgAu:xYvN}O,g.rTW ='8B^'fz0Ιm[x^^}{<%i1k$X1M(JAdPО㽲 xU~g@n=xTP;&/s'-ԥ+t *?YLK@)(6 YC9ؒKȁ؈AŖ v` = (NK?cI1X,scC}_ߒ_.fjP\9$ז^MﺆcccF f&n *"I2Xv5xjs#xCiȶqaIF(tI" q/]u~2[lfqNz9z?)h-rsGp12F3J%Q:\a;xQg]X~@mH!/K;lDxl: q^)aFMa 1 ~wK=^\ pF+bCK[irYd׵S/ yu؀Lu5|!CrV>*ʋIPH*yOq+䓻G (k{g ١k0KZ/QVQ6!K44 Μhnq?MAϰ|rcVXʋw 1I(*)FA&o 5P֠ݬ3aHGA~R⣰8WPl1.&F 5+ dFd 9!'=!v\Nԧr=5:Ã4"i$^&F@ Uuh6uTp[ɻ XLLq nT"#3SBj~7ƴZR K"\ǞrD_EXh{PT<-xJm+*FQK\gk_7ȸq𡍤WqRX=t3h.By#u{4qߌ@O )ߎg렠m'.5Ԅh۵t~;M3 Pc(?_W+6R{@U ΅#%6䲑)@Fs il\v\ZJfce۫p-Xrm]{G:1f~~\ Po 9e,,U¢ŋ8[ɨmxvy/O{D6;ql"UTmGJthQY/l2{6Qg̑5ǫaWqNYCyL ?Z!&`Ws!nZ M )(BVN4sH*.Ny>.Рd䠠]c 6t%x- չnrʐeG[]H=-u,d`l$Է0{xjJPQUeNqy ɲ:aA;XY9yh@IP?kE/:ZۂW\rPq1®˨ ݓ"lTT"9)@^Qv^ېYMG:+ *jX,CQ¥WhN}qӮMeLm1v,\4|-I= 3߇r7 N_cPؓ*45y3=ar*kP ihrc$+q 4ƮŊ%1Vmb Ŀ1wn[#t"z .&tV>Xs2eiS}x^PbX6$l6e(a=oQ"bC0!MicUE'ʪ"[g9`!Z(OGїTGv!-Qځx~_Gu1AoJ*"gWA>a+h"o9;ZPV\D̎F+/-2 U)`QLu 77b#*?b4VpAΡs\(#/+JPUS3,Hwjû%\(ӹ36TW Oj 啕tֆ3[-u(+dUZVh2YVmM&J4J70JKPM1WԢw\eQ,~v$ >;x܊26w eVTʮI؏^W ϑuPR"0R_QB67;DgH*J:BrnI6@cTWI[)E 62Ezd]]ul{QUVdGv}m*dⶭ(++CS@I)YG'AO;ƋcI *k(\ Qvq^4D>$&: =;jQWU=ɌvI7k;ZnLfP4F|v[yEiIl^bz.eqJn}x|Hw뛛ZOIc#z +7ps]wX~oO)p s9Y}O_& >Bybi̗3I3Ye&#w젱 2ldv &hӻaB;.ym(_T~fޏLmJo]תa\$x}bC;^_͏x ƃƭ_ǚ1xu`Rgh:c`t`6ذm! 6pAr"'hcg}8>')djtxo8#a#UM%EJc6^K'* Xm xZ\IZ.2X{2u?\nL gF; 86ӏab<Z5!@u_W+]SJ|fЂ7Ya%D OO޵yO8A靣_wl_y\ 6H#N9]{Rz'N;kNJ2t5d-1Z^mkGGۖk*c04!Y=̛sLm".p/89RM#qD7DJHo1m51F7AX:(,~Xz1 XIB0e{|^~e*l 2: fb:.SwSTJ{d{k<S :P )weAD.Nؼg=)?uWYNzTQm9 ȎƴJ1 _߄4O3`Hz_1f=R=LӉ1a=& 1J1:M/8_=Uy)bchTB"k(T&Agc"♒`cu?|{:cLwkkXK q.:BB).o1c,,W,l7)i \_a95zˠ6L#ش~788PdF[ Λ7`Q?( x%H}|DV9cL9#yK0Mv:q_"d8f !>;hs_/|ˀHHcgQ/WX2+\포⡐Ϳ;#/fj-n $.Alς%f1^5b41@H;eG/o"xޒ;_a1RHijX~+1_V@bD!݊{ Oѹzbduuw럦޳w@0b%2nv&.%%8y}3A<ؖۜ m4qSaFDǝ͸H^\rl!Qq^v}›ޏSρOO'60RZ ch"%P'Ziz: zSBPC0LشBj{9đNP"U1Al^~+XxqJ.q?=|y&Q6׹O )GT,X/P}dtT(R2k!^,Amn mX,#^BtY3>ķ~^#;j,ʔ(¥}+p\y:fރ̔Gh"‡X*%ki i.ǃ6#Өv hkJ -E0\cbMxĎlꄛl>;._e:m=$:q3 gߌDR-xYB}?*(nY<{?xIL+|<^"O9gbmwmwb(a,`{\5r?Oظgε 4DRnh/Cn9"2>Iqu M\p/x&xALЌ{{i?鏁دD: uMq%ea Aع `,G [!!-S21&x9DgcR%u&nTѻh <ۧ^sL m#l2vQj j8@p[ h9&u$FIAa'dC ,6 KW0ZcPJܝ|KoEap57ö'hL}(?WƣN]>{Q"鯧ևQ;{A |(,A`d0 Og);CG\ @(߬_(A+H8ܿ,!k9ҝeYD 8auEԎ-x|@3nm1Ï3dV:_/ˆF|>"r.=9KJ +)A=rXy5*IqEzH"cX.+Ts>uvD@-ZyZV8|;IP>b m?]u݈+l> 'ӒeP6믉| <եb=AWp%\D4\"_Wңi)a>ngIWI 3_mKW˧:.l_ةպXJL q_ NO BH\OjH f ];?4߉DFa9L/kw&Y[nB; XOJA18J 5MKK/?wz=:s4GxFªSqk'  D5m#*WL/!f)nqZ2bfiayA>O)b_4vK-չtX).y` "W(ٸ˫ꞧqY|O쀁A "??Ĉ$hj R TA#@M_9E~*n 쓁" 'n`xc]iAlV^ذ;&K#Xb(GAEJ KUĴs[O;tbkPzKy( 46_~@qA YJ׷nCKX!Gw.{6-ez+prpՅ1HwRc8]&w1:HD~,2cZumqB8JV v6VظO -5 .EƢph(ڙ5;YՄKļj Gn}|n?&5Wg=LFv~!:mKn1MSPB筇<%Hzqi,G(b={-k@ܳ۾mRX 5gh)ƕˠJ B!+-eXGI/kH Aqtf Ӗy@^$9j܋<⯫fǭ *eFr?F !-/AdVݿ}}<b< x [SkKƑ1xu`RbOja ƃbLjAWI5dyA1^& +V/YgVb< I$'F9Y->j= S~?xY6ʼn[hL 64aw.}{s vCq56+X]iӧSVO(h!,Xd96d+]xB `yL}:ofTj7_q4dĦhU X)5X w+ d4gc/N-\@@KXS? (#߹{5KLP0={Iňvn⠗9f,Tg31,QϹ4Hf$I&XK+-ܩo}CFOޝlg>b϶m:NX ӱ9Qem(k~Z¼d!5%cb HMME^a1j@q!e!DE9C<5Ȥrچz:QEJ)/MMIFZZQvaM@l2r[ =so oLoX1SÏ0@3[ 2\&m (AI`@ &@YA2Z{Tܬt_)+0sf#7? ؿNH@qsU!+;nWA 2ߌ?xt@XF,]𠤶^A(nīGaCY)e]Pˆx_Ey(hJqmE *uР;/8$wr keU#-9i:R_ /3ihQix;Cّm)T):eQUUŸ~31?kZ9P P3 IB g?NY| ([.JQ mix_Dc ZvXc|%$ WAP7 ovbf/0[: e_?813QAI0d "wru6"i,RºsO%ĹבEyJ 5& zRVrbVAZ^" C\5_ :h%UVEhzp^JD{&˲Ԕ␧%Tqje)CfJ<"""Y &ZP,)u]=r_{| v]҆8ǏxG /JXcrB -aPž/A Y=9:zٴ0Ր̲s}DAZ="}; \n݂m>{𺸊R (S^G 8;w`ޭp\ MӔЖ));XGrzo9u)-m*YbI26 *:cÅ lF7vB!02PNXfI D5l%CDWrU?u{h4e3ɩ3 zlٶsǻϔHBb\ Erw:V򉽉%F?C0o'{s_37WkJ':;}=Mۂ?i?A maZ<ɒKr:0-;6_o=H~N(@V5(Z Ӫȳt #Bzq942CmG ժ{M w>U<9!ɱRطbA;L'@NgȂd-,G&5z%9~kMD,u~O`{쇻1}y% 6wM"-~E*vE bۼСR̖5@y}O'Oߓ :޶1$x=F~z>玝0d*:y v͈+"GuVp=יϟ{i: Krݰ',Oꯅ( kF fsL>5 ! <1oY xf.g}c 0Ƅ Q7A7$"}b@PS@oܕlX RNC.} ~}n@ƍ]p F6 @{>Q؁ ~~Y#O?tB%4:;Mg<)WaHFC_9I.e b-vQ\KU,uS˯)a2AYٓa ArB8NXCBTZb_:Ky 6OxsV }-⟶qbayt6W_%PAz]ݗT`H*+~~inTݯ )W'NJI @ mu7bAUsǢ7!+2?]3'w&wt/8p ~ '7r"NZν^!9/>c|]W8j*u&" Sq)?w@ hiqb"|=Wb *V~ 8cQSpXƍ\BtUX1?b"J9d;릓E=?,X>+9mq5,5Z,0/'2G_~RU ߪp?9uE.]n!03c`{:awP6?RbIvg5qH6yb (k_1bhnJ'}5 T3 :kѼ*{fB-m'@XНXzMb?fegW&, Ĭ@m)ܾY{3ޙOLvvN)iG-[>To,,7exNt.O {gﯣy/@L1Z n g0mY :Ъu@PVZZ3I1bBZ ܪla2  &tU1ZbgkAOpY\ <#xt6 Q[m>P~E2uHŽT-WHQ(#&bp\zz}pjɴTJǃ;7[_rR!o2 nJc"p*/[smR)^IM{ZW YAbBQ)F'IA]M dx4s4UHMEnfTׂ5B$f}g$rH (+NZ$`wjiIqJK3Sk;{A[BtxsyɊJy~5ԶrF&m6ALA%HBy9"Ig+,:8[mdegH'T%g@'D.K%`W~78IaUޞN&LGvzJ˗Ws:$מA-0w^^-OCH) Rl1VDYQ>0O%lfVtp(^h5Fd!1>ڮNO5-Jo̲ ~xNIvK[FGVR?%J L:fe 7;Ok[mA(f16A,:<B1VvHy@rKL53UWD_Y a1=5 ɉ-F %?urˤu}h,)*Ddht:$ڲ3ҐD֘lXTOj^wv[3ֽ@뭊L_1=%H -Fv+[$L#vɋɭN-+=IXrJ<8ӧ`CH/mȯ5V5juC>?RAj$n\9AL4xW\@7u5he8wd̛ӧcXe.~5qwc\KD;ώ&X= A?a8u7LjUxbfƓ, X4 :w*޺ e[ʳ( ĖǐW|e9g̿bW cvYӧaʔ)3 SM9Y%{:#lYxMzs"eA^PWcDa|ծ=Nľ;i0HǗxSY..a⠮m8564 mr@PU0U30x^fm6@y Kܒ㈝a]>hi:#XmY?÷twF`EhH@/5_} Kv_F\ VkGpc 5 2:M[<R=a`0{::[#qC?Nt8 =ǣҠg2cgЙNoeINEEc7nr܎˃!3OD;t-H,SM@Cku/m1zC?`[o6܆:E)n]p5#'_CGۏr\gQ Ǝ/_1c1(@']Èɚ5M05ڌrS~xcsBtOLĤgu5Χ5JD[!5jg,+' IϗI5jQw ^IS8p`Zd'u~yѬW#QEa&^`&X=?FĬD{?Bpv?&6m>P(d}:C-_K8x+dcU]eTfĠ$ѡs: >g;*2nc֟ #ѣ5;:c_ O5H>pHdnG έG׮{'_X1[nڭ#ӡ]gn;rQtCw p#<1w Mdٔ{F#Cn #1}>WwICa޼:iA܇'0>#-3T*h*g]0,})8w9{8a@NJ3ާ;N_; 3r*.e5P$(wy8':8ΤNBogxn*-uA,N '1N>v IDATO]lJ)!> 7|ѿcبǕ4vT&*.L07w Np!)!S]_.*#V,U*#GeY>.َBT"upJ8|'IO~{?'ZwTgJb4݌5)KOƁ w{m؏ nwfiM: rlKxɤI^A,C骷R%j4rXX{2jTISΎNވ%w$ӫ7aө~p/ŭr`ؚpM'!6! [o0chIv>bsu2@@d8@.e*r5G/BSZb~ȡزGX>~8fm8guxm?o1*w$&؁B-6b,Ys\1u_0>^'A 涘ZY2/(5-M(<)( A ZDP{֔ʚ :t65uqCc4n5BQghH0BxRxZRxs fjzeݍ У{WtƑҞCXr&4藐%6ט{&jJNc*sG6ک< ad]LޘJ Fd^z Ck>QC0q殠bhR.թVH:I ,# ؇:w"bSxB=RfbJqe/LýZjOu,>>Jpcz 0HxCa`Qhi &3ӡ'[07:étZO& D*[J ֧f~dATgFEiQ}OH"#`Ⱦ?A{9eREO uԁu+o8"x~g66$KD'fVN3trK*QM}ƺQ8 w_Q *'o$d\!ʌ&}V]릢}U~݆c`'=S֚1컾WID2[M352$K@,e)?.SVQr3QekU4`'zp\:-g}U2\+å1dBbd;~GLC^Y6bČ%kRW!?|F`n@ s1 vsp @l+ܩs=e$ul' w.^x,}z|T.p݆"MbNJYpC>7xxz`A#`o׵K/1՚|/YbA7^B#Sj^Bq,?ν0hB<ɦi+2  i!`,i/#€jU, ŰU7 ^e(9C1r&+'AOo )Df^< X=gз`\JʤezO?ylfK~O!(E'**Gp=@⥡"UW%Ǚ,˩r{M4yCh~3wy<YbG_ #s*9l^K |g#X8hCN^cY199`kP(McMvk* (p7Nanp>&An0 h <Ɗ5vq~Kh@6y{;cf[^#," dKR)&y5n^.~A I QDIW\NW;lɦ$d]oeXpeeo #}pIr4P?XYdѳlqX5AS9"S4셋,*9έ+-Hp/Ӗ`$=CJ3fLZj?t=z9]Ji<{ ƍ";1GM7a@,>ta7 >k"*=eP)RcP8I.=u*gDXt!fOY`W,?xjD>\5s]QӶSM fj9g/Dž:$NŎc1`Ad)aPy}25&ڹ.X[l "?ڋb.iQrs1<n3q2آG%;'hcKxִ)ZM_CFE&8#g,ŪnZ5o{b2u"iȎFgtLi:;b)BoCSHY'Ea{EQӰtZ,\ .ؾt?X'f~Vh rN#ȱO J ^bJ'`5(OUcb- '~rr+l@-t7<մ:!~V@,62@liʵ h"Y>!sbcKLe$y#-bSMC bDY- hè$ |ubdӪu aW-_A41Z1ѡ*|гVn~6Fۚ(VTCSpr#S$~b5F-c}QCm芛4TH 9ɣxzsE (ۂȳN~ݾG;E>[`POtd&!.֮ZYT&?VA0IEJ/Kkox!n~Amwš8(i[Q!oHѯwI8,eGGѷG/1O⒑EĆჸ dy8#J$;Yq/òIȦb4%ז챝dk#qL}B!'@l_% fz@T=őC~!nM",!IQǟ@` lizr^DFT!1f;ᛮJ⩙M1}b<鿗@B,@,DSې!Xq *Ft_?}tĕNqbOc&/ۀXg3. ?tgQ @0q@~ӱ  WI8~**xus!Θ kb gx: DZG#{sSzƠ+?o w%~OGt õd() yr淋ŧ.%Y5Sf;A:݈zة8NTJ#7+l9|'hۙ92O.bNqqxm\>c 3LY0s/zԐMvPoOtXxEQLͣiV > sGr1o N_R^UG zyHe<(8UȫQNG %<^- q9a0z-w ~whHa+[/5_U ^i vAv79'H~1vj\LcVnrE$?>MQ^MiHlŤO b_؜NF07REirssPS>-Z Y 1!J҇yBaa!JM}~@lRrrrr +.21.AF!9Vi_Ŋba~)oiq>^j,Gpb _j#;ea2j)պJ}M1n ӦLaZs( OPLo/<ʊwdKWU@AUA.=UJ|j3󱤤9MӑlrHyy?ܖb+)<ğ4UKY*7>/+eYgxzj S@3MLOr*+&L_cy4̥犡f4)Ѕօ,sB.񹼼Lz6#++D]jePK.񾢲Ur?N IYvgx\Q_O}bG}K&{ѷ8 VnQ(WHz IO"x6ˀU es*UY:#ɰV,t,dX~ dM8 IJlԦ4i7PjE>7Ufau}l]mgY߶˘c)9_sbG[l=C# ZV};m岍l|=2I,GJ[4mZ%f{Q<Z?y>.:%űE#O YU-FɊV(V-Ǵ9?(1־x, `+}sٱ. KYo QL}~X$<R^Ě|&o <Ԓw7)-xKj^)p-+ȑvggW:+xw"diZ6iZIipSUܲt&i5;\&,JZCl65|*xg^ch65w]P`Clu<NOEZr<hlu6wZ#HfSyy=e<~*?Z69vaYQ2e-_!n[z)ඦ&qc!F").JrG/% ?u|Ftx0m!`Wݳr0_%k~hӘ)X/L3cP} pth鈧0C3ȾJ6y2⁇zE굢 /+Mh߹EN Z0EMcTM>lC[`+t0geaEVݳ-Dp"|}_;?o:cOsC֏IG,4Z_ΘWB9ֺwxYVInL',-cyٳpaI7]hE4B1mbٙF+i{%1jCTVdNgO4=lρbm)KN7~s$>>ST/1b/)EK=-<c>Ϟ9fIT'O%ſt1bĄaȠeEyxJ/>S91Hts1>m9  H!,CnPKQ Y\g/go#0&JgZ-@L1XCQ+YblC'5j1r%fDGJ|m}3h ˈƅDZ3`;mۆCGO *z )*k/Cѽر{?BbREb` x+:`:0N:%B.ŬI1c,Z s悑f !FT*? <<,4xpr#uY"*9@HXYD9a_^@Ȉ1 v$9KQQZ5 tF`rT$  @-ӣV1l:EUd28 {+#Pt]+eK+u*䍮GlryzI dfιaeTЊcmYbCnDRa>Ya^p! yede 31::j@. Yg𡼆DF9.v]G"TU_8 a 5{$@ Ard7p706l_-[5wҩ+C/%-L'mbFY".@o;? ExY?˖1ZF11_1oMld CuqPKIZC, ybXxOp&8 Jg &t IJPm Pҥa>4etyICQQW} M~x.ǩ5~VP෢bb*6-11:1Z_'fp ΁`סVBqqc7^M 6cPf>F_/uGYdIFz,|b)ğ .о1XY1}[#n!>%)q{8 Ð xZAT E& ;q? -׫ &*_qldH@ɠU!%6wwwy s%p)8<3?LfaR|5-#u:' STJ +, [:|1Ɣ$0Ӡ4 p ? CL.m.[(EBd0ȏVY۷o#2&*%@QE3e@ fNH5IH3# ̪81Ϭ6gǾĄL4$EIDAT0o3%H!B]-LkX zm$)6ؖz%@LX#T@!gY`l%eCT4+*rd +-e k!~ WhRY!‚#=9^:(3-yIHDL(x[_[[b̰d-:Ё@5Ƨ$[sl{)]%g)Pƈr &@Ѩf i/ \ռf1bĄj &U+y4׿(@L1Z n ,,fIENDB`fotocx/images/warning.png0000664000175000017500000001166015247006660014454 0ustar micomicoPNG  IHDR@@iqzTXtRaw profile type exifxڝk# *Dq9@vSۓ;3\q>bU~yz/uuyO[S|_u ?g<~_{B*wwǿp;7|78UmVI.Ÿ}v+eL=S8*yFK)_ i"w{Z$\ty+\.?-\+wy hzԞ;gs{m}#͡A} H'ܶ ޙ3[ }_%d[6bmx5ܤ,yy!W)?q-M66IRϯεЧSfTa[Ķ\#Hr97)*bL2ʖ\k:#xw/9 CB1jD>m=ɘG7[*PY/wOP9>vM)!׎֏U۲ζe>:d軮\Z s=vG>}zX|}{{Z;վoYneOaVk/2{%4g$mWHI;]^;0xeߙsVwpFz0#%Q@"J?jxo}n?z@1,wk$BѬXQ %y(L{ۡ쇎5r2@<DZfR+1z$5mÙZ1}c4cܤlSs9[+-Nv'qOX~VuTGS6')!.~6n`y)FVfX&6tcC'<r :Nc0f+ ݣ&àr7U\23vYx zܶd؇og$ 8© \u;Ԥ3Y6F zC |;au`=<V[06cG?J4)Z;'ܯYc)4c\ni8g)L_2.qŌ_4k楊 cDȭvDKT]W̘;#/ Ndؠ}hB̥=Ga43Pc:z sBIT|d IDATxkpUu߹^$!!HyHk|!nنE~397hE^(!pPj.Cnhv$pP^W$mk#_J>CjhQA"y"p&I~vf^*NɡRP ߃_˿ ZV>ާZM4 Pu7YVMK+筃rknM G*^Cf(põ v=M &KKmnCIhԥ\ifρB/p-V. Qɡ643 )en=ߥ%F&]ߣ[2="o 2nXmKvnp5YPO6TH[2gzc* m4b0  aҤsGxozGwl #`r4DҶ"f;߆ةK =3vx ht\ׄNj=_PJ/ A1usD5xC˿%R2֛<\K>a~24\7E( nSW-ĄZv(^p2KH͡l!ё) 9%n*Sÿz^k'O>hϱJH@PDw+;CUi-(,j?O e jahf;FPe}O$1{{U5%1-x9,eo $3@JПY6*i8vW,_W~}ϲ*)5Z9 ()6?q>F&3Q>Qlȓ粉$im.̽&x*SRR` ~ NdFY~k P1@0̓FMŎ6bޕ2xLT7ٱDp5hB bxy)5#NUV0g<ǎwaM8o/|hi}][q>`qbwRYީ-U(óS理:I/F^w܀']|7 ΏFvi(1J͔<6RR<q];JM֢fs*dz Li?˗Kg[d<7gb#o4Z+Ih|?xW~bpctnYiC6E]fpIIY/v5
    ^ 5YR F.v ݾbHHLg~ߡ,=MU3 EbH٢f_q5 j4G}8۔V0[B+؂5hhj d*wc~k~W;oίϿ~7ìxqqJ\Ojz*vz^_Kw{Ov߭/\r9ox RVFFu2>)-w$^p^׼wO'̟o5αx 0+]5@ɝA`u)]˝о!8̩=LC\WpƓZA l7QJw{E*5J޲1 A"G6G*Q5Z8bG5s|Oe8 NHm3]ڴg~!!J"NJh:^Y-`iw;Ȯ|AD'ORYFɴ3K.g@'BB^Г,FII ?%Zk U.Y:GH֖Xb _'[?K sLz1_5bLy]%._ġޔs\ x<.7IENDB`fotocx/images/flatten1.jpg0000664000175000017500000005175415247006660014531 0ustar micomicoJFIF@ExifMM*V^(1fixgnome-screenshot0232~0100fotocx-26.0: Crop: width:322 height:269|fotocx-26.0: Sharpen: median diff 2 14 14|fotocx-26.6: Rescale: width:290 height:242| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 269 322 1 2 2 C     C   "" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?P((o] Y^_ma)v]u' Ý] bqNőu]Xog pz|o9W|=/ҖL1Dʍsw|-Od|cf_sb09ޱ*>1 [?!ӧп+c- X~fE9zB֟u\XC}m-&V zPrZ9]>ƾ5|S?n+DgƝ!PE&= }sT|`]#ŇGΕ;[JuTv?oyzb>&F:Gsw|Wņi)giŦŽU$q$}Cƈu~&|uec|8[si1@P9G|=(,-e;kxJQu$_Bu0hwj?3ی pnu{Rܗ/TkXE㻏' danr3Pp oeEc'lNma[a-x9ONkyRI]cE(I>F]SOiF[E\)Q5PCmg|Ot><_ 2_xR=Ɍo$p:ne{}g(&;iVHg EZ>; [O>'OhX'{K$O=2:׬xgτ /~(|oxvK;8«G.G~vBl־xc4~4l4m0iPVJD{;|尹Q |Y_GS Z _ xoIb)eWW$1GQxD_ƾ8$φ yvzo ^>$k}9mZPk. '=k@ P^^Ggw?ASJ3@Qj-lq{כk<Fm?U񆁦_@T)P܌<=3Pmmnbh.-FU G;{{{eP}FkZv{EPp_EVd|c:'X$ҞTmll"żQ%FIrMz-VW/5K|6ivGY$=(ӅUK$r2UsV쑷$!n d"m=ii^ vW0Ǻς-YblG SAE 7dcNcqs2zzM I0I *z(z6ֹP}0“;~?JhY ?!ӿ#\ k>i֟š޾s`="cp;NQ ?KyſDxSmsWI`IuN0p ח런uR/xLΥf1}]<*7d$:w/Ht_)tȀjxS XNPJI#`4}/oA:j:ق̱;ʓWCG(NQp<V[> AР7V^#KV/P*I>y$h_; uY(Л,AcA^ ?K;~?Em>[Z|+_ 뗲]//Sٻ3zu_cFٔ|]oSCBj+勑`:WCG(NQp<e$K<>"l ?-$" 8\=?샢xƧz|]i4t&N"y.RI%^ ?K;~?E߰+s·*w<Ib153 l]X95?^,񶫦[=)Ժ|-bPqjNQ ?K~~>*ޜOKêj+&_as+o /_ono|]okmwW!HnUrO$y 3?K ?K|ix[O{;;_x XԢk8.Ot%'sI'dMYo75p3~3a^||+ڿ!ӿ#CG(_~ͺVK8YZ¾oAj%t&v/Z]yXa"ύu 4S췾ӓV8K{gUːx); Mr{o/#Ҥ(fGQ\ߎ=&g[uHGF%WG'ֻ?eW.5 pqv }Vn>߫зx7pCB'n9 zD/[Q>@I|U,^+w%iM;OrAUQqGo0Z w_mk)|mf/~𕮁xqKr׺J4-EiUF]u]|ci~OjLԓIZ5ʮX ,.kί[4XR|c?ִYPH8W P&t?) jC{vֳܪtbױ,ᚋ_Q~ک V.gq0Hz'׊έĺ *G_m}4bG 8Pvk?/E_Q~-yX6WӢgnIb&y$| ok~մX}B Ѳ16q9@B[?2=ڵZƖÝ;A{S~*ta䑒8Ŵu'Z|p?/dyx`A{Q{qjX)V)$r 4l:[? }C.ohQEQEQEQEQEQEQE.h<; ϊ>qɨx_L7E~ 0,|WlsGkU߃fmu* V(.Gf9ew*q5)$LV&x-4m9fɦ[7fGL1/3kVk? AwywJImCHfvhFTc5OoK-}Kj-Kǖ 4 OEӸ &̒pq۲e_w'εswiw}/iRi% sYN\Wc@?D1΍VX[x}sO9m$rbeُ׹ v~$7>"=fҿğ]͒|_#дȼs EAt/k5bv4chr_zoٓ)ѵo9AMa.F.M0F&QbJziҿğ](W݋׼ @{Gz|G}g=eB$~^퍕m(V=޸g⿴& ~UW&d3[H7mMUFo^5/"|@+ O6=&Tdwlɷ%M}z^I)% CtQAT]ѽ75<=㿋_uÍ0G|Z kdԚVo$~ NG9+A|e¾ 6icӢhb-_]fPc T5wX"+ sU?igNi9ZTK9[1۶G=1U|W_ml:΅ew]^}EV1o.ͭʻr5N?Jz,|{y.dޥSi9 HV5l1ƄI>|EE՚Xl4Ox^GYH'Y({q_@No+_+ ˟ xž> .sCQ)V&EYde #ϊd5埄t;mwQWh.oE bH8 =Sz i>|/<1EE-/иU\3cuuEˮhha"$Έ8UKɕ@>_jiOCtut;CF OCtut;CF OCtuuWUw AFp_ƺ\C@AP1xK!9;fQc#L}iZ+;H$ /^4.R"y0ݴc?n<:.уh(7Jw_?G!W4`7Jw_?G!W4`7Jw_?G!W4`7Jw_?G!W4`7Jw_?G!W4`7Jw_?G!W4`7Jw_?G!W4`7Kw_?VtXi35.:2I3q15A}Ģ(/GA]wLXBQ&.nX8Xb?ZOϋO +Ė7Z<[Wksˇ@~} }+^7мP0}i9-߬]ż t mu[KTq($Y^8GJѭF]XxiKoyx#P @j|=xާ%栾)mk>iLJPw[,xOkڷ|k~׬]_K_3t5Y-}NTW) Aw9SV6| m^-,<$fI\)d=Gz/2Wn#=U>a.0f ǒr_< y[+{k-3etn6F 00k$C@ڜ5 ١Wm6yd ??? o' 2}iq_υQ [?v>d [?υWk@'ր8O?ƪPⲷIbф1 ע{梺kyhfSGȠ <7z8ϘeI|GXqЩϵqV;$5k t+Xc*; j:mMҬntRQDg*)n##$ dAOBugnKm1@I(3E-m(#AŽ|-jO?ƫ'ր8O?ƨ|-j\Z2}h|-jO?ƫ'ր8O?ƨ|-j\Z2}h|-jO?ƫ'ր8O?ƨ|-j\Z2}h|-jO?ƫ'ր8O?IƫS~(淚`H.sr5dў@X(E_6~:f4O[[jh2;BKk{(3˩¸'aGCh7Sj"Z&qإmNsz\?ö%կ4mQ/Me#Ide299q9Ox ~\1X$zO&Z=k_ +z^MxOG}br~k/vבƧcvua ڭƭ ў\B⿌4 +gu;z/B_^]ׅ֬.7:5soq IH:")һQ_4Ƿ]-Nr6M16h0oH( })֝޸k! %';j(cDq`x~G U%ҍq%)?%)?vǏqߵsv7njd]2t}]BIH8,ULA&6J.FLN588ʮzׄ4[m4 ڕ<)->1 `HU{XvFpswl-bI $Ae<*VK18ڼš>uI&e___ ӼZ,/  g. YA[ZC7YMd oV9TX188'_ hz4 h~I&(9~j׈<'4m?Y6ܑ:q~~|I<;hy{qu3@ƫ22d|Ho` ۨ&K܅3;*;@͝#E?bZ]fmg @ו~?^ă[3 P~x*ñTy[Kr%oSv#㲌߈5]Oezk]X0,fмvgqbOeKgaknosI|?!v}]%9BO&BO& (.h.k9BO&BO& (.h.k9BO&BO& (.h.k9BO&BO& (.h.k9BO&BO& (.j֕mK帚w3qZҀ(̾8|HM~voA&p-=w|ckv:Km>2>y%UX]'/o\}an-S ܓn"%p\fOx~%OE|A@宊b 3`|ȓ9\RKMDjxmX𮡣ɨ)5e]2taE?SoFP݆jQ-ֶSS̹V+?/>ݪko8P|ֽ+BT.-&ZPVǸ' V[e kbKaVy}nDڊBORkX[BDIEqznUJ)HIBlżM @)=Uu"YR>EyӴճQu=4q r2n kJUqdկ6FGoNŠ薶/"_g^],ߋ}cʷd?e[ϲ\_Uufx|> ?e[ϲ\_U?./*Cʷd?e[ϲ\_Uufx|>ʷd?e[ϲ\_Uufx|>ʷd?e[ϲ\_Uufx|>ʷd?e[ϲ\_Uufx|>ʷd?e[ϲ\_Uufx|>ʷd?e[ϲ\_Uufx|>ʷd?e[ϲ\_Uufx|>ʷd֩Fn+ ^X$Iv"G;WQE.?MxƺMB5ciu\6@/suo7zeHf9)20 N %ݏ1< hҾ"xK64)o[\(0$c[Vn;iZV4X6nVAh>e>NamX[yjh zm;hny{Sv=Tnn=\F>Vnjo-1 5Zvqbm8\Gt Я<[ey|Aelvڋ.e ) ?JO|m%h[zB .[ktw C@͹gS o7G5?t%PF>6njo-*5?t}S o7@\EPF>6njo- *)VQT>ѩύK7?áEiiѩύKrCK>ѩύ._}S o7G5?tUjo-F>6n~O|m%h[/T>ѩύK*5?t}S o7@\EPF>6njo- UO|m%h[/L )1>f((((((((((%( }R[k[+FX$>F} fQaҙxzG4>$ | 6XYj:׉`;"_\A^N o~0)~֗izb0jE˽6 2ڔ_6m'wn7q0-GA,q܈G@ 4?B[b7+o>̇hn*ǥ?P;oj?Sr۩Fm^^SQܐ1ǸM|3fE~R>F+m1Ӿ"Ş{ +#ZLcyShG%P ׽,fAm2獾@h0dnVޱՈ]fs,#ko_8д[Sm ֵ j൳d F (7?wn Fyt=F8?_貓?tH]kvV=$-3ZMtۭxak 3twW&ėًZݓYAo=Zˋr]'k6J$ =@yV1[ŭ=MAR^WmyݎvjoB+mQzD(,/45$2鞵7Oh>|RU{ cBV9|B6"{׻?LhrSF( ( ( ( ( ( ( ( ( ( ( PqJPqh~Z9#J$HJ J|Oo? o^ӯ5mJ\, Lfsmns_FͅĺG'2s ^.'-(n?(Kh&gÿxZt*jD/>MdREF qZ7SAF7c_i:;Q_&MM2e>r\rC0$A9nIiO|L>eҵ}-~7LMk `[x`Ѱzg*O"xLGᦎgG?Wo Ek5=>;x.mxo-ۈ㻱G029zW2h4D*;>-|Yn<t+omS)|^;>5RZߌ=/M7;x7ep71 w1(t 'K׾jZGHm]0)iVgrA:"E`fvO跧5NHѯ-,'.ԨK$`j1hJfi!h^cԆq5ϭ,LDVydx݇b@SF_5 Ԗ~=.?J&!ݼ({qWNAb?/Kt}{U$:h&Ӑ2@gH먢(((((((((((((((((( (Ofotocx/images/mashup7.png0000664000175000017500000015037015247006660014375 0ustar micomicoPNG  IHDR8{tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 317 347 1 0 j\:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:347 height:317|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:312 height:285|錒 IDATxXY6}o33(ttw` vݢ-* ` HI4ݍ:ykx08;<7q;>Z^5k֕FTVV^d'FTԼ@EE9GYYYovϮkwyzq:3\GmmHv'Z6KJJ@$FVVg?p#??999|Y7gv/---//K >3 K8<c2 挌^L|)aL˛=Þe|fu`{y3eos)+-FZr_#=;z|(**L_:i T 8S=g2G%c}3˟ՙMP^7ۘ=uF[X7啥p{+WVX򇄽@(ߋGؾimADZMs~r5+aɲ"O1-E?esܲ0|Y4㧂 `2yOla4+L2d͆5簲q- t^Eyn]؎`,d{ 4 d>q{f~:uYͫՙ1ȞXUTUÇC]]8p ;}!>0PuU^>8JrP1_ x`*{LB`N!ڝDp+Vt*XYY\<ـ//đ 4t_Lg$01YxTjąz` c(BVV 29O-˗Woi%w3a˽c4>.ޮ1]SSS-OZZZ}pl xFj2#Fׯ_ʕ+8|0.[O[Ҷ`8TUhO܀!(JSRU"*BVWLFX*PVaxF0 <+SwGw+G“%A!)@MM j"AKKs($Zw:s໿3gN׸=}}[\"{\piާ8޺7BPP#Gpk .춬cmƀ}s[۷ocرpwwNO,p'sW Leg^m@ƀ2 K fw jr)L(6qJz\RW0D07ng1FS|p[wLjqf)=iعrR␓D$1JGn~|?p0쾄ظڪTn :H!\I>)TDرcƌ={0g,Z]չ92ICGG4И?Oer}% tGEg?0TVp6VeNIsغ $<<YpAwÔ+*ap86O Xjs  FücЧi %bvku}oc$JP+6S6nNF%*K~c3`4c3Bґx s@JJ[V ~|2$԰ )BnR0҂= hܻs~iq>G\}@/GKU%G+e >BAVF:v/=owxs{wdol3w)֙|lfY 4=Y0?`uNQtXo`Fn}vݹ;spzn/݋ɓcLB}IVO6%Hxe 4pq7euU bӈ+DmO50fAYyOc*4'c͞3F;Nc#=''1  S8~:$?{7bsQ]S\Xe5,;pa٤K ąu3O# H |81UtpGq}@t\VSOs5ynT(my| mw: WU#N p5h(ǪipB|\rxTFF}qX$$j` D{bu)`m/2q9RcI6wN;3ga)0Նx\- p5+%Yg`̋=Yiq'!+RqT&y\\^Aߊ3gaر~uV01% 2Lw:0}TO[u;Χzrc6tpׯ_6T.]Z);Ƒ\emҹ\M{\X_pL܌PjyZLX}q%}"D]SU( T44.>\];*[\SJ -9dbCչb cpNT#dl:| .x1p=8)5p > qHkǣT0p4O·4559)Z WTRǼ=[QW-KT.h=%rXZˤS܊N+DqX0'hjABM(Hc$+̚=V+N|zʗMw [[n\5XYYZ=u7\t888 00ý0:{'p̹P Qc&N(((rm9qȏ} m CMKc-ȀY!,[7uU`(^U#/V4#IFF!,s ˊEQ fVe(rn톆p|p8pہ~'P +S2|--WtV8{ G TԵ8My9%p44T!tHEƁϑM:=]aW +obPP@>A*82-dsW * L_yDa!-4 "bdeՁ:dȝ=,tm\2>HBBZ?ں!׷͆Dĥ1}I=g ejgLwcIۗ{)k_>ےp_X C0l00`$5ɩ? ed|VPcf␕S%>tc%IVQ;јX#~A>pefZvBZx(_ eŐ!C}QYan0nF!9>:7bUGz?rS>~FܹpLu -!q$7M#8җM9pr:h<>݊B,Ly|aYޅ!v>|~ 7">~6 D0J;L]QT8ޮ0mei8OBRFOAr8gdyBtmHqwv|z̀';w@tfz=zwK|맲7nlY9;ڪ7`W8n!FDKs,Ar/3Ԇ $#aK z >dX2C7{̧:+3+{8}2,|8!1X@N_Gv벲:?Z-ϘX_ s?nܺe2gEgس=7?[gXN݁ik1{u:d>N*3oc ĕ PϮb1Jo`>oD} M~oub]z< p &Zse-0 );4unst1veͮs֧] lx8dxo;ml߭-x8dxoߍەp<@p-;xm `ffGTd$g{Gwڀ'<2$lǻ&^d'QxxǓ~+< wHxu48'Vx~+(mfHK:-ܫ*/{Wp:u^A!n(C5%||✞_ݵSf|lo\O[uJFD JJԻzӟq'i«pCdVpQJ<45^ny\Nrm^yy9h jŬ囐FQ¹/9uXvHz)PsS[vx'd_9{fl܅>{eqk3y"O x~m7$GW_ږ!a qڍxYQkB YSF8_0_r }6Ώ8{{pE s} gL I䫰ý|%\º}~=:&w@^dym{}>?=;LʽG^W\#ASV?@Emj*SXUz.B` Em'TG7$Dpx≋^BIԱ>oFqJB(rssB! xrr9Qݎj+C H7B>thhCg$u9w1EWg-DLi9'R}{6X &׿pdǑ6Ćqj8Ւ&SMe½0PBFeӌ-5ֈGhKb$킺>2$Lחżh~I[6k}NJW @am{hݓ`)?-Cnnj< pAL1c-8n톊Duʹ7nc%.#m@p˖L 8ta@lbbO^qگ xl9x=N w9K,E'}QG+jây0fhN_d7QB+%nŤs`Xq)-pi:#7c W<_@Nq ;--e3a>U/ xʒ\_iC ()=3sNqByxn{ql u7ur3"߶J9ڟ˷C0 {PW]+? [WQW.gA #c&Mˊskn?Bl8?/L4sm ,6Gbڒ8q\ Z8cBBYZm]!\⛗֗՛_g7M~Cstdaպ 9IQH*bںJP5g- ҈W7+'a1qh'BXp$f,ۄjN:EM{IxA\Tckn̝lƉ>y|'`$e q!e!jďzL\>0g}Ga傉>\L:iQ0TCG r \g'' eV3-xT  )0NU\qahRfT cx{$xB_YT70 wCe p.F ng,0$S@}";Y+CgFЉ8k=LuT7pU,]X@Xh$&ٓصa 51`Oz"O((J8s2[n U3K ]Gga6xO??89?Afx&g Si[X=#C?LJDLÇwոvd#$Ťq5kQaʚHj@5T¹њGEWˊb {u5 6'QPϙb`6_*, sʩ@]]-I 3|ct$M%o=bxG'gS5<2?ya,ǟ SW0RmIW l;%Rـʼ$]q84{@x8/C4-GIacHdiסTQOi#*RCoo2 +hCYP2DpU#`mh#p;!ӖI>0U”U[TIef{a^]xwC5&X>Ae;5" .4Pq*gh?+$ X9=mOZzp%0)DkdXjA dcm9S-+a(/IYڎ*VO$,G &PDbRE`TsYF18wуDx&syU)[{3ye>tBD' 6K 0B^ye(I4=I \ #!"}mI4ؘmE~jj(iw[K 8 L# 9-3QYY?o'5u\3rs^,3 jJr1t0,#,?KVQ>HHG";V΅ xV#44dq6 \v/-w(mxI9GU7VLƲ[ӄ_B!)(9;R.*[r=&bړ+j(yM@IKm't4">.H{g p8 I~Ɵ~}* .wť?=HNc ad~{|h(ɑP^9<`2vĄ{quG3cl@֢CN-3B=Nb>7 **eLjaCk;Ud8,ԝEzf*m~ pu阦+QQLmDa[Ȭ#`6o+[$yw* )ŜGA#mpMH z)rXy*XZ37!`#ԄgHE }^ݴOW{\2dX@FFR2PVU0~ GOq ~6YsKqjRJIL"~?,uCy2_Xiqp4!Y#^\$Tan;5y:hyPR C1zveݣPN0 4dq;tp= jCE&P9X1 9ttu`dTp68w }g_dܲV&xbdm,994UxC0 KzzzmeGQP2[q`g.mbR(3a~ v:+v _P%@:z07)bjbrfoY ÙȺ[DxLh*uLr(^ 0026l,\"P0o!`89mpm=}OchcҭGWh"=y3`jdMUyH*a׹[Vm~pom @Z$4{T�tE[" t:9? uCPۜk4\:6=m϶ p%10SܲCLBjk3md##'yiXN2>qVD%cT#لLU@r ª'؊PZ0[mn1ch ;0V[OW^zcnk 0|@ v-?zO!ǏI+vPsЖy׀rTw*y7-dmY?Rx"G))H(\,fWR0IW\\Z-S8bpt0MնͰ/X38A"eOɇ/!)fhaΎ5p?8f0㋍c^;SK 񂝔~ |.F@Y,yAk Q YwpgW!5?2.G }Y)y=t5Wb?1^X0A" xKpۮsTc00:SRbv> FUM ? D5P'! pE~.+vc~x_U%YQWƖd_QKS z6o[ #*3)ݴMWMsz`l"{q+5Օ^菛;`6N:yp ]1kn+-9(Ofk5u.D*_nƒ!0dH+OjZo؉qo^Sm40۱WI.UM[v(Djd%jgt8uIw55;K!-.s'|n:>AT[Fsܽ٤O|2i\Hi|{ /{#%5 9dUf:8TB,KBo\y茈ēK+s& އ/hM¦2ꐞ+W#]7=3XWh*ClF&RRRD'!, `2qvdȪK7#>O%gT` *hy jIaቅ 1e ܌ȗ7NnOdo JTSS vϋ:Z *#ez'B#2+jQK!L^)d}--[FLf:hBkYI>0ˬ8&E X4]9v+c5H"ysM`AVjĄK]|q;:Thlc/Gq\HF (ÕUʭksc%nqy ^<{>w^%v`NF: g:y0SE"A&2ޣݯC_I]B,aIRR H^[Qp:}s=  eHc4 14؜N%sa?4UkV0\+8,QU0z f]rnsw ̊*Ί@>)?11a^PPlY9a`:&!tp˿[tp0y\L3 f̈́-ɤ5pCsOOPN6ZVj+C^I99G2TM4.?be~ X,h٧ aQI,ܼ~n0chP!sxr{Ն9!$*JGk6 Y[yyRPeTUMmL8,M1JUMTMxfyR@57^|5W];chm4Nwɩ3?Ut l*, M7TCh4VsgX\o:r,J!+q &`4VīGfi Ybomu%G:;Y; 6".(XK)!-A'(G@]un[I9abbCܺ4Xx<8CȑK ?-QP3L̥0H ƣ|r̜> 8 9Vޅ]P8c4D|t+ɀͿ972ƞ9^1}!?aAͬFx2ދ3ðfHLl3-:Y1ؾx4itj~VcG{p߇=<}Wq0V uyC;>yKjnE\d?rщk Ck(⑃R{E9pūаH{y&[Ea&^sB(NƋgxhxM~A%[H{Vž{d&dggGN3GJXBW#6,N?|PM1Dl¤#>Cz') o8l=#S9SyqKg /R[]Lw/UJXس_'N-}M8P>~޵dK;=+ݽIZlCt&nuۮ\zpҍnۀ`8:\Z`t> z;s/wwt,OXYk*PUYAC7!HKI[;S_/usg_2?VeݺygsL181|}cp|paɭOFO]7d;q{:+`roܢmn޶-1Hr)0lۗM8g.;z4>?m}⢃qQ\vdeYΟ:#5-/᱗/J{=&;)wPe@y{)(7Kgxk>\\?qλ`nɤwρ\۪5[ZpKl|r5֠m=ۃ,mKJU)ܶ[PRF=Io3mivmی]۷a㦭8uՖ%= 4MmOۉ=;UKyjd6m]ݲu{CMnQ$~1x:M 4SoG$m=w:N"I#"=LUGQ-F\9#oS!4tnD's_LoWG[x;߿ 훱}ls6#B~~APFW̸PE$ϯP𬼣Gߡ)O}^\E3Wp p3e j)іJXhs%UuW%gqfn=A[FSx>QHXlۊ4WOXf_Z~v[Ԕ{~paNe: ;(Z 'Y#ί28x]Q; -#",lG=r]]aQ%+cDSHR?c)(D]we{?s+xds:66+LͱXOM )|>؈}^û7b ]qg}3,e8!mBTH2XssSjOc,p}k܄ 1Ǯ}oC#yQgyiӭO!XP=ǁMnQv^LC ~Yno%KG-&*S=[:cMohw 6zU4hb@A I[WM֟sE.E;N њ 9 *wiLq:s(RȌcagV,툒zlF۫ky qx9[b7X1aw8)}[ia>  U#N667wA^BNa<}! (^X9IkpOd{,ƭD"/;۬wʸ:K?7M°i B6=Fg L8 VQtaZ gϟ 3BLߢ_.: RRB,kIILСeK! ,4iޑRrXB"Bq.({#ۊxmy M{bj*b(`X߉Tg< /YQDҲr N^+(: ^g ; ~jcQ+WDӳk!5L&WfCKl8EFOQை)n9.(_~F {V]f`H+Żd$dӖa/0Tsh^^a/A"ɨS8up;L)2+cѶІ>D›"G ĄgΝIÈ5bn}p9JEF"f1ٌ߯0Ok_ԯ$\ρ K[)AΘa$]אPԲCnc}έ0"E h~>IR?A7؎5ixct'̆zW= 8Gj>SdDtE#}nBK .8r{f/A*[O5B.ɴ54B@ѧ@EdnA2'4nnH1DPba՘2ԒƸ͗WSZвw >4?@I2_ڢ1x(>|[ |ME IDAT}h}jlYz'껧Y-rh=Ԍ:6Y#՚ 暏²㗑C7b FJstkqfֶDmmP&nP/)":۴NOۻ2ZU! rr~ BR2G_ܓ#s0\L>e-b_H@/S4RQFԜ6?@hn;>GTt"MX uSOgٿ}uh:hN]ѳ, p~E)Ȟ_J ;|$EF~"pjdBib?SgZOo0C^bע}a]SU.b)ۉy\ Iu ݺG3 O#9Q )aى )hڤA|zghVCP5#ZXX#_ iQ1LhTCK`کT37l_2S,XaRAxX/~^B>oBgrXRozU4]2p LR|tLafncccadl 33r3Ԑ=TGQ)L]naw e1hCyN\p:C`:st !Xn M 9-݂(Q`\#CSm9D,%x웗a,g.!tblj&|`ĕuXL3_=߆:u{F68Áh[;۱ǖA^Tq{zFjj3=ٚC8=}" ,ԤF`稤,,\X?3h,{ٝ a,2(<p`-Ć\Jmˬx7!%5G3PC) c(hPh ;˽[R{bpmEwԞͨ΃ 'U[YzP0Z~kU4趤௯ pUaЗ2L82P+qqRRS0Lk.)9aȪƱO]$Uwwo?n½7qf)tFlrdTpp CJb=x{ y*z_XR_J1bz[DVS&/nɑ| < jm'd m?"9X4D`̛3c4 <K_@GY MEi(r$l9|IE?|quk>9 Л!mKWn?w p2B0A]*G.aQ3/I"7gpMH#899ѣ&!-:O>CVY8/@EDj{ x'GG<~/<m`f}EKLHꪊ:O\?nNlB $/=/ݞ 6# TNCmB}׏hҼzٙҠtƢ Xu ?~T8;q'٩vHٹn. _ᅧ77{$˳d!&!KV#8!\o*Cњj*PRӇ$p‡~s_Ex|:U`0j۹c$ν6U^@o7D'X\v#2IIH֟>sCP+x?CxB>r]M)|_rdՉƀop(JE(3!Ϟ +\ભ(Bxg׻;wpT oNj0Q(+)ANA #3~I}\w_5fɣ8{:k珇;U1dih`ƼMD~ZD7T#g-j۽>A@BJAD%1;PVl D$|5P&8̬Y[iv }=Up_F pXptD(^ߏ? el.4 #,̋|h')m!)ٖ,v5 l!~ܾ\[ɣ[Jʺ?hAQLgp?=Pt2=v}ܜ?"`[a{ߠ٩#ѷzJIJ{w^>kz<^7zgR/~+rԽseƕϰpg7w8ql8θqsqFk8nyp8 p㌻7q8p8h63Fkܜyp9Cѯ#;?|͋cϳ",/I;nwCq/([}5z|]B )}kQڦ8B_'`#y͑mC9aEMcpl^:C;Fǐx̱9$R?Q98u!f/YNqP=}NL+ߓ̡(߽~pvE^}b̨8x_%Ņxt$&atK\wy;ޙ ~]kI8ztѮdޛ&: .ZX($ m!C`wР>b$OxLrPOlX\z_i!*9--GN +1Sc`w8yx!LC2ilj 8 4I<j"4"4s,@ ev }Hk]-( V35=ܯ(mW/GZj(l+?&ɮ_E#sf{~ÍCG_rwH}eP]Qq)е~%F˅|okX5.ѯ"T `ˮ}8lDk1 3Ĵ&*cs(x>tǤ5ֈFyxt#5 _5\)#23bqjք>TGwW]:QI5 ~#a⊾ _48n ;Y7^x$XԔd\;2\][1lrK~TW\W($/|5 0mA*$ryMtl.Tys{h+PIs&AA^8@cLxrt)i9YO0e вe KJcڽHBVK垃4o09y nȫxt;䥥̑>NW3ׯБ[Zhy5mܠ [+@ I qjb>vJDbX3 ڣ-:vEF- riByj Y%X,߉K{ɮd&r8>zUR\ `C -)ZB{RA[8Rspf4UbRWꈾL`>?h.&Q%+"-7Eh6& ?}bL<~O$.r_0f ћ. &S 0gCRY/>,,XKlqtt1P߇6mZFk.4U39>y1}@wª,O]qӟo/9c~GM߲-ӗ:;:wşH+)F{k)bюȉq쑺PhQ LŜhVg,CO %3wLGk0p+b&ӃRmھ.j(4qދ<^ڮE{N8mB\ RR&݌.ۢxn zwyRʅd;vy+aw6.Uj8 qIJ/]1~>4xv88֕3ѥzY+Hپ $(Bh1ICuڭr[D'iie_2k n•;EI *:@JrC1&"88κ pX?uO J ckȶWe x^FMC׾pRM)\)v瓍oI 4WOn<,(ʋ]a< <,Gta1qlCgnM&Bߒ"C0s+ÍL|)r# !;O]esسbS m&3J^f >}%I8Ӓ\s|Tyx$(u7W4N큅1aYD5,.,wǂm\U^O1ڠoA,5>g,!;q [X?o(U{=Đm 2CAC1a$̙kq11} pיZ/s.k ;&[1O8#iRw,Z +++~ed2P&uNhHgyO{Y)SaBcp{]̫Ў-|7_cL$nlbj\wH;aCqHtٍKx;% m860Fo2u m pcnsH..޲;^q&ٮ\{<9]x,I]!*w?n ݞF0TZ##>;xDOT-<,.!(Q٦gMKζTR3;'~iR(#j\I^^*n,o;*woK*]ԗ>ס,#+!KyX7u 5袊 EDFRV!k1Khv3=)ɈEzzC; mZaxL;}4N9s/yp]OCSMF#+ppͫnJ@Za/ $,?V^ =JGܝp|hPV7jo5Z/nFw&!nIƸ/t.]B3Y쟆28/({߯tG-~mWgC>WW̡4/#nUWgE)>H-`]8+' b p2f.tQw֧'e Cw:iYLZq'#($Q欔h,Kjk"b\ &]e1~DfҒ2Qhݮ=l]3^Pwt0!G)cҍ!/.f":z' jA3g1h,T07PUTM+z`p/Ut5BߛWiI /)!_)ϫ0l?ZIH!K3bM\-,ڀ(x IDAT8N7C{~ȣvZqJ2bp_ RpzGHh=be^ܔ[RЃ@6ߙVY;u4ploo 9[؊SAN2N_֭bHq-e"-F^\ {0 4݅{ oF+[c-@7Q V X׷NB68/난ݹ*kO]AXkpW2RHK5C$+#19;=i(KnVSg.}"5Jv,|LIq2S@ޛ`%fvKLD6uY+_}QASUx)MII`]/oغt>PXz5驀,de sKϤl ;<:yפr#55iT6D8Q^yJ(||[A^.__\ 7_tUli I:-X1)4֘/Ώ_WNA^R̬-W>w<V;Ack>侺mNF*)h,\˧"<e)l[nF _T18`w2RfdRTj;kfS/*^*T5~BFMx'`߮mN=DN!'b!{8&;B1`Wr59ok / Ӊ8 yJKSaܪtL|<}Jyekcϗ2[;˟LbeeƞqBWGZZZed[!=z>pecrM|W,9qkU'8ql8θq,/;O8q@pq7Z}`ݞU5/ŷ;cƛOgT`_e%yt0ݻ|311z[.85 0 R|$D4f@-XA>VyH3cR`Xs"j+,'aӱ3HDq |l;"t"`H{Oz8ܮ˜1dxDf1,*ە=|@;WRL1Nn$Qad6 C+tօs1b`m-eF˭045-^3!#`AZfõ/~YlF]!by*Oŵ+jO VZ=.R5b$aR\}3N$}YAO@M4M"-%L$G7ٵ ?qmY%2MC.gTDe]!W| ͫоBT츴/"*W B+LC&^=xyē;W6 ugSTwh"QيL')=t.ayR<UCbi*?}C -1bpr.Enj4,^z4rv.o1o)$zSdc7 êpqbN{$Ebl^Xi3vDR}{+Ʉ^rh.H)! ,tÀiH(_$xv$ũ%$e4k֬8ͅT+ M!~-wBD}v< &.$PٝAN`g5ĺ5TAa<Ճ^E=!)Iգ$,bScazOqLG'pϙ ^ $l Fkg!zr@C F4,)ђIFM_W {@O03^2I^z\GP2p7B@͇#50&.Xy CGZEx*U!/Tٲp'LD͠5x N~`DFl3ڲO {rR.θ,>t I^148]G4βBZ1yJ%XvGfv\n%3@ UKI-LG6s-Ͳ[3-: ,r`ű7&!#QݛBx98lA_`?,8\E24nlƼɋ5a^'x$tf8^" ,/$[0TjtT-K Dev<~q}hϜGw煮0o$Xy1qphcR#];$1Tݸ6a t+<$͢WӠ'Q>jPpVAJJ6(Ig,h;,=qZ*āEO9 EV 4ʀsx)7ouq`"cH#c~Ў*f0q >̫|[peB4s I Ž+hj;s/Pƴ[Op}?^]s⩏Z/BN0mżp)civ^^tAv)$b%i\u,>XUI48ln$MoSW f#" 1ivDe ܺrf-1oI<_`- ){pd  ˧ьyQ<7߿m[rK #L:g߻a{`,ΆWbwy9}'Xg 說dZe EDR: ۗO/livzo€VHh`؃M1{nĐg`Ėh(J`II+:y0_;`5i !7 (Ajf>m0n22e. 8)1`n> iaXh*ˢd^A-?2wXC ka@KSi)p~|_ȣ,iJ ż\,`_PPV/eu&cÍɋW`jHLInfmdECGw@>Э4L/!#vF+q HȠ2#,iH!l=cjL0Luеpm7yWMA,X~O \FMY*Y'#l Ovj,6BGZc< ]N= L Oq. W+/Yd:*Ă4,yFZ ˔e;^9XhkvV2ʶtdXPr"̌cI-fҬ,[lK Τv>-tѢѺ,,JS.-\ /΢EcKs~;\>#9-͢TrL ~WJi`Znv{֋9{CVy+Ӳl^XX:yeiCPװ<%XEA߳2dpMPlqs.+S^5+`߳E}>م{A Ahw<ѵRd#-̳>2/(?_묾+#[~j]9]Cw9OV4||gan8V̟i pm؝ڇ]`.V@\]^0yG*yUkj- Ơ}OzaܔY> ˎ\h5`C7..\iyp49q@pq7ZnL9q@pu4$Cg CKzQZX|Xx>o+Wnhxy>Q)jcmO?DT/.snfw6 їΞlpuA?^'D\yXBvɮn}W{=y䤪"6W/Eccj @2We:p".&*cqLZ:$B"4e#װY~8Pf=7e"=8_gbyIq $BڟipBQׯ!Eyg8z8Fެ9N>QD=¤=`hR2 #a|mMn]Tκ$?{2˩0: 6uxsnj ? 1q8Wm`uGn"9?{r:͛)SI|l;4|f3cz9͙S`L,xG/ǯDdali񂈧9 xWȫcJ(@ǰ18E-` pq L^dkkF&մᬃWW-7}l1bP <Ǐdž0i&m+ŧOE@FF&fm)ZVNʬHHS*)rF-i(j`́Xq8 $3nƫTpf\BZ`ԳES"@BFvǺ^Oa:Pd/$9zR_'|z8tg^e2a0HAZF8ZX]0] 3@ 8<אup7[ܲCHlNA?^b:pyC-[)LeFI$2N1)ȵBYGjkҀ yQ1r 6K)T6ŶW6WI8z6_fE{vq `Ep?g e:yyE%t [~s`yc =6[EKǻ~ DnvLԄjK8~z)jS^#\ |*ӧm9[}/+|fnb'a< +I.6 vuŐyp;y_Ĕ^(NXpNtSjϡ%ds 41V =!&??"SfMi;?v qW5_:a9:֣4MՕjQaF+,u֮NW p6L8gۤŶ0WX=KyO$Cg㾫+K IDAT7OO gmA\jV6ŷ=a>y ?א /I^=pMpꉁw6bjbxY=/TG]P˱l2zTuT*mҪ2*줆3p&*8V}9$tkb pٮo 1~D5#FoGCHNPL+ľv|+y?!A\L]t W5uQ?L4q?,p?nQPRƑ5qՔn r 95dI&{7,"OX"TgĄᡋ3=-Vf,8jqޣtGCHR*2He(55lKE2~DpOԱ((RqKr(NCվɌy4c$N#M|<X`.nݛػk7}_!>úwNٹ&ml&'Ocqhd[_\Kbo3, vH2{?_2Ja8L]D;(cBݡMM ]IHuY8z= ̸OCzzLӾ. jBNh뵩ㇷ8nn3(ΧO%رl2ԥZBE(.^^qN+H=\ێq-|TOaX{bLR-0|󿄩Mp{H {cYyYi˰p䖉EcH跒B{^f ^q$n\XdӬ3?~ǏA @Z5Qʞˏk=oKyFtR/D]ЉtV׀F_X,݆,צ 8tl:sp# y.{[ׯ4 `\rRfg7c"̞9fԟm6e.LYnE!+&gX9>xGcڞzO=~V,-/h0"<*i;:.%9=pqlݲ7ֻmM8z0= q1_xq݅ínsvE^9q'"BGEe;#//m8~8cUZ+6W/hЪ84F}PBj]p E9o[~~>:Ds C4|nh̟98Nj/|z 8pv'"* ?w\KC,|zE=H u~~[[W{ގ;ͷH"o Sqaݿ±w"IJ0p>ۍ=B9D}XK\1e.L_UEٰ Ha okc6MCx@1>W~2jIDT`? vmKP̯A>'ɹ5h׮za$StÀeD9>Yc!! }##34l51r*E%pqАM`/ WCNxW#G7w|̯Iyu/'~xjgtAWIހ'">.&[B]wXqB;A__Miz3'%^b5Ķ?=B0_.E{]&zFgܮc܈AEq#EڔY= z= >ydTH-F mb0S?G>ygk@g-i|3X͙B>PI+(O7 q>m3$oV&Jq߁Xv6.9k7!/B]eY =BV~4´U 9uEs=@GXwKd 1gxw4BYx4kuA%U{j#w^G$km$e oöM+Y픺S_ǂ4\عCFǡgpe,6JX{(/7O:k`r,Zh ^Fr9YX7A儾g(dLV}fcLC(uӆCh4pgw8:bx?ǡsHO@"`K0R|g,YOO"] jhӪ%L ߸FVyBg W'e p30r@O?}S?JuχRYw[JRX1 )di~ 8p5AV$1dMlć{;+*j)| 2r(\2AG:)1"!FFӐAc"8fx/)f0{.Xi1j=g(By&SؾwmaUSm!9J025Ko.Nn䃗nM-F,XJ K1A8"\,(1Fh3#9p\X9 qQ1*2߿[!l0| MzjD\6>}3{ѸX?- ƘAzP3F2;XNjZh')VhFV.^=AŅ8:7ɶa_=[X W@6uC۷JsqiHi‚`L55@ė/LMjUhsC~[پ:Bj܇E0} et Z+#L/4ӃBaEtXxor= LS~ p{gL4 pL OMEj?wURzh,6R*zNK'кM;^O2rCV{H4iVT^M{ty?whm)2qy(0g2.7fc7q3^5c34oiУZ6|jD w+#:[ʻUˆ`}9fWtQK|L&?ˀA7FK*NQ!]ѩ%* 8U y pgBQS{d 5'"n@RB6-J2zt2$1Pj'і++-b܁YFa<$aǼżyEpEј?u(:h+BeV.=8Tf\\] rcȏce XG4y}t܃NcbV 7pIW \{y%U/8qr7WB6OAK 9[Ξ^xCgCE=\D!P +'!-1lנKih\fjM2AZt,\?ƣθp llnFGq}a. I&P|=]$md @ 4\_ga>l@QNl/"C\&LP!xpB" ?&Ѐpqv1lF7W;_`oehnj{p.^>ՌѐS(,{y-[ո/OGmqS$q2؄ 8B_IÔųaԷ? {BAQ#(jP57+;ẀZN8ǏCQQ۩"29*@#сVww.ȥY#ᑒҢ,x޿Mh-7'[Ml3&'/" 2fP;|35%v Νa`SͰxrK7 v#)Uwh"LU.Jpd8hbZSBW #L^j &H?V(tF>}ѱ&/Fhl8c)d۵Gwn026AǮg/bIogqv)~p48#uݽ7)`£#_p,-1p ܺu ϞwKa|qŴ|!Kw {:͛ptrFTb ZyYm:k lap@/bPT$ y 8!Ɐ Jc>{80{^$uk2!;WK'SUjgGܽ{bsp-}[Τyx8Qѳ$^+{tNDF„Z|Fz "|^&Llj৑kMqsu/ʣZu@S(P, aOKW!~ypux!$%1qHMCjR|Ս][kgX'Me  p({c\ £Cmt͜/|Ÿ|mLrd 5r^'"X B2Dizܵ+M0 ʅHpVmrL|-quƽ ">./Iɞ1p+4yvNQEIZ*J4up pBܒ9t~΃0(i/{tapIР@RW!pZe;'"*ʕsL:p4X!keziWG]*~EWzpx$$"\ *l|ܝ7QHp“>z y+ ?7U1Byy1E nO_UlQB#D#Wg<('9#< oWRC< ? L1;>DNQY%\|/fRqñSM umA?g<8zh,gχ18*#w.@CMj*0`:aRWZW.+*(.+BUI:tDf`B+%_qkD} ㊬b s)a5Z g# MC_`Sqy\eÆI: ?'9UHiOW fPìm/i?vRDb%i{g]kqp%IBJBkR}WvrLL y qxjAhrݲ@mElmD`J"<|0dڶlagE! L"εSP|)q8y݁cLXPZ.[qU c9cf̜.!,(  *iQ#Nm_9.u gRX鉩FmbӯDIR{l| 0U ? l]n%%*='͌sAAL &9bNsc΢(f0 T *sΡ`{4IPpiyMwPUݫ^FLkW`fwtXx(Sg OLVYotgA6Izd-T:b023Oa?\!NG4IW_AuDݥпl[UA#g@f6C Cu6b訠/bDk+/-8\m?bG* ɿh\0=CЏ5fMW <.GH.}<~ r`s"ztE:yRdO0p|Duh*Ǯ!( i^T# [!pf(@FU~ {d!'[L UhY{8T2DMºI={"GCL ֩h^<| bhnq^F!== !09 aU!o3[ (5E!u/+R1T 3E^:P+pqybȷTƈ'c9gg0WnBNqm11 %) YK'4UTp~g@_5:o>a'㽱u:zMǨKJpP+1@M WoQ+.ʅãkRU5hRzp;ŰOspv;7)BPR.UB2$o`x.XL!$AH %CTMY^ފ-j@,`wI+#,,,wȽhѲ5 qyqb3]HxB eKAcu[.K&cd~>^,6+iG IDAT荰qrGJ2-0݉vAwX+ ;ݥfm_SScA<~ XL#Ѓ 9sf@z craa=`z?'AϮm@*V6~nX5w,X|cU{b2G*/8̍;62 S)`HvbUhҤ)NzqanV̮aMh a\6&ͅwdN:I2wox^tQk8r #ObP%磛:/= Q3}DxstnFA#-… 1l0hYD2x3 8tgB:u,cWrt_Cqa޸K+F8KZOa^.Oa;ϡÇQz",o^ 3s$f1qBԉcx% %mGH-gE[p +^(.V8sJީ0GVdm{SuMCsj*:Bқ^I4%3V_=ש>AcGp+Du; И ?!_) p}hγ WT=DN#V3֑zxjnmGKڨLeK\Izm]6];K6\-,71Ie 3MlQ>w*}[DP42g3FgS'p\6YG8o+X!VO*w0 kt7/kzj̖QLiYޯ?ˣa_H?56;ݍ3O̙>kVSD^D{ m@r 6t Odִ8T^[2WWpvʷ\ 颊;M%[رc<#,mPH6{n" pV?}TpN' py{e8y(lc\>CϿPޚB/ߟt Qcv)a\䐺ƗW^Y-?hiHMJDBbR3M5~JASg6X}MG#&&$")9em"Z [B*2Ij,$S ))}w p$pf{jEr+ϳy/ hӼ)Jowd‚ ?Ԃ-|]1Xwn5uR@=CE=nj8 & 6EСKSFFkܧONK*} ťp??-Йj -[uưE}"57*f^P?^u;~wAm+sTpcא2Aeڰj-8lد.X6cZQF/,7 ꏚㇷti}ѻܴ 'N`ϮXf+2IY,|qω(n@r9{+ѵI[L~z*=o(S+.G,X]7S'i$ KhB%I^."V ak1_5$2}s=O\<[:e%&?3ܳz{ХCNUKFY9\g m|1^ L qWE?sG"pA^o ?7x' .WD>٭PjI-PLꣂA N+FZ/)ayvx[[7sѳ78 dH j;Ut}?˔L.#%MUEK)L, I%oڐ몊[by1Dh1j2s \bĐáx VZ1bȉP-ܯ' E hR,>6kV |q:,MݯzjdUMmڠ0$M S2@Ok-aNZ'qr:b3ayg=c ۂc3 e,D\(~~ ՃEC._cˈô-l4Rk!\d ph${-̣)egU\t%,؎m[a]пt1);\d=uŊ㦈K"jt? .Rx",Xo @@"(t7iUHWp|L/qHKMˇ8DEYideރ1 GjH Y^N0;NϜ1ZSJZE,OEkhȕENmtn%MN;I/.;Vt*}cz:AQ p~NÒRz>?&Ti`C pbEmoXiFAU3: >Snp(糛%lB;y*fM h֒V e pѡ6Phf+_;{‡oH֏mBJUCOQ5"=>tFqF@{FJСu[n:qh"oEMKCO+#kGt<=tQ;aB11>}6ىPAvAWv` _sba 3Z3rC{ TXپT? Lu l p8?7BܧO|k; !9"oa\W6D5`g%1qjP'X@#:% }} ʪ>FK[U :Ck7RkA> ~CAKR'1ݏ}WT,2Jݰpv6{=qZvxA".ӥ6*&ЪdZWh^ .ۯYЊyڍyj9قgϰDg[8#nt w,s삀|W!BX>%G!~[4m? "U=cѹ@YyTݒȷ5B_@衳3%%(#l CB.)/mH7t((A3#(S>V1קwkD{`ǤILuxА(x=5(-V(alMtҮF)r $vFT+d8v:Ն"^(Ek+ \CKK,81^9>y:uR"VFX> eE3; ojLnȏ 5%U<>} pLYFG .{ڼM3'_>rl k8":=ۣϴ}pxcih 9X?͛EhNo4k+7j>N(R|.&c詖LF3p -=+to -a, RwzHz {*`+Z$c;9,s\N%>- 頻fd HauyaByS QF8&?TW=_&.Y D)ZrJ}_C-f ?si(c{)B]K {Diy-/|!jm`NPqaq)4'3sв+].TW)^)PP+gSX48ACZ$CSܻwxeg$MNTIN HO@F97GypΞjXj%aA "$ctM'`aY`~r [Eesp5~>6,K7bgkj,ӟ?OMO ij#ЍTC{ZdPm𜜗;UXiH>~  - !։X~icDxBZ&xaMX;f9s~^pEv| mN*Rk0o]-쑗_x=æ1kL̝7I훱xFeeqfe$⎡)ٳr6?Ke?c% u|.X=;@LD7ǜsp=s%na֜8r2~yK 86\>Ao~.M]زb, 'xO/557w[Va҅X,_^1\1eM|]lKOd ;?|ə?o.V,YKd%]TauLN m ᆷd6|}<9o鷲 o);\€taoc9gޭ^övN\p,`bNcW kdyyBfڣAHx}ǥh6?I~5|2ɥ b$edҔVL `ZWis[p57* [!%QzKz SKovק'ZoܲӸ{+p_g|mpKpS_8p|hm߸m/+NõyǷFx6n޲jU}p8pU6kC>"}RbE.Ùxx}t=6%bWgVH^Wu`@ Hro# BNTU\HƯ^йE@!HyQo^r"KA(L'xquJZLǞ41;wFW\$W޾u E.{TZ rOX}ѹP5,$:F!meւL$@~\*ă{ ?>uW? tv֏ *} BkyٜgugB8em15[U֫=8#-·&}p{l fAWn3l>28ﻖ7|y5̉ʍmp(Bܟ+x`a̼~VZ߇ 'd ; S8{ ypj Y~9YyWR2#RMLLI瓞kpؘsOoHYkKOK &[/.B>H<=*ȃq{~-8CUo("%u'N=/[ǷCVM 8˧4Z0أ?l+G}* tƒq0n%TB\-0u 8Zrce$ҡhҢ-N)=hz@I'ބ\#(@wQ5<6NŰqUc*^:i0~sOJJon]= *[DXxEE p0ayxy{~fACT~YU's(*̫l02ԇC%ul=|Lf;-v D:}sJ? 0!l(o)/fubc&Tʓ *O5y(;&CN7^fJ'iII5\$TgMn kq˧@q9 sR#ae"4&-}t6%PUQkFs{ yYYeϥQTz(tw`XM ar{#[S`ar{Ǭ]\xb96mVnS X1?V_FBN.wBa5 RQ E)p<jt`B!K:,zCVhkl>sIqΟ)5g.@HζExӇcc$J]HCWq2TJӱvn ~Si#͠:N 0JL}1stLpSiRZO5ERq# [f9YG,^"9\>>JP$,vsaztKCٲ̆we\UO|5'' YRΣR{v!/c;9sY̕P#[][9\sB&:deew$۵Ĭ-{WPDغhmdh?qfn]؅έZp[@S{V8_Y\fC7z s5S5zKNHX5 A`[p3J,8!9.uܣ6.{:l.@gXY]]Gbe(.#ع+m]&ȀĔ/D|4G)v|">I,ƹмiSDf#?#,U+t멍էn!$-&ݿlON\OUttBFr)' 'BA^#-c~PbNʽ$,4Yh; WIDAT玁l @z ;^Om,2/O[n!5i\:,tiS5,iWٱaA[,2[숕,|.?:%A-fфdؼx//xp|h2[,*$:66O.6&W.C.uHv~_9f Q&Ē߾x8{}],8is&FTNDKVY/( 802Je[-a%3-ߡ1 ͞pQ4z#"5%d 33G2"s pExWrx/dB >Cǥ!;/Ń3UT|I,Hl\:*Cf'eǦҵ-F\bM=ED."MDR/8-2Gnȡzd,D{ݧEe("C -2Dɋ4JP{=q Bٓ7\UYHdԂc&# >qDTL4pg]=̅g0,%?n8z2HS335䦡Dsp@8-hզ#=޻L !W,=hYb.}p>0DF&rN(rȴEOfsbÄ0s&< {[Tzibmضi n 0~Z&Е,0g&Ҝlض ,ءZPsz[̥G_R})18|l!t0E9 zcx@Sg1n64 $r٘JJ?}J7hWJ]m,5ʋ2c0EfCiGܫn/_ƕ+Wp p~It/[0XW,!Ax!n=DHt\I=L! ,fx [*Pw"8։¾+ݠ lgln~/:Xis2ǎc[=$y|[y.,;//l+9F?XY9h\#03kd HK|+FV\PZNVRS|kvSU%5biR^Poyu,73az U,"sU,\`  "1GCWjw߶#LKI&'`{Zlt!Fß.DeXUuXLo‡#b%u]^ChXhke)*XW.3^ \HA,*<M+i1X!:2Jo}(+7RY$R r^nxLm4޺?LO+OhE5YUD-_ ~!%gfzs2S3eGjmgPT"cI+l>Ww]U0Hnѡ|KQ5lٲ " 4BZYe$ibl]ss'yK;ח̒Squy'ݲ|eܤu,91I |I!ݲs}-U;Tz[p,iTXtXML:com.adobe.xmp 1 2 3 0 0 299 584 1 GeXIfMM*V^(1fixHHgnome-screenshot02320100fotocx-26.0: Crop: width:649 height:332|fotocx-26.0: Sharpen: median diff 2 15 16|fotocx-26.3: Paint Transp|fotocx-26.3: Copy in Image|fotocx-26.6: Rescale: width:584 height:299|fotocx-26.6: Rescale: width:561 height:287|6 IDATx콇Wٶ>z{}9}Z۬E f9眳fŌ9'%3nx+,{7QDTQMf5fXo?~ghF4 h(Q.S˗͛oi(Q@FxMuV~W-]F4 h(P|+4)4 h(ק=#U?_b?Sb((Q@FU(@ ㏐xxx?VEY+Tye_ƫW˺^ol>X&˾^]mIoG+OF4 ԀTT(++ӧOQ\\os(u)u^^oPԤmAnjz>6W15vF8s5̩ wOSZZ"jZg)4 Tn޼*jjOiHU+Tb'A A+Zouu^WeC}R>Pӭ7m5:}׮i DGGΝ;puuUnQx!߿R|pqqQtI *e&K/ڷonݺ!22VKDŽ $SNNkt P̚\{@rvFPJ/@ѱcGjÇѶm[w{J~Uz׮]qUYYYرc allk׮){_VϪomxx86m ###$&&j zRiDM]H|MM)-*z{jݔ:Y}5>˶ U=4S">4._[SZdnn.&MZ•+Wԁ@'Xgþ,>?΂>}V~?Jϱme>Fǣ]v pKIIQal}^Cϥ?`mO>O{xJe>7Rrr2BCCsFDD 557m:fS'}E:66V*8f8`Iu~ u֡]jh5 |"V^(m*aÆ!..r:tPft {i͚57nѣG(i + v܉M6)'- *a]VC!**ҏsyfȂQزe ۧE%OMB0h]b] G&lí[0tPcϞ=[ ']L7nPްav //w+WOǃ!@trrBHHnݪtx qw/˗'Kp~`WC P`l2XZZSNXd"(C I>}ALJկ_?!CD, ݻwR b3fP~Q‡Š F)e2d "c}WhHW ƍ+@tEZ,}7n2c?F{(D#Iӊr$eRY/|71|{SZ ^{dXvh]U u\OU-"#fŋߝ'OT'/F@NW/W?(#iĂ5 gΜ bH;E@.5>t)pPR?~={T-̙(y0^:4:C ,A AA AE˖-TTTT_|u92hz"Lh}`Y"L{@@ŀU *k>b 4lgעƿP|*o,]WEԻwoT0zܹhѢ2 ֖̍_ H,ZW6!$}6m(@' a$,(t,Hƙ(c@@Y+yR#c 廡I;)Z% } &X>˄>*>c Ĩ>5 | ˙BGCz) h5g5Լʒ v̙ 3.*ӧ+ gҥ$⌌B#--Mb9TTдt0‰ phaݴAK CTTlF%LA B#-EtA ɶD9Ri145;A ]a;9$t%X0xט E7롅±Aİ+P&%,;a_OCM:$O0gl?1UO|ulSDmA DU)O*(Q Z0j9tѥ]'R1,)TМO6MQTT|۠UT !*c*T*j5YN4 VVypkT,'1 "Q3 > pYj%`VN蒡U(J֓jUV 9Zd 8{Em6]Bl#:~-L2ENNW(AiED8 Ň@< kM%kq6 $}TS=c?9KAzluYJW|'O2G;)i!Đ?%eT_cBƜQqxLESg!8bՀnZW X8ۧB)*Nޫ h1f„ gzOUCW A g _֛ѣG+J*i*u*XZ(H(\ ^X6?fPhA"% A Ac]x/@ VXA>,lB}w m!bbU-X@|;1o<@M_}b1UM4QcO@ N FPBVA `Yjt}i6ȳ*UwuƎc?> Dhj]U@Q[KLM-@Wm'DK5/eԩS3)5}=4K.5>/uQ(dP+Za| ]S[. . GK@s+0<:-%`hMଌ^zJ2(TҴzXH-EK ]+ ¥5ʖm TȜQmgNU %2 %f 'Ͳ0X6cthi!`yP5񤛆tPjiztR3H49ZhH_7;ξ3ކVҊ6)f`U%|B')t65ғMFGk?'UQ`V1I1m5d:봜+#U\S` d@JiSg73Tմg:8 bh]!СE$T6T쪂l.*Opt}8Тz(tza|@erfEăB/ 1ƨi9QM\Vqt;XIk M0[ʞpp6Hk b  Ʋ)D n"PBVҕZԸ %g[ ~  *ZbXAB9 `5F_ Rd٬tiiF, |dׄչGu͉RMPwRdݺ5K FOg 8i*bN Nx&:*HTt,$ "Z*2Q3ty?$!(T6B.*wlMw]LtY>[,ZYX/˥0wPp$hXzt֡eq6Dj.!6~'\~R!Y#t FIGzқ9m%yey>GFzþx lvh '3>k|cc@ն^IP;TU;L;Q@J Sg eU[} ϪXpk{uˡb"3t3fM ղXou=l>x̰mt iY4ZڎlSl+˭}j?y?,_Np ;GK}1Ձ_u~glsmX| Ĩ>5 P(@b3$bhѠp ]t0kPkF tir&(r=5 >WTJKymj_m$pbI3}bQEQ/L @ P('$hRPXQ C)nVFA{M:C52Ţ|L?{9 ؗ@z4 `@J]SF4  h'  0Tq|+,eHX8d@7:+ȇʯwu"֫ZKZi :*k5 h(Q@L#V܀C}Э6uk C~(Q@F$4S'_(4 h(QC@̇(Q@F4 I h NQ4 h(Q@(7F3 ک@4x@:[I )L2Sh<y najʟINx)xک@4x@8(Lx=JKtw@c2?d叺Am`kb>b D4HKE,Pkk(24~y9ٵPq#=5񱈏?&IRlt#CFz*%J:yߊ HRN4Ǥ?[|\eti$* K@@L"C I {#;3[ݠ֮ ={wM 5=Gօ GxD3<4N_+R)m DE ?7G/!!O*R_UiBNh d4%D O}f2@oA$/7~>x^f$/ku՞2 {(y*|S$y*Y#YQ&O LVF:ƒ :"\_W;'':QRZV]۔',.*Ri?lj;@L @ vM ?{&3@ |uP= d;͏] *x*w*/q'۝-@&D,t躕 T2EV|I}*W_DX0⢣PX1U#: y^G}D'$/E|a &/'Kr{`_J˱M1_КP `.qTrSq ̛5 C C0il|Ei SW zTDدjO%H))ʃƅ2x  `CaUp q*!],Y/\E~AA =Yb\Ҋ :~WKLi  Lu f@$l?/)Gf;iq( pauK;&5;1VJO10BQeH Usйc;h&f=`ҵ34jf fdU*Қ(ܓusGc]I XI9!O&q=.?/$I2ALanf 5I, ];qFܳ/pEY,nAݱr2%&(;Wcĩ:6$%)VbxM +)=a ]j_gmA̋pL5; bK،E>P;?{hX26;"~ey ̪Q Ĉl('ףIgLX B".$`uWj-}鎗(.AdhODIiq0?w='TEVz2|}SL%O#1:"3>_o$efBCIQ>}[Z y ":OeAPp8|o(ɨy?< G^Q3~xv/* =+Jr+tWA-_e0S~~Bpdg돭SA a~.2lMM0VBeZV˧Kn-.’|e +%Z{Q1qOV̴D+煨8+0NS)AƉbm T\uM`Ag]&%):UöR ++w%PzVR_6ͱ'b%ܢDHy zk%=Ðo Nb^\~ IDAT-1%E9pu#ZZnbMCbl0Ukne61sfD$#<& ]̱tA  ͛7v5[&)Et'V/NЪMku/Ŕi @RghҼM]Q S[бcg3},`n -vx< Rf׹ػa.,S_w֭)nl ˼;zvDMPqk:}PZbEcY޾4o -?'l/ExF7HŖEТQ=>M-NFX<ѺiC¨@pYXdC:Kg43hb3x_S0 ƸcX]R^bD;ZŞSG7Nc0qA>nն&]`,nE+s^ )ix&Z5*QѸy*"QXSAذ` bՖ][Wc`3ݒsGvE7_-Ѷm4m@1OuH4_NÈ 0ZG Nnvg↫7 6V: Fu'1 H@ĞbT؞", u6ezd>ET;-."Z jڬ)zW"7?n1v!S@Lz|0VZHc{pqz=| NJQh76 0Q[fB3 kr,??cbj bW 2cc7 v#Di/ l9|Ű-lFa8y3Zs8~_^ۆVMc[HNςEeރGc۞}8 'kwl:8nYL0q:v{6/!_<냱`hbU[wXt6ns!iΟ܀Lt6se#1e {A/Tqoo0o0th KÚ)}`MI~ꈞmW~زG;bn~G=_жyh2n2<`d/_ؾr2zw}NlX=] ao n8=`3~ N] }[a_h~Kb1>C7\CzB vnz"e-0;8b ]}܋s'¬gO,޼Wҽo)cS&@(fh|!VoZdf ":6Mt'f;h6:磛anb'cׁ`;۞أyPXtjz1t"߲]p`B!2|<yq M}S/W1mNs>s]oMΘj#h}c:|@f\ױtH7̞<b"vGK޸mvutv?K,a3$0iFcؾy r#uSGFL߼)נ!|zq@FB}aq\t>6zhe;G7¼KKtnYQڟ:OڀZ*J+\( Noe>X0RDg1DCq-"3C1lrOܼ{g/ؿg3F YA],w1B{C8V1g%X"l~3W;*IA'Io߱Gĺs`KaL"$zS4ļ1ſcG7ۉy}wh%>;ֲQ@+$c,߉4-ZuF9~7c}ົ/r~:썓ǡ]лwoL}6` lFO JŚDwX%17&l_XGf2.Q~n 9z.niM$?NrvS1Õ@VM3 pb[ y@p=0f2?0xRxŋ]-JѠ^#x~vè%$`hޮ+|d}ѦU{,Z /ICPfZyҗ''a73WmGlJ;Q?JpF5F/ہ2ߠ4#{AapL:{|o1=2&Yq~rCL Y5Cx%c|$SfV{ơ9߻kѷ 89]u~Ȭt9yi @IV]\52xW9G&$l͐~>2<\X kLf3k.oaeZJya=6Ž3wEaHkt5!x|k vɓ1Y^8}>FM.װ~(>a ߼(/Ë0*ֈ'&m /P9cL8ʱMֹ}@ ~ m"%2ݏ`2y{Wׯd'68lA[3gT%*oՋL 6U@W?<mmr\TڹpY>]l⪯U9Stb }fR2 [ (;Ld=R B1^_6|ǡ@V|/.Ɲ3o@h|\{$r͖+f+##'IX; q_{Eg##pzlq081[LƠqE*Н/N*}Z$! oALku"a%qtscʝLDIST ]ÕG[!3.ؚ< *ȅwOϮz*rrR|$0v=IYg454wTFiꑌ"AhXF8ÅÆ >в)O.`Ap񹕱+/_ir}_>ҮxE#py$4i оvw8s+dV3e8tJx&%^f }11~UvA))CA.nh6h 6 D;2ٚ+}M>{.#[Nz*SQr`-Ffb5C.ݰbIdU$3Wet;H= o[XKna+ݐ{z0S]˧S7\=t$ǘIpq ä9 O蕻˶ 71AtzEȖ1E9}.`lnSlAeWyi1;eXI1K-zGrO/{3ZcځGȪ?OFoļĴKLѸ0Ӷ ^KQTZX7؏lte` :b̚c8s6޲Z=  .`6z-͏ȿ< Z@8cu~5B0gpthQϗ6 Vx2I]\lPa 9z:<kh96O u3ۡzJ`aDg")&7.֍0o,L_CAzv.J|z%Fۏ(S^';X("w!{0˵'V,ʂvN7;Zi!I*z׷>#6LZ7sp& qמӟ=-.ŪjA$z8Y[v"D+Wn;qA8rA2.z,r/^99Xtnzi̟8K"/4| V[ ߿#7S+g yۻę OĴkg}'K_e>gX8s ɩ{oZU׉Q,11- fݕB#M>ODÂI1=.׏_oKnt+6ncsѾA+?ck;n#[*ocSWIgڝ=+;y@`b. e'J,ę`7m=l$moCmѲ80q ¹-3`Ke';wQ#!KfQ9A: KѩXע\֔/;N]á0jZ\x3|2^\S)qٸޘ~"s1&1aaDBbl^TfwwC47FķI@ >6\r/]… q_5󧍁YsƚM;p>t5j( LăC$F,Juvƕ"b,f3.lDdob6Lw[KJmAsmb#o9gγ?+s._C=ߺqL@%bb]æ{[ \ % # $12/4li kc6k .HWd"zaMݐTE t'-8TI~p}tI[1}\Rt1 ˦Xv= ?tQ}ͿD_.;|@Pl9x"R_A22 v85dXq<P,~vw}Ձ[WW&F@.قA&`;.abJ\Q/<ӫvlx<˭ 0aepaQ p0].`$K7H-Yv?xa@? i[oi,1 |!,,GH /l?2ؼlK?wnǀ氛֝ >AC|o˱hա+yA-$HwՎ#x"ial/cJv\moJ D4 ǜ!{f'B($ka[oh(YLq'ҝӏ=17 r<[I ;c_b@:Aڀ%&F7g3yar.XHi8v*K; \u,XuA1yEHMx-kfR%fKƢ[~pqWn#aKy8 h"Q(`Y"xD`EIV%8XsQS7$Oɣ>;}OYX5 mL,q,7 Kx{'N[m[a쥲T|%^e",`~GG롂 7L2#XMQt1 gsV➬U IDATgSc#v*&aS{bV]yU)M-I2J̋{dԙCXq$;MLƣf@pL2H}]0kd߷*n 0m& NoIzs(!FZKc2͸dNڳ ̐\E.y Z;~x"ha+ųlm"^֭_1۴IKc3hִ1M7=Шi+XXZg7tlcWdYW,GV%dX8 p$l_YWTٻh٦$]56vG5޼%d^^AF1N@7n ?EczG1Jv p~rM YiF%K0@ K4i &KH\s%ؽ),JegUL;P,'M 3lG#Y[fCINBUL$}0jx0bh &8v>2a?ZsR*'yr+L%M# Ng8]KUdPI, 11 )s DOsst43h!%7TE~v\X}34Sd)zCY-'ЊH@`KbiYZ>Z$؏X3*JyǕ#d(rGօ{ ['):wuǑ Ht!1ѱ˰t2ls'@?%'GzXe-'<t6mw@$? .ž'Q(0:+L>sAAy奅p\HJ-zZvD7 "W/Q(>NPK,.I9.&F"gX^Ȓl}1%&6tjg֮Y#=7={_I=z_ 7o:(8odwضim֬ߊW_yIa;_+W[)*UF򫊧v=nJn"LU%nY/cg+Ędga~DEˢLq2 :.hۛ%񁗟P "k?<¢ѽѢ1nEɎВbC]I><)ʻ[6ܵ"KC%s`v,_Wcg4vpRSxVZOo7okqĖ=C^꽺Yb~|{%sX3R$;℀;>Kq =H6M$ (9.eo\+r .<Ɖǰ/$%ܼke<ް]IUHSx/XR.(cbpቕ 8ovP+=;D-Wxt';*r\tܲe`U2 y8֭['֚gܽlBDd:e7d2)w,pGY9RdK Q ;#I1ŲPAn.#u/ٰ/V%XDDVr r2dy{سX.zyE, Yۋ[J摀)Y xm7J˰Jt JCBs *ɢqYFR,9\\4e~ R{@/BWX(;kw Dʙ͋/}$L/=5msq JQ>Xh<[|}oe2􁘟ތ!bQ$~7AtsÇ~.#kHtD3|ٺ{u KTCKLo'3ɐ>@)3 YYS%8VV>+rHݖ+rJe,DwКPyJYZ-,n Ƴ|*ܣ=W-WP= ;- \&iFUKNӵO-^Єļ{}àaÎf]1ŲӇ0g Yq-6:]Ed | j OdfZSSA cb,1YUI\$..&R&y_l~X\yuC_>y +0~X9a`)xJk J e2k0f&Θ\T$DY1?L8Gk)̌A 6d0fHf>rOZ]G1ΓZ <j b6 \2K<~RDENbVO|}t1ê΂ qSķ.#0017ƪ?;]w 5)O?4O6ADpkǟGbו-kJJMܣ?kOZq$Ti_WWZr,|=~gzu$)q13_gOkjjYbblU/XӞk Fwp}5T+@mA .9ٙ#u:9!يK8rd5(ZSҕeu-1y j, EKKi Jۃd"u]kOA#QJ@njm*xSe2OI w <ƱUMl#iwT bEF>r{҇ҿҿ?ok?Ph]mJҵ2]k  3SZc7κG(y/\1KW?)D1G\;N(S%LǍR1gOfz}Z-ԓ[VrO6rTOB7K\=4`[vf"%,z}U>!ƃtYj@@.F.h<%<TfѮiJ<@ O*{Tg]7AnԶmPtw>UF~Wb44x@jx} TR=^mZԶ q?ڽT4x@?1ɸt?JٯGXkdoC'"$*N"pt연A){0l߽(=Je 8t (SNKP9| B*[ lؼS> 7 !$9w۟?~hhM$D`0K4]u{z`ZU=s1\}DLѺm;R60#PMR)-O^l-˿dž`lgh\qӷ}).H9h#;0Aq KȾQ Dq?FJY7^T@ &5:F81<=v 6-&qb-LN1T9r#aR/X+~*O/oden˲U:|kORc,o q3 %b۶m |ũ1+뇢)&jiu|IXk6 x@:Ղ@ C-kVFl+x`ͬ!︡Lv|)Ζ\[egu])S~9M_\*Ho#t5~TΝr^`bw } Ux;xFZˮT@֡Fɳ]yFv Y'n@U:*tV\)4.e]uYU:ic=4x?1: CJ/*CEN_֭`ǩ(X̔HZ?m[^PA#،b1Rjܨ!v}W.Ytay cD4m&[aexg3SR37S;ԯW6v[b]ؾr$(>ׯnd,5FD/Y9e aޥ-zDZ@*I01jC{H\& $aIogKn>$w LE73ޑ1ҟR^3 }-,NB4دlSQJ_[vƼ՛/$Gסe?_9CXFFBߦ 0f[>Ɩb=%`hӲ!4nS!0&Ypܴ&]`ħj14*kx@|4K|WOEͱhe$`h׾=l$dŘ2n( }KG` m߸}l␋ Ξ 0~5Z3†=GGף]0K`qܮ9:[oT"$c 4vV^Eƴ^)!Y0l ݿtÿwH|._lxQ,4۴DOXt)fMa9x .߻G%="nظd L-,q ;VN8OK1oB)rCp@t7chؤ9&L a77uœu;C{VmgSv3'Zw0¨3~5ƿ+X%%Gv-E61z8:#i7 !- N8bIsY2'$'p/a^ŇSn O\Y?@g.s/-/ Nj!Hf^ ׅbp+WogM=Doc1Tk*@ 1u0?DUݛrawDjV:^X̤쓗m:]~1aR?oD%֮] q61[̌256i3/iFUQ&Z ɣ? b֬^kwP.a,1zgI9fV0\5f051’sl@p2W\yGi}'PlpC G+9 }u7܈C& Hʗ] !O Frcqi΅>9rtOb$A!t4W/уر]| E]+}bg7VX`uϯ? be>WV?6 $*{tPRӈ֖f6#+1QB_bvlq@/BvFDnEݿ&KhSNXLDVk)蛈i̇QHH$a{):@}m<b9ʚ) $b-hjEdߺ" 5쓗IU!@a25j8C11 ᎇC\jzʐq@Fi%ncYK,B_x0 W#,c@qTK. dEOD݈S#ff!#;T4%‚ERTO矼cwx+<1.())FaA>&"En 2jyqA-),.B>YTd] M$K5dDV}EFFNDƝdy;knҢ8,m{pn PH9^(!"S2P_ 5K){(\ns^)}!qHVB4Օe@{,ZΗژcX'R/;1l!G!&LC [7m Η|X@MQhnkFz V.ZU#\~s]sQB}!;K8p=%+;ajݐ3UCk}x@a׼w=Vqoi؆u\8eR<#3UX|6+#<)L}Ȍ ~-(^'bN @/YZul|V,϶nA؟FU}1)U >^g'@z{נ+&6nd>y@u F*?ގ[)Z6gi)ߤ݇&*md +Fu;zȀVq*!) lR%xc̍䅱~ݺ&ܿ} GƟ/f.H+$puMpa3Wsʧp= y̢|18*GAE<ɝx~/nEy9H@RAOM{D̃ɤt S9Z)ob{UM'y7[({h\`N9Uh!٭`hj+:jȂROvQauVX[A̟q6p,yx|*&џdLJVX`u௩,F?+(ME$CNQY2 IDATw-5vqcuՁ?BX;lM~Y'UM-,dGLb5u1FO|܏@tVLzd'_sbƎ:a Q0be:u^Օ(! na@&4GG"?'}2`uVX`uՁO'IxW}>2< կ@Lmu%@?be:]z{QQV$d+;)b#_&-1 I|GF#`%J+V! s,*ȣL/_{nn_LM|dw1ccHCT]!f SC(vao/'J(/aW|vx:_{;:1@r{Dyoc%J+~ ddvmo\@ll,lKøZ0CV;o!p e}y:Kaz ‚& bQ?hgY[m1t(bb{_({{޸K2`Ave(テ*FU{;’Qp8sYEU?q}VX JM[8KkXЋy cC<% %BB\o xYChc| d CDOR;Da!xB{1cȠٽV^4хU)&, ߺqkyvƽ< X `%JSo7`c0bx"~y>Ѓ$ܾya7oƭp>JBuc GPRagb%Ech,FD \􁝣+B"54ar7TwEFN]ܺH}R^ʽR۸u:n޺T6}%. }.j$?!V6ǧwۍxS5kX>G%HL\ivnBXT`0XV=HRes}"ձ[XQKIMEcvC9k,IHywo ǽGn >CyAS()w".):{K'£ =}$Qt4 2ʒ>R5+nQb* .rgoJ+Vx=$xy\ALuq&9stB,Z k7  qšeO[bܹtD`X V,1k*ѿglewsq{. g&l۸k66&2a}bْŜg/X ږhXkda I3<٩_ k.˱`2@xb菡 7 Od򍶳VFؽK9 g4!%" yxChʄA\AJؽs8ŕ? -}F>m(oB^LFSǕ KUOB!ݔ~ J{^4t6U₣9$wIBHR>E*yXO 8<2!/+2u<{Ep>[0s H(.b{`%J+q by=TyO Oa˚X/"F.(zqR*_-<\qAl^ŏc)X}IYtǜ/>(:e\})E-Q6F[l rVU`2أZ"z}릅s%\Јya\<,10z@jqj;34'ڌ?SVhh@h;nb+YY_ 'Y# '"#f(lȀ)"x]ۃۡbrC FN /6QQl|أሌf eEBhW>9앑 A?(ī qh SQ VƙSU<ϻhNP_ U8&[?< 0[D71ֱ1oA9Sٍ+qY%D~55X `%J. b46vqaެ1|g_SjB wFKgLW"[  :&aaQ1~=? 1а񁋺(YLT탓tBh(²y0s4Lv*>Ej ADA~Y>_O%\ 5׍Bdf>E-) R,1#sÕǜgU$@MVLQv&hn`*n1UU6پ1D!RPZیصc'mۃsA~ MJ|;#8I}3!5Kʮ/PG6@MM]1vUǜdo`+=0gz?xuc7VX `%+yYV|բ'0w=p'%@ 5' r@+Cضc8h7iP>1sڊ!} fزh ]ڤ HO'@L[,ragpϬ02bx1m (JC&W¿L;Łr `,5E\NXڛjf=긔ZFDcFߎܳ4!TB<ٵ*bS2\+ye{> 0P8L0#Ƃ¹FZGmbށA<lg= `@3y>)x3ཧ68a: X;;i1IʪJeH]DH=sXh!̈SEQT|˽ڦmiu9TlA쓧hnm%qJKKL瀘P<퇜^&A)K@o*r'$K(:Cb9A\D^M% ~DT>@JESO5:C_?>:c3w+Bâlx#**7|Dfhbzt>Sz02DLV^LD4eZj' kmCqٛB_[:=Lp>:_EeyA]M ""M~7p07N꜂bp #}s0iS08яZq~J$ )QI-hԇ=Rr@xՔ;~7G.fܾz:8o 307Ԅz -<݃_ݭxq‘Yل/]UVQ~j򄍑t a 4y´/AK] 'v:(0s1Iٝ4l/ƒrXMރ+V%AC{S)2==ȮL7}+VX K1>J` QJ3&d?J+ e$~`%J+ YO+s3Lyi@d7]VX `%_#4"B"v?|K;ВMGp)1HOFCGHi$}MUHO@?K~3×P}hVUa5YG>G[] 2SPUֱa"r(nd x daj91ٚ;;Emc/@/UW/+1.Il(cN^P8putׯ"8f̚1.w&~.;wK/4I~8u0{wul<ұ9>}鎏[_&(Y#} 1kڷ&s;i3ȱtń0rnu 2c裵>9.ޗ>ƩIk#;f/pe[<&g\QFeD'#ӎFVQF@dҞ栝\!m4_l&RG{7Yz9Ό &:81aoY&ui\SY^}F̼d.f^< ]dȬ3GߔKĚͼ[.湽=$fj35ru:F4Vbb2RQO> ||N#od_ޛGs~fu3f̩o'/f 0{ͬ뽃ΖZ\em]Xڻ .9mtT!l<}ax8m"z9ambCݓ9e[HHL+%k {S.Qҹnt4VEOhB "d`?q&غdT-r*8{hzF帉S#0vΩhG tgQXU0؝:՘?`<$NYSm&TdAS$0E~S]>&S'n\-X8{Ԕ##kWfӷZЦ\`(['Oli,GyE-Y!yp^ZpƞSu'<1n>BE<˟"7͌ajGOh"oŹ)8-|LNaٔ猕`mSu=Aqs9l:)Y~,L-wO'N\<񈢠he$.裒=py0'K`N}N֣7A@=mCdyUjjVf6$h\fY@ /Pok AC+Sj|Q. Η lQ$87TY;Z` 333sOyͼ7Ch5qw\d 1wx#LL6:xy Tv:dXSxI w/ӛ֍.xDzy*l`ea K;WAÈ+Xd&HgP:Pؽ|P<%  b2s>yo[XӺt5nԻ>!)z!u_c 4dNę#Cv.<`mMwrCp=ބty!<;TeٔNvdwtE~YC "!<m`gSs+ʑuխoƻ9d»|&'-hL!-sy>Љl+γh[j=xy6AHL"c% 'U$bؼT==" )c7`fAp/ *0EdbS2'}2L5?"N J;kB%vxa?\Pބw!m=,Y7c͊%X|6Рϛ;˩-|XɵwR{Y=P*_RkL bA x}mđVT/꠫)L[6l!lv}T ضn f-[^~>^ڰn!d\7$0/R mR _2ۡO -\ CTq@[8pB,&0 *sqzwa+vx\C5O9^Z`g~m8+S𭝋:6Bdy?p ~5D9VDJCXUUqdr mi ò5kp\@vo-JnlX{z͍Uغz>Izp Ҧ-FsȔMPCs})ʹCH)6 ۏh8Co56Sɇ\ .:,ľi<A$&X󔽚{ᔾDx_"~"b !-&R 8z8:kZ$ky .^0i!X~b S-ƝixNVt عyp8%O`qT y!(:=/ Qb"r8vB *S:gxy, zn8^XL__ƒq;ZBwH5 &7@eC*K2`rB"۶Q2ʓ8|h?vH"q0b $פDu1b)g0<bwX's g=q"he֊9@x~h1\0V'!*ȋ*<I P7C{s´@KK JRIF_D֥G Gmêг>F쇼'% fF8|P|8sd5IC쁠4cO27>"O"Y"nc/`INػC x(Iicu<9rQ:M.=3[:6VCm9tcT<G'k.H(!{s$b,1oms0{>CT9LO0P:4ƍ{jу@oᢽU t/#N@v:x/QV5S𬚏UpE1MqpDfq)|+o!p$ !)}t"o>k5q+OZBdtJ%IaчQKN7p?ƣ J%DOጋ=N(ۏ?~}dS `ThcwπIc<),Ƿ-Ɔ=V(0ӯ;bǦMtIPZ,`s .C66 3L Eu&?)ӆ0p͝% KWiBEPY[Z=Kd"1AnMf+O3,1+QD 7zT {U(i֓R4es`v:YPaDK/JʯByRȜyqo1c/P4$E _,Wʋ iF XjMlj]ؾ(rɞ]"  ˹w"6o pJ7 ]TX3g~`1 \_9BdeSB*1 ̟jQE.Ը;1/adC.Vi}E!?ΛA O0 TfaYXqHUJ IkC /;)K#p/9!&x,ǁ:Tv⍁zx&"[Sԑ$GBk9T4O#`w\嵜 6-]Q G$f3%%%h#7 c Hq\"=f[/=EpJ7 %5@Uu/Bq T5OqSᆱ86DF[ZKC[Rڸ"gwq@LC¬\^ݹO|.?EGrU5={ >Gt|mz:,§ydc@LdX0tw6"A|w|(h-Ȧy/2^na(!ͳR(@RRrCV_{5ՕCM8{.pVATO{s Bh9\m@EU?*>;Ynhom~\MFU}=4.hcR3mqB~7ΆE_Ƽg3G* I&Mc1HoJLcE\x(`ҕP2Z\^p|>С6hbG!mvT:f~F F$²9 FtLI*s]L! qGd ĿCmXQ4jpZur=%&y]8>h }t8 h+R }B@u*2 OW hFB ?J |gyR )Kj|ع㭅 hc1å˗q>zq>_gC| HTFy3/v{ۥI%h 1iC-/N_~YAp[@LΦĸhI5F3)Jz}bgB~ҙ%!0w'܋g]ARU>eػzh8[WS8lڗmD :8X˲aHQ#&_TYkP 0QXEGhmOj:8ْfb@aHU $tTN֛ LsMK˗FH~z㢻ܛq'&4O^Aj t *(" =s{^ EbzzEv,%)ZhL (NAJ!$Ty&O$3dY9d"Z3NTe1dyx,AdA8{ʭӚb)!'Mr D`@]{p.M(w_cmlFdJ: cAt l7~$'h^ZC/Ano1(+c=;pFP;K΂HZ`u@P26_˶H" 8!Ap1Հ]wwS0fغr)VqBKkp@hZ5Jbsp;}|tɕѿ4InU^p+dg, p ŔZ[$w܇;$cEz-0$'&BEm/E"3+F $ +zwh7"챃W)\ a1NJXu +8~5.bjp@*>ifD0E @hC_z &n)hAd0d'fEY^+(yŨ!5bLAYBJ+!ς㵰xXAʱatեNk'֗ȭBzr?w'쏐 .vqaH'NtB+X ^B$Bp̝ CH| Rt![L*Ȟ;DGS]e(uZjbWp%> &&@c]G"%SB?q6*N={"ލ}1kth<>neay| $D'z}fK@Qf!TކfZS. ڬGjWLEda9u @U}D$ĐU)֯kd2m!&Dރ7'eNF޼C[QxFFAJ|B#gX[e ;+"BdJfqb_K &ĶCMU T s 3J F,1G]P4nk|05b8 F O`FUv\6ܹs`iM9nbWQJ8m27Cn DC0z jؼm*Ƚ܇X2i-K X=b' ?1uE8)/NHbf e~ !yipBӉW[ /ciGؼl1BbWʚH(l4OZ`jEё͋@Ls:q d{e5AW[F{'qAܙyyRZZztM`8=40M.w l\҄T%N΅Q}䎿ͱdR1ߡw$ƾbB"JRgKV"4Q[t؀#&Ψ$˛I_GFQ~;n1^`jnEv]r w| F<&HK ˫** A]u8M(~!Ƨt0>;HR«ERqe,7 h %i}Kt(y\;+paZQxG<ƓxX㸼0|>%."> O"<2\T9l ,_R@w̟AثC ), UcoRzd%r<EEYlٴaLzltC˃]rɌ,(&?a*LЦ̀Y@Aݫg0W߃o? 6XCd%[EOp̟ aet)z|1D;Yĵy2|F 1p8[BAkqDv'$N| @9#)XGBWt۸DcbLT5H m$±"0`s#^qks E?5+WCҕWf1N!yWb0pp`%cw06$|ol6, NqK bRPlcܱq X/m8Ki.ŠyyM5p,X1.wB[eSSNcwb҈H(" bJ"*"%%HI[3>Ts/ #f@yb܈bH ͦ]~/;17 R(49+:h7lat=4щwXZ F|u 6A0:Ǎ Rr|r'An|C~dvxF'Ww=/^a(, =1ۼO!!! +XX%{P< cTux=+]|.KNGLa_@n$WCˎ 3-L> W^/?)ʣ0Y(OA,yQK@VǮE: WQsjכ` Twao~VJYO$<6N\aG%8WDy ]÷Lpѳz--Wp1`OA>;0n@fCu'Ȼ+bЁӻ7 ͘ l؋JVlq=Y+=XL{! C_>X ʹ㐛8RF1I3CzL2M/X*ⳋUA DYk0^OJ q`̀4=nC ƄRPbԁP K0axCCJ:bpw'4䦈i$>Ъs[T"?9SBJRe Rl 3?$B{__H AKuT/V>=C}cnY"- a-M H # })CQ~2i^<:Z&\dc?i2Ym|{# tD(2l{ϤiS,ӄ, 49|Jk7 $B ..(!JnC5fс<2w9HCuYlԆϘY8v=i~fz.JK - YiQ]cc8{A+de$ЃٓIǫH<I`k0d&ғuĤ?F[G,^BȰuScVldD}4MEr9`ށa>aj(JtRz$Z<. lB% @Ie[6ݯt/ &3 gY0հj' ӥ"?U00_k9 2fw7gc}w:a.]V\!>%Ylo#U&i@NJg(Bb؅cpnr$wJ4~ 3%Lgb Rkg`5'BIIӔmW!)-d qHNIArB"Rrx2HyZB ]{t4&rjRbi@ 4dgwg@^C$2Vj'GxXd0{rR<hRsɖUHJCLL b .zAফ;<3-<';%-(Bf 6H:%5 IECTMw/۝6ddfrB8Q#%vI%)犟!-1%Eezxfq(`y?7/;59) 9n }.\]^6碴ZpӋbN̏m.T0C$X5J~8q1,lHxRdO%L3XK^sa,4=^kLdEHK>b. MSΥ,~7cO1MDF.fOh'$uBإ'ebIc$p>e`G.1>V])l|@[B(ߘnC9Mg'b@v)G95%6V/KX[W„ԟTѲn2HXòX{AoKnf*-|MY6CM[xƲ&8> )(&|ITӆ>MpN ELqn i`gCf`#kw<m\j ω%kh8_DߊH!炰.[]r2_ۅ&T!gs6 }RK,MY u=6!y_$d?VC|ű2+cnKri -^DX&sAX(%ߓ$aI~B߅KeEž1-zgJ8يɒPJyŏn wΆ.- l6a!9grԨ޳`rp1C+CՌDVW`:ڶa٨TyKa(ɾ5&fpmoǟـ/PGofi䖼 3wCSVL<ָ͏Rz!};eBey e5e\Vzo}+Fp=D^F/ 5et-;{Ì}0f C(tQO;(f.nd:Vc#s8E4KzO*ֶ{-,ag"xueȋӒQ{٫lnqG=Uɠ ;{i/u:_XYԣF#6BYmMI $͝_BukKUk?NwZ@:--1/+p㫜W!N:WXݳJ=e,u/'FB测?sy{)'#K̓Im?KP5vpn%&?'}}(jt@:-W4ץg $zS{uԿ1+WJ8 cnjY SɜFT3OH-o)TTSWӠcS]WGFA2*JI&' o+}k>(rOY^2ԧy%U,{3QW@k,,u?L)aP>:b =[l'iBCI SǍr8xٸ| ;͡~yUOi2M"c5ҽSkdc3TڥP<ݿ${W/K!&@S8= a #GmH^H!g8ו 5vFDQ%=NK6WF j$!Ij"%"f Ki14ԍvnOvZYfZD\4Dރ1CC3%ѿ{WLmkn z~z[)G^Ǭ1@FFE!Gʘg8v)e Ḧ́L 9 sHR/3Oo 4kl {WvSw? bt" o&>HW _(ih![ 8N.t:Au܏}]2S) rG1[m:Q8ksn^Aw{(HIc'7kz9.t#\z'|O"=8p&cxe <֑'| WO7j >/w[Ȍ''X3 p~ဇ KʼnPa#%'N-U!~Z s #hv':;H_g5$m J4FDd䡜Z$IK#I5E=>{1} K"(~8wXk^p_!éЉq8Im///=Jh)-3܎ND^R0t&Ag"Z'r`er; ÿe( B^v"41]IB8kVZBę؅_~kr]hOL'$Tգq:lH;$j(X%yגr:ny"])>IٺzKNKܫHC5Y[SbՀs.RM $dLm67WĂ,d~f'TgjbT=눦/ۦN tZG |ZSK[{i -=# (YMl AIE8Ξ>g`XH@BF.$e FBFI1x4=pz+!SI(IW]X}L`P~Ā ɑ Ple<:-l^\Lj߰j(Ip>t@%AAGZ_;YKnJ@y0a\=Fж\mְh1ݸ;XW)|hch\"} /3 j3EH FbjoQ]YmCb̉Zct0q,_;vcJX́D?u0ke;r_3aRA7\C~Qtml 1M\zbd}åC9i<H41'%ƐVA؎ Gޓui 蚘ޑ:XpMGh~sbCAkSń搔+;pz;0W#PKV~04Xڞ[SѢj ](ڞx$.f*x3bglؿ^H.ըvڶwiN tZbO brpqz|T̰~gMea&6Yjw!0r0e@_(YJȾrMGUR?>|n!  >ߪ3(I W=i1w5b(z:IH ?غ%˷oڮ(+?zrrr2r $*0AHXkaž¨$$(ek0!yj0jb8N4In>r%q2a粢mJ@A?1A ;LT]Ym GIH b^21y{g;%px\>~kqA߿"Z$ Јy4M#?<[wT}~(F6'34 Fo6+_JY"e"vuE 2g#$Sw4![13GAd &56q'FEMcvwxHJړpVو0^Ҋ6ԀsX:kYco '6a@P F'(cю`ZYU17Z 0w67 N(EvvhWSCw451T-`ذ=C \Aek^ڧq YZ M~:-iN a,IAL3CiwXO?艾G`񬢙 6iz'Bݣ \\b u8wW=X}3ZS`dEX?H0SguR~Qp=j30U,nzY}֯79CF\kDp̔˜@]a.X y- go_PpboyIdRA_jYbDЭ{IL$X ce4\fH A'd:[h턽v3/d:}!Do7]ȡx}=.NRl䂩#{a+IsBBn6GĿ/$ܻe4 kXqS={66=Jw7&qO] ,iAjhp#3w>4TM`n&A̸>abH f.Ir3f IUY7k0IJmqvoa;BTdՌ;P9 \bNq}(c ہ0V辖^Y _߄Xh<l6lVb7f*JsrXdnef2!Asg@$Ņ@NkC㫡}ܡ4a0ui^ IDATp'>BU^b4=rNQ zΟ:-iN ,IA`qm`\%K,ai;X[958}5,L`vaqڪb> MMxB,Yfլjr T ݳc3̗93syq9 zzLEw+d&F`X LIǶ.\b -7,/\(!.0ƶ{Hn֒TE®V Ww8. KV-Xn;B!Eؼa;TCYa* GGvs 8v$*[?ǏN tZg |r#tp}}QK Bp.m l޼^dܨrt |o/=/x7Ab=bD=Jo[ vA #>jy &ޟ}cGh7oD@4O C{!_xmi[焟I ֆW$ ki6] kd[ukY^ӫj#@ |}Wu=f;_o }_xl{m`BO.\izھ@(0g\[O1'׿8x~wK[Z){bV[ːRaζ'!AmbyE9nmN=ʹ aN 3".ܿ^$3l9S ɋ$hz B[220e3&䍪[N tZ [@v6E.#<$ w!^_V-?g*1+Ե-˳~5a4;i:A_v;;gQi? 8!==k[tkYƻ@:-i? y}P("*լ~\$LR}$0GI|E|J\x";(iep1$D!HLH"ۉMLV.ƒP\K.!=;yMzUtQ AP@϶Wϑ@0P<~jzՈG|#C>-ɾFUMNE[(} eĻx!P(K;P!E |{V *|efWkʋX$Τ7bJBk&L_h~d̛p_ۏ|Y2潻<0Ww6OH)@}oq_7gK$:D޿.r6t+|tF󱀌N~>d8[z:1cv1F{K> fb>nߏhgo_,% YzoK.d4ǵӤIqRyq-nƭ}~rMLUЙU5 j-hzQ0_qֿ^]NwϟGZ*50 ߐ;y]!@PL\5^44%JTtӌ <,CccASw Mt{NL58wIӰtG ^Td!`%tyED!WG=qё״]s?L n0iw|L2 lfzC_,%E[p"ssQ0HϺ|NL~庄Rm}ͨsn(P}d|7nbo fk صu-Emx &͝ uH%K{bO b^!5!V8c˭u܍N@=ˉ&,'2X,ǶGAxeECjb+-8y3V8s>bṖ5+W!,!_"n0Vp'zFY-5pz$G߁/*mD~U~izIv֛稶LrX;zOoζJu Vo9D%og}>đLΩ)cxVƘp)<S(ˊ᭻br&ps3ac\FYS=;%޷z~?ZD (:{\'29R;#x&΍Rz4|׵' dm!{ɲ򤇷~3cimL\@& !9wV-2ؒ05uM+ݎ#"^<ǭ+سڊLILW%.B_RqY 6Nk`m|Đϓdxyn*YYun5W#[ ~aޙL~HEa^ |oVoB}(LB")+Hp&z^UVfEb6nۃMhۺ EӲZg6`k5k7"1[)X#ɷ֟ rdٻ \\"y[۞?+UpmQ܏KH$ՀL`n)m-#_;EX٭ĆQ]y$hݶWvDwHu_u9v =h\=sZڻl䗴U$mw(69k0ѐĨAߨ8MH`x@vSBOE"9X8~% *q{ {/0 m@rT}oqS+7= jAuLv -+Džs#m\--ߊ*2Fc^2Q.\HlId7/qci-e9Y\k9dq]–<3d0bϝBP8OUWCb^v4i,wH7,b5TnM qvoDn,ys3f|L|R&`bsj,`"ALme $9b(ft.ip޸5(ϋ'E`0OsLB#./%d1Jb 5&$K.\%B]$,^ƍk6!qX!`^B QkC:P oԍz($0C[sHJe4q "rsptf|#M f\|NF 'aRgBEy74;hf%ҩa(E$ .g#HJ=PQCp/8IԾq| w/\E((̈́-6k\J022Ä@֊LʊT+WBvHâ:6 W7%1"1HLб"n>p3LYXje Y0]"RD۶F> u0y4ե0F`iٹxtZ*`jfݻ~.G~Wm0AcKb6w.F8EFA5Uj>S); zG|PqV yT*8t^{gㄇK@}.LkcdIخu%|R\BZk\W&{||mxJ ~Cq0t8/Pzw Xsy^|Bf(ςO5j#-,*KbX̰li+됍wç1x8|7Rw}1&FLMGN=z"nfH|-V! y9Ho?GaICr i =tT %l Dѣp9Tęc177gqQ 㢐d3.j37ڙ %RQ~I U5v^3RҐpODBfACL5 "^G!P RryZ!Y\}cŌ6pKM*'&}uGNGp6|<.Gyq>bQ2v4 'B]pz}ɊS5-GT"--$2nBQn*f,C.hTNLz@gr.zПBdDN_.A.|11P=ijCcpe=Fµ0UU{EBa" KPRRQ } <; cdv?&M6"DUqv攊,a*.FB|,RSS)qfj2jbf {bWĀA ʃH \T\_^s ća^.i`(D_(n-ziD7$C{Z( yh8 ƌM{ڽP^ջȳfPZܩ}ЗGTG9L/ "#wĜ%ٿ'hZhˊ477fBk @:Nf*Xg`j{ѫa 9_%$[]B22PSQнW?ґE0K QQZr ASBm(ª^T!1{iȋMms_{Hs9*) UeH 8r^D~>C8U1w>.ֵvy, dwjzo1C'_T&` w"F*qIrO\Cvſ<ba(Y%m8z%Gyxn;4j<*b^1lm泠,,./ VMr8ׯE<W7@!AXn g$an/"c1?dq,!_ГX2ZU^\zg4.iL4e!=$ vyY['VAe4ぎ@AMY,&zUdyR:$|?@̽}K>?2ڼqUS-20 K}c0|4A̵8s(n"v ݻtv%at%5/;6T_5P'ؤX|u R/See@8} +5(!~諍OuК VW 5v"wZBMG%aG ~aX51Υcۡ&/Y99̐BCIS=M7YM[ɛbVKMqº{ԗs9ʏ&|~O|rCA]1B g;p~fA1P{5M!#/鉃߿V/6)'i 7abBn5D-F}Y#vo VVV yf FO+*PS@?ߑ yPr!79Nƪط1| I F4IO|5hPH1 - f|M8d^HnӤ30aȏۏyq2ۖa<[qbiFɳT'91M_xp#˪\\GDPTJGin@v{TEe%ȺI_~dEQI--MgbΟtRW3X@* Ug` ALf<:bxگǃ\:{ S]<Hh{63>{p|E3%C¼ann*x #L@ЕAc(L Y-v5m=Ah/w'sBHͧGbZ4.|RxuU!`h@Ls;]0a Q (;9acqSxA&]ŭ f%y N'S)uUҳñ:#CAߎvj4Ot A.y񘣧sye_Vax0 k0ܶYnAv M b"1E3gaEcsp {ALxQ+): uzbz^/v3%OC IDATc  l@}9)~h ݍ@{/RʪA2 ;w/x x=Ddm>uwI1D[y FcGtPߨ{40|@b,Q9SDOl7Qc16j1ҋ6"U(*LʒM<\;9MUY zݢMA8#.c`vρ\YC/ڕxLM9Çg-'%N[T_=U/.T~xS CG~~s/CMKB< 8RX0HSy|'A6²JQTT1>1rcTN=d vz{')yy8 }g1MuHJy9O%r;uލ &8~` }ۅRQk^>oIX%5jPy^y+*/{._C&ˆů_<|8aFE]$I17b9ecDzMϙt#Rc aۃ \X 37Qy]>| 1Bb"P/ޅ 0w/g!/D6ܼ]1SGz H bplGܵ=8 ˓af!<,$ݛ0Vb|O^^ഛ1KD4 ح\MSs 襀10G bBQa-nB=݈]B2i-8י3^ko$ YIv*3^v͸v{|L6olLM\<9b48e9Jz0[{g>2 yy\Kj9LPZۑ'<cޞBN`jt83OboD0d1BNk._tO}` tV!4T!KۑuXGEm"Fzz4㛮}0}V[^Gzu|nFC5p+o ps zH(b nZˊsiYrP҄S? xC~Bta힘`hA Img5x[xzEtX jޔ%z Oчwt"vYCEgB0HfI̽ aXyq ÇHJe+| E¹t-<~N^77=1yG{d}k &y+Q]ב&e>Fd bʤAϻ91Q-; *{>n݄8vz)?3 ~G) =LVV_=,š-֘:NCojp ޅfM; +%Z 8u] '/,*E;O)u#0}8͸W&fz|tJUԡ!O'A_o:CȝpYAHdey1m^Id8mPGyAuG\EDܻ51z".ޤeTGo6Ke$v}7i򟄩X|={#!;X`( ڶwBbi1 =[CXqs0iu܏OFr O wzw8wV|ɼL&v_Fjzc\"} z1qܾGp9O&3 ."P_̙=+鵓p=2}@ȌMck񰑐ê:$=8}z>PeA I`!zb] w\@L^z"8bD޴FOenpR v{­hV(iuY+PN=ߧo~Z#T']cuR:e&/0jch&YOnCWq#>倐l1Qy}1 _|% ]gE{ 17&>a#FعԽ1d0 37<eӱ}ϻ+si,ŃH1 XhGjA̳lpZ#ÈYjگ菻Ib0\J(R`:o6t#>=!ϊ93 1FYZfp?r 3*,ƻ{;Օ9aF %H`$Q(`B Hss7!Zjw.>綠묽œA ȯ!&=p G1 hf) KY4r`,YU%o0nH=.T`|(3E[`Z$1#AIif2'{=s ^v°6WZ^2A0~|`X!ٳM鉡3̘ȊјP&G.6RSn_ % 6 &4o&/2ˆaø In#,'n^ pX glBXpi: S1{BXaCaOül1I=Cb{P҈ .2N:PY 5`\}&]Y%JcXRM 4 Xd=,/_0Èa#1MN g]0iƏ|bV~"##q+>U fd=>^BW&v$Kx|aˆs9;ϣ7/,P^LOaHY9xH6 1v"p+w{xJiN#ָ Wmepyz=\Ic#JrMΓ~}܏ $0?'s.S4E%KZj"u$"r䒑գ#vx_ݬF̿n&@(6ƘDMv5=5e q)WxQ[_|'c ޼ʭ[yЖ/)e|&sܕ^\_~ m8Iw%|W13MyzBy/)|e.:FO左DXZ<{#'yx/x/x/߆#G%qWګ M'gMKS&"vY'_;$)H0>^: n+EnM=E-D0~q4?ӻ@\nmeiq,t@`nlgUޫA'~~F i$; %Rxڎd>ɒߑXr{9Ev?  qAIe r چ|7}P&֖g" .LM/߫>i\Ņgr;o0!Ҥ߫ /#G0}:y)>*Q'LNGϱy"}N|$2nLW\ N5w)/’̶4q"XVlä+2_Swp]ng5^/rlZJSX_ G[L&sֽ/z߿K1RydQ.YD\N=%ٹD,s,!ű٭{,ı캩p$ARb0 6;!*:w ֆJ$%P(LNݴtP~e)YƚEDG\\YUȲ؇*JE%ag[7 㢑#w|BJڅ!J,3S!7q()砀%}[a)gA2D}%_45A$qUuDu}Zݍ ɠ:u)\TQz^ $.d*`Fk'l6~N>RH"9Ednbe B]$+\#_gi ("P@\MD+Jr^Dss44ܝd5M|ZKE-қ4QZZ^)q$i"Jqۣ~r?V"s]=%t8->KM'b㓤gog -K.S8{zp9f rjr"y"vsJ\i~6ʵBbANq'ࡠLh@K]5^U6( Hة#; ]Cm5AQ\MqIIAe"ԃsYwJ:@mx@וe#."7ꋡS wA*e58ӈH[CEcVVϒz;>.*}BB|\sH%u縼WԈi+FX@+WMW"J;!t58 +aldM5?LvQ)xۂ3#F u%x{mŢ夨0&s~7Bq#796c8|:3 uB]C*Ӱ{)tVkb%6xa3 [I.y:b Ci]BU$[6zrB|>kNr2PO,U'[x=f(ioJ XBf 01f^fLaI3 x 7q|-'obRm[Z1VV+ %&<~3Y6*mC"Co؀Uz0alvECnɭZr]Q\뗙uVNTV0YS\ [CZNVW:ZXR+#lF$aJ,_:zzX(eKg͖Xg5ij8Ȯ;ԱRs4W2^-ڈKt:DSs-:ꯁL;aHHG%  $&D 'KbJI'ws&UzNx_hu{5(jF6cuu9,碞, ,pRۉy, 3f>?Zk6ן05:?` pb)>7DJ2 8`˖@K[+V`/:7͵8`KM3gTOx=vBCWoz/ו;5bZkr렃ah `Bu*PYΗi㰌J'Lu0dni4ex Ftaqt,iٝK`  'g\|zJWG8Ur[cuq 3 * 2o׈yGn0wBcAXX"7fv.rR IDAT=*1\I0ں|3`>c("o#YG#fq3Nf[ӇF $Vk50P'B$ey[mm{,.F>rո!ɥr{5k$`$k&Ri7SlsvAH}܊Ag(H캏 Aʆd%[R<L3nۉ: ZkplY,Dj4$^= O}O) '=8y${Fvor)-U׀r#ržݻ`k9ȹ Hĭ[v9e/fijwȴ#iVŋpu"~HƋ&cUp<ʹLwOR4ST QPXaH=p, 5s0f*!pDݹe=d, uy-^EXACbO~AZ됞F/KC-|:k 3`l.`J+4F\=y8u{E= NIVx|R#"8ǶFMTk,q$p=n*<)P_wG+̙!]nl;f͒GHbm.ݒ1P7و>p?F* z~ z{ J1w=am{{u`u??kpjo5ӏ+`# `J#26HvFɈK71K1XWIUKWSR _ 1%J82f vm];uzLC,G'+9kUU].bX,# pخ_~+Dnn15R O $mQBޑxOO`L}?v \""#F< Ga ?)4b l0WO& O[ !G%hGR^ƋI酹c&`-n)5DOr`p"& $P289[>nFajh4ہJIG[8 q5&Y37KC1J~%KT ̝m>{%i8b(cEfLTiuuދ P4 z[D*z#G#5%8hk8k1\K*nDIȉXGmQKL9OAtC"~7iu 2mCTVf?5Ă);35EX%g.%H҃+XWM8Y'3H  XYEogrrdH5TNk\Oϧh "=S lH\#1NX{Cܙk,:j+bʸ35g=lɮ;}4Q;}W=F̨3ԩ͉Nc]:[yD|#ݝ6bdyr۰C9?oaޔaPcȳ/ +Mu50FrXfG uዑHpՕ%r 1n50dW(6Z5YmM/ yU0\ ;iTuݶEa] u; =8#)p!~[Ύ/䞑6cA$vJbN'7q*Mae #-C;0#I=!l߂ߎ'uhÇBq "n曵Lnq*_Lf(L7eMGr=PR-8Wc% *5[DC'l4J#Q}fau:qQpSȈ&, f ;-q3aq CgxcɘH^ 3\Osf/aEZ$z 8P)44E{^pb|7v6IGzF-:q8yw.qg<0d 94;*S0qͬ:׸2L2rCNB֜ KC^]xFE1t㻬a$tmɺMp9 報#H ECSQHkRo FC/D8iNF$1Ls&4b{=d:jxkİ:'&K!I*VɐH=@4brhĬ]{|QM.0b, &>B?c#1)1Yn_;tY# 3ӛC p LVe×v?w1=Tn09<&L>lLTZJ󐜹4b҈rx1W7wc3[8N#$z1ĈpR G,iĔ޿;ݹACaV۷NNF;mTIUulbhr |l[F~D1"Bzsb0G %S,k|b%s{ siĨӈ).#Faѱ=Fb<wFz=AnzΞeiI9L$ ެjzZ^1g<=z JkG<@)maJy/gM%j aN (Ι{3CKA!8o5MkE K")r&D OܹՒWZk)%jF;$މz"uq>qd8jHl&[/ ?TɈU uLY \e'.Gm4bYjb2{W6uꔞѤg9}V Cn= 2\kzOk<,h-:G,ʍFP_j-`9`Oh ̒WN;8v UÍHG}})!ÑM0F.#?3%#S' Dž4b<1T2bQsW V=k|7 OE8iL(9//RF-h{,wj<ùf2bwZaq. w0~PcUWr]ZA)ݿi8Eg5.z;hC8%̑ǝ#f~Ro6gymTOjvܚTE66ǟ?zb,E߃J$F3n_;ndVcTIFROui@rEyɦۺ ɗ0æ Ts~"܄"/מbȉ_RJAOqʒ0ΙB-䮫0I|W H $$u]v1>ׂb(a st< ? N0dgL pܸ#9=z:+rqj}9Ąbjӧj'QT1(TY@&L &g'㴏 vlց XbAXl:_`f)C Sp%6Vwh-^{4DrSfkLeRN?mH`rᘱ@aq^rVF ?w#V/hY;u0x@8%U qX{"zAPp/!G:7mz{U-{'qLp0V,TVtm._de}uli(Ow#g fKU#Y7 k浘2Ay'*ʮfKc-6jc쨉dHeIǥ0Qo;q)\ΜCB|=1"ԠB 'Јeu\bx3``i.G +܋5K12suVxPS0hs S 1c۝F~ȧ4EpǍȵX ? \XZt&2!P\$uM?9P8~Zؾc4fZz %cWrb8Ucw3GŒEHeK!~^[9::@c<(-AP +6#&ԏUI+!7o) LͰn=L-qNN͊r)DZ-A#ff#hIYeU5u:jH6`rMha>*ָN3,„aq$|ܻDbt1̝4zi~1~3AՓàpBY s(bj=lVm@ĝxDAI:F=wfZ_Y-QmۀOîL/R3rrc|+Exbv{#*qcԔf3Q [jKW"㣧,ȇ4i2"*cʴXG$X^?;5bzG^|pt bo_a\eN=q;B/zc˜b3K} RV%[ qhf*յpعf0Z̧)(;mKs¸wV߳k*NT~fL7ozQU#v03czs+i=d}+v60_o =70=D'.  jx}*'v4 zs*_:_3L+sGSwY½D̟ϾxR'&N4hkAh⏼qXnl@ˍ[=XP;`lV$-yVk罩c. V_Se Jc;QTUgpteZ̍R7ݰ ѩ]̩Hb=#dLu<E?oOp Ǝ =/Wd>C>1<6XV7q'5R)n= #=s֭GYXBh"y\03s hkèŒgi3%/[7p,z1F,IL(n4 =T&0JDwe[+` waq)](c Y=A\ ˤ*xlTE}Kʙ(PTwkm9]P|15ѕ. q9mm-ҽD'D H2+Fii Df@gPO_ȥӢBA8ͬ**+ `2Y: {w"bl&ʢD0_>/ :"My2^JOrjt."S"DKg=˭\)o =tzcW.%%RD{T`?NƸ0R&t' =8ino̧0n(ݓ}."E g+RU~ܿWU*j<ŋgs5.\{I br:#*Qz[iIksF'JE 7VTbi{wL[! u|62cm+.drz_o8 J%c[yD^Y5uDW0 &ƤUsub0/AeU43w"&D }"] \ CwO)#yQ=x;B_i m]]Jx99uWXY6_A]VRs!z2V͵w _=L|縖qS##Zi7!nVPa_9+掘\_ zZ[w;^_|q.&G4\Cw 9\FoE*2~/u%ވy]ɽ:]XNtc0TX*\3宿j;-_)_L@F=@!Wp"nފBsK;ïb?z[NO}u+nU*c^Z"<#~_F黖뿗ۑֈ$555DNe.*EA:TtbԳ̱;Љv[*AJxkLGm-+z;=~W`i{E|oz&Zԧe}D.@mQx^8ژZ'EIn=sgnanWaEyN ̏Lj `4X-ra ljlfˏտ/s$ɱnboe qg:on䫌G;Ʌ[|i!qsrο[[$(:F&4MRRDoz9wkTf`*(~?&ˆURe"L_,'(g,B@-mGXDapUQmM_߄ ;LD|[?|\,Y%hl; HQ&f}IJ˘ x8GM ]V/^3ug`_CQM/ L='Pͪ,DuEb+wqԿcWvbpR> dbYYy G R{D#!%*Eww[]s~2Gc\9!~[M\~䡨nkHG^.ƻ<PzwUe10X}?,qsƳO=:"Y_[0du nw!w7.@'D8*Q/>GO$-uL[sa8,uB+w;|g7pvq Ha#zM_C7Rn}֯W3-nǼ;ܞy"IReǂٲP?@i=sxv;GGu{yw< .245zRsSQ)'qNw{Bi /K:{#M:E2)JN13uLZa:qzƶ޽.0EyXoCg^-~~FLGCT-*}]"?QcS@E?i'W4=n>ԧϪ7g8q;#.yի$K1w/b~ġ޾.,T'20?,~'; W$+fz}Ġ=fq;Kl#P|Æa֓8}gO3qIr 冚2D{zUUJm$ݙnq?#o\xI:( 2Sp xy(VĐ,e{quD P=.\췟? Y,ZE׈'}8<}1.;F>sc%=8O=uI𐥺7$8dx4NQ2&I2x$%d];/_ 0?'M\o EA(\~lyWǃ:\&. F'}/ 4"ՄJ*=b?K~7.]ADNCHi;).izY^]/#0Xg㧍7Sp(zNcާ[2m~suXpt3b#uqaA~puq!_G6 t. c5**⩟Nz{&%ónHrLZcbe!7x?@/0ݤq:+͗z& wph(Ja?~Ν81sy#+%xP.夯 %KsRoՙsvbj}: E(Ks<=qNҽDdy8OKYcqסDrqN!yxqQ݌'Yq֖eVDD&rӹ) MȐб[H 8FZo*I"YY :.SX\䗧h!ϴb*adK i:OQEk~8uq4.k[B qOOCEkJ}|Bgut;;5b>D?_Ġqg_&KXb O?G|& ?sXH>?׿|k#4><5ױz8|!M7~oW DB#)`N>~}>O}O?\Q+cpW^S +K Qa{X~qHN%v“ǭi};g"QlX S`b}'e\SiMzL,O9ِ1q%4Ģ1SZ3bph= U᳏~$ qLܼ31;4cC,]eNS0\0c$ P5J S1zXlqR0x1\(gЉ0q8f*\yuQUQ~&0$EE.N!}OŪPM[9Q]Eݡï 7sK6 d,͔\,[ KV62jq=L`҂uzS)7eJGlŹJqDRWwCCcLא9r'ٕS1rUUW3Nj&X\YF /,XIoh tAJ43.{4{iS@X}3%;kj:,\O{4vY⛁1b,a5E;xہd"Wa1OYr3|"|ҿ{S|ugCVY[`DrV5]wq m|Iؼǃ]>FGl6n_|yLWRF(\0_i'(X,X0r"X7oҞpsgZưq2dm %,]a\gm\ i7Bvt jINϝ.UEP"ݐSǓ4܌]/|`̤ABj҃~ V-]1yֈ21Ap&ƍ9s`Xf6PoL{`4y̜ U552ѽ\'!,|wPS'iP[gt ?7brRr Quc|8#=CM BNF| .!D.gQǍr\] ƚe D 94Lc&,W Odh· Acl6@Yy!f柽~4b̦ e4rcjG‡U<JSLy܇^q_wji#ÈO͂Vl߲㔴 }0ax~l_s? 5zd7c~%ޏ)AXpfX4s(}= .1tDO 'k |W Sq';n.%QOKUN7n>i#Pd= 1x\ɗ 6R aXɹ=-˼c. ܎WBړ!?l&l"L6 n0&{ퟐWVyO._wO0 W/IKa` 3D< K8CCuV:;qS!9uo"M_@zudČ7@=Pa,SÌYr4bq9  o"":;^^!Nf&\ aw_BFC] ^ թc1h DfV&_*%65`,$V .]O]Ny6v n ]OW&Y߁>$>7nd0 gC--1#~ W[ ~b.HEݸtY T U@||£b!,󌘆ܼ@đj&ܒ x8ӿcè`Ne|\ S[G&q&]^r9@O[Euw48+H/;%꒝NxL(kj mA{r ] }qu.A#&7` (֭T<J!\E`”ٸND(\Wa2%וpoY!PYS>{0WfCZV<,tcl%r]$7mpУ_zn[y 4} b4e3}]c;4<2jP(i\MxS[M>uxDt>S ÉH,dvi7 &8try%"-Ͼ~HZGaAw4ty^d4U!&W<'BiJdу&Pߛ`j;YR+_6w!P`g葳o11{V {Kc,\j iŸ$̗Ly8}-)qVňap!L8QfS1HJN͈H"S4[3u0ʯDfvn^=]/ֶb.&yҢxu櫮u[ȽP"q h+B"11רs+;7@tYnw5b:zQ2|ݫx͖A)H< U Ƙ*0XkgMq!q 购8fc,X #aX|2X8ٲCzܯ#!>[T_8Izk@go&K,)K#= k͑Kߗi3b0ƐI#F\ӂRDéݺ9 J\)Ln0lgf 1"hdB]$,Wt9Uv?MWހ)љ1Me?ud'y ih"(G!G׭N6mי zYk$nrn 1u-EȻes]ܼbXػ]RG2n25ϝgMS4b .o1f,}n]VGC~Pw yk% u3V.qoD`aX>E0E~lpQSu $'=?alvbrXIab:~[53?i6W᠑&) EL1OQ]jύg`njs9% 2Yk)Yay&ʹnӰy w!Ce d?:y'!Oc>Vs\?)330^=WE!:p& a'[;ۛkt yח!pk4D.M;ŜGK nr(< hэj?~6%k:N"*~0b8f~g_H:f+Ƭ JdboC<9;%PCu1#Pޖl߄5 Ge8&{=IE ?[TЛ2_I?WAPd@cT|;AZ)ǟ3,?=}w2YEr" AŜA EEr A2HY 6~pH F0m CNh@!s4FR~`!pF,1`#T&@쓞^9>fL Mm]uUeܼvJ4spuFULE f$,{"SERN,: s akC+"P.-Yoku2:K]z_V] n"箆ʼnҜ Y-9|1l]YC nƠ,\J^XeirE~d*1yجM .ҧ=- ; 8ļD^V7 *FSQ9ْp"*#ە+,䗠fv+\ eESG fþAU *AQJ0+a=y|mXx-M跳~M#Bmg ֭ _v㮖JدQ 2Xe-)e%9c x81u\*󑙓?^M~s9hb$&r{~;3;YM߇( X{ juGVrIH/B0muW߫nݽ:ZH"T]L`h ЙKTq-,4݀90\_)Lj<#JW]vCIbVm::Km (EiE͏+IzsΥ8f9Jo' ;FKhst7>hƑMP^唡Pp$5b^d|,τ y3zvNgO!*\y^{Aa&)(~;cYOܸ~nGe +TRڕ_ MC۪h$mr@6]Q'`" U;INDQ[@fux\("W`F"9%Pņ3$Mhi*5K1UB CDߢ+ |9=3>1}YvOiK7z_a ywpb8`DA̎c/jZ ݴ(Jc(mftbCBd^dOD{SBܜ;`> 9zmC\;m3f3~@i` Tfw/ 6̿7DHV[]IO3gQfr}*`o ViA:7; cT]QE0Y0/-1uQPU{&x>*JFI1 F >bKETLH.a49S'ހ'͸bR|-$Q~r ιHWUPP5ƕ)ه{taIM)ҳPVYGNb2 u9Ҫ*FaјI\[5c(R [h5}7guE:C0QR"-$e}ShhIb P܂TPa6`<ԴMq+,Zt$?'L(EuScCE,';A]$M߀pbOH2 J}.%1OF$E|aQa! mrB~нqomEblH;bʘXWեHpafI&j0q̓&(_j/3_8 r?rM'QF_$Mn  ay0rK*|3ڦtd(F'Jn`4A"QiY"c8EsiojV%geDSh |?~,OYH"`6kPZ_A`b$Ǥ`e2oY -牶cuXL̴範D.4T!+ ]}nLUhT| Ct#?%ʖ&FѰ0x3MjzK$VBdpx!7ݹim؉#P\'OL©}o !}kz^QҬw-Ur41䦪IvI)`ÖTX2{"r>?5 J Yz-Bޘ\SV,8ɨHr[kY-_ylcټa18zh#`W)U\NezV.iU 璎dB+_Lz%r4{oC \2mp:F4a݊aHH)hwa'Y֮Ff3E >t6Wጭ Mgȕ}=Ht!ITr2V4ЅUTƏPlmd@[ ǏƊիy2fy31Qĉ,/ĜI#IW8#r053>Tpa@6P c?3|2- / +yv Q8qx66$tW`{Nf-.{x)0c"vӂ w@^U`nnN}U˦{kF^wbB"9H͐aƭUS`Ԗpqpj*324t fF']q=FXp %{g/^@!g1o $/ 7#ǝ-q-"jǒyuoT*X JPwRwCʼKD N~ԋx0gcLSgSY =]HP1\|yT `hݩ(({,z=Hg01A;))!t@Ͻ-#e7bێ=B`%IOûu]:\vN6!@( 4dy]QO}-hgO9nX] ꌎג22l[FJ0YU031cy7mX@êm'PZzZ>/- qث&e" $+~ DXb vcɊXܐQgFsIf޲ 4b /utڲ3aH] JE ^$L/pF_}{?pB0aZd{2OtS%X pyWA0p/Bd{G) :(/|L`T8\%wD0O ޾gG{9W0 TSO78= י/!/} 6Ϝ'$/QGB.8{g|Ibh}hm98uۿ.ą \eT-i*M i%iiW 2(O*@ [ofvuAf* ]e"@?uts0߁DD\x9CY͓i SBaHX<D7ߌQ]7 \ι77YwY( r%7>- ނZ1RGRwy:t{?񤭮aA PWQyMNeh)i`9ɛV A H`[}zȕ@U_$ N<[g."$Pveqƨ:QHWK9|NFZ͕q8'(pxr.HJ{ϓ 鏉^0Ѐk/ <[&5ipl:v#ZE󧹮 qi|;EQ6}N,:P /?\ #a|ZliF]eϹ¨|>{9iq͉gFdOK~?he7_ ^n![}`X8_8_<}2U9SU|.N8 OexEw8q psU nµ˞8qwpg'|9s0a\Hb$۠,Og))ͳd=PVœCB9;A+_$`m sz{ɣj$\(Co)cBX!ҕ<1!B+޴ţ4a?lCD xq;p Jx:r?a!in -#;-/ ZN?K`H _$3W:~ FP>7o:{pnɀ~+[lŕ8! _E->1z22PNmLⲚ"{F8KB >q Φ*桁_#o"A~,3CqC{1M=|7?<$Y87=~+~S_brEi~ÿhJCf9! fF_RI⇙R?c}PʓȌaJ,J@HX?a'9Yhl!+qE _K@,KWI71M 584ލً!U_K@,K@,c qGv`3$(c oF0Za>h7qK@,KWI71YL e sVC1x!i%W|$VQFM hdW!;`~hdHC3WHn-L SiQDhY575;kɴ0u!!-kj6N$*Xb % Xb C$𛂘7=`tpd6?Emqmۀ,|W;{w62>Xa3!WYbˁ3KNC9خ`1/[ajXaw \O`*XZX`z߲Lt 2Y}:X_ְXeW#4Xb % Xb | 8qÑ'`w?ṧ7`y|$2q)<%OH1'6l9?z󹲬x߱ G­X*r8}ADYYh:98z #*|N(Νumc$d桥 O`߾=t*|fYw$Vn:kr?ir: E]9z <+Jb % Xb % &&&I7]ހ@ b[ ٵo3>nEbDλ+X9Gfaf.^ ^t+:)D}5V^++hj !>gXC#W.ntZTdSutC'Yg 542L7H,K@,H}q7@c8|(._¢w%@ "eZUƶn)F 7oC~w[`p \oLBЋYGI ]DekڊB<ʴ`{i3q&Mu I ϹA%sI9$% Xb % 'K}pqCA0Y H إ7sB^ML8D#|Є2>gZO% K@,K$>.eeg@$''̯ļoySM b,F@tRa &Q1ƈT'ȂR,Q[4V}]T!3mzWJ`8Sg&yoq8/okPK@,I@RY@-뿏" YKJW"?ڷQp AIQ*,t?6C n1fYsCjxö:x)X2,{PXV3,1vȟ0aA}aE_c ހban;-K@,K/1O J҂'f),6!L])㇙0c">;va?8~O_w 6Ֆc1&!C ǰ#!%X 3 T|;K@,H b?}jRTT5V){_a[Ywc^ag0KoMSqCTU0«M/_QضvnX'Uwb`n(]hUmc]̻Sͅ{ڏ*J}J?bDBg@sdi³EwRAǽQ܁n&t= / Cs}92pD}kz^̸3r!-3A5T?CQNL4eeD#amu8V6Vhk e2PXԤ*i㻭*3ÿNX )E o71\ZKq$sFQջ!]eZ QPACyL?=#2|W}=+σ(il->MtBcq7xG qGO?}VǘExR& ,q0[)RJ*Dљjql,\Uau+ `n'J*b1?~5]5Xt ˣݼbz[Θ0}\}C>l+~SΦ0"ؤD0psU׳St=@S?R^-:7T 2,oMGJF6>|F (6Cv~R/ښj۷n? !inGh=GUibBEF`p*]! ~%ecB8(,qC8DDA0PVR\VǝLB$0n+a8\+m @/uv6 KXC5M͢m DV^>ګƹyFƈ.<, J0kǍ6Ð pV<qR  /=Djhwߏ /͵0_ÍH)A'od/>FfNƆ(j|^~uK8eH#53Vh)j=,GX|h sY^!;5K⩓oCMƒ(SqꦘTnjI0vķ;nLLuػ cZ$45U̟(0Is@]g7j q'2Y1z~,8ۮ툎Y'Nx&{{?غ"fsBVFKՠk܊<}܎[X fA`s-ϟ6" 1j<|-Ecm&`,Y+p ֵ|~>r铠 3Zر*hJ0]ںXnfRѝ;h 9iH(CESZ0ڏ0ZPZtl<.' %5ȩFy_'tHcu(.դ)[Fkp+"Ϗy$;@b>֮[y,Xϣm p9ZւdLDX31n4()C5ZCNV]kaِSPĒ2Xir˪EMC>AH\)gB6R?+ ss>TdR 0هltfs*1u+hFiP%M 4Qunc E%yrÅ!9s%gaZR *TS=k1PUW7-m#DYgg+o߀S$ ufoXfi~t 40] yMzAV~XV噡ёÌ 9&͝ EY)̝6ktpEzi>8{|7KC -PRRRȩhE?>~nvP\'! %hq &(?oޗt3$a꘡Xo9`&-BSz0P|,j;?T *CiV<{[ . q[jgR;}>F[}6hAufCKCܩ/%dC.M`FMqM7*JWTG!iK·5Z^=)aPWđpl.FTjd9o5 V!#Bj2f>t7zCL= sZHYςx?lބ-; 1o9w6=H?yݍ=a͈2!"T$b̔0܈1}5Q~95ȈW$na;rL(BeiL T?7Q‘ E?9ڽϟ !LwvHwTQ9D|%Ypj두[?'kkSaKwDgݬsx#&zN%`uW}CML&z{o$^|Il3Z fnE%v/ğFXJ*uL##z7nDOFP4ނVcq(VJ,tP_? 3"8{|>DН4g$pE v/_c:zxh!ݻ'Nmh%AViۡgR|}5Ua\#Q@Ɲ[1i:<\9 !N>vՕEyc֝".MM(z(2XĴ({  ,l97mM))K3lA}_h-;Ո;98 뵺X@2O]5EEHK sGeׯ%qK]ˢgû6(ۋ+wakϒҴ dDً@,-L1,UcĘ}~N'vcԈI7Q%AqPЄ@ՐSTBTEۍ/r=Wܠb`kmaV( CnjNJ@|? LOm[s" +gy njI~P,_\x ]pk~ERӶV^, ۝PswʚqRҋ!r{.{ ̚mb-:S^; ɩ3a=r9ywṷ"k\CJh.^=GΠ'سJF_1G~=>$`ܰMfa9cN·B`2w8#VsZ}jcӱ1׸'mˍ`KAPz ,'q*xuw|?g71fFxSFKa<]o1/UnmF4YOK+29I֞wۡ{X ;V &Hi%MASu!m4Yy(kCl|’9EDx82r>T(FV(I`r>PshVY#)ꝙ ƌ'H)z>ٸo@>|ET7 _=p=.vYByv ke bK[ ]RV&ˠM6ְdkT"Ou㵴Lظw;!.1c1$O=h119a^>N[@e9¸i)5e ߄vXOwroTA$wt YhK8Z=[.ɓ₦=lC!ucB?3S5v65]@ +u(’kD ׷$%UMljkshjGA6r2ǰ.ۅ㪿72Ca"O҅MZ7mMX,+s 懑_EoQW\ ׶)`播)=1=z[uCą-5㤻Z[#fP3ڈмD8]p E`)1dvƠ]\VA7.bȟ7=.Ͻ! fIDRkt&"2K,;А8eQ}Zc&/j:{Dɦ\@6Z&b xz wZ? Z3՗B|3 b ٹx:- HAzIs\,bR﷾}D Ǎj?k*N3Y{IGBf*jGq℻(:-QdZXn>ЉP6~T/;+;qe=}dG-,;1e﷣8 m`m]c5 DW6@Lz7, `wZs7"Buu YѼTp1}?^@T,3[yb!cϚ +h xմ*Ib-JKE:p+{S8%vDpH $rK5Q.d#%=m#|݃@+bs`/Ĝ}bұef.AdJ&c/ 7o vx) f د :AL91ڋAA ٞ*W[+ 1a 1ز#I!$42,78R1cA +f J7265ݸDD}2H~܌p|?r[K*8 E+pq0I1/*CWVE?_@fHϐŕTԤyڒɘbX"<`:7Ty-CX-Sƨob뙋h!/OБ`G捣X4['%JZmaagM2̸”;H@& ULpq"-IʘP7F'IԏsgM#;n^"G,<KmHʭ@8 \s]Optf-Y~(hZJal/?*C1ۨbQ##uYeyl __fbb<]fXCڵEp*lХhRzH_E:hOh=z1ÿ}.8<1 v?_9 NE9䢴CDa5O8`ጝ&*„v)B$7pW=pe;TթlGbĂA-FϏd^S认6'7I:IZa.šݢhig1Ax 'bR|="F2O%(C>\c8vOI#:xu!1h <+m܂.;p.[ǭJZbr--1 q%%]NsŒhDlF.C[nAj*.S8p)MT4_b%bN]@Y IP }{*9*ĸDDrىh&z0'6?$./d|F7 Cc{@mq$SGD9&ӈnTsq`H!pb^ΜJ7A eڀbd\"XnGx\" Mtet"IH͖N7?Է~]{Vr ހC #ge+5hI̶4}@@tWmH丙tm \|0Ka5"K3r:8A$HK&EK')9!..;L0m R q/4 mk;Fʅ"}Nl_[`='رk7F&?OL%Ka=L*1"c%M4 Ds&# oPy1*D&Q'Ri!* G9M$#;%ӆAZ /hOD]s.>) A7]1[yJ4NLYA qcz Z2h{]u',58.GN!xSÔI^Zt1b7H,)%~5`/_hR:q⥆ACĈ81\g.9F|o!?oKa1j*Lvأ&7_|13%aI#01д9vwaF 1c3xj#4U8g=ֵ{{9dgm)X"Ć`Ak+H/R+twwNh$9gk2711d z<=E 4` dƎ⟟$n/;]s^!7;%JJ LEjX|Щ//7 7A{ fNAeB٣9Dnæ/ S0g*7m3CkM>oh~09RJ̻5&ѱy:{ȰTCCķ4ѹ3iT3ۇpƤX| Ls>;VnF_Y3MMhn$Q-YiqP9  T2®uߜ!ޖLh 'nD"a"RC㥨 cC=̙0_I-_}} \22X)〙 A"^=siž3_ܬ90I9yN z4},N^*ϵ`#nb&>e?.oJtfBo)e&Lv\H'aĈYrKcˈ)A#C+ bp̈́Wn`v];3%0o&[`e\ Kmvi M3,[:ݹESŧ'?~kG9L4k"s#56Rz4L> ѥ' 57 6 J32F*a\t)Č5fpίVQu"F1<E&[RM1jh3G#z~!6.fτXIc(Byq2#*XX r8V\ ӇAv XݴaA*C# '1m%gKJcoI~+N] +w#fc@ϛ;>|KLPي nr oܦ';77%;V<737gxVSͰԒ\EjKn;-kXSwF0[VaKW~@hwE y_o Y䊨6us!^wE_uTq GW.7OXi7`s:Ϟm'KyY떸F\b,ߦWV%;,M'ch9M?dڑ%*O<6ڐxZ[PC@GK5㦅97E+-ʂm`1 +tPlsulD8sy)_TsQt.֚^7)BljZmc qXf^KD]I}<|Wl%91c6!,@> >[{9'][-ruuA:,%D7le7`1/O}E¼}K/OBiN g'!d$*"/~czΉyEr8D󔞂=oaP52#g4Vϴ]?jKW *f.4UI=878^ֶ{G'8Z㮫-5Vt¦;58Q$[Z09to)oZ#lߜ]\Y2$CC0*h.`ȡSb'$s#CfCܠ&Ԇ/K+"i"(9jn@7inZYR \-466Vb;ݼPLhQ (rX\|0 "S<y%PE j+ꀛ67p~:/\`s4޸̵es˞QcʟyKRt/> ڋH#x5U#"7^+̣[Z$hm rOX8v^x±Ȧ!YWDs<;䗞ImGr:pkSS`F>Vuj:[H[x(FZ[^epݲ%Ѧ p BVuBو|9M*aw d| Ye=ixNAcHsKؐo5,:9lZĨNOg81X a4Ѥ.l3!@nz"􎰻"X Y9iؾw/u뛰ut3:(nߤqs_Et'n;{V3g؈kor:־gp`@ JK~zpްܲ2vj`q@X]y 11cQvuNAL{[%"=ObZ0Ic/|3Y/YGv6I~_G& :Z&n#YC6r!n""m nĪOڸi爿 3+\/$455$7(W=?7mlBuGvoōKl?EfNT4uqӿ9ͨF:r???Br1l@7!@V>c VvѦj@w|.Mc q9}C'^lB_j Fh!|/̫j߹ 8̈0![O> g .)%B)]$̡/6F[\؛:CmhF|ax٫>w$ax:ƫQ\c5^8ű.@lǹpt})Kkοq\uK ^r Ϻ{U[_,<5 lPb"-#!0vu] K8کOuRuF/^ُɗĴV!!2hniIhťk:&1)5W,IϐKf󞴿?5YeOCG3v>MJF1U?N ,eyHOF%MR]ZI(֨k#_.-DjSR~S`0\if/W"75ڐ\4q61S:g Ά$Q"=QqX_Rtsn$rëbo( Q@DF2$%TY֭mw~x ]7_D$ H(gW;ŲMm~z %hr<roq5Glo$ H('{bYش uxҍشq|)O]b(bRN2 nziI';$ H( QOM ΅'>-,F͢p2ac'yFL`9wѿmLu.Q@D$ Rbw<##8ƈ4L@7Y<tY6'- WLt.f(zKs & f2^$nن@Ow'~bO۫g+kq )Lw/Da *cr&[DL,6o6avB#tVbPT]SlQRd -$ H( QmSZ^`xЌ̮۠:&뻰DfVgj ׀vĨA?19ɏo6455q2fNmǜMVUHd1t,8wV' T ã@f^w2CKg=, SqYLFCD$ H(s S#4#7xl jkXvTERXTM8EUw?w*G-2f6KZj >MAJc+`4y&gRVW8y݉YQt z} 2Ǎ1z SN1صl؃)Y;D$ HWQ,8sB̰I{1-15dM1iG4_;J1qD֋ޟG .a: D<$Yi2T՘;u!_Uˠ$"!Q@D$ (A z cnjޞ8`.r4bR1zcˬN@A3nI2/9v4'I۞;>H *@i"#0 1x˛!KSmA k W)>5f/`< /#Y'orgsnb*҅KD$ H(~(@ ZKa<h*ӔɌ׍}Jǧ\QPD7QYg0w".z 3;Hbܬ_BY@/AAtlX/ $ H({1ũ8b _녑ӧ[P-Q$w!t>c(}B$9 [[aj~;.Zi#IV-iqwCPXXpt ^}X^0ňoFIv9@~X(k2یޟ|Vh%+^ڂX^-զ'/?t+Ɋmȩ-# }( Q@D45T2fO5 )I% %Mwc ,Tq).#YB [(ϥS2l6`1p7d5p< EJPX]"&>Y8 ֬Y {ZK`%7/ եشYadO ǂ(KXL$MCq .:d'D`J% ;Q#9 C"$ H( QSཀ>+xȟ&& DE"44+!Qӝp1"oyqP^ZGcQZ^M(B|'~ǏQ+0=D>u,& 5I(^^R}YAt +Ɩv(e e >i&B3$ H( Q@[{1ooF5%0?::pyUMD%IȊgp'u=N:ID$ HS"b1!; ϓ |7!Q@D$  a@L3*+*EoDBF4ѼȨQOo=$ H( Q@DwEb[RS]gŨutz++Y*rwhK07[xF!zJQMY嘕UTr?T͝/͍(-*B\YdWbW./SIF>S5>Iƨɜldee!kX%5hR;q܋JDQU)lNbaexᎳG:7?1<pYصWQ&nJ.Gh=zx~\GIsn{[3r3S 'G'D< =;J{:G8:*_ǯGe?}7gOή^ 3K8πp\]$}ťݓJȯwݾH[m9z@ u ϏDPP vW!8W'7oGK-t|xwӥKx{l#\<"" /q,TàS8 ?1ͅ/OBPPRruqr|\K@UmȓIOctwvB^a}-| v8Wohkxybv'@[}1(- eWrv58#A.p8v܅<-]3!h'8&Э%oCMe 53\<"޿"ph&< Դp%~>+-#]~ طxqx/gq?d<־Pڷ0^~`{+0<8],;4ELNyoA޶jNx:#Z+Ba/7G //C^Z2 SܹՕy"SX4ux^ޱ_r z0ƿ>KA]]x7E1}8uKyEXpaq/w# _xN\w]={9X !~un i^߷;Urc>_}b)XepO`fDwct:gMw?4p u<GcIX ؆8`񘩨iS&a1޶ 1)(I!7I ’y9v,4TWS7K] +Aw#֮3W ?sAp'%5Z}_uS]9o4(.UC, 5($F`[;LC&lh7pҾ7:Sg0ڴWk+ tn7bm3P,T渮QY+[҂tX %EhբFB+' [BME[6CSy65.XXZJ/vn9sI3*hI `@?W ia:u,e-4Y)ol\Qa5ؠh^jCZ<:>v籪)ˇL :*\[45Աlj܋][]OG ,^ Umٻ ?Vge <3jBhL8|ܽfzun[tfo!7&;aQM@ނXX&8.p ; /ҥ*&6+)1LpzKfOėdzV {pJ+*p6MR3峚_2wphY: ܽuT\eCHy۴XQkI; K֣)dem A1,wCY=0޴ q+O ੕K^P_0شQ3L| jitUm7nMX5e%z >8wt;V+;T߂'6Zsw*SG[F)70\8s5e7iˌGrRBg4|IoLZ 0e'"3oaδ=|&6lz !q+av5+|-f8qۋ]k3e&|9h)zrHWXY IB}abf-P%G ;>x2-wqs$ht^WZ7NVƩ XBعKq"_wkfr5-=mx -k`(&B*=X<~v-Hk>; u :1`aD`pZ\բ,[Y3q/UAeu*)Mʍz԰7^uN=5PQw`o! 0y22 :[JcH1F1cKf#1t@ +;钀U}w-eމaxL7DAShr;`q )q(&r ahz}1.1W4/3#u4bcjb{cU.OnOҬZg.<,`g(Mku 'AVf6ey|v/d'OŎ'p`a1zf׬ !iBv8=io]Z-"ZԺ +v51m8W# ľbɸxO5a mnEM T1w8&P Ղ"&>ڥo#Q dJ r!PY[7wܼhR A鱁Ip .Zk,}汮 pqaq[j:b"jS?{,N⻯zaFci,q^6s%!g- ϻuRsB.Cq"n>vSmdT?Cv۾2 7K0b"-3G,{2\J _:gꨙi-G!ɌƔ%:r~Z!2{a(Ξ?/S'%$7kݰQe1oO?Rx-: k_Zb vCah9uGVWfS@!#2,hV!'2#}:_+6 .%zŦzdE" ; [ܑXZں:.5p9g?f>h}Jߠg\Fw}ڭ?![m(Ȉt/ |CpeŤA1}<ގwكB!RD|>j86{Or XEqڞ8RjTHNfVR  u_?hN %ںȪk@"Y yP!!5 Q>PHVUSQK%ڂ? 63N*5>6.9H^"~Vأ7||l8hnڄXKZUSgCfTRm%)9X%efAEBU6JIULHi"o>>H}rfYEya7#0& T]dD]ʩaj] )te`\:fyƙ[0tw$y bVF>tQ~6kbLqm­;(@mY.V@t̕>tx#\ej(d1kIDfhzь&Х076b.=JA]u\P)o(ؙa&u=vF#0ؼD ,]8~ R l.. 0#`#gAoh,pi]J_Z sI oXں]}x Սe޽#G^vg0ˏ0e-S5m{??Xq)r/ېOUm:v(a"t0ۏo8oCu;T1ܤSw >|w9~:icxR7&'$BiCEY6t4aJ3mj SЧO&+t7IUSe>QU)ܭ@v GC#ݦ?[vsZ=y yL ?Y=뉥d~VZuE>o*"Ў*<멖d,R^|ô9I_2Sj0͛!Ybd}MҥtɡOby̐Ԃ &UB-V`WWj 9Ĵ5D@o5gW5tz?F @C7YF ff121g<(̕䑃1Lvn+:=#&N_m{52˸~xYtƪz؆&R{.PS2gF<삾XVn9brLE3Ȏeu $ȅF,w8RH$ڒ,ҖcxXQbtCXZ0N[(%;h2a%VF'?5VFPZ., N4}YCbG}9f̚ QQX~&imQ);i!)1AX6{6tO"0>`2JߍxKX=ցȯk:bbn,y- SyS~͛3 @F^NIpfEJkp ^֍2ضv?l5A|+5 qh W!A8*sɫR}mkcA?{鿽 mCap&cJT[P[Pݵ6)7 ƪҷ?dur4VFnkPUL0~P3퉼ų ƀ f"CȷT_K_Ju/-?>zJ4!x] 132;c peUȥjQJd~| ( BA;:Ѷ\Rtٓ*gsaqj*^cP@e)ӭviK`ag?+K~ 4jasN1yG ߧ~tp}G M\)v<-䧇`Z֐2:OikJ+ tӋτi7$tEeer]"q;*pȑΞ]kF'HtPoO) Ьa5Ps) 4g f̤Is 'QKQ58BÜ4/`viv\C`ҵ fvAe<2 {uWbNTtɗ^1;ymwV7EP=4֔ג fF\ {J<(<$bK%L K ;<#]%M#UN'Ѥa8karK8B,#51К0s%lcbx&F1 1k{% fb^1-M\#}PRs FjF&:iSwY 'Ԟ"ֲ2RfK|qK II ALߡSVsCkp9 cȌ8uֻT;>IHKcԁ3B#(2T3WL:#rC5zH_Ha# U;/ŒZ8{AHb&f]A@ ] &Y>Y5,ȅhf.jB·8s 4{\SՋ&gIX:!c1yWZj  "`!7u[ W1LO1oX@X`. q,{DO{tc99YV/bA@Sg#51ݚ)"iC1f'PNEIK)?9 q.៵bRRNXSDfɏ9su?K/"nGsIXsf n:d ФkIDAT7:@c+ 0iJ>1˖ 1^9bB\1kgPdLb+ tU|Np4826jb:AVs?C00tclws7щ70sѡ3`-4ul\6o+>ź0e %03& OЛNxJJ&X-C"nIZk$Ѓlm.v cP8 aMG1K$Ҝ$3S9֙iOV/ZWIu>fe#7'$r-ǁ6ԗBc eee")1@!'L2 a4O6`BNYn2~S<W׳ `7u>=l8q69,q Lꘛlo,K`=sH_ރS€ZS %=ګp1*^FE<;JI7ќ$8 Ƌ*:$~2;@з!+'Gj2YpМz`rLEVuk* t6N+ +;?бc+C\YADQXijn"hJi1t"9Y)!0ޠ!#d`-jbdCk&R1r4q혥ܷP-&}eC|N𳯱XkBuy-z} _1ybz4"< ;9#|_RU,3m.Κ4|g0(.7Cδ_3|e_:ӷ{ZH[^azq9֙ ^:/YDvϏTd,7 #w6·^ Hd̷;~=Jd)qk ̓tܭa7&yX 9Oo} r0cb:/R۝C${堣K/yE[> ٤T&.S$/f\9aCBu>v3ٝN3gɳxF18 $5灳'cR:NypUxEģӂ |ڍ`ؐ be!dϠM7cЯ0}L9; 1p+^[ 'r:3\ Ar:}fk?OV%EbQѳgi ?DQhu5D+e &Xb#v<pM5wbas(,v6_0Ecqitw㶻 k)XXɎu0bř~m UՐȌ'm/ 3yu)3b"QI( Eg|3w""~s'3ҍ5Yt4 椙r30{ާ~_b|=;;6:'>=بv4ÿ(xy:Dizv#Ve;^a3l7PJ߹0<|qil5; cgQ]C>ݿzqLŝ\"d\6o]Dw&l58:qӪ'sf".-l3 NDSUS`vQLg:F ݴN2rINN=@1sNm0RV"DzO:i&0B=M]V3wm[:,/ٳ($%ByjB3c-oK NV~::HlVQN4Rpag.J{ A}`QL#Szr42$m3=Ø>LJRbVl30vtFUg֖:YH)OcO3s8<ƑI].["NX>T7p!%Ce;]s x!'=p4liEl+\tA\q>C`k㊇x^ȡYawnyi>sp҂h)Fp9m&p ]0ʌ<QBsx^NpOj+`awQQb֤GtԔ^suO>暪(M@~>&=FNp!>LiN-oDnC=l۪g/"\&3 –(y'ꮓ%NېwKbFεb6WtV:Mv2y 4'k$e&=ę#`U66LmAmJ;MA9)}; G.ønvTO{4p;5O½1m0ts;B҅k'ŹY9&+^!Jn[]6I' `Q$O BǦۍ` C@mQ*UY+f0ZuN]b "mm)ûVbv8M8M@~ 5߿ 7p/>KՋ(Fn~9D:w[iG=gj'`H u]3c;bj 4 bg}|y۲n?Fy20$/܁5+^B.L [m2:VWe5;@]{ ,~A3`b %wݼrӻx]e&$H`,zS4l<-fsb9е ~L ,5WҽoWE3C%+1X9RAۏTy ͡ёﷵt!BW,Zӈ*eӆ %%CFPȰU@D'!v(,Ђ]`$x@b$x@$Cb$C2$yy%/i쥱x@.@b$#H< $#1qP.IdH< ^ 4Ny]v]k$# H< H9Y;3e%ku!ח+Bo[!.VG}] n J %C d` (PhTlD(؍F2*P_"!E۩c,EuWlkղ4*k % C# dP `1Ҭ 77C﫾s^ jCSJ]BH Kc’Vҗބ5FmM-L&3nTdqN4@7m>tp6DQXOV7CPb d q9`j0 hs]&pcxrV&L 'bҤI#SQQӀGrݜ 쇽3z+ظ)4۬m<6XC!#W7`!! e@IъEz4Iqxz3 އCOe-fNkq(m(K?A[Wh5Wռgcx=uz1 YffPb(.2@ w-ژ Hxכaf7peLmQ~V-_7pK5߀S7ÃkQCOv3Zd;>2@ŀv1gbnq9&NvOa@s0+{95w1lZmF}d-Xdxp_*Q}KTk'} -O h#51q<83G,!!d$ĩsi~rm>|X?n݅*x@Z&VD$ Ņ 2@׈qi51uHƣbtB=R"3<\..s_^$f0bxf9Op`E<^51ɔɐ 2@6ĸ-Cqg9rOţ/䷢/擺wEbIi|52 PPtO7߃}i}tlfbhߣJ vfha֭@c>J 9_+ـ8Zf/X6pk\d̞OdHoodEcM BC d` ։Q{''(ܵñȚ0J` ,5Xd.2WUnT}u/^*'#0.~eYd*_6 ~MbdŗCpaСql>2b@ '{;0:1=.(ӥSX9sh6nk5^̨<ݯُG PjfL6-eJIQ\'%3 $d c`&qKbFQ???%YXi+{|j#d /%&2$*KH{lؠmX_o@ _@d'D,"SE."pZ1ty$bfC(Leb(1 2~~2@` JTdXW zU Z}-hi}RmUEDjaY2@ wĀVJ&'!Y5dbp8' c%1~oVpi;Y!{jm-6-;CPb d %pHf D,|w7C Ch)̜Day"d̀ޤjo]e^(u+F;mwRboBC]5.Vhcш>Sb(12@ b@ )ԢwFC .Us%(;[|(-A3Cڨ~.9=jU`CIJd(1wT#  V +GZϐz:}nd8*]E߇ '%3\`wJ % 2@PQ2Pu >zޟz?=3%\"S?? :%Eu^yZV?յ_]GJ %C d`L2@!c2r  d`|1_*MZ^IENDB`fotocx/images/folder-tree.png0000664000175000017500000012405415247006660015221 0ustar micomicoPNG  IHDR$6|tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 344 324 1 0 }nʀ:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:324 height:344|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:292 height:310|\ IDATxXVI{u@R QkZ 1APDi\9! (9\<̙{|{TRO```Ldd$.c ɾ*{ߥlӯ_U \#=ڀ򇄄+7kKCCC{Fpp0/_/\X:']| :UTwBQ`RPb?oyDoiK)|ܽ/"EF"ϕ->:HD$seKXP24sg^G'>K =r/ڒRJ^ ,i} ǧeKi%M䐟|&(ա dYo #3AjKKsj/Q#<ԋ-'RdqJW`穋.6,9FbĉL>]?^qnРLS{^^/Bc3 tX"QI3xI?[DHfLHqDϱԭL"E\2ԯ__RbE~7j7箏q]>׺W4L^i y%]̲rJyI$Ixxx&We|`ӉUC2RMl>p͛7`Cq~xnx?N?"$EE͍K`Aq?'L:A^{3ol_w Y3o"-01kU[غcК&3sv&~?מkv%3%bƐ[fvWwi̙ԫW/}ر9H!S/2JQ潙uܙ+Vfcch'Oq^OWg !!&a<<< h՘FFԅ}cXG;_؟ݿibb)`n|^fÃٻv.Z6=:hiզU=xOtsӇÃ^y5rdͥsfy##ASyLܼ$dws=X\7ldFv=|4~>(Bs0#ƴЇݧ*8kn뻤)| -Ez9.̗I! 8EqΝرG -9IFIVСCZ*Vݻwܸq&M`ffŋ?J/u eB*eNKZT`1:2KGWQիP6ki\*Vg{ ;94$Ϩbbw~#ZUĽh֡Q#c  w݈ jUD*JTDSC UjTTRcֆ  ~5 jѡ|CDFѕt6C 5VKX"qwI&Z())Y6˖-K 1DˤB&u:A6\?^RTbU =Gxz>wN!˫E-wME%ˏ6n| I"5DH%I6NCCC)Iheeӧ?GDN"̼ʄTH i!ih`bbؕlHEJEG}̤¾El/؅mm %pĕ&қ&to&:X.پd4o^1Wvby;.;pav-CW/>Ԕ5i{';}?_~/)!*X ZӖs=֯^ٻxĚ!h8v]y̽+X8 zkae/ ~0x&>L-- N+ " q~ZJA(wD _$2̫~y!]GgΜ9mpm]_G5L&BMHXlKCiժn܌]qF3Mads(<:TSa ;|ׯjmF t0ҽ†tu"Z겅\ftK3ez}!ͅZ{Of?شiTz,^^BrhH>k 9C~/]۴ i*l˒iٲe,Y7a ~~N ДnfF4IK WWpJH=^3&2K%Fm #v1y{n!G y,I殃dהiӦ8qBQSҖ$v^l"a>|x2η$eҤAH9gmKgϮХQm aT^+ܫ%еqh n1Z;բ(Ns%2ʇ#;%4,Yy*/q94['qLѣyl=q /\8~7]!1!RxXCG!gi[\LϞ/gͯIĐ!9r۷#"",w}$?#sYlقIӒB˯q|^VR%KQEOln>HdゑԨZ 5-H\ ]01dԞ1UNtT8z!N؅2ʢ[ب5]hkjPNc])F",|ԫUF[`ݶ-7Cp܂~HO&cWLx?DG" F:;Һ^uJ.c±2iha$]heº= oWX65!6&Mh-4K&h Æ?7&=m_O}^/e7iSڧ3_-cfyk KR!$*S:?3FVt#B|q^8a, Bϰ)mg'nHPly}*&rExyp6[*͕ŐꩪQϬ5'VإB_pd*YQK+T|EP&mCbQ3ċcys,%Xo߸`i:C8\~*B#yƁh-Q 2))1av|IJ;ΣyC4j(g-b/D yi+/>/2e'IStjG"ʄEG~…O*0w縺s7ws$ /p~ 7a xn:;*v^y j~gNڥ>!^D^: yb捥29O, \Tw*u ZBY2 p=-=}xK|H|&-kβ3H/%$˗_%3O}Jd)"ʼrH2}N# R M )I%iF!2ʬ$CAHQJ#iF.eOIvR] ZD+ I&v>@ Fi^].]F R~ 9HYvfeK5H0lR]$˫Lk_B2!Ʉ$Wl"iHҧs]/9Fz%rʕvX:(|1I]:KeKu6B%}nI ARrR&# # #%ĊQ,\]"#[ ,җ.8n]Y"NTDW2!剨|RF@FO#;v9cv իYaˑ&LӐ7JPC ]#.>!%-OƘP nERqZZN.1d0!_B@nBz,hΝ,YkְjZXZBɃHIHn l޾&XU{<7, \ 'x^oe2~AI>C 7!QDDwv&$R88#Mqyi^ɢ4:.:'LJEw=⁣3Y㭸$߽ܾsWbgiKX\(ʼn7ʯoy/?u5Q .ㆸv1o)HII8Uc_gWOrMXtb 䯤)|r3grQ&)^;J]l?Ua_1G ńpr\5"byec4kp"}R\w/em6Ĝb}eo痝"pyx52嚳'GJhP:/Y ҼV 1K<5FKό 7-'T֡WN5砱8yT/($b:p࿏R`R )܎M}S}w\•3{fq+",1Αwewbism MgwŲ_bh;CL[g$@/X^,>)P#~Tf~ݹ.-kIԫ&V1ĉS_'x>ReTa}e@& ˖]Ci*jcŢ~6Virusnk߇9`d瀴\Zth3BBJvMh6d6XV*E;pIݽM% .-/UDŽy?K'Z Yd|,# )3ȓߨ*SϹ]:ӷo_޳6a@"EmX^Zݺҏ>FJQZSגT\z8r ֪+ 0jAHi U&]Ǔiwz 3}"S'drHܖqme!<%(I"#P )ȃé_tZk`eȄ9+9v`߾}:v"0j?yt+0+lLkH۸?oau=̬{?($TTe۝HIuAHi9 ZMz!QBC $ B uʨXhw!eZ>,dȄd)yAb41Ĵw:l;~dD񙜥deB\SZ@0jәf=q'-g֏Gf}=6bVay]Z-PpK<6ϦJ9+tdТhRR$H4R-ɨk Oԫd 2!e{qiBjȊ57y-ʣt&GeC443f<6YF71,x`fiͶbz_+dBEI1!^,g $HaGkQl>ІRc{Rإ4hw}޼ynʥnmZBcmugq=VZ\$![7.[4_>Ȅ ${ch0f5Q&5mmtOz4?Dͨ[K=5*byc{POܯM]v=(o07-@q~/,M1hٗ8uIۻl\4M5ѨgckB?=LSfq ?d J遺6ƭYi7o'o2 S%Ttk&M?~ߨ$:St9~Kߨ9[oLHe /fD%fDr2E@&"%Ȅ! ((^z1s ,Ybա7gڥ{X[̲SSX>k,:r4cQ%Ox\;ͪ ;~_>SذxNډ-_˥Yy?Q1ߧRr){ %!y=Aol.2䋀|zm[VQW; RЌ^oB}'mN=ɵ[ZFC;$up2vx7hճ3g"P( )*aD'?F;Yɫ_}"H'1!ȋ3ЪR?x'ǾRSCcRNߓLb|g qSE~ ›;s˼_:/ݟQIZH/y~gn)7)11,4|QP,HyW~e'wB\I {$TG]"A䝔kH$aQ7)m$4RS&qІmpx᫨Sv3?e#Px Ot?8cF{v vʁ-KQ+B*JTRV ÉKhgJ5Ӹ^aQ$'Dpc$TH_PX u+4gcX*ja؎w,N%1"0Kea('ԕPKX̝!%5MjvbNZt-TsrTꨬż[zGsl4/E*"ز0QHɉ1[55QW6J5ks՟w~_1)^-R (00A䇀LH$4%@];=?XLHXxHpۨD1c?7{=b>j>[qz挻o`gkV-Clha{_ v41{>7vk^FG|xf1k֢߼͸<:ɐVwkjJa\&3 £ފ)\ڷE kg }'/Dh( 1hՏӶvز=rRxB}lV|͓'O |9[RJrXaརK'V)ȫ4?j l!Qү9(.'CňըTH6/f\wN~ ONQ"=6@, F2meQޯ)uЂͻ`eLahktu|Nhcubↁ $sڐR15r+@gRL `i{s' g\#t rS1+z4B]ǂyKVyf6[΄.\)\}wA,%%ez [{Ȇp( hG8yeN>%!<-[Һu:IۇUR׷PUҙAH#}oxA6!=Z q 6eѥCPҚmasiqF{*Tw]"bywc1)א!#0c &M$,xۘӻlٰҫUCTȕ:$B*ZM'wLOO"7$$i&|b]777<|\C] !fLC'lMX /2 )JhH)[>%B?9V0GDǖX ȡ&W$4R-׿=urqF\U6v#FNN]6?/2(S![AH2{5z-{5޽OFo q܍j?uia ؞b !~H/|%!}>Y!qzPW6W<%}4Qز36.U,WQ]F} 8,DL^qWDO35A"sûc^[ "^p-ӑZu۱=~v}yƦ=Q) \kBAC&u^ihW+M5KW*Fof~LǒT+J[O즌I ,uwqnOK*ܿhOͲTSF)c#9q. ԩ#bh5IGQ[/ҪbH]YY +ŐwE.&"^*5КcUGRp8&իnl~{L l?76J2FG^tW+1ԬK) PI?JXeQUajxvML1+Rj "Z98ECMT뀦z4n? t2xjw:TZ eeU'K|@!&_Hcd~§&&?sb;0xp̽%%65QDFE6K3L+9H}MdD:b]kS$/>N DGE66C'ݔ^&%.6}NOhbDDɼF4ymɉq eT8fKJIGF)ظxE=SɬH:7BO)U,h) *ZB7|=iT *VzmCv\]a~0+Ƕޒ3^%v ba~U[>/# ##(wgxȘ@A X~ZZUִ+qJBqp%HdBe@@&p/ ߳ysfx|fϙϦ݇6&^ηYd-dμ~Hљ]4N0GhJ6=op?Y+2!'D3j GKM]yuhD̟K sW^K 1MJUѧ'jZF" Ymeqdr" RN<~7iݺ#Х9Ly)Kc+VsC,Rb;x;2^IS? E, IdB$aߒ3a ;4gps{T<ŴQTrj=wC`P-G/S!d`l,B3I|<+*,ȄTKX*ILs驿()ԛt,3*0dq.\g tcy)_cQ3hEBI¾ehk6c駼cra*.gѪP:ŤV P&bdB\t04Q%e"(ן]AH 11cEPN[gW/5iBsFAH?lnң4ej-H.30Ɗ6(]=~:&xa\| ~_ni.^rr6H{ώDtƺ{B,zЪoJ"Y*vGPp2S"hmXjm e-BC),lD'x+4,-:OGfvش,%΍nZ?Q3%mxkЭPkǔ5EK0![?'|LHF?`ﲍ۸i܀rjcUh,),fRU:Ƿ3*jf ^pwE?jW5`-ܹsA=Pұ[ɧ*ک}g,.wfRT-Ky–V#7޵#('l5۶X)CCRYхSy\{i\KM,eBT>%|퟉LHfMՔQ5Ե)PraҪ *-Tf,]K>2=&ӛ`'vnDRe0kb!F XUsN' hXO$nNդqV 5maT/k>MyXW/Q|6$AHoD TעYލh-Ĕ# =ք(q .^0s(%-qܰ}+Rx<᜸~5?1U>+gp<q ݩD=npΞWsKD҄xgȔ*to(k@tDO.rI#\WȄw~zDdMb%#IQr2 ) ťa'Q;&r2!}?V%IqMF{# F\.OF@F _dB˅T}=r*Aa: '|"o9--7gGn]0_KE}OIw]֪HA~/e[V?!LHφ3)Z$O+'QݚX1[no3]36&D떹YҠ@ܥÊ-7}]mYu;r2LHǛ͖9T(šS I0EJT=RJȻb 9]5l<7/<&a:-òORL@?YHfێ wo!gaB@&4,ҚgbLr#Ff 3MR997ػG1at_ˣY/=c9KgNbɌ<}/%‹LHĽfVhcꌙ,=֦t>`)m퇚-;`4A!]VhHǗcVL8 ::4n3[D /"voʮS8](S"GcF45f큳͉;7htԪ֥5ݰ[v&9bp ǖʱ})S)Y,ufd+]ߘ{bWVGjkӤU{&N=Â9 dB*Ҋ/_]m0Oͮ1--%4(‘"Rמ9ԂJDH1tlM5s+k -"A$ vX5`'H}NJi\m*, ',h_ Ll|bu+lЅ|bߧ|+-}ua|n Rx3T`ظwܼ qkU}Eӳ[=b<$.K |Tx p yJ]h.GbeһlOܠ̘Ikgĺ"䷟ǝw2c2GK+k5EbnS߇s}EwL[Neǀ Yrݕ–!-0ebѼRU-Ź짷.Np*%i3w|"Mr_(ʄTKD uz{ e{H;H t7Cx6IN_ -6㴕h/{ mo91†?M:!v- ;,f@%X2UVEJ*WRAr4' =8zZ'FV!4 )~JaY*(_֟":.8a׫9U*XRTjl\_ 2!]tE.ʈ(_=͊8{1)/mi1bY:Ű~D~ԐR1~5d-׎p\wl͈tBœMi3n 'SDO ml)!μ-3[(Wk1pf9ceJXQj\.0Ս9saJXdBTzA*TK/:O BzDXDW := : 3[Q䷌.o\U9,+>lY:"?JafK Ҹׄ3e7NnT[NZؐֈ5e Bnf{V$![)%9"dt]F6xfa{k %(wYXd9^>G*+DaS&ma\r-%"Oܼ}/o_:1B7} ~D2~(u^7maԨ\"u4Cf;vRk)eKCzx~#MkӰ9#F~=wm'¸&Bj֪͸c6%:nz=QRV{>tQfR9'ͅ}&:jwA6"KKNgƴWj51w1t?]ذ? apfbX_z]s#kuЧo_5At8naT_>*VSΌbrX%h^>OdB!_hXgdE,\+3l\}xad޻q9+g΂̛YsL̥oI\9+2wbmGτt5Gv2g o_%Ǽ8zJiix9fX{Yy_Kא<_cغfNS,=sQ!iJo]d9̙9Y W uq\:y$3s(TȄT,_@B@&B8dadȄ~re 2!Q0a!7o#R)Ea<7ᕞ"4=Xxttt!Pq#T ߑ./)K&/AMKKzqjj?+Y!,)l\:&(g1,Ӕphrmδ_a3 J* ºЎt=Gyζ;bhԁ3BpR&BLdh@]!!W21SC>%j罉q\:sa?_d2]5)YAŒaZpJ\'I !޾/w$< 'eB ~,DW&4Ћgl8qGO5{"SkF+Ҩ5-8ġ#'x#˜8eC9x#Gl8u6R^8ڙc:tlqpTt_Ea'ls1lҭ9* Cuxk8y0u$ItR&y]Jg۷)H5h8Wyƴ$]tچGpE]˻l'sܐ+';rǎpIN]W@PF-ʹ(j]+_`xXD6xysҔGQ?㑓E`^x pDž㣇%,'P!MNݙcGsT_M𱺪aq%S<ôxZѦSG o+t`;c%ueiզ FXɵGYş[;iѳ :ftЎ]p0=P9*Ѹ5 LҩM[c#x8\1ׯ/=v^ݦ,;a5Ej:ڗ={3`,I؟XQvch4l ,ْ㸴bufXlA-c/Bk7YJhXѶ}[&&lGY~-&%) ;&^>svr-ׯg׎]xJ!z+}f @媚|3!FlLl8clnkX9A/U{m~ΦQ& Ll݂љ)/U/r16aB|_C޾KPH.yk X$y:9sRyJnN+:m4!fySQ2KQ)#+qض1Wr$̓@?W>'AHEd܎sykt50o5bbY=;"¬ yŽݨf-uFLQD /\eg+mbB8own^ٛ@o žN#&Eױ01==8w m&y/$`"3iž!=vL@F{HoUF~lny2z6 IDATkc+jRuJQ GdBoQV@&tAT R B?ę憥wTU]K\ٱnOR':Qb' z3}U%$V&!5US_R۞;C*a;ڭBAKv?F%lD}׻'={tfٟhд #}0ih{{엷Q|!2y[ţF4]a4oY:},zto43֣tɒ !$Z/U8eK!Zb]BF}yʎ1-h3`.N=1x-OaL63LFX_;a۫'{uCoTѨ/Ggl†jPOegv̴;7d]BŰ;N哶$wbu2muK*&U{$Kדc|Jَ+s {]޼^ L'WN=fZ%D4D]og*;/)ѥKNl(4Ņ,lnKf0^& h;q//|!DYٌ֡КDlMLѷC8p`j~I^g2 QLNRȇ1Ɏm\*;k5ר9y vt"l9)%ӻ0j.ˌ=o2%]f=ȖX3-mڴ)ML VQ^߹RQ=Y5^ hbC.qI=SCc꘵!zp!(C%19"3 ¨]Jm.yyn}-Wncg ɺ5,Y|˓iɴSRю y<'eBEPxʝK:! BJe֐ cSZgfTkɩ$qaL6.B]SK2_&AHC!//wi2ɴx_~XSf~|26Ǎݔx2"Dda$s`>FEjs:v,8^Qwe!" к/^ݻ\zwt'm:nvs <gf ۲3SC8auv܎bფVwPZm-314oP~śt!5-m1T.Ma334mIV"N ϵ vgeBvްgFaUwދXqqN|"@ZKԐy)P3iQj݈_U1$d1 5c] m% )7ףި{3S,ExE_NBJ gĠS1>4^$ ?882%މ`20^Is&mE]K\|A}@ ̋R4a'ftUIߗʻmuAloûҰ?-N 7)ڛm5t86r==sV"ظ|Z:{ҩtmI ki#6Zv/ Anm\IxZN3oiEF(Zk>s ֎=eB(e HF@F{ @Y.CF@F@|WB:ubׅ~&#fXh8U`dԲ ]O=U{6mBv,HCJJ'_+?v2f!+!UhUP{uj_$o>kPyKYt3O}G3.*s/!՝Y>|Ds<|_xgΆ 6ɖg^[g-Zvw"6݁]Wvw"vwݭ(*qޯ"(^ǫٯז}X?YV4\&mOm}8VLC"Gω\E؜ܽɫ/U_n]~_Mђ8<ܣ/恂P>>舿 g~܏6CmkHnS#Bm54`;dz~oAυ2IHYi6vsaGD :,v+Hr~A'C* W%}0X\/|!^hXGpu<> <犵 P 6>8&`#/r('qK y(G/uIw|c^$AHBP 8 - D(3; #%:Bj( =\Jƽ@lv߮ x2f<~Q xKDFxLCsolw%c]q\X5/i7N"6k=&Z\.iڟk%!Y'q]+n&q7fx'{.maK9*NK|?Bʏ&ZIH_HH:bx0,?O{ÆX\ g̦C#$ӈŬkcD{wUS5T }&|r@h` +bT贊Gsh RϯM<IH_JHc}>Bxě=94O3 ?fىҳ`:{#$A OYoLy20t[= X-wk\qb{ q:|<83 c$2h0˃!e!{mb: u!^qR |7a)\ĦS|p[)vijpK|~_/ DCba:Vkh-ǜ#8r6Vslh>+2.=!x,>s30ҙdB{atN1jK4BJȸԚ1=!FH^tzOe+U{ 8aάb?.=gj+mIҜ]b#8UG4! Bz)|h<1l\{9kJu>D, /FքҠps"Ⱦt+8Iɫ^Qk]s:buM)B,S*iA;GC9kn]!}"6F1!]7I?CH"κ0&pLXr0I/Izk'y<}~0 :,z_K9nx$f ɫ_CnSLj+xf_;ܘw=g^qXGWȯ*6Bh·QbHj%պ tE<DOK!=ެW-bwg_Z?f"K#>$YGIH!'$-1d:BR+]pMK(=r_O3}#%>Rx:GOLDnZL4ݮpx&0ck$#Gpa8zr nѬQǶ6LJAcxBHDqƊ$Egy n ?۳w BRt{/8t*m fx^&b$撐z=ILށO֑b zVu2 M{Qί/&`fXӬQNfKWʹ4|33Rɗ0[8{!ݚcs/!XYGYu9\=s6einSnBʽBy.2saչ3V^ l^uEʧ?aަ3ߗ2N&H~Y_!`_YlXVeW +@Y1̜hF|opsh-L9__IHjY6Ll.[*mJr0[p+0++uv}›Wbv24j?>Ql+Bav&_"SO& J(V\Xp8i!'b/зdqMߥ$P%-3.$$gȤٔ,Zΐr}[Jwɿ$?FzZ+%SQ3m|r()"NѱH~)++y|\6nΰWKd\;- BNġ'Ko$1եl c"҆p/׀N&)dIH{t FO]6A"21=v 2uJ>v\NX>|c5Ԭ{W\یXy$M(fL$D*!mT׌2x`Oa~1q ![BRqs BZln) KLPVtBxeC 0q72 T8f;I 85qj>doJ%S'0(^s %<<`q%1آ ~@HH%ƛPDI_BW4}?!Q (#yuۂJ v\RRB8q25"" QItB' ~i$!Y:Ѽv9M{O* 'Bh&AslիؽiSrcS )'C*B@" ޛK0bj0gLʗ¬u;s n;vH/?K,=D4rgM)ZfƞcV\|50u|cSg v) IM:Iq\>nAZ4mj~cJ﹋pcjL_>*Uf}\"4!j=3vQLҢu Vetm@p @inlz:5NStee۰ A5F5Rmb뜺i]jը[ObE Ѵw͕% +^ %=DǨis{{^["ca)p~ 7>m="{ц<4Ɋ BF!EHB~! I:C"5B@uF&QUw߿۶yfx{g8Δ"RK)=}\ŨG$'?IH?OŮ%Uv]{ҳ@R)ZNrՙ|z=I\;5,|C"HBRNJ8'եq\stÇ-$G ~/dȦ 2,?+1RCʀHBgQwTD0u´5棤FeۚbjڎOUңKۣ+{o3NZvC/Gܵ*O~#}&W>R%Ig;Oڍ>#MUA./1}0wH~2a! J;pgwY3c$f"o^ҽ/gSY$!Y'&q1l[M/4?[D=Gq Y;Ց*5j` [._#uoU ~ñY/:3TG;MCHHJj&@pcA <Vhߣ/iûR+iiK-l`_l>[\R2ȁW<=^2rbؾRjFMI^ 3\BNyWB@vJrq։s✐,v' T+#9m.V+i q{6k2s,Z5!)eRP/]~*ݑ ~c#1,Gq &6.ȈpaMƉ=+(_3o/" w}fcJVy7.;ݼ!::@"嶒,׺% IM>4ce܁/tvghY: b.-4B=!9PA 2jHO/FZ{'سs ^OR8=!/b៥Vصm+wa˖\J^1b3mھ]su"7I5}Xֲ&D3HB @D@"5I$A@g%$I9 AazyH~~$!}Ƶѫű[?i+HBʌOKSLϔ1!v} ,ؓcfYr >*i.m"-^*˝<| ?;YWfwsV2WEMC'lbYbJVo[ĊkH$!H;>6mGRRuL:uoh*D#z #U Y{zzIvV/F*ĤM 7hȘe{KdrΑC8gUKڽ5-M9~&u\ziB"}}lmv([x 8?;Mvuɑp''#i^]cw&r:w f#Vɽh=aς1J׉4Z^|o$!}o?S_􋔠̍a:-rgWlZjĽہФRgEzgm q՛5ˆ;t%|6pչ@g;ƛ68 ^ǧ%/$IHRF3s`r+[?AH* b7Ea/kJl)GshIK5KFzHBވ0m4/VAv(BWT ܂E fl<:S>L%Y!YАB\ɀv6J{wG@w+ L|44 ¼2C*>Kt/NL~7v>&AxHNQ|DH pŃ+Gb8tPߘsQܿy4J?w|" _ chjԦא̝:Uːp9<&qd%DǙPS5b ;w/ŰB7Dlb{\0>s%L5Th 3k4nfk ܗ*ۗw  6E) xˆ?܌/f`϶T{'QE asy a6X4o/n%xym?kVX+侥 dfY$+۴E"2$!}^zjEJ/qnm09 πoP2 62'|;$!};,IIɉ= Z""loڷ2p?{[ %11W϶<$ꄀ$$u !2r NS?~kw$U`gs'N'Ծo$o,F" Μ=Yn]s9˗3ߟؘ2P^'p7H$_t1._Ϊk3Ҳ+ؾc$/k҆hֶ>ŐJHŭeV͜gFQ(Ԯ =:)8ߡWdaʕ.C|h;d[$PݷEm, -ʔe|>$e$IIF넆d}$oK A@>D=47e& QҿԄxo\Bč|~U¤=&}ˆ-PVNvPIhREK`MO I9${{Z%kt2RC;;YC|1CRi=7o\ܱ/PyL!&ԝǷnpunݵ;𣪓yȆns=?' [Hݼ㆐1._/ݾsw.-M axxmMڕDME:p# kDƒǛcʔĀhS7Nprq+x*C;ܿ}[ @r !' K]q#{C>k% o.bfChl`Hڍ9e!.8c۵¸[i2U$sG,+L iפn}]j`-$I[b̧Ǵ% %G $)l?2p+nwfpUaXӚ)^Wf"tx-:7QS2{4#QZ5EsE}{&+o$o*FEH5 Sv;+ nטUtx&ѝP\o&l1ښ:w"%)']KL|6x>0ZZ]fiAΞ=ņu8vBI@hPt3A\yɽ+':]̸-4 lX R2WӪfZYY Mft[^vW4:R6^o70Jb|̗{ІèYv_"VҴ‰h3!\?\he;%QL5km![S1c2GP,!BG O~LDU.&o%8uX"0P!W1Ѣ$M -;v m#Nr=9y?cÄnԮހͽtv禉}-%עJ8zCM25G,1^1q![:ƏaN޵%=):Z8|΢~-i=l=va:5K$!e ˏ"b$)u!ኒ"T z=0 Si8Nq3Q 5fz\Ű Bzg_~geGJVUH|lX4UY1*Y^{F5-͜amt։!WK*lmK\1ʛ4B*;Bz}]Zk1&1k`*!= OՐܟ2g3Ll>&W! `2}r[R]*Oό'B&%%(*O?G"Nv)_ӐuR?wNRZ B גEYKx֐Jf*΋cjj/SJ>+e,DCC/ˈ12ԍ PBĤ1n0[@Z(^Ykv/TGAK䔊Sxz0-t2~-*<3Yq*xbHy:'_$/E_NC*-ZFiH)Ąݩ%V L{,X V-=)\$Ç\t/\~A xk{ dʔnny" TBp!KMuYq7fD[ {N ܾKSI/ob˖-?IfkR=:<)\v`}b-ͪXm;Rb#jլņ㧉NoC͚zmغw+#:PE.[^l1/_4rSY,߰/_~~%!Yӥ _elyԭ͝'OU;QlY<55iP5Ӭ]O1HoF5axX5ٚ묄Eu(:5Ԡ>uҼh=Og2ÕCʕ;-(53fHڷEA3;6Nh/QgO)kxfc͙ hgܙ 'EjO% K)od4A{lE34'_Z\24q;&-ZKhjbf$o$o/UJ|l4~x>~U -\R;9ǂʰil0.0*퐌UDw.{WO3qPzvjvt=WX}J3̟v~gjy#U>r3 * oplݼ7~tnڴ7nqIfMĤ):c/}ؔe)\o#UsfSʪ~Mw&nbFf^d# )XϧTҽ+lѹq!_Guf ďNgm߁Zm( ImF &f}ya,14kފ=2l*lU+lvaB?SZtbہ96G7>`"l1!PG$!YxAǂU6ӿ)ETvtK6gɐ ɞtlZ?V&"..C]k\Ӕyʭܢy).HB.0gCt)]nS6 8ą`UK6R[Ypr ýиHl7 lXW(^'K(Z ?;Z DyHIHj/\NK%EOqb|t(iR]6CQJCv-Zܧ֎J`ċ(ٌe=ٹ~*hp/fIqfݫ"4bɉ3l@GV=W*2 qz\tƾk^, Qm#֟k)\EћΉ#(m̹ԬR{$!B-R IC2Ȯ]ۙ0Z Hⴃ"0`Q<fhKC/-VA:jk̖ObX&={ECG-)d$PQ87Yf}_>՛ꑃpLmT˧b9"+gcn YӻS;z4t\B޹UK>$On+ K"t "~t%-k "Ӱ8yhq&^U7;g(Gi1ևRm _/Q8zM$!Yl% eBդ"ƝcRT%='1I̜5Yӹp_iȈP 6:'g̲ܓa5\#HBRy7à l#+0\~oss VaԎ[NGGF!qQ56Gez؛P-{咿'32) #~_^ӳWU1wF{v#'DrV7ˬӏ{lO╱#,x O# ')) D '*ShjQJXx SH"\Kqb"I"[,",xe4HB>V2D@"/# _X/dIHJHe$!%# )X}ǔ)z9qI^:gw %Pz6mѠnia^%.9Qb5>ZeGڢ]\KЀU"Pbr62FtBv-ji7dtC_b9} mLijhD}?- im ~8ZDOֽ2lA_>.inhIORO)"B|X=k AϠ%Ɲ8wQ}Vlt+&WkȰ%ͷ1!]`yVHBR\?өVS[q5.ߴ!<*uUU0z͘h& k]>V+^~ػSOkKcxGrb/Q)ܳūuI<{xgWгr/Ֆ} ШTf-ѯV X7˶e/0!0f4iJp`I]*h4bEݓ%r{ #f4nӑs&Ҿ&tMy袒_hD#شՒK7$]Vy~HBR>ase#ڱ{![ 碆RE,:tHκ;dOx(|mgF1d3\SAkH z6r8z^ >paa~3H ^Xz)NgKbP *5m#z'G H|9icix]ZN%z*ωШ=sR ]jy.HBR$GW[h9Z1sт-塭-ⴶZmny d-/WzMr/1IҩTP>tM ))`cfI{t$2& dy?býg>Zժt ù, &;0._ٛOf@Q $?]Цx):NXiנ?&RXyyf6K i{vM;<|,9ǏC@ҏj K1|W&BO(U>&&隩)mZUv^DZUFg&j1oŴrԽ5J%0Gs BMm۶Uaв@Md| ql\2cL*k42EM[^ Ԥ#2$*Td"$m0.^cE8Iȼ_L=v\l%!9  cXVZSW `y+Դg\._ z)svxve. M]kCP;`7%n\̥+׹l]Te(p*o\1IodxKM*XޒHnw"9͖={;غѐ{D=)X=e5Xۈ̑h̬-'Tryr!훠ՈgLEN͆bkK%=Phb2z6nDGJڄtJJ<81XNV$%mv1cK )i?Y&ʝɇ/˻*i_3^CgSHNFYZQ^?'M:+=İ"ͱsx/l-CQޒC@;$oRRUXd> lZjĽOd40]Q;G2&@9Q$&ě 0E53DRo4ljB\7g͇ѠGڦVB2(WDiH#!Hz_OH*2cVwǝTB*=&11*E!5iMt+E)Vw^IL E!HBGc$!}ITPC2I Y4Ӓ͗^}$CHKĐ`9Q(:؃= iO| fEHYGPG1.?H=А S$zJȈ$hu律*0nV܅pVȢ? 7.N>#=z)/K=؊9ɬ6yߺCcP10 1SLj;.\V 4a 1]K)]X= M9m#IH_2$$v-ZRӠbҜey2y#zPHY֌9uIqLTs基:Rb044`)7n@Zzl:4LaV""悎=eBڍ(I9)_$u/Jv}|L(. {ys?w.Wvcy̞=;9w#VJJV]>7pK &|R}Y0 [iQOU/#G]QrrG/-J uxbZ͠m6Umڱb^pC5vG…Çy㑽_^񿄀$\[Ķ`|G"I.J>|/! _g(6%95%mSl6!$8@.JhY)?je_IH@'ޯb,YSI–3(7>+Y>eNit<//' `~A7ҭ[O[AsSئC*Wn|ڮHi֑yˤ2Ԭc8{t/DT =6APzL}ݻGC We׮?sV2 'O# Iͺ7$țeqx*vY8u$ysA'[179ȍaS&A#} Tn&YhL"Fw3AiK:oG.Cf@۬?(PA ( mӻ]CRFUF$$PTD}ǨAM*b˹$a}z3AVE ikPϔroHBw34rbت *hd(!]qd\5/Tc{ CbY6<'"\YВy*rn>|sܼ}O8y !%Y0FLl$~(Q[ȓ3'M'$ Q8pf*G>c|b2;&WўZ=a_^d$PB|-'FmL34 i; RͺN3NԩǔWVvԎ-ORodo\~-Ðҟ*߯9uMqSps8!wMB2 ">d5kZϊCﳸ[7uS EB:dS-??$kU5 B>#yҳ׮B>d@@R02\hHsb$jH,:sxu{)yrI7TC6O8hEt!oE]x#yFzX0hN{eQ(yt*{w4W's9Y?'2)W`X&5:rvzi+W. fJa??Ą(?Hs4X3o &Uk9qn|jGM&^ ^nO? ;uSQSkQ:ZEx#c6-#"vc:-S5+ 1:0}Jenق-2z3yΑJ'ۖ1WZ1auV.BKUh{֜oMXKA)ti 2E pet0iE˖7jj&[L$5HDr>7H;u!&̇woBC ̾yhUmĜ]qM8@f$!e'2UU$o/ϫt61k̛3rsm%)Y;aT e*1y%*Exz(5+R[ Mad;Sʗ.өC@Fm^joCBֱ<75,Aޔ|?!)$D)ssx((jYBia0KUMTP@OAy+@y3üx|o 393wι3w}?w}'#d=&,WV"/R=i=%c2ŝ"Mwz~ho[\l dag#a5K:t5r30}s Ϳ7>=Fj1m``:;=q#K>E@\ j+c.3 x5VGf ]M+$hwTm[^&tÔkϵwkmkbHyAd%,e\Yʧ"hxqhQ@,v-d3p;:qN69ynN BcXs6zFR5-L@thnAnT@aBI@ a@R$==Lv[k5j ueL%S:llq6:p Z4*|p1i|x~rJ+ @Zn76KݐQL#=]h Tw.Iyy9+셌o֓¶k5 ڪaҮ } a^`(6vW5Qpخ`dzkF%k@4"􀒆Eg5FT>j {혏A`8,;b*xD$yip cD]RsHs8c,LƢvz:Jב'꩓!Ub83? y o߯.YN56-0Zd㶟7=Rݿs Z$DE9y ̭a@2|ab5cDg쏆BBdiC:J:uG'Y.cc`YݻDN`:i$O!+YGo;vf}l] zO<I^ XH D׮FhoZf6кiпirgӰu h$q tH} hŊb(k4V\zx ^kk׀N);S}*!mG5yAai9_~c\ϲGЦR=Zu.ʵP40קSJr$d5f 4@Ν ׀iaAgvZ%1!9S.+u?x (.6 HI oj`*V˕\ ph 0!RI#"?}Lʸ!u'TK+uuml99wKq 6Fa%כnX*Ab%yIxyh>?_}э *<1.=J:xMJJh;vyYV(q{HZC7Rq$Q{m` Mttܐ@?88Is\b 0mY4Bg-ڝ% eY :'*GDqC:}V[@zQ݊^Lsz bh6)Qq$DnntKoc5j)-Q"+=U+=V:.CHH:eDj gCNbݪqkRNp q qSl@ RL(ᅅOV{jLx*FZ[l7~1Pjۿ5^B@LUxo@ {{Hi$~nwp׆RN,|ҢBZhh|1.D#^#8$ѱ ɥ3Wm,Q2,Yl8FBpK,76x WbAm!Ă̋zuwkOSY]7&8jRI!Bi5mIa>|<9`>[ iՏsԭy$5%pH٘qX6أ)I 8;YP**[78UƭG`.ikg8|_!K9_ g(})qdIN~"i$$F͈-N|Rbea"t]aK#i{3 Uꮱec'HH2/rĠ< Mx\_a+*iāhciQr-L/888 p qcc|wg/޳{k$KI|O@d%j5$kI֑ eV6і  P3A Ɠ$/37;?@IENDB`fotocx/images/map-location.png0000664000175000017500000003510515247006660015372 0ustar micomicoPNG  IHDRGtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 140 270 1 0 HeXIfMM*V^(1fixHHgnome-screenshot02320100fotocx-24.20: Sharpen: median diff 2 12 12|fotocx-24.20: Rescale: width:270 height:140|fotocx-26.3: Paint Transp|fotocx-26.3: Copy in Image|2%!2=92'3EEEkMeu:𜮭(/}^q%>}?!ݡCCCjh6`4 H2ADR*[aՉ'.i LOEA~. Fko{'O#ye4'%8j' @ZT |73-="x Q $pppee@o{ZzJӒ06$Σ$Q ˨>ql{ɟY~f ~ɹ0LxmI ,jy1F@C79jdL]yW)>&!sﺿ5}_ (dvE2R7 ڜU_HFFXJ2̙5 }=$;ESPOsÓȪ9e}kc<1w&4q;rx^<{&+\ w'~ aQ._E{07Ji[dm+;IQ8aA4ٻPeGhaJl(ƆWZ6PT3!6!SD$ (xܷ1֮Y MpBi(S=F"td=h1FhQx=~|8wx'6aXn8 [ ػs Fm8GIJ^vnƚUa߰l'U/8k+׭իOhh6HBZa/+'1݃ ,ka g*%;3gkn*P&7@_j詢.2:tvxq7BV^EVc~^AT0\8`-e9+@]KRP֛O- Jq\Ffj"}aڹPn!++ n=0}zxlDtФ!`':KIAJ192]ѽ**''YF^C&{TU2޺PUU"~u+ȝ=֑8:vSX[[խ'++OAI ={a˶-p!e0} %~0pBM QE0; So]օѝz{52 Ǜ0kdpk~"Cl.(~(x,v`OXd޽CBMKzX`˜f˭`&AZ1F}  8${;A[/P6YAnV]`b4Uq &T[G8ǡM~5E@V>ғf5a Z7\OlGAkX"1*· ջN!5-I:SQ 65 p1䆭K&Bg>b, &χc`]1w |#31 -D'%,1ه`{c㬕=]W7}U -'p}ܾyGjCpimDbHt"8?c1:ݷ:^ B5[ 1!ariI);`J\w`ceP=8= =y[1kiEH=E` )Ʊ(!a9T8cvR㘲8bX-y41 9 خ8wa{1#GJo Fh5 W.]hŋ}r%d44D A4X&N/5lGضM8xq,mØ!}UFZ`Hrw"^wbԃJCVAfUw;$=eM+Q_O" z|xwΈ)~5?ǺSGᢙ! KMR'yb<=duՐW V(KĭS۠JZ3pd=0m1yG멖͛6́t(Rmw]g7*t7eL]d0,6:Y+ ) q n1@(*j6z,9 !h&>[.Z'.X3c3vFjlnH*=I5*wOG:.PɸL8&&3gjU«K,VSږ=6bmgsA^8{dFc5ضk?#Xfd&8z!2Vb#[Bk+z6lI7&@8i= #;IpPVx'?M Lk4>qE X>esְyV}YcȨ-EP:mM=I^e[D֞c[/u6hXB=P{Oс8j R]0u|hgI{׉n5!_Mb!ݲ33`Sا=##=&ku{ ..A)y*^Őa(E|SL-,@K[ go@) 3(gX{F '/ 5/zuiqz#V脥vx%^7`ֿ2j<+,DaQ)&0d'E!$,Yqj`Ξ,}Zt׃K%cK!evT5еrx^E#г$d㑭Tqણ` zb$`z>}[:uÃ*b3VmA|yP 88 ~=azPvcR6@,X47܊ W%2U!iPz0i LFoXq7Z^#>~Rnڍuy0_6 :УG(+ 6+@@z>p ?OTX1L ]sB u@K+rǴA4 Z1:u 9t.4E\qGa>r|TbXOC5P\!)*FhSu )./ ¹G',[p QlۃZqҿDgވY㴡^dhQpag^8hH^ y5a(DY+5_y 5˹p,q$TϪx^ 8 8Zp̫%|kj|ǩA+{ŵKHEqy$ѬJWx4bP8&8B`@0ˋ}:}`r +O,+#=.Fc/3!y(-+yq1WL8DZ0r*Fa"'m̠=U(8kxD M UAS#ZU?y9aҷe)!1:1l~䕿!U.?:k7b2PE"+~hpT-O8 ͪc̴Xd ΪTͪ CFOļ 1zV%)X>cȞ42R &v/> {] -E(+̬U1'L 0*51ez +(Ʋu(tQsuh {,-&~үx ScC!׽[Ƙ<7_IْKKK iCFV1쯟[q gkص}6m^񻝰"G8ۜplnݹpiqG=0u 61x8] {^|5Kd}f:WA8bn3R_#qڻ VN(8Xo5dg/`q9<ŭWF- q}͟G.LuA*xs)w* K8888Kh p˗/y2h7:P\T_wA{'eSr^IS?, ֞q7/8888884[884[iDl]ׁfWf+ [W%ׁfGJ6u_wloeЮt=t 0˽G1ڛ G{3^8888$\-V~!D_8DZk?ݴۇ*#MGK݆KsIDATaXpV݀+v]c#%Ƕ' y`tßvG{Wpco _ca }w팮JI6Bh{kܾ%Ur]9yMKؕ187֋}לsM##TqH@jJ2"Bp|v|%rpokopT~&Om&}8z&n>@1._^Z_OK6~^s9b[3SNAEYnƠCp e%8oj}qYU^J2oGAi1wA_M#bOL[lDoHĔc%5s,Tz*e;:qIp DJ2a~4YL|ƀ(8^?&Wvoz/^B ۮ? |<8Ƞݭ!Y CKWq15 m"] mPyS8;bDJ6!p8XN[AyE)l2T7غ"<+ ipK3qalt}a G=ed"&+C^]opj=1knI1~Ho [l41`H5$a ]a o6@xih6Jܾ48ʋ0A]T7 ey<O91Z+N Iat2,Gpl[ ֶgy4̌?􀽋$<~/}{CCUe ڕ~=hp݇.c34#i>sk}_  0P+8,ieګyMH*8g2 Ҳj'pTyexbw:8 kû l#j߇V- Sy=!-6k c922,{Q4 rfm9~<C&̇_o@S\ࠨƳǡ=gBpZ^ŸdF QIiR=ض,u7tSƲ`xlpi<@IynZnJX(?yWc} O &e ݰrjyr3!U9yՀ*#[jhc?yEp9r0rDphl-xN^FFII= !!VN)X,boqpey8atӱy~\W/А'F,]Q-O{G187hCMS Ꚛ#$\炢RFrASZZqX=|b kLT°#1a L<ʪZ8uA8N@_gRJ hf$+?%G,Yoۗ1:Gzuy\1#p.M!2j8@>Fnz,o^ %-2PPꁱ+̹g%mo{hp0c*IGLTEaDE_!e(NCtd}xxQXgYxr2.k1HLL@ttrrxDDDͪЂL5YBYlMHjBlu=hJ69tM8 Q Z3 #毇gLFkâQ/KJKIBLbqUO@Vn^_mZxk$bmPmsqa6\\ǦUs)BcW`(!G|.R)y>uaIm08*57K$Ю*!pmphf!:"'.vL-rބpLMDXO\R#hoÆ\n_8888ڳpcz%%ׁfWf+MK\~HNҩG\[Hz# 495s   4G6N}BE 3ĥU o$ӒbၨFRvdpp4Wсp8X`Rq Yb҂zցVXm|#j t1p=|҅98c䕰x'DI4 rYg'GuXV[EΠ6^(+ANZ4l[ u~8pZeЈ__G$wC5ׄЉ8qw8`+4TU0q F`*AQ:r()bG7C}pE}p0eE|$ԃ%yp1g'VA>8 pppHpH|"Û2/-C3Qzn!PUI2Nn J80QHOl; 7@XB_ MM]8B`(OoT8GP8X]S7 1UO PޡA 0v6zC#rpp|"e={"! J2П ťU0))"C- =Te0fa1!G=KFb¢عǮ )7Npj´U 8h:-fC, u삱+vbuSy3W1KGxa襩M~ B2XF{#GvVP?f` U{WA$ק& $qϟG9X7:Vk{0p`%y%gD̀HY^ ,,%-[~p4 ԃMs/8qrYb1uYLP=GV?l<|94T\SJQQ>514Q@?6KÒQPF3( #&מ cᘾ Bsp }U;qDI({T- l]v$dVk>K))>מ~'VrLMI12?Sqp4PJ~7(jg'! 3g!";%d)"wu{b"Yo=z(a蜵WD7`Ɵg;ػm8|<kZ\8n?Ӗ NNEx58jbl$@KNsȤHb|p^\u u :qoR>5b:6U[^FS ˛kzL)[&^RHF\2aCQ?OvofN(Q(W$qp ^= IkAoG0?%&%NIS>T: {N L%<8B Uri=et)\zUI GףE>4ȡXy9-B"'yG~n#);?'jY{թr$G>ˁ: [zhQl1p0/"`ļ_/wA[zp{NC~hFjvyTT6LE`hЖ߽=ʈ,yDG &,wc'L6%r l8ycLo^CTHWrpp3\fhlveEm+wF 91ƠYyf-a`?{@e[{ʸcwSEl|l -=_h ˓MRȇ*P$BHz~0c ?"M~I^,ߦx1x0xIy߷ .sppp4M$lI%y6vha6;~Ԙ!>e$mo-4?X=4V~S?gD6O@IENDB`fotocx/images/flatten-photo1.png0000664000175000017500000012043215247006660015652 0ustar micomicoPNG  IHDR$5ہtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 262 324 1 0 fC:eXIfMM*V^(1fixHHgnome-screenshot02320100fotocx-24.30: Crop: width:324 height:262|fotocx-24.30: Sharpen: median diff 2 14 15|fotocx-26.6: Rescale: width:292 height:236|2n IDATxu\V>~''@TL@;00k PQQP6f漿׆gc{׵XZill_25_B d.۟Q/P6z!)_ClVWW())QUU?Y,}O|Y9^|ɕsTVVl@;1$> }voPXPPޫ,D,1^WWǁ-,,cϿ/?됛0}!_H>eC-`f1i˨j;z)q>l [[[l}w3lC ?{S4boCYV de`4vT?@HH5j{1~I騩 Ku k!fbڶb!*3w u`%n5 P[SSZ}e ='rmT4tW懘շT-a000Poep3 qp<``3'P@;$0;{( Rcc=̇ f[ kOpm`Xr3 KQ[Hl45MД9"+Nu")2T{"(*KK m ^<)jP}!@c!'#%[T Ҧg>(S$JKliD1j3.% 8'hnn~[iP4#LSń1n/5]Cvյ4hJp6*IAVV'onf# LU9_ߎn#*JrruT!.* qiL֛;Q̻< !+)I @HD:s3܌hl4$ƌcS;lē8l_?~O|ZU{I38 u;C=-*@`3:&w0|MG_ZF޵_ķ#'b3}j}BKI49(ia-xzViL U5r 4:2`'Me IHTCs$U 76guEa +qr+BNJǍÏ#FbJq q}H&P_1ȋ꜌u]#NFJ+E<66ѣ1bXhYORꑟAmq6TL53>sy555#كpp`|?1ˏwOMMҥK!##///n{zzrc~V@&@hNL@\\ 93HhQZ_7@Cbڊ P4tt1EC "BWӗ#T.݀$YFLrF/e7kUT .)$4֖ˎnsORT'a07iD O$!iM\h+8LrL!fd\ Y?RrJSP aE/pz FHIU=<~l.?$@F!THX:3 #-K6 }1H(^r4]eR}7%ش"NɊR0Q #: ɏ0SK 9sfcTJK HyYO0GEE9Suu 'yЗ@ďi/ZQ}+oܬ)*CYQLT'a„QPdmm0Yy rh1@& օ9#+܌JBjHȈdENF$TlP$hb+z ?2PPR0tHNSQQ- Fz !*}>^ek~lp~  ,-HQQQ c8;[20ܝ}OLL|<,^<>/ QkiiqCm-*G{s;сʢTRB=wԄ69-0Ϟ?ǃDZmi@mWNCW#bp',% (x3!5/NL\:鐒64@{vvFJS.@(3[N<콣H,o/f>O]ݨGm@);h+HBv%Lp"@t?/UP\\Mǃܺ5E< U1&`#M#fjI tn$Dl*CIǂc98-8-!7W{A0P2}EfzXpi%HKx_yDaiw^ ;"f, wej3qF7 ,paIiI/PP0Ml<Ϟ=ÓIkFKu\▋W!% Kg(`T6WMPA@rs:*ks3' FZO>gZ$68?sÁo$}~Va@rJ1֭T<gHs̖F+Vp6 v8rX@jiDܓ{_}̧@݉ S!ɪ/zqjz[k "$ [CRLsֺ!{6oD$ڧ\ $`2ڸ:vn IpiH3lݾ#f4Tp2|RxE$#D8R%Ġ%}3/~]&Fo;OX95$@.[@/^\}֬YBPP֐Hi}\d ET\*j {5$3Cl@G+͌gpTί .! ]2 4\S?"IFm *{dR$@zƺyz'Sj&4448_>كU46 )z'ߙ=KBtH4?~+Js+wt-9*p{5"3Ojsbȼ1?[{ %" q5-pk yy2ST555#JHT:4טһ"J0ÀTUQKgciPƚz؅ҨE{[H"brX9-h/sԐxexFkB\9O2-#$|LA`U,\ep}O HaAz_wgQMn9,3rrrrp2-cFxwT@->0;;${ڰ\6yL8uU!,x47ḍ9s|%l{-]dkwFl39`k7@GZ "x'pi6[W0M$5/ݠ7}ʒ"=Gn @/eUQzY)OwXl E(.H(_fֈ-[%\_WK%jBXFa}لHm|!2"H2"&NQTC0z.56M(%cBJMW"[/H$ҁh]2 #h LKd}=0;пGCc~_o8Y33sH $Ĭh4|`#4X:tQf;plA}gi}{&ЛWDZxrsoN_2srWƁ4賴yˇw~XqeX,ky۞qgQo\tڈ{Wsl}Ğeק %oֆ͙cWg3^ x 783̡̽ K1{W6VvC9י}g{}uͨm{e"L` ~v1`w6p 7(KXzIfϗ}f3~Kwȫyuf$> 3cd (f4[,oˏg` 8|L_g^ޟ3 Nk]|x__akI_m+> H|jdH|ajϯk~ap^Dy 2?[1, cy{)1_6_l`İ/_u_2eH|0OH|jdH|aj|y K$ |52$0~5gg~_^CėFƯFʗPtH|@W#|@ W#_zv54> H|jd` uӱ4x}gw߼e_M%3ls=/FG ntB {&&=;hg}\{vDFL8J?GAǴT!s?_>ڛK}n?tutct7#cL: ˷9 1K5fH)XtٻD 7hLZgT6 >{1aʸ]sp27SP(j&\#%HoB&HZQV1Ƌ#fNVw$;27#;y -tu+n_Q;u0b`->!t|xPW'ü(WPl2d/_)3ICF\Rj:V}E>v- }5ht @^qTR;^ᗟߢ4;7#g\amf!H3cnn,off^.QYgu5!anX拰NlgF@0lߴ|:lt zHvs ݃'am'*:7aǥxNGA ډx:vӚ8Oo[ET +8nVUIpt 0[mjcvv[Xb‚h9vtDy˻Gus8+K ,O(N8A@e\dWh{b2k,^b#LcHw-||0SU{n9>z[ʿK,q+rJ9`-K +j r6VS{ƢLW]M8e=nӠAb\tz 9m_s'q=V];xeYp?uˬ-;:с<io% ##)OnsvF2be+k&뮰D`tW*D-"3j{Kt)Smo^Ҍ+8{0wtGIEw3|1 -~kW=3 IDATtt{l܊Ve>Ǯ冘4v$ttaJ2ih`[`*G6Qs4&%fƐH6 'Ԏ I(f@DVVm;\\pԟNmmë6D>5i:Y+bJOP܊h)@\V +6nr)a2<B@:zqCUAk*D'#<BUb<&IJc)=!J'*(\AH 0qg -K!.!CqTFUtE0Q@f+a/ *ך [EiQQFtnvObugaCpt.UPSQCgPPUǕyq 48 : W?EJ?y aHNcM;]NрTх߼ƓPT߲6憐CayZa"n:)pXR?]~Pô4 = ;l-MǴ9k>'S:Y10_[ 0^'IYo78!,$LŰݴl)g5O'_7 4` Ĕ5Y 8 qWp'7Y5G:.] 31vuTl:-gujKǠ(# ۱M &*5{׷( u0YwM.1]$⁓WK ر <'y]vRL4y 7DI<@sm(w8 \":&I -,ak ANaV7CaM;m=?a;Z,.1TtK dl?Tf(qNd yͨ}MVs1y77c$tf2T,5U(/-cHkBMOBiS}moNT^Fģ^P>K:Zp|HiLGtC֔us`uF5 e8jK$35Rn8C[Ns^B~E=h|!=7b2/8l aA1E%켸عx=NvNF%FZP&[[c w;=P#i0qN.A|m/R'p?7f"&Ik 2d+p|ra'+tE!>HxҀn .ǥZ+QR9Khy S #Á(mÿ 1bl6D`LU;X]QL 5:QqvUtVB5P{ٌs 1i"v]|:xc3kP^aںrh#GF=1&;a m4S%| cV'zb8v$LsKIӘr\؅yС=01YH^1xX݌jpg/dttAw?6,$֎nQOHs w(ľ1NZӆ^@:lo dufY$-UL+R`yt6̀_d"ю㶘4~\es6q^<2;Ꮺ~ېq2E1YR&\%hCG?^=L sEq(hHbglNZsJ_ [Bh)xiUj=ԅC$`zLqW|4SHlE$OaA~d EmkH`)7WL*IR*8p)hn.KHAZa j 01?E]^[+0i~2!!)I$$$ &.٫ѼwGH'cV$a Hʒ8x %O֊XL'p)QICkOzo^5ޭS?Q9 w#! I)޲SY ,7ajҮ3 (}mYmY}?ZNi\ T\8qIeߺOP'c(<"Ac=7rK(a.cFa#tEOaݏi@PK+=) h 3(J lxy]Ư~3;K&%׊8)wz֜822y|l$sʳ5sExr>h:):4q84 4VD$DMCVׅ)+툿?Box; i'0 /+QIR!!#dUDGn#/2SUVgWY^ǠKQ"tHit pjW=1ܞҠ*&V tfyiUƁQ;g(T}ۗ"u44c%@@J jRXqʛ9f:1ű\ ^Sg]=MY1l%MM-'"-gA\ Q)Pj vGz&x\x? 5%P]i"mejeM\- B1vQ'kH?w$@x.k& h-91GkkUcdy6_6p!E֚v,+y<"?UHikVe| 6-Бš8UL4XH 󅮂(GF޾jžCԅ :-9p7fja/)b&%b2pē|k/:-7'3:kPkCm&?܂! N[, o`[Bpj!%?ͫ1{)$d e<$ IC |;:΀? ^u|,FOFBsex9jbXu J_݇FMdF8jAXӐZ^bH(jH$!-5 Q#%fܲrZpz)Yt.z>Ғp7,iCFr`2L6FZ!z'UCOz<$uUݽ"=fBvr~bGm= 23<?!' &Ad=AiY )fZ@mс{</ lCh ?GG!}pmԾ  q82EkFlJerFK1q@u r d`J\>aJLS/KZ! !rrQܺyݫ*MGDPrw&+IN&g^(+DLx<Bc )\_ Ha#|s@wJ[(ϋj1刄B݀)-ط02}rPyQ:9AOh\AaCߠhn(æŐIJ[gf-4 Cr~!9ۑsSC̝3 S 4P5?j cQ:MBƆmOw4$Riq|; 2,V0gH$*iDȎ&@=Ys,`؂"hvE-" )ҊfXft&+@FE^fi(Bw1mb|L]'7\!DLu&I%t8 D{=$eސ^͍AT)m>rVl5;{:v% 1f,tFں\D5`K -H˫h|̜EU l99Y:ZhrxHA߾Bșd>~FMTsƌiZLhsK+X,14-Zt2ҟޢO{`/-voyPR765tr<ΡM%2,WBӹP8kDO$6lJ~y1GS?m 9ulGt/уQhޒ*̞Zs%q("M$Xja%Ul?1Bn?d ~ O̲,"};MuK#4sV]I*m0*,ҕ< g?boxo^@zՌ8vM\*qa<r8u o"(=|h- [,CcrRcq 'rE$^NⲯNrɓ'q . 04l\iJԩq HY ܡ*!r*Ξ>ŕ3f*hnN< t$0Źv%(g\p#>ہM@.TTooħed?s/*ykk(UoO' y"DK{OsTgt#eU5ubMaS Hif \pӯwm,*n,,y"A4;V~$C,û7Ք " \Μ'8v+\1BH \"/gaf<."*-?^ڼ{ce!®RyiU }P;롷Qҳ|$wo 6=kYY6r% |Ϯu;UyTkx!r. :!_Yhs*ܯGWsψRc ?pyFK}Ғ;1sֵ Qw R>gENB;ph,؊܄?I'*zg_:? itq3NAFO]q `{ڝlK}2tzե0¨ 0\FCW{6Cˡ2^gfuxѡ END 83qaͶDn:);.Љ vDO{e+iw:%'д|3 w|؉[!8nA[i5-B m|_Yj`9MW7hX:JnAEBDQ455 INn!Z}mV=cjEs6 /\("֯^/zUdJ;{W֗gX[-'F]9tturVXB̕klHdi3S:Zs*K%%m'Ƽ Z=mVe*r24&> uJ<~&2:-vn1>YC7V^DqճK:b9EDqv5)8{+ŋiy N"c3`t /gᄃ`in݉ĉMNS skV.p_d`{^r b,_Ѱˠq_ m]2x 5֖ft `q;, 0jP68v"bnֈn@{uԱX\VK R }nn՟A܍u <~I{Z@ iPiSګeZn=G x`6qt+R-4Vo؊c,rXCdn_-~ 5Ԕs]FOfXILVC6و&[u2Jz&Ave܃&In h(Jb4X# |hV DZDٽ0,KcƲuHm=fpI¢Xah齍",B`d<'85Eqش|E`d{c*d6\F0 b)I,kbq,!`@)D"AhN hӥUXEL3 *h7Iƪ|,Vl?|4Q+"x'8w<,Yķ1BG[rmĺ x& aTYL"yaX,?ƞ2Vb9ÌKΘ q8v &@{h_qGw.86E8 RI8&=pp'L[Prb̮I8ڙkv_ ^zn݋W ee1nj":JQM$j U>_ #N%68A,GEېTf,"?|@nH 8TBJ8y;鱒4Z(,-G]M)‚O@JT{/g#[ԑ'n=*z !D%+5Ψ$s ի!$`\%nG61/*f5}*PYYI{ʹ ͩ8{} "t:VmGьؕeEC=2hDPMrhC`@|-,kډU=hӥnmJwE$ NAa2W#y=$刽8QS ߴӀ[&ƞUi`9;!!$jbfd{ -" -}L _~ERSu%g(KDF u(y3gM|~O& H2*2rjڣc:-4jh@bi'!;Ό$ IDAT0U Ɩ3'_TRRZ"?ke5Eīrdy;b*#oڀQE_tl F91+x }xxm5QBxw'Z GЎs[!+.__ HҕD'–Ll\lY 8\g8 C&LHF*D)/HM%6ZhJyH+ړ4_^b*kљbDۀ&vp\ M(-!Js1(a-9bLIEG(jhq 竮vЍvߝ|;'1z̬fb[VD,d W62V/:iL"쀢>A0ђ(d>:eA- ާe8yp%U^'ם ;˨eL^ DLc=LFm7: ![1u|xB8'۬.|@۾?+Lj!'̤9x^qqUM'A;H;ϓtTi-D~) {cLA C8 ??zI<1 ;񤖀lϦP!~aAL"BwCk[m{&YĿRD/F" :]} &aԨXuW;؀_a?b#æI㏣ͧ񼴖LȾ`yV=+:AN'&{J%&@yx %L1l zUS)gզ#@5o@`>f FDz8xt]-w\ ExR0H?|SM Nn]Llc`e?Ɠ&Z{ɋ̜DcLNGp! eĺ0"rr뭳CIC*u2 \ &4p O|d{:QM~&l#X@ZH9iJz<'C 1cloH*e' b|[] !i0"% SxW 9({97PY^(ن0TÀש u'˧aNVd)F]0&(>[ ߭ΏYt҅:y_,?"rߎI#n}e(@,5P ;Q(aa^3:.|Hr* Uea:DtlBSQD^)njÕ([9+= uH_f)Xy--+#h$Ҏ*|@ }(@jyJP10FBUבhmrPZRfFH'.҅̅ay,*GjRoA h.VMr' ti'LZqP|ݿ? xQ63;[M1k=EXM'j{Pif ((6/-ۺ{qˤa֊ \Vy`*t)6nX9ZК9W5it[(}yLian6ӈo#؟Yt7hl0sgCCc N\ lXbQ5ttESw--L I302 mOVkvӞuHjH> C= ́7-(Ȋ JWj3_ zПpl]](QH,|WҴ0NCtj:l}l Blaczc,L SlNmɇש}&PҞ>NȥOaFTkC5NՃ0<^ hI `syՆЋt晔wFOGrB(aIp"eT9t.fJl/KMc`il5e1-H!i>OA,K`MJ dWLT [Cy4&C}tHzP70=I6ݠQN,xw\w@JzW&q8Ν=48!04+ NNpr:wo?$dٶv?'GG8>kq'!"6Gʳ"B9NpΞ'çqha6deh)Ɲ+18q|H'WV޽хȕoTĝ{^Ȳdx"4枼NZv?SO'zЉIJ<9h$鱳qO"pX1ocuu1¯3T~{_Uu7Q5Xpa%hp!!WNw~nc$LhVRu}O{v:zvlyT5KjcLK/KBjl(.T*,vCHGfI^St?.B/i܃/E*Abi!]̆6OrWuZ9ٶ!)sv:]k)qT| a"d7{+$G6BÜag\ljN2& +Y.] 0i6DV@w<Ьw O(dMa ZeUT}vQcfEMH.l>RuP_ (xpw ݋Zblw6AHURvmҒOb̉"̕/Ӣޚ~msח=>ћv="#+x\M;ǗmkIQ!^<סIH%,W (rdy{b0􆣣 IJTBi#]"SBjgEaJ,&^zE HӖ1cBLr0q'}),K早w_Rޣ.˲ϟ|@Bx\퉘l(cMe&JҺ# k5-?SGg|d?׹$$Ѱ"΍J?mAĒb7釧?* ͛GɹIz(:6%oI߫k݇K@8 ]"C#ӠcoBL/-< k })Y[4Iن'^2/cl̺')$/k;4(4z*eBji" .I 033K ꔔ]5 X;#O,#:&#E 558FC-fM@C•NMnڏ!4A.PeAѠt7an@In1Q0ӭ3MJLPYʇ}}#Z[R=Dvdcu;5a2jG) 0mNH% sڔ^͎DoW` 3 Fk?_hTv_=Ɇ^! $S ߚDZ _KQBbe':b$Գ/_k7]p%$E^L>6mƶ-1QyƓZCX!JĹ7)8t̜'bxD夿HiEϞ0{B̜:wOXM1yPX,#P*QN߀},DZ.iMYj6йJme&Pl/g*Xk$mW1˷!XLRG.)ک h3)Ο#w(O};̌I~ػy zVYs`L 6Kd=rAuXv Ifci&70񄗻k{!!IHMb#HsyP';OpNt&kn[v%|煰2I*5pQ IO#?-U6u?c6/t9QZP[ibjݸr[ Y){?~??3bnfFl 9+ ɗ>G (k0r"JW/$ 3=:37'0w,B9g/@ KdR8Z>Cς-B#" #+H`Q &M1sƸK{%JyaHOY5nJ P>XN )+) H .'Џ oLSQL_~_6+$&BXRH;Y+f I+%$ ;iR AdXNbQhmG֔0>EL\iUy>>!!6/ldeMH%s6}0c6$y$ 6@wGYIS !]BC:WVp;o\m'zgdCzH>n6GX:u]̒2 iy@1fnn~k2!^8l膢Wo+]/Kga⅘={6͟F4BazzBa& kI&h3 NSlI ԱڦBI%/e %iu}7*q1(q8z3͞ @9ɑ8@S֐k 0{g\t#ׯ۲LٍN #mJ:d᤾G/ҌylX$ϐD0wH}m!]H.NOHȠ z{ѡcJ3AMWD %$G'͹`fs:+sk|qgv2,veԯAn'O\߿2@m[$*;І8^H/CsnYI7?$ip8ukRi5}4Dýhs 䣜He=0X\uD2y b9)8s7o'?ƈcls~Sh " N#zV۰9~&>iS 骃 L7ѭGĂNH\<=I\DЮc/KɚC Agz¯;|A oEG@LtaD$IΑEXD2#=& F -״$ OgؙdqzJU 'Hi3{1i;i)^vV)ShUDT$xwzRqhs8l)R1{bм] @PpP5!:%G_\~GI#Sc.v?PiPNCJg[~^f1#YP񺻎ˡ0+!1L0|r< H;1: T2:VxKboJCxzO\ 'Oװadb:.'}$Iϒj?Zަo IGk!aC6ƂzW1G'ڹU#ؙ^E^pV9 $|Q!ѿ[{tD8as6F򐗛M1I)aX4n 4溸y9$瓜&&NO*N8 ;1ebك"EB2yEoq֦  }DX0~% !&>&ނ1S-0dk4Ȧ\"IP/b^Ic7kYǞ"-'Whor5.6;2Jpttꌣ`\AzZ* D J^*nK7=-f o&.cd*hծhH!BCˈ =@QA>R0kHw(WdAv5f h8?zIڸ|?LFĈ+a(<)ȭz`5>a%=)EFzrȦtLoں5Ƨ"NNH-#9DH$7A3>lڽ ._8g\sYzf`q4_tPHTtJ3S8aT9K ʙC?o,=1qmz@4}1NX5o:w덕[v ؿ{;MC4Nqҕ%<QŪ5LJKgz2,X wXf՚xh:C6['4)יK$0R~-u%Q?oZ%Rb|,ry <$HX6‘b"v G!#{-a~ΚD$G 0Bѳ}BfCP ˷Zx\[EWz/D,{5 8un8pN)S ?w>h "<"<=>]+%g涡|,l C^:%A$-Tjv--΂h׶ .hM5iCEU y8!ɡĂD%b81egT+#)> ( vAbtq^py8qN"2HwܼvOĉ'p*<}y A@ϞgH!6A3{Dgu]GmU1E^&x1`A\k)m+Ȇn\jLGc'cSd0pp6VOwqWClzP(?t㸨zvS2Rz 5%n]50E**ŶV-Cb$\G[s$SS!=>[IH,ϵcظEgT.򥶕Ogq{Ca%QEDFzFà#=D'$ 5vi "!Ud|tڶvF 쥕p6`a ޾~IA,$Q3vmDzGq(_$b`1ƙCH/Pkx 9I 4틩 a֍<cg, w&uUHFL5;ؾ~ [$ZYHP6+ʃ=*QO k3*B*$llF_ \~ O06uZw{XcMt^b s{ VGyP "S3C~Zb__޿o!e C6. KgE{P"זTwFH m)лP3"G鶳X̃)6R(o; S'OĨѣ1nhk+YB!%Ĭ-G˼46+ȱ I:``h{2y-H#&p!@H$[0ňt™[k Zڶp/Z8R!ER*|t7DܕmbIJrKrwe&D "-n@y`_!ϖ+J]0mngJ*u ~C:|ƔI\ C2BjG1$FHDfwoQ&m7='WWweaL'DaKM41#B*eAܽ#Rm"D;hcE4Cz>'\Ɛm$8Qt'k[_x(,!L8O?m:tF=ѱS't۷¿_li$~VNG`59s,@.41gQXz 6N<$Y{!ulS/R.S`c,=sK=$|{X4^ p pv6cd_t9Oh[r'v(FW#:Gspʩ^K& }щTk{=v> \nvgl´hO^uNkscC6 Пgc)&UcGH3: %vW\%Bl6z yF^%iǸĺXv"%xSaIJl&A>()^ڣ{6=+ dcXy)EhntFyHl-dE">Nm]RI],Z!5{TĐ!KJMOx!B PI;K W: Z(I*>jˆf "HsEaZ2B:k/}_ j3Bz.wнP\|hQmA8xz]^IH; 0<vtΣYp)`3l%)® sz8"^m45- ٴh4{y "vN-dh+c Z#Rc滖(,{]I4%IоIE]:R U!YzNeBZ/%p"w/C1~,F2eq<G2vқ(v;Qp]GL} у{H10eŻ D 6.1j3܄$G6ԶƤSPQ4\Y0:Cp oɂi|l"#"I6:ZP? i)R'5l.uZ1}ᶱ5OW &k>h B7:Fn]1|$'ٳhb ; :&Ex~}'7z*t(7fOaܨa,ۆ۱㏭XpƌtĄx`ݼ9a߼WNbi4 mG6=b=h i*'$!BZljPY= ִ0T[ڱ"]jX(M pK8ΞJ : jC^z nXNDC{wd{}ztÄkpզi,ۧ/,}{yZL:;N]F iMO3=6W0 lGK>E| T4M{YIm~cٵKUKٰ!4O(fǪ܄i!YWÁ^>Wb7[&`1U##L'ISüba+Y,.y]6&"da8j#_Q|6ri'Q~mnCDءIL)zm-M.͍#~R &$)'WT)]ןfg~vh3(A3Lͼ<_#hv9mU714f%1OI^ K(:2فBy".:RnyG~^$#,+h$k‘-#Gio\ &$6NMNb;>3~*‚\DZ}!ݮ}X\-dn<#4SL ksgz QAsck<_ 5-KMN\yjuܔ\1%L%ZR7Rcc-&ݽ)76q_=ֆ#IH6Yv8TEH2RbG@&%ꓛK/\3OVCgZf?-l)2ٟ'&dF@`hn pBhs۔ci 2ǀ`܀{M*%qB c@n0 Qn-=y[qB c@n0 QnȽyߒ8!qB1 7(7`-M8!qB1 7(7`^EӼon8!qB pB`0~KOzޖy{8!qB pB`0ri^ŷd7NH@H,dbj S;yNhRmi9=ڤATRD:1^i0 ĩ1ix RO+,8/e$EX "<-~4<~}CUV"%C0b6:6&&|俿\XFkCMM)'# F)@qt:#84ApfbR X])k#G=r0)!Fdݴׯ^"sG*{UᄉQ^*u1p}16wBbf<Ouos>;6Сfm8r{Jᔗ 0gCvU.<G+H+B ϝqq}f@I̞>cƌƤ)3q#aƩhOo FQƨcqKf1]HXee(+b2C'̆5~_s@ MR2"2!*aXc[3I|{Ӑِw{ֲAڡ(\3tDfa)޼M9O aĠz?/yYq}8CN]0sz\uLBێ=hrat3cuxz1(a3޹#*MwvL0!p{8ֶ3͞?s4(kh,-u0'TPZAu/.& DH,P_6 }W[m}b.X,V[ BbwK- ~ҶS7LF(,*)(K… 0m.HʪMsznPVƼ* ,_ÈCp\bA-D KE6u<ʐl`}dJٙ]+;5t%_*# 6 , citLD V^&^p_!-.s^8r㣄 sC}7dgeBd%#+=i p|wH~`4IDAT =c#OH2o 'V̚6}wOueC;o J%#0ifR܆2<;HL6/i'|5on#$$J0FN<E0qG 2^V!жuGl:~euġ!]0CrUYژ<NZCBOYB ő[h!}$ %!<(^ ; DGF ^<T~. YwE[PrSF!N$#ˠs| Ioi8WOϿQc1a$7cǎXX\O]"EAbϽԖjhݦ3@y=tf5FP;[11I\Xw6andX0u ~^n–}{€#}Wr 6r>+K1Yy%%#BblWoEh@Hm^gPHAjL]ff22ҩd ;7%/_#֝yHUo^*Cr%(~t)1܄Ă&ɂ+lLaﵱŔlJ?7c B űqSM&Vpvv!̠=;ǜWPBqQf<.lcRCUGdH5A 6S3FD $ЏfCib,r`q.AሊA>}_k1P.ps>Cc($CrϭZ1ݱ!i]bGuے?^67=ŞJOy{ -ٴvIf`66r2jDc6D=z)`Ϊ-pRI,t/`Ȁ>vf]  Y Ɓv0K EлSaQ>{6fLJ`喃/8;lD4}f͞@Z\XpoKlX6 -3PeC-SHhECs(8dT^5@DRO? jyXH̞?Cb\@2O矶Rf oWz􆵥 CO)ÌИĊY3f0NG5 bZύ\Xst8056>ojf0I%ń z& S^"ABd,L:[!6-S p-I* )79RXi+7?=9Fυk~l&YWz ,@,xȈ=25G\lLe]x'>: "$n*I&'& ̌!!.Z(*Dyp#b`xpP,۳ʞ1 3#Ą:;#RPa<ҒbZWg"-}݇4L3EP?'&غ.] $f|}`ok :кs\WP)ؘhxGv;so9!}!@XH/DG^FIKX \6h];rBjB ~{ 88ވ<ڛ'$NHrNHrFy|b:}^'$NHrNH #S' 6#R;7TELESPO$6 #i И[-vǾg xG6; rB$"ՏǴ ?#GKKX[ N;۳s)-6.MάlE ="%o+AFj$d$GqYАtrkf+)jFB?F?zlƎW&_MDH6㿔菋+I [O?PZsŔ1ҢL<}muyM]X=RA]p%jJ&}RXكN~_3ᗅAie%),0|_0xh!sVa?IH0bXot#H5#anu #b+Æ!4̀/JH"1pI" d1%0Sb&@)?; tKWDJo&Lww(ا DՓa#)ER \V9(!9sx>9;ibUG..̆s:øu_9Ir3yTC۷Ω"0>IF LPc ymq9yX}R([' ePi1#űDuփb7':q eyve4yaQػnވ3G᧟Z &n4!%SEHD 1>wѺ]w44c$s܇NmJ 6V:k@;C6$ ;Q գ1)JaB!0k$ypb @- ؐ>ed7rpR(-X'bհ&w>}3L|;@0pB"IK{\ܥBOAmٽoAL3҂GK<uH4X<#c޽8}*opNŅ7tͽ{=|84!оyjZM2G\! ¹ʊ`CN/ 8Iݰ~^(a?/o܀$w;`: SM;5I V\9ۣ<FH ewwa [vPfNH^m D4Kh6nHKҎ 3R w+*!Dbb?'z0UcɋG<ؘ(Z[œY#C#5Z55ԧ!*bIlQ3-yq|hNHЉc!y=, ;kXY [o?EL( B~.MNH@H2e0aϾ÷r |8!58> h~~ '$NH pB`06 =-NH8!q 8!q0 m{? 8!qB pB`06 ($Bm11E08=l*=$b?.zvv|y$om_~x ǐ88u<%'$NH88 <^<ۙ'$NHrNHrFy~r}'$NHrLRC,(e2K9EjTc[F:Q$3o-Y4ڬ6擓Q'8!9?yjI;b kRCfȟX^t )LGC{>npEnN^tMugraADn6HM<٘':T2퇝sل{9q$۷R).+K7(!AFx)(-G߿Ȑkcػo,\u{rB"#U7!/HETͦH.")1QY#I]7WԖbR Fb\LrBTy=  JH)Czj ܝā^\  8ȏ!xHX,% ;w: CHϟ=<6n mt$'$9 b6bD:K8q(9gA iRy.ڿn&ZP| PG=]sGоi)I4VIv۲pI8T'ndUVl wƯ3rOlTES-̟6{i0o:}`SKD)VQa.왎Ί@(AY TQOcdLTuZHJp5nZc=HKoJ #Эg?h۷f)A$Zg֠m^8Ț&TʃbLNuL98!q{G_* h/8o I=r"dW}I|47AAi:`~ bS8<¦ jIJ"]ߍv~֛ϐ_V.ĂJ% sMNE@Hћ9h %7G}Dњ%| !Ihuv:tVe'\8 7[yd[NH8!}E"$Щ}mG.߄,-LP:̟C#PIR*KcD< ʡ. "gu  "%+F2Xq]R$tm#h/jJPP(xNH_{jӛi# jыB!RtЯOoZ 9 B>P6#53cb2qk4t3 vRbqzbm˷DtFG ɌlחգbjE=HGo͵B4?!yٙB4WH Κ^/I#O%F֖_!KXk8!Dup_XR4Yg{:q%o/i͆d,V_u%B~L-$<$Bm`mq$cmcT.'$NH5Q%$fH: o}`gm #*\͍AH[{ͼHArv'5F2y},K%k[rB(jeyl}O0.R~3O6kkKmHvMNH8!q 8!q0 eOIٗ?'$NH88_̯-^FIENDB`fotocx/images/split-screen2.png0000664000175000017500000002367415247006660015511 0ustar micomicoPNG  IHDRC ItEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 74 267 1 0 .<`eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:270 height:108|fotoxx-23.70: Sharpen: median diff 1 15 15|fotocx-25.1: Crop: width:267 height:74|fotocx-26.6: Rescale: width:240 height:67|Ğ IDATxWɶpzYsǜHb9Y1 9+9眛 t3ww}׻nuG<Z OkW=U >mh6e`p0? AyZ?XxqHΧ58900 Ԛo<<20VZm KD 2h𱸟_񗕣?FsVGbܰ!%:]i}$Ə;Pj4j)N/lI?.hگީ/솥;*z^_ɟEcL8 *>5mao<s_ 'nxVT!%)I(Dʹ,nAvzB 󳑘5*OLLDZFRtRJ AER(^*j!#%%"p6V 3RyYn)HIMEerdR)+@L/9Y\NPkz-O̕3͍T4Tiu!aeg"ڍգ 4UaٹΠxIHM@*mO@˛QIeHD2IAI9j};ՔQPVRU4WU5,iih#;#;5BhzAimB'3uq!p4ẙh"B54*J2WXAW;DǠ<i)(nЗSȕ JuO>տ p/.a;L-m䀕[0qZ$?S2VU+ϕQ-ýpqvN 6 EC:'=z0#o؍ˇ!ڕ L%߇ai=uqn67b={-M1oq@𱝘6ِ`i9T?'gQ9>!X@Z qe2X6w"u8}p- ƏágP3A%aoJGprp1o܎z%l]M`pqq%ݍhKjqXYZ֞i pQ<[`A讅as7Z&?\DC}\D;8~0݃GveD:N% bl n.mB g6ƂC(o^a+01Mm' e ^mZėףʫSDZo^RWkXm&Lx[c4k Y70B`ZOsuֻ;a͙U:*-GD`VG>a6ɂځ[ϮxYԆNm5׻hҠ*4d=j snk<){%ڴPc !>Iۊa>Ř4pQX %1N|z/<[wG3~N:1ꮾ 9mda0f>/ïuB\Ks8 ]]u9p>,\9SB=v$>6S Bz^Xk6`ޢXs?>S6_/Aðt^sH2Wo >-sch [`Bw*d:GExYRC+se/ɽl^=t'c"'yFPMI޴1)xێ̋006bͺu;߿xRצ,Ή5a,s ul\WvbԒTiG((us heui5Qpu7DM xaCXZh0V a2vg=Es|9&tB~ -"<%x}'N wKC\| V!OKS-@j;Xee!B[o8 p53` [B<:NFJE)0i&|R rI>-_R$ +帒 o fr:'#8a7Jzs Eq5Ԥe|l#jH!V59F_bwY)8;@ucفKt2.޺v O m> :P޶72iRZvE&ֺYf (z9IeٻQҢD-9LhIq${gB?|*zqhѼ5w߭(ȉ ih,2(A"emXm a:23ah ։J-0v.'ڞyp]Y"KO32Wh ZE1mLӣ`OsZ$zYaMI=2gG XB>*i<'bB2.L31uQr۠nB2.8NNq(bxD*eO`w: '׹ۄ r ֞]Av![K֪lnaqG'B+~T.|L1;sYՁufuc DݖYN7|2% a?P[s-ai-clbv_x3ڶg8.`$Z+o&'G#b/n0}ܡFC+lkeP,%U*NoY#ʗ9zF#=3 rF '֖9VӀ>0ɂ6ȚJ_Xą?sw&Ϻ -=)3qa,t 'G]IS|1LL%$~z)-_/:'07(ZjSa0q2 XZf߀GDB^ GYjn<᨟hZ%Ϗs1|8r7)`7&M|ԤŚV%<4R+8؋ yrx='¤ N| 1~x,َWU< p'-m\ bI?f"0<)a 1"|Fs-\>S, Ѱ$r4yRnj*+ȸ ܐ Ö~n16?t2u$l8IZ>NS`jfIaxC&3?!FbŞC KskpZ&‹1yhsP؅GhkzOiّ75#ÏtZJفb}z('Oüט`o;s- ◘h!C`јvJ ޵^AMړ09w8t[w 7,M 6h *y%s`\Qp9 {Ei90w x?vq+AbnGxn<lޓle;4CBWw>vnJoxzzaM4-ug*\؇e[ 7TNNہsxyH?^,00 Ay;Zix``^bf3ݳo - y|ۀA$wbyԧx%Aၖwb bĝkko]xyy ptY:,8w^҅.XG^A|n%r>/] 7`HCk~ոew\8n&V fL7\8zah|C_Bڽ)+pFWҍlSӜsad= HN840}qn6aln߀ ӍN|wv'._DRFOB-Xxy*4fҘHO;WYct'[ҪTPUE:~:қ Q=VpbmhHϫBqۅ+䴵Q2Yz,^^'N<)oԥU+ ܹq9%ܦvNCv 9e =KOKS,==sIQZN^J䇭Xc[$6 9vK}(bL >~-vqx8>zi[g.+,J|ZD xK;XԔdDtIy(,CPIG ȴoNr!Xwbhe{r L')yPQ95r1n셱 2y^^N ?1tx^|]l_s!ZT8H{ftS P|g|L$"kU݅%6\L)^w8S'lٲ'>E+# M=yu<%M7_[u+^SD%yAÂVфG0n$L7nP( ̫qab Y&IWKJw#E}Eؚd8}&d$'FP$&X~!*bsŒC4/%2d_,Eޣn#!) fw%<<]ey^#/ÑEp2 ri@.pOi<<_saKZ CPKa_ElJo>]9Nk9մ<$// Rn+dBX\A?pЫڪqL=*ɩɈy'퀣NJ*;bdֵ ;bʂt YzY]A<40%!/LL,`$fQt>w#&iAC016ǖ琐KR.SG+}+-X!Z3"$Fi;7g{M3ua#ۺ@c4P^Nx3ҋRs~ 0 ~'/^At;ti*$EaŘaaI06+pPz*5j5&3`ie [pdZY:""> :; mjEo<?Yջ/WgcL3wDWhW+M5zp4SSM,m<R`Y.nuurcU50?9o߁ 1.!^u`@44{8taF;HI[DqDfjXz L:zMQfRzIٝы2DCNDH{Q4 [ *vub{1Uf4x5 ӫF}]m]Q6z7ڤڄ~H{%R m!0W8L'fD2Bo=z}D9E-6@؛:mweI44gzvSnVOϫ;Mʋ-, }<-9r9m +~L v&mIf@X?9`ubxQ2IDATRt}P|guy)j*Jt:yrZi S@'lTrV1e%Eci,UUQy[Bҋ%Ex%*ȞH em#ȋ̄Wo.MdʳI ՛X/ :OvMAn&K 9j -0tnv&"/8_xXڐQA@?}zɶ_>y{ⱍwA<.ϥ}e@*D 33CX_ ʸ/t}Gt 9O=;pvH%ƢLC2Ci,P:v0]ߐ_HbO`s|JdJTXbΞew:o6g^u֕;Edr70GA-(7ӂ+.㎾a/ I9y\5t?VڀM-VbĝFu>݁e??,xIENDB`fotocx/images/choose-captions.png0000664000175000017500000015322215247006660016106 0ustar micomicoPNG  IHDRtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 293 496 1 0 0~:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:496 height:293|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:447 height:264|  IDATx}XWqs=]() X]آ݊"Jwtw_Ic<_=fyg?"sPRRbi<t1P``1&P7_Cd˴;1!?>EK ?!8v\tFJnG'3-^\qҏ@_ HzmїЊ 4V^}{ed 0di@x"aJIp}E)!g# 5?V{7'+A\L OF|N.O_L~IS)P0\ϭs劁.}i{{yń9&wyz;3 ӑp;[nNH d]Qi f!49 q7717}􄺜V3\z|촙 ) Ib3]A֗YZTg1c9tu'iZ@/4NBRaKLkr㠯;^B'ٻm-ĵUDϞ=1r3rhrjohEk6!.˴wmI_{}6@0\=9W1͞c7ǃ{'\r:DJ@DT;v @bf'HlFF-X7Yr:X+>IُFJJ8F/t@A  ;-D.! >cإ()džQWBV^BrQ7(ƅ[ ֽzQ– wY%t/C$[ƀ~dޝй,V{s SAߴ l~O]0sg}} \o}~>7yҧvv'L%W\cӱK|"VY/axMNV"B!)-um-g/wQ ?B0yoM!. `4H*qq 4e 4< 4ЅG0ROPQXHG \^a %~B HNJEHP dpg ; R1v\r7 i|@}}?__Od㕂$E!8(X7ʘ+/#ED7b~b\x]Yê}gpFlr:&Ds֖Zz"":jEHp; s]Io3!VXf b|:©Ouɼ D Ƙ0$5YTPٱ?-ㅨd":"}!aHn\Q?c9 ?ĔOpG9e5j`R^do߾~޽;VX31M&׬nkkkDFFrDDDr֡J}_ǃ{'9e.Cѫ45%dDcf[BCRAl7"(&&bgF k5 ܾ| BBz1)E ?  3|cAZLڷG61Ipٱڲ}!%%Ł ENlGMUk@KK c/ +P5̠CikCFQS흑]ZF@ϛX8u$DѳGIA`BdFKCBB***hӦ v;{HDziܡ=ׇ;APTæ-0B>;1} $D@LL"H2ʑSvH:+KHL'̃WX%aG0<7QɡSN?0%dSͶcѥcc[Ġ3h 4W# 4~ rDDD޽{f(?vD?z:f,^ h `%>} (Afa 1҄ E!aG. [p!"M پޭ+0w{돫-2g=M:5@@v3"M Y uA"0620܆ (LT}ZPP@ϛ1C!/-I/C1b ՈV{A`ġ4@RJ#&Li00ջr zQ_s^o .\?Dv_sTcgP}Mc*0lذÇnj30b3/y;?>ytZd!,"bSQrnN+&3ayI4fCJN;5!oc7M0#m͞,O3*K["vb-A`, , 獄8i C |Cq3ܼQ\;8ONcr+D_ f5jg ث;O¡0@ Zm7_5 ʒL'F=&P5&Bq#6︊,xdTb w2#Y%,+Dl/{ 9I~8le>h(t$I&sf eVT(A>iLX{0Zh b s4?IX2X[|[ʊR&0sK$RqOLB3Wgd4ȔOW'bXHJc, GlEEZEer:B^B lDٌZPVł=7l WX&pXlPh}׽|]/M~oj5o1 {}1-4g3iӦ=Yf͚řߧrxǘ$o]95$/w#d)>[F(6.$51|\r؅BKAAogh}MGq&OM2ݴ[r-f ean:qi)rtKh8G ddd ===hhhp.* {qo)BY'VO Ei+{VMMʓHK)l8pI1mE0~-ԍ17ő|~r}!<r>~;&OE:l EyiJC"$%ѵkw {B$mMj9y% KPC'ARQ&|~ fp #b|pC 6-JZT# g7+wN,JkMwM }8ҢE:=]ho;>?1C8^D.k҂_ ҅0EhԠy9YH*~ #__e̷? .BSQyQQ5 JƘi'ڭ$.+FVLma+FN F_p"AGiBĥha3B64?w8q^3glw5|~QQQXt)-`ggD|{ǃ <3P0rdx6YlPȨS@4o`"4501 "K/?+2` x)s %a9j4X> rќ5,=b04 O^l"ˡK&Z1)$sѣ{}m݋48ߧe_JG:M^RIg( 8\?hrP7s O'LXW" ӔD? G+Spy\{Q?lpzEΖ"hzfe2{AVc(6{4:ƳT(0B4iOa !_(l%En@ NȫRY^ SR |}po+CU>\57홙u42{>,;62hs1 q[_-M6Q@Vm0}}B o!73'GA 14E{T˗/7{4 ~@L^iSl"=YUK[G{1:2mY f4y N}~w`jDE ra5D=z 8,J&ڊ!TkGxF#"Á7Fʊ\9 b4IɫR.^\}aݶO#S# Fnult؊1o(WV"5@_ %خ-zҶ(Pc$9mS\K{0L[Ҳ0!#\:{kFhN>MK)Q8?wݰwn& >0kC7 0#}:~Sa+P_``> \㊹fuG+Pt I-a,j5?JC}śqtăXJ9|4?]1'h~HK܁i Gƾ;ݻN()9ƴ)lvB@D4amp|\}4lz$&d8}xÃ7F=n84Q-<(%`=8YR;3߶];V4E:Kyk2q+G~>zPTwF g;h72'eѻWOa.dUV'4iSb\j;VtzZCDFRVV b(e!|,q i Jg2t >=!JǮݺq}#wF9c` %w `𾵟pi !F0 *SJ'v@"ȿŀCpDEEGHFXQ1vg^P_(jAJEN@{7.:ZƄ yBAuP[Xz-m;xA^Z̴C&7)ؿn uS _R6E7XЉxHEdۿ1A[`*ʵwBG"c;o 6Ef6D?ƂѓC@#-ic jvl L{_k=k۩M\ϭ=>3/}7(ؿeba?ڪK `ةظ4b&Fy-&`CʏӆLhKȡT&qXhu0b <redRUlbBjLưZ a;CPh`:ZZ,p#)G0y55([F#pZYXeG` ȒOxA }ct/'=oƔ1CmՁ!&Xغ v&c3x"4qn h]mJ C ץ2αFLV>yYɸvz/C}] oLƔ21kwC^I)Qqr@OG2ׯ?XCnOʃ S`GjФTƨ!&Хvӯmwċpi?Lslw!;蚔8]C=x=$: L`c0l>ri[Fo|RIku4Ҙdˁ-G(TAM#=9/!Maꔟoh6i;͍`ʧҽ=Iْ64y |XL|;ʳ^xkvg5c ӄ؄) ~3,uKx=-k}J;X^VVK3}_Z~<}@| z5?_03dK| 0|}L/kk_};1 %'>v}?xyh 9^x(H}S^Yy\V~}ݬ^컯 Mƀ^d3ޒ>2}Sf5OS?0@`@]LaZKKgfU̓~xx?9تxy?xy~9g_UϿǘ~<<r -i<SOe)s'BQRQ;p;0*#0, ş+%D^qIԾ}}d~>V 5!I)iiiGe1d|R2iݻ1C1 ,)Hk#=EϰzBøaf8捲qzK]@'L>o3כqz\OFH;9vށ\<*;xpl"5.ctŠk>٬бWv IDATt .}7 ɖ%*]ltH\ ±zX9Djik{-?, ѓS1U+6#6ELVZC!~-[2:*ҚG-2S5vtX}ʫ|%c^UTBXZZbպOAiA r-#耥֫PN-sT#2>L^]:N\*sR܋J-M󹣰Y 7eq oV-~#{cEX`>s16܏Ї g{X*jpq+D{b{0*̞UWp}gnuY lvOMlX,krhzѱGo I$aYŹ)t֌/`غ MVlDby.|R6N؜<:-[8yd7LFlemAbKmV#:mF3fS0> ]ka_8w|c mtj޷;am kl#h osTƉ]]/cr嶫pJeIQ^pXL,[ g6lމ8TXt%taϕc Gզ$? / e\}Ҏ%I ]L[Hs‚8euf럕 ++H}k,' y5m=CL1̀_5.Bmaۛ piTd!!#GcPS(+cJPe'cUIeFe"`o9"cJl۽ 01|8P1aa ys|q mMU1a!1+l1t 9mI -'@XHf#0{tAIw N]wCM3^7AOCRJ;e F7F]ܒR<1=27{GqN$BhNeI37Ȝ,="~^2Z:v;-jiOcДI iUX1Nj#p:lݴ :*Pgϰ(H"FYa6VQI Ŷe }'ߠ5 ]qny"%tJ cCh4G"55ѡw1DS}dt،/$fИ Ii((C"1:&xN{VB\XBxl<23Rv̵0f$*-ͯ&JP$a>$GڶL%`h38!5'Ue8xU e%(++q|ՔP胱KAH06A&0xW#hڷke$KU9p G1wf-A`g 9]E{=j*ybE?,e(-)!3PAZZ2݄xO(@8ƻ\Cko5v=C!sYU\5-1A"Xu$e%yp>r*>Ee;zv[!-;ٙݢPRZO˰bW$$'#59wo\uC14P߼ozJe !HݏuJ+{ :"1h.IJJB|\ ]A#_F'Uè]RA.KF~LSFE3ϋIGH%@T tWmGY3llQ)i3ސ8D~] 5ްs|~l5Q 8kXA.=qỎ$7EgqsP1^x?IC!:~q/RWnI*.lQZ^G}0y>jc}[p*RBXv= W|sVd}z1 >UL8?O6?$Vga6Kt-#W\QՌ,5~wvAG xWpt!u{O5+)NZ ̆p#3ѸnGVBg7 ?=#v![t'/S럯u# IX~%VM6@Rgze=J"O@.,oلꀔ\'m臞UcRrum<~N *x< }5ynD}ڽ'9Iv[#X낶m@oz$fF*GA{hxk&, {#tO7Q%'i^%+~O~4OZ&q9C5L'|s=E{?~RZe߭j~i~ͭVkWi^-?9G6-D׮ݱp6 =_Q)y?Z+}w^>Guy!Cncxt5?<Yg8t2_6f dl ~L;}BҚA z&\ϥ4?t֙\fDb<Fbu-3G+8 AS5(S0_Xp@o(UNBfNlG>? w/ d7Oi%EjUt KrpD0~J&=9|!7CSF;0yCĄai7*CXp "(81)yaakg8{%9"⑝$D *!V|~"=(—ϊK4>AHIKCgMۢx/O>?C |I =HL³gOjz,drssQHQt#L>q#,hoԲ/aIX"SE Xtߴ}`n&pg7onXq>rOf \a~15)AZ` XScT {Aр|~yqe,f&E (Oš!Fڼ>?z.,AFWD9/13kW _oĐ#7+ Bn^x6SN%_ 2d(6H&6ٍi!dNAWEok2̌4D!88E q= mؐ_0 OLxH]O[df6<!d GP穽k$+umS𡃠'I¡o$F{ 1&1hϳۡ$iE QsfTUҀc]P00A`1Nyչ00 12Sz=L0#_.¢%$qi"(ړEqbI0ҢhO2ؾ'3/ AQU"aeb uC#cZ fE`%3< Ybl[;$H 3ΜUo*dU1n ̛;# upAj=BO]45#͇BCU v|7AOohK4y jZeP!=~<Q?L M=ӢRmZNJ,/~?q:"KPҰs";KѬ,%_DaemvLDq6.S L>C brdʊs T m^_rN7lm.¸ЮP#Вq!!g!#&~F6V3SHNĹaHmIHcɘ?Ǝ55JC cy~m;yx-eA9cά06҇I=rR}QaРhAq(O3!"!I3!sLJpr+qo,Go]m^Qӝk" F+Xe. ]Qۗf5Xp[kPX]^D)wS\ro6Qu)8/R]ԮrtX95&-!'gygei&=Xոx E F5(̊Ƀtb\5$ UָLZhn~*.ϏYms)5,\7cr-ڇ,nn^y }h ~ ༼oo&mt^MX}*|VWz[v[c \^ޝO'&_N/ѯ7H{ C*PdQξ)8M/,, ioG[ulȽnܴZ SGp|*j.! @W}ǔyi_BYZ &/%&mO%㐅Cj=)^G8~pop(hX9Go)wQ)`m1૿+"">2c=a1X Mb7PD0/!ع G گ/ebe e5S S"x h:DW._ t L'Y!$>,;v2(2HI;x%lG7͇TDq+)xWqg 2CAuX@F1nj*PS!/e" P ]muhIcb _m0V6:4uas2҆2_8P/kڜp'PHDy~ݲ%O[&@IBg IHɫa\)1 |Ю['iay 6YcXm;wkõwPM\0f8tcBNQ~uw+NRC 5H+s*ڵ>6l\zrՁ}U?Fw-@K'k~q y /iTvb0)AP@VttxgBbr?t21с_x`S,"B*5g<0su>~3jeMj֭AԢn,C֍،Ӧ4q'^0:;22{ʜhw#px |O"+M0-Ns0J7L3]>9tb]>]D h Mhs^U:aUcqk$X~8JI3x '(-?4:,:'n؆aL]DƝȉf-ލ`hŸ3(p_5iC}rdEcpM EP'DLd0&jSQ%l_y(֕Ch/rni Fy1:>_~e~ˆ0ۇkg" ͅ' {P=I Eɾ+.u5U۟LM4cֵ $ŠyUy#  D ]>vcZyi4Y))W[Cm'5s6i*Dڡ_Ols8h5: :B\D[=ait$00А91X@PAƙ뢿}\GkWIMem̽w9,V^uu>Nmۉ%֡5dY4qO+O_ #* gniPT=`~"Yw`$-p7E׿R~нL].GRA G0"&&`<Kv^$ :ߎϣ??[O:M|][kC5Iah o=+pn,^hK`=-GU.Xa# 93'˺?{b@Z!C`יo67cV2n(/y=e".lw&e / r :"h;.*uQN>< qМyEE(++j dGx5wC\!?)L_; J2kӧdR|;!ө#lGmcڨ!+_i D:֤ZgԆ:@-a$ IDAT[Cd~.zEWա7OD"#Щ}GLކJ|o?Er`Vޘ8@bUX:FprlGNW@/u Qi=B*\4&k_ϙ=GOCXC}_ρ{Yg1 [xd1" U>>P ]dMN֎tth$My EkgOڴB9?;ACW&Cqe)PWlH Q18b<@@d^z݅xPZUMDV||S^QQE>b|3(z.s۽ DAImdS&"ʴZ>wO?GѳD!4,kȘT>*EzxQ x<DD'59qa '^pZ)׈#9Guۭ io[eQ:'L'Ïޝ/|y | ))S)ӎ~؀)O=|&x)R|?xo*OP*DuggD99_~  vqvA1_">67oիjG@NH N !!(QTQgOkr$1ldP w|.A_Lb21k U| meh_<5P)mml6J[_}wckLV|(,iC[z&0v'^B0%>};n-b&A.[jD']رr 9rЦ5}[ ie-*M'O@Ѫ8iWb:dpWb8 O_~t:?m] 2Bg\\OFlN> r0m:tE`z&*ѳ_P4y(Mj_ui'x'L7cR؝8y[藨[Wp=4}v9҈(#d&"MU*J3~*:G͋HK|ߠd:Yx\S݋ѵC;O$+ܡC5cYdV9y8f~p%y8D?e)}zݟi{T?.٤i(H3-{:a>hEk5xػa$GEف2FuFUK)bƶtK,.^#<Z՝DXI/?0[:ϯ,π9wV7iyՙ=^[$mv"q7t;͗@ў-tөW|&m?{Eҵs߻5( Ys#qkΊ9ŜssEE$IQ9 "k>gzꧫʯlٲkҔ*mF~nd>+IC6$"Ym/g2*{R68z~~5#w_j^27%|lj6bEB:D._//%*2/ڗt?Sn^9E[K+z?ߖ?c^ݿJ~bШJ\Pli=@^L;G})S J1@ gJϯE&9k3ʅEF6+F GO侵X1b$t!*ǧgЬZMQ4U8X?_ =kʅmhSͭcV6^i{~IB~-Y$VB~M~F9~^URjq"nՌo7 ys+ʏl_x FqU}hr6}[ףH<"&k77D:C:Ֆ-IoWGv\ߗ/yK Zmb4 q͸`b:Q@Β<@h%*/" (W8q);5:FzC=òOrv7l{/=Qxj.kvQXyfkB}$,ԏơgnD5iBRCV.\#w\xʛu\$dž۶þ}+iD(iě Ը!G&f-m,MT̈́nݻӤA]*VccY*)IlvGRUjԂq?;F,srT9Эbum^xƋ|EYQ-Wm*+_ j򳮜rѵgztnU&6"B=&-[_<`Y9o*A]HJiẅ́IK9t bTr~#͌UAc^Är]֞c3Omy1}?&פVQ - l;tW9z 4صՋ3ojVm=HVgD~)g΂̛7ǹ pMOKuło|݌@R&jܵKp,f7d]#[AE On\: 5tD(EF7n]>َ[ū?BKOW*e8X-mh1 Wl#@<3\#9!iYp6'#%*^x(xu\!Wd늅̝ws|Gwk ׯX:ߑgk˨, _"J) NY~~J?첓rB~k*|b?AE냲((= =6/I_!GP~((d!_ʆGk'{e|&SKx[޾]hEdL9RNYkJʩK(4%'&ƗUϚװ%y#İ%Ck!*$i%k)RV)[X~zQCDhqJOC/wQ4̫e)WŌruZ|xѮiC&/sGI(r%?WOa9/?DQp1,Zt~xe_ V?妪A *Xдm.$)5 쯗~Ă>Mlԓ=#b.wNЮMGvwxZjW9^w)RM~ ѯY3geu,i}$-bȩmKVb\$'y7Es @Β]:Uu:Vqꚫ&헮Ԅˌ0f*˧;бamtu_:{]?9!U˦1|jeZ#+.rL_䗞 =d(ZxԔ_'$?^epX7#$Ɗ\m5.Ϝ#6]{xj kb! ɞ&M[0hEҾeӆЯ]C| k"NpC}SS~x.1O;kHbenC}2`<_h0{wC S5w_e;b\Ò}P"-Qpz >Q^fϘMcr(9@Os_IsilHL7pEk,ކ3wOz:0puY}iAQrW7}g{0[߶"RΨӈ %U,*FD"oi If @ Q/<ټd<b،ic eаgo>snݸw_ C"%/9*;QqvZ-16.RTHR| /s=cT7G敋aZ#>tmaD%"qsU,ѣi5*Wg,ЍE1}ܞsqraDIŹe45l@%; :r6AWY*s~9Y 5J b@[ʖOOO!]̿Բ9s>w U;țW\?FU,Y9+}Uz C;ZQP96cNDYIzǢ|!(ՈGNι/ZsVj_*S6rl*=ד3[0Sۊ pa^zXW' /FqkƸn{ݺ8rX?挓"=5([6;%(s~E=#ݗf,gDU}z&:tG'S9#*?~t$qdn?ѻזu)v*o0~t^F/c__?PTbY(h_T^3ydg~.PR![ؔ,D~Q3tk5U\ )U 7c&J8eϝ nN^v>]N_sS:fmGBFL3ҡe6 =<{N_HY{<y1*EA^.gNy^VlW!%/9:n Yhn@b(B~.WSWO0/*WHԴіkpe()q,O& c(AMc($O*sDZk_~EM|bgقq?>oO.Cp`X6f4-Xi˶O|1îY!'[yEI4i5ՂeDwW>Ɯ=~׵(^@Ojmqnd㿕2avbn޼ɝ;wzx">DI7](u͗81IԭU{d,jSz61*d#):XRNQ2!߱)vw1mcZ-^{ʢ W{!Qk.g߀ḻnxJ DlB"iiсrEsGb6Ӽh)zܦ-\Sj/$KA9ܸqwjD6=T.B9w܄q%x=)Tj"=,ߥ/57ˊxW֪@yVY'׏ĊKON IDATJz~S)A~j_[$?zqٍ 97?/OMo]:Lpn }~B4:OLtaaa2 ̔tΥrV3mrKVA>!U? '˓=D\;]c.M%o1ϝ+{)+F%B;{ݖ-W蜯$ _9M~j.~֦tZq= SB ~+(T*6XQ'?%rՐ_d}CyOb m$s~2=U)J&}x1FִEv}Dt;w kp7H:Vژ-NÈou'-)!N;*:Fb"^n{)_0Gp-h0xd2..B߅Jy\܂h N@Β zFDqʛ5X[=-"cس焍ds^+F71-Nvzq4z?;~B<1ԔkshN r,1Q?nUEj̸ֱ5+)⒜Q DoEtlZc} ɐH%[KG cJ0vN]FHb"'7ưJڱvJ45ŠZPOOdh"VM?hXwסAr~ƠS1n<;}x+lg9 njQ#Vʖm'WNyIL7n:*I0mRP<&Ս0o"&.&oEmvزy5'Ǥ.}p}. A_>21Q &H"k/NEBJFh6s[կ3۷S3|dE`٤qL[} ?1'm˧Ҷ-uev"~97驩_|]OҾuK˃caןN"{ͦNO% oM+ڶŶmg89_JL؅6mudͪQ3'ѧLy(~}(#9vmMZm$bB8~7ڋ+`q{̎}X.ߘV:tSߑ Ӎ6vq¨󂹣н]+zK7T3gª-n-Ȗ">ʮ$n>rL F6' gUU[[9Ǝ:ө{B\dm6d %񃶘†3˞^{8Lj^0a kޗ%& &Fr`":44\mM=>i񷲤lX&.׷%9@N_ZJ(7çVʩӹa'[۬ 12m]) ZGD.pl'7{`~ggRSqH:T6oNkQRJsz_=Ҥ*E eEfdE g VRuPC~jM垬2ӯG)B EE =VJCZwgWaH }Vfl?q(TȨ)&I'Ѡ$huA$*CNrb^y􅈒 xȹ/ r=jc̋,Q>^]>-&S/&*O_9_c"=x?ɸa)Zkw剴gj=, dRzqeȢC󱍴m@-CjZg֌nH4@ի&f4F%qqR1J*T54iBǍJJ%Zwg jE|0 k{$<=OǖҨ5=ۋ^_ժ4W6Nh_䭃EzLڌYH,A%n&iNi;t`(6=?oޅFQK`_{547*OSN=y;ۢtn|vn7wa]86g"1.nя8tO/o2B-~T@Owz~i2,z"1bV$cR!ǽ_<+A}U=tOE"rg!;r(T@N0at߁Ǜg46@Z׎j^ñK-H [ۯ8:\*[B ݿ YUEIKk>n>",.Y2+'W' EyiWlT1`Gc>zsS[&/u>"JE%X=[va\#B~u:NQk^ޜC9wvC9u4ueƒ`^2 bwcnX2/%*s#mL΂&Y~ #0* cl`_RΩ7뮜sHV쑟(_;9y=%h0)>ZmR RԋJԡG-kM/Tȯp.GsiXZ7Ԑfs/궚sJdPN̠[\9tnIVoĨѣ-idbح~pr¸ws~#%#v)q8q:ƺ2`ݐ^F1RF? 9'wBElImaD&T*!r::U2K4~%<Л}_)w1)}&UU%fY*Yu̚O~$̭( bZזm>7VC9v#"Ca_+^sj*j{OGk򖮆}YegkLs& 37lҾLUeq6x@>1x9_e#G~DP|ѪtIL]E~9PI-=] ƱS[OzvnH9׃SB~3vWGM~/c W~WV^ƍYj%+Wnȵ&0K ȯ&gVC {_,o8*ڶ7}t`g?#JnR=%ak4֭ӬVdŪ]|Bcӽ{ɟ_SoTnArdYA&f߳'yO!t چnKko-rz3c!tP[CE!mݙ6Ǝ"U=QۖWI[^fxF%sf-S"?"93#'.MdTx=r! ,VWɤ4oy0XuoeH__/*S֪'FX2 # 2䩞ӛVC VWz~oeCrغa(Ί=x4HrTļMZz5lARjhJ ѠK5-ȶ6enj[͓K'GU ӻS\#vJJ}L*;3~+c;0N WOmj"]u/-k ^M_'m9DQKP[kJErWߥ*Q $?HN g-^u1d"kd^5nysX'ZS WN>jPE őaLi2Ξw4ÞVpu {ul2n;'M8+1-CCyܴc' 'ѬqC抎W<4'Y5YÞ?oب,,_gD>tW )j?>79J~җyf'cP%`)"5d!Ml\;&u0&s" Ťn1qLa͌vC͚u nj yضucq RFK{cPi=[gS!Ilto.<$mkuЌe\5Þkc a]G[,:xFteuulߴZ$ѦsoOɯO̐`FS;YVGzFWV-)f$ɀY8rwJ3jlqGn݆=5^Sc9؎& 늁TxBzYP| _S6,;ǧӽY; =q+a#=iGಕuteib"z-ŝLIPTYM\(Nɜ;E~қUIoY[]c>pexuRTqJ(Iuޫ(d"Y/31[A{F {N)׆B~_[(jP﫭%c g?C"ߏZJGkU)S _$ EP\[D@!o֔<+|lJt|b;vVcܽf6}0Θ!}w~?η 2m6lqP:Qr "-KO4.UWj#1gc?$$B)V3+k7mD>GYk[$H݋הmi#|cWW.@@!H! "?$i\Sߔ;s*:ʖCw Mk<20$q&U w8R\6WXi }dIAD ~af߬w6N?)M.]ehYT@JLew!VBw(7.DJ-Gϑ!%)}`\k &TԩDxq}f8GɟvHO-YeʕDK;F^#Nx6ѫ\ES5&zU:l:a!X5E*6[|].'$v vq>(d5(SXPͪZ'7cn^=gNJn%zΑ楋[Ͽr(i+!zh5xH(@ɁB /1rm&,Y=ޱ=ӷ&:!Y£E1g`]-EG۸a)m,Bj:KMgIoS~,1oNvmYŴ+D#[LOƾ-A6} I*uX A ឌwd.}fzFsOol`3[dt{j+޽;(_)ܬ:Uu3u V/M24g0.j3w.nUTӅdJ}vU[Vc77xu?`d? 'PV ƗSng^Ko/UC(`L]C tDy%M+19D2%3fW#qTuh^#T! nS<ᡉess)Dx(׾ > ,IfkȬƘUkdِ [yc"Rag^o%tMY#nAeYtm};J~'b]WF3C&*P̐K2yɑuq2A~- }-5CA |k`S;LHɐa,X]F\3.` }ݷ}:-%JWaŞэ^o,W,BOOFKucq; Wk@hTA/ҥ)GnOȯC/fp%ZfŚ<%2+5[3fE^ANMYrO{@SO[ɿ ;f\68%YiDi>-j"_ ]=_ϞB~R%A/@6/gSp ^Ҙѯ JwRzNEDߺz!GO-+M G5k[ Đ!C0?L`AgШ68Ǹt҃C S~G,3BƄEg~uh5b+5[#zZjo"jٔiB~!5Xzia 4i )ÐKpG=iTg EkZF/w^B? ]B~ZA~(_&Q.B~ʝ =KBZJbjz+hKŸ2ӓxs>)eľY"wQQDGGNxlKO-&C7{JR0_CQre{']RRELv&K>FeetJyB=l߭wS>jgA~<~h{ayx#K2EΦhiL_{c{fU*Ņ̨h$'OY/YXx ,pO>UWdqy 3}#:NލWLjV5/=^MJBHkalך iz~VscҠ)5?*>X萺wBt[{lVyiV>Hez{+5"0R-uTUQ))W!)[BCSi Kl޲MhV5WW=?ׁ@6 zLZc̒]BވE㝘(#. k6S.uO3DgJu0sP;ʕ.ˁkEO 3E <~M@P2P^J9U}x.HQnOW%0k=%+-{E PxiF8.ުLH<=mw&QcJ.&Lwʜ. lZErLkP1*TzZӻm >n[DTArʥT4R;Ɏv-13)@/KwlDi=+lڴKߡ|DOn]VvSz}μIL9Ȑ];K-ha0{ 8,kBnA-1 eQP#r(|?dP%#ٿgKċlXo>Ϟ];ٳv%yaZ PӦ;`>b g;wؽkN;wSc{QvW\:i_䞛ν.b;|U#>JYSB~ف#VMM{"/IO9WA P/UU?QAcd*8(WT(!RPf䧎NttfANB~?\+c;C@!Bdb"yr;w|sM =-珹/{>qI)_]ūr54ЋgO__NNۛQ[Wxɝj˥/>Vs 2oOç7RK4'=HS9C e[AF Ν+g9n2]SxVl0.StY͍`ږ.ٻi!tOKg맥svf؊ϫЏ1 VSV}W0e&z$#>B@!P~(|d2Kxjn|#2Sy|yKW1.\X`3,O Ϟ98[Ʋ{yOIibΝU[f]k$QO?gF߼&qlaB&#MD_XMB1xl2v% /8.ZǎCrpW ^e%̛5Y{2<߾^LKc_2ٳ| 5ٰ'αvjuf[cWHI4u2'Oe]x˄XV͟ƬXp6guw!ƅkTw$o6c)Lu\g/4ff go?J_u VH̜U;8|Geڃؾu1sk8?*ggTINA "ɯ xf&Ųk:P-RȊ`Pނ'n !Жl+` >r$Ŧ~zpqL68 M9_A8!H^KUG^4mIVݸp hɯ~C¢b5x|Kv"$KȋLقbEKХWZ5i]a߇a߱=uu7chRY!gUضjMz0!D"̨ӾTx8NDwBw & !W7o-y9OFAri{hۙs'ѾAM:gk>{:t@=sc:,>ARr >Os[QC%ve*U0UKcbmdҠƢW"hRE2@ fqJzԭĄ$KF=DicO!pU/V Ǎ;3LkCnx+wѺ #8/_I`L!>7ǤP6/xrK(7ccMuJaK )O^ yHIN$*1un\|9OU.7Mh"e۬-w.DvKC3F9%ډQ1hJOP.y 4.c_+ /ƶsWy/b8LMB 6'B1n|t8F5+B~q*Eqa mq+̓gv!ߠvul]%Y2 fXʻn7uH ,^fg[M~esa٨\˨oPYܲ/|Dh M#J k#QPkP0͓kR0g5֧ܭF0_.j5_y D+Yg];P;XX?$9N~k`c;Q^ybbMqhR2Fd=.nnܕpMRUE[Al\9|e_z)$O"+_+S"+|}{. XTi}_\;@ETA:D@T\sεcm5W%DZPf^+*(\agy{9Lх"I.b7!qƩm!.;sWY5L|8Z@l YX-!fPs죶X{4}=SWrõ/dpbiƪ ~?2WG/Usd{AI#9>! +lSo7wKY~+ětXB/Sm -_t- \S,/Ub(w],#c8~:`Wy`ZOhL،($&&"""h$QsTJl{9{YGQ(~Cs48x"95G!.)o0gCe;&(UW5“H`ԿX?:s#9y OF04 NϪG ʀ_RԳ6)J寰oJi#~J<)yؑy'PFUFfMIïi=/,5ׁo$^&Ko ¢ <%A60y9RgX2e~x9ϯ"*=;BZs(Bb@e`&:/LNIEZ6 7ظh Bn & C(l+^& (W~-]ꥳ ݥ ~n;X@C1dDl۴r.߱x^g0VGj3Ǝ YYyl?uE b }`y{)A^1!SSg cf.ABa!< tҘ8qJ84tccȠPkĚ=tҶʫ>0Ls P@ū7cދK x1 P&Ns$f $"VdIq/aJ#6u`ok`B_GW۰u((Q`_sqv@6#4.6nYueh GoJ_8ړyx筘fMC?W@/1_-QPs8v܆$5y!byap<?@)yaEX|Vnڃ-7`Ų.J2pl!-bݞ%`岥Xi;BPT۱b|,X (}GiGZN+_Gl^.’kոE%GXR,[oWE {6o˖c%s6+D~oE༨KkW04m #qN,Zm VTw2\XJ:,Y W3:_#u([pS4f?ɟ?| y؈wgY3>_T)X&PǞ6HVli/.JA "7J7*25ŠH E#;<}͖Y2Z&>{lakw)q |VO'K)И 05,Jv2ޫ'Е;z#2G8%D^ඝ1¿ȵoxĭ;FxL<Ĥk\#(HV )`" ]i+n͘-m=HvD#_dTAa~,!icwHЪ6|CE&ԯ@&"2 0 Lfijۅ99v-l*6}.vpswj,X:8+z4, cF ('OjF6 b6#ܹگ2A%T>'ppv' fVʱk Hy4򲢼:N.cy? z ΋*9Vn@]R89\B=pȮo-ʩ0.ME􃁡37[XLAK ςxӧLm܃Ld&n'*3G",Mw;8V( MLh1- ޸D~0 9 F vaF`(^+CWWyX*0p$[º!jeG\?v9n:8wu)mY-%!/7 :NLF ` IDAT?pErR8^2Oia8U(F @!: ]zjЍ'h;G\;=e?þI4q}9Iyvmv`v% S"nj -Br `51@674oZN1>?cl"^[G@CKE#xtD.б(!nM_ CXPcaE2ŕ2GBIjA2_'>?>K'O >lCm*h0*q믃Fjcب解[k2ټlil5n5j1ҲP@͞&?0l"> 겐0OIgq,uO;g{]+ZoA0O̔NȣX<)h9u~.DG)#L[<;wEa_ ~_ dg P*-ʂ_cڈ#_0lb$rC\} b>GaČ4ZCn_1ah6P\ˣӠ9 瞄pj웃#v)z>φ*TUkl1kU&/.>SL[t;[hIM|ܻz5qQ0w# 2󧏁:50dlWIS!3@RiqтeXh mm;,/c雨xGb~O)k)SEE>޺"!57!J=uߤ 0}Z=YjLT+M£Ka c0P%h|ĄA8sbГ&9X5-t~f5=AR 5}Hȵ?LOC`^} =: %՘ J<((Z+Lj> WH`殚Xh":ECcU';( 05,SgQ+5P.",U 7A3O7eVS3oD m0tn:Bp}YY1rPJ+!Ũ{EB{t'՜ ύ&-͢ 0PBHNKCZZ:;*\9TV[],D_\X,uTaw66ݰDu~ 0[| 3^]^v${hպ,]BN  c^86_:tź?A VZД tX<=hѦ %kw OӢݱk9Ԥ?AajQ!qR mF; zaS\l j52X|~)&RڥVO;zu + FCm!-D\EV~Mv> ~AT$Sh)p:>}qSPrZ6zӑ`+Jb܃/ 2uy5ԥT1Kdga4'bׅ{xdUG6TJG5C= MI1Z9HZ?HMCb@qE'%!8yBύA1TǬ.5KG@q:D'Wv}N-0o:d sa.}K_ "|a,>}G;xpv4i?m WTտhBAB 7lÍ籞74`,ʹՅd{BO"K)4hJsqgp({ZrǷq8r^R3hBd0L~" 6~$~߳9Q| ӫ':w>Zd/پLV^Dz?H?&@뇟6TDBOrN&ŮX-IEv(֥ kU=w%~hɶbA) C1͢Z/7m[aM?+x'a1?*w`TJt@WQC8'ɸ{h-L$z8]"R'H*ؙ_d~犼b|jLy[W _dq#yY-A/LGUCqf5X}E⫯StO[UϮ:3g}~)_+0v0t.[l%0̝=Ű\N(B|d? UAnϗ.`;AYѣ$ƭ>쪦*thjݥ+bE[!Z/ 'ۡx~獣x~/G=ѷwo7ҹ0Xu_ޮ3l9*4T3' =4w(wl v"F 774W]l?XO,(K)Ј 4~@zK^6 tM1k1\ysF g7#ea< B+Ԭ// *0au`זo⊸KX<-* @PHy]@E\ħ)ƩC'u,} $" X\xnO X#;=/EELP;ЗoPT9g/Ѧgl:u\ ;!mٸP#Ի3=р@kɡ%p ē{(`'br_qa:6N e) _o\Ǟm`1r4y"Օ>B4v S*`qulpݻQ?hJJM51`)g {"7+ D?мUwۉ HOnh#6''%YPùV"O.> CmѱKOqH 9GйS'HubzbM4UlڡKU~Fa ODxeC>ԑ1UnJrp^ i>=Z?q=KQ^Vg JrKmZNrSgbD 2Z$ڴ5C8ըCMeVS+c 4 'Ms(AiUzp kK8 ԳY}2 -$YEh&WeN(AYV973Ľ鼒bR_u1Օ.J^\9?>s.REV[ӧ+K'./e`2:\_BO/QTSq`k\YLOߧTM+M^Vf_3ᬺkǮd 45ai 05[  4~q/J,[KE2i+R} JKro;Z\v`˨Z Vw`߹|~ B=p=%^쟧lLS}7S*`ņc07ҀBW/&E5F;~bԊpdzj"(,Rp&/ud1t+磵i U %y!GC讹1zf_7jP37byȧ3o"ڌ1o1 0}j@ToȲ3x&\:"m91i CWAظWǂsž#`8h._; :s.L߫hRSu!^o۠'߷jK7i]> F8~M~WwUTVP+KTΩ玸t0SF\n%MHK%hٳ'w߷FxGHpO+L0)ۯez.J!.5{߿*C>W"WXѽ?0?[XuCJr}Hę'a5_ 51EhSw<| ~)(͇˩05WV8[üM (*.Q(C20LhAQέݞ<c:`cSk~Q*!gNp Y|a& zi?-X@_-[U]EaM 3oƕx5C XV}ӳAg0o<$荽Sb8μJ4}ПΫ( c:c䒽Ȏā`1w3| ~)s>9f,;7.MW ~Ef?w"X?y ^FNm[ⶫ2nadL~8s-m9J]!&ѣGcܸqQa޿*fOա #TD}~W ?{D;Դ넍cƤ1wkJY'qyuQ䋀c0ED:Rq48A0w/ i9 Ul3 n]F/l;u l = 0GS+Soغ65r7+:aB*qu ) y m;~%H*EQy|9Y] rC"1- x##; +Buc*'-="7^C7?z{_7^ӭz Eg߳c1ZvQ$ՌX[gӖo [LB}p;,Nq91j_Q kKHI (0ed ~)h0 r21Q_pzN}yyu7cIj%axOЩuKN_ BAcL^.m}3? =k0Hbgػ{>vF~Utw_VcOZJ:D NK"ϯ0/q1Q = 0}h@U{L!׳ : -uA4fjAg+A;錃#t7y ]Gj=a LLAZ\\q9hb1hdH$pVL CN]ЯU IS;TOrIGL7)k`c 2@?4F9Gᛖ05VtOI7T7#W5n{`YJraa h]-ՇhbAhFޘeHz,?wv\|$cX}k ~ Q]hZ 4~y9WWZ+CjK F~beX =г@Ź xoo.s;G8 C;buP_gU+ _ӻ'DLUી_It^Z&#ik+0VCd(ck#Vjp_o-00Z \PX_g~S)x +S>-96AswW'-{Ǐ˫8V{0hD(--Rezg0M 0`6_='IDATTgKf?: ;  |K6lfg ~蛝K^Y]7llfj/1!^06f |k6.}-!/7mLf 0&mkCf1ݘ 0`6ukovmu<}bsf 01ovF9Ml???f 4;`cF쌞2:~???f 4;`cFsdi3o!62$6{n]kf}:ݷ'x)'B'{y7$ ႤzWa4 ̮e`6mSX#1>EE().nVLip+x{}c;"/'y7$я|S ~ ~u=i4k p=ǥŭЍK%%5?xy `vY숨tn1]S x.44ƺ^XA]" 0hdxl1 8 2Rľ޼~/dgf@v\]:qu {Yggn!;#yo#8?fZUh0| 9iS}yEHPz312m~^vs\o.6P^Cϕc՛O}  4)w2ӐO$7xp2[nƚիfl۹v>Ȧ)UExԡ8vRr:)l݄30T_}?o_UUq^_Wºu1x #3U5{^n6ܬfmχZ/}3vpHUFtXnXM5e(k|H oC,1X[CWFDr`JkwL;dtaG u|/+eޟ03BϞe`a#Fx!{p\M SFxw\+fMK(\>ҽ0qj<~/^ $9naf&]+nut!ܐNא'Awy~܀SxWMFm69&Y?'8$'!R!n1b45ЧOhÒ:J9WL~lL<HH-,_Vz o(sB6AC];S~z_acYYi1}0M.m{/yc~Y Ե~< r3OtSClD8p[\?$ah1 Ym¼)!)xdgQ[~~fD:_JZ4r)M.ݪ_Qp58<ˠ(ul9 [᧟@{HGN2:8!+;94%Vt!VYvKMO]A\2/\ϣG1ȩbÞ8{# !3N>AݽS ~OiǼ>l@ַ~T[@vbXq72CM-!: Ӎ>19G&%$ lOBCYkS.E#/1=tж&Ȼ]}5^!76- ~yyHCtħggX_4z+` Ӥ4xpuu;~/0Pc[ ?m:F )?{4=7L2J":=N̄5L ekjAO_=Ѿ*痕.™[;'KS 0hb6P ?>H+'0n1iJJ %% V5 @G0h6Ҫ&YxB+ 9վ8zO''LU+v_eY((R[U lEHʋ[@:p0L?#ƌ::uc'ҰKE@Ui.$O.;3oBܱ~4(*CECZښPUŮבP߲*JPօtuup8 5 '{bkb~U_LgsS.*/5I2xIxǏC>'fPj>Σ-)&.pC U^KF7yF "ω¯2MAԧ7FP7wDD SpnS(d<=zwOOxzy1" cLjI%2F1|BFs ܹqQDW簈WFd"%!΂zq;)e { ve+eiٓA4Ϡl9$xs6C{nbw./ǽsǫMG̚ ?4{ټnʹEeQYw.A+߅.+SQvvy9TY縠Ε2qp0m..@@l@;HNʴ϶q!)! zAQܑI|24F\|2Vtf:7twفٶ0ADs|1Q͸ϖҎ9#:Mz312f"#`gsoIFlqёpuY{Mz&{Mͤ|2N3 qт@^4*cz312?Ci4l wn\ST7|=4޷.,v-7MޟM-xL'?E>& \?O^_``z31"4 dR$ 8==ZֵZVa>|(;w}K͞Ϟ!ҊއP>DE &߿m ~ ~2m,/d:7_90"sMtٽg[???f 4;`cF[%ż4f 0`6lR9tIENDB`fotocx/images/develop.png0000664000175000017500000000447715247006660014455 0ustar micomicoPNG  IHDR@@iqiTXtXML:com.adobe.xmp 0 64 64 ؓeXIfMM*JR(iZHH02320100fotocx-25.1: Paint Image| p]IDATxkUU37sƻfhQZZR91hXPR# ,B I$E AC%DIu̹ۏϚ}9kϙp^Xp.IHbFI @-@ eo(0  zOB*=D2um*5NrH$$=*鈢㰤G<_L4>nMsh@E[!UO[I$+4QRIG7J3|I񓒞TJҳNYZ%̒n(:$m|KYrIey].iYM]EZ_U~ IoX}ԯ+"QOI[}.u%!d3/C.d,2|f]d~`^mTv}(`vTgQG ֳ̤z9Lvmt d2`W|FVt;|Lt\RŒνpJjFI%J⹬Nڮ|#L+}>z/OozesyW 4b&D'c}0A~O'޾s뀙Ap P鳗r4'y7bnC%x%Y `F \FLJ-Ep `Q`4/l!Y`$VyO.| ?a0c?aP*V8 9yXm{9Ws(&Uu$8²9-{KcWZ!qeW4ve7*,NZ1ǁfˮ ֘g,gwD(\8m{Nbs EtxfG'H+,{˥`&`xH9oȲ,ʼn~>n f~A*@P7.p聉l;8P7.p؎G y{A.~.:'cfI,^JS<tA6aAeվΉr~QGj I;pe r6'| {WQh>ujR[MC|ˀ'"H]XIT6axU( ٻQE@5$/FR-):\kcMf25Jǥ>J,Qz:gta2ÂJ{Rqwu*@P~ļ)Ǥ%ݬp]tֺVJ ʜ%$$-8 uUҌl_)LRum PԵ)5IG{%@c!'˽&I!iMpǔEHO꼍}J&A^K:mjt_m&nNs!'4V2sdrl*$MSmJ#C%p<c+Yƞ|& >ٌy&YQJB&p$=aTd-jbD!c f FSZ.b(6(6b?цXsIENDB`fotocx/images/color-mode2.jpg0000664000175000017500000004736315247006660015136 0ustar micomicoJFIF&ExifMM*V^(if%0231K0100Fotoxx:resize| Fotoxx:resize|Fotoxx:paste area|Fotoxx:Crop|Fotoxx:Retouch|NE0Photoshop 3.08BIMfotoxx,  http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 199 412 1 2 2 0 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((HN*)%qq6.E&TdDnZٟ:Fq@9k(]֥Kz&5Q4{gISbԮM|gn. ]TV{z^{yODe:&tSz{E9kJ=p:>dMEVfEPHii %Q@Q@^W$i UtBn<:Yzg9Yz1VPq>GحqɎtW 1fYLsODZuՓɬƘ)a֣m$Vb{`OV$ީHN(ߍԎ0*U+*nFO~&*ڱ>M%gY!EPEP("ۙv7-n]4VV5֫V}* $2Y+nrqn=MXiٴ4q07`ZMXH*$G&s3)9̔WNIɒ .$vϵtE4ӔYg}F}hh?&Ol-+]H+]8@Cd$s\p>sl7K ;4ȉk[qh89~}+]:W(=1C{Y:`ŴVr1Zҕerɛ A4<)tQ-u'A7g=W15mdvi!!Pz{mgM֙JJ^B U_On⹡iv XYcY"`yڮ#|5=ՄrIݾҍ'!z1]񨦮ys*n2s^2m脎>Yp{WRWn6].F#VXgo-Ow5d?bҬ! WVq1 B Kkۿ+ŝY7ӡiէiҩ8CvV^9ֵ {I93|W$O݊y23־,m/-P=H'9zI\Q j[F$pxNn)3B-EJ(() -!(*9[Lei5rf}ԩ敂(zcSv.*1ánegF y:xxfǹ_~ O&UyE#2AbNG^I}rmpGX֛~lxkynA>H(Ȭ?r`OL[9Dg0q:s*GN?‰*.7*w- ӭ6㮪Nҭap v8([4 UUI U6t >$i="g=ƺoڊ,.IR2In"E"r(9<Gb(nV9_8SX=jOl ((QE Ϙj{'\~gLi\_Ee$׍T)gM Ƕ :cZ@|ATW1FAp@|{c9C!k qy1ɿnKlwKur2rA=OJV[$?Yr Nt-vdH̡N{cCŮ,A en{dMݷ<'e.Td[ںмG9/j(qҹӾz-Q$ՠqdDbE s^E}PrDs/ iv~30CvzntB]<a+؀_pO_] 63԰U?[A$LM_v;G(D%\9p8 o[F=3ֺ]X֦85hV {szVmm\qKAaHii %QI:K-#1Rb\c###=q4q٣%2Jof]_&Ʈs [~7ǸsۥYJvBu8z%_ĭ]++܎,}\Q5t}}r+˫alw/F$ ݨ,lLrn!&Ϝ8|wc0G_YMo(P yW[z?o[E{hbr69,z{V Z$gbI,y'WѝQXV ^u B!>{צxWT]cLB0v{WTFI{G +Y]Ėc"ްWdMY\曻4UA#\M%A*J`9 jmXwtu3pgc(v v+sZv8[)#9'rSsR&QE:(R t"2 "F’YwsG N7Gny?pO)e$G'ʱx'MSX^*X~oĪpq JɵlQMaU؅#t:.MmvdR{Ez~qpcM{W#%| g$q$JZ'Ki7ƾt3?y'Orp3Wk[g0;r}kl>ۚLpQv$UF/bM{%+yڼƮbGv^ kJ @ؙ$r{UզG] g> -gʱ¸^<6I,?wlFœ,889e^CT&4SsE8k[|E*Q"" ؞m=GjmÛ&NsosT|c9h3><(Y55TYwە#== Tn mDUqǽKwi#[=M3H˯"E R? 5[[627pW 5깝˳I0hoΌgzWnI3#gX|8b09LbN/i \%չBnmx{SMm*ģr)f^A{%dOh>)EXb(Rh>YW+vK@ #'5)_R۰NI1+5<}ʬ[$:c]vZ,Z2Cp:PLE\Er,5h$51B1oet."1z>Dgڎ6 mH%Mxƻ MCntm )uӒFOI#XGt|amM΄mOR}x뱸vʒ^mC+ s;W~4׼M}J儒aO+yoФtyeIfb2+g#\ֹ221;gN֤"f ayX2//'G+;Z&x.$w1I7cלwy [yEE~p9+mP _yQb`3^_fGMD H q6[z sy~bal|'{_ōFF$*6N. $V#S(RPYUI]\&.-GQ#&[U>_p ~\t,k$H;1,aCէLC+!郸TcP/0'v8u<DI!a"pIg?\MR'fsq9ش&4mm-ڎc@َU"5*"t0x#QhSY ̊8;q9jXԑkk|K 9s[,fj~վsmhX"9ykcmWU5YAKVc jJ}khRw )ZJGU{Xٷ#ހD+r@;0}* 2pH݄źUMl)EKsdw-$;~"*I r62<Nˀv8渪|w:⒥cڂ\X]ǟ2@ݿ1X4|Iosy4wG~u[ [] sm<"~?5 ۃγHFf9uм3Y:YF/_E$p+ŻtG l~qV<\.:AEf9<㚥rnfxQK11F@v⳴dޮ S#=zUԦ!Ye˒^|ۮ0G5_Ü 0"=ڔxB2O5m?_kFR!5#$FH֤r :ѩ|A(T4{I+=?JR8SsKI#Zݸ#h.At¢H :ʴ d zW}k/EmeAB8,|!<|ZfId~2sA&+"uipx.Rue=ǵ)")<Ã}RK>G616GXw_׸}1Hĺа|鰎ҽŅJ; {ft/ExKȑ ?JUW:MǶi~meۉx)WY 6ʀE HW#z_.AnT q]=${r]A E8z/ū lucߞ1+-͎q̎cv"S7&3`uyۜPlI8'>~IizHՌRKe !29k=-KLW\{r1$LvGVp$`~TŒ1\gPkХ)}.q hʔ?KJnlc @Nqթ9kSl<)*@ƒV?ZGYjz5o̹X΃q^W?dʜM#0+SRI@WI))uu8l+Cqq] +1TqyWqu|٤x$͞w"iy~ } BqE|psQvV&CbvR$7zV6Q ˟ֱVNGs]h_j$1`o`^+/rcWnsZk%R?vwLg% [DYMwbE} ھI,spo9?ڲKelz5KsMSi Ml ɚc@>kK8"!5FoswBf nn=wָKO<6\vB?0g.RkMT\D1ެCf8I q7?."\8ՉClO҂m$u@$/z.᳸OH<¯PJtۈ"է9;%|\|$3cuL)k ԡ[;;i]x#g±:_Dːb*+Hϛ8ON?zFA+˼ G$}>?ULNxⰑ٤4 (5% L}E>'(A@_YOHj;V`y+3TERc<%Fp={+g.T#gltҾqBQ_1_Kp5QI[h;]{nY8朤SW@MAڡPV]H1_ϡWm4򆌌f?S`17иcq/j$ 8p<+}6t]r2=Fkn5–iYB5; xcpT?mGzW1~._ Բ *fe~:7(_}MkKokM!׷42Ey,~ [advY*孭O0WiC`7-c#ӵfZh`HG zuBXiX/$3csCѴI,B:w* u6Z;gW9j"DX i(boXYq~'Rg;t>? UA8_ʦ+iYz/%@U)66Q5kN6J(YwJO*G_&p8QҤ?y_4D~GLץhrk*t@E5>49TrIPp'=7 +-׭ud5qz4\g3\y<&'E&f3_SxV_ j$5ho'$cUv\z$W gqM9*B{ 1L2R+9@T,ʠ-p ]"\ȥ0qp3\ }=+4Q'W<xF&IyXojK +gQ*G|vPu_8$ 8sv{O2IJ9⽃vYF[`8IU[m 5ء˱qm5EfnVPrY5I*8=+ZJf;~@rgeP\ɞ&iW,^c2jӅbySmݨ cC{U5][X2@-lXVnpO8k.,帔qwZW2ar}rՍz CZQzwcZ$}\Aq,1zvtkA`Kddm}kOevĂc~ݘzhMkBpa&Gҋfc?[@\to@. z5z>4;QMt1idҞiii6 ·Ep]VUlzt0['3%Ʊy,qc743`1dw# \wc+Mlv<ҞI+Z AÃӭFŒ?&ũ1 uIpM{g|Yg}nRF~Kv"W 5"0IQ㷿{׀<id6OGaRrV8/";Scw2#P[`Sɯ;TP`9=ysևҧ*=@#9km8[xFLTYbFf~tӴD`vE{3,iZ 2XiN]3<{wdFP IS]qrg:k]6exdW@{--aY?j|bl2C,1PH J}ZTc`uSi{ȇ| 8~UcEBN6m{}*dzsaxv5V-vOhRc=CK%̑oXhWf̜(AasƑ |~Y5;m+My#ܣAbz_ssfPf0`)k2{\:ݏ=sxsܤ1/7'OO;W sTKǟ Szg-OVo]h;4p?2;:KqnUU{:c5qHg jHҼI<^ZrxfMQIp|,^M,?Bqz՚In$@?098Rh,G⛁j 2Lv$5s+q[DN@> y,XFe kyamxX"ʰcGz9G_K v%34*=yj1jڼ7 *S9\W72@89qǠ֭4EV=ܷdע)חipA \ڴHN*5 aV+#eY+/R8Sl?W%{5k!} AYiu,X,hxMp0%6Ō¿Z1Z( (P?Zo&ĕzֳ[C !3íXY@=jmWEe<Ggx'pCo:ܶ2=\+9$;}ZI_u[+y4y!^,Rc:%=HUz]+DxcؘH=4JsրVv،Q-ⵡ5}5M^kԤI9-'W@#֡2v`t63==TXGަ"UglcCdP(=1?Κe;Tc=*{WV# / 9hl雡g0$OlW:1[D!%͟OZ53&s;c*z(ѿ+k3:pď4_9UVѠ5uTuE?ZfL(h:T]d\~*d{w*ēyR;D![d `֤04Vv}+KK:%Iٜ6zR|=?jָn_>d cG?pݴ_޽⎞eI1@}*X[('fd_SUkYGۘ3RK!iVwqx3]%Mے2E?nEx7mM(-Vu.@|-HGO$mFvTINA/o)mBv"S5A*1_z_xVdQf=1{?uy?1pN1qQq+dձ>esnR°Fwm5RΤd~q%A3s̟0NsɢkU=[kWĂ1ҷ{P7ʞN#zEM)0xKWB0t yu: QW~tx]gSE3'mGkB) ) P;=@Ob*eKs@#A>`)XHH#QEp;)sڍ\Ko2 ;R{ ٠ao9=qE-"C9@2h(od>:GȪC+WgE[|EQ>cNiTXtXML:com.adobe.xmp 1 2 3 0 0 183 395 1 0 ,:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:395 height:183|fotoxx-23.70: Sharpen: median diff 1 15 15|fotocx-26.6: Rescale: width:356 height:165|&H IDATxWUٶ.m޹T+WYY@"(bNe`ń &$9s9Z{_{ł e6]5oG_-IIIU===hmmEKKx} ʀ( N2ۋ?0@,.D 2 n bߋ2 ʀT )Da )d@SSP__/\oUes}&meȖ=6a)ʀ(TVVeee(-->+**P]]-d3s9r=>\/x\vmmm沫PWW7HpA!ˀ KJJP\\<,8' 9Ώ}]\?Zx`Eg6|ӱqYW hT|"rByIQp}t7wηQX@Ì&ac-U@,[7eָ_Ȗ-m3/YdGф`rÛ̘hnSݢ[!LHTWPX\<;cF]:’U7">6+c4BUd4@)w9~~es'*[0˶e4eE@P&ݽkW۱1<$m!yh=<)M,ur@rӦb̅0vGG[=m*Ey9̞= _|Cim/¥ض$+G$&~qZ(޾ûIنCpyct Hsr#" an0(uU@`&CҴDل57YH |Mȋy#:K0{6+Ci|(Λ)S~2a-1NF^*y{(bCE0;(Fse[Gy*As>CB0|*,,Drr2 |_^b}y B7>ڿ `wThUԱ =k:o&P@xdee!=3k^QQ_oǣ 0۩B@=m៘f塻Va֜|)i0e墶~xc5R,s|()bfWX{f&U07 iHDPj %j@nFia.2Ӑ"T4_~Q^\deSdQ݋l%Jyfdj'H( ^-ӏC?8wo,5 /Na{. ,YDX ?õdE@X'eCp-D][pE^ yrE(*-*5(vxz60T @X 31?Rr)NmPTg> JN#8>4/K]:POC]i\%Ҵn8tZ,Ұ:D" (ʌƣo}*KԱn\_'0أ@ -qIhVW.[ P7o QXX\?kT}J;O +6_h Hpߣ'~s`T@b D^v^^b lkk+%S'Xf  TYD@lq?"3QR-cІCئk*c24EBkҵ9U ^r5 _ߪy NF3sAEu&"2=(A]s >M#dWʖOv,PWitBy#k%)pgMҢP;ly܀+X2'SƆ-آKT1s"4@qm#jq}f̜ضo?Wq+OjL>+u}^lڸZO/.w?0Y|ͼ6^N?<{fWy= _^ Mׇ7>R]Gdr&K ^S[6/\pYn4Yl\@6pFFr$^ن-ߦq|8cZ2wyaќ+,fVN{HoB&&MwɢyvSRNY iX#jVCH|2bq|b((B}5!'q L,iMZS۠<*kO+6:ksaClKc|D!:5 A +LIGI:B2c;e016m!Vl9n" P":MXT\sN!Y SY--l.=:dx0::T] 1WyZ@E3?[k[Bq%M59c>acddp<\cMد<^  6z;y/l;fs.?.|R,wQCwr6֢ /cqKl#.8F)/fd@V`럃qsdlh0 ɂyiG2vg<& {-%V B 7=fۄxdV#xR/.4fo"TWC~<z4#6vi=XI PG& Y@NRwJsa f͞|||;1ҧ/4#G;1ؐj*ܾ}'ےE 7fTљztww2d3?CASbGXO8a@.îŘM^z %G\Dj`3m&M=ٴU~)a '40Oa>n3BP)ABpPp{Mdwt)b2|̓.ѮBGlaSW24$1ApyJkq1E AFgϞxXs'6iӦa.^z7^շyY `G\[YYAMMM^_^8?D2QVv .]xnBE]wPI #kod <sA]{?L"\}]6Aj/GElXDno tF=aV0C;H ݈rrWK#FxO- Aqv?G1 {xQ:'HfKS'sLiW?-1_A 6_CLI-*3G ߋn~ENNnd*BmvʶCΠvd~u(r! Gz3` ]Bx'XCO!}UaLmܟb֬`3%%Ɇ, GXD\Z46ն9 lH7P dV!x<8rڷ({ؔ)?biI]ˎCyA d˝@Yfcm]zRb,(С֜msh~xJ\C`rHrs0:Opƅ1Ȯ&"4e鸩sc#dB/,3N%6{)z~zX>ȶC@M.Yp;xcisopǻpR-yeK1-jd d}6W!:lMۼ 6aaܺ@0!8e c 9܋GSC-|_<x%,=%7KyC)<=gʡ#1n0<z9fF8Kw#k+Gz,/ֆ8znuCB/ x Huц0I%2is=yoIZNxuّpubӖ8~ђ%A{"yY(B)$s vٻ 7c˶=8fhǁIN_<#8H4Jqxc]Ʋ]!m" T(Wc}Wcfhʬ%3X! huvX˖U~" ,(o,̚2ݫJ J f1q=Y)߱ k[>۫_,N7c\1ͧu38)AJ53wCbD\q~/ /E@Z.AWli." ,(. RARz1N6#ix@:4`! ByIz>v!" `T @~N^(_4a,3V7/ٳׇ\73H7qCK]{Z8:淨gp!nY7<MS[Pg4,?j+zpYw +)ݞ9bS9TP<~>?xn)ҧ]-,H'>uE@H$* zͱfO]ED,:^YW {8O ae[ȬDgd_4jZۆa,LV re}}q!N84 ,Pf~SI*.nU]G0YDa~f4aӮC8x8=z:X '_ d x)++E`` 232dff 22QDOLL~CHH02АLxK''' yq(!;;~  "!>^+ #QPPo//NiiT*+]SxXʅWN^))HJLDPPrsB(X(+1!QdX)#ĺ>h?됟O ud6OOODyANNPO_J[]U ??_RR J[ZR,􁟿lbcbPX/ʷ⿹Dÿr}IcDZgZ߸7|>2"B.Nğq775,Wݍ}vn3<}tV6pKAc&κ0•w1멛ҋe9uvNOwl-`52ڐ3k\ކ/P\fs<-4յM>} ' q?Jڬ0֔tplw€ܙ S!ĝU[ *CnnY3aTkANtJoC&nAAM!=UV[SUT2g93suԾHDَK8immhmD\f2 brT;pGuC+Z$W:>o_@7S_6837L^̀U#XF Mzo5$CZW}fɕP;-$U(H3f`9Qamt W6 Ul m@k%ͷ[5Q2te8*+AN^vWB)_x׻.iaΜ9P]q:=xv aV^(m:rvw ^٨NMOBEy)} 3fK7PGr4*5cBS}oK9|Ͱ^cFd Ɋm \ E̜5BBI͐zn<k¬rh^vǶ㸨P4"{BWIA.>>5d^\Pt'Ι"zZSx$ &edKd q-7j`tKƢwn}wT\ȭ'VBi DUHc\h\z ;0o*k#ͳol\ 뻨lj= Ɖ=P7Y -_XEg,u4M]/#6vA Է+[YÛ9q n0طT` Ta Tbr 6 "3Au' ) JaLG -J|p!|t V۞BQ Sv멪HkÁ58lKo-\OcƲ=on4$>2y<D87dS1Ua!f̞S`\9,azuf;h5B2`g-~"3i%RaKkN w}P8Z+ď?/F5m!FIot). IDATBzڋOM>Ք̅CC,ZM~2v_ÈU_)W,>$vXLn`ɂld ;/篿N7 䪲⏲ƞ?9[X $4!]-MMDaN,̍Ca-ٷSjdk۰z;+8R"P+g{UJ|477- e []1廙(; kXnn.uNe&!).㣩pkǯcBWsC\҆nGWR9Hv4앑AWm~uCy'c2ш0ဢ6I8Ix#h@GV kmȮd{FfK\~5mo6r|Zsv%ޤi!I2 Ss!{_U?`2hY;sK-^cuM5`u#@croK)\ڊY*)r82 (D .=_lj"2lEV6 Ӧ\ܴ^@̓ <>j<8%c xbpAd>~;̞&M}C#[i;?|]E=Z[ lho%Sw?>T1!"qk@i3 ˾.\FxIW#w5X:R0΋ KJ>οegk9  /psk jbs'u  7623Fn9—#nTŻbqEm/֝JXyL+]#qoB7k' z;PaɛiA5 64ETZ.J攓DtjKp%5\KX:{&OQ>R [ǠXI␙KnBHƙk1kNxQJM_c sp~zh< 1Bq1J  "ao֒7 LӤćG(n&7IdtvJNNܸߘ}R}'ݴ˾qw.[lfWXbfq8/΃bw+2,!N}aNG4^qҼՌ_2ǹ\"Kep HNJ\丬LsmRޞ.xnrq fibgRw npԟ\$RJ7#fPv{vgm~ f77f,?Η'2 Ǯ^s/۸9vc_qgEyp]GGwirs$ԅ$?CQ!(EM9? VZӯli94G_O+R@nƭ[7`Bv;@gV#`~2Ln5ܸi3 x&BSecN<\P033mǣyP9]qF[35s kxGeЌ:~cI *oSTsV"Xu (~yZ0v,'(1F/тyyӱ-MŃ[gf5Vƭ%۰a=4tp?%2a  *9k3x_o'*D'2ٝ|: 2IN#<4e;UʔV0T򀯟?!75Q I~#;x]Y L^‰!aH)Ḏ"p͆Aw!6Tg#2d<LrޗPDRIrA 4B D .e?0E5 `T7?) qlDI"%[^V"@Pڧ=-*-D- ))(.BGP$TJ[pQ>-4i)֞BSaq 8H6Iֳ2hHFV.i2sL6]S -'GϾ곳(z{哐|IH>M,:UֆjG@\ZZHIԥK&="4 s!󶫹 Q0%pTl")L|o€B)Vs2'x0HƝ9ёMQ7>bߎoE@% /r^^y"%9tIfyeHrX)7㸈,(cv`[58:X=[xP`)b`XӉ`{ʀ" TxإoW{HL,KȀ" T<ӊ`ɀ" TF*(tZ2ӊtB-v9f75޷ (G\de@d? bKb6D848atF['ҽ2:-uk@ ^D@&IX:l߂q >f 8bPL|xBw@ E@ 6 **_t|VlEDo` rG߶14>,Z Gq;J 3)q;Zqx͛E%%c|:nQDx(;Wal?f@A9L!%Å ?vvwAyqM3G L\< B5k~ռn}8w,N8ǎuo":tHPtX݄1=FnU@[i[ׯ%yBN*M?l gs#+(yxoLa#AT9lZNǐ1A;=zl(m3hkB:r=z{ڑgXGNuh'^z RA~ \T Y_vȷ>3Wcz ^0͘`-I۾XX{B]_Pv8]k0xH/m0n;竡 21,F~:"MSOU r?~Z}M1ӽp9-e/&ekQBĜz UWpE&ES`f-'䉆𞝥rKt8x1O7tՙ ?Aϒ)f3cYWC \Ϭu&Im͍ПHob|uw/R["m*SX$1buiŲ=E )gP1fN{6cY:m-\PP݊Ҵ ץ41'J`). $* ?~D=e״`濶~A@^3/=]  /8L; SP Sb!J;u5!7W/>OS[aA!._Uu;mc"4ȗͥ'<|=<>澒"c7@- .;T&{We*,.+gS#= @zvE+De+&;&[(srVh7kE^BY.Db\" f )[Drb"fQX;B9}$C۴0}LDl L@^2ŤP< ?bi>ɀܞsD$gz׍8ߵ p UԈ$ 6E% /) Xf{Y&,ܰ1uƐ ?W7CEkk@^<0#G[ < 5n;A:7_eb5y%)b6}'1iH&rA=VM(DR~KqatQ0I睚I^qKn*M)Tr%YN䴣J LD`7oYx:ɩ|g@^4 Kִ_7<՛`^•{5HU}>k+j3.djeb9:ɀܙkaZ#JM jFݷ`7;LQۍ<`d|;K-_o{. |;N^˗/㒱1.ʘO!<ةm 2i.Ů *qǕ 2}5r+7!v4R xCQVB,8~!6JAѐ _5?Y9ZpMIP?=ӡq2!ohy؏JE'xS牒|LX>־m2Ryb9{K9kx V)`֊!#J#UL\} :wg((j)_mͨ!Jh޽*o# @nbTvL khH8煋߰Xo\GLv)c|WIC~q4OuDԼ9 nIVU=8/?u#l32Yᩇɢ4 7v-K("@kK Q/_ [\QP11_6"*Jm J PJWmʱ y$5Ud+ЁrtuDV- n=B nwud-j|9e ~f5Vb=m\1w8ОˠYoK%1C&Z(j0Zw<MܐW^"$:bV$"]}PZ`t:<"(s0iRY?FyO2 .+sP(Jvz=G4I0* -#G |Ww7rUx#hh9(skN&MEgwDi;g=y3f~V`af^MgoAbc2Y(9ʆq;)2Y[GǸH_%pҽ'cN?QSJ>~lkA]q1+;%^LF᝘3`B|F}D4贳!vdsADTZ4^VGtmD^z3sHycTdl~z ^¦[&x$P=$/ϩ#Xv?)PZmQN>WBnLMHk6BǦ͟q4]Wd" ϓ & hM5W? _i=a Bu4 WφĔI|r{y8*(ak_Y)?o_|)f@eXxMo*pGӰPb(pMC׊|bcOȱvrGv9Ŏ3ɩ6l[0iȈ c:qazyUhۃ"Dz?Y:|FQĿ7,]Su>B9+˭Eyc f|=Q~!r눇2+mŌ? ݔt-PKod 5Cf IDAT/#çXdo8(~Ȳ ;1UW'U] k)Gy:,19Mw[ӼwvP[Rq]ze`B0΋m*mIA&~w в-֦͟SNyd/g¼,,FhlCex DA?]YYf |"$)I(%:V.j"k|E@(Y*ldЭhgA[NA}E@AJQ=q!N3S .CCǣA{b::ڼ"  L@`?/f yeWVR$NωO/IpUAiE@ DaPm{(_n)HU맱 ٷ_xDj]B*4A_iҼ~OoBh'#=oxJpRrq㰚:Y[!|P}nR7>A2"8C;Ŧ᫃NJ]rKrC< mJA*ϘSZ] N5 skqru^ϾR/cg~0J$rc}Nh?A1w;ꔢ_ٗ_s:*Sba<87E{k% ( q?fC 5m]Gsㅣӧ򱓧Yeua.6U1ڳ;vƶ;ډç LyރBDx=ó8r8.^7GDF)ZM6]SUBq@SOહ-bs69ntl_~E~%p1|EFqr=e{/3)Iq+Nc3pY0tb'Ţ(G]L[Rd:Dnu)%U  a76bu=ie4Ң|:O戗dϸ.\䒏~՘Kgq! KP(yeY>2S89}hDrUu?:B.DhJ* KWZ|+& .!.">ܴAdV Wqx'Dh @+S_DYUT7XGٱgw>n@>* S# Yo YмvrE 3wTs@-/NOŤgQAѶDÕ]\!,. 5Mmn0 lUm]'5P{;f`lh׼xx=wÓ'O퇜Ft˘"( <}.KNG.戀< RY')/UANeu?:8f`͊ IlIN_ArJ6bazoRw\Q~%O~yl,8ݾ1ߤmNX"5gIdT."$2uM =H􇧗/rKgHHDgg#SbL^ȫh=_IsIOV,ʆ3OS^OLKiOܸنYYOQl'? .0t4HP ' V+N>3{&uda,_u`:نwQ#4b~z "k_%ώ@ Cqo{ b&-\-[vt 2 bk9݀uX[`|_k|kr3(? rs"W0;tQ))ix?*/hJ* POoLG P4jz)Epu"bP"CH`tsX6H>HPdlTV~JATxpbٷ8xm,pΞ!ȯWz)r&DT7> l$bfX)a{@苴IWMItl/qyՍބ'خ'"89vb_k ͛شݰl:q/8M9g-Ul74D @eu5B_g!V>bŭq1u[#n˜.GޡmA%t^"/I S9s:u8e0nQO+nvhkkxNĒ9%J|6œ⁍>},ւ_Q%BMs?\b gws!(Ǝ"?Lz*N䴻Dh!Oj&yFM`hBVQ@6scw3Ø8˘)~`V Q!͜T\ؽrfȖ. dM4y.v=lɂ32EɆބW/X48jۭ.msNQvzWkl [T%F8rߗO$`_}U5mhL$: 6GW`I5 .%͍u"3ZPp)ĨM.NCuX:{L[+5Vc"R?鿠ޞق 4w=X[…Z'%F u.̜E+aҥ\_a{d5DHM4LӈZS~kQ6DqiMv]"9ͤpk_IŮt4 QC+~&ξ|1H$qhl4Fj8k}/}-ȋ $%9F&H 3e/wS{&j%6 \&@έL]y8 r+!Kn20KK L0)#M=m9D̼3 }*KHB |5g1h;/O?.i_K"zvx)\|4ؿZFqঞA'̵t8֌iv;TU$ɨꍩح.O&gh @~ճae//Itc53 U VP0~no,Řp=\KOoR2;X>@h\)5$B -FXBtL-2zj2xۇ Yʧ/E>0Ea(?r+{Oe!c#lЅ c*I.q#^}_ pkO" wH pr,z . S~|+0κCABSMԴ,+̝4yCPw⟲_2h͂B?;] FuP9_xUkq/V~GBnHXq^c ^dt؊K6-ږb83f'|_ǸrE_r`+vų,S~~ 0>J>` `  bMku 8oȤTć⮣'Iٻ@4l6ģ8,E/p5 (92tW!€K[po;uJK;{ ~M 7;d3n>|"] s#t:&LcWࡻ'<?␗>bfh&wdmCkǶa,3l?O=GP@:db8өѫ.ʸ©#ذex) Eӣ! L^4|BZSajj S 1r gA*? mQCL҂c2̝;;{AZ?d\=#V,_ S3Z\k(Zl@H?4udoWPX-鳜Xۋ'Hy5C vPX-YO?Y 5r0Y7[EU[8p|Z]y[lE,(/3%D@'' `Gm(E<\hY#?.o< 3 c㸱E" ARB,SQ^Z YsN~9 @?` ;($e-qx\~ә2dr:`$:Hb<01]qEܺng̭dwpy[G jIőU q IYK"080s`@~29 i@faoU% %r_|'$ OӁQdQ DYmBώ6%r).)yb ?Me;JMAhXrJrQxBRճER%l*.Կo 2˘mN!^V {c4Nc!$&ީUBRS.бeg砲VB=mrJt %%򜝋ց[{P4CLAyl ZFVV*l{hE JkbVzA$MT;WOgJBdgW\ǻnĉWg S"j(΀Ewvv3!Q>J |.C,$c|'cIY_C"îUKkp;3JfeĴ/ ƑdJX}VKL0q|>剢&} ۮ߹5XhԬ]'?锿9=O*(3™b_DLu'jD=jq04!u~6Ű;21KYǿ2Km|LH9m5k%ٸ~ % J2HלݑW< QT;(VV-r[N 7័ mw+y +(Dq"=ۥH#̚IL`ut0Kـ`~rz1K$3f YӐ ë|OR[Ɔų5붪E@bąuRFBl8E2} MfZ*^ɳR0lr70_!_˳ޞ(-r2axm:^#` Fvˊpy< }7e\ap?](r=atf1 j %6xBTݶCNLXz<\ !:J% I&Zk<,FIA.lԷ1Q8=Ȋ}7pj$+{ʪW*KGYv< 7"QUUO" I"F]}Yݛ8! noπ?,Z¬< r02en,^@|{:NV.Ǡ{`ڒHwSP튵&Sq#RuxV{@o(VK y}ˠ,Evip̙$uUIC31$YX#9j.wuhZ#08? % b'9$]t {3"8CkZ:9&Z\jܥAaEL@ .-A}]-ܰi<,99t)Ԣ^G|-NB~I jP[c>xm<6H* q 'C"^xˢ94*2neׁeS_/cw+ҞMh,Ju@r8R}q\.2%.W@ }Ȋt!nH%b){[.(zk1=y;IDATo!wkQ2X#P@w]m *DغKNh"ENu~\};Ӊ䫯W_}ofs_%=buH +wj2fsO!YS׿J(" sO!~0G1;X}5cEEYg?.*)sR`@1`rKiKd& UHu AH̃Tݡ75K?D I C|=fb~t,ϻ7p3َpY Hw'$ibqUDias0kwꍐ>V䙕,'If̲e(+"6=3*vmR7Xs@Șʤ(]wHY buuvۣYqJB41ƅ1?md\RVSˠ݉RUW+N(8}gdC,b(. />桬"?ezzbau7*+,,¼lH욑j\oߚ8 s@~A`ÏA|L2K*k"nѐ GO쾝YP[jC=Yݥ $8w2E -ݟ'Ȫkk_.M6B1FA 3_';dEi\L\N]sq 2ŮT_3zvʁ8Zuۀd]!+“[?c9m'Ν` [qd&4ZMY^4 N=@T)|jȂϻ0o.^}/-Z,[n'Oу{^XqN7.H}OZ+?9 ȭDn]2@f@mg/QGdV2 ^ykFN g_"}94OcmT5"%,XhC7YZYK+Z%(|3M1jKu}k+.fktJsp Xn. !3 Y/82|x)F 2 z$udBYzcϿNALKۘ2}(rßh@f@@` :YgS&RXT]V;rLJe bkKTbՊE4i"&M%k,ʴkZ,Ŵi0 p1tY=|5.G 4Tor╻m΀Þ0s 5*+{ʓ\0wЖct -Mp8h xY b ٢B9%rkȲ~q@[÷$ǫ;ڵVH,{!INCr}[lu/]gX[fHlg\7;a+l\N`Ï.B9{ZP4M7ԁt߾]Z*E֥fV7YRV8b\ͅZV avi) Ł &0e*jt4TZMR 3Ymr)j*Q^VʊL<; n$%.ix" u]did{.ƠƩMYǝ h(5QYZbAdtW+}\򊀊ƬVpYDt:|eAyHkh̎rl2YS`ɘiyuh' CSOCXd}X%'n|3g9jᎍ+fQ8>CHTr JW6 ½. {?A|Bpßz(p3-(kor8Y:@#?KMWWCJZ 0wnh+þu&1\U@Y nX;zY}nCM^$NŘ6sLL0oTLb :"EāY:ǞD IMtM9}ZilW]G(Q΢p7[6?EMj{]Ѳ$)PG0Ty?KNV;4CTTb=X4rЪ^̚ +ͅ67@@MD!;s6k`&+mEn0g ի a6 8^@mDk-+"&rhEx?Tg,@Yy\giUX΁%K ȴIzo#/a Ωv4cg1e(mf>dl[@C?(ჰ@f@C<taf_#84 '"!6!o9'ql)BJECjMZ!-w˧cŏРÖ E=gg9J%"߱.;ZZ-jǃr&*ZNқ|}*" jrY|56X!'z7YGk5ilC^FFZe*̘2N!BYǗ`K+V$d66ns+r">(m ?׮1{.R$4:dQШcpOn2ł !1??#$15l QxG5@dQ8Wuu%#gtXyFJ])-Mݏ6X |"QV]My r3#֐%EBQ5jHʀ-dXj2_a E'Q"?;>u,]@&Z /Qݢ -j)6v*8ɥh%+~@BzL["g& ٲyW ֦rE]݄pWl Ⱥvcg`!74Ъ),A̚\#J (KD$gҤق\s>s.DiM-ե8.z+v܊lh SF 9TD7QES3AFVl%%F5W +b)̋ʦgB\\*.WXCqiߣPP^I1jjm| 2G_Fr8ZgQNe\(Ge[>E.=@p^_WK_q@Iqd}L.-m߮*-D21%$PP\V-k+Y&o*bHfL&E*r)hl8f*WN&Pu(T#=%yLvd@-x$썀TT_qAIdC,(%uRY8 s;J:L,!g{Yf~` \' KE?g~ӝp}9ݽ OGo;eȯ‡ԋȐ@()-12lQd4*fz5UBN^K()̧-#6; o!0>+a9 s@?كRbhq'>#H\P(qmu~fI֫ɂN8aV~DDdg}4QxXH&-fXe:vQbc&MoyB*<|@fRk7#M#ШD :O} nC77JhN~o"?+-wi`^#)!lNI'KX ōYl񏱛\3Mmgf}oRJ>0tZf@fkoᘳ#'` Ѱ^gV86fy~HX_o9 s:`$:HBo Q.+.9 s#F2m+ׁׁґm"IENDB`fotocx/images/mashup4.png0000664000175000017500000005354015247006660014373 0ustar micomicoPNG  IHDR;S tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 152 349 1 0 vF:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:349 height:152|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:315 height:137|e IDATxTVY;3a%!(!vww3vJ(((]]k$D@8uֹ99;}}/AA7o AYY/^z 01]v-q_AAAUUU(..3ǃx h57\***x8^ߴ՘gW5k[;G{o"??]c}򐓓uqxY®5nv<,X ,HMMEJJ }fw  =^VVV}\NKKCFF{36Rm;v

    ֞Y1`1kָ̬ۖ_]]1Tʚq(OU5PC[!05r1H?5qw6Nߗ7-Pڵ+z EEEA߾}ѹsgK;z iy/1_z sr};L7It?{Yg-Sf`O"dCҶ­Y]X;eѯ_?kcphiCMIT?\G Z_G>7` -=u}Z#/' v*ѣFœ\Bs p)^|\90Ն Bh *\FF~AS[ qᾘn5ꚃb1f6oI|l| lCZd?_!!!=Æ߭wlZ_9&& }继O \g5gY vcPHKv.8⡟;NZZD!6<.wp Ntu0uV\\x;]ƅY J*ʑ{wq.. {x,21 L{q&}n/Vfޭ;FՐiĸ(x]Vq.p}~~ x݅ }wO⨗Aē8߹]/{K_]!!.>\8S>)?ήw$og\](wQ:#!5≿فׯ#&N0PN[[AūwiB;w-' H>Cyn !=%|zK /߇Hh(cxRyՅu3FpHK&}x O߱̆_i mHSVz nQ:syBj‚|$E—ꕕ۲|`ggᑿO|qcecusۃ1I(+[82"_Zi3?'xn+ggsᤍ+ ?OÕkNN扨wG6*(صw@QgiiiB__CTT;vx6dv32z7}󃶶6-Z8fuc֬Y5}ChCzrphH*`a۫'zt^zCDBzcq~N 7̆8$DE -% QqK)f2nx>@naJq~%$DyyyOP3s@m#+a37@[UB%+1c(JBLL " KOսD%1h9NpG0aaPDE (,J',E>  r莥( aASXr*:Xa7A.?ugj.YFPTR-x] JO`H(QBҥ ŷ-Dbh]rEt%븶nĥa:vèYQ0W>bbTPgi̬B=iP 5uqvg|^ EY8Dĥ7 GtJ-#OLf^KS!].%zP\? 7ꋕ&BmY QzT1opuaiKJ%^/iu߰ ٵZaA֡Sgto<@rL ) WmF|qJ q03ЂwAH*j.x!+K )1aеkwĮW;V 8;f-iCg6m8 & vM+v}ܹŽ e3fgl Z jjjؼy3zj`}fU6?0lVF+@~N:Sn8e1j.qzBe ` !Lۈlk0CXr,Rsp`$D 6`i2Ph3“2QZv$T}sLr ]e!&.VcҩJ) u4g>&ۏ&JO?,8| %{g>És`hhY`墩5tMf!`L!Կ5`;yΙ}M7",Hgq{5䙘3 rR ,-8[MZk=J`B<.^P\{C'*& V,q'd7&cxb-eEJaܲ)ʇ׵#@ )~j؎ AG(dP>!ᭁ)=OUg1JXjM26Ҳ4o,PDt&G)MbĘ1ni`(NıS !,!#aGe9{h TA!I;yS۰ҖfA``2I ٕS󥈤!,?~DȊ AuRsPO,ݱ+:ˎF6+GFxT;V-50P΅?Cj}l2ڰO!GjCmJ++I` 5-yk. T 툠=R7,Oc`Eyzt c(Bi)il)d2KA]cgݗ ˠ$1 \JBTd8ܽ|[R>.yq BR,Aң1B "bX q4}~kB`d71%U./DT()!MG4`M\"`0.M]N~~'"%ӇCeH,wTa6՜ts9%EH|rUɂV½g RCa =OW.a4YgP?~n# Xk=F7$I=z1CS\[ʆcqڅ\c@k`7EuoܺfNku~`oj]SصǪdV`Kyf<{ 'NN;̙VFh.,iBGG;)pL͇XTu_ӧL&3wAME+N~hxQ,ˉC M֏j{B{kV#WS}vB"ZD8m^Y #&[42 5rMTzMbDАk꥘9m fϞfILD.hPKI A7!DC=<{jPJ4=f0},̞5 c4!E=Jl'6NHT7SrPIfsa^*hz>&cye10! V68 5C, X{!ٸvr4e!%c1}jq#Ыu*a'( 0w֚Z:@L\x'M-k4f6<4K SCUIQ.=˜RY]&6\7 lC,<[NvPu0H jhHBd6BNN3c:nd?ln uՇZ`*Y3gNV&05([@T~!7 7(ݷRoqv[`@/FCN6+\ #n8] %IKk;p{ v Yp,DU,g az_Ά[Hp`UHOF\|u:ЧQe%ȪZ#-K26u)g <4|TRVԡwÕl˪iz+C6.%%%riwM&O~/la8ZPPTè9Yv ,ozX*Pp|V}'.3#0ɒ%D>[Z79{>UU 2gٽ;&NSzy+ԧ!M]ձ0|[_MI(KuՐ4 NC|lWF@RwY>.'L 5Z :P FFF#9ՙ_YPDBYB#ٹô/-MLV$d:|v[nznj3m:gמc`n /'9s&jИMȒ,<6[?6LEa0Mā"]0xtp UAl#J9]:0V˭#!fa^:4>vN[l8' p(,?ݰe(cDh(:f>Nz'!:.:MR,gF"@GJR (Kt"DZ2,,x%15m=#..;6fY8?|nKG@& ,WנgfeU-pYQ*Pw v+" ynHE9ll Iof>}.\Z0 B8mqmolgivUHQXSYYao.xLYU#'֏.ΰ/HaIA,}7N`]3Ϟ|Jг(r]0's!+'2ɲReg >&~뉉+nF׻6< Ů]f/}<6]ÛmrX~2pgxH BNՄ,Z]?R4SfB80AhŁXv*܏5[Ah|#Q1/ WWpU5Ǖ`6FS:.İalnl`5f:QC[DP0X|V#+s5-XW RHE^f"̡ f?M uD]bC}`G}kl/z4۝84.>`X4 d<Ϩ yd .4SlrVEDa4q {.0`kf3ag.=1ndaKt'Ճ-űeYv22P q%EGvDMN͔&ZL G#ti,GfZ<. KҌѰ54, 4:;9ymL_̡ec1qi?KצiG3iKi:ĥeקɉKSra z}i]ߪ,maTܢdOL#'OiM KZRY ì]9}8̜ +#lvZhJe? kBۉٱ&8‚ana k;Gl{ iH ɭŰcV[fa?n vvMfc,4n@Lg8ܒeZ|cV-,LW]{?79=).H3Zn fUf+[+|<, %3[zql2[uZݷVf1U{?Ft1_=V Cib2P7M7nt aJ]_Yt_NȒ}m!q~qQ _V`od,Onfea%kYR1@ ea r -=aa0Xkyfcpd7]NV:Xcfag=Q IDAT56>e3X``qw$`@`⪋YZu}k ]î`te2rd@aΟ3y-';v2ܩ!j;v ]K6t}>K;v ]>3cˀoMosg/ek77ƹ=ekv<Ύwvп V [-Sk%%N/r 50,=5"JzE1y:De嶘Y˛W@]MW;4*܏-A]aC6T]Pyy%\5UΠ4t$$<ދIC̳ϭ.{/5n߾5k`U8tRaWQY`YLKY@[VDupL%`,厡sώFe+/0|=ѤLB}{@yRk_jtO|o_+/*<;-1L΢""Nغz-!%5&wWҢ<$.ah-JkuEZGFX}W!=9^eU[ѣ{Om`S-e&حqKoZc vp{]=muCQI2Rbl.>(.^avv~}B\Jcd\ o*[fX ޷AUfnގ. sA_Q)܊MƋUìq!%-ťCTT"bXVN?`.'So ޼MP!y{K

    FXjNpLky\tEMė>.ۥ}PwG~"pg .0HFKEn0 G |y6~ۻ2Z32Q^UM_4*501HK* 2ܭlgGH|j-NPj_/=DU03*f_ed2mI#_\9Yok|z憓.(jƕ'0=\e0~wʵ<$zU &ڎm۶a-+(DUyMׅnƗXOqIⴴ gCDJDuU*f9DoaE'Xu/B:ư9ݺai}z]a3DAriYŦ2֔._v\Z}v{@ ,V=\GDe]:ӡAz6֮[ G;S.*~ EqHGU!eUh3m/JjUބunL_{@|V^JcppqB``|]ƌqK/e,:pel ǿ!y=ޔGP:.a_&hx-fGKp=/|YU/QVKN_8[ ޑ u22* 0m[oaWS] W̞Q>C ;h@qH<{E:m0ۻ;Mu1i,\fEb| *K’,ia1HnuM 8vÎn~8a7{ yؽS_ ܚc ?/"qz*h+JbZĤUM2!\"MLf6) Ih(C`aly/X`C2}vd@ck64@3TWo'\/ޮ\{v;45]M%/n^`0~2kj&cĴ-vj8 ckBB V: ",M~ԌZ2kDY؃Зh;nYn9=.pMR;y8%d^5{闇ݷgVWן1qw# G<dl9I8kB8qWJy됚_G;1/?Z]+Хg?\AI|Lq!۷n Ai%x啡 $lݽ~v\x< :ƛ}Zݛ7oks_4arWt* WR͆zopcdt ܿs2ʘ_ғg0pK&ԷpHVީ¤4Q3{F= ӱc:wh9vك=Œc!AXQ1OI'sL Fk*&zk(-&#Æf޽삤p? Jk=i)Il X A~ȩY뺈=0arM?n&$QǙF1@9&oC/`widtgBE͵Z۱eӽm=scxzlYHOC t L (Nb* qv}BLJ# ( ElIާ?sKOh\U c@{F?3 @lIEq~?ѣW>< 綠ii1hS U8 <~pu*qndt'󋊛Vadc޼ysAU^|7R&W00 45g5nz[KK]ubcV[x ]엽 [vocKS/xbw*DŽm8zoA|/a{uU%`-o!}A[ov vv[Qo?}vߊ|mx.~aO?h\x8.h{x2 |cUꏇ_m;5]h/Bm{m ;v ]ھm-Î;^߅xB.ޖ۶x}cD *-#u*i/'ugv ū饦!O#Qo]-Ϸ 띯z=N`rC~9AkZ2E7ޯs?+Xas,;v hk<>y;.k$_ y}\=a'I~nanyjv~[]~ϴp7z%u׮]лOQ]%qfztB;{@Qc(}IYNoia6\"{Ӗ_kQ‚|Ӟ!/_DqQ! K+U>?%삝cNB駟!cN-9->Scnu{~Nuؽ͍j),(@aQ J*_{~D5|_ώmӟvYs%L7ƀ>1~$Qp0s1^z3,Z;vs1l6p[KG~f"[be5vkyo vQw0XAEN?^RXwڻ .@Z/dE!!Ym Jk>A4])諊A~>n¡ÇqA8{:mZ)X?N6.)ovoh?,ھ҂}!#&19-(uGx7/}+lصn kd c}~ԭ~tm~޸s6ng):ZG(zZ(3! roD|dCZN\Mu%Rqu;9LHAv1ap낛7nIx&J8Nd:,ہq ms2i74vit݁ri+O/OF>u;m66 pi8NN@qY9Nq^ܹ84v媳#|є7W8ݺ(ia`NK 3Kwyl%#n@"}6[Wt9/#>{ 4>. QR=vN= ᓧ(|[,̒tx_'{z#6@g|]Co Cmt?{Gw(#,#c`xؚ =4׎o յ=h 1a:~X{i}fAJB*`mcISgnJ=޸9aذpDDD1pE>,#UQvi䔵D!M=K& 5;BXX7BQC (#Aеbdee!Yqr;S턫/z-RVν`4{"9%iil2h v2mvxS 衲AV~ Sl qYAuԇO;}y[bѲشq#VX˖acg,֔&m(#&+㏸@\= z4ܾe0Vm׃{;câ߽+f/Edۤ[aA_Ξ>xcۗ`@,} Y-ofп[/ q #ktD=jqGUPz`׿'T0}tL457 ߻uɧķ=`2c9" X }CQB; Tݺ}ew\yˆ;7BS~=R2"bYYU(q*+t n!u`j4B}CJk^To( a̬MȬhHWiEJcXnKGB~ <2a= Y#PW8'`#X_V'68 t.d!b LH8V,>Klܷ|R "̬aO ;/^%KcjN1Ub +SGh 9KB=`$TW5IfgxRn:a,A,ɘ8fUM`Wfcl -[]V=(hMx4 # 69bfev /5%,ƺ{0,Xfikw9)ㄳ'^bwt*xvLj%!ۭ "?% ОsuI 9tiz%]d>ovgЕfD5`cgא:ս3l<\Xj#L,]}p ınQcW;ׂ[}`'u [eG8 VuM#IC[7q8^"_R3ѓKNh|( ;~[k)RX>Z bNIG}9EC(Ls4DKjd'abe*vT7EJVoIB/daguT B¥kpIt%XշӽtmT?'`*bO0`xUBMUαGdՙz| ])/58ye8H#R!a*40bj$eqEu& >r"˴'G~);叄]\]c"9 f Sp9d?8/Bt|cadžh6MZ|s Ȫax/׺_2;wXؽ,߬!.3{>k*C7ən*?ud3}/+Ov\ئ`aY4yַ\C#iMKćPv@=^T`$s'goG9եxT{7U9D (|~+++iT˝wK+M$ZBX#jڝ5PèN/_hQq?b얳6.CO,#AI,XUIic=a mPo?Aw hQg,}foP?Zϥ?9qV-Z8tԻnbpMjB7l[(®%6գ;(v1{lX@TH$T=%j;Xp&4Tb d4ȏZ绩Fݐ鍉;ϠeY8D0 (2oA|hc&:s -CC>| 8i2 وu m -!}c l~4SW_9G_hAλsE?izQJرEŃ<N|v -E~n?%V!5e!nBֆ* N@Pf>P:Ҝa.Ek:W/rWXsVn=Vxp,ܾɴ%ݶ잮C H,8ƙAP*`y't4հ7+YBYQB72<ӺJK!UF3zza2_(+)AAA? ~to%,HSOj1mu\Y^ aabZNBgTa0z\Feio*m,0F[;0 8nxyޫIPE׾0uY!>@jFlW[hO H_gCt+''-bKء7G/:snlgӢWj\di; #$nB ^`a UU5š3l0L$tJeC=GT%XEOZsu@KB] '.>4sZ@o1 _s|U5k)`*G&p,9FNĺSwɒluDVCt80w|v]w5UE ETt T+[E-,nO:Z/ZXfhX9u_Lyص"i{[pk=?k]yI Y{01zZbtjq>h}Eximi$> <> [}I[**s/ڢvW< ҹ3r/7W`tWULsηeoKoq+?V/3=~[PiqWYL{Eooo59Pː/4Îg(iMw<>xak;^߅?[O]G s w7k|Y_GB| *~+b?~$;v87VL'#Aӷh*P@iVAԶmmm+F4Ƙ&MѦo&Yk; R)w ޢ'ESVB߰73<ٙٝGZyj:pY mvAh;Qrw:8@MJwcX~HӀB:VxChDc!qIT^󍥳[{gqEg`\6B=~ M H2-4P3 ;q;y#}E2D`銕X,yHH]p hPc[F6@}4!88o;fGD͏D ~@SG% _ڒpۄܳ6ЬmSؚ}4skޭː}?7 t{l;]fi Ci`B5 î#~?&|nS[};ׯK|06)1XS YiHZqO|d$v΁y.=ryH*trNwN: ~>i`̝R_^V ؜2bw>Ӑaمؘx|{;Wa/(:&8Z2z12GOO<8ֽ\<V3_s572g3fE@ ԰l JΎ`G<ԃj3رqVd[v8C\jc(g3qإ!)=@tb:5Z8ޠ| #g$-#=a'`YO#eft|qqp!zVQ)o.chmQc绫efxy v6i`B5Pfή ?mЄo'anl~O!2W&2؉>RQDΜU[v106A`K)6IDċ);X,^1Iwd9lMSl;sPM6a@KqfhBJT*pEha Ul-CbB&(LC9ڳNS KI=>6fd`KIFdwiti֕^XG.KJ4nEc :5Ls턎9Ύv'H&# M{wn=l}$l$ؑpC#\G؅2zr]XrHx"l.ّ D8`j vK s%TIp4`G D8` t]m<檂(OE!K?G|~;]$tN spmۆ~^q 1 2 3 0 0 419 892 1 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((|" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?r$vYA$6Us|p𥌯i:j~l b})^>ojo/=SV؟_ʍ}xCyU!s;KyvAxH1 #u=3@;Q?c7ՑUD b1=T{⋏_5 o*)~8؟_ʍ?RNaY$$x)O`2>zVFK+w2N\\ g?8؟_ʍ[+Ȭҁ`@Ts;V0l8ݷ=TlOYSx+e01HTcĶ[r%;ӽlOFUi6+x>:j:lwxa1H@rit*mvk& ۠C@>2/caaq4wVwCƁT>,W*i;ʙ [ʑo)7 urB3 +"7ԒhL>nl]t(r7nw?^hƺ}4`1h*b2îrOѐ b0(y=;OHV!c"t -ԓGwiwI*a2)GxFKn#rpO'h:Z=(. a 2rjΑSm0 UÑVW 1:^ct|aF|0۵)4MZXhQs ʀ3o_YN EDGs;8vǦ8*,71-mIX_+o1<`ZVlZ خ˜f.7dK"Pw>(~"]}&+^fMpN`G'h=+.,1rHF=ʿcu?ٌ6S X1N9 ="';x䳉܃ jDdt+{Tmc9BmW0+C!RabPATӌ֧}m $0:;TvSg{U-vP9_ȓLՋd>j]Uǩ8}TlOQߥh_@lOFUQ~&TlOQߥh_@lOFUQ~&TlOQߥh_@lOFUQ~&UorR[? )Iш(3u˂ gb?yCvq>g=;#~Co={b#"ӭZylQu's隇w'k;ǧ֮0}*"ز"€->=UPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPsi[.TfV0y㊧-ƴu3F%̇>*եuX5ܛ`C%׶:bݫƸ[qz.ilWHVC2B(%CYtxX) GPb:9+;0MXE? Y7|cek[ͳ`ӵFivkc|ڹ `<?BVTt]cv FMUPNdrnXm E? xkY=Զnu xMW ddվxGZu"$, B@W|k 2:w%e\ <Q<V$*F1z"z[ Txa63;sI<{Ve}ߴ}#Oͬ16q8r%aՉ/_ɯt*R[ Yn#\|ѤiW4Ynv4\c'j~hZ!x>EA) p\rAҙ'#g%f`[Xb |+GMMq \żc|mʰ5R>k' 6cvj4PBhiM455sК?ihoG ?M|E}A \&?᫛O_/@PW7 j4PBhiM455sК?ihoG ?M|E}A \&?᫛O_/@PW7 j4PBhiM455sК?ihoG ?M|E}A \&?᫛O_/@PW7 j4PBhiM455sК?ihoG ?M|E}A \&?᫛O_/@PW7 j4PBhiM455sК?ihoG ?M|E}A \&?᫛O_/@PW7 j4PBhiM455sК?ihoG ?M|E}A \&?: >°1m+A+o /*e\\JEWJ>Ҿ,QUҾ U+(_+(JEWJ>Ҿ,QUҾ U+(_+(JEWJ>Ҿ,QUҾ U+(_+(JEWJ>Ҿ,QUҾ U+(_+(JE@.*n( ( ( ( ( (>2kio#2zqڵu;V&X iє#qu x +5ܿ3_O)Z-!T dpO8t;tڹqL$yQY:lތ'kw0qӮBX@$흣m8d= kd5ԖqueHArKdIcV9ёʺa`mt#\?k G XR׉ M7ڀmC!m ys~cV5֋2]u) ܢ8q9 xh_lͩcO`|#~1ZҮYl>2M8ݵ{tr~k)^(5F22 `XO5I v 4ZKug]EוYPF`s\SAy/"]k$ /UCj2b&q@@KvRǀhj  !=  `Ho t^? |C5jшv-3dy(]ψO-[6uӫ]DF Xce|;Kͦ^R ɖi>UY2rqVZSxrV5 C{dItd3F25YHT}] .0,Dn@ cx]#~sfm>%ԏTEp:h U}MJyOmReccϠS↍xsƗ6dx8&w}i~jLR|Nϡ/jصhbBҳgm;Wjzn瑽Y3@h()zV wkci%#Izcl=Uӯ&B~x?~&wyeE3ҭ|ODw[K'k)5Ynݨew%9TRgpzzٻTѾ/hڥv8id8Q\Ԋ,>èaHc/$OԖ_קl?f?Y~ ?G,a}2;c)M7?R//)zWCY~ ?@I OKUs_bQ /1Xg(1 ;cυl?f•wBUv:7vw)5˾9QS(+[?J;V*Ώ4y#@ W ?T•wBUwiz >•wBU~Ыc}?]𸈃u0A@)_*OQ W ?U G=p?~Ыc}?G)_*OW}砠\DAÎ: W ?T•wBUwiz >•wBUA| kaasysk%&B PIwFFCd{Pޥ Hd{%hrM3"y%ܺ3)`8j>#xG 1Ik4׏t 68d8l/ qFȖt1 5kq6p8"«(+:N</|™ O?#Vo7*d΃+z0֤*D]u ~rBh݄2nHM+a$Uc8Mg½VQr wwv*+_ n$xG*F4r22$NzH}}z}ݥ5K+2@7F۽qӝVjkEVVXwf,۲˄QyG?23Yb7UaQAoIu|?Qq-dXH }W]~c12Ep`` we#AAҠ-ha); 4e $Nz@o κ>,F`f*[#w tSs`Nw,K?(@:npkCC2L0*8ێ) 6ώC"8@Cל{J?_%XoAiyneUox_A}~O+i#_Q<1C Ci-X"b$zS0كw"IF\py|<4~c9"qY#|eRXXU}_@P_ZD >>/ 訳W`퍥w9nr{RmIcxYTpv?J5 5-q®ziZ?ݤEfXʳjv3BOJHg.@i<$۸6HbC>HMºKm"yH#8`ws׊$Fi*;t=O.G"+ `m?׊ػ5E%#Sǡ }J;eG%id'f$xz.'710G]`[vO ס#M8ᡵ(n<3kϙ 5-KHVͮjݰXV tΪM ;DMFJe–',@ۀNs9.Kceg$%lc,ws7SUg=jDž.Uʏc+?udP^ݼ>>X`UvO αI"\#FseV+ ?Z $땇-x{dH!+*Z:(((((((+.e.дXW3kuB= ur#ah (S(QEV3ѿYu oE\-Y>ֶ3 ,x <X=ހeU$3Q:LC:ed{Q|!T+oc|rb";Ʋ ;p~wm5Ar%\erQ԰WdwG!A#0?!PO3+I)˞~DtQE}Yk/|>h$cʃG+Ut#&iX>TRqpyz\gs]Z4p\~<"[$*A$n|O48n/$IؒFd~beӚ+9aѴ}Kc\g8__RfgVmbxݻ̞ô|WxH."یAPiXJ}0.wq9/aA'XF5B˹r:Q4^#Xг˄?3(,TQE܃3OZw疅403GF K! 3p>{dҨI@d$cп9?ƍ7Z'hѸIӳkO>jE$cnB m)|tB7xyh_G~ ec'%/FD!v1ژyQױkRȻBne$:ҝB7xyh_G~!r3ВhC,9mۏkB8z/'|U >:! 2y uXb2I(Bi-Ex_-CߤnO#7e.Fy8?uXGQ^#/m^ 'hܮ2}>"|W cM5T{|XoP|QH,? ,^) C\t?煇] ?hk.t5a|?J>(k.bO<,? ,Q^' C\u\ԣwIy[p#~tWz AҰ?7u)VĚkpJߢ{}kTll)cǀpO隘|R֏Ht,Q^' C\t?煇]( ?hk.W?煇]5a|?E+hk.Z{e5a|?G- sxX`= +j3&cW>~?,Q^>,_( /6agNidq*q 8{_yZ~GQhk.W?煇]5a|?E+hk.Z{e5a|?G- sxX`=?Z<,?Ex- sxX C\tXl}7u]_W1Z,e}XLݧScQEQEQEQEQE|;>W[e <7pGW%!SgKo6$G > HJ}W/#Λ!0nAxpXf91F94lcjgd$'$"B봍?t^h~%}?ςRxs?<ۑ6)% `Iِ`o\c7g?=+$땇-x{dH!+*Z:(((((((ij3d 7tYѽu sNW?w h^;fal%LM6Ay{UI] yI t7:U;XKshTt$*䑸g nض[@[(En j$ r?nxV|A{o gNeKAXP+@O 4O ]G:Zdrq[w>%ޅMiBNʙ %}sZV|^B@b1PMދC<;ae6l[ e\{WmC `$ƪ9;+3J/acg$o]؀'APj֓u&n]ϽXrA͈4.8][ی Ă7lǭZ;d*UXw'͘A,I3wVHVȖRrQ$I4Pо4^wgo"n.sǷ?æh7xNcuk5u!Ÿ>|935ǎ9/.`CfV)YA;ۜ\AK"yS'Qٶ^sh}\m[FX$O2P- N88xnF4p1ExyCa0NIϩrE|cRhտ)5? )cx{F_6᭯e:{ vn܏Pze1f>ՄI10vM|%Rhտ)52ɣ5/!6;>$ YOE'O_jׇOf?O4??!|ѿ1?b}:f~#Cͪ;z4mFFufRF22/?Gty_sV?RhW??J9O]LaF=TMae]c a۞T.?ۘiQ4Qf*W䑓&sV?Rkܹr-t[\ŋ7UL9W銵>fIVuo/-˸\q5o _Cۚ/!ƋF ].Bѐ:ϿZӵxx<4?$¼sV?RhD_;njou$I_Gin?\_XfRhk9Y⨸@K~COwenj.TWοۺ/!Ə[E*5.72\ʡvaJ8+̼ jW,Ӣ/%G|mPxQ B(L*$̠p:hledҮVIV_*V,c=qK4U/%o-8#`* H?ۺ/!Ə[E->-eui/T|͎1ԞZ8ౚIv[@!aڼwV?Rh5%Y|ۣ0y>[uAKwV?p>|SfM,=iPο[ʋ5q6}Ohkg 쨸@_=\j*ϨYw.n9uo _C+_[GAK}ĉt7(@#0VMewHq#)?LVV}vYuoHC7 5k_5F Aq&}H́ vp9SUıI.{fur7vgjZmL"^3Rv {MMlaK$'8qk?/^?/^=ɞǦ^5VU=9^#B7ӢYd 3Z=ɞExߟ\!{-GڵAV??bdoZmZCofuu"r̗%9==}KƏ}KƏn 3ۨԿ!ykq}wu]-( I!`UNes>ȿ{F^/FEO+4_ZљvMөQEQEQEQEQEe-5 xe]n01 o4-Σ碈N<*Πm\j2^uS%G$qFJyfyq=Sݤ"9?4Z\-ݻn6֬麤|NA 3:ɽnN@J#)c>O(۷P><7/~k67^E3W ;:i_ʼ*WCgokn aj:E[)vDf21 >My'\u'Q?WsmmEoI!?u?ib`{C##/43Ȣ=I'//e«M8Ҕq9.( ^v$xfT*3=om 2:mmcQ¹?3spO.B21HԻ\,jjQ^Zs$PiɆ(r 8 ϽU×o $-8p < *$p{t1=IE[U CU9 ׊o\uJ޹((+^ '>"Ir7g'j9X?*fZ̡4Y%|aGשw@,/J<}ӌ+z8yz)(eηW)$vǡ9gtcRG3M3ǿ7 tA4ߪ_*F`Rv ( (Þu$h-za%Xҹ{1OG-Ƕ=!Y<1[ƍ$(}mMeZw Hm~N߉%w k a?j|#D2.GjMdQHٽY>_ m-wkc:ƥ1(C${㏩8R}c/^2BE"{kAۜr+%^XN'f?qUu oCqtL`?QZv8j+ag^,"2鸟r5Tasu_&5r5jMjktE⒊+"Š(kfr)U@stU{ BaL:}OjNOM sQ9HEɞ}i\FzMr~:h7?y`̐zW *UXpCשBcuճnj<L,\p?jM#I$A@$ Wת?b&qc?J״{ fkZGMI@tt*oݤhoF1Yo+G*u+4n ө[h3&[m$}8:4"c4xi  V3teBfʆ9aEv /w\?a]$a?FEO+4_Z_2/r^Ѣc9?NiԀ(((((cT6kvYKK(k3~5Zm9tKf\(`c-__J(ᑅlGp} ϶biq\w<hMݮ#MY8>F b1sV7+n-JOR2z{k'֗sq=Gask;/Spk?P䱱yPX8"q:1CF2q ?BVTu#\?k((((((A;{apײ`q55JWv=ⴳ E$+(I6P5`簞Lt|Wib\VxIrAVavx )QW-mB[;yZ2AUok{jgw :|F8.H1lz޴GXa?jROz/NG|T:}%(:ġBlB$5[ O#یj$v䓜dנEt )Dְ&<~N2tzԣI|o] [N{r鎦0onTTjjv[id eF?+*0~#ޕ^+r5|F+WCz6}Rȷ7;E4HieHe׵|ڮ^_,3lƧ:~9 ,48)^u z k⎥C!]P(r:ԩٛKR*4CVăs\g=rxWxg> gR[\d+x,?U|i˪xQFq2Ǔ +h4r΄壕@[whV8b:ZMWQG)yzqY nnJi 8>$x+1RKRR{ rD.î?Euldew(9;RYa,W(Scic_7卣5kz#qkm,#`׭b%#r;w!?:VnM  s2p[71'=Q%WJFv]k9sy'}*4yуՔVCZPkK 8P;J}o NQqFXD9-ߙ<9"Jg 9{~=Zˠ%ǘsH~9rJw/((-GנxsI^]ßJu袴͝4r˸E/cۧI+xC$DRY$JimXn" -҂q11ڭx,7ZdqUF+˽;V][JҮ:V(??~'7^c{\M+٠p>'MYkG,2d_() -y=UuZ5A̭+/Mb?-R5C2 Kp[f6q!qFk..\z۰nW6~ xFSAO}#&O0+_z$#n/{tP$@ђfq$gkҤ֥o{BZ,Z装Y7h6)g+}7AFEL@'5xgm^[1YZɰ(.d}QZo2ZɻqAt noyy3|d\(WOOjqڛ[h f./ vxX7)$)NGwpJ;vX\׭xF-Omuq%R,wg޸g:5Unڮ$JۺP.Ȭ|:z2?O]zwזc=7Uo?W#]v$Ax&Vd"K zO#CêV)7qq$VZ-n8Q5xǗ6.[-62P:$NBmj0Xܤ)ǖ]INHti2K,s=1XZ+o2HX0GDV XEioٟ* o\Q:]6$E[hDh_œ.#^sna5 ]O*lQ~`@=yv+֢ޞH&[ѨU%9e˭yfkh_(dq~!zۍbNrcA5 jk.V$t'ֳY];vIhcUMN-Kp,!샏NTaҹ BRk_(ׯ3rGS!u&BdG2XOKmu`3p&IMp3 T#%O'̗fsqYNN륍sMOduf}2yTV s\Dۓ;R:ֱvŴ}GycO \}K@Gy `dO'>sv>Re7yJS3??]iֱ%Zca3099.UNu9u + Jd灌Uw'I~43K!or0B ׽gav.uTe#Y/bi PʟccfHL8?N[y5yVRwnG ?Zdd̳WcRP &6 3GLⴺ仛F ywѿZώ_%yJez}*}Q^1_X`.c{ʅX98R6CEͱdڪ$;ʣN}.vKeb'{t~޷z~,HP8}OiY*d9~q޷ .[ Up x wBR39@ zd{cu'WWf ED$u213 \Υ: dԌ>*VkiysYҧxb`& }?=ϿjGJ 撕˨#bKy2* :/8i<TS xFSA@ !9,a;1N;=A)P0?0J}o (PZVi߯ZOXO QER^tNnmp`Ţq <xvYZ>}3!g b{u+dix`Vz.c'% e^;NJV'RèGaMEYn"UL@W⪽%I͓IX}$($ ؽz Ӥ555-rimơ寚2~R?*+Si5[Q 2>Ҁ*֔-d9\?(+خ7+uT:&5+k T;/'$r;8^o܈"26!_Ҁ+Mw~EN)qTյi5flWQe/Bxw9?ƽkÿ .ng&UpJνAG 0}OCyIs3mpWзmvG<)IHyk9;Z,D*Ai[dC M},c1mʂY?3Xz){vUSU$FQiA_;?卧̸t)FӢ<e^_>;K8*չ^k;RؓLRsZNL'S-̲K!9,M"κ4 _lǮ O? {Ii叺'1hGt/q~'k^]+kY 2#-uMPy-޸#+{V'-: kUC5M&`n$bc*z# co h!׈aOKHL9V"a#:^Ay+|}iD5UwxV pʜq5c\iS8lAe~fq;wB{im|0뎂Կ/Dp4eiU[o#!Hd|dz5pNn6Td:gEQKۘg=+÷7aX O~TrOjjn]XX}לt{i%,`TVƂ]T=z sq-ˇ˶1Z>#ޕ^+sRo,C~#ޕ^+rJX8#t "X ,Yz-ĒJy&xeZ)/ߕ O5&}s/fԛ}5{%\)V 2]șo9Y~\O1xI3G9y/'bm'H,K⯉Dn! a&Q7ΎoĐqoq'(8>*g/>Xc~IVVIb95isMOx5m&丐s{g ]k Po#}65|/7z-і7 7(5s|?wE#9R??BqeRzXMUĸ=KgW#yz%w\.QE +QןנxsI^]ɸG?Jy;u`AjIG{L "m/ .vAbt:19LPzt u8=8=WRZJ^"A Ay< G 6> ݎpsG|JM,:88z ijlhgbc6Ϯjr`0 1?Ω4虮LFx6L0& v&nڹp@S9I"'Q{ n4[Y6NYX3Զ0sܒ=3X,VX]l'(kt!Abrdl?Oj絫uH-@Dʠ*Vq(QEh (}#&O?:ggo?-ϟyaz]vYj2pÓPX5o{AD/ 4)nD$yB&ޠFqvH:Wwwu\}^kGa ד I!N}Et6ՈJAoόN.*Ḇy K( ssҲ%"cc;dSl>uk$Eycr%4%g_`#<яlxNq( zq+0=`su;nMj'[P3o&09TIkuv v#L*GE`x%<8'[h%+&p0k^f.YQvᵆZqxx$ض\2C>pS7(($Jax8 e\gd{TiV̪oĤ@G XR׉׻_?Š+ Ġ9r8ׅ)gcd@ mذgL*ǿdעx#T]׈s~e_W6Ea2IB9)s1䦮.˜bE[擩A t;IR;x"^#]~^47Bls=͞]C#3ש&_{췷[DXW#0}ZԴ5Ceusdn|Oo//I!|`JTW]Nx*c/>wq8I"iߌI'co%Pqti=G~*λ"VFԉ4>UmqoQI Fd:h4+v:DFF=A<?@1WjtBWáu=NDؗrƒk Y wNKKM=(}SXz{g,d@8ԩRWvGDg)h6Xn$A]wYZe |ߍ`UV2.?$u[[ m᳂]ȥ񵻌5\e+)R"ެRcNxb|︷51!I \Y1Zv2uV#5XpbV6.Glb;(_՘yd?3\5s?e~)Y߅ ,u̾CDOGu?e~(>Ffp_`<*W*cYFͷЃ/|KqC̘uGiӿSY߅ zc5F nZ>t>@/K:/TΊ3Lu_Lu_|^%Zw?:m3_§KDkt`sFڋe_>Y߅ _m3_‹g6@/G6@/EΊ/Lu_Lu_|c"tx'3Wvuzu_}3_—#M?\(+w)@ڧ\{d&?g~(?e~)(:Q_Ec F?e~)诣?Y߅ ?Y߅ ,>L}Lu2 VH,mcz2D &&I ~X(?Y߅ ?Y߅ ,tWџgg:+m3_m3_‹Qvcx]z^8)E1aC^4}0tӬ_Lu_}R)(0_Fci ci tWџgg:+m3_m3_‹jN4jkZHZ>W;T_ٖk~W+)rwjrE{eߕ ?,?T{ܯjE{eߕ ?,?QpsM$qqd̰_Geߥ UMSIգø^/LڲQDPv)Mzuߥ CX͕__XLJQ^a>6+~#ڮLJ^a>6+{=x}v ?/w\?a]eߕ ݋[Q{U.ud_ҽEu#"'/ol̎?NiԀ((((([[I5bYe^:I%즬^N˶1B 7A뎧T:ϔ ,b =rTXG6پVdS: ͂i0Z J}֛yk@Táa@56\鰼vpβd 2CE=HH͡vQԞǽfEi',L`*C,5kJt?`KfUf,xֶ G RN6tfAͥөwMO'cwO$`Cn}>ѭaK6&Fc pxl aP?׭x[N?2@X$v-%pȒҲmC;QǍH f,9%{W]Έ+iVO]Ռ^\YhvXi񆔏w=W3Mo tJw/!w=+0??NkݲiZ} n;~5%'ibj֚fg]OJXY]G`'8u{R)%"raAg2ƥx, ]3FuTe8a6SKnL$Qפzf>)a9Er}틵ONQlد\s{g_]Xv&[|%I1m@R"xRvc:z'{[K㼰k_m2F@<3S+,0Ks0Py _ cͧXjXZ,\8zcdxT3P%:[:20a22= 8tQm#mMjhD)j)c~kS[m/Ml#'_X^SL)cq^,­w<Kw{x`bJ%LJ.umX:}E$aG't&WҴ>'ULwfퟩ[jj ZXeju^261 dcס#b`8 [Idht=zSdޣ_-r@]8ԣ~{ugX`s I95?]aGӁaݰ@_^V6<*%NA QRI$I@ ޖREQEQHN) (G(JG %` (G(J*?0Q y$` (G(J*?0Q y$` (G(J*?0Q y$` (G(J*?0Q y$` k;V8$bS^{U^ O^k4{^R`wuSv}E ,UҾ 4Uo+([+(JEVJ>Ҿ,UҾ|X4Yu6iI[#0?ޭxb+7mW,8r#q #XKM~mo+q?1lg9>Ռ74;hV3H^Ogm[YI4+ އ?wU<xT!XcW1e%'?cִgҡ mi=8+"4xRo~Ci韭DQ@ s]>9f mՔ _.@H szH҉}`E/cN3.SW>^k|<Ήc|EQ~5m]?w5<jeRez!(iKu CFH<1;N@Q PxD%)Q`) b G?1#} XЙ3)$ ?e*rE忕8uyA$K/ ;;)J)f#dlOvXęUrs:eH- =kؠ$K{ Um0I$rONkŖ0BF*~{{׃6ƿ~8J.cQ b~?Y7WSg?(S oM#b8(7pF:V cgNjV] FsO_Oxu{8-EXTwqʱ$mK{e2J3HGү˧XT7+ ^s{-sgڣe"f3l 1\#F.dn3ہ>ԭ_w]JIZqi/fc)($d(|`8?|n-)xw7#'o@<ҼgrYM2k"[E-I*3pKV3*5NNӷߎ+hk¨ pUT1h4PhQE0 Z^E;[pʘp( Z=4`U/jAEZ)( E!R Z %("5>h-WYb2p; ⏂Ⳃ95uuU&!>- _-_m|?G-_m|?H OB|5@[/G!>-Z &Z &5? lk_j' oмevGOB|5@[/G!>-l[QV|(`˼KG DqӃRrKQڊk_B|5@[/Zv{U]jsgϵMgߺ? lijVme$82yYT*gqҺi6#u}W*Euny8  lǞ1EM4(,l`s^?0 ?^VF,'XVd+3x=Ŗ˂.m`W6AVU9@ .K_c2V;p 9]O O e~h^@s:KiHQ@alc⋠(ߺ? l_HP<{U5 i!OQp1 lk_dYM$p0jV2RWv;Q̻= 1HBTA+BGcT4QtJu]ʔj6\̻m X?qo)a'Hys.tIX?X?V݆VLms!,h,ig&XK1 i']g%%z֟x"DP ![##Ykwey-W[xX(IR0 &IAzwp;2ntCy@V<ޕ VQnyn9OVD#HX.I$NI.w-X,u_ٓzl-nx",z ;S4ym&3*ۻOɥ8i0 o.ēYUbqR_^;.x]a 7;'V< ~ϟn+`=}joKb̎ǔß&=5𾚬Lvo1^ˁG^ hYǜyL::etJS1?l0>@<icZ;0*_=|/<}).>v$tUW9츌#2>n*lkl(}Gvs$؁ʠx'lS L/0`*D/f{/Y"HV,7mI#I~eVY$}{Ԭ\9YooPB \nXʯeIq7!OChu4RX%ɐ(܇>K"m. ~M~U RO %E:*si+ΩظHFjMG?k*()nyiRKiVdl|p{^}qeMqAV ́ӓOr0u^苬jW7iZ{#O9ֽ HӭK56Eb\+yb4}뗥_;b.3p=Q┷5Ub˽崾9b*>]-⦯qqMN;v}u?#\P,#jw1#`>xubC]d / IaVZI 2;#1b1?OAT4"zXVE1e|AqsԳ/=d8E  2Aѯ~͓9T3f>U?3b`xvnݏm蠸Q H?3EIee= Ewzն9cu܌0d!Tds֛4ZC,]#l~*>b=؁J֓8QT$/ ow&`dI&WP˅AAb,wBn60C@')I2-'6^ۧ5ӠH'ެkzFggk}H PV8'QKZ>,jw` 1SkWuuMM4d,rP02`A1̢A{z.Uԫb3 c-pz^I<k'Wн3cbMJE=CM0Ru wZ^EyִVo1C*N1}i bE=}e0(I]"-팄0-L2p2a?{8rVú.V/E$g'/-FQqs8"(9-QEQE )iRQP_̶Nܕ"7n -r&)6v;VwG`-I5[Pcv2NEa_Lg/r2T $8#kl"Ym$A& 8*@'PAIYZ>BV; r<_ZQ 08n~kCh;Lĸ$rq^{)s*l"o9XMj>LRE,Um=@k_.E S^k7/17-8ap9"kobkFomYKz&SX˳dl WvW#zg9+|{xHK(\?t7k]-m,JY/gFw|h~sg3ҦI#<w%R{,Ow4[HɀG$k|,aji{_ʾ!m{z[KSXfPv-$zn5%.7<ɥӵkr_5XΊDU[6p>\y'@Ԥ-B/o*ɏP# ESJKUב1}4zk뺘U8%v S9'9}kVzմV_Oj *ې~=p{s[>!_mMZda݀E\6۹#bxdh7^X'gx{駍SNjYg_SΧfMfaj.FkO^.u n%uF#g=s]bdXPRY2Dx9} YڗV{Ƹ||bD`!X栓7^F3|ʽ9Suۋի/+mݥs]ƣ2PY ɽw8W\ivaczdҼX[`>`>ě8ϗRkt8odMWQCjv\NkͰp CJ7~= 6;yB]eܚsƓDC!@Cޝee gA 06,pr{t5JFS t^So~u+++)o"o-ĨeaЌBlv0ژq$J9= SqK( JnIFZDA9>5^LNYہ8'?N6ZeD[yJ,u\O>z $00zӊ)FIVt۱/.2Ճn$`j:ӦU.'>~0?4̡D*7nOʭ f‚}^"]H2>V7UsU ջc~1yl $V8#=%؄ddQrMQ4hhgX渝n&i琻q}>GTA$s` ci%x|u?Nҫ:;1(A=#CiH@T5%]L kI뎜-:/&3 𡴑JO1g0zBrܒH),җ$V /t ^Z9sn;qcXndu'ՙrJұ`$+x֬-žwC,ˏ}9J6̅` <ȁ.I* ˟Ɩh$k|mvLc8֣T3lKhaWSˌҮ]FrEvs*{њKϖ=Usmvb$2`#rIݱb|-@$/Ƨh|YMb&Re᲼'94{P'hK(#')\A+{ 4Df[`cV=q׏jW;$-&Hʪ.0zqZ$i\AI qJճό]q[D3[3nU߳ g'a*G)$mO0`'9'A$_HȌrʤSY|OW. J\ p Q!IXĮ\RI<`z0+jkh|Kyщ<%uM>p {VԂ+h |ld{P=3Wӡ(wW9fEX>#hO; g$84hX'>k$4^>w~Cj'e+oC6RxUEo#< Ǎǜ`98lVj+ ~גkV2j-^\(ø9kYG\2JľV75GfrN:~yM:G,][`<2ItVτ/#4O3_`[6_vv.xQ?:gZo+&PNQ4 >8 :\4Fd3c9󁓜V] OQM;Kcrٮ|d/\Z$ؚ)ƑnTㆸ%|r93.}˖dVKnddA*`aیV,beAU-B ʂ0NMrp;T>w:ㅂm>*()_YS[]_&@ XM:y'oj֥W; i:1B(f`ױڳIO];4alݼr:xkr6',ax*. RϋHA.Xܹ8㰮w>9_Xec/ÎzT? (o.[x#*5 'tOs@ (i\2Z7? <."1F3N*ٱK?_"?h2“!+K̺00x-YX-L+Ku<Ԛ.] Jҹd?qm؂vzסh>{[IQt p}?Zӑ:dCMD Fi0:ֈk!ArCp^34o `{]?(,|;h񖔒/+n8yq -Ԁ0yJv/G9m^\?[eR*یDьvǭpTSx٠0 MÞ?5Y$ѡGc 8Z('ˇf? | 䓵ռ2d8Csԑxlחь,c>UvlNe`}OaHWHxlVA;5NOS!@V 6rsT;_LeB$zsY14Lq;mj=:f.YeI y#f6YKqiq,bRٔ6G8;}k5߳}EO5WUsxh-cM\69 Ij SWm|Oޛ·-$k8O\o5qCp4bI1OO]9#5%Οm42^[E9ҁ7n8Tӷy2U9oOk a=Ӵkk<2ZʀVB5jMoGͼOY[y#U^(Ӯeܳ܈Z(rgHWG*H"ydtWaK,>Wk}gj߉o-m%a bWK0N; ݺsGӯ7W,DXRۃGPmZ:_jQʆVh<#SrzVgƒW"Y4jEuu] Qh,#^:TֳokHO ?)z״`jEq,Wأ kF\2˪9T 4G9od!T*4jzΤbZhmD(݂>oKşzKZ!SkP1<WwPܺۘhApH8=j5kkbzۈgW4 clg=¦Y,mUze}[mK{-Q|eaw=&GfHJ$ֽ͙;Br9NGOrw/c9<*hJ%8P29#yXsTSq0oǑ;d xQ>)#4/?tǧQ3FPax#kL->E16=?q'jj$}n1U..eqܭJ ?##,:;z [E$nԶɧy-\͝>KP\]2C|Z֜91Z0Z*N/V6$*|'N;Ij;GpfZP#٦\Kn`-$K!B0Gz!Z&-g%J^ؾO'1rz(,|rYԚ|(t^(B`$r}}@G36V r{P'~7 p|/(λm?08F;_wSQD _dMK3$ yXwCS?]ȏd J yOz>hp_ӌ*S„b ,F%}ϟlq ɗT61e<jh#|(fb짷OCܱPLrᰣu)j xZsݽZ4anoƱS$xP'VFI N?T{O;R8'9aՇooD{to6wS1v:9HB1*r&Bm:<#FF_ aC pOw_P|msof$;G5M\tFG--%fcsζHIb]VyV ;h"UMv# sڈhxL#'weuw%6jQ[9// /Oos\Ԗ6wR>IQDծϼD'NZK+qvv;I4sϥ55AM 5~.nd]ҢA>)7V+%El (,=RA7R,sFNI'?_*汶mb />fd:c^7iXYG'C[؎Dm@q:݇Ъċ^ƍO˒}MDsMUCT4& v9,F:%e<m*  Ry$Vגtn3j,aNiA22Ųn8x QtE.PL =ch3KNUeeJ2{IA6B N\zO^(kԊ;ɒ®B1H8(0"ޕ^+r5|E+WCzh 5QueiRpvnŢV0>vҽJZu ʌR I8S.eOiyFXǸ?x\3o4RӦ|K: ۫ĝ<Hey:"t[m+ s)6x1[G2)(tW9X1༇v:gWS%qq%nw:τ+!&M`F~rOLU{8t jmM޶,Fgλ#XM6|8񶰐 'Oy?kwßJu^URdr]G?(ߕ\袊 +c8ʜq]'Px4YSɜ)NO:.>;]6Flؘ ]2@;]rwM "xw6?NF.*A$^_η7M^Rn 9#4;lVY-DĊfF=^5mĵ?Cm!;9DP5x$ՉV ?˧’o"w~}xGOd1:T˃S´hC-ʕokE[{'Z;zy#d1A8^ڲ$ܬ2F2[q[D0n1 <% 1z/LE93Swb-;2I122r,: VadJ_E~F[mϴ;RqREr6}sP%  ֧HجG#  "<)1fAfI4KI1+q3\Jdr3u~k W-Շj5b &K@82JKCiՓGvf{?+mS (qi ʹ_N.@q֭k(")l!ǿkxCHetך,jNH`# GxpBto`%?>3xU:}'S[SH< /A^Vg^+[-y|[JX~gӷӚE* 9 ~JI6 j|WL,b8kwǝĚ,6/) H{+c'TW[S-11'}ޭih)YF5s) 1OLJkh]щei _o:;D>RsvZ?*F*9;cORHmr:jYV'<ҿRe I&>p?žZQާ'YḥQ+B7P#n壑Jb!hHa?>z)4A#UqzsSx[aPӏC*ƄТ`rz#VTRFK/1T|=~edݎ`g4DFVJ밌[we?+h 7.woZ,[90? jX L3!VS]nma$d z3ҴE\3fi2#KtI#t`cVoe"q݁t xlCHD,?X%BX AjԸ[$\6O>γ&q{}v@]ˎs׃ϯ[Xؒ\1;G$q\[!)B4brdHr=kTHPR09 qD)ʥNHmoĎH7Ax7pPVGRnNR~%3Gq#62 Sj_ 'u[ιۂI 6@> O~$ ]p0|Go5F [1&@c2ڦ1%c? =3nhY"캃–8 Ҝ49X(F}Ժfs4V r۲{8<I;6װ2 f7E0EESu yq ;Vg#!\p{Mq\W+cddqM=/$*Ś۩>f.Ck YrY+8Hr }1!e?_ڦlh(IX,$}=([oR+:%f||lՏcjUyeW=j{)#UCO8Tu#Sc eVĖdnw4iwfGVQBJa2B4U -4i$Yڇe|gΓ | w&$L_p෧Sep8>t|(7ys&T,ԑ0{Ud4JF07jt~:-X5;t  c^俈8UOj6n Y=1_J>1\y5) ?TyٜJNJEoukEscn6qp@I6K4f^],ֺ)&yB1(޸o$@:+>P~D(g$zի: /؜lSџw>Úy\-I{qqaZ cwTEŁ7.MCP:gY7 [?/~sZ7ͅ rEerNN}̔>lFN3}j2jF8=?ԚC9cޛo4YXz՝IlKIv7g1׾j#}_:ԞIEл6ᑍn.-NGoHƹ gXváE;sbٌIov"D;\7瓎I x#n/2rHRN=+VG{(bc^WjsJM:8 f+㟕NAb!2Í`%@]BT4D&/Bȿ0)cwO>ݽxq TB$ibE| ~T[TK.#Wɻv0Z( /׊oU<7`9pWR3O}_ҿ7F YSp@Ď+JvRB<;w$3PE ޤ1G$?uk}>Xց7^m༂XfUX3oN 9Vǭu}qTކ>ϕlh3o ɬ(S}!6z[<dIZGg;I'$6QKJTr̓,X1O]XB; WJsP0X\\i_CuC_CyDk$LLJH ؞:]/j{x%e.V<=}kZ&]mL Fj˞h*TtGvHա FN0ƹ0Z]oMxL7֒6J6sZRi+b8&\uK/tLĻc5ЖQ\dDTs Ww.BǨָOuIy<<<ʺw]"W N]JWtSw}sO$@xŒ]ysokmMy;;gcORka~OO{G~I]?(<9$]G]Hgըln&iP@WC2Cʍ9!^2z6ҹ?~. Ek}g !snp8p:w k[~}Pё}^eDqE ZLNV im}:cToc䊃i>d{o7%˧#g~Wn2XxJ{As #m>x$]X <|Vͮϳ${ 2l`+ZGm2 KkbKtHoہ`09$8⾙g0.F2.Ѵݏn5@@5E~D؅m+m >_0lJ! :#u'%V p:cހ0+g DV$% m0W׷ͨ7|Z; өHHcpI12AhgIٱN9v䳘fa0e>?:HTEMܨZxmY8 FLԀ(A9gp,x<OUnncQok, ux>{ž>Jg}G­2ѲȰ3sF͌/_T]^X#iήw4s*+[HD{o!^o4? uNkauė1B09ܑTWzOtRRq\APͪDBVߕ#bk3npZFl@?:al)Cظ1.9~ۤ" 8nFOZcOgkyϛ׽-ĎymJAϜ-+.sk0"UUTOw+(庎;}cv3i1A;qQZKڠ]]m"Q$0qg9tIb3hv9.wؙQSOVtmӹе܌XO FʡKG}@O *LGRUVѳr>ISZrSލ݁*"ASɰ(s4F'r 7`Od`d'la68+۽B+0O X~`xnn{{"T1H:lS]di=ꕊPO{6cIi #=ho"sۉʀ#q'ehAu :EJL]H"rrvTpbKYDpr<Ð;ҦkIJvQqTT,uL+w5 6u ᔅ.->2y'i9bI9"VuaB *dCZm"M}✣b(\شˋyHaMtϯU4[m8ȫ%#|Zڌop2Cr^/:dkNB) ?5NRK`ӥJ+<> Yc<УJ/,4mo/v2yn}g[Fg5 ,JFs20t=+C,! 5XAlIɤ^YKj?+Y~mZDH!v\Oֹ/oOXmbu$A98~ F {PIК-i6MoD"#;v82^Gue0,yP 4Z#ƭ08:w>8ҏo#̡6OzbԬ/O=_K+ݔ~Rq5z= ո@`a USO6 ы\ .0>L\s\kRkm9d?PQ@ǂBrҁ\d~U49_*G.YccڲhwIb [qE=~τr-mB zlK1_^c]|Tr9Txw1l9 x#^K;1p;_J#)7{lmw4 9iq݇oji ȭ^6O &`Q" ~oKvJ<7:/+c9WiVq v;L & GaW_8A+*?v#6ߌYd{O34\VlĿ}Zi?LrXnrg n$VlP*}Oo+%їQfZWgjT5ŚTX.hJͨ?ÿ,ww I*d~\sZlHqO48w$MNWdue42m.)vv~c<}q ۭ/ұ.Rwa<zWI*Ӭo(X\]NrNVGd9+>W * fLwjv6BCNݿ\5ZW3*_9ҒS1) F8,^#p62ws :@'֞uÅmyO.jne"9sӎ{+ )݆,15~eXu# "; Ҽ+ ,J( Y#'2ϛLu<K ]J*NNI<_N{u;rV5k*毥7nicG D2ʜ Cjߪm洍g ptz mREA% ;kz W{GO5lZa"݌HQ}jMJ*Lw`Ǡߙ}$3D20<^3δKFX!jd,@X`v5$:Ẁrwvƒ~sTWJ~o*Un$ dqsmi0~"ޕ^+cXtCb~"ޕ^+svgAǵvsC-խŪ,cRtUƫɧ5l]]ˑ:{-fNTDߟ`ַIB-[^XC,---Rح.{%-$K=BX~FBT^U::xWubGCw#`(_;s.1,FN:gi9s^[qAjRĐyb$*(۰ϙkk;AVR#.L~uZ1TmHna1דY~Si'[^ԼKe< 1ҋodg*<Ҵ$N "C2K&Vowuߴ,;J$xs_G][إPF*03 ך|UҠD ]\D]I}kʧTUE1G ꬨA>Ǩzܛ;I;r[p!Tj&b,I>b`DחS4R4Vc +^%zw?:+Q@q:oבs*1wfk d[hIU`YtERSrb@Fnh>Q&v_w b[C |z|ThM3̀g8$pB,c\#'t|RߩVI#,JFl``!7 2V%5בyX7gƈZ'.]T)z}5"7Bhܧ(@=lWx!Y/2 @݁zz]MZ"`e_¼|G `wrN^.h[',rIq6l/F9Q z;`aV56{Iѓ{/0##iv섌 A$ ӦFh1S(ĿQNkkwG ю9.?jIJDK;u ynpzά9hYUY97\X19E$zdsr?U|'bdF#w~sץoD/L(n9*w2|kV~T~Eǚ1u1pC!+qcc2nDL#:u=ezjK©uzϾӖS2 מ Z)`(Yt*܄*)A_ )jJuH!ev]3HDv;r%E.:}x>¤]JiV_Iyˌ[ϴ]#( |=iݚV#89gsFÓ@$Q+BA/N3tr3ck-zUF>lέ0dvU*Fr{PL&9Er`v=_XM4<'fQE2Omƛo+Um]&P)ycC>գ iL+%:}Kύ́W¯,y}zF}gk%ݹ60dV~[2F̪,s@=rS2 (;O 8X;/([HH{+}[ZS!p _D-^G7P2HT9; GSH(R?Gx#Q5ωM5738yJ{ q6%F|σՏooʟ!P`"pz(  ?Z$N' $B*ݼ-3&gulE}q3(QɁyZab ِp{d K);Kg:iUbeq =) P#E`SdהkWO1JYf;~k|!i^yk¼q|cO)AU9rA4xŜxp{(.t-NJ>)ϥrN.V=N wC6&K p? /.A"\\.P^,q?Z$I[9BNk-^Nw=3q\썩/`=-d[1޳tZ I?8C覬+.dAھ=O\[]\rȱB1 ?QuIUhmGO$Jw`qܞJ'TxDUo+8,=aM#.g3sOvⷄ-傻3|k0 iNm/f`8~F3 cAyۙg8 Eqф}1[9hps]{e̅6JMTdk߈Ub%a#S9u Y|Q"nT Fya u[ \3mF 'h,Y&K2ЀgQQm|:}k_B!7ϘIy}'/0Al=nZJzWxgytdQd*}gfL:5g7?4}}gf+QV~w>߳Gnhtp =~[K}FǛ $v7?5$6'1.{ygʓI0>ω|=;p.e)b[[=O~*]v}y2jO9߳Gnk3+QV~w>߳Gnhz?( ~wZRC\YxNH8tyNbޛE -tw(pMjxK7-5 ?*Wns.f:v`QSʭkd3jpf2O̅H$p21=j]FN㵴;>i`qS4r,7N^E&yDr,!p.GO, F2HLѮ`pVr= ;zE0,t)di#aPSۯ7FP3E V.cEaXp[<VdF9c랜{fG<{$eLr=շ4$5d0*sצUI<$3^4:qdq~Y?z,|HBnC%je%d&[~/n4"\]5_F&u!H!QӨ V6p-I 1< `~$5*N'2猩SQ씬mmb@nnsa2+c,YH_^Zv{t-ܿ+ n *hL5aGnEI#?5ߕN2έ.goO[ߑ\ږ =3Qj2,^p!paOkTw.Ɏ&OB15$j9ێ1٭H,em#>G,i)RF=? ѸY==Π.PYoݖ' :Zr攰9213 m6cw VܜȑNb;01}~A/jLqd; 񤄛{I)G?7 ! (#A{UؼrBNq8sg[yfP=GSkn2;;uf[y'nc(:򥇇FEl|> vinS1qcO`Hc!ל~y{2Dž0s[=9LyzLw>YUI~VSS[X "rO8C,lrhI r3?ҹO1ԍ.8M}ORB(0 c sҫNדfݓnA]8zR^k+ (>V:}KέêԿ=((>|`XWXL+&6|/!.fޝ/w <\WMNF/,H\偗'Iں/uWb(ΧpQ? 4.i7 6|?Zua]K(8hm,{˖)Udtl"ڣa嗫~'~9pkQKDXf~'Aoe♭cnuV,GRឤF'-4ٵXZFض OP3Nzleu9A_yw0"KydG8\qۏ)Ru/zojWq rHАxf9} y>^uj3bG̉Y(4Xd{xR(3%[vyq+3&\gNjD`#ݟD'mZ(B j4X,g8&[eHW۝en9VI>zs@Bt+HIM̒c ,͒Ge?Ϊi$g#ef8~-F1u|UG+oT\1QBn6&>st/;{v+9`lM6갦& }q۟^Rx18LHKn</Zc-cI4df=H X<Khӕ-E8 sR81^Bbn+~5#=# thpU"W((((((*.\X#F.2G JEy*?߱G*?߱^EWF?WFJ(w 7Q 7WRQ`<&pNA8Ml炙Lq-')>OȮē gI,zt\xHMQhiYȗ Rǘr^73T-`KWa# ʒcfo4LPbRrރڥ$u*J擻- 4?? J O͌u8}(vK('dR`݃4![ pu>kT& zNjV$c_l]I4( kHpN[ri]8Ϡ_>]y UQ!BR^ܲpx?ohmxn+UnF΁iVU&6>Hrpq*7nY NX ~?Z$u)*̊u96Fβ1M$?ίc2$sU]7P_, 2y'2wؐp9]FM^#c(# d2脕Z<>ޢZ & pv zU!!R?JrqV/z"`<N*PѹRStl'Nz]B6RۿZQ$!.?qDţ~YC)SЌRMHiR:Ueq jӾ%Θ#OK #a? >u&fq90]1 /$'EdPTuӾ+IH^ {{6yc'vv'ì-dEo5?x18V쎡xIJd|On9Y7R1n}5%VL Jf8y= и/bUBajHRI!@\u(D 1/wkyw&] aNp?Evly$&XE6Rqx篭6&2K闪d 5W+vg:ֳ[x28Gջ-]y+2,@_?ʔ34 Ve 8zd?x>?Imkq,qH@;2ޅTi@0OFG=z}z*XXe=\Pn;7XlX}V:}KέêԿ=((|]^$AovdԊ~ Cr4-[QǪj2A j6:{A\_M\h^GpiVlsq]y>LeD4Kinik'a|55닛GI&HWnF湏ikZeXXOvTv`߮>UOi~1jF!\d2Tz+#Fg>,ƌ`=;*as~#O ZMCqc5(ܛm֐ M7'zp$`Tzr+#aGc@֖[WG L#bR<1X\i R }7h*of\ ӹˑ? `eu6" B g ${U {Qwfi$Ğq}@܆5mn{.p/?/3R ]hIs$N3sns'L X[’˖0ۖ파azVTO,(] =zՑ`pA" Hht?Z*Pk@QEQEQEQEQEQEQEQEQEZ1%2"cw+ ۏƻ[k{{cFH#'I9SI[dLQ0lȡ7ۑI뭦@q.LKc @?YM :MvpUIlǭEi2j3@ͻjBY3sg@j'cm9LyR#aAN9G (AS Tφu-d!0=9qgY=dxRp#Pƥ-*XaO^kX?y z?}`ڕ/?Z+FOL7sW"邂Y;}js*;inD!cʻd eY^ Qtc@HufY.[8ˀӯ5m1ܤzuZڻ2(,π\ cs򓏭ts>gPx`眞;p:-Tbm$F76n7v;RT0ޘ ;Rk1lXh%Ѐm'}5f P@0<0=;~uX0ޱpsmQ/2T2=MTd` Hcޕ.cd5R8J<G9azd "K;XkrX8$OaTRMM& "n'Y$,QA(JTǿ9 :mcX6'Ȫi\F\lY5#cщ,w?*%o aG)GPz)˚*G5f:( ([0/k:|G#_Rf((rj?zTSH٘4WtH ]'կRt \AB8#I^_o~}[DkyѕL223?|6xOV[Gp|ц9<9粖 ]Կ|c&+˵"E*>9 øaUV->aq{l>,lViKDgh]-1Vɳy!9#= 0ǫ˼I f{Yrm8?b*Sf񧃵WM$Im*̒l9_'k`~rUDx3.k ]Q`qܚWm'=]]Y3^#cƓkUA<ۏ!4Ǔ,(Uzqץz~Zr!|BAri!ec_|z3Ų\tTC*Ei'gArt7=^UjmCz#o{4+g=8M;*vWhM|| 9V^ړ]i)VA"򞇊A$>f%~̭y4W2X3C߼3=C<-;Մ. hG iXOSL:eh3$g@,nn}gp0!+1u_Ůͣ͞r˓ۺ+ \qב^d]&Ϛ)> K%m Xd1\pt'$G/g[I|62/f*20p ڹ+>mE;lCDW oUT#Jch3ފw<7'KI@"Wꆇ __((((((((( ?posoͽRyV@pWis q2deDnv3F8yXo,H.]G*Wީ[!K{bRrB9־M9B8|w@LVHЫKnb 0RX~q*7t.s߂Chfcry!\NG"5ȭD$nP$P3^kX?qAQr۱BnA 9һ߁w"Kw2BD.d)|H6zQ]g5 Afs c<ҮL%2`ŗ?.Jw7C,8=;c泔])9- 徻kWYqP)*nWgǥuA #݂K[jVMܩP;*rV6Is7r)3]QE< zZЇVVA$(;'==*2^څmʬ3Q:j{ӫ(j}R)"ʱ8܏ΡUbؒDT'?!?\☲d`UzM=Q(c{r*1)IJ(sm}NSn 6J H?M,!`Ẏ`KLXLuZȫc{\beUczt6B P I'r LH\AjvP ]rꞆqoDp`7u'}4B,|#??Z-PeϯLt'Ɨ3iِ: P|o~/Z6dfCo~iZDF'򤃒+>P̀8?>]7-[+nay[zBZ'T%emDoݿ+>>Q^UqW>߬[6?/sQ?r; ){:ovzTfGGk#k@5qn|ssoٴ 2I(U p+6܋=>뤁?k6-᷶C 7x)%B;חKլ/GE¼c~&Ҹ lO٣9@zx 5?^ yՎq;ww=*$*JZQ9#Qא}*,4ORMscw+㰞o[\/EE#W aVV+i7)dެ4^MۛZ]YBqV,gۙ8"6s#(2#U$7nDUCoNS&;.2zE+o>a=g1o D2JyR&/Ye1}0@ LAWn:q2G[$PPr{VKəF-IN:d 39Ȍg5:/Q 3Yό- ?#.)\ț  < .G\ض=k1Gj9(ꂊ(P_eAcei '0 =:vČ:qwa<}Fi%x^i'&VRTs53w-tQ7% XQ+ LIt "`N*Zr\m:0 1׹#Z_y r@DA/madz Ǎ nijs6tĶlh\2ʡ9?>|Gc LbTd`63ظ,۲řG9;FA{ z<[ykh'$>@G#4L_Mql=t^ߣ@TVa]iwH2ɁHѕ[M r?Ƞ j+|x7,pTu#TntMJDHPq8|Pu/5x& @#z|~֤iU4٢+ jZZK;)a@Zͣ߫2+.2 3fK4Q$9#ޫW@G~=)OvLj28BOӯzM-&vvb$z@qEԬS[n|=5`z"zH_ ݽsL>#2"L'$/@3k˻oɈ)~L؂x]{WF[[vhu s@6Œ {OL*`iHQq)nOZ n1b-#v@ d1_Cw,sm0@$3!~b8 ր5.~YV-_izER\sO1Fp9Ȣ2%L"8=H^^Kxij !TzĐ<+B4OjWfY-#f K+|$ oƪivv myI_E'{H !5S$n z5l6х2n-0d} s\+k׾sԭ)|H6zQ]g.;[-ն ,@JxUo=3Ajvsp6t2A,NzNjo%ܒ3*.rFGc95SmAlVn&f- gJyAض3tcO?#ami;kk }7Jo;w{\<Ý[$.['מx'MkMk 2Z11{z|H,Ygq3 \ʹk55t#d}aF02q#?JuH5v1[C(Uńw.UD3xUP&V7{s^-H}B[=:rR21l ַ.jjFW,mqi~T{ybEm.Kcw0w, %JJҗČqgQEyvc?LWA@eC67:q)n6+͢2M 5 H;N:wlKR;pݲ$2 ׯ>א|*CX:NG}q׬N!$ uWqQ@Q@Q@56!B:ufV #6HB\sλAoLβ z=g1xYZvMA1Ɉ cWR.17ϕS–z@fl:?gB+KLǩ%ɍ^Ssv$e”F3˟ºMYn.鈧|(.RH>Zbwch: yC$1[ַRjV6 aX9[0btvǠ6KiLˌ cfmBm:\5[9\L'Rh/ne Џ¹jNWOcpo3̒6,FI{Hŕ-ƫ 3sF7A}Q5K*FϧR!$v3WUC!~⭤ܪGj[w0/k:|G#_Rfb(($땇-x{dH!+*Z:((((((*u}"/@q΀:0[ɞ=.-x@ON҉@_b0G\ed^pU[n#'o_VλB峞*[Ybp:ҟ,;.[$H!˶=1^zG^KW PO^^gSϖXg=*M~Ҍsn+cG㿈$#w^{3yQBrWExu>k<+РI@Q@R~β>RHkCQ,HOFSd&dqy# vG桨Xx]*8nH `[m5ߵ Cmwcn / rIzٸ5E^xnwh+\j&-㵷,H[-ndKR*cK P} pyŧfA! I u+^%_ڶ2֚vw4Z̭l)S7{ J:fp\dc d:5Rӭ/-. PCӦ?< .ׇyӼ` g~5bz&m ?ƾ8bPN[ ǧob$EE]8hZ*xSy֢ΖlLwVWiF* 6~꼶hyݲd'?8,#2[O*FXg#":m:+:͝`˴qc9bO9e̅鎜T%␤X`šU!jWׯ|ZR#l(4 ?u^Z~chVSAMs۲7M.[4g3+?R2[,m!r2 "*$amdU+hNic挬\o=D) |[kct졢ga1kX\a?uB|,rIaޔ ڡ10\` ~uWe{HX~5Lx` 4j Zw#Jq=VgSޥ)gWԿw)=r;npCWr;W_qDE6Ȥg R䁡L/A~a^;WZM@ta5^5},Io,Srx9>*ʤ5tQZ\ŢJ=4QEQE{ =7PՖ<6HA}O?z6m4=!Q#yFh̑F>fruFOּpI+wsG%Ѝ;msWhWqj:n,2[#=pvUӆ:lm+4 “COuO Hڝԏp cj*G2JԵ>!`K(J HHxE\nzUƱzd%C,>dvF(%P^=X5.lO6HRi| ;?{94n,tSFb;Pyby85VX[f`bPÐ F84g^ﭬDe3BC.~bvcެ:30n0~Qz\ՠyHg$ka("Ns#qִ|/o8m' #N(>-<[X4wrbh\mߜ) Gs{Wu5[F[GXgFCaX' `b*jTգ࿢k'i'i02鑊-2gY.JʹQ;et7ϕs Ҳ|WZQI&qiw"-+vP>GRG[6ka2ޏ:ah9u_D]8RӔۀF#|W5YRA1 nns]_]nfaDl/ATU{oJ𶥦^h&H5dR3 y?4kI换 %X u<W:Y&u ųE6h QzkW:Np$?.Q zU@}?FY"p@>ZźgG8Ij:cuc"tm^sm<p:Wi]{¦0&rzia'q5 Vmvh!P ܪLV,-O#{? *H׺)9ӨovsӵR9u[vU i2(iT-rijdQGY?^\9A?bpl ˘^He:#׾sԯ!^5ϬR#GTQEuhQE1*cq'Q*3d7J_:?@MYJu c_jdsOn C@ЉDB5rEi@U*ٜgΫM]F(,6+PX+JKeهƹjdVG$8TJEĕ u! 2b8'+5\NQާ0d2VaѾPAknNp}2+Tk lе>y~mzqjSQU,-;go[޿r14I5.{ [( EVlH[Ҥ:|SI®獀}*t> *;9|x 1-ԓ֮bSup9oR>]v_{!\NIH@-usw (Q@rHv?֊lYx"W]P&y#iVI$Hp96+`~VWTwR cQ:I9O"ˆ"e %X;+g]Nm\짦"=*k5G_;*rk[)QYĎ( ҫoo._I 7#]$So}kbF8By9ӌ}>UU빜j<=uOM}omԻgvM-Bti-aVtFNYFHqק-- : & E%'&pG*j>҉)0 $js8ZLM,FU+{PQճ 8/#Q#`uJu+A61ߎcGpEy=2_KFs]ln[6S2F-Iޣi %Ž`$EYX>goqZ}ӥt]*Eù# R.hbZq$EeT:g]7Hg!Fo{cҭ| o˚D]6=s>flJi !F9jFKG*6yERdցGܲ c%diFKhcRv>QOZm9<8譮-yRNӾ8Ig,-n'?LVU0/k:|G#_RfQQ@Q@H!+*Z:?BVTtQEQEQEQEQEQEQE\aN>񭋈 >#W-[Zu\R<>Gq f#iz/I<{\`Tc-Wѿ]#|.@d  [yHq^.]L+\gp< nX`Z#Z3iyXΫ?֞):HJE_C)QEQE{xS Hsr90[P{|; 5 K[9琖猜؟ǃkuǧb#37Gb3'=%[Sآh|1:t&đi6P.ex!K,3,GPK8,r} 9Qgg\Fut3μS9h>eNg)$Xv9=rC Tb6wqg-$?3TqG9=y_|-PnXp}^Ku yظ~5.u-N-Лe#Kp3) LOQYi⸍&r n-@8V4Ht-Rr9^֎q}dְCtc*F`O<6cbW=A333g3U'k Q.NpF|&`gSui4۪A񕸹Ha3rMn[Zj~ԵmA mJRg1.y gט|IeA*Vѭx+x>x?޽2#fUy psoU8`U5nj&٬bIZBCkkUH, evW8kidVᘳ=͚IFfCXnR(F۵wː*˵a]gy%ӬmbIJ kp5dankvKwvi('qzgWxgQZMŬImz'QleIYy9a:c~>2J$TceHj(O\&n~bH>xO+P;c02p2Ahx-ma%ۍ n\iO D E6 :T0" #<֬eZR:9kfSH]ݻPqSKGxdbh6cwܜ[]4!Y}>k%LjhUfݵ2i^:Iw`5UG߃t'WlHsۡE7/F =`c)#dd+F{u)sOd_,#HEs:♗Nu?ƱhtSJ ۝ *5Mztab5 (CA9$/@*LGS7.lWT ly+Ӕecc8]0/&ˁ^KP:>lz_O]o{QTfQEQEQEB8ޠwIwx*;s*fP Sʲ;p=&i YqHM!C`)#֮fqgL0F ݫS8J͞k%-s|MyQ$Tnܰje#r϶920qފG5Wg:Hc4G!@BF1 /,P:z{՘vݻF#_68j"!"㟧ZNcF%b['5Q~Q=Ʈ][iz7{*)Y s,2#bU`aDLY+znDr[$) ~Z9nmXi&RQsH3۱Tw3.XbFY 3ϩIٿ᰿~Z˜G X;ض<`T%pl8u NR7 o+;[L=ۊTdբrd F2@V0/k:+p ( (:?BVTtQ@Q@Q@Q@Q@Q@Q@Q@($(6ly8Tc( k,TzqY.(pZ^buxݽPaEPEPEPxL 4 uV_?*]IFH1ۚ(2Nn |HZ9>TNFq^k.u6 g߭Ph mDً90̖<{U)Q@%N/!Q7t}Ml]8X뿞=袀 }J& cVBFarZ Xai(~EE#5'~UoۥͅJd /!arc#?J( k!m)U1RC0 y(~ M%މ5̏):bxڼ{ ~;ʼ*Zz (9vqڋfА W7Sy):)㏢=m^n|n;}(,L>HW{ixz5 B4@QEQ&!|כJ9RA H#4QQh\kڍLM2,<袬([ u5^$T}Id* (Əcoi1oܑLθ$A\\sc&s^hOfYӔrlc{I,KqT ES,GoaI2/he.8#KR ɎqǧAEQZcc=#2/8W<~7v'֤dŠ(D_OE>݋Œ$(X,rTQA2(QEQEQE4Q@L ~S[f.NN|>QQ-+c6 GZɟ„XdmO'J(#쑫3\JlK'h\s#hഗѢ *r)׌Fpa;1ET#tGk&u^2r.ҥcߊ(:*E l u$uKRb Y2HGðC(|R0isfotocx/images/crosshatch2.jpg0000664000175000017500000014541015247006660015227 0ustar micomicoJFIFddExifMM*JR(iZdd 0220̑01002009-07-01 00:00:00fotocx-26.0: Rescale: width:544 height:418|fotocx-26.0: Rescale: width:362 height:278|fotocx-26.0: Crop: width:293 height:215|fotocx-26.0: Color Mode: mode:1 blend:1.00|fotocx-26.0: Crosshash|fotocx-26.0: Rescale: width:586 height:430|fotocx-26.0: Rescale: width:293 height:215|ASCIIart fotoxx0Photoshop 3.08BIMafter, Uhttp://ns.adobe.com/xap/1.0/ art fotoxx 1 2 3 0 Art 8 1672 2178 1 2 2 4 C     C   %" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?]T!] A}4~[(X`MohZeng1(v<֎xf ]lY4 OyfڎwjW]%njg|ڋk8t x|kxg4ji[ZΥ}KiZu _F[x|ؼhgӜ!yu Y[" R3dDΩ5Xc.[ZlV>4^5Zڴj&u2 2ޭye@md-hZMc÷ze/K:% =L4A MF]GU[ Z]/Lך숬;}ACBΘUOndvVCƭiŵݼ3Vm:Jynt1EL c[Vo 5גOٻ>${ i"D+e݆EeXH`\핽4f~en.YEmTtIPt"Ge[@h {万gFH@b +]=wkȟYug nMtOđZ"Ĭ[B[MfMN;GN.ۿݿ"H%h"Kam(fagwxmFL;Y&_FtǻV3C? Jr"YaMjZ%R{Htkg{_9<k7ȇ$eaY&Th"vl-;BE|aIDԣI 8oh9mԑ̰6dM[C-,䵖_=(F^-NyJCp8mE^@loSwZ5ޙ/kk dVNhbBʷۜm9X >*Dot[Aw~/{[Y`i#6!.$I[o!i|?[~:/4(/u6K F&N!M+֏1+.E(@\F&BNS+I \4Z8Y1%ElYt:4I5=kSNմJ>\ /ګDՑR[EK[A7.NhR络hLwKT60+]pCHТCC_Y-j#Qmc{4>iF-\hQ0BPO}ߨIv # yNt%yL v+U [Koit6V˧D^o.MK*E9$UCJ&huM? _@dKwF#KU n GJUkn$p*Y渲^x0][$tH8^9a"Έ{+Os-2Xۘ GϚݰV ,aEYh3i-j9~Ȥa[r4+CLUl_cOmZjQ[%xpl[Iqk{'Ӵepy]#LQ|g>uy%ė}|K>̲Fo7#$ јPtoyhjzq.ڝǟu˷$dۈ㿉2[xR6A=QI׉Y4׃L4 >,ER\U e{{TJѴI\Y42,5M*h&ܶnݧeV1De[QV\KY|s7gjK6ċTwqL"%u+yl>r|l52D~"(^^O:C8@'6yRB!־*|[8yKoY-.5niIk7VX[opmV9E-j?֛AXjډ1C.>4lJ%'D3wk4SCګngO,mH̊THdW6{B&L-rm6^i0Z<>2 )n8}A"5ŵD}7r!m6\ܭ>#n &[I#]V)RơvbY$*l1:Eo ˨' :R=K%ԯBW{C )OGZ$ oְ [kgT&1b*ٲ% կOyIa< ؑ])9 H[^4\g}j>u >eψgLˈ3+|DhCm|-4Dec=Ռ22.!>cWNE{1\}c[\K\WVi&1ʺLdREtYPʪZ#{k,Mɚ;d__-YBMvG 3Z \۽߆=\* I]8W07,PQXaYClVl2rD rb]Aۀ|~0ԼC?{:_]:x 4Vr DwV2N"]c?nsmZt-ǥ#H昙` 4?gMh~y# Ex6qamc#r%U,cǐ:C{k2=FtOk>9v fAm(?o5ǘ3[2$۟{D>]WM0Buuam~^TcտK" c0iwD?FNӯQ72%wQͩC!h;H>l@,`<_ūwDKѭ.k#$F7%&+xϢŨin=3}V=ʸxcckц^(]]'I𾑧I)m_ @]I P̭ [ۨ F͆Ν˟ g{(540fgCmm%ה!u ofϖU6vڄ0؆mۑXK-MjS_^\4eX5IGqgunAm|Iًlz/Faigm<=>Vٍҍig6Zmkwkx3#΢t){Y ??ɃΊtʚ(?j+ߔaKi8Ot^k yDFgMִDGÎ(N~dHY_6Xae@Ϧ|>'K¶%_]YήbDdU\aY"v_%毡>OG{ r7Cc 7:F&Gb//hxs Kh 4EB+[-vDD9 <(#llO솽qzWW hϫL@/(\HabxoS4 >]>˴yggUhPOـPiu^k8XE i6u c!qU"h5YW5Ƴup1Y R AW2F WreIE1Gs(Fys[y/ʮ;Ya5Xr, 'I+mxUgxG s `:YI-ʢx,yc?o<k2IƦ_'D`MZ&n@ͱwRմP]Gp_E"I=&ᷙX i[ d n⍾:ֳ 8#_l\=mTɷPvž8=V/.m]5&_>O eL_m"$R5Hn=lH><1s,=Xj Ǚ4أ>LCV1'&Hc i6kj~vW/$p|䢘ƪeڤy1o.KW/EUd1D&i* 3LܔUy/s-BW:l6( 5<;nYʦcp:dbT0Z{N )h- RX1[H\$XyQ2dKlҚKA%{Ӗ{O6]HyKqV nZR7G<׶#^U6Mtg;ڄcb7Y`ZUt jmhftw@?92[.n n"t'2هh#)^1.qpp-6 /k;aIhm9mn"D[ʡX56$Hh^wk5ՙa I w*EųdFeaX4>Ǡ'K5Q/.?< El`0M{6GT֦NAmF0Ѡhvyxx gVյ=څGZ\1&`%c3HܣAatkZڛ k;\N5#v2 n#6- QH4!M6x7` Q.!fвKJZ_7tSiZMe׉%`7?iV0=ҩXx }Ix[OW>Z xܺmsvSFU<<[ QntY GMbjJiV9 xm|eUij+Bg66po+#@r^ FӟcakY4)Y)H!ˏ M:*$#_AI+==5wSjwkqg2DY^^E nxZ_!-4QW1hA<]sGga,l_ sl5,K^];YŭLz^._ঋȺҡ2'j. Gw5zW}V =GB"8 ,e[I}8) $qOh j:w>'%PoqfaVtaHV40ȉn͛-t>{:_DdDFQKSqX!ݠisGg3 {m-4Ԇܟ\αl&DK-abl?%𦙦xGӬtH'U?1b?4h'E;HZ5_." ?h? z15C%x_Bh.ĄV(24+E~x Yu tk'f*!XԢ[aCgfsSt>,TvN-BQG%+ģڙ|MWt1[+k9M{;w? iw- v4[MٽխsIm0hcRH/Dx30\Lb Zcf3Ѭf˧Oy/R K.u *EeX&Q hŝKEޡk=ԏ_i5}O"<+IF{{ȅd/6 u1F|u.x)6d/~Ʒ^d-viWwv'-\I$%[cs3@Ÿq]I}+<[%y,U3x\Ԟ}M+8RS$ ´lj{k:xĚMbF[":5Nk+0@g3,3"w>L1Yq^:N:}Ŵrhw mdᑲQoF%Vu8@ҵUKecshZ}dčx0Q&m |ٱ @bҼ ugs /3e+[*3#Z<:ssys xYnb7e`-}bx3sj:XlExgn`c%Y˻6Rt|2nYn %$FڻYI#UZTR|Xigw6d"UnXsDhag46jAXCu*j ~S)ZE)+2Hmɯfn5 &Kec%"=&UFI[Œ7; L6%Th@'LE>Bx0cXҼ7iSK%ɦ|DlP!Jya[6M7ö>.ufRXeij7lٕwƻ.U3,&4 ),Dq6{N/5ȓR/VdUaƔ9Mn -XR3B(R^IWsȊT2A_5jv8NmZX9b1&4̑qO7]JtY`higJ'VFe;ŹU@  /Xk] :t\ *"(+ 7Ig\:wYo%2h@fVX- "WKx[`.l>'kq*H4X_jd©T$R #d~h< PhmƩ=AlGΤ!ݦ,УnXAmt "BFmjinbE2y7+lT2DKvӘ,jɮlu m$3$֬|7VM B`;'8 >&T> o,.yK mЁ%qt[h SyVC5t}WOaխHZq<|=iaue,SnbYc~$6hs2$8&!i-%W0-C kHveGǺWai_tYG,1FZ9K %_HxTτMC,oRei81|մ Kn.lgڿ}bU6B^xQU&Ș]#e5뤴JDP]F`5Hmd~k {V>?ͮ[m16M6NN-0ڑtYvZom|5s=hvrE΢/bxlpYa]6j^ PX]d[R42+}#;xu{jz>")5-c_oA !otVF,CigKh)a}}o p!$GFiBr#Y1+mcˋgZkhi,6,i`"cQRBQm(G Vcs˝5_Hmu6pM~% +f @?ΫZ,בj=ͭo>,VFI*C|r^edVB(ѫ?|6׶6?U{XaդԮH_Mfdی4 1)P,e{fxuu{KSTuk g9_yu;DE`-ż"hL6M +eÓ}65e35Nmlg2x ?LL),4f[%-?{GѴ=wL.%W\VO dyQNvNЈK@9jKaFo,d/{}2#,7#kv{ed`m/hψxG¶Gw7{"'O \iLnρMQm}[^+7z ǂ흴ۭbȅvS椶wM$(^x`uE>0k^5MlRcU'CDvʐQy,cTeĉH#H8"tap51đL^8bQ^)[Pc,|*E]k,5;{MMmi5Gʥ N@e@#Vc{^~xmjO hǚ0A̰G*I6=du㳴1hp+U]u,Bʦ)hSjIhqD`QkAZK2چpܤ(m7S֡-_J{J,D-@R#,9"^5*]1,+1[ T@ *'%_iyi_^YNTH\mv#|'qIl_Cowmh.oo|osahiVm2;}ꤨTE/cil/x- Fկkgt~PЊueep$H~bDTwҺX!-IJ遵 YGq@]A:>ұP}~ʶ~$K xb#vgӼ8c[$chc 4 c_;TYy[(*+? /Ƒ ߌ/f:N-αH\Z][o O!-sf,c+['>-^0-4_^rm9bC-mC(&5gK[[jNѩm@E¡$j2"]JH4;KuM7K۔ vѱ$-#YH$9Z֭+?BcEUO>(o!v nr%$$MF]9;YKɵt[i5l e.,_qL,n@<^ x 05+ݭ:r{P`LII${-;nR"@F7ƿH-Y#]6M$a B SC;t^DȿBhzދ5u r[ۉo:_ː$W6d-O($Oikm5=:1Q:ټ?ŲXˋ_ͧ[i{oo+UΉc Rq%ıA?ǶvsEkAmg{v7З?ә^`$03(HbY;}6Qn<3 G]bkb8.٭CŴT8 HF=H~6o Q"xD8UYlj &LYuOmPxhvi,ДItoV\HT&!G>s^:m"¾#f?E{gpJ<, ^ XF)H8]CZyt[?- " }*(?ĖsǾ#}4O3,^8Do Nek}7E4PjFB:)CzC /Zaj t"MARvYϺ5[왡#nVhe/o$@3mojڧ}s4\]Hjqvyp2o`ijc_4 学}춷b6rڗ%4-n61%mR<4 SĶw~IRkO i"6} "JXE,mo˥kKhCygb-nuB̗!WIB$[pzN?Csj'} xz9bԵ[w"j-ldX\Eo (wYV,4 43]-_uLRqFZ XnE4RđFb-. u8KbaktWX1P`WXIQIr?͠1Zmˊ]|Ub$ $R8_ i X<;pʈ ˘Л{6dx)'h_4ߨֻYCxOMtJUq$kLAш+_b5-NE.nIpb;fPL+挧9Hxg-C^ M&uė+ol-:ɸ4QL/Hݲ&ޯ/}+J_NXZ?uaˋ}:I`Y a".Ͱ`-_/j_5W|{¾Q,İw#BQ F">mQm,&|1$)wpo"-;Mͪ/pxƲRag|Ceh+G i'%xgKavaD1W;XՎhw2 7ٍVx8d+[2 >[S(!qMþsj,t;kc qm}k|=q֬?xVֿۛ=:[tx`E[T*DF ULxr-'m6Y6ƀ7?ӾBKAlu uλj8/8 ĉ9X&iwV1HE[Hb7Jw|,To ȪQ]v}A`kCD *bݜB %+.ᶇ{Zۣ_ao3xF˸2ΪGiVpE!̸N|px#gGdEצ#>k2+E`̠5h^4O 5 ?Wj5kyc Az +DEXGǣؿES XB0{d*CG bTTbh 孞²: FiX vHobeZ0I|I>Cۇ^MӴ8+oPfu[Qz^d$"9T!.;ЩGn͈O6g6tcDS\Emm|QDd?0kv:޹U-Sk\ :E$Q[9MF@k1LQvok*,4~M**"=J!YioMִMl.X],4ȾcMI#[H;^^+;)̾.U.bc=GZ(Q5iڜ^.ҵ44;{i|Qm73ZM ̢+k`SxK b;ĝ|[ޭ5ѯ`2X4]mF J.߽4HxW_y*hWv-4.[i-O`K5k3ujWWZg›;]$m4FTOc{X6O [NR^Kw_hF^vڍV-Ob 9;<R$ޗqwյ Utj ߼4]㵎_`xuo>8 k)sfKao Y&JnUbˍ,=ZËO<%Xg\>dVs,e';HIn|"[_xbo.KwoK{fFM`}/7G$F!$B,<@jZm5=MmszUY!2%"I#WjwEa-Ʒu Iia9E(c{y/PvZyliqVEk&Lm&Q; 0;Zkys|Q?,vaWW<=sk͐g`. Y£,ia?^m{E&kOk2%P([=ӊMm<{Omovk oCZOT$DJ C ߺkZf{NV5I./mB,P14F<6F1\p-؏U TUʅiK0`1h_\=PJn%ʧ InֱZ.H[%$ Zd@YZ.e\ }9d M 59&x-VN}v ?-Ļ0[ĺՕify[KE#(q'(k^ZI"$V Ii-7eFHԯa~5zUݜo vFavmJn2* RgF!CW2[wc4ecEY1uڤy1oմ(o-N{;l(,^VbQc$1֥gSMJ+pllKt@(P\pvoMNհ[ tH!$hMRfί#~gZSU״ɮXx :_6H6-F%s$@m"++χ4 /Fk ˥XZx^N$@CEe<=CJrǷ08R; ¸tm8hoRYU̱}aKlH@*#I.QhofWoNKTQ5 m]!^n,"yKvH1+:"Ĭ [DGx-ϯ<#k[5"bxomeu\֍7nb#V]\NbUuOsxIWPZjm%H徙?v/2nؘ+lXRU7,8!'"ͪ1yqnىVGET)$^bCxƻs6dR]J/,lt r4[SX{jr>д};QOPMN}T+XqnAv;. xs_1|Gx"F/XNZ/h,~EL,ٟ"15缾2_-D #dse2qƦhZ p zdo֖^P:ԵamHJ %1*YյI(gKe|kwkcEjݮ-_]mŽi-4V+lۙmTMy;>˲$7sصmӴwqD^qw@2#%q*5\מ?4Zj6.&.$TF`OT nVdZ:F^=P0Gӊ"3-@mFӓMSRKǵ;+'6~ϱH"V:GMՉ M.O6Y hTY oyӷ-}C`O^`Ep }:F#mqh͠_Y]HE Zp- M៴Mmc`t{?}NQWϺ8Xn "f :>wٽYY`-ho%O gQs2Lz|)vtqu)qysr/TDY8I`y Eɋ7+fC} 0?hwI#0/MCv2EqRnKĎ0EjI2@Q(α= oSNRY|NMčvR^ͦoZ;; FM2Wkx4IhUw5r-iBt|ۃ[$Z{2Aock;i}R;Ϋ3|7jח6[xB7]7R۱ lG HR0qz[ihvZJF؉Y92Vr#IP6jנ27Kۈ4~d˶*)KvPl]һ47O3P"Ԯ%RKRZ]v$SZֱ[u結I8彻*mO7I`!=OJ#Vi[) uK{EVE~umDcޫ 2\Ağٿ |Q ks&-RNbgDIQ+$jrƋm;JTp[hD:oSyOye YKI х*%?UuKoK,ۻCfL8YE˨P֠*U?xu]OjڬM=4o}XhvuFM޿gVRkf4 =5 E>YLȲG,%YeM|㹦 uMfV6+oiDd1hdE5&gApURFF1<|+4˽&HƃArڸ yo!Y$h0{/?zֱ_^'ood.8fK,`-hdnѴNtZa6PJ6vW+ xlQ¤Ƨ?̚(/#K&ŠiERW{uw"oL-gݶ9"Lqw9۴6U>ZZh.?k[&cd6OvmL"[bTឳui*wyim mE°̞H=G ۹X-eG)#x5=ݮ*;MN,$ޥe2P>#/WDk^Lhm-u+km&2D0g[8]=ؾ <iuYXi"\^ibZL";8C&tBn|:Վp."]4#)`8%Ryuk/W7h/Ғi:H"D,Bn@ſ=.Ún5_k(KGsnG0Z/k-Ӵ;TRnٷYbb/"X #Xio,%}ki͎/vx++Dj  :̰I$t='fFmlXkˋi Ȉbe@bazMƋ7&IJײ{vhsPR@5c?K}}[iRh` GipCG1 ^i"ݘ[[|'5ج"B:Bd`g(0W~='r]8O`w:҉3^oK5ex0t{Mֹo|QxFϘnpjwey9nH[iI-,J;~MwXXǮxtɋ2a鮗t38+au^m Ə"ȁ-M +Xa$d&.nn丆'\e|*ȡ~fʅDXKb6ė-ϋ.5u$p%IL#GhBTRo~"|W 4sk=wB兆a1Y 1nq8PHXx cK &]'2GxrLګ)l,Eմ '#}cN0Ōo0Ef"]nPh1ld!$Mejcs^5βd1y,I6HN(h::.K.p&KpIX}؈6sG.=3Z,d:lv xFP`L%_gVZC%ŷȳyю(s(F''n 4orYI}|Qw]DlpFhppۭbchPO2i],]*3eD R~YD<)uM2x-o3CV20:D ٰP&klnsk5+Vv}%M;#ʬ-v۸Į` ~̓yơqs /Hotzy Gr&-|ϻ}$`F#1BMl++E":i:QtYC-XH7mSF%mΏox{Kd#搤$6QZ) yd {oe#ѯt2CƄ-/bdo4V;}HMTmT}%ƝYKf4qKk^Kh,_9ƝMoĺxحޞ4Ymn|AdtEHoWq, [mR9E陲xE VV ً{}Qe6(]fhf0LdKi*hΟ+llIGZgO,֯$OnBhVڏ4:|Uj~2j!k:έ owkpGK{K3Ř;j$ /gt5-FQMԴV>n&HU;@[GKA kf:/w%KזkN2i> M -ЫDx.<=ojm $G qOtgEm +5ݒ"mC OpvF)icO ^CGCcMF"FאH$6JX$濸RkT0 qr%}Oz #򤅤eB h+_V/eM[63}N#c<" [aU&,>ӵ6gI*:9!JǕ*v )$~4N䶾PjqYFB9Anv]3!ǖ[ޯe[pa%A ?=kឭ}jIۋ"HBn ]ŷmǶ"{KK3˨5^])侖RP+2"\=|3OkK[RG!!K8bi6TaUܡϋG[:Qr$_2 q~KyEiqwm$Lr\ȷ]2I%paeUX&IRH4{; f[/&4[vbꈩF?7|ƪ^x^ԡn5F+o[Vha{k ƓzV$\io<i,Ql|Aðy`ʊJ-Kso3៌~ |1hJs爫>i\8P/`#Pd-33?ӵYjZDMKhlEIQ1F텣B1端;˫z1wh.UY,m[ɑ*O1ɪxHjw{iWw[g޹k@o9*@RC ؞%ߏVُ--!д26&kiľT#X\\& +u<9W"ZN-8mC$ 2y%WsȀhttKТ mVEHu% {p9ߪ跾=PtIH%˨ qr"CP#@lp.Vd vk+o%y-}- 2*,R]g1U '|C5֯{ 3tGr5̹7rE˪jpVd"qMqNP)v&X5KIfltNP8t#ef{3hK Ke1EoK 6jUɢ& kk'5MK`4&-q3x\ZBf'hE `K{pH\!Vь-_[U}ZBЀ~o@.4]Q;4,1mB`Ԕd*Π'kj5+h|iϔC0*qQ~/kMWq<6i詨Z/0o,k̍or hc$7wF)Olα:3%Vdi"LK+6|- GG|KHO1\H- .{հjT,K{.aiƟv>X)A<3GH帍cCţP:Z8":i6K)1] [Xc?eİ0O+M͝fTk].4 H$!FE[z=K ⳱ExƊCtـF *TN:f⵽Տu;˷K7oX)nyBi*354~ZI㵼Yi[.cqc!d 3o6hgGS/46Sji2Pn?o9_kjޣW:/oXKomm-̶;]_6Prшcn5[Ղ:<=̮^C $ui(Eذ$Cl I$%i:~ky>eay,il⺹dW1>a7ޤ?ay}m N>4Mmڢ]\%T7 $f*?*g6=k浬7lWZng7$2/) {3yы6zwf,Z˨[BdђђigsEdo5aUIm@>y׭ϣ1x7N3Ӣ|P x`Җ'Hne`X"`F:o|t{鳢3Ax 3O4QayD1 "(UxZWΩ{-:ŜwnwmYˈ添 Ve6 }*}qIjgM5tmBDs׹V C3F5̖^F{a6s[;QI+IʪXSּ8I[[ǘAwp U+bu%:XX٭.ݷ`%QEX^v.®-.νr5M;JNZ\ɕ9D+Fl9LRȬ !D (Dpj~ͧ e(FUNpasUe/S^KFKHn|K+ pjaD]ҭ56qm|%| v#+h @Df,-;B=h!(#',(v6e޼=ocJ}e!mz[<gg(=m>ϳb._T*uB*#^RdU%c+Uy/5E׶ڜv$ft+X2Na ˱5\APbѳ-=>NO6uHDUT(+ 8a2ce6[ɦCh6WCI:4Bn1LܶP4WK˱:4:K8m^F# 6tjdwIog*FVf#h:$gesͧCK%ct -Y|>IpeDZhV0Amaf5袌ZY^[v-~$W>ZMI WR?t:<[I\ΖK\%7 ȶ+V``Y+9jkZ IqAt\j2oxcϙ$K4H] /|=g@_rVOcB–ko;xL1-p$[jޖUnNvUݼ:y #mݷM^xN-5O<>kqk̶AZyq n},X : K=VKg6dp߹zb BWu/ U];9`1ZYa֗w-–nyq}Ywz}ˋ-oRAyf"Hf_!'&8ԑ, *(5ËiRM3Le^ݣ s+lNcHcTҀSvT"k!n^2yʯWkq*Hq炥GAI(+mB +.(0;2ܰ ie֖ϰ<,UT*FK&)Kw/mhU-|x KOb Ę1a(dΰϹh )KQB\шcH7Oweڵ֗jo2CIlVmʦ;\L%緖97$!F;p6m|1[kmemmḭ[mvkNU!rmUdϜ`YR_h>L}"[xD͢ZvI%Ғ %(w Y ߭67I2B#vagB,%BР݆Ŗ`K3]-ww*jTIa/Y|6kzT wiPfYbI(!G<_x\5;K/X4bybN[ΝI΋H3FXk{a]k Sĺ|K iU 2;Ո?1U[%(ax9p.`$u-&/[]MOa{fcmF"[XO_U4,6w|A DӘ)tC5IʿޭW66^>·W^ h, GL2w6!&2Óg jEtT,4{/?Ccko^Y){=2;]еwVկ#4mB:wdb]c[ Kk{M5cUL4<ܾRHH;qo#Ceo \|7tY5M%`ig? TLfǧsZ;h"xr8$AL/t{LFRIdP1[]^{;QK,][ T.c'YTdSHAEt6dWf /mg˶#xw)p2m㮞ZOQnҭ˴٫wa`4 hZxFm0]ns!+ f,n uRa;k=.9F0d2tcݵ'XQ]BDh%QKgGue||*H`p $"EjS]LmEh [Lrmc 4VLpb$m;oe >A"KnqH'X-BX"2q3dx,ye{#-qr"] hN!Q"I,i@Z8$b4ԣ𥥖uim1iT.jWy;&,?c[^>,gD:j:0زJ %1tp[Ew64l&_<#bNFGR<6Rw'Ӗ^[m.-kG4g6"ՙ˲YH'1Ǒ#ſu8W[jfZX'fx&_0,2no.hDrMeDhmwp؃X5jiZ-֙lho-gUFZ iFN#1ȩh̰Its;[ \7˅[\ʭswt2JLjmAoedl[Z[W.~Uzx^I#N(x"t"iߴ\3C? 1.!Q|D_nHBI+ĄXi\@4Pi:ME9aM):yoTLhݫj_jZi/VU֬g1nlV@أq:),Q:*;[5ljC[ej5l⁡?6u0$"}b01XUc]gΙ-0ZTut.o.[HZ2[@>IxL-*Ŀ<+C{2[<6-1bxFΕ/o5H5ktSFf#y+Y [cؾ =|z| m tCatGU̶m",,![[ow^5ύ:ZЉĚM@Aoi<ʇ%ϔvbʑ??KP>LKeMMZU̓IP^ lh1n#ZC,H&Hv13cuS|o?-4"~e9CT3(o/L]5 k9-BfI&9 b.@RvM׿Vi8"c-f#}R6Y:WLB%X![WZAf$kmE]c(dU&`m},v>!xV;Z{mv>d&c3d1C% h~ Ov\Hc"gڬc~"PPI- EݮmAvQEC(%fb|?:$Q7]0b&OY9"z- 7L+cl`-Z]^<(Z( 4i-|jmGao,f=<@Q "IK5}1].4g)K$6yat6~[==j [; jmDa7fc0-`>dov=ܯ/Z[q^lRe#T)qMGCiiaxMZ[+!laHY Sm87<ox+I!^omu5[-8F8QDf>sӴ|`&kRu{I# Ӟh! tw.'QI0 ,F,+ŀXY}֫sO&o|)-K$s%qFG}؋͉jNl]jv`d:[ G.?I'fqk]̣u%&G49m*mEF/G]#BG[+sM-!S7YD)hdY,9zzv [64.l`;.2;;3)kVöC~sxht,\pֱx:&ixr뇚XG4F~-K;V Ao2j2n$RDr4 !.`^񦘖:~e-㻻xc`SηU$- !c_zT/,;OyL$Vk9| 2H$\pHL.m.t iG3vkm;)9|y=}CeHbuYվ &+kMqI#Hm;n*#R-iwجcoⷝah.0me DϘs7 xOgINy-/;F0*ƓBC.c@_quS7flokz{K{;y|$nf2ȓ#md&/}-"YX\L~ .3:+E; S?obF)vռKij[Ackam{?#I1e/ūm6M>46k} Gs6"*o?:Gۢ$%Y w?1,E3""{;g* ˪|Π|-{oؾOf# iDG wɒ/A.oj_ؖ閳yz+\,ƶ4|:yڛoخ +]&;d&%9"T'#\xQ㲷>pdIʶb̡[EXrmTGJ0hqnoI1RKCMkVP 1 o34")Wlk$" Eq?sǦ%+9,C[|]l$DT#*m'u+_Z[M\K-'X[;lKmF-=z ig3=v^!6ҟXd1C4E!g$Ųَ:}ZL.;Q'TMѦԽn%7  \ƷO]B5;3Yc3+v(6E-4V3۫U.(kkKܴ./°-$EW|84;u,a]?7qfP,v@NrcOBu eҿz/ICju =f$Ь7eyru[ڋ\ Hߴ]>3 ا9dmɵP$ $/"x+G©>JQIqgjme\;n.9$sh^HX׵SZbׯ֮21(FIYK߈uw 5k}?T|go ɫZcb8.^&D(.ӾTrۤLl{FK|1e۳BB/ \;^jl.-션 .c#^c1YM i!Wf6yW v0KcXlhZ5(NKu} }orCHбSRY _f^-wڵG\OΙi((8 o 1|CoS͢keXHDPHaHDUA6dPPrڤ>.4 eÖҏH0m7h!F,"\XikoI~F-ڎā2`Hp.d˾Eq__Y]$uyj%ffՀ ;#okПz6L춒$enX͘EPhsu- GҤPdIca#mvFQf,dLOEƢ>r,ZM/EHMx1aɳp\ѿ _Ƨ{;j۔t}b1I {`YN[ۭ4E%ՄW jdHs䳥 oD}e<_C뚍P\|b|7o-zhFt-ڇB +5dH$4Ow0֡ujpjQèhIvj>Z!$~mĞTrFi\$1E,GᩯuoxMCȼW2Y\D7泳(7 yvR0gzo5ZtkFoo'VFUw ^^Fx>c'wz+aAk8l JY|`mI0gI{}w{_~+~zE֣hɮ)xݕSʰ4wP-k,iAwe,~ݨjyWksy d\Wq^;qoQ?OГ>?oegk[]&T|=D|y%R-$n?e{{dpnĺ1ȋl"Pmgt 9uHCY[crgC(ޢ&(T7 b13 }o o-~>q½vN`'x-(̎ʉ9eϙmim9ou-'QԥӤ`KX5i fXr]fϤ^_R:ZH7*zH9$ [Ֆ-KmLҵ uB,`-i|ƹ)RLMaχZj i_#|â[8 v2KmkīZE$. d\?׉ TpĖlћ#`Dg8x>|](Zwӻ] .܇Ԟ"tUV"pD~%N{ko4K+pGm%hv#k"*~dPT ~ŗ͌>4|]Z#Ky inEND'LR?^e;gKEh @*!'afCl8_gݙRᷳ[m a-̾SFTFG)Rc ݚ֡꺮h1[ 悩"۱*4R:J+L wN"֡ sikB!75[p|sp<7GʶMq!_Pvi65 ,bT(@fO[&K :Ka"-G J_C|;]5NKEơag *K&,!++eR ~t ;),CQr1?VRINے",*I*;s Q@i"j$}8d97B gPvcYelis?& $p~Sa C4ROd  sdQ@3?4MCn =A񆏫vFK=xfcq|R> G2EBYQO#\ \˪ mBDlj /b( D.mZh,"+K,:do/hΪrŷ/ۤ]Cc=] ++5A Oe5A-اV{ح=G(n`IK&A9yrJ ,kq6햇 ǭ]2Chr#c3N?0DeH %YxԢ4"cwyw9f]ZG7Oh!Wl;:C֛ Ll"5Ӵ{Xd2F""HX"|PY:W[o)[FXфz .vpc$īEu{a.ݖp$_:(A3G$RA,>R!OEz}#r.;Ixẻ5Z%\C䗊]Knm)VI~/LW_jZ_iڤ@5߉^kK@)qW5ޝlK-M (e|t[\4B4`MY"0 N^Iȑ(?v[w⟉2xm4_[`|-L7 $XriwJK$5F[#aap!Z)qvn):CqoL񷅢Gx_OҼ_2]s.dr)Yo4mrFIآ>/AuW1jPE%P?ۼ@.2/vp1!0E6 ㆕` Se=",P1,`«`HklQ@ZƦ$Ӧ̱A`%Ȫ/wHڏdʸX=BxWQRm<2\VU'IMDQ@ #×گR\k !C{cGXV[|`i-d[vhBxVZm[PMyE e} Osehwx[χ|OAaskQ[_;3ytfYNZYeGbNe}2^5{5efog$ "ڤihPQ+7XteKI> ^X0/.Bn ܐSik vI.:[(iTA)I"VߵdsE{> i iTXtXML:com.adobe.xmp 1 2 3 0 0 132 270 1 0 leXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:270 height:132|fotoxx-23.70: Sharpen: median dfotoxx-23.70: Crop: width:270 height:132|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:243 height:119|AL IDATx}XV_9gΌ"%bb78vwcw7*tww7RN׿ / 7׵{ONLLlfDDDA}}=|>*++](f݃jkk9uq–S6xnr8xkwiݵ-eee(--mNxvZMN۠msg$W?',: \dgg#++ 999yAA?;)KJJh}6vG|mZ7[1Ӷ9^TTԡ1s`|Πed6eh R &X~m .hKvmtT SAv}Şs`$K \!*\\]Xn>2'eԎezV[S)FAJcБjk*>m:f*h=m3s'\^G6AKU x ޻ftYI n] ue(/> UQMQn 4 ď+D>m Əc*D(ێ#-/oɮP,mo zk*qx" #a`8* $leoB@JFyxt ô -- EEE &&&PVV,J`H/.iU]V\E̞2aG\gGPjvV3fx ĎmB}2-1SmZ2´7 f7M,444i{ϣB?B#4UUf񙍰PW p&`nh䩪B/. &Ahvq+hH @~ #}=鑤o}#cGXq?yŁSCZ[ar6ӟO8wGn ^a)sk auƂl)CMh:mNOOgLNN~=[cb|`.r;hiit/ wl"pt/n^K Ȁ_]MC^vZso\3Ua8y;`N ±}qYD{071娅ǏcǮxJx)LݡB|b JʚK @GǣH(8I Ӗ )!Qd>H_B)9}Y鈉DXX#"wKV+fҏYL,--!%%%%+Vx sg33y۶M骣u!..ѼX~=A-C +:ʲ3=a u8Vڦ +7̇4$$ob++ (3`LZ0l[1jRp XAINN[Le x #m ,[~%*Kes졮 H˫n ?@!Y* vasQpr} ĢT`z8׿0XJ g\}q7q& @ B0xDx>{*Bb8z^cʑ*q1QHHCUǮ:!m?SƶM5|[nm ѣGg޽BL5$9>u+jիWCEE-*$8/_¬ao%9Ca=sßbdS %=oI_YGcpUŨXcG #f|qrt YU7 Ɛ'ﻚ]0;m%I鍃[t{-_7,a Y"Ht-b{L!0g*Ճ0RXr OCSz(i`{()0a|ڎ3u_S0E߁8^]=2F=_ Ktn7!>D#̄HģP%ІYOQf6=#u2m[s cLC{m{ LMݻwcܸqX`&L;w^6'7p]iCVF+šhgCUNglkT>LD̵ҁPIXMZEdQǥKalfW1ZCq؂GA1N ıuV/bψf"~72m2M񇡈C L4ҀhJūq2*@z:Ͳ>$2jkunU&o( A%=.bTq35^",$ >Hf| F  2Yõn0>B`l"C`hEuvŭ"wMveΘc43 ڂ9 ޽{3ׅ;Z_붾-0wn,5g>/WhgeM{뇲0PCe I49g.t1Us2`̚q{!LUm6?ވM7cӺEUK"%i~8:Z5E\> 59a,Au);f!Z8*I̠knXiA3~^[`ۖb )yXL[SJZwG>t1{lL8g|hacsMkf^l- t/X2ƘBUMS\Dtj9a*d4T0 D sY YA{_@9\f@QjZ06 $ڭuuub1`(+ov03 QqLYqD3~ye.sϬe`W!Y0S%NTP jfU4W <>*d5`db ccc0 )YC, jakgL"TK}IYXTc#*OJJ† ʆcZ={5kִ3^ i Œ `A ;`&rIAB'S|:}PVfWPe[*y,y]8lD&ߧ_[t6P_pA$DѼU%5IPoZb[ȫB]m)YۖU­l466H 5A7r+X7Y0PE<~N{aS |CJ#~~~F io*^0(::NNNBÇsFi$F[' h/PmfKVBLL GzNTX46N퀹<g- !͛7q5ٷ L!lM=]1dhdž㎈I&>U0h3aΰQ}q8q>gfyEszL5䠬 E[80 )s ja(ȓ!UIxztej4F$<<;EEG!ŤS,K*1v",%~I]N̕$XvrPRQ%Iɉp #fs3Sޑ@JӨ(ږn{mw ! n}~0s-6UA\9M&I8cXV OIe1MNq$K`adi,)J$ODiIhe:?{ƍyiaX5R"$`'1ď?apA~f~9CT-ᗚ4Uď?TG, SG@Ld0eq!(OMs !:JJbQUiZDaіL-#Ouܳ rCE!Mj쀁ѣG$c2:5?6F@Plj a~S,L+0IX^J r ^N ƖӡJY|QNU fbL`ai 3sKL[4K̊2D=2"1ܢ)eX>wTkh䷘0' tQ0!>͆c.cSEGƥΣ 奅sr5ɨmg Oc10"~.L-p+3߼#1l-7e6n7tAMHw/%n8<f0&<Ӭ]_~* 90s`4s7݄*չ]_s`in !95Ґ3fN3wMR+5;f̜f&<Ӭ]_~* 90s`4s7݄*չ]_s`nܻ%Syi e}B /Kҙgb\;܆īW/Tt{w>feg#ϧKљerb<"Bޡ5f!`.,|66` tOTCĥf!^Y΁>/NJkÁי|3`M ƕ gpq;zǏ9 x띙D8'./?qq$/vϕs kqeҕL`\5_oϯmĠސ4ٳ1iX*JC|GTU1@nCZiWNCI܋K?1C`έرu]/1k}:w7p/^==6c1k X7$p$|1:} ٲ_OÅ#mEx?iS]9CМsϜ~҃1 rW` yK4BĹc&>l~ Q>u.+ڊ X?"=`p?&ڟ63Vӄ΂ dT,qѭKw)θE#/718n ˞_N, [kP>u/kKq~b_?bM_T >DNF0FY@t"F ko im|L} <Űv\J;HX`vaJ8$Wt z{d>/ݿ>pG͟Mˆj\b"*R32ôCz2="u18f4$!Ns07{puڴh"EL_M}A[E brXu;ހ%ҽ5ϭ Rw=B]b;L X7ACS/q>(JK`ܜq%Z ,Ͱc(큹5bHPVE@•Uvy0BGASF ;eeka(HH-{u%i@zLP?Gcpu//N0D\fvy3#QK[ "&(_pU=sO'{sEQ:Qę8{d5L45MXF/b>,KK #|[`{|ՇT= 2XkL|||~%jH"W X6 =z [frqF4}gJj0>YQ;ul`CZCx";@~5csIjP硺? vqo-yCtJ+S =T;|_©,MYFׂrPWSDe=tXkAI>M0~h "f)`[B3ˋd V~ XH GYKN?"1`@cGRy5^~W/_( 7.$DDE1Tb(DEA28{!0VXNp#,Ԇ"(o2)uDE5e|U D3Mu`7g8rںv?t$0Ys _+)Be,_^cA%e / [ޢm%kHaP|jx[`/;V 5?=_.Ÿ~v-D ph,&E9oDW,_/k‹ bQbn_9a׳f0[-LPoQM m>㈳/5l6jXbfh*k퇨Mc5 RHO*A_G8 S/݆:y^?V f&`sFT!Bjb|(*h:̸gVquq>Hu7PJ,GIIC~&/k"0o/f@ 0t%a( E 3H }Ta%V M99L|#@@ -*BAa[KQqN#%sÎ׏Pێpt=@`j>xPQ>?Kf#DW4~|UMtiJ{bԕɍYw#0GAL yss8u zqh ;g{O|$8=1{7KSc2zǣM#Qj 9KFoBm xQW85bcKǴq|i4===`m'Z2ZC`3eW#"1=,w m`F Gޚ@8'j :BYD/'51e4Ы(N\D0s}1odTud,Í4Ze6eQ4ʮubf2kW/QWP%  CCaf>cFBNG;>3QRI Ja'cxz5C-~aVΰyKwѱy~F3h뮲4E7r0FiUtXPxc+fL Π)SW]_hN\bE5U!k?Fl98H׏T=ƌ>FO]JDx#fn%Jo.ёc{`~UCXPG_]$+W 4=F'8 ~__u /]G.ps n!IK¥H)nbz$/ Oɲi9swvnFf9hk>p&ϩS'qvI4W#~"RAу,KAx2_vps((@k*`F\qq2$F m?xBKZ`%h]ox$b B=Izϐ\jQWX{k큹n|֣g_#lO\䦿P^ &CB\z5"/9SI[ߧ]4?4~{` '" wCё eIٯyn?Է'.N CIqylԉ(*'-~~{&t owWhoרAlT8{>#s&SOΔ}t'}oSfg3002W/_k y%~'G-w?B]ul|߈PIOIBp/*+yTD~_}:_xEWWU2`ߌjK?z74A_S]E>́ 2sO70mLݕa,'Ǜo1 ȸHAC!7+hf_PRs1EG!%1qs``vOԕ0o b\A~>BLN<]iN;W:P4c5ɗ:z{0 N9ɑ8NY>QO7mܯpS*;;Yȸ*KoUzjlݾ Nn~i58\9/Df~qs o&lݽbQGC`n;Oy8~_VĚkQxEǯjnm/u^_WGi64/*<_ 0=dS]-@|COy|Xa#ٻ!T;Nqՠ0v 5`3j4F5TSC`0E݄ p{AY"L۸i5ߣ!n70uġih ѣa9 з0Ԓ:?ϼo0nF%56)5ʢd:*ZPTUDd6g}cr &*a3(odLӎa0נw@f8FL]p"59OVqهDQ+&bH(AcE"~9 aɛ.hִsӜ'c⊫bbBqطg?|# cOky ,yT7 fbf3I0wL2SE+px*(3$yqX9'ÂsEE%ٌzRp%&;LySF)nSs?sU,"`.~ON@GιC&@Li{O!kq1'a 6i.ʬE1W/ 0%Bb SNvg ?GYeeC #>3G紮/྽uހjMWQ*~%IcmAjmu-,\)Yj6ںsf/̍ɼ*BkPPF@5Uyx ͡%%eYӦ|޷1nT}e،TT%F:DQB,72`N|gf6>&4b:% mS-((.# ;)S cw,B&_BHg|;B3yCk"Cc2 憗x] c)ۢjqdR ¥QE s`:ȸh&'DX-'FIh52gMCAՍX4w:d4q) 5m . N}T̶ %YxZow$zǹxNs[ %9LYI9du-׏09g/$chJ"wcP~P2ڝwL?[O_'@Fu l>pm0}h Wh {zl90ه,M%Rln ap @-?LjMf4ZYvv6֘xǫfcDeu 7ŋuȋ {ق*~ـdEE?A^U` &f fCȣЧ(3oAs8уɔ%Kj[B#;.BI{qsWOÛXb*xSj 3Lo H*bui~Z4 EwH{,* Xk]WErn\=#} 3# iOOk~į“WT'ڟy #]eCC񵿑e2lzyHՒTYVTp@E=zb"hf9`NMJxk/ pkT"> d0u.dTQ wvBYJ +ʈƦq:R%&xuTDf3<3Gjbڦ}Hj/ɗ)Ui66㗄BMBV3W_$'nM绷b(6.jKcODcm9V`$ ^PTfSGCQ]}~3V!0בKa?B=DNl]M*$ElSVU6 '+^J̛Р ֏àJ}IhD;I%Q.fg^^ D *dUG.|{ß}xK-t-`.jw_,>zV RUQ_p<Jb0|"'[bHn`]UА)ĿB0ؼz|M|I\0BVeӗ"Dm3<񍓡e=)!G{̎2yN7ɘiH LLJ˦Z^Db<qUo0=u3nE-%@)`ֶH-)of,Y1 Bjn@@5*aD6 ;._0V58 '#SUI(D"? Fkv!>8c0U C\?Xi.]ggܹu wmƤ)3'5r3 Dfɍ#1T"f<<%-Oy;h(r"=c0gydT!".3wG^Ǥr^_ѡX z ((wwƹӧC\ >Do)m59|/Yc J*ckjކL6Trqv- 1o"X@[C}'P1Do:03vh*@TR.Fi%,^wɦiLZĬDׇc|ΐ`L\DPpC`fʊr&BVVh9#RO|AA'> .GHRNS_}͔!.ݧ.!C`fۧnjPطҐ!KeJJ܌TwCYVm0q8؍ BICWTUW/#{\ F4XZҰ_yE0l]9(k@SKj:y H+* (B,BGGFȝ,_pu$fȍ80a `~D30ڋ>~+)eO4'`[=җo\l>Uxݝ>>HHd}6oYQ."C|Cl('B=9/;:['s$3^I>y* 777̜\/CHpy)g`H(W>||>pb1U|1a -9c~By&e <B !5+ |- A\?<<" EnAӧHxx#- 4s  P 6H6]M uXxޤ z1a;Rٜ6(=\嫈YN탱4f|`n[Mt챦xi>asT%Fϩffj^ض#S73$Gӑ>qA<$W7FrNoG~uҰcf{Cc[}j+hur`mp<׋DhJOt e <ay햣`m(GK+I |[9vd)GȨS!5;@qۏwlO4=M$Heo:&<3}9Ck4xLdljvBcJRs}hFVT{44ҽUn[ɩ /PG>1 ~Xq k}X[RTN`b<﫣+ޣBb0 S1ȴDT~ VQVcd MwXÂIږ"^hC䕣0QMx3Rz! SMB_>զF+P_{w+M$ z%/6y.{{4Kв_ܾoQ!x O'D+g3xx3% d T]P> ! 2`Ǹ> 7Gg a?]fk{Oi^ZZC`~!`A+ێWfJD,&? j[fvw jl_hZ紣c`%0_ Y_M]}90s`-3f݄80wB~ ]uSsv]IENDB`fotocx/images/mashup2.png0000664000175000017500000013152315247006660014367 0ustar micomicoPNG  IHDR){tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 277 330 1 0 HT:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:330 height:277|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:297 height:249|%>F IDATx}exUɲu{a$4; QsZ;;&ì]]]vuuL0D"AnnD2 @Ʀ5(D'oMrrr-,F;eusfݲק݌M(,,*!![CHIIAbb"'\@J233Q[62 qHHH7g5%##Chr ~^6De2 &&+ 01V7_n/76AJA|*Y +׈"uTA. !/jɨO:DFA*'-֠O'St#$f傷uStt17iGtQ>l״m3*RM+`^f]&Mzٲr2p{m|>_w+l+Wr͛6mDYug42Uˉg2p;;OޑM Trl-@7Nܹ3,0x1Ŧw1cGSt2_ wZ4k-Z@2:")=@.!X4i4ۢEhڬ쭧(j:vèCi`ܜUxZda\ ڨuL½vVwG78nt4T u5(øs_lwo#bi@Y .`K˫@\z9/+/=yd00ˮ|WrYuidZ+/h"(++cxmt 9=z4<==?yyWrSoBpo$HcSs^CFM>01x > ;Oj*J6 4j (UP&H$y ejjc'`ȡ蠧E˷"0>yX04 z7ىAسr7j axC%cPTT!=B_Gۨ`:+&y`u7/{>ǒ9/~HqYum;(o $$k׮EyfL83g΄'mf1-7 R8r0cݰ\ 1qDD`ps&y:bH/.AAj0\Ood>m8t9R3`r4}l6H@i%24XD8rb [njp J@hN}G΅cL<|^٣`H@ھ8y#O֦}@i:dve3իьrPZ: QJێCҹ0&cz1SlhulPLqy?wo]`d6 {n@bNMM5X5{N" *4)eM';Xz ^\X =5Ut Eueʕ+&~V;GiZNtt4x7g^^^:MyW]E&A* oa~h_Xٿsŕ@y ѸqSLxޘ43*It=ZX_ TeD8b@Wcw ϻu1G]MQƚg^fm?(H9a}f94;⼵ rx,uŐ!anjd82 λ{l8WRREW4݉P[ŀ0>iSu ϻkq? B^nUzޯiy+ԷR9pzq -g)M0kM6,GF?5HDB=vbJ4a`g=GB;fEiێ:a+Rn^:6.NH$2Rqz\h37 xϞ/g'hBSKz;@f۰J }aq`&`=5ˀUnE"H}s gɸե]-WV7guemk3sGL"DewetHD2 @ÔD')Q % hPQiDAJ-"Hڠkb] SkAJ)Dh2P+HJ )).OEt灔kq6o/^RE 3&`Zyin]meZ^tdӒAP@珿qw'`ixE?OTDX|<((M 18$\);|C۷ptt ƣGM3/_DP`p[xS 19erE<>GxNusFx+S*Emadf9=m6s}\/i\H %@m i)ҤJL_7oD:y/.;޲C?OjRH$J.ӓk={bs'jR

    ~vqauB(!W|9,QBj[w&)l_ V}fIE^$62㓡iYU.[(#g9(dzy:djNvU)+k:=6iӥf%#JB%yxXKA˺<y6e)윉[yF1￿"> za)*`j ^?Z닠}3OT \!CM] [cp~ゝkfA[S Z@˸;p\@W`jdu uBUM_x]QAnX2uIm۵Iڶjm/G\ -"ڶm}F⹛JSV+v*PڶSGABݫ HFԮh UU(++AIUs6Bzn C hP9qyǏhY`.)ʅܳ#E nM=_ IgꌤpY7ڢ5bwpEQq1TU3ẂTu`u2In*b$DbYPWUjݺLz/eux;`ָBT541t26 ͛6Ó )~1F؈B<>c c6wCYWZ݇sȏh`zmS:G _Ƣ]k1xiVZbpq.1JRw@OO*JPVQŸkIbI.AM0&[ WWpp 5"o")Sb-/y_.ţC Ѷ*e NIɩ$B UN ERNNk{ehc;BG0LoƵV03PHefQ^6npFXh܁u0i:or=}618Y0+9ۗ>يG6y F4FH0> 0n&kڻYSs^ Rڄ''97NÞCAo=q`#rÁޗ 63Gva'lw n8bėIIAa>vf=YxyĞ53&%J qlx4m V{8{t;B !/DZC8}:X Hmq{R"}8(bƊ 1.ރa f:ɥ @I+k8w-L4 w¤zz+" K`\ 9WBҪfٍFx$|=z[>E`K3;V,'aӌMo = 4ĵHRJ*T"*&]+פӅ/`.|ZRg夅a CX TR!%iX7g4Z+#0)E 3戻wnku$6FшIPѯ#gFj1XV릣u8"la"+ a+w4.Ĥ $Pw;^6 N2kdwnhy5|jH 9SŠ='))׆0wP UW@EI/A,_Q4+C{@JRvѱXD4!I+=B" ڡn}+[|b<&ZS#ʴ7P!zTCtPSUېV"kS"Nר]` Ư&%PhH3Y_#-eGML{ 9R`M 0: SO$gX=s$i d僌ݼvCHkU:iHsn:c9Mf4Hqpdhg}V#' 2:akD&З$-kkÿR)I wqN*^qޟfD:Bi?HuQ\&6b҄JhYuw\lR%EKѽx~l1ZRd8'{+ۤ.y ?:ޤlY AL4>cg"PjCluD&-#1lU~l ^b9Xt:uA - '*Z`r2Z `{f=4 |O0n߇{`nMyǞ")fi'sL[w3FTLb۷`R$DžEݣ gcPWl P ۖh`ʄ jRKqr(h#Ǐj@*%h?<{Rdx^ÀNX~ y4HN=W& ڪK Z4o~cfbػgoiy}CXwb%Z%k&i\#H=:0ȸ{@Y蠁MV>k G13!y_~~O`P ƣyKE'Ҹ[1Wg?SgKafCbU4'`9*,z?O@Z[2EqG38g 6nߍg/ 拪kPs h/y3 IDAT H } ɖ_4KmQ4x C&6"۫$dy@!Tj!~g&E [TFQ͔.]y)*kRR<Ϡ~t2d򽴤HLꩅ#&"<_VV,HQST c]`FB6H/;#aO uG'C/-:o?H"{B;v¶۱uVl܊-[-q9Ȏ[.]Xd*L:`Hʆ5 HYi>IKӢ}zx#954Hg /)}Ppl#yL%JV'xB6V0Hx~iohmMv*Imp8$ >#yflܴ"=/Ta"HfNbjޤ)lբY|IuS;]nJ.1b"ePY6/4a9H'T[GLX2MZ2^6 RRǟ{wH j;,#2u1kh`@%ARGC_>`+'6|Hj2mB bEػhR <=JO; 32SGeWWwnݗIK2h%"MU9HŅG*"yZRa3 ('%jd$+?WOA+~yOvtjٛ#.;vy k3wqX$ɐKBM^)-RLGw1]{VKV} 5si{Jp4 i K2qB74yw{8|.I,3 5j0K CaXrɍKro.TY1H[3Gl0vhBE .!ޑd8'-yۤNT1^&2b m c ҸbHcѱ@M jK>H^b<\Ia?f-[yhҤIyj " wƒiàL3LhC;4˝xK`0Bػ=]7.Q܌,8ZB~;XxX9Y5MI}^(qtVĊgD>!79. ;KNs# PK2;G./:4J2&Z"0:ZUIǮ 5r33.Z ]}\}ZCqjZUka  X `:m+SD ϝ5u?IqrA BQ:N]VP3CpڸNuQȼ'ƴ#wmQ\TϸsLt jtLuWA va?^ >F +Fv^fAMۼHBoي\h4Ph,uAGn݄vk;uġξ }E.8s!ޖc^FfƤ17O>.,vvA@ NCZ9` یL2@fdc^L7B_C JG&=4i0ZD'Dx:ڠ!ۿ6r& A?L~wWh[-6/{d \r~RgΞ36:;_~hRH*;畐Pa3vd| w9vp)9ױ;교HˣhQy2:QD\6[Du[1MNZ/- n pT.?\\)YqM9$ve0P`INҲPξfBZcoo'y_a{ N.'{_&SXn+3*R|D_E>o\)+@G9 wJ:.ʯLDoTZ&r-UrGתkv+ϲ_ɓ:?h^V~WF/,;ϥB1;gfNo]^pλ,ײr'P)W@[or[&nF^X߾K6|a/}:_+v U`DvvcѰܳS+3傔3cKr7{ |a!4hFݧo!+d8Tiw{: UI3h1C0o{Ơ!ðvQĐo/Bɋٗ4): 1ёxpҽ 24o7Nt[z#<,Q<~0PD‹Dѹtr'!J{Cr>^o*?\W.ϛፍB2`DR>8!1i™OA#Zhj?#n7mzaLTM2oq{s]0NhgO ;gCCYh7@43XّG$0eq} ;?)tw(Y -T~C)yBT"@wFx51}90u41d'N*~Q Eڢ("Dh2 R"H2Рe@)Q@NpV߈ %R 4hAJ-_ki[ *7Aߔy]U}k #_rAކ)±|<K0Apn_ R7' h?_\zio+p+ƺxq=Т: 3ss ].('`˔0/"(_1^:L!հ]XOnW"UG8/9LݻQ0MU|00.ݺ}m'j˨O>~&2r@9R KK / ږhL!ɭJ5F*?M~hT-&Mg*%Ia֯A.& ?%Jpi< 7Y_]  H͕߯Hqd@ iSV#nt:&NҳYBZ&eSp4ɣx~ۦuq/r:uaoS5/ -4 ig|dAot|fju^/ RLBܽ5*(y_J}s$5͈8<~!"Xsr$&aЦ>u/o?bwvRWl)IMe T}SQ 6Mak"{6N- H"{ȞmX0>,]+0<y رi-@bv8!͛#Wn#!=cZiu IGԠyŻ}Y ]g&,^ ,0F "qRlޱB9zX7aqURQ/|e鋈7R)Ě LhF~1w\lܹ>Uc=A -*c,){RptyBWoJrQH))a ڙb2ѥ%yxu˖MW0otw4k_a3\+X/rA8yp(gl$hv%)02=v8kbE=w&ta>h4I3׷@M{lG8Xc|hߥ/ݰ 2h}/,\v mq޿G} &fp)&F2u BUDO}3-'`OAH|tCRtgwq%<#;Nf|Zj)y_PfR ҃cqؼ}'ZYbh  F8i-n]S&ah/ ~* Y!صv:448ܱ SƏC_ ZAqSK0m\zq%Ic> ?4m#Ga h`ꁂ*g)43nOALa…qKnBMՂE@0)EOHE:j3" h2 rǦYѴiKtgΜ+7*%p)cmS)yȈĂi#юq.G&{8]fJA[U=C6iMqEvK`=ơ-(]x8w'\@h-?{;izB=ЌqGst23hCx,k %4SR xCe %F:`J12nt9 ~ؓ4" XBufʽ.z&#,ש!)9c|mzYt™W̘-sèH\yk @3'aέ.N۬ 5"u)IQ>c#EQ`[toO8i1v~0lwa/3 16gm"Skb]EvV:R+hwKN^Rt({3M '@UM^2~P| XqN^ESXQ= {L 6hفPQӇSjgup'.tĿ JrFv" d+_>H9&Eo*d ?xK.ӌqo=@iسe6Z1ʼbJRM ۹LC'GLYYR=P =|AaD:ăS!i)-"a974ta1b.n9%8/٤-[F E1|w篈v2ŲcaKm ÿG~SPT {(&v RSI/K론笟CR)߲!k֤ \Ѫqcq) *vУ:6=E>9Zo>xQF4dxE=2(bաD>]#nAM+́9 鮊;N մ&L*@AhޤʖY#{B˴+HBc>P6)ҥ~NZNp KXZFCIS4XqY(-¶H68_ -P޿= Μ)4`8v}SAT/ ]}vV(4eRtd`P5;W ٽ+oӓHsE)ْ$> G;GAN#i_T^s4wZhӶ-ڴRk )i’8;C6*qhEZg>.mh׬"s}G&rz.zG˻g/0f8 6Ӆv1dJG=;h\O4?*I#F7QPJN.]#H$=5;? ^CbURXK{Ӏ7kW$.ϭЈY++5((PI-[Ox x7J]DԤBY&uCd8$e tezb@3Fd4nɮGز5 ]\6}ZFZ4ؓ\m+5}ZL˨)H [u_BWR}G+A*!:;5 KA*@lRR>[)%I3ckR@iI9=$ m0|^Ħ"##ɴ\ᔒ|)pd>t`c|22ñEIuGN]iym U&ƣ;VPT7ˏ*,Ktn /́h7QJg*±Ń>TYۈjpߖ6&>[?ƸF*+@ۦsBVh>|z ] aTIZHZ i5ԻB]I$̩YmAi>24+hKN()i޼?.={`!q\C@FxWh颉V3i0o ݎ=qh#O/oEgl_ IDATsSxC@hO'y/OeS!iaáKC6inlEV͠ui zhcܼe6Z}ڂM&@ռzrh3`m|]4ZA) I1m/\`'1jZF7͠adFav7P扉gt펨igĎ .?n*ȏ〈g u`|#$˽VeӦ8(LDi(f^X;&Pc\ %0JAfV6in~x-%gDTC a(!@KÜNq𾿓uz d~kځhI1E"_5Trb<Bݞ`|Pݑ SgbĈ8pFvB1Z?Xf#څz"P?؇FQ>-v`ͅd'A~N:] =]6,±ֈC9NusѪYs} dJ qԱa`H3ݨq:u F Lqqd5$-_{(>Ώ09( iQi:"N-5gRB &`]زn KBi_e0h὘6~(:+iv+hIa8u!L:b8zd/&.]{M(vљ2u3 L!=sH!㯿 LqU?huQ8Yp3c%R?>qOaފ˚Cj\(n]>}u|:G#? ).s߳;p]đXEPymIsDZr{'-Db{y9ۨ#O7 x|{"i"a]yd̓;ؽs;6-{OY|z>I ˚xeq^v!Ki!;k&h˟ߕKLVv+ hBlgON4pEMNR\ȓʑUBmhJCmN:K&}/\_;"1.b:${QH?ȋ7/T}$/-k1:}$\^"1>V8M$ {q| Y.Hqt F (I9XW>%eJZf]\ p}yH.H9б,BTU*9^#"| R/m EvK'ƲC( !+MŌ~%d[1#̄[lp~ѿ{<:w(<}G!6+GnYLsr/aӗm'yS(7?d%|R>y^v R/5 ;¼k< :~ /Fh'ə-08orZaihÁPuͪM*/O.5& -#=\_J%x,QO^U׎o~- Q?c_C5G_Þ}l܆}M(KSn>E^90z cT<+Ǔӹ}*T.E 4;"Z~ɧ1! (ܶ~1 Ro1Ci0IU/W~ZJ) lT4mQ Kp~y=gG5rR>mURCZ=`loL^ aYtO{UɖmS;m ii ]K´F؆*/A]rthl R8b @Y_)<#YhD"2<IQxj5'hY@gsl YC}0; /*" I(,*(WV~I?-^37#.e&NM%[$̴DF h`ڒQT,EG shdeeI#ޥIs2H1xugfYY@9Ztj2 ɑҩϢM\Eb6-WD0.D) 1HN@#Ѣi \IˎI:Z?j{Q^ iYv}h?džd[mIC+܌O_@=%5 E O${YڝB{ &6x6 F*Sn_T$-C'yW ɉ4{B'E;c#LDJN+ѵ!T4ana6c~R_P/xu ګ*`ӗ(`LJfhަtf"([U:+@j=c^ݕ$Fc`#t9n1B\ٳ-byу¹[A_O'+g%}0ӄkvA 7y/dsSqb2w0Ն%W SWpR*)̅ Z*w24Ř٫qbØ@8? POSVIN`/@]K&AEY PUQYa*,"׊Rp1eL꫎`lCWn"BU.LR@W]4 jPР`u0)BrjSL``dӖh֤iHEa\wYy] U߹+LLM1dT8U%~ RnΡ"=Nqxg 75ult&F[QZiHw4@}lhkQi *Т/.>EPIa:_ }m hCQam)lZ&)ͱ[eo}gtw(a""vwww+*& "twww݀~~yY{oT7Z\sk5'$Tq&X?, Tԡ$5U=x6xN %ӡo8'f')& (}XL.?1v,4Q'}jQJ :7,V$3fXwuԧBR}$rH0+Ẅ́,!--Qj=Ng[Iw4FRP;ݸK.⢓@u |* u1b2n!16{N']S"j"E]a@4}|i R^R.ԬDBDR\V:0 p;RB=~ { j~೘ hU;VN.May_I0 KFR|%cG J .uGb *2b̺wY#) 2j001DEĩ >?d4!Wx?DA~'?|kNG0FO 7P9x$~' KHS?JHIy"h'yeSr>{mHhBVC3Jz1T z;IX2IX 6#Iuu?d ɓ"O I*%PÒPX*۾N=xhl]bKD/ہa$1L"^o)y[nΝ0ds$da>g=|C"2N˷MU܊B\f C3sy@"wݑ`7ـ>J ȉ8dfSI%S.V8tdӌ{؄qiXJv0nae\W-QFc%-34f>V1vn}SgBZFGÉ8هӮ6&)zMMȵtɪdM8 ÌK<ڿ bRJ9j9c0Q!Jm$Mue84zYMFF.eu9DR+hǑTGm)ʌi#`2sȘvȋHmh n>l@*)-G@Tu xMr6ĒŎa^Tg]=sSϞ veе^j<{I1=rAb;j+ &*Wn}R+ HqP)Ȫk'*<*$Q~;77Sun'ע57o qaNĬǐߑ_JC\H)5K^fۃ2y):H*"Ey2b^eo0Os?GN|b 6^#+WS GBJc<]oZ,U+4nAEQ0d1~Vds`7<"td3*#i["*% u"7\+΋GESq!y N:I6p 6·<Fjsȝ#$e.ilŞ(1k&dND LZ1 &ڲSƖkuuI" ^aa9v0~F$I߷u8x& QS/7W~B-.I) h@1ߛjS_Ihfb9IILH@21~M*sTh`ʋu0"Iδ@4yF:=KCiJV^Dp$e0s^tmQF 6s$H7B<$T"6ϫ23`Š/ǛH~2B֮nБ,N/a0gط?i'yWτaoccOMJv S±;5yUtE+V`6\;ݫ/y^?y[! cjkY5vōPTA9xUklF1pSlܼ׭҆EVck(Ÿ !ilA.Kϒkn#ӆ@NgjZň4:Pov F5YAu7yi˖wm"KhM^%o+{Vς̬pw~1khs3IbGmc tG~|l#6m\AY _4 _cD ͍HT#%mڋ,A [4VqgE'#[ـ $sayx|i=Z.a3<8_3 E]I%G?o9jl,YD-gl_$z TFRCLއSVҫL 4c$End=+8/F+IIӗhlifI[^=Gp]ձ6 gTadcs'XC O=84弚0\d ;]Tƪ0I鳎8s ?'X:︿skH ޞŜHS^Rh6GRՌnH74ӓu<3k'#\9#)C>KR2/&2=.JUoNˍ 9 !Owa?;E`6u!N88豣DG(>$ez<I휪QJAoJRy(X#'‰Mk8-EeQ{ gp`Rр=3sT8@+x]ջBkgBT^ ηAXe)c1J]H=="{js؎MM+_@iZϲ(w؏Vcwf UA4=]WpqL_hx}, o4 u ꫑N.qv ߎt@uKz̋Z bOlC_aIp1*ܥ(MϮB}u0C_D.]Ťj!VHi' t@eq@́Y>Mb<%/"ð0lOt4D0g.T \} ,~'a mS򮦜탸H(7rⰘ -ыɰK3qv|((jAd<ҕ&<v 5)X6&"b UwIQI,v#)/v'JڂtҔVLe8iVGUx| 4e%#T7KT!GS]Kz΃ؽXA^N w;y|0d9Q3HFl#)6~_J y&4n8{,=B(y22r5a!]7jBcs2~8r}R0oooAƆR4 cәk׭L+ł88r}CԱ!># T^F(O\Nǹ.8st;5!3O֖MRm\ۖz\=<0μ򬯡E1[u6ڜl!0-뱵c@vE,Q g0E'd˼߇K3<\q)#BD\֋@KAJzf$ϔ 0̱!Wlzx!tbf,H+~ac>kFb>& τwWƾ!۷/e0&hnMUBAsew eiao,k.IbLTY[faŬ ̝l~Է6sF5_1\UYXio~S]A Չ#Uko fȰes'漑o<l<>KR8yތӝO1ÚEA4 $ů"o=x G(|?b͓ORu/ [q)Ok`YJOMϓ>}C RMX3<|?}~꒤ss*٩Mt;O qyY {r>ǹ%I$UDmvAӁs$uħoØaž<=}}KbJ%;GjaPLz1~ 8h蒤y= 8F9a0ghɩ@$H {gS2+/ŋ|˰(Ry=R#qU$|׺1@ˋI.>G g'ܟ7!s]|gp{U?>_ӎϐ"ng:M8Q$(}jHş'?_\/ ܟ]0ӽ(L3'uY!15<8 "qTZ b8刯`RX?C,êZ(d/t򿂤ipczλaȥb|x-ɧcҚ(`˟/{Ó8ۤM=y~]ۺ cx_;05v3p%Dt'TkHkt= Ad)%`b1MxYea]_V~$EB\T#UF_ҏ?Ry&M VVCEqeՓUV-kkNJMD=Ό0嚥 'MD= lkB[mm`M̜.PY”ݶSz$L'K=$aqk,s9gpMbO'kUͱ>66Xt-rQ5`ep}zpp9ǼӚ(׽X`.l Injqዎb=8xd7M]7w*Dft\33BphzL)ذCYl%][s'b53f{˥0g<88\{f[Pv_uE1ZkW%I6vx8lYKlW`dx+͙$T>8kI| p,oRkvGVq(],7ƆGhϹ$l;0f2W]RQF{YuUvwfr~Lq'Z/k҅2ٖ+~,rYZ^ cjwX۷Sq܅r1:.IyI #UԩW$<\  Idl`y;AW]Xv#, M5%LDliʇh]ȩha8v0OK6!<>;-i*BRV h\̰iƎ5Ö=q vmZ!ZarٹUI="Ktl=i:v<6؁HT6B5uN_l8]yIh$ 9cdh˫x"8Iy%Me6ai5JHQ#`i8xgbp*kVp"w vK⒰Np&f%?˫0=M,OWH(H&zrcuthضs,GʱvI~&ƹb*3Np̍AYg$P=*s1g"zv8 w[$"YKWaŒYRΘ甖_>u H}u1]esXnڏgdLRrPb ;0~ TC\Ӏv6*wּbú01EFbwv}\XsKObPVk؇$żP,e1O7@ap}Էo{]IݐI$^)(AaFmyEMUML a&x2HZ^VG0z6NSWW V\ dիIEELs25@QYx$壄vMEEuu5P ?0iӗe&즸Zq|GR?")%@xV>*H<nH!8BvA*ː}`:c)"J>wMRO0/:[Rn IYd "yt!)w*R&j!ܷ?@.[g aa(*I iH)ia9WD䠤.P Uiah_ $ږT߽* '$E<]H'UT}S /žsG3!:9o?!lqL᳝XGwa,9t 3bR sW#[põL)-&|*}3&$DDE!K ?P4CKzn>d ^sJLm:>#kA.^ARr Mt_kV 2Pш7y8gFӗAH :>.>=4N/ y]#; S,1X$C^MDNC!55%a%Iȫ;%l{[քP1YD DrX2򩿹zR]K#/Ct`?{QȖűr4|L¾Al"kç>/A^\#M$ðȧ6}Ӏ ?@e<kfZANFKi) ehQImױOp48:#nP'g$6sЀHWal䅌4x_4q#֡ z;XZ:PTR"`$J˫P9vVP;R X !( O]OG/Ʀ4E[ ,9ipqyUvjxyRjJ<+$dQ/V? ml>{e~ OrwM4 qވb8z~'Bxg0i17V8/x#+iD,$e! 00髷Lƞaӟj2Ԉ!v"]8m"\8_aap}ߩ 8ȰZq`4^SR2(C)22DP] 7 b$#Ef~!CZc!D 1 4AU +] BN;!?'b+IxGRaDKCU]uKO{Ka˟F;Xyxc(+@ZRrj8~ZZ責8jIZ N:!,:55YX?o" E2'>+47ԡ^ 3-N[~h U kgЧ^P솭t"-iBY `[xE ͅl*R=q+kZ(oޠYPCAWعb*D%p y3GNBi# Q՟ a1Rr&(AۡK3PCnꏇ5:>< epEns '^bu^jn$?N$Ə=! <Rj8M5a& &=I5fU3y}KL;HmsNXiuC\xF`X$aG %Q̢ocHiΓ-ѯW,<7vsq 츘Hdv N s qaް"H*+p@R~ I%Ojt{~ wwЂ@/(DK33Es(,@I~*<έ#od,9JD=خ݌/e%zjl Mz^A!gK ttmK#^x^] L_ X>QTA!e#$[ (>[ۑV`ZB{i_J߿"a E\tN[ Yl:y e~bR"ۦ{ˈ7S%&I=޻}95ψŒqCed ^BDX0(>@tz( C,zrA>a H- F:R_aHkfTe԰8חHVlFy%R|JWqM"ޮá9A\\·;Y`0WvBlP7i? uGr?<7__ bxd#<-yX2j061D+M&pݻBj VVaoaÆbʢuJLkh" XCNVz`b2zz#0=iv 4̦ƦkhI ں#봱 7.@}qƍP[N ad8)ש]3IUE=#tLQe4jjCp;, yјN9 "vͷ/ӿ#oJ<۱E`0g ~BRU4xB\[W yyH p}ѦXx>ڀ@bIA5M'QS ӻ?D :mV?|8Eb2b1ˌ "aE+'AVFcgUB 5[ShPP_46m&VSQM7~@RDnUx̍ bkk5d4P'Wa1z8Ua4 1gj0vm!84:cTnU=h%g CMçR82G*Abm8tqI:;Wq=䵭x׭ =7\.}|&3D#WҎ󁸔 ^v_Cm%_™+^֮;Q޶Qׅs'O:e$rSKf3WGޟ6 h25 W/q/a FZF}rB'6CYR OK_[&[Z7Q'*{D᯼ab_ IDATv]$rQ[]ɧAa$B\t59F*B%K"b&fpoPրo޻m&{cېsiK l|Lh"OT߇ё`N96BD 33AtJ7u,)F6mt"6+ 6#l;=8vIRyyy9YQn>}; A19 {y8vIR,.;W$dg`e& {~p߇Ӈ] I $@lsb+%|tƐȉaaw7ϒdTg/2IҒ/sd>c{ ,HR<6%%ox"o7z $œOҼ hI7ms=72,}3|~ QBwdxV{6w@'蒤igK:e0#*۷$muU%wfs~'{ $8vlooC~Hnǀe p@03?$)v{+A] 8<6Ǐ|>蒤7ӽk%(FT|<-Jz?ISL'A?$g^QDDN|~0? rلK%9(NRue ^<C4!**!aaȫh`H!bmoIN2v7Θ}Y^l?.2MOn_OI*Hy=&M>d;Im XKs_1c#M4%iC&-OJcH]2$C}ݟ-zLZq."̿Ɠ,CbL8b@)48AA*-<&m$s?TRK3ioV(w_Hp0I/ 3?-BY;qц $ ,$AT^hh(2swBR2p h`]x5kʑА $169R$'J4'<<٤Ӫ(CLd( r]HN@ d֏ _PY*5ԅ#I%reGD/%MSbE~GNuեHm/^ueyp=bwk)ߢ*{A]V^T0ng$OL`"| ɤwԋ9IJۙ AAH8 IMA kc]CS86k} /_\7t$kP53H=-H*=TrX'71RYf08ƌ( K %S -% %U(@{XquG%қ&ZbQyUx&fq.EAF^Z$*yxfүc">n0ne塨99YD}h%#&um8֒>0 )./EKGHF>* |QP 1e&D^ ɰA_5fYIQXd4!/+)%mSB7Vⰰh_59 r *X(rGTI1<."dI(URƬ1\~L0jhXqt*ɮ0<5IKF$(/Ǵ~|+ $5 OuŖ,yzFRl qS`>e>­z{?MkI*-9IXDe8Rd'cqj1b)H4xmjnv:AX#,u!i ihyN@BE ޹L/d& •S0^_nB1`2\1' 2p|l'DQI47cPɌŸ/|pbr F+(!ƨ[J[Ra"M6CKܹz#?aYFꚤ|ȓ!*BFd,u56q-EI@Ԇĸ[@A`E}|oh'9a%C̋#9z .݉bGH}[Dҽ0u &O"9 0y#*y#H )J5:y"HV̉!ӥpl-ypz6٧x]ë!*.蚦v0ӂ=1P.RLmb}wM675ci$&!qІ߹Jp*/SUu1tʛ+}%>qUJXaag!o޴[7 dGP>ՇڨIx-]PaP?i!bd bpb,WEL*-Vd֦Mr 8x!*[܀+! vIR~^#)R)T9O*)X2YhyR8$?s M `1})BR(ѽcg3dx1/0D "KB1_`d6y6~̓ŒN(jj{Kӯ`{Ӈ0"a&tA&y)3k8757o̙gjFs< B?6QKwLУs\+},SBX|Gy5֤bz; fe+OA g06mem8sG+`t8us,E <=ӇMAT|[G멢ImC ,KH/0p1#e1~>#yOIeuuc].[}1f ͟q+_/_/T=ITW ;c5 Q'轺Fv4) u)C)p Ci!=$5T#Kaӏ5e#hjKay5By>/0h _9c4 5wPI5f݇|/^E'.]Tp`L /B:Ϥ@wLW O I5&aqdиH>{7O@!%.nkH&ı鞦@yUV [=)Ԏ:l]< I 1+÷>C0@e'IxL0"q<;0r"= @ni5^^YAͰaޣ Tҍqa|Ɨ\\ ,؛y٨ZzN3VP̭54  vuT2 X̓WJX Ր9DWօaΰc=I m` 8SLn4kA]PLTa#yZt]Cm%A5mXG@FLg_DI+kM:&A)mp1 L߼¥!*$cK*+5mqa5Զ` W$Eӽ 9 瞥 (h cۏ>F-k)*(cFg졛՛?}O+HHҥ+Efջ4 tFlټi*7_(X#&=2mhIb ]uU n_}{Aa9tSOi_5`ʍ#BXwpb:ȉquVD0s~dU.7 # ˯1cP RM8I'`,.Y+6⎻;^t1m*ĕW(%Y@aqL['Ϟ `7u6)Stp7۸ɹb7HZ Q)[ gΞ†0{J'e!3)&&C+s>E! aBXy"k[RdB[ CMS|hZl\h>}qI=ƐpU894h\ ci*FL2;.ai%ln8w(`́ȢdsP0?}GO}QH[rv%Hbv.n^gcD{тAg sPG+=.V9%!.! 5X,r9Reu.LeVз 7TAPG^HϥNאMFh(BTL :#ܾAP?wLUGORฝQ_S[gw@[]vBRZg@hB*-ݳiV&OJ/)p>-+Ί5 a{qm$PFK3(/ aHa%$lTMGŽ- ",.x9 /h$JKqy+a͈/I |{KȐPYjz8@^tp 帢~4ݛi6g!\=jBj"$/?kF0\GbC\}VZdc @_b%g^R25o{NA}1nY%1g[R;WC(šJzQ׼O (ƮIli߼yY޾iF3NllXyw߳([%z"{~'GR 09#U0c!dvU'6X_M+2E #Qu;ԿT5DRh:׿R{R]$Dmu%# sKFҺSmAZMR~ϊ PtwEq.*Cg+'K ҒQCDD}a@߽"ptOm$7\+7Y7oL珖m\vbH-OJ}%I%'#ߏ9bO+`HcuIRe^zD/;'oD [1Úaΰ獽i$WbC{n^7a0x0g㴮9~~뒤l!=-$^F|l ~ qd2u+Lk9W^<}@鞁p쒤騖4:ۙ N.ӷƠdRޛc @$d U+; s_'$HcрiAʧZ {~z<= .=)_FR[NEz#8r0N='#.;+L xoRG96P @. Fg_}gvV <!Q&ӶE,݉gH TF1QT\>:STư5ZPTCgPEze~y#=`H).&cz{i1k¤mH¬i_;av߱9IaX;s<'n>o&zݗ* vi71~>np Xy?Ip;y5I<`msv6Ow%x #9$| -3bq;+tכfd\uLݺ lK?m]{R-9-!#16J2,4piRu%c1JdT* z&[[a1`9BթL5e,l޿ k-ɘ044¬k~2cp|&X3!Ƙa]#Eƒ$? V)})6Gj'R⣎ȩ!Opy1kY~,`D56[y*@}u|.a Fŵr"NM(';cѪ}h,L&L'\YpӘ<ɒ˨chndp}4e(\O>s`n:2¤s13ðad޶w6GxA!½a*ًycbmM&i3Vϯ'5#~`AvahcLH1}Pkf0&L.]x8^U1 ȶ]@u??åKzFR"nKU|ubuȭm7됗+a5pywo\C 1wCz? c -x\ۏaœU(/L y!$w_U]xc\E"()=r닉%>F5b4rhR"JS(s`yo_;~Xcη{q_GO6ʼ;w22Oag1Zi~y]t,L rH ".0f"Űoع"\z+x9nZ өfJyN,tZ\ulpUumD a:$7oAuԠi2u`-yK-}U0cǰk#T(ŒhT?Fݪ-@MքKwgm~  I)ڌ~u1נ9a<>5ž_`QWµH+¯/_ַ1lXt'Pm :m8䷧'[-GΣԡ9g>lް VV!1\q7&HBx<}T$(*MA*ƶC'&g?uehRʢ" j*b1u mt>?>+l&cAgdTmhY#y$4>QQ`T7 )ׅ6J *`=nҮS2Y#"O/4P#R-$~{a~w:鍩{ȓ(x$.H2vh jɊ1݂eQ_NF0ay¤!f1a} IlKN̜y!6 *Bj;$R e8s@Z_< 4j8㎗@Ev,vׇʗ WalUǽF>TÔz^g =#Tq0jC* հ 4TZ'?ç/5W7Q ;\Aqa-fhWIYw/2/EvU[ x ُHݦ,"# ;+Ԗ'xu7#?1o4hhjBSKzSt׏q+2Eb+(Kjdq)o˧8}t,\ӻY9~res|` IDATLzgy~nxT XZ^Fi c9Q뗰R|Q4UWK7'X`&444Fa7b0 ײH_$aq7r۟ "S$ #Zԁ] p϶u"52ƎSǖ."pJ݋7o8]7 -¾ņߴ9$Pτ\ c7{-:Ei1XceN~ŋVAkB$Ildl*Y'~܊T!ċx4Mp9y 7?ǘ z^u1b~8I{WOJ~zo7}T M*0di ^iBJ7&mP&:Y,o- }-UZ^!xRRJ}zk \4A|`]癟u_jRLk;IԻMYc..9ɿcnnWv#\’OԲvz3 ރZ|up_&.93`9YvꋬºYc%iMvbmkM"u1-W:pHmu i GPօcLMͨ =S D PiS%RK-8|ˋhڸ0q+֜P7hxCwTGư fgp ˅]n~NdǺY$.Ry{[^=T>hŴ]n!t Y\m4WM&w;]kql ^I}-LwډFkeWQOHѮߟڍOT'v,WPq\V /4CP-RZT244L|D T Q)¾߁lBDZJ??mCz&m,ĘI3.R϶=mGv53y]MUQWwBkT-?8t&D>n3zf=7^ձ#`I,5IH= j+CkBƯ i`k7PGB뼱ǒzT rkL2ƙ(AuuUOk(DH8e u&LD+rⱙ,ey;~܊zªOuRҊjli+Bq'r#{?.'#Iډ rrFZ ;Cul;(rzT&7nFn۷ܲ d$܂q'0Ax ypg𸾡-Eqd389R@%&R(x솬*H=Q.VAh(& "UQ56ڰ]$63}(Z:'U%Ӂ>(F}E6v 4,ap'T,16-k{_#S2xGQ8 #xjK"35,{SހovFU7$DP 嗜r6S0)a) DO8O0 RK;46+wlp0'bޯPM2Y"aow#n _O;svPUӀ.XBEcHu>1ưwBLhxvRtΘeeI4++OXN!.Oy q6Zxbl~"EiBT$^~C75Q-QO^V ???ħuB,)Ddh R!@E_sbt+d% aKC5#_ByRPbiyW/SVCS=_ArLjBlRzR9ǁvAL nnpww`*ibuu(AxKȷ!sy;$o Wmk:Ȫ-̦P}p':O&kGbT0Ơyz{2FXe7ӓ-# edmwj)*?1XawQ^M[<#ǫnsӛbAB 8R}$d욶:$ރg!ᑨnbra>f">3W Tқ"e$ |8q(̉ά^m0-)γ4)E_'\߫.;sX켢oӫB>1oQ823KӰb66|Ñ?֗!" sʹ1Y:>E*%OȚie1(#cc""ł9,iSdRkAj0Uðp䊯? >E*-!2R(E+-ux03SGhߎG$_6Su)R{QZE 5Øa%Ű`h&Y8)R 3lYya~9'ci"휱|cRe.?1d c5L݇wqr \Zdp\Hq5Hq3TcE)Qs' :Twkގx-6.R\Hq\8AEMPn"E瀨9ET5oG).R\8D.R&(pk p"Es@" *jݚ#^).R)NPQ[8pjlHq"9 jp5AnE)Qs' -Z8C56\Hq5HqCub"E瀨9ETx-.R\Hq\8AEMС[vkq"Es@" *jr GP ).R\8D.R&Pݭy;ظHq"9 joO^IENDB`fotocx/images/cartoon.jpg0000664000175000017500000007161415247006660014455 0ustar micomicoJFIFHHExifMM*JR(iZHH0232U0100fotocx-24.20: Crop: width:678 height:155|fotocx-26.6: Rescale: width:612 height:140| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 155 678 1 2 2 0 C     C   d" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?QEQEQEbZJpk⟅<5X◉>(}2"+B6*dr %w.T7hjt{QzW-߳ݦxvak׷6o!1I_?cm⋩5i r512)~@՚>< sWğZZƓ/4]gy ė4vm~OfS?w|6 oO ZUBмQw>c3jϊ׾,YXxm ƛJg՚!tA.|/_C֙|Z|0<(|K5i8Ʋ6@'ZIƶ&֓$~Jj]8@>+*⏃/."8R؜6I'[Vv)c_jk;_xC񎺾>Zy8EyhxA^MFWOo%3]LUr6 z֚W pkGk繸H-#pA<Z_{ ᗈ/,X6+p3؀ھvIE:[ǍbF_&9Ub3׿J /"vϏ\U M< /i$嵗}=O7k;|5Q xc7#V]'[Xi^fJBy#&ԸֹsLpUT`.e}= 1eFӄ]?:c~\99|!:̐&U]Uiu0k eMIS׶-Fb!<oLmP4΋* EU3k<59a`5}pҠZ.r O;9(y|)Oܴ T8{dž;S0p1޾fK zطq#y{;5NiͳS>]pt袰o#E%`d׍MĒE"Ci^R<7w:/s1 ~VXg8`=Ǭ5ɢbWzsUucɴ>9>ؠ'_ZYR3(` #saNIW5󭟉e[+ʶuD섮\u֪TJOty/Y%R*{[B>1H>te[sڽ@ơlUJ$J5##|k1LH?w(Y18zc]&kK T㨯//<-LPlzf*SF|# y$ v&Gz6gVKG 7 2֒M}4yGҰaj#~_3I27o@}*9LիVm e]p}S0Gr0)[{Fb?^8۟jfg֝8+f< _0۳ E9Q_4吃s]HgA# ر`9SWS|Fʒ(e˱V5X_idAeE>`WQWa6^2ndbyKIk~ڇs/k,uGҚ?/3[|Ej);[ s*BkIwߋ,K7$!|Ȉǀ7t<_^TJb;7WOQ&#oe̎dm#ylҺZC< Aj{x-&V!8#$S[-&8ZҡA5Nˈe%\WjYSCy W62L:{>;NMͅKun%T+O.QKIꍯ>­6}J %`\+G݁@OCy7~ SMdҥi}ĈUfR %89{W04s+#?k|m<k.ZlKyey헰+3/O̻1s| Q(6xJnt $ @cTWEѫxR~G:JJ #?\J,\@-ˎ'7lzFW@]Eq܇ɣ1 c\x-e`XjAw?2"TS{UWG|?jn$rk^(fpi_iƶI}=l< (6d.9a'|7o>6߉5atE{h..#hd i9p>Z=G@P_Zw|W.sSözM*R B͸c?8+|T\Vh7M{xoR|/MkAP͌k=K?i;?|٩qǺblz,ƶMv{_f9F4K&~xWg'oWj#?0Yl={.UΎ?V;Hw㑎ˉU^Ev`Tr*ewݟZO^j~dӏ-h?`zi_gm<ޏ\ԪM njwјi$ԇj8XhQ_`~TK%Bp?:J 8}[xKOK/c3xh5eVKuIp ]yb9YNkWMEEZ4irEk׵meQdA1H.ղdQlc#bI`2zfPPqkrU M[\ZM3E,gGq]Y!|)8\Jg.9 ZoLޡv[4,;p=[?Il;<Twӳ:XL{9<.܆!G#ԾT״}M$,%h<5ʣϷpy\{נiQ 2Giq}8jF3Vg,mßo ,.6ז3PU Լuˋmx}X\J̪d9#*:Zt_A'4׎Xрl/#PӃ~%8i#?@/lFuݛH1` ?uBq]m C2yoHy}Qri߳gfgP}d|ICu[Xeܥ>!TS"1in ,Ou.};F8dW~9eΔZ[K\iQ@ZWsZjzƗv'8Mv>. Vc|O" !*wd)Sou-<"l6zRJmVEmE?G+^(<K^n @73Cj2N=Z:T4Y^TvK\2CPB[ݻ nju[msL,ݞ$&x VGs_>/죨X~'^ސY((j> |wcڶ&_PQOHQcǥS^^hKOɟZ6o{҂ i zl˹#?JUkwLM3!տf [H kmKL_ ˦( {k\o#VDt _z[vw~4>|='ujϕBxi1Hdrm'&Bx':Ɲiw3[[m i:% szm byJl6>_>;m_[~}ywkg6/nZ $Eo_pA=N?;QD76m1*\W+S L4h?jҵ;dxȜeX8 j_h~5-ƹD}2ʸU Pnw rs57?8xG_n]x%.;kK,FD`[\N8HNv^5 gH(U2ǀwwWgo D_$hYa~V5Nzt%ĿZLJ-|]ው|mF9g1ߝT/kMxеEA#Y(R2ppG5|%ᯍ>,I:U_E z7*!ITfK6TXǡ:> =v46'`V?1xʁު^:?>ܚwƙxm85[}NY]&ʕ!ӹ<פ5?_Y:zr"Zhӭ]l?{6%;` 07ӳSFgbrI+q"^" =Ϩ&S~j5H'AC "?+Z]H{C-tN8Nqn2m9O*)t8-HxzKڴ\LN-DK`ֽ#P7Q^$*㑌՟-&kqIw^4uWҹ݅\,΋E^@$#i8Qpu랙 acA|$`xνjgA4wW#E|ZЕDz֞'X~GZE]P9Ǿ1]Ə%⬰\pdps\{ZB̷\1s"[,OcBks؎nW^Vd+ҼOdhnWTR rF3a[cӦ>|;ܰ9V)=r=r- 2~ si=c/w㹐ɴet/P}epZn? ,[EX{|ȱU :W9-bHSYOCV(ўg;ƛ+Ki PdFF*Ad'Bt-/졽6p\Gl$PU23ZY;υ_ 5é\-Ħ4|,# HZi׺zz_3ըA?2.0Z_"G|7h~<tݱFq_Z_ |T`6SP 젆uV`>c ^տGm-wX[<"@)q3NvvkZj12\ėp,r(`póE,&u[jsX[M+$rB,Jx+@<-j6k _d Yn (E1(ՠ8Dt:xS ٯR w*^\-ʽdO:l00Ǟ&_iit-3]:w+稯%4=G57b,hC4[cvDzu^֟p_#st+ko.NԌwCv`KmKLn:wm&Ҡhm)| Շ: Z&ҳ0,6qp^SouM#Hl[#ͥ$MVϖYZedf?6N+e%LIu`P?.|qf/^HJc xpu=sּX>xc:|wI=VIv@"9߉:55; ˒)b X cO(sisOT}kCu = oX% .J;`U7-4 _̒+ dhvK@BxcW$2i:6ݦ43km9]}UrFOuKzk+o*L!IɑM8ڽ ZDŽ|W{X[Gҽƕ4L2. `pH$vT?i BOV 5ok^MWWq[.KwIhCIO ħ>%ΛAU|ԸC|b+<]E i٣qpq|]@>( i.\VW/ r?R?RYۖ`uSZWKdW"UЭ+:ec'VG,uԘ-R-cՒֲÂA4gȺq&KMaqWbȬF3Jj>S~x?*ݖ\#=mWgJ9r oԋ%FI5WwK 9sk+H|==Νi#Ex猋bE)^O.4/XƏpIk'O>L_RT1R.gyi=yj&m4"0i.T05,<{tqњger\Ȯ7[wYfY kή_*M9ے?}k+ki` /)Kb狧MG8یx}?Ehe>y|_쵶@5xnx7\26A> ^GNZ#ц,mA>G{z] W*M'tlN5yXҺzjQg;Hh ,O$KJ{us牛^-G2dnz UxFXZ+d'͐=T)2ċ{{4˻txH<ֹM1Ik&[vhbkҿF*DM]ߩqi1h5;S@_@xz+qK7+FhIj-"xثjeW5?Zͦcau6nJ/[&RG qc9Y{4m-Rpk ;^ [|*:]!/R?n.Kc4YQ-Ǿ3\ ֚\ϒq\)4MZ `X=`\r+}O;1YO\;V7ztUT7BGskԼU>y-ԣU[BȃpKԜgҾ[Ugʌ\=fp+sPpHtۉ"Kf#l"_ph?>é: C:\Ya5c$ 3V"\f7e'c"ckGѯnWY<=Ile*QS}Ol;8Gjnv _86irhnkdºZ_Ĩ]IvFtPG8U"%Қzuݴۧx$#(csmNR|z<I{{9I)uI+~^{$:ԕH^Ǚ|HѢ. d'ݽВWn;|Gw ryk=@PJ9!>#:r9`֑4rA\6s^ukX |$ry}-J3>CkqmOPyQܢq^9yOI$;C5RxCek2BI$׫HE'ϗ>-~ x_ hemG˩? |eck˻ |Fֆ6V=֌8Fq[zw|SψxfĞɵHxX v'\qE+i`_{&ZO}/ᯇzՅEMBD_E Nk4 v,džIg;8!X~uZ:gĠ`qފu:E?ެq|I2Ai$۾l cc@\O_koe冱_]A7ʘ`v7 {̳*:#<Z_7_U/K?uU%hor:wW|Sߛ*+xGTzȥׄ?: ss8lui|5 wσ8ص7C \wUЭ+E-k#=+/ ;fZzZCA8|Ѕ alx{1^{F!KcwL'Pz8r X;fMU錚hCknm8w-Xu՝)A_sǍ*hu>Q3 YFzj[6K/8 VLQWo?^i5HŘW<ҼFn1nh/4h..|zW|@4k`&$Z!ӣevF歹N6 +q]r򽓔>ZT{R \kO X򃡨% $W4<%V|p.=0kasnE}ra@[u$<>ubʪqO;Ob-mݯ7DwFrqN@q_O4:ݯ˞nSz vsrYmqkc+~\WKQoF ǭ$T<έM#s+gt\{WG O30k:i:j{ͩB2?uMqT5-<\[cu%u]k(nede]tR]KiMn`RfvPO,>Ψx3Y_ï]Y-VTAEuHgchq^n%Z]"";#jꓕ*Q c{Ǻ[vV 2X6 `r*dž.A5wu|8c=kg:8 5?A[:jɨ[$gzg޵-)D~gg$+u֫;CHB2y򻕏C/M͵u >Ԗi%I=k+yt;Yu^t11{0NTG̓ OMBg.ɨ_Lv[K$[WPpy^g?ֱ [+qqN Hr9sTg<6 [2}=dS+~<s/ec_Ż? di$fAI>{WiͬcM9d %rkμ4hWq%% ̻3 c9{%8#fUڪxXEJԏ{~li+%ŒoUˊ-r[،q瞄{ל\6xi ܾԅb}SZrmqu/){'>1xN2]F+H{pB%l]` cX,ca$PWczռ'>9.n.55mYE8} xSI,a伎Ybr$I!wr4SSpU֩魛pzUt4*ùzZha *J(0;LJ3el6C#g?t^i^+kWN.~h&f{i gIJYHg+4N~||?w8 VDè[)7 jI%څđldҿR'!/ZKco^hS\xF|چhtH`_nT |VH霎sڿ˟^xN5a2]DZ/gf# 8n+}AiKou!Kr_p9zZh?L"{8|%QT[yvHr`Bd,0\xOF.kмD5dYa$R"`bK*ρdX1ߊZiMy&hce 7:|?4|75Wo,mv31`4|m GK{÷|Uu+]Qlc;Smy"x-Ln.ot ڭ[7ֿ??:$^2Fۏ*fj^ w%TkWvA䰆_5F\eYI8"Mhs\ƃx&|I,"Hڲ(VWrO@9/?j -&!<ZE|֑X9Z~G<*-4;ymsg߲OuM?h59K} ʹPx7iGX6g1溶K+_8kgg;:'ͮizZƝj&,a7.#iҾxR嵞K:p0 L{7\?x~E?(eqmmpii 7ay2]qZh𦟮jiZ ID~dQF#z( 0IڗVe#T.Oiwpi[H#$t\$ ?/dMgOǯ j:&-̈́}ޟh)[B!h6U8p2+~xLEat]@k֚](`FU68l97hwJhj&cO5:M\C$X[sG28ڥA?)#w/O'φ6#jڅoLיf(˒[!DLAnɿe+χ$x񾻮xbV }"q'C=SwMc{xz &K1@iи?{>-ipWm*|OZhkwʨ+0D,#dq+O?SI-oڜYHR6x8uֺ 1WUʜn Wd]n|||-Pf/ kG).2o 6vcO%kwt mer GXV(s#JQ`6t(e;c,{ԟZIE)phrw_Z/xC>^9GE|3*5mKm bQ}+;(U ~G}u"vS|yk(ܙǵy5q:i.p7Z1ҸK%0@OzF2/+ÿ'g_jVva*|Y9Tq`BF̜qvv-(WEzbo˔Kgl`R22݂ui  Y YkQ\\gk 鸝hՌLU;y [g :஠bnEtVgdY$񕣮kJ>9 M$\emx>N1kmF@Xk4/FUQR:?gp &XvJ~l[a}h.7n y ,L9\6B֔Tt[q.?ý. w,rU']ai&fQ!6nDw WRhbz N͎4 +m[Cjbg\ BsHΣ,dykXds\吜teh35#ªpXV.gr6 VjOubmlFUҏ5mĉ]%Mu8ۆ.]LBvojH&9u6a5kRS}.-Jvv@3/'> ʬ.|W05IS[ny޿VD`}jXj4G)s]gys_zG`l{@p< W(/ھ{QS #B±ز*>8'q|;aGPΩl<g B =|CT䢞[Hm+Dfg '&u`$`8:w &RcXVGL/7(ݔӧ+V cH=2M:rD˕XBib/||[w&W[R ɏEv"_, ?nU.uxtj=M>~Ѐ`mu^\쀔9iPn= JUl΃ڦ[iҖ@w;VD*<(zWױ9\<k%y us݇Mkd@Ɍ$ ⼞ Cs麃La!X'!GlnZ-RhtGy'XEfǁߚZΉ$ծnY7ڢe}Iu۸p=+]^Ǜ^jvnu:,VSHwZ]L# Ezì~\^Go>+i$f;6O\?1ϷJﭵ$>:_uBݟԎ&5=C%cQ׊-1gⴖ-꤃ƭE k}>ٴ$cH'V#k>B>kE:|H=PE̸ E٣"$ J<B6kfrrXĤRcik~W+ʱ:?(c} υ_O _L >l?G?U+cik~W(ל?I=[O _G6>€,Dj}?U+DK b1 l?K'_Uo];|mύZY} j.>6hӿ1KlKV$J'6 BZc} ʹww-̱V P!XvQW?t6حغwߕ3?'G"G_6Iԑ\X]??P_H\] M? \3'.>6ح+i$#.⫢Эa-[Hz? Va4Fy+FƊQP|u_'Rp-H v0>|2H?nF)2Ò8K5cs[n5,[%ҹҕnFrjؙn#'Ճƹ?>L,wG@XKœrz,*$ Tƈ\DN; GMI>䌖mQNYHTg},_? cx5,Ga+%M\}MbYn$YV ZZFwCkdqКoY2cYUvQ6$~SEEE<ϹFHu>b@5h4Mл ƻտIԃ\SYЪTqhK vij6(2nwUod[q/&Wk9YZz*~[8@23]ͦ/).Uy,ĉ=]ρ;u B弫[H^Y tu9֥u{I;tm2I|EW{Ȫ0kYgr1U?6_[%31)Nr^;f KP >юՅҧid {N/%!Q.~1> ȧ n, &"icWqd_wUt_dT9kU$@ې`bH8?)ᑤUc5k#SMkЫOo_h}fl>BCsxwTMg]j(Iڸuv֏|Kge_9[?R==n,#zjL$J}A%'%=Ԝim,VqDC*TҺ >$cj~ :c[_Mnpœ gqzdǵIyZY5 iR#ڥ|..m+HTG&3yt"'23zx]Pk|2Ҿ~Lq SN_l[[jcN<Ķ+[wv?ݏsmT~mLӬe/#in/'%TpR}oͭGqC~o)c!i0y$ )qAcMD..nysn}I#V' Md'f 1r Mr2:;c#?/r>)p.-3]~CF\OxM^_2 1c= ~kS]]B W˾mna<0'}7]ҾC3*WLR2o2fԤ¬E=*ɲUx5e x0k[G!!":My*Q<@'@&}_F8j si{yN>WS*JRmj!2n(OvɈ:p>z柪GBdǂ ` Z¤W*>Vvz<,nNk~ (_ʬc¼gOk--1Oa_cx/ñm:I+$emOM n&q{:T~\~_5!;) y\61_bCe k,[dWz/?Z&#E쥷)}#F3]wGϟ_x]M].tS֯ۯc ݶ"P b#By6r֋Rn%cSQd 4#ҵKMFWm"}g;F~b*"wWTGWR]?袣:`O-}EUQEQEQEG< 'K ~/l]:7XKX+执jyV6zH4xOkZe֍k}F&[^nD'i;ናV~|6=wd?le1D@^l">HqX>я¬U?Lc@sO߳gm/[ĚDMoNlZs[4"#1 ½&J9/-9'TdȀ*K<}kЏtl*/Q@?TG*G ~WWWZj7.-]$$A ɬ'wglѳmkm096)v!ӭbtdAh{5㿆 +!}F37ڔK$F{'LMOuK-:wRmbuy2{$'i|5!y4GsfI?0WF? !5%k+c{i$Sl1")y>k0K9psg؋ZL+ǦFeAiP xs^ҵè%[Kԫeu88 ;>Dy{S#\??i xv&\E_ ZޭrM5\j4-ne_mbK;-׃{II[5Nŏ$Lm݊ǓD4j2NYb'<ܚ=kQH.?־/4?hqHb qb)Uq~~˺]281dHG^]|:=-gJZ?ieBhcZv>4r|í_ *i!X\i{TF`7Ƽ9RџOK;ik%Fmn%[G,I_A E>{^Q*JlL|Mh*-ڰ*$/Ir 2|vȠA?wxDtA" 5ݑ1HJBRϘ>Y Jy_—`{7+" Z! aԳC EzQ&vXLWSIThx+))[kN NFjs[3㇇uo7I면XL2{Ɠ\ToW/ZΙC< Oq^'(K߄X'$~/5vGzݴg_Wkw01){kp<FmQլk۸mbQ8@?k|CW|?ip->3'=5_j*f;BV$>Rtvb n+ ˨Q~%<<9ZhB^6lz~ďxͯkך|c~UJų&@oG>P:bmKm{C-[޽5Sʣ!H1^|ºo~!t}cNpa>zW%Hs-M"Zh{=GQ$ͦkNaAXއ޻ko0\Ģ{{t+ O.H/0iڅg_0f^1^p#1"kX n:̫ϥP]Zyzqs3&_*xR`bI1NMy~2X8%[hasuo*D6y;٦^'5l5 w]Hxrc[-lMiB ~}6а392W|Q%jd0!w{W |/V\AoK,%(|]Hɽ V:\6?ηYۭX@" ?$ƿe%O>)F3Wzv hLzതW]WW*G̷>1'Ч&m=WcslBʎ0Oy5Aȱ8]a#Oni-)G5EDlkʵ٬R tWVWҺ~NuG3SO~zզCt0^o^%mo ?C+}V 5edr?דʠtͩWos@Y{+?0 ZECY>rqE|fotocx/images/soft-focus.png0000664000175000017500000004767715247006660015120 0ustar micomicoPNG  IHDR7n.KtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 142 345 1 0 DW:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:345 height:142|fotoxx-23.70: Sharpen: median diff 1 15 15|fotocx-26.6: Rescale: width:311 height:128|Iݛ IDATxW\ɱ?{={]Q9  $!$s9rN(眅sNCr`a`Ȓv_!$v9;ۡsv766UUU" 2YcXSS"""$c`&@]Ȁ" _:$!&!:X a MYDEE˥ĿU*jp܎aLϯ-+܆~?DDž'wii)  QPP|ZTT z>Ro`z.AMTvgneeevnbV Opyyy03z6[ʀY>?|u%u) ] xEw&ׁnj U]p8m@Y pT8Xhّp|;61gZrpAM΄JpIޕƤ? 3(~~6Πf؟:+pS4#6-_i֘d5*Gf$#CLq=򉽘1c!ju%n݌C`ԩnISLF.ʻ^b|}K&</?\Cib?diT?m.Ǡܑ(I!iT"%>VNÆxXh$@\aYE=|5/l4ƚMnpt~O#"Aa:|;dsaD'\Jƍw?ᇯPpmIzT{iN \.oi@cjوGVVV6oV62-"N`7 [xt2vlsQRTW8?i)ITL9ϯa6y D$O@2aba0|ÑX* C]-?ť%ݹ~q(cڈ&E^ҒMym $D;OxY"RP)hDFF4!uer2H%Xj@j+!LJA~$14Ojo_0zI&ە[ ]L<wޅDqmL0AC]^ݕڛ~nhܴ[ f Rkj'gH7)ժbȂpaZ̶4ňFe-[F{35df)YQZU>Q0qR=Yxg1F c'l d#&=>3}输!8z7)1]Y/ yՕ!!-- /_ƢE`gg H49Cz;2,p{H91n@۴ c1bp0 7©MREYe.lÄQC1z\|JH~ ,algWx8,w#IZ"8I_4Z6$2pC&ў[bܭ~#Ə1WK=a~Ĩ#cIM_UH|Æ})#YiJcư3a5uC'wL{ӟ]f֦{as֞ioڶT 6_hn`իnOp>lZ%bҕhsW je^® +1l9*i',-`:n +3h)'lv,XV zߝWl bP&T`iZ[$rJkeQ"ʷdb̞7?R xtn/֯XL,q؝4ñg*l_K/eu=G!KaʢGo +fWճfݕWtUW>Ү]˚Tgn--P|f3=쬽Zg|Db:{W-ݶ9+:n:פo> oxȠdן=g d 1=uV3>`}`.MLO2'ydi<xXX [9r܎NԵ0]vcL/u}Tnq a2Ko>oѵW{òwG}i`b* M@nB`^VM]7nB p/[h0`.+!E؍tHB H"\7MI@Ȁ&~)܄`KoZO5kn 2 Mvl\o<&M~)܄`K҈: pVLre)*)\!"P_'nl%JgT /IvlxݑOQQ_[#@3+>l=pigaADFZj_~ƿPWSXb#QUY!3/>sgeň Dzv{`kk]vaCj46iM Chv6E(\?w vvvD#'N-n\GȭPS}H slj$Ǜd0;~[P i ?x-R"ixmyה#).tsH SQAh7;8+'x#\ .aط سwvb˺Ř1 O?DZg{?}rGLg *ya(buKcloCQq.Nٵf0] {?8Ԇa؛ys[&!00))ҕ&%%I'"%~8$&&)<7""DϩhxKu"<,Lj 2wzP$*-]]LO+ 6&)]Kw0 ,>^jϝ2aR߹-??_PD껫Dwtt|)4p.iNLH ={ $Eu6dtALd=~q=66VjݝH+܏x)x{Kcż11eZ\Vɂ7BOMM FZZD71G9+5%E-966ԣ479>N,յ}>Gvq9ȭ$+wB*ۀa6/1Twx ~yWa1u=eun X( $Oɇ GҮY+Պ(s֝;FT}k>h=Kp3K,#ԧ; dD:n$.ۋlPsȌġ5:ވ;_J;+5g8v-s XBju0JQ_hZ5oLQ| 0WZ1# ֯ť;WYj˥[lo1Kx8rkS=nQpÿeKo4_mٛ"_._*0Hy90w>8n#7 |+MVM^ATH!C_*JXOO?EtD0|+Ɔ]lCF*Bʯ+pEc9}iQ8@S7lʚ^6zW~ W_}_u R헥eX}zVh?[x*#{珄HP6Ūl[,.BbSH{DOOb)eNi$ %@vV"obeW@ M;LKFzb$cr*/czBn9-ׯb,_84u3v( \M-at}jhil+˦e-I D9YA]EbA@,ء@<˓edIV'Kq<ܚ*!sdX<{1S(Ȃ}NAqiM{n/_CfV6Rar<KG-[Om߂1Xq jnmnX a~`hJFFRYSzM#hY: MM0 _&I?'χH "vkKqsL^5$on q#@\R%~O꬞j$\&^e"+=E^AAn&<^@YIُ1dA^vVe1Ŀ iBo]Iac^^PūEKM р"Zv< K@vU]Х6҂;IsoX9} -˼A5%`Ҿ ndʹ06n7&c-p3d( {UsCiE)8q&xVL<;:6X`Cm47aܾjne6VBsG`ܙ8&q/4sTi/"?'Q[.R/ -I !=5hiSSSS=inE,V,&IQ d5Tky5[`۶3<:uEnY1'aQ2Ҩ"Cͭ:/-d=JjOjwm5CہnA[2RԖj 5\Pۘs6K`ieFKwM5H K7u0_9#fV̲Zk)*3pg%AfӻZ$=؁|=Ku{NZa!ֻRj婾f'~cxKK҄J~TY,&\2(| Raj(y$帕-{;0(4Aꅭ!(V2MU>\_ą^(Pu n,u'm23" 1%@W =f ']IT;l+&1IX;u4fl:"8߆ 3uL6H ٭3HK|&C:d¤y6i{q tG B4{nMUEp>9J% XP7zc4 )Slg$6ǐ[=%̌ J|جξJco K#͏}Lj'k eefJVϔNF!;>_7eB,XFz{mOI IDAT{?&_LHcyZ].'}2%w3 ʤZIt[q=Lwq]a,wQD?豟1}kt3-NR]aZpL7}طyW(%k'3E[A|28 m o}ո}~mI|c&MnA\d?2Ϋk؟b_E/| 9s7?qW6gL[iL3 #p>}#_y%9Ɇ2据-n[/_MF74Ǭ$D?urrc*.Ai ͚ZU; {.RH c7ֹ)c_`XNɖa9SgSYMMVp[E߆*ēh O c5e#@`xqTJdNXCAY+@4T奭0O]Mgtl,^kV.*b #6hI{ V3cXb1ގ3tZDƑO/>팕 f`\̧~ރ;ORrTL?4Ӧ[c KL_"HSIk쨯|}w} x>J<؟#}ا}XK xEēNŠłͿYY` ȉ6Ibq} ZxIm2W{Mt2 j1x%i`-TŠJtK%Et3}tstu%ky2]\bdq !Mp rKZ(W#i)?^-n_G/1out3p}.D7xܙy}׵cNܯ9cI#-9g5{Q|D,uj[(- JdfAT|$z bjry[:^. `ɳڋ(Ģ,܏Tz#~ר g~D'cs J6@EFIȇ]'M 1%m7$''ꁁhZJLG<ܥ0iu 3;$]~~kt+4U]kl~䯘#XX|Ts5u}cϦ%iہ`?ښj>答| EOL^;沃GwM|rΤEH{|<&wbm?{h 7Ml\ p݃[gCp p&d_ʀ7!R [ &M~)܄`K7(ӿ;n 2 MvδJrV\ùǤ5r }/:Q/M[V,A'\#Nm1ꐓ&=1|_ p֯JRx! UHsCC{GV^ :7W8K =(aD\Z1@ 2x e6#+Kro:O@A|T~v |/:C(s#n[-.Bh/'k ha!D* o1>HI(-ZMHNE5*e8>/ j3{2[+/0%L6 VVS`9 f-~t Ԉ$h }٦/Ƹvcq~3E3@t3[Hn>gNhhIZO'k)6MX tWNE XUö=;GI˷ lGou%Ο;gq._^H/PWw n1 ěCeIQ8c>8:@4nNmM165\k ܈b!wt0{rٻ*+DH t¹!Wz!)yR(7L. 3[{?e>TP,=xRJIҫ W;wg8tNĹg#>u n1ojc!GanӠ̅٩8s7>GY.Ng#_^m;YX" K~ C'<~z ۷lƚu!ֆ2-W0rOU#*Xml`xo3AЋ+fQ%hӁ`m;<),6BNui"vmۂQ*lwq$~^=Bto~dp;džIA[MXDOؼ /ʇ)=>Bi~܌(tmmj5jf<_057EZXIJ=qD޾i@_õDu'a!d<;IU{Mm l3[fa}(}Mtd1sܺ~ 0ք[k_~":aIؾn ( ߛ[([Cu5:9Q8qa"Qdɓ M? qORx1g:6*ZOւ9v'NixB{㴭txdFG&xL5F%O#1tP *c%w@-o-;Fhhe ;/UV/Mg6x_@ҨAn8v:O; ~61[BKMƁBqEE{<(!(e:^zo]!cmˈq~?h>$!^:Q%8\kw/QOgܺ|מ o m Rm}]lq5Rf@v%s>\]y? S0zn`17/iny"3`D8ٴepN%k1M}"(ˬcl/D )Hl$ٿK_Ue%uVAnj.Tt\()ʣ9R,cQƆz4ԪQHnn7yx}"?tAHl" 8z2cH9kKp=͎";9 {ȯihgP^RPoۅnPfFi@M~)(TϠᏏvIi:;Msp)U $D"^n"Q$S ǁu5t* $Eq8z#*4\i6UY}^"'A:+:d̑i|2i@{8qEb[+ߋ8t> [ݝk]ۨvQtRfLk_He/Mō]`ƎbjHEBK&o|DPfpS*q^_yb~pkV^XLKn;~0y`7'F꒧$"ۍ^~ e|vԝ[% v7ܙS1c>xHg{?~rVHݧpY\=sO_Bk -LˡX~y][*K_`Ƙh57J8^ cӹxDtQPkߴ v+P^S0+=y֞z\U w;o;z[=·(x<)Xwvw{/3s޼tyJB_>G4Μ9;'x@w.\Dlsuep~|S2"< 7ϟ+8}&PכҜx?=q;ta| 6h4e:Ty-\̃8t`ۋ{/)qk9r 'S/Sou EѸu4n;z%tk7UvOPt8>; BZu |^?f:jp/^Cpm?8~WNMJ+KX>yuw~){ ^;³gFSP1k#T/ᙃ SkzڏN5V$򷂭EE5\NMIqIY@:8~(ae)"˾3= nZ\O'BƀJU%!3e*}j5} %])O0$|c\&k' RkM˒ ?wF;KKo7O7nB p/7[k7D%>>N$!B>kTK/p{g$x d@,: n筎'd@|[*Ğ~*Bs+B{ˀ7nBs2/e@~)ؿwE_칉-]@?Ӂon{n>V9s~g DPeIshˮ䉎;/C(sBz_ίSB7dS(֧cYUBrB,^54|:vCrB jܺF콓P>7liHDFC/?ixduɯL9"CQK1z_?oAO_~ ?oh|P,Ѿ(3ɓ1:<%ŭ{[ⰾ{d#=5 uvBZ o߾ xոӶ_~FYib&O[j@ wb郚7/Eh+mWWV59,llgxO+ͦ$7_ pk#)~;>73KPUӭC~: UǓ@-Cϔ][Mmx/M[g5)1}mͯ nBR UTc}ˠ>˒7nmB_8>W n<WΝT*=̇ˈǹGֶ:{M] UŐ3ؿo/?"@6 "qq\}2Ues(ɉSGp5Ħf҉>O| >T+RN=;;;>zO_{#)G#~Z]c/,i,Mhn}j2 mrx,MR~7|aL?_oC- JGWu,u!͍uա0̩S0g:>p{l7axX/݂$_QP^EPUv+ab1;#Pۙ־B d˩Xn;6a…xbGu["o?½ZM,Ksg_7G xRXo 1lp̿Zy?w-*zP CU}+﫛:7׫apCc~|}WT,Q;oLfwF.&Œ(RסqvL^ (4Sp#?8t}/ i&3?^"eJ( N!.U.mk-w>c#{n}yb ښ&XZr|[fGyRF%E| ϲ‘˧kz `;ȕ=c)8{2nZaCcȰXk{ e|Gm-LOAzt"EX޻N#KeEY 9Ժw2`gҺ(_Nάi"@ݬD%9p$6whKsRU7| e<㧭Ƴ\T5Of~О[>_.;1d.F%7譖M kXQχ4R(qc x)\CFa=FP$ ܶ\ւ|q3Ƕ;@D9Hඏ\*ܴhVfV8,QȠp&?cmᅰ\Aؽ ?@F^ 3ps J[ؗXm9O=FZ[zj_mFcƆ#$cA]scBR mˎ] um򁾝hniҲTj&ma)j:i NIDAT}ziS*4 +Nma %p#pf"Z$;IdPfFuH#>ӵ[]썩ȩ0{,-iXMMn:pS[Q_X}%p [<M1q,^ ͗ŋi$\*TH6 \F:I+h$m"'Fwt"Y T C#iRq.Gab6ׂ |hq3gGpL\rOWC8*7A*qf6lKb!4嶺!waذq8ƚdg,DtsBa%i2'l?V+9*S 4t n~# C Hҵ/]kʑR'Sc:큭zPR^{WyT nq,ZVFuuY6N6\;WWoФq4ZJ(3[k p`֧@Ys#SN0 79 ?,-H(Hs3  p)鹹Ȉž1q!I:KH 0\҄c݀"bj n^<(Ѥ*͊ٝsa4j,fn=ABZ6?< n,4L}[*MRDy¬~/"!N ó'07EBK&Inȯ6_ftL[r(V'~p|ԕ'Yn:.܂D4d ǃXxBet挅ՖYbĺҩ&2 hٮp hZ͓%.rrFdm)iLOKxǠ#c Le!#9/<\<--lu8:3UG(yU"m3;fkvC&󑖥V/-0o|X[znҍ@8Kuk|S'np4-)ۍ3k5 Ȉ rlr㘎ID[{DF~>DeX#+W,vص~g+24^vXlV߅͓̍vL3an1O~ _U*ӫpLX֘͘3g^^V_\s_ pk' :kׅ&AYi!‚2|O?U8r@MY`sBL+dh@ \9*M%_~C Y84U Wk52|U1t7GTAiT(@lTmki"XEH#]ALDQIGT ?C@*"T r ih7}>ҒV]$ !HJDi 5RjTW#>:Yr &N'd4Y$BP\YBwMt'%؉ROGiLG @k*5^jbc䏐P'Dj+;5-O$p{nPߟŸ)da67O TdEtѾUSCT#]jik& o*hH}&Y-'`ViAO&eI!W7Rh2jdlYz xZ| 7n}\mCs>ѦkMzZ_۞҂ AAhsmS;@ i 1u7Ez>b {ۼr/ǯ% OlCa_Y:һvO_WT:,Q]rBNv4d#z?2 }ԗ_np|,\'kwRYio鳡ZMeS~}˽|mf~vw<[nG HMꐟ| nAnVeHGؖ)tx - ǎc<ȓH+iG{vs >e*07n&-.'A B)}{Trtjg**}1r ;W%imW~15<:?2r|9ƫ*/__pouԬonp| t k?kBZ2)ia:h 7>>OYL9iվ4j?:p_O7>u O_'ZV) EB /wLdH Fї"hITLCDQ(Y?_mi𦽼 dgëSp1LVUox+)ڝ6 Ms[96D[YfC o^Z2'3͐_JS܆a7穧}ݥY pkhR{? p2/e@~)BpN7nB F*?IENDB`fotocx/images/sphere2.jpg0000664000175000017500000012121515247006660014351 0ustar micomicoJFIFExifMM*JR(iZ0232)0100fotocx-25.1: Crop: width:576 height:289| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 289 576 1 2 2 C     C   !@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((((((((((((((?} 'V\3)Z ( ( ( ( (GOů~4&5r2(yP]E~d|xhQ~ZMja]k_6 wfO_wO4~*֦lJ%= Q}ހ?u>&~~4x.cuw[}{a u?I$>|KW;fGgni~-I$OzJ5O%ÿ Wo;+]hgnP0LGXtЧ־Q>ି]ĺF7EȪp?w|djьd߈E~C {f⏅¸5e9#_ {bp}~zs]!2 E~Q@߁~)x?u|%#Ķrdchh)%j5OÚ:WYNʇYH +럂U_ ^ mgT mZo7+ϻP*wߌOyɅ6GoDLWؖ]ȓC"I#`FAu&((((p@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@}Ugq?5ʵWOw@IJԔQEQEQEVW|Ox3DuNFlq{}2 J;1W՟dy :c/rwyv#Lj}}S} KvȔhڏ k`o4 }0xUKup`q ~d|C⯋#^/EKc!Q_EPV(((((((+/25|:<;ɇ}!>zWϴPiKHqa pB8澯~9^ HْD!:k+7xxSԷ^* l3P^y8 p-E`3O x:_F%$5[k[s}y)y$cOa+ (((((Sk[Yo !>mkk>V'S"1p ɭ+o kW6E+Wo+wH4(49ŚԧO@jUwgc/Uvn Cb{I?1SObc6O*0n,lM Ivgo6|SM9٩ zr?"ҵt@-ܿ=m.q-Ydi uOE/"Ϧ({4 n~CM\9/ rڎ{k9CsF=L|m&x\hӶ[j~.B|qhZxw|s C*  4Ug'%|)tLd *f?f 1~Xr*/OnE7,$pg@GPz0 zQEқN(X((((((((((S'7fE]|_U.OMwtԔI@Q@|w e÷O'\ >7R\OViG^q'ٓʱ{tPԌ*{|gx7곙E 9[T׵;KPgw/$1,y$I'֨EQEQEQEQEQEOmo%PĻ*^E*1<6?hzvGw+]ڧ|3xOŒH ͸fcͱMwy/StSRP]:\;32ąwhڠ]OI]Ně,;4b|W?%]<{ExRL $y"'{_:z$z4:Ȟe/\ھ5ψt-Efl4M.>ŷv޶94KnXP~=k }'}.RTxOC]H2 _|WCm)^\30md%.VeH3H٢r_Z㴲yxmAhm%m؞qS jR]iŴa(lBngQ}H GB+< jZ4MBjMVgܠV`nJzMe.?w1Uo wgOƳ<5Jnf -H8>gJ8oUnZjW[ǸY Z.xsj\'xIg.ìI$v< |2_kԴ=V=?YO +}>"'Q|s3&xTgpE pMQEQEf )?ZeQEQEQEQEQEn#Ç14O05حZP3嫸 ?uwzS&$EqPXUoۺ^|ĒO#GFrvk=I) z.,B_*uﯮU-r3@U gK. &宵>@V!n1]xʇ1 z[X Uµ;Oyc̴ xO_2xX5fϜƵυ|rx.C".=1Ww14~&uqk)A5{9<1I~:Ǯ4Rxg(%9-W6g}E^#oJ~=i瘪nҚOhbS9 ?^xտ<] n~xIYAiy+WJq{y>XYR_x"){1ϱr,E:"x+Ś\kg6q ;reZgw/$9i5[-g5uπ\tYsτlͶZ_Ì2\$ {3w5 kRgKZWu֬`%v ]3| qȫ>:?KmO^I%V ڒpg8$MM!6s%I4MgO7ØukkZ3XxX?{m*w4r@NMjtqyĭ@ԼEh&YE:YO-FБJvJd nY!#RG K,#;U\q۷α=Y'wP0 qJ0:_7^!|5"\i򣭫 enIR~jH5LIEu{siF74 e~UM ȍpB+ڵj׵:(]!VA#6O&|J𤚿-|F <[~F&@JUVOFG? }K; %l8F>3&yլ~9L6پYofBF{W_xCFiu <;YN)Ҁ?( ( ( ( ( ( ( (> ~E..vi$2YF,U>q،^e⩼1o+mI6ؼۆӌW 쭦+PSծ-ѭ"[Ҫ 3NvXt2B<=sH\dFLU(10֒WOoT̤;+θ @i1 g5jj9? x:Yc]mb&0LjD`g~!E [1LtS_4 U$!ӤٜXK4r<FSD62]k0BR}fR$\7y'x/3~lW(F~FKۋOH|Rn<2NoI{qOKae:z~-wEah~YQubY~fǔeAxKz^ 3ź~aʵ]퉊-ҺD0;"9v9R;Vү Ax̿FǠڹQ>ewTOKtoFgUFLnб H#Vr__O5ΧPQQad,<(Ѭ5ZwhT#LmV,Yx~ >tnmI'QyuGZjI?&d œ4B&IF )0p~Vv._])bfI2dݜunsc <3v`wCy-!.pJ9!rPCXٟ#tNkѵڶwql9$i\:N{)q jgڵŒ$Gb[Mnx5phqv2k%_?U?} 'G1ԔI@ E6w`f8zwno_;/,:^&!\F' Až~%#\4}k((((/z1Ms,P > _/|~[N8̷+=GҝUI^nDž+^ VgxfjåO8̦8ǣr*ePR'jL" ٽX~U;rc ƫO qOu6UdA`z*/%j}&jnY#K*9?[†d;xarOB[܃efMvWZ?>!-Ýu ^MuRkIipU¶*R?ұ{O~;5|Elǧw`u?(FNC6\id%W^0k]_o|]Zwm#O9d?4r-)I*ȯ6xkvڥ ^VՌVeΏ?+Z6?s W~& %K[Vd ZŶ5qP|A5k_i~} Fe u&:9eFN' :W޵KK&EPM_+ȱ'_ |9^XNoKՄ;FMh|;u[]垳K^|( \I x܃]E k[mo*d)#rɭ( siysib[/8:Ԣ*ʼrz#,w-3Ϸ(Oe$bc&p1d:^{+{ [)X)˙kV:l`~5eX|y3?`@*?ƣpW`s乤j+=F2 HAj_ʲGTXQZZyrce%bz1 eo1Yvj_wPEK4"!@wP]8 ҳiOPnRwu~z(|9$4Ȭ,j/fՒ]yW_+'DQʥ}qR8>dT<_5cOhc$)(:a#*5=-V(klI'@NȔF3:iujS9fIIG٤q̱2܆W`tM׬ǃ*epsR)kj7Z=;>"_0: ]fچ ymr@T3m9fl m8=ھٵ:OҖ *aRznƪ+& ͣ(~ms򖾪\ο]|{ٮk/%gq?5)5mƤjk0E,9$,ų_>m>? k[z"?{LhO.i jZnOkto.F? (kxJ[J- p71IR}ExgTMl'$ B,z($ E;$F%P?ucJl>"I,BTKp:r8 ?>(fb6rU% ?HwQA#3g$:֜H2s'G=+jp\o4/5+DrF&i!dbLNkO>.ҭYnb;AV+y'RStӒy s0DJjf> dxt 5`n$G> OC\k Cww{{lѰ.IrO\t]fRvr t݈`Q@Rh]x1XLO U/? ]sIx"b.rO\σ5=VKp91ΨO8ݏַ>x2MP%T>BxZTsnߝ5x⵿V$PC3Ȭ9Rjm;K3_ށ8Un~r.wPz~\O$rPeriy3~VOB~cixDP-+4ۼ뎙pW*GJ%=곢G#t>7m8,fդ8,2oS)bOd}+VS(Jj+zeݯa/ F~똒WMbX$,޻"xǷ5:|__v%Ӯmg]Bd #'Xw~iv;V?/G+׸6j$Rcu3Fy TaEBmf5$&\qy}ɂK$p|q)cƞ!",1]u O6#G| 7RkAy<@'x2&ǸA# WG|Z5-VD#KP!/,=& &sVEϧ`6ojv_++o.,G6A9!@1W~Z2gx?ɧĬ{Fq &rMTȚ^k1\ubJ^ lvb&!19Px<|-Z>}g*DI榸_#%KE_O/MFq8Tm/o2ovc_JOG?]=0|o_s+QEQEZ iZ j1$2j0H2*G|M\o__kUbX`/)S;l$r0:r;z&"ॾ_NMEFSr'<`93x]ТI| f3|:ɨnh> f־+1ѬZ;fYqP>|@# 4Do]͟ǚ ]xW\Q2Ki9 d*3p=s%c A~|e{Cxni:]Cqp!6$BӴ =kYKX౶2\N,ͽHEP70%IqiWΏmQ6s- 08dUY!|a xg@4&GKS EF[e+LpŎyZQNlj:d׺iEn^? -;eـ+{iW=2[v9q[&<ѻkjdZFN8Y7ԓ/qjWoM_Ƅ&SNV^Kp{Hbџ1BI?|6y=XXo? e젷x|GXt?QO Yn%1i1,2FslcYkW6%.g9,ϙ$m$I 8'hHMeTUM"Z^$DXYUT>Ir@xn Z_av/,ΌO@T9nxc.xr:ƕ]HY6 ¤ltw )EkEƍ+v 5cR Jd}GZwVּ?xa#Pv'*}&X:kԼ7o^'ݎQ/J58@Nϗe4j'l.8\z`"S*Xx'qM|m"!e2ĜF{WQzӷkݧ>=<% rvOu _ w w;,QUfO+ҨO<4V $zTbYdc&'9bkExY5MZx '\?w.ڲ)nqRGW)N>Xcme!|dt %uk0Evgy}Nnv7lRcƹ }\j啊DZFHNl"ReO;]}9ZF189#x!}IC{) X*~Wk= B^QXep3oʍ&8'W+쇀 O]lv+FKzzםVw}2&8e>G7c-7l͡#Vr8a7^ICkU0 (PĉO+ՙ#3%QᄺGQecs!1yױ]8 EkNЅ8ٗOT?.u VP=?]5Ow_+=M}Qeq?5מ}#ww?~ڼo=|F*I\i 6q,\V9*ωWnkA? )G?zE5_7a1eo8Gf10E\>__3ooz_ziŗSy!$H*щ577X ݎ6umC"EVǜ 1FybD妛Kmb`isPrCh=_ %]TgaݼKƟx$WoNƾl*蚷|6u-d*dy.#MsUqk·_}gS}M?t?<9qCu\V⎗1u]ɬ\H mur\\( [϶ Qۈ>iQߘ7jQ(B*Q7jFącQ8`pH_U>xß|S^#O*?^ e 6RV":CIeU "2pkoڟlj|]KyimWEvF ]MJYYl%WO ֶ_q5,#: +9wH{hux'ݵ,oW|0G׺|nu[#춫@ W-HGoO\İhqh`(g#j~+ظE&>_LEi^4ӷkj~Ɣe鐌;-OA^q|t֮S~yqzT˿jWXϙr|g8e|?2zCEZ7>*nO|K:t[R9(v!#L.G0p112=E#6!q_}'&> cF GOA388#ji 1o{hbq?SE˞2;ojCH@ϏA'bo2g2 ?1=g;W UROrO]V?αN>v:drE[츖I&\M3K FlI_G+eZ%ʬx*Jm[]J)c8u3$Z|^)wZ(Iu ~lwɥurOZ!4ƓM;Efe~1#1ܮ*}M$7X[bK&yz0@1_~ِ7Ҙ4r[J$tB?7. (+" ?|gx]7pc[O߼~5Gc]e.H9> #Hce΃G~ξ&> \߱le$VSGq  dV޽㋽GOń"i$%q(''7PBI30V# q*5}%<j: ŢJd^LFP>z`uT_۟r槭7gdv,S_>񟈾#_oB{'G~*G:ܛi!K> ɁĈBV}[RﰺT-㴎SagAF}$#q]è趪c >'X#_)@U~5zdP4|֫V|$0ik}S׈fKx$O0`U~B^/}OYBY/eZ#_M}K^[}׵&+x_]38#W+6dd 0MKk{4AxY݃.O |H~x>4B,O7nG^uV1:P~5NyeF-T=Oj@Qq-XV̒F9m}Y5sjp@=P#5| 7<%Q٭-(#ۃn:pkݴ=K7g`"[I7v&Ǐ-ߌ| hXxNyN +˵# m\ʵXd׼WacsYŰl }|n]?zb=5aYb7 xL[Z3O/ 9I'OZs,MOҒ߱?h xjzR,cbfv}7Ey?:x,o,Z% Lv%[#WjLm H~cTՎǩkQt2sqyۼ_4X G8'I?#`9G^z){YZI\ɨFf]j;X+|ޕϘ)O~kynH}*.}58I+B/c̠cX_u">[kUOR6dS@&1ݠ+Y<uX@~!>4WN  V|(_Y4Vz&lW+*$*E:Ij}Uj1.Ė&ɤX,-4 pɕ <-Km;m/-njʑ%Yu aoZ(SԵO,`eb(#ɯxqhV_, 2 02 9opkiM5UpUcd.gƚ!>\yb8:*V'0k%_?U?} '= M_:xo4nWp%~~inO |5{0?jo =ML+J;bSpryםu}E/ýI*Quxď“:}hU'cҒ;O.F>tnܦTӌW׏'9L2?V5kdžvG>$sBH0BSdy>P(r|ƿ˦LBKm j$HdL0F2pW'5fNM|h&'s 9CH ~G%5ZZX}ȖHb{ȡ"ۀ(FOci| kuޝaw b_q#ȏ 2Bμ2HCodʗd.>VM)W폛 H2<$Ƿ5]]d9u Y%,,nJf$eT͟`.ʀ}h%wc5J>מlodtY%fXjWU/#Ou6d3c?Sq'2y7-O"*^ndh%c+9 li= !kAovx;*P]x|m,me?_WMhZ-D[Xnĕ+$Xnpcjt.$K!#= '8烏@JO~,j 𵋥PX,y7SbsMW$LKM6)!@`t ;MdU5wt;?y[˖=῟ f5E| _ 11q;b{h<=+ENy.Xl+?^^,l<裹zHx<-\UHŒ[oDrQe {q.훤xʣ=]+b7j 8 {>ӮvA$>L '@0 |fx}Oĺ&pv(_.|بR>o>.jgrrur />ixZYG8;$ʱs\Q&:WKmNjKY&),lu_Ԯ&_G)2 29ֿZ~G1gʛE20p`B?b3rŞ>ۧy{L/x<]jI#!7(a>L]/!leٻ\zSCPT_[xBĘמDmR$RYCqܖSҡ_V}VYOMjys3fcr+a3̆FHV"苴obp*XjGHxu>91Ld'ɡij#]H`̀l*džѤWeExdiq\26;_|7՜7 k6`qk:gxrVFV5K[t,`y9srG}4Ib ƌ#U'$@+]m{KZK rRF9bēmLNS >Kq-͢|`Qʾ wGCÃ[ w!-7wsY:d$2C;4 ?:y}1Qlc`܏U 6yO\Ae19'?2|@A:c3f}oXx]m'dh6Tk~(ᶪ49cԣKǛqi$rY@fRCj,Qt1`@7>$j:rEw2(9){9EݍASWZaͫoOOWP޽}>'//^QQxgMf0Tҭ̊"-sp尰: I;Vg\%L,8-Ҩj&;'Eg.Q>wd\QmtEMIc`!<*4=Wv0Krb/..L܂̤n`r ^+iB\6\ԎH%N`xזwzebǴ6y|㎵W|@^=iV--b#coUU;kx;Wz k2k,$Mh|6ᄄkښ Fo+HιuXn6w$U8 ]CJdBs;QӺ5xǺϊ>߫qllg(,sں#MV5KR 871+ݯѮM42K*I8-IyխOLU. ;bAt45g.!I`~m^Fen/.7>Àl(֧v{9u7QXeas{lH}=8_.8X⪷,n fB%ٷ$#K{"Y baoNG[#hTV;SVQ6$0ILm#W?]We{H2j^$͛|h?<ŎJG*;8}E:'3ٱ5ނdAZShi`?&y/YE U^D5xܘ+U|N񭿆.xHb7n (<3p?JKxk7KSUoIʵmtYVV:uMB+ۿB gv|*Y7*A]&cjGcYEjQ,1J+, QF잵?[.Ye{r[!;ڷ=2B>a2q |[ɝq$u5&ұ,0tVS]gG7yC#U_.Xvt7o8cP1ڤPȔU* :Q4_ WcpxӍhǫzвu^YP[^C3b{t)kd|,^u5j^7$nZICaQ: z~~Z]E/ĒHXdz1Ȯš|Qxx*K/S~5%+%^kn%0@2Ya^_ m:ǫ m.NdNv Ui>tJ#p+Rmנ#ZYP ~}Onn5bk-U%8Իw.u"ć(dJxDU3q2Jvw6eةIWfyrt~фaJ*;׾TB NY]wIP#o=N<{wlD+[ՠXRʬ|O pq}J#J>H?y1;]{lŪgf!,ow`@fK[m>u]{L7Nk:e?-aAFO~+$Ѯ5ɮu) 88v<_SseB=@'Oz; rN΍E`.uшS~:5&ͧqZtɎ m;`Һ/M$-c+nh@֠#S%6ܩ]~5|Hx,E6- 5sw?@k6ׂį^<]jcG€?pYy 5/i%ǁn.$ygt-F$f r~JQᔌ}+Ӥu>^[};]ĝ2[B쨫ܳ?z}1B 0"Q́~br~VOa~4 I C3+WV.A&Ac'`Q֩.FȫXBٽhzjZCt˧L^!QrA J3GD)L) "89_x9Y>HiQߥLms@R<\|*֭i/4ŲcӥGI0@xז8*dwXyJ~ pc ZrIT^m@( W|6Ӧ6=kn-!ܯA, $GV*|l;zbva,l ~ )P O0دT c^1,Qs_L>؃${$y~ȋ팺"74!o2(g(kHɼ,|Gn.2k)!$'ˍH| ɉЪ(o2o[ԟS_s$| ҉*_d2gmr}v1W>CcъsjJG粶 K3[/Xh>)ԮVGGi'(^L?1.E~3';~IsybL Iq\%ugj|Ag= lvRWUHr>kY1Kmf/Ek]4,Aka#RۑOW+]v' +>"XEYAŻ Q1ڼbOF?½k>mOrp-MqQm bKA# 1RTqЃWm1m6<.B`ruǡwrcUp"Id۲ر5En-cL=k鿀z IPt$2rwpcWx"T֘ m,Xc#d6om`m2MGShˇB9UoV zS%Em~)]}GS xzQgi aPtgf0x7V+HOןg9=I95x^V4?e` 7K `v6o;!@1M|7I/O5_|`2w QJms4:ALQr:*t`[ن=6%?R}Gu5x& Z4 /,M**d#Ҿ^9c xCRWXqqqCwi$%,YBu_ßnh//WEӯGH !?0#y,Ϣ+l¾\(tȋCȱ8>OWHƏl!CYFeRp1_AktK_CK2.JhsGo PmWǙp@f;oiIq/1ghÀ#I]OcHAڄ`J*ɟ:՗ϋ%è[K\t?M BDlA}d:W,2 ; Cz~F컓:ߍt]_׭-oBNR[g~BC",1FN)~ƍ2mO^ c^}އ4gs$lT vJ^Xf 29_ֽsFf?kz&sr4H䙺xS-x*W[iU{aImW-_!gk|YfK=|RRHWHOJfhߍ(o&[09?'Q/c4Y oT)'}kuA&269"ttc88 ~3låQ6J2imwoKdA8:!wj nbۿHj?],cUβrw/lNjc.gF,c4 \mfkc R'k w-AkZ< Eh>?Xz&Ȼ?_q^7|?;4n|?BzqNMENa:t%Qv > 748D1F%]3# *A1t`NΟx{.弚3AqNAR,UX%?p&=F:G5BIcs ؙNޯUnGooW6VIw~HE%1ݧ־,Bx6<ʺd5<2w؂r21^EhM~%ѭ7Z;Hvk;>$[8 u:'^u_kByI95ϻfgABŎOZJ(|QEQEW_K>]|_U.OMwtԔI@~"acmmi.m|O>"¹[q{p%R>@ }@t3U$[֍:>WLJ.|׫)ր:W؜gO5Q$bv%:9V -mBΤ'?j1  oGO[`yfڎqg af⾘'FKODR{(edu&5uV%U#%WjcSopwoEq_s|t ,䷰̙KhQQr7ipk{R|ɟ[Ũxk]V. Zżnr9w6=eX*Om ܺ29ciZ]Ed[<d8gxgZk}?Q{yY_əC&G`NRv"8>KA8<+nN>T8xWǹ!nN30><|'xþK/ 9,3~0pX'^s_&q藶 Ea.GGi((KOE&EyX]U?isg5) ڃGɴCR^\Z:2X?+z].=NFTݒU;`ic{*)x`?83~EH%S!S$F'kL]#G/ %2jwD.d+2p uyezB4]2-. x[/"f*XPDҞf]9y nNUH@y=Cqk m(M 8f&Cѣ@eWoEQׁڧwdxʝ:rQz. Go}GU&0DHۢs#'HX]ֺBвP+ܭ<g sδ_sy/y8Nq\N}Xo^I.KCr봼L8]ígX#79V'|5x w6nhFUea)˟n־4!|0n4[ˎZLqݳNk?g.S겼zpѭk>|+![W]kCWLd"'z3\[v[Α~W^]JyqW5jMV`2ROe<,_QEIPN~>O|Dq7hcl>_Cx??|0job0{@Q@WoLo wyy*a=Ul5ax}ʠ0z0+z/mիyk+֝#i6q!h=\#J?uv [I88>xV˳i[ȧ(U<9tg|_{ Ε\z^=!bHVׁ @ΧyċR#s'Q+xi s z6#-sw\˩nn+?Tʆ iNշ}g/-yzGk=خѲNp{W?wc' ftfo€sEqwW/'úۥKc?qG k+[? Bm'N !_ OZq:9Ԫ,=EfԻ޷8Mw 7ZOW݆=ƕFc=0D2;🉴_jšޣ.t- mM$yEzF6Dž_Awᯋ~ҼS͵Ɲi֜-rctl b8#Oakˋ_ _Gwm(^䷷CڥqgaIM'=Fυ{MѮ~|PsoO| V}~.B\Ό}'M*ca؟l+ٓxsN$՘1*F3 5+[Hص,Jy9$}}~OGmR,PPu80&8RA}w:M~cm0EE$-u<k֮miqo"IBsQ incqZ4#(ʐ3_ߋS^5)ڴJ0!z ::ئ>C*e#'xZooڶCwr@1Z\\}kRs_B֚f4+}? #~W,0+ͬ6~tp~zEVQEQEQEWOw_*_K>]~5%+RP߷wcwmFi}YU}wm+ʫ)__QgKZVGt#d;+'|q$7k$LVX20<^e[It GH' ux{X$Z cxjH.n_tth~".Wgҭ:zN:Լ?isMh$>H$0 dt}13~^Х<1SI?f!\"^^3ܦmB܎ Vé{x/F=֫l4l&nz*g+O>5O^xJ4[}nSm:5w2Ls\f2&'&&y ^)!?}7c $"C-I`<)i6$r,Kxϣ Ǣ{W|%-}[k DBXene'}b挥.m/_|.jO314LG#IRF0kIψoψ|1j]xMF(-V8ހJI9@32]x¾tbU2!h. (; dX^; ƽoxox^o}#\K X#/ SHAj_>x?oMڔ?f.rث^CJփah~#߉4ai2>ُ%c+C t;+cN*󁃞Aא^cy}.8T(aWڗ?m5OʐF; Ts= AdI撄ZkUN_W4f̌\aAM,}u {owWPUb&P'ֺO I5hO#rF׉i6fj #g#J>ckdf4XуMkSI)57HbNc2y ecڰݮFRP%4@1(:\W/Ggd`P yJF9_n6ެU15|rlvk2A{Ҿ~'5kKq'0[震#Ԁ~|ok3v̆M6؛ɏ/ $vK{+4̒ps]xςLkpz93XZ O+ӵ{8"A-}m<7#G"_$T 9s֧5i<⽢# FQUӾ 頶@{[  yϑg o.E?sȡFI8P59u 2>ꎂzWQT(g0QEWNxGglN2{;qA_>W?wo?/#jVd0#>cu0jxMQETYI(qPQ@q0nzIT ,g"Q@)!n:AM$C#}WZm4j7v&4fL ney=@a_)֎v9qJ{hUCW'͡2譁b=Rj+J7̭tOc~#F~^ kͧ_<#,4! A8u6MC#nW%ax!I#'?'7ׂ5 hŷ[Fxut~=kkm^o3Ies}T9W~/:w4/źX)#[jV(E<r ' 뵿I4}3TP]>?ivvbܷ9b>Nk_|,%ة+t~1|3Zd֞mh|IJ3Y9#mkܻ}gWO>&xmCPWe[|^f<99 <(0H ־i?ͣwj 45 ؓ3T|ܐ'1_( À>K'hj*u*[԰$%k{4fTJǧbURCr7@;pv,7&JV7ގd8?L f0UȻBg_h?P^afuU\?RPLfݷ짗P3=Z2:dӯlj5)V9(@raj8aYlcH=]5w cT3u3 ?ռI,agԮELYEٿWХս[&dGAEytoDxwJQ1=ofRNmVGhV'CyH{TL~2UukyFMW\,tit>w[[ŐN!WI֎d`s '*w6ӀAǞ*Of1H0"fG[rǩiKo >[I-&Hi"UQ2쵔%/j= Džx$;u~jXYx;:ݽ$k?3#5ɻ_7N>%Im k 1e\kKma~MkQEQ@THY؅UQI{7<_G4k] sٛ!^ٯE;ZmY0%C hU@_)8d4|MC\XyeKLc1Zmm(p@Q@Q@Q@Q@Q@((?8C+?ȚG"˒lBo鷒;\?ç<<\6p>OVb鳔r rNkC;^Aygu>Z꾋: ؃WGki" \[Ҫ̲ft+J;3ω?f}FxoueC ݆Ic/\@ `yZ4oi!񎖯>:aLOL瞊|s}sᯋu_ NItqFR0C Az (q4oaF]to`s撊(x$t$}+B^4.DrYuzouԬndB%MgVJ ߠky86ŎDɓY·PF?s'SWϐI1UuOivn>[`=g~hU1}}GҤ=}i r{`HzfJMvgN$ VM%,sK<'j4I'd; ib%')B=M{=dh Kz}?ƫ&ѓHoP-=t.sϩ=T(((((+%_?U?} 'jJV((o_KJ|05AH+ez,wьN}3$_>2n|I\hޟ)6_PF## _1~߰Dž?k?h^:KȆ^<Ԝ?z+G?|ms_i?4l0ǜ aA ( ( ( (:χ}q7Ǽ܌xOyP&]e718+Юnmv^0A|KܭvG Y71k/Hmą[ =k]Dn GfXG?ֹ\`P=~|c6ZKݞ`1޻xGd~G}ʯo7\6%Sx+#Tk?,:nNkb]Z>*|m}.{GO_nNiw#̺aIu u98˚έ&t]RvNյ5)of5rJNn>EY!((+/_kD9tX| ,#b_'?iF>!K 6@_Qd>;PÑAQqۯ;:w)~\ˀ=YVby,rI$@|.aῃ>|=94LE +1՝Ic&((:Siå+QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWOw_*_K>]~5%+RPEPEPEP|u F6oxFMFז亳Ɍ ~/~_No~Zt2!Mb,hC|e~TrēȪ* @oR(akwrn2t˧?>:k;pџd:g2z@AEPEPEPVu6B*%a#no6o 0X)=k6/R\]p@? ((a#ITAw5KMW7ÿ I7Gӧ2Ts| 0mMյkVVPǠUPI )o7GPnxsLago hj5IP%ֹ|D>#^>_l^@,ഴ+[XbP"F`*f(((p@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@}Ugq?5ʵWOw@IJԔQEQEQEQEU-WH״JPCQ,H cWh;%>|Rk ԙ &fkf#6A_>4^o)9>|}gC}k[AcZv^ڄGZj}#<[o N6>%4YG;Hp@F/"6CȄnN<G?db/~ ^20m⹔]>*Ŗ }4 1 2 3 0 8 306 728 1 2 2 0 C     C   r" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?[G2*lҲ(VҤ>q#ybH y_0k~zs 7yw3#c?ߥ}'MԢte}|E@vᶶD-8f,1qҽ7Ckq ckqȖw#xֻ}KUA- I\R-FKnϯU{6Ztik0BDӜr=3]>%Ҵ#1T|y8\'mUtxeHfOHKNzv MER G6'ߵp=(gF k&M I=xHxXc]6&Z-*#?cZ&hM{EcNi6wg 3Biw7M'r 8pOӯnդsY?)$H]ơao V6Xdt$SFgB6O_i f|7N1U;׌|2ItyQmCJW9嵃=Yށ _fRYS ,LakC>Ur38Jwy,opMHUQTϡ?Z鸺hv&Ե/vWMg5Ѽܚx$rݻƲǒbxC:4Hxq)=֒]`$1EȂcϘE`ķݽAQ4>$QӢWuɡ{;{h-,ar6zW~1eG*>!x JOZXHi#$dG8 j33nL99>3^Mkvym{N:uϦX!^iSX]|9y&b[k[qG4LlvJ@)\=w7i et'^x;R?m A$~wĒ~TwƊ>CxcRM%QgҸO}jV_ot\wϦе󯎾'k>-iee;erx(״>9%k Hrd?4:}iP1\~ozq6ZK(?*ƽ0nA k!BA" 1ǭu:Gԛr'o5C}#y b}Ãִ5Oz>a)~ݪZVռ@dVpm_Ls@Ɖ#KY3]=v3\G|'uo-aԳDkR_qx#0[Tz@/qn0s~5z)&HH[^o-ºE~V0xt菈-}aAْt-TcZ:Vng)w@fk<|'nsRx{-ցt!vHX;2+_}́P#u{SQ@t$Woxi6օ$ Cq%7/ }MvVSEug"G4&4L^_ _Oh_,;1Wlկ*Ǣrn9튱"T֮S[H{??>n'H_&/*+hp >mϪ8y|@kr뚝$ $)qx =`x?pZǐ`V=C@6u`#gr4Zvio!i3PdϬ_[FlDc=1؊r4ysO^i}t;bR~fAR'\e(SGt[y, ;nݙs^O4uDCq^x̚}יp3קJEjQ~n«geAb>iV%Wy' ^ &psoY|CڬZ>4.w^Zėsn0ztPx+WAhF6Mi\BV>#AiŶ&`hly8)\@/w"1,6GL\?~4\xOŨuH냹r=X{\X'$ ?|cVDx,p@@wךg}ȴh$x+=k_GCDLͼa%A֢TZ$6$u$d=6ؙ$Ud^Qa?N/\\NLX>g@ =l4ԗ.Ie;ջPI3H5W)}SUͧ%*ᏽ>qjzBV$d5_YAD2xOkog'ջjs3qWA֜JcGKOf`.uѦ\^0`uzcY$_g2,@ ;y\3MۉixA E&Ym(zqbR=D vA=O_W5\Y\iczOz4]CSd2"7WI \˲XF^t-2@e#''=zUX^iZ52'wF̘e99k՜7?׬O= !w`,g Ig[Zk|Dy7$׎'M%nbVi>tvzGPY*xXxHՅ6ZтH ml\6B[Epn'Z/S~+M\*Bʲ[r#GԴaHCD%\޸ w~էӤ/ cR(뫏vM;J[..UXvιtT֍mw#[l).޵τlpSNHm6PCϡxOi 6R mvp̪H^<}Kk})-$kۖ<i5|.@db Nr}OM#$1fnR98n?x gᏅ#7:HtIuaPʿ𿊟R% $Xt0|q+kx=;ח[j,X%+ ˴MS׈4Z^[+T€>E湦[oh~<}*Ŀ{׳. Ʊ=}?Cۿ qۇ,N<z'úzYV*l!}÷@i¹nJyqvO57-dMaI^F>|G Kd( ;ؗ OwqkwuCƱ|?*ԏy[!b@X.%OZZqY\Oy,R0S!w?x^W .mA$ds]< w]ɨiVw#,]8s۵t'Ե=GU84h#M'Ƿ>M^kxhNN?y>K' k<lQf&ђQG=y5jWySqq=V(GcTN-~#yaxR6ۅpZ>9\Y9GC} LS+ފt+u5ZBl^40r?\K'u$־YN<$j5[zyLSOJ!; FK\\I *?תGtRXYHyU~K|{3w ]1^gǺ (01/|~Ѫ@<~XokVp1'ր?I~zX n)b̽sey6.!A.Hz>%GkmAds>$lGg(x%B,ܐ#'xOƘ4]ScEu#%ڛVbZ֥sh>Wi_ kx vGAP?xy͵Y$I;Gz^<c\Fڭ[K_孵*I XC\Ǎ5릐^K63]O[Ŀ .{K(,Y'Ly߄F4(Xn@@e8AɧA_RVO,C e|_w}gs,\rqs_A_suŕa4=?|0R;/"ǒݸ>6:-A ss_z[P3dD|`\~ A ȥ/5_>a왰~V9z,1Iȃ 9y!;[(U~_J!JGY!ɴZ+il-0URu`{^rN <0_P+x]+wwqvl;du5 iR6o%;)g$Ǩ?{9Ѥ TDl]$,e0"ڨ"Er@⟄Q۬,Y-?{¿ uMnm$OIse}}*Ư^ق4H!Y,|?|[6$b[uE(i2'(V_GϨAF)1"SImX<3B |^uNyMuL#c?I]jۥ;O}7cyRK{6R8Ĵkktm IZ]|N Gj,ʱd㜷jSXQQEma\õ{vo iL.[#$ =jo㾠5FK1o4ȿ6Hﶹã3ΎI嘣dCg&Ų <9bL6p$~nHP4N dT l189t@y8=ז0/t~BzƠU'}{+Y}D*A9S@ GQIv9T”#C>&$H`E#Q5? xgޯ W*&ӂ8_cWx O:!첤.'99?*w\*m:{5Y{4.zR'yqy8uWSmc MNX@6}_|5±J)_ 1~|,uXi@ R٬]k0L׷SDap7%G? i#]0cL t)m|s?~tsv^Ȃ84Xn6y⺻{5Avb]Tc\Eƫ蓉5phJvMibb0\84|m= Y)PI9$~5m#VZXmK%+w;T pd>#RHv[!YJ,מWC$ٖ9bbv1N:qyn;ՉR3`O ix"vK5kBGo&'vz o<W4KVCL@'#ޟt>@{t@B~ڼ7Z~k/R[Co_ZO jShBљV<(€7~/bĞʡm8/M3ZdsM8 ּ1-_@; D>k E$;@@?:wj_i9dROVt'DqּYkK}P:psAVu-cW~tDZxMJTJӄ7 EXkmɏ"s[ <xY<9a{Ef2񌓟|PRMGP!vェ:)Z[iDJA cК/틢PF^(gt߶ HK`3cgxZIJ\X28@%|G~qQuc' M1kvˋ}Pi1!1^!wUԼ9A}rKXVH~uOZ&FKdsv4_Zk}0\xa3Ү|/4vwL ?Z,xšt(PD6q޼nzfr2p =׼G/AQ3xbK\ I& 7qU" akN2 *|>*5eŻ4gL48a]eУNK`k78>$V$Cs%x.yoze?Ck6 @xP[Iu/Dr6vOMܨ(눓\4 Şj?1]{Q\d`>{+kgws(L܌t|?bWu&G/#5 ]/<en xGOx{ÑCzUzLrv?#5 Aݞo8լ8Rb{+~"Zھs5"9'k#/sZyy}4ho>X[iֶx 0yKR䆅Q }O %G%~\B0Ah__V FУ,k? JOr0gq9__L|"R{GyY8<㰯x±GG{a~2kكGhQF]ׁ _nKq:&v3Md?M.hH3r|>$]걾'2.czvMmἆ@?__q@ ':15%s-;ga$+%㯀Z;u+;}M_q#D5xLy4g&߅I }p3WђmSM v\uNL]i{>Լ:Hyrd%23EvxwY_Uuv9fz@6=irڄ{\ġJb1ީ%i[YN3svEdN+F`lGDlc'hɠ >).iMͷb<5ռ; Xd%L{׊|QKi-70z5sZmCsn_'.qYx]jpqE~h Y.>R7!i=OC\sm HC\^Y{6#D,Kp'X:ϙ)Esc'OGDķ‚H {n|W~ -g,9mF>R=r}-]MdM*tkuOZǎWk x$ hסZx I-i!-2@_#XbMVf07G5!4ۨPE4Hynq@Ҿ;?xzR) ,bB}Folj&kI&Y$w8[ˬ]yY*)}853De FYJFwskz2J bȑG$q׵r^ %ܯizEHS;޹bѭs=Ô)p@,y=(]n-u1D^i|aҴKUҵ=-cDD扤l~BI_m(kV;q,fHV0A泵9.gD%̨]#<G Zcubw@/yG=ZXwifR_r@l6xy{m18aqFGK9|?%iPkrwmqzfog|Cu\5ka"9a0|ePNXڟNytIo̪_l{HA)}kӴ l|ZxcC䖘m+ZVd b?3i_ N{I-w:i#˞x7KcN%Q;W2GC_sZI,OK'&CqQ?<7i%kՊh Rræht }u>Iױp3+ %;yZ/2#t !TwJxƺ@%5}9r6q'ۀ;f1J7Aki} r8kXi;“8+޾д[? <[72}}EyǍ/wWԬIh;3w(矄=ο"}>Qst->K+6ˍYY.i" 3sOUV'X^9$~QG"|=usR$ {;zAmuy4NݎU\BcU.h@k𖍡hV[i"boNA@울oHAp2}j+OXOw+B]AIwd5OǺi֟xlvY6w`wzƭiq"ʶ+*+h_zI^TDA?+⯉$5Z(f6?BdCg#𮌿ݲs\ֹ?l@HROpvȇy5ѼCL݂N~ ko{avƫpGAFGxמ/{GdKq+mP?gڥIC5] 2ɵ'$gu/tK.+^⫥+_)`puk˟mmdލaLqhpP+w⎧:έlp2ҼNk Meb?#ֿ{H^Ab<SlW[݈C>>+~';H^}𻁌dg _[k4ZpMdZqoZ_麦:²Zy7">}!mIZwO]ZӚZk35cwk ZwKm⪏6>AlʸOZquM(yQ#hǟ@t Aoyq.74.;WJKV}ᤀ2.$fWϟjuN&{t:~91[\]0kqn?xrݵI +>|;ռw~ٚ5i|!W 8.ndYrD#P޾k{ ]rg!{^MZ Z5Կ0MW>qgv>ݲH׸xz;M{GiX> eOZ|i9nm?Pyfh|`m~Ov+1;wrB߭yϏzd眅E{fݵ7e?{VGljmBk -Ē(J|5(xf[ic2ӭsZ4;$ڜps= OxU}54͞Gz:}̈́[31SXm5_ck[Iufԃo=s^giXu$)scv~ߋ?7Gs4LW39˓+yp4~pԁylum K|ܲ7L8 \ݶDrIsKwKA =k?8'-<0e#XpeWȠ+²Gy\} RMtnrUr#E&g$:T[k[E>(i^o;M0@ך /]gYM<.Y `uƽvVsZ[iOH9dzJ_K)X賑5$~q}m?K)F}s@*࿂iYm&-Dd _Z$ED0a9ڗùGTMqQʱ }zeRkIUafH?d3\i-[LOs,1epq_P OZς:dNOYӾ/~mnX"8'_3w?Yi2[%y"Y~&4* 1$iPc;-.t1zU-4ѴjP"1ַt-?æݛm<R'u]iZq Иc $> ~[Q$d~Z¿$Ԭ#mdc$Q)9 /Ѽ#?ݬnex {TIYϭ=8+CQx@. j :zǣj>񭞙׮Ϧ1I !y2@WWo7ҭpnCq_9~쵏lXZYiu$=?8σz-iE\[JL6UQ_Bi> ocKRَAxX A  5KfHX2IT;JuMXcyXX ;WzßIY/KpcyMɞ_>Y]E {`@[PG;)>вX7gkw<VS)%k$h'm;YE$DZ[ú7XY *9g~esKoZDN=Oouj O r(ѓ gtcebKJ%|Qԟ+i]";X`9#`)ps 5W%0C21$p uK B?ֽƱXڋgw#K& cڀ=Z} Blnks e[*95UkwNvH gez5׾4/u(fBߓ[ >itp<=ݠ6 Ӽs/6nfp}G&6?-,Tь޼t𵅔6^-2E~o좸K9N:~6#Ɨ"V2!`y5e’zLϸ' v6 2JR3S8;ꖻ,H #m]#hT3p<6pAasלxྥf\FdxfBxû#i^?(:=Zh<=bʗ TOUzYo}.Z8~`#[Yw\d1~;~о uqr6kTaF?%,OZnq] ?xҾ>:ރE >a9ז3^9\^|HҡQ:o\g;~鷰gD2r9 ¿-Olo/nyVǰ׾n]--P֐ng95XNFdLCڀ2|oV&Vxe!A{oZAF;e maק5_/Nlc'R~\޾.<p 1G@>:*NJMr8[U s lQ>]Z`0b?k\Zin ?A@..ү>!~ac!_m&SI3:‘+H ^Oi~-W$^ԵI|@MQbqPG r|M"Lcڌ$##>&h7y-f 600_ =|A8M>kg 4Wg3ߵ {+o@4xM|;ia5>APہ;vw\xcUKwjkEk=YGX];:ֽW^!Nm";mVWbRv8| C_}vCY GusX-&_z̹kCFK46Y[89Wk=OfsYZc6Ee2A@O&ɦY$r?k_ibTc #ͧd%a?nj:Iǭv) UB(j\kR>ah _3meJ%2 h }6X.D:zMohYx08l\5ټ[ߗo#L䪂XO麺0j)u B~tdy^D!c<xX{+\2N bBN3j{ZΧ~!p#^w^Kơ4Oƀ8};snu ldaPsʲn/lC@aٔd\g5=IllI63Z&#;H<Կ=}nPPxL&2AS(Ь%R ,tQ[-i%FVf `*AkHd(>Q>/Rq&Ae*ɴ wqoktYʀ0ǥiMXݣʃ*Fv+Osgh{w"ׁG^ nYc]DĐa_/< G*g^ra:_`CMZPQGʧ_w6ᆟTcuۓwjFIf#jkj-#yr]up΀7>0QnͼV] X'$Wx;t.5-F+$ff:n +_bxZNfeg嵯YX ,zOXe< $zd^\UݜogUrۤk0T߮kWDflfmX6G59u)[x30hӭ|Agip) 隩}}4ۊjA *JGSҀ d<(F(a|Ƥ )O‘q@44qnFH^OT*[Nak;[;:oH;}},+%bVnv~™u?$ӯ [N$?M-5k,i*Xl"R|-h8I6YԾBAs@{u2Maq,*"9H`L_5eҵ<8b[M288>hguiSqoVB/ΰu}at3HF[9 7gֳEs,\[\n8OQ wgL$)a$oҀ:/HFm㎕ʷ_hϧ; V 3LxGŏFdXؔ 0}:{FԴ=!u6I+):>s^ݪVxSt5vpb%ӮyX+~W_a66ܚx ׁ1&6h^藎y~BX`3ހ>𭖢|WvQǥ*[(]Lt?oNډ]mG$ 5ៈ~-6[5.c"rAz{zskW)a[39tv(/r9*i <ڹ.{;ic6 P=+ċϵ1$cx:S?Z"wP{-k9 DXn⿵|B{=+PhvG$?)T_h&-VCO|Rye Gm FYSaƤ(Gj"wˏGU.KGsՍ|⥽..>E얮<8oz}aR_Eɍ~խB*wW|lEu6r,te2 p ~>1TS[(ykX?*K%Nչ}sYB7g?gI-M"Llj4-'_5=BxYA*pZ ECmwbw(+ۛLZn."m$ ++NҒ7eaPrySQx_PXc'u 6Y|Yv [i:)fe9+-ct3 n\o4[F˦ȇEWipl2Ks3_n>n}9˩ZKmtUiQ~p۟4}n#xĮ1d~?|umL|9Un O84(4ҀI*iQ `2|$zZQw0 9 OX7I/>k*[33_J;ZqDs?1@"ck-#$ ;>4Lh_Prpqk|Qއi1ꐙZJ7 `|_>PPwNAcxZ~oq:`p[b|Gv6,%meeXmsi.:HzMgC>(ѵK_! ]ّAq@=O)iZu`+|xj](kRIUWikGc<}uTK{{dhMg=ψöm$/_|MX>-y[Dr?r t_As!/dፆ!jzײyr뎝*Ěečn}12@iS`TDMj5m'`€:/IDD(\k3jW6 mo8u rp1_]Oh,G/x>+jZvmy1~͡]:k˨#6ZPia|tGOv3̠t_ ޫ,{Pcw "Y h6 o' U|ᕷ ?T}V:ҶϛkgleIs 1c_g|+/:}J>i8!{׈oeտt )(ڹc@Pi *j*LP? vv;o mJV]-;%ڀN@5--wibl #@zf|n56 RN6-.{&s"'vTϠ?{O `ս\Z4P׌~U 8fգi{#zw0U ;P){e d@:㊓O|v7KU^i6 R@edF=j~GZ/vjm Ƿs+MҬq(C"!e|sG$MPJ1]"p!;[›: ooJ` 1yԍHZ/."ʧ8]2)cm;79z<|95!hCG F_qc]j&/VCJ2DVtnU$S´o5y`-i:&oOҥG#^- шMU1ϭr= KÐc޸ $e"2JNᶽ6:uFe6*> q6VMo%l!CppO\/Ou jB[-". c=[O4鑰l&H!i+#_IH^;w?(aҀ>ZF+#:{Ufa .sֺsᾭS3Q0,VKg]gvWbia?cJ]!RB;}}hѾY_ l:xVۆ'csz䏗o >#b~Z~c\gy,eIlTs ϔ26W@#n :#I8|o'e_]x]MC t;n.,_\Yjw6< ѧ3}Z;}zqʀ<^OCA:|r;&33ݾXln?<ܴFcݝŰ}s_։ogi>wW"á۱)>f/Ehźm (Lw.HEԱ$z澍̐ w -j M%ՊI.-tWg9j^'oQ,䵊X&+n>~q}*"@Ȭݤp{uFoDy$$hP"2vu/>dU"Lo xgH=\o|^@"Gϻv~O/zR%5|p6 uQ&x"ZO|7yά vIGbfk(ÍМPE|Z$1a;"`̌j։*c|1O/4F'dP%mj-(%'޸M~MSLlӠ,|9~w?/tDvR뵇lz*#Epvh毊5 w3Ǥ>  >5=kxΜ-TAhi&P71Oc\ƻ-ņ 7KmW -= ̅@I%נ sZ2޹d'%1캵i3>i> n9.ZOu5)q5C8? 򟏟Ǟ,UU*w|Wҥ]uu Q6֠LY*6l(ր?"$3n$CcMrys_Z|ҬbZB`Z0\76ݐ; cҾCI^@!NO^mgBs msGP^K2-ً.)<kϚŃ}cIռ, 8Mc5?ogeUkW$g9kB·vva*$k7ǾOm`Js_?FPF7a6q5-֙w5FBQϯ@?b4S0 9'"%3WWxl|Ef uucظ[i'$ ޽M{!nYf:pyxK:rKdzיu^&h5RQt5vkTo>Bs@#/zen/lBY $99c3־"M>Xͺ%oyYiiA-5|\FhGt>O$\כ[B2]^].][W6Q'_MV qSP I+ ]NF[9{+iT;Y09ǧ3rDxLwqWxSL]Cmf`1Plb%pmI;O<]i7q( xGI v}U>5;-oiIe}ꀟҼ Z;XGjo1ة!2}` iӭ68_z f%.y!~RA"N,q] _P.[ۆ d|qh>/|b𖗥[\iI%u}:CZ}$ n?ވ{WG l67I6,5ۜpB|Skx{Suuo I l?>NzW>j֐Xr|ࢂ7mc 3@'m6FhvA8?Zg}IgHn]uOҖK$[k;^{/i 5g zs@db\ z]:O>`{+OgݗG@A\zdZEŔVDm'2h9.tۗYV[5cV,u/5H.%dY^#I]sq†#3K鷂+d -h,0gt7BJUnR$3-rNX($g$ ]8[|;A^,. Ą}h~O Аm-\i;߈`]m #yg?Nv_Xi66xQu8\dkkUsi4(XIs8xjk;E 1s|k>#4ڋ]Z4Lq)ξUX-U;j+",)^3,/dK ~Y0$pv7_uBͤ",Hw~>Yl +XOR1~n;{Y 9`ǪK%ݜ1$y@mޫڴkiьrOJ.LXF".5ִZ gWr~;H-`Cg 1u;PdžTtnXZ +6YILoyb]o]M GVѕ!qPǖwcүnT\ǻH'&7kp•dmF(L8$Ou$co`/RJ~ሼX~ޱcV ;W?Wv>&eOiߗ;H<"|AW-@Pq9.<#:"B 4x P5OfmVw6A,HokgiC N̠wC,IM|RڭޢU2`pP1x^s\\GYVz[+ ֵD&$m鎿Cה|~/_C'0"%cӃ]>!x[U4PX TQF|}:ͯ6=ә 0/_^iYD[AYx=6K.AP W?g|tr5=OOE٣ ;M!mu|0^?:Kp~ݣ,n$}ޕ-ǖ )-jg>f˸ej =m7>bހ>D?gI|MI Y<z2y|ѩ+KlP:ھiR*߳Iqֱ|AWBtynYivg-h4;#mD$+ k 'Wi>)O-/庺q޸g@xR mwq@C֤yn|+Eߴ"6yە42NS}D>@?snj}ćXAz-/EdF"6U f<35mX)ֹ_ ֯PvFWRL⾈uKй9q@U|*Lx+!E}Jo kE 61kabCHwk[ϫx++ː9""=Ozt;@u'̹-oޡCL\dFI'I,CD Zs8(c>:g୍_%™#۞:]&gv1J.`Xx'; f܌/m/is4w&2{)<\n5F-{+M,LvuW7F[Nymb6#^Ho4 *6܇ XI澖5GZLϨMq m_o3_|o/|Ył`|Va6>R^X[]KxmmVH`aV}eYl[?yO}$1lUJߐ3ۚVD8v`+~?x [iscf4v/!iV>'wM&yzs#ߏg|9QEY4* nC۵}SZ/isbe4DHgn=o؎=:WM6uA0ڴ{NSa8ƀ:i <<:nYRG ʸ Դmu"W`8[^0/~vAya &s墄9s]7yei%2Ƞ㩠 dLۼ&o'ϡ]d]ԖK3ήHU^H^O^S״ g՝|y5?Tt]UH#1Oe=exw\Twn0! mjw6@^9 dcgK6QD|߮+kmQL3'S+Xhef׋||/h{*ݤFO/``Dp@5s9:~5|Jޮ#Zgk? oٻy:* ]=U/Vt1zjϱF  zMC|#[nSϙ~ʌpGO?Þ]6sijfѕB^YMO!P1ׅxoNmU(̈́k rJnLksREόxt;tI Rܹ=[=[DZ,v6z YxGY=;@-t..^S7#s݌5>axjK]B #≄7AXdٽy'ٶ\Ьn${xQon݁[o`:z ~\lndXOY 9B:wN| M fv΄c^9թl.c*ުVwL?:w> <m*Ukd$]pZFP(描<;ruMen̒c_򬟆WRO+(eXx 'y[x7ZLn5,2O8?Wma"#?,xju6^ Hy8cSZժ`MO^>ErʈʎQγZ$Vduگ_3^(Mm$][8#k߼'x&XG<R1WB|G-ϚSyX 96kL<4Zd Xt2:z/4]ZQ;#p^:ҹmvSu4pT G'Z3H}fis؃qP9OZi|b\2󓼎x{ttKEچnˌ{W]˨vLN Z]gXҴMZ!`c~FO@GQ1;I9+?o\KGJk$VR0Q{w_úc%Z"3WF,dԿc?6I s@'uJY9b^>9>u {E][u5G?Jgڠj x&m{I2][ G#n3Jcsh΍,2ٰ8 ?|2-]_u(71C"Ng|x|I[F-= %q׌_-Kl^Tm~ 6ҸI`/ j:|y™lu9| zniioSdҰx i*6h3>nw/Fm((b׵Y}d{?XdS ֿHimklJ O}){OmitI%Els^ B,/s ~fvn=9]_4kee`['yW>I񭐺6㌴|z3o\hriv۴1<)NK;Qp"afm#EVGi%r4<Ҁ>J߇}nO 䘼Brz}k\h:u6Y9' x?/znmFlZoI;J'N0׺m( _|WCAB\><8ֳ옴`8UwtEp9:|-Y {uO.$s~HMˇ؏Z/ gn$Xˇ ׳o$1pb$!N(NniB;#*=>^hi[ʕ vkI[ɠfTYGw>3ƋanH"%D,lTW/%"̺~tw (6Z^>or1GC`N_D%ŤdNb6}*~~ ėHd1@l`g+a'[(H$Tpp@ S_ߘm, ?xgjw cubH.T ]>gO¼n4/qR򓃷WHӼ7q ehvD G<ߊzMN4(na ^7baEbx-VGNmgy#~^: /&dfuuN~U p\oC%"[?g)`Ͽ /+i,'`Dn$ּ_ b+Zb/,*B W/㿵[y. _2k&[ m.^I'<6@׌,ݭ`|cQ8%xTDҶ0F v'ԺZƮw>º Cw-6P#H:b;K&y.Xʤ}9MkYH{h˓(ߌqk/DjP9\[\,[X*H{a'0~hҮ>KPR5vŕV\mLvǏ]RhYoD19$ 8>/ hd;WugA*O@L~_ 5wpDd 5Ŏ9_`FmGYuK /l, HڼWO8{iV B%i,:g5u?Kef;[RE7*1@"=-֬Knc[H'"܀`HMy_|%}'ռ;h reK¸c idw^βȈ(/|O-!"e[]ʼ⯊4딳p'Qd{ekcsծ#"'ӥjeZPC'0f$,e6#I'Wxkjd1LλUPq#Ԏ]/G*c{G MEKF23).3K(L$fPMq֮wQZӷ#mn1š?{l0G@H}OY!֗3<۞(tl)T=e bXmx+Km<,n0NFAEt^8:m3DXu o-O6+ sYzW洸KWiLJv%kD#C\\P !$:@km{"K0<24/^YG[ŴjEڂ8Fq$~MGm*r}aK 8|T#t^%4;%/ ]/Kz7sE" _^kztqߙY-HT/#n|-e>~ \SP4=kk9Y-*ic/9.23 o5T-/#Hpº>r\( e?4ksZ^n|R{_jZ놙.FwsO\w{Ka澘w)2H^CgF/9ڿ(Fj0dN9ʀ> ǟ |OqgiqOc޺_S}VmofVs7q\[I ^EwLON𥟀F5YMӯA@6V>Y|HvN3|7Ɣvo2`iI;k~#|.U/uTբY%C`ǂ/ؾ]Z D01@_ύPצ`Ap'Ͻ|f7"Ïƻz_Q~Z+Ev?x_fX1\FOSP_W› t+ueH.}+pt/EMUDFW|񽯅RtIdx ZĚ%ߍtK AH@|C@\B#+_RxQLj /ub %Wq_uMcrAW+&']-LJ|F34gI[Z}ݝ֏ +b#c3|@ca 1y{? m:Z@V[}sʑ^1.%th=]bX*#S0ӎzoxA)c$m-ޯ> 3M# nWu-.'O <>iW.36?ZththQfd7lJ»4ѧQ {=5Sч GN+R9pqҀ:FGT `:Ō.͍21Y6Ḵt+M}T,FBN2;PxXSJ,\6z hGROKtu Oeoa]K9MHeEp ^"; 73𵌖rx~G5ּScg&q҃<`}Z= uOWg$1@*^u7K\m\t,7F/l̊ZNmO \gW26bCWLq[,8^;M}I"b#yg/by6C.{}=| c%O7!d%#`(xP.Kٗh ÝpXLZHJyPwzķMiZ) F2Č󯍼Ey}FE~b4fF?#?|P-BIaq$+4aO=rXvІu{ &g$cZa,KM2txy)LkTKZ6"1y nzu>O(" ?]^:|Ls)bhA}{=*¶$5 a.!}I^yxi}B-T1dMuxJ,J0#0{̺N>J1&%K>7( qW4Pp#98y[M y>eo%Vm ZM4JҴ(?w[W1̈%7ÇS؏npt{ɠI4v4MtRX-]^EiNB>A?Rc_nq>ݨ :v6&dvav> i׶t.!o #+þo=[OկmdXݜvqtJѭld{e,`vP1h>2&Wkz$\f&{ ߆6Nn6 75K [rD{v+0(:YI#+h?yP*zp,k/PK hҪ#z]5bbF=Nu̗LCJwgpzyVi%ӷ,{KFӕfK7:~6d+,# 2zs >tIVMYD;NlEyޝKձ8@1r sj-Z4rNsZWNti$7CjwQ-&ڪ2ׯ,ojO)3AlSߏ4kմoWOm0swEq}pn+?hM'׉5)#+nfsKav8O^qGkzv~ mfu,(D]܄| /a!cL`s@5m!;L1|WnKn+i̘c1ݨϭ[m"KZFovһMpZ?KbOtҥRď=nx [V8xX| GmbrK9g$mNxW[]-$F?չ5Omjys&qҀ1(?x".4H HD%x8ZMZ4P1I9$xWH\OZcFp ܟkjmmk=ſ\d ;O E0@q޻}SFKgl6L+GJeYg` VpS-yQ&37y.&uY#g,\񁊵&5і5/SK|3O5&; D^KֲukHeYci"CY_6`ϵK FT/mE4$Ը ci5OH͊ie,w#d}v(D-m#,ahP+Ekfwwl0(^z[* $#u'ĭq,iv&= x]U&',e@Dܪ璼zu:^,J.dmdGE}y0j){e,XsuHH#rmJeYYbIAAտ3mbHKЁͬX`=Oyf 7+PY!4H'KԤxQERs ԺѴB3K Uzp jV]$[=~ M <25VbI}xFoV[fd6Goa\'݅3,qgiܧϨU?h/ }CPI!鏭pJ4k?zG$[H9^?I7 w.ݮ'=څl%{H 0?J# #i lM`߂Ǹ E$F '_%' #(ےq.tCI.琲l!k掾2r҆ Z-cdi Q.Td .QIV03D 9Z4R=RivZƅEs֫kZE3,I B@ct5Srr2g5.̘*%H?R+1&Ԭ| 2Nĝ>@| vD7ƧE, ~ VK- skDI*vjq~=]\xb)b =3R*ĦČ$+K}CIY-Fh1$nQ3 >.76%$4w &֏g>p1]7>zd6*JӦ+- gx/#O)acq p>P_,LmƠpcҽN)4p9jSIMw - xϰ `WLj #m:໌4ѳc5tM.MGu m]jle[y2X+p:זGZG,MDŽz$P5Sp]hEK;MiCq$B%eb0OͲ|0Fvg"uKlM+y1;L-^oIcw u͚[%ٓd3yb:4>#ĺ'LrI32XҮ٧ʹ=My7uѣG-zjշZʑ6cnЬ1ԒeO-gV1'l1Z( |}k#,I.IJ$-}Zum: ~|nkϿ[[j X3 9x_z߇ce=ۭٷWV 03^^F9hg7GWEH=ֿ@xFX>@3+^OD%U#1>kᏁ l Lhʭ '΀=oS6Zqq xn(#yLGCLn>5X篥nGk긷p%#x+| o嘔95|=j{^@?C_-c?uiv^hH#,}8_M(W¶fwg0->{xP9Y,eEA9*ֽ>jz  +b3%Q:UW<(<)b45FHC^wbh|o~)#ލ QG^+ҿid6)#ssPe4e)IvJA ծ2[AEnXwCVO`2+3Ė?E`!%}4'yiqr#wOW-.i}^;bb#{qs,V]g2FVN.d'Tv~U;>|i"gd Xc6R/+5|@ z>l/ʨO\~b_9< 1ր= [״>гʮdGW]E(H\y=?+sŦKiu 4 8ߎk !KYkP;n Y]$ =Si)a#=tSڽWPgׇoNp^qw:zozWm $Nqۿj[sqk%+Aac?ZOvJҤ:Fp# D[]FHyxd&$v;\|fUrހ9odp%B)y z4ZM$`ye|;.. ellu4tۻZLvThzχoJ?*O^?qdJ˷vmʐCҾ`u!L2KvxjV[W ʟc'@tVu7wRHS5q[vts5||V;#f/ʠdu87]Wp^@|T vh*Tc%  :5Z|ZMݰus ;?]71WY]i:UIpDub* jvޒ%WRk"VD0?2:Νw%wdrGX]ۭHT7͑cm O٧[ZV<.#^Ú^??W/k1X]a/O|VtW|lQ淃9-.YIi=~Z\Y|mOxwiGRYW ֠ Emm.Y _U[7 "]ĺ]Է*(C+Eì4lKj34e|'.GR01;xS)>O0q5 oiVvA0~  v>wzvHf &^0ڼutmWWp}u39_j~:şadh"Ty ZRj,Eq8P7RQ2J4iZiY4GC5g>mx4-BX'c*]#mPyab>"Poa.*8ZLQmbu[Y ƾ@ՂI|)P]=ֿ1>x7Pi ?#_';pTTڳNAHx߀67[U9Tn;zW~zog?mbCb\oxGx ]Ƨ`V>YD- Hծy/a$-4hPp~xx᎟].e=Nȷr1{ix[,m1@~3|*f05&6PHE3U52 bYx!-.f%dGL{ӽe[ro y$v c]MNk+A/QGtG%lmI޶=x;I?iHO xfV < :|~+gRT<ִ; /DInS\MyF ˳8+Ƽ+o YjW6rChiI;OzǃdLՈh PN JT$Z:G ^l?ZZC\д90 h?Z~"k%Soti[˧Bdn#b5sV7-u=zȠ3,,բu[t&$/~j_>' LP p={bڋᑷk4֖8W}FI'~}]f2;Ez<<1qKNp}ڳ[Kr6~E5ֻ5(W ں ɂMB05-qʀ25 .a MQzg*^#֊SB!{)[[#?.=T|_2x[-!u&d$NJgBC"igO[V5IM:`B\ g })zP xs\Q=lmQxc$ω|w}Z 6MDsQ|jI_W-msI""%vDROȠ<>|EӠ6p ]r;z Zژ/tciF9Q?>_o5M+—0ߥ8$PW|V| > Fu},oCv)$b1a3k~&E\Zxv w7#*=km#hn utۇactu>|t|kK#E@[eV=H*Fo[#IOퟴcw{u Z|wGI𥼫}e%F\`Hk_~ږ[]=忖 htd67ou/aj_ 'uS~&t˭@ [`8Qn9O ?薞(M.[=34w<7 mh.vq`T_<3/böp F \Fŗ3_Դ0?s_x+ '[:dݳ̀E;NO8J>vm{|>RVx'yO8n$?4J@Av3[HOM\Ҿ"~П j61˔CȍI`=3ެxgN|_iZg\\\sx_5gf-p>֠ܤqZ {š4*o[;+;kd}O\V_\ x/i3xP̰kpHX(Bá-ۿHY9s,S|l`?r<6F@ER><5|(I:ieo$[ZY9rVTݛ=%3}NXoq_f Ԙ@&_v;6=P ʻ_ZԐ)#ڪo0 8 { 0)@>qGsĐ=Z- 8:tw?xvC)/q1_Ht%S⓪^6 Kn1xWzj#Yl2e\8ԀڌPcB}1}K'#:qS [R4ae#+9- ʠ}kfҀ>H'?B\gnˆ<#Ⱦ/Ca{m%WqO}F(B4,6ZtNO 46g4[R/0q5F&^)hcY đBdy\8YIwrHb5݌h#e4C#>8dj. } ([bF~$W@c)Mc"mc vJ]kzQDErY?L lW5ω_6zZO_#MǠz(|;{_L-?,&'~v]+Ǒ~l _N_WK_ %$jZNnQRMzE~~Xx;FA 𽴀8﷎Y5o [M[) z_ν(84~ ^ju~RE pprXj͕PM׷!$I3&[.}OOx>f` 'xٶokZƥwᙝSmېm?*$ $|WieKf86;?ʼ-DgktLK+xM{7iUFkˆH:Wc[V}3;5ITW8ΛS[-=JXMǧ^8S)E}b@`ޟW ,oͦs׽IԥҮH-zd Ñ~$|^» AK4rxTHXa/O(4E׍}f Vg;Dc@6.̨ u2A'9q{=I:IrZT̈>y> 菦\xB1ʳF~+~lc5k߈*N4Ϯxi`}A+@75LsPcr\ !mnI.7 m>b$t֍zR叧|g> xw.;{L4cI F3ztk?wÑ5x:;ɵϯkOc7;}Sk$.onlq.@=">Yy⫨{O0}b;\=mcg۰ng>=> Vn-.bY>UцUUx4/>'Vu4L7!}Vw>!~_ )ր>AGwڢxvGg{4؀ޏx| to|=m_־+?*9<`~ڽK\ n~e f.}|[8IxHjH#V44m|You;d--9 @mt2(<4OS]߆^-tݩ W~L7,eEYFP+һM@ xgLb㯇~!|:`oUզ" qW"G\W/|O;g}Ð[Ϩ#BV5Y2mo$(Ǔi'M>iG r;/Nk|0PXuy_8z6 s@Ie, Ws ŠQ@R@Q@zWß<o_퉪t 26xN{ٮ B @;?47-SF[o⦇/I.xGFYlM 1l8"+7zχY>~TtȮaX#ѱ+ȖX%InT~|F_SxO@]CK1hw#O 2I:-׏x;g z_񥦡&o:7Y%Fsm<_4Pf_ׇ߳d}xtbCd8͎ϊx_)5"Tt%D+Ero:GAS/k|=ƻMRG-o.lhX9$<-|*[Ro%ihZΓK/ *b̠wRk>C[ѿ`+×Mݦm:Xehڛ:9{pO "CO &qa?>x=VZMk::\*|V l ZZru zD:w?$-} ^f4$3L H<߆ ,IQPEhbڴ)w~[?5/F㘼oh)M%-7QG}(h~QEQEQEQEQEQEQEQE֜8QEW͟/ۏjz7tM+>dt7hjGjH:gQyſagg x 6g-]Xg<_'{O ?>xt7VryY1so { $`rkּ?sSwIx3|Q x:N׮%Y>ne0yi#oNޙ-|)|'kOVeizHO38mkgR-gUvxfŰoy8$jXڪ +|J_>)xnZlj4dAz`V~8Q⯌oxL3j4i¹G>_1_TA?uZiRi̷[8ŗS*^pI`Ζmh$G8#E}-r{:/o_φ,}S5Ox~"[˫bgLJ7! yOVOx᧍SUW4o]5}J!sgn̅88H^q_h|>I#R!;F]сU'%|!'񷇼 h&GDiFr!p|EKŏv_|U{kWҥk1qJpsۧzW_x7߇<P1DV]#ӮjA܊p:WAopDbB*(>tG?[VЮ|3]vi'/^[VfBT3=kozόh٫C7'FСִ_NΟq "bfFIKe?x5-SJGEsx_z G1TTa9O_ u>z4 s|G3$? h=qv_99O~_>+,-BRR}Fz rːqҾo἞|-/n|?_IjI_l ~ɿ |#iZ^k+ /U]n,2HpItt ўǏ;htˠdH0mbw 6s\vσ iеԭ7B0dp(O]g1|S:W(!k{ׇ{I,LhT9@x/ω(Tu?Z˱qfy* dS~˿t|,ּ ag;$싄]#bG7#}9c>|>t+/5փR,e9)/ds]' MiɪZ~Uݛ r BrC@'GWzCդ,!XR Q^ko!>1~&4kWw,0'Il{|WM_zmYuxd]HAFAſxG&nV(9U@>v*$|EĶ֥>h<%_c8TnGTk!|'Ew=b/x/Q?o_.-[&/46+1fB$s&~(gMiiwx}m2ukc"|>`koٳz]V&Mo7uwvo|G_o,h|[6x=;!G>^A~S[kku>}߅$\,#`W'$joc};YcPmc$R8w߉߳_/<3ByvV70dem(I_뷟/7 Ğ<%[M^ٴ{I V>b8]o_/^;>~'sxR49F r!ʯQ8O>⛏GQ.7/]bX򀄮W5ٗ<xC_mzmZ(a% $3s>{VSx?Ĺ<'d!'=57$'F>ϧDj]aE68}1/R5O(1j@Aw9 ?gO_ x־{HdG/@ZFc@z JSRPEP袊(CқN=)4p|QT mWs^w|*ΞcKƚޗ&`/ X09_UR| ?ϊF kuQkv?(*T>>~Ǐ* ;Vin4YۘC#-&Sզx /?t|M}}edKHz{מ wi?Biv)CFxamox^ix]Fs2}{pFЀr{P{+v׉"E:+a*uQ9 ?O^]HF-;n0{|?dߎ֯)k0riVRѰ(xSu=}_Úߎ|}ڞ_i +zaYx+u|pIz޳"FJA(hڣŞ_>բ7wiq)) >BYLR\ֿ|M敧i~bmkZf yb낪;{cSE'ҭ|U542d8k[_| ׵ON.>{żq+c MhQEPv((((((((ozu7: ( e>@/|owR#[h6I->92fz#$Jg?khW^1mi{+RN:/٣Bx ]u{.%NPYq=kO2dYu#bIe3>!ݏ3~03Wu|eNM?RlixFQTH95؋%|?=+cƚ>-^ZX if<c@M;I/mJ4}GR X7ڀ;nuV_M4/,Rh|_,bM{s?2i`K4`d91n+i?eOh߲ïw?4:@yͥ͘嶸D$Nhh7៎=ZΉ[ xnW:Ē^f lTfe9ڀ:䵷3kOT,ZD2T19Ҩ|CCiLF[!Hn6*BiSGD~i/;]xHYiv@mcq;uxG ]kjmvmlU2q9JAӭxwh D_~+tm N-ᷜ0? ud$PB2+˯ot&Gy# 3'x }o)F| N)T tGobLT"G F'Vkk Oͣ\66\y#i v?MLԼMjw6]ɩʑ"wP'?7n?Ɖ/?i_A{z~ໍjzpBG%̂R̀`/^;~ȿ< kĺ%}V}P+mq p}MzW~x:mcsa|'6W '݁@>x:&m/NDy:f26C.$qW?gPo,t 4}+XMkB]G;;י;^ɪ|#y_ xᶱoůlz>B@1'OxM x-l[Vo4k wtVp{o?kog̿4 :6sOI["r vW<okVwX{?.@ɓ?>s=kuZ^hl%d#UkULNׂ>$>'= +el]pXQh{W{{\k(s:k Fpz('ΏrMć2H rT_OˏoOBB IeCb8ՙ22/^;/|6[ ;| ݢ((((OAIJz J(qQ((P1EbQEQ@(P1EbQEQ@ EPEPEPEPEPEPEPEPEPZp8Q@sKESvEhEmmPQ@6EhEmmPQ@6EhEmmPQ@6EhEmmPQ@6E)M(fotocx/images/localcon1.jpg0000664000175000017500000004700115247006660014654 0ustar micomicoJFIF@ExifMM*V^(1fixgnome-screenshot0232~0100fotocx-26.0: Crop: width:317 height:300|fotocx-26.0: Sharpen: median diff 2 14 14|fotocx-26.6: Rescale: width:285 height:270| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 300 317 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?L$B"T`:RQEQEQEQEroblC i:V8`L溚V5"69u=8y巷yAqA+?`4\īm"=zr`4PxQE|_&}|{|UWoc%Լ@aVHTzp+;']ŭoZ%+2K+W7HHW1se¦ #?Z_>(~;ωI[[i e!ǘY;S*>، @P٦X#gsn5c㚽"з5=czg|5{SNEVjrS"^N4 *H:C)<+oٳY^Ny}Z־VRS@Px5]^3P>v}~rMcREo<.P  G$V5jQY[ Eo<.P  G$V5yGůK.Uf$nmWS1*;> ay-j_jLo)p$@{'$V5[ 7Bc}6WdYdk  6 \ ׵Eo<.Q  @]/w,6"&HgtYx]߆>!_.Gy%m}d+%EUHj-n A"9߈W[ԯ%&yX,&QՏj#"MS^ &?iZVȺ:lMBYb;dsYS6O oy:7RBO*l]P/+_H#"C<)u}kcM7?5 )oƳIHݜ@I^cYꐴWp^Di '`_WKlG|GA]/ElE7|GA]/EetE et}[/$VX.c}[/$Q_WKl[4Q`_WKlG|GA]/ElE7|GA]/EetE et}[/$VX.c}[/$Q_WKl[4Q`_WKlG|GA]/ElE7|GA]/EetE et}[/$VX.c}[/$Q_WKl[4Q`_WKlG|GA]/ElE7|GA]/EetE et}[/$VX.b['$Tj1\o}qkpʉ"D0ņ26~\T.?_xo/GC{?8#EudH8Kbw?5l'<AR$SBw˜:_4|ckGPxP[ 障 Hġ}eY$EխRMAt#Dwkψ/x?d4M߇YUw`  Qc@ EPEPEPEPEPEPEPEPEPEPEPEPEPEPT.?_~ \)(^1Vcxw?5lEP|jg7/]i  Q9M‚ 1crn \&/Zfflc̉0AvU=x{^ Jmo¶2Io4BC8EJ>Nо*hm% e͔E4gazFEuRPEPEPEPEPEPEPEPEPEPEPEPEPT.?_~ \)(+Gl丼v*SOH YBdizODp!Z?h?u ='_G$zO,!?ơ;A=Qv@{_ #)e 4GRjC:h?u  <+q|O+mw]%YWI¸M{fOotдe6 ?[m9t}!խ=tzIS/?fz[^DbOԥU_FQj5?M#6h?xܿWII?Z}!~K(1_{Ǩڿm??ƑK(-ynʣ׎Eȉj=!K?;_<>wJu_X:oy6Gw:8>|4,љ5x#%8#8#5?.[}}ٶ7K>V6# bMWs,|I=Il|4@l#e R{g o^Fnq=gL|&-|Fn&/?Qmc MHw@->D?,{\ _C<>9&kD ? 4O73ED(3ED+?? *h?p80} ~ ,}[^|i In@=;S('Où>?[Q;0Haͫ3ӿ?B?HOn/ @OCn?z~9|7֭[rx 2[g3Y~:|y_@|nu>жlv§[u$~\Gi>|/;x]De?h?:wxkgigSVTNb|<Ꮛ:qu}sD5;}V01ҰuO2᷇&ci`ҕ#lt8 j|,G?z 𧂴6%KqI]ڀ:ab~k?&*٠(((((((((((((((( \)*P?RP_ab~k?&*٠(((((((((((((((( \)*P?RP_abb&mbƟq] mE#the s-];ҹGQ3\%_??-];tM4fKnN4[u>w ,u5[u>w ۯӿhMAc_ۯӿhMϮDh FhrϮDh}t'EX3Fk}t'G%_?.Q3\%_??-];t:њ-]; m4O&f/ m4O&KnN4]4fKnN4[u>w ,u5[u>w ۯӿhMAc_ۯӿhMϮDh FhrϮDi/];t:|W,|e8oL>6zťEYErCLN6#F?ZCqq]Eq/aq˜~#B:ˢ/cC/ JdA=t_E֟n.B[m/ ڀ?଑ח{T)m͎S|n~|\~oϊ<[Zk 4tO\" ';suWLp&SLMVW"5 /OiPʑ?mo.cJԶ=+4mo._'9Qi۠dž-,䊔~;QŵWE=+RA }2!7R/&OXW+Ri#JC?R/=b\,x t;d^AYEX^<3qW>@ZBvHO knl95 5:^Ys=R.7\V3-N۠t>Jԇ,bͿJӶ5;1n jD5hX- HۗФ t֭eOge|5]L VP=76~g> MI8?h~Qx>A>Yiwi}<@eעCbMp,Q{dLu ?@L# "ci-xIo@$xփ/,ֳ)|~8xpè"kQ3H7̩rcl H &~M_“#Wo7t>7I^O7HOK_K_£/L 36o*񎊊K*rU+g2wv&mK`KqQL>x>evz@IgBvn\ů|A6k6m2Ais4;Dgh$c g<iԓ_"(of#NO'7fw?G]{mQA v4R;>#> XxèxTiJ4@:O[ 菴3GZӚ?}v[𧉠gH.5 6H 0X"'?i]##ּ9h^".ihvQm^#1yTog7a-OeH:sZKKZcԗkmB]7u0 <3 XKNȋ$wC_3i]܂Xv{6jRגxtSűLw-]xAVITV7,8ʼgrU .Kہ-#ָnokWf!,."NƀQXiS4iMҸnQXiS4iMҸnQXiS4iMpEaiM O7E O7G&g=M V&g=MiS4\,nQXiS4iMp ]w"fTֆ7H핾Q75OM3 o&M4{).7(?M4{)?4?hXܢ4?hLcr5 O7G&g=M Jb[L<$[HP+>+96إKBKo.݊1l{?֐1^U>;|!Gˉtf5 YEޱ(;$VO~(Яu}*m:hbJў/l(Ϋ[E/03ٯtR߇o|(9m㶽*ؚ)dT"w*N{WԹ[j]"?6IFxRygOٖ?!ʲ93ǡ{aW Rƚ]kMnvf"q,l;N}Ҏ[K <]?$L.Vhey27'p=kI>xᮄ<-&\d-Ñ}kFiÕXCu9OxB{lSyeZ0e29* { xkKɫ/W]FѪ ۑ_خ4dV(/5K3umbdg`ySq\?AdisLT2$3?wkuuYp"FdVսV,PFƼA?*@e!ϒm4!ϒm5E1???آ1???آ1???آ1???آ1???آ>K}>K}sxEyb{愕,HF GpO?"G/G"G/Wtb]6Q]ÜcW( #|o #|o( #|o #|o( #|o #|oZʷk\^7|I4Fht}>Qn+x/KCu(5x vTGK 9+{D.iBO"q7R?H;c ï]5OԴ$mWCnȸPtQҎw05mC>}v+di#4Wɑ|F:^Mzq?^H<;q2F ğ}ƞ!4:?[[&f7 Y@@2SgctUKNT'L\LȬGqKG:ݭ nHgia_5N83p־)wgk Qn5dr*r0O|Wv^&;;'Kŀ31*^?~,𾥥CKu^K$T*3H݂i~mK &,Dv eOnk>$s.̹ۖ2 uZӂb*G<dݘyۜ#gol]ތ\zJG nuz$ ܮQO~8HN1GN?ZV(!;^s}.3ZvCzwPKmA1-95tx OqE͟_N?ZTuD|r -p01-=rho^غ?"ID]wgӏ֏B8]#<".ER>"9ˌ^ӱS.1z`5t$zEӏֆH NpG"=}2?Z,2$WwxO^Jr?үO _## N͜8C$Fntr;dQ`Hx#szzJ:ײdF0ᚥ/Rڍ_ɴ[/Սnv*HmuGQ_^(kӂAg-;2KӀų>K7<A| t".>8Hh!][72wNLR+ٺ)!8LUJB#;p;oߥ.I 0~{aܤ#RiR0[Zq"uzv@n8+'#Asoސx)D_ǯoދ|Mumac@`6I88sXԼGN nñoۯn!]3m@@pd:+_2eziQ\~ZկImFVe{:])mC8QLg#8&[SLn]fV@2OԚ6le4kږyAI,1@uYiNg&}^ےY mPx'vz`U{^"vLYl;BzaS &LjgN+?i)ojVᄋ(Qxs:zȻt}J}:K r*F}5{=/ž֭ӧ&xn-Àv]r">x*Oh3[]]ys-&Œi-{ H#%TG dnOL? /T?tB3|-РeƊυ`m~0/QTtB3|-Ф*>Qυzυ`m~^`m~:g[ߡ@?:g[ߡG>P*>Qυzυ`m~^`m~@[ߡ@SѴDV62/Fr>o@o)?4ߡ@cb@:GL}`iB/QT4ߡG>P*>Q> KT?4ߡA4.P* ?4ߡ@@''T4Bӭ-Q5Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@c:}SIcª!Obzf+[8t3,,ǃnua#d] >حG,綥;9_ Co/%-B5CiI|Z63 hk\=KK|WLk޵f0)dq.pu{+2H4 Y5"MFxQTG`('H5VֲcP]H$끎SIpi~!:2k=q^[jW0KSX+ZC[ dA(.0P-k3ip;4; x/i}iQ e ,,RqП_ޚFGkLl-eg"Hw_QHluM.1) &Ie9I#x0@ߋ'>0e8[mnR@s Ly!J?iheim6z}Aoncǀq˜y4X6ji=6RpLcH̄1X` Oѧ-FKZ[d2F_3 ٩4۫xr,'s{/zt?g]KNUbZ/ciONu;ǦGm65^9^0&B6&& sdno4hБfKI-Dh9nv}-ӆ: Hqy\1/Oo` =qH3$F$&B4~q};I'ݹ9=Ki ߣdYGڐ $#R{-%DnEĀ vڈ+i#Vc;fkw8KdAېKpO2d]]'v(I;)SvuRѺ$jt:ݾn))g/$4qjcyM%nw*.&6}'jlk{8 ÎnUǏX;WezQa2uO5ߛo`ae/|:SuR|sG|\14V.G,-nkFgoݿ(MeGZ;Ӵrk-!- ;qfdm3fl\m^%,QoбvvۊXKD}c3"[:"+jK8FG_kv-1 s)hNGYc*hwɏ﬍[Xi{= [8f=Zpˡ_B*odf>YkϷ~ݣxꝫ`vujujp.wxsۿS˴vKa\]^[=4k t ;XXgn 45/3f;v~e@w ?ҵӍӴD5! ;۸GȮkxw LMe-[nͪ{JHX~;4FὉaHȵ~5 -$np;v"ͻCIߩT^ѩԮ`mtw?Mu%Gjxi%-Py HxѸmq}{vh6\DP`}&kٿw?Ѥ= OfݸqquhH{kQKXKQMK1eL>]C/嚹0m-#' //ۮ<:U\*;sCHwj&6 w/t3F9{*}@nl<.]~Fnmoǽs5\׽՘c̖dߢa-{vZb",UH:60F_:}M-%g󽟛]s%v;xUU1!IkY K[^[wnc[ԫwXls*#L$ƆOHʱ4tXc?rpr˲m4]Yu;I/l?sPI7:`2D/DDu317춍v7Y neF=T*?G;w{}k 7|&5+6ΙmA# Rxc- c\ ;vΚTv;eڻKjw#l~w~,K$3"\?;{ͻݿR"ă]0H$> v[#A< g# ={={^QgT3M{6]ZV>kHin{3{w<8dյ38 ǵgBȒZ ǽem߉SG:ƤLhXa`#Q:{uIkkvݍ!aw>M?I4mPsQk]Ec3u-sMv4׳؈S&nfAd+eV:{v 6>*wQ_EX&G" kv~x(!FP1Il&D ?MM^.A }5Si [:im1EeCl<$r$Hm_SL2+?-&vvk[?S_Sm nmBǩ9ͱ"7R}wTFQ>"#ſIz cm^פh? v@};I{\IWﮣ<V7W'+q(tE»u~/˱XѴ{7lnnUL8r]kwEU=ZvsXY:3WW\zKQfN }fwjhvp; ? ?zN$Z$6guSaegPZ~}R²wlphk2L4};n31D:]-CLkAXՌ^4mc Hd<'#{F.[K˃ds]]6V ^kt̖S5 856I費]0K~P7k*E iYp#ğBrc 2ov}$H3?lGd:r|S0hq8'듴~q`V\M܆W}Z?<|[-o{^pcY\KYIk~w3c67*1>͠zRuf=x3/i=6kye9fk&i[1Ϙh%'+܁L_+K1Emc$li~>ikAۆ8?cw;woz\.Ȗܫ \Jxi61˷IoBAm¦HEO9l3ZmiH:kc'ش(pit$x=M]NsYե,M9̫R6$`G6u;WKfAXY4p]O Ed1- X yQ@=c[\k}CKD_?Mȩhx7rpN5~Lqf1: \`?*R.-!tԔ {r#S{ɿq\7I;V? n6=Aܘ h^pE,I |o}KW jutiUChK$ wvIoPկ8;[ֿ r-4qt47N֠h%$6IOliw}jq^ 'H'CRnapᡇA[*F[/&ݯ6,6&c$яwDm:@{SJcMdsFL7bCv1ަ6mVWw^֪{H,c&u ;ZgTdP [: 2;ho,YsZ:Os.rG6  t4էem{õjN7{Ut_`z܂il4)MlMq-c~̾Y{j}Og}GK;cO ?jLUm;XʦAܹߡX ?sNGiۂɭaIz?5f=FtI32L P'W1 @"sJI,HȆwEQ}s?kI;nDGncTk`~sHnւ%Huzm[l W_#p֮dz^_F|}Aw>Km`=9jqz¶Vѵۻv-}?Q_n~+- ghJE\`dÈS A]HM)Nۺ7dzb nT-47oZXNv!}?ګS֫oٲz?D6ug7z7h{[$.O`^-M=ާ>~Ca<~Bۗ[@sYm.s$~fӵ&$9ՏR@oڿWO{C?A'w!S=]ĆL4`p} 1C5_̗硺bOlĝ[Q MPhotoshop 3.08BIMi720190709< 120759+0300>20190709? 120759+0300A Topaz Labst David Dayag8BIM 8BIMhttp://ns.adobe.com/xap/1.0/ image/jpeg © David Dayag 1 2 3 0 3 BE7CC7A7477C81B9927387C9C013E864 sRGB IEC61966-2.1 29E935E87D321D2A628E7768501E009B 8 0 256 320 1 2 2 Adobe Photoshop CC 2019 (Macintosh) 2020-02-15T22:57:13+02:00 0 adobe:docid:photoshop:acc9c680-1863-7b44-b777-19cc04db52d5 saved / xmp.iid:cc4ffb11-af55-4863-8ff0-6f9c31c95fc9 Adobe Photoshop CC 2019 (Macintosh) 2020-02-11T12:05:20+02:00 saved / xmp.iid:89083aa6-5e61-f046-b8dc-00a733d4c18a Adobe Photoshop 21.0 (Windows) 2020-02-15T22:57:13+02:00 xmp.iid:89083aa6-5e61-f046-b8dc-00a733d4c18a xmp.did:a872a062-2348-7f40-ade8-2b92dc63f3f3 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?kp*3!y?/WtY " v~jp>dNpPz}rsZ67qYۥY Gv ^ýuA-ºV[\gqGNtmcKy"R9끌徽⬧ BǚH^h\ [bORO ~ky:"-B[[ Mt=}88TB-\By=qdHI `q{u8Ÿ`Cgv:\4Yi.jR)Ić$gBj;01Ζ;#!\0C22HecH8Ͻ:&keYLq) :O$Iq.d]( w.!Fnzv+v+i2;GnS[[Il;~ҹNg!o2:n \1ޠ ʋCQC`{cHROs-ƪrzus_g1HC1׌Ӎ'ޓ50QGR[0gI+nq^y&ܨ TۓӓL;̐K#|(zp(T9rW $ֆv%PB",=yjܘUd,lc8ڭc"ۏ55ʹ;_ss=]>:1jVVY̠:`VZڬA+HQ|'j%G'v&UI"u&Kź 2NG*6i%҅k9'xj['-5ռNЅEf?(6aܟ}*fIÝĒrsֺhӺJj[;q `fP?t>y2EF GzdzF"gYm.Sz:zB' XGV% 1ۿ]1i-Njj6ЪGaTFO9\{r3P.|UL0#>*- s؀s5ʨ+($1psNJWrJ8 KH' l7vb#XFw#N$B=֩Kne }ĆtJʭzm{n+V*==`)v$HlJWp p8H߆/<9}&nc/#ݑz_A) [B )#Kqngr7WHg"ݒA#!/<zU?$f1v9g+ rqr9cx%"U럧'kG+t I#'ȠE&Yo3`$d1@{xp 6|ܒG|zggz4knY9 Jg`'tiG̬ȓ r[9PeHdsF 2 `S Ga#  ݌qqY$ѻ)l S´8qS'4`$gt[by{wȰdY Jv74ck*GÌt=Oz<}*f>[+FYXH=Nw)ThH-Iv'.X6Fd<Tfqߧ_Jt WH%IR3`JpIPOh$l|xpGqHTfѳq8OX0$݇?Sp-# gD!lڀ]G:Rwn",l29ܢw {Tg>Ր3w(9ln(Bè#!OZ| ,Cm9˔;Ni 7 A#\ƈrH99Jz*Lmwc.pA97? P#RS^üdz[ 4&T==&bb$` U#f$5.ϘgWrbe˩Bixm/d楳&q¹ }9S h/tphwO\fZȭ12rIlqϽs^t-Q !@NSc}}znhK˃i,܁I`[N!n&hby{sǦ3MUpzѱ-gTo7%GXZe3m`$\Cs:-sHQ B ִk[Խf݀s,3OlAɮ%5mǺ1Ւe2YHҳgd$'|=%?P3`Xg1)eF^]tL~)?"vm9[?1\y랽;qWUkk +#S/;N,t3#_f :rzi2pb(Fْ0r}tWbIsӿmzHŋ`I֭"Fm˸܊2]Icp yFp{p=jd瑎ֽ,hP};qqP|­MN^1iG # $<:{Q&PUn#$$N6 7IWjډM)p>561QwvA\[OҨ{K*9NsA׵z6(WX מ;W\FUdG'M;,Q8rvuAl00yOYc18ȫ4o.D"K{M^庑cV&-rmGhQnt+`{~}kWRs@x$ҹJb#U*r9<ʵlH(R=1ֲEmN |񪥭` rNr1?:"iBY>[Ay.a67nn{q>kSK"pN}+Դ=H]΄PRGLzVBK`y ` dRί yJyqqPܤ#pIo9tHݒ\yN@flaO8zMY d~嶗L rsC~=kJՖeEkC4^4k/W%TQNMxe۱Wr;g_εp7Sv\HC)㞹NqC*lncnE `W#oFjhnᵚyݱ}q#QZSZ[wIʠg== P.d[?.sϿ{\SPa0#_OzʆH\N]0s3HcDXyV ^v1ߦ*'%L\=sk6VNAXˌ~}T?*2$`ïVFQFJNp3Uh2RƘۑx8 ӑsϦjkt/%ےzvۚm6%ѻhJFZ}=j9 -qM=8DM? Frx9@8p>9dy>nu*D|8E#?d<Wke?W;}9TT$EPuϧ܋7 2 0=Λw@'F9#G_VIωg/dȈTa~?ְ;gwqJdy|㞕j3H73RYo9t M.pŤ3۸cn(aevu/A$0;$2[@POF4Q OXl! u5]w6b&$ `s)ah%Zl T FO |N`pҹ*oęP=y9-,Z#팻(8ʢ䓏aէa3 :(:6޹HGC8zӱ bU4\[ "vƼ8*Ƨk%"xG#׷TO7̀ýl::גuWy+)IZ4x5b0)0E & vOU{X!yΥaPA\92:wR"yii ww$dsԟzŜܜ:p|99\'{s#͍IvIR3עUS?("scO7ZVfh!2C&X0L4 Ojdػ !_ݠu^ n'tn=}n;tx?#UY&w $Wa䐪:ڒU G*1993 0݊70HG1Oql(-"|rrs^a* ̥U.7'E8=HiW:\:- I;Kn2#֠).wFH|a[:?(`u=}?{T$SnX»Nl|WJiN %$.Dl6r ,Di؂?c~0F1^+p2v:׽ Uji5֥lHD,B۽`°ꚡ4Q+HNy= [N /P}9 29S^t^Rw(]iGbaZ1v8[[<$2|5zOr%EN7FyϸV YS30zӎ^k9'Z5ŌzvR({JZwu#hnjЖknya}x<5%s҂e0ߒNO8RT_1\gӹG#Ko!6ZW9mÞ}ⷒb&A1d*Gs9 xzͣ18@{x:qZZ ѥEb1@=jN  vssNLyhPn),9=;Ue[&67$}9 F}rD t[o=қg`18#Hc tHd2;̛BF s(Tw䑕 €4%`2|>MD;`3ShM 2vttTc?9bcqH嘒߽2HIelGC<"1` &yMHgP xlw=Da !r:#jZg-u;YCzIu>$KElǼ6W+B/IOzi^kdam,?z^Blvl I{Iʳ|Ԃ:YH]He![n7cןzP\B%u ˵u [$Pb@ c r8\l!*1:I$nT2߿\wI^HV+tB!sz T6WZ6c G9fZI[IT' 翯+gN0OQy'5nY\ڔ؎2&h#pN~wk{$Ѓnlӎkʢ$UyQH>.Uv!18qwxu:4?\!Yb̀Py3]w+8B7uϷ:s^V,Ug7-#TW8;N=+SCm ^]8GsJcATWGgoEHHXʐ#zskW\/. 631s\RbgY7sӱs_Ni1U)V 8^B4ց C5ͩ͸So0swηGyv3pqg;ٞ,.ZG6w 6Hxx=?i ٤y-0 YpI\ *충 1RČ~sҶИآ'3^6&R8~Y6;v]OEty璠Wp`܌w28pSV-UO=3غŴlddku+"SڹZHh3e[SP⮢#+I[*W :S~yjS:G${tHMCt dI̊0r͜~ Z3\8F3Z]Y"^ݕT=ǽv HѲ B\==8&{g4q+ OCC#X*lOz- WBr1 zנiddlqUt:q}c@Dd̶PO<<3's #nx9'GUf!&Ӄ2?h$>'2y,H@HraW6Pyj4#I$(3mP[>6kT9&Utr#rp1Wbѭe|HrA}W u"XYZ"a=8?D%x/;=c񩡸x# K'?9^ӌ΢39QП=qh"ZG2l=s栐H szYq g[ [pOPGB:kqt)@'8ry s✛ʔ?=6Wj $*88yB-Qc)f]KNj$GaH)>EY 6}8<ic`XR:T֪(:JQJ|5ITT>OC뚵ym b*r鞇91T`8;3sjttD y qީJ1D=عf %%$3HzӴ)҈&@ 8Rx;ӧ=G~xPF7kbRuHLyyͪ^*^H?*MJɭ/(J8;ۡ:i<=|Ѩ Oq~ ƥ# mup\:޺1jZod_DnqGCH?ᙧNc ^zU*k"YVߟB*g}*X/OԷ`}bAA:עV*HŻ$=8>μQۦ\Z=1έ$D {`1/Y=̺A10Sng${`qk!R;iKm>k, ,dc{M 2߭B*E4na ~o%RVw0*b!V7U\+GB`68zf=XzoB(e #1Xv$qߏZ,*qO=k̝-6c$̲:h6lh&w88=>,6.Ds`.'O2G\A]nGVsufaVѥژ탅&n-PpFNH=.;?|GUfU[kT70ˁk̓)k8mFI&O*5YG[ˋw;p&gRp wA.7Zlx5t;rs?iڑb"bY@c_Y'%;yP=˗E8;zd}?Yq*2`=Fq}kxBe̯#l ΠmL{u aUo/c)\SϥVC#'q L2Ea! vgWQ_rɥ11lo7RA uV+*R3l|0y^ItT`ϹS'zqOL!j0 >J&rqTG)ݹ9 q>]C&A'>zر'oDX (h7z}O\D]rX(l/co-@R$1v\g?^4/e!c՜)@>ߞKoiuW*q#QqC3p#eY6$jcS&Ds* B8Ҵ> Z8Cn ۻw<=qW4[q_JFd;3垵fhN>ty`z 42L8Dp+l͘n&leYYVYG9QGnt$m"nz4I'ЊtvA=UZiwIo!(LrsqR7V`Iۓ[vwVƬVU nP;yH|+.[ 5yY%yQr@s<ֹ[GYOl:F8'?^*|ym2HA c1ӚҵbnI!p ꧟zG}*-h#E+Vm6EYRaԎDڕ|:&z t0m5M@bHGy<_nw@$uuU?:r9 t=HWRzz?s̑1r95@գRXrd>GPk"h'y7g~yqf-f(W=yK$ov_($) d<^+ԨQ.Yz:2ڀz^b KS<P@q'oa_=b[VĹ7iHkIw :ߞ?PxKF| q=AԹ6N˖[䰨'$l*KgH!t,@zǷ0^ď;[J#kpJIG׾8cNfFTpr{ZJ|ƻw#*:r2?ϵDΏnP6y8G5AX(J%bE>@~@3EZkGFK'1ܓUf9cPR<< $8aTd sRf4'j,1O>ʑQ|ۚD'm{g=-ʌH`7{=Vovp Ԍ&(K% 6g}R xN^k5 IS<}1W븢vSg瞞kDΤ(.ܒ19Ho~]]$IJ(1?Ȯ$pHpsی8U,ŢA0zvϵ^P:F^/pҙJ/drs8gaIj6ٞOX@7.3ϩ<~>/BK*t~җ[Ӆ3p zcҺp.VgU9;qs=jnR$U1p$t83NiJC =1V:q?( =@ʝއ};a[+=($E&A:x xkc{BqAGrzލ,H$' p}k"%\gx#LqM\:ORթ%ib\uK.gV12 !gy׃|qgu,/,>a.3q8ۧjB]x%Lvr;sԟjJ2A tM]!F,0Q߷9BiOLsXBJf2ƑeV `m cޫmypnE 6H@qL[GTvWRrx,M9>sb=Yсݠ 2q׃"dB ךccᠼPX@<go|$_^9+^<% z͹A"@[}k- Eݰ7Xw*Ȭц #Ӛ]Wu4pvEf/I`dA@|'VH0GRG=0{Դ^6`řW fjm滹mݝ{vNK昱[kaE Ćs-?dI ;y*6r]iL ɹ`Z@$ێ1ƭ޺,?~{t]9BԬ/nɢqvGUk^["*Ng8%Au+}؀}EnpfZ' ~zNQ6iqf=ě[Nqvzc=Nn13ҵ8nYQNj bdT`9JQ1ޣ0x[dr1%VX"2{Qr sg=~ґs *$|3z~U&lD=}8) yz%zȧ+Hw +S>x*Pɧ8zkY P䂣:4Wb +' H7+M>:{ǧ4\TtcԒpt`3"H#$M"IdI9#0(dPG c>'ODFWAOX˺EᶰIceV4^rO=s6\uG{HjޟxȓLz= UQ0)$b\IHC s4ʎm]K!=3g?Uo;qڝy-YL'rӮ;Su[9q|oskMty$t8Yėџq 8sG,9(7t'ݥ?6㹛 n!E1KHS%+By9qǿNڭ;z=j0(b =٫6y24$d 1Q܏ʮ[K]2w.}pRKx&X}#W=y<J4g aPzqӹZZZ R5RGMNZ OBil4+>yIDcB{)ג82ۤɔ؝놎H$J~a#㎟\Z'e3?.YW9׃MrO E^dMgqs*lucAO_[fdKJ=0{u,V H:=x6郞F8"{A)bgO {8JZjzzy$cF;z㟧zHYxPz=x3ѯfKwJ7!rA 4Ji#Riqzѝ5 es|*Rǎ{uF{Gk.;X9\z:pm;M'eEQFs'9JѷUBDI>u9ypHjcQߧ|xI*I_pk(顥i]`NHfV zd_I&9'b "P$St>ԛ8jA0cfE*H,H>nb}:6q[ ̲/UPk;660H$?D(;Y2)z23;kU 6d;8AtVP]@jC"{&RzgoI'=p3Gɵ6 ?1I`B񎆤DH'qQ:PYc$Xm"0I$6D{~8?ZBװ,b%OA{g`z6Xщ|d=5>-o+47SzD.z`@@J ݮ3`@ ӌ]E<ʍ+;(*ͬmF\c?f7sɆB<H~1UlH2!㷥s6Ҥ٪Zi3% |>A*ZX ' c{t1V)%ռe]@1QK eKCdUI?şq̗ٚ\<K*>P[6Y$2H>Qz uw$%sM7MeS,#v'zR}-L-0\0#8nkr,.6LF g}} UDN,g n,Ճw|U;V(A0cb@>lC֣IiܢJY9;n建1*HZQO88T%K<#${vi-۫n,q y}O?ChUvFNs{:U=ΈՊV6t˫=N=Hpsר{{7V4S'ֱ4 +_<B:gTXtJH#o=zkZrChgtD@ EnkRE ^Tcƒ֥icȺxd\힀sUKg3О9&+h4O1OOq\1Tħ'h d{U?u.d[F=+3Hb"; =pH8kk̚W9G v620q}[f4sRQ1Ll1`Q$,ĘW^vU`ۇ u䐪w)*}TaԑY !ϒXg}3Ev=v?]Xs5([wVW]0Ƌ2V}1ӷz%Y HsvǿE  ٖ%4k;l3r=io'=NjŽywS 81z1qrN{FraW)Aukr+mHsԎc>R23,y}x*C;[nA#)|va@h#9ڟȒಝ$pA?h=mYK+`Ǯ8@Lqu[2J0rSu1Bb(sFj s$Ղ)v:LgNRČ ~$VO$[RD*0 b>}4qǠG@",$ ۷zm0^6i/ss]lŽéRx%HVRG }y?mXI:HmF =vw$<oAʥy0-ǧ_T_k)64(<ŶE5#z;:y?祋W[+9z'bƪq# Xʆ[<֡ǘHcbpݏl5m(KlIӐsSh'8`e?*O)?wlЖ$jE+4BF8 Ht- b#MfAx ;(۹~Ut<uӽˠ1Tzs[䣢)o[ \B s{Zm{YrJ$;dګB"UĎZw8`zv=NI[v ~G^pO|O#ƢyF㱷meegg~c^Mu'|>,!LaoOeX&Pу8s#SOs%Daţx ' QtEuQ2VO_|כ"ZIy/g=? Նω]n$XT7$pLddkuʗn s1(t\͵3ĂܓGeKmHqxV5($ՑJW  Ù&Lւ6IbvtDzߊμ6L`ç(X e fI4ɗ*#`a7; +ܞ_ߚEë3`2Wq#)Y w[%R33ɹFm\Q2u皥 63`a_;0H9 |&qsǨ)b#g$da򘜸>R%4$OEr|r0c"(\0=i,!*țrr:sM7AĿ@I8he;v=qEH(#{ӟ2&4(~E;;\8FdVRdcPGYᛱiyQYT t9=5{fPX?|gu,Ϲ`tAۨy85#*g=K= qs^+qr8

    UwKqA_Ҧ# 6$8<ԵI%J6 {~!lNA `B*޹nA<_,FGnԬrG#[Rs)l@7p2x q$6@IVI>仒5hs=@=g;vS].9Qu s#O‰QmRd,$Ukx[=$;z{gR6,y<҄&Ҥ#f?t^֝ϐFg-6 Tzg{նe϶@zr;~t;+4RÂs3\k<FnVɉbC1ؠ=OEQ$Gl˨=8JGHԒ^z2>]Κ 1Kswt^ibSc`2vֲU"&+y܉J ;sM<+cL0:߭4sn!QfK,cT` $Glcʊ>q޶ۻe8A=@ppyo2%TWnxTQ,V).$UA9x#׿^Vy@gy&2`DpGcM-lCӿ8MT-5_1};uG̤sNj1j5ä#}vHXT B nN:sW WE˧dDc>ctOQYRȀ= &8F#ZHk5+@:dV̥` v 8):h8b+斛z5Iڜ\Up$'S%?bF IIWqx8aOG~vVcp>vbwu:h gC&w O\O"§;rG:qҫjm,*8<Ӹ\p•*9:uCG;#64.PreX$z ^c ;o` ϧ8RqגY*tz~"&gc8J3H$z ,' <̇Q'8'sTD"G-\uH(b%-bX$q})6[idޔ\I"6Id#QByo#U$@~ P=B$.mޡۻfe%Tz]%wbf,8S8MW*2n^g tMCpV mޠJT LUW' 'j9^4 bݍфܹr9#=9KgHK><ӎk9ٞ $!I *i!XRpYGqW< JH0P =O?LNr2suLg~5CVm3G8q:Trgc%[@-=:w&Xմ魞'YW ;HUs{2\D[$qyǷJZS` }@~yNM7SK`!b)^2r1ҮT9KN;>?,(r2>N=;Pvr1>*. ܴ!KRI9D⧚Ly2H@Ug23;wv4Ηr.PGBOץWNIe]O#{U*("c嫢 )pI=j) [yF=j(Al9$`o=zVKw?fotocx/images/fringesA.jpg0000664000175000017500000006140015247006660014536 0ustar micomicoJFIFHHExifMM*V^(if%HH0231 0100Fotoxx:trim/rotate|Fotoxx:Crop|NE0Photoshop 3.08BIMfotoxx, *http://ns.adobe.com/xap/1.0/ 1 2 3 0 0 190 504 1 0 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?s2 ctPg^2RdaN@Cr:WjpI0z˚cM`}y4'Ԥu QILRcArO}i8}? 84m8>ܞz4 8Pid܁ $Lh\c=p2pHF;t9s OE'R>b@?Jl3E.0:ҕ@8$`8}9a!:g3N^Ay9J'8 qϷG8cz:rI⋂ccCRmސH9> 8'8=F;u׷xoE;Ex3O{\ӿ?W}7}G>\qJ#8^~ŕhOۭ/R3MP׵ 4`c\(h Ќ㎔S {ScBqZ\1w&8>B#G^92Nx)@_Ҥؤ#y 7h=8iXc uF$pIϦ}fg0юv2  S9Hy#9#Gn>j =}ip81F9g84 uϷZUK@8?^Ҝ{db;=)ԑ)Nq@ddzQM E*pЎ2qc'$21ӏ.01ySՉ |sMFx:qR*ÓQmcҕ{ ӟM#h$==)P9[4u41P\zA`@Ԥ dZC07c##8H?Η9 Ԍ))1ҹ*08tS?J,?*CnB'9#_C@F3g?m9g$`I4`p:sEyIA'O+A9=qIp8 g&7<}})Gߥ(I;xRidg>I! g۞PG.7g 9₇'8=}O99?tE8P@#Ԏ:A}?O֘\gׯP3v`uϿN8$}8x85sN4#2zpw{G3]{Y><\1#.Ҹ>iW'Z“֓sO#>qЏʄDT~~?M9ǿ3CR!O=hON8+(*=~҆灝gs߸2n01N < 7TMs8g8$luk78`晴|qR1%8CF9$}# 2)S?_R>La@G?jz~>4hսGJP `ElasMZ^1x >xsֱc#-Mm5 s= JUc Y*S쑺O8ASMէtX'c&+u\ixJ6uKYic&FePc89cg9Ã^F&og92N3ʰB;|OISg kz8%f.v\+cD qTǧG%7;(7df ɪOG,rFU+8Ls#4LJpO>i0m X< 6d\qu1=}HNi  cf;_q ) o^)ޔ+Gօ׿ҝIӊLpzq})bcO>RzQEcA\kNZYFfJʜI'$q^xƣv^@i[SRZ D 㨪@Ċ^IUne[eKWhܫPZIvg9yT՞ 9Y@۶\ȤcP,y>pvd{"b2]҂ORAϥn+1jX:3799֓v=hPJ-q1&f? jͪ$q0ztpܩŽ=l;x;cju7VУy!lK2gr9z}{.,̐W緵$ݍ#7gֳNjaWW. =~QUPblea)֧Xi%fC1pjf'o(|]mt{z 4G%lmjҌaOIŚQp6|͂EqO79p?jŶ~r[e%(=0zq\xڶ4Kp `hVg)+gcJ5RQ1x?Fe}|LeSfJgWhi G~G:vdO 85.,TcAʧF?PMg#clce:JNӑǮqɮ ]NFxfpʮq_S_VOf4 tipG|{UrBE=JN 3]pgg(I_PGLz3psdwi[ 7#t<0I ןz+'4'}{PyZPrrzs?Ɠi1{H%8p8{Wޟ^".KSq׵{H it6"lߔ29R]y4(s|W-(g1Dҕ}?UqUn*OANBdBG yWV (iޡ|Vo:qY3jZˆ*Iqq@#18?՘.fdD1ӊ՚)`wb;E@9GY.aV,yAy77S5i”k6oFR]Ji#@>;9Aea I־ \]8N;}j!d${Juf =tfRٞKLezV>aK)ҜQ%S@'qNFV&5y|I ~XG,fS.n gr~ۓ#9SR:dʬ)zx[@1cW/ɪIrQKYSܘ$,kH),-Xt'2;lӎ)?)J9=ljissL' c>ԧo|\JvL]5ҚOnaژ& nh^G=:Sssӭ+48E!g4R )3.zt[AJ&3!!/̱Q;$|#~*} Y]3q_a4`CG'=ÖW<¹oyQ!=EiBvg:8=Z%%h^?bsϭmiZPY FO'=+m[l6vD\$EtT3&4iEl1 :QwLmE$QC'5b 1=K곡G9ݐH\Oeq֭ t3vU<7+sJӍ1EHϩ&Ŕdκo \ɧ'$DևM7qc4'^yt3[=IZPjb#34a__κөpRs8sV.o1Rut$Uf dzU.5F4%+}R!rD@N?PB G?\XyT#+6;kEko4JT⧚] }vHuZ^8` }OtR_c}n1"ziw-uήi9tHcx<NKI{zo\d}k̡=xfysw|2g0"<:9׼=&e+yAFssܪ4t`I<jdpF2ITSb8ٴY)VѸ=jݟyDqJmt2I$/qۿJ=̀d[SQeG.Tzjm9v'$gs]c;I' В ae>k]"/)=YDM"Rjalדl͏ު\J3qں/ٵuBiM-zmF6g栾3s'k iFoNU+(;yֺ(+A6qח5NN裸Y c"x{ZLѳ)Sw+.l*q1VqR8+9ivoDR7$nmv3_қLjb3[JȮa\rI5]xVuY ́W՝7䭇2Fmwhȗ)8C2Oq a-d򂳿n2OIOjp=P3סG1=͈(Ս6;dSe$ސ1![{&`*䭼ݖغ=U(h:JEռggo'$=:랸<@j>dsXڒwJI9Ic[ieI|lWHRE>\łe8FEefR;q,+H8u<}eyAֻk;fʻsֲ. 83>B}s|-l1\U+pGlQh^GobRgNWtEW?Qy1$0+78 }k~^eB\Sn "++9*Cm1svq5Hkl>ˌg]Yfsw^e^L`c'Z6[FH8? ȤIB+r2G[c䍑ޭk4YV?lxĖڂEogf Ae)8\mb gcwurŽÚt@@OM{ͥ(v2O^k-$ԧl`:?;le1#u=1^Cqpgʑ׷( vL75I%ыUigU E*y5DxQb.@5BYS {m8xɹIjt~*t[-<>+:/ۥ1#m P+ͧf=H5r9yV>8tIeKYB$pNQ Xqsh,)ݪh̫p@8 ogYLN9*7 M.Ta* uKW>FG4RK{Ebx69莅.ٙ?0 u-z\=}]+R\K,ԟE DUc A<1M:E| :1Cd;s_`ZV~#`у*A<5ˆ̀&G7S~-I9f5jR.q$3{J}s'k+I7"5F* i>^Tb|ImJdDRH?eK: g=?QYo.BJkW.m̩sJŘ]~v 2/&/G+g&[M~WiE#СkX;G>3_򧍃/գEImSQZѐVQ1kEѓܱd6;$dd-L..OG+=ʈ ;96rNX ht)&r䎚|^ 9:SLwr1ޑ6#'*r4DAN{{dW])<9g[ŧb2:u'{I,ir7T85se/"[q%2}?oAB@fּ֙%5| t\Ҵ=5gvDu*Wfo3z4tpF{+Yu`c9 MϸJpbyi%?*ޖB7{qө7(w],II<o(jgH鍀gq|1QO83{[ƌu+Ng{xH[bG#--M5F ёDg>saۃg|Ke72Us,/t˭ׄ/$3V|Ag,VVѣ+gA²)ib?&x=ic'zB .'r܈%GkZ@ b*m#-fBTB Bm.7=/sB$WCn`W?ݵְb#TrRӐ׃ҷQ2z~VcAli jI8=;)",;֤ݑ׮Nz~j_ X_J5btT6۴S 7UNߞxt7}+$Tu,8]<2h% usn?îkrT36ӁӃB1c! a#~#N+fkpzrNs֓i13gǧ$gR=党Q%W1^ $`\Vbȧ$MLw =?`kS dC":aZh$"PF9{W-ZP@WgyXtI*˂G~zlJlQ-`4G#՞N-iyR, 0jg.@ʎ{q\KHV#nc'p3UFlzYNwÁJ7AZI kcMy9Q*LF+V.8_gcbI[EJ*JD{HpѰ?Ep&>5\j?cm 9g1yPNq?[PR_O]ZK)e?kw˞sޱ×; ^z걌1ll2֒Bu$w0z]5ʘ ǧ4jlO-֦uIB~W Na:<$ƣjg=q[g 1ӚPJey1nT90\,WW(?墍 œt>0.ʞPm}G}m=1P1_&iSΒ.\bGy ʩIu>^Y4rpx!Py׊ g*Ob=[MMI),@۹jtӼIhS:E(Ť# ?[>TC #kt[Nɂ =C3M-vRB1tu%3:?zf ʹZyݐjѶZLc%UO B҇|$r}V,9ȮZesԏ947 8zSOtM.WYO#5zBNHkJZqYgVJc\6n7bP9׳iC"4=m0躬\:V=sx6&2<^J64$w69d;c>.6D#MY^Yc%QkW>ƞG=啷 Y${7+]wbhT6˷Tك@j=58⢸[C(HΨcpdT+w=~QޤJ6jI7p̀F\p>'Ԯnod}ϟIJ鬤..I O5jRIj&v #j҃|͞~:70 qM'M#ލstpW;ݍ`GZO*+Cr6{nP3Y>hVsiQ$!AuX9V840R}EL)2rv |m)&GA㿡~c:~=ƥMzc#U(v&uG퓃¯XؼNTm W";Ot1`s5$6N*A'8Vj`J9#or[ >GJ+2:`VZ{7t<kI 9xn 1x>?2Ίɣiʰ~TUc<5ዻˏ.Љ{ ?u蚝ZVXa'NJ`K;f3nֹ gúq泅?ǥqU' cR8jV:#hPI$9>7jPyӌrU'Wnyֻ m4g7 tҹiRg <<9M"BxⷉunsMxESUC*5P+?6y`rXSήK0ʫQOGn,QpxZ ni#bmϵtsx:6\ ]MTIro|ʎ;*cЧ)sHD:hf ~$+o陗`'q^ƪM>e3yX'#p?Np,M8h:֭Wy~G+{lvȔP?I*iWsJ}B̏)C3oi>@?^Q])+3U0j)4hnh=ַt^\3īۀGn[觅Qq|GN^,sA{  ol8|V̨z!Gi,ͱBS᳼jm)<_]ojY#03Y6&) `pG+X?, 33&%')\0<`#ԘF?:̎s[w *d:MRHܠ 0.Y+Pe}*-&%lzuzp==^ nhvc֭/tX$HF!Z5Fyy1(5)AAb5Ot 2Gh`U}]>͇a@$#'5o. DXWpP|<;TmsqFF04=VELĴmsw*c!dclZI,MOӽQgkibpvu9Fvj rQ .$pITiڨ Oв?lB.\qw*U(v[fX@n9d1_a|>ݑl-cWdkϝJD/;' < uoB𽏄4/h΢*<[v[.θRk:vl2Gl9?rUyQUє&[j$/98}c7WW147N?z~֡Jۈ]|-4Osr5.(sݞwxXlv#s]$^IkЭX՛sP7TUBs\3Ц4ߍyǽPieABp[ _߮&Uw_ xO q|Y g)MjwO qoS6C5׭$arU? 4M{$NO^+Ծ"sjwi$HF¹GK-3FkzT',F?kk%vU6;O建/*vVyXHEڶ1QP<' di܉Bg$HGֵ4 ̱iֽ[H𦟦ys4kԒn,6kxh,pBvq+ l4bFzF4pz:<FF*F\E`*FqZe}`9] 6JGRm#+$Oܱ`uuBH霒95HxPTA|;ʃOA?x6O3O*)*]Kkr0`lֵg*xsG z{ƥFsv%9l}N 552܁WX ֳveLU  j A;+EO>t#s6)"~@RDNNpL[K}0z}i:$c~G~ \.ßȤ2$FOp֊Heq,OEϭ|9y3\Eό-BN=Q+s?Oֽab57!pixv7\1D#qȨ"կ g3k =!XcIl B?X:7t۟ޞ;5!q9OJ- Uk_5Ս 7*v`Ὄ2s+6wbUžzbZXī$[O}9a\jsA(ANOuuXı 9f`>}3GWG1:uZbG%<A>|K?X*t4eojrMgYMdUPöB(ϸIadGh/=T`Wrwy8+.\st1t_kW_Λ.Q;μTG0 G=2+8YQ^CV0j,~!u=k^/95hn`>SҼrMRv>eycp77g}NoiޛiVCVCāC)5I\ nnGj9t5Y" A=A-0?S ;_YFeRqkR? 0j4*wg5'PuNErv([M=ɶ, xu0Яm@e\4gu8+ i v?U} J+:S-3vҕs֌p}M,BF{'7)qԾy VldÍ#Xe_nFq{Cnd)2qֹ5V_OQ\ۚa"aלb9$2dӊ b@n9C\cbm#91C00sZKǍ8֭ c ?3ڢ-gc2ZLc9G`dSnI+x"%0 ֌36c&٥RxXuh,˵`}C:ynncrC2{֣C#6H qeQHҽSgÒa-tT`:=WFimym~g/(qml|\`u9:6Pu3?NՄ7ƷYt3fT>[0s=jޣvʱ8(FvA)+`*)Goƺv՜qMS Y"Qy%8b09hPG;(q-#u+F=}+RY^r>P6E (F>(^\"(qoOX]GQZ:V F:#ڵ![;'xȠ*"Iū>`;rAV Y])?үjcN3})+GnjQiڋ;98է}ֱ=@ڶsFzkDdV :gn[:ظɘ@l_\,|qR0zcҰ%Ø_~ 2i%N3Q]7ʬ[4AsUo- ‘j퉵[͎AHF.H5.D1Ryi(VkĒ"9tb7U"*eC3ҸB]U=h[Iks1z?ֳs6JGa̗A}+Rz] כ4Aq 'T/FZp8#x՗ bpJWAq>NkkRC>1[iN!?(kBj#׭[kM Q\]O9ȕ,'qWjI\,)DS)p ) `m`d++p0N}=j3IjIRW9mI[ 8ݎ{Է~sJtL$HGu+spN;fKRj++3+U2$*;*G>_Gw@$u ҩѤ92qQXcUU@`(XHn"\m'o֪\ڔe8*xbYo!;ZKqܱV\ J8kN:ݭM芆wwz{KnV8+vͶrRN΢T=X 2uU-+U7v}J[r;g~ P-'>f-o*%dF4n-|YYAV>JuOo\o% 19$zz žSbP[KSrN#.dy -[ c=kkJcr zcy!\k lB#c [:\:q՛&g:b[^$6H\9V1e1Umzʣ˰c'+ɪ/U9 kb9@+q:eͼJd#֥Mo`Í?kQw>Xr4?iB#Pb[V]>oYq(b?A֍ȓ z?)<`*qpg_KUr_fEu7 K!?+z+׭o:|I=q֪{V2gcG Jkg)$F;נjG'p9'>$ ԭzظdU '=5DsJkgHU3Ӂ_c^̈2kDM5I/~U};V78GAg5 R#2{-C #,$Cs3[nde䍹ONk2<%9p~Xb 0J&1ty3"W_?- O? khq4Y|\澹2>tp?zV<'d T-XO##^g}H-[rOCʾ6kC&bC'ݭd[<3&P:J贖1 RI!hEGͼ@[ @P+=@ȧ̔U>s`G<Tp;zqh3oӃ+Tc1y>5BﴌcK^ťA\ L< KpOSF_EF,ʱ '#<c.68IdFLݿ+J775޼_n p1]tѣUB9vj] N*芯Bkڜ6ڮvVOl X42Ke;s­Ϭ+N9Ihh:xD[iMqqp37ϙerHX71 dpOzMZ&/$!o^o{q CW,WϼV' n麄Ъ#gu2v{MFJS1a7a=)iT[q#o GzH[sgrO~d <;>ZSiN'>&^)7761PǦƲOw%p+l#{VR.DwarkG{0"wC':U=jy=3ht^ wHs-3yB9Z觖BOc%srB=2+7UevC]ύ<3|oEpU 'PTމjI\D 2q[, }z\Kn;O@OJc ;22@k+'t{}%9rdvh9ΙUzW]=,KnSշAjw[R\zi6^e/!1ZWH:e a}ԼA}}/2+`S#p '$V8)S՚ZW:m 9 *)f <,\WdeTLr$Sj.^xUOL62cC=cs+ۇzm pk*TH4nD3סԓi+"oh&a???OXUvH:dKzSj)Va/ʣhIqaTIGwc/ OB~N-}XzvPyǸjʅ*=֝W\Q 9}ؠ3"c\w0 C/ +vyd+ -R4 l1_]x,cE|mo\E;I/lerq\6gs},6F0Ÿ$(nvX7+d皩-ܹRt{Ԥ΢[1UC0<mm^NF2+eZ*xIKc oVʐ*+.Cq9%hʖֶ[@9lta%FZns5ҘݽFAZR*:qPV vo6$7<7v 0GgUt1ZƵHg(dz*4̑qe}XjC{$10uVKLF>oE2UTo,;(Vgfotocx/images/mashup5.png0000664000175000017500000006162315247006660014375 0ustar micomicoPNG  IHDRētEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 193 293 1 0 eH.`peXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:293 height:193|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.3: Paint Transp|fotocx-26.3: Copy in Image|fotocx-26.6: Rescale: width:264 height:174| U IDATx}etU~ﵹ3{+$$HB= www'ĉ 3sﳾ}r@B}gZ{wꪧ{W.TTTOqASSlll" dx`Dy  oQxy@uuuW) x;EEE(,,~KJJMlV?keG@v彲2 xh7~Op"''YYYDFF=cB@cY;~q`b7fѶ<@(S^&P LBXY=>VeϘ~GX?7JL[`vHrL8D [|NPυZ (̀]1; Am ̴@ :%n~~~T역_* Pv߬_JLX>l$ĵDDVz",ƨozRđKP\wqQhYt堤Lp( ;w|c_\wAQ3qG`xtj^T *:WXXGwL$|=cwwwGrr{+  * ,ƨ+ANy]Afu3iHK `yul掚ǾnKc (io#EIpuvw9:/iY9li1p+sʤ% nE~x\qV:+Ju FN*1Үq"컸_c񡐲COOFFF]rrrعsG0#V}C@m+++s ]f  qP iNX?A҃h5DMVL12T5bSRDXa k_#nU JBs v\Fqz h(@QNǿ#`gwC_CҒPU41qbܴvFVB% qfZhANF r2$) =#S߲3CY^I,6EB~Nzcѳۏѽ;z )Y%<"i (++Xm9Je0;XAvA) +q@u)BpN\{̂ aB˄3慨}q'  <==?]vfqkC=&!+ww||eEB`P(iWAK] #mAbEJP] wPKfPgػ'Xk׭ci;R۠K&ux̙6EI 4ա5l,f[MVš 1FGr*lE|]A0u#!Ng%ёOi!̉Sbݺu>}:gDEEDA6 mclؼc 1vҲvu0b6D>DfUjf)K=>d;&5┝GWvI;̞D[i II9LpA)﫯p\`~VA@j9 1x( /nd:A #'Fb䰡PWS5O۝SOX()uACKFƣ1rHBGGRҲ0 Y7n3D5c QpB  TQQɓ'CTW|aW|܇g@x@EI o0nm];쀌R_eE?#G@Mo".x$`Rgl$& 7 h~Ţ}mS@K\B\AL ! _cC@-Ĝ$(KēhF*tn1jtq4IB^I+\GJQbaQ [1^GLWᲃ?b,Ҡ] &,b/PP;"l1b$A $_MD={uR2SC!b.?tuu[L0eHHGe DDE! ɹN1[T5FOj Y]GAV@K%"3OAGYj<w?x>9uӇAQ'm= as d {+@hjwg8bP^+mkGsۜ#n[,-ˉP qj<J{`i~ ,$f' x1DKzc#X7׈ddoJ 'hCvE^ob2|f튐ܼtV#0cѝ9(pfwDH3A ` ؎+%%#!e)@L4NKHMM}  ~YmQ^^'`"MvNsP$`.mA[r$*l;|c8M{y 1?nšp_܊#!!}$p a>VRpJ+`V"-=ޗ,I NR')i )ϿnV@PC&/WdJS Ԥ0b'^ Qm[!C;1}J+PWG@2"qMaO`:Jzp3 U[)MĩI[ rCИJx *mڃPh?0l=L{OUDJfX<@t1@CF!>Xc9G9mA4 ryY1|\ckC"lBR;~ZS&Ƴf ,O ܁Y*Ctimq .iQxƾ%(d̴^=F"Ntҡ6cܘ7 itbF`iI rtcC4X9Egc)۬90mllu /~JBdL PR8fdEu=xע4޻ +`i02Sv7*#`bޖ0|>/R.{ϵ˞[_R`d}xA]6_Z]mE:#1sJ8& B_itL %0y?|Nc 3Xڣq߃wzY=mm{ Vo!6f1WӇa<@tD=c6ЫN1c9B}]0H?l,CoX8ޑ>1gOPcʄ~aZhؘ&֎蘅f+8yDzdǏȑ5?6h gqY9}t:ٺ kC •^S?%$B޿Y}^V?keOWhXb@~}=c &%8 `d> Lp/{KgmnWh 6emwv<@;5EԖ<<@&sV:_G xhxMW寳*gOC<0`/)1I,-bcoqȓۭp%5hjÍCXq:V^~Z,߽ QIa)8'x-;ۀWױ|bxduq_K᝚͍(.6 ^HƆ:=DlQi}O&GIL4s{6ͻȩPj[y@$9cH%Hjn>3Mg0Xʀ>4 6 Uaၓ)qd(óvӕЀ [oQ!Ya07RH5)/EוNE(Z0iQ~X:e8V<̚46b,mi#iF d}#u5p+993 0Hmm}c} R|y0^y),/CNf"5m ./޶kb=`,_}Z 5Qؑ*6 *Fj)ӕpR Hs2ŴۑTUS^&%l[,ΡǢF-dDzaX X;7-4ijáf8!50#XqNYAJ`+PH!S2)+H ;a \_iEVaՐ}O ?> -HܴqAu`uxJ0#IiAR1czVԼr6W-,EeA[Y3#M:v*0i{ :j_+ַQ ύ%< }c$pb-\2{*2lO*%4{D}au۫#ah;O0n.ſF9j@Lզa2kݺ{WBCazHi"MXJrb}T'Kޓ8{$zS(!0&ztx)~v7&FB'@i <k1Oh7ðia\>{FC!o >D8\x`m0ܿzÈ&.݄Li-$DIp]9 #|e/-)N]뗎bMH/=[ѱNnB)%ܱsE#6,ѻ_HS"^:mUxꋷo_p*iZLR1DiU+Dll< (g(31ί{%gѽhFm~TQaW?dPXTм1Xa?o9.;BAG!yn ðrWGOppRH V(jP!?_6g֛Q*Ac8l9r\1C K Fcոu6,Hi {aՑ[`QRޫ`" {N}l@^J5A*cn <þ !I6ao1d ܤDxti 3Q^@G*箠kգ!J~ @פPq .(Q:N~"~_7o^&RJ;c-Y~6TXv/QhA(tR&٤ G V~27 E InAl! z\Byye1b+2W"\lL>UKn7Oo s|o-MxzBCWnؽ c;afH 7@_OldFm$]rXQ3Fia%dŕD𴹊|'(F0\c`u<bpzdO_mU٣.91X5y>t _vg 4ӲAOAGFdDiaj 8B>L MI-oWp->]<\xGPw-"o,.6+%WG} āW5XtYUMğQU-ɾ0/D8pצ*S`" * Ğ[P&pt10*)v.xOj8ϿM i"7lPbB %!ŌM0Ώb!􆏂1j4Z.3"@@PU X؂N?F 3M6|"l0m*6{AeD')$pL$`p,+7#^vޏ~O'ӆ~ ϸ˖_zcM1 "}`*l;ڱ(zܻtRh]>s4(;(cM%aU{'Ymrdb HfBX۵aK!ctf+LłwA})!|&؇7N_r)T"- U0V‹uފcd IDAT`;ww"[܀`Hء[?+r1L7 Lg"6g/Gm &: \jX'NvPt SU/(O,p,(*-¢s/Oj`%3GAwrd##6 hc&e'b<O#c bXQ#8J M83ghT~;O)3t`neFt^s1 bt<}fC>b"K!b( 'kJnJ @/ 4iPW!5#`} 8vy/R:= "/^ӟ)3$tC茟 אXP8A=-L"1%^' 5c_VinlĉfGXQ8Lg9nqx N0&<^43a#Riёћ(vLl pP8 bZ.ELY:V HVŒ,mcexG7޽{yWۿE>A0/L!'u *4=K#Ddb+ 0@\9#Z]#/Hkս8Gߚ`/;Y0=uVw I2@B˷텝;`#9kdq:]6Ыgw<>NkI]?-", Ys{yX=]Sa!1'% d4tS 5") PYhkWن:#meA.O[?К!Z@!4f0tDpD7_/ܹq @ mS!P){o8IΫQR'},# ȹcq?= =sX%I>X2z+* wg(F~/C]e6_ơ'ȱj$GZ+PEJc;i$ǚ[ y 8| i1(M 2FT`88=:djc)#I`AӾ-:(5Vh{Jp늙"S >KΜR: {- GRcz0c BI[L=ඥ4Mhd&ɒBv ?|Ox SUu hhC9O--d %\ S])L^0`~>zOAW;rLs9 |RܖFۻ8췚YY9hcϮ3LZsY֗%PWV*445mxG:<0u6-ъ,FnK~ 69k oFkIݾ{aT]5hj`]{T6)dj=3IΑ\F"֧8lY62ֆp#<cd>E;\~.!)G-Κͭ7ͭ2o$}Otby(֖ WZv* Г 1fȠ1"F@,%iK~BH!X[NA_[ ZC1d͘dm<e䡺4 'ݣz х9kLm?4֖# cS:f/ـ$"|hPVW_rvM@V"%> qIjc"Kմe̔XDEGy; 1H!FżxDFE}P3N`j#ɨh?&15LnuY^Jvk{A֣07ёYTrNP"fyA"BIleF[mpe&إhmO@4B8 qHNxORA!+WV kMl*ц=ENJJReY{a<8 a8E"H+K %KwxXh>*+[mcXR~\Zn^B-I-j9Ѐj7Vzj]yIڢAUi@Zn~f_=7/Qa\}lNI*ou{.K-_d1aBrZx7""iY"~ijSYQ>b‘]PвU̎G/'ImUҒ6\#""E`7DNuy1H+Z\B2c+8x̲¼LDEaArj{gYh#'[4ӇO,X@=d:r($zTDc"|1&/`05M[`{ G>Og`ڪD?;mNJHJc܌pow0V~ _4x/4_Wh%{o~Hy xh9+쟝F<@mo(-xz u q XqHIJ+ڤA1sB9n"H;@jE6-TWqĀ@8FV!ʲY9-uؘcb@x购B͢I @ eQKlb"Â;MSaxm@0!qszN7ZY&o1d̤ q%M٣N3#j(=^GA K;N43T}>PX?~ipq'M=[ i ;kr eSp!Tt [Kcj)jQVKR#EK[ wLS0v:V ƛ. jP̯ԈФLښj{aeMb/0}"݌XJEx|TLfrþOǢC_ٷme-}} puGzb֔$Ooi=( TP5\~} ǸN%h>v#V B Q u6ItnwCt12˝  ~&[9~ewdwKȦe++%Qӳ6R !HWE^'VSٔg!QD:Z_~f eKh+_^AoLW  c;)9j&(@d'Ga,7 ~^]5塐ۃ2NOFQ}ޑp{z{taJͽP6}%D0 ;ZMSLF>`n'J#XtxMg> >֗1LY)MY~SCW^:^ D%Cl;Ν:7?w\pđ+(߄zRe#|qI:xܤbX$Y;LWpWø~R(/!O63Ve{I_A}egq!'N %"5gbBqi:p'`Obh'9Lԓ`Uml8x#'wxO:`QF~ ֟h,Q#qWGBoOJ'sxh#1^z )y4EnZ,ܽ#DcN62Ngɽ8Jg8}"Pi햣o:+,J&W2cΠ Mv$Uq@T m[ 耔ȫnUw(OlTrl,܀CG|Xuk'T7f"f̷UX0{*r՜6- ̌1X^gƔ&PЀ]LL鋰O  ʔMk: +ZaƵg4 6 |!0BicѪuXâgPD,2"Pp_t@9 ?'5J jSuD @?$t!O.\]Է!EY;r*,̌ݫBFVSZsEazn =-rJ025y3*fsaC!}[2=`3Bc:fl9bQh+/yCYЕ Up~n%x͂%4wJ s21qy{(O]jJ_ S U`y2)E ܾ} QJ"pv Ճrw58vzӔ;Yq8u)T)93j38iYjrb&F"0$ٴ%YTbChנ:;;##7s q@FYa:.1sUYE٫jBNDy}NJ%E: #I-@@'3VƐ+;%5 [CN{XƯZ ]Y,y &1>N2 *(t#9h:Gg!+"~8UeE"᪋ x4O}L:ShX@HR"'<İENJw]PHJE6y1AY@L0iVDskLn,(`j|R$ȡ4HGC&S5 3Z4T_ՙ8R`beP6caZiq8k&M#c#g}zbD h哓_E)QJvmMZ %g=h8 UNnCT]9`I4@T? TxG&nX./ yM8g@4M(QC}'<+Ʃěڹj'A6T\aMZG4>gc(U 3_v(6q5 TOa&CĈ _oC831@9՝ n_]@>'@Z].Lcȩ UJpM>$յ w@v`܌N$fb+] *pj"&,ߊj PtKPW5]D QO9'+^AEl51TQ2YY1u9 o}^! >vb0wմf9)]]_周%9x| 1`eoldWAڊgb Qnmy~t8%iìQ*Xp.iEb 1hCu!eރ%U:@qi;D?܈G utUfE⌕)&,#ȯF}e&@JJhUOCmDN]5DaGA㻷\9V_V=,icᑛHcDs;fX38 By}MCIA<@=گ~qԞ*JV#CLic 4WN,7.k ;PCfOWdd*ʌ1O+v hڭwAn0lRT1})X~2*K+ RP_GVcpPCY"::Z>Bc3 * pu$Nʖ6mzvz>w>۷7w!,D2pbhQQ~y ͟du3^ !H%{% ñy$ _dluK~lh}z(lqdŵ(&UdbDqx#BsH.3qថBjP] 27,EVM=~ySMc)սgjZx\=ʲ { ܎"5Ѣm9JےB$yjZr.J蛏 :Ӑq jJJ^^M_esx0gm ̃)Cr-WImG;'O2ԙl;@L >@cs߫kEx F |a6LKGt d`XB`w4e/LUHu *. s مDly=o)L\:$lC[0LW]PH}2Ya5?W&Nhb{:Qa'o3_X\mE65VU8}6ygBO[*z rIPkk*&HtAX;}(wDiIDATG{lJ(bın]:qݣfl؎8:(`kS:^3k1&kCJ {4!bٲe;ow^/`1:t8vLG_n!;p{zj0uv܁]C]M&sWsiޫ a}qdXGv1;Q.U"! ANIv0w\5C1n"Gq!6-y[w!6AҸA^jve>Aj@/%1+f@j_MWP[ cq9.]>zÅ dp 4[n"!Z "n<$ ?Ip /U o7o>ZIhb`@=]e^afnELx}&+hkm>XM%8y.2crB'`X@,,-I%A܆o.9.;ޙ;wn˵xJ<3L[imOv](_ݾ-2݅ض3_|2FɈÉ[aanȵ; EhY060:ZR`pv8ҤiCۭp#:XB#ߧg|:E$hK@ӇwQr^m;!+妄ѽXhiuM n_8Օ8&,_iY=)ǽ i *#vWcFxܬ}W@иrh :Ss[pudxyMhO`60;Hg!Ox쌽>[՘-v4HewMMMܠY]M(v665r[(o,±p㠱4 Hc{DhnhcrR޺+‘NЋS06Vd+kin޼&߅V>n4FF;"c4{$ㇴhU/R槙O#=kh^Xy (p9m፯o@0eusY]9;@-/ea.*ZW!+ÞXݭupY=O eY[.6v䙵˴ ?'Z+ O|<>wvYؽ_=}82J)(E1ya\8Ҕ~v#""`ؔkp[>ka9aN®`F3$ȟڥso~\Ү'_G$* y^,Hzҁ]BffA{Y@_qs栭,(iنD5x~Ϝ_yhxM+_K xhxMW?j5 xyMg6kH|, xyMg6_Xט/ x6y9d"u ~g>C^,oX;N郻1,uSgJq!@8>|x~{A x xw]x1A&Ɵs5otW ;QA?oqJ,=JZP2 ODIu]o${c8KT^W{^T{7 M);9 ή/meUf {2WY^W'1V#*4,l=ga=WԲwGDEP(ȥ Rޮ |@!m^yℵY8T!-eOqo *| l^w0Bk0O) QZ(O4`6u&@K[ FZA)'@Y'FO7Ř)S0ut,]~7R2*0{[`d+QRS"ȢPBUQ&1axhid\bzܿ cgt<-:#hLy9ui1c1uTb(CG˫=z&ME9?g@OG-gHOm DY ;0e Lvi bD?ܖbS닞Z{7 LbÜ.3 7Eyc-n6'WB͛(ɌGpEzVe ޜ==5e%9 37Y -;fBBc$r@vQ) 2cqf\+/BQ?1uQ**IxAIowo_FHxNQKxGib"+D 9yiDȦXh &΃{h<O.Dm*:\<JyJ:MO5h͇W]P3WޙGEuy|fΜ9q杗g E(* (DD P ` .bą>ŘhbE"QA馻i6L݆g :޺V}կmnB} ]3܎C3 F̍}'6oބ͛a)'70J0j.աI,bRCBA2@<f:ӑggD=>}I{x 4ߞN̽;H]0ȯ׀3(pG0{˰\ =g%p[fKu(ffsb&Zb>=xBC} \C <$4p;mll{3v=J2;!8)T %Nmq-L uchy ԏ~(D.{~5@jj(ǹo1r?ރYZkK>}?3~k8n Z!ƁQuMs;M^miK6L E&L>;bT >57ҩݘ"wgC;rCzHJ慘lW:Th|*=Vc4ApJ&8[t 1jyعt: "oi=n_8Yt}H+9 (IaN; p!C0e%K+dɹߟƨiQә=4N08m!EЏ0Mcv__13b!FSk{;ow߈1j#1Q [V$3Lfbw~k߷$}x]lXsn&ic>\wGo,2p=_{/Ǔ&ܜ1lp1q#U~]M6o~a?w*,]#}k}weCgl"w'&1w,m㲷F6¦ShlrKSZF47 wl\&i}J@A @@"x^`4{xXMf} N/Ƀn0m ===Y,Xji=Gw}b9N] h!'ˍOq3 X٬DxZG6m<|f0`7poH¼1yd? ԫs<K#]}̘ەe6,X~z9ן7_{aZ\Y%|}V[K`oЁ>w?p#^'{Z ZFK?ƟOr& {Cg6|I>|ؼ$ =z=e @ ;X^ZV[q~%*[wŽ[+_i? _u ǏBE%+q6a Ml,^ŋӒ%6XҔ  ZuA Fc&l7mCPR@J8ƅ< &ٿ> T] [@YOk kUhR$]_rU#j걯 u~ ץ_>OxNeVxOesn gZIk9NgvGEoDGyDg 83ڊA^4TRq {A @jAP*]]C ҀR  HJ1zH$APC8ww J$''Q: P+:v@p4R: ޑ ;iK%i4iA1AjAP*"ȋ @  @8< i@$ <1@4P[ zYABy1@A͹k#$( ---*HOPބ F+EWS!"BoB,*Vr4b>{T[( w>H+n_S {g:Vx}dlT/;ޠΥ sfCK[VKmat!jibLl?t|H -mfq bqUغvnDDyc44 ɐ~T'LЀM^f:bC9FcCe35y8~>,7G#1j\WAm(ARUʖy^}X΃!Vk-1A~EcE.&Nrh ˕(e/.Lɭai3Z]A_ V.W6, RmcQ8@pk!h  c9$bȓTR 0fbEX-koP#jAr_Ԙ^ȅT*Ai?寘o]"uIBx5HI(@T.Qj0 Fw9O^<6(Ͽa}vΨ䌜$::1QpX Qb/굎3_QV#P8+<{hDQS1a0Elh= xx6FV8|y9kⸯ?*k;ʠ;qD^$Ze2* :)3J_ F 5'<ˍ_$@EF86:̃I8qT$X\"VRR/JPl=%@Zo ]cs;v5WqfMûzsp->,36üw#.yxuvs0JC ϞGQE%uK;CVR(8sϽ#yٲ9':JD߼kAKk2B[{*&LBpYK͑0HR°JMߢywE*Ez]9 jKዄ|#:BoBh-D܉^D,˯(Ajb QRVֶg%;7)%U5ղ9 104 Dn6DI .(?m%lSZ!m,+?=Mѫw0x11.yٙkyiI( Zw(1z΍G$O=]]YΖZ_Jz\\Ğƣ|APAAwC *_G2%ލE ZA *G/n\1aHKMƒ?RTRvH d5;kA @ pp*o\ @`B ڕ<AאB_}&@ qtm4zW&ߢaJ!qz'?y!@ ȃ (ġT^cڝA @jAP* okIENDB`fotocx/images/maps.png0000664000175000017500000002055115247006660013746 0ustar micomicoPNG  IHDR>aIDATx ]E_Nٺuv  [(0*3̠NDQGP0tΞw;էϽ޷tUN-ֹU.ݻsi=]ko7}\#>nUөz~:Z}ܮ];s;wmۺ5kܞ=:Z0`@nȐCs L߿nA9"}:z۶y޵K; #hl+ٝ,Lap%aQX[Rۄ(o2jzD`n߼9ij c  x0'B*bJG ǭm}knƶJ: g/I w O EapnZA0[&. j~VBo^^ ?b `qrkzׯ_W  -B-QsV!A 6ƷLc `C\k+~UYtrJxPRp\E>Ë{e7b# +|nSΝ;r˗-m޼ s[ٕ$-0oYG _JW ePeRG[aVO'dБ%{Ę-:8uma".쉘qŒ^|ْMsVzCb~(+<ap#!2UiCHF!\020,j#!XE@B5Ò@t,WGfx MBHT ynNT(T0uafKwJ!4P_'ƭT1`NZbyҮhO8i3Żx8fцO;~J(|^`h#X?ȓ1%%_J Ʋ,^B4Uw%$ Y8fɀl˄IZ 6nH|:mPJS<'P(O/ a\~{*ЯI/L&Q 6$`rnBַp1Xiwpp0V G,E (0bMGa{f _P_x O<Օl˖.NzTlS$oa+G}6Ik!P"eH_&0JqZ[Ǚ KUzB" aBXs2̩H$xO & q1LIC T@[%2uz7Ls_}^ia!V@J:Wr1Tq 'B4TS bhƧh-VbKBDW+pY pU'uxHгIL#K?yO~.%b(yF$G 0 &!$HG0lJ_o?𒢴AHw*rV(nnkjE,ݾ%KvDnU Nn")Z# d*̰_id.0T+t0=(c'`Xi>J8|M&M%]Xru#mwv>¼zA*HЉFx3zdu \PL"ESJe ?(S#o7^hByvBuw :X@H `-a00RDv:Z-ު"ZN+:g9`LEA{һmEw >^^:yk\%G< J̄'KΔsPH 2REdM^81YW/vӈӫ[ zwzjCfE\|Z#x4m[r o"5Cg8[^F?®ӍHlYcwG@t :ĩ i焢,:eCP7*HOlk̽-ǗBS =+WoM;5Rsd8LGѷXd4V'tFRn' eqQ6H7ᄗ<&UpXIxXj a|h.r0x#_K6 ݭa|^|#Sc˧ fBAc2>ݑ{ xݪ1C'stՔO%Y?F BQ.) +Ly&p;gkP۷2h{*ϵ>E?~qˋ9lyS/ k#z{Zs~qĴ5mX(i _m|THp\J=O9?cCk8 0aJ8ĉ.:~#İjuϢwMKSJ0إ$%/-aWfuϢRGnb5: 1dļ-&{76SJHH [ݬYι76lo׽=Z[nSSof.i*t/ wM1g/@>C,؇Iڛ2R򔛅sYI]&=Hb@MT3kSOl?bSFy۟T3۟ |RlhfP|Ϫ3;o隣>@g_5u瀛!+ ^ IQļD<AVe QԲJ?CW~Qe#Zj|5 ۵ۻ4kbvw'K7{zku^m{\؛솼 T;PniGQ1r}muMH&R 'K@Q;a4'enXݳsorGQpd;N_k%<-${V,"Gyc#9H08vRߋ"ĉNpxttOKg,~I'lE'9=(15V~<\#V7QtVUʼPđϋF2Guc\f᥉zɫdOOb_;BXk4/53;,a!]BBWtBdcyHeT0|6@ Yu9aےOakx[AttR*i(c%ۻZĻ,Mp<3 5IE.w:׉e$ao&GgV0͛ݧ.W Äg ?)D%;QVBAt+0̎+YrXGŀ1xv^xmS76`+ =: O i A3]<7\L+cOi¼Rc_G(n?œ‹ta3!yAx2*,0t %'õuv>\vl9F\hA W ?CH;)!Kk; 0^cp ;WN$< z:;R.V!fZgZ$3_ ]|[ $2\]Z#pCB%oS[-/g{\ #7~?#Fr-e@+V,M8=94A&(2ay8[kpe 8q앓ǒQ)!$| cY*Nh.`8-a0E O%i3$1$ӄ{#/ QZcI]_Z|IDV q:!(p@*PF i"[*aӅy¹B*Q\~QzcI@qt\"_LӀ@+Oƒp!$ԐQF67  K`$:F,2au--fIE%^"+ ;a|P.F 8K VU3 kU:‰rdJ?S=~ZJq'/- @`Nf1 g !Y:_CWx-F6K]"laїwǟv+,e{2d]VX3?^CֵtPP´6_ NGB?'3G[QPPcײ?VXuNZZףHpµtM:Zf[xi,* nW6;2thRW"C%1M_Vx]'ȉJc{,Jl'vt#sKx~^Qee55Y_-*i~`$I?W>+AًqB,]):xt :mNX4u)eU؂,ͻxa&1Zb+QdpP Sm-)${aY<"mvLL1j3ʀFޡ7ǖKL{p1zhm )͜ #K\lg2!_+f<>m֮Y 6L $2W^w t 3fk V:p;^~oS̘$y9JK7 ^!=[::^Y'VzBZ[5Ol] hq=UB/o6wV٫B6nȭ[&b:3='AYLT\V!%8qJxq uas[[koZdNn=F(qSnU<ugQ[E,R#b-SխD'Mͺɴ+b|F]ƹNWuxcnq!W8KnDf{U~Š/om߶-qzS#Ljο'ξD}N`ѓy}ͪs3#;8tEXtSoftwareAdobe ImageReadyqe<&eXIfMM*V^(1fixHHAdobe ImageReady0231k0100fotoxx-22.0;Paint Image|fotoxx-22.0;Resize: width:256 height:256|fotoxx-22.0;Resize: width:128 height:128| 43iTXtXML:com.adobe.xmp 1024 1024 0 7.IENDB`fotocx/images/amplify-contrast2.jpg0000664000175000017500000011015715247006660016362 0ustar micomicoJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?MVVF8S#Wn8+,'v2bEyw2g43jZ]=Ҹ3P:բ8yW BX9mRQNNqӟMHA}+E3Mg950 ZE/uՖTfg&}9UzQF&srֺk,ڤon$1]'kϯEZIXu4~IY\v֫ BTvT,48/i$nO己rGjl 1]ɜcl[M0GOAxUsEUO"—L$U_z 0T+\' jDVPrǦ.PzdQct1_2{_@Z:WŽ>x~$@VMVf5ھh׆mO2:c}ڲHrin|$a\X$F1 M:a׊8kdA$E9Xaݾբc]TbEYLLUI[UbFd㚨*¨J9n3iH~_E7q!'#ּk^MZ6crwAYդ+3"l<ͭ[0"E>Vc%aTEjyz{vdܞ) .r.ӚhآNmh+آ,Zg:M̭As[u 8rCMGZ< MZHeN1|/tΫrqEmhyWH=BxEKc8w/J_Ej64CSQR0j 2Ú\ y$Еd#=2iѮO¥g"m? }t)p2#!*Aot Tx)0]7ˊ%^k}(k.cҵOV*D뚱QUSU 4-3d W G2/\Z=ߺ@Mv\L^i!WlI*:=[[=sW3 O{o¼C\yL]J3c^-^#c1>Әʨ*~5b#cyRn,渓1PxN4`Hd8>]O8w"YaA0+=>]:.U#њ"*I4݌yaRĪn95 B#=xߍ,~pNW n;<ŭOsQnbe*[#p_ƠsmH85>"4׆w{ׯx`%s5H[KюyXy%3W94s7m%<# >~19vps}h@#S # 0\ @#| nml]8'}+*4dvO"y_\۫xRj#? s D0lY5l*֜ه'e_AU!#DT62rj&hL=jѴƏ[M瘀"`tMUw{r$2z ĉ#f8ۖ.W}FibN+ƚd0koFDdkh7\v#TA  aЊhɨ[ToƊ w[ pc =T[fnfT K%9QeO}2 ,p1^tUuk|nw%6<SrKx"vVGֳiſ/tfRw? ~o+ʣt+`Lq('{֟YŪjs:%[H#lqy A޴F<хkbؤNGOҲZO<q- g卯X>=q֎Hɜ]rfkV䷄^rD"y0Lנ^/Ij34K9N)cΉidŭE#r=f2K>C|/xWN#yy" /$${~uqJJ#y߆g$f)U۫Wl,o 1\ng==Gqx\T:}.'$ Կv]RVh։bN^lCtUIUݎ{FfA$E3U+D%.:V|TO(-n{f1֣p#Z-Ӕ1LF}W-+h>ZHWT0ʷcX<}iM 7 z!2?hA$EFVgɧi~)EՉ:ׄAܜ1$CSUQy,q6oSх19G=q+zilAbO k%[Sܶ`k;RҬ5+I^4F\PSGseh=9{ndkv&<ְo "We~kN@ָE,v_jƪhLx1w34o;U9=ԯu1#ۆlcU0BR#3)gF^j?0#mz*hm v!} Wռ(rGN?J-FHG`~k1|y"Mrz뎴se-J=DL,vQŽM=_!1<6Ftn+/S,U#\MH0u^8[2_)ēsR57cF[ͱX%I#$~sO&9#F wӶ? ǹ+ĉ2 8,VV5ۏmt]AIw0{*)x 9$u* EC7?Nq*ץUJׯ\RExyv`>thZj3n|d,wH8$ӷn6r8牑Ihm!Ibv$SӎJz6ӾLڲDv֮vkmɚ1ۡS.-F GH1I3>^}*[[Hod>Sgq{ZɅl:m(g*vISU_Q\ҽUgsnQ:kRt~<{VXߕW9#=Nrثj,M"q yВH#9!r6p*.ڝY_^Qṡ!~l_zk4݂w&1 Aw.ޤ8wn3FҲnÍ=;[Mwp:ÜɲGel K13 zUt귯eݥ#qeBR=TѢVK2;+}pEG_hZ]ɦ R,AJ>s05VET qmJn nr~vMdF #<{TMenqH>Л^Xs,|ve8Q[ܲ,V>NJ$,TӊIo 'c:WK2Q Ma?ڋmZXHH0S-odqeUX`*Gso+1j}sWZq!bI26[=e\y|}FQ)99Osh:P1ڭ.m%}+dG*|FCnҗs+qn9<-WÈ'a#ȸp;W;hDx#&Xz\)IWkʣ%^q9fV&Am׊EЎ[CYiZ3y8k6T).Tߺɲ9H-Xc Xz g:N+ve]EIm[{|IB2Ir]zf.I*dfg䞹9/8@}s\d4nUEZr G59nu<ʤ::VֳI43g'ӟ޴ 88k1 @NܝgN^/`ح=RcD̶ݜH5{NMzx*9"qCجrN 4r،QX)F^K<2'zңqZI .ϟMxTnU. NATrՓWxiKX gբe(A/ dp|VF>%fI0Qt^C9ٗ$sz⺪% m#z'x]@8'p:7rĎr|0s`y{Di.$T(m?6ܼ0[?t}:һ56ӣY`@!T|̞I/:Y\q=U}Ppv hfy;]9J%x]Ut\D*2>RTw[AWf(p1Oɴ%qOq#c{k֓in׷jؓAĬPfxeܑ G9׎j=[8V/'Vf*rDG+۾;ub3Tږ*ڑq{%m <NsTc=fEdRv?5ulR{f" .VXq!h.[ rzv)eg~ =ۚiY"^YKizJH;$cqZUZLF$+1'#?CZwP?5?QsϵGʞ;izeקXqc/TE@x}k@9#Akha0e9˅AC*0-^(N2w. Z" IքsD 6S$nldpn I$xmHfJǏΗ*ecJ׶a?gU<~ctRTVx>:vڒMf+߸xӥFij8 xԷpMlzj?aei&!w|Ĺ*x vϯ 5ڍΚUn\&C(FHIF;WMh5vuB慘6=8UH9(1B ;+񇇯omRryl.FӂܜwoK7ѴNoP|`^u=UM3w1sF#$3=zzc{Ԗ2p8={b3;6ݏsf[O.8%~?s?֙#峁lNp9=HKgOa)-JV,q'4Fevf2޽:Ƹ_I0.>,9QwWQj:a#0pddg< 8V8b#'8w_κck3E<=6.Xύ;oӧJkFS\9$M$H^鶗msb"PLDpwf#w)PFeIuxcKٻؗ %+p=h6!#5Iռ.'f ʠ$dǧD$G7U,zoaߌtdFrd#=$ӯRjJDyΤ\hl,HF ZSdE2?Wd 9'>dqO(JX׭OʢdBWGZxZˈ?Ԯ1>NH7ϸџ"^%FRPUAb߯v76Udg<cfo9|𘛃#S~>*n5 O<5,i.jY<^ gyj%"Z|uXXZ4lJӯ\}sIgشBZ_iq#7](p8=9T?不nMpP#enAH8.H^䙃G5[ l]X™>^KEu[JAr}MvOoMq($99coS'z#i#c9>:qڲsNV-k`Zx!6sF 9DiviWtO1ƷNRVu9.R{_~vrK&sxhG̢2T7ʎGOk[Vi&K;X.J]OZ-Hyo1x9Uyt: )݃r3ecTH>\\)6ݷsOZd~}Oag.U!QrN9渻^iZF$h/ q#:Wl0x[*N"R;pҼƑůxO,48K[I" גk2$AUMw1գNK aab(bpQ~\px9]z3$EZ9cGn&+,]&<0Gv ]^RYZR@ZHV ԩ==qZ|! Z msaE?D eeY8)p"5I.`a480qz~e(O}On/cp@%=Tu)c"n2sל|&>HrYW 1܀:9]oX{z~uU*s4wg:Qs$1!%~]ێH5Ryb<ΥmR h$㧧fL^cnU*[!cמSL30 w|Oƨp8lEdZPPPdzI,9ߚOw˜t{a^=:[մ*1m =3{+g`pk[Q/z8:U+jQKl$hdsCúfk 'X-$3F3Fy3pP$ۮN;{`w3˹deF3'*/+cָR2 /aE"@Pw}F~9 ,2r$SZڎM!!+㝼3Z:vmspp!+(ELyկ'k8Td뽞Hmb4buQ=O-hҠ܏),ĜOOoA\8l46vkw-/ydI!{%rJ:^\$Abjj;O'#SmAo$=UU'gq{;Bn7y(Eo[0pL|`ӵ]"DZ]?X5 KE2*S=." Dli{D᷈-]B . Mf&'DV2.Ӟ0=_sZ>Lx.~&b bNKrI\M7qdzIw ITHg񨢺yJmvP3`} ~ՌIs##AUױ=^|1w7A ev6=N'ک)|@}fZFe,FpF~B"8R%+ dɹNӃ) rUL{uxII6B_*#nN?N+%ԋm*j/?@9*c8>/Q0ۛۓus*K*7*<zs0n$ 8㜁zd7t2I$,FY9R3+6k,.pX|^q[UZ|vVuj_mfg1,1pUYVEBű#*v\@AX~yU$(e|E]˵T`q\snwv%[U |HpI0z]*JmeX[I:ny C"18=~<ӾЍr3;*x F=xĥd `TF<ŕ}[I݀A+[=@=|DunZ ן I;}kJM> hʀc2Rqbd#vc{*ߗ$1#Dш F;w>0Z 2ĒH a=Sۜ3TVWL }z`}==8o*(c,2 q~H}0**3:dTd{+ņEqBI rqQy\taL)Ox[(pI@4\HG ?@}֒O{lp1W ׈o"Eݍ6%hQ} Wߓڻ&Ųiؠ#vFzc }kuuwEl$b `xDq=.ߜN؎gڞ.5lC_B)R ~[wd<)Iqhc}ǂOQjqUYs MtX. ?r~+緹VvyNֺO9R$2:\[i]u5ݝO(ޘ8))X9ybu:4X8!N $= om2x%cAb3@2y#*Hxtd[EVvutu?W-:1)_S j7ȖhY,GI?ֽǵyý2k{g1 zWDmhyw"P[8%#w~ӻjw FB@`O sL2[QG =q@w::\A4f` 2H8:ּ.ML/bwp$S)n s׎#V,ԓX5$pNz Tmi{eSEr12@;Mii?c;Pd.etqUN.eP+FQ(pq'1~ŞfRVY#fpT@8ޡe[H6 ppqZ -""709@~V 3\{G-~>fOSOF=/Z." 8kQwmm1$mvˠl\jwN#i+:Ad/yo_KizLJ,- S`]dl h76W-m:{v[:ضc1F߼o*j3VJ!xJ5x 7s=ȎdGc5v\nP[jm7ǿ -Ωl<7{Ezݼ@WB҇R<ޟ#r=&?:g+IE$KdF o_rr'b?/b*婋N.6ss{WBC1?Eqxp>>q^%e3 A֮@#sGhPYm?-S~᳁AJ&⤏a{5ftR?Е]@ep]|q#eAM%`ubJq L1F~d Ky gzu\i&pW#xkA{FwE+לw.ž.;woש>?=t=п!/MWDhӚfPkS5[ hcuQb@드p:XF_#9}}jPeb`;7cnL*d2s8<ՙFG gy1nś9'Ƽ_c6|$i %GL'[Mg$XwWj"qZ1-XZd‹:~#\%dK$pX u5 I n7\ZX*45YRnЉ}ZiV6Egq}kNHxlu(^m$q!a[<<HԱՓvʇqg=^t? ږ}Ov§ 'I2  qs^5QoTIVA] C;rOOA׹vTz .36FJ0ǎSn[eV?S号nJ[GRRC42~R7 JXa@-v"Wav[ 2v{ҵlPݙn\8= cXB,n=OCtя+N:?WgqI%ΨZ^@m0dڤynO8 O'Yن u G`Xwjd]qJckϴD6PFSCtc9cSL'V-ofw '9x֩tĶh-+8SQC}X,pYcsVO&n6LP6qztSO]:Bc[ +۪D4nY )$ezq\xZ}RѮ *..(ޮsqc].3&HYK-La1 1륂MYJRDB-mў!UG`9uj"Nu;ĉ}oeO89x($KpZfٖllS4S3VncŗIi.F26;+҄~nvD#2pNv_^hWźʹ r{]Slo%~-C.AkV.BwoN `tZד%,rKs7`dgnw:ZqygWʙen?JV '8suܡ,W[Vqor>b “X7K 'AXAi7pV Ob=־MI,SLK&qׁ_JuX^tIhDt7+. ܎8Ǿeak6Rny3eFBt#?}; W6] 22"9bG=9!v3|n{Y]J~.hLsۈ8Ion]&} 5Isڟ* F8c99?S|SqŸe E8qzv뗦-U^LX= ܋a\y1na?Ί9ɘDٱA]u*BnZA'6Rq4v3R~e\|\usRy%_(;ep}VP6bTO#SWFR zs64c zc5`{B[ ӊZ\o@y%@q7~#xָhZޟr.LzfIN3г#(ub8۝=.fD$jW2*ΠK( Gs.8kݽ0j@F\58}WSƧE YJQYNBOp=q\~j E09 k_^ڤh"}3LnO=kn'`lݞc2~\>\X|CjxjtZOA>fYWzJ#""eL?\=Nyeyols'<*%?c^Ipcq^t7Hu@}zR~Mw(^r _S *ߞM6[H&c5Ҩe}:pp?"V+GcI$I\3V>'eE2@g'8}&A=> 瞵2ʗSNAު[twsh1[}4m$PwLlŸe[T6%'2Hi]>i 1n0If#3Y9( ar(#όdw{u{w_̊h=A=@K-/zZ#XjJ7Ql(,##OLEl\ev,A^F;W8🊭;kL&hwLnd gx*;^Z~XU8t6n{WUxjNuQ,Axnh@oambVѻc"1m~Uxt}&6HK*=-۱ZѷiviiV|X9NO^?EVL{4L^iNDkԂqnúx_I$Q+6oS]@lm [xL եh\WH^v+ܞcQF` mP2͜<> I[|((C̓ʂ:|WRVȓVzd-rr~Ӟ0*ճD lw<'< )nf9\{bI'|:T$ҙW#ǯOO¹'~8? \L7fVBbleU޼lO#`BAGl|zw=dtidi#@I`1?J̢Kd7=+XK6Y.-ռk;<N HYN~u(bcH rsퟯ<ֶmMJEOazza>YqmojVev(T=@%i_ |K:\NPm`1wna9'OsJms$\`Ed!R"b 3ϭyĭj &uhBz"c{,P B C-$p#?o#\csw,,_hZ7A gMGhA [| 9=kߋ?K 6xe9FGm;tM/ÖUad;I=vJ׭\Eʃ~e y9Gؾ_3u KX:0>EVɷya֪;m;NZ+H3F_>o~j*ӕsfTYv>a٫BRrw<Tyߤ⨂B>,zt"3f=rIc;i$1Neoqk>ݮI]6وIԏ_ִz= QEד^Pϖ*nWУiwy|-F&nTsvֱF'gwH`t篽^Go2QǎҸHȫA؃ShԖn:0Fwg7=}yz~lS{woHʰ\c$>v湱;b8'<u(od_'nރxiUrn*:$. |cs1^nUamT2񑎀wk,m1lY<{|ȧGtbI#2eH1gөdֈKxfx\NO֧\LPIgtyAzOʺ&&-Ѽ0==kYi >wTŨyōs-pN.//f?g hʆ¶aP $/ c֖i.&g{2*!haiR!:@6I[Lt#,, 1mv qcA#\MVm" x8c'axͥ3o׊h I#\椒Hw+ g֔!r##`/ p?CHI`Q8 S Jp70P~lc3 4Kk+IdWI#v7#̫@߮=.62@vu?ZԴĚ$߽akXA- IW|vKqFXN1=j[)D>ȦYňF'8ߜ~45K|[hFLjA (ڇT^IsQĐqvL9f<|Jз)5BAӒz%o6y. *g*1Wu-KIݥs=K-m"KVLh9D\oF=qrōa:͐9>L]jzu7W>}ry(l[br:tHYZ저 T.z/='-/a17o&'qsПm;I+8[IN$$Ϝ}#sFkPBex(ޙztz'Iiv&M/U+0LL7vF=?-i3۸0~\ucilNA3^⻻_B.m}&$3;%ulW#ƴteG.QI\5=B4-ȷYHc?t}Ꮹr柫c0YZ[~sJ5]t(b~ңFK.XJo2ZL!WPy,y<]+'PliKvڨy'nQ5o5.qFI$ztFxopT!hQ~åCd 3wzV3z_ R-HXR$+7]iMJݱIw.3:y{z<`UKf>#%]*J<̤uyD'tӑԷ 0:UH[O[bH# c0; DBI=7&"mc<#k5IYiq#>x>F0=j%zm]fn{6 =q\+lzZiwzך~|9knϹTcJmUf,SXȤ_&2=궍}H/$)q9{~MVFT0!#XzJ˵֡*&ӀNtqjޞ-cm>Ald!Cu|8owvFȍ`'ɷK0J&vð@qU]7N!ϐ' z3ϨoVtU^љFqn <z9htX B$>߈ZgY!NFI&-u{ ]x`FyGL޺>4t4. +q`5K FSI8S׌qVGXd0<çziU=6HJ W {f]kUǗ5$rDizڃpy+|?¨~ns ZB0$/n5-#ۜ~5LH$WRrJUޮc)f2BB<1FO>ިð>ƴx}.g<DbG\}i$΅&\:ջx^5mA8 sJ"%T*]CC35n6+q]\GWn[iHI88ps1P-\dgP 0GOo|ڲ~ f'UC]wL`Ćبa sMm-J&F>xL][3k1PV:jCxTi$}?^yk2Tu\ִ? ;_9O2KךP,jW&n"ׯDlv!wTt]琥L򐛂}krH-h9`w.89: 卛ɑи*v#֥]Ir p@]Fx8xBM]DwڂG9\p?:KK<Na$֌)e .W Aer?֞ :U3T ׷Px4)l t<Ȭ 2\<`)8& X$BZEhCܼcp@1ЁV?]PBcU9t:qkU@c3me2\=r:lċ#ʓ"`:cלl:i$hC<3cIgȟR'y u7vF) >xi(83~UԮDtYf w_oT ڽ DpZ\m1sq׭bg&!f޶r>bR䶤aWn_PsF3qSUc{z PU$ .%p0:JMI-jhnK5XpM!vYP)RGxxr;p׷I{/\W[> 4唄*ÎKkENS3+XJNqjqe[$g^rوyRD1{*6'CWLʎx`_vޜ ѵx )|eCzV:iA_zXZ<\lY$;S*Ivֲ_[YPJ#j W?b*$0|nm#<]rVREo[7a*y!1~bUUʲ<_T''|@|$N46~¼BRoCV8%u ":I܊ JEa*^{՟ȹ>KYqǧ0@3>@\{~?cq.n"XLj~,_tHxN˪Om&%Aǯlw 9y<[*~`x85"\qR}2sr(#6F6jyumc3F+99U袉7gE"9"XՑxTi4H# O lNHm׃Mt,iEے-y鮰ƲuJ'gZ$($il0 # ?/ >ʥҵ#RGue;ԐX,Gp1R=kEWGfW##J[yIӸOuh$X 鎙_P쑸1 BHǠ?WG'Q*ޭY6P>{ה%t [#rsIu{ր*K"A#f]bSL:ִm,ҝxJ٫H[1p Naci-1)[ 7=(Vue[2x99ub۱"+Ք:=^85HWeHK3ymYFޢZs.3['zJ,̏u=+*k AnO5oAdP#Q#eoOoLӍI\,ԧPGh =+\kk8@( ;Mn`,n$,A0GiᚎQG@r<+~m#3!NӝjƳhK{ʒʨ,23^y2ku&wI/##б!GgN /ܩTDtjʳga}OOuH|Qs:]ܨ[6OlVRS7pExg5ۓ'~=ҵ.{+z GyxW ¸ a bOE9.2H$٥ꖒ>L{ۏz..ߛǰMkʐ^-8$`tݞ=: 8.Yqz4 OD&,\DXS+2?S"0EKȅ9ެ-W<ι3V3ﯭ4IeB-z}}n2iwp7?P_V\l3}|> zgZxu$Gr2 ꡆsVnƐ9 sE?oNlib~Ve 3/iZ+pe/c Yv,I5 1TV+:^@>wmңj\c,ʀd^֑I^p/>}}M_HF0GZ/O*ʞA<>AJWhא>=k]Q~a$#Ļp1~Fr( U%s'@M6D(یJ攖mzQYA7Woi:~P6L̋8$} XEYha? rJMX?c8<ZW<y<}ɰPr0AӮo,!rl';IrӜZѭ*N+Z;e`'F0r{ݪiKeq si iĂFX}jbjzEQ\^aRDnIgM"##?_cHpF0k՘ǮN:?Jci9sqҰ2(H\TqI o#[ʲ ~?Q28-JVD-$O0ȰsIj'Vd֕,T6::}U'4Au\223砮Oi\E S)<AXֹׯel]$n'uggk2 3 bm!f%21֟ ZjڴHNRw'=?7Zmnl-p{*h+n h }1֔佥;wwe1sn%?+a£HcGӯZOd6q1bXqQZ}֒Zy~{Z%Tt+uQ\"yNn庼ڝӴklRQ9rE!PS$zqtm,'BJʗSFֳ-Y&a9?q K\Gkcʲ@ YӣŚ%DaC ׺ēcwҬc?~jׇC6bG$dVhZDekx(p>V`Ű:l&lr?:sĀT+ΒPv`!X Nu;VFGo# #*I2vGYͫp 2'Tp=*wD]/j:~XWp:ܧ* 3*6uK}z)zɉ ɐx3֤ڊ zޗU*|SAn#ҥy;KOOw`Z&tc/;}*j=QGk 0bx;>";dnGz2cʘ0y2{s|%Q*P=[QZ,;c".T`´G rt4!T}z{Ԝ&U IS\- MI ;T߸1-IrGJceFNj'p ǩUp0`FGFi]1zWO]õ O1w U6sAXr6TG }*[fr~am,1,nE') l vtk-v*@?vNrpc=댾[h5C.Mrn3x:ƚlLJ;yYwTem=qD!maXMaIX O|:e6liB'Jd+3 &^tPBYrNPXsRs o 5G$)y<>jn.'qq(:ABbø8{Axgif#ɇNs=՟Z_q&bi/!*ӌLzVoqV6"Wds`=kgZ*zW0׶ӸqEP&&j&8l*2Ս{QX9Cc֧3d*w43,; u5f1+U+bf.d{. įrg=J]2p w~uI@ܞ}j,\eo`QX"{#bL#>#LjzR*],8ָn̞OYi L2}kEMU+{g&ڇ*gDrC19'dTO.@9YF>S]L(Br19##9᮷/6:߅y?`x1׮^'Cq&+:ָi[c{Z.:"TW0xfI;>lfk펍`j0 z ǹɐ/1޷o>(xgHT]^K#pM?x*pT[-JӞB) u|ħqrH5/6. HG=ެFqr>cTehރeڅtUQ>br,qv$ 汓EG |Gvl⮺* 3H=)٢lAœs׭.[ZaHn,! aCyE?W i lczi9SH: h9r{G$l@Թwp4p8_<>^qO$!ϭUVf-u|>] ڼrBYdpJk3Pt`ՔoII. {zO~U ͳtSoqb8c"jvV<O )a%tF(8>-.:k my, ۶zw;YtE Š s^e-%y>nՇ^y||"t+г},J&wξ}y}ߔ9r1t9&τ*n1g2\d U>V+[fZSQEc?=|*M} kF ns ?\)q, >=koIM_Nubr1r?ƽ/kؾEcr0zv\ϷJ?Eok5mI$GnGҬM*H -@/ZCq1̪{^ /~H2*y?~5;Z=tJkHfҾwOz}1:klC/MB5 ZSeF tG#*V\[kZAbHnӷSk5kr%aهZIտ_wWCsbeo?ֹ+OgڬqpcB2s z{`?տ렬\V0z]7۵y0!0~cTzݛz;fG%rMz}?yo޺qt'Vq'aWnt*NIgO^0+paިNEՌS̈́6Vm.Qy?]qU>.?롩C\' gx|YhO++Z0@OҫG`# QjWpZYs+cҤGҹ_IA7` >TR&bC6o-Wq1Ң{{kjە~}k2=?ηM]0+-s~].A]ObO_/`FUg'vfotocx/images/plugins.png0000664000175000017500000052465715247006660014507 0ustar micomicoPNG  IHDR{!fiTXtXML:com.adobe.xmp 0 1000 1000 >"eXIfMM*JR(iZHH0232)0100fotocx-26.5: Crop: width:635 height:289|t IDATxVEUD)lE[A%}AĎ3ATXgwԋu5̙`MF3_itϭ{VVVVVV,Yس++++++X,YػiVVVVV,Yس++++++X,YػiVVVVV,Yس++++++X {_}TP Y6mژg/bV2no+hf%`%`%`%`%pA$pΰ[oaÆ,;q ,h{Y@oxA~6S++++++X {O?:jLu . 8p NhNS~5ȕ4SzM_l'}t'0r4/)sޫlvѥK{?Xt)ZE5 >4vm۶|$w<sWc[:uUe"111Zw` ;)QFhysQ|Q9v2OtN!5}:9tf1Oe2$,ؘqcXcGThd&|0j 9j9RWS`QX#x :ua3eg0At0.k-P"\2-e3ˤaYG:۲Y_6-lefBE˧98j8.::_ut֬Yׯo4L(ake˗/7v$p ժU3zꩬX͹joaOHֿzg/\pcw`O4u<`L4&EEc˯ݢ%8 @GD!$(4 2g c\ʅ&ZDGE O&2ǀfHp)gM.Ǿu뤰rSZ+~| /!0O:?S odejyØ6?S|N`2?m=eg1: Dzc݋'M}L\ >&ޙf9esmh}_Z&L>*ܐyܺq|FmͣA2Kplذ>=QTY q;xqp CΩSpp88h',a|8&.Y{~6 JVB'bd._ .גVaҔih8~Lu sʆUaٲaG4cR6 5Xղ)(^D07d~ ^g djXjX/,}>gZBjXӲ] rS۩P6;| {5uEV H+s׬YcS+U9sdi4~^'|byl¸4ޚq@ޕ-eLuhcmRAӫ:\Kbwa2' ^4} HxPhy[a}1i]~Si4 e'&~'.t2(F1*2N C'P;ļi|jgu m`Pc"GYqnûu緃D0V~QDCLaCG 3^+|1a~dLCcy̏lݺ@ùuX!i|xSD #r,Amݦ <0ۻwmY6gyްir-V)aiӦھ[nӼK?L+_lB\lYVg{R..^~~aV3>wL?FH++E&P[ /FyKm> 1{pdxCH ˼0uߨ9F po8m)[I~Gwaw^l\8*g܏]`s`\D.c/܅G`CbnDxL(bq=,'Cسw?;! mqΟ`NjsLoD!G5Z O #X k׮,c<=դJbgV ՞={3B!f^L#޽\;0yd_Gc.M*9ɴǺuw/<{={ue65,;sZA|+ڼysw~'su-Wr+Savԩǹ8/{ر+VjTum׮IǴk^w!N? {?;54_E!!Bh_:7m~ԭ<~7BRr!&iA50dXx-a<A Udُ 8wy VG8&eE_1^Ӷ-u+vԳ?_ 'k~;nդ-U/ovhB-7f: ]:wMl w߃3,K_q >pvF!hy&KaqA3jNfMA*/D$X&pŝD"\2oց3gM\֓sf^>oYpDz jxUE.1n#oZ׫cSa/cwrZ:nsW5?6,x(P/BLM'tK)[ŨQЯO[TV7KspfLzˑ|Hl^C:rxɇEhb/,/ 6Df1rpE$MZ/LÑ>1l&o/h$KZ< > D{ՆTG(#-1.O7F> Ze'~aS'BX6}(APxMմZ޳tSLw܁gy{/qydUVT֛u,Q[Fb 2{[6q.\¸/աr]͚51ʼT=+wi&ku0Ⱥ믿rE&˗Ǘ_~gk }{?\wp6,0ùm1rEhd^ͤӟ\`Bly߄NBfPKO|H <NJ&n;]x7еshYLY>F*бp,_112܏ujeAXW:NEMй ˯n1-kUENݱE߽Cæܬ2 W_.BfX#m7FN9bS_ظe;\ISX37Fh!COGkjTD:W#HX5e̋8Ջyj{ ک`v.08~xs"}gLS 0<6=A{H{l糧MjhЩvcZ7kY? ܈Nz|3gCMѢIC;o͝~Z2I{2Qe2>?ˀ@G| 2B E%:йq LGbt̏E,ZȔObٌǩgt<:j{Q-fsFAV`8TTQwZ913^@b~@7?l {>}@%4* -8xq/( 9^0IF~L{QmZOH?b(դ5~NƸp_݇/?NڢyN[#Xg(_)Wshw=,STa|P_e~\/b`6զ^SFߊb`P/t>5uƌ9 #b9}حhڤ5o)qz噳 Yػc@S*a@E!@h}#Ќ9n8y1biӦ/?: p Q-c~̟Z=<ޕ&UjXg'9!Lw \Dzp.4S4 8$k9-аsj(e= 88bemA}*TCc9f/YVuDF!<(ԮS#Ƕ##)K۶BMi6}Rj#z*bPJEZYw/@bF_-*U~NPHUd;D}P~1=ٺEP^a˟/x56@ۦ99{SwF X5OX԰?,Vk| }s(Q< X W "t[ wݻwGN`{m;L4ju!冻 g4j xfڶW^f|\s )q@xgea/#˻ ep}? q5 4`?/Dxy^:9ӟGs`o,[&>F͚B:ز{/‚0(_Yh`}_eլYNGO>@FMѫ$#I }[vYhjGW?Hg~r**QF!q[7:ʭQhfU*ˤc̋eFF:B^e6\ 6m2|&ͺj2,^j mA/w6p5.7Svأr*hݹ2BPv=ӸFj(!DG-A. c9 zl{٪aT:1q |f8O#1_2x+U g);ɲ-Ylgcq~ r,|"5sgM^z#d۠ۆg_^T$D#)thCߌ5#R ˜<sjݺu3bJR%J@3@N8~X#.@Lj Y{ ܵn/dKj5c e3:wb&=.=Ow5s8GG~bԢpo\-vB 0@w*pDykȐ[9C")hX,0s Y6b^ qi=N |mf,Ozus++2o {,Ahַ@q D'xm#ʜ5^x 9q"26Ag _dbqduKlW#EqeL&9C4w_a[ ᧟OqQ'~ï @+89,LҊ55<~Dz1afpbNv{u !B$ 3t ~}"c>z|r9r1ϼxus֕ 30d~.aYk;|=O||^MFP27gaždR=3gM>^'&gG#>>c޲x2G< qb8!84F͠,ڰ ot " IDAT(q ,?#TRI,"EU@ɒQn} >_|񕙯dzsi%xn.2//B4>!ĺlgX&'"qgN5Ȗa"sB *ŒB;dƾDࢯy)2 Ӱܵk,GeX?&je+1YuYfaPIT{:=UuϓegYj{9ǥ cո<.-"12OL Ƅ ko`# xXFF)3/ctaL}þ{̓-xi{> 0_xO^6we^{u,]rkvPgX,YД*gG?:&h2d7VAF6W3-`'=&Uj8 ,D[G5z6^dp @q2ϊFG a{8(2 Fjyk3>g\CN4ֿ~?xP}Fcξp:g38<4<4 \y׼5O:iz3q5o^E0 j22.K 0vbvv?";++KԸ'n nt"C xqk:%㴼L_[?<OPNskַεpUp13_^JJ07ekPʕjR };{~QzZYY5>Xh >w|pefwh+/j{oX3B]DV 8Ѿc'u JTw<6IHK¸Qy/[ػ40nX'ojŭX1,FҝOL}\e˰tRXf 6mڔэhNڕAjONNFBBʁ{mq"y}2}܊.o|Wk''ed;etLߘKNo\s:e3HSs:d?q+ ε$%%[q#y]bK=`2ؗ|zKOOQZ $/dŏsw֬AZdԝqQi/|{Rdz3GSqPea{՗-{򵲴<>1r5Ow3K {ɱXh;z*N02az ^f3 )X`GThuL'{Ph)dg磢Xu3wdz\tEGf:^K;%Oň$= f\etSV6>pet |%eAREQHq;OkR_)ף1I,v+ .~&s?a/3v%;!YeVٟ?7e'l$Er K+D;+..V]f;%8dLvFExw-o{oecWvbc%}'e.f/## Eᨛ&΁X0(X`oCOR1qP#W>VwQa {7_E~>_&ᗥ[|S8>sw_}.mVFsqo]fqdv9&w[/Ts]> $`ȣGz~=+f{סϤHʡM;`WknsDs|˗D#l]T%>ޞfYdO\.-_:}~;,mly8K*epwy¼CG*c[y>`8Vr5{A'qK'3۠Tm.VƀGĨMr^^qb1R{Ph^ 溜fܛbΏ۰~}jY (7Jgͷ|e'=q֬^͹4MOOK9KKKCul[R&3\;Ucp;E]~~>`U) 8১`g^J{u@nPH1z+Rr 2P8ᓧ M4ոZ[{uסUׁ_-O z9hƥfo"Gh@p`}ٰ=] @4 uxENXe x%N: {fa}+o&P_Tsq|g?̸r.N{/O[S츩)IƬI 6F3' #2,Eӣcx}n2I?555ɓ\:NSkMgYqAdk\"2̛1>ryO8ln;?Zj;y"MJIFhb.6E\DjԚ'76z眬Muf8memÃƸ?0ʎm#%'!=J5+MLEk''1iخԔ%P䦾̋y2-ź0Yge`p IcaHZ{Wϕ^MG5r;Ls`Řp*~(l EhQN ᳐sFh3Oy)sB+LS8,790(#iѲ)'& K=Sx.M]Ywm'bU>`fæʀ3k>W9i>7ɼT$N}T=B7KD\\'4Dj }JFueYt ˳lg9X蠡sZ5/ RsG;B 3i%}92\0ͤ'Mb؈xifTȞǟw[ P$FiOBh `=yͲ.NXؓ[5{ b4mhx3OBU:ڵm~}{}6)UTË/M3p1 6}݌C(!(zpG8`xsHQaL|Dy4ANͦ i5Gӯh p6/G3'% <5PF@pǺ*""Mr(7ʂ1^37Y_DJoAʕE7NFX#KJt흑] x[ػ:. (=>pn}ž  jtN}B5{K[U*aػgW&,F0RmyÏa4 A!4, èdv@x E>'XaLJVsdf\J%#5zt:hdΞf3Dc|e##}Q bxt "ddF"bFm#IJ~:ՔGknUቲPU+41OGW3b LO FFb!l޳u6KӧK];#9_\ z,%P^z*68XyYy>p {fsC)aq6kх. еm U*WĶ 05wrGHzs8m3qSMйK7s?;ХkwT\ոf[b]lhߠ:tFjԬ5jHhRyuvR4R_εud$9!t\E܈p.X^,`=?^096/p([ln}^zޣDz:S `c1``SbKc.ؼezY֒ʠnX{FN7gвUTTL;v=BBMYl٧qwOd.2j<$h{ak=4IW̕4p`cW!jשgsSAہ컴sd!*_͸[|K5\a#.p_#r4R9{={Avp䨇_j7u+Xhа1j֪ 7&M~oAk%J վC'ׄZ8/PT>1K駟l2,Y˗\˖._-iFhg@*1[yx띅ڋ{Rހ O<0Mg_0f}hޢ6aANDqNɉKkNTV݋=n7Ñ}пw2vmq~dBxG sȣFNVʾsܲ>ѽ+ =z@/.UytG{ 4<: ݺv@2/]jug!0RV ,T ܑ'L{ܸmZwc'"H1<eE$cJ8q" X ?\䗊u`L11Q Gn=бgyI<N1GI0ʋx1f86g|0X4OzyaKÒe:O[5^AIWA^gA.{m,؋lFHK 9&ujWG5x|F{(Qg<`콓$s1ʊsD$ƺ6m $5CUNtQphM `(81)K\v:!5Co(sN"6*7@_/zz8qBV>5mAHlC"ft&ͬP+"u@5&Bj9㯭hܼ^}SV:>}6VC^lc+vꍧ͂lxj=,;89 PXVL1o04l ;N-_2w5r>>i%|24?~D4վ:tz#G#:{)9_42d7ocb̙裏}v-dq7-+Y3+)M}G*;۾pq=(j'Ǜ=_+ҀWz/( B{qF4nk7p,ƒ0f#:x 2A_C*u|DJH=mX)IYB=PFE!`V c}'-90&媕B>D+'BgS$%}F<1aY +Rh!hu 4ֻ1薻'+QdnDʵfAD_ڄzZ߀+3sckVF+vΝP{g,K^FJ:V^G' 4VW;-x)GbcF߉x,t{v8}Q,i8@o ʗBDHn23K?2IV&^Zq qVoS_xBF!Pڷt"$io+o6 P Y/pXO.1צ"WWTo  I\B^G T(G ,+C%hѲ ޚo}"EowFs =(S ֮]k5{} Y͞t;]d8-? 29{>'̜=8-=,7lBʓ`Wd{ .%O;q̍=4[d5-+3Qd9|a+|e8+oT]>f4lD"--bXn\{7zy 嫖ν{ p1?:L]tE/}Nse9K1/?Oi4!6C9^FпW7$ܖ~z+ 4NjDpl+#鞘$UFTrfn S^~A84jôS IDATeEcD#'`&gRO}9*Qhpol`uߡ]/1bfm|hYP S "{ev)i8CVgz /r,7W&Qb Jr/vSEGf'|jV"70'pjea`ǧn:Xf5DV(`\Lxa)ܽn]{c[pS̿4=5^.CFbJW|-Z4CjPFL+>/GD6pFZ5kWNT( hޖme5p mո*U#eWڷowy vh2AO5y9Lٳg}ҖufaO:#a/U4Szd>!+U9W% (MãĴK8܈X`9BZ$Xٯ-%IΘp1r_-!0-S8,Q2ׯBv1zc8(& Ȃdݒ7Q6)5<g$olxYqtTVF\( _v&_?C C$۴7"VN|8D./! 5W w">iyB* 4\f^ͳ{UG;c9|?ы==Jf2³x].6~~~FF;>s=soc,q.!&;/f8A`O 8435]Ֆ.f^YLClA-x@E=Ḳ>uGmnC9OOz&F`萁xX|M}u̓aᅨ7߉[[@kW,`'lb>O" iPH}аUG垆}  t'8zibHE-} |$/n(MGT '}̍tdMakMDxsAjN\c ,ɀXū8^]raGKI͞9]r&, 6 izI0AxM?Y@G7)&D&di8ͥ0 d&J\H{wa}ʼq8,T9!U\b)fXn4l6`YWAs?l"CK@v7F)eI°[9}<~?-ٔMТ)Eh) ]i_]R&%$?%rUՀ` ӧ>Qc~ιzd{4TWI\G#XMyxsvAs"߅Hڼu>W/>p@=~~69ª3Z2DrLM܎ޙǸ/<˝3$uPTUxY'M&Uڴ;QQk`vfo5|pS߀ \QGG(pECp4CHN0La(Qĥ'9H(gM:SnCt..j22Č)&Lց&,3diڥSJ62zJ6qk'P$ Klt2%̄ 8M7_f9W̦),Sf.1%g;Fd֝*r{&iUc=41̏)eɺliB"{iL{RYI?516|kH>cw2ߡD·' އ͛qA _=N/+ eϳ-عSp_(U./y Dt4g|5RkO 5F)jͨ(bb-a4Qe63HmH ZW̚ F!P'`&iRe>Y􄩄d@E3ZDKP=f9R㤼XM1!vd̼L̜EKLN0`g`M@f]Wl"8J)r62Z Rc y30-;e7]w00֍P@@ |ҩFG#1pp4sʚsFa1qδ?2.k"¡"v:|c<4p==ȮyCN{lxlʉhyʹ,S!Lߟ7< yZ ml̇eRv̗u5zk>>׺3 Sӷ@ mQj  Y|7Օ;qD*Y+6EbC9įÍe'-~xl\+X2?# B3캸+a*ɱ[67nrqѩuꕫ pፚ*bBU@LM,*!PWlhꢝyz2%H85b N͋h$&\+6Yu*Ӹ0!Zb8W٪f.+j Q' .h%/B܀@ DR89)|p9VɪcT*P&^`a-oh"]1N],j= 5$ HEI\LfL feI+^c r>!a"%pv3.rބ c~ ->3a:Tc #h(h-G2?8L^YkMú*񽺃#כϵ~T`aY,v 37-^ёLjU)=)49aSc,K{^Xۣut[~{V~| n(1sg}d$4}h+[C4 xS8wh2̳t|͸P!+U\ggA>D `§d^7`rs4{Bf P@,V ?9#.u_Ded+VmVuL4p~>!ɣxPbEoM;e>ҎrxYB[O@EMږkEN#S==q] GF0{ƣ)9,LMS*ӆlu\!sta\+yb7X ,LVwƼy| Z_k}8Z?̃ձ^ g:>gOq4pƣ3es4tNLDmz:9E)[`hL'er4j.y25]n4l)c#队uV=7\_S;Go(t}A4,{f,\AJ9}U)_aPIV5qo^x?pyk `Q/W}NgFJ+eBTCWn@jC2?r,k /^G"Q`HJVNOXv3~~1g'Fz`ɒ CT&`ھ?$3 #GO@Jq}񰬬̬Ǧoϳ; ϬG6/~!8k\];qSիVH-7Us?ڥ^=[Y3qjF;'&Tl5À=G\ޢ`DxFÄPy1hp<OlǺѿOW,SJ?"1M9l jNrv.֭c[=vBmѡC̛֘y'Oiʖg3 qּ @Akg M#"HחgZ|o>|XbE|1MPPy{p M>fd|3m'}: cRKrg:Qy(1%s8q^='a?KJIᥗ^@~ؔ)<~Y`XgK{V.wLXI2>A1 KwR#T/k,*]tHè 5ұޢ53'| %`iX4 ջ4uar@%x0%; ی{)+\ tUE Nbz%X,3,F6MǙ;cנlђxr̼P,۬'cBb7^MCnXu]柭!#p=τu`gIKؓIdKωIuH̟7'M@& PbYL=j2QfRT vQc1sbD]U("A>aFZv]xEP>~J,^p%(*F@-aGcN9I}cQеѱ5&O|Ç݆{[{~Ԣѥ lq!M+'[g:`s0瀨a _x!r3=i1mS&scKu 3F(G2dprj3ឆ=KKEهIhkjpLy0?@02ݯ>CaJż\Ube{n<|cez:^?tbw3|>l1OrF9jq|3oG5ƪ7YhN% 2:?P*U02ZDkg6X[o&M࣏>HMwǶ<^kBYd,oƑlsCʥtKYs2}1yUk.<σ˧ {8:&5ۊ$W?UN6fy ;.Nd.aq Yd'×xe{S0yPebq9[V{>5bl{0 lc}e~6\@jT)SX毫Y_ GM>)'O'o-]} _^25?2Qp1秜Mcڝwш8td< \_#0TF7ЦF9{c3xtg2&oCGɓ;f/7eV ݀I_;ߣ`Dt-/뮻.˵iw O)7؋ك2T`JSV(Fcf}O{1z.4E=o{5PL4hov0 grn_BիѮ];٦w$^Z ߿EFPT Q3ԬYC L?PvmLP@ewa4 '$+UEݱEmYU\EԨ 4ǻヒ :-ڴǬ7aFXjTo$Ie;Nx⑇FÆ QQYt)tl]gdt=D_רQ -[6eߙ[Bihz 5+VNY=Nӧ2 MZ6Yzmce6i䟣@9奩/^ƨZ2TڴwSM3^A&QRYRcm|FV`޽ mǏ7H ߨQ#m߁c%XpԩSM}GAqs .V|{f\ηxr*R 2?v|y6P]Yy^u"yݠ H JIH҈" !- ݝ8=Ϛ3U/+߻=fڳ|9 J+CȜ>6>&h]9ttg92Ίop_=^{}WS-K4,'|6_w$Okܬ_Q<`ՄEb&&/&k4V/[27w~҇nq>5~ɬxwm&I$Kmq3'Nߩ;M@qAX~5NkGѮe]PDT+6IS_IcZWG6mLncǏrK.>4䔛/"G8-=[j%fύ ‹kʏ0ks 5>`UCt)Ɵ E ; :bْ3{:j䏛{{}wa?En. IDATݦp)lzU+wڵǩ8z9Q8q߽iG#+SlIȒlsg}T8[l`/8zI߲9(^ s-+иqC_!6irСXfa#[عko?76~iXL55QQ+:S?z >QF[py t7)+LK0'1Wn(z;we.ݱ>8{QB\QF$M5my_-KѼzM8HnwX%< Ex {Vc2*U`T[YfAnq ^=~c;ShT,Wc5\bn: Qty˃.) MPoO0eXdq΋w[uK8}&(Y(|X5Febj|KhՒ3"4D+W|e>t$&L2eK~wZWZjW9B3&66mj*u!UCTGФ'6k8cൂ_D_Cl鑩P5٦وȑ.5 iϛ䞽{+S,Rg/GX=28磚 _$ӷdT_wϷ { 76, S=L) m"9N|MdNY!O-SiiT<+Bmk~س?O'h>siw(95zsXbjbʕ J[.]g.Rx:!3, H&%Zm{.71lG?qyt :`Î}Xcb'L9bþsL7 .N͑v] XID*gq*.n4ψ+gAZ0c&OJFyqC!8c)~(P*֪G^4[D~:lTӧ@#~ Ea'#ŗxO-bѸt6oـ߬ªˌ¨ky%(Y?cYlEXm>G8^ ؋e3%UVp턧yd-gԺ.xMrXb=Y8\l?jQ> &~om>wgP<T {w0ܼ_xǮ|iXN̊MriMV|qص#YyQ\v9Lb@m}zeEr8Sյ%,Z8 _s;p'z ,{*Z5`U:ol9z|FT)k7NDШAeL< sfNE ~4M N]{Uv7 c?&ou7A|EнO +? 1D+u8~ä T{HI GE5m(Ns/`'9ePc^FhqyTDΘ-kE+O0}7o^7f;wn׷nn~8nqʤE A/2T>QaTVF}>7N|X:Oͳiq@ntcL=>f[?v͙;SIѳ FHl8vgcrTjO=YMGMjUq5X BFǚMp˛ɀwjv?Ǔ*GqX 9 gMŘ~7M&̙;^atjatx J:._%Kj_8[\ ix?1Q©hyϲyG#&o)OU7J3gcIF%nԘ8w 4%BFS .ƌ7'"Z;7^vMj$^+ISOǎ) qx=f8W(Mu9#&Ok7fc֬Y8wQ{ʼn:1xm`_S^6z)V>?^]ԉAp/MJ;#S!<ͯ4&A:,ș>%'Mctw!7e=|_r!u/ƵaùSp,,QV5Ryawv[Sy_jǙʞIS KڌY1iFƂ̅ʡS:@o#c|ۡmc^{qg~+3.{*vhzϕ׬T^(#G 4>O1}dVUIJsӻ''N[ '10{ʉ7rTLyE,[D}psĚoAJQv-*믑&sN_lI*zpχ)6&㓻6Tg۲$k>APҠ^%0L;2?&a<@Cw[7"=eɖ l݉"y,1 r<6o7xjf:[1"0CGELG]G i0mh4t.2Se-NX1~>9ƌѣGn̸lHcsb%} 4}o>]zŌ9qm㯥Xٝ@1zF0tSZJTw#//6iC;DEQZ~R.And)Zjk]?!ܼ*_?SX]qJ >*<gvFqxuNG% 7 3s MC0}8wFmѧSL1&%#Ci+|FVoK}̆K:^1jcVr5%P߂ 8v^z| 8^倽'v8k{ ۿ ,߹՝~h R[ߣ_QLuA۷[dKx tMant?~Rjn4զHO>h̳;0!C$pۏxuLQ|E[lKyfѧ1g V^y c5cA Yx `NwRXnQP͙==k6 e-Sy3읖ջ/2 6QфqwG&HVF:G4͛4)2e&nGWs¨i Rr^DNLgΚp%3m^8*֏ ?Q4\D<)MJ!|WO'P{3fLCNҵMѫ'zHsrOtǬy 8&3C>JRuĨf0]{|hƁy?z2*Nn. (o`zHvRh߮5%Nggvzt|\LV*^xȈ[Q ?T-[`jhlofze[:waYo S3/ݾ6D^Ddnjd^;=rlc@N|͈# 7fD?dW~ݻuUCUmxzG&*c01 qa~v}PtjU?䓪h_;JMʳVEܟV6m[#P@ͧb]\8GRE?ģ+72(G=38޿<&p=mT_DBJعˆ=yQ Rt.3N5ѯg1?GIҢ_kb#Bz+o1@#q $B2Fۼ5\\݌Z=g΄%˗xL( 3ڵk YLNΊ(uGQZ}t)TTmu(€O2 0>ONS酯W[jmqÏ ^UB2)! 'KE~-W2eŖ]{o^ܩGh:$Jᄂ1DlYz"ǏUMϘ1mTbt誕Kq`V|ŀᅦU4KI[dޠyYV+l~1l}4Ja}2jy͘z?E>aC_3e٘rCɶ2xVP+NGwl])[&c•VP'˝ 4sIܹkA2Cv{Hɜ&N|D> Zkw[!k֤!x##pٲr0@cLMу3izjh1wRcF~;{*{hݺn`Mbe| T{O?xn݊'=#$JyIs2~sgļmU*S&Em[L_N5o$&Xx6o݂ iàC|[v`p\e6SF;>NU\RZg*!?૭hҤ<>vIbsL/OpNjc{=@ݯ;Ks߽,se=FS?MwAy Li 3$AQ2eLҥK3VJ(ALy,ߪY#Iz;}7U`$M ~9ydȔmIDId/,K,ap 2dy>DPN#2 {N?p890jeҔcpΖ03ςJT2]r6j) UL](GI\U)N3M߮G;ND#=z(K(g}U4Bt?Ҧ0?4~X0w*,'ɒ5*WZ<M9)무'Jߩ|\0pXe$PQ)G*ܽ{^;Lj{*ܹs; w jI5"Q ,L?JFg0kӦ5L_YX)o!\{`6yBN̖(Rf+9 aupɳj ^/&/|bIrcRn71j0/_i^0/τ*%ʘsAФ{Tyse9lپg\(ܐUhR.^ 22"6$%ϒ VlF":{wg;hLLlC݋jB[9krWb3\Xd>Ǝn W^֨dG6{7A%  IqFzĴa>4Mӑֹ~ԫ;fˇO5arQ $ 2zQ4?x|bd̴2Ѵl|ؿJ'`@'yڑ6$H𧛶c+`":׺FG_r V}nG R(o=C`]Aɥĺ<}8Bxm9iֶlw0ۣ}|XE 7V:{C7ɱ>P_rY>°T_9dF† W$}1̶P cy3ASm2ϟ+k_?'8fd"طk-TK5ւ+5u{1I̸V>^/UM=]*&i3{}~2gJl'^NJc$Gh 8`7 8߿87߀-g$2`&_S[D4ʵ&0BDN&A1y4SqqׄȀxNfBʳE'bMl& ?Cݫkv?TlrhRx&"c'/EoZ*?^cs͒X)C  q2Od@%!i5cXxqa:[m,:h>|/3/>Cy kW~9IcL~/ߛI'W=%@i}c#y#x lK' W'$MK*ZgoE`*()ۧ<:?',R+C<?ϯܯsG8ƀxrz=eYXN8/ĶZSeSb,aR3X*[eLg=ALښh~Ϭ5aY'VǰDoY@Ghbn&7 I%xZvJE!(7`)7pVZTր %Rʔzixreҙ姚l7#0>\{S;*i6imF@EkgoϷsap/)?q c8D=8jZK*N$E.k>KpaOׅC5*dt'-(~z 0qq1򛋌&'l3t񣵭rg/ ˱?'ML߾B N9B3ˏKH'8q*qIIP ğ5[GNd2BYAO,`(ͮTTG6s-DnMEƌ6HM@3)Cx9xxC1&^StkE'cWL?e%DR8Q1H@f"c{vq2d$"MV~A= zjj"Hi *yɗ_znDЯ*l 8i10LWT&̿vdDG2RykĒ_?ϤR+RQ,HH9spJ8 _cZ*u d΍bdӖsJ0ƨF"wt)a,ڬeLA J|%#l>TA<)g'P=k0N E8*G ip'S%ȓƦQ{?pcÞ`ZOw. |:@"EH8wjK$*8GvZrli܅00Hb8.jO.6Xj=-'NB4Hl_ߜ}⸮1=tkQs{lD"^7MoÈQN])We*j¬u LnZ5RTg;Ltݺ$g/GQ9*שiz5p+*RO?%!OQÜhYb+2 X)@9WkAhҸ>ƌ XEJ N彺\k ٔOi6dB};PN5 6bC,\0ɖkgpqqa̴8eJ Ll_p?Ǝ2pPj]tcLa8xӌ3أ_kL!L"X(E&gGxᯨ{ƴIرR[]^g6JUmTRƵWX~mHoV5ݟ-RR 8_ EM;0Æ=dF̴!Ώ‡Qsۓ"{̙;v3 w J\ʠ a}ވ{Xy{N)zwe9Ano0[gwǺo}1}sr` 8M@&,M8;wF]0j˙ٙxOn8xp;6ZLYXmQΞ9d>q"V͛C7JjJkLƼE{[0c"k)2&JI C3fcu`구J1Y^,k1f4ܞX{2.BVKSe:j T7YV c0ɋ*]@ Ir/k aO"´_;{f"LPo64;j杠*ZK5JXӧ2grBmx[I5gle_kCḣrʛJπJw,Of\},z: +Z 3*O &CNZ*\RTƭ(_kd|㼰HvgBarYyfcy7|>?2pԅˌJpQ,(O ([!E-j46|i o\<.܂"Y _ o9rPX: vGrp֝fwc{'fK?: zj GDNUʣL瞬 O ɺܾd yOϲvLnq ܤR`լ| _pgy-]RֵP K0sGf^O D s =p7A*wޠ۴wx _*RfnY'|}ユGy8n<~oWdӏeBkyT4de")b̤ipy+܌_c\ysn<?7x{﵏h^߸(ǵ+˯=5|ڸ>f UMiVإ?6~vr,J ö1=s|=`J9R۳g#F%J|nJ ?Gh%жkw2eH q ;8k$Q +C|@_Cѥ \$xS[5 gÐ 3 iU"XA#ͱZ ?BOԤ)D 6׎n02#? ODXv|d , ={Dp`nNoJYUQKǒEi} ]>G=3}7َ [ c42unB*A Y 2hM΄횡bdH,UZ(R"Rg̓tjbLFi2v*G\-\>뿋4r"WQPcw W$sq 1uCPQ YVJ Y9 >  I){Y"ɏ!m÷\7~p[RYSN딩۸q󊁾'b(P8dωl,6{<z_D.PXId 9sV̟6^<~ڽ^v 2b4%Ot (W)v&EUH%=ʊիRS,XہT8F%Uy&(V(YEjDEfI<ݛ[u*}&)T3&ǻo3PpgB֭%Gog sZA a& ]Þz(2RoR/[FQ+eۣ_[=ؗ-o~|л Lij`/UXa*mT81Z[f}zAܹ0gVpG5Jʞ{z2|f%~Eڷ<6`-Xi+n5gTH%7'+ +?NRNZMN|L3(}HDr>]6whJZĩa Z9j5B6-ф+p )2F9Yi9 ҙ_;<!WO(}NNe )I7l .LYV9wnOFfٲhvsңiTO2)1M6m %ШY;v7\ƸQ'[z̚Иr}Bu(ej7oXϟjVfYzriٜ0utSumr%IX+L1cǍƭӑhԸʔ-&oVa(U>(])0`8i"2b$oQ;NNN=rv?nي!>KWp}*OpzЧO/$rʃMbC1y2ɗ<A<жˇXj)fN ujǛ`ĬŸŲsJ]Cc e5n-rt¤sXΟb __awG֌ɌA$OdR0lXO GtQN 0wZL|ﱏؓm){C}=6+ݍ4eؓ_ɳ>3LGk,18k-Țw ۷ѷs/q'`~#ȑmI4*!'`/iP~:-4@дiS4n-ZF&PayօeYFƇ,Gя s&۾>%fLV*2(2~ʼx2 Zja=4+bڜ3//]OW&GPA6Uq> ye?ϻ =**!*N[vbJm?2eς&A%d dإ%KKG|B* >\xS!: WŇa# {E9G9U}TX 6jt|'JJE Ý&n;OiãCS0 oܳ @9gBoo&\OF@Iq1ΞИ 䩲= H1+ Gg/L]яH1'Vm=x[}Iءy;8,&m߈Qa3LGOLSA dҕ0X)!ؿ߃ܹ{}; #FA-QDaw`oQMi{aXb)}`صkW2Kˇ+.#A~~&OGK߄N׀'WQ$q36kl\= -/7PC χc@4u=M܊^ͷxD?Q\2bF`osغ{/3)SJ0L!cێ[;W۷\[hu2W׎plھ9ӤPHfd-Y#M{G(}}ٻLjQmS*WyKH  IHF|'RMK0:AHܻ;jܸ%k~$b`)|xg;u>~IӺ[nջQv;hf/(SA4=JH3㚫;φG^Iy9#K8r:BDɱpPӧ.f{9ɀesb媹U: OU?W; `žQ{'ABS)aޗKdMlqA8t@?8nS.?ӦCϏaܴ1cLcr3|f[Hii%)[86L9O_zc11o-t@Ep Kyӧj6~>;Bs1BP1剮={UvxN~@w ="ACћJ״铱xBc:ly}Inwn\>!s`FaV qr[6o4vNa\pk݆Ob<ӥ|2/÷Scv8O^|+eK j!Sd)߬Z"ap׏I:iE߼ e+ {); ǘZFߦ)[lۻvoCr |6yUƏɛ0H&:Dwf| p3 8e|@w>Y^^3Е" †=Nn0 fxevF#cH/l۲ r@@}tcK|䇦LM\ P(hHY :y{0`zeag>=%t%DX=glB0wrR<@9k|a9Vw6泉>Ǹ{?3|К*MnOȝ 5HQl޸KeM[aA=:F6y>$2 Drvϕ ,@j|'}> C0_.ېJsEc̱Ȑ!| <‹I3*Weּ1_?ӻH̸i:crO|+hݬJIPu#k࡯WT={tAo Ipi)=~HeٻҤN܂Gy\ lOO۷cwx{{2m ǙCr*EX\~yik4*ZZRaevs 2Уr~3'B->u6/xS%U+\.C3PW.n>~Mq6,^8V_/HA HӇLҘKx/[XК)mr>1ݽ%I.R)]R>ROEH5in}&[ip?ƍbrW q=sqh6wu}(?8qǦ7~}4rX-Sx#12gϋG<ݫExӧ5m(WiG`8:lgɀZի\1{|wf¾c`DUmsO~sR{TU70S9 Rˊ;+LHmKf#Q,7fE&zըƍ̵Ǣ(INT)F!Q01SxSc$ÛYLIHKsT NК/ic' Z8eÌ)R>g t Mkqˍs^[8)OS}n?oI2kꥻm:9u IDAT{S7'Űf#Hc>V!!T,@0ud@̚3yU=nӿOod-\?]z@H627nڀoYMp>g#wedS>xBhcF1whۢ3c:*uTnVߺo:oer|"X8o&- jD&lXvIr1U6 j)qk֬BBaCp;wog˗m9sfY1uڳ3gN7[~ m& =j(܃/FPX~V::<8~Gձ]&Oىw5Aq+¤OPqˀ&-Za-&QvrIZ,h*q7s8 7@ƍ&?kzxAzNLwDz 8+_+;@ǿ~m`/֬w:{ It؋7EW*4gq'5e4o(}lؽ[}2xra±t_.gND7@ qQvkG7D%۟e#τmкJn$K gT(RbXO3AڜhN mM/Y͇̥{׏lU<@"ӄ6 XN< '|hAOT/coJLG7PYk:|T wyHhJظxNb'UcP('>(?ɓ'#[X}ڶ1IRu F c .+} )#Rѷa Vrߣ-LڬČ KՐ ϼqTOlڤf,_ 磩63ҧO90~TxuUʕʡPTJ1R| 2rgQA}rSCMkr2 %*)}rSu潇VRe»4Lg͑o"c4h԰>7Ϙ#%F>d R#eY^uop|流_EdNC7{,س&(}FwH$fX/(JO>C9]*m:'X>Z*zŜPMno\vIC3a q.Qxjnd.ؘ}E^UTI,k}"IRF*ZE~O~e?_ž`mS{.r\g雤IՇr |iA8Yyq;q[rICʠR)أ"cʱgh Ci2aB&Q~^fm~*e !MmZ` zjSESŜ?O|ML̈PrZ *B}e3Ы$š`PaisWkm#ӷƽeBeG^u>a4D a*Q+ezoDz/3@_zhdwO_|!f]^$e4U`T$<R(M˔,:^D0^ؗ!LnkC3 T/ٱin/S} gBe2W R5e{ c5םp'c^cӧ|R0 *o~ 0Ծ[҂8ig=w8֎ ?< SBT9ն7Ga/k'8ެ̤)֓Y{̬ѣA!̜OhYqXRjȕ̉tIcڗ~+Kf`b^e^X)-ݐra%IM``P{k%/vs}@eOל>T dF?=4<_mj2Z3'UdRʔ E"8p;NS*,3cRSj*%09l"ReN `4qBDIw/eIԄ Lré3?o@F'_p e>:6!( n"wH;:GDͪL #qjO`{{8"_"_as ҆HF@݃UGƤN9@.Ps% r*`E1)p0FĮ 5,wVs4m }6u^G?=y~vZ>wtA>ϱ~J0UJ,b>BThns\wׇkOצTUC\G^k$q~kq`m+aƾQ^> ~~uU%a[;&?vpcീK!J[N+.E*tI eעqE\Oا 8tPTISfMȷlݚб;O^$1tKEk ӜysA+r$'󐟢 {wlS\^ѿϏi?%@۹ɜȼ4*{:SތUk&W:kA3`*IWaOP"`Ф*(QF$ YU}٢)dR% 3A>SSV <(BGF+%hL;q>QgHx}xJd+ASТ b΁PJ#񬍪s<(Y}JJ:=|H;WoxG>j'_B^GPc( A ek" jtLxZ$в>^C~cx1éjѸӃѴ0Dc@vʲg\ƇBC_X©\+/PUSujݻuBмe bWL CODEcDwOX6˟Uvz QA טd;a@QݪH4A l2˶?7?/ÞcǏc 1ZS ЬqM&(I&t"hF͂'VFK3n$r,LbqfoOe/UP^23|?~oބqwsu~|_WNmJ4%uyס4=t{̄&H 0C?*C"tMr`=MM~=%:f ԛ4Ǩ,M {č3P)5ࣶQ!K% 8ZUui¥SAKhፕCq4J :9a+.47#]|('uįS}aT #c!)*c<ΨSCw8ժO(Di̤ i UMzL&v cՍoYT;9 Tx,EʨRjfu3ܟ=l]˂C[ۀPCxj> # `Te"&Zeʕ'` V s]HZ*GKgT_czZk(>${JTc}${Qً5MPRGU2klpLjv81~9^ ػg1U}b=]a)u`/@bxSL(?\uٗnZb=Q`d/nٳq{E"W6/W)e:|v w&s`7aφ;]KMl,Xo%"FUQ|C-1vd/> S/!O&2ƒ*BYtI֨N9(EQQF×`h({,&HьJg jJ!h0T"Q ɡPOǢ:vR{D.'g2 JE2 eb5hP'ꗶ>5@&Ջ$p &DW1&a&uB8E#DcpA\g$vQTjKZ5H&[/Nh//Nc˯Sc0uy ZɶC~>4 /yqYKa t1VxLMA"k1"UQp(J1~R"yxMoFSm%^7/'sG9ό"Kp.Q #7yk4qb7qͳ٭cMҍ;Ku VCjRaV޲Waݘ8fɍhҍ7vb7 M4`ώeҮͻ{{>jW'GbEU ;qTq/$z_II;x)o4ڿ'~v,uhpDŽ}f‹C*?hJ6$x$ QLm1T̨$0GhRib$~IZ'{q)QaDH=4EŽ j2 t@j _ b`m?TW~s!jl4qrx-`O73"ov`2UjxiY?H||+Wa>:HʔyK`{϶ 5J}Z)Rgm*(}Dcک̳j0,\G=Tmbdzo0J69JV)IS`ʑώsy siMD"U؛,oA~h+W\^miIQ 0R2ei7@sQ{ EQ55j'#ހ_}z"  A&80V#D3`6*?`/R e3S( 4  H9km@̦BL&}2Z_rUV&웰'e[ bYQPD rtRy&(Fpj ^p5@ ̸"EHҹ(8DmyʌjC7XX Vڿ9׵Aώz5ƶ_vk(3q@Qdl$3=89k6 Z~4kA4+Cgj {nzTue5ԵQBR:۵ϔzFqeoRNBmë@ /Q nwfŚ̤j2#Ƣ^s`mCp?k;Xoo?6?k\_o9vqx8k{u[_4)2`-jn܎\<ā}LLgOMRcM'DTONG*@QJ:v"OG̞2:}4mX Yc^b56cbbf>z? ;wz5O/ gf^|<\u9>; h|I`}6WLCާg9(mC{lbM)-}ݪk*K_u^he᧙]ԩT <=Q֊9)rI$A # p%c( cHX^F6bEɹ#3{VE5[s$h!ga-a=hx P0IPSk01 ʦR ^t D؋a%$zf ¨( ˑwC7 u A` 6/b ֜nt؋I3U,Tǵ˫V@Jm|zv@TtNm (>)wmTb}ȂIH3)is'gV''VS!Фz[=ӘVCN+] -8B@Lm(:/O`=LTsrHzF" &! ݬS\Dk)B@<8.ROtzk\gyP 4DtƹM+$b%;tƬiɅ  Nhs:ݗXga~o ujTS`ΛsѪ][e0t5A(;Zm)ZNej4=1SydӵF{>ׂ?:XuK}B N]2{ ѼUʹc̾-{\пO]= C?`ONnc䏰P.!\@IN\9[&"4<ū7aH C"K' xʾƜXJ@QJ(RJXS(enN4h սƩK'eT~VG)bͰlRA S)Bӕω "(z点rh IDAT :N}#Qm N1nSp LL@Dl1/*,! 'hȺE!4$&)$왭b6 @Q*O U X`G4%% "0(#"⎵|@C$v F-ܠPѱ›eL˕/W _} H Sv0@"aKDߛ~"Ў`Dt|}H1N^0%ya8^f)l,"'MVG 42.1~ g"@b nkJ [ddnT&И$ %h"X%k&F[Ʊ. cnJ?|;9S$ cBc,,TbsBisdICab:/ݣ %8#wTsXwcfPo`(a2ss3@9b07A#m@9ǢQâKDDB&t1KCV/*MgYCUl{ ]eKҥKnr,Wcad*f#k*|G]=N2[?A~F3POAbZd1K^5iE1 4>Ѵ-lBFenC0mǦޝ;~0*~bu:F/L |zX=ʣz(Y$*`Μ7 ,!#%OE,pT[Ѽyst 5jƑ_ C/Z]j֪[  rXx0;J-!&fC4ыw8 =]#6Ȑ@tnUoXiUsӵذKT#R𬈡C(q@%wtsCՙO"f>.tKޝ fzJh؎zgH\zӘY@ ޮXhڬ%Fǎ?B9вqM>enS/ yyzԉ6פgd:ً 1 dg2p "9TSNX6oS*ZjZjxRdA38o݀W; =0K㴅.UkΏ/?ۃNlN S6׏c5NR:,+7+u? G`(\0jW6][qZl{gn<,_ja_*V(gƩ׍<nw h_iJA83fT(Ynڄ)4_McvF\TD#56*^9k¼k=ЩS'(\hꫨS.*VuO>c2 yE [|ɇmXa;{ǹ$N1B*/Ǝm1ak(R$<*W+7ect2|x߾c2Q}s,_)k& U@˖Xq^xsĻ}dn߀5\XkF)?4ΙRM]A3q)SӮDuݛ+>ASnN݊+7E3HGoýB)lX%=mߢpb$;2G}םAR9N$R^vキ|?gE-b\>&c+ߊS٪ewx%M0?S%܈' J ܱ)PSy|HWl5H٪e3<#0쥁feĉػk7>xmԨV/Ͽa[sءxWpjԪO^"[1{]2׬kWguuc.4u!odFBKn :}EѡSGLy}:XߘG8-!`oAo|ewrfXR߲1(Y>S 2#F^ @<7}KK1K.1:{l~;wo;wX1+ c =.: 'IUhN ؽϾX]Ot]й{7xiC• w{Gşﲸv遘^.L_֤Ikԭ߀H%:inZd)6~,RXGȱ4lݺ45TfQ!dڣV8yg33b0hH,3W.[,ݙp1'*{.cEa7M|(y>k[|Ylټ6~bx<xs;0dfi(Os޽;zMp,z9;zz}'O66~ӃYah.?3GWo]6i?SvSXdn"&6Gg¹_OѳSٸy,4CQCBSڕ }1hkH }ϖBaN,MՑhԠ!/^n~}(+6gff'ܡ9hgjb[ =71]{T?&)Ct,R9ilr#֬^ɍt+V o9s^"S?ʙ%48: ;Ȭ1x碖;y1bh&Kg㘿 G[NWYpS/jȾTD9e #Ysz uĆi)gT?p+W|Fz? *<ƍN0.ڶCݶ}pp3ʰQ(T@>lb";E(dA|E0sc=ׇl6w;QZUL$>wOҥʕEM2x2PźMcn2ȟ?BG7SEs:&6@~'Oؽq÷طnn§kWSEf}`|z?c|X"hU!_>@{Gd7ʍ{!Sj*%0 'jm1u.Udz Sا{^x -b )z oCzRθBVPʭ^]h?LA ».64EW@׬zeJ<_;\]r{ C_~Š|g; Z5`0~}|d^*Y"SbpX~oP~٪)hAi ֫[W4jj3(^N3zcT1q+ o(ʖ)˗ΙMFs:i^< eј[w oТc4~&BbY>ofEASrhӺ 7ɜ 9%dR<^.qƱr3_жmW" ?o0Tu/'ѥUK<;z6[YCLvS`wKG93qԇ6 }'2u e2Pv-{Woɓ O=qS#O=f͛֐"\wٔycr8 ;u9 gs~]~ ?7fMiQd|S319qgכҁ= ȓZk?|Ж1((k ;BX 4猈p,|wT6׭GWTżchf>_#J²0_{44WL4 {iBUx!ĄN$~РAxŁT‡ߘ!#G?U9Nuc/]ܨZf rR6jdTwFҁ>B ϘbB3,қ c?v\1曯PƣVmɾAdz֨S=O ~L S'u>{9nyv$:tpz3VNHނ&:O~)eS7(R/g7y.wnEe0qd p.ʻX">.{vnQ/a1r F</g T@tW1fx=+$= ˑa-I$ٳ=u>c] 3vTo0&3NDDush/FH4e}(v̞1g`"tbOᚷ967c!$aqwPTrER33ٟevx5BekGgK']òԯWޝnCRŦuV*4j_y'(=r( _7ߚgYX"XjE3B7c9֫4 ɌRv D2xt>8OvhRg$aʙ(RlCcﴩZv-<<Knۮh@[ՕaJ::^Nirbe616k׬wf塛q^p2gf2^~/UG\GӋ/騉W^jqE@H8HPFMVd?b\zI XbT$C5AH2ۏ¥*+UⰗ6aUŲ"IS("OADKHƐcQ8uPؿ^@ zO *yoB5p]z3+^1gɈK2je7Lc'K YBu3^0.U ,kzcǏW^} cM0p7zD?MS^  Cڱ%kľh)V~ӧ8GOAi_ub?j^e~*55ғIFÿcrp)c))0`ml h#?;o3D!̘1Þd xr\vРnw0 T[paU {o`XMP\t* Yf>n9icݻl6OIѳ \J6Tr&(Zf]众lyۻ <@m=FMnbd x<X߱ O3F2RNTDZ A]ŲU+°@6ثר!b j" i\>pP?ܹ<ۜObdXѽfX&1ndPWǏ3NZ\~]s-3c q烽?FH{NX )|$[2 ٳw7/X'~<'ڂ2<1qUB|Ai[>* pG-X=qvCa "aqf'w,0l-:Yeꔉ(^2q@:N|'J=aF 8eBad6~ eJQE\ͦ@7f|9 WCUTQ a0$q$Tڣ%2f=5>&1?Ըr? %+VŞ K`rYf `մv|^,sU9Űk?]ubi^뭨S7kݫТ3U$MJfh7@i! EKN^0r;8͗(R&^_ O?TSgѓw}j\sG:Ggijbm`\ 꽉SYx@P/i*p+_ژݻOc`Ih϶bN9:䱫qrP\9 bcBY{% IDATsV{ܵ cbSFzMeb;q$ -F2!ebZpA SŽ4M drɺHPnzPYhU]Fnf_e=$P"w_rpi*m;׷Jip+W ͽd"f9k}a]ʒS 2^cKp޷JTE% i& !6(ŋ'c3f M.VKFMq4k/-#&jWʖ,oϛTcw1⃱ZWZ ?a:sNq裦z V8/|gb&3|L=z: RɈib oI/fLBQϺ}sif/<{g>ڜ{W6{իYHL> %˖AUkQ#P7\c9kۼy37oFoM܌b~(Mj+ѯ#GZRJq ++uhؖ=;?r>Xg{>m!={} k%݂(S&˔K> k FaBK;KLT[&g"xr hjw=dX ='6&͎ߏ!Vh eI#OE z. gzUR ռ "c%ѽG 8&9-(n]l C:]rILJAYi LP%W4%0)6&&6yPEG L-0&Xe"#RSrQJ'6*z)xtRdJ.3erԸ)*2'~9jvH5EGSW`SfQCV6bY.}YeH{fld.=ޘXٳ  ,HQ(3 ߟg~*uS;ltzK i IlO [T`/l}1?KrԻ꿿sr*+힂wkQW'$0UNmxk$LrccYxLzөDg0@ƂVz3>Ojtg)Pn26A>YdjSBvxC2dIqfmrP}8VR؞:'q!߸*P^#|K.:GLb (F.,sR ؓLG ҉9WR89LIT`G-ot9sWƁ۔^MLò9@WxfYHӘf1ezM{SmP\},ܹ?g2CD33T,th?wh0$s~:sQJdGFhg'ږI_]jce.P+wk# $2>bc@oYS`34WX1iS1ubec=Óm\l'7d uotb9˔A\,U| {Dl}Wf`7G >er*+-bpM[4zu*Wv2sG\ZJ TF2E̕]GgesgG3ZkZz+̜6iȗi_5 ki$@*6A`IypaRV' gR{(U%Jc6m-k.,P&gN&Т%;Z@!rYCҬAtڀ «}\iJ[ODĜ#sʂ![ryP듒D`JЬbA_`vu)taOˍT[ $3QUߵcJɼ*5NDZql>։LTQ`OOoy=N-Ȭ 9C' \~1>x |̝1qڔMeS -}!>S AʙAV`0ULL>Tn\|772jC:#,l[11}_5ndQb+RH}Ņءd:J@`nT -iqȤwE %A}-|=S+@[?bK}L$#@'TdyXu* &<&0kLJe;jN"l.C.0ʍ+%f3,1r)H2k64S4J{s\>G2" xXy|>@bd Q dT9WB]uZWaEbV'My}9&YT)L㌥qsB 9'Cj cRt5+W1|dlU9%cV $BCuϸta|=D6T zȱcmgɆ+,~צC*\MUV+4L}qP]OAS6V y̷M*ǛԖRq2z<2nI.?6Tb2v #o|du`T%6S9{l X6Qʋ] -7-bͭ 5n?g[uƤƥPP kXźˏ+B>|p1{)Qޖm2'#;; mk%-v_PwJĀG1+X ]/lTZ|o[n;;(X\ ,)Ž,d0@ٕ;}-X[ZV3LEV_s\+aHU0Ik IJtImHM0PۦrK 9 L1%N/Lcb' 1[:ΩRվR (%(^YE|C̞a~_$$Wbu,* I]/q/žmǺOV[Yz1:wG+7!kc)j6V]$j HFQ,fl >Ifٳn(PM*``ߡY:|C̭ EpQpg1{< 9˘*;N?ntU,uNg"4vX5gg;;!@W[=y8 z2XeÁlߍK KoSv<'um璍#;W[p>d,e'8 :SMJy5W2u?T i<:\]ߣIDj,۝}ľxHM1+zfM*z@Kx ;D@\jml/v XpR&1l3.; L9fi`{;-`7*ԧ)rӶɉU}@6ɂjNZ- :iaX]-X_-pwNݥt4s1O~MtVw`Q]lao1 N"A.+Cl-Z`*n R-u`Lź $k⢨k%8UCS ATmTyP#)*AsI&R|3t-*WkUI@h{ITn;d%~!0؉1P H>jw5ne;i^ OVCr޼u_Wf@ '운Ӿ|8><ޘ9 gkxedܺ`vE׵#syB)hțRرڵ; wݩMsTTxt-@2Tl21JNHsS3󉳸%qp7(@)I{s;OFaY6τ"R* qya^lLʁAl!΄?1AŽ˸_p<L6Ӡ_`@6ٶG}h:= BB0'6ss w '@޳:]s^H]}6wUnNEl yH#*|Lb~ٜmHL{\m~j TLC+˾N@IWo7X q0M(^KL9;hnk5GԦv7U#&T "cTb{J` ܺUOy]웭9UZt]DHиƺyOaX(51ɓ1p`C1~b$]Z#>*mHrqęѱ8!}#pI "jo-ZzҾ3ڰ&ļ?ilcseumfĺ1s'NG$&snDn],3҄ͻ,˚%ɵ<)?{26Ǭ3մ9-YF>VjQ[h(A˞QD߁lX8 Z'/n~-Z4G $M\{_ čDQ909u/<r@gWEP߂j9Q ;d)P2y q|p+io {?eA)CCY/gfyؘ"e}8.qr,2^yv`'鬣@ D t.bI-:[e4/$2dٙrr@\&1cS2S;ڹn.Rk AvzhN˰_y:tB3':J ZS8LUA!SI 9Uh~Fx8S9y#ƫ0B|-wjFXkb " ؘUtc[C#XH'Ӄx[˭L)1![ܝ1][l#s0Q;̿P2 W×Ͼ GLxqKPѼNϻ D44uF$=FXGpH$ns (71C b JS$4&]2F -Slm4&ȖjM!8;pYbC-$|Cqܡ0%fSEP0'6zR 4FAלC~zBPP"9f}n^OhP0 "OÝpI l{HOۘ&/݊@][6BBNzM3acKA^2r%0!Hvs˹w,^Xfc}AQ1djx)Ph)NlO3A[:Mh7$ٛk@t7~7Wr -6z- Jf^(_ w8n|uin01yo;Q2qlנ`M(` [B^b=}vp1X{l&A1|A0\T*7Rb5V2?3De}pbȊE xe@RpD4 8@JcZW~ZJ0w,35Or"cGy-ߠ-sMc=;!(Zޡ|KŗLEtmĆ >q/e0CAQN ==%Y BԷ'}qzKsEu5ָ ./cFP5NE~~wydž?sۘUݭ L# u`7$k$cb߷;AשgtmŴlh H& EĄ0oQ'ܫU _;7܈e?zk7m12##ljLI^h3KٕÐC'=wFb&mbooո*^ ߮ӵD Ko{a%v{|cg80Dy;*y =N[CW1wc K{P)}ܸs/̓:w;l2BNnjGsj./ǀSиegUB' XJD ];ѥUk򶁉LG#w$QZKkۋi I&2hԦʖcPǼ< ~U+wfv5׆{׳nb.hg[j \RyOɚy߾Ή}W]DY25o ڌA:Ο; =+}~ٮ s6~}N`x[IUף*zAF^8} 15*bƺo`!_٣&SՃ[pswIo59?Oq `ZڨU}ڷ.9Uyö́'%TeYxs{v4]uAehZ % =#fǨۢYɊnݹnzr|*Fuъ[8uǮ j=BY,D~k"8%PŐÎ>d, 7x+0'SPISTje+c݊ϰl(΅nzPC 9e-j5wTI&7h\:4v^Mд;z&\C̝4e (SZt#Gw;нK{xo9S21iKhԝV"+5yhtUk{-@Rl2٨66kB cHBU'@^Gdcid:]BO}.=h+0cjPZ_cu܏nMs]e;uƭZbOkYkUc?kuشG.R)1xUp1q%|UG%0zXd?.m`đV(^;6Ĝ3`nU|([4Vdz hdeŒĘGnJ``1rOY*cvZC2X& #޵t*Ov%,|!wPTx(a0{\752*sYn$Ś ";~\VB&l$r.̼I 8=~شwMpt{덛ǴY^v}:5\O ,Q4#C7{кZIah}՚Xv*4"{MXyB 1Y1gQʞ3c=oG`I^o Jۡcq2RGFEw8~ZulNj>ƽ`BREѾk \\9}ZBq3f"mn@..E um”$`HJ%cRqۗ ? i'ѬS/,]~ߘU*bא g~ډ rf3m|@;l;Y+ABgdJlڼਕ]b 됆/өބ _l۱}=C ,/Sڵ{ҍu*\<=:ė; )diwAA)Դ<ࢧL[X5|[7`ȈeAq*r{BPfM̦G+W}&MSU؉47l={"N:T{xx`ҏ{ⅳ]Kä9틇玸a\"rn߼%K^D&ҮNMuG&qc(]JV%%Ǿ߈֍qn"1f/C| bR?! 7nY~n،/6nƧoqMBSe%F+d.iY9n( ϰa`j(ieiRҺwg.vޅ/@%zr]:Ē%kʕ+w^l6 ߹Sw|}' C΃ɒl҅Pdn nuʽѱf.^ So࡭(T"Vi:8WW-T[x? 1??U }113Cɿ=cԸbe'Ftm(T&M'[&$VF_l {1ʔ+m(?2e*'b߾0yfPIk1 &r7|5`3Pt9$nF8lwmu\pyƎ6uԿF Fe#8~7Nk] v{^%S&Jђ%y Wبi-C٧NfuѬQupc4|0 ?u;A,AZnN2\O.V]N?6B-0lٹ A 詈 7cE# Dثф(9ܔ(;~Z*׿_ڵ{ňQ'69<_E8xk:42j+miʐu>)S)gfDO{9t_pްuzhe"0!}:tFA[!T>S^niu8O1;z% ܶ9ixqw ;݊w)VK[)N1B $Xߜks߽ ُ5~\[L>j8p^|0^d?{~|AfՇl}NrJb4HU"=d@ NLʼn ٲňSpϖd2ʽ(L(`/6bޗaއfc?'>g{A"VBJ;XotP 4;W;ԯWЬ5LܿqR6h~\2M';,tx-+@, f¥XP@}Yuשc(h&">ٵaӰ MPqf+ AI i*dX+=2i=ZBD jٺz" qC]@ulR,\<V,Fo;"ii~|~D i0q2<нd\s.CG2,V 9=OiRM`ONQ=QD)XőrD'^ .xFc9I1w\3+X_WI֯ۂի~ys$!~Q&̈́PlƠ>p7Bmđ6e⼠\vRzGH$ ,ޢeUہv~Yc6m}| 0}&k;f}G./AuаA=4Ѵis4ѸyK4hӫv=  dXƲlYZɒ1愱b~rmiay<ϿN;aDghD? ͵7=thڸ-K>G8I|^)ˈͫO"Kv0M]4kՂHC_k ۱=Qri8~^,fďK6\+Qa9TiRdhέ;9m[sb5 TZ/}^qԯu(`c[ͫzV89϶EwdR#pbյʑw(.D7Um;ndnd$do o ydXtFCC'7)/[8}> cnc{srz!Xc?KPAM,X%߆ M6nxA:>WЌ}GLsްR|׽ x\8*dL_O m̎Oe6x聉 iPe' `ܨ074We*Tv2}7Oųcx4tcL.M"[xkwpڧot^>wQlUނyЦ]K|7bMS|3=5kNCY!33RD.y//N@ʩsnȘ+?ڂIƨOHeJ 5(T4AKo̘82hd$ƎbM&uf̙[ջ M(Фq ={u5WByQp4͍[P !g&_%커S4YL cޯ[~n`)k*(|CdIJ̇ſ'|IHlC<`>5zNF@O;ni*8_Xkʅx@P,?ɻw Ook}`NFFMA܉V"=J`yple΃]gOۨz"'M~{2eZ|Ej#!CATV̥! ReŪO3=n,7.X/rŎ޸v)ĭ'| vl\ 8wǀ`O ي7l?@- K]`n 1g8:>݉'\r- #O8t..67a2_E{^?3Ao2l"ʝ̀u#1n3y$WR |FXn!}۵F}qoxcɠ'Ťs$tjAi- La ={nfV!͗_惻x@8O#ǣ->isf3‹$T+nT&FpZ ,٣,|Ƿ S$9~iXtUG⹾x&9S@u {ni?{{g'%u-^Ib߅aL(s"ʅ8x~H6i 1 >\[콻i"7\mKIɌƋ{(t( `O;T0|.=:瀞uÌy3PJ B9${Æs3$ԨJ2z>k,0#3~$=d_W-$ ?G{+YH߾i+cC3ÅWK!lvesI>k֬(PE!9UƎMc#RF3(.O^,!~B!(4,ժWD 2hy)DJb$Ŋ}ӇJs;2#nIɌ-~Em>-ڶmK37dӺь uDw0;}҈~px,˒)zN-j4i&UD )Z}{H: :wi ѹk SR=aCР~sxܼkfȘLB<Ճ •Nad)I##O,{m\9{T.W]tR&w>L~!cKcېpa7 oEV2k6ns@֗<#~۶{VDӂظu.b%c!\שA/%3/ڋ铢L(6gw:,Jbׄ,.4?: %#1{On"{j#{\ &s(TĒ {Hn)n-hSCȓ/7~\d]`#0K^aNN⦃2NAC~ul^d pi/oě lIo`2G+LVav\%I1ΝFLgOW47䳧#2fp(dN i9~shE(V;3gн f03j6_pؾ~ذb6ldx];L?C}ͯOkfa q(y˲GFRհu:U8ݤ'T@ҥpE9{,8Cy>ӦK% Л;w6&N3pkڈǒ2R[RqϓS@1 5ˌ?f̚tYc EܟgwЪ~C.BVm1QR>!_aο7LF~8Ͷ S-24 Mʭҙꓰ0܀{8s2!8A6>yz`ݟ>[&ݙ-c-z5;~X'h}i#~*pK[*En@H8207Q{̛ߛ?G?}8OQƓIi=֤<`D|M&W1܏zF~N3kcY.J6j;'ѻe%%^=# v+4W@>Tڂ ?F91a$0xQFEL 3%%ه*exBõӏŎKQ(G&ifK'O)MYhvo=H.'{#Dy,w$JiT2 {J3 C;,7iGR:͛Y3`)B2L/frhߡqП/ _*zl97Ї,/ Y3M 298/^0>79 pYI7FܽdFB%ݭ)\f P]I`/O+ ,bUY4{">OYdގ/lĉ dS)Q(:?Oh鿦]o^9&+b7C (if'v*dL#Ï},*K[r @U1ntLGup?ʔn3,qx*@!J3͜#iZh@E9\AJ"]>ۻpՋwd^π'ܥ+&V`\ј^Ucc {qH0!d{SyۓB͟W1h* .:I3;7i8~0+=DžGP_h*)]mϋ\֘^?wU+?,62dJҹ18gsp%~2m:@R 2@\c;Q4)!S* ~'q" i\|1{~פL (cnʞ(j/1r><@ݽ#7ϕKއ KBܤOm#_ԭQMu's'K_l F Aԙ0oFjOfmTJJŬ Y )U;k[Ϣ&,.\ =/+Ț>Vg*-MdS&OaVyD 5RHxشOfŋBGZRŨQ@û/WzTO+MKEȒ9C!ck)ȕRc!=Qe<{O]ixRȲ O240E2M)'ȘG> ث f7>S(@_}@k j  -rK3.ZDR.[<)e\#! r}J0HWXj9X\L:*׬[Ѣ;~ ׯΝ;ڦCi[>Ej}t88Oy{ʋ)9l j@,s ż ݛTUe 'lRpE9V: <]HBqzAHܐ$M[fpz9{nphm PHMSg(X8ƝrGi|:ze=Dc̔R}*5V(0s3ihʬLd>ǔ}@\xT`+gϤ?J,))BArG~#@>%dMYSq>sRILJȑ bgMd0 J@)"Ktk֬~=컶mZધEm[ EV$#æOâ% Qr9I h^܌`At@6gLl~dΚmc%¥ vN[<4}o`ރ)sY_([&[(Qй{_{} sA\qs ]hzN81ZhGXGGV1W; j4#uå-T©RbAN8NpGZfaıjrБYR{J?mᆊ2}snm^KҞf,2"g8E`#e*ʍSGVm@yoQPvT[t"V%pyw/5 P &Fi6B~zq뗀K_PCL+D鲕p-V2aa*i4!uNbbOw'CLݧ;Yp?H?H6=,aTw>FǏ{(Y˃fmhڠ"i-8<&\y UB0s +hڹe1j[/JeH闬l)_/[8oDa;.hhkEJpMFZ螽F3oZe:~(q6}B1?DvmFZU5_^("ke!)*5n[Bӹroپm3$KݰY4O IӜxhc(J#C47ft@ahа)J)T`ʐ- RMH$33_:Gnz'I|ѣG_ԩ)5ñLQD]bz^rXߠxˈTM2L)y?l(cĨΕ A,N߫f>iޤ>=캥H޽+i2e&@`A7,[,n"Am7>3U%I[~4Kȑ jH 'Pf%g`lL:tWd8ŲXBR%By! Y<Sʐda F<ĨA}~8R󺃞={2 -mzKj;t7fIh ,+g~K)8d%OUa)x&+`41ur)Qt]8ƭ$%͜);JQQUZ"SC|Ͽ)-fzݺdAr\ͻwξR%Kwc&Ok)$+}/sdJIɽyST9`\ 4 ;vxK}y&[}71wVش疕]#3fݷ1쯧ظyr*=KtT&ۡeF2ùAȅ{X ܲ_wnčFq>ziܼE=ԉ 4  } ϋIR!j%һxroq̞4[W~&%\+d ٧7h:mK3Ӛ|Lpw<Ȝ{A\͑6M d̘MQ]rS9V,jGur6i]u~rIn23]QwŤQСCsb*pgvέr 'z4>ȑ++]3r YҔWY_)uعT5sp߳EJFf9&KT) ,A-5Ϩ9sqSLtmZu2c[*F_"7f Ұq`PB'=Ri>M-če:Pec`[VTAP_Fd}~kю-[Q\% C[>T9CahnJu.v+~S&pQ{57Hi|: uZ!dK73wx< r˓;p&Njql֡,jWLe1|ٳge$1p} N$C_ a$&Ǩ_wrT9`ѿO`&r C1t,¤W`4wouϴ_Z S{9Rb\l!r1*N}:GOؕ^qociPX. )0*%cBE Re`q^9R)%)!^y/Y'y_7WpWzBӊ)b?"0(<427Hhp&f$#dbzg%wQ<^eT.MJQ6tmT+!Z6nsvl${ڢ$Wj5[Up:ڨ絮ҧ1P|O3@{{) {rߪ<;i`p.َ"ͺbtd>g{α5i,͋֊*K0apd6 g=o3Vé+w)&0f;,%'%c9%G'Q_{h^Q$w{DVU&N=de7W.>S\bTTݔ3fXdc= nX)  _0*y|)Afת:* s$8ޘtKsU"N.߭S<vbMѻ[7 ݷ,EZQ4C7wzR,HȇL*Kv)C,W}Gz@Kyw[9+2:4]jW:׻JHyƾMSE #[2YN9 ƀ!\UС8ѧoQmvL2bP$%]@D7?j֧枔q|˄z/ )ѲCLmzNc^Шqm,Y386W4ŕo۷YYI[϶5D/&`qf{TƂ -*h~ǹ }d2lMbk̛gƔGg-E4Y~ϤOȶfThj*YZyqp;HGa:mӹ\:\vcڴichڎ* 2XzhrHRI}^,.4A杖@{oZ(CZe:Meڼ50A [ {ٻ ٞ<(B?lt4j.#'US[[,4 u(7q@F=׺d䫥<{r @'N+ ,5]rەO_50Լ~0]JD6/9F:62yStm^**۩8J}ٟT Qo` ަ;v&HhV,m M@Os_>uk2)I~1 +։R]Jg:tP͛Ԧy1w ZJϹX%+ͷb,Њ^ywu\OuպV/)Z֕:KΚv@)/10R5?lpHsrqc*(hm!Ro΂ ՗<2Hڀ | #$a (LPxK*+۞=б[7ul>]zӚ{JsvjmZ6[3vAs?9Ӏ>LmDm.p]ٜXmTEs$/$/nq5gĎMcsuK[ _ϑLRk'W1к3:m:+m$Dmr{[F(gXho tyMqj56\O.AGUh ,r=KckYXA5n#o^S!椷H5(2Sp~jSFW0>S"j%Zw:|#Of\v&ѧ㿯bd.?ܷ&C(\\hZOl_rRK X̍-." qaI) !wfZ\pRq;R9%%՘ 0SJ3TJqsEcͱ%3er绅s84VzS\L8圯@v"asw=ۯ뵩xwC3_ x)8%y\Q74Ʈ'c"8bQeKc"'r*P)0eZE/>~Zcw ؤ`4ĔM&pM] b^r.hXh|455$KM:o0\PH t}q%w{75)0 -}K}ڼ~##s`:PH\㯹o}EϹ8@gLG_z.(A|9ow!go#OkZhPh^LUeTkUK!WAS{h.h}w` i^p<&+fm357#yjbXVr#N>FBrno$yBq ;yoAQsd*fr!3;d߹^kZƞ[tϾV"~m$SQGwU}{ˆ',,gR}_XR+{{ZL-T @^ pMt^~5ʙ&/ v1r&5QMy4._Z, -, {:GL+2pLW`[}Ynԩt$ NE쑄?QӓYPvz?j+'*E''%[Go5T;6v$P]`Ly/:R:$X÷| ӻV+*;@J ^2cI|2m Jؠ2Q=Z1G0{/>LqA'y3y]bZܧ9{u\;zcg1Q)( ֚ttiH~0W덁{'IN6ubto].4c:_\k/^[:Aus뤱a=~j[,chxh5#obw/whM6?Ηt!_{\r"͂h^sRڨKTnĔD\k-hu LbjܶIZZڈ:sɺ'kq|݋Ex]~3)(4N晨n/p82%ɼb C exo "x˔ñ/phHϠTBJ전eߊ0JQ̠f.2 b$TJ>=$ЪCΜS.q>]5%xtwӧIE`QpR4KPkW.'fA&@X{E"lB (Xce ãy%`%a-JDtMqZ3rjv>j 6(hRy3"o\[w"ͨl%؉ Hu25I<-6S`c%>(ɟaQ?{bl5O+_J|)Ig~_?W&yz_HR-pD; a `O̞~ӕACƂ_j\)9R+$$lM ? 02{Pr/&+|'))Z$L*,ۧ]ws Un$? \E$):>ޝjoPd"iA%?)iie>R3։"s'F`ϑkhΑ)I2V呒vm=[V:̯N'Tp 7K*6Mi)' b˗1̄ NY3 )(CD1AXf<3[*_d.m.I>92X{EWNkDfX9N _c}G;F9U[Q,ˑ\NR}@IJ\EEqק Aɒbҹ8cSyJwc>繮Q\~SzgruFjX-^I}* c d18'&:f}OP1{BҘ4=GLȀ1۩u1ӻZ|=yhip~Ö́6cc캏-Y>*9"Ht ~S5,ֆCq)j%_4tD2 |CIQ;kXcrEpOL ,D.wLl+M_r ֯zV{s$\O'f@O qҸȧ2}qwQPiKp@EW&@ҥQjyZ)gs,ӴNU&̉R 9aZ #sĹ3Bb̌^CkŚ2ANQzM˿^WĊ͒`4?CN?aF,iBVJ)d$"VO@\ o[Bʬ Rɋ 1%,^{tNsgOA1{.==C F)* 1+fWϘ cO)?q  콣##hߺ J%bΚ%&rtW, cj !&/Pľa}E6Al{9o,h`m06G=~;j+9gc_QdW鳷}^ vuwfֻ1YjUCE9DCOf3.cg>{<\f\ ;l3jNJYCgTv9W/bu{.fOu"իߍ#qFF%Mev[f3Q:=W5?;5]w=,&E*|i)~ ))c鴛ڵ+ .Ĝ̡Ɯ=%T/sQS6rΨ=9BӲY6s20Ss8q{\;q1\FZ 5)TcliMp9C#H[j*Udhٲ%k ?0!zNLćWٮ{]N@OW^UO|i r֕*uS?-R9 ~Xj5m 9>umקԡ߷AXrBDs3l3F],>:,-'6s [y:>=NMO>أ򗏇=ET Xox(MRA4ǁY&[I<=.sɳYflvhܙR#c~hBܩ($MZ@m"ej&NCќ8Jg[E*q92 n]&)>s&O ;M1-H&&܀˗.֩ 7o 9JIH0:Pj#1O= 1 &DJѼ ;qlE8o5GqՇA""܊B"g޽ kT<)ȧ0Wr`ק/G-?*r:bS\]̫/@Aup:PQ})*%=[>(:V On7 ;u`G}!xD'S/,\f2DD2 DZ`S ]/Oth~=+p)12A5F5OE4S=E/?dxjàHQEj q"'!VO Ǭ<{2?jm})ns$&K`E DւփZ^>~?}4N U֬dcъeƘt8:-{b5a`KenX8ϵIu$GINFKei|\n][C?d8weˆZjɓP}~֭[v*СCmn2sm#O;LW;474'\>{:yԬVYwZY=lrZF-ݿyrA&w j>wV4|]bj `iFNP>} ПO` ,[E׿}/fQRTr{xC ^ҽOnbcξom|ug֖@ߧkA~p{cTq`Op]HzjGq*2:dH썚e V.\WQbDƨ״.x9lZ) X/l/BK.@}\p]j2l2S\2w~/ MV(_Kg9R_y'=m+ wq|Yka,u,jƞq喷i3/{vP@&E:L}0IP(kp',x.-sֽ8-fϏz>>v7Fc7nxDCoCC+g^wp뎇)><qC\၇`A62ڠXz8w ^J =blU.XQw:rΛEӘ9rLsŰJݻwK(3d3'ӾF@\c ^swXǣ}Tf A8Ƽ{:L~M+:^rfb0H# Dj}^~@X1 ඗/K=Ǖ ;8^L&n_ÝbTSIx N%~|Ԭ_rg\Ѹ k- OȘ0=M?ɓcpۛEpϻaAf$U=i[3n޸C* jrd8z}֚@ڢ"&fb;ޱ:X* IDAT0VɆ\vʹ$^IM Oл ]Exyy١v9H <{ychk$Fh3AWZw= >.z|Z8g=eMq3fME go7mk ~c~L2ל~-Ln^^q/(' x!1&LޗrxQS;]vfgëj*'Ɍk CL#'Gr8BBl1g\d-I# 5d=eKW ۫9j6js^qu ́ߑ6i|LE-wzݢ+gԁUVS%%\]`9Kz}ۡ j<5fO&܎eXN);ˡF顺W.gZ2%}t3{TR u` "IrPJ؉SX1m@270{!'fuȷX3 PLLRNGY' dy ,Uq3ʕ)KƾCGYB))KEn_49 W(m,>|ݘM U%SHnEXɮ_ZRYrXɲȕ ol. uƦMPfdϑ@K͘KNE:ӡ &dIJ5jp"55.b\!R`KnѸ~Z 1{SgE>+P reL V@n b>]f\SgYhѢ:p[tk nc%E1˩9skhju;)ʔ)eŐ.gOŊ1YC4]XlsYq@/1l5 7G ؼWW9P`NMc޼h^bZCV=ЮMO SF5cゥK@,p(BZ sQ4Gv8ְQ3|*k`fʜSy4>qk|}1" c-Ԕ_cU<ZtjbA?.3āмA5$̔inx DpN9mXW0 6.=0nhƔoL6q /#?P݆s䳧hܮ;~L8ػUkDEÜY8y\_!-]:خ_ B~Kӽ^ nz=` RQJQjw!x ؄U?@ŸxZ,Z /Ukh^Km;cS2I~Gwt:vh2Y_lKQN-td-,@c%VuȰq Uka"8} }l[Zm5c ۑ,S. p5T@!psc^*D4wd{탭~j^|@}=X<z{`xBțT!o;BqǏLLD0{o+_Y(o1,9 @GЏ2 cdM2smr"ݻ'kjŋR &`-7AI)%$$bV"-rȇ?LǁC1xP$:܊E}bZ̛6D%in$;.}L9ox<_2c2'I;4w<;Z F 郯B0g mG}geslٺ?̞xTڷyg̝;̙3tƌM|ǖ)LΜ=d2Xxv=}"Ad( m>z*E0qX<1ˁ6mAc |% OFO`gX|2ȍCo\[%y8;jiΔq!L5 % CfnpXNh^&fkW\9J #{Tqm\1x*o֬hѢ9A^ ΃ѣG17!*yn qӵa:rJL22 kKIV|Gy: kdK a1r~oӦMbR+Ԗ>0q|>-ۅc$,.h=4CqnXoqf\-7;.GwL/\en SMB%yظc_p.hL?h?=NOF? А2|埣&Imc/KPl1{'ڷoM"*܋E̹7INT1>n"uiI>G B$1{( z:hS*B|b8w}-WnԨS׀L7:? UW&3roعG$:N9mlG_Ҙ#P^- 4UM%מ:2B% bmX)5b1|1w(WhFnѶ3vj ̼ߜJC~!]')== Y2g}NM+#`*$QN|Pѯrєy"ZhC×eb߅!(Ado;JFN $hj؃?UeL: ɾN=``$M "n&J߶lG^PDm\RaǷHb_׬{ N4Ǐs&K0{#ܤ9i-|,[$'ߴoRJ`-? u•[|Lk2U͒ 0Yx tA6_AμENq>OC@2jb)賷rl$#.fOI͙1 -۝H|2{2)~+)wa 1}t4"+:vf9_!Oua5_t{&LIvp21m8??mi?6i}X]WJ$$,z|J</%Uף1#F Y`>x G.hHH&-&[(ԹRU 5]4o&7|y$\Ehס" { DԷz>4?/<`O/{`@Lz/EImX) `Р4͍ĐߡMH ST$A 7#"f>YF ɷ%2OZ41<wo_eJj%w2uJ_th[._;ƏGSo+N)={ /U+VYL/ԒP%ebXh<}\h-%Uժ kq*]#G EQx!^u~1\e2d`sp=*[%EC`Oi\.=QXti^=={f|@lc"0]z=2Re C3 }GC9U$DJ2nJ_S!>#f9̘8M'FQ{QR aLoC$I4sk׮XP>s 0 -{&hR싗E!J&C]ZupF"Ahס- K;FHkJS*XȟMwfΚEJ-{kMDir=ݬmة3UĖlde^KȈ+,X; yXRZ;'A_&@JUPcib.W vSE6A8{ͯR>ӂ?^2ѡC28=5>1grIwGRQf|^PPni}=u?tVg=ܩwBwwwwCqw Phb-R. qOHBt[ΐzgs0z2,h7 S[עP|e\\xfh:Jpk ;u9%<7XiP 'v w7 ^jM&\ Yʝ&S7ZF[~{ ~ n_=5-YGUʸLLQP\y3vgd~z8+KD|= dΈ{ǃ?4oxf g9@S`uJ 9rzaN(_=r||C)1 Jw!Sk"$ȓ)W]U̸b6h<Ь f/ǣF_֫5 =zmlu7{l4`Ϯ($MH{QNwe'{d}usZ|1nYǾY1?JaWoVRhҡ/y0S5f$,[Lo*e1g,bщJBw ˠbصx=t9j qA=y ϗCY! =ݶd ]M&S]&g0&')ÇtheUHBb8|i #(u 4ޜ=wu%5԰c\jp~͚5Әwh-[f շ~K'! O~8s&{=ֻ?#jV-Y3q1+W4 3DzSf߾GΣl3p0B7.jɮݫ 7{+mSf9}#V5vf0P-ZԁcjH`Hҳ0 C)O\iR{a:vB3j!q2uvTxY3^Ȩ ӝ&hXtw h Mn\xۉXs&&:$8d˄.d41I\A\+eR$ժMkL17' r6^>lnJuw-~FÌOGe0tՔ3=C&ś2r{ QLinPBI<2&&MwI\#1dVjFG =z ʡDxll)2͌4?3gc,qjI]z.inzM,ǏXGAPI[9+VK?gҒh6w&x@4˜u"fCFP RFM\{aԄ'~hVޢΏ8[Ҍ^pP\:}NNѥ{_ߺ3'7z>I{1+^4׎=my |(>weO"3WV+^,azː.]:jǶEMj4Ф^N50,t.>LZnK>T |ax̘PN9!a [iv|b(hMsމ3Fax`\m%Գu#2>ƨ4fܸl@`\{? .ƍ6>w\M;Kw8 Tßק*E吱PuKxVÚ;:N66u K'n5/gt!|sp;_P{3kp̙{ ޼82`v]AږsC馿L{  {|Lo[s``88q40{B=HzÍѾMcP; (fobsqtέXҥIKv5MACyDTӢkO7{m& sTWuPmٸ9J( L`p-[Ye6V5ÎL6 nAC t{> w !O3c>6n߉,#Wht.zx2P\1Bhcj ? L&۞& P"DS;8P5lT+W~mw`$5E%KMwܺ}7+3M9g IDATFnn}IGC $F^N}q~zc~D,ڭ{2 =q UAUx*: [~2aҧMGa7DqYƅ #1KZԩW̞#]L^͵L>Ѭ*ŲRnG3d={x?ʖX@; !C8};GChri>= 7y8tƎ>Ha|z$iQ9g @,GC3{8=6p[h6YcbĔ\]\T(WW/\Ж[ua/|)+y ;G<Ft\|kQW;׋QB09K%_smM_oۃ"% ,;vBڕ +%if0 ҴiSkLOodBp4lրZtH%aNgdN9mrp2AȈ`,Y5>3/>Hۡ&V|JL [raܸ pdqƪ/2!Nݽ#^n@˾`i;eU̹qjbdI[կd~ l[mH1 {W/f5=ff\Pn7=&_|t *Ç!m΢ahKy3Q[`O'$:?0HNOM&3rR\8qn cHR~Jqt2e<4DFҬ(W$um$jgӱ ڔECHnPȞhWq<I_u]'%Oa綔J`Űr~u:ǘ9Y{ Z1d!f|CS<uD2 )\1h^HgX\dIEL+pGw3="`@z%lWyIO SE/ 17Ω=%~Ll9(DBzi(U(P]25Zd93LZ"{ cɔ񑗥N H2?9jL`;TGyr fd:T; C3 [f} ΜyT!>ta0㹅nm-:QyS}2*0nhQ:#aK;S5&2c&op1˄-c/_fի̮igTd՝ݿ>@iW-)ʳzHN%`*[ )^g(nc %ͳ"vqrزZ~u -ThdPkj:vX~'>A|YV[ھiWzX]ӌ=%g󹒢9>r 8 v\*+ CRm*0c rr $jr,ylt>j;yX!l޴r }1q߆ Pjž.Ib *VY ]MZ,PE+/5rԒ2`^U|/> dyޥds5A9=%uW `dJPФ$ Oh7Y/O%+ MIΚ|L9pPl0A (z=Njd"&4FA˘ vF33s EuLuz1ީ2so3 BBM/QL\ʕKCt"%0^ M1>]1b%}P*y_gbyo)Ho<Ί'QK:Uc=I~n,3X}JecR+\wSFi:˔p5yc=d>:(]"Z#u:&4 á?2| qQ1w?aLe.  +7{VW/W(7bLp@H>.jy"ip Xf\j((߶z2>{2'ǑwPDӱ_1K9nJ$ܥ̈́r3"saAF Ő&OY6\8 6a}jU,C9p7ZYFEFs%ռ5Xy{ʺGmVd"cq2%d%Dz%#47̪ `f&?kA {2&oIj`7xMֽC)c59Ј 9 bDId)G5r3ƉW&$D ,pk=ϖ`3qb3Y(ÝKD*I'xa_儦I"C#04eG1OME1iф)Sޞ:Vy^Z뾜 Plc=J-TќbB d~,/@A3LL}m/gmp>jWq ,YNw\51/[`Y瓻vg-0>,t7-֕'=[hGO ܫ={hbS ܺЁC0G:x~+ȄB|X6$M!t?u:&0&K}HQ>s93S bɌx>!x>hv Z8ű'A _Ic YCeo>|ZhY-/&Ӿ>C2j/ȲUV>M/,4شn0x~f]kxEʐcM  +-_6hajwLHeX7o);z 8iwG`н{wt͜qbUuΫ~&`/CE*b,DBǘC4$zf0}'AM U0!cyƥI4o{ZUe_L4I1;C4J5g!;&oKBff7rث P,Z x2)GF A逃c"s{BVɤA P}3)hP EeR焟Dsf#2BOL&3} D45aiB7l@ h{f)K2i4i h#K0#Jkt'd"y-N |P᜔̤ԨhaL\L=\?eD*%FHB}c ' _eU[z9{@W`/Z^}|S$C 8|5x,;$q/,߂=-[ ^@ef=?{%T]%8UD,Cx<=Of3 @ȴͦL,OWwSQ 0ym$((4@y?>D>fk>c$H#A,\!36Xrp}^vv \ bXIk$}=L'ؓGrryxuپϟ㳱 ,`DjP{R& 3c+si }_4>x}k704`FQ2EqO`$sqFc{v6Q]i HX%'͛$wU} \{>da>Mݳ^'= P˧ ^8v$pAOG`Obocw3k~ӻ 1eet=}o/^CoLL&`i]\!sEbWZGv/GFU\_w 6qP@r@̸}=AWzž~:\ߒǜ41 M>-ٍ@z1?!J¶=A`O Kp>IO1W̊bd@bO׫X 0]e( >p1@e"ߵ?4mPO38t9V`PVh i,|h8XJ{/` pjBʛ)jOŎ<+^Pf$ScF&<6Ji eC|>fk&4akzfs黎`04 L fO@PH nj{mv9Wm MQY@p23beG'ntl7ę*\loۯ;[k"`eB{dM`c>_5pj Z|iѡ6͜Cv1{bӢEԮMӛV2 ԙ\,}#]P9Œ=SzN&7`nHuҔ+stlOa~to<\P `vyEhqct;iEo>O65]Mӟ6c)v>X*x_Ąp4)h)ϘF OH3i |^b#7/ 7+ZBsdD?)@ts`OѪ|h T'09߃CT>͸X9YR/a1Jd@ƒU&o 6ɴ D bT82tr1:/TO:W\$39$##q Db453As]Xi u}d4`Oϧ}c"S|9hXP_2,o?><5NPV~(yX`"vgIV;be-q6೟Ǿ|زlX1!xͺW2WeoZp y4frYY̩ci4n/cYVuKSVlv?? fHS u@19]צ-;Ǿϟ&ջ [m@aS1zgng_uS/pg;[. IDATi׹}4u@}Ȁ>W|}ճmHzoƭްwXQ_iJLrMA,Zrf#~o#VPhwO1/LՄ6ͮrӰvz̙:rqPe?IQLm9KmP~ v728[ 6H{NMhcՈF[oZݿ3'|Ls1}ҧVƮvpdA0kWΣ[W`Q%u#WNdЬN(3,^ä!S]ZBl+2%sVp)kT G=؟=kb'l5H5Y[#`X2MlkLKm0Q ~Z,Ad 0'NLd`o?n=w&cyFI9ϥ=2H 8[D- %R!SЯ6g0`2L֤,6(U F`-W-C?0$7E|,@`c==n^앵&7]WӺ [6c|(Z,ƌ͘H GcZh'2#C|5[4ݓ˅ee \jΑ|V&kB]\Y۴ɴa`En\86S٥0c;Dyw%x?vFѢES17cѕE{X(bxd u:t~ZAƠ{(Rtݺa@{=] <ҴTB([l` >>=Q132\ePH1qڣs{\8sҼ&k =vb:m{ΤT ?tOwWHMjobM|йt }X7{O{%kjޙ ^^xw{moq ب0KՐpz(ˠo+SJHYb?o+K:HW88dJU*x.jOѲ\t*+gfZOs?OeߴOC=rxA;aI&fϋƍk "eR%v%Z5jµXq,c憍25]{˘ eWcؾ+T,WSϜU1dnC4m%m=qb´ńP,7A`؈8}~w0z$d͛WgU}PSww M/E]CEgt/]UzUg fOz{]|u9[g{c  !~*/fҘGФAǀ ݽc͖<6gЁB1k0ɧp/?LAHSmZfL9H̓Tbt۷ns˰MBt|FF$eaAtO]ƍƜ{W/egp.._SNp`aZ'_\xޤeSy3x)+k~}o\\43,mɜWYA2=C;70vLvoèk8a K)c\J?ܹ  Jg ;1r.ٽqL)ϧ.%wܾ;x]++4B>\terG̫b=eֳ ^vt>1A~nݺkhyI*奪 Ғ+\:!;t +|OHvXO=n))_e^;Lu93GA c.߸3d0|(Rgcp4h/ !o'|nVLû2R6Өn߹nrq ҫO'T芒% c<)n];{nd0X`hӘ,>ҷWg67}eڪ@xCZuM^UkL]0})o_;#{\JX&ܾlO]uclVp.(Ywtٝ}kËS .@"P!P~c{,@t )39,l^hݬUiF8{deh&-ӧzzfkST6ҥߌL P|2.{p$I16npLʉԘ{㺧9~x'Nh yոT5K ^IkP+s'+h½psg,>wߐQHkJ>>M͜9#ZjAj ,CؗBOOӧO7֎KkAii8zJw ZԯJ5[o#6cdtrF&;_A^z聀 w+j챑eP/= =K^>1d~x'2]獐<4-w,<=c@d rco8qgNHƁ27ME tR^|._?]I9f[sdb* ə< D{[l l1*}?L&m[#k^` 8\sQ҉?Itc@24kGG,~<hٹ+0/[w`܈Q(ߙ6AApw(z a&]T<hҘ4 ^~ϟ@IR#iev7oފE%$;U*RsBxlܶ5jCQ\ lkrbѬA8toe`̇M;o0B'`Ƶ(W1X~ܳ?l5c?ebW| Kܩپ1g3^Юi=;մsLu~\>R6hq4bV1#/)9QԪ] |v[^TvӥOZ6pܶm}2 O+gz|₣[?!*s-WGqN/Z7Sff5Mpc g_ZZZy P_G(ݽL̋A PΝG,E1{|xoo3Zkw "c][!4cL]ڵj۶$𦩄X NbNڶFk5oߞ+Щ#'6hJpSv=isƃd}NjU=И05hBnߏ bȰAEhPTmpN'WŻ ~ҼMrP@ 7 JUMͦۿٌ ` M|sQ_\x,e@ȎTbB1h"bthבd# OrSKazͩko %&-۩R[Zw- !Ԏexy_@A0oٗfrT;ϒi>;$q|aHkAQ7{n|f* 5A-)q:/ba1s4i9N?NQޭ2gJ9hL ?!#@f/!|CG@v֧thW\DFHH,1 5*ŮC4 ȃȒ;Ǥta_X4wȊ&ZdզnFQPaqIԮ~: ݸ"8 ,9|ҤK3 l2A`)/BOI.YKC>;E|bqTYz'ͱ٩s֋;>Td h0+LvzxݚԱC{ Q}ߡ\DG:X\ri4fҙ=s>9cY~\ 9)+>pԼ+zw a7ps]/|g4 >vEȒm{11An}PYnTd+?r,d5&0MWNBՍ+ewӀaA1fy srݎ@2b;J'3D]:P^+47GTYѿKNzs&TQ FzIгGg6qBљL_a|CtqAQ߬e;xь8o5Հcn'GA s*J/?30ƑQh b|n4ԬT ?8g9f'c GgS♓@0r*qA%pB8z8E\KaeF}D xPJ z: $2)(S?s1DPc6ZDd >k&)Wq;~?jUZvBCM{1!6YJ-NڛY#ǎÌsT@(dl`ǖ bp|ֱڢ#GXߧVRYC[cvL8(gewcCzKoooܑ:ޮNPlѢd@A2t8z1zWDq_eX6ir_sǵKpzN4mPY\Jc3B=1ʭ iK4kbJ6^8fDރ0 ͸ܞ$KV5i*3a4*?Ś/(/Wk6ff2.H zShئ/< ~ԬJbf%+7rH{ ^ e{27Lԙ@%W ]6H}o8Ô+)n{Y `KHdlgw( o  `,0R&V9t d({֭3'hѼ4oޒڬfר)$mBݐa7K6v̞ K,1&`}Κ5˘}r "|ЩucdIpSL9ol 䄫`?nY9 }qbSvA:qqcRŽRјqI!l1&3y PλwX 5TðTi $NCVho.Pk5!-Ξ%?ŊKrb,[_mۊ0:V\ՊfmocQTI?u|Ad UyP,8QݻVg[2uY6֭ :Cf&?v:2e.#գޞ[.;K.}Q =1}۞tFﶓMt "3?ȀSO(Y:  o6Uf%n IDAT|"sO$zwA ڴZQCOZu}6L4~w_H=슽?ޡI\颈#M4g)0Tl ێm!5t $NZ4>vomGMhW{17y(]6hoT/A8X7!^W(Ib? |>cAj~G 6|ZVQw2 P@P7j\aWNtҡY8| А7вv &+|k@=.4/{N3s[><_3{m's _,bU>> M5W0CY1!e"X zݻjMk@:IAM`ϕ Č)S2np0y9r4ƌon}-' dYDƭJRHNM60ݍYVΊot6!f25eqX4ccAbS^4>FsLTy4z_kPdAl#nr<99ȱ@Lt>˸@sƬ+ݞ/0L:> %Ս>2 ~ŅS(f] 찼1zZ#ٸAP⁎KCS:O [ebFY[P%% کèY FP=71Xg,[SQiڶ8-oE ͽOuFzEh:zŪ9xMoӗ"O\Ѻ+|nȖ# =wo#N[lD: #y"0Ζ)=Μf&2{{F-/uAPd|٭r9•32 bYb KO4NcɔEq4qdH)7 7u͌/,)S`dx\==t0`h?j6O`O;N/Pg2+Q)g'{nƌ5!v;`PG4c'DWc^ܞcӧP`%|Ǽ%1z7ؾ P.]ef[ӵ3=a["4,*z Va]y/;&u+9wv{˅ۢmyjq)+>[k<x:媾  -2֭`7 vѵPd$g;ӌ۳]o36/A= 1H`l>,z٫f!ElcQqW`or jۮ%F2Q[΀=NӮ@2a峧L0d4\=ujVڴj49Ϝ=ď'<̂vDJ`~kFo7ן3f\ND4kȣՄ7O/]zL]g{Ya(|GJRݚ8v[2*#R$Mb~2sQnW@5o "O+n$شD4I|$u6j1]b~lT K@Gfӱ 6;p>2{'N}ToĨrGm3+f͙mmkrf__7zىNYMl3gbYRHOo~?MƳw0́osдIK`Ѭ+c{E,&s& EaٰGn11Ct%:nHȓxc26I{H̙3UsJtx{@%1qy7`OϹX TVw| e\رy#d`CޡjTko?2ẽM[fه=߻ԏQ6upP;y 5+GZpQ+ h"b?wlBpȒd0MݩSŠ#_m`y,c!4ɇ d׮S/ttd Djv:ܝ;]߹3m _oѠac3J'!~+VB=z+6δ9 G* ߪfyp΅9KWc 8|ާs} H_GX޸gr:զyIv9$9wEa=r.3 ј9ɒIJzĘaȊ)<~0 5VZD,g VDWduzou)s"?e`8q jWw` Od,V&2mH0Bydrg_7|ktESV;G(Ik׮aH>r3cA nSN{V*fP3? s'30í;Qj5ɏlN9Еk,&bčsgGZC2S}'&"(BT8W>aާ+LS?%cކT6u*W#,P!_fN>@I:NUF]$Jsr'n<0y.^e`?^ 7Ё F@ysșr -MNɓ' Ҏ~t T^ӦN Xz/^2hufH|"Ecʕ4Zl Ο@2UܤcPV QH#,ZG0& WDEȞS)!k6 >Yif: 9o6>JhѪ('g47gʘ?G2Q=C0K3U)R] &`=<-VT1Tcd ._qIsQIP |0PpAףy$t\b,g'*1Mm w56MJNXpd ;A={؝Ob9-nHғhl"_re[I:R"/ik`CRGu%(K|LYK5G[[1 TIiIDE~:jPB}(ܢ>j_H"yJmd vVSs=@ojL4GSJEj1F(ԱdWk)EPu'BO9dQh>L0#S{C)t ;3s?ԑPZJU%9q0ޱCGͯ*V0zi M%h=KTm3%1X#dp րT9ϲ>Q3ILČ1 RS^ڇHf$ 9)ZMlr50&)~8* Ɵ=0/|A;Ciߟ߂Ίʫֽ9;{q /=_7ln\B,`${,x: ~$| D"~ ɑ&-3f$E9IzC<pK^g❉HjQ1 ^I"RÀT?@!nS%=N2e#q&/o)! 1*gT|[,Gu=~,HmQ. g0q32σ Gtq@ &McݫCۨ*#Q" @'F_NQ]ĊQ}0,00W>1g8Ɩ TU! ;-=^OU9T'آs $ ` +Pċ{NvW&r%/aV|{_YQM0~O{fri]Ay&û#flrxƝ 9,q0"8$pUH?K&?K=%bRݡ!) s [z@5Һu!u' `3B aB<=¶3=igFv/4YՅoZ,1ho@e&(AxTU|ɴ뗺vɁ)}TVu4It$  IͱP`O(Y@O*6*?6&i c ؋%$vFSo%x_ ^x-wp'Z O=1|ܽ8|Wq@ˆ1Hr3?Y qO<jN^[d ?\ h% !BDdF!KᾘL.Ez-T=v@ !qZAWP@SIqP. "nTv8c.`Dåz.^_(CE_aqG(U(b%`3 de\ʦxʼnRu8P(C<(R=@bT@KR* S4Gū(`/R36A]J˥Dy ˘#Vq{u;yFyVAhSb\T%h\) lXI01`lBpJ-}#m+~ex5CcaI*F+kӟTz9~> P?p$*ϔML\OƦSZ s-eYfwOB ]ؖm?^P'NY)]O\WTr<.T.K<>:0%R'0mԓ~zr- Hcjh3g49Pp əHC5d(p>+fOT>@ԇk6A(NjNDCI x |,uX㡚4oB)nzΐyj@?"9A9 Fˡo r0~~1V}Ous_c(u8}sjulQFg\D\Qsxx{k@̸89)k-eR"ߐ^ @r p{/o3~?=24>? = !h,!Ҍ)&A0aI LQOpD1ti`"A$.%{z},IARcC3Ni`OC7"CQ* `0!y!q)`P$A WG0 ^x8B YWvlic 5 T#Cu A9I B"& H\ңOK(F! &/J7N={R{d6{`Z#$I-%SȘ4Xy2ȻT4/CeC'Fΰz+`Q4A@.R"{ ! cFУ# sy%I܅93!R"A sž4s#ls\6m!b"@7@$ȅLAL;.1 '|<鄃%i'o8NKJU9؈rHF &I3r7Az}3' %6zzPvl]0+lkCpH_@ ԝ~"uGTE5Ͻ4m Μ!n̋ĝ/ q3C@柃;˘gW{ |-uvS? eҮ `O?$sT#oפ`w.M؀'I@`!꒖ A(rw9ӑ*XGlt -˖! Ò'|[~/\! SI0rJ`;CRlދDɄKmSh1HE$JQx$e&`n0=|X; !Ӄ Ix{x `sR_)2G'z|Jx'*R=~/'Kr'02\$IӊG xB%Y ;{z HǫNhMa눗C18IICPsӗN$9" IDAT=;l&Qԕ9C7HIg0m6)#Wj aPRd=湾M{OȞ1!7}G W+H5va865=@Dy[$WRO_ M*IDI r)(Xnj8ȄgA% &w9†.X;6vkTZB{|~pփk?C15qҙ.&`чԃ\ hx-ga ]KѺyJs!R@= zz3ޏdC6ʣ7pVoVi.pڤ9 i!/< wCAJ/|vsgˢ_Ykgw=D?aONM=jks-Ҥi,h Tt3 xЈe48q1<`T `g%U"`-2Ij4HH~2 ,$`QTt>]%&q@ "NH}T6&=rsR 5'QolQoBEH҄ : f2R.f~&dD1==a`I I@ T2RaH0xԸ!A8ax4j! ҆ 0U9D@;x'm' 1=$PH~s;2W?j. P9NuL&nUpǸ蛔 t5n Ǽ;=%̝='Y=+~?N))N(R<4q<*)#.k|QxtvCBPF{xq3OBpdV/I}l>PpaIʥ9c~ogFk)5Hw@> z ]-ڑJ_$\ga=(kO}y5sC {JעmaC{XD.`m U|%Zgs`'f>Z47W`/wc!\p?a_oAwpV8>zۀc{޵K.4&GE+mI>vWXݺubVlvGG-HӄYVƒv%(vQ=ˬ؍5m|R=1W"ؾ"SZ{+O&nwY}_~ݏQmw7=f이 3U@+U,g~7 ,ʓ ܽMylRaI~"6l=of UvcVG{+@#M+辶=xX?`5Ig.NVBÖ@A+R=3ʹ~Mʦ!ʂ }|>=)Fc4\J&[ۥLbb "y[l7ȶw !DedS I?ds>nv6 C2v~F9o<ԉl`YYW0" GR\ $hV+jzPU#9cvT:cժƏR#[{تuB }H'H5ޯ'chϮwWuNEϪ7Ym#c.f9:T>B%YK$2;p`> ;{Sgk@[PULGyĿC.׬Y뀓oS;vTv&y֜BZuI4l^ JBνYгzɎ;iE'8epa: 5N9"+3j/每k4_<ʖEc2K/Z !<Œ^O kZB.C򫯷d7:\"U&UPF5AK,GRa6l԰V .ӯjR1 ?wO^+roH*}U@pف@x1_|a]zE'WVkۦe=+']|EXjG۫[RUl69Bg+ ݐv=j֮]ju+.Suro]s~wǧF&CH A O5k̏gKڤ.sQR!j8 bb̘-JB.;eU+L/?2RK/ uv!BB0eRE= %)&`4͡% #A6p3G圲O@bb_ծuxeҤm16W+.]+;͚>KR_}$լS`>T )_ոbH lzPO Da}^=[3&g}Tbit?,=%_o:g26 g|5-Tb=;7-[G{'셧{5'?npu)IjM8 3M7@I)e3}ꆃIp?xE@E荋&Y2UmI~mk6k68| ^\l8D.U 0wwwF+e`mo\26TAt>7nw>yRMAehQm\'Fy5΀1/v2 bM}c2pMJ[W;6-=BˁkANN@ͦHL߃m5vێ֧+6~'l/7`NY&M92=Ӑ6S@WS"Z͞e9ƚ*;m۶nS*|EI[zFl޾͖Ye[m#{>%_zTh_4T,iFUkV?ڮ˥ ;T)i O~~ZJ1 <@#wdy*]rBTp׌%E"WQ[vbQ vc/VD99`x~rڶULjzom:r_ 4W+f&۳=B܉Vj-{᥉HR{wJE.0>O:nGv7ʵklɊvx"PZN)f˞nw丒ǯ\mOE<;&N}ʒ Sb"ٿ:knKVtdf[z樘lVZ%&e?)Mݺ-l٪n_{.۹umXV/]n;mW}x^x~JzL4*:|(^վۤP1tdUrBصǚgoWnF۲eO$J nyfjkmuyz{H)_~fU7ߞutzeەz6f݁-T"6aW JQ0h,SMU9Py{ ?l5'nҴ͛7ZE^h-@#MU9rZZn գl\Kp^ZzVnݺԊn*Wdcƍ6<.;z\+Qc:EUh];lO^Lt7u7ok[햭/FpiCr6nbK)duf;ͦhSQ¶ik勾kKBxkdžmͦ ֺٽVbUR]sS_eIAÈGJʝ[6غ=,Fk0}Ծ\¶I"q ت5!ڰkop>M>:+س{Xk?/+ll!kis>v_{i֣5g)㾖-Wi[p4["J%4e/^k3UK?e*{z.^TSl^DrԲ_sO>œ>~K+׼IRȫm1P9Y[8V^.RˑMacwUʍK/g>[:ۍU[,Y|[hGtkZ"`/Ը=Tb xÂ$kG?gujW_lVj6fxok٪vJm]1JqX;˭~F;J,b?dlPx姄h}LJ"kX{~lbw6 ex*J\]i+VFi&Ϝ.'b-3Vv-;*gV:k(Z|P4N VvGvKV\q+:{{t+aݪv%Yzu-ryΜQi&Ab0ɻ jsa-hvbx.J}~M5Ҋ+[2gn.- Wނxvp'e9 ٣wx&il{s<1]|\W~#kt]bڽwݧusUTT9=4~nVV8o^o婠~\Pc$&*F܏[X\dQ\qP"E+8+&UBkݣǛT@Ts O@'pGeњ0V4{if+Tթ<__W #FZ[RvlǮ6pSV(O>[5{əfbCݍKZÛnFzڲrH=n/ y.\VlN DTi7r(KL-^H3͢Mj~;TR~zmz.ୱEmz_ʻN]\yzE b@3M+&p"!}:[݆,Bƛ gj޷v>I#N!&8к$-yxvqȿܧ:.-eJ߀'Б6Qv=-l3 !g4dvV6}:yk\Ċ( 2IZxf3@C8#%m=eZ 7Z"EM;p䨃P"ֿ#ֹӃ~۳{;t`;'vjo9Fݱev-z~̊or汒ujYUl$t, &J ܽq\5ڣPG{#?e :[X*[Z7Xf2Rj*-3fɚ*Uj5V*ԍde~WQ.<\{7}DIvV_{)b7mf+jŐ{[V?{gvM+$g[B9-{|1HJu UY 8jW^V h-[>s-߫cj"Uه_[l;zLzS,yJҽ9EE7s_|2[em$8sd5no)19`zǃ }ʗ>xzW7ku=vLQ_cS~[lk|G \yDoz5jmT-a\R5]{6cq96[mYv~P}l$HnY7g61W_۪m^;N;梁8-iR[|6՗mljrUk•)cO_Xl m3 d.WZ "Ք_α/%yQ7`7nKب6lѢ<.swuy/>~y]|C kѵ۽NKJӧz6tMGYRE*KཏT򴩶S9Bwo֭Znon\&m~> jٲd;oo;a7VV_@zQŜ6G,gK`dY۶lՠ=!0;)C$ Q5B0hy̓-IO}:j e)\o=p g l3w߱b[$9(@oiݲvoj+ڠ$]5)twm/)F>eV%.:|g5^?&NkFidM<^8Mx>j>ucnևN#Z#G S>ҶlRSzÐiSּysW.\&L`ds{Wf#O8y(7[˖ zm WVJ)O3lءN?sF*oň6e+R =߯lkҥ?۬fZƍoZ ް~*VڶZؾn3f=|$n`Nͻ6kV+SP{ݻuFmm$Z^wޟi3?a5M…k3c%Y4=rmƞ{e-=uf\wM I( K[i~F#ywD%EkSlwElYmݚwcw,A`pW*do-^f[Ihz XNgߙj.zyrE'㩾f_\fdKbjW^6H.wt, T+W]g{}u˜l@iQ=uΚɮ̜6!K2_qUk73jM_l5+2R8~β7jTvk hWuK%nHMq,XCGߪq|WR+]Mj\aIaSq Tw\+Zzl^},Ʈ=Ml϶<]V EG,A=+[^OۓXNm,٥i[yb3]caU)E^W=VRv*5< O*I`Z5mb7WjV99ر/ZV;6I}[ӵ IDAT.d1NںڼjW"d|mKED-o_`s5 @44`QGf=tT"6֮mkСuj&>xwUX-ZoIίSr+|n { :Nf|CڬN-BwƞF˜$ebq F(5,꒾ .ھiuϫE@YM`_j2`5-l΁v[A:{W_voKmW~e!ٻ/p  $V/]vJqPmen绽8`/K,&] zWhkܲ=!{vp_3e[|gxxs4"UR>NIJ(\6O˖[;"^$Qz'75]?g혘0L7YmGۜ޷ƿYn,(PE*εZ!mWD)]LeqV̍j|V a}wz,!)hĜyȰo{s{}  ؜:DEG+/lO cn2h dNzwT/yK=O:_-o^+2:T{<|j}Kv}2Uo:to+9;#`V "57&Z'mc SukC󉾡zg +2Cc$7m۪Fg )qVmmslբsU5w-bP쩼6cD<_%nELKs3_sսuu x]=<[q5=D?pHi{A1;٪f+W=h/IԆZEGGwOdL |^H[>~8!t$XĶvh&;vhسgڽ϶%+6ڶ]|3΀ #`8<'2,lչZW umk쮻KF{z .lիWw7x`O\z5 ߻w^{Mnt~t;o6h; $#JX +i_x/OɎvl~4 xYtug1Vl+WtF ׽dѼ]֦{T)YI5:ok]UޠAOJ{LPnƓy]㒟ʣd׹M*VrYVCf&jܣ؜/?ּklϾ0UaXٿEENv~^jՆ4ӱE;P԰ RQY#BRs`oUK;,KRj4n3٨(N&XZ1S&1UO󍞻`ﴵWTaH*e}㝖p`]%},m_v}؋{d/l;$od;#[qfʖhSTK6wR~ F~$Qe}׿|_`/= +eug\wނO>Ç"-klVL)r|J%ѽ!7#g6me.Y';7]Ye˚:wx@E & oWgnm@{#=s@*{ i'UH vk_]=AgˎP6h`'<#ڪG\vwV/ƾbEĎK.;bJ7 t? 2Jx\g3C`O؄/.j}_ ٝXZhaw67mfMФY+{u[r ʐdS,:/R8զMd3fL^yY +;-׆ b)L`;gRCn89v-|.[ޘ9[]mPMoF,U rxm8s]f{yxn%d@m)7 mTH^G*mOwɖC`orذmԺ! nݦS&$m"٘H[0k=a{w?#R3 x7cw{ض "QJUn%-׎?=xyTM=a=;.VʖTJxnȝZmcagL cی)˯O%7ڏ+XF3Þ6ν_yXʼn0iR'E>=ޘ2""A6sE=q| tmҺcOkФmy^N4O?C hz5ozn=ִv۝--}ݶ> L 44N& sASZx i>%+Zc>Ekl^0Ɗ+h[p1էC孁g-[|6OJwѣr?bg۶,L\d{:pU%`k3zS_%zy7-l UݞAClٮHmmٳ?{jI۠~=7{ؾyl]{ѭKW{c6jx+^HjmN÷l,{߆dZ!g)c";)^=7 =r6mǷc,Z*uhꅋVz6՗,Z@@⭚;okfdo۞ M915hfMcCls5DES?5O)ty̘\;2e$u0O"[F1FZ>I!jܖ,Y&0""%T:0+bI"hLTO>$OhU! ⒲.]Ձgg"U] b21bNƫv}6ekvV@)]wn_aE籲1JaI^rl~ر ;ryRIs>xr+h=z 7ŜFGP|ooź=G2y)>R*$f)hS\'u^B|N]![4򎞲w7*v|Jioie*Tߛe!Yv;(풺N={ZziqI@x7h'h`@FX<ȬfGҲ㼻zdp"3.)5z 1DI-%Ub 2ĝ4B=4zHPƍҚŦh'j뮐- \%dNWBF݊uBODF֭_Xᢅln7U,Y2IO[7[qoQr2}$ƽeϕOҮln^1 VB˕3Kړ$)Osc4?ew[igehяdkWr^qqyX՚ei@Uxt/LIm }=q̹d0j]=gMEeUUԺLչJ9r}$"6vld^k2Cp{vsvCE kќ*br&Ϟl]B\j[1ٟ|h u~e \n*EH)+hG@ 8 >?jz嵉VP+z=ӎkn'G_4I^rSXll7%) ' <\i"ua?"fw/Y#V% ޭېiǮ0 ORn5"% n6R_xL>@|`SNu9r/X: |,O4 <2J>ԥ唷M7.l' ~j7uAִi!á>[i#nVA@/Xy =:Kz9ץ%-#u꺵P" ,czax9gV =ftVUkm~nG)dYjԬb^"/^]$ Ԅ)SEJXܩ k"ϟ?JWk?zT~GX.}KjZyZd^sÒ׭ѧm{q2^eDg`0)"ұb."0ßkVRڅpjŗ@DrHE߻{ujn6n߮nRIyFۻ~*\umQ9T'/cy K!=|f:F 6 3,TLj WT2 RU\$)cqR1b_z#U- N;/]Ξ˭;Y҅% f˯ :?qnow\SO_Z T/Wޚ>>1|y [ɲU]0w'cڼnmr+[ XΞYeCM=Vre*߰:(< wc=`vv̜dq.Aߥf isL6SC FZ0K@V^81V jVP>bNJVbu9mXzێS=;hz}**b!{z d)Wlb|6l=6)8i%LZ-\66u}t #\ycVDaۭT||c5kBqO]$u}XkNe.!7oԇXHMd ,{x %Ϫ_ };ͩo'IL<ׯ:P=M+v't|dɒv=Qb! R99Adm*SIQb?)`YѽϦ k 4%ZMjrT8fuWS>]6bPeϜg Io؁}%[_Bl2vlߓ;3dpp5zB1c'Xms;4>߷[PdHٮND~cڠQC{axW??eIH.Ӏvv[;6nu~ab;WUX屾ρq ,~^ 6ԽYZ0($E쥜grgbۋ(\`|=^a^6z{"oզC}~Ƅy$9l&$F# wE{.$; {AחEOgͲڌmG2?'c= /> j\R1%'K)b'7g8R E;jL2IZsR)LOJBtĽpC憱>䰯=0MI8'&` =G]x7HU\Ɇ(.8y9%SQ-CEjhy ]JN#$:io`*0UE/Ij8 h``Bay0iL3U+jb֌A<>Ǎ3@QP;I *3$PgKh%礗Ey:PX0Xyjd!<,NLJFwJȻջ>'u )qh Em,(q⻤ Ra!YR 3 `Fz ?-M&@ 6yryxgnYw|:2ƾk|1 汗/\TuѺi%9|^hkw~ c _ؘ>7kkyds (^_6Ax@B|Wz(/r2\`̯_7!H#;k3/sGhk Hֵ.5N&3) +QlMaժ(~ཊuՊ,a|/_E+'Mdͦ즓e' 16Mg ;XS0O? kZ/OTJIzMB(M زm{e9|W[߳M g@>`L9˪qc'ێC`ך/|\ޫ$EߧL_xe &fHBIS2uƧmFV z ꌈL5"i>8l`$ S} ̀~::}:QS~p° Ӡs'^g}+̝=Էg<D愾 }9c`a|eB $y ߇6Fɇ~CƜd ; }cv,oʶr2q 7cW?|}fkKlص6]}ՕJ;T*֔eۍuز<߯$#7O` ʐcbWZQ_wmBB<+C@AYIRɆ Z؝ڄntPh1 U/0Jj@zlacpT<:lbD ԃY(`vIK]`c GT@S 8;,2\I]>A.\յN>Vv)0\(x+'2 p>q h =ƩuHWR!~I_K=O)H54f$96)ӊ/IV>b*тn1 27?d^?6r0@Smqq&?`pՕK^ %KHFP!\@RohPS6K/庤COٴ9`fHX` FvBvt!H @B`G}~7 ۀ:3?~\;] %՘jaj\<Q.̜ E#Ԗ.uG%cu%K_@Z}ꅪ0`<(h() Una_423ϱF\*/J_J~ XH]6klIJU4Ow)"4Fr$#/F né:#Ic¸` cs e{Z h;r7̯ j\MpA_8u"F]#/>w> W !كA{nb *:'zؼexϷw"уPF^"@/4ى D"0uҮ:xd f0>L;P@`fbH[5VrB]!l.ƃk4bH|s3里ۥ~K؂s@`[ Ya w =3I2ڋ a:*E)TW(@A^Aҫ`E"Hd衆 %ϙ6y lorٹ;gKց)"zxreOM.l#4%H_ "3c<}HCy»@(xm2tcI7W0:Z/}ƇaŒN}5@M.#Y7y1*4EPpԐDΨӎˀb@ ۩4EA&u'RGq&E Po>SC o,5l.f]\'}fgl3m`<5}߂&#z]Z<#@?t8<8Z#-Asl9>kG1SЌ<}^pm&)ҌK(s/|B/SB1B]ϸn@F/#hF38?&3h2-49%+㑘)ѝ GTGk?0vA <794uo^W)7ǽt}݂=2- 楣)-42jV5f$aLɄXt@% ⤫;7&P5=sԨA3B B>!љ&\N8ؠ9ꊘGW!4)XVab X'DsHa he{M Uw<+;bk"'83Bk9G@Cp[8Y3HY>c={T3kԎO2Z :;wQ0ǑO’YAPD.}njٞ䝆A>~{y B> + -DÑݥ%#p;ize=4۲N;I 8DRˬcYH# IDQcF:M!M&hpݎ& A3T;m`_RۅBa&hMYBfy"$ b} ZMQ~qaY@~G2`!z^#A" 09Fu\y7m7 g1I#L a0hj9{A#â/. 1L:o%p3)y^`Lk-A+\BB-N+/I,II -0\ևsaBQF*+-_|j r-u;JHfue=cl)U I&fUm 'Bc QM3-Q4CΉ-aPgP9O/&G>Kϔ۵E.E@`3OGSˈZlh" j)X_dFBa G0PDuA1WlI5g&rԴ= ҹgO7yb4*AJs' 􁚨ռ~h *@A= ;|Fώ9rd>]kYѝMF}\8*3&J}bwR4_d 05 j畳L2ZDTR֭Ss\77ǎ@I֭y!?^FZH#`XHj6l"}L,fL:5k n7}=jrRg }t`%,+` =A-|y} f8n-s;&M18nsx7&he8-r,m|of`Ν V0R9eUr\`n,F[ls cZz{`B2-}9rD? O8b>D>Cz!lרY|I>Gm2Lqc-(D`CdL|sRrJ&bS5Nh:e<AL3('N;K6g>Gs ,5Ӊ|(yg/] Ҁ3s{_}9`sҐƒv$2O2P;{)xF  h HMP%x H7mȱ{]fh'"j8q32#l `>cyQ/O}Zr- c/ ,D>@7:t08B|+'G>b"}I3fr͙M7??`ʗX\gJƝؒYIܹYPo8vrǝwK>=tLONc;FO3vҤv%׺cHXrDF~M2f*yn&믿M.,&L@ߜ4S׺M$4 8_ȞGyr4Q7P ѱSz$9tF a/^mVKU|;"R|NG>SN3$V-[,J^\#R+U(EF:5dيBfz5=Ecuj4, }r$8[4I7O?ύ(}fuE+Ea1θȅsYg}>vۣ & =(<U+VbdɌN,\%S:t{WЍ! VdY5G2+*/V{oڴ ۃ11Ap^>!/˜`aW91r"!D(F-;:C@k[qy`5-vn-cΣ lٲuD=TayDl $C%k)3e-}!\C~-+-: oooX wP2|i̽}wyn%(mj&ͤbjzfYyLTj2 ']& 8*gq7̏LpܺQohw v"ټm8Y7Y-kg:9x @"`ւC#N7f줰Z-:;N5ɺ@ٵk,ЌKm;[<$^^^Ve9|( ;'F GbKs!l_o}f3m~E$>>TM`]a޵o76Q^$FC,{숯xyomkzmECLaY`oH~zs IDAT>4!=2eb]ٔx=v޻\nزU>jv=:i~3kN/Ё(m~43%)vHSws F4+ARRIް 1XlgS-.Fɩ@?Աl 8,I]Ô \6c QTXb_lh J֭}YS5{.7@V*;qd.^)e*הyМoeέk_JN`=)/ͅɥ܏)o:tkd#rKЀ),c!Vy#dcɔ5mP IOɬ?_`<"TKoJ`L̐W-w,$ݿ&ǃ!Z\hǘ2Z]ćBCwpF#'w @*U#HKEpCwyC7y瞡;<>0ZBC/@UJϜT-SLFbRYi^# u*UHSncS<۶Fä8@+.5ԗȳ/U&ZtNy%y`:*'Klgӧ 7mO1dSjѭ a1mRp [[թV [v&[IJ(Kd]F yJ%FRZmR%L{5P:b/'[bʥ@"WfjO$%!n8՚4h)i%ޭ+gd֬9:fnln}V|!Sq;w|a)XIH^[tGͿ뉓'I"oRVulWNxN~< ^?/;kn)Xݠ^^`Pjױ?胸+O+RXz*!01o`Ilz d͝:آ 9x8@j׫*Ef[_ko&^?]*W)вdA{} fC>wH޽T Rvmɜ=4lLf_ u6sŕ%JE&)SH5sEiR mуvNm矓Mz,| Rla(yh94{OJо`q1=wʧ?2uZȂ5[[#eYʃBpO0CmWΝU-(JYϟ?_N۫=ޢTYO})O=-n+'AzN W]g|9DRX^A`]1"DB :a+>RX)ã], ֪*})LP%Y2ÕeOUpQR2xl< Ld!?2QEZkLJeajRf)oOI`PM2YV$]z#!H( _yY2eT?ԨQK!5:ˉ bb>|j3т=0{ NC*d.c{+L1efwA;oy. ~n{H֯.頱?wğ;)6K{h?ھR7h`_eɗ7lZUXW3 8v df۸cA 8#UnB) ߟrE݆ȶkTl"u^ d/HopҥnzÏdSeߤtvnQԸR^=޻_@[F91*niTWd}qyT%`oyR\EfO#gM0ug:z巩CV#whl^r'9Cp7 b˗&vMh#{Ν~~ވ8<+7yI U$Gҭ^D~4^ +rQ: `g!Ny$_Aٸu]N (kVʜ9fs76Gw^k/sf.|,˗F)M4;ҧ~_|>7_{Yߒyˤ_~۽(ח >E9w'y {'t)ir[l b̏_J̙џe1I^MџG" .-k֖Q?|/3!uD =+]Z>]Aߨo2<(-h%Qj"uE}!9װءSLh|ʽ$_NJUBI'aqPY~?M )!C>پz,VBz|-Eu NjҨmG)/'d 4gto ?W^\#D`^xAڵk'{Lm>)[nG-5_?; ~װ(&S'K$Θ =w"{.2= ߚKd_ɷ_';tUjʄ)4 ߝ[IZһwW,RЄnͧ8r?DHsD ho cq7?@~Dbj d69tphow& @!45}?9@BǑ2JɌO r@0MIV*9%S0Bhݮ=ihۂ[r!8)/hBs.Mܾcd˕[|C 8 ek$> (pұJǷʇ]>` wHޕ'3UV6ퟗgyyFG_O?'.ӉZ}`.f*Aڒ?#r8 ^p,GT+IqҨa}h:!hxQ! se$ syeh:UN"`!f+V_4Pbҭ0%Oނ V||TFבdQ|93fʎur𳣿b 9iQ:gOhU/44T`\ˋ`H<ɐ=|835Vhkej6u8>{}wNnsarAyNjL<]IA?Mo]D@ F~1\dɢ&NjcW @UW^|m4XioٲdV{3}lQ9c\5WrsA {_h֜ye4Ywi9=Lǭ}9D@ܹ3KՑ`\؀{mP[t6 ۇA PFDSkrHZ=+)<NJIUhI{$ ":PzDd&^{%癑QK~+}/'! "! >u\>TҬY~yQ|0 ĕ+K.|rE a_e|D GuȞH'r 钹h6n#Tb#B1>RKiid|Zj[wJceD3+W :o/ckIY?0sGg۾ +ȑZy}̙Ip.N (<iucuCTgm~?wX .ov^&7y<̤j,9J"孷ޒ{Grv̋L&;PdRk|0SD" Iժ剖/l}Ǒ$|cǜ]L\ 0ܫ \?[~[y(w>Y}ECS=zJ=%4[\)ɚ3KBRp]g0F G1vdeWq93P6s!mDՔ-ZDI]l0ȇ>=n?|LӼwߟ҉*f[.3dQ } y7{:t O?0, nJ$zWJ+G~?؜'!WN/-+Үs,ӤU K0Sd7+XTz~9\TB0R:O1YSV7~*Z :JLp<Y8foս'Ñ㩧[ɽT0a?="BPX04iD{tƎ(fn8j4/|Ӳgzr;\]Zu!Lz ~S-L֑#y|$%jPh`j4u2G &?Dp\h ~ Y'WrS8 X7ycmŌ-#}:/]xNڼx=!JAɈPO@+tVVZ$= `s5۷o0ScJüy쿳ݜ3m\rȊ+U$BɅhŴ#?Ar#+WU13ɓ'{SjԬ'ϽCGz/0Osw;C*֨(?A~ME~8E> 52ZN5vy3ɗq|h˒k4.Gck@)(W"G$Xu+XUOc& .ڷQi9|p,Dse| ?'%gWL,j{p-_ Vl(~C|sv7Eo ؋<jًCDz}ߕʑ [w=滺V&xh,̝,yBrLS/@; oi;g0ɋY9Y"ݡ 0'z[ODkP08@мySJ3ȉ'ԗ8  ? 3rϝwcK%k8ճ]}{]XVlۦ= c׹RpisgM %Cʧ=j(O-JU@L6OGaAHc^~eߑ ̞N^D{Ԫ ˾H Cˠn0W-DD'仉 wɘx?&;"Es a>?~+ Ր1QS駟 " @hh!b$(; @>v dm7LKmRHӵ?EI={0A. W"f͟4-A;_.iڲ0- ?"KΖs8WcRУ>@ߏ>f]9: C~&MQ60A{si4id$~rvu%ԱrOG[\_. pVIZU1|ZQN a.Vi{O?h@c(-j5෾qW9VV\p7P#G!ٲe\}Ȧ`kL57{|{_IQ:\Ǽ{Ԩ (}ϝ=;]?xyc2Kn`@r0_.ɓUHS?A=25W\Mna󨴇\sɎQ2bPIwǃ2Iy D+VZa"<㘖@(0-3&(٣SRT ܝvp[ Dɝ K3(t-[Vf+zH>kuB~#|i˫AH^u+Jebh7EYWI#)#hD򚮆N!{D1?ɕZe<$_m/[l4H ?Ns1_ڽS(&(+U*/CI IDAT D5֪UK5}h$>VaÆ﯋ 4A֭xp?X8 |/ ^}>*J(_Rs.Ï擉3@?V%Jv!!W#",(kf*h 3i[@y=]Fojm]&:0)z!X0E;AXO?>iDsV/|KwWp`rh-^ڐkGO}IZ52TB2d*۽'G,6\2q]knQ_J`~"٫Z~xLMrw9RTJ-#_ bl߹^{ 4X{!Y8>sN2Uh7_0QaR}$ ca:@SU4'D&OS=T,YR#hF_iz}y"r,Ć=z$)To94D*0ҩT__Sl\^i"0QQb|fΚ&*9J%TGH>j _x 1USF-Zl WK3{FvƑS[.ǶHZoڼKY sv4 嗀 d3WKsvդM6BpǾq_`&?`jy yݷb)\O} i8pP+R nR Zgشb4]]z< KIٹTi,Cd_`5{]{w߷ {e)I!?e#:e.3̜xųAP'fH<tHV 6~NmpnZ$lػQok)=5uBt"澍ъЧ&.Y->:b 2mϓN4Py{L]<ܱ-)X5{Z!h*M$Po7;@8mt@[D=7.>?4 A438[w @وs " Lh/X."9Ma0b5s4 us \۷HnW2BLTQxmdzm9mxx-f$ w%q8cekB[0D:Ax0hk).`zys0cbh?!pwFL2@O|M{(|ṙ_瞱=A5;M¸wmZfJ9^.RXj9vA'' Gb,i''f]|?}\v ~jg1㹷-44xlv%`,S4;f]*!6|Y7{8itP"boC.7jם@F/2xߩƽa9f?NwGg`cWFur>f9c~QM8w|/ .?s[h#_.H۔K7o͟ 7j#'uh2Hzq}qc8cEѕ.Y`/J'J8&7uثS޵JH"Zn˵:hkq~H{K?j ݐrQ:vs4.' N4Ɉ$M&%LAw|H:ar YL0r3jau&WL(,cZF uRqZ7Pљԙ0k\4  AOwA g^A`y94!=z67o@ O|?k!t& 2BuR'1i:8l_BTQ.pDt/$cT9 z R>v-xw9T)-5VI3LZh8ʓ,9 ;]AxhϢsAONf[Y1;AWnI{#h+XQȟuEAs^_S ;zH*W*SهݡLЌ~|%w`/cJ_=3',vd~p1;9؋j"z>xd6|)w߉OxOڙ#ٵ吰l /k}8|8ۋ96^J5}6w22PG&6,j7 : L'i?%Gk5%K @*.p/{2UA,VFLьkt6 HVՆnfqS^23a'3u܋B1я,q b (hi*Ф!dn'Jy~60XD5ڎD &í'&R=\s 8$Q{{ ISkmc.CS#"KK>+r} 6 Q}Ж@C{Y5ݺ {p?@/ClMASh.I; Y^Fs@ xu<35 ,PG!Ms3t`:9wz{9֤YPG b4~9ϐ/9&hD^y4SGHeeU q1C^gݩR3~󛣦!М$y2|0yp1B~ϾH3`TΙƔl4s:ffFs|8}9C#. 8Ϙ?m6_d@+DŽ0V3&l7y`,E 3P#h,16=]bL\(F|v`ɓ;u?=.?Y pn`PcDm9iDLZr_꫰Z驮" lsƅcb˿C[ e]Zbx|hKǾ ꓯo,A> ^d`1Fb8v옜@n+{{W"j\`RK`o ߄kj.XL_N?&{G>V>\g2mʉ'dh֌1VRB9тNgJ& O&*_ %_?%i*N4D#4`N6vSܗP9B`'-)}L~x?I<9Lq¶iriNy|gQb1ajޥ@OKֆɏfpXޤvey/j,N}I4X{XPE$YYMkp9/|ŴG>zo\1cc׎Eb7GݝiaP (}=N;|CЖ0Buy@y6F:}G f3Ijs㯼❤ =R3E_ c}G3GW]'?|I#jY?us]Ǒc-ۜR?I[ QkUB"KyJW |\TȗUxN}5f\e̸ a9ďSXX+7qjGw _ Zؗ2[ 篞Y {@>Nw}pL3yG̏߃~oqGK`q Kx̄5.#| J I]3i'^msc9Bйw~S0Hb.>\ݞ't5B/<s  ,`,TB^fq#D8 0_?;0Bulg@r Уv&Ҽk"}o׏#ޑ>wC{ϣIloBIsƋ@ Hk+G f Xv==7O7(O<<@Oዤ*?G$ڶ)pξ+HgO@93`н.;qK. x0CKȦ{Un܏\(H7>fπΊUIU|.W[:ƒF$; V}&'^{K%?] '=v/e ʌj x޸N}={ H>a&߬<\E5 { 898pEGG'SŽ408.Q3G!1'XX8] vhvd?اuu%6q<?Ƃ縛S@{U-.pnX-!Q'! =o<߿OÛo羺x6cYH's^{p|S&U_N;|NlSK Eoo[+l ha4 m=}>o?. tpusޙ;sdtuK8FyЙ_9q4sqo{::}uN{-5jׂ3^:" PYwѸ&Pd dgrMY+R>{0HgeIW^|"tTOQ/yiU)=I:Va2ͼ{5v( M{ q$L?ΙDzxL&5y' \ ]NSgjAK:`/Voz *9$9}1S;|f jHDMj9p݀ ƹ39%q|: 8)'ocq[zT{wiIۓ7cߔS8w~t痔i뿥 q-WXӓEh{L+pchn:瓃XiZ:d+ ;1,G^T;#{kkuLI?|&5%Z9EA,–[j5 99qKf& Uq]ᝪc׎rȭm{{0g/.P$y?-{?Oqo|j~S$Ǥ}=R Ĝ{/&80I1Kg& % kkvM=N <0D8qNDZPAXBJ7tIknB\2@. =/q\|x~7L`'qI6GFd^}AAik]v"BGɊN`cu|{ x{{&q dݾyVl:xD{?@#Y-Y]y۸^Oۥ s䑬We'[#epdL fL;˔[&(#wqH ;S6m%e0MK'CqLVx\*~U9(|EŽ "yLdM!"^U]d|w=R瘌o͞DL1sP\qŽ>(*='3_>*f2K& 99.Xeˌ 9A@rVѦN)#s&Z@5{FXq ``! q%D-+Sƀjf]`;%raDRP' tC_!ZFJu5phb{9&"\#Itvyc!أܘoS7}"?`t=k`j 3>kWnߙv{;c߸@ KrΙ6of$S:Aڙ鷋Oa@;5=w {[]w4{ G!qRpl}'TweksA=$O*3d6'&؎2!GgIY9R8kQO dڛheF%Sá0cc IDATx,aLӽ)3|6`⹴^}^Kƛ.~| 0t5t$&-SG X=n5|w3. c~cJ4F5o~d] vz:q"?`ϙт(`:R=q%c,2{Kc"G+y@UcdL5iaQ3G$ ] s!ޑ<ޫM;Vy9S'97s>S[:>XF\[i_j:X:F!m/•4Z9d~4iZvKBkC[s0Ϻחw{?y;L?mѴ9x4ߗ9&>x{oKv욒i]KIY{o ?w bKIЉcs$oǶ^1]|=F lw.sH+{yP,[Tjv\n n<`y<鹖/["'Xh^*8zj|\BІ;b'yDy4{ØWu{L=Ӂ}m#[tNZo1^JM}=}̈́u{';v ,X<<-b6fǏ&f/k @ltjV,[./b3. 3O&\S7# >71c3MY= Ӧ`/y5|,qN^xbiVy|iA}l|Yw";rT/]&k Zb]BS."uGk&K4}}أ40^=%Jf\c׵GKԦr$,cFF˙3g$""B"##DDEJkQrK4}}أ側"$*2\bO˂sExϞǫ@*PRE{ !7n K֮]+6lв~I^xbipd˦Ͳus~6lsaI}أ3OX:X:)صC]eU)KMne)Ng`eϞ=3's=ZZ܎<';w۷+sk.葿m4/F ?w7_n_ , 8op[, nO4b 6D|>d=O>K+S+vjXcͳžOQyBOKc!J'MZ=jL 3@#M[X܎<@G7Qz4}$7h{ 4[h)aoNU D-^l({dM22l2Z;S~|_&[, nSHhI!/"@h۵7+|{t4ihݹKvlf}Rؗi \+)ʶe W`@ A[, nG #: >_҄;XyqceyYfll|,Ll͸RgNGJȩ!ɼ,kV9gʌӮ[3o3m4=y`SgΛ%̐ӦhYb 3h-Ijf--,-ngF&\?ٸaROhx=А`ڶE0.Wq\o\۵{GKۓ|v;dǮ;wȶ]^~Vg5{Vy hV\nKKUb_(-Z@\0; {85hp;&sa߃- vܞ=z߇=.``p;#[|?vģ=d'SQ*N$,[qRYj *\v偕Xo5"l4<6yK,eK9d=ŷ{bO&qE]} @K"azJ H=:tttHKN215sψ-iܿi 呋BOy=he\2)r U׶XQwa'5wYzXz܎<@zFvzy=`8~s m,7mн{m/\ {sϭ[6oT'Ow$-D{.U)@54W\9xd6XRJ hAZ偔{&l3ӓ`UTaV{L{s;67@ xɿlew?IU+%tyx`UTdoߎ側``:e`MI uGW_69S_' g'sJüv'|;v-M 87ڲ=]]ZJ>Qgo?Sa> 4< p mNv[<@0C>0@kW f/0:ϳf{yN<> RؗY Im4<`y@ހ+/&$kǸ+$cX< @=7Y?7&`lzV*\R0=ގsidXXjN˅˜,t(ęݨFG𷩛^ZPx`UTdoߎ側-XBNݻd2ޜtc 6m\6>:VO-ܲugɩ Q3>4ײmF :@ m[N~>Oy=0=Iߎil8 >T?%c[cϱ^6cn:eK~罦,Kgx?wyfp48[lNς=OTRvOۓ;.XQcG߳gPBDc}޾r|֧?ޓKy/#;wxaC4"fz.HyF3GJXa?ˉG5vAGh||߷'nQ@ O܂=OTRvO{;6$PDDyH!J%d/?)@s)t <8Q6c4Zs,l'kK,< $;x2%2y/VD^x0 Cʖ) =>ǺI#>7S={`UTdoߎ側"61aƞ&Osgh"$T@I9_z4n@)$I""`z pAM0tGKeͦK],\~:y{ I<XnP _! ySGK@ NEJ8)={|" IϜ9]W*+A'Li4\tcPr >Oy=}ڝ۱'?M+s_iO"M5i~}굫$4w?}.H6B !`k̞}߃|[%pM^- wͼk=-Q|cf=|{^}b+?}̙ytp?I)XxD'F#8D^q..Ni 'gHn'FLh;s]6AeyE-_nV0:ԋ^cwaYx>>@Ck3z0B_ iw5a^K ؍~ t yRF96q1T@^X^lذ5T:{0k\\Mmm8{qGUx@:\4Լ3o{2,|$S^AT [6{,DdW{b=s+6AKGgjaYiC+łϠ׎㨬‘ z̭ {}~TN7y{ RFqלxtsG A4c=a*~|]K|s_ 7ԮD2x0#rghn97~ ϜEEsG>ڂNݨͷ܈_׽H؋{/D\nʫ8;iv b'ϵHIOJ׉{S`l~-D¿0g dRg(j^Yu RyM{ dž` .Nv .*gppV>͸+V?¤lTCT?Gc ZZnS&oVtzqa<Ɔ{Ku0/ n:B֛Em V׾M%|êrY(|G߂T+KpӴ_t73f݅]^+z{:q^08ԇظ(%bhM͍8gOmē_d`#ljE$S^VN&pz#Uф> @{? 5SFySM' DlR=/o*l|e娵Nwv{ג^We==#T.p?'N 7!&hr2Xt!?+z+sOc컱;եxl/<{|nMoۯSp![ 9^GAKռ &%Ƭww,`n3\_Hy/.^x|jlcx;=,er&" z1zxS 5ߺob`>DK[+s"b>){W5Mޮ]wQ{gGF8ÞA`4_o'lʼn*VX!óT"Y1۶ eExr:,[ "%5RަuV&vƁ߇5W|<_g;>1ܻQ,h'MÏ u*O<k׭;ⅹ~T@?p !ةv÷!VʼnHbFpUʊUڵ###ېNU֖Bw~9ވp=qlz,^S9|T%i]uֲaL~ewl+ED*[?oW}dXx`0f|q7N耇U6* 'QTT@Y5 ){_>-wq+'hdbl|642=).pƍ(//G_vŭ'Z\sv7yvΏ<-nVM8pj~^ZZO9eC/I DžqfATU?zpEĴ=InQ8VEqqNՋ@.Aƾ4ENr-9Vc v08] 4s"dgr qgZ <-j|=M҈v[gHS={G8|]>z9Yh8Q)27@qNJvVsj[5Ug6HᒢscYe;?rݮ]7sTAZ^Eޢλoml>OuUXU1Νm>qa]rЩV XU+ PAY/Ntox|_dc{m8bMK}}= GH3ޗcԌ.O[k09قEq / j5Ecn&g(OO3IվJ{:o^8ضIMޮ]wƤUrp'c(ON\ک0Ni4L‰l6:A ;x#0iE YZ tWACѢ(g>]Q^V\o|#yx9nE^U 4";눫rb)yڃJ+IDAT|.g4#i?TBmn61]WuC{b&v÷fyT!ГZ'x)* RZXͤ ƺ82MU`R<Bwz8 ,!tRԗOӴae SkRKK'`.8e@C#n=b|! B`OP86qi^1N0\  `= YŶM&?5ovvRW7ë9ڣMJHݻcmW/NP&qTV Ar N;d~XZzIs62(*+a`)^8ضI@Amm7~TΤI;̹+(nlEC}k\[SڎWCϥxU;v]qBP]^h#മ)=39K >9Gs ^TBX z jQŭUUn>}ʽ_anfCjc^`h_qu\- vBg\Wy}*P TT c#Sձ¯ ^.eWv~?.=/dXW ާjTB[E`[ ڼ{셳mT Im1|@-MBKhەk)h-IߑбKL_;nHͻr`/UlۤZ/߾h>`>`>+!/<^8ضImVƮ]o/Bw:^86Y,`0 _ }E.} Y,`0 ,`*,`0 fW $IENDB`fotocx/images/outlines2.jpg0000664000175000017500000012310615247006660014726 0ustar micomicoJFIF ExifMM*JR(iZ0232g0100fotocx-24.40: Rescale: width:470 height:224|fotocx-26.5: Retouch: br:0.00 con:0.00 sat:0.00 temp:5000| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 224 470 1 2 2 0 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?斪ToN䙗u;ʏn檔loSh8M#9:ӼچGv2&Q$VwSݍM74wSnokS۶IVvW#bN_4ovyQGmS5=vy~!|Ec|+$zύ!kYܭo/ʿ{{g]SR|jh~fe۹w||j.ot_xuUv٫j2I-h"R{~z@23%F*@7zu]Aaj֚P|77;D߃7m5J!5 ݪ/"T2%^*LxFf[W^.KZ[W|I䯻|]"^3趬t?.Qnz6O3mA/ڦ}S7Z\M}5k{?PgVoSWiwP}h=]͏}E?L k{?MT憎잴/}QU tFƗE>˧ɾDz2-.`k{i/QTGY|YQiCA}S;o|^33-[%լ`*A3B"/?UnJ'ڦ}Th227̴M=_SWuM_L令 >7/u2kvldEoX{sҶ-6z,rJ2Y"̱3|LݚŏFJ OBPQ+H[_)7֚Бc۹sU96<) Z[ˋ5ndUYɍ_eois{,zVIڤ6om]crjx>Uv{^q⋋X47٥WoyZ}%ַ_}dGWw-۾]wmLeT5U~_2F7E×XCKѼ?qooJ+/'fګ}wˋZ׊-ָ[6kyhvU/PA5oյ 'X6nV]۾mu^ ӭ{\[=>=>-ld5YYf#LN~ުΟCoy}mmq2)fmU]somKY7kxS6gqYגJYUvwݷ5F>ݵJv?-[1wM#Bau̬uA2/\'X37ܓZ~#\,^oU_Fw.ߚfk]ö+xFiBɮ?V9\ުw Unoެ[REVLTbzuw ھoZxڿ:f7L-EEΘG?Wo֜}Mݞ&[jMwjm.?ڠ(kKv |ۚ3~5mh,5S[%潅_FfIto=2G}&v?mi| D^*mҩ HXr'4|CxbRO]i>HI!wK]c㕭mW:RG73|ywOƺ7k~]-Ws Πm3oO:4YgU>#ծwqa_gܑ!dVp͟Zֳ]x~9Y죚K;[*d{y $/ DM?? |o{ Gm;Ϫ |Wgi//Uqܗki}0'ȟ'ᄒu/B ;i韁3=Z>!,SXH"&x4.cpM,qciPmKɹy߰Ow)Ȉo 7/#/Oӡ$Wߊ% 7ɵ?9z=W|5m EzYñ.%6?Nӫ>m K->[+K{#3Ȉe<|+`s5 ޫo6\0tNq"Op7c^Coh*ѵ +KQ-t)!w;?ǿ>hwthdFjſ{,}?;$R-=ֶ|2}f_ᷓEdo,ϷqtwO!O?3VekjD6( UA"GMTw${]vmAD?v*VU{u#QZk;}k5ySگG-oOj7+eֹw}A:\̻cktGjrXMon\2\, j ʬ6ߗ]5^9վj}kvJR'HêxMa5obavV?V^៉>4w- Lw*}ߗ7jjV>v˵vU_V_vqv4UZ[wn/5Ly?BDV;+x23nmkPD[ןqnbw_#j'K_"^3趯o_R+)7jTپi>_ӛcRT 6mIIÚ'p?vE,:WB(˻_:R%ae 03&}V?ʽk!_ um~{/ ,Ip%r_ ]sKQi%M ‘=p-je.ﴖc#3o?'_0vDӭ4.;46[[w{h_w؉}'@ ;]-3NmXf4f_ #Qi IfhfH/%؎#}㋅-tҴVmNɑ=Тv-Bn..$;-y>z9`|7񆥮Cӵ ]VTkQw}DEе}Zĺw.Z}#_~;b\/2YF6r$\>}ȷߏO7FB4MSF %͔eM*y{}=ox/&Y}S^:ٿy;`q.o\s a2y>g>~>%ze ]NtVD"km}#kpZk:}{Y!ldvG4O{K5{ij;yM%z|9Mϊ$޻mΟils`n/<^裏ץY@ADitK(4?||, V̖U2wq p_oxu9ky?mn.&}Ogr>OgFy۩5xv\Ȩ~wʵZ/ 95]OQKH㲵߿.؎-t^<_OãkZ0eCy"Yy:q;iM 6^ᘭ ש|'ޕtD}+icjk-ͻAqJy~ZyO\xScVH,baHB>v+oDO$L2-!Uvr*mh$5e/&??vd/15Iw+qh(>HWm5vjtlbݷw@ 1 ڊ>V&?a6i-BH 7.7vfPWTjef÷SKR`̒6mr̫'w{Y15y 7+,~-֒j ,Q]W/u׼+ªa~uo4[٦=ry=;}-WוIT=Qbg^iZߴKoo#Hܫ?(ຎNIhՠ]Z~[/&ի|5zkkmw~SGc]OHn_"գ_M:W0/lfI6EКm*k͵}m\Ɨqjoy7ݛk}[mMI4]ʱ;ekoٮ/Rѵ+[%VK;U"y{߽*Xix_g𞉤GԚ9%n!ms~U~U/Wt 5F|~XoY)kfVoӬ:g^k~3.F~nwnӔ{*7ovs|{veۛw˻zq8e/jk&%N#7̿wnMnM^VdH{n۶UU(V(վUU~o yO>OkKc}m]VEkXown*||ǜ:iƹyyvRnm7<ʫۛs:o&o;i!Z,a[yeo̍~V~}eyRݴU,k[fEv.|]guHmW=4̷ǻdem.RMc+iZccʫ#v]fQPܻ~m3W;ޓyo'km rmZO[o+/ vÚ7V G|UjޜaR<7-xɤCAWod;~'?Wv ׏ kx*Z+ፌ_2XJm;bO gM6gMuV{k>uj޼۵Z7~?q ڤ2W鿌?S?o+x'jD_0KZ[TH S6oMgۿDۻBy/M=:W yjF;g9"щ#l?amw/o \ߘ4$nڗ:oVo/]ƝZmaR΃+?CP-JmG9lb(?ݮXIp YlTVfT=Vb7S9uK~ 1.HܑN퉻MֵkkssxJRk[Wr퍛\zxeD)F7U_~WQki kLM*6.h> (Eso#,|Ejƻ|yiVf[wMwkw? CnɣjTr.1w_f;YS#$]<]mgFHvY f]z mi֛U슬߾|JDz X|r_[!S x,h.֭C>Zjj?v;DwM+|A;MFhwXshjͷon-V7$dO&G3|@C^.MDYj ,#?m1&ݟ.ԭ%$3hK?~贯_2ڦkkqi껡\7˷s}-]֛i~ڥp+,qʻUƴj|' ʙGWt}KI5u+[VgZ[ڻߖm"AWY4qyxu_|Ճ&i|ڷ5HyUϔf͠Y_ ʛ]͹7_+WeTn/7Z|ezjdm#O[wYSS2y=ւiٿqwQ5xٗ3|7=gu^gA\2xATf]+/kd?xO_VIC|gAZGt}zC[Ү+jFD_R+)_7jh_ڤ2Wb;G%_ Dl-xi֞U Ԕ3IJbq៛KNJ$GUZBa-ve&Qeo+S!ּ0S94KYlFrʞwk-E+7͸lKcbF6?_Ė)m_+˹O̪sfTߎtx2^Y,!ț>_xgį5iu8ob\X^O:2M+C-q9G+9FS^6.'7Bt;+YB. |:3!{7᤟o3hRofc#'ط5嗈m>Q\Mʌ54WQlGZ;:^>|S| /eV@ EN6?iP}ڣyk;|=-?zny1e ,-mfZɸ^s:o-[8ĨR:k-g峸+j3|w]ׄko>R{vFOݮͷmv\i}|˻>zuʫ,Fʻw+}⬥>ot1.|1s_[3G^]52}ewmmk櫟>oYcSHdAuO2wQCƝ4}n岷ʭЪ5xTPoʶw[ngw Ss}ЍH+7Hh~7ys'_2u^*h 6-]mjhYwG>ռ@m't?#m &m>ܿ+2/w R-t[y.76ڶ۾_ٯ6;sumouXw{C|mqokv|Hdw^O5\|]>I#ܲi 'ʭZM)HjDFɧ3iHH]woUh᷆9Gmۺ?~jm 6,ZUJc{&M'IjѡFݮvy~jjyu=Eۉ?KWz~>g;]<*KW^x݁:j4?4RqڭiֿnY>uz,Ӽup#@V2jHϜomM[1CCn_)|%^u-yVmkߕOpK0Im%j茿_Sd)sxQdR=E,g]7 jY<3'QA=gD~yW{v@bgLŪy$}2xXO ls>nv-߄o@7՛UHǂusN2\5_z~or{i- 29ۖuoWC//Gg- ԭ7T6B|Q_pxoIs$n^hoUfvqJ@KwH^*N=hbW]˻wmSC6㹦{Ԝ7#2ؿkq<;ς ǎQ[k6+۸p-kT"`>CWyfYK|ev|:՗Ljl 8Λc܄>~OOWTV13˴)D2P>g^J挧ok㦈,h,ekdًn+ iHτGsܣ]jv)xBb3Jy~̿67ûxU5k -?L&GF_%mŇYz6>U#[ESVPԤynon%ݗrG[eVfŻancҼ9"~qk5O[o-*߽쩷&Į?5xo-#ld[Շd\2BqfI﷫^kcuiAlc?yommWs*w_kgAyrGu"\KX{ɏw k>鹣x}~i aS0%)OʛԣE]E3#5~n{KtNLeۢ?tq`ڶuMRUmeK PK c4[hۻu[?UH~o {8*29>ګWxѐFiOy苙M߳zF_X>mԒ?ʬM] ]Z:xi[M Jn|YK;Q;7Y~K$ʭӮn-&H_&ڋ <TTmE~Mq4ۛTme䍾쑲 vՈvԊO)1_e6ݣO2EUku:mԣV^/>(63kUYNQnes+4qvewA\&e٫JZ|6g+/ 2.ݭeo {~K[fmHѴJnm{^BF/c3MgSaEŜslY&cfm2/~˶7B]Ij:ۦ],͹'V4Ywtխ}fTo&"& I|ެ8gTß49c˺YVEm7˷0߈___C-Ux۶m۾Ukl9VhՖOu=?v[4jWuoȖ=(irfpI?fuZml4_32#mw/ZMֹkkZ}g}$kOd~j~Ѽ2kǺOוY~U#^mx5"vҗ1V 23_xVVBv7JvOfsR񍪷ˬJގ5&V?xs7^}2Y[o2_o/ޫ>g߾ԗoW~o:Ooڪ?n-|kZxǑH/̻fkbA5UfVfzM\α %j.?GVo2E_z,|GcM*|@i6yͯWt癥Ýi˯em|<3imZ6Xe/|U7kj5;{Ucw̻fڽ_^jEo$1}Vfw7F3{Shw5忆$̏J/VZo῏煭V$M⿽]e׊-|9y#}EKX[^/P>A[[|e殬-z{*6&eOS:Ogo O%}1m&?Wğ92xfHm7nݵ}um_Iɉ\ѤH+vV쟖I"VY +Ӯ,5.LJΈI黵p\o /Q&|-SK Ȟͮ.ncH\k")V ʽy ї֞#y4V(,,¬/>u#bI`EypO|uxShwiCuoeD#>?*|#6ͨx̒3;D:k"܈-=Nkq:'>|OqDɟܻ[w z]o6OmYTm;¶^wp"X湒d4?gD}r?)5^9ԭGgɣy8cG xr+;g;jע Ǘke;$UWIWN\n_}/5=*f+nAiΒbw˯DxWHs_ivwƟXI_Z?AK؛{kgmnk+H~Z:JC#ID5![Myu_n؛o{U5/ ^Z+MVI|?+Q?#V i.thQ~v͆˷oΣ|3w[msUTvL[Cic}4i7Dp:}ndoE̞.Ě RpCyMnYz7Mms:ɺe=FA,ө,vo)s yhiiMjѥ{Tqle}$82W;7c۷0hV5ߧ>ͲG_c~j5uw:dOZDܓ|z^eQ.$.nlt$?.r?o:ݯJ_hϪiLR:>@FvWl&ɭ OOyQM1GN" P6>7>MoCӅŌ[j7cvpR#O{[fGao"e}V=Uj ra't3}N{o6/>]3]YǢX\2YM 3nU_&HɿznU[om5ws{ s].]Ryd>_rߗvߕ~-q׈/ jA0"XsGwWk2UMnzEx4EE@*5ov3n_f] $x<3Co龴 xF񕎳gokts—:]ۣD~mΑy]BT3}&=:UZ_ aktb+ϼl#AXM/:O;H =$qΐ_s|Q"ѭƓ\FLw7f9y}7|W]i0em,$/w?_#TҴ >5)/yIsL>?2>о+G>XƗR_2G1yi|Ŷ|/@ripuO+W_k]ջ}YG6ĝtxP9oنC&zUދ" d_ U){w'*[1Ve?Q]F6r;UOЮ-5>ZTr>U_j4*|6&ɷWsm5CE&'+3.XJE߈ic-h}ݲnܫy#4F;_>[_7^j jԯ#^E_1]ͷwq/Y_nԵI'm2+/=7^߆Q,dVfmngVzEjEc--"m˵~m۶|AԵFQV?a9Hޜ~ѓ75U;j+`M{#A'fou{PUMմ?5ğK\:m..6%jme_fdtsD.KujfV*C^ 㳚OH>o5c r Ԭofk F͵[o̫]&M cOբ[Ym7BhcuqO Uc0Z׼Ay|[I\Y\3In-~m?vf]ͦzK][6uW5v|xQ2, ssVڿv?*W<+q -bu>ִfUeym~juҟ>Y&tkmۻWy3qNT9]/Gl _yk#}OIIvoj/ sٲʫnV۷ %Fީ^e/e#m-Ԑښi$VUe*ʿ3|ۚ?E%ynYWmW 2IVmw7kT_7V=_ 5 ^59o,m2u#6+=.|K"_ݯ%{ jG>f[U_moR'.nSn" Ċ|'̭&#^ԯ,ko$ ߾̿w5;ž"ՖFOocWYM~ǥI"~eܻw|5ox#Z'7V;}xcX3\W wwmj ZmxV+>{fWV.|kImGkmiWk[kǫ}ls\E˹~m^9^R}?|X4'Kv~o9kEZ~ú8fUUoOsmE:mWokMKlUef_1-\ib(Ni?[W/C\g?*^ھZxڽkk2j\$/Zɝ'g ްl-}OLmቦj}ΚW&E]ZyvѼ{^Muw+촋4a.w7̌"/z &4xGM1l^?Xxo^vikv^l ԭ yqnLWO|.񟖚=׍Z~ > ӵ[ $w*GDDݽ'M+ÌX_1;V Z~3쩬Wdj1m0'ϳ?t\bq6Oֱk$*VimYD|C5Yoxc\@>رQTZ>ԯu+wmPYB] ^i6EG ̟9جȡ5oU ;!5hZͼv?j[VmѪvߙv}#:׆-ugqob/歷oOr9dmʿ=An‘o"Ώ.{1оiO0ڔV7 1ۺ?U-xkTWDc{},3\"-zw#FM?J߅,nlCzL%ğqoҰ5X|wiXY_JM<He&7+ UJtP]K$k;kh _/goz߁G; ]ZA o=wl7?/x{|公C>cgT؟i s'dܫ^2Ҵ/ n A^Km-|GG}:-fƦJ O&D/CVԡՑ>m<m=΃%4Ht#+jwF^'SS|Az,E䓥N\i?ț|}[],.omc;6ý?7Dec|[So&Cu>|(CU[[|4+7Wj4ú] ˪̿7u&mWBVźh [$Y&yZOy(iwI-K\[uyq*?e{Y|'x'?n![veͷl+|w}[RZԋy$ɷo][mޯ{'Kףm[Uh-47VڻYYY~zv-%ԭ/.]Ѫȳmm5cV1r574N ^֡-Igio$pz_/&ibai##ԠfS.+/eNL"j^ jVzXO%=7^4}ZNϊh{YY[o;w{RMeo-kC+~o=4;Rkˍ=I"w*U|3r]7YZͷo_'K6YYGqZͷww_⬝KW դ\⟚O}Jw }m_\mgZ"}[DCnSGe_Y%Ɵss*֑L,lK[oms7v>:m֏ >5¬=$ouwk~h>5ǕnɛwO|[cŖwuYkp/f۹;YwT*>Q𦩢^g 5۵Vt[ydT8|<9;qc'3\3Hṋhhh/[a^ir P趯|a"^3趯 ] 7j)[f~ڻbr˼,ܸXyUOARu n??} XcR]fEDHѕJQ6ݕetc=!omw5Ē2¥3{{שx[R5y. }+v^wt-+ 4ufE*7Wcm}ڭ19; wr?%AGIXgok+خ"I0F۶5?_8u%_g޿ a3`;`}-0x/j#춺egp7|]ՒI~M;ɵkxeA$ŹvqZ)xm׺嶉p< D;{^]QxODZ$P.~V^N6@|6Q_7cӼ7ꚕ4ΰ3#D> `\jw36&fY28%p_h ;h6JWA~s+|;{>?hen/*C/~2cnysq|wu8udce[Hw|˻rZFD)kGTэB8Z yder2ڵ.д?Iї_пݯi^kRo$Yx̿.m}=sWVrM f8lkG ,4}ҫg~W>Ҡ\jw mՕ_o?etY~[t?վ(%?ȗ//F}?ߦCj"ЬtoϷxzE;]f~:_HѾ[WrEsq= ΋m7~z͔v 2ʣڮm{iyxU^!V-n.. ۻ<q᷇JԳ}h IGqǬ|Aa>8m\(푤D ug~ܲΏGz]j0\h%j )w?*qz~.<čk^n|ogO;>jk?}~ N oUyx ȹfOݦO&P]wYe,bKo.XQǽ7ߟ>DG4{:I7 MZ]xmrdȅ?G>ϸU&5+q3sVxd[0nRVAK^^&v.>i!ܪv,ޮ-MRyi?}ݷͷo%Q/²?YԤR}vr۹k|ݮK{]i#Vo-c~];ߛvݵO> u? O'o:\Lhn6EUY~]͵Y~eo~gb#KסԭծdY6m+ .ofֲڧ[ɒ)&fmTE im|Uݹv]{qx;_3.?uUo3R}mxGYYDY&w[IFmoV}k|MVӷ^iZ.1no]\Ʊƶy;oG P[I Em{oWsmjc1{3_A]/V#=Yw.LqEI{ A|5},{L Z[YH߼_µzohI'&0kY1l[+/;^|dM-4ƵfO*9$]5߀0X]U卥kݴiՃ%֟7?ok̞:c}"[ >pݍUYcf{zMFO6F ukEfߚ1~<Ґ*SԱ-uZ_K-\iȇL6Uf#|ͫȡ׌-~v(Yvͷo-^/mU s Q?WͷxW*?0o}wzWyۯM.m$Excfʓܡ~m?շ{$ vE_Y5m{[K&E >D|o}4m"g57^FwVThV<\vz<+-VU[E<Ė(o~zz|0\7cE"QʿŚ^b׻ .Uxղ_mok4|EYAxb;jRñ !%GL~Ӭo@ڌ\]>, & y( W˷寤#xVIXK=Ƈ61L58nn#WR(}$<}nZoȿ37ۿڪzFscM$\/%w| |0ME5j0O}(۵ݏnMxovc,гie+ͳ^|ᷰ5[M%3oZ?}JFem1-;幐yWQt簶-"a-fݽ}[AWޟ-I_tl5y~]x^iZҩeIْHf o{C V9ʷ+']r -&ff{AcJQEJe~ZͷcXi33ٱW|ɽ*Qٺ]ʋy-+j՘E 5_-_fƺ ++yZP[Lۦ;H s+Z%NfM>RF"nejƺ>uTҾֿk׌[^mM?X+kNַ|n<cok"7tYLnȮ?Ogz/xE;[҇/bv[MB?|#Xm3y"wAc6_]gt%Ng{>/2Y3m~xwŗIy7z|.y?mpMK|P񆭣*ZxG?ryO2jFYK7 ~qYM R.ݵ V-ڴy/zmj(>C'dH.#ee/]ZgpѲ U#xTmԴ+,+n˒oYޭ7[jM&Ffom46Fe_Zgx+VwJ Gsh;ᎹlMZVs.oY?m|Kͽ/,m{Umoݵo|=Cy:±/Ệf[˷lk?oHj]gPO Ne$l"oYr!$7K4w}-n3woڿ/\?<ky4٣fm3+mڭw*ׯh־ (VI<ƞ{+73.j|3{#Dѫ47m7SyJ\lUU} c|,|oi.uKi̍co1cѮ?]˻^S|21(ojO|[B6SYU%źʬV;CWeV쪊\n-/7;^Kfok40OOգVswY54Ś  ׽|l-h#dWtݻk FQǧ|>&-ݫ#ev+rk~"~Ǧ6iq'L^x;5_)UjԢ.H&k[i_6f?yZFR4/w'}hj2i>:&e[䵓6VɹtUug$m/ʵO?׭+m}[|ǬX6j;mԑUREڻ Dk4mrM[nە~W&~)X:7;^Iu,3 n{AnoO\|>X0eOφ'CIwo#EU']6/>no&w ti6m֑yvў+ ^NFQ[%R'dc.SMc]AKx\趯$W]'źuj߼y~52C[[We/z'5_]YXjZMwVs|̵ 2IP&s#42֭^hj˲0\]<~XiH7/%|2>oM$vIګo@V~*RQ J:Kf?_aOw?ޡaSm.-nYc>x-~/>>i8Ds9bwͱ5w⏌/ j7zXv]Hw):ٺsG_k7Z+q<4W_ GែMKkkkMBȬIG1?#,lw;Ĩy]ϻkJeo9[89)l):-Ugiž蛢ٵ~_\~KikJa3eUu|?7_5dc1"M%0>";nn[-ytm+Tm'I[q͸}nr{Bv`zW,GmV8FxΘV xUfFC^<ܚ{{ |LiZU=HۡPfncR2コ7`"6]#?Еk^ B+]L5ޟ~1cgt\!r~S]-Qɤx$}÷.ETn-;L̲ioj܍3úNJ&hz~]IDz[btgzC 1e|Ǘ@9TcC/u7jQ?G"#KY{t߾[]EİJkĖ kmqcwY.?ut5Wf,loߺOomv1i.(lz߷[uoW|ykU?ޭ?ºfDz˻?Z{lS=g@wUVrUIWxRlCp/Mo,Lk#\/|ExٶZ[[%_l?ݢ2(+ b5=2V-7*rJ*>c-]~ۖKojrǜ:K_2ݿ|ۿک^LV^qx|ٗV:8<|ʪ$ [tTA_?ۚ5wVz͌ۖ[KRW-RWj:jK孽Ρ'匟7*+-k2^L텛vh~+^6.  |r+]Jmg·څs~6W,oMǞFy"x&h9Zf]3I͹uy?~ojM k崟.ߕV]wnjx;_[xOm5r6eo\ҏ1D|g|eox{O|}w4WnܻLύU/]κ8٤_wWv퟇$y䍵[>YwmZK&k>)aHfhrܭ%TF%) x^(UfUidU#7͵U?7Muy\iڬ&[UfoUo[7_J|N/),WLFomG3|Vo2FyUUk=j\G9wB$~o/۵K~wc?e(s{ͱMV۹U/feV[ZꉁmW!}FM< j?w:HW:"Ioo^w >o]]7?.m2,/B2J̰cwoV-'ֿfV>~y\--ZK,ϤlZz>_ZokWuvde__M}վwr6eXm/V>-Go]ZkNe6ƲIݻU]VۍJGea}d%fʭYǫ)FEFG]|AUZ2Lv%fojF𗉼M=sPҬf$-t |Gcqm Mٛoeoh}mB|/K3myvsG;C?}2GTm_&kxY58[[a_ǵ$MXk-_~]M ?H&ǹZEcҔc f˹ew54v}%7q"ѵH|{5:Ŀkd:Zj˵sH$5pґ2V| 7xV 뉤UY6v.>2?\][i4upR4>u[WN)9H_6wT2E7*ۿݭ{`7"/o'?-g*5 2˷H{N{DûPYvy x]U7z&Qcpl]<{ku{]3LpKHc˜ט.ogTm6ym̻`EVMA;V'wxC}R>mkqtM:y>7vzv#T@蚼$#Aqka>gܯ_]=3~>mz&F2't{7n`BMҼK%ίr]&w\2DIB?(YKcͯxvH Qkk5q!smmH:;m^xqySˆc6D>b 8>\ۤI<ǯ 5nd "i;'gw?ZWuy)i%Ğjx2M;ZPgx<+ǗׇEkQUGm@mtOZF>ݥޮm &=ʥ9>]^imxOh2Nmp-/&wHZM<Ͻ8 CFqET O7쿺1vO>}2"H HNjި1y*!ji\Snԁ~mRy]rC.KpE/"r+oVkMK9 hI|n7m 72êGU_=r#@˳oߙW/MZ2N턃I_tKDb$")VfT6s34_~GujUl0Euj<񤅶mݾ rw4;[F[O#Ι~eʭU?h _"]'zy+ha$]돺^6nQ]$g-Qonom%DT]'V-zZqi3"4:lyľbE V:;xwr؅/Ȼ<ğ5qv sHi)^8b3T4OCއWKs>b%i:+2yuİ~lk^,2|ʸaTj^&ċa)X+7li^-HZxfεI.ٶ.}?5!~2j̐X/n<߻V?:Zτ~*$w\2֖jmw*zżz_-օgo̿wm2eo5O<+R^to_*˻ݵ_ t鈴mJkyj$k[Vo_~մ/f2,%ofz_!ev"֖Mmntx7E;Z}b(-ռ I_-+|u&QAqmUV|Hc.[w7˺8[qCuo>_Q̪[ɏ|W Z/ >!֓Y~'~e_da|yqj[>h~jUnk'FKv32ݷV[ʲ۾۪ǒݧCVm[_jkY~@{k,-}nk7;~Voj 32A k{~vpD*H,U~]k ɵ?*}ܵ5ڤevi7/SsZ*6;[Ŏ Wv_oO{o՗B/q H]Bۣ&ײxk0fE_B̳m6^Coo%mHٙkB;8VM#} _1ՔFTjJ'x7ks/uEڿy+5楯xoj¿¿/;V#Kfdhe/-Co6Nך2r ?3VF&R)|?nmno&wm4jI?쵽v<9qv3 jݻeV,?F&ںu+2V&_7Nk(Vf 4q?}E~[K}Hx2vwu3y2)k7jʠ X]|˹~/-"ȋ>h#m|wOUV[w[ Uu,wn]Q*\OhnaQLٙ6|.@ 7 FU?ڦ;nES۪MYB&m'wZ7?Bѵ=g6Z]:֧,&ʬe}~MH˵wZu{H/YHɴ7̽z3mTH~xݝ;oR>_X}c*.}pU̝)2w褝*5i3nm'ɏS"w*P[WC$щ_}ܟ"yCy-?uS[}VM$¾\f#fojzZkHn+GʤgoγXmjFUL%[Hf(_~j#8{ vLԦ(K^`(zQ)2HX O^?٠ Z~q]4R/kvϳi~$k^)}ڏ m?J  ?,k7t}5o.+=6=ś  HԵ=٭e^|Eɫ :l;» }jJ" G^e$;%nM_?I mFOs࿷JsP F,[Z%ֈri0˯_&/1ݧ]k2YOwR6[.7y[oިY>]^7&|_)ڮk -n6q1|]w3&U ,ZkHwyV&+S];Q'|!u-/O[8Fדrk]:5ZZe.ob٬}*zn5Ŀ'{8[X4NTdo\*Ͷ|yvIjԇkǹk.8j/W-jvjOUEv|woz"B/vӕs*եoGj6R(j--JQ0$qv/ݭ ?IٶB_5 RFz_}Vxt=>5ܭrL*7U9~j]\iw摾_{CZ_?kEo mۻܫQžљU- n?y_iڗu-g˵e^hc]ձͣh:5n?Ij$*$-KY,!7X,/4d&ݵNIoy7Wl!o?o}RS;Vڭ[~ݩ.O^y>괿OUTmjf&'˻vڛ)_-_$WꟋSֿo"V|vXḑ]O*K<_"^3趬.b$OԾ_ji-f/M[yO|[I'AoY.e*-#}ɫڵ?|?z15٩rV#Uxk֨浑x]2#I=n]*hyD͵Y[}ߛk'c}ݬI5E&ݴ_?ZO?;}3UU-mp^2Tk/ C_mKė  ;_=6cVq[?E+BK, wTrHC>>"Fk2CiZ-棱9 §[ KKheamwaߢnSP-e[[pm#Eo tdo-kr:'&D~lryVj@)dh1cm*DNs=iqe3mTUY@4ۅu4"fcmߚ+;Soj2n_{o@4h^~X~t^]m.K=\-oƭǮsI/uey5|W(˭j?ؚ=bHRFw*ˋo xm[M˥rU֝Я=lc[Ӽ D)q>B{~q=܇{&߼}:[yYiz$6ՕZUV+7ğ8aυvm!_@>{fkW3i ],-+Q_۝>]+Agd\Ih~rIi$o/'YHo7 Kmޣ@1vo9oU{˦mȬvf*ʿyw.ԍop/U V%4:I]>y~N({fotocx/images/brite-ramp1.png0000664000175000017500000010770415247006660015137 0ustar micomicoPNG  IHDRBtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 273 292 1 0 LV jeXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:292 height:273|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-25.1: paste area|fotocx-25.1: paste area|fotocx-26.6: Rescale: width:263 height:246|r[ IDATx}gXUɶmyw=9 9AD*1mĜs9`Ĭ%+9sIf-؀iѶ{j֜fͪaÆ,..nAuu52t ݯ?J]~3{lJ!&())aJ>]teee(**B~~~Go={kSii) ;emgm&L& 4RvCC 3^Co1C+;;e1P`HP?Կ rrr>X67ҷ*ŅHCBR**:3f?d{U~Kq2Sl,jՏkC_fw >_?_Q>8~x?tT1`ش ?,د[EH}o1RfhR.+ʧz >mfe˯? 1A^ط}#VZ+V`Xfl;Od(m1l-Wmsa߿ńESR.*dg$qlݲ @A3RqN^k׬ƚ5kfz9x 7x"-HH Ÿjw?H~ 0Nۧe*!(띵˯ J?:2x00|p . )iu+!3la(]@yX;N Ccƺ}HCmmUU  U!&uܐUL?qz$aC!//iiCIE&1gFx}>E?7HÌC#:1COw{}E0 OFF233\z+M+zyOO@rXv_<Dždd fӷ0僧E9{^a)e^Cߖo2#eu&+kD9Bc >ԯ xd |'߀qpzL0jjWPȱSq;O`yJ:25a-5=`(fR #{G8NqH8CoTRSSX1L͠N "!!%87SC}42af퀓7sWQV'WNc` c3q WANUe)akhBQIJjp4''B[]JJJ*f,EtRZ!7 ;W63CBv)J(L跺C]U**\VpCrX%_ÌejC(ayʉmk106=QxluI2҇);-}pRdYsCaW`c* -Z۷#88󰳳a5@de3ȑ#hnnׯ1j(ӳGlZӛŀ-m3 fr?0Z 1 ija!P1M<8j Xnȹ d<::ZM[u"m`h 3:DGJG^b70"`RCmc DDD<{CCb"OQN`ey^ !!FފG 9\j=a.AjBdD`F&Ç ʨIMa MaGH))QU% Ӟbf>؊z$߄"  (+RD!nOP]SӻV@EzW uDi &.I 7!(+wcDE%`\vQdEbh5(*kb}(Kpb rg@M}"\+%-c;9|x/CPAkF-IC]4DS_\< :P&*D >WH[ڤ;O us"{DYy)}aM?ȻX4Jrc7u hK!qȈy%ɛІ7cƮF Rk.$pI~NN ̜% -0ȏlܡeOL Tg[o`me Fررc- {7!m'œ9s0n fMCBH9pՁpWOy-څ^o`$zZdTUyo$yafoywNzV^¢U,[c hy >c 3v~~~ؿ?vI0@m9 , b8 8%Wk'8=4U0gy斠6?[:Bb<9 Q8mo(Ӂ֝ }ƌT86V0VE%p T7CD8KdWl@|.G' Oe*Ȳʠs+KX6<,I!÷ǔB#hU-tB}rnJs,0|P(kb TU0uc5`1e>biI0Ft [șϥbKrqjǏ1r0mq`nf Yi%}j?c%&MFP6^!-*{#Q< xp:Qz@0`$Nߨ$4/<ʴ4.6wDX5c:3n߿o.XIXP&;CVt3ivb(msK:%[[qn$ý?-Eu`<go?ōװ{qrrĦS7Q]k[[{YM" .E[MY!op%Cx7ɾ3`_d=Һ4#TDp"(󶠙rRԬTb~ oo/"&>rYuUň zqϽD"LZPFy z %3˜,P:f&#?^&7cv3'F!84q'$ê㍠0vgc]9Ǖ룐M _O`bn+AH źɺWÙWTW8Tm+yirPNFL-eA.&GVo#;()y|D"PE;LAe4Iqv1YGsCsc-r3Hmi+z!>:7wȦ":s g8~DB߹?= Y"t<$,l>c$p0]skBnwErYkK{cOh[[XK)k2\t K ʳs#N5Օ.7qŠ{y /sJ -*Jt6S{]eN4P}ԋRrV,׀1`ӊfIʏ1y*B}8BS6)Plz6NIպlBTѲ,nP`f& 5eJ@!Y<z`e*jPUQZ<,1a(ɸZ%9h@[K JX Qw }tf^}#6*=CzMy2 s .7 NUph Ca8 T;"18Ha`cC(RNL x:C5ept՛%9jAR:F4Yֵ`L7W(+6g X}do(e uprSR @=" yQx4U%F[ΚqY§,و6oQIUT<5S)[=|?2D x'ذte;[r(ю ̦w§ns6-y;\|Eٸ2S\$P[Q,!Gv}JkPB|%DWL1ʒáv IDAT>ADdF`"7E '&9ƚp#.}LyPpu'T$b<2iB%R?ZbXp;B#BiL3WHyHlOnt@q&F['xrY2b}1VWJɗ:/ܻ?#84"16OB1Cc0TĊmyM5t 8;/vlXrC2f>gľQʘj;2sRMX{3)ݸ-Q_'Cbs{B*yl۲+g%Tx[S8=$ga:kpmht"~''a - Ь n@\Sa4-oфR^qzoX2XT4GߦX"pްeo{Yд&뗟Kk.8Yc MȌzjn*3|-&S_V6[#w-H oS%!?[|&S,;;j3nfsWWQCM^]8ڌ,ig u ҅5bsHY:Xq8cmB,3XarEvTnsmbwapb~AU{2Xv J[ZjK@Ve}q)8B1+K QM~jRp'uHJ,8)%yۜ5 c0dhoiNr&-pQhHv9.!?l>w`g Q琤lETI[㡢k1B:1!0l4VQNSK8c-eX;#duU&2ƆW,Z^pqElwY̧ЖѨ!Kxuɡ؀nn"VWC\#g+Zj= Gn@T;L0wAMOojI"(DS(flle(3S 1f_aEKz~˽˧YR|IEUBa9|8ڢs}: 1%f Yˇ źQ.0LL3Vi(~v(䕱c:A8+rpOŢqZ!g8'1L2"ɞSQflӶ VӀh[g2jݓ)`{=^u,wda$=茝2"h:0̮q{8vp7j1dW@YB3'6̓"08D~)&ABuy8s> [lm`geՊԠ1ʊRwn uq԰I? # t$ 4eyApfy>Z|NI4\Cyq -q(#K8̕;QOoO[~%{]x~A<? ,JR8APz'0X :Hrwb|)M^.[aΈ6A5V'9^Nlo<ݡ+3 F~{yZK+/nPI"Y^^:e{`XN*.y1 ~U\\,' )PqLn7oY,3  _6Պ3+o(}V+) rۗI[eÁ倸2/VGc<[HK% IIIHB]Ks)u 6>|l+SCY=ja3ƚf22Gw/C}gU ?VkCSOr6y~1O#/c97ݐ,r(p gz-}Mw9\JIW[]7;Z @ÃOK#mzX~#݆6FP0eKoF:=/_ypϤ5-|2,[悵6c/gR?{Grxpu@fp`Wŵ ܹHzIy9~xڌ}+NIp Js{գomF~F Vα4x0&lAr^&%(̲ĸ4aύZ*v-[` Z-ㅿN?ӟ9w@GXމ=4Lq% a!_Z~K}38i~^=NT.\WƘ߲Ý]i)tLv@.m[1n\q|ﺷ4V6+`^W#&)p,+1M`pR?ҭlߝslwm;Naẅ3BǀO_z6Cp(}߿޿O ]10F7o K2x~QHL@}蓛K 37ĶW##%AO"9==f9t bՉ!vJ~vY_J<-pbo*QԱD ՟y崉%؆R3SkV^<:]iLA$0vz7>w6?/d ҢȖN.%RtN^)1vڪ2A1%$P/0=QQySld,צMq 83)  W!myM0b991yg W%L[Ň CCQXAۉ+&" 9<25X=~d''+{OpHrڶ̷4!?;]L2D{t1a:DIcS`^=i#!Kd(/39ԖTJs͸D :|,l tctxv %1XEĠ#S8[oًE)ػqd KM*P:r]TrphBj&YjAc5NM\l8x-  aUlw36:e~ 1m818'bĹܺp Ě3.K{p&N>xJFk™D\TJX< f(&iСӇ:ͩ_¾M %&Eۏ Qh&*?TT!ٌT%ȩ{ ~ia*N1$䶓Mw(m2F#{[Z AjTLʛZ'2s਍a0Bͱoc8 KԑthJsR(VЀ+, */@_UNq' G-ؠ~ Š9f&_C#S^h4b*nt&(HJ5&e$|nK zƲf;;}"O}cLpykP\BI/CbZ=qxDmK_'-e]l<~䅾 g2DnVc"#Ds^zknqr*8p`q}E3թ f9kw̫ɋ3g r'qxN`ɗqxĢ/">xZ39XeqxWX41:4T 7텇`׊&^_=oO5iZ:S%8Dǀ'?UZ0 's5ML2\_+Op; 8J򠋋jjqE^>b28qBtX#ّ0BC'4B+Oؿy>M[ڄWN"il|DW"thMmlcj,i:oDG*hHp=Gm5xxbD@ cq3X@ -W9hCq9edmmH axy6j|) =FUbm/.y(ƫBwЗ"HF ^:] H\ICv*:$w.B"zU"Ņ9pe3a"vE&1M3_~~X~"H#.y~/,4‘t,{/E*ȭBp]k%] bNZ*q4sdVx{kcf3qUĔ #`%+;FBЮY2 p _Qu 9؋͛7a󦵘9u LVO+h3 1|Ev9a#mڏ: 5Vpe3n0lo|q,9B_f`4m!cj=VSF>tmoT77c(qؖIM+ OM+GY)E1O̝ٳfao%=zι.oG>]lxFǛ2:;sSћbFRDn Uxklg; /a4xDNKMnwtO2!gزy :EVFy)AM9pfbe4ah 3((wsP$srХ(wtP`u^[QypDw/$Hn`:u!JYD)?`pxzXtԕ!X.RBYOhsޡg)wGycօ#Θ-#DohZ1tu1R;tp'H4U’8E(!cfE9p(OZp}u0΢Z5v2|Yuhnʕ+]KI±?{^=5:=)p4 ss&6 F'*ps8͂!\a"}.TnUvX88F]€ {)0(pX>^F'0eɬ!"郡a3Fx /[8t[:sHcmJx\8x] eReY&]Ad.%r3!oZ| %S#pxGSbt¿(O~x| G'1\hۈfX@1R=wg@yOrՖ(،pPVȈ ՊĎ؝Eh IDAT ,%jD;܉@2( 4uj/E 36&{b؀~ɺUMs͈u?*BGrgud}VZ?-!*l\#[~z< EUO>wp+hV(]N\54 H :\)-kƵSʫȽFG!h7nñ*Ddq>eI|{O"sZ+p؊ח"fÞV;f,BJ} =|84#3FmCw&b: CƒqҴP4 ̼pW =n_3 ?whDç#( (" 9l2U.CgLH׿)#ej30 Q@s8\UfcTc TCb4[8EﯜPmS"YAv3cF5Dx|b1[}├jAjHT_FVKv/`%أ]SfEX1s4eiP>(0|~nu9= l{ҚH6A5[|OAǙms\aZ MMf,Y%W,7S0%PeYD/>bʂ8v$mXI#:YaX3KtG襛xsXW k RΣHyH=*ı2]tGi`il;{?ٛ{')=X)%ESc7H~j+ ql486SXt:Bs܏n6]]hi85IkL"vApF4,(8%)//OQiP~0wZ"YO+f6XaadJ2cr.tiZ~~Wѯ e`P=}+r _y:FrA$M7X?At8ׯ?r#&wzHϓTͰYܽt,ܖؿS@b?܍̻Z{}80fS. @%$ad5:rQ3f$,;c,%4ulJBlwar{bh*ATT .o-Ϣ@i g(3 I1W/s KKK89MæMq-dge&Lȑ#k sw>>0/ '; a!x9]w߹cǎa֬Y0442!`t'|&fϞUVsGPZRў?s7?| l~ٳ8t N>{`Ѣ0556 ~:Y9FTd*?zOxplԛ?g0ܿwNUVa׮]X|9̙kkk(񫪪r1{vٳgp?ww9[<8+3׿ ~z vޅe..9sMgggLS6n@Fѣxp^z@hH022P_oPFK)I0eOJs5."io^ٳu`~:y+nn4b!At 6|NiWl/2"wqFo6g~[[[.p7̌sF}q' %%Mt\8^^r狠7;YaU77-*QQ"6l1{I4ƒؒbo{A8j)fA0׊-[fg?;;3;[ZV> px'OOkH3ɈХ{nٳ xFڵ+Qbf߿? ͛KEԲeK|SVhY[ہJyJ.ZZ,5[hvcmvgpw =:` IƜٳ%ذ~=ŻpdV"A@ٴ>k쳡CSǎRZ`'+BIocm/'V\9sf+F9+F}JЗL}4KZ;;;!&:J2ƒɐ͇CHOK%s`J5m~H^_UHfWIY=YSSS={K<И:th޽άY$khOZ4p쬢JHʏ 3)Ĭ,-py86a2XiS{T444кuk t===}i0}P| Bd@ŀ۶m+ 6i9?M-UfB|U/3g̨zڵclѢ95k&=l=K@p45;=%8qe͛7(iӊ <eo  ph Kccbh}7_yVY'yVK/kϝ;')M靬 iikqkk+\n3gNCضu+i7bժŒ}iPcIf۶Ug.&EK1W&޵ Ǐe##i .Ձ)MEp` 'ȱdXͳ{$ఔ^7 Im~ijxu"8kYIgAd" w!uٱm<"3eoq_y+8>Hp`wQVYܿ/\JL.QxT^%e >y, dUlf⡃^oWY]Qׯ%80Lz aGr:jO.ƒ؜"1ۥ{ t!^xsAtTMNweX1l2Dnr.MD x'}Y0wG6(qثVG(K fxb1xs" w>'2![ )FQXuܸ~<3 Cd|;.-[Lҳ"mZ*G щ w7t8s4,N +w@rH<^8pX,޿AOڷo'm۲+O03YӧkK`3#Q0a+B(p-/2G=D}}?[||qE̜9C 2ed߷O(e,#pMM|&I=VO S0E6مa׮tZ)N:y/z {_ @A0ƍ".> ݋7nHaSxG0iɘ6eLMsDg-L@!A0F.2wC x?yQ _dgeJG~?;[跗FCLdQ>~YC+ 4 x@-p1 $8Pce !9AjCHBr A< A0Z8p x@-p1 $8Pce !9AjCHBr A< A0Z8p x@-p1 $8Pce !9AjCHBr A< A0Z8p x@-p1 $8Pce !9A@E4<b"j-Rfgf :"L$ANL!!!#<-|||{!,<]{9_H /O!"<\H7 11cccs*+Q&%<>>=EյF#յIl@ɡ6bx!;; $]!#= 9t?))ҽ~.kQ^tKWgee"=-B)~_\./DvVR]E\zyT';{{ @U k4W Glޗ77G]zSrꟵ4u7Q^^֨z &~RwMKE`aa +/+eD.X,^N ^(o$L]eYKuLGLrQ 6qI)2 ʑU"<(Fj^9 PQgo^L"fK|.- PD' ,l[7pwo]x 1!J(@DFDty c{wQ;I|e%pY.LR4e`ж('"\Is(o^e[_u^̿^2 7?훰@Xh0ֲ_8N^u}T~ FD$}4!.%trZH?JK < Ƹaz5gxFPFŢʭ(+AZX"@^~_Jr("E-KCO?|DGItq$#uS^R`w+]e##]e#ܼu2<" U]Bar*b^*/0-, 3c·/ #ea:3`'öⴭ y D~ p/- xZ9X@?Xݿ OIgo'gpDZJZ>JxDW "Ne%r9{o& UbdfKOKS~T&+FJ҅Ik"WD|ZwݐjeV^E~q J0k7]lRwLhQ7lIa5@&I,-n<'ۿ7o'`9l wW PZyw9\f|KQKEszah ݛQ #'-%fo֭QNؼv1u={]vA!pr 5߾]ލ/JR1KdA{o<}Cj'G4[9f3ɓ'c!=pd'cT]1.+4/Q?f:7)+<A;-5ׯ\L}mf˕a(=4_h=WPQe߽ؽ6ZC^V2E~[4ڃG=F XS&<z wGiʦE .؇HRU+6Zb:N׆W t#>o e5UVEB6߈=2$)a̾TSn[J0Tc`dwKgF6q",hssw iX2K9 iX_;3^*#3=! | _ox:Y\'f,|]au(튎QPyN _MoV]MӠAppvvPIR"2*J]~$yCawyt4ㅫyHiUZŐ^EP^+FψqE .4@X`^Hœ`#)+U,8^"HXp}|OQ%f} O`ӞH{t9|rϙ9sc׉2Iܺm^o,S A?SΑ ŏŸ?ö _q?_Mк2Aѓi)<@v 1()-q/Xl).ݺ%.qڞ3wa٘6m.^ (TՎHؿsJE`X IDAT=^-Λ^u1ct@|zpR]ߕ.v/T<<59R3Z}ZhVi8O1D ;H̓"7-IR}\G3c|؅NDZm1<}3 AϘ9st,YwQBg ùsjd,1Z|<5HTLÍFuL6}`WUnǣܗ8Fw$Ѩ:+vNvxSS Q_{:či,ܺݴ7ln؀s'BS,߂ߟL kйS' 7cAo|f'` c&pJW*ߵO0 IJp|HA^VHgWp(Dž~BV-pmJpH Ƽa8W_Cw̝< m4c֒uZ sMPPLMZ[P_?=G&x]0x^$ʑ{-Za ($Qg/)9ܾsQ:7\>U*Ga12,.86 Q\T8O0{ 4:).  ^j`_i( μx^_0~DpJy"'hG#p8N$l ;?ݣ/w ѻDV 0c mDgTQy)d.$E${ӕ'0K}6d.-"N_o]lnKˏlHơGa⒟(;ѫKlrNR}pxhLX R:NdZ$0aVMŘyKEYU_zQa o5ʩ}on ЩSGt쀑63:֏ԂÕٶ5RLx&Ÿ%+URAo^_t @B^~ePe'bsK5V{ ۷/Jp bԻH|*Fn∣?QZCgpL=Oe%ൡ)-f9}ZF[l5ᜓ?8C361AWP#|sF)hhtƃ^p~,|i`[!21RzzpxB !& 3bx}ǏJt :5мgApFRVز;O߿_57 D8Zq `]AkdT{!^ aP_ =(xR _`oᗣTo#g/5ʨ;g^``qا D:)n.+q:t$p0 0$jD<c1pt2*KM3RN T/!~|a%j7teg"*Ny#g4L\Cˁ9-_@)5e7_IIry71"qёUta$^W0->$%>v>fgAnе+ڝЦ]7.Vrzb C|7l$q\0Oil-^O Nzuѱ][]Hb1`طsȖM8tV.J 2֠K JPSS#J[@O#tk] 19MFf2)ц4ANnYӺu?-}iɁ맢w@ϧ1 {2H!Yg(},1$v0<##}POZZ 7s(!$3-?Nv0݇EP +*%8TÓTl` PWE4%liy:m];i!){sxwJ!<Һ^p:4۴~5P'E Fa !X8߯dn(t<Y4.2cEPN  8\W3ef;1 ǡ:hd[RŬE9$22fَoELD2 ]5چaz]m)swkhxfsUtܖqdʼ!6ts"WKYAL6OBq8+l0|BqHOƒ1en:#:6 k sr)&ofIO4{v]d~;54 cL4ρ}`tNP LNv1m{ >o F_8䱆諧)3faY3j8 8*W~ 5}V,=Ctr:hnɇ3wCNڝ.=={oCr< kê%3ѹ&z1bŃ?kvA )~vݴᐔ^E7yC9`[ӧNСð|n$4_6W3Zzg:dnI(hrilv ޵ضpNu'7Kƞ9J)YHN+-ɵ:Q͎`Gq0ӣG^ohu+E&6կU+s7n#n\ cGdAGc ={7v>v/X)&`pl:ri6wAppss)3[)G? .#ɂ`1ؤ<*& b#at$,\$̹vt.#K#N<Ç豣p^(Iwռ"cR,{FFWR߼ܪPջWvgeI9Abاp|~Aηq:tp]ҳ,n_-KkdT@g'68N48v8\GPD J+%ƶkΟ?*%І`hk 򱷱P&;"=H| /S.G5[<B$e#w2L15Y[|!ͬ8m&90I["s2.`Y ̽i`7 o=ol/KnNSb߆Ą&Ap c ͑X 5xFfWkcqf:r]yylt${ '2(:KyT}QH.J"Ç4qI+Ff~1xϴ`ICđE7G[Fuhnz.X;`R1㋾}O>gx/׻z{o+OUIum].iS/T:/ukh .p_ yr2EY+M CnN :Q ƦLâ8ovGxP {vh,fO @\{\>y=D򵴲'cTtU;C[ZZ#,3G~~~055Ett)~­[H";ݻwBa샥=RٴRHHR^71["¡x_nK p4k׮Jeҽ{ffC{'8/ ]>+"IмiѼQ :iuOџ$5PA8p(x@-p1>YRd(Ajy8dI6$h xv .AyĵGSCwuɇu$ᢝb 8eT QR ̇D8PceimU/- p AZ C-cTl!ECdFXQ4d d4SЗC54X>+k-<#bSrY{w^YFX߿+}MOM8DYv7batlGSRŅYR x:[đ%G+k G3MX/*_/w/׿|E@CB9|w*&vI^ ~Ե<<؀| ^e>+3=U)>H E8Eu~uxg#XLKMfU8ba+|\`Z&ӹN涧YMw +(DzOyw'@06NYeEotW\Ldݳ=+DŽ&|NHmyLc$bT;j~)cIt64^W{H:N!B'^R8Y+uvrϻ֩j}9[A} 5}S-8:?1>ˏx"VY/@ټo4mLsIQBrhB"s_֯u`Æ صw?}B7J Gdɋk~ {Wby]p`.l6qv܃[Vȣh6d&18uUy8yp7l k@JSuJuضe3v=6n܈T+/!<-wV8Iܪ$Os 0pg:28Kai4oI cӦ X8khu#&6$JzADoEAs#N]N@/Qm04.=za 8a, = 퇑K 1_ LR&>FYAn\ ֭0u&@)A`+KcUg+ѲL4 ?K\oґ6oC/Zl@tUX#$&&%*pY\ߠI0'fP^7`л.=HgbS*M/ؑh덾z|=bRҤJdM{FJ{UJy( aK˘_@3B@TŰؿZ}Z/zS9o ѩX!)cpZCC&jיsZwMt4t4#7Lư-,6,F/᧓ב[I% ^ $,fA[54y)+iˢ:[7 ii0G{bݫDy-$Zz^QV{vb>_= c %'n{ t\e?b׷a1Rr7,[0qSpd|ߛѥ]['UH#jUzՉV0<4e{nz9RU@NpjMb8r,[.oܷ(%0Gug=+\r 3˶@VN߸oڴSػu5ޣf!.5ى8l4۸G 6! b\HC׵BmZB[ i@ҁ*U`hPK&cYXjn;"/9TgJSyEi9^0mt:stԵ0TWc-OL2_k~FϠߌ0 .A;ͮ4@^BuZѩ~ܼEbH@Z-F ҡwšp1LR=p *hr2AR p47'{L%,-̄ IZGู7hMpA_#8=\bB1WgZbS"@HٍN;ÊO>]/q2 EE(<>.X^VFtĨ+]Xiv<2Nap8V{f`Є9Q<"OI(ZܽZ ӬOhi2E4Kw5WCmpKV\\? [B% TIM'מؔɒ(b >m6){w9I\:= %D.kS7QZZ ˛ծ v+0w,?2E9˦ G; /#/&Qvv{">oXt1tz .%V՛!@HMtY&uOsO 4M|ޮ;c$Q1Ϣݼz'U xQ2B YXx?8Y٨A`6-bҭ7%/NЯ& 7GWD1_#n*ȊЦ٧3y4CW߅سd %8l ݑ1<&AK߲B!p(bê,ܽ%c|] YEd0}hYw*%a~'hjy-*'vXqrfxaz=y<%]2*(YÀ)qt;|}pN0WC!I{*xF*)Ȁ1p.)2߻cCH~)Ӧa 7~7LH(At ֯3NC}t]G](GZ 4'1ab<6_FAN-+Fвb IzY}C4s*׹ 7$G<ʊWym>F1I~a8,tڛ&Ȕ˫:vVR}J2phhݪ NXD~6w7/6bBFf2L_ҒTck ?mYjU>2T IDATY%٤/( n>Q]9:V4`U}8nx,ݸI8te0YU2گUGbq#M@WrVd܏K~)#ΓB M\<;tzhH|e^Rti~LtzJ5*J D57R>]:a)O]̃+x6q dɕNZS,i(; ZVH෕Nc9Սe4ˊdw;( 8-ֳBgx$IqX,fl_$9iYzYꈯtljC1H%&ӿ2@K_ [YQ:n//3AQI-pGA?vO3'aƘhMeO%L$ymtx 'WoUщ 1^ylG8TfhV0pg*f bToN4˚x]eEزd">!39D)JEKp VoS!ǎ-3s҉!Nqht1AɐOY?ێ|l-pi&L6OVA8g톈("ET_K4aܐ^o0v;-`A[ۃ Cbo n#WKF`J_ G0{$ZrKHɕʯwx dѱc''b +K#k{hb\a$,%{($kU,z>\{N_&Vm]Y^y_ɴt+/ѦUK|,B`f〴l8<>ڽ0?\lq%X#G!U){PUYC*p $Y2=tq£Y5hiBqgY::h0Cz2r Ri{}uЋL# 1p0 .#'/[ˑ-kE7Iy $D>Ϫ~0 m]}%< nS(]\4ݺU{ZZ=uے ΔhFf/g&(NE :aޣ@D9(%80@)S0t`_ttݓZ1cp `T9/y`Ҥq03m4cױs r\mZ7 |9Ys7&Q_s6g7-hŀzd.ê$6:@LC àAԟMtjsn:n=NUe%>$"$ Rӥ{|Sf1Ow"%4RcE,88r) ƏNN#=Gvn.J(3t 囙@H8r\\\ZZpYTE@K,_Vv砪,9Re1T՗rusCxC$ _?efUAeHBT0H.Җlu I9-eJ}Q~&P-v^{RzyV.%E^^~n(,16.NўU9 _p0%6S{~pBZFsEa6$^޴,K"ɍ$(.OF(MGBt4@ SF+3T=ƃ^JkS2,y*Oآ|TTY}^TeVϋ]=ս/=#T5DG5ezy*wӎ,l*Q-}GϪr붹VyR?)i.P&%ͪfBAT{S4,>%bmqW VIpkkS1b" 9цfeRξgtm(i7V4GSzߗ WGɢR#<ҍdF WL]o>YBi.65ٌJ dN/.*xmU04GJKI,1Qj4@LȟA^]XLG'[Fj{FFRnFx|my0 s)$ ԅc:ɡ IG_Pqې9ѻ"B$复>d˯30Aypr`YDJA=a!˹#99r=kG#SK"8]ic|oj[CURFpO7gZ߃Y'6R:o+Mp!)'³PՆWf^[m,kGomv׮h9›ȝ:r L|-);B׆R]mh}DGBrxCQއ r.gmT렠3Cx7DIENDB`fotocx/images/crosshatch1.png0000664000175000017500000003515015247006660015231 0ustar micomicoPNG  IHDRmhtEXtSoftwaregnome-screenshot>,iTXtXML:com.adobe.xmp 1 2 3 0 0 121 286 1 eXIfMM*V^(1fixHHgnome-screenshot02320100fotocx-26.0: Crop: width:286 height:121|fotocx-26.0: Sharpen: median diff 2 20 20|fotocx-26.0: Markup Text|fotocx-26.0: Sharpen: median diff 2 12 12|fotocx-26.0: Markup Text|fotocx-26.0: Sharpen: median diff 2 12 12|fotocx-26.6: Rescale: width:257 height:109|a^ IDATx]T׶{&71I{E@Qb5Xcn "E@n) R[ʷΟ_iafΜ>{p/ uS9rq@~_?~]zvX OG@-倰f駟 =z$<_ϲ}͝mڋn+ Z(,,Dnn.,y^PPbW*:vXm26l؀7x^^^Ee9z(^}U۷bbbP^=kRG}J? D |ҤIڏW?\oR;8~x_dW:G*ues+ '%%ck'EcUtCss^OOOR*;v_/^1N?~<`͚5uShiM{Q>z E!qppq k:u*ɓڗqut]z5[n,u_{|prrQD:đIBKeo#F$1cl24 Uf#X l_d d[wʕ+ѴiSܸqCgsdi=cJof͚I0 .^X\tIZSv:u gϞ2[gσ+?w>+ 0j(4J;.\@JJlӧOzx|tX($$֭XZZ͛Y sBJם^T`@ 122¿oYeMЧO'`nn.ﱯD{.Nc%z 'n0l ubixJ/.}Y/ۼvZ*ݗꜳ_,@нLWV(@T]<"Vf8z|rP/ {-.\8ϱ>ꀲU BCC }N:;;Kev,="w6ꊮ]JH7SI9 UVaÆX|M̞=[*1r۶m>5o\ҟ~g̼Ӻukjn]p"&->۳4|hժz7|#ݲe!iTT2 P~}L<Ç3<e>vX|6'~= ׯGtS  JN:$ GpaOב=(m8qBƻ6 0C566JMBLܹSZ" ~˖-Ak*w*-9mtAE&A4:12<-A okk+cl*.=!8P&;zU$-.ўJ¼(@ ߿?P֒$Z&ۨT(ڵìY@FzƸq㤂 )E___>EZ=5z1=qD } x/ d+I╔ٹA`+ܕ-L.B(S٨B8 =. -|EL߿_8tiA6oެXҽ5%yA<)Sh\\`,DaҪ)ƍ%0=9V_٨̺Sn߾-/ӭSYnQI<3 l@ [?w-5s/ 4ξ0QI0/Cq 9 9~\rE#у0֣[nҽ= 0y~lmr~Y({e"=Æ ^(@|AY@\W^y̘ڨ===}fy2&^Bʐ T*'EQ8#l:ݟ3gJE`ЦMy?@VNφ!; HkEࣝ[ 0Ap"쏲>BeY7C" H>  NeB({۶mS"gs;XBlt!HT;{{{tOOsCޔg~:[nT?KN3CjF45`0ƻi9q8ֆ.vFy޼yhaLfQHp3`ހyz l Aq8D[Jex2ai ڞ6P!8%JPWPzcܮ+ vŧOcg-Zz E * Cң&m+ +G 'fhi9"P*U4;@yl>cFOUWh^cŊzYk֫l,HKNהdO3Yl&&ko/*QArMr}@KDDA (l*W@)mL;v Y膱TTZ̪fMֵ^zTj&'*=(9sl{+;CۛR@ӟpg^g/7T.exkT,Ke6#j|$u %u=k G9UC*ziOuʌ}P w3@TT2;[(taY. xНe҉Qi xt0 _^@1 y*9]nes悱)ѯ, ( @`A L; &7A$crŻ~ oZ3 ؈ä'1AJ2c"42Lk"xcgB8s3α^6@ {z8%UFWmn,Te]S}g=gR (P\mF3L+F!@PF;`GS5}:*UiVH`Fwq7+Ϝu;f2p8dDp`<g1={JPtD| l3!=ȫ֘G*(J7RhW g(E}&vF|ڵGןmq2s8 _-9@C'p̴ǀQx ]UkTB_ՍGl;e% D୉[AtM8ZuZOBsqڍ J[{#d@>KA4gX?w 8cgjjOτYs&[s4KSY.((H^BOl45fɝؾ}8Zd*%Y?|#= <]J&|$_X7iahFeO{}1i&26<'@(s.IiE 9N.ǀSFC/H,u`U\qzU@wreXVEG:c@@yH=8@E2,K%Pưm>Ke~ލ0>yEy] ^{9@^,W:F 2nszn Uyࣂ]X8VN ϩL~ꊃYz$SNet ?ʣ}ghTTzW&PA'@#{_AU2Pwe@U#Pe@:.Pw=eUPA@ P@z* zu\TzuP^TO@ =&:JU:%N@B=XY@HZpkO< tD$-j@U-ɇ jM8Tr1qx?LbKu땓gkEغf"k.p@jʘj||6{Cxө.(e 3)Xegk/B{3+:?`^ћߨ9vMGasLk6AƭźQPpMG j钽S بpD|I |Yi}:" .&Q.D^  뉎 GjA0%yለBdt SReĸD&>2qW~#/_L$Ĕ%8R^DY 8CжYc뵦8[a{5uV} cEW^÷lyǽ.PA@ db& 7ǨоC{̙5CLC.B q( :k&_ꝇ.c \r=蹙I8+/  3HR4['g*>nb6=`C/9iԗӻ1c3f'ht",6wo`Ōx1aԙ|6J]s-ojNVnXr?Wc4yT_o^=1d.De yp}CkG<g]F+θ٣Eӆw0_Nư^-t5D=~^ףFN.g=]?yzM(Rca009'pzS'Jc ^|~zO"-' B}-8uv8c,ݼ YOPY `a K4轅@y!;{ԃVSCWTPAy^s pa+uO,f>N} XFЂ7>[I/ƣ0~ I8m{{'qt1\&$Gƺ#1vNߎFf^`ADB  %ӫ3LZ'V(=ۗԪXX.m *WbVФE;MxnH4{mx>1Y *R&A('ka6n(JCN_n@pȉ0)H(+9Zonjy_`ɚMشmnDB 0 <B\a:'Fmׅߗ{uQπie KvpŪE3nwY WE^zg>Czs78)dbyxQC u 9'9Leqg?6rb?XACm0h3d!&O>W_A[{$V6TPt&Z ԤxI9'3!GAFHIө5AYGY PC;YfO͍0}-r~c<GA]кK_l$TPʶl_;W.>7bԀ4a _ kS@E)oMիz*Ԥi@ W,=fUkr.,\ J UP&֥ځЭ Ց?˳u,ߋk蠾TD~1Nܼ~Vq5&<: <Ш|sMխT=:.*qP˪?x qPA X? 'Pe@:.UsYOTP=:.*qxˡ>TPA@ H̀EuWy@H2h<<U i@@\q:xVVT`eE-TPu\TZ?ت qPA @eZ1 qPA @~n.=l,?|<'>Z!I>#4͑C8 +pt8*_~XYy¿?s/.g9PN: ?F/.^zJX&!.]%>\Ӯ;#d tu:^GsAXbcꏃ6y"O(,kb$ĉ*0[7|'ب Pڌw8jD<j ?yp]x*v^v_j_SJ~C*=ɿ:||6,~-Hr ?.h_q]'P-X~iwA)I~\qTwnK^eq ]a':s aw4SA}D0mmn p!/Xyt4]GvN'K2\`|Qa>2[ĩ=.Nl=r_lgn!&IDAT='I_P2>U?pB{;b޽X#YٟAPtܓ1Cl-ൄ)GIi ^Cɿ{aaH/v!Ps|gOy < e?'Q~5 wÈOb6}*^1rFFh)k36v"jl MKA^6.ی z>d*,Q'.dc^|b0YBI*QwحPi-K8giG̜<}zbH9 ة ~s>)<jI F pF= C vQa!~N?)} 0(.U!sbԩd-L'MMrQػ} 'Ǽp&Z)h|iLǎł+0i\89/\p؀>oM1vnrگ* MX7{$aO6+M@cclZ9k/Ƥ)ӰhFӔYT [aM)~%܎_bӷTM;|t-qVE 3a}`43s$_ 3k0X?m߷qo.\+im|-nEd* z6) Xb& +L-{ҭgʫ P _7 g G}k(9F0[KѩSO_%-zW~Ӯ; 0rT;:badd&`90-@l 6lZ&еk]@L ]N'NyGXd|)L Y nȤdJh\þ5X~4k}6L 1W[4o zץ@޶ z f+OKMΆqVL^ 7[cϡb텸tĴ/QRgە pDJ_ 9IL7ow?lo=)r J#8UOa1;Qto6nExr2Rb1og4&0)S j7n-?X 5+ YYHم3c`3 KAL5sjDxY0<q dRCðX쏌4잩)L>g`~[B`f6<P(6 k 03x]Dȵ98w5 . +pL[)Li@dxw`  Vvƞ٦hg,r}'Aa} M`~N36Jyߺ#:7;^*g$甸JyX&&rO7P/ˍ@cis% < ڿG@@|Fv@=g6{p e,̾ V_b8(.1шrǼƘZx?a7a8d{]BD=9x`Xmqٻv9fĴdj]K+cy  rJٜ$/7Ā֋5ؿ3 #D,꽅DaD\]\][W+"4>m[ dbWe[̘VHRo /g/)ڍC'c@Qw/ͳJ.AO ˽o:oCqWn ݃&Y)gʗwk*xߊAyQV*B/dyPTBam1>V;4{O0] 1bh<a:q}}9a3Ə1d xqcL\Hއѽѽ` И0Ӓg'c=HH$f ƒd1;PBi˅\TLp+-02eV}Xづ&୦p r21}X77.NCr·W^vƒɔ ;=Uf敢̫(2c01/h-.Qoav} Q)J?=O?c(phMvp:ue!Aݱtj!>h.NO3vT)a<6p%PV;iw%hݥ/vlYO'c̢MNHY+#UO&ڗrĠ༘)f@Hq)-zĴ݌F 6N>!b)bMzXēbDxX|G~J$v.5BIEZ e5P(N+lJJ #7;sD}*b.Ύbv@WN  O%/+FѦKOL1Ӧ Lѱ};,wT$2ÂAhҼ .}Oď;qsvezpES&?l]"%e4 rIճ0f:tn 0I)>ܹu\}M/f5_%"'='-Va`l}@X|q>Z6 N pc=LZO?|(R>O?C`VKDciha 1zJ0|<'M+ŲQOgk 7ty$E.}v5cH?ZnH̝;[[ s -;b ѭc?E%"9Fa茀%Z"C/@usw6nÇH ɃGOHX' z 1./1fpY(,}:b'gQA!5[8euAH \Yhbzxw |:}&NA=wU˖0%_UV?j"D) a>r0uScihݾ+sI |b̤)t81\"/ jkEJ$z-˨ "Ed[:;_05źe1z$EEG4 kk1#aYR&/'&mz7T«=``nF oy,3AZ㐟 X4Snc퇁ޛoUpJ1%HkA6> `-< % DRJdtdrzu۬Ōf؏ صN;dbW^'P*=|=:<q)$\(CzzJ,<gg'w/Nzz7差Ny$lEz["Y%)+#}`og7s8⎰h+p8N &(2'#O?uÉӗ+]S1 !W^y/|Paee{A4R9;Фc_1%LYYg"Qz&,S8"޿0c~wl@XIMA?. dvYz ;[k899 ݼ-_Agq=:Vg&"y=Ip Wv9Y\)MKb󸓋:|BoJ"ODW"Sr⨹{b8gd8ayieJ뫵(֓6XVZ[K+ikK3'@EW/zY+tњ- oHd:e߄-y.]%h-4e:. zvp>R1x ;&t]<g=(dNS,Kiڕs*hX}ץ:;VyJMzT-WAё ^FZm|㓯~ P@+1yTz *_^MK `Eh 񌮺^4v<}YB?8d>8jWN?kCP@-ec\ *龿BU *qPA jUk֪F~?"T\{YIENDB`fotocx/images/unwarp-closeup2.jpg0000664000175000017500000007321315247006660016053 0ustar micomicoJFIFHHExifMM*V^(if%HH02300100Fotoxx:trim_rotate| Fotoxx:trim_rotate| Fotoxx:paste area| Fotoxx:paste area| Fotoxx:warp-curved| Fotoxx:paste area| Fotoxx:warp-curved| Fotoxx:paste area| Fotoxx:paste area|fotocx-26.0: Crop: width:623 height:317|fotocx-26.0: Rescale: width:415 height:211|NE http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 317 623 1 2 2 0 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?/ss? \O6a$ˣ۳xf%2I995ŠkD¿$($GwG]p= -k| k½%]Ѯ o>;uZ?: nV>nJ/[7 hzM (INU4- $G!@xAҽO\]oi61׊k>)-g`@:TMꚌlf 6r]\[DVOa~c,в1Ҵ o2ҳ([c[QY$`^jG٠WN"^?JͰoDP,Jgrz_“G1%T麳H֦W-U>9)K]>ǥڡ1 q^h o oc(`h߄ 7&3+rVNMu 9x""\.SՆr+kG}/& .F3^15CgAjVq8%R}ΘЦG?Ze{Xk+mzͺKMuo:j/7{K{(b8HWؗwyte`Jꥈ88#᛭;) 8v~}4^գ "^gn i|AŕHӽs:7"A> J.|ٞIm^G [!ʿJeώ4CWQAM"ٚxc޿./oH9x#?eY6zo;9.Pi냊-W*#RoCImP>|5?^WEnxkMP3PV~-WK>o6#Km-r= -?E|5{_[QZŠkD¿$)?E5IImWsTVEnbF*?? <|6/i~ .m*KQ#~qkb3[ y`P8q_Wn.:ы(PAڊ~Uuܚ{:̺66l {s5l>XƅIIwFֲhW%[XR3Cq|??ʓW44w~cU9R9k(mPpBF 8'` rA7=z-*][R#`IUU([+x3b5wD+@zzS &8ᦓ`$ZM2d۠ C'] x끅ɯ6U=xxdcXYAYkvlc?kGl:T0Qj:LmQ4⫌usϽRݐ*PG)ؐOּg­3 $Yķ,'7q={EO6 9淅YE*x6h>> `G$`V<.٤_ )W|MwqL28Ƽ2ΛaV3_EF lziOťY4nBpYzton][T֓]v4s`%3>o~P:($?U{˛-Fm1'<1 =k;JN1E~|5?|+Ko"~5O|+Ko"vtx7H֚k.I ^K 5ԏ XLs]ѓ5gfs=wNh븮W.Mwc_&~ܚ@ѴA-H[fo8}+־.JǗz"ki2ؒ:3Hۇ90rcRς"v@ ןi[DYCN˒{0O^L]jӴtR$A y]!ۻ 8wId &?9s?\W'#|͓ՏJ5I~dPHp}@5W0ˆ@/)I]ZV6Cil呆M}O$aXv'>urAUazWZ>VH:׋b}.]ߍec{E!A=)T NT9=1*)sSk\qΙ8GqkB`:`W^98u%LcgW3ߌ2PkVW<xZܳP^[VC_\"_I6;&ס(6y c[.BKJ}>FT{^59_'*Zwer.dB庌`v+B)e 9=y&=&UUPFZ{uu˓4@?[o!IC~_,ȹ򮤬ad7s!v¨; v=Wy//rx_[ͬ'*q9ݾ0Ġb][].i) *U,B H^;>)%Vp3LW GooZɫI8tFG=ȩ$9Ǹ0nTB)ڼ/&jdsP8m?Mt'_[aWU}n8+# c6fsZA_=$$q|--A8SԾ,!X~8 Hpr1^,R铘#\u>*Oĺ 2dt^a#X$Qqh~~3k4[ߛ;G2=_{fZkkiKC(a"}w#}Eucͬ#$GwG]pY.MvWQr}\HVǠW7{q%ass=ђϛ"26z­f=p#Pdwڕg(I=k:9cdw`{Y=" ND@  N~W!X mgEzWl*vP9ULFq4Mv>N*OC%dp}i ɼ"g&S.T}&*aǥSAuPw֧b9-8FgWX`tQ%RrĹ'j+Tږ J[=s\ĒƄ77ZRw9jUr6Rd?ֽkZM0Co:J ^>b ߱& 7Z,S1!rk!ҾE9ҭC&w") E&q֍WA~Z@Iq['a qsQ]+Fs@3©'W͞x6,ywvqnգtD' 95 Olx sK:4WЀ0*6$t*۴NܐkSŞ+mRmcB>IbZ*6); @N2ByΌw`l5T֧n(WiŌ4O 49e M  'Sgb!Ƿ?⾴>Icۏ^rQZ|:0}?8/ZE@۹bcE\Vn--4HUG:ӡAׁ6ϳBSl"ׅBz{Ԓ\ƪ5n5T;Gj-;k> Ie1sޛFɚ֒gL險$q1v$Qk șՀ{ڣ8'q90\/$:iװ$z¿0hWuR$,HSV]w}IV>H[2ѹ0xm$'f񭆠<,Dt5TWk\f2RZuX6%*merWW%KS8ϮxFF pzׯ|mM~~ė.c;A,bfL5mjh۩@䉢g^Iq 8&VFO~,n YLudp=7J? i8n}Z]~_ޏy [qt%ȉ <+ѭ>rKݔ<-܇S6]C+0IDǭ}2g* |Z狦 Sb ߽;BU4dlrs~&R_OXXVY\- mF@>$&sk/"+ppWט]_g[r)=XȊ֩Iϱ`p0rGxk4a{4rFHFgs^Rֿ%| ϮKht89I<9SC: ʋsV?) RKO Gan~Z$08 2]y*`mb?SH]_S[ (@$:*plIF Қg9'@7C1]%&?u r:kO|>>\5=+g7Hci 1 N uXJhT1&D֞.2v>/9#G@8mk5yNj|)1dr:n[kuxmBD5FX -u1oLMJ[#dBlXDZqQGCo]ew8JSd^q k'HabwuqIe̢JX$D>&X \rJY&=&v烜8q\T84`%ݷGᅛǓSM;\!o1ur턣z{׀hmrL$cxB39"S7Fj =I|!Pz 7+v.Yag9ç\ў=QάHڹbc xwW 8^c㋃l#f8n9_Ưcz!K|$j:}I <(OJ|L J.7t'kU4G_ *Cj[hyYW+0=cbquzMGTy"R8u n^6EC ;5,]NfKOsof,oy,[<љ_'GYگosx6΄d$*HXփh;'׷EY3|#u9S^{ Zaֽz>Z hឤu7:bxux8pu_@! aoR+ []m-&tKP̬$3s_60 `R5XuWgI4s-ƛEr,ۃ*k$g#j )y:~$"6N?-ux/1,d19oAj϶aI|Gxt7`d<[x$ {cφu{M%J+^ǖp_ax+5nGnӓT:pA-OugyCT:#oxkPMwqX^#M aTvݕŜĶN߯=z)i)B'_ f@fAo`{(rZb<|/zHT$Y\]X&3Q[zd\&;\qik}طaQk f8Bp=wcwR}t{?$^bJL䣆?sPlH |qWP'YWC|KQ NV0構QBhmQzo9qnMxEjd1`Ab[ޒ>jmY ω^(m*9IF2D>#+oZZO_NۑopM~g ѭ#{\\N[q8[u_x)E28Oʦ_5\E~.Z`}CP$ ;~~|9 ^3O#-7t_O_t/UnK[Rux4{Vo岐!#9$^m^!ס4G_;IڍŴFal# ꁏQ2;-ϠNFo!iāPB2s\{t0<1q$TpL'=;s^K>NLe~b`lef+xB͔nd g_T6)2 ^,J&x~h~."q,΍l;G+;3 XV|x2IVd@ci$s8:WAiTKFſe:iPúNi5n+bЩ)x?! NPW[FۄTjc49=y!ye Ї^m+ϵ7EǿW2oVC_6g]Mчq5xJ-8ZBj@ĂWzsk( UҮI9V@A:b^H\l|_jmc[̛y* %WzVpQh3#/@=z~0to$(p+oM|q,@ZƮ*ri`y$R?cY}g^?bKRrr5^Qx[╖vK; d&BpzgW,|q};\ӤDH wWD.O&i{ٴ@'5鿲t{_a,Zvwp2.&#Ty/>xZ75KU|{ vrzv;e>JZ̧ma77)*1T㇧KVa~ѿo1]&$|mk;A=Ox=!6W`0MzNi6A#@?xkl .Qރ=ԔݺIF<%>XKʹ8Wx+{EH}C7~mE"z|R[v'HKQ'G+2?6㸯F7k}DjWQn|JNrAνU2լmo!hv+J@ZEg uBSlt-g"ol 3`<='hȈy`1^m(X&FkʮwGa ԑyołlfQ48½;VG0͕kpqי)zx[DHYdv dV<ix&o4.-]6R8Qմ)cq4 z3ZVx;Z>XmWYxv ^! 8ҽMѬk=G\~&s]s;I#~Zz bbLV0Qw<ꓡQ#/=1]dbP~J! lb-t"c'ח:z <6kxwD}V# '߂SR't:mUZpZn/U."twv1!YOE26_y| ` ˁW;Qģx?LK-ƣ :R[?\W{5;meԪ5\_u+6?ڤ?'3TQ:I%&ɥY^i6:{o?g[`[3<0⶝h|5\jW2_lE ; ?_J1/? ;HJ-V'GH~ibƽDմ< 1wg-;$nz`z?qpūȉ ~R{0RAѓ+Hw9`aLd+ῆͤAOfنqH9>.?3^\#g^14! vL# vG?%V{i0{!ܿ6I|$~)ZĒ{SŝI=V-A> ~Ϻ?d텿5I[4**FH$d|@'ȯz-XJ)}0z Ik'q4^^2yH= t_sؿt_G>8p9jGF:_0hFҼ4')/zj>c=>6iR6٠[Y 1a,C=Ѵׯxxº!eCUR-#VGȿw[A9u.M_\M2FòXcz𷇦fjB- 2 2F=஽;m\W$g$;*5~޾36z FLJ,5y5 sk$ybMl9|+|CGNCDַ"ԶR7\)@9^=_֕#pyORFTU ͖$Se˹\Dބp)9!dj$Cq$ת$ r2sӭp3%l=MOQk)+GKL$k k2K;,F =wڢ6 828siܖxGz9>ָOc$`#.}V3W8`ۑ8 U ubW'>E5\ czHYG$rV\u9Lry=s)@?J|6H}+Q8*C>c}ZA N4{ o -h!eݮ(i Wo ڻ}bG/^!vڜ8홤02UQ3_yQ%PV8 `ԒOji#mOH~hz&[ZmQW ]o8+p qu/i#YNe%HppO\Yxm3`v{kT+//Ej1J$xngC_?/21-k;i/\*競=9&4h6>ij#1{y''5\[{ PWWoC]kiSnwFd_w#V," lxh_[O#~R s*O].3E~^xWZύv ڥѲUڗ g__| /-u7"~|;NZeh~ϴ 2+(<ܓȯ%;꼎<,2xN%T`6@׊gaA5A}Ff] "x#Ҽi1$L^k=cG.Ǎj5R;^կZ4nI5LdQ>ڌ˩sFVq E:Zuby!M(Yboޔn!p ʖHV?@kG4k۞=Ojjs&l^(=2kז yͯ.Fw@ZC_ZvbBtF *Yo3:yc#]osȊ.`Fryb}$~yT^ݝoZ7FzuE4[tVG.kg1OJ=k;-zH)&ӂ+:^z<Y|GQiR13o<}s^\/"_^:J/RT#jzm#殪n -DP\Yj?k+{ p[O >dʽvU1JFzt5nмY@$[ - W2U#,&">su{ȱ|ɮ$ot1߂@e+|G,Gjj7\Zܤҩ&=޸ڟv=+lB/f}OǏjpsfRff'8V(;F=+ڒ>(fmpC%>TK2InpM`ݍܮővzkh\5^Σ:Λfy =8'Zk(7gڲ"F*~)<}NiG5/,7jdmtčǧ^L^֏ksr\ܪǿ<G[X,"m2"K7pM8M#T)vGxwK FS(﵎=8rүOCq /(t(AD ײC& 1`ArU39O [%d2m11vZ\[H!,YOrOV8vCc'ElcilR7&tҠf#~7j"LрEi/@+r7px]jhX]H;c_+دd yo'\kkklIM uB<#)_<ҩ,.!^'n}Qx&Ү WzZ}-CIb? ׿"7Z2 `RN8`n٫矇sf ѥr0\cWT LS;J/FdL;r=+5>Gʐs\UBshN(ؐI@4ܓޣVmvN+h:k<t+~[ ޻8I#⧑w'=j"ZhTqT5Є :}4V#^)8gPjI3<.ՎI;v?*THO ;T-x:laxި\rR`vsX1޹U=:޲`9=6Di>qq~UFrڥ}#m9 r 3à|9q1@+ܼ A]O/1+_W%4=YKm<3u浺wN?J헥q^)Ag 9$uF{n?Jm'"_^:Wp|>{Oh^>!=b:lʺqo<ܣ῵=/FZJX5x1=?H{? C T%|΅O>Һ߯'mlW N \i]#%?B?:|kg}e^ #yt5ix%h2TuWD[}ĭ%̏W( ڡ zk6?y_޴p='w8ǛCEYcE<"lDC_?\k%c2ẺGoZI cֱqUՂQl5ç2xMFX<17mg޼]׈]>?:AiM}OGB%tO14#uT~@W^xy&1WVoo'8[ @bOr:Wۦ$I=뙖^]he;08*0\7/]XŠ#9>*m "Pǿ*B5kC# ?oA҄"6Ⅱ \`^%(cWMmݸ2;5p7G]?f~Ϻ ᭧xpM!%!%@Uü?q+|W_RXNJUg/S\>`=WPx[<|,GP{WE}:5%SR9FNF9,:S.6`w$Lͱ)ZSWU:4YdI8u_wE N+%lq'"$RT`9(OKjO7п|Yr_x!<"p1M_:Kٸ$\g-go'J^6=GΓI/]&y"/'Y~k;!1m$H{Zy#(s0bv=MEdFsڬ%KE٢ŞpUO&9oFj/<ZS|P1>GsI:qosh뗐b'[f+@W,4͍ƍ''ZZ*c$юИI%mbk:yGխЋx$O%DDP}43|E>HQ9(F5קN;džc̫]`)/3wwDM…HAn tqyl_> NVs}Wdן yᵹ畤foRk߆|2}y 4[a9XW \WuK(XA\[q#X$sBMu.՟;OLVQCW̮s5cn4>+lmғ6o,wƘKtYl8bP+l4ۥtЙHY%0?w, {B\vdrʪA-ך%෹$}iN6^6hmdF8[r$?Ęh)YZDeyZZ.x;d?5z29q\ُdd\iH{"CuAةdzձlMzې"F{[%zb&C I`Ip9ʼMt? N6[2օg סi?& =&2F`=j4+TM|S{4K`PK8ƾ7[kbu+ k7>' fKܿ(gbś{|huNR܀00p}cW RK]^j\Tnxեowpy/] ?w4|ǩ9՘R]2yG^+LPѷȮm%V m=kC ל.]'8Şeu4 @!VEP:]n3%'U3[F=^ܡ,)H?dgңӼ00*ɶ*哻8jrw`=MhtQ0$Ttysm"I.-T6w=7qφ~ |JHu[ym ծ%T1:'T8Aw`Ggq~zMX#Ck՛ֻ(YP:0e# ڤHY8Hw`tR l1X,D4WMO= sHgm*oqrGY.k\}QIX_g8_Sڼ,gZZtya菀?< ;K<}:v]RM$vRxJ5G#!J<|xj9x.Uҷ+2)ncFΣ?~5]j-x$mF7<3,ƽt(Iɞ^?\%8Ks9UXі$GN}Se|(O\Ƿ﹯OWӯcSѼsx_fUSѓt[K;]FT5KxVf.2@R@t'd[_ſ|5?Z,ڼovvHb `=k;v'FV +xoF$iw~nz_\A },}T$-;2`I_cY~dR *A\Qu}Eyޥf'6w%"/[-~aBS]1Ȥ0W3M6vFY4(zr(ްS+!f_b;$lOzŚs#[LޒNpnoJ,w&A|yy3MHN $l.[]4sMwn$dL|}+X]Au:H_; r rkmɕῴGu&3+yRCDIZb4p]-0S 6|l*KHJUW>_E~÷f_mKXdKi e/:}(_mK=3 {]cοg1YnhkD2=ٿ:Sύgċ]k"Wiw1H>/ gslf$I-ƿ~kAAs̓He@W*;zp=Myr`o|JӓJe(ӆ=V' x| mS> .4XK؂%z Iy&K7RI{/9Ds? (2!q=̵F-MRlOjRd@tQ޼+? [渖RIGӧjKPmQ(+L!8H&F fCc}21XGԏ%ME#e-&EQl&?(@5*sYjֲۂ2tq}^=N{K֖L 񩍽P^mJ'3Կ%R;xO,|̓OSEV[O x^ a,%\_ͯ:HX־6д_xoOVY'!HWn Xp@^5gh<+D@|<|9h>/9^vdL+|P[<ƾ~|_Z+\Y$i@*&&sgpMu6]!EejlW?7xX*d*pzEh@ݏۯW}'urZbrX3_p~WQY|[@$Y3־[r2_Nm0R{+n#tgj6=9&{twQr:5r{Q-:wOW0ϯ־N>EY$X nIUXtVy OȯdsԤI GQOw6BLNf6oar{]GHFCyӭ|?#hXV10QS6S\Tӕw8]4?_XKU3JTAI#T>+:%}y[eQƼ!{l"5Lje\hCsO{G"[2rP[Wm?m+ǟY<;lgI|Am4q>ße<hsF($HZqKc1R1DCFY"ϊ)WLu~Y?T_Nd+v;ZG9?v;dA\+Q'%, DO`0 G,1JmKkienxI?Io~4N3XxI3c|/k}&eڳK}s%ƛ3 g]_fv0F<=/tYW?mos ڣaO$`ue!^$Y;z}- D˸ ,~&3Ǿ\+$m`FTGַ~WY9g}5;X {~[ }bz>!\֍Ǟz溧}ߍ| V>풾IQc]D~Eb-Ì~YpjcMPb`{gWV#'ӽ@]T\{{==GNA޴MPp,'pzusIƄK Rs a.hy*6m8"ZP|=/G?t`޲V4, %mߚ=WS;e*?qW>exZYmy:F܊mtm#éaaY[B[¤j0`}1S>FnM&~>f[uhlYAyZ6bFĶ!R:!_o^>"^HIz+tԡfbդsٹ@G+ { GmI`IsVkCo41I=A_/Nyqv)-ͦcG`[l]xf1wkv dW_ģ ]aƅd͆&ݐWk;KDG=` i(ێ3fmK9m~i O:3)U+[k4/M|n 101]?o'U{pQ~?|/~7_^kp&}w.O¼wi ҽ}?`o> h (CԎ3`4sȊm-+ E9>լϮ{h$Ȭ{`hz泮Q=l4{ip5BK>ee')#nr?:GqZ̨3@Tc9=HFkPOm*4{0XtQ/\'汆@::</(GUP**prg>" ,vɖNҨ'?*7 &ԼKKVBrlx8ZyiM_L (]Qhi:d2ܸ#^xW׵* uG7?<9`y]+T9ҿ5g{|gyK#~x3C]SG-yw? kA/2~I4}tT#S^MJvgoIOYs^P\C ; êDXI]۝J8*rjeMV;wMxBM B׭W=oTǩ|5⋴~e8l(? ~2Ÿ sk'I7]*ܰt>CE?wO/W.ݸfU f}2qnQE*Oࠖ_U}J@+߇SV Ykױ4?<..㓖ף0EW/s)u㚩r1Eh[P0nqPdLLU0Pl_׳^8ԧJ 9 ~@ (#?/&Nb-ckjse5׊bOc(OYإ:~QafVSЂ"(bc.G8#&+ H*?b-kо'֊+InLz0JMWhVoXH˟nԎ\ J]ƕ'y!>A}ĒjwkK\&5ћfU7({2?}|J٠D _"|*Q xƗWȉ?MT}:_R6x UF%{kF &=Rٗ>jr?Q_Kud/;ےĐ@^o͜Mܨ$E~wWgRUdyơOZlh#pn(_瑚*)x/PL0#$E {s{GCտh{HZYϔP MQA2IGSهQ;y '|wЄycNgŲMWO_پy.|%lw{H$ƹ567O#kqQEm-fotocx/images/mashup3.jpg0000664000175000017500000011114615247006660014363 0ustar micomicoJFIF ^http://ns.adobe.com/xap/1.0/ 0 475 441 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?6(((((((((((8ynZVWŝUQk'VsC*0pGc^ዋCZxÀjϔ(N~`HⴼJtk|xS/Gcy(r\@9_E\}_i|IQ4; /Ԭ0܎]W|KmF-8Zso1t7:o|-ȇ_!~n8WCxZfH}a4o=.z;Ct&nM֨-.Gj+>):`ڤk ^鷾{),cD^S. Gs(QEQEQEQEɤX1=Z sosHkȶ N}0y {C{Ӥ{xNz-8>:P73yJ1J[\ ֽnSQqeV2hMsv Gr@cv'U+ rU3 zd2Ic]Ob+ wWʤYUp/a0JB'6'իD:zזiZeˤĭCy h'_@k7*j`OlU(wj6OI=G-?MEC=G-?c[PT?c[Q=G-?MEC=G-?c[PT?c[Q=G-?MEC=G-?c[PT?c[Q=G-?MEC=G-?c[PT?c[Q=G-?MEC=G-?c[PT?c[Q=G-?aO_ JI3=d=I8W/<3^[^ht˶FXǢ8J? r?i(8xcBY4m8Gg'l1 ;c<E,&ՓTHRFMnPGBh}QOo9GV^Gomo/l-n.N&%g##x[@+ؤt׎O6Zq? r?i)R= Ioc,a8CMnRK=Kz+ 浾ǨzZ+acεvF,}5?{!|`zWox{F5].ac0,GjV}QOo9K˻🇮-n=2kk`DIjh#;;m>-mᶷA$zZ+>Ǩp5V}QOo9@QPQOo9GV5V}QOo9@QPQOo9GV5V}QOo9@ j7/V}QOo9@ w?i(? r$E*9Tc[Q=G-?,CIjZzZ+>ǨM 95_G?|cS}QOo9GVX OR;ٿK[*/W9s j cqiݫh!]io#o]{4/C2&5f.;i!]&GfQC7 U%xcYzzOmZ8l7\q?J=kW]hQKYR\J\$&zڍꉧ5B3s ǦHnSw.s%MLe?k<+V5IP풸s.yzҚ\/~icq;\uS*xƩ/$6ŭ,K14xm+cִNok>>)Wpw3I_}moc(ҼKx]B}jYhoŔL7f'moSt="Wt y;G%@h=7m㠦=ΊycñF[M^U:D0]N'f</!􇉼Aqap^6uk"!{P 56OOpH6lV+~"iCWyylǺ DNF:U/X4ɼGi6%NdFfB~ ֕Ǫ\Kg۷³ 8j鶞&. wōۢ;v ^ނRQ<?!]:VI-_\]6c02o\ݑRk7/<@SK~(64U$=3ƭ{>IٍCnnyz; .Njqs#2@[dzGV`H֢÷\XNt;A5WIӾ޻yuuV;RMAؚ]?}DzQ^#\ֲf.!6szUΨF/@tiJ-{Tq>Wk>=֛ķm֑y=24Wie%*ιzuZ+h~Lӹu)Xf6{%WIxX8aq\Ù5?,ZG<$FsjROԮt}|%yLqӏCL^3fK}]ZXVvYAIڟ5[`o[jLl4J>bI.{z[};s.\$u_ Tl5u/$z K[BbF\R?@\+ϾϬ[j:D1M`ݾR6@ Њ-Q@Q@Q@Q@Q@Q@Q@r>ϡY=˿ͳԎ򮢣2izn =I~X@tHZ0}5]XR-#` c[tPM4{)m6>DSHhMg].-p;U(gF6AӠ~/<>武bF/al|̃8S2j&FqJ_e}*Af`UaXpIT5I᳤hvm\2[O+f 2ӚZjy-ډQ*E$Ih zzfoopu\p? (,eZŔWI~AF2U=W՚Դk?*6pr#AE@ HmByb%P1X7|=-ޗ[ܢI$=@>Q@!ؔO?xCc8yWm>ݭoinbez2 p1 eT{PIG~^|~T[zt==3^-aHd=WE5D ;']x DKLvAp81Һ=BQ綕vr zPe('*A 3xnt"14^K8䞜 gي1Z޻<4%@h N~u^I [.ӓ{W+ῆvwslg8;e+v x\ d'l$04"GSiZAq H:QN HAB]69*a Pih-t )`![DZaq]of.{hA788Y3p9騠8éA\Ιoڢ;}@$T]^]S"K5 H>dr:V" P-JѬKIatj4[mVRO;ۀY?>Ҷiꋗ`ԜPhm[k"=? Ӿ,,缶i29$(@DDc~.ݸoÊx3úm,QmԂ<A8WAHeH#PU߇4{hu!B R@AC/4uҮ`NUP@=1ZTFX=Ms 嵍:MU[9>`MoCE*)RDeX{Ө@Ҁ(((((( ϧx_Wm1ʄWoּ꺥o"PV34LW2RR0A\(cD^+=C\˛ kKqB6_|eE0/1{+W5+%ՔzRԏ6ǻ*3uz4KQ[F[uY\ FF)wnXБ&xewq[V)^.j-4{ { 2J$$v~_Ԅso{p&r<]Oi*O885^u5Σ PNBہ9};V:m-cPZC/^!Ns go95 >և'?V#6U䱥ٿD8"[ê]|`ԚT!ζ W5ӷWDt,)dr$;nm ӯ|!gqj^jĐ3[Lr?SIt=ou3,xv0MTM)`32G#9k)׼[o_Zh$ɌSN:q=QZߙDQ\Gr&wL[rb1xFq:__q\éZ<2,&RB؃n w1,9j A(m2n> W횰~LOnqĞ]/tk>D+YҘflj~}UuMI[)fR]:[w6ЊA$j~5K\G,Rb5@ifv M.F,-Ų]MHe gu k"4k9~ ;ow%Rg.r~^kz cbGb?$Ӂ] 1>%xKO;YK4ӗZ',T#:tA5kWZ\Occ<@hx"ེuwuB$ny5c^(tOUKd#C8WH<}*mt旆'ZB1C_QrlVbBq[ѷwvxF:?г+ '@1W`qҠ4oQKFhYSjDd<:߇~_T "̃IAfRsֺ UͶie TF)FNpznRޓaZ^j:]i# <U h>~ŦY$,ݏ,֝bcWT&{#NH?equ|7oFǚmnd@0&{צE8E}fKYQ1BHL&FKTKp?9R S nS_'hKN O: O3@tI56IJ`s޺CL#׮g7WJ6AQ9օiy;Yv1A_CvG~T.}c˥XEu}w5զ dvN7qUoxP4X566rCw px][McSԾ{e[ЭŤuSAgi?]. (Kc2O0ۉ"k{17i^ Fmg#.@VuM.;+KZۘ. '<F ɥ}NWHn.o\=aq$2Y2p @׆-4 Y/=!cLp~s׷Jm>i{wko%-sp,nHP:w뚖Z=E6)@HOX8á:1&_J7ս$ӢG 7 %A9PT61L@T$~5NuMj HR/Ns go9lANGANsћ-O*,-g[mAd=+I7VvZ 5{HL,IGbNi~En4Zfi;-cN3H~Zi۵3iqouLG.[,~R(cokpZE]C\iE)ބiZ~MeDؾDg*AV ׀o/Lڞunn-pۇ3NoMJ y܀s(>KV|'ft }mW+rLȧ.|G3Ant9C_ib<~ÂF~o~A<:u3+DaB*η-kQ4NIeGoJOCU%ds5pDP*ⵍrD^Gi剉N~Gž#U-&˂"" 98P'P-n":M^A&"݌pwU>4.+NЭ.4ԮVѳmQi,ă;P=ëjQ|DҿK8ƅsssg7v @'4ptۋM2="aM=m8##9-~'Q\7ŝGWtI#խa7+HOCYKhX\,e0H?ÞhZEy+ KI'irً8\㟼4,1$4=:}Zk,Q ݳ%= EpzWi%ȜI'o, eӼCppytTiV,݂m$P;+W?#jSjWphV /ڷJ*0Wp#9)%xiNM\̊H LW=Bu_j嶃{k7rs1MQvU;R.iaMK\; 0Nd#+_⛍ H,EjO5DP~R:WSRiq^N!rP<G^( MSgB n$W+3vE# me?ƓvWWv5|*<*j{ٴ-_73mV;%![p\m5:c C{bT*S$xJJw*cʑ\E+vMyJXa_Gc~'I!2pG5G⵻e—6}kf9Hw:i)ȁЌ;y.Y8b~Q|obNEIEy&6=4BɆRq-78>`=7ʼʼ+O%\h᏶ o8>kWCswwLa캊 ReP>\gbWTQ)J1m\fCS֭XeVGGvohbmkjT6Z{svvT Qz,*}PFjJ2*QEQEQEQEQEQEQEQEQEQEEuWV" ctn`WcmJM3FͮcCbz$ WQ@em_xA[ ;oxpEp5xwW!]usm)9aݸ)BFbH '\5]P.08X?<}=ntiG \M7|.zvנFcƾ>%㴊a $e%I2*Ě^jl+_)esn6溚(Y@ګk>BsV _\xgI&V%@ISsWaE 8;hGE KKi_W0 z^IV}"ou;񪬶ʒ&6pn=(P6^K{#i*:;me\4;'l 3=ޭ.Dmgpg 0A?ڭ>״fH'PExm?5( 3?{q?p##=ko]ڭ>Gn?{+0 SEYwf ҋFpb`:pOo]ڭ>f'`Bq&l3`洵..t-A,11<͹$3П nR7pA5[[լm2kR-#i_H׈t<#4G$ֲO<蠒db1]'A*TJsM?@paoxIxvMo N7gV] H+[nHtISZ{_1 (]p]Hԧ#M3?CNO/Tցb:~iq˺iiH~jQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEXH y#>SxFEjxVt;VBҹ=+,=FE47߶^ppT|+m-菢( Cu-~umאj=$C+!*F=r&&ٛ.wM6?$+iGfR.c]; Vx>{ϓ}Uok?T*m"+<IH64F: __Ws s SE 3kǮk,$fm=zT]^\m %?z Ӿ:xMjh-G4Rn */M;/tk Iu("\ *(P?uaWj*:HaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP2RPh* #e$Ӻj]ݎ2IKGQjl-BZ(\k^:۲jڦa 88F8<WtZS+9 ` G *e{C4tsD[{ORI'5FfYeqqNY p}y_CT0\d5GZӬ5Ռk^Dy.)v7c{{{kNZ8I UI#?)<0Uoq- B$EUt'MQ]\Ekm-̋)wv8 M u@Gqֿ9q< ^op! c޻lgzb4R[Q: wڮuw?k[g*o+]T5;|0Ҵkn t~d”{*ׇ;MSgWWFO[es^e+;d% 52h$|p-=ⶖ>p{q귲/|yȸxMx1t4|Dխdտ䲍T=wRyi2IelWhqNX'|cAcǴm2-k~Qt;KArML uk vBT$QDZTv` Xmthb@ #b$yoo;kepC]BҡS#j޵ʶxL-4ؐa0 sש\;QwVsy.ő`/L4^X\e3\KOz^Gtll z֑i >9$hipq]5XtB(tKD'̉Yr3"9VHXm*,K4|>$1+@[)-> пm @FkK]OP53*6 `khǠ{my-U <^FqV՝dɘMڽo?,A Ӹ]sy晤|\_TS[3H'͓+uZh2+ᬧpK`2c⎩cu^8դVi aLnY"`wyHV-h,r\j6:<-);ݿљ{ɦ7ƟqMAKIUKKC(kG;HGZx" "񽗅̳ov90_s^i4O}5֯2\ IMN&Z"/#3g$=A_?ԿoWk쁛Ԓkboe,rcES KdOES((((((((((((;R &8Իg & ۔-O rt ֺIL9$V_^ "I4pN~bW>еvϣsK*^/bkw=@U[ȭ_LΥjWڭ[۹Wk[<" [q;9.{}Vo!gNe | 9!j][\ o71(+Q|QķAM: &*#q$j띬 c^O4^:D=BN9RGa܃sw}+i..oDVq(q=RT:SGiEpcB +33]|}i8\R9 qJ=*K]-JfTSa!9l zb]XCRnO)6b!?2_Jas+|qtڮiXBuw2w1F`d&-'WXx]MSk3M{]󥌚s%ݭozZm>L۴ 溑ì.5 -۪@Be֮DZQ^-6Mkhiin.QpFNN֦=MxvIiz#d9!\M鸓Ǥj6EyIp]ATDҬ?,Uk-kzN1>IU"0@Uƫ&Ho&n{;k`;Oks\Z_@Qx :AZ??5>5x-)c[CahKE͌ДO=)-Uí?,GjŖM^[˸yL3WjCC_oMHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP]Uѕ2dYv~F-^VHcFBjֱZheơKۦd[jjC\t ˸11ÌNr(. n>{Y-LFM=Oܮ61 FxdYIc$e$4iniw_D &ߦAZ+hRx(PaR5 =*hzsjrV@fXB2p>UXJз'c(h\RLx5hZRY%ϾhZ ^;?udjZܛ<&BAʚMKNu2 ᶾ6Rr _fͲ^Xq]H[:^,ij S̙:]˽#uw=D H]Cr{p=Q|#z\<dv! +<Ӵ~ Ռe7.c5+}SNyhXasjkh2E dnb9–Ȗ> rabӕC9(@NWēϑ<=%rig3%k#̻pI< XtH,-h"Db ӽ kݢ)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEI' δ״ MVyq\#1YԔ6tS~ |i6ea u+I7[ * O?3phZz~ _y}/6x}&Pmv6@c2e<)\ VW%|UYkzmȁ-"wIY R]O˕u#Ӫ(!IchxXЎ^֭ Z_ǧ^q\Mw{ UITWʂŻV¤^_GsrN0H)^i=oXzo QgYf٣%L7P@k?H? ,Yt4"g4?1b烼}x+A4R\+.݁n{h`a`\{Z6  ;ëv(fevq/LZ^,4%K}vPnm&AZb=lzс+.IxZ tKpt+Fs^e1b0d_Q9$y.o$,b "Gu-wR5@"[K= +tn%̺Nf?4̏l5rkcj~3yZ`2'Rm ^eijG7}+ 2.o._K4ךitwiklaIM<ܝt3z JPd#oY~B~n}.zw-ustȁFTf#*W 翭y#ufI*Z@ś L^T6ܾ#|=DMwh:/@Pq:( ( ( ( ( ( ( ( ( ( ( ( ( ( (#. A1ȥ2ᇆ,eY{4!S3ީM[]1Cɷ>Aajе-JXǟkaYH*0֝MFYnoav21ܑc<`1T@j:*+Vc4Ƈ@IӴo4p^tz9^᯶&Q%i&y 1' ךxaUi5c.}K@ֵXgn."`!2H >..%mfVmO<Ĉd1S +@SƟMh^S#gS1F#Ffխ=̓3 9&*dR$'WCJr(u=Ճ3۰r<ǭgy7ٟm@BqҺFEu.yA}E>2$&m\jms,pO:|h]XdEqcf u$ H$@ g?6Q;R4r4oѕ'bÉjȉxH(C9+1úwuqj,.3+w5xo֡kwv[kwqrY PIgzy'Z9<ۿui[[.πtٶ-DQ E jZcȑꥎ'>9BOԴCG&y܌ +:^톅s oX4}R>`? -3tܠ_vo~r|7Oss%&YxP`qOhnt8尴ks!, k̰;)NC%)B(ǂ4s_X rD06IvzbZwkokmk F?_˰;*0E4}b $(((hu.P0H4( ( ( ( ( ( ( ( ( ( ( տiGVk;-nn^selEI_zd:DŽ4k<8v ]A$=G*fEm2iցg[YC{攴;9_:g{R}>AўYE[EFL+#_xqۋۻm#r%"2 ##{סk:{+p2\Ja30`IyZ&ژMB+}I˻x.JG+V8[\Y|C5 gLkݟy̍Zoir GKRxu,ev,v0/xU|5ou[Ioz<-@pPּ:<38i>5EW:}Fy7DnCH[{b$KAǡN:Mo6yylwpd6+.10'|;Vѧ6٨3{_RմKfOҭݬ{?v?LgxJҧ eq hnڦ6mq Jv)TsKQY&MM 7wz޻\xv=g@_]b=ی9]Y~$+iu[n$CϨ6--vWU헰%Q34}C=OZ4I˛gR0iѼu@(f=+ooG`f[mb]<ۘ#$yQA ~Ulu{nż$+}+&΅kk,/K%fi {d :+}KĚ~ss"Ь$qsg|M.bu˅WN鷺Atu^YXA~xjT$k6NW1ֲa%\\^&KX%i|àLdwב%5%=STU+4T &9 ץAw:=ys*BW2;fTWCφ:VMN2`,8@OV5(PQ\rqqMJ2׵x+mJ;M+KWˣMDZE~tmH\]^E}2yrhw Q9V}%G$2zuBg+ydF9;Z^w WZ0C/79_t ^*ּDN$*$i sch[j7_5淈XZJ(g9w5ԟi'÷&}+0Nێnio<#v{m{I ky QNB*KEQEQEQEQEQEQEQEQEQEQEJK'+{K RFq#گտiG@Ԟ$2O^(8bjk;8 tF;3ԟJI>&"ꭍR!K^ѳ{S|G:xQWwN-!bGČZjޓ_˨rַ2\[(HDǁnI+Ex}]. ][RK@/Z%MYT2OE&7ӢeYxT.Lu_ ԲDi8)\+u[{SCsYivv 1ѳX ^G;]6n.cnc{%$WTvF^bU5 }YL1'_N7n uZ[.K&};nEP1l}٠w=j^f0܊] 2죩 ԁ>!d$}OTM%K#Ce%CŚ/MupfR g4 {ykcys ly = ^#jwzj'P}'Ė6x̦Hj1sZtXéHd98VG ݱ70|tnzlQEQEQEQEQEQEQEQEQEQEQEQEQEVss<}Q$H#ʯM"C +1$N}T4F ȷS߽K5qCqo*-b\ƗV^JO<@._x#I]Guc6|*z? @:A6cܽo1Pt&ҥ{5i4t%Jɱ3WsZOSPHip4]YG6)Ũk psBTg{W1⏆S뚞-"UiO;+O,ת@4Mz{y;"0.i!We8+GFҬ]:+ 6&,MźI''GXltk#w\eO1nc?@XƟNk[ky̱;f!rI=kW@}H[kr#řݺ3XRI/k >{(onc[3 @_F57avp1)KC[?wKI̬nF }3׭nMWQldgK{XG2p?S@~Vi.xdhX]\3/$T 'ől-q,R"|kV j;⵶pĥEP2Mr74i<4t1Ne8˵9]eӡHe]H+om,5yn.ԡ g m麝nEOiLT`1{Iԭ +ffi46 pXƃ,33cy}sz4ľo F%Tg*mlt5JeO1r9'jY6fQK{pʥߦI` r|?𼚹ԟI4ᇘQ- {hj~ѵMsO/RmKO٦,ǟ`pq[TP;x3A֯l%C+G< tY0=/ k۶z|FRʭ vll⺺(EIM,#n0*峹FrI 5j6,o ym47ξce>6vQGHUsV( ( ( ( ( ( ( ( ( ( ( ( ( (+j8}clk^GCZ5QK:%!ApoCOFRf()dH(4R&ϳx]n/"4h:E[\gl#ZMz*YRe(ݻI?w4C/?eP1w5[O:eY$#d$g V?^c*h羅U`\cC̚EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPWSmN 8J߹5`U~ِ&219Il!BS1."L⺻O =cOy$C''<,|3XZ\Zم0Hr2'&=[[Hy:OjbFBIDxdT$o2A925 IfA+309Pc83Z T-ڌZoޒI<l%ψ<;ԯl3[Nr <+mU c'zZ $.;Vy"x5ТEUW$㫄+:G=:0 8'[KzV/*X<9x'^> %#zj xOm%si7$3 1Nx_/~_*JFe_ߗP15!ыQ/-?u}ouQ@eg3q8HG\̖ڭoReB$:cHg=2kgmp ح)m\{V"Aq4Ŝ2řBߎ? Q5#麊q3FRq[EiI,6Vɲ5'Ԓq'&#,/bߗ `hVE*:bߗ &%PpTt>cE( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (,m$p&, cIchUt`UAGNjwڥŶI8v>FH+$#}yu=xjv=NXT0}(~ Z-eF0Cge[]ug9 +<8sqҟQ\j(P-&m.$n H%A?W]_GMNG"]TpO4$Gd+",<ƺ=4$`Ie?%yEQ'?(Ң0泎9R}qgPz}6mn0$V5!ыQ/-?tI'?(?$^iv3!Yn4/LĬ]܅#-[n ^\KrWSG<9 '~-DuْJ2O ^~QE03$PX{dLY4lpƶk"??_!(((((((((((((((((\j66wIוTDǼ֕{K]ډo%6ī@XRSdeu H 1rp2q@ FY@I0Xr;Y^eizvuhQo4s`22B+נoP .2<֝@X(+ djM'Vd{Ex5TtK:Ē<@<|xszSkqe]QyNNvfA+?&ٿ%s|GӻOa?)ol#h͛W?M!u=FI!E&s_ڱۯ.VaL/4`q qL&:j~#W-jzkNF㪖 9ڰ$.[fX&(AE&Q/|kүoTG{LBoU𶓥v:ysofsGT?(8ɮcN_%"CcN_cN_cu!ыQ/-?u\VpK! N$SҖ]ZKc?&Ug)?JC8 R|coZukt2! ^]ۜ#$m߂/k+ć-*UqʙmKյѬi%GԚ-6>dddDŽ|/imgRI:v'%I&&uU;Ə;Ƙ"??_Xӿ!kWj4w:HF 1֓.EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE,DsfB7Pٿkߗ EW\ݛQ7Pٿkߗ EW\ݛQ7Pٿkߗ EW\ݛQ7Pٿkߗ EW\ݛQ7Pٿkߗ EW\ݛQ7Pٿkߗ EW\ݛQ7Pٿkߗ EW\ݛQ7Pٿkߗ EW\ݛQ7\Al&%<~_WNO@?~_(\ݛT_ںw?t4/ٿE_WNO@?~_(\ݛT_ںw?t4/ٿE_WNO@?~_(\ݛSa,$79* ժ7qvoQ`UUPfPGI_ ~f/}?~_*/];?ںwqvoG¢ӿ/_ ~f/}?~_*H&t"yR\\Cl&%f/?Ə];?LQl9(.!M*K@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@:쭍Ec+NMeSƺ_n5(ti4|'}Gj>r{lå4?¸m"+xÒK˧YydGY' Nv'ԁï7c[/*$U뫿[M!z mfK~ΣuyW]TX:~mmslH-~\ _+5?i:LkyOfFʰwP0((((((((((((((((=) .? $`7Y^Mn@nqo]n<4/ctt&ܚޢ0Ƥ[;@ 4ѨD1G9[Pyc+Si}  atB[P!FP$֟TsЊvV^+X5Y且<(^I\ :(A%:h-ϩWH"IBP?_0&lͧ\y֟voLyE`- ]>i_P`:nMoQ@ A&╯p]0'Eei/C qh`IǒY|e`c]HZP ­l.zr 8jH>A( *ۼib}^(fotocx/images/mashup.jpg0000664000175000017500000010446015247006660014301 0ustar micomicoJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((/" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?p.zkP= 杉FGzi{V99ץ4( h럸᷍@,s\fapM=-;r* RfG={ך]c2q?ϚmYf#Џ` &,>71nz/2'$=:|zy>,Nde sT6k V;S{sVl۩mPwMdeLqa ZZHYXt?zUW3"ЇIC9YH<δ6$y]29p tbH3jĊד ą/\OSkwNl1̍?LmmsEX3]H ?Ʊ$2yGn؎ յÿ_!qֽ78Ri'N_x]JY04muq9δ|6̋ 7 Ԟ(og1g2νwú]<$2?.nhxy[R@ >b+8[$ވWI]RXe_P[?Zg-ןTQ⮅.v:[-}+eXe?_orm\c'q)F01!rb!+4'u0-_ZS?GL0H9KO 3u&@Z+Rǐ$Ay_TSxTh-npSZ`29/Eupkbm Jz3ӨzuW}*r4ӳ:OTŠ(((`gM.x?NuRm`[ s/.巂]E(r/@Oɟ^hɸ`ܕUSɮ*B,nsE*sq#ڽDRRObNP)QEr!+ҫaH5VFS5s|h$1NigBF?3f6DDnհ~f]VtpsWslz@ɭKhoh_XǩaaFWaS Rr94ےMp*~qʀXInfWF|p=q}*{KB=ș8F?6z;9ѯB{pJ˗2nMS7H%E##>clQ"9NrOr{~qbl +l( ֬xOVbo),#-u,6*ov3sQn4@Gֵn@V  gWAR94E+#nY_nT1\GqһS~r*/t,='^`촟/^s׮zQ2׈usla3 >UOz&bVbmN8ښMd!rNyԝ;x+ɫQԕч":_jgcK16=<=뱆x@ȮZi`R>꾝gx 9QFt#顋q\ƶLSG>Mum2;[Ƞ#}kKJJqvcy/@ 5)c%Xjvg7P<#ֽ%X2: L l'\ȱHii r"R▼uޫ2h~wFѸ :ymN]G.F Xd 1+n6;@q[:4fn0Pw3a?htwv )4N0QG5Ɵ1#~F7OJߏWxP*Tn"K {ִM=LPĨ>s=+3qwF|Uf2F0ȴ>cpyzky?Kdl[?2@=q\P~S;ݫg+h-l΂,dr3@ ZkIll'Xf$ X78D{zUk]޺rGC\T:P` 贿".Uv89-Mw >6R#x?V40c%@W,a GSִjPEY0g:ZYZYRV5?3m='>WoUtWAK62=A<NX`cuxjt MN7Fr 6mNs02~ٴ[S,>dZ>@'ӂ9kMQHI<`:VА\7 q׭\gk× wG. ޺-RWz\>M*LFw88=Q;w2Wxq9XskMWbkaWabxܮъZ1]F==n4| ׯZ'` }+*rʠq8e,?T.wlL-=GZ1~pQ^T~҄Y$d#?[Rlk5}ރ̀c7\Xe]UUۇRW3%ֵ si$cљ*M6kɩ~( Q&uݏ+^)i/|qy/o?%5躧-<h7hd[k̟Ͱ9W {?musE{[kkYi+YC<.Fp{vJP>|mS5bfn?/ ݏjmgvCGAXq_@kI7r/ WezZ9TkiOq&onS:{U`Y ?R;^)WJ/>趚5'Q"mr[ݴcPׅ#mec K[%ipjv.Z$1ܼv=Ҽw37#EfחfIꫤ*#35>Urj0^)dcd#;2*03԰Q]GJSUHKjN9@s;泼Ohzvnjk2vh#`v.ӤH$}Iۚ..wղb|3Uۓ[}$ G+FJ*pFμn_ ϩ@km!sEp;2s w73Aٸ'r{\!6xGmoIe! d9zq_3d=1uFupzskSXj㦞DT;}Q+ZOFZjWweB灞Zv̈́hp~e$Ջ W"H/mn|dGlg|=*ۅhyFO)p[ƵhI5ɯ>ԍ1Oq%c몹Fe,p$>yE/il+vXЏտ-u6c rҦ 1zsֻ0zRrm^!lO5F*WQΞ^! 'Rdy-!|g9sھckxYZ Iy$2I*A[kȢ#BUmT[D.gD gQҵX3FФn;γ,EOztF׻~?tdpZwA.Gpz:MLVČ鎘 ~8MVIK[iɞ96 `r8ϵrTgM,4h=m6&~kXА>r{ʳ.U:F}*ψOF=OWo ]%a it $~}+˧KAOSҕ^Y(jm36m;/{]>)E11w/ rHxsqh'xf'9bտZ\io,6cӓpr32oEZ4kE릆g-+ixY*H@@';چ4B#+8aVlm&:M-į;{0>WE[$G>y#&ܥgknă(dY{uw}^΃؅~?k?Ƒ2١&mwS nwo,ϗ\p>[t. D5k&ڊ, CR=4VKg ?|=ʾ?|%;f9wMV[<źݚY*v(=OƺnR~[gҶ˫E,J*Eon~. UQH:S3]wӇ$TN*1>kjմwm-Sg/IcW [\jq[i61G ہLӃґUW;@98cdkSyE%@cDs1A;+4 yd fS.I&N1>^ #Af8,Uv3l8mȱ{VED\+9!~?i c*%7gekg#88<2s|A9<)w=>m.vx1;[q[HVss^KKӀCnrbs=ԓ\\xfզEH HMɶ*kzE6ۣ!, n1#=q[vey,KqB YA$r07ghϵgspn=6'pѤW``Y8KtشmIInDsӯ1LGE=^gLkveab8UV8tz2F A|6=ߕj7{P6sӷ+|o a0BAFe@ Q@$+>) iݒ`.$ӊw\$qlB^RI/=X"tƜgC!4p>J~ /0?5:uaFkCm~?*2y%2yם 8HR&'P8gϦ;+TYbOrA$g#^-ne wwr:hV{2EU 'P)FppiwWn+|z?;W,6h5c8k~jGO2A XIΎ3Ҵ=^f31M%y5k go=|9Sҹw|Ji]\7N9c$ZN[O 9E7~`!q;ט|^#.]#V#<4Ooe?@ ~kڤm.#d(0o" !98<@nsgG!p`u(=_!#&)س9\8<OAjR\مeIA Yܐq?0a2OO ϣZj@I%bu9$jhn =m0RO'\y!,Kx,m&H `GcϦ:TZnDUvr`#9G9_ ^èIw .*am@1l6O^זz{^i 2?.x犿krF$r.(F;?g򨢄^c'hpO b([[?).Q"|;F:vea[} N0j:a@+L(MnWא'z֗ O 4QEq#F˻h䃟~kf6Xױ󏘮}4YOqI#I $ }zW'$ye^~^:rGnO[^ھ% 2u:8ՠFѻ0}@35vvЎ0cTSK`c>:epA<#\sNGS|t7R7d ׈1}¬c8DqvfT.sL^-D,*J'AuV[F>QJ2do'twZF7Z!* +O$ sjZʟJ2.!d) +n+6X|1k(^;eJe·Ҳ趎Qm_~7Fǃa-Ie8h([J pJKʄ`+Obhyk{၎ g8<WGz?H}L=J>&_\-V Ƿ$WpZs(vJ!gG4)\c +^y]EIsXgZ-m{y6qZ>!/3Hnt{yn6C|#j>![sG3dz}2*[j"dk.Nyfލm.!q "h0·\=3ҭiZ\VEiuc$r`(=$+]Omp^)YFpG>}9Q:"BeS Uɫ3WKMm~FoJ۶P ui.DϵXy߯Jbfy,09QF;WSGs9;~!O FMtF.Zao7LS,;J#9q׌U]@>\[ X-GaN؂+ )3;_9V',pFrUb5OMo[pjHV ɾXI߽v"}򮃺e S#}GO,]K9[{=*I;{`ۥp>`JztaX>(oUWI# Hc4rqMt0L bqctCuљFty-i+ 6Q'Q? ӆR.آ=xT-GK#1灃_ YA^ˬx?7ArbAosUGj9 L@Scac/3t6Hzt0+ @& Ypt r1-mo 7J3# qb׈",rJpLrzL/B˩A1,ȏ$`l\ɎA931b .5HbdU9d8r@(I-oV>-en,NӃ^tB3 !^bN6$,1$Nr}m5=Q@ĠrOTrFNԑIiuHt7(qN0+Ⱦ hsy-yU0:rA眓^шQla궰'xL+%qn/C eS3KC9VAwmxNUx,w}9]ฉĬ6O=5تk[]G[ Tǘ=I ![Wvֶ3Ā~\sWl+TW~WQ?_C$ʪK$ "G,}}kދK9\xd"Q]XmNslU><_j֫q"=뵲vzM!evc1]e-DQ1ȡci̙ҝU1gFC@AB8#ҷt4`gYx 8?Lb?/#..G6~xK#ciI]%̦nGEx>:WR+7?|Hii xǬ%Q@Q@/5-X<Ћ鴳?~ʮN: |Bl1GiUw9g%OcDrxt"ːjXg' W2[Cb.4RG,[dDd&0r@@44RMFipB" [$29oC 6wm1:x>t\8p \XVzkMy󼴂$\p3J4ۋ 7슿kyp~x aZV"RoCI^Q9w͝9C#q1 'A|9B ¨8$[^t[P<96z8$㨠 4;<sO&M&&!DCmoXg( 9LVџ9dMȫ@N]ޱH%jvzh#=Fc>tTQEfKn]&λc A:y \6-˂W1qߡ5̨KsxuB'~b18`P+*r4LUnF[0;ZѮmO#,Į7;CڪL.$ m|-x5nOR4GI8 U5v0A?F+}-VW`@9]7t+mN%y\v?m?0,zOֽnQv)SyO\r8wu~/]EΤq€cDdY:F$>:~ls1@+ (qYY%9ֵGʀ`VіRϡ$yΛi4*3gֺԹid-OAУZFہ'kH^E"\#=8׶+1g ~ ˮGe*2|?3V/:.w op*̐aHj|['|U;CvџBHSq,X9a\<:}}E)>R6d3D sqUTV?4JTG>ꤶ?茌Y\٪q*Z= s ip2LqUuL_yRDG2',EUlfb}'H0WQϵ #Uˡ^{g&nR:GZ7: ?kWqь꥛ѓq55q#\Tr:Z"Tc I<`\s+8csNoV',p V'Қ=Y9뚧cym esOaۦ$J@0>pxKVw/P{sT#=~u'p%웎 w#xVf2i9O>c߭M 慌_zG psWbcw&nQKEz<:פ|?1L^p:ץ|?b|Y|>%F{ܗ$xG̔m$lz/ׯG;.`'.U 9#8< WV7i3MoqpLrLU8^z~ywumb+8,:_P\W=kSE}u4܀cHFN(|,|隴;$f\us 'r\^pǾFko,-%=؛$m< ۫ǵ)%H gu).03 vsϥvb-.ŜHn0qAۜjR۴r$!/>ftlp=1׽i];Uky$71y gB *NVҀ=Š( G9yyqb·9`zc4uѕGwb6I/gRֱlnk >Y:V z0S*sNEk}8)o?m鋱@:U]4D(:ZDx}h#Hb*\9\{m=<[+1ݜ||+G~b;8Bx=mVVi,$L1 "YI'8>-uQZIZ6ԸdE`g'9o%sQ&R{^'FwCݍGp=}Oҳ,lcXp3$U9B:Z((w LW.6:w:諝C'n?v*: s,J|')s2=Xh \n3 {`t +# BNSj' aIO<}g7. Er^#'$ 3$<qWZ!\飚8]_30@+nW,{®K|T91|/<.npb WzusvZϥvEu{%dr8B=091WJfY 2 ;15Y˽-ظô@t|IC0(eڬ8穪\%̮ &^A#wx=}OIwOm u3J}*.tА4iF`,qu >vAl O_JK.sxRAe@c7f5A\e,s[^s:P+$|jOBV8n67R}j a!޽,Ҧ`4t*RLN@ g?冘 x&Lh?*%CYmJgEDcȤ]P8ui AW +J>hg?h 2# qs2 BdTض85~)’[ dtU(friG5(A'*\rNq xM.{tR5oc[aCɹp1N˯MuvA!16uq^њc)* kgm\ZD gԌZe(&rzZR-hVj1ָ:,@{Ӵ;I@ֽU8eMNdx!v-ux$08tVבN X;~Ӂ^m ֈ#*ȨqdxH 5tm@[uk;7V8qТ"ďIOɌ:waیckD4õqBnh|48ไ0LP1yʞh  Z((((()-TԵ }>%ÁOZEmB0i1Ҽ7>7VS`Թ$4w*ԲDmwc~"ԧIXHđ|?pڕ֧e䴦C0EIGZٻn֥K0` auVְmbI b-2h# Ìb.kH[ 70%XwBB9Mp@yA<3ƄixQQ͒ά}3Ǿk&,1m\*R@ATgMa&vK.GOUcCu,Hʥ7F1%Kx?`ua>Ć%ϓ/*`P9[,E#9>Vf&ՅvFiYGmVׁ ^]zb߭_{~רHO˕F= w+Þr4 rxCf<ljm[{d,.Oˎ=5[KmH}kLXk$rmK'O9q~Nx64$1A#g) ?c-$Y~PWEPEPEPE4V&d?I'a_xOBD\W/c,Hy`z^ZX!2 z xcGHX*=kM9`$$s޸f?1NJeo=>^{{%̤j]?MnD66z$HXӎڗtX>f)d'{q\ա[@6[K F­8_Jb[29cOqZ8Con0;T<9(kр19NEf1:UUZ Bgg=r0{wi:m362|OtJK8>wrcf~116gSksV-=5.{~5GS+:G~Oع9,nt1~ $1LNW2,-/$r#9g]i\<ǵvC/P-+Oy]ٽcNlT|]ROrNMpZ#7O#~݉>2@!NC\8Y4K3d2`FqTu5 *dk^`q+RK&Yl}NPa@)ϑҷ|5h:&:Y:|nLg{.tLCE@mFY cxs)xNnDNN!28m dҹTJ j:X]/Sز`]J:m;psƵw?o5Y>Ū$eT>1Oȸݎ3ռQj~}o7=kՕGh+Ƈ.qCy^kw>w1hv7˼'oO#늣&W>E Iϱ֗}MbɧAH'zgeu"}ά;;Ͽu> /{"SM 5IoeiA;u)RNkr~Z~e˙#m-IPO Wݕ 4R0pOrKcڸoE{WlQO|pN9|i䵷@Uwp8* WҬzA:y͵4K}O!{=?ʣkǁT0 RYhzfsceOx+Ԛ.Ug%hWYO{+m 6Oeqk556 ϽzG@enۂHQ}3G^g5* 3oºPy%?j;.n'ȴ I횡5Mbs,C2GP#5 %+hF?LT~CpK]wiZ^D<#k~ [4)2vڼ[dpF:W$ί QՅv=8Fp+͖),7\i 6M(ϒ]lF2@=ExT.V2Zk<)gPZ ;ui?Wiuow+ZSqĥ0vO)^_ZST ,W7W\Dsn=po{OJ5 Vo G9FuOU[HԠ.) p)HSs^y6oV[0W߭?OOaoF%I|W~$w<7 6IdԵ$߆)gzWLҳ`!׮u$kۈĄNv2NOZt_YX[wiPLpq%Ƴ`\&U^{k:Yo4˸}vՖ7wm#}$ 3Ƞ-'˪6c]]|]ZIv IYY1<rk*zo},\ Z휰 ؎A|g3}g>*Y<7iB`{'8BWkmi\Yλ$C_#_Zm [$qsl|`qsH5c3+q*.Ìdzpy ~t]2fݏ~QcAկlo M6+91r%#!ggLtʱ11P;cjtSzT64%!J#W]@ r3bcR5%ČF(E>JF;TKUD6R?q@iScJ3޼W7#33OR{?] Q!y]'NnϦmJ66GAjAZβ;)Ì.#5k =-$+ ;I1c b&< O|cM-ivTƀ:܁Ez{*IƇw13%5]QMY{J'$$s8Lׇ*I'*v'9WRh}OEp;;~UN7=OljxJ!Pu+\Ib >iXg.WhGJձ+hrrG W4xs+~gwNp=x.~a~u-˿7\wYn<a9֟4N"7̤~#֓sM $1Gy]d^ug,hfb (TP@##?tKK}sw~-LĪH|Üev1[# b(Ӵ{v&B?6r8POt iG=PeYi0߁;NjFyFe0in:-{׼chii}'#h&K'NѬ  jX"}|]iq]bi*@B/'83<7 K槮ܭ<컢/?]11?FF"+܌2+Oj֟;O"ZqO4@_n'9n57mI`d0WAE]6WF2:<)UZϙoo6߁qc|0$\NpC,@o-Hnp8&E4gn ;;cA+9u烎+ >kcl?"S0ӌP)8w7LQU5 IJP]{s= zIJ:m` ^Zt1̙jZ(mr{MWǺ^}As ho\4S* ~݁]6v\H[$9EQI#ӥ̷dn$v ֱ>z7v7:Fcb¤gDVkz$% (UQ@%QEQE%axC'?nםH qB↷"Gqph[F\mf,tS;y|@e8/ }> Ob?uF:ky^)%H鏧RIH;zo–ֶ/oyt%NBrA{9h'5*Fj2w*=M!,\,GC}+Ee(AE }GդC-FX"OԷ\_V(Hoqv8n湩Uu**~uIO\,TdI=sK.'SysY[ȋG +1'jzV&!'osB M^l%-"k5(m~v}߮_ZHKOs, 9ae3󑘬Rq.[ ra\кa—S,vr:t9a4v7sL/:x6 yNiEǼ ~eǷqWZo%&D{b!6N01־s9(S秃Q,;ګJRQ9ݐǃ־u&w$MӚkl;R\ =īt  G|+ g ]Ij^gTrY/Ğ84"fyo(*~:fS5Mj]S;s֯hVC ʢ,y2Iʕ/zzx}x/R`-.dI ݹbA?_E=̞HbUXF@ 1/k&Bvq]OsPԵ++Q€@,=+7ݙiztr :# gv؟+>sL;yӨ50rB)cZ%ίG4B 8 ̩捑m18w2y+_ E޹e0#9^(j(_XBmR޹X3;wO ܬ7 ,F7lzދ].Ֆ v]rT?093@Z[ cB<ұuzR˧}.##9|$j<9ugW[ksl"fB*ی|ޜxw}OUt]k=ђ7mjr psH{.˭x?S nd֊mŏ2>:N-C?|{kPP4rpFk<;xVk ?Yd4}"bM',M?AyJUVh?JI+8 :(z$]f\W!(v[8Z<}nM<miY<]OEm'о|;ym,E1n4E)!yzǚ[h^--۾9u$v9~Nv}hK2\xGk6h9^ "20p+ocQ<Ըi*yNLt6qo3lCd† Nu"H!QR8** h((.'o@k>${d׳.Y/y=|߫kR9&U iO0gQ)g'p Xס|]W4@{|STt܍Ǚ$v1[l7HϹ8gҨXGiw9`FxЈ^NE^ 7mt$3*3{ {uzR0OoieƂ0O||uP 9y{oK.Fy㡮ne/ʹ#= XՓmN*1$gϽ8ҶѦfݤՙ[kcoQ8*o;/iv 4Awv7D _B09k˵)徼Do3d*0 z5%ԷwR95>c׌\әd-rI|dN-id#gxo8LqץW JjWvցF=y #e"Xy)V#H$=g hKPzUhV\B@g >r~TƿrO0a P$c}eN=~8xz4J5c%tD&hTVgH~qmn+pW1pd81ՙ.n,yTgyuXY PIgbX$ԋiX>vUxf?0PqG ʋ +PqviV;B#6-?8i>+ׄ̅1_j ?yOܮZ Hq]NdA} TWKmXۀ#^=yϞs0wq<GU(%03&OV4|VPEP^a\BD)mO,WA$2FX+rNy5L? ͫkYwqyE\2O`3^ZoZG&Ki#hN0ys8wKsiN{Yr#O'>?x[/6̳,QFtP F Ӄ>3pd`4;/%X1T-I ex/S\Ү{]:lF-s_񾪏 y"bO d*68t־.xjAmKDfmc+ؕBFYٶv'A}gAldc8BQH\x;D>K#d2I|$Elx&TZ!TO5Ts$p#-? '-?iFi IweB@Һ+xGS%ct$ {"}C-[{V.ɝA;57Okz8$]~ϰ1L`}e{k7ѳDu8 W5OX/hM1@5$nb34;>|$Qsϭq"|wo KYo|xD3!r22'(WtK%2*7s滿ڲY2ߵ竦x-\od}zςy 9vXzTk >WsZV)Qqoߎ 돥ej1\An,Fxdz%0Osڧ#ϭ|'u ݵI-M(e8x9Gs[0k `@"<7n+?50_ؒH 8=n?w1|K4RK-j%El9G+]SOS)SL-YČs_m/Xñ?u nz"¼g'w胒8_ƴi] }=dWI6ן~ޟZEK E;I#Lvrzp$RYn]O[lʞ)Ż&tXaBb,9TVef[*>=֎ y@08}½?4Zb]*r1p9E7%ۡuc'1ZKkky 7 ={~qnn힔)Y3|N~" ^)xl8e3{_>~TI5<}&[]עD9&kźTFe:ԱیEkq v0 %Um{uVmi"f=78?tpBIF1VեmX-MAuGa^ge;hc K3H' x)htyj !] rEz63֠"$P0 Uth((dF#*"cyG6}Ӽ7^xPfئݞPZg[(bC$T }^/?>vg=hk{s k˙{43^K;|S؍_Dצk-$vi0Fveqq5];x?@ '{ s5ߋ7i}'w42E"[\eyY##x[cKǡy%KEq\;}| (/[z\=1M4P[|dc.=S5қ~%V r3r܃HA.H*Ҵ,V?y(Լ=nGWLɍy3ր=~((R Z(Jf֗$ x_(/[{TvWYP_s^Ĭ}qs,n`7T)81Jr+O-gW+u>sN! h~Ny=,"Hyu PMe S99)%W_Qkf%P_ϵpFs綦4zeߋ|) -4EUI3i;j+;ĐĂ8 GaӞE}s\2>Htӥone)+I'*bN9ҷdҹ.F7~#8Qر2̈9S_XV huOܠ" [~VO:bR"e}ּ,nׅW*kwz ibڧ,3 կZ汤M>QQp>lt>ߝT }n\`88AXOWc 6gǸt2nW䷼tE;qN,:cK;LG|(65#srN+־7kMζx8HI?J߄[9=-pb%3).]rvQ]<Ҳb.{g| #Σ<1^q)rŁԒ1^~O@YX!H# TKEQEQEU+n OsA<|BC i-U$1&_@@>{JĺZ-<1{-X'-t{{yĠg8W:-&LP:m|EV2<׿{㚆x! p4ͣEb^m]p̒.s~^ܝ0C}2qbcD7Of0vzן&$-@?4KMVɼB% \ޛdm, jjpYG۵[֪ !H.IC+phǣ=m<(]M$98g ONON{kO~\;{-.9YY^F3!'$玛rz)s#I̾hIm' =!Ri. Z tK}zA8ַV':5Ἂ(D%s#'P`ӵ{FuiogoSf*UV-kf4K%{sȻ}<^]/Ehk/wZ@D G\mHȪ7? /ߍ|E1 탂yQ+{X*GU@!B|HӴ FϬż%uIdӊρzͷ{=^+=0<Ⱦu{{һ'V:.fċ8g_-8!{:KjR\yHp̪UzF:ؔW7/CfOwj-o2}k(QEQE%Q@Q@Sm/F|ZEp~ wa}`^6Wqv2F}SQ\Ae'Et#4;l;P\ƓsI'&û=F&BMwȍ\a1qRƵ>`*G?hq+ӵ;J>cI4n/$TҾ#c&2y6r=Iχ'VH>Q ]>v;ɟ_Qb1Nof=5H ``x]MHDѥg$S;ugo~tĒ,V|n ! rInI<S(JۡlJz@ \ʥ$k׼!vc:WhEޡWE$j5 W3M@\J( (((()h ( ( (Q@ sQWbs%JYPAt⤊440QIE%Eu2[@p2jjdɶEܹ@#n}WQI䏺/+ռ'BA*}xp?JM L*PÓhI^h#;<:kn$ @N\}?޽A]Vdp8*@\VG&7Egaq!8AoڮZ( (?fotocx/images/rotate-right.png0000664000175000017500000003411215247006660015415 0ustar micomicoPNG  IHDRkQXtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/tEXtSoftwarewww.inkscape.org< pHYs((fi,iTXtXML:com.adobe.xmp 1 2 3 0 0 326 400 1 @ %\eXIfMM*bj(1rOiHHwww.inkscape.orgCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/0232E0100fotocx-25.1: Markup Text|fotocx-25.1: Rescale: width:200 height:163|@D IDATxw|[ǿH֑%/9NAHȱ YBٴH)homor{Kja|e$HB8%%h'i ck?9G|gHLT:j5jSҝ@>`LQ ^AM Ҩ4١eOHF :+G,DpÆQ H|e%1j-'<K]>')qh]{Vu^n "dȤW1UuD-a1p:PdO7т 2..R.^'wb[Zx̭e\f@> )ԻJX(Fk !9ww7xN 3ZP1i ;Qpp0h=ТL*f7W3\eLB(7^6-h[q0Ur%|0/wc*] 3w}ԭjl3veFj!r~|U $"2Y6Ex9JhQb *|~ 2ZE e^\\&fჽIK! 9P-TpU,g25u 04F nq)Lw9peAU:MFKI7@<.QAZCz ;;xh!dBj(|h-=fl&M~ RFkq+ZʸA<NR82^tk.t1we$/ /3iJjEF Iq7R{Tz&S%uV!VjZ=v~FkdX ZR¸1UqpZ&IcN_BD2Zƅyy 2IHKNP=ĸsنCnQVjR dY9_U^sX0ZȞ䌁 D2{kc?$ZJ8eb\:f<ӋKs@bqՂ;CBBy]1ש܄h=r7-c9a }Fk,u)a#Hl&OcQaH q=F 1 O_P-(0Zn$Vی{N Ab|P!fnrSU4B|%}=i6.ȥ8q!@7Y DPW3A.B?.tk\pR cPji dY)WLM|hT^hzq/+N.U3M-9=Gs$Y[AލRWF ݜ _Wə$*.!>,N0.ε#cS,UexB> >[DyHd`pt36Se aq|+ SmUԚEvɬ("#.gVc<۔Y+WX9E@E,z&GD;٭{o 98eeadߏ_ sg=kyեyf]Pa)b0`O|Εo۞.-(=qU7s% ŝ`@ Őy z7^⑎Kdז TUQA@YyHd@\ v/Gc͜[}Ə~e?%L*|4rR)bmÝ=roq&FK93 _LG ‘]R4|5H vTou[km?=TFBQC%f@ QPBF XRg~4-2w?8~Mspcc^DQCrz7"Uo1tt\9ԺfU)Um(;/=c=6@<,'c7\Tvɥ3/XҷF}Ioj4G )Z3ǻA1iVk:k3xFDjQ҂M6kθR4Su i ᭏~ʞ+I)'_/—%Q N%~w.;5رdR 4!( CvDiU1g}150;ןr84@Ԭ^ț}٭:;ݵy~)Ny"ub \-3t L]Ԙ9Kff6vvpwH}ԺHv)^x۽?0eƧQꬆO SmkWκ`=&NyRZ#3m|h '$)$N 唰&\7Kvў*Z1y;&v_qn.ù2+ ^ĴMkGذC՘W<_Z#/zDT5q|1dP`!oDP]@o-byqF+mTd@ҋĿ^NK2~vGw4|ZyAs.#YſIțB~ FF|PE͘-D:E RyCGT*vnY۱#!!5n S*ߤ.ݭm'A_5T9NYI@u˥2e83N/k!?*,6hO6+x}q7^fgbnejX!.=N"G^J꞊=x5MWm_ j:a.. %8,2u96Svb|Ug;qⓈF,]Dժ\~qd [>*OG2SZ({GW<ſAH+S%Dbk`0ݼe㽭;^Y m͜⚹ľ GLԽ6QNlOBtVx.qryQW]7mom lYJ+5kKc_Q{V8)[!漏rwO^3rexLū 1ߛ62ԛn;#rҖ#~2GBD~pqkێ燆ш_ ޞ<ܶ'٢ ә #zNٻߎx 4 *3jxH!+;0)'ѣm CC[Po0vtڲe.^rTd-G[odlk$zq0kϧ Z1yx1yxDU2oɢ,^"jLt' ھ9EƗ[᪟Dz{{ּmVor4.Rsi_3̅ڲ/8Re"lun9|ڏV;uc$I¦|8  Շ&ss>{PQTȞ>[U=DYL#?P P/rTή%`ojDlSU'}zA͑SNG Q0 M6Sdh߸iJXgJqq o߳TGpǑ@RT3!O^h#nS}ۅ.Ew+*+Zۦr(k.mC[F۞MF@ӿ^z/ug-5셏CLܹǏGskV ĥ0Kg-*ͅ>e9nvN{:3)bHT }PCRFyY^ʯw0 6Bx;'pUUƽ&LmP^F,9YOr_ rȲvzxM[l=Z&Ay5 O W؈P,ḄOGBJRD6$I2l; .'\aۓt4]4 %ɲ1RTX4@wpRrΡd2n ;.Hc3M0B6Vźb1ast@R; +/ZDe+&IXolœ73t}$ɘx\*wzxJ/;2FOYT %xs֬'PRNg$s{fm0D-r1b&/ϲ;ɷl)($Ѻ )bF8ކc#w Y(n{yG rd)-YnORi$#q VԼ`G`un!b bpΥ35E/>!d6w'ړJ>R jF)OsЦ,^Y;yN ~4TJxJ8TUx{'i97v_Cw ۨ<_+G'+ŵ)g|fqs$ܽ$$ٜiYMp8Ǟh87@"v:WR㯚/RՑ&Z˝?A DUVylWeJqqCP݇8h^Ӽ?|_>zdF@ԬGԮAԬCTnOlHkA#pX,:E4Jx9FlxPwb&gZz"Xi:E<6hN93n``#_*o]ސi@W<;Ra+rLht{q, $zSdAg&KA!Q49S(9k:m dt.SR2P9]b҈xt sIl6\Ô_l' liF=b| NƊ4!qz\ d&iTrtI+"5gnQFnG'˷=+1v.ӑ㻂'B#YTl'b*%,P92 vF=$ b*$u,me OCVL-q5+mtzY3h$HTpjAr +ʈJ^|,Bs7hj`ɟ|b%hFCA/XSxxV`zHHS(XOE矰 ID@!w9q`W 1g.悲 , to;x:+=rv&KbR8@gdVlpB}4b{˶Vw o{o%Jb'*[Z0GQ P8G]auWCv,NhG7GH9aup|k~25+tL5 ( 1GeBwp[A5 N^nv8,8J@T$",hN9mxϜ\;sҏƴm988uk~*h^1~e* ˰:b"@xkM'('d)jn(ԫJ؆ C%XbL#9+\l@6왛v K޵}}cL*=.a1*`R,L__^k6.B;œWXPT׿Gm!G&Nb uj!E]-D׀ѐN/2s)YГ .j* yKiͬDL)@':LI]ӱttD1+"OG ȯn/M:?hcO{+É!Rr߅q0BOtr:+A9X`i6d_sU}ie3.q"yo)iQYIDATSϑ+"űx3 |3(΁/~pʷR,PW,l޶u̵-e3(sE+qK]Ӱz?MW} ;;G+#i9K ?n|1s�=/{I-N^u7w1PiߌpGzwӦP9gJ-{R)[(RqTM[҃κV)Kۆ3؊=qGBs$(⥓Sf?T7Mz䄲{TO_lcP.=^-w"1#@1¡MH]]]+}ed,5'i=,W,1=I*A/!D,W4k/Xk %xp{5^r1c=Y8}zciW2Yw}_[0f)[ %j{36)^99 kXW]]d, 8:1DQZ`p3r4H__G` ]e?,>^R'K:!x(蕑0T63f?5~١9^fcS04|@m[S9w^[?-~rQ@i)U /h[aJ[3!ؖdq|ي g_ɔX~,e?wX#A5SHǽ.,Ab{~)'dʳԜyǖƣ)~D{ ?H$H'!bi\qTygK#l](ʳDӿy(}:D󶭏g+7.K5іp81wf?|8@=Y2K\%Q8(U}2s~eeGQ}Sqɢ|E/C%9qnBñn)eJ3HXʟtŻ' T.(Ra_{޳}Kcc'R:sΜKpG|N|+EV.fJUk~ϫ1JڙQ&x31o7EUMV,EZ kE4VJkfL?t\-?DDy@9kg7344Ԋb}z~f]{"^C@jMt]DD׭U̯?WY氳ec[`f bv֦KߞDk.ѥQ񐳟ݮsی$x3Zts) 8۩{"SB@K%Ho\};gc|Wܳؑ$KA(Tm15ӛgR.G.?|,aR* TY ~Fαe?G5,ܶ_H$QE'`8<sJy(֦ѴKTW^Q%) 51cd2yCFc5|1}$B rG^qqUVVTRloj2l$IB"Pw?qGWCY0ͅӧ՜=eʴSJˏ,,,i(;+CH$<Zzut@JP \Zg,JF D—d@\%Թid#qT&I`od-0u_f@}Ǔv$yhLoT;qdu6ȰhL1"\oXW%տlg) SkxFI$R!Wx1ԥyշ3t'OL3VW1U& B'0ΝΘӠ&CVr뺣Lf7@q] !.mp ,id 1Ɣ8h:wga< -HdTVNg--&baZGT ˁ1w8// []>n{kD]}?-L*j[Cq q[]mLbx|^U+5Jzuǟ4*j!e:@n{6k:9},7Z䈁>Uw,яuwg$^Zq)TjF`z/wR持VO%)5BQw6h%.+$W1"q)FNւF|1U]_<iZT'eB.◤]Nh9ؓ2O'Bʧv$^tA>fq(Q ,rqcS4S>0Zg9Trj5$+c&! kA>6#hn ӮgiJ^]S qYYC^lM*4 nud}H#0PfEŒ(JSh:8}h^<F]uq_\˾o9k vT'Fk$͘xع+2U&]䴁 &O!8h- \r?PP_ѠD>.7Z$i@˥8`$q92exM'd2. v$\Ο2IH2r"YMR9hYVµf3t~okq-9HOUŸ?~F#a-םedqpN7滵?СF IqǛn#Z&nǎwq>B`ع%w[74Z`3Z8įzY3%˄A9J^?RD9@}\} O$䳸 *\X֓sH=~k p1U ^*Ow;{mF1@v*/+a:qz Yӹ:]F& 3:+V5e𴻏S v|LJJDUcb,c[Zxحc\f@FNE]NøBO7o`h4$PY8Ί*p\:[ yQdqdo& $ :+G8 #,t?l@{U Sb\f@2 ԕ0<`V]>ժHLCP "aG`cءyL:~@=Z;[OīR&A RIENDB`fotocx/images/rescale.png0000664000175000017500000020164615247006660014432 0ustar micomicoPNG  IHDRA}3iTXtXML:com.adobe.xmp 0 272 311 ϪeXIfMM*JR(iZHH0232,0100fotocx-26.6: Rescale: width:280 height:245|T֞3 IDATxgT]G_wv;۲s(r(G+[9!@$!B l9MVW6p-kTԮU5kV9+ZСCRRn7zd2iZNG7s^o4:cX#`&ު΢14F֨$"3u# ~* /J$o[YKJ(b,zf2&+zIOqz7ˬa5jLjHoT)|rW03 3?^3@,G\+kAJ#@^%2[Hy~)FR,StE!lh4=]xx QVd6W;`]@RV;,.ҴE"PlEр*ȕ@>3 :0Q xl n^0jD]13x$@*6X)ѬW4Cs&ά6 KK@N%.cn!`2o["+.`CVC 9.RIt8PYr@%~&trQ٤7t[۷G?w#F?oSQj-t Й\5j"MH6rPbVZPZ!BD&Y ^Zb+vy7v:ߍ/V Ho2Nd5ꘫ3 V {aެi.=rRl. &{E!F^e53jB5M&d .AY Ԝ΅yÆ7 \֗Q|)R^ZS_(H:w&4.f>Hr/ $KX^T]$ F%L5^D$]^^Ƙ1>/[4>?7nԇi&^U *Ze'>p*R+Pgm&dXefc)ьծ5[4FjjdVڙ{7e6w lQE*I:;+lFbS*uщ[ٟ>d*Ǫ2좹CNI~xp @"ndN6&¿Eb- !]Б32qIHD܁ApRFDP I:NTTˡ)))iiiWP&P&/Q$c(:5"Y 옠Ha&Tb3;zo՟~ر._:s|]'|~́Q|=0 aoEjs/60$7? 8vtLꣴtMp#oXHptX%abp]p/5@hՓZkѶMԃG|##-4"͈;SR 5zJA:;mO>xVcMN=s-ڍa~o'?H {/fPÇH @Ԃ]tڕqwYBEDD\zʕ+CJ[nDʒa{L4emyM$#W$UBĒKq30W3f̘\cƌoiQ۶O#FE\I}>/~Om[9q8`@86mNO>O?ӟ~و yv}ϧOHIcOR$k.DP %re+RʨT%m@2(0n޼ߣOuKxɭ+LYP#=d AsΜ9r޽k׮2dȲe${$1-#$Rb:m&hn?oHЁ#=jذqXXh^~?!ݯG}MxΜ`%߯Rk,la[+..^WYl撥N2;C :6KNCRV7IV-3{Vf_kj\L6N{\M>U*á|uYüY#[MfL݂=0ѭYzޜV9| 3gδm۶~t۷H .=w(jӦ 蛿꫃" U%(ɖҌ"D$&5P+@ YΝ;֭Cu:rۡCY4Y$$$Yt.͛\WhBrT\VEMqa=?x{t0mS= LܮCߴ•++׮iڪy-S|Vv/[⊯_dl\Z6`PovMqcRTO/^v^^:5|wiQnjVmc8̩C7hx*U#dP|ȹ}uÃ'hVN}S}ݶ~]?`Ϟ= 7^wkcfQ:믿=ztXXq>c:cxޱcGӦMGx0@ڗ_~B#aRM IhD\.5wI&&I, K$&#ȹ}6|"Kɓv킾LC a.Jp+2PYILVjݺu:$H 9{d)0`.??nT۷9yjx-ԴY[wlGH_~#.ĠAta.\@QtgϞEL eF2$= HT4cǎahIF[`nFѭ`4ǏsNRe uc:w@K9,YLbjo{g옑Ο]bE=Y,昘ȦMtEKlݼm/[ZNt}g̞E&Z9vڴh@Ƞk5& )?znܸ~Ѣ]?^R'Z5׼M)jm%Z6o8|U^[7o޲k%ˎ;)cMk5i ztm7>]T:}xww->).<̧S6ˏ3;W57A/[۵'55k_~C>J_>ܲe[zzM2tĺux{o^dɁ\9& !ȨkH!'N@3?ur0\ڣV݂@ Μ9-XD\S!+)&Q>@qРA(:P ÌwV!E.f$8I,YYw?- ҥKy* hۮӜ #"b=~484b3=zk;Q'MoVY Oތ˧Lp3(hԨ11ьǍpĩ# kؤ۲rmּE>}?y&~SeGLI}Mj]A&V}-Te=Q씔wV`ǎm7nDϳgl7"BڠA[DΝ:73+ԙc˯??)ÿ-[w}M܏=Ao ]˼Aj^' Q,@T5BHI3)<פIr:2 ^|_0 xГ+~!ط <&&3c P%aI,]Tݞ~\ʌ̴6nQC'=t|CMB@{tڵe˖4X' t״y#!ɧoٺdrɧ_M[ 8Y,h=5kq!S|đKD.])"ӀJPA:r6& C|"\<;.0@Q ]+MH#$_+Srg pIRwɤN#t:4@h&6֠ [Fغmg4lԤYVmZZۿw]Um~bbZjrz} ===j޼9p7on|ܭ۷ s9} &CC&NԱSh6nck~.(F/gbv' V䤷e{( FZ.*tz#@ ʐ2J@qq|!Ns[Dgv XF#=]/ LfzjUHVۏe4i( JDG̷(0?w̸߯\w3gS|Μh=[4UPrڊ#R)rAGME"%4DJ)f䂠 uCVRϚ-ɏ+Mc3@(EeA06$ Ms j\FAJOK>WT@B_vd1JU&hǃb iZR@S%-:5dk9 N;x@lfA@-H+L\>*U!dd]tYp\H6m9{[? /\d93[8rC?] "Si! є]HfZ@Y&;d -PD2!~M" dI"" A$t $,_H]bZx4l&Dl*҉O'abBHCxJI>?"HR rOD$yņv(„H;@lRC,(N!L->>HIr0ӈ& gAn5o Mϲ/s/}"#RiWJIJ檕, AS7 C)yRdiv3Wp}Y_pkR+%?i.W \WiY)ٔ4.,'HF!ix0 0w=lALB)",F^ pa: +1URP"!N:C\%3JNe+W>Y*/(NB  YY_YOyɻHQ7SZIQI\Dro":eR &\p%PLMI&M"Us\52N<:_ȱt(iFH EdJm%q 쓈`T.?H%{?XŨΕ.H)oV[MPT GKhQhfMEW ?F7\Qd ]?m1&&ڏ'iP?_"WM:e/}Ia4ֈW~8Wo ԽZu)_1 0Q#:,1FRLJaK{Z[sRI4FEq>#DZ!Q % UqFItsr`5 ڢ_*ruBx![6XwI)p %95%a )'IX&wVUY$)jϫx9lp ab6VVdŢ RG NY'"\Q^J)Y&bz{,VWd';/%L$aI/ IDATʐILM+}nȂ/fHN Kӊ2 PbZ*+vj# | Cb'vJq8nUUU<}Z)%[i &@=-W3/"Bb]2v.880OJ';l$w1#L#9Ǘi$5Xx ((Kd'j%~;TYj^UVj3TPxR"-+;7q&+i#-B.AxZ6>|x#R"J˖2@W2m,4]RZ친h8 s䐟pŭ]LLHXj2y?eWV+Hd ̫>K:}ۑb0'B2)pH)D48n99:e)$㗉"16jnHeNkÔ`n.>ǾHNp[KeЂ8e-O$ɪd6x~J^aH$)҇u#qgb#%˘W@zVQM{u1C۫gϩS>xA"?|,%-~_ 4RpH"0"O<JUaf@" #0Nq] ;U%rɠ.<~,s葜 m7N;EAZq`;\(\H抗$14HZ֭ٴqCfF,`YBZ U،ywoѹ n9}9G&`?-0؊Tb#eFoo #XldIO"7v(;"܅2W@tZ+|o y…˿\GIZ?y٘ 0 '+Lð/sˑJP %Ep@H1ё)KpT-NvP|~=:]xNXPݗ,_O9z{#6_yԔ$oݲyUQ-]lْ<'O{Ho)'"[.%6oޜ/mۂ4KHg."$on0dsdϩX9׮]tѬYǎ{1|}/rLk/_c7'1>yrE.-n~hMPZΜ>t3qٳg <|`EXjn9wP V 0ÃlXH`m N vKIu폜8e5GlؿT=[O;2ܼvN?衽|Б#F}`jf L8r؅nn}8V*߾=Ӧ{em~k׮~S&nCZZϋ@*+g*)$j>]׭^'8@+V5cܑcG/^6oμYCkG9܉/OZb;.^>r޾n?g3/[xs%ǎ`sԳO{N̞6}f-vl>)~icΜ{̥ӧ"jE+OM}L`}Wص{^wͦ[VO0vLuvr]]zt]byrFƽG&Ξ=m۷ge*>o@ 9t¤dg1k,*Pa3Xlf"CZYb,1;-Eup;xp ѳwnںe1!5;w*mUNElɮBٮ{?h3ϋ3`ީ2yw/4hq Iy*MNAkgwrvQyy%3Ĩù H]^m{?pJ12*̅NyZp뚩߉FyZjL?fg4i'}[t4|zoe+ zs=b"+&o=l]; ݴ+wZ2sC;,ONV.)Rbgf&rrsծSc:slis.Ԧ={=^K ֳڵYe^qgi ~?|ĈKW|ܳeޝmޱ'"g?5sDlJoV٬okoxծWeY~ɜdϏ&,g ԥx[Ӽ@NM=:8y ]hMܡc2Om,6Z1wڄHL;3уVtzږZlܾ% X7s=4oNQTs7ݮ=;1ڝH=v}0UQ4a,sJmP$MvkvNqc{y;Zg4[aM<Gg̘7,5ۊnvz * 4qxI&cƎMJEZCv~QNVZ=F3m}NYQ(~aٜ20TTA?.K.}[Ӽ@uz̞ ]۷8x4jʮL`?E_1k;QK׶.[=?#N;p.q?˕߸w.r]: %IUTu#'?H,gΞ}+f[: 1˝&I{\-W\*g(2d2>~n&>{$4+7N~as5p+Jܷ͘wݸpVx(_{Y7{#h|CB\|O\`&%3Św?ҾWBr9/\c%H.cMdo-JK5Y |i%*m:֗UY+Κ6qt[/3sRjJ"Jn|ȱ#>*n5k٢{|Ư[}7 E@^=<< ؟+Ĭ?PYf, KOamY)Cye>ri7cMuڥg|`n~c[Fp5DokÃ'Lܫg8b}Ѐ˗.CM޶]0A=ZнwphiS' 9lݹ`Ctiq5~I|.T RzHlIQ!.׮^+?|G'6ocTb)c}}W/>`1egbxs sN8./q/\2[ܾEbp7or5cw^9"*5U1ۀ޺8'2{BJ倛 )ªy(0O@Ѝ:9qxQ'ͼLdS 8 ;at0gw9KU:N|mA9cĆ0__ex\Ņrk~^-Np(v;1+59˴"x.8/5:KWF3&ljBD*9{(sYMlr*4_:M]^ 9 X(?HKH^euw/pD"B4ɐvu+R%%RhBdu6;ڤNcSsKZZOc4#a4߿VrZ l!D0>c"yb[)a" U#ĒtB0B)O]2ւ>JJWZ^e(Vf2aNv8+ ;-&IH [ $@":`T̠vPP{(G@.)V %\VAѯ8CQ 0b/"QP1C:M)@rT2 nq@UD--E`-Ɂщa#,|S!Tͅ@R$t',a"%$/m(R^ @ DJ KH?! :?qV^iq,KRZ*)WKK.H_)_/׊0b`lV@RFHR;I!REz8hi'!e;W#A(RfQ`I[~R# HXN[@$@r %J,JN1E]<)%kKPK_S\ī ֙TY/,6u +B|#DT;ٚt6XĐ#eB7ZSǘvbIU䀟ͣ [ґKB0!F/2RDE1&+Yf9SJO*v*[תd 40W,8 4IF+ Sдd&%Ϯ|D+J_bpH*g^P45NEimp"}Wd23=QIN/C^('J LJQ ?`)vpķN+&F8B UeQ+L#SªQ)Bk@bVBΛ1(P_Cޟwy"YnpyR|`@:qwfqcF/9x b"ʛNԽ;1I1qQT$**.22.2.EދUtұD:>nTl인{ w݋x/&Npm&FFDߍP*2@,x'&:")1.5AyZUe1a`v+ԟJ/}P[ 5oɼޒȜ+њXn5P,>$e|ؠl5flC6~-z?-fZ+n(yg3N6ŹRoq؏[} NdW)aZ @ܩ*gv3IcFk1S)͐6( R5Kq@5W8 d(pFe$S+VSV iBz"gL5jFÇ>NoFր לF/F ZA;E&}aЩ 9b260ꋍ:I//g5QdgDEF$'o][4u /3LgRXHAhR '~0x e]xӏvVRQ)ƽs_xS^b{ q=}B ?WUJ[JH*眒2R Dϟ?!N;<9 a1Р@Mq1 %M#yä\ϟ?UUUŇRSSG$!T vMo?+/}^|V|ZQĂ$v8򻒍& jK-Fc[ðd R۾J^G / APj'x`N Bh C  xsT'ÿ HwK|+G> v90MA1c $gȟ,~d3hP!"0Hg&h.C7"H/Wx^$ ϟ iV3PƏg/* ?DJ.2)7Bdz^y% \JvEIPC%TRK ILcsjDhAE9Tar%վUp%(UO $vz\KHr\+x瞔Hmf' V&NT>̥V+W"ϛ#T=èKP+(f^* @x;!Wvx;,T*y_yLj!AMrQGVD!佚[QB&4hS%WxgQ _^)bGGGU8VMaQV*;IzjffF&o,^"')^@})<+giβJD>E#>}^U^uժREc:@?GVkxM,{p'3xKKDϞWyfכhV;@{${ KdX4I]D[Q"iy]0ˋTQSf3F]9g6MF }=_]\,6#˜T l$(4q8@c;&]NF׭^K/jI'66XP)YɩH!tpΔhq.mI,m|p:s$TIRTޞ==rt?e꤮ϝ9VgϘ6?qwB;pԥJV^zbg^ӧ*srڥ,ۋ 2-9aGiIVyJ';xL/4;Wt IDAT@z\~h<7,撧U/*+uSXDc:x؉CN2tUyY7|9t`߾'NeҒʪO휀wڕ9psawʪЃ/`):) bF==zN?y"-VinnޱcG޹{{w޿gm{}SRQUe FGE3_j%FmP7|.mݲmwK;t6s\`iҩtE9*UJ5~TVTKT*"u:MAaVod37KmE"f.LB.߬/R FI *U10V4E Dm1 1yV`,i++Td;SW[ye Ŏ6BSj)2׭;1K`tٽoRYZ}{:'+7±qOTz1]ɢ879)'Ç 9o#G.=yԘQN6i޼n9R=JMILJN`)%SnrMTSfm>ŋ/R骪K,6ˑgܶu{7(~"Gm^zul߶yfCtb)X5wL]_7j2|8+ DE-PP#ƒC^ SuV={z`nݺhѢGGHIÆ mܠ~ {tسk_Z m/Ձ cs{FM5abŋWN0%&lp[wءiA78cǎmk֬@LDޖݲus=|ox{mr}v<~N<336zoݻg׆߻ё#G=W;ˠeiǎؾu]7yo1, F#1cAnt`a2MY" 7-U+7?̠G-p hbmO0g2>g{./mNH?kӤуwl-nS.l;k1 ZO@}j3$yYKݻCfM[)6TT>|Zzu#XHa!eYfk$yܵKkW/k4۰!_v-vTٱvp=gh ja 8ya-ټ {hr#%-mˎUF ۲>7f'ܾCfz_SEz ;R%b 6MݴBcÇ Z;/]Ә˟Ar͆ ٲs+g O?q/ߴV<=HU0y3f~ n@HҴ@0^^ktk8y%Q7&~̪=Zib@~Gg_,}I_H!{S+')wFwӥ陣{>:o~}mٲ+/;+VMu}%Oɱ7S??99qɒ%Sͺs7AoGEL?yִ9fC]<'NI=zpϙsB#>Jd\~zǼ6{kLJѾanG1%_}3'dd>Hzp^bNVAvl TW A22F3mӊ3bΘuɜ)Mԛ݊'ŋgӧ=g5;%jؘk*Rܵa۱c粟hA6o6gΊ<,->=yDجٷu]6Ϝ8XC>Bnي;KѹRvOU#?wn~wB;z /Ui6oݾisւGY bul׮ea<б_}s)g/jբ~-psY/5 f$A' )ĔSFҴY`޵k `F>/8cT)ħb{vؼYI` MbUq̝܌ca~ûumSoM6]e{LD{߁z䰄ҳkۼ8{. <|Ǐrxzax{'0js {N|?58$Mk6i NFAZA/_?ww,kYڼ~ǁ#'D29p`w͗.nݚ7Ё y1kJ꼌f03gЋ9;=s8k.04F2hZ[6n&v…>r}<_6ZWo״)S"£b;R0/w_ow*i*}=q+m/EE7}ZBoiܰѼ9s٩g5[BCb\nIPt|-&M;{ִ vի&c&L]4ڵ2s(y̘Q^6rΝ[~N 3m|sIt6w"ʜc':u-?, qʶRہ܇_:`~/K,-vxR9#"R½8 8UO K;lP,(2 }z65s;YZydBz2vT7j'0/b6|NE3`5mF]q=l%N6ac8#;Q9HdaQu={t9k*lVi>e䨨7vv-BusaFWoڐŜŚ޺ˀwd fm-Ff-nwccLFg$'kgcƔXR.^4g.CLtt]njp9`{g׬ՠW۸Y/ʺ;fp=Sa%'h?GM;}ϻdb2ˋ: 7=WMgH/Xz HO0wάڱ?EUݢAn԰ ϱ'퉩Ξ?w_&$'?ĿyQfw0'MkVձj=i{G;iGVmСo_ܶ{K_~%>~>jnG\Yh)kl5?n`A`ǥ?Jc*,v )V KWlܱI ~R^|ǝ:{:rr3ie~!a۶zSOkӭ;Ii;n0=-%$[}ס$LJ3+er3 R6LZ$׎d޲ѷ ֱC6~O 6fpXE}4|hfM:Er讝\ [J4Zٓ?wWTU&D>tĤTMog-'_RTmO+2DFH|Ό8Lk: L\:?. g]  7yoR$A!6^7HF$Q{;4h~El2 V=_uPXnO1Ie֯oƍu[`0bF 1>ڭCR=b1|Zvan^:ddVmGq}/Ȳ9L/e } [vܢS^#nfc~SWÇ q mTF_HrsXwׯ9wngIJҤ[j''d9pK,Tr~Ǝў -kI) [4d3fm蕔gqq)H:9^lprTRy7Nnx987 <*"֍Ӄ6b@ecݹܡGq[nܻ}]h3LيջGӗlu|ոGϞ֯YѫO%ݶ{O=Ҳ rإZc}1DR4weg91AD;jky%Ӯۑ{tI9sVVv]=fgΞg>cVQq)KJHŅ wndt=FqDxZ<09@`8BQZVrK2t]`breZWmZ$=lH}Bؖl<0AeDl[Rk<]4sdpZ0H}$/mCV45 3r"rѼ"Jʢ>0Eϔ8Ԅ>Y%a%Nݴ7~Ěބ1<_A'1rbQC+P0]%$BHI B7X*X%$(SUU>܉yqȅ 7ވ~#m*J| d$'cczJLJR2vrU^۩FVkNH(v9\TTuГ*xUT񎢨b;Fu(bZ/)2lPOyk M9/T̍ޖspH'̠%!;-AT sHWn9ơ'7 y 3_O1xH0 ˓ ^E"E !=ZTD*P"$! ( s.n%^? r+r B "DBZǐ^|Gr䘗8[Bq<h'%j `x&KK;CA\WmH0L6=@M0"0O`9TQ0RRҒfcU][KIUj a2wS% pR]EvX7?ۢ<%'N E<<_*҄Rd@uebbu r8yxC葢D݇:{#Z=QRJQGm>=*jcQDm;yԎȨHw jǞ qN6.]< WhS؉ 9E[QȽ4'싢g("voܵwN[6O _:GtT`FI Pcݐ$Q (Ó'OKԇ8c lA9;+4D e!R=ٗk !9t@NΪq5Jn֓"'!^2F̝YSp䘛ۄ:2pCMK1@ce6&2ch6{8B+oR2HnrfȎہ,Rpfz++=10"G*c*~cPgE9'*zQHD+Aԁ w03 J[ƪ0$ΊX rYk~z^vP@\ `D?!i Q"X3x2;~L ّ ʲr*\rRA'{+8_*nyyl*BCN[YxpE3MIsHOV8m‹a֪ hЏRPlJTG\5PjrMU_ٌ g$े8TZǖSX:{.-%B^Ĕ_;|ۧ(YCcBZf$($dV "QeFHnvH'yv-JBv0DE"{Qg穼gd?~^2 {@'4?l`8JH݈}ݸxݹw.1FݻGHфDœȏw%Oq^p /eHN|u15"C_P3'bSypD^|{FZZ u__}7d3,c% F=NZ`↖neJ ]Y *{5ne.& FC$0«b)XTv2:"j5X5 ~} f!P*Ve>IÃC#Yu*.x^e,K0!]b¹348U_j';~f^>ѪҼ?j+4PaWD1#ڮ\xLфs]`0aGmYhzڳ5o&!^3dVYZbzNLײ!_B!i8҂iJ@5А7PN5y:k| 'F(X~YcaVΑDGeAY&ަ9J}q&fEwyNr6Nc\N Ħ{>*d7 ia) lWK1ă;ElVK9(קՌfSgdf}Y 7£y'5f|Z A`E@YNOI=a[/ZyQgܱ,73Fݜ2Vpp]4up$tMfq)ȫjuj)sU*ZiEtylb܊ 5!R<$syqm7@BEСCa4kXlUa-RHAxW'uL^ G:߻XEr2vJkV[X+i۶.S'K'cH`Zr#wm߾)KqzS.Y ]넄vڋNœ?wc&|uܙW/ߊ܂FHt&^v";Gz&|STRgW$ )t{8q$hHv"a0f3l¬a>iq;ى=={ݠYCc ^-_0߀SfL_lŔS:6bX^aF~zIF}9#?ojtS]aYS4o޶ˠ[8>vXxܥ׭4}F6].[o0>}}>CzNr8xBg%M<|_x2;v]ڴ;_Aq ;W~_\W2qfRph?l8yҼR?U׮u&{?+B௡"Y.](^zEdm۷?^#<׉~q \uH4joV|xCHv7Jj"$}q.mҼѺ˦O2~WKo{M:kU\~ֳHI{0'`z}/83y&-~q?YqZ!%8K ^aܥa081YxOޓ&.D]ţ?5ĥF]Pmfp z%{wm|ħ#G 'ݺ8sAXx$WL~>p2>N:>!UH7h֬ڝˬjwΛ=_D ;ZiUHؠ]e{v}Ü;wi߽G>kgR3D.<ta~ѹ}kr]EbQqSjtl22G7s>n4\=qp/f18-eڿGB*ݸnex n?=v̸'PWxӻ .OLNx~@r_‘ؙZlP2XӡS'8"i<{'bluޔvlU )=qOZ?F{W`5zB#BJWciF+cK %8ϦAx6t:= /w҈:XtE\rMnްg6Z޼ӦL]$=4yVٮ3eFoz %Wƌ-bGAXQ[0ӱc}c6]>z?gOckr*ml_"2&$k@*&BHC␝Ѷp4 ;x!csrtgI٢a7g%.9c┕ϲw^qQ'/B1#' t Qi=< /UTTs̐/'LtO٘-}na#anB踗rYW5ix9E9R_y߾hiKQ?I>ٻowCRD;NMlY>?1n/Rl_.[#$NH+.z>mڔV_x*¢C>, JҵC(:H4?KzCHuQnʯ0%ڡtwmײwNV3n"+1g{;|"r𞽺-Zǎٵmod^ YS?a>Hqw;pڥM:tkTƅc#Y|h/s<>t؉Ii8y=wrЧ#']t#b$ñ3 ѱxAk'2s!G lث9uч vJqVa(~U̔c&c˸%K8?޾c&.Ny^J|BtN}19%#Wn-}n6$$Sdy1#ډ: (._(-Rk$8^owڹk+ .4jqA#sJb5Kg۵+WB.o ūCh$Fk~W,d`sOXY\9U*WvvD4ˊo݌>|HF ;w3aG &LjܔS`o|ѣO ի!Ѫ=u| x6fI''&ä&?φ-Y8>X@ DԆ,Gqpt͜$|٢eK[bS2h`|~:.zǜx]|ܹsFkOG/v1W%mZh͚4=lEMx7SZ~vkV}mfDper9Qu}$"BB՗fw]suo ]zeΝ?DDlgK?ήjC pG}>lެIV-!˗BoQǥZ}ܳWof̎'tħڶeƭ[$O.]ՋSL .ӈO6;=-sLPi P[!RQhhr '6d@v4DڥӜ9sH l6ܼϝ;J؈ܾJr5+ -iE?o !Є'8AHKg%l(zM :n޼9;zg>lǐb&IMoꩪ" z N [;8{0DmHTdϯX"A!{Xr*_zE]u7oqUȽx"*P9ׯs @JaA R#6p"r0u#T ! WqO B>b;??cwOg H!;9$9%!X ))Ks& 0[VVjQ p;7 T ߆e:Јr KKYU2vq*H#$-""٫*ecLE|:_Fи^C]`S0Dx9PN^ ~Èp{|ᕗU!aHԷ<KJm"E˳18 -2 g[Z\tD\@%V&E sw2#TAIv59 I"qCKp!|R/ IDAT5&s"r/c$sӱjB7]] $%4!1:F<+`10԰Џ xd#FM! ).'FN9@HNaГ  48~'.Kpe©'TLjlǏ=}ѧO"O>qd.9up2OO*.'R0WU,O"?6y@TwQ Ç@b/%$H f5ށQ"OS@ߝ7;" -L4YP+\A\BUm0PE&ZJNQ0ׂJkgtl^6{IoEUx\QEM;P 'q`[ :{Aך*u}WUtB/+v^|hSաr_M_BEW~_r$T8~";sW |G7Q /'$~7~(B;2j8I~CH? ^ yCHB?F'/H;j$%8T$\~v4 EHHq,ͫLd_ !ɥBRr"EHB+rr$SR+ !Ѯ!5R@#H[#/|I"`sM6sxDVm_U|qBvIpϏ%|KPjG,+R2;H.ϫEke**Pu ^7R <36@4t*VrNiv{lp3&TIJp@DW!9ru:6JThUʍtrX)J6vcP[f}Dӌ4 tȷ:CIm>G跺PQ>>q`:eY_p@!(6vxx4TѰsulf?fz^<|Ejvv̉dWCS}R'jf< $Ԉ*5=q&h*R˯| ` H"A ' Hi`!AnԮt͞@Nsu8Ǎ#.C.r' . x O6%)dGur]'Y!JڌI7vJQj>O2U݀c]LR(PQ2:lXUGf ;͋i&ާ&A %<~`YzhḄىcb2qF?-iP8In1ԮI[ REQ `3PR2/jqU:@Ho *`]@!(=d h@0UMDBBX$Uf]HsQ*W&{Ŏ= v$@|f~ZNPkUFQ\s Git9%#^]}>QlЕ1ɽ.|I8.oڧ5 az.cH}jHڥnՈ"J'؏J$ JϪeHWj(@"ڌb|~Id>3H!'Q%W*%]} UϓxRAYo@9C nP m$Q$3HŁ;I%lD#k))G`TZGT,A Wؑd$-fZxa[L'KY0O>n5+J0j.uXRQa0H'c/kZ`ƅQhPf baPTX>e]v j2lAy>6>gi"E,J' PXH"Q͓ )ŇpNi @Fy*`ig@~j E'S% Y G1A SP("Tʪ~f"0%H|LQҭPeˠR}QJ A;q:Q>bU&(Hw6c$2&Dgd&A)}Vc9vcǎ%"'ag fHTR> h3(@: 6 " rE&^ a!R8 %azѺ3ITAs|37J.zuN w眮^,ep |('4ƣح* 8` 4AC&#6fvS%vS\*\VuǙ@U᳧N=LJbc ԗ"O$0(2iD"Ab6Tx]'ήNGLs{ΑTxcV̓ٝ*#G6Ɯf9S.YJAxQx| 1`B Xj5qSDĉgΞ={.%%E.[ZKUah9k@G *AA! qL ޙ *JL~e%~(>>ӧOYbb"W"ޯ -ioS,DT"'GzUDa9=}|"'Ϝ=} 2_p%"2݌u-6&/9iGit#U$TV߾} >a2*QSաC_xZl(ĊDLjhbR'9.&?vqn1tȠǏYs.:wر a!1C1DKoe T/:B]pCOPcݩcvm[nռkӦ}-t_~aG>|P7lьVktE~z @HTm K"/ubR'4YӾ}> qRv\K\pA\ta]}eq8?dw |"HtBBpN>C9kU8;b GJJ{>p F 0B --7r\3\ l.=z;p\gb9vtsfwdEw t)\[vOi2-! 1 !vt-%qi!lM:}s,t.ǔྌjfM?va:蓧^ѧߤs 讐|B#^m&!e"RFwxS̞I"(Xt{?QևEPtRmBb! IHP0g*P ~m"f:ljE3'Nn۱sĎEe{ 5y n' !Q@K^MwÆuħvێ];$W+G|HC[j>vʌ2 Wrԟ{cr]ۊpZ,]cOy He􃐠1avZo_>7㙸 q[YKB1APQB"ukGROjXπhϦM z].胍0-M+"&-Zsz&a}@l‚ܳg#ܼi]nݺu|"96Kiy٬9uh53hX+1l>)L,ѐ0hmwdw?QQ?GrqNѶFvQ{q1.-^4t1 afoTdV8tAh^#%2$ !jdH/pƼEm9{3A穀[MFQnmbL ZHz?M+R}9# eNLE L8}6r8~b9pw?:|00% 7nX)Jeyxk$< ނSء+D&6YC6k٦ö= 6ӧvGCP{  .F$#ojTnܸʕd(.)Z|O]z wOj]!! ɋnv5Ғ{=qs,;lm[vlwLU;B,ҙzI3K_F-.Ea\7#\J"ˤ22A*nɚM(O%h̘U!vNiиɎݑ(LQi PRm1k"> _څR4SU+Xb>_}56c.]BOδ[/^< 求>>sbӖoС͋IU P" t~XI!!^ kr=3}X@sz |JB5{V<S,1#!N $l: <2'q{BII@%kjreC_kΈ l嚵{:~\ŎꥁrTrr"f X}Zkмm ԯOग{m" b$Mv0:GOvoBF`1IQN0*Dpn 79s;z7n\g.|"ښ}^CpB(.fTWSھe !'ֈ͚6:t(N>},nu&X<<\ֈf͛}NtnEbEOZ:)*bSN.-*rZ&4f6m*`gΜh#ccUߘ+[#2AB(xIw1WV Dn9Sx3;*=аx՜+<2{ݩSJӑM.^ t֭UO1^r)';b5Ǝ<_ݐSFZF.[y2} LP[1$R(0@6lk…5殝aA`i|5n ; '? HӳG76I75naΆ˩ U&~0 \2T/C[Ͱ&%7B?ݻ״iF#?rړ}hpPTTiӆ\'޼ySݻw%zjj@!@ExpB=Ep_݅#&܆*ԃ$T1OG5jذ۲84hIKKIx0btuac=$p'd6n];3:-B?D|߾ؿEf͚50~ށ(U DEه?Є3lL`C'qT$tL z-#͔ .>ֳee <{4<<) > ٭+,4x\ę裬kj*.|N[L=w̹7ssa5\H~Z\{6 nyK3.]pCFHp|eH(Z"Hc4P!4ӐBq0 HGHf( FSВN TvOYY"$5T*ҨZuZ`OC XC |ů ǏSJKZ O.\Gu*` Of᥄Di3s+vP;пyf LiΫBÑ@VU/C~RT"fkj'(x(<(,H2P;SO( (J,&$@B!4Ua<A"?_yUNt Fk >(χ3_ 6UK}[?lcyF`$8`LzC9JVԵ3ی:GU;'8 ƀ$^E5*ƪ LKN@4jJB0^RdUKipE$+`E!Rf5HL$RSj RB~+=//@+OɌ$@3d7Chrm.Hy&^UאYů ?Q?1ZDx!yOyd C4>Rvu?'B8W̠%ol'8^t$!K P@"խH *+jQPI5H jB +^TOVW@U9k`!iÓfCʧL^@D򹪗tH.6QBPEZLIW"z_HhB ^IO=NG+OzD򐓮d|B^ t"txU_ѿQ:ZKbyq+OUT-_*AL"@H0 UjH-hVX;<$'58ДBY*_W̷|E:ՑM}kPu|BL~A9yXT/Cl@$ 6:AW2U!G}B &נa : қVkOHӁ-Q!wOQ^LH0FN/5yG=_?P%J^˔כ4NDgUXLA9Em7TB`B]_nQz+Fڔ-dK'`? 21/ZO&,{4|?8ZDW$ *Ր<"$N0FKbJ_S+!!<SrpPhɦA߲Ӄ'GIh"$m $KWUzhG\\7]&ZqEB350L4~e7DHv1;]ZoYl.c,DH AՀ!!$f,$FH@Id!)#ʷRߏB Q. $? )BOW!zgEHmfq|f IDATܢZq{YVFHHfSWI&Z-hٔh'4'cf?aM)J~!DB2Q`MwQR݁#0"יℳ ^dCH8ƝFvx5➣BrDag=qF I^rPzC PxjOM(BB WPˏmKHs&W8n\VjLJƭhvrC d9$tZM=i[BO1vm;DcJwx1z3g'˙7b­9nɩl*fABJO|V]ghAz鱘19Y| C *>~lߕӷs ^^Hx>B+J'9i8_̵YOvTr@;\+HJX~sn3tW@:~`8{'~ N(pveuUe xaf=׸_`l5lF4$l'/Q o߾~x۳s/wqY -r<|<99ϑD,J2X^@I~UƓu *pnHpB:yqANHC>as\'P#:iA[^9w&:GUГWȉ2'5+T'w\zb\2+g!XGE@ <4]!z$ pPq+.ʵ+%'M1I ,.IS*Q B)6u]ēoS 4Dȱ|A0)A^+0eRP6P&r٪&r"?B6Quٸ8Rs"+H$W!4!Q"&*'7}_F…xT2y">/[|:C.v7Q.H$ns:WA/v}v˲;~aunUYVftYeeVؒ~w[RevT@s'oZbѼ\7%˖=Wx-bM0Ҋ"h]*zvx\0+t,t ο?X4g/FUc]84eRU8LϷo߾iۮɏwK_k Lg͓r#^0: hiHW^HO:Uܭc ̟=vܘ)S޸FB=]\&F?*P2|=; FKxL yU}+W E84E|ₜ֎%-^z-w/8P/G1¹wnP8=r@$IB>K ni͐.T"O0@ 0\5D\ .hFQE/x c/&5b3cUn{OX~Mi뵆K/i${G=P6uG=>+vTd߉٧;˻/]zՓOXTJ+~ i3p∯mִ?$d{$FbAH2 2S;HNéb.1bHx]zt8ܭB]Q-vCMIXϰ=rs}{㻋hp :FWBTDO2 01O%#LBEN0/3Ou#.q`!F882 aTfh@`T/H/t|AHD|P !e<}ͤ =ztֽm:=pTov |"?7Esgo%.@7Oq`d $r~x.&Ԫ +1ZOH~_h^cz?7e+䡖'ƍh8bS!Z>8:S}sЊ{=xInUEV_y]j5/8u d];܂,:g܎]=~\&k 3hm̬D_N_+Oou W=FQA'|ABHL]I~grg_wĸ{酥JKRzGn޺ ut50!P( @'<++-1WS$-sca;b=~_dw4$X;GdRhͧǾb{yXAxqWۗՅJӺ h,r.'z^VFYi_+3ek84x&] H  ʤpGa PI 5֪9u9{Scv{0#CCyҕP}MF2fԇY8@tB(}FIVB)K!HC{`8‹|-@ѧ 0z␯Da<"FCa@deB]:`՝4(G|ԒĮ:zK\Yg+pVX}WՠWyjZԷr~D5%O!F\e $=OjaW\ZbقӢy;`3]{7z Z LZue%E}ݴA\+ƢoާO ]4>&MdDJƔ"lWRŀoD;HH0mED;I'7/o%qCrD ysdf<o{ɣn'2v'گ,1V42d~ƴA+Vjиمk7(rv'^oظ~M& _G!΢|`jW }M5v~xhB[$ z_XXGXTU@Hp$XL,j׮]={L8x<!1ѿXsU:5.R5Brtn; Oko ]#vjr"wScu ;wy]"[5҈ێjω(˝ۦC7#حƓ'thz֍t(+/={AtvB6X#?  \&UU4802׀9xNa}S3m*TsY|y~iY%]TDOBH0j$14^t&?Au8ġQl̕)InUi ^puV`]Fz~ƌ= b2&ġ,nx)%3+xh'(Ȇg _"(VRAF"egfdR?|d܉p9k֌޽IkR͓a}8*JPвbzOkeq=&9U}U%G6[qIJ؂ O!$LllIKزM((.Ѷb`1Z]P;z醯h#֢xȧCz K|lE4٬y#ǎf @EHthAgj 5'U2OC͉t)>%*A]j9^}iY up^eҴ R"&Q8 ]D p%zwCc#< bv,zvF(-ʫ Ӣ' h ա^zE ^c 0حcڵkrRvĺhal߁fK@!L!ChBtv({B@' KCGR&fx1:\`8xp?[xJSI'm+e!yH#!!`;UMYɢGV>2*x+]}ȳBi'/fxu*.;1\,iWod婙yyڭiƏ|P^rԏ&ɴiG(3;uҳDUN )]AX C@HNNf~Jʊ?Ym>zeΘ5g!XdD~s5'`@J7 ?~<z1kS,[ܳW`gFވ1W]mm[f|ͷ2DZ֎' nc 3xR8A %ؗUs@[UW[7c3Vz05X~Of!|aaO1#P'6HN]u 򑣸߉}aÇ_uю $Ld& CQE>, t,{`j C+ݿٰS&lQf({o>H=JHY]L/A 2zUB;!흇[Uk$7)&j4{oITX{)6 J/p8"+s7̳gٳgϬ5k֬Eb DHa(D Ѧr >g4(SNiF ϼ2yh)r4gyy;_xߚ~[2o1ۓ$[?pMWZnmֶ4է$͞4{1CGzz=f̢ b“V-_yXX  i7 pgyNF62BFFkd>hڍa#z#yx8i'r^ӲKR%&oLO%? ki `@_-H-#Bo\e|ybP2j0y' o2d(#F g=;ss͛CFX; q 5dq9wΩs QWFJg 8Fɴɒ@#wQfry({W\o;| ]Qo90FׇqNl/8pOe<˕gLu瞭 8Dggvu'cFV[g2c+*4BdSP*0K6-E]R,V"ړJJȴSr>"b0"aD0Yq9-HԄH6J&è(dWv?nf o+aelhJ} `47ARy)ody EL@+Aš>:J ")bEY+|ҌLY5y0qsK:=l5YmRxrri.3V%I\q=DvY&(ƂLߠ4WY[-/-{KQMK\j77,6شY51/ү_J0T,39C3y6TEo_%9% fB&!0a)hL* $psk׮`Q*aƑ*R9rNqN{drEJʜԐZq9D ؚ*eֳԨZCo"7?[xy +:I!% .|E*1@Ytաnh+*m]HĈC[N18@ \'']mMRE49Gٞns [YSu-#΃gJdi; &a&1(XŨb2 "F oml kߔIuʎWKjj{k{ZwCtJ# w!SHYO A]kʪB/PtpwI!z辫k_(6Lk vuŪjsE'Zk9X,a ]D$Da $QDv5ۥ.PW.jPM4D;G9b;[\X/z@dSv*Hy_w]O~/ )l܂lw38N4 -W`NMV&N.]oPNQma(:I&Iё#bGcuu=Z++(I IDATF!;~ҭnWVJYҿK$ ]b \kNF]oע`39 &FZSB ѠVuGT'0/47*B9 a@Iq.̵ "f;V%>2fL*R[E]w{˜ZuHUwܒ")X;8$1^و Dͮ.$#8{'K~-$ 9@"’M|J9$tXL33%`_5@b/@Q+@bb dv"Z,2*$EcMTf7v|HEt@rq$Hw.5+,ȅI$/5 qS In) {YG"S Nf'-[ۇ͗I- hqO ]\w_k$zFa; ;=>}\ֆ7 ̴ $AJp=bUD5vN?LTS͂), ZjkJрv%)z5|$1amm+ҝ49JgDvq{D۱Ig4ܖZ?A0!DȴKxeřƔbd;0\h@`Mid?P-d6د=+xܥ{x={߫"&>p>Mx@~Kl$JCI^ђ8ZQP` &Eԕ!$tẉxIL8HJ0@T/iHNQL CE(,˅IK9e#k?߹[ ^kB2E<}T=~z $dNF@*8L0HLڄԧ, ҁ jq_F  1\;s.r6 v6,` v ZىjczsY IKAu$)AnP6np)A>]rJzWUܵEyDNI҅$bD!ElZ+x5>y9WWHC(r 5'4"2s]aML'2FOVz#:3Mb5py̎' BP[W9\|}O[%Ȏ'fH|$٘6hdh j c hbv([ČHPx5(GNv?Np"Sdّ ՓGY *\ɋx# dkP'7Rj῏/{ڻm#'T&QI2b9BΪskCxZVfZ&K}Eeo:= :ZQedkF`IXuHJ,TE~" zmeg_##!8$H[kUmhp/)\zԨ%܃;vq!&%6_('b'C$ ?cМy$SS:|c|!w.ye*6SjW65U(.J'P=>*ȉ$:!n36) |[*[}1__o4׈e0 k MR#ε3ͮ/cģG]%nږ$m(\Keu?zΏ`'.$s.[ 5.I *"V\RZ_aG4jؿ](N(BÔ? 'VÂv-E9$%{s^9t)eQ,CRL\y"I}jD,E/sӟœI Eb v)!QNN^o');HlE6xNὼ*)*'e?yv j@2%?{Mkg_ ./j&CV;o$ǭܘX0bw%NGw0eĜWž|$4pQq=u\. l뷤BRw Hi6ܹ ̋-y4jAE.`___m?s洍6ס! ZӸb('; .ZA`jDml绻`Ί٥0ʛ8U燏[ai1cZUsۆ?{qỢtZ ԁb^/08tߋp$AK I찔oW] 6( ոq~2%˗8x"pTW1>zGއ#O=:*b߄cw O=77u?= 1I XaTѷ zUq)*f,\vo~֊(fڜy%[**'3om ,ij|uG`,^-p78덎z'rbwFN=}%ըz~4ⅪyubCX`sJqC[z|ÄX,pѩϜ=5}͘:nXos wy=3a&LvbyqѠ}^R^QtŪF-^&-;d@#"s`I0IJ+u .aPQ#ݺrwclϘfeM?XPVfYKKo\3gTQ^YUp䗍zcĈ&M7q̤i}gд˴&T&0E !R̍ރ{d֓ب[//8h{4##) 735)vɼV)Wk_X=wrK5%2QE =_{/>z,2,2q.[2P38Ą 凲p j%Шb+fV0QW,,bIZ8369fL,9DgokA .јU9ũfLW浐 c ³$R%P Fa-Ž# 14Ԡc/SkZN=ܑ IŚ:mSs}A IЂzѢ e75&!Fk7s5iS&MC8];p%Ϛ;ISEU,,)**6lݸqBUqda JW);$QT=sDwN>UL̝w{ÖFǝCmPtgc??'qO7d:d AVL{~_}ttϑC?W5fRXZ~sfL89E E+V~YCj=h'7G&<"kU_pђg:JS^^)fJ ъq/v/yflǘ0B} ;A6L22Κ7u/r FY?]6qk?w{؍wk13-Y27 @"J0;@'(:31% Q%HkObZs)k%*PkllyTRJ^1~{o9[L"T:聵}X@V^ޞn5ik7 3Nׯ_Rl+USYvءYS'Ϟ9}!Q"&4Y4hEmaΚGR2X\Vb~;hƱ&8uk?Cc#b%3A}ww}7C8O>߱Jo,zV̠]<{ޞqcǾHl01Rx ̩?@, eC'@rX_۩ub)殖:6uUQ.cwMZ1QBB?d䆄kE/3/,%;WSV% .,bmw.]m҂Mk~gI)XٹysHYjFcNbM!ttf  /nE58-M@Ҩ#՘  ! g[0n&GfkFt6V %/S-_=}mشw>˗ܺe ʆ/v _M_s" 6 @"Zr3iLJ1'[Τ;]=x{[.٬UM~I̶υCm#1鉷Ue,vO<~浾ݺ=JSD[b&C:~8hղez*$:>p x2U]CTD8^Ue_wߎ>y,Qr0XߺG/>cǏ,=JT֯(+'NUqЮzSDa-,TãÑo5uշ.{{{B>g#BY㸓Gd=WVyZVeiQFReKwﭨ*={*xⓞ=|)׭[WRRpDDj s5Dq$L}SX MKMݳw?ةsIr Dҳڲӑh,F]R.Xw+7b'W Nu/38isG7k2Tqu{v;|(HX,9+#Ֆst`NFE,z]kPպ#%sB-_k0~A nUm; fXLlRZӧ'$%=yeKM8^=ߺuQ#nܸF/,ZhIy'V >Ǖnz^lLnȅ߂2E@ak*g쳏z;"Cs??H#Ao .^7~ӧ-+~Zo^hK/ IS* t^(M:9OF6UX!;nW_vmμ,SN#aE:˰æϞdʐWn ee9+V,:| 1k "##V7o<{4$aKH_ D[Lo4ThwWU|%=}RS]A' d~~~W=|M0ez@kV8q{܈#G 2ߌ~lѨLYUE<kYZ:9Fz_8=I9ۥ}=w-F. IDAT/LX[8eyWWnYcki69[]F򾵫{}Թ㦎$ s\D0R :xƌi=s׮/sqZ'aI!:iY3sZ|,BnN1s<1?Usc?} )X K:..{/^TXT\#Bڳ sPrss׮]dɒ'{+5[JKKaꌲJ=p7Q! )cl $fAz86hGw`Ẇݸq=77JAO8rhKg#CN=WX7JI~c'Μ9$.6/-թEG#9C#|AARD{bN<~ıÇ=LH8[#ݽ{8y$v$'4 !5j11gϞOLJ+G)ڵ>/@R&rb9"ad@<Z'5ƍY#h)zنŨWc*ᔑ(vLOc;LkB nEfͰ `0A!8yX0"-s6)Uvـ&yLVy\"&AVT!ͣP(24dHB+dB¶`L`3R:/ð0ᵼCI[Y^|((XVL9ũ/6Wǃ Œ s=#E1`&SMqqK/>\7L4_yj=oT9;%izVl,;M0ķdZjqe8', ch=#4%1L l^cqD{:r+|(ёH5rD^,q~H,Ea훓E=A& 0-ӳDY1iZVOXk'=д<4O@*o!%p jMf{.)( TD:T@at MbP$Bi?:a9 d(/zݕgm3Zh\f#do'.4$ 8`lٱp65&02 !چ"脃>.J _FY9+]8lZL5کcFUg4-Slr4۰⏹keXTq15 Tʯ95IyM@X^gG&Q3 -J$&M(x:\! (FYvvP}9?(0zB؃B "<66KL"ɉ0S)8üx]*f]焗GvyC^hKp$$1'V`ӆ|ϪӃNB#P8/mv+hhLR`̆؁$WhN}]ZvY+Ag"IZVF6646LOŪnTKuj5NH$ l,S~,r$ $-iI l"MAiJR!PaGXW.kDZF邦E3]CC;`-F]1'B&zEQcj=nZtґIhaj3bs5\W!lx0 ScjaʠU@~>z-m':e#뭵@ %{,1z)EBk?U Ab8PzX\4¼]LO wwn˝-nn w p=4o܏-Hx-{h`@uolV 7~h$~> Ri[-F䂛gw$NaqZQ-f H`'^Ԫ*i-Q>'៘swrl!1i\%L7hv#W B8@Qk?O-n_k#dN;\?Np@-r (;q>rAJNj +2Zo$-rI=..%@"'h-@ !0 Yl#a[ q#!L%){Dbw<GŰ-$Ȉ I.q` 9F4"ªjUλ*XK$vf'oe [ FYsځR,}[@˴Y3$NS72v@>43Ub]L&a:pB[ Nd0bِؖ[r-Ƶ-7beo=P T{i:# _rQ\JS '=|`Ш, z&c]rG<m^~Uvp$JR bgÃI^)k4D< 99I*UVV&%%%&&DP<Ò D@<~06..wc"S%6yBh&NިMz5ڃ:mضTk6v<q'kc'@С'XdUrs2@ xHx @v?2pXqa>x6,Dp䧉J GopjJ\j+z օ+DP /$@6A>,9RQa>q]X\ݿw= *//WO5~/|K[sr?6}]$&=3,z EiHpQZ Gn^U??`,6 qcHw%ر}7oZǑ(p.ݿ}έۖ,]~"J>~snVHYEKw:#p%W^~^hlF߽5P<ܠ^ ୚X#p֝;c'[jYjF*2|]KLYӦ͞;yj }x/_b}e^=L.#, ғ'҈06gk6l.,[jt72)b#AJtI 7eQ}7q/?(9s/:cæ͕U쁃Κ3.s$k_|opaD]=q2x֌fF\#ݼ!JeHݣ20ϲoi XG"BV;gEu0&)%K-ZI⣬Q#7nXAΛ??6664(26+;\SǏP6mJg0 ":#po-Y?q0Ғ 30/>!o3 ΜnfnaizD jMH[ݯX"n~~n^^vaAaUUbEwgIHh_@6}0>D:@B/ǂ,.5r9n.b3_|q,( :Ԍ' WS&-PS2R+ O (;{gϚA-NK :&EgMÙ uki'M9x3+RBRI~k6lI~YvGߋ{MB3.~nذ֭""MdnpIĢ3Tһx 0v4cTbM{i~iu+Co@kMg9uyU]!wi(O'$ 9 GtpsO:2ۂ{w#x O?JxI|}? IDGm~a?|2əVgͽy+ڍ/^x ddSNܸq/"_RSzz*_!9nR[@Z6 C@##4 G`$pQނ#IHRaK$!$GvA|i5x(¬'$Bw <+$zz"YV AX 9w9zHtM]^žTQQOD;&Qd d*$7MF oy]$( 3@!2vTՕ?G]+Άނ}2yKXiK uS&#lJl4rX t!9V23~ -WP,+TRVC+ Qd]"J.rEV $7R+9‘p* 8$ EZ-GC:'܂jQ-~Rg7G6 1( >t1A 2#eb(V|&$4#dxUQ΋*K*:!!"=dd P9 !qk(Iwc̑lEJ^Gp`,FEEFSywu5݋y7:c!Qjh#Q.-ݐ$UHl(QD66B:B$G:(9=d#'>XboV+I=ZJy*ȧG0usw$zOt48 D.&S|kjjRTbIR*BYCjkZQ.%vhC݂_d4PgYCZ@6H^H['<;-$?C Ql89r-"Tdk#vuaN곁-xCbS kC,'ʻRZ@8D)@o& !F#-rh-YCՅU *Wd$kw栫M?1²TR2L7:7 }gPIDAT2 $ő:됸+pN6 -I\ N\>BI8u# ؼ.Lԩ櫩!ZOIENDB`fotocx/images/addglare2.jpg0000664000175000017500000004443315247006660014634 0ustar micomicoJFIF$ExifMM*JR(iZ02320100fotocx-26.0: Rescale: width:500 height:272|fotocx-26.0: Crop: width:500 height:224|fotocx-26.0: Rescale: width:406 height:182| chttp://ns.adobe.com/xap/1.0/ 1 2 3 0 8 224 500 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?9JI)4/H R*,iJROKLps@"*X9lҜAM:&[ #qFN)OJ9T;ZhsflAC.1F\H(,IX1U$h'<Y#FOj&ZFr$( X$`0#cBVŎ'a)$iΆȀS<$ /ֺ M'.cHr#>##ApYRUsXʷ*</%3-T"#nֱh! z28I{TNG~$P6FsT8 )ʹb7FI 1뚱 >Zk?pak ͌־ǿ9?h'>n:R9$T{'OAJF0EEn!&G^qJhm)D;sqQ\8.r$xv {6>D8)98qEF)@uE}FĒpq@0zd pR8ǵ!)9.[h)` =|`䏓˰ԴLt5d[lvSؙX Rxhi =s\CA\r>Wq5 x'~|;}Rms,Z?6D^Y;WZVGz^g.I8sׯjn@~Q1]k= J=;ף s+\gbP9`A2lӤ`wgSH=Ac$ԊzU->'@4zQy ra~)zBB)!PPB @| BpOCHHA,b9 p)'؎p8,7dh§􏞙`;ٸo==h 19<QN8_Ɣ 62O&h$@)P8NBIjXXдZb{,8edV!b;rvFE P.=0Ew?nc@T#t[c,e| |iMec3ݼ{x6SM7ylIg6ZΟgc^9N'? =WQCqm`' s|Ȅ `4|-jxn'ԛ^ [1ݸF}yq%NRj앣GWQ8 uĈ%2I5m2q^-Y VsМVda 8뚈g]IlkAqڜ]ңNy4*:bC݃ G1: 8"G1q҅>j"0;sǽ!% dbQ Q+.0O4FkROa^+#bGJrH[d^ >pu߂p5NK8_MB {kvB _ >Cr< $xa^&SoM~iу]O7(|16vы{U,[ϩhO=ßI+,F c5=r1~pam[UTsֹJ5jY;O]z,|C2W_ĚY tp+e~Vki'ܫ+n 80{p0A#(Ӵ=:KWb U_>.>G[7 /uK0Ltϯ#sC ki=eve|2/1xleiϩܩÖe_lyNDuBihzCi7ۉѲ WZi:İ?zמ>7Y5yVY6U6^7R[좡v"̂Ѹ\8ԑTO'=zľd:Ӈ*3AGE0=餲Oҟ.TۥS2P:x$c@ WsCq8##ڣxS@2婬w7< S 1کksAWEJ秽Qto48~Mc-L1I-psv Kn~~̺mcv-L?>~"˴K:Wk]#Í(dCax8W,%/`…FcT%;^q*{W B]}OVq,+/sdu,C19=OS^oG㾻K=nY„>WyWv莘GVzŏ0vKL>&*u#EkD.T&y>%=Čù|$WIJr0۔]G[uʶ(uߕO9je#vN s{,@+!#=Co9MkOZnILTv9]K|OLsHF) ?Z)$+ڊ,Գ6FT\GB}ij,; Q:ӗ9'P2K;b4 )Hj.#4X |hOjP6rGԂ3 Cφ"ݒ# 9O,JG!GzCHcuVY4[ u F JX>zW|sץ[?/Kl7_,6$`p9X#=/IY؆2Kq?qĸWNT3صhŶSU6 8Շ_qz{ }bPf{,fv'$j=Y5֯&$$﹝|X;{ a= NC?f ?ut}29œ[糉A/9k?|>0k@}B`-.\qqkx~+M֡s-˱?X:riʊwҴAT&nsVv$uA1qڻ# g*@HUo[w*8x䑃=id#3Tf=餕B{ff{Sp}FK9?k6rk~?s2^Ta vѝ6)N1JL +}ɧa r{]ƒl\ c9Kg^zb]=;԰ȩi=dVΑ T`D`2HrI= QZL_W1pE}?,oz J6OҬ1+2a۵}Cnmݷ_nq?|]>Xhio:8OMO_nJ\Dh;i{8݇ǟgݾǢ[! t';W75*-IW~-teoN z6ƀM<]<4pS.w)YVr+cۅi5 qB)pg9=kڇ;A$s ?~xT?ڎ'…791|hngMr=*o1zf,;sUnWc\#*$ ȧHXǜC|€B 00ą8?^9{Qq5!<>+N~<sY~dk+q N7c_x&Y Gi_ַ7"GHOc]>68;nZaƿŻ?6aqt[9XPt0=s\ƞ[;i\GYTYS%|OXΠ-g( M {#ĒOrk_|DΓ[iv2O|C*tk&OT`¤g7H\C q! 7N~p#;Vw>w!L=<Ĉϯ,NADN0:SGO>-&kXrvRM|ros\4nFC=cFjfVGah9dN329I$g Q it TZ힕(Vی\`=hO =+?qA)Zxp5v+νjt|̧/T=sHX=;T<R)ӂ/۽ԩ! njZV~`!1^?6h=3^qv<0SntB|<+usһ?xeiTǭ} 5@>S3l> u{Oi.oHW+juN+X[VtG7_'bB\\1^o/i^ 1)ߩ\[}Džs5oح  -r-n۾:ֺOST!6# 4x0H}% !-#)-9_>[s." Gdھ%.{I#6?33WG9n,"&͸%&׵YEV0pq])*RRvf\k$7s_vzr\xKg8\'p*k&G999_߲Vt˽CY6Z)>ShIrgI=Y_'>#i|72lo`p?|C s|y%u_qxryVC¿( P 5oX}.[)NTUkgV/{8*pxV{l_ѬFcqrXdԙf1pޢ S-ZK8r:xLG-2k|Ue{u#8̈1c}-"x k/~"xм!o_Ö=|o'.rA"vRtGj0})mަMGG5%,`+tOD3BWեH<|Wֺo<%v?gXO$Qywѡϩ4.7m35\*"Oߴ5|i:-d@Z@?#%}hCxh1_1x- _ּϪ>Z{rw\݂ќ7Ҽ ulDjt>BsYOo|EqbF%G|&\ ??"(slj-c-Oʾn3{bzcz[OW 0}v0#{cfMC]|Gı$Rþ}2Ls]w縸ŐqS|R*+eOGCO0/r&PJq"p8Ep@BX0VH ?+|ūxB%BqLOG_ue[k?1X\QmME0q4bN[2)A'GMyy9ޞy0*^-ey}b+~!i3rGv1_Yˑ_J~o%-eVaBYOUM8;efxΣs&Z?Ckc8&yx/|gh0E\vsҪ "$*j_ռwY0#'rI~aׁaԷmkR'inbֳ(mQ ظ qQJsJҎ.ZByrN:K)8z- ei-#HBrh"G֤Hwڴ WXvYT\`hpVY'Xwz\ڻE?ːF;=H6n$T* ^ {RIgHͣ6Ś;׎eQ|փ@2%- 2};CGB#1ZaYGNƾIힿ8?2*߽{#HWccxZ2fsVbOLW_o ͪ\ WR/"'ܽ9;+W3??|Yco8)CXn}!|˰W0D:$k/|?GWdԮE8%`?/־6s syN iS]RRQ]O:.'dNjjN \jJ+ɬ6㯡&ۖ ۜ5Œ\cj"yN= #52úJ},aV˾R͞礉 ~TVs ǒ?) 9s0 *R_p>J;LMt[PE$7HAkvi&cʼn96vӄ^¢BQM-n CL䎝,2:I'\U`: bXrzUmGr{P- $>_O~|beVJ:@ TV$=A^;z[HElZgE=i7wWcf7 [7u' _OsN۹W-JIsH.z{GN'}^wF@~9W^.͛$D56rlV'c&7CҎjkw:;z.~R3%v6J /U14j[{W@YpdVOhC#Ҍ.&h W8*=kC!pGN}ӘV1[5b3d#AS9Zh##c,{I9(krőq)s0<%}zSK`E5wqݳ^ H`@ӉCHZ@r6 5 %W,2TM!m2JOs!8^v8]ӄڗI8c Ϯx!lcI$1F@j Ib)ZX1 v֯:gʱ#n@Kv;4R7m#]z t/\9Ʋ~=+HP觩$z|[~nsҏFc!^*2{ԺeC:s婽s` uk&Wvs]ݔq,rk-&\G5er\Nv-;\u8 `{ғMp(~qڲX82Zἲz'TsZpstJ~S=+ &rW!F܁4>Ir(J䁁5ގV5cނ9Q#|vFU$)8 >c;nޕjX]T݊&,|rH;FKI۰'&6u(:)Q_f ucyi bl +]YM"DSbv|4-/::7"xKFq>53_Hl0q/xa{!H9`t-.0N<7ƺBM oN >TmQJlYUv]|xc!vyΠ^sL#q$Z5Ss5'ٵy2b:kic˛$k^Y q7 }:Q- sosIYc-q&tN!GU`:[(ΙZ_o uJOIa@ǽ]pR?WOHۖ<\_S;C.~?K~Z-|iUK9q\y c+Xͣ"u*>a؎)eQ3Wndy1޳$ q!̒o@=@f1gS:Fp=3pG"mF qzWymAcnȤZ# #d3H#̹=zɚ@;N+"p'[f`ۀ e7dkqc#lЂ Ea™Ithw'q,:i%G#QYH޵7u{TQ@^hċ}.S/^ I9lFcGr1l߁8;cq|d/-#pXsz&1hMȧ0*F ڹ"hT|zkYK`p+2Zi*ۍ$2r5NTrx+vVf Tb{M1.rs+˓A^qY u?JAv|#kKKTquYO^Em`~aW%˗H^6xt'Ky5>cX1Y0`qJh A$ja|`sL*cr󊣨 LM*9 lcm$B' kv|r- $ ?&CÀ{Ocٷ)ӫt]I^lĭ"|n$4q4Ȩl8<ql6SFuҘsu.YۗCs]:Vfw)?xc+`9knD"I{n ݫbx]6 [YXH[+w=+KЈo]57Y%̘ Zi Ncg+8Y"~ {A |s2+G=Z2Hg]ƻ+{Q@,?o^[mM:wg:EsP}<נMԓ+C`OW ^'%iv%W0x~i#V銇O-sd@*O? MQ蚉3˅>icGNr^x?*ʩеC:f>R=N=,m[ipX$Bݍoqj:}+^Lkmw meʃOpXMZJDlG"Xd{U$Tرvb5tD2O;A\LH һYXm#1ua>.w4s#ڴNm-lv;Vi10,4Scd(?((|1~F)8R cb,[.dtVS^0?s׵h> sVS.EؠiJ: ĆX} jݖ]0Ê璱K[1Bn5[3n'GK=)Pç(byӓG\U[/ j#6JAɐp;=$:K]>Y+߀}{^m0Bpeg=ykdt):)iEzȭ"v[HL{UkH O}2}}zV$&:UMƊФmʟq$+b =ɸWP}j6Hn%l)Wxs,n*)'/yԗ*Q>hu uEtA$q&h%Y`~CUU39689[h$wOoo q Z m!ST̆ qvRJZFFd^sMuF*T-j&Q!t⇨iןj\5|l 'H4RFN:zڛ^GF /BG"0O\՝=B UnrE]$ yk=FҶ]`*GPcV }#,yTauχb dUՉws9Rqɢ+ .+U2Lb?*hr ` (<"@c<p:zE[ Cp A(D53y[6QXH'xmU7b2xPV[!9$sE=dw v_i;spU}h#neu( QE) HcqXڤF5qSE1%k&$<`zn )Ns(FlԊy/Ϙ($Ec#Hnt-z CcJ( b<(zӳk"mv [h8YhJ+,gQ\Nfotocx/images/soft-focus2.jpg0000664000175000017500000003417115247006660015157 0ustar micomicoJFIFExifMM*JR(iZ0232,0100fotocx-25.1: Rescale: width:333 height:159| Ghttp://ns.adobe.com/xap/1.0/ 8 239 500 1 2 2 C     C   M" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?!T#ggRTɷ<݉^C{c`;wd+#ɌYH 8Eg`<5NbA`)RH\1cDGsukݾ^جsvW=CVHrGn%B= f^ Qf[ n\f*ִmP%Nm)'Y"8 (;cÝppY$:R45NJm63 fjuڬ2={ lrۉé3"͌$p"H=_Akm 9G\Tᔱ,R4瓀B^\lPn>D7Zc޳.en}]}Tyx` jyT_@bg ASV=qT [Zo.=@_垜]Fxd;Go{D$i;=w{{|Ls^A/֤b 'N44[Opٖ_1C.+ޡSqs^}k7yHҐ2Ƿn.Prk4NzN!Rw砭m)nX \yc{QvG'c-&s v#Z8TNt1 .ѵsM|믢N\718S牠բfރڹJڝq^lY9YӜpAcR$Usbk4_bI7BLvG4-zߵUk9wU;[|]P<d/ýa_C̫;EpS[X?w9‰4U2(K/W o!IUZr=eIpǧ4J /#P9+'#dj˺p~᷽7P@T~Lvnly<@Ve֠6x&{JYm^q[]V}FΕnzar$y׊_q+1cku91(qKs3"6 FtǙ4}WRR˙$_95>3%) ;k㱻O,M>VXO*NJ'M=zK[+$g wF}+|/(BҀ+Nsp;-vK{-6gWu$j/8ZD@C5m{ zEd~*)~ZZo`$J2 TݼuE+r\ȍ֩E %>PxX1v= gk82pk)J3ľ%m&2rI5 cwEoAUm)Aqxω.'.4GSSI%騫c^mP3qVmoX)Ojmϔ οd4叮kB uzſB:cكHY_j:q?hc. n,޿՟4ePq^Oz[d;U msPyU$#PTԼ#rc<^5cz˽ã|f 1^$!myn}A1"?85]$z_xl + ݱ]pD͇Zf0q^_WR-{c^aGfTʝ9F̷$br1==>B]۲yFQN3{qZX筱dY1Xu=^?_W~@&*| Hr"1QXu|Tz*]ɪsb+* S^Kw5 oQ=fHcMCq8l0yǍˋBGY9Pf3_V=p:Wxuݔ]2z_nd

    'l$־C69FM3׾d,<רx7[P.QZo0K#k<+ ß,#9#趹 pzvBf:{[ ֹVH_~VT[.8^b'&e&ogs#s WG6 ;y[l:(^ *Hn ma̙@;8STh>m6 mǶwJ };nw\0 þMeHB| H[k;sSPTNkD פj S\(i;qɫs}G$Pl󻨭oG>ݢ uu=z\S1'Tv]Z2,j3+8ZG3ARGQXS,W<0OJS'8ӵЏ_)舫l|]?|4 Uo|e.::?"_Q6.G7-ǖ湭GW[iHʚ~WW Fׄݏ2mk^d9ݵc[[ȝHOzR34@ ؓDU΄"9PL t'f.J {̺Ԟ$ʎ 57"01֥vqj}ꜞ$Xr 0f\ӯm# ^k瘾 BlOpzV.3 j=jK;^\CD0Aj'-ܸ2PkK 852m7l [OɭheoN2q V&ƞkBTl>>.j,aq]nPT5M k;IjytTU]d Y&*; :[&2IXHum ؂7/j4;H9+KœKCϰ{r)yz)?+ h|k5xxSޥy\r㎽ڠW$53?H}:&V.IrXYMe?H'#ew=}*۝J 4 uUwmc3 ;y +Zpx^ {N&F8<խgAc埞RQJ6p&C4^kMcG/DLDf^^0i}0HRŽyDKB\VdAdċNxWVb^#{AL ۥn~a2D:~sU +W»Ue'9U)IF>??U7y4Y(i ˏ*9)-Ysx-N+<m^!98ypzyI݃MFy~RkĶڭoXnŞYS{P̒1׏Z7 $[F$0~kyhܴD[?i^hM|yRk4:3t:$YgZ֕ςt"k.=+Z5m[ x gq.!2t*R#x+Y)&1S7ǝVTfۅ$ZsEAr6T2*J]e]Чӟ6QZznE<֌VLByd{WjB+h%*V]猅#t+j *c:ׄj\Cn9ϥvVzh.#s8jt65#1)w1fn3zTV*3Z8ڜcc'+#p;{;İJ=ڭ&oCw4kTy1ǭyvswdxИ-L*6Ϫ|W  v)VR@ܻ}zGȸ~ 1m$ٯCGcjEcj훉G!I=H{KM2q)\NKd舥v=l-Gp_ ~*x_J&;W8bZƻ3I#l$|WU?P@an2ǿZb#vyx%=񆹤=lgv|ڮp+kn8M6t֐D NI+ĞfxB߳#BQ>SZw>k&P}ARjj3ip0WksUGĆx#mMYnUH!_9t m#$W [GCڣ齃:Jy#q\Ƣ$b׆(J50\JHٮ:-?ۜ )<ϥqm 0P [Sg3RfOyn#vc;)4 ڡ`W֧R![Z4YuutC9WvKh_ n9=+<<gҷ9+6x~˱Ltӊ~{hߥzMrNI`MVʹؠn&qMWLZʑN!Cǿxƿ[ZҭǪ#X>\fQd=}̗k\_JtXXOso1SK-%1c^͌"2DeQ{K:niy2Y^MoHM"rAßŊmn`7twZoqtyd'[#' W\|"6r_S\F27e5Qy]}USVH5k|)z7%+9~5-ںh =R62~G3XMuG3]L \$qXZ+5U2ZTWk͞oG<&+ϫZ=:TT:OhF'xzEu?kѦdw5VBp vRgv99 *ļcj V df}`EuŜHm$1Y0d2ZLjuPS[?{+k\_O/涬@Z{v).kԡގ13K? }M=)e oqM[R{朕=?z9+v8 K{]1Zsv_ eoYlnzNdxx_jh@w.HZ.#F=g 7 B%\TKA<9Y#qnG8r7<mz澑ѡ(*clY۞C;ax,k|)eX*|-7 6% fAKc$ <50&+4'Cì~"Į;Z1B 6=FGJ4M˔ŒsXz"ksՂdy{xorЦ5b`ͧoV25-9[=b0Tv5ꑋtuV#sMb(J2zbr&#wqUo "="Eryt} +5^ҭc˜ydžAlcƿЮrk#6qj|TRQZ\+[J70q'Ӛ/?g> \S1MM%=1Qοh| ݻq˜*ŷ¥ {DŊR>1Tf4g픙x:!&UF0WhA2sϵfI`9Vz-62P!NAwRAFu-WDbm5j,|93WpF@ZDmPРqԣs*㊯mW2ջNq+,iI@HmqOwoʃ޽S:r;T0ZMUDIq{ԥا`&{VΟ%w<'dtۤ,&B2`g' kCҊ0D_sWWb"Ě4F~N*8+'^6p"* ԭn#UޕN=AZPzJ'`#z p(c@-I ;[۠rQ{2epiyTITovc$_ްuw8ql?9{7#btA4`D¨#=2"`0EnXI7w}^ۏl8p+FX1\6(Ul75j@m,ަޣ9nhFhN1aތ*dcs[b~N܂tc͓}i6nX W?`"5U{݊Q:OO3|zڣ*ǽnjMs>r=x3ӱhG]&рv3W%\pʾϡ8tPwqڷm\(Ͻseʴj99mC~ϥt#ǫKd<`1y9U qYN+x$x#XU\}i3DXO42`܎xYx5 eNXQ;3CQaD8z.S ?Sz놆Q(ϵq:W ;W[]m\gOJ͝V8] 3\n6>`w tW1c\^qG'ַGdN^ʯ1F B}iovG.yV ;>hJk|Cf@lWkђO#+|E~2Gysڣ48720ly{lckkVf,0T֧e!_szFk)"tCuztB\pe,1H+bZ.%hMAva> ht˒[V'Wo;F`bXHpqUyw S̸ZθwA5/B\Uʗ`TLCcX fZ2Hknd X05{!1ԟxfw6FwI 5Kqto,"jb9c"{Rh@]0F(=fƻ]( p~仹}/Y|ߘ[?j'^? Yl'#e~b W<2o~#VYOW'Wu_WR8ݩR}.] 3bW[?{lY\{AҤ+ݶu\n&RI 5P_CʫMT9CccprZݶ|J ޺bq̊iY4v[f@ûUVRrqV5 ntsڡrk&tڽ/C/[ pxReHTkvO9GmkU\qZ|]>!0Gjfy&|{DpKR'kڥhG#jrbž6xfotocx/images/custom.png0000664000175000017500000000747715247006660014334 0ustar micomicoPNG  IHDR@@iqiTXtXML:com.adobe.xmp 1 2 3 0 0 128 128 1 0 IΣxeXIfMM*JR(iZHH02310100fotoxx-22.0;Crop: width:256 height:256|fotoxx-22.0;paste area|fotoxx-22.0;Paint Transp|fotoxx-22.0;Paint Image|fotoxx-22.0;Resize: width:128 height:128|fotocx-25.1: Paint Image|fotocx-25.1: Rescale: width:64 height:64|#iO IDATx[l3k2~X]B!U1v1C 1QR#$%% *ʁ\VHD)؎A"AuD5ֻ4(2M`-av333Ejs||>b!vf'`;0vK~?xq?,D CWmr&;`UV e ~,ˈs#e:;rb7dE@ccVUa (((ʌ3::J(M?n"% S__OEE5s=u >穧-9&  m6{Q~?>oӂ ֕eY$ 7Y',O%r:,smxO=2y3 jhh]REA2*v^WѶmIۂ PXXHUU(rr_Z۷#GSV'//ϑNaSRY!//MI%`ٽ{>_~֊3\AK`^v4@ 0ฒ5J @f>B]%֬YrEEi駟%HdL$HtB$I C$[$͗$ 逅SXX6Ws19Ul2\8 HPԖ@&>X]]mU֭9ŷx.Dݖt7SКdN믿& ]^& knm߲]?$BIצZ4/ .\Юj"j5ߖ~/q| xX^ve˖ŬTc8odl,.iw_R^\YL [5̍psމɁhOuur011ᤱHVI KV^Ԉȼyy<į_XMʻ֠o|>eeeXqq1k׮I{8'| ?AGaf^ oUje7O[H6*\bNL-WCdw?(xҥKMٲ92XCC(lFI)!H?u3 ؅8Mnc Nȑ*& $[@+ɍOA\9T^gpp<ˡelBB%юrnO7&urR< c Y?sݩ~%DyvuA; vH$' 7J$#i%1I$.gs^X,oJ>u$I肄P* i ߻;]NsYtttp8[pi*% gU?8o͂V^?$H*]\o׬$萫WSARq7oޤ%K8t7uU Gf hnL4\r M]L\93ZtBC45mOF޸/֯_G^^mC.HPOπ!O%`pp`0}-X* zHmߺmm<̳;݌`^{+W鄹#"B@΃.}s:eٌ(}}TU=Ȃ l#]0J*ʿQ^h4'\fŊ)--抄8صkOz~JKKYh^ruiQ͛uL($;wD"eKL`TwE+W!eee,Yc(iQ^]FeE(α0?0>T"¨|WWW5*tc,ZhFH0sxNS&`xx{OEEŴ9Gqeϟ'|kn:ҎqcgϞsO- vѼdIENDB`fotocx/images/sharpen.png0000664000175000017500000017060615247006660014455 0ustar micomicoPNG  IHDR+?tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 482 332 1 0 6SleXIfMM*V^(1fixHHgnome-screenshot02320100fotocx-24.60: Crop: width:332 height:482|fotocx-24.60: Sharpen: median diff 2 15 15|fotocx-24.60: paste area|fotocx-24.60: paste area|fotocx-26.6: Rescale: width:299 height:434| IDATxXUY{ޯ좻nngDPS:3A#8ٞ>kwk3g<"55D@Y H=6>>mʖz) +V .LExx8{FTTTCKTttlղR}zI({'(""B6,^hɰaUZ_!i|sqC)?+[WdddhZ % N៕+.La7UTx\9{Bbbeh}Y@% "gP*IPK__N)9SC 89,l9m+X2~UDžҾ)U*WS/C?k`U.mHUa*H>$i姖-ASZ0s%]_2AXEg Z6kQQ+L8BP~(]A%{Y)XQ44-+Ho@眓 _~='CN~$ [N~$J|X b;;>.-sQbE Y5j?e-E'WB(ۇۢi@asLHQ o8)깢)9oܸ=p\s,[7[te9ͻ`K\Ȫe?hK2>Vzf׮ ҕK'[|\,OpN><Ν-'w"X{q/W9yW\v/OWyqy(Y4`?n\rP]T{@\|~\3~߹._H/% [Fa 9cT6HkԨգYfyMk$(ڕ I₭-cǎv+At=ƌݻwpχڕ o Vaާ^51v=NĊ6&'';HQjV::z6lL& 155CϤ:=MS1f̾T*_QR%4u cׁ GD#}]T?D/+&B_W =] eYץװ FL\r 򐥳bkc&ں[b8Ox7G_G C}=e~:li`EI+]>w 3iQQCK`|a%MbdՀ*;"#oq YJ&r+, Gl3zhfmO =bBXXc8<nkpXS\F,܋뉲=~""y|u'5@Kܣ<{7e؀ҿI6OYS9ߥ[XOѬ$-}1m2gerذa/_#G*&iWeX}sJ$>6 9m%GukhNǡxk`WУi&1]Ԡ}Ħ='#-{WeF ̈ݯ`U?raiHn(B +uu-l[('11K--s"8]kuMÐ#1|4RL/5@;Xihs"%~)ڠA'/>#ya龦fUaS`U\'f͢sL8.]0c .kV >$9'ImriS]TLmV9JZ;vv3ao/(mJhbcUSΜ ƫnV :gTZ~%mmciiE]F4oޜ * ׽iNLu٩] p݋uG۶mvSA)**?P>zѣGcnnի5k`ff԰$j=mL5o ` 8(Ǚbc^:5m.nGy+YI[r` )9Vxzr:f<8PxEV`ǩld1K9vb_u& _x~w] )(RB+9;L׺D@i`:;;{}@E] @`%-~z 'e'NNNԪU ɐ/%K9FwWW?7?@˰`;+0c.ldtnn5Zr㱰~P]n XDeN訩F}rzbZXIGfo[79a jbdцB6_zѣ#=UlaMvxoexfbPF\GDf/Ԭߔq 7rm?ȸ}ÕxԄ@X\@iw{*;M~(Oٜ)ٷSБ_}$> .5K%)l-T7ҡO?Rr%V*BbdnE ]BjbRض﮴YŅ81{cS+Q DܠYM34Մ\Cl"DWWOhdT˙'~=aehs .a*B+MjծKݺCKlKlh#n?,|®vu dL.BX3BR[}@켏 IVw5 ;…fQA%KАV+4L vJu E1甝]}juiUR21X= <|0Ľo?惧~+.6ѪUkFOg؂pųѺU+z HPp!6a޹|Xh7ٽ;}zȯW~7{Ax3We^S#͙jiм@f-]C0x$K;!!Gwd$ GwQ^wQ~5ŞƼ+k҂%< $יG(S}ޗ_W`W>RAe- iIpUN21XΪMFKbKФJL Hd؞6H_ҠW^R=?R6K+ $J?. /(Eo1}|\]SL9۶Fu+GGA9/EE1lR>8 @~r"YeA+9IrS Ca n=|S+CI`"I($I헦fRR9RyR9ZT hH:JmTۜSt^0ma%JUpٚ40%0HtH%m0sP*'?7?6紻(ma%J,BdXɂZ*Ϟ߾O +V a% jTYs5?2dXɰeT?XJwQ@YJ H|82Sqdeɀħ?ge"r2 @IV2凕,BdXɂZ*?}yT +V a% jTYsKIcV2dX2P*d@,BPKS_ߗdXɰa%@V A5O\##n <~Hi辇 +Y?M~+&JFdmDR!2dA-w҆2Rx%D%-"H2}F@fB_jREj +V-_J8>=rX ":UVq^sp'<ytFǒy})W=K<oLKS||Dd ;>OBm&Ư̈̀8S43yZ^k okCi MT 7Ǡۯ .^ʔϿdђ;}K'D9OWcɣH:* ri-)-Nk3ꀧeejV9襔`\<=ٹcwuBȬP_OΝ;9z ׎3W}/YKpZvwo62ď3GAJ&9>J`\2]zJ.8ve=)r7=;ӦB}sw7k q)_._ *W)=9VfhBNء ֠YA\{GByNVF|tC'N.S_4PCXY˱R_؊:LXwSQ,VvR&/DzsLt&<"HJ"cU΀&`k&2ܻ(>e%epC ZР)SK}{n_Tq_>}N;^+ub_56ú#Iz%WO6 ;dƭ=˦m=Hti}s%9--|]/ҳg!97ęz`jjYujխO!cXzVW~Lc.TYרw |ɮ66"*)YeT;j֭cm\'K~e)p 렫F& )ǷĦ!G.ҵUctu1wwOL) ;ieCeY&V_(f lNfM4jT7CW߄G{TM+ZFutĒ ~]Opl15?y]ozL\2ɳ`nbm{LhbzB;gHSJBÛadYDILfP&z'do(- ~e.!E3|S 7 LgvT0྘O}4cv) LjI->ISD%}BEgo5Ŧ?}&lIX׾~JBj�fT3bCZwO\%򗀕LD?^}z4=[aҸ'>!IƟcP%B=:IVU Ts?B[3ABELOoCͰA iӶ%Fڔӯ ҅fo-y`ueD.JPJ|ŦU㨬msWkӳxJ!ݞYHԹ1ml,VBSM=Wnxœѽ6Գm@ͩniL9mK.: M {JM]g~ R3ӒӎjhW_'̾4TTNx,u,Ej4wHb?eGa#h!zy{J` zuDХ;SOe~۸DKQ}u6 ulيg)818B'g1oZnEfhݦ,#4ڂ`k\alNtimKurTEVҾ.> \|_Vs7Y( jI USk<կlѵ0~vMrD! bi ߇m찴E -2ʛϽtl`7^ЂYhaZ9ۏ扯P̓urLլ5lԂ{`L VUq8$I IM/2ؼj4M8prz* %Ǣd4 k ۆTX5-j3"5y{GO}IL i;EBl,G-icI>qy+776jjtܝ}&yHfQ>X1j{ Y‰Ͻ+*cRIMgad7 cTi*]JA)03ӓ `>hjwBW V QW"5̸,AV*Hi]Us<>u{ IDAT͓ r⾰e)3Y>;ZVM8s-i*-# y\ِJe]rK!IД8KJ\ۗNP,0;x4Y>5aΪiiˆNvV& JRsalʕŪ^2n3~@{*1w"-+[eMa,ι7vDh`%QhfᾷX0o!{厳3o0yH'a+S!W^dx`4 ͸ͽ46aAR'԰`zYӗq=9CލIûaaS[s]IIN*4D~\>41)cBKϘVѮ][6E_C#\,K;ϧt))rw~+uĪa[*N 'ci15jĶ^M1j1iZ1ؤʙ]jzF\o 6۩gAybӞ(OU032nmӂcafDYy{*G1XDo += fm͚R~]v]a⑻ OiaEb}T wrWLز\fU*^d`x5lh'֢)_M3 M34 lPƆ8 D7D~L$:1z`g͘j+a2re&saUh|f"kVW/_ҹJ#waNIN™uuf+o\OpH𺇫]ߐ, OI`r'=%wqr򺅃mG#.[xy|܈͓O8]D>!JC$IqssVQw#{HJ7Qpjt9)''+5u? xr| z  >ݕuNȽVH#cc+q/\b}\J׳8DMy~vT͝H]#.=Z",<gqc?RyOifu!)8~xGEsQjMlZٻs7sg9?8PKW\0s2U5۽f}\ qo%$8?=BCHU VKڷtZv?UnWn&^+TwUSX&^IrRu=h@Y.omVevV{)J /,%_dXɰa-@V A5Oܮ2sPu{J[ە.c# UV2dXR$px+Đe;uE\h@<:mP~ѩ=-4EF0GE*me@V*͈k/ܫ{+Enނ}3zF~]5Yyjg?_p>,>LdTr--Y:7$+DceW0,V/39QOD@<0ys]!<hfTI3Хe=*աɠYdr~eWEӬsΦ%Xk]W2J6 A;oML6]mDFM:ʗp 4{P *g&ى,k+WnNwѝE fhAU ]n UӅ}{=/]KXBUQ.',>UTBCLj!*;e~~Tu5LA?BW LaJ|&wDfWv͛7~N&W{0GxaXsS {0oDDσia^6Sc<2dX}Π)k3Sصfj:9|Gh$ QLt 8t5. 0h e) OavmY.^@Nk<`\;2?mlٻkи)z6Mk1?9+iWY8sl`{{ݏhun%.¿q)#KwˈcH'9y?A~ {\-^oUQ65pUGP`H_}'[P9Sy?Yo2dX}#ѮHR2k#*j >qiJa"ȶV4?w^83vpymld/ٻ~6UEDќj5x.OQX{N+ TҲ>v"ZDQimP3wKv mkh*4ڮL σk]5zD\2j+C넎\80X?2d Krw5)[]3{C4U5Û(J:3S3q@+J+vKR<wU~3֑kS SO*Wt~WSɚUqP9O|~ *-t0Uѓ'3lpqժ 9 ۅt?Z1AӼ!I0gLytbU-b9oEDeU-?V+5j%4JѿG~[ vSpR5#TCG UEn5z\L2*qOq04fS8B㯃]Fj"L m.cb %00XViXH{İVt=beNORi)cX:I!2΁-˄#ŪJ*y:G׎l 7/rVzme=_sRN+0l&6Wޣ~7,97T0-jCR>7bgˀei 5}s=p&OrMJQePvZp?y.0/Q9nm2 j4Z:jQ,D&1`d˓Ga%êOciWK=zs{=RcT 'ȈvF$XM@1*]+!YsK~ĪÅ]=}ZY(>2BEnTSעF:4hԘ"n-YE軭 zף㽋mK;oA٫Bp hDDg+cԴt161cyB(_vm\φcR[ ]%dlNz0CЩP &#Iy_EF kSstǘ='ULsH!O S`%08\ϪYAXYdpK!BEF͖*b%6!>w~Z:퍯!uJ>Lx2 <,@?bY?1<>LK#D yP =%49Dw#n#COτNT._ŋbUg\v 8߽ǽ؜k.<nir]޴ ]z͛pvk ՇyƆe\ 톳,]^H)UBCCe" ;QpBw')`Ըgx%K_0RѶ׭蹣̝9 &d:|"xOGV.;Xn'Mdy& yu\&NI&|9gLhNX1e4=Gt\Mccd݈>['0}<.8 t4qΚ!8SaaBr"(R0) 㒘0BA76IRr%lO.}Ls*V~lY_}py _^f%kV4@0V R vi"[݋oV:M2pLgj0l/$)U)qbbRÚ|:֭یq4U zLm133D%$NM0^Sf0~Z6mL1sPjפVT~ػLߡ#9/֖hGOГB>5,0CAЪ&f XC+#=2wcn!maܑF5 ?VvRp(2eXɰ*Uj3G\ S_sjlMQv0B15㞐<6i8dWz5fNPHA^\0Qˬ80Ht.a&Q_ ,:Hh0*|d$G #&n \= V_A"H [CSLj5☳p6;-`$+Grz-1bҚm<.b¹vj-F*b۹giVa%!* Lɬczr猀~B@"GǼ"lz^KZƌvجW"IiI|? VL2E?7aWZVʕ+gbŢ-ILzŊa2c`wT4cʘ)[" Se\x>O<&%%ep< Z6|bt -i +ydAi֟<.k1@6$}LE BV'aa;yw/iaK_EJѳe'Y,*`%wXX)5BfuVhVkV ffRw 񑾌le^oML[n@ }mV2DJ߃$3#zPrS7OѪ.×%,}`ǍQ7O2ؚٝi0m!e(@Mͦ9xW!2" '*7y'o0#ټg 8~!4!pC+E@\52Ŵvc;y(头YiTWYoʝX16b$,غWJEf vQK:nlGsRH7ػca> \ pW&(:} vm]Mu"6}֦P.̌$mcyŽ7~*f%kV:g`,M9gw50ۓseb\N[\`΂8(޿%s9qˑD]RGnYd{5Ie3Yib/.)W-cƴSD%;7}k<:z9=W {&IنtaY͟=SYi٨*3# V=b#&YyaկM:wrVnڊo̧o }O2- jW+Fz װIژVY RCYd(q2 )V: 2Wɀl^W  _V2dX2P*d@,BPej<սa%J,BdXɂZ*zzkDrN<"Ȧ +Vy[Ho^'$(T_ף<)JUo=y\R!2dA-i r{"(J "q#&'WeJ3В⢉&CzIqEU ⸙rEZ>L 0?[ΑĴԳ0P%w W҅ci oo^罻xꆳOCxMx\oM\tq wO/o~˓^L&s/sIȡdȖjA02ԥr5OxlBlczJ<DzQ+R[ UR|:5F[Kc] ttX4n-1ɘ1֦nZXXǴnG^qzrd`vhS^Lܶ+ݽD+2qwsᣇ##ByKC.ZLIwWܾM fP[q}`N+zׯeժU>xT}F-;Ż7_OS+lEdjfu| We %Ćspt, d@ZsXsSv1.8?^|Gr#&J5JHI~9ʗӣSD.MðLe:."]Է1j*TT 5 - 1hW-˿ZJUFn(B3 *2JG*P7ÃLi`) ՐҙߎJz*QrjٰJuH &=@#_ ]w vMDe5]</W*MsgQ>8FFL/` _5PjVw^(9i?4eq̄Ve{ׇkzQ[ƀދB$T/W&cٍc"Yjצ]Eg|W繭7çۗi)mNaPr`ߞv혵b=m[ZA zϾC:Wa<PilAE񄟼XV, ԩ۲+cx9.n 8fyf$AH!ԡ?#:. TUDfOwRDQYO"r`)r:J}kC4cl&2fl\u;MhX3k:AvBB lQ3fښ=m1\ؿ*t6xaxHX!<|\ N&Wק+Nw\ c9y2nlY9VHV7*|{ ̛9V%ꟑÞ]kx$KuLvjt>׮_ٳuJ1{-OZFtfk"V'r+VA iVqPW FmTW?O/IJ84WBS>ƹWd¶v&`J3$Q:ؚ2nEbS(Y?&uKXaL(rp>7b{Zc|?35B{=Tւũ<>f_czͅ!ޖ_џUa\l {pWp3s|_kmwM=R^&%s1lXeLSLœO-{#Q<|o˾t] j+g'KvWC*#5?ۉ2V"WQ lK_N|Zf&GuFW┻kίX> \+Ͻ^ EDB%D;ڝF D%E9;޹!ݎ=sv9kW8ג4E r|?Sv&Ô~[D)60ӖżS.bY~5),fK&CС٘^!P, w?f^֘>U#1:BRj-AN P]^=1}d栌Lׯi&5_WW4VnEmgYR3 iPñ{׷;c ,Bn?va, OYKH1bB?B;Xkoksz;Ga #nP& d xYZ AL/>BFv<0PM  D&*H Z Hh6@vn615a!łPA+=bA!C1~XDW %Ш]IM!BpqfVi*+`ůJa~2 x2!srXwyQWѽ[O,x=VU鞘:\!-}_VIs;pEis$4ȯQ+D3yzDXC9rD"Ny6f^( Jv(/ic<&Y`R8 )1m$ u;#LW?AwWAlk yEe^'}$|LmML VEذdVl؂ԿkU%سn!X'8u9"Ac_:3,Hq=,7=Rqg0axL4keAØ~f~fLKppn_'#&qW1oRf_slb+6Z7QPR~=Wb 7n?cjmksH |_ZfXv-/_#Gb"7Çj{݃6|h`ihԟXL&}\^&kb0`\ Z|ƦVϿ0X˓a1P=q=DӴl*lnb_trgaen,M4 At/ŞwI|^H/F#'!VKhF}T4*EJ˭ˤ(USM`6=0LE;SФ0C)Pԇ "ﰪ,!rUQ;ztؕ2?.I{QFK}-ȟB49?AWÂ`%bI%[=tyWKۣ9X}/xelL\iu|^^ CMt.fubHt&M1-Fyxp8%Ek)Е# fN/e[{O9]oX990U ƒ%uzaͥ( ?gc , ͉tHU)Yf#(|dD>)ư%;ZMx$h()8up8sQY}|r' F Ng(Q ? 6ѬЌ& fO{--zoa4K./?z)'< y)`r5NWwc!) [gxI08  c9[ <*%M>5Aꪵ[@Sqx`xr -`Aׅ$;KSGcP3hD`&CGFj*l\SA[G%De+QJ6PE -+IZԁc`=9CoJ$gÈSqnP4k(l`V5%.telaBl=ޙ~Qu}8~_,ׄw4l;[+kaǦ]m]j]ܜl`p>+Nڅ p]*%\Zҗ'+V TVi 86055e7g0a|x MދWQRZӳڵR̈́oF/~EYk /X  spb,Xu&o$uyMA>Xx͟;ܴ?:u-۱| ̛;w)5846wn'6X谉>ڐVCZ94=h2GM*e>oV߾?6:jA[] c 8&%|V T#p}׹^%EQuRr|ldO˧2qge/ )r3Y۫&0+gk 0Q^&%cV0et2&xV24,%W{,=˫K.ǁy&^׉ib(y^*{>{)@xC2s^8XZjfeii [s)P,PRJg4Y}s8931_QkǼOkF_=0 2BYX-ܾ JAV B];CJEwi5ϢeAQC",;o$uvZ:?e&UQrB;P)m2ֹF/DUj[|\ mp7Ju,廎Q)Qسf&DEЕ0 FL VW%P1DL^GTqezYE*ӵ~v-S&^rS}`|-Lϰ{J?( ^ U#hDtvsz?dEHRNiC^:0-i,2bJXs؊@XZoyej˜ًq6X؁had$*5cxz1ކGĤʦr\-P07R5=(-/ ^;r¤Efk7B22eBh:4ZXySI`HT %> vf&6U-q8Xq`h`(?kV^TlXf+ $6 (^;=GlnPdJ]Mmr)`ٌ8*}%baЋ5V`AT@ zY֕ڪD<ӧ4AbD?GkjHc(|DhnMʼnS'q1v;A3r=`EXGiwUԨX20^ 蚴opt!)n(%Ի a² ~gF>X |qE<Vb9MVwx&f QykrmڶhVvl' F~x* 0TktR2Qz uM27nތua͚5춚^{yiQr vӬ©sB3^f݇͘cxy</ IDATKF~ֹ f@TZ.pm(Wc_EnI9U[ѝʮͲ[{8w|;ea9Ҳ!db#=S#G*0Ku'L d}` ݩZ?YmZ1=S=8B{r`U@>XJ~>Vߨqۯ|]nmnގ¢vqHQy3nfBdD)dE{@E^*MQpJ,T-2ن9@R9 ^u5lKuԠ&`+acf˦@ZxO:ga͆.0qV[BZCl\J{}:T[JfUUglzr05PYH:I[ٗ*u  F~o>5+Vu?R ﯤ(9Yk%Χlc+/Gne 䕗 nSP+ʊYY|(g|l:sy%ȥS% (RL3w2s x9W]g NUl̽cӕ]sՇ/F~ G`]ªǽokmOk_L8XbԈ}ֺk^8Xq 'BXy2h*/׎67g'.;7kTq*8Я]nbv4h ý-'+VFPr)`'B8Xq.8Xq`@V_v9ʵ ' x`h,dƵ' dS8ײ=_.vP`'B8Xq.RVKi+Nڅ p]j{QLJVێ8Xqd੻ l]v^_x#<$%!sܯ(o O_Vё>ϟ*ٙ8 ENX*EnEE9=q,Z }WQ`ܹoe|Q#STܰAmu?uVKǶb֬Y30{Z OcK|Z!ϱo%s-9ɣݻv`b2ǧ~棧EKȮn p|{|6NâQ)9a6~(DzΠQIn:s8vXH؊߾ZwxpGWTZHV9؏  a+j|ܱ!CTNBs; [-gP$x /c6\~ PiU0?zsz-q(,R%#=%wOAn=ֵ!BLV-(HȤǷX'b?,nzbi).=5%g_:XM^τb6ʛ_Q[k!]/}CVap{ 7mb8[rs)=QM;ɺǺ9c!ֳG#X?꒘R  qҾ|ȽˍP"mܗA4Lq;>aLH| VUzzc߃ǸH %fMCl?VK{?G^ Cgn{\6**0d顏 cВǞGOYXc*&!^ubQ}VfP67 kOY,"կ^QRPshHc肝o%xhİoY FiT4觶'g#VV5[j#9xaw $EALT;!='<>޼~yXGZ,`&kUta=`κfjv"81~kxKNFod%%vh" Ia8 Cń#ѵKW iIZ%]Ő~rX}5BSUQS7Rbpp"@C 1Cѕ|3,w )Ka^3?/ǨF1ah쎞CPAj3t"-J̰@QV]EqST&D^F.ٌ!&3!C`1y uVУ*|X`iV_⪗HPPVÂu;p 89#*!,G-!ny *j+lkVK!}~yt4U0qj&%f*$͊F4F#b9iVj4+*~MX<kab!cb< Ҙ|\"5=eE$PFsUIQ`g`ql*s: pŢ;7YC(b,!9,1(`au`6t l=Cg0J_ ʆp M 7P9ɩi$ WfgVCDZVeP}VG 4rstYͪ[V+O۰hL;3gBbV_U~tuu]dT_BQO*_?4{_\ +GiN.[A4ZPAzƐVE@+ xwo*xa'$z`U%0Rcc&L p;* 1mZOrXz@gȞŐP5=wN͏>Yn1^eTH5g`"gi fhiRb;"R"qtBPˆi IS!v[н$A~q!;`(ctoGQMS~z,6N3@.Bk6>ԙ6@1E gͯ*~>.ߌ}dEd 61t"V^.A_8Lr )/#G]3IqdRu#᷎Bt# +r7hژ2x\|o LZ iH M *PXSs>zk"?1Aed< Jʒ1s*u nl?\$F<ǎec9h|pHu*awy?ĺA&r$b]o`p_);pi#bj%{a+.B5E?N(!303 6݈W)|4g4$eTp)xi VB9OI*MMal 3խ3M{oZEyc@&0&^ڭ׶TvdBCF ^\|<p];u$!غr:a`b1y Jw((ʋsds uCрaaIزA|oXU܏"sSCh`HJɽ`}H#$)>PVUV_5(khaHΪ yhՇPQV!??5It7#{ J*Z[Y=矽"p.gP0Sd4.?; E -NGP?F P Je'61e5YcC"uZU2d&wE`` ⓓF׍gMlD _RFF(EBE Cn`R& $7'&*IE݁HmxόCO1e# 1 YFܰM?_.`h P笠`F^bbĪ@nf B[y8cDTL] >&KF~#` ]+-cTR`$יn̲L F Cpl6W^0GhXr FƚؚUSa6hgM .\|Kh)(+)FAQ[[ҫUb ?iHMIƨY-J-;7ps2rh9%zZVÊ V\[eU?{+&1ffzZriu~%{˭4 FpaG~-`'B8Xq.==~[m+V ` jTNkZK{h_VL2nڀNq2P[U)P}o>hG05 (|6`@4}+pNڅ p]*k+V\_-[m6lٲ[n郢~_ >\qPJJPZN̥H+nX=mN*+c>luqG$?ĕ[:Ýk@rQyA~&THG~0i9tuuзo_bˑHʭӎ3a}t3L _V sWA'^DO.N1u eѱ|؞ۏ!&XW=5.M"2;FN?,Ѐ.,-[@T=4woQI߻! S0L+>#dV46*pvOk0txu`⩐ƚQPR~E lN,pw蘚sɣCNuMsuh' iNm_ Q8/> 0L4 _ׯrjŚ'q-/1ᆓ>c-4&c_`0et$¢g{կ^}߿ϖg *-:$>o(]UcJf QMɤvU#ee}1i. ԭ;n9$?L{& s!Tpg=p+JXR".6 !>Xͪ(+;fht3H BeMcpuZxSQa246K}ERXeaǒq]Woo>V()n9a`%C+^i>ί ]8'iyS'3+*Zm`%c0:S,F0ǝHz@/+ V̂oX/Iu _P0B">%,zJ@YE}zCHDGYRׯO`PT"G*yAim'&#?]; a]ua'7@Z{fU-ULyTcˊ WnGO4@?(+Nǁ ), ːzV;/= 5H*cC[<لfcĬ$>v}a*'-ҲrU xx>9#6%N}׏_sY{]Ǘ ƈ,W:);: R¶P6=; QqE{GZF_5Yu+UL57Nu b0T7d5 p&B#cPZ+BL^! KΝc#iwF#@EIOѬH[-#6X*o8{3ƍzTS|]aE8m {`5KJskVNt: 06pN:# !eġ5p,\X-( n`#(ix1Ԕea`6 xI\'T4a u9˰xBFu "XzҚ5++d4tF=ݾ8w,2SFq1;|0n0(**bMHnyi8y!8WW-&b?H}d%zt42+qli˳fʰqS1o޸A(b"=1kATUW!C 4a:q.޶G-p~ Ӈhl P|iDKæ͇+MC FZYܣdy1z<0ZSسr"+a [9E %UʒABRa Ѽwlo1Lgވ!sѫ[Fr:>+ ơ9aZR\'梏^񑟟br6'}T[!ҬQB8n&zpr3}#+NQyYʽQ\4$22xuqJ)# ؋5 2n6t)E (4YhҌᤍQTDܳ r=|*ĐϪ 7\՛p|(<r}d>|lVe8eJvCq q+QQpww#gOU>0ѬnnHډ<.GG9Xc\+ʛ~R"* SDܾPTǐ0ux3 rR$*xH*y kfbܘdF5A<ݰl`%scwH(`䩘9CD`c9O?F4&𥉉`^_H)cА!055*11UJ~,J Ick 7zr05eI8}:v Af=f ja_ 8#gC\_ ^EIvMol~ +~Ev. 5e2{5&ZOd5͓ (@-x]> ahV ̘`I-sDj'#&76? Eq_s,foEr,19"2q4yeE><]qdCܻ{vvvx'npp||bڕ q yA vw.rxB>V{_ /(-B+ܟ=GNI .Ypa=/1{{wеݢ(`= _7ǁH/*4"239^?5)Q쵹Gj@ rS/߃`e9b )<`:@0$dWԇ=''[->UQdzbՈNJAaQ9qvlȪ dnFHjyCu՟UUYLqatnbu..;h).A~6iVqtߟ ,/5[ 8 }ڭO~b\=}z.ê%Q)ê"t:Kļ1&u`벩Aڤsx4t|S]((ri]8X}bjЅB__hNB°K3k.06Y$t1iV+c!S S┕ڋ)G|!3)7=B"i/Ɛo6d&-.@ ")0Ӓ6.:̳0C7 cU :!Y/5L!|1ƪo02U;sEqg9&&~VE1?[ CNBpIklVkaՖZ8W㬬ϟf޷T dKJ;*yy{ =Arm3ݶC!/O4sZj(ٱMZe:{Y(E|/=45~?}!?jxtFb-GE~1a 6f,]3hH KBEYvSd)3#s!Η1v ^fV3~.71qP 0sB,5slB+= I.Za~8rOFɪp7x׳O58 Dw-r1_PFb XݶOJCRqQa;6Ԣ!{44.0۪? RZ?{Чvwe41Q(/+`?@3L(L6d}VUQ^B|vcc 3QFW<%gŬMe;?jϪ)|gNȸګ-d xmzV~):-;s2:`EaS@gNȸګ-d৅U[4w!Ye)KNfYVA[(Fv&s#pkm-,n?m#|=5Iq)C}y=sv"6 + Re49#-:!/޿}BJF[4 ۖ|g6ǵ?[ocQᆴ _z|<<2pwj]*C<8s*qd>z?%T,XS=ۖp4ofn|#. W/]G{H˵.a0 Z[z 5izrSآ*/Xsh} Ξ^ȥ0mj+׮+9_V s[!K(>S_Qp'So~y؜f9k``<AR{#R1eI ̸eeGJ~Uڮ#49Ѿm+VuPĽ6{`(c٨ј=gLME**Ǥa﯇1'b0l a8mȖb֤nҟrQ3ef]'gY I1SO70fԩYZS\0kyﳟa~P~ygu3|p<􆯄}kZz'8o_nUB]1]Ű&" H֩S#X%y}DD 3# A>1gLZ8&"gV F3 D"#T()<HIp~33MO3Y]Z7rR1m1/^K;jߪ=_[r`2PUC5iHDfM9ߠC}C3[Qa0a<&NMK!B `9ڸcb31~nYN?`gM¶VtX7j*;3,FAURmVBi=Ky+)m+22r CIuuv->0b%'j=V.L@)8p$4>w3CFNjC=-`ږmbfRC2)t#P*Tcδ8XqU d 22`4 ]޻Vx!TKWR\Qn*^:lXR2}< dauh U]{ЏQsӆ tiւka$y>–):#~._!jkۿsŒa飂мBT7O읈V>"2'[ỒJy`dctPy+9x4Ƈ.(Iɐ*%nP# ápB%$tlVy}Ө^حLmDl!QƳ_ 9Xq4@P@S,Zs XF@f w6XiiHKMF (H2nj+ j@q?%Ȥv}ƌ!C1n4lټNkV  Lx>C0l8]` gaeMe-SiYBV6q n XI{+mL+F9Ç7HxeFQjq=wAGai 1 Q 02A"bGԱU 8w 5~?g5ȊyK`ٍy{q74Ճ 4ѝx|,] EpCRv4+N3C88p_U`/&~x59Xq4Nڅ 0sصͫ3$oNeWA_K{ܘ3 Qu_p;k -ګ y(zqcl;+Μi$ {!͘ׯPav\̙@[އF8mv!8Ami -@~ֶ`'B8Xq.gb2"\;)Ӧ=IM\H_^.#es];,F@VnrSI9ؽlp&U)nvvVLZ+|޴c2.\4 ; J`4~.iv .æ!&eEi!,J9RS k`+{bd0 aiVd0 ][3,:bh߶[AٷBk?%;8B½- S9+=ٔI{%ߓQ3(Sh|cVy>`U]Y[BKO:wP׈9*9Kaii f[p}V!ё9C 0vL\1Y1E*Jqn@WnS¼Y`%9ט|XU]\tAzM"Xw,2 \:,rl0P"+#,}G/`CmgGna뚙UUЊ+V-jrbT#X5U+?c*43V{ VF[Y5I٘1XљMrj֏~?֦z]a:TT^X ǫ"`uhj(iVVraT-(Xpvނ\-8Up`iV-&,$ hAPh#aH*į^Ҟܥ;f OO#`VVV_Pdp6hoGo1y>$e8t(t){1) R&ܹt?͝E`i;a*"YObd7#tqaw1 ]D6uh FiZ__2`Fos:Ю{gh5f$J_CR}6Jfϝ<Ǖ g2EC~Ji>>i5'YU 9}Ц8 c>0ik }}}cM~\{ m 0| N݁1Xrre8vlģTo;Ч5v]rDa%tTkx(Nl)̌¶zz7h〪<|6 Vr1ݺl梀 ;&rwP: +?笠y ~[xy9u*"B>RY0(T9"Q!R)k ^d"PV֧L.$CDe7 @Bd%SuʿWʵRb.h?dP|}ljWףik Q ۓmhw닣g?Шuָ".Ã+GaN!䑽OV\ZЦ+< UoYm~'\>1f*¾T;+Fwɯ٘0#$ej7ٰ|4$ߝ~ ɉpypNr{T~l ---hhAy A1U`rrLGw8ppet>68Fu:M>AwM@_21V`wԅM1}6468r$/eՉ鈋Ft D?Î53al,m͡ISHie۔uhլ6FxepvZr*R'wYwH"C IDATQ+ *x/_Uũ0j-M!oau1~-5%nҽ~7Ü} ;;?՛aꦃH/drI+,]>8;s]/i:q ~'iSu\yR?VoaUJ1Xj6!ȴEN`in M- yx5^*G\,? ={1hk=P.y0;e:(Csnڲf $y-;`nd>&aQ} x\_4Ӱ¢c/3jJM4߯"aj?KX IR=G(*+eW\ qwꏇo q;@^iQKp FԵPSoGL_Dܼ( ĪwiA3OsW^J,Ņx=yOw8P7o#)/|MqYu]+FP_W\wfIŲ2r ޡ(WOsbRe}]EZB8>*K'?3biߪ bՑHKMA= `1d4AL{N]B8( On%녕aUY_ddbNf\}IA.yc԰AFV]CNO_`Ōhe kk *$wCFQ8GvMw<{Lm/KCace v6nڷCQSO.a`Ƕ>s O!Ƕt - *I;iz0z 5;W=8l}'cUH.G` m-aOE{Q <*,/o*ʦ=afjy. ڙ\RWmͭГ~ogfˮ87o^!#.l-O3gb35 !m>AVdfJ_|GDt! .3k v =/%I[6@N]ѵkgXZu 6z07(…faSWoGmVe2!;և40hw|CPV^m~2+ I2. Cv4+y,zXQ  r%:3GReHy=-оg!˝l6# R"t Rs&vWk> 1Xk6OvfUkN5aޣȠeWR\5MԚcp:߂_0Y(4n $QZZ}k'C׬3.E5;mf1gug/6hbHˎh;K足wTExx}:;u}\r*ѵXM ;;)Q~X4y ~f?L 3>hoɊ:H }`;ziuT'T L3q)J3q9:3n;ޣg!rce{uJ bqxX{`GH[@awâ 5ÆCvV`-ӲQ^n Vfij2 [WNF+S'3֞>ibQ&4w~0,/FlZ 'M0r4٪A>xKn(x-o^ h`(V^`TXVb<&vSQTR_p ^砭@\e_4ƝW($Xm3!o󫫠[Ye4yA Q"'|VF?6RG([ԩ >r!hdYy#C_K c6+Et uiK6%xgfNLvV~30i-Yn@<Yk]퍡C@f \@ܔ0,2F0d({[kj7{P{VOZ ԇSdΒl8؊ХGo )}~mCpKˡ)`#OۊdZ4 ]Z{3.exYWLZ nprF!qRd?Pk LYMShGGT {L[]K{7[Ya, \zѶXD>ŭF%,zB iV>.T;SkM& O|0,֎``U=f=bR%U\g.ݻ;vk@$d]7 |KvQc *'QG(5_˂`BVgUv]yZz۰\,κ8@>/V? )i7?V"׍`뭘۳+bh}P*JanG@AB%e$/|(sȸ juXwqkMRеhA)ⳫѸ&iVJX՜ABU=Qg6ƴ{TJSxX|Onl5NKK(oRrUKm*9lT2FJ9F[؂bEYI7+٣,@FlnKZhmXeÙ+FO| ͪ AۖMUj:EىؽrZn~8j5fRJ8wh),,:`8z(vm 6jȵAV#fBKk1f`wk4{ /;1{)ϭ^=}|t~[|HUu}$4}vރf apz477ѣ)`_`%p v=z`ۯ?Ʀ-D w'L0\z ALfFYS7b`>'U'{nX,ٺ EUu|EoX`{\܌nݺSЭkЭ8B`6+Owӷܟ|ͪJNe?f5 cFF+<]k.]8L pXqXqXM2 #)!)0̶~I^d䢔7僽}8X\NBVjSR!}7a7 h+w _ys>u!_-nvâip}PMO^z< ~CGG{ǧ`ep3ܦJs5:4M=&2ڭ5uD{W,D5WvP)SϱB\/w;},@[UoU$6l 󆃟w}(}MC.}NfF_bF|"X DFx؅`E?MnX}܍hkUN03;t`?||pakw8~;=~ Bcyiy\j7}µdN\R{[HW/ɳhK6đN }+m-\Sq~ n_bw.:!6sڡ.X5}.c:vsplپ6M7߫}KއA҅N[K0q3-[Wo!)LÊ~1b 2ǀqiodg*Õmoa?j(M2VΛ~c?g*mma#,ldIϱdҎv'bٺtw(|(/dNRVOggJcĹ]?~^}6/FNu`@;ZwǙ[;gQ=B5p$= FX^ qrmSG<놲Eh%"4>)~{jÊ36GÿP&|YQL߽mnZ-uxH;z`+-CPt ͣ|iC,:`›6 CVv6rhm}0icLݣwxv+٬"bZ0OGt4I <' [İUGSP렧31bᔙ 0jL {C7ۈRWϺ `bϲzP lXbv.`2O5Fst Y]s]`]d~Fȏ,+;gD%yEf`[hww/#pi7yMò-f-_铆yc55qXqX>iB'`:0T |o1ƿm +kkґ,փ"a9d.ye%5<Ş]O'= a޹6:{!< 40`aC'@xڧ^ `%mzRo+ˍũ}2VL2m!,YYd5A9tvK赦h.cUVthd-wPL6bښ:L6k>+N~MVqR5@"Xm)[ U,кZzGtL4"""B"`!:웃f~ăAطmZwG^5t$ :aeհjo )DJP9") jnGBhAR &4qlXTKqt1ivVbA!/iG Hp_;[`t,[80n ,[A~uf^(C hX [:ak׬:!+ qD:ug;ៜvc=`f)6rr|MqmtLq4'B rOs ep> ?nNe%طu.Zu'X@N[eHӎfE 1^ {g_D.#䘪UVĎ1Pf9)/xr-w#~xbinpR)R:y|{ 鰐%HK!'z23 ~ h+Ȯl VRڱvj3*:րVJuFP}zҊ_oYVz/11W,Ƙѣ1zi%xUiQ~.cތpNQv2],5}*1Jx4{wZ V;:7#Bm{°:y_dfO4^nX{@"79z6ߺaIxLH́gڤ>X}}'?L8a gF6jaa5.*! V/ǝT*\tj##/ ;J{ͲmPK j ?eC+++.*!V\PUBPu4N+++.*!V\PUBP6uTVVV\TB86hyVVV\TBXIixp2di\⣪J|u^ 988 pXqAU AmH#<888 pXqAU AfRsXqXqXqP ₪ڐFxqXqXqXqP Vl>aA%dR t. X[vdW0u4^WuŠ 8RFa IDAT\s>O7_ǭWyP:w ^O/w^}}V T2i1BDxx*Ro߼AFz~1Q;`뀼M~|+*6uHׯ_ sZQv+3Od m;V]}+@z=EzJ2**mR֖/"BY\%   =>vfusy,&ŀŃjg̋H>PseNX=!znV0uP buT 2#/ح`Bs4V9Y( yYI8}9q@=h~پƒ(aPQ._?So CTTU2 NoA(:_Rz߹ 1|xgg^ggTd8RA꣰bTO=sAƨYq 1 8g9 p-(qYrc|Lw4 Ei|hlk.ݠg /HE0t^Tb>~\RyP1X)`zLd*Lg7@ȃD\$QArQ&س=iq`EL"3EԪ\F{vT̀4rPޫ6Kߋ+$JH+)AAZ4֌ TDߘ"JS--ay,tUUG.-.SUzU<tO9lRrzD,˞/|fU~ؕk`X]ʣXT|j9ō&͊٬Xi 5)CݰrytXzcRzzhٲ-_ToK/EdHtEv2JK^0lnENԀF\ @O7Zjqк> ('A ,5ZLMLM=GNMKe\Y6 kںzn)w#1+wOBhl%}:6kBQ>AbfP;AwHCZZJ>(R\_?:m,:ZBCC -,}L VaR}S[a@07#3¢<S7fcL\2 [֨^F!6 d>sVT :aNh4e0qŀlraߪih[ xU^hZAl lZ48xŤRZ퀹X牭KC_%,zip#NXV04  X;4uZcƊp} 6a0AQ&E`Ӥ5aE2dgP L4jYxY.GBSLzrAܽwNfF0k$H zvlcv$"9BN}X4ں!f_G0ohKlt6Ōn(,a+UeL4;#؎[\ i,@cȢNBX4Ȑ*])[+ɵ)(ʊÑ5n&K7rLIcjFm < ]ҼV:"<ۙlH'Cz j"TJFph%)+5=R2,Xô$ħfԮh\{`wADSGVqљ4*/o_QA{ÖXp%f{FE!,êh<L(졄 y:gJXIq2°{~ia]M/PLqX: /N]PLa@I Ŵ&4}dČ",Fj:EQ4Uk[B Xv擽RǾ` [؍02l+0ΣհeϬz+3|%Uuy!4Mq5FԐǘ vB*AE8)Γ\V+Q{*)4'Q]鈐1d*PhV{Y! t\%TŠʙ_V Vo^v H4+@YqJe*aEhP.!X1XvGa{21Nm-hVNQqd*JH}#l\=q[HU+NXkaS~OƐz@x g*aլ%sȾDRoE~`L7eV XpZ dZ"^1+a#+k="/.`u%Fbo[w#*_D_YD2|(W܊dj|%|)?ڰWʿ_S=m XUEIX9YɶXGG|!Ge;͹pnX=i |)` =iN$*79VLs  6 &%\@V)ThV1[jb̂5+r&J$4 $LfiSQ̦5!-1\j2^X+^ ZS$w)MsQݍ0}.*uY +ZݫW*4+VSiJ Ntø071i*;-iV%thz}I|EpL5$XDxq ޾&XS*@` Oi:acW50NfAxJ43I+pf%Ӡ+\$Cv:m}},}yϱgAaX9#0o /ЯLBTnpO&)QUDى4o00Vܸu-6L@&EY 8r(t;bx1ӬFt*ٞd}hcmرz&Z59PD0|{;`uQ'IV8Yl2;gyx<{o]!@Ъ3 )öݠoa)B`Hvho4pKe M]Uz~JUYqJY1X!1uBQ$ hXPXHΔ^X9a$**+`Wb!ZKwQQ2"1UKyPtFx^SHQ>#8"`!MDr *C(ۿ'fRzKc-:P,*Q/ѧ?B~dN8ZDfRS|^E QXP(KOO\)aŵ-͊@O7d%+< 6d=0XE;lCO,CbJua-&-2,/"YqXq-KUAW'ض"|iڥ汩WD혒5+nϲY1BA+x?E2i:Fh+ՁdI3-zWQkլ;/}#]>ڙg; ܨ\l  ` Lbۍʯn4aAp|Ґ; T^ab#2v.TXqJU3լ19;TծNW^+ר8}Zªf:uP9dw? rP]7ܝˀJTTFڎÊÊÊˀJT/5:tTWC22aU%kD}`6 . N4+ phh2̪`\2e!Yq+.*! qy{5P+++.*!V\PUBPj1 988 pXqA%=jnЖY~;*[&befeR+KS~}u}<|/U-X13/<;͆޺`iLn߬Ly9ã{mebyR.CO ?!wL߾ O'LOe=~ʶΎڄM3?|p+N:urb<@W/fxN  yج )xz E6r6;>dY,:CsT^VTRmDE , #:/^Vz6) jÊJ&.Aؙo߼O7+boߐ!N^j 8+S!iĴ$!.PنVe~j+@..}P.uzڿ`ĎKOQꕅX~y_S*چ]zj2wTC V G ǮڋA[eb'ǒ ̤*eRAR\oOr>(WrbM!nN /yeGP@b&ixa~ޟemTB'ivS VV1cx:kP  U $^HKI%l\=%ԂXbI kUFv&>y,L3\A]ŷ]kO3 *+-AB݅ukqs,xer|n–44* YQn^:9gW)nVFzb8g+^켂L+VNUjRf#BFl6r}"߿C!|2L8 0w]!Hx7-y.^J @Y1X o`oF'gߒ<kCnxYQ*r1͊:ORx=lѢe+tF0%bPJˊqt4Zg<^@iq.fmtо(v#Xf4)6 t"ͪ+靣hEDskTdž#g[(hVTJiP*:Y [bSʥx<>vwf$dVU>W]+丵m<5ؚׅbvfb&hLg"\M0n#K[p|,tN_*cߜ0xfVxkK R[@M# D;WL.&ڍbHyhZYtŕ紱,Omi]OZHzLߚTհ\ jE4'7N@ gA. t2k#*5+lV|%iVWCBhCP*M|YC;||R t܊vmç΁WVd`!gP;W1LݶL[HKR>;u˶ ,,,:"!RZ1zaѭ{8q4@'Ȃ0f@q)2}ӴahCg%a4~\NE*a>c_ ЏV(NiLAFc-(42j4_Ln uvT_?;,b`"nz>5cSڌ WfUV2ZH8ujwQv âP<}ae?}C!cQAϪ VTUZVlu)bTe#kcV8#81;.C\j l^v:cݮ}ر'35qAK«TؚBߴ\GK?s&[45w^t ͱb.۱:EkxQN iVѩDxd by+~{GU(􅑶ԌHY1Wg/6xRX8z!*Kf Nkb!޺i-,{ 9?Dc>jePLRi+32}Y+g@C>B--":. c,*`X dӲ`b̀6|3r6*+AI!fj8gf@wBvfbE >uE^ Vl0SL{\| t5CsKPLZj`5NӯU"ӬqX( XW"򉒗R\4]hiEi9cZNXv62%Ht\L&kxf^W桞!LRiհyKtntEXg-t4.BLY$J!40DZPo@-a=b>r!-`P$ǻ_ t/-!KquXhđ{eN)IrƑYRRjUюrL[ ]Fp?b'X}whoK!(@EY]Og'7l xVlu.c3{ױhA|qu},>`Ŧ/rjȄ}c4+9 " g ޵1ЅiZsArHhC#ؒ _ tvFAZDŽצ-M GrZ0娐>L͆?=g~}tv5Oh|IUyeJ-RaZoEloVf=iJƦPR?p3)L\ gKeIXx,4X?XwvY_2WQyx>/4y\$"Mͺ9?i(rȊ׮PJڇ6lNAMd8Vi4? srU!qab7VpVag@K5ϛΝbަCȆf\hԬn]'Xÿ%vmڢ=lπs0'cbZRS"hG"|Տʹ2RG;@)BZ ,}i4ACO>w=zǢQX$A~Z,aCmG`LLF:h4JcH;Z@1+ɮ2nhRml}{n]:C;CӨ .?) M̓܋H`g7@bY6/3ZkġXS5 Sm i;WwP\B ZXw>2]UM\.M´=ݏx)h;\K'@C9.FC")Uw\ #?1fڂ)ivV5QOmFPsa=:`%N IDATX+NvgYE;O GWIt: A#a 됐yQk^^. 5b12R)ðg4ƅ]ŢWh7xMrQTTXF iU"8 ĭka+Dzn~L#dkVXK +& 1z ]MlB Lض-5ձ9ppxê=M|hgl2H~޷*H CUQL L LH ,H ĆbckJ:z~v:%N6&ul߽>/,Hwx~{s=]6hP>ʁ Xj @ǴS|Kq,&JmkM h4*I/ co@jFUeI,J&&6uCkkrQI[Gi~W)4ND?)q˜e Vx6| sL@+FcoIi(T-Yfu-U\&6RrkuMh}[!R6|)?-w 1h2ŹdrYΖ#i"Ͼ&Oiec`|&qu3Nݷ S٦:Ғ ºq%q c?_CS*I2I-faU^cNT!?{4x4+R{4+ 5jn{SȻWb>IT[yN ͖)>g ,4 L8cԯmh>nEn E&O+G`EMh0?=/}\^t4rڔB rΥi[mJA/$t\^ g.h4 |v*8&=}~Uf[ƴ[2?LD u!PxH )g=WwNX9 V ˱P hOs 1|5$ V yCbԐo?}2r Ngο&qlg e]~ 9eyS?m$43D |1N G+L7J87㨿)+.4X+0f 1)0'*Y2kBsRӾiCGOpbY.^պoOiU>J&|mcXVt@|xVR(h/&/d(^H\$"cf#SIE%(4Y"$1a\#Cp*__f"7z8cEmNi/q1~Uabu]| q'dqyqMl|;r`ZR )T9 b+]lSD̓kAIEpN%il>|0' `F _kW$Sٌj^+-Y؟xfrc¯*QW28XY19A(,T^^ڥ JSI}@}T+(+,wYvY jrڦ+V`H ¢v.5*nM9NO͗TV_y#+Ӂ $'_Azs?(}%G + }a_[X ='c~p`ʁ!3"a\IENDB`fotocx/images/moncolor-small.png0000664000175000017500000000561515247006660015750 0ustar micomicoPNG  IHDR%tEXtSoftwaregnome-screenshot>1iTXtXML:com.adobe.xmp 514 815 0 `zTXtRaw profile type iptcx qV((OIRc#.c #K Cd#CK ,-- @2`E ҄ }ZǀzIDATxAnF`)(EOo:LAWB6Aѥ7 F(~2*(A@ .QB@'Sc#www7775KKEׯ:364T@ZR)uEH%RG@ZT@ZR)uEH%RG@ZT@ZR)uEH%RG@ZT@ZR)uEH%RG@ZT@ZR)uv4(]dse`ЅwyiZjM2[- 6P01VCI2D@Z%5:iRiI=@ TJiRiI=@ TJiRiI=@ TJiRiI=@ TJiR7ۥؾ\gwiW< ƻi]gpvr_34_pRi3s[kv; eK}ٸfnnh贮dr?4\s8Ysv8[p8ٝ՟gl[k{j6;lOwyX/*kV`d\_V'Bp%bRDEH%RG@ZT@ZR)uEH%RG@ZT@ZR)uEH%RG@ZT@ZR)uEH%RG@ZT@ZR)uEH&7Ǿ?xv[]ma䶫f[,ƿO{cWϚUլCh VCI"i(iRiI=@ TJiRiI=@ TJiRiI=@ TJiRiI=@ TJiRol֛M/5wx2X6[[?~gիn5|:sF4V5|kv%BUo5wgߟ>CR|?#3ltY#glV`d\iI"i(iRiI=@ TJiRiI=@ TJiRiI=@ TJiRiI=@ TJiR]G_lTty3tgeg.$zVooi:-?e˛HV wU F/yWs~u$<8- -ThҢҒJ# -z@* -:ҢҒJ# -z@* -:ҢҒJ# -z@* -:ҢҒJ# -z@* -:34ެ6K׫uL dz' fWN|I?8Yyy[ f+_i=䓯p8ʅՒ:&iYop3?"uou] 篿<~[$-]wlIͰ~alѥf b8Z8=Z9x$pZ@ZN E'H%RG@ZT@ZR)uEH%RG@ZT@ZR)uEH%RG@ZT@ZR)uEH%RG@ZT@ZR)u~xϱ7wTԅx`v V]Kx[s/C:i)𧖇'lu/hVi#sWZX!8D1)"PҢ ҒJ# -z@* -:ҢҒJ# -z@* -:ҢҒJ# -z@* -:ҢҒJ# -z@* -:Ң+/oj׶tҹlg͜gmPVRәk =5S.-www#k^|{?7*R`"PeXIfMM*bj(1ri%HHgnome-screenshot0232Ơ0100Fotoxx:resize|NE>CIENDB`fotocx/images/map-location2.png0000664000175000017500000015656415247006660015471 0ustar micomicoPNG  IHDRtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 220 491 1 0 _6seXIfMM*V^(1fixHHgnome-screenshot02320100fotocx-24.20: Crop: width:701 height:517|fotocx-24.20: Crop: width:546 height:245|fotocx-24.20: Sharpen: median diff 2 12 12|fotocx-24.20: Rescale: width:491 height:220|fotocx-26.5: Crop: width:491 height:148|$I IDATx}WTپ3kf޻ow(93 AQsbs@E9PUߚߩ*`}~u>;|{>@p @@jǟv  @@` @@?9wz @@@ւ1 @@OA  @@Y ƀ# ?y '@@{q ,BE{>"F^B$i磠ďpf8XCXXwVᰑs/vBȯAK] 8aӞgqӳY#:\lM .& !aQȫbT`fLN1w`RɻuA֝XXYrK-3`9Z $;|8,<Ɩծ ẈpVjƷzntivCK]"V}qUmA8$QPQMAkXng9i ;$tȁy>  RX$,)yUlN0o.XBLL2:wL;h|*؟aVަb ĨjYP3+ą/p7Q<iΨwa#a"oob !&(jY 95ڋA]9-3l:'`2,Ɋ*f)CN^ 7g.fa3]׭pqmD7GڱN _?σ%6 FZ@7벙ڱ3W ̵2YaHtM9ɰW0$f;GYʦѝ҆uwoBhz 7݂\9 n3r/܃UVXp8)CAM~&=-!&"*-p/Rc@CKVcj3~?-k+݃t T57Bƺ7\:~NX@/cx'~;3nXE䪎9ܻp7l`Ε>øsRr ƺȸ9f/-,=.$DĞK7Qx{p9msnk3T? 3 /|moD\d =+j?1~GxM ~d nkp.<=lˆLy>K0 gP6ELYmL!]d=F^r=}k9ƪ|+D]C5r?onP+dgg}GU`prp\<5֠0?Cnj~Fɦ d'd"S%ǜE@]'n?98j%,FAy-FGQVZ%f",ǂ1Ni*?'TUC{|BKM)No|%\yS`$ԯ/p1BFɋ0הc Jۦi6cxt}$4Mh5TN9x>UKR嶙)EJ KfrL?|]}n?EqHK+N~?Xp3(}g7ڿJ0:Іi(Ov4QR'vRScEhjkD٧"j{JS 9t-cji BWk=w1dSyN Fc<لyai%1p(rmx$ŒKdU{ܦV:Q. 367ATVGpy~ӟe0F4C[uk=n5m1Z-{M:X} SPRNCI矖al w5"]vxK+R鹢wn|XcXD.!sO+/euusɌ0ExXk`kgjs4v- WM;a0j50r oA_Gߞp^`v}]wN;8(Cb= lt6~ƖZ0p݀Vރ̓*D =Ki~`1$lX HZϵv3=\2 D֚KVE8X,ŕ3?Jol`ꋔ̷^N0155L `l'h; %* uppr4Ur|jd4 Y+Ȩ ̸d}~ nз[Gc3i B %K2>^Skugcw#:0JxHCNM+Vrf;2GLgI.Y aGΠj,b27qzqvF,Zs/S]M Vx]3uSl %csKn܆ PP79 f GAEI :T .@/ ‘< me $=֫2F2XϫjM~k*91W0ymnKB<휸ϾreYCnBuf&q imG 2Za$~Al_B2x6S *ht2j9AYM3V=Bip`2SRi9>҇X5KgM% d!l=raU-!llu?Ƙ')/UGͭ|YL) L-B**u{ V TyeaS'<,io47|3'p~X +g\Q.0|l^n%>|S}9h5 oan %mLHjAL[c<'H/ ޳2U 1[!)u d@PT7Ԗ݄"E&Y3>}PRՂ,̍ -xSNc$=T_Y*i,M[RΡ!>vV43 b|UeM>ְt];y䒠 nC\Ob"O?,DjoDB>>m{Fxxc֝ذu#wWoe$@7.V_ 7{|69\HZOm,V5!^G{K"_`vIlՄC0_\{jRPs B ۿRZD顫,4W4|QP݋,dL{ F$UaeynFQ?|0_MVmwh۸#N$-TROx)TgA5xMTIWn#t5$pceBFVg}4tn+Ja{/6L$(oBKF L\Wx%ee(W)D^R B˜Fn\vֆZx#,y"p®Xl5d881R^cz2MSk”oJPq!1 M08x?cWۤ>QCo3q[Ğ{ Yd=&vPtCzi+Q__Ot+M#H &&ej:3O [#-u}8u*(C YKZs\=rH*H9(z sUIG@ $CT"5]9 ʅUa<ljKE,YPGvU~DZA2Z6(FfҬ`.ͺ'#PyuIa؅N3Oy8iyMzޗА\aS||}/DŽ -HF31^e/G $O'M?a Ëg+ԒY9جA"tl߲N4h@h3tu<[`dZ`E85· !b:<1Z }C\>eTdx*%*XO qog=lYI&r#xl!I4bC&'Tn`Sn"#ya&(&5i"b:(W{ꃞ%gI0x'.YjcW3=u0:2H:Tcmև@GXbCy 0* eS/2JM&lI/GȤ4E/@sc}u:_RQ>Z?ZO gbo jd=<`& ,մx7^{WWpJV )8}d.|IIȯh'"|Y3KP7^O pb)7zijK? F.Hݽ4Atm MoL; r<4dZM#'ZW]o-GG 62;HѬ;'xfp,`Od]?}z}/YvUA~"sE$G>k0:b!i4YДM)zl8EȚ5-Jd$ݼIѪ7WH8, u4l& &sfAX @&n )&?\݉u|)ܫq02<6|<=t%MB΅ -D,5XIaOo',∬yFuC(H8YbeQWUY9ǡ0Tjp;0fܹ|@%M4a~6p=kWOX0פ<: YSJҡXwD~z  ݳ]s`%ĒXX\: s XۘAMQX C3lXuKg}cFYWk%t%`D+'YpZ¸jXjC,^i).D@YE ?Sp_gc#Dg? KuzX@brjXsYe?˚d Jdy$&2 zܲml͠,'IB L,q4bh8ֆ7PF2ʑuϔϚ3DKhZ"F'kKkz 5Ƴz|Ywj PT4us1p!{gàjBkQpDE($aϥYw|jvFO^OX?[p}ֿDwpnŇCY9`'& J_]E+ۭC 'H'G24 l;@:U@C/?!gWO֬f+Cz=jȇ>F4FAo"y-$4ٍ|U{9Nh]6>t\C6 3AӻD8QD+Yw4HK73ufqvpZWK5HK k>H`\ȚcPP>Ti)nuN%w@OdMQɞ5´p,FQf)W~v7tUi'E}} ,8b3$uQHMyX'Ox.^Ӣir)b͉d=׎mvP4YԲ=>\" ؍fXmu/^4 >dwUsD[ i`_;(OX1Ed=U+XJF#P%sȭT?m)D)lZIN?X a'1 MjxDr(ګqq.Ηusc^V!d8+r.zh"n H&sd1#o LG+-8"]d,҅ Ҋf` HV'.6#!.!KKN!EQ%Cf0&L!MfrK8\4?լPfVI%2 d"5L6V rnیta_˪cۨ~3Sm`T /SYX{:YW1%?cZEi)kߝ<N@Emn@a1,DQñh0T{ r&_rAf߄X@7~.Ew4-ku+ {¶`XB$B&5X aMa. 9 .[U :Xx?yՁ`=p%.á'h>1z |))رnk][=B1Dd5? We4r$UeŒY1"ܥ~$,\S%qnZN&i4h>0fR,OZ IDAT|uUFM$=B7i<~٬~\<&& 0ڐcthUûZ2 sql$@oE\r70:iw|6ݱ9x;o<+h9c7"vB.q'rKhcd?D̕TgCqN**f8u)"6rDahFEAu(I@z9>5qD&>"i&)2eJncS.ON-8wrɈȒi\@V^9 6wD[TJ,\.bŪ^] Zo9M1Zҙ rغx"dNl 􁶲4iaƎf 9I'l)*&1=wT5wpef_ቭ!KCu|xOo^݋#XFKWD xы%p:-@WEzi/0aS?6 V+PV}!kYyEX;#h(lWBʄ&fzCM`'~(IO{3?1Jsv'^`7R΄BK᧯SsZϘ1Y\[38SbvBWCr Jp\ af{Y&ɩe\CQA)vG9E2d}n̝P8K3f}PUĹw*?z'q?dY 'ӳ< K)|윽,IL\OXd d,Gc@L"O[}CٺO;l{4 C||k2kK#h*ʀ6ܡ Ez ģ+5ѥ^Pwn.pj:[jx}9ώUlzh,Ek&@b"یc;PO ܱkl3I|8ܵ(N0r.@]N22ԯr?)i(PɳLJƶDb Դ:JZI1A"iaonEEhc9n/4ԴDocR.Ǽ\2'O%w`c]'] "FR@hؑ2L: BiDxi̘4Orif2F1,aH [v&m~̍fv8Ho'6nj uROE%hZXb&e]_"P{M0Z̲Vyad#}u]JKPOKо>H#[w YՆW^fWzVzI+\J|4|70SL$8 Y@c]ER/j~?ڵfǔ\MNIrt5 6jooKev*--Ac՜I#(a!X nKQiƹg/]6E+\)g^k5|8c2fשZ;B^e3Ɨw8y(~>X>kpU|i틍8q0bZ8Ǥ @GNϕ+GΠ엏zܸp{bcfߺ[e25n4#j&xPޞkqjՉQ_'uޞܼnEڻ2%g@;'_DZ*(17Sw@w+"=u $plǺXnOT^$60<:묠o灢Y<3%0O9u6³ڶY1srU &n ghf]$\[Rش=.v*v^yp],=2߈5i H%l9rzwjsSJ?waODojW/"P] )}\}S͢3V֞ppî;By K*b;9QT2g<\afb]) CƍЦmJ m=t3@/g?S c.P;xQM?ۋ^U'U}| j`Z[00:}Xzik–?UsԞӋUr0p{6 U MYțB^m::ӃΎvTfCx_Jѫl-EXo[#P79~ E5{?G)B_g+P:>X{&i ev"l8\7b%Pq{wűB8qj"#ڕwt׾&4ݣPVߌήntvv>Syvtww gė,Q\JyzB\s^R>e0ƿAg=5H Ey9MWnc SC_SM ?q!"?.ŽVY#!.7ret97#h|DfV 󀴶R_p#{%p=(,Ӏ7i,uu0"̺:T| nIŸ' םGPҍc;X+Ccj$5SH?{hDWWZ[b.,AVE{\tbe[m\ {nNlcsIByf#3bF@IN I9 ^b2H-I[w40Q^(W>c̘|iRKppj(`ѢEI o]*i^3(2Ɔhbf !*y`\}Q8h-D/Hc…@ʺvxUmbwmdű3)[v"VEqW3eyKC#d J"훁+'4 T **&v~ '!$&Fі|z W;c/M'd#l$eqQXhsKJEGwngȽw,vĥ4mCTQ -O% Yu#I}!)KLu3@/޸XK<7 rb\p3PR3&YOATm4|%Nǐ<pfYN(ɨ܇$uIs {tʜ3օ'7B Ytsy|};1F\J3AP uf +YtN8Ultgz,uKskJY褋>ܾ"8An! ^P5u'z(ګ w|?QP yoNQ HqTMp0! M-H: bs]i>F2C .v;BTBdiv0)j!2. y>!%1۷o<$m8ib8kGy+tN|&s(K,YK@ #<"d19mdS+8xr A6%E98o 5$vb-h\%Bm,xdMu.R$\]-@R^ !pAk9XAN@9k)!+ZAA=nVo;,=|)|w#9:/_ (D4Fo8Xj@dI݋$h):)ZoȡI|ld$kIǓp5\V r0 !ZSNPGm4k$'1ބvťNN\У%Ti}]z2 fd\ 7Ox{,м"dMVB02gqĊƅKdmf95k,˞Sp!CƆ+pHV|5[1p=o| C*̆,ux2F?Ƕc 0n.| WC,߲{uHK8-"(k(nҤqL4l2Fi=EuYXemjGRZ~AT93(>>'1g+d2}C'\L2@Hvjj>teU蠀dR6QþICڢ0Y@J^ X㏠l޲iV?u Iv!== ou5lC.K1Y"߹.-wٌm-ܿq=?E)Y\ϟ"뒏7!'%ȺeV7T(cņHdމt#^ ]_k;卋I;jȇ :~#Y7R|w&}l^&3سgM4PZ v2gnMA`vF#dd)C [T0WGu.6 E>L)‡†9̤ujr:;3 Θ'즉 ZZ [ iw ͳ er7ڍf1YrdN'"Rղ,t$h毗&A3dcl !gfGֲi Ef88d͈ Xsz''0&M/FKOGTX#zCXVoGB"RMh?ڥZ Nfas} SA>6Kڶ䖡o`=0=HdH)xk:Y,dtq4hI8hɊbեbM3zAk<ͼ}S IDATH?c$d];I8_~-[Xf*X9׸S2g8up7֮] @ CT:HJ@ lj*Z(T$#Y"q# ?z~X'nK_x,{r 1 !-u']Q0i`֙r")yh&Ij,d%]O Vx{Q܅1q@4,JX}TBX\ER/#N_>-U>&o=|Y3GV:~L>),<"5֎jki 5 _$\&ό!+,`Yn()c4t M2͕w&+o( _.62 G2ƪLx-5+Ex'8bci7`CH{Eyy6"6&ZFQi"UŚIVU/" 7^BRr2n߼][$#?-hl0Ӓ%u eA)i\_ӻ +::ޑ$1ˎ8߱p#+CmX[c2Ro>$$ʐu-c`K3[a Mrq$Y|Bi'_Pyd*O4Vd3Ko20TxKH>} qe^d8RSl_8t(% dI`M:}bd>CUC;Ӈ:- SI!7&b)Mu#!xڿ2f*2n]I\X=k̲Fj( lp/Kmg>.bF/hch`Fh"s^۩H*,<7c5c Mu+q w̍rHYɁHnm:tpIl^? |: dU u4Re8|<;!OχVhґ-OǑ' +BKp-sýuz[ yul;Gy xF,\ o@Țy)JdtZP;Z YGy`>tO{M^f9%hA5br(7 Y^BbYӯ=u-m 0dָLxm|Ri h%͗1fՎ^ iYYz4qo 7ʩ]P'bI)S9,@U;C6\ z!ﲿ'7VܡmPSBHiZb ֤ntbn5u`Nj[Pt k9ttἍ"yQUАd5%4u"|NFR Ixz gvCVB_fc^,E<8q[Gi_\N7)&V(+AEC zibYLe0PpC̦ +x-58{ϬAlq@^\Lws}'4f3 d5y2݌ ;,R4ą3oo̘/хb >}8t L x1di)agth@;v;o?~ZRlQ+n373) aM?yi E/Q1A-d =)NeIRX:ڣlzglmWZ?/ܕ `WU s R "v7vcX`!(ҡ ݽ9WPܲ޽=s>s;_&i^f,3Sxed3ȟLCf%:EyZ uRؠ'+=^٬g3#KlP:c!0mTLap@9eMQnz.fAvў¼Z\H9^sq+{䨟s6o гPSLAX6/4 *b|qzϏ90Kqk>ImMh$)okcXW[3,: γvPГ:0s#$3& (LPLPN-Q4CNwW;74G`sAs#}+V1VISug{+[ORU-+!1aU0{{@S[$uQ̱/ol !iJBv(OۚuKMoĞC?jCSK+Z.b@Ȅ }`CB '@ɨ1696 _=I2m$ O8= ,3 GFs 1>l QOw_o}Zf;2-Bkxh)PF'fZ=u ִ`ׅ:_f%ӈH mg(!rb.fww0S0!>#w qF:G3o5+:gCq]Yg̟uL1_+# 3m-\3?hƺj+aMC=څu5z\#-Jg 2(n aYihn?{Cµ+|vܘ碋pY~i{Y3e  G&1HyA: ں015աg1ޯbCaLn1RFBedҤ:^L,qH(ħ$kbŠ6=S>!=BaoQŬe*S(,-Wް3Մ=nF5р⽨i ʚ8F mV^.|`cQ'ѲEawS9"߅>o,QԔ &=bⓐ(\= 砖i^e PTTI _^w_fj$!#%b3i\C)"!pNKE䋫0QъhC}c1#x%e@w ]uC+~"MvYtRz[wA`\z;i y宸*.tӒu OBsE=E \`ggǹ p 4$J}zJ{Mk'oyH"fyࣶ#N؁9N$;`JW2{a2p\ܴ)S_\)?j{u6`׺8y2Ңppz^e0{= -|'™&8~ .\2¤IrmLb4عPZ CǕL^@Gs6٪`Ƣ5湘`֑Hj'S[e?eb Y^4bmE~p|O{LV2E0_~ o"A7qü!xo9,xr+Q ׵p' ƍ#<~y:E P1Hx 3aq,QX5 XN?˗bhDKE vqt-y'&fr v؎P6eħ~E]EZ?Uq< !XluI=4`1yN^0o!t}H|JMk\@w"m6#x0Q-g$>R چX?Uv4UnןvKE:l yU=}N>'LEH×Шp8~(Mo %)RRNb #~lp'tuv]]]hoFn.ŻBF! hO[P :H@FRtTT]~lʪ/9ݤ@oo/(=xz(Tuqm"gpey'}k3М;QGPm\7 ?6sL4q"a n"RRh?еqPrN*W=bJ ǤyHybMMM׌\ɚa6z;ގNtv>djN*0BLn"C47}=p mE봉js4v]{sLeA'/.FJXr. [ix*dج>7z! A]uoG&l'odoY_!p?Acz6U3v̏0WFkx&M}[ȫs2?]Q&=)fjzd]aBmd8.OYEt{(B|>}/0yu>K:rɘ4y21`Xo< u ,[wiؘi㧉8!T;'BꕒJp9V ƪ,οL (k3 |a"K~2/>A9SʢW,E̫( #n)U7CP#i'52="RIӃf] 㣳n03ԅ29Ĩ@n p?}jj.>Dd0S[[_EW_vYPT(Kb?-:_ eC|R{8]'Ux/zZa(-k'u{ ԾO{ԝ"!-%l{H ƲZX~ *ǰ;p fjI1:-"q_L[>`9A_ 2j)k&{^_,3䌥,,C9,1@{Qm:>|!}b4L红uL|Xw5SGg --%_V%9xQ"d{ 2NjoBrL޽ [P-/̖vu#e:x 5g޾+'(N#'  $}m ;.N(3޾AȳۘgUc{2d4z7+!Kl c]`<vb&vOٙxi'a.Ĝ!1:aoqj1 rX~烘ڑ2nkDeA'i*CH$/"awNNX]! }qM_ì\FG-PPR!3uxpxyxxu0TMަ,|ǯ+ۖςN}m*4A0'^SS39\F 9qq*(aPVsU7uUg&\Yg,g|Y&*%VMWS%m ۑ*E2 JSjڄX򆺑Ze"ѭH K;j q)CSdLWeT 'OZ%UaGm9U#'(USL!ּ^0 E(&G5uUQ-L_xEF20q^/wu03Ѕ*9ԩ߶0Pچ٬{*1OGI|d8eqaRHMATA/ صSLLa7˜۹-TQ0LG3ǁ;Y/cȉ%1Cb;$1i:$G >?t9"~"6+W;` [X 2z Ody3LpsĄizH 8 IDATo9f6[&5eqГ¢m$L CxDmM8 ozhC@`zWI/n o4/ƞ s 51~ $q26f+T#[C^ Kj(z|չhjiEcc#课^[:L@ZUhi3>wA|0~b]_i 9himebګoD K苇d6w1bՓ,G}9h`2ɗFtK3<ŋ,I)ɞVHf3$BsT??{ "ғ4FxOR/HSӚ{drbd/J_G&0$디T|$뜂R:.I( )ߵY)rC;#^DIu"> UUGkƥ2:T&)1fkWekMZvj0tX"r:U𡺑j"M {mļR.o$b"F; L pԐ h`JwaKLv@EkG洩X k1x_KO SSv4s2]WRcdgεF!:Rt&R?L! uE>&|4U5/R2! ZCI uقGG 6=} [SmhڮDI|}ebelLA[""4L@q=2.|2ōwAE]czŸ{@ V,]d.ihwɤ:&kϧLTQPh?y7"8o4q'X{MI 22n`@</Bȷxpi/U0w/g5`LuhΘH#Fb c )eS|mL=~,8Q1 >xvvU3W)Tk ._"H'DXiE PC7پ]m[΂,[&Vg`ma sk[,gwGo9wW 'm" Kx~Vrztd%lp(KN62x,mɻ ag k#89mv0!)+@("ĘW>]l;jZ001 sZ'?B+:`#65t~Dl+%"Zrq>X%A?Ð [/L XÔ0*;1#q?,=s `MZZrz{)S{1 ƚr+ k'wN*R`2zKQώr\<):Lrȫgp50)zPUSb'D&(JOg%64a OQ5bd=]-(c޺]H 0IC4&*:-HA Lzui`OM냩g Ӹ8wWyFcFSmΘefē( eip۰ZXf tuu`Q٤yJ2 &`#jVm,m2Uh$Fo0t#C"Y B)EZG~IbUXUa&޼~Rri:ۚ5IGyZk@NAATW3|Yd?{)p˧X?bz5DIc>IxDGޢY3o+GTX(>VP_wo𹸌ņ+6҄Wd Ě7Nh<  l?€y |bF"zx6V":<Y }':+@V$;5!qHEB](cdďQhPw˰~CU!BCH?ȉn<^7Ӥk< #ڐG#5&uu1b"߱sʔcId4?]MexlnV"Y`BFl,vL Z{47LݑqFz>#͖-HHŖ0x)#gW,/^AB3."0.b=ʸrc#0H&RRPXQe4TuեHQNv?qpX'?@gs$|o 4!!!C#zzo -%U:X'>G9F!!!!'G# !!!!#rppp|sppppǟcnr8b'@?>!X'>5W!33YYW}fJkl8Ff=(+gb׷p]QB>+7F(O:HNS5[Ɩi)ªن=KB Pj_f.r>bB[/U2#(.]|?Z`DYryEc^9~oE:qu%TLMz)з}Z1+wMyxuJᗖ/%x@WU> i%kfr"~+w:@NE_˫&iX(n?. ,No,OQ>_+a#ޔ fbˈJJAXX8?S6: . G`YkG1_7axGDT=vCKUߣ,H}Kpm3fN~\Bq"#5>xo"{Uc Q=ݭ:8p> fBz%*[;TeQ%FdaOR=>WBSY ˏ{!|>@Ze\gq)X1d5$a~҇וKy>{ Xpt,q/Ә9B9ǵ2FᎧT :^Jɤ sR=[5 ]l:~އݘ.'b@B!1x- m<;i b<$~K^.]Ĺ7QΦJ ~ݙ3gq C}h3#/% 7#:)wn^rgyQyxy,ªQ2%x䇋QR+n(#طsgϝހW}.x;ϛ34:tH{oDQ(M3!艋 wsZkyp>G9ږ=<$.}o#&oTŒ2"p<8 ]CTEfw Xίo"l*&n>4 ߝKfA`.|jO놏ht1*_TthC~>&Wk eVtc*LA`R w` W"E\O9zlgEXacgZ1:Lś0wF\Ny)e/~kC)6քW [m 5c0lӰr3ףo:߉{nYUƩu31k.4ZYi_QM4U`m6QJ RUCB7k}U GGyx_~Ɯ˰u!;w9(My`8~\gx IhWôYFQY4NP5@P^9%FЭaE["m FjB}=̞׭.\6CI[G V->aLf/C"̧૰Ser.860_,1i*ĕ۠KԖ% W{g@m͚Uw΋i,^ J23GS߷%8o(+usH؊/~cSq,͙ =,^;GnGz ')Y ;獻rbfh+fl؈]H6q(XVX_ &+ &Fs|N. m?YpX d1,!Tgu14u p6^ZkxBA^Gn+iXjg+Q11nf$k+"~l۹^>ȫS~ȪL. 9XfGZccYM56a 7yi"ޖױI0C|eEblݯu[g+LhA<: 2Rx^@_;O-LOCGO7a%nFu[ +#)p\6'7@z<^V0A_H Uɐ_g/-b@?Ȇ^ˇCr$UGmy `J4QM#s?`$~d*p![@TE2UIb M(0)m,8>=]RڋD cG]'&n__&#_iqEZ.<NND6# Ɋpfwt8ѮZd~Ҋjuٸ}r5,CbU;C1IaهȫjDm<@lAǼt!h[A`ѫ'!>\.\AzA :45v1$Xe*N6Zb4 G* 9 v{#>-HN\vd׊|u}|.,EuU)*.-z*hE)M|"龗peXi+w!)55H s-M} QD8XlIN('g!I===#&!,•]s!bGoRqzj[:#2-P#7{O$e #}b;/ s!kd'JcxKVU# 諫j@32L.AFv[Ҁϑw1^$왣e3Gdұ DRsKmV҄}(' Y;IA!5G8Xfu<,[G12SdaHkǡh<1Qi+^X,ٌ箵4'ž$k1+9_&'L\M7uSm&O-'hm.>"o HC~si2XC388;CdMx!a4VGP=hQ{-Z72*E:6CQi5cX;p}'8aLZҋD4|3E!P"U.`o)+.e$ÆhO .컈&Vj=a>Ro6 7hش3<v30wiBIq s#W$K0)/iF}= f8xoPB*rGH+#Kn FgK_[053l<> uE|* {;qTĶ^!'G'`cۖ` [}Jj[P .IW19Tjo(Ʈpv=Rs<񄡚*.E|D[8lҖ#N'DdTpm `g-XCC<欵H̯GKM>*1$Zj+zFjL@EInHZepu6OVh|Tc`,@y2 ^_>?3\~DW`4> nţ6۬!5Lb>yH 񆕮&N/{=%e=}©(slK@/y`3" g̀6&\N:[VDY$%cr`_^ MSG'?T;@AK% 8`_'*+PS׀6Zڈq59Ul?2חB}(kHoW.yQyP#g'S Y~XׄCa"IO30Azx@6Np6_~bAad,uvT=wB^J?J7vu IDAT͂)[DGub!Cm0T7׎#I6r性!=q 3,ɂ'ΟubGK{EbG|`\=3v=~{VC;o`px92ܯOصmdbQc+٬ =R0jH:%>lI@ƉONQAǠ5}loHMM“[FAb5 fPQPF@vp!Ӭ$X(`d!$ JhuJ;qt\ CVN$#YHːz/5]HQȨnǦ K}e>x1S;Q/enťZ}Ts# m ے_/[Vs&bߤtQ9BA# qdcklMb]pN*d"|_<fg% mAT=_ up{HhMiyժb,we1y/ g^]6˛&:Cb>y#FG  +"I+" '$^e\,un4zyhk,Z;mL6 7D؛i "T݉ E΅$<"֌ =vFu>کsLm4} ),zG^ܹ!ЖÚi&odWLAħ8[je:f܎\"^&4;KuϿ`tb,HMUsroK-PDLa!L#<\M zta*ȶCLiizqiRȒM8M5qМ:7C&($<,[jLy kC-zN̗.bkwRZ&4u,&YU%PBQ}: S~F`͈?I=hʄ\ HkB[*Мhb;kEvz>jRh@^k  =]:㦍T潁T=p#l gbB`$s3X?$ըJ5taø%ֹ 7́vT a"{3s1f2&F5.MBbwVxq P%Z -5K# UUDYy%*jHb'bwtvG1!XG_<"R-$]9$H-ǹˡ3{=BQE[uͤ!Y"bbHB^^GpCU2?MPұFv]Ә'Gb  ȉLكӟc,]z9SaZ' 4ӆĨ=]-Yb=2bmHL#6M3 "b}!C. 4N\f* {d*k5";PkGi^=#cJɕ%NabӦa-yҌ>">Y9Z;k"b(5a1Rtjd +e+ɂ),p05?`Z Y̘%܉BH<bdxF򃃘.# ho.B#Ҫ,ڈRq=رNh#iTDu ,XP&?ѯ_qg `FfEQW+Aƚ<8ɒ)a'}nɍs0QV<ՍkaU$ytu!)Y`NS;T!5AAtξ<r"<kT]bD_Z^9~?Epg m!I,{`ZZZDDi59%D|rbjJ7舉)ə,Lȱiz=}xCG T u(..Fu}3Co*Û0 E:g҆+?]T8y:tuu 35晨b!a@my>y2lFֻgI0wRGV[}Uu=6*=Duc"pژpez0!=tl #QW[aGցv`KfD lmdt拈|p$|e\}C3QPd%JC1g6 Gw)MPA;tDwpyXy#DO"tOqTԇ^#GX e(X<{rӔq#@w6#?' \3G?{i1b[M,ϪH})a 䧇BΨW{M&Cr1ޓz mZ ŕ +pp,LǮQ@z>)I=_C B{X3AQ0tc;\1f;.( .>` G<)ZJ^Ԥ~U7W)T $($`(L6DsrJxOv!| Y yed3롥\Q[aN{?#iwCKI߼GmU[;Y*?6j9gxϴ8 NVz2'vS}k)hy&eMa ٶ"cQz;aʍ8u۷n"&8+b.N>#77p6,b銕Xj)fXpƦv꞊ẖ2 lC`]It NsL![q*\_"<%[LFǗH+=e,< ښi%f:=?+IJ֘<@'im op+eX/وBQ ZW/D2G =qv-~&/c%ą]|tae\S唱j  615vn_ 5 ɮg%䧘eo&> s+[.slIN+w"h3D(;6NJN 5Ek6`5Ly~ ٚP  {k3?+܋L!:"dwa8Ӊ7a TT1ʚXSY6&40ŚM@e M>+.3)/0w&/|X۷ơܾt ֯|Ku$mXe7'8c#X|ٖƠD >Ű8Ɨ|Fd`B뢛c|AFYA6F4zl3j+>a! ,4sgCl᪺8:13uD>9l,R#ɫ{[S۹ذy;ϤBj l:~+hi2Hπd{ qN/xHtT'@ю6}5|p{v;p|'/ 6Sp,+-%qGwlt,Oc:CDҢ2eq t'OwF[K:–(>)s5C8Na[u#m@-wۃT3oȸox--TfGn|N?KE.%" ,w),BMU^6\*>3Cއ6E̪,wAq2q+rwT|#w7!c}"hR)^ *\8h88$Ž.98XF_П>(ŽT#3SuCCX/M=c{lkBR\ Q (0d{_Gc#9˿}xy|nwpEdm&k"sF@E@rP(fD9+bFATT̊ Hsg}tQ23ygt]Su,Y[XBd"XXX~X]`e3e````qddsb````]`w͔EEEEE!Ò͉EEEEEwA%V6SK?K6'XLYXXXX~,Y8,ٜXXXXX~X]`e3e````q{# 0~DzM65jϏ"Wm!.}<\.\xF8~Ɉ([|?7RQ3 wB*a"2ݰ54vR?5Ws05b+j[D>G >NF0q1oJu֗bHXCNFRHȫ( RiGaO\䡬eeYX&z\ʮP7^\M;]~}T,F 4FZؔ+#3`ABJFX:"5tR ѮJxX DL4 +&[Uc -uﰟi ])QxX*$-%u]D!ռʨeMRF0^zw36d CLDE,g=*Fv~. /]qD<UbPZ =d\j*\Kַ섁&^GU_¿J1q/d5Q(1=@oo )"Cg,ل}`hE \|BA3l4W`y)*sA*m7bY4^ʢد<4}~֏p/_V~a1[%CSVA>yWFUk~f?Û().3 r>!ОMrÃ{mh,G@OdDQ{V`ʹwI*<Ԕ1RܟEEԖXW7Bl4ZKoٛ"dg?%LsQC#cϔEFLuCYq> QQrfU)x4!7T KԷkyIck4CLN]XaYR6YQ$X"(^u`St=q@uR)P0DQ#a49.p)NgMPtN-􆔊P+5]#dm/: a=D|B`05k*|_{(?d?sZ/d&@͍c1Pāg+R J_B]E 6p|p; 3][ j2pOvjS"LcviAgT|VV .mg _3XxE ^:l yh=JW,;Y d! CLI*[+KHWW8:r!oOM H.nH{qq?M}oc c3,~ :yd}Ux>>^03Ì(nyA+ɦFXn0}T#<e5|,kKPwDu3C\ o??u yl=csLvtOv%?"Wo{%"`4-_7| dUvSL0c:TyQU\<;>վK֝m) ~9Y5\ŹP5ƺp)2ҮBq H'ػFI z Άb q/*)JwX5 JiI-Co- २~ %պnn?7o`sFIE^h`@ZqD1H(7Xuk?ӸQ(Jaκ#C.n֕ck nd!- >C[X46x$p{+uY,>&:r:;]EwB`d}9 [1qqcN:Onέt_!|kIrX[n4V#%2HT[yw,t:ŭ력0 kqmu8?dyѵ04Õ(J).Ɲu/16s(O. gEz+ttҊJH`NmO)=3b2x*F^\̌fn9E6}w8*5wcI$y4N?kF"A kHwRD.pY%DDj$^ jAI=ڻ 111XjBmE*'SI Ul +}V:z}pzL -n:zbΖx^k88JnTSj`Z)o@.:x.VQ^W A+yJnWCvmÑp 8qtq=_}ƔXSP'DmTS 3͔Eڇwaeē7 B#ھTvPj0F>ѣJ(yjiS|$)cH,Zl_ j0܄f$j N#)ԚBJ p6ŚhyL f9va\>SrtXkyY#{^A9GEElyd3԰F5-5Ǝ>x] bág7HMo?c x.r 9o`B(hHz`s;Y߇ 9My.D 8Ó3A/9;wȸ}oL)'6LW 7xAT#.\!n)M]dʹ'Oq]I߷&%Mct<_e"}ϫD0\B$*ÏH*ڱ` ^b=@;FJ5Ԍ;#L63cs͵%rЁrEʬED\@m=X+M^5(̹ifsB!io$/PmYHZ#\xO~LYTII?ÝCK 5^ o-{!0fd^Jf|I]7+A^g%R"zZ[vC] 8#c1RDkW9p4P I4COWF^Q2\Pw6jyк"8$AA󆮒/?Cp)tc%,ـvfQp$bx=B( N,\ܯ,æޘ  *+_0=< UTs;Q-(b'ÓK0Nd][|6D# veP[ő+IZARsC*ICn R3If?rZC Á,Z0Y܅*"OpܚLx!# rۖ!cC8~(ppFuT8Fx7]l.=M)b> |&chiF@_E dU"!P᎝ۚŗcċ3f>&O4<$*@he#`҂|նpVdzH)]Sxx<3X W 5M$Y?4-^7Oơe|UuPWc,<8 ?w<5g#]ĜLD ͟q3l $I" }iAUub\Aa2MԮ9ps2/ԐIfY'{ iD+Fo\ Y)/QtCc񰄩O$% H~{게d7B+ =G"YٹhgIɝlrv(^6DC7MN }q|(9hYW2dmdmA_,Tp ²xUM[6,f i]J^ץ&U="k#M x+&b]%ڔԐ ^@yZ?<}[A{QV"ui>qq*=BI%CQYOF5bo5WEC 5 b܅bb_z>׏& d&u!&RxMvֆ(+r簊y j8]* ف.r;z6>ž\@qcZb,EJptm٬5pVQfq^P2R;TQ3!㈜q@ t!\"VcX.Ohvh{*VOBI5(z #޶&,>UVS c /^/Dza&rę~b7"Q9=+9n0]Z*jc]ɉ}fM qΌ#eڍYuh,)vpp8Q9.|RÆ㟠/ZJH7r`8ktq%oL4 %ɚloHUsŃOmo_d-8$zS$qDJ*H6[yN竨ExMInCt/DuߐIP 9az*س.j2L`C΁ËQE%kГmoۛi v_k ?SݯFCFAdӆsm %8Bтȋŭ{&mk| siL ]O"׍[i;W{Ʌ\ɳQi.^&c}'<V:_a;(ZFX.64nxqOxXܹ2JJh6S7ʪGIѝ8>JSpK!ُL#jœf"BoLd y8B RNo=kfAhҟ(l,a9Yuy'sE`~G; *}gY3G6[@5#xo %^% &I4,:'B-y5*rR ƑL*\9jd%4JlzC{)VJ)"8zj2 P4 Ln/9 m8@.Iַop5U $V-*o:Qc@U ݍ̻12ؔp?q7W>&.{~Y6FJZ  _l9r_VF6訪b;s'Fw/sۅiMEu]q:\mNKfalԉ{BYv58/7m֍k0c 펫M{TΓRFs4!vbL ·>gBZ$~~D+p1ԱIݜRקd8h{"s(s6TQm\ǀyfhиڱ ^d/??Gl56^E/5=C\"7,5+3La>}&r1Cm=qqX쀿##ر2m{nz ߂$g_hr0-{0w+di j6R̰4٢ ')Vr%NfǮ4Zrt E { ;0+V҅!0!z 7uG| U/a\XҶ',ڊ?7 ٯe=J=iθ/M|og;akeJg`G7$\L$# fd?1fХ L,0-w?30 ~h`44Ѕ[G3iw*^Drf{z8mɤ4v M-1m3)9.A2-LgpΚ= ȤRY2Nn &]vO; ||,읱NFQwD7UJeȴh U g<֞8.'wcn6υ?sb5Ż637ck .*DzEED%]9CȾs>^X 7 "l+$ҳG" 7.ka)oeوkF"""߂KblphN[uغk?*Sh6!vf\HC{~#USz˰ U e`"3a\Õ;6>l[ζEEgC%럭Gtdu)  e""""!OץlXXXX~6XzmOK?] b````gQ=,,,,?,Yt]6EEEEgC%럭Gtqi xxx6@ψ?#.8sQįw# 4OcŢ9" '&_LOBÀ(ѷ vQxDيwS(|a(7CjSr?!-E0K}& Ոϒ0ߗ;MVaD'憖/na~<qGd(go%aeb `D(D&ͣ("qS GN!,$ƞ<})˦%q%P "Y) vX?{v!pp("/Òn0Ad8yC X>y< lX~+[Num,  3/x0僕[?<Կ;co__/G{/ĂY퐸:rCYB +9"!0&nk sH!|& -Kqs cA"**!Dv %\F}r$BCbTmGenm0hB] ^B>w6\(Fx|:#SXWظʪT_2Kc16,4jigb ̿xV3f",zP52qLStUmCLG``'cL>Ys:vva拵1` }[w<f[_W ,s%,=5Eh:`Ez,mu8@ѻ!oE0$Z WUm#P䈭gBWϱsJ\82{Q_~=:{Λ"Kad`ՊRQG=+TE9ر^2Xpq]aM;rr7ľ7#0fNqk7rƨ;vͱx9-ZG@[]J8OoQ#7*+BJJ JIjVB4у T8J YRJCEbDBʙ1*LM&~*"<#VA(eshu"&.M;4tus%adm9>zj O;0IFC`bpwoN=*iLE,UJ\4~,AڹPW  %Uq ޿A:'OFP'[M{?i R8wu1qlp_8G }L8e5pfXVρ* ?h8Z~0 wz* 󇫫@0w AM{74^slX ^I40`zo2֠#jх!mqx+^ NA!-6<[;2k!JyG]ٌ4堻ed}ȚҜk3"r:&֢A+ZUTE:hɾm'IDATKs&3_#C'9CJIgߤ5CQ <%KԹݯ)2 g,A+ۂGWAV)zXni\4Ȓ]J0\*ȇHfh+)bgr?{ْl| |$f?"0f m7dee!YZie}zTo15dI2x[^6|(m[6#)6J+(\lDGcNQtwص28:.YJi?b%-ui<ЇƢ4L5GH\"?6{ D3L9o53;8v&GSO/ZjaMY/_gt50(j9yw?g6 N:p` at ƛɟP0ޑ葘̤DKOݭu4 v'޸ۖAGYO%%:WAĆ((DmS+n͆4[0N\@Fj<'A@gc˸q:s"`5N؁cgPE`>MPH5<{ zP43X5(R]v~uLp<_Wx}<ڳw aYJrrPԂ:0=p!fzn5lt eN1T p2Pөhɚ~@nN\)097OP!A}8͌DQM-Һp=q5q &@;"kV'Jڸ%DwWXa1n]>[ FQ!(0 i:O%yuu?Qg ~մ6¹'b@WC^ |ٰ/`"icxx|h̟"e`byzw" ~( Cɰ )lHoȵO?ĭ[q=bfW_S".!;2/I2RòV4`l`M}yb\~J!kw"k9eM"k-Y7Ta>|YҜܣPа-0FwN쯿!|x v RrWRc K2a9NE% q!M -f>h[D'BNB 񫠤lw!xh\rڸ\%2WkC h2o͛7q Ȑ~{4y 73 DO>z8jK~20KEwbG4"4Q5;eQȺ}l޶Ԗ9PQՀ#la[h%q;qN3vWo_5P[cw):MQ+Gȶ(V҉NTe-]sxi¿ӈ֘b|HB?{x% tnm -k<gaG`d}i `_wUU(*.&I](I(/UsoY=;.dKt٧'׏ŐÉ.=Zp;Wr`ʋga+8Ã#%LJw;hXȺStN$WSNDyuP#ǻwG w8WO=58oܦO''"%O]x0e 8y$E}4dű?ήEjp-$Z\ :N+^ > )5c$*2)TaO|L7/@p>#86-a$$8kcT 5\wC8y>Lޫ* ނfm h d=8s>5-tfXjC5\/LfѢܘufpliW/ 2? {ɴΓ 7].$Mo 0!3VI֤AP7%b_% 'ahKA(Ҙqh#h({,oW 3'_\}͚/&BЮ Z'/hYI6|5B[ a% ^Uuo7`nrP]uy8%iɫj(f|mN_Y%=\x$gzk)9h@v/)E'@`Ld=@f爐M\CI8[ӶCsjD09tT*Oc [(Rq!{yLD֕D֎*a6dmn`9 }`B*Kw I0WBnJF .5xmY#5WBF|xC`! ~1xA4}BEY)n 9IrkcjVDW4DŢ<뉬C8u&U"X5 읩BM n>&7d}9hiRΠIY&;9J,9ubs&),P;ibù+b{*C~rtf~R=4 w/2#Y3ڑSj1k\LTC\= rDjv1N_Հ߾{aF6kZd|9P&dzDΜZ+A!hn%y/"':񂖋uă^\)E*·).%f[CmmhGW^%)\ ]Ŗ(TW (ZsXOIɬ!1 ił- X~&DֽnC$;7˘ |bVl K, 0Lw %a}dz7|U.* RI)ΡtF\/Y^-5=Bo{^I65- sĬmg%_{;phԍ'#v> p,eW5ͺ$M8,AM"׽ 1n֑.՟Rֿ<%Y%)ϵ9d@6p#.^'O#1ROa-wYh@O V0wy\Gy%|gBQ4Zq?Yݏۈ^ pLǏW/Ed_( vHha=䘙=+_q|澎;VXngce&H|qIb: Z 8G^89ىk7|ݬm|Sxxı":?a:a`%#'7vDAIF~!ޚCH9b#W]U|0v> o{ fhj >J:qrG<-j*~4qN::['_15s(ʆ@s[LCzч-gzs5D>I$u-mi #m()uk f(!l6ڳ-ޥsyt du ޱG <G+u M{Sm`nni`j"T~Ϲ| !%Hbhcv&r3_j^}KTbp:H4iڣ 8AIi}=m (RաgИCX oQ#>_+#YpjCtI.o ;dlƯd*ckl &t`feȵ$,>|0[iV=nCD^&20w -k fN%[%c|;ol?f[mS@5)y-VZW,h-rWE_YUl^eBu2ame>V2ٯɋZ틅$'3.m' q뷮 DxBvޅe&)x0R0u&5t@vY3؈m+H"~$H^o-:*q/lߜ5#vWp9j&h"5Ոߘy4KC=GI.B{dg1531t*v/N:,lC|!nrinnFSS3NNR>ʹ-nbAW18 \̞־.4ӡL~tȋ+Q.Mucg^t`kim9vH'(6q;^4CG u_IJ~"[hp'a:lk555%$f.S'.Y>µp>~:9$Ftqz$^²EGLY=T[W@/#|EQt ǜcMy1E w-T|wȚzb,h P>|A \rBuu O&,Em`ŋͧ~ߙ4UPZ(jC=ӧ,}wzN$ I>a-DhO3qKc9<ЈIL~:Lmd\wW'_$DZ>̘衱)‡)_t%ga1,,iTXtXML:com.adobe.xmp 1 2 3 0 0 230 318 1 6eXIfMM*V^(1fixHHgnome-screenshot0232|0100fotocx-26.3: Copy in Image|fotocx-26.3: Copy in Image|fotocx-26.3: Paint Transp|fotocx-26.6: Rescale: width:286 height:207| 3 IDATxWW\Y.c}Bs\: kFi~,e@  '0-,r&_d 2p Lcvfrܹ_Ծ;-f}C'5^^n@\\LiT㯝ݼnj? 0gwc">gG=ewcC<8L!/i$;dS4chEooƘVyX tQb<_?~\Ɔ0:c:oHh,;TJ%(-.DYi1*++܊A1H7j_m%=mhn eŽL龏ut/k !+6ޢ0"P2Oe\#&FswT:Q0 H@M[ ^Bq^ѣ<h+N՝ aus|xn4-̴}EmX븧$nF||+\7׀G\Dg;tsD_o^\RD\Y/MF{Q <}C|x0b[E#~Wo 2:A^qEaz C0q%?݀Ҭx7d঴ .\ O/YX+-H9^O{#tR[ô .17Ⱥbp'RߠU%(#kd'xB9\CQO'jWdp \eޤCy\TA5=yH8IkEm['FڶeÿY_<#|$3:EUP!ʇݱ}1̀g [?#v.^/Z>o:Eg(C@sxZPq/$-<#ePu넣;Vx_Sݺ_/]~RxBwo/RlIC-t <•9$O~Ҏms]Ox_D#~S3czF$?s&%2g#e|>gOhj 0 D |Fg=-i Ge_Ƃ%ZidAN xY=̇)3LNN;Y!@;[gkxf,?? }@IF3340ж}CĥҐSՀ)v 49n/ ]%v.opbl$5ɞ4t)I;dpٴ3ܵl'F>Y=;;5 ViuyڱՕE{Y 쵾L'\ ;6~g>Eӄ>T=Y^pr-lg)9he IoB2߄px8}| }jKD;gفPG8!4Trd?lgY<=A 2~u~`ɨjee0>@Cq|,A4f!ʵ{DGၧ3` ב$w %Hyhs*/^)2OMN,|;<~q9503l|8_aA4g@ʏ& $<OF!< Zr7p^ieO־!ppp:1HԆ( 1j̫;>Ƿ3>tHݸy2En&{X| }%9O)`]S[z,ٙHLT?|pWm? ÷_ļ |z`.6>+~c/_N$E2? 2dwow'~ xeK<<^ x%Qc3ck0d E`vz 3ӓґ Vn,?7%lom~q# 6 |x6װ0?KTļH?Q4e~0V!,.csce 4y iυ6ܡ??wlLPXeҊvx%|\XY'mgj|K~X?q>?u&?Ȕ?x  f>?<- Y@gkaq30!tMabȨʖ"8Ս= ]%αg(q\FģD+ꆖp@"v>b](G$1.`n}A]C_<-h>}8gVVW/vkC E(t3`q?U [cdC&̠Cd.,n r.;9[iFA~ Ml?u[^Dび1QI@VhAS*<$jN nZ؂w71ےo[{0r ŋWHk֖2 õqQJ(o B6'ᬯ*L/x7X8x1 9%'M,0v0UWN,vv1}(rԱi24@ u6U]rQxYڈֆRAI-sԏett%:ICh+SH|*xSnԤU8iD x%qEQM{Ga$}ôW[j+F+`uei4ک$:c@x4Em\ C0KDEkڈ4 V(["?xm=$ʚhρ4ʱ$f_JK PЁ20vGfe6Ɂf߱2tL4<#ٮ%ئ3tgV @xAmR3[en@PU(Y((dQdzj;,R]`I <fpKߡgभP3Qxѷȁ2& [p~X?p9S9P\-̋H2Q8H%M1wa4:'Sz8D יgsv*j6%sKAgcM7@Nl"{&97k >daYݝC"{q]eoUX?ɰu<,(ƚfj<9P ˓x dG>nuNdEKrbjVy4,a%n+G8wH|h 9^6gׄ:yӟ{Z,MkI E Ht/xCL!4[#HuuC%E[d }>]EAY箱내[iAC;Y!?ŀyk#,gTtW%bzu^d3KPD R30MI&j΂" Z")iVI(jίx+̹*)x͠n鏗euhFya@]*vѨ'-`#4{N`v8k<͵9x '[h=l`h244H(h&Vw@BUACԒ{*&6'b}ࡱŶ*l^Zϵ8qY6xyVrmn@y~%s")rBm94W ~:KrP&!n?2<7nmYHCVE6Ϩ %;|x_@vT*6lr(<; <[Xoha:Yڲ2OkA9,)t&6䕔q Qaڎ0&J7$a>D ݡ$C# I5sTbca[(%ߏ-^vxt$Ï/ga, rup;hLn޼krF~#=enUIz$cNMu!7zCd~1EyƳ4@VF߂>`9aw@iO!ƻ77i32;D;EX1d$pmR64C 4 \O cx]Ν20GwJW =x p4dԍaj΀$\v?RlFQ@8&1 :xX/( #KNmQ˻)P!ӎ.Kmÿ{GQ^oQ;twzC[õE@uD9vlRy0wtt/շ\b'~ M85%2JS8:VxROZȷ)pGmiK,M559ifj^%cm~0n7m.~޿̼x$0kall`!j8is3o |xƳHQ[}L?{,s*3xS&q|xx(;_Oן>^;ʘ /^>  |Gaq*1~?.i_˷[ Wr=G-#2 2Υ,=6PxWU{ j#JSg,t^):r X ʝ¼jhhSxz"08X3tM\<~(fuL޳Da~ ܞflv)l(QL "rDKuk¥2%F2AM"1&Q# 2޵yztd50Be ϚRij x(ٽ`+2o67ъhkEtBՊoe%юPP1E@J9zǦ,'P8vQGaVb1@ā( "yHxc +ksXC5qCN Y9P\8񥱰 G(&ZE]`AضA0 HG4*okSv:l_RYa6F\iҪH>~mN.#f]Sփeb`^FN1"5"}EcG"QP-eC'q;L4"tՕqxd)Dkpj5hlY0YBڅ axX^%gТ$OŽ"܌x^SgSDjdEhC/`B(:64xIJ𻊲$sF=3jєZ\N a@䊌b{a/*H7hIh3ʋ@v6WN S< g Õ7R d)K~}.vk$1}DcH J\MyZ>):!˱:j1i :iiZ+ hKPM<).0P|c_o:@AA*gȂkMH'b5"{NdrmuHhEu[$w2^,=Etn3KD8U(Jql >\sJI+7),iwc5Q 1 .)t/lfax*#-!e^bd*/߁ pqqH/Gm YZE0JGok>G;a:bXD̢jrLE] _s|}UEp{8LcJsWaN$wsX#p[<09 5P쒺Z{k0&bg;O_"MMM E*!yV` )4u)Ajr2^E-} 2| Sئ:YՕXk9!^^#} =|6W f;'m?hkʾ&1fjyƅڰM@Ay9"p4$$cB?9̀L6%DF7B"LjjѰ4s@\e?.v<;c%zݰRюGG|ɹ*"Vb648z<9n2F3"Z(BO3i絫,nP1a9;s( )b$-!/$u62_z+ZuA\I=*Cژ&l[6#Mdd߆YP{3(5o |< ܠxڷd,%ZH^k m 3BvGCH(ڧIEo" LUDZ約~}\m9--˄8_ome/|k|URYy ta.R-‰KTǡEڐsKKc۶z\ɉ28H2c(BTfy6pY#DٞFm⹽nh]lu C?aP[BcZT9w(5&zC_U}G>}7u[j؟ <"BDG#6QyoD1~L{~KDIO7OՁܽ!L^~-=^-qB<ox1)߅S1L#ɖheMEG܇ el͈T5Ym^E#wvYc_da+2` 'y s[eVG4+Xӑs`oU #<}<=ў;τ#zE.mH6ܒ|(*4\=Ey~rCω%Tf*w.5uxh1w+J1861bxj _DzAP $=!z#vgUH%.QuDUlcؚu"+ LWb/)@sQ74˛q]&Ǿz"lM*rejb'+9#lsva&pXE۫h vv(5 {0Ps𬢗HzO㡼o.qApq r}(q9DJ$YӐ7!Ä~Q!U,~3h}K$ -"1$㸵6|]]dj%3\!B?%jn $qaB"U W. 9A!xl faDvVdyžxĜ۳}fQ?/I#wP20 x 5 {HV6ϫ'vev ~n}iD  H:~)\e7%OƳف'o/@^+z0s5.Ze.O8xR k e}7$Ua^ØD#,UK[`%;A ;1 g\GhWё #b֍mÔHVyzym_Nk߂bP-gqߚDi+Y(BS<Ғk/FޚA=UtIZ6SALl.M TނCָh_fDv_c 4m^w -MOK-(S#fK`:6<:yL1i.*a 'D%یt7(C\]SMZ⠲Jqw!/&zV"ě:Qܰ:{S0.ixC6ainA{m-5p1*Z!D $.$~ w.rJWTS6)lA?)WP^tMGٚMHۥc ➎t]6t2%ueHDǣtTu-x).l"˟x_@h+*KgI\V@R$6woAeC q۔K^ÕO`pFBq)&Rv 5ëbSxjHB'^y< -j[ w 20ޖ2HׯWG1 HDHyF)d`6bzh繢^Uk+ }/l dԦqnP6MqNI\^Eg-nH" m]ˏ& |S1-} ׌FkM!D&@7rpU>3G~#  pTkd 3:gȗ&G%ZЇ 6O>tMa|ߑ2tHGe3ZP/X[݇=Y 0ҚrjjBRJ ԡo,L!B?㡀jÈPЄ?Rj;Xw3hntnHW?X%0thugfxv x/́ D WYo=]U# tz6p~@X&,_% %O] &^1́O29+Ml:::PӦgWh78+Ӏ.Dz8PQs}1j[6lLclsGU7g}S$`cfs IDATuFZH.D!`I K:#c[; "jݘE==p.\'Tzwvuϗa3!ݹ&:ۭN ]LaQ>rm!g$Ӄq}tvuE0 ͙Hhgn|hAI,tX2Gc͕30Rw>66 ixw7152)L Ǥ(U<,T,i8rSdc?>I20xV)HW˫E$?<“tXp;ƒ?ןC><>W < 9 /h:xHK>0zALx~9dXY'< cQOyxf)F(2{c'X`|Gձ#"cYv}5%Ư&/?.7.{i=e8msb'co<q1g x?njc s3ܮ?w$_Cb@ Qya4qrs,00^`5Q}`/E3`8?n#7@K;DcGog6#+dPz׹(G4m̍ |'#bygXUz~^kiʞD}U d#+'EUM}˖'Q؇"|D>\ѡ3d?G)ūtfR4t cQȺCi* +%Wfjf6j1)FNU|ޏ0BsRFWa3Ho4՛{NL %2X:I E[WJ񍆎xTIp)DK *HoPaL=7A}y)Z?偽OoEdZD[U):N<~ !n\(R7w%DAagRO)= [4O"MRwo"dZt8է>?aNsaz Na+fg|OoCVv0b*:DXib 6hyW{0 Ask[ܷ9 9 4xib+BhЊ}3k#<2k)cb_D}4;*HȟUzBq^hv鮐VtFG4 9݃pc{}_i"(UfqAm])〇H82iSp2ÃW' pYtu]P-6WKDbITUe\ӗ'(D9Hg(雤x\$P6-;DWPb]DO[;&I0@ח&POAb t25z{K~`w2າRZ0NJn .=Y-(hj;5-T&# T:t|PMZ(9[+w#cm_ ! ?IŅtߙUYق fWAп?.ž&XiiӨkP4@Z= `omAg4w𚂸Em D =(zgL6"\M3+MHAV}/z+f˷R8y#"BB=|Br+Ttos~uyIx E$D/"s"#1^.Io'B?"[(qR;9r j8xt!A4ChO7INY`nD(Aь{6uHdB8M\,px4a~kMt Փ}-Jsi~p!2WvXM&[r֎CF\CXS _|[Y!lʹR$(Ư3քrGim2bPT?*%$^8;iʂ~PM{p,uLу]h^g~;Qa~loSuy4#XſMFqA: Ü&ۃGD`ZT5r1GԺOa(6HirT|)",=!'),u%G7ZJP5O /qBacJ, Q p vW&PJg;a c(5d.gDl:lut S+@KDZUdY}]]]dH $yȀ@B{ދ~xs1:$d|HDfkXyP /9RnU=DL9sƒ"TՔ\hF^UMCu&<|FNx(/3E}ooE<:WHDN۪45%S_<~DSYK_ڝϥӗH"Ff/6', e™8Kͳ:Z$rz. ~Ei(}SLrfq ?]1_84Ʃ3:WDcG(&OOZxjD/rE ܠE֫a@ᆔhM2GO;){%7a1:-x8C6[O>S$Slr[nK P밳2,..;;p}BM U<* l^<6 SW[#Kq~wWCxx7K-mrUXo9ԉO:䋎XY"lHU!풨`{Ε%XMER1 tUmW Jү8,vn]K( &`wnan!</* D,۝pMLAUS*,\ENqi9'"gs| O75 ^ІE)r{ᆼ)Vto8³Ƨ8e/6.C{`c`Ȃ~ ,Ӱ~-,Nw'yxcs OӗI+&DMb)ın "&za/,m~ .  \G|K-Z<Q-FO:4@PF뻡UM+Z*nW_VYjv"7HX^P^Brx`_ uM!,C*c!Og+G֗a\ XxkSnLX]l#g%.(ҧ.0Y&<`B?\,TV*!yp2TDVeuy]p *0ńBx>-*$>FnTk ;.{E}|跎j 6+ L';f hR+ůRɖjqI"r5Itc ᰴkhNU@&Em$zNRjuX&`NX:TKe<*Y}DV \sقw˻g\yWx6|g/8ngok5X1UiLio'M- +o򄏳L1*9pߵx}nIK}QQϞ'!Uw.DcHߛ\=g/##l ٙ@#'hw@$#"Z+i,0 \j'NV=} +z'Ӝ'҈j yV?^xp[gF+Rbj@ s&#Rvk.Yt2_v󩄇И [p=wAqDe"I̦_"dt]>z=5JslRn( cai #>X?Gb=\5w?!pW As?2L",tJR$T)~x'x£ma sr+JJP^K(K%jCբ}hakZx[!;ȖkDsm-*SĪ*[6Xr:V(dkkAeYr_\N.kX@Sm^qruV⏛IH:ː[~ߝFIN6*UN#%HW>2QG&kJBAyfwP,ehy0Y-(]Ԍ,7#ɨzdb{Y9ܼ6T189Nj %dpJ\|ݦQUT,4 +ѽW> ee =5%{WQc$K>}U֩fߟ;^LNKG&hES7&DR\d*hTu0$T]G& QXъFe"->̳~>Ȅˢz!*g>bkKs:.zdbo f2]PJKK\U5D?GH7zdUj:*i0z)"\ IDAT#MyȪ=Q-~DBGeoawCCw@?JUXV sciUtu:6CM(+s$v"3ţc&g&ۗ7VT]ɟ&SB>G °TxC_hr_ 6] HA\|einFN$<|WBcwc K~ܒcܰUOCHq}w#ۈ)ۮ ZCܽH5}J3œ^;XNNat5IQ0^Bu'{VNmyp~YSo?XDnznvJULXU}EUWk, L.O r~Y}{)Hoq;E,Ʉu59z%`,~Wxc.M;(4&ėZFPeMV,<@cGeLJMEԿ<|~0A-aK/k`BmDZ#\ u-٢Ғ[bTKv.]/aeҼ$6}"-ɱal"&j,ɯ_;w8ˮoPx@y,#o4:&f001!2ht$L}wx0|+-iQd^ryG*r|]/G <3Br|]'[`gdz>с̄HcFՏ:Η+BnT2S$ۘxz]m(Jh" "1KP7h@?%DoֈDupo/![,)ibƵK.zc]80iZ/C?λ 뫃IOG5^ӧ?:ۅgé+*48gK%0OJ-u$Q:#-A”HIǙG./0,mO^Ǚq7/{q Ȯ j1{TF +< /2P1I>k{ʐ9⟒{]L x7 PPl$?{A #';Hֆ;}("cOxiQ MMwlGRnI<16ՉdQ\<_e)Rf8ĒoO^,J 2 }'SQҢ@o̍2/o:4a]'fGΫge'"9Pu #cugf3wCD=NEU$3q:yX5y՝V'3 /=҆}JW:~Ǐ33En{<_8D?yyUT%dۥ(ȶ"H]˚2b8_qp|9w5RX_ϞqV I4dsnd^U('qa8UT^ &F%<; EL|20lbY<6yhߵ 0 QO1ϒ췧'g-/0=9➥i_pZ<*yo9HE G^.mݕH% ^tbHQ|`N>1f ^x~vJFXLYC W)xU)O 8chmq\93G*}|o6_؟MbDfUweTEN6 Rȿ6swpB5;0SLᎹ3CpfL!Մx+Yaga+W_^eҝnDx-D&dp8\ ( ۘC7;q)^c+u0*YݙF }dBFr?\6kH$$sX$0ݫeӵ!t HBL(S"i^<0{ÊzǸ*u³;ߊ@{Aug I$30%o6p~!'unI"h,obI%\߇iiCNrOP0|`b'=X:ziÿcG$?ITqo(Jj<5ަyzM)L[ g~c9L $]z ) {VY,2XW1|Ʉ*MZ[/PϔkBdHuөJ< `c[kQ&:Q@Q>%ڇ;cgs&6gÍ@}$Sᾂ |쩹y̎w"Dj,S?SDx<2ytP{<'^7KD_~<9Tsf,3_S#x>/g*^%$rw Eqۆ1MH l/}NP³A$4+TbbFr>Y) 5 .q,'Y)=J:BxfQ:4&&0Og }ET;f?^ At55Ǘ{t#S_c-f!XG,oY< fD#.^3Bp}3 l rtFDj႖; 'tkIJq@x6Ⱕ!eq.^VIyJwzr>n:,<A&!;L`h=\xZrJGT"BW(2Zq2o R%2\C9tӱH71tKӘ m 8܁Stf k}]add,؞;ӹL\ KR Qj ڹ$DW~Z;; }∳ZH!gieK}(wu].&\>)gok3pYXm̣D?éHBTIθ.DiJSxViGr#[5 ΁;>-F2>H3C6e&[B%psycj/$sY,6nN1JH]F]h#kX;e /?["mtA`ɊdeB r] {\g_yebq-ҿ5>=OԻw/4y6I1݋\c D&LG{.Rѱpn,&BH BXKws6֘qPb? Fpy Fj567P/OQYDn5QisE)ϑU塢; d%P ߅E?EjY ƕ_D)}!n`=_xFH½t8f߂9rA]"5؅%p6M@H>O,SǨ;%Ol=hwK:PsszKubFaRZ_րT ׿UxJh$χG⿷MV?rWxd4Q~ꉲ:vǹ-Oz~Ԡs,ET8gINO-f #sJڽ0غ,Ky>NI_ҷֹV:sY0=VJgijM_{!:nJ~Iv\/Y@1ph@,sɛhmFk}"ˡ:7ӎ9nN Zg# ؗ2QAqnOUFMRQ-..Hu~)"C?xG,}=C`"ϋ|E<^q:F.Bfjɂ+;%cXKFr/p~+efbT,P!-6y%[KKcG8[%fQ9'Jr2 v\bw)r=d#њ'T7U-Eexi(޷ɂcGvz:\vFXendW@(:g LJ*[,BIش#;\*c'\-Op\և"_c 7] IRg>>גbo񹚫eGEL3w>ڲ"aź?Q,so9:sjp?M4M S7((Ykk9>8} &~oZ (0fǺcSqA)<Y=]v'.z  #>bn1jܲHmG[[3j+ Ʒ}jHwڐ!2Ɛ2{gDE a=k\|g-- CtyDh]tBJק {yd&c-fX2̣0s Ejihn M2։ q"eE+AcJÜjt1j}M5e7wl"ͣ طn4נ-$9;ik'e]-BmG|gs~ {A<a5:xEe%_]^iKw:=TTTL9L<%%h@MS?&&RW6FcR,WgiMU($M FբKemGg }繚U>p&m%oi2) H^R^o{?~TÝGQ[A}C&gG]]j0> pl '~GHf>TcT:G`j*Q^YLiլs9IcG?5m>71IDATk`4ؠ5s]ycцFsl#nD332)շ=)uDݷx ӊڪJ*Q8ĸc+k54EL-Ao\o7oiAusӦ}~FO<+.Ltp8o6YĜ _O]:ln:$4O9~)T=]aE5q, z,z*v.npvw\$PrٙBՇ\j+@?`ft "Ab;xI\82j*LC#;;dzZfs9Ll`acۀd4qdcњgSSbv Ma)lJmԄho(|@kq]Hxn[w`f'`YRks)nLyjX&r]mT^/ a8sY&n s>S#SBl`nk''joet@ZNH,djYՠלX{X{cBJ1I`'^0Gd8ssu |ZX\ƿD+;9{ iS3Se2| 0d{Z@1ԫϫ{KLxM0Cd7HwDf/r=X5&[sζ3a[[Z.>&V0]g{L[|ZӇ g ]k)${BT"zQH'Hr8/#2)KI=Y$2ig8+~u0z3~ t 1ɛ]E+O?zbHO!<nN`r@A t#@4:9@Nt9Vxć"%$zuG@fQx`4|geL/p moN!*"+h ̢)+ ~hgNgZX,;D߅6!kG0Dô$5S8T "%y>N𼏫PaKG16}GhܰrnϢ<W}P;CTTr/pbo ĝ jAXlޕʶQׅBݻꚢ. ~@\hNjTI-qhBUfSQn㩕Nڤ`F=01I5 :1>%lj&DC0`wY4 u,]2fޏhp9g颹sat$\h:D\1VBW`X"bx2eXjiaz4՝F^(= q|;D o/WG,sɓD_9x^q!oBv.-V%ĢW-6b,i܎Pu{+u1 >|'ED4,Fg[cqĈ9~Bc,RPL@$Z/70 -{ 05,U̙xÇ5gfw.A;AWIUSLAK8zKR)SM8Q-p[W]K8jɟRsr H"#,rLVBk%*ե mxR~obMNy}ܾ{6.?^;m`:K}@ͩ <Q?])O? !`Zc~- л (E[(F?7߃h:%H>Rna3RmC+JDԅ> \w~p:}s?=NEn^^G+, 4% ³$Џb2n/hf&yZp1< #PBTw&p6q9L ȪB=iqgMh_^ 0AbӰxP^ڼxVA]e@~hF(Ux?h* xF'+oL WE(r7n]\ :+營ႎ9&7p:%}K؛A/>CZ^؞ޖ:жC!< 0}``dL!`aԎ `]8d^"){ 29Qp1##"!Mﶸg4 >՘%YsKX8828:S6FP4.Q?C A`fe.26CtxpKWw/jھYD推l$^4t쬠3?Nйkϑ  ˉ{}f~爻\&h=O 0OOaq\e p:pw[չMJnnqF< u1C7Q moLvU=D7X;>D8,胧e1۔[B:88) wyn#XD3 T#DC.n>9*W!|pm2sBR ,&q@ghcje m]!aTn/O|x%PÃWxS#a&< GL~r&UkYI Kjղj0s JT1xc`ɱ{7.al³=*6 |\5O ;`ss"J$@>r|G.Ǒ{\^ _L<鼼;~@Q*+)@7"@|6Hjw[&Ɔ%v sOY?o+<"$OgK=jT/-@ބ) [*2,ʃ>}A!!>)1if/:U$>ʓ; }^",AXIz|閂Y/G,'˓O 6ȝwrƀ,H^'BS[}˯r; 8*rV&wקrm"7d}Jn,<#>dgtEa[o#YxdᑅG} #>|}dᑅG?xK" maeDokB}, ϟpнo@ȟ}n)KKGVɧ.+sҲK,GYxd9r`5X>|6b3IĨ$6wyu)d5%9FYxdᑅO43i6F%B]m5kыel?&Z֏wfZ^,l2⵶"9EK?;~'M, 9vur# 5}R|wwm1Viʩ-;h΍9fcxe!%"]Ȣsd_%!l-l_%dGy ǀnocw{ =~vDZ\Zl.+' Fz-gU%X:"z's ϯ('~9S׍WuKBV_Di}i~F-<ۋ5eB i7m1c-pMܼ(gVW1:{옓 ;8 i'Ҟ*fh|{wp)7 'Wͩ*_6&Wèu2*j{:NQG$(\# ,,80$ %4?sKHasl,a4zlVfia8}z-9ևG,{&WdK6-_e~f ScCJhȷp1= j} s9EAZQ OŤ`> w>.6>RK90,{_pZBx6ek3-t '{yG!y+~wk#m CĚdk^\z^OP79|a}H zCĻ7ާ>:R;??-W#?%6M?~>4m얿fs<[.qZ//~!";? ѧ?*Z/|7ғw (:Zpz<{>41gϿͲ~G>9ꠒ71FB(Q3ƢPE#{'uw@Xr:^k%{wB/cg\g/OccZwSN2$".Ĕ ~.{rqOWBU 33s{$33RJUbfDD &Eo(2R_~襗7uu뎪 ; 4e:Uh]7UdCs!XQH6㔚NW9gHacIpl{Ed`-UdwIWU[ӤEe8>dդ/wRlBEպ2FOp8׵R5{@iX/thNP3Eۋ)eR:TΎ*R]yδV͍uxMDdh.truO=n]0Ȣh wE7Mp*#uU](R55؋6m[/W-4rqXHc dgFsBg|_'IJS5<39)i U|ax/eT]7#$IVcb!j1u3{e%21fc84y ]ݰd!2 *y.i6<4'xWuБFh8x /wqx!(2ʬbf&bZ"a΢Mʩ8_|L>GCaLP DR4 ܸ=>WĄXRڲ tx^_Gg!)N>J԰ bizX5w^8CmnT:yLĶRXzɨOY-nPh.Y<֞W9,:&cOSX!h?(يR 3;DMT""KpE\.(zBι.5muz3pwDؙ bjyiǦ_I*|}pu ˤfJulyfSrVq"u ؞GodÎwOnZgjxtRTF:>5tr{_<|27cXXy˰nӳI箪LyM4cUib"01yWJqLuȘaf47uy\0ƶaM۞e3#"* \T5M379ME^.8giB pin*04OO.V'e >+yrshg\TBihge8W9췕;}s2 c=Zf_rn14x"R\PFἰd~`qRsH%rx0e*K,TbvjfԴj~WP-4Me\9]X\wwx˿l6zf>O`M$xtv']s˧`")jRJNӔ'*"λDr ]b{q͗n>Xr6Ţݳ'ݻԿ[a^0H2XvRRJI4~AR4OgrKToxF碃iVcg&dbZ~vYtM#DEAUu\x{{$jI憴}c$p)޳CIHY@` 3"cZ2i6IpX72:j6|dzm޽EDkk!g_QU7p,rmYuvzMPp`/6$ɲQ>M_UCR*'Dgo݀/ |8~j.4f:] vwr|7r,Rػao"9ཀྵVuP-g,mq{v}|y 'M MӤi)$snQJI)McVMQP5L`wqy1'''vg".$!Ty#*EJ縎 Cɹ\y?~tEf/cs6O.(d;;+9ˍ^;q&snzcRAXhw]rcyz+\6Kb8&G(""看#)j }7ze4y+Yvp2MOj {朤HxL #AFBJY`&JQ548#"%8gEڔc%qB Tl">u|<cCat9ODZDKZdaLP&5@!vuX6r2ak DYty.isְy` 3A~8CK @F (Bd93Y "3#f猾i66飇ÐB E^1giu0Xmu0Mv'g'ִ_~ y~/^]]:SAci~Ww}w7M#k巿0 C4+Tݮ}εk)(x?ø{K0ԜNi.Y"{Rլٓ yXdH`aʼwK_B>,;뚪bHf#eX `23(}@`MխמsTLs#@R1-LDDMSRORRo DX1Ƿn_[H *T9L`3'e@J ȍkb;G6!*wkoAai P:\*Gp eRɈHA m)ؐ{w)szXi{v3643iON]Gާq4=9*&&i"" /VG1FW&3y;9^rѲ)AD 5fLKI<&aG \OSVD$"%8wT`#rfpf=T$'ӔT]g`F)# $DS*@yV'3׳i{7ol<,Ŕӳ/}BEOvi'v•$4'4ԵpeoVu_ĭ!ַ>~݇^|&]m7Ȼ~7kJN%dV29~tq!䜥!jR9J̘iQ#WTd*@N3P<22a؛Xջ'iVM[w5iD!NQ;)Sz o`-$-3P ؔ:+ O^#8dFUg1TD*FL Ed&PBjE03vn?́IU80R"!698iV"daG] B"Lsyj \ؙDIE>1V!qB$>NAJ)*EqșiQʀ8 8,6mm!{7äTn!Rv)@91LjtPR1?Gqzz=j4]g̞}֫XatG8O"b@E+_%e&6)%2@lI==w#&4<\-˥J۩:"ǫ7 9gò:DHt~y.CBDvøq[7y&ԍJ34ޅjW)Qͣ#H4AltY:/L>ƣ!$zqڅ}1lZշn\g?*|cG'.~s?u=i<̳2)#`2պeX1 ]Wјz}?]Wr=>_ߺqmUysWū|rΪw/<$o@GO ^25-joXs&`lފĪR( dw8B ӊ@pιPMI?{w2z#:u*:*u jN=Eoo܊m3qլnyZgv\USNk/<vQS4~Cl{ckŕNJ0G0qUuW^}NyqtgȓGH%#W_U6V?O~Ë?{{oud_VMTJRH3Rc& c:^.U~=;"rUGayLѥP܄Fj~"rΥu8+ T]kCJF p.GgnׇX䲊SDNT&-VUUJsP뺈Z3"`P5$~Yx?S0V~Ų)_ci>xo- IDAT=s˿zfց0W_91?UFHl0:&M1g@״'2,[HB 'oq*En{/5g6xpe"Sa29PpތDDUHɠrU<чY$TS6u AfffG$ف p@Ma"ET lfsJQgc3ceI 1s씤dJDP@bJP(LԠ""Jlf 0"b>xd1+sW1¬蹙` @0C%YS%g19 R ;_yg kRc5WjqSS-W֭_sru> fu܈JU?r_2saEzчPG^v/՜^R  i !M^Sb$sNɌLML ]4m~iJ$Mwߜ7]UxLP:k"cT::!=̌ S";8Wњj&C}I4R0\T2Ki.$05rqj>TM[G3S+"䙵,1 j&h02t{'$)*:O0!}Zn.8/A}l88ɳ ޡ NAPA tmno2]<_ϩwnXt]s~]=h߿ΛѝnnEn܍e1Gqi߻.OlL.ڦ|W ^- =u~lz yv}(bXs1Xjʉ* 4 tvDf DFF\-qҟ}غ2l_7W̫~+C4ZZO1SSSZ.s0!SώFisM);wz;ϺZbLd3"rDp aiK"b&{\J(9"8S<}$%6WuU VILiAjEJj*9]?ZDƱkOYQS⫫Q8D0L']:v^l| AosJr?ڜסURx Wl|lޭ!VoO/q`G"UU%9PU4g mS$y\)E FQQ07ή}|gO.^_7-}\<Μ=S5S"i+Of13ĽHOOk׮ÇaRdڟ_XB)% .1hJ U &u Ł Xef!8u rl8 YTTu!ElBi:4s͌3K<[<߾{KͬDc=c.3W1dJ3|X0(H./պUbFf^ Xq(w\[\Z@JWG˪s6䤭v9..??z%4`/ ;өnqrroQ-\UI˪.=z|W_c^7êsϿOS.Bܷ~W~A55H޲Yf O D U5bf#̥ۺur󔋨T "dF7|_}=iS;1bf`(L{rD*"3L޳c,I )<:X|0RJUuT4 y*2\T *GDFbNcʲ՜3L̘4:%s 614EqPa; Gc=/sUհS&IwōWP E{>Zwc=f4m=[,?R:=zpm%nl+iQm[?z0M}Do'oy#ppRʲk7fQ+fyڴM})[};@跛k%ǰ_ ~irQtyqg't ̌OE|Q0lvb8z=~p?InS]׻q::VEu`fu99 m@DFPUբYED`jDsxH@bX=,[HD@**S?xLIK)yͳD)硅P݆P=2̓wk+&x3y"%06i͚-8A 4 fuJ~;~仦6*OΧqYo}>ᗃiz|>ܿsqXw?ܟf;v!_?G׈kOD`t띷<\4nys90ͨ7-;êj3ÝHv902K`Z#B< pv86!dŊ!EQd(=}Og*-e=ppZk}=3 "* 5H {͠\nZֹ!o_͟6 ,gI%.^ݏ^^.krpx5CA@P᯶ GEUE1WVPE8aeX>œWN# @(hAźW@D8 C==MQT7|{okVTUE b5b1[-IA"~hlo: TUCƘ>(vG?r3F?Lo߾G_1. -XܟMOwl9c9(~bj/^`ɨj44.Q#5!"MItMDCQ8hhn\=A_7ҧ!½v7썿 -OoޗWٔ'YYg?sm׾%KD_ܼi~77~3U!}{~[KVDŽcpyY~X v %T/ .PbҔyP~ Rau&J0qF6gIa4ZMV50*w@ @D`D#;HE3 ItY"΢JSж } DcVVU,l6۝mjm'e^Y$`~҇E0(> ?ؿ0/$yfEnGgE&ɠĄ`%"IdX3QM)C+I$E"!IM44FihUHEI !Zd9$1Fb7#dTHȠ4R-J r>3@fD Bg-Hhv>ilB8x?*nݽi΅_幈D߮BۧnmqƤб6gP~H#)XbJ 24]g`1!B~xai}&yy^:}hs.+$%0D$UF # ZaX% ݖ}+rk!EX؆m=|.]r`f, ӧrgslo,<ElΌ˝Ⴝr0Ƹ4w,$`_e`o$ 0i$@piC^؟=srU8KXE|JL~{=1?t,ƘRd&" TŐo}_͊b}{_W\17O0w볟lYٟI/olD?9Z,},/{ Ddȕ(U.lt+/HIґz O|FQՠ;G/y{]cڶ}dR 7x'%GJ6D{{&"#0^ʢVEDD4(sXkzߊ E(`"wޑ r>~خ!mߚO#ZP&M@3€2N) }pNI==FR)F@C|Xs0w4-FN>2iyɦmx`'\f24CVYʲ nv긙]^Gn_/ *3GS5'~ gլ(`zQ "|ZՆ $];-/=\6f׵[br\DM̺]AYfAD2JyRN8jas0B.-Sd*(d tM7ߛ7-kŋ7 p8!S>ї>sg~_C9( .MaE f˜ǩM) ߶My )ռ^͍L.'mca/0.3:m \t?Sftן[?wXM*yJ{o~K7Y|^<899kw[֤ʻY^m!7a *̉HrIk#t$r4ho^ٟ,dZ&wR(KquFj*]jjCM,r,π,cȢ(0#"]Dʲ4r[82;c &Mdݮ|+WCVc}F~/^`1Dʉ!x0dӢ^̖fz~v$e  !." x/|2?en$,d?o1XUUXSeQ᏾W>7n^iBӠtկyg,O_*/|nv7|{vY鵫7l`yG7z$ M܂Qb1-f!{'}儐a?\|x*s6UUt]%P9/O犄LXPB5*Fe #D^W=`2&VE"R}d4 ճ+k;?L{fJ_S@?/fyL*"`Cbb\[(E$pg?z|joV>9ˉ]M MYdu{'UdPH$0^N)CKb6B䈌QOvk Lr(<$#2 2+E2ZLKƠ:cC@d\(5&/X$`$7J(LF:@XSL~C!%Q~6DpzR@Q C+#ɦҲ.+֢"<>z,MC"z=mtY^wU:uen3 p)A 1K*@&A2cF4pZ2hizRDi "2f_Br,,1T%}%8&1AU9 2f  (QZb6%@s Cs2d8'L@-EI C 1 ai *~V4jU3atYeѣ-\6]G*ϊ1(*3ǔR"Ta4 " s>LՀ9iV1q IDAT6D9&,aJѬp" fdsu`,g, )q(ؔf"T@A2H)8 &Qaf#A]ι"C]έqbn[WfyzZfY]nkMcLj"XnVe5i0UUUCds*"$A52Ȼ75ևeI8Y"RHjrȣJT%/"kr *PIhQD1fD)F&3.%12Yc]ɮy~dY ¤(DSBQq.P kd,!ߧ(À̀3>ݤ*x" M&W^w7^a۟af=rJl>e6p>I]"D(nķ(H3-r(` 4s|FH"XyH,\8Ȫr2H_ǩBD%̃ld j5ɪ|`4t{[PLMtv$MAp u6?z;ćɃUG<$Z`L;܄L}绡K]C1fZWa1 v^. ET0 23: d-8Sf; GǷ0z^]di>$YFB0XǪXf:sEHDdD =ˬC7d)G(;P@znBdAL*i6JR BXL/Y};>|5刚$u]?|x`?۬eG^~cq4}"g5qyyZ,4MZ@FWOUUD#3j !aceHbS+"ᄜ?9fN(R9Dye9҇T2G1&N`:gLή|O^boc,vŅ=Sx`) 0|/yfYV>a,dɢ}fA-E᜙9ڪ$</EhARb!vxUAUQUeD隭!)>,{٥IlUBBD6 瞭j|x{ _ f8wvwM ,@Cvb:DC$XkPCn˫"фg*CJ=3Wu)Ey"Hb DDufN4d9ű3*(C" rcLL(s@XOgӽc|'C[Wd.޸k7z:,"5D@%ţ(/doR7ݳ\qӮ۩NhtJ{6ϫ,tUo?|t|ݼ? ;nBh}B1EAD#CADȒ@Q$ }IR<.MwaL"&h r*"(H&$A!&G>1Djfɀj!FdE# P@g DgYn9r0 cD0ҕ9ݻ>>"+@4.3:[$ r>w;4D$1T8,::H DMf3k@DЎCN@1'!( H1FPTD gApL}T(lTQ8DIE&H laPj@7)=^:[M.jG 'IvMےE"0րY=Y-$Na7mV{9 f }⦩r#(zQj Fwf˲miY fz1F 1t.}@D2.$fb%KfypyJ1Wţu0ԭOӣ4g?ݱ8 !T}10MTBMzRѨbJi]s̝UU%zavŶXZ@QER@TC 2n@""EsxB9D"fq(ʬ~lN ʚH,*ŶW?xpS`UmỲXQCRā Q +@BER"fBeYmظʼ!ȹ P8Ddƀf'$NV 1 0!!s0 b׻raڠ'g|E4u9U jT fum<~=Lh'N5ڟn `1DYn 4|^h18*={5gu"#TՏ}/6m[Ϧ#fQL9ˬ&6)> 1tݢ2c9|03 z*s94зQ+!7Bz2;W]-E_Ta<}tsX,2O!Z¡k&K{"s0̧XD "*{t$5i3xtY.D〨 Ơ" ++h~o|ã'_e5a[y/_xG|>vz醣'g$2}OEbczX(TVwwbx=ӹt8Ty$Q "KR]UcK/$@ċ{CH, "Dv1̦{@Zd7XK_qO/_~ԵUAY\Mks1Mf_/9̙ @~%UG瞹y0u3dj8X\r᝻ж ,Ҷ0t) {kKYGf}C =Da @86LBUf‡?B$ݲK2ǔ[>\d̢Irc!9S5%QLc%vk׫"I11MKΒH:9cZRpDёCQ?#)2 )Y)4"ʧwn P3̞}K{jB;XPxQpR&z\)w0EUN)E,P]Y"ёTD$DQλ|?j\eˊD,߂0Vٴ̀rc"w%""\? (1G\M資wOo(~7sk(%d:At`瞭,'K-> : ݷ?G]8<˗]k9[7ɫ7,d\G?f0 > bUn| 1cH)UIbH/M ^v$<$%ˋʐ~k20K2hn+,/ȸ$@Yt@IiDDd (2{h0scEQ  P伒V!7;Y6 YwCO>`k T.ƨàfRO dfBkuS;_LPSN0gg'I㼜zw!ofPAPTύ Hcy# `TG%49BrDU8?BRH+*!ΘрC2Ʊ:}Oa,D)^P}P̀v}jeFobBN_zPs0bJY3]ҜDbwvwen Mf1ESnY^lROSrÐ9)=|pE*d!$"sP)t%iخd)@Ǎ5#429FNU]UJ^le]&4-:wYPn;(rP3! ,K$"4 C!1Q*auV4V&bowCtӊL^Ty7O .3YeYEHRRpJ{33bU5AD !KAYn\>;nޅfةaWX-H'?(h 2jV#|RP}p.q&ԴC>plgFAR|oSI֐HnRn(*f%>&"®O< %}Υk=ezQ?&5(j蝃 F7n*, 0EQ(Bā}_8.Ulf-N3!mҶ ꒼rw|}vcPՔR4?㺮X^8xL$VD={|JZGwIa,i`˜A{d|2L"f`aH* 6? aZ۷Na!1;f+W'|d]:Q0+y/~aje"Um:eMՍ[10λ 11r`kbϹ\Dn=rl/<*pT (sd (Bf,"* 26RPT<ϫzşkb.EQ" x_1TcH"Cɐ38! CKƠ((i}dq^g?ŷ;woԏ}=||\Te9gP,ϜE43 sNfe""*">(g߫] yg((DFQVMFpiө0e*QICT?<7g?ҐR1m/~L.B?WTO_?şCcCN˳8ubJ(bwo陳fy\.uOյ8v$]yR3Ͽd#'ˬt8A>IZI]UZSh>w\e4~/"h4E?0(Yk ""Y0a6 s$'a!x?p" ̜R"cs"{cUQW/G=>mm~pVtڂȢ`$3 C0SYYC !*DC`H~s,s#ĒۢeUvYksE9`l^"!*"GbHCz"))X `i#E6A& 1(p Da>2iȗخD)J^I%f.mji\S0@7&@9$qd@U !VU)EA !2!1AOl*>, }jtS^UYpڲh\5:E4twJq{GHnJmgud"BbJkR4 L#UI0ԷM: Jt,h$,G"< AzA0D12TǥnI$&y=-*!SdP=K.|1ֶ9b *&$ A$eYuE^m6ޡ [R|vv MױcчGTEU%UPefe& @Q@#0* 7mTPU"yQ#"bP$,[R%C%blY†4$ҟlMU ys|nz"zx34UN,"zEGGgA^&f Ҳ8?xkrūհlVsдt1^m??#y61m8.vەoN&&i=XFIYe8% OmMN*3 0*$6+@9ܐ`Z[(OBed e56(lfs4%mPEqUA-!IIUH pA@)2Xk1)|7߾-J铟ԗh <*/dzh;Ma̒E "I=4[g c/w/ď٤ڿ&l>ͳ) pY2"D9GȢTrְbȪ$9aٛBCw] l-^0)]dtN\|W.HJIQ>vďz <;;˷P˫׮ǘrWMjh֯gdWe75;êj 3{s!i lKȈ/ $BFF  9DKHb,HQH6ݜ}{ϴa Uܦ,lkժW_2dH3m?_}M~pW^?Km7k7oao|W߃1J; 2O0*)`]ɢm1U1/ܹy.r,H%%VKvEQU*E@a𾨀p@Ppsj@. s(T09(7>O<:-ܜXWؔ1dk] Σ;s m߿_gJ]r??vՈ(_ U\Y@62*zJ/oo%P#,B"QV!`t$`SX=/tơfVWUud䶏֗01, c]a  fctV BX2]ߋ;7\UUK|,H2 K @`To`<7mRxz ֠JV9E%-s@h{1cIUMfGs竫WONNTSN)Z3Ǩ"BDjQev0DAa4Fࠟ!QHJ2up$2޺šuCL}#1H]hd 1mQÓbuh2 jRg̋t:e+iRa6])ŜG "ͦO|vν.vۖ>uhIURf.bw킪B3Aݚu'f$c8/ArΊ Y ABU58P2ABF4TU RVE63AB6]| /R2"aa-k'+B?oPFrN3!Q Hr']ix-9 IDAT*v]-Ko"ʢu䶟Ngm׶mfݴuɻHc4d֮  1D(֮~DlfkԘ#*( hBD)78Op0s': md^\))ҙtk.-=?=<]m z!nE6R9mYNUUuxtmkǸG7; @QT Y)ŀg 8Yf10{xo.4G}mc@xTZ?ڵp|hm^{/7+Rkg]];)e}eOx{v?{"ƍ5'u9:q=8{p"ȡ_zڧ>GOr?ecoSkZؾ⭂l|㍣2jLΙGPDQ沬wnG"B$Ks ݼyG>TYr#  \R[?l=(CY$Ĭ*bگIߏ 6mRڿv'wywRe k7ƒscJվ\v<~~ӿ;[?~pkGAm cTrz @@A"a6=  rTU@BHP P@CȠǢR?sq ˋdR" ]*al0,9Ov ǓM_yE68uAvjRv[:c b)#' CiWKmJA K\1֌ڐ }2 67H8 lP @UC`,2+xCXU1e09fX,ɠ@egKJ?? $CQTT AiHfn꺝/(OvÝhWEl+|ȊdU^.UA@b`U9:knZ-=z@GՌ W!dNF @Ac" PIa0kȢH  IDDTTTD DE8GN% mW2r9v  'rDSJ. 1[;>F8~a׺،Д;yt֜wgqw&A΄ 9:"}J|خwO+["_15@툺;{/uI߿uy[obCCleBH'*vݮiפ6'-Pˋ@R1.כ|kf-* 93( ?( 0Zfm֫AtD9%0*YT1 q]XCʐP$)w#bjAJ@ޥ 㱀VcpNr);o˳|v-pV*G1f4޻z:svSE\]ZP ub'O|q[Nդ}9h P `6H B*2xhT0hX&`, 8#%uԨd hRNs-X0 rs* "KCoNAU'gu}T'"tqyo?~8O>:8IvrRSӬEm!Rf_ ez9oXoqe5,9DADgLc;/Wgpmjr45,a8;ۥ%$4}crL&dR vYxX:2 BgVBitZqU#gg(RU_qȐ8RslPYUU hjRJYe\:1O5H1f0r,2IxЂ82cGC*V"%[u]5e5IR΂hU1UUEg>E{ZfPNǾ z쭳j8CNJzt3)ʠ5!DBٟ, Jt(wܩb肂QProZ'"?B\V':8$>vv2v.i׫6 W/k7%W4- /B/7b-ɿ[v n|kn5SQ_~bA0gӽwpoJl/4bEq|Odd^fwb(Fx%TLt+yNi47 d@H/OK9_VUCBD1h s4s1OH)DffkmY+?OF^EEUfJbێG]v]5q2خQQD5b ;~?)x_c?oR>4n5,hR'Π(K8BLg U ><뺵:* +*2d_zr]uQ#pNޗOo NhT}rbWWʻ(_"+y29$[Vɣ!F?7ТNw]ڨ-|裟GRwYf&BOxQTQ]8Ygiu:-pYAm93㹜o6 ZEǬ9  ¢ dTAU  9QwPT D0* `BXB2E p2䄌9g hw;Nb S$lRzwtVMɴzxT"%XGD*ܭYO(uAg 3 p8|D@@.Os>/|ɓ,?OQ9m-[ҮF, {Ф5&TPU H Ƙ;h !v8gCTU؄Hy5a뼑[MDVxU6}4\&;җ<7g![68-IJӐ$@o[eH[fNr"YplAIUu.WvI ED z[m.Ar]G^/j )("et@A%B%PAAU@Z+姃!SA"Ƙ(-}m$ns T,$7G+>prkrtD˳|toGJDdN`1x,iv]fzAsҴ+PgVBD 93l_U!ÔӳvnF#M7Yt$Chxٴ@D4Q%rP4D8RSJ @@4}׳n#3E%XPADdٸwڜ(!5m6bz~"h9M6\_$4ɹ5v#PMcysHE)Ŏ8u{( t6bJE 0,02c VLVO.&Huwg\jSpq0]X3XkSH[zaThgcO>4ma >ؖDd|8)H4fz4j'?bd:ڦkW^?R֣UAE"D%(* *ꍛW}iY+bC*jqƍl?}Λby|pTO6MQx"1&SY7L =zxztRf<$eBJfD9DCoh[ D8A߃1ޣp=s V-c6^\l!v ﰘ==_R9G^z:u珻7 b/Pd p| [s1a}sfiz^]g?c22Ib錯j*\{c_}v(˪23gLft9~Tz c%IYEq$@X9/}ˏm]4d WkuJh :nW]ђ! pS+̐Mo;kJ*q"BR@TeE6r\>&(,m" d]٦ӓzQUSlZ_ElFoz f!"$RUeMY0c! H+]`LQX ژESJDdCIJd,8EmlC Py9.Km[T} 96|o;aeڼ^rⓓS"5T1`jGf!jG6Y(bvpȩ?_oj*GJ p(f`VP5P7N^0GxS%ĶKǏE!~뛯9|7XTjPAEct`gՠu]p1#QBvۺ*33ZGW~[oɴ~ ^wgd 3DW!8[4H&0'I;}gfexRPh4 o|n`>@嫮;!;ޕãxbq^U3ףrk cU17vqqӟT%8CrrrrwT㾉_Wm$(@rRQ=PɓqHA*SܶtO@BcI( BEI F'. ̂$rd/*!gsW5hh鈴j1?a9ue}\- ¶o|}0*hw_grpYƓ=4ʲjVo޺qV*ɨ@$ b(D$ hγ{>E('my4X VUQ[9TO}l )hE5r1;JbhG'Oٹar#  *}kgdTA0LDU].2'kv]ċxgd6c OxofGw<|2D9q=2jEy|ksmBzzoTB]t-..TXcrf"7ߛ6K$xrꐼ!dR1vt(Bdq8CX@5D p˰y* 0"2+( * ^i ZQcPeIrPdw[]9JXVhl>=o71!K6n2vWt (e_UPSHDUb=;$3 ^l0 7S 9.D#ld(TaB6#&HXkFfVe 8( \D`9cH8KjZ H|Dص\2TPЈ_|IAU` Ʀ;:|l۸Zm/FK ւϗj K:ABK @**DIA%'nǙ1Hl1]r( %Dp 9%b5(P@՚KQK"$H̨hlQk׮ݽ{7cD©[yêȲ@R{b.vȅmۭc zcɃƺb{־WHY#һn=ݴUUrF%W]ߥrwemsLL&<4* )@2Hiim+c@)lx bU-)k IDAT=w]:[74]aU lV:q19-*v;F@]WtKn^G]t{%.&q'ثW^ "ۇTkƀf4xWC!eaU>!.$~* * qYA;2кqpvu503fe-jR DzsH/VHQP{lv]Sý{'9go# 1e@mEre]7kIsOk?7-ˊso?(r뺮o4cgw;5eݷx=+J;dcIqh.5#aJʶG+80B4son2uWAU- *d%DD2r A %ɪ̈BhU,s&˼Es;u!,JH (( kARQR0ZP,;I9p5h6b<6mrߦسjl24(^THUzWצ/*.׳Y5GOb9gyXL'#lv(fZ 18sReќ3}\*@(""$z ff9GkrL( .h'c 3=Ċ"֤Cf )q Ⳓ "9tPUuƤ" Jn7nWv&W6Fr]],V]L4ek^zdz!!% Fckh*&a]o&Li^].K_8ANmi I(""`PAz4sZ4M'jc ºo=N-ɨCOu/J% wސ$)3~E Un޸o>EiBߠ` g˘ƭ}"=1NW[n.x7}_].Dg%:>= fl8Go+˳S9F4Ǎ78yJZj4j._`1* ĠY%؟MlӾrV6M3KZAQ C`ɘΪ r:SU|IPdrh6!侳uY$KrAƠP"JT2ZQUZ"oBD- j, )F:8Kk}άOcCK$"[nn3]$tm}_l2X6ޣ__w^W, w->q@Y (8X2>bFz/4weQs$0gE4mKhZduE( ">prARaM( hT*QƮp6zZ7m;êju{HQHEEj ۈb+#AN$q/Afm%Jc1!$S(|}s_wݭ28ё9{Zo͑B,(hUUAxPqm~tAK`M&DZ[u5wC9vǮתk'3w/[Fy(xbc^,hu/=7]L?7%~A)(1Dz\.%N`þ\ZEUT K BAk-*^?=}1h a!E`ADgIDAT@Q !Ueew{eLtZ6朁lY)6K`@Ѐo)K)c$ϛi]a}2o&IhOj"Oo~ꁱ=[q{[VPp].糺[C*] p} R0!&`"dH>L\ЈArAˁ&1MA BeTY7DwpިER<(( >`r6o r)OPU,jYDܬ6nu|!8LdKeJa> nt Y:{D"к(Ĕ(獳6!<"J~@̴/NS7}ϒjQ㒊v=́8٣.$X;4u=I쾚~4=v }Fz\=+d){+\ RIݻw|RW-[d*4d꭭J3((P3V@1a@1[O‚jɀ2HcH%1H$"IB1 |H.dHGΑ0p{ə' xc}U}V)٤4Iȭً#(ģf5xijSG>xͺT@K֔ŦlATQоG7vvۋ~?KYlY"KESm9TXy,8STaL@a9_8cI7T8(U AH!1Aa&RA~}睡۩/pxrtSOZ 0CN5DZ5ƒAjYy_UucY̖l2yEUE Gj/fjuޟ_ڪEƮU-*d2)fݕoU쫋ٜs)o-y/G˔ط_7nd zKdMʚҨфz_̗@~8c$'G,*GhwӛΑq z262ěɬv6xC 1hj7,jorQ!}:|h«/ܭgosqk:gH^{ v!rn Cw˶}2YA{OZ*k=`@+0d@D "AL2 >Y/aƬ:>>/ʵ77C0rk_ƣ'\^߰~4.|_ZZ_֏_|sd-ER.=y^k  U k?r]WWkn4җnܬP/S՜s.BαCkT`QT^fs QŠ""", !\T @USwjLyzIsQCn.f3ɱ[.˫fd E*$sxkܾSwӮg0ġvlC`l;C\ cVʃ臽% m; } Hzwp8hL2f1(XUc_!gQR$cƬ.X]4vfԶ}k'R1D"PקUfnH X+<&o4 l  rFb6֡$ՕE_WnUkN~߱1liB0\AK ٣3{hq=+6΁]p 9tSyvrTΊ#H#\16{G 7u d"{Ѷ0LY^.)vM$ 4/b6n}pc,֐BS2Q̴^ﻀ-!f{orm3Plu yiSrUƷo4Xט"<{6lhZ0jn,0j-qhӺ*;]Y èy^ @Hl* b{g.3qT|s-\&VUEbjF+!4c͚n֝=Ys?Zkp(T8#wd{z~u+ius:uեmu5Y2ih[cU<GcOf~J+S%S?:]IE8ou3u'?;} '?KݓţhA޻ !#:\jd1IEQ(̠SQ@ɠȊN1>ރ y@;,`RZrn L>]Jm?\ͽbL]*XJ9'G}7 [5?Jjl޿UgaHjn6Wj\%'T*ӰX,ʿj9q{뮈za}>ڶ*|,CJfߍS*n 3h@ľtc 21 ]!>΅qDR JRb$P3-&J)DV!Aάc!Sucq,*8  2s4Iːb'61: n?|sw}nLh5'Q۶dr|36 ܫxL軁PURRw4 9t+/VU%4|uy@m?z秓i?gSկg/D U0ꚩA DZ;4;"} r z}TY}KgAxѪoO #ʫ.^kiU{_UhL5풾CEDU I fa,*ti_(W_ϑ]Ϗˍ41G?^߹S.=|4yI%gk za[?2ẢDDhDd   *s{"c1g[6X5S)X *\TQ aHYDEB22GPWͬvwdYxfͻO"K^~%KZ]]npdPKA3aL5.GtV Sx0RATdg1?zx5Muյ@**c_-cNfz7t˳c^* )* "$RŪ Ղ "xc׵,1RdqH*%Rv|IZo KqQsp@9@ ,%};=xN6lW>{"/*E"U2xcƶ3QzI8 l;!_xӶTӅA3G<cmw\-*A"84C`LHI.2# * J%lacf5vu 2Y3I) Bg rJ@h1"9yuUf kj*Κ}??[>~r~:_<=bq4mNB0se:6-qet]څuC; CLcd,m% ,9;;sf0¹~t9?_]1҇߼~rûn>2Îdl6+×" jpARh,BC[Z̧SgL'0=BAI hrJۄMBɊu@4UO.D4NNkaTE%z싍v1l%E5EF:Z{W0Ӽ׻WOˢ~?z#DD)|7'ehw~q|kyj4>Tu̥("nsf榮a0]\gf^\\-'''o鬺|__Y_^gOzzuٵ5ڀ*"я1ADD>JO?d֍хzaR9ݾvܝc,۫{79eD<觉ВA}Pb0Ǵnujq=@#HbMhb9;qC(M۶qΝ;Gc0ǞV`E躮|<4oޝ6ƸN)l~WONNWϾjgp[0}{?<ۭV;cv/k[ϽTȍR(sn߾=ǔ C׏7oތc?ݹu:.?|n?z_18_x5JѴOs|-dy~6Rَ_}[|B *P)GQ)*z=޽{h6erlu3VMm5[fͩ-UUm'G_ו7qH ?;%`GD9[k K_-%K}oy_e2LRT8ej׵Gj *W7\yZ3z[5'JDxWm*2dݐs.8é7%֎Sԙq5{(A@PETM(yfkPMIR.ƘQYbgR1s#n)2VX2 A2@FD'q!|ݏ{6]cCSW+ )>zuٮr}D'_^zs%3Zk\P0FhdNkSJdRJ4uln߄tXcoV+RR Q4۳oN1mr33sN@䡰Z3YgO)m.}htݾ ҧ- "JFkdҭ~xˇ%ǹ {nN8,Z-RNa(0 D4 ""bDv׎111¥܅*:vr}% BpmUAi:aVUSWdO/#j:D+sviR "6G䚉MCt֓vCڶS΅%TjЅ#$"ql5TAx>aG'ʇ8&suSvq#@V輯¤ [kbo뺾< a^ v~2Y Pa  > 3}u!rn/,2XgQ8 vh~쀤t}6U1ԍzU)*)0 Rn$l*3݅`d9bgP1cѴmWM)Ż*{Jz:}|dqL+m?zu(W7t*LP?L=ǡ"*0%UDET7Bߧ64 v6Bn#aO\TmJVZ~UX$<3 ,]\\\R!"H%UUe07FEE19 0ǔ1v\FRľ|s::mVvvVONdayUR*k8)f:gIqحVg{Dݮ7g;:ڍ_?+_<`T"HVciuowC]<<sfXYU *r~~~{疋ɰw볾 j+ѢH`Ob|~O÷#zsd2Y,X}%Ƽ\ǔ1V===CW^}yL,W-=]o_-gO?_` QTA @ $@fݠ͛7ߜO7;{?t_AAx=܄C;A>W^;!"Rlvδ[ Y 8 H GU&=k'GvuQ卛υp;޽<*y\?O^xU>}z^AW>೿r=h0v|0xv>mƔTJmho.Mirh7꧵fRWJcU!搳J@ +RE1PMX) ǜw^ UD (E 16RB@)YT5," ;{<ҳ*ݮ2]ذZf:ov9Ճa~GVa?MoZo7/ I)RW ƒ%>XQ0Gl8CW۵#3[5(Hݍ̹[o.1IHR졙 ]%01v7~{%5 * rcBdRJ)c>gP,%fD4n\cC,yG-]) ZkɖȻ1]7 PfYow҅&hcu:A-&qHq!M]IRJP0ZC%ئrK۴}ôAcEdchX<'S|p5Ԅ\ С,K ?#@5 Ғr&eC1AFX (,bED>s@@5iTI)#LȆAffU@SXlŬ{jNU5{HăD-%sL&"\C,*0Ɲj*S=Eg?l>먶ߵйޞ@uul!9< kE8hJjlz豄CQ`-)jιXR:P8 1~l,dﭯ@rtq*?j"Κ@P9ԕ%(ZlR$r[.YUCd(˳JT_To-gGo/uq}O%ڨ݀fs~ݛZя|/җ'Y_r2޽׫Q?9YLM0d8xrwy79'ҽyS[KW/'pw7r] x`<ۜxy.gKcLɹoGD#Zl6=>YXD9Z/V Iha-h6맧?Y+7K(!,HHVp͓/|[$o[&jݗ?y]xr>==>n7ۡ|ۣFę4湻Z^^wN`7͈:SJE ZEƩ1*@Dx,A2 U@O(>s.(E*:`ΖqGJR8fcs)'kX3L*?!C,,Y|pP)0`BZVƘwv X~31NQ@U jur|93i9>BX3٬޼vKR>^qB!~LY3ADȆi`f4"2 *jhǔKeڹe8允USH5ĚG"E4sVcjw[,6m_ђٓ'j]1vO1Tdudvi0D`:.ۀ)g㨪];R i[_>~C)XhՙZ5UmN_L> vv7rBƒ!BIݭ)̇4JeV08u|sw=Ct`6ѐAD$2`7-* '.C4 ,",EcT2ad9_az׵jQYcPU&HjQc9sLrpRbw>@s>L~9e'z׮EoVU߽<Ǯ4ՙ>| f0DF0s#Z tl-9(Άi}gPz8D6/ d@m8 cdsK\kOc)` 8Ezwsj !s\@|(ƸZa,MS]kƔV}n;9 ^JJ&s>j0 h}j)ū5d^YS!9-//>~x^RNhX_֒Ń~;.iy[kHEYXDQ6>k=czݟ]v[ @k"Zؠ+3ݦ J 4Pq!w0{QŏGP&ISݮvMi 읳!DfV]Ǒ *)B;g,4!>0믜.;?}^fr|CeSJ?}>cD8qAAUݏ" %H@q=SJYmYr&k9|ޜjʪ*<vcv BBꆇ%+O< Lݴ,c-6.W]]Κrμ?ikL4Bёֿv/w,J ?HaSTbJiѳpΙrY|Yأޞ3j:aoof I"(nOm )3CmfBM1"Pq6QZ3*Zsm* 9Y[sruxrJODIãX-{{fYY k&q+Pժ)xp@]8kʨ5n1H&VQP*4Jvh,"GL(G, DPq&eYP-+fv|ZZa۶; QZ82زtb Q33պZÜ`] y9"}~rz5Ai1@yW?|p|q'yowo m|A  da!$R; @Q0̑1U3}G\fn:GV6 mrlXi0D D!yUhU AsvA󏟺ɕo_L)X &iGAVZ+BH1"Q!҂T׋$cQ4'+m,)4Nu3@4 9rBNc (e^v *'0hT &JQPI( dfSʰ$+I=ss"dNB H<_,jC )YQbΙErN)Jk85!r`sQi?N 3٨LPO~ Ι1N0-*Sy"Q? m}]a'/9eǽyu[hr4'gsRH| iDmX Z@Tْ) mu,DZw"4M""|)v:Yg9I$! 8fMYUZv]Ja̱44"jͅP':% @9pFT"J Ze3fb !~,:tg攘#Tv KQuLF. u*3dH HP! eN(U2`F *2IHpWE vOY~qlO3' a@@@sJEQ9)~I.Yu)%aVZY3sʈ}FDl3 Zo hz^T|\#̬ 'R佽wfa>Aqes ,9DAFb!mwr)"";&mdÇ`f50F|Ja@sBZ$ 3RS$m&mEU3(wlXWcΕvYe|Dz%@FN"H@"# I/)fc!RߏSBFMj"eҒs9eeBؐsrFc=>⭹%Xr$m0Vs'"8 ")WAvShA;GJ p( #yh= m=kC!Rwc{5 BkuZ!K"hmaq9 8mZk!3 "0s΂DZ@Ye4C?dẮOO7:ۿ{r˷.^lG|f>[|q^)>9ss3+EѕA(";v ci >^@v^]6IafQ8BD(ZTHyBYY]gM7K~RZf]4]9I逳EyJo)GӠ6 *)KQ0"(?ad](De" PfiQ IDAT>)"rԍdf\A2BbOR8)_Xas`d]Q)C$"8g&"$HD`&45FM8ZE; dNa(]fK̍626e@2aw"jjz:af.*I2M2OS$"TĜc1fpڵҘn9+W~K_2}N?ט|YY )_}5SRߟim?n @gzZ` ywϚP8;w))=Xn$0zgέ9M)Egƍk` e׶lK{72G?NΙ[ky"'|uW>Y9#>1_హ=oۯ5M%0("cB9d̑E"H,냽txryVhHv>Kv-u빛U9K>Yd!Yi9?ReazɅڄIF >g3"H1}cSHB}10?jE Ajg}Dc))AR(($洣wR9 !q\9mr CFʲ1!g-\ Sl/EzQTt5 R20ͦkz=#iu߷91q[4D!s8;l4puʐb}tFgC46~t1o[v!a`Gu5GҤ~ еiAе>FmݶmIq UU a욦ҚnSn;D5yƞ?MT coAapMà@)P};pL"ɑ ծf~$J,LiGED{f6&C&sB;޿(, w7?Mn/,_Sl mGN/Wo^_>}tp޵kКv䩳E9ŧ0(4gb!2UQ8V[(謆ҎرHF{D;MO=2ƔVUe1xʘS]ں*RR<,i1̜iJ) f` g˲)ӧղ{|qV AΩiRfoP>=}t|ؔ4l7k.0MFS+Ʉ}bS:" )tT2 oi 1F 1˲0\\#u*,{>ٟ?& D"y^=boջ/>XoJA\J=r}BE` @@ @̀9a3cλ;SA,j4DD3։҈#/&3YR9vFp{̚7˃+ 1RXH٢Fr h9:;_njbQ+}'k~~A>y٬^]ˢ0.fէ>ãƠҘsJW3{rxwxs3+W:S(p_}WD)lc.\u _xqͬ,ffӮ6CŸry j83 j 5dwFsI VSMM  0ojRIb9 ѧզoItJw=9E>:2d01:2s&gLUE0^W I~|]u٬.OrS"&Azv0 ` soϏD|륏??B{Vea̦56$kHPdI-3>gՄvcd"SJ"IUβ^gWsĽGOO [9[*ADxɝ780/l~yzv]uBa%rϥ>ָwpt+'oD6oO2稉3{?o{D+ Eamom]HVh*b)"}ttT>95?pcSgտw9cLҵЯVC{/+Y"ܼy!o{Sd~ZScҚ];+X43e2)lQ&&T2[_OQzն,kLd1gRdN\WsRv9ӟ8S-__aVɗ_13-Yv,&fvZ9̂\9bke"!@31wPiJ0EPDQr0)eZi(Jr9cN"AQ8"ҤXVA` [#H PAF) c[0u[̱]=iI@i3i+qX4o˯lVʇkaD $OWͬ~miC[d4gv 33)irtUSj׫Ur3$P]7ff1 { BVUED}? #S 68;cQ+B ͇Rg8 cUp 0<4Mi7Ma4Ma&CQ5`|tUXˇoDg߁|3MnVhKU@q, PQa*9zdlWK1y D3IE+C+0HIY](tVj:\zފ4,ruyytߑ2I!cbIS3̜E$Et1$@TDR\]R GAP΅1kGZH02Ӹ8B!Q㬪9 ܔv>~avSQK{UB7owo(Xl\8P l>/ng5A7Ik3N!lN!eWPHvaV'2EE2B쥔NϞ ۍ9$z ,KȨ45uӧDtiFk= M8""C S I( @1ƶ"$"hFR]?VeRHB?HdN^-<\UH 5(`Tfyuee߅0lvQYFRJ"9*@>qf{جD*CsQp|λo,OV 0@&|v bfR+FrnJ?so\ٟ>;o[V{rV@k4>qӵ i$Du,Z&JD&k4BaٸΜmE̢`^W}ڍ3vtQ+Hx7X*:b+mR%cN'_Kٯ.z,7ʽOZCD R(eٓ'Wo<|p'׮*9˺ S̒'SVY IB6,>⋿/OFiXU슢o8}j6Tuu97 CF+k1my [=pJtT7eYZ UQl7Ӈ91J(pպ7㶞-/b2,0*J%]>j\Ջ}jc +] C|Vkg~4Sr=ׅ'_7Q7~U'"l,ˮq༨{c~3*?_~ou_orޫ4zy㍾KW1OORW"B "2gD|[''G'kuArJi ѕkW0hg"V#'EY+,"ij訩Ŭ2'rg'݀Fk۟/ɍ~~~wE"NFpa>Kί=B{#NkehcΨ,ˮ4iGZ[s~Rߵ0zp |Lm_9‚EW~yf>[JxjPJIΝ>[eLF4-fG{iއ䓤ynܾO~̇6ͣ w]au ᭫z{~RcS΀7mfG'WPny4\:'/޺oʱʢAEp>>'ϴ֕)yׇ~sj(?b$H((kH]NQq|\<y 6f$4F騴lQx'"BDQ̩'7)ErΜ=!pvՔ6[>4fӵ oLP"=Nw[ESgÌ6#hm#Dq4ۡ9c>~ +Q)|UUh0)ij ~l ӱq Q|uC)\v =ޮ:e-s29[ pzP8Ն8cUs (P!%ߌUD d7e)&!dVJ9r7)0G1O]]sEK0sVD20lPqZ'SrXTau~y֭G.r1rm}Np5{0=)\]{[|eKYur}9E2bfQML+lQH;0.s>#)R8nٟ;@@x0qTQ#)0.De-0I NSw>Q: (FvcVS X Q) $%LG?].Zqc(z{c䤐)g7Y3fu4@z[pR$S):/yb.js{oK MU b-JvC7h[,H)a,RrOSNQg(J?c Q)bI!'-ڽJ)%"iRJfGrNbq 0.v͓7Y}e]ݯ%uC+,ƘvО4G{{j<"~6z.잟gkv!   晢j%US8g 'OsZRo k Ģ$NsD 3i[8 F VEġ0)y]͚v6PvknRY%_kR!zJw~wYSEUUku'o-G1 a*U }~~YÜSuY()b ifg~>O$FƝ@jmR7oZa0hweirqL+JL 23(e]P"4Bhcnܼ9xIsN3pVJg‚ (^xW>yz8d!\ض-"޽{ol'_"j&.QtYȘV/ݾoo/|ݻʚa aF?~蓿yjy~^zHvpDAJF$gKE(*aSWbJ{lBb*ю$"E4BYW*|x|0u,2Q!!3K9{ uw>#aԇG/>>#_o/oI>жm{trf㥙]_s/'PeU;ۋ7 TOx*o'n/W(26gnG-Ľ̐`G?H3K@H]*P3Yb~Pg"JhQ9Og)"'kPD `(Er9cބ7U w]YHŒ뾰NRg~8n8Ecw߻^lp{\{8sB@ j9v5{9zZmE$ F?N"0R;ƟQЂ,ibUb̄Ai-$̻:܍3A;M ㄉC:B48Q^=FaCuQc5]߿] ÙwEu܁%U5Nݼx|wiW7M]en/nurL2iG߆؞qUq-yБ3"i2'B?dc{nÏ|G~z=>1ƝV " `톬P_UMa8 $YD)dBD)$?VwFRF!BH@@P@q)c]4EQ3GUEQhz\nW̐R:EZ` ch̶]#"*m=~CYV2z㌝-){ts!r[cfXm..~l4qaZ*ԛ fH1LΙS|uI|EfR.3"jmDng&M8MdO*܏.G;?~xzqv50/4j]1(m1$u~<;zp7ߛ_ѱ[+ԧY+0lGOΞ.OuQj Qb3j|\g5/?4w&,EYe޿L}W}/Z;m5UUŽ-g *8R{YE>}\n~r,4~\;1jWVB@@ɠ"c >Ƞpggj49HJiDDRR֡61fʔ?o[4y 㤔*lsl^[kGIȸ`?/lmR;7o:׎N~Wyعg؉]9o{MJ!\śo]6jڬVZZC0H݌a $ <#HiFN9keEɅGu{჋?U*hQaQVUaگSYB{(K;(X>G(\9\*=|V|R۬JC +Π4 E{hAФXbN9s6ڲ,?/. >I2εW.%9" 3 ic̾1Ƶ+rmo[TuFbdQ%@4)cSJ3e'D4gcQ3 !8[u٧8 #6/hi]UgrY]-R)u4,|ھW?kWNahz>1E~ZA~+?h q@ioכ}jͿ+̛OG4.m;I@ʵs C-9jH;gc# *fJ::z2+ؿ9<+WWO_߼~uꔖahEt?gO0ν7.//Da;}{/ݽ] IDAT_{=D2K/|í;.%D:!6OxH_ݹ=Y힬)wC\ư5|^WѣpF@0JVDhB2+e9y?G& ;(|G5 F7mSK$30!5K۳}^o``|4NF32Az?/;r,E;?@RD9LSƞ$vvٓG1-RZ!x!R_42 !mBuY!$lզ)$.z>4FA;n}8cP@)DB*mì0_Ͼa_{;/,rS)EtmBN|zhruRDfMsJ! ⇯Rn. I9Y`!@`D +@4*%RH)̒v4hʀ ط6z72FCĕHNsNkN>{i؇9IL,HR(b9qS7ak[DueM~{ T L=, Xjk?^ ?Bd^wa>WӃ[w1@ʷ<""x7>B&erئ(35/ٚr4"bɴ ?t?xj$hR"3%˸dD@ň QEqDJG30e/W26I4&NΝo޺*}xOUao]~p93^ٓ.Ol؏ A3L+|ZD]/@WVSaVH*vc"BPa]_ܝIg}F ¿f6/ [)IVJ) S߭R-0 #03JEmz88 }x[GdFq_?h”fZ_vOۯ խv>w׿BFWUYx\?t~o,}?{Z8BRD4 2)9dK8!'qЊ44!xsueF$s@B+BMU!3PP)ٍd 'D,HRJ˜(7-=êZ{:=wl$MDM1;V8("$$ [@%_@-N,Y")Dlfϸ5}CUaۤWU}GH֭[nlDĬ"ryqqj! ]A ^c㗋v^ê}1l 08f#Q$0qߛ.*4 y; DdUrGΥTD ",30Z4Q}E !d)+XهD%CI#ź@N}LJl4s\q A Y3 dT ?dhPU! ԡ)MdVA,AB\ hkF5d [W"AEVHPrTe`R8{zY,fyD2جl]vn\90bX>Z+Tutfûv$`@fu||^,{qX\e̘+vywߝ {kl卵6Ӛ*`;۞U1Pƨ" D_iQ(" ,b+yb(K۵''':fwE͕o_{-7 |@8OSrDn`dKf>o?{|}:B b4Hsfo9}z;dgYHxIu5(_~ů~kgdXRIh4V: m"\@K)UªF zi;рTЛ "шطu(aWgKwT; %\Enı^a_?#zg>zcc.1gD`s02jyHAPH,Y:X4qs^r2s6)~‹oLBJSI̵GPBT0k!\Bd* cߍPbU%yC\.G{׏XbyN{>y9gNOD_;w.ў<=g?[g կOyr|Wn** pE%,\(*EDEEA%TLY$UŲ/mے5?{g?FK b,Y5Y͚e׮>=njHi! W$QP$$P׫!Qt&-10 l1Dv0r1˱~+SnS՘(bȠuHIp7D8ۜӖ$Oeac}V4~0 )3)T [GGβ(9Y ‰P޻ǜ3" 1EZRɻ}ډc}'| i`04{ި]{G$T\5g4]w)§'1*g@"s梳eȢ%_{x j`yG'ƑRJg̒(\ACUTD퇘8'&@"" J6rQFPt%(dĢߥPA TUDD 0Pzr5n׵u . 1(4ZKM3_-^W*gE3P-tx{[/Bn F5؉X}z#Be.rD*}gݍ= c;[o׋R-^? nv_ĸW>0`x2Ɯ$9e!oLBcCT* EMa8%sgtU)9gTQBRЧh U3ч`s}M6g}nwa^[WMxQwcd{믋l*`_mn6kc-90D7Gue_]Lۙ>vc }~cu3jM9լWxQU (<2g;WqA A@A,]̱:$2q@ϓ.&Sf*EE2,o*r CCo|mk''DZwP˸Z./?yyy\g, =ċ +D0AQt"Rb3,;"cb3b939><{vk{|h_[o7!T|>CTIXX%u )d"1jX! o18/˭p"MEzVUD$lb2wlGIEu _ިI`_W`XO^N,O|5.Ʒ;J0#fٜ33w|E H,IYT#^m22H;}[,fPJ.)-r_rT@`|Ű-(h"rd橶4A\z '몞[QUq12sJcv]8dU.b cXT9CH ,`Pik1zB)cЬ8dE5vȨ2RVD*yLC7H7[!U+d)ʵ' QcaKks E㪦zk& ``ƮgO!IܭI Mhn$3C*bq sə fGdTA_g@ɮMifr@Ui4Iњ̅dU%DCS%>F4Z k<9=o4ͦO?("}INqV@q;f7Yc8gTy"zDU-@ۏ\m<}<^lp4i=mrBqޭ@B*@ڐ2$'Ɩ1LD,*Z$K UScKo:h5']ru RF@tr&"&BQepzcJ)ڦ%'XJ1lrsjٌ7\ғ\,@Dx3&) (e<{,W:0$(EOϼkȠJA@RUETFF3yV1`fe ! L{>[|VE MEKw 4XSݼq{k:nWSOlBA"cJ>g!u:g??xd<|nw_SO)%r??ٶc66ߺ=7S78\r)@oY-<2 :+'Uhfec)JFlQʘ%bբBd!n-֡Z.C%HF,&]dڼ>x(o=OmQo1B*9;J>X+k!Xя}g8Z| w]׽G_y|M'>x# **h N e=תރzh[B- `Cuk}՗RWM?nʊ-ř+Z"#c1]r!2Ĕj1޾};i8 @t!9??+[.Hxyզ)o~_+S쇡 !c}|aAq]EBFQfVUD~˛wK93Z`c0WUu֬n߫YiVׂ*1GG¸ծ|]blwLpJjA۬ NېD`Q2Z3 +Wr53\xRoi$3a;+"R]_;0GĶ"j\ Cl&q>obsWPW!=(~oÓ֮6b۵w_WY'VUgu/}o??Ccʀ&fkooK?Goq*_k>|d.BsIj:1)GPaJ'd(h<ٮs*g)ެD(E&g_ rDqC]к1KճA`eTV}0X7-jn\ݮnB"6#_^wW׎V1ڔ,RO qz4Av}5\>7k@WWg^ATY,/~Ool6{r"Dl+T 1ݐRB@B F0=/@k jѩWRtJZ@ e.rr.VncDZ=Ny˹W47y]9'rJDo}bWU{``,7}|7b]̪O|kc_5@JJex+:E@jVUĊ,H`Pr}@JA`A"+kHBPD< x^RJ)y4ytmP v]> V}[/pxa3c|P,ڏܹV];;[.xgfLW_KOȕ‰.Bsn`PS!f){Yשk`V{z~N/bbcnT.4M:- W]-R blA"%Ԁ6uCc5.P2 z%4H8TL8Ǿ>("L Srty~q9ܷ`7[7ϚfX퍥EvR#\:TLwpsZB@D  x$*0(3+@.4!d=/VOCJ) Z2T*@)ia(Ent6.-RfXDH%(!g !)("NRgl# $lf!"Q#GXpFŒrq$ƙ2&]{Q'.iroZ>{tra67.nG"0@ӧmm۳r.%33; C MiafXXг3e1ISʎyH R@&6O;_y )1 saaA0k1DDPUUF1jQPDʪlAA%œq )m瀦1u(UR8**`~U5V6>Hê9_[:wpoK_,99'U9xSkeJ TDE*1j^#p&\:uC0y|FJI;.%]"8,cgݣggnȹȮS"2Q?X@H0++91pe( cJi4V+ +F!E"T0,T`xdޙSwަ V4T%"w>f6c:)YM=1fٞ׬zۜsɣa//<]nf ne]a)` wx[fv{U}X`UvCcS#Â&/S^0>i@$KɪE]VcZrJGl ga)L "[&v?kǥA(E|u=k|SΣ<| ns^f۝<ΕYSte6O㷢jFdk$Y㐆1<ǿ.%q)j cUݍ׿_xw)Rb')U3ۯ-gfQ ]ׇ1ֺDм9??~zr"esrvDAfFUEQTPUPPn/0DJ)9gVKHAHQ` q@@A<h! #3zYU?zS]wMj^ wܩY7LR|=1s0`%le@]eݻᗾEdA~-*[#cWLe/>9y]v )C,2YD@*"뼢rs/Xk!+e4 jx^7`U ݑ!{`T@$xb?k>ex8 ?#? >ovzrWo)%@H `=ֻ}?ڧ6K\Fλg6%djoR !7~\󋳋ݻGGп7ܹKo\;zw}Oqb<n9Ѷ\]톴Kb9fY; Zk+weҨ\֛C?W^}ł7o]c\Ξ>\1rQ$QO(\<hN"sV% dWQ&T/QK8.PePQUԮFcv}n-g1լf-Ʋ-got5֖ZdkC/-t&],Qs[X@ZBض})tzeֳ>l|Bٹľ LPLEX("j5YhQhR&-~R:0$P](qTEiBK#%Q˂ R%QtS9X)n*RnM֫Eis:^mU'ۮv[s,]7 O/.~փ]9ߏv}ﭟ͗'-bu~%"cAR4c,_9Ÿv數Ům},( u]*U A@AJD1HF` in1ZA4 4MiJv[:bj#ȑTQSͷ-Z:V)%A,@bfgC|9.Tv蔋W­f[/n^W[ hF*Q YTE`@",)F`)؁Z' 7۶+EA1)&5X$(&2DTKTUaQP48ِӳs\pXJ-g($~fWb+ټnw}̳qRENA-lJwø99xpxmY&oh׵6c/6,'O6KDʪDggFr$gYم(Y:ǎwg% 4Q8cDd*2hN̒ ޠAT 4BPlV06[.#7DyY]VN.>x7T)t]zGK)0;x'㼙u8PA//u":[,Lo⬗/ʯʥ7_:h 1FTu{|B0G/}V>xw`Uk]-|\-"YPTUeHy6ޡMU !sTuC Y....` tW1}-q؏/9/}K)+LQb>;킷ubcw_~'~rƘY۵΂UUTҟ=8`ߵZ-y?߸x͢YȀjVU J(¹vU8A&T%S_oEYP0%ݎj~CBP0VUJ+"2Ny0+ \<XDU&.3 18}_by2!ӧs:v.[)ͲhSkggDFa"MVEFR2c*lX+ jDQE!KPXV9ddJ`*1xZ[8SKzS zs#pEӾ!k,Zn愉7 b nv!'5Ξ_~݈mvYmN+M漸vxyzxpʣ A9.$= <~vR}rv1eh7cHSΑy  c8D~!Kb0&Il_i=N< 8 *+"2ވ!uR΍Ơ &k~*0諸΅ őQ!DT)%G(ցwrZИ|)iDq"" 0 v2g6vE])z;yKy﹌ :o8a3;MREkpdbI(") l)yaĈ A1 ! $#K(Kh(M lv7v} g*'yz9l`U_}UUplsܴ!f"Tq<~$NZA)Efʇ+Ll9E;UU>(ŴvL\u۶b}ߗiZ+33 h#=k#0e1Ɯv8}Q}=ši/qSRvtV7k+;D@ySҴ0AHqYn퓖TJݶw޻!礆bܜ=ZbJ.9C4SS=.2E%)cERq1kc֢ƪ񢔤MV>{ 7tulS"2ۣ=}˥kd$$%4DӒS5m4NӬ M0KcWݎ@P;b<kd輯Є$:m,Q00U>FMqp˥\_Wt|NG@nf!o7!2Xc7|j,b_+cwyYߍ/' }Da>3hcCדJNЀw䉉HCj$#ySvݽ{s G֮aҴCP}w!) vNO.1+9+ Dn|Ȣi+v:$Z̋v6NqzHBU3s6C \s^Wf6i7R'y<ޫ*s.U-:MS4r4Gr6wu="3Cu]̼n@`fj DD`4mKS-{ȍW__4fym*&"UMĩ8<6P(U}VAU ɓ!T6bm m8OS'CW0vVu,j`L<%~W59@?ccUw8_cN;\?Z>|폿o6$220Pl5! #(BU;Bp}~RALy[ק>9oI4 ;Ǐ{{7᪉ˣ+o~<\wns>9ѶmiriVduGVdf1RjV?מ{g{_3M8_W/Uo:9Gx _HCj|`كRw·b\L?G?G/|/HЃތfBmXDp,@)A&*H%GEEp*8P"P;==ru5kj{'׌+@?E -Xct}SϽKzW_}d>g1WovJ%1?Yݿ rcS  p1y`>l:fZUo9 bR !G PCB&3@ b{-cDT!u5GJq"@u*ʧiĜ=BM< ,"Eb1%Dg l~0 CJsk.)S@,zUuyy e{|tu]""?P誦)r90Nb;nsa91O8!GiFH0"' (j,]4Ou9Ei2Ԭ9R  r1$I㘠Rɘ]l2ڣ"qfmfm]*nT<֮<(̚@pqe9 %VYH"&ǥ )={*`bvUXbhg۔āz4R%8>ӇK"Ji"GO^xس{o;>~{7_!]{?`95Tƀ%@/G`ux t̺]'?s?_5um?NOOWLTUᵓ'<X, x `׮5>䲭#d (UF2C(*lϏ% @@H?X}3$益+6G4x{%CSQ|TJ>1>]LEL]|Y,bC}74y[-Ø]*>4l>D( _lڍ0Tc!>=_^LDwmLtYg\*!#zKYRd@$1[4gUS*'dz~(Ǒ=[9u[R6pvzfQI(`إq3lNC0p&)x$(҄:_{<PUG5@pp̜1+9WJ!G`"|qN ! CDd"RI)K.s_tq}k6=(XA)jhXVf-f)K8;#Dv"" c<H`;M?d5niD߼㶭!I*thK*@ތD ( dF@DeDE4DDD=WsAQfY21WmEU@fEۮwrݮ}.Mt9O 鬟ID*BY $=*@P!"zmR*j) \f$o'7!@h.+W<I<|7g`X/. fvgM8>ꟾ,|?y%Tdc$d Pc)Mi)(8!xryy+j\wwA=2s 㢪 *9qJ935#QM%R 1ty~:z0- ]ݴَSiGD4T 3@Dʇ:TJ gDIzymI2 ߻D nߨL)b歷  1aYg矽z?_q3~[LmքKMS ðX=Pb]UJj!9by謩Z>|w^gRJoOio| ''yJYZΙ4)ebPUpΙP*4[`pqq `G#_UUUcF@3#Ccf& FI TDM;`fHتRPPfux! Vͱ*R@b;tlf>UHRSM1Ƙs4&Ic~L.@S4un2 R$g%8q%FUuHFhJ&"3-*`Yl!쑤oӊ`f!3Yqq޳r7-)LjUu45#ۇxا0B*أc@$`FBqSTbM*_d }CԈB'?tմwܾ ji}ᩌ=oWWΓCU1➅5CdؿNb""JVc0muqT-aĽ1-h`/Cu㰓KRJ\))l8ZAJ9}$U%@fbj@Gݎ2%0EMոFbA2D0aSܧ\%+n j$s 0>q34^x񃾭>xTR9CoU5C"bfIIg>x 4wn{ݷm`4Oc2 ("s͵%JɖJAD*CS=f hHsUsTXեvɬ6hveJB&A3|EA - y, vۋ-P|NXMV//NE339US yE@C$df0@ j gMo>s9/"HD{@"ݭoF6pLڦ:fTz2mmU;8!O=CjǺX?-VA^,Xa$eP0BQp?6!Rb 0j" 4 E1 7-B1=lWa_L XjNZFtJsTJhɸ@Ă:B)IV1qLYyE{OPrvn&,)Yإn'yػA !1{)V@}k ;@r}PP՜sVTu|MX8PY"/hV+()3B2Bpl*CF*24NPTL$S7lvs6MC\Ʈ+JG2C$|vPsm[a@ CPKqjT,8Ct{@ sbbTIQE 5a2J`(YP==i?I i7͔l*NeeCQrh}1qkAE @D@& d޵!޹wi6휭l/C]?MB@䔒9$1N~vL))ƮHFhb]5n K8WP&WLKBQ,P;MUU `_ O9{\5T!inC ,l!h&Džs44tXE Ņ 4bPDTDsU+Eoܸ~`u>oK%W~=q8x3:0\߬}75"w !aൈ,V%i")וwcm@E(sխr3FcX QUs*B+'Yw>>]w>wC3[zuɧ'Nݹ${G^Dd5*8Ŀ7}du啔{/~Mw߹3lPF S*bumOO7m;wAJh}ob˶ +4z%GnBGGWiя^x/n0p2NS@8X<o%a@c93;vh&\7yFFA. T즜QȔP {׾yYyf{=% 1!2j>q\9-{?M3??7~thK_\;>f͇Ol\ܿ'_ʪi*zzq&*b9Gb@wMѩ*МC" g3ŚT%FZʂu1Pefq. 9oDrF9Ono}g~׾]0n? ORJɲ/ׯj۶C; M0Gݯ3ϧ1߸ԗ˫r^!ݼSO:{693)q~|on-m >?'1xp|pou5o<~/_;X1$*hTฮk6-)z4NEXWK.0!"l7vV?u >fEv%EfFDB@DCe$0/KDl۶CmۊTRFa뺡=|;-e J㮲8 TMU52ǂ`0@WIԐ @ 0f0t 0 K􊄒AhO1ed@Dш&н]DRJ IeR _U]~Ѯ;$}Tg6Sԕ]X$.Dn]7c]-cD~P9݌D'|qvz޽u-8+3kF`&)q P5vTwuV@F9}dfˊ ǘ׷WUj60%֓zU0CO.12{@"* 1`F"#SD -Er23lYWMHaoЏ=c H*5;3! }g0RJCb1[=,3w2j nUy:k*pb&jf` f|8˶ ǂVes^)L*LD-bAqN7c7! ][ %ǃLDf1|v~)zX޹w|'O,Kc~կϖU7MuW甆YZes׿yp<-7<#~K>J^+ ͬljEUD(fF\_vVĊd(o.mXqz֝4!ǵCϜO?yZ4- bi#˷߽X- +_q'c]S8"mQ;)]N!xbJrI$y&btCC]o=n>9:v-"6Mu͛O=Su][<ڞ]9??'#2_FV'Ʈ_?-rGfU=/S~ֽ7 訙^}؝?< 8VMUB1*FCDU!B3SU8C6-m]G> .9ã弪3_Y Xc4(  X@)iB`W@23 IDAT$ !UU9L= G~艣Eo|uL ]m5Y)JhJ9`.b ~I87n03P3}% 20305'O/{ 8r3Qz|3?< ΑHxyIك{բGh(PzCco]1`WsO|'? Q7aj#*b *-!!c棣+W|'~O8x ljErJ+_4\MS1}VG7hXaPȢ11%!E4?dk/~ۇE_q{>oߊ/ynILD;3d@88:j;9>Ʊ3d4ED3T!}Y 5b#"Z "DLH1AD4RJ.Yy:T8DKM^[k,ƨ^C#23S=c`fEL @h_GU !)oLSdh;t[ ]r.0IDav="Yl&6 ~Q,{zhǺͬvY\]/\S|湾v| MI<@p4qt΅SJs9;;ni%ixc 1NS\!a^W 0sJX4V29Ő wۛۖeb=}{߽WޫW$J$RIbpƦMۀ;l@Xvǀ@AhB$!!Tw8 {^SW܎p;֏uw笽r2ƥݛbiC9;([6ng|U!r0%̧fL""cL4bL@"`nCdj5-UbG@EsD|heQR<*2zsJ)'TJVDv2w&Y. !"$0yM[o<88 զ@9!PQE[;8@ݏQ hDs-r"¦^gY߇cJ)h$!aӶq3 ZqJP,jRNh82m_wdX8/x=<9>7&[.wͩs/pL$U(Ĩ 4Dkcu6a YGo۳/3ڔl7f{vvS6KfFC0Z'5{ĢćTr8&:T1e9 76lӜ u|Y6B QJuC@D""4FDbED $8b6"ˇXs!'! qs0XKlqnȊ|(abeD ~럧uO~ûfiaȆ@)()9T۩9Y3ORD~TDA(E()jbˀʧ@pߵ!)3"ωh^MQ ^kJ)DVJ#B2wmSZV!]#Ze9t.c6_yr[w&JeU3wZ롎ˏ<$L./ʼzw/oa8./]aA8aMt<;/˪[E&#&lʕk_zf=ܷ}>V?я7 fvaLi_۞57 yZI8]HVo/&>O}7֫dhF bUzӟRV1StUjrُ[Ynzc=8vQ(`bf0MSkR2| PV$%3P8A L ~בQcTߏju^onxicOIڃU7)1EsCX BoAN:?Wn03 n7M' ~L9(»ۅP)iY<{{{Mܸq4p="R DfJdqDMJl^]:<*YB9sjgׯ_?Ͱ'%z{bEQD዇G~d6_'7ְZ7~{j+??v>ÐkWEVv|O~x||~(Ũѿ?lRw|;}_Y׶=0 'W|n ۟ABL!0./ 2;Ngo/`ҋ秋 ޤ-3O7] /: ^{#l_\6?w' &~#O>goӣǘ cB̴LA)܅cN)˲t:Ql׫̬2\@1ݶmJ)jstg0^2G:F!E ţuaI9)B2n*]άm뺽,m&eCȌ@`:J, B$o1j)bZngG{1 !I) D$a38%vnH17U$)F7Sm"b!("lqA輌c2j+ah!4wU_Ӷ,&J)|OmCwq]3KvM7=~~2fyUv{M]y n""vl6|a cHcM̦ kИ w)}@;Gdy#vtNF% Nϋ\6ɞ6cUgYя8gDZ((4[fYۦ>k;#i_Wf=|d %A %K 2"s &<8@8N'IdԪ7)%CHQQvT5+@mvrrrcoݸcܼ7C]u~7ƈִt\u]Wכo ۳Eٷ-ZtιaL9!ahgAchJ)AxEDfǞLn7I8@@D;N !1~dVOlFDuӗGL ᴜ()s$1C>w !,gN7ͬt]4 K\/m }[d]UU4cPowfXmHA5>}Zn<>>xr]>q {n҅Ƣ g"X.^8 T׭s!֓"booܼ]M''['}<}:vt}fazTe()港Oڦ/l~rziC.e4y7C)lo\Ƙ^y}w,Q]7*7,7wy˫ӻ}7LMh 'd2}.$mĉ$!RJ[۾#R"TDPA,U2{#*\{(ɴ˗E@iJC!i W.lVfV5`ynOΖJW];>C'''sѝ;wR(,8,kct1_oj;~۷#_xtzr|ϻ؏Q:1Vߗ%{>>ݾTS !Gr~ya^M"'+Gtt1f^ƩRyA˚&O]~YM/oŋHYfЏ]ya擼Ժެ"ZRCRɍPL2;)V$k xsN"3CP A+ lޟ/ψHmWC_xqyۭSJM =t˿ OyR*˒I9]U)|w\Iw_=jRR)HH1,R~v!h;pZin3fA8FgvtDSV7F $]9:^aFlqh1J)DDĶm_~EݨHϦU@Yv%)Ûx8$?7lyl3H)jN[}wYpH 1ټ{*|(;>=+f'~?~by@׀v3׶BA[~~gӴ˩f6[<>Ql?03%[޻|:Y+ ~Oo`2??w;i|S_z7F޼uҹw}]nr~aC>8z?#?M7??o{NzQSH,-P8"]$c2mhRZk?wMt1(l])U#C*SNu| ލF;;ԛ`/]ܩN}S$ kߏ]}ש # F) "L! ` 2 UXn!!'QZ CRR~NGT ‡1zD 11HV\ 1Iq+D0F)cNk(97cFg3Mox|QںڡC}zv3d ͭWÑDU׏{dvֽ0CKTzA+][-f I:d7)Xed1?Yo4v걿yN >DlF@&"" s.pxyLш\އr,~{LY(ZfK;/c3f%/޾+iju=/*:QZgy% EZk4Jw c"$IRL"3 RJ))]C43T 6J1RӍTcLq:)n߾)F}V𱭛R'VC? ʼȴcIIHSRL~l6IQ&m7ۿi BP;fՎ]֘\lL8UiE81D1}#GcI8(%Ҁ$Fsn<<>|Mo}b?x9 ?CC{/ aRL@};)jzEduz2ciG )&m 1lއyQMNuɚdw˲m\vh1AHBUqt >1`$ _~{q~x1r Vw*N|Rf|Ka 1RJbBAD~g6,b?'/Z(Nʪ͗%'(&eE5YcmHIu._rlmx+au0HnZS?&^yY峣jMZEOO}҈(s|3I'wnO\%o6PUe(դla ؕrpiCu5L)O !8$aBL}…ׯ؏CI Enm_[L2֟}KэhdN1~%"HD'~8QVD:2 j|2)tѥeU%_|^#*@ۺQiqb J*$@Iٶt:ǑfǮ(J[s"uڃa.n6ެnlJwg>a~W^|gQLhc.->'{чvm0*"OO_7=4|5/E & ( X%3;8<<82-;wN| 0wW^}|l7SV䨔>gb~O2 7}ʃH%*ztf>ٳ/w_~}pt;*̹R{ٜ/4'2/}n0vO Hqv waCeUy鴚t:mfPIu}_V2D %~Z!"Q hUU cH(}(>D2(j)Z6cVC8n7I"R Hk.@D zD@Ȍ`GjST v,fcG⺬RIX!ILE8L/ 끘cGc[3ik!H}׶8ƈeԒFx#e)!fLI+RjH߶};pEyr]}~3r>.Ue>F pH32XA@hm]scr2'PtdZ%nfl-)=;woڅo) zf}:3\C1 n}ObV;y=??xv:ОO.|c fK_, 뾟ed Hb*rWC3QR~x m `6ɴj-B0Ƅޜ'ͺ4=}C.K]hجNd\|Ιv>] !=;ߛN?싃כ&'Ly%9ulgD[7ͦ nl응 kӶ-h@n?{,K^}Spq ]5 (3DDH 0#'!+´Y긲"3#!D`LQ+ d sbixy1QVeafJ"@ݽ%lc 01pbG] WZ[cRnlQJwCǷO&9*B eӓj> ЏCYMm^,|GvaoMn/rQCpn}meD`oEPTsbC7޺ѕ$j.z,rP&rUd1rzj~yz뼾4x+7WH[˭-ê* AZOٞhm;}S8Ff+c<` 2Zڕ*1*!$PYPƬF!ش1$EY(q;y"2h9DEzU-faFVĂ*30j FdDƆ2;Kn C@a o,˲lG6^Qp㶚d,>J;(maZ'GG@.SJݓK׮uH" ogIĠFNV&&Qms2g@Jgue sB!JR]os%lJ=nuT\r:Dr&TMY5'޹gE톦&7$"12Qu=ͼoN2B@.G;y嬩HZΛd 8cK߭vk|j9b,h[(5[\n 'f0c,AP(go1\ "cUs5 bVN3g˙GpQdA-)i"!`fmm;d > )k]ʫs^=_ekTcJaܫW|C'.opA-i cQX~/Tk2Dz-3>$|:A4n;e;mڃ3E<(ڍuQ5IIQ)6B(EVP,JC)X, Y'>m3ÞWV3I7ZFF,MW_àQyxרGozke!Z.EvAvnr铈I>/ju"#R ә^$ 2E E AdՀ wR &?vm~3x zg>0@BF]|T.<܌ׯ\%K(]{&ڬgoÄ>$ʱ$b))B-$(29x}KI{ymO+.g!1ˢ eTE>.&V̐y! qP* Ќ,D!V px_~[;pW{XHn,dʣ,K &So޼yU skCP2Brqi 8۵~ZQ #dG[#Xfdm2E( _pb_nr3NlnBMٲJe5Wkf~n3 }dyD" $daYYX] jE>E]o`Е"77aMqTKHBQ$J Jx$PBߐ_c_(2t/R!m2ϔF7 +hWA" @J1_mr&VF^7jVe=*?L$cRLB?n2En5} .7Pl8 6#liЃW !ԫՅbRKޟMf6XŬ*r4S$1zU(ʨ J1Ȉ^ٓٚ?y:s61zk<*!ʶiQi XUUÖ+5ii"X|X)F$Bo 62R0K]pZEGmD@P{GUFc]gJH7;EB> CƐQiKARD1 Yb$I""ie5@&رL Gxߠ"&g%E$1.)=Ɋ5 +2;]Q]2|ōqo8M1Y>~WH$ J0d,%_4zuuU" ))lvԶIb $Eqh6C7~ݧy>əDYYIYƾZ0hB a/ɥ$!L;OkYsBT1zfP ?w<[M۶h9Eʸ? !$(tL 12~C׺voHMݽYEŮ%04z ]9ΡcA(3`N1bf ƨ`/8Z'1AGpQ) @aD0Bfy㕗52E9_Uepkjyv^MCYeRJ~ snΗ,E 8#( MAhd0 Cwn<>I|Ұ^ɝ_syUrgk ޝuG^{4zǬ]|2U.pDGHJE#sR Hҟ'zhZݾuk7Ic{׎\n|ӧ)ʪ^~ NB',LRKEYC߯O9>mhwuWd'9TyVIEKXcTJ4UyoxNլ UECĠJd/.i(| &!% AaD./  drң{٦Y~M/o|S^lgifRk!6u[o,2 Ѓ6<&:)l &cN>Ҋ =Goz̦ޮqyŦm`<|s}iRw:R*( @@$!H A (Bį@J ȎB"dRy5bg'_y"aW?H&">8kn뿎I_~wvSNcy+fο1@zNWе+`}sP#EʌN.FQCL= k$VJDQ)% $ $)%Q:^$NG''I)JGV?t?dGalwKZ 9w gJ[Vj:!WL))@矽xEVk/+@$ J`P]BVgu]|^21D[O}$sG}})/쇗۶ K#.eٝ׿OA X I `B"}M()],l683Q[Ct$fy ɋ$` %nW2'|z|OHLہ0a:TE^MqH8hrvGpطȒ|:@cOa]GDDZ(B!""RTEE wʾ8tm ǔR#87|/u]Rac]C{麟I*DMryNPdz``5ɭ1@Rtއ~o1qa@i`>==Bzy9ݾ}{y^Usdy6ciH)+HZkJ@~F$f Q0 1**~IENDB`fotocx/images/pano-adjust.jpg0000664000175000017500000004744515247006660015242 0ustar micomicoJFIFHHExifMM*V^(1fixHHgnome-screenshot02320100fotocx-25.1: Crop: width:393 height:273|fotocx-25.1: Sharpen: median diff 2 14 13|fotocx-25.1: paste area|fotocx-25.1: Crop: width:337 height:273|fotocx-25.1: Rescale: width:303 height:245|fotocx-26.6: Rescale: width:273 height:221| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 245 303 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?E5 08EPEPEP'gK,t~_ :߅,B}&[_We.2; 񆃤Okzumwy2Fyv~;|=~z-LJڤdwoU8?=k+=#63:qx6u' ;e?v"a $?Oc@=7ƶOj"&6+8~6aӾ!MX+e#5xzi0E}uv"ǥj|-TTM3Qk[RKe_ |\qxƿ';> LKVgu0ݐ FD~#$/ KNL/D`}ĒM}5j˥.ͰYlݜcT.\: 6(b <#}⻏M&x]#PK7710zU?+Óa1[=cMMUA7,K7I47Cͽm'|'.ūIuUOcJ(I۝/Y.ݬ[ϴ%bzVӼ3YF}%{ GbZXo 1(8 1rq;ȽY%)q:־8=μ]>NfLh%jXi/{)vzUbOjϪx{UCsc4г!~fGJ,A5>s/W$yƁF'Thܡz)6 =?`_qh 3xVS [Xyi9>AX_`_qhkJk e@WX,j۷ʰĿ7<7Z y~Z!J=>>$~xxYuK^{RH?X4a=?7tcw取#~)LxUjюN>%Ɨ#6_xWNI:m-s&Y[짮a]_GVk0Bz݉_k?߯| DҒ 5=VX P8 |V @ӚG/gψvzΜFXJVX&Ѐs'PXףG#Cx6$kHpPy]o:߁oBR5!Ll+*ƨ8 E#|0!ԼKhޓd3R\(֞_j֫X2D5nmAkş6k6pw]#\HL-Gf4dݍh|DsΕi&Bڻ^ojJ]|BS Su\kR^Co0 .Cʣp^|F'KxN=˜MOVQ%دQfe3\?+.Լ^ڮܥݶI=ݮ,݅L^aXt;MxZv%&{bKYH2-{+ ]Ú?FGo ge*;:׌׾ikleK4l;Ak=gR5^HV:=BJK0BwwOM;NLm%`qtUn%;#-O|ID|9ib,A89$׏z x:omkRςÿ= τ>:ctRsY8]?(o\Zb(у^Ǡ{Wbepqmsy+C:WlzuuX.!rvPDHY8jI|Bdoc^VI.ތAfau3Z^ؔHCpA 4ټ_@`.`a6CCeϭ,h:kMԑ30+,cHMQ4]-XGb S<)"ƮTrzz;?TM:9~mHkD|Dd݃>9?q5U,T)p3qT|dj?m4Kht+ cv3B?⾶>n?|iښ4KJ}_7xG_qx2BUsm;:I27!CݫMo^E3hZ>\Dl9=‡]3O%퉶Vز@ѺbHZ J>"xĐ74}J2ZyןE.} {&xNEP0=)iQEQEQEQEQE|`J&n@PQ`M+ֽ{Ӣ/w  M{HC/~ TVg4߶ V&Ǔbk+j{_Thi~pgߌFc^->#pxHw,!x<2~B9c׊ fzfzm_FpZ'^tNkۥO.< <5.uE* f\Ws^ã.֨c6!PF~sjzTIԥIS$`x\SY ?u+ۋi<=ce}vGL7j!GUjxWЭSWsM{^UG_{W?U+$|q%h*5+;_ռ76X:^P»I!>RA½H-m2OCgk c"  W#=zUGo{W?U;$6Y0OꟉѤάUaQFxfrBfEpIM&XLx@G ?:u oUD%yeWpN]o OhVhz~hXë)R |xoo#0P9 7[ l<Mo>'k:&;ö,5=>XɝP!ݟw}/῅躏'^EӔMd,rZM͓ۊF|;=o*[ ⩉E#=aSVK-<~c*ֹ;J4q^Gvq[GZ<'@ұrg=Oofz@)PVxZ7jz@h_V߷ ?ovg=jz@h_V߷ ?ovg=k6 '< EG篿(q(&F܋E=)%W`07# ^1~7cYh--RS.$rVU G8=G(!C.:7W\~x Z11i~% 2,&`N[8:7RB#q? >.\|@t__z$ޝ5\tn eIEzOu-_ºv4z $o2AW=wG(q8#xEu6iy//5ެ4X|LoclJ̃nz>uC/AmXXҸ (:Ϧ LjwchW!Io2'+5&l45(MŹTiXmeac>fqdl-xďBQ sж謹{}wڙcIK:Dl*g)tׂ!u|QS7宷ixɹ)[P@0nv+\G?G$ >:7WϚ`xiEmڶI2;D(昅!1ɯW3_ DC% 6Վ1,=Su?G$+>:7W_~ږ4o' '  bfuvKxO^ݚ^Mm4ʀBc>O?D^!IU$عڭq"5gۿ: (>o?ϗvzƭG⬾$7v鍫{r#!#ny9#)P: (QEQE)(((((9V G.'=:Q?IH˭f-Qo3+-:-VKiISְUnPBi[[+;OgQ'$Cn2Lߍ־?_5];6W2kK9XI~l:2lzC?;yؠ*?NIYX|7ռ%>&-k%J"'$O&U)='Vt/x?Rd snV rW8'ֽxx>*A}O:lj~>'_xvxY]b;bElHZ]$:U ;݋Im-_-x9S½v}QF>Rw]$NJʏ!G}xow~!P,/5'9Ou@ s{fvH/ڷt6-*mEl[=@ұ..<7{Q[5hk_7GdUlnnp}}kOR1eN X F[SғW˭cSD48mu-nn"86xrC1huӮ Z_`r2Џ$K>G\4gR82LOk=oX] e`gm,D3yUk~'mg^)ƛHMi&!rrM{G#C-9ìOg'x1xk_#O vu?O x{Eu#Mqp$k>]|1O}Mr#!)UPH/ꏶ_MEBomG庁ǰǀ~%dsqފ_eQEQEQEQEQEyO ~YNI-GL~5>#|+Zn.jV͝$IV3#־ Լe n_meu{Yȉ$*pY׎G~^#3-{I#> KYș)̈F’!OW׃[=>(e%C4 WhDFH:K9Hޚ&[?MWN>&Đ{,.PfWE)oa׉-4XCടT'F&)m¼>?ög9vP2 E3ge8 {ƍY5ţ\\xytv*YG^^n}zND_CHh o ^ڪMzK#i\"Ҡ]@j0M}#JQ h$KojZ_0|$q^c R2Tlt*olo݌]xZÖWW\@P1%GϗqT. k C{rH? wF6տ~>&[k&<2AsX>Eq/> :ּ;u>{d$f^z(5Cp? Ac&Kӕ$r޻{Z>xHu[aVbJ_ Qwjeifirv&Y&* Rj#ZG?“0Km*1MH@"GkD[ii d 4|%Kga;+F ⺚?[Ry~%Ξ3[G]HzpW_t\~дBJ2gKihY%#j9{v~Xx{I&45c"L{8t#F*)ho{O[ƟM-.x~^pYAkh)y-fխ|CEa5/-Rɜpwm9nQ]|%5xSȹ vig :sO3~VJ<-]ݮ, |Ն2Wnqڽ]k^iBك(bU2drx!xVFk7zteoiv 8\Տًw_xD [Fdm <`}pQ4>&{"g;HIQV4AzLPEPEPEPEPEP4dה?>Z֫Ua2A\o'XiEx|>ez8S>:qGc^|yԱFn8quͭ?fge Il"MgY|xkkwO@%<={SQ@B(8%I7ompA^\dg ڀwӿ(4jQk築_= BԼ4M~+藿%'sm!} {Aokk rX b`bˬ\O8i!S<54\]71!\(SE2"@Q@Q@Q@Q@Q@+Ox 4Z/-Z 85|_ x^kA]\E|ٰprI/кg>ƥ{^){oE46=9pavM5!Eq;[oLl5=j o(.G5 Ÿ˩x÷.B iKh$]^iJu^N@/| VxfmgU:X 2³ۑ"+¾-4ws?j~8Kaiu;ZcD!0Wj9x#^+׼%xƒi6rF] s^A2cA[C,>5-/~mSlBE1}N{e&<II4_\iy[${dlpLsk]8Oua[[)F׼]7 eԯo(INeR`x_NA>L5}N}f)}e{g &txoOJ}+5|B?|| غU֡k$LKt 9#vx$ Vu Լ/?|qV 1le['}u,%uc#m j*m5O im\Iw*#/L<0}b& #''!oBTl|wE+ ,B>ѝ3'+/ hpIcW\x+ iYNڃ!yy>5zNmy@rá$T[1L=i ((((('G5 a}[EucI$וYf hA#gޙi/<)[…hGR2k>[h/9EAg->yr w@xoBj5qˡsi5eKHÑ!l"XYqw\%XM<'t{:g^"/.PԴr&i޴6C\2~n?j|mmtk)eXk$j"]ݶN|rԶV1ev$/$nUTkx~:oƽ;-)'(h6*ccWO.j ⻭f ි{0Hf}3Nzou2Zj'I,nf1ii0P=j=g[ JW8,.eD8u:e{;ׂK :˙o|S.Ci C)pU׌>'7]Cz=["WԡF X;{4~Ε7~!e #uV[x_AMz{W +gOǪiBo濖ݛ{dytg#+sZ:$.-􋖚6^rBʐZVuڧ /v SP h@#OpT ?( WAgS|2A-$16X E$J[<6u|ς {e}C%[H;1EvU.7{VVS.?Xx/U=b= &MuQ+ 0i`pIvw_*%˽XFy %<͋ mFFZrN!ծ#h’O8NLjx_e߇|' 𕅻Cm,yl0HR}3]~5?j-Ze| `J.g)ac@} :C6ď-ΙYq;[Lyw8L3603ְ< ^xQB^!mέym >yL2ƌwe {uY>1gAҢT e!p2g=*^;~,xĚ-o'Xa;4@aA #٢>/E_sg] <+xVN,E$F2-OŋYw']Y,ⱚ4 65 GUӾ^ Ku >losvҲ\3e^Аѣy8g#`%aW:x[,ZtA{zDT* g2k~~|?D׮$DG񼳔|!drGp($>GKooJ}tHm\}"C/:SKL|7v*> /]ݵ]<}Fe0r6dW_|-jz͟u :z$M7o$q%I$pIVd7o­[zFo}BG5S6 9o3HЯ|گ}φnFϧ^ =^q*X|1$*sC?Fs]>R::v[I #2HЫGo]tMF};W.G $Do*t=y']gj_隖76vv7m,D,\ϲTFAa#$i"{(0((((@9㟥3'֫OoxҷqGg?Pߟ]H!"$Z/ףȿ^/Z0qdzP/ףȿ^/ v"~?z<v?Z9U"~?z< fT</נΗmv+nKYT$)%P@X֞lEP/ףȿ^GC<:uVqO3\H.,zɭ $:y_?@MqO[q_'27{5_?@t?QcK9 _?G?Pߟ_ ج/x4G #Lqс^/ףȿ^+W7xKt+olW'=5b@K˻8.\k$ A+Q_?G?Pߟ^) ^EC~ *6CU"~?z<{a?_G?Qߟ/l>a?Q//ףȿ^/l> ^EE~ A71c!sS|ɢ%PIE-PIE-PIE-PIE-PIE-PIE-4ii;:֓{jH}Ko*v?0dWc_4\~%|*<85K3cAy<9+㏆!u=23<9#qY#Uˏz--]/t?r 6XЪ7xF m[ĢR>˷، &ߏ׌׎&7  |I{kO"E]Oq8<1eA#qjKvW>+)@xyc@e*0Aν׮trNm+$@p'8^My 9ARK\C`K42=Qr^Əg]'ĒLդ+vCp@|OnZmſ 3#,4OjwC&eBy>5 OqOZvwcwy>OE"QE ( ( ( ( ( ( ( ( ( ( ( iNWzW/Rn^gk{򲼌{WUk K=S7&W|ᧀfBtc07B`,IWo֖Ûv 1ݸ`ktB:j o)hWLiG>]XŒgޱE<*$Mo%vJc E*E˗g@MP 1 2 3 0 8 2486 3719 1 2 2 1 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((g=ZOeg"{B`$,ܳ4Ew:xƥIXK?joK>$|K : e?ԮJWhȤ?Ym{ |Ewi6˨"oֳ?|%&򆱥Yݝ/D|EH5?xlmNuKէ$ +D+ҴVuD,N ׻:H=CFk-%+})*H5j1]xXsr}^ eeC4%L;YكHǻ O٧P,^Xkۀn|Q(ҺS"xM8$uU$Wq̐iCUeX=ٗ+ QBGz7`Mu߳eƥjZJYQ 0)d`~Y<._GɳKle? We>0vjQdg g |*uxSM}ۛs\>3дpp</RMu0թGqȢ*P((((((((nGRZZN0\vCIX^˦u Mʙ#(b5_iN4Zf+p9qak%o ьpտ W6[*`{+{8c'#kH0$:|;8T n]ڲ?EvY!bDžul4e{=K>);j,1_xr8;U@6~RIe¤$h:8>T{LiC_%<*$mQՔOo| {MEmOM'w6䌕G7> nO| ]Nus۰TqF7b_hkӭ|s)kLjSqСBIEBc&<~fv?Z%F=y>QذִO*bSǶ޻ߊ_ /hڕKmE.]Ls,.\.ݻɖ̋½TMc5ݚ]ȄI#_δ>/O x?F'-4-,u"Uh# V9Sn٬׌ܖnz ꨥEͼO,܅t%~gU w(ah>LJ|Ǣ:p=++hamZmj6Jvc9 #crFrˏ|50t Q* ql [$,} Ir+_4{o_ okk{FKK&Qc1ؙNXc!\tql˗̈,#'~ѼR^8n#0\;mj˵qÕ *j2 I$ 9R1Xfo? jvveXb: }wஙo Z6/z/nx?xK+k-JDo,f 28R;qҦQhѡQ”oRQPyEPEPEPE|h:-_\oTn,ʠzh(ҋoC4wF݀%wo8MXo!O m( cۆR 6}''D,, ՎMo.X 0$SG ?db5Fx+̣G'jXh:dE.nGת4|}@.&Ǩ=> q>:dz<^|II2x6^zq }J_8BPOJVw .N7W|{.x l7ĺ9{!98_@ XHq`c Gvٰ4,| =jZս1J* ɌԬI+k沫QԃOH%gG=ccs;,?`OLt6ֈ%x3#'WVu}])FBFvȪG$'Kkw2Id1ې>y^P)zoĵ(")ZFm$.AX_> lHz+Y0]^H}.hY{75 J?*5Et; 1- Z[(iQ5w#o z&bY[H'qYn5|Q2]־$xJG2ЙGWy*l iUτ1XbjV ދZx$).c'[^ @]\-x$`vOTa? ]xo?kw_a#]Iϩ5xQg3b#< v<\& u_OH~V:񥴫O .Q+фg3UuYS/ ރg,c4*f]quWrrw,>$~uI/0{LT&~uj1MXj8M*.Xc &C5{E/taʰ9 _N+𶉩Zk:4ĥ̉Pqlrr1uHB`WAiI^Hq N;ScDy65W迭i-| [pY}[5 U@|j)xIJ9.؏ 7=>3 b$OΛ,2#$9OjE癨Cq A( &F093^uD6vAQ`TM]ԥ>izPm R4< 矸zW֒gŭaa&Iǫ"~ksGY>iz}6@Ddm?C!(+[G"RCCBN}5Eji (((/iҮ8 "[|p2jMj&<8g 32M}wH>\NJF8><9 ]/,[*4m62x 9wyF r8A޽5T>i;<Ԛ"jJѴxfh㕺6g5GksGcQMv?YFla;Is| 7~&{ɹ!HT()=xugNTkgDg/RsC{"][N5{9_q)9?xf<9_aV&$Im$Miې7,B B+mTxXS \3<ذm{uD,/M`iᰲ_ʭXz/xv vJWuPsbup#v s׊?{|ळobW.gݟzk{>MtX9Q.^,JwpҒS)5j/AJh# վ=3Nv!k1 p3n7,K˻4B$KI?rܥ 9OU9zзUk;¾/.H['yf=8$׽y+QSJ^_ֆ7Y=5:+kIcM % #V$;h?e{<kzΰͷ.g rrq3]_ BԮ4L L n=r98j?ړPU~ouG5b [u97mpIϙN8xZs3%46xwSM#l] 7]?qgUG\R̝p:wu[VXe`mԻnb>^4<}ZM,^>7WLgg kHvy~陾iH2;ƬOV/AĊS_o7`s_ HVർ@YXx&Q@$OP=8-~ej%nI=c+RUi=_|pֵ$7q>f$$мCU|x{T^Z#?n2 Z|kY.-%g,WNI]oEyR,?ݠCYb r}CWBW+z'ng**G0z\0"2=3_?,,ܧÉҌNVS3HcUgv c;I/DC|BF~K b y.0~BUrh.+ZyiSmJh.9IZK2[ާDqѺ:<yJ0~3rk6Y呡&FU-ӍzWw7=R_HFH;:r}+OؗD_a2yٱBT2 캆%CtцTq_t~7c@~"xճ{y0?QWb5#Ec㯉?ojŷŪwW;ӱyYJU"ψm;Km3ȧү嫵׍~1 1e[o/S9R2|"sq;8@pMx7;m`h,(QIy?1## +.nd3O)3w> X+ɳϭ[7ʭv~ \ qq+LFc` W E-SMQE(+_>"^&uY汙gnYPuY^kdWڨ[IfbO\Oa_I0[a@G$~bW`\P0?]Փ^`m 񮕊-8h1kZ G9YsߨTԳW3'|v ʌҬ|0pxn\[^'? (iL*KxD}\1#ҹ0ٖ'nx{J0jCx!$!9t\v9gc<_;}O\5cʰAr+~mYm4[BGۭ6㎿4g?.8&|{7Óլ;P!I$!s+%@G@N9V羌6+Z>?q,__|[D3E:l UdξSIc$AQe߮k]&迱\ ']u]] 2LUq)qǥ) .;VFN=e,$;sןǚ|Gc:[(/yYYȸ`m$ĽbG%էY;E™2pABs^eٮJ ֽH}'?J[gl͸/!\!OLf%Ƨ=Zxf>pAʂvDߎ8n}x]jP2+VRWfM}KR}[N*r2^@UrqG $?T #,(yg!#P2G?>XⴷApЄWPAO$3Vρ4[FH{l&x#ղBN9$< .{v}q3i.Q!BIc^-WPx.I%ulwNcⵤTb[˒^ !\%Pݳ_ }C_KX\ X;ן?J)a'oq~iZ}Ǚ$ˑbAտ=ySWg|HztƹMb#F2zz4`rH) r,*x|Dd{F69FzyIt?ݱ=7>Z}eΒg֭{Z13 xgRo&խ"-b r6|Ts7* |ӫjk\ynGD^zՏjo("qяsYu8B/eOr84QEIQ@Q@Q@Q@ŗ<عָ ۸=5y5䵹AP J́9Sp?=%#CH.bx1un*Gtc\U@]ÝF cBiwqwZeޗ&B1Ğxyex֣QM˭"ý4KJ/-&0`ȁ(@<ǎ:?d;A[. v2PI*67@&##5~ vӭc{yh$v>fA߉|)oizoo_hu{=+lx»>I3(-5>ֿf ]hqh?/&b,5I>%R Xa@xwZI[ƌ dn+k)sw&v汨ikGkDHՏR#2+|%|HoFbԦvbHRNzgҟV$J yP\eQZ-|';>= Mm/U--6B7$/ ;P:zW /QkkIlo.'XFd c&rA?qZ\dY!_%^9K9VI;x_FfM.p ZG$9oa0Gm3^CvfBGG?zI:m d+x\Ok+'rgR2sF y~#uP .TWeg `A=B# YˡHP"`fvns~]7k;m|H3W뗩݃crTأNF<ڡ#:<>_VQݫ}Џ5D]ZK͞-70Ÿ8n`dC\5('T8U#8vEv0dڲRrk #1 ,tz1x=_E+i,HmY6 wp3Z̤n;63渟bV)ATuw+H! ޳)k|Fo?x{F&IT+K#h9m5-Š(c((((((Q@}bi q4zSh4t/j7z6{gx\ ڴ/"T7{ͫt3J,O!y]s՜ƙE8֣-3]G_z;2>g ӧuJX׮JBD @3T4;9}OO~b6|'#Wv=<_ʿd2DMH _W#k/xroW1#$ccL'_5pi'Fڢ== fdaWi6n1ɫw#G@y\cPN7 ׂ[(*p+/QE ( ( ( ( ( ( ( ( ( ( ( ( Qųl 4ZF,x_dY?Iq =G#Ƶ>xQFe7?glaQXQq"A;OQYA۹V7ʆ#'8M]1j>iWN~b#^"hpsǞ.Ro2i&bI+v'O$K^X$%b[(sp#v\ZTJM:1SRn+B(((((3sZIrs (fotocx/images/custom-menu.png0000664000175000017500000006772215247006660015275 0ustar micomicoPNG  IHDR5d;TtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 310 162 1 0 ?eXIfMM*V^(1fixHHgnome-screenshot02320100fotocx-24.60: Crop: width:401 height:530|fotocx-24.60: Crop: width:180 height:344|fotocx-24.60: Sharpen: median diff 2 15 16|fotocx-26.6: Rescale: width:162 height:310|fotocx-26.7: Crop: width:162 height:309|Nʵ IDATxXU[}sc"҈b#vcc+vbw+vw7vݍM JwwAB1sQb1Ǽ={ 6IJJ Muy@P.]Śh<)i)hΫQּќV4@T5o4@c4 o> ?iz@D[Ox@=@Tm._J@L|./\+$ w}!NńuΝ;WeL-\8υKW AuGA<DL׫O9J-@LKgzQ(O|ٺ6 iss5rC+n ˫i\ER(£2ߓ˚yC(Z@Γe(*i2Myۗ0?Z}{ '-O!s&:Է]J\R.dˮDũps )o^\ x?{Ӓ*URޢo<%|nPTLj뱹ߡ9K !UqmX6dzq-ZE/)\9+y_dvlZ͘ѣ6l8qm qg%,|3Nw3bHVo'\$Jz0S&O/5HvȠ6ձ4Jz-5Kܫ7cLe۾]̶PsƝڠW3 vMo/N=x ALeCI~kA' F{X?'"^\7~(o_JSzzOPϛX5IY6T\݆Փ@̒F-}v`M>|_¼uH??E˖3{jUHAcq~_Q}-5ܠnq⣪N: stt 6ZskE)oJ湔76f8{yޣ>]F϶Ec140פ͘6ZԧUW:Ţ}n y$$]`@]s 03o ^.7hӨsz9|V+?>F5pQ"̝ЛL8R8QXeG]4_~w,E|'b޴+^~e+*1#(W;/ӿ}3춞!81fs-, :BjXqG޸\صf  9pẬ|IuS]jv#&[[x.,qe[۟r#*bur;4|`bbEK1z:BJwFZkݽ)r܇UJ RO?p!9.kGSf 7hy.\G]#Q MT,o xNx̑nĦ(A,u'QN2%2﨤ă{knQY:OX[pH섿pIEl?Ff,a9< dԈפa(]d֛@޸#<U#iNDd4)*M8{9)i{͖YeŰKQtPg׈ȷ#0)G ɚ8b|j2jnQsT fL݃`;ENoti6s7봭Ͽ(ŒD$?T]9ݨ.G.]h+Pi\0FjR=wE5umSF{40unOZY{1%~2zĚ&ts(oVX dÖLѓ*ժRPMI|jz+W@{w2Nɥ{IH'%pv:VnڊGyĘ0gL;&O̴iYl5>&.#=Xj)SNUh:B|8s5g-ӗ)xOy=V$+M H>X@0KߛPqS,W:X OD*;i*d zmiߝBR~l༳>K0sǹ }FZ/, /lA\X2u$6$P`=V k'Dsa Klݾ]o۾$gȑ/-TWWDix&/XYS*sps-;ee"_щeԩUrF:N`fOݫl\O}V 7,ERbr!:q:mN K* k#SdqKVv" ]sZͦP2Fm{sM?5{c=q!;ק-g 8=ĉcGU^0TUg6=ׯ}44|]k\s !BKg79r4NnIi@ӾxkL'"Z;3q$lm0`0N >Y`K(N!ӈzOe"Fj{ F҃% WQ]vh*b@*kGRMoܸ!8m4.oly…r<dc  (|̔n>bR|0'vcۇ~ln^f y3a.׼eᦷXI@ qF(XX6d*}:%}M@W V2̻ي^}`մ6O\-w4J O֢U 7n*/r{Řv.ҜSBsGt|25B p7a΢ZJ?IQp_|ZnA .i2 *E *5, #"KS@~,[s鱈4ò~:Spb!"Y2w ok"b1T097T 5[}t 7[Q&]߻݇x fOg!'}a(?,LmўWjL5 &ȍc:_:f/a{;{ɗ,n+WƌՇpinG̡> 2g:R+OK:ujيfm9v دy&ԓ__emeŎ;OU%0dL^ [4;V͡E&Ԯ]]l8Ku?-ql%$_DC P 5tnCuŶz4oц RT,9Z]U^s\vMT5h؈Ac'1b0Z3W s-IֈjΛu?4@ +/b^.(o @M1/7 ˦jKʛ?PaeS5@˥M TXyT r@yS+-̌ڲqTTIVu\|ʏIBpp O=$; oY8gbԽZils JAvqp8SffDAY,E2DvX]yZ'_WpdPJ)O{@@TsrVF*Գ]BXL:\!qb_C3a>.LV*MpA** PSxx>>>H 0Qe0c{\ҟ ">zZJ2a/y__?%ve B+Pf!Q"x$ | %rni)]Z-r掣qe: PfkRQyBƴ\9*UԄV9pqg)fY sʴҋޤ&q:j>FFF^B>{+ϙ(J?Ebх2jK`AK-㣃Ғz&xϟ~|,+Sag\%,nL4v д6,BRBt3p-< UDcz*&e}DA%Fpiu__z@@W(0j:n,ͮ.50\E pGB%7ue~YT)Ì+~$ńqx#jSqڞ.Vuٰm1a8:Z7N>C!3 %z`Zo kwXfΚvӧ0s]JVc釟u_ځX؜՗\C퉉Qƭ;Dȿx짰N^!6RD@ј:bJxڜy_ dt^Bb9Â)aPa|J/YKXx1+o7Ӛ'?Qsktm^S,(Lb9?mB"vI:s $IMRe'*[3Vu1i>1<u+9FnEE5{9k *;H|||'߫վ?q*e2sH^7 f6X?;EJ}=̊y13֡|nB"%! S yΞ>Pl;5@q=z.S@A_?si+\IΣȚy{)dtoS׮sAO3qδ[sz@@09J{@_̀R+z0b_tJ@."1X{zxq~zʒ@A JYT!܂uI:Eȩ(Z%KbnQfRR[u,$z3s/*DՆVy)SG)xmvhԒt Rp+0n׭پ oMy Ry1b^Ȃy@4@b^(< @!,hJ1AuW[F0lS3Ģ%pH~SZKEu8s}J}@$yCs^$YH}r̬9Hc֯»n^ oMr ]Yxq]\J3GEן8}y.P#Z5è|U͗(9~8۷n`[4DuuwcS DE"{W] 7nsQnQ99y ͣ͝XZ%>dXT4yxgsjbJr"Ona஢wc2բGYح')- tkL.=y&2t﷈@w B=*TyTj[ QŢ~8%J3~)7Vf7,uZ~"x ݻܿ篜EG;}<+G^qtx w>^:^_Nd @##y4DV_$I0oOcځm=`ԞWkuo8<D"2:.-7'î$-=-Iz@o_M_ Q۾4@դ+z@o_M_ Q۾4@դ+z@o_M_ Q۾ D'Wٻw/u'ٷoGT4 ϝ͈mݔ[ ܞ '5{@@0Zͬ4ؖ ``Oc^)_V0>&5u\b2kgϗ6;AYk&< 04c'aޛX;cet^k잵h9gPȯyG(Z J' IDATf?S;! 1/ҺvYj`Srb,g̈Уg/[_NiT1)A =CZuAnYm~($ęeFY=#ک[ѯo2ԂG̛ (k`ܝGN̒ga$f m-cB@˘n (maҟMUDB z0L 4b5 NPjE`hkkSxQ4d^3@}RZXb3HT`>$Ju~8<%keނ cUͼmxŦs i6J=-Mf"bfM%~9rKIXYrNhޚtpv -ݎ̑ilQmOk:`w}z-:BBt( ֡f˜PJ AOyi?c+] Ę[Dzۄ凞T^?cy jk6}})\2$i<~fjgj%ES'7iW9ڞ[Y&0sX' .Kel&Tհቷ;^>w¹xEDq-)gلÏ]FFǪ}(T(K^ /Fr,?Rᑹ(\g#߰@O6-o?I&hU+'_s:Q#|xַ!&ìy D8 %Z6(x|q; Kbڰ qx8KT\vѻwOZ6ph C)WƄV?ЖU{Guo -;t]&TT#GބnAL;GмA J($ř{ާwG+ o՚֭[bYn7"3{K̏K2*Kp <9 ħWzf;gž`gŪu%&*S8be#˖.eɒ\NئL "ԗ{l\NXr)[6gQRTHǎq*ƏDfʽɅ Ž|*!>.h[E*Mj`_{^j VW݌1aܿuX~jߵNUY`aT0Тp[:մiY\Au#6ck;'͆ X/Cqlٶ+[ϯNEJGHՍ(C6zʃlݼZ2%)gؽc*$[nㆣ+kW_}L@T> %I8B@ p}8Xn@ۡE5s3zS`$o^PFJШ{N᣸,GMǢ|i֬Щ35j D3l{XehԢ5m[5żrez  cZҦOzJS8v(,к'w_f[ xLꦴlӓB:~ b( E:6= 5².= u[U1g<{Yɍv95rheUrZ|R;*&Q셇ҧ={68O4( 16Lo9!pt<*H?s+e̘q[~#Q۴*@Ttx/tGD\rYr&\gDp=Zt2Ub4 ;i`%Ǖҩ?<CRF`Y%j73h|8Ϡ(lRF&tͫ0bB>,SCع~,  !Bo pʕL9*UY\|>T~8e3X@If *BX`8 `SSS Jך9re>Rpp$C `XKn]h+z~d$Jͧ\=}{Qw:kviӖŻe͋L9۫Թ+&k7Ŗ"g׽W_g#S+vc`ǑO߽1hgmXK;w'4*3=֥ͣ3=D 5/2v`uT^+FMK@tV @~јfhfk^4@/jjvu{@9fhfk^4@/jjvu{@9fhfk^4@/jjvu{@9fhfk^ ]l([ł'n*\7&FoT^Z7')UBoآ#|6bb| wfR ÛA7zfqc31ZmB 4`!(+ؒ_۟*%rRb4/OLa3h86/ˣ_/>I)=ϟ.5h3W_>M& оȬ?81ZW<\%q{hfpuqJG{ډ"h<=x!'hְUUDz%UTNl?yE"+ Ԑ~!|auD.Bէ]Flޠ['&^ɰR0DM=FQ&ԫ[S @Vl+9^ҨV~/f_'4#9w9]iX j%Snh=῔״U-*OBRPGHr: ^ZM[1jd.Cm)^ [9s_bj Z(kDcP#&_(im;;MOĖFxBlJ{7Ŵz=eXēB5e' 5^+zXPeOٴZ8@(8ڣuv83eƌQh/.iBO Fi`ӏAFHg$.{X[dMrڎ15.%f=LL@KUE$UKS]{KAˬ!7 (T;|~bjTCg 0l;6߅kAk 0=CYuJэ0fɓ"`UӔiQB`? i22=*,ݺ&:6˴\VxUԤ8\EYI*KUו@l_'5P5/RitW 8g:;s{G/ 8iBJVit.UU3Vu)cTE7{B[<{'U ;Ӟt%'r<>!X~Q4}:sdTlKx=@, @͖dv\~$f{wzZ1qZO!#0l,֨xxcj{EZkZQXۀK9z8K-SʀO=-:q.NF[XqYu*iœٸq-2gn!2Kc'D ~$HM[RlwLU#]6Dd~ٛOz89!5zHr2 xi3vXTA؜[/ƾɗM:f˞=,3J&1/M2=De&7ST>KwFIqlځ嘴b;⅛LߤjDldEZDWh[K@d$O:=~#?%"ғ Ү s;l'Oij3J%PrjP~[q܅kxJ.[ Di(\ jfkToV9kPD J*MJfNSA?+UBumGDsĦM#9EIRX4lF+_t8z,:w$qשvI+&6H-?uEF飓YYc=:  埥(ǐ2J:6iQXqM{P8;ڢ+Rj(fmoY2C#g0hLQ0)DgjV6S塸uJiD<Ô'RqzzjW3uH@TC~4A=Zpyl Z-fyDh\^3[ļV?h~4@A .b^+4? 1 ЂkfkJ͏?h5 KеkW  g~ӷ[9< ԏOTW"C|ٲh"vV㮢>**[6nߗp+)8a%Bj7[dG.Yrs>_=9˄u4#_8y a;ljoDt?'9 lTO+X\z$M@,nP{SO$<;xZV )T݆̅3l` Fـ43'8&rvD;pvI[p=&jF~gL]qqPˣbf6h"=ҢndWIJ='%_<:oּ+[O^׼zj @ fxk3*N70sSH!!#נ10 wOFdʒ|Y@UHzfԨY+dHL$8U}GǪP|wS;.1 IDAT FP{XҼԈ*fSNd?viV^Szwj#CS%tms ,ZO4rS?ũT5N9Xu_E%1eg+x&@YVׄ ۦcU{|?%9a2&Iu/ŀY"o rV: vMmO ݲ\K!e\!%]y]>"ՙ&+R̬ϝgGj#;,u\Qd/PZ tK*Qخ湻7^W[<IԀ;9q^ZXDK3kU?\S#f9=Jl,^{KiJv2Y8L> ;DM[?_#*y~G-yN:T-Jud2ʽ 5⢾igA_/ѣrѪ Lę&t!]8G>F<1Ln[osȑW$"6*ah&E1bUی~UW6a#EFKoVbEyN2}*Dol{h,[66D!ᝊ`:^*Eq3/cNct[H* *åtP'7J ._[7|8c+O^WAM0Մ" r LDe;k`ނ}&.x]aRuף^FiRB1tzsfPjׅ>鿤D;3hS9RKMitK)J֕]ұ(n>s%9אPW* F!2 >Q"X1̊J]AFW.^1KX)LI^/LmK LRJ߄ 7qLILW`)DpGg p>P8V Fₛ;^o=d"8}xLhn=x덻2Aܔ* >^#!4y77WqIT?* ׌w(r@pSJRKCe¢bTS*a>QKL\T5@ g1Oğ|jb?KI;/<孓]-[bc'k׭cNU-˱tDŽBb6w?ؿcg_]^T+oQE}I`@NOٱpK}ζOg̡$s 8݇y!W/_Ё{J~\KgOXK#Y<;,AtүGS@L`׋,x㴩S=fOlt3GdYp-tn'UB߲`|?FMǢؾͭk W_|:Yr֍QϜkY2hg\_`؀޴l+IS^؟Hcݦ {w.Xhłux:Fe3Dkl5n=mXa ]:ZC|rNc^-B\Ǫ%͛7gԪ9(3u ƿ${;3UeZpq1Ŋ=sRc"7M`- %Q)鱨FhQ`ۦA1]T@4aꁳD`퐺^J}Wh~tOjb1sEEn}gX{ݙ33: (ATPA%@A*QLP%HVr{=&#:z`t?f֮ꪷDL goPC~ J}ĦݡcV:|BܪjQ 2o+h?Ϸܐy;<11pՐF)KH b!7Y: OVj<1B4(/+ʆtEћ榨[`ubJP׮˫/s1PaB&iȍ|.| [3gtDuZ>c-Ri 磺E~O-I3Q[b&$DnQBݢ?E 9 vjLr@:%-I3Q[@d̾W҈rHT"w dEyij?,IGdD8rɅ{jpaxI3Pӎi3g#2:%_4P8ժRΡJڿ=ُ#5`0!4!FF;#M#JKy[gczėݶdIVj=Om-sϧwxH=b$*s{6$A9s# =W s0D? ˶(ymP@dZx>7Nb- y'G,-~P=qs :OBoaZ%Eq۷{ŁCID2E'W1e$l{Corj@e!ys={Nx2jx!=J'p/wOC7:Ea 4uD#m=y.8d/x Y) <{{# aWqi痰Ky'փp;{ pK7@v%ZBkZkBv~h o;E|ԐLmUBH(NY̢RwO3ǖ-3uKƄxv7"O<2: ]q z'q)31k`~ēs"!Ek0g2$!OT˞vm<^5^zCNTWZEt*ҷ^KVg=FPX`H \8H '2[m5KpJs/,zd\.?B6࠳3֭ Y}JH%9&ͨ1g6?9 T篘BP!%}}}͜qО^Ms-{Y)&#E$ȧm8d:KRZrTiNڙp1ɡ4C޾yШ8QV?t7DpD S} &H2YS [x̘e%ˍ+2J&>u~v Z*23ÀQ{2db %(N^O!3WS_G@jx@{)FH@}-Ò_̄pI'NP ۃsr8"5?X<]VFPvgϒx([0}.)u&DɇD2Dtk~.VTx*;d[q[Cg84\ ca`eYZRu6Y1G>U?&Z#vBXL'?@uIEx0ZGlYx,P֐HoX>#Ϗ$l/ؒ)+#~ViٮM5WWW4K 6HWQVjy$y`6J"Ƒ_RDT Ii/")fHZ}K{Q]-%AFj,{qsp ~}8"@KKv8 ͏s ?*Rc7jr0Myy*RMVǻNV(; ;/v#7oyqT5&y58ARZ4!Ejw/Q|\c_I7l<;n ~q"D@c0O,Jo/2oCO?L^BA1ݫC"q8Y=Қ%U?bQw i:L-л(QCİx= GZ$Ė<"Hi3iK V Xxw8\B.HЃ#~,hLEVpu0YI 2aЛ2 l4'ĩ0ZXW'"!1|#≤t0L50HNyqFies j$mߏFs0F }>?3_[D_',_̱}$0v"2X_a%Vҹ&x{`FYEb/Vxx Vb8|F"BNb(vX߭X- <Hfk4>pO!!dp 7YPF=M`m-M +֯[T#ccwJ8NVywlv ,M*܋fUEu]` Mx4[xrk|e/ZbN_؝wȫ3PĞOPM~G)ǃS4| sWߐ_N,| wiEbŒK؉qv]8 v],:wiEbŒK؉qv]8 v],:wiEbŒK؉qv] 3g?D4i(W$aϩ#wNf{!3|}lzxp|mqg%|m3 4Hֿ]8f)d^},ǾtÏ-c Ij d~%( 5ror x$csB[ p3!Ok(ifcqtϖ87 -1DV*#1f&N]uhsPZ.ǃ)r9=_e$Fa>eab ɥ~$daH GZB(,@iphMԁ*de{ʽ"p.މYOW(J cʪk}`NXwB^oA)0GyQ U0b )fdFjʈcwB95t͹v"D5>f"39 '`_ '+znxiKO3AGaL^j| WpRN&%cPƑ{^hx9nRoԡGj+!ݕffG2-$U@  Fb )lT5[ Y-@}Rk"'wtU+@7ބCNG`0\^ċ7`Fs{y& VctAn-|,iWMU4o$>}p%[=ñyB WVdan-Yo箪n:|@YKCJWDaRb@-bid i t5 `a:OnܔhU Mta^Q ^}] r2KCRr`N]kUy6WMP?IDkn}."W ޤ$h1$s$$W 0ԂP z̔HCϟ~$0sD߀軜OœDabXDɑhߞK4̑̚Ic%/hy_%A]Ck,֝pw݋!R 9ZuͰc+: UA0Nw:|]wfr d(`9c_g6,0K31PK IDAT`żPT u8zM-f(W0NM}Esg=(=0'WbbXm"^cMY7a$,\FΨmnZSmd;խ8mtU D!$|cu8u v,үb ,i~!O;]Qj؇< q1"Yk#W ^2 yU-A**+G%=W7r[Osq`<^pA8 El/-*@a71cc2٨kys튟Єp6tGDyg~wZO;Ma2M +\|5>GC%iє*[l0'TV Su5T֎s|+W\`|;1VI#.G>5d RJXbR3y.x 3xq*(7? X qeǾ7N< 3s+DV"1sHpV|,cmN/t/W9 X=O Z3I e8wd+$HHeiGe%E= PR\^WѸQ,h,h7rso+JK(o8۶u(,G~AQY(eTRZFyglkP\b겛m4+?G5(.*e\QPTB_u GEPrL8 v&zܵ]]J.Dbg]eeL8 v&zܵ]]J.Dbg]eeO#NsaM#IENDB`fotocx/images/moncolor.png0000664000175000017500000000512315247006660014634 0ustar micomicoPNG  IHDR/I e;sBITOtEXtSoftwaregnome-screenshot> IDATxAj@EQmr"h3] xE!c 55PRc%5PRc%5P:O~w~bލ@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I')SL2e{mƻ1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1 L2eʔ)S:)_*Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj JǓa})SL2eS6@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@xp>4 L2eʔ)S:9_*Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj JǓa})SL2eS6@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@ڮ7mL?}_:/2eʔ)SLw<)_*Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj Jj JǓa})SL2eS6@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@I@71/Jj Jj J])oIENDB`fotocx/images/saturation.png0000664000175000017500000006076315247006660015210 0ustar micomicoPNG  IHDR7{ktEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 256 345 1 0 >eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:347 height:333|fotoxx-23.70: paste area|fotoxx-23.70: paste area|fotoxx-23.70: Crop: width:345 height:256|fotocx-26.6: Sharpen: median diff 2 14 14|fotocx-26.6: Rescale: width:311 height:231|0 IDATxtTG=ΎmYBI r9glr h69($J( PD9g{h9~UջOnU}T\\,)R |S$A-Q dff"##o9++oηlo}*zNBCZJJ DGG#66 HNNFzz;s>s9<\..۶ Xjj*J=3/~|pMˌHS*8Wr%**JmPc,o._EASa28_/f nnnUl\_MWŠIKK{wɰt8=_]E<"E):"+V $/e'ĮM?!~9xQɩxuW֊Vp+G6>pz]]3_lZ%tnxx wl‚30y$|5i f_}'. "p23^Wiͷ={1\C^hKJzDػ{, 6YRB, %J(ci>K*f%q.dW~&Pesp{J߆142s s'@Khִ 5j/j}}G?B̈Ŗ5Тq=43쎋+v{q:Σa4lbeۏ!2Yrj?j?'Fpt7^sR`:a( 8o.7{>7G#g9lJM6n Wz~cѤI??wϫU4^^^۷/_*]vw޸{nm~n:سz :]8{')ب4$%+!s9:Qz_o6]`îH_Nvn[ڷG͚5ѨEKۡW&>QkCk _~V5jo!3+w&|EY|z{FtlZ>ۚCy3=>#zjvo056Bfzha #.@dT=iP\_|6maaadٲeXvsAWMO9c0&;r\:t>nd==%&M--:`'8 4#RJ#Pw@zhӶ :Xihf?LV ZWdTFl|浃hݴ6>?EZ~؆_D 1m>[ ѠA#Xu S3Sk]EBD~? 5:kc*{gFdf!n- бk֬>w yiM\)CШnڶ];Xn2!+' Gõ4hSק' tu7ɋJ`x7z&ʽG͛7;b pshGoFR^/f̘cÆ 4hfΜk2s:e$tn쑸^>H9y;0nC- s31Ou$&!&k"=ל'7d#4&u#oeA;cšAnWb\Wc4k偭?oǝ4#g\$#>,Vf02!juMs vvO@nNMkOlAŽT\> [AS8rt57@&Fb+"Ru|[Fq;1y 5k^cq}*OV5{NuM )UV`^n5[t"""0uT|45[%>/gaS J0d>gRxXp ZBS43Nps3q .'p~f]1kQ?QQ0+?/!_ n VOd 2`rCv8}$Ξ='s Xoj*qgy6QQZ)Nxg’no>Eej?ꁆ epJRíQ8 Y7U0fy8V)p{ê[ydg1n8 'NEXMG*㊟{|j/Ms##u_# 7.=`Fѵ[7thc 1}fP5Kn"Gp㴳x;x"aD-57ObX57ڴEffSYnk\A|~,#3=4ܢ`ܬ:NَUM(8nAߦ3i'Hf '7i >RxP[Er Mo߮ՋQˊ틯^T[֖k ;бcG,]/ZwΝZMk,Q$' <7On>Pyg8coaŴAhJa"}{̉X33ZZv#-WlNߏDPɥdILEb2sKᖔj%E9kX{q1v7sS+G bt#a(Ghe&3Y}[i3o39i1<{ɰ9=:A߸ fnw*ѻ!`sfiU{Zڼmyoܩ*a3N:&7?]z@V&Ҁ/;HpN r5р(KPƧ6;_)R! 2e$|zeiIXҩBsŜiV>3$UM!*eS^cyϩ;7 ZpdPn uJ'`/,RSRiΟFe@jJk4Mbx^2q: ^迬8iʋIItMFi%&&T> ]]e-)+eʚ@dQp2*Ym&Ҹ\T.7k'}|o󤧧~?DG*WWZWW޳:y3`^g^7{ Wyf/S)JUa.QP=ރܤ HIIÖU{ppp66 & [' ]z2~ģ,<2"E@ڀn >D\]]qQ)R T{`2I=~T )R HInt$ܤaa"=k 7 7 7i:ij28.xww}g _ڽ(=D= ALDX0nӽTJZҩԃԃwcYjDE`y0=X9LѥSGܱ};Ǹ10{ ^.m"6:BCKTzy]*$!ڀek&'>I㣏>pmܦu  iΝQFg E }=3hǥVhْVg% %z\cnj]lbmlkjK]OG/NKzԙԙ. G;psqFTNvV y9d3;j+8 yg봹įXLr9;wk@ltÆ ihD1ծ]uҺN~1zh|r" ?/Wktg6f6P.ܼ<\+ I~e'ys0h@nMۺFz%ޘ睧k֬I;/5= ;`ҤIvx#6&ZÕe*噤JI T9U!+ttM9gc@M ]G–-?wjf?>B+FV2i%^d`]P Ξ9 ׋ d >}zu}9ܙ4(2h Pv .^8[stpOAދ窏wa+ۋ 93#] :xkV{}șݫ'SSSq0amۊCR?18!8(H1(}yìDWA<#-YY^e^ppS* Gw1W5 n5*|%֢D{Z*&7x$>@i+lE8yecvbhR޶~U$>p)/jJlҥ3,o'+ɣYu 7 R]yM:mTlML 6.[))[TX(Ӫ$+*{W^B+ʣ^U 7 B|0@=S\]t9)aVEÖepp08CF"U+Ѽy34h lJT,nn[Y% ֭inMWa{w enno@^zB 1~81y?A\wN[W4jx<_~;}q֭[`OslJU!KIU)ȓnڵ4k4,,1|*!ʻ:JIi,z \vm/6ѼV~{[6 &+7Yoz͛ S^-V>\+rojnnؘh89]Ǿ{Dߜ9MH}q3CMHSM O{J$<cף9 +OSlUsppd*$I '='>1)@'a'aWQIIU i3Xٻg @Q~}̥oxUyZolnnbwЧOo'zwby& 5 5MppVPf)7QYƏ *`oϛ7E*O4zÀ[ :ڟ1qDO1t͚5G}$$ܪ-4cxim۶cǎj1xv޽p̈tnn:7M-_3SSt3gLe9q1:z?KI\p/W 8\wtĹgv:f8ճgŰd-: n:B?/z~Q@NbcsIŃ 6˨wE\rr/jOM­Z`sDFz+*2Bo;v 6m/E G Zs!سg7?X]LU񼄛6 ==]-ڶE:uPn]ԨQCٍ7'`yV<.C,a ⣇i)8|kLMMGԣ% -? /OO bN'B۰K 7 7鹽 0iWcVݢ 1|07iO h+++5?l[㳣Bu3'64޾AWu/;wSLI_(ϔRhN0a6m܈C$E=y_ث4F+ܿ/W 7 7鹽'`6;w;vlڵkr _~X}СANt ݺvA0mTq-CpӦbOީS'qUx{{o|\ @y@Ӹlk+$ޓaWBM <~?O8 |@vxvY Cm13f rӗ4ifϚiiqo~azl,ۇ do๻~ /*&Uy<Y~}ty=@~p;y0g8%E@@H.lllp%q޽?O y'OUy֭[ShI&hԨC_< I6V׷/̎Mك2d09B;v,j*US&N {^&]~<3JJh N7WO?Yr?sɪ𝏔R1QnUtvr`9! IDATilxQ))[MPĄlTd$n&y߽{s綘[CMX/>+mHKW (1sT<\Vx1 gpL5sc|5|nl_6٫9s-Y*&+PeV W%a¡5IIzJ{j6 &GKe 7i:iU͋y 7i:iSzRUӹ 7i:iU͋y 7i:iSzRUӹ 7i:iU͋y 7i:iSzRUӹ 7i:iU͋y 7i:iSzRUӹ 7i:iU͋y 7i:iSzRUӹ 7i:iU͋y 7i:iSzRUӹ 7i:iU͋y 7i:iSzRUӹ 7i:iU͋y 7i:iSzRUӹ 7i:iU͋y 7i:iSzRUӹ 7i:iU͋y 7i:iSzRUӹ 7i:iU͋y 7i:iSzRUӹ 7i:iU͋y 7i:iSzRUӹ 7i:iU͋yrvI89\"u m@@#59Q#u.,GZji CQqx Υ߽ Q#ߠߞw c<Ր'Zt(yQџs=pr e*o6)Vm)v9Lęjϥ }&7Zs)JUBRHK5W: qj*q'#V=ܝȟݝˊCop.#7{)q*IGRr?O\J\{)q*Zs)qě>ŝ>|4Ń.QFnRZ7ˈ'}/%n]%XJ{)q*CRMK}W]:Ň>?'7qGCnRY~ʈ/}/%^%߽?:ޣ8ͻK8abkkqJ.]l}Nųp6t4ϕS.ȟOZSR=,ƌGOB g'K/ ׿ w!? O駟FB>3|j/_vBԩu^zBׯ qhҤMYfh޼}}}h|400!&&&hffsssXXXDVnmڴA۶mű]vh߾=:t cǎܹ3:u$]vEnݻGBz^zO>ݻ82` 8ƠAqС6l8|p1Bȑ#1j(3GqA &૯ĉqҤIPdɘ:u*M&d9s&f͚>Ι3̛7 ,qѢEPdɒ%Xto˗/Ƿ~>\Z Wڵkfq\~=qF!6m?͛7V֭[}vl۶Mw E~WڵKݻw^۷ra=zGǏC'OԩSBN>gϪܹspZaccK.˗ȕ+Wp5 Z qssZ<==%n݂;wݻBݻ???ܿB1fZn. X;5Sr8"83UFx39ۼYP˰bT3% swV:lŞ=A'٫AAh0ţ9 U t1CSr<کSem)&MvKbxAĦ] b)@ +W.4%>͎oUPGM81pQR͒`\WRqK8fM>ޡ&D8U桊_{>@W{n"I8ux6 ؍]Uȇ*`W3-%%%Jn阶 deed!$pWy( TeCATnKO߿Akolt$M8zP)R h`JIJ@rb|)IJ$BSbLb3 )q1omRQkw3҈Ȟ.R H6Zuf{TH=H=H6|9Uw#ߍ׷ 5IIUEppS/RZ TIum@MMMڀNڀ4l4o_\THWy˥sJ$yu_'MyOynn|eee#4-m+߿k K^zߤ8D$*X{ 7 G8~m/djwlah0 pΟ]_u*k%$>ޜ䖗؃?^ٵt ox*<ʬ2{eVro"ֲ5ݽWܑE*̤Q ȧ*zۺ.&W^GRvn#{ J(z>ˍe:{Ϟ<шHY)X1#-ӝ[^ȧ!Ͽ{z][rl[3f&hi={B`H>+޴C`i[ozniމ'XPīCҊ .>,6Ab6o;ݼ!uwye`w>rۼOU$B(/wiyͫMp^<8ㆳ(8[|ĤnU]KvUz VPyqxU u^ܜ͒rӶt7wqA`1!*j' H-;rœqaqkd>N(6Vd/6O-Ҷk|Wol t4J0J|]dd6p-bcE^VD8mFie%-:E0dbyyΛ+f#kx .;+s| gXrS|>,,.ɋ r39p.7 _-tD ̜4i NC_Y)I𥾵#v//ZUD.NQ7,V`ssX\n΋+er \i|̚f}\n_Ϻ}y΋X|^ zVЉYg|ro>"ʫ[76rMd+Tn_as.p{m:kY:MJL6ɶe#Îb'nŅi8}`mgM.!H";B̄0e#FL[>0r\׆a讨y 4ki{K|)X>}Y tr+ sX3g~~X[p @u̚2@%o V+BhXF Oku^RwL] D>aػ!@H1xXvWXa;"(bfa벯1adg3 /yЈ 8wy/nQ.r(u㳝ߗ.xt> ]x!eRrmtd8&m؊+%& !25EwÃ4[?Fmڨy_>Yic`ǡ㴎YD$%ֹе lںgi05v#:58'46Wo+HK,m+N_EeoдQCXuoiͳciF;m%螢t ݆ǞָrazuU/ RFёzo  HEJe=be^bRc߮QԑvZyS=/5Z +9O)dSO:d3 u1;`٢1ވA^V2'GT Ivߏͱ%ÍܜCTB1a8N[fFhuT@ |1^O$,*Y ; n"ƃcYk۳J}2{j~fjOmQ?~.9!ufeCM0p2jmsj1<n#;,G$-X C|ge**H>-KOˠgd/92jSsb#=x%C/b_P,&jr3czg=w%cڙ4z̝4ÀNLJЁM7x} o;g4\t7\{f){ :*i"7>Nb\)ܨymC:0<ѸeOظQ_"z`yn S4Zj%G. 8Lkt<,z":"g6@k=gp[Z ny^0nT^+6n_; 9`'*[Z#׭!ӿEZaI38GM>1!8kÍGx]#f|j?Hy:PZ=rݞ6y"+*B~;S~߳t\[R߉s+.ʂl~ uE6~v?|ٰ?ũؿ43lm{Q1`R5w5ѵ4@p\2&{M? =&l3|M"D„F0}>gqc5/ ah .xw9#`UOGD"&6*[XōC#vL7rs<:y7x&!/;ߎl-{h GR%0ix ':@a .<\1CC|/sw7qA<\1>iq'p|rP(wIYxȟ7:tU1T%|p9{8o.>f]\n!ur)&=b*UF]{zS? o""h[ rܬQnpȡBQ(IDAT9-Rn~&~6~|C!X|^>&y#.ۉZG*7CN$ٜomRB5c}sL"g;崸|-ѱM16_xnWgV70Ut-DsVt ycvEn1vm2q8zRG/jȡʜM9!CGW |}:[C~;.Ə?j-Q45PqbǷ0kc'a9r0[f}}\tr##5PU5K4(yv ,קKKu:=AǶh Eeb0nqR,? QmLyB? WVl$rjy"6D//O:6 aba#r`.\6N_/+Hre |^Ayq~A6*6Ñ09oU*W&d|E~\9/-2,l\0hU*7Ͱ| mΗÁJGtDryցH;Iq.:W͕* S=]$/ 5I}\V~>~w oe~Y7\nË\>.7WJuA;X?3i ;!xy 4U:vi^8.-җ;$_rrS^3ϊ԰9χlmmXgW49-#:XG|f=\&NsYKlegᖑR7KғczΜ‘ÇkGh_G+0¼ c׎8 W[x$(PT|< K+*:tcE)fGmGpUxmGVWÞHRsKĐKSRy7*U; Ù'(.̂ Q=uRI\L WP8H9u)cǎMqsa~<hJ'BC=$#<9y|7YUu|:u_U' 7 7 7i:inҰuҰ!Y 7 7 7i:inҰuҰy8;\Gm\$$ܪn7OiǢllUQc͜yPڅ^Nw]=#)ÂqUʒ&E> obwGo ^xGߞ>ISyf>JIiF>?;^EUFgfN %'Fe~qx&Οͥ>Hy}o <]AS3?Kmhp[M9}A\aE%7PysspV]r)&tg*7c#+vzȻg {w{n Jĕ SjpRuo^n6m| ƺ恑w< <\-&*n &?;{mn?{ 7 猢2wVD"DĮMX`>'7 -º?V0m\r:f^H)?7 69_Tj3#9Nbw+h,\֬%'OѠrmB=ض?8gić˱jpŋNSI;.6~Y H/?n~z: 7# ~p<7 7Ƨ oo@t4x|D` 44nb;'o~fNL %a0F)e!,U-I\$ń`ڹhca˶4|$ Cf0i w@%^6=gLd)Fv}Lax)(=UscBMЦKO 1 ;oL޵^+R3O?ǡAj}JIZxX?|7ĉ]dX N7s%+.S|mQKa~hq|.7;p2`sp%6Űiz4 Zaxcr/8fzc MJQepSt䀑}ڠV#csP*C8Bq۶lmA*TQeype.j}^1~/=&}ϋPy^/~=fwTܛE톘Z4زv:i;%*AFR8m_.`ТZU~[ǒV[Ƕ04L,0~wMOGFBvZ5?uC-HNDE@)Зq~ѩ,z]F ?>#9a7͸jxa>Uv+>7Pյػ~6|9wE*H@def FV{?b [ YXa꒵Q^.~? mЫs;m:aî#IIS7?/0_wtخs/8iLq]ȭ58ohdGgdR#[/kÕg^s ZOe!hXrn n n|F٥n:LS!oc!נ)FXN`ռѨGpspv7o1snWZ\~Z1 7BqӰQlX6 CF= V32N_߾m[cո@b7'5R_cа)\lm F;cŦضm3LU;!2)Y43m[Ł=[0,u/GP{6-ٳp[o\8QͰCT^ڍF3q) (d0 W\FFXuy䉰7R_ipMLɽqLq Vyeb^ t]L>rBtlGԮ_͌a72ȋѼO߻RM-'gM[#0:Vk:JzL4O ApP 絳aڮ/9p65U!1KK,}I a[e7Nc ~L%aߢ=2Ua+{z# GLmˉ*Y'&V &*y9nY0mڵ^Ӭ B!=KqA<X-bprr ;®٨?Y{1jo.c㯇q ^n#9#*d\ML0w689S.7Li8)E#bU* 3$;+p+${EjaܕHgO~嘓Z]O8%"nc˜0nG<*Iㅞ[I47/*Y%UstsKKi]vq | '._G.qOKH !0}qiA U3ͻ~݋w`{wB[g5riHUJڇrޖ<<0,ّ>sk7r6!&* lA-`i\P[֗ ѩW5 C `!18Gץ̟1#O6hnhZ# v׋4rh :Tưc.bĂam0b n Oegk ,@^RBam?A*0*ipzYwͨ>ZSBCs# [}]h|O4oғr&@œZp~8"O J:|ˍPW5~>x~AHL|#ۗÄGmkR?`S8(i=a1mqD<4[=&< ,y1;[VS37ÆSXiKVϞ]MMkūj3(ڟ;9%p9cnqh5! suz5k~BZ^ N_3Nz*?55)WLSP Sy:Fv6Bs~H(Ȣ07m;N 6- i4@AdddIa B##Fhn!y)*+KVfXmC>yiJRx , z`5M T aO)'NW/`7I'jv`q}ذ5vSҸ޳,efʡuoTÖoCb?G:\jҊ,1qE[h;a-rM0i:6'7KnR9g eSQ84YQ&=v( 0gk 2wCvy:f)-![d>2WB9VAo 76X wvlx `2 ^ġ=s<|b2SGq %Gv l.\1C vD4>?q:{ㆻ;nzIܱ!iHǪ=vXs񆟟?K01Aïp.ƖMߢi3'(֯.ۉ 2sp#{=x1"pcS)fXO%=} _1' w1}aL~n BjR4.fѐHl :Y8b>&]-[mqw",1麍P^cٰNÇ`F#)zh573Ĭ5?==hg{摇]yIIU)KF w1oϣYSPKpAtr᫑:vDaն\ ={-͚yKt]:Ze۞8~U)us'9]צ}JwKHDvz,.+ SX눮za㱋H&desW?#5ζG1itD&k= cF=~ .FhT9læqwfRp*p;f_ٯM?r: -!\~)G3AKyns<:|,q{T?u'ݺVFNknz3 ֆh5ipwpYx2"q]BgU=d:b6wegmuzY?M!0_ڰ7 n80n x; uxgvAG%P .,M:b皠ӽRpD^u^hpM nڰak*ժF7 n _h-aKIENDB`fotocx/images/brite-ramp2.png0000664000175000017500000002277215247006660015141 0ustar micomicoPNG  IHDR<tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 259 427 (eXIfMM*V^(1fixHHgnome-screenshot02300100Fotoxx:sharpen|vJ IDATx^oIrƳ9(QtP<4c؀XX0`K0 ^_6[IshMRHCCΌȊʬ=yȨb$zZ?AȰ d \d \F=zvJH"zeղT@7 mN!({!|dP#*ු:+ ]KFґ ߀Q/Q*zF3@dGf):B~Kc0%)ʐOV;1:EcC@?9n,5 *7B9Gf)N׽*?45ePoԑ /=aTC=ʡBHrz XB(D/@o@A1}dցJtt2RRR UN@މ)2sB~$5Z'@AWFN ݩ+N2_ӑxE+87 D3usS< -쫵q'(0 KEڄ u,R*t ʓ G::Snt32%F z;J 6!0\Re] .GBk^!R|w䤡WFN ݩ+&F԰ q APwNsna?j"'| ? t侮H#%TP宺މ49<`U!C ۣBpƎѣN[[=n|oDi5 |LWnWִaA){._^ZZze{==3:=#tan(@ CPZk!̉,To8*SD]Qf17R7nlmmm*Z#|ɕO\W_tM[][X_9>  0fu& v 7躮uMv^۝;?٧מl϶gVV7Q 9ue]RGmN!({!|dP#*ු:˪QTuEE7) }u:N3g_8vrb'&Nlw~՝o_(2 ="Ȓ6GBZp xF0Q&-81qϖ?'ٹӧO߿o=[7?h a(@ CPZk!̉,To8*䤳jmEXc/_|Ǐw<=uc~\Gfe8Ֆ <eOœrJBKN:( ++F/*@7$7--]l{fn~ggԙ76=~G*CVdGf):B~KnSD]Q&T NI|/[օ>᥏O~w3sS|t}ՄzWWGc쪇bXM0QQTI,<3;gwg9nbo}};d8ZKVPpC #NNR,uEĖRտ}h2CVZjoowoo}!~ONϞ>͍_x~Sw^8 9-cYt+$)2M@zeղT_4_tyҋg/s禟ۙ<'O`ҏw^8 9-Nd#E]Q&ON@])u])u])0FQӕuIVF>ҵ/޶۳/9=5ycwhQv ^8 9-N -HQWIS :l1eۯwVUkݾ60{aُӟZ_4wA5~}qEFQR0xkW>[Lэ~?/AjS0'R!{,ВNuE25 jY*?)]]铇OO=m8v[^~|OœrJBKF(*@GLO@])u])0xQQTue]ReP;vO?==w̹Gnm85 yAn,%\GTo)u VQTuEAqExQ9FZte]Re`_클)?GGG?/s??>unrucukk^Ndq~Wss3S?ss/6Vn|Cl/0R-i7XV%+QA%_ P7oݼyfV.|8yqⵟ?zj^յ/nnuv;B% Bݩ+hZu`ttan(@ CPY_\^pTν 3+koOE3ḚR!{,ВNuED]1.3wNsnꇝݝ{߃$S^;z8>`92>qcWSEsލ|h4ޖ(*@7 ЍtX-A.UaP8O?~({!̉痯-=>=y{{'6׿ufDNXNU,uED]Q&QTnn %HW%E[UCe/:sO.-/՞j;3;{=x`m}" Sw:*Ģ뢮(+?TdtW|/_omom8G~0a#HeuP~֝[^{hv(w 4^`GR}xb)PJ CXe) hO+PdIH#%T* 8p2FAie c;cDڔR&*AXBAxP N@7 ޙ7 v){%~BB_~QtAL@bN۝aDWNsj2S 3CPÒx}RH0{JUM#b".SWܑ GAH`/t iM!=L4xQRW`c*fĨ;KReo?\9H~Hv TG%ABMT$Q{ HPP7J[({` |SWh .] fڴr$6\i3 eXXQB:+*G(4'q2ן̮#aq !\QL^pPʦ 7:ߍWfݩ+9jd E?A:ѺrnsrSޜ>YRF{@zD%!mB:PH7'& e .^!DŽw_!҉pO@#*b !o0σ& }krWBy hO5!HrA bN0Fѱ38r;@)  dHO߀xz԰$!0^M{ ReoӈثGԕ Ff8D;HG?ZW)e# i}v҃7md8&Hc5/Rx dJ]4A =!V.{w֟w)Z9䇴EHUS2D$w#!c|9N@}ZcN0FAc" $~rbzJMPi, ( XP7J[({` |SWXN@"K^D׏(~'`LT KQH4Q;! )opMPǢj/ -A:z߀bny!mx!n/` iУ/{z'H)(K10l/)MCa_u1RMòT eoNHux'=A1Y*&1SXBjF^7 JCi e c;cdD"]FƁ6|ɊftIW0=VB-%An_u1K1 h$7sWNsj2'i/ɜ>#S0jM `uU݈^;(KrzLN]C]'+%"A:юJ.B< bC%Mz H=A1M =tT(–! &e D6䇴EHU26SΰFǍ|d j!&`jIrA bN0F3AL@#z8@)A`z-!=q' vPi,d'V~ҁ^JUB0 Bݩ+>7/AO?Ю*p"l_tzb 62iz$Ա ZKQ6/COE u^ᝌx:S }X q{KH~H[!C=PWt0߀ZJw#!cOc:ESɓ0]R)p"#| H=A1!R"LcYNa Q({N@1x' ^!DŽw.╖R%߀x.B= 0 #0tIH/F!]25yyM =XRXV-KF\ ' Ōl 2מ% smBs&zw,Tf_P?U'`CUY L@zG )%toiz),!Q8wB@ p(mLx'#OPG+:O K%%^-WG U'`zLЈ5 NW,WNsj2z:ь޽}}d FXZP@NUBfHFFYLxg+^<6_PP@A:#ՔAeWHH{USH޴!H#LXNa G6/COE u^ᝌx:S,4RVHUJdA+W)q#Z' DCľcL14n0uRe~r资dKH*5-4̠םЩJ ^JUB0 ?b*AP求WUSL$5+AWPپ}~Czb 6&Pcj/jY"/e߀bU9W49QG4ҰEz i5|Nݦ+:@ hN~7yL`<qb 4} (:bОt& yy^`D!zb AI+[j,d'U~  ]4 dӡbX'8K""blD$ w0g를 Kh_u1* .߀.)D)/ʡLh~zB,*F7'ʡAF#Ho'G ҩtE˃, zR*O9}W`)' hR({Ftj%$ *<>̠􄲗ЩJ ^;(K ?Iܥ7$^A(Ƚ(u ]`!J{*X*ȩ:x-k `Uo;W%\9B pC:zBlʾӿa}CZMCSBdhgN67"F]md @Sm_u1#r[IDATGLF*kB+%#XT,=e AI+[j c JO({Y9 ,u㝌x:S,/}EZLPzK+rȽt`YKQ5㛀PW`)2C3NW,WPC}P<ܿ;)V{X,UP^;(Xl8<AF$tc@mA&`1XHXfD)/ʡh'`fp=Hix}spHo&- ߀#Ho'G ҩtEM@\ rlnE^<B4WgOǾcTʙ\u}8Լ<@%7dKHJZRPgXKHfPzB R%K'E*o@ P B(r/Ʀ{0 H;P ,DioC z"1ALePÒn_\.ǵJrIENDB`fotocx/images/warp.png0000664000175000017500000001211015247006660013747 0ustar micomicoPNG  IHDRg- pHYs  IDATx{Eǽʣ r)mAPG(bQbPIPQ4F J0ʻEBGQ(hKySh)~?{OOovg~3y9j -ߢQՁ8e\vF 0 JSVLb+Guꖊ`N)D<wv%.$eQ]L 0 NJDͻXJ"$X8K`^[0 /n'BL #c$bKIxu`$$ػ9`_ׄL&5{ïSI|w\S"\KIxMx&E:פ. 9EܤHlRoFX$;I![2lbf"`cFv*HE ^Z$tn-IQ,ė՛uiΙyTD-4׸8"op֨K-A ل|I_n &, #J*lwEH=*0I]f%嵧ו_aUF/ BoBJoU,MSjyFㅲKوMn0zkiU\⍲ OFﱋaU )f1&YBG! F hmjFo0uo5 eШ>kTeNttdBŦFZn?:Qs->fUf ^azFr;f[o^6 |^~k~5~DxUG6,?BApr#FO)O*F Ubun( OCe芭/_[H-5~(4 hCF;^1X:h#FhpBH\k3Zi;_YmFommp/5 \F|)wmrY1g 4FmHkf!F<@0:p݈X"k߿׻IhB bxV˓Dɭ 0-C!r#θ;Drd1Kpʏ/@7Lkv4w1JGo}:n  =º%$ƨ`(}WuV)+biCĔWƗ;l\/Z*b*:qlrdF-լ 3Y U)@_ehXHLFM>e&n>{J\/6ު S2Z/!*@^$}DFK :oV ,YfqY(̌mfHwiKqEoȆ-5sn J2<|x|)eA(ѫuǨ S #7uo׊D`\mfm1]%.I~Z>7rߩODyΖY1r|({S3wz?E.cJ'`8F'fE_ =Q^PZ7/=(OcVbxs8VЩ׋ut6.\@'YbKQV^lXFmU ZvY?P`{`d8vPoij9Al+D2ʸ֊*XZ0`-9c ##l/4?%ʗ2+pɁو /@l JU!@~\U1l˙T~]A3ő-%b v*%7૊|q q ?⨌ivE4_|P)1h1ljʷRdp>p.RYa>8[Uc#T%]|%VƏe\EQ6O]>8,>zbg;X(m3JcM*v\T; 6јPA#Hn]mURJcw2FNvϭ֗z@ R/A%-rq8CfIk7נQk[elx6Y5~kӖ˞v9k b 5B.WK\ֿ$ 7PZms|825&&w .kNj%P..!c /j:w0fȻy|Q6N2zo({&z//Ղo FĨY;2z@ER5S,D8bw1(訉YxƻX,\FZ(@O 0WXb@}R |O:/,Vq֜ɦP.>!&GIl{W<&&戻RQ`]Lc^-v!: g=;lq %6Fl=@Z"WW t&R ֕sŭ6qX%0nBs93v_՝?M v`}1JqwߟC"nψ]4XI{:ptnOaė4Y]!!đl2Q1*F֑+qh26Eob7Q]&*hrO <<Ư8, (j*KfL.r*ߛ/(z  C'dDZA0eVQge&u_<5|3&#fb4|F`w۫U^Ǫ!&s&;Z+fI!p8WslVIj^^q4◂'>͚^yƲ%Jq8A6N'JpY]G1Ryj c 261R/ĉV[O'ar~r# fFXDl"XWi"^r9{c EbP021HYv2{HqbX X6,EU*nU F{h.yYa9XJxq 2{JɎ Ҍe b d :ܾbi`Rl+vZ1.181e빻3.'OFc3؈2{*|} Q&oݭя|?fP$q8J)| Rهk֨P4bwgG]6ê`g#rN|A0n/h֙W+}@lY՛!WKd3c<%cW3 66aV{Q bK#{FɢCX[K,;OȜ\<tΎu``7K ]v~1.B6N]27_3^''vY[hu.Y1"<<6ցO `ν-tӖeu^)eӛ+j%@Z&eIVg,C1K2mVHdW$@WD拡skmz4X16V|T-ٙ!.V.Xk sЛncF -:}ʭ1Y Vpߐ:g+Z\T+F,:g-AXy'Z-<5%t)eYψKo2beEkW10KWthWzCjXH1P[!|0}Qߝ%A#Fgd9^!JA^xWǘ;L(0~[)>V B.+ޚ["Jt^cZy꼵) YB~:Udk?0 -tRj2Z\F)@`Pwr]${'\uW? hyI-@OZ^~`Pwr]${'\uW? hyI-@OZ^~`Pw Jښ=BE01iTXtXML:com.adobe.xmp 200 200 0 L1eXIfMM*JR(iZHH0231@0100fotoxx-22.0;Paint Image|fotoxx-22.0;Crop: width:160 height:160|}vIENDB`fotocx/images/area-blend.jpg0000664000175000017500000010413015247006660014770 0ustar micomicoJFIF@ExifMM*V^(1fixgnome-screenshot0232~0100fotocx-25.0: Crop: width:318 height:426|fotocx-25.0: Sharpen: median diff 2 13 14|fotocx-26.6: Rescale: width:286 height:383| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 426 318 1 2 2 0 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? Z~c@ֱ $hQQEQEQEQEQEd'i|>B=/HPf1 ‚I^|bxMj66d"V$1(9 Cs^'e?\o#4 vȍ#8Ѐ}yiWÿ"h33N P$!&H O8:G3xW/kjtkGYVId!ݜph JNk㯆>i1e%߈5H[iY_ UOh*]/>?:Qb ˦rmZݤSvf2*OʬDWkCk]6PtG f퀂.Pq$P~ľu-B+_6ǥ_s|Yƞ)5m P׭4WÑʾ##R$p:㡬x⟅eC%/lCoϨjfI8Ygj; S|=iytnBǰ;ƏxNk.`;x?5( >Xs޼FԵ ju!}gk#;#E@3IFA8oNUKElnnY\#}H ]*mj^y^ꦼOmSPieXc"c 4@Ԑ+BE.8+hluϾŻqܞ96TmBm*3uf]=^B5Y>B܂>kH'k^ >鯘[ZVm׬нq0t\,r>& _xW׵]I]_Lƿ+EŞr"dE^?`UO߂6`Aܻ0勆\ 6k^Bg cWDx%T[PT>0>|.M3ӵDx}JW]e+>׬нq0t}Yz`X*5^x@mV'X-Z5~Xfix3φ4 fFy&{ <3Hq>n:]?&.?/\L] }~˿ hMkmijm8yq@F :&q?^g z E)SV|rt(:pҍR f"3c;s$k|׬нq0t\,iEg z EƕgZgڏ+"g z Ex׵k_cBI̍?l]?Ig cHu}SD^𱬱߉A׬нq0t}Y.L] X#y5V#GklמOT7z`>׬нq0t\,iVRjI|n'xn ׂhV7n/ɴ}hۨMFmn@Fmn@Fmn@Fmn@Fmԙ$RQ@1:dkVc?3RZ|P𡵄aRceWL)93k c'99i~)>EٞyfkV,jb*7a^!o/~?.u{hviIr-L 0Uu#q_N1QW*LZZ|wOx"e _^7TgT%)Y6VNq_1텵^$&qkm%Qr+ϼ)]~I%avn޻i*RFGc_4֩\w¹4 $D=m$"і짚`ʭXTrppz ~x'u]C?;fm"K)-#D~DHɯ: cb>Uz:Ζw~3xCX𦇮d>5}<ٵǕ+$q_DQT X(EQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@d(V V?#Y|# iQy7mz^ XA~a-D<STGPq_"7 x«5Ѿ6rVݢ2DŨ |Yh>"um$ O(4p ycPO2u?@) =z׊|Cφ^%:ߌ2KQm#OP9ה~.tbkP{&4c7lgT7_>;/^0ց]illk H䔆,J4/ZFwrwZ@i.~22+ۇdfтw>Ƥ/_4xZѵ;QЮFE'v`|35?|k^xzƑYYh洎qjޖoa&=7ozxV4Wм[&>id f-ԼD*ֱvJށyYc՛;`zҺW T^/:"['gLhd2)rIt_7I;$[_9$x. (a3TܞefOgvWŚFiߴ?+iVv.絼3=mjd]ۇ@35OڋŚIxr-|?]'׺j7W0} !ry%Rk=TB!yo{˭69MnlpGch@x&Pxþ˩F@+0zݝW>ˤ~'|Z[[dKQ.9Z\2e[ǽxß!:!qxW&ڐKE v*M;e^/ƾ5/z4@=:7é6yڽ՛QEQEV4}.b^(pYH8>5>tχX[xڦghl#]B9҂6Du_<߳/>+:McWh?tO:!FwC<bjژ;h$jʯ?-zU Z3xHUiKy7 n9csÿ4}VSTtXbK˅E-fR~C1g \lϩaXOm:mHcun7+ʑ\NJg=9ԯaO^1=FDHKeHUi6vPGq-شfU 8=)/#OJ-+zu"{)a 7#m |:%-;WG,tBM3bD!I<ᦑm'P=WtzdePLdkǽ#$J$ڪOE{g*4/ Rȧ=[<z~H>"7M׬n!n`ѧIJ˴kwJtº7KY$Ҽ)zykd2+#m\ʞF^Kiؾմ DŧM=ȯR)ѿFaJ}fqgJ.u+;i9nZHeA< =z[H~7]f [^ń:vo^AdC!SFj컢?tZxfcG6SU3Rs^C𮳪&G^5lfB NA1J'|yM*w5+9G%cіx$ӥ=E~Եx5MZ-:y<="YUՙ|vxwZmXO4nte[#wݎcR߇4]RKԼAS q&zmFm'ZeWZZ†I'"($;7V nڛ[x"ng Y \OŸTojVڼ6^\V<`}BiaºsYxGӭX%<0x᰽GSޜ<.}#_"D"8#n¶{=сW[7WS]f}6-.{Nei՘\\8oGY6j=7OԴ7ܩ>Uϸע\xV Z!Ңe8MEcӱ [ӼC_v2ceH<ց<<7hc;Y.;~okO/m\ZҼZt =В Am+XHj/ xAڤ:l$o坿(ksYݡjZºNе %~r2$0_ 55=g&}+~F 23OmŕNjt('e]JiѾ - ،gC? ^ºơ%o,Wb&G(  NH.QQQ3$@W?S <#:_AI+L2(h9$|TQmn<׈5 }u=c> -duϴΐ!%bBUW'< &)(~aEPEPGq<4RLPtJ L>}5RȫDL' 99ޟ"]j]‹O*KS, ’@<~#| ڝBa{\i:5Hq$X3x_v晡iPLӠ(>íJM_Cߎ:Om#Iխu-m,m|'=ƧwDRv +`.:ԟ-4#E_OQռkKdiE0S#r6ߟrzzj2A{ri|AN < Ea$OC)Fӎ1\5]SHiÚdžt*- #p(19R %r; nsJzy[ kci6B:M;yP9Hjd` oA kMo7zwT ެ(WCa͓b''''޼Ο|P񾧭kZՀo&x͆c %a8q?F7<+0УnvHaGj}IזxV>)xoiͮf+ _.G}9AI>.x<=e|0tnN阮ĥei #;zac-{NoPxno+&50e1=0;WzǚGÞ-v/jAq]ť=\[HGks"_8Yܻ*'#8{%< o<5Xu)5Hc9 O5OJU|۲c鎟ϵ @֛#xOÖq߇ao6pŀ Ozoeyif=iq$p;1DbK?JZL cО(ϯ> `oA{m#2]Hk 48/pWϟM!x>ګRtW:2; H\5Ll Ҽ=xWEoʦ+{Kcy$:"',~Oc zGdmo)n҄UZQ8 '3v>\I_|NoM.s|KŖwwoڜKoDeNx]#k_=?<%xwƾM/W]3O(QcҽOz:_.k&M2TQ*2Aq3>?:־&_ }m%c-H!% feH_ך4߄k?aM⤅mvJ[f ]]ʐ Ǒos]Bxƺvw𿈼g=IZ?|S?]ՒYxoJӮuii`,ˇ Bryls>*MG>$CukV`45Y`C,cmfPWh {Q-ڋۊ.տoI/4_i4𾝡Ao^F zX@icR4NF 3M7|8׾G:{~CL Wk #qdVĺ6iYx`3A4j)a,LOWx|H+8xVY,>h 5ӻ(.Nr;ӎ~BwgS㧁+}'G5KKˉPէhE63c']5QgFzuGPMu턆堶Hɍg25K8_C42D~PC+?eGn6igHYnRYʛB G#q(_x4 E;M!f(* T08<GZ|QFx+W6W&J$im(uQU#V,6SGpvշ!] sߧjU|1YjVz_<>gKyu-1uYbTK&A؄0`AS5vGltGx[Nޣ^G-+]b !L 8kOo}/xjZ.u @uلj PVI#V?mt B;v{ ֗>f2B Qp vݞs~:ǃ/>cƉgkIDRԗ֒0h,o+號W:ϋ5]Q{ tj귘I|&K?(_=eN+>;x|A]6q)yEcp89O[G|e߰55цxI|aK3c$FyI'QV:MWA쪐[7n; CRbqxV#ik{f# HTw25a'ß>t{=gZm0E29,'r e{oax~]ɚ6d7^:O:faL2VғR ,2Q >tPx[O𧃣|]}ޕuy˸-r$j|p^ Za>.>*4EG<#q$ xsڲp$68`i_x:Nn֟k%cFeBIǻ|-}mCZ4)Y(E6x{]{Ejt 2*Σ#=x&yݮk=:R7Fְeo$61''4'M]Oq#cQEQEQEQEQEAåiWO[DJKmE <¼AxJ7Vl.u=7)4"675~5p יl. 'ھ:+sDž>*|15Ky5a#RXW94U/ό?hZ h3çZlv1|*>^y~;]o?o/4HF7}*ƻ_᷏sSx ;LMQё%ن,cibjV[ݟ}@_ յrVK {=Rx#fTa=Vşn?/+T٪72nfܬcnzsTݝ潗s힔c;,;۫s5ry%W;W](4_Mso)Bu |;mR^Ѿ>9tW[yv@JH;ȭ.?'Q}i:O{uW|Rƥ0>ߦ";D@X5x~+:hԒj^$H[ջuP!X*+O./I>mH1YϦjzl7#k ^Ep MuǺ:ŇtMKMPӯ"YG*0ʲ8 F3֮7N_o:f4 k_Yj<[2Vy8iWnѷfp xw\4{kŷ&31%lW'ilqN^_㋭v͡/j bxDf \7Kx\Khq[kȾJNwmI_9i WS}΁=#wtVz[9%lH]o `sU|qhW[]vCjS!O=gc S1-d5)mٿ}NIW+:>GK|7qimomxMb݄BZ4dg]ċMWOYx'U'ᮩ{o<&E2+osNLnW_חUk>1hzA4d"q3k U;2`ϵ{h7?5gĺ ,6RoxP8 h YN(s}GE":ȊC) A(lq*,8*r<Gpk~x+E~@ QAuz(7p>D$qXֿ |c˨OC%LpФ1p<9fxė2jڟtno4[t:ꠜrNk޵ h+V:ʼn`eKdZҥ`|>𵍴Vh(bTIcpzR ]-zi2밐c$~82?:\PzsKVԝt4}G?H3t6?? --b@M ce:n{aiO !+t0#4ONh$hZb?qARYWQ,5_]uO1_^\XED\wwz|2c H+*$'u=!|1T#e}2)nV6s| vܟy5X^HuDA")-‡Y*CiDĨL5_ > 7kKK˻dhТK U [Mݙ>|>񝧅.toUlᤅd9y9 ļ k jэ^?Kumekk~ğޯ᙭|#hzm.W.]@ (6x.[XNX+FW]fp1~e'jIkPX^1 !yeRqHz #IzܬLDĪ=A|Ο"o;{ j V[m{cn4f,nA Qmj-Oo~4 i. /"%BFM3Ɵ߀n|fh"HFM1=(%B`s \㟂_s[χ#S|UZƤ!0VSŴh ~>2o(Y[4ڴҢ(Py i?!Kv߇72-/=:&{kp.cʅؤHs^uږ? <xž?"ܮ&t-GA_qIۆ9RHs<\ >;xKDŽRN4 ƴۖ+u.ͼwu{RmOpW^/<-6r Ons¤ȗ?Čz|p>S ^K<ULjO!o2)1,#oN@Su=ּjq ooN?v}ny~#E Q쭵^JBfc#`(/ߋ.aoxWQ[>6 xXTbJ3Z^"|GR ]CXmB]4{$Q&V|oPSI/f󣵊(VW$KO76EвԵM=)$á]v۞kFݯ;ZkzjeӴ(tޒT9 yw6ᯈt"A{.IfTxvvB[i3ҽ#m_!kWI Fia"0i.X~ m o[[4Oz5߈gQдF؅ z7FƛAu]2A/чxBF<Ӧ[XJtUŦkhHbuG|EpI8υxf~mZVVF!6$%'',pF+_Y.[*c=J\'?k>ĭWRH^!1ɽ-Fw;>xևOWd{9L76ǿ r2A#h2M>q2)r:evPpU}B<+iZMvj8mEO_sV|Iv0赤QEPEPEPF1=2h֌LC%-!%EtC%]H¦`-$텀82+K8v:RR=vF/JJQHacFq.yogNh8ӵ%;c?Z^֤]Meo)dQE$GzOlҥZϮEliJgX4A! sjsĺ˪br9=1Uu+$lgqF= :neտ_1G"?2ůsK_Z/׊8YHCϮ>|[iYy}8OnO_jFEWeB*lOz,1 x7K~? nҺUHg>x/!Z}coU bh><-4: V3bL*+Ш7gsiG=ӤyOt}Q@n3Jɾ~\QŃXj*3@cZxLMd0gW>QF,l`b(#XӜX)((((/ŚDž`@.Ng5؄'q{v|QMkF6SY7~dlg3y}5V_D'؈jmwڎ}^) >(uȼ<1L4]~G),6Wj ~,|A/+;;Mh]ۣD1#"|I2M/x0/c+fIX+ؼTWmA8;l?z F|a} |tȵп-έm%أ22P}kh=e}U,졾".nLb_ ~އn=ɪh%[i!Fj̚y|)մOi[o[o.x, J]9o㗏gx~.?,|q-*ȴV-XR8/| +>5-ٶwrG(Y0TbOٿk/<=jZDŽ+x&%dB\R I575|8־$^xU3[iK.y!Q1~lT|N7?/W7?/`Y*K ( ( ( ( ( ( ( QPKWW{]>[V E,A qȬxL :cHzŌ:7VuT۝=)+iCFq$[gJ\qdDnWfymK L}\ YZ}ފ?o>ЙU9G2=8ȭe,tɁI*BuG1an"x XVtK&J6=㊑E FA.0GcxzӦuHm".㱵$sA~ztZ [T bU绷PKJPHyBfO΋?-²{UXQ 70Es",dc$V(85$:5 I?z {03wT[\YCyӟKeOX]:gW;gPԵ+hZ@`mav jWσU:&Km r#VC!ps3 W -j)tKm> nuG-UqxGfm*$+V)RxHr8 AW|E"^YE-ZijI47z$~↏=-tXVVC7 ry&3{xh%u*QK%ȩ$ѣVp W/NYiK4ji†9D#گ讥( vz֗H好y6VbVX;s8὿]mQ"I5pG9BViu<+kWӼ{X'g[8m[OhJI0*cO |=㶹c΍mh?q>dnFJx6Xt5TLwks{L|] JuItcͤ_]$rJB:=(>OuO |Mί)t5"{$rE#nX,ČcŚk%|nZ[iN{5ܺr[FN{YH_fxkfڦCJA AY|'}☼Ms GHVh-cq$VQ=KZ_5?/ 5;8]wQ/vfi:5ÕK=4ƿ[6HF1 N6 0gaKq=ՅcKm1Y|L~6î+}dmMOK+_l1"WWͳrxf( [KW<_pX^$3F(G\yHF|Kck?±uJ_ۻ"RK`]~aM5ϊvhMnJø?SWWM&Qbp=ĬHDRq߀k할0pwC?5?Oۯ-Q}UO1D\>b{|+e.+@Ь?\n\km}>!P>YKjMi]Z6&;v?zWa(F ޷ܻ,M9KҲ}J+cO#<8|0;ƂH-јlbD}۞+"o3JFҬ^iP}^hB8B BIcci^ɞ6guZhR_eg%Ă8z<۟ZG|[xv+;Zׄ[xu5SgQKkFq]Ƈpm`9]wǟOw:PO±Kd$rn=CφQr74Z53(2B޴U+ .U/J2RFH 9[6ok{X,o4uK4ÙWa>|t5xxH>E5Ο Lj_,1ai&>pM|x⯇>j;W Wk2 ݴpbXFqX h?7}Z7^4+3D/Bi(vbI,Pi2>׼YxU"mkX􅔕!v#(x&x?iٝ4Y)D$,W$<(mw?"f ;jvzŤwVPZɠ:68:̚|ja/z7tR{{}: \Cn6V ]S#O1xFX՞Vea2g xio|cheQ@Q@Q@Q@Q@Q@Q@Q@}.[ү42ZJ2aMx*žR5Jaq Q>NF w&Gmm^j7׉Bj2ԍ9#sO'uVG{ I+JLQS9s(>Q:F(j^nOABIys|W5TӴ頸ound[-Hi|q?|F5F `iotF{)&d~2q59翭syU~ngpCoQ.YdL2ܞEtxtm$XmR*Q sk9,ff̺ֆX."x)a#WA|WwO]f >}>յkH05;@:^>u~!/^5zxuT_2,2 0{~7xB?ޛa0kcoGe1,[I$&>;PG #࿆*hzRHyMg"I:ӿf?5m4u{/縿[`*0 y4rG<^|/]K}JQ*ןzŜw,f$vv2}Ų4Yiik%qlZ0LQǘt]<|1[5K{fڤ2Vh@ EP0 (:oCq,#:%T1ZEeCUwEC>Z ?Ԣ%|_4Ij+hR>%~êo컏"麬s4>jd'pʶ( ( ((x[Z]$[iʐ]4,A q>Oi?<#dńUH@88aMEI2s)xGa|Yq~϶ :_FdKŠA$fBb̖쮏~|U>(x"Zws\ Ԃ|c|mzzt+HIG@ԃz岎Ko|#N5/xiΥ?бA\sWih: hg<36Cae j2v N:ٱ]}̺Za ?sxeɿmo.nJ٤K< Kr{Śa;D/-(N6QW$A粒ֽ[[o,>}lEʹ0ffkЦkRKZΐu s7ݍf|] ;~uk2i-䖰3ȑ;*!#,B2|CLNׇ<5 IBռCgvڅSI;\rrW|wq :O0Heuhỉ7%=!L x4LMٴ}&𶋯/5{8-eM ed@'%m!M%) 84)?\W%?x5&aBC`MHdmBّx-;UIMxB6ɳv?IbI&(Ƞ7ГI"M(uUpIS__xRSu#G5>'ݾ#pY_> mxy7Ho7q-ll>:k._34&I|=GËhnH.#gO) cޞtmw@)WX9nW¾ҼoQ^څո+%tVf?ޅ#w9mXJNOxⶋ=T-4X #E5 Y*y~p>_| 'Co(Yi}KUfϊV-ƙxፙMt vBGMRZF-LZ`A? %agAm"΅]]ۑr5W^ ςW1;PQ3Vcfkƿ[bfQ7т~؞~>hRGus> H/ c6c 1qZ7}Z<.kk\KyEfD[v[*9ko |A;W=ƩdE$#gWR" `6T>&Susi΍o!#ͺDl$d%06 d%:ݟa-M(JRҪC#`m_>~7 ,~ɨ$-3E3;X3 ׶+87ӹ:KT??I_мK),+hR-˻4C@?9^zT<|6EZx_Vm|QV(ZYgqyWh^O j߃/4O>g sddF@WrazoZxΥ]]M]N;&97wj\*#(< YWkx[_xM#9=zVwA\!OChE]mrZWOHq:zzsF( qҏa^fF`;tpps 8y <ïTFQ@`Ԟ~u.2߆-iyk-oBIfv=ֺٙZ(AkϮpNNi8=1@z qڗ'SAb-U=FPu:4bQ8xgJ.ygA ue뺩GӤ2 c=,oŶPFC05y< \j_n|_nx)fΣ.zc<ρv$uT?[kV7,dKhNoy< Mv75L}E-J~)]vNiA(;$P⻯L$|k>M>}Ě|R;e [O ?kguMVEoL$>;T#4j3Zf.%\KgSq-iWO.Qa ÐA^gW4o%NׇMcabZ{3۩I*O$n澎F6zkJSk]SH`M6IV;ڡNr*SioO7܍MQ\Mf=Pp 'e> ηmwFacmxiƛimpetJ ɩs5/z -sP?Wz~[EՈ .(35'j^om?RSxe<[m$`566j=׆eQY #2p2 b\|gJM8e'k۴?04Ljs[4xOF6K ((5ڣ[WӼ)mZx gIDŊ1e i Axڝݾ>4W<$>b ?dtu]D|i=Y+B6I\2@M%IQv~6u/'4~uZ^;"7nIsӯǿ[_]M2Ŷ-g9(!{bSn:%5"C[^o eAkخfٿ՟S_y( :Z)<碎([_ט_;iN_xue wF[ hw-/%h8Bŝ789?ş>&ֺ>iMWTLMh2"0F{Iqki]#O# 9 Q[i1ޠ?fgP7<}7.NwZLVQ}}lcO' :y>&kx/.`5ەsoaIo3U@ `Wxo?A?t jvVL-eC7nUG> ~zÈuon̚j&;vh>,.UbN:rMmQ{@ׇEaw3a(k p횿Ĥ/ܑ=|i}7Ws j-֍Ư-qGyrذ{ hzPqbb=?.Oyr^?ذ{ hŇ{\@h/X4b=?.O 9@sިb=?.Oyr^A9yLUX4b=?.O n)sGyrذ{ h(UX4b=?.O uu[I-U)1c7)rzͷjs![9Va'?ƘEިs)W?rb=?.Oyr!W?rFUذ{ hŇ{\@4 [+ԻWtFZY bh/X4b=?.O U/X4b=?.O UC=?.Oh{ hKyr!}4z4hO?Ƨ[BW_:fɠ sIE.h%4PQ@ 3IE.h%4PQ@ 3IE.h%4PQ@ 3IE.i zJ:=PCm3y1jpI'pq^@cqī j9+濆hwYxǾ.ys ˾oPM:]U2k7͂Hu55ܬ0QUew PR#+K8,XAU\Pfotocx/images/color-negative.jpg0000664000175000017500000011554015247006660015723 0ustar micomicoJFIFExifMM*JR(iZ0232-0100fotoxx-23.74: Rescale: width:675 height:333| http://ns.adobe.com/xap/1.0/ 8 370 750 2 2 0 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((M" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?+[w8Pnf=Q Vvf6:fEm]cݹՆJjr͈Vϰ/?/?zsmqT\WOi/0%G%_3_PfOL_ Zt_ZZ1IP_h?gֿhz(ʇpҗcK Zt]Z()>@G%-Rpf?)v>-)k} nAK_lQa.?-)k}͠R_P`җcK4 ZTYRJ(ˇGWR|J)eJ]?*)k}RWR-ِ3} VA;oJ? U(.F}?*?%m}Q VA+oyK2F})?%m}Q NA+o{w>EK FA+o|Gd;@QJE_?Ҋ_ٰ3{$7?'ѿ#o}WbQїc?'ѿ#o}RMF _2{$7-?%!o}WZ??eIt[TCK*w31U'_*86m;Jt]F+r* A[_wZд4RUF-ӼM_p!c2qX*Gޕjv7Gֿxֿ֟|IPAG%mpfR}) nAK_Kt ue..?-)k}͢RʇH[R |N(ˇGWR|N.џC_:R?!._C_; p2F}*?%m}RUJi—d;BSJV|Jِ3} FA+oV|)qGd;@QJ}Vx>ǿOJ}6xQџc'ѿ#o}RMF)gChOyGG$?-QGt; &AjW98zOqc_PrLچ2U&yQ^mF2.7y=~y+_?<3MЃ]YaP=$5NV59-8=j1{#F<ŗ+ vӏҸl+Hi2^^?XITkuFp*b0NA#W]<Ҭ~-QS+/F{8@koڻ*?Jct5&2^ L+sǯil.)qF)WA 4)h-(-- @SJ QE(`)b QK)E&8RRiVSQ֊P) ZQIpZ@)b8 @DvOT@/:*9/DSq%epkH__+x>$֥/)^Z)p>)j͉Ӄ#Ƴ DDVI8vqQҼڀHag,%)du+IVid9G"=RK{8YӵDqnMĶye|E' niUXAEZR.Y-BQ\V`)E 1J(QpbR`S`;SH v)8R)E N():”QJ )E ťRW|$ן^>oZ8?#e[oz~|e?k|O^O_٩f4M4i"N/Z.XNnGz75PYC=+'vz 1o_\೫TzMbd>2-?y=~wW_%&',҃MiTadԊ1OZaapjhW&^qVጐeHːv4L@<ҹ:ڻ ٙ$Va',k 9\D`:D@%}:VV>bNE-.(@P0p R1J+(b W @)QpLsNpJ ( P9ZP(W(JQJ.)\,)PKF)TR@(UBR^GM: *8OB~21_33\ebggAh.px)‚8-ITҀ n"=kB2qfo נZkҠ;3Ml]jܪ&y4١ׯZ0(KH)ŒS P(p Z1(; O p\RJP- pF(Zv(%:)qJ p \RX8RbQ@Qqz_qp@M7/\gYӃ*=&J+=$ߊ$MC7x2O՘lfu,p:qH"O8f òPll@3Jz( a¹̲0NZ!KGHсdBOaI5aFMO+n]ڵRE< Ҝާq4V$:rx&7YkcӄmOҼ[βXv䲜eEF i ;>돰zBJMבjK(*O7"dUH|SԓK׸Y1F?W=LM QӶjmIde2X.9sC4,1^l#B:+ςGN ߥGןb-C/m\=Bړ>_wi?~_ '`̏s[_4緕q pO^jWd35m߁K˰֭ C'pzwlCg6Tgf0,zʵmn,0_\+/:0j~g?Ɯ/.+Kl~g?Ɲ?5K_]`͏oGlj\Qvd{oK/5Ts5&_5x'PX?ck/lӾiד,Ni/H\OQI&t,!2z9̻wk?vƯhvu&d ּnURy54^WA֝9IQhzotS4Dck}+̭u+4?'b!;u2ץEshb#JzޮGr\DrᎸ`Yu R?:k|vW}RgNap誟hIQ=r|c]K!X%qߏZiilyP9ÓJX.~t?/Q??د???*PvGןbGo wm^jp\RxtA;Z/~p sN}/Kf]ݿ_h]:H7++@-Rm>Bo̾˿yS.U[}Bt'@}6i C'VkjO#nDs?Zgl)m~*~Zq4zhLE[Q{g?Ƹ׹~3Kpu' J"UH aMiG sR٢Q^e3»}l?#n~|a;~ӛ$y'czeo Ԋ_oi޾ U])潣70G-я,`:k S,|tS /mq5oe}60[jY\s-l)EJx+Su77|z$6IwvZvrɟ0"VOR&Dó5[ƫiAjdVo-(ҺGRX;Fd1X< 3M) `X7v KdX zXPNHIF{%7iVq -?H^-/tv]U=qAM46ys~ ]YamǼ󌜁ں}KKӭ۩+G6< Gҧ+"Ǟ}sX}./9ȅ5/gɊsxͻVׄ(ur+I``+i]5kM?MՖqv2=k-Rj+SɰE@}A :|L4- }׬NrAםbX7'o$peڕMr;^խ٤ ~n?@8I+47O<[ݒqx5;.j֊gm ̹~!#H2m_ڨG}Ϋb7>t:jW-!mđ.-S.fzdi>Rgʃ@Mp~8ѵohÐ5EX%0xr~(uO=Y7eIBNWni*= YhVw2ZDZdw Ϫ~hw6Uʑnڳ:.Z+ykS$vrZ2R GOm,\>ΦJ ZlJΓ5xq^4L%%6\lsMi2߃*׉g%2$GT\g̱Z's[}G]oýFr;T>TAorqYCO'[O/t`Ƿp!RG(-NR]:d@ gyq#?e^ub/!+@q͚~f:+W8Y5UxG^MWĖ63(V`r)=? 6v=v+t?Nmnc;x`|5+ڣ:-^*9Q:i-WĿa/-pg݁ v#xg@֠) =OH.+W2ϸg&:3ۓ5Ob4lv8GRƼ:zmaOl^oY<1p򏔞Er~.ӵ]U&xA7d$Zrylxe_NڜPš~m_XIJ:2A^|rP^R=[[ |kThP1\4SS4i1݊ڥJ*:y%~8K[?O Ci}ɹcϤw> =IR5ٙײZ?'C{kXOz<\AA}`~omlܶ9⹯ 3|SV-UͰE<[nnn-"2$0nڧ֮]7÷ZƲBTnrP8iP\ۮp$Z$Ѯ-$lZt\|2?֮i iNa F[aG7FJ+SPl;J82WF+f2150<5YэۛګV,m%K(SW -mDqk MX0G57K.no E'S\JT"*μ]=IZ+˱1i8WsN/_BV+IO?{Rfe7p1\Or+8b1ڴ٠֪%n$zxT/!dvp({kI.^+KK|GzOԱɰRio0 sە=r(ڶmئsTvF_UAXAVme\ "$:$!Oe^\_[ŹYočFO5kIB6 #ۆ;^5c"FTmz5}A̽ͫ%,9A6q יPU:HktZ}l:^ա<bO&|Yq jͬd"SI\}P6Z ]23$ QT5GPf 4k6Y"#{/W>)Pn}~<\Rܥd;P. "` ?«k#+?P\y5[]:?]UV#7]O#+ɴv'8֥7ܴnjnؿL&w7\VSv:UKT>I6-?j&G7)M+qqB/W?WKj=$Rz\cz'Tqz٢_ 9|&PsVWGpLqn4^.?c xS ʀ n|;R(%3U]""ڌ PݾARRjyAH ?9B=v Ơ) FP1\D[|$7ew%v~Tfct,2=2+զ?HI;|ˆt^w7|DбR%5ڦ%3`JͳpXTv34h&j,o b:-ŶFM濖 d<I]>\gڳM4.wF+ )ƖkW@T?|6%*-JDdg-rW6\yPNqqީD)'.Aɩ~xaKWӊLwBH#W(Cw#`~ F& Md9.Ò:4F]I J-#c$A|5E qnv֬mbn\# Nh ^fD5ݢǜW9)"c 7]291 2 sJv:K:Qb<8Ǫ87魆^q<~ZZ%3l~FɡX i99p1Trͷ"Lީ_Mäzc(;dvZtf2jyqDxYΪ t+>WKddlnK<|-Q[%B{zA;_>E62ckB\5ЊG}O Im(V u0?Z6^{pJi=%M̥eXC;n9_e[ e$ժτ򂠑uIBd. m>|E_f`;$;nƄ$߆MV$]^=_>_eFZ;ڍzH%ωk7i8ʙ%) RE~`4߹9!|ڹ;KmVH㍔;yvc9w:O%J8$ -i^3ZBvhṃuiG? ?W^Mke8žҼwio<*rO5 w#*vq4M镹O1E-3)'Q=~x%~c'qO_.GHe(Oo* n^})B , 2Id 9N!f>I46)\V,[r+4 O&JOzrlT9sLfRdТ9b7Zn;w`~b[2R{4Z# ;LRw˒;/ 1 T\G,[~R@AahCtc_\#1Q>Y#=G4RT!!޽D ܩ4{r9_zbsvoh45gSϛDR3Ox PzYʳw:NԮZ! >gTڐX*ܮQE5r*#5R큎%7޽)l׸${TL(\}hl,!Ti71KqNpX>1稬/o#?6#,rd?*`iZl3O1ЩqJĨ܎3 Fa`7v'/r2j}Rm1 z򻗱'1-#g?%%X3TsԵM5E-YNJ5Vjw-LM`nI0XM*NTy7NssqA T!Vg_¡O.dVxb9"#jLKvns~uYZ2xApS/Q0IUdw,*ٯE3$RjаC?0W3<}2mR{tY@;M]CwJ*c9V-3Z4$}#돘W}}r yxHAv0nSl=ԁ|5t_WYIS_Kk#XeЅ|+I?)5BEJ`ʄ,8UY3ƦF ; IIT9R|K+vAn3ĐKfkg[85IX/ؙg,sS%OS qODX 2W h O9`:ःk9qK9\JM)Zܫ)-zwo6eF_® r:fEYscu޺s?ssH溯 FO|w*nM!`Idз3nMa)f׾(6 ]N: #4317sT;LnǠ $+Ɂw`/xV_L/,jfdb::U]_\qaYH =MfAjG4Kڐn  +еY2aY"=8BC/jU絅{Uh]4!G*! Pp۽})߈bڮe==cvլ,"[Ŋ0S4*5`4MbmGb[?4.Mtuݽ"V5C;OֵNd8KKU;Ra֌ܼ>l=>{KJuęQWEJiu"ՅsEHb֩ΒRCs(lmE+aO\kLϦE5h#HZph mEL:WYW`֐!kݑ z3KzU݀mH(Y{~!pRh㴶WG9~*ƥ5,LWC8+"cr4B`1\]ξU04dֶ6~^wdd hc%I٢vC*j#=f V ̄FStaԎU 36#s0zV߇6YE}k/?Bs=E=+̄ӫ)Ia c:l: t&'ѥ{ m"KZ-(poz31hBV3?n-xS?TluWZLVU?2ztFYaI#&jQc5ڑ5r9.x;NH..7r9@XlCpFU ڧ}(p bZo*I T9sSѷ~E Us s1*?&z^EZ={rs0WΒ4h d+|X{Th%J{9"ymqS։rGe, mer(e#ӥ ö\&hRr=U\/f; ,`iQ Z0 i9G4̜HoGZ-H!hP N~LfmeRO`p9(re\kr7PUY@b#' ,QN\",1u>$$9J+3"=2x5 M]U -mXĘC+Gr }(܏lW|8-TXd+ NG72vs׏XT9+J-j5vl(%OQqU/e "nqqVmacۜ\<Vjx0ΜRz}Hm" n5u٥OR~8ʍ)-횁KChͳc:ӳЫ46k(!v@j\hw\@9$?{DMglHm槒ڲT܊Y.BZJ hN3r~Ep\}U95Gd 3l ٥zu3I:֑F4t ۛ+]l*gWK}9c{m#'^e/5d2v~\V}qܗ;@8ʕlj+/t~`'MZGy8"P˓osxZWk>6a´MĈ@H>YT OA>1B>|I+H 4(.r:r?CPhX Q^`o(ЛZ$Qʑ[]Ds ƤŐ,7I'tХqw"}UU+xBN*K`hfi=gM1 ,˹%ePJk)?+Kc2zWf߻iBhw;mi6<քIgHwD8BQr6RMEkQ$r8EFy"b3bSkhu+% 63Uo?wmL2#+`{H [z&)IKci<YI,.ݲ05{?ٍ1+͢*+:  $̟6'zo!O1[A?;tW~(˩=9/c( >.?l{Y|$2vb8;x~, DYwh UV4A+ $ӁK~+ RQ)4ps+RTaOGj AevfEAm|abfBOԲ/\~\ˡSD~T1$`i~?S]B, QǪZBofǵZq&^lP2\cO-mfW*BsjlZqŰ+rsֆ%S.# rѾ~Ȼ(OR]F,s1=9&(tJJ|Ⱦb00+OHXex?d}϶L"+ͭf8sH[S'9^$ \ppk~^q 2ܿXThXk}@3404q,s+HEr[?MKkŗr80c-0#[vi?{$2y$Y͸ o8-gP<[S}v~#Vlٿ:In銮߹TUoa3\8$H~+H&R*=Ĉ<ˏj}Ә%F tYDNOQLtI"Y*U 7Oֶ-486sr٧vqBYm9=$Om'-K6Cb`UhUDi\t;w؂TFj_S$~&]Z9qkL Gը٥s0_)VH>^ʵ]gӑn?8^\p*ոWtS$Sjug7 1!fiOq٘EU~O4S_}4j/cB'͂CЏJ)SoVeڬ.$My$59u[h‘o,&: ]?4̺,WUaM[䗵 [S$ʶ(ZF.Dir@.C``Fdj͗WW=5˸x;Wx~#L`J3{mfhqtA:ZÏMB6\y1d(=h-g1K [jmC_s)$#>Xzsms+s$傐֦Coᅁg8xX1,-V5tǝuɩqB/ [[_k9`1y+'UT.bFijn҇a{i?he"&1U(7+nӼ((ύ4vLV6V߸\0,XwqT%Y)z沭QA\Uz|*(CqӚ;1^x퀂ZVcI=dMJ*OEj3EC&) T}b8-f2cx)."ٲyʌc[AJ󊷨Ȭ2@RJ9R Z0t.턐ݸjf&HLQgnZZSEdʾb\ Nx^]Gs?dKW IS<7Rs Q3[lm9UtlYxycmg\9eHDzC;yky W-ϣ('Xu*-"eDfO>o_jLƠ1$R.f4Ѵ`nN1Mϗ,>cJh,1d;{pn$Ww.e`cǦ{&; V/aAU왥 OQHvcSjE>N$bX) =ksqyHT1B>(acW5ȶwCAbFt+ӂ*Ϳ?v1r*hZycV32y]En1eF!&/5%ą@H ETHRHD:KbYF\ cߚ꡷,xt b[?dr*׷ >YZ =]Usˠa0Md4߼Jr~&R~1h1qWO׍6Ӧ|F5 da.&-݇Oְ)'lv) J-iC:zt%YRb /"wW,'JH%[zOl1'5<+$xqϺI[`}P6IY ^Z_4)i#*ZF[߁Zt;ؒ B~ZN.+h楫hLE<AqT-{+Q>C;^O[X8!:Kohַ\7!08Teݙ#d) ,^9ܣs7~!M)<CQ)?>ҭˢt뉤T5#RVzUtt+|+ y$?(n_ʂ83ہmof)zR-tg5HîFx̄x?$wg%^B38 zKMmxu Rns{io{~uT* P0X³R h* Ir&Pb|6XRtVa&g XBixj/:g9+ckeZa(an wd[Zzc3blQ{7s7Qe[tEq)9 "oa"V/ w`'^'VSiV3br ZW}-mII(ϩ הjum-@fqBG|f܎;M%dogҽCFQ\E">ITm|2Z,89g#чCV-ʝ ^ƻ%"ds޹OK]b?uفp 7O!"} RF:sS7z d`֦E_;2JT&gc*,.0%*$c/9uTPDyzeԜOZsi;?泸MNV'jY'V˹ :KI8PG֕xf5"H0Ȩ{K` q-<\Gp*aA5%\:Ikޣ[=w#\rx*!mQIj;XH?+ ?Džu]o\x^Bؕ鿶Լ;\br3t澅fXnebikVQzRGcUg?tY(i,3hG;4ҁ j_0QSԀO4߭(bOC64A$WvQ*2}kz i Ye9'Eh 8,5uߦDq:0db ^hfC?ζL}VZR\_3x6k mFq^*ާ,emJެ&KXUd4Gu`ly}ɬ|[~pƟE$}I?hrZ[TϗRݤ{`3_1? xk_p*Fe?xv>-q;ԊsU{:}Rm'bcVxuNG&E͓]X*)qi\V zk/CkJL#p3y?sye-78 VMOm*o ʰI1Y. >rGl p9 K #"m P[1uO Q<nB,d]K+ ji -rHYS@qVw2:׆EZ5YK4WSn gې5(Tv:A  XBr=~cZ)Ātyip32\tPKQMZVM DTʫ .<4 u`|s,=E!G#ҝ-&RHD>5RNeL[ΆNېkc,3Tou+[4;IIʎ'~5xU^V0p=^*+f녃L ҽ?TqKvy{%KeTU5i~4b#%zw쫟 w??k|mdzJ/TPs+ĆO%Q8q\pǥ~\g<>40 dQE^噦yӒǵwm~4Ik^TUPJHJ H#^I>zT<ݖe۳$,2 QlMvkXcՔOqU`J,K To;k":jl}iڌmlbmܠ)4"4ij/㹤9>JUVrI*$)&_MZbw 1pjZWӭ13e1.%گsRq>Y)IJBf=pgp4`!5fGv}hl+~f8IXDZ-"O5?t7SW|+lk8"#~gzz{S4B0_hLeo" ^3]K z91wO7-Fm^SLq ~m}2 &6hws>T' u66l$k8GW 6rǸ#5;vSMO#GQ\uR|ֽ? 3ݲ M+ðy| ol,┫}Bt]!> hȥg+nU;G|ܣ*4\bE- 1Ll\u/6P2xdqMhvVPJS˶E{2J|ܶD,5ѿu+SGr:] [فF+לtp֗aEj(4֛=`*-9k=߮ F$>&j֏u8"kYzq؊{u 0+>c%t{ ݉?@=֡$о"t cgunl4GcԭmRMB;B;|FCG iwSy$~1C~ضN}k|;j˨]G%6+#8 h5)6Gŷ)lY|?-,U0F^?:9G\1uW\ILex3"90jD2̾SRX?2!M*NF+{b9"+,iUXɉ nO:MڱqQIADuv90 7yV9ӫ#1+ՕH͏9U20 B,Kgk[u  bL[4؀L|d' pj .@u5Ry M7aD}\+0iAD.چ>.|G  *.ڎYTkoW){Hۤr8Ȋ'{U$űHd i#ھ)ҝI)rGaVs\%;/@>ᩙ Ly{GKe!0,Wd$ ȟRȱ@T[ҟk8gO&-Y[rUH 젩L C:YI PNlfTMѲ5ߊzVGcq:no50c,lFXv+0@eu98tɖi%@[nrqT`}Er9feJB#E!ktXfY"?ScG~zo"$deL` 2?%{yu5%d#Wh GIGLv";2s@U'$OFy?j+W];Di\b+H)4BuNdTjwGm6*駊ܥ#њN}h@s{;}km Oc, 4]巆>*2尬p=[SçO1^ambdn70^I qM|Ho (2jH~1_M+'l.{խ4YWrgZ ,29H|T?9 {]s]Ƣv#/\`MR#3Qָ/|"0wZ tkڐ]ֻ-THCt`~gEyws[g5XeLPM{~ FYGF5-m\˥;%'}7q=YbmxC*#Y\u{/+fkU%{ 93sobZVkiU{yp~/? +׮exl25Z8,I䚙MRU$cmg9yfrzsW#ː<Wop3`@B*Dr~lQP:Vuε hMAeTdO(WđY#{'V1cF=jWQ[7MjxRٸ,{+̊jZcW(vEz"i3f==@c_iOq֚ Cw4~DM222m۝rjn8R@頑[VZ xдzrH<_[:i;f0qcpm,Rҩ4;mFURBDs8k.E,H@8ҸଝE[wX "Ak6zbIa\\ 5|"ֵPz^6|j.lB:}Mz!x >גx4mU^*G]'Q>洓4tQEdds_EbΤVW|XBsP,@_(䞕m֚>8I|ݲi8C*NR5ml!yR(O武c-3X=m/$z׭c5`!nkSJI-+,VwI)Њ1ۚfo4K5 iW v%s3]'X9a9=sV/6*ǝЃzk[\xڞד⠋çQwXU b{A5蜓\d繮 -GZc"P0| F,Cz<3gAWj[I cט=@V( D`ȱҳA\>y0Z|qk46W MVՈcjSHoF-(?AJ<-F'`sO7sym R@ޥ]Fϳ\םοo%ؓ)J_ F2Iq*Wc^yȯ]04x}Maক\>6u$ю<-!ŗ]-ZP܆|sY+ֽSN hyKV8-&qS>\y.FAF3np1Vlũ~W\TϊpQlҎ!)j?e.@{+™/Q#ڽ>֘H,E>v"6Tʑ Rf͏?TQ2ibF}AmBT*:dWW?%v/5 FC64KOks wmf=lt:$qBd62kq 5#Lq"pcDd/DŽNUJ~8ֺ%JR5Ark[(H<ݒk־!꺝ْ `p2k>AOcAުE/tɚrBco8>>xhe)Qsڽhz}KdHug/5;y--[!VdTrָ/Ҥ N5e{*i3_ΦtlhLJb8sRx+TPSg¼05ַ $7X㎕27x+ Z7ܟ]ָ V*]4,Awv- ,Z0$?WJU6uE9}[eʹBX{g8;ibČqZ1xSRk϶ͻ =#{+P)WXHҶt] M+)+:4Vmm7p<} r7>05]n) l}O=뺾q1B8.sYjMhV+7~z0}ӛT\hq%ַżjdg#ŗpC<.!/A8ڬ(U9*<;KnXU$H`JpQJ0jztW+ [|d_G.pI⺉4 T7_ι xK\:ʡGU֓SV,dY-*ŤKrw*kV/M5%#yrGcQ4MGf zwI%PSW'?gbtE +-{IՖGhC߃IsM*?2|yBy1ZM&=_\JmXӿ!G\Y sO5w8Fz楺fL>On[g)6 j)OY\rIZ  Y"U=[|dt6Kc3<5qc4E yg'$5tBMe3 4pvTjk'7u=-Kk4IY".qO _-5XF7ޝoU!Z_֓{"k\d +XJE8qKy;db#4#mT^rLUe?"VTUDӅ*o3v##]y3dֲP+3+ WY}f=6tԑjG MtpwAa/e"3S٥*u0|t߈mb[7xos]=+΄Β"p3׎֛;.Įi]#J.*e+WA$6T=ꯈwJ  7eK6cj/\ZH]6З,*1#(Jmr=tsf o>[kV.$3p6<=>YOkZ= E.gP;rN5#&??l ŵ9; qzԤY-1 FLVX̲ip;\}K9 նdg2BmD6oUFkTcGYx!˽mNхFޠkk,KPM'nV?Dm &Pk2#ܶ~c\}8qg>{\΋_%''κ$5Q1KR& (Zcb)egT*O5 u.W*x"x_iZW::/C)IYB[]]N  fG&[Ú[Hd ׳ZNv\Fr(`kU#W[SKaiqNa94SRQR+ P(ħ 1KC4bsiE w4~t194ҁJ) 94  Zɥ\R@OiѶZ/i&Lߺ˃埶댿W!O ^ Hl&isF)BE4b99cbW,8'5:ʤ}9EJ.J`+岘ؘC޼R hpzV3 omn\@BFL8j ZTϝGďc~)kK P)إ7qJQK\Qp Jv( R 1K@%/>G>RBҊ94R3Gҝ1@&';3iqF)\. '9ɮLy?+v't: 8_⣶Wc׻8ߌK)mB0^8gRSw#61RbQqf(?0 pm;aP+ThEaڔ-SKW ;Q.b\QpP?J)qN.)\,3m;REa\,7xb{k ~+fuuRX$:5 Wh?>j[L~5=#5Iܙ+1:MP-4H7u`Z0دQIlgݳ?({TGz(W֦OԠy#ڟ?({SWz(Z}N=ϫbG?ҽ?bLSjz~(Z?J?JQ>0;a>R?ϫأ}ja(e>Q>Q>021Kϫ~b3QԠy>R`#][Jԡo-D˫5@x"3bL>SC~"ϫbHS57RfzN(Y}N`_ߘٿ1^1GdTZ)oWQy>Qj?ߘE2D=G}z7^1K y&>Raߥz(X}Rbjߥؚ7^1G$Tغ7*k=;Y(pIb^MXk _W5(#uBOzj{(_@}herciÙZx:BiI6>WbV$s_Vy#?({SWzP<O}=ϣbC`Rp<O}=ϣ!N=ϣ=ϣ}jb;a>Q>WQԡG?ҁO}_NS@/G?Q>WQԠy#?)5?WbQԡO K}>WbRPy 8sS?uLǓb7bL>.ͣʝϫ}jA8ntG}Կٿ1^1Gd?G}_ QVzF(Y}N'aj_ߘ>|Q> O:ٿ:?oҽbTcCٿJ_=G}C y&>Sϳ~8}bAH}ϳ~bjߥz(X}R'bߘ Y9`1KS*Ғ.xQYfotocx/f.develop.cc0000664000175000017500000015223515247006660013231 0ustar micomico/************************************************************************************** Fotocx - edit photos and manage collections Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *************************************************************************************** Fotocx image edit - developer functions m_zmalloc_report report memory allocated by tag name m_zmalloc_growth report memory increases by tag name m_mouse_events show mouse events popup text m_zappcrash_test zappcrash test m_editfunc_template template to develop new edit function m_capture_GUI capture translatable texts from source code files --> gui_en m_slice_GUI slice gui_en into pieces for AI translator: gui_en_nn (nn = 01, 02 ...) GUI translation gui_en_nn --> AI-translate --> gui_xx_nn, for language code xx combine gui_xx_nn pieces into single gui_xx m_transtab_GUI build translation table from gui_en and gui_xx --> new gui_xx m_audit_GUI audit gui_xx for matching pairs abd format codes m_slice_UG slice ug_en into pieces for AI translator: ug_en_nn (nn = 01, 02 ...) UG translation ug_en_nn --> AI-translate --> ug_xx_nn, for language code xx combine ug_xx_nn pieces into single ug_xx m_sync_UG sync ug_xx translations with gui_xx translations m_audit_UG check ug_xx, all topic references are present UG_extra_topics UG topics not present in other source programs ***************************************************************************************/ #define EX extern // enable extern declarations #include "fotocx.h" using namespace zfuncs; /**************************************************************************************/ // popup report of zmalloc() memory allocation per tag void m_zmalloc_report(GtkWidget *, ch *) // 25.1 { zmalloc_report(Mwin); return; } // popup report of zmalloc() memory allocation per tag // report only tags showing increased allocation from prior max. void m_zmalloc_growth(GtkWidget *, ch *) // 25.1 { zmalloc_growth(Mwin); return; } /**************************************************************************************/ // toggle: show mouse events with popup text next to mouse pointer void m_mouse_events(GtkWidget *, ch *) { Fmousevents = 1 - Fmousevents; return; } /**************************************************************************************/ // zappcrash test - make a segment fault // test with: $ fotocx -d -m "zappcrash test" void m_zappcrash_test(GtkWidget *, ch *) { int *nulladdr = 0; printf("*** zappcrash test \n"); zfuncs::zappcrash_context1 = "zappcrash test"; zfuncs::zappcrash_context2 = "zappcrash test"; printf("zappcrash test, ref. null address: %d \n",*nulladdr); return; } /********************************************************************************/ // minimal edit function to use as a template for coding new functions namespace template_names { editfunc EFtemplate; float userinput; // user input value, -1 ... +1 } // menu function void m_editfunc_template(GtkWidget *, ch *menu) { using namespace template_names; int template_dialog_event(zdialog* zd, ch *event); void template_curvedit(int spc); void * template_thread(void *); GtkWidget *drawwin_scale; // drawing window for brightness scale printf("m_template \n"); EFtemplate.menuname = "Template"; EFtemplate.menufunc = m_editfunc_template; EFtemplate.FprevReq = 1; // use preview EFtemplate.Farea = 2; // select area usable EFtemplate.Fpaintedits = 1; // use with paint edits OK EFtemplate.Fscript = 1; // scripting supported EFtemplate.threadfunc = template_thread; if (! edit_setup(EFtemplate)) return; // setup edit /*** _______________________________________________ | Template | | ___________________________________________ | | | | | | | curve edit area | | | | | | | | ----------------------------------------- | | // editable function curve | | | | | | | | | |___________________________________________| | | |___________________________________________| | // black to white brightness scale | | | input =================[]================== | // user input value | | | [Reset] [OK] [X] | |_______________________________________________| ***/ zdialog *zd = zdialog_new(TX("template"),Mwin,TX("Reset"),"OK","X",null); EFtemplate.zd = zd; zdialog_add_widget(zd,"frame","frameH","dialog",0,"expand"); // edit-curve zdialog_add_widget(zd,"frame","frameB","dialog"); // brightness scale zdialog_add_widget(zd,"hbox","hbsat","dialog",0,"space=5|expand"); zdialog_add_widget(zd,"label","labsat","hbsat",TX("input")); zdialog_add_widget(zd,"hscale","userinput","hbsat","-1.0|1.0|0.01|0.0","expand"); GtkWidget *frameH = zdialog_gtkwidget(zd,"frameH"); // setup edit curves spldat *sd = splcurve_init(frameH,template_curvedit); EFtemplate.sd = sd; sd->Nscale = 1; // horizontal line, neutral value sd->xscale[0][0] = 0.00; sd->yscale[0][0] = 0.50; sd->xscale[1][0] = 1.00; sd->yscale[1][0] = 0.50; sd->nap[0] = 3; // initial curve is neutral sd->vert[0] = 0; sd->apx[0][0] = 0.01; // horizontal line sd->apy[0][0] = 0.50; sd->apx[0][1] = 0.50; sd->apy[0][1] = 0.50; // curve 0 = overall brightness sd->apx[0][2] = 0.99; sd->apy[0][2] = 0.50; splcurve_generate(sd,0); sd->mod[0] = 0; // mark curve unmodified sd->Nspc = 1; // 1 curve sd->fact[0] = 1; // curve 0 active GtkWidget *frameB = zdialog_gtkwidget(zd,"frameB"); // setup drawing area drawwin_scale = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(frameB),drawwin_scale); gtk_widget_set_size_request(drawwin_scale,100,12); G_SIGNAL(drawwin_scale,"draw",brightness_scale,0); userinput = 0; // neutral value zdialog_resize(zd,350,300); zdialog_run(zd,template_dialog_event,"save"); // run dialog - parallel return; } // dialog event and completion callback function int template_dialog_event(zdialog *zd, ch *event) { using namespace template_names; spldat *sd = EFtemplate.sd; float input0, dinput, dy; float Fapply = 0; int ii; if (strmatch(event,"done")) zd->zstat = 2; // apply and quit if (strmatch(event,"cancel")) zd->zstat = 3; // cancel if (strmatch(event,"apply")) Fapply = 1; // from script if (strmatch(event,"paint")) Fapply = 1; // mouse paint if (strmatch(event,"fullsize")) { // from select area etc. edit_fullsize(); // get full size image if (CEF->Fmods) { // 26.8 thread_signal(); thread_wait(); // required for paint edits } return 1; } if (zd->zstat == 1) // [reset] { zd->zstat = 0; // keep dialog active zdialog_stuff(zd,"userinput",0); // neutral value userinput = 0; sd->nap[0] = 3; // curve is neutral sd->vert[0] = 0; sd->apx[0][0] = 0.01; sd->apy[0][0] = 0.50; sd->apx[0][1] = 0.50; sd->apy[0][1] = 0.50; sd->apx[0][2] = 0.99; sd->apy[0][2] = 0.50; splcurve_generate(sd,0); sd->mod[0] = 0; // mark curve unmodified gtk_widget_queue_draw(sd->drawarea); // redraw curves edit_reset(); return 1; } if (zd->zstat == 2) // [OK] { freeMouse(); // free mouse if curve edit active if (CEF->Fmods) { edit_fullsize(); // get full size image thread_signal(); // apply changes edit_done(0); // complete edit } else edit_cancel(0); // no change return 1; } if (zd->zstat < 0 || zd->zstat > 2) { // cancel edit_cancel(0); return 1; } if (strmatch(event,"userinput")) // input slider -1 ... +1 { input0 = userinput; // old value zdialog_fetch(zd,"userinput",userinput); // new value dinput = userinput - input0; // change, + - for (ii = 0; ii < sd->nap[0]; ii++) // update curve 0 nodes from input value { dy = sd->apy[0][ii] + 0.5 * dinput; if (dy < 0) dy = 0; if (dy > 1) dy = 1; sd->apy[0][ii] = dy; } splcurve_generate(sd,0); // regenerate curve 0 gtk_widget_queue_draw(sd->drawarea); // draw curve 0 Fapply = 1; } if (Fapply) thread_signal(); // update the image return 1; } // this function is called when the curve is edited void template_curvedit(int spc) { using namespace template_names; thread_signal(); return; } // thread function void * template_thread(void *arg) { using namespace template_names; void * template_wthread(void *); if (Fpaintedits && ! Mdrag) return 0; // if mouse paint, must be drag get_edit_pixels_init(NSMP,0); // initz. pixel loop do_wthreads(template_wthread,NSMP); CEF->Fmods++; // image3 modified CEF->Fsaved = 0; if (! Fpaintedits) Fpaint2(); // update window return 0; } void * template_wthread(void *arg) // worker thread function { using namespace template_names; int index = *((int *) arg); int ii, Fend, px, py; float *pix1, *pix3; float R1, G1, B1, R3, G3, B3, R9, G9, B9; float pixbrite, userinput; float coeff = 1000.0 / 256.0; float blend; spldat *sd = EFtemplate.sd; while (true) // loop all edit pixels { Fend = get_edit_pixels(index,px,py,blend); if (Fend) break; if (blend == 0) continue; pix1 = PXMpix(E1pxm,px,py); // input pixel pix3 = PXMpix(E3pxm,px,py); // output pixel R1 = R9 = pix1[0]; // input RGB values G1 = G9 = pix1[1]; B1 = B9 = pix1[2]; R3 = pix3[0]; // current output RGB G3 = pix3[1]; B3 = pix3[2]; if (sd->mod[0]) // curve was modified { pixbrite = 0.333 * (R3 + G3 + B3); // pixel brightness, 0 to 255.9 ii = coeff * pixbrite; // curve index 0-999 if (ii < 0) ii = 0; if (ii > 999) ii = 999; userinput = 2.0 * sd->yval[0][ii] - 1.0; // -1 ... 0 ... +1 R9 = R9 + userinput * (R9 - pixbrite); // new output RGB G9 = G9 + userinput * (G9 - pixbrite); B9 = B9 + userinput * (B9 - pixbrite); } RGBfix(R9,G9,B9); // clamp values within 0-255 if (Fpaintedits) // gradual edit within mouse circle { if (blend > 0) { R3 = blend * R9 + (1-blend) * R3; // increase edit G3 = blend * G9 + (1-blend) * G3; B3 = blend * B9 + (1-blend) * B3; } else if (blend < 0) { R3 = -blend * R1 + (1+blend) * R3; // decrease edit G3 = -blend * G1 + (1+blend) * G3; B3 = -blend * B1 + (1+blend) * B3; } } else // full edit for image or select area { R3 = blend * R9 + (1-blend) * R1; // output = blend of input and output G3 = blend * G9 + (1-blend) * G1; // (select area edge blending) B3 = blend * B9 + (1-blend) * B1; } pix3[0] = R3; // set output pixel pix3[1] = G3; pix3[2] = B3; } return 0; } /**************************************************************************************/ // limits for following translation functions #define KBlimit 35 // AI translation slice size, KB #define guixcc 200 // max. GUI text cc #define ugtpxcc 200 // max. UG topic cc #define ugxcc 5000 // max. UG text cc ch sourcefolder[] = "/home2/mico/programs/ "; // fotocx source folder, parent /************************************************************************************** TRANSLATE SUSPEND Omit following code from source code translation scan. Contains tokens: "TX(" that must be ignored. ***************************************************************************************/ // Scan source code for translatable texts, marked with TX("english text"). // Sort and eliminate duplicates. Output file: /translations/gui_en // Format: "NNNN english text" where NNNN is a sequence number. // The english text can contain printf format codes: %s %d %f \n void m_capture_GUI(GtkWidget *, ch *) { FILE *fid, *fid1, *fid2, *fid3; ch command[300], buff500[500], buff300[300]; ch text999[1000]; ch *sourcefile; ch gui_en[200]; // output file: .../translations/gui_en ch *pp, *pp1, *pp2; int Tnum, cc, nn, ii, jj; int ndups, nuniq; zlist_t *zlist1 = 0; pp = strrchr(sourcefolder,'/'); // fotocx source folder, parent strcpy(pp+1,Frelease); // add my release NN.N snprintf(gui_en,200,"%s/gui_en",translations_folder); // output file name snprintf(command,300,"find \"%s\" -maxdepth 1 -name \"*.cc\" ",sourcefolder); // find source files, *.cc printf("find command: %s \n",command); fid1 = popen(command,"r"); if (! fid1) { zmessageACK(Mwin,"'find' command failure: %s",sourcefolder); return; } fid2 = fopen(gui_en,"w"); // open gui_en file for write if (! fid2) { // wrong folder? zmessageACK(Mwin,"cannot open %s output file",gui_en); return; } Tnum = 0; // count translatable texts found while (true) // loop all source files { sourcefile = fgets_trim(buff300,300,fid1); // next source file if (! sourcefile) { // no more pclose(fid1); // close sourcefolder read fclose(fid2); // close output file break; } printf("processing file %s \n",sourcefile); fid3 = fopen(sourcefile,"r"); // open source file if (! fid3) { pclose(fid1); // close sourcefolder read fclose(fid2); // close output file zmessageACK(Mwin,"cannot read source file: %s",sourcefile); return; } while (true) // loop all source file lines { pp = fgets(buff500,500,fid3); // read source file line if (! pp) { fclose(fid3); // EOF break; } if (strstr(pp,"TRANSLATE SUSPEND")) { // skip this code block with while (true) { // misleading TX(" tokens pp = fgets(buff500,500,fid3); if (strstr(pp,"TRANSLATE " "RESUME")) break; // segmented to prevent detection } // by this function continue; } pp1 = strstr(pp,"TX(\""); // look for text start TX(" if (! pp1) continue; startscan: Tnum++; pp1 += 4; // skip TX(", start text pp2 = pp1; // initial end of text while (true) // scan text { if (*pp2 == 0) break; // invalid, no text end found else if (*pp2 == '\\') pp2 += 2; // skip possible \" else if (strmatchN(pp2,"TX(",3)) break; // invalid, no text end found else if (*pp2 == '"' && *(pp2+1) == ')') { // found: ") text end cc = pp2 - pp1; pp1[cc] = 0; fprintf(fid2,"%s\n",pp1); // output rest of text + \n pp = pp2 + 2; pp1 = strstr(pp,"TX(\""); // continue scan of same line if (pp1) goto startscan; // found TX(" break; // EOL } else if (*pp2 == '"') { // found: " continuation line follows *pp2 = 0; fprintf(fid2,"%s",pp1); // output text pp = fgets(buff500,500,fid3); // read next line if (! pp) break; while (*pp == ' ') pp++; // skip leading blanks if (*pp != '"') break; // must start with " pp1 = pp2 = pp + 1; // continue scan } else pp2++; } } } if (! Tnum) { zmessageACK(Mwin,"no translatable texts found"); goto cleanup1; } // sort text strings in gui_en and eliminate duplicates zlist1 = zlist_from_file(gui_en); // load zlist1 from file gui_en if (! zlist1) { // gui_en file missing zmessageACK(Mwin,"%s file is missing",gui_en); goto cleanup1; } nn = zlist_count(zlist1); if (! nn) { // gui_en file empty zmessageACK(Mwin,"%s file is empty",gui_en); goto cleanup1; } if (nn > 1) zlist_sort(zlist1); // sort zlist alphabetically for (ii = 1, jj = 0; ii < nn; ii++) { // scan from text[1] to end strncpy0(text999,zlist_get(zlist1,ii),999); if (strmatch(text999,zlist_get(zlist1,jj))) continue; // skip duplicate zlist_put(zlist1,text999,++jj); // output non-duplicate } ndups = nn - jj - 1; // duplicates removed nuniq = jj + 1; // remaining = new count zmessageACK(Mwin,"translatable texts found: %d \n" "duplicates removed: %d \n" "unique translatable texts: %d",Tnum,ndups,nuniq); // output gui_en file, with sequence numbers fid = fopen(gui_en,"w"); if (! fid) { // cannot write file zmessageACK(Mwin,"cannot open %s output file",gui_en); goto cleanup1; } for (ii = 0; ii < nuniq; ii++) { fprintf(fid,"%04d ",ii); // 4 digit sequence number + blank fprintf(fid,"%s\n",zlist_get(zlist1,ii)); // + text string } fclose(fid); cleanup1: if (zlist1) zlist_free(zlist1); return; } /**************************************************************************************/ // Slice gui_en into pieces suitable for AI translation. // output: gui_en_01, gui_en_02 ... void m_slice_GUI(GtkWidget *, ch *) // 26.5 { ch infile[200]; // gui_en input file ch outfile[200]; ch record[guixcc]; // max. record size ch *pp; FILE *fid1, *fid2; int ss, ccout, nn; snprintf(infile,200,"%s/gui_en",translations_folder); // input file gui_en fid1 = fopen(infile,"r"); // open intput file if (! fid1) { printf("*** gui_en_new file not found: %s \n",infile); return; } ss = 0; while (true) { ss++; // next sequence number snprintf(outfile,200,"/home/mico/Desktop/gui_en_%02d",ss); // next outfile .../gui_en_NN fid2 = fopen(outfile,"w"); // open next outfile if (! fid2) goto filerror; ccout = 0; // output cc while (true) { pp = fgets(record,guixcc,fid1); // get next input record if (! pp) break; // input file EOF nn = fputs(record,fid2); // add to output file if (nn < 0) goto filerror; ccout += strlen(record); // accumulate output cc if (ccout > 1000 * KBlimit) break; // limit reached } fclose(fid2); // close output file if (! pp) break; // input EOF } fclose(fid1); // close input file return; filerror: printf("*** output file error %s: %s \n",strerror(errno),outfile); fclose(fid1); return; } /************************************************************************************** GUI Translation Process Files gui_en_nn are translated one by one to produce gui_xx_nn for language code xx. gui_xx_nn retains sequence numbers from gui_en_nn, so that the translated texts can be matched to the english texts. All imbedded format codes must be retained, and in the same sequence. After translation, combine the translated pieces: gui_xx_01, gui_xx_02 ... --> gui_xx The lines and sequence numbers of gui_xx should match those of gui_en. ***************************************************************************************/ // Combine the files gui_en and gui_xx to make a translation table containing // both the english and translated texts. The output file is gui_en_xx. // gui_en_xx contains pairs of text lines with matching sequence numbers. // 0001 english text containing imbedded format codes // 0001 translated text with same format codes in same sequence // 0002 next pair of text records, english and translation // 0002 ... etc. void m_transtab_GUI(GtkWidget *, ch *) { ch gui_en[200], gui_xx[200]; ch xx[4]; // xx is 2-char. language code ch *pp; zlist_t *zlist_en = 0, *zlist_xx = 0, *zlist_en_xx = 0; int nn, ii, id1, id2; pp = zdialog_text1(Mwin,"language code","en",4); // get 2-char. language code xx if (! pp || strlen(pp) != 2) { zmessageACK(Mwin,"invalid 2-char. language code"); return; } strncpy0(xx,pp,3); // 2 chars. + null snprintf(gui_en,200,"%s/gui_en",translations_folder); // gui_en input snprintf(gui_xx,200,"%s/gui_%s",translations_folder,xx); // gui_xx input and output zlist_en = zlist_from_file(gui_en); // english texts if (! zlist_en) { zmessageACK(Mwin,"cannot find file %s - nothing done",gui_en); goto cleanup; } zlist_xx = zlist_from_file(gui_xx); // translation texts if (! zlist_xx) { zmessageACK(Mwin,"cannot find file %s - nothing done",gui_xx); goto cleanup; } nn = zlist_count(zlist_en); if (! nn) { zmessageACK(Mwin,"english line count is zero"); goto cleanup; } if (nn != zlist_count(zlist_xx)) { // line counts must match zmessageACK(Mwin,"english and translation counts mismatch"); goto cleanup; } zlist_en_xx = zlist_new(nn*2); // en+xx output, 2x line count for (ii = 0; ii < nn; ii++) // scan both inputs in parallel { id1 = atoi(zlist_get(zlist_en,ii)); // sequence numbers must match id2 = atoi(zlist_get(zlist_xx,ii)); if (id1 != id2) { zmessageACK(Mwin,"sequence number mismatch: %d %d",id1,id2); goto cleanup; } zlist_put(zlist_en_xx,zlist_get(zlist_en,ii),ii*2); // english + translation texts zlist_put(zlist_en_xx,zlist_get(zlist_xx,ii),ii*2+1); // --> output zlist } zlist_to_file(zlist_en_xx,gui_xx); // output file gui_xx zmessageACK(Mwin,"completed"); cleanup: if (zlist_en) zlist_free(zlist_en); if (zlist_xx) zlist_free(zlist_xx); if (zlist_en_xx) zlist_free(zlist_en_xx); return; } /************************************************************************************** Audit a translation file gui_xx to insure English and translation texts have matching embedded format codes. "%x" occurences must match in number and sequence. "% " may translate to "%%", which must be fixed manually. Missmatch in "\n" is allowed - AI may change line breaks. // 26.8 *****/ void m_audit_GUI(GtkWidget *, ch *) { ch gui_xx[200]; // input file ch xx[4]; ch *pp, *pp1, *pp2, *pp3, *pp4; zlist_t *zlist_xx; int ii, Ferr; ch text_en[guixcc], text_xx[guixcc]; // max. GUI text cc pp = zdialog_text1(Mwin,"language code","en",4); // get 2-char. language code xx if (! pp || strlen(pp) != 2) { zmessageACK(Mwin,"invalid 2-char. language code"); return; } strncpy0(xx,pp,3); // 2 chars. + null snprintf(gui_xx,200,"%s/gui_%s",translations_folder,xx); // translation file gui_xx zlist_xx = zlist_from_file(gui_xx); if (! zlist_xx) { zmessageACK(Mwin,"translation file not found: %s",gui_xx); return; } Ferr = 0; for (ii = 0; ii < zlist_count(zlist_xx)-1; ii += 2) // loop pairs of text { pp1 = zlist_get(zlist_xx,ii); // text pair, english and translation pp2 = zlist_get(zlist_xx,ii+1); strncpy0(text_en,pp1,guixcc); strncpy0(text_xx,pp2,guixcc); if (! strmatchN(pp1,pp2,5)) { // check ID numbers match zmessageACK(Mwin,"ID number missmatch, line: %d",ii); break; } pp3 = pp1; // english text line pp4 = pp2; // corresp. translation while (true) // scan one en and xx line pair { while (true) { while (*pp3 && *pp3 != '%') pp3++; // next '%' character if (*pp3 == '%' && !strchr("sd.f",pp3[1])) { // if not printf format, ignore pp3++; continue; } break; } while (true) { // same for xx line 26.8 while (*pp4 && *pp4 != '%') pp4++; if (*pp4 == '%' && !strchr("sd.f",pp4[1])) { pp4++; continue; } break; } if (! *pp3 && ! *pp4) break; // lines done if (pp3[1] == pp4[1]) { // check characters after '%' pp3++; pp4++; // formats match, continue scan continue; } zmessageACK(Mwin,"printf format missmatch: \n %s \n %s",text_en,text_xx); Ferr++; break; } if (Ferr > 5) break; } if (! Ferr) zmessageACK(Mwin,"%d lines audited, no errors found",ii); zlist_free(zlist_xx); return; } /**************************************************************************************/ // Slice ug_en into pieces for AI translation, each piece ending on a blank line. // Blank lines are represeted by "-\n". // Output: ug_en_01, ug_en_02 ... void m_slice_UG(GtkWidget *, ch *) // 26.5 { ch ugfile[200]; // english ug_en input file ch outfile[200]; ch record[ugxcc]; // max UG record size ch *pp; FILE *fid1, *fid2; int ss, ccout, nn; snprintf(ugfile,200,"%s/ug_en",translations_folder); // input file ug_en fid1 = fopen(ugfile,"r"); // open intput file if (! fid1) { printf("*** userguide file not found: %s \n",ugfile); return; } ss = 0; while (true) { ss++; // next sequence number snprintf(outfile,200,"/home/mico/Desktop/ug_en_%02d",ss); // next outfile .../ug_en_NN fid2 = fopen(outfile,"w"); // open next outfile if (! fid2) goto filerror; ccout = 0; // output cc while (true) { pp = fgets(record,ugxcc,fid1); // get next input record if (! pp) break; // input file EOF nn = fputs(record,fid2); // add to output file if (nn < 0) goto filerror; ccout += strlen(record); // accumulate output cc if (*record == '-' && ccout > 1000 * KBlimit) break; // blank line and limit reached } fclose(fid2); // close output file if (! pp) break; // input EOF } fclose(fid1); // close input file return; filerror: printf("*** output file error %s: %s \n",strerror(errno),outfile); fclose(fid1); return; } /************************************************************************************** UG Translation Process Files ug_en_nn are translated to produce ug_xx_nn for language xx. After translation, combine the translated pieces: ug_xx_01, ug_xx_02 ... --> ug_xx *************************************************************************************** Synchronize userguide translations with GUI translations. 1. read ug_en and ug_xx in parallel 2. match pairs of TOPIC: xxxxx, {xxxxx}, and [xxxxx] 3. for each xxxxx in ug_xx, get matching english eeeee from ug_en, translate via TX(eeeee), replace xxxxx Input files: /translations/ug_en and ug_xx Output file: /translations/ug_xx_new When done, delete ug_xx and rename ug_xx_new --> ug_xx ***/ void m_sync_UG(GtkWidget *, ch *) // 26.5 { ch ug_en[200], ug_xx[200], ug_xx_new[200]; ch buff1[ugxcc], buff2[ugxcc], buff3[ugxcc], buff4[ugxcc]; ch text1[ugtpxcc], text2[ugtpxcc], text3[ugtpxcc]; FILE *fid1 = 0, *fid2 = 0, *fid3 = 0; ch *pp1, *pp1e, *pp2, *pp2e; int cc, yn, record; printf("Sync User Guide Translations \n"); printf("userguide file: %s \n",UG_file); yn = zmessageYN(Mwin,"proceed with language: %s \n",lc); if (! yn) return; snprintf(ug_en,200,"%s/ug_en",translations_folder); // /.../ug_en input 1 snprintf(ug_xx,200,"%s/ug_%s",translations_folder,lc); // /.../ug_xx input 2 snprintf(ug_xx_new,200,"%s/ug_%s_new",translations_folder,lc); // /.../ug_xx_new output fid1 = fopen(ug_en,"r"); // open ug_en for read if (! fid1) { zmessageACK(Mwin,"cannot open file: %s \n",ug_en); goto closeall; } fid2 = fopen(ug_xx,"r"); // open ug_xx for read if (! fid2) { zmessageACK(Mwin,"cannot open file: %s \n",ug_xx); goto closeall; } fid3 = fopen(ug_xx_new,"w"); // open ug_xx_new for write if (! fid3) { zmessageACK(Mwin,"cannot open file: %s \n",ug_xx_new); goto closeall; } for (record = 1; ; record++) { pp1 = fgets(buff1,ugxcc,fid1); // get next ug_en record pp2 = fgets(buff2,ugxcc,fid2); // get next ug_xx record if (! pp1 && ! pp2) goto complete; // both EOF, OK if (! pp1 || ! pp2) goto missmatch; // one EOF, bad pp1 = strstr(buff1,"TOPIC:"); // scan both records for "TOPIC:" pp2 = strstr(buff2,"TOPIC:"); if ((pp1 && ! pp2) || (! pp1 && pp2)) goto missmatch; if (pp1 && pp2) { // "TOPIC:" found in both records pp1 += 6; while (*pp1 == ' ') pp1++; strncpy0(text1,pp1,ugtpxcc); // english text cc = strlen(text1); while (text1[cc-1] <= ' ') cc--; // remove trailing blanks and \n if (cc < 1) goto missmatch; text1[cc] = 0; snprintf(text2,ugtpxcc,"TOPIC: %s",TX(text1)); // translation or input text if missing fputs(text2,fid3); // output TOPIC: translation fputs("\n",fid3); continue; // do not scan rest of record } strcpy(buff3,buff2); // initial ug_xx-new output record pp1 = buff1; // ug_en input record pp2 = buff2; // ug_xx input record while (true) // scan both inputs for {xxxxxx} { pp1 = strchr(pp1,'{'); // find next {english} in en record pp2 = strchr(pp2,'{'); // find next {xxxxxx} in xx record if ((pp1 && ! pp2) || (! pp1 && pp2)) goto missmatch; if (! pp1 && ! pp2) break; // not found, this record done pp1e = strchr(pp1,'}'); // {english} in en record pp2e = strchr(pp2,'}'); // {xxxxxx} in xx record cc = pp1e - pp1; if (cc < 2 || cc > ugxcc-3) goto missmatch; strncpy0(text1,pp1+1,cc); // translate {english} snprintf(text3,ugtpxcc,"{%s}",TX(text1)); // text3 = {translation} = new text cc = pp2e - pp2; if (cc < 2 || cc > ugxcc-3) goto missmatch; strncpy0(text2,pp2,cc+2); // text2 = {xxxxxx} = old text repl_1str(buff3,buff4,ugxcc,text2,text3); // replace {xxxxxx} with {translation} strncpy0(buff3,buff4,ugxcc); // update output record pp1 = pp1e; // skip over {english} pp2 = pp2e; // skip over {xxxxxx} } pp1 = buff1; // ug_en input record pp2 = buff2; // ug_xx input record while (true) // scan both inputs for [xxxxxx] { pp1 = strchr(pp1,'['); // find next [english] in en record pp2 = strchr(pp2,'['); // find next [xxxxxx] in xx record if ((pp1 && ! pp2) || (! pp1 && pp2)) goto missmatch; if (! pp1 && ! pp2) break; // not found, this record done pp1e = strchr(pp1,']'); // [english] in en record pp2e = strchr(pp2,']'); // [xxxxxx] in xx record cc = pp1e - pp1; if (cc < 2 || cc > ugxcc-3) goto missmatch; strncpy0(text1,pp1+1,cc); // translate [english] snprintf(text3,ugtpxcc,"[%s]",TX(text1)); // text3 = [translation] = new text cc = pp2e - pp2; if (cc < 2 || cc > ugxcc-3) goto missmatch; strncpy0(text2,pp2,cc+2); // text2 = [xxxxxx] = old text repl_1str(buff3,buff4,ugxcc,text2,text3); // replace [xxxxxx] with [translation] strncpy0(buff3,buff4,ugxcc); // update output record pp1 = pp1e; // skip over [english] pp2 = pp2e; // skip over [xxxxxx] } fputs(buff3,fid3); // write output record } complete: zmessageACK(Mwin,"file %s created \n rename to: %s \n",ug_xx_new,ug_xx); goto closeall; missmatch: strncpy0(buff3,buff1,100); // limit to 100 chars. utf8substring(buff4,buff2,0,100); // limit to 100 utf8 chars. zmessageACK(Mwin,"missmatch: line %d \n en: %s \n xx: %s \n",record,buff3,buff4); closeall: if (fid1) fclose(fid1); if (fid2) fclose(fid2); if (fid3) fclose(fid3); return; } /**************************************************************************************/ // Check that all F1 help topics are present in the user guide, // and that all internal links in the userguide are valid. // inputs: source files *.cc, gui_xx, ug_xx void m_audit_UG(GtkWidget *, ch *) // 26.4 { cch *file; ch buff[200]; ch topicname[100]; ch *sourcetopics[500], *ugtopics[500]; ch *pp, *pp1, *pp2; int Ntopics, Nugtopics, maxtopics = 500; int cc, nn, ii, jj; FILE *fid1, *fid2; ch topix[14] = "F1_help_topix"; topix[12] = 'c'; // stop false text match 26.5 printf("Audit User Guide \n"); pp = strrchr(sourcefolder,'/'); // fotocx source folder strcpy(pp+1,Frelease); // get my release NN.N snprintf(command,200,"find %s/*.cc",sourcefolder); fid1 = popen(command,"r"); if (! fid1) { printf("invalid source folder \n"); return; } nn = 0; while (true) // find all source files *.cc { file = fgets_trim(buff,200,fid1); if (! file) break; printf("source file: %s \n",file); fid2 = fopen(file,"r"); // open source file if (! fid2) { printf("*** file error %s \n",strerror(errno)); continue; } while (true) { pp = fgets_trim(buff,200,fid2); // read source file records if (! pp) break; pp = strstr(pp,topix); // search for "F1_help_topic" 26.5 if (! pp) continue; pp1 = strchr(pp+15,'"'); // get following topic name if (! pp1) continue; pp2 = strchr(pp1+3,'"'); if (! pp2) continue; cc = pp2 - pp1; if (cc < 2 || cc > 99) continue; strncpy0(topicname,pp1+1,cc); for (int ii = 0; ii < cc; ii++) // force uppercase topicname[ii] = toupper(topicname[ii]); pp = TX(topicname); // get translation if (! pp) continue; sourcetopics[nn] = zstrdup(pp,"audit_UG"); // save all translated topics nn++; if (nn == maxtopics) { printf("*** max %d source topics exceeded \n",maxtopics); return; } } fclose(fid2); } pclose(fid1); Ntopics = nn; printf("source file topics: %d \n",Ntopics); printf("userguide file: %s \n",UG_file); // file: ug_xx fid2 = fopen(UG_file,"r"); if (! fid2) { printf("*** userguide file error %s \n",strerror(errno)); return; } nn = 0; while (true) { pp = fgets_trim(buff,200,fid2); // read userguide file records if (! pp) break; pp = strstr(buff,"TOPIC:"); // find TOPIC: XXXXXXX record if (! pp) continue; pp += 6; while (*pp && *pp == ' ') pp++; cc = strlen(pp); while (cc && pp[cc-1] == ' ') cc--; // prevent trailing blanks if (cc == 0) continue; pp[cc] = 0; ugtopics[nn] = zstrdup(pp,"audit_UG"); // save all UG topics nn++; if (nn == maxtopics) { printf("*** max %d userguide topics exceeded \n",maxtopics); return; } } fclose(fid2); Nugtopics = nn; printf("userguide topics: %d \n",Nugtopics); for (ii = 0; ii < Ntopics; ii++) // find source file topics { // in userguide topics for (jj = 0; jj < Nugtopics; jj++) if (strmatch(sourcetopics[ii],ugtopics[jj])) break; if (jj == Nugtopics) printf("*** source topic %s not found in userguide topics \n",sourcetopics[ii]); } for (ii = 0; ii < Ntopics; ii++) // free memory zfree(sourcetopics[ii]); for (ii = 0; ii < Nugtopics; ii++) zfree(ugtopics[ii]); show_help("validate"); // audit userguide internal links return; } /************************************************************************************** TRANSLATE RESUME continue translation text scan from here see m_capture_GUI() above *************************************************************************************** UG_extra_topics These are userguide topics not present in the source programs. This gets them added to the english translation file: gui_en m_sync_UG() will find and translate them in the userguide. TX("ALBUMS MENU") TX("AREA OVERVIEW") TX("AUTOSEARCH") TX("BATCH MENU") TX("BATCH PROCESSING") TX("BATCH SCRIPT") TX("COMBINE MENU") TX("CURVE EDITING") TX("DIALOG BUTTONS") TX("DRAG AND DROP") TX("EDIT ALBUM") TX("EDIT BOOKMARKS") TX("EDIT MENU") TX("EDIT PROCEDURES") TX("EDIT SCRIPT") TX("EDIT WORKFLOW") TX("EFFECTS MENU") TX("FILE MENU") TX("FILE VIEW") TX("FIRST STARTUP") TX("FOTOCX FOR WINDOWS 11") TX("FOTOCX LIMITATIONS") TX("FOTOCX USAGE") TX("GALLERY END") TX("GALLERY HOME") TX("GALLERY MENU") TX("GALLERY OVERVIEW") TX("GALLERY VIEW") TX("KEYBOARD ESCAPE KEY") TX("KEYWORDS OVERVIEW") TX("MAP MENU") TX("MAP VIEW") TX("MENU SHORTCUTS") TX("METADATA MENU") TX("MOUSE ALT-RIGHT-BUTTON") TX("MOUSE FUNCTIONS") TX("MOUSE OWNERSHIP") TX("NEWLINE CHARACTERS IN METADATA") TX("NON-STANDARD DIALOG WIDGETS") TX("OTHER TOPICS") TX("PROBLEM FILES") TX("PROBLEM REPORTING") TX("QUESTIONS, SUGGESTIONS") TX("REFINE MENU") TX("REPAIR MENU") TX("RUN SCRIPT") TX("SELECT FILES") TX("SELECT IMAGE FILES") TX("SELECT MENU") TX("SHORTCUTS") TX("SLIDES AND NEGATIVES") TX("TOOLS MENU") TX("TRANSLATIONS") TX("USER GUIDE") TX("VIEW ALL META") TX("WARP IMAGE") TX("WARP MENU") TX("WINDOW VIEWS AND MENUS") TX("WORLD MAP") ***************************************************************************************/ fotocx/doc/0000775000175000017500000000000015247006660011575 5ustar micomicofotocx/doc/changelog0000664000175000017500000003532415247006660013456 0ustar micomicofotocx-26.8 2026.09.06 ----------- • Repair > Denoise: new capability to restrict processing to darker image areas. • Tools > Find Bad Files: New. Find all unreadable image files and offer options to clean them up: delete, move out of scope, fix wrong file type [extension]. • Edit > Show Diffs: New. Highlight image changes during an edit, or select any two images to compare and highlight the differences. Makes local edits obvious. • Warp > Warp Linear1 and Warp Linear2: New. Correct scale distortion when an object is photographed from below or from the side, causing more distant areas to have a smaller scale than nearby areas. • TIFF files: compress with the recommended method for color images: Deflate. • Command line parameters were simplified (see user guide: command parameters). • Help > uninstall: improved usability: show shell command to copy and paste. • A few GUI texts overlooked for translations are now translated. • New translations added: Polish, Finnish, Hungarian. Others were refreshed. • Bugfix: gallery sort based on searched metadata was not sorting correctly. • Bugfix: possible crash if escape key used to kill slide show during image zoom. • Bugfix: image "Show on Map" sometimes fails to show map marker. fotocx-26.7 2026.08.01 ----------- • The world map is now sourced from OpenFreeMap. Libchamplain is no longer used. This enables packaging for Linux distros that have removed libchamplain. C-language interface for OpenFreeMap was generated via Claude-AI [Anthropic]. Mapping functions include: + world map scalable from street to continent level, zoom and pan with mouse + map markers denote positions of image files having geocoordinates + click on map marker produces thumbnail gallery of images at the location + location names and geocoordinates can be added to images via map clicking • Display of GIF file animations was removed. The underlying GTK function was deprecated by Gnome and will presumably disappear soon (like libchamplain). • Refreshed translations: German Greek Spanish French Italian Japanese Korean Portuguese Russian Turkish Chinese. Translations were made via Claude-AI. fotocx-26.6 2026.06.18 ----------- • Seven AI translations of the GUI and User Guide were added: Greek, Finnish, Hungarian, Japanese, Russian, Romanian, Turkish • Appimage package was added, with a shell script for desktop integration. • Edit > Rescale does not work in a script unless all input image files have the same dimensions. This is now blocked from use in a script. Batch Convert can be used to resize diverse images to fit within given width/height limits. fotocx-26.5 2026.06.03 ----------- • GUI and user guide translations are complete for the following languages: German, French, Italian, Spanish, Portuguese, Polish, Chinese. Other languages will be added over time. These are AI translations. • Several edit functions have received minor improvements in the user interface. • Metadata > Timeline: new report option: report using files in the current gallery. • Edit > Paint Edits and Warp > Perspective can have keyboard shortcuts assigned. • The file blacklist feature was removed for performance reasons (large list slows indexing and gallery display). Move problem files out from under your declared top image folders, or fix using edit + save/replace, or Metadata > Fix Meta. • Minor improvements and bug fixes: • File count on folder thumbnail: hidden files were included when not wanted. • Select Area > Find Gap: nested useage caused the dialog to freeze. • Refine > Flatten Histogram: fix inconsistent handling of radius parameter. fotocx-26.4 2026.05.01 ----------- • The binary package now contains libchamplain, making it usable on recent Linux releases that have removed libchamplain (AKA pulling the rug out). • Combine > Image Array: Retry if invalid output file name or other error. • When an image file edited and replaced, update only albums referencing the file. • Warp Linear was removed. Warp Curved is more flexible and works better. • Tools > Settings: new setting to show | not show hidden files and folders. • Several minor bug fixes and improvements made: Combine > Image Array: create a new thumbnail if a new file is created. File > Rename: add renamed file to recent files list. Playing GIF animation was not working for some tiny .gif files. Playing video files did not work on some older Linux releases. Open image file from command line: failed if current directory not $HOME. Refine > Flatten Histogram: finer control at low end of slider scale. fotocx-26.3 2026.03.22 ----------- • The user guide was AI-translated into German. F1 Help and internal links work. Very usable, but many translations need improvement. • Set Wallpaper: generalized to work for most desktops: GNOME KDE XFCE MATE LXDE. The periodic wallpaper flipper was also updated. • Maps: When an image location is set by clicking on the world map, add a new map marker immediately, using a temporary new color. • Image edit: popup message and remain open if image is too large to edit. • Temp folder: moved from /tmp/fotocx (memory mapped) to $HOME/.fotocx/temp. This avoids swap thrashing and long execution times if a huge image is edited multiple times, creating a even greater undo/redo stack in mapped memory. • Metadata > Fix Meta: allow input of any file, default to current file. • Bugfix: set menu-bar width as needed to accomodate a large font-size setting. • Bugfix: Image Array: failed if output file type was not jpeg. fotocx-26.2 2026.01.22 ----------- • Tools > Move Fotocx Home: a simple method to move the Fotocx home folder. This replaces the prior complicated method described in the user guide. • The user guide has a new topic: installing Fotocx on Windows 11. This has become more viable with improvements in Microsoft Windows Subsystem for Linux. • Adjust HSL has been restored. It had been removed in 26.0. • Bugfix: crash if the image index or geolocations table contains zero entries. fotocx-26.1 2026.01.08 ----------- • Bugfix: images with valid geocoordinates but no location name did not show up when the cooresponding map marker was clicked. • Bugfix: locales using a comma decimal point had multiple failures. fotocx-26.0 2026.01.05 ----------- • Fotocx GUI translations have been added for 18 languages. An AI translator was used for this, so there are likely many errors. Users can correct errors and add new translations (kindly send corrections for inclusion in the next release). See the user guide topic "translations" for details. Languages included: German, Danish, Spanish, Finnish, French, Greek, Hungarian, Italian, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Swedish, Turkish, Chinese, Japanese. • Metadata terminology in the user interface and user guide was updated to be more in agreement with [somewhat] standard naming and common usage. • libjxl is now used to load/save JXL files instead of the cjxl/djxl utilities. This is faster, and alpha channels are also supported. • Metadata Tags: New report: Choose a metadata tag, list all values present in the image collection, click on a value to get a gallery of matching images. • Places/Dates report: more options were added for country/location/date groupings. • Batch Rename Keywords: delete option was added in addition to rename. • Batch Purge Keywords: New. Purge unwanted keywords from all image files. (handy tool to clean keyword pollution from downloaded image files) • Denoise: slight improvement in noise suppression and preservation of detail. • Flatten Histogram: five brightness zones can be adjusted separately or together. • Local Contrast: improved brightness compensation and faster response time. • Keyboard Shortcuts: Some reserved shortcuts were changed to custom shortcuts to allow more flexibility for user changes. Some default shortcuts were changed to conform to [somewhat] common practice, and these can also be customized. • Copy/Move: if 'use previous file name' is chosen for the output file, the current file version is used with the previous file name. This is more likely to be what the user intends, and can be overridden if not. • Markup: draw text/arrow/box/oval: allow bailout if [X] pressed with unsaved mods. • Add Glare: New: Add glare radiating outward from the brightest spots in an image. • Sketch2: New: Alternative sketch algorithm + variable blending with input image. • Crosshatch: New: Convert image to sketch, using lines crossing at ±45 degrees. • Bugfix: RAW file loaders: The option to match image colors to the embedded preview image in the RAW file was not working as advertised. • Bugfix: possible crash following image horizontal or vertical flip. • Bugfix: Metadata timeline report using latest search results was not working. fotocx-25.5 2025.11.18 • Bugfix: Crash on workstations having >40 CPU cores. fotocx-25.4 2025.10.25 • Source code modifications needed for ARM64 build (Raspberry PI etc.). fotocx-25.3 2025.08.01 • Bugfix: Search for multiple location names did not always work. • Bugfix: Default raw loader command (prior release leftover) did not work. • Bugfix: Edit Main Meta: failed to update active metadata view report. fotocx-25.2 2025.07.10 • Bugfix: TOP image folder access failed if it was a symlink to the real folder. • Bugfix: fotocx custom spin buttons did not work well with new mouse types having a "smooth scroll" wheel (fractional steps). This is now detected and compensated. • Detect cpu processor/core count and use this to set max SMP parallel threads. • Metadata search for non-indexed metadata: do not exceed max SMP threads, which can make the kernel scheduler go nuts (mouse stick/slip, stalled GUI response). fotocx-25.1 2025.07.01 ----------- • This release requires a full re-index of your image collection. Some config files in $HOME/.fotocx have been replaced due to format changes. The old versions are retained for reference, if needed. Because of the next point listed immediately below, index time may be much longer (for this time only). • Metadata tag chaos for title and description is compensated: If missing, but alternatives are found (e.g. headline, event, subject, caption, comment ...), these will replace the missing tags. You can now view/edit/search reliably using only 'title' and 'description'. Nothing is erased. • The function 'Batch Move Meta' is now unnecessary and was removed. • The following metadata was added to the image index and can be searched instantly: camera make, model, lens, exposure, F-length, F-ratio, ISO. If you added any of these to the 'extra' indexed metadata, remove them. • Batch Convert: now multi-threaded for increased speed. Batch RAW is now included in Batch Convert. RAW files can be converted to TIFF-16 at a rate exceeding 100 files/min. on a strong computer with SSD disk. • Batch Convert: Albums can now be updated to reference the converted files, if wanted. A rescale option was also added. • Search Images: more flexibility to include files related to those meeting the given search criteria: the original file and/or edited versions. • Albums is now a separate menu (common practice replaces former weirdness). • Edit > Split-Screen: New. While adjusting an edit, view before/after using a split-screen with sliding boundary. View finished versions the same way. • HDR and HDF are about 1.6x faster. Panorama is about 1.2x faster. • Help > Monitor Log File: New. The log file can be viewed real-time in a popup window - no need to start Fotocx from a terminal for this purpose. • Tools > Grid Settings: new popup list of recent settings, click to choose. • Metadata > title and description text limits were increased to 2K chars. • Repair > Normal Blur: optional independent horizontal/vertical blur. • Repair > Normal Blur and Graduated Blur were made scriptable. • Effects > Fusion: New. Suppress fine details while accentuating major image features. This arty function can produce some interesting results. • Metadata > Tags: New. List all tags [keywords] with count of images using each tag, click tag value to show the corresponding thumbnail gallery. • Custom > Scripts > Mosaic: New. Convert a picture into tiles congruent with image features. This is a script combining three fotocx functions. • Combine > Image Array: new option: copy metadata from selected input image. The capability to view original images by clicking on array members was removed. Albums provide a better method to basically do the same thing. • Copyright and license: some included files with restricted copyright were replaced. Now one file has a Creative Commons license, the rest have no copyright or are GPL3 compatible. • User Guide: many small improvements and corrections were made. • Bugfix: Settings > Font: did not handle complicated font names like "ubuntu sans condensed regular" (generic "sans" was substituted). • Bugfix: Image index function [seldom] hung dead (but retry worked OK). • Bugfix: Compensate JPEG-XL break of legacy metadata naming standards. • Bugfix: JPEG-XL image loader failed if first image pixel[0] (red value) matched a whitespace character (CR, LF, blank). (champion weird bug) fotocx-25.0 2025.01.01 ----------- • The Fotocx binary package is now based on Ubuntu 24.04 (was 22.04). • JPEG-XL files (.jxl) are now supported (new lossless JPEG format). This requires libjxl, which is not yet available in some Linux flavors. • Image hot corner: mouse in NW corner --> popup title and description. • Select > Area Edge Blend: made easier to use, functional improvement. • Tools > Settings: SMP count (parallel thread count) is user-specified. (use P-cores + E-cores, omitting hyperthreads - see the user guide). • Repair > Defog: User interface was made easier to use. • Slide Show: 3 complex animated transitions run smoother on a big monitor. • RAW loaders: 'darktable' was added to the default list of options. The options file was renamed 'raw_commands_I' (in /home//.fotocx). Any custom changes must be re-added. Search "RAW Loader" in user guide. • Bugfix: save to PNG file (very slow): prevent GTK "not responding" message. • Bugfix: User Guide: recent topics picklist was not complete and correct. • Bugfix: possible crash if gallery view is used during active edit function. • Bugfix: possible crash if the title bar [x] button is used to cancel an active edit after another dialog has overlaid the image window. fotocx/doc/copyright0000664000175000017500000000544015247006660013533 0ustar micomicoUpstream-Name: fotocx Upstream-Contact: Michael Cornelison Source: https://kornelix.net All files (- exceptions below) copyright: Copyright 2007-2026 Michael Cornelison All files (- exceptions below) license: GNU General Public License 3.0 or later https://www.gnu.org/licenses/gpl-3.0.en.html ================================================== Copyright and license exception: The worldcities.txt file was derived from the Basic World Cities Database https://simplemaps.com/data/world-cities. The data is provided and licensed by Pareto Software. The license for use is Creative Commons Attribution 4.0. https://creativecommons.org/licenses/by/4.0/ ================================================== Copyright and license exception: The functions for reading and writing JXL files were adapted from libjxl project source code: https://github.com/libjxl/libjxl/tree/main The libjxl project license and copyright is reproduced here: Copyright (c) the JPEG XL Project Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================== Fotocx project attributions: The files in data/patterns and data/palettes were copied from Gimp. slideshow-tone.oga was copied from freedesktop.org, service-login.oga. CIE1931.jpg was made from the international standard color chart CIE 1931. (https://en.wikipedia.org/wiki/CIE_1931_color_space) fotocx/zfuncs.h0000664000175000017500000016454215247006660012525 0ustar micomico/******************************************************************************** zfuncs.h include file for zfuncs functions Copyright 2007-2026 Michael Cornelison source code URL: https://kornelix.net contact: mkornelix@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See https://www.gnu.org/licenses This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. *********************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define VERTICAL GTK_ORIENTATION_VERTICAL // GTK shortcuts #define HORIZONTAL GTK_ORIENTATION_HORIZONTAL #define PIXBUF GdkPixbuf #define GDKCOLOR GdkColorspace #define int8 ch // number types #define int16 short #define int32 int #define int64 long long // long long is always 64 bits #define uint8 unsigned char #define uint16 unsigned short #define uint32 unsigned int #define uint64 unsigned long long #define ch char #define uch unsigned char #define cch const char #define VOL volatile #define STATB struct stat // stat() file status buffer #define mutex_t pthread_mutex_t // abbreviations #define mutex_init pthread_mutex_init #define mutex_lock pthread_mutex_lock #define mutex_trylock pthread_mutex_trylock #define mutex_unlock pthread_mutex_unlock #define mutex_destroy pthread_mutex_destroy #define XFCC 1000 // max. file pathname cc tolerated #define null NULL #define true 1 #define false 0 #define NOP // trace execution: source file, function, line no, caller address #define TRACE trace(__FILE__,__FUNCTION__,__LINE__,__builtin_return_address(0)); // system functions ============================================================ void *zmalloc(int64 cc, ch *tag); // malloc() wrapper void zfree(void *pp); // free() wrapper int zmalloc_test(int64 cc); // test if cc free memory available double realmemory(); // get available real memory in MB units double availmemory(); // get available memory (+swap) in MB units ch * zstrdup(ch *zstring, ch *tag, int addcc = 0); // strdup() wrapper with added space int zstrcopy(ch *&zstring, ch *string, ch *tag, int addcc = 0); // replace string with new string + added cc void zmalloc_report(GtkWidget *parent); // memory usage by tag > popup report void zmalloc_growth(GtkWidget *parent); // memory growth by tag > popup report void xmessage(ch *message); // popup message not needing GTK void zexit(int popup, ch *message, ...); // exit a process and kill child processes void zbacktrace(); // produce a backtrace to stdout void zappcrash(ch *format, ...); // crash with popup message in text window void catch_signals(); // catch signals and do backtrace dump void trace(ch *file, ch *func, int line, void *addr); // implements TRACE macro void tracedump(); // dump program trace data ch * combine_argvs(int argc, ch *argv[], int Nth); // combine argv[ii] elements Nth to last double get_seconds(int init = 0); // get elapsed seconds since last call void print_seconds(ch *label); // print seconds since last call double get_seconds(timespec *ts); // real seconds from timespec struct void start_timer(double &time0); // start a timer double get_timer(double &time0); // get elapsed time in seconds double CPUtime(); // get elapsed process CPU time int memused(); // get process real memory, MB void compact_time(time_t DT, ch *compactDT); // time_t DT to yyyymmddhhmmss void pretty_datetime(time_t DT, ch *prettyDT); // time_t DT to yyyy:mm:dd hh:mm:ss void secs_datetime(double secs, int datetime[6]); // seconds to year/mon/day/hour/min/secs void datetime_secs(int datetime[6], double *secs); // year/mon/day/hour/min/secs to seconds int parseprocfile(ch *pfile, ch *pname, double *value, ...); // get data from /proc file int parseprocrec(ch *prec, int field, double *value, ...); // get data from /proc file record int coretemp(); // get CPU temperature (package temp) int disktemp(ch *disk); // get disk temp, e.g. "/dev/sda" void zsleep(double dsecs); // sleep specified seconds void zloop(double dsecs); // loop specified seconds void spinlock(int lock); // lock/unlock enclosed code block int global_lock(ch *lockfile); // obtain exclusive lock, multi-process void global_unlock(int fd, ch *lockfile); // release the lock int resource_lock(int &resource); // simple lock/unlock usable with GTK void resource_unlock(int &resource); // (never waits, returns lock status) int zget_locked(int ¶m); // lock and get multi-thread parameter void zput_locked(int ¶m, int value); // put and unlock multi-thread parameter int zadd_locked(int ¶m, int incr); // increment multi-thread parameter pthread_t start_detached_thread(void * tfunc(void *), void * arg); // start detached thread function pthread_t start_Jthread(void * threadfunc(void *), void * arg); // start joinable thread function int wait_Jthread(pthread_t tid); // wait for completion (join thread) void synch_threads(int NT = 0); // synchronize NT threads int main_thread(); // return 1 if main() thread, else 0 int zshell(ch *options, ch *command, ...); // do shell command and get status int command_output(ch *command, ch *output, int cc); // do shell command ang get its output int kill_procname(ch *wildname); // kill processes matching wilcard name int signalProc(ch *pname, ch *signal); // send signal to process by process name ch * fgets_trim(ch * buff, int bcc, FILE *, int bf = 0); // fgets() + trim trailing \n \r (blanks) ch * fgets_pend(ch * buff, int bcc, FILE *); // fgets() non-blocking wrapper int samefolder(ch *file1, ch *file2); // returns 1 if files in same folder int parsefile(ch *path, ch *&folder, ch *&file, ch *&ext); // parse components of a file name void parsefile_free(ch *&folder, ch *&file, ch *&ext); // zfree file name components int renamez(ch *file1, ch *file2); // rename, also across file systems int check_create_dir(ch *path); // check if folder exists, ask to create int cp_copy(ch *sfile, ch *dfile); // same, using shell "cp -f -p" uint diskspace(ch *file); // get disk space for given file, MB ch * get_file_extension(ch *file); // get correct .ext if file.ext is wrong int zreaddir(ch *folder, ch **&files); // return all files in a folder, sorted int zreadfile(ch *filename, ch **&rrecs); // read file, return array of records int zwritefile(ch *filename, ch **&rrecs); // write array of records to file void zreadfile_free(ch **&rrecs); // free zreadfile() memory // string functions ============================================================ int strmatch(cch *str1, cch *str2); // true if strings equal, null strings OK int strmatchN(cch *str1, cch *str2, int cc); // true if leading N characters equal int strmatchcase(cch *str1, cch *str2); // true if strings equal except for case int strmatchcaseN(cch *str1, cch *str2, int cc); // true if leading N chars equal except case ch * substringR(ch *string, ch *delims, int Nth); // get Nth delimited substring, thread-safe ch * substringR(ch *string, ch delim, int Nth); // same, single delimiter ch * substring(ch *string, ch *delims, int Nth); // same, no zfree() needed, not thread-safe ch * substring(ch *string, ch delim, int Nth); // same, single delimiter int get_substrings(ch *instr, ch dlm, int cnt, int maxcc, ch **outstr); // get all substrings from delimited string int strHash(ch *string, uint max); // string --> random int 0 to max-1 int strncpy0(ch *dest, ch *source, uint cc); // strncpy, insure null, return 0 if fit void strnPad(ch *dest, ch *source, int cc); // strncpy with blank padding to cc int strTrim(ch *dest, ch *source); // remove trailing blanks int strTrim(ch *string); // remove trailing blanks int strTrim2(ch *dest, ch *source); // remove leading and trailing blanks int strTrim2(ch *string); // remove leading and trailing blanks int strCompress(ch *dest, ch *source); // remove all blanks incl. embedded int strCompress(ch *string); // remove all blanks int strncatv(ch *dest, int maxcc, ch *source, ...); // catenate strings (last = null) int strmatchV(ch *string, ...); // compare to N strings, return 1-N or 0 void strToUpper(ch *dest, ch *source); // move and conv. string to upper case void strToUpper(ch *string); // conv. string to upper case void strToLower(ch *dest, ch *source); // move and conv. string to lower case void strToLower(ch *string); // conv. string to lower case int repl_1str(ch *strin, ch *strout, int maxcc, ch *ssin, ch *ssout); // copy string and replace 1 substring int repl_Nstrs(ch *strin, ch *strout, int maxcc, ...); // copy string and replace N substrings int breakup_text(ch *in, ch **&out, ch *delims, int cc); // break long string into substrings void strncpyx(ch *out, ch *in, int ccin); // conv. string to hex format void StripZeros(ch *pNum); // 1.230000E+12 --> 1.23E+12 int blank_null(ch *string); // test for blank/null string int clean_escapes(ch *string); // replace \x escapes with real characters int utf8len(ch *utf8string); // get graphic cc for UTF8 string int utf8substring(ch *utf8out, ch *utf8in, int pos, int cc); // get graphic substring from UTF8 string int utf8_check(ch *string); // check utf8 string for encoding errors int utf8_clean(ch *string); // clean utf8 string: '?' > bad characters int utf8_position(ch *utf8in, int Nth); // get byte position of Nth graphic char. int zsed(ch *file, ...); // replace string1/3/5... with string2/4/6... ch * zstrstr(ch *haystack, ch *needle); // work like strstr() and strcasestr() ch * zstrcasestr(ch *haystack, ch *needle); // (but "" does NOT match any string) ch * zstrcpy(ch *dest, ch *source); // strcpy with overlap allowed ch * zstrncpy(ch *dest, ch *source, int cc); // strncpy with overlap allowed int zstrcmp(ch *s1, ch *s2); // like strcmp, but \n terminates like null int zstrcmp2(ch *s1, ch *s2); // strcmp using ch *args, not cch* int zstrcasecmp(ch *s1, ch *s2); // strcasecmp using ch *args, not cch* ch * zescape_quotes(ch *string); // escape quotes for use in shell commands // number conversion =========================================================== int convSI (ch *s, int &i, ch **delm = 0); // string to int int convSI (ch *s, int &i, int low, int hi, ch **delm = 0); // (with low/high limit checking) int convSD (ch *s, double &d, ch **delm = 0); // string to double int convSD (ch *s, double &d, double low, double hi, ch **delm = 0); // (with low/high limit checking) int convSF (ch *s, float &f, ch **delm = 0); // string to double int convSF (ch *s, float &f, float low, float hi, ch **delm = 0); // (with low/high limit checking) int convIS (int iin, ch *outp, int *cc = 0); // int to string, returned cc int convDS (double din, int prec, ch *outp, int *cc = 0); // double to string, precision, output cc double atofz(ch *string); // atof() for comma/period decimal points ch * formatKBMB(double fnum, int prec); // format nnn B, nn.n KB, n.nn MB, etc. float Fround(float Fin, int bits); // output = input truncated to 'bits' int znumber(ch *string); // true if regular number ±nn.nnn // wildcard functions ========================================================== int MatchWild(ch * wildstr, ch * str); // wildcard string match (match = 0) int MatchWildCase(ch * wildstr, ch * str); // wildcard string match, ignoring case ch * SearchWild(ch *wpath, int &flag); // wildcard file search ch * SearchWildCase(ch *wpath, int &flag); // wildcard file search, ignoring case int zfind(ch *pattern, ch **&flist, int &NF); // wildcard file search using glob() // search and sort functions =================================================== int bsearch(int seekint, int nn, int list[]); // binary search sorted list[nn] int bsearch(ch *seekrec, ch *allrecs, int recl, int nrecs); // binary search sorted records int bsearch(ch *seekrec, ch **allrecs, int N, int nrecs); // binary search sorted pointers to recs typedef int HeapSortUcomp(ch *rec1, ch *rec2); // return -1/0/+1 if rec1 rec2 // single-thread versions void heapsort(int vv[], int nn); // Heap Sort - integer void heapsort(float vv[], int nn); // Heap Sort - float void heapsort(double vv[], int nn); // Heap Sort - double void heapsort(ch *vv[], int nn, HeapSortUcomp); // Heap Sort - char *, user-defined order // 4-thread versions void HeapSort(int vv[], int nn); // Heap Sort - integer void HeapSort(float vv[], int nn); // Heap Sort - float void HeapSort(double vv[], int nn); // Heap Sort - double void HeapSort(ch *vv[], int nn); // Heap Sort - char *, ascending order void HeapSort(ch *vv1[], ch *vv2[], int nn); // Heap Sort - parallel char *, ascending void HeapSort(ch *vv[], int nn, HeapSortUcomp); // Heap Sort - char *, user-defined order void HeapSort(ch *recs, int RL, int NR, HeapSortUcomp); // Heap Sort - records, user-defined order int MemSort(ch * RECS, int RL, int NR, int KEYS[][3], int NK); // memory sort, records with multiple keys int zmember(int testval, int matchval1, ...); // test if value matches any in a list // hash table class ============================================================ class HashTab { static int tries1; // insert tries static int tries2; // find/delete tries int cap; // table capacity int count; // strings contained int cc; // string length ch *table = 0; // table[cc][cap] public: HashTab(int cc, int cap); // constructor ~HashTab(); // destructor int Add(ch * string); // add a new string int Del(ch * string); // delete a string int Find(ch * string); // find a string int GetCount() { return count; }; // get string count int GetNext(int & first, ch * string); // get first/next string int Dump(); // dump hash table }; // list processing functions =================================================== typedef struct { // list data type int count; // count of member strings ch **mber = 0; // member strings, null == missing } zlist_t; zlist_t * zlist_new(int count); // create zlist with 'count' empty members void zlist_free(zlist_t *zlist); // delete zlist, free memory void zlist_dump(zlist_t *zlist); // dump zlist to stdout int zlist_count(zlist_t *zlist); // get zlist member count ch * zlist_get(zlist_t *zlist, int Nth); // get a zlist member void zlist_put(zlist_t *zlist, ch *string, int Nth); // put a zlist member (replace existing) void zlist_insert(zlist_t *zlist, ch *string, int Nth); // insert Nth member, old Nth >> Nth+1 void zlist_remove(zlist_t *zlist, int Nth); // remove a zlist member (count -= 1) void zlist_clear(zlist_t *zlist, int Nth); // clear zlist from Nth member to end void zlist_purge(zlist_t *zlist); // purge zlist of all null members int zlist_add(zlist_t *zlist, ch *string, int Funiq); // add new member at first null or append int zlist_append(zlist_t *zlist, ch *string, int Funiq); // append new member at end (if unique) int zlist_prepend(zlist_t *zlist, ch *string, int Funiq); // prepend new member at posn 0 (if unique) int zlist_find(zlist_t *zlist, ch *string, int posn); // find next match from posn int zlist_findwild(zlist_t *zlist, ch *wstring, int posn); // find next wildcard match from posn zlist_t * zlist_copy(zlist_t *zlist1); // copy a zlist zlist_t * zlist_insert_zlist(zlist_t *zlist1, zlist_t *zlist2, int Nth); // insert zlist2 into zlist1 at posn Nth zlist_t * zlist_remove(zlist_t *zlist1, zlist_t *zlist2); // remove all members of zlist2 from zlist1 void zlist_sort(zlist_t *zlist); // sort zlist ascending void zlist_sort(zlist_t *zlist, int ccfunc(ch *, ch *)); // sort zlist via caller compare function int zlist_to_file(zlist_t *zlist, ch *filename); // make file from zlist zlist_t * zlist_from_file(ch *filename); // make zlist from file zlist_t * zlist_from_folder(ch *foldername); // make zlist from files in a folder // random number functions ===================================================== int lrandz(int64 * seed); // returns 0 to 0x7fffffff int lrandz(); // built-in seed double drandz(int64 * seed); // returns 0.0 to 0.99999... double drandz(); // built-in seed // spline curve-fitting functions ============================================== void spline1(int nn, float *dx, float *dy); // define a curve using nn data points float spline2(float x); // return y-value for given x-value // FIFO queue for text strings, single or dual-thread access =================== typedef struct { int qcap; // queue capacity int qnewest; // newest entry position, circular int qoldest; // oldest entry position, circular int qdone; // flag, last entry added to queue ch **qtext; // up to qcap text strings } Qtext; void Qtext_open(Qtext *qtext, int cap); // initialize Qtext queue, empty void Qtext_put(Qtext *qtext, ch *format, ...); // add text string to Qtext queue ch * Qtext_get(Qtext *qtext); // remove text string from Qtext queue void Qtext_close(Qtext *qtext); // close Qtext, zfree() leftover strings // compute variance for a list of numbers (std. deviation = sqrtf(variance)) float variance(float *vals, int N); // application initialization and administration =============================== int zinitapp(ch *appvers, int argc, ch *argv[]); // initialize app void zinitappfiles(int Fnewvers); // copy app data files to ~/.appname/* ch * get_zprefix(); // get /usr or /usr/local ... ch * get_zhomedir(); // get /home/user/.appname/ ch * get_zdatadir(); // get data folder ch * get_zdocdir(); // get document folder ch * get_zimagedir(); // get image folder void zabout(GtkWidget *parent); // popup app 'about' information void zsetfont(ch *newfont); // set new app font and size int widget_font_metrics(GtkWidget *widget, int &fww, int &fhh); // get widget font char width/height int get_zfilespec(ch *ftype, ch *fname, ch *filespec); // get installation data file void showz_logfile(GtkWidget *parent); // show log file in popup window void showz_textfile(ch *type, ch *file, GtkWidget *parent); // show text file [.gz] in popup window void showz_docfile(GtkWidget *, ch *docfile, ch *topic); // show docfile topic and assoc. image void audit_docfile(ch *docfile); // audit for missing topics and bad links // translation functions int TX_init(ch *lc, ch *folder); // initialize app for language lc ch * TX(ch *entext); // translate en text to language lc ch * XT(ch *lctext); // reverse translate lc to English 26.5 // GTK utility functions void zmainloop(int skip = 0); // do main loop, process menu events void zmainsleep(float secs); // do main loop and sleep designated time /********************************************************************************/ // cairo drawing region for GDK window typedef struct { GdkWindow *win; cairo_rectangle_int_t rect; cairo_region_t *reg; GdkDrawingContext *ctx; cairo_t *dcr = 0; } draw_context_t; cairo_t * draw_context_create(GdkWindow *gdkwin, draw_context_t &context); void draw_context_destroy(draw_context_t &context); /********************************************************************************/ // connect KB and mouse events to widget response function #define G_SIGNAL(widget,event,func,arg) \ g_signal_connect(G_OBJECT(widget),event,G_CALLBACK(func),(void *) arg) /********************************************************************************/ // txwidget functions - scrollable text widget for text reports and line editing // widget = zdialog_gtkwidget(zd,txwidget) where txwidget is a zdialog "text" widget type void txwidget_clear(GtkWidget *widget); // clear all text void txwidget_clear(GtkWidget *widget, int line); // clear text from line to end int txwidget_linecount(GtkWidget *widget); // get current line count void txwidget_append(GtkWidget *widget, int bold, ch *format, ...); // append line void txwidget_append2(GtkWidget *widget, int bold, ch *format, ...); // append line and scroll to end void txwidget_insert(GtkWidget *widget, int bold, int line, ch *format, ...); // insert line void txwidget_replace(GtkWidget *widget, int bold, int line, ch *format, ...); // replace line void txwidget_delete(GtkWidget *widget, int line); // delete line int txwidget_find(GtkWidget *widget, ch *matchtext, int line1, int hilite); // find matching line void txwidget_insert_pixbuf(GtkWidget *widget, int line, GdkPixbuf *pixbuf); // insert pixbuf image void txwidget_scroll(GtkWidget *widget, int line); // scroll line on screen void txwidget_scroll_top(GtkWidget *widget, int line); // scroll line to top of window void txwidget_get_visible_lines(GtkWidget *widget, int &top, int &bott); // get range of visible lines void txwidget_dump(GtkWidget *widget, ch *filename); // dump all text into a file void txwidget_save(GtkWidget *widget, GtkWindow *parent); // same, with save-as dialog ch * txwidget_line(GtkWidget *widget, int line, int strip); // retrieve line (strip \n) void txwidget_highlight_line(GtkWidget *widget, int line); // highlight line ch * txwidget_word(GtkWidget *, int line, int posn, ch *dlims, ch &end); // retrieve word void txwidget_highlight_word(GtkWidget *widget, int line, int posn, int cc); // highlight word void txwidget_bold_word(GtkWidget *widget, int line, int posn, int cc); // make word bold void txwidget_underline_word(GtkWidget *widget, int line, int posn, int cc); // make word underlined void txwidget_font_attributes(GtkWidget *widget); // set font attributes for all text typedef int txwidget_CBfunc_t(GtkWidget *, int line, int posn, ch *input); // widget event function to receive void txwidget_set_eventfunc(GtkWidget *, txwidget_CBfunc_t func); // mouse click and KB events /********************************************************************************/ // functions to simplify building menus, tool bars, status bars typedef void cbFunc(GtkWidget *, ch *mname); // menu or button response function GtkWidget * create_menubar(GtkWidget *vbox); // create menubar in packing box GtkWidget * add_menubar_item(GtkWidget *mbar, ch *mname, cbFunc func = 0); // add menu item to menubar GtkWidget * add_submenu_item(GtkWidget *mitem, ch *subname, // add submenu item to menu item cbFunc func = 0, ch *mtip = 0); // with opt. function and popup tip GtkWidget * create_toolbar(GtkWidget *vbox, int iconsize = 24); // toolbar in packing box (no vert gtk3) GtkWidget * add_toolbar_button(GtkWidget *tbar, ch *lab, ch *tip, // add button with label, tool-tip, icon ch *icon, cbFunc func); GtkWidget * create_stbar(GtkWidget *vbox); // create status bar in packing box int stbar_message(GtkWidget *stbar, ch *message); // display message in status bar /********************************************************************************/ GtkWidget * create_popmenu(); // create an empty popup menu void add_popmenu(GtkWidget *popmenu, ch *item, cbFunc func, ch *arg, ch *tip); // add menu item to popup menu void popup_menu(GtkWidget *, GtkWidget *popmenu); // pop-up menu at current mouse posn. ch * popup_choose(zlist_t *zlist); // popup to choose item from list ch * popup_choose(ch *file); // same, list from text file /********************************************************************************/ // create vertical menu/toolbar in vertical packing box struct vmenuent { // menu data from caller ch *name = 0; // menu name, text ch *icon = 0; // opt. icon file name ch *desc = 0; // description (mouse hover popup) cbFunc *LMfunc; // menu func for left mouse click cbFunc *RMfunc; // menu func for right mouse click cbFunc *setupfunc; // opt. setup func for menu func ch *arg = 0; // callback arg for menu func ch *setuparg = 0; // callback arg for setup func ch *RMarg = 0; // callback arg for RMfunc PIXBUF *pixbuf; // icon pixbuf or null PangoLayout *playout1, *playout2; // normal and bold menu text int namex, namey; // menu name position in layout int iconx, icony; // menu icon position int ylo, yhi; // menu height limits int iconww, iconhh; // icon width and height }; struct Vmenu { GtkWidget *vbox; // parent window (container) GtkWidget *topwin; // top-level window of parent GtkWidget *layout; // drawing window float fgRGB[3]; // font color, RGB scaled 0-1 float bgRGB[3]; // background color, RGB scaled 0-1 int xmax, ymax; // layout size int mcount; // menu entry count vmenuent menu[100]; }; Vmenu *Vmenu_new(GtkWidget *vbox, float fgRGB[3], float bgRGB[3]); // create new menu in parent vbox void Vmenu_add(Vmenu *vbm, ch *name, ch *icon, int iconww, int iconhh, // add menu item with response function ch *desc, cbFunc func, ch *arg); // function may be popup_menu() void Vmenu_add_setup(Vmenu *vbm, int me, cbFunc RMfunc, ch *arg); // add opt. setup function void Vmenu_add_RMfunc(Vmenu *vbm, int me, cbFunc RMfunc, ch *arg); // add function for right mouse click void Vmenu_block(int flag); // block or unblock menu /********************************************************************************/ // spline curve edit functions typedef void spcfunc_t(int spc); // callback function, spline curve edit struct spldat { // spline curve data GtkWidget *drawarea; // drawing area for spline curves spcfunc_t *spcfunc; // callback function when curve changed int Nscale; // no. of fixed scale lines, 0-10 float xscale[2][10]; // 2 x-values for end points float yscale[2][10]; // 2 y-values for end points int Nspc; // number of curves, 1-10 int fact[10]; // curve is active int vert[10]; // curve is vert. (1) or horz. (0) int mod[10]; // curve is edited/modified int nap[10]; // anchor points per curve float apx[10][50], apy[10][50]; // up to 50 anchor points per curve float yval[10][1000]; // y-values for x = 0 to 1 by 0.001 }; spldat * splcurve_init(GtkWidget *frame, void func(int spc)); // initialize spline curves int splcurve_adjust(void *, GdkEventButton *event, spldat *); // curve editing function int splcurve_addnode(spldat *, int spc, float px, float py); // add a new node to a curve int splcurve_resize(GtkWidget *); // adjust drawing area height int splcurve_draw(GtkWidget *, cairo_t *, spldat *); // spline curve draw signal function int splcurve_generate(spldat *, int spc); // generate data from anchor points float splcurve_yval(spldat *, int spc, float xval); // get curve y-value int splcurve_load(spldat *sd, FILE *fid); // load curve from a file int splcurve_save(spldat *sd, FILE *fid); // save curve to a file /********************************************************************************/ // functions to implement GTK dialogs with less complexity // widget types: dialog, hbox, vbox, hsep, vsep, frame, scrwin, label, link, // entry, edit, text, radio, check, button, togbutt, spin, // combo, hscale, vscale, imagebutt, colorbutt, icon, image #define zdmaxwidgets 300 #define zdmaxbutts 10 #define zdsentinel 0x97530000 #define zdialog_max 20 struct zwidget { ch *type = 0; // hbox, vbox, label, entry ... ch *wname = 0; // widget name ch *pname = 0; // parent (container) name ch *data = 0; // widget data, initial / returned int size; // text entry cc or image pixel size int homog; // hbox/vbox: equal spacing flag int expand; // widget is expandable flag int space; // extra padding space (pixels) int wrap; // wrap mode for edit widget int rescale; // widget is rescaled for more resolution double lval, nval, hval; // scale range and neutral value double lolim, hilim, step; // range and step value for number widget zlist_t *zlist; // combo box list of text entries GtkWidget *widget; // GTK widget pointer }; struct zdialog { int sentinel1; // validity sentinel1 int uniqueID; // unique ID, monotone increasing ch *title = 0; // dialog title void *eventCB; // dialog event user callback function void *popup_report_CB; // callback function for popup_report int zrunning; // dialog is running (0,1) int zstat; // dialog status (from completion button) ch zstat_button[40]; // completion button label int disabled; // widget signals/events are disabled int saveposn; // save and recall window position each use int saveinputs; // save and recall user inputs each use GtkWidget *dialog; // dialog window or null (box parent) GtkWidget *parent; // parent window or null ch *ptype = 0; // null or "window" or "box" parent ch *compbutton[zdmaxbutts]; // dialog completion button labels GtkWidget *compwidget[zdmaxbutts]; // dialog completion button widgets zwidget widget[zdmaxwidgets]; // dialog widgets (EOF = type = 0) ch event[40]; // active event or widget GtkWidget *lastwidget; // last widget active int sentinel2; // validity sentinel2 }; zdialog *zdialog_new(ch *title, GtkWidget *parent, ...); // create a zdialog with opt. buttons void zdialog_set_title(zdialog *zd, ch *title); // change zdialog title void zdialog_set_modal(zdialog *zd); // set zdialog modal void zdialog_set_decorated(zdialog *zd, int decorated); // set zdialog decorated or not void zdialog_present(zdialog *zd); // zdialog visible and on top void zdialog_can_focus(zdialog *zd, int Fcan); // zdialog can/not have focus (e.g. report) void zdialog_set_focus(zdialog *zd, ch *widget = null); // set focus on window [ widget ] int zdialog_add_widget_long(zdialog *zd, // add widget to zdialog ch *type, ch *wname, ch *pname, // required args ch *data = 0, int size = 0, int homog = 0, // optional args int expand = 0, int space = 0, int wrap = 0); int zdialog_add_widget(zdialog *zd, // add widget to zdialog ch *type, ch *wname, ch *pname, // (alternative form) ch *data = 0, ch *options = 0); // "size=nn|homog|expand|space=nn|wrap" int zdialog_valid(zdialog *zd, ch *title = 0); // return 1/0 if zdialog valid/invalid int zdialog_valid2(zdialog *zd, ch *title = 0); // silent version of above int zdialog_find_widget(zdialog *zd, ch *wname); // find zdialog widget from widget name GtkWidget * zdialog_gtkwidget(zdialog *zd, ch *wname); // GTK widget from zdialog widget name int zdialog_set_image(zdialog *zd, ch *wname, GdkPixbuf *); // set "image" widget from a GDK pixbuf int zdialog_add_ttip(zdialog *zd, ch *wname, ch *ttip); // add popup tool tip to a widget int zdialog_resize(zdialog *zd, int width, int height); // set size > widget sizes int zdialog_put_data(zdialog *zd, ch *wname, ch *data); // put data in widget (entry, spin ...) ch * zdialog_get_data(zdialog *zd, ch *wname); // get widget data int zdialog_set_limits(zdialog *, ch *wname, double min, double max); // set new widget limits (spin, scale) int zdialog_get_limits(zdialog *, ch *wname, double &min, double &max); // get widget limits (spin, scale) int zdialog_rescale(zdialog *zd, ch *wname, float, float, float); // rescale widget, lo/neut/hi vals typedef int zdialog_event(zdialog *zd, ch *wname); // widget event callback function int zdialog_run(zdialog *zd, zdialog_event = 0, ch *posn = 0); // run dialog, handle events void KBevent(GdkEventKey *event); // extern: pass KB events to main app int zdialog_send_event(zdialog *zd, ch *event); // send an event to an active dialog int zdialog_send_response(zdialog *zd, int zstat); // complete a dialog, set status int zdialog_show(zdialog *zd, int flag); // show or hide a dialog int zdialog_destroy(zdialog *zd); // destroy dialog (caller resp.) int zdialog_free(zdialog *&zd); // free zdialog memory int zdialog_wait(zdialog *zd); // wait for dialog completion int zdialog_goto(zdialog *zd, ch *wname); // put cursor at named widget void zdialog_set_cursor(zdialog *zd, GdkCursor *cursor); // set cursor for dialog window int zdialog_stuff(zdialog *zd, ch *wname, ch *data); // stuff string data into widget int zdialog_stuff(zdialog *zd, ch *wname, int data); // stuff int data int zdialog_stuff(zdialog *zd, ch *wname, double data); // stuff double data int zdialog_stuff(zdialog *zd, ch *wname, double data, ch *format); // stuff double data, formatted int zdialog_labelfont(zdialog *zd, ch *lab, ch *font, ch *txt); // stuff label text with font int zdialog_fetch(zdialog *zd, ch *wname, ch *data, int maxcc); // get string data from widget int zdialog_fetch(zdialog *zd, ch *wname, int &data); // get int data int zdialog_fetch(zdialog *zd, ch *wname, double &data); // get double data int zdialog_fetch(zdialog *zd, ch *wname, float &data); // get float data int zdialog_combo_clear(zdialog *zd, ch *wname); // clear combo box entries int zdialog_combo_popup(zdialog *zd, ch *wname); // open combo box pick list int zdialog_load_widgets(zdialog *zd, spldat *sd, ch *fname, FILE *fid); // load zdialog widgets from a file int zdialog_save_widgets(zdialog *zd, spldat *sd, ch *fname, FILE *fid); // save zdialog widgets to a file int zdialog_load_prev_widgets(zdialog *zd, spldat *sd, ch *fname); // save last-used zdialog widgets int zdialog_save_last_widgets(zdialog *zd, spldat *sd, ch *fname); // load last-used zdialog widgets int zdialog_geometry(ch *action); // load/save zdialog window positiion/size void zdialog_set_position(zdialog *zd, ch *posn); // set initial/new zdialog window position void zdialog_save_position(zdialog *zd); // save zdialog window position int zdialog_inputs(ch *action); // load or save zdialog input fields int zdialog_save_inputs(zdialog *zd); // save zdialog input fields when finished int zdialog_load_inputs(zdialog *zd); // restore zdialog inputs from prior use ch * zdialog_text(GtkWidget *parent, ch *title, ch *inittext); // get N text input lines from user ch * zdialog_text1(GtkWidget *parent, ch *title, ch *inittext, int cc = 10); // get one text input line from user ch * zdialog_password(GtkWidget *parent, ch *title, ch *inittext); // same, but input is replaced with '*'s int zdialog_choose(GtkWidget *parent, ch *where, ch *message, ...); // show message, return button choice int zdialog_edit_textfile(GtkWidget *parent, char *file); // popup zdialog to edit a text file // write text report in popup window zdialog * popup_report_open(ch *title, GtkWidget *parent, int ww, int hh, // open popup report - pixel size, int wrap, int Fheader, txwidget_CBfunc_t CBfunc, ...); // wrap, header line, callback function void popup_report_header(zdialog *zd, int bold, ch *format, ...); // write non-scrolling header line void popup_report_write(zdialog *zd, int bold, ch *format, ...); // write text line void popup_report_write2(zdialog *zd, int bold, ch *format, ...); // write text line and scroll to end void popup_report_top(zdialog *zd); // go to top of report window void popup_report_bottom(zdialog *zd); // go to bottom of report window void popup_report_clear(zdialog *zd); // clear report window void popup_report_clear(zdialog *zd, int line); // clear from line to end void popup_report_insert(zdialog *zd, int bold, int line, ch *format, ...); // insert new line void popup_report_replace(zdialog *zd, int bold, int line, ch *format, ...); // replace existing line void popup_report_delete(zdialog *zd, int line); // delete line int popup_report_find(zdialog *zd, ch *matchtext, int line1); // find matching line void popup_report_insert_pixbuf(zdialog *zd, int line, GdkPixbuf *pixbuf); // insert pixbuf image after line void popup_report_scroll(zdialog *zd, int line); // scroll to make line visible void popup_report_scroll_top(zdialog *zd, int line); // scroll to put line at top void popup_report_get_visible_lines(zdialog *zd, int &top, int &bott); // get visible lines range ch * popup_report_line(zdialog *zd, int line, int strip); // retrieve line (strip \n) ch * popup_report_word(zdialog *zd, int line, int posn, ch *dlims, ch &end); // retrieve word void popup_report_highlight_line(zdialog *zd, int line); // highlight line void popup_report_highlight_word(zdialog *zd, int line, int posn, int cc); // highlight word void popup_report_underline_word(zdialog *zd, int line, int posn, int cc); // underline word void popup_report_bold_word(zdialog *zd, int line, int posn, int cc); // bold word void popup_report_font_attributes(zdialog *zd); // font attributes for entire report void popup_report_close(zdialog *zd, int secs); // close window after seconds int popup_command(ch *cmd, int ww=400, int hh=300, GtkWidget *p=0, int top=0); // shell command to popup window int monitor_file(ch *file); // monitor a text file in a popup window // popups: message, dialog, image ch * boldred(ch *message); // convert dialog text to bold/red font void zmessageACK(GtkWidget *parent, ch *format, ... ); // display message, wait for OK int zmessageYN(GtkWidget *parent, ch *format, ... ); // display message, wait for YES/NO zdialog * zmessage_post(GtkWidget *, ch *loc, int s, ch *f, ...); // show message, timeout or cancel void poptext_screen(ch *text, int px, int py, float s1, float s2); // show popup text at screen posn void poptext_mouse(ch *text, int dx, int dy, float s1, float s2); // same, at mouse posn + offset void poptext_widget(GtkWidget *, ch *tx, int x, int y, float s1, float s2); // same, at widget posn + offset int poptext_killnow(); // kill current popup window // file chooser dialogs for one file, multiple files, or folder ch * zgetfile(ch *title, GtkWindow *parent, ch *action, ch *file, int hidden = 0); ch ** zgetfiles(ch *title, GtkWindow *parent, ch *action, ch *file, int hidden = 0); ch * zgetfolder(ch *title, GtkWindow *parent, ch *initfolder); // print an image file, choosing printer, paper, orientation, margins, and scale void print_image_file(GtkWidget *parent, ch *imagefile); // drag and drop functions typedef ch * drag_drop_source_func(); // user function, set drag-drop text typedef void drag_drop_dest_func(int x, int y, ch *text); // user function, get drag-drop text void drag_drop_source(GtkWidget *window, drag_drop_source_func); // connect source window to user function void drag_drop_dest(GtkWidget *window, drag_drop_dest_func); // connect dest. window to user function // miscellaneous GDK/GTK functions PIXBUF * get_thumbnail(ch *fpath, int size); // get sized thumbnail for image file GdkCursor * zmakecursor(ch *iconfile); // make a cursor from an image file PIXBUF * gdk_pixbuf_stripalpha(PIXBUF *pixbuf); // strip alpha channel from pixbuf PIXBUF * text_pixbuf(ch *text, ch *font, int fsize, GtkWidget *); // create pixbuf with text using font int move_pointer(GtkWidget *, int px, int py); // move the mouse pointer to px, py void window_to_mouse(GtkWidget *window); // move GtkWidget/window to mouse position

t`4`gl4LTQ;WN`zE!єf[f,{5OdĴ.\x:w}\[{dFӭ+7VtS&Obn;>qFͱ}@=ņc}7q|'sj]@QZ[[?vά91Lo{u]'ګ/Nyd'Hq=oq}43y>8ƉT" 67`$NۓG4EVbdSPXLVVCyc8pv:Z!%5>3;#wiic c{&%hr|G =yϩ(1O xhG1F A8?𓓎qٱ>q"wN 1_uv@bRyyy$'AuҎ۟3Z_'Y^V6}BjהVdfDKKK?WV9'?III@aAh$+Qڜ$d$tʃ_:XHEsȲTIVQxneˮ:ҫuddd 1%WQa *gqJu(*G;ЭH'?J9o}tSOsċ!?3⏍M/eĴ4 f^~z#/a[<.uuxŕ,̲ei H0<ĝgVo'lOwA? rOݾ<)sP5y*en9ٱs79s0(ì~91a9)2i+pFH-m3^_}Kb ̈F7xy˿|>m\nɳ0oL2=R~~yq dzY!Gwokh[|kE߉aF#%hƑBbq ==L:tObIHp!|> :EEzٻ?FU' M"HFJ*Y8o&Y)E͉XxAAvcmC:٣homCN($Hpm< qX?-p\ Fٿk<,3sWn"ͅ{l*W&8UxM| ( 6nxc+|%)IduR}USHrXXUyט>k*5z.V~| zЭsOo~JD}\|vv6Vш?.hr9u.~ǞYϲ~鳙Z!rXt%I*(b2 J؝.\, b4[p'5.d' >q|zV3 qoS73zyV~R.=7& R_wp8~W0 yhoot lv; (sx8H!\p!#G=)ISHLjlmb/ǵW^L~Z"`i3gXI$@#3 DRZ=8eKLH4h#}]=rCb:9&v_9Gx]+_Hh1rU2pZL,x6@;d1{v9UqDd*F[DzdPQ=G60r}?I9H@UK8.0%If6ΜHP #Gw?^`6 4#ہhH0A1D @`XRd L& WVr rYNz-C; t D-#}Du]nc2cYFE6[t=o~)k 5'S^ -j iUۣhZl<Ԡ`1=#xG_v?J82LG5+ǎʉ{fcppsr9zckcF( q8U! Ss`?𶝤 Ii:TC@?,^u\, K ٵ= I .3On{B*̯hae}{wӧ8XAd2U5̣CcD^7&PXPxGрd75]Q ~šPm^=]Q1D#=!6 ",#GD#&``49u)fPyd"9Pw }>Q;5ֽvN9b0 ">A>zo$Q1=qع @hq`6[șq1ӛ(@ۏ`8w>FUjf] Dqy;n؄׻% 1<4LL>qydu`0HgW%1 #vr2Y\,čt- /bwq|#twuQg7l&%aDU\ӹ?zB G^ꎶ]AA~L87⨏kH.2J2Lg_7#Xo(UDQ]GLԉZX}&D$4+l`c3hwĜ +1[r,,fiFYI$b]GDe$!U:v-zLb]G4w-dUzl(b1zȾag,ύh ' Ugb3 X/n?y]4TUG3\T;hLO".]א2awx<̛;ˡp:hhKd2rha'Iሱ[+dBSUQ;g2PUo+JȊp1SU6fdYFtL&,# I%6 "  躎:ۊpzEYQ0fL4*{kA8ӭyf~mLZȲ<4jlX,D"^p$( 訛ȧ<(j  L$A$$I"WaL&G˗i*ahoNz=@Ȝd^*#0Y@Gj:=ZB b DQr/AU$L/ 4 ,[Bkρ8(H k?ѝYxn#4ղcwZuWO/vau=6@VC!p|MC׎G55[[ʺb^,VH\+[s{]ޚEs!|:#>nQEU  56/ҙZ^_ I7ýh r`IFAmO_2 S]Eٔos9t#;6 ;Rt3G @QsqX3Y2͚<2}{­Zż,6h$BKK+@P8LSS'OfhKss sfϦhimADini!11Bss3EEEaAWW7===̜Y͑#G|בt:illh4Jss 3O/ZLZ&M豣Xө'#=@SSS&O6.`10<2طw?AZq:QZRB0ٳgBWW'˗-c=D(UUUB/ vrn#&%xOʆa,v'ckCK-U*h;eC1mSf/OrA4P4u>U }~w[|x/Z[|k7S>Dha΃!$IIa|ϒbMh ٻgy fB UU=v2mL |^6]#~4MǙDY,[MFkAi'_pc+ӓĤiXtICe<(pBYq?J]Wh:O<`2W\q)S]x8#p/u}Yx溊CUU8zH)x< '9-O$ơɣ{<|ʙyj# h8 ',|G$SR imj`擘M& 1/`]67G^~A\?>P1w%N!Iqql6hõ586<0@Iy%i$/G:NdYfhh!f-xx<8g>?O\9PU`0H0w% <&1N8q&=Pĉ߀8Ɖ'ic8q✆8Ɖ'ic8q✆S#C'Ny0=Eu؋qĉÉqK~qĉscqĉs'N8!.qĉs'N8!.qĉs'N8?8z,-0! \ M5 C=wgXޘݹ١iqnmy:c4Mc륹<- \n9ydddmr*Yiij?}8";'\ӧCQ[[hoo(ha&W<3s}YiP ݹ$HBby$% D@4i;feg*DFikip8LAa!tjse5F2u:YڹiBG{uG ))-?@*B#xxs{D#aZhnj"WpZeC 6ciiZݝ[tB uCe32OsWq>B!ZIJNr2&;|;ǎp9m-->/I2 Y8].MWW99yK3`;2DgAFSc=vԴhij$ pɅ nݝcDDy$f:=˜qGD"2seytlGuEp"twwRX\23@poQLFYN,@_/Y9 &T۬r{p yAiy%~uw5 EIMMC";* V#9n &MC!6ys~(aX7 -׼f$F"7q8 6ftE'n;>7qGӟ뜯gҵ؜鷞ctb 4hhLJ>zcNشy3]:ݕȬEK*FH73,"f>i 4M/fw i(b9(SIt|0)P$cL%MWi900C4 & 9̜YM~fYǑٴW,.]PdD5ͼk 3/fve;D7"9!>!xӘ:\SV#l۰.+O,rYչ0O=r?{m̙>D{Qj:)߲Qt>t4?__Hon8]weS_HU~#9r ɍ_.Z>V09.\<_}]m$g%JT/\?{ 3' yx *o f J"#uoy巨Zf.K } 'yW8T߁3!B$c&b_2fמztf#erk83؝춑褴b_g(M6̦'V񫿿o~Zx~!hii$j!INb},Mƙ%_N"0[_{9g4#v10Ɍtzhrf޺7wR7d[?i9L"C]ܸ^{5ϷBEN ٩nvY&~5{X~73WQv9ة꠩Q~'nQf! DB9sAq̘u+6A\k).Մ͓DbJ*)IFRRR)Rs8|}I+Gڵg_@Wم\v̚RIǟca`ƊO|f}^[@vQ%J* 2iw}m Τ>śYT< @F`"!#$IIdۖxp+9ܰ<9tm ?_u4^MHH‹.e 6''[$0 ~a-;.GaV&#$~;xuprr^ Pyա Os1_ULF$,f#;{\8耮.]6 c9gOqۯīX3o.vm_f~eaU&~z=U^Ƃ9>@c]-5u.!ݞ¬цY6u|),^֣,j x3cѲ:žPEQ&D[7z~*g,80IDAT`KᦍfEZTޚd\4#VVa^d܈ #gk/=j;. "ūoD%fc}uZԩy=41 8=c<|f0ͽ\sA5IV=w6QZy}KIEpL:tiiC_c [vb*3 sW8܅1 Nc~.eɒX<3n;A^R*sp˳י6{f6eYXMܳn}m;yf2m<;u߾w8@L0uHH8D8]˯yYA??JЖv+ҲEV=,SV &c/#?I ~3Ah=O<ݯ3%ݍ.(?&[[fn%*Oe%p Q3 ]ӈ|ȊH?O?BU L1a_x# ֛?Eӈu%a4:my7z ,3dWS+31>&LH3t; `g ~wNPDhnR7j_0A >L; i'M2eO_/~1ǃnC-?{7`vf=6Be¢d$-m?i)B?2q=0'݉QBF3IV?*᢯\ ZVn{|#8͵ccDtǗ7ƧW H;yygY:$"gz{{ANMkyFT*4=8W^yey :$-un !9'񃦡) Ʊewޣ0zs>%a {\>Bl"3K))lP#ͼ(˿ƥKp$ᩚJYY6Oų)zi-7spf«d>})flbetMQ5 !' (:+#9E9t64e⮱JUy.Hcu6 ;Vsi%(tx UבY))cRe.6Q̟VͰd0Fظ GJX6Ҭt,&#ˁ|Ϩѣ sp{gWu{3hEŖ]e[&[-cli@pٜ֩[pJp]&@HI 9iIJ0![%ے}>?ތ$K#9:zs{޻{~W[ub~uGwHņdOFVfD"*7",/+{ɏ:O=t?.w>5w~V;IĂwÿϏ<@2et0 I^HR&`aNp$^N6Ajϖy|[q!%QQ ϥV1Pg"aS c1pȾe(9X8+y?m)^=g^_3kT϶U.3/S'Eox! *V OZ}.ܲ}I|w|nAxafػbH3|E& P:Zl<_㱧ά }ǟR={r] K:Œ#f.,K&q$-D\kբAFFF~ qaݓ5D2G}/^XN'gs eZc˫t(ԭZr^*W2o[Qd-Wp({qJMS'9ƛx]}=u?J^ų {yi#2v( uIw8C!O>L4S *[fǹe9tM'0L3݃ $ܞyyyl/6Tdf$ty1 'Ͷ0KRM q屩3 L KEySўyXXݭd?'[IQQcMANIǜeJ0 !L5 PWtsXe1;xW.<HYVQT=acV*!@XPQ$xhšȕ_H~~>Voem_~\Lf) dYW: X is9.蘖0uc \|~.ʓQ [C J*J|y"E(4L(8L<EVP\U_FhaEI*AG1²뱯Qw KYU%#Ȓk7 =Uk&aCSCH/R%l,[lZVNס_ҍ b(HV}Gj>=W.t~aZ~v{EY?!L{[څI"' DZ2j*  Ғe%>~iSN,r=@0CLj3[Uo=,;a/sQa>uwM,Z KyKˡ([XCW/=ˍޢq |ޮvw՛Ro<5 I lfNpT®i l$!& 2 #TᎻo|.cTV0͑#m]30gApp%Ģ`(5lHUE9===ͷ~MXbkNdTM#M?HLzY=[odCE8cAZwTo?3k*4i̦q**Mtod6B6nd왨ݳM[,fmo0D\pΟ.+S8qj%;wrn9I<#3s챃iNu-l\9Az@R XRn&ίH_;{Fϡ@TXKHIRdىRG[MCn$$ano#!;2C{Xkh\Su*ti6&h+V^1kKWƭ8ɵeȘf}'IT ,#,KXi++N\.D7O Aú8/9{6%ld($0 =AnKO7Sq2"w9˲쐞A¡dҞ|ڡ != x<b|~Ɲ0 "N H}Lp*N =^M9# a0>e$dx |gԝ &MJ&7Kz}SL239aҫ&?HC(&,v",/D2uo<Uݲvg4H> :/#C60ðC,ٯi&̒$!2F8ȑ#G9r89riYIENDB`fotocx/images/save.png0000664000175000017500000001114615247006660013744 0ustar micomicoPNG  IHDR pHYs  ,iTXtXML:com.adobe.xmp 1 2 3 0 0 128 132 1 eXIfMM*JR(iZHH02320100fotocx-25.1: Margins: 20 20 20 20|fotocx-25.1: Color Mode: mode:2 blend:1.00|fotocx-25.1: Paint Image|fotocx-25.1: Margins: 62 34 0 0|fotocx-25.1: Markup Line|fotocx-25.1: Rescale: width:132 height:128|fotocx-25.1: Markup Line|fotocx-25.1: Paint Transp|v :IDATx{lTUǿsQ]Zj , EXM h]^ChvE7.bMv7fиfͺi(j@ABxsXZ t=e:wǙ g߹t>s{Ϲdn% /~`vCd-zN ܒ 1B0&X `!,c`L 1B0&X `!,c`L 1B0&XƄgW?@e% RSy}zB[,_jn~/5򭷖В%k}}֮]^Zc}~dINva̞ a X-]:n E2GR0՗ڹ4}zܮ9.y晄OVR{`?+JJ^؛:V?0nO?[*/i5BJ-mSYY~ q[sE/ /%z>VEbCPmwE1~BGR" &)Xт Vp*ERld!4BtZB‰6eBtN?ʝNsA!t7R® A! s'y7R‰ j%&橎i麺ښ>{O.J: wލlk'ZZڀ2)iDWe˖aĈvbj? LNNNvj#0ʺ?ODcW*߲1'N}#e,>nJƯ\ Pk m1<B/{<޿ 7A9Ә;wll)T )xsiB _A0L]vC7! aQEe|c.)$ eq~*p' W/v)Ǎ;iu HYR_lȾr #G^[̓%J Hy}Ee|&eH9:Wk%XT.srtڶYcOEMMG '2%%y.aUc4VZ't=(Q+ )eڰ'Z)BR)vi5nױ*B˃+o G#a4 ݇>e _/jO vth Q;h]S`EM^XX H{eMRB ]_:n]MrrrXq){<1 :zd&Iǡ}H@&Nuk%kQNgemQ"-55-UضmoSnjilĘ6KRH@%'WQVRbc ]/1 }Z-uyyUz|xDw!y&9YD^$vdÁMeÐUƷ%ĉ'T=~?^6M~?lXR k;;1e-ř(),2xMw-~ZZ*?GJp`HΤI-åQ`z ⡇iZshڊMIUp:l0S3jggx>@S1{,Zc\rWV3FG{b3cS~ #Ya$%Ǧft r :_ۡ+PQ{ ' Ϸ\_Gw_ֆmg5\d"Qz Q4(|e46^Pq@QQwrҥS+"??79*4ܜ52\nnnn>{Xm >='`4pFe{>\Uh!ee]|>ֵ3gg^U9қqFzz)Ih%pWB|>w& 7!=iu%DJJ Ɔ˧OqQ@tP+;] 1edSRMtPh`=p%Dd@3c9IiiJ9sf_戇0CTT; .ҥKN1(-NE.iXcMOVU9 (F{܆2C(.TnopQč$aHډXpaE̜93DR?@t$DRRR^x 9+|>ߕ.]h) 1"- yy=vIF!)))(۝$:ƑR_}IF!SR7q$D乮.&:ౙ#!NH}u(._u$ZA$m!i#;wIBFF% QǏ3 ݷ9Qب$Nc8҂S|@ (ߖtkwkU^u7GCffiƳ%DNN6;\޻w~Edfdb28 i<[BuO;InV[[BSP`*ںn$SB&-!f̘^>vFg /AD~xBgvDBJm3J 9}!72 N ABhii񛃀$n1 v_D&Ih ~=ac,xi.H{Ed$>\/;mid9@ǚB%@:h)BSrg[C#;w`"@ɰ9B466MIB)PmB< $boTŶ%D ŋbȄ 7m9 /l zGxrs !zTŶ\^RUߌC"'y#":*-!C(9vayBdml?{쳶zLq/t= 0 0 0 3:06L$J 1B0&X `!,c`L 1B0&n IENDB`fotocx/images/escher-spiral.png0000664000175000017500000006311315247006660015550 0ustar micomicoPNG  IHDRJstEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 182 266 1 0 <TeXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:266 height:182|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-25.1: Paint Image|fotocx-26.6: Rescale: width:240 height:164|"1Q IDATxXV6|=g϶u+JHI#!(bww7*vbbw!"Hwww7< Rb-x׵\<+f{1ǜk&PXXۀ, H]@YYa-AW* @yy9k&^Z 7[~'7)//999wnn.Rg͛nufu:.$>?@4% 8HMMERR@fDZZX>,o/?99++TS{ :DuʔѬ:\@#L27y0` ,Oƀ-424eէe {=ߔ3898?Y@gr+ʍnpp`ZiH$"̴ԕ@3+'h liO4rc Y΃}4 ^ 0;t1_'P_#_n~^&3eR ,Y8H 2a&L 3@ _7_lhQ{L7|~_:`3y{i.455F&%Ĥd4~i>4im:v~)@nV<ꍶm;xfw@1})DZK04 6|i=~CZV0TBnW}TTУGw6`8r"\JH }FABRArq)M09p9~HÉ\on? GOŋf/?7;O$TuyBW!/'ѽ Fۗ H@@bimdj3,Q~sLL gddGX-8Wd6 >,AdL-p3I1 {>~$m l FiHx{yq=naw"ϭ`ϙja}JGII PVVڵ+[f~gZ}+7oFhh(aCBBvZβwCsZXr џiGӌw3 | KAUAL{o]ĤxQ䒣!?/ ^ؼri*Co6W]PbqWPׅLO9VŎWÍyYsBTh)Ai7kǩ=oa(AFJ:t@*ӂg 4LЌw\<J3Y9/њ,}Շ2R4W8M!haܕu|4@a0Ͽѥ{/-F|/持boһ;uCnFjZ*.욏;cԩ3ĥd?dthzL48sLYH `61orcERh Ν;1~x,X;ٳu~t:~(7 S!mڴ!g/h/&-'n ?6σ\/̇ %BQV [G0H4.n;' tի6(-ER{ʪc݉HI )ARVf8$FX0y]\cȫAAi!cEH~;gp˅ML9 Ґ62I fU$^014._jU3GyPEYysꐔRƪC {;{D%ꞕǏ":69ixxr#Li@A{Fț0[:V s]4K9ڟ:tbcc1gZt)eY;5`Ώ`UuLYIJe0o<&v+T\:r$;k 69/Q,DEqlNAw/ќ*|$?,. ށ $z*`9_fys RWF?S^4ٺ:90fv$c*5`qIuz↼X̖~^>9}ظtF !dd0h\N2O lN+4 wDrv!7EEE!84 Ć6: cu$O\%5hݧŕJ7k/S:q^ - .M~}8/DNf$\ >PQӀa000444 %-K뤳Gβ,G0̲?#4/S5ĮwQ d/yAij` >%.959z -- 5U( H4("\4scs'N`ذa l>ؐ0ls`RSS@̼;v@>}aÆ903ĺcq'Vqq1^~ifVUU /+!^xz k& $s[ X؜\r(i KdYƌ<+` !spܼh/⺺!LA ".~?ʯv!h&-藔tn*|-(kfk;$sGxØ&E. "8 Qݟ_Zb0n//Ĭa}n~ڑ(J1/4g NNN [z#>_ƍ9F^z5hpl ]w쇚e>}԰)ݻwiz G/!(&w/r qx i< Lgej:>4S鬵dmtRp~yPRQLjYf莨p< Gp^n2l\ -Upm<yFTž8~>'o 5^.C#́E6\ )jBBqsfשY92^ ݻxڀPˊil.ڐmZ]A [f{nnn  <9%::[2 ݝC?vzJߠ9yؒ ;ڶm 19 X:ơݯK.3=ed &.Q3W"yٽnd%{@LE111Zjj_;tWv{q#4OqdEڢdW0$Iطi(ٞF<dp47|rW_\Q!2B3-t6H<Q] h" ]=]ڑFHI;y'/‹(3M旟Щ v \ݦoywK޺.ŵEtAN|Zm RS 9_|1.P8iq1UϙAlɵFC۸rr7L tthA I|bs-\i/ڴ^ s+kff!ƆzK Wo'Ǘp6L`q8?3<{1}#hΝ۫0POd9tjؐ0d%ͳX8sLc@CF;U@8^a90iq4e}EjSӇI8΁ȣ+%1{-ĠCNBGajש!h^gWHul4(OKjj~l.ZoIZy&6on)ugZ 4BM rs6at[i̬tҁMHci57oQـo?sұvXt~3XLK8300hj_cBτK׆, _^Q&nlvxo ,]yl\fk|&WLLEZYy5\ xO7VGwiڶ߄^: `Bq (/9[\üpHBBy_&an0FOB@J9o~|j14ZUyi *>R6muĚv(zo|(4h:O U`o0<CųƤ(/A5flٶ >Adz):ba r ̷౫70M#p6ztn^ɬYc#g"n}&.{74aZ?C찠Tl:ґ./l8l]ĤPP)86ω`g;W/OYIwUX=N]eJqy )hRݖZCViTeaxc"S¼UW',{/= ODf0zt̞9}0x\EE6'=gA!c)b  iCdi2s&F􇂒2f߃Ĵ*?޶ ZAa051ѐ1p0m`h ٳpr̚4v;Q@6H$~3a2-e3Rw"惱sࠕ͂X),DNXZ1$퍡cP#CSx=#4 pl$0pX,ه-w` 1GO?TDK{LRp <쐔Ma{i ŋG/p8 ❠Nlc-b*ŸI)Ɉ 4W'*wh/l ]Iy-++sx.  Dxg_PV%:FS"T縺jAWxG:,=D] x^woJwXt "1!Ȥha129>dBAta Qx"S*S[ফ/ƒB㰲n'vF ̶87 %*bu(Hj#S/rQ` @+R JHjlC*'~W,KY.wbfau( F`Q9޿!(Ęx==>=:Ah8R3%GQZZ2\`4C ,l,5Ȫd;BLN?u(8]كa3S;İ;2QLOZB,v޼ Rpqd D3QTfQ۬;}!Q1HKM$s uo( d]k>Q.$էIg:BN+$T\7!9UluFBx@O_ptk":u¬%o)\yl@S&aL0Tݧ[$v= Ϣ*Rس=qLoua:8)(!֜y P9uױ-:CpK$QVywopӎ0PʨcmAmƎt/iwUimRx?m?2,W־=Da=:}elぢZЮE*O_APY"=bei^h/KiTE!bɌDS+61(iʩno*ͧ]B ߽CSSMTXn_n#sRd&aPE 2wAU`4dsU%p: z`SӮ-y0dj}[D8t&o_Rݰh!fBNoxM5"'!a"Mj7~UX t^ b|)u/NhMp+H N[ TYZov DջwMZ5 લ`h+H+Wn2XumǭYX DmO7AX^9~Ë*!avOrx)2>!"/&+.(}D2`榏SN3D ?BZQ.X `Q: 7ϳkўtf-`X7.D,?r17osɼ}FsR"0h IDAT޾, v=76R;Ӗ%A1@3S| {GP'ALiݼPW ՖM-l' hPgЖi`Q1J4Ŕ?iXy2fm=ҪzxLmI vm 5c8L0~[KG? dI؆йSHх5Ɋ܄{?cǐ )'Q~?w;Syb:Iv\=0{ ;g#!Y>>?HwNCh<<"0Qۊ'M>!7 "l9m;Si&3^reEN9dv 4xOUxd5^4jjش5Z K1k#ֵ.# ܋iᳩ<"z䌐B lrt3S4pVbmW#|ѹ{/xoBGQcjr%"%Ȯv ͥEm+:ǒ6y"I lOy kGxU\VMkB | n=uFY+LRB?x`Q > ' {g8 lTK'cim [ڤj' + :fV5X#2lUpaht&X7!|jPXXcdp3/){:͑*|i'%I@-jϟp|oAY4p" |fk f8?u*K5RtxPŵW!NԄɱI zjp#:?QUsK(ť9ǕbMi">d2y \&ʐ&~PHw4pýG8q IN4Vg(!c L|"QIۗAK١[J2E41HycvFHs69}weصt 5p'b iHAD%pl#/+_l̖z`D*{l7/́/52~Hs`U") <)HHLTIND4MFM[V2`U@yguR k'\y%3"ok&JbٱH#ra|x*$a[וŰp 2RXuBbiI$rWF\cB)DV $% 48a(l`́gQvuj6 6O#"l_hJZS_z!Kzi| `ά]L>3c f[^Fr|e Y*J'dUMUU%v ERP $'#$($3%mG]p7jY[IW}0׀4ap@6uNFxb2ʊyJ_|Ҧ }2-#8b^'cҤq03B[nbpaKSyxq,4oxf׮ =OL5ߊ8ed![TV{ף;.:FH[TVQ SfƄCIK7!<>{/? zP70kl7_ #etlh*S"'=#c̙̖P_X=(oȇFdB+sVZS&@O&!TbK4 YEUL֬e9 E^h=Me(i13 JvW^JsF9Yaԙ30t(%/tp\DCS6X -YYYG~LE7L#'Sؽe]_a8ri`<_܏$uRP&-naJ!O^QSfb-X`+A~Ť)B{B(1ᣱ{̝A1l="hLn3s=*9JЏdn+|0/ta+F 62M+W`qХ~9f. B_ܢUX qK]))v9<aӊ#6'R?Ӊ$}YC"mtzpf+duN5KKz4v$ًRnm?+c3=xޡќZۃcAB͸:pY =b׶\C\,vw Jhui 8K8cZs@.9V&1"YG5 `wj2R<9b&r\6`OGx\R b.: lں Ν~-Ku<ʇsk|}X>>TZXR}qx&KkZ}¢Y)E+io-+KI){ݶb|ilXg%[3?|<+-"96lK燷y:. 3Zt;7o1#{gȭe==M ipV- U`eyɚʾ+hk[ޱi=znl2N&!h}^/l-zߡ x9ҳ[l1S-9Z rY\GQ:+wEDsx bh\>}[fVڏh=o^'Aԭ[\%wm k塢<p>b㐖kCG7n9V43)8c5Chc )+p`:/;'KDQ<;(yVy?>2/)Gb|,K\.%%'ST GR)#s9DHIDzff͇e~}@]7[I!>~˫+)̥qq)+_aQ{" }g\̍kUcm_6l/C$L 9#+xj]$5CLLw+& püj8e|)tkc넉1bf u} &CGSДr4OYI..Z yx]SKEV[Q=˿ziDzb$|Iۻ5SO||D/#)JFis~eiH־׵\#IJ 5E(+LË!!&Fu`u!yp>mbL;Y$7 pW :;y# ?f ~p}63kЌ$ +%[!'/O9p,@5'nPl)03+_io‹<&x_T- s[QQ%(h}Wܷ <^= ]:u50Ш,0nD,Z0^@VE(*7vLGp1EGDBQ>9|,ū7)2]X4ְn@ +(cpm.A 0;m }}IXYY抢mːxWg|X<<gg^`XC"O~Z؝XE^T'M vGvbHp0-t! c50p\p1R"ݱlHɨXh>fLC^5zqsFE60mndK&#EF͞Igrl !!{N_5ԠiqOIJc1&2{-rP7CFlڧz,I<d~Gc /aLqS PbU#Tuq-m x\7h+ID*_|HiOXuF+>8uSL)&kɱ$g ? RlrCzBs\HueoD67FPƼ݌8Npx.^-!󹘵"SeѣFbqyM=7 ?+p9)oT^Q m85&BA&>y&Gᴝ3*L\4WCⰉIm0p\*{L /L" ZoK|1|:d &#_|s4Vȉe`:kGuq dIbK5 PEI p& ޔՃBul]f E":NnZ_"*} OD{1uU$TZڠȏ4HMi!.lb#ZQ0ч쀬'4?F|:PX,9|X' B.voV\G}E(F ц8iꐰ*GHDHV mowēBʋǝ(-k O-pvjY:~:\.#hGO^&'q~o|WْD9`%7)ihM^"#htz" +ŞC ;9ĜKS 9'7*J!%zc~@+ڷoăENauxt7 !,1 N*<pbP "e7G+4ϣG 1yYVZ${c E 6!᮷8&9mcܡ%'1TO֎) 78Yd7hNV8}biiO#\9$1 e-\wm҄ubġɠxr2=#BܺdBW% O߿.C n߸xyyzz.+. p;ѩ4i)I@Ql]awiI [yĪWc78 #G5hzi3[6#FmO8y FTJHoay#0a4bVߌMkci$7|ʳqf3Xr-ܢV-3WῼwOneP>_mf'qF81͉ ʲpbFrb9'VbuYD4\iIw+|*rgZC 0> q+"9L#|}04 W&鄭Ͱn X +nنp 5ps`to.:(~YjI d{7<=Vu\t {t`iq Zٿy70/_'|}ykV,<[q5׏v|.T7ln4liP `.l6m㒟ԁ̟)s' |G(L͠('n~*YC|VxXZ h2ǐ5(-Ά0 )0oKIhaGFZUαuP&GIܜ{-o.G#Iu|3"oӛ3Db`)ֽaNIM$9RVQebX7ӷ"ޫUZuTU!+Uiݧwq' LKp)nE^xɛFrJ  k'@<֤c:ڵa\g?ˆ2Wa'BEa8|F;}QYEQYQ `[vС{<tC&|¢{A,;CgwH'#ka^Ub5QZ3+ :Ev#q20ҮcC^;Z᣻عnvq+vH33 Vm@61jr\IN4!C{|NϴE!D2?5&3U6|i`% ڈS8eesACoN?CQHŽG#ԱO1}2LZX}3! $߼ƛaj5~_nPS~c PGK7)8 dI\sBT|sد^=]i)Db\8. 9 kXRR}{8`,Drs˰x{ȩ ֵ GB8;~ǎl^"#9 bHŃsۡ]Q g?'}`2Y"48Eڼs!5?izk<QXr,a={66l؀˗Ocr'1%8BW #!ABQVwH%a.'O^ pHT"<MUɡ9H z&h p1(ĦȢ@Ӷ/p_5SV`*'pHgh`[#Fn:KeՎx>~J= ^qxMA۽8'jVC Q[_ȩʊR,6UΙdaX4JC/Epj2m_^xE ??~/YlbVbMX8ZUw+sf߽%;`Ryv %,݉5M;L[KlpS!-9.Od~bz=Rԯ#.)j%.|2aʃ܂1 sb} .BM/Y.V/#<&و\!y7a&niՍ^3o=qS= 3PìGY=(H^>C EYBZu2ܸĮ/dhKKe턮ice䖖՘ϯ.,QQeqGf)pu`֖"턕sCG7jؖLڮ0Cyn(+s[7.]S[7X43S;=i`: dqJ pvJHҲSйsgZF vOPX@^#+FM-\T׾>(eo&:Wΰ08j/=Apl]Q=d>VFKC4(!s/˗ɢOW)*:˿vDsn eG&"sBR_&[ҲowsoiGc޲7kH[+m* PXe)vh'ϔWo`eT3)4D sͷDC_5\ZC[ oTїH̄gm4U㷸޺i)L+U-Zו`84p  /ߐ)Բ? puk08:92#r|\J"r ,`lF^["}YoOzy˝.XЦk;V3K<_/7 E_~75͍+wȳUn.|P@[6-% n.au#fwrHOMi0,`MlGJ裒rman]'zLSnj4>23Ҹ왿8VnP_5 .LNVڑ0F1᯷0`Xx5aф߫/x5p+רr4?`n2w [&^}0[ nŝF}>ߖk6x (.0Uٖ-ۀ/"+#.c"}ES2NV,<[q552;47`n2we;lS0[ nŝ<Kh!Ewtxwmpv=݁gHNf"BC}zq|#.*R45@e߿b۴Y}6ٙ s@..," hDEZ&"( zca@_P06FVTϥҙ Xc+'+Ϸ{#(+hU07 U7|=^5'bB-1.o  g #11Y(mN޾E1 xp|KuAEi)BoF4۶~WQyrb7dg~4f7ٓRX6 Xp,6:>6{rs{EXDbUoJGG#(h^(HՅ =L+C{[pF|ȕ AJKNƫN vo2<}t(_9,8aA\okj攕Ka=d2 5Jk:XSyy_Y'V'4gt8"ΡAġKGklO?Mx̀ }-6a}H!݆VBcx77ݔ&\7ݼ,~zlذo( z>!;O_T]//+Fx+پY#0*+k&Ͼ(MvfQp~l2߈|f:n q[n/`Oɨ)`יXQV]&s6hI\>_ٯ 7C[GvCyr|*mж*s½lT䡢cb!$%%?d ybW<}|Lyy%!Θ<0?|q)iܳcUR89 Sc}HȠLG[^F" :6Kql:tڗ i}T `Hx񃴡5tzI`+Ժ_ٯ.WwNE-yÛ&k#XXhXX)Xi\-8ܻrPo{nAaDu3ϑ["@~+FW-zi9&bLά0ek뢺$C_dTӗ FTT$+c[ouo4q@dA@A"b0$&Q5QQ!* < (3MC 澵vLf]!wgӻڻv.hyfwz5A]h]#~k0qMb+(oh%9.sl/-+++98a^j:%r{^v!6-͸>|}.N9[|-9O iN7|aRC7V,$^Xw% -5XnO.5N\)Ƒ^{ltɷ\JU(N EnoG}f.d9a̛#gu&׷p!("TM T{ll`m3 s=q36R&Anm3ޣ-?c!d\+o楩c; Puv—OaE0掄6#~{i@x(FM0@9}g/gZڋ8>kp-RRpt&XNGcH;ynD |}3{=+_B0a8ƞ#X#B!HQvƏ38?쇫%#h",G2&vE1nk%P'CҒ Iz JEU;Qx;& oy!Gխ8gCJ#d@`t=xlCO_\YDB]:KP7`a?,%*/cXy"deY,jgAlK_o'+PHz~8j lI`b75k;'֛z@2RYI!0vo )YNXԌgƳ||/,ݼ_^Es g! [cfQjc $(!먄8/^A?==/{q'ߟCTy7mFOֹЃ^@%wցi.y.o4\LaJ."eY)s\@t D_8r?"(|yJ/̸z,貃Nb1NCFu1*"Na>)ڹ<YGQ1 ܀Dֈ#V11VX74 0-w d)rx# E].MV+TR `GіFkL#G~J֯Z+ry;`Lc=2 KI~9sPy3b,+ NKH1fm?eQo޹$zc YHG6G_R;6 `Crھ,Э+DP.} g-m $8Wc8C)r]~]mp8,r@!=L =Vn?|DlR OAo1!Htwx _!6b}/Θ [6Yje@L9I4_Rd|6}Zs5j:dXb +OBSQ[`7j,sH1y+~o} `JY- ? B--ߵSZPB}$ѵ.0uCio@xS ) bͮ$lSIyM>+x,\H{&Zg.48I~}Kxn5{Uَ;??ʏKxbr8YmZ5М}saͱ[hS)L;bY0;YsH.4G'i@m`jDt` XpM)iDh}͜Dq3)H`FIxxabR[W~I F xPR2kpn[OA3aL 5y$ql=F7 ;h{N}AsTuJYJEGgOF ?\MQpWV)ej# ٘? Vo%KP_(+2~UD)bh㇈r;:)E:N؂,\-ʧQp=%K7 -g56@ Dee0u\g V0w]EIY)/R$z!1ډg #R+'^#=ɚ$^;SRH,]JX#+,:YŽ@|+1WB K`܀́y^ \LM'k`0"##t%솷'ȯ@!-fz`YO~{ڙ6dpp3#Y')aoMBo ՂÛp%1 HLͫW)uZcӈNHBl.˿ 1d4Xa pՍڶt*[{.Av| \ 0gFU=2t蒡0#[ZZJဵlVbbc̹\J/Zp_{/OZ8zx"0.&bq%S(dL]ϥxlͫd yj~o cֆj^?%Rs˩f01;CFY6msp0=LQ_BDs%rkŅZYX)8 X„7,i47 l=pC]q-YLBO]/>hb ,l_LF~TyGN~>rrFҴQya6R,ж!lANf*J* cK<3jd-{OJK@m}=?*ȕOHHHQr<4O|uy>Y}[-U:z., ͍!an+O a^L5焝+ :ef头Rlj67o\}X{eJVbkS ?Za[?~Xj8i{ D@ GcNswS/<|`_!{ ]N.4m'ۇFV-f4}Ѹ}ye߽u_Mk&X[lgr?A2m6xUOk踚Wdq)2$O-#쳠Gr0/c ɭBcPwQ3Η\ho{hI QYIsuRnZ%k˞t VvߟFB\K<<{fZXϟ,jG^}{Z|:鄝ge[G.7˄+lZ2nHT<錫VV474S"B= hZjN_ЃI"ڋ\JW AL04er[8/m4A4pPFu~f-/';5 7hl'HLvz2wduU%bV);2?'*Y¼lEݧQعPlfYFY=  QHcwJh7o&w `LF0)_G;=6Ethߋm/0|yL,W~fLOr'md~dx(SYV*j`)zAmIDAT _IWGI+dyI(:t3ecJ$0^p]}`̺ey5B2ZZRRMA4 ugVJAl9j`]էo@^5r3YZ^:5/@wX7Z':u@O,:nj(lIENDB`fotocx/images/adjust-HSL.png0000664000175000017500000016405115247006660014730 0ustar micomicoPNG  IHDR*tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 319 430 1 0 uI:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:430 height:319|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:387 height:287|7d IDATx}uXUvt7JJv+v"bw`wbw+( twws|cͦ\=Yn^1sZs; (**< 8Y;mQo֟ Mm` Ψ{!gi7ęHOOGjj*{FF9(0`Ÿ=?--kgmXpn_;k1 -Z5f x0 /&gB711Ń i&`k goa)13ˇ ϵγh̃2GsLW /w88?BN Wo-&ܘk0 M4毙K&\g=s"kȗ̬fumј6<`Lrñz,h(A9h$ad3='/"9;k_4 Ƃ /"Ҷ0yg ĀxZom x0h1b/ <0jRx|PXNN~EOEcUEHtnјxb pL7FCᙔs wCYK>6/;KM$$ĝKa1? tG:&<1k<`@XMPts1wK[5 ӑXؽ_D_ B]fI5e` Aјm2ReЇ0zجۇSRRp_;*0}q#a4`b I^A~];A^c#]CPЀݥ`SvY)ظ`{Y9P `ر~N~cH Kx`ZkMo4f Գ=e\,msmFFF68ǾiEƃmfߓC0X } ڽa:"2M ?YSWAar2=CxRJ*Jׯ<'I".*xtn xzzr_R9pc  %hmիWGrFv# %t%3h8\ c-5h J2P'+b G^8 GMC vL]}I?wU3mUT;C zƊ+>A[ k֬Ahh(wMXX]__|4d`A#A׼Fe&΃ iMʵ60Fq75gv3Z4 ZrPTPDa1 Tj!oJOS;޸qEiX1~7~;^$#;5LSIIs/. LiEY)H+h-7TVfa[TtuuϿ@ .?kD#!tf%0ՂFIxG1PC FD喠ͮ/ 2=x0hzyc,Ƃ%^gA`a =a8a`p0*Ͷ( q) l<Dxx8Bdpz0Ӝ}Zs1fM%BIEz1ab?u 9yο&X0%ۜ@ˀY%KKZZKOϦJlvyLXxߟ m:t``7'kxqa3&Bo\EE;$T a5dy|=SL`˂]ai ]J*MāJ5, :6[ؿo,YH_OŨ(/CjbopHhQYzt|̠zge:f0 .\I&q.#2|Ut}h'XGw} 9mj!N!e/YP#0T8s Z nTx .k`#mF?= r٨BGO͇()πB `? ={82bccv1АGfAyy9 +.*@Nz""rf3,AIQV!D֝E`2|s<\n8qb.K̠9 ౖLg.#}ʕ [Cew|X~\0N9W ˶KEM*P1wR;[x~PRt_v\ H  d& 5OmŌSЂ3MÓ` ͑x]fh# 9?K9a/ ߣl"\6;a" )`\J3[g-X3u/ܞe}{nN~oN02Mյɓ'M&R ? 37N nKR6!Dfs OT泉xߌ K)<}([Wer:{؆=N@Nj3a4d"]sCX+lm.fpqM ɕsjCVV;ۙ1p8j yژAYivcgBOú)Uy[O /㞣5➓#v; 6ZZD;, TTN/ 41b< 'Ǜ8c@YI: fek940}>ݻwqX[`ӎÈnmIxc}}ʹƁэ !!!xmGDD'}e`gx=nTTTs;π63ZcO$e{bOYCg"=FscExANVHAW򭫙NC| رvF|I9 S`P#JKҽPUU_z2v'#\aG z{GFFt*v#!= M!%)AeСCS3 ,,9Ѯ];˩b O,յYYxzs ztڣG*@RVo>L=a1a xJ髌F*:FHLmk^&YfOSl;Vn-sjonѳ[@L̾ 07˙8}X<{ }dl6 AY(ˆsG#aQ5Sg .rX*bdžq}!-!aޮXh&F #Gb츉7q lwpRv 0Gs: ˜ӱĦ a:;Ǽi133ǘɳqՃ{/@Huq/!#qv|y91ؼ,Cz>dL?#|5fZE}Eo/0`̩7is:Q__#e%\$ ~&z/֎Y,(GmöU`@Eʺ|:ɽgъ e&ԛKlJ83[ЖQ-mk5 O`chU$3!vS<@5M1Ѕ6ԩ3dT1x\8i7Ƿ&ܘ@)_7& mKඥeB`NS3`ԖܚkQs4n]ǮoX;<`۶(x_Nў f2/"}g qKgH0 4v>VT/mFll,@כֿ` /OHs4o&x&7o ̞i;k-3d6<`<nNx'o<eO1/<425^+y/Q~,؈?x<,`$0WLt4/?4yYM[ 2`0wc`-C*cqU$@@%ncR+83^|`.+ëpr{Ҳ6UwOcEn}_в8Nlæ]{)g%My9ߴ?\: am~n &"wVTx(Im \i3fQOǓ07{?W}oa!󉵐 v.Ͽ˸#bpc9uܾ^QX3c0&/]蒶dqpi,tlsK [?+9&0:]Q7CWwlwy;+)aԹO]6?W0`sP{`tzuhq8}Yy63}-P聓_VyI1*傉fXjU>9晴 0r-*?8읏ݥ1FP m:ymSk!@В!*JD~SK&(I•[_<f>9״AgWс0uϙ @QNbbb3óE%K'1¤S1jHKB\*=UVean:L7G&5o_Ā>ѵzC^Y ܃Yd!!ѫ?EM{yt3yѳ陆FY~7CQ'Ά& D&prRb*ɣ'YZNm!57BzB86Đq#v.d!![ޠֵ%@s6VF_F=Гس8_q)I=+]JVADb*4p|J82ƎO*l#!96YAEQMAyQ/~HIJr)]DAq ӱ~1::wAO I88Zz?FK_Y];\CVQ1YWOy&`HsHH~aHj]R;WBGKGL\ *:w|;s<6v&OY)}:NۯDЫ{8'Z3Y<.l_b i)!mؽ6vGS{ؿae!%#sWUP O1ÈY 6Y8}͉"eƬb="6R#1e@=z4NxsL5?p&#toViX1Q,f ԏo,,>\_ 5wO +.rjctU$;ieB.FgqyX9lMyqh Gpz P.d]0' 6c7l JiVª 22Ҧ4:4b#}Gake5;#*=CCA28p.ڏa&ZLn! xsm[0(It!I •Xo3d5kCAz4l-ѡF[{/^鹹 xEi|]/TEXF#SP\o]z`8{"^ЙHh.PY>P+挀, a3p=ndП r%izh#Wsw}AdE'io`ca-::iY94&G_i<c``>= {Ö ZF`rpt)n2corlܾDCX:k8q  -R*zѩi~b]a4|*+HG8cD?MH`cy톹{-AEI!Nn|p~ ^8m)dh2eډM =[>j`0 !z^]/0X䒋)*w4ݤp1^y=v4_Wex` J28T/:,-ek78>z^  *I;'M+/Knje,>GGEd t!<Ӯo| ]Ĥ=|\/prEq[qB0 rƚ8ᏲDUX`Ic"caof8t) R`O VR^_ ĄiqnPI6r]J½i=YbmDVEI $ kHsdLO e5^ABL gI\e&O_FLS ^YT`Ht@w=* O[?x{ۨ0X*0V([fb>~ iIfPCPIS#\2``qJ fjo\0}T?(TܳR|E5d%oH6ܮC-D`Ծ2 aˬ'7/YGRk)O: 5afs Y(o~>׷" Q (|^zQGԎ蓥2ˠoeXDc??ҤM`1}.$ L3i=p"\o1WY:Ld$:{t-hAAQ- J` qhKC0y1zdnED*I0fj25`PPSCiaJW~;f`|[D,z~HOgXpeפD^E=0k>NKq%aLmEqm/t> ,̐y$X&,Yj)ѾrD\¸fkACbqC3RйV`ڮ*tO茱Befg>zt kQbܱbf:E}Y)Q8o-i? 6gL@Na6 ^#F*cɱ ȪEߓs!҉+k,uyXiѻeˀGO`2t 0pLdA3 IDATtQxҢK`=+:U`@|ۇ\22b ɚrpyP+fȉ:f-oo"0('0`o ȩ[) x0h6A\;&S vH"VP 9M:v iBaǬgndqm2pC)i< 0 qA@d%A| *6Ԥ`ˆ캔`# BS]QG @!CPgA$\@g&\jNiRX$O/lQzg Q`=i:t@bB@Mfc '%92_Y"06o \pU$/k\u}ԾCrqVN6ƌ>l Ep~ x%AJZ:>`uYoɁTKG ӕcgY;*=3rFpK%^,O43/1 2mF #Fdm .$YO$K +4_bXDYٹ MԣE08u2V,%yb@u2H*Q1t0Xaδq07ցp|zv~օTZhΛR50(%0m^] S1f 9ŇՈ}?T T+>;Jh*빉. -AuE3DgiMD+F XM#]FoEyٕ xD.ML[^1g@tJo;aۛ`&dEt9P"!2j-q1<yF5p e^RXf@֟p( SŊ *2q*HZ 9ˀY,A:n?{*3S8rb0LE0HXtmrRHr` zbZ׸>/E;];<3z qb>h=Z0`?)N"d{K)M,Lߧ O?koOA<e[{m`xs#uje_sLEBآq8:ϝ_ Қ&Xr& Ѐbo<`c[ I ,Z%1 LaFEs0Ҕ;A/2J~.`WvOmgʀk #S<}xCNI{/9u;ZpM(-*d&Sp) <}WN>i!GP¡8mBZ\IAO1s8b^4@dR@2;ϟC误#6.KnvnT$a׃((v.>-KM,%"0njD#->G7/Xt!WŒX-58KWDLp::wq \8cI?AvagtSӂb0mCTf'tݐSHC|+l^<2d,2`I `!{n<1q;4n`Lk z<'w@[,Wu:V!5*0qSI~{mJX)mLk`ŌP29'(*-It+턮OcfFlEOfb,ɮ1i.fPp)>zBwBY^[G%[!Ȉa G`p i{,Hx-cP2(+v9u/: #d0֚yu yS7~$``0}`oLYĈP)Hg=}붢$ 섮:tg=xP :C*B  02#M4Yj!?rh(%y)noUJUT2ձx^e磔_8j"5Uei`ծc\`՝̪*J>fO9yyAjO~LJb2'NG@V *-H=(MU})6 z !GAA֎ %?͠bNAWlをJaq~%3!:_8WU%X4ޜDMTEVXX5)͌1|\PC! 1+AAEbы,(Fi~2eP$ZNIJPbi hOiS{HXbм2k3)1XE󭪮ssŨ3E;l2+iH`V_™CV^1 )JE3Pɀf_:++EگG]Y:}Mп?;n,4ѱ ({5 hhc?p F E i ʈn i衃H(` - 3aUՠMm-L[k =B\Z:z8cZM$r0`dA5m DR+e% E|r2f&Rg0j% 5 JGHp Ii,,)ȡ)ߙ":6Iqtm4(H&YiI B`?Vv=Pyrn *"{&k7$$)PPd6zVµŴuѳًC)#CʚgVR^zBtbQZ#E~)@~Nجy)®,&".+oH,NCDh02k5bF .1\ M ;(/!&$46nQJ[R"Rk]RexpCC)4PSNT ⡄p&!3W ʑ\3DybJ xn%%!FTډ3, ,R6SE&ƊxoihSR-#64qfmk q:asD1Bzorնfœ/A(Zp7Gbi}!b7eCՕHIB CCÐFmY*5FkC4jA)R:>?FVe1w?t`ޘ v]wuVzm}zߧw`%IpOtI_zo_ 9-L[ e7[)&d7ÃoJ̃)߃gЋ_1qV>4z{taߖqfY@i k?' > "w~BiLďz<(07QyIBi+xO<}[;\<~[FY\T@`l[cu{;V[k#yAA0ķ  x0\ %z2R'/Kp8c&'q4.ܗ<`[fF:rslo{^n_x4l_9H'b э sϢ,W͵Ƕh x0<< x&<<Ǐ癟e?&9T2-q(Czv! m=xfmMƒ[1sɥ*Wo /wXh?ws5 x6ᷢC`9; tĴ|lrlԌ7V=Sx]ƭos;{fUnv;ŭkpkuz<[OҪE0Ȉ ]srBplJSE[ z;ڊلg"CI;+~vC 8 vdz o*M}gg<vQp8~0ۗ 5a'cI{4ueYNt.6goώфF'>mW@ەG#W޹GGG/=Je"ڢsoQq (oyFa?B89pȧǮ.K?@Dm"@|']Toh{fr 6Ь!bkv{?RsU㭡XsQiHolm>PmUidz9] fxM.kO E खPm -=E%js-Lߴ ט8s )3Mok>}m!SdvǞD6I78f19mf=OH]PPS_1 (Iz J_X9{Fq=۟ 7/Ĵ-ƈT#֭ZybXlW?G)-\\عڄ2?gf͚c#fwؠؼn%Ν9t\DU3bppF̣k.^w#@(T)k >DaLK}b Vۈ 8\=%aY\X>%GŁ+aUb zi?,[mXjÊ2ӰZs*#}ql\mލ/cI3KoyW G2O/qTl:Iw>2w+ѱCW%r[w-%j;x^|Vl Xd1Gy`(hmMgScv>մHDՇ?M}bP}ES<39?&4=/spp6,\0 irQq * v gaO[7[^yֺIYˇ6b=Z kYulٸŵn`eϦ5becOd%P%H/QJ,g<^g]X8#Upx's-msڱkwy~8Ⲿ|o 1,!uEDXd)|j *%ca>ɪiR W=_S nƁA-KV`Ęزc7ރtN_\xO h#wpY %>ATlaփ$mFKr._+p!K֋j '֣a:NTNY+T0j%0Yoj2d1rLXn#m%Ya֋U/\BdƶTym(7:0qTׁjN3ʌNɚTp -^V ᚧ` U \yfOrX(Y9)Q߲J._E;2&*BJ'.^qr(+%1Ts⨤r*+t(\ FBJA_x|t51b2;E0'͚c!>hxc%dnyTǻV}p<αѨxYgdd8y>Q!|*hELERR2 (Oiaa 9[8G臑 W"A>~(ڙЍ|?T홒G.Y c`?i_J&^:>=zM <_֞8 P%7B,4[ݱ6x6E ~vfhL"'?$35,G2-ѩ48 GU(+[G`\P~PTfQU?E#(z2v]IK*gxd_u;$izY<t? ߱FE'BYgW * CO_ĺ߿tԸ`ЕB$U8_.:>2ma:xF& )1xgT 0a5d ?^PO*B_K)w}rU[n4f0X]zs%Qu 1jtB⩢Y碴yY8GWed5bj+)'}.(q;g`TC  BF+.PM 6]A8e>e\R\L`\FL YIqRbLS =Z%7^rVV58bzū<6Kq^,gFe!J1ɂjļ$PVU :03Euq̙蚿 =w@W<)qYh) ¹qg") e{@#g30Е]E.QO0MZLGDY=lͫ[BciI '_cH-Nr(!>(-ʆHi^T;ۤ fo܇INҒpe0! ,sa0l.n9ٙ`ې5:jߑ8UcsΧd ѾVD ~Cl_> 6#*+Ƙ2g|x_07 T[XZFTkc1tʃgL4NCY Iʐ}?%9tJ-x)8feGIJ}1g$4}Ճk0TSW"3(MqY8}h$%0mF"]TʹA#UYJ |)!˕[| IDAT/z ɪiAMoܑƲ.Ȧޗy; šsRIQ+vj%{拲~U-';Ŵ𛚰~z2 ,WMER݇?RPӅw [c꧁`H/@Y5)&<-,F7 RB0JO,Oͻt*| Wr;*bTR;N]a , sʀTLTB2yobpǠ w,]Bc㷨gT J cĭ1%_>hʩטK1PQ?'/=w[AkFϐzxk0(zG "R&Bgx ܷ8EY>bu6]GX ׎ i50PGk"B8.con$A]4!3ibH|_+#A^ pJ\ܼ\dC6@/-x$ cܨ|FA ޿~ / O G@<93T+E8t4 t ]bA,}O%!"!.Zɘ3+M`u, $U&>S p}\tjߡA8+'c3H .X'W&Z&޻(ʎlj=W7dȌ'< Ň)]5&UE,l >f3."]Ctl W71K T XZmݛ XPB/pŸ{r<~GZt>pLlwTs``bG)f$ѮvKȢܽ2Hc`/$Eu>"0x/ţ;[_!&) yEEHIIRURŊl@6$fB?BCG}snRxOlPo?‡شcg^/"+; .d **Mg k W2Szع҂Lli,ISVG^qJ/*Gʾj0#n"$"x*4wU(N E Is"0'V}f݇x04M`-~l[5O/c<޹_D*̓)=x3l0xN`PKl f_׎)kh|\dR}%80(q&O)FTYi.R$]E.Y_,)#9r)_8Lsp>AVF d˨)s$pr\熐,xi8Xִ W+  !.Hi2X1^P6{ PJC|2rf@;`&i`|;!t6O&ާجLeV@9_XˠU`P^]:at[rU& N'7CY7ia'!s^ ; R ^+yv ; 80 &1߹y"st|ֳ 2B1D cePpulBˠgG!O̹u}ZzRSS#~9Disp l,l3/":#ge8o0fvUgVr/31e߫qiBH(S*RAF3iܵYxz8E l.xT,qvJn=n('* ؎n`<@0m_-(˝=Ɓ.JSuڙ 4JNo >VgN+l5qg-/H1䶚7"@u?ep)asFܳsYqnzE*kFj~sU _i5lTMP0.!tZjH&?Cl< uP4|X)&uEB*D}jE0Hr q{EfɱAعa N\C/\ yy,trGanpx`j;33q+ aSMhbH)vO﯋4^;=L4#7(f0k65 q@G<Wͷ|׸(撙{NgEnM;0C.eNr4]2 F yӀyRz9&c8'Y8<O _ib^aᨾ_LX&#bFͶD1 e= =:C%vF3K2"J* 7 e mwr2߹덣V;:  єrx-2p.*V@%el~#8m"K0<>80  #""D7'rLrx^"n0dQ36tĠ\Ek" y} %Y]OP]7ʔ4QʘzK7VSO)\ ?>!&t=y"!) xPZ3K Ezz*}<t!\)!xCd$vye5K4ѽt֩OXyŽUU$`T$7QR#`3c)f&lZgQcARR,\?**.nE)?Vtbmb*Qd>QhХI85451c ڊFBGd5u4-a]fm_~{?cw vX]X ` t`KJHw# (nc~W}^{:8wwbPJνpD* )O0w O5p%n?tEUе7W/͛|$nZ/ j=Dσlы ͤ<16JlD{+ԤtK.?}6(.%[lrpj`.w]xd~wDNb#-XYfAŲԣ;MaԪ; Ep5;W==6ԋ2me+un߼ M-VN\18 s[7qZ$?cs+\6ܱb{Uli'qۘg4@w~zz C/8ƾf<~;ഹ{cO%01h} 'xql\ٱ8X\fxjjj8 82_!#'#9ujP66NHeOcߵeɅBC QEg݉VMErӀ&Fm>v7DmkWhZ~ ;nF+:t 8s7_c[&WŔ]7n@s%FBHv,~컋NPuBp eZ#w-?Ҙރ(ϨW ^P{iĻx>,QF.*QY?PO"GBe>/.?UBGnt+bO^Dy9i~x!P+/Yaϔh)| d UbQ7#ps)]DUt>Y.td OiKoLI $H2 e Ȇ@@ 9yiD#za![1/G@u'@62Dܽp-)r:‘Pt7@5)3H2 +:g֫ D=>K:DNWK_i?I ,_ExH🸳G? $^./Eiu0+F ~"e3.&&Mey8J#G )s_Aպ&JMNj0fZ([ uj0v,ܣjLSc9GSAE ] J_|_V/5%)vV7h,ʎ A\S0xL2CGpQϙ ?r80rc7bQ1r$.Y +7;: ؾf1FFcp_0o̟5#y4xux`ԩuSd k|ݏ8ەkEDĕX3 abj@BG2;Z-uwݧ02r#w=1]ŸÃgzVyϛmox:{ Т0ghe-MLF/Zbc ﹛ˉQΏv݌v<򲣰2ԭ -P܆fg%¸]QAORF#l=,6<0elWk\k$4u4oX3NGa3K~ r`fx(9U鬐+,,]U6ct/pR#y< эq%tp=*_*ʉƎ1z: UUmZKExw}e+!̤C׉ =0}~DԊ +d(ʀ`jW LzY>eJJY&ɷ4PR7o9J[iV)5GSMZB&MiZc^V n\c:ďpt Zʧ GO? Pacفϫv1/BREQ^=ԭ[}FgHġcв@;~"tOvW}HK2X9'fl;#~FzS:%dQa',C8sX,Ck 1"}oy(:g>gᮮ#Y;λ{P/T&¡u!S'<9~By·Boo Y_$M:`vR3I*g2b"- FzSgU|TTqnkǗ{@[m#E]sY,oڗ#K3H:O&!Cs`dd=۷Abh"r48s7utm#+McU|Aܳؼd<6{aigs{ҭz[x ?u6rGHY1-:x6Oc*s Vy:n=zhb҅1}V [woڜ|:1GaGffp]⇥Gl#|v;Ս G÷ )m)7gXk;tU,W{o4EŞ@ NuKx.3[  Y.^z IDATm*^-sQx(N7TՂp; ?SVNK(('طj,: Uz.WXo^E',g,+fƸy˰xo0.X9WڍT? (j t\p7QCء;^ DV~^$+\ūEK,!5Ւ2\2pOl1sGd-@qoO3>;w6NMmݺUt-hy|:C{l6FL >37qM@ υ翋 9+> / ;=}`_ Hx]ڃn=98IQ.=]8n̥&"V\=w ߳&Q zVNe.cݡ:'w OeZn\'ٯ" ͫhL.aG`m%\M|]лkWlh.TsV| "+Dߥ310β۷MwȆtЩq]LV ;,~YMgOaCe3x-;4ojq~Z Sp]))׋({QQKtxYL^q.h#Vҏ3UBm0Gv’3ډᛯq1XA(Ed=axN˺0/0|3@F~.Fs{`X 4 aU |/mWgć&Pam< O\r2ڪ Y{t,{wYwdiq8|*)C >~{\w~Kwt&o/t.P6dW_X='cWF˪}}s `b \0 aip`ttkw3\n1,],LQɅtg=ؾcW'1~_FEоkl:E6бFϜ.Z&- y^@ߟڢ>6i ˏ谱OG^fLtSנZǶbki휃o\ -Wci*1|F<s  5"G]Tk B`׺hۺbkӦMЬE+wu{^Ⱦ?0})$g3t!8/vWufJg)*54c9G#AzZ L.]m甏g%s&A=?W[蒶 ^: ӬYS'i".B= 9=4͑vfSY8*Λ6;C6=d<)UHyjAg''BGe0߉ߦsE '97]<OJLDFf& qHﲸh#ϭVFZ2ҩBX&+'PqƑMNVW|oq@떾Vzɵ2XLu ӐߧS_-}ns RBosq%%)nN?GG6*9ٕKL6,\t~ aϵ{}Q[9z)w=PwWq f>Tz|ϸ?/ $TV)R9JԾ>^ F硧 Cs x{GH/4!럫?%H2d e dr=+&&. A8èN4ug7Fz,H2 A@~)_?% $H22 e@@[K)#)R 2 GG {R H(( YR Hdtdҭڽ H2ɀh!i"9-##B)R ȑ|ZY> 32 GG {R Hxdfw7xx^&T응J?9/+5!!H>kFJB}xWOOO"&>V⶟?3,L64R d 99 51vXl;vDТM{,ܰ>бs0cz/Φ5y{#/oY|ڠ]hӦ5w!2}iѴO;DlXR,/)e r3qat*A>,q1vl\maey x~'Z7nðZ5>&ѶNzEvaaJnVX M`aiFطs#NQQle*hSO8>O>ǔܡyٯ pKPSb`rt "-o;`ar=6mڄ?"/BA]҇&o݂͛7CCGSK|\i lݲBtffٳHA-TY, 2PBpCz?b-&EHh+6#27O@ˆuqΑ2ōttCg/ô,DahT9 ---hhqt<z^-ѲCLYgpf1ZlMaHQ4X5+z  Lx-sЪI#ڱ'OC:>b'f>| UoTvCJ5o>&N?umGH")DzIQqpBk'LŒ%лK[( +x5l 0Sct ,ÞCpHM1k+^}dYH2P, 2(K|]}8-!w0g3@`riBۦ aܒugjBwZOyΧEg??y,+g`ΰN:! }vKVE6]pްmct?lcVH/Y HΙ}{d/@KM wTWvAJMHMa]0Zij䋭KFK>#aUfu3,=xa~O#llBLA!Bݍ1o[,={aH䤤QVq`I2Wˀ rqv|}C<){/Bbr4s9ra~z75kC@L}$<ɀ .iB*B/~ 3U:cs_+j޾y`cԩvhQ4ѥUc[!t2S^b~3vJ I(ou;ȩa ;{7ͺ#PF!3ה[OuiI±7lMa,NZẫOٴPNZ,έ Q O=/cio*MRRl H+dx V'9#@ {bEl#{BC#^AYyS dnrJdଷ B}0mP';c7ѰN]L_ i>*y\Y$k\@n l>鳿c!ÆWqX+|wp׿#V!=7'ܧ8s64N>ʞ0; ydFP\0J $PVUՓ̓ ?GJ qMtia 7NL^qtP\7WV9t6c0}~y~}˹'X2Jdࢿ 4E&PF29'>px^8?P M71y# ΧW zk ȭq' jk~7_}ŝG((Y(/(U4yyyx돆 lKmB@kj2282A鎤\ 6BO12HxGNѣ)ϩw,O)Rj+%dPH\fZb.5rkeDDBzOGD΢OXw)9M7k} h-ã^CNj}6$r9C:d x&apWAM1w;,T;(.J)C9qUiDf+zwmtЧS NX"Jc e^UD?rvhڱL`"<< Awgf ]{xOv}4ŚOH&53)E\34:I3P½Ƽ-gc"M\QfkuR>!zyR. y2PFbNd?ۡK~o? +YӦ3t^-SJ 'Uث~ gO8%T/&^G޵ƨ]Ѯ0l۹fb2+c̬9-' FFͱx~Ėhh۩;6?s2ZS]TFY>я]0sSR-۰er kU"zg1J6kރ`̸qm۶1p?Jr]V{wAn0{L7:[#6)-UCЬcW܌Q?󹛨=FLov27|Ч]#GBV1U2vY, T/Ƞܸ];aظq#rwΔhy~ly[n9)#bbXż5 71Llc|} j1ꌟbx<Ƅ 㦄NahO82J1O/(z@ىe;6Sykeh gz0gWve 'Fxa'&0p*1V\"˙ vbw38Q8Nh:= < Ӧ5:q6=3ʴ'CoNu|v$XhGLRb3Y\2\p)jb-nfb 3<Ó "FeƯ - ži'…q7lTI D86%aA׈+q0 iB8I5 C$ :b5XJ,&s gb 1O&FÈ!Dd= .{:1P%H %D2^4{ QJOT LkڄQJ_$J* k–(!o62AL3d_Ŋq =| aB{*: sWao]!5n;p b+.cs0J$ 8b 1J `6Cٰ ƨxc1BL`*9|1\B VkfpK`c B$tyBH\W 3aI#B^D)x2B2#A׉k aLAdୢx1xc!Il#*bQJG $LL&d2=ld &%|Dx+4 @fZJgE% d{xLa&7k/@^´B\B(MgXs&f(*1M&&~xh`z(1y41TÉb3Od*t2>ǸP:[PJgk/471]LSLaz?B8!4O2-0z /04T,S: !ҙ#b dJJg^*5*i _EE d/+j W6GQQEfX= <6(@(J5+'~s+\6Cs 5%!|e BIEDcǺ:l\Fcu< M &r94yb-a y똷yɼ=>gF%Ndx$s!m>am"&r7yMf8my6L 1u1!l$mʸM&2`ZsDm"MkMl9U&Z(l񜊶2]m"3G5 x64G!D^&5*6 ]%d%m0s{!-Co0ƴ qqcB&:O@gi/H&:.힆5yUU8CNM0zR2WxUs#M46i ANM]szˆx Bԏ|+Z=QCN&b@3pEB ǐ9i a5{+ߔp*/]˗q1񉊆uQ!nMZ%FH~N05K`bzCʮ Gksxx&qr^+2r >r`uEsJ@|V^> MK3> Fv^ 1~\tlw36MgD%TIJV7v ]CbAX\Vkс#$'&}sU5X` H(T| |r[<|`%ɠ OwQ }GUvP6B7|4s*WAVJ4Lϫa`޻F@y*lMxX`dcgĬs1Ku!i)%ٚHQ7;+^X SA:޼.}IN2Z~5Jm=ė=<&Cw]}xqd>0`'vw?Ӱ YK? Do޼oZku6[Kp)(ڋάUKGaV2 97\€k(M10_1lJ|zm𰬱 Rq|^Sӻ@ЦSO\vA* pCzuYaagNc5/,³;P?sfavn-Fא+F8rZ|7_[;tw/F/>wYmMGqn; j-O1qP:/Wbt!ܝn"]<'S&E{h۔% _Vk\w30*&Լߠ㑋 gw&첩tL4~ oh?p2J # 0W{ltM.L иi[h^DvAҡjW=0^dqRJLGpA[ZشJdSu與|҂kCΫH//s>GN-&G/pZQQ"2,Z@b\ M.!eb)o9puɑR"eE{ꈰݪ GkZ)aPX=1T2HBc sB0{ 9ĖN߼AN3436!fcX%?e،|('X^m{ƭchޥ/^(a4cJO{YI3A{>X3Dbd1d6Q9G0GӁJ1wGA9ۑH>ˇ qp':ۍ5$dRn;CH 8*m!R`giܪsH_^Aۘ*u"Ct"* d G2P=S q`,}7/ 2(E }RU 5 VdPsQE\X TѪD᩟ ftZDZ^zߪR2 iWX@n٠n%2C [t"oȑre#_}P82wOOxn%pGE< TdI2 dYNvfܜP{MElLnZ[ 6ʐ~ƻD%j%)'`e~E@[,ƿX* *3h"\E߮QuOE'#gY\HG\2ǡIaѨuWxLF64FZ;оE+v:E>칛NVpNCQaCXqQiȥbXfjtkC&"25+UU)5)]+U:S?Ut)Z7mcU:1G;|_aCnQJ˅-U=M++n \$'+ltWhu.*.zK#| ǨQ#0d 9 s w-6̟'aСsVlG%:;'MKxTٽb#ľ7zcO©K-Qd pEq203Q" 9SQi-,ȆOݫבRқdguƏ|)3amX:oNY! qbsnjw" p7VtdccaFe28V !Ϡ#X-| B)A6R |,=:#,5SXY[P!vTrd0-zGQ> |$')Ln JfI2d ?j)R @|F2 zThm EZ?^8*d5g{!mU9"t{"4eIq\Nm\%gdt^W>_VIa_A\чxZ#n}Tjdr-VO15T_Vf&mx.R$UPwC4?yViX?հtbó;wG#GpB] par- wMalX[ez#QJKD|>Df% 1y=&$W3TvW»5=>5 ,zy*\TfR.>?uZ%AjES20&l4xGƠy2 ÆEж}gl9v /iK{W%'d sc-:ȩ.WD}a#E չ,Il Q(ퟵL^\{/K&t, LPGIP7 Vwxa ?Ƿ-DM[2ㇸE[+Kܥ kv .T >0\Y`n彪tл^wrA?0b#.[}e#8\dD~ ix䴸Χ9  j'(Ƞ8^^` W(|_8!svWgX:s[Q W윊l^J`L51g ŀ0}rE4m`PF.P2sWE`|xZ^Icif`ࠁx%c"am|ӧN2e F ]sgų&Fah\{4j)q2˲\)py\ٻ=r7.ǰ!13nt7wD^IO,N:Gj `,߸ *k 4簘*o3=^u,K)"բ|"e%Li8/^m{d/0} gcZxCU}s:l$ׄG BKZAIH [ܾ8{!!=FEx%Sj|W< nτi|X?@G8uдmr7lm`mcϞ@c Z .S'IvtbΘb|ak{F! Fynp,v⍥3~昹t-ً!Jиm5/$;v0s4j,^wqZo 6EGRS6K/ }T,+ۯƫBu^G\OΗ!;E{! j x:-~/E:âc\(}MkPks#jTQ|Lzu[nkioﭣ?zBq'@ĐܭS(^(P4IIso>9 BYkCn2{̞=C6K"WKQH-;+٤fM?6R ѺE{X˥ BTiF MQ_q^:vу+fO H^YG9YR܇d7 a?HX=E?n?Rj*#ѥ>\_Ъ1AT:Z1tBDV &PFY KqN 뇾@qɪpB"MKN+'NOdm+}z} '{kĐxQ/Ӯ" MdD-Op_cӐs̻VG) L=_reC&;6)CC-Y@zB[nԠMmMvwUqД&ǖ_`DwwWpە1(WRG0m tպun^h76d&J C\1&fnލ2L%07d޹ͻٻ:/(vNOXO Q?dzB#%{lu$0ABL(_ CNI1}vϞIs=\+xX^0P@ gρt)JsJM̢ ~GgSNd΁R9 (wܤFm)x '7M\*0hB- k cbŤ6sʾLlݷ8͎-q%4xOT[=G+L믁`&fmZ0xV[碕@XՀc,s1d,:a}SWi3š1b22 :qwkv|<R9&=wR=\~bEu`DŽ Ȑ3.#ᩴGPT_ C >L IDATV'eFiweaX6]uq*C1\_.@RHfPsL%0}O`T,Yp|pj9J&CK L l ^|@N=pYgQE+ B3%0H"̀fmه Uf䁕hվnY;SME;7i *jwG`PUÇ_}X#NdX,L)c>isc~j4/Vx|%OA*Zg8Zqg}.21Bm0e=p7ܻ|S 4EiE"EC%E gx@'zNAYo.{kk0~;iYʑMAlܻw=<2g-(~85}C{0"w77>6At\B xpޅ-s%Gvjd5}z>ݷsrQ8CGIb|ey  #j.E}BWďR2!svXQ |Ծz <|63ޛF0 P҆l Ԙ@IQ!'!ׁANVs缿^0`|$f#>%.5|ff:, ,x)1}"L%*Ie3P|L,i;Z!2"BQ+\Kax׻YCY߾vgq1ܾ~Y&%kn?ԷXfw ~ Uf]&#|bBx+=q"UzJZ=pdifYx@M{{FF}Nt 0>3yԭs)LŵpETt~}s& b̿8=a2>x Sc$ m)ە g_nwcFۙ@ͯb~ `cWOjl -{O%D]d -y?2\h~^ N?9%>ۭV s3i95Y(p\zrreKHJp:`CybÌu A= G"<< )`u C+yim!:&%heV6BB%ٍْې#>)%e(Gb!ޫLOi3xFE>7QCPooIfJyB,1om44oH,6D/Aٔsi}1tw# Oa;QRri4+9B EFA_=} Mf[U0xΪ]x~J-}L5U3vNg(Sҝe,ݿWfԀJ'L[ i\O1u ݭѳЩS'_A1?< r1VL'A\ HLрmQF!?o]JKezj o :x5xt?*Qhwj]vQ(碼d3մ'IKM%\I(xp˧4a#LDϟ?1MK}dDHi/^?_>$?>)0|}$(h)N&-ހyTSyF$ +!k'Fi̋P+kIh 㪄anX>` qj@t"n\^%*<hu>KOQFLODJRu*tջ`/2-ե+fo<P}g J!СE3[q^1ȓ/NhR)yzJ(_ iU;+3ɝW p1ёaG AVm4i KvC` &jV gl6.^j!]4hݬ)n+lR"yK`wn_toYe5H]5l}Mho"ƚurJZ8-6n( G6/SKcӎp FiRa𖟡CNƼ˱aN9y*?ϩ=*W@/7xm:W`&2qo /ʝ ϞV"Tm ސ%m=^thٴ Bd,\.ʰ9(`i{ 1j/}& 0Hf7KqE;wϜrZ5=87EZ޾a~/荙$ ; .8shC`GJ~)3Zfz*RhU$W@ R3F3P koY _Np}\࡯byrr?zUaN󧈱%f3Q'4۵+F+s \= M 9 K `bK R}?,ڈ,6? XMgu,?w/G玝aJ{O>i'!]ZS[٥N?4qrE@,6:B>{ -< 90U)j y`yoа;`kgGH1XI=m fhܼ-f- 6f{uÿo\ MjZ\(3PŐs¡3˿YqX@tk樤tZf=`Rh~:j]$7~_[cĔ98.e~cvQ``K:xVm܎`cr? AK5=xG#=a͸uϐ6 1g 褍Gv.* &晽AXxIYxq=~se``oc)ijBCQ RGM+-[iӦdjRUbq6 o+\K8޵ TA3fڋ{g7C& cSi%C0,CK[ݮӵPiiƤѻ9K1}inNu$D@>~>|Z+@Lԧ5Qb>| +447]ڿys}~u{_/ 0Mz?hiY!J.I/_||ѐ` @ zϠ!H"+ |< 4"B_  GapΝ]rDA| k7B|~_9x$MUp0_>whk |<ڀ`o߾~N~t p r)ڡlBWΒ"|aKaR  (""*qwnZ<)eaiL>= @AQ&}Uۇ5^J`mn KR61{P2'QFQ^Z 8;ڊd}W^ _XYZR3^ݹ9K{"%I{Gg%ժ'/-vH^o[Ae f7Bc3P7$ԑvwZN`ԩW?Rh7wM/=dOsYXq☘h V4w9%9%P`ҩӘhDGEIBHȈ1""<|?Щ))mU0h4bZ1͘vdZ2MvLc5Ӝi\}#+~F;stfz3ݙhi Wg=@%oW:9\xnr)DNYf{b(X{tViGA5B'kr{BXݧHͽ6  -iBS(/i@M'У:Xb 8PNE?U QtAf((/=K?_{k0P";ڴ퀁"#MBW}x%u*+)w i69옎fT${F0zB S~9#Bxx8|||HPI"1. &7WWZ@?=<0gg'HB[P^^$BgC)NT/((mx?ظ ӌiBiɂi4f4g<<' <+~LgtgKuފ~ s/ ??>E&#o/O$$É竾{y)!tw?xW.w߷rZt)!Vc ]Ckw:weR ~FR:`Kp~^XtT{#KReaӶAQY>_Acq1~7ѷ\{ɷ9"0sxO]+P̠`U[JKDZוu:c+Ѵ hB+㲑Xmv8wơpι;`/`eu Vǿ7r?qk8;7]+y_72Bvn,^Æb 9J+ja]Zضi~e9VZç =Oe&8|(ܺT/ƭ/Փ7/f??Ruk7A]CDvH d='լ-.ZpD B~y߿z뒙Fp{dgS>(O (;K 7mW\|d!9m6v)Kݳr$6.ـЌOQoYd)ʳ'pc֣Hȓ]۵~ljG7k4t.yIQ4/V":n_煷yC]mD[j{;|KR[0Y 8{`bؾ}Ν C{ g#ꭂD,%RY_g:5]c]砫 +\ANi=OAo܆cF(%c~hҲ#^3캡 ѡ90rĺbTmh) 1!M;u/JVN;+뭉}ce5y$:vÜ5{PFkGe?~ (㙺Z E`@1{t?ȥ8FylPVް7+M 枔CA/{Rg.epu))WtHȝW1D[[(Y:ןirJҊۛ 'yx`ʧ0$0hֶMII+ AN*0Pj$/4k4&5w񩩒_%Eϑec51f!<k Fia}H MRSljĘ~k}⺠a%>'4=JT80^ʠhB9ܷEIJz?}RۗEF8)ɲg$ܱaZ_ )WNxXX\Rɪ݋::`$N"X]ݵ& .3e~,O#6 *huڵjkwŸy?mqqݏCc 1 r !d=5|ߺ#,n/k=,!in!Q2bqb2tl%ʋpNDfZ.Z]qݚlz>[eHdff";'6Qʫ6[ਝk'> :`H=Ica!7kdOìQ}1|B >1:2Q%򨟖 @hѤ1*v"=$]$5:Tt7`9884 =ƚAKϝ_{rRHljMbmӋf;oJsXblop|KmiZ:tIg 4:I`!W(Ezs(ig>S&+CU? n|_K$ DC4&Ӓyu}N1҈`zi @Y</w+ʐI{x1cM[o(!PY&n-2Uܭ Gqf'4tçEB=N`ܚ @ é}ѭ^:j spbr5!$pmr4dD-/#g,B+M '+&Mw\e}Rd5| Bqv9dz9}w,9C#B˻A141x hm!غakYMdM46;h(_5+FL_߰hI-qm{x"փ'/":=W[&yU;a>c.BTheEgƭImVFC>h.Y FgAʓ`P5 65v9 He$)̌E7:ZWr@iY[5URh&u4HniaHa+*ozŀ y'999—,0XYY?u-z$w:(%4`DC>E<Ӑ?| |-,%J9p!yyzJg*@'Rih>iUoGBE[!a1LO>se:3ٽu<`تlڿj*wX,_6cp$ʪ\^c4f/Zd|ck.f1O/:sZ:p=-0]u͞w6hbߕo=8~jf}Iez~t-7#n_Ď۰uV=y&c"eFv1Eiwnǖ-[1ܹu' $\9{͛?b@AAgwmۊ͛6y؁= CyAr2pA\e0vG:y"qduƱ۵{/.^7$Rpx{H}A 2}hI+3z6c3ၓ[růwįy L!mj{lV wQBDk^lJE(48XJ˛_ >8e'ORt鬂>'%DZ/)Ëͧ)uFZ$,SF&8T! P%UVe>8Jw"4kT1NKj@ 倎9Lݗܾz 7.69)s}v`hk#oRCc{᱖žZK!h=8lWA͘9m!(X< @W XhWO0` x@&TLKάw AN8J;48)o *rTVT|EtXۣ^䁨PJLow:&)'7-33^B{K>]6lK)g񉣭S_/1cO0hF`ca?|gO~}簷@tdXM|B^혞>ϟIډ+ ^_vwElt,]wJR<<\UkL bẁ(MKIC |"6 x}YQ<\]%ʙBV\YMs.! q1h/@A- wMc#*' ϥpݿS/9 4}tsArbK} owT.-.~G;Z\m!N>jsGOV?{OܭGHJϮSG)&0K`\9w {(@tכ7OwZN`T5=|aBC@E{#A 3bp1j6zǓd&b"pk\4kn8V 7 j8;! EYR)nC86w{9}!LPJdkzMמh.ySE:a͌~)giA46,aUJ+ro }MtqhZ獬ㇰpSL{^8zR?-|R&:"%z0Z|0>tDeq{:t&.MtA_47QJnzڇ#BWGz`(( =\ACcUS>QW 0aBO? ѩh׼i>}[E_,iR;ps< JB95]\^N %H cȡk%q:o0&l<?d*7kʣ꽊n3{ qaJikn١D^AV{dF!m◓*9?͚Ct7p~~1w\?h9 GsDcpdѼU71s8TF+"M t~9SK9K`r} ;.4z%0+6@ V }͋ XՀBXGK‰8v-`Gf~f,mZ 3q)_6-i KFL W)̞2Kw]-MōЮuk菘'eOؾ-L\bcÌϰ m\&$CFJ0g3QהXKkB~|$(VߥԻÿ ~I+`/ EU g!l 573R& d'mƖaq8'T$`yh&밴đ]kC] BtZ_c+4 'C{p:j|.FGѡuKjbՖ]ر}3&[DznRsV}_GF%  @9vB v--ϥ JcaH氩fƨ=I@L@B}wҽ\8#: 6:#fS4d2dse%s2D:bf'L[5u$F0N(=׏K!n=wYSjI*˓ZBm!,^"^RCE[)eŹ`˼Ahڢ%:>3_~GZɣڈJMfͥ f))HM Ñˡ?Vn~ Gi.ZPӷ6xt;^(b@ӾI "y ]{aX=|V!)/QNbBPЀ6ttuйs4nG6N(-)=˟KcqQ:r˟y;}ov;4hAωD{o1#. d}g0` !i 91/ Ї.#0@}$t$X#HN4n }`?`ȑ>bTF0QYVXt!ƏAz=ѹA+"8@o=?VÆǑȌYz`9B 4 H3 aVM1x\Dԭ( [Ck*0嬤5Up(7Wdi}k'ԾrT,5GB{oܷvD .om?7F+?Bj ϊ[%/%e;ߢ ;of*?iFU=L.!!-S椅J`hO~<`mnYVB``02y0`rڷƨ[iu];3m"-7y~NvT3D+v|F<$9bh]4qje$"e2 s@l~*IlAx_2]6o%K¼\ LJдRg2)f#3GF;8zd<> H3PhUi H gXx Nndjr#;}QȥX>=]:F.IiɊ< 8ZhFZL z\g8~*L-`ng vcX.P 0%leu1v1J^ 8XG䱓'MBu)@!@sRnx4kk-Ç0ك-HUt< QR# 6'@-|צ;[9fP3&H%&Cͦ"\3m:v&sw#m߽yn/ŽkNE> K;x/_xL[vjKG El҇fCEgHz)92;|Q?Dbv:]MhhA0h@飋1S?9&@W[ ڽzc1D:p!n<`բֆހR}!0}:?LIceH}{p8EߋIɀ̝:]Ԡ݃Cԡҩ3F\ wGzbڐD+`@7$zE{H>ƅx`:huAgMUwtnlX5j' 3sIS&O_ɣ箙5yRJD[iL|nanLxqd6Su|tS~ڷ.z}"8+GwBMuCC__b$)9Kq?- |<`caJfZm ;g$K:Y Tk89;#%E զaai[[Ӫ3iɱXt̔~-\2GHu*!a'G{XpT   ^(~I*I8ʊb&⊸d3,9;(M\Iv$.⨡AB Ӕmdq<${Ҋ^I/#%L_;B Ypsy.nHNc >ے *7([9 'K2`!QFQ\L$.ZD)-9`lf/8_ gwهQ!4 :H >0`ۄ#‚aLn>ƑG}%,$*5@J%/Vmё=^10B^)g?lWg~SNږ[>/ 0)ܰP"?Gkn?hpDh0:0ƐG}c1qLҌyUxUXXfPN;֋1iHܷ}(^/;^D{ ^bW} 6,< D7o>Fy~b ]6zӘK)gݕq}gY~Ǻ_o_i ׌[}}(ڧ b~ 0` @bmS<+VZ|< 4"BeHnاIENDB`fotocx/images/crop-buttons.jpg0000664000175000017500000002514315247006660015443 0ustar micomicoJFIFExifMM*V^(1fixgnome-screenshot0232T0100fotocx-25.1: Crop: width:282 height:119|fotocx-26.6: Rescale: width:254 height:107| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 119 282 1 2 2 C     C   k" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?NET((E5Au@*GPh? 9?/ D΍RWӥ$%ͬБqzW_}?U񥭖حz5 K]f#9HmТڧx+U^ %>X68ڸS@MZ3Zn?Lt!IG*JV^B9 v"?|M]Z Am[q*:_| WL?t[orsFIPJϱ)7x>~*oCZjLuhLNz꾵g|I~m-;C,X6}<1V=&SCԭum6\캴HAWu m6k h$*(=+Þ,]m'vTѦ?2!XvǂJ>!/xXVu}^\. р VGЃ_&'o72mZsc:p[=@>|2o|1oGŷ:5owlԧ 0>Nh5K;gWtYnqyƹA7It1X.&##HkC!mo ѳѱG(wX<2\s÷۟w!0G_oJ5ˀrQB+V/cèW8Ϣƥ-~J!lvAfkF@Egk_\ϴ+ƍOƏs>K4\,hXP?'Gi?.8_߳~/[xAKdwm8_sبٻZmz;س8'k_\ϴ o-)Eݠ+7̊zISxa?>W쬴ZEU"vOZs>K4k_cc7`n.%Y@ p=3Y_f\%=.}^ afVڍŹC3"7穯B?'Gi?.8+{x vwĽաgvp0s*ïٟ½Fú^ڛ幾- #*: ^OƏs>K4\,y߄f/^\Hk۽嬷 ܁Prz P]گ9hߵZ]^:JW+\ϴ}hX<ΕXxDBs,KRx7II4{i[{ /59 #F/ܭ=}To\?*IC_׼YZhAo3̚C`coO>/eY#RZ>,Bq#ۚmX7w.MG{ymdQdò$g}++xifvsigx73pJFucކ ܓpq$ fHap] L!}{&O!XKH۲u)<> W(?˦OA9Ϲ+(&ߝ̠xɢ+a7ds7.^:otw'Қ?H'F9yxwxoKIo4eh3Xi-U;2Ksx#$'R]}Vj@$ij|%i }To\?*O*ǃ}XE% #l"2HcdS¿v6/^WPcRI8}]A{@U?+_ռC JDͦx^y.,0Y U  hU-7m7Ski&~:q{Z%䲘ə$,{Xcir'}kU>4QT.dCtoR*8=?Z |Z-ߏ9E>!-*[ۼ1YՇ?1 ^zy+%K2Aa4l.gaԛ?Թ<ܟ6_UNu5 b/?HB%MȲIx %QvW=}To\?*.յ(, BBR(eK񥟆GM6f0d~T^Q7e76<$h f2G vjoy7?t 5\ Al?1k7v:e/9L<H}L#xG^}yh[r.226?Jzso*-,x*EWZ4:[!co!iL$|P2O5߃ ~Wᾥۼ[_Ao42- 1W}S3gMR}RmSD׷S?cυ2S_N7W:GBH>`eb zq^w!? J>٪zo*.^KFH Ny'۸(ذzJԣGhZIQ"RT qRVk!9Ă@6kWX>"xo\_WKѵˍF{ $b@i~=韴xX06oowoV]W9_Lg~Vs͗?ͿmK>r!|Y-CMԾ۪]RYbUUfi7d[ OPGPky$XF94_ݰysʠ ݿL9sߚu 52,\yr?H>k!//š}Ŭk!xڭ$R`@lwß>!othX[<(7Iž_l=qP.u!}o*vV%RQR[ǖl[`P "r*UCcþ緗SYZdvx!2Jc,*Ž+^g|7KO9͟U Ea5vE5O-)/YtK9Fy<?ݢ &XE9AA#֑G%@K k:o|+wGT`Hq$ch8zW* WWo$Qv}nu# RL͗Ϳ:5߀}x<|j𗋵_Lƅuʂy59&U (溿xVǟ[Syq{o wQ\.ԎS0n 9P7Z&˟fU/<}?rGkZO|Ghwze.~ȳ4Js ҄`ۥT,Rjϔ`|j%k|m;ğOv[Z:[X[I3 eG 3_HA70=4$lH/ffV8o*M]X C)zwR?!%ly0lc<׆i#GS^/QXsSѬ1zQg3-re\Uioj(MT}MU5[}?>79TP?ioKϴSQ@os->UMECi*MU5[}?>79TP?ioKϴSQ@osO>kTP?ioKϴSQ@os->UMECi*MT\^lȮ{}E,4DϥM+i*MTHu4{n\edGMT}os\^Gkc*f5?dhioV}؏MDuHHϗrGMXtICCRQEQEQEQEQEQEQEQEQEQEQEQKڍs &-wZծNO;sGNpM}6X|htUn$lyct`rs~x@sOoWFSo\'\|Zi#z^!a[9(l{+'$ Jcz5cѵiڦH[k{$?LۂGY 1[okhѴڧ4P;"ȹ< 1*O{OSƶ:^w\9`1K Â*&҃Ews)mhznm,64)E'qi<|I]n oO&|T/k;yac^䴁Xن36ev[!E Fh{tWC]/)ʌמ|,|2t>qb8.byrp @sY?ZħsF(((((((((((()i(#S[C@t t#<Gi3{bTs\A*(d4sR? G{^\]0hll$c'VB4խV}2 1 2 3 0 8 0 366 580 1 2 2 0 C     C   ?" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?$҈M8<@ EPEPEPEPEPEPEPEPEPEPEP4翴, 3YŤ\$IVMV5 9uֶ٢)@'4h9TkXNlo-< 2U-`FGk< w_C |8uj䫨N408 FqW|-Z53:>!\Z2ԩ~O$QnE۳)F3ۮkkoׇfڽ6Ns;=se|8"7tM:dkدuV2 ,0J@AAMO/O0t(l4 Ax-\:HIRV2exkm<YГ_$.%cJ~gy V3hS^(#ʾP?/Kw%𦁣M{_vCi;w+7o@a׾gM{@f:?2ʹ|7/~ 65=Xəmݜdg]((((((jƥgfk#\fcր:;}FڏzVp}+WdlGz-\o4!!A@jŴn˖%N2fddx~..=ahzztBi͕1dH.#]8aj|e/x(u*haϖ,(W$f4ɧ m֭Z5gT"!.vn8xw6^0zt q`s;I>ʺ)ROCnEfs1FI*0FkV +&orO eQağ'J㱵Ebağ'G&OI4\,mQXi?' ?XqjI^wxݸu{&OI4ağ'EGφ G#36Ȏms#8^qOO AUw LG;qE%{ K?űs;{&OI4ağ'E͐~wx5%_qjF\ <߸:쵏يXx55J ǻ"Q}qtaI?O&L4hXOi'ὤ,kI3bV4xZV,g'k4]|@ | ?%Εk=vtFFQ,pA8L4hI?O&fo^í6ƖS𾼺oGjDJ#DBM^Şg\Qknjt/4n&w?'E_g/ ixj;-1Ma<椣whɮgL|)Z&qgs aeH{'-Btx5md,-cP s?Ѹ!?/>4xw'"hCsqq7xq>heu%a#>{^9UY|EkYj7ͽZ#\;ćŒN;z4n5?j6ikiY4 mغ^XOһ3A𦳧ZYhDQ,ތ2ǯ4}~<i#"jkK{V=ႎ83,sFM8"TPX 77ߴ>/jږìi\Rw衆FA9GQw1խF2Iǖ[ڕƍƩjڵ_jWvpҕ'b(6$-?YZm so8RHe[ FMb4n4P4n4`{9yƣCxJ-n5- MBXtaQJݗN7dn4n5oZ*n4Kd6lY6gu9bt6@;qqgփkko˨"vGϻG@sJo4n4޼qiH(cWźGHu -GLH"Q6>? #]ƍư5h״=Q[mO\Htv ) n!ۍ6;qq@hiP7mƍƛE;qq@hiP7mƍƛE;qq@hiP7mƍƛE;q}i( _4hq?]/1W5O>0/gLJkp)H˨#VhyW @Ȓmf+ϵK:ռިqw8E-u$^w]5{Xxm# [s;QS{CLJdvEA5/OSAc&g|KwAᱶԣ:EJh<"ylY@ܤ/ ]cJ  YbWmSR9"IF9g >aMQN_ az.0Wj,R8R=- ϧci`o=cZ]¸m9R>O\'|3j7\iI$ I`(Xz~)OxWցYO+-ZK1% NL!m;xmj~P[ɣh8aYݰ_ooGYo^i15Hml\W6`pJ w7m 'z+:"ơPi`jC[:kQj3çYڲEn@R܅RΤ9 c7_zc>=][ל#][_;ke]$s־t /zzimf+mc =GC]=nE iir\a ~7^?~З~{;y/mk%'1a ~iIg!|gi|E'xuGwIdxWBXbn/Zmk~@-)2p72@jɴc:šh#:Yc /)lx[`G|ڽey=~)\ӤF& 2TG=dо"^|O,2 1Fl 6t>YLA$ }] ^X=FB Z 𶿩 GT摩j [ar1^1"}Kƿ/tFO>4KKtf%bo=!s[Mi#WZQUӮwr%&"a8PH'qmqiYZk HmIƄ ' :P>ZῈ-Sn⶯Ǹ7~oЅվjAMlߎ3^7E2U7N&1j,c u!{[mhk0kGW nK}c \O_ۃZ{J:`&?nͻ3i6zx2*<ܧZ5Yg/6IYdn7V쵿x;N>F ]? bh\q_jx?A/o/-4M:q$q.Al9W>[7R4PX eXGiX1͟:-ƭmjj:_$6OdW^~>.l3ִ]CT,WYd[A[|N9GQk<-KCƾ!LѠ湖=b=*oxՋ>6XnHjRZՅ[j鲦s8jNFӓž GQߋ;4y Ӭ.oSZw}|=F=+Ǿ:iguM=fBw51\,`2FXеvg}_zP:י~^ ԟ,kℛ:{g2-d3v?+zW V+ hjwvow!w%p.F :Sg,Vqo%ۼT33U: MRjZ.t}d+">{ji!\~ݫз{n[v*9j-;G۵,9j-;G۵,9j-;G۵,9j-;G۵,9j-;G۵,9j-;G۵,9j-;G۵,9j-;G۵,9j-;G۵,9j-;P^lhVZC4 sBz]s<ZjQ`1~})c8DgosYܡk?W՟L8澞Sqȧi %f< B_k<2+HdSGF+؀j#G?IKcohvBQUbnr?n[vj-;]uX.r?n[vj-;]uX.r?n[vj-;]uX.r?n[vj-;]uX.r?n[vj-;]uX.r?n[vj-;]uX.r?n[vj-;]uX.r?n[vj-;]uX.r?n[vj-;]uX.r?n[vj-;]uX.qkwsڥwg3K b2Zd*tR1_auOZDhaIjd!A=Hc} C='L#wȵ. ^͆˘lmf?,I ) C]3`_b|9.?;sIu',+,Q c 0N3IC'hx]*KK':}O#d]o\y90r}'9O!u8> Yj1(Msg9>'/ 5FGOkpQK9!2a;#q1_gw q8$ދ >&|6^An'q[EgkVQͳ2 S^)𵇆<%xzmwEۨ?1BX1AisJdaxHCl7W}ŴUrNp2kVWoo.Xx::xFh,$s[ +w93OVGʚׯx·Hnuo>y f!CҎ֭ÿs? /C?5|k{mohڬɅMՌ`cmix} (BKVG?"TWix} ($Qp= /Ͻ[E^0{.Q^{+oHKVE*+a>mix} (Ey?"/Ͻ[EШ=$Q+oHz^0{?a>m\BKVG?"UEkѩ\?"j/}N]Ol΅--T@px^C~ B\]]NRnZ7%qb%u{.jֿsU+sg@?YEn/k.! H!U"E\2O$/<3_,[PsUfk3jihڥŤts7 ôTWOVG?"= /Ͻ[E^0{.Q^{+oHKVE*+a>mix} (Ey?"/Ͻ[EШ=$Q+oHz^0{?a>m\BKVG?"TWix} ($Qp= /Ͻ[E^0{.Q^{+oHKVE#1&\kwWZk }СkHLm{Wmz/‘HVqxcWmc[K99ΨYCcdsLٳVօYKӖC2B!%PA 7)ggs?\\^Oc65Q[ȓE8rvx'0:fqVſßך.ԬV'[{ Ζ("GÎzsSߴï i,'ڏd MC[yXKc$Ҙ,,ɵKtHOO=ڏ!-n4#i 3S$֧~ ]|Elik7 =ș7 ZR&Klp@=AwK.kc4 >m{yYahWfb`l^> k#^{]+B-CwA=BJ0qߦM|| géش-u^;k{J&B)lnUsbtu |?g&Іesu,m3V20F4Coϴ&Tmd/'|v08~4 {RfuO^ m yKv$ٳ;}1ھ|ž_&y.u[#I"X/o9nPUu>Rּ3.y7[I1#$DEUY@eHOy=焴oZOXZ [ZMRyEA+HU$(A?tLZɟGFz(ee* ꣑֔י|!nwi ^#𽶙V&e&pL`sW85IxgzOqtўy^GVeQq¶wsK~ ԡ/ |58/cY9"Ew#UpH "'ǏaZ? ܧ%P"[/}/0N:Q¾>_rxƑ'oƙ{1|07H+3ӚlGmOϮn'$m F%$P6xxƟ:ú ?`˛]Fp6N˃Zi7o1;#_~az5 }d]Y ف:'#h99ⴤCv<0wh$F8MeCM|i+^-0C ,ZYH !Q<7}w=:mdǣM* @V| 4Տ-'L^]6`&{H١~VgdwNѷcm|W2[m6;hgWt1K3B#`;F2I^1>;7>^ٕUQ+AUx]|tfH<"t(F6ZiT,9U)Y^NN;#^xW%-ӥ,6$'HN>dR:Uk K%siK.P59RA1gךџqş-.׼ g13-]#Ó}ko>xO3#-wJ&LTHU}Lu?3<+N΋:񲺱VVGсk-?kx{#c[{[OFj(P ;l*#> |k z,/-MOL4a1}gXۢ32uYrvRJm>Lx'~zv |l㲸Xxe ycO |_ä,K]?KiqG<#'\W~|CwoƉůtk+h%0=If\Mi9##?~!|= %<9qOJ6''7S_ ߗ-y=|l_ltvm7O>Tey *?ֿ %DuѨ|բoE WUL0~ b񇃴ñxf_U W\qNU/ ϩYwAЗr*|G|sҮItgMX׎5:->{bۻc / g$T:7##O\zOqm0YRf3o#ᇥ|~tMOᏋt#R.]CbomH;.Tm)rTY> j?i|"ͦǨKK 7*RBzRk6YiO//>$>&MfKIބ2ߗ "t/WaKw*]#JM;Sv\hDhfO?ُ>[|.Qф2ߨ\Zp [&ֆWhnNh>M47V*]Z[?@5FnOc}Tfd#%[Ɵw?} X}%wv՝fLL mBK@ G_ i-V*Aep-d-. b"? SySilnMn_kvu'gY"4tXa<mGZnżI3݇;^'p/ ~M>m^[7i%џ6͙*Ud7w<hk|닫$qF6|"'s~|o%ޡ[ƖFB"K&Y,s t><,OW|[ܷ7gP([]^=Ǐ|Vl<9{qso\wE\099E?gO|M FM^Wѡz-ZoD$dG6IPQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@ߍ5[ǻ~fxNaUCRC:ק5C4 Coa.qiᣍFW^>`ŻUƿ mծ]gѴV\q+nEqC>_15]Ʒ+\a | <{8WY]GM$-^7W#3@g߇KWחG\T-rKvlmi4&sg_IV/%r::G䞀MG^=yUN޻xͬvz:5ՄdyEkdaAȭ~𮼾' }5moi-\ARtz='K;@k>mbj-@épH#?h x^u&PkZ-jyٸ'688 ⟐Q(]Jho g-OYXCifX#Blx1O];Nt 溗\ r!MA~ѫm/YM Işk3q*J}Er[fE}ͬm/mtHvW.& !C(^izKȶ#Nہɤ5=6k9|?i=˗ yX\e䜓޼gac]_>M?S5 Vz|Mk gh2̤q + OSu-PӬ^k2ָə7p123Eu0h:=2xz&MĒt.2zh?mOId^kڇ648HCKRɑ(˜eA"/ x;/h .",z duP(+CPI#w9].@\?&`1_I?|Hu!okz;:$X5}H)prGLWYO`4_|׾p>jߨ[$k"u,zc?S䚉 NCFJ&ऌ=xoϊ|==JZ[}6E"$e@G֫Y~5[M^ڜ4k6\w4= d0}.OI|MA='rMpk~^i4.u+sM{h|3sH:<-_ѭu*PkZ%jHc0 ]xV։skw4Jfp d\qқ O ў/:?=y]hg~k Ӭ7?]Vg- h`)'拌(FqsbG%)~HY|PZPt5D xF/#ccuY |4> >'L-vkniI"=Hx'~H<];+Yn6E (dy@ d?1|Q>hxgSm3ThxI0 # ]N| ?覠e!'1$vΗ.?45:y~4絼5ӿee5o>'έ%S}N4FQ*N0~x^gCs^k]ݰDXZ- +n/jKRc=sއXJ"GMסt:5ť1)T A*? `$umF[ b;䔰Ddzؠc?̖֔|ghI7V[^jYIq*Oj~%|>#x,4xNCXI'/y{yϮ?J]eY9>G&>+ Gi:/bB'q֨|)+{cQWGB:AJ"g*v=3֌'8jzrly(}v(mf4{/gð5PpC9q~2]+׆4-OH>L@3l|gvPBܷ%  H9ץ2yO>)8?/*eMvL7@&@RG# +[P%O4յZiNW7j1*BW}+((ڳJ]4Z-]\\ O-rC1%xM n|~񖅨x.Ě٪?u;ぢhrXr8C9-3W6zfN{|[L˼L]A +$c {?HYgOo.%/9ڝcGO9n|I5H[mD]Eҥ-鿳GxO/|y]+ ˧[+F\s$<^?ǿ/^"Ӵ6>λZ\D4.)qFCzK%\jaxy_GhG*8٣%>%ŚCxwU񖲗h2JBýK #xCujW@b[ڪ5E}VWw&y#heUã 08 c8}F+K?>)$ևLm|A| w \@Ube@5qo k/5HOs5Iso?!|;O5WOP𮭦5!tQ 3)jM//|BtZ\Cq$ƲmIGlEH eƽω1cD5:/ qm,ͪsSQ2T8v|_6hvz玵-Yb$3DBqA Ě=ru$<cYa&TY_/}&6wK ozD8dVoMrE@if!A8=9=雼G@k.3 %fݲ4Ն'$mi_׎,:Ju߅ZC]ZIAj#Ă9Kdl`-p+N^K-nU? sbxHqwh3"{,\ڹ'PR4_1?j_1?j'Q'Q`EfğTgğTX.iQY'b'b TVv~]Z͜Djݣ0㨭C )@?a{4i#s#  Pp&Qw6_0o5ElQXneT}\U P3bn@/7}C\K"lw"6hfa!>AWe`pG 4+3匋 #WXة#+1zޫC3Km"_\B#D=!5't۝gºΟf%՜BӒ#UKcdc! |ZaMiSk}a$>T-dI+[zWj]Ú׈,-7ZpkZ֖B"32oe\kxOJqgEtXw?2AH n+|M(k6񮣢i&{vx[IU%L@B9?f OWZ\>Ӵ,5%}F0R A`@OcԼ/E&ƙo{-Z540ఉ7'–۷k(Z_Լ(y_<&w3s}oF.gz[Y  d20c#'9xH~6!Ϳ'S[kW1HyǕ;`K!#Oߴ^\xZÞ$eco(P LUwBY|=k4> 2–g?ǻ x5KMvWRI 6XdG3;60>n9.wqY_uKM]~; r(alTlfSw3kaGKm72n-B2)Ey:CE{sƚlu o he \WccfaRVdkċ?0_%-ǯDŽ$NcĞ)׭D$hms*"S=F+<hˣi)M_OҼMsOB}yPX`,ȯ^}[+Qxc+9\y;WٜHnqȐfƒtѿ|GjV $g)VP#=Gf{vjm-9gPlSQ[z|wi-TC0THSY<9~_A,@ӣ}rw,{v$X +Gß<]ڗ%0uHEk)xĬ$R$rUdUτ?v?KKH|<_i3sd#ZAtB3RIU ƌ?xQ?l x+}#^GtX#]Ѡyͬg!>!Wt Ё?e)ԴqorN QA7wӮmޡw1c超XxecWK|]g :+ͣxoJ{WgS?z88^5ql][ۓBO_έ3k:R(Hh2XfzGmVӼ-oiZƓk}[P'H!˿/ 4[xJ;&o ܑw=x9o7ƚEWҼeᕶ,PĪԈ؅7<h$1e!?^)}KOӼ;d\}גA$SHZWS᜾4Wd~Hy~HArU9W~:WĚ>x~YD|sOy/Əپ? >ĝWBմ_.4mNyeO* ؑFcgc>⧃lSj~z ZY "I Fv-[Dx_>%hxtMYk8DBI ɐ0pAK¿ω<⼶!|>Qg[7$ګ nj3$6͠]I.SͨF"h*Kؽ ~6FffK5问s)uWYjڎmŴ/4[.#>n,1FTFq<K&FhWQuA#6B2Cmp+cotϋ-ͷg#ueo ۋn~Uh;?㏉3xĞ.^[uW[U˹5s(rT+Ex- Z^O6kVh6)J (((((4?0?5 gU[h4RBZ4~GǑTꆕrjCxyvZw<;"I}ނ0+yLTS=Ekk^7K?NW9UV}|纗A[XԼ3aGtq yv pFOn yk$:c|ټZs(ѧ9F96gW>FYo mXIX 褏ʳ<7V{ė9gZoexODӮn7ֺ.5SpD_1( g|:uwH| h-f=bkAo(Va߷{PR>:U/NZڬO,ss!mPX5nsc9y .Alc/ksjѵ8uRc坪^z+R^_s/XLZ7i^A6/ q(Uii #nmpFjl:7o5Cۛx-nὌ/{)S@}OrpNPĂ:^wk!!oַ10HS.sFڱ-O\s0)VV_uΧ/5bU6"$o cR?㯈=5swcB[Ȥx"FO[!W3ݗIP/oZqѩ߫?1Z }k>#Dmaگ)$jFH*,A HeSuO+?1H4LNUmC֛ije$Ra) N;#ix|msjmlYDmqnOך[dfSZ_SSZuGC'o1AMO 2u8W_qש ڇ5i6I.?fQ"nU| +SOY?u@h?՟x5:iW,op,Lm6_DKxP:O#v(d4R+S4Ub='I|<*@/xğmjF(bB> \^Za]3b F8sJ_(ҵBxFg(?(|`G3\kvgi<̳\ oSHwGПz e%:{C,/`;/2Fwۍ6s]w>+|Bo]:]6}Iʘ'جǎ ނR:_SOZOSOZt\Ԛyoe]ND-ᕓ2(8$ҩi /T=0=ѭ?pAui9Z)|d`UA⹛K×~|Em\jZ&kime9r Us|_Z5OOOU?$txn: ڥI̭NW߽s|K /Py8wȿm}ŗ({P>dz!zTkO5M>Ԥdfxe.Gb~5]^z4H~'GBRY6m=bg%XwhA{;OJ9'$V(gt m夶"TgB:M|?<]6=/IZ՚;*Ps㍁=oZzI?E# /W! ɿ|]從Ⴌ$d.BOPy3|K떏eai6=XcҼy- wil-XǙv(9 㑎9v)7 vONΓW0||_xƾ#үuH=uO v@iw1,Ī |4џXi<<& wZ33}ڇZ 3Ogw |+h~o#WJ%ħgI|\d﷌od V~}#p5mRLC멖0֤|Aҵ ]Bd_nEiΓR徥H絔nd({KRb%b˕f]tqO?ʔ9;Wn<*RRG&' SRwMmcþ!|Ax1ͯ2`K38;C񏋵ώ:ޣko$,R8967mcpy_K擧<z18{Iom =N쵨C񏅼74Idk}MlK!l:xbfM}64JU\$ks}Rzz:,/Zt{O7.Wcrm$*C9b8^ںIcHAG7Zu}Rʹ+mg##W{ぅ,&z񦝬ǿ+ kci6,oEfKpFeX 澔Z-^l Z cy27oZ|(g&ԭ4-@c\8PG@"['l|?oj>zMgb"\ɾ[kF+,` )HQKAFpNs5 ?gXm7R^~8K՝ Or+>Xx3J"+@#K`P*_e kO 31h~kz*cDU* 7ZfϊOy@<5y& ԏyio!# @mۏO]'"zw>|];ܔS>C?ax_;[[Gcqc% cYm Wi%,[FI$+0\rxݩ5r109≼+zDh^)υcn~@ rAdehd[o3w 5?i:(jEe?Yhp7p`^E+ͿO迳fY\^X"F>g㻉D ]?m'z&|heFoYFBrd?Gl{z~Ψ\?Qڹ}C@4ouwd_"g;zWEJ)rƥxiMލk/su{_O$dd3Ұ(,OZZ$eѢ::|1 xo_٫U﵅eg=YaT E㋏z/|/WDf^̙̒˳p2kڨ#A+uOZ/?kvGltku[VYF0s1Rx{W?mwǞ#/ 藑Xٺw_L$#C$1I-m4T5 a>@ҰQE ~5xOOhl2Hw\eExLOß xVoSZZ3s C$!b A6ǽ}iھua{\M dFe +t6öfvY P[E9:#u뿴]BV ÓxWau<}I$E>H+wIV$E{^5K]$ܝ[Aw v,IFZ͔c v p޽#>EOkVH@\=)WGY+Ҿ,|ye lhxK-^@ &ezW~óïZgOt=Ww :u" ̱p76^/ٽu:_^_0=1 f<>ZFMV캈aΤbn2͜1*z"kWƿg~!tSa}Ir4ng0?̒);ğ~ x{]Լ fz{[Ftxn8$q4sFqJH2G*8>,~"EUWy" !jT'*=h#׵/&[Jۈl\~8q294-V}S<@Kj֚$6=1] 3;{Wx O_x/:^q0jh/,QήΆ ݜAc-ivѼ?K:5r!X@2*ݖkፋ@Լ^4HQq,~\$JorRfǃ5M_[}z҅]~O5Wi/LΡqGs$3g?3>Ӵy}G_!jz%e s ҿSw2{]OxoOt:Ff&f<'ְt(]J"Ӯ-^ߵ!8xC]ʋ\*|z֯h:}֣ Vo2@Q' 3$I41|Ooe[JN%4BX(7 |_*v#% ̘-Q[^OZ_l$sVCjy<;`IkP"Axn=/+"'/x]5^C.n$6qs7.(Gɨ%xIh7跖_lLKs9xY,(S @n;7MkoWp ۑ awZ;h>n5-akwG4k-$Jnv`!t=xbu=#1kQi ~Q&Fx» Ʊ'\xoFZBpN@>Z"8#bvvo<kgnn<6F;]_b@nN;??i K.UT{b¾8`z"~++gA~ir2בr5o_{Y|)R6*Tf9~_L}'W%*5炭+Sl5m5n5Yy ]s黦OEX_z&:unđC '8FQ~7h^,9+<#۠%1sڡ']?֯=~M[MBdbQ0s_JgK0~_xÞ!/f]O2kA )NYA Wߍ5~?gi麊j}F_i(22>j~ է5?㡼飚VP*)-T>!|g:u}kK9t9Ueegbd&09Bv-kn h:ik] 5uE.#f,"Y^H9uu.%_h>*05ZODcac1U_pT,?eX[N|E.u[6if W@WE|]{ŚWu1ܥ,ӬB3&2 8(~\K+d{WX"<Ĝ\ctGϽexBܶGpw Pcqpz;(Zٺ{gY[ݢ,_t4__0W^̒JYA@Nst^x/ZM"Glz$|qUu߇:~T|1YjVYs 5fva"@R:^%NK:e&͏+w lq^> %-E.I2fkLM_i<$.͎pl27'2RgY_zlZv6mu)spQ` :N0+Ⱦ=4 $o1#_ ]Z- bO*q_ t_^-q"Xm-.bmMsz.qXxKmkPM\ۗ[IXm@Veq&LJ||Hm[Oy &ec9e~#|oZŦZkMiFa mu<F5,x[N}(yi/|e؃=eM>~/x_ޝs_mym Ԑ2H ixᏆ-utӾ.VP&U2FoiVO h^žԮoKq-҂E]!NH$W懧 ^MKU—P]Lf$=3~,5mZVa] deTC=@cB8a#rI5 phڇwpR/),Ĝ0 Y>O X{#Iouo 3%3D̠mHX+,s୽Ś}eM1mLɸp7 &4L5;-oOOPwEsm"{ =Y=ំ>?.|jhXo JbY%23IT jI/om$An*=2F>u'Km>/7TfcLӫϧZ;6CM2XHR}Vle3vv_|[Mt2my0H@k_]>;,Mkχ= VKM3ZvO^k[7ᶭ 鮚Cݾbd;0V$ &;bj:ޟkD}U͑"#,qsI`cu-2|OO|Es|Oc{&5pGtKvEvci.͑>xn~їo}ZĚrjb:|{b 8J0_#7R [$D#V0#N;iz||2<rc >tazWs~wIYisxy!Kx k$M|rY$}o&FzBӺ7"7xX{?cf[=|w|*Ρh;NOM<0#<=kccvyzڍIkFYv4/tDo3#N~?/"`ѫgOķw &}>zFk*HZY߈)3K0ROi=6ٗNjt߇{]"ơK$זh|- ͟ӜI-}E{;[݌I~靧cq8y`2p|oχW /gdž.o_(mu˹/em>;ʷ 鎵': x9_Jw,1*Y'ֲϊD_Z:4dRͨ dPdIZk.zm#c+ jO'Xxu|.= j26' tҫPSi6P]A,"2ǘP 'hϪ6z\< XTz0_5iڿjkKmSE>Kb~̉$$S)_}I,G2{T'#v?j?R!y5i+(/¯ όo4ĺ]兽]ξRI{ WI݌'Һ/ڗN> >ծe.3/jf'e#)W OMOoB[o?hݧm}{Ÿ'<1մHJHP8``v~_3һmc?M3LtZn]VO=+vQa.[ԜC> ݨ=3sh]TX$Ev57cg_Z:lI5q}e!n0}?kQJ@F{Vѳ* 4)G(]#ʤ4 i׆ -1j֕XK6VHh2gf#k'.&UEOV,fnl`]\Hw,Ā5b'IcIр!0Ҿ|KB#L4KRZ|7n0mO3}Gz& j %]K>` 'ҥa7mO|Hߴ[Ě_ƫal[F![V ;I꓄RGJc Gč>-Xt@$X,r%jr(ϯ:PN5|uj?ωkkMKLNݠ:#8P8mS|J{/xs*K-2H#ΎOqϧtfU{{IL m2auG%Xdpyx|?ޥy<#cx7Z.fNli'o\~ bygJԵ}_Q,6+ Iot;9U#K(g.J7I^^/|Ax/Pj",Ke͵6;F>qsӥSV*%M8y ȱGIs*ˊX~% j艪F'%SO;*hsyq ?,7FpA>=k:[mOǓ۹IH7PZ)ڊ:Q0/}zo0KFC]G!|{v\mK|DmBGzTvM;H6NZ"Ya}OMsU4l_U},^[6Jp)Fqk_EZ3[ZxWN͟Ύ*WhOFj5:x(/~_[x>;3q4dFE#v'BG~(@V^#ռCCnD֭mk& Q#,) 2wuUτ^2? yy?2_$ jSP+n!;>]scBTҵ{ hY>- k6f+7rmqk[YgŢ b5$pjjzٖ]F]]98>^ d96m.δ Nx2_moXΟG97A˫r//ޏx{\-֝,(|4qMWӿ1O"Ġ#1q2Na#"LfBGpkg^VLju M7Rh,ED-%gRmFݲ_Zo2 "J20Joǀ" OA&ec#9vR۷r=kbSi/VΗ:yXynSH~*~^-wWKK !Icle١ܳ?&&Gusay`U7W'߭Iῂ F ieJ9cqxGg5WcXZӫ(m Ǣ*n3hោ;[kJ4XnãVU 7Ŀ <o|e&vx5KiԒ.rA*F1 v*xgNJ/fan.r@ 3v>m ^щ#?(WZiu_ KWEHH鞇 _ <%压dDfx(np0P:G-oX$w$:+$k>#h-H{}|3fE _~惠âE̓鶢Gn띬zX0 3kxNU&KO<$ow~iiK1a3 ~^zWy>sjU  `H##9VI vwY"Վ K?o#h \csS?W|9{OE ]J{!AFe AR* |k:Gť)Ou.HQ$I X3C9.n"F1LHqzkEa! ;4_$q\\Iu5̎WbbSAڅ]wRmRR 8=/_џXCrl[.o r GSXY#r%s"T{u> ž(9am'yv# f5Hן.hZ,oۦн<…(;7"RMw#k.s ݕQc9^PA/|0մJ? BZujCwU>(͑1ڣ8}?Ao4ӬK6 pPA0Wp `N}< Ş$ׇԵi2*|s=(<Ɵÿ:ĺļt^;Ymȉ9Yzx8=S࿂uׇoЮ"GtI,``:{WesqM3qFTI jL佻%{2G=FQdG~ C3M8ű:"1r˷=+/?oÏX|3yemsVLah:2E%,b$/:sH 2_q2/){㦬wqڛqdK,_lsMڦi7[DO< (b}0^GXKW5W67i\#4h$\"I֒Q@Q@?X<I"i,z"nk Sj{s_8H$}>+giđΤH ~4pUA5V]OXcm% fLC#8$RXݔge=mY mPprHZZjw_oCC5վ k-9#ºrJsׅ[ۿYϖ:g,wt{- dK{v3z GO(|D⯋/4k]+OYG`abW  yo߈WqkG]NTf ,Q"d]v2zFzz]ڀyq FF?JZijY-c$z|}G_hu %K;,@nUJ1V~  EFxj \i[i7.&khM?#~M69'-aGfe7=4M9kMեO.FG$.[ ӼE?6^d6L̠)- jÚ-%HH?PHX1HPpj> liXc\f<.6:EcGܽtot1\n%߁ۛ{ 9n3gBmP,J,Yϫ?ZWC_߂ Ӭtww£An Ek/?K) *_]Xld83Q𞇫]O>tOi^t=cQt.QV$ :X`l^"[~&մ+U𞟫-Ӊlh%#вqLv"Wc6р~d2d|zm%s׌^.4Oޙz}k{H=[FVx>"ß6&gńve t ̻ۤj#xhz'fkVف{%i'+@c6a^oH&]CK<{t8jΟiV8-[#Lp5i+ =#T sRӔ +z9xLOլ ̡vVJ& g>"[ Pԝ6k|0ၴmߥw~^Mq4EH/APMsTD*+^Zjm{m ݳt3t8f& A;]90xZЪVi=>xK7Yޓ0iIe"dޕi=*+Wcz|Sok9֥2wM"fXikݯ>x[P.;-oqn-RXFrGVƃAcq\YGЫ00``zWzV>nXuo-|r21%v}fne[}Uk֫\xNh$"U8`#fz@%c;ƒ%o.l-u8'UJH,g?"3z9K^@+ѿ{ai4WzRc:t\[[6E' G>-JHyֹ8DD2[Aw s ~]>,҃07I˜a4ɼU̍LΤTy3;#6F2B q>&ٴ/yQz*Gj#m ?6ӔuCӭೳo*c p9b64t[o_P&ٓI?lǕ+TGt? k:[\i3Gܩ2TWW ~ {M/OS\ 7Y۶g$瞹!4{qqZT`}ܟziX}OeGhxz hZB[7kMvIqݻ;xcҹ;.bڗ3bIՕ;78ǶjJ$b!N<U,?DM+@<9eZHEiz wuW7VҬJ9VufGX97tg\oD<WqK{{)g&7˱\G}nmH*W?&xg^&x @խuKYd oU/)㍣giOx]5M.ze:&s|K/"Fy=ϥi!Ko >7; LJotִ\,3i"^Jwi/o%ƙg \E^E9##Xp+|,׏)KPxgRӭWS_ Zo.42nM m<)m>|Z}uK -| 6 *%FW ~) 𵭜 ״BVvk_|9;KNY:[]\^;DEL ܠu t>-xS]ujz5ޣAB-#?pLUx}VyZ𮧥,gKy{tЮ.8ǭR16šm>&5;W)RpQ 9V|a+>'C×_fQ7jS} R!u,`~` rjν V[[܍{ (g+4VǏ}ku.Mܗ)irc^}/WIt -iԭnm s2)7mOd0-u~d%[lW?<'k+?sYZi5R-,q* H@L<#e}/:5<%VW~/ kvcOu@RP4ϴW O\jl0O{ bA8ȯ@OjAۇe[v3Ӎ\M8M]6\eItG~bѧV Ge!g'ڽOxI ;W'\7Mp݁/ֿ+V *): "M$d 'Wq%xN^K6..ݲQ`=0=+l,aZt4~Geؙ:m불ٴ.JMf͠+F+!]: +կ$xgD%u?Ò1,[kqFy8|DgowÏ;qh$O,s'7 FsTfCglg9> Q4]AjZ"veIwLW nxk:}Kʻ9˚6O|gK[ҾOzsjWZykUv2kSJshv'φ[xZMbk7.mJ>dFc1Kj}O}h-ZHwr (9\zGj?o^j6vjQ' 4tf~ʾCu2[ d'ԑ^m߅2Ŀگ-K.ZOg_3o̦)d.psҩNlߴFG7m˽6K#]+4&Bd/Ǐh'|C^ln./o@-2s־B_/ Vqmx`[9TI$Xߴxs+]h6k74_>op1DʅPp ROK Zh<RK-.AMJ.'ucg݀#͏;r_Zeƃf}NU_Lx<_3x^mA#gE4K!u!q\͆}^2杮 yr˧]p+b_#h~"?dI<7'UWi[>ywCK$ "ldLAg}Pj^[xOKhdkwKAG q|C-G{?tC6DRXŒ_h{YZxƺtowMl`\7@9-ksA'De$nH$)Hn2y|!?;߈ԼE:MQIxcWl#ުpFC??Zݾ}[CӵU查.AfۙNa[h$_K{/ƇZմk{V]:VYYj$s|'Yb W\#>o-|2?jw:L6GixQo?cC"h6Z}{?,4ӵ[[ 4a{"+$jK nPr1_7hw~,,F-wNom=T$%H+5 6?g {QYs \S3HRIӆd)ext2XxocRPJ37ˎU&xCw2[+4hHouae. @UcpV w];?^'3E<>fT1wd&Q]2|z5_i}ºuu{;Yb3 8Je7c?j_BuBGὍcS Dp#wt~ֵ4h—Fxpc [|>{2L`q';}ܹ?Ma@5}C±mm.]Q)geI85KQ\Joh$ߝq^Y:\q<y!?v;~H((((zcs_<+}q$fCvRI'5"ƄČ>yAIAxCC.Y8o a<޳yAIb?‡b?^R_@=KsT>yAIb?€/J+ K~(%I~+ K~(%I_;K+]~ů[}E2(uhX;o'ZTEh%1;Չ>+ K~(%IZ r(}ߤ >yAIb4`^R_Gد?)/O /]VkKhf:8 ҫߤ >yAI=4gc}#15Z~mm2N,\kƅSS~yAIb?µYI;8ҧ a|ъ+ K~(%IQSX!v'M[͸[cqT>!|0]*-3ZJk:tR VYdX7`{j%I}ߤ ]%54tvb}ߤ >yAI7qT>yAIb?‘EQ+ K~(%Ib?^R_E*د?)/OW'P>˝"Y\iivZ,ҹ3ͳpvg9Mp[O5+ K~(%IZa |y˟<~ս[5ӭ-CE.{Ej%I}ߤ T]U98|~x\ cֵ/Pp"c,8=s]'د?)/OW'QU]f.@38cˌ:d48].ѱ#w1,'9b?^R_L-[tLrGqr~w[$Ī{xb?^R_E ywi6 ~N>sgpRG5/ҭ|z͏GY%I}ߤ C [4TQ_8$1䁂|/1mSv_.:g>%I}ߤ WKp Z;rE8@9"넆:Mi _I#_8osCcW'RT'P2g"|_iڜou?iǮ||N}o'/O7'Pz53^^Yn]XG aZxa?7Gb}ߨN_@F*o1!IG$ >y9xIb}ߤ >yAI_.5JK SN!VO7((((((((((((((((((((((((((GX j|6J .yFS @9O*k|*'t |e{Xfkw:/>ɯ1ARMe/I5^h5} ?55=2G*d˚8&0B7 g#5s3n-R>5׎$AH`1Vm 0>cw&_?&kS'$׆گZO<56}VVE:l0H"7 xxwZt^鯪$K; 84 pGw p 8.{5 )h6k&OIfn|932\ G_NkF ;K&ͫ 8>a\kZ-;S׈I6dT99y{/uk Ku2L<LN03Si@񬷗3}X`|~''~:.4;xṴٞp6r9^.5goI;qq!ۏJ-51}3¤z?c/: n,+J>·> vo:|[jk񿷖A,ȧԭm36Fr$d1W;_|X񖇨ɤj6jz0/ٯ$b #da!3]W+p.5E6rځHn֭EV,81c}v̉iÖDI$dϫ3OkJfotocx/images/warp_radial.png0000664000175000017500000024570515247006660015305 0ustar micomicoPNG  IHDR}?l`tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 139 573 1 0 AeXIfMM*V^(1fixHHgnome-screenshot0232T0100fotoxx-23.70: Crop: width:397 height:140|fotoxx-23.70: Sharpen: median dfotoxx-23.70: Crop: width:397 height:140|fotoxx-23.70: Sharpen: median diff 1 15 15|fotoxx-23.70: Margins: 0 0 0 252|fotoxx-23.70: paste area|fotoxx-23.70: Crop: width:576 height:139|fotoxx-23.70: Crop: width:573 height:139|fotocx-26.6: Rescale: width:515 height:125||9x} q`^yMal E(q}n=Q*R P Et0eُŞQ9r3P3ea[Zo[3ء脦H)0+Ei Z,ڊ@l-ñsB<529g8== '`c2vc{m> PU9`YKX *̊q fJ0=]05SC%h v@5jt񪡘1GƆcku0֗bUVa9?{q/h17Q^/F"\1#303؉c邺 G:bFr8$N 5z}>^9 3ppjҠĭ/Y/T `R+w?JԊ<`Q1e `Zkz;u#F6uanhU`Fh0;]y,)6bYY(VWGaݘx-iZ/'e`4l3p9eb7 X?6)3bUA{c!3/bmbXs3"%L _+x[`zjjXX= ٷ cA[/T 00}/K0Г`>(DlpJ8 ^5?Bc8~c NLhpGs,qxa~"_- lIۘMxqzf*N4Xs7&|^믟[VF2nQ)M@ ɻ(%@2 iJ-*U:@O)PAu?%bBjj391X$L)KA 4We`l?>s`\ފ>'aɄl,dcΈt̮Lx*̼pL 4&09N&&QrLf2m"05D@@gL t ;g :+Ԓ@F=ƿELbD&[wM@K\@x"bT>T#F0ϙh|zͩ $KGD}IUٕPl=b?)vNǮhdOOž)>1a0" />*by KXd8 r̉%+AvgF8ٕ0 hqtm05h)VL@1 fEtp}ܻwW͉yzb,U'Xj3P圹JxAmJ=zH|>GfF{E 9^didH#ŠFR/BǤ 2!HETJ6SsYIB|f.rd#d 8Y(-AFI 2K]X܂<"DvZQ_H ƅ*Pgtǔ`7tLFV1@u 00` 0f`WdW0 "<772b(P.0+VJ*9kJ-apG$K&cB uG3)AXTaĊatt 6d|11J6YLlIWuc\.YT'bXʒ`,/ [Ǽ -%505^II@E0EV`2%ɔ L uiAVG 41Mo):KL~ \ן\Hw͛7qu\v W^5݊oݺe4('۷qƍ'+A<&K$_\|skkOd0Pl zsf˙;)l& D16Yfh BkG ;( ^P$#4 Hs!){L#xd3:|SK̆ZaGxv ,FpV) EL/J>B:y FHb:b$$&$!56FT+Dz) 6gxwH.(EJ C0I0@TJ0P*KՇ@']F.e3Iyd\@sJ 89ehoLVH/` H'XH&H"T pa;`8Qg.p+$ THC!JOvՌ*. ީL%#SR #ycQ:ŕHC1(QԢ*e$;8|AMP0BcϘ\x+<&!3*Z 7nٛ{Ǥ7lj| 9~m;}"voہ.&HxO? Db~^\Edub?{~. LOP1yA'7 \K UzB hIIAH61 v*† *yT2F!kd-FRuM?y*ƎAvI ȫ@fab N :|P{kA_$FHR#,~QHBa3yH߀ L(fS&K5c0pnvLѠ`@"D@ MEBsy.f0gyyW.rC`2(Fdx%30 Ypd$1_d\dM22^1YGf@ ut|b3KL:"~Id_gCOFL~J I9D$HFDlDf .Ee( N|Ǚ>4LAfR3eP~vI8Qp CX`<8% k): NX8v,Ӭm=3`[ w-*} W;YR\Ka+N^d/)$qh^wx];يaJ+P6ck|/c_s__owX{͠sLGdD̳`/G;;|̄^3IS̖ERKfBxFv}` "䐧ςIy_ 0$V*c".rAK_d3%Bl';+Xb ,mhm7ksHm-fo nNV8YÕH)AVA)B- 2 *< В&5AP LAQvaCA@)`ЩlᣐBBGGAS=JHD$:HJwLԲGk}0ǿ?>0PN`)M 0P$} YnBF{=`#QF+wػJ^+ 9d |ⓡOn{KkYX6| \$\-N3 @+9B G *@  x{B-s'BW>'qZ>vwL`@"3Urvt'D * :A> |'&z^Q!E1| .o!^L6m RJ$lxv8fA: dIl/?=y2IS`(@Lm#'NCB4JLRKIȬQ^ESj3 EY_55d JИTJv]Kܠ"QP͝+n>~0,P P5x?-;MsG"GIԡK%Ǟp߿N8|n_$'@[|ZƑ#H!q'?Z/b9SyxVKyN<|Cg>: ܩ8| isWpo8y8r4}cG8zmO>$8>ktnÑk.?xWnvBس9?юwn8yn{^S{ga#8qO_;;/3/HbNdU:!n^Nxa(._;78u8<kwn\>opu ǹ+0h+5/g;z1O36;V}mέ8ܟ3ǒͱ-q\pYݽ ;wƅkԏ}޸| ;ow_MтC<93<| P%q8҂t__>߁k].9;ίg.F6=ę|h]_~'+5_@wj# .aFUU3yUv@Oo{ǎ0Xp!Μ9czx ?فX-k *hx+oT\z"͹/{A:mX+20X[2X!}1dpA}0dH 2 ` 33~(,q8]p' a~*Dy#2 $UȋC)+ܡ'pPAjș&j /*g[(\!u'$R8ӹ_:6Kz̀:`? g}h* P 86oJu3 %9mldW3Y!us@m4`(ᓔBeS)B.E% $dg#9;RK FFv^&㣐D`"RP9ӸQfqʅ, |$J@%A`"B&^Avۡ AqtL-E5D/Yٽ[itTeش*RҊH,- GaSyzU&t17%)xTHDg Ǵeq wHO\r6*uAH.pnG7̆3| ވ9,IY nqԡe(QF50\%rWl%hYxEW߹}qnŹ_aac2x>xȠ~^ހ_m8h/E$K)|Hߛ_oӖbDZ  2 ֕L Ed0K- H).N'V"%)W\ǻcռ 7`s)mE+߷ky,f6핓Ap~F 119yxj =\%rg5ٴ[WN(ci>odRJ0i:2'iDž{Q&DC2I7fΏ`͟NveW$ҧ?C/M~?~|`@_iXٳgM?$$s5ӧO`0q]euB& 3 Wʲ8hzA7M8,Сd6fLC0ja|,b(l,2Zl=G:@NJNbH C| IDAT|}Ȋ1)i!c[B:O%9sFK`O @y9P>U:@' O'z qu\h#CmLdx[O$0M"XRS{&Bq`@ L/Pνj-Y?X Pؓ9q$lgND0,%G#w +\p5Ӆ˕O2)'&E ~Q E^f"J DAb!)#Ģ3W x`W] 7Ҵ L5<c3v8kOE)0 ~ǥqM:{J ס"ɟ MB' ,GYy{?29L xKIs([GnK@͜&8֮ffψEnY,k̇ KPA}ۖ$LLجK`fX"̔\Q(7~ XRW#7R€ƣ[زRg}4j9ݼz~`W0C\N =29fEpDСBtY@Rob˱jy66ҁ*#@$ wpDjH"~3`dI#q! %ǾtiH>kZeò`C^ ݍUQLZLX9Rg:n!ft~%a%ij :+7 3j=#=1:EIs-8'cBǧ@s #Ԧ'g:5YT^ Dg0 /@NBss3R>|8Ɵ?>Tݾ>- 6w8hQ!&21 N{A3M~bPӧ7zzz}{@z Lp;rJ6EHc!Ya,E đox2(H{{ɠgY0 /+ֈB (M4btV$K12uL!(CKR(#i@.UqA!#V)#;= n.&b=R*KPҸHHWQ䬔A::X$~,HZ/"m!>YqFgFcta38әit,TYIbY#S ԗ# s*=,)tk3ӬȤ)R~(hd{`Acg`t?8c#JJ K,do2g.\YVH%'߂zA{b@^0OYؿ~\ `ff@X 3Bf  &3 OgkrI^,}QQ~r.(L$z0"dPfz: z-trgg_ 2 r&Qf8ԉ@Ɇ> xsƅD9QO`VjNmH{"d "ے\z(1o[г;{_6V}@^ SWLwP'g,ԃ޿Ι] =P(Pĩ;>~-AݞLd&|?<8MCs˛~v6dFT-&=L叱/߶eC#bxaMҥ 1&0Ԯ;6K;!J6~}f),Gn=݈Y0 wcF9+Y{?RG6XhKwRςYl7*o?Suv:szJs ,WC~8zSO{bqi*J[/sf2AW0㋐V5uO,ɂh,Of@/Lnd GI(4!5l4-D3G\;0 DQǟ+•yNp*'};N5G#wR&&&}{~50<|6BCC)o 3L&ylz3gΤg ~gLpt Q/_J0P@0 f6}(8pƪv2-B.E*a2/$nuB"A>kL6YX"F#0"3pG2 1 1Ɗ$L X_z.8 7`JM\bCykR·H]T1 3ۑ4NrEg)\`2`V3L4Wܶb$(s`|ydJ1C yzs\zD߂M֬ư `)#<]IZ,z;(.Ldgy [`%s!&4`HCuQ>H R"S˳C诈0Pa3ML%Lw8DANd.ڙz.:7= ^:C%Etony .(K+_B;g]@-Z[h=/Ȫ]|gG؆ԔL'~:\6ͺ^ɚ3րTLXq1:M)teL``` L)2#bxx{ J}X58^jVeia&K*J, y,㧶F*E ,%5ޞ;o mPaԌDF&x X`v}~TGB,G>,B*T, o;h~3At82U~+ڥ=a% W]K M`ĭ3"zLY4QyDy%+i0MsY0puY،-tek˯pԅ.}qF5k7͗ Z;^mܸزeK`&8p`_`ɒ%?T0{lgW<G6S&`;JWs`\`z"3Zo¼d:@/}{3>H0 vj#L7y azQ 2`&PRa y@c/A #QRmeZ0W%9c<"l@<R͍Detk7c͜1:*fCIZv1.fVÆ,dkj@009+>fV轿 M`&  ߰ϐ#C mJ.ﲋ#{5j)Lr zxo;% {z,!cu/#]/BN/'9C)4аySDOV,t)_ #|qr88SPWGy{5.?UBJKF)\ ?A c^r`9 `@BEA0@002KǮRKDpp9 PscՖXn)>߲#9[S_2 ;IӸ F^^#ԑSH{G<B>|"8 eϰMzgMy";i L`+-1>.65͋ڏb<cEQa |U0pcZu;˱t#,gH42v>oTM^tY wݫ13[77wq.>c\+vb]u D饉LJ V/,Nz ֵBIB4^؉d`\LBs?'¹3PP< { '7A~8!qU3 66NNTpc:J bZV\ }ge3 Ԭl,.֩y%2/_U+q 6@=噑_;Mz`6a~B]  sG8>م;Ϯ1ҘŽSԴ}z#$WsFOvÃr;ieRJ?&Ŷ<6UH V"3a5,le> mY 1^ܾD↡hQUA+v,xc1~ܾ'^6,%mYABAFH]ɍ]V|6),AQb띮{ngI {K3 KXZL@{lCH8;LE ZOn14<ظvc s b &AFEzDDm9ղ-K׎bHYvsFO[3_W?"t/+^20m:Gij69p=`i:v L6Ŭ)7D8GKffALp-Pd2oH$է+_ z%`<8c?FEsP9s-.>m7"'ROBcoo4TW]^&wzf 5މX$n3`1a|3';t E^ܗ_i,^@02hC9mlH`=$V!w %dM IDATвߛE-ZRƆ@ҽ.Så#DU(eռi6䭞-"j |ߑƒʎ'E}Hm̃lD$˱4)4 hcI&@z>4<s !(c}=`@HSZwZ Vp&ݽg{zDROqD JRvrt!3!3@=;o 7M k%:t:A>z.Bf!xb2"]ktVbfbLqjJEK0wT>q&}4/ɥ2ux.Rc{  QMRDBH+,S h\L'bEdOOׯec@v4<ԅ_DTh@pH8r}i\% (!+;`dt|v =^Ond)rX^XP=}EgըN2S y׏6RVΧQF5b6߈MP^Cq(dul]' 5tp7._Li40#1}rq= ".b؆[aլzd/}G5ƃhl$^{A.3"ZV}>9mò089He_xm?r1kg!3'MqDq݂&(-@VF2rQ\1kfI# `l {G`ɬ@Y#ݻc`Q(8sGpx|u\g}08' \m7P;< {v/"#깲Y^.Üw̍l픃JR¨WbNjh^FkaŘ4^&2U%4KGM}$Ɩ =-M>P^=&6㓯S7u<* P ƟZ2ށSk5nPu a/j}fN1a̮ߎekPK%NY/_1qjDZ;L%_T55tb#"YRб]d6rƧbݾX>I)5Ow޺~#rKp:Ϗ9IZ^k;] Yz+/*躝 i& Lְq5ACz>YC0o'ف>21  {  S-xka"N׼ pR(ḃrnR;[<} 953iڐ!d"\хwWQR6M/s :fi>ѠG0`> ldpbo{.C4Yc }S 8cyU @giaW{|7H^}`z9 s m{ I0&7YѯǛ[eFB7B~ %(F(KC*X-BhBYH+""(Ȧcda2FbTn wXc 3J1\K5Q[1S6d|~ f/@i^pbh,5 >-XJH@N+LR`V~U 'WQ=" |`y ICy6v^#I-_p+ʃzaz" |_z[ݟK")wG?;c9cUx!O !f_2CwIf@M36U _`{ doΊ, aEoF?jiMAc\x9wO=Л ןH"ɾ(1w&D5}猳*,_%fxH?t`z1 $;F^ l~ oYN9[ 0PF0æC7aE00 [d~z_u?j5 @g}Lɿ/Lq,1aNHǼu]D;hDD)J4(rsr`6-b0yMwPz"Zw Rv“Õr#XN\ǍnG4=M }ONf$udʭ0ϩ309؁ ԭw߱WfHa4gA0PHa K (#6K5Аim[ `0Y!D@(EMH߅GBY-IlA6eӗΤFc`{+&[(GPC@?p!&0 OXĊ@8Ex:O_CX^K)%C6tb٨ϗY|φaH)!Ln` HB|Ks!Ly9)lOXI`AXjKꁡLMg>lMkpDz.HT/U0s)ŭH?9 >_lv}??bOoU'3@f`TA 2b}v`iM I}F~;Ͽ[BVoc5z. *j., HN;BXM #'&`5Z[obN8QW$.^iFW$ @PC{sŅv\;ݎmqýӌM4i^#0qO'YweΝ9g}NUfqP)ðzVAOjS{kZjMceX:(wD L`ؕް+Ia~rDɄHGt\q;Gzx$l#!?qSL1AL)f~zTVt]LXr R(}1*P\ѲM'25 "ĸhU@  e” NDT8̀i-4̀k`33C\{}k^2Bz0@7AqtWE8HA3Խ 쎚u5tSeh0RsZ0*{0g0#4oH͛4Jsf4z >{&~-su :8{^Ι?Q.`,qּv-=Q3wpJnE)080n ;Q1-&L5$k'RaU&w&:0ؠLsi)@e@&әcPP@t {Zأk@#4L g=x BĘ&2 Rn/)>Һ &GŰ!b8DqtWw8\&%eaX!%, (ia+)rtӧ/e."?L*j0ՌPjnWix`1CgfVO.@p( Pf.3^ J iu`>0ʗ|_)|2#~J=Xv tF8(@*JN c64  D_CF_˰:Q7PifЭvgWă=12ZeA)tPUH*Tš6ᥚ<+F1]1R7p@pZ}%c3 Y4d՚5~%2^y1iMǙV`׫o4y` a`p+PkkHS|pVVLhq)v%e/F]~a6Mq6rV ```M1_3_Z˙ K#,Uea-0' l#G[#"62iŨT1`ʫ`J+J4 ДW r6(,Fgq޼7z:g`d͞Ѯ"fMBF\oNX #s<|;kw 5{}7x0p"+ḯ6vڡ ;` ѺV;^ &FD~! ր33 B=@qj$5W!5|"r8~IuXVY9I{NjMkmXahuvb^>P,!@xVȑapEjN_UeR:arcGlZM00 Dt%>Ȝٙ? LF@fiK Йj[b "A .'DS;ڋ0)S`RRZb.f5͌k_IiP(80@sJ7) 3h0ϞӤsHd\h-9hC|٪quR9Izw(eÀ}(0s ?&_΁]k{ |.Q`~Թ5$\H^,0su9 > q[.Wd:STnG<ꛛSeYlٖa/eYZxr2pPHh.`<2CA`$\4fXTAUE'UQ'Oå04<0D "  (=RK4)\?fڰA #a-S* 3fngL ݈0RVgF|C{RQutg¤Н`3blY-tgK09 ρ)cF#C`)F_0g7ltFŢ-OC_0۴F)@CN5}A{t@!]k'q |?(xD ~7}Hb)~C΀ 4``WW߂ T qmQe eXQ\h^?ņR Lub–lH2q;"=D$1:kF<Bf0ao$HC}*Hܥ8tLkaC?xT}38@V ݽ |W7e/3P?WY#O` Ēx*紑9ehTee0e&.Q]e6%l5E ;Pݏ L#qH0lIm,A%`L,*f nF|x7aVn;єUd3IMV`!^Ez 4f`6 -ρ8XZm:X7/gXtay!5~ v  IDAT dh#{A:  8R 䌽n$##̘c33ؐ}{u%=͙^D:](;5mwnanw>=zI"^qLp<τyccf>A1i1 4A 2[aVQ&X9g)|gkafC7A?WaX75F8À gJKM8E@ 0`=eU9t ʬR`@\5"lAG0 oQ>SЎbFNFka-` ^%Yf% (k@Èhk0ƠB-Z/ szEk1{JիҚ0% G˜5'邪TJ,n P& $VC_B]kMp#Z8*$4"0 $p 1d'CcT0@^$nӵ7aRd!BNMBJf `c9QݛwNIgC/@ռDO*p'fI0 Ş(zQZK?Jc. p@hC+{ + Lv8QVPs^fj/ 4yԯ u?G3 e8UI߆a D KP[Ƃ`Uy-mLlK%0%2:3>vؾ9?-&f5Ttf̙c;laΆ15y r8o@| u>]ˇxW&E|O``c^sf!yaʣa0ӊ%n+nV~AD(xQ3$X될;VwqA7э}c 3G""{M7m^6.GwaBYCqG&(2.A mᚌf) *r PޫM- # iJI qp 30'0]Mn@\|i4_~`Wb \^iow~Yfk8`dy-= Af& ![u0c)'ɱb)+T" {cxviqE+W;'mnM8n0m!6zL!&5T_.@(JC{[` Ɯ8 B&qajܟ$OO&#fk ? `jf@y߈ޡ a1P܏d~QEsQQ816xŮ'ftII|0% )fp 4 81 ~R49y='F $R&%S&0~ANd8qdq G`"A!º W#fz ")Q,D)?%$ *ri%Da]V8TYAS%*MWQneXr٩{@znr-ƇkxؑCсÇzW{#G~dlk/-;wرoK9'L7wkEm䅑̸x7K]tD68q$0J7}v=Qn"7L$fkc?79L0~eP2dS.u۩U K:e=q@f%+.9$q؝@ `e'Ԋ]5 `zX |H7_8 0@|?jƍ? f: C5PvZF%;ɽKwJ=չ{u5Do(;ࠗTNݬJ\ LiŔN*f&V Νؗ3эMw#ғۃJcatbOǙqI5d "ytL(L%nѰW&' >yYR ݄OpjJiWߢ?'~?۳]7/s}~yϖtV_}'qL{hӽ**.`POX'`0 J=@6Hj t`h yU=ZYj}t||vHISW= j5m^>Y}.^{4oTСZy;~\=z컯믟o?? X[&=/;CݘCQ:ɫ+VۑHw)$y.%O$6g2IexxV|[&%x6)r<$TX49??S%C4euL~ec>wFsgNUSS&OK{؁z44>G33WmսOunWs筸B^w?⇞uԢ^z\?ۭG-M<]?vwh7JעM|x':/? , n9ʍHqbp 'GWZ"9rJجe+HLg\9 Je/UbNree2%Q|~yޞ_kU_΢~>J.+?JNM;5@0Da<n8$hG`[^Qfk5kA 8dOH`XfdV5hV֍[,_8#0`lO i?S ![ bei)-wq*%V"\(KaF#!)R 1S2m|q&M>&!%Hh҄Ɉ(DluF39>}`PXF8c)lT<>IN%턦rNvέ͜3AY1N*r Њ 0* p|`_>?W/W;^gT+N%C]s~{-7u6uVLkV^XjҨ>{Հj[Dk.Y魍ǀ WPmر;~*${G7kؾuǕj@jPkLgOSnj蹻T_{Fϗ]Ow\{ s5}:>oy[\:;*-B&|z}.?~ZFkdTD\?}y-+[ZƟu.ͺk֎q}=y}y^ ߆XZdMܛxKYP]q :^q9Jn+ilkRQc!W+GS1RG(c]ӨtIVa=^٣Z ۪1MJըQMʫWn(˕H$ M`3l (aEKrȞ!gFRFdʓq J@Crn@wqK*ă0 L`/C3 ?`T4HhTOWѱh= p1!l$Rณl+F+mNV$ J4&B6$j'zJ3N4.&7]h+eRMG)F4)4&#M`3Zx 10.(aO>0?Ϗ/ޠƁF\v\w>N%T_pv?#GHZCdVد-}@f~XSm^q޵WՎ9Z=cAޣ{U3h[ISӚ:x`7Z6@g]{^s9&eGm^xf5qk*8~\նm[{1{Vh `v؄j+&we?Y/;ݯܧT>yp/=gtJTO`v=sF1j{ӧ8WGuasFN]gssؚf%{묪UaQCo\uߜ /b80Zxnv0+@D?1%H#{)waK?\(greL1JRxz4(ğ1J6 `LH#6|r,0ТܯiVz-@aқ;^ɀ4^'ˀ @RRo@rJs!twl@h|z{Fh#I&ܰ NOƸ6{06``-+KN“ӗ?[@ G:˟L!gEp>S]a l0-QGҞ #'$qIh((vBH,&nn0 : .J&.J)NJ%N붋 A?62$zỷÆ# 7;U3\#GTk* `RT\h12L`$`J JVd+lZMGCR+֧`>*'ɱ#jc=]\<V-EO绵 TVզڢc'3=/UbZD)j _!I,nb敷][}r=]Шez'#usx$=޿Ϗm׺ +o_{_?tXz#y7*=hquR3ߤُuCϫg?h?Gߩ fVzrگR9vx%}~!^Хܬ5ގc4ǹcӥ >|^ӘK_3pt[>E#hk[ON;N7gk噏_{\}uk-0^Wܤ\gÚ9ws7jCd4'^+W{N۽/^ e5+ZhΛI`ߖ|}? .- `ض28C tRtXxOnBY%d#a|\axJo#}) `\⁲UoY0ĕSRq?J (dҲi4 $se" @82LϖBJ="$i)5@)yf& g DiLQ IӥUi [ OUx?und%/#gWd=wU`W:yjT\ U0g˺ƟyUTtV~CshenԆwvwa>; w뫺կ8Ϣ45hSGsچ3?+bbcY7ާ:>~HiY&͏jFM+7ݦs3 7:rn{-{)Uy% IDAT8SЏGKiRUz}kuÚ)gS/%LkzF{^&UCߢOҫ׌O}78~=(#^`%ls/{GN\C?zGF302]S&8S11ʎ6 +F$ =DdnoGpYu; Ioc?d״yߪ$q $x,UZ@06@ ]簀@r)4P4 BWdzNgR nVÙxVEV eZDpk ߀/ 509`?SaNj 2?;T38"l]0qC;@JV9aC L P2@Vh% dEh/ ,. *E{QR"s`'^@`DM ӭtDS V|PQ*um|щ0lx4A=F3J< pYe*>0БL?O֍gTz'T0]կI~]sX0p=ze0I=6^W)-|ΪnnB_U/8 N3@6p@Ztͪh] /-}zc֭ڲ}?t|6ү1_~Ut DD߰;)dj⥷i:FJvhˋwkLYZ/קfد4aŷ>l9yXnAyco}2x nmkgIO$ű]z:z^6rNN߮~ؽF,=~>jd(-o|m۷k'|mX`` `}(={o0`Z W¼ޖ}vf`S;VԷ12F@.:HS6hg{G렓*;"?V$Uf7!xx7 XHf idMA'j7& P0;v ʑ'+>mBJf9vl.;ÿV]I_f8S?^K[߻K/=r5{]k/װZpMz-ڱ 2j}_ۦj|bAZ5Ij*c]ȋڶeݰbUk;olғO=Cݮ={v#{Y˚J; 4+Sk4||ܫںsW!|϶ׯ6ܣUu0?Ԕ"(mHp\@Of&#D7~6@ '$I׉T`A2n89HNj֮,9X -  siYJ͆ _Of6 Hϲm3ٺv 7dG4Dj^_UbD\4^[_=>_XT`|L`;` +L5zu| LpwWy<` a0-Q sf(_܍mr5)Bɥ޿RJ%Rj .g!e_)5r,€K H7b0(-&Ĝ<|?)RR I ߀(t )Wpf8 {E!]qa-4CA-X28Y{ߤSVgiҤI8Y5# .3om#m2qZ'F{$iuDܳ‹YZHXuqj?cR\#j4yfΞYjބJ-Q?Aa-F<= :a n{Ih j엪/N nܰzTS݄1UՕj^ZO|y<]>k ks. i3Q[f=g&4ĩԹfMec"ݻ}u8]Թ2Dcۦj:uS'il}f,^{O^mwm= tkAV|F}8~tMnȑ]wCkt勨WuLp35 G9p3 7^ϰQQרI38iS8Ή[Yv|+I5kBu[ۢ]L#*5qf̞m]?ƌ#o 9]~F(2ӼdMlM'Swhd[S^qf|`(ZNJt^]p>FAgѼ7>{#7jRh mPL9|>F;4׿?Hfl0P 700KԽc- 0Y1b6@MqvJ(c!vo$v̊?ʞhJsЮ\$mSV0n;° ‘p$}7 Sl@o$c>AN+ҴE3u``;`௰ְ^0C t d0x0+8R&Ɓ0;b@fBt4ISB)mťM堁fC< ܞϪA&%Pza=l'-2eegQ+HyKFant)ՅXR\\:aQW9|7Fgam<0.:Z8PN.</Pf,o$d[t-WkٲZt,Y+VܠgH^}æGu۔NYcUKO:Kr%z7}Upg{n+guߤ=G.*jı95zwN|Gfjyzgh=C=xM\Bpܶd0;E7WZbZV<<7wޣmkO>t~}ՕZl~,sOIԦ]eUk.ѯoUϼ^f{T|_7ۆǵ{k5WheZjxqm}?~s֮Ym}^{QןM]|圓+~1>am{5q5{E>Ż=vc=rZ-缬^VQ0?vWXϛ* ?k}GZ=Գq.s_k^0pA˭kl̻=Pud>rgk>ӧ;>Y[P`^N=~S9g 0L3`ML0[WL) g\mB`,z y8~D]D+Ic8d>NnNRNVTJ}V4MIF`sc^DN;[cO$ҙdr : '@c(}y`~Sc#ln؂B, ( Ҋa(%XFP9s¶8E0˰ ޔ D]0 !EƎ&8ӝx]ozm}7-A>?v?3Սk2S9i+ I\~+0*I=S4zE̹Wߧ)G8~6SVŖYNc}f`USYa\{IQ~A&Ä5*=b9IGQy\HTeF>yN !T<_{/(SJ$DղUv(߀-Fcr`HZJjru )`cڸ>W`<"-00)-P8ك´t?+L#1Er(!aOwz%(URGq)IQ 6Iit IXs[<~Vx= @pӃ,J7Ck {ԓA3Ɍ6aί1;rfs 3hsf%G_@Λ]kǀW[TgDo@eH?sV^R6ȵe^|Ee׼~+ft,(TĤq5a|M=9SO/`EӨK>2Nji t :,WF{.l1ħ52Uh,q#.z$8{2U#qѫFLsF64M#o `lT$pQ Ӱ[lK #cGѯ%!f +3q;T 4#?ă'`?"FˬTqֿU=˯$kUhir*v%%LclD9mLm3,RKo9ddIgǦLr2 ;IqR@ln@M&t\93M+)HfC!w_? Z93[ciFb]@c\Պ>19׾)PRU*ls v"Gg`٠5uڧN(:}jK! ²rP9Hu@1 `uPE+;$a$ yܮmjШqcU];ZLTeŏNcN;aR[I4MOԈ!IFoC9qˡw!Z9xd3q}4D]@l^ vsY-7Wc .Dm{ex'/?G3` L@BUā07\ 8iXܫc72%2V?U^?ޓQtu;áJ,#QV 3XL*-lTLYJU1Z5)cǩr0& 1khJ+d̚P. |jkw xF@Z30?7 \pdګ˜uOBW^m7{y>~LA!Sb0OsIҩԾSCAG q[&9$4"g qɰ)$|c-\0ȷ{cћH2`Ō~z6V)E2M-4GW aF#aL[dL<<ZVn-)\>*_w0v- ` O/N30g Ɯ@M U9 3ҫAq hJI=K^QƚZ.ؤ)v%Rr5dTî4OvUe+g (͹X5D5 Ͱ&6YCP+$N[hŐa6r2j<k$4+<|jFLP-<\Fc"L0ɴdf&͸T- 3AnC|eȪKk5C`ீ 2-t@[z*d + Ҏe_,j" UF^Գlz7(,JqE$W⡑͊=dHROO$٘pBs{(%xf4+}ji_JOKf_;Jw;$TJ 僔6`++rK5R 20!{*@eV.f].^Í!0b MCL`EUٺ&OW.ԝgOF M0`茟-7 IDATk0\5)#Daf f 4֮J!PG /|ZA+WW`92,Hfiy?tظb0S ` S:Wh)l%>0>w 5`t|KkeAigj޴P`p0*{ŏ?,ήDBـ$堈go [u Lz1Qnh~fgS0J?X65}bX$ aejׅcoԩM{4_ner b>@c"-ᩄA`ē쬪=$~l# # ɘ6XK1.AxX t9%+(ܹfyĂ~nX P& lA@ (Q~ Rdt’ճu@.QqWg=1j*')h\IfSljHƭgI51e\B6Dk bQZ6C2`xDe$(dP4. (' "sV.7dڤe@E"e(#6Ȁ+hɐl]9,|r|`X%qۖ;n7ߠ{U=vnHƉ]w|: e YO4` Wp$Wddh Toe(L}H|Q%D!R +DmY( @-0ױ &ONDGAn){k9a9T9A]# h+B=pѝ|h6$͆d$[`ϱ;qup!վ+L;1ػA+3ۼ;$Ja%fD2(l97edxiMdSyӓ8㓽0;33|5`w;wy 6W {U}M\x<;}Fmn4@ nӎ`>|o"t7BKCI L lZG5 ;3,L^4D! 0 S3z[€^z&&[t#ߌӷlb,$]\E%$?'BC%Z<;`G&J"p':s=IsgD$9G0A6̤xkMD]!ކ ΆKf$̘ PѩAx6>/^%Z:!33}1 )5?/O`ݪŽ_Z~w?u=}5ذz<{Ffosw`oqJ1,wv5҂7=0mjF9c]X2hY00Yq.q/+p]_W >XG?71asnbI,} ٲXMSf@4$Ka΅0ҁp\򍈍Fh(t$LNEBCX'\rPplmiЋ'(_vc ܁$Gk**wRz[N6qg@  0V` Á Zع]^]=fYL`N@`hhC-X$ӂ%9צ ԜkkM0.VYdQъnൠX;8 9эr *;oGntytЍʑs*.b+er,%y,(ю†')`ʒɊS``r?fD0If&M|z*~] _k;` /]?ޟ߼>/g7O6j^NǾ֭ϔ/6ׯ},6A@?}~ ȝvoSe1J00ה28Zٰ'$0eQbv4 f}>]APѷUuuR $ ZTz 0+ >iMHD4eA\:#&19/GިnAZn6e!ZAIe%ZuH 9}Ax\"y 7 z#4SsCPUkf ci2$myϺ Ξ 8@Hc%3U. j3̀+c5vf4 b@99fӢ${8QE@0SfyyvL"6#HR\9pέ-tȆcU1"%/f 'T 4u V 80,l/} YFIJKEt|B?Rk!dLna d#!5|r+Xq Ù [f-m) $b6%>x2_C!qزM;)(.o3/;ں/_|RyLXڏ+5O^@\Ƨx|?G*N$}=mv>@y]zOcu#XW۱?2^WKcQ^39ǟGy7;c5wm,m"ǒ}^z7*c ; Lo ~zcx;wZMcX~|n|6"ɼK*~>s5r2>#ؕ˹dmm^>{?ʱoWx??GǒX>'=%ǒ+cs*'ױ\<-R^y}^?rǺs\{27r,7On99K/ׯ]}ɹy{X;-ܐcnǒqX9r,X{Xڏ%ߺ`@ 6# vzp"0]d]9(ĭ[q>4җ5S^).w9 @ˈQ4ĦeQ檐B"cܳ2>XFS 54ybPĚ7 r\G0Y+OGM14t$j Dh\"? 7) c%u9m$Ď?J_l)/4cpzg`<Ogbv^&xX @p}iD6XT[OåZdpdDd[Vՠy@55AtxgFŕ%tq\,EqM͞ꐖG9baCp燒ZDVٷ/"@U*AHyW<rHP%rTT>xIf@R&H%2;3Qk8zݒP4h w_~kC}u%f݄6p~Y5sW_wڟ>޼x u}<Dz/C~Ο;;wǁ/a8v(ٍkѣxfVܹĚ5ˇ r 1l,}Y_˖-ؼy>7b޽ʱV,_Ͽݻ|#زe3{9_zNp_[lQw!e, y}9uI<38cAӧ_Mƍ{V\N8]v*}ڼYƲc9#y^y"Fųd{ޗ{S+89wy5'X9y,ye{הy{%~OɼRs ~徖~KJI>ʽ*cyK_{Uq'ҥ;ܟ!rES9r.yޯ;Eoƒ%a%m;pX2Vnιt%.fC :}H R   LzLVM W(DF \)z2]8nh"d!2-l]Yfxp?)V\$R@{cIl" d8޼*[aܙ`J/&Aܗ If[Gf<Wee)# Q^63'<?|}#``6\ǃw t~C؟ p0m*4 ]PQ03!p^hdikIиT~^җF\ȈW[v|@Etl Ԭ@L e0 X/LFk|ÔK{f\KvavD:Lb̊Xx1z>!{=^v>Yٴu;ݺw<[6s9VYCƧ4ܸvxVe+/WN㦒WW@6n7s~+v=Ia۰y} 7>rYIt>?}/ G?WW?Rkhϥ, ,'#g$#ì0A_`@>0`>(dh@)k"sg$PZ-Pdpd[Qf bM9I{0IJ_3Y|ގ5|5͆셤͍8023;Q@LI;h} ę3C<=\ɄN>|*:|P9x*+Դ DC fP l׌'*e60-@ .P  `ex%#ˁ# t0`+jQLȜZdG̥̊ @;Wns#(S=e~OPyw Py[N?Σ(dŠIE›9v~BoΓǝq-0C45dl!0Y3!~w5 ~{r_oaNJ;QkEEeFO3/A kqFnz8^>,֕ !%lHFu)0wtC|R҆FTVVcpM\xS#ؙ(**@Ll^o~V6 M(QiïSbx e%w dsg_l9p E5pQ|WwEW_1fzt.}GxwY^d%#k`@J^M Z 23`T.Gco33gSk[=nxⓝ..~fgzٝ~w]귡4Mً%"Ay@Y+:b]R$ *zyo:[O8-#%HI Q$u|``PL<a}*W1qg7,Kԛo obs; 3%3oqK)l= QSŵ;=+meZ@eՏN9lsW즵8ᄑDAGoocg*4?s.!Ǐ"'< * X P Q`@`W!-o@:I.~ d8v-΂vԾ[d`Fm W\azOVhԝYpj@RNl+:y{/<~5j`6p$7K%V+)wٙ@Ž$BWLs{IУWtLhQ,=z|P:(^6 lG`v~Fb>x d 3?۷ xf4RfIb&@!\9̶ gJ)MHŚ-C% '΋lO'fX<Ɋ -p✻q>%u/?Hr|:xHٳ"\eqg"8=W;;-+@PA0yFSNS^Q̸pnXp~ 7fTX` 92Sg̀˛Wñ1ɑh-GZr<ٞH.lpUI›Kki-sWcc7p*daC-\=T;n3T],23IE i>.K.Ag\eo޼[ָzrz' /?>? QH2yK_p6.ߚ??W{m߂WOo7GxisL":ysJ K^>of#pL+gвd6@ r29efFlk@kbۛ:˜|3L'Hpe`C k2ۍ^!;:3=f$I\Hm8XnA?K̉,l~usm\;30?!q v@l(  B dRLy|2R{s5In3S'`Սio{)/&<~,139 ـw^yW:g 2Џ|A&g\G#P9է|ЂBKUL߷b`'.J7ǘ^f<%ӂ@KF8`JM,ATyѯAFa95%x1C#@̕μ6t%oK,̾J,Kl9G35qAWJ0*h[=g>ナ_}7@eJ0Zf o@85 _,|I$Ll>K}`gZ/}^`CU {!,)}}9$_a%mpi IDAT5a[֭G2d_j?w}@ |*NPV|L̀R& ]Ow tMMы^,ªzCLj$C߼||I4T΄}-Lg*؄r5 y1.Aڂs61To3kKrg&;OKO F2.f.̭Ք5!R 3hE"#QY9W\E;0/*£}ДmN1+04p>0̡y t ֦&h 0!| Ñ>ڽiLƾAU/ct30e 8_Z\ǹs_6qkcpL$HKEbaر0 Ee/ALv>B§7 8ZF@ ±(s BH ]`^+ILj4֯g=\0pkxAsc;nvރgYG{ |y}\7e.~o `W? k2Fѧ(-yf,Kr~>yǏ믝R<44Rs?$7_+ Q|ߘ_OP@5·;`@G'3pU26B/ֻ%3`OHt $ݏ6t3eŦ|P-,, JחihEoǽ7I?ǂZ{)IEDp5%̈́`5" 5# p"16.Q.HFNyr[]í9USU *aC΀>hI V|fT&af{)&t-l N;bJ  = M KJؑDgI ``з|ϕYecqˊs ?Y- <=07hФ:ИI|Rs)̧ 1Hq>=9Sp\ 3ȭAq_vIlHi r lbD3ɳO Ô,( ǢH<]+/n}Lp 7od3"{1"'( bij2`2QHG`q^#g)B@+o`fc?/ɃP>ו9emXm8KX^oX?^cw|K?| ߉ӯ&)v+ZٟWe9_>8ǒ}K~xKuܹ~/2y},Λξ?]cX%c~7{G>ɼ8߹p)[o ;⍔&bH Yfef d7i3Ca3Ff#J>Vpa !M-j}Xf*>65eْp!3`$gǕdݩO4'+de )} @`& SV4=![vҚמDB z†ȯm@jIB)Y3bUlϴ{m'iIyL:۟hťS~XNT dEȃ>E5 ԆZA0Ѓ *YĜlDLF0Qddȏ.T$6zpr*u{>|>߉_$є)3E9V,E92GFqJ*)_ !wflB9S0v̓[h X ~3%ј[e[7ϡ8Ej?A8)̜;ODEA A-J׏Φբ#&.{(޿zMEkJص|"oͫKWb҅5u K}lgp9|FPpZ$2/e P_Y!Oqb~ ot'DmYgEDo?I=?./3gNǿ}8h͛G=u>^K]>Ņo0gl#@^}|n95Ƣܹs vY|Dgm D;-͚5oRދ-R)ǹsp_}@֢O hPjJFE-2'N`S4颡}bJr^Ej-ZSԳg«gP6Zhe^@)׭U4M ki"{0Ek/}̐>%'~W'ǽ}ɹ\`ݙ3g|x'glXDkg\ksc|W' F<fϙz~f=e,[0`?P{]].>VW:ܯr G@^?y9@f͚{r D~,o*˱Z59i̫W^@H+[`zo؎ T@LQB6Hv멣58@+V=Sa ȁ _7uVH"Ou#R°l$U!. 5$_d%|(4aٟAF3G)"k|L"yRPXW:dФ(,|2x -8>vob*Ǫ ˆ30cZ> -wǔ7dY;uok $cqE"@\:`@~ {<J 鎦xFwmn  31oE~͔(K1EN7 yF #vʑYK'I9#B<Dx5dհ}<a0i4H19-Qow8hB0SYʁCxz>Z&MCQ(hh!(3PI|t!PEcj$E)$30w//o]ǾgVa֓h!%$wC+V||z/fdSZ:G_Ğus%s"͏X.X H40yU:a&.~*+_y#ÉJG/\KCK`xZ$~17SNQ%mۋ7n`V$P[3GW>>RПa.k.+NΟ9H7zvoՏ?wƟ5csݧz'qdzɍ a"t&:c@ ;1xXhK\J\)]sv$)'2mtfh"Kx5~ \1x1Sf}QMXfMZ{),'QG{h$rGԊjR@v/ "`Wǟعi6Ci\ӇŸx&IAI0N33 `eQ  =:1٭UfHr0`紛>= qnJM٘Ȕ@N<D:( 6tT0G–DUT'*rB*'N`ot2>UQV$ 8LV$A|_LBx],ՏS3a*FOFـH( ?QаI Th3b0,,,%oW2FּCv}%*b!rRX50p565:/fW79iA zܪPa8{}ؚh 虱09W& b0q!kķ͍ՋKgT |?,ԔyE"DpYSlz0QĬ@Dj&S6';> ~ n$qA-|l xq$FՐѨ5AmL\6{uc&!/2)]<:O ňX-cPD<3y.)h3}3@ӡ`ݫ3\ QCE!zC, rNcf@x0" 0:@ `Bޅ'͆4~[`w0 `Ϳ)9̡7b0$&AAL/ qcUE`ReN R?X fP=bA44Nlu㦠?%ye\TԮ  Āx흌e Pߡ&{A5?_T80Կ SRL-=/فϽq7-xm~8k#ġ*bwCİ71 P`먀 J̘ζpTl~iXBbHD3ooMo5'6>L[3Ε/W1t<:1 #?+]x&81 LquC WE"| #0J&AGih~bMmx5\&/:عABFL8$< ty<@D0T1xzڝEPKz/S{qN PNhB ]16fT<8\Ƙ4ػˆYCߊُYJqbVA̠\U n\1 q?vhuwr7=r:9QJ28B, EF!q b@E"g;;:=M Ơ$,JbAi$fjGtP"T$7(N` ;ٛ@,*(h>1)JIHMn9#)K09[;1,Q*?$Lt{s8Qxq9띰9LȯP+MG5As |PeD'c8갩 ]qEϠEHP`03e2c@=tTac*؜D{Z:‘vlƺ8l(׭I*T0ǓoYg(Pd~+寝 E2s}iYG@SRrS!FS}PѝzT`p>))AwCC֝\tPnhAI&V1%26AɆE߆pbłod=ι c@==#z7Pyai LģSH#98$ihlkH8ys@GT$ e96!"JH/"08' *Ӱ543R4`@G" CRBGQd?u?ӵ``|I2Zo޾Hv5.tuXS qiӓ6Rס:ǣZo}tGcE'oL`wc5Cte`GcnZ-0lֶܑLY3`A!SS?05ikK?cq䣄є9|?ر)T4߱T'`˒g藘l<Iw t$tg܍R' _fFķ_%I= &aIuRIuSG2  hҵ <xC3IbK$9B0Ei!3T\L ĎJ1kbBɐ%5SvTJӧyoX6QÐMr8%%yrLu' iDdC8TpIVqD?B >"1N"\ 61y4k.@tY w'K4*yX^K*fiB3VM{j D%@:'N/d |G!m 41JZ f=ň= ̡mh GְЍc9LykV62$k9FoW02' R`էBY"thŬ-ilCP`2s! =@h cdхvaU? $ '!5r1q&A4A(Nb تH#(2q0. {en^]PJ&i@[TZ!v `̤r> 7wBTF."g`l=aI1X׷yId6?%j v ̆7 Q$\Ɖegc3*6jr4`@q\[͵3 أ`` 0POm] ,='"D>;Ocy}6 j.sʫ'=~Gҥd6mj5k­l05񱖙t^Lui䤃$aaaT &^$qRC I#tet _Es z<(HMP4W@ !8AŽ utBe9oTaɓSDrQ :'0˓K&^ a՘r+F/Z43) @83=b.H>000oL5j2bٗg u-ܛ"0`فBoK`̀ 8 J qa:ڒAf$r'H۞u/as)A>=1(ѬK[a*w1Dn,0MOLrBH^KdJC5HnF|E$jsUMtP3l$_ Oۂ3a6U}[__Jp5Eº̨NJ>X֐MExn\a2ҏ~0]0`t:=(A{=4 z&!3&BcyD,젫v'*J3S{%G@6zgG, =X񋂕_4t=-}^C8$Ҿ8ze@;a%̃Q 93a -գ&aȬ%p-F/وQ7`ļh< Yut.,F< | N,i(J2E}5͏_Usm5t000 o a*cX}QPٳB!bU\ժ}*AqUo E$C̀ʿ=)!=rvW+;%nIU@| !`bۇu:V!$"ޥ QJ!SQo(8LXOފVrŻ3U۟)T4L0;F= YQtw#9X\^=0VNؓ0~k`6GZ+dL:6%I9kNF*t6Q<2IVt4ǣ>Yx$"1v: Bǰt*aPts99?:7c<݂u0,EXzcT?tH.5c,MnCan%\7 @ը'L[ 0i:F\I=@2o|KMĈBi, h&3 h=?q&`[2Sv`ಢ^V3RBm60`dmtӢ@7c/SiRdA"7r33Gά@T6,CaO@ !k*PXÞ)nG4*v- im77B,,Ó`EBUz!l-P‘o3aUbӋ0Kc첍x=Wk0h"d e){ $_~6f2]XJ0m8\>̀;Bf vh u} h P[%;P@ X"Цq Ҿ * }`@4vLcˠ5 @:lC>[ѵb)&A?/={W~{EMV#`ZYSХf=>a6%6¸If‹o* " TՌԚ[RPr B3J8Ŝ7fpc{* ays&3gZ9hƪYj={e 03lF2?kD:;1SZ0_LCGt3 rR=ccRg A@W@tRG[2yeo&3 CH 7z!9 ڞICOTtsG/X'>"ց1wDwXtJEt -@נ< \1e1/V3)ӑ! qd3`&;Ia kpotjFa23b7 J~@z:֢S]sPt[9zѥʁAx6ctLY[t<;gx5#= K0E#t4d!g"( F}&Kɣez^g&'adU)5WPEPjP%v|_=@;y'3`ΎF03 Z󶂫K6}l9dTvy -̯aE uT.G@ Z1zM}]ƜN0( nY^Oidt>Eoט KǠ/텗C7a1t- ‘dCzJi4DEBa)9(,,+WcYRX_?rQ3{@sh= N n7&L(M f$x'Y\9 oӃ1>1$%3s{QOesйa< ѩi :֭vxVA'=r@WX7>\Ŏڏ{Сq;֬^$7@7`xY[L|vS_6bGѣeL˦#zz-LQ$v9̭_V))p&#D"2PA!1/-j˱Xޯk`ϼr |T B vJor: Xca&ɂ NEA= l2!p%=Ԕ01d*+q.T,XGf,{0 C{i=} Ƴ?D)cq050*|`c> `]1X4-Ѵ0Y|v~]nGP-za+_O26 hrT PnٕuH"0: \M `ob9oÒX5r{4s4=`M(I&޾-N[bf3=.)-NyFgLY.U M@{ %0.ǚ㑡 \}vOC9jWПp!+.#~3i8(g(t 'Kft Yok!ˮmI-gMD/l|>AA5 nKވ\M}o(|$3k{cZ,bzxB =0 Nۣ3 08Cm2a-.ɕp, E i!8 QR=^Y}h:4j19*F!ȨnD A TarK,LԀVtf{~ >CID00@imC}ӎX '61N0e9ȭBS\eDD)У.<25L0*,g.@' Fp $L@ξ[p]|p(L'אxlY ?Apz=ªyS[: FpHOF)K,;HOJ Sgfk &f0a]XrT ֍#WBiG$43 nM !0Ї` imo[#СЌgXfʍVdS߮J!,f7098 Xfdښ5Q`8-m4M:Lw7f@7.քc0sA[#p^%)+~ L-m~lJ(3OxEo/~{ A5-mBYnQo҈h# !t?-*~X9/V c{hܼ0l푇aTWC#mI T!V@6O@ך}fzZ;|<{KCeVSh)f@/X2"ˎ^ix( 荎AE%G /Ւ0:Fע+=Lc ^Ja͆Ʈ܂+6c袵h dĒL"v T%AM 0G`؁0gЌY4_m0 ^y~3&pkϔ6SܚB(𱁿 iunC X9Z^lD2hOAݝorMaߵLU5AoAMTka\ 2ּѤ,³*L?![=nyUpͩm$X 9vpX}e`;y؏MpR"2P1t$Sk &hVC4`&i={[1*C ' j|k  Ft74GG-?Ř{+>a1*h /=!w`-[b * XD-[J!<} rVl4,;OfC ~X-)EhYB1}gS{OD#ڳ'Pk`gNKѵp$ T L]i!#ǡ 8F!1JvHIpf࿌#i $ eg21n> i"Mǣ^ $ 1t>ƒI7 [m>zMz>0' n shDHmEH߸wcidoډ50gJ&=C`P$uɨ窶1ci ֭>d~@1M0_OX*HRW`2 Zrc!-Ikh9yQQ%]cEu >tg4< QIL^S[:Bgz]]靍Q nau:Ĕ_S'06 -`vJ< 6esB%( 3BY01g 73#y@g~ Lh{l=P62CP@ J!/J6%` U 7~iY3kvoe`@I \8bӝi!7n$$ d&P*-]uHPh2&[c,xg݂э=;+\a4ؒAbk(ۂQIѻIh;gZ 2lc!?ctI.߃!jtY'ƹeBrQ\L==Rp5`{"d/t:iPn7;|ȹ%`Rh &.? [nA) ^`Pi9P[9񑤦!FHtLcH0▭Pw ܠvLSs|i& 5?X _~_7}xۍM\P:|/,Y ˲HyYZ еq1 IDAT=߼ǚ_y"?ퟓLN0mB-9)1NBȗAS ag9̓l 7&Z2Ti!} A*fd=Ӡ`I ȻC&l%FS ,sRZ(Lsdhwś0iN(MPZ26ѩfnq3 =#=hNC(WxÔ[CCSp%CQl)sZ;Jrŭb_|)LΧ >t9Љ \{믾qHB[l[^Coː$ X1YMXw=7:fP^s *1v\@[HM78 τVt7{.F.MwtIu.Yh(Ŷ9N?+r7ɭk`oxT  ?%Ӓl8̟)Ґ"hJP+7\ZiEA2 Q&hm^h>VwEoekHhXE#Eo%jLwAف=k>Qw5 #vcXx@Jg.ڠ|DOih{+ATm=I$ېx..YCbe >KaK7Cy>۔` QQX]+;+X ~$]dgøˠ?4"8u0y^u#[?g&X8fJ\͒&H6pCEӚU9b/=iiLha&͠dlυ+"_M߀V3<.bhE'1DOA2k?dTb]䭃0ыA~0nuȲZ^z%/@z+s qV _uǗSu瘂PY R:\cX2 # Zع@CEp, Ae^K ^mvstV. ޾KZ t%E c{` L^zӠ 娱&HP AC`4{=\ΐ!9,!ef=7 )=suEA 9oy9Óz.hhZ/`Rs5k0ȿыZRBv @Kbi] *wFŮXW$?{A`` 2"UE2aQ;`@~,]Lt?v=!X1])C];qbׄY+p)M0P[݂yX'3'_qtۃ~ {UЁ oJՊb?w`9t04Wl(`X  8lCF`q1e7eǐ%k') CHn50s>$t)<EcV٣#zP7WR2i ysR^P6v#=tESQ/} *1P녙ʟe+R9EIŰe>YU2&s">6cu9v)ǎ%UUkVD[3ݹ3; ! 4M RR˩Xj 3eC,Y{!1:S0r0G)L\ءG+hU2/4V {IHޤB] cgAS׎Q>_A<]BnS)D:; !떌/{70W Y[v#q?r bfTZ8F2N 9Z 6&KRU]Vc_*[S*aχx>v?_=…(ZF""${N_Ǜ4V!sj\uϿxp OC'9?#W7<ƶ UH^P-Dx/^\_7h_4o.g8%Xb, %dOE2X6Gu"&I7^$:4RVi3$sFM)jgcg 1CO8|lГҸY&S? C m N9^a|Mv@zXg k 9s̜ -xlv+'4ᜋ^v1dn<&9a:-_[;! Rt nrX=;E+]JО+{= / е i@Ua1EdXrmA@@0őhj0>d٢IAYEULdtc[8ÖVs|hM/+Pqi>7 >6>U7m;1DREA-ZZ{bJ[;ɐqRQ0n|`u\|F'PFL!tbn|6 QQU]ۊumK`}XWV5k`v5׬/>Vπ `a|r eI4fd!#5N6зpڝxhߧ;4X.*2~V1vq Su֡WX3p7d+f 圌>$: A2c⽤w`hdgB3 Vn,k<Ǒq#~,)\8XNx溹"K$( ^εhS &6+NI Xj)0Ӑׂ8ƪ80Re1.FP5ubbԄka4 (CA R mh@eq?:2LLrĤ;̺x٭O0Ś1) I\ yXs3n#,nŌ%T E,Qp" CS` e]XGZUM,adc Pr%Zk֣c}5vՑP-aχx>J/xw-lxS<{?=H;k`I!km?:I>ХMQ)<~Ff/v' egq#<}OǵGQTXO3vk[l}ӵb=?s6ȱ %d2-g(` GLoq*Х|o.<:ӠB =SNg%L,f-@ چ1 ]1:`Q8g9,ރlm \z S@"d-7%]ކ>t>XQ@A6e]S~, _:m؅I;lGRt?:sY3`b/weS49kIuTa/jt2ko3k`k4`:rcrȰXMC ف Cea x2jiL*PpYB^ |Eb4S#0b!ciΉC4A= *YFO!dt`bt))¤u7 cRr sąPά|Cއȶ°4ζ=Sam< řAv.-F:j^SAfeZ1oAP | B[ o^h *sъ@ffMUMd s߁ \} =1CGn[aΠ(m {SI]WVƫKQ• pw2&M4*•OD _| 6mU0cP6DaM#>} .?gk((L5Vmۅ^/qx\1OUрb]{%Ss t>~w3pY@7QVT9#otj]f%jgYK,vcM &iA}zn0p<٧gi0 TN~W/+-}XzP Z) Ͻ>zXmW1&.ĈN \s}3 | U研P Xv^kPT .\p^Bif|_5k58H}pc0.23U=s m98%Xf40S^N4RFiƫ`t9fρ<[ bdYU 3}WGR@R|D`dqt"TV|L6u(S [,U T7@E&51Ę,`-;dCwaRʆ֬pn U tG`sW_:0bG$l^7۱q @<~D`ux~w;XE"#f.ba3桗 @/X֦F`) @L0BMg|厏tߺH;c ṃaC1?&c=J(nQIp/k2<;6o 玍5b0'ފؿg'kɵ0QӁ} x%zMx;21Y^XjJA-T|~3>[ׯώ 3}Kp_X_M;sǏQ Bt]~ϿY)9U=s_up4Dz@>롐X)e[3X @Q);A7u@r1fl+tN`:Xzܵ8@ Ug~ |C0́!@J9VSEX8o: ub5ZJ 9G (4"2ǵ b:_N2Mm033[ z߈nu 9ec$E7ɴ1CkOFemW|BsᛙRĖF|ZDBdAE-:sܽ0)9HK5kkFtnوIP #/@q@χx M77Šײ602l#[́γ`LP^2ݟuv+\M#f-<FǏX#0?׽ǻa ۔Mhjiֆz47&:x>~3"f@/<)('Xk\ X7G~:rg \&'1-NQ"-~e0`D ǰ J5U #` 30A3Ї}22qZn8 6[ P Fq"}] 1=K0>2aP_-RFCC0,w"G<X<+0. y-,/ M7̋^H9Fҋ9os̞gEY `#l,Za0;հgu{o~b~4* obY0H %bɶc6 i;tT0e2K@0c8^YcQXIc öCJ;S[A3Vōr@4F҇<&YO1#c0(㣔S->F يU|vǗ1jyH0m #A'YɵMkDl1܉4bKᙜ S@ͱg<-^-k lކM 9O IDAT11g)b 3sn }#X/H%85dzHɼn(μ ~ )^];jYTU[!0 E`6-g݁+/_Cϯ׌]uWoţWTs}q;*e=`` X&DLY>{`]`xY4uazB:4èP:X:ϐ`Eei4c'Pp"ǟ}nok4J)1,\Ǩp O> X`yn8 ,DBw0Ds\15Z~zA9T^CCf&cdإ!nMt/[z.`ŮmޏuMNo almƾo]I H8  puEyC{/mPP"a _obhJ )ۅgW8}\D fcxg&`7<Ǎ=%0ў߂{ާqmyvڪp-PGp@502~Wg~_‹Gn9 bKq)Aܽy8ΦZ|ȍPp$|7' aßqX( i VT83xi" ^Ŏ3RZ촕0)hӪXT}ȩk` Ug%Ko21Կ}j1k&m@-[K 03r^(Mَq܁IH1  07v"+"e}=JZ`(h@V]#R6k!S jLXҠ(#7) ػ MZ8LVdwx |86&g&u(rA|C2G)4!8B<&RQ1sO?0SҞ  " 3~vz1lRSꁬ YJ6KDx+ \ =FʇPB&h (bx̃VWu5 7Aj%XFm(v%;OlnO2hUSvy>X]" p1񋃿g(y4燼դe#{QSn3(l#wue` <^2@o;/x:~w%<VY#,Mqup1mAzy >&핎w{ eԅB3sQ;0:ky)dx>vGbLC,,ZCcذ{#K3q9%h;Jf݇`f? .oGU;uQ͡zo /dI:1z$BZUә MݨU@9jhi!PI}S ƕG?:ZԎс%.Ў'#,G,eGÐbRȅz JC!kaf!nI>2D7^iHݰ -<}') 0Y 0bwBuȪنͻ~/27F\E` ,Ҵa:6oiN(dnA64/,׃l{!.@az$l̡od }gP\]o'pVpt^x-s/DzHJj"4GqHH>}xZk #3:͂!(^Q zclјaHԶ!`x 1Vd~OwŜZR1x9:uEɘkaټg#c#%`C3q%4TQCq. MLa뱰6v20|Zʫ $Z ?=kb} P2_np7"02sxCCC9m-1Xҧ=emن"=VK0:c?ѧP {zK dH[`O&{+180zFՏЧNiJhʡb?t`[̢ެo%L߇AI'fw!9~mޝ[j (;# 2QpسZ Z%2g <#x&萈)K;Kk9tw]n9+s=6&P5ș6ϊ5&_ɐ-FLCeSؚ AEPLOCz.jEmAw6\©! e ElȤd 09j!9,$dmF^+ wA`7t@-FA` /\BV ,5B W>KŮEH/lX-8ֈb0.@G*EC0;>} NqEr޽qYS=uT0޽e?`WR|w _>ƽp$N9+o20?e-q ?~ x=<|xߍ+3Y=Ǔqi\qCd/,K ϟ=s=ww{w>\)pNN<3gK#ѹn^9NxϠw;&OJERO{ ,z`,HXZ-/JԟlFV`mrm>yTKMKᔊ Px2!"8YK5qH$bUՏ1hCކLI('`zH&T ӴDmz`I{NF+Y L ,~BVVlD8W-HEA+,~X-@{+Qbulk鮃?+Ƿ"xf>A(t1Dl=yFMQnO{ZtbɦP!ӢM٢iO@`n%!nIFT&@@A:N>, Bq^Uq2mM,bG( ~f9Ѝ,vpa3X,uXlJhǸ%/ƜKʢP)=Yа{DGv )>8;>"0p( SY7.,޽Ϗ{33 5B>a{>B޵ uֽ_9u_Z>Ư#ӮX}1=Pk>"W;eO&062TǛ@\Y q;u?PLJŤFPЅKAJ{05i4I]k$B@=z@QVNVQbHvvA  הB8'!։LAsFLJ\5,܄I`_+YK#A8ֆuf![ nD̀Ho ~+',dTD AVy^%(vBfB-C*0o/hpL3K?(Zxa*)#N@nGq!5(IYَc,Ys>!G0 3'G?fqa.n!8 s`B&(R(`!z +*lq^5[sEVEP{Z˹ iq@ 3pk? ^>ƫOqVwn5GqO;youlណr~oSԩH&3tx'1*`{%A@5[#|' CcHP {J5c g#tx(BN(n*MWE3!h1Um%nI / UUL̦g8 1BAځ)\.Ō\(̀Au#a f! a τA4ߧ|^r.t*/o⚣€679+~vto%;"止&BL @7opQT1a U)<T TE#9!VD 0V#镶 }6M |!(IAg y>Pw/f:R`G : Enn賮À&H!a0 G4dAL9IK(8oJ ePLZ Ŵ:(,ibQ'>ob򺋘QЊQbCdVbOfHV?k? g4Am?uO?9{=}? ШH`.ك0T`3{ZXc-ujlQ1\MB@`$́-]mZ (lH0LtP8*rL5fEP @N@Ƥ*@f8?! %V" aEkK-hh@D/^h#31=&* b P+>5L_Cdyj3sv!M@`WG9p`v<|@ooDuB@Gmb ʼ@U %BrAy3ṙO(4̇G+.A10y.lD?X bH{`yeИ(ɐH¾g}^ɣº7Fmj8*X,evL#G-5V 'a\uǖ@5crO`xy]eqOĀE-i;X<^9tf:ӸBLs[8fҞI`w$|`tJf ,ZY$}[R(&VaRHs+FVڛPO1f~ On78̢A  WIsa8с3]]xISxoƝsI^J?K*D*XX솤 J.ƌZ[v_A\Gxu|T| =ϲ(vb0;3$6chBQq$5FEU `AfdC١Fχ0 aBxd#+1> c0yFoŨVHdIJNHDq*Q+AbmHlZ_cvZx`J@ ڭ;z 8NptVF& 1ŗϿſg/>7غ gf?l<څcL`)3&wG?sǗ_P D ء"PU .Ёan( @nT0bST ݌fL]rwXe-P9#8>jҌa`d|$bS'` $$VbLDƆ.tX9ƀUN-äxv$lZOL&jTN()ꢚIYuRkbl~b䶗hyægiώˈi:Rvjk ,i#--8& "£;pt?r/ٔn l/G~V$*܏ Pam* "#2~,3L肳ZL!7ЏmAUvwguY~ }/ppn Ϡ_)?~G U&[1(A910qgѧǨ$QuFP7sH4-o9o13L_j+j{ mwt)t m܇lXF lc@8M?b?x_}OΞ:x_|?.N/9[_xʔw~um{hbU 6G2О̎@Np@ Uk].‹{bu7JB0A |eZ‚ܽ;)R#V^A+S)؊34)ep L_K0]Xrc` ΧXQ -<`h)وbpU ZO:o|- SC>4obVUX\[ 5^o;=hm> F2-߅ׄ4;qQzi|+ ~  ae=VT١&Y4]1ȍCDb$AOq GS={+[?!0ICƇz[oanM'n(j>mhm: Q9N6XcjV_33)׃x^EX%e?l 3W>G^ÿXu߿ JoƵ#ؒUd*9* 51!jjPC=H/ƪ`G#+n#>9AwMe&AvLOcW|#WK W1XeƐkRz]4t8_I] sUw0k`Xb̦ǐIg+6<[0 Xpq *cM!ll?{q`N2ArGۙ& }$ë'OWf`wŦE YF@6DT%sM3kヰ":ˢ#EKΎpJ[ nTR F%88y%07B+n`P-W 0984q y !!S7>bQhn -Wp Y nX׼ ޱv΢Q)pٕcdW}/\gA k1cа$Un"+!dQ=bQ5uсቍި6T"-!8e >ipX0IߌS.ݍbZ~L-"sՓi3d4/9Y2.`r(T^byVZ VYIج9'^{A!q?[a].7Iijm>w$Q/AS} IDAT>` A0#kBj 0Eg_p1l*ZV1iHh7)7lt#|ݛsH=8X$$bIb*RR"J嘟iGŜ0]F.نKۡܿʲPNۇ[ZtNYK|?VsU.D}ڴ% y64wmLiAU휓v6ɹh`}E=`ɶtQa4_e('? ׎X剪p7 uytĆhDAc6{aS0!\k]NXgp#@( {!5& s\2=`aZ8_}nfXejI6&{ -kSV5£ >+"he=Wm5-(nFFYӈutx؀m4 Ze ;MU =+gApCn T<&=A,Uy!M |zJ$VY $+9\K P;L 8j| jC3 K ^X&&U1A R2x/Ҙd$b $-EB2D%#+(OJ UQLih,X!9uH)⢵((AeFTS[opƃM ! SSpHG VQű`8M N?<Ff}:aI* )Sb hw j&|PǀV@ۏ>sX5\ WgV֠*ڟoZ(/{ Bdcڤ*i1e.: 2/e^1~@ -9 ioY{oi6r^fN}{H .$q3e()0h I$dSid,*x6M+oQЫW>rˊNM3Ýu: `n&Mhh($ ́}8}.?M /o 7ԝ%fAE a ns @Y@UCbu (;7a;kw ,1x6<н!oJ wy>(L@ĵB,yxT 5I­D3]P2x)ji*ƍ cSÄ*p4Ĕ˔!1@4韴zRFIENDB`fotocx/images/batch-purge-keywords.jpg0000664000175000017500000020014315247006660017045 0ustar micomicoJFIFHHExifMM*V^(1fixHHgnome-screenshot02320100fotocx-26.0: Crop: width:851 height:412|fotocx-26.0: Sharpen: median diff 2 13 13|fotocx-26.0: Paint Image|fotocx-26.0: Rescale: width:817 height:396|fotocx-26.3: Copy in Image|fotocx-26.5: Rescale: width:711 height:345| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 396 817 1 2 2 C     C   Y" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? )h,((((((((((((((((Ω/ҏ>?f$O5=B)2%;p}Mg||PU}KGtLKiZI:2J-p>$Hǭϊ=4SKE,dt:XКHDPHpH*GH$ׂ<-Ťk~-%:v䗊H :(sZ W0,$™*O_(|[W0,5#4FCi b1pb #Wx=~\q^-I"Xzg {R7 fAkXcXMkí&In }|Rm i#ڻ>K^0pCr4r'.AO‹E\s}4a@ 8 ~u?=@x"&a{u@k)2x|ڣWu]GFso^MyeTܰDO$WHoG ϨiT WVrLQk% z_~WSfiwt{;ĸ dS-Qsk|?edf̢Q΄.y}aI_56xNOaZi, [Hد}j/3_,6]:[d?cLWA,3]Qf]ގo?j-GLeVtv2}Bd T 3㗌|/6ӬZx~]~m6F QOu^=BklwI + };vJBk~V98A9s??4XDTTexK|>?4XdTTexK|>?4X~?4}4X~?x% exI|,TTexK|>?4X~?4}/hRԟexK|>?4X.I~*j!>GCy%e:$VO쟣^xZgT֥[ ʴ'1m1^Y焿ɣ Fxecqm|Wx_i-Ȇ3HXF0sI/5/X躿Gi{.%֞TFBc5exK|>?4jEy_6ֵ \^s~T)@czSᕯËOm}qz|GOJ&U%TR2WqY焿ɣ E>|*ωTιɩ0U_$.:sX~KZ5nJh !X:׭}/h,_Ѩ=?LX|csek 址? Ş05~J"m%@2KfX,O/oQ0k7VxXoC^]hY[*0`F8>o;r}F̲k7& >Siv X䓀ts.& Fx|ak׺nYkFi#_269;-7ŷھhVh[I+rk~?4 Y4;4"0' 𮕡 rj2@̩q PR1QA-4 _z߉[JF񗵶ue"5U ?4/gV3>= 6Z%ch䫁FH1Y?4X~?4}/hQR/h,_`",_Y焿ɢEEKY焿ɣ E Gg&ܫvcZ]akD3隩Yq'iV !gMRmiZg4kZA ΐ[rO$5,dKeq(W9*oX1޶p儿?ɺ{i| Ds7T R6|s,OԶSKl>-F K=$Kj{?x:1#5d;M7ayMY/./g%ݛslmcl+L>4jֶi {Ju,tx5Y7pSzus=tn>󯏢~CZJ|ږfI އ1I8aXsԞ-VյmY-m FC9sGҁwq?'>$7-[^82Fm&o4[wCrYw.m([־&xIcxWMu4e$\XB~U,Ҵ-OM 䵼ԝ3(p+TQ^ΑυZ^ vز1vOC>xNx:V6 \ 5#kxbI1>%_~]ɜFHF? d <;¿45 k֚o-oFS?ZMJ ]S̰ZH>V0q+?⎽ +/]설 yFx=.3}2Km]M49',3s M ,R(dr=#/Qmw#rEh5KoNVi%b.<> 9W.e&}M'{xoB]iuu4os1@M Q9{\Ύ}O_-cſ/vzaa%ΗMF+k{vI-|r3r!|KxWKo2xrt)uKNIfL TF9}ϩu׃>&|Iox^/5/asrKȁԅ,a[}{\ӭK eoׯ>Zaeۅ2 'w`C:ƒQxaHWU.K1Z G ԩtaQDJI'M&ZC/Oe[ZKĶP 5a2(F?69;]/^ӯ.4v&`7ZK,|u2ũCxuYfҧl 60@c⾣G5qroJS^iWD o&re#YOUx.|nm7k8e;Rq]F?֟-w_|Ca$,irdžm [Xu^4Zk:6>#hv^,*ßjBnQϩuxTjC>,?51h}lYts:|.w?ú/xX uKwz 9?Ρr3P?zrn}OG>z)?7P,&ts:)?7P?zrn}OG>z)?7P,&ts:)?7P?zrn}OG>z)?7P,&ts:)?7P?zrn}OG>z)?7P,&ts:)?7P?zrn}OG>z)?7P,&tDޥ}C;XҧVhk鉹6cI8@Z&J) >"|?(JZsK^mSÑq|[k𮧪궡-ж0Z5slq]okzښWyA$pjOw%P"*#tO>o ⳮ>qm8޿~ѝO#v矯5?/\\\&ss,b7o@zȾc$: x_AK+&mL. ^MTIn6ЂO45HҴ+ktV2[k/6XZ ]Y-nOG%ㄝA'-#vj,i3G 8~rmOx&:lH/ O%QyEzGu{x7v/Œ-cHghm÷z>h>m=.-JG+!Y9BpG'f|9&|9Ͻufj+^>V"}Nsſ|/okQ29E 3)/|c׆>]MxkM[WOR^Tc\ez!YUKT<5F&v]_@YKM+1ly#5b[{iCI4U:Ťfv\$G=w~ӣKR T<ȞmC`uG#ֲ|]xk1M$W7Q[Cy& (:3֛9o̾ωnJgdkk[C,jvֺkӯQsXRFr$QPVtˆխnhv2R O–KA4p>A|Qaty%; k{X+'Jhpc73ƻi_ued/露6+/qbXx÷?~Okv'Q0 Z6Yһ'|/s1.- %FeA,047#""aՇzh' OhqѬ%lp!0=X'޸ 5/#xHMsV Z§237H;m_}uY߄-^%am"+>}ᙴobz\1qc Y.^|Uik 3,ryl4a[9g)^-V -4ɨe ߀}=Bn'ݰ\KM۱lʹ|<~'nv;x#IH)`9.g5w rA-bW`wSt:WÛ %-GadR|V*KS[o> 'I"Xz r4[I~uK@ַwev֦LQ;O'MzkeizmokLd1c> ? _ ?(o۠} >OSPxKQ?PxKQ߷A=S}Ч 4 4УT;.7Tnz)<%@<%@qnz(t?NA/GhA/Gh t?G۠} w* *?G* *?@\o۠} >OSPxKQ?PxKQ~OQ?B _ ? _ ??BA=STTƏTTƀ߷A=S}Ч 4 4УT;.7Tnz)<%@<%@qnz(lZ)<%@<%@Wq=[2,%&_Ox_ψm֖>3? s?j;=G~ xBNJ2zJx×[8/LZe$b<r\[O|yiQIs "Zkwڤ>PPH[˘Lߵω [U)& ́c`+~;|=|y /W%.uEL-OCȪD_`׃R Z4"ט5߻9=H9(5?*ɓS^hWȨƻ??Qwv>+5/rgheUw[;3 /L W5 ];!#WU!"eGql_ٻn,t멜qmnRW E}Y~ t i!g0|G9>hRzҪ Lծ{麡e{l6z]SAk.|eik nIuHhV+,X[d\`%1?ŊZuO ]#TӵBDM?5֠|I-&)gNd"p,~Ӑ~cӦz֩BŁNqKHV>m-τ?iQ 4 ([<;[lA95<=R Go&ǭxvDL%ͦ-@Br@ri ^|HOm RHefJ+xW j'`{)sEUZ4vg7M}i_~O] c.^^e4T+F 3pK.ŵlR&6Ў@!NMxU&S5w]Z]Io8?b0ҒsrqҜ!uo[? ֝?b,%5$xYt)m_Tm)tff{_^q?|E}w}{Hn{핅R|c9# U]_-JO߉,5@LHG[K .s&gK)AkyZx^JXay'I*ocBԼKQ.}GOe^dd\vyq{;ztp_>,A[NJ>oյaD,eA] %$x7Ə7=榗5kz|Zֱi_nH>CeN A3ׂ5 _zǧk:uxNpkCRG hW>aʪWZgƯkLzl'{5drc*dφ<1]Yu[[wQy !vHe<-(S -@1iZw ʹg185ׁ$b6O, xQy;C(oZ?+мqo{߳/&(TĜlt1+k|Ezv[c$ sӊZ폱y?K9|A6_kZI$*&8m|WiVz՚}/`VBj)$z)9p^.W0AL\M.sОZym0)Q]NC21TKѓi Wi>)y[ Ji/K?OlԷa۱x?o[/tuonJ}ҸK\һ?⇅5f]}p̺`L̻=vM\V:Ƃq޸M'㟀ONynxd$:6A=K}^.t b{) H F:ҋCo LYn3.@>pzW_PznO|(n=jSLdpy-x&&º{\%i9hѕrTq ϟz33q|k+O}:?]ۑ>t_lVf֪ik_aoi&NϼdڰG-J.;Əƹ/WȮdi?쯓FFAt=L,%|Qǥ" }@;ߵz^B/c]um`?g?x?}G*^ǟҿ-/=_/kz\m Q2־t=WhZscg #n0yc _zm'9pO?ZYx"1wbl彴goS|x>xt, ,*%LD+\I9M+Kil3A oQ‘C 4 NN?mi=]iCC$q N`j3iVZ^_,[%1m;OxN}bU֬ m%;f(B#V^9huq Η&eug-%"U[_[?FҠKn-.{dx<1'#֦vQm>,]C>";EZH%.2';'}+%[n?SZ\I#PxcE_p|4់av'eǸeII8# kME|O#/x7r_$~KS<5>MMwh_Ξ>_x_ O~ʲF02>NoZ;db>"~<;GBĭ-rbzr{oGhqe3b Wȥ#pxյ ~Fe Di]>\ҼÿyB:H뫨Ȑ\[ʐ} 0Tc5vt`R:?Znuo8t]cIFMCu;q,3,,H ײ Kxn&.tu|p=T۸gk|>on4/i:->>esAnOz(+;?+|b.h͝T1HQf*l?:i~џnOFE3$w(2/S{Y HW6>)¯|Gohg}TsqD6/j<9;/_ey=Ew>4lDϛ(t j ㎔@$^5t|~־𾡦M1_<),[iGd@*_\?u]BJ<=+5ռ4NҤ_Mx:$V>x@x_okV2i@,cds]O(|%u주h|xYϒ@rG9ǽ}W`<Ն#xUux/Es{nee -Ͽ9R /;㏆Ѿ&$P1Kc"U}mwY?i:i,lk|'84lXc |D?O1uu[_xK5%2ڲo1L;x btxqTo&O =嗍mKP|@i2L#6YN(SzG麏5 -;75%H.b F˰$w^2>| mw>{IsR Eғ@.%?}xZ~;xh> -x-)0rG81k>LKm<MBI8@ x(^6W%M +L7q $d!@'$ּ{_Ï' 6]wZn,n̥⾙F֢w@|y]¿gk>Ѧ.^NX<) h-h~+5>ˊI7ROBGo9<~h3ˮx#ն}-5}(!2ʹL}kz=) Z`y|Xo|=fc!/+t/fGŦ%]n f \Wx/xJok %KI6Ȧ4o,3Jm$z/bu[M&-fMCxGC~~7C]v-*m^HVP&w#ag'4+;jw? ⯆/m,д,W$rU,SNmM_"y]Âw;M"(k'e]^ip\tW%'!.x8 5+{mzsV0x_],K*K6{RY2տjE^9O.oCv&Wuk`ZW-м++OԒ\0CFp>ԧ*? VR)v,$G+78=WiͥsHyO#XOzĺ aD4UOb9GQ^1~ xm; uw\n.{U_-ߛ*g? 񶰚nummVְ\);rg_֋T_*? +mR~a'M<7gs\yݘG&1',)p=xIu)MCp*hWpsW4 N><-uaɮCXQ&X3g91Úϧ%mr>a_{_\5mi>7>Y =S]b%e{b~|AEZ_Cg <62 ۿ4|HåYzv6Uhᑘ9#+ؾk\H6oְ캿A͜Ptμ/~-~36WУŘ{= y܁R[8\czY/WE4b1At=zIo ZeΜ.|?zkc܆A^1m jxKiW79#Ek3\>jt=5{wkkLJ7;Wk}c5>)ACxV{ 0q1ȬVУ*Vig跗3Rj-iý;qԖH.}.*psjJ>%ZŁ~o>YafI$q_ F $u}9$||NpzԄf$3يK#Vڼrh7-챈sdMOZV[M:C/ *\dTo:sv,|5[-ZHxݤIČv8'ke_}3v+=卦_I>!B1d?qՄѳl||Zu 6uHMѸX2c=}k)ğ 5?ͪiVWDEIyW$ sӚf{_\xVa?ZT*ki d;@9>>.O ^ŧH֗~|XbR0=B?<|qۥKMkh"Xue6as P:e* (5i-w]Kc|ſ'W3TM3Oi5w!9Y7  ߍៅ!<9)Ʊl bjǚ'YxQ^cX-Ye4H0Ŕa2|sPݮZA/ju{/:j\ݭm1R3Mjxk14 ?h6VRC0Z=Ūx*:>"! ;ock_폥Ŋڿs,`K$ mwz2R٪i?"֣*Y";帎Pұ\I_~h:u C47MȀk/^$ԥҭtM"z&c|wk]n!\O|" Fqoxk ,|+xb!fels(C>/Luo.~1i 4-u=R}"Mr1b>v *׵?]!o-/u)5J {y#E _~)?Ii{5ӭow 6v}k[O5wz&<붖VtR>1#`r2(AWu_ zg-.oRJ2#0AsL?8V>t%uo\a4'č3b;UUJ|MxwOoˤVY#n,@e"cڕ $3x |5ᩡN MBHF%8?Bns?,O]>Ȋ-)\WG_f]xCAG- sw}$XlP< *Mxzrr3L/r{׀.w⟇.Az-_Ri_ v|͢~ףXc=ծ[*KD;y!NB1 OYoCK;kW K1@mxdW[ }i+cV:Ekv2_XgkQ^̊;."^b}zv62q}Ȧ1hI@Q@ ;ߵz^B/#|Qǥ" 4&r_ξ?X+?_QCܪ{YIJzU((((((((((((+ g_:ݬ/Ǎ~E1Z(n&H x^h4iooTpL\W-ͣC^ݵ 26֍9lz>|LWb3ƚ׊6[t9dL-W!TqڗF\?];WV-Ck&Ds+]໏;y-K76QWդ2\ܜؒIMx?>6|Go(#24;Ua>> \z6z3GlI-=Y7^ԭ5k] :mRHt>2Oi7k)OdxX+` ֯qk>xZic-CFO61  o85q:Ι4ķbVʐL2y4V)K?e,ndvU@}|{fڵԶHK7E4/#&տg=KZ<*><7.:ф1_q?b? hֵH{$漘0\Ё^Wǧ n3[O4S^  IFl`|A S;~Ƕ$|a kCvK)̩ 7Kn,^(fw\_j{=qP O-?hM9Ke$$(4|kl~I_Ggv/ԆNE$Օ/+Z^x Έ|}ŒfdlpA8Z> />+MӼN87 >VP2r\'ů/ZWwR\Ţ>Boeco$O&h7_oxE> y}BibIe5+U| H4H{^` 7=.V-\jfI"wIznO2jt7O'ԡ-.wGO=T2D3U##;sjx$ľ^n5-ZFe~$pӦu˩8FEYOzzt":]2A#T3'5C~"^.GɥjvM8DNH# ͧK\麑ÍKo A+Jꧨ4i>кO|;cvzWE d}rKq*o t/ "%vw-Y*>#iL'5=OK4^K#^lq!ڵ/7Q'=V俲-ۛ[YtEfU$;v"=3 <ik>mi#}k:O|{-ݥu^ff! ln! 5{TKx7:\z{_X[{kIl$/ϠjL~'Xx]KX|9saM#LĜ| 1%Bbjί[RM֎ "Bh~@ ;d(/ h8մxnkrK*\O*I5*8BϵxgĿ#YDᩴk`1?uݓt-|@Ot[j4٠[F `T,CQm?7:7K F4yT$R=+ljiv)isȚ ōZr!a%=kK/cFlxyuOEʚim̐)cw%+ $Ϡlm#H\_ ^WYI 0Arj7ZxCLn.Yː|uW<׍9?rGctVL0Fz=Sǎ>Sˮgh:{[[&&$"p-5NVW]nw z-& =Is6z-+-n?4do?$m47KO8y1\eXuύ>xXDzA8avdUEOx#\xv]N[ݭʊ OO9zNomk''b|OkpچIcW9`fz"KIB1x{^VuWgَpwψ3j^Mx^o>qyHJTPec5>fl}AV"Y=HUo>%өi-Oh1xUkZծk.M;J =z+z.__Ͽ |sMFKr-RKv -xAagkt?>޻I\bDB Ty>4m*RTmċ5 m"9*Als_E5GPu߆.gHguY_.9C<HM:+rׇ<_^:z[Ll͝bI#OJ|ofדY<1C_pcX+;CtrK_ C$Iہ翲-jT /Zjwvpͯ v\$ /[KWG׋|P'fB$ y?٧KEh7'"Io^{{p2,څzzwtN]aC#'VQӮ-gӧ % ??PEMCwW:^%Yli$fGqSw2mBYn,佹sm `ּ3\K7߉RQқSԭ-&}I 1_hlUWf 摫_B{cr#,K㌌m[\O^oL3EVG _toZxRx+KTujXÏ}|ۯ%ZMZ|tyVFTP nMvZW/ޟǬ-1s}$k󶺪V eqG|֝,Dd~ͺ);^'suLZyY)-27gJ'OJ%!B$PO_"W]hUΙmo%Z|;v19 5'#ڇΥdAmgTKyxʍ>mK:JW7^@ͣcmÿWq^%.CEqnu{=*r3_1~> ƞ-W -3Q Q[[KeVbXsqѲ٥&f;\ĝcnu; 1\`%.հ{O|㩼@Qiz-D@\q|hGÏ O xjxy&vh#dؤ .08|yk{@u>m2]XۮZt!79@lu撵G#zmUmvd;pX e㾥VyGJJ9i$'wXy/?~+B$HBJK[`PK$ Coh{/?m|I?H0h2Y@-1A z;riܦsh+i"K1D@!ʮzdyg xwpx[_[m+Q_V7Њq_/şg:὆H,gE+ Bg%b@MFR!-'^ Cݔz7f/F[5w%I7TǧjσS}}O_Ӥ$x1½oO_YAuu`+b3@d+8 MOkoe#IVms1<`ֆlSoWFXuiމ`ŀp!< U׵ jmpu=E`~_o:!uMm.gD#$!fEn9X&m[tWC/% "<8#4tDyPdF |]"{A]!KpBv}9ACƌ˨,E7qߚ?|ox`kjz,;4 y +r1s+xx[cmjOZe%š4j:p3O,zLJ4X37Iv dG͵@Nx?|Q\6o 42n{f. F+YV{iPIAWR2# _?I~+x29|SxXAڦ $xQ7˸⮏Usm/|/v-M+V1I$,ҫbL:ك3S Ң5FIomPP2[?h;d𥶋z to4+՘2G"_?[~x&MӲ\ ✭)=F ϩi>2D>"5}*-kpcKom/ȹ _AZO$K~!𝆜։kr洷26<#<sfD FfM=_0\("jsnljm/u*{ ; A⵸pw`>k¶>мk;3V\n[_^46ǜ~ރ_ ~?oZ[ͤL5fƳ WQa`~C{6}߅2snjmu=*> yLWW? ?|PViQq}^wI[p2.sXs)kD);y\ |>2?,%R"0p ?K<^*VmOJO*B "GiɤxKVә`~V޹~ۭ҆Yݸ a֚c4]j׷Zŕ۴Ls"<=A5-#Y ]o.[dda{Kূ'[]xźB% B7/E|=KX?~ ^*mil>!nvjN..fִ?j߈w~,T|1.uI.f 8Gpx9a{G[/+7Z.V;As>Rc9U>Z^}Em{@ p께/@|oXlk٣~'i6}^9l B3-55 o|vA-o M䖷Sjgm}ߌ) =_[x/g'fl]O<݅.1e>Gh; 8Bh[\ׅ>h xP/Yn$aUT5<>{ xYi!#}>Bߛ hgH}k=3^7OGk(HB\TiL&dpQ9޶b} m wRis#A,szM7toﭼ57I һbvfbNk5ƺ~-]Z\x LkȴJL{" v<>xׅm{q^Ps0,[^2FJAJ[Y U/ \KzvjQ-D_dTi'/ -mB_s\o[g [X׾ޖ s%$HGI;Fy潇¾*Ҽo sCMCIMmr"bbV^ö].[uH[3`I.9MhXx_ר (&{m1 y/rU=}sol<_<^;OY|z&ㆻ:]9𾑨}t)-IxpFr@Nk>k\TxCG=wXwqGai]>1O߄߳w4t]꺎x^C Ng7uaM "v%&mm$zB=U5x|i|Ehm֣}5ѐBW? j~4_xTӦkM^K.Z7Yጙ p*d}kj~ΟYoh|/mms%S:wUݴOG[^|=VD_$]Ǯ+8_ ߆ڧ5+Y{qq$KE^>_OIƁykQ:]\q#ZPV_MX`څFxVf\:vۨ\[eFX[tNI*yR +\KD8o΀*I0VNczE{*uSKVp/b[4f }ZC? [鶑H(:ҋ򸟻v~x >}ç66G͵qKsBYxC¶jwz& F4)ϒNwg9KًƩX~2 幊Hy&7cf~\7­|S(]跺 SDe?&8cx4Ưiz6i hGn]YH?瞵/ Xx;Úv@-RT^>K41^LvQM.}h" td?'wVmB;c̪ jԛzFj=FI5u~nAk=ׅmqw}*\ѭʳ[Id `߶:h^:ُ#b$.-`s^mTW{/gD2}d3 h zcg{o/|hv{gIbI%3ݠd֕OX[cA6C--1+\_;~xOƞ Q3mxNQXE,PVw s7;Ynio(cv؏1F e>Լ i6vi:omiugE`Up=1T5O~u7נ(7Z\n(O< |]|>/Rk۫bE,ZI=/zp~1[{u/hgsq%A`~Mzu |Lmm'k,Ig\7G7>v ~Ϯh5&LQGtِ #<7z?kߎ<(dķ'GxSʨ+޼ _|ek7Sj0 6i8d\)%^|555hk1LmLs7apdv)9Z{wYjY$ THe<`sóIbLkh#p00+OٲXO롶#]RgYlooj?n|aumt&P&i "U+Ma_cl~[Kӯ4/ h}" +F?xp,// loHPE5A$Hhykg}֛_+vmtF}2G,Mrw.zjOۇO}_C,m[LVHU7~^WǣOM=kCM;Fҵx x#2+ ,siW|=:ooĶ0=ξ΍{)~"hVICk?Ϩ i 7Pخ{Ub?mtص9>x+[͵O ծdhMq֯ ]#Kay6#1m q_z>x d42 Żv^ēʺyn!vg==}_xEռm뻛uGFekY.q!35ҵ+x(ELb3 /0 8wQ^J$\'P b@dw.F ZoiZ-ïߛ^缺6H"2 NzCx[_$!]iZC#˓sS7c_A|xua-ҵ ."Ñ5W_F ft4[xR69Ga#2^⮉A@4eDd^-^d'r}jξIRze+4dd:kLӞ9Ě<%0c_B$ mO|}h>ֻԡ7DWuf"ڡ;Z?J^ ZEPI8֓P^o_qί|B>7^% igms-谡Pn103޲rY#Ѣi;}VX}庡8:;~ͮҘo1,{q ԓ 5F/iI#\?Cn9kO ÷z#euo1<.ß>viwvW?PDC#R2 k/߄_Bwpג,*9*yoq`VQwW-& "$O#ھY|sx#R|0.ϥ($hܬG:m.ĉOjڿ9e_>K*>r}qOb! /'#k ME=۴X >t>!e] P;ڡtѩfAI#*0+dMWQHϹR朓T$Lj|V{6WGHV5 ?C>q2׫ |S:Aӊwo9$w" y g>7Mg@7iiA!c?$dzrO(w^ҼMsB']ɴbG@5_/~{aM V?osswzf*VzRb ( ( ( ( ( ( ( ( ( ( ( ( x_ηk g_:Lh((" kʾxg;MͥߴCqx%3K029t׬xyCk: L#k|<3⍔ 01V>h! h!JkMIyP[B8"t(9biU8$s|NJ,}CH4]\6qoI-Li~,xK?sPd[\Mܑis>{yxTӮơs$m5GB9> |7_Ư[/i'̉ȍIʷ@\ ^7? ZtbJ\9]$:%Nx&D i2H]1Peܐk<)_7|-7uqus.&yv hAbh}A_/u&BhK5hMpXY.j7um/S7^F-dEH˫2ҼsXobvaula)*)~ΚMjVu tw[-$z-=/um?JIԭ|c'\Wt7.a20T#d/l: B ;m,swG yE.i%-7sNaS)LHK-ӨكRùJg;}qN ;޸  t:˕8YlM> 6Yxmj6sI&tWM0?*}1=6<…( 0T)J 1:`)Q`1"5=6}./2n6`} ޵ʎzKE0#6A׎ mT0=r:Ө-J5 iV6zޝE+ 24hl%ke]Xʆ=( X#@@E֗N~QQJr>m|Kχi'Ү$Y"VEO+cW7z]wZum Ŵ+*0)5EzmanVȱCC vE0wj?_Gz{KEhLg?x?}G W˟ξ?X+7T:֒QEQEQEQEQEQEQEQEQEQEQEQEV?"uX^0?cDQEIEMh=~YHXDO@ׅx&xvZo/Kr%'Ru,۴^g[D?~?-|`֢? ,@֔w3lk մ ?Xa3ۂp2Trn*oolj|=y \px֧B_ xj!Kuͼx58ɥE?6SZٝ-Bܖ=w|>O:ދ*Ed_yR|?x{Ch%(!,@$+o˞5PՊ|4溹aKeWdr9Y_ dOIuow"+BՑbi#s]/$\@ƒM>f%ec_OAu xVҴ"8>\́v9_/, (e!wc 0{/x[_q}2XCWu%w/s#9g'$Z]~wz/oWgm↓LGDERĀF;/0cOjf⃮mO2a@27#|n x#Rִ}jLVTu 2mE)iQυi?90>(Q| g }΅Wt/.)w$lvaHOZGb<64O>inw4K( l !~ R~tS2ggE#1a.kG|3GFUanD92 28 u|Y#W2({]%X|cW<gC^Ҿ? [xu OX <2>`ľ:c?Dq- ZYj,[7'5}}_Ť]+zn6٧SܼsJψ|M?Űh!佷KbY  0A["ΓBpB͚Go7/XG#jwF>BZ7~~7ۍ?zvHD-U-5=ʸ! 9 MiMVn,U n b݀9QBxEݥ$IHޒlmF#Z"mndLWzbW* } /~}ŰYE]'\V*Զ5{E9útgxeD-)>XLd݃u|MЗY֫#k#+^5B!'>|=5? jֺXK2ȩ Hap$Tvcajo{haxٷ7XZ-Fgct' iugޖ# =di ~#Z,|+aie1 ¤F,7.9^gy[t?^xvN.tNe 9 hr*S6g?|,OWua-eƥs5[R$amF^[~ž4Α,λiejWvD$Rf6 lS?x:\ Vx%PFa_´Mx巎<'O x[I '(e.'W"КAu/4\{dbd2md8JԸog>h?,I:Ew5mdF8 @~涟toz6/x#>_Ewka+FdabG:=a?hfW6a iָo=;L5冿~DY2}E!?3\ֿ|LisKd}ZT{SSO5En\qW#~-t:3KkfAy~ zR;~"%{}CN,o5k#7v'hOdUњۉ? k6'PӤִ.h~tWZȞ$ß WJ? cXе)m=1Ə16w=0 tx~7ֱ;49gGe#Aڊ6yJhA};]|HյiG{qg v$*ťx^4=GH[u W N- }v\+|oq? oot{.]^yjAs *A(x/|o{9]tl),lTs(ԧzޏ[x/VKz%kEi'xpӑ^:7[M+zi׳<[bdF?{heϦ{LANJ|g Eo+uengI.yftY((k<gMXsg&2$;s=\vT qxKX m])|ᵈ4+ FkfbQQOП0cQ@ݏZZi`4l66t&+kxf.R$ 7p;Lݹ㞴utESf=Gǿҝ@y E?J(f.}^-RM:]F!.L=h: )Ǹ-5ؾ8 ~߉8yWS,q5̌UGeP}OğxIJi:7rڦ. rf2CzC}*?5=?Iix\A'8 ⻏;MZ"M_Fa["rsɦԍh#ӣ+R.Kr*0j3f_VlH74`ح`g >hZ|ei7: F 4G'p <_Ojzvs inr` +8~;Z^E5@RNB_/ T6R$a i,x^fe_Y=;Zj[X]%o֛UdTxQak~37m^K%Ζ#3&T;01F]O?'e}s[Ү~Mkz۸O`va3a:]xZËM?77>v}641yqw$ƹO|ǏhMjg<7a}5.4bw(8#^Mz-R}l_lDw"+C~H 3>"Zg?_]YwЖ6; zUHk_L'&W12;l쇫x>"]zͥ!tc#=kjV{K!>qȯv/y FtmkLZ hW:̚:\o YJ+G~|B;uO.k9os2(C·N {/!2Iki%# u+{_9i_~<-{63Z_ mib؄|~5-~>;v"3qj3+Iy¯w^t^B7`H ;xv >x~ O "-gILa?4j ZF׎2͏1׏ŸAu8/B _P#^A5˛)cO&8'q種r]^=.L>}ۛ1+-$s!;q+2OZLi6[LfLnޞï쫭~&m|IV|" 7Dɼd@CgLnqIeءZ߇xz ~(֡hY-ptg_B+R[ kZX'xnҨi xWB<Ŭjd #9x8f_ekwm[Xƃ7NTcoI=i"kz GRUy5Am,q*D0asʗPu#Z+oq .dLX(,@<1k577DHH_-FF;g> x▫Ã]=^N[ʤkl%{RcӴI|Ae>|u+\MY̹{)WOMiK PYQ+[W c3s@~.wDs$JTƧznUb85ST>0k,u"ѼGoqiFE1l reυ>(%Vo4 2Yc[>vqPM4>ETo^Qm QO-Ii^7o_~e֘hV!#UV]$bn=70Iܤg٥+@^g_u=Kz1bVr̎q*]Ok ;El$kâHqvb?[m~]֑jqG`dx5$g+U|Oou?ٴZZYb%;NO9F(ѾA=GDn`t.[RĖJFܤ#׊?k? O ju36OO/Yzz> $H'Uh 7 ў_C4ySo^;uiZԣҴI#: @'ֶ>)x}-GuxiYD HĹ7-4dA1ߴZ%l<7sYh6۸mc߳ d#{s^k>=>3mt?FdV{[x%p(p=i=Kc/;6NSH#hB;c 1'I|bp_-^O:h 힋[4sGWDF΅}9~_vmf$񮑥ijnoݼzco8־"Wv^)ѭ:KK-rJNFE/c1km[x7SAҼMuߴDc[Qv̠ٯ==':Ş5ֵf<7Ft -.g#?.8st?}oShT66&IFр=sM^ڌiI+U L=u+o e^g6 w[j9X# 1_2̺xP5F-Sд7p}bBp99擿A7X'moh#Xe4ss 唐p=Vj/ɡJٜWJ*pќno+_.7$o#ie22chQp+wI.Xjfuth"H"@w@?QmMM]{xWih3#<8iX&wt]'ߎPT5.EΓ4s\G8) 2dAq|/l,.-thfA"K'|̔L3]Og'կt[*6%G!$O<;by=F(ڏ=/!k޾^9/?_QCV?oU==i*QEQEQEQEQEQEQEQEQEQEQEQEȿn?"t-QRQ_çƸz~zu?iZ}Px)*)'s{uwS^v7<6gR-o~]JU @R@ʅhoٓ׍ x+oiڔv6$-FVOS<1||5koj2jqhAHa&?~̺7DzoV_ti.Q9+"g4L]3Ś5OY_$1E-Fpo 8k|Kм[7IWc׬.^Tـhrn#koP_m.Ρ -գ3F] shtkz{۫ƙP#;BoB~:LjO^,|3=k(wFBCeȼoX ԃO-wHΠǠ{3e jl;i-f6R~s^s }xSմ'Qe8 F6Ocƿ6W#<-ꚕv6i{upҩL L"(#\h]쟪xL%Sk)1\&IpH5>[|Ej&NZmfRQA&EmfI6Jw\ 0Iȷ/o<1^ƃ3Z޷5Ϋt`ٕT-r_W Z &$2q\;h~$ԼAyjnw$yjE;+1!GQzÿ <]Xh^#V{t DY^9f*2x>$xEO Dc/tBtӮgGyB7&rs_G}>!~7׋-u\Тg dSmތAבEG+⟋ |'YjSWD19 j}ZO_Gcy}ḝ:o{M76$MB>XXX4e ]cjR>'d< VN7y<<_IxkI>ӵI+[h pf?:|Y9γ&y{>j׎ĆfXbS'N@ZO ]|YiZen?Si$0wzZk6:]LAu3-p؀h;^Fw GW◉?|>jmGe#l+ )_şg\mU|C -Vxl#"FNq^sW0I 'RсW+Wlt=h%|`gRX_I,MΗe .H C:Mo2u4FP;l 6{CK,eijbU!De"ڻ}1S]^/zsy+"jjm3?0v;F43^` $od \)nvӶF3!D|agc5ђ9̎9c2ʐk׿ƞƍkVgifc>oz1_j}ꞇtOGχ[=&e}Pė 3N!,؏>~׿d'OP4ZN.(p;A>|jS -,"`ɍ2zOG^2:%!qu,,ǻvQc~Zk= )c`S'?t ;oO/_[KnR*fM]*Ѳ:#KσxM{NŖksfeߴM$n>b~~?xA]YlF&ԧŸ# 01\f? bf=i7d=YWS_xm Z߄!{GX.exp2NZO~">躷]W1oKl " 1A=ke6oTu_DAKpFPiX{pk_t <)y-4m6?* %i$I={薤-u8O+VK_ xz-{Y5ATIj0;\|?|5-Jm#q!vq+}kgiڏ{+JR6Z]$W[iOcMtҭ$^ ]I)c IA` d#G<?/i>+].񅍡&ZiFW+ C֮_@.l?KB?j-{1b>R}^g*h6Fo,ַq_[Io;4s"TjS9x?IP[:ũ[vvI*0g*%hy;_|_A޿Ꚛz{< D"1.0ޤ^NMgP5IgE 2p:+gwAb:&&i4mܩp?1%9/ ֢ᄺtԏiBɜ1jpp{Jw>=]|UmK3t9RՂ+63>㙼R45)!Q^9KlʓvjA?ozXuj^$B2iZ#"qFVBaO<\֝|G+Ěejٴ1i"w85v7&񽾩WRjzVV L[\͒7m]Ӛ~ʿi"K6[l:mjӫ,\%Ǡ o[x7S3΢~ }Zc,؞&9źrY =gZLڟ˪YD 2re᫯ O wEZtS2%n#lCd.AY_ >x Cj-[Wk{k;z{;pĐ0#\6 t^G~(-75x62Ήs<1zoھ[ "dWw7oC_?4ݱK4.dFs#m6-sÐ]Mcɨu{,qtŎ15xG"v[JOmpm*"v8=|Ս#ɿcF?Mv)n;FJ`yx}R29[W<~k={wiz񿼹GWvV,ퟟn33^ie1U@ʘϗ6KtmG>& VۥLѣ 3q_D:o嶚[ Kwrc2E>㟟)͞o߳Gu |I N`k༖+{34Jd+,; vr1?zDž1iZiVwl>+I.r9C[ŏٴ;~LF'Ndٻk 7Z>KֶoĦV*ǝoA@~ x FPu)`[9`9yn T3DQG\SVI bE)R|?w>>R{j;cŵ0r;ns:WSj|aXf↩'? wv9m6Ecnv/FO:t k5Lj0S`ŀ1\0<^,ޏmx,7{/Xȳl@?tEV'o_ uY-^n-knZTEb|_>xu|G(gy~mPd +h?4:nNȃu`ʁrx+ٓz/u []mYntd@\";A\`{SO٣z'A 2}B^TMF]F[O޻p6R{ hr2>)|)OxYFisE{ K%kUǝn b7N'5 zPj{con2?4X'=7eNjB GUV!os@84+tmS׌%|3o⋇xMrHW1X݃02IҸYE5]d2=|K|^Դ4dG"xgzk#Q:,}ww Jߒ[Z *[H8\oƏҭ7ڋ7[LUr.Scl"/ek7e(,K2C2ǟz_?g? x^K(f f%ʹQ4djŸ's+ֿeOk&ڻ#:[een&ZOuXhnDGHx_ǂx+Q _>$mw^ZBXmbrNI`+{~x&}I=GŚwr[xdp\;Tm@Ki_Ms:##iz|UeR,O1ǭZ_ z/CU]>YT`C$jv/',n;U|civYXU(' ޾_B/|Cxzđ #IDy` Mu&v?o5/E<3nm`eYQIJzUQEQEQEQEQEQEQEQEQEQEQEQEȿn?"t-QRQSDbG5o:xOTxV|Kj < $a(q+};\Ӵ{Y͜Á<#id7ÿxx-+bW_%:v=X&13w)/Wڗ? Eqg&PnR 9t&O4 Vk05[(`@"HdW~axv%c5UŢNfX87A/6ZBYPbىf$M;=gnǟ ;i|AyC{uouum)T6R5 Nvk,o}tk {T{#j9IWWNԦ-O {43[:,;)s'_ێGC>ºw|?u嘼<lA [QCtCw.Q=nrCGqZ ;>Fuib{绽i\6Fy8csNk A;h@I4ע?1?9Rӿ)?Ƌ5謏LtiG&:4 Ot A;h@I4ע?1?9Rӿ)?Ƌ5謏LtiG&:4 O z+#w' A;h^@I4csNZEdcsN?1?9R;63+w' A;i]^1?9Rӿ)?Ƌ5謏LtiG&:4 O z+#w' A;iEdcsN?1?9R@kYӿ)?ƏLtiJ z+#w' A;hע?1?9Rӿ)?Ƌ6z?ѩQA_Gu{b?qϭQ;^e8(ӏ}n¯bP"ui>_WF);qϭUQ@Qӏ}n8*(Qӏ}n8*(Qӏ}n8*(Qӏ}n8*(Qӏ}n8*((i>_Gu{bGN?v ?[oأ?qϭQ;^,Qӏ}n8*(bui>_WF( [oN?v 1@X;qϭUQ8(ӏ}n¯bP(i>_Gu{bGN?v ?[oأ?qϭQ;^,Qӏ}n8*(bui>_WF( [oN?v 1@X;qϭUQ8(ӏ}n¯bP(i>_Gu{b(i>_—N<Kg?WqF(KN†Q]7UQ߆ ?[oأ;qϭUQ8(ӏ}n¯bP(i>_Gu{bGN?v ?[oأ?qϭQ;^,Qӏ}n8*(bui>_WF( [oN?v T/M>a c͌PDҾ> ,qϭQ;@&c7z"I,x>[oN?v K^ EXrg( i>_Gu$?ܼl@'e>"?ui>_Q[e2#}<a }i .`' 0XO( i>_@n~8{a[,`EzGfhɰE2g/,u}J%>A@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE/?iu^:ƃvھlHHp+~=|>'GZдfKΧ֞3g~?Wjm7F(-Dv89Ltm_fg5cHB}Ic*|Ŋ&cEb'P-$XB$ '?*5? |>U&uDbbHUHG{U2uV|f[|C?#-hFxooہ֙'Sd<>!yӇ1~҄?yAݿ%֓J+nm\gqVݿx^jO5d-ZCp搐_q\gwaDXP:YѵCwlǙp\RXxz? ^mu]J- ec:Rn96^* AK5M+k*=!ie9P9 E{SC 3k|[x.񅮓eigzuL`1Hr>{F=+:}cyxp;5hRִ@߻l }a"[?}7Zۏ ׅ>{O^(̐[x%V|&)v?O,{߃A^#cSML͛dOY}3kr=/Lo55^cM!xSZES(((((((((((((((((((((((((((((((((((((~+t;~zmv(M$w+9OL?w>\C.PAZ(m+ģ}zڿB~$ou.(/B$in'E͙$ @aEjQ@fotocx/images/RGB-hist.png0000664000175000017500000006562515247006660014400 0ustar micomicoPNG  IHDRtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 212 310 1 0 5ίeXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:310 height:212|fotoxx-23.70: Sharpen: median diff 2 15 15|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.3: Copy in Image|fotocx-26.6: Rescale: width:279 height:191|5 IDATx]XTW&=cӋE1=QcI=DHw{w좈 }}^\`wsݻ3̼3cV!F,r: @bB" ;XdEE+98g\})&+T .5mjK{* 0e:8K/smHH:wW.Ăed T!.p5dd~\U.jڄn.wpDޮpuuEo^p"p5ӷAF"O}1l\η\v"W .o9Fkr}1P2Se5RB3ԫ7z ^6vpKq4*%׀$?&E#1c$ߨ=k>UTl]pQgo:٣D"*}GDHb.1+-"??J6=RDAATX%$OCގpvgp)ݻ3  8 5 fEA2R8'"5+%J 30\NG4PPLIOIBB<$e"HI7f .#`1D^;nf.Kr0IrZ JQ]h oo2Ÿwҽb;k,ٳ ,, CJJ\\`[4wulaBN`z8 ٴ )]1 \a%;nΤ@| +Z r.5.Npr=v*Od.puw'{%8p1P]<={$.} 8Aعp,{^`ϱl % Ce.]usOOphDڵsg]ű0~@ ù|j&t LBE߻w0r\zaiy2g8E<%`z:EO0-aLmCFOitMU@z4o ,  (.. 8ap{6d1l[Hns3L1Pbrˀo=]5m--}Rp~?=F ͨ`g| q`Y |Dljfp4ꖰ1>}@l .Ǐ?vڅ ,AAAرcG)XjS~?؇]H_r 9Ť$9.5z Fm'WP\(ʌƞ.}b 8 }i@4^;t$ƌhq&hF@LҔȈ ܑtmt!cw#)HGڇJh Ę0zD?RL:إ8l+Wb <]<&:0p"6ɡ!V k#"7f4eGN \iD ' MK&'xG`]("Gs g>ρnԞ?#38[X05ZC9pr= #PB|}ϝ1p8|5Ù& $E9kaKp%бc³S `cWކKStf`GwO!KzKt8"W""beaYp).BПL^H܁q}]̃Pr"p|&DX}*q OJBrJMUaكsta@o-‚L ,B-0m1Q\Gԩ>#0oo,JT8yҬ͡?V8xzD!%X /9CKH$JKΨ \4(>ygDu_C˂0%,uW^4U8{% HST<)8ҐDخbY{=PN#CQE4 NBRR2r"gc+1rR?s pyD\ .4p+N^_Sδe˖SL~I1,^}1vj^ xApeC3<]޵|lA4:[9p!{EġJiT4a:3hFavbbUmPyL+tMq8=, oo81P)qf !wqS`ђ%XxFg.8rԅ3׸iXnNU4؅#>i5fކۚ(uRuseC{÷c U[|,<ĹLKH AK"l8]U4VܫA̝-oJ{q6_4sq!<%=f׾",QMu%̅F'Nٳ̅HltÒE i]@NCND/"8zrp0 s»c)‡~૤$y$p19YÃ::LY㛧?c/vuu?SV!3%8w & Iiz>b% fE~C6bVpF`X a8X4[wڙmm.ˊE؎e_L+pN&/SGR 2 .2`Dwp'dg!l\\=*l.A@pɉXGa)TImǭ/\Vu '\u"bjjX,0'R;b[rIPZZBCC0HF^K"pn5,fLv}OG!N5Eg`,-7{ D8y);?}\Lf.R&?E^{bW.gIL ^}i$"ckk i'ѭ6.Q#3%vaΨp&  {S \К|gƒgS.>X{&Qx* xᾥk*$/Wb ހvEѳv"#]csB1{(h2q!캉؛W =3jqtpE[ EmSq撟 {9< hqnd v'=ٓ2.'0R\\JEj'[l\ ??2Ÿw8t9s`̟q;0̟? ~7Z.dl\O͘7 ԙ1P, X(-gy…N\ާ#kE$ ##+go'z0.gtMEgI $ۍii肁a}8z4vmömH8"x^;}a~v@߅8[+'gn!W DZapju8 rL7']qֵ0q`msq5 |" e8g/]߂ᘺ0lh9&S1 p_5zJaⰾH|4n!Đm<1CKi C+ H}p+od_܅y ^^$>#Թ˱%hu/DBg f%A<奧t1·_/m@${TDd\ ?i˃ؿh6JU"-Sl 켐 8)cX*qGԴ=k"޾1qrMgn]lt,rb$U#'b?QD6L[rc~6U0EA*ՐR#۰p8u6GF){z#¹}4v_#h%q,d~ےػfƏ :{168tHǼrKhQv.A0LKaX0 k&} e[q*.\ܮtQ6(+C-Թ~q_팾eR[~*v $S:k!VZ5+`g_a #Ci˿^m[ڶN(5;׭X8ڭNJW* P_ '+Tu.l^ž;eFlظ v[-+UJ%>u.'22FXyX\dpu&: X6Qz:穿3-\dpE .bDEQVq,r: 뀵u."XUbca(),r: 뀵u@\凋6\dŲbY)(֛Y" .D* )|A du:Y T%5)ؙr"Xq1L% uogrՅ$"+^](|_dpwT@]HNPU+yhFtyy$?9kۭnۭN!%G ¶^2g4nEuP/@tNOGF~q |<۶*+S7|)cʁc,5KX6^$y@r@Ƕ~攈YG鑔X69-[ľ]Rʊa=ŐRn˛Ձ:矺*;11::w!v 򨲶?A.tNK KM:2Z'otFo7 *@SvSy;]3۟}g-TSfhyd>C'';;BmS'\{k뗗vS"uV33/T.5S$kAY`* u6>'bl\|U dMs'-N3Th3ћ]Z l۪QT|3 P% [֫ւy-7Reztݺ;0|1ÇAuqdufKLȻ^]㎴"Q$䰲4g/ xeZCzv=ח+7D?3ͯ_=">~`xkk X11S|I]^EqcGחrppYA))~ *^~'@( 3/IuAQµ_iaxuh΅2+6 2t+/aN) (9TÚ\fJ >6ό}6laUtyC³}xO! +bB#Gw^y4v_]Q{uwc~ Φ-*(|V[ ̤t TWo+ ChIiUE6z@TP&'Au$O?ᅆ):PXe(n<. )ψ8e!K:?tx{^q>Ղ50@12EF(slcnuO. R39v᛾8!>(Юj|.Gm+U\C}>>w7>vw͘E}bxRQ'x IDATf~罀>q{~?bŹ3YO큐~4 =rl/ eJ2-~C7kfVtmBQʼ\h,o ޼ :|+f&IφF]S4#$_鿂 sn__ v|RK"&P~e?sek#fzP/t7궵%)Qp~:J3{Aߤͼ: eFz9L}6uLQеn ͢Po՘2OD^;ZZuxd(jt-\3k/AN%% \HU+ҥ*8;iS|Wz; rē}ւsU3Ia< v]q#EeZ +JEt tNN(= I6m:vf<0K6Fv£b;8̱C'B eB|Y'Hjk%6 o}^͸b0g1| = fbԫV loX^iia&SՓ) a+)t4 u\fQ(Jg!NLOb .$bgg ?Lx\g 7x|awOߝw!S t2^Ej1=.)1H;Tуp{=rodYٹoX m.N*D՟~<7qGhӵE!y~>59hƏ_} /Ȭ*ˆFKl@5Wm84c˝,} \%lqWԛ{r_؍"FzM%ZL%_ Pt0 PUU4˷#Fa_vP>H3j ݽ8l5~{+ }[TWhJEP3ɣյ%d [p^ǠswB2g궣moiCZDGU(bͶ<-m9#9nCAF`kf̈́fB O?mrLhQ١NN0CDd")fo ”U¿D']GRN>1)M ppĿ/]7M))$q$4h2Iy']'qېT;bXtCv0<$Ysq`i|Zx8(.l5ݟpGG(ox!)8"K4/Mg]9lۦA/σ!?B p?Lxj޽ Zz"4嗡[] M&@A='?OlD0\UKes'ܣ .nEX!.ty6"eWϟ3<Y\Yhmdtۓgo,yt_|IC) zu{?fMq147 ayzQsʿ9)r.Dl TpI〔n%X.O6|8yy}+#EԧvOI^ivXg?CnL,}e%IWJ(=٣1SMrɦv8">7_# Pژ=TI\e.f0 0KԋY!ǧ@ɂD_ct78ݨ1DQ; cɰ&F];>Vo$QuPD YRŏ܃ {HL=DEuɉ@Ood49yZi@,2TMH_q%m'vr ^/ u-Z٠21big10ΰMggұ+3 }S> '@IdK`Tl:sa"Wo hU*p!{˔seROxo=\Ue`` S )u @OӧD@&^թeI[-`B({HulI(}3zjYW^5&dʳi<\8o  J[V6x^r5gUOvlIr NrK[>P˿qlN ޭ}ʵ$X&]T67 obٮLQ2[N0K4޺dSp Siw^"5ApO Q[aSVEG~̉ѱ$ÛiCNQuC{@oo-ONHz9*t(^.^AfxikSpa^ :E$ߝx7C tޘ;*6 E *>@lI7v[S{3-3sXu 006^=E\B_/nv`OMO~E%Ñރ׾ S5S%]mگ8Iv*M@^@}A1fu80C9—+2\1= ]Nbn?[!G]7NxΉkD̿u !WLVHٳFp]+<[Ė' \0כ*Aܙ4NqQs_ KsȟYmՖ<+e#Fj`aa\9T`.C~h+[˫F.z[p\ '@=>PCbkt;,!ũ4ɟ?a/:(Oe݇Ro߈|#@i̋aqdq%>D7כ5rGӷKv\lKô2i%l\x)YߜٰW(SK{`x%r@ШK"tfrq. ?A cbQ[OyROSL ם~Oi%0VBnDJX[mR\R.bycyZ.׮ J}mp>0d,6zhs6S М yKPQkJW[-ǸDAnϩfW`JBm;r2.Ué(8GW_DɓZp*%%lvfz0gH4 AuR:vq o52koyTRROxbj_ASR*T]!@K3U+hƌxdl.60KŚ Wz;׸4:bرj.?lp['Ҍu8wk!/&`5"W2Yɰ 2DDd[r;e %\qAw yR NJ_uƒD;S[L^6r?NG jiIj{4]Es& YMC\8Nz_&).So˒n7hc `j`{U ;HU6oD\Q~ḩ"&h,.x3￵ ̝3FO31$z-PO 2ɟݚboLۿH f0|!s$SX's1Acػ.lJj:ս&v33*OJ?X7,r̷2vU^uDBy KxYyK՛6zb ԓt F'wa5i[-(%TgϘ]F%cИddzk[; D1"lW;KT4m1NCf;ncUp-_E\n^Yf*!>bb$1f[߳ZrKTuF]5URJ7UU+D)hFKm 3W_Uǐf0 2\ǁ?jyYQ u'9@3KQa[Juom]!jĹ /%3TȜc݇_e]U{ TLv?uѠ|_}+ ,T'7#8/c-#tVՖ͢.ث޾L`5pagNU.Qvҿa'gkei 6Qf&/Rj"M /h5no V{p̈́ &M."Qc5p3G=;_:>_ϟSG\0Gk%o"]WfzugU]A`Ȼfm\FT C *իU`Ce u,Q?~TOe?'x}hg^Ɯ"qW(ڸ>`f&1p:Mk]`:C7k o%"p>Kt# Wt>j[CFQCSu:Z>N ;s+Uڢx9+4!l1Qmj7+ͲRNHOQI>}mq?yLbxWF{KUsvG<cX/V}mϖ\/:1iZeKU^mb~WЉs af"vvK[=8Z7kPorKa.\B7u*4d@}-志L`mT-D;&WsA|G]Q}{ceG~qچo96@Oscl,)r˪ÇDt(wBB.ELY,=FSVʊcT>dC7Kd;$ZXz~.X,e6%< tӈLweԾ /PO1X;SԓaL MȓD,%V \̯=BvhIą֭UHDEj?—Fj%\dWttލÝm1]_S.(頵.0<ogܵn]Z /DY35r +Fgo/kFAv m;hneY$l@HXGK'ó5H;w^&u7Zޱ^jˀR-{"z"=R2! S8wk@Z' .굒[: # רfl1]<)C)÷{efs5/KRAb q:e^ng6cW \zҊ`2p.]"¬Y*JH@O]O<{p2PK_y[?fTE"s  YEEA7H&x$i5D D]kÛo7i>T'O@Gw-xvLA "zIM70k X>dWmgledAZ*j-@` _]k*IUw˳IeE&Cy׊"-[S1%+VEpYR[Ay%ƍZN&๺jЭЌS;LFeImqJN'LC \,V/B"cǑε[yZh4^dz=W \ZQǜ)%x).YUAxH{/f£VL#hF(ի QOg/oeUAm4L& $|;MMnk]NFSZ7^uZҼ\:9io8cjw}LLS'oHս y;(Rs)=5k19K=u@zy~RIߚӍi(띹jjK&z|I8'jG áTb*A*`f]foGZOZ{b"ׯ~Macrf;}-ڵ3J׮~Hz[-p,LR*!EUChݲAX$=@uw byDEzZN5_ û^72$tݺժZ"gΨl8U[E܅;dO}2m }%f9_X"=gZ*V[ŦExHLeAci1є.(Tg0̋ ߏ?bNei*sPv=A̮qcVGP}I8 jmkIQ9 HvW 7?f(L@t+,̜asuãbgf7æB{Uܹr8 rN$'k_bV 99t4{e{QQ26&!  r9_ɩ[Z0;x~0k9dPlޤ?hѥC@sZ/S4NU"'5u`BZFYİR3n59:h͵-.0w eWUv 4@e?A:ァsR5k1*UOӫ\)|efUCM^s %p-%in?[W 3͙ZlVo"C9K.fCCi̅+_ UҪH/b # c7pMu޲Ƭ2gvH9gOeaEX^>ܖ%W|ܸAfHH_bQاڋ=`![zت|S3 sR+Jj}on(`ejow.!xx3s.y6ixkаc!{8S;&c oV<µdU?FzC IDATnR\˴yIT-J;.=҈=T{ t;;n]^1yWijM2.T=TF)\7s(xO@Nfzvo:5)\ε:H߅A vuOM:Oe-kG&҈ڙ ܱTnO^)<%.Q/F卹i᝷axҰmċ3|hƍ:f<%m@`"'.kym} y0I=rZwnk)Kʌ h6 .{U{DVS!u #,Sۉ˗Ru~юxi6x:JΡLL ^BʌiD]dç?ً0wagWl͆ րꕉju++UQ푣mqP*1JuspEH)X\&i&v8ihf2{yu?>?^#X('o]6Q/]7+lS͔?wAv콪.^M?)kVZ\i;,<ԫW2Y[.P\ÆZ1Q,_KpL0Oo>6(VP{=ͣgN/S`ܨ-O> <5с[T"]&WŨSʓ/pYn`;6 cUG@ɨ*yoDNuh˓rBns v3x9tf\mu2-u--Wu(\s3WEu򱣖uRdX$ oSSݖ7qEM"=$'zQ1+ַQh Ӷ9|цȝ9r6Fѓ/Ο\\.nwgtF Çs0!#G ' B|m}}0oxb mM2cF#4q,c1a<8 $A$d&O ”I$'bI:eMLK'c)1m*fNg2kț6sfٳ̛3ʹp><,\0 (K-Ē t",[˖.rJbR!+/˰jr^kVĚ+v*[Cv5֓s:ظd:lڰ7nMeFlݼ ۶l݌[ٱm+vn'ٱ vl,;e'ޅ${vc`߻q`^Bb!9|Bđ,(a! 9#!8vAXQ?a,pҳ:Ar8N<3D4;{Ξ9sgN3T .; '}D._D%pD\GKB"Y"}%1Q$dHJ4X⥰]%A<Ot Hx$'$% %)j5%"59 i),H|.iHOE4de#R)dge &,lS!/rOH R.N!v.MQ,Q*)b W}>ո~!eɧq>DHSXe>./_~_o͛7Ƿ@(S? 駟?W ӢE d;,Z"ohM1mݶm[#v?о}{С:v(SNҥ RX7*ekg6w=zPgϞE;::‰VՋJep2www!Wӧ~^?`!)wA0x` 2CŰaÄ19r$-5jFSz 1c0vX0 0a0qDL4 'O2eL:ӦMÌ30sL!(d٘3g%jyaX`.\EaXdKbٲeX|9`YUV YMl5T;kڵXn֯_ 6`ƍشi6oތ-q֭ضm۷cǎصkvSi`"ٳ{>u'pA:tFHH9G cǎ8qNԩS8M3gٳ8wΟ? ."Qq%\|B"##h*=Xbccx$$$ 11IMINNF E1R4 ɠ欬,dggSg%)磠(..Rj (JT*jh4!:zҿT,\dpE\䙋}pEKni%hvEK[%hI-WX!\ђ[ZrI;]%h%h;w%4ͮhikfwfw4KXXX;ZrKm%ͮhvIKn+W4%1uI+ڜK]쒖ҙ%hIL]Ғ;ZhEFbVis.E0E⻘ s]$)ׅg/Ŕ\S΋w8/9/H[0.ux/ |I$ދwa΋{/wa)9/waދ}@.,.u){a s]"^|S ]bœI"_$A9/ p`#q_€Ü l ÜS8ya}a s^h$/E2ذ00/,Ab 6EH[ d\ޖ0߅y/,0., 4.И^¼Sa }aa9pa.e)㺘H[溘KU\Sp8.Z,x.LbT &z Ė59LCׄCa$ !9Bḷ$Җ%ff(yB{bi# #&˱k[D"qbmP.z'NI&X-7tXB$NgyX = !R9 ZgpIy&m\ Vb^H;40".[T%e_Irb`D& =HeC"mc4Fr5*Ǥ-%JD2X" bˮmdFHDD"KUz'S5gb{=VSHRB4~ϒF,4bk|Ftl%H2Yh@dr}&hMb^&e#W-,Lx%6Q^ݤ'."[gj5TJ!*ڪDd9.bJ=[*׎!U ӭ]ԙ.K? %aeN{(#EXT_cf \ P? oqr; e:PTXP:s`s);2^嶑u@u@2SNV2dZdpt+>k\dpE@_qɓӦ@p"9z ӗaLήR&>)}Q_˒뺓ݒj+<֜RgXHƒ {UǾ6p,?_ol"J!R~}0oN!}Y;,FKh\|<4u\ ҭwl1)VhAf_b]e]hk:|F.LK?Ϛ.ٷ& |&x]HAB%h2( H3hzΓG_)De;]rG?7GA9[S^9t_kB;=(/A 2|^-~)w}/)=/[7_KGYEj7o+ W#믶hesL:N<.hߦ^pKN͏_cO'_+sFՔ\y%pTiC\: ;aw#Pdd;m V8 ,˂whgg\ͽ*'SL,;•t-zà h覝Z AN4v&s6 \987+Efc+<-Ц/KwaS,ۼ59g==-Cgp%t|_J|Lqg =ڹ6)9Kj1ȤݒUmR&Eh>> s~}3 JsbQI(`2+d&E?ZhїNñKCJq($R+k[k 9%Њ)hSKʇ75ŚǡTQH2cWܼA\I404#0+;.*7!x8= C{a ZN'NʙMq3LYDJErvhW_}/^}uK5wcS [-w__| ~f/Y9жszvز~>~-JqU)OBCxEM(;ȘKޟn$ҋ׶@S'C`y;ћo'"Rta'h{kt֑Y믽7~v!C(SpiF <0 uiXt:qt.%yi<]\.{P^A7濴E!Cܭ-#۸} p]j[uKA9ENm5xt U{<o!X0U;V |ꟊ :4|xsqRh+I|m}p\JGA^%P+ c84+ܺ8 : _~#MC3T`OQp=hweL=H\8!hGuf、8 '}p9$%?Ag4yP,O@ل4]pGŗ|GbΞ>~|&Fax^h8ܫt?}CzO\9;>o#|OFDt _{$Q@t}5J3x5Ƴ%aD0`2ɗEty%pmG"@װ#s\m-]_M/gƜBq^.]&2cJ)Ee (Fr )rJIS*ih4v]{oծvsVT8Zvk}}n< .6p 7KS$X`8vf;}أԾ%K΃$in>So24!\KSC< BH'M-ж#|m mG/?ܗh,=h+XЌ1>H)Utr:-¡Ԧ"q1;aA a.MCG{k54/M5p#13\RQa0~"N_f*욊;X۱r@l_67)q"oxVEa1lnuhi5:%at&&@ѤK\TVޡ&Y@ϝ?E(*!,GZ_& 1[1|׸wQHB.؋fH.zìGt g:p _ 4 P_J;^抁}]"{d=Pᑶ3,d3k-|b-~HN5t\ bZ8H =-zH+r :_hByCceriՒ+7`B[]_.A~J1BW7L-L`e+kh/m l xؾ+ RvGF 1&!-/Wbxc_Q_#coR"*bwbXCR`915O "z?woC Gf Z4*;Qcc͈9C ' Ɍ<\Iy{H~5eXM}?J21lhޝ,C x2-wd,D[хU០črf\K3=b;s.nަxvnHRكw#hz[,Wǭe8AL.rfX@⼄pyP7Y0bOib2#6qwhn ^Kaf8\L6˱9ː/-`^_̧f & s (. >:$gg~h5b)6mЭDk8vmvĭ[.RHˤ哗espacU8/)eA7]̅eR)BQoH< K?ev$2_%rnMs#N ͽ犯N!~Ҍ6*/'qPˠ`dVݢ39[}.Lv߀BY{g|NmX|9aq>^oz\տwuф $/R8J%`5 PƯY``hbpJ,5]ڵ8yd7,LM&;#8R9ҩXreUXft9M #,19Q7[B]͑jԙm-y f&Z%B#RrYPӝVۄ5r 1K8{ލtrݬ.$̵45 B mp .9pna)QKk?~1bra[3.[tZ O紓u{'~cdg@zUQgBz/1G \ ٢;2c@ZK=}i4ocn˶u+[ۮAP.h'n!Sf  r}Hz6w[úIDAT5o \XJy&lXP6Gm5N]@Qv2 v(**Vd4Xu Vδ Vjp? .eQt s](qӝW܅%!9Eo6EDzN6._ 0 273 159 \P)eXIfMM*JR(iZHH0232,0100fotocx-26.6: Rescale: width:143 height:246|F IDATxwtUGZ[n;g<6A@s=xc9lrNAs B(}뜭gݻwvUWwWn_vhߡCl{unu{q{=Nuy<.n:x]1^r{y^S)͔9~+ rb(z|/DE~S2|P:Ps+\2WM5$7N4i Ë(y^WG~q8}6es{X -rEQn%rj3r:vr6rn!u&ux!)eH9~pNmU9>CݜfrȽJB6 q#pS i7ON]S7'K[ y} ^xx i?.;{htsf9|1li6]TLsw#ttԒ).cC4wyv "t=Nii؝]1#~w_/:E}mEJ˃R, ]ԍ*(!8YnF9a2Da(àDsG;?裏=v_L-coMrdgw"QvE3!qE؎x #&åݹ?]wtnGR:t9UCEM׶٣>ʗq\BgQ%K{$Mvv ш[_Eu\hgo{:jۋSm?>ǠO῎u6GؐU2#]i swj!IJ^25SLL-돍rnsGF;wom۷ϛ?hwkc}2cDZTT/ ӑaaJLz=HD_~==aZAo4ͪ{PI<$j"A!O53В ݘ8"mn =rNOG?K}4cmSra+wt; 00ι<΃$tkglNrgWffd|6rd;#ﱥ7\ʞ1sr;bc`N3-Un뒔4*-#cݺEH6wFY}mڄ1ۺۅ1`o2(e:E{ okFD^ܵ{יԣ=H * d&05Ix0R|~(bcbJ?=Ex1=wiU/>zO]y;wnwv!ebru>h s|αQȒXSttnwtޱhw6 GEvܩCl/Ď$f%aXif{䉧vّ~g|ne*\kǫ'0amEqo[ozwtTi`(ilkhįum乨/>.=߽{SO9RX;Jtaӝݺkm67=\}7w+Ƞ% 靾w\i̡tZ..X>RYS=?蓡G!γ>BQ셬W?b4zHۨyw߸aCO蝷a?wF 1C w7BT1ЀĤ>qI>,g>>W3q׍V(B2NW\001i̧nm3O=M6h0Df= wL/?]gG_Wy|vw郞<>_x9fUt[b[{#lQ[ɫ"tz#8wlr!;w1cۣvE˶3χ>&sGΤ1cutq.;LF)gOK;~dɯm>g/>zvlIu':ӎJ=}f}'9{;;[onٲ)L}vۛvWh T_xyme!_xɒ3c|R4C0-r!h1Oس}5wn7wξ%o}1՝aƄ}~g2bĀjÑ{lܱ;Bְa#;h}h]v~g`P|ߣv9_ƍ5pկ{湃:ݙݳуoo}⑽?^{js! a&Gf{d$DWn@jiЦG56q I6d(?BHH2ٝ.GlLmi>3m?K_0`OUL vlUO ;kbx1aQ|~23Sn&u=_,_w2#gа_1Zn}fa~k>yKz֩}.;?'f07m<~tNfaCڴ (\ƨ1s]wޮ|>;'gge9~]@kͧN{wg?G{6s]@(ŎEx^~?< {n0D|iSYm[G<|+VX~vw ׸0bLovםZ`eX6[_:-+V 㑗{ĕCRڹb=]R^n;Ge֊`sxˠe`/-ZcǮ}J?dnݸ!/'}/G3ϭ]٥U/f}~߷zW_-1_zZ3 q {߁~?:wadꔉ33>3.^߽sQ[ٳ_ڰqy7.nSGOzm0Al$}:!")!4D``xcb~woO"wv(paHcRY_EO81vÿ~͟R'\/D|qgv ѾH˗<}e)Y3 {λpBS?tDL>4ucYY.M]0w#N3gLͺxa^yЁGFF{g/[|>\vN^fffϫymya:ƾ,5t1- $֤kiֺTCoD*ji\E*2kh1 wX uotGOu艈c=X'۞~~=G_|LuhP_v -;vX-e:G9U!)7m~:x??=KnI\t'~' ;vI{O>lԻQѻo߸68߻s~ymAof;| `r|' >b#so.e0o 9 f+m2D2q G`,U9ʁ@8)6* aw/ }6,ҜB^rf@ibv?9s^}sEO~俵ommk'JEV\PAdܢB`D:A j6asG`cԇ7 AA;y)l-'*,Fn ߋ' \h"1\NLvm#Lpw{ bODudQ㗑53p~DAP> iF3 /OԄ3*R$R4 nk9JXwiG#oySD~"* ?x|>vCi?yK[vVue =[{> c4% mzVx4j1v;veG؏ [:z6`,OyaL'Ɋ6^K#'ڝjW}p2d4.D3eX ̬Q63y< jY]⧂DK7ũL~jZUE(4d ˞"P.x m$;>cuο~#/x~}o_uh}Kg-GȾw@ie^B Tv?( g"-  mbFSQMI0R!U!"̟,caA[Uɠ['49viB yy +ja(a}%`BdfAAf4;8zvnvKϰ~ GGo}ld;?=Hn6}G1EYE22SKK 򿐰Iٹg^4H_3'<$5H3K\2!K4$O7 D ŒUf)k0/"cӰ䛕bޘ=/KilaP:ua?],:aF+2P#+[4gH1Ŷ?/ɟik4Kbjaȴ*!D!))ZZW d n<lg_M!1qۃh)7, DXPA19L-Pgt11sN1e`,{EV$AKąH;"ĕ>/$+bW)(DĎ:7JH2!c PU"%UTuSH IM\25a d,TS[ ýE^f7DL|FفOlMb6t8+z/!]. 0*c)lw5XwX"қ쑢Y K-fC!)'H4z2 o1C#U"QƅdJB\eZ6%m0xhQ7#l폎ic}(f(tTT4 't7&:@d.(E~% ^2KlKbŌ/a a$)PR_?UG4F.!³,\@&/L6$ɋ,X$.^J__(o0yV/fUTVV\*.*().,)//+",.TVZXZR@DâѧRyqIC* iU$UKTǏEh[fB?j D(ҹ63i)#0lB qXa>!ђA.PċCP%X~ûؤD4āqM8pPb޽ˆ3\PhFUr`, ZΜeRA BZ[fy d0G@O B a#MoTTի'KׯY y`FEK/!-ո lX#^j!O/POQƒ 0ٗR*/*,S eLo-jHr?πx&LظqP-# DAۈѩ$?-Z NEL&zD4 U,TVR\~0-(oi31§=N93/'̺x唇F2ʀr)_(;Bq!tk-FKM yK8`A+!)Ӧ Vp QA e˾ھm mݼc͛6 Ҧm[!~n qM<[Ci4 DɶmmZB;u)kxtB3n\$,a*>ӅJsϠFˠ^"VÀL~ڒuXx1PD:`LrrrsssGτ LrvvV dᤑγD"Kk+`r 55%WUWWUԩ3֮]SUUV]U&k @00ZW-U7JBx KK]YIX|岲2ƂWW]8aʪU+J._$supOh5?VIXOX6(e"4TSU ]aʕr)3WZ^ P}`Z-3oZ#V*Arރ3f͘9kJrMTU]0iڲUk˫IJ+_&FO Io! ,Wøe؋HEeŦ;{~g׎.WX{1&-[e .# B[\bP3uBԀ)eۀ )`iw?ma!֬]>q'gwȘSl,Fr$VLD o)<`f*4( CЕK@ ނ M7}Cw?ؙs/W?wk#NYvCquMh:aX4Z׈8UVU\R=},qK JgL}L:gKn*\bȟj^T%gxͰ/\Th՗O2ڍ;ہ_-xG8\aΌ!%t?V x UP)6dK%,g.]4G1rlUTsA r5[ *o>UW ̘=+^2+*K.L3L6gl* Z2j}=xi޲p҈ּys 0v=]{ceeyN{Uk6;u 5xV2h[:$z]57A4l$hwC'.DːB/ x{x~0s椡?`_{ccL[ʬS2=ˢX%3ZJkױ|nI){1cRiYx3&%$Reb;|KIkױ2$ZWAK/YsfT ,?p`ڷݺ/XqV][ZQBR kh~+x R YK(+USZZu~#ԩ;vµל9rԓNăΉsԉd=?'[D;ylע'AeJ;jr6Ϩ5P,o}[In %rXÇ݃}J=rpc߳s\؏RbI@{qh G?{ ;?I >zl"c Q1v8aJIi)ZM/8gc2dɦ9d`ol\xl켼KyzϮ?p{!˗DK9bxJ FɘЀG2j@+!.>~AWChD MaMld ?  0r E2bE%UWp >˄B<6PPA1"rmh1P%M[:~di{I0A k*12d O9!Ƅ`80q:h6Xom2. AK9XF"9alC+8VT5erKӈz "{PxPln$ WsJGC`Zb/f˔^CѲU@D$F$%% ~vf meصa~HYQ~Y&E\R<@N+K\&243h-Cp|y]¹;N i[eE̷$ b`jN"%l=i`|"JA|~{8)0xO@6lȠ8筿1k`35 Mg3h6C"VPDf ZMv}`YB 6#܌ӤkK[c}އDOr $rՐ ⴵ!?50>|ȑ dԨ}>i҄ p)fΜ߲K2# ~> UӐ\ NƜa*DKO*x̡wulV ZE?I@M:5#.2иD %%"ː!>t$c?Lf3_|1p .Xz%Ҩy{O<~1񜐹NZiPΜ:ɺ+D"JҸpX)P%jFs&Ŭ%-8f}|o)?A"p`a?| MiS@qK.Y|U+8a}={vA{>~sg!`1eEɂciס2#@ʂ^oN]AiT2CyKoZR44 V Tof߾ 8A㙳Ι;3+W-nAC9zizr0gv#Q2hezh$@ x,=X^B(22A}k8=׃[75BiLGj)bpQ1vM|C*gPw3~5cI3O eFE!B)|MX/;UBhA_Vp"$2%dOL"[F YqV.&#F]MS|*ZHНM?31Uڻ$nT|g˹68\ྎ9PV6txYⅎKd*~o%_RGDab`~xxݓYW )FY T;6w鯣b͠04:p]W ?J=l)WTr]N(9R} ABx '$<jѥ8?Uez%)sjlJ=A믿{mzniЍGAKA ͊m||yg['v5_+쁱> !0#xŅ81)f㵘<*x ʝR4ΥRv { ɹ +:0o^}%7uxX7R6Shλo퐡Ix7ãي_عUA]xF 8T@'AʚzU<$c(*yx۶mZyfM0v쪰',nӛfЂVtξżYc=_6VV~L@S._%AqоcGQPE^LϼW.PŎ̺$d>q!41 `z1, {ql%uOw,dѡer-b ibXg괉l\A}NnK!G:|'e~KJeWK`}{ٻUqodCƲ'eeV(9tSmhaH5Lh!; {5[FXV+_~A6aqe5ǧboԇ|eG{ l}l l%&{q)2a谤clg>h{c@@oKy S0x@v/lh dMVeֈeuZ^bfxN#o q i)'p$.`[TLo - M;t z͊FO-A'Ehɶ8вIVX6[66ZUtL9!'@Y/4a4%F,aPb!֍k1޲ Q ўq^[V N7* @hN`(ˍ;-&, I&z6Lp!vRAK`&J,&Hm6{3kD4[BH;*U)f\9n6 ˹d>gbN8؀Kٰ.e׮ܐr޶*ZvLX%JV~+b]ӥE*VZ7O؀*tG N .^x|6>.^$eB8JM:w]K!Cګ1tLJǴ8Z8b%/BVUUUlj8.!|jZE!'j34nL_ Ę7W/`?1KV L0@Qs*H +hwNIBA9^B-3Z4ې_ao2)_%C4 As&80qz+*&q=,r.撅\66@ O׭'MB"cݴN JKP(Q58$)Uк5A La83t+/xade+%DD˸Bquu՟xl -cW" !'#MJ܄x{|cP̾xW*)EtAK IMOhXehC0E û @jn[0Ty]xĹ+e@o1%JHOh5\m MQ ->#qpsA?%M߷8ưTf咇0p`&Wpi"V=ATΪnݖеzh A0Ԋ*,I(9U!x(!F>q#M|TIJKKѣ;he@!Nj*uܲ @R>__U Y3Z:B#Kӧrb#o-3n`3΁RN A;ʒ/̥9EiYs絍t~I?6TP.]0q̽= +ex`%Z8AVS7 LAK2̔]<oc՟H+ϢLkCK^jʏ=CYAAuyso#Q7nvW|3gӋ˿ѿ޻k%˖asM%*S3BhmO/t ߰U~R]W(P CM_̥*ʙ~QqG\|锩ŗ τUM])gAQ2A[m_1Uaٛ @:wLZ[8GC5KC톎[Vi-l `Y_&ANٺcSϽd;z'.witWQ%eh\Zhe'Ūٴ0h]Sh%𙲛F:$|/=HL'dj U;3̙kV D,؊I\jj `b̆$ c躞H Y-(Z8i3^p63#ܜsby|]<BffֹsHٙ/x>-9Pؾ"@RP. yq4%W-#Q<*ZH R%Y0DŽ{cʪ6ޱy-Ю[6o޲}׾[ٳk_3omݺe]lټe維vn߱qݮvlh[6]NۺeӮ2xB]3Zj> >^`ĸk8ŀH-؎i\Mq ~l|j4 s,oHi܂ޯ',SÎi9$G/e] /ef|,/R~n^Ann1~c*r rs0-ιXs1|,-59iA~ 6H+X;},VA* -(qЃmeK^ۿ_L012@\IZגYA"$E5SQ!H qrRnXPX-iXksfZA E S_Zl3嘵2+"j_lr/Z?nTD BSCN$WpYe4* HxtB`O(0j-М}8ɑfWp7WyݥF[2-50QTta,9:(J8yXk15B0RK#FTpZ<i_F.%f`O' FG$]AD_h!cQ&bP`)Ld,dC͠E5z"*4-4'ƵixaB*\SI +{R1^?- -y@&3\Z9iET"2JM)PᝆS<RH.?2IVE8nfO[բsg.[dʯV^jrBhŪK@\(/pҕ+jXCƮY Z, S[*Ъ7o!XTU4$ '%u. ]tgD%G7S4'ǗnjaOE a^E!MV'x|# *YVĺlDA)Z u3nbO\~lE&~UEyK)*=~jqq},3` ]ʨc©ńh%+{kޝA?*Ih|Bu-Qu~E#GݧT0Ym_+FCb- SR"&B8| g3BkRD^'&fȲd I-Q ][D<+@\ʺmQF^vFN΅l=a-uc*?1=B@B٫yAKYJ!aR7&G؈Z!n/L00iкl-8BTo-Z07VƑW(HBX'9#aj WjCze#Brːk*[zt/t;a/-EK5xC"28_l1G`J z\O -"O*!g #-0!'Lkrl剸GCVrԘW8Yry'!hF˩ebB sPb(:z-Y*-sCqp@ʡ3)MBKyKW01PF[P{/Z8Yo.UUTVVTptO9*XÜq$ Z,Sf)#k%DQEM[n>rNxWIxZ!-9ԭY-#-X%lAT8WVn@/99WP@KC&rP}sdu FnZf"dYŏQC'U4hlfnK֣h]oa WwiϦ-_)?p7`X4!YE0h7O4ISnZj;4fYѢ)k[E(Rx/nWDBWCy˒ ]`VSu]㞞>[Ag :a"lg|Maud:;~TEwJĠiSmI4ՠo^ѰQI;lƟΜ{|㭷8Q!X-9/MD3*&%I n$V- 9.!#:\Y-H^+_ϫ>h<QT-u/=Y:;v)J*ʌJxKD)T2t5!VipPWu!>ƻYb̙TX\|A9+ip܀>;G-DY(Lwo>a$!57I!SR9S<ףb̝;;?frLjSmbdN@|rIm2hc&LAmPhN܀wr|$Ym\oQ'%֣dKB}gNՍ[ &# iAUʒ)k|nݺDxiӦeTְ$%ΐ5*VA* _o)ZV# N0\oa oU7|KTkhld 1 v>ڈexTQZwza+r΁2?%Q- izCI!!Df-"B*X(Gt|M)Zh)Kc]8WZGU%Md %˃N1P)i)AGr o1[(k"Z08ot0(e$#Ay+Bqv ]c! o޸BQk]&N-JcǶaÆCq-[KCV[H-rLϝ3#B:} [2)l@t5 d8[+? xOYR[:F6Ogvao-er_*ݘ[E;tCE0%c70o,5 Rw5*-8q$!KG%` U ` ѺM W5u=hDu,<XxoF׸( Ę0qy9MKknЮ-Ư-f=zߧ8maF٨)`[c<տ7gRA L}zв-$Ľzw2q;C5^ Bҕ-] w?>xwıigN"_ST^JP^ٱ3ߺzJ.Yx%_-[ܐEJl/3{: -Ha{,o1_4;ˠڅ0tRw`ư +ZkvH8,@jb0qP ]Յj*/aV(FZ\k^eU9>s++ċCGXiH\gpJOAC̈ kRI =eFRAݶ r6)δ%;`ʴ ٵ$(47Q*DIFV_hlZ TA `f`?v 9T8AHbƑ55a7cy-).c!#dE6qQ5ItF) M"NOsp㝴a4[EV3w;v߽bp+-mTcT;nS7ܱp֍+ۦ)'y\ pfȪU6-d D %RM% ?g{ pbA4:$v+L)Aգ|&~0H'>8a(p60~R{bӰ55ߒBU 3}l CF:3Do0uq膇bcuHɣIa[mi4G6~_5`>/E؉ȶ-mFjP{M)UpCR#K!bHcpR/MA~h! U"`@C1YP &`#]6- `p27r|AHЩ?np [h=CO-B/Fu*Fe`SP4MJ,V'3aqҏ%X˰BG CR(UvqY)h#ӕ8FC[Az N|lܦG]xMF5XRBr ̷I?_’|h؈} mܛGG9Џ$MU 8.O:ɇ.Μ"z2--y̙Ǐ8q"55tÿS:z xTa:zO[ӱ- %_0ST:΃`,p)leJ7f];KdQպlYpj)"\)//sĜoSƍ4G˥|=uEDӘד׃%h1byAN ZP=Ie5 >(ĉcQyj WsgK;W ӎZ 8+65%SH-IƉ<ȦM0PI4V-{:6u$-JG4ncnXC.'OQh0`f|sVݐ Va`0'f~IIYv6D \ZZ ,Y$tCKS>X[V(/fKN>uۀ % 'D-.6PMd:`o9>ƺh-$f>*Ƿa@KqncͰaR̺֮x*)Z6uTR|]+ Kij]uFF-[wܹ{'<2pGN6V,Sdޔn QH+QV(Uۨ]]<eāX·EN֬Y-naw0؋W R{{[`' q߃-Wʊ/Ο=g?'NTV;~-[ Ĺf`(7$)'OAcY{6"3UlΟ7W̔-%ezɧϦcU׷w׮]%cʴζُ.r0 K Qz R9,UB<Լ4|:QA|FT"Ix"P:csygUqKou?[!Ā 2,( mۀ4aEQTP@ ̄!se̕T޺ukH sΩ*A `wusOheWeti;Z5gcGvvSCcƏ3zTg/R<ɟZ=㲦Ƴ`ǸRSҒ"f(ZhAٻ%RkX[;%Z"ejL˩ńDӀh/8 cG]wqĉ74פH%IO~5_!9ƥ,Eg+rF%HT[:& V,W7k&#h]T0JR}MqPG L%t]9Uo\潽vm#3^-I⭟;YJvJJ#d$D컠-͖R kꪘ1QJ2ox-Zruo2HV5 [J)l|6ȇ%zz4ObUlp MKDPJH(weúETh%=OȴΩ+k&Rh%J9HE -DrU-m`(GػoȮ~q 6~ޱq0X>C1(T@} {)-ޢuK%]r^" C-Ĝ@q+%a~ ࣁT6{Lꚏ. GX?.V a31AMψ"5L<϶j*b|mz0BoJB !oN*WX/j|#unR^]VrKvDrrvx}hUyg(}W;i&-}nQJ#&8Σ/2' h$7l1kE'+JNK $eS_bX-ΕHʹbruD+ Jr}2#Z`B0?SK!*zQ|f 1Bx{B 8Ramt1ɠֱ '!e(<1C9sSe\2\ Br=b[ꝷVzcÆ]n5$(I(+)]%eyKs CjWz*` h})3R|k۫ }ZN).P4‹WDamM庵kDT"> qњ(WH"KhAY O,i܏ڦtB>^q-% UC l/ϛ L^!NK ŒKe"W_}lnD)0S]lobF&B2z.ٕ+o;}RsvcevI)lUn/CB'ʜRw dUT{W#iA@ N.*' qX\l  OʹF8s3CR$4=dJM8|wԖ#z:]jv뚟> w-&@!q:uzrj4_A~ JV"Tl.mU$PlIlRQ3Ō QL&RDF" Jb†OՎbRśUj<\NQCTY21˲֛QC/ `EEvJT3%';1td&MqBRU㈘Ib¬lf!.31 /+;,HN!D30*'u0!Y=K֐&kIGAA dM-^yK7&.N,EBAL^b Bz[R Ky*g-у$C$*~9^ZG~ KiTYV U_KqTZ\T[Uɍ-_ =" )p̲ KyyYYyYI8A2a*/[p%A©'U²BQn)ZZC \8ơ7Z- U.0J*4?dj[-`;k{+4sqCp7:uMp:tu$v2EĿQ#j>AqDI˸18$qܐ'Lju J0Eip @Kr $`T䰷UU)H2ReTIwzuV/XMurVU{_=C|cf[}}]0nhrr8GQ1njR XOĐ" b.ĸVԽl/HI(tV n{UyeoRly[` 5U-u1"a8G)먎2Lc|(-0FWR%F%fj`ֳ}" jvcIZ::y'5vD(gψ|&:IBH5*R4pm`#paNEh8%59=+5' oX UW^㐾v--) RYVm #m,ix9R[keڤy]4*5R)=:p#FH>|3OOYrY3}OO$3p~/:yƍݼqALLTPPvfBǎN>G 4xذaƍ] +-Bv|, =@CyY5j7"^k&%8ArN (4lA2N} ',Fh%K0DaZ Aǟ|rG> hL}⾻/uuDM}˦cz<ͽ{^3ZML9"/IHOO8pϿD>s dܪ}0K" c _ `pD:7RqVC§B!ٳ 6g$4~7à &,qp5KB^I ]#s980Ŏ6[<_OP>y[gm YY >t]N׌̼羻 .*[Z#[!͇jQ;1˧=OV[-!3`|ŋ-Zlww$t}~ú~}WV#P$5:QKxUn]y.r;/k,\x뙟w#~N_fNލ :--Ǝ}|$92/tfm[|aCKKK0fP]}cSMxĠ S-W2\Z'7xm+~L"3ĀtBxܝ?Yd Kpڠn٩F0b_A@U[kI:7V9f.SyT#$͍|jçԭ-'=b),wo>\?חws}bi=56uwEuc7ǚ[VkK&LSPx3n̬9=^?2uGE(ph>blX!%u0* T t') -?ɢE  :L0i6IƲ^] L ߀ޅ`\UmEKb-p?.)+$MAͰR ZKڇOw}ݻv=3 wgبet1#۶kܷ='cy-l S_*t޽gm3wnb߁;Q=m暺ʉyEׇ]NhhF)hQ',/>:ODN2=a{ E o4KV xf-[wl=~̪VϚʃ6v0+ja0# j+m Qӻ4snɞ/vRD 0̠aꆩEzB-> 15sPط'Nz|]{sֆzTw{ήz0kho|sssq("^z̺9k'g6}iO<䜹=va1;)󀮡e47~LЃNxgKG@Z P[9z԰#;qUiMVoWK[m;a\MhZ{]|X+$Z!hZ vGߙw>ctщg&ڠ:VyЌ!ݻfsĨC-"U#ǎmjO7 -k[}mK'YY[)g$3go_߰u.pTjYsgj.Ѳ!rn\ tOmU9h| d~4祗rKʐQf?p`c>/ֹŅt=֪7CfIH0e(/< h(ζƞpy6r#=| dM)*++m<y2\cWWa{4uTʡC?̴4ZV+?q#jlٚˋKNh3oeѢ BIxmd*IHk(çTZ:Zm[= ů>,NxFFჷn^q9P7֯_wzd>f.Y2/ЊH} b 1cFG7NWǢůvo&M4ɧGxm=rs(dɓL~G̚5XeEɰau #Z -b -$!aöm|tWXԉ CszsE^^0*K3,ްjkIQq[OyhkFЋQh[L*b|k#{]XCZ ,[7\\dU6APw>0I$2/YtY2jfuwGGc^ށ˖,\5Wz{gGk7oxyDcl Pגe P)P, B!E6/˸Ms 㙕J=aJWE,1'3Z? ͹Ƙ#,^0F'$۸06~#G3:рGtkI{c<͉i: D/-ַaM71\tkxܴ\*Nk^78q#n b0rtFԼ=f\_ƻu-x2'вqn0sAao v^~SrJm9nM=̤?Jx.Ql`>kV_XBuq/ 6`XSz'+iLΤsyKH Ip ߂ؓwt9kn/yv$Adewz˳L$\]fl}nc'WBt nz4uB%ŧv;=R|$0b)Z^x W’S'ˠxY-X! q+ō]"" @bvN(ТҢ’B@ Z.]c̄IzIB[@ N%BqXEP Y\Xa)i0_#bCWLF[լ/[TPR3),ŅdA%8$.P88.*a9P‰Bjĥ1BIDATNYJ,,^VxथRBkk ")b"y^jФ%Z脈870a"p "!Gߊ`Iz1Wވm'b-jdy(F~ L3b" B]%A[",!q}8A d<!ibH7"⧢&$K gP~Mp=-DLK,Ȣ5E2'S&a}:ȳTFq%"GGJAbRy&Q&ӔT[^D&6A E j|ܺNhɪH"fHq/L)S~}ӘؔqXD XiQ(}NZp!X$Q)y"!8!O/D@* n/ϐ :qHMҼ}, Ӯ$6- :| ,Xqi%O@rW~DP{'pJxvAHIENDB`fotocx/images/slide-show.jpg0000664000175000017500000054420515247006660015067 0ustar micomicoJFIFExifMM*JR(iZ0232@0100fotoxx-24.10: paste area|fotoxx-24.10: Paint Image|fotoxx-24.10: Paint Image|fotoxx-24.10: paste area|fotoxx-24.10: Paint Image|fotocx-26.8: paste area|fotocx-26.8: Paint Image|fotocx-26.8: paste area|fotocx-26.8: Paint Image|fotocx-26.8: paste area|fotocx-26.8: Paint Image|fotocx-26.8: Sharpen: Richardson-Lucy 1.0 4| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 729 831 1 2 2 0 C     C   ?" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Pe>e)PQ@E>e)PQ@E>e)PQ@E>e)PQ@E>e)PQ@E>e)PQ@E>e)PQ@E>e)4`у@F :n 4)4`у@F :n 4)4`у@F :n 4)4`у@F :n 4)4`у@F :n 4)4`@CI/xvv̖\4|g`+Ͽ?ڟ#!~ڏ:cpnMv. 0LWoS}7;_{Sz?⿳׽OF?)'?G+>Oj_{M4ooS}7?e?⿳g O{zƍOjGOj_{M4ooS}7?e?⿳g O{zƍcS-=A? Կ'?gG{SziN3~c=r>i4M$8D $pO]ݩ+f~g O~Ͽ?ڟ#vֵ+QֱmB_gy <{i%F1⳼;mkg鷺B/ l"ivպ{ /xC== ϧg{Szj\ m' BNqC>7r ŋdd`)9 Wd?e⿳?{Szu4oQ;BQi0䜏΍kKw:nfŭ:3)\_jWOjG}7?e?⿳g O>}7џvh _{Sz?⿳ןvhϻM4OxC==_{SzkϻM4gݿOjGOj_yoƐݸ;<g=C@X~ϟP OϿ?ڟ#gv{ *]zv4ox|OjG|a4$|I,Qz?xR]yMGbA+h)'/yt=eʴ^"6?P7Q[8qjƿH__AiڍYOͥI<rF2kݻ$Ce:9kLh> |;XXLJ4{:JwϿK=3L} W v4`LD_?G"} .UF4ϴE=S}/Тa?уM3Thz(X~4`LD_?G"} .M?>OQBF4ϴE=S}/Тa?уM3Thz(X~4`LD_?G"} .M?>OQBF4ϴE=S}/Тa?уM3Thz(X~4`LD_?G"} .M?>OQBF4ϴE=S}/Тa?уM3Thz(X~4`LD_?G"} .M?>OQBF4ϴE=S}/Тa?уM3Thz(X~4`LD_?G"} .!?E0?~0\/JkG-v~ ;xQX)F޾zx~tSw=G@x~to:M?:7@ E&޿-_΀n_΀n.h޿&4x~t|^O׼K>Xj =ݟ$& 2]W?7x?h/ŏmݧ_22ScѥSDI\jpH|MS4W1ZliibYی7{Wu&]~MJeSMeiurO3_ǟQYԭ'/n>+xɀw .A_®(߂_d𕆃x|.׮As|E[S#CFTŇ9F~%}jZEWMF\Z 7m_''BŶ^Am Aq~-`C 0&ǭ|&>^|exL񕜷:4WqX!v\ ǾA&T 2k5JKlF{t> !.}# nB3׷ _^i]CSH.[+{0f''~8xĞf}qbtkQRZVMѿ{ h+ks߼sOTO~е?5xS3$M ʤH6{|7xC-ux:/uKG[:+YXJo|9vYjGkcwڄȧuǩ'񦋦R/oRy2??: >3K&z74)lK-s 'EC}V]xu+ig<@ene!Šhq_άh޿bI?:7@ E&޿-zx~tRo_΍Go,-uq\\o}e¨_ΐ|=w( AT+hn5%w&<]A|x~wUbUf0=@ 6wp \'?Q_#|mR_65ˍVG!NH_.4o^+<tޭG4mIIo8S)aWs9 {})g8Iz⿎?|xq|exV  ap,D C*aWk,#z$# '$u;;]+v Fq1AgÚu.̞u,hGo{VV0A* \I= Ѯ<]7|/xhk0ꎷ sk!3R>f,gRY?b]⯇$F-Tyfb!3zscA$FlׂM\'|]}Oº : 8BppFEz|_x@xW'T 1>)Yd{~fo΢")\dߝߝD mv=sLnI]zN\ r=:2=:'4\ Iq BߎO> Vi:5|7o;u}Iv"Ua}~Οo>8|/7ezu6[K)+@W=G##ȣ'*n N?* @F{z׀X~ x\мAaOJ5K6#sk|){_xgJn}Brx7C=|%};d~b'GWxHKc@zfՏ55OX~7X`6R#OЬ0|L`n)M_Ƌe1 }ƭ))納^ (FىeRE>PkRW7Io*@.4rיh i ?fM O:unLAH,HӸ:?Ts] &kY%~@SF1|Al۳Bڕǡ:\c?:Wow0 y84y @H4e-é5) euaz#)85NUhhʇ^kb ?+p9??ƨq?8cD޹}w-p%"m_Z>.%QcU~}*,cF}UdQ??آ Y4g_A=l{},cF} bA=`Zϱ>WxG b0-gڸ> %-u cL{+yoIU.@5(]\ WV o5Ϩ+OOۚe(M9t^,߳u2!GFiL-2G1ԒJ;WlG-\|ɌTv>P#xᏍ<e[{iWWjZ#&`eV.Ƽ_O??x_xw+R3yaualI.fFs1z-Ȟ Y֚hr_nݞv) M;oïX ᇉj{o׃]4Bvq>9|/whW/tr7h gҽOx?1lE堹Vi .y x@𵶕k-u&ج9ߴFL x_}[MM?Q|sЊ2Jo%vz!Po-Y? Z=/ڿ4h+xrAJxf}F¤avkuuȏr9>i#?~ i-.ľ[RUԭ\7rCSq_Q}|Y=n+.Uk]tKXf|-u2s^]Y%X`ʬ zo,xS* 7 ~;[mS«m2X&p=>l[!?qKQ<}1kOCjzUe tf Ph'σ3$|#S$F54>lq@%< dWmݟ>/)>XPE-+ O ok!H.؅< `~|Akz}I.4 ILL ?߀95kC }d]dj3U~})Y~)|(^> 7U[1qNOjG yr.:O 6 0($}lxG b0-n>WxG b0g= bA=+0<ſπ|}xj;HҮna?rŗvH8N}>/ V*;8o5iR9% * bA==@<$675 zK濠Pa%`򹁢?apA80*H>I|U^,𝴺n5kb-"e2[g\a;Qpg? Z_}yWUyӤz.eU3:YZ|XP\i2D>ڎc%5MPKqI m8M{ß WcA_˧xNVm;P@SI;ÏêEoí>˪^^M)Āvqw3y;ŝwĚftg8`RM`0)UoO?~4]xcXWt-#NLŚ!}O_|am+/Kү4X6atciT+.A$  x~4flU,Zf"0Bq%s3Va{GVtu[#~EHr8l湉lj^eex\5RMiy0;p߇|Sߊ:|^nEz5p>-_Øx~mj6C_^+|@Ќ;8#ܜ>%mg->IibUCvahEggڹl_k'mO@,u? 'r-KTEqp/C 809W?3h'NGxfOICfYxٽ''-Mr?x_KH^Hv;>IB@vS;cV}-.oeeo x sω_TC%6 8ޙ '55=CWѯt=GONK 3#(X6;JէnO=dI{W]5 ( qZ~/S<#{ V~ SNܰiSBon%HTៜ!lobI?vLb@%qCҽ/Feh|Qx6[ 1ًq V}>tU-ZѼ3H?vOy-kj<"&2dlsۊc2~xoOS/*T2\ox6?>"hz5N4clsndFSv1J;x|e|{xKJ{YxKm:Sz`I\9Z7ě x>/ٳI2;CJqЎ"~|^ xⶫ +uV3@1`d5kuL>^Tt][_fī\E#L Jy'-Aߡ|9,PzgYaXx~ݥmmi&Y1Jgvzשu)Cxúikn^4:N"K@.ϥ\Wm{')4eҭE- &k``ʼJI;p:>~ϚGO~%ox>"-OPfo8"sʟ5V)p}(5&QEQE7*((()=4PF)p}((4`J)p} > Ru]?]ioE+!Ve1AipcXH be-{H wemtZi@~|+΍/l{ bOOkǼS7[ Dmn;bnF=&Ӵnz"(WC6qxI6+YZU@J el` `x/~%Qhw;/HA;Àqۜhs"(WC6qq>kw5֛֖Uk?iS>H`s\f|?5 Ce 6^h)8AN8J,ǰ+M8ƒ] Ldf0OJ턉 A4i-6ݏsυ,=qv_]|<=m؃drW*vՅ:qMƍI3 h8tnŊ|^8ko^-Ҽ%}}6'4kH}9k=ŽC~KM IioGD2KsU5}mw=]o+M8¸~Ҟּ?MZRìXxO_[Fݶ'M-6P\XBΠ$n2t3hyb:Q:p8+?kO~-cKyii~sio{?e|n`cS]6DxV uۇDŶ} v+*W#4oyw?]oxO1j/akB-?0Rqk GOx]kX$?_QE K~!lj6?]oGwߵ_x_Mj>$}6OKO :1{dsZe:_|BH,!nN%ťh~tlGI`~>[D>=gxn]`{l d]CšciqI@m7 ^[^]tԵ;o y(M. ;V΃(4]#QQ~>\ Hbr2~\q(\6q͜c֏EtNG`NHX'xxG*oz9-iCƪeXAlm.HqLg .eXVf<:K*9;i]^Et?iQIFAxGMxZOtK}ꐥͭҡnyG|ɾ)sA~'xo EӀqғM b8X>A&-ylm&Rt%tۉ1 yOv~,,|7E=2\̌ws@m7 t30m8pH͜c w\_O<;ۥQ<7Ic HesTqgBuIeU0qq+5GAloی8mfmbrPۿs+|SC-k[NmSV߉%˹BHx^~kHgbЮ{kCݭj`q9&6n4 0-Ro C_=蟷}4m0ƟxbDQH3]j~>h>8ԯu/]{=:O]B{bB-ݽ0r=1m Erqd$d˝!ϡ5ׅh/~-#GA YfM[HѯSy$*9$\0a*HTwIgxWk|7]džvSҭl[;@K{a4 ˟' ngI>yچ[i_ۛu6[5hΫgtOZJ=K"GgBP18>/^k/ڇW{KYaIUe.d68Ę\V, ŖzA@\hʹ:܂D9pX>H%bkahx?Ϗ 6M[5e$Vhm0qҾеh5OԭVCm}oj}XI'XTI&1c*<ؿM9HeUX5hd1Eq-"Q_SLT?¹ @|`8+nϴ9);alASRc5?5xL|1m+U&}wI=7KV0#^ {wvĠepI֓w_6IzOo>louf Im̝LU ~> j>'&+jW}΃bV"y I¯>s#P) 2pR 3\ϡ6.a6605ʹH89Lf|H~*x\֬,,8h3_<Ox,W.<5VD /38榴,e|EeM0\DSWll:!|۶}-Gp*H83>/?z-֓ayIjW@ܹ}FzW㈋hV/ IoTa7vu/U(@lЂ~RN>QҾQ?j\ϣYi~׼_6aiB<2qs;}mԅ'p1sG(̱A Q's "[m+XK =8jckGqes\ƵNG/T:Vouq46 e?#/|@W^tf״j U1H3'z TI$?v #(ؿ;C9?eLRZ!ZIm@Up toU|@Nb/z,LTb>j)7 ?7_O5Y7u\du43!(^!^' itS6tŮB/yWj6d$dPmTQӨ\6EO>;xr!7-6C"6Kv&X#"3&NJ`Bg2Tx=Al^~U$t昬|mٻ_Ojᅇ CB}f i#y<q~/5gR/ډ/tMv AV_8C^۝M-+*0 ڲ4{B&4+Mp{;b꡾nsB-@u^ Z;Vk/$I(V{n7;qO.LJ,o>eg$ɂ9t@-דѵv˟V8ՙKGs珋/A/C+*jIfۆҬA I-BMKo'N_m^ŭ#jOf  $ͣ#80I꧕-r@-Fr8[8./gB_Ymki b]aTy#U $cк_Lk8Ay- H4`UON*P1{?0JW{$JEX?<}ZRZExfO[9\28B߳gįxgLllbT>$฿X4$+(㰯ɱ[o~>ҵ/ xY?6 e$%vc9e/R10RmKϳ`nHA`XeĒtݠr6iRv SV 6-ym+:uO:֓;]{m2ğ_Y2wc ?}#3\]k6vNa h7tH /v~G G@ ~u5@h:X]"6n Sm\iXOO>$K^<hEɽX- j]JេqQ|cmogZ3~~ҐKq:ŽV1AHƑ/6Yv .kV)pYf2YljCnCQ:QH(((uր'X?Ҷj9@^|'gߏ^2ï |A|q.sa}l!*J!19,PXIs=9C>:_5CzDŽEo~g "\ P9 z d_~ ,4'S|"O_DE}#"mHʎ00;bKvdh"2خ#]ʹhb N3ބQus ~ź/<]O ~ 5_ íGf!]V #E1W:r4|o8⇇~4K֧GFtIX%V>ݪLeW`q@@ҕa ( `Uݝj/`>J<]?x[#A&=.f* ٮod=WWeӮ|Bun.= Qx^?1 KZe͓I$* z=pzap) ہұ¾LR[꺝O%C P;b@M] _~$| ׾k>Xljb"-J12!*X-ځH{÷{Y**089bp`&?,ub?a"/& o5 (fI sLB3rb]Y KksZ1 z$v81Vc©O!›+Qk֤} KN09(;_\r>4!ۖ?|` zǺ/dB;]6 u qfK8=+7ϋ-/xoPJxYҵCekEr&ɜC'$c?i6NF޾8'‘dfrm~> FBx_Q6̃$;Jqg_CTnKo<1cY $L) Lnkf%G;j r@1jMsO| o v0gK"ň;Z` w~Z)tnuA<ԼLtTU#h#Gb7r}iݟ֫A.࿎u_R(o ឣM^k"APw2 %m9_PdbrSNGb$ *珧OjZg>" ,I-㖼iR-$6 IO?Tm_TohxFב:?j@$p';C3=1T5M=Joo,m(䶕唡l1ɟ^|qJ/Ï~ Qῳi^RH4Hݲꮻz$5s-oC㯈 Ճ?=Y狵+FzToog2)Ex5o+z6ĺ.pzljҴ(YN扜, OBr jjF|LEKxi@¼(s^%s)7~2b5fToiDIQ#l0#8q'Sr6Z>BͯV?"|/O Y\%'3sOjAh5k/ <{-KOiv,n@4.5G){cU/-?>|E}dy(<$F7mixgwj~ς;=.mf-7Z2mہ#eQ>kOcZφZͦ~$֬f[q oyxcgu;fUs:V<{{x2“H$r3+yׁk Y<;ojW*ԤЕUҼ146:* ȬUL1c"#;_xP@+h\E>x'7En#IԮR!;5L>؝MvAF?уh1OFA~M1=kӴ׼oxA u+!m2, 0"%e쏺&xZOE K}kqdYoV)}g_[6V~t[/,HAviuXxĘ869# ^E_ow^ ԴxK.._T ct{׮v@<_odrA>}wqҿ5G|Ax8"}B-5='8\r$M;>_fǩ( "36|n3w)'Sg?R.ZRnϤVY4[/SPֵi^ 4\iO=I"K# df')1y)uOmqJ5 DXh۔HWk7/φJחv#mo;E5W,y._=6/Ggz%PmFX_OIyýONa5t҇<@&Ԟbc$U3Qڸ}{էſf]oxnYַoGg(^q]+t;:&{nWNԵ]r,9K&NF{k[_ ~|QMeo4@I, e@ P8z' pɑ@P0~qJL)pXd9:qߑ_M뺮Z04LZL`gFk;4??kI4O+}BӪ{+7, .M,`ecBCiRz3ױ; ՀhXqk6x${W斵'13ռuh5[=RL$Rq2E#``犞_ cM|/+XGm^Ns2"Ap1 J_[N>la6 @ߎ}8W/w>k i蚆ܲk4n,fۻAۏ{Ԗ1jTto5 4J,(Qwt'Tb|?*jN[?+ o:;PWp ζ`1@f0F=sz^ohڱYnn]a嘟J~|b? |ki)rJcxU,U8\ Yi?|=x'VWg ^U[~#K^M Jw]OOd\4X 2Im]E$q>2T\<Òwjhm,29 Yʐ7K[ >(~ΐ"-< []p,w5u&#JGY-7Igu$wGS+pYs3jGgY2F pK 'J"mXnу޾#ImAZͭ閞 =ѹԴm]nSq׌74)toY],kXڵѽk  ӭ"}aKyP9Eh1\$[q?y~O|W¾Kk2D. ڑM@a7x_ߴnCTu7ʂ3L,\ }J0m6h$𖦚c\On/%;8,g'"<_C/|RI![mL/]̱IĹ;s"v> "lKwPѴ~4i߇,τjFº0φ $e)#5|6ˏ[Ϧs}4ޥICyۊ,> -=3^`0Oa])Q$t Ww#t#':'F7_ٯc5Y|=[ޭsgPxvjW1߈5+to-ǨsbH)ec?/$6G, X%瞪~_¿9hxo^jj%!'Vc@EG ;{W~Z.4_#U5B+hu{ݐj~sg@e/o:rha2䪱 .}00H?ZUr3ݛN+>.}ᎇ?R_YĞ*ﬔXa[be aog[!8*  {r\.~HQ{/ i+F#8[ߡ5qr>|ei^Z:Zdw;&U&t1xAܯm4) I'MIc_aҁqx8(47qQA"o΍Q@ :Cg r;QENh((PӮ댟.<>.;g{HY=N޵ '?LLnIT#ߒ[tz}'R[~mcuv#w,m L`y uMM0K ry#'q89sJ\~Zmu'q9$q_Qn6) 4Q@:ͪ\_AXIqi*)uj9b(s,Cdg-ceiGRU f{wo8V=?h~{CQ{CV\,RѴm8Z$Ng.il[Z4*ad#iQ0*Hnړ KXoivsAAipI+H9;.8},m-28cZƨd1uzTOrvؔCs%D eaw>23RƵ׮A$^52TZ@j.RؗZ;U4/ԒLza SE>ecڵu?MmKY4 BI.g?H%0+0T)O+Ym-繂Kxev d]fbGeA'/aPO2IJRБC( vTx{KfY>eV[k8u3KZ]]AYAsvn&5yr['ږh sø`qG@ƭE;J- +]> ggB@w}7"dXq .6ghP:ڄ?B0èpL,hzUΣ>csu5o0e9v9/  /fP "&H&I\~ovvR7McQ<܎V-O]IpXZL*ᤷF7 H5IKjlzXRtu0˴tD@ zdWg1Pr]GY1۞( :El h,,9Xbv.{XY?Z !oBT!hMxgI4h/9+"/>[$o㞼"?J5ej\}dеwVqioq $9Yl>.pGb:SK{x^i%g)6dGv$1}=3J?|  @j=m|7XkijqDtg>_cVOIme[Ke2 PBeAuM` TZjQjQ]A#|W??K*eqz֑dz$6.}#{XdÑ`{Ԛe5Ӕߙ`+=u]T cCY>.ϤEwVK4*Hr>q0JYۉfʱ1aRA8^ҳ5p9G !0.ˤ\I;ai;Ϊ4*V$r8tCxfٮ@SQlgfyҨij?0hq"O4X n9_A:Fs R(f5=UT(=\6&In^GZH'R8 W+:@ B񦶡I>HNxc+? <;OhV`ԝo${i&m${WKgKyV:tshCמiJI/ױ@k+kZ<_ÍsZZ78h%D`v3#$ MƵ,E(((((P}qE֗N4-3=!+7P}qE֎3i]a)Β)BV65J i..g1EsŘ[xs'te4/2!F@8~WOAn b_ 82l7mtaad||_f/⯋mZ 7:ރdVk!DpW] ~%Vh~7?7~ͦ\ P8;KRw.O@1'03K_x3o/h71ܼ$#t}sW?CL(((((((((((((eIJ^[Y#s:Į{,@8⸷xXdDuC־Q 뚯ƙ{{D H[i#e[+ q'9ƓӴO>^=_OGXMKy mn.8=O"-+dr?8&n3Ð=rk cEI+ k:> 5%PoŬ6 !5Iw_s>3ga4nMYn0=O^NA 2z ё 'XҶj4%|Z_|>nBLVq^!ITX)HUS4gEψtcT:(N,s!C}x ]xS:d-i@M6:a+Ѵ/uZ]c,j5ݍFAswEixTx[X;k71閫iQL,iG!K޴!5;<%{_jcHC$$;w7/ }||;G[MW^4wY-ݣwc2T2g+ i rWx=v:־Ln>^AdֲAa*1 ,OMÿS9k|$ᦻ(ln5썸)˖$C9 sPJW<-oh>1lK1()Y_ }GHdbm[ ֝pxC4!u$ ݓEthۏ7zUSa{-]\ٙ+cBŽKyJg֏⻛jb__ ]%[8ol_da *9'?_[ǺX :g 9!^W 䴯^Zf Y_mY,Ia^?wh\K7G_Y=yV}-b}hޭ׌z-/$6RѵUM-kw1Y;9,WA'م)kc/<9^+ѵo_^:lviXBen)]dž?h{D׼)9=W˦jMh &eɗ8q\~z<<39َҰ&c#p=Fo~;xM͡xoLҼA]7WlPY wvu~GWcyFּ9hS05yˏ`*Xc֟| ԭ<%cmfwOlc`{oAܝFK| R|[VY c$0`*|cZ}~Ni xMRmlfۚOm/zU΍h0^2` 6{Ҽ_yYJ<0>\P3pk͸׍u{k^<^qgcI#Ro1EbM9ghos[fH<2P!p88V^4xjYͫZ-J@l!BYO'=[MWWy!񇂢Dk06 tfKaxJ٦R{_!naGU2(m^vٝ??i}s_xnn5h'ծ-n!G﹁ءTlmex6zuX'UxG~=G@pr1^kAGM Gi+M𾡠8^'0'$ vρ^!𧁯-P(VuQ v93"3.hA`ۋYUdwm9>[WlM=xS?\jSTmʠ8Sq\?dO|9$66 O5iu+]GZeC4cF<"rQz.q^~/0mֱi~S7vBQ4u П>sGHmfx5]*y>Ҳ$aXk~&~ֺ/xG+?$R뚕EH\H`R9?g|skluOz1RY;*+?eKxgeI5oirFwI6N f3<{5I.zHagHp푟Rx^';$򯚾%͟~"B~/l'H1ShV$ {+OS7w}o%yTܡ%UJSx|-j7 Saxq>=ޮ<1D#qaG8?_a5!lkg 7Y\uj͐-y;ŚV𶩡x/բMZ2A]6yg_ x>-կIG'|K!='b ̥Ji\Vgxo^+x'ɣ^$ImUM/ln}x@?>?Ҿug߈~,x>xZ /YW+@so0} 7?E+ Yɂ$UDU$ͪ((((((-CA_OZ^д@CA_OZ^^7)-y K֡nwbpR+qkk;'),=zgֽVɝ벱Wei=@~|G'|;8|Qqg}q vw]Z*yny'֟s2{U.]k~+%qkwk,, m OFA?;GF{Ό{ΨlFA?;@яq#T??#gh?:1?:jyl^GG?:jyl^ǸǸꏑFj{>NQ?K"UYh=G?:jyl^ǸGT|S6v#T?;=,eٻ۽UZ vd8]b\GP{V zWG0u{uoaǨ۫{=KP|(mI}y;uoaǨ٪{=M5xC.gEy4eF9 0Vk`r=wq[EuV6~l5_aǨ|1 { -y'^yVz '0^A/Tw?箝mh8c H y' |0Ax6/d|VǗ];N6㴵32=zxq*DwarAOlyzӿ .W{#n cAbIK'{1''Z>zIW*Oqq>wf=?5Px}-Pk#\Λ4j4ErSտ罇7s?o;@ᖃ'X.N3Y!JoU{VW{#O/Tw`f9cV0^SLﻧiQs2` _@q8O/Tw٪{o=Lzᖀw~,ŘL8wspi?W}<}/Tw?箝miX42M}د[=/zAxNc?箝mhO,|1>e;$lp}Etvְ[Bca@V iv/U zVTduWFR2=Ermv9Q-̘q[5Q-?5_# ~݀A #nH>x|h#r`?Mlzӿ V=to;A&?+-y7䟏wJ 4'hd5qӍݻzdǓM?2_?vd±1"o]mu1mC`/3?e=9@ᎀT) k97zП 2bsxKg#t?&0n<(mG&@x=*x[Q x [$Cg%?pʠc4K]SWK&(5)\Qqߐ) ==~>*}g፼V?O;FpݒxU%k >j/>k%9ex#T+ƻvӁ[Ey'i #tmOM,tgOiGs~u)|Wkƺb<)m5]\W[?΄2m b9E|^0ă~Oюf7M vS,Uo^~~CP<[m_zP֯wN Bk,O dt67'=]xxoI? Үэq=w!T`mu_6ڮw^ CI-w<^A;rH#ھIDCO4iniwFxs*LxL9[+.@;q W= 4 xk k57\+ľwGfׁG O ]$Ě.ƛ2)~c=~~ύYi>$q.Z_ٴU!_1._'`fr>?l_AO?7hNdMC7)S7'Cx׉|Kg ƫVsqqVF]# Owiz{\xsZWi,ZB$Y>Q2)\GyXѿi/uc_vjaݚ$UFya)5tOSo.E/oۿjsܳFk~$.kjY>_O4vYq19+w{/nUNּ|7kZ)-A r;Tܫ\׌ǎ|Mhx{_w][R!CmÒK*u|Mo,|'X|1xM/ȓH4&`ȠL.aHO_~?z1 %eё4[-f6Ì_N^\৉kMQEgj:x ٟjoٓϭD|Kjj}?\7 0{G3&_Mx{z%׮Zd-'40lۅ^1gG<_5Cd] H)?'"om NS%Ķǝ.M.sefOJG$'TWCA%qZAAEP0Q@Q@Q@((((PEP ( ( 1EQEQEQ (QEcEټ6v}7لH/$py=jq_Z eqjG͂:p:׋{~!>A%櫥VEm\&6}3~($^C3қMu=/WS+$pyӱN2.>6- 1롾s?T-gu;[iT)$F"X<1A|@ .H֭ uMj]NX$ӸwUʍa\JHui!#eG-!~E6mx7u+h5Y8Beϵxu~,&5M3Nլa݁Z)Q2,{u+ԭTO#9McK-}?rI`r gqq>aZ+oXk]"NKCnVNs_,$P⽓ߴG ^Kgx|+kGX@%2C.#%w}*k#c۲t+YT?~>9ӵnxᧄӴۻ{oV247Bzq]P{+'- gkFm"< .{aY_n3!do,|Hu-RwJNU./^yBѦ Q8fx?ƩY:"-uM?N;y$,w0\Z^0OsQg?G5󼍹|ߎ/\ijM>c-J&Ҡqzb0ȪB#> C'4 ; 6݇XAP}2>!֒B[gQ_8h:|cOyg=NGt[MJ(+,EX;c׷5xڏGgÏ_:-[i bY0I&$XcdntFC+>Fϋfi[$ā'i'uh__G\6>=|]'6 ɺsrY۞4s'Yۿtl(kmo9#6`xҼ_߈? u/x2Lg.ZӼ9y{ ,Wf >|B?!|]M͓I֗Z\E7:+lnӰ_ SB2"Hv <; /!+>'tܝß n3rƿE~:yc >4~ |]7MցxQtu;#8D# ~>*ďڲ|2l- Z_w[M6-mbpX=ltt0>8q>|Kea\ӴM+^׼%y5G(2zW_d'I\I~5? ؝6^{ jY~'*2͑($zؒ!m}\>Rp[ P€ `v=GTM8Kv6/o9c$pKyqY%'C%xĚNkX'DЭu Kf`/ϕQpze0?3|Y.[ƏBC m=:goW n 5qZ A$L8^>Q0aAv_NZ⿉ ~=hbZE.̢ZF\tV j PǂA-Ni~ִA#M# s_H`cqP.ҠwҦ)S޻3Jy->aՒ_YŽ*"k 50]EOB\y̱Y6NO׎OWvQ6>Q?g_AQɠx"PRam%@V3!S3O5h:O4sG}X[{/b=z؎~6(/ x)?W0^t#ǚHR&D'r l -A">'SQ,D >WDI z:PHvPO~xk u xy7X\i[\FOo 'V{|~L6G#N63v@&L~]WҸ 1D{NA|;Ѵj*dԯm6%˕Ĉ9^JKm&P򣹳|@3q֪wAߦuoo5M* mQ=sZ4gTX+ƷkRxҭM2؉/}:~ǭÑE"(e ),n Ecp֯n8f9l/"n;ۭP{O-c"HsH'9Ʃ+oBH{k9LʛdǨK"ޱ^R \?$65OA{6wmLJFϕکĥot|-ZW{G륬!Y L16'. oTDCADW NGYb$ _ߘ'?3} W?$g}_1E3>'?ТAEOI?dyQp $bI<(QSOG$g\('?У3.TdyROz*K<($b3>/?TdyQIAEOIdyPTdyQIAEOIdyPTdyQIAEOIdyRQR5Yy72/z<p<7+tI=#RYp1>?,;xs4iqR\^\"QLĨRr^%%JGC$j~P4!}8 A'rI'has-?uOmY}nv̞[uV6%&-r}:k->=-k5ʹclitͰ|NHW̝ٶO~~oӍvPPНO>&Pե0Aul5&cR2i4gyjQG jzwB U~\^lKMETgؖm! J=?Ekk7$^1@'G>_K "CidSỏܬE{jόsRgǔg1/N(xW|->eh\O{I}:4f)rpTڿn>Ę7=%9RbS1Бhs(ߴbKH wkq=Ȱ8syZ:]2=F/oz ?)g2&?ɯh߈tf[O;F>!e")9Bvz6O xNhv347 Cg޺suWѥѭ9.nn~P9=~|e|pr\74m 5r7T۾ ϑ|(+[[pXޏ蚯ԭ\K4SG#17tM}%~>.u_8oFAT=ꆗR|8c-zdi szܤhԐNN+K=kOЭ7e2ْp: ,ƏaxO׵{uJ`?l>>ux^kK:m[vFdIѦhpH' ?~Vzi.tE!Y& F[犗6hZqgmjщcFRIwyfSǗ߳ :ωqj})'㐝ץ/~'x_ĭgZ4{-.^KnL w?xL`Yүhm,z<1߄Pd&1r^2u{ߋQj xΉki>@9cu[u 5;SxZ$WRLK Z2ĹTvm#_ {gPlog`'],v ~ԟ>A-B[="Q:n-ZrO>D_C9|}q>ͤ6Ѿ!Qh|+?xgwϨ"^/K { zZ~+wdIm23{i5(2kc/m c7%isc߭}? 7Ze&;}>[ŚXCak~gNjv}~.~9Gw0z&}:~Xgj2?H7>"Ѵ;Fyn| .XȯUkGÿ<߇n);h&St` &oh еyu=\}A:v5q rK) ^0|<6 xšIuK˶ ؙ,sd(>_gxz ֯>ƌjI+$eݾFUg89wDžRF\-c@n..33.v9ϣYiE'!/ Xp7|y=k5 |Oz&M>B㵷0?xCΏ)]t+_4^k3]yn4Ctn# U92xRCWcӥݳ_/f+~ ߄?4lGA?v:U~9ߴnZ]Kž!{#wd;~8m7V%7gα%a%[s6.N85xOWt7YЯRkkAđ ?t \ʞ>;HM3Cn%ͿS{aqmǎ]Tb2[x|){ᔵGCQZewm 1ހMh+H񿉮l?>{\#d9mLv_YT5WZ40@u. #k-׼c2f>4y㷼ͺWF471[A*HIצߋ1d|}yI<0]+3fIOHOOdWIRj:k&!i Wf'@vぞ;R|>Zi5|-Z^ v~W|9!xB`my>{ŸYdZK6+ H7> !u~8°QZ=[Ķn.VLpP8^Gso# |u? WQ4"K,X!Wst\:iڝ֗qed#t0y\p>ɡ:P[}+frgvMs? |@׼W>l9iXAH^]M|ϐ}?#O~^ NhWZkVRӭ2k=;wk_? |Ik :W9R دy m-<tk=&9]9o>6.>"-TgZ\ y␂XNvW^OC !mzR΂w#z8'hQE ( ((i/BcWJJ0xg?hXxQL[Q׶4[# FZBY_|q|F^WJlw.EQүxcŔW :Qi7^LgW4[[KFI2vS:P0?5oҿ?]-gR_/Ļ>ZӂghU]dPWYk ᮎUgNh޿3$q_"{7?i?6,~=J1?*xƓi?$q_"X1;~s_ SƓjټIDIE0cϽ+;O'W )GģiƓҟaaQt+C_'G dtg)q_"cϽw=ğN4KQf''i6ʿ3$q_"{7i_7,~mGkC]q_"ା&CÍ+r7 &=_8?k'?V\i?6 X~h+O@+'e)8?k/S8d~Tc~UVƓV_7LVIY?at~Tm~h|KDInk.??6Ӻ&=F=_i)s_7G=ħiƓY- aaRm~g+_G}'O{Os$IE{'_6|IDIE Xd~T~gټIDJEo8ҿo/L,~G>i/'8m/@X3ގ}7Uq:E/=M5?Lq&?V$HE7O'W ( Oh5f'+KDJEc{7?i_7_':W ( 8t~?>%4UƑY?Scڿ3>&qO"o'G d( i7#8?k',~G>i/#9k/GOw=/[(>+]׃5_i+: ͗FO7+i)ÑLWKKڛ@3u?OjEѸgr3W5 M`u+;|JǏ|k|3W5 f^˭ij2UO;IC_GР`dԛGG~޽k5_ڗH'>{ :&}LR<IEvqQ@;4/j.-qDe"YܤY# @< )X҂:q< O i*7m4An16iߴ'ÝWE_aq[ˡI:G.zH)C= ==ǭ'lv}:Wk\+Ac&(giՏqrk MBޝoZ_K *7( rH##chLQc aBzkf~-ot̷FDmuF\~_>#/U\Zi=\ eD;] {gK_ZE;̍Ť@Ͼke0p=B\>k^u?ֺ\B uPpcU6ne{^3ѵd{9Yv|eb 0ɴ#G1=(X^3񍗂 xy{=6KLEUތ~^?/ڳMDŽ>kZ?u+-FTf%3N:z>cJ2[zƑT)ʀ?| |Y/.j/jt˫[h~ 5MNvnzi__ ,r$3X㌬*F>ӂA.zfsAېGDv5)X$Ѱd1+y'?hG,a_$$OXآ勶 ڠv= c,[Os`3I lwc8?Jz@<:сy^]⏍"Q_1X/2=6JPޘQ 0{JZe[=bShjp#H볃[xXi|OZw?e%% xo_K xo֬Mx=߭Zx=*wFoր$=*7oʣѻ 7oʍ{~nhMx=߭Zx=*wFoր$=* oʣѻ hRZnm5[$~OfڇYEWɌAt ˸xs?|zQ6[gC_FKػ~X- 6!P|c*?l/bt*=+i]%Ցq+NJ[tE}׃|]j1}J 03;3#u-|Y3]j־!3;ey7qs*Eb3!:}]+~*񟇼;u8k Z\s־TQ5%. o[@V}K[9#Kym^Oo 7ZfiU֎5[rH,w2DIH'5o⏋?Ο?ݶ?&[]ČcXwyygzY>KO:⯈}]#IKk65XƟ Oƺu*x6Cͥmpv}7E~8ntE#m0ZE};:7#iEm|6xGx_Y`kďaR4ySG 3o%E<%כ՞Hz7O|NQy=/>.`k"HaGr oœkOD5xU`56Wvj%|vIȯ<Ҿ i1&x$K{fV6jwE[d##9VRMfFk;G^S4M:QWk=>#ߖE~~7ayuygVze*ntw m _-;aV?U&u~Y=M}&%h'Ҫ?(J\ V3qֱgX]{ԐiVhl/fzj̟~2g𝦹 hG:fZi,&7&nW "m2 ž_+iԮ4}84[MtZ5{bC bf< KJYNdTPo8|[C⮉^L~&uŴl@/ 2`~Γ^ mWcx{[줿F8D-'DRޣ{; IY]0&oU*"W'5gⵎ_8㛉!G=u "DPZ 㑙d+<H_ۍ3Ǟ%Z_Gm]Ě&Ϸ^\~`=*w?Z7{~doߕǷQhǷFT{Z7{~&;wɻ%M};u庇N6 <##iZ##xwP-VmSg#; x=*wBϊ ~|uZj%Ht$ןOMM sgXvv[Uۼ˒TRIsI:/~/8Wқ@R7)|AMx??|GdzC4:G=yHS2*gxc;}UA*8,#׭K(灼U~:&LXExP83^F|sׁ!juY-\Bc3Ms_dK՗i>JI^Ҧ8\?_ wVא|8o]Og?&C`m#oN'5;ޭi]Xm,KWHr! Pv as랴ذ%%RЛ~>ZOٮ|/|R57W`w eS|^'?vñ{v)qP78(oIo%:nkrr= h~ O k-7I':Mk~Zݫ4#Y q@sŏExvxRU q<ѣ^>c_e`޿_Δd1# TG?_x_1ξ<[/S/mO.5PG c9;_]gѵ('{zڌmOiky幷ib9@79`; 9'EX2pzbr{ig_Ϩ2U4V}I(6 zU iϬk ۶ol2U'8Wi((((((WB+xm?Q$ wᅱ湃Qima܉2@7SK-xjږc#Y v HNG:A Y@ (O3x3S߇5ZVt+8.v`&YOһ@j濷_{յ; g<E39;ecw״.Zgp(nvpEoTğ]ߵOXk?¿V<%ʳ32Uk '_qgqgڏb_J4O*b_J4O*??~|QTğ?ğU?οj?~(???>(?9~+FO?~QT|QTsѸG1'_%'G1'_%'@??~|QTQT W'?6`­>$c'ΕfggصC k=Tc?~14K/$'E<ʲF7uz4_*cO~0,͍'$?pBY#4:*0%>xu8~(>~`9ާ3( .v6q747li??g&~(xWHq+nO B'P7an߯cO4_*fg`3ऊg:B$~Z0 ? 9>j'hł|i( v3nca?1/_%'G1/_%'G0ŏ5aXRe1y*F"0ͷ7O KF|IRQT$1/K(&)D"DQ_Ŀ?hğUĿh?ğU~--ì) _{f.)2H?1:Q KF|IRQTe*OE#3e~QTĿhğU~+dѸG1/O%'G1/O%'@}΍οj?~(???~(??W''|:7:% D@$% D@$ѸG1/O%'G1/O%'@~t?~QTQT֑^Mϧ=7 KF|IQ KF|ITԌj{5Z{Jr۬X "Zq'J?ؙ u:wyk/O#XeMկ7/ަ:tcN%US.jE-qaǥ6zSh(7SFR֣HxZtowg᫵Ե'o)R!.u.n/_JG o4-⟃>)m} {-[E#*q 3} 6_%Ҵ{MmsW(` >S]ƿ3,oŚ6%mhxn'/>' ]5+wA=桧 a{M8 }|C<^"x~Uݘ ۤ#.2}OGu.d` mF{9Ζ ԶY#b7v4 H 4MzN4F)ͱp+T+8e7oxS C]*%h( zrԌ0}BC:fdZxC&s󲐄>վ6|;3Rm?VeI.u{xRͷkSj߉,xz/xw@Ԯ=EX+@> ^;|-:x$^3[iz=dnvr2g8=I}#Q4mZ kt9 Eb71@t= jOǂc_?&7 Y}>0 C4^sI,q&s·m#}1R_||624_a.$kK$т} oܿ~4k[ Kwnu xBx|}CTRYw}3Oo[cQtLꉣ갭۳1_k}sC^:ǢsSOǾuj^8m=弶Pj'?6M']5drpYh$Xg IzZ:^> ޳oZǪ{LR)2Pf\*i=|kgM`(Ll˜`tj &|wo 2Iy Ad45i i;U|&/ֵמ[+` (r2njM[UxsMKt}#3kqoqI&vۻ9ZOſk|?}>٪[j=~LrM|ošuZxcQ1Ľxo2LDpY2SP Y~>07,-ևQYG+lq 2?i:/:ϡk&ڕ~Z@>ȾTrp'ֺ#g]~jVR\O4Acv'*.gc|Kg נмA?h S9?wT}kCZtxk M-Q_:4U$4[? S(q^5.ƣm59e~R| ct1?v#RGOCO6\߈Gq# TEѬu}CǾүZ+ cgp݃@zOxRMּeO=ڜyPbrO5玾_T-u)<(LY >+NDdfmR%42H@:6#5ٟ>xsZj[[Aif 9mN[=M{?ߴn;oIRKkBON >_hKD(QEQEkV+M%VTϒx?i Wx/>'Э\Z$wvTo)veۄ܀Ǯuq0W~$+Γ㛑x^~h$?ѽA{Ж}׊t=?YҭCL KK RB;w<;GUMRekte _CqgjImYv;%](Gb+K"ޱe/m( ^J?WI\߅Jh]tFc>ɤڻٯ|?o%+Y5F rJ~4:Y-m `N{Ǝ`Mm_Tl|g۽GP N~x#.oFxNB"闚1߼ul~|ZdA(s myoOI6)@u8Οŝ[~yx7$77GQfY`>V$7'g~u熧-4ReS[WgUFk|y+q$ K=z-焟ܥ-67?WwxgKQ`o _QZJLTlP=q׵#şk?JxCZuͽi"7T!~8do&xCԵé-uf]80P8n$CGȟ?VPv5x7Դ_ljSXcˀ%P#)ѭ|<,?bZb3?Y6WnP NR&ӓH?\7uXxeDuu(oa gX%LdHy6'u%xK<{hlB}>KjڳeC؏6 #-E}Lk=Q+td;>aMyŧ[x>*ڕ/lt!iIv/巀Wz:9)*LSq< }w֡ҠCVJ-:6I&{]< {|˯?ӵ]F]CiU5%8lONد+sG֯/<Cci/:@<@"Dd z~Q}_aG;f:Ÿ{⨓ּ1hZ/k"ԭ:Hy:;~aHf#}x[zLjb4£@fIhϷ;h=澶ƂF>(Q:n>cNSF>(Q:n>cNSF>(Q:n>bE6{SCqV-?PSR%YJm8J&U(EYW}Kn׈~>W_Mj54;`EHCv`jGl(p#I r9IrQhI3ݹLڻZ'.%Iִ^XS|iLqWG57nwsHdrobzki [:n + jٶgm#*|MM;ZAOH+*nl1Sq21pŘl*kMiK2ZܤuC>T6~'54mQ!"vA{@i;J'$g;ϔ}W.z>,:.ҡ֮5 So&ôTfpq^It=[N5ݭM$.E ;u9zEVm;m-Ǯ+ieK&Z]NcnzPf#1⳵={J$5[-)ɉoB+{5={L.Xb2ytpoe\>ozh,];3`r 9 Y*Im"]cNiIm^MڟcQִ(6>#'>OH7{g~>Ыl̮rI3LRS#+32rG҃+]6C!X˞ =k~>t="3i²XcP8LLRTIt Xvvu)V-ғZ>ctqykinwDDO@cfHOzXQnwu眏7_?Fo߹8_Y5@rCӶIjk[X5HlttMeOU$RE/|klM ME]z@?M73M4 >7nP?? oOӮ>qY[]\>[z][6O/Ȑx#mrr91mmAjv3kz}ȶ]3%kITҼ]#dW}iQjV*_Bӆ>F H?^84 ѮRۼebHF &&OA |&?52~un"xPGi|3$_}9$4SjuҀO& `u4(x27)RzfZ 8Lq6]IIt<Ѽ]zet;mYyۖY"M1!'Fk5«H)ҜnflVN>-𗅬ǶV-OŖ:c砒Ycc#}k&kVm:FӄicL vDs 0 ;GVvzTru7­k-EI-'֍F!d/_s Zr&rO+Č b2Kmbǁ>+m AѼ 4ē\4lPב#fb3_-gAn- [I;\ikTg-$t=ae'i,r?\R~_ [~.dVʺ&^G18?c^uaOO[sG?㾆-ѭ-FG] ])./ kΥP<9dm(>@e@jHbmgWR~*.ռ.ײ]pۍY/ѐR2Tm+'`|?ymbKo 0kOi4LSy*2猎9JƯ5;W KVu"ʹD蠱ø^ |cHMcLxxrH-Ko6iugu^O oQ|\ռ{PK[`w}$3:Dcnsh=_{mh6~,ktH~D>ǫ@ (Pp>C_Z#xook귾Jxvz}j|emɻNO46o&7ֲe#_.`Dx7z&c92CtXWqѶşL> /(xJ|'3aBLmΉkv7~ef 2S#/fc|esܯ-9fV?@y8Wdu ?<[Ob77Iq=[;YMl&GBI;?n) 5("$nJ"3"QvϮNM_⛛k8,]܊GVw^9𿊍nOx0Y1<+S㇍_> šGKrzy70o@F~ >"j_ txGH^4o5kXb[LBJQ߃c^cfK<^$L.Azuy?m9Z> nh.ўYP#oMGH|Qa?񾗯Mc*1edݑ Qg ~,k~?T*PΠ6 1t Wҷew}'7vVnN}lI#)sr|[Goڗ:C^Ys$/̛,~i m|#}$C;Y]&MϦFӯȟ?eǟO^'X^(eki0#U~^1>"|ygks 2<.ȉ XSF.>F8|Dq2_|X  hFMGX-(̞pj|!|K +IfmmGHu;r[tW9A& cu{v?z'ft&m)4O#7&;*gbGWYG|c$:`c'\/x➕xcFԬo!E4^RTC~sOG| >}ώ> ^_Y&&fA܏.RP`܎}7d_,D"kxx ^+ RDVIN>^)ɺwKu?xW>eңN rb39ϩ6 kK)k>7_xu-5 ͛mbT9M[Ih$vUVR\C4o#b/l|fH6-jH@?k+kq>xO#dԧ-~Fȱ4z5)I\1_4R~ZGHmE4{ہo$鴯>Lz| 5_67i|-E/nc\oѐr߅|+DiLYE S'Q(.~>l]}Q]/J​j%Z^|~Hٿw$;_]7d ekKO޴z],fܒlsm9[?~#/Yíy #?]kӴ=c–*v%\ycOI;wF+ [29[o6VU[|d5m*j_xW6oh~owen5&{Wx/z焼>]xPEjSAbʏ,0*d=⾻4 xOmb﫭^0Qwƈ&u㨿h߈?5OW@дo.5t-$526(gA2!',4~ 4HWVGX 1b]|s~s&_y,a4vd_-ih {;-DR19;[#߁+왞95ItB] s[ԵYY㶑9+kOƿ]/Q֓IkfMysyyk-!ѹz}+xYnPxn{$U/l1S?n,^3}ͯY㺈D5UT~f`'=7ľ$|7Q$]bJ,m<9ÿJO~x>Փz.j]FiPIFӓ=gQcO_\/|T?ii[=.w 4Pc *>_dSᏏl~,G^g}@%S<³.O5Ӫш:X0{.Kz)|+u.^:Ds;6r[uu_4?jz/ĭVf8ic񅮋e㞁૙]oIRoR*B^ k=[e Mj܋Yo~?xzH4{puY.b7dA##ֹ+]7CZֶ<;O7IOEXW~0Opֺr#Qjvc^Khx^=)?2i69 nOz{GV3Aۦtk|kn 2#W/?Ƹ/q!]+2yV,jdDe̮qZznBK$r8'sqƾѵ/X WQҶ(Y!\{ouV#*.2<0ξ7:FԠ-uN3M!gY[EV"<1?20IL럇^;#zLVOj0){9t`dr qK 0} QI-US`E]^̏*S/S+9MC_קm&-*+KkmVNq_ԼM]XEʒW|M@$ V@|h@&7?ewa+p~ sqzs_:~ڟt {oKִ埈 xV-;N~xQ!M_v{MJPo5nw6QpKrr3I1>s`k4wl0qƿ6,m%hZ f~n m);go-xGh]]ii$p_4ksiY>] #slC(at 'v3#pudde#I$c_I67o7!ZςY\+'yg I N8&_>6_=x4cUH׵mMw,!F^ϣ4ū]:f ֒F;[/X%?+^zޑ$b9F_L/i;{eYGmrF5bN9:Wx:x3ZlC4pTJCd;<MJ}1XsZi4Z~l[12Pr;VOUUX2bXQvv1O㚷]|I麤0I7\` ~`@ErI85 w?ePZ@N[}"2VQ!<(>May?Schy39- }kR]ᯇFD쏏^yv^󘬱 /1^^? k~ ]ݧ;M?Hhw,[]<꺏d%~PM7d`BOGhd#L1y| e?ŽcOr.<yS,uV*FMf0So?e=NSgTݨKlL@J`(x RfT:"b#Fhokoඝ42xG^jpiMokl 2ħZ0Zh6<Ph > 1iI +tfgپL O?^83\׏4m]}NhLӸHP5{4ֵ F'UuMRW*F?wJyhW _Yn|?cÓw*&E i4h4|2BfƟ/?3|yiHิkUؤ+4?O%|U?m|wX],BAӛ.w8~%[UOBB&T;tHܮw[\>kRD.|ȭe׵_Oþ2 y8Dsk)|56E? Lf%ВNI;:G\ׅJh jbM*Nb帒z?hS1- 5hLMbA-y'io xŚ·h*:펧4vwޯ({;?6N?|kׂk3T"GϳKr蛁;ӛ/\ٟ|wxoM_{5SGM&CJk+< $ kO_kKJW lԃJC=DtZ m2,m{Ɖxz7R'~ٹYA;G/7/v2;G3tLJ-KmkoGxT&7ḸJ7WEob~E_OcZZ)OºH^&*;τg7KmZEdfGU ߧ~Eni?3Ծ[[+tza53[[k2 ,:Ij"Ѭ;vD6q,ϴ6:U'O5^#k^4C=cf3žqbGgCi EO1Fu[;=MHbw:z>ci;Qzד|?4?kzZk?dд/o#;|jz^1?l|!ͫk:g.җKii$`.hj \C7ky}acaa4DN񋢿b@Hج-&JG?_+D|M⟏>𿀼AԼ.jtYOh֑-P"?2#O~FNQG׏ ğfxO/fDiR7Fv8(jMk>Z=_wf. 04vfݹC Py@mo|mB>ľ3Դ h1im_F|3YLv6hV~:Ljo-MkgjmWՎ,}!M(%vo.2_^Imw.zCOW'Oksx?kᦶo>gh]ΉT7\x5 Ѧ ԴY/n -"ߜc|ǵur#t )Ixg;_\i>%Sqlc-[}O #l?oÏ \6aA{5WsIݹoP4<'C]k_6 ^)v{!q֟J%x /~!zׇ3qp(&_-2uaRwq'ʈ=鴧IV@қN=)*IN]k_R[zg2K,< $z3.I=ɮT \)=<^#^>j=i$h{z#l!~΄{ZMƑ/tyttVix%c#jF>g># >[h #򏆟~Y. zO/+2 Gp95/HyydfQz 7+Xu=&]ީ*ٕ=}i G[}?Oг,6pH  'V]7 atEp+ ?qT * Ϧ^i5;Y`HĀpKy<;emn2{'-C}k7ĖWyUaЏj,xH܁v1ݎՌg ׼-x4hDIj6Q\yyw8_xi4a/Upӆĝ7{vߗ !LM@d;+7Ѿ~!N 5[36]{S&OSiMybCm5ZiGKFao6Dav)xYtjcXk ܽ$PHh;ǀrMNzE3_[!TH >meo<2ۊB睹%o{;K{;}'m ƛٷ3a@$Z+n8S|lQ@.t=2ZKk\4֑#)$S;czo m))|ݟߌ*xprcPU]8@ ֱuo 7o%Y.>f\d[Y(Q1 &ѿ>jg|Jn4?hCesv=eykJ-;Q4mCO%äѿ*{Cy階42K ,'¯26;qP[WCl ,.@XİpuJ(SK4 +3O,b$kcnĄ@'E ǚK3_oM lRvS>Ƽ?~z|$YHk3,D |va_~v#OQژR>?—0 7")uoj7]xz|I̩qZF;FWJ\ 24v'b~!J>ҶiL{j OZ$>H44e[gK%% =Ѿ |Vдn%].fwBY QkǾ|a>r^ oP/u et7Waewgm*@o:~žokZ;jW_B$ߖBHg {P|d)C_S&u$"x3]ivtޥ@=N~AFќU|B|4]5O.6%%9'\ vZzïuxMO kԭX."drw>1ף]M4mq'HXd/ݫz dСowƍi6GMb^@9IOҀ)B:"aps~cxdWZZ{QG*ou`|؏qٚEn2~^|o>~/1dj>Եm=(F *(I88@S qR=)ceSþ!>GSU,[']{HrO˞}Ws>x¶EWl 3lEX wخ:>WPլt{}ojϴHq>Xߊ'Ҿ"YAZj yiVVO'yŸp7_` 6㋍ju6~c9]O&kLWtݲ򏌿 uS 6+c>)0]6QyXۀۃ^c~Nqæ)& {R %$lR9^oJ=oՇOx9͓kȹʗaַ ~ i77: ְm܌ҕxdeځr>}3iwլ7Vo/Γ $+MtOwO|{/#"y %]BQY ,~e8#X?gi?'Ѯ" bIe%<}}Yi??; $j:čRፏ`>\xnI&7ڲ,]6︠'81٧QI&\GKE )#.Sv28{,q>RR)wO4_§) lj姏V9XL}>H q#:!ʊצ~?ZZvΓ?z=?kwI {k̻puo⏈>;|Ak g!jw |Lq]ı&ԆDZvɝ'6ʃ /1qA6>}_*_O{w*vbC":h7#-ΣC3O$/@[ _Qլtپ|/> */~hD K-JSSNcU?FkMɲz) V#= > =o 1c'r+:_~x2Zu,2^v{v%a*ro[~7- xZy%xk)\t ᧅuMMKX x; 0FrsΈt3isм:v(pM5^d"1_m7櫡\J\zޭ% ",a%APsea,1b|#|Mqoc+KkCj[j,wG@1=3^ n]s:ĶMHOpw) otu֣_ķVM\BX읹zG?3Y|$|=Z|9MvRGwLF8;I] <7_i:>7Leݍۈ_IGZx#Ol ]#CnkCkb ?2P: Oqkص=noUdc'1=;oؿ5B_֬\Y@vMs9uS4,OrM~żnޡc}V92x'{}=?ie5VU. gUK)b9U3? m/R 6:k B59Uqtj~{em3`EO|A|a#^$<7j7ߝ7V9D h)ܞkUk^&FZiģRgOn`2—K*@}N~gNOkͧonulAwG,6Y7𕇃𥯅x|-)&M%l.0 !$$z/"VO5}!ӯC·ţޣx&W^#,F8Jno>6a K+l`]Ml,{P>?^5=GPӼa\G q;`϶F >!-|y#]ݧjןODY %'pC9WZk^ !w.5lAu)rFXly3?W[ng"%T\>Bq}~4/V%M`oM(Prz߀:,o~+>ßo4[BXnn/qi$-' i|1cbHTI2Vt '=DR:OM1T9_f &o^(Z-- \Gi2E<A|#x%Ox]֠?ɮN!xk㴞RBgog$SKo hXo% s~c\fWwo:Μp̣cU@-]㋋OLmJQo [}Xc#]Gi-<}OUJk YW~ Ao<3\R y;7c++]:mm 00`*"lyAi_MC:2GsP ך/>-~%dq;#"&m<|Bu߇/glG`C}##ֶ| ;O 4zfhvBqԔϚ$|@6$i{I8M\NHk앑czzW~ |=oyPWF񆓠v}KM-%6Qolm:_OCx饫J#9u}:{4- u5U4ZM{xG̉/|'m*x-5X4/g“M*8V~ue*3^=WZy tee4>RLHrz|ڼO3>m/?+xuKkijwW=uBx.➣;kO5{;ki{c 9}o(B~=5/KEa4> }iM{MbU٢\8wW{þ-{TYh6 sn5eՑʕDmNp6MϨt> E7xsPסwWm8eGN䫇A}cu^xÖmt~D1.W ߨx?XM CcMUдdS|~Өyj\8:=_GÏ ?kV_ 亵ᵾ{M,rmB9cY ~u]cY5h,b{GR_b}s:sӚR WwBx?Ւ-u;MEeDp"msE}(a#9|}M1n w$\{Εq|W6Q-S?x]I^$R{p?qNiZimZ[]ܤNk7@7W^#֖5{;}֮qyҺr>/M3Veʹ L.*}?Z^V<>/PqYk["G'Z!״}XsFծl4 싮$WbOdޯC!-*8ގ<7tZ~5;!N+EYm1qu,l@rSO<'kbNN<׸fݷtMw3;o- _X$*p9ns,F=KᇵuAM!{lI>3_&ɿcտIz*AZ$ZTy{ǯEzz ̗Al{2{d3mc|"Rm =fEOV<ȻWq1^KkOxx6Izw0ÞUz8?|KïߵWï_BO1q}F-d>.?VesqoM)PWB=Ax/mBL- -ʒ9C& Q_Ih؛lV.-Ri˯xKq{EԮ/# ;VԿ__!|Zׂ?k/ĿPiyt)uhm5 oF\=/};?o6tfH{YЋi,6q:YįyCmSn/k66ǿ~'̼=kz|5 j~)j7~!nlG1Ͷͳzv.ޛ_~xB/w7e]Bb׳۲)M"O}{Z~lYVTh#0~m¦\oŏFI|CdSB6Wi?Gስ!zIIdKg$U`<#x?x;7-vy>&е:{^隌70Zb=~$xk]5Zhz|m5;==dV&d1:+~S' G x/_]CN&g5W16iJTXnusnK~i$u&NԒdKgEk:>#>xjŚ׉!y7#9N9灼eTxF<=V\aK.#!D{G=+~Yh > ;nz7m.u]ܭu<מV"27#TM[:jŚe1n5(cs&0 xGD><-۵,vf|o4O>RY_Z?_Xd`~"+*ܨD+{g|+_hF֢M/t\FH\PPfb\ o5_+&&1}}k>5Z<1kӾKZ%B59à~ucß{G\̟_:.*x[/mn]ҵxH 7Chণw5m=p4V%7 sM.mlz#{IM.279gAW?Z;𾭡kdI;H>w*6?+O㨼m?᧋rvoĎ~ ˀ!~ 3`$}qz-V+E$Q{c=9z+;]?-IJЯd*BUd?Ҿ|eA74j[ JӣH2ʒef)^xP}NDK>>-I1 Ɬ6:]^%2Ү#pN\쩯^)j_xz繛/$cԖ$$cް{c5[Vv&/\ `K 3mɮ lO[hC#2o?Jj|IU,zJ웺=i<z >(Q \e--Y ğ3>[>|-kvX%Q_Zo,jw2`1I$HQ\֫]OW VY HT_|V?mHm Yҵ(̖4d(yh ;1VDtq*D7ryLs++(VQ@AU.?Rͽ쮮?qjIV+ڧ6j7ZU _ΉWM =\LiGFqp.Sm4}?O̵Ӭ?GVW;ar]%ݗ4okҦ%GUi֏59 Xڜ^#u2;][<3\?|VsŊk>-n%K?LOmH6? G:Z{Ws?M^mąqwZ>gTFּ_mGܾ﹵w=k`/{F@? oMm4"ZVխo]xHpMs7Hit5)Eڬ %+7[66Vԭ.ukJ}ڎ= k4:xJ짨-րŀG,z+8樱ivd 87JC#T,W  ֪]V:m֝ku/$~/!j~.o͉4>[֯.Z10^<%zKM:_VWxgr*xYg86O%Y oᯂu;GI𥽦`U=4ˀSៈ4/ w}7)Es..b2R!8Ito@N;GmL[L|*״0^R?_"63$k7H7|XL*k)O?dztfwυCj wu"\$YS,GoR8~cpr?f|RoXqxY>i?| e:/ ^yJ>A^Bk7'#jg/>λ/6FS3K,H:+$`Q1^Y_ I(Q"l~\Ն;nm4oUG>jo xC254ԯ&/VOq'Yp*%9f|Qa%EP߰4Eoe*f(߰,E_oIo"7P*f(ް,E_oIo"7MP*(߰,E_oIo"7MP*(߰4E_oIo"7MP*(߰4E_oIo"/P x4?rE.*\$|{WT 5 wQVwZs=Qw u ٧KiQ;1yM+>)΅zdZivkmgoda**p n&DԡG2Ik$jNK'$cϟcg@% ş KM,U![WIXds4!,a8+n$ɼ*zyUzϘmk?{DzjY0w +?]Ǽo❂?Vn v26pv'y=8k=u_Y y:\gf^6k<7u{yf$s29#SOƏQnx;š.ZhZ2=DA[I I!F2^ _z. N{kh(h"[>H<$Wٞ.Ǘ=ω< rGK%ugb3dO[ <+b7i7v$ac<$/x sþ,oogeV/ FQ@#xh|ka~-_j?[MѴrjʣ|qھs jw}Mp3CiLxk[0_e7:X>Ü}(J¿<=#byB/z|suPWW;t:ͭg?}OҼ]xz}{NcsxWPɳGٿlO ){no{O0F͵iso>E%*I<e\c6?zk~c麘ɨoXa^G?#k|>?h] M+Kmogh( o!ls 7FNH~S?kJuOW5Vki-j֩8#jq^_w|ci6xojlfx3夊U8 xsWj/e.i ckM L* sWrlw~o5F5+<9sup<5Zȹ[ivrκcHKߦ""!_ȻPQ7zE:o4>$\aŷVi<:-\>Ǎ?n]CO,.!AI$G ϭ)Y{[QMt_5I:Gk@w`X+7?;Vƣ.mmĞ;𯅴[u.ldxdVD0*e,~wsbX^I;R>9τ5 i^tk?`UnxL9|`ޝo]uB qDKO2ЕG2N\H+apd?~|)Ş0)77𬺇Gn.5wc1J>?M/^%w<?OHҾ!ä]_O52\np@K8xR ^X*&>;o&Q7'>u٧Wt[[߇ot[t[0k'dI=v~֕Oд-:ELV65Y'#jQi:bۋĸvsYF~"OT'uYxƑi$^Mjn|ŗE`\]q5'#g~!7o.K=A즾W,*Hx{i? kwLejnҼ=$҉ZR'Rd5y6Zg4qAuZAe$qE701"WC#J_1QyMCNjuQ GR759zRҔu S_0|ƭj̿ᧆ5/xwD.՝z0CHܒ*$QK:wn }'#64,lVUxZ:<5x{S꺋6WWV UW<}W={xtooμ]4]oN|K#ړi֭qC2xʺ oz<9x}2 ;ۍ%Sd)r#84֥\1:_1:?O# k!k|J|0t>m4Hmi@cfGŦ,Kۋ)%c o\\DŽ&thaI@;Qyh|j%<) ЭF,07<{{xuxwE߇5{9/ 8r%fB7rjx|YiC/cXE|A䠶ILjv.T5MdiXm@A2Iwş}cq_ּIcnD|H|2`W57+ҮYt,2]+~G Z 7kZf-x߉k=+ڇ-MbsUA ;:aI;}k_jg<5xK]te?gnI z zo޵B?o6ךkY#UU|R,Z,vs74W$aQ9yOk]x_dҽ.#Rǖ_1( Amk_,ekZf-Z--hь 7"=@Z 7khֿY_;ZTnPֵBZ?o2ֆ迕Tг{vk 㵡z/F?*gm_,msYS_OړkH>ZM-=兇qjڳ_GU/UmIh3̊Y#Aq[Y<hCOyuuO_8P|;.5%:}Zna`O4Sf6>ĿU ~/4'uVg(m̈lnNx譓}miz5 22tS'oohMC?w0[[P~1;9kį~W> {/öWխnd2Ur 鷩9B>soq?7c|VN HkK^~+a?&ιP&!6mw[21N\.pVY[[VR~(Rb#oT`pQV6w7M/,lksx^ٽ[›Sd=?JY'J`CFZt>?yJ4G4&W_Wo/Co ],mmlcU>$`[M}/Ě ^x (ҭqs(8C7,dx??&P4$~L_ZЫo+oW׾GڮyeM;Z|'km qE.4>Ͼ.SҥZOso7ckQG,sɩAz?:y.=|C> g/v+oٜÿƯڷQM+:n֭{Ը6&YP/?^Eg LK.M̑f\SPJ73ixĻ}oAۖ-53T.cEi79%P67<=/>Z_$>"ծJ8/A@sP QCg#s`-L`H]G)"GS@;?Uє@jiVM݅Q.f9}IY7_:xk^1Xѧxn?2.s|C#ex; 4/>96ebLn >Xwm#пe_-SK"K_w]c4Юv1OOɔFC'뉤%xjSMFXn.#767wzo/5kTz5ٶDGg)J/]FGO&rȕ> :ղ|AsۏL kaۏLGk _L񏋴 gmAf9 UQBڸ,{WR__o,&xto^V7R[ڽZ3dKo:D9QNkص?OjsZygŸZ~ aֵ%v-$F?!^n?gjh %Ɛo{]Z;5Ø)Dd gpcw>ϊ_|cC_[_ç4Z-8Y\ YBdˎ9$=OjL 6LR_~̾:d3j^9Ѽ_Gys*Cx,9{Kw硫>>|o[񞳮6ᙼC}!# g aB"!'g}Cߠ:~T?AS`>a_~4OxO :OuܳԷ1g@cA=*_P~3+|<4KXo?G"H";ھ$O N>Y6lϙۏƾ,H #џo{c9t)d~J{PVI|E^Oi$_>+06&<7 {0GlzQwzG?g/_~jz Ú^&}-OnnhW<$rr+"u |5ž*_xѭF5WWyxB1@ _s=}ik6 }RMQ6>87 ?9};MfZ_,f7'3BE>VOaVhLJ,! xm _ mHYDZ~+z-֡$7:mv@Wr8=Czth?IJ/{tR'|C٘~Owt=5_/Ě^vIoc[K;( [y: }?Os}KotvG[|d$=K*%\>ڡ 1_$|iQ/41\XɊ`M39ȯv6~.=c}iZ0ɠ09?TŔ wP]QA!xS1k.hݣ.}3>4's4}?O>>hMdw4&7hOx?G<] wN)ݖ6#q؊1 i_ nuǷ5otzy4 AEc2MixGk^ڳOYM0fs<Ҟ@Q@_CZペȱ8wY}|I^}=omJJEuXIPAko?᪵Ag|KtuO[ľwEn(,roFG|##8Γxf|G+#+㋽NXdյ w8]~:s^x#Gc|C ∵vEZC8eDtWS t֯u SK_O%bpMpx7w?>k3Hо OűI`}WI)ζYDV#iLn'V!-|;x־vl!kx8IqGS'&Iw7h'mwYr [ Xvq=jO߳k׺'C&ꗚĞ6g$0|8`!OF=54z{i]_y:Ҩ?:jol-|Ekp`.Pw>tn ,?/.>oŠ_A#={?.4%.+WO>V4<1'?͓"=OITI4POAyϱc*o ^ZhV6v'~Oy5-u@[5jsw{[x=ngxw:4_ jQ6ip3Տst˾okdwI4ZLG&Wu`xz~$x3x{EVe n$>q<SY֩rH%MW[ sc>)qIz\[D>j-WE=_OwGd>OJZ_)Yq~^u` մ)4[/JilM$"nymމ+'''9e"P1oXk챯~ن įk5ƛg6*cM|g|o/ޟ /FQ>MBfL7!u{'Ë_la?xֱmf)qm" H]]B__]G/.?Ĥ_Dt H,Yt&γyV7Zx+M}vϩ??EQ>? >? GP_._.Q@>ϩ??_[}~3(,gO_.WƗlq+pY3U"b@x)(/KmKAa7H?KMcR;F&DFv}{PEYWq#9`0+blOT}=;}֫ ̼ @EŞ!$~+{o ۽{7djj3I+ޝ-<7j6kL͉~mw x ƚK6\h$.S;Jy%ǻ LӼkzURr{$6?<%wω:֡Zi-Jd ~OwNsi^'yrIEz%N̍dFWeNTsp'* h.佺5'*FX2Ȫqq^R7cvF3^o3ƺNm2[iWl)yӦp|N 85_u_kq>FC챎 ~B;r$z3\|#a}KV֖MWPD7BZ; \_ou%|5j1}+9q;r#o?46^hWG^TT{GGUwsơF|;0_q|lؙ]/ZE ޲?u޲[蝿WZxǏ>|I xOvK5(˵P9 82s^ǖxSڛ}@[yf57Ya_Y["o-%Xt붶]>׹Ł~a.r#>Լ \>oIh<ҤN!0lT m¬[?*Ӂ֔*sހ8_șy3G>x-fKq jjRLZ3ϱoș6яV#h:y n&O;/_c?i<+gܫv[kUPn1 uGj|QW~|=ԞX1ی=Cer>w jTh?csqqٺkp "dm9h _ |?_xo&}yx=J+k}& T_fN@5lY_3mvXYj:|yTV.qg5';o 7GÆ^I6-L6ѳjOQ#E >o3@9L0GռERtcine]79~p3ŗtx_NJע{?OyVGks<S]&Ikb5b#|!|ŏ'k "OD%OU#)ifGsJ]Pv͎I|mxh00Y^K3w2EOg{4+ &?]osUKZxwRբ{ĹӼ >J )¶> uMn1kY"]63F: ~uTizxoSu+;no Mlg Y1OLe|5k+2sxkɽ)?|e:O 6to|KE<ȱ3Lp"+c뎿'p,uO<ٳ$۟oOj_%x9[YkrH?+gKW? 4מ sMD%-m<Fy4gz@~TmPH#zި"q]n{!ءT}ua?VGY:ޟ"sPY >/Zhox?Lӭt?{.[kqBβ4^uͻlTrɻo^}yw~>LIMoId;z_4?i}:ZtOŸTzRRQEU*ީIT((QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEawjRHVԀf?Ϛޝڢ+6zׇ-wIk%[ffVq}+ w~^}o^/?Gi~xFt~Yip^*k]—KcvΙkv6S?k>ӿ[?Jج};>"앱Ve}5VY+=KS.ki\CjWfm03PYF}(#?a^9?7՝ itc?~Rz@ W7oM xD׵QlKU8@@8?izhwjdg1n7?h/ A:+-,[4~ۚP}O^I{NxK?MN; KvSx}G 5HxsE//SHu* ,3wm)1d.XtP{Q\,?>?VX[ vٮY<8ׂ*@C:wOpbt=Ҁ:޴wR6$\9 k4>(] t*khVKD7 qbtpq}g;̟ 6JNk:oaҋ[Y LS=}6 "8y2׏4EsMau{h:C%wOGb:9DRO]Z!si7}c"ni?E;oq1|Qk}OjA&9{;u)7HTco5fo ѮEڥRtޝysӿkEޜ|}cZΑX~_Zv -- 떽iowʒ#ltׇ6~D$;MKwe1tg :ҽmo4 ,V>!J{^¨!#-ozzJw5ܓ|<^fK$q}?nջj_]mݽzHzZ`v8ax~{GxZtn.od؞sxYt^EBڜ;V6vL 1>sA|7Ϥ/Gu( V6 ܁jvG!M{T27+HN# gQ\h? O_=+YTID'M2IF"hyԊ6?5YG{Y[L,o$H4r'ϿJu\7<&wj|GgH!GW<>$ (W=d'o4Y̖Y.d>5ljsi̿P5ȴoiP5";[gC>bwZ.ڬN򯟛zu? ѼSwj=v>>ミGVR+b0? kE:> kl`Zտ:Mr1Z8 ZB:mBݮ?<n7VJxV'mmn N$7g^'9'>97sAȴ rߘ?߆?F_↭{H499nu<[DȳpO_eL|+)_EG[дqmߞdY5މxWΐh2̏krM''?Zyj,>cb?>ƏcV}o<4X9|QϷ?>Ƌ11[?G}`1F+c>yhϷ,>(lg?|?E>yhso<4g?|cb?>ƏcV}o<4X9|QϷ?>Ƌ11[?G}`1F+c>yhϷ,>(lg?|?E>yhso<4g?|`1F+_44X9_^Y џ\<"$dN[OCz??AX4r1G%!s(98@Sq{f鵑GК:oM*$\OxC' S_0k IŲ˨I UX`mc/a t]a>* {m>O)n൉DYkWf!v/"t,sNya+\?>?]jz7]/=kkkRf~mP=*狼=9?M/X_x[Ö͵yfgIb:m( e{nE#0lE"OugsG= k^Ѵ=+T ]I/ &"p~MEx{BxmwWe(%FUYx"uiW,$us{uK0do33S)x Z|OcĚq{BԒ[bK65 D@PzD}n=6K}Q}8Sڇ򯠼7}3os"?|5xS}R/uu->k&tu!sDHXV0X%)T~7<ܧ>l?hoh7<=vhv֍u<}3H&Ҩe)Eeӯ(8ļ&Xjr0VS >^-kV=7VZӵ& I⼹x>cs\ygYP$ާ""kY!o5+'"tm#U'o܏ ZbG<(t`Rnw<WO]<!8sϯ)TD_N?V3uG.Z|c@M-^0P&EZF_GQWͿ{տ o-SPv?$マ i.O~}>Ě9Kk&ߵz`|_1_,/öZ+ iF)cF#9 /ow?,ֽ_d7iuվUdLmN:6B~B&FD ENxW&D>Z9rѮ13}l-|;gq )#$QWWRլG%ޛXۥAM3m<~OZ⃟ jiskKޤFcWROifZSh(!t={UgN|úx[u V.l#&yg 0⻏9ug47Wqݛ(G>oG__P.E/ibh)oo"V$gEn.ezyc kߵ? j n4mBM;} E(MCt WОdVV<⚾b_5NHFD|[i6JxF.~eil.Zf.C:gި%ǿ}[MDuwkFu\HG6J_O|AcϊNKKJ b`)uL,ۤbNIߧfT~ K|`\\xUյ ZVO%+m„8_mR$ןxLS[ό{q_ͩijZݵӐ2C,~^D9O_|*.)v, #NN44}y}SÞ/|)}K]cS.%#]fǮ3gΛ,k= 6:^ꖺ6J"mdW#v˶:'i8U h;Z5K NM[KᶚkQƈܨ'sWCxQ#['~2-htkYP0][ z&z/6Ҿ xB욟, ծJҰLB HB@|ӠmmBPͧm Kjoam>͜q%O_[kf-V]XMb$H>o>X>X|B^U<.&|3߭O$)A.3?{}~wЛoڏeZfUwđ?o&}½nƹ}zZ݈I6ɩ3t<%uP6{>[6 -!@!Rb1@yn i6Jh<*OΓQ?oʎ(SsKϵ;Q@ ړ~{P(ǷG){~TqP(Gߕ7j9j6jo>ANڀ(SU~}'O=:8(E}E3Ҥ?ZfHT&>Ptg'EGF)Gߕ3F =~4yUzyUzħ E%깦HH|QB<4@|%9mo>ͳKcP.eeipHBG JmL_~4oس.jOmm-->u-cHO7)kO|+hxU΋+$M$Bge1߅8dƚ5 zxSPŸ18f>, 2"]ȼ?OOYe/Qk?"A'y|C7Vjڟ5Ft2.Y=}H,{q20'$s97Jojڔ.lޜ۠byA''jE ޼+ƅk:xk\m.$'ٽ׺E|1}RQjڎsg_k+ORJe.S10yOOŖz"xSKfHdgGpVZu(5}S'&cJ|t+J>i˘usgxD-ݧmLZuVI3Pі#8xK $v]O>E/9V7tU?Uյ SOuKN~,9V"v\F=Y^h:ȳ.!|@q?:xR"dNZ>턞qV8QI<->Cv9Ϡ+^?>xMBXi}Eb;+{4$sj/g!Լ3/ߵ槬Zi7>݈{IPdnPY|3h6W~z,#ouu\tMr^oq{$i'C-U_O)Q6&Y?ޯ2wǭ_t&?SAҚw}qrQw%|{M:]4W? \GΦ;s8< 4>hfWHy zP,Lr# _Ώfoz$dӴ.b6nkŹw*`G_xh{KRh<$D̘`^)P* Ҵ۫).euTA_+CQ?4j q,o7z7%bs| f |.| U=B<\ݵiK7$|?Uhnp 9J>]+JE hz&hN28?(s}'TZ~*|c~%tڀd/5_,#;/Byxx&Q&D[Dz"i _|;|Ӆ4Qy]mGS*@!6+n ?]GWֵwyd-3@PHEq&=#5tMmcɭI n6)áq?0ixIP2F* =RG)~}T~#/^6Ѽq_F]z[ll%) n Rl~Ⱦ"._iVŤcQgṛoL.}A5\xR wvyfd68zh7 'o_%:-|-wYq 7̉,ϱ7?M^8=Aoˏ\HtmB[G+t][>n-Yo]a {?LAY{T~ji~*ּ/Fml'>7q5Yx3Z7MӤrEq Xߔt~ּ|jxOѦY ]ݳ?_P|_jZE[p|%2tME:d6wiX,sB+b5./d+^ɤq*we|}}z?~J_ -'њE()Q@QL(((Pb((((1F)h(`QKE&)hQ@Q@QH((HzQAP7oI@7X#TDkþ5.%z/`V|Zݬ̖+*66NksF<o~4h!<%hm[P#"~DogӷjៃWAuZo+g#e߯߮q'oFޘTy@;W?Mw@Ҵ-KDžg=jM/|Ys>֯"5 b?#P}bDQ$a"HQ?_iz=kX鷺gHoߟ֤pZo_NT:2~]s|=_Kew\PI/wD[S*R#*$L}-ZZW,K7(dޟWv:W?@֮SVм;ޕs#@:.j pN<޶Pպ^ۻ[<$y q޷kX:爴7N:bgur dI ؟?YY/?i_=R^ޣL˄|3ɴ?ٳ|Ki=3ᎫkCuZ<`_ TO5D8mgx޽GNh>һp T$lKT#E14".%DdctOj_ WF@h< BP<"VM6;D¬0e#ǃCaɦC㤛o$uootYk$AXke[j67ps$̯>P#? R=KuJ0^jzd3N~dtH39Aiqli y@)f=qE W=|?罸xwcG5}cŚMnYOsִRiuiӏ4_Ӿ]Mn77L]-pO?tƺ5ί\{'9LZS8{#T'戵ɦx@>yso]$I7[Չ}6ivnt&g߬<Bߌʧ:֩u[KP>`7~<]_(5/yd}q[=C▿.⿆z֫$hy6qS+`ޟ7z_#z⩇L)?׻fd?V# Zii&ly`cA<0 WP:`Wklsvw$%-{rj GAwg {GUh@qK5)}Y$.MX4:<鮮_jFsmt~5۟ʾ1H&2~E/6(z\om9=CRp|_bwR^ c)E_n8M-CQx?^ c)E_m9O-CQxأr:3C"?Acݶ93C|!?pzt=ʼ'ojbm8K=CQp(~??3#|)]vh]>ft=CPm߃_>ѿ1N{-xO7%)? /1Eǻ旭xG63|"? of)].m%Poojb|f' P 7O?wQ# Pp|_jb^ cE?> /1JRf' Pp|ojbu 1C"??oZt=m 1C"?7w PǼF>?q:2P]?.O5C!?'6e(@}E.O7C!?2P]?ׂ{n|_b4<}+])N޻t=C]g/uwo/[k76qn-r4jN7U?:=/zGz1翍>:kgĶoM27N9_C^ěkϼAB7 xR^Ŷ\e6Nf|!C˛j/-<wl6/ex:BS'bmu=֙So04O'm&mNh\I[ R qsoOKOi$.Ipn<# 4.'#GUR|O+xc^&xÚ\:]|E5ڌQG$4ɜz2N –>1o+.YYMo[ Q&y?v>G;n0k_mQv5;ֵ=)m-\łk)ex=szݮoMmbfe[陜p[&O؟gpAѼ5G+K c"2E䓆vHO:xO7oW 7MIKuonf>1UO=85]MK>jt jskE@Iz.?gQ𯏼5qsɦ _̻O0;,Epv_ o3 jq}rAJռ![}-aT\:2/kl?cxt5mGŷsJm! H~l tPX~Y)u2RV7wl| }x.lbhPO:ctg[IM[N]xί x 3C),NXd[Iŕ{6 4oK+i1tVQO w2ֵkR|yyuoi鷫3jc>`<7xG8>,|BѼG]x`PX[}VPy 2.&-#tO3h;?yg^ Ɵ/ |yIMisţ!w{K]nxzq=ݿV4AүZBiSz#2N6'<% Ě>g\ڝh)D2xwegSkkf͛6k GuڃxBm"fI'tc~#7>h7AxW46oast̒E"H607}3X~-sniYhl 8`Y嶰?w |;~lWz\>"FVUn#zW~Gsľ9 qirnuWH䴖@|sjmcRƟ^7PI7-$JOy|Gsozk]9\}; ?Տ~ʾo%񦱩xEEԵkZ7+lUyOu61c8𜶚׋kO 9}Mn1!T9xn-2Ok_xR=ķZF?__JrFðȯtl氖\.-˓Wj.u_>* 7gK%NIU³ vǷ[-fd6ny c{yz_dSҾ,O~2=YtC{',<$;b;uzo~:OoOjzsj=={yv*rIraWӏ1N'UN&s ZE{$/b~f $:b?:_h Ʀ]_F qiVS}ԏ(Vl+_ X[.nʽMH#Oy O~:f?W5# ,I+H`}w4/Ğ=~mι9%m^OZK=u_K4/iUŚGOtH /  ^#iaMrW3$M~I>mkd]_ פ\x:@U8T ǜxK_~Ӿ$ojF-ui\djXlzu?Yi?弫yΗK`ydݻ'>?>-I] P~,,Vu"3ҖhwO|V13 Z{-6v~yxs cinm?m^yM\?arj%WʿRYv~6S%"O.̍?/=)i|V7F}+c^cs~tϵ|7ړIS ?h?4}|7ړKP6~hAo%jJA汾Ԕ}(g援RQ ;kfK{{>K)4y.%GByx7*A>g~Q44Ktj:D6x5ռs/߇H9I@j|>7xsnIs.ܬ'V[#X]==F[.hǿ>_a7~7<㯉|u>ԼJ}251L>%EErG5fkRº1JQ'=(| .mu6GxOmΠ̡"YQ eqZjVZ:e擩Xkl4飹i~frB >.|a:l+l||!mSVԓMH;ϳcbRi;>.|~#zCÚEeG<{)#y#A('>^A=ԈxiGcuOKtMB;-KDFNRNyGJrPi<ߊ!5oĺ^Mmk6ZE}s$b k1iڷmxHo xSaa:TTmWWp gh^"l?l&3E74|ȼoe%7:dwF~tvx}~㧇>"ym/Qjj)OUtGVo~ k=w)^oii#};1uo m 魌>x>h_,6ydQzv8~oI+r4h~յ;cl 2[4rB6?"9CHQ mW:lfk^46g,\}|CpW9L>ס4:F4[tu}:kXfy=?&>%|1v>V;=׆-gDý2r"qz_CX^}w:߆&~$Qͩ\mex0Pr7>"x˛,o|+\xhmy|.opvM.PF.ڲDf&r[^?ݻó~[h7nЋSΛ?whퟍKw֟m&T<^@nܟ6upx:x>NEx}cXO]+˕lE3cG(#-wUӢgWҦ Q:etWZӶc5ɷb>οWG%ՖK??fjzV[64]}Mi|K|OѼKյŬ*\ 2yhk7Xo,tMcPoff-?-Mh/ZXO=l}G{[? LJ-7Ş 4fYGڴmCK'6z֗^l͂\DOq=)t=GǚͶD繺?z?VNoiھ6vZtwKfR?Jԯ0nc.9I\X(ze xDiNu[ "K0Q󭱃#{'rό&QOFϗ#|Ϸ7324d?ٯ_f7XR +1U1vʁKZTK_J|QyUc=*|IPC-jX *q)+-#Iu[} 6>"jQ"jcк5U5iKxKPu6)J:o}7py Rc$ < T 犼 xO.a=#x'-?~oM4HoM`m1YV6`8G]yE|=ph+vƿ|>{o)\, ;X=H*ůF^u~̺{`RKwFiLm9Q!D0E/zWsྃyiwjr,b%Ei%swH_NJOGҵICMxn7 BvȎu֎R.zEHX؏\S1+,dq!5xCmM_\,BYԡ7 XofMqU"OAG|IF=H_xPд]]^Wax_vMzO : fi˹t؈X?ҶK/Pі tI?M?"D/RgφV8x@ n uqoeuA#ȋ}') Γmq 7O֟Na\Oj&^\nn2zNaJ8Hޥ]%g' ʊX7u5gfG(5gG('z>x5mjI~9ٞE OC!_)^9?|UO_~|D'x^x#ݫ6ff6mWW?gӼc5Y{Ym@kEU3x NNR>I{k i֑=ݵM мΐP1PgVD!? ڍ|//)Զ15cG~133:W:nc7^-KU.<3&T4R-[3FOxV}4۝SC/oGaYIQr $Hs-@2j>ھjw߳Ous>ѭ4$Xc}12# =HhK}Ὴ=>-o^]^%|d sJA^Ҿ}?o|E|EgHh*$?KqNQ¶pHcjz%΃OGxZD"#)"xD}~A\o{qK_=Ǻ owsL [H2sW3O\U=Z+⿈>=Ou)侁n~K1qvOvv˶1ԃ{3O?iOڍ|3 Yx:ZK.M } _PX]{oug=y$:}ѵ+zd:Zj|ܥ훙|)#fDU 5a0"?da/i؉woWU5McNRӬd'}OX)&k 5<tdJ m?b<P>_@sN)+]kObcC'=>kC$?_Zh^W}l%b|[t/9ҎP?)SMi?ZtcGբ}E7q-YҼMAiZNα[:<$[YbOxz|3գs-#|dX YsjHxCBG4(ڣT~3&߆>_HdߍmᎯ3'g$z}M 9C?oƹѾO/DWyz1ՈO`?~W|KzQ iM2t;\=$_gJO(G(skbODZkRݣ9OdM5.dM5.VѴv9OdM5.dM5.VѴv?)?ᓾ64ֿ8c_$MW}~m1HJOᧃW+/ gmrLqByR+9t]{T_ 5iejiʲg=~hic~Ǟ% ^|UiquZ,Ï5 6π~<W&m#YyfLg*`b\wZ4|=6hڍ͕(6\\΍+»zH'oPWs:ߊoh&,]Bi ZbG s Cnxt̚d}O3P3?$᥇~h`\=2N NvŵTp N>^뚟KQxk[>٣[\$ٸ8Tmg VGu f*B7"ǩ*ӃҼ~AomP j,~_.bɿcկHEՌ*L5MI7& wR4y\y/W%&R!fϓ@<#>ho|Ӵ#ƿx 14ȃ-#`v\7'4q7N|Tc h~"wWi+gCm7l1H=۪u A.gVYBbyyK w2\E-̃p7?{_ι<;-KKZ^o11f0["q gkNhWşgZ׎<}hiÕ>mw$ȕn<đcc7;ݲGq]\Ag]ty>NcfuG`eWca^ޣM|u |i kt˨ *PKܪzpJYkeԴm[m@)2Osҽ>}|aqZ xVTb'|"؄lH~ك~~3|WlY3!'?hI=|$E"-V|O]K6ɷHzp [IK@zSW#WŭWlv%\._Vta)S91XZxKJWXx}*hoỺw?G91qu+2q'݈zx"{ş6ڝ7JӋw'\qoGO#h)ş;Z,eGN&7Ȉ3rx f'#G٧д˅TwH'E͜1ӵb1xR  b=K4n?/k|,A?2(\iV< JC<AC7 zvafx{{Tg{r͵9T ||dӾ[KO,2k2l`F2]U2p9⾂t u 7_ȱ[M< xW/hklY.mU51qv?μc-R#.dK͌ry{)p9rM^|S ?߭gܬS\R$ [w_\YFgki>ެl#+Qu nNTj$'^sV/ŏٛC~(ou]:lG;~윶8x8(x){mgAy>6,<:,nL6%VS<7N_ ~`D ]w}-f3 3-O垩>. [\դ77ii@0,\L}#[SHԭhD3|૑7ɼ5xM'1N͸,*F߻A>ʾ oK%k/ᗼ5Lv{fosO?5]B C$hvB%U?*>wX}(~/L ޽amSQ']%.-n,Qߐ+}gO🃼Ifv Σ&T|U@M}n<6ڛXiZ݉Q๑L?aKϞu;9uC=.<_O0ad,t#E|>:<"5xI.5V:1-*1Գc^-? Z#/* ?5o_|2I xH3Z, g~ v|A<_g ED0GinFԍ=CW>_xߥ\C}ޙp-maIAh(Oӵ;;[V ^:{1=q*OxB־-|(W HOq#?r?n4-KIZY[>e2O;~9UÏMzO]VRc @$wlFxW ^#? ^OZҡDž.9{_Gx?d?:U溶zqC>?%٣7_S?k,.&P>7Ep06HM|+| g~'ǮY jʾ𵅬6usip<9>^syį |@Q楧h? >%̟g3r3ȯdw?Wɨ*dR4g/rv9݂s|׍'x#Ǻ_678C>T9o0\X_Ond UT)C0+3]Ǎkk^@i^Λ-ŭ֙I[pm|f3~`y]Γ( DYkGX\N\(<:ޕէ|A+Xu?|A+]l}p[u?҂ > Zhti_tOi.{ |lJN9|uw5]5mSNbG$)Nvoq`aR<녿&u}Vk=`2p1ȾM: )k>m+xnXYr`>v&3ϼBW l,{x[GofH ኰĿ/_Exn䶷sn0urmkQ{|P.a-fy$wH-b3G4o6⽃^Sñ#K4PQ&M':䑂LNcF(.(ǹ sE'J3EZ(@QEQE4REm/4S [XZZ/ާS&>$$ %C~K}W|$Ҽs7{ɡtK81<VWƞ WxX;<@=緓CKLa ^ X4|)񏍾.ktMyxl>b獌L ȠE Ny^ 7ş'_ex,b &sQ=rO|/O{c2.0W暇ĭGMc>4|?хΝBڕM+%>W%v(C/5ψCg-d:J܈ X|#@흸- E7k~?-zĚ?.f@:{羣;Em%K`O't~Z|,_u/׺(-NyRDs(7A,@P>'@E=lim #]슈{ q~/Ѽw?>-u QC5IAr<5/|!_|{xs[I'Z)5]6x'؆V8'n eXx/wAy{{Qi$bT ~ A_%XB񥎑@^w:X"7#xgE|?k>1o^o'&{fymﭟZBU%GJiٝߊuG^ :jڤ\V5p޾[9񧆵OF yWKt{Mo`W&aK~Mr9Z A=jVHD](+R2\CG+pn8켽cO#\gh^'l>"?E>,i:ŤwLcpX{qaMi"5MsW n&W$}*+G8O~XB ,,"Mdt;dM5kb~J2J*> ٟ"=YXXRkK̎|}oȕ6яV<*CjIqǪj ~g;_|m9ú~7Kɕ_g X83~o)+Ymk2P݄UHh,0H"\:-'Po,oo{y9Y#{{RE[\Ƈ&~#K% nZ[m?ʾ"X \G[m#F (fhf:QU¼"wQ@}[:ooZk>o.e(ċ%D]p?y{I<ZxQ^Ag ȷq7*^ϋ7 fu&n(-@q|Zpǧ|07 ƚK^#K- L-c+* Gdφjτ,կzFtyē:yNDzs3^s A/Gin"]VX !K6^+>x;U|=j4vn-/px,n*gW?h^mkkwfhYp܈?7CT=Ojn}dZE.}t^JŰ|jռu-&w[̉#{pzG<h;O|BY*YRm'W#^¶,PO?.4o> yƟ~/Z7>[: /XmB/󎂂ܥ] cH{}3OM/MH-O1ZIgAq-ŮxQėzailż|Fq/to"/ Ħz8L?Ȕvরݤ֖nnRƌ7`k{9^;|mh_߾\dW#wr䎅i&$0ֹYs{R@yįC[g5I?Ť-ڦoZJvHr2 zŸW/t'͹Id.GF^ ?la|\~ :om/Ev{,ŝd;B}=/Dy> 4տT;)wY0ėW'wnK=_'=M `=GzR:j<&I.9s?ܭωƨoQ*ua?-q @\Ҡӷ_>.uaj.."y+͇ L7O2^(񞕦x ^4UsYft>f\ 5+Z]i[CQ6N_F>9_Ԟ/O7_K$Sy<_u;nI4 ]-+\iUvkwpx =GLaoJ?`x:R?  Y'H8uWG|jRgOݿI~ Zᡗ\:"kkTܟο-xds֏I|7׼1g xgR״)-ӖhF44И-3E)pYby{G؟"W~^2M~*ұqjv~f2L2 3#%o *XG IfCRv*u ZHlm,giHgj pF3?MKZxNѥM->}ۣ,0@JzǏ_!A񎡠x ;:їN^--f8|%ADW~c&WxĚ>sODF&-B.\o>/"u=1ګ  vLwv-mC$!Rswn▵Sac(N96gי~+o /&k>'/]^CݶI}-Lo]YWP:d|G?7Ҥ_~x2yh>!Ӭ| k;ӫCk8VmR8"fTw;\=_~&iw_\,j]M:,'wTJĺ|ך%$y]%4D6Ν#j]ƍKk"@|rFzo@ğ_G/.-̗y [)6? %;#'udƳK@ h$ESq*#Q$=s[/x1^x7Eu{ɠAln&m,v Y%OP|ё'̯MxEOkc|'|#wg1: 8ˎqoį:G~m] [Ҿ"39{(~_gA`ȂD;3 _7Wi^/Ӽ3x<h:Υmk_",Ӧ",R!UL_h\-dWRA `~h3" u;kBEyH|}O|Q%Ʊuh6%ѶI౗,7q;W;⏇.^ Vм7#6z>2$hYar~#'{EcXk^ivڅI?u|WuL~(2Q4ϩRhAʹ17a5_~"OٷQ>WRxnJoIri7;[)(t=hpþi:~yc? +&RoŁBc8N_'ZJ\Kijz33ܥò(7=p̶ܨixss/m^<6Xab5?/26ͤ,>S⟋uFдO25(?yI\#|%@Ԥ-u=> ,<7ω,Ecz1C H4KRڵ5~l-`< gZ>?Q.K$Zl;hmL[w46V| Ee?r$RzG5x궾664Dbn|XKIѾx:xC^mE3Gh'd5G8?(c{ v2}h?/+h?W]_G>0Gvj,lvRKg { cr\PBE&ER(((OƵ)OƵ)_O/ާM|IUՋcd/<~TN>yJ^->^:NSvz]_ŶdPUI'4QcG۴'WA؁Oe$-kŞ">5広KPh-H%߲1hӷ\gXE[m?W8Y7$.H D9eϨA B ֛h3H02ֹOkr>]yڇ<24oooWh)ճ3YXgj[ִִ{[;k˴I0Gyi]}y~aF6ޱm7RXˋHefDts}>oVzM\i"-}i^/#ki4xM΀O]y//>_jS^e_ukSKKȓ#G=?t?o.\,]\?-oGP-/zgPICzdec,K,#^N1YMm%(MHlDX?h_An4kSt.S~7֨'~KA_jw_ ?MIXntpc4YK]_Z|/|Mys^oybWw*|j?0x#ĚǃLMŒ/) $ W 7qA)""cKk,o&t}V ♡#Gm0GI#t>Q:րpIst;:7ekWm4vnR|}1: s 9ցJxSO#ޕCuׁ4+}B $y-ZIK2[o7|enI-p:3P7Y#q`q\<}xY>^ۿ &So+!sy° tڑfGQ G޹k:z&k{oerruy?:}6?g #w^_I\닸l~k~gdyd?/fDWRA84 ZF}GN4ۋh-<6^Bg?ܭCְ5&Y_--o_ʺN@_>/s;}.Z@cmg?=y_ύ~ x=W5we&>e7쉼ƽ/BY+?i?o.¿ 7 )SZ?_%2GӚ 㸹2r {}R-7]o5Y4۝--Ӷ Kȟ/RD+H~5mGw:^.Mwl^u]h?Cm?H5ڷ: 2qGW~ \o~sw*SvG_ M,^-Oxk崄TBfCל`T7>9}h-j:Dw&MÉ[|Xn%sړAÚlm ?1Oaޔ}SKt|S;ZX]Iw6Dڊ xkź\je k)eL=GM~J$4;z]' &5&?ۦ0Oد~"TYxVZTr!'_^͔;(R&CѴ*K;+`"G~\|Lw0fh/Ram"]7nϚD'R>׿N .h2muj:6ަxS%sOj:ԧuL6=ZHFUO#*eOO,cV>-w :Ŝ7ì=- SL*Aʱ]<k;VzjA'w}վ>P#ǣ+ookj_r'#|+[^*V@vmaˀx8g?t3Bc: ~˚7 ?;Ҽ7g6BC7_7לI{~!mwP.qgnnW?wq=d:cb?= ⷀ}Ix5+G t 6ur_+!oyexUX<,s+A>S{$&T$?&x#Ƨ2F"x F|͈Z[zuŽC tR+McKUHahS_>Fwjk5xVÏB}ͮ4L8WnSAxOiS` y'9 ^ ֹ5W7p_Gy۫{dFЃ wƪxS,>˭o\h͡^_'7۞JwbMIIX/<+=(b ]iix?6 jA,|#>ux{滦'-KB# gUdo,z#g?)rJO@+cL6:񥧅Ke ;{h`l̶ϼI=seno2_aȴoPXDZ~z3e=gZ cúv%2]2Oz93¾/Q[úƠ.,4P@b}PK,xJ_zj[U}bytٽ6׳\Lnn% ޙ:K@R`QE ( ( (tk_Ÿ/q tk_Ÿ/qP:b}dĕ\ZyUcPX7Ce=oWufmL,f4+h<s_\?Bm7oJT1‚wTt_~?^:?b(KZi-y1 B g>0^|;W3}~ +fg>4WM{Uei/C$?kfJd{=ge>~@?=>;Ɏ{X#_=S)j>+ x{Rʿ_{a@R6`tMI;`}xZo]4xKU>đ)d-明P!NY9]%Il؋dU'$rHҡ bҴw);̑IA*x#:Ï iޑXçڒV xI'$3OsL:VQ^'q:uk~xGĚ~whFLWvӓ֫u>xWW{x{O:]>?:'P]kPg>Ga=Y[?ن]@?jhү>xLXIm_K `M{7ܩTg6O j~[Y}l]*"<$\~ |+go|A5gQePibssg?Fi?Ϳcjvkj|*즰֙ 3Ge_uKMK.|;{ w3Hi%= մ; hl. ŧ۪[r59, w~nJ>>"$uW"7[p>.w2SH9pU|Obkg >xKxG*Kh3`Xn!>Ey,6wk?u.W2:uK~4}J [QI=ܤ~Z>)9ު}`&Ӕ֛kM֝7z?P( ?N/OВWu.nX즒%bp=wmx<c_I޹Tk%X6#cl>R D_q_zLJtZa.dEԭR&F'ܩ` :/$fxx;<=IӮ[fTM H`!Ke"?uj|[%-|ULnUr$p8#Ji.Ga O&!FuԋyQi+M_I q)E|έ/"{tҧNIHl֗oHq(RhZp ?03 Z>sß xPkc~v?P2R~ӑ‡Z(E?ōJݏ?734𧇵u /zm?rxWILBs#j6ZCg=vu %x+_A楫 :Ouϋ~+^ f>ѨrパM|ao'axLVốw(O~⿄_ w{?wZ %ԯx'~D.Xnx:=//x.Blˬ:~jvUd7 zAGu5kR;[ڿ\E' B.Ӯn;OiwΐŨWW`,C8n?gr}o,|![m:m᳻w͌tn~!j'Mg-IBSHbyǥ59|?d_?>U\/η۟zؿk.u &-:@_?nWbu#XdnkZ8ߥ?u@pz٬x`/O\'}{?xOZ75YetdЏ-ɣw5W?&V_|-:]Bmt gY=+" > /Ɩڅ~]]9QJPs# ?fI<[TOw̨_NGBw3_'оm$^ҮuZ=SRέmePXW1~'C'Ľc="xBŚ^Z[E,SF<1o3K񷈼7cþ0<7%kfR8) ß~?d^1O]kS#y4FbA9Nmxmo^7Gu#JD=}6g,j45ؒʹR$<-?3]1uOO8DrA< [lqϵb4|goh%|7ox÷pj4,\ϲ0+tMOCR<)A%2YȎ\ăo*Zob o~mdXom_(s]:/k^k-+u>o*6-,zA< ş|X?- Ml㑦M6+8?= N>#G_?go`ҖΤ0/lA H|3#|Et=f  *8_ jgEfX%139x[/DޫwM2QYc)+J7}Yl]OIM.XaI8tK4*1~~?񏈟k-6[5TU|?_ {? :o/e$u,̨c]ꝱNE_Íf>6߈Z}`+[sl9ڟ31Ez߆?f >x]?&kpʍ<<cM9}/~˞*SԤv:L.sjmms@>:<%O[CP.H$d{iV#Kd O/>=4OGG&RoxD-./o+VlOa稯[qR.}yI񧎖mVė1=J̉/ޣW^/u2Dѥ6S ˖2f(>T_nWψ.l;av\麋5h q8OPPmxcE+2[mtK UA䝻'ug&WP[ BMOgWO\}i쟢֝i~0G#Х1Y1p* 1cȑ> %OSDƧ}^WntKZ {q~H6$gٯⶱsW%LtJ]6{+{&HM]3+ EYh+OCqgJ^iq#;[ 2*MzBMf+:ҁ3T8?ߴW-5Ÿ m<9ݥΥj?{o{;GpcA>s2/5,|GVoSY/bo0YPm}[k$Vk?|As:Yivϻ/~2^-x oeӵYgRDv1ozcƐE[? i/j'5OhXt}8Ȯ왠x^+>34R/ -BEM=ɽS/?J|I;x_xakEB~/ocl'4a|ů|R٪iqcJ{8'Y/M*w9I*ԟn:__|??"t BsTWьj>?ݓ'PPފL(EPEPEPEPEPkS?%?=dkS?%?=jTzL_O j:ԗNkTԚ9,xgZ7%W|5Xǭ˨xykr[ gb' nlGߥAgXۡ֗r_"|%O 4=g)<[a{i ݱx~i,K㎣ ]F~m;I+*GC&6v;x֍|X{ĚhҴZˣi@|͓RI=xǿ+q+tꬋc)p2q{fC}~}ΣsOw4E>v8!GyO־AkG- xwRԮV^ dDsmۇH-J^+rDѭk}4Q,&bߝ>S"n}Vߍ;ˋQۿ3YY<ȏ]ɴgX o.6"iڝV/C77VY?%GA']ۭc4 SX:W46Y"i,{I '_[ǭd('5ր [6Ȕ'gqm'w^V~ծv@[vHp+_~|4𵇊%mX7_;\P^ ϯٴD4֨MƧ6wto2y5vODOi^ _MD.mɑQ$(sXGsoYyjT}GRxnD>T3x;SA񿈔zm3)Suψ[i_.>>~Ḯl=i6WN4-,F9gcL_3ko ZEOlL6j B8ʣ.)lz7Y6vCu[} F~⡏jt\| j .APLZM_AMֿNkM=jd׺h}2CZw<#_>([VK۹D+s;>MR7`o]wtm.{{WKG&xQ޺>k#wO.2S_bVې~?΀X&i^\%%Cl[u77%"l6Ȕ>#m4c%+ڿWD|oOD׮m(mttA~Z7<5Z_.n|]k $*I%'2!Uf4;BuO|Ao"RxKgU Ad U%dwI'~i5۝qna1#muv0X W|7hzOh%ټ3u#ZXqR8 ES!ִ݁_ɧ^N_ !8ͬgˏ:c >~ė%[ÿ+v}#"%Nyʷp10Mxuޱh,J7'iUN폎HbiOqބ9߳䯙%A [O&%xV>M4̗s{+]gkߵ_/XP|(nj?[fKktnԖbJO(jxm縒UO,F>d2R^]B/.i|H+ߍ|ax3:Gh>b]2 2x% 2Hd w+/$ҩk?j^OӼ ^uexsEt{oc]*yV oy}w%D ,,lTw?/?:ĭdRG廷M ;J2 W >.yjgOjd.|GDtnޙlpo_iO㯎=R|jmMo xSַ.&jngk)3yiɰ2wn$NWӿhh 5oW|cǭM*J0rH`?|oD|Sq Km}/-mW-u ýpAwLKi@xf uk:{]-> 9e|]#UmFொ m^5{xOŚ6iQ}{Lv+y#hÿm4]]'&4oI=k,C<3SSܩ?W͞>Ҿ ~Ѿ[[X 8%rqrϥ'ßzč;~q%RCO%lr2y dc?syytu?i_k?>(aȵkǥM%{S {m<ݹ6K}ֲu_/n'nϔ^X>nx x[6WY%ԭX2eVۻ hHrXv#?sgΑ.U_?ek7vFþkk+34D?9ګǟ:OO cTo; n_ jN(f" phF{3()u>?X~u.|Hlj|ZuEXHf*F P+h^7h ;+- gݼ ]۶n<(@J$ݤ QEHQ@Q@Q@Q@Q@Q@:~5O:~5OR}1~>1?Ok~x7t#nuz]\k6ͼP(:8]r0 ?J* 'ENE6Mysx<{L~>\ (x|ySźܺ) t.%'{uy~[pЊ@ cexόd><|Gwi\N\f1ፕ7?7<+ Orkz]Z,^i佚oOzt!ǵ8#:TbA\9Z' YxgVhj2]8_kG:/"rS@?yAAb!<;Ԑy?e>>+M7U\O5ˇݣ18gA cjv>>hI jkiVk!eyGϻs)g~v9YddbOT;?F'w7moFi%{;k;9Q%fCuӞpq -&D~^ZͬxTV%Y90„M֣Kg3q)u]RFss ڂIZoV6j1jvYX]\OYE#j`xo?g x~15B٤ZngS>]In/{/5/xWÖzD4_ jZMwp?+&p4 tf-?:_FV5=Ox{zǯ  қ?1G9?7iCtzV͍tڝޕo:"|5>X_=VjdAΉܬK{Z[ /B+nIc}<7&s2Z=Q+.0ٜi6~x>"O?xu z>ڜn"4l_o͆W o7M/#So>35_Ö-ɷҭ,#N"~|9Y׷zk+AHݤIΙ!ZL^_H "biֿt_J6?_ ?g[hLOmϱ:O^I@v¾$|SsyZ&ye+[<0mhgA^O e/Ū-;$z$ Rɻݳn܏?|]{Q햞"\-R·ԝ3k|eRX&֭ͼ)-|[ '֭|@xž$`/ x="<=oȅ7̄N:|v*Sƕқ_qo05[ ~|/%_J W0's"w@>%_]\n-sǝ2C~о>}U7?V7ۥ"N YVoC"->߯lGF$DwR=h9SҭuxIHexgttT>Ϩ~:]0[QxI5+꺋Yh''.߅wƟv山Y=&dmvm 9iAR :3ݿ.&$SG2M7U 1|$'Yk:@Kcp"/G"8MZGAg_/)tMKG'x4Zet uDWz~ |gO>x/\}FZ[mcM?Ϝy$M7hٽ?:b4vmIg6٠vk0vlA~$ʞQu=sSo*Y;tϙ^X:?]'ր<<~6ox*{_ OKĶ Z"ɐgϜ?xXPG|jAmoh.-6vgڽrLHO91^|0E>.i7jVHXMa{~Wa^TYEkvyOP "#(cu y]񎷠xS%׈ޱi+1s$R*+, ({졦~ 5/xƺoUt-mKk v\睘o?{{'ϒ[OاJӭAK -r-sLeȇ뻦 1I-ٛT~0kߌh BK[u\k; nU5|SSxA^!xg?=o|]յkK{MF@hCp"$מ:kt}-4[M:P֤jCPZWo }7|E};u/ ,˨fyX'=WE|I8O5I8"dX)E*s8x<+C쬵[WOw9ϏΕsގ`˷<Ɣm?KI9:Ag4vGJ,њRc0KHM`dQ֗)4w?@ ZYO`uKɼ*zyUsPXщ?|mjwſkcFTȜ$"9f O*dBr \;ok ~2ub o 8%V]K͞_;OïNmZ'Vׅ,dDrN'->>??fCkon]͵G=1kZC4[&t9<|;*k:W|G 5a?h#l#am1|Mw .xѵtym",LYpxhP'P8=}*MI?ɿcՏ -ĚyV &69NGi?FяW6^cjZBn#x/㟉7ŏ~8񵧌𮝤K;qx! *>n^%^~/H׊=u[{ v`4dbo'v~|5<9Hi+:]֚!:ӵxQo?Cə„v0BBWY|\ -|;<#$^Kȏ3"jR{um'+4i-:xK~#YI 6SӚG,/t$r:TK=Z$b@*Rs?+؇gv&) J&7~1k.h3-|rƪrw|E-wş4|;K .Ck_>[1lbVǍ)_ s}|4ַI3/)ctbXcV`3ώaxo,# ռV߉QDCUrs=;ox;!MV mm?"M[|c5xn,|Mmam ^727ߛ\҈ޖ Ҿ([߈7 MAOwsB!}_.|KmNJt=Iho-V'}ϓg }{MXP)N\x*)4;Ҿ+Zξ5֚^m., kؾaG$_NM0?ٻ7I;2'"+5x==+ʢSF\җ^[ B,(+o Ef#--i0Zſ?dnRR^cl_>o@y7|Fվ,g94WY[䏇p=U⟴ύ_~*[Ťx/^U.-4=kTKIo#=l~Bgf;k߆x/ -&ĉG{;yi.͜zբNLg)p}IO_J8 2W9σ)k M;lJ12>%f(;lJ I_zW=/;<[m5kk ,)%-Tx+^-־:x_/-Ze֒^6'gqQ,6וP#9ٛz~c?o:v I7| 1Q:~eҖA@!6@A;x_15Ѽ1E}oJ}q,m&SH\=l>^H|EM}.g?k4v۝{!8~*?>wǑi p M%S{qPXɑ! 7WaA1־!~fcJubJB [ez7O2W'֭u {R5{.Iw\cHٗ{ ۜS%ooxc~ZzƗc-)Vi-݅H 0|| s4/ګ֏fxNQt>ӯK'Q-S&z1^goٳ'W& \x¾(Σ2XgcrJ~Tlx'lƵjFw!Umˍ?K7Vf]&v?) 7:Vu#6KR`!_Iq#sxĖޗ-r@L\Dªw`;׍i7Sg]SVE k ͛\;x2o~ڦ~z +Yyqfgu򤺚R6=s_? ;OK?W`{fv-ʐ#qeѼ/º3ŧyr|,tu%OSt%4^Ţ~du;+"^yMp6ߵM/ &x6$Zq=q3,W  ⇅| _*ĺsh&ٹ׏\w>x_uV}|PhBD@qڐxOO/  7HEiOu=yA&7x)) JҺ4_Ҵk^;ݮGmkV;)]w3지=N8Ň Fu;ƶ> %|Eē;Dv^W'vw7 +o'Ě=wxcXmПx#gA6-[Ouvi =Y>[;H7fPP2=9:Z#NӼo_Ajh:|f[I\3ȋ8 v8ɯh_%/ǟU-֦]*7j%vX"RePI'ş?fxJm/'ZV,xLu{K-OOɅ :[ q\ƫĸ+^'"MueAGE\䟽򑊛&xS;V|= cMo4,Wohq;=JVW i]Z:<-mi0Jʹxs4h<;$mY4G p ̅OQԁ^7OtWǷi~ n|Ib*'Hv8޼?2G$XeĞOޝ. 3ݧRGg۳懏r]ί_^ |IiZŕ/-*@I8Đ |?F|h7:-X$][|,H@ F 5>|KF ^wKiᾔ2:Mn“]U^5?ڮ|A}CzZL%2ʫF $&G_[R^/kMͥ.Tzoxck7ߊZic]oU(*j$} gu+ 2o?Jj|IUtI_-{_"4]>'p8WUQxm]#6^t_h}a4"E_98S {P)ct\I_%|8|g⫟pwMz^.a™\%RF;o~^ ^ľ'.u{fށpBbds>F<=4mv ګia]JGu!ZYi-&ۢ9c7Wk:6o|c[jUŵu!H#3zP ?3vVԴgHz.˧CT6'N=Ez% 8U'B5OG/]?HmtֶTDxS72u5f+am_WRk}L@Ѻ> WR8?2.>{k]_3dtMqWGYDDf-hv@_M?~/?\//uR| ` Lq^< LEvP[%uGLzG5+~2?BXB@d?קΕI,9=}ir^\Rb~\AxcfH|?ȏ<"f\F=Zobhԯa;%!v@OM $toU7w|T_xsx'R原y,w1[ϑUdxտ; ᶧQLo#D m" ,'戇1iowd:o`_ɨMr/?S=|^&&i t(oſ/Yֿޔ J ?/We}}>@yE΁3"1E}H(Z-C姄~"!_k7מ+iO˕!lyv<>c)ڟ}3Au-O^\h beBj pq●k=ASxz~tΑG#E뷟QLC|*|{{;3G_?~_֚|3Xo/敧<#RDq )"vVtF?wgeoQt[!nxFGRu/:u^[$rxSK|cx{\K -C%ow]L$s䌾<>h־>Wz|oki-i cWQIGz"!Eb8X_T>no}f>1 U:jZ7WLD$&s}+" m_W~+~/?\ߌ<'}vßoi:Uwkkm @wHJ>|N>43獴qsۛd}v:2 6O|e7~i_Wܼ'q`4D\ShL.w>ȿfկtrfp\(.tˬFGO|'TpW?{J 9${:~> |0|Sz3SiWWS) |EëojZwdtDpKXO$Hv[/ۭնƼ'̛ez-~~s㵯N$v.?ys]ș>Votou|e]b1&yH!?_5ox% ӯvJcq O <iZ? i: 7WʻBw:2s |@j:~1xg~]7 V5ۄTO&ZN@+-_?:íg^)E}HE:X>Lǖ$ۀ䌂vUφOmx{Yvw Y7d H$fx~6:UnPKF$KA)ȯ|E,ooK\v,t[3Zk na!6't뿆W>'!׼?e|5˽T[0@`4P@{x{OޫluI# *7>܌8t X]cI@!ӮRz|/5!;h1`ޕio^DpsF47!ϳ~~›8S/|YǥO0v2v8:%·k F$MyUe\?0qiïE:hh_ʪ@+US[gOݿ`[;[A/R28quV%8|EUR6M^𕮣:iʓ4 @_AS| x]1W_ ů[NC:-D)7&o;?m}U|U}gM6qcow]H/ _$τb<&s=F6bxĿtptŘ'H&KMN;8ÜnWcxL*'|y:c1Z2Wg*nqO_j ƧYk?i:/~"xbU7ffN&1ץ|o_ Ua2k~fr@NS&Ҿ.i/ڞtX y~JVo16# mk_ŚxQ hV| {k:îGn%0Kx?Q)oDe4l%,Vַm @42]>ZcU$WObj̵Re4 Tc%t'm!P1MτBWB巳icʓ}q>~;W_t ?<[7% z\R{uDb @Ar>$ƾ>M+ti^rB&$1ۗa~|N /j:7/6 '.u|_BMkD3^`.9^}[ᯌ{/g4Ӄj:y[.J.0;3[z/χZ~>-ExΥZ݉#{tA>;|6gCTKV+sz[Imap J)d㠭m#ߴgƯ |x/:9|*YE"Q"oPӯ7pھ*ҢԴ}5q~*n\$0G{guҥ|}&=Vu ?!,J뎇|G? t;zvWO"~lH$Vx1"|SW4+oCְ,#"A]↡ፗm/O.cH4|[yHѾO*O3޼ºE>&xWӼ5G6ob[p@gIt[~ѵv׷qPiy#(da2uwOQ~ ~_@rfOm.N_[ LJos䦍<x<̫ g9 u"{ 6=VZT:jA{4p~vW^>]|k|X>2mBſؠ!]Agiیy |X33^B OǶz-b#ys1q2(O1IKU5X-attqgإo确:о!xy5 kxKEޝr$ ǐH"Nk,[Oϊ.! _b߅[H=!u,In__[Wߌ\K]%cIȱ0^Kglqrz?_ &xB?>>*7/f4ynvu|~׊~xkߏ=Y4Q6,RCW^7GjRxxt+VVEz+\?!I{/σ~7ᖍ+WW߆Eo]J sْ0y7Ɵ1ԣ'g$iAZqÿ'ljhcoi ǝC?njZmo=c+hxLyp^?[Wun:?ݳ}}gSƞ `lPx||5blDO)߾kZk&tnP%jPHbtd*&cOV?_F+_Ÿ/qSyT %V5UQ01| Gkbm ̏W]6ؤ?x h]xem7ỵi%;ocs͏~ Kt_~! s,xl15q%IZ۽Z/#M/1ek,aj"':?@Z+&fb )#=*j~2ྉk^񥾽xU ^"P.732:_mF:qAG?Džuo,ntb׋O.su wb-z@(b'A 'SdoYayRTI']9]հ5"8c68,METI.lTO]Szk;0噇`;VWϺ'ej6ǭi5Ŵ3'd}>Q*k7{?tO4InfM,p"_{dqZ+J߆B'ދvZU)m"U;oE@Ǟv':NO(OuQE@*}>߿Ÿ*Hu^CZ-?<t Mo<=,P3r翱/[񖯨MSM3ZO ^I$=6b%\Wp?H0$sMp!D1 ~0h/O9׼nl|WmB_[I|"GRq~kLA@%@3-Gįj׆/flڅw)#De}|nft^Iм{Cjo3!QI }́s@:|"So ~(LN5s\/?A^k߆>Qw5 W^{+HAmvU;ڸF@᷌?Gƾ/|w+ǐ ex]*}2Q Y-/-c~ w>Q ix+Z{F}>o /?iFfy9w^m>J>wh~]{&)q挸 /"w u]#ǒ[g.,ۢ\iG8˸`2ۘWӚAq|!moЭt)V$'8]Lq2,yyC yye]yGZ/cu {C2$>r>rO׊5©P; *:˓ l?zٷ' EX'en{m%@Cm=Ȕ -Wd3]Z;쬫HԵ/xBsj6t=|(k{|smjz5n w\vM$3x#ÚIeh Jlv=$z|w_ǁ6/,8Tȱ3|:[a6 yΗ6b}cz}Ƹ{n<@}ό|85ݴ [B2K?ڿܮѷ\ǂNh\+'Z^M l@r$Qĥcwèsg¿x>"cŗ1]vK b4S;Nz$Whm%~ϪB /6A*H䪱;:&G/,s*5j _Q?TI8I8sI{v.'j?c?fL5®,|/pcf0vI2smV $J6??.?Gٵsyjc'$֣)[iSd}Q?ڏ\lEӠL6EkgSJY"Y7GYf6??.pP(uP0B"b;1x߳j?c?fc3.!S2}Aj]ujB1ww>\"?a}6??.?I}G6?.*g0ip ~jk_j?cvx@ёpE8#4rL;$gٵs>ͨ NU#',7ȣ;>??.?GٵsG:7(m$RDgj?c?fPKr$2 .OL*)'$wO_R?HMq͟h p(IePlϲC_,['XY ߿@XDO/!,R\}ȟm6CU+Cgҍ¨}R?6?-¨}R?6YO?@{ ~K\z~ͫ]:O.o #,ʲ:}~3d_O/)|.$mcĺ?SXtЉA$ &lW>.k_$',>ex&o.qPQt0<j%AJ=.} 7JѴmBO]^Be6?'Krk _7mψ[EvqSPr֬?hkynxt(M7^C >^Zj}ݪo kĞHsO=IE{`Cl7O6|<+wx_h5k\X#c[ 6e߁ uOxDwcX|sf )apݥYv4{A(W?O.St[-D3 gIiizujv{七GW7 4|hEhV:>hS][ ؤh0xogÛ3[1ҧ&d\%"%n;r)EvCq uX,}sK{`h~_4 +o<||.b#0c6H'+?ixGǁ%K0vD4۸+$1]x>2y&S{W4_ ^-!iqk^=e}K2V}=!'[?~? jǚ>;F׬-5mU.l5$LO ;zpR^<ܧVF1r=/OOKcᛛ5mM _d+W ?y_k IGic>Vn_UTTx/IUco_ ǧAWז ZM$;Q D'z"!5WwX]SPc#}zp_h_|G h^]yD\l۾FFk/>; zݜLJMy]Ή6;N#x4ݿdŚ[k>J E@Qg A29˵xKkUӴ^xS o&}I,)^5fIwh3[ZګjТ=ȹuuc}ֶ"Mj9?.j:/z( ]`:_yo,~`S 2Vhy?"o .j10\LE->5xC|mjO/tR%f#9|W9BoFĺhx2 7;ULƢ]#H=SxMoh^=;M5-VKo=M >^#3b>>4zAe<߳g߿gRxGU㵻-k&C~6K [ÝWDV_%ЯI̷MC)b$6w|_"%xNQiƝehd('~ӌm3N|nƟh/ `-nRki"Ol7ͮi' ^OO,|Xjڑln-/gr8qG-wPMִKPKKei Ӧ:|C!SHU;#zB/+ᇊMK_]_k;I K+!pʞ_2NQ>}k?ǚIoaѓïrmVMW‚n}׫xFomu=cNӮ1h.ɭVRU=_懢]fe3Xwnz-׋<{8$ӧ6N QgIl> x_rC[D5m^կW V:`a!sSֹռG]jK4vwOdS$gO]'s|S 36s/,ȏL9,'t౑٤tiOGt>'.mm{o=ĺ#)Q!oʺw9бt񟆒ha޾dDVȬٿvq(~% >xMķBS%-&[V'^S^44kDm3SүK[Xh2c=A?iCKu:#;9"' -/$qpJDs7x;3~^)X̎f6~iL0I,Oű+OJ_[?m:wJG/֨+W*rs[=Ik;InM$A)hw/FGOqq%A>mI|,Sfal&,(aG]ka犣;=kj֚HvL1#C2&ב=v~=*%[ ߐWj^4omƷZ>TXgr޾{|w o%t6V OMsGM۞ǐ O|7Isx.{I|53]GdI4d?NȠ][Ē뚝ޟɹ/~dg\/7|񶿦 KT,o7~W| \/m{/XCu8]KEa $0 ڽ?PK:nVʸAm  9;;)ojm~Wm^O AvP2W^v=~|3Ww`MJK?./䶑^Zhi\HJ#'"ݿewxZ1M}̦;x㍠' d%#<)˹dLXϚ?ۦ(/>B[ ?_.+ω0fK8i"x${37zqֹ>%|eĚΗxEЯ7ZD4>W%msCp|@>Լq7|1_?wD]zEHXA˫<=l^gnh}eEMs$yE*.7Z_<׺Uӧ_ŸL_S渓fo(<͛<ݟ?Sj}xډebKR&WeC$kǧwugD>b'KzQQ=KHƲHRϝܤ1+9nq}aVw'D/ ZPC*d9i6}JB22E?fbKR??%Usi-.jh^dyD\|%f3Y؟Կ*zPRsIUOj_G*Կ&<kWz{MԮu:|M;J4˽NӴ\ipZڢB zԿ*?Կ*YF iDo?:T?ؑ4bG?ڗ^KΝiuٮ"?xKLVЗP>R{뛄 &;֟G˳HRqp|=Յ*T -T`9i:ViOcޕbG?Q_@rε[Y^Yld\~Gt[xÌTة?P#NC؎4A:Vo0Ki??%U.ŬK;lff` Ow'D/ ZPȬvE b=_f{@6X]|ZQ=KT|DA(Thp Ҝ""H__T؟Կ*/)T[' 8@dO9f6/D/ TF#tIy RraMfbOROOj_@{;g[:uZ5 $*OOj_KQ=KE[?CnOoim?%U''D/ ZctmJ!i,)2#ʰ@u=EOw)?!_}cWF}GWEjڜ>izsM?4M#G ^mVqCϿA'=heA; dq/s@k9F"XgylRƍ?%|?{Mˇ)olFY/&d}Uմ=GX1zQ)<m0~wِ_}ِ_hF?n;iQ\}o#O$~hz[Ŀ־Ykac˧2F5/4Q/4S;׺߈xjIyi+LvBt!Y5@YPkteu;,~i?cPq)wJ nݬoJ~5}7N`D|ud^5ҟ @・ޏF-qTrF}f~k>g޺_FmqQͿ?*F}f~k>g޺_FmqQͿ?*F}f~k>g޺_FmqQͿ?*F}f~k>g޺_FmqQͿ?*F}f~k>g޺_FmqQͿ?*F}f~k>g޺_FmqQͿ?*F}f~k>g޺_FmqQͿ?*F}f~k4u~Th(ʼquujzZfA-نҭ -|,|,X%~ o|~9_G B]h׭ue֦KY51ᙾzm6[>}F>P<~i۶<>qk͢ڵ 8Mo:-rZ57[I[zWSe.u/>? G[98juM𮉨A}|+t.Z OIߟ߁SDџֹ&q/5!߿{~n/?u5N=O[i{^wQ+o x+/uۥO/οs_+F_y9@Zix{\wqrWh=R:o>T(TgN?ZOΝE?Z)hc:\R@ 3?Z?:Z(/KE&~gKE?Z?:Z(u}*9PyQ@ ʝE7ʎ}*u}*9PyQ@ MOĒRIIi[jw tqkBdnk_8x?+5?&>hwFy1q^W< i,˽6qnTS(Ϲʏ%~?jǃ[?qEټ?gNJ욏߅7EZFaT)k8kcQ9:sw?XRmcđ$̆飏p{AXgxN/F䏩|`O6E<7^Yj6lgz~5weP~x )$ 6*񼱏xryr9!:4jKŚ H{Há5Ga|WY3V:ՆPvu J ܨ¿eJ5r(n.|;sp!5̡'\1IΪ ?_^x]můD~Q֓WuMkksGT 3+ھ y ^ ^1o 6kY4LܶrYשj_[H/MoE&b6qbW&/u+3b֍N2:gTּKCЬKS&_ǎ{qg?猭U+φ^*xZᆙiw:zp@̮ݛozd)>`Пÿ |,lsjmw%~Hp9$>|-.xc@4rE("n-^ICYi[m!? σm?~o{\ƾ"i|:b m1l/nMHcS$oi?i٣ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lccF>ݟ~lbPvѳ֝Pvѳ֝Pvѳ֝P6})v})I>ڒ4yT=|5APXPbR@ 1KE&(-PbR@ 1KE&(-PbR@ 1KE&(-PbR@ 1KE&(-PbR@ 1KE&(0 vW*A8x@FߴfML'?׳O; cGq<-u.i"3w3fFG#|?|@ŋzg"zƕunR89,}+obip=Ր`hɎIP+ۭOĺugy„ۻ?cU-?NˢkZ5[Gsi{y'q'#W#\W/ -':Vu(.* zzU /NM֛k%Ė pH(UH4 LpnMǞkCǟ jxw]6R!3F3RU^wgšg|1x^+xi^jvz ho܆WU`NJ.~,V~}᛻o jZ0UE{y/ y^Zo[׼Ico K¶vdX%8$O't jچioi&K,w89QIf_xWz5j m ,s~(-|OQ}zkv k("!zY{x>&hl{ķQ8w<#W_ S:Z^sC]6!qyHTpCpO\Ww? P֙⋍76" i"#"H<9)>k+RO Yl!+_.ro~>x{\LQ_p:E">NѸT^^q*|Awk+u}ti@™ 0;Os^MQ@Š(((((PFAi0>0tψd%qPq~Ĩ#u][]mST#\Ǩψu@$v09I$~i~`tbƥ+^GϿ Yƕ=v {ϳM[0np,Ҽ!v^/./E})fxXdg VL+:%zzUZoCZVk#gY0_>0AqC041xv 2F73_P$*r/iċM=z[L$efb6T=^G_PMRC4;|Ki00e[722qNMsf/v6{Kk2XKu*K VVF+U U+x-MSRm'ϤJ!gK2a[P]OcXuG+PדYN\3uRJ>x#h3k~CuG{;{)Qb.s''}41B0W R EQq/xjVv}6wI[VF4Spvӭs69yL~ (ml"B`98}ⶉfT@a@-#@H^~4yWǧA'QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQESZ5c:|5;[]_RNm1Y1#15= xtU56~:3Y-9퍸ϽoEPEPEPEPEPEPEPEPEPMv*89U]RM:Ӳ)"$#spĊPv+6s[Y" \$/ WL>k_[NU9omtx+x_ +ڇJ Y"+ؿgA tA t2-*=K[%0, fYd0v`3S$n5-LK m0A(o7 l}'+x_B:Jq"hT3{e/o tos[%{ZGq[%A#" (B:J}@ۚrGE ؿgos[%#x[%{]# t]&yo /ĺewIlVr5\*xȪ j#}ӏJ>*x]b kAL&GdcH^+,ȭ:V%6kVbgeo tos[%{Ueb+o tos[%{K8Nj ȅ_39Э+x_h2.@'޹ҟ_ȾoH>9Я_+_g޹<汼_=#5i4m- "]/*-y?/Ros[%{-w0,m7Pq،_Ⱦ39Эr>I^A!{g}:oxEt7m{0z׊:{UM4Cݚo`_W?5z uOyl*:WR:מ~<U4sJmNgZ[B%=Fj?/W-s@&1VIG?/WQS/b+o tos[%{U{eb+o tos[%{U{eb+o tos[%{U{eb+o tAt:J({62>o x`|_I]ڿ]'\msOӵ=+SM;Y `OkOoxO9>Tb\'{)OZJ;((((((((((((w7>" \/*#ȁ/@5~C<`ȿooCzHPܿjǮ*eHɻ<3:QuҼ}S6p>,QEI]'Ȟ?s1㟊(O~/KOmE>u!5 K̍])UëYxA<]{^xtȮ7F+Pʌ0FN{^<_[e-i3kfo%k[i;8Km^dɿ/Rowtשnfi<&ݱl:WG3!8_XUɩl( KQN^^*]ڵCuV>Ek?h".|ʽ un'ǫ^6$>̨זW,@q21 IsW4(Cg 2DBC>sԐ;k]Es_4dF)5ObƟ,, LRch~ojڣ^uY.b ERe}HB xGŸ9HzRtQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@o2ot;0YEQ~̓ړx'jo`OEM]0Kr4ANQrz` X?iK]c}7ME^H*̭}A ~7_ G.tjL}&kDom7WVw5Y|x'Ě{^<( ǗhcޗfN3?iBJtoA }ȧwh6CcԚxPxNh дnhK4`V9 +Jz>Hii`<_oEW׋|s|%x"?cڏJ_cEo}*Ƈ(+ 'К*?ڏ>9AחG[cIiv*H.4 @˾6^lӇ+˪\uYuMJ$ -\e V8NOĶ־#ӴtY{iMBMPS?h~W|&}6 lm,+}'1wrk2>%{wĐB[gs$dFKuZ~ןu"?Z~x#0sVQ(m.+IfRK*䢌 xO{Ɨ7֑Ζhp+*~Z4mgz/4xEk?h".|ʽ ub>lkJP0ڵwum0Wqckۨw<`~^o 꺴殚)k$Pq}jenYu}GU.nf i/WNGj-Y~ gKa8k4-"N BJ3 E!X(Lb7C5?_6_BHBOS~g<ZJS֒((((((((((((PXC ? '𶕩kXG?g~).'RrڳAe|P4Mƛwϴp"F}^Um4k+mVy+YT2Ҝ$u|;G~i'Yt|#bJ+35.\H&k#fI?*ԌS"9JJQ{p?jo2E~di~D/#z?_6?Vrj?mđcIQ3.zO&#FY߅ |z2<_ 9G>;G5<8Iף7./Qޏ@?KAj̏9gC_O&~_ qߩ?eGe  sa?2<~ԟ qgR4/'^ޏ@?G#z?~Aj̏:iC$_O&j_/'^ޏ@?AޑL sax[<^;Ѿ!2jZLRJ3@gX53pLq*eVqv.+>>QU*ǥz2HcՆ0#ޢ/j]\<+)IVewื9|]5/O"25Z@i` Sv?º\6ۋuVMu KH̟MԿ ?dסg]6ɇ?ޏ@?Kvj_2E~dhiC$_O&vF߅ 9ނտu KH̟MԿ ?dע7./Qޏ@?G6Z#ο~ ߙ?_F߅ ?g~(z Vdy5/O"24iđߙ?oF߅ ?;ivŽl?g2< YN3[:y9'G_GS]7:ր8t^WZ܂ĶҏYNF+-xkU#]^}im- <} %Ҽ] gFRaY`"hV:@Q@.i(5[Smu|?Xڧ.#@;?u[or.羸:mą@O}% &caSJ䯦sFi(PEPKIEFk¿j?_ 9~_M LAq 9'(x^i11WQݘkeߊM|slS~ Ťr4]4JIX=χZ&̬u)u!!<^Aq@ 3IE.h%ۂ|C-R]YXA/?uھkK i#WJ _C}Ï$x~E*ʨCF!}90jZtF ж `|LO _Ȓ0e# %PEPEPEPEPEPEPEPEPEPEPEPEPEPE ץp x3㗃gH݌H$bPm_:M3sh:`S>9@}|7>9<#M?JH#ϭsׁ>5yn֗D)q ƽJ((((Z$J9r#sҾ9%xK/g s)h=:>EmOÞ!Q3Ѓz34qH]C+GcRW]Z^\((#%_Ҿ~O~߰?>~ҿckWZj:X\ϟ8#8ckPB8A"P0ok~ N-;Zg>y^.m[w_OLBn {V; 2ul(((((((((;Pi\((((;hY\G)fs9&m_:/Ý7^[4# 3O'=]~ϐ?Cx5ڴwsA僋F}3_YNNkKMSA,tTF#1''QtEQtE-%0 ( ( (<ׁn|?3܆Y\1ʇ󿅿m?>-f Qas Ͱ%v>}ep&8;7ݎٯ/ۣ-0^eURwiP9 ~oZi]?N1ϒ;.wh$B}o{e~37U}{>?yqF= !a_ ( ( nŴ擤h^平ȹ~W_XO'?tBZuypϦঀ>YnϊV#?i:=Ŧ3Of)=[B(r߽~8>Q^:O,;jʏcy^; 3t]! ?G%r19VJG֥ t4_ M޶v^!g-qjSU{ӗk7K[[é[PƏ&Vgoρj ԿM?8 yI[dBD̹*y9lp8ab t$%/̞xE7_Q/2:ߌ>*|.O<:- 8 5y?:7?:w>aw|:inmmwUQR2䅉O4O?:_1}G@qS|b΁.㨦?:C 29h旌?aߵ/> {a[}ۻh>L?q]O?7R9\8(PF1ӷҁ|*Yk=[+uwwn]XP1(P0((((0fm-Tw$nцH#i`-{sGho+? n-9ҾVݟn+Rvkf}]Xqe{4A0q[!f{qRyQQF븴RyQQF븴RyQQF븴Ro{дQAm;VյM>94HSLAk*ODvEտmoء-P!kSZ_MOcw%eN1yw@hx=~ lpP@;e;Kd< ^wÞ\xK7]f2g ^#F?o^- : )nUIRO0rHݴ(VL.Ec>0\|Fމ'.l'Zۣ $c,/Eό7,ioݠ6bAqgH't }E|EE ?M&VZ}445c8¹_|K> CO>4}%.Ng+GI {`gE1S+{^"߇>+}o^M[$cq8dG]X(h>?RoxoZkVocf$pH&:^&}N<7R鷉wĖ,gPxl z'/ xC s!w<|04%7fx͗hЅ{5x^;BӉ4| )i+ (EQEQEGҬIcZ_%3#?# ^^-R/0ʼnψdR͆rn;?5c):/ PmFs>: n??ᑾώ[.^ޯdo??5`/: n?|0}^/ |ut#|9G]{={zW#|9G]Gt:Xj?5覫`֩ K\g,V21.RzobK Yiϗ1'xE_ p/ןգA>!EBP+ ( ( ( (9;Zfi|Yu$j6X$!@_M7C??}MuQ9o),?5*/ϚF?<_ZG3E_/"/^6|*UuZLvȫs0BTu#>RO5 +Oi7w%+fc9\u5{>Lgo_EϚ%oH΀!ӎJyۻZw@XxLcܪ=_ZAzg W|ֿW_|-kP!ӭ5ivs]*۾=S߈>֥oΛcv_PQO5{>Lgk_E/3E_"W]Meez3mq5*t+5 hmfKiTj?]6tbPz4QEs#((Ln~1{Cw[+ZƇiHܤWzWx;_xrSi km(Y*A 8<^s\\<;䱅s+Qs+jή^|&uxGImQHgRg$ j~x5noiOwj754 T|| tW>?XˠJgpejUh9?)g{]:15j6q0kfKȊ1<Sw%ҺO?Zl`[ؒ(B̼,QnYM/u[{(boW(LV=N9?,%7S^Z|rY$mDvLrB6s`W_+ֵ|&֮)ѼIqi6ı*O׽4WG? 'fW<;jZ&(l6*`#nMJOQ߯|>be"$['TIX$=6>4}>_XKg\B-"D'_*x/M|QǧJ+?ˎPxľ/.M mA&?F/)|O,?qMDO,;_z0՟Eo6᷌z& Pc|}~_>EuK 5b}Fċ6,&S$\I E*> 7Q-Kv?a_]}?O_0'ñ3`_]}='y|wCOOM>7?2tȌpI5'CA*x[෉\uO]InwRAGbCÿ0u9×xN*ub:E:ƷOSOfK"IUJ=|:֣?E.eM$^\6s Jg# kS2oѭ<93sqs6:/42m8H!7It0qj7Ǻ^s?m$6II3¶hw4 ړ>ҵojtXjZzcy JKC:vҵ-E`UyM&`J }*YVQ]Eyk&vMF_%Ѱ\ 񆟭GMXmm0͌WL _ᧃ }M Zuv NOM[R{=Q@̟ȱל\?Wu5@5˟@^gCjs֚5lP} __(xTFP(Ek)XՀ^&wÿ"0bvgҀ>EO?&Vo <kϳLW~߉z^xWĺfnW 'E~>|!A\Si bU lUOl_ }$?ڮ/ =#\4wW~_(4׳*px"??}MtS <(c&Ȯ}΃j/mѵhF95>WvZJ_A>Xđqp1O0H^M c]RN~|x-i!H֭p.i*tKzU丹*e$[![vZφ,ӚoK%ч2[h$}3>[n&-53*]A$~ZmsFnQ/U~0!;mDYc8ݽépA9M@vZ|$+sh62le{afT R x$zW܆ܹf"Nxח|F |{]k@[+>͢hd>]LdA(FxU}}Y^g: 晨TӮJK$?<+ٓéៃZ Z%ŬUabYTg'+4x{Kl[ 7mU\SֶR ڡ@cĉ!J;ԇH$t^).^ֽ=Jk(:Š((F^/,ȷ/W7zgEҺ3Ƈyg>jq|d׎! EghF$8Nԅ"%9MsVw4ǒ7z]M4/p i"۟t [C=2xV֣űE/X ]Ey"Ð~m{WOs+ƟSiNZǥZLf0 arXtiY~ờKZЯ[\ƎB4y?ʹB|@g,wUtxG .,Է0! ۖ29;Q%C׃|0R_dyX 4o ivv? MO0\ݞ}:⿉?o-?ĶڽMsi6J-EA 0}+c\Lm+ [P ^kCySW$u]* ?x[^4+X%-:cow/o >g-˳@;bb s>x&ᝧ|7jHbYK ;sQ{φ'/eY Legz~Qck4e)ky%\a3d?lg 1M.@ ;$Gmǩ4Žr[ZeD w>- (}_4_Bgg/} jL*9YW׺RR?N:湎|wB4k_Icw,6.x$Y3\ ͐ԞGҥkkcI26r%=Z]/5,6 *˖%}.I>|[͞{w;v[LG"~7 ) \[/5mtKW:%@-$%88lq_?au.úNs]CJ5yE͞r@Z+E;zŮsg,>QbWmAX/Rz؞]Q47^Aas{K),mlg'ף|>]Ώ>je$d7$s~(ONj#Ζ!,w ױ~+aw^lgtv *n[XҼ[aOJڛDl:އbe]~?>EqRn^&-r7tӭ%I*]N@*)]^7T+|s>}sxW6rƻcEEUT**/`ڀ{GšTYh7pǦA F$cݻ`P}AU=h╃C|Apǃ`hui4sJ~ DXip1߂}+7u/x :_fkI~2,,f;*Z#2z| 54KcY|Wg<2nX܉7d#]/uzeo#i_6$Q^|e5$,"ףRͧ=bq~L;A84~ּ[[C֒m$7s$].$8נ|-9>Oxǎŷ' p بFNF* n}gG~8xjZwv]Kk"# F{Wv+0| $sowZ#5W[F6kY~RW#s^9Zl`QEx"??}M{;t?JkE~F]NyPzQEs~>0_U-)m9\oi w:ǧ&Q> ?Gߋn]EuiSXIʆkV? e$f̯?gRLg,SƇ; 3" @< }!J):>E'a'F׵_:H$t]rP^EW9QEQE!<~~1{3+?f F@Ic~Q׎ksk|?4 GZ/n0N:ѝZ4jv r.CITE݅Smso-A-h'gfme,^0G[_oV1&3,L`Cc 5_GӴ4{qυ^#Z|Eյk㩍CQ"WŸ)dbߎ Im&Htm6;( K q5o1Ñu;8.Y4{mP=-U?e?5\.xŠiՎ#|mX͌J`[ (|CɠŐCճ>/kmoQWt/j. 0G3 B<C4s}}kV7S|/[+kV#s|֗ٸo&/= R^x{XmuJ8퀜_=~˾&u[=Q{p,tưS%@%I{=+><YK=Kh+MB HCpq^IUT&J=8Ǖ*t@~8dk>^״3RF |)%j83~|)%?ŸZQ=WNJxSKKO-zޓ1^XΗ6dцq?)=__u/ kڱqF?){cx:ϗ?}xSK^Տ1qGCy/-J|,+\GmmFK˨nfT 'a'b|V_cflÓARC$+.A`wƐ5L[ ̗^B#\`g$*KAYdOnT0MScȜ'&/33J:_ }xdWON~_hqJ.GA?|GtNǞ9~tr+i[LE JH8W\N|YY67P62;cc2pFIkKK$a8>@AX(#t5gC¨u*/:j7GyY9_Ju+Zu9.nH9ӵ54DmғhE$׿׳mm{X"^_?#$׳m{X"=1 g?{imGO{{6FG/?#'Ə[_|?^ʹQzQc03mGM}># f=)6{X"~_}e|nŚݐ$Ӥ~qF1@IG{l]:~op9B(B+?fZw{.*]LfEgoCg괹؉B3?ʟ?s ?>"u٣5Sy2Ï\.eO]zhޯ0C ?0S.a?^3G=>ǐ*|8E 'Tq@Oׯf3aO?ʟ?s ?>"u٣4{zSy \.e?]zhޯ0C ?0O.a?^3OfŸc'íᮎ_f̆FrX$]-%`ۓ6IEYQH`yݺ$mrjZ(Æ92 Y"1mj(8ma]D\ ( ( ( ( _ 3Ii&4wǥ_NbҌ+w%SoAK6 <[[Q"*ǰ1I~HB-QEP撊(J(Ƈ]<$w"HV'=@Z;6.@)b\ ÿsW _ hV2Y[VpYɝG 6zSi:iKh`PEPEPQ@Q@Q@Q@Q@Q@Q@((((((((((((((((((((rV}wEI!>k|' vVWA\ֹmImf]D\QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEqkA˧̺]舠:A;[SEfl9'moI..颼ÿxfFU+;xpġ~j{j~gƥ'= u4Ry5u zo4y5IQYCk-)".ձ`f>Ft>$W_+4>.iAw 'X{idOI%ec`@cc"'75-+X׈cRÑ݈&ql998Cw{ 8"|𼖚1E.-ckw]0A^+0~ձiåxwC:^i_%"-4GS'I3+xl:^(4g ?  ۑ |/+wmMZ W}>cz珸i@(#4PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPwQNW#|tvѩx ]CKZ$0G}R$1!@3m'364o+KMN঑ ZZ_->dx+ۊz{PzRE (Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@fotocx/images/tiny-planet.jpg0000664000175000017500000012504315247006660015250 0ustar micomicoJFIF"ExifMM*JR(iZ0232~0100fotocx-25.1: Sharpen: median diff 2 17 16|fotocx-25.1: Crop: width:787 height:240|fotocx-26.6: Rescale: width:708 height:216| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 240 787 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?M0։=8ŊkEZ-1QSJc_G4PE!N*ژb%|S AG Y}U?xY"uo薃+%&-٫/<2F;ˋB 2{lx$w"⛅iioW̰XJ|0Е7$Gc&?~nG/U0xmGQo)eݞPUH>T 6#;)n@h2^:gٚw.2;I Հ>汦J>Yx ޚu'йE~Uq\ fj Hb|c5N޺XRO5x``͹`chXq)1*Q%ԗrw1CiQ5x>վ;)yZ_+ڮ}GUɱLGN؄zS4+F#YNqҝbRT*cqXe *ו@ڋ:p:.&tN#)=hcU8zT>wt5`EOXUrZ+XV*b"ŚbXa*w ,u"NJcX\)G"h3*3a<6nGjaPj$eY ̎hX2FO^;85/\w|>6~$8Vt|֏#Dee(Hp.Aiw1=kc̸ 3qhf[wv6&K4;x#ශveLPbռ `@?ɤ,tȆ:$-w<;g[kEO ' +_᜿?wgמGxbeVm)$wžjSRrG +HEi0LĕtGBx\~ebAh~0V޽.Ƹb;!jG7=3ꀏOF۬[Vci+̭ui8|yh\*ۺ:Z[zJK=ߩWu|Dhg# ֦'ݻq\r>J*G֤]qGF8XL?YƞW}avLg fOUIJ^"UHL+С)~վ:ӐDo`e*4Mcrn+Ծ\HV`}Ƕҫ8v̪Gcy}9ꏑ5;s>ugU742D;<~sx2e"Yֻ#NieG )jnzF2>c-|7ɶ@J:c8}ot;0@Ƚ7Yg%!]>hk0?vHjԍDy)1Leclz?NuF쩨OaXGOXuڞ"O)TL"*9cy2RyTs-.zSUhENT eXjuڦXjbS,BXjUL9J/jc/ja0JV!S'ҤX/_xE.`n:Hq4 {u 86:ز-&AsnQ,m3WZ v#b[+yeıG d)B|@׿½^xBKcZރe淎a]u1Y~p EͮਕO5ṞIp#[v`?*a l| e#qC tG9i;S<>6% -"5exٱ2ȹ?+`<%Vm3R7ok1"-1j%^Svj%F"#[D@i\qPkŻ<aWK''Ρ<@ ,%4F&oEut1jleskd'~ףLNpCF*6ka""p$g_]WU? [p>~FuLNZhbӼ+2mUu4ZPtNGljQ.?玞?PW7E)87zS$|z8_Έұto#Q5 f|+OxAyBM?GN=Hu$i?@)֢IQX厣b)ip uH楆O F=֌ݦPW֊Uugi&{07G[7=p0Me\Yxj96Ed# mU}'JW\jC# |zJvbB#\ 8(ȑWmL ~1yu>CTԮauCʯ"*p>S"?xXIAHKxRG+x$C땩ĖmTWgQ@ե_C@ھ$P.4MlbZKЦ}! %ro+W8 ?Z_kx֬j_rFA)Sr>}bmz'Wۏ?¾boM2}"U9iO03P*f5:={ μ𗇯>l \ͲL[WM|d.4v'nawm 9֯Hɻ\U! ݊Ɋ篾0Co47lʤ*G񶣧0Icd2FJ;w w%@d `ǦzҮTD oMW 5 *8Wl j@r\:ɮφ5 EiWˈ1N/-bNXyoc%w3$}ku8=fzWX)IeA!*H< Jc$u63ToWR oҭH\X \[cR-WarS,5h[:PdI>¯[71ɏR>#,G(O_o#kv56.1[.c8s7O/19i\sOVO"ypw d %,m"b6mF |==ǦHkj} m$HB1Wd.+'~iĒ[ "Ct߲'~5eUEdy'OH-խ&a ,ݏƾ/C$ɯΎc$@ *ydeR (4f) )-u4Ǟ@-4HIy_lؾ jRX bE5Der8srxe.ۜW?"ijX #=x>kcşxZ7Mv4-`mn8oʶP s79~h'e \Qc I:"?{,97YclR݊>"ҮN]V'S4jz1@I+Gji^񇉴3?|CNhcd9 sYΏ?aVw@[ FLvѨU$g=^Y kh's'm4Xm|Lr)i!xnixF[K]Gþ5kgIav&ڊƵT~hB ǾҿgIٵBiOrq?xďh;4 ¾(jщLUܾ~8鲹t{L">IYռM.i='ر?þ7\CqOĐpǜzS5^ğ ^Z #}%>mϩ Qj|J2Q/۫_-#.N1]Z/o o-qː:=Iwx仿Nbӑ6x>9"c?7avъ#Pfbd+jΝJ!C '$}k\XFNJ|#0-X9F?/V*ycj[y\|;YQ2A+/~YjvZ3_CV`A"9I<ZmYgt @f2qV,4R;{Ky.g~Ĥ_K-"+}S;G"Xf(rx=e%'dx~(ribpr/c5} P5iu%_9@tƗš2j7-1ơۈ`ڇ~9LnGin1\Rzwo xzO%UfYHޕI٦>|1sAqxxA,!gi%[Kn2 01q߷5/{ /oQ ?^7u+#ĞO5f%W2VȠ d1=9t?%").Ga0 &8PG̯qIAgC /wqS;(>(QVk*AyvWK4~PB@Xdoc F\\î=lދ[2S$׹:b$s[\n~%3ٙ/O0'h1rdB}婟L` #zw!A7101xk.$v mGGൺM CqBFJITDɍ;t;W77VE%1Um8bOnkмS6o? WXl Dhh<٦#䍝8,Ӄ޸ ڞ8XR(ds׶}H<םY־"ꋩxUfܐ'w{qDqM)JȉP;xR:|LX*~`9;p:Vz|QK!F]Z6ݎ:t:} n ęeԐO_jfmFIw2 $瓎qb)M;:cdl̪E>i\}BGϸxh7-nlKHĜ`9W0gty^t LqVOa}x'_]x57P[xo+yHgH猏ִxk-Dr牼U kq)F+Du)v>m!Ʊo|A%K5ĉwŒ7r{{֥`{:Yms ## ~Iݶަ=V^YZvqIpāӵ,^Qޢإ$yF8#=T3$D~޴ynk.}D_RO![^e.FXgJ '_Z*{[1 6? USJk$ Ztpo-]O Tt888 Lg2;[#_'dRWibukpH0r#8=9=>G_$'9T޾?H'mOG5wQ.YY zX]7msU7>U*j| Sԉ돴J9l[GPCc rrd,`ϭ4& x0.?eI?E*{-Vb064/6V:+Hhje/޽|n#Tԏ<L nQ𷅴xsNE[E'֔VC4Q,y9?Sj#Ե2o\#WQ8U{"YG#.~e K}?jhT RRۃj}7-2KAiCC4e,omF }jo!dZ?%I w~O婏x D M01 z'ORrРy XZ oe~R_G26߮V ڬ}\Dx ?ӊ.isTwuP=Tc=OOQ<$Q|=neYt+BV j/A'( j‹gNKqe+&ssɧ? ?G!KS\,ab圯@sjY ^Bn {B`'*{m{REm9*q(Z?iqiExk kW:j ]~L W%o ȳ$Q_8$C#Oӌg\u{0.ŧ$D(NF=M?ewU^8DtQdy?1y櫑6';D/ڦam2yW[\2X@򩯩iMWYվXi±Hf&9}I=ֻ).X}ysN+_|ci:du ¨XjkZ-quq 8rOw"46r=ם޺!۝"Nna{8^;ψ' sjVQY+Wq·G\V6u3en42UL8?ևMA)۔ͰON9rhs;_]X̫, uyW=ch5י/ f JA<@yȮ-BI?t~@9Gm-g{ f؅*@'g `dtc$QaW!В Bt;}1ֻ5{ ۆ0 xGaV5 YIitmfHU,_PppXRz➨x|s.z8緭3^;on1o<]S:c|O iy6ʊ(%85'-dkt_lG"ðK"nY&d0改4HnY%dʹr SçFAgj{D{wwO5D2CsSƳZT/՜YJ~m?jȸ5i> D ;G~Js\^Z[ƎIHP:T1xLBQy%crlz}ͦgsuq"I"Gs{VҬ~&oM&6jxVbY )y8$)@`җqբ(2+ltAVpb,jbuC3$b,F_;Nsv^.WikDbtǐ[GfJhc쪞䷚pwKq.1_z?j[DCeS}꧄.ti TjU"`%8:T1д@[K]N|GbU==#ѣY_Bvr(+nvᇈk 4ۅ X*X=¾VY-WNXƑ2ER8ǯZğ).m~g[[8,[n8M- k&[|E_e x| xK\^c̨dAUE]?5o?5y~!xW 6IH&{3B.5[ -gw,opJ1#Nl@ [ xzVz$ F,wa Pw>-hE8mEs{eD俴\vGHdkmU'Tj?I{MjUHDmq i|W_|'60$mb #BP!;# SjdՄ [@_ե$$sGxfnYzt ڂ6[֎Vvq_1[֒,Es/5XO}8ϵ}{ZK{^BUe'T2d%p3߭xr~Q6k |2qK*&kkχt 6iPZb(ź88$Ct2xWt]n^Vr@A,%A )_>0ľ tt{}/QX= ,e0z1o ~>l qZ.c|2i3: imf Ե--+i~.Etbe jrFk 4ki4_:e=J{IZ'i?#os_OU;t{cV&GP*#ȪNjK1od%[5$vv'`>Oqeo4 :YYGX`G4˱$Rkv=r3$HV.78=GѪ_Lu Kn=GҩjCƓej zJ$9 =yėdrK+Vdž}I F:;υ(O/s~y\ߪ>/|-E1W?/s~#_[GtYJ_XAHpX}z ;Rr?뵬 #`8@&8M~iSZ/%ⶹ(`x.Zۊv4KMikqh;}wr9$tyh6^8$xWQ]Ѣ'\Nin\s$ uW.G%wsЂj)Y(r:;t24y2e@9=y^/ dg1j @AW8υ^=R->@f Ԡp>\Wm9ڋVPA&J23/^[{Ư2-ҤqY RFQLck-ym;Le&xA힟tGݎ G=I+۝ YjjJ,!*09:?Jq]f;Џw4~ǥa2jYZf_QB1%j<3:-JDA|2@*Ge((/Zkl  $^?K\G}bM$736ڼ>֚x%M#Hf #bu] -mt)os⢚[6^cZmM#%RrN98tMWJ6vW1gVr-IB0v#CIxIt{sdy^21};IDѨp18##<zQ[>–xY+(VuR)+wA^Ο}Wq|UA:ty ce+!11 y9ծ =Ŕong!Ձ݊q#ڝ޵rdU!e<ٻIYO ;OZebYKcoooxc ofF;e`qۆӭm!1yH$okZ^k>U6I&pTT\ѝ2>Ԡ ,Awo<,z{5m(Flci=H?S^A#REm_LI>3F06z7%ŔnpU'%HB=ni[L"0u |S HVz6{]'UJv=}vV!@,GL1[.uk0DS!$ C <v݄L@UE8'tzWL=6/āi|XZ7&[4 {zՙ|w>>%hɏ{, ٛ' r#KBL;vexrFO'[EŽԷqbvú5*FxzƽZT]mbp1*;]~- n&O.1<ˌFkjx{B*a鷣O)[6ˎh8?5S$Uגy-;*QZ8&GF=x;lC֞c)y l8Et9e[5wYBXa[Dǥ&EXRM xsГ^m/R?JˤZl}}Uo5?Q.7uV)0v}]hՌ)=wl|1aUpq*a“5}iscj<:,spڗxeӭLDƹ NOqϽ8b`c}%—F D-?#Z|3<X`A7"^qEzG<1wh][;Dy~[?kk؛y{]$b$I"Q'!#ε9_S5Jp'uKko$GNv#ajinL̑/$Nr|wmGY]4Ydoڻy<c*òe$ZL#\tHN6N47"*VR 8GNS7E[Imi&PV,0.͎9"Y M#ec8^BS=>Sw>ц$ҡBRܚZ`MMTN|9GB'ީj>2,9:|rf]"`A{WMs$$v !GV i H,o)d#$w'U4#{ԗ.$M.[8%n{xA%R7c0QԞaЂykᆪ:dIOvq]+6ue5 o"O8'dtIlZ6078,P!\Pc=7-..UMyB7 0XqۊZm*8dT #UI aО1 VhMGeIb?ߥ8IkJl+YjAai!qz*d *Tڊ2.S@y!k״u{CaFH scsTd֣ vrNԀc-`[Ah$| @xɮZRgXlٸWz9[n=^KlmmEZgtcO7p[*,#;!z? _Т7rxCNXZ5&uF=k#xZw E[moM0 H98'ދOCM{MԮZQUugPsު{K+ginvMr23TZ1hx|x׮SoY\|k&c&R/e 0Y]CZ]ofHQӵ{d|bZV5 lZs$(#T7J#Bcqmous$F H\mw OW-(\!T{?|Jc-.fC󩣆8Wlqj:{?|G!T;WZ1WO?_p:}hֹ_C?>*)cF>{?|G!T\9NG< ¸I I>nڂRF9Z~߿q 0i“*ȋ!Ө\D46g,wbp?{#>~?; 澶 RHW@_9MRЕtE+y m<'}3MRԮRt/n^F ;m8\VO{}ƴTfhmg)/tTdAxϚX,.X#`_.9@u,xL ⶹsLcnюk+z>g0p#<{GAkLʑƇ~xB͌mĽfޟ[B{lk+/Y[[ʓLfqVn7|1^ǩ;^su&7,lɓ`k&Ș$R "Uqy4E*GK YbHI>c'7p[Hl-P**G@8sS^5L-=Ka1SsiKv 8e8=B7c  Xaxo&k[`*Y@}m,\t-^ixwKCx'2Cȏg-Wej}GP;FXi $2#+qГտ~4KizZMy J9GʓlןVm#ZGç$7JHxBŸz,* gݝ9V#E}#yw 搲<3y;\ƽ9硌l3,SOTXڷ2e/V zguxÂ+cI@dI=3*t=!..tKS hpldq?OmK}ZX;Yz޶hO3M$tg)-ќk~蠵״˛ A-#OjB6k{[H`:V;8-$ǧ둪$G=5~ݷ{hJw_Ff,; #SDwd]ޥs|Oy"f@niJu#̓WuE"0H&vl#nP 7'HbєqW<8Z'QmuJ#6xm_N+Ku [M"Wtúu_]#E TN'""O88Oe6іm5m=;X~HMf5R@p~SX[ˁ$l@ǝYd:9=k6׶W8#jK*of2(JҏGK/]f){b#3 0#<Rn7LfvR_q LxJ@'R 88U|A?Ł[ZbX&':~5[Eyqb-ihӫ] U¾0Shz^ ȒIYL@\ |9uN/Aճ]֍íyh)`I Y+r2>kJO 8SX|*m0r{֊R h3@`ʌlÊ*9O-w6o^ٛdi??3m> x mb `Aoaq") ׵~(jnb~k_ O9}a3YHr Q#kHѼO \^>}!)-}nUgG#?hLEcZSPԗUC20n^l:Ub ~?<>k+M7Hi"E1E#%=] ?Ɵ <YJZ^x;%̩򭓲1- 1H7`=F  "Þ&Ӭ ,'vᴇZRp<ɰl,qj Xz/OMGuM ~,_!dar:q_6^6 5-/7KiߕgAByYsO _h2˨K!28dϠt úmiH@.=O4uyx{{qs~j* j>!K=L)h;lOzS|3_ ~ ]SP1mKv睸},[HO `#DP@+kq^&u<={XZ~<duބ0k;B~OyEa ~f.~S=l}K#J^BR5}+wm7F?Kkd^W|kxH,֓:/qye9N১\WADb(;Qkni}sOo W`` 1ɬNֶ6tpf `EO1_C|Mj?hX1Z,? f>&Z1_C|Mj?hX1Z,? f>&$o]m07`=04IxK_z%BR䙊-l8>ZYKVNhl%'9VFy_\sKYʒ´_/Q!_Kz2|3񾤍d~#auK(! `㜌u#+hՠ~3ǟ_OH/4/ S%.fLfe8}꬟~x+A4Wv+yW*;>܊"JJ!mƯ ž'wmHmwXgaI!O[Zkk˵iG: pO=ԖN$Ave Ncsd%DWTAnB(%fyuv&pR@|GǴ~PMP-F3r8Dҭ;±̞AMӐG>k5 E>ia]BďN9Ѵpɏ8mA+;Iͳ,tkYY$.A03x^!t 8\ȂMpSòîG0+igU >׷[Y, ^0xզ(Q奎gY,VTP2AP99sdՏ+>k[\,rX $ sQXZn[h[c9ܟ1 㷈g;Lsie=cʨCsAqg^ .[SE.zKQ~=J]Xy3O—:z3=#CNѸ*p5Qm]Soz+[%`ׯW&ўѴzS1ٱ*GշI.| h#wg!`Ӂ-+I&o:fM흫)y۲&\3@P;S[̭/|BF+-֛<,9mm%x)_ bLG50|v+0z)֒21ILV]Iu 9|Ed/d7i7U#f}ۚ}67y/|KsRI$ ֿ_ ڍB+.|ik4[>8&?$h! ͐JgddDB_ᆴ%[LGJɷ~z0=)^[X{o'' xH0^N61ӽPīf2Fr pmfӮLFFC7L 0*~=Ƙ|Y{pTL+{Q%Vm ObF b0^nSkⓠcX%k?>%7phm\F!˖'aόInu \%̅6(xCGj^ʄqHR(GQCI恠037UlB2~hH^rV7|'2&2$ׯ.v+8#X/'hi?t jPc}+v)ZB ~mjKn[,ؚsYGzIЀJ_JttƝ NAJttiYG@tVg%:?m?)#o} NA0b5*Hq +G^N?߭,1cK7AEQEQEJYR2(L 𯌭.l}֔):׮k?(>xF$<z+OjKkZL]BU{p(i#Qw:"mP 8l?*vu"]f Fq#9ytO/QV`b80OMr "3v =傻~En;Yx@ d7u޹K݈Q$F,W/%G2)P#qߞXko y߾/3ǧ{X{jytu umc=Ѹʯr:ҽ dœӒ?ZLvU7Qd8\~A&/Ȟf܂ПֻiMsԓL~*I8.7^*yg2Z\>_q+U iONgciTO^Gs ZBSL[T28ǵay^w8hO95z% N)cj㒱p ow[%w4˂?Z`sP$a!ڼTo#jvkm>,*'C4j$'<=TVxW2 <(c'][ |?huִeE4)Pΐ0 ^A-V-~Pܠ`H ݙJuj-Owf#䑰s׺8 C+,>Sm9Lc+e漟UEbFH'5ϊI$zᘌw낲\;hc2a89?Zk>GE(}uGT5Š(QEQEQEQEQEQEQEQEQEQEQ((((((?_u5Yz|zlz0_D?1|T>8A׵7@2g =}9jZ\THг>1zZ4؁_qO&v|ߦ|%`Ե?_5{cQ8 p \&[Y:]}uu+ƪA;BUxՀ?7|vڭŜ@bd *pwbUqwYu>zgo աC–Z\=-zzW)q?xG>"ƝKzi--WҐ IRʭc_n(BIv'>\incXF9ǭ2 ^9Yc.zM;[:-:-*T~".dT2?:|)c75l`cRps,6K=BNEh 4'?-&)8`>kf)cMKmMlvvO3nfn;XohRPXD=VOӊа׭5/3/'%&BXlSG"?|Ky~a/ ۥ|6ֲj&IHe$9=\㴎8c?EF0hyq*I]9y<T%|Y[6`{ns8Wu}eݪxR.tѴ`HH">$G}fh%2DN =3X|f>?c˲nXB{]z6$Nƣf/_0Y5<3mhYzR^14ݎ޹߈?0:u`ͱgM~:o)wp+aP$aT/yi?R3RXjpmTI&^%/w5wBI\b2y#<F񇂼QWz6hWőHfƿ8Ծ]/\l岷)6" & e}xg2?mnj::G>>^8ikx_Ú6^![KI!aRKE_KnMo=jZpt$Sy;?zbg{׽k5tB%4iַurm۸p#j-o{޹v)r{-R A~9/u[_ @[.D0mNWTZCs ּ_aηMNPhm|P9|P~i6E"\T|r)zOQ3֖F ((# C&?$>Xv!ت Ċoɩ7%~:<ǀ<]a[* Q}kg춚urX۩H5ObtK颹 7 `sGN%kYpDH}+Ѣv=GxrCmok5z@۴)aݐpx -5+)-.^\t]Z۱zs^lh[ vټEnGǯ5ST״.T{Fr`d| 5(RLr̂42\1p@8Tn60ˆ\:rO:j?c%g@Ksx^G+b]o.mox'=k㆕/øu|[)hu{Kܢ|F1yx{۫Jۙ]^*wG ȿ{6qu$ Iq6G͌pss\u붎UDMIb D'uOH]!\:Y$R`4!;nJ1xNRTՑxUK`g;6䣓cQOhqZxWBf점7K H T ֳ*Ds⭅s?_O ƣw$ig,=9sq\usN1_dڝ>Xw>zUYnLJGlpN==|)vVdBWa,#[ont~YZD̐)#~̀:cwP2?Z%A\,a22{ w޵atcI#sž!okizRm4q: ٦ᙒ1yo&Wch^;f'\x]f7Tp#_6jڤΣs{te]qЧy4kZn?M':GE^^e/ɴ|$GH(k9(((((((((((((((((5< rz׬St3Iu~h>w¯J_>|#]ߣv~wRk([]'үQ@?I?fϯ—]'* ut#eǧuf?jER]Lk%?Wizq>˭?V&WګMQ?Oq>x'(LY?t˜!?pŸk40#)= ?KOSJ v?.2K}Z .?L*<\vVP?"G$V)Uť/[£+?oIfQ a}yŵ"Gf9Rmb\tb'V9⁝EdQ@Q@h?c}^W~h?c}^W}=$R?nv|%3Pt,pq־%|>m¢\-NxPp2?C_Hu9VS}w[𽖝~.$hC,&6 jz#M9dzY< Lesh'9$?rKsgMF[*ǀP~Nq~Ux*.tcԧUFʼdc+vQtnThhHH~;$#)O N񞘪ViE#*Wfq{ʾ4|[,߆h?"3AJtc}M&RVOA^4~nʺfYvN%:RĚJdyғ?M':GE^^e/ɴ|$GH(j ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ?֥ei0)E%Q@Q@Q@Q@}8pNJ'~%{:.p:j,/ą1Ӫc]83o~KƧsjuvx'?*qeQi:u KGM_+ <*L*R:֟*_|OƗᨯ#J/&1bUI5~vkޯ-oK`Z5b2M{{; CQ&EJ1 z+` jF%Qn\Z\9lTs^=~>8m3=U}b[W*rW $gkּ_iM pn-sW5~ x#N&ΧnҭV[+7a8#!x5zmWo<)qga?inbUu+7SG<zz"[F"xp k:?CA~)O C41Rpmb8<{|( jZ׆nmCKs}mɏ$d>1Rac}K⏅to A[i~+Gtna֨/|=$Jjf<~Fr:{WWÿ>Kj Ե3ºޭ%Ir:ɩO$ɩO$*[[" )`pTAE~#!%]e 6RAk|A[ڄ3dmyT =>힢(1 ֍2(V2 ]k'{h`H {Y*QUB}Q!MA2Yc_`=1G}7GrDsE [HbNeq~l c5"M5۹NG#N1_2Qk.otḊbYf$ts@Jd2P8;>  RY-ϙBF\ukѼa戮佺a8fwTU%*m%;/I)- [8]!K[I Лw-/PqqkܴKMUEN0D'[sPiޠאAp"6q8L{XkT |Mq4b4ؼnY-8緦k}mQe I)黿J՟TMm y"! -6O$ ifW,T(l=Xʤ3UNZDSCaEUm~U<ӡ2%>|N31ܚ̽D~ ƟAeg'gC`gu Kho"@L&C~=`5+NsB ewXU|9 gq8cm' }sxF1juev@$w'k#f[Mg҉w=NSzU#Oc~(|q|5|#*\V}IW匒K䞽_6K3#;%I'>dy򛛻 (X>أU_GOt"6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ?E&:((((((3>K0-bF2%km;+b*`żi?}1SZCR[[kT}mQEq|-d[r ӥc 1 2 3 0 0 64 64 1 &eXIfMM*JR(iZHH0232w0100fotocx-25.1: Color Mode: mode:2 blend:1.00|fotocx-25.1: Paint Image|fotocx-25.1: Paint Image|fotocx-25.1: Paint Image|AIDATx]hUIX+hD`"JDT?U)"[-Tc,U+Bi}ѢE$HAkww>ܙfwfrgfKܜ{sΙBP)[1y3of)y7]u :`i"q_]Q*SW6-[f/`+88 ,OnWGܔ~.Pj? Ke޳ TU:E#%[r!jPiIBIX Gιkچ1y.rM'\y x4- @ؼM`=i_n'8r*h#^9u3@2so@:o/# `-r?"Wg3pnc۔gRf#^j{>4 L{j`X m a`".00?liސ>h=a"MUm)y1E\ѤM>mO7CO"ߞOnl{#0IwxvcmJ=Q) A+|LEn}Su;ЃA}`]'y. } {+ @ ~l{@nG:< \೟V m@t}p%rZDfå5q+$ vt+(9Bˑ7P"x4Naہ3[)&N DZv )}i׮L6SN9`NuC;B9Bض]][U2BLb4V!Q0Mp?Ȭ0Ls4A:/~](2B~54,7<4Gy>2iSAfx_0X#W'jt UjȻY``5 Nu2nR)Wq凑m.oY}mW/vgj!8+U7KqV+IZ?F|E^qm@W^g9cPdy țkCIENDB`fotocx/images/unbend vert curved.png0000664000175000017500000001762015247006660016476 0ustar micomicoPNG  IHDR]ٹ.IDATx]mfWUwXFNK "Em1D-hbli&`S5FԀ1R,Ж(UDP hhL&MʏB2g:23zZZk3*{쵞g9=vvYY oGO>zq4T777/:y-Y{+.SNwlg2XݻwmݻxN>n|neK.{-7?t;u9I; llllx/{+{Yض9=󖷾w[k_{~|1,5؎}nW`}}}*^rzNl-h@sxrl5)%PTB].1<{ۻG^*䰶ԾooEw[_%Ծxv1c/m[FvדX|6Rn:䀬)38_){'&b G738z۟r#ЗtصG~;o.xYil0D̜2 +m~lzq[O+j XpM^,IῈ`>Gm5{>rk_4K@̜[1ɐ;:oDhΕ"+Qp8n>ҋgD4=&\DqC/o~QT`:a^vOqsld351mc>aԬkڦ>2%G6]Ұ|lڍ:G8Ђ6]iYr孳1w,IJN 7,H(W^20daSs4 t6M9_1bLkr@ ||p8ǜ 5N2RԀXǝ\E=@jy].Nu~Vg|Sa:CEo yŘ= BI:q ЙyYZeFAV>Z|[5#;EVQgZm3+- X| 5XQ( rT 6<"qL ⵾UBO<"v2NQ{#S?g܁b+`}zL]Qu+"\~`de0,\yq5ɳd6bG-usSc>0}1 2&V'p 1,/&IGrd|T琻`lX=lAᝁC?V<#ķJfݿI9SE N0fDMtvB]$uK5O- AFȝEsX̯:=ưnjۘPF%upl'MQ#R\ uEW5%%lNn7SpɑM ('!(^!>)TG$O|nQԀY9B1a6HhkPM1$⧪ .fG"%b^!gm$s#GJ̯İE z<ߑ&ʋa>t%s.st@1{4 7b)K84䅯T3բ]+ڕB&Bj1PjϐGQp `$7K3u8r7LSbs噭OK6Ug? L6QWŕO~B( 9q"蕨-| D ʨMfZd[ɰ'^N7dK q7=wke;h>Xd8Q0 ڞ: ^Ύ 6qq=_H ͟#k>bIN,-:%ƘuFa.¨Jk3N?Jňq$a]8비\ \oAEVMJ͌~IviBɢ5dt+k̍}UQf6KE89x.d_D hW;Js+oFPYT5OB7<+q-Z#|Ĩ7e:"6×d涘ڨVy a!l~%&[ bp]UZnyݣ:`Þ8Z<Ӓs4Yڑ19YZ+3岯>)4:|ڴLj\uŜ@KzIaJ$ӢN"}jWV55'#U/uNǾ"q@ Yp 32^G3;;|Pag^.ٶ0(9F@e(v]cծbsG>TjC E£╯@|OU|jx>m4=-A sX!T*NҍF")ia5@k@eR1MayQWg+ՀsV4Q/2HR"/j_1ηz*SA#(2GPm)LqP)%j淏1r]wdq2=>c}#6Dͣ3+%=Q2p`Z~;"i^21i[7p"| Yev wBѨ>MkS PU(v1K4M*5"E/&=o0sَP0 8+'lr2OKkiu!i؜=5!NGeuS>+[vj;Q&U!càƸ* ͣ.;dX,uPT >5s8IζG݅k,pk\zwZB?zU;7eª@@0PF*Ɉ!Qgkaωj_ro)?O)S..˓ٷb}`0d޴F4Y9I%3D2g&7Lj1v<=Qq9!}c`qK :ՇOH U Ͱ"OER Ҏ 2:ᐫuy^ӭ|KOM#CĽPlUcޖj2-_hۆh 3NVHî>F=RhQo 5tF-!^*6TH1iE#8Ѓ#C펨YbVj0L!sP?*#PEB[g2k 8 )ƫM qN -of {V cڣGi=kcSx˴V.S|8s6b*ס ~ۼ}ƷXmT%pG3Xro)NkȨY}|y'm߆y-_QtTkXJk.7 Ljj ?2&#0!.59+A0aTcӀ>HkatDQ䭒˦8o~-\Y|lw3 Pm&.ꕴ2Q$ %[ 58Nj~#"4).Ig`0ɱk@Da"+Գ:w.euQM׷'MIy&Ѱ#FaIzH!QrD=q!h5 /[C')i|PR8fU^Q_@.dĈW$ɓF{Mjב.^ϣ>^cyN^/_}0!YL֤9I_si639NqXXUiUk.oKpKYb}p$Α9|L\Lh$#8%2SC JOiœzѱ&YY]aF' (C lz%P [cعOiHp['^5jd!yMȃ ƀȋ,D,8K/X\an`rrx 9|}?;vPiC;..$tD\>*)ybʚ/4H &b? n׷9%jʡ1dh+@:9YSkkO>ue"~ƻ_s+~pŴ m{|eY.?~đDv]ŧ<۟{Ͽ*={ۿ߅VqXk\0O:}/>MGWoWH=/E׾bcccscAa*i 7XzGOȋQ}{V;C=k%?#L׮ {26ɓ_$bԧwnȟb; |sov|<寸xӛpϻpYYYYYQqFzTXtRaw profile type APP1xePQ =Y],۲ ڴKEwoYhn@`$̠s!iDlF~;8"xt5CO}]x]!c5:"׆B+1g8;=K8c4$*Wؕ5*) $Q3WlZ}/]'|:iTXtXML:com.adobe.xmp 128 128 IENDB`fotocx/images/timeline-report.jpg0000664000175000017500000035135015247006660016125 0ustar micomicoJFIFHHExifMM*V^(1fixHHgnome-screenshot02320100fotocx-26.0: Rescale: width:989 height:478|fotocx-26.0: Paint Image|fotocx-26.0: Markup Text|fotocx-26.0: Crop: width:886 height:478|fotocx-26.0: Sharpen: amplifycon 260 0|fotocx-26.3: Copy in Image|fotocx-26.7: Crop: width:886 height:477| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 478 886 1 2 2 C     C   v" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?=QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEOYִ i}YDw2,qD2 'rKπ*@ZR$P~7g? 3|F=SKy6 ݴ8}GZ3jvrʳAȢIB⫝̸LׇGK3Gռ/Il{ho%Ko="4UX VV,M[<]KJmyv w! !iHgZ_*ex]_?pi!0.Ong)R k5>'_AJm4o 6 lvpGVfq:E%HPXO|"=t*me|/k&#E`ۤv>h'K@C.]rm5+7!net7NF;U8uṵ#6Ӗ3pǻp8 ך^|\d(Y׮-}pf# g.@9+t ޏC˟Zio+a0v*]L ^ndgOgk63w¦Q5+IKui.HIJUl`8^RCd5Lj3F-(iD1BbOԵ?:д#/isnmMAXA# +]u'5 ]F$'e^6+"R@*;AZ9⋩mK!Y s:p_PsXeD(+.S!v!&}3Z25NaIIa߼BTm-}EjKźڙڋ((Zc0m=wqZ1xCGikL[ʌg&,=+篁rn]fzmiJKy\f6}6|+%\xG6.dc/eZ=B A_&k`cO,vD&3[_&ԬmLD{uL2r:WWچ/áwg7h*w57/kh?."M(8Ϧhд'ƞ;xX$i Ē0\ֽt;rEִbnO6c9hܼz?xoC }LOFHlBIbˁ;SEp o+O{@ǃu:c]S4MtrљBw uRWfK[yeUvT. gҭ׉x:VH7׭3^],ΐa1 BNؠxY^wKXMB7ItpL`">.e&By4Cp< I85ߌ-·z]/6#G-cZtSOqpIHТn71msZ-]r;I~'뫍Vot[0?:l(#:(O|K[+Kk0i1^N\3)mͅ3 W?<'m|-_Ym?"$v+yqM 'Ѳ?uy\MMk!Ԯc,#1Q,r'9*rָ_7ƪͥ4xu8aM=2ʫf->Q>^ξ_o5ظyu OGYwZrl&YeȣMt^=͏mOLּY{SRWMJJ"HİO&v{BQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE7@O 4v8:i~W'&? ?ӼQ|M'=G&? ?ӼQ|M'=G&? ?Ӭzuu`5jg5icBm V]Z# ibFpEt4VĿgy|{su)Ϫ\Gn'y`< L(v#I؁I O^/o?=?O&`t͎!%+y88+@[}^x!9ٻ۞qUMvtݿhM7Hѭ e%68$r?mvwpaۺ=* Ѻ_43AtA(+1̿fb>FIU8| w4_nDiʑ;#Z_4n{MO.g6,dkh6^ACvRCs [47l^?(lہ7K=O&vÚNVWp[Xa" 8{՘m{Ka3a] eBÝqn{M|'@-,mok 1~v,I&]LK;{5,A$n\,>a7K=O&v?E`mYLqng'YдmX/'g3\C+IrI8i|'F 6?cR϶ ^y Oz}- RKMyF| .wÊtݿh/o?WW1B7 4 ELR}㏩wYegcwqI_4n{Mhbkn$I%bX } Ѻ_4>Ҵ+[3]Aj$9% Mj5 /dHĢB.ttStݿh/o?Vw̖  ^%|n }C>\.i$7R gGY%q3F=3tݿh/o?KZ:uڄ G<ynlw"Ollnܽ9$bgNNs]vtݿhCbK=O&v Q/o?7K=O&41F+?tݿh/o?vtݿhCbK=O&v Q/o?7K=O&41F+?tݿh/o?vtݿhCbK=O&v Q/o?7K=O&41F+?tݿh/o?vtݿhCbK=O&v Q/o?7K=O&41F+?tݿh/o?vtݿhCV~ @~c\a\W 5].RӚiȒ8 ߌ<7^?bI8Õlch{F,.;2kDžhZLP2Wր<Š(((?؄*'dFtlmk(FYeUap_?1WX[A~bc G GmrAsQ94fY۵YJ",Ici#;<[mj:mqQ%i4j C_X[}I8)VPh[8@pZrI9-P6\&#FMɬ>Pwݝ!*WuT.⻵(%Ib1ϩ_y|MtzlX-\ԊѩIu#ʼ cg=׊ON* K`[4vOjʌQQuW2XVЬ_Z=Ȋx*ڿ* 9x|[X{0mDY Y'uJuդPwlblY;{iQd-4[rf- 33Fw!?7?,PEd.\]u80Ugbw| ޲|7}i63- C$}+ ioۜ{r>`ީrC K#ᮐo~%m@e$49hfI!#dt?ڔ7MmYߗX$j!o5޾m-WnaGdcmg/EI9A?34qՎv) Qk5D2ndq5'X}1i^s͆؀+~ sE4MFڙ Io㠧x'E$g1F,;ɒZf}sGitfth7GI8Zմ+K+d! )ayR=ς4KK3{"eqZug Kom*ÞX&,FhfE4QFhQ3@fE4QFhQ3@fE4QFhQ3@fE4QFhQ3@fE4QFhQ3@fE4QFhQ3@fE4QFhQ3@fE4QFhQ3@fE4QFhQ3@fE?b3đ$j+j᷏4X NH_N} FGҫ5-.Q.L:gK ƒJ/l&Mvnᢆnvt-f?MtH26h#*>^6k;*bxN~U﵋tj&Y< i6_bI*&Hs!"wsZ0;:P<6VqE\G&=KpGUxkqowۛXndB%57,~l{#8| MG/ݦO_t{u;S~-M +_< Cv}=< Cv}=~z< Cv}=< Cv}=~z?,_/ݦOG/ݦO_ފ9 OO֊9 OO֊9 OO֊9~' gzS:~gv 4RM{~d˺a~]gҰ>6h}W_C\OlȞd->lgg/c?iy?|?n?璘1E TY]wV>2ZYEgj\"_(F8-nO(ԓf7~ 7i旄w4ĜR9%i?%?\ WG&W/ݦOG/ݦO_/ OOF3G s_< Cv}=< Cv}=~zG s_< Cv}=< Cv}=~zw@?B~x7z?~x7zAs_< Cv}=< ?n璘Zli2sڎQ< ?nP>>x<]o_w+C[kʂv7  R0п Rz}}yw`goq} f7z?~x7z5t  o߹٢7LuwގBn~' o' o:9c+?n泥?n璘Z1{QW/ݦOG/ݦO_r1 7i 7iA$ddu r1 7i 7i9ڂ#֎@?B~x7z?~x7zAs_< Cv}=!E|_ zdk|6PncBQGoϸg/`K d~(?< :M_eԢm5 %%w,-7ۓԀ}j? ţGXHdo:E?qIG s< Cv}=< Cv}=~z؞ý~' o' oA1ۯ~' o' oHHc/?n泥?n璘\b9~' o&@M7=~z:n}zm!Ou Lk{-?Q}ݦoK Vuw :T!Z,̳C3smCOԺ2ikq,FY$5?W~x7z?~x7z$rs+?n泥?n璘_c+?n梨= r1z[([,fҧD ^Q_^qE?ju뼬6*sF 1HTucφSЃZK}^ɄiSFKČt<n*jj; h!W8>WJS~UƦY%ɛE|[Wmwzd3X5~(Ytf&?W{-i );3VMeq$<)T#zyux{=:'v4,w$/GaJ L떐 *X(uZXyF`w>3u^wftZS\Ҭ!hm|K,1H9t#,wzS3?ʾ,<3KSt0\7$qjxK5oԿ"9$3t"b{o+(H#|M4^iXCKr ǽrQE'G봟pAF Ny%!%heܨ/ i?5|7zljc7]E6( x+\@uj\jQZPK) #hO{z~t-#FС ,(c=+" a{K{ B9fRNZy|c"jDK$ _kPެ ]xu֓o+Urv~%tqnnx @$69Yx:"Ikv2`evrǩi_xK~3ͮ 6E0ͬXl78}FFzפL<1i,gkpr-^ J)1afFFryZ<`vc%ŋl9V16s+{f{o[j)*(>urI Ӛn~xR-TxܥAΨ6ȸN6|@5U{!9{63o[wol/ k^!~%v`,\ʱhV.灚¸ym|e-u2ʿ7{vć^KDK:K_5wag'#[ a犭\Gry(sA_ho-KX@5 &`s?6pzz@j7&Z&ڱ$2yR;Yq5mqsʓ*Ib` 4%Q@Q@o Zjz:."qn'zºѼ7Ym0_6Osxռ]o6ynua(l'WqIKKeW7'?)Xp겙d8I`A# HG ܳR<#̻v9XЕ}x:=GE[ViK)ȫ!\2t+>xY'}1J%,w*.u9c!]qkOBoEl/BۜV4zW~._.t^l׉L  Κ[2;̑e`Bat>mpYsa?2lU{eRJ+}9N ;xu,.nn5x|o<8#i6Gh~ z}7mfI^[[Y|0&!7|oc5 →XƗy!ӊJy=r[itcvIo 6WLmؼFLKxov%Pkx.mf zpp;|[?;{9/402[h9>W?gZxsWԬs7[BFЙQG}+.sxOMlKKEXi7vkS}2 R[,9Uv jהOg.W]-%:0@j_d(Uuho6ȧP.w U xo,.!28‘O'X:E+{h27hʖʇ߉/gW7~&fK{PK nxb.{"x)-dY8!am_cF|?u5T[H[4-,V8!2EXx_F֛64zmKW6W>! ZGs%̸~_R2:TwtwVӼB$m]4KC `0O˻~. v\_H$RL)7mm>ҕ'Ff?=2hBҤ~&xcT-beH3F2+c'Ұ< ;l@%d4IZ2#X?oZ̛W/thle<αHwNFzw0;wuKklaYඑLc˜җQMZmHe; #<sJu>ЭZ}KY:d5 n&!@dV`3we_]Mu,Pða6d!x=h~]nYe`gA[Ir0{楛D~֖)`$8*1ܞ1^gyjKKY.& 3]APIڤs+WUHk}7Oov'F%vf 0;P|\be{-Sȷ !n2zz qm=c› eg%ӭnG-ILYv6ͼ(Z k>&)xZZ]Ʒ1r7L,aznjZenmw:wBh|gRUctIe\Z<1v?߅/i3ClSi#RC ]'+m =.Ig$M1,w7 ǧ5`mE ]I5x./%4[;^qϥvUItYYֆ0[X3k~17cOKi Ikhp`߿iVUskQZ94Km=e@ 䲅O+޹xj7W0,u+Ib#*`2U ]}|@3Z p[Xϗ;_NJ7"WҬ4+MwaT67s4I2[S@!QVprARIm¾|=-i2Mu4q4B(?!Y>V^z1_ {[{)i?{$g\d0&7+mqvnnR4%HMj7|:ru JLB׌#75Awayo}pRx1!P*vwj wi5̳۬21dIJ>&xj5KpGF'wkBZ SۣK24 *#<9>?|#j#Fo.+LIȥ1p>QP^xݏfKnK9PWwWwEǾYiJH'R[3=j>!i^!73 (-ebG=}ZgE vɴ9/nX/ɜyxžuC+\G3ƟnJ!R3q@75nJ[kKhD;D`NӭEB4ruUb$y|9rF|+k3xHz۫d]ʬ@PGz_ iq\Gwg,&F>rr=An^zSib,rE|nwpcdN+SP񆗤3YݥAn.YP)`?6 >g>-}.%\ϟ,^Rg|.(U8@:7rV)k9q:%15sLC+) ה"=/Rh7?ka|y*26+Ԭ-Er B<^(zKĿZk:i!ʹJG#7c'U0x7jډIfQ`Lv7:_h a;kB^sH>cTn YU]lOR f]nn^FW4mA}NnicfG>Pj7.e]NA%< , 3>}:OGѼ-[z[M=^,~ASY|dn44՗ilv i i &&j3+g,2]7U*A5?Ï ' 3Z}G,30lcښRCBt돳琛'ɫmKX{eR\WxšAsFjwqv$,a]Fz:W%g 5+C\4c(*Q^[z7-mK(ܰ2F2FJ9¾ m?⻰#gg5Q{HUXA'׊(y{|{MN-b_Iz4pH#wnFX+©q{udA㮘`y qz #S{FMZJn"ʂ0d^)݃88'\{h!մNiJƯpr}XtmY{QQnXFnOp1$;%4$]r Sf)>w'zJ^ٿ߰ψ2xoGwO5&pRW#h۞+Wii]f,%IEQE'G봟p?c&YNM :G,ly x66־w¿O8M__~)xKK;OVKqGpCq =O:1ۻ9o!m` 9j;j"yŊı*1%QYTr'B?oCV-4 Z}Uw{Qծd{Yw(pCui{zfIog.nfuWBFo 3˚ j?%Ə\>7U\}/|׵"8&Qyne)dQ+Da"+&Ҧ`K᭼1mTvk\7?5j]6O:Bv>mI=Z$u=Z֝\QM $K: :g,Lڔ0i$I3ML:®$ezW OW ^]4H؃."s|gu ?D.3v7m x X#黕yʟþd}ek> )[tiR[wE3lU;S vM~V6>0$EM#tRpZ^Z;xVb]Z\D~x`+.xȫ( #XwٍeO)ulWa񮡫ɪ-寔Vc=J_ʞ|Q'./ժKW1'- 5jG./ժK~dsN 5j],>&vĚդ[d[*뷡W0ak}.uaϒ3^G'-jMHLx'`""?~`TN6O^e n^ ˴c <\=fyXq>M~jV=9ndWsq܏GgRM^StK5+n6|ݷvNq|c6P zO/͌CwasZ/-v!Ԛy` (}R .>lT%Ek˧})ƒN$2FX}SGE2]5['OMq8]_8Ǎf]U/|B',{7j^)OJmR{zv *Ьq\+?h񕍾i-P[̔g`rb0Rfu*G^9{I&k xvgOk6FiΛ4im۝΁w3Kp\:֟-)%ge%Ԛқ߱]tT{U38S u=KYn'1{oq# B&>W:=,xHL,p۫K?01OzǟF_po>3=_HY!{V d.` |#aV5[>[y[o.lKxT. N28_|ECUk~tq̺eO,V/)FW'3Et&x'HX%F܁ּgᾲ+nמiyRR[r!}ZgR¸Wj)f ܼ?}wB}2-$\Gtc%&6lj¯,54EVUD]ؕ$1G0{?B|;ZgO"?*}xú]> "PS\bGD'rSʦ$[ 'C~!=.Yx^gh/bS(ʰʇbQUd(˞7"x_Qm6k-'eia7; 0 Jpzճb a vQ22C4EU qdӏ huū>=6|T 28*A)hE3 -Tm׏Ҷ2—-ඳi$19B wC\Տ}juũeˑqjN}k/Ŀ Gg-!S"9?\Ѿx^VsM& OSff rH>kKZ΁F(UXzoo5X[im, 8T?0R;>N<+v~~*/8Qu>uvk[$r*&7JFgq*ƭSZԵ{m,ZG#>p5 !3gGt jUn>Wc,WdrsY8>q[zK!We@pR˰溮M}~xX Ne -/!ʳ4%ǖW,/ֳ~JUdEa>D3 㞣#Kּ?T IkWs1\n ;6ӧpu=MxpyUi<,"K=IGVJ&xgVNoflD*{W10WЮV!%2 <>VՑ7MkP𮑥\\Z]Zr#z6m-|z Ь<K uۇ)%Ud+IK‹2 3Xǡ5j][?$9s*ăi<~e Ū1:7̌cWCֿE$gwt / / Xm+xu;K2c๼%Y J(kEjneINfpNя—> sC4yfTW;n[ي9EWͩ+>4sjf$VM,9N a5ZiP[[jVIy_B=[tQl:_#f+XUY/gO[].c,}˟|f[zېǓZW A68)ieXFf-4ciZդUb2Aj*?mS` umC|>Kg2!$7#'|ڦy{_Mh,җ.p~E_rs.ͩ{>kWm&nz[)xVTKӝmYLln~wqIp>v'8}+Դt>cy6XØ1ċmrHt}E|ŕ3BdxьQ>c^/(⼗Wa Poo_H< E*ȑH62rsҽX ]fՋ<ު1_ZxwnxTs}{_sbm.Ces}rZi#'2/Qx{]m Eojn))|P[ K޿bZx],c;dYnF1]TG[;˯&Kݷs?Qr9qmKS9inMYv#($0< gރz{GRM6&iAf,,2U# >f#W/4f'oX$lheh? qPIYu%'NҦUcb%~ck>p/,SI sQ۸W]46/t6u n1_ x!4 CI }+7O kZ|;jhݻI&|{FxԒ<ǟuh6N}i[(]2v#rv.J'I vΎs ^gr;/z[4{&i2Op&R689}3(w¿O8M_UG봟p!3SW&Ш(A*m 7m5_ <<׺[It.h!\zUYZMq {anX{oj/z=7+`qٱʞՕKY|+f;ϘO!B=km|5qj/|i6nb%8ʩŒ޽L='_4{5*v{Ƿ!٧_>PR?o«^|: X̿5zQ/j y?Q-fG͌qZ)=3AZn4IaUfݭi0++d/g*{3YJЗ[jr~uښ,wizβF펋潷Yݝ [+դk[ۅ\d:7W|PYufԢ%\N@ t s\_/,|0W!hFV{G<{uޯ#VÞ/mF,s'>+5x#O],<0O%%}p;W2Dг+)N#ԮN L3mqV#B2isK}qWhǵJz9>H9ʞ=h%m`o_2+%xZ8hx@5nt @,k(P*(7z JFъΌd ` "Om-B]53i?!ӌD"{U3Ȩ%݆SG^.hz`-KGnFJKcײxֿtxJ5P1lG׃ϱ05_i4P̳FsvSЯZ+/}lhY23r߁SnB'I}>--!Ь4Ewo8Xp0yl)k#d\5G_ 9˯ٯ|SՖ[\j;"$mU W>mv3WSROυ}L\0XTFkfry4طd{?ZmXM0*\]OTF5%ͭ ۀ1T5$ ~^ZYCa_Ju7&AsCnTd=@zUW֚2n5}qmdd* wX?ƒ.uT%G~wv%8UB@3cQx03z~&eKSmFbPm3E >5|}QAψl#oVRo8,FҥkʤD6<#b Aj6%.Dz4wlj`bkcoZ[88ԕzxJU9`;k $~#Ϲ\-KjD[˚6|[f'=_ ^SkEO zύW?݋ьq%ոݰ_:ɯ+U!m6=9ehQ7uR:fNW%G_ٟڟov}_q~dӦ.HG3 /3'緇e+#?bgQr;#?xVքC r~ ʩ>}AMްQdSV3ܻo{?rDBˋb9 r0x+@2څv}E|Q>=ʒG\:j:Mv|A|T[_r=<ne(]'ðč x`󍩏Ƽs@xնnge,~L-7~է?Y]9+R]6F=kt}}] e/ҵӓ6Gy$Z 5oJX`kcFwl(כSK05nShY7f]E5ſƻ<_&! m>犩x_K^Lag;Ex<խdJr3B@zWǚ?aoY S5euǀg|U:y~JYeCx"#H]@OQ-_ TbIZ3VNZSC0?|;P3=I\\{%seMDP-u4+[yqߧq#ou‚$A=!opnAǥx ߇-kd- $!Uw>ަ8લ?Wg'5th{D#Z𧊛Nѭ+ȓ fL YK.'~NKc3#<՘ܒ[{iou:#sw<+GOzׯ%OA-"cږ0{oξ}ckj[yj8BUv{So54gɺLdPԌ ijZ=AmV|FAflUox×Vgg&!XN?ZĞ1OnBDDT_O'޸(5PnE޷J6d# '}Ӽhֺ|[2|Ap{sX»ȴ]2M s)GW-Y.>"Kz8?Z <:WuVv֟hTZE~ZkOk[iHџ2't  ל:.b"F#Y7ﴩq*ޙh6X$XYA NN0?1^ձ:na8lڮck3012[nvb|$]XVm:FeC/s7wٶl՞PH d87j2^s}rSEBsrʃgG _f-18u]o:a6kb j# pO_z=Uvܤo8W(Hrז5_gjexe /+19qc"J߷C6=GC&P6WvqNC9ϰ|I Xi:,}ܒNF빰>k{..`0l.9 vTt_Ryas3jpڣi-5zF;rŜoG+Eo%ߍk; QwR>eP\jN /+ټ{ L:י ܭ>61Wx/M=VX@l^+"{3/bzǁnh `U=3~e5 CmY {;lʬn9Ǩ,>U4]nDq_U|V>29!w5YsH>,O|j5B5|⭷>ռ;O/eJm?7_J+1 $y_ҴI<Ƶ/ppg_aiwPjLI4H!,eH#=kjs5BH:ݏ}]Yh2-ZT!vr9Jkh׿5w2YHFb+w$+y*aԖ}fF0~wgoî^BAl+&ݘcW61+9W#޾_<[۝Oz"Mf6RO (LUOgCEŎh:itvLGwm ~Uu5g_ive)s-mgr#m8?:ՅVŴwFKHdwK]☯5S5$Ip͖_?dͨ ̬+ͅ^_/-]*;׽ &^o;Jծ͆y0]NHܑZ)_uoqiL6ZlھSA #VV ;3B1ؼ_wmͼ>|6"L-nT\L k &llE7{zq_2|= sAg Qi:]0)4/qǭx{?z<~ڵ[֤Bq+I`X8%<Uxn Zxom "EGig,^Y7mq8Ǡ}4G{ۍSHdtIk־Z^uǨږܤfvg +n#?2n²%ܡ (\U!k@;xet;{pkH$v~oJ"dM{cJ,bin*-(FÑV5O͍ʹ:j6vwv3INq%aF_NO7 y Ώ|,OLR=sGg\!!u{3=ޭ a;WU]_WE<"]b#2O^ [k%м/!IОȽx ;¬F"25j>;s8-aОY]* hvP#GJu{s ח~T y_gLlnNy}!pҼ?wӣ(|1= o4ne[}FHEy'ܔW^3NNJ\BH?siD[Gw_>Bnoeauɵr$U`1p{3g}} x=y氞L7uZEV58"9CRп!{}ADK!L{Ս6eMő( o֥WcmYg9 [V0[^?_|T^.KhS|wR$usں㟉t9|Fnᛟ"`&:XKI;#ش]BmA`U 4g0Lg_I[hc[;7 q*ƭ_J]V/32*.yJ˞RӘ?d$B"u:CTH$Lcp9릮揶W[8/a2OyOƟ^1]E- {qm+dĹrq4~K6m]QȻxN*ךecd#3np07g'=?mag6YI⾿ 8xY>O.BXg6+B]*mG'ǟ?<d\N3 `_X{>1~=j4@zp$evZᯟK&SR-p#n?Rt?|N%m#AK*rT"! X*XZ[s XDAO6SɞŸkSf ˂b2wFp:t|_{κ[BkE=̏/OO֜/}=o O2zzeJS4*Dǎ;OZE%Q둒ߐwy`Cqz޷-%R2Y~__t"gY)}"be+U@:?-Cudnmدnن8Byӏ4M9m^ydݵ6·m i6׫[|&m0Oїzſp!fʃ09 sxn|֗PF_tsnR1t0tQ>ޏP\xRɴ-SBu kIre<~%[nPqݳ1&qږ3Ɵq.p7)h^;m$z!dO"(_&mƟ!!f2 r>yeewJam?(b9q~h5/:#}N? m 뛧b@]SP蟵oxwV1HDKH?BVm&=wMdH'yc65^jG71$:.qHXY~Waw_cx:Cv&?l勻`wq{NozR0]SngjܼFm(<6gEofWi"̌:@W+5Dw}Z&Ҥ7ؕ8Z-Cfs^jtViA|'$8=%je]ʅy U]@HuWYEh1#|;mf?N\iJ3]pGn9%Q9^>-<'9S!9F?1\R.'"`Ges]׋Z7߆!^I1?i-no}늬%ya|~&o!%j7>)፾dXq|=EQ@0Q9y${PMIM6̦+C%J}뀓źj嵽Lq{WKK9'>;Rӿt'OevS`ǥ^型mH7wxA qv+{!qC7#Q˟p{+zL[l漜%E<Rķ;J ѳʬ')Ihrz-[Xj- K m 2z3Gƫ6?rڿbT>XȷPȽp""n/oꑯ!*@\?>~ &k!iqmLHLS!POyXJR[i@W\!$(P1Ya7@8iHXH?xA)>[|\zLw7,a-~Vi6؝'_ү ҥ]Ȋfsuu (?fݹ{_pA^~w46Wŵ){ciϔgil HI9kے1n$h]T_%62-rW{`m :_EIk6h$dgPC6l`z1Xib"#JWg9yvwS1H{w^#{i exNK.$>UYW!K zbmp{Xr 8?vՄN(<>^P CD}E=sr 4nIǵ|੪XH׽:Gy]$WR8V2H?5T_ WwpJ R "w#~_\i>i0X)!X< to/W`mrrK.>-3V26*q {ʶuDOj xeR)U1|(LQ]xA'#4 W91ֹo붏ƚ|7qDOh#Hs+OxL>{nH%^_{KUhĺ_V9dm4A=p3E[/-|chA#3*1uz_~2ExB:i=hi1+v5/?{i%g iП-ⵀ>3<)8lIv3 ø?ڧO>[Jx{6{e]p;cP>-RIM9-Ifo#A!wb=ox+y+D:}& 9{k2TK+G3EjKFcp8EdzErzR((@Ȣ (?D(vNW7o*~*~;Q_'&.!7@UQ@yw? $0D:KI1ݤ)4G)-Ϭ/|%-||?ua;Ҏ`}w.8OOa_x~em_G/qE_#b;uk 忪\gz7CՍH:Ӿ#oFyIbx5ݔ%#0&oٛUYzT*n-&'ٰ xmojbv?!_ojjm[i74W.TytR4yRV-5BXi"4!qY?>Y|BՒK-$1#fO Pa]^4QS,݇|\G?hA5 FV͘R~m}OܧVP6s\R̋ /:ֳqbU| BcҼ_ZƿOwu)IOI]{Wgs9=XkЅ5yLWJaQEYW}'J?ejk?xcV5^|<Ӥnp}ϘO9 <&,{4:vLPQA-@z1sZxľ䵋U,>W2yqmw}=W N~N >&m:]VL9!Dh1>ާ<9{4۩}^RS,s3뉣u޸W=xI"խUF.`?6Һaa׼ށYKcXgڋo,0; kptq6~5@B/Mz 6 ~c2v`;v[O9-v+h#|1m,qĦcg-V qk2 }D!<9o: $=!ZqOt?3]4b.#FL33  mysIJº(G|Bt+Ku)xZc8hW'+ӚMDŽooRR <=h^ MKBTvY*Iz1:WeeasK6oisiMYxdoz|=xLڵui<[<~*]ON *B\B »HVPies wӰf4& K,2[.mݻPpr@KoE hm rCIGQ`s}kimNkR* .~_{WzY:y (u<m^[ 5H<3hX$Y8 6n9~ў#KcxoEfmJ5 ,;P?Z/>/_5? ~&B5$"_ݮl߾(Q-|*sԟᮗ BR:c;6<[C/Hk ydDR2^Ꮙ~/6jR]MZ6H 8n'~i@`]qnS^ ts \4e蛉xm#C-,+wx{t_K|i[K:MF ڹYg}k]juwŎYI>z ej,V* Ǚ#p*쌿sJ 4XEfi[<^#>lt 2³\+dWWm_JO) M7"i' 5s,:#Y$Hn>Gr6s\հX|AsѼđ%%D1C/W-moWIu-&[m?2=*I28a? km:/M=I*خ8|\]xLUPvCۜaUQVY2cR۟~k]FG[Kp7p׵|}{ke|pijcҳ{5=+K,|QO{XmBQI~6G[~z[jgOnP]N`č?( 8z[-xXV)zGIWkOFc%|m5|XoumpV"m Ov~1am"J] 8+ĖߪG%%Iy%\Lu6wğD]ny5YunR ǥA]5;/WA'kە"r!B vR]. ZH*6GwGEִI wA26Sz*p}YXm:-_VA[`<Ξ?u4^y ,wp+ڴPThdM.V{4fU>o kA ~ѣez~g|:ה>[Wm#>Uυteq1,XV_u( #wtQ{%tB97c.zW+_nBqyErKN' 0G)p< ȯ<5[j-&Ξq2HeWӕΡsΟuٱ oT\VuzDRgqIW`O5fAy{׮|X-ݮx{YF@b@L_o =Ia2ͽU +o |To TΏ#,?\W$}y%#oZ࿈ae#}γ}EJ:M;n+)}} C2@[95į{^`Y=+DYLRVxn` v|Â$JSt48*Qq;7MNjt{Mz=/K઩{bOx_zWzOa xKP"cm)L1^|w4-7۵T"0 P;*kiOx+M!#(XʞܮyN28͵Y)73ɕ|U8S^U]߈w>[h_ߏ+R?Sȭ Kk%s˥Z35L0@O˞8E־uPijd5`xN:_^&ROEf<]$E3)q^mj>> Ha,0.!F(Mx\h^wy)xa+D..ZFKmvR=0z<7S>SOu?*9 Ep;uhbS=We1j֞ZЅʉ_y[k‹sϨjZhڐc}#u pxn4~*EKդHcqs0yά޸< o\BM4ͼEc M0$ُjG6}0%#\4 $6Cu/i>4eŔa1>t/ \W:\v oK(mb`3n) #B܅}zm_uQ{~5C2xM|{_ i/Gо2]|䝆P>u}sSMTDAx@Q@~yxWI ~ZE"jcnq_ox;Q_'&  q _^EUc oUMޫ( q '{9]wWVSQ`)N**=3.gGsG#ԟmCڬp~c5xf]J(K)3봏Ma -M9xݲFi|;hDIo+$NspT6q$V%]ܹI%J m.1L\'(ێ)xkIs [ٌ~-+ONrK6!xPRR iQ>dJ/j:Ŝ2(K"lmƪp8[zދWxZ#f:n'Bv'k(sr:z).PS^F{) 77`QkC$0Dcޯ/R71DI@d oOzaXx[W2E4ڴ BFz>ƾ NjD%.hj3 GRafvgW+ivv˦["lD4cE-_!nղAˑR\.e4}yy7Y/(ڹmJ#ѓ\4ٲZER!zΝo%iC4B\p @ZM7m5Fct)'qݻ?V>$ N_1x'ҸVJArg$όt6X\ۃP=1k;Spj,W s˱6K[o{N܇K,m>l~max;kVxc%0",uiy)wx iEtˈĊ1 z=X]^anesixnm*T3Kk@u_}kC? elRzSZ>>/Ц45 O-$]n#_EG}6qXIкrOcОk<& ӭmkƹGVUܧsU=OᦕqhƶȆni#}`E:,M8٣^xcgVI R&9+ƥ<5ie7zB_z\<r8z}ۈZdQne*n6H?(b^H-8edsHϡTq*Z4ٜ7_xRJu1[&R+d+0Zad -[x%ţM KidrH^2cxuе9V;?w< 5B^2.hKi=oQm )b#{|ݻ~[m^XeRQw"Exʽjw2Oqj-  Io-5LR3!{UH5+ӫqӣ:om ["Tf&x,E(1@݆wVm\j6 g`BҭG|pkQӦr=JēěW )4rH6v5[=Nod]{Lӥn2vڪkĴdW{&z.euI>p֭a}s)|G5HʢLA[ [6#ZII+?%!m 2gǾo5g>QQԦN6Nwqs Y &unw`qmm#slr5TMT*kG?ttY<$wsuuC&⤑pj|{-nuW"_ R$jz`g{$KLg֒|l1OCB.`٩xOKrR ~ I5WKe=̚y mElg_ 譯jwKmw-( fmQq+ &shiIGnj~ O<ȑcFXìd0_-kφ~0k:d!&򃻐I`@v_Zgؖ{Vgj֌dQ齈&4Z?o5Ԟdƙ+xS*{RT«*TV)(znx_@bC uıi7;m77gb?Š(p(((((((]˵n?5m4*3覦Q*2=i5w  ݷyJej}1$cX2wk\C=İFOίy+*X`+˷gpWܚ+y(>K#QucHP8 ;gqq$\0-AUUokOٕNR}hUhbcAcEzO_ e[h UogNW4ֺo:U#uK=Ωk;UaDZ?zƿxjg5ŧ:3CuaJ~f;G̙'x )FOW'97QYlXRT}ձ)Mm#Pvo_?ʀ (RQEQE~;Q_'& uw¿O8M^W ((((((((u.=)m6ޛ_?IEC^MG- YB(;Ñ$h *Ȭ Ӧ$l$B]vaЊ}>6oq, E5NRu ٸ {rj4=:Cdo4 E5/ T,WZAQˢ } +Jŝ?Ɲ?G|3]mE0cfb}!:@OZf+rwE vXx?CSnb9#`ÌFxFq]<vGV :|'E ?IJ5:jŢjW,>98Sʻ( T6KH|̱S^4)-OӭO:ݡLd_J֢HDiq,I!ݛԔQU=dQE ( ( ( ( ( ( ( Or&`UEcm]ʔCD=tcl^CDUJ|!7lQECFe)w2ֽX m ӭԢ tqxQs55Y4sl.[sXW\{x^3 24& فJ/>6g gK~;_8G\gFNz9sP'ZI+=Jbm4FC3a^S1D+Hm27d>޸rrcA|Ӄ>((?<+]ӄUyxWI ªEUQEQEQEQEQEQEQEQEQEQEQEQEQE#tQBcy̪p)i0/y7U/<x~ty oKx(}RG??:=ƙ|ڤrex|9ҧ= \OjLy^y_[5?"6{qmeQr9Br 3ұᶺ&mSN%O7ڡO#_`? ӭ155| u?&`? ӭ155g?4_M~Zckj(`? ӭ14gk3CN| u?&`>Y :G0iֿ9g?4_M~Zckj(`? ӭ14gk3CN| u?&`>Y :G0iֿ9g?4_M~Zckj(`? ӭ14gk3CN| u?&`>Y :G0iֿ9g?4_M~Zckj(`? sN8%:?ݏk~,Xsl9@"8eXH='>"yǚq &2XOz\y'0'9Y4 Y?{Lj-x3šgM[4΍YI8=<]s^&t{W7"7e鸌z9`/ J5ci?3)ְx5zox[RӬ5oizmޠ֐\]iV\H8=kV^qpQnL=4s~)ֱۯ?`? u_]VHk~!]/SؚkͫЬW+4|2CqxB9@'ѵ_hvn\Z\ݪ|gƟ0&`? )ֿ?3SglM{KZ54?ĺ\&69</?~ּ)wxY620ۜ8 S.`<%:}6 u?&b~aY}{Nub.Xn~O׊?iGItGAu/#9@\gu:4~Zck/ I68>]ͬpFArJ9g?4_M~Zckj)0iֿ?3CN|Q?~Zch :_SQG0,gk?4_M}ME| u?&`? ӭ155s0iֿ?3CN|Q?~Zch :_SQG0,gk?4_M}ME| u?&`? ӭ155s0iֿ?3CN|Q_^?4k_M% Kz+~0n{;mCymj#s9FE߫h- ;OxrdՌ9`X:c%}@П'hbxJa^,DMmYZJg9UYS(wޙB_Qm-<+i nqšskXt69T;/ӶkkEϥԮ-n5=g}k$&(ʊ[hdx/A^7EAǿG]4>=gkyT-+6\?C? &cE|`omٻV=sck詷bηW4kj:k\kxg=%!*2ɮJ*?D(vNWW;Q_'&GI4?N$t85leC֮ u =>e}Zå݈nZ(׍s4caڙEE?УPhPT_j{G} >-ڠBA=KEE?УPh@Q}(T?PT_j{G} >-ڠBA=KEE?УPh@Q}(T?PT_j{G} >-ڠBA=KEE?УPh@Q}(T?PT_j{G} >-ڠBA=xOO!y5?Ok0Qj..LkwtJ_ wAᏃk}c?УPh@xoᶇO}ye#U]&@#c?@C7 :4 3O}.,5ma\H~`g~[e@үݑ_rx@C|[WD|ExH5{;7h Th[9Z3Gg6KHVLKtlV~[򧇡ƚf`ֱ$+,O'ҾT?Q?Рw:x^~#åXO ={N(žb!oP'b \dxx:^ZM5@6XR4BCs޾T?Q?Рn> X]^_+ 4l[yfB ߳n;fA?7 k'% 0hՃo!]@Q_a}(T?P~~^ ԖMմ{OQ{]fa#mMzE?УPh@Q}(T?PT_j{G} >-ڠBA=KEE?УPh@Q}(T?PT_j{G} >-ڠBA=KEE?УPh@Q}(T?PT_j{G} >Y7L`QZF?Q@{PxW~.,|wwʷwI4(bh[o0hRZpTb oY嵽wqodf 98!4u 8г ;ep #^VO,yetCèW;\?gMu;ZD^I״!KHg((s] F޼w?Q^V7WV#͐(iHin>\X ,nm,5V:DRoKt<<\4 VήXҭY<_"G]69^3@Q@Q@~yxWI /V'Kc;PT]_S^jXW˿x3\}&L=C}ͭsTDM^OY}?Ummu!8qc ?WյI49%232PnPdkojmn.]-[HǛ`>[vuGOnrtܛ3` i;֬߉t? h\]kmzUڊt棲D}Ef1f9lcs/Nt?Ea{K nY 4{8a}3K-U^ F>'w9}AMZdK-N YKBF!>֏"?k>j~ `b]ziL-&e`?+/=/H%xS qncgx7N@LXxNo-nY%0̘ѰsVfc.(NbLyC׈/5S|f oIb)o$S|?FL}Jɔ-X<SA}ms)soSӢ"7vNe' :wGýK!1#S$!' RzV{yŚKq9м7s 76HIP`XMrO7!/gӯe$2b:||yEeb-B;xBx0Wk2Q#o2bxIuy{6,I .pUoiQw$ ~Cgxϭro5;\Surf}?浄6D`0T iq_uv[qr1&$'1}Ԡ<;hME֧"UHԣ[kL^8ӭz 2:s{&{>[e[݀ \F`w1>+5xr#vm?-]I|-6`ĸOK<'EX__jr\j^l2,쐠(#pl+GA~:.gKА7ϳp z.JRxšm,"ڀ=f$8q=M'3Zx mJ fߴ?[k(Q+ep&%f9ߘqC5B$GQ0^Oa|5io)6D`USѭO45v |WZh Bx/a+=G<:.nob"!]h:WX|-&^i4xmpѨdfǹ;2Oz4ݽWw+89/=PuQ9#`uK%. *89⼪eŵO $- GoUٷh'XTz׃D v{Pk{tUWQ9c $k/z{gmk|3]F$ɂW `B >@=tow7Y]&Qt4k,MWvM`G;;&e֭X'5v2M8|c q ිRv ar|1_)}?K8/h#ڜpW⯉R՛Uԭ⍬)?NN>^[޿l|.],) ?:E"د獟o"WʳϧE|*Ij ⿺HS_ HvhM|ג+~'WxxrPҴWHYQh .⬷ 1>njH?Ͽn)M \n| ~ś i o`vpݸn>WW,uxi?/v=&уln_9UEAGӦcn=)>}|gW綉T|No> /59< /bV𮢷1T$,6[{uqx[4 hZAop\XnT%0ٗ݃U_kmI ^^O1&ncTmV|W>97`#G={QKpFddx$ ?#|5MXhKs)v,F6.rS?}K,aݷɴ݌l<7F|TuMd6 V,!8 _X~8~"ӵ?_WZk)"iaIQU7gAsi[{KлGf%ex:'=f9;[~Iu]fwO4knhQ˃5N|gG\碮WpxSL?Tx/:nٺR+]#O;zY>)/x7x6,!ic]c˧ܙ~*AIb7&#vU[[[}/l~+qgGo獧o">7PkwK_Y ܴp\ETè0G5ržXY(K3@$*vZTK+=J|y$-_ҼC0\i0;U&f`^-*#[7ak}xzo" i{l-ۮ04=d+[{#Vx#H$ c|_|5S@[_׾,YΡ}JTM&+NR9a6>m9VdVί][m:[I8"nu:Q5엺\'40wW߳u^ռky%Hp$#0H*FT比c Q+Hm28?o"jM}0'Y FO.ǫ}>a6o;ǚn߮LswfcİT{\bc#W#ʳsCNc+&HR1 r1lkէOPCce 4rƣ95E^GiYx}? -i5o r1v OTu].}ߨ Dot+l7~^QW>m9Wc~ҹ/iC~ΟCdz8'dG"> %&eu.sº5-s|/JA8 g'P[_~+f03>Q֊(w¿O8M_x~>>X/xdT;aY%g'qp+dţ$h#mށ}kcTU&'2NG_8k_:Gj: P <1X<ٿu\jV<: $[_2溨/0RKc}'/,|̟UO_ b=9s/fg??t7"=1,Ԅ8o-[sx#RZ5m4П=ٗnq8 /ᐼ?K55*eUe_ڔ Gxsvg JlHU_B>`q z?gvK {#0[[HUپ 'AmMi_Qhg*SWڴHN+ំQz$?j/ 3H<U_GCȤ3ϥz~Go3-ՑXi12nDʆkJR<6|Ci9%oBČ Y~xH=2(h{X$_ύW-Nka}w~kD+l3OܺG2FZ'Q?kÌy{?`x V/IILBVplQՐݜ _t~}Ֆv]"}D끿89X7?Kg, vt0]y$,min+ʺH1+7|;q5杫q},A« _'7~˭]s^2?/|'-BF˧&asma8彩>+?Rޑw[%")fhQetNGsҿQ̼qKs_w@/cnT\F'eÿA-sVNӤU $a1E0 t7ºU6-8Iy[3u8|:OH?..g/\]vC 9sLX<3◶ףխm>w~c7  z//nuK&r8 9%H1 һρ> O8^Mt'˪w1>~r A|o7oϠ~Cy6Yĝگ>Ϧjw}V4kx3vʂ7AHgyn48"U- Pxj$v0FlA|b;gu}E.ꖪꠟl/Xă~/~uև<VY>x.CdO ؝4+.M6m]9m^vb̛99Mh[ֶvA J8 P7?@5XlA~#ݭ 0CG0qmn?מ<}u~\jxthTtlB|3:[? cG1Al1"}GOl4ahUVMŋ~O7=;Vm˦ƗwlZd$P3YȯD~C;Hĭ </oBT$G#kOO4*Ƥ6Sl䱃IX,v$~BŰCiճ 4_/?zOO5Wd%oIy_]AsZ^œKnRHxJ~CAyGoDSJF,ؓ~eD>%xŸ|sgKt+a-hIUH-I8N]> ;4uD]pC\>X5xQUiG2^A,3nUFnu/hç֚h:Ž"q/ڎWnM b: u1[,RcWw?nl7,GOxQ|aq}JM0譬#5ī2(ԿhVXCCgr8X.w*ƕi%ZXiIceU "<[_KƼwRm~/ŧCKYKy%j")c%)\fՇ{m>H8s%CG!j"/$ϼ/.VZZyWXo5{Eig4us,qؒ98~e/#6gnA3hJnmx0r6ǂs8\o>#P\7gs9MāwxG~s-OGY~FLDa oաg6_|%shUřc)`v.: &o? <W7hlF;u9$ XbI9u>?Oz.XPJ! #i_Y 2V4D{8 ȭ4Khm尹.s&_oxOא/P>tWWXq6e7cꑖ/,PI$$Hs\+, K{[BЪEPW|N5 jڄfjƒ$J]?{iW_?{2FmVoVK&hRAszSԛ'}tI l\B տG???[*;{9d+Gd]2e聉sH>m"U{h7x߾?Yjve,]An!~ox_V?G#ޟiMPl-Ŧբ)&VR0~A萻O1۟25~Wvڎw<WH0i.Bh$8<;c[KQe6}_#>fVvnj/3\|3o?ͧokp%ȸ 6&G>ux#Z4 #Z0iYN$G8#h9Nx+M7BO~ocuhc-u(gx7x4ifjVqڃ"1h$8VI?)η.nI-mʼy8=xUޛ-u۪&NKh7FB[ #t5uj$񶑤Mum{(Qcȅ (s(ZW:$@Nm:[)d]Ðs0s/q,Zޑoooa++7tVݞEt2HUxrX𶏢0% l<"; GuOh >cӴb[Y-Dq Ā <`OU_UO|[1E\ϨM$,6m CD0 boAVo<n(5-f?4$?t&8L/v0>e`P蟃^j_.gp8Z<+]ӄ ? d1 w#yzԱң#ׯbxR&N1ָ\g M>H#h,z3 xIJxාLfӾӋU;?Τ>C_^+~j:qM&w!Y 'sP:![5%Vm'VbX9"-(3Ia+ RS[ g<'WAI+-i"OQ),k/~?R\ϠXI>$[-9Zt :FooA}M񛵇7W2i :.v?t5x(I/-JL'Qsq[z ;9Ksߒ N8jTop+~|UO\EZf:kBh^=a^ ̭JTfbNv\U9"H˟)b^U3mJϖ;tft˄ v1j[`qs[ka[FK[AX>5d֢8~~oG 38ׂܼxj /Dpq3WxdVHG^5Hn~X3Թd~z'eÚŇkjBSӥd@fͧ{֒z5:oZ\mG ǚ$ߎ$QV)Fu&u)W%}BSR1(+JOEۃ_]a^mFDzF_N잮[1嶞 ƵWI>6\C7al6lnm w?O=bNG$lw&uiX>inWpcgo|1NGNwhwK Y le؋o0'>|Gg|KZG{H[K%ȅ wC3Cxx:O ƹi?nI٦c.-aPyһֳ6}{Uԭ|iMRlj/n>$x}."5խwV׳Fdu<{^n/ ,#N:*hLq9/HKHݷ3ccHl>-_.Z_qZ^N̂4p嶒וh+? |B5{3DH_G ԙe&\ϺWu/x;@AWjBȊUz)tڶek^1lkV>!H;h]a4f`h=>(k??<]|TIO蚐E 1lhى%oZ@dFHd_$xW>jzϧIxiy.JЧ"rzZ)|k<@ι.jEl(f)˅^^)ھxAԯu}J={3iq uPZ9B*\W֌!E7+,gSt]\[97PJR b,J3>xí#G;Lo&Mw4,#Qj3}[P6:v:Yl"= !ەlwo٣XueֳOjKy[I}wΙ"KU^p_ :(+a i,ˉoB}+~9Ľ[:ƋU'"#Ӵr+Hf\ ͞7$qдʲU>W-φ:g0t ;45DgVɒ(JG-7d<+jKI#4]wCզe״k|A5 $=@u;Ez9U{Sj5V(tb4$>H់Zi\^o"X7$6#g;xQ [Q:N#=G]|8R-gM}pk5a!1a2kԫFek)e` })x|DΩ&Rд[)մַpd6D3I\_CO>87'O|Ahw|[G ]"^jcZԤ3E0.s^udvRXޤ;W:?ōC> xT&k ž.0^CKՖ[p Cp[?1]6&qךQWܤQygX oß4MS:^% woja[fNJr0\<;RWMyjv~׵9eXN_n%)beqgھxχ>0kA埈uYM*SI41dJ(Y3l]Jkܾ_|.u ZE c qv_A:ӮMQK~!aoČRÕz*#lWh)Z$Q>ºώEksziwrKk5&w+1`2Bdυ^ O4/{;d[ɞs̲rk<Bǀ~#x7^&CEƑϬRL;&dUP7rzWh?|qx3¾5_ŅޭIk+_2UHu !bu?==/miG-彝$#aϘbf Q-f|=Eq$2}1UwpH_:||/.7FZݵxëZKWRm)',s Vd捣 ᔞ=O_s㏈guoNI97kiV/-mKy?SIG봟pF_,.PӶ+JΊV̇PTx"ᆧ|gLJ~$c G֬T+|R֭4_[V=)Ne klxv YeҴ9 OL[8<9lz)=2IƽFlN9O+Aji\3ǭTkr&y<+/Zfhm`𽆁;?C#+W).ϽCюW ~&l5/g`ϱ`09[\v"-CKԬM0Gպ]L0҆Sr*])?5㿉~_揧ڍym NTyY1JJ, #[$']uy( xHgAr?z.{A$͵Y};#x +}N)}=IaK[&y^ӟ-88Rs诳оǥ蚌wD0-Ԑp+'WEl2E0ua.v?{|5OR-l r1^'NG# /~4rc\࿆^#!E=m+ݒJS>H[jjWwVyn?Zw$t e>i;[%1ǫ%YY%YsR5~MF5NfUIb@$}+o5Sjľ#=kO۟FZh/UJ$G8^%/WHR>+ӑЇpHszXBV:cH#OKpqzG~YכQ՗{ڭΩC4Mο{!_Rico`l}X=,&t.c)X|b֕-ypkP+ۀ]Q炾xr>\WYI\:kiptR$G@?Wx?>&j6J-In@%5~"%-ţlAؘA-0]Cw&Nӱ3Zz,_ :G'MDxıC$..P;V,:ץ)Ѽ5x+O:uf,XONk[i+ xF> quxC(P u*6gmP/ÔtkwTus2qTnPUTR?5 zϋQLdj1+ǰ0^X_4?mmSQ>%оdxȑP C;zVh>|./M$MNUm-- HYa,1r2wgW_þҬ[MՆI{uwOдHVrFM|[QBϙ^u#/Rt,K p)1A%z&/k<^#6豍ƿ/x'$֋˷CC )7H28#=)iAx%eD`^xo(dӛMԯO--3Ǽ>!lru{ivA 4r~+1_|M}KFA4GYfV\D!*Es@𖙢K__s]km-̪0$5߲-/)=*Z/4"t ? q0G.Ærâ}ƵfQ Gu6v`:7ok4Fw%weG^=Kk󥦛Pyv12Y9(EA>sޛ=6Fo|Iq..X*%s^eu御apXneY"ee$Gq_ iBlUܳ{FW_Ɯ?8ʙ~ogݻvWV_'gH.҈yE>j@qZ5|\עuPlߩEnml_grX2xC%S9k-K7Z-Lj]z> ;ּs&QRip.du"rH]R>U䚒N'8mhڥΫ-%3Ɨ2]IA y5忳q9V.eݾy-r,``~\dvԫFef b} x}şړ!#d.=9z\-lxׅ~ ?񏆼o?u>%cdd5e8kѴu _oywR@6m zW~s:F;~^Y,i @ɱcU;UKnyOүO^nZG4[skV[ԅE'ԑ޷袕(ƞ5=2KRh6LrFrGl׊_~(7~"1i!geݸ {C 6@|#|c|?V^0\$fDNвU8nͣxWYu K=LjNA峛P ߆?AѼ7`ZEC 5@rWz}ְڭΕxVא_[*d`#$fUL(,G&l߁ mC}KX'VVKܨ+OW2ŸY(9hkZvX`_ Q õ]ֽk}Z ,!GX0FgT/_[j\k6߆o^+K,)*U1:?^/CyTυ:*mO}IC#dpoJڦj^s-EM#g-< rsUm Ν0}{#WvIfb$}nRH 3.AѼiյįuKi%y\Qs9v5-GWm4MXF;B^1qW~ {NLj?eH#LY,qءOE(`؟KQE(I?920ʰ2>ƽ |[u}*ԧJډYT}q^G ږe~.];npPȑj cV7r?UnzD$ٻ+&׉߉uln-/5k[[KѥUeu<חyGs5҅tтv_+{2|e9'%6Z5 ]%ev,x{Lujsgf$M\s*k5o ^i?*xJa㛯 ĉMkn1.Ѣ]0$Րp6 ͬXZK$Mwf(H#l~|**s]L<9qrF d @S+}yxWI oPZ5)Pld5Ë(SSisv5?MxK+~`Es%q3j-$ڽW}>fcj=ż[pUw>ˏZq`FŚ;p6n>mz?xw\g۬Fv9b~Rp>۽QO-WT"3ԃWmgyv;"jH$ 9bn:aiS;k68McGEIo6fFC(Q}AfGc-( w!\G̵b;_xF:ܶH #5JWL&U'PONyOk !V!xǁڦz'4|A=δn3"Nݺ&>֜se|0g<-:̾Z^ЄzRٴ}S[w:[L]C7`ǍtkGcQռWoy6m4KmIN0ՙoxwV'H6usjݼILX:P支:Qh?c^j5ͽ_D,j20Cu/:/>dM-wbʖ 8}xɼvod,+@auDPӊZiimX+y r!,W/tڜ!˱E̞gy}_oˏ|eixGvurIXͳqf}9ц^M xnw:ŵݾ/#)r7<'MU$.gIд=SS%`]#;nJh.rPpr~|J-0ƷeImo,rr8;ju8q՞Sj#jekm4\%)x'MchpY2.cV>`9!`W;wqҴ4hŤ8#̆a߯Z-tóEga6׆Ak>>wD|]ïYEpne&$$k$ =‰E!?]~0IAPP0Z6At+=οg,dzSӷ㯫2NWVxkǚ~ OhzvK2kω4}@=<K G掑Gw?'K_\Xϔfq:bޭ?+i#E\*[и #F$Wm+<GZGG{q~}ݖ%h.%4K/@h-<3BӐCCQ( >քyΝ:{ b Vn.l(ftߏ)HѤz#+j "xk_24ޡg_Nu{K;mV++K,6cYV$? / #߆fGMN{0R, |A~Yxo\Ѽ9<'WImRi[Yfc(,4¿{¿)+೗MΞki$YzWsW_:F,w:wOY晁nqHgw2TW4<DF`>RWfdۢ8Vhю>2,ZoEwTTo,-=u8gx@ E^xs`EwQ%E{&3 ָouhZ$+$!o* ~c䏘ct<O,mn灴׺,RihzPQE ̍oo,DV"0@i?:7[^5Aْ.ס|, x 9,HfV1rԼtSJ+]Ayeh̎ij|8!?:(Ḻ**c5ѷV m[5웍6Ummv U8SRn)/ÖdԼ+{sZm^]jW,4rk Ca*>W~8𭶯wnn 4m7`:L$v]B @x8wu_i#YOgtg!*-dMք!jy-ڽ#2[U28MC1?*g=2aG;՘|ʹ@PG]:"'tiPm ɾn0) o*`^ MƤEuژhJmcj⹋<ßXO&1ʮH bV?-TnIݚo[fuK\]4[[B%11c x\#?൚=R8Ap<|`JeI :z3S 4-XKF"4LZ$HOR4!p ][܈5 l3E4P ]  \޳sF mK R1T 1(v^G:(XXۤcj>eRq=~ /ּ%OڎxZVK|h~y`uwi.ds<ǚz| N\8_J98ր )psqF3ϡ~q@ E?t'G봟pTռ:Nsu7Ε%i8<'W~yxWI ?Csusđ+i"6p⦣OTv0<9{4PZ+i#7WK i.ڄqEy6o Y%ggزa76ZҔP=+5j3[ܕ5@8I#H1,3μ+ &ۄJ)Pkxx3>ͻG,V+sÖt[;i:co/ D7\M4NI/>;qrGPyRJzzqs(,.'ZS`P_c9ccI== Q]y}yw<9cs:DnmOi'5xW4fqߐ+c3?Oa *l2`pq4IsC<3oߌdl 6RH>pFq)0Z}&2I%_Q 6K]>[;f.0y0+#ުtH [C;Jx=(SjjJ22ܖi/Ȧw*'\֝delm't#;p'bބVŀ[ᙣ_E^D:e|1zV!F4y~|q2#EpEݿn\n4]X[ǽ"Hzs[>0SMb\!eĞ>V=+P[x ,C|u~U7#WűIŒq;9 djdH_5pޥkiu-0ɹ|mnϦ+^~*H>L{}*ԗ*]My^<0Oe3 0g?J`$h@$ի_Aݤ"8U?/ShU80d/C۟m(eoċI%=🈮,Ծ}w"Pu;ssі'[;5\] GukYhЩݵ5i/ç>xLZI*<9º kqyjjI!6:.~Zy;Cnφ5m,B-ؕS&F\n_~DbEo>'kzXEf%w33 njKau<ė m:Zҭޡ~KYi 6Y85Oҵ={]dG(=װn[s|1]]x5p@=7D8Urh^ELJ|UYXɧH Ի;D l?Ee~GsOZ>"=Zhsn6{n)@J~wʨگ޽st&⏆vZ^1@0Wꪫ ;sto ~^>jGT$V[;2@Arfy%V9$z xs^׃PҮZKVFIif$硢=ol+;%o5 [ix\Dg8I?v1־&_|N\r:82YZTc4CcI`9&>:-S:]\aoZ?*kX_eRV\6?^}xsSu(,峟0w]:)'<Et_Io={EG7~"[4'p%pH'寢q2Ge|UeOeԮZO-UqEP8gj=B(nW_2^x> Ljךރuoem!bҐns?({׀i_ jA3/z,Ɯ#-Dɉ7/N}{h@QE%\Dr4,%^}@5? a&j-moךS|hbhQau譵WJ$Yh$7 ?J~//m< ˏemj+%</%EPHರ֖PKM| t_W^&|92F%--HC*˅\|co~?;$Zacev*^. xV[VbԠYFD3OqZ~>'4ud-Ȼ^0ʤӚ_cMJmS>OY]V'ַЭt̹'xVԂ'4YVd'+~M'ği0Tw,m}CXR ' MjU<W!Wz?5hS*ɉE)EܭqF+>\h t׳﵋-SKMKV[ ,ܱa\FNl6b~7Y8s=ֶ>R2 g?v+G∣QRM"Y6۳ajR[ZI!Ibe!"ԇbhx?¿z#odmkRQHF%d<5KL4J}mO2oD6 QՇu9ᗍ,OiO]_A {uh3& zf[kd`}XOPֵ jwW淤8Kqy`6}8ےOB+o׏}xOW?ۺ&H |&ʌQaVUEz;}? +xksIyEOBF>^!?袊c*Iye4NIT.y?|Yy;Z-OZPl_Nم|ϻoʤu5nL7W6G xօƍax]?)Ov^c'BqAxx5Z` O51:EUQEW|?,-c'Úqĩ(@Ru?^w^Km_ ӯ4둩iH]ih$Xd&@F:bMoj1 Ha6ݵ(Tgu_ x{Zn}E[;K%USJU@Q@4 %.Ś,-D!UݟܵwJuM"4H4Qu+Kmi 2S~_OZૻYYx{֑C%֏ѠVTs8']hzVxbMKhq-@|I皤s߄Z.o$ޝ.Mo*&ݴ25ῃ~[Z3<ٌy)nJv"_ wS5g{?4_Xm/Hl, mFkKų6](P6-nUGdsFP,u9tMuݶBF۞ _Vx-co 1/{{#\Ԛm/{׌=Ӽ?o-CVkXn6o;}ߌ\usŨ\[is}_J$$)k;hVH1K1%Af" 0qs_zne6:/8\I,eO.Egs/sQQ/.vG>s%@Ded6lu:񯃢iw:tJsku4`>¬!ԯ-t/ h MIJ-s+;5 JgJΛ:V`M9f27%=(G>w¿O8M_!lv9!m$ ѩ,qM~;Q_'&iuywKm7?uĸP1Yx? jݙmv,ؖUx=޼?|* I#IO\Y"߂ZoE͌i=7 YoK5 mWP)մ,7f}ԝȿi#jhχ0"iBW:o MqerJ2) +?UѸ?OʽYic7}cq[Z毧Uwy67@"^Tm (#D|1 }7Q6 -ew_>qTO pz*~{A.mT!܇H(&3If< Fu?&чb۸cF-Bx} Eb<;TWDIru;_p\xg̡υ5#TB8"}?:bo.^St(W7}1+ǥt^Z&=tK XEd=F{ۺm­&ŭ-|Ý,lzm⿇h$Mt"OowGN~#53nhN+ gkӵrvȚ)|ƸPwt` }? t6t?݆5_#IR-7Q963*y~9xK_-ҙ*zP?մ6c!%9ލJ[K1%`J,|]h{u~ @W96[BQlݭ-x'myXE{'ŁwOZ[ A+j(XbKu 2庳/r麦k!/H;rүNK[Vh;Ia(xf2F!ڹ;]Fv@J*)y.4,˗3\uϽy*%Pj#qhjJWeANc뵿&V6mCY`k~笥)pt  $,gwE7[x芄s?Ϯ%|lb܊_C+&5?ݥ $vAj?k2rQ!}H= k'X|~tNvc4:> റJq*;zW57XMXR<3Y&|y@ҵ+K<%qtۆHuMNH2ĊĻY58|]{sjtw6ZI`mNKo{ۄf+rv;5_y v]YwK/#4BIL/?hKaw7DޅFNj%Xs sFv+XGB^5߁:~xxGzj3vRW HbF(*_miu FHX%H,>jЗ6񍞹o=Agn"eۍ^rSpis? ~ C%mwY]YJ!9r@eÌZa3灾 ~ѶT:Iˣ%hSI@33c˱ Kj֚,(ǔ7=/?yx'woJtl=ܠ,c{E;R29g-)EmFmjXm+ .<`cl  U~n>/x_Tl!6-(.dvD3}Pv?xWS  4+,SA3U\HZuETF|O<=⟏ͩ:-(I}ZFe vUʦx'^koHKl;8-S;HPrw1my>)j |Ci|3CaKhY@ eyc^GD vQEWQ9+xs_;ִо-մmVZT1Gi_eMBn@4~O̡X+ə8̲*:O67Kľ6<#xtxs]QAk%M 衝BrpxjOM(^j/-fN4{ՔEjU]OPIoEom,UOR_hgcPٴ[ ./t#\$]\/x+ _o}gc(Kr7W!ebXf^Z6g(? Ha"=3_*ޏ/BbijF1Iol?zd$9$$U;i<5h +x; {ٴ4'e1c<+^ N9d#Is#4K)<ZmRM+RKkn""-&Y+enf6 -~fh%q8IL]τW%MQ#Ke%m XF cxrTܧ{An൰P[Z,Qƣ@Pv92I&.F+V]O+Ɗa&Q1pv0ߥnQ8cUqu(I 47kU]]?y#ܺQ\xkpV8.,h ]]0 kme9LlӪHԯd=M,|B' ox;n/, _}ideYv+o&_ ksK6Ķ>-[i6T w^]h&8ux/g!`1Y[q^?.C~߰E!,O !ʪY 0vu v\<7oiZ]k3p7Z,GJ7 . Iʌż)v O 'x5. {#"U6c4H%ES~K/u&Qo,rrۇqUc20(ǧA2{O+ 5x?Qz0[YŢH2y/rqv;q]wN~ž(6K?hZiN]7ϞE \co|%~';|Rl&LНٸ*ӭYE1 ?lKb8 lHx5( {#(`QE?cOҮK+Nޡ &kk6^g3Ϸ8RмWvRZIm+i}[@ڗ6[^k/ߌG@Duܙ.$W|,U@ .+]3T.c@ӣ9>'? `ue8I+}-Ҹ:)Z!v|[A$h ⋿cB *m/(m[o(uek_eP qUX9?>-ZUlX)_B6|Rׯy.ZYO5mYPI6n4)ϨmJSch :?5~xoidZǚ-gY.x{lEmA4}-o &O +ò4hcԧvEڡ溯a[\wKC\nOe؈\djQ,H CǞ+4'T'>Xrj[k(Gw4^|~f>Kմ} OXkI.9.aHJ!FM+*VG[χ>6ѹ+f啛ʌUF瓷=t)G,3_A_x|+}:EnoeWUr!{/mVZ[Nv'Wxdp2I5Ig/3ǎOCh/hY42MJQtIJ\m˷s^^\ }#֡iD:eC F|3*#SlWٱc|_iT񶥡kDM *K.㼐H%<۴B1PόVOxW:?4K.m*Kx渖l6W% \}/YOt4ڒވ3 y .VдmÐxnrچSF[oHv1^A+jRU@YkBU7v|G!%sof5M{wjWƥ%4r;UzU^r-zQAEkR5\o)er_ܯjO [xmo]^i˘S*d+ ,M{u>mƮI"0>xw[Z j>icݬ>*x^gIxT;W*rOEG>|;421rAߙ]Q ״wj]Mdn\6bބ 3Zu<;^ook4{*U:O/WOui~-`#m BİSΏEi _: od((8FL ;#ɷ Gy'߆:]bYE?.W6Tݭ(I-tmKNSgK{v(FcgMxK>ZoYůM4+TM۝u=gXM槨k:t&*M!|$ڪICM=Z(Q *wCn` !x&W2e> ;RoڼZYZvj dT *Ip6H3' =+ /Ÿ:&M_],loڡiب+IW$~wSmRexkľ]ĢEd+8QZs4Vch՛QE~ ;F ыG>/Fyt1!V$w3ԒOa]xĚ6rE-ԯ Rېdbfm C$Լ]IIircp}|~,l|,}I>?&Y JX=H#9;!оKs>\wuyڼ)h#2ȋv^GۜgOM|]u[.kd~xGH'^q@4QEQEQE~;Q_'& uw¿O8M^W (((((((((((((?z?J('PT´׏ɽCSW'^?n@y+?&.㋩U{s%ޡג@̪`/w+Y*WKu![Gi l7~Zmo#4KK'qtb"G`91"cp>ϝ|֬!}k뒣=Ŷi- Y%+m0/̀]՜}=O>|le.(ۀx5 >l|9\k 0_O}c GUP5w~k߉wWZ6xYi3#[\D6'G,`?.}vҴ+NFiyeK8<,\̀zWGc+5_vG.㫛_\yh*9۱ۓR5!BU s^_5M?h=.=GKdۖ w߼AɎ(Brdf~h_τ>!Ee}Z=)k-|Hg}&ɘCe11Fk%e{ |[/,ϩ%vT~ n޾k/4/_Y Q|>^20gO4 2|ʱ us^:x}n[k/o j4zKhZX+mЅ,zUAEPk"@6/ExW|%{Ɨx> Q'RfHƛʝø׿8V\aԌ= Ibď16 wOi B|^ pF=(_}]+եv2\N'Z,j^F=MuQ@C{n6DѳJQSPvl#x#Hd5Ka\[{ s^h~4bZӷa:Mw!###zZ&Ѽ'ykLڅ;g6jᅕqֽ[diu=&:}yhڭ;TY(6aPܴm4GPEWR'&eyQ•׆?j~$j,sE fZVq"dg`pǷQoEFNX&־|x,W} ƾ4kU46jeXIb!Q[%?4ߦ5ƣqNnn$3]m&FqqZ) IgVm 1׸/#o<[~[dy51~Q'"y>9mX^:~Zڨ2%A@S=]u|In{gQҦ`5mʈ/ QE [-Fcg05/+MwW|3M-9ŝt+g7?0nn:y迯#j(U,mM>$6heZ6a|H2W> t~ӵ2Utaϫ_ .o 9~],j^u8\NXu]Hϵ|_|7:h^&ttvaUWk.9rWk׬#Ig&+MYu˛Dk_*6/DF "U\*(E2onm&-K,"Z?>kM;5MzY;Ity1>T-˜4e*0zWBG=A5S$ߎZ,F +"Ѩ>q&{QB'e_ÛK}2[ۙo^R{J1*`+r1K@Gqq"Gj]U$cITk42=a1@!'#Q <;~q&; |K5M?P^jw<+]on<,X:ۥ;а {bXtxcX)eѷkznc-IbNy`5}8OAZiZom136#Wo(!#h`#bX=kGwc\׬5h.d/YdyYy,yj_5gͺ+c {ԎAsLǟ $$vo/m'L:nyӕ&ua$rsp L~&cMOE-5{Ek9XĈ] )#r ү濧7'Žu(6 |G<=**9.Y%IMg&ch>'i "v]6hd77Fɘg,ð/zF;nΣ௵kV^s%ޣu'cM9;7tQ7't;M5./?-no}]Z`ЃږQ@rQEu_ ԰}c8ޝk0mmi&DEIbzbrKKW-9Iߚ7(zg:ŷ`1E]3':%tsF6%֗#Ep|M tn9e5kvn UgibvP c@dq^~@oӮ氇ep3DVgwIE_ G?V!֖IGY<#lt 8l ?C🄵NKGOIY;0B; <|4{glI4{1G;xKX*/LZJ}oo$XZVv!'#GnF.k+ĴNK6G=RfɁiVUgEt/Oc-#Ե-CUQT,d #%t_ ~%?fE]mRqk-PE<5wPS|$dGF-7eQ 1TE +~t+R+Xnab54>F{*ė}sEPQ Z3+2ƭ#*WӛHJ]nTK2դWɔp7eMzέk-uo m,IS/%x k^ŖtZms JSLԮvq5>xu[h3h ~,i$d1D~BOC7w;?uOiںRYYKmm[˒>c>|<Ҵ[S^PFfY呥pdrF{;RA#)[awGy*~/axrٮ0e*zרw| <1~*jZ?5əcI]VK sµ|@⏀,}hkڼGĭG,)UxkQuCKl׫s)* =:סvj߆Yi%i[Is*&(|XqB%EPMvdV`77:ڀ<[Mg8u ˤ__S]%/gyxUUwk@Qլ]O Nj2jEXj\mE1KBG'Z姇4H5}{MScl(x?e\8CGG Y+So iuمJ .@ߏ-A-S:ϠtMQuOTݺN"?rWuail[;MZ-OiWh!Tʪy^MVKmF Wy8?ho/ľ} c#k @aMQypI5]A>o<'h~$5iu=9MZE:5 ,$Vlx]^k}6̑ cF'mv_~~ŚcyB;FD1] 11'`c^Z(5Bw|ddu2,=//x^BΪtw#᧓y[e"kuQ~W /#*& іdUR}GjC7~.ĭĺm:#ͩOv4Ml@!kL]߂ּP;ojmo5 eSZWbir߈YI)Jɽ {WΚo/xLj[xz7֚ڜiww,qHpQTn-I,muuҎhڃiڅ*#."0%Ww^Wm-^zns_lv%i PEU-ImMzj̢-a|?jZFf[YnZ n؛?ZҪZm*QC5גr G3foZWC5MC,/䷷(OJ]GۙX V^ŷ>3𭦳sܖ hVv7p@\^gφ7x_xBZt+{~2#i~ϒH@cb?uO>5/jXOK0yHYTŶY؁ER(fx③r OdמFm)5[bbb 2€sbbp8b_;_yN𽬚F7Q%8Vo'gW˭)J+R)Pq4}6#z}: Q6Zr^Ep?e; x W_Uz/6ZŦihIq槪\C".<Ҹoܚ]^Ŷ>!Ե 2=I̍rŸ|Wnu2OEC7=>ϥta{Mz=&I,x|-j-EwV_ > nnύu-wjZU6cqA~V {y<4$YR@Y0e֦Gd:W6cMj:Iy~{Ki*$9*ɯf+^[4?؋nCk25)/sSm},x~!U:Miqo%]YH">ñEv.mNYQ{VUxUPHTQǥf|0íZ_njUMesV[b9f1V_ ߄Z Fy]s%ЏRk;p.h;(3çhK4v gΘf8w?fx_T6QD^Lv/mOȵ7s]"Mo2YHe&MŖnt oͺ aiGIj:EcxOƚwWִ3="RFFGLATQͤv'M eH^0bPI Ԛ]x.]TZͦiq-W%W`N_;P {Z+3A>{T-^Ym&YQeF񒤀^kN {nn-d9ٞ6E퇁cu;i&/mā~ck((xsG5 iG W͟o$H#-eMt*9`bNrb/>[-}"&a)XM`n9umG!/o4kԂm"xPE\!;s_K=2(OxZ t>!t ƲA2:I̥nmO|cW xRu:м2H@~e}^GOFKxSYA-땣o(/^ju ]kXB!61.= ~5?kg׾zϊt-Rkj4Q>QA, f0=~i^o%#-9cN7ڋ*IQJ;OQ)U[vX щ+{*PSTe[xy""/8rEc/}ĝ=vY&i|۟&W%1|ʿ-{m{İךzŔvg 'ᔷ" Vg>/֍O76oիB 0mo u^_ÛmY \0ܘd\'ExkG{?P:sz9{Vcd@<|8:( (?D(vNW^(WKJiחS ˈ80lI'־yxWI }{6nlͅм !uxhDY_?xD֏i![xfKE#`k۵eO MVZe첥hG!a*+9' oxRKIBj2hxUWep2[Z,z8k۹<)fk"'uxsOҬZvq2jt=VFIBV@ (y׊|gi^k]2@ΠW ڱ4[&ׅs1~OYEޡ-RQUkK.YT*(uC$x"]~ k6K;ktx4Ieޒ&qAu_߈%HVT+YS{)Xi#e*B( *U@m}m{})18o-c֦0$rR+ɓF,Ե}R.n )+QhgTͽK: _pY2b)ǨC?f?hk<˔k 89Z󏄾O_O,vy+4ҳo7in8z-[T6_,,YL̅BR90=Z?R-&fbuΆ8pENWPMۭ nl9:Wj&W6P2-g'Ԯ܀zVRuY.ng>V3$ XaJ@wgnIcӵK+"X !N܅'\x75+=,㵂 ޜ *219ʰ ( ZE7Q[<nlm?ռ?mgRuA5[E][NJu|]KHQo-{RG ^s7u0Xj^u.&TcQ0b0~lrԾ3ORji xRK!S>cխ [v=ԭu[[mKX *2TH>'ҼqcIBF\|=)tj|EWc 1nUm`\s֟:Y|YAK񥼢f{9Dcjo3m<Λ<ݹ\c=TrGn;Zmj,Gc12+$.ۿj|'uK.n䶖}B`2ŕ.bTLsM(}&Ex]C+) #ڢӡ2Ek`p@'$Ƽ,]F [{ hk{K##.Ǘ;c]O\RG vF. 8ٰyI2+o>O5;{MWrBc ##1 ?-CO柤une/fX"l2[i\Φ>?xG5 wY%4,zTCcd/]@g Bg\>]ygEVe&uwidk{u>9fTF@c БwtnuOƺ&ItJn n7F.m(͜ZfۃĜ0P=k*hLRur (Q4;?4+Ae0iz+[DdAo3 =sǑgĺ+~$垦!5eK (ʢ ubӐ1SFDW(RFURQH/q⿍Kmimǫh[% $}ҁNks;F6Ue{~'{;e=0DZ3Ao˓ӯ~GnǯלhhBn=̱1+dܒk`RB=3ׯo4]+a}x6zcilTZ6 s QD2ӳw/,d;]M{!isRhɹ3h9'#?y_P)R.t¢Y޻ oWΞ0OxZ^swioZN. :k؋IGepO4 3O^eFc9y*r"B(QOӵc᷋,4ڷZU6N eBbʾ~]OǍX'ҭ|)a`^mY$eqXTf,TBPvTݵYYW7]RDd{!ή8: -_Ϙln#rQp=h[k[ͳ,5I5H!?6UHB smOo՝YA 'a\ט@y/ѼCu}7ߏS~"x;FËn{DHwVeªke+\jdpvxQv]\ Ǚy jQ=DN}ڭAX:6KG}f5;f6'눹|Mqem*RHQFoZ7Qeu@Rp-ża68J!VyMK"֭nLCUi1~f5욍jڲ|Oz9hXHVII°J\B|ʬl*N4umcf:,Y%y!`dt ]]Dž%ƭ66zOmnԋD(…_uΡdb`׈f Yq[YEH eрXd^Ez|>}tv]'hh7GOz5>' Y7D0bAɪSx[T,<'c=f]Ad[VY&ɼsڼƟ?o;B>4~Wv~ ^n,mӼTSo@[n[ VW^{;ՂX.vX31 >_p _??z?ό[߉vSLn/-ginE k򒼌x/ #u<g_ϔgg5A/AI.tm&O%cÅսL:+& O|Q O|Qp6L]J/"]J/"EbbS1bS1\ +mX_E_Enb(b(tV&.%?F.%?Eۢ1wA)1wA). O|Q O|Qp6L]J/"]J/"EbbS1bS1\ +mX_E_Enb(b(tV&.%?F.%?Eۢ1wA)1wA). O|Q O|Qp6L]J/"]J/"EbbS1bS1\ +mX_E_Enb(b(tV&.%?F.%?Eۢ1wA)1wA). O|Q O|Qp6L]J/"]J/"EbbS1bS1\ +mX_E_Enb(b(tV&.%?F.%?Eۢ1wA)( G4U/J֯lm丸G}ʬ j/VtˬAǼ^}]ë)1k8LvO!E.~"RrFT+]v+sBx>{R|+G:=^YY6q6wd cmۇ!Yy;A畧kbnmwe8^jv֞Ume}H9Exxѵ7$|[>oީ m!RaGw/>,[j^_@|wMC@fn=43bĩ #;@x^ |gWL榲6RO=ɖ+(ؠpt+>>׼54{kܵB+fWʅ jXsE(vNWWfE$AąP[+k\~|{ud%F5Zkd]* 3w~xςx:m~:۔[ƾ3ᎉiZ[8W1=ݯ.xNWV:ZkJ8! %$X::̧ [N^r) +?gI!RJwq(I 1E?Ҩ`88Z"#Fhm@[hg:.]bvɂ#rBVJL *慦^#ⱱ 5]3cƿ_~[4IҮhVdXH iNV*.7-[eGkw¿O8MY 0xXTS7C}X_i^񧹗7¸Rl|OE/IS-J=&Mm3]iw~Ԍlʧh3)bCһp'Ù@:bs&ud;E*5kxi##~wzRzSYǬ_$]?If+b X^,ǵA5\\[IzIr)Ⱦ>*]rP\oj>-mxTEn Qһs a|@3C}} ' Ͽ5mJ;τ9#~UC#kïUgrk}?>iU=n)TE+/[H]-tu*;meS8U|`8q .ś]=w=.M)Kdddqr}ulRfJxU* [=b07N߉F0? {W3e^ԐF\_Ǐ/uӭ4뗞h#:t]_|ѫ %9%02Es=G/>] xg\uM?D??@~MiwZDŽ4;Y"{`66#~jdȖOZaIa?CJZ ZEV`NយW\xG#OvVf$^4Oq|l5~oQ)ƌ}YUZjfe%̾ 0fueIX.]$XRST`s_ [x\?s9[ Eq Ak?xb@?fg>d;cnnr${e7Q{Y|PB\6@m2>u^ n2 "=c|;;^0EYAkԼW|pwmvSQ-fΟ:[Ǟ-x@8 n[ݤ&yegK"m/R~;D>k;=C #Bp#MhO\mY?M>ܶ{^1'9>~s=MyH/ng@#f Ns^Y]ۦv#)snc6#W$t K cny~ޞ--` 2M9n842LwZceI Զe;GG5s\(K.^Y\̒LJC&|Kwt2*~dszkkyΪkxx|8`2\Clak`Q*q= ^A2!" q]↲I9Z$HXo s`Gk"kO-SvKHݐ#cH';kZ\D xWWz\kMKFT2yCc?RFB} +L-ZHEŒ n NRrPD?B5vхt7ĬS=z ~Ι|tS~V漷ᖱ=D؉#¦ôTkyQ%T/~f=Hd>Cj_΅B7|Uy_(iC&K3p J Ԗ~5$+h'!5ό=hϋXm_lK70^>ax u[7ս; Usv(<9,{q^DLKһXڸ+TqGU*jr?)h?Z K' 5J2"j3>C I2&U-M5h*»zU{i#@.ŲČ|1|ɻd\ս\Cc!vukŬOZ߉^94rZ̓}N:ڳR\URPC fsUaXI~5[Kn5^tW  !iTXtXML:com.adobe.xmp 1 2 3 0 0 122 330 1 0 M@":eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:330 height:122|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:298 height:110|a IDATxXW=߽߽o˛NދHaŎXbkhE MzMwlI?p@PyfڿY{ufQQQ"/^xhw`rPDZZRRRm옝cnkY1@egg###gϞqe"==+fbbeXfujyPN6WжVΜ HIIIn, KV`f A[XX Po+ՍoΪAŃf-1KmVtez_A%/0`286lgjlTHI֡OJ^K}sm#他ͦo+ l`Ŭ@Iy@U1@ ZZZ044X]]n:?K?z`.VH}fx) YZ6)@AuM0P YYY[@ŎW]0aR& ܦBM՝MRy 6M* 2 NHH@pp0ӧamfmXOT?uab+N{p[nwUHCzJBud_BlT(?@EF#3+Sg A0 !aHIDNV"C-84ϪD%>KD~Ar}VSOD OcD@Pp"cչך쭵 _tmmmzÇ7YUq3kJ fffزe 4XjҨlIVOTZBөB<;iJMi.F̆CO"`x(&  yEZM#/3got5Л,Fp+]la==uEѳt `LC6 ޥzcŎ_ǎX0}< ޽CEGȭ؏'rw% ۳A+ws Uttt#(,\P"+O3xqXX.] }}}:tKsN Vqqqa\CHDA5΂,*~qi:u #(2%Ź8cq- X<}$0SGAQAf͛-\-,Opf ƬIxPջʥ9':mcR -IT*u`ll sss/?Oh(+zX,q#qd YX07Q,㠮pDFeWSфe){fAKE' w!-BA:<~@哣9 " GRn".[#uE(µdcd1i&eϘ8CDF QL0n=s24λRX0P5Z5[)l xW5k,t K,.I.,T-UwOW@ebkŋX`f̘q @<N9(OMQV<\ Pc,z4h0j5 h,7 wήDP1baϴR*܆ aX2} bֳH(-AS:ĀV&ZRB.`2uM+qEh&Cl㚍ؼy36[~zP6ƼͿ]~_kXoQleӿ={`ʔ)={6?x 糒*ޢ!YTTձr8 `+-1HAeE|ΒO,*[i(+Ɂ6!#?+ -55\ &-T\#'3~݂a 5uMX sS#E|I)Of))aHpZO$mD܎͇07΁ M0xb߿? oA|v}+ !7:p%n,iжƪ>pqd݋Dlݺzԇ6l}Tmp3:Pҫ1sWUUqu6:V Ty(̓ꁪ /+2'wʋSLF#-&-ǹuIB]̛<*JŎ,:o{a00.#9p8 a>r4u 0y^VP ;C a>v Nr$[]dUS=U?OOOܸqC*Tqh67\ ňZ4sww{_ Z ,TbٲeC5aX>}TU@tC:t#k*@#ivrqj[AU",µ#k$ee蛘aذ!>t )TMA9@MU6opq5p*+"+:f11xqMBYgE9m+, 46O(q=|; 5 n8*z(%mڭqӰ=lU=DXh5YX1(Oў'*oD_UYHKKY(((;H\?BE??frEp:_[~Y~|GYGƬSafSoL?i0:n$*[fJ,9 9Š^Rero-KW[Z01  Rx?,~"Tzu pvi ;ڴ{cϜ+vok)N G0<%2dV޵>khMyP}b*أg˜ ,m}(ܸVĠttq=,y9?z::02mZmCjS|< Í g: b+SwA?!pNxVI~ؽq) @ '@?aΒ ki$YMy6`[kM À0ϖ`>cnjmΆ}6@Uu](j̨QXy-0ȘZxu 8o[~Qdk.EscV+5 KϦ| HV7v/lk14U6*T,A ǙK$]t.\T.,GOyGgd7p|6sY7 Mb[, 2$cJfյ P̒4풔wsleAo R,T< ww`?aGwYWgS l2 ,vαk'`}X F<VlGwɿ{X DlQٞ7gE̓U+uSq f-1h1(sm rg3n aY feڲyPA@Tvx%m>YAŃׁP&?CgIQg *v@U\R'>OnQe&`0| /`3 ^tD1vEa.(`韻JXG1wt5hFxG&X4i!ـ'( s> ?:[6sƈa٫7Y!{r}V'<>EnT ؽ~., afL2#'%A3FA` ؏m۶b0V&*Zzrm,-ÿ Tn2r F 4À0yOp o޴3,L=T堠'c{  "mn ?t't9P=R[vaafb+XwO ի"2l!׽NU>ʣ|HeMHʎE)uO#NO+ ~uiꎛ8L|7[f-kCUZjfDUۀnW7G9G^<'A_ ǖMC 8"U,%ɿ0; g|7Q^3Nؘͳz%o,oa)4>+҈6?_bEMj&V8z +Z~qBߍ)ŢVH"A`p)zu7N>Ewntѣzizqyg&⷟WB]I ݺwހQpp}! GSJX=y}>0x_T_T3(ۊb (='݅4YDD 0VԵ[[1 t!COz)))Hf2#*in?qQ@ľh ToGWƷJoqZ3(|ݞmʊlX@`fT$e@[0ҽH׻{^6uAYA:vβ)BX'`n46}ʚ}ȡ kS;ѻ;f~Aֈ-43ɠz(w[7TA_MM-I0 a]}:쭠,{@Y;O DpH(2PN 8ß% P ?G#Yݯ`؀P7_j&*JqvHc셸pOøP1'1M*;)Z{:':a , Mjifqgs뤈sn02k֭ʕ+|rn[Fg+Z֕/y9a;yOa[{~9z?? @5tv;1`8gT"^V`>+L4\?:F*(y cVw8Ps)P#]ѣTYT2ݰeM"41S4$>-@UYC74s`VD/#ՠy\BM^ @< fl_+ׁ,'g֎E}p&r8RE*Q{U ZRnԺc RYJFaqqN*L¥!ftʋ2qV % !#'Uٔ07?3e%AA_XL%+y]F~)+":ݯہz`Btt3ra>T,q71^WJo 5JS۾!ʋ/?iXgp<X7HXh TxSR覷 (:օ7?!>G>j P˚d5*`կQPC8>"x!!;zKc (yV<_F7n<C+>Ħ%_CJNNA5S x!}`=wb+yu/UeTx'vʸ)ڒ+G)=TN*iعq9Ms8$]%G :]p)TQǿ&g,{XRRɉ r$m~߾.x8/\{% ĎL(_wC,K:E'CԷt w cO$ hl7R DJ_d`t^`4sq巟`/T`{yXG  ճO\D)-}Sb~G FnU4~S=40]Uv>ھ-@di#!/Gp)}3Md 3},+ȩ`=p78?  lLrӰLGOopw80mSW-[,5Jjx*zit{a}tQ_Dz'EZT] LҗpNh}#M)܋AflS Et޽1x׸R!E.<{,dFֆ&TUUܲSph2jA^Qm*0ktٱdPAzB fR2͜g?rJu: :x nr JB (CZ PA8'1bIDAT wQ&ʘn>*5}`NQ,SF Wn=  Ao-/O*w!&%X_4*lrw? ? އs'~FuHkGh}*˅5s-4Ŧ^RcbI>x !Bܱx&AFNr$4~ + '`h=Mf8?ӾZdCA^XsE[/$XG2]hbشE} FzH">VPF K Kdp[zZrjoMg>)sŔ@Tҫk'Q3";khvL/ .m´TFv}Sj^5vz4gQ?+M"yt}ӠjhY;PEG > A%.=AվomT~^x3.^ޥ=zIa[;a!":]v|"N}N1hGc~EY">&ꋖ[ltd/Nt8x5:޴c<>%AŃ곛 }Jsi *T+~n^xQ\𳤶 ->'.` nv|Sd>^x;T>;4!. 1./WuX++Mt}xItFJhyfz#*<+LϹr:JijzzwWgJBP^hvY~,@?oDPQ^֨2ܜ,ztsl-O9+=z !sYSŅP9LبpJ} s?X,T&,iT0DLX V_wcaI|DAUO!ĕ}δрIJFa i÷ʹxFu @}RgkKJ C/ZAh Dfg(L*Hݕ.V7Tl}Lžp#J奅ycϯ'M5D ~?t!'W,+@C;]@JF$LE@U'Rܾ#¸1t94441dtD%%'u|8eq-,~<>ë1Uj=txh` 6Y !TV״Ҽ[ \5r XC#mw#a2 Y^c@e, aY21:q Ȳ(RP%C_C&p #(]lXTT^Kq au*4.oQӼjLg> 68jb\92cl`ǥ)/+0 nhAցQ?,ݼq9hpb,_be.u5ejHǴBT2kxX[/f*3P}9P5Lvݾ3m9LXU8aQά";8bm2"_@\uAaqI5b,*L,*.]6ζB^8e䌮 */7%(#EL3} #٪]GIe+E0xp3 0t:g1 VnٸkP?BG ܹܿ#]c=Oд/[(kq.Y5,*c7xz !śRh++a,[wե&M)uRO 5Z%yYR.TWHxٹJXm? iUO3P@UxrJr X hA]*z臤.͂V}9pbzv¶O joyY `߬ݎDaU5 հ0s%,,l6D%觭Du7FbσN6csp#aVWâ'A֜DU W`1k\qBD#̜4rFxBEy~r=dz6wm͸ u&0㐓c l#/6D#feojA%w5%*T}$~Te^?CGY_sD=@KA~܈RzVZw.4^S`UqA4p|9qX Sq*4g˩U!PL?^!'9KY`9N̤sҘ{ؾHUɫ~,<IX Gz*E{ҹV;cM1z:Qx,*))AxFeL},  (_oOhzG/m{J 2+J t:3!Ma1@Sf (ҋKUY_}N@Ha^@;LfvSRJVY"=)8*Q S|ǕsA,0%Sn $x4܋J}f?@E-n7d4Z*P8,.]&ΟY%]TT)! 4!\p@aa2V|7 U PiJ E7KhoY>e)8~`1ǡs(&KCte?n@x^TdQM[SFj:\bQTSw ue? !Qmɬ'W0faljPQC7cEDo c9ZDpYO/ja z5PA(6N֛<=h ꋩ;"%GPȀYT <;~*#˨TLKzE󰵵ݥ3رxz*hc4+FloMʅpjs"Ji)J]AӸ>4b!TT\=X]b~0ƒ0ƭ܏6[AŁ1gvA?k~Ŭ m./-Ww!EX^ eBQff0<, ѽl<TVIFjXyT>;WSի 'VGhX6f&'|Iq>A/O%0^'_ZVzvJ#KAE!ۭ zkf47c1ceeԁ*,T4, ٸrx-0dXLX-L2&/"H O'+9K!OC !iJ4TTK߶̈́9utp=]=sH&PqP~'v/Š3vL +Ei8Pʇ v͵anܣA[Nc[~zmɏw;.DO Kr0PjXmo.]{biG3YV5yfSe YrOp'YYN(v/JKEURT~5'ۗ@OTEw(zRdWq1P2پ4f<}s!P9ܖGroeɞF`l@U8O̝2FTPq||,Rqg*KZ3kza|b7Y)76J5oCp?يta={ BSŸRh@Qzdh-߇u)Mb\4`r@U=9I8{xt41~\? ܆sذ|5U0IH!Ga)EieElܾMa:],;=z {L:oc"j[$_Lnu=ٹW.-1~wK|J~@ I@fJ Ol (;<6L3xf$iXUS(? ?-e-=l8x w>Cmӧpߛ L]hwG4;7q1xFFvۧYʷj[T<)}AV@%,)˿ /߆4Z84BSEk^@ce7z5@J5< 2Rp력u0jH 6j:! /ݾp3[gl,.Uñ( h}[@%6Y ڃ>zzR>m~aQy?-Ş<J$A^),c: #kZsbD3V|]*A.4)UנV8LzmL^=M i)cD렻BBQLy+&BM.$**vX|n1!kZ34"}Woq\~Z$mY= 1119LMM`6p$.?r \]ptmY>EVϧy?V^N6r% PXTH" o7DPb3M pƟ^BvqqAhD$2Р@AXz'1b銐.LX?oLχwdMD TA~>YT;Q^ܞ,D .Crz&7J'/02Y r3.Ԇ8 -kM* ()CvSZ8y:0#=+}9=/ʪ>"Pq 札50`7[:Y@.BWYijP&YlT'=,Jc(ȱt >,oѽLLև">\]]5T ӳzj+WToQ}X{(ʧkn55#PE6HDVG\KjS_ջdeԕ'ʪj9q-nʧ iɻG7Bb}H֗w)'y6FR{EytփsE7ʍ^\רGu:Z.Iui˟Y06Vϖ˶:J>eA`? =oQU=W9.MM~ (6ZWP`*(%FS0Y:4y*䋗oeu 3{w>IC. qM׷i@eqfԆux9s2Z[kҚi)lvUT< ]f{bAK`ol¶GZ4ϥE*/ܫ~%=n.Doiv7UFoiTXtXML:com.adobe.xmp 1 2 3 0 0 344 431 1 0 7:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:431 height:344|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:388 height:310|0 IDATxgXz~9#Y(9#TD09眳s(T""I($As}la9:{wWwZޕobbb˛QWW|<ݏ?Ke/))i… o655} g 6_0<@MM ***`CQQѻg?b BYY~k^mmR7kSee%JKKL>9O|~ly [& D}Y StoE3/Կ Eҋm-8ଧ?JŎU`nbջZۓsnϟAL DQ$?F03{eu3 "f3JklyAKK©C{iXΛbמzY}2[w U }SGb}H((uu5xsڲ7_auq^ܮع};vڋ3n/$}OTsc`#~=SWoCRŗ p_z{LȄ2{ f&?2 D7ֶ3؇X]fmf`lk {{_ 2 򐐐01q 5mC]Ybښ߲ % l%zN85H lS% S?44MvB0ͷG*a ed SKl8p RP~)y?0oQJ_}1Q$$`=#reӗ` DzyrssuO=]c.| = s,!/?!n^=- m0bdG;~8-(J(BYgJ75գ0>VZk(k˒-P*ʩP!J0;+oIJ ᲐWnQhjiFYn1"<B<)^auГUr!hkkxXGZ?J)p`ڴi8vدüy z#`^ 入6P.(EuUҞbS}(kbYo7 m̚l 5UAM] 6 p;5u+@ЙM0PYYCNnͬ _>ٓE%eGhF"os0RUSfĤv00  ,GA.@PQfn<TTV^I áfdiI<?}1H[q %%q!w;OZ@La%xL]/UQzP %MBI7@ȨoBCC=9ҌPjԏꚺ nBq6h*plWY+'AVZ y>{׹|BK %0'@Xnvڅ_NNNzO(umW_-ilj'ֆH;GFPP{u3wWox@'Sv(l)9Nsk1ZSFjp:%ea!PPH%yHJJBA o?&MA&ff6L c%j+qxbI #X <2ʚVo23*#Bo .Q9U[Άkb5Xd<:AV X)Ye\}Q1t@ 4MhniF( o wQ/(ו= I#(/ #4A#[W+j÷~I8tLFDyEEP?2Wބy8LO$ss [hO/0~W C4 k^Z_ L+-@AOONҥKaii{X< |C4Y51HH)BWW:Fɥuhpz֔#LcE5#l;~ %Ag\ GxS|)1L4R&-Ϡpܺ?A!rpb]W =/nCUI#F'ł'7Ꚙ8bkM ^$G`oPbb4 qJkwt9THH)# ɏ,0=I1j4Y#1m%458VOЄĎKxP# (# NHV#QL&kLE GPVK&AVB *ƳTU ,qie?,/ZoZH@~șii=+&{>`1+k+acc]=+ߛudʮ멳`bNƢ9S1FgsTE[i/({ AS[NyYQ!bl| /lt,=2UNT{ HIk`}0VWH=tOFm.z]V L^vO@_MñK1!ᅡlc aCa:GԔ!Lׂޘq}s1,/Af)Vn"3ГRlc衰.c hM>@4!mtUd!xp P2>OQݭz8_5 Ǟ`_{>zK=NBϟ?ǪU`hh{{{!++G Bokx@M2؇X}Y{An\9YyX/݃٥xEP'.OI5-3l8l h*a$BtM]e/qRhtIDv8$\;\F ~t @q}#^TU*|3| ½*N:,nҬ:;;YrsRa3{f%)i҃965%C3XO>T؊& 8ӝYM[Hp<2)~dFuO#MuӭM1RQ1%HQ{^o*:PRV8\XE9EL\Os~_zcgt}\<=p^$s|˨ 7yakk'ѣ0߿ﵙKoU< LyűcU EUa:wM&Lă88;b14taI/"<:ʚTXĘ߼6nA?^ܫn½ utd `|p6RMUkl G(}E܆@1 ]xգK\=eY~ 7с U zmpU\xϟÇqMT65 /WBA+ ,u - lI)LX~GNSX9yYs>TKw׮ `+(Sћd|~c7Ȅڵk{=L(&fM2֭[uLނʽ{0#e$}S`A垲H~N! ,E#F(ɱp?(h, 5K&||<$GqB@8JބQWar5'#A0rx2T4#*)]_[sMʪ0goA_- 0P![MfDq e:i: t_HoL6Tl9Y g'od_bEBD옢 rUMYȗNt =Z󡈕W(`Y>V=el .fG(tbS/= ²?{$5&{rݰ4Ou{֛Pnwo .@oʕ+zfiiщ|<k}-$ K3o>lS@å 2 @Z\ 0a:f8Lx#h!Rjjlh+@$W|#Pu䃗-`2Z8q' !7 N'/Ƿ:C` zT˚:ZRe8F2mfS&L}@U\lT j /IBU2o9)q(664iM^EM\ O$CDF+C5VvsrӰ}1QFqiLYs4P,l)V6ŔiԏSm1Fo$$P?2@CԩE҂8,Ԋu k-릻_=譎ޮ(1:Sig:{[1BBMSp)CPJU؉3pMd_Qn1ьPHJHP<2#T۪rqVHlJi%-:EBT6/=Tw0i:7&5?Xsj:O_}I 7S /Ke,e -S}kP G#S޹:b|܍O$TKc"GᴪZ#ɪ2ʺCvPBTOzeu&{E3{C\6݁7~_u1 7U׺?&嶯"Q< &h`sUEr3w+:2(XK_-jZ 222Y(*.}ʨ,+ޙƽ7 s5()*@vV&WWoF&JPQ^Lz&55q*wҵ4QC++; D[&*/{wm@R]UܜLWwqyi1^dS;;&3+e@W]blj?YNذkX>L9;$ њ ŝ`GN&T{ .o_g&Pfmg' :E>Z&zog~Z] ~ A%X!a\eXN`ӳu{aBeR`XQ0Uoi݅2}Hg ,wOuO}< 5Ÿ||L(U\}{Ct4_& >g?U L83zYY̠@noL3@nV!Pa[-F`4L+fg\%WL3ˬV/;ov?,QYݬBT?< <<<#€xAd&g޽<<0"\y_pӍI_ 0&%)O\' O[[ ,1QpvgNp ĊۆLzT  F Y,=ڄ]p3rj{,sV't,ɇp:FDE<R2_xoo)WSc>P+ʈCJih$}P_SNpGw_6vRW[YdT0~|UU++zs3]49A?;ٽf?FcY;k+Fcﲽ[7*qz,Y>ۚ Kl at,t<mo?#q&Dc[ .lpe'mL۹e$6BPmҵ!/5{7.2Ttaddu M[5דomi`Gم=ZCu̙eݴ5WgX+aQ"V">!2ıE7 ޼n3@Lr`䙈/]AJR+Qi" < ))){&<@`P0a2Ia+WPVтse !#Ub>FMl_ۮ5zYb @^骯PDFRC keqW0\V{=45(7㙜RkuH*aQJz/oo8@]+NW6g=GOٳh37Aoxcm*xGR\hSҹ3!Qh 7lui\.d ;[` (4W#+L1T9&e/T (I a06M"]ºQbˡ Ja5`LVs6nU \_8 itBmn7u\#i=?[e218 ,#\OmƔsw8{x7l6X["7Dg&;{Bh<ƍG4qc=^,@uuMÁs7U[ .[{'πkw| @*ڲ`aMW@<^~\ZaSH+kl~s%+S ?-Vr|ni=gn׏c 3v؂B6zWt̙ Kl'ufu.`c5bs: v6}\CM :vsf4fjAV׼+-tz7Mx@txʕ"np!ٹx>.:b!֦Zݻ&sءw؋U[acm 3SSa,f/^wWm2LNM񫞨#|)nBgvy>@MhZgړ2p᪭y + f egLN A1RW$tǍwɦx[U}qsN;zImHEiΛc8Yr*9.o@`ӘpTa1^B@9w8y$$a7wN;M !'oOowQF8i](k`m IDAT^Gm5tԕkIZ|+BBIN :Xio; s YY8z"I)zLŸF y<*) Mtfpv1IYl{fh$ph^;20`aT HJJb- ={sM¢'QZQܗX=If6pI@hX8R! p#:J 5Eet . %0Yk? L4> V`i7 Ģ)f0D[zrR-˱hzmO'Ly5}x=KoiN<- ኘh5Ce '=vu*U$bǚniL'ϞB1QĆ@#j蜑N!Ae;eJ ""q` Ȉ ÅOhuBDm+'@ s,.Y967 u; uEyL]N^8&X`ewt0VOB "|.aXl64ա">wfCNC2rC pq̶1 &ΞO +6l )> 8@5IPa3e:N]O[X9oq=ͤ5UƑ47%abm{vԗN'p44 J|nKKB ES!Iύ du:y>R$WXq8ʺ͖rQ%vu%Es_ocuYU'>Sl,0)ԒԝJ߳å`pڕK`ck ޡ\LUA߁WK!Eզm *:,40yyS5]u0R l= h$ 5tFEi4 chjP%e66ZrQӚ_m~J yb]OSe> I@tfm;9%m\|^ǹZ)s$Bg*g!<%@qT׎("7WWm)M,$ԕ0'W *eR.U0 '@x^ 1r~/uڙ8`L&@ZEOZ54I?b"ꋻwsSL팬Wb(.ĽtަL,Z(i(j*Q[SYUX4+QM89$`9s2j9K6 Z믾sV9@kU;,fQ65 ܓ^'Yz0J}3X)3 0oAR(5G`Hx izAt-hZL@*~ 65iHÊyV*$6w'%јQFr AY\~Hf!n0CDQ-Ƀ&: :j8$嘬/ esD< o[@[urV ymSk~~ۈG7C~\ƌ8Y9v˷"NKHK(.!Ona _[=8f` &kBʢLܼtK̂$e]3uKRctRREq*VJBJ+&,Zb @X,ڋ4d#3#`A`ps41:V.`xL#Y@A"3q,Q2F zN2Ls'|W3p.&UL4R9]qGLR:rrQI5'qph茛Nz{aTد߉$ 5["X-N M5c6:2P7Bm !yƏyyPP*k`o,m'ƼإqjD0@x[AUR5{4fc &/m,9CBru^;"@ {u?F.HSŅ1s= mg6#,ܼ| UWA߽›v|AEr0^CzPHnm@,a=šP50}mk5`&l^h@ o_FR+((CH 4QB 89wІ;@|pɮ4 >^w 22a蠁XIi)P@0F]@hDBeԕ{u <\" uyX-D%"ud鴵THpc- ˌ,ⅿ)@Rm\"3i =ʣp7=@5C Ns@/91ngC0&9;y,%0u2+,_j)퉸I4 횇o 1ML``hH `0O \p߼A(*sk n<ľotIw!@EH2x >miζUD^>PJ$O!bzWuVYJCI3LXNinj ]M+aы L\d At1@Xg/v/1PNõMLԘfeVWan@W\bS^0r PV,@mC!/l>n>joK{1N9.CK؉hľ~! B@^{Z5K{ Xo u/XP98My3'da!)0N_[EeҌ@fȒ=bf2A@Ĭ#FILw z.i%;лXTCY u.D 8t e=Sr]#4ܨJPHbN u+ .mԐAB@h@NYקCzr;ߵM T׋Г\]Ե#m;X0&FVWvNמ3ucZH_@D1$ԖmM|fd4}F==XM[;QOu_aY.&gI/ХuGu'@rC! _VWγ 044znF킵 E oKJYa&,QE1MSu$@`LZEuUfI 4 !&;NHTұMd1Xf@8jQYYr, 2B=aG*'\vT \OƗАQv PF=3:hag 82 K~ߵ]Nv, g!a@9qސ²] A@TA޹u9?SYpaAY(*@CMeAqulJWQZ@h"/ǻ^@ GwtB^C)ܯƸ80UO޷!#L=e4O)8[J9SWj.Z 8ső\FR܂Op:u fvd}܂mȊRP'SOg!0@x+ O=H{Pzք8-*tB%Y&UC3}-H 9Ҍy龐&Q6opyY2}'7MH~ye;te(//CiYiA)U[gP5/#[]eeehz_~F[C5cDc RA|~BK5 Td`l3~كk i[O(X_w+%{wOmIP ŻURɧ" 7o[cdRTz 3T@U^Fnݼe2ҒmD(j#&'d!\jmc }Flq>4)Xfh]nSPyvY5\Y]L +|O5B@^C%|܎AQI;N\CQy9 |d9|-YPKv[~!Oɽ0rQI}݂/L07=hNto |d%/2PD#\:NUaupcK/ . UY{qhќl(1'9X1WG_s0֒Ֆ눉Ë$4{$;WCIǯy"ܞ!V :Q2zOJ B08O=xJ/MYly-,RK'5j7=,>۩;Þe֐$s,&||(c2\VjJc^桰[BnnۇЧ4>YHE })^"?h Wq 2Ja0>*Ƨs HGCAI Z:zd@SL7e l>x E\ٺXchrQ) Q>pQY,?vQmAC] caeM)adbϧ1\8+̀"M`jfB+JȏZ)GYSn~pgu xJ %y \uыA`"]0uT51n tԡg>S"2hhi)%x y45 z*1{rH+:g'c.eY[\ͤA_ݻ \:ד;ȕHbC(^o-r܆:dyv14˰p=&:8k`٣WK)u,9͟[bü10FT R_]1D85~8nL܂TQvɷ:x Ea8Y6`-LIW"&5kʭHE8)I1c1T)2ŭ]Oa!V)35 C`F#6Sf"#Uu;Y+7e~S]rY g6vNNps@xL;ioxreo]&LI/M(1oqn*''wS~%֌VO;xeI;iabqjHN0i~!15c#31q! < +e! 0M4X?~1 ,;}Vʱ4X>/0 \ AKX.VYEg>>ƞ#eEf sBAp4ӻ kowvuyQ=w hbT]cOe5u{VH3G:k} { H@.hOpxE.»7O\GSWP/=ߦS'BA F(ם?r} (%Gh*+`ᐓᲘ0*kBǼ,ddRڳ3s35ѧQ]M!3Ns)דߝ}@YMUH W|{~[<: `$?- ||f]w<Еof6P\e} ÿe7 ;o?yyvZ4<<<#€x7y7<<X@99A@.ȓI㿾^ͦB֏\|_}@d ųpZ\O%_}@vK|nǹ/m! ^/2 p{sp-3_C_ܦ}+?+-<+17c /B0Ա-E[@-xd|KmG9v 0cb*ziMQپ͈դ(Z(u4*(ieo=ֽf_ڈ!Å?ޚgp0x\F[ϟ6-.6<[{A|DU /DEpqB * 6w][@~r}5чܤT3h[vڗZ;[OA\X~ FgB;jw 7hyY th؝cWX)b /76} z+vzj'*)'9뭴m$ ҆AԚXFl=}Kh?Vk >xFҶh?f[UcQ0)?}-W֯=G!={RW[{>lShJn3vXϬ0xĶmz6nkio+pHɨtMXG+]ceYIQV,%y9 &Jjذ *hgoڑ k%lw&oj03Ԇ$$aj3h$͕{ F:2P2Ĺ|e+%_äe0LLcAHJ,{h\m111Ha̡ ^GBAMnlߠ=L{)ז jBB\R27e>"R~3e2 f&Xk hJኸ ç$a)IIKjsɓ냚<::6x+,">NcP! ߋ@ ~tԖ0G|`)+Cmp~v訫@葒u-|WvF^||PYPv@FI@` ^pPS `Fu]*xa'efСK#Dޛ燵PVs9xSNHU%b%PSQ:Ũ8 L1xNx_)im+Saq虌Gban_=nL #5EI@B]\?wmllo ;Rx$1mCxU.Lh]zpܱ1|] 9YYqԯX}J+O@VAq+rbn5$!|sCl Gaۘ:ZǏ?nH\DLNѻ?{p V3'c7__!R\&،RܤGp1y.NsY 8s.itY 3m 0M揆8ĥ{&EfZ`9O|1Bd8wYdI.@,7m-c24~- sM@3[ Bj+䣼M$Lr4y)e;b2X!#%[3 (sPqhǃ[0p@t e&_!}/I7v"+c8J^QE)΄:+Q^QNڸv4fc8gnP PR[Ay$`;-ly"yhk4pLnzv?Lu!k,[pp1@e;$ 陨O51 aX0 WĖ=IQؽv6 ;aDC="B\ -{r7`!z(#O8f¶uHp4ֹ%-}n@YNGiW@(g,fbN p<דeьO5Yp83ع8zGO ԗƑ p#fMuPpnb&ka,ڴ\m`js`gD P%Cc."l&5c8xRFU"L3BDT!33 m3O}%8x2oVօK)34o|,ʆqԆTfz^$Pٹ" .Lϥ>S|`lu{v׆b0}򯟑X rʰ[.#WNl`r=N{ z Xh)FN+9'4e @`}<ݯcd3H˫5RZM7=?=@18݃H} 50@L14l,ӞTT.{?O $ & FL`Ɯ##9Q "s9 (7ܻ(DEs>1{k~35`?T#E8݉R_)LFv(oJkN|ؐrJ}X>gp(P* {%zvi熤J_ݔx:DZx 5- A=1K[h wщ7'C['32Wu,c_P_k=9ZFF8aN@G@JAO[I6#Z3cx{c 3{ (gA^FeՖs5MG" m-ȍ kSmZdԦJG#/Cf~W83}-xe[iۙxw1 㕀,q& kꯀ8e"66QQQa04fda0Og;"}wBVBk31s;WBzWT- S$@B)Y?OϹ [d!+$DMl?b>3>jEVp&)N 7[͈z~37DqK;Ҽp QĘ9ˑ={^;WBhjE3)d!a dTV~- "hUHOIBlL4#p4I^)+mH 8|Mmsb,Z4 &4͢7n9-,uh3ֺ轱3.BgaS#Go:hLU+rP&a5\[Kڲ4Dԣ ӯt}om01|_=7G> ߋ`Hyo5GZ. tt4MF FH#! *kv=GҪ;jeDR@Tah,`hJ>,ZS-Ӈb%xĶVC7AbӴEIb e$B{:$4?iK@Kr5ea,TXe_gYy5-9הp߲3a% e]Ew\Haǡs6߿۷st"HD ]U':a]ݻ~0mTCۄvb~u v̀k>i>#i43@ь0TSn̯GzI(haӱhs#4TTpsz|?UlQ~ݡ*Xpc=NBt0^"| X@S\Yk* pN[[bFZahHI6Wh wP_%SF@Z9ΞپP¼AB0%M2rw1P^, $U0g;ݽݳO`]BTBF$l>){IPv/oV{ cALLK%!닰9WL9$ڷx!Qǚ7QAZ+v⣧g@OHX8'6/L-`m̋ kv{y Jp~n˫-1G$GH `;xxH*aJ7N I3k[c$L270st}[}$ӯ&@ǣvⳏ){ut {v~RLu=w`ix 9Bo=T+OPPk^OC:S;X&L aML1!jqq4Rh,X`=g Yd1., : CH{̥c3yMOH¿:SljWH8b2Xq?Ac&\NBnfQb]pL]/\*z~&TJd{=NpŘm@hT<*P3MU\A6<CUix6{6S0ę) haXS{ )elؘʦiF설fj-1%}!)VM.Mۑ+ȯ פ֭{+@[g}o#V&S;H)5FqꪮZr:D.^1* 0-aiiS&z 1oHR\qAm@8Њu+E4S{1ΰB3{gL34FM2ĐqA&cOŘ{In6Fq>YqB mk. Ix4RvO%ݻsbN\;p!L0Tf6?%fdç/ $4)/"Aa=D+_SfcZ# -x)nP`q/BR qn|HH…48q7ڍFb EbR2Z%f =Zؼp4UuF@:EOXA$\)56]f&f0xPǫ) dkb xg!O{2vyBx^ 5+{GGh(y6Q:756"R(Q, ȊcM .. .BIFw^aQ\[+A9{urjA JVq`z(#I {H$0b} q;gbєa00Cq#{!$% 5[v>L~4Gdh!L.Guc!087|.ɳH)'iwmj+=M+G+)/eQK=AJdN2߿eX@9 =Łrݏ𺂞m|D@]AӗoA湤􁄦Bd6=}NF+;@2f8<۶?$$ci}Phb؋Z\foEz\\8CG[Gӣzlwfr[,o﨓PP'rOI Ū2T54Ak( g>yxH#)%SIUuuuN|p RXJv h, }\yJA 2r?z1íLa=q"etJS-G8|ȵvUUi6ltL 8*Wzmŗ HӺbƮ5vDVaz,hBYCCz U\WGA_Kںl`FV8q;<~:߬]-=|oioX:BT!"]B?WNJ IDAT]&|N0ow@1OTnƱ6$bh+@&EO$ S]5R4a8 6BZ )M<\:]icgdvLA{>RO@YfT; e``Ii*daa;XWE&h =3~q4(u+ ;+#hcȑX0<[Q1am+|~VP/ړF\UFJJ2)c" dsV12P$''!..w> b0toN^҈&t51喇q% *vW Lk>]|;`hSP݇21PCyq?UsЩRRΌlheEVoniQ.I#@tT$42 4QINDe]GTGg-=L1479hy &"{]Bey"1 U"ׄ,0bKsOsGg5Ժ$ǠҰۺcXTӽ]cbޟDZC n6Ӳ<s_$;x;s Cצ''gƑIgsWJ'WE;SQU[ ͎s,h9)9g ! G\O4d^23Ѻ{H+mg&v)ePfVfZroєXe8duʐHNLbSEc }Bb# <)/#z>cjJCZV[3<72ꊉAna&&~.!Fм6^Dn 0 'o]Pmbݿw Hѳ25?E߷wrz.==۳ݞm.U$`Tƭ-'/}20cI/jǸ{辞t#j++wiwԗOaFXQZJd8w Zqo܆'/^"#%-sRX"B?Hw'xfN[Ʒ!4yzc 7(s[Dp<5 p8x8Fp<dqc\p<[y8̀9x-&N .p<|:pUT4+cpivp-|Z[чo8 88,Nnx+6lFBp\ |"R3*t Gѓȫcaz - WPR'@jl\3Pe0WfE}>Js3ԔgqS1iXE<$+mL[YUptdo*ȫ`(H[mHy]l>{ֺ@YAƣYjnsfą¸Ql h b͂)Ds@s1N} ̲??#Nh!< ŀ~)sQCKAy9Bkj{qqUI{e.`l7 FUAϲ{woIzjԒqļ<&1Qxca x<ؤd?icLc<w3^=@BZ 7qfE=:1>j˱Axܔ0,fd] a}}e>ܗc/ZWn>@o|40I{  i Kܿ ˱aY ܦ 0[Dukag'k 99 gEcMR# zk?Fϟ[3=ia(^gO׺v؀3ƪWQ^IK% 3}lP, Xk@:.zm0VQ02Ū}8 BY~x~ .. p-$ kk!')C8svjKE^}/)p!. FK['?D?.rgBNi|1a*jb59:BWSWu+ن>$T]="&oÛ^Q3P"" igC ԦaՄ!wBZu+ ,or,oKg!OI 0ڗ66xIO.\_O4JYc%=S\y0BZŖP'7hM @LZ䊢U) H ]]cl<Z47nζFx.A#ư? Xc ƶ.#V7$oBVS:0 TFdPK}G˰QgPJt 9 Fբq'c>΄Φ6wՎ[`I*{o+9cT14Y¾6Us%".m>s!+zvܯ;$v3₰fD bkp:vV/Ekċ;P{Ȋzj݀c[)*5ύRPc}]>ВӱS@ {6O8tA}4԰#1XE6 =!V턩Xd .^l!,4$z?kI\ 9%uuQ)@~Ckc>0VU^9U FMVA?2{E0v2^cg51ah$_pcxV> T>9r {I\TLs.Y-uC9)xP=A/߷4\plr^H S!ѿ El l9KopadnaIZucuۊ~xVpzwPO're ,lX6VxWA] nO kBGK-B}&X<ǘC\L/!RRdaͅlP}р>޷jJsl8#Ud% !_ My l<| k 8x R3sPWWag1c4@Lx -0U@Xb9.\صNh̟-G.!gSsuyV%fHՔYWM[=.nD`ʚ=P +M g{SLrϮνL>]nL-j)(\<2_!%c** n/eX贮$SCOY6vԦa9f>F:f6 s͠jd+Ŭ\DH2d%݇f܂ khsc.+jo^㗟b?HV$`|Hʪ"\X6yeEYFƚI@xVH6G9 A8f$?e`i ?ػɅgQSUQ&0dD.7 H6V#d0|luvp c԰  B}K:[Ay,Tw+ >?w=aĕ Z-*cGTIuO%p1*dI$SW_׽NjkkIiA{/qu-nl_n? ,6тPd_p\0HYږKښ+m!`>H *fBfD0Xv"a0Y^ų`9~vC)wag@0;Ql)лe1t-mVVuطi!e]yzm `ZwA -*ퟐU_;Ƹ7G?rSЭGOUƐ[|ɏ܎L,> rGp >&uF8w /^!]85!);gAt8BR^ %-ل8DFšh! *] iLlOAR|/\_Gxp2摋JQcN d{ĵ7JSQ`.ڈ޳2"0\SoGN0z<IUD$KMLv#8ߧ'3a.DC˽Π+KK@i7`3xZ+vlf?gؼbW/{}iiIZ/ )h_<&#!lfT;J-[o4܂"vYX2ݖ,\ Ac_{O]FHK #? E|#_0M [^K CFZSU?%$ܹ۷Z`Eȫysb_N`~7_׻> "47#2.y9"M% 0o5hwgOy DY w#?`,a0TT MM kjcn@+[v djʰv!mLDpN1 Jxq# 3S% $ 0M]U^s%% GJ>+\,of{6jJWj m|Deh+(@EUCjL% фmuhb?i<K>Y3<nUecr'jSZ74F`(- U+gc82RMڃtRJe,wČnz?ڰr^)4Wc1~zdPJ)yp=wnL'a47faN1mBY:kpxHjOx;fK`f y%e2Ua72T[֭ yE%BSCcɝv릺BXA T44up$ 12? Rv>vZQj0=QeBnokSY/-VݻB`"2Re-=|l)MW{ƫǹ+ M]=؍s1 xUhmKqn "~QRQuIEZSve$e}0oyl. LЫ(AvfR+++ ed~Hd&2?7KCYwDiY9{t9(`DE϶p(En^RE5"3=W&S\Z =Q@h$ _n/lĦF0JP{سQC %jUeHgHOGaIYwysS#]}Lܼ|.F(1aEa?ZQSIjf͍(Faq e+M3l 9ٙ3QV#ڨ<~8a\RR4wS賹EyY(*+c%j+ϴ-_vϦz cYU#"HY)GvN{XqE94FUM-KwF8Tќ0M# !4""{ޘxM7tWQ'thQ IDAT>vod*+bioղ﨨@<ƤuC*;"L?YatË*egˡ&XE_{Vnn; Գ|_O}~(8|H lLXx=:4rz =X# l)W otZ7=BӰ-3;| vB_~ 4‘0U?8 ud!̱ŘN)+3o:#~4kiʇ"grjBII j۴;\?cM|C1؟`;9x pf)gs<,p1' 8x8Scrs_8 + T3"4$/y%_|c75%Y?I /r f}UTSUE5vUK!fFO~sW "kr |y @ 0sWǫd]_n3_~>m9@|Z'g!pY-9֜a̫@L$hQ(*xgk~}e"_aq?NH核d|Ge0藼G/TKɥTKSmsy[cmP#cQB;{IU_p}̣4!7# a]T?{S}5R㣐Bgn1?gepmE}QHgO}"§yivv;V 0ro㑻 Q 4'f*V™VR׆ŰGrg2闺,7ga=Uy\z5@h{{?yR:l ߿{JdM :&a=F ]^(bDARSsD`R;(|&Pԅp,ܼiE:/G>xS#S{=uwZ:]ZQ #m0k:\} pTw,屇ď /_~)ݼw>@mc|0%” ;>@'c&Xj%@"S75ò=> cSê~Ȥ%S9='C6z%\=Lqtx)@%kT| ccc ҃ o=<+WW 96T061䩴97n]?@h QIz>r=CGMݗLU6zcu1^N쇢.N##'NeN`+Bzmw\9F'ٌL~ů pU:F[UF_Aai9*bω瑺XuwدSP_}Ëc:ZUzܻ΢r_u%=kom:.\QR&~Gf|IxePgԄ`*>l4Nߏī\-\VR+BTe\k cog8w>_{{{JsŦ-[q?ᯯ.Փp܇Ƕ-ذa=Z:9%tg{?B"zuV0TRñxFz0$9;><}s۴'.^CY$(ܸw3{` ~'HUS# X<4p]"m x=AQL svœaxp3ބ..> A?w/IIKd#Nr\ ZYXdNKPqu ؃%N1PV.e;G#1"vlڿogZDs6\p/ߋ7Tt3wCy{xqCM~X+J <[}8oۏȁ=ظa=IILڨ4hX5XHAaشNK1DC&|ļ-k 0xh( P'>َ6dMNlqE },{,0޿W[QxoH ق4bd!s{'Yh=Q {7^իE1@u1-YD6tv׈zx0"Jiq\=u/xbC}x%;.@0U{xyFnDs5.ۢ1 ku8r4"Sn!#0iRO:PCHap ?`۩xCUKUf_X_ OU$wX':IqJ~·D T@+/߉ P UEzw5!^)+cMW^QIAaD\BBIsUB*x#)` O9h2YId 1< )m=-[Wgc(ϧ a8\ªs!HHIC~N"v-6N&>3mCb1߁t <ZHUH!35:A7#!h   !(%SJj=: CurC@%9۩V]?P%-K y c# ?O/#I-:@|'&^ZOOcF~_B`Y7OmaYGa~:t} )c-*yH2C`8E2tC0Ҕig/6 91ʹ1q6Q@:PеDv+'b!-'r M ޡHu^v՛U=\k U#i3 !ϐCYxz &4k#W?2de-pBKe},r0>llr[xO)wnl+Z yH?]ƔA0_L؏q;H)렡}90Jm wQ ~i_! NOMFrR"sPQ u qVfdK\@XًTľ" 2ދ@k+zCZRԭ +yV 15 _|\ YiuSmi HII /0tj$䔡=\XR}g0H2[EϏË!4zT<$]xQi61<3ZD6eG`3W8@E)@~ ,lK mf 4TºѰnMgz'("@ )<Kc YkEU7bz1\mG-VMBE؊+&O, vzpt݆X6˺ޥY+m3F9|No5m@Su-݌yȣϒ@ <<8G,)'; @JXZy1W EêY@x̷E?1w DC43v)2URZB.B[@7a1O)˨Mo1@X+t.QhkRΆaKBuf%1\XZ 12OgJqj* Fo> yhΙ4 -B|ve"` Rb!@=V]&٩a6PJLGii1d_bhH*#bXhC%s$ӂ'֝GmPgQ-NBYV4Oy+_*DBMG=fCAP\Rxl]>JZNK -G9 Az/*jLB8wM?Bd(@'k@΋p4GP&r%utPu=ZN!pt|:UdfGQ),/t EaȨCMq*6Ͱ%;e#mz8t7PBEjG$e4[(j3c>B3Y^I{a2E3c1k&DVeԂlw4Zq+|BP~=F`klEG{v.i%}\D"TUV0)~,(+gbސ't[]LԂaT+5%""yixS4ċhTzan_,8|կ~EA ?{UwޙQ@@DD 3f s b"DA$%g,9`oi83LY>®]T~ ҽo?K!|A0ûwi&)O3Wn_졭$M`w9:LY7wIL瘖ŋ{_3о8z !zGCIs*oڀ9SɁL ͯPk2ʂ4-C|gNlYH1ei& c}y.Z b6Dn&\RM)a8%o؀ CVV+vE.&Y\Ԝ˱zvn5hלA V-Ne6K'1HMMFc70CYp?o;C H;y㐒H?lYr*򎼯 F߻IJ0F#6ѾvdZљ8wz?PDy^70sxɋmp;gzȹƚ>sDذyfj+Q죽!hIf>q۶mŖ-[`HaGt'ۍmԎF;`}& J8훗]Mmcr~1\\;(4+Տ뇣'-~JC(NrXrxNG;k'MM>2P?ۨtѷ0t(OFJc ;CC BIM@hm,Kkkoh+a#[;{V3ͬV$G;!>3 iuEv=;HuʼnIʬ,U#8OE]qx>`Vَ6G>G>4/vGq%]|ݎ2SX\vSg^qcj.[N;[uVx>I"R|cSBAH񘦦&dFBEQ6Ndre]Ba䡮9PWSU/z^0 V$D m$5| q.Z,l/;0-֚ͬ,\8ktYٜ{>E4Y_~ ]Ey)@h ghmoP:z M`k}E3qx10*m1o2&B"@} ^QcR7ں?_h.ň/G{߅P"@I*#>A!!h| Zt="@cW2 '*}4&"@~kcp5x8;.w'ޡqYjXwlX9b*6lGh\ x_I>g25֔JUMp@ IDAT2!奰>m!/=_Oafϖԕ_Tg=RQXϫ炉7MB$m7|d~I???iGnfBC gxIXp=~]Wž$yBan2԰n;&7ȡӜ|z!HğH$97Wf6jMGh>fq<t'H/vWVo~)DGZ `PxX44LQGQV[ > ATb1y"Es맥~T!9VͿN;xc&e$Lm kx~* r4ݼOhyعHzGO#?<,֡_AxJ%ho 6B}Q,vA}~Cs Xӳ#a |]?hhN GCcZx=/%8v ɌG:^>Xյeqۮ)>Z{X۞GlvP󂍕%N<s RWsqYx`jfbZ8 (N_z>s6Vە: ӓ'ajj푒SUU[p*&ICM9;]{'d}@O i{ƕS_O08\Plpە$V$sza9@-ft1[E aI *f 3v؝nqnP]W`7"CcSpċ*^%E Ңqq467.pjک.HE[k8P["Rxɟ+v3PE&pA=N@!9>^cI~.tsjt}xœ`W/wӼ>| +3u>7캆pԦ )(6C\R>|}ږ/=BEQ$d|y+=-Us&P'c scDiHOPCd~)ZKzCICa"FMP)%.f)I`YF{bC( PV"!Vb0޷F[ByiU-IU3 0):mmL 8f,_gനk$1 Ć績d=-Y_aH)}AHxqd} M1U}^_՗L9[avSULԙ97֔(#^+cޜY.K=\W[VT&Vʐ khVB~8&͉4\3 wp 𚗏c!6~ jH.NĆc1eJ9+Le1t4tWmXdTIuBƓ 3-lpqXD߫J˱D 6m ;4\Ek]NӦCzܓ>TXx>-o㻈_拿< F}yhx &x56"uIa%TӗieԷ/+O lטvAd, Km(M[FJi8(,r~V uBCebF!Y*PFvd!0g݃hB6q?Idmhom߭}Ue$; 3VlFE{ B/`$.M<%ۡ@1r|iΘ49W8_&q8P\;}dZ_[@e2OC`ki /.OD!1)EpxO 2;׭0w4kL†Y]g3 LFu IoQ٪0TGGi!LPC L8 FMe,TAu*xЄ.kū7o55ni#(^_k4d YΠ[1NlAi a3#_` %>T?E101¬0i$/ KFD^ET&HRlG{?u?4 | P=5tn)0 , a1s21¥kp/2ŏm #>’+g nٍ ⣷X1Od_-p!1 SNJu} 0qehOnG2KyLdQOߵ"=%OcJ~t 916me3ϿdTLL_F?P$N_fr$ܙXY Ҋ5^qj/$Iĭ1[yFi袆o;aO $F@zHHPćE#`df6[;"pX"-l2z VP%)spau6D+svz|KyR0l86\$gZE:퇬 Krlv=9)03JӗBL_zWojƙPt!yי92yڄ}{m̍ՓydwRc9wFOcDι>Bi 1 D8CFR$г\7jyPOiVrV<tٳM 4^ cҀP+dckTpMǷfFgݺh(%&;мӠ22ƌ[$> gM0\Fi$02/ i'Fh$LwZ~bw- з!"Ti~t 5ԻY[Sl2͗v CbU?Q;WMH{/"+;L ܕ_WxjdBн xob4A#x`<66Sez -@Z^ ?ڶ!+j Xm', >sv6¼4b$\Z ~lc>wv R{u.(S#O\-6po&da*w/lsL=p Pm.f[m"}B(w!uKn->~-釷4R`'wvdָd$z1@Gd3_knG7o>!<$@&m [Og`,7PI~^] ҐH-,ASCM>M 0Oo !Ia충IGn9okDјS&PQ=ձD^gmln(E(j΀kP,  #*MF `NPSA&{&QTxDwc\1Gmv: yCqԯG9(GIA oXD|Qm*QW]ۧ!+=1x[!cYٶM܆>ppw5uW#ٶyr#ÕX'{8VM_BBTU A[G77Z̠HC @Z?$hN$QjP+*8 + 68;`|ZԫPC}-*GV&mh|+.NCRPTSQ{5]<CѾɇklډg mC+ПL)h'TƐvr|U я4%~'>D]'xՕBXNa;2ffE' Ga hN91}`]{PPu9{K|6U98mcFIc8E]gAf-rivb-$ƌP_w B7TI3bρؿw̙W!SˋC)#KI%Vd䗑T [6-vn1]aPW/ȏ )t/dF}PY= j#|oI]rP6F("v!=4 eu)f*t:y1'H[lj#==8~ҜN;fvJfg=KʩrDK+}0l@h/ng~Mew<fP׹߂,Y]MK"4D~ٽ 6 >H_ez$R 8Ml2܆e t0&Z€3c0Ff4̚]MvNhLp" ,'Ç E8A!לCb ImT5T@ Z8 ltr1W/,vU?LVF*BCCgϐ޲;ʗy"@g P_M7kVׇ>m32m@Z_0 q.9aa*o.\j \xJ# &\. 375yl`=*k`c#CGw bQ%|{ O`ݚ8{6Jyr n4.aw0Rm-fk/Ο1^Z8Q* P^c-т#8*6o 0*y[˧L(vW<~z-z}VZ5#Ϋl\Op-r?ɞe/}H!!8a=Q==o`FXNf"XSƏ k ŧ3޿BϛºDz8v"2ߘ3pCe%*'fpƴH2X%ރ /#-!>{rbv}Bx0p⍛6㢳/\OLU (Dvҧ9x~6#\!{y^ GO sF^r(Nm0܋:DNUq.ZV 4JrFۨظe)n2AQ^[5ϙ`^}͉?J參NgqKiͰTf4"mcoytg`4EJ;o 6=K:ѿ}{}ѲJ'~=&/ގORDNeKnW[Ig$E6 ?1>Eomd[Ff|'/g61,/+Pj&K ,K[);Z;{cZ$޿#qu7ɩ_B +8y G13+9O_ ~70`&'_HIyIfkCl 2G^Wbh߆0}ݥZeGvYsa"st|ӟU1@v߳  EM7xx{r翕NvrhEIa&߃; *t//="@߿H4!P4&1؋O1h/7guwC]wn]>xYLёȭ-%|f=+=>775r ~o%BT IDATj,/YE%K}/_?[Ww[ ¿:vƂ~u_~:k|*w6^|G)(U<9u Y uKM I3;Gܳwwvgm`Rρz"xll ]\___ؘܽ8::"#[n!"<p#Ç(Z_Pٙ;KݻF\\n޼`DEER<CuݹGXèzE1ʡBuDuE񶠮P]7ܨ_Orw65+44vvvu޽~*Ν;\>>>t7>}0DEF?p6iFSF7#1}Ş{@4~Jb4 -TWg rţw >-~]aDg_uݡ>XGg:vwr!>wXXXw](f{xB4dt&G#?xxb|xݺ~|Y]a[nEu+(k#7M rYk= V;ufuSn2"h19N󊵋ф)WXXoWn|8;{V.=6V?X_X\?6?8>쬋.GƗ O2^bu 8sW]Au1:yV+g]Au=|Y=`s_lMa+sia G]V? PV^Ff_qzDfx+(o-gILC?#?'0ah gBb(q_BEϮ̶)4tLETb.xON~rOo4 #,ZD< //YfN΁M%AӢş&=~ޣ2EE_"=yJ~ e  |IG0Ŧ:g>R?x(, Ẇ$-c?NܴZ2s!"S{$XngvCXLyc;k}ftʴu7%뽾 z3gţsUEYp~ ^: C nݎdeQt,(F4.7./;Me!6@k$hO͠٧2 ;Ivgπ [d|aR.ApNo.ﷶGLXևxy_3D,@|RB^(e7ҾڦDrac)?)tnO{ :/ v"yʮ5tR^6P1܎xR^a+?#KvDCC~,$pgŧ-_ȻIyOQ.ߧ1L[NGagǏ2́X \w5{${k}w(퐀]'ʼwt1[Jo4,KÎZoz J?V_Um?~> {r`9-0]:0@ aޠG,M{:֔c0< RΌN5W.R0B)1K8N볨ՙH;:j&bAY._ڮr(i;`A@is 8cvt=WwzycX9Mu(-)Fk-%oDѽEJ=, I!سͤ)˖(_4 o`tෟs|4&/{cC7m꓀&VJpOknCBcȒtF'>}hc$q7%5>ᡭCFFcwA66 YHa}'0ujϟb唱Xgvυh((Gpg}jzu 5ČUa=^Apl:@WJSQZzjWE1><\Tv0ަFSFr{1۬oc-5"d\,]Hc%Loǖz_xL8zoF4d}a tyӸvӱg=4j*PÎ~E{؝k|~}t=?k|{wgL"L4 m])g*j5fgM;[cz<+C,]wאnT[ īoð>uqsb|.Ai)㙸>O+"w `F #&LDLs;x&R]QĨ JJc1#%(@ 42' *PK 0R`H^$qB-8/;q(KI=6o`&$FB5O  2X~?MW 1ӣa5 iip}u,eSf 4U&`8L .أ&ۚ)ã;~Tw0xmڍT+C]0` 8åilN]F [ )_aՎuV :3#0-4؇X2kea(qSOꉥ %$! 1r4&ܤ|ceGq+&6WNS9)OpT(ٽ.dٳchsT8T@oFC|ܼ΁smxy SFOoћٳ(L2Zp`28hd&R⨒\єo5j$ 6(Gƪ<94ōQZHGnBZlRzZ$}c%|ʽCi/))( ] 41S@ i(ё#u|)!?L1X4ColϭoU+KǑ 0Bu&F&qmH@o2)"6{7$-'ʗ 6|䡢rOi? dqfȕYu@GoRQ] b(ei#>\,yL+fipc3h IJc~יgCxMr>wlvgj Y!/y<͞O=r'Ut=Y;zGBjT)$?%t4 LCHxpM?8 Ϟ54@wqqGj@Ve"!fRb(U5Ngc>SwǮ1\b$;zrzɑR`sN3^^  '~݁(&`;i&$)1 % ; 7B4W$eF0y6Z^B:M̬lTSb!Xh` 7|c̉\w$SM*'qSkpquIEjaCE{YKkmgSFI;s o EJ.4#(qQm]b0,߶U,vG v,a_cO7<2QbwhTT ## ׬afe8Ԉ!}͛X-c9@fB摦9DF1zCICEaf6:ss=IiX=w"Gz^1J))PCM!̶ qild88IyieQ@G7=Kg aQ^pE@o*I(:B$6@Z|j yiRFQ^S?>uPiCxv϶!t0}Y.JP%T̊0R=n<塹4X+UM*hXI8_.KP\ 'bZX^9ȔQU ^JQl"B;|1:'OJ5i 5WRT4Zxp3}Dp9xM`r۶G`2#( acm]gL1&(x?myv¢)3V0~"9Յ6msJ[9 , "E1݅$6>dh2L /Pn@h¡Pq@ hYq*0 7`%žєbmD9DPnI·R/# &S.S"L޷DӎRzfiְF&5О æ8}?׈a0 T1t3k` IC\iϢvX:\%v?8N0/˵eBGI8I*jx؂߾ijثK9 3 U *a S_v-d +bG*[!yػomG(\GP?B8L#[Obpɧp%JˠzF34׼b؝1$Bz׌zR,<,7'-+T` 0 H0gIk1X6g2յn^ugds4&xe ^ݒIE|d`YGs s0XzFfs4g%ҕjYV ZԄο:O]UArX="AMBi"vF^99@hσa>=(* q#&",Q3 &5 n╛q~0:ecJ t=qƁ˄\Q<¼?jKy'MBTAQc:nTѰ%g4xnW/I=A/سؿX :$ZkPipV$7ifNՁE=X%-v$E%9Ny bn$)O$㊫_>gNO@ JB}-xee-/`uh4VcPQFPa9ƌuJju.Okqaܰ#ej1k ӻ4n@hóHw$`=se3)[gb<އ#BSxmq)$X} Iw%fx r,WJx+_U?\/TwΞ_:>vԕ<8(MϨTRkqX[1od|U05\a#U֩!n҆fo{ +kCԐLF i,ZEu]u 1&t8N29h1Ծ: }P_S@NM E,1rX_u3F>M"vCq=]aAkNQ(ĈevUBabpѭku]Y>Pe):7)BG5.Fu a.IfKGth+$F J}#\ӆ"2 q;l|gփ$EnjREEv:s& -~z}~&[\c,ħ>2}(qA}̤g%;Q@ZWM%ar` &9`aakʬ),='8c?Wnv 5PۿB -?ڔͅN[υ^ }-,wdC!Ǥv?A?{U޽߽3w9Dt$P1caa10`F$)*ds9 fuuftp\MSU{SM kKya$U- &v̧Ͼ kriH `Kh\zhgҥ3  k ىa#(PU׿EFXy7HQj[EK; vK}aaܻd&ƞj5HX IٸcuB )^ "yZ{fBMʉy Zyc{hMc m!aR/ =wqQ! ".65C*DQF ,ElRmLceg Ϣ--nNc"!6"TIl©(E1{6mi;w\R 7~SJm YnhBh3 q5 ۴SYM9>+cnGYO=v%7Mcq܄ÄXc᫴D=<毳6ߊ˅hۜUA儋:1F5yh}&2 6l:-K8]v@zA$"wW $ a$Sh$McqQWɐ%=g>!=fE9%N Cf?C1lN x+߳lӞWyh&#х6τ>sG#M/l޳}oL^{)/6!$XN4·^Sb뉻(]<2O  yÌ\XyRGVO3><}x |8 <=NRV,+Ӈj 98:2-{)[[[Pd4'/_3jh=!7'wޟwįRy9(,,+R@J A||<==Kg Es`tV7GRaay狈pY###}Ҽ-/©~¶kD-w[µE}d} Wh\Tz/ ݚ4._tTT~{~dd$Ga[mhq#wJr2ח߾>bqÉƾtHbb֌O47]rF7%:Ylt-d[⾰=%1kMm>30~5Jd`"{a3KqV(PؖoX#'oR"Elтýq\VЇh#1duӶqq mWV01_[^ L`e|f`!~2rcb`sx.#Ԕڊ7k+N.nK &m =_o+))m1R[n0hQkff}P_x}XFEvV,N00gQnp4:#=>h69t.B}&3;J{Z6{6pٽL-iómų4!Y_V+#cqpy[\_oc[ܸjM7/-FGFCf03hG`OqrpM&;z FF;/49g„^Vf&7ۢg%Lq[lƯH!5o+RV8J#7kW8X?\[/6nɶihKO6Fn\$baB=y[Y@dXxB0AhH0xѬ-<{ 2^ߍ{)`.p].|}1Wɔx>‡>(x@ݱ0 TQtY y_9ޗ?oϊ !A qh}{ \J3L,ay|#%,dц,Ơ򵒹-KTyi@t,sKLHR5yVDsxhrÇ{Qt%uv\NoZROy7'\| 7\Wn'R 471KxZ &5~(X._\{tTs}ԔeᶩȂzlݑBmKt|5Hѣa[:B%~5\ /#wJ)1)mD,U`k(_l[6獐Cu0t_ Jr`ab+.ꥋ0Af~IoXʹ0X\+02]'o*T/{T}\ry*݄%2 O卫Fuo-^5C!X!#-؆d(i~t}v7 0tSg@܁|3/Sͨؓ?l:&7x'XHW3XX" ˷D : "1Ln붰/mZ6jѽQ,qBfKf ]4u|Ϳ~uǨtT3[`HuIvYCpb7^zۖ[~MG]t:ҝU0_<+ֆܩ')'A*m>DR S!8C>B=Ӣp!R~B?Rs4z;NTdH+Az{wK gp7 3ߢz,z}$:qxHS6\ =v <{7cP =z3Cѭ}G, SW/ƍ2`֬PQpƭA\h`cuY{UњÍkHWIZ}LO]_ˠ<~ ,TRr*_At7]]m w맙J>}ѱce _]>BOƞN XCճ-b0mR*q~[Y"*+Ȃi8}%"Q1@g޾K.Ŗڸu V)M02LXK,vLaƘ 2u X*,z8L"~ZR{[p\tfllRzl\'\{ Dzhݺ 44f', .߼X@߶퉳Vx*R4avzCk Yz eNZl!xO!P-;Fθؓ| V,p%Vv4?=Gce/6lA3x<ںV GGgSmJ?Zamr֮s$bV\L_5p.4l0qn%erI ۵ VܥԇK`Dd% dy]ܢr5 3`&G5(bUц;;~~B -k'Csp heXL#¸,'b@-/W!׮-5!̲B o:6Y;2;{9TV16oX479ܜ3 Vd%ĮT\]T1e2\ 1Yٰ7>u6[K=;i]F\m2a (,C,Y~c[qa7G{# 7Ʉ/Js0b<Me(Ίޥj?bCH*S;e :*@z 3n"NlV٩)a1 b8zp7fj]Bv|06C6 ~c["D:߀ƠT T#'}] ۨjpf-5nz̟1 {oiw*BFEU8Uԇ%X}6MS'<8jTk58ofs p?{VK AH`$ p^RQ]jӱUSX2j`\ܪo6i26)\qXg=u6vjiBdl8ilEY5ƀ~p9N$e F =cGGq^w1[M*j G˰mnӬA;S[. jj.֝dHaf/OYAj/R+< {b\蠘bjS_W!*JgݑtXDvI!BFk~i tƽ*PֲL!L×kh FZU5fS;cF!<iT;e&6PF;[pB×7O:^'WP5E3@M#jcV#"[! ȣ7t2qnT5L]:R$tl!;aѮ#Hto #)=>s1|RKP)Q5|0Mw"  q%CAn N@{)##X9i VCJ%oWB:^!#?([n!GBxÐ1h!Oh((=& FR-aKkW|P.0~gˏ[sT ۺ_ىRYpVP'.Gvz< R E8=+; U1^ xn Zw=+*71>*z)*Gcµ-}+1d68'Q2:#HC.OB` u2܂m"~נNww93g'пgW&dS2x/;>8 7Bɬ**y. <DC{){$Ɂӟq+]>̌ * %Lߴe|Kڍv gn aS ,.ƃ)H!+t%*%"S{GIۅ Qؿ~2{imɓxݛ9q'?[cޥ Dg^>=HdX]hQ,)27E `5]d\P=<] Qij*(t;dO(.Q"ݥ+oхgd fO9\=%M*`$y8n@Ve\r%˗(:ؐe$hgDX7R8 9\A +I*UaKvs'w,_( 1"\Tnת)& U V uU%p:>FMkNsdQAZI60 Aq`At)T2(]e뇢P gqBоk zBPDa8czn'Գ3=kK2qs DNJpR#),z]ZRRRTY C-X|b FbP8h!,˅mܶMBH"uyڼɢr>,T!/0od0NF =>B1e& y BOkrq2|c;m+ӛѯ{[* "p0B0lj);.~ &WkW>>yG }_t 2T+[j# /)t,|Q_{Bi*E ׂ؜>i:҂ш="{6k֣'ZnxW0uB]y jar?t:ڷpӧaqݱШqQRTQCVs:~.K(BiF<EqYNЂVL2CmChsǢs?u$Qo6 &χGF9 gѧw_h:z&kR|,$hѯ;W8!!;5S 3q7F\h0 i!!i"A"E)3E,?/Q"a"BI!Qzʀ-/ #tnrn\<H!ML\73U[Hbɑ>8opc~L}&dhMPg+3:xtuap 3(gÁ+D)JeD 3X}`-)gO`T0og|En}hx,vELyqr>r0h J8z5BkrPOM7̞73gѣs+cn2"`tl<&gMq9҉1 e s$fK $x㦱$.:Ja jQM쬹n0Y>D8g=8_7˟MڊܶsSݴ=g5 vT$X"ŝ1exLY!!вBxZzq5ޔnj7vHoؙΎL9n l:Qȇ1UWŖ21)37Œ6 oiC}q f&i gztEfz'Y'~8X OYB ˥%OU!ӎu?w:_F?)|ذO&̓{POK<>AJtC{!TWPMG/[97mx+_N*(dgCCBN+(k~hx]Ga~c7!|Zo1c=2C<x o1biӈ׃C-:1c!cyc=2C<x o1biӈ׃?!U(/{UITUVoEqY ˪}UZWP ף^RU-0|.ebtn/zEe,]0^. ބ^4y >Ѩq/_%B =H^zgϞ v6#rIN ]`o{;; (,-ovYpqrDZQGycVr4\]eYa6#_Z 5. N_<||/WĦN8;;#}*,LzYs.U(R -jB|{p @Y[T8: )ԽX3?f?{sRs,)ϱύ6)O7D2k .=d;Nh߽njhK}. LhRZC߿H9mgBG_ q;,mU$ꐖIӦc.]>v奡kdA L-ď?ƍf|> .1仕LPo $g6anu1 zja}}/=tO]@1Uh}kCC-Hwj>yH!x=@dxXֿǚ1$=0i¢G1iPO 爔fsa{"MQtJsk<4Enq)2B[^z2:c]QX\`\p^1<}hզ$Yg<-Sb9Hyg0\1tj`K/.R0tiPc TZ7 Q7u@5QG֠τhSPS {(߄8&|}ܟ+KL&%]P\%&(NíMi45ʂhæ~zh쇽Ep;-ݽY-4qy"0vi+:n j"XAW[ gݰrG@'<Ij`cz&Yj6s6rmlܸA"tj%vSQ*/ʂmc܆t[`h|gBB۶]&cyukҹB9W#9ꟾr(f !I_A8_4'Mב_^gO!+&0@G(Όs'm7mƉWݠl8[,!>xflQDqaf,.=͛D{ta⍪ˋp`?-#.l}C*+B[g獑_Vr@kx<@?[v >a^̔م(D+= )@]hin[0R߇@aW2Rs_YZ3qX^qmźbGqzpq蟿l٬-&cW^ ;K#09yv\4Ja8(7WNfr 6sߥs i ϩ]hLy+ٯI|?pQ!ԕQ. )H Э4& j1hTv"(ޱ *m=\zN ~5xBۥm 鳠wу:s*+0@Q1_1{(w$U%p6,7̟9`}(* pf.^-[7Bc@tWV&R0GC R2t%,}1aF&ٓ2ܻ=wǢݧ&Ac֯K.71ǶE׎i^g/ *u^_g+\9B¾M;vft"6R`TU%02Іb?y54AgL_m`eqÔ1bTݏ+Am l7#(ҩQL! ؗygYbbA>θU#*س ţoTz`8fQ`c&Lǵ{70pl)Dϛ1+n1l۰zeP!t!j])JkO[!ֆE.f#!#(BYM7?q^G~fv0qb;~ '/>u2E5CUQ?`K+vGum9G箽 'C>]maU6E])Tf3vWmvZӨNPusК1x$U WUD?AXj5@o>n Q--ycV2DP\0\hٖ]٫S40y2yPVЩO8AS2n^Ё"͟jc| L9=SFaXytEq yٞ=g59/?Lj`Ɏ5aX|X2 a{)4\_H>f+ѱޭ;tMmH9y` 3a従Ȩ zu$mSQ a5ct4j,'J>a C`TWD,Q(Qda 94iHMI01>WDVvz= =z7X Bн&$eSY[O+qh|n]|̴X\=}z҄bA. ǩbĺHEIqҨII(,)[ ?Pah*P^Vbu7 E]{j3' Z%oR =P7Y99HIuI;TeEg*sp>P@rB,s@߯cB2)BtE. ̊Wo*^rG;~')d $aC` aڎqCq5eI;R svLTÆQ Kr̬l>q& 3'f= pHK]goFLz<^Flr*rqǬu_ܤw K(1IX.$'H1f*8G^{GWOI-bC1XuEu<Cƌe۬wvkpϳY_Xr0UԦ/DdA)Ϳ(JqZ(LXlJH(" Ʉ4n#f4wRcao $mQ]Ia Ӷ+*FeEC1e"l Z EO&ܗxLF6;ŕt곗%<YYHļ1*G(hA7fLduf7M/oc<#GVc=.hL}ɢ{D`d,=L;Ƒw_G6Ϟ !t…gcx}=):@L3Td߬<*C3n?llsNr:Dnb+\PX) 1}3$Ce_ &/MS<%yyX{S2}ca17 I٥M"VGdv"̦_FފGZ^AxR_k;r{wo9t?uũ9&zvƲ0`Pl;wDUB֧bʩ>x6%Ty:nX Ӫ$7;fZ3p:ɭޫȲ }x7y$pp(L\y"Ys9v-'[`*lB3qjqRt;t ѪrW rRm ӵ;vWP)1w%[AY^{䢖ںKC-F`#O8D2#Ġ꘰Q9ɋĚ ݭ ڷkG4݁ȴnb89Ee!oی}Ez)<'\X^ݎ/:HuEW4샃ި̇! Лm!n{4t$U@@:b* {XyKf_ Rk ~#81eJeosz4K֭0%C0\7 æCh\1gx`qEA;HQ$aR89yCMB]9G:g(L)rܡ icZ$vbz#jt)L!8z.ҳ@]̕.B)THCp֯. B&`|L->ȨwjJȨ)Kѫ[/܉YD$g -2,?AvL8 oxpef–!4N*Bn+~{(`5R)^3QR,Jx_شv fL>ɲJ>8bk E6lHOZ2 #n~mǐM!O!=.d`nJB8c@)qes2)nzAqfoة+FZ=u$<*jBɜ>SEkTux)l®b=-0BIm+#BZ}.B(0=1W6ˢH!PMZH)"`z!ڛC\y$"481I܂V)x?x|m5& 4nQ&gN/!^.2SQL2˶: ~ `lÐX#QX'5-d]be!zvE(qS r+Ix5+Lp '!tD!00jd$ ((q ~.Rñi*zB"e|#TYP%!/&)}cDš gʤD^W)^4DxNŎatVD?hj`d;əU(eC0ͣh(Rj*8r,Q^Ui]?^1GDlaBj‚7.k5q32Lq8^]:W JhP)42Z8D\JCڃDa.:o2(YC@^I caЎ=׺"7t 4W=h  sh ՘k@\6T qQ.J 2yj 2 a)ϥ9胈hf,8XоZȰ54nIQ^$s0rBz`*iՕE~00qZĊ=+zy~m`[NFɳМ7BXO7t!mL#ߛ4y6)ꀑ+"_"2+)\'!XQ K!KgJ[Iƺi*/7e4Z/X8]]aX0g eeOEQ7Meա5o!hmàLލ[3Ȍt4H3͋_G?bg3;nO<*cc_l T╫UJ)*FË瑧2#vq?Vϭ-/}6K'6b0}xoB'-Lދ :^DŽQC_E ڵaT (TdbF_P6ov R0up  AkfL3>~HC=lw v[^>@}1`(,Z duƄ2M"Pa޽-ڢH \եy&cMX|d{Ze?=~4mZ>wH!0-UV6` >6&Gゥ3ՑyxRPD\>Z};viiqx\L#h1ܹʎ֧wwnIXu MڽF>iHnU$78O;45;q)w\`/G;|;w ëfi*d tNFcY~#3$S&¶wQG'r"دK}v5 )uJ%~?beǺB[[4C)q}QAСIVQC8DdAtػ ,,!K֮w בEZq~P#4CyP9n FEzn읢DX\:̑K? v#k2avv ?#3S:pg}{HQ a#e*(Fin2̍.`n?V+/)͋p55`IAlrlq~3:llIл5fصc'< Jy)4鳋7K,Gk|1~ 6̝=4w]6QJQIj.4FEXS;fװM: w_n {v}9>8Yrsn7#K;QMq^Lᢙ$x{$vÅB{.G2dN)C 7H!dၓ=b)v..}v!G6C/K~q\Zp8ɇk~a)N`Pщ{2`ʂ<]θx=6y?G>!f@xѡuo|=GBMu%rYcӴ^ɻr L}p.~f-(r??KH!Q js>S"ozVnZHdЦ7}M\AM}@M! RV?BEZ:M_ksqeܿO{뱓ǢQփ^ו[/iǂBLftLH 0d8Lm0o3~=`=q|CI菋'(J6 e ts7|~MFC}=UH]f *FaI5kk\,2tu}qnFѣ<`0*O4띡7l/"9=![ ._8;CAv?jƢ17d \LնŎB3JN߻,BSɗa>BʣM]ad+"$Uu S':s;}2ͭur%8sh`jj UTJlV~}U.vɎ033^IEMcm9n_>YS'[Zb=(jqz-,ލx) ǵ;>mS)x4̆wGڪM$CSc#XyI8`ie"*#3>ӬbNļS^ON3(Ӷ_)ƊsaeiAt4 >('`eٱo.P?6Io_#ί9lejeʃʽ̕3?+@`%-  ,OV u0/j@#21u \$Gc6 57k7's>}{7of0B= Wis)J8C%ջP;P5UY5͔.jj Rx_AC  {6X_ !)jpۀ}pI k\5Vώ􃋋 {]AtBp RTaa \rK8p .M;oj@9AAen9?l?`1@HM'wJHK03gVGcezq/+( 9 Sc"Bi#mv!anl-'.BڢbZ_# XŦ m{ׯ[iS"fŽ&XJUқ6TH5O0|whRE?]QEmi'xR'틐Zu_YsCB;*[eĎh%jþ.rHDƢ4umU< Y=*+JQL3< 3M%}ad5m$/wBx[M.eHmt7߶+od]dsyy:o{!A@Um7s&r@1JoXp1-96i$KbF`ckG.k7dɺFFvz< gdϛIj!zޝl4w^" L,};tNnUCO$98$&& >. Bo%7G7F:4C'B$E0QwFЬwgB^*u3@~C/h!u\AƸ'4yU47v%,m03x8<| qA;aܣX$X_Sψ-- }v9Yf)&O?E1SVɢ#f$9J pu SPYeIAE¦,neyJG@_B@ۚF|ׯhQڮ'AtG^ml^7 o(UՄw`6 []E44B}}jUY]ؚYbKMc7fMHYm_J!R?t۩qhaYkwYE0Yф|Ye 0r?*AlLp&O=±f"|;MlQB.6 qW(ǥ-ڬ׫WT՟;@xF~iQW|5y闂ˈS9A'0B_|"5Y޻I;'7C?fg*$)X:sLb-#?~QV,_sq6"F'o^pe.y׵ a?u._x::>MMI˚4jsQDL]4s#$)2Yb|Er_Uh>@`Dxccc,۰|n!(X8֬Y˾P(%=tR~ ~`!;@?eHm]+0{/(%d: #*J{~0$ UtdyXaxԴTDG5Gf9:)WlL.f!qW:C2j&R %q"k;r8|+Z٫\l'3#-K5;S,PbNzUK`8egk+XMF|4.Ɩu1q#l1y 2_ /f7ȔB)-,;LNJU1O Y⋿|ms$th-& TҲZߋG0G)-g:ǚa fLɀ1YYiXr9.gAOONyC։-q:ʲB[8}dmx4J q>eqϱ-6@^Ws -aFKt'99a(II 8 OLKr0"KEIbbDGG#34/ڒp*HHBTC2@x#, J^"+3fQ "rlYI}M©qis J@H15:kLԾ"~6GPMR+ƳGYC칲)o0 2(ME91ͯ[ 2CԀ)B*&)eF;t/Y#(/`U,sM9a| kk8vmM4rҔٵܞ|`}fP⡦}eu3~wMy.dejǔ~kK(->3J~ 9(IDATR fiٹJJ {˵> \z_Xscc|S0I}6](>T'FFJXlYuBl$J {OhֳHzO{ )>%4-rvPP*Z]F1v2YRcPGs@S0t ]>SC'D!JX0 2zoM,(K]cev#wk9ΆzZExJO/tDG}CqC>k{=:CliTXtXML:com.adobe.xmp 1 2 3 0 0 343 256 1 0 QY3d:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:256 height:343|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:231 height:309|ix IDATx]X}{5AAD3si 55`@ŀ093J:_5(@4;}M3=UnSv*))ANNq:l@lׯ_k׮8`rgeŘ>}0Z#;;m,l#nmTwsڜ"8jHJJB||,8=abbxdgY Ћ7Av-,iV{m:k -^xzN))5Vjtۘ'$7R2&zP&kP*kS|@S5h3=Ll ]mhjCUE %_Zô-"efbT_SHuBA: áDzpbbh*J_Zc,<|( )9u{Ii0YOƭc.cm:E |ҵXse^>@[/z8DTTTt) gb3LMuuX}7c& m}hccX@B|,X=>ڕEqӆ-&6ܜYl - MO"ޗt4It^ia3>9-5"(6lԴt$'%  & 3l8킥:bm ġá }v6b 6EGG٨gERJ*G`e2D}h32FAFF#/>^])qwx"2L,~N׬\I=숮 ''WoСL"xOlX7[SSS,]!!!7=vXXXᓺCd鸶o &;7I97Zy#F6U0PCcM|ͷ qIx9c,7@ _ '7/\1OW)ɓFRl9 OPZ+8ahhO0 g ^=9@u v\)4s6{jʒSPBع V #=mkASF`{p6րq3K&AOKFa3I8 de$ՉLwAWCJ*jsWo+; w,CWC}hBNV۴apzKm-M>Ukwƈ) qkd M5D&cܨIehmG``PWQtvЮԣNG` Y&ֹ& OXLU5`o091}N$ yk`GCma“vL7fzSPØ:2yy9~t=tDo }R/߈8Wi}PI9QҺj¼ {&SsAu:FA$)w kkk,_&Mœ9s 0ih0MP=3+%7 ;j(O8AM]ClEXq9Jk(`C$ x^Z 2 Sw$Ԃ՘U^^xd\ܽ]5߀Z]t{N!&#O/tEu,ӇL]cܒ'~Uc(:u:A=8G7CѳgOQs%<ee3[ 0{?ҸLCrM ;AڪKאKלȽ{xi͟?_R4gZK#s6~֜ǎ1fΜ^0[nXx1?Hw9sraczq7} uF%BaAWyľ ,9سrL=pR/p/ܽ~ nP4W#13ki@ḢGF>qt[&[ 8z#,]c眰v$ gZ3 -7-,n1v'*+aíHy:b]gH#Ha3=Ɔ27\uyܿw[ΈO{Zst_S֣g:u8LɌf-Ұ.;AIi[svGd NE蔰!Hp ٳg?9^OҜ{4Ұ^26666z?YX@HXPn[ ;}yK@FkoܸTwf -? CȺLOW]{Zay0cgpSXj ;*Ɠ2kϑ=&BUIÚ -ݳ0cpkb͙[H)DZe 8cs+v|[pbRzjzkCK n?/ֹ誧 NX/$d~\s򧵙q=(oyt:}1zd-Y\ k@l=^N=חHGEy.oɟ2gw. #}Z ?.;0 8{/\r~\U%3>"4tMxY# ARp>wLტគDPy4rM)-aٍ} ~k߿qzQ-$; $H]=hWO?€dKPjG"*ll޽,`@nYt'b!ߡ>*ȈL;` dU p.r`/eyt-EEEtL<'2b=1a%Z CrDea9|"[rӰkxȴ~\$G`Ğ 4D?#`t0Ӈ9V~aIL$s^5Y)]_9*xR@U+_,#'+fE]ץOde/"G033ot52z:u[F<[KvyLާhxɠ@2 7CwDv ߾'WBp/_/ԓ Ǩڌ)@"-9Qcz.\LZ/zOچMϧn8A7SIJASԘעjH" ЀRSz=WX )ϡ6ж4T7TGMi3Nb'`7JEw[s#?O׏|h]0tc7zNSFˣmfzݜ'NoWn>OrPyخ͗{8YgS;Oṕ'Nj8%c8o"؛/'NsJ pЎ_\[EYC4m8gm>/??"Mm8xſJ逳I j8%c$miNP)yTs89)6;E|-8[.=kW[lr,c_.CK~e,\9-od-+ɇ]̛> Wo;I5W†-Q18e)~("ӳy\~f*ܼ Ii$c89p AzN/*TGcv^!|[#rߝ#!d`VP-},E3:>LiX?z 1Ihj3 k'C_K ^d[²/N\/ǐЗ;gk{Dӏ=Afa ¼&;G$gcc'L%%oPO,FHn1rJD'Q ]8Þ2 vT70~xg, t0K֧lBZaG$EUcb G^.*LYi"|a kC%5m,ظ$pA`ׯ,Kc_LhH#BR HC$:s2qJLv mrg"#g""9$)C2b[SXaGɼ`#:h@ӡHێ#Nʱ=`1^i$w7L iRQz(^&]Zg?ey'؎LkaଊI]0/ʫ;VYYZ9[gB9nZ]gJQRdP.P1IJpu;M A.֫[GaIrZX8FaPCS%d 򺃁 ^3b /=!珀I>w).9:IZv FYV7ӗhKa޳d9iq$i Z3=Gdh_@hX(b|~ kG I$QRbSjEM,X NwqDh*âMH'u0pVD^ XmvB#HX 92ɕ8 ik eqJUt$/f'j%ٱp:f3/c&ը[V?N"o+Vcѱ4 Q]Y 0GXWrnn&7Β -CKl?I$hTD䭮K)K>l,|m=TBz^6N|TC}dS^҂4ָ,pF۷p ?Kw}("[&SLF}y 2BiZu3hY((H]4a7iΛfRmt+Ƴx;>~91d"}; hmD܆ݠ5O'\}H#prXwYEJ106&τ.ׅI$+,dzapygO#XjryC`=cڬTRǗpx1 䴻!*+3ƛ|h8IB0ђ+ xwΡ6Mq:bܰ҆>tu6B|^\U7ܲ'*zjxehK(A\dIQ m^OOdցTpcR= !p>u&$F׃6 L-%'[)X: -6qd|GҺw6iWSS'>m,x:oLۯg`6!:m l A)p\L4M?#Z33}2dBgӧ 'e]<ΖѳZ8)T5bbU8)T5-9[FϜl= BU#8)Vu -L잳 ;WNǺe ll̜fQJ ~` NJsyQY:+!\G1m\=yEN6L=gu;<~%w\L'r43r?GĊa{9ȼvTx{UKy̚1g/-uh25xFzڐ0D Ыg7k3Uci6LU7zYCV=!'3ƌgPJX0gyy6zBSKPQE[=['Rs LYSS^VJX!`iZJhA mGH 7ǺDg5uhhcҊ݈Na/ohEQNmM co" SE[5Rхդ5x̪SE'>LTs8yp BfͶIcYPZen}dn0T( w̄ YpVribڳhE'ij<Ia6 ZBc@UV#nŽ>=*Z>3faAЖFp5OfGGG\ և)8ߑ)֯F|{t8WWprrOE଩)'),D-ԺZW~Dk#ݪX03g-Iyq&ՖF{.8qϛ' .\r_x4NS%Y\/_ye5t64i3{z%IpB_i92+++CQ*nF%ѴŅmEd:':TINE18̚0gTz﫯S[2CAkv9SpVUfƲ3WU2kjjBA/V;UL Nz_?B#SQ̒>+J*&}R SpTW9,%9I^daq$WIX,aDh2 %b'עElPSp6(E2-*dʘzŴW-O+N8?`}MJȥQׄ@YRrPoMɋ%JDM{w$JFiJn]*Q2'%3) #{MtdKu9R2$z'\L&2*sA~D 3=.spq| glt$Gt #)!N:LIJ*szZDO97;K"e *sQaD9TԘ4Ntdl.wo7|KuakNw%Jfϗ]s:;](}_{7~Dl֊'EkţJrҍDsl\G88(BC"(r!4CY"= q)9š<'Qr$Go|w SY]UXЇ*H_2G']C~eb3gmm 2Sy2R2i{Ze/shd J}Ppf $(޾/ȇE,fYW ue%2ɛ)? ݆SHZ'kJ}BBV2/m`|PUSpW tը*hӶt[n()gM *3SpV`P Tf%ejpjSpR#C]]Df%H(@N[_!LT%| xbYXe8Sa‘hF6SQ$oDbƤIXevݏ'c(KJÑ,_o+r1}h,ݲ;w%2ŶC^e3B?)ysbѴ X~ݹ 'O[ԐĽR[[-+a=ؼm'N:?vAV \RJ%DffKHKT#QsV@ZJj}%`h?CCwHWsT!T)VO;c8b:S uiߥ׮.~F8`yq2%%.I@U.[~QźcQG̞SxaZk -{L)P,6O!ęS1?Jk4)@wI8i<:v/`#tS@Up>TM~ LA޿.Ӡ)ſ K8kKqj)U/c^l$ӯG{aSLeL||`mlS28Y(ݳ3G _dfsŸkEQMa9Z<| KXlFJ\DN:뇫!ճxYP 63 yHzd-p"5v ٣ {$TmY%(wX k# 5oq!-5;){GkדWvs 18u!*XZ5 }^d'_gAN EKAfJIt>&zN)y6HpVWAS(¥nJ:~9kP+Y;E(Eg5΄uc:{YPL3'i6v53bgiq6K>m g 7/)%5x"n`})t:7ӐCdNMMERrDle`9kj*up39HKK#2spV#:1fwvWxl"sFFO2Hɘ^4\?I)a8d333)((.am@/8k}onXC I";3YHOHokVñnF\#FKbp,-NBg7?۴ VXAw+2 BS̫Wĉa3|Tf1~`La^=-У5FO'>.F;J̞43UfW ^j3~l[ϰJ, 䕱h_h)ʢf7tjABQ~E֋KvN@2&طOL"M;.^NokQ~@b Κ"XvRAMK uT0>A଩)uwH* } =: aO`b'a$A(%5nU":!Pև8UW>(&Tdy~=t*بq{kCAa{6 a+E1ki ȻLY[[ /[jqD.e N޼Kh3%̢"s{˒qzt|I)\+#1"~Œ[+PxLUYJSqP,)ݴo=}аpdf9< F}U,£B0 L1ƭ(vo.$|PS9;20,AX: Sq?cŦL_c>l1ۯz!2_^g JBx!5= $B^EEf@:`в &qUEf̘;w؟ۡ?P3Y~SO_VYC]`]m:V_עmr[Df1dZ8R2Rrt+z#G`HBB5e8g sc ?c:骡)uYSFFz:33#yuoȃe9kKn`݇3Si3#u6SpVM"v__?Aϭ[F+~@)8>_?ߡϞy2KuwVN+ M^IHvoլN\+D^0NAizkjFuPE@ce N*`xǙO l଩ ;OVQKg ΖMXzy\pS% 8S8)Nm2('1< el.4JKukBܕ(ܟ7Jy UB7^(CqDEK2ӄ2%%IT)I BeNOMHbʜ%2G2I= Y(0*Gxgӏ8m_ %nKMN %Qy!ʞ.2 sVFD#TBB,zKGANJ ٞ>r!k^#/] NŞ?}$Q2S#q4%6"B]s޺vUdNcxk \Ek(CsZSt+)RΦhsXTn(XTnSTq5\Bd] Յ=g B_*քqUUAL̠BRܶm[hࠃ+ޒ0ۊ|L16Y zz ژ("{J Ϳy\{N8Bz, iqaYؼvwkqm=jjֳ@\N["3~elX ]'##. 3c=0Gh$k!spaڕ \${qݰ q;Bl|zN ûv`ߩ+8wў|.=;8r Xm P":h=!,Nd5Cu]x?xsR&.·-quxhLI^CNfV2{4|xH 5&bΩU'ǶXs,ͬN6P dF'2Xj)8\U{}eK(sYvM4( \(͈kq98TRs@2VNgzX_e6y卼++&d5JGx IDATعp:譧Y3V'ѱ-܍"UzOOlzNوLLnLluT'A7`3pIP_*r{d(WL䖰K%pV+ę)VQb&pVWօ褨u3[:5xrSJ⪫YV]WW'M mRh?ﲶtgs֢(eY-t\j[@ioKpz˫xT* _|QYIC/2 ,⾇2 Κ2x<Eyh9秬&Tע Q.0RH"Vsf CŸg5(͋kgS\s 98kQQ;'7°lWY9[pV` {&nTfIHȂ #tW=Y7r*H$ua,p5Ed38)wNm)BOH/BI4^Ml,-ΆԔBבqML?||PHQg r>;k$.B9((>o)8i¨Ґ7艣#x2I.SϯcNuBR0$t\$ q?߷F0yT?=z@akǞeZD$\Do~AWK&L@^н|2z}N<}:&N¼D&N)8r1R&n*ak4^y\݋'&Ё<iJ$]w;t J{r)8ssp~]70绷98"LfB퓘ڈ5Ez6AG"<5fs\,pA1d#fp!bdΦƙLɆ,M-)8Z>1'4LMKqdI @!--qs{NϗqY8\:'13mCo\Kb䥺' 9*" %KfﯽOQˤ/$6\<nwN;]>wZdzqjTv_Fq{ꑳ30QfI(š0cɒ8yr\+2de 4K]Py>G8^ZR,2& 3s{oh)u$l7tv&E tr"Q2߻}Qjk%J懄 YM<~5f,EkEGh5hm3t.ZPqͼq#nyN!asY-9Loͽ՘<*8s°fhA_M h'%vט{ SY'XWWE 6s5bR})8++pxj4eB12o7$YzNʘ0R d %+vy2v03ԅEg5BZ^Fp|!Á9~]L`6` &N¹SX[Y01Їqa7 MGosJ"c Spe„t0CFŤ)Z&V3 Spa&cX`lm,!Tz_8k2'}+e0;}`7?de!g4W{6@QAC@6t;'CĖ=zΊbDhmk W?uJàPVGf`p땿Ľ2FP0yA)öUqɥ^QLI)H#QP^w8pV!>>]þx/q4%q 2㽱aR_cXY%:*ӶxY NAj gV'MjS9vr^5H≃l\Bfa~Q=+AI^6FB6{,,-9X5r>/nö7I2vvEg5"^`>PT1ª]'Q{C,:8kcmkv#.-G,%t+g !9{=BSX8ɴ0ea SK`אhDL f!YWX::Ya[H' vlDgI^46OFw,cSQ} <_8  "Y,O$114b ^%h=spV#= K4o}BY/ս(, .P7ߜÐ[TDg5tX}% ֕YpVqHt¬>H-dC] j{=z{VSmM'cժUXiRY&2g-[W"aS[$lذV@Tn~],/̈́ Z=M۸z*~W,]oH@,Մ}oZ,k.,] ng Κl~o\ GGGߒq7k\bg-ϮAG]**n) SpD>%F$\d/%E'\yfLY.fe6oXKU$Tس`>bB=3pSҾ)8I󟔙)8I9p'usl2zZ 9F?pSZHCkr=,1Rݹܽ([7$JfmCBa|<ɉGd/ܞ4!pDPJR"C$n {Œ&#-U:H*3eD=$ 2J̔OmJq1QBemȾ'Ô9p3|Nh89prN I9Zv'9%8p6cJEn qY>hRpl"8iB"ypíkWd _ڴOK6E8NgB**ky@?slsٲg=Kc)Yā'o =Mâ12u^"%: Ē4%xqcL1coLlmC\VZ+GA>ZB Z]]`LMIXsVj`ݧB[WBKM'!lhr%o0Ӻ/@PK 4΄&X0qVqٹ~w=@^COnIs\;+aW4ڵn@E '?FiEp3I'_˿B[I>84ԽϷ[^]}.l~wezah4ƃ+ɽw;tp ##L7]}`|MlAS$#iY9 fqp pjrp9eZdr1BUƋ!~58?->g7 4,7Oo莛l]FEym-eN9s>[Sn]p5x\[3Ce=A){:ķ.HtW[hglBc\m0"-JOK QgQQSLl$¥*B‚8Ls|uu \B`ky?&\3?2b5F49πU@Zg Wg3ı(uF( NJj`#+^7x\sƠR+8pN3yAI[!իd?ZN^(H֜lfs58MkNJ|r(^RYHj˛h% ?x "3hv~К)H<{5"rYu*zWƒ:uqp%Y2kU⁳w舆}Kp2Wd%N;SOR^+BN] %Dɰ綛g_[Y(kJRmQ&Еb^5WnKtj)9Uj,iK:"V)() 6\Ô0qzd6ƣK~$_ N;1@'$rni}x.z];N7M9سyzh'4kNVwNoyWCei o5Y[:EuY:-ᒪXq:j w98}1bؽl%Ŏ7OawˋP9?"Ps.}Ni9{cp񅫻/j9Ô1{qx*v*=Y㇠{Ͼ8t:g#٫<^x")L៿t~ZMO߿Wᖱҵ4Hr+BF' GCr:9`=J8t +vCwΆ!3[^%b䡐TF[>;u8GȪz* q ۷fⱫ?Q5Rjo_Ōe0qH([[Tɹ\iMttFaiV qpDZ(Zu $÷PWK.H!ڊ{pi?e9E{о.t^_>|1r|{cU5ƘPGc]l7"p/ B^}^a8s T ahn~ڭH:%g#\^YTֽ~ؾq5V^[^ִ&+Ӟ[ۑ2bpv痹ʉ9rԸ  h}+7^33p>yh@?MSj,c%!mgzloS<"L3GN[{Y[-Ny)gb@RS N18Et`Dis\r18[N18Et`֪s(] N18ŖSDu@ NQm+.b): Zu%Y\X@[?ŋ'q]OdoP /U:ch W7ɓyC/۟_fJZtz9!9!n¿G'_uZ" ;*:}^@ueMyv;/_#-%/&?+оbp~8K"p6774uEI$* 4uHc"#H%!@tz_?Lo߼AA~.}=Q\TС| D18430KSAfBxEJ]UYN 5awvEe< +kstdR&18)I ke#}E}rr'?1_q~JpB3} p&'Ɠ E)(^lxioDٲFGrw&pѶ gf7ێ5kgʕXEu 9c3ˈǝۖnI]o_z^%]t,`s+\"P7ؾ{okͯG=|p`W3lٸ ~ޟeYtDZIYk/S. ߱v#?#oz*Yvm+k"},~)}eI(`s̙=GCEI Xu?‰,asa34Utqe%c2.㑽+?mey\wFf\8d,}jiG YN_*PJԣ}z"ن2}>ZwٱIE+8Q[X)AxfϟɓLU\Zۇ@LY¬0a"f}de"-5 ,x%%y<ÙSu}vIe(hS:jz_bb<{Et wO܋:e#`Y]n_SZ?k p}3qBLyMk_NK} B IDATmoAKA wDpb EF qDYͻ:w~\X3L5V%XDHS-sAzFq,9Q.5y,ѿ+*cDdˬ+^_CJJ C'̈́sLʲcq|: ր4w5 Ks;OtdeddПi%Hj;DFT+y%U{[V@ MWHao݇W^`đi"2zXW$aEdT1"#'qMfɔ(y60pzx,^zف R<@ n=A8g2JR"e}+MĥcaC}> Pvڛ'cNnmWS͂1,놞U7BWS !%[Xl ] $orpr] wmDbQ1il"x`"K 51yvLѻ<*Fjj*b)z<}r= zc>ȩ?V- J}Uq"=]:h{ᪧxm&P7=%cxĊVgAwL_m ,g##߂+Ba. NaK9*\kSPUPāv(oq{6.]z}l ǮVpz~'6WFm\:5!) tar!"--@JR<0Qax4T qh+-)<< \00 J~{X_ooٽ3j ɾ}еkW)p!j>@ 05tr' EW 4"psԾzXc`Uq)D;#v%C6&csc<5o2*xFVŁ3NBݧ,gS!.Z.]z3;4yhOlZ0Z4xƎ Om]`>ݺlF#[0l a8i4t끙SOGGϯ o pzž3 g''8t%-'9ڏriN[]E4f 2ZΉErGG.ڂd%Ď04Ї!p066$Y)l:tUXp<-'#*1? PݹɑX5A& 6)h/;UĶ.*>َya*S)hOf'3|0 0|(sע8SyIGSLDu" .BKo좥/섗xve=^~' mL<Э1tU'wu맊G/=˧'~c "TTTp-Ntrk )+E# (/fEЗMc.Z=b$̙;3gČ욁KVS`,'U'SpNSOy=yqBL#nA`N]yUl9|Q(*G} RWÆk,V.AS=3Ea }rTvv#M:sc\$ѣm;CVBUȠV֕o[C0FCgF%6wO@G&N(t]^u-N\MfϙYgscMbpA8 1?+L4RJHBsV+\dgr wƹXɘ]p|2  WY4Q`(|;p6}PTG((+CiiIURZjqʹ=?vhSBG w 8l}1;WΠ63$N#FF {PK@y)3rjK Tձ%TLwCV}'Zdb"eu˅YB }(+)5f!wd}Al^޼)T5O\ -T&CiR9o?9eŸtf {{1@J7|b>6֕P4q UTѸ8Bee%MU\بpdu#ud1niFVwp.Lm98c}lL6ր0xǥ _'(ࡊ{ Gbn߽tö6KHDrjE*KpVbL^d:?+.LDكc=k׀W@^xrŎIUsnYrr~MK_Q+*r cauth#_US:Рn$w5)31ib 8y"ƎA[)Я$>JRt9 :Z1ӦNĘѤ:r2u.ӲZRS`/̞0-&G^^nUu9D-__W`lY>d&&;z.Zc$SV6&;Q_,FV, 5uuh$Shib⍈+,ʊV"2,~.?!ȫ@,5G8ڴ FA +P&D#ÞkjEVZ"{_")-K D|m!-@ R<>2(7/Y*7%!!(y]mBfj"G188)陨oJ;59uL*M'L FPPWlb"],+D6!*:yH] ׸RV./ΣsQT&+OrNB,}Usamb/Mwr=z_%ESI üXP?e混鈈 ʤP; m +[Q\1o=WSI]Ҹ:ZAIIK'w@NbLv|* U:IY  ɏ?f 7keHa r>/֛Y_A,/̪ ֮soosK[]:֫ +܌dgj*h֯ts9;v9KE29+ǟUgbR~n6BQқv$!Ǔ,`Ǣ,=IŢA{(BX?_-Ig#WA\*lT(Rg~VK tHϛFؙ܎(VFz*CrFfz KE/LՔѡ&@u"r#UҚ#+ɔ>$<$D\mtIkbL+Mm|i ܾ8/'ÓMG- pAe-,# ƒr|ν26/Q> $ӚΏa?/LFmfy"$;K,eJp ʣu<մK֙_ LALLu|WQq?D3x$_,bp)#P?BSl9ETс\ܮgSl9ETс[gDUBGbӦMذa=֯_ŋp!~aGyEYFΝ;-mD1pazfo}ɠܮVQD1͌ zluqY\ƍ?[60NlAEl Nذy+LS`Eؿw'7H+ei)p|~+'';c yLZ ?wQgi,6299D?8C59}aBhӂv1zRKVb|SLa:IT>4 t EHOO^J4iiiJ{٣7:`gt>3 FccH#ޕiMc!M<G{Tx[b}cͅT0~RFsmcc(cW999kbHh.ʼnMS1nYDԠQ&,> ΩwɽGK %f50c^$>'S$8={ńyKp-^?{bԂ-&ֺL;=)%k/W,9=Hbڢ8q4n\M\8F$3[iVnkrڥ%˦Tpfhy0sԦCg/͔R c2 -OWP‹r$FD ɡ-8Cc=Jm~ޘik0w,=}'kk3[ryxzipE: ԶW0P1?3Joa,ݴI[VK҃2%H/M\wk-Sۺ+2X ?S2IP޽1b\| Ȯcg32݃6]62Q RJ"-<9n(#O]~T(:"-oߤIs y0iPhjc͈J@z|}Q6 /߿,: N61;ҍ[so9b}+Zw sW) s tWNndtݽ%|\ [)#7PM8rJK ⼰zN|۔ ч@w}u$=CsO-5gx@p*á&Maw;W (@~%mhƿ/~fE)[֎I[?zƊO2 FVoKk irK`'4V]ɲ!<;]i}jUNn$Jo,2 Fܝs >ٳJkƺx?&Éϱ]#Fb|`o 7oA\N!Cis 돬 Ǡ, #CbxҪhG<$}n>p~5f![hC +?7!\\3J8%r{Q2>VE# &x !cمG(a 8FQ]YjSm\:E NFi^9'@ (7Dd&$Av"pa\~ _<+ ݽu!m((-dlweG(8!]>P߈&aH*.!T.@ܟlx k@(BKK &3 2We䁅G7Ix݀k||r cCAEZ:P'檡f+ K~%bׅ e"iEbĿ&͉ÁfĨ=D ]:u?Jh]܌?'D)A;kdkPvrXM 9,&$&]s GFNqO(P]^P"IFM=3?/-^ o&ڃz!؄djn!X}:_OtʓOOOt&9~RS2[A_SQhjwtbRkYe㷑"PXBN!JoCBX{3CjDEq.ƒ|OTu-A~MFڶsK G! (F rDQ`  FNA}־"D{2bG:Q +/QSXAw;Pb/x %"bp-Rs18[N18Et`΢~T N18ŖSDu@ NYʶc.b): LYTϒrdRQQK,tޟ[-'Y_butC|\(ޘ)^s~JA*: S N18ETс[0ѱ`5bp)"bptl-Wt,bp-@ Qpsv%벳~*sx"';J؀xx9'}bbrwFjJ(kfz*=\Y쭟Q2;.[9egŮ a!p}i%we~m/^ |ߝΪ j'|QUQ)DIDATA\&) Ѽ(Wo q1fXp<\_PdM2/)*"C>ٯH8S濂\7ר΁@XR2YR\_/7g0xtMz+dpMZr|? u%3PeLI':2L88*Ȝ LYLti1ؚS }u^$żv73+c-)(8_\YPYC(0xptrEV3]LŴFca|Ԋ.T}ȟ1˕֤eL,?0p2=ԑg~g8D LK ÍǰkNرسWnY 1,/̂#PSWArn98i]a'a!m;_ecx Vsy5`SadUYϗψ7nvc'.gAQf<,{OU@ox9zOOD<71>8[<0#w]=عsvكS.# [PNt>g+1}, .v(]9 8 Pȧ#_H r¢Co/;޷G]e]hc KQF>W[ p:zBG`@Mhbܤ)?n$docD0\Ǵ=B##.E_<ME?Xb)}cc=g"_`ɐAƘ@ lcF(:/ʜno:X_܊=⤋_0pd£żZ& QZRP/_`ya͕ceLu$W6]@11ZANN)ߵ<;;NP()(`vAZov J޵s-']uեp8EdaHNIv|t.$qΗ+_cʎH,Ǜdl^: }$}duD3g?N( /?sD8Qr$''#1>A~n8s I2<{}2$z6 LEp.^#Oy' }m)B @介T6}voXC !#('LjNoAPWW6NGn\]X>Cr30ŽWPJ ZEУ/++u_]C_s^ } sl>_M <8JX|{Cf öKЎ[˶Qhl" d7s4GLcK EFbOn=w J(Y=f1e ǖ%Sѳgx*X+YNr U{j N"qcj2/&hW. MMM 7IJM{֢S<<:z2&FDe4@6uz`䯅!+Wpb=}4hkq8z }մoj>JJ2Y0~H\hɄ.8ZWfA&xa$cYlnXXi )},WOl,1h-yNDJt!̞9grue,0mZܾwLF>xITYRb:Xyqі'I{~5du'vnei 9xL}"Йɢk~B@c23|2ɥg |d.A Ȅ1YxHalo -jb@ഴAklHRߞ0HAHkphRHH)੻xfMNi t8pQtiq֐ V!Yf0v}m>IC"x سf#֭\Dh:::r> NuXh2~1 s9$xvu0W> ,o<*j;hk ^3_z8 |yȏs@æ'qLO,gC#og/LGpV-geM[N 'P=D~Xiv|T+G6B^V7|fLl}Y&W#,?bJE-f5{MX[˳PWTZճx6MoQ-Jca1(i2w N UbR_WگpgӆтL)@Cu$&HPۨMX3y F=ZFTϢKw l؀ k,I;o`y\9!kowˎ+nNkTzn)EbMMTeiϵ6υ˃RJ/0."o+ yX7AڃK^Sv |2pfYN|xX0cSGdr*3~6T 7'dp,kZCyHeصl*Jk5VuF-'-}s$C&jxU%JmaEJGBK!5Om狐 {:>S(#PX]? UELhDTR>WOG?A8y>39B >aå[%[A;ga~.|s'/\yr]*v]K 𹲊[ҸɕsR],;v uU@[wLZl >0Øh)ؒWKh]N-)V,|Q-g MH Nvqxe5xpyT*+sd$< g@*NL@Hž5sF. #Vk?%"Yd2uo9kάnE//!k44/^RU$҃Yp'I[LܞbRXAehg"i=^apҁgfeUÁs ƭ;td$፤ز3o-b& OF3~&Mq&&-p Ij\Dzf2a, 4a0^$l\< zHbQʲ]m3bдIy74a}!TA<\pq=s]J Tc$y!_ׄ4Sw_EJLGCRNw=ȂBld*);,'g^Qh<sG_$fCPU+kY ]Fnm7e_AAazj: RНdYŁ0 :c&&LتLOW>,唡5"|n聓N1+î8f9) DkάNAy<`~ْy8m /-2:RU]'M]v^f4vS RѳCUg(Zǀ7%/$a=M&:CplD̷10z`ֆCGm*s0^B\a 1Dp)ퟲ Ev§/Gk{G,#O!؎> K,--O$lpr:Kz"(>xX:}P /U䉼5)q`gK]D Tc9鵟zfe |i*4ha ɑN#7>Nw1H3Vl3[4ٿDVQƭ;pp >ѾZL`OQʡ7g1n-zQ8]7r~XX== s'l'Y U;b^ (jm#yPg7Q7> Ƭ'-a≂8[*>ۗ. N{N>('mHӒj`tk]8m&ac'ӎsbA 5f[}yQ&.Y>dM˧`2656 FF7́ӈό±ݫ1~8ˆ9@B8=Ĝ)c#<zb7] Ũ,JChC[Ljq/.b} lK"#1Ӈ(A}x؇QD&Ŷ#(V ">9łU1~j@8=E)jyՈ~õ1sb]+ \SE[\M QƊC /jcsR^f~&!>0WW~Ϫ(H ̌TiIMM2rd/}.>{vR=f W}ǂ0t`p )jص{evk}y:Ф%oG( ;\ݎ~=ᤓwk]I`8+FN4?>A9Y.JzK!C%CV"6:f-8;; ~HJMC%_ r7璐kiON'nA\Bm0%BnV*(r:^".= /{P l*gyIF ]@h7jgœg: kNo\4  lE&w*FW`H(ȅ<(7M*ϯxpʺq֗/{}U8N-رEAYdiӓb^ILkA\D!0<ť4YpcNT"1:1>p!k\:~ wz\]],Ԑ%S|>gk"#MmM; 7WgŹ C(T0V ߗE}NM˚~,ji[DFv6 9q}~:g#RO<_/hxWΏ^}K rY΁ɶ$X]w':`HM,?rQf-'k~L0l2~ mƀɈg Ƨ=pҲ~l.'6ܳd2\t}{C E?mg YC 54[3Kgr9Ef9T~Q"l0^_w#\dps2Xy42(x^/AKGd>yYI!5>mU!MJ?|mhmNǩ`ة@ʚ|E>6&S򁠏ᇯ9ٌOkv5r1H/y!)>SGQff?mבמ,؉WL{O*4 r/YT"!&G[`Yjpu{w5Etvmع^unVw[kQN"|>wJ!zr*JE\+F%b/Z&ucEf~=`)H>,bNTeUxH"(y˒u6)mԳ}f6I~6tƳN]ɜ᠄lt 8 ` 3R Q"yD ߛLMN֢ɔYU mxOTJ-lYXV.,[+>(')[Ⱜ~LÂ|ɋMYLA; ??e" 18Ib0e : IDu@ NQmu}K1IENDB`fotocx/images/painting1.png0000664000175000017500000007027115247006660014704 0ustar micomicoPNG  IHDR,tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 235 218 1 0 deXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:220 height:238|fotoxx-23.70: Crop: width:218 height:235|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:197 height:212|oj IDATx}XUY;Ό(ݝ"*]؉ح-6t %]ҝցCI#3nk|^JNN.Cnn.ANNj?rkQe/sfXWQQr9L222$$&&r7egg1gi.NMMEff&c|W^)f&5):&MLP~,ژ 00#!!rY`%8XLk3πْ i%OxXZ&36 &, &+kAɀ&ұ D w L^ǎkQD4Qk G#شy+;Bbzf\~-f 3/NFʹKKPF/)=PZ+EݹUKa%.]e˖cuص(n!6)0̛4=qAAtD; q;k٫qQЖ:f$~ys4 36̈́s4Lޙ uK̙a fKf55*Pdy@n //Q11&{] geD`ѤԮ :u×>'''.硫(*XwY5ѕ0Qᰉ oQ`K,09-m+/]c`n/ܘժ@k(u mXv'y%ցdzr T9} wo\2 QPPЂ3o{ӓ6\nYRN"boA),e}5eN f4աg=C 7 W\|S+0fo fnL0͛\!d;͛7~" [0 Ŝ BAA [MMMǟ<4dCA\OaGU9\a !Ǡ$HHBVZB=h8._Fk6й'< BBSP.J . 8 k(B+%-NU$%￷,Ź*-L4KF='rSDťNPS ,u{O!fJ~[_m@ј@OpժU sɄ1ɓ'8q"ĨQ0b|R~ȆV m3< xGn8*ʐ^L}3}qiCZԜTxu91H[z⃽n&$$a"qT(}Ey\M@jeN}8^޸ SW[ :gGtlp6f7$ 1sDsY~+wfQ]g5e.*PIƋ@< G-2R/\u $4 hf$@ KTQށ /@Xh0ЗQ ̠ϕ "c,tJ2-9}@z.6>o}'X]/#ʏi,4Miu<`gAih6 AS禄v ɴLS7u_cEcdsMEou9컮G &@a]=(,Fvl&X{fޖ,  Lk6/=alVϯL[1XX惂:9>N6n( SMhcȨIbsqi : 0!}kޗ 4&͕˲n>3xo7kwKD>(~P|;p2p0ff,VrYlVJ͕̈́vwK˟!(x?D?e=|Pԓ>(uyy(R'|PY3cS >( AQC#5㞷G(~BP8ݸu&Ag ^wP'>(jb5_"6)yhFK>=E 09&O_w~v‚"".E%%?-|Mw(+-8F(&ꢧ n4QPE`)+-eCй(.ER9:2v b2|41Pg!:;ɉw8㎛3rS08Iba` #Hh5.AQRT4eȉS S7S~ἓ_Er3A6h }())qyrt#>(e YMfΣV587vף\;yTV$$vog3.*KW\ `s$fܽ 7=nQv>@lޕLM9xJy`?n:;cĴ$s=v`Ævϳ:IOIlڸYmo<9mr̪8wd.zV ǰ}'ҧĆ>;q>rL˴ 9ۆukz^x7vn qX5L,q'u =}Wŏ݊!1sc2i,eo6f늲zݐ $<$ UbIP8}fDBNkz.$U0Oz}40xEe}zj2s*_z vGfTp8BSv/$ gXALN/8V=L |f>)x_s#Ѝ| h70PwEb!d.oN°CM 8{d;cK`6t!$.Ud_?6bŽ3-aIS(>6`椡l'jō ǀM3r8-,xԔemk>(&'/Tq]N Y0r.\q81{AGg}U[s^IC[=0r_A?]elqp*2CvmF0f&ctȫÒq<,CFT]q(ԯNI!@سeLt tfo@q67s,Ė +Я64 {OP@04E >}? 8e E ل˗.X>92\wC. RoۄeYRM227Za:m:}mY NX՛Ҧ(YV/]+Qg:,2T~ qԩS1b._X"Y18o f͜g`m=-CϚ%6voX##52B&k0bKVlZNwUXhn910mt,].ODK4_b҂"Cר3}Wǟ1h@5oؗqdllM/7zzCapヂfԖ2?Uà녾AwI[O-鯭npkȏV 5vɡUgO񗣶Y5ֱ^֣5w:5O)5 Z+AQ\Ta򈏭i\gurB|PPxunOwB'֢דi?|@|73kA1fDZ1>(hlĥ M'7ozϽY*n|HH^c{Mͧ =HG_go$OKͻ9\aA$^mpIWM+G)E\YW<_g[U+lN |xd¡=v2BMձ{-GZ^ce$T-8⃢Ys AAVj<?o//qKIuMVj=Ox{{H kZul1:vԢjD=_s:yxϟ"$4~pi=0?'!7<;1H]9Ȱr}||B+7'=C`p 6k7kSNOnnf n}E1L޸kZscbTЉcԔ,N\ #UH+Y?g)π3bjyhjCAVqS'na"^09F@_#m(i( |ycM H$ zF0t39g\Pl>XyS]4!,*9w#=7Z458^s-.o*fZmHNҫVA@QVk&kw!ٸW'>~|íKt3/9_ƼIC )WhmMAl3~>m_?o\82"P;寑# mΫ/Tx{ ?x4N]pddD/P-J7m/ѓGpJ3n܉}xM ;/[ TуK 'nv)ԉ5^ГT䃢V5շkEwI;d>ZdBKQR&/"9`;W𺹕h(eإ:6v&㡥Ȉy!*RZ{љ&loxʯ'wZ- ӡ0&OLD2SG7Iظb ,:frY٩ ]0Š: 0(hNŋZL)^ .}[/\c`t7OnVڹk<_SԒцdk͂4;h4PPY#?:=po:(b! e9vމ.=:/q7B@@g#+ Fj`ؼ%EWIJq"tjf9AG( , `kgs[Mr6," Ft:c:sA!IByłD ǯt=*dH7C]!OC0Fn6.闂][1m9R)13\P#MQf=IHh 'xG^ڹ][ &=PXE0f;ySc{L_D)}otWwkH\ׇަ}%cyXtlDrSa'bŰgO`>~:A=uנּ"V7oc$fBUAxAaWWSg 8y^,d$Ea % G)5?;"TcSqV퍱v a( -$b4-klDgnF_CAUM%!jN@[ b鈉*?WAINvD+<56VY@SBJe YU$ϑ#LX Ug!Kf1jd5Nr)'gXG(vCƫ,h/gh?t ]5Es[m+ύW=|h7L{iUWͧ\-EK2au#hc1;"T S?͟t֝BZ9ݗ ;&.y-c hS5_S,iJ_<UdGlSi=>(>_vLM-ZPz#?[ ΋y<-Xd!<5/GO)ޣ$Ŵ#Ǜ?_[&|jiAEͿ'QP0-?/U%Η >(g\sКVA/Ƅ"<4GGs>(T Lgg|Pԓ>(uqYg~rΜwܑ{Rv|)܅}1}|WޒAC@B 95zޗBS6\*:o?b$=)g0%6Lڬ!fچ:raN2Z 3Jgbl]]uta1IAka?gܫtt(}*޽Nתtb)_348cU9l[wrqa(ZK /IUd|2j o qlwrf*Q}goA-/fʋpe(w/dձ`%LЩ [BśJA佂xu zX*QVhX5R~1,0wTgؿ zLGWAALY4 Ғ&X ٕM|*-]vAw!bX/cia}1Nmڢ0v$ G&/~zL۷qM/^Gb[a9Dё|뚎׋F^ACY^=1~jN>)aŪ9c==0qX_P{:v!Q)[V.MyE3@B'+ 8&̼ Zmp3:wV/X eXv"qq۽fD߹k7\&2N1mIt~~3w%Gġ;SHSbsn )Iٱԇüw@<_'bHCpM&!ܱ3 &ndztqO eR|܃.䥋@m)k;t~ ;a3vux_B~(6O1m;p 8#No\4´r+%Fy~7,,]wAkh*`nħg$/ {z/&g#..q I( eI"ӦeqilZg7q+.(I@BISmč;.8c1DwŠsBuhh9=s;1oJ8y"( ᬁ$&ًpbt qX"6 {kqdaŜ1d(WZ^Xr);x)#zAy ֩6+G}={ .^ˡ*o]Odd_5 b8`ݛ@E'zBHB2JKn s.-Wn: r'˾%(>"6fVRX99(~II ox13磸:{0 ]Jc#fB!Jl5*Ś{\Zî0(Krk;~;P*@N:8]8Blw8<`$!:P<QI"h}^zw.bX3@@cn@.(-gǛL1 1j[`B+P 5`$e5nd%í^h iQMD)|c"Z0.e'#Nۻn6Qe8L(دEN09Yh4nw=g֓u{xm* HW ''XB5'p91<(̲n vgE2~SGpF~sPE^ſ+_*zN |Ox?o>~| {~HȫN[۟`D tb(NW5}m0*X;i[dD *n>1A> bڸWui4N]GuBE Fs-P0~T%zT"'*:u!K;}%1 ݮߩ}F`*OKM$40$[j #%7A(#NGĴ?p@)=j:h c&1x=(U".AkT /ޛ@E6]$ƭgX^-Gn)v%Np4E%(tSIťDa*^}rz ᢓbQXBR^u@5N@0U5+٬ y]<(+•+SĔb~LG[^8vBMDL̰f:, 6z%vPLfM"ܕ&!Xq-, eJn 2`z*ht`$Y1J 72xŠ̝ޝ胉!o"S_C]0rY43[@OYP8FQqUhT7݄ҰHn]cաze< ,@S q5`/zdH*!̪>rڇSe!; ^DTjb= IhŹ!+Fç#J0hR tEN?d{tE?sxfViZў8 /H a5|9 "Ky5s{s8{pnَm{m`q);ctGEZfP!n' 1KONl޼;Z3tO 胢qI<֛ca\XcB[&!8r uc,p-otܱqŚ))A)i unP3~H{SCYZme16stړW{%-SHGwNQ =nݾGbIL!hbչȬ5(' Gb0%-1TźCccAHG3Mt8Q750_9ih8u܆'8:?7GOql;<_`( wAKƵ1pxQwRb6o"'#XY$6I(a4K^   VBnmYeFqĉM4NxLJ-#SPWI .('w^~7koƵ1gD:3a o 'aƍXz),[`8J߰P+>ڙm0q 6lڄb:,:hUJ Rp&OX|w6윪P01B\L"#^"::YƖ/X~ݏ@|bi SW<"^DBRRu< +Jg"#*9B%(ɤ#MeV, O8nX'EUD$ijz : 51OAI]!fNxJR%['֮XdP_zqT}?** ɩ)DrJ*w"_='#1坐G+hUҬ*gJ1QJiHCzvfU{ab8'yUZ:տ֘x[g ו.U'+txq:\nI ICm8D[AM8|3 z=X:aYJ.!FKҎM{N`6DaE+p`/V!TkP?25'Q8f9SUnA c#36ui(gPy9('SFW'`y'0KW"LWw%ûҽ_?ŠhP`10k_rW')@AAd)aUxݨv}(j wŏ~yqgAQeN|KƂ⾏qNŶ_w1k)^(Z$(u@A|a,a }sg57n Ͷ3̪[`rӓh=7-/[qf}}mU(B8c$.XZ`ܻ)Ͱ:2~TؗΫFCBY~i]7cǦXa3즕q7 S7)/JqZ=o57Sl]} NI1V#ZV'0[z0(Di$mz/HЧ-lyxciu(2cab`:d8f͜BEҐ'fQovdt.%[>m)x? >\(b[-1z8u8G t/qp: :ðcj"/x'7[`@38ĩ1}b<u-R'`51lA`-K}[0V3Gpʓ0TS7E0Ac?affbjW-fmJmcQ05돵 NY_?i533sc͒0? !,'9xcQT3b´ٸu?[FL=,6]CJ] MͨLq1~Q^&o c0:8NQLP6Wza)O1s9y D6$8y\t n]dψm$.ܺձ ٵ }K|CPjO Xaia4~*܊f:Tz[.IZ?N4`O)/:DhѾ1gyWGHz\^=gx,^H@sP4aB¢8f2֭_MD+l㟻E)# RVX4w2enexb wopy tjėz.Y Kf\h@H kP 饄R{ѕH<@3.);m>: 0אxg&MS ;p.]!Bphţ  =Ls-Ø(oF> ] Äf-:ZJ˂U X1`ǏqfDZ= W%`4lFT+M[# ˮH };i $W]o 6_nVV]Iuf##18xt-f;G$MB+TMav2*H us׉2yFvV8>Iœ6斕jPR=sT3JMAfk IDATDEi&4B."pMC>噟'@x6}e- ?Lr(v`#;> N/5CWZ"K~qy)z Ң&"u|q "BcRҊ42ٙSr|2Î%6VH)pAӄ`& U6 +3;4v+GuӛFl\|h-y]3ӶUo L|c$$5QX<%`#(zO 譎'5KHӞa,}H mJo oh>1PJ." +'BD i},cGT0n[9!AH.*ut~v S!֏x۲(/F*Lќ; J8yť:W - 5A)S`4Jn9[Kwi/T/M0>)Ж#H ]05Ԃ(z!'/?j̕\R@w{iJb H#rJAY3VkW vM'^~˩ig# ԕrxT;n5 "ūG ع-ڶΝ:]gQ^IJ>Fh*cqQ .7g/" #ZUԦ]ghhc&TP%f".U nv14lYECAzrXq@bPG pCClY2bD=en>:o(d` v++Jo\`eMAkf]Ps^aDiKNK#1oTiD^\AXJrZr#1gsl)⢧?5\l|]K74]= xaέD:pK+Gr'ѨoKO[B}jHhV1J p7|pNH)I΍!BpWIĀu fʲ:c%/<($eg/#L FcCVQra1/~k15|No3Cpz>Q %&s1~95SY욪K4' AQ:.$<.c6hau` ywLDWvR0_n#)!0ީTm>D8w6d!ߣ&w(%0rJr2}9- 3}}hf㚇/v-}&*@SL0a6(Xv/%CIS F?u^h‰i{3q0Il@L+7#,.-uq!<ɋ>uW%@$EdT ߫0hIv)d>pGCǤ?,.Ŭ)#ы];vqP@@dW 75)d[Fb>UPI_6\K$̅N *p{U݆Ǡ%7D:Mؿz2D:Kc5~qv2VGq3.wXK]gO11jr6_U&n8}"i/ ^]>sl_9OpA΄=[@:)KJ/KVwp i^6Omċ'xQ]YW38Nmg!l>ݿs.#E[?CpۚwSG@KT.1 JAh(yjqVHH@EI&}NGhR>Fu6Y-WN}_xƥ6#d߶֑~oLSTJ Gts]Ww{S-.XڷxxnpsH ߺfW]iAOkCV^qA}4(Jf?-(5%%Ex[2Ah:/(/-m%|;Lj ]iͫ-  8|غ5"|Ph' >('|PҌokf|P5E=^46{EEhƹSǚ(Z~ğzV*Cq#K|koϵ ѓ>vnS~{ 9H }h $9Vus hhbX xw@<Ǧe0ץώk&>ا+;36k`b>7sce4͞-Cu08}Uy;,ʫ{sE(4+DaSL4^_ XcRK*0"Rgl;9~){ovY3:l-o: ѵ5HNEdDbbh{u :ͰN{َBDSpDEE!-+-=+e'!..R/A(򋊹04-U`nl| a[7St#DFF '(U[O2  {!D>GCw>'1Γ ,ac m=z(w:7zsKK+osy8s6 )YQ(S%EθOGYqVS +:_}k@M찑̦ѡ&K`}(,3~/4G òM0Xd)vyضqOdeeI:;WAwm#>ś@LKÅ#[(>\CKBq`<:Gm#61j aA)^Sl;chM?t ~-F9N'`$۷#>"P,s;A񍴸c1HOKSvNdzcѰ\qC: c3[xt'%)fn/*E?CP,ŭ 茶9\3( @;R\П %LaSE"8.Ɖ,:׉ËE!`++. /`ec:aӎ03o/jݧФ:Th(}˱ԉӰ0EW^uM BBT-JOq}EİDB"Ppn\z-.iQd+̊ž8ZOwR|r'<-HnS)z J6r JR8kK2eT\t?FbͧfEZS1uᗈ0՝9嫗]u0;\ffwuA `*AmbhƄ7Wf#FMr7G`8bWTgp'߁=MAa&;qg)u*.9lX5/DYf^R,lZ`=`Ф|7q}xzy*'OG]+Y[1 彆E:dt'wA_G"mDkWLW% ՟<(xP~'E(ȠB<q0Ŵ[QЂհ K!XIP=km]Н0W !/l_ň:y5Fk"+nX EY;YC &[ ]ɢ+SgLX35P0ؐ%6S&_(h}{P<(T`whys<_= f1V) +e|(G*j<}IZ`E o`D $&9os!,'.DRat߄z2;v&c>vpޞ8wgH;e2]>NHΔjpff]KQca8{$p) :R:`:,8+a;gn߆tSh6q͒p^  J_%0EVrӉ[OzG`"{;]Ss6bӺXmrkTU[-Vh2wZ"GD#fZQʿ锷"&6;Qghd܂<6dg+YwTĸ_A/(QtHʣxIM5j==Aa~.|PVRăw0X$Zm;Q%6$d6ovÃA݉|hnz{byD-`]Gx;iAǃ?Sj 5kS<(xK&<(2شO[6<(xK&<(kށ׼<(xPBMxP1di5ށl<(xPBMxP1׼yOyP- Pc`j<oxP- Pcy^6A[ 5AƐxz޲A[ 5A^ljX`<(xP 5r wxP- Pc@kgyxP- PHh 76E#595 d BAg~ih|ZDUe1_sF;kCFZ2}{Ր HOyVR{ŕe%BD8*JJ֎$D$]hij@ʣx.I*N@Fs|}d6y CMuy?AL*/^؞vK003֗`W%FۮW'vs&iܬtYu551^d1xcX["B$EXVI^F 2 mP?^1޷ӵkL:p=(59Th(GjRk:*.E40CTz Ty9= GQ|dA Ds``Sb(C*ݼSI6C fοl&!]94AA9=Sgٱ8u$rCc[[{~fu qW;;ML$PtBT``2 ?^Bu]#iL6mݎ>,:(14 W $&"'7i)Ixpv UD3Y7#QRNٷcZ hsu*IǍрPYde_ .CX/kW`٤y ('QY,_/X oƚK|8-O管isW2ĹƨQf'ǬY">+JkU<ӷX n* NKVO.m"$Gxu+1w̙3KWۃhq R`ӧk0o.}-BbFù^@1r,Ȓv;ATIRu6k!1&ik`tl{߃%N8t4 f:om0j Llg;u[(tsaOσ~Ii) < qXrb")G)XjӋqhHRkGB>xFžqL$~d8w9Ar>im9b\aPˬ`q;2 d)&AcDLuL^{g>Eg;$O0H lJ{ׯNn)Z[DɊptg0IBE ;7Őcdm҃`zCf4M FҨ(W.BJؾ ,WN 5iբwmRD(FkPѯMPЪL1 Љ렭3> >9k8q&GtY"8 q)mr<9p / 4'VUG1VWtEIvqOПl3w!iM7q2ʫTe1K(|<9cyqb<\EI^&LsB @BYe7a>CZH|? 4$dh-i6F[ ,(;?[I #7õLL ¶Ocl9` YX5o(^4&0>¢M4 ]8 4aB QR\aZ 6 BX'8=P"{Z R4`|shN_P .2h- 1isa_dE ƍ#_d/ &j⎐(r7~8ϥ, IDAT'3bl3#[Ty*i[A NBc(>+ z:b$݇< y' G֍!ް K-!=Yvi 2Ű:jUA~'G 0~9~|ق"M!'=<)ٹ`0Inzs;o~1˾, SygI]4Yr ya+k+.YZYaびV>(e\lfZ I ˆdiigY͟cCMvMD_lIq!Mcu^CC =B`L}4b[3dM0 w)_bO &tzb ? k +܌Iu6U(1|=I f݌jnM%IcnڌuqWHHK2o%)'M Mʄ~S7(P@+,\ڊG?CQ+(ːKQ"/N#dPmgh-µԙ`B& nZfv(lY˿BS nAY'{> a?}/ۉD-h=[,5QȦ6jS}78("8hHuК: B.M (ŬWdj& QŁB {HOcH(vbf̓0$bEš0w~J8_#nC读)۹$Dyc+M?1 ÔӓUV{  E'qc]Fl\,"˱6&MK<QYt=M" mjBϘAy%24qw#%-lŗ>)iy"V}bASq+!&&v}B 1Uk f,9hپ p50)d)RH'ćÆvz!2"dᾷ'rrJZP.t'Arn>#/a43ܤm!pww'Lsw,!"Gi$P| kTu2@>k趕0[9B4} }Y^8zh jR%-F4{pm`clekLmeNX 'HOPhR E>2G;A4܅=C"PVR.oZx=EG#*: Q1d/3!~QEg`uW ihwv=(5v:dM`Dܐ▷t:hIVrx$$oV: G|Cz>٩ʲ7gh+/WMUwO&yN5Ѯ7,:w^^ZZ=(YV6ӬL$"ٛ`P~.)"&*ŵm++)!t u*-4OL3̪|>ֆV:(#9v3д;$󴾖;FA^Ӌ89c*!S ZF) >[+;SL9̹Yi(`rÂ,;سnb lZ\? Deӄ ;Φ%|2`ǶU0`dLt >GzhքhTƞYtS/ڤV; C*zC7ĿuӪ~>Ty'ޫ!Q)>ѐDֱl\,jm M-w$u:wFJBJ4.髬DTiS#gﴛ& lA"Ϗ?dexySxP PcHO <(xPBMM#~IENDB`fotocx/images/markup.jpg0000664000175000017500000014721515247006660014310 0ustar micomicoJFIFExifMM*V^(if%b02320100fotocx-25.0: Paint Image|fotocx-25.0: paste area|fotocx-25.0: paste area|fotocx-25.0: Paint Image|fotocx-25.0: Paint Image|fotocx-25.0: Paint Image|fotocx-25.0: Blur Normal: rad:8|fotocx-25.0: Paint Image|fotocx-25.0: Outlines: Blo:26 Bhi:45 Amp:10 Mode:B B&W:0 Neg:0|fotocx-25.0: Amplify Contrast|fotocx-25.1: Rescale: width:483 height:323|fotocx-25.1: Markup Text|fotocx-25.1: Markup Line|fotocx-25.1: Markup Box|fotocx-25.1: Markup Oval|NE0   LPhotoshop 3.08BIM0auto, ancient, museumZ BMW museum?http://ns.adobe.com/xap/1.0/ TOP LINE\nthis is a long description this is a long description this is a long description xx\nBOTTOM LINE 1935 BMW Roadster, BMW Museum, Munich 1 2 3 0 Germany 8 2486 3719 1 2 2 4 C     C   C" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((((((((((((((((((((((((((ZwƷn N1f[sh,u<gvE/U.ߧZCzB-"W/-svjA '$7q0FIoɰQgW=9~Tt8!ED>CuGI\~2ʼڊb=1~_.1i9ʆ_~ uhi\kn;yK 1M$g"O@Ҿ|Ӯ_XGk _#Fdڅa};?:|kmV x5#>.qKt9jVq>wct N݌`'G!^!r5O9G/Ϟ~㕧#;> _qx:WMvC>zgQ ?ߩ?3Q;> _qx:WMvC>zgQ ?ߩ?3Q;> _qx:WMvC>zgQ ?ߩ?3Q;> _qx:WMvC>zgQ ?ߩ?3Q;> _pZ]&L`K`dʨW|^$վh*3[ꀅ 98nkk/OGMYݯ.Ȱ=&#4ڳAEW|PQEQE| d6Oi!Dr.71j^񖵨*I PX^RνU0&It5lQgm%ao~O~^@mxdFܜׄ20*}(QEQEQEQEQEQEQEQEQEQEWe{J6mK](G/\8JϪ?(rKK|aeJ6lJWFҏc (sWKQE|QEQEQEQExW?ƫ~%;WWR"hM^jda<1ĒJ1qM+g_.֗l0Phi4kG}ROކ6;6R8jV%HӞ HY# Ÿ\e`rI~ԞeͬnKˁ(-1a<gf/pOcu27d"$ND9OZ1<][ZjA4M&f}_ȳ Wr49+G1D՜/0&xvBpyڕL34urKY:hݮ$+Zc8 d!>\տ> ͯ4[:Մ-|^eF:s ;?F_{-iS_j+yb ܅Be`v:\(M< m> i5|LΥBY}BYn魧 ȅXaP ަpTlz<1Cٺu BdOZʘa Vwt_Ϫet 7CqI!b`s3nwi^Dv%ŴqZBpl|.ߛ$wxj{JtAvZdEN"F# 0ݹYc#tVQ%Us~-վ6^)o6eM׭3UG-&H1\vߌ <6ɢ:ǦI"?)7KKЊoU'Y2@ N[ lQt? ~!%/Eki6>|$51+ǷD2eKYǠ|>t0][dpdt#;i=k-adn5 (ge 0 7>K0F Pp~a=G+ǰLJնgxnyv*+0 rz$Cknpwt~TZ\q2F3OQU̓\YG$2"ʮ i?z^|37[J  FP3V)I= ( ( ( ( ( ( ( ( F?zk=%H%[2\'%]_q?QcR0FJhQ $Y%c_r ( ( ( ( (=_ ۧx{/Ŀ#O'joy_7^i!EW~VQEQZxrEuxɦ7G=Wq*Ȥ[7-WB.9Ilt׺Q)>IAc(;6)DzL mUMZ3Mc arE{ee cӯj.Zʴ6)4ıon& T^a Z֗h]eYmV+c`w_' TJMƊۮ;?eoGڽuNK);h !Rq4ڸe4dA|Xg߆dFp}8[^ {KN{'t1yTڼ9dzo> Uf< ^=KĚ&gm*Xl8 9WJWǓ̿ r4z9p.֙@ncf);+_rO@쁻_F"}(`Zxb4I/!SSիYWOg|3qNL)h/Y=/mm{^//"\2^ۓ`lqֹkYjٺ>+Yܳ-AI tv~"oشKZφܶC,sY]fk#OE%f9-X2Xp߀c ҥwo>Ls>o 1uGxTDk4%77q rB\gG&>#|O2ƆxD)*W q:F o)a: -y @ #5=CĚMlB B cGsm@ i7+9J1I  Mg}(GO.^uZ+MZjÚSSNrcS V Ҵ#Ӭ-eK׈p󘟕?讵-. wšH3RwP( -ӊƱ׎#F$q⸒D  1 l1ay+,gRL."g OrYo8Cᛩxayj&wqЄ@KWXk>n{gI n-VITi6: S^;jlj-3!`e9vy9.0jO4[F ɭt9ogIEpl/5;C$A3 f7|?4Wk^<,W^_+7$l7Kmr0O]V۹w"$|W-An%/K9<~6QuM:~ˡ$?ҭɄ 3󞵝 ~F}NEܝlUxm*eb`FN ?YZ|EvwQ6:njϘcS&z#ݒcQN756r l-# eF >Mp> }U^V1H"`Gܥv8[8uBKMwdin/#h̙9"Yv#'9&kڵvqFv}]pTM>d_ Hk/hzX|4Cjz]{%QxW?ƫɿ)~g$ޗy5ƣ8 nf HY:+EcV(Şs 7Op+./#p{Rad6pj*X:|K>;բEÞb2\3*2G2r+~x V"KӵKZm*Ь6ĤPf7ՂTjm^,s:tܦH1(G sάt-E-Y+>[Cih1/XW2H 9ȯ2=w/4}fD$LzeT_+WĿiѵ-+)iWvfhUO GL-ՕhݗI7I6zE3q#qgfWň;FBs|rK/4]º~q,VH9nn^ƺ-ϫ]yCnBQp+bI<{L~֬>^ޚx0YvQCH.KkͭZݫ1|s*_diVѷ׬ "?;s?>Q cȪƓrC=לNqdsְz1+~ۡaئ"⛏(Q3Ig ~c>^4'-4#J Ꚅ3,{ݟjՈE̟f6Gwoٸ݌g3Ims-S+66gٷ\e{t}BbqY1+!v$?|RF+_]hvp]/0tG&!ұ77E 19QSODkɽ>Dr¾|W 5{IdJׯEASx8 1&a̞#šeZܜF~7bri-dch_IFcZMKZ' &5] X̉ j0}U7ӕmX"VxAyfg1m|!O<ݟ::o -l!n~Nxm͏~y{60yH$ E@8RRy`aC9ᆋoxuӣS2=pO~kJGM=.ocvmO;7VݽUIʏb##}7Jb׵MO,ΞX?0pPN.Uz7t7ǟI5)-i" [FѨF9e#r<7z+K; -]#k-ɮ1-īVVpq 8U n-~Z~(sǞ]Z%Z'W#+tڮ~o|_I}A牰;dԟ2tk0*J ( ( ( ( ( F?zh+gJM}ǫ㿲>?N3~Y)Zv{;v=??,ޫ_lwڊwXο0ljx u(*pY%e.3_p;SȹRNRYݔRWoο0l>wjv}b[j+:2K3K1I F>,.q|yٺ>wbCms<*\npC0q|_Iq_<:_B |;Z:(Ax^E3&!e7@9ϤxsZ$:>mOrMVVTFTr*"XxCsW`/G3L%+\oNox!դjђ㑀<o|#/i3E1".?O3MֿHb_:g_?KQ SI*~WI\!BG:_g_?KW57)[=Njɑ-2ZLw>V_# 3>7kDr` `\r5VX/.*i4{R.j|Nܾ{=RO>c2Ĥ,N'@|Pj>-<I'ՖHLuǝ)Y9H3Q5$/$Ub\ombYٟLGVҗ 5eL=<ƝahZ缙Ih՛<p1VWnWwNyKqNJ175Uh:Kz5UXMT 6y ϩkM t6NURwao$"37*@*A|w$e}⯅H m/ð%IWH#J n9~~6MINLdZ[,-dp9fP + Hu¯ Zxk<}jlt;oZ\S1/0Y'iåq~ck:15zOÿٓ̾6V6:d i8K ^*mgG; >ѴPqwr+a$} q1]q0l~w=k?@5 Shlyyf8<׻x;!u}4~JuxU<SgV=iGk[zxR1"WR1TOhVb:eV2]y̒gʋa262|i9KVĒ75σ?{>?xSIWRТRro0V9@~`w|LgŹg| AW 2SCMoQbQk#mXȘ w 6vc1rsn<l;N2t>uy6[DZ|L>#Ou|>šYEd]tQ&*rrN|f+x1V=gZ+Y%PNz?y|M-ji`u%eP>W]0f5)i\6wLdK\Ҿs2N3 R{'+]$ps2+JIkvNIzn>[IPj:ύu$& syk,WO[]+zuʖ"V[G~"cic=gO?$i-:N -gDQ(, i[_Vu_>7%|?ur|H<~灏^y~:V+V:.['%wV|  :Q'sٺXmv BTM/v`^A"PtM)WzCk6kt0U$O I5% ]O+*Ikؖ@q Yˀ@"/*4|)_'Tn0Db^xpmd]¥Fjzb=뒊N v_%!$|Rdž7}rH;tz}EODmzݷXvb툑+OMKcc ۏltC߯)*@z#-y5}qJ0_2)ҽO~"~"4wIm4(e2*$\F7rP̃Ԛ~xFO:o\*gql)=r3Qw$tP70ݴao03|R5sY:jI~ɏx}vlCٸvWw_Ϙ!IxD!.% g U>׽~w-9.M--5M@$}ywxQSqs$P;Wg_tKzGUJǙh|3jX#zy#_s÷~,Oj\Yiv3HV(ȃ'-T^/]񟅡mn|?iqKy<$hp$.rNpu3ඓw[Zeˤ!W l1 1BjT޶sJNqjCꖚүY\L\ncg9ܑ+n\Y|MZ[Ie#}EQK.U 3 g80A>$h>+o[K5aU<0)əC`S^4KgyֶlFl%$ؒ~s]U3՞`Mj-[*Qg*Q[Xn1]]>\𞱬ZkK;6O24BA> KΤ/~5|/ Zڴb4B8!MѤa,8 Z.5{e%]$o~EsvFR6_zCM=Y|b:_ĝ.SfHĖy:|/Y& m%F_ԯ[I4?i7^PMWo$SOb-R&3D?f/ּM}5uXa6(h0̾`d#E!%U W$Ήu65Ͷŵh4X7şdG NVzyOnYFЬWm&rX?/i][^ww5Up6צᇂTş xxV[9N=Q-fC%,Xsn`>|,lHEOCvG!ZZW-4#6Eŝ=6]GT 1p9&goΑhAzMi>A Ŵ~UB^=9м5MK2۝ YߴXº)XG@ gSjZ6.u:k!FEDE]̘6V)1O1S{:Cf7z܋ϓiI\>K}*Hg,~U\1w:\+0,p0hZ׾, ^zdY3!ifXV齞v]oe;Qkm3Jf[Y%*r;G =Wo|3_xM֒H|ѯmfe9dG;pqxZTLE˺R %sxÓxᯇ|QNڍ-Igd Uc羷Z.Oٯ|{3 W d|q9cfibevͿf{l.n C+/$5/Kjl$v>Ѭ O(*OI'5|Ym~As<l1r1d 95趖 } FAuvAK\;40Dd|j{4r[' +s[澏 8\^7n~/eIWySI=M) եH9{$)K>x-;lحxG/Z٤+[#AG8FVS$82!S.r{΍&yYdw)NwAqĨ)GGoj,wi>ju!&x*uՇAkӟ4>eVa|': M3yL, c5Q}{ 5Ͷm 95 y+6hTf>+o_JxvRq"U<|Fz9;5i5_ߋ;hG^gS,7ZijF3oIo麕]It ~I^"/_#ejZir4m|ɾH`^TӅ8i7vc'JOH*ta+d$VcρEK_ߋ5+ o̊+XeHŪܵ#\f<NA7Ρ?:gOlwLnL3h?|kx+ⅽ"%HC \ƃl$_2;ic.CIjosrHػKzWGJNOvυ}|eo4KM.q6bZ [i/5V,†4jvsOg¾"Np KRѴ2qdԮV2KOFA6! ek3oeg(' Ҡ P]P mlsibX,VѰs1΍#-oYhnczN#34fqץxJ=;ǿ|Umo"ٷKD$*LcGL {9t7Tra3'6NG#u;A|q bH3vʮB4˞q!*/W~ [Ҵ; $FFKu 'p3^߃EtztmyTyspN2g9 $t0A-7z&wrf/.?MuO|%e4 ^_ʅɤ0b61rqo[5 utf^41?LVǎué-L~`G:qݑOzfҀmB3z,&py`0&'WZ_E4[{^$F2hv 1gu? xWҮSf| r= Ako4ijֺ&aȋQA5g%4|Ϙoqv-_}gd^$𖇫h\%Ɯ%bh S ~V|Yw}VaM:t@!j0u$#Z[?hl[Șf-g9-?ŵGH@> g_ T񆉣HX!E :'$e7vnDe|X`7]˨̥#Pg^XqekNi>c?RVܠJ2N uY|7V#RI6Ҫ2 [Xק:iu vv#W1%T+𵹵Ӵ;I>kla}+:?\@UA?v=^uOzhOi~VRѿWɗL朞;ˆI%WG/5եϟPF \Cģڢ>婯jΕe}]JkVω{r<X5=~Mk]]K}s=Dx!ۓGq^^)n_3ZmmI5$V-(aަƣ *њM9 AN-dFֳ=JN^o䐷J˽2i+#F$s2QD*s 9$tq, Ci̷sFVTNO.{3Qm 6.V-nVL͗bV+cR*r-[\^cilYIɒN sW!m )`]][e {18TO<;'#{"[JhKxvh]Bp-$cRS<=ihH.-ij=Q|4ǮHu\+q5 >*ymg@@A?݇;Wi뺗_3̷_b_̒irI8ݑ}2>0C+J|_\3GkE61i\z x:^qƊT(el׭Ci^4]? xKH50lo" p"<K i 5; jZYKIZ1@8]3$Y){1rOO4|(Gm _| [I?'<WRC\}#Rg}Tu hK#Y>][*W>.r0)qZK9\;.O z*={>~%c5Y#F-7y^Vì[:>aڸm-49!哾+G>\T|Ec|=3\F5j.-q`q#W <3TOX5Aa!r8K`Jss^ ),"^=~tT \ł8Hy|z] JIq ۖX@"ܞ'eiL)X˵B}vE|0a۱.oD]X>` #>`<]JTymjNU!&O}!˩R0Hn?$ uA(Tu.NG' OU\gNIyH'9:qH2|"d >28(f:9_x~ O?/304ڟՊݿy5}u,bxxH Xhjq1IJHyqGK9c'Em*[*~9zTgt)ZYQB嘌ٞ@y^~hֹQRSJ]diI8^nտj,C&n'bA%Ϛ7ȃW=oxB苄1O$jhJStd=TW|iԣ~'k ma"ip6K-0A|'7W<8{m4wIMSۭ+:O;;~KR\⿁7rK- 6dNLsZ >.Ljw'/$e#Vvrz7<5 gu/maIt8ϿᚩJqrnwoNM$xBc[^;8bDq` FX輻>x}正xZayDViBny۸.| xl/@YU+[Hr}C"m59$mCU KHtp?z; ,c'~/xOP1Լ.䴞CĊs B;B5xCmc! qۂvNkſ5k_ٚ! ̀R+A$fAe9yIvk4|?(M9lK[E"fpi(cH H \yiv޿R?A>$^5CSI:B0+ez2қ~cke}+[ KAG)H9"h0?w?4+<#Rh.^Gʳ5\RA+.el-oUDMZ翻n%;ݟ?}sXxNjK4WS=y>sf rw=GZƐ@,@UIIW~^(޿BFSR?su'%41D'#5NQ74\_ScgAN_\@H$qUTkJ (Q@Q@Q@Q@zOj:5N,GǑxQKy4,$󯯤Hc2(z^Q4%k?wMmvpvq$pIF3g?X\ 1SwGd>K^Su -o U>~xc,*bi4n$@%A=Smf]e.S嗖c[~N:\ŘU2=㊫o" }8>Oie[կY\d UC>=IqTVoKNZDÞIfK+y8r:?f$̖;rw+,s6l`@ W'܉ah,$ CE;cEH ע^|E?j0[hZ_低4/&(ÒT0*:o^ $QGsDÅ';C@^Ú&^'9^9Id t zץC%OK=V_K{h\BveWчtiBM&rkmgt òY]Vz5Wgi RF7c@ceekBنwVga$'hPTR@?^6%5E,;Tu##J\4t}3m9!tf91vϤK]|}6E2:G 񬡘#k@! 7_㏮i]osYnIEZ;` ]Gjrg4U拿GoN[b%ޮ&en" 8]H嶏T3m<^#uD,z {sOռO$ v:eݲ{J/0c<(u$~Vf;Wmu:"c %9疂QtՎe[m^mk'?sK9=&-5 %MGk#qSE֚4_)0klI أE2? dՒ\E ܼlgf3+q#_WIm Rak^_UƋmX\"$,m] G6Fi$$J`[H?iea|c+2 ܄ڕ2 fhϱ>⡔o > 1W.dIX%qaӝpvKΛ4WB.$@ W8W}c!m:0|p=k+6A;4JI]9,w!aYx#-mfufHTHF r.g M&|뼒ʰ.Q3"8Mz®smbOpuApE■wӕkr6.b(~h6|om 8^ieyN&9ܽ_+I&OڳGmX;|Xem88ΖR3]&4EC4W;,I\m1+|5mnG躖k6.lyvnBUsW$5<uQCltVWa]?餒 ?^5mVY`<'Yڛ^(v'EUYht?.3J5dMTcv5^mBLb$9`6.V?ta>T@`-Gqomio#+LX8?Ŝ׆xR> I\:#;dE Y1ml9]|] "G 9' RvK^poTt}_ȋV j6(oPceyLkV|A eyNGpsжB4VGk4.gh iKtѤDb 8 yW5(!ԍp:eu$Db(*9]Wr[=DiP<6@Ice5$:ḽ́.jd3[xU!i<8/F 3C dȯGTݶH:9=O. kNcں^]"!e1\Օ)rFK,d1%$䞤חuZ|ݚ+GsS,^"}mq24v畂v?JBԵ=Yt=>Si Kg , 9lW>?:4^,xhKk Y8~>R\"UGZכӹ;jηŸo sVS]jVza6{LAk;C: `?ۏxsKekeqy/Vqò.QʛSşFxN1o𪠈J$U#}a_Ú֧a^xoHG(/v&HAS@PvPUz~W~{.,9-k>#+?̵?mP NF0:^>im/蓯3 xQgeET|A 279#wr1d״P4X~A nI)x3L 9pw&׍(A[OXU<\QPٯYatgZZA۾-6Rn䴲Jpp6B|{*w3g1]߉U\gqJ4}o W׾ \ڳtjY852T1 8v5NH0͟g^%VQdd r=2{9q7ɕrw~uO>׶a=աA!E rU=Ǩgb9-Tosy)903}>!O [yǘQyii#5|~ةa#X}u5J'"wz*Q+0crzں'_YjZ|We c 9 w15h$}ovwHA$XsOu_iYi>;xOQ ~i m{zÍ|=ER]*oEo[%#Ò9 ?:j  3̷:o.O !̪#Gunl*m7DhDp>LǡN5[5A.F,FnBݟ@q[y #HhA+q>_ږ[fOJ/L^\XɊ>E69%k⻸1ZF0pepGZ jv~j; [u1f%bq :.)/O|>s:RO2H=V21o2-W↉or_"\ҭ{6N;˂ iK#Y\}y 󅰱{穁'jYOMŚεcW4{ $߉o魚 i I  TE!HId f|Uk|Qnqk4dBPF3y'ۄU/?~*\nuZ ŶZ<_6O{tDVS{a(06w|vYuagO}}rZHr2 `r>ziv%r<?$n]9O۶<Ŝ ;HmOgxݙm>Dq<;A;QN.OwYM;U?|xZHV^O0[yB!6QSE4TW$ـ=j<>+3X2@䪮ڀL'#G77/C-rmrQz/*KYY+s9233ijkZJ$ioHueS2mi?i-7]>iϫuEw.6@ )Xy<?tּGEux].;pHyoB|MHptwV浺Ոx݀A\+x -_L_kf#rJds򞀒ƺ|E",F 1k$p -z*? OJ|/Y2]bW@LHXx'M{N%YolO;{HAW2OI4K`7>du~5ң{&LGk1A'|c%hѩ=m~>~FzX5߆xѭCIB%Ҭ!hud וTm[cWS֤|a$ SQ;ûb?i4r8)6{ d'Q$~lou;tp9HT_*L:iѣ]?F2#bk)F^[C|6Vm_⾷5iZ WimcQItN=r/Dqk:=.ܞc^FAϩźÚ$Mkgk)"dlmF=C5bE{G+|+n|co[öVӷCtÒG88rn^Wwu5gr}{{Twj7R\\?+N0 ivKc%MyCZֺmA'x7y6p:lX7ˍSjPEPEPEPEPEP^;3Z{[Q:T<%EFsЅ)ŷ5vƜk aA"7 tz]y,%vRA峅HPaMur4&` jpOXtO-6#}Lsdq:Ww*[->[0Dl\\㺚-;Ю#<q0VэADQF-ۻ"[],3L^8s}=cK^4|˝saXOԵdǫ:]GM#sj:W[u7+IHOymW[Hc5IHDVs\J#HꈥOw6{o, pG@9h1;B;~~v/qZ}ՌʹѲʅHe922=Wv7?\çk~SXwC;`#i+u%NsV|AF>.ggb"oO~=#22RE>l qHd`K#z1^ J) TFM>1$rhgR <{KC $Ed8nY<HyPަI܈cb0H"t'Muu13I^kbV{6A17G~L!H9 dž~jo5Yc3;گ;R^ϟ545;N[)SoY'%  R 9!{K%ةiblɌzAY?i:V*eEj@f0s洢W$̢Vhb{wpyOSR.OVȾ X^d"yQː. 8n쌧q " k`2GV|lĂI6731~Nڨz{Ť"W6,n%8KeGNՑsZiD$1ij7^pM,!)mJx褽q[[Im^VP0'b^QU;l=Ա_m Z_/l<=̡ ׌^{⼇-.^PfH֖+ yXIǾ+w; Cs-ڔεrfF@28Fėڧ}2? Fdk&X͈x׋y[l:t^9u;E[XDc?rMu:ak(+_%ġ1p$•߆>ZLOuc1J3NQv$Ys?,5c R_sf{\0#;`#W+ !6^.h]لڷ*1o%?FKMeQ+ 5;&|=gwiC w?ႏ6BP61jxifl kh0pUPT@v*JE\G\c>ҩtȌyRkK7MDȽ=O+"I$GnY䟩:^>?k׼5%ޥŌ:I@v2c[9Vb>]jw:N1]<%UKGe/O8 o5FiY2Cn>Wu,p lr^\Fwa G}3,h!I-uP|UcqӂG8 wcV97;v/Zi_J>rn:GT;-=ռ]AmFyg!*ݶsQA/u:[]CA6];;c1wGp9{kk[l0؆_GPʒODcF7jO>!Ix<5kw^!8td%W:[q˼aWlʺPOh=|Sj9jZ VC43,,mpFv@yk&YT. `O9_:IYS﹗cq3D-\?'p}ݶPǰ-IjdZމ)?0Ivs#$sohf{yRXk5*/tT-4cet1e=~ ~=h-򡉮Kͣh  󃑑^_i(𵖛U.Tn-+8Tcgj#o4Kc-{xi#AnǶ+q(}ڷ_X)5JVe}w{ӮMWLrKqna\zl2ӭ&Zs^*芺uIl.˞O/RByߴ%kGX^2wk".>|YÙ|H^DH9m댞F^UʟG}~w/Sxv6|iSɬx84VRHdufXa9s=~-?Lk3 !8LY,x@QȯwS_7sk- e. 7?|ytxPҼKxXX }†;%X;HuGHTC f*nN4O=Ws3\ AO/y4egu0ݐ2ҟ~q5yָ 18;cN3ۓI$jTiz4Źn]Y_ptȍڸ&q2o V%c@:tҽ/|;gT9Dڜs_ |=omCZb2:s2wD58nڼ3u+/uXu]2*ד|1bcCQ&pj:$Q]ɳBJW ŭ>ԃZVh !`J1'sK7ʲ CFц9;zV -) &j ooqw `BDo n.6 Yp@%ƉJ$tXmjWnFw(VM]1Eo!Ey7zGEUvnV\^|2Ŏs;qb\t9pLyIdt]ߛqezx֡M]VmW0 "Ȳ ~VRUl`ֿb𗄬@> UMdojkwn`4ul$d3rc' Ѻ&l8tTaa@Q2Q_ܜ}2Ggs$UjZ骤ćz]OQD?5jdyI'?wFazbPD>_xrV .O\]9ǁG!$:KVy)el%K1ݧuH'nEݒ~@ Zy3(VFF(ˏ 5{cPIqs-lD{`JӶCei]> ]sie#ۆ_Ƶ> H)$bhEPK$MAU~К$34*,*xcߌ9C CM6`dEXm>] sq3 U'ƍ/R^_rz; bkOtgxQ@uբ(b⪚ZkhpVw7Qɪ4iƖpp#l`0tV_VX/mԮ.$`dCH٘a$@>+Qcs6>ymhIQbTfXnWRQʗ38zx{+>Rᶇmŏ~.tYb"s]tk858gEB g摜?Ry"]iTZ=D,w8T'7nnpUQOOo3ϣh:vmi,b%_&vq]xq`KX=Ɉd,jD9cqN~^Xih? KZX4]H uR r8z)JЦ |5t(,5A!B!VtR8bzYP&Pͬ(t 4Mu4B|I'a;z;SR=tGiU2#0/ci0p3aRP}Z΋:ޯ)x=6YNپifp [I|]} Pqur\yp `.y95!4&d>SzRZnHꞌ݇ӹ{ سNI=M}OIR\8^{+-BQEQ@Q@Q@Q@Q@Q@Q@Q@P,3Ҁ=d Am lG !>>sZL[r9 =_Ox b!s~G3g^'q=ɬ6skw"مYMt䝠~ChwHev‚k:`} ⱟXf N}kHMт$sl2ɱ'rk`;?sZ(X0 8Qu"R 6e6W1y\C%zU} *?3(~}x#+AZd#>n͹=FEB8BKw+\+gsnO=kf&#5('S/LzB[-ÖKr5}^h PDvI7w .^,vWR3"c#pA1]&NT^:ܑ~lBh"oSr ⸮o:xZW;0j2E7.kw]I#9m}6>--rx+(VI/Ȁ6< "!>Ok1ʹQ=GumsOӟRmጾ|4|[9$xq^/4Aek:6_fP]2 WT08VSJN,%"(fQg5sN៍CZ[[H+4O3K8T;(HJru_bcCNie2ֶc6 N-vInΞb-%RY6p zV^>#蚕re\L;uYbNGnƯ<0 >&$,[+{O0~HXX+0V93h,!Ē5Yc'ڕU6qY[wS1 Fy>#p p:x܏Jv#6, '*y% zu_}!i5ԁw(Z5 }БcUtױnu ImbiK`d,c8#[/l$o_i`H`O',:7hyB+O'q^;kfeEbB7,[k0CYGAk3jztߜ`a|AE%e4~95f'ҤFg&kZ'?N+J.$Bd]BN#Gi7^Q(؀A4pTڣHyا'}veuKy"w-)< q5Q$$TgzG;_|MgЧjrKsnL9 1rEVjGf̚7u|ҵ_ \xL5еlY2rhtm;0|nm4 (wX2q^hqs:!w6e~w~[_ (&xC?5Yj H)=Ӧ=Mw|qiYl. %dCzw<[/|Uݝ?Sѯ"6 Ŝ`pNxЏi>4?|-?0lq&O-|{'OKxO~1\'kJ[.-ωi?>2wK?a=.\p@.Iƾ<) \~ ڧ?^Gg=I3_aRhGU_#+e؏]Vk( 3wl@\0+@Vj0ݏ&b=JtNݖDGq/fIg|֐JM碿Nx"wDnƑXL@eZ~*|@U/3Im(O~?8;۝&́3+ M]:ů 8j|bΉywe 7,KG#$,ֱgeDRxDnC\SiI34X]HUOrI Ζicπ^%*5lm~lYǾ&.Ig<;ֳ?kTWV i!'ᶋ0<2&c˹&8O-s53"/1|#+$q%V xĚA}ϩGed4ۛU4W JI(<.I$Ӽ?շE}[VIqo] y ӁYw^Ptks ܯ=,o#M7LөZڞhe-$ ͙mYU3)`[{;Q5VmVkOhcH~/ݾ*]JgIe Mۆy W-Ux=*U\l|kJOVmYTʃ/nv&;.k{knMu'LiY@ :uMu$|pO^w.94 1( zO?n?^Jf`ZIA ?3WHDڑү-u_ǔsyV&FfO&OZVA]dkqˬ͗taF*T.Ir:W'RG̱yry}OHV7]u2±C,Bz䱱A#%ree\=`|?WڬhA|1OLc nk!(\) sb=0zj/]KkbA.yoiM=˪ \r: 5ɾ2Bsrzա6R5XܝV9Aq )Ub_վ]> /'>SSu afQD?:Wz> <&K 5pc6kbk`m q"q=荖"K~rO8~"x>7!U?gk1ڶ~W2.0p0nnq^>hGȟxgR;s8 {yҦڻ[VZ/f nK^k+E}WlHʞ:zTR[yo_@ R8#V|4fSu+x/3BeI&c$oV'4hWiƗrvP4r!?#SxJMS2mlKv9)/TwOk? irj7n4MwJZHIv#goY?t-:OOu+K{34i#* qzq_Gx W_^w:F_]0K>x8Odyy$b9,$Ԛ '>mn}qE,!C5i}ײd6(X((((((((()p.m9 '>@+G^Oi <9'9B&{yX0>YZ͕ eF1I2=G K7zVfַ>Hɏdγ T#7_73A+3D;eU<1JvG}?4]|}Ko9{YHXcnēmpxl^+Ičk8&2ã Q kvZg{|+u1i<v^=`1}/ ȺV۷Q]}#R2|uH<Oիiвʹ i 0n:frq&/M-2, K_xϷ\kKF,řI<]48/ME֡ RJ%Kd{Q(ǩ)JN/lFN<|l.k߇2ok!is y{Ix!áVSo3k]IsvרYcv]$UX|*TO_B$>;} -GQjy]6iZ(bfR >cpbw\7Wt49p`2I >uTT yc#fPMmRD'58o++fPVtITFRvJ ¹\ד4'.|G ︲XV8 xSs#Dyrc?'<ol"'EWòϿqwX 9:H !|7bw_GN;v n?L[^As ϊA rp˘ xΛ6i,ӈhYUP?u>֋o|"~,2~j,73d9bP9RѠ?čW~)MPS=<78I#jim{ -//*KIH-,ϒ{=2ByeBFwgz{z ̖WPBBJyjޭ6]^7yq!U w ߵSw)+X[-˺JF \#ҢKrnS؃Uy_gۿlsy'ޮGq[u(ܫsP=3A@9\a˹YCn0KpMJ[D$xV-`8H<I Fp9U@VV 2!x2j&7 !F׿$}FUHQS0kԷUG 6X?9ݏc]hd*y0}b #^WmF&>~kBQ~+i4ZbL_Qvp$ ['-5D^9>妯01i *0;b 9$7iĒCINIrV9S|6;r2+_e_ mk>%EhWX]xUR(P`7,6kϬ7Z[sXŭjHy׶7 4 /-]fKXgV~X) ^;>&:&ӴuCxJF e,U-© (@Ώ.J3xcnUma&VRS&Xӑk/ +N׾!k׍]-e[Osit6<]rI;rAx7ijfti.r> t &*FA#S߆9gZ%\J,-#<5폭iyN5wj):KHψgm7ޑSХ^䓊Tof4F2%h=VR_4(ToP"Rj-8]BM t g``MIu E}>v=jc<% mFὍ|NR:_nVO>Zs8|];|]]qsѥ[1ZUSU%cʞ'(j޶8,|+/*PUJkfdzn7^j([QO&_~ մ]+CZѤtʪ V;>cVY~p7+}Yxt/Dnk=yƑ= tiStS$gdcA?+uG-CSІ>#tټSyPN?? W5*AKcspbƵI%)TqKj\N_ns7x&NRiAT3vm%˵yQ^QQ@Q@Q@Q@Q@^5y{$nM:Ɠb@hY?J؋&}(~[!}O4$p[RgvX. uzj5?>"kT[4Abܬ]V3 {rMm#SOz`Kuķ3뺄pJcVrII~`GxƚWU2;H.Y "p YVaõMBMZry8N=ϩ'ܚ-̳H]fsTܐŇ Ijxv=F|>p'?BF+@{ym̬7yGsQ[sKaO1XT0TUkMR=~u:W-F(/Ԁ)-H(Ǹ4S}D6$pT p9ϽgKtn%dTu"C#Ȏ7\+)sK]Ioj8b%)+ג{i$rYkLk42-kP6$A" cgK^VFu]e,q嘕W)<:5[Hݐʹ;:,l$Kxᱧ䮕T|Nzg>B}#Mo{|q 8G¼ѓoз;> -*Q{gm2Bm$;䍝dx<_LxZ1GGS $)lPL<5w?Mu{.%UVQhW>f F-ABEZI漬wDd-i> վ*|A,ZXW(2o =|\w—tݴӢxw[T[AIz 欼K?g옣[W'L_4e) rye2F:y&9c"e麱Irh"k`Gː>j* G 28=psJ^2 ( 7nsA5{o/Hk jvsqhPuat?Jޜ=*ѺNpUJ3*++FI.R^yqaIb(+mj~) iou2xL«;IU'Ta{e{pZep0Q%~u'VMۖVIpج*xqU1N5MpHRR$YE$b֒S]|H7#FМZkݥ٢(?)tޗ$Ӽye1\N xDN\QMɶcv_sT+F3檛δgo>s lmΊ# i >=@hvl+G|mQ@kxQX($kOX:墑{Ԑ@t&KXnx7 PA]iG$97#v,0`Lߪԑc _&EH :g V23G91t? &a],#2(|tI=23ڰ ʘ~TGIkkT;c̋67X]ՆN3qҨg@_,O#bs|yR ^ \=Z[tY^I-[]Y ݇y͒^/li[!+,q:6qÑ*'*#&_N|NѮt]$F,K8R uڀUF9#럍2>|2~zh,&#nFP#2e˞8ZzoOҜtg>6[Iԯk)Uw*n ,pƉ`A]KRF,,DIH\2BĥxG'5<+:Yx_-tGU՞M&4@څ$Us -K"qvd;@9)5+]5 >ۣJ*̤ pM\~5_>82 (n/A+$8%N@T$8FZjvjkkxK?ټK ٯe$pd2vezyO/AoGm#Z!waeaF #]HÖ37:mԞ"ޅj׶km{:n)k *, \pE찲"Vp[-QÕQ@mE"2K1@L(Pn4oy?Wy+Rp[D?խH:|_dҠ9XJx2lUU q^x *%=W}Efة?q98+&YiGbijܚiӍ((CdbnmQZQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_oI&h|W4@@:8ԌwWjW:=7n"mGpk-F2EclЩc= :فB{ybu,><BK( yzzƒF+Ѝ@G=.ռ;^5+82d ?L .cw2GekdWAg⦵OVM^"1SA\t7 y`Wǹ8 d|A08jЬn4R1[ڻ`4f#?ϵro6r,~iebK9/|qqdVhkxx #4T[(FXFbQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@>d9pEPMėzdrJp;{HdpQ;A8R{k$W.@f *$`mkXht6ʎx=OZ( ( ( ( ( ( ( ( ( ( ( ( QEMgoZCU=MQPfotocx/images/refine.png0000664000175000017500000000674315247006660014265 0ustar micomicoPNG  IHDR>a,iTXtXML:com.adobe.xmp 1 2 3 0 0 256 256 1 jS2eXIfMM*JR(iZHH02320100fotocx-25.1: Paint Transp|fotocx-25.1: paste area|fotocx-25.1: paste area|fotocx-25.1: paste area|fotocx-25.1: Paint Image|fotocx-25.1: paste area|fotocx-25.1: paste area|fotocx-25.1: paste area|fotocx-25.1: Markup Box|fotocx-25.1: Paint Image|fotocx-25.1: paste area|fotocx-25.1: paste area|fotocx-25.1: Paint Transp|fotocx-25.1: Rescale: width:256 height:256|fotocx-25.1: Rescale: width:128 height:128|I4IDATxoLS׿P]`%#t5Qg$Y[oEM.e3˜0[t͸H&j .15s PƟ;(<-mILs~yا>>WYYYihY}}}Y\p,2Kg׺&LUUh4k93%8xQ+cm~Sؿ;JKK7F.g9(Tb~.Ǭfٞ>}:o:NJ\%&eS/?~<ή@8Ο?3Onล3MAu CV"z,.z޽mlllz?u$كG+%(f%VȾ}ֿ&8wRUeR)N\zם?n >8պrٽ{@UUĉ?tСdRq KҞ"Nv9SSS*m 1w:mM9.rؘѣ?biYYنt 2@={vccxZZZVTT4hRD{LƲ"wm$/3//`0 |(cDK|/,,4ܹ m`pǪwxx`Wsr%<iӷEQJTƈwXĞǏ%^whnnnO $h42xf4pssvxY2 ɲ úox7 ԅ#hdW\]Mc`QXUU,S(JYilll%V;lnnn9rHMVLҲLuIEc]r$IbZR2 $I/ $Iͧқ\ܶ( c=:::øheXrX1o4o~p֭\њwnǎ5ڶEy!-@`BUU\ o-#j4Y#l[PV~`yf AŴ{Zּt 6lPxƍkkݎHr>2_$vbb" òPhLzEQQ?kEtuu=p@k2e߼yC ]QVb6)?=877l@( ]|FaͶm\hٹsʲ,~9??eY_z%LtqM9y$noN&C2 -+I|:-1EDeOd2}JD `0gqԩcǎ}n&uckFȲL8#Ųhq ,p˗/u.HŌtX⭏qgϞ=sΝ?;'Od6AX-痏r~o2Č(++۲u?nٲɓu466~e'YbVkMۓ)(rvXѣ笩M֛$LʁУ;ܾ}.koop8%KXm9L2+C0 ҥKx_XLEfsT[)_#"ɞ={ plzo޼]v5NLLо}:8q,w=g?x<7B;\qY[lB!oDvcHD%KlDD*Y>?p8`=?kl8[jIENDB`fotocx/images/pattern1.png0000664000175000017500000014777315247006660014564 0ustar micomicoPNG  IHDRzmtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 236 429 1 0 tH:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:429 height:236|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:385 height:212|b" IDATxT>|w',T;UE0;@0qEF;PqZ߽FqF6> nhh@ee%***?9ρ/|0z>8A?dRixbsBF`!LOO,>>ffqX\}>c>hbf |W'.:~iIcya(+ _=-pŒ21{s#@y.8-Sݴ}??VyA&e|^4z )ECD p!h)CJVFA5/gpih+/1jiUyB@ '3XBANJ 2Ե0jN|HϟEtsctѣzPZ^Zx<#<*yEok 2Ǵyau ip6-ފKxsa$$e1d$UT#=)L =]WL5Pָ#ֶ"r|fļ5q!{x2f$o?b"53ՎQVZn\X?yMbv㣨r}ˏ? ({$C~43lMw&̚5\oiiiL87}l9::"֞C[[mfP6 Іu6M!}5{0i81ҫj6MЫOѣ;z qiO^иf.A^Xm3Gݺ}ai%\*@J5D԰Ue {tڮA MX:wT "/, IyU,~^|nǸa$'qQaSwCOA+El/V΀<,ucH'>'nFNGW㛯B}h^*ܜaI1QHKATT b8t,]z$ػJ\ ozS__{ls*b脥G yݩ{MxTU#q4R GXzꅯw#9BMM BBBń{[Xœ۶ J@NU WmEXB*' faPvz;S#!=>")FWTIlzme͌ø$ڢ6Z#`p=zΛapz䧄a۲ld9sbqUS8&-sBiM5rH BVYL#h ̊V'qC(&mBL%~p BUfYP=B:EiE ,"Sfc츱PЅ˭i4 ,'MF'"5Q\Q;眠'Q:T44"z#cU"~pYyQ~ LtU _FJo7$!*"bŘeEDSNwA@P?F/ٍIe(-GMvL3-c۬a㡧Lu(|r3y&&XYx0ܢ<[@@ZVF[jt :gL옪G; Wܩc ѷ$=?3"9#`Ӧ-,wf`ymWWY;31c&L۷#**><|A F ", ===.0qq [7ӏ3kA+GazY!ʔuH!b}&#;$"~* kkyFi@Yb941y^Ԡ1LMrjX"cJ*BLNNr u&GǭA0~"0w>G#"Y") } 9a7b dT'uϞ0p'q 2a2̦xGMUN0Y ⠒aԟ:h"cHKIl|ٶ+a Dĥ1vfTU 1:ZZfزd?PUH(+lUM5D&&!0@$4_NVЃ6W%$",<u5I5ӄ<ѩH 3qR HU)2Rq=D2Q/5E!1 9y󻀅 JR0HnQj!F,`\gI#}UYX[[;I3g0PGvS͟/ D1|<邽NpsٌMW"jI{7ƒ ۯI&PQQ)^+WB8vvpOBqϢrd{b6TT5`h8@G&sX&4T*hHKBxDSȵ8ʎ@@HDQQ߀jTc%b< #gDBXH\}o±8"x%H}%q1(CwHՑkg Ez S tTC K*}}}.PIWPV`,*w;6%$ƫtzezRUQ IλY$].#uWae5m ;˗c2kL5*rU5C`F 29/$iv!fˁLFPIjlIds>I3#ճıOQ`F;v`ј?>Əs6Qy@@@ݘ\0lBmy-N#OW5օ4> Z `6I 2vBs*R'P,2N  pC]c#N44G-;@Qeg(-K"!6eXaah s'iLqTFT@ 4յUHq  3iOY2/@>g}w`HbǞ8BI!U]7hrxD_#Px5` r}¼8uH 뎬Z '0UrMURἓ80bBf_#߀@\Y[﮶ `jGaDH67fn|\ɠ383t:loOԙMi&NeTCʜd}&3 3uP1t}ako"젥 e=[g@8vo,c#8j㌰t8z9NűdhmAnB` X2ےFJ_Ov(LUd MS)GUXkw) ߗNQYA{$8fMnqO.C8r-!O*XPr q'bb\ q' K z+kqX-8؆wCQ[W I%% ]# q>ǡ} ?/ۀAѨ"NUQ"[i]E  wEhmD?G`kCbܞ7#B;:G0\4; ]z[{ώt ؓ*fuaض̫ =9S(p.bb!UF/EK̀*F.6P/( #F􅊞 "KI5P[ %IR|~|cO쾈0WbXJp|,Oz] vjdӡ[2CAAcV '[lpnݰԅ!*!u郛*+NDɘ)JD\ JڃIhli2Rf%@>T@:(U mk|[kwd'cָ$ )RXGqyl=p՝e!džc$wd_~Yٸ0oPk"0#Ɠ^#B=`Nѕs-o:cmW+Q`{f0:X端1lPM7P'/YEM1y%ߜ\W'`$Kp'Txd$Gc?;mڇ@W^VXt>&Z-0fdbߴHL'}ݸyovϖvhj>,@m2M`A|JF6՟]MvF[36[zO>-msgP<|! ꯈmKbĩر G;`XRq'P Wԟ/8ZFAWΜcY8wtG@(ex< q9B|oPTT?.`:xwAs68@vhyƎE3]c7;zaT z {vvvG8:Gpm~80Ȉ,#(38o~g,,eer[f;}?6Hfx'|'cjeo~ ߾RnK߾6 ?x \9ϛ< s?x |q}c~ s9/_ΘbL~s_`te#Wv,>?9FSR'M?sy&s~LΏw~x@~s<x~[nsg>Q(KXE,|d4u)բT-+)j \˶3Aw=y 9~ yJDܿ{sau% @%]1=]W VW!:" !P_?ǯ/^|ŋ_PUY@N>|){+LOE㇨(/ųO8"؀/"]{DamA+qS|A$Sz|t1QHF#46~ĿC/>EBUx _Ϡ`$''h K ԶB0zA:3X|=H$F/5CA(!$$ E5m}YEe"K[ĉ [)x+~V\0vnڀQU׵ W>n6P *,1LvAfiMz8JڸVs$WH0S$$4 %ӞիNW}u) qYia7@G^: Olڼ ©#X<FnE%XG_Ǥ h̫Wvh'd3c'ZaH='=:r6- ԂO@CCX0?ꏅ;p]> pP5y\'VU`5k@QM1Sne!=%f0$&fmt\X:4 ^wb89_hs<nEan&b"F!!)7}T"5!I HMKHdQHJOBnAhFc,fCy-73<u%HKAZv` peDŃ7P[kkwyzfNvV$ϛOK'P&$ 9% ~QVD$3>>qq(,n]M54ni-@yH$!>!3Os5!/#h|x gRy9jxVKHua$$&ϟ ?'ɉ>.q 8e,G{^n~!^9C IDAT+OT?}֚W/uau,BUQ9!js69j*$' 1%YӑUX/ގVBg1`X(\"8Ɲ6g]_Gk'!1i#>1ړ$NhH0B(DE ˛5..9)N!HNKC mXk Ht4hhũEIa6ѱpSA=Kn΃Sd%M  Da?ZS7"& 3&&t Cq-j/(VA?օ0xţE)SY3UQXzd: 1c!5aC@T Y(/΀ӺP.!C}SK fB^V J*PTZC%-^άW]0LK cVDzR iyVf`a{IhͽWY%("+unqM{Z ?})%KsHha/ꅣ3BvE~:jn1E!P:*s|ߣ/&.߉GQˊǎ3 **^P%{3@s|8vƑ#g_G70@7Ffrڃ@Cnc64-x$qvXcT[dV֠$ f% h1ؠ2(564mHnl38ޒ:;@u\'L~#`mc9gb(SW_ZƁ1;S( gF-ј'xژs ߤ nAcC-"0D-dr8T/4@6`DOQ~&rX|JF)L]!ɨ!U4P]uIa ٤Ze) gaE.ȆQOs}vKQ}zQӱnzد^;vcTV!6ց6/[ >{Nx*,ݻ#p0~ FbXu*X{ӏ=5 1<.,lnݺa(TdEcnjh랴ch!޿JÈc`Т\䐎]]MNH % VXpas$s-SEzp]}v/%JWHO ͔$6*r֬[ 5C09B^ =e#J?IУ|H:Ȁ|o!?)~0bJ16ni-$t0f4^ Kk'x|'D!A,06IxY 98$q_4pqz~\\1k! 5MOZ3L|| ÔU1>ܿt !$PO:znEpEII1ݲk.EASH%jl@]Y&1($edqy#3W"8&W[iwŕc롡KacTly>Uad6Sg7+(55)ͺ~2h#ZɅdQOv? zaXѵNc\{cL!hχd-DMu!o@OY [@G\+}68V2ZX - 1q=znG?J @-1oӼ$r)!F-D4(#]6Ki҂o`<:7Txf?GY֧^]}v~!vl(<K _5eGS_]Y!Wm@`0w꘱6?#5r[XطX]DHb<Y\ĶN:t P+ ax95!ի',_:zx :RX 8;ibՃ zـ[C@G!M |Ϳ1j&b8hf+A۷0$t?5FM;JqeT/=^w:vX싎lx56e&GbGASR+B% \זͫOIn͹e*ƚ<\ y O,ֶ>]@(HĈ. u9Sz@{גu|V˞?yӼi}]%)}w/< H¨8K*tFx $s<tMw=0r8%I 1zXOClOyAVO1b>F=Xm7 $-^R> #bHNj/8n}:s< 9m;JV`E}ρgOvz 22S,EoHFG}!:SbLۑw}0<| ٤w>C:-ݧQ3@xxNЉŧ?9xTT'/_?sxAρ/+:c(xs8e2-9dCs2jW_ֻ/r3qEJ,Ksqf9YtD4>AXpBPR37"8} oembIzAݹ{QsWY%$ //vԪ*+8(41Ie<18<Ox|PHc2#_ߚb}`ٰ& _ș:{7/Ap?2oی΃ aA翓 e{^B\n]HyH& *<+ҍT$%&L!BZFwס+hDNN6wFvv6rbR4>}W(+Evv. je˭Yĺ)zWwKs9aΔ8 [.)Wϝ;ʕ+ EU,2:;BQxk\W }3fźM[g6Z=Eq|W7~RvY)AX=~΄uozM_: x^B#`?s8DkQ@W@eQ .}b] qX|1L+w =ޟ8'u`ƙΏmI@=M]oa Dj F: P8v ϟ1q({9Jj,MW!5ѐȩ`w}]mBN6Rُ/6]p!*I8w-c^o6?? )t4@>&u1Q5@S#}|q~8E.DV~aklE\s-NWvy993H"uJi^κ.s9!Qշm_߮@7U-WMAfpv#}CY'f;1jR__Lկ8b4z|&41m/<;qNȊUȯg>kӧHPNsj\0N=4wًHkkvjtx=Fkw_RX_NPix' IDATS xh\p,hΔ&!n< pi㲂T\:+ͷCG#.n lQr06/ݻc&î'];~7߄iDw%8⊐245 ..\_lZo/VEnzO2@&J\o!1~8T*coOqFu`^6P~ ~9@]/ ?(m;vӵ{ť*/Db-w+(&Ã@>K>`T>.\n^0T2 09 C uM{ST '_H=H*rq t(&EAi9'X3AH1~LĨFz| KP@ +tq"3Z纂pln~Ƹܥ8 :аZ83YG[A]v}} ab_Yc )Aar E Oߦm~ И{ld*]jlម4jd1l0U1kfd~ڄh07ҁ2ZPTŠPFvƺ*,T%5͝c1bddhvl;CL1f9Thè$հX? {kj*ݼay{ᓦ`Ű[s[ѯ0l?ֆB=?v3J kt{cԼeHSh3b6Hv,Fv= XβCHj6'F;[R'ݭl Yy D4ZhJ zBjY#/y^X<{F?:jnљy$߲x"|[ٸ n?ܪSZ:0 fƺVĎPC%uw~ &2 G3k,R~`ۈCx}N qY5\ BCSVX@PBA xCLF #D㸝z bBhe#l\8@~>Odd?CLDQ@ gÄqc0z`ƃkhC}}U@ .0F}ځ@S>.O{r"[Z@OGfBC̛ PMzK"Oq]UYEF T!гUX9 q Q4QA8}44p.$Ű1 ~q c@TV^<4ae!I,wEa, HazWx= DB|Z 118='bbuQdpYgL [#ȫA-P[R.%%%Hh})hXZƒ ?,sTa8v:"73 uZf;[o\mj{^g 3I EF!(ƽk %U05T~ȘXr~IÅ㛡swi\|u HOFqϓ"}0Df#$&#*.v0C5>=2  2B0T:pUum0a6 %413CM R #gG&N5g)c026c0h3u>sd 0MϞsCT'EbF} 0uV{,Y,M +. #+{$/+0jӳhHS(oFԧʰ;bHĐI6(kZx쀪PS]KMl8sk_u n] y Oݶl9~XՉO:X hD78y<̬"Q -R9eQՓŜ=5'Jqgib=RkU%ĞoڒW'r'XW[;ÏhvNS_WCꛎD% `anSTգG/ p b +$PElL`&bv S$G7: C wO˳biז"".fè>&06GO!_'~+Ib/*yr*6Z0):zÕ@ג@O[kwA8% WXKHB+X }{v5!6x51W0@s]}Q{ oũ򀹞" `9nk2W4C NDADMokQ L !iey ~Xpkad4ԒwDQfl5Y{_~enMذh{@Um[}m+"$g1EEDD$ b9 &PhLH Q@rZWYAƦ-(:U^{͕G PQ͔U#32u1DOs>| ID- t1쬴x:1n"%F/PVUeŘ1A0aRwO~/n+1v`, *5DRpy{1,?3qFEC9V̏8HO*-Ֆ# O qGx@{(y<[uy.n__ApRPTR 4~ X1|kiݣ6OfϠ_i!&$lPݢywŤRpR:1Fy4 dYpr#F1߷ d}F5~x {L %hѺ(?ItU/?g^ ?={@:wr;^ _"0k,΋BLa>on XgAr?Br 2q}&_R[!;n>"(\T~1j =CzzE&%L1[6} D~ 4QS, "b%ˣ B-ɪQW\* ]!&*sa+ļ W:ɣ mCt.|Pt6'+c}t!`W% b $zb?(3B3c Dl_z~75 C!D 5c٘cdiq)HNo\#!sذaahR@o21g6$%%oVWSY13U 3t$|-L;lP8KIfO r(tXBXD Xq&,ZX2)vHANs*v݇G]{0 X[a<ܺx*M/8]GnKXcC=% T5dQJFiUG̈́,AZUe?a?g=>h϶pK9=-#𢰈Q'9T7Y @{D?JY(Ku)hL ׋6ջW/,bTaQPDo0\Ih!*Jybx 1ޘ;db۴J *w5PWVϢ%˰|b bة|?t.Gmew iT hOI"###̙3Ff6lw̷^4Z ļSYBӹ&`xF ْbj`kzΦ=G@+'`r5bh Ǝ#{ƒEr,V-1cfBTuZg k32B7ÆIjY(TP]Ies6pa4L*k[<,2_fVp" *?Q}Dnhl۸ 49";>클켖qdJYns^`j[hMvf,kH=KsyMe P"=j8+;"u]> kx $= N_Ҧ.̈Ł1o^c[͟Tz \>}4ƌ,[ t$aE8u6ҍ sV6+Rcp'ʳ>c^(}Ps0AYw%d͛&&* Z3Ka7,^dZkni` v>2c%pv? {#aŖfnJb,,i΃ݲU8~d;,($ϩ<ӫNl:QUX5d3Y.q +pv8ζ==nL϶ -|n_Šv4.vY-3C"v3h+@YQ|c,zNRZAlfkѧ}H5[KEk3exÀZKrdžLd|~>;301ELygC=U6SCeo?}TQGre=o5môm*)ͶMk7dIKi/6j_gfA EzZCh{8{돎y~nf2AYRޅK )]E;w|b"Ӎ~:so%<#DA>Y޾+r> GM3 MBǁ@Ѽ@nRvaR&S#oJ(Z-=CXё2>{@80;e$Ʊ[Hp` Ņyx 뗉38("s+St\rsER3N1wA1x_ZRА` .{)ùUVsr ?csoe ʩ]!/ E]K6q_W[C|dnQY!سFL1_mZi{Dz c|ad1y~l= uӲzڢcD:NrҞa*3 @o>ӧT4qDf;"C?}߇30V^~OhqWͲl_R'DsmFx}nXZk ҧ,6lEVŗ3.' ?0<ܿpJb}pXm|x fИs:;/9V#BBPPWwו-%R{?/{TG9m$eZu9ԃH{DЇxir}oN&/;$4a!`*$z]f/񀫇.-ށh"f>ό de^)5DCtjY^( G1Us8s qGviK__L3pZ J|fp* \;:4M!$*Vsގ$’ަZǭ8~0-_9Pdl; R0$σ㶝tA1ƠзA6QvԆEq 痴î½!ڗVw]v_=yJ4yt(Ԥ=,۟-H|(~#*LCqW\ <.^ARVa8#8>;^W``*cwTtVebdykswX)]:FuQ0IC'(Wi&-WsDgN2 5PHes "$[vÉdqY-TFcǒ防brs5W+_^F11}"cQY>+b> V W|կ3V/J,Ȍ7>عn1&Oo!ʰX EH z&gl ۥKac"q~2(I¨qXl,-rǗ 7>.ed5IǍ*lfSyXc0BB51|-_ZA_1ao Ӊ<;ý *kx)q~mNؾz. v2˅( E4fDL[z@32|1o$1YolL9 x$!0Ps v?"fb:DC4upۏ?~ k1@T=ؼy3wSuI#".ĭ=`N {,2?<;nQֵSy7ٺ /(3@b`ɓAYYsm y)Au_\{ki~N %yԩ=i2)O)*V\*#oUi[h<57PK^qӇX2w"@,!:F*/06鑺[6cǮ="Yع$p'̀uq1ղ=jRPiiVv:g(%mh=}JSl!&D.@< @VN^$j(q>,pT;/+dr9񁰙#JDL*8Z@Tfv^Ehd"BprTRhXmm=[A D~fdHOQ%i*@d(L0v Fb3"ދ ޼9d}D`4b,̱Z (1(:Lz6W!"&tSĦvjDc"#Meȧ8ICV!mE;c$$u^4 ź&Y U?b(]2v7.#A"ifv+ ƳHܿ~ !ٍ㇈ '%&cbdta;HKX.C^^>Ic!Fh!q=ϟ3 Đ1q{Bھ}Ǩ{}88LU-`.=&MDi0&hٜjX3zFP (]L՝5%)P\j+xP3f)c! $EY11Î{rY2DLNImtO_b ;P6nEĚdOL nUmz li}XN!8_7o^ $ba0t_PRFR]X }Vui =>|0{h iUuxSq2S^ӳx_< 1`rM`,k -*[jQ6q}զfp5;-Q#3#/죐)3MHi7{ B1(ȨʅTtXR0}ȎІg`ߚnѺشcۇ˗(7l\N"_ O }H7Cvye~Edղ GH)T_+1` xBMR+"mYD@ic>t)OW5TKp{tc17xa' Ӹ?,Abl""<iq c,3GC} _w %̧E`jtsD?p hі1␒IϞN{ (׉%ŝetj@lK pVicSCO nJ 3W5P ũ6"y{ŽC50VO WCP\. H==Lf ܸRl8z']8cnķg5 "!AOcu0js;9b7o²8oZ@Y;&K`1oW;^`㊹S'lyfUY|ڣ' L u#İ}zJ*O uL[Xƛ0Ҕ,PLe"bX.('aAheۘ8ؐ ZJPƣfJڞ@ԗcd&L"P N㫗TeyqabS)"XB_aDP&w]u!<`o,=yB^*] SÝRTUCL&! i-"=[b&}Ly0Mqì22]ƚX;{$i <˜G kFY aT 4g̢Jfbm+W3a+)ʓܻ 9 -}/boz>MIbcYg}B1&/WZR.{R⒰ް*C-nbw Lannߌ}`WP>ʷ7XLiYmխYTt^(ILZYW>خbA #fMP4 ;=#:#eؽb*v؀]{JR.ҐQVǢ}VX/4!e<gVH u`-svAa7U^-f:7B{Cf=|8ShBNV߽v}:)'9NÍPv\ r`AUF̸| <'5!,6Ӵuq#s`f<G.M"=. =Y]1> Fy 9#pdZQQ=rgLŐq۔sq5Vj5--!60FLq7y˘w?Hy-CLv1eI 0?}d;fϢ"]͜y5wK7EoL,u>~KIz[M -7k)hqU Y8?CZz 2}hS;<39ǁ?'/&N[1n5TY|/eW:~wBoXBS\`LmO~=Δx~[Oˁ' 2U`sKnAb@ݳBfPx%`K –5qM[3H*[#k~xA߿#bxEgd!yEy xrn {y3\>ĤA>fT'B͜W,ϣ`: B\ޗW0Rjx؆+*uXE|)Mۖx@6;=3-cw4ޯ]}?7u4]C*ęK O`r=v+S#RiA%+ oy8D A_|-˛[QM In W Q?UM? ҘD^݇њq/#gSP_gpYh*b[(j&I I е\6_:8?̙AB}0@&"Zߑ16E$0Xh67"Zv pe!~!>2}ƌ36f3??ƒF5}VRXbɶ}H-j4oyh2"2*D5~ $߆BU{*;{qb"HO=!?r n#x y=aSԽm5t>mkx|ab3Qydb'C JAQ!/P$gSy{/5HYgO_< DaqIɴ;c`$& (}#| X\x 1z샀@$giMc'V#6<Tn?_:1;w1D? lV" > [FvυH=$UՐ%]6\ ,2VJ" cS=KJCiPV['` L},p5 3lW"8= O~ A^`Gd`բm<׭dž+`8y~L7iWB_[UyxCGPf 7V@PLΡ%.xMtV3)Vb!^MShlٱ#$ֵZok>1)bPw32ȌYB3D#Hxnww| PkBDL]oNt8o30gᖭtpy+D+J+Q -%E!PQap<apHa p6Xk,1!2Pg4?BYXͩ`a9&N5Y}X?ҚÈSf( K`ʦ˨C#k0x?2 =Fy1_zj{ t -#Uuu(J@(T= b93cp"tY~1;/j%U5S'@Y?Lw50" Xtt'kCc Dad@P؆MVqbқ I:X it'.%>/ߵQ XdgPup*Ƕ,p]c6~8 Woak:=!Y8]"RD!J*Ӡ?Rx'",%deCDn8c)dTMIaIn>% &6@X[>|.&(1HMK#O~3AJ u /\FxZ*I|9ֳȈ*FkH/DpkW IDATlOLӧ :Šq ꫓`fn\JIygAr8{>, "!mVp8u&≝Y,Q 1 G;IX~E%x"nM*l=<5R.m\yohMC/@}n)Rx^CDq*BV/ks0L 0m}p:Ce('IE=kI2`*FS?9T W׳;l> uKx"̙2lp/} q9 {fBq;.eA?e`fn eFh(?7Z=< Y)9 `(%EUx+]זѫQC>²C&1{̝5Tօ4xRep+x+} : ,un{8A]^ª:$> 6!`Ȋbp ƨ,Xt4Z?Eai?:cHu\%閭H]A}LD= X +RϬ \ߒyY_Ë%#bxdA-lbXGS, UlE?A!5Ƥo~0Bɒ23d ?l&^|X w"[@/ w|.T'aIdef"[̡$1nF/Jky ȱH'W>7U!Nò:팎XK Pn'54_X FIS#I1 XFN%M=j%AyC40gO馯] @2bj)Fa'7C﹐*I.JeZ}]5nmQX{Da :+&T&* <ĕV~m 6ulx-s~^V",$c-UMMh* Z#&=Œ*3PN:ï=pGqԎ:>zK#bLPNtF(AcT([ca8w`aal9*W?ZA%1V*pPs*h;}ov3q&$z-k$ M9)pZwh L78:I }SP"# ǑU*r\s᠆̥*7{pftIVu? L8hh<&#YN_?UEU%Fׇk+ t[ӓ├Cݯ?PMrq S#i(.(<FXz% &a S ;>aJ?i0GVJf @}0HYg{3 o~,9A7dĆ# $*/Z%D9r1g1U] -sЗݸrâP%̘V`+QCEم{SPiVډCܹsM ѿ/ nuS1sͯo([09rrNU8 2gί, T#4*:=q:))ZkVKz*LGPvȡ@7#&/q= Ӟ80<KC10CH0]I5y!?o c'OǜyKp?*JD۔hW8Ɇ*@E–!h;!i+7#*;@~d?T)=e&˘]'.Mxo}E):z0݌W~ SO,* )i ]8uӛxtJ:o0gT3c,RYxV3+ϟ>8nXaЕq~aN[hXWېHCv9(~}N﮿@E-3}6,CUadQɍז@^>-K_[NcA ?+gmǩKWC1kr CXi-ʕ)DUfM8kñ'|gXB﫚@ה]뿯1kp @2X < c/0{W%3Q䯔k{ݼKvN@;TQA>r3#/Lp?f8L+(yO8"\;)7r guq2,Yg߮uƍ 76%p Y p2 >6KN.\.]Vԧ]# ڧp TyDE}W#osqN}W%7v+^p Љ`@_uTw\,+#Nƴ y1_7^@Y:l>ˤ;;'C!g]pNdOw p'sgx(hVr]\j@248W/akSGuUR'ƕx._p'PVA^Jz5% =%#nGpOVƸ9l$ 놹F US 7DD^2^f 74tm .2:^QN;2E;r5UecW@=z Yი 1$(.5Z vε;W\8; %x\-wh r;v$2Uҹe$CDZ17PYAE2V^NrCq+'p)G_&wDv ?qf*N,+>>>V{`Ye,|4jIZ.='A$-tk>Md"޽;p>zRh$oE~Wd^K6DQ1d7.A>Dە{~  n _ J͏&quI:NC_~Dˢ,l7FviGlĉ EBRQ la׾}ضe g+9~S0S^ P0\ )5og P_[m  ?0p||߿EF#M eNLi/\)xEߏ/퇬 a1Π/}] pQbKpw>X 1tIWˈ4i,D a˽~׬#uuW,A5NO@-߈{A9/߷Lm/P6,nmU9"c?;o~u5DGo7OܻvTKer\$ܿKdT /DFXv0 lt~x! Eai³P_0d E)HJSK̜1 J@pvR@FZ+q ĞwQpv/,*GBf47-XWSAxCkcyqn2VF6?-E|+; i =vܽDTVװN}-[hzc/84٩쮩$c>'ɠK%T9-2]w|V3tIBkzf ^'`@MIـys`FKOOk/Fm}{o$ ' vI) Naٽ! *IBV}4veXo;w[{. ņ-*ްk{;MzGE)R Uɷ>w`L bufN?os T禰ev`wꎥ{OCPǫݙl0q U# :ϩB|/(ƛj1vg9z.vǍW$%H\r !dHO',8 cfB$l e 5}.sDxD89c5HXZf͂(ڃi.D8e].s ʼnpà7ehkec\ތjΜT\=u֭˱z< II%&xzۋ(*o*Y2h1Ks P v4ʐ=AXU@i:|- Q Tp"Zy1g창hzi|`vb Qq&9޴j5t5[cҲHzQÿz* DsDiy }л7LHkeVo>3Hk2߾-6v\#5K>#5PvBAE dD'W@Qg4<?k*J`=AWՕ%8z:: ZR秙3g b-(dTTW"Yģ퉓pt >P2ȦW\}Xk+_@I]:Ղ,}el HC_O[fS@yF D^rXa36ehOGPJf&[ߟݚ P)IޭЮCOkV` LF;l k>esc-(G6]_-Nf,IFᘵ RRu%:oWBU=GyLx)GBD -aXr=<'kP@ٛ*`l\b!jj3q&Xb#BR8SUNb0BHAߋpxr?p=j敖Gowv;T{mB FsOtն%p|i PQ=;|fȭZTV]llmH|m% M )V#1{'["_73Q#+<]h#"%d%R0N{ -ߌtA2v -cxљKT4`2{`S^}d'ْ&jbos{WB]EcGqX2ɩI0g1i804d57's)F)Yz0iY}͂@UeN5w:aFY#G -Ē(6$q c0`s$Cm`(r?sWº}' %%(OSDIE!%|{9ե3*?d4Jgwo'-]ƫL؅@J c+`C("FZh> }t#ڤǞ}(Cs"9iEdm'@vo߳kѽc<*:X~aRlfJA $ 0Gp4'CByYrI_Aێ^@ÒQ1rЦ D别6#-4اj fZK [;k$*k号-]JzDĈ{ UhBK?LFbИex4%@2@n.|󤼇}*$(GA=EU 1 1w>)y+Bn=k-Rӹ܊4\i! ,%Ga6X@t:a.id"9J9-O}Ae\?&? Y>ꯥXCcĦ* w@Mm@HxSSv=grlCqp@d[ =:C|($TA6(?J$U{ҝ8:Jy*éoj{Eo®9襠7M RS Xl܅D>ڑ}g@똮:+M=B! QnCX;'o>*&8 ?RD& )5ھ<(u$vŊȩ|[kJ|wQF tݵcXm>Y+|giadK!F@*Z#q-CgB;.R:JrěPcQbVA/Yk/P]ke΅w\!ICu ++Dw1ݴIsd5 cǎgNaK욭.=hǛcǑؽmDOZD1o^W Ѥpx 1f&?cL @_^ l_n]b8e};֭ZC]C\{E sf#Ric6~w^ u0B(KraM.8%C:`-\ٻedJ 2{8_ojTo!wF ीTWF᱉1|-sO-ʏI PE69T6v艰^ ̀"u5N*mnaνرe%9|CY+p >cNv4 uo #8~Y M]]Wؾգ ,AB4$ȌK$=GpD @j:MҰs47vA6zlJP NmHO|:8bK87QL9?Y[om?&.gNrեk-mkiq.iC3:"L)vي4_qFة3a E&HrD%0S&{ fNDn,6ʢ\?E$vSx!HPI3cpPw0t'!aQhͲf-LǎÏW((œэL|!/@7 K?<B(튱>DUmftTt@8y6mGLv>Wn$'vojb"N(COi"inh%xUְ6 f}.:f2fY䜒|v 1hJ`7PѴ'زf1 m`nWnED7"Om# MBy)|r?#9.ta,ҝJJ:el]2 FI-]g16] l-)Ƀ͓87l6v9բ}l5ŌBu> K6"">XPsmkQ-t}?=5+SX6st!t|E^ 1R8l^),-~{ƺPp[ iUW001mܾap:VO<OjIFW-.)$p?SͤtA󬣫i{~mHgrtV6ņCH%uePdb;>Jyz\?`i?&+?Qxt*)͞NhZl0S`RNaULy:; ; ~`̝jRtFb%0&?$ØVu{ HxQF 39d2C^Y;e,yaDu PwqI2Ӓxgh(a9Ӛ귥%eV033kL^7}PX.}C{`9u2fN y W7-fz~@dD;6ztXLE`r>Ck@Xs:;w&$| {.)d )A -S[n< ez٠7[vȼ=\}zfg.ڑͫ?!iaI944'+2ŗH?<|^iAhIz?\5A^ix'I$|{x)֧x@xixy.~1ok4O_1 O~[HR2OOJK?4O_ 0@1?4O_ 0_  *?4@['x O< |4WƏ??mxAyi+o R^i<RLE ]Nǃ厘pe;bb x|B?E^·.c#8M.t B  3-$+aO]aɘ@"#nyx4OPL77>YirCL$O .>&3#e3 z= ~hEFGјUfz~ @hnq߷Pa*c$Euu*iv0*.*')1%'#",b\Oݧ H|#B9m\ R,Sc Nf Ɲ4&~#LOS20VYN%=ff/mXb"ꏏ&_JHEx_;2, @gFFZ*M|9鿂0iˍ@L?9c"~P@ف?wD(`~ @O[ *˚b јő%_?7`{g%e:z)c߯X3lG&wOn1aL63vw-(I'¹]K1 {lwl8Jg-aA!@ʱk d'<ͲYX^fԶ+'=l44jo1gL"SѱSW񈄤c⌑WV>UE WYA* o9Xq<7B8\=!=1{Yr3 ڟG!dx.XTظmwylrXq.=gdS.x3>MR"B}̟iFF004ɤ addCC#XNO PKеgx@Քsysп |jɒ/"@-8#?Iىk:};a5iD8i&ڷt q`ݢiSPʼn!()"m;19o:4c+kWJJeq-!lRЀWp81qjaOAo/]А%s@%1 QuUй ĖJP12YI/4C%(GYKL% й"B je%iX?{:t>1d>YP ssבEEGpӰTp,ޱ])go3Xe9+ƖEХlXzw.Aj8~Ji\o'IYxoa#@ #n!CRN8ڃб@ۘbQ01{ xI$k&N @ |ۘ4@®ӳFnj1a!Ptʣ."6a ZIDAT)9i 0,6=FÐ@%-\~Řt2QVH&)_XE p1#2x(Ll(( ?~=Rhx  Hر3]sDpP4Rs`9'-GR1 q)z'.#L$[cXN{0TVD\q++C\RDg@,Hm([B`Q*mgq]jCq0X(A][ ,k@B TcHWY1d Q&Ad)sQ$ *y X rpϩxM%4FF$8OLFm$BBB<#b1tA@K$ߊ^ݻc̼xKOqv+ a^$!)X A~8w%(#"3zԍ?N$&=" W!"`T XRƕMX!y8&ߘy 'd pN 3wIM'LzRF 3K@xd;LHc7n4a:s|Bf:dLBfs!3=605ѣ K#4!;L-3AEnqIܡo7CNcJ@{jȅ8aBt8P@ڨ5ǮADb\({OD%ؽ?6E:m.O%1L{UI!:S-ϳPhyk`xsX[ôif72@^aKK( p'n8b*&.ۄLi_"c5) P=-aNMzn>y/p|V0N3008`pk\t7Bb2YxHmAAώ!>: baCaʋpdpΠs`ooGb:ASL(xЦ(W8P:7w$: _['AM7,~I Dp}&+ 4HO&p..6)!IrN̪iIrL0K)(6_LOpmpB$1/Hgz>|'Ϟ R|NH7^0@O< C>8W79/+>ql\iciyߙ& GCp 5#H #Rrrj熁@b|lA⁡A gb0s;BϾNËеkoxJLk`|gHWcAt̎-YҲeyWXl9:SLrre7l#s ʗ5Z$nfi͜E]_uv2ͨRXypjZ?a`WmdYߥHӰH9M͸~ĥ5cܨ,}>7i>%ퟴŃy/vCTP m`"$?,־$;RZH׸B9vC],Ѹm%f_OW]n1Qt@{5.ʎ'4dvY31x!AHJko^0eHuحXO|lqGL*+)"[Z#Hv4Ç5,IT~𺚎b&Bߥu Wic3bcn zLޛ}}wtp'M.WaH$cl{?U\(l|&<4Y1Zx}a!B,7;jagZ.v#/vg1Ͱ= P(w!UBn,J"AyABl0[ٱfegeRX;E}61S;!ϛ@7qNOM0M'.1*";S])Ns;qM=oa‚HOQ(#XՙT,n{ 0_e!mpn7|wiwAL(<:Wߌ9g9.\(2QYSq29>{d^W -6^1ٓi>Ӹ~li>' ]E6(DHM7~9`62ZcL^+C}j.+}PV/Ɲ< ^¨O$ swixix'J|~^ i˧x@xi[,;IENDB`fotocx/images/stack-paint.png0000664000175000017500000010255215247006660015226 0ustar micomicoPNG  IHDR% +TtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 268 325 1 0 刓:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:325 height:268|fotoxx-23.70: Sharpen: median diff 1 15 15|fotocx-26.6: Rescale: width:293 height:242|ҡx IDATxgTT{x?>}qsRni;Q9'Y1s9"(IsΡ"SUEA61b]k0o9{;::m\p2"yfʟ<<U`0beee 7vAi@Ȁ}ӵ4X= 7%,NEEgf翩̏J"ŹiHE`p$*yon:b TYdWB4&HmX/61 oi^67AA>\'6ۛ@(]YY_ vݏJjZK3 /و u`"MsL3b=ȭweغpq<1uB 񮓓MTfzK@bfpxi;zm; dB~ (| f0Ն1EYtu<0 JC]6\V(5XhN8e[gPsZ*д] נT#K,%}k@CS z7#Ѐ໧a<j<֝!(D3'Nm ī*Р:/݃'C޺M}|)lBxOCEbqq(~?? Z"㩮Xwk&89M'Q'tzRMkA{|p(R,ZTSՃ'hT+V"vBwzK+דc"Q[S]W*>ȱY::&-%7\ >81()RMvNfm:ۏpi^#=hYb(kiL4Qc=R< $Y6tW{-SC>{`U$W91;Au!mseJI@cЧظ7OfWOח퓯3jh IՍ|ɹvј7:Q%9 PY[dZһAwіҒlmm}Y+V\4ص2-IVwgnn. JJJ# <Pb,Lz0ǜ5q3, U<1ڊebk cjl-֓H+x!)A>ظ02uA %}=xM`<2Ic2^xcgHGګ }I^ C~5VƓG /Rå˰ V;}aJyjq#(x6;/Glvi>S%sv4LsJ}OZ\=69۾N042\OnW?Ӡ =e6~nnrizkp^nt^MI:/ªY҄n;b@/I o&@L!A_Q'4^;v1,[ Jo[b_Х9pEΝ;% >8̅L MqL@~)irPS%Ϯbiš(7g;hCIDLP"; @}2Ll\KCkccH#Jssjb,K(O=c+;9r*\nsk{0LI/7it<;Té =Mc4 4Ta RN=X#)1˜ypq6h60mAXX٨ s'8;~)t459 LH&] PZyI89F4]\]1`lH$U=l >A)/6:iCSG'']2e2A.fَ ɚ{3  Bshi&lXYbա Ȯ(RQ0њMmCR9YH4=m*.pj"ɚ/5-1zpvq4g)s.^e%Zi p6&jLůĥ}K2fpru4{sBn1"?3? JlߜH~"0I.Pb/{ "2̙3޽{1sLl߾t$?;0P"m! ,4&KXn"T4Ʌ]%ɱ2&^{ e A)&FS5킓&8d!V@y9F$V6tw`<|*A9.mt͗i%陙HMAqܪܽuHMGom8O'@&<*л8zzp^w y40"MeS]=䧸v ))4%f9- qZ K=]hi'HNIAJ/->7A1i 1 ;-xRPǗTw]QNp膒o2W~Aʐx!W ,ָt0{q>=a0MCф{}l 'PbmΤ4#fʭY  %Ȋɔ3ؖhz1L3 51sqvrڂr>tQ+Z鸶k1, zFkY?L-;Hp1dJ#1{}J*6_ ZMDgk)ܽK|s|/V:@`:ߊF {ɥ0SF<@TaAf=WHe 5 n} Q3Z79N!-sv萉fbdJO(&pP\r/{r\z#V c(f3a+\]FZ,VFbŜIS9o---Y 3Y0>G͵Mdy" Ed=$nz$#2!n^˗qra9 UH'&tzd!϶'L&M" 1{j@709X8Μ';+lM*{\dP4 QKüyd,X>>>SJ -+Cvb$Bn%.$<41gAh6ٗwHrOfa;AVS$<d"Ϡ Q27QUNU˧AW|IJ ߤWe| JqN,tALHK݈@)RJf3( [mMڎtZ){ӭ Q;2 JѭGq_k6sfw n=DLz)xFf7YK䷢LusH@PolA NI /B|]J_EV5d(kqo;u 0s$W"7+F&`Rw2MȄӃ9,L ]j~I`O}qhcP$(9uC\ښ+~yltKĆF=g@~@Mmی|9@> 'Pyzz*X|J4S+'lݺ111򂳳הZv(xok?vlǓ3`EBe7W6&0U^$!!ҍ cTTo0tf%0'3ry3QHO¹uISRxojsy'ȼ3^e))~>11̰"F<Ǧ4u]Rnn]7W.f3MI.#jJ7}} !I/@IyMcVT +a[@OBph or"'C}CX٭Yk. {jJR(6TbG7f<dOCN ĭ3i%Ҥ"||ƎzҊ ȹe1jJ!3MɅLVm_mPXVWٳg8y9v,mĀf12:[WLLENvGGG޽L4Iݲq חXA$ĶsdV\u>+DZqIѡ))uPVVvf8v POB!`[IpU8JrP#Dߓ0Dڥ8s6 x䔭k ^*#08 q/ q̞Mw̩t- qwQ}L緰ݚVuB:9}i9,'CMePzTFm*GྐྵRB+>ӱb"ъ>%f =pW_D;d9=Cb-ŭH==Z\Nx~А`G |^~f(|ъ+a,-R[30 k,)56ykc<ǣؽR)A-;Wbfۀ]MfE@ ,˳"00" -?| DaO&j2˧.؆̾B?\Pb[s 1) ]]I2VvNRGZSCHE& m(L beJn0s3s7^e.])lWƦ,]k{}Jo%ƕ]+2dɀBz0AP^;}|ՙ SSXX;b=v79~ ,Ul KL\ΐ:" <ϢHGKr I`Es@|v*pW_ S0ՖiJ!9ݯDȦkZBE{}!땤5D&05LO_ kQ#h5%~|FJ,N0W\%G,)`L_R)Ol8s,ClZAp4 O`iKGL 3oA>V޻m%yyX@V|5ƫ!iعG·jfM I&M[x&գ8 9] a)%abWL5״_ҼXfƷ8FW_A~iLoya;즚KesҊJdIynx"Uf6T`-[F)BCl_1֖tSLuޔdmzU869VK]E6EV~2)ԆR񁢹Y=>޶Tض+mū7pI\ 電jkqam8v&gk(_.VQtL׷6k`AiAh0ه% ;uhs:Bk<s7osR3iMRRcfěȮ -iOk+ %AUxϲ,\=vn[ev=r7鱡Aޥ] 4 ,c`m66+mC+Mx.>׻t}8dֶfk3C_>%Jx(?  @a4(mnkk?TA'#J8(q9Rv>!%J8Q2A%ݝiv8(qPd`Dw-q p2{џpmnN~w`<]68d`%M%8Q9R\=~?͑%J ( HNC48(qPd`D' J0IK.!::Z;wPgr "1122ӧxDZ7nH?s!:&Z눍+8..Nj&"2kO%oD)w){' b߀K.qkc>viz- 9 $B)*+Gĝ #>#A(:|p$R %#EY}FL}FJp4IB)<<|PwvqElFPF3b QTOU;_PR7B 5(EvFr2QRTFL7L۫DAn^Y(+)FI[]+weq$' _/WӁэX<Z؝a5cUx1+6O>}ƫ%!!. b= ϥSC QVsJ}ዱj$+kJJ eXLNqқwă6gq:I#{xwG$9=X{)"tIV.70IބAwk*SQmC  BD5݅5u0(Rk IDATk &zAw԰fMu5LHwV3:(G|ajBi2-݆PӘngC)!3젢 5ml<†AMΖFz Mbl}50 X# __~d|+ ^-5x_ƁaU96p?8G&8|Ғw[a^7|>H:;{z?,AW}.<ҶcS6V/{Hzs}E}^vgnwܿ J]hHɘy[#\ TB]ܭxt,tU1X :Ҋs۰`< yJfK0n CClu#Na+ jmD|H)@[Y.K6?,oLK~~~}4R2wGp8 _^o-]xD(gȭX{*PJŐWe] cÒ] ̧Lqh! 3#5LDU 7^M%բ47@Y ^%|zW%A}3]P,j-BuV UxUBiҫ~bZ Eq8nF) - %GP݉zDz8 m,= 8^=!SwoHP=$`KgҐ}9]s$o0 %xWOKAC/P;&F '[bi"L|K[ĩ=zɣ ݈Nn]ߍƗ_c&`T7Յ'?;Ci:6x^OEʃ:3;-BnW6r6"KkȤ@q#]3FPЄ4U&By[R=%5S$64LU'xl6ĴT]pfzXDGEI{h-u^(59f'S׌ ?hOTGr~!1ްИq"(e\θб%- VVV=-֟p wb>4A`=oFeO,նM%s|({}EI6CՔBCCP^VZ}+JGH4?f=y`SD鸱w:Xp:(T˩@3g Q6ǐ]ۄvQfh`G={Մ;{aF>\K*bx=FQ-&!X:AyֿC233<"`!B M+L%5 ęHI޿+bW22kJ"Z!|NUeC,v)"3R sjKay*.\3p d_@LV[> տkh)*4"EU5x9( OLC6Y(OQ߽XxzZp0BCÐ,đ2J& y|F #/T*Am&^%ȿN~АDEН? ¶5ـS\ʫ` OB@R!0h9<棌Y=T]`zkc(H.UߛCGU3FHz- Es~DN֖&YOR=֪L^(O02- (l`}OdN^|^$;&2奒`b0(}arRRGLR'VtThKSPog* O~}6$MUس}/Ҳ0ϡ#߷>$_Iŭ8. S["$n "S:˾347 QI9f߁˸s*У%`}4#^"z@9͉QwKR!,$j }:x{DB4/&bVٿwhY%+`4#i@4MlB=J)o'3*޿ģ=FhՋ"х1&}燪w<o߱ -ͷ\ٿq}}B3j UOJUMy)TE aϞ5דoU<_W[>2VTT(y1\yy*QO/GeyaDb.0fƔKɎ ș͎%stJ^}xǏ?I(1ePa) վBEJqT'ÖG%[{vkwtsvW>B(^?ƿ{sG(o>B!iz8(}0Ӕ8n8(qPe`(c=gHP ܦa;\0suw{a ԍ8^ #ƽCKq/{wg+AN8ϴ+~x=ox`98qz8cV:jYr>u!Tr Db݄o3w(u5Z8&00Ħw&2c}[`:D6Gz߷+Jus z9wYy+~woΙoC)?$(.èq긒Eo_li 6 /a,A.ikPVܒR4/%/{̧sѨ'xp3nJk,%LFf/ӯ/HıEFPwZТٕSn [uhiם@4;>ҔaOׄ+տΈ_8 mqܸpn:dҀn_Nʩn𴸹!~㠤XnG2zمK1RƞWQ0n F77 |^2߉Qq3CjdPzbE0[P7qBx4GVBcW_cFslP+Bi <$;*<1./-:;4P<9 kWKەjc/ĭ(O [|AmRRSgqf#\=JZz4KXMRwel|ŗ͑_?0Sǿo|`d5xm7~Iȗ/_AXzqq}JB%(;;pGn Kxt^Rި˼| z^ 8(qPまTq4Wd [w~" Xv 㒐O%"J]̜!X lI)tR*Vrۀ:ʧ5Ia;ݚe?1_~҄g;O''6aԿ DE}؂ "h<ȡ4q8t7v#n%yǤ-B(B1W|Eυ,?4dMGl=K0__U`*z#CA@ ?d(}lAxx,6γ1.gR"5V rGEE":2gv-OCitmج9˖/Qxu1Fc#|n| 00ApX9bvj!R3$QjHDE{'\-jY.\KӇSB3y/(w.Kq!<4u|^_xk(J%wO8UxR+oݐGiL/{ %JFiR@K+[ũO(mu3jC|9'?'һXp *M-VI^&k%Sw[ϥrTŸvUk{3S7"CAL2eɵ5u|4uH4W]58J(1edb54 .8ބ)@E }=%u ʫQZao[ϡL'\J+. CqE5շ a0m>桭9fMI*'ZoM1>[ dol@:[(L¥3z)ΰ5]fD[z?(2#kl{PkG9nW&C~_p~dYi _v;_[rpr1߁RҨ⏃`$;6t(u;e?lOC5B'` {R;ǖCq{C97tmiT=ח}ݴ 9:8: sLV]AM ^t< b&́ȬcH ~Ac#jJ-i836DYK|%~xՂ ת=PSf4V>^E);lEyw*>ȵ󽠄DǗ}2AO\\YUdZ=?>pt&DJC/&Ji%RYAy=4W0NW7:ci)= b**j(@P4՗>R}Lx9 5|dVc, wW@:_t4r=-hQN .a)n%xY&;[]6u7p7bg=:Кs~/h+Fo̹S%aI?!1+DuT_1c7}K 8(gCn'?cpAQ,w~I".kAf榘;6-;xE9;pd>q+W,H!c1c4~|.6[Ku012.t pqL >}V:erx9+i_ j x ajf ؽ'5WWs5"ntackM Q`zn3FNam|: C}SZ:04҃󂍸'u<~Y`Ps3ygL@$ /k2N  39:zWjɰS5AHdžii16Iz(/޾ȡT@u8a(/.@VfDIY5`IJ_$JAmr!h05 QRrQu#60::/Jf P,)̓Iר<ـ QھȫFEة6V"\PX6uQ]ĭIR(䠺B*QR^Af4TX_IvrWPLvceYRRڔ\+mCxlg (}0ag_ _TYXMPg_믾U=x=NPn 鏱F(|EV8f9?PAu.7Ca6b (?gH)^[?"ɯt.Ew⇟y/=ӣ>?Hm<J#KF,+A$E6 ?"pP4A%J>B e޼ꪏns;)}JIGBlG%+^5g(cA#P; pPęT ( ȏ{4SJ8(q20d'#J 9c4/9(qPJ@(X\OA'#J8(q98OX%J ( ȏ{4<J8(q20d`P(jOӓlFư9`y?ab?, 9W^[7q-Lx9 t&g}l0W3m,wBi<1R=0Yw*?*ֻCYY ̕t(fbd-FXZN=%4X8UnSW{ %Q[$(ۈok"Rv5>sucPb-wQw$zAYe3+\C݋!hׯMF W6K hM$Q'hCmmJ&kbTV%ewHߓB׭E#/I$)L[DT&'+[Hhhk[K#χvе|4Q]ˑMmpf㻱 1عz7n[h'$Mgf$]X,ھ "b2ƍ:n|^=;QS / ;@UG}#$`̉~L,]p4¸0~lgoT@,Qc3O?'`3(98q}9Mր8-^jɵ{G4iE녯 XL^¬'%-,ܶs=f@?vX^Z+ƲЭ)u4 IؚKۧ4 ΋QR<(^leq&`̸񘨢G"(Z7(A_Qfz yؽzTͷc@Gk OO JlT>ځ; fCPf9k(7[ʳqIDFe"ImUћ i޶ƌXd5qEh5Ga:.܁ZKq=#3'Bd>ɣdUO,% +;P*'a}xZ9 s។OYh(/xV\*< =}K\K@AAGО O)n[x-7]3)#隣&nåEPF13J*n!-)7j=ȦwM1\ QMvCm ѩHyyu\*93<)$QͰgh"-1JJ9$j$\g'e=8 9HKS^ I@d8e`Xͨq ?ܝ Hǽy8C#'[bhf&StL2A \=s/7TA+Z{,drAI2W_ D}[J5Z( 4g`&_{ph>?ߩ",Y(O󁡦96\MADˑ?NVMd`N)lUa<ꥩ~xՅ]Pղ(%I1MEvNSoN_;a2o/ԛo>R n^]`5=C _DcEY'{s8eaXmo3A RqzϚ 1w\FxqgIˠF {`}ك"VL[~ (X~;qJ5.y(Չ_A,,pvd*պ(mh@)7i; C^ KGmPԁ6)]>W;!Y1%RG|;AuP B[c .އg.!*)EHSɘ>D.o1G+KUDD^DRl(ލhPA 0z S2JCIeXjMS'8yQ)H +<vPVzc5L> _n:J;Nhc/D$g ;;Aضi FprtNRü͇A\QʽK'lȧlhG[S#RX"V29ۛlوvɲP +9Ӳ dMtGJ',3#$$V6|@g$R@Kre@[)HCY'I: | dA}LQQw=YpfsO;^/M4SVY]Y)k[o=ڒȟCF&he}ƈ%J^E0ʔ7}g-?Fm& +o%ԟmzd>ĉ-`dl{qFXY4W#sk8}Up W;ycAiC*t\8&8(qkNF pPrD `wPاaqPA%8QiC648sPA%8Q9;ihQ8(qPd`D%N G@rЧ 68(qPd@ tJV /(+7IPbJH1X{A^_ۉvsyh H"AC"شӇwMsc'6A\-^2 u#Aii9B^;fF_ãjL:%(Ӑ%mT??H^֪5% >o ("È+45ݧ'жU@fuVs(AB)QQ"lq#6=_I|׳\ ]C\Ap4 <8|w 5KHd?܆ۯ=ȤbhKmR|q%\-OG7agdԷXO0=A:2̘ݞ$!sEkVX&6qMP@N!0d#s(Bt ]Ǯ=Ԯ8w=1fz| |Cmt&"3 gֶ͠l6s(l$Ew}]Cዼ`;v2Nšv*KPZJBax> v`|Klm_ $l1kdBuPb[& @0-bƒ놰Z4$ft8b"Zf܈IJ JѹZ'6fȡ2Yr`l:w7Fï?S VjA}&MF-Cyc5 5cQh J1`xVN9\tzې 2@yZcXr! HsB!3h f\׃Ŀ#):ݞOSޖh{4%V`Lw]Z43)n|豦ZXʹv\a=v,Ə8"{ H nXqb8{ EEVq{Z%EE,Q&aq8Nǽ\Wc¡'~B7$<:1 i7!/mmIZҰ޿?H,fʗ hAAQFQc2H䍣ߚS])GAq D@@BBP6X)JKVzQ^> g#,"%zZ@(A"c!Q4.@vh>zmrRc:CN(>6YY-[V>[jȾˎfhd*i?9jV`y?@Čڧ*@]^jAR2 yٙ vY_nbgҒ KZ*XiMZzBR#J>3pmR}5ٖ3M)5w}ZFr/A} ?9 > 12QP\v2ӒNkeeK!-0>HSw)l)'"|%E]ܿy ԷLj6R!YTC2C/2@2BA%bA#bZUZb;v&XC d 54D%%%.J8@v*PІ~o988 t*P٩~Aw]CPPP2Drz=BrqusqwWܺvIRI~蚎P!xM/2yr\ a.r-V  SBfq8})YrD@*愿c(qcL|-D=NtY;I %0/Uxt ~U O 51LCb#IX4Ueg |ҳȺvA=g \"Œ~aLy׎h޷w֐!hI,x@[bkG We!mMPbv\< #2֨!LӐXq#R90sQ g'ᾗr ȵn'>~ݿ%Q-}Bϒ2x2wwiOb2R[ruk*h0&2Ey_y٘زaeB)P}U5TfP" k-Z]O.be?;#A ՃTFDrctXٳgc8s? *{݆siH[<>2X<{tOxȶ=(=UEP>+7#-E8Z`>|7Bk1={|qL0AzDW.^e]*ϏEc1kGd@QcecI<SOcUXl?ݾƐ5ZO 3n8 #Ff?c{0'<>2@f!ۛnW J_KAkڜ&hVƇ6AP}D0hJQp;WɢnĠtx5'9>3!={Ngꠤ?Gh2t55PⱰY hDiX~>=J<*b"ً"]R˛M-o>% F̓Q7!y6 F)@( L0JY[]2bļ-DEG 8k,AlP~۰dw3(> z>܏}+,޼!32&Y"Hʤ(M_9ΟIkϫN6BH <>2 q^ %qTUJt5mA\dq,0M-߂h1wk1;- ̦m@CMnĞ)֜?phSzZG7{(/֭.}Km%Ⓔ$rR9>`~R|4a-1صHIy|O8Lm6 JgVFj+:e&;PL;(1ZӛYY(NO!bqr==K\L^ Q(.TRB1Ex㋂jɯgIDATwZsyL YB:]JAع|cװ # :` J@\[;`z'l/2~*ŅbyeY:{0s@TNyKc0wX,u;<}z| g`hX[=UK~6uއi;ND y]ȇpXgNJ~ZlX #!ּ=˟]Xx$ v4}DLgC-Gm*{J(K#63j3(?lї-l]ŵ{(6>.ٓ)dZp^J?̺L %c_)OxO"Y֕K+Nh q8W~u][g4Iב6rױ ټַ'NCRÂ"j-%1k3Ml@eAp͎ X$]2SJ'>D%V Yc[@=ˢkioc}Hpxǎy4~IOiDPvCa P ScǴ"%,CZj ␜tJdô#@#*}ʆ%n_\ǂCCC@%.J -4*%%%.J8@v*ǧXz888 t*P٩ҿk<^Dd1HNU8~g=~-NVO8| 7۩ ]n썍>d{$)Ew',:-džrrJ>iv4.:ggo8$:+;qQiGGeTfZ Jg.ppũKS(lygz​ TFVMd@R3DP}a߾T#x4|26+7lUgcdt(^}#؏haXm;~t=BAOq L5k,_`e *կԈl0wFl۵Naoo7:=9S0s*8ۜ~Tl?n `CsRKsXTVaB_gvNæ31v.;:aӪ>s6v]xb9 xo/d6xC@T1Bǒ-|o^ѣaxJFW@Zm?Sf/ÎؼfO?Rj4`|:mn6tyc(ǥ*PItنŏ^r.Jwފ"H  |s'ņW[ ϰ{xo9|u1~:SVċ}L*qfQх2òQ&C^&(9E- Fۯ &MI Gf溳 Pbd˓pj <08 R]G7bR7dkR_SŸsCŞ^G;} tհQDF<(0&÷p \r/^CZH+Սa(P#O JBm .>PL4ǛP(}@<-1QKfҔO]aŕKLEM3I+ ״z|! cgmZrG+|;%"C6JB8)lE}ѳo|ſ駟Qtd H8QC3o`H,2jNCſ}-fރC#o+#_l c7s(%XԒի7oaޑVi(pCi2FZ rd9OPQq~7wȿ>b14g\,$ԣZ{1f ümIF̟JWSZ `R~cD|\rYbed#A+9en6 ZTJ2"'~U\d_ƨ{`m([}P"C!2twJq77-Եd+M$q0cdl @a꣺kM_ ݴLm%](这11et:P7}3.~\s< q?a(u{o&~@pͼR/`-\o&(]UBY.+ACqQT\E6(MÁ`z-K QPPzEs0hn5BuPʥKvG|7j.G+D%yZ:pVj‡ r^QǷbP+\ K@5[O=Rd -)"pe咍*R桂KA=Ga5B,3nk%9Oډǯ3gHVA)p6\@_M)TY ,]7zlwƱ'q7R=t2n;WbwN+1=z=bSty=Fm¡oab=s' (l+.[q.XAVS2G(2=Ֆ&e\1Fsy̳q|(\w4X{&~9 Cc,|A6eyU#/ƙc0bB$Ҳ4Dg5Zb|v"f.YhӃv>]vЁ(@Szj$*XFMiPo0~:Vs'y, ec7Qقj@/,R#XC&H`4g#m]'5v[]Uױq3.Yb;mAW">\vmÚ+xblpwP[bCq[K50HZWOXK]|l}5ZU6oYEcٲeXr%-_E=H*gUYFϺbG[NZgo?G!0ڱ 8"ɬ%J!y7'3Gيze[W. K`B GNFb\>DiE&( ^.'op؎O!h^/i>mx5OjmJVxg&J]nRty'})NE%q(uPB/Nq OҮ6FJ]J]My{?.r(q(qm@%.J Vqi51^JJJ\: p(qT<ϏKPPP2ЩdC dH|\ZMGN%J\ ;@v//Ҿ888 t*P٩k5VJeR ()h pd_+.\(P˷_?Jy eCCC@%.J b򿻦šġġeSN%\;QqPPP2ЩdC dȆﮩ5q(q(q(G$E ǃ;7qu yPU*UJ& ܻ}[ }/D@!/kJHk5ٸTPh*x݇~ϯ_ /QPZh=H,юv۷(+SHc9ơġ/t%EkBMM M"LϫW2D)IP*D 矅{,VmC;EmgmPlcIc*on%&BR{#B /7`53Yz 1$% uDOQAe\% 79{_%LXjK*2<฻+nu8pY^îd%8t& $uy($i8;!06%( _< /]þ;i&8m߉7"6jM]Y::D= [WRWtה88 F(4=nDL_ ;]\ ac i (*1Rz@LX)|pa 9y#>_5Yy,Xs>E a%AdZ$چO9CC U5D\-Ccw5kn".r4))rDaX9ߍi @:rups YZʓpn;!WP#h@:D%) 72gIS^DJPR^VXDHtWl^V8.tK+;d^FnZu8 V\ޤ|ڼ•4 Q~ &bU*4ٷ/܂'V =}#m_Q% p7a/J,7PX&2&aS_8"a벩4y)FHs#(jJemgRJ"}k2s8d$I,Q/z8]!>kt*m>y @^:C6p} >A-߄*gT YvefiX'ɩt(Tql8ky^[OZRKVu aC kHD@E~ڮGBepvu5RJZ͒J;[13 @K6nz̝=gY4S=MHˊ<0RKMo\5Ģ xZh6 V9?t“hj>wxI~ d㬑Xut*aۿ/ؼ(? co?%|_3Fa&!1.ߞIuydL>QIS&(*Hv n; : ,c\'TZBu63t_DLv, -A$MI(GSVa<4*a=f;3E),W`ҝx )=*΢vQTEU&hRIp `s,T;4m b@T_%6τ-F*)e0܌Gٕ,rF2E92Ё#t"bӲ8<} ޡ囷%cyIJ ^tؚ~YR">>VvLĉa=n"]BXjk b`alsJ2PkH;_ \^MT>{%w^h Sa=~&LY Wb Hʡ*QqF鳱p<ۼ;Vad J];.~ cXя1o\owGLwEinڋi'a)l;cM~}+*A%˃Xh? adM q;6 > GTKJ\#j&wD3 eTeLl2+PVx!,<qI*@V!- %FDy+Q/{Ñ :[Ėo&#hJ@˾rf"&: @jF6J iIQhhpMbj*YqI1gI}I2կ riPL(i%ԛ] =%fgTL,r PE.WRy9)GpH0C`Z\*J$S% SJj&7&Bgˇ%R0$f4IMZ={Yb1]g91gxNcORqPjoüY«Lc~Yk%(]î7Շi+sy7x/ϔ4h[]]sgd%>9[-~(/-JjҔ=09wc5v;lJ LM\H̴;\ITL%o8(+#NFL!u訶'_%4lPPj2*]P|mI(2W1OnvpBۼ|vB;310. ǒu#bmPң;iBؒѼJJM\H{v9~B0RȟvR)lbN}|X'Pp*ג[m')7*,eӼJJM&t{f'xϓNAР vM>gr2v%G$<7f%f9a骟1m{3@Y,1iḪaj,]K yk7N%J\ ;@k };ϡġġeSN%\3zIENDB`fotocx/images/top-panel.png0000664000175000017500000001435615247006660014713 0ustar micomicoPNG  IHDRч sBIT|dtEXtSoftwaregnome-screenshot>IDATxgTTW׀;*] QlQ[,XPĒWcoQcIE]DkFcII(c+z~?y?k13>}ڝ*T "#####ŻV@FFFFF@{T>>>y8;REFFFFFC^Ҕy/{ddddd '####^ '<%̘kZ1=;#_udĂ=\K'l`w5oIGnI'1 jOr.Ml͍'ۤпF̵}>q3_t/qQO΅וf}iܶ&pNJec H-iėfÿ>W} n>]i֢5~C~~*w8q4I7NƤ:º  nN;JgєKk=m4ā.Fa9QvRCJ O9i%)vpOUakˢv2;h)|8[A+ ڍLΊ5n U==9&\gxF? 3Jt5-էZ)&X ܒD^aMl ӻX; MBYx6V(6z BJ5@kDRgp ':@ =`߿Fͺɼ߁ʲt"RNWM\2o Gg1&ʹ;apQxnM׀rI:SwAK lM-6 Qixj3ؓa[S5pWݦSHJipjaZd6?ܐZ뙵5fA˘PϢi|{ .Ϛ|PƆ1# ? 4mQG=m0\$imabǚuOKwS(%]r^ğ>ʹdo&Iq^Sѿn2DCNC{' 󼣠% !9iW9w92PE+`^1Գ8u!*:x"0h.cYXijL]= ]:Ϗj5f לrȫWPZr z &Yө)6XcfDK99]R)VRJ*g{;IV m&4é3w $b(077E;Q$H83kEW nVGӉ @qpGbTԷUil`v}dyǹlR]GIi=n˱+QdbPcSB|o9mі Cn)[cͩge)ώ`FB|Eqg5T%艋ʰ8z ]?n^ֹ:t]°\Һ ;fvKUHe˘B=bŪݜҲޭ_KyoqCֆOI3j ҞjRW&KW/ Ӭ&UKS8)M0p[QpDy &y&JCi#hnx,wjk)it3&8/DG$=)7Ofګ8u`JC.T`-5.~uDT8S̼oWqЎ`r7AAt ~YIXqɈ3IN 2֢%DL$$&jѤE6<.WQG[O gحxelO,.u*FMN#dT"13|Q2mD5S8}! &#$nS4FnaW (O`.VY NmSZyH_OIx퓛B:n;{2K1\ݿFr'h# pf9#lؗχU<'eĭtn$M~0;{}FOwrHEp/H=7]i{( }/B0Aqp+-%X?j}=I p4WT+@| s熱vV~Y-Br:#},xEAɗX=;]nLp(-L h ٠uǢ`_@%2ոEH?w̤hӣyTǓ}ٖɽ(-+X9q2Kѷ 7lS]Ӽ1i.g ƋŬً¶:?έ/ϩօ{KՑ0m;#Vn1}c%AYSomgVO@U\ 7a[.tbRgg ]p݌R)0`igCV5~ؖƞ@54}q?_CgƔ/+qQR:k ~O^]kluݺL,;o:1?C7B Z&9{}CÇͩG  &eD۷]Rl|%~;}4wpяd5\1|Ȃ;;xTarrjP˖DP[$[1لc&Gu0⇭I{gb(KdHSoW gsSMw)'ǘ;u=k fr/f_ ^D.OEmdh؎kcٮ0[9*ݦ=ܫ X7˚Y4i82Wp&O 6d<8JҝܴmL>49v&SI}^̝؍.50Z=Y[H';аI _LdδSjFJaH O8hՋO}"l#@sY.Mb/AO9_t6J͝*x]{>qSLv+"p4x(d˘rY.Ѿ -Qmco:t;QҮs>y..UCZǡOr)i٢ۘ?E.:fT^޺4lu OgTN؃:5Rg#TK2F}/nySWxW `k_ !)wSoka޸)ՓSR&4S3Ltu{GL&!ID]$ݷ]./]gwL.mH>hA)K%YdAJJJ*C9Tݳ.1g@ |߁ZK "V-Ly Э~,Y=U*Qg2]FU^A{I=@iW 10>' ,lm0ku#TSS%Ve{^;Ϩ֦5Z־kg᪮!uOĔ8tzlMң㘔Bfj":f6԰{Ei:XMf㎵f%Hx8?Ŧo?,Q Uٴ|)wz CbKL/M`F0gɠJ=tZ8+#}^ԕGB3s|rS$"jIi1(U~+'N )$%c@01$,A@O8韟f h<| EaY2"}@&^Άs籀SQ.HPpu+-Pۚ()ڳ2k?:'iՂT+P ''APd}ew?BGy33OcCIKjyV@cfY֫3nCy;1j?:'I⋛Peny]tPIИ`RP&P١DUNHwce*}~їf(b ,=:c[SGsͫk%wz -J=q oikC9XЯ51 6!_0Ԗ,~>Yuc(6ҹ>^a`h DS T9OJ$1XChV(t0XJ1Y8Kk3oN_< U_KKԉb?K$ΥcVo ƝfW{Ij0Ho,MT mbՒyZ;LfŢ)t.[Ski*8HCt% XbE HURR)|sB9W TL$"Iжj݉Mܭ׏^U @aRRR}r"-&R]UrU(e(W&3D ;7ou.^xT* нWl=3~h lq%*}#nFw>KuO449U1(у'H i +I1{E%QY5hԆǎq~SաMRY(OGS$7rEͱc :yi +*w,ws KRtsrL$Vƭ_@gxb b[t% r9sMmQ`L]q3uA}kAQtyArs~^u>Cqbx3y{9-Rm5wvs3R ڻ] eԦ8jv=VOonHj^+_AaG]5n-&ۏ݊Z|ҩ3BX)ej"hb?:AuI@kDә̶3h#C[t%3jʇXJ\0ޏ% ۰w$IƲ4UkX5˒PEl`:`0>yCߚZLʂ[Si] oٴx+P[S-6ll0(߷nIYJ@`l[ӞҖN+IFQSiz ye,{liUh> hYi3/ǣk9^t|E⧤qg"kBvtFb2MΕ Gh9""P2Rajb­&?T;lwP*#=_|||̊_<α]t+{"i#7zWS0(gJO3?2222ˈY,邳 ʤ(Nm c#;:N 9k0tpt^'i5f8T"`z ;C-S{+3<ޅ222222+9ȼg,׎IENDB`fotocx/images/pano-align1.jpg0000664000175000017500000006132015247006660015107 0ustar micomicoJFIFHHBExifMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:302 height:270|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:272 height:243| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 270 302 1 2 2 0 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? 4sLt[8'NKk[XF(@{NI*(((@%M^ &K8- jW[g'4Y Rl&?)"Bm, =熇xh r=1wsx;EuxR~6.|o*T?;YdAӌR*K҃ks_?w'u/[Kqt#!9)?|D|R|O [hϨGw/pP"ہirhֲ|]3ANm:)m:O_=x<[Y?Omkmz#nN$Rkxⷊ9?; O [C]2q%ª#1bz1g>'k~$]Ze6,⽉⓺\ݐӼOLt/,pE'$uw ?$ybk[<ȿu&yK)R\xcһxfO2e׆4HCܦS|ri'[K> >>j1|BE`WVzT2f/ڛL4:Ť^,b1FESAbs)+ |ftoq|? 4-Q@1X>?|\ԵMge;Y|-[k*ybFhݽҫޥ{=/߈||GCpɮ{\{ ?.>o\}yHZF63T)S[;եa~maW^|j_,HI`IFAWiTdu j_j+g@{U_W6>սĖVM xar9#(]r`dOj[]%~bgzWbV#\jtSZ^r8to6e˴ƀ6ygj é=_9^Cƿs 5]-\ L~X^Xm]z<䛿y+IRx.-CJU_^>xH$ZZ VZ2CNNܯ:&~(l( +>k^9SRqzg5.&Pg˯ }Yrm+Ɲg˯ }Yrmq>; Aj:GwDwyPppo|Uo|\}x?Uӵh|ӥXU bqx&>٬йu6rk?.]M~ž$AeVR6u z_Wִ"ܰ8BJ8k?.]MnB]c x^;x/TU#)3$sF00F +xOu]? iaE1Ͱ6#qu&R g +]1?@7jmNeX6Xz# |>~}iI$ͪ\,"(~uYrml\9M>DGIxk?|R4}WUظ[Eɛ$Va'8*O?ه:3敠i~"KVW_,v>m,Ĝ{+} xkᧉ_GoZKyE֌oRdǒ>g }Y_o)hKzW[ ie_6gjǛgo1r+`Ǩtl>e;d^zzz~_ _o(fB.U'K-} 9Ҵ8YEg.]gmlֿ\9EƝgjP,,0GަYrml\9E-uhX]ND >٭$gtz_?.]MfB.4cjzډ**y}Yrmlֿ\9EY$»uQsnm{Q7 _o)j WJz\@@23GnxI^k^Oxoڊ[_Ziz>4ŽQ4s)o`k'ߍ!xJ _n:./{lBd z>Qտkn/|!t_ ^%Ώq}O,zeJLw&{y< 4jMVĉj#K+gK ʗ¸9lS%I3\֗>|k~j$=AYd;$9>1j tĚ>a6kְ{sp^+pKgczkSNQ]o×z{p4j̯!TyCy¯^2S#ėo,aux湒fM!TOZ>4Wx;oĝ ➇ωwX|v7ia-d2,ė ^3'ŏx#˯]=޴&ql!*˿}܌|˜]̀)+'~+xo,4o xcƕC?bf!odÔ7n&_5On6q~tGNe763 ~l`2`m7㾶=z Nj<;zÚWln5)f|(-\*7| 7&|slIgiZׅ5]* 4K YC1aO9\+'?4O9}:Cya$x%q2pxO3C4=?P qwwLI" kQJ އ{2J23ھ/g g4`m\~!hzeXr]Bg ,{U"|gO%m _7ӌ0-ԹTCDA(nZOZO3&ZT+sgZ4??H#^i~f=zM*[ u\-ڙBQQl@ ɟXQ_;xϊ_|1 &]2S7/ \V6$p@9 oҟ.w5v oigN .}%lzOQǎ|wV][I\i궓BL AɸV9"dF%ei̪@'sl`j \QuC×Z6֟nj0ue#k߳7]ok~;4td!qƪ79b3W~:t> -|;gi7w6Ix4h\K ޼s*$uO5m xGqzP #Llc4A#0EԥKeY\=UqNkLׇO)Dnt{+yNcAm߿J?O M\=ΙxMdtbrލkmKWӑ`1Ac+F `  7o/h^%|EZZA1HX%Pg|]}xKPӭ5$TodV#}kuڲ x;$|ekV/t䷖aWE}Һ/|sԯ~XxU'k dyUO ;[$L-Z DݿC|!$k~1]FKWIfop*w={W)k.薟 j/cMr]o/͚X'i$qq:W57?oza $>~ZD[ vL%([ ]BGmoXjڝвӼ<\j:w pT.I,>Wa爴 xRWmRy\I!ї\gi8ڹ_ _k~(\p2iZƝ3;ѕLe#{W[ZڮS,W6i{ RÐj􏇞D0c7 x+ qx;zuP\'MAux2N6+ RJ?5-u^Yյ BbcP.W5_ٗG6M[ԡڌ۠L۴B0ԼKk> Ar"Q`142ܯ h'>\j@2e ;ryk!Bjƍ-Ş `FG0w56`p ѻkduO|mg{z&V1D Hm- 񴷷0h66Ǵ"ͷqn3zל_4{ss L-5_E~pp9Y1 *kW6A_ x^q\/b(t%߽AH}iө/MSu'mGWݔ kbt @>շ _ƳXִtNLH.a2Nb컗7GQIKXmF;Fv"$9/^=y=Xc]cvmߝZ H<:j~~ G O\<S/lmx]nE*ROٟVWA񞾺^Au{ dtv1d%T0o^j7kwi:\vjʙ&hٙ7 KҨP;mwº}xjylR90%˕$R7hKh_#œL-wOq1x/59u$}Sִ DᘂQK&TdzQzt14Mҵkڝ֭[\_]4^atdA!(21ۥm{57^Ɩ#Ύ2A"X lb#=+K/R5|:eh' +)>?iT^|Ee<3b2Anp)Z[ Zy_^W|Aic..|QO<(QƖlˁ&GV߳>ma&.ڔw{ƺ+۽gn)ojo—E;Ei11Yؤdra+ښ-7Ş)4MKw`"١,|+IoXrG1T;YWĚxB.ŦK򴻹 adݸ,!Cv4YM _-uzp֬ ${TϜzWMv4j~%7~+qg۵-*5$,eM|~]x3]͞xO𮯧_<G5ePr,0@85vq\z%,ຶ5YmdAxu ?Њj&Gyo|.em0^kw7z7N?¾f8yB*qux/k,49u Hdgџ۷_?]۷_]7ǀ#_Zֽ[]ÌeݽnYYvE).5G%+43wS6I#V +8_˿?.V,#G)xTӾ5 .ź%(eQGs|V=7M|SkYt}ntXOI#n20}7٢7ZFm ,j3EO+۽lIH-ws +D/ xØ.;!ZO<i>jiFk۹nmDBV-K 1$dbDm|!Gj] \qy-I E勜:^E 8h٧S||n෌1Y}C[qzko ?0^{"0Qq/۞{?${RzsI$ϑo_,<Z$^^-/.]Cw&u;POJk 2OZ?pYi0gkܨJ9[Zx3r\l m";# yGowcW{˯I b/;q!Ba@sӊ}G#E7Ҷ⟆<)xV՗V.;=u0"@rpҭxb~):nlzeX$"[c'hQq˻0zpuRjd|S/~,Vд\I;ksImk/ E1qu i4Vv$}Y=QlyMg-:+[H];pZ\CG[V>^о߀ahTZ:J$iRUfi7(-rY[ğYxP|7\x/ʓI-kr@f==s_e`QU|mW_ojmq\iqxm ×&i 8Uw+8`W-zNu՗ŚI"IVȝA -sE=cH}Kly7BshŠ(g2=Z{6[yB[ǥu_]xeo ,tGLj ad!NA<7:7şQ\Z\It@ۮvPBIA {WuWgd YƳy2],6a8/x#S/x{m AK[{VDV(DxBr~:t/CYoJצe7 9bۃuֿcwocOw+uGޣrb=i- 8=H3W %E-{ǟY yſzσ|uHѭt5ẇ]FԼixTcǷEt夆{TSeU f xە<+W+{/ 4{-oÚ7Դ>{)X׸e#ֶ4ړhZa֦Դ- Ы}ᑎ0~`8y/ [Q+ͩڗc۶Kɏob)|W5.M>gTc}-HAn?7JOkٵ<v?#H+sq<,jX Lv||f hlN6wzAqo(tnFA{&C⃭Η"p s[Otk oW Q_i[tx-/o2Sw_"'Vx?Nx@ңԧ{qY 9Xڿom/7/g6(Kf_,8bPrHM_^=Ӯqm>Wv/4y\Mfo9mGtêDca]I ׵.o=c߂|Aė@MFz-q2w8k7K58`AiɧOijTPXԓn~6~"'Ƿ1M& -wm0VU!a*'$Na.m2&Ufži%`A4`۹| /lO-hm1/㎵x7ifDdm%[CNɕ# F+-|UFУѵ-"+X#֕SW9,[̌c'x7o+xĞ16Zπݲ^G0:b?h 74"K5 ӧY:ZM8$Yv Չ [^Gsu&k?mm,P,İ!Np0yO_ I|#zȵKĖ7NĦEY??uo EQd4[7Ew#RV '4{6(' k56i%s y[%vdUlvkf.<5GgiHb,Āq<ݏw39?-H|1ZmQge 70[}ܻk|^? ^&btA2 ө3Q}?Q:t?g?j0t ibW|4+)Dh!Hҭtv!׭ R*+yX93vW٤%c+}2߈COMN#.Ϟ2ͷU+ڧ2i ÚF+ٵź`I$k;N[9H\jسdzg'&CH)|?5.-W: m嚋QGe8^HMĉ sVO_Z@|xǵG C)91s#رҒs?5k2Kmcj3<3`v_26 zJ(aEP\汩 xVŬgds"0ʠ-AޣhL)`?Me:b}tk񇂵O|]Y,vancvڬW'ڽ$j2>`#l&YJɭqsWs+&>)Y__j_ھ53a:X_T70q_X{QsO*<޳/&mv˽b c"㺖CskoÏ^>_i0Y},&ܫ׿#FxG1۱/Ïxx?LӴ-&OEye U}pj|OZPk5M&ܺgl?/Q^s{vq( *jw7zxGI^Fh4LE\Lwd|Xe/xB:NjFsNΥ}X#ːZr$+B>9QW᭎Z{x[Xⴈni TgğOB𷂵9- ~O$gx"C9:Yt|i Ou_xz_h>Փē\Coy L%hG~e9pyo_/|i/j_Eeͅց{w &`so!vP6FpGoO#,I'֎Ïkͪ^xk:7/_&G"tT `Œ}]'Ş7dVw4J ̾L ggjzq_EE<_ u_-n)an#cy͑Gg wOD< ~[ƣCyvVKhH}1Yh|?^Ήd8n!ӥhu>Lo\n9 ^ 4KKxFÂT6ӧ篿_zO[|?k%.4go^_ϩR˶dX&? 8jĒ? ޙ ,f 7q^y$GV+3EtF xX|+a~$˫x¼"۸s\ cD?x±xDo 5).ns9hh| #Ҿϯ?QA敖ñWǟ7YĞ'Ү%afc$IWPW N+~|4>ZǍMiki3yRgP/fl<" 95y)昹{?%RoQ}ZKV0uq%ǖGO5 (Q@Zt=o֖7֩M2pݴN W9h^+#Ӯu+_Ki$vaZD%с##=#|c'kϵ'O~)k} mJXM) b0jĦ8 ,|SUᦑtG| [}GuRI !C|c\xkN2~u(q"EySF61R8vR=Jᶙ6uxb>Y<&K\oh'p8u;τ.lAol r[QsYM>ᮭK}5XjKy۬mfF@8MyAIJxsږefZ5Vú B f ׇ?}?JmOHЧBP.Xp^wZ47˦X.?19]I<g?[_{ lw2Eu~I$Ԏ*b(6>e>|G+3Ʒ vx^#RMLH0CI,B ;OZ Yj..4?ӫ@|=iBc*s].#:^NY.[7_B,R~\_i۳C?66[wxs¾0EkrE9rZ4*3#ppk~%SOmg伵IIB-#%6G$WxSqCZ \aoeWw^B1_c;z]_tQ4=aShˋip1T^`7zGexo:/Ngj;8F|`!9-NV4e #+P# |﷟-Tm?d~%|5^mݸ72=ǵQȾ+XxoĚnMiođ)ZWi 7v.I;ҭ5˩%psf985k]{Ie6eojg{CƁ*ROc5 VS)lQE!Q@-%)sIE.i( ( ( k4"]B"vcR}2UĎ>$,z\́BXHۂxIe@$BXV÷T|Ex >",:$ڜYe]с⇠=, .:WGJUm$OkIe5Yd4W%cmP:z'|/.}mw;2J#.W(BK7CF=RgJ^?F?Y<=g>kkmo<_E3$hz Ҵo4+qotIc'xh͙'xc SNg-k\FW68S &nV>E ( ( ( ( ( ( ( (uΡxXTZi$HV 1zwǽS@#e;P0Uxǎ>x#IגI2'm##v7zp:sM(Ǖ [' +ن/ g9#q^W>4g(|+'>!˨9x;GA# ĎS~IK]Y}[.||8Q^=>iB<#i<ikӦ۟$ [*$ ӭj } ZUOLd]C+w GZ0=iX+A}_&𞬞 P𨅭B}GvP|R3{O:|:PA%ޜ/uEuh ) ץzΒZ"K{]j6ƓjiȌ*6+)+æzqV!֗> OV__EisiqG10h1_s.i֥<1>ƕ%yb`#8$]o>y%FխuU͒Ȼ"3 ' QNO^Um.7Ϲ#AEPEPEPEPEPEPEPEP_v?ŽgJ>`ԭ9Bϱd*#5OƾnwɥOMs W u>+t4 ѣ`|ɜ2I|B/U&MQ|A&iϧZxzРd3qNI>$ѴV濸k[+ɴ⳺sp#rq,ן~4\.xB'PYclld gW8M&?QVԓdKyc2i'E&/%􋟱I4|:_C|_A귳My%wi&BC#;3^AotOOÝu.nSm}\ٶ :|4:D i#y=͑,eA$=O_% .ä E[ 3[I$!20GC|K{ulHFQ\sxKOß? /=H'MVMN^3qտQ?$ItKB`7숄+Nn1ך:-m]@Zo[I<قjqEIQ\V+GS o/L]b@Oj&ݴ@77)#P|E3h^gգ3GIv<9׵ώ-uMQY% ^ >蚍:aM$3܋rp+7F7S~';Os mo*0,񘌌+c OfwӾZK{m—ڥSOdTTWw^ x,?OC;KПE`dy,h''={ZorQEQEQEQEQEQEQEQE-^k#Rl AG|`I; G|`G|`ӮhcEPF>0IhF>0Ih}8gj?&j?&/ў֨}Q?$4}Q?$4<EPF>0IhF>0Ih+y?zG|`G|`*eGwv*DNUG B9/j?&?&пG'' Uj?&j?&/QT~Ѩό>ѨόEQF>0IhF>0IhG'' Uj?&j?&/QT~Ѩό>ѨόEQF>0IhF>0IhG'y(SYd}@I'4Q@Q@Q@Q@Q@Q@Q@Q@UX4ubY$q瑽wUTZP_Կ~:!;KAoF[}B_"GxmJmcgn{>o3$:U+m1938MsⅪM ;o_r_r~~$k xwچ!7+nc,@$_ut/?׉V<9x CViHcȀUgNݍ;_r_rm+ox/ }Zkr~i1Qbi5OᯇRmZJd1A3)3¾;_rӵدy@f_QAC^w_KG! MdE+2u YXɅ_rMq^X]3V{ZhFiQf{u/9Gu/9\^B?׈е?- i1{YelmGG;Ow/4=S gw7PZOq$pY“sߺ(ߺ+WO[Aex H.Ī Œ'/4hOu$RGy,E<Ɠ\8u,z?%\uX5XXw))$R)Y#oB=kǼ_Jh/^ \O.Gn) R՗x 3^|E?SGBۢ((((((((-w״O dxIb{)+f-e GzPͿf*F->M*_+6O5_GM?J?.;I?1X3z M?hyK+0;@& #v'>xW|xTu}Nw?u ąi&'vA[@ni#dtÔP|qJZpm>K噆ݤnA߁Z.ῇ 4ZK N@R E"A Ao.m]FHmK '%>O^mVT-g*H,bk>!tk][g& &I7ndTm^i"YR'Px;JI|?UWt[/_ /[{],_$TWu$V%{WȖ7,-.fYbωs0]2:d׬^-~-6N? .ƞ ] :"xKh:dpkkOykzKiD,r͵"q?'toIYXV>bxYfZ XmnbgcDE rHp:w`MepoC=X^ɟ[^n4اH弹`@P:*iVw5袊 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?fotocx/images/tiles2a.png0000664000175000017500000006535215247006660014361 0ustar micomicoPNG  IHDRԵtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 204 271 1 0 :eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:271 height:204|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:244 height:184|],c IDATxXV{'vm@A0[غmElE lE$_=<f gy]jf͚̬u6|pg>NNNdee)5;;HIIAbb"?]6Ͷ}?{b=2`Y4A۟A~~Jfy VnCi3\(#@0`=56kӠp@vFZ2{>/C2dc+aR\$= &-Y*o}i3Yn PJ`p1nc3@X#, e1p}-, OXY}Zs@89x|c􂎖>D|ƟF~B Gaֵ3o.|ZV5͈FN}kfr5zMf,,ߒ6++VfѪ+0`@ 5Ǯ=~{6\9 sQ^KB|vZ5b`ܸqppp/cǎň#̇PO?ݬU Pv,XꦄIgV0k-kb՗>s!ais1a= gVfYVt6LvaI*~6jWŚSWۼ}x_6ۿhí1J WmChJ2ouy *YNF&`Sֲ!U3fAyfv] XTTTntt Y]*ro vY #8?vhm{x5!!5;Bo]8s5ZԼ/V8K1i8u1z_@Ħf!'7 vM4T{i@3 8gT+,k]M6 u.sVS:N;""غugi;v {۷?ίJ:OPΐ4Aك:?t5 /+ !!!J` Jr?M4 ǷN;wAikh0*鉸z a`O!)MnkNak yiIAFNrr'r2q1 wϿtL-Nċ!/)mSVq_ZTB-}.ܜAVR݄UBOIt2^pxhC[M⢢ܹ+mYܪyp027Siu9}i'kOeSEbtnZFڐ,d;VBO׍DD%1~dĂFծ7k2a]G"22ٙm},>kYkĦL)))l۶ l*… w>}E~Ya߭蒒|\> :b%!.)".(@LLZՅh7Q^{ #v@NLR25:e$A΋G9=9VOda`lk3(ALT :'!oxA#!ˉo1xz.((3MTE656 Q@V֭`hji)i {>!_<\b~^s c#! ~vÍe˯0m.D.]RRԄ_4R"FO[O*%nG m8)V066,FLlAXJfjf@?~}hvP7c}XHH͛=z3f ++F[=ydݝ0Br >QK Et2c#pnu]ٌ@B]Yc#ZpV:Z}&6E#EE5KluM]]tjo@ͯ/Z:uȑ#+hS@KHb= ,PN5jXtޖݚn #r 㘫+\OکC 5YIO`D[ ύ- AIkn8sN>K1ږ 80U@KY-Bqq}@*@ia*]zZ0eӮ= *Z67sqFBh^!}z1eubs{ 4]k@W=fvqqAhhhUXTR~ tl~aվ [m hhhBC`yyyHi! #vTEZ6=*g@GCZAǮ!E`S^&.ɏaEy9hhj :PC^|Ov T~NxIqx1,45 #cO)i9X(G{aӒ)5׃T4 h`vGz7\j]7.]ZbŊ:+7MC޷ݔh:t_&MgϞn###_AAA_䗕]]mBp@GW ѾG0 0Xa9K4N< o:x2 fʲP2̍[1̶˝(_w,w;CTV B t(ֺ@rA1r\.+A>&;#]p|2e80 JwN/@yI:<:d~p=SNĉؿλ@fa! ;W22ק34O}Ukֹ]me*B]a@ h.9BU]im,uʦ,--agg{>}:jC_m |L>th+EIp/(O$#E ֝ F\s\;haO:'7MdY7,b3sF[P^,1nf\O<^\OQ6\áG/QPQA?~YTTu%JV]twwǾ}\]V'MiHX,f6zg@Rzͅ5 uc:77 @!&StSY8{`$;vBpC\Dn-7CҨnC࣫c4ѵ9GFmKҀtMlM""rpxtLQ? ]p-7'AYF¢H~4>aҭzuI] UD{Fv ɡزdźAY&dU,% "ټr"ֶ, h$f'a֧Yq꛺j(ڐ뛺 ؚʬAV4{S_':Hġk!?ªhgn9,TD| hpJbފֆPeB* Xʧ(14p/*r\-58!dN ERjyE4~1Ar+rfe$6FN1jAQ}< u)8q 5Mq&%DJ *-[3"2f:D<&^w/CM|F-Yjғéatgu_|}-ŵ;g^dT¬=j\} ?ˮ#X׫2,>嫕4v~Fut/{ں| s+{`g][uYaE6q: 32uY,VI2ŎeKSεˈ2%k[1ij :kNK  :t$ak v}["5 5k Y) o5ˉmo X,ݭy݆~{`شah{+MK0n0菾aqw4J6}\̕ej~Uo3|\Aaׯ+mc@5G#R3/ PvO5Yp,mV&uh׼7t#mnraY/^5!`Fwm7 + ymp@)hux?b9s@s@s 60DehhB:76zFhpeՁYl.r8peՁYÌ忽*/peՁQ8kPnCm~s,tma~OΝ6;44gPnCm~sn!ϻ[r"g[|Ȃs9[a߻wpi#(gB%NLL›7on}.<tz4yB{,u.t =ЭϢ67؍CzݤL*S)!8 DFA_rl o]k Y =$+?btu^G;($q>,$DG!88GB8)fp?*B]3ib;CXD>D>x|>8; @ ݌?~_ = Hç|J rpf<ǵ2Xvk[pk&;Jbg-쎟Yp\qվ=5`3?rVݨY,+ia*We(>&^BBye<9JGJrE'>6㐚V/Oeeex TM6JCb^ܧR=>~Xpr<C7dnǣ0x$eɛ" *^e%PyV$7v&\,bʸ,D!7>E޴w! :24:;Boxq.n (w2>x Ph! b;vPQU&FGy#D%"?;= H8]+ĵO2Y9x5ޖ>(1/³x_^>&9g;5̕rzx v88^':XPWOZKcfi&q( D_KmHãæV>F\!1_vj=@|+3-/(}U `Nxg9 8 o%5Lq*03CzBə٤ |"Bb - !b άwoQVo,:RJá. ֣#t3tl67Jz+")Btz|t^/ۑ=NEkg Y!xHF" lCt홐$VCC{cKƆQ0s@s@7RloB>3n?~_Gp^?Ҙ8ʒ5f.BSKBGY%Iiqϰw._?| [-%s: ݛ8| ִSIAܺ#N" Vj0=Yi[`{й42s)p$''!*:U1.\Ez ~n=xDAxu\')od]tg-s{ P{u,VBV[_BA[b-pU[XZ@FNv 06o ұ}4(+3j( %AD.詩BUC\mk -sX i|˟Kf: ,У LMo= kJũʩK.n ;5zO^+$Et2;ǞW1yhOIᏳ-?4ٴcU9OnMƄ+x^Ƿʷo\|2Y'xp+y(M&k{ W."UK.>8,鉑{.~L%Y{ڪW ܢt_8/K*܌$EkK]7tūdn[Ȓ u.Ql?Х|`!:#ہذc/ydR㣳k/¸-+`)YH<9 ^7d1뺺`[/ފW?ɣ A<~^uKywڔ)69 ]:wY0s0А$5H;Qϓ6dUfqQQO5P qd %0aZ+[VD_Znϛ _/.,?ȌʷJ 2}9;@Gسo vီ M[_7rrS uRy)fPx>۟1=0yd tt+p"Ikȅ`qIU\}70V Ӷ@jYEjdR^y@LêP8Vo0qDwZ6Ξ=g܉}m Yx@YiDtOū,9kE;yu\5:}qUbHjʋq{Hƽܵ燐(+ 'I_< !RkutBQ_*۶AK2=Б3yUfU(;EI[v!мTt!YmD5 iPǹ2\(+L߱_\`Δ~бop$_Ƀi{O@cP+tP0i$?ߝZ,ǢBu?sӉ@K)ƇXF}A1b wwxp,r{&wD7%3Żm?s08]kJ^W[?5sߖFG2=[,|9O^'{&psqg'\1PеģW!& A@a)/Mڅ *KYdU_s9}0H7)XLx2Z6\jɄ*,R jF*Ҙt.Ia-ϋš c!f7^9n:ͣ~qE EA2]h̛?τԿsn91Ns&Zfݠ./+!M+pw=۷MOh߱+&.u[p;w!iK|$]٠XGRtϢ1J :V)ܿ [T yy>z2~ 2UVvC[EC"$1 E9 غ|:cu9 Ǩua^"CH."AZ#",ZDLd"yE G ҥuHhH[VAdō[l|"Kk_ 9.:~~k UbZ'Q;&—ADŽ"mu]r>CU=ы%s+:q@@_lmiL;k1?2?ƽ7ht]Q!)t_j  薭??Hn}zh`'ۿ c_ 4nY0l~c9 [VtTD8R[rI.Q 1,[qA~l 鯺UܶV4W\PՁ,47نtzl+#344gPnCYKN㴜hU˩c"t31Q5@?R9ּp@s@s@7O 60}hnkFN^BJYKl<\ rIzGlvڏlOERT 6 HPɍ\\fVG}N{`OnqͣP [=cJo wrcay\[g/FhtUa \h W4q X7光}|̙0#FN;pyy1X>w*f 1S0k.W"QAzLFbԸf<_|C7# T"fv ҜErvSVB( 78ؓSl _|FwWØ5[[:5SFQZ;ݧlćZ@{YH fEo^?U~W z}eegBIJW}ۊdC0fNU''+5J k+n,~RfX#.K(/i9u㡢 /%19+jb#(xe8}% t -]Y&F}v5nc\O LذT?y>U𐟓4J:`[5P~WDV OAܝ UVERk9g(LP:D6u x%8w"ژ:2_wLϮ8 ΛRX,qy)6Oϰgۘ_] =!'CI 7J£c)V \9pz_k"cF^"%)m8y Fa)~ HzŘ8}.._ jXHaK8f)ޏvE`;Wz#$$ a>g(×Yu ;[#H*A]J_<))<٣;`xP UL Ăq6h_f/šruB"8B ЕD^G1uxF?#n租-+fa޲5>Q Db~NontU uM7jnozH`:WQ:P鴱3wd QX_v$ 0KU$4 şB \d+5M܂JLYzA=<<9 "8W'Я˳8jX Ja/:آK̨^  |/Ig0nJ=' ftLͨʸد3hl/iX6El> JHA?@EGW)O 9%sXZ UiCWQ̢)/{!' w")٪K V(yKPD(Pa^\$z9l1KƇJ0gW\>>=^UZlvhE M7Fo\}J%AGU?8 }h* FA`&wp@ ;YB^ ]y_BT/v&x~rUe cm=}[UL̑KAcg 5>2ׄ\ySzcP3M8 1^X0021E606AGQy!U j0/6Bdp68[R,JM1>e8wlJak5#%CS %!y=XB斖8:wh~QL@|Q#zo$G0* V#[;F@^J/y8tQT"8 K"pz9u-p3xEIvȨ/k{X;nfք1JoK_b s>(v#1l0 V I Vq@D- ][$'^v8u1(%ѼyTلIq[GRRʨxot7RCGqe3Ck7o>ƅc* NG$ܹu@f] a)Ul9r!("WaHw-EۏLESD>:%9}Mp?<삹"M݈ ٿy]g7B=y1~U[{ZCFD}v/tiշotvPY"ϵϿQ@{d%565ô + %kSx0xǧyav" S=M(khzz:76]ФI}̭J E^CQFDUY\`P٠M4VN롭 UM#IX`ۉ .)cW ]-]]/ KYRM]o3}쉩 魸vP_`yz[BAY:P ? %FaѴaPߣO_i>#CkhZ !70_,/Ic8~~nөOv}ªiǰ5TC'Xa{]Ģݗ{Wi3 8Gq351d$S!թL'bøv $gCמuq-tiq|<<Y\H^M]R@p[nHXCO^♏/ޤ~fP΢V|Ódx K+)Wk>8?/|>Dh~:-s)?C9^҈'HHJ[e,)AtX <"!p;Z=ZIL8?peŎ vyH,; x s2)""IVfY]~*GA]\3?w]'x:k{T;Wp38;8r ?}N:θġqW>"o↔QL/-R!sxzbXAJsG^Iq? |a8tŠ&['SWK]!C+kϨ>+(L}ͰV< D0b\TTGzXBN^)5z`{_|z y tgR8vp fϘ&}C7cʤ;v Ϛnڳp\ǍŤضvƺA~ޗ M6N *DOBnXY,,\qTBugJaG((+]LH\c1q(⫢Khq=SC:%6 ;.#zӧNƸqt6.XU,=+p/J\H IDATذf9&W$ bJ$+v,T+3~Pĥ[9C{`IK9=&X}(\NiSZqS*S. z6{Clv\(4k9 NAK Ʋ= jNx<% گ{ "ko] 4_;tyAXu9I8`![Xtz@EgELx#{Q\nR]0 sgMFwc]J&_E=ƔQ &.^CGaS'&Qޘ=~A'b0IqC Tk>An 00ԙ3050jd,]jP,\ v#@ jy?< d!CzR c6" Vch^0b4N;7F)> kKW`מ]X0c(tҼNEGX>; :iv/^AsB, dvp>k7wC|oic&`ъT""i~G^F? O"Aw8:ۂD̰^>.C[Z}F doy\ 7r[i.Y)ΦzZJQWcnODvV:"^܆8+ 3urr(S +t^(tnU9/{N(qIObUDP+E4LOH.ЕH*%̫N&3?+ }H<8,0R*leIMs *G ݵXb7рzq8q?i c*d)հZ(=iɡرn:I̍{Ư87QDaA>2SBmt[ςdn Q_v3%b\8t(iPǴTkLL (TzLƮĭDRlfӀNL}(J…á*#C/5$NQ ׸F~颃9!2„KH2G \] 4ۧX5<{HIJ c8#QL- pw}ReB\/ê+r?X*f4U. !b>k^,R~ mTiQ=fçi+D=kmJv];vU!vh+H`8~TУzP4!yo&[CEHze@cp[7CZL {ϻk*M 󡫩)jeѭ0K{tO<\4V^kyqXp pYWٕYFHsH$ J'7IOK0k4ZY/s.ܩ+:șal*Kq&e[P tĠ~4t ׏8).a^"Gȓ  ЉW-b5SgRQ0Иj tIs GTҧU_KPiKs_b>׶OЧeaRP{ѽ9QcǮY{&2Xp%$Ys9Yk@4.. F[)cePX5mHM%`J) 6(a׹(~c׎]1i#x|qmƒ-U@TCivn@eÇ$5Fb奅5J=p+(IŁ ߺbyxpgWB] :J o,9B@^]͞4~݈yhG3 Wx!G<"\Ą%-+\D3b<$F`=4 S{B,/3+UQFBXN3֍,`i?ٯy d-t^%8y  7ACN[š0hJ@taI *ƀٟ~4-3R,m),~~!HOc!O}@EUjսʒ+XqlbHQN'P=_dP~6BYF3~! L)_e Jb]E~v,k@bv)ZJIcFՁeO< 11\g/1A+Z|̡жBFOG!"%B"eL3o" 8~ e4wi&")HȤ0EpEv<#""~Bm!!j\n gȬ:-kt)c_~|ҧھ#l8_O7*ͯfT?8?Mtr3‮r[RE㒫|n* ڬKP¬GYQCaia7Hy!2b}IOr8BΆ0;t7T"}lb*3+率-l>`XӨi KS7Y XC weta5p=zo+z 4xt,H^`mU-}Q{[+# ЯyKrxH5+wl{ Lr@Iްl0k_.ǓWSS45P]B"[YI \-aAP!]%r*MҼBGIf0s6VoI7s2=[(Xx0Sô?v!J_W\]뎪u5kFUcG(5 j"x#Q ҋ{C=Q߻|CG4‘f}oʞgO?|!. vM38 F qt/3~7}O/'}$du>iQ{HNM-"-;><%t-I[X_Ja]zNI X2|#>ג\|'p\=Õ Z$+/Z,Եv3Vyaݼ 03;3c7OWL[ p "c1 j{$Ū%-KS-! s33:u9Lb|W;\~9\[VH^%Y=Wro7s)vx"."Y"4!o_6\݃{8w9ԓOY*a7qr!BA6ƙ\ۜ:}wI}NJ4nנF_Elb|>AexxG CU1$FSUG W&OD9a X%KCOo"ֳn?t#;컸8 Vga/%Ϳھj=;4Mޝ[{6 HOpcd4y` ݵç/HZ,V~x@w9Ia&-6%1_u] ͍t7٩HJM6Gfҏis?lf}oCݤtgd1xt' iDOQ6hн )K/^ ‚Y緕 iETx(:CmsWG Eqa~Z4 Eyx ޽{[*+]Y3 sMW-y92w)>1QaOFmVyyKa,ݐmiaa@fe˃vo;Szc' q*4IZՋ\1hH*w7gnXHM'' o(+Nenhcfm4@?o ڴ=4t/;3u`U 4FA]gB9qغHk"4pHWaAX2 U#ZQ~m >ؼjT˧ / ρ&&\~"Mioz896l8rܜw^B0țI$vf;ƍׇۀx]̌ĆdfrOsͻs@W? xrj0 BzF}S}+g`Б"k`u6@T!u ̦P}w]($̡倖iq6~Q%%g<  p TCۡQ/A/Ӽ~Ie;= ֣)͌bLe!d`۲ ,T]s|JrQ3px,Xfa.4441m8E1%JĮUs|Jl~=\`򲣽e>6[51/&¶VH/,=}ԱQ,TTuFgrR_ jɥ/cز4G @@UErgМ4;x =-al?%0hágae+6Y#V,*ENƍtYk\lų'`8C{W&hJgNB7X" e8i&ԧaH&%4wܾRkYYA>gBwH' I1]@=շ8-?Bs˔{-*coBl-ԑ̌f rM#WX{f(cm'um ~f .JGsLCL"mSk ǜH Ж;梟 FjNѻ^(ԔFIM؀%-sg6B(64ϷQYJ4륳=~թ8z&lWv4՟A]k!;r #ӵGȐ2I"E&jbm/N2btYF欭13}%$P&~AD!S+*0\Β5@(Tj I^<8u5|JI:+!.v M$"mS#+ 0p&9{ʢ%X:;JꆁD p&cy3Xq$ȧ)Ej/~cut?ӦOر;<[`@!~ lHޕӰȗҮph I&WmhF`o?|}}n 8܊fnjwJ*ZeL\WwaX?ă`o{ P5\ zws^&j$14m)bq85'Po1 TdI9Zh e#4'91lep !lCON$4Sg+ˢ= D*B(&ݤfVCr4bq%jX{2Lؓ4on=%$9.DZ=kяyeW8m{ I(.ƒ+ۇN^{P$AUdK*jbꃨ")xi*2MaXz .[{,l]z.^v^B+!e% X;CCFc 0YK`)7?`܍@LbLXez,׉1v;I]n"0>'L~ ЌAePI4Il]:<,`j &;AfqBm58ԏZl`&AGF#,^ F)[v@F9SPR\̐EV\= P9zHI94`D-h@ja6X퉸b Oote-k:}#=Z3\W(=keX=o2fERq)D"!h_: tJ=`S9@Ki:Meys@ZbPX48$!fi1bLNG)E#`:y]ˡ2p({OPM4_h<9৭oxbc͜0=tde*Xvt9 q;M;E:!/1`m46pptS{\<9>~ qh!a9$eH K`p rer:;EI8 M~ĵ;G`y8֬{Jj̆WT"([,7CAa)M'6>_5ݱy<Ȓ.]G}_9n݀ _*Jv#Ga3x!twW گaCVɹea'UUR^> Ȋ|3SkkH8r5tc̞܍ À6l QX^j\BOKuv.x=2\- lnDKw@|~a#TKEȎUZ22޲i$X 0{tش@m_|Wu ~A2Z#Mqqja5h D.6:02UDw:05&0^SgNUyHZGf>pHhl`gF|v> mIDATya ,hha}N W#(,v-?Vhρԩ00ISp*{΢~-4r!,:9TIOFb*[^bLYv?# ~D`K4ˊXsROiY(hW^R@D'ģBH*uCٯh18zN܊&ܑ\hE=R)xooo.")eE FpD$KK3-!KK[5ZQ>{((BLd|IZzR^^xL\H$~R /ދ}!:6Dkvnw++%tTcԎaAO@9'պ\PZcuNʢuoT I401Ge#4r,O4[J*\/; )nId'$ڌx َ,Dt"FtV9AXT@ݰc7mBs (ھA2tF:9r \y,ixGmNSxLB|ݺ ypry^,?ƶk(]qRzOw(Lˆ<Q'fRNK߲d#!m:5#ݿ^ 7+2C~f-Ōe+F*rGi9@ hmb;6}0}@ҵ-}r:9ۦ!H2ߖq$F3.";@e^JS%v:1>MyXKn11Va|u^42Z{E7uxmQ?[A޽yEXqt''t渝6L.Ah4LFm IՎPAк<{l3CFZ2؍l>)WJ"BF2@Z3.sszY^̨9 (`Kܚv=Tؽg]lϏcv*74&M^~xO6:=1URBdmPz%Lz@+'hmi^fl k\+m~H9#Sv=0V@`MJ&"Z6b@QcR9x:%*fGx0P,^Ju̬< _ϷMmIZLIڈ4hнx@T г^yyIENDB`fotocx/images/red-eyes1.png0000664000175000017500000013204015247006660014601 0ustar micomicoPNG  IHDR=~0tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 228 353 1 0 l :eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:353 height:228|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:317 height:205|e IDATxu\6~yy93sIwHIH#(baw7v"؊A twwwM[T93[wk_k}淶555ˀ^t:]_tx:@:/+ Yu=~)[_TUU(++^+++Q]])+Y7g@3Ň̓:}>Mb"??^碢"&_PPv?ߧʐYq TnvsX~3kׇ/J  ?AV~'+NUNOgz0^6c3S-;-i_h?gyA<G) ˩yD ~K?DLQ4n܍dZgMu%ނ h_0ʫ>ݚzWb+?Pbaӷ~w]ucf}f|>+XT#eN9(+AQISaa/BJgʪұo */6U'JAHH222y0u~?Ewصl6&JCYQJ$%剘>VTg;+ć8 CaUWXB]Ci],=K7߿b~dt>XY~feL~Bk1z;e}emf2Aﳂ^쀒8;j~JJƎbS?j˺:duК uxN۫x~,4'aPz'..%{ЇL{زo9 CRRRߒ^߳rz ,>|dj??sM9HI}Rxr;C(HCHBcrV#.:a_ի{ԌlTZ.U#?' #eޕz2^Ϋp2V2P;r・wӸ$Y F` $gIOؼdxgqTUY8 EȫW @Y?e T:β4[ G!zǶ/ ġ>c>RA)|FrxסሌGqYjyi!N C+,Ҝ z4)zA-)}R"0B U\^ep0_"61 %x~zȋCZ! kwAf#, }Ӂ|EסBzvnl*gJB B_ 1EqDfnh$X|7gggǭb+sVz:} VZL. ظq#&N$ϾaF7:pUzrS'BFN! "+l $&i-c8cE^F4v)rUCS :Z s 퓉Y,+/$qW;D^1E*KpB|׿b8 ?牊b<;SȈ8f,Ĥ``i[O_,zk0|poK8GLi+i3",*Ą>EP8D2<tLŹxy fz *80Uy.++xEĢv* cp@^YQ/mJ`ȏLG;ś,c˖-ۑEc &p@VX9}D$+2*R~fMV:Ca}ž20Mp=K6$?aحٍB44T3bĥ`0.+l$Z`y,Fʤ0.]ɓ'q xn( &G HOGR>vu40hχOT p2 ̅,u0~g9MBʔFC]xT*j|{4ZQHlpP2-̧CDP*:DzlƏ)pZ ,maUZ 1b|2T_g1! BPW_pkS@Vi @'bꝈ+=y%Mur88# ! 7c8x~F\ѱ# %cd kKcKb10]i+K$ƑCc]yfBZ\#NJc^K~gЏl@YI XY\H aK#G¾}8˯og& ~3Ґ$_ Vĉph[he ٸ\t2<-yOL6RCpZh+SxQ_ $y 4yYR=yyyL4obsښYOK8  ,fĂi- !<On/µC0# U^AOBBa刍N8u1j@FV s֞@IS ž^1T GDb #nb!:򼪮7l d'bGH'N u,UnK@/f(I`Z/#c-Ə  A]m.NY8勈<{"PT9Ko bd(q>a3Mp75)X!aqZ.7lj ,)"*EYVc1^@" 4|`6zȒ:x? 8=?gm:kzzͮK҃G8::r[&;&ÞCz ޷'Iq 6AMC6+p;uh( Z+}(>.6`Upku9I+z@ʳXE’ XrEC{,!?p gjqF_eSV\xnQ ZtҗbRXrjJ9?YmI4.2(LB%R'[^m J:\;)KV8A s}AOa侀pgiԡ6h%9Z A^A Ӵ0uTeee`d; +*ڞ6#B'hǙh-,,ҁY۟Gh; Sŕ*- X\( q\}egAϚ@/ůbmjȧӧx1/0kK饥qA Y3 =z+VPO2(+E9 >u*SMS5*m)Ka(R"R8ZFՐuQk E*z9$SѣW yD`) } P:MW( ]QԌ&Z^m_) b CMhdPt9;d-DAE,Ё Heދ P#Q/?Zf!&&$ mmlōcJ)/Z M5\J/K!;O9p%r+⹮Uc1d)hNDu^Ks9^^ -EI~V)J|1,rQmTjjqc/Ԥ1bHe1KkD}QVX@oco(z˜O>b9oe=/ޮY\6oGo{Nj=;joדH+EK*TuK(&B*EYib-^F#,${]qYJP&\66P޹ ̧7k;(աW#;=!/Dȷn݂Ν;]I ^U]ƘƖjo1%`M).X uy +a3%G#6* Ns7'ɼWq~֫)z[L\BKeE9ѲuG4jF;XdiYy̰^;7bfWWա|cX`< CkOOFU[/ct99xvi=EE07Bj+뚹p >p!lw1YWwbgHbى{.;:nyk|zO h @i l;{7NL@ ,&<5n 0 w{YzLEQڻ>3Od{0wgm2;Y[͢HI!/ ;T-}1O]?҂a08 3qq"Y.;@ɮe40!q{0y#b;S܁(7<71ʁ( | {0KY4+3;#WQtQpz!ǽRr+1ągj7h`oJMq÷P3w“t˫Л(aCb,$P8 (%4:NA"Ҹ<492!BBB”1NH lGqm3_a.Id}HJJry#FȄ)8}'̢v0=c(%1@ǎ!'² yDa#;KY)L-/Dxq/,-( 9Бb|'$Tס"':ʔ:?-Rn2cc~GgJ>gt,JV!"C}xQصs,L ]04#kkS5"i"&ilE!>7ak0m4hjjrRD֓JZjSoXqNιne{;a`d &lyiذ[vuƓWq\Jq1LҠ"X8(!8RG[̀ a;XJ(ڙpvC{ IV|qJ޲ǰgf5[O.23`r<{IB,?z:$0 Gxx2 e< >TKx KaenBcd[epd3Do؂"H 1g 7豱e8 `%r! }_w߾}wn義*of=v~ mعe̴Tɒ_\ܥ&se@c%^χ|X`~lo{X?Yo>N2 Ch >&Ëv1A>I̬l 2}?3cV&`d* <Nk0u!`dd>Ղ^ބ}سg\g6w*2i61 ` tZWO#(̊b Xbw7Rc}Ak=ߟ}b~1 `yw }~uX}=]z~sϺgOi]~<ǃ_+Wv+\xAׁJxRxz%g_XicYuûDv2uׁ?0cxZ_ xukxz|U:_- ρ-wxAׁJxRxZdÃz<:UzU X3|?h@h}pςB餩%is ^7֖\AEaB_.9%ix."S뷞}rc Ay4 +ϟ<Ɲth Oy%31Au*T}>om? &6ZÆnio)U*c=TtZK'Z8 :sKgWfS]Bnرzr T%j 9_wuҁ.k)ʼnж97FAU=_P}m,;p6F8F:0BqVl]vŲU80ͭ ÉdA}samm7uz=`.]v4:n.;^;6b\;b xQغ6pZ׼n2],\I*PZs`7SSD+eˈї@88ruMD5ili`yO4 *_L a֬vUy(M3=r:95|6{uFMm%_$T4ok] 5˶,I&Ђ`,1a1oVXtLx3=Y- EKqІA ELYx-kÕs;1 !a]/q6@[gbBx vDS?f^_Le98q mu8cG _蠒ʊ$R)Xv" p7$Ep+ MhåZAOUvEl**3f0 -5u=F{)*AEy\Dasq8탂:T~wAlĐz iؾn6*O9xKׁ/V==].Z{#h9FFJ\ ~`5SS"殂h\me[܄1n0xVFOOOE/EISӷ ZB^A%-9ka:^uVRqt64mMQ:a&"3"7 fO,tc}-?0?MUf$>8EyeZrj@fr[j)ZP_cm% -'aaa KBЙy;Cp+*;< xj iF($X0c h9n5%JOJ !=jEivV)}豀 PŮ}z]?Acu`#+:3*k4 s$Fk4ؙLd+IIs6_uWף /ca]\>:Aל˭0BXщ]ʼ8ly.)˚#. IDATgdjGY,҆pXO`)(2c;zYm_]WS1a"k_qIYE7,ӫdIaEOD%ЁHNE/"POIov`a0txAa8䁲*nIzxEa] =8\?2"BX0[pNHgQV[2x!НqeHC|O**ڎ֦jE=dVu ց.㒓gAp.sZ<>CG`\^uaeKݲZ& /̻@/01ǐׁzeQї/#xAׁJxRxR-OCxAׁJxRO@!~ W}d*+@{\õW"2E9x>NljśGxE5 i Qh`p鼿זS_}vwߗ]i^>DK\?lZ둑$FmlkiBt=|O&R@;xO!Gnc f! * ~bDb51<8u.m=n`4,U ~ +2o>v 0d)[H&62ONط"@X^?J{"0$O.gÄrUfc:T-UZOkǴ\K0a\CiyjiFԥ1F|U`IP7EhI5W^~J$_FxZYzu0K#Ӂ?|#oJS\EI+O sBRϟɾwB\e  ? ՘ ֚0_iPáA^ Fvց?n=q=vÒbS޲4퉭EuYb%*]Sk;ٝW9ĚS47ԔXxf[Ya9pZRs@o?=Սg#]1w/#~>7|Ž2fcUKE=Yz-0a>(Όƾk1a1c*[nR(&mm=d`%ûv?qڿ~rNNֶvrvu2l۷GN$9s0lZ sf3YƲ5ucw,9sz^8X.ʛ߭0e 8lq\Q$M˱T?dLJqb qE\N#9qpݽ6Yds##&vzl"oa"GNL6vEtJ; nH޽k<YAJ] r.G8Fo_V$k71)]:x8M7l$${NdZYr͎ ŎXbiGRCM|_3}7kl{audrl޽ θ~-h^,t^̮6zYA^CZB*S~ϞqB]{,jDyb$5 z >"W`(!7pSV_i-ݐ<-?.\L0*8Cg{z-xzy Vg4VɍClb`dK܀<{"u8+JǺ/"m'SڛҾS򓂰pF,{'qY UbzOC k!#0 J'"{`DGY^׌0Ӳi8͙#qɉO`@{D$`紌cVUP2VoڄVa:Ǝ^+ωrs;3ޭ[Co"$ǨHܙ'״;P-Fح؄T澁1ƌ;Gl޴: =Q o?#zT^ga1E *f8}!^DP,\f.倯:ߗf`2b}13.c+(_,gqypIkihCpJtQVg.]µ뷐ް@1@#dq7%xJ'E M,_6FDFmZ41V 1de`K. w\:AsKLj3mQ ??#5#9%a踊ؐJr#$'"hµb/2hvcUCJ[1,7ril ^W^Nj(*$s2eee(+-F^n*j0oR218M{[Q*"P7D`Zg%Eyu ˎx+, 6a2ΐOqkmƹ1wy>@^IM:1=(C8XJZ6!;%i5_jfDcg:Vx6&r1G{"y^^ #<@Za YMz ARmg1k`Xqa>JIIDFdN7cTynvGbn)#^ v#*s 5 >qhcDd4t j{.,*'? k@`D棞mĵm66bbzө_=baywce Vv\U11Gގ/u9][<ͧ~%q{-!SZ\tdg!77Ox㆑#e4g_ҋ} cq4$;(? Ǎh꧌f:dYO3dxV}ܔK;/NÉ:д!8&J 8b+],0-N3`tj d[/F ;"( dΧvN951ݖ^s 9Y3rdcR "Z OWGhYaD~iHdLDAe5hO[~¿3!: '׵跃iOoB$4tO Ye%poXr{(#:^[pJk-M5XEA-cl/ϵAA#pa/p\ov>x_=4CWO P-,_iF\%''qG4lNs]W#|LGؕx7F >}_{}|6kks)v⻿KCFVbD%*&]Ҳ~~ cvc]ˆ;ȿc4,'v=^#Q -MGܻg?.ǡcl~?#FAYKN@bq625Wc UCdRzׄbzEL-sbcpUdׄm*MDžК+t~JkK|$P(?cb/t&?<ju6~SW̓$}91S %+ ɮ1'Dj Q=ד |/JaG\;l-i U5YxV3S.kG`^א3`׃Oz[̭8oFKb,ښqlf7uyfDƍ=}E`L#Rō Pσb.N v#qmKC>LV/?5"$Ѯ'"bX%UiFeH8N]lFuSn@oDt2rן&M Y>FHCM]AYz萡9eVf3Qa?PFKh/iaԴmyZMGe')qj3ړ`d-Es!o)Vs6-ML %_ZBy$_6rA^޼>֘m:kD`1 8Nʭt41J5z6/,=e{]OFcS>XCtL< PqiIט@zuSƬwpnC-Is6?5ge DT|r%}ɣes5ʔYzfM\Ks<Ԥ 1]&7!t~sPW˧c4QCm-U,[s|W%Ox6#/:tehB:tDحqe/Ȧ!5 ] T<)(($EqX/˃^ n|A^u:|2ԬM*("-9K,Cbn< @rZ2S~jrpq-$aXZ%qhB^~KDcJQv,lmˏ)q51Qo$Pė=)PaRn҂~O'zx9 -K8FGp>.3 un ]sĒ?h(~)h_Z8g qXӕc" M1=W}&SW4vX찣t$KG뎀N.hr5r<cdycD|L$~Hܻs toO`#%V 23)!< M6t躹&M>G6~ؽk{LQVBHioЩ.NƑ]0AVacg3i{ V93F :RМa8I(L TIBړ!7A7Gz^a,J=+ ؽk3LgL'LPzJyv0 oYP:C~f@RC7$^JDHUf״5b U۸QL-ha -(etM(j#q&s#So>-I>eYXiKnex? SAԔw=z[sHG3Ľ ۅs8#Sc?.TWЀ{p󼍴-6d<ǎ,_u٥oG:1ax מcǎU~{ʸ\rdŇʅ3xF~vH3E"g;8ܑM]wB~dl+8y9TҼ"1AOZǾՖ2rOx&]UZ7.g,O׵T1nlN5Ooduт=}3/]ox\>deoW]E>='Oq5Fǣ#9^[:&9^yxrxW9n&.{uڂtx_s#}bqBQWt]X< ,"e9Y1q'9=pnW=ٱ!>8s'Ӥߏv,YQe 23ILʇduT%G9E]w z ϜCl&'5{/qy_ n{*\[{ZwGjcpIQvWnU1Y7fsC?c)uP*$oWoP Ph_ƅF“8}''S.F"an?*;,~"g&2/3z<}2 WYV932QR'OD^V9Yǃg=~&-/O5zXf)6wK{'<=e l񼇊OuI8H:!_ 'usJ}AdpL4Y~Eƈ%/C@('Cv6gY`Ɠȯ'_PzXz 6Ff8Hm.ʈu+0Xz^y#;f333,Z!HF;w/%F9e; )'Gzi9kW¥.ڃto|n, t6e8L W"bTՕN ]?5l !c{10|/^.@8!mtzuhښq|Z᪏`k`hg%q͍3sh6mX M5yb 6mWK-=|vx?;wpV0T: munbǐcD{':'R,!&bQjړQ[SM|3ToDuWxUCCNc妣{jsqhyk~;eWg:,߇0Q[ c5iXn8a$'.҆:!1Due<1Vpb8&> bU@\tΈzp^%墦2Ym IDAT%b|h:?4#+Q )ad5-R'wOaѾo?z PTQ4$%KBX; >sSecwW ZZCv > +`"lf5Kb"HJDNiv&fƹWDZ׾yۂ<Yi9%G<=<:0xʪ4%aXtȓ,:=A)sɏ&2)(eLW!SO;mx鶞,a]\>:@9V0& +rcZ:]CTE[ғNGMQ|3Y=^ mН> ]AF ߊJJY> ٯǛZ"lkyv.f' K,蔬c!WN]Fhd 22K>:&kNemwϱ"3^dak(kj'l!vmt<.fVg xMF): iY(*ݐϛXB`LKv@bԏНqdVVS쵇lDG#&6,֦*DÝ"qOW^f(:z,9a y`OzLj#i.O869CZRStf`9ثOS,%748'@DAv|g˔<GO$h]CP^ ESsw"HJc2Ag8qD 1d""MSʈw$'7!c(7?XyZZ1d)(3|du j 7?A^̽dQeF҅xMV]6N3OqgΜ\GMܙut4#=s'-u/R^>n]D'v[T KL7Z؝Wޞb{'L߂׾y Ng=<;>Oi \^ mKb0>IlN1 ul_ki@XpY]Q?ʓoGsNzѿt/˅ .A _+W>fU]ȮM$SfcN߻߷ $LŭAk:Ν7/r}`:;}Q]=j N󸲌M0 BDre ˫euq ؿ}~qm_G/v=Ֆe!̶!:rg*q{ aa9o R`c~p5m ^1橑9>A1l\eśPu.c*5q}_n =;,CLm)˅q̵:I4G:ϵ4WnĢ5[cE{&Xs4ե8crl+zaP^7m{˨{Ǹ#4@ BILjBw^>;.OZPמkZkcӻw? a}%K)~)8SzX ʊ3pnz,_[`eLx*u}gr,8 ^G샍fNa|'% q;I1a(8g3=%`(4 Ͱ~YCDT K]BOo7]0UH;fS޲^?7\LO~fzctl?q2/@Vd"$p,^䞕!6G#lĽax9ܼǏͿ3e 4,ғĤi˜z?{{g #!ʙn`sqj2c=]kh*IǞo] NήHG4T|D\Lesns*$?CIF{8sp%eX,[Cq$Xٍnʯi"$h|ޯ^ U˫SUQn\ iq9mDΡ^a1XRA(Fgt0]R>^ni7TfB\Fvޝ롦8`hg~j׷еƹ . V?)2'(HKcƭظF q=z0KSsLͪ 8vt/f̄$?ejSkGص}5'Y'(LS[0ňWy![X߆qN 6cERw+鎰(/_gO`:$ \w.B" |޹%9W^wK/y'=8r8)NÆ7֩Am_{>Cˉ` JںZ[v@BL q ^dzzǹg 4nbp4O8H:eiXz=r A:ښJ^u6ThGR^>v^rR$@Gb t@2뮁(O l]$/Eju܈{COAU@N W hk*e2]͝-| ,ڴ {s" FAqLd ' cŵlꠉ6Tlyv{~3Ȯ}=hkHB}>NLQfmd=bXևݠ(!}=]db#5jRiqIZX9:PMp;LzSEc=phٰy -g`v}ѓx^ήNtu4}+h"wdTJa oY4NޖMB7ЉCY^gQKj(ĺզ]xL4s`HMt߭H "݆^ny = fb xSDcԉZ_Z)C$|yNUah2/ &`U/ !O8kO@^-3 BKO۟jOB^B_iA4)"l3f@Zf&=IMdj" gPR^pr:TuO˃nj=?{,px~pp%CT] QDyR)AF'lk'8w%.?P܌zx7:Iod^+PÕp>| #3RVn^q9}H~6s!NO/F&R3%?TsBy (͕pcfگ <)B3]EmshpEi4Fvk}c,  c[* 1c̹Fo ײ{$D8cr$nW1-)b͹[\׭PB`-WoŸRu7vXysmNqC|e>>FG?k5RdiBgϜ1FP ^ɒIyM#,x; YZX UV+p&<3 ح=TW ALVo06(! zG]K!6bSn[ueym=T9 $?7`Lf֖da Dqa.rQ$/st WyyLŹxOcz@YXQ˛q6)h.G1CZ ]_NӘ,,ڇ?6#Lwy뇌rNì2Kyg̜]Y YLZ:ށi3Fڏ X '3i.3o*I3}֋΄‰P#hGYسzN= B[}*juy:ivvƔp Eq!܈NFﰧRCVߊ31[^3A=z#c i?Y\@|W);wuAF/=Foo*7[W7c M(1}uy-g4Cl|?YPTT@VPP<-V)Agmi) i\2a=[1\Yo$ -[9]ErSWTU,Hsn@`k3]}02{mF -&*"Zv˫j%*/\$d䠪6jE,ϷH *'7j 4SnAɽlndQ;zƸ:=su7zzd4LUǃQ1z58 #VM 7N'0]txD?o۰\Fo33& =f߄Y=i2+wBn/ԩpoÇwx#] %T#< }0TVw(~eć;b=? ӰZ"#=w; eЃK4~QGɮ1Maي줲D۞F/'tzs c ?\%f£jv|T L𧽠aM}s.f"z`o64h)t/jH::rXzk_5zm Qd@'aޚT8#7Ԉ[AHTq|ﰇhޗ@rYĘþdEBVxlע=mo? )]zF_[߈NS9= ڷ jft1hnØZE$-_C+Ir}i{KK$DEF!:* I$Ta7Q@L`@{1N\95VBP2ȑyG:K:.%}Q3:44Ҳ:NefvO6+THPyATAܚ4!$4ڋ6!M9޿zKMHuf;A Lƥב>Xn,ōmsp5* !79ƕ_$yDtPGG!)<Sd XWE+ e0 vLC@poHH!=@o"~y D߼-%+!+8f Euķ(t: 1!:Igz"y9 г\ 8TT"#և dk!?95%9Tp%w\O{d2x=(*z hY NEG+n˘Ez/*QYE{]t#yD~7{ teber:qy27R]RRD!tLǘQU0Րh*|ؾR$NNKGzZ2^"5bM}q .y!)̆%-|9ciEFr^#1%55Ux sYN0#Xy/¢QTRD#hqY{=(xkLH_{M%;r!(-+EޛL!<6"t-İ#ڻXR{\R:`{C?cޓgEb,Vlp qaxNR5|`;u +!ًV"qqc?݌p?W*X`cK!iП SU>lb`K:,3T_2u6 ,+ {]hzTG{)w~%`& (yUFIC {p#1hl㞴/N2iu0)"/3n?/ qaSdbvC^;#͗Bl{yV<@-+1ck[H"3/ Ix؉ۏ8tz2҆lNFrB7Yܿ㩘.K'G*Srch(n0)U<~ Ex̕ "")4O<|8Ζy 0" -t͓s՛4@7%$+N 39Ӈ!"sͅ{27g{Ǝ=GGߧ(mbhATH=`M\z.q[(˃{ӏH' ZC)%t:j\?/WdwDŽ)s{y"N/#_'GA[CB}ƊO\=%Ε$x?aS?}Ha+ɻr u6#9613O<0)(R5f#:4t! yá D/υ3v3{`O44&&5393}FF Ie)w~1Fo% AeFqǗw{_W+FCL;.Sq)(O{z/g<8JGJf*J!k[O ϿkCnn"*>yv]y (5Ȃv$Ё=(@ to_e:) | xMH>%[Æ&ܽs37R`es_~Ľ~g/Q3Z 'NH, YR~"fR羨.'B.<]I@i1@0d$SyBtBr(TR~om5x DhZ{|F1ɫM!kLEI98my~:*;[#bSj$=u7\K5hhRoNaW!ς-rr/R@و(C]aBuonT{l/YBQ߮ [} -z}i yWG0)߸ y]{|뫌vdv"`_p%7@tbBn rNH'IDJMsz0_&nt}i^<(-459H_WgHΧ? i3{hB֟fٿXO&MYBQ6Nt(<')]v iY M/˴5("s$U߿6KV"8-wLUޭD KKZ>?Nrq(79p=t床ݳĹ+l +P[]b]rlCi|4>J!`Q79받İk4Vd‰Xh5k+;=^ûaϥhiXUˇ6`ۑ3-Þ9ҭH62Js `O3lz:[pzBO -nXçhOF,?Fv9Kȣ)Kdž+q.JG%˓1F0M܎ 뺭7)a>شz)n9b 7؇ J\i4 KC\K3Cl!Pz)_N͛']QSM)[BHŶ4֌7":?6ȗukC^oG=>шp l\3fÖcݔVG7σ > 4LJ?J#)1(4~fGgG:Xm6o%cN ¯3528D|p=GaިbD[}ټFPӄ-kj)o⧞N\t\b)+Y0QlLEZ:ym4d\&?jh/AlQ2Nm^@9D{A> 3 qE(I&:2oBCPGk )HaVDi. ],zPވ ,9CzGטC /X21]FcMuG w-YDU7wa~Zq8o{A$̥h"h@/illapC<44v]Mp8vڸ@Ih%BqoQyq4|z8^[D[0nn0D_޷c|-BhE#xI~HJ/J=M7-BuSET3&Sm{k3я۸"fƻATx=;ȑcbXx()YAh(8|iiXJ4iH,(;RCg;Z͐y҄ gR0v=_2(us4y:}] g(}'L+.(@eE9II'WwWZ(]j8Ϭ F\cA";+X sS 󗌣p<Tf!5^JdmA}=KRa1qՁm%T:>,d)pS\/hHncgbho:LVG.1}a$*'0 :f`gL.n Grǃv[ ƘQ{z sDQ)$/l&D~d=pfБ@b}Pn,N:HS%Pv^&C>0PMzyp1]d\c&d׾>Pa^ ǟL07@3I˱ZU(/5Mm\7phWe3zS9,NqKBr&n'##'L*ןw;F~88A`!-Cnm9KFZLHgyؾUL?!yblA,}C}t oX!Jp|sH"'; 8oYm_sTdDωD'ш̕| BIJZKI焻TMo!%!Z-WmFlvv7M"6cʴot=^[A3[g0CB݂Y۞\3v&C][tigΒ4R݋'SћCEsr{G0}M,Zjo@wz ^c.xc7S7[>!|@nl4wo{~yӱV}ӊXJaYvܢnpdGECc!.MX+88*TN0P!5͓BX,F%eH@{uNТ(&*3O! 4e F'}mFoiՎ)0Fщb!7K{.; DFLETԞA:=|!pФLT,?; 1X@&N5$6# SQ M'F6FCh'S`*G?[7w Gw.#OB !3MƖl<SW"9h\< Ô QPS&"e^_Ot~ gL({t3} -{ApV11x_̒rOY) KCcsӨ4L^]`hyt;nn"r1Ch}w $5#PLMS4.4hS-O7E 3?GNci`?G0pr0mE*=4І]F` N3p1q??bh|d m&a:Ԕu7=EYޘ%%ͧyBc3==yv >2zL#h 󐑞$%%y8TsrS,XF^ -G rOTԧPg%RVFIE|c?LSTYI>Ǎc U9pX 3 $BmROęTu!KQ .,TkS^M`%*p]-58LkLprY6GBCN% S}24ahee-zŞVlc$m?=$YS :T5s|y264  dmqمsʧ|M澚 bo.DXΧ{[g[Om5av,160c -#ܡS° + m{`(gjO#6\"25F~:ADb%v"̳0q'/rBINk(M: sXOWChv"}n#xc{niϒ9Q/PET=NRFf0"r0Sf( ~ :l(]Oc!/ IeMtɑϱXs,s8&1&8+tTU1ݞB0# $`}/TӁCo=\T,ڼPryT :H#le(j[r uEe!CEv4DI5ǎÓ;_uss>"C0|^f"<0`gtL."/ TfRd8I3;NxE5lD| @pUxgg$}VZJn/{/<#a pEFm011{J52lm4@/G|V__o5]\\Z3T[.<<?oR]_~#&\]ٱL^/o_dP aƇ1zՁlTӇB7- d 9,!YJ3v9h@3"r.,)]^aEAڈ%U(>;6Lۭ^ث='9T #9mHK$*/~]I#-*>8` ?dt_i7" |ﵯϽJ4J/ bH>}IPH `noBD3KɮKdVpk2[IQp懲X~:; Jp_8(Bk\eJD) tK:77"P֯SH(<}SC ϯ@^FO`[ gPpx3ALJ"$@): "Ё@V y|XSׇ ' ؘ֦B<n b/8 Th!r _)@w #fM&dV&sP mL(C`&2[k|(,ЦmwT?:UuorB`BT 巎8(+|594[:Yk `^|L~mj1OKGXm_}Y:_JSKEqW1zQ~شj1?cL{O\@QH &%69,)}fx삳ajB'Yv)L2mY`Ly3 4O8u>gbDTl!9ܛ9 m7W 0oU5xQߕ΢zKm ĴIa8  uu zC^kN=D]EħNܵ'PAO^ooc̙ڏԼH/2$dtfCSx{llv"M |vm+&Mŋ6$zn=bao3BmGێպH ^w "_O|pw-!6ޒ-nfѸAD]·?L?2zؾf&!~72hIR,6¤\A$POU e;G0O d4V1Fo>ԗYĶh B:["2Q(qE8ݍ$Zs,OHN5A*!yh"B)LќapwM %`w֝-lcȿT'ہrl IDb.f*o80)wDߘ^o{5U %l9vAaDEGSӆ<2h5("R3t ^KPȊv#Tg@n>D3Q{ڪ QGƽ31i$ %EPID̔EgTՊg GS:ڢe=!"<3$q"\Xx{z!BZ:qj%-4W%cZkL[!h8!+@?^1Ƒ<3<.g%s%io龼/S#a̔SiHrz(>N@f,l?Q)(*.BFj}}Xr'-:rLw͡843Yd"*76Se*(V[G 2&"nhLJ N~'7$l)}A@V)k+!- ۰szjcՋ،s ei8Tfp\@QI(|&8Zi[ 5Q,vg޾M!'+KmjL IA/IVdbl(*~X&tr:ey=-eԔ9 Rh xCWv8L1LJF6YgcneyYhj5X['n=J^=h 0&dyVeHT~ps}亹# ƻHMi.^>DZQ vЊ(w,K">!S !j/B*2Tp~>D%*+jaeokAx |nk)Bs{ !R^%T _s߳^=lQ `И @(I p z⅖qRپ10i59uJxU @-쏒W=Nm&m4 V3⽵g`~EV/6mtmt)̷0 Vn؉7cpIaR]`a \Ζ>kKW#$# UEط3&锿CmUg z"PS pv0 &XqRkFjy4Uf47e03gd2zq(ݍYs8|%Y,^8FFFkf]/\LF ,[^%~.WX:X KGXlHVG5ep%6Vl[sa˔j8]ז{`N2#sh3Aag"˓ׅ`fƏdj 8˰SP(AEpa9@ tʥ6l;&sbΣ.+?gFWߑ;W%^ 'gڅӦAk=uWBYF78ABZa3$abNũÛ< 35NF`J t]Yߴ1x%y4>X6$J Dò a+⋫Y0h݆vјF6G,xz! :{B[)`+ALk;J<[ $4Np*L!yKMl\n5_5zunb0fha8s-d$a 5h(Ȥ o N_o\ SM8J)jG^]'J=GF߻w&|B3PWg!*5wlZ.+="ҞekB_/z;prboq7XX&\E^ls $s >?;miy{e$0/OYr`Ym6y2Der~tteMO=vB{zHk5ѕ/k=D>3^;TCǟ =&fI :}kxy] CY2xzfHid]kAd8<2 }s!j6=CD*og$9 Gk";'D]~B!ӆ7F-}H=N=zt}mMLBd;07`!,Bb]w {;Q:f+NB>z{zxf? t?XhqQW[)]O :W"+ YY/с6zW?IJ1HH{LPZolX#(3/B;ͯ0X¨e wAb$8fpVڝU&%O{9P&s|#ں[Ԕd"{zc|L7SޭP"9HJm)2z'xmFJG'W_Y?=c1!#Ay&$>S%R{޲jVݜ= #@x M^qB׋CP_} i8p1 PXϾJ"q#!0MDW|Ff4\yHL+,_Ugz{QCަ86Ma7E%wtuHTNcɉaI72ݷo< ͅ<{F(t(/Efm3lk&QhS7z me79hDFo"~l΍1zy%5 6w#)7WBXyAU0Pm0]Io 9ZFoUnA[(sػ" 0DW.l/ ǭ䌾AlI| = GLCI;-[ #8{H+imjks_^{4q%r -3}~KF8'Yr8m5/d`hbQkiicY'nRR Z[Qm*}_.! C5 8:5Z?,q2FmB֟vdq hM#zZ Jպ` mA98h5'zxz% 8BJeZ$j23#56|}2~ݤacAinovx̜d#2,BQf `fy%׍pRLJ!+r:pzduqKE|L8\ jx8+N.;}pHf#rcMř!x"9#y9Ó.ȩm^O͗X9 @#:UF N^m*Yň(+S<ۓNf}5ϡ};#IH"#I0k c5b ԭVB(Z9Rs|z‡9~WyV{s&l[^R ֯9XZX'L$MVI+uz8` #%>v\_8Ӧ2Ko5Ni1|-T5~tXs)Xк N3phq^du$ab5WìPW>y3<{A΁mK ;]#!&L ߡmu2fFQt4L2 h>3!Ҳdty@ۻܐd]y8E>Ǭ 4[oǏ+%ethNIֿM3gw2,eDd|P#cX5b箏jR9AXRZضteiص] 7y^Aw_ u8)_ѥ@D嵔 .ƊݓOtqԖ+7/#i<վx*iZq7)TI;4E[5B Iǵ֑[ȑ1ʦy{-CKpP0h..n)zM$FBNf CY!g-O=닟w7k2pC TWIq$9co_hXZs'׌#[*ٿmus89b̘1?awB+.Dwvfh `+ɢ? N>H V<ېzlfNFMz볘4O~gfY0-X.G+M}>73g.,fedC M <׀րlo888 ؔ pq)ms`CCCˀMɀ=y(--.Z`c=N.V0[> xVCCCˀMxx[fx;h988 ؔ pq) =.6%vrqq h '+hEG JSૼhceiQOO<8!Yx|0.! <[–&%iB}M-As)SdMRIj棣h~&'@ΡǡO(` )pvFZե@ EG8/]DJJ2"""k+)0S( qY$%'ABK̀\q{@kK4c4ʧpE9`S~R`d%sqgWUH!+/+U]ޠ$PՕ5REPQ tU·EӠ}qq{z@Ēs)PiXP6֏Akz\' ]L/YY J[NJ<0y4x.%p9{$ |l^[6xu&JVݰ*V%cq?Ǡ3%Y&LlOecYg'_Ii0v,1_"?F *zơǁǁ7d@U2h5*j0{$8/F`|JJ 4ImY &㛋aP̞ܰ :<]4n,6ꛡU+DUz bteWb:w YJKQLs)hGdz^8]3҃{zDۊQcۤxQ=?juqAizHe'*U N^c&LZ9> #Y" a?g)ZtW?k'JqNOÎΣCx zLsօØ:5l=~ Z}O:ꀒ,h)OÞpwwB k8OS_g% ֮\Jg2_E3Qlyw<=<,]oBQ g kI=<F2walށw7_`, v]uUn76v00m큱Fiwg0-fHEdJ?s q q8~s GI} ]ٯ6c'=ıkCD}_3kD12 1n, pw:??|u":h)$Ltpƞo_c3y,$xz>:Ҝ^%,_zzG ,([ WG1b8>Sކ mY% ~ڽÇ@`zk0b('@RC{35Pɠa}Oْ=ؾN$'ӿ.T7V@[k3&[*pWpuEP|*A p蚊;axw3>2ڍF<|Ўugo&MعvSܑ3oH; # n0@M^ǣ~c\?~g;s es<\c9 \4lT8m(j송izk1{!6m#f⧠hTױ[O^'A/=ac #n:-nLOwtgg̚= SSp18AGbh;u?r*_A>; o΂p^dΧ';%/9[VyaPժ|vmo\b2PROK*Jc= k=c(P#Üرf>FGA z7l]; c cTVZkz& G hx-?28ܒrjxpk1rīL]뼰ui& ~I,}WJ0kD UhbՓ|3n#GypMo m?f5AOF\ֱmX AMӬHsw$f9eCIskyg]HS2nYvM(idž5 Yo˩3X A' 0jTu*tL U2466)bOWL]1 *X\&ܗQкzJ)uI zm;vY}}FEke먝FJ'sziz4=YYv9=>aP F2iRSin|.n8z"bbG.ǺE0il\I] x1$U aO}8{|:*+i=(R=MǶ!Adx(~9mێ8t5ؼf ڂشl. :\`H+`Qkn%24h̏{fc7BU-/V㵱v_g(I&T'J?SKMKhp).sC=ͽe ޳b ޿O#f\Ug\ϑᓭ\g` Lvp•q6 Ju*{7w-s+00a4i|p e뺙5=KlXX/YpE:3g Ӝ]~'_H1UTx-o~hZ6 h3_m°GXE?+N8,]Q,V_H1}#fu%)nE *Yo;ĩ0y:{Ÿ@V`FC[0'̗ŠWšJk_L0oLӋ  :6Ֆ!9IXb(%$&" jz@yjE+S!I|ѵY4шM!=+S>zµzJl4ܬtb|'6X%CV]T^.bǣ IMEVN6DDTV5*Krh],hm y=%*,ڬE{K5RhM͉"1ʫE:N.̸8SۛHT̜+ԵšLJx/xKOK!w(,iny=64d`Džsy9?Mכ," %Lﷲ"Z/g)o<Tu9;V6?h;nY?~y\{>BT >[ bA`K_N +Kh@WUa0A~X?qi8u jن7/iŅyYrCK@]M%K 0I:62w g ^*qg@cy|v\>ZL~<4'abcdJ@Q?Sjӹhe;{oy#w.hEkIԀz%r/' yz<"<6QH(/_B ۍR>CCUUme볖3ABd1 4_v1 ќ j7yx9,:òcwۄ8i"ɢxJ ٶDSkЙH'X= ɝVŒHD]2'6Bmm7^࿟ i[ͤfEBlb"%%Ƒ6Id# 6Ҍ(|b,"o"",O PLdc"lnlxl98|8-,A.TP6N'%ov@Zk:嚿3𱐑,@y=ul>zzz\lJ8۔5ءzzz\lJ8۔5k,.XiTXtXML:com.adobe.xmp 1 2 3 0 0 415 754 1 0 -p:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:754 height:415|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.5: Rescale: width:656 height:361|  IDATx}gXY3sg:ڭsNDQ1`ƜE1bVTڢA( 9_rT{~)xiDPP+gUVTRPPP҂:<x 1c0xbkk+^xQG455uO"yc<x 1'OO}ye$~y^h4ܽyA~Ň4bJ NC\j&jzj7.E_ ]*QZZ2Z}uPz 7>Ba/6*+J)Ν9ШX>[AneV6CDNx:F>DcM~1ψnj dN6s r211ᶗxTcqAa^%vRuut/L:yAI?y ^ -;2V s |.> $"q/`kg儬muu([FKN 7i)IE,46.ɩ(,+ _%,F\qtBy55HIN G!:&eoɔl e,r >UJOE||<2sr?TɃ#oE9 d 0+/=`ߡ{׽)s㾏v%sB[ψkodC`}mvHf}@G`~ߧ-Z; 1ᴉBdpKB+DbVA惑}A[M #_kͷ?`b$Tlqn"CnVu#z]jKwa;EB\ᱨvq 1S#q8 ˪ԠϞ} F0,e )Ta_b9հldNВrz8r*{O%y)ձ7>oCO2>mHS_32F> ebޗꖹ_vmO1܌Vp Un?潾i0ѲT zk)a*1)-lE'[?c+f}K_2iMNNƖ-[z8#XK???;wダ}c,;xuw.:>xyj ŘP<$Fހ()`֣0+ N5X7ؽ(GbJـ;v%K$ֻw`ۍ⁣>W_DrԢ 1VBNAg/ƊמF~Kvݧoѓ}0iA +> 琢_7BVV"Ǯ%߰a_FN }v=feܰa qwH@ϱж0nzMFPx_h u~ dy)rZ;ƒ8zo$B}ݗ.ub@2bhF4{2Ɉ 333{%,sٛXHq.\S 9NQvwc'}b_˟ۂN t5M1֎Ȁ6'ãrwFkqs3D0YxdT v5yRu<8s':)euL;yaĩ8b $Yp?m[} % .>SGnwɡ'a( 5~R|wRO j8]Y*q&h)J} -e%@>EcSf҂8 yܻq ζ֝@R2ɵА n Uz`q!s+w-Uƴ%q+%-I9uYS# ;vChxn[ mMȪa)í3 Of.< #[acA$H.ۀ`1V$`ߩ˸zrLԔ!a"PT;wX\*ZXu&Y}=d1b2ĥe3EagH$W[Ǯ>D@J>"o2VdV7ƊWPX`u=~!Kt}TPÌ*x,NV*:+ݻs3(BdU-MxzZra|;{J諪tȺdE^Yq?K&CHxvH%һ8Nrl%kg/Ě5p$&?av&}Sr8dOqC 17{ocex{{s$Ҙ^\'<3{'?m$),GYy uaD1 ~% o~E+=+(k.'n\d|KX-UF "#O,6g8@msv#K M4mD\}}!6ՙAl(柌~'s e@ %3d72Pq+&@UM? m8a6$`8~+^Tҵ:j."$˛)GnU5%kxt j-e1䶵0MވF4dҀ帟nv)*&뽐BcG ]JQƺˉh&DDju=3)Z@]w$E>P i`=(PAJ\v믡/Èb0Mqn4J2A_Vr4o%>'7΅:lË\d'QN8kB{j%v 38l塦iPsxxc(m~pm%dT1{!W$ڙ0PވJDmg qkQ,JXs*j8+D1ne"/7A^0ՆHk%#Qq/.+L1 49y,-hlps'Cdl-a ᡹,] r.&.BrKpSs% db}=^igq:(?O ygyYl C1r L@fF J3#p}&UgPSC$j c}" #v*eF -ܑu[KIfPRV=$pearrpzW Bfo]ÑX4=BT#\r#}}X[ǹ5h*Υ On[Q5]dyP)a/*֧ u'u|CV7MbZPC,p..W duRTL#, uy&[CBF ξī7mKy-g5V$1]eqB #DX7 ҔUo?Rh[" $'Cnn:"{YY @rCxS3@s#}`.$#_~qͅFz!V.vO -aY {"l<ׯ* ϟɓ'9KmېXY coq\A.vjv}#)@F{$Dm9kD qo|.~bhnnHd}I(:RQw>@;.rF7$ ,99GI[OdaTVV2}Y.4lsTb)P鬃`=Ȍ0sU[l9Fo[ ٹvWym)B셣},<:3U,_M΅-$Y ͨ/xIz\v(FVWH3,&oYvLVD }!QsT=&sb9H*t(P{/A5Sh',yS#ذc'DςYlҼE+)@ݰҖ?}+(C򳫘nOEer d>øK&A2 wb\м;K!"/J۱@e"n,ɡLsc&MIĘ= >P -C`9~.%W(dt2e+zTr$ˣ4=#<˫mo!,a7vI# X\H痈M"”dTzf8mу{D#$e@^8K4w1o<_̠v#2X]*6,_ލZeaTIOQH1xf2R sFC-F/?ƹ;>f1!`ˑ EHH_9]Nv'YϥcH2iKƹV ƓwF +H8Kaiر~ڳ*$I0SBI9Yx/RzS6XiCJ(]K ~TLq%|{= Q<7 ģH:,σ0x.Dvf"&=XMܩP"&؅ x,iE5Hbb é\A.bqZ;/(ŽsaB88ϵǮ#1OOQ= 0T쾗Or#a:@x&g!?9VkA\$|XR"BUTH%\,xNsT#̥ }9b{u'{ 0Kŋ{6QdOɞPs]3ղkXv6vY=1'J Ձ20Ǭk0g M1l1x0J &v|e!6v$◎DY.Myedݼ'̟:d +$HfsJcP_`7{!߂_a;ذ{;iY;)z&7 6FY9JxWҜHN_?l/ETW"-!OdTW*%ݰ6?PyrKh IDATVT~Cȡz/ *fd|_c$"$%"#'KPD=*}(0"x|<̡ҵ/QI,y.')ۘHŸ́A5~Nsr*S DB,I9LT#B2:"/Bb \)qzF qA08T/"9TRj8Y( }'>xSM>'9칌*APN93D0΅^IЁϻ߯~5c#Tq#w#s|v'i}'7r׶OaoV@Ű8? ۀXrRR23_[qҷS$k)/"WBnK󑚒^ZF;>?'"oӳroe&s;N 62ѷFߞk1x$,=|68' lb} )8#"\V4:&'BF^`ˬ%B5k~Vw}Nط[iJIME:URFĈ{Zr"7 J0g||2v&\-at{AQ ge 梜e5t\dر00Kxo w#;#=ylC fH1\gqs0ľ^I6K5a(DT:$<~3IY -EZjJi.y dQ%+dxKo\;tNjZ*J$"ԿP]oVhs )ft#s I#r}}쎭O!jڽͬ3VF{sAI\hy{7noG=ETK* W YEStېSQXyy9K2kYFX(7F"/Hzf¶ˈ Dvwg q_6Vfy|XyHAcwlrss:a/rgU8~ag)˺r;=]8be_1#̲H#Odcՙ#=e}2k}9Y^?4־V@a@ ;<x 0#N:ȬoT2՛ wg~X_?}ֿO훍ceJXyH@1c<@`>:1c| '<1c<x </oosc@'<x 1c~aO,aX<x 1c@o`q?efdp_ z ~uc<x 12;6<x 1cb'<_ x 1cO y 0}}3by 1c< $O y 1cO y 0m[~ny 1c $O yc<x x_ 90P#Dfz*b>B q@]m5?@h|0PZ\ "@N&}bcy8*+1Q $Noy~?O?*,)sҌ_~~_޼淏oޠ,)|~ <x 3u+ Z!Rx}}OO  GԭP~,ʄƥz5u\*rt@T-h[] m3>Ƌ%9u.aWx q/BC[n?kCTD8 @"oF9oy$x; 5eyi?44Дő4@ &xcS_WpLJ._"4Vb&LЪLܺ~nAIuwڊ;f =l?.ӓ1^ 31W/]i;wS A]e>ܼǮy 5fKti={wQDJ"{ObNc ZW/sלk=M 9YY$0LX'NKH-*u ]8IWȶDŽ=evϜ:aapX$ᴱ{oB9L IiL [QA/|I繹0յ= &׾V]~ 9he-.JKF[ۿwy4#:Ϟӧ ‚ѺEnU@5ax ȶJsSw2HzYX8 +^az,n\i?co:'OL~Cuf 4k1bJ!ž2BvW ,̢VsC^A#`aaMM=5ps҆t@cKaͮȫnl})1Uvs%KӍ{DFBNQ#F@ j&q ]m-U8m0f48;O.&,ڈR&EޅX+(fzPPӃkh@L6~$UH{{X0.6>6:('`eU-=X6c&# *6̄<Vƒ/6 f$Fc//쇥Դ`niIskee* KIbBR$B>@rNR (yR6w2Ցd $1') ._K0Vn*z;FA!n]'g )-,! FBn}QG!cQ%5<: sepkD7d~-qga* 9|0o^UOHLZak{絢 $ $;}?s d ֿl*st-?e\EwcX,ۑ؆N>4]j}*cJQ.s&f\\ ýYQ X6P&7H7zsc o /*e{цwALL{|KpJ kmYx1{}|F (tÇcڪ('W,[D._"[iK-9Y)M0n4\ wF<= %TN2zڳi%l,`ll q5 OGY1wDvc'"NhȊ@̜7݇[ZyƔ6R < w7݉W&q OxM*>㗺#, w0yF3 mFvm8k` (1yXI֢4/\=[L3~D߳{nH4Xq/)y/Z]W!ecu);q0%}zĩK!jAl-pv5 ۶ogxYU[l\#Zo(Q\FFF01-m(͈"-L۴M+  rshJszʒ83M᳎m@]qw[cEC< !r""\M?BQ[.[%11{1@ce [>4aЂgabb^'727q|3h_x>~QJ**] Vx?k1TJ g±_&20=d'Fg%5jRSS]F!bHV4!4$6܍ڠ"/͑PKH ,̵moR=\[E hY腫8~M9 RkJབྷ^ Řw G/4H.t]3 ?&`͇h%'b10ӐדH/h(@X0z_K_" ̵e.2.@Ge*/Z!P$ra|~WOlܰ ""<"k:CLdfmAA/kRvwh"8MN^܎$2 eӱx*-qbx BvK'e#\ D\,1 <57@3vm/h)TRnL!Sm"_ 'ԕJHR u~)'<92KeN&"+;Ix*D[ -̒VJ140qfd׷9`!%=1z1q6-v8O夥p!d\Ձ<– #p;> eXG7tVP&.=GVN6R1qDt{|j$梬8 'w,=0$Hy) 7C#;7y Pi,*p.T,228AFESk=`N!%%hAH7ZMcmBb疍2 f2% oD^7z:DUp޹X0V[WD E%\D e8}>+wͣqYe 35fPa2uli{m u͸a~ԂJ/$gqٳdd!1G ?~)ܣ$g\f9jrP5}??"wqnh|(Ήṯf~\}bCQHt<*On%#.4^iyqx#RB[} 'jAd?t˦b44T.4!FXXbQ0mrfabR݃L') m=m%?z+=:C\)0i5~ hu}/mP1G<bCz!1Bf>˾w9[z&l [; Cay" 6JcAgR⥪.Fw#MC1e[<^q:< G,>cޑȰ+P @2_5m Dq%pNz~p 94u`B/ZcFHZڻœS'B /O ?{̃h*"`G'G(6Ž-FčPLB/0ea[ޙ]v# +k1pp }]#Tc #4k=$mpH~'S\4vCr:N\gY؍Ȉ [3](jqDؘ@I]k|:ch"7#MmhIbѼ0ƘːYXYhRm8Z=fNǨBZ IDATYkI1U&2h$)vpu u!5,. ƶֆJ9FݮIq5cƏl'!(5\* X:=u>-[g,n]`<"͍[ (Lրy%[ܦGqE8O Wy9s&͘1PJ~ ;\k[ oE4u\}z82i5b;͝&WNK"fno~O9΅,\ &|3v 䒵\ 1W),Z9s5}IIyb_p.BZCAI v%+m';G SW%, &sv!,m}Iە?nCs%rbwM9 dIVfZ)a",ci}X2 J!^_\4g-#JX,(*F}u̕elFSc˸=eu0 -?Sw^(n\L>...Y8z3ڮ/GsDB渺bF Tjz,;!)-/]o?e'G`,?Pq߅Fąq6aetn\+?6}3:5;a:q] w#"px+)! V"{Ȼ%SɹD_sr5daÊ^DN\`PLu^g0:d9x0>@uG0xcM9žCߏ+7\7"?;̍#-a}{<]u_3IT* oVﰕY%3/aaERWAI 7^b$*Z@/;n̅MȊM-ms\xtk6_[S9Y`ˌL\ؗ6MDD )).ǻ@ZL8y1Ss*t.@:Yjk:eeJj1=m`6֠,&A\ITub 3R2\#`Ƈ\4NID'Fc&oud7U*9?g9@TABJ=$ɗ-#dlj-3 B;6ك3Б$ʂ%:̣RdR!W7ֆ_^JKNK9~7?9?~cVm[ c. #h$u[3al.$#P!в'Q@/]VCG[^F JFFTee1o!WZzѪŅ .. o%52~o*;)#kUZ95\ )U=ȥJP0#LY\ x O ?߼:똨v dC)9d" p W8MA(W%oYn<~'T"vmyTƪ/ᒸUDx(x9rOKس}+|WVWۇ!Ncg-ϥ+IEډsTJ^==E; )A񷑑QHNϤFe zr_ҊE.6oGu %bX]Yd"ud=[Tٟn;ĈXt%F? ;cUڣY @VWuv[iBg~7酮ؽX_)H wBhSZJ9=@ܦ:d"ːQeSLeA$"~2PI@6!"Vu:ZAd1_} k)AA䱙:~"&V# Ye_A0xАs+!O>?uZh|ؿz*;DBYḴUʍ&oћ{l5%t`rwܼa|% +xNaK/PmQ)[NPwk4g<Kp7#"6m :hB"u4GSb!܏<}cc>9N||Xw.WƧ> 꺔yGOǼc2xf,i>;tz#9ag$k=ITcB"Tƣˈxc:vJ@I#K ^¸Z·a=y00@x 1N 3D(BY2qE&dIT5&G=4rIHPnI HIKCǮFke=TcS;"cvk2r"^ d uZr6\EA2wUU(ʌ=EDũ?YbYd,ɒURVX-Bn(\Emm5 _Ne^!wn}u]? } eQu6>iY9L@e0Vcb$deivx T&2BdTK|w2T *B01`'z"b1]<o?[t T$) . ;@h(sRMRẠ0H,GdLIĉ@9͋ +# ee*c 3jJ4~gvN E4mv҇+XJfi,BdgX 5=O>+v^萯+"D:S"1\ #DY?"9 Jr\~a0b,b(0"* 6AZJʭ;(Ϲ߽w]u $ "s53"F$JAAA3Ha9_uWqDsCU=voުzZ(W{fpyU\vdC$UWطyDؕVO ԼކPlfB/3DٱbsŰp.0-#?xcd56m.n.v;BR2Pk{GU%̄9̜Ɩՙ,1I\2 +'/fARZoU&9d@?H+m o^s~P?_Hz=dbW>f#PG`ʧf+f?.o^HB0] /E٘c}yY-79^S뒴6[ils I|a2bɔ)3S^>S22( ׍:䁹>GF#v?Q|tCd!YmlLw,MgP['˄8*l1[/|ǔrL0]gƞd7|s\I))HO#[2_DQhlI&5++zP2<#mJiq>"aэ'vu9YDt2m`F\ Y{Kz[ߜLdp=>'2?t]3w3\\9?m[cjߝCꖜfL hFJ4i,^DN`̜Gyd1\2yN6ѐ9SEi>w^A#7;532%ղ6KEG:G?DxaG'_RHpmU`fa H [iǡrπvSkt̜9sb˞x6MA=Z2+# Ad< ݨ | 0*'Eg҉g',c剬$).[5HI'{Gb?4j_Z2swuFtdݨ | o}O]'=`Gf"ͳ4dL/<26,adoIگR}dhP *@ |0}А`|I)#3ɤo/8߇=sؐFN[k "hM<&%՘l\ _C6.@2e!==lAdԳS3H"dԧ^5(ԡt?U*Ѓx #ȺϽp)"+$+߿C9ٛĴl4 Pi6.@澍< [O_@aM*/765mʏz,57?~C xHB%\Ӄ+8Kka ")@F54f 4@YE(#ewCD<^KPQN{:b=XQ <2 utȲk i4t6ب tOh R`c:$Cc!!HF>tG)sSakqWt̩3xݼQ]_6ۘ,9'|sZN?FS@/g/1^Ǡü4TJ46cW+  )@R6Ѓm]OIZ+v+v2U;l/?# N,;~kB]Ml S 5R=|PAģ}@Eydb+]5T?H&}||(@zG v$;fCk%]܎yZ]׈;dz! Dei>RXdM b`AX4HXfipCRabT=Ip 3wHxueEӢFm@YL@RVC>ׇ.n}? 4R0\L|b-('g]Icj꛺^c䗜%@YZpby4lw@aM_T@OP}ƔOm@W?HcFb_a2+rF<#$䠹R2 90ozNdr87a*T&j#2mrN aaa@XHXvynÕ1XT ^FנƼXx quvvYQ:l>0vBM7NhupAHX8I)c [4] ƋEv $+/#ۙib 95e0Ikv 1a! YEur8H|-3+oc<9~㒑剿a Lwc%{IG .l:d6@m;v7/<" dK4 >Nbz;ؓӏ]=H,2^2.x^]Q(pvvCFN>]r!<' >Ms~;U*o ?j]iohTHxueEӢFmȞ:|R "';eufam:'hy/Kmd7oi=E Rl\p$cMTզN~a8zxyt ]hl{wҙdOii>\ o6m Ə')oM8\bpKi6ط=.T p1E]$bd9}]ނ_g6i HIU=~rL]m.ŋ{ /|P)éTQ;o(^5Fнd!L0yMϝŅ `z!r QR Gej䴖06wp1oވg:m`mc:ɵ)y-'ywNNoWRFeb.hRp.Ν%?Db=rwq-Nx:=G.3bD-Ad佻j 0>c7VAv5o 3~;Iltᙋ?ջɮvjkrpd.,7 ?{ٴ bCT7Vd{ n#@a2mڊᒒX0BScIj.#Y@sDbm-}'218_Ib%+pc?Dd|58MfA@D'SʞiS&bعk'ׂN߶Df^?Ka(fX9 aTu cy]_2π4 V?\T^=)ʐS -Ĵ *ʼn(c %XNcA\BGD[{Ycѐ! `DUKUSBFqϡ2SC{ܷ͢;\>2sAY90j3 X_G,aXtF)c-$g1>@r`z0xU-c:a:Dr0uFSmroJHb1rn=̞$\[_LJ1!( '8!KG~fUPsăiobJ CIl}']0LN |U(@_\ Rcav~3dFuҠ堪"BFu2L]_ :.~0;2xM}RXuDɹlcCWoXprNbVLřp+yH Ě7g" JPYQxx{#6>YMÉGeE=bhDycIdoC慭+;\AqN*M%(N 7r8׀g<>ZUgr4VP˷ l54a%bɁyS@v1z8֟"잚NޱM;v]/JMkbڟa:^G&am'Aml#d2m%lF<+C:#Fcޓ%;_7jzܿ~Rš@Oy;|_w ?O8U# PCAr s>e6mݐW\*7CAw9,Ye@yi/b1i p hHeȑyFss,.<]UǷbP^8!- +Gn{ =~-9jp&ޖ bζoe#6ߕ= e8Xu[lġ1N~.{lbF?¦ɲW+X5]ÆJ_6`qi @c6x:`/ߏ} @p xM\~ k*a \_5u7> ;Ҹs_[  ֯?Gƪ$]bl`?qAT\||d/yjR8ahkp &m~ |Xy@ T6;Z .@F9p=N_Rx̶AyiXIL\w 1Y5d&!쯁1$.6f*XXZ’lfWaX,:c*rh5_[ =Kq},Z!Au%YL_(-ƁU!6wHxWgwPaCcQ#`,O 빬8懴!=nPY5'gDN@qQ.ܭx"N/Ș05{dL_ˊrϙ8x|d2܁C$l;Jg B#"I"퉇ɸr=6O 1| 0ZLZ/Qp a}#)/Aqex`egX`.L}=a aۧJcš. …E1ir/hf'w/5Cԗzb<1[l۱y&0=GIe5{Mf ,D*BP ?:́O[:iJsFG+Ha"<&^'X6g*e0e6̞qcT1zC0je>X4M 9>63 { 9}b%!OήaEuĐ <%p0 ˜`ކ4!)%~ N(5ʦ_`x>To#o),/BF ?#4l./+S;+HBG",^0r}0سM $)x~F$X!Q)ߺ6q@fabgaX1o:dd1YS ŝX5(Wo rlY*lgi0C`ۅ? kR{$ t  pw8>?7y ktaNX\ J-fCAj4G za'Ρ]6'U)@ƀ037' Q(^nadhhsKs܆061SO6z<%M Ź;]~cvx탼>w=;{ħ7v|qI w-@I^aco מ055Cj_⮙b6Be'Mf[[eĔ)SOo|"e w-ѓ\ZGMEıMcamIꞵƺFem: 3ƌ}(YHؓئ :&{o1`m>9"b<| sas[0&v1Zk29d@8~aSc8ep/ƌ9]@e`ac+q,$BRl@bfdMuAR8edҦ)vlk֠_fkA3\pEuW-p] _8^i7uuL@{T8zN9k3$Z81YS 1Lɂ!>/k:%t3#/`V J>)icR{Iol^u.Ɲ%w!&5ΨE^E=S7"L8ffnxSD6lJ7 `_JWb->>035ı )̋?/ي5C//2E#T֠8?#0jYrqWC9nUW 9H%Z,&_L%E<{EϬmS>ax[fox0t {]p1@`)V鑮j2qFbg5 'u`^oa=*:Y8T 96 P#^HI<6$_^Ϙ&bʅd̺z 'e@5Y;Aw>,?qfZɀ* %Fn026ͫWqy [p]*nZឃ+ʛBTg5pnAm1@L*U"b,"u{Ln^WahF}v1?CsCܸz" 9zM~S\p?\Λ]pס&"Haf,L n>w,ֵP飋|Xdk>xjҝ`nNu+пquhq08'IpAlF< Cӻ(.Gg0kҞc Yv3k/%W{Ǧ7pR|WOSr}<}dv !#DzܲqЧqqP^mHlEl]s0vcA$.▽ޤ"5;oȑmM0W⸞?dxA5(F_a%X✋LLeg+\NMB5^xB}dFOBѷK.[ xzd >Hi8v^?q,˩aP 8g`Z~%Zc0mTرk/"Dx?ʉ`8p߲EBNң҉ۧ&M#1<,rzl; }X_v]ij$R/7n&;'dQV ((LiT-c 6%c>0~dhkM4EhBrӏiȹ7 (VpG,62x 9%ВAnDl?x{`џ;GJ&ńP >Ys0nA@;&kCNu*n܈Z3 ǃi ̀$@riEK!-[(!!ȑ@*7 w$ˁ^D5rJoRjx*o0&t>W$1)8`ă(O6MB ϙlDm.Ԏ} :N]w@Vxb §FM=Aa(%c^BKYcgĽOLD/\^([JڬBhx$r 6[L^94plk2Iue8g)Tp1 ƞǰ1< U P SĶHLDNNʫs~V) t Яݺ$I`uŠ6ȭ!'FHd4cN&.*XA0y$L4j# 5z6.Z=Cie5*93q%JXŷY|8w uLvƎ2x PYUG'_\'I|"2ج| (.|q|jT9ƉKbէ óɫP<f> i1s#𲿍UJX) ¿o4lƙy7H oKʛu7Xu pkp'9?<@V1 X8SHЖ ώ*R[;y=ZA 1m-lll`Lhٶ ʒ1z^dfAf>x澛U]W`-ćNأ9*kdn.2Y! +?U-7(&Wd,TԆCvG'fs`􋯮@o pKBPK?ґHKl0IpQ%M I ؈R_~ "st! ۟Ba7~=@p.f`+$e5$8lta_'ANfV%S ZCb]GZL1&8kٍid6| \@W$jqPCT N.fP(`ZA~G؍SIsw0?Lu3k3]wb25X! ϑWYs$ 9X~@+!Ʉ˕, k-9+NŽc0^U 68aøy*Tr4m Ǔ1d͈Kv[a4 Hs)G*Qe#{Lqv` :os[zP= *}7Ezcm^u5dt:%iH%>I|I ~X84a:YSTR:D=2Xk싢:%N0^c@`;D-֔*]ɉ<-ȩ 8dee5p'q$rO4;n0G yr'2UN)˶@cbtu>RB| 3c$.:7l8g{odBVvf5 pCaC/7&ҵ<\.L!5\rppթ GrH| Z(a"\s+*\KĜc^[p p8$lxCbC6a\s/_ ͺw i]cm- ڸ9 K W'<4֡xW^=6Hw;ȫi$ͷo5J΀"c /xJ D%  GWD"H=K+1"mJ1MS F|B<A)@0T3PƔɏT KO'X6ǃϢIq0Gn"8*0@y[/V.N LK̸h_?/dDCK?fE6 #PC(-Jí ;%-E _ lrg64Z\ >*d2>ҩjpɓ # %,-N!yYؼX~lU8Yce !&JfjaY'\!@]E &āDZbR2NK?8x@ %jU+-Df#;'hǍc@t28LQJU> ׷LX m |.@9a+IYANa$NXҘna\09C =g.F+O:a9̛7J +#C bB%yd1cgO3 c*oR`$ƯANa)ja}{7x1Zy-\mIǩf| 0RXj $i$ ,!Y?p+Mmcew[y} ?SZa vRuu5  ;k XԌĭsn6ɨhVf,nTj޷d ۜ!"#.}pcSc a.V<*'YWs_cjA Ң\̐q|`&wO Q "OMNDb⇷2yoS.uAaɻ]>NOr윜wgOT@PdϨ'˯?ȯ:2UbLNh)>@S߁Pn߶8$ qa66KfL#QVmu:V,T@wTdwTdWM  +J,nk '#") gVx1*áp۫.Bincw둛@p5i ;~ Pz M ҫF7A4DG[Z`>3Q1Ԟl #- q67m3m_?dŅРSX;F o*G(+HߏO5R\ǀ?[z,9~-YB NrR6LFȇjfc>xNÙwrncgU)ЙiarVfFd4\rnTno/ܟUn} ݆K/󆱁g.45$: κ*$ .pJ ҂U<~ [pAGN_Ȗ @3˓+qsmɒydNI^y \~ P 259 ٙՠ@nv| ␛A7al ;+}wra[BCq (GY3։ Z5`dYJTCSuQVQA,Cm`Z޶ ( lSfF 3)3`ӏdC+f MQRV2^88oToo&=M(@TF)Х9u3Nk䧭@.k3,7Çg7 qOcC P 4nnR4@\.̻O/@O_A,)ƌ+fJoL4.#=+ 9$Ndzz:ٲWȿI PT ]*7M*@V RƒQ*Mî,ݳS? #uM1!#4ě8$Ӵ%S2NI&IYpz$WVcPC *ZrrEPpYH/(dUsٹzҫ<(@:9n_Nh/chˈCqAT4-9c g UĢq@ɜr6gڟW.ïC1y/ã/ZBVW⇬HL^ Y!V7v$1qDH@p|S/5K t TnX7Td7)))x/O A]}sz$'=j9>7 (mxqN;9c )o[W# IWg";_W[y..ptz OTV:~ P u  u ;[NU*лٻꓖ3 wQz {E5Bt@ --f*лٻꓖ3 wQz {E5Bt@ -blhBj Ϟƙpm\~ݪr݇+|V+ gOY_Sx:]UI w(@~Y_W/mИ8 jc7l7DdnqQ,҄I|5eb[Dz]mwT(@HA?| PN+ %x`/%A'(Ibu  V1*a.Bk<ZQȁ o$u3?,!=*% Pi"X ݸrh־Hd~Ǎ{OIwH+# ـ :N Ң""ƬEM1 aw'$AzrXJZ '*c4dFN[jEI>nYa!ĥBkiTA#/[-#e 8LY$d'N2~?DpvH{l!~~ʌƱ;N-yf>חCg"T2Դ㡧9[P+gCy˨k6E_TޢR_/U]0@* 5GMÆVߪbaHC Nn%\ujWД &5ȵ됗I^X:A"i\& Qx~-uP c w(f˻4B#;4W u`a5FC,- &<U)@(-*@sww: g7YQ1uc{^,0֔ftL_Ʉ #`x|BNjz}DF˴uu#^FjS c|MٮP QM`ʬn7pMAH)OEl"9 {tE2hveŶM^J""|XGo }PCԘ(3' , cO>*j# Pz@䶩bRd؞)Q? cccc:(|rQ?5ПK{ઁ9<|^!z[1M3н`uiE:j\Z#ȿ?8z:Ɨ) $9i< Y78,1 I)_/m O#PN<D~Ҹ i޽~~gg7w7Hߨ@ i:GO t2@c )CTy2I~),ZÎ;ȶn#&Q '9lD1hhY`4W#1Hz>%8l,4V##4Jm5 hG' |-HWar0?vpiކ%[Ek#@j 2dCQdKZ/SF t ՇPu9PT&@x >GYEJJJVJ>W7M&y'LMY!пNqB:}]ԅ9X! $TqH$NP/D!;~Cٮaf㠱" ^BС1߯7 :7)= c84Fi"`W I( ~.>9yL)k7l(_1\:#8C֕s9gw?pyīp?yHb>JGO{J#--_O>x\<}Sxt;>H;:1 XMOo2g k7ԥ8tܽΎI$zڂ@@ dA(Ew @ 1_KTek|12gHMkX'F75ECLݼzԫѪ(\LjvzuP*ԭAթVAǯkY5r:zY IB,ݩQU v=[6B&59 Kڦ1ڕ(Z*IӖLYV$Z]Nr_r@@ dK )e&!2;Vy']•c1Pt;.J*swNg ^ݽt4,O2~dG-,jOSVݦMիUCJj̬޼zN?{"U͍EMgٷB 'I Ƹ>qBSI@1)9F(@@T̯DC5'niA\01y񛐗oOx./B ;t z+Dz @6U de-F+{.ܺu[ O @drGd=o2Z1=H$I wH2K@ d-; @ ݖmLs> 4,W<">-[Rol9u8]Z?7qo3G_ _}Ln2_>cN4uWoT,]"$(B AADS]{Q9:[ d1QV #6/?Wq$9r$% 2wy)dO Gxvu XMn]m-j+&o3}CtY|)-aX#v-zꎛ}6l։ĭ3` EDevFC8h=hq/^| jcܨ%&Lu3_@C,($]4a+QIdlzt5KWpŇ9<* H O@ d/B VJR7/fɌ}g.gӞĦ8޿S;r$fakB #8c=\\OqvbXE [swO`b.Xb8wp# e >y+6*2J5ٱo?1ZT] K}[s3|CgrQ>rrܤ)ʏ@R1 %.I$$ R>K,xe*s$ 9R \ȀeR ev_ȯX@@gY؟)Le$<}Ib(yH;1!WZ'7iHy@n ɣz""K2@|\f.󧏣uQ"ÈoF ĉ^w𩣇=>1NQJKdCh֮H aY. IDATTVY]ZFkJL.ҺMG]'&#ȣp>n_ȶMK2}ڻ/]ܻ}=C3pe1=[Txq1jذHҳ^%.6*.n>Rk(Eپ{۷c1^YI3ERX,Ϳ6`3-K23O7l@X!t{C{[N>e"1-[{e @SM-qOROp`2͚YO^g-ϝY| ,ILS!Y9qsfLgspƶBt3O'91d B^=5X0ײzQH,`&l]9 q茨 a.XʂYf7-fpnfbbnMRrMG'vo`߾J.3,ᖵb~̘PvLH-☶)S>1Yy;@A!w#7I } [x?E@~@=fT70a9t͹*.ۡ>Pc9lkZ &rAVƘK1#7aҟ.Cg@?Q.QEcjjzHﮭRoEݨK϶ExEc\Fo: lݖ3 ˖~. hWvg8 /2}=~+1iӨu憵rT7GucZwkTW]'/[)PK KXj5kIpw@% 2 b6i*\wWv0"LG?biGRkC-[ 6Oy|kJU!F3`~<ìն3.y4ju~[両LeZ1*[ uGf TqUC:3xS %˔W4vm\L~y怙$+@dȷ%+ )Pe)<9ȁ@JK} f߰2:-ᤪLtjӔ5 XN `Yի.e~WCcccahԘ^ӷ&dS3Q.?nlUiuڝ;S\n+r +†y:13!gUaL}ఫf6X!kj9l٩&E~U0{#מ7:qkR.B^wm\"-26wX3y@! ɗeUy $ \o*]G2j]&v*pK嘴r/ }ptsI(^AA6Ibr;=;] m߫DG[ #ÔM[ZJ4!g_7FYEDnLy3ލа/N ˊ=\ch!@@&ca~+e dfʟY2SK/@ S1?݇N#Өbq%3GԹx?T(S${t4 Yi{wq ypJ ֜)g:k<{S'v*ҙf4jٍkvX~Ut#9|DȉG=C);}5~ZGn1֩m{E쏸o~S(d J㗬4߷53j S{+1zN= &M5;_<;2HI HlTJ@ d-B$D`ü3ХYԮS}}Vݳ4:N݆*F9{x(S<͚6I-*Tbcf 6 'qC[tC&U(S:޾bM E 54~cZ8?e}>&AkUe>;o: {K7е)ڑ)IM*hji OC֠Dɒw̸#F$9>͘ SDj5&/ۑ52݄SB8y&mn!/ Hy* E Aɕ國r$F@ d^+ϿM@ M\kȁ@]NS1CXfEZ2vמzuy&.Btra4-@Պ4O=C=tMZ2kV"ŜQAwӺ6ʗH _;lsi^I+`ج7ᕆ%{u7iAc Tc umtof,&;A-vxɉ߁(w%\! 2W0D1)d%O޶'c-p!:p9=ЪԨMGDK"dz[1*:l>r4E;àRel;zQ|L(oqpI}^=cT]T-q8JF(}2E)gԔvN=Ke2q2ܑ$/&  ) e6|@*q8%JapQ%wUfj+gO쥑;$!=ǽTy;Hv^ITHMh6i!XGv\y[q* U.ץ6Hy| KUIR?RyGr$# 2Xʔ')dM KG. WGsQمj 4?u1\:y?ۀWß3ssz.Q4c@F/&)H@ҔyQrt_+2 {"'ݐ;N=c(-YiǴ8UՂDHQMZٴN'yf]UScB @Cw,.٨yy'[rW9QOኍ= 3큃5O'>.6ɣ<ṗGχ}7gÍb#=>1N&ka><“ҏIqpq@6ꍍX(-=U %PWm|r"CG=y_ c)FΊ&~-ʐi 30{i#E妲dR I+MQ>w_ÙO$$~JA3owk< eک$ϛƗ^-Do1dJ 7H_ emTdSd dFRũ}'aЙ4^x>ĸ /W'[頥Uջc4 j`aȪ%e Ĥ*˓+& 鵟_LZ(TrS O=HDxQo / ??u_ 9V#gw;.~_3R c"YpMWEB%[LjDȰ^T=5n~&T.U} 7^5S:QNCLѣW VbJrey*S'㒀$ HDž'CR sL$Or--$ 6)MTHo%&P Ӹy8sg74Sq㒀$ HDž'CR sL$2QHW% ╉R A!)$ 2 9W HU2<@ W$(Wug֔ eib\z0K}C:hvuچh޸;ui6 Uix>Bs#mkӼU;1Kd}ՠl9 o^-l?LlbJ ^2ŽgdZZ\H hWШ:ԣFͦ\LLx91K-n\cXxbSsnjbl+Nl=zĴt7LݞҨ) ?8'f[ں1ꆭjTg*9PoiՂ]ceğoKE^ZYв]GZnU1g k+4~*F)۲Vz3gKjмHǰ>'/;P9z*[Ngڷk]0RS-F\R ?<YPK dhMӹ~|&e~3"i݂es5:g˴Q]pN'\F]!*!_:.SWؽ0A%a}.OKmX%ǎ 0?IasiiQ-ŘCNl5[׬ zGA[9VTnJL& tF <aobTi(R "qji6BJ1w><@9gy*l?y!#s uEkoFيXe$& | )_BM^SH,H)$2#֎DŽ- |u6U X%_M]9$R"ph+#exuЂ̒;INzLJ_0CK DhGR~:2#7Lׄ=>*&D 4&nH04ŴX,<':9i;;]TW>rN3!sA4;GӸvGydzA>fT][5Xf(@۝r Uf%`Jt{0H{)R8x`~ U"c;QJ]7Uk}2[WᗢE)ߥ6Q' =)G-@2.l9jʑU3u S6pl= {pI(,ƤFCu+WY"6n@eDĤuڋ&[oʨw痟pZ IO?A@ '_ą.++dLy]%UMsŝѢ&L^_|H֧ͮȭ>M4{~FIJuL~E) ;*KX+r+LE4Zՠojx&Gbwbth!`Kq}lz^'ͫ@2cZ`6eٴ|<@@~KqDuǶRNޤD!?i[\,=6hJjNQˢi]iFH@&~,U)o9ʽD@ ?%O.@B-Yʑ@$&"Я^uouCT}bU5rS8w6ߤg?bHTj1(C8s"ž.2mPjÈ seٔh6MBjU)EΣ~H^KK9 u9hCdDӸ5168oQ߸ nEjMQanM1*G_ƍNeu_\6H, IDATMXl֤f.0wT=/)̙8 oڊ=V=V>L\j\F7nRn~%qx&֮Y g¬ŬxRQʈ={/הYrP$gԫ5ȩ_SWTXuZ6Cbz;v5["yl5 7iȼ3gG61wtA2w55|қ뷭M?~Es !r9)`YS&h|@.9Q#G225jX! yݻ9}ׅ71O9h=gykz}b݊L7I1gRfN˥[fP"W0o8_ԮMǪKJѭL;I' zEm֍ɨc0m,CWT&,Rx–593vDA>Oű̚2&0s_5Z@b+^8eW{d]ǂgp ZP3k,fFm@@,I>ذj.c'_EjKf*ʺ $?j86<$IsBK Cf2q4&L¬e[a c4l^3 iq&3}ɷ=IHN|\lY,i X6u^.sWriD:q|b=Մڝ37~9"cIv?ngLΓ̓{X0~,c6GS)8?ˆ31c1N`Bڹ2{` sgOcҔbD$&;W2ml_~+Z?ew}frW(@◙@Ǡȁ@&6m|S)8&pqØ΍թshZ[Cf%NNekpAhCSӶ\x@b/.ģ2wi/ [2~Db#޹%JbԤL`tPpgп {*+H? mZL=Φ5)ӷkY8*8{˕n&L_N uV;%%1K9k jbضck7w=$ )N@ da ^\ 1_\o^v} Hm]H_#gyc SY5m~f$$ 4c憭D+ҸyU4Zr5Lb˺)Rր &0NG F,?lFhD$abK0UG?eNk6U+\=%2gnBJ=Z|+e &b%''/Xudtr my3}hOM_SN@ d~/A\ Ӣ??ߋa256 ǨmGpGѷ.F[,Z)E?f0ˎ w\8{FA0y !2.U*I1ݔ=cCӺP!OiXZQkE%v,=uߨ֦Κ\􁬨&@&@SJ% X䇅BT؅$_.$pf8v!K2pq@W1ᮽӨF67mVTwq`VtsoUvCˤ>I9V9L|z Q!؄f2o lrAER(GPϠ o?J@Jȣۗ˷3P y뎆J ǿmV8u:vVxwiH@ da,d_vu%RQ(9a )ηWQr9ZN\s*@Є惄@}qՎ-S;Ӱb<ӏ)85 >w'4щ2?VT5%iިe;I )p7BX<9H1ٶ¹#RNw ٽc (16_^ASͳXBQVT6EӜ->bߚ)誗aѶe2EyӫfqQYv~7!,و}$2KMI&?/}`d+j1{7?^|ErZ2fG@98{q,=ڤTM7yf@9(r.+F8l#&.{ٓ>$O*@-Yˑ@H9GJ%ttX:(ӋSP6mZa`T]c#p dح)MZHߐ=78Ғc  Xvݥ>!,EnhƔexyjKK M 6E-=ZjF~+# : V@@*'wj"q?ф2 K4nJ=p"o$G@ d+s@f!9H0YcukG|_f\7UxbVk!vs xwGH]%);AGc}BuʕDeM! 3WNNJX!n!ӑ$ R P H,O@*L@G G_*DeHv]p|99 .Xf &Y9Oѿ1'ik%I ;)ywW=@t2$I@ d& YXK[ d-[3I gBjX i <95{.Vl`MLs#NKcܲvR V$,q͜_fqjeI/o [^W!L{Å#ۙ3{o`sF]>8˭=|wßk;,[?y'OP92ϞG'o/Oȳ@٢K@Km5_,i;:EЦ}FMͲ'ί?_7֣9F7@JJӇvSWhT%#I˖8wI-sXIr{l1550].RjƮ:@lkebjbDނ]ƼyGpOy#G#An^mwsRL{C$&yM^ 2/$ /5|@LL[^ihϯuJFbiX u~~~:]#֧]< ?^32-5/W|K E^qLbLLvnOM]0 2vO}$ x؉7_t.J+ ža%b"v#cwR C)&)_L #t8e~jz:j'7WE65`uD'M#cPAРB5#v>8.Zѭ^q|;pimXѿ EvPv)N޳j C۱``k:1U t1zR"RHKMeTXNM Zmn'bOnɶT=Ge!¾ECP+ۆS/e͎;wlof%3n>"_CL;:VSh^*ZѯӔՙ:ojMgո:˕EJ Bl5~аTg垣D%*LiU65Lia(N`OcUgݔEH,e/sN@ |  d2l;r)K*Wj؈A<}x qr@*UD?Fai}a-u5uj%8<: MgS^?E1`<<)zuE ك=hWoA7vބEd#r,rÉďc-lؼ9K 8;=l/嗖$F@ d~+1@1.qGY&r~kWzA3=M#z{Mod:іNtѯ \$&z@fIrdY.j 32C ˄m7 |yc ~ٵgLԚ*ܒy] dA Yl'c;~)NY;bpc]R]E=jQl|>ŭkb"H fԨ#7~^vu`ٗ|uve*3mwOeT;#JkPUU3bܶS[\t+1gC~+΋̮R *wk 9MɣR&o܈ #xGHpϟɗd矁`7O!Ξ< 焅(ϑϳdתG~*4;2Xd(] LI|Lio>ݼ`.'\!R >ewѣG(%rլVmӧ+'ݍ/|p~X$< /YvoF 5}q|YX{c4R]Uidg0*-=}+i>ȚGfHDv:Tm:X*>X366x`S9ٿu /ErjzKL56x[S!*R^RiՉ eKE8Fwh|-rTO d憴Xj.$- Pwf4aф [ Chjv=S@^KXw!? mN~&GvDvKv[a'@*8:99q;wT/1Se>L {dZ,Ow5f,\-K\ 5r[HQ4Nxzo|X_|CCIH{C}rk0nrƁ(Q.)bpT1}/A-9zۂĴ^AnNv\t$nNx"ь6էzixz='0(He{5K̜xzg=c^ZnalZm۰Qi+/SYd2zbi,!o_>_Zp81"-6*W'GaDw!bSgK2Wh*ӸXX2![eE* q=ghȋ8}SٷmH3;1]LsV(1RDr<;eR|MVEQnэNFn" EEy dS-%1>|MKՍW3fᛅpw;@杲)1OcLj~+ c# +q2xc YS H,,IR ?HHg9EsNV.YȂKXlI?by$H Pe|U\2 3 S$I g@挟:P ;)yw$H Pe|U\2 ťt6iȡs3Ĕ/szД9rMψ_;%-5uo8ɟ9_ NH@瘀# 197@+ǎ7QskK)D#-#u[tRN' 2AH?yu#IZ-఍?n;骯FN|+o^aocɽXX9LI|C]Hʘx;%)qtrh;` )ʥZna>bܧDőVoçDfp[,^=+{\sj?ncB]3VNQ苳*}{Df& HK]H,xeZs#0 X= IDATkШSooo}ػ|˩QACLjեi?0wt%.ҝy}ZU0hmDa٩XXT,)*8q&+cOCm]֭i&ht b3$ՖPQҼy37lʰ;>ڴlјaV dlf Qu=ڵkش5w=3W[Ȥ! H$  ^0{9ȫfK*4ԥTl*VIP$q&jVVb)< +3`|ĒygLJ-x*'L0Xs? tɒxF!*bRX*1>_m:fzOYE;OEPJ,Dnn.QQJA) 3;^~JNp3huۣLlb}2=㭵#lLoA2}8{Ek Sgl9I mBE&*dk5?T T ?e@ 9EM1{P Ja٢xqxm8,Mz $^AAZx#ֶ7 #p3N_@\1CCx~ARtYͺQ` _ Kl槒Vˏ̈́#f9YݿcD]L茞,NHͥY? HHSk/{*K/Nݥ%PRe d6CN]ѳgO PQ-IkUvd2قctQU6CB}N{412bphl^_VCqKX`Ua-j<./Bq8H1 -+VCe3(s!Xa%=HR >ڧd^Jf0WMP~BZhLt:W?>|6;=Np}-5^h'-( pME }Ê{~ S/";CfpM!讄 s ͦa#{(um} 9ٙHHGL3m>"T߬7KE'R ki`bU lDr8{/mh۰9,94ܿ򪸨ox aQcbW)o( 0!q}"O.z-$0p<erY#,D /ER62s-݇ 3R0ξsBMCE'WUίm @ֶRy~ ayg54쭧|7!jSo= AFV ǼѮ,ڌXt8|87n #K Bz 1x.^bF+Hvwl6xt;)#ac'aiPa:i>$  ! ts=LCgԥ;3 d&zɣ{>رkF낮=&( MoӉΪ @%af1{c[wU_YWnGvaBlqdl^k7l-#r ??[e9w[$%nف&H c8z@Ÿذe VYrrL0n9kFH(_X jo{6cƭXe֭sWHrbC?;ڔ>)J{*.)m{ oM^{(=ҿ3Wpqr>o8:o]+npur0xzx i9lz@T*+ !Ξԥ4{Xyz? ^ؗoyyୱcY+)P)PNH$??ˣ4{2fee~ sL 9gz?3MHOd5e=ܼ]Mah?c}wwD'~M @U8F THWa,,H?o}zC^Ë́7kRICb0w:N=0tDR '_ѝa6¶#ላGQf6w5y(nnSUlmY3yJPʤ) iR5D(7+ A:\^B6p ܋yސo:t6cb.:kV@{6<as)Xp2 bB-,Z&|z1qx,dWl؃׶^qXؠe6⽻?#N6Z޲WicmVFOHRg*@3եk5!JQS5N]7d/Z6{ B˅csgvht:zFV(M`M{:H6DpYO'^ <- ObڱPoݻqRh:R1k.ٍ!0xħ#51 VYDV lsoR$$=!Ajn! @ux(s?@*zh<82+(s2$ c75Jl|6* ;Hb 7dф켂Uj2;{1X3N<*Q| S.=a΋μ\Q16Č;Ġ [w@nT))@ | tVRC~* ;A4 5DsP+Y"h-ޤ6ZBA^mZK?)ZV2@I5Ƅ@"'+Q|WN"_6/D:颿v\z&F*h(q AdX+@)^R8vbl1o&7n 7nK&N[:.VOLi V3lݪ):el' K1@vqߺG}Z{]!=:@Pեdu)MW 52U*}ɺ l>s!9?́x6%_b%F1\@@Z:,@z[@p,D9?a07=o*uGoq]ۡ2@PաduLg 9:Qx-$pꪾp nr(t;8yhJwvɊÑ͓ĹZ 0y0Jex߀ fd _XnB{^8QqE@v y\Z  #еmK5~rJRРMq ]C TBJG  kE%aN$ =IE X^AcqZXxA=TѽO̚ h?ss{"ʁŨ۬-4{Fa)Hkc~ӭ-]Ja8gb͊Mg⯿fܬT<=UڡWOM6 Ѵ]@u(@Y*=YHqGajBxѽr`޾~B'>~3rNPj.ƌh|l`kȘ8pM\p;rQ4l+gWG~;L魈vC|\TzB Ud J8 k\(_Qt8fY%X') T%@޹~n^KC=Ki z 7.~ o]KSc/[c#ܽsSNip4&Mpҭ/62|H&J0dNjrMNl/ ''wjX9y "HV*Gk+s9;9m{oL> fb߳gz?8⽥ߺ'{ѺN}^VJ}} e$إ(5 QV>I6",%T [Hل@MS@ִQ~@%`Bae#|s]-r[֭luC ۱{e OkS(@Y=:]HZ:Tx$٠)PiNŅ#1G{6 [bmHbmG!|=Ag^sr??3tRv6 @6m Z)J:h֪=4Næ-0a@ ;i b-⟆]jPnA ?]S MѤp T J4M #t.+>G()V1p6 X' >]13k['W f0( Lmhk7ūf GcfFA&Rv/^| cS df 󒝞 ׏ a^b`ceĢa6A@dh=!H+@Yy )d͎徼HKn-lYlµýp`LF5?z޹ڹ/ZKSC4_>vyȇh QC[k&(ô5c"F Zˀ0q_d0z G}0tP3s7mPù{OVA ܲr)!HV򇥣 k$T ? XE{ڧcDIM](jM{狻v@Is,rC@ z@@{|7i#>!̄Dke~oG|L8_CǮqBIvX?SW{c cw> m.Z[TzB Q2ѵAE*CI~ t44Kyap\m%d-<1۷EG>q...?D|\7<^x|\9SS*$d}{pt=K ݝs0lrE &6S΅ǥΣ)Py +!P ܗWRWO?ősW@DwԄ,36"@.F B\=s ^)_޳A47hnx;53I}(G#.)iY(^2;K¬X d)Hٝ!_?@ρCRj ZQJ)@Y"FHAa6L]F.UPE}N ]@PK8XivmuQmWccw&bϱS nvÆ 8;s5a Ƣ>60KubבsHN-6^C@p0hasc9פ@WǘJe y T > ۷npM p~غ%f叱0wvl=ǰ1ض V ܹ < `gm WoQܬ= P7mdۮCHLI#/▱r*D[ңx L!Apv4{OCVfF:#<$HA7<>{rIoO 7g: 1V7/N(3-qj(v @IZ@UWpU6!Ξԥ4{Xyz? ^bcž~opbN,LЧZ5iY:[$uT R@ JԿ}ёHCXhm{ )1!$%ċ}9F7g/@fF:TPPe*P)P>5-b߯)P>_'HR<+@;@_}GX[ $*W*.:6`eeŶw`Gwd)Y _;[ǝݽMJx8 }e%N*@lTCWnqD#0u§A+N`鼷 ͪщ5GȚ+QJ:*y𰸇)vFb޺=.,Ðb8ʩkoE()C#d<5~4U)iygV_UD ( IDATaJQ_G_=8=؊NAj+nq.;^1{bᖓER;vغu"$:曮HdMg(@3T4H?`ٸ5)7B65vS]:}GN⣋7hR;@^Cp~N{ )WpFܬ`:qO1JMkƦJ$둉#:аQ3ĕ j!T(@YZqTR а}a$Txw2TqYpaV^Nᩗ7f3ilï?Н =ra"V-ՂElr"؄ipysLJ6ƌsc(`K٤xX4{f^;R}6,5;a٘&l@N.nrmm a)h-+7NjRl]UcX7g(ZDX?1&ּX|=tALptQF )PC !l4 /R 4r2]pU鵣oy04?'AX5oïw]A2eLѽőћ3oy so= m2N^Src`aVAfM0liQNrcEVin\y .߀_0;/uDMV= 6{%#!#iZKc|4 [@E&&回J_J(<= FAʇl(%x/oBy6xYLӐh*K.+&0CS[H@F;z? j Y̤D>iiHKi]JIܐ[ '?7B} xGg,[<䥚@KFnZJ|VS*w 9u.#, M@??P!.`o@ikD!#3Gt2>iZAP"[;5FpK瀔@Rfŋr[ @VUrg  ֝UB^҅"F%JR{{k/*uVR(߄q{4HiԽWjMۗk sSax[ ݦ )APlBY˧&‹mEZ+u1YsGFr|a@(L} b֎"($bQbcf(a}*િ SpsRF(@Y#D @Dq)_$X(߹ ;Vȕ֊^l `du,[\6%tW醹"2;Ǘ2 :JB abㄨ@\q+0ȕ˦_)5x|*|-fٲyctr7)ȄШ9_f:=d+y]օjg 0G~}0`r\Q>s <@OnP 8@A4N *[3!_ Id 򑜔̚}?Ϳk5#cއ+uz_H=c2v^5^Zݓ;qsSoN ߂rLK̺PxaZ`9ni9ԙ "% u7޿@Z0 ca,og  X@W)99z qGLL bbU]gZ_VWG_ 8@2 cФ8y%H[t\xTg׏@5r@&sXCg:\r @wԤb)}"Bl6 3Çl3_8¼ оi3,q0?n/xnA:zҽY-[yx"*^8%PfZ B}aWg4c\Nh/k ~Hpc$Hˏwn?&ldO%:\oxЮo] l0L죂æᆁ!YYƕsP?:izI9)P @Vt7SRbB9H0/<TUuaS-ăGЦl{ qlJ4o\ rmж"*c}l‰?M!yyyv6lǸǑCVV@}!ײ.5hP 5CU 4{ƊFi?A>jhh$4{?x:|\޿ʡK7M4 /y7CvP &NEWW(lshn‰?(LTɟDHd e)@Ӥ_o-)@  kP(?Eȟ"+%  ӭIE%T)@9ehMUFM  kP(?Eȟ"+%  ӭIE%T)@9ehMUcXn3?-wN@GkSl]e˖arml؁g%M޻ u`8|2#⿪@Pb{p\E?ᄔXk߸8K=#=ᝓ,:EWWЕRg)K kJ(ߪ@27#onCP1G D2q 0aغs;hMj$c@Gut荡ÆBUYJWύ^9L 23"u%rLY=[(r~ ) r ?[ 64jRTH\l^&nÇ(DGG_3)#=6d%5!v?I]22 A}aŮeKM'*tu롃_[)Uh~?)sC~J->M^@" t@KYU~*=#W;7X.mA#;x23JmGK~޻yKz_x9Õ͉XVqyao Prp_K&G +Gz 2I»3Sй\ *@YYǮĥСUt\܇7"r=&[:hg0wtV<}ll͠3NM:[xX.ς7(5kӆLd#4^.h+%GǏ-Yl+7V y4O] rR},n>~;o4Sd)k쭀j8zNnA_1o-[z"> T%@ץkH҃<@2@fFP>lX_"勗q) eoo8w"vbqcİWbkb褊&-@AQ +woh7| pnAd1:6!O-k@c MR'$#g!_;u} ^-Hvv4UBkݞRq0JB/g a&qLv>FAϏ)P~1pX{X&{afgiT<SW.Uns,Rir\Hnu&k+t&{@znG{b 9mI,:sfLy`|,^w¹(-fx~"]U `л/:^򞥟Xl/|ʗ;{ufNáSWҲë1c6M,dy;v|ҙcT{%Mq[wkosa^-L`1ص[>쭮bݔ8pH|Z[<ĤR׸8B{h,ֆ-ڀ c⭥,ά8ź:9a٘>G Vfw/-"^߆%w⾩E|iQZڼ `MxidceV_X B2.&_G[K{7/7Vv C֝*FDh0#7}:cBf -('$$5"$XP,y<@g@0g3QÎ<@  ـ<@ wy ]_/K3ř<@ HHHy<@ @&ϗ6Ҁ<@ yB$'%)Ȕ$DFFy<@ T聴Ԕvn:F y<@ = ,Ay<@ _$uN_2y<@  $$$y<] $|a˒Lq&/y<@ wy ]ү:FVy<{x<@ ~B`ax^ی{KDE|_aL'.^a_-OtdlX9 jjl1ӊ~@A~_lg3y<o7|?-mYpwq `^D8-d+,^0yrg++WfwWgx͍m.!<]P iB ~,K3SF#/'GxFjɗ/V戏))Wejccع+87.DrǸrYc˗7vej" C/*҈4"Uw'9; - ];̕/l#-h+cRkElfT'8ٗ*/$}(2D76ybxMش~ _[?iM) |sb2)HgCB>.pubbb ӛ,wޞU,*w'^6݇Ag28.:'1&^&dpa̸!88)\^΋ cS#$88w'9.X4+=T$F&uwZtql"X-%ړŏcxs<@yHh٬ ],䰸r[.qzĴMa-q|Ćᛔfy GZ o$!&9n\^ՈFiVT4Up̎;>]6ygzDH:6 Dqy(ð2p9I® ۾3pf/3"!. +xRxOr2rA@O5hѸ!n8>}uŠyڡhh@EU=px0дq#vg9~䄩xn癃hkc?;ױ<WwCMAG,Dz?C7%)=@]:aȄ0~odRpth4hMEAYMW},.r1DfdjZ+-%g.@ӦpG>\ $Dz>$0,%*, IAX^n_(g߰][tÞ7×ѵl3W.ĀXSx/L[.>|i)q,Eee()zwiIp|gGCQI :@v{6΃z޸ܒ]g@N9݈׶UݍPQT#_6 сزh4wC` pQG-M}kxgg?$0}Dgp?FΡ<\7o  k}Qz5SrЕoq>u>VZaڴ0r@1{[L_AlD\X3}1!Eٹ,2,E,ȕc=/DG38?mZJ0$9п]aיp AZf?] ׄ 警ԱyjcYm^5 LZKVc}KFMΰ javc{`əLj`pU'! p1|qt$۪W2?Pf~>e@9 *~IDAT"4%6N+CW߄W_ʚ@hN@utx(OG\p ;o͛zn/DEָ a5l Stz=$2 2fځtdh#.%U]J<,.-aq,HC pRU!+ yg9@XH>qE_/c9dM eI-48o~qyՋS.7x8&M{uLwNGMȁGɟOPQPŠjӒjvrX}ސM"|u7B4(OoE+e\f}0SFFx.KzF ,t26aE@6<cz(cpǖec>z!P֟\3=7%qMX=,ɧ׉pyES[~Xz:6@4o;fV) @#Km1/0od7 IE]h\`}GOCǍ@ρ1}tL2S&M0َ}q k.\ 2 ?*/5aSv)C}3k'UbV+Vi`2dpycb/E >(X6_bTd?HXv^eY8TlycHH)\Q&!pbli@+),|ɬ6Y)cHfT2$a&luȴSE7n֭4;)~6 t>h澸ٱ0_'hpI@tCաb љiKG(cXacʤ+L?nEM3%1xIeh?$4(Akc86:!!5:^j khtdʥņ (A\w(æ:OLPs39q Z+uMHD>{N~ŤXDCwh֬IYh&ecYh~]1aI0-Fv]G/)[*jjP= F9,\y} Y 0~p3 OԂgT<4z\t$B}mq\WBI%B)%Fji)(D^qɹ{{t2 Gtb~ZOatyw_?=1}B={[V̀r|m^sL #'OԹpcܽ/d*ߴ`p'f-a!J 3' =kJ:}!k=Cz@RvHܠfI3)9KoÖ h$%֏Ǘϗ ;FO.A&-eGs ).\t?8 fsj7°}кMϚ`vQfYGύpftPQD&ͱdn Fa7BV41uaED(suC}xJ,[<}{-" uf+)ذm6oXGsDb#>l} <@ ~xtax䶧wbxfe/W|Eݝ0+7ޱM^5vtlzkſa+ݶOoXxt}=cҹ?~ƌEۘ1c)/]E9c%8wlj"/D? YlǍ=x:8y2Yinh㎳/X?Atxk⺉?W/wn,?7K\2}1s[*ۘF+OOK~w,6{w.?87 k_sװ>pt6L?HOGrtKn:~;fTB%LC6c}D|Z\X"wڊ@UЄ]T˝兕aEc55z~Sİ| )/q8nd]i!Ө<^" Wx[rpRx !d~%ixaf3\ͫ\LL;;Cb(LQ| ;y!ոĴU9{&Ut/2&{qqO(pCqi^bp) _KwD\6%~v| dw`DXKkcr,׬ ue3ѭ رNzV+Wz.~\+skj늦-"$,(%O ܤ̎lN=n EMo{Tx(_R˃ `{GP6ppG|рy5ilI㟃X}͏N6z_Z.v6lDr \:-̖mps.U^HR/ -IKy"D̔_gk e`iM:/fh %s}3&b6J[o=^scpeMSU`P^$d7@7/Ay^cqy ڈil+*ɋgO% W)A?}ؓy 1 2 3 0 8 0 537 493 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?NLZ((((()7QK_: *f/m_OV{ m%ŝ1~Xv9v.4{8ּƟg? F>44{KVCk*D2ޓ v~' x֑/&%{#6J 88#4quyz>x4A<ɝ_oQ|Emx iWSIFM-iZBu W1C4f;q0\dBeqBRCx&_ald*8@rnz5φXMn>,Q&nႱ.˹ =0k?gBo4o/W> \4I4 :C>ާ?0ލ?:Qr.h?x }?ď3>kDDPݍ>/?4cPu=څāƟcEEځ1PVGpGOT?>(AG/8Qab`)܇dr:|υ6| x;St4[A1.cnFq@Ec9ĺ7/?wkIWHhܗ_( $l?m}׆V 2O~l f>qF+-GۼѴOZмc%5կth@˔=TͷKK@估|1//uU-6̡Xɸr`:(.?g[NF,^֯.mnʆ`$;Il5!\}N Q8JPF>zP?:2=E|'3|tk᫻QsF*Xڒ|7=woh7zC/ yR!$ p23@`{ξrbffֵ:mΣ jaH"#l!fTҳ#ni(Ҿt> LMky$!GH€6ߊ{pdZr_v4 N?ڋZcw7WrˌNyŨ?mM>gzևO[Uđ4%`2N L:|`%OZޕ:W!Vi"˅D NIyWh_?hxH׭!/ \$ZO,2)vn013֖K5%V& K䄕 p?*+tv5-s\]9-kjϵ^IE OB+0-#p֫_Cj>w?95$yQ;t^U?Ʒ~ Z|Z|ܛhK-P1q66I]9O żn`@t 94Ogς~KPύ<ͮ&xeUJ.q׵}1E/Z).>&:=_c[IĶ̟9_j(ҵ.ĥZkybRH$wM7k ^?-F=@NmW>`dު$R1a01Rzp?;"8᷊<'/6#wͣ\4cmA+? N}7W_Q%@bګ'vq}%rȮ\>΋ީx^|XF|) ͤ_)lE cx5xGuWw3(Pe*;'_]Ӝh|9>!x?3hq=vkaZfSx8yu_#о'uM7J5/E3<EKe 788}ލ拁ÿǞ)/?=%m4 Zo$Gz`W?8׼-x:<'\Xsi Cn6?}}c>\>^7|-|/URɐpMz~!;&sxwTZ[YUgq!*ͱY7U$ Wٛ9i[,SH؃ፍMi~ Xki kX { @qT6iIlnHc:wK6: n#PW/4\o?d?hCcK+jhc}s8&$dw0Wp@=25S◊V/ |F6Zwgoo(`7[isӮ>޴_Ƌ^=g+ jzf[ M]uG,N780qrU`@y'Gf KƤ\){jv=׷Mu<,>dO;y<`q^clmc4XAlۣS~\l6.ܟ@Ѭs+rLD?¨[} (dc_7]x>4񶿡^m "QL\Kɲ$PG#Tk{ϧl[ߡbrC+/ \|:OO-ͷ"X $d%7#w Tx(|}㦫/L[ Dԣnx٢,>PC/ KdXϕ_2}k;_k^Ҽ=YMwp;#b4f(p9+~ b㳷Z;kv#"&bcM+쿲,?/Qa>V¹`'l.C?vڂysj:6psv#OQo4 -sY^נmFQy26H:`a>VKο'4KIqNo i7m  𿋴? x{Xt TnR# ZZȰ+GE[ߥ ~CZ=Nՠҥ:jL 1#)%B=+UE%Mk Sė׫oa% n"/^4'HIqm|Ovᛟi+u[[[o "QBxWFE[ߥ ?,?/WxVKn@TȰ+GE[ߥ ETȰ+GE[ߥ ETȰ+GE[ߥ ETȰ+GE[ߥ ETȰ+GE[ߥ ETȰ+GE[ߥ ETȰ+GE[ߥ ETȰ+RGak[ģ( ?q>|wK&j KqP˩YARfVSs_fx]KDI*s"$W㶸/j=1-,AO**89mnSNIe_Qiz{[CKKN+tʁ27$dWփz .s|^>jM'>^}9 Ɓ]#ַtzk_ յw幖#/Vvk^ 7/>6+D;{6 vH ¡#_aˌ` \w?3ǚV@g-ڪc+=r/ٓp>\p4 8~?No꽼=+=6˿rN}0%[K)~~Lw/ [oQM6䔮)r2sҳ> [i^6ƗzJ? &ڝbadW]9HV ˀ[#=0ߌ]C|1.1+ i'l+KE%^A .id}<spT+π\Kw=sj$#<okE}p I;r.FFG'+{jw0InnwmbHۜUpמI5M1f9A[ \4X% `{i*ZGZSx>{^(l.5zSK@nD1ev |g9T/Ь^{]IH,XL)6q;4SZlO/sDԼU{nt up:W|*h_$to Xq_SQBV(k {IV<7.yi)8BAB\Axo:7w]߅#TўK.ISNԾY` F0n9>}~"j>kZGpZ91$WG(|.~U]:QiuD72&q=`ƅźt6a`.$l-YӃ:tм?]Z/,Oo-CS[46pfI([7?ZV?=']-co+[~{([H~U`n3_CƺJlu1㏵-orY{54Rҩڸ>%v[Jt[ BײnRmmAR_P \ny)Ե֝nUM'8$W nDGJ'S|Wk^)A.>WAK Kmy[FΩ)3_R |I/<_oCФ5ldx5,c;v3@ſKiVFj2R[mos_TP>O|(׉m>(xP._ z棥=v\GUI^lf[)գ6wVHq# 9^E[O.ZJ(XQE((((((((Q֗'?ˌf$(PI5hz 0WocO68,ѕvb9Jt9>#v8n+i]Ϩi"tT] e A<_>߇_3[^ifԴ]?Þ.ҽy(liovqڎ'ڼ+Ɵޡc[~(ð&w c#D&hyfXczw5v>sC/%Wu+zѓFO|yei^ fx?T4M22<)}BH=?ZK P!~ZVeb^La =+3&x@||\.moJ7SC)iDFHBS!8#fԌ&m7>%֚ytCqrpMx?Jnzv_ i;._!Wo$Xa42a_E2uj|1[ͤys+q}F=x=w;!O]?jh~ ϊ5kNjf .{vvP4F&G}x_A~'F/I$ZHVW R(Vh.K8^C~#e?hKK]Ude#ڜxxB\{% [7E1^zz<{v03ւ8#KQDŽt S-tk[5f*<ҽD}|ZU]B82MkɴC;Up@ҝbR=Ҋ(PRRۚŃvK}3RqQ$vV EI/O+GZ7sg@fkc^g_ \z枺HnP&#bcpx`:h&62t}P۷^B2tS׊xKoqGjV.g Ub8W|-Ğ?>&ocXYIg. (Dın}]/_/_ׂ~{kcaX43Kw$cq]f^huAO@|6ljl 1m<<C_@ͶZjryP?Aj9 7^ 7^ *;G]X.q۲Uo۲UovQ`n@mWn@mWQE/_/_aE G]X.q۲Uo۲UovQ`n@mWn@mWQE/_/_aE G]X.q۲Uo۲UovQ`n@mWsMblb:&p$]$G+ ֤4kI6B2@gC4 Hl6[۽K:QJ8Rw,Jõ..%ay_UR+~Nj U񝴚uu jf#_҂@7Gƾ'F?Uc}[oHo<3揦i:M,т3(Pb Ï~=| &Ynq%SJ2JeNA9?oedžh0X5ηhڐ@L#/T0`9#q쿳WO/E+|ˋ.m4kɮ`;B[4;y5x} qOF|s#mƧ&)IRXp1aA^Wόl<}OxiV"Mymy]b~PJch'ޥ+ůكa]ῄ5OOچwkEg{׮|4;څQH(~ 3_=>ƪt]r4{Oĩu0r9|+t]kNg3ei7a\Os;\2O$dCœm_NֶFjhIǢ@o,<欍_QNg?go?٫NitqmauK';uۑr"OŠŢxs4ws1dV7_mKY_R_Q KYtX )i\xXCÞ-kKZD&MR3pMkx^71[x-^e3Gw䘄ePw3Zoo>@,߆̨/p"ǵ]x9 oҳ|Ǣ3ᧈ4jj6$K1by~[ BJ9OzRz5  HQG 8:t4ځ&Z%SPhlt[i.=<[:Wv+Q Ŷ>-xV-  ηizחLJmKn+DomK~GS~ܚ&xkURi_`"Hfc$oE^txJS^$֭F6ԥ),H!-&Om/ևwehמ՞Yq f B>8xBӮk_uH!|*Om.oo_xxZ\ZeZfmO`n@%*asKG_s~ 749_PvK7!I~uwCx-+. =@N.3l|9NӴ*\Z,LR,1`K2_,L"R. 1~;_4g -0'4 ^+g+_?uw"M/GT1) "1G~kXlt] .p6 A$_@nWsO|+wi\&YU݈D8  :f+X?y.sY.g B4-C)ºO~GggI^_n,RS T8Wwlo?cO.^I'P[# q$ C2`{?m]zǂ>,6YG̞O8 WiH8/e/t-|)o k:n(MYla!I@ I;߳f5Bu\/XIR)?h q>i?Ẏ lEt&)J}i+L_|'}Av3[j9kWH6 6q:I?v>ڟn/쭴[;8V ʌ+qJ$k'"|A>]^x @hW6_f&xp1s0};஽{h/#g6-ˆ5s3ghgFxj1 푪5/cĶ޷\Z iFxddIk! V'0P8|{||@ҴK=NzxOPXŚ bcn}I}Aq4Ӷ=*"?ƏEbؽX+ðxoǡi)?噗gkw_G"!9ϭ%Qw_?Ƙ?c8>}Aq4EQW;L U_E>}Aiz;G"bCw_?ƏEEQw_?Ƌz^Gw_?ƏE.)ifۋkmb-՘ij [$VxV/o;OWw_?Ƌl^voGl^;w_?ƏE.+  Yཿ}Aq4?yc?yEc8q 1 w"?ƏEal^l^;w_G"?ƀx6/?vtåiڼᐱiJYp9}+jkx'E"{1D?Zp~-ueI/okM"  @d}L 3'~!'»\kGVb)#K g#jo k: j vRFUkQ&PX[dW|N']t3V?5׺L|$lR ۽%>ڗZJvɨZֱ)в(k ?ol|2o$hqʻ(nЊkυ[{]#F_xgZM`g,mDYfaj]2 \xGťơ /i+v  \$SDXKJW?I\ӣvMrmp'i8+r(MAGYl}2>89_xw&5<xV[hmtl>&<3[V w8l}>,aJ ,(( ܻԚU ZI(ͼW;\i.#v*p^74IⷺC-s H'_ ^o#淁~""K b+V#N88߈:&?k/SGZ-X_5`FM ؔHYy$8˕u6bOǸKl15A!8+޾mG^idOZ_L3Z,Wn듆f݈9c^jRV|Q>4Ŏh X o+.{Z#i'e eд_Gm%ί-uac#XN+[W;$x]x#MZ3oȻTDX`%<Ɵ.5vɧү=kiu i*Aqll8ES/8gl|Ak:XV/I&H߆>qJ_\C|޿j[{c|zpՌi?i/'o.ݴgjkztil"2,J8bFxelZE[Uިuh.ђ/ 4[;3;C־0,?_Υhݮ5hAW`%z™ds[o]<ϴ2=<̓-q4>߆4f&c}r"Zo xUw.sGNIE\U vC9@_?Q<'(.=xOsT .o* ( E\U7WAEAvs- 6ᴏ jY5$b]''W~zW"g?뮧p?ueWZ׾0!x$CFB611]/o~h>1Sm1ރ%aܹ(ͼ ʓ xǟDŽ4 v>$>ӛ\u6n'(Aa,{m+@{+Gڮ_ kHKnM^&eW%@8 #I}B)jMejZMU):lpqT~$PoxVE|Tcy?*ž!a<9kM6̊T)‚ܖ3օ  eRnvQ/=6b֯!6ɱb>.YG4녹"YPBȌVg"״mVq̢w A94R>BJY;xx "N)P20pAx\Ή=DQ"f d< ti5>nTU;d:8H8ySfzen- )T7>Ү#M,lHq Fx V> :5-YVEnp赁X-f{s4`tZ;hm"bXaw\ރ#^%&[N|;rzc[9Qw0vl䞕[m3z+{{n"9E|t{ުM*)L9̕^r}gx (xnxcQ;2ExHTU3p{izS"CIp^ k9nn?ƠOmE6 +΁b 2zGpXiixBt,1'Cc8Pài_ŧZG|r([k@iGk A!f%rNI#뚯a+L*l;F\h-\`wϮ*^8ЧDžSPAohYmm1U|~պ==.Oh׶גI}C9 G ֿ'z'I5kmmwNѓ|kCs/?r$~i?;?O??9m({\ ?'z'I4wԟ /P=rQAo9@wԟ /G'z'I5#-^ky?'z'I4wԟ /P=rQAo9@]mԙiA!i +gs/?rGr??r8_ u YBϛG =hŞy)Zu){>b6SׯsZ''Ze'#Z]( \$M0 lQXANxNKM3u*qMfմ2Ux'B-Gi  We' J oqL opvmb'4 & DXk PѓU%Ʒ^[&+.ڤ x'5?_xK+5/i 4WSv79 {Wg3t=CCFѤm ,ZsW[ŵY&cq0$(ʭn ק?]FҬ\FiƝyaͬR%S+<9W'|=| V꺄j:ޣm8%sKp̚Y幥@l4B-\CqYi|)$5῏ Z6^÷Ƨ gnV 7 |Rn]zW˛{H1|5oD'E˭xOM3PJ^-UB25ktMo7u #?Gm}Ki[fWdPB|Ų+⮹Ss&ux8&O8yujs澇??xNt҃.R帵ӷ'85xӾxoM:ȋ6E&epHaҘXv?<S}_4똭 lFPfVo>5hﲀ#ҳ?J~5!I;o?Gid'v2-?Dwg?p4VO%/VǴ?#ҳ??OE|;oiYV_}hE|V_J~jAglHfh3hCiWSS?Ɯm-[h9?%)xG(l<>&4ԔG<=>gi}}hE|;`t}֗/揱ϴ_+߰x{}:>?KvG/߰x{}:>?KvG/߰x{}:>?چirSBR7yivq(&Ez_& `t}C_ӜM"C#Y_rox{}:>?/H4?/G$or_x{}:>?/H4?/G$or_x{}:>?/H4?/G$or_x{}:>?/H4?/G$or_x{}:>?/H4?/G$or_x{}:>?/H4?/G$or_x{}:>?/H4?/G$or_x{}:>?/H4?/G$or_x{}:>?/H4?/G$or_x{}:>?/H4?/G$or_x{}:>?/H4?/H|Cf}?_&~?ݤuؖ%o*}S[%1e^a ,T@^+7o]~o zt)-c|,ɜ1+5?<q/|C;smiVsK2h@2m`?k/ >S#4izAq 46\3^koO#>û^uwj3 r,0Ɛ;awI C4>%k}tccJ?h-gz}83^;n~WMC>*`ѡ2mSNٕlci|> qVFnjg]}$6K8m6y{w ٟ5źzROP}zSzl)-m,νڼ/ >G7\\iԭ:n#aRFr0z/xaGټνcޖ|k>ag}O*,2_i,v/0;hgOx+w[OIڳY=!B)+6q9& ~Ӿ 6iڇ׺DV ;33^\]#m:n7@3t_>x[G⣭P}լG)cpnnN?' W {Vij:j}C"Nlk%E̊[e;NOLTŸ8Ɖr:{*JAkCOȾ$hGD14Y8_3fH3OG |9O_#gH]k "X݄0NHѱ=Q4oxwZ撺(1SUVfM>E2TόVye]4^\\5+xm5W # BS]zǀ$O:-'AӬD+v- Y@ff7tzۮHiBrT"`}9>,iPռφ&Դ !T&C.@,A#^M4%H]:H r@$1$|~>, Z׋?}kXuh('4/٢NC#U^. _Y&GEiћYI<ؼv1FG}wg}OZ<\烵Ot jS2WWO$1@ <02>a>[̣̠e0ZQP0ZQP0ZQP0ZQP0ZQP0ZQP0ZQP0ZQP!$ 'gc Ҿ!xzmVY|a,S[JbU%*yq\Wk!ϸ5O4~`_jNzu?t Jp] &i6+:F9 cҁ1Vc:Q W=\/?eZxt Ɖk4MpC).I$mٕƿmYOXj7VCi}(4fEgg4:3=V>3Лjs>+_m'÷]"8*v@ 9[x~ 76:?.m{XVȝTnOn=a\?4п-k4= |8< ORB7+bu=mm2(8s֛Oŝf3jqc}&+Rьn#^Q ?)k}SM֠\~nTzԺxzX+>n~4tfFE>ct- ׆<[xKK|ˍ$u_h]kcq^y+ǣTmV5:-(\IĄ'&;>;| Oxf;tz{VU~Q6YC`Nz9񞅌jcQ Ak_+O/6/ousV$կO$cH kgƟ \:3ݭ֖-ݞe-BEUm V>b&ztM |ԆH\/?^;X^x[ĊZ[-RK.BFS۵k= M4.?mk+ᖭ[kMktyǐ!wp}+SOf}p沕'Pu,(hNXzvMMZWt|n[{? >iB%ªK|0ON|P4oy \]I}k ]*ܨM`7:XB?~ xt=t/M7l-s~<6ӵ71G}s(H'"=zX^2tK?ڷ9;])nt"6wHe Qoe [\h}ϥR5 Uޛ}gqeuC4-. z{/Yx x?[ӠҬ'7N$ERb@@nq5Zڋ?#ROOkwJpSa b ZxMѴk\6ͅRIbzI$I'Bc+,5; c}!w(SS@sO9#XwSM Z+ Gg!#k_95xú̺tyjw5CP<ghjضkqiW7Kurvc(s__ ?Mo玅Mj?x{Fnq4.]CEL[YA v_Juި$mEnd6-khAg пshxh_9?fSIl.PK+h'#U 5l4.c?5:M_ ?wU>13jQjZ vjCKoeI *9J}gz?;|Ijvk2^q8fB.iX9OMo玅I пsj׌?h7:N.bmd. 1 ZXdf_ÿWo+خ{}7Qly((hs?5:M ?OwqOkQhzڄU̒}!xR<7Aۿ'=)6y[Gapzd[<ceRvy#s4Ocvdxi[uw|DQXQx3DZCӣܒZ.#2cw@^Ǟm{o1BlftJ|ؿZ}MEu6~jz񮋩'm~Q[xݠY07@ ]sz¬1ڢBOO Ć@ pKt rs<Ԗ8|4/|`tf|g]kv#PT{IH7/̾ה6|i-4zf텼3(ݒ |'mrk-+OdfC&"im2pxyO/_lomZZauX^഍nQ2a\c[DŽtk>LvņߘWlad ,@M O|pu /m~!Cr-& [BKlێH$qz'?kx{5=[E׬/seQrrA ?j RӴwN->M_L{X e` 3} w ^G|%K/l.ͦ[^5S 76Q^:xVkgo ehH:23gptO+#ѯ;.,b}M4WViP6y`16]/*/exn}AhIY%pw]2dq@}zǾ2ּi!HL NЬ(Su J55nuXO5|=[,?>F4mmu%ʲ ﷃU=OY7+>_}/?[?ȯ|)%ӌWџ 1m7EhIt济7ֈy9BI# ?uuODd[_1idx.}kwRi| <(ZچA#[{}LN0zd_[KBV(◁|GEqx/ I$Yj/! B:0LlGxO~˞9,^UZj}NsvˀNѤ).ea/6~kDX"%BPat\&:<1jĺΟ-cTK;JV{dXfOYd02J?RmZ7k?> ~̾hϴAbd)*[ˈw+澋m@m)fۚXԢNHLŸk;[xA+Lit:U7A'V𭧌mO]_؏-5G\0Yw >CO/=*-u CJbY!&DSOAZ_>D׼y-°_OxRNT&ӧiEbs!})W&,~ҵCo&6dO>2k.t[i5fО'lK=A+Yb+ǃ^j-_7oWp &.k8 VuY~HUgv:WTۭ1 xFj@0=jѧir3%#4bcʏa7x? CлզQ!iY#7ݰ\gs^ uc1Rg2ukwQ;vk @]Zg Yzz ? loCYy $~W,l:Mrf_\𾃭^XѴ j^O%#I$̚vHͥ8l4RJ>k^ #jA⋭N;Inlt?)>x* L4{}?šU"Oy#Gf%AzF"$DQE {"Ԯȫy_5(A݋sCWKަE*UMVwtc>xB~O kwvFP#哾GC_Cnl-Is&Lp#(U_ o߇MFNow6kZjAcrmѬ#T1 [sOYeZxzgwîMׁ$P(pYC||;q*Cմm.7D,Vt|׷hbd1B/ +{y94薷WZni -+B#1‚rcoƷ"6Ү:W5{ke-+?C x=sWRzCJ]7:}{sA+9[^!@cc;qZ"ЧFM&M>WO7UGm6c]W$.qdb/~;KmZ".gĺ" ;B`J|̈́L/}{W9N֬RR<_g=8&D84]YZŧEy.q ±<;1b_3?ZmO'Gw Hۿm=v_lmӴwUΧ=-PV68!NqǢ|*CS::&&~h<bER >e4ڻb[XGxSS|Z/_'e_\|I^iZO4nl\ܠJi=jϛvo)Vִdl,cD;%dN@rxٳ$yt]3"m`Rԍq\I,u!쌃 ;[^$o<]yseejW_l[He6C,#.6V;۠V?i _R/O^?'NK;iI37T+J \߳~c>V"MLҬ&_ݠ|9j%j7~j:~g2I @mwc#? .g-/lt]uDۙRC6Р sGd9IOSŞ6_bO] ydHIh79u_.5 MG\ӴeyHH-95o-׉ov糎]B+t(3(,O#:!ω A5vf,eqnl\ye<ٷ$0?fmx;P?|QĚgKaۯ绌Kn E=͗uSzN>7H|)AcJlouK^ZF6Vu  ¶ns^*˧EO/ dr9.QTW1/Aɡjy]Ѵv`k*.2b ]+)":ڇ*u ڶ唆-',*4e-P܃ ˓K6_#N閟m2H"6aN9'# dеǽQ_?|V5|&~w;[׈,RW$h~d%cW v~+E|K{NMWM-.StS3I21) hz ;ExO?k x;]t~7b<33LiIaIL1FP6AS ?k VeD5Y4[?KҮ ˑY YH?k xZFgx ;[4]XiŹa"E T|EiCHv~idgׇct/\Xe[\@k,IR3*Ogu^ڭ֘:ȫy_5+ǿ*Jy`>#u7htJ|ؿȸZr<\ 1IWA[Kk]WȰSC hJI( @^r?A<"H:'BL\už$ltRKu0 h2w/ *8{Pc~^&EΟZy[+{5.kvubDb+|[iϭkOo9c7 Z//-.>{۔VT3=}čSBS^!Ν☮W  D"bgQ"*?Ǿ)bkW>,5 KX [h dVXR8m:v %῱Cǎ|Ui~:ujAdK'ʔ PMv>$Wſzυdmyo-f DU38 wt/wg)tM?w01V?#Z5|hī_7's  5m"tݟ5+v*IN5/h/n8>VbT*^[T<.S9>$x/Sh"Ӭ[AW$P?8kmN'#v:u-ۋbQXI ʚ?f^|F%/:ޡhe+Y%;d2'LaIPfxoe?i&յDxGJkcNФȷ5 JN  Q/[{]7Qմhi3\X=D{nAl#=1^YB-߃.4KM[©m?wsҗ›Anf^50ʑacbWY8m`nx|&Kc\x\6A!\y#XqWQM MYT[XhSdrͰy@50e) 'A&X32 1NGroaD/Vu{-!KKeDPveUO-v>^׸{ RUލ=w%$ 2HB8ERW^m6kvе]V]3r9nF3+=vxkY_yYY<k0 ܾI^c⮛V)`yf( i цA#ޚi6r_|o?߄%gS%ַlmB,PK6Y1=_~&k^ YPIӯtKJX<22pb^0,;_Q 09+\gsǞzTg5-O^·W7)2>h% w30b}9~xg_Ե?]xGPn.!̓)VvldLoZj_WÿǦxX燤$/nZ d%)$qZ|M?~xk+{icVU,q4*d+78$s^`zSJD?zgc7Kl]j6ʲmDSfYzG4`:hs|Q@ѬM%F)H"C"1ej߲_.7NR22˶)WyLPka"x]j5Kki&mgX`7U C9+u }Q1E|y m+wxoX^Zy&!yRmaf^ۅ{vx-k-̒f<$pU Y$-!W,3_ |MxOm+H>P7):wrFWfs >^2vQ(j>?q%4Of-nmJ-bu5ݤm`95c j5 k@a9ԯp65_}up/o%iԬCSy' J1I#Wo~$:GEN-oTle1?͇!^V?!iudݳ6&-jF䍧Jz%Mw$7N@b+,y9_|"՝zeEqԞb._,1 s\oǺ%."ԭUs,2Gq r|;ԸS<7@Ms_ ࡺ=VPހAC[_ռ By%m>xž!-×W/%M,N%I4 0Sj=rGq b |4M{1_7I#o6amWಙ6}v_g/~аhV-/s,,Z6p:> x;_\hhZ=-D)-w!0xϥA fV'ፆ&t[3BdbFZ>d^m|u1/ckj4 ZmǸSmS}Ǿ2~7X.)Le(w'ן|<_wW 7۵[vSV& $;&^+8~&EfhF2 UI]w6->{IE{Q S0 r#\߉^)O?j}_Z~Y :(*bI04 I!y\o'?ďx\kr[iR^麄lѼe`i󑓐ҦVѢzş?x/[pp$TPa ǒ7]u j+񈱶$95[m?Roh-Y]&Sf18P=S)_j>. mݬIi vdV= x'\P)&:zg폣_ xFt A{cjP9!.WӨZ/||h^ ^/]Y`ַ$孛ܟ 384ںQ8kZ-[;vkMR{r\eoX3Vkk:&jZĂKw0,ϸyVCHFGwd|Gv;RKZ&'~Gu?$%w^dk 1ޓ蟲t]]7ivqyPޙP_Z! \Jwo=#%7W+I~S9FpqZWğ7;Vksj{C$Q *{ҾZ _2W<Þ^ ]5v]aFV>`U+bGZhWV-n4ʆhd! zsӊ/`>=i785kvV 15kk w){bÎji4MlZKmy+4Xg!:@GӞb㯵ԜgJt~hluw6ZvAm#W2 fFF_O_;l=}%@hq6LD!yI_[ ϦҍwH#7R0?‹yA3I@k4*~}NDKխhĆO0NłF@8_q6O[<+7xfd[Hc293"~ b;=s_=oz#@_x "Ie$Cq}ݓsZۆMfufZͩ"$7grs$gR)wa>H]T E@ ԞڳA!V*JAϘ#p㯵Uh?+$ɬ_ͽq Jo' (ׅԲG&|wzCZPVm>Qy/ڛ_:z G~4ōZ?-5,#)q\5gYOneog#|% I[ibR2_*\:f>kERcl氼{"Ԫ/|Bt:p4&Ӓ;Fx=״=Kn#$C"냼yտ_k?_ZΧL|]hd'UEa@c'i#'u:?n:Au6QH-eg’c 6^#O;|a}u,|3iM|EڅYyJ<~-`Dx4?7IJi%Ȑm1޸?O;χ+Jt"Km7+*4R^@ 8&ߵ_|+Lq2÷Ψ3޵ g2#^QS!yW7THIi!4 ᮣ1΂!;&`3ASLB|Y42HM!a9m/q18Gj0o֊3/ si6^ I?.1iJHw9]ڏ]x/ xF}gHZ~QBɇB|3:^-mOasr+lj  թc< i{w?隝je!xXnrE ju_~xᆝ-7#5ZSdG5$Q`:+:|Gr|y=;Ok7C{ad?*3o}_uxQx_^4=`%/ +?xb1^dbn|)|,־$^j>,(G)vH$<6?zWO: 5[弗B=..]UtY"a6fLb!/OT ű^x\bxPL4OGe9>mZ}KPi* H}} s4]*"+7II>蚋v_*k |sxyΖeFVy#xQ 90sKJɏc'1Ѽ%x&NkymE/rx!PmuXWQu o hW"xg#}F^ص]WWlK\Ib>h%s_A".L6.Y[đkZ-hh\,gV35P~ƞ%ݭI۟ 7ZI&{gƞh"y3zWRޮғZ. χQx tyi"`7#bk?Kg}s3=z~!1 NBzs]WxT[ĚvxwLItԴֹxeD*A`k۩CJ,+t<g I6V7R[a;2_pꊙQ99<>"]B! 7qq6ʧ3n{wy=zm^NaWwmeZK[EYDG־E+Oi.k?xT Ka,mICy^++N<;6^u? Ix$g͚(vRS{]Mto3f=J63ڄ,yOƺxOtM?-qqA0zרK@$gW 6 3/t)~x(^31Hn93W! gxkWV'Is4ޤZ}_OKc e>5ƣ_Cg^ٽ+7D8ƽjsn X\}I({ש|{^KyoIe#\ת>,v4rF$`?cjrxƽ_f? X%X[$j嫟2]XWp;'d񞌞4Ul2K٢y!|0#2`־?~3bڽJ=~[Տ}u xzVKa~ UC֧BstϢa8Om*ww~|mjxKnibmg2=ܓL&wYaW%Q yߵv~!Yvv|?kzEN+pZ4s*#A(蚭lj<%wdItդS͈L|HB6-ݑxV~=^@-%2ºqg?yo?:o7~e牯u 5 j?.ʃ'NDksWs)XR-kyצE]a|;Ⲯ?mJž(to k"ѯ4!OyarҘ褣 t*{К3վ<Ὲ|Qk= {+eN:G?c4 ssR|?ux^i\3gqm 6h(U{Gg++:/EcRO4*;RTX}33W:ֿ Z\xS[]Mo8Lck/_A7S1Jtx<# k>ծཐ۶̶"p[ a6}g&@𮍦_ͫ_Coqps%̈ZVb ?Z /z7^KYnNx;d QeW oo|//tXxVV(R+?>gm1es@~~玵߇:N[M6ֽݘ/ZEm9&PoWuasMKz߈mb7ӭ1;.! 䑞(8/ᝧ#vnaI.Uܬ: z2k?h/MӢ5'׷c?ːcs3z< \o[SKom FrId6;T@g'&y>8|1~T:7r UC c}=ɨɦZj%7ڹxL|XJ@ETHM־dLxn/iwz^jo K8,…sN)Nk~z|+N=W:%Eob5^VPZk/c߃C@]Oy-> cS_ 1l12SWBz;VWĿWmg>/_ Xˡxw-)5]NK{&76M?rw X9A_ۗ lRë]@K~(u܋,Zc-98oJ/w:mC_tkKմ7L#6_JEE3H>`kZ/-.|'o~/ɽYȋ+÷h&x9+al}IM$*>>xGφlgźު_,(`@vݐ``תxk߉9;mVI,v́R~\1@}J7|5m%m?_XCm>o嬅s)+נ|*徳CLQZj}H*JaȀ`6@l= -|0xo!K%֓iw-%TIlǖ$O+E[ѩ]s=VjSĿuo@ZO->% mbcxDuA\u/wϋ~.nbGLj~-[3ۘCwp9Q+|=pv^%@-H |K"YF7/0Xcy#2C+.0*vj-,/Ù|c\]Skh927l޲-x'V7ƟjRx'\}2V v7PF~6t Y|Zڞ( EmǙa5"6HE#F vcq#[;ō./xKJvm-Ɯ[B( pYAZF i@mCkȬV+K60kf?ٻ՗KKx6iƥcusm tʨTsq^+ǿ4|i&!Ex\յYu258[Œq q^I#e­S⟈t/ [x7Nyo*23,ot+t]?io7|;[hͫOKnkkǶ@AcUl/3>.:^VڭmdA ]7xxmlb;8"e ,}OT~lgY]:n&YKuwN꤅˜fؤ߳/xVo.nU\"cTnϹsŸq63W5ɠ +6#|͵@%\ߌ~$r-k[C-z;1ж˸d"`qҸ oվ^'|lzc6+Y/&xe}Em= 0)y49QY܋I;ygRwq:%}x.>j4ko!%aV07y x6Og+Λhڛ .Emqƽşx'_xLX|ww2F;Ӳz\.koil(+3iKsUχ?5_+m{QћNnomZ1@ 21^û'ך~_5O? 5i:ZvARGy^i0\I ziP5~ xKU:u6Qy^462r1  h|6k3Zhu!Yf]vm+,1GJ|g7?6k +گ8[v?/+ppKד[z_|,sY|+6Kcmgq-rĬ!$\P'wctin?ZΩO%k 8^Ln?e}O\jr\.eX=Gj‡"k&~ʿ56{? k^ԧ ^[",R,G&alL?GύNuhi4KZU`F>ahI8PCox࿊aW?nS]"$ pj˿=SK#MI˗J౉ y 8'\bZ5;{H|=jWVŧmdA3Cn.pp E{Gvu F-=5-;PO]&fr, %HAɠSIu-Bž0ߋ5SOԞ;{ \+pA\ckcX|7O >3|EJ^$24}/sP$`r5C{_9~ۚϋ= Zݞnu: IfgQTpsp1ɤ*5yǷO6 ^r?gF< Q ^kofB}>^ ǃmSCwuuMk[  B8OI<_w|k?]Jth%he+ a{"vZ;uߍsmŷ~#.tY%4\<2x'DME ۤ{%̶M#z`JNGS^_U<mn>'ojwwn;gmTdcc@s!]k>/}Yq%A rd$iQl^\x{V[“ys*:|0# {Gχ8M /SZGj]ڕi51%&Aw! `/ڿ);G}u*yR#qepk;>4>=MGE>70L i<'7~g}.}قrqڼݞ{uĺaXԨ0Ko>flW+㿍;xoy'3 %Ҩ7X!X6#n[=H|c\PoFx"W_S$4-0#TG rAj\O5 FzރiNpAnPdm8Gj>lo5|ih׵_2,rЕdq;RZ]cYǎ/:Ϊ}=)dP@13^:QGG?Ƌ/?-zNmshUw(r7)V, hk\SGT.K!i&6P9R#wv It[Mm/2o~Z^H>TR~w,w;jռ]HRJdA}E &|4ΛL;NK anc6!7|Ҫ\{gVT[H{uqueb]+:Q0</>%% m|/G[S Ko{λC4Dsw2(&$}dC{x\ խhOuZmtH'v130})6>Xsye,gwA#8}E|o1Լ MjƖM1o|L8нVǺxx9׼Ks> }|Ecf b.a=sS1N75LJm߲n'Wʿ ~Pq_)|4%\[xK>hV QXYne2\ǁr1G?L jþ&.%Yk-j@?{#[+w!s GxP4o^ki䶆bcO5 rp_*ÏOLuZ'4]Dpٳ#8U_-@$ٛZmIj^1|?o{^x].P+fe WB(hQT~Ũ|EѼ'cźdsynǔK`)ҳn{;3|3CAi]x.-fk_5㙙0=*¿? uDoc]7XR<]<_<~̟H~?|N\j}gZkk[!(KcMi~_ğ9_ Y/SNiz6gÓs\B@sƖB=|]|-k]pΧ^j&ybJ$Qo**|7v1f?u *VЦƚ+#Aux_YZYx.Mݲ* Yqh|jđ^ii֍,w:rIl ; /'4H<+8'o|ME_W"aUA BNO9k xP~"徦ZKo>$S*ʌ1Q㟉,wuK]7O֬4[mWMf.a1eQ%I5'/7-ytص"[|D.MC,r$%DQNCn>'D⛍KCnDy0ڣ8^NM{cмY;z:xƖ6:^mH`e ;nON1^'⏎_=čU<&Lf0&sqH%zs<>4|?e/HfQ-ΙvWHOͿ 0sm }7|1klVYZc4+\ [!q ɥYVJ%9*7) 8 |Zoᇉ- (ut-/IJ*#H=Mrs_cu}:E_GMVv~>YFHSt=ß?t_xZlӶ],bZ~̢|Gw?uKmWGդቢH Ǟ o~56÷,gk;]M-.cUgĶ,(I8z\mkOc%~EVW6wкWH2A%H܌7[jVd Je u[mGT5 bO,qR5P9\g|)+P._jkzawlʛxv?1潜|5O-[ទMmIlM$ 32IuA#cM IEFx1xd^Cyr8z -OCΥ6&diBF.FxyŞ)ռ^m=WڸkY;--d(L\0}kekj?CЦx ”cpC)*g!6}ϵ6= GY[KxijHBcܜg>|dM|kL/4M]زHw+/ 4ğ׾ j/]XӮb8 #9ܣn8=3a9|T>,|3[׬j ۭ6"LX&xmFqkQ= ŐxZ"^o[slsE1"&&Rs4z'yqB/K"I-ݘF+Us{Wo?y|.X\m3ױZ9@fOi_7;3~zαhzd+VGM>pU@ہՅIˍM?X.Fτ![ﵞnFc`1<לh?k/h<%oijZY:^51,ԻIg`zV_;OźfOd7wKۓx%N񶫗[ nzr3cĺމl.!3o1M26 _'5+¶tϢ:dw3?VSbA\O4_xI9u?SxU;;mpVo)!'J%~?=~hGkm!kS6;fYCBŜȪh|Obw֔i2ޥnYd l?9+FܣU񷍾 xzé'~&km.E p_R\ݮtxnQy[5XmhX1; Kx!M fZaY94%I]𥏄<1Ǣݾ ̗s,qpc1`,*#=v>3<)`>|Z-eΡ$Zh[v,0 bC,_'o!-w#O}.NI6'ji]1٣9GNV 8~e'7fΓsjv'{cI8;W?T Bdz{PMYœ!Fs95d15'^.q @5H=u^CGrEr`r*\>>eVW7K?t=ItmK>2l-);jP 3yJle; l ;W:u?5nolt+/4.edI#D 2ф߶%;i r@O>_j2/$(;K'XٚI+,l $`ho9*qE[ѩ]s=VjP3ωbmams?h7Z7zwMn%[M9m5d]CSaLmWѼgؼGmug^5=ZMt4Z4 H쬽j&ǡ|79(fQ}ͶDF!p70+cO:w,-B5ӬWz$N '=O@ܾס千Яf3p\0oeΟ> }[K״$š7xs#+0}N߱|;xŭx@TwZXgIlPU6FMit/ݶakeg%Ƽ"h c]jZWkCVI-m3:URU?>0i~2R?E羛>/ ܮ8,C@ d„ԟ_t=oL5 [QVզ'}bN,UUژp9o|K{^Ft\ 3R˕&1M ]})s~"~#:ާNxĺ]흉Cf3[K4 spk~(xŚTZg$>s.KFi-$tc\g?xĐx7&q\]ڴE A qu '5c?Nx#ž(ִ}z; Rٌ/9vHp!VbA/xQ5B!ӭ vd2eOR+-I $SBV'࿴7~8eM/n| p9J>~0T^&J$݉HAE@$$qKjIޮ;Mp䌌玵_O >/#[°_"kAq)L8ބmZ?ŗ:=խޒf^n1ixB}J]6>$Us{^Bf¡c6+#|R}dkJ.y#H]Bq9Ud K۵ [?} E4)YEh&˼ŏ''kM7l Χ蚦zoGHhd(Q#)V S5@$JC+r _9Ug}Վt{{xk?:1r }i'q-vm{&K#" U5|Ly_'Ai,Ե. Xe 8>b#azf/zgSwf|QQjpRXˤ"6FR@9?˶'-q5q2-4̓-'+|9KDJHg$'۔Mh7=ū:HIԍ8*oa-njD;s>{EԼ5}Y`sVV\2pEp>j_"|*/t2-NM{R ' >p$N{oi|Bu0|;&g fRլWqelZ?j6zt.5=^7F=&SRN3MnzCx:ٛ 3K}ۄrX$ }'>Ak~2fkU#ʮ# %Exƿ3Z/W’-4{a+en.77R })MO 蚥wM%”xe*9#iߙyf+%<_-[RTzhClrL<_zm8׊~0x K[{,\H#] ԑ^y@9LaW)aJӾ$6kjVD&fB yǵuxILu1soc,4c`~f` KLnSMr%ДH&!<9FdžQǾ.]NȺԦ6acud!w 9k&3ٗHះxRյxjxmtu!>M?n'1 85m#zڕ׊E˵6CSar=+|JPbȫy_5+ǿ*J|9/G[S Ko叉4|Csw Bm+E"+ 0UF+,daK[ٵnM{Gu9.nVqcHtnr@5w??xg1I>*RZNDI;D8_A|_oՆgk-hJ4ؑIlW(._wby~xyF S֏c^Z]j-%efڌUd׷$׳|o ? 'i6㦞P&ey!X`E58#/ Ou_G;~&Ffsi, x~|U[׵5UK=zo>fmBRɪOC{ kKLP9 O\ޗ?|)۵֏EĎPЂZI 5nZݝivlKMDq,D8T?>#¦x~8Dya#b}M ]/DmuoXm翿i'B$cvA 4oC}FK;eɷiBUbA=zW\joɬ+|360ED D0 NW~Ϟ;.]Jǭ-ƛ}4چt[ h\Gz/ͰZ\϶ m&.k|%܅Y0n?>,3-u'XԚbpdX HxHdd9v iwAԆ{yNs<yd|)sY-k^~ GZ>WMAOm dB ^koK¢=h4o< iԴ}= z=tRw*E ɒ9-W!{]OEլ|;7>y. X}A۸K>;¿|7mlm3ipI#&7/;J$MOJn$]_L{+{͌Y:@`zה^|PоC-C]QNv0Hz_Vo_|!Mcaq"H;'XM\{nM^aԉܞ774Xcf.[~> o xcE׵N \F|ˌY>d rO|cx:m2oY躗m_L[ i.W[F- +qMzg AƧCM- 0Y%B%ױ <_Ü6K?qx u5Y< -Xɹ仝Hv۫-Yxn6|/gӣ}ZiGo9)q _=vl~#|F 7WM!5 /n/:0%=0R{\'? ~,h &K{hlo&Ю@G(? l`-o/lIv*d1գ5=+>0hϋ-?66:qmݕ4eaAnp3+asFH Hـf|TܶͅC2Vtʃϭ|^?J+-sBn#~ fL3G =ji?Xm>4᠌/+jXPO'J>k`iX Yi!"Td 7z+R R\_e}jA0,UQ&UU!;W%/ mSVѴ-M5O9[ld+a#]ceog:6vqhK>"E19N'}A}+E|៎9|g2:xŷ֚ȳHF.xЂUܬG͞ wZoxTm̭DHs_#?ms?:fזs鶑Gm%V-CS8v-@>~|eNj?ḴF8fydBvbl/𭶟qk2{=,|BT&|)< |0_~vƴn񦏭x)m!_4Y Yۄpr86m ݔvGjuXFi1Ci mM?kZG< j7:<2iW6yhTێ3WD^Mi{ؾOTKS&ͬA8#5~1_X!↺E]`(cz:o4j{tF[|ILgdI_mߏYxGH)t,:oq_.Z_>xJ?oχj ì-̨؛7 ĶXwѾOs/O ii& g$C#A\g_ |]xEoǧ:sy$FF;o/~.X_FK=D?}|:ZZH-WI',ߌٗRIz~LEޥqqlD8c=x529;E߈]=֓b}XG$7r3^<|h~<ľ'uA cL}\IĠtlеЛu; ~-&Re.ݴVF)Auڟ,]zt籆T?pvy=mZ_I-u;2̂e2I?JhX)XDn3ؤM#q i0- w$U hk閁>12bF {= iGZZBCsB|T=oM9\I ĖA&ܒH$A mEx߲%Ѵ9lu(D+;5R;-:4(wW'ďʴ38xi[i~GgBس9/+{WQKGL W7!)`k9)$̅Պ7u'}5h2/<fWB5kMG6-s ʌ'>E=hT ?/nt;^ծ%oQeʝTo1WIEygĿ٫5_/i3\_FkKkbsbuޙWk>;giE'I}2k,H]YT˷88D?~~!j }hf=:yWQ[AH6H<7gX/DXZ n46BM;85PW#YkKo&Q㍋JITxpG$t5R+?Ėk֏m]ZZ~\;NyXb' Aסk-c:jjfwP0 H_@€8V)ඵeĿZ6h)DY+yˀ#P+[o eIoS6vb,/s XF1tSJ RE0 ( {"Ԯȫy_5(ωyu2b6U8Q5R i36I`{[W$ bqA8" чÍa_ayCg#sڢ/o)><'++SKJΧ-Df)$`#݃6cv/?n5AA[{R$7+>0=Xw>dO/k_񦻢%u]:$W2C'+J `p+~ QGu $34"t-;]qY!/:W?z_^{k02(Wس"I&;>S.m.#hfUܲ# 2HX_ ~Â_ !De#oĒ7^qTSns ͨ]I,E֔ )Xÿ<_|?oPcvds+frGbMdO;b?<t^Kv^<fc3@54S^ÚTB;Kj((((((((((((((((ǿ*J+ER>#έ _S)BץĿuo@ZO-Lw: j67wKĤyq󃃊JO AqO6~b~y }`C:OH ?"ҿ'ek/Qh_,ti_4EN7h_п?@X?"ҿ'ehJOoп?GϬ€EN A;/\ߝϬ;BX?cJO-+v_?ƹ;BX?v>! I A;/G$ZWs~v>! < }`C-+v_?ƏH  }`Cy( '$ZWi_5(/P:OH ?"ҿ'ek/Qh_,ti_4EN7h_п?@X?"ҿ'ehJOoп?GϬ€EN A;/\ߝϬ;BX?cJO-+v_?ƹ;BX?v>! I A;/G$ZWs~v>! < }`C-+v_?ƏH  }`Cy( '$ZWi_5(/P:OH ?"ҿ'ek/Qh_,ti_4EN7h_п?@X?"ҿ'ehJOoп?GϬ€EN A;/\ߝϬ;BX?0EN A;/\ߝϬ;BX?cJO-+v_?ƹ;BX?v>! AcJO-+v_?ƹ;BX?v>! I A;/G$ZWs~v>! < }`C-+v_?ưU_e;մ/_FӴ bEg-+A(8'|=xW-!1֒,C36%Cnr>Vpyڃß7CtV0xʖΑe.w?gGVis 9Ǚ ?Pk~!_j k,.-> #Sći K^u[湺vC+,ф`#;_| jJ+^Y#}ֹc*3yQi zk#7=U>m.I\׎?↳x N{RsK)y+PqCkzqfy?NkYpAs9#>~ kejnKCϱ@1&IOx#xN18`8 Px b^ERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEbxhl8"#?Z9]^Y%%ݬ3PXR?.b?qX_YM[㴟Tվ5r|[iTXtXML:com.adobe.xmp 1 2 3 0 0 289 277 1 0 pI:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:277 height:289|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:249 height:260|aѶ IDATxwXUɲs=31+$ dĜsqcV"9`D#F$H90sι^Ayڽ{zuU]ݫ'11%煷A<|ZK^u}˵)))?͘1\qqqD~; ## + }-}b&Bnn_ L:3sII ~zURS7?_˅ A/&Mn6w] )ڕ;!!k  Otҷ 9m.`084, V6`$&& h`@2δ\sC] 2 2?Q-+E3]6D+`ډPE^ Ӣ.6>biԪ3/:7'p+ yΔZ'n0g,̞3'/Ր+^DFvL/uװ;mӗȨ6MNœq&qIYߦD56ӌlڿ&zma/ 0fАIX3 1 l9z)969Y8b~?SE;/9Ʃ-## n#u KSWBKQRZw>RsE<< meRSט =}cju`f`MR=GGG: 66w t6G3f%iچ 2Wy (UK>rñ7zpryKxuF(AN n?Cj^>WXkre~[{euh>\3-^<СCPWWL4ֺ~6gҧ?~(,)4OIIii@QxqHiE|j"C=`*qq (}h@Hgpfj b]fd!ѣ$~@$ v34D74\ZZZػw/Ν KKK899}V_pț Lvj0sEU}i8 Ԇt/9]"}[@8DZ<V478u^Ϯc͌ad -')c` q)L} EŅqFjPUܭp7$WRń_@jZ| s6R ʐ&@ࡻG@T"JK3a0tj\r󇏫=JU@0[ܴ>k5㍁C]P9K6ܹ;vĠA+h.+Cl#3 W,l#Z>>S½Asl:ր<5L=A2͍ݱ~p r A0 sFxOLL4<:aښ66x=M-$WQ@ sėrzXs:JS(1͠/40eܸw^3` 5pDSBa&P73J3k|y]^^^Xp`55 ΝCxxx՟4>Cތg'k  8W!D4O͂"T K4SayEHM!).4_Mƫ[`5O:::9z"hNA+c<]R*@^PWi99A $ 1ʋоPS :խhjV⊸ڿJ(^fu??τK `Z gVAmר36'g{DPWenSSS 2ϟ?6ܴi?͗6ysBNX3 HsهeSFCMECFlwTY ژ2P [l-z&ETAsG|<7b3É'o NOhDR>pY\5 h'a8A]S/ 1ftN%s r&Fй1mn}ዸ8xSWK"=IƪUŜ'7?>鱾<i~EZ w^1(-1'/'3D!8W/݀{x r>iږ>!36Vw﮵={38Yk3O:w5>ggڮ!Djk&,/ nbiyO-6jˇ6AE3Nz>ر| 4U䅥8347%"W]o1aҧ'~gGm" KfZh/9a|d$z@ 3 X B=+hqQK?#<$\6=u-ٙ$ E cFJF&}A y kٴ&1A81HJ /ɉ2u?DR"=.J&df&gc9v ӌ"WhP_l73벁{qͬ4,vI@{@P%ϼoPyR =3h `U@g56 }Tn51잙,\3 gy#kh5qL#ڳC,0 &b5lf/]d4Z¹3L }Πhk3kg̖t]v_3p[ _#(mX]tlʹ,i΁> `6kkk:0Azڎc3q9MjXGh 9CeC;{h~﫹?m9k6.6e? gD^xph;2 @~Stq^xphC2OoT\ڮ p 6.6\C] оsȹ&o237^xph2?'_ 1>\Z <! qPQs<.-W}8\@[ᐷq !im!iXy֮xsȹ&o2!o5kކr9m\8m[vKC!皼w0ׄ߮ [{r9\qnZ-9k6. 8xP )a=a}m۰9dAGfOB9eg=wcv/۷c=ؿɓ|nvijO>`pAoA Ӓ1bؐ*ϟ hkk uuuVS2UUhiQ0ed,Z[v Sx%bh _s{  􇙉Q/;)xEǾ|4S>1ݽ'cٲ033ca4 χedq9\R9 !|}RVZҤ ]TX # [6m*iEC_O[aɒ!M_^Vڤh_OQS  .CV&%|OM3g6УGHJJbIxTsroNa>[KB-[6 {YYYHLGnN62j!>b֬>|8ŋ@PQ^;C@\|zZ*liμsōבCw}1w)EcAK⊽=_$"س2a-],i&вwM$?k\ԙ3Y36ۉC6?@C@iov?jiaĈp~; rb{.'BBBB[;Ztࢾ g7δz^n9F$Zn5 @h}CB^C<=0axt]1Q`%^394U=3u.mDȫ?{A~-Հ7tzy5!Z}sM ;wmظq VVx7Tk#PMZC{pk`ت k}l:rk5<{z-$8XX^c<9uUs*FYy=Gh=Lrak>m!r&lb :v숨Hzڌ}9_!CHwY$˃Q!MgC34R53H+ێl W *3GMMMrпS*y#4)1ƍ.|yh(qڝCșpEEF`04439 8f3aeA(Xۋ{ݿ-9oP -z\X:am۸#L"#NMI ڔ8kk7y d0s z6=k+?81/77S(L78!Lϟ=qc0vr6LC W3C%5 Yfhw{%f J޽ՠ //iBXSkڃCL8/^R՛D}rȿ\SVV-<#/<+)Imvw*6/Kθ~,ӧRt{+軖< JttlٌVVPSSÁx>RSfoEs[p0/1yd(+)aoIy{+Ͽzy+ lcǰjJXz5NC橛!琷bEI=0a~:ʯnݺANN222޽;ݔ)q1f&,ө_~y}-{P! Mm[buct:ț#y}D,#"$&ă=pbAeA!שٓp11K.@`ll$ u0iD췱'O ِ`!Rm^n7qțӪ-ŋaBaqXϟ-mܸŤhB7,+ ^ild$ڽ{7._7n=n{D^*>.u<-}Zz8&ALvsv]˖.upa AoͱhBX[o>r0ga+͛q!\b/hp9-1<1BXN>f!4?_<Ձ4m`Ɠ꽅=z@.gv_0Յ!Y t:AfI0Mpcss< ~cY Ef"Ȝ~y^w\l \]]p| ٳga(=;П} t6O$$$ )S q=zQ! $l@a73g|iZq .*zςBaag!sȿ 0sq:Rl\ɖ ٨ 3JiB f% [dGSNtWg`;УNwns?-kYd=0,ErHի r-,,`KO!rMFq. .oooRob ڔC!Po%!C!o2!oܒ4  +xt6/ 2pz!A5,>qK聃\ o.SXh\y/crvޔ2!~S ?W8ryy`M[6!sMeC;{j~aEp9\qh0YxxN3Szht-<\PSbpqx&??2-C˴~xuL@ c1U^:fMQPҼ rRwdHwF`9b􀼢9k.kEx?D>Kh<. v`9}9l(0*8p&ҲSUP5' IDAT5-+a /ǣsСC'E(++"Q =!;mS5:T"iqMEec(CQE(GQQ#Dȧep=R{$S5Lޏ|kTP4b|QPPAqaeB.~ExM:p?m<Bė9BTX( cR6y C) ?ԁٔ0H~󅿙\V?1W S$,Nk^ߔLE ZpKwo<131OG/) t8ݺuH<  ƘrkSGS EHp8J8 0>Av?8)4֞Rj̜ٹ 2J9ﻡ8? AJASLeq-|u5 0ն+|K|A΢̾{F\vj4.n]@\R C'bWg(xC #>K 㺢XhaA٭6rs#5s +ݓwMax+R_{ yYKtg8 o 8PvJ6/ʘr٣;0HWzCRVh?,T0o-ÍzCL/pa}YFV^>*Jqv^#, 5i$JrqwP( baeg6Svԃ0Xl:M[G֧/#cO^G N@yYa}`gDWXL\TR~µ3q֡=F[Pgh)`]H*Q2G/ %^7h>EoiBu.AiS$%% a)7S 7(qX0)]lE3si[ء+_OD/Ba6j1eQ7L矘f[/+ʺfx[9U+ .@棦b-@im֭_Oeo܄;)m~V 4\*! fER[Ac3oS06nƺuqE4'?0RY_4rZ5-Ds/kƬEywbFz(JI1;ɻݝk(cѩ[OrʙyQ3(yS;Ps6@B.ʼn&o6R@ò7o*B)ȻU. F? ugEȧkIO| 9ꅠ!cDxzNWm3`,H+эѥ r\'m1i!Ҫ,\w,ރL1y/9~"^a`taa}8r06CMg _tU^jb==GqnL< r凩fJ89_^;-XhpwFxqi(+%E)qxp..pA̞>#h"GkB juڱvm^ ;v̝憓vvU3d<3ۉMБKm쐑 /kjgwB~YJ Mpbp{l`џG;U9صj"0`xp^L!':TAΖ#gBa٪}d{tp0xSQr}>d%b H) pq1Z_Sf"0#/B;hP,\; j–ɺSZ^FN_5EYte:B\B:FC% TiaIi6B9u o]hn믿VQd-mY2,T5bEHw?,G 4m^<{BZV#fƉ+[I Ci)sZZ\0mZ %^50M]~l(]K ' U?NڥHp0ubSLfoL)/-R('fyY 9*ðU PkЦzeIY5_y[| dU _"c`WDrɦŴ酱S]+K(Z&) ӛgCDԐ/1U=5Hw= t˜#aˊP!%Hknhsimhcx[5 !>s'gs-r~D'7C!\y<\ֶsȹ&o2!oZwYNr9m\8mFl:ZےC!皼wpk>-MXc;5YBЖVT?VڍC!U0j3tLd8.{]q :rW\ pm8τS!Qf)C '?*A- ^{"2,|C!!)Ǔɂ']NZ`)7r3t&Syj/~L+S =Z4^>E~fp?wXlvHƙC^VT Qw[x)I x);[#<_@Fzj !u@?zrwkDU^K!/,ap = 0ړ}Mȃ<~QBjk(O\ƕr .: sp.h>gZ<(hr`"My&;p7&#`73afUU&6#C"(6F<1zT ''Ca25 6C>Y݋C⋑cʊ p!lwզ2xx6-Q?(^; [:mX n0B))(@FFJ*=(?| S}0 7q;ҹ* n EpaԐկ,yhm 4lr4Ï`(A1>cHĠmSy0sp.=+桯$pKb^`ޘXm/N}ݯX3V³*v ' OЅH~Ḻ9[, `۷ox*<^>!P+/Ş壄P2*0sVY@YAe4ӰD)X9Z TDmW,V0'/!Ƚ\Fȓ2 JXz{c>G+ ): ʱVJJnfPԌDE!(0(*)Dr\S(Jke(g9#%8(HNGlTQN.{gAY/su !=+*Gj64L1 dJM@hH0Fu  E2EM$pEyB5Xl0i}/t_!{FHp0b,&vLYq5GMDhהD\8snȿ\|^W7/`1}󏪺%9{$eVc(+-B*5.!*TRI^_:V_f~K rv 8he r& ͱQ@ B#x{Ɣ`LM1A:%O y/F˜@ߕMw>״"ノJ/Lë[KZFr\;R]cod~p9^SbH.;9 +)ƏDam{`v[$n9dU eg5lYk6ǣW]}LЏBDPڦS)K`dl }~PTƲ_Tj!o ddUlʚ] \*i7eu z *(Z WPP^Sȫ?uu׫Y^Ctמ7_I⪣4]u̇aSX2}0eW$,Fs!pg9E6e2ܷ\ۉ%GJ{հxY7p:rN1M?1qL귲DРkB=lU}})0@πk[&Hkn q~nf =ĥp|VL5Ӗ7MP5)8X!R)M3W$ iba]O`0c埘okT ]{ .ܺwlP!W4zܳ8+ ox# }d3](e΀kq?yqf d |]n_N]z`cE!ݿ獆.|dJAh2}DΠY5q^W)em?6GgwkUE74$ zSu- .-#\>JP,R3Mm8"%=t/9;x^DQ$7Q(#$,8 r `! z6 _Cw[4!Lk'M/:`s` A` H zä30m4=rLa}L"X(V;1OwICSʔQ%PBR(<{B r]d IU]\ .Gȃc0M'B!)9XJLd}ֹ NGO pLKM{)$bp?EMATHs0˔F0 #SXwd.3V_T5z 'T 巾^xk% Klկ]jo>(1qnBK>MlGQޱ7idt멈;>!(r9#)q:[7u V\i;=Em+i2r Y=;y0ޝ]iByE\|!yejvbmB9GJZ+-5A~zt5հd/irx^u8 A~5!ă2DK塪E:{gBVCd:<=t;@q^:NC_ S&Ww̢\T(eFqt/$I1U r,[̛5 ڊ/5Jlf -5%X 9 bz\uzD .oyy2i &g?P%M ϡCn֦Fe8My ltMBi~ήp,i43gVĥxJ~ڊ8.}"psirZ<W%w"vBwg9J)rM{ɝ#1:SCDԠ"sNB+5X9oV(;v%&W yK׀|׌wݫ*S$^+JFMȵ_|lL[D jDA3>/\t<@H8Pڶ1Ç ކ{GucehLUa::Kz9+sSoSLOS>H,=bj g~/IĉV0 o>hʊ㨧 ACn VOyTxhU{9yBzV'DH9wV]#wrz3T{?3[;e th] ˙-Pٵ^W$aAo &]̊\8΍<fH.l eʦGbzPr rl^%d(!tv7MOdM!]{J7O9ē['_E+w@vIImv\LT.9K.pOvi= 8|a²׊ݺq,dW 7"R ͆XO\HA1mTiwo} t@ʱ&Cu0js]9 6Cg@^AKU'DAws(/'KX~r6:2ZxKd~\yi@Rr=Ivwla@InK9ǛXGyeU1BOlEL^!4W[Ecf'ܻz P:yov6$Tq |`]e LuTNn_ms ݞ?4 ť%&q=:Jx|b /ل\aJuw?:u!ow9Qn=8f<Cb@m ] ۘ;{ₓ `a`Nbթ7&g)>.{iϗJ Rj(ʹ1X;Es ZIL6ơuѾsw g.uf9JSl镆 L"Wo ~$\81)_"vq;(;b*l{)u@^ &g KP[GC:ZےeFzx҇fߙlgX:m ܤ t ]eiޕJ!\.]  b+-Pgֹٹ 暘f3"3sޔMTU@OI)l1vmz`th[}L[ lP*CT34աХKW]N'̶i_y/M(1%>|xfzZR- Ii ;H+HIJun}c.T;!X:shYCI][Fy'_>3#i;SNojno&˃M89@nqy=) 6语N꺡SN4Ca9 AriePy]{P^aӗ!0:^X,Iņ&4 b*bKon0Lbf]vZ_؞wuRa p:N{ԫMkI4 ik/6wےm=0ߗ}LO|(*׾< qqHȠ|kJПJ[e._[r<{T9n)@$پ<95%a4?qAvVfRޔ`ϒ3ثEV^Ӓ-9ٜ<mOǍt; 8rǓ,d6lAs~ĬKq1lY=Z>g">joN[}%$fB Sge)$km`srOk=YL o,z`g&\=ދkײ$޴ӧMI0m li _څV!8h>7+z?YfNq9+YW,r_ g m !h)*kA#&C{}h td 6?0IRi/3`ƒFXZx!+#W<2LQ5 kjaVR{JNl;8-rN`"Y\XGd6F8->,WKW;#MTwk~!o;^"~CYZCap:\() SB\L r2% Z3!oDlgud:W+h,wZJ y E~c`ؾ{Ņ+H u\BK=;vmUe<Ο8/=Q 2/ 8t83H '3zNCǫؿo[[ u>fwA5\Ys/Uu,cӻ8dKB}pUĦң ?&yIxd L" `bj MuWƂu;QHt|sŕ3dL0{\ 071y"XaF*! 2/Bp^f&,vBv_Pҁ!05ңd~`>r2w%~~׼չ1m"\tOnr,-͡Gjڸܝ퇄$.PNi 3 7?/}L!1=KNJbs,9 8} 7NQ@+Hc޶ 3Sv[AebnGN!1|8{m47-. sS.?bD ѕڽr^iհJr"&I {`a/"-RIS6Vr\rYavx,|^O`2?^JRyrwg"U\*aXPP yY\ y^޽}S#範ܼq УfفZ, 'X׎%oJp6C3lؾ+NB/B=t&NT7ӎK{b}HߕǖaQSJ>zyc`Bӊ*7FY);7L䀛)I#) f2s9WF0"VKˠZ WϿv$m(.v}:g n)^KžcKh<ũzz5~$Ni3A%^_b^/X] 8@WE3N_Cy~Nn]K8<%혋M FGOe܍ddG<)f(bxedĻcKҎ 0:&CLĬG EuiF8ns!;Z[oUq]Cv$9i%9 <0WYTؼPDٱ%pߎR*8tJ 0\'१'|^#Bճ`1>񹕐KH 2yݱn)&mEdǺ:w_}AӶV= [xK6^C, 8it Af{Q޳c-U5hC9(Ri>uKrp(q7,(aWѣ$& _??+ѫQ(H`ERh5VY4yJ+dv٘鈭[+_n(wa7 ̪5 u [*S`0-BrV0Opo_AqJN/eM[XFFB104RMI>0'gpVgW1DL^A,{7OGݠfftk5KpfÐF]mL;JYIo@[NQz^]B>]д K"lO_Aqi޾; ŒnlbRUf _J!~v $(qSjf5s^b4SLhz:7F+!:}1re[#*@d"i,d*\3QHN&_P? R”[@>aP6 #4:R:eYվ!Ӫ6026ҽMHGQ}ͫBnRJW ç%(4'//D~f4NCcs.U (b{Y[ r?Q9JƓ(ԡ7id߃Di̳>-zJ3}yH 0;9{W9~S*;\9vjhȡƢv!k >GFI[]}MaӸs!?~$$ó޴/E Yj77Ip `fY?Խݻs!f0w_BJj)ŃO߈MO?#xJR#t4 ,=<}7{8q$Bȫ\8Esk|E/,>rV*U^d)>ڻep s'0bbyP"pmB^ Pear|3z++`Ĵ8m R.صi)tTd0pkQqp<(lm˖bob$Y[>PRUtr/&MNu̞7ir,؟bE%߀/<˱ dsxx 1 ,q>w}ES SFF9,H.s<VKWo=CC{b%>V|K{gRdȈo~1VDcGg٬Y`_iR<yP@{v|O4'7TCF oOwܾ''GN (ҍ^LQQ{Cy8 #i{91il 8'Rz՜H+]d$m(ò,P֓q^rY ]PTZ}m(FS "%><0 퍏 3IF|nA 2th,0ҡ777^@}|(DA.bEJ¨ ՠ ]Q 7 T)'B)y aV?mHFHll_/W6a٥t60ԥomJ# ڥs){нM/P)В7mUķ4{PXYVOWv .:)"gڲ-d9 l~=6ȍO FC m+iyj[-|[q̴d?hDGB_Eiumm-,GBln&@샴P\%NE\\ۀy/³zBr*Tju?ىw iE G1Ȼ䙒'`!5v#0fxL8#FcKbدq%0jQ-YL2)3q_Z|ӃpfŲd\>i 7^0vD?X`Qi/b3˔p{!SnoMk9F0]bCFc!y݅?yNbY0=/87UA(Řo=]V)XjioQ;?9 י7<gw`u*n¯(ų'}9u*Z3 H|p nMy+1Յ'{=9{%.oFӮP=z$yg[VEN3[EH-.Fk`9k\SaʍJ"o:^rcw<'weK49Gb[]:~^FEY!rrr+ Sqq|+6lXM61ĤfקEv܎[N7R-mé+7PP!odؼi#6_;UgVUId 0REM;ye0g^oy ;s8`ys:]>\8 3ZJӑj+žѯ`喠Va{ΙFhjtbc(/<S4SWOA/ǏC#0H07Z.}988`a=i">5r 0|Ћgm ڍ+4yM+m. %kޛ!CaG`uXp6|IŨ̋.+ U[10ib8:v cͣ]>Ah O.J K;yy*q0f[ǻ/@YYs l5u<.x]r;Ҏ}r5exxak!()pn#~E #0󭅰罂隕Hh\QIDAT~pU,o*N]X2l9 O.'+M:>\V̵? 7 ))mxy`?p́9XQ81A8m.8| 7аTј?vl>F | |`>r4JL[>Q)MoD 7& Ôt$-+#ɫfm|}{pZ5Z%J3|ΜIl Q] _ KᖮDEzCFuӞ^9 |sYw)v,`[$VPGCx$ U%(+a:V/+kH8&+_<&Z5T틱p=DEӄ,?,T[Ue lx!,lV!$! U()S -@V*Ҩ#4'?C //&8 @. Yqd*0 %ZLuhx[ZF^W.r'`7esve +םٺ'׃\Ͽ( wW̱1!>>s-4رMhՕI p Să,)\6ᘱ`]f†o!QVeIۂc0sbd-_ 3fC' ШAߞ ([gyԓQr@=U98}8lmw>: '_S̜WUUp)D&ȥi+! ȧrc"Zt^<\`yxU ^.7q=ۋ}$Ǒ' r4*hEÞ=?pt'o騭ZPA))Y~ tU{WZusfj itt*R[[xrɻ)]n˸|.kJQڕt'b Fݪ>t g ]-%_9;/.W٥W[%J_}-_VYM"LJ EE$H93 &v>x(Wê33ڡ}c Bc1Zʓ8cBB}6@ Jn[[..../׺̍ׯ/Wz}v~0c뺩buUVEQEQ200P.bOBhfb RXJ6}B-11XkC V7*n|:J) !$1! BH4Xk)Z!! c,jUV88?7?43smii cem뺄 BOoT*ŁJ___OOO\.|stѨכ7ϴ4Mc)0%Jk j$__t|> a [k1Ƅ`<>vڵy扉 9F Iaf~4RJq2۰f"d1f@ V)B@ie402d`Y\\1Ơ>YcJ(cM F>!&}=%w]X^}?@`4R kFkНNV7+W5[)R c !"L)wwƍZVBYW.p>sO<i<1!4M)T*Gy#5!8GeR1j(Ƙ'O>S>"FkmnBP(QOOyCqH[NB!F`PCHj><.gPkZX\>ֱ| HM" BX1ȚRZ#˵Z-cL"TZZZzjVBI, "6ݻw_G6}?{S@V`nefBcDsZsΕJ) jh4N8OO?<Ƹh0FB'" EP!)e\.ME@w1tin^}_3J|b8P^u}v]'cv=t:JurZ[! VSyaF%0ƘzN) ðh oooذ4ÄPcR1&ZgLPJ{H}-Y3bI3OyԵ}kO?i@`Rjqb1 q=Na`8sby1a@0y!cFYcL3gt:`Eke 2:cVJ0;ZIJ46>Zn~LMuNB0B_lٺV^6MS̨X!܂7 w FɐN4W$3P_W7??BTC<0!!"0 9g)ƐR00NB!כ|T*-,,R!l 6k 0cRJ8FGGW/V/_rzDc ȕ8[!Z>crYZ1cLJ1/!PcƘ1o|O<ҒJ){zz0$`cZ:LN(F297eOiۜ`Xڍ9 SOq8..;vlDD[SA(mژU+ VK-%cMqnkIbci:Iv{/...BD"G~ݻ B1bJ\Ee6_Ixn Rj!Dj_w}6Ӿ82MR) ccbqRB(#ɘ1渌1f?30B$ƉU:I A/[(pJ~5/*s:Nf`Y4&IBqlBi"Mj/_>}74~CR$eF2>>}#Ƭq80B ;εZqQJĉV+Md^=ۛ]BRJ)B#c)-dPJi]=QY%1zN573C Tundehj"(J2Քn# XV 0$VJcԭfh^:魷>FŒzڵC?\Zuu)cNu:q(nu]W򕧿/2J%IR*<]jpoo/s,")%P)B@cv>%eLEbk$md@`ժ7Ns>(u3BBdI1RJXkbyvSN]pP(Tl.!d-l4aϲ0JM@Rf17E !B }ǹ2!ʲЋ/~7XZX $Ibkq1&cǎ}{رf90ҤRO`J94C!>cqmA0X)sFuN(DŹ87m?K6͵O}j3Ri$RJ)ޅFcy+H !I,(km٤l+}O|7n40FBr%V/kPJ1yַn8y֭߶u!QZ.)'`J-q1{CbBVJk1n6c c$I7eVLeLΜ~_/ya3U00Ƭ1OaCKZY6˼/dU@@vZcRj+D8^toX:\׍1F7k?2hyK!uFߌ1f>w4NҸ18;o7C;QwAJ9z㸜Ru].XXkM(X\R>v'lߊF}=v:thbbaRF1YcZaxݸbnF$ B2ى1FZZZ|7oID)iE};΍ /|S~.Iv BU#wyg>MOV 9 Fsa u]q8I:s]`-s9#ٷ|Z( ȱ#P; 0a?s܁^_q("Q 8xn܌rs=;2< Ax" BcV`{A!$+  (6oܐ n1%@0{cG_yUAXLGo7fe'W_zjaaAlq6f̬/AsQZ[]y;r1FRuBg#)C|”n7J.\~FHDX[k!~ViOR!!$cZk)E|Wϝ;ק3F1/ K^|}W\7u-iسm~wAOqy_\\NB(dJ:4MY$I`?֘a(s,D!Pp3_Neܠ^vjN8QT+km#ҔsBwoZ._tB>PFAՅsgzzzjKEcu9F}χ9A1!C8KW.wmݮÈeC?汣CCC(t=h*Yށ $XK\={FGGB8qcB֬Y㸮8!v;vHҘ2&i׿c.q)eZtf!Ga[o k&O _xjժ1uʊnrSS6l|6|@$[kH֚W=Ÿ\?;!JZF !dE?_cnn9####vl߸aSfsM}F u=Y;f2Ԩ7&׬q!LMBoz_1躞i&Q !B  t}t %q7GQ1,ȅkcaq+DR*|=ѣi*vؑqlpsqS##Qh#Q0\O_/dl B"׏=u(if!$B~\?{On"(%!v.BH:}g>~RѰL!&wydžu/_lټ"veơJepY; (#Z)g! <~u0`ec&2<!cьJ_?0&S.06NBn8žr,BӧV^ZSʌ1GMttjq ¸1qsΓN/߸q:B8>6V5$1iOAh4j>kZΜٲe3VqP?;d/d-hΝ?/7F7 wswW*\_8~՞R)*F걱J$^{T.]nChi63׷lޢ ! h`?*u;)].6ЂV5;3iB-(N9c!a9cD9ԅ z{&&&֎H)9糳>Ν;|jI 'ŋo>{cڵ࠼ IDAT 7a ׆j.-U!qm678c1!s1#h^-(gYJJ׾WzT*78'\ \jN_:um[\'zԡ=}= KjXsa&s?08B9qRXLF';!n\TR!4r!R Z$׭['p'|ghhj <""@mΝ:mNj4n @QC.\;q4M:PzҥynxV!}/ώs;m!I#GS!(ڽ{M\\*n<{cfxh8jRZ)ˎbJ_9p@[j*cmUA0:: ܁SWÜ$1hA&)'}$Iϝ9K/MYvRΟpbrQoc1Fb B+Fe`.s+( իWߘbZqg~q2:DywkDb8<2244xu$ƨqa(Y=˿"q1Z/-.vヘs~ڵ0 Ih6{y׮]Q9 +ET{^qq}EnOk׬`mw߾2)S; shTb|T.J)^"m5B;vM49~ݻK\>7Xc_s~gf]ǎ{T!R؏C=9+[zGwTJ%IP(޽{0n u]7 \s;urZvaxv.qVPF׬okRlRJ:!qX1v\jRcl^t##ƿu&ƾ.^k={4ls'7kb aNQJ :d```hh1h($I?'jX@ߪUbqxd C w 4NRs8g1-[jqa>z? ti66k*?}JZwwjjӟ_O>d^2UZ{ܹq"`A QoΝ|oMצ>6(*1acB(t ON)UJuuZ JIe1hݮ=;Ζ-[&&&(&IVAOM]xҢn1* qlu@ye|qau|.?55uر>x/g1Bk޹7}QOCk&RёիFFW]x)v BS'Olݶ}ӦM KFc !ܿޱc8a!2|'WϞeNο/}_R6MeE;vؾ};c,IcT(s~>SgC 49!u;CxV?9aT{o߳"1}lc0Q,F1LiT,pw\zB*e*%cCD6dǶ8jBRR)e"<@JB$ cl|\$I16Hr0!$+23ͲB̘8MSPc? Zke n톏~^>ejr=OM9S =7JRT(=ϻ{[(:Vx7OjiSdu9{])ERf6?|r'֌eʂ(%VapΣ(z臁wuKfff0v)y4:!BI !$(cPJA2I&B+B)_(AL)5@ViaǙRoYŭf)87o\@ }+p.6W-~w0 ȴjT*1ި>7lؐc>znZfuO3Ta8җ3Tl|.ٳgݺuzP(t]ƘISBlj!u$I80j J\X&g!J)zsg N |?Ivy^̻eS Na?cC`۹qc6I֭g:3,-/kϞ={cn濾B9J):}r:1B1SJYkƔ0mX@4T\ւ 궀}Kk֬Y2q&A!Vafr33֚.RJ)ƘwnpK!qƧ?zq$\},Zm|ɅaIw:uJR7Bʍ7JűRJTJIx>ZFQA#D]Y85-]!"KKKon߶#Э[t...kmN8n7(ڳgҊ1vS=hy@&ޔRcJi$^3~zpxxlb |{n~.Bv(Btڝ4&ׯM_axxhaa~ffɓ'Rw}7ByXV]AߑcpF_VFZ[*nm֭[-Є1B Ga·?g֪&iJ8[zB/cӅ GGWaN~套W~\>87dʸ@`!P+tW^y5M;w׻zӧO)%qv,`b2J)4g|>磳ξoݾXn!PeDkݍӧluS.2 b?ӧ Ax‘G}ߵB9?|`P À1sf{ZM_Zoڴiu)}ލsW6XcpE "0u $u9N;rQJAat1Z`$`z*!XJqaݷe!1 ?8Og}K_Rvd1u{krr gAWJ%u!r^;s̚5k|KqΓ$ńx7ϟ8?0fmTk.\_[=efE0jQ+geCB8oλ}ccKW(Νo='N<mvwaZ'.؂[!$Kv!b>ȑ#֘A%EZ{gouA,1f\+h4j׮_y e؆F~ZC3ǝYX~qq1cqOO>rL"(0v:\Kdpp1Ƙ|>wƍ ΏB2sBm7n,8pĉZm޾$WL;v333;w*Y;yݾ'"Ji6oxkצ[֍VW={/JRJo ~7έo Ƙ|Im\eBiM(cI* 01D̎I%c82<|%Jj]>2:׷?8BpTQD)r:!wq( TA1&RϳpVk֭[f)e$'"Sקod"hDBQyUƬ{Z 3/A(€,.,cO2HDж,022ҚN&::(O~|֑zy1 )LB$B@)Rs.,*ʞT*da\*>|.DBp!1RT@:Τ33rv /tuu󹮮N!! /߿6OPn?zˏ=XR)Z۹s ڶmܤDgQJ1ƎA,C=c^aWCRRBk1R˶]yK;=B?H$aq!dqqW_}h&1JEabS]$aĻbY!T*#cSئ8Rq<>>inrjۮ`ә8 ;e,QR<#/Vٶ3.|7k}ߖRBl۾rڌ1k̙d2y1V,?aBHa" {SOP0Y( ]zu˖-`: lv`w !@278RZFǏ~[Pc]D^ɞq|ʕgyy0 DO_|yfnv< **„1frd"c>00pt25jKj%Jܹ31OOֶms΋Ųi:5!c}{`& cq* +++KKK!p[{K0nB Ah4dY=h48fZK$d"J$R!d !g[d, l~ǎAPJGQlomBRB T)Wk6Jعswر1"%WJh-!D|Aj0 "B oȑǿeF-E_~}r `LY2L$| Zn~j- M>񉏓b/^r\-J?7W*#G9sfmm] </qSʒO>h4jY, mJ=1ʴ& `iil2B,cBc!#nIB I))pWVV޵b2(!8RZFLBhݻ jԛz ##k&!ڈu]˲*J&) ̢&Ξ=s}&I1!V96MIɽ}1BViTb)BFزb裏NMME!D*}nͶm:9-\}#Z+[!86DA0"nYy\ch4vڵexIY7 Z| IDATB\~go '(?X%n1`xȑJŲ?wǞt6eLxzPJd*<۹{mE,-4e\%))`YPxl(!a>T)ڌP XhR)`"bq΅Xw㓵ZcH* 91*a=Z[$DP1(fLZ_#HhfJkX+&9\(r˟< pΛf-۶u]OksutG ԅ o\(c.8ZBʮ~>0R`4Q)j<'^je=# lt#pmw=v]h[[?ZK# .i5h.%GH[] bJ !GJabyT lٔbPhDD#O L!8}䍰:6qSs.˱1P10q˜-bDӁO0 !BA)$ҚR=HҖZۈb`k Z2@Q(V\id:Ă;'<.oQ'O]83=C( ~_/| %5# R Р4c,sI)B]tȑ#,hCB y3F}ѐ?ǏkM(iкD8iVwTk}̝hVW !m qm۶D\XX0x]Bc󧨾7&Z7<cj.޻3 Bڶcje %ٶ!9 aQkhqv\j|gttcfPJQFq]yǮFQH$_|rڵT*ֶc"VRBf9C)q,"x^Dp=WVVn.cBJ#"ր0!Ze=)T̥m!cJ,v!3P(λ҄Rxoii(#4!@QHc 5VJ! H)0 +V%`*=GmǏSdYsH{̂:sf˖-n|a/~_`k{cDdM7i]ow@C 1>5#pλmۖ(2бmTʘ---qXO&8ǪTJ{1459J#'11MZk @B78Z5(jFX"^^^>q>jx#n+ˮV8]J1TJZKP3@cd&`F\kmYhN9ؓ.j'iZlҒzq !{6 r?|޽;ٯƷ4 aT*IՀj"x뭷oũ)ƈ9oms1`dcJ)e3q$HN]]]tP Dk}RIsNRZ:TJcJ+D"FuTkk{$E^cI pErEjԈŅD6K3L> \dR1ABJ+(Ì1B*>!4ƀ@A(mXkM)5SRRJIm۞֙'xBcly BT7Is}<:?xO~Kw}l2UJ_H1#B$ڄ{yDZe5*(zꩧ\bzpaF)J2_h=ݫ|>t:]. V2 NH"n`f!`ԈǍhd2__m%d᜻1.ˆ1Fŵ޶[l\EEVf֦gNJ&B(T)ɘ'^?v_sd&\-k+Jݦ̶{F'#.0z꣏>aKҌ`ci0xyy_\PRdVv\a)Ν;^qdZ,+J*%cZWnA Ƅ0s£XIE\`ZDrPҀc̦z] 陙wa}tt!,XY^m4155VV BZmkR8!!Ķ\U#@kVZc1x=~BHV[]]=vC=Olvaq.Luq>U-Óg:'SSS.\oV)ZL&M C)5/wsn./頵6FRHqhҲ,DZRYq/_pWsq(Ţ8fL!)~g7f_&&[>ƯyQ$8RJŅٹRhDRr%9ȲbϦ)-ֶCR " 4 :P1>|plbzs;vJHY=߿(BGq@3FРnE 6@)%t\\\|'ss3 u8N#N2VPEmݻ7M05\_JiHl: 2dӔyi6ix뺦`jJi6圻kRZ|Hk8VQJ7fz!!ͤydR s@*JTzzz8(#Z#KL5ײq&07y~w{ǎmO8'<|{WJ5ofb1f]t+sss㴷ڵK:N@ZQSJ-oYs=/}7ïD"E!34H#SO#>Bi1#6R˗.\J)V*\., ~Պc'~[ֻwvq;Hd>w׃֩kd '}$7P.-˲,^?|eR*w޽sSg{\rQԠMg(m;c%Ύl6Z8Bpqc2}7rn`ZX &$c(p.֮6Z!caXZr))G0ß !e"BZ7&s54@6>9cL XJTJe+Z%C)m#[EFeFaT  d2yw+s#P؞繮K)Zd2 |6  !zZ͑Zi!Y4TQZ=z]V*$Ҝss=?!%,u}BH2H0(!rɲV"˲痒j|k=]]]0By@*XkS2 Q&'mtzD t1fփ0|g?j5q*"p !kO?`_Z}˕ت]8wo|?bI)oVd22v=r5okkټy3b϶J)JbqRJm;I)T*~aC1cUӈ 5i掔º7܏;{uތRJ)8NQJ ![k|R`AZۮ cfﯭZ[[+ZPJŶ-!*lD-ørauZz{@˰!ЇZi)*0uQ/|!Vd2q"X\\,++w\xve}O}S_9PP@Jڣ>ROOR`Z7*Z*BTe<9hg>KRv-:vΎT* 8l8x^I$|C!-Z Yf!(01bd!f?N(hD X!u3c J `0nKh24B>i7jB *BS=qd s!EDQ!5B,2<06UsP0R !dYVQ|ejRڿwFZ*d2r틗D{rj<ٟm^ݚq^oMK%1!?8^^Z굑nJ]LS|E6eZ+SEG e[D (å(BH!)a I !V!&0,˗/ONNLK)LR̓]=Ԣ$ 0B { Bk< =*˙vXWGgG[L{grWWyQ%$S7%()^/,\)@q_щzdsr~PJPJB nZMNkDǑ&BON~_?iukղ;m2kRJSt^7~"R9dsR4cDK-yAZK z5΃dRV+իW/^4;;}n֭qppV+i1Ʈa|߯V+-J)i@26c|\.LP(xofrF>Sܿ?ŤȓO,-y'^~~F`U\|>PFR iRʱ( 6==\Tn޳=:2ҽvCQ?𻺺]xT&ƄPFqi43H#5 iXƮ&={vgi@i}ԅsR;vlkkBW%j92¨ٴ tnxZkh4ZPpò,B(B1&iܠr!c%ڙgN0建z&;:c !cVFHc3M #H!h&r"vɫc8zG?҉۷IZsJL&ݽfv.u=5<;BJ-l t: LZNRJ}Yߦvttd;vX6'O( D2a1qZ699>11::k²-J2"omT*f9VwJL VׯOJhϞ;lZR,mj>1q("G9,Rj1O‹KKKkmC=d//-%DH;3=300>&d]ϟT*)%7ooz,BH)xey]tIkcd2+.]~mJJҚ \1B`Toƛzo:F!t ~n1QJ1fmpwBRJk1BHZ{q;J SƢsw=<4D8:vubrRv}zZZ!H߰Tk iYk_[gLNL0L C!JL>M%S==Hk!$n;v@~/lI`΀QBгϞ\Y]Q|d"֚J,,2{EQwmbi>\g[GQ-#[R\g0!gϝk° 9K)mii}RȕťSW@+m1P=ztummϞ=}B$Xߚo\2sd1f\a6sq|ꕖ\ĤֈZ.w}WVז=]x$Sk|>eTn|F %RəٙGՕEC{FGBFN1$N{ΤDBʮvƂrdH24Ŝ!d[G>? C(<|ߺuZZk(m~݀7_FoXho:'ơL&r9AHc BpB^758|Wk`̢bQBp srIg2tW{'# x[BQf:|81F8&&Rk_җK۷tm ð:11u!J %{ 5a۶m#[a}VJ Ȉv1j>u~?vwԫlVS|V/!@8slGѫ^,VT&DzmZNvWǷl^fYfgq[[ u]ǢQestoO`ę:;:--BH)T# {zzDoB6Jip]\<̳Νc.tQ c㠡kիL[?<9r2fg 3Y:נg>PZa;rȥ/MjL2988ի#CC\6kRihPW&y cL6a 7R \P\1t5vRB)!9ef:PΛ\)%)es)%tA!!Zk$"#k%Ҍ1Z5JK}KcVl:KjD"zRmiP`h4gΜBR{Z8ݕt:1u2`ڜf1FhLq|h5W,+ii$Ǐ?կ_r5x/? IDATKK{`xxc[Zt2NLPZ2balb}K]ݛ B8k5*cv{Gp1;ͦ2LT:l+LA&ŘR #ͤqSiqWWWff_lk|>?ukWWmۖe1JQOnݍ#=I$333O25յrCR0߈z*5˲bצ۷&&c1z~~~z|?9>ђ1Μ9U( ) 22.aԲ,7Z !e٦:F7ZoI)B fH:#PFU@u%uf!@s| ~ 7J)@RPJ-^K^w>!KH)WW*B]c+%JKvfgkŤX,ko.n4ɋѹo#m΍r9ˢF<*?(~?[w}W>_^Zi4hXÛ6ue9B $נSTͤ(1Ji t5ZkcVZ))8Goy~p{+k!,|*IZZZdϞ>e}/oz6̲LVAUUMZZNLVXK&|^kd|NI6EZz+xvzU Y.'Ο? `B\yGY،ٶmuxg28eU*L&L&ݛd\mO=uodhH 9=;:Ҋrqt˗/_z=T|l$e,f(̧? Ҁ1^;v/ r9xvR2r]Qkkӧ6Q!P\R0&ƠVJ)9ZBr9J"ҚQBVhca 3Ϳo?NY؀63JzSJZ!a1;y?…٬)_~}jju=/0&JjǏ^|n-LJ!rlV{VWJbKk=hD8"׾+WT*從ޭ[G\-QB*Ҿ;a~%օ S3aBB iF#TR)4RZ#FoZ}屯ãsݽ}2ŋϬLZ2lTkP FcPZ!fX{6[Ci}W^p A@k4X>k)%`4@Hќ@`Ll۝_-ù\ {k6 8jD?| <-LR]tilrrSoϮ=wPDq'BXC&'=ÉD42n|j/ ;v218NZD-fXx'Ns׮d2 T+'N9:L~RBٙ7O>5}j= Ͽz8b mwԦΎֶL>C9ۈ"2}JBHrt<8z_BwwW>'m٭-- srDZ"[-K+omos=w|b칷(ܲeز-5!-\ ȶFnΆcR)^X2 EeQ@VWtXM[Gbna¥ۿM0(%m6ꍨێW.W} Zidr?Df رcG=:>6DZ9wR+u &ݛ6asqǨ}}++a5։o,,s!f|~~;ٷoz:ƛr8L-hBY 56σ {7Ní\ff׀6V}w|: ϟztR=pࠔ*>|l~{{G_K{%lR^Pֺ6uڵKn'2z5B8ϾSSSF#I[! =ݛ\՞\K=Hoݶ\_b֡VWy1\ 8$R*,b/n۶Ͷӧsݶ !jډ'0АŨƑքR(P*j,!dKk+XHds /LMM)RQoXeƘV:\m{yyŲ,yF\ףjb$|y  o<7NLKvlrBff{{zW,NJ3ccfg8յI 4"Tk$0Ɵ/,,^z``p۶mXFRsl6UZm|{6oZ][CM 렐"_ ~#d2\n֭^yWܹӶzX,DFE6~xI`H7ʓO/~ JI!RV.]^,֭[s,}(̓X)%$gRa_,*~,KQ$>G0f/SSS333۶mHJdj684Ig {S[[$V !Ϟ=nkkۺuk2\YYWo߾| HzeoyرSNs):xС\.#D"x՞Ngd Qq kk'}{[ǧ>~…rlm˖-R0JsY#/%,P(_===eYU+V xw~^jJ('OB/sSd~r~ ~j㝜sJiѨ%c9cYVZ}߶mS}ob-RsRl'Ј0;ٶ],SΞ9[Afd9>}zjjP((Аi<ؤvWJڑD/A BŖXX4*1կ~ն;v0,baZ!y睻wmVT&ɖ/ uGG0q#[[[ֆ'yҨG&޶mRJi cJׯ_zZZ5kΆh d2啕ށFd-lÆr\ehh讻?333kkk\ BX= L=lHx>ׯ_?|͛oL&˿baQ95b?:yX`;F-T6WU#_:^TmJ]󨥥套^& *ƘR,"zK)ggg:!l:(c1؎FcJ4 u@{gݥz=vm==}l4?dlٷ-`sp#xOR?AiPFzc i-1FfnYcE)%r9TgfJ8@,x#لY@L0ڨG===nzR*mnh#/9/Jֶ6!%Ƙ X= c!41d2)c,ZٮcBMx8vXEv[___Xc=511Q.GF1dBI׳c&(jz%eSʈvջ+QbKUp]R ͨm1۶]c---Ač~v܉2NJiYBcR Io}P(ر#O[sf9X"c螽w +k01(3B!ȑ#333wZEuZ?s=3jޞ__O{6z{ݷ[L eb!,-K+ضM?,8<ߺv*$q'A)Ė,j֌lǴ晘Di&Z1eɤII;Ry8uIi=wl_ɓáb1Lx /z1Q)5Da)u|#2,ˠ2cLk UsssDZ8RJc:{Vyމ'Ri``@J 0[VVVVl6_>~,MJrw! A]\\$dN qEqWUB!!9/..ӳ7nYj!k ¹\P.j5u1~Ȭym~zzŋb2J)!3j{ﭬP)evnjLuJ4FEm:w͛?cSBZqN<ز;mB DQ$* 0"ʨ1, cDZ0YI.Jfwڕ!B™B;bK!l){B)q)@k?;9|L5Vzzzc׷m6ι1 o~E=3:2vsݜxq뷣8x7~|j (Bq/.k-kZ0JbL8B8Mg/^ʤv;ƖڵFf֞筬L_-Kb\7>g:>C(&RFH9׫]G߷WJYiF1a B,SZ8R !VWW5A喆(c9񝚚2Fc~~>˲y9)R1`b;Qnzm;$!;wBxv@.{G6nxБ78!DBh4T %ιa>o6VXt9]#-' j54Blv|VK8%J9ƔsnNmn;%'Oj !@a K Ç+f\1$I.CI))ř̊޳}/8qbǎJ "imی1#qu4Ms0#RJ1lVJO*$|Zl˓${{{{dd ;vر@}߲grrf<0+Jiڶ<ϭj Kj:uUBϜOK !0JzV_<1%i&ҵmXV[]]R}2Fò,qvm13:7?\K7J@kqc$;WկQزe;o~w6 ib6RBct+Em7 C۶[ƍnܸaz;ܼysf6D ֮R^_陙y!!P)R p]21e8+@90QI4|I@EqRT(|"=48X))Q!ftdY!Ƙ,pι"cu?<0)!hqq1K.߼y'Nt:j1.J;n, J1FZEA) #0D0fq1m;S;J 0 ]żH۷a/ɟ@-vjv;c'O}011100n4nwZվ`%!'ݶ;ٳ'M|>nlxUk{'O%k׮i8O#qLWV)p1!BeZP(_{J֬q2(RJk7}ţZMF:I7(bl6T1f4RRىBdY7%ӄDP.cB!E833s[|ɜ1f<)ҥK ###v[__iJABp@<cAPV*R٨VkK Nڴi6m9z>}:"sS*8_fΕRYm$ 6!fkjJ kvԩnw^ bI0I͍Jx%6I4>yeR$I`MﴎB2n݌Z)1Rk 甹nlq|3ƞ~bd)Mf9==]mq[ZiZs#By\jF,8OSQ2 IDAT1ǀBEѣG8b442< oqa* dgITBdI֒ >z&BHheƸnWӧMm۶mܚ$Ie~~:P]x1Kb׵jITA`Y<qt|&(Dra6YKb~hh`ƍmq ̌]mdfs~qcݻM(fF9O0%O8AqJ%<#[.lNk_y~r9B0uR[M8$˗i4nw޽>c$ei-l- eYy^r!_)1sQ¤Ԕ͛7N ]پH^]]tBJ94v B6l24kw\dj˲LE&Sr/-//A9WJFLӴh8}'ONM]ܳ{wV5m=|7*H=/:r/##ƟI!#뿁BB2Ǐ9r͕ť}ksB뺧N`׮]qJ)>AYIJ)S 2f)) RJ\s ~f|ЀޚՄ !BsssqK)],L507B< BM,}$!c$I2::jԔzmܼyZ:-u-+ RcHum7jqv16քRsqdnkZ/qhTr` m[JJ$WU۶o=Jӧ8sۿC>\(bqqq㵊RJ)ҵ8['T&r;ͫRF{o$?|\{*yAqnWVVou0 H@01v)R bs!d޷0 nu;z9cxhx@KyG&sB@\zl,.gYR*B !4_wĉ$Ir9}L &penn={>}]v) (8=<?>AA83ߨ?[سMq_|ܹsJ)Ԇ O\.g@i(:}lR6=Ic VvZk$R=sر++wu׾,F]bao0rI,!FܹsZՀ k Rf \?ZRT,͸ BS=CGcǷmiWGqpϏYv],؄ŕ~։V,>1jeJ,uO!QKJ I4M#˲Gv:<˲ B}>P(SSn~јغȑ#[/,,Zg⮻v}]/\8wyvZZZRJEA(Ljh,dj1MSq,sm>}@F N94??Bnܘ{Gժf>`l1JiDžBba]isTIE"Bjdds^2T\aluy ];y/"!t <!)*ZxTJ)cL]xf ///rN=ϋ( ㅅf !'=3<^w]#۠ {.)R2Bb^`v>G$:&~h$VV}ߟH$2˲:}݃1&ĘkeKn߿CZ3a,EmIݼe{O)5rnVǐTB3g(|Gj5BvsҔ VBanY?\.G)ɲjip XTEECCCoFزeH! =- i Ͽ4uW,{/CBH/\p}tһ )1h"(?о/9|aE/M|q=#?󑑑ݻwرZ0"ٝ5oGF6>@$Ă v/0,;}Ƭfm̓C 0n?m!eYwQJiSHkSR@JeB$a걱%y̙8-2Oнh3PݾtRB˲wbB!762 ѓi% A6, !97=zq-jE /KRڼycZ)ՙ_6ֶ[n- \>\n߽{rrB<5u?Aw c\.wmCnEQTJkzhnnMcmذ1XZDRgIR*jվ;>jzKW.w;<<Q2ƴT\A4 #Tј!}}\aĉʕ+ryvv6۷o'IB)- J8q1Bȶ8!&3n-,./}]cHS ETr,ˌQ jjv:rW~i#ҥˍFìtgf&W ac)-{ˬFjC@SLǎ~=܁޸2!|J/~ѶmqBqA,}؉;v c@ P2F>ލ 7W[*g>ߺպ87n_OkѣGoS )5˜|3 B+U.f"|;ܹ(M ok_ KS%W[ͣGvNS-ox3I t7^Fgϟ{C?,ƛ׮P !8k~!BD <?BPJPXZrtxsV Wn`,ltt! TB^|K8OצA`2"Dʙ RLxٶ:1vYR*BI`!{[lRrM$ȡaD!ZCƬ/?-ˉ!?X,nviRI ۶eTۯhcDӤ2A BHEnq۶$iZ\Ψg?E}_a8幥Rӵv)ˌYADJ(;6T. ^{BpNZU@/,Վ jZB(JRZi[B (j}ΝˋBJollGg?{wx 5VVVΜ=?==ATZ޽BY6IaAx' PJLB)BPB Ø$gaWW^2s];1+s{|$I0dUUdY&R\@S$t]HvA(,;YJ 1&P+z`=Ph%k0Ƥq)r֜(Jeիo1-j7Ϟ=s7mܐ$u]'{!\;gp kbPEZvO:/6'|RO)5eYcff?"~-ԠNGkERJC@9!A.M]1"}ĉoB ĤijG)e˗ 0{J!н)1B H *-BAd@E ,dJJyymRe +b2111DLxf[J1xy+%y{wwB9q]1ec\+5)mfZe۶W\Rm!Z5]tV*}VU(jڣ>l˾p]!I k׮MnZՄIq\(6mtr|e<m۔ a: \{1B2MS۶]ׅPB!!`˱|.bʌbZS6cǏw=$˲iPRqL3FB+++7@lٺq۶ijZGQI00-J)$@rӂ@KsBGBRiԐBk󼧞z͛gϞ%]j7sJ).pB4 `B4н4$IB)K/tȑ;|WJy97R8tLW"__XXx޽NXݨC T*(ɘŧ8m[)qoL\0!ߞb>g *U,˔Rv]Vt'Bxe u]ʭ;wV+%!㸮AFqF$JGFFxW_}uÆ ^>ۢ \^\*JPy^:z͛7QJʕ;֢jrBBc8fg&`ZKB?MX0B˲򊖺 !8oΥ/^ .]RFs~a ""BcJ1D: (zlNO]g>Fa%MS%1G1 BnJ1lRRB!P(mێTkR[_^ZaW=U,A"ɡ2 f3-~%~#B2:6wh,JR1rȑcccyfӺ628cqv{\vkArׯ2_,2:"0@b(YcN*;2++###J )%c0ֺhlZ[eP06`[\8w7bt ܢ*S!D)a8s1f#CVQ״TJ7-.o0ZW &Q-\<'cy-8p^۹sFC?ϛFJJIv{dd$㹹X\\T*^!ov㜚:~߿qt^K!L8NmKxn>+4a3z﫿Td#Cgg B¹7&&y a+[lj ps9ٹskqnk|RB6[c D`LaY"R4??aTi! ̨"Q( ĖeiAZknåVEVVV|ߗRl۶, BJ<:J41.޽{RZ~׸ E Bpj) ,,R2BB}-Y/p1c (Mo![o7772㥥'O>?޼y_ 3G)ccq|\`>%`ttVg̲46cRcR!da޼ysll epG0ƍq3 րm{޽B{B"!$)eU B8ѣG-ˊxddĶm۶ 9BQ #8qlyb899yQJ[rZv1 ++Kbtǻ뮻N8aj->r+B+++Au)ұcNt׮]{R* R:㺹8ǧ;txWVVwln< ?lܸ({Bk1N0\YYV@@%$IBͲL)Au ggg8h4*r(Hq (4,dv8S*VmPX^^&v'M3#aQZ"y`>E9=ώȲ,#qB4  %43^Q8),%ZI)"BR>#=$ cVlO=O~_z߷o_\VJqvq,OgADdrΔBB}}=&*\(wae!aOd}f, f׷3kZ eYYDi&msbbڵ$&BL@c9!Db`>@(x jR|rG%RE6 jq,_<1 c,}߲X.:ST]wheV{vaa211ҶmgX[rP>m;M0 u1yti78qBZ0 ҂PHf\+! '@-#Td{J22˲$CHr (rlz#Hg_?vOv'#-0g5^6}~ˎW_yW_=|;wiRJuZ)Z;p2lكoM7qw0ƒ^tT*6ŽB6"cOe^SQS(0$BThBƉA5,@PF2!mI|FnQsI*,NYZkBN' C #Xe2F)ȱlF)gL).0M8k~0\'R+i)K`c8gfn9/WY &J4<ϳ$Ye8O:$H>ABֻw}.o{}Ƿmfv89nG"LllҲuСC+W|{Mӱ,T*jבȼx?|ul(VWWJR"I6r !j>R*}T!LlXkMN@Psmn2UJe9k@Zk!B(MS˲\ׅp,q8s4SN042ιx\.tR^.$0 va\S B)% ˍ?2!$ C˲(DJ0Nɓ'* B󼡡|>oRu!̲lqqqll^OLL1BR ^|9IB %׳'''1H$S*ҔRmYv)?~xؽ{7BJZ8/^?! ZF)sΓ$Y]]я~Dq,nCҜA,I* 1瞛BMOO . oEQ>c;|>$eBҐRr9`fQm "'" j, X@ծh bZ7n!BLx5Fqyٝ`׾Ua2 ]xqCMLL$Iyח.]{nf8KbhzdRU*v۶m୷z~]zK_Ν; "X\ߥR}!INj'?9}w)Il>7ƞRGZJiz _U擴wĘ@n͛|~ii)MSu \Rؖ](C)]_rã1#ei%B"c$S F!#0W"z)N˲|>l婩Il6~ι¶m)3B8Z8 KB0 mۜsc 0R 8n.MSrN:U* !|>sMӌ <{#G\gcN.//SJ}߷,kiiڵkÓBbvKիW,˂7 `^?uԾ}*!d||}:˒}^4sOX"YG?g]u(7۷s"6!D@Jr]zxC\eySSry.UI"i$K@|0v7؂(.B5'sJ{\B" d4@e6c@c q,B?L\@DZ4_Ϳۿ?cG,R 4Jo}ի_d)kBŮa&7&'5&pH\k͘el0@ZWz /pŕzӟYJ7д1e_\}s_וaCOn S_rǑRڲ8Ov+eqc ?P8{F 4*ji:tZowݛ7oɟru]L\G*/~~޽{'Nxgz^xZ2L)uGkm=Ơfl<PyF)R|…rJ0R޼yS)uaB)NBBYa jOyh!ȤH2yaB8y9Z4B`r+sK)8n޽{zuqq^{ѝBk>ljb*J1B0ӛ7_tGVJAyu{9yАsJ0W^FOz݄8v; 9uݻw~󟟙R&Izrrr8fYvW޺u˰r<33eٳge||dRJ͕GOH,MmRf4ϟ۶ !LD+loo/-?cY2i44M )(&Ȏ_} !J%B}BX$cdY]]kZ^/R9G !(F$}UB*!,zdY&Ի)yvRJmw]I/~ ˱gf;>PKe9Z,MS~כZ%p8ӖM=ω'?kTe^{~ɟ+u6Z<9uWWW֍FBP՚&B)a ~ӟ)DZm[k})=c$ISV:(o'x5˗/1ǣ(qㆱq )|p0LL2o8~^J/:^s/*``̒RJ)Q#ypJ)˥9BhDWkQ"/`H)-rJ:]@121/0X)9\ iIyfje`Nl%;+3S<^QεZL)!e1CQJ)m۲ (o~tڡ#0Ɣ4NF=~O F0*'sBh4jsA?;w?v'?e_8O>SO=ed u}ߗj:5iP! #fd04ZC#&Gv]*z3Mcb1Ƹr/(gI,8k^gY:@B-YȵS 5F`F5=>q BZ%3mO0  |umFRr,O=7>kfViQP7ڵk$I$a_XkVvqM7&&'7oWZcM)%jiiw߭j7nlnn~>A <ϫyWU-x㍢((zUU! .FQpnnT*A 岙7kZ6?=ADZx~ŋH4E9_}^ȲLiPQcʤH @bH)ZJɶRe8C6in5i*+2B(yǞ P>s_|w4XexmAcdjTT@a[T)&BHIvlhᥥGyBP~+V1 |"DeQRlpo͹zJh) 0B&) f=BLR ceh{y*% DqxXV% f2jeij1gkgc.ARRE]$R `4\ad#Bzzjɶcnoa<>iС/Rq[ʲ죏>t:ױB 6ZA)?Ȳ4_W @ lmu>tRool/x}ĉr\' ?omcFzJwZrP}Gvlu~y3+hs{hlooEoܸjWBE`$BٌXQT*(U ۷]۹~FZ-ZN5RiV˕0NyAֶ ce0FC Uy;R 0Mߍ0Jb,5&V-O6 qۘ3uF"p`[yemSR:lo~s;ܸ}Ź .$RJ)=uO㍍ J ~\[YYYX8R\he9YAh**^-}s[ hBmԓ ki `D MS!c'|Ґ1kƉGO[T0b׶!@!@+}c`?x ZcD@.xW^;sqeqΟsg&Sǎɘl#BeYBK-ݝmq.ck299~R\JI)߿ҥ_7g677mi!([[;e+aJ)@ܺuk_|Ѹif)l4qCZfBY>d}}0v^o^7ENguuT*79c 4ٳׯ_ײ<ݵu)s323xĉ_jckkwmAtܜ@FQ%Ҷ,BR%Q!aѣGO8155sرp!E(k4c=B$IEp֭FlփeYZ=rHcFm\/;r|`,1h4p)TgYjnRRJA,e!ڲ'Nu]wkk\.Jyl6i:~9rXwnsnvO^ R48Ѩne!T*ݼ~W_~hfRvwZ5+׮OήonęHDJyR "GWƮ߼ٞ7į!R< r0[ZN8QRTvˢH(|+bnqs{N#t:Ǐ0fF$0%C3P`[Veιkjr;wm{qqsh4JSO=E Bc"Ϡ!#d,My~9}_4)ag+:ۭVk׎?.C/PZ @R"l4bRR F@hd4 9q"h(|8[]=˱VF#8N\\F)u]00Ʈ--F!-a,W+vgkk~vqnaѲqQhY241F0޽{ccc7oެTJRʥ%BVѰnBCx SSS"FTeh(zG?JbN^\\EV~TRSNQjQJZ/--m1rꕱ1%B`45ZI%*]p02a߭TJy^!4"ƭqIh4P)V?8VH(Z!DRACl)&!Zfz.pl=>Ѫ766F{rb0yj@)!ИR<ϳ,k,nZ/;^RƲ,!`yIC |e)8~ݻW.yzs 1taa\wSyN>Cv/K7eܷcZ_ˀ14B`=ϋDaYRAa9nnnU`c[z?Gnws 3SBۻ2c!p8k4ON9 VWrZ SZk۶ Y,(p< C¨S3BBj&rUByK(]XZZk׮BկH^EsQۮV繮;>9AB;v,jj89M8 jF1n۫SSSv[)q3ZKJ`0X__m{ssq3t}g>D6D:<=0 jTbpj sΙe)Y 67ݻoˍFsܹKRA*%8<4jBg#w!.濎I7r?Jh\G{vV8~rQwkKYvz;A7Ip1l4c)%8 C^o0FyqRlɘXXfiJ,VEERv0s^d@9;-q!P˧ƧFZ/K~wpŃ>rkܓ7^^>~$am#-Ƕ(RQVs F>hgq؞1,8N׃F[n?/J%!p8ŋO~'lEn}SZkS^8 ^~'ܹs]0JmRJsmjոR,{+$RZk~?F|.eLL)-J<. Y0Bq-..Ze,s(l Fgggg0vzvQ bBLBv9C-QZ XX:K<=I1bK{_kیHRrȘ%#uVUƸlr/_\* "=vFk(mA PCoܸQ*$I\ץ$qlV*<777;۷$jIZ-s8yjq&X-nʚ/|Ak}#GkkfN~3cJ<˼s9Bym Qz󦧧}? ~VY05^(0;ر+oa^o5rj0;Nhk4NYe@rlq\K) !dlbҕB$*9( w9~' 𦦦,J1ƻxGE۶{Á8R/_ϝ?y˦J W`1Q>9B vcB 8Z{^*!ɸRlmmpMYVJ%Bj_cJHX!ERZ ƺP4˼M/ތPzou?RY:XEITk}ر[n[w:;ba8,²,BRJ<el(纮;A,#꧖3`X{0fnoޛnRJ)5VIR5Ik׮5-J)זGkqy@F)[ضmPq(jZV61 +%(yC JC4ϋyZ&D!Fiks΋0veYd|ljRðڨB@hf[\(r1 DJ8RO=[[o) 8w!Z-'Ice(BdžFWZir8Q!BQrK_ooqΫժk[b̛ZKzpIvBcBh!xB#h |Fq1fQk9tㆋ,˒Bi\>bBEBLJkUf\ BxhSBR\7@h5 vkeXZZ\۲,m\O\/c/6Ma9L8Ϫժ:mgY)  4R9&Cnf}-'%k7<|/n߿^T&''oݺ555tl~Ǐ/9<岔~E늜_tʍ'Oqn%ah1$`~ע(?xB2 J-jYʣ(FgΜA@n`JM-ám3DƖEc11RkZ]H9B#g[V^@k)FY!BBJsdb1J 8 J)zCf@<-~J%`yyP({l'2@)S$Io'?,++۶[~˲Bȵ-Ƙ믢6ؓ8^`w/an fxp+@[ !$0- 2䤡's "Ƕ Ą^!<'hc9a)t΅R@) )Jh࠴͊zVqJB T"2S<j9R6pSg)c_"( 99&bs0k뗯\rɓRJD(5Mx"FY]xիǏ' ˦z]Jmmm zncR(4T*sss浓~]9",~ɧ[o|_}+WT*V$ EZ*{G޼yѣ[ƸTF#j1q~+W{C 0ƞYkٮx۾W Ν;jӟi}_~g>"OI %(h'7nݾvm+%!9VXaR5J3zN^j($9OӔR:77$ЅԲOݺu~K\xFQE }˗[][9c^fYY_yڕJdYTʢT8l۵Zmkk?!ܶ-X͛+_] iPq1ի捕׎=:330_Ǽyl0`8J)ˢ ]>stE.]2822cu8Zp`sd$JbRy.8KSR"cR^z;_x83\Rqi8qCLgyoYtaa?lc{GI2=9>>5ThAdij۶, E #7O2?q۵l(s)-BຮH4BcDHE\0(c-,8s aYiQ fӲ(BR1ײ ! e %,2DžZks.zN-?q!hZ BfZ*slFHJZ.Ɛs> Jp/--׀"˲0v 33s?;wӓ'OWn^UoTU< vR9}zPj-X(`<{fyk}^׫E`B&~M:K4-qmg0h|kkQcwy|XX8 @vQz`VܶY @i%4OҕpO6BH\#!DEmJ!D-& BfB،!\ۙ4V"0Cqdik $b~~Yj%H+Z IDAT@yʡFYi-!k'ڤR''{"pXVT,Imۂr) Zjy9@Agк(kf.Am+MSQ`Xsa%AB0^:xP! !R%$LJ!zq{ PP=o ~ 8wܹsFBXIY$[UJJBHJIJ''Fmsc:("Էm\BX ?~ zry!y0)F17n9kfjzk}g ێK3rwwjgܲ,_W]E2>~?8?w{wK3.bfjڶmֺSm~/}V򙳇jmnU*3SYlm@Jdjr2 `l4fz7|ۿx`B q CݻweQT*JP `0("su՚L[:u뺜 c,q6\.W*$D)fĦMRVʵUenonf:RB( 鉩^G (GYW?A@ WyAf~_i{ lӉ79`0`H@*ٴ-?>K'Ve_r?']eV3 "c3mYe8.]׿>99{=zthhdcZKVWWGFFy晦&6RA@Ʉaj5LJSO ( @` PJ]zWadvm0+/jb~fBޑA]Ê++zwܙ(2 |I! c, XٵkГJ!s!TEZJq0,K_ח = n˲0c-qТsK@ oC.'V~>.MB ذjoEǗR!!$H`aA +AxE2sݫoߤ ׯC h4lVnYVDB+eYcj5J)\rNiJ DlX6|htu_rZ~PP%TLϝ qLC!^*oʇ44MS)uرGyhض}С={V*3g*JOO0 m$^[[c,xٳgΝM&l6h4JRSSSt2!t]{uvx`fj2Lj50=v_B[[KA;مbX,rP+0BBt.v rV C]R>bQ)ťJꉌ0 |4 %СCOJ)r:&VbaP% #JcRյ{zFmtt_?mvVӣipCf73|s ![94qiEC*DDJ $|=P"MPe/<VQÐ*r\OOܲ,0޽{~~(@)e0B!DPm[0EFX2Tfmzwtt\pjSK}<3]KBE׵aضvffFV!alr#G N^aTT*0e) !TR 8ZMJ@#.lؿ:awtt@j`+g>t:7a!ľ+O>dLiJ=}T/|M&ӛ,?u(klܞ_n ]7?9B!RSA%Ć /9ՕJ'PJl18rYk@գ$cG}l޷o߱c<ϣ妦&׵0L$caڛF>PX\^^>{;J)6lrIh4XȁεѶ6ub1J)R" lN?1BJ*iZMrZ ðДkkk#@ \ R"!h4 MJw !]]]t:"@Z3*,!=((4|g_y={ (+ cSNi}`Ϟ=Bavv0 J-rmNB!ol]77[Vj7$$qD[U,_x Mim2ypT*`6B1L&bP2&<____]][m8K)9BF`o0yF_^^N'Sz=N3FPlկ~5K[#PJI!r=ܛNeAǔ (AjDyS)u3붳w-7Ԕ9|;n]ߵu ĶnrC;բ4MFEZ_XX_YYRBJmyw.%Ɂ{v+|),KpB<.e^k~ ~#wبvJ)4BQ}xܭV )JѰm4(b&<};q]0 ƘiBHN!8?yd*:ppߨjaY6v N?SO=u^z+~{:Rb;nRڶ]V:۟o1ƙLFPaRqL`J(lێhbblvv;\  !BK1qq}}}wg0__߽ko.RJr({'n.#]]|^pQ*,˂)o,k} 6<Bjk\駿 B`561!%jѴD*}a-{DbBB|uu!dBp&tZJI)uƩQY#2Ms}}?.ljoi!5-ɟ7G7QAq+`iiB\ܤFpx!tj0 )ٸvB!!RbvvNJ;5556vq}' :ABLBKiYxs'BaB0 j6?P.W?*BR bj^{ %tuu ye+ 6 #K7iZ4u۶ –eQB 1&յ'N\tٲN,Ӵmszj(կ~?OzuuP׷o`V 7c{O?Ė^$2o!Ɇ1p΋bZQJ]7NƲ)eVJ)RT<}1V)B0"R V*j!,bB9!mj`AuO 0 CH&{psL%S֨յrl{ddρ|q WX,|꽓FC :;u}T2 P)wcEjՍgyH />}zmX*Vm^]]սFh&Tۮ0ƔD"y7T a&Bhddrʕz>00҂1F xFǏ?|;a477j(.^xڵ^]ќL& PwfffbF6 E $XE Zs{nDk+QwڕRJhT*54-xnIҹ|>OX*΄ru `2:;"zz^$& bkkkRr\hVRa+2x,Fxbb^}fqa1677>}25a2\%2'p&sjB[f,H-0iRyEtJ:;7O7bqsÇJJfs:X.][o"1ƮBDQ$Ǐ?#@fgg_}Uǵ=wG}t;Cǥ9Ӽ9Y%BX.fR0\cA)omׯ_- {tuuB(LTJeEyѐR>|Xs *ټ{W_UJEQTVz&08RrJ뺍F/^ٹcr,H;Eb IDATc1l|rp.BJͣZ\Y0RJ *1L9sX.?nE ˲a0ƾ\v-uw+O8엾T*p 1Rڶm2::IB˝RH~ !tzem4 c,^rew 8e<ϻte_[]]{>鮖yd2"!x67rsN cm, ?xS!W*gSvhSSS&uPV_kԔw5#Hɂ @BpwjjsYǹ3g臌1˲}gΜUJRd6QJ B\Ƕ,O=g}l6!널T:955WWGܳc!$uvwwС榦P/Ӄ@v@]->964GC4Stq+0i4\0&SSi:t( !14<ϛҒɤ1Ɯs!R!\XBӷG#7|!Ԯx+|BmLӌbKax^cdc$ORi*:vE FF1bFQs//?HiXlٳK--=mmlSǺw9"GJi& J!lKVjdg?/(W+RX"9w}'(-\D2)!\JqױZ59}ܹ={kԤen"v遾%bG{;0Cz63;of~V1)eB=9Q䞖B~C.7%Բ,XR}8a$R{&n)B H4 1!$Rue}ȡwϞ]}7WR !D)5 lV(===JK\C6RUyL4 1-N\.sٙ/^tiy:ƤyǎzKmiЏPOnX"|_L X&, |>o&BX\ -$~phh?{ͣ]yGtwX,&TJs׋X,fۮયo@)1ňQd8ov]R;wnfn6 #Gkn)+Z1?w(\#"9Az\XXH$R{GvMCV+,j BAqD6j I NX2R& (^*rlӂ@,]dꑇ (d -WKFT+X 7O[Tn4wpȷJ㍶B!clmm_~|R!ͅAb0&l OG/_IT*MBRi=? %kK+{:\ea)BDgF(BL-׾+QJ6[Z ,e4`m*t"(ӋP!z~878R cH#NLb9| .{hZ_"V|q7 0 R9Jxp~+TpƄ];LmdxdO?OM;n}Ϟ=MMMa(.b-d7>cd455G f. شbA$D\*)jVe4wOwv(%0uC) Rq)%!$R9cQo|-2!6uװbiG"K\:w}b|JJV, LgӞP1TpB)8O?D2c RbDx]`}}=a.r׵la0YD T} !yRPbxĸ1׶,gee%K:!(( 7!9oR񣁿ϷRr{7!?B1϶ ʘHcL]zmx0 3L{cF#0 Irn96BN)TjCwyBVl fu:::<{1|/LF4ɸW'l7#|J !LƄE̲r|~}eqݻyՙA +˽=]j)_.~t:mEQ +!1J|^;Xqhb1B!cxϮ~/o144twwtr0ơ6 q)FT9=4-Z_Y[ABF{{{AJLzBB2Q$HA,V$SFO9ײMӦQy~A,^w]׵+wLMM+eǶ"D!8Vͦ3js QXL$wBl ДRokZ8رcFCLUǢ\*,/ ]F*ZY^6>n['&'fF</JRꥎtlZ̍?C7Rl!:\5>,ܛp`[߷>o:-cbx !DkkvXZZ_X\/F\WR榥 {R&R" hEA!əJ5X*MNN!/_P"leo81v]qۖUUmΤSx BR\^ժe$aɤ?}:ϧ3Rq}rbAx`d$28JݻwwjZ7; &m' Tр߿_gF LgRbѶ,9&1LlaRS{{R * RƓ᝻yxϞ=ɷz띷߾z#FcrTT0kk3SSSS{g?{_r2c4I?ЃߺۧVWWjZښBps ]E)kG觟{?OMNNNNMkO>'wH$bFq>EŲ!ASKk/908t=,..^tԩbqΕT/~ѨǮ[,MðmT*lR;>yNa:æiAqΤ6=@v5<@e~}uuy S##Pi(uk]dsB{{>:;;EitEQ_tЁ{vRr83۔\L fu6?p'f殎 )OBZf۶y.]ikiVǶ!7|'1!^a6H ii[b%Kƅmm--:dRjuuRJ%=}0JRl6JI2YdRJ) 䮻lmm:MN/Z1 !@n/^-F@ @a#m+Lwt`mFg9 z~2J$S)2LT65*RJ)†961?_F۳{7Ƙ`1*;ť2M=1CەBJٙŅjKMP* \0i#)J)5ǵ-lxu)!D//}_m}j֥U BL ">:Ngg'J)IP) Oi19 +[M3l.;~rx\JV.g0Prٷ:>缣 ,J"LBױ}Z/")iZsBւ`SmV)!P֭!@A M((2*'MovUjFR[g-n?4>y0!rȮ]ÆaFjIHTpZ*ڦ\ht ru_lpp`$B)~CW2A)ݐGz֚&'jJu)=vM0p@ a, вm!"cz-H. @kƖR榖.lJ&dq FaWD2"fXf_|qbb(rlK!PBzׯ}===B ]cRnvwrsQQ.!3qե%4if#RTЍۊNi0B Eu߻:6~ɩ7f۷s FEQR|V>_2:3{܅ h\GuvviP/=!@)}Y GT"I51VV$]ˮ.] 9 LAI˲b^lRwe!9g(beYR8 (1As. Z]7Ladd_[`Gٽt41'S r]bZPR :!h Sʒ䵱1Ji:Qpcҵ=3/\ܻwĉ'-WWժSBpQb)ǵ[ rJrY&< ֶ1י1M#uw sb.lu}\6Ps # !kxa}nRybf bwdR 9 t6{ܹr&D(\۪]]A n::JX661hm[%0(d&w100hgffJRz=kv MTNW3Ƥrs;d2kK)IcR=٨ ^*$fk&"{lV\!/~q-]*|.QWW̙3._H u0W]$t:mjλn8l;|k_{{ZcN󅡁>סepW::)Čٛ6mI[g2vy^ZVAHNJ)!!$IbR \Kr7 !R1Fmv؉Rcq8qM7&2ƀ ^5brԩk׮5-eYe |c7ol4(|pٜzq{G-۲,haQin|VUErJRr``@LAȲm!qPƌR)eYpΫ:A t\ekBss]RGIpn)fssroQjپ};T1)˕jf1`өZk!TJ,˚:33n;3>>l !CCoyڵkCCeFN,+BAJc 333wu׮]R3-_ξ[nƘtgYaPj%MN^~WL%1}Gn¨mYǑŘ\+C Jٙ Ti3Jǿ/?G)X\pN(EA{鉋RZn$BQgs̶ `};gR뺜'BPZ6dZkmdWWI)Ee1˲$&a'FGG8x1k v:sJOS}ٳӶmJ-B{)\ӃA1+ \Aa۶RHB$g2^;  g&.+33o###FkOһsJ &PI1&bΞ=8vZŌtFIf8;K(J.!s۶ X^^ر'YV.Wh7 hf9mMB˗/j(uuǕra XזҮF|ꉁ!)o 1Bm MNN !!QQzݡ r\E<ZkT>OWlRTiރ>Vi&ٳgwܙz\q(8ŹD+mo8JJ}nڲe :fs2F`TҲ0Qdjᑷ--WV*A=C{߰mRJrBB(u^[osBZHEqgJ#$ ye'a\xgݾ}[jC\DQdvBu[Ƅd{f[ZD da~3v)JJI)ŘhJڟ!` gW8<(% rXmKJEHkKYUk\Ah4!Ͽb.+uvAzRP'u\@BŕZk:!ww}7XIm[*2PB1)8Igz)6jpp;l#3' PeTj!.^<[FF!@02 e4IB(:K]K z^-..":ɩ3Ҧ͛-^v˿mQcj!RD*Ҕ1cL“ / JaLM??2<ۓjE6PLV)ZRUu\.("xܹW^ƲkZwWwkiNsZi?~0l4}=&oPD# Jk "h^tJZ^ ??ܾc+c,IBeYAG…eYBFIOO7'0EAhQ)J# )A(W?z]{ݚRc @s.ZH e10Z6B mv}r.J;W4#̻f0F8Fzn&FF9}?I;ѫ51ki0jJhBpcq$4#&AU,0F1Jtzt:A%BfJ)è[,VwoeQZ#p쵅#ool6_=_>f}@D252G0uh6ml4gV3BXFhA[aQJ ꡇط_ 1\XpL)"1Rw-77k奕޾ޞJmb}?K6o">J !lnZKss B'BRAlۖ1R::2>84@)Z!SB5@;*5GSah ))2q,f;qgC`M,fAI !i$ c B0 #@Aض DEqz ^/4! J!H/bT*W/qdۖd\vi~vaH-,8RsJJ |>W(1Bm["` FZ~مkso?nsڰ\R044xĉ\.1O@-2F {}R9'0@),0%<50"I,F7Sj]p!xťΫ33{o vJ!8eq||06QH)!N] !5c׎[bYcpƘH8HSvow7u3GG{zN?m!{l>CDbe[^~^=wncn޴MuvK$rl\Z$ZVZS Oز!vl.jqih:KIF9O9qbC)#Yf\  BCDe !VpW_}СCq{_UcLq6FS8!Ƽ0 O<511ѨcccRKE:TJY.GGG\hT8B!B*q2JI۶Q$Wy^$󙙙g}v||W^wMFi ż>Fcઆ>1+q8qᄃiڗ/_HsaZ\IµbP,$E!6Jjq8QHΞ8vֺQo2ƾs=FaHjh q82mcd(ڽ{YyJv@lۦ cF)?>Ğ={mq 0R)Hkfq\ _xDJjB9B0lݲmV=J}Yfov6- `uhYӓ"BHBH& 0v]7;ΩzV^^ٶc1PbJ!F0'gż{1$6Zae%1'48+|9.[V&A1RK<ŶP1u]vz=Ȳ-0VJ!B0Z)Ql6 _xŇa~6 c #Yo8, f3cg`___ZRrz4l?k4(&J+Bee9C6`a6oQt =E!^>rdpp0 'ΟJH!B>}`X,Qކ~ !3cJꥥks FOܱ{aqqfj':|"k C`^  c,Bp1@ cKǎoQR3>B cVW'8OJ)˲cҶ={v>|xaanu/C|?mT)H1'; )X4`Bh rWW溎łyr(˅aH)V>\&{m[ M:׏J!iPPaJ)B &Wڨcz(VJYZiclbG7m؎2Qm;"PJ9JoBAN,>LqN!b8Ζ-[=j lqD e$a!(%fw L& ôs+c̶ -j˲x}߯T;Y\Xܼuڵ8Fs8}Ji sA)BBa{GUJ.8: ?i)‚s/}|m[{o۶ms۶(VvuuJ1XwBIFXEKF#fnOO+^}kJ%#5G}ł<_6m޼c,$Rim,1W\{7VRRnݺ//|gUJSA8k85Xۘβ( ޿K&^͖Ŭ|>od"h1j2!֭[oǔRRJc $Ʉafͅ0\m6zQٽ{Νd*5TlmLwSw##s(!swMzk>OA cqr%" L/Ir~ױ^Bd(l(v t2(U/d,h*eW_pBBDJ]g~c c4 rpcvZ:ƫsM6[FöF)Y ҩR !1 㺛7o7 aaڮӨB^"D)ńaxkGOJ|j[A^^Y^V}٫#u c%JH1+Dqu;-Ulʄkvة 01@/eR|>nPrRJaG ciK c::f(7nxޡ#GNM_-Wk#ˡc\iZ1b٬g\Ƕ > H)m[^FL_ʫ.ajwGG̶ c ny1BB@*##Fe Z.LRRuWʕTZ8M(1Y c?Z1޺u֭[VE`IK\׍Hz IDAT… G'>m1J(gA(iIv!qS"UpZ_)R:'+J;] u݅3W>6qlnaj.]s]u] Ķ\c$"۶$,L 0hB)dԑcRonZm4 R .@XKչn3?܋/M^lC6=##ZT(8B0F)Ykۄ`BJk r[SS3@7ySv1t_?::vrBi4e3˶mJ)!-a06 (Ze2̏y|cApѓ'NRBٳg۶'J:T}N ~u Jk3<>!Fq(18IcvSC= !iZ8r~~Rd( Kq"Ѩ/,,Ω+82P*HxR((.ljIg^쮬T+M@!@fIkZJC!"8@f(^Ty^~R; >y-w?z7lHC ÐRj\0ƒ$1GW0}O^˶0AW "]7dcRzttW^ZaFR^1FCqB2({f\sA0mB{{n۾c׮]Z`*?.ޟ6RZ.W;l6nw3IDǏkZKKKZTNs1zM.w$P)9O}/Z)sχap=l߲QZv!Fyx8-q VjɡG.h404|7OqR )$?4hSnlWWoA1R֪bQFgY@$LF)jlB$6wdWWBh6u3{޳cZ(VJH){wS.(R./^xL\YL1DJ0!iTW*]Jlal@@ӾdZ+1-!L@Tq=KS?xرa`({z`Ʊ+W9 N I\(K.BVVV @=/|Sb!I1 e `ՙ3r(J($];wnm̙3!ctQo#!0Y6 FSa p%dyi1;JRidxu!fm>` 4kh0Ok'Nص{w__XGGGggksO=!B2@cqnIM2QFFkzjԹj3rßzxhhݨ!%'I.xJ/伌 $1GJfXl6(I~,,,!Be^׭@QkYcl٢j3g%X++jW^f倫v:#?I!B0IIŋ:::lZB7mժOtR>/JckRk$9{ryy$\J/|/sR !@PB٭:Q?c!1Rز,)xE;S_g 0XZZڶÅd,[$hm˵짟|cѷGF]FJApdxQ m3 ATB]nm)y(%o4]bccll#칹ygv`<8D 4BSFzRo`Æ {o}ӟzxߞ]Y?CZK:;:GaueرeӦ#<_;֒ah 1JBA^60;}'n y㏧iaضm+YsfR`׉FYC☻-Nq$e=~4Ƅa|{A!DL9D&4;fT'J r3^^67ݴgk/@pݢN c `׮'OR-1Jr'`!DK"˲R/R cB2QZEnEe7̓, `[ Qcy<4؟a:l2@T4"3?I"$6xCmZ+DZ(bhGO"yBt۶ !i=g3?? C !n['N]Tߟ{::Ŭ߬5rG>QXl|xO"j1mɉ( W\Y\\ke)e$1J6Պe1Ƣ8PZ岞HJrٽ7׫'{ìݎUkEq Z./{@ dBI)cVkddd׮]/_-' n4z#)" Ft7uń'O}{9~iixx[GؿcjtΝ;RJVB!6F$B40a[/_NX (jZ?z;=SI>:?!v]$ ^Zt6!a=wfX>%LONn4ё)u8" ťr9$@ 4‹;;iZVkp|_1A!4BxF?E DJ01e :u* v;O)s_8v|rێZicRcY2F)%#=;e,j-<ϫ볳ݹl'1ѡ .\ė/_ްa@Pk4,ˍkϞ=o\x) #۶$?{7PJ8^_p.L=c,{BΩwcJvDĹRT+/^h¡ R()r|!7<08Dkz5a( ҦOve~ϻsݷEڒ6 acRY<TJ1WB"S?`*U|$LR0 6l<ɶd--^nuw=˻<ְdd"&Ru=&`ApUڬl"dlo\b1:6C\lqAtna~Zk|Uj6^xvFjLwuu;v+?0 SH Dϻs9!Z D ```Y[[ !cʍ.3A Wnݺx,N)JPRML zY{A&i…%խ_z}K% 4ZH]t)C)@*c"B✫:Bp΃ z*A Huf+޽{δ3왟\|9o-U7 ŮvZ~X>կ~ȑÜ Bڧ6c1w'sN)M|ɓ'TgϞYk$N$:s\.'utut}B^ 4Q*APT 0rΥ7o޼|܏J)̤w/Ydv).8e[jooo48p "WBi]n2c-HtnnVzpۅ?ӂ ֫+. ZGA088K:oPNXJӟt}}}||sv⋇Y0BB՜2ѭ^nnU77TOg={޸|¥ƹjZ({'xbxxH)n3%WCqx=0 sIDQ{~W n\NV99Y,kZesA P5R)$2H Bn rH$IZz|.={()9Bعߞ":@l&O=;JTت{܁j !B^ιRQ@rV YճcXD?^ wxO}[vlҬ\g?.Ð^2;<+yonCa3zZKN(:y._ljΚ,M6fffTN$6V=<278To4Uts(SJ%IJ)a֢IDAT5;\.ʲlqqifʃWr \k[=)PFɌꕗ_>b1"BI.$g=svx\eN̕Cq&P0'qz(5`(g$$ #0~c>pⷞzju}N>g*sZ0Ҷ[ n\JDZRJJl6RJ)DG./h5A땍JRR ;3W qER*B)Ȳ[(FGGRJ4\\Y_}8($ֹL'={gIh[ K?+Svcm̙3ǎ UX׍B@\XH@k-dPTs.8(P]`͕aT ?7Z nCt~PLJIae:N%3{DcvvXs>88裏^vm}}=ơҔ2zaSN23H)FktAހīR*~DsssRʉ J3V)%T*׮_?r(glT=n.-߻o`` hIRΝ;#c8&x/_"J޵' Z),&rB@7WVn/MN zo_zZdƠT2w _?Oy@cwaUs4=lY O8qG6jQ{O++C#vMLN9L,H0k#XFsYRR$IL)nlll6F )$~7wMMvJ]]qfr4M垞ͭ;'wy!x!#L) R csN)md<76JzqIXw`|{OZ!1$W󟏏sj2B(lU;헎Gxs~;L\.Rll0lV0[[ZZnՇFF*NBH(۪m !seZc2!FGG RYg]֊[S; A)#@n/dYzpzSjtRq>D3DuΎ9H_9謳B>͗BLk5mF(I:?={lehщ|3_ǒ$ BxMĽs1s9׫:/oɓ3WHS%fެl-*xPLj\0BkC)kmF#"ޞޮbQnHkl6 80"U+9Lu{vM %.lss+EI;rh۬V €…Ȳ, fum|j%I"$A` U؎*zG7 cy}~RteQnNۆv5X0{x{ZFFHFuaii+vXJ)$@Ctqv n{_i|PI%ZqR~ ܳk*Sk41!L qF |b▔sQ,,KgiY:g1F3!!eN ʽZ/OZ[4!s'>ec\ !a% !J)4{au"oOBhT/~񋯿~fc)!@):zCca,J J)#sPm$1!DjRkmH5QU7:#thhH`R;ӎSBYX3@Ac2F) ,Yq;é&FfY]]o!"B:zc"$Iலׄ_W_vȢ{W~$I!E*$˲lݻ& +Mcɹ~ !֞r Bqh!t !)M-]تת\qbbGR׷v72d&l_0)푛]W !8 3Ҳsf

fW2xgNTZ1F'h8$$+_|e=q=ޯ⋏ k7T||kVk1VuWce:oj%8Oo NEơPldXWq)Eru|s^FxM/wzzLS_dGl-  = `QhFڥ~q3ֹ|G<+v7,n.[3q#.v|P{]t2sSޒI`Y-fVrexsa|9<ys =NGҴR+T,e T;GS_R9 5 1sM+ |C~2?t _ ~K8nIe62_%09bxk༗ۭ֓niך͚pň} d־Wpiap@|;ִ?W9Ffr4{{I-~- gU߇ܞOO\ۦ>e1r670 ~Tݣ])%aOuׂ wËgiH])AlvWC3MnQ2?4*nmHˮv@G5cQfWG /Zťj^e$բce7lQ!v+_/~.5IFnȠ)}7ȯf@}Ȧ#~~7MG"rj}s^%K}*9Q\A|]Oq+gIGGHlMy0s>ϦZkx恀 (qӊ,&2Y]=Y].kHZn^cc+ BUqNPQEQEh 7GC_~~oI|@w4AoXrmԶ.:Wes+yaFP")o-e$:F:Wz&Ӫkn#ҳ|'|cmen$,]rNYڀIbskkC>'=ĺw/g.<]{Vr=id92ڬ/mx#I?42Wbјo8_T|#+>!kmbTJm^ arr9Њh.[G `YW~@c9vr~ 5kJ-!_ϮlKD0vg9k53I{jr]Ku72;/UƗ> )$6wfۜ$.ͩ_e_0.sUMUt> i(.D4:kXL'UGi>Q~C]ANkɄڪWv"յ auD\IMJ+hcr\(I N;sǥJbL++Ogj>"jZw-wg/p#prG}.gfkt) M #P#'$cz &dyjSHE\p CdUo[^oO5{Ay,EBq#W>">)ѵ[ yW~^-;iڝ+&"C@sϵs?~Oڟ-.O|JP2^KHx*eP w w?@ĚɋQ;?xaI~0|*$"Yl7] V亝ͽĪo2΂Y=s]ƿ m"!NL|86s9"WG# gnKhbiT;g9). = HyA'/7 m֩6( D&y+29ɯIqp:o<#xRn(:Q^9]kO!I?լ-遞hngσ>;W6EԴ64I">Ά_H&1G e~{ZgCl-=Ȓ8& -'[fOVԞG Lը.aA$,*~S<~,x7Wѵ T:e߈,ᢗp;6 voEƵo j h͕,t'[{_&O19~Sy_YڡֹN?Irm]: ˉb8$o-hs;ݧ o+q֐Ff2: VO|s\ޮ4'k/Ók- t' du}IH6K"9eUbu=1Mh˟i$G/yT֯%Jӑ:kk؛p$ ̺a)PeTl} f+2_V,E& r<(վ!O֛GaKD$XJDpIǵyW~>/$&H|Znaķ^lFou p9;0^5Q-[1{5DgxJ_)RU)h7-O 4RVm23ia A$1+~嫘|cяθ:=_7xpxrz Ny܅?f?|kixcKI>"KZf]T[ md~_ǵ}5?7_S]&˦ܬ鱄ѐy#ݖx51!m[r(ԴH޺f& ncuzqpy1n/{C:UirLp\|32k5oZ&K}oc쒰ʲB]U&#3Lմ+q#z޾c= Bgː񊯩*-W+xrQ$PQrGF=__[ۺ#2928){o2dNi4-λ&xLa4[@Z\,yH$)i`r}Eᯉv> 3Z}WėZY&Wq$HۓeIĮr6I*tN 9G 7<1jеM;Nᱚ_l܌bQ\{ÏZ.y{ uC7aso/p yy0?ϭW9sBV@|5u_6;Z;4vsM,y+*@1O-wk 6mr`w#ἢIp-@pN{gZ?\5GsH>iI@av6F+pW9Q]υpkRQk!{:kh%ʍBJO@kjqJ-FA}Oh&|<4_ j:m5ZtzaQ$WZ()742/ॅ٦wyXoIzZ;7_5K85*suWS  $uմ[K(AM0mI1ng;yCGZx p5ln9>B𿆴;> ԧu;}CuCs鮛 _4OcϠ~jw4H6gבD2pCy-ٵW\ g<}?J p;r(/|[±ErھmM"ì<6x$1W/|+?6ϩj:[hc/u3^kzݔW6sn+V' GO;^9] 񆱫iw~a/TI͸*󁼏澸[P O"j-B9 09ۯ$;|cx[uKHBʊ88#jvH `N*P( |]CNe}:K=~?ޞ{{n5ҹݘr8>/>оKjڵ58\M %BwD@_uFFcSY^tjP#.'UKS=ҼY?!^e#*Gz7yIUxM}a=_EVp3̀ ֟ +xo΃>᛹.ny%"hXQortUnF~XgM;Ӽ]|cxe:`-GfW2+M3|ZzJj\yc CA]bqSӴ 'Knh4h+T8*†ldTCn`_5{fM;qCu/xT _rodp90> >Mog6,|" ee3Əz(['=k'ĺ=bJץ?mPmG=݈;舍XZ,b3&+ݶyV^DoHtBTLQp#>Ž;H [kOOPWA![yI<%RjZGev' |pu?64a<ek-DK*ot洺d#x)9~5g| 6dm#T=6I{rwR3׌l4:MaNH'&r g ϟUG%uWݬ x6 ȓpn}jO?km&Oך!{MS4t;vuxO/V9#0kό6<)}oyq"!0,gi k1$Jv c]:ZY 4NJ>.ωVo2yn8+H29i ˂Iۑd.V#ߍoRFCt ,$d>]͞OS][6Mmnt/|[IfD=^xI|OWb-STYt0z|uXxnK|JZa7H y8#_s~<-W,9IEGe@Xp:w^RM?u⛉ٴKO A.=Ƨ+b#A_ur $:sL8V~EkKK~_<l+)т[?6 gjxo^5ZTvppPD ļ/ xCu\xO"_OrB[vDpw` wzvAko[B4%ڪ`; émoK}~_՚H di]xwG;eֽ,HOº^}a}i]i0n`8ȫ/I{Z*Ebxǚ?mJ[jKehKyH^:p&c9rcҤw @^(`8UyoR6`zZj^nr1ӿ׊Z$F@J `JytQY=)*e;HPԿizުOc4oA}>pnavWlќ:p3T~#Yi黏Of`Z%GkEAGs&dBF2d~ ԔQ@Q@Q@ :Dt5w!;/є{8#Mzz(=,PnճRI/Cznk7KׄyU쏜1}[['gY`*ןU?-~xVBoXǯY7[Y؉ 9'<_kXִO4 KHjOp^ 8}h~?ƅ,wk,I R'QB3O}{H5Gc'~09P7sW^OWGV2ܘʼn pP^[;X7I&ɫm$O-#ܓfbbP c~GRH^t#I\?x~{EyfԮ'"AbvŒvG|/ھ |{{+h[]i(~RX:W5RxFC:ج=^emP&Z bG= tA;{I] >i$BL IkoNLj-!>5[٭Dʟhi̞Z$gpPpkg=}m&8&b|+ĿXC֟loBDǖw>@Q|8uˍME[-2<( ysbkˏi~*gv/qGk  n<jXpӵJ[&🇿kV}$QM϶NOK&9uIuH.pOn|҈3o^,>*񟇣ҧM[P&,bM*8:;HPcjq-A)h 2W*01S_U4i+dfr1͌ =4'6|B} ZKોG5b+;4w%o|3c³KL*8|~g|O_iZڬ/mh-W7M3cjB_dj <kpN״jArc7lF&Ȗ[O$Qn3)cZ_PPֵ m4x.b"`8z;} Hx?O/|'mg&n3Ee1|fyl;gb#%W3_~>]?Sl4KskgwvS!XeEIhm-<(rGs\]A B8.uiL2dib8 \!RbPo>"l\ g8.CںG%m1&Dx-=؈q}YO-ʊ{}C+ϷoN.7Gk?|{֍ۙరN\"C2szSz@=G汵~(ںU4륻3( H0[\c<{݉Gğuݭ5ͮ I-Z`D(xm=vv'dITCZfXE02{ g?[VRQ|eUKld{п~(xū.ak3G+l6~V^8wt-Ogm7kztZL%`#L_,Ҩxj[Y^9Ro0&Lu;{+i *ȋ ۛBm[Y+mB{/^mC.q4![ n5 u!'G3r3PQs^GoK/jKRFmyCQ~P~QןŰ4K [n쎙~"|K;{k."IR٥Ln*OS]d)լeLN/ˁ28Ti n~pZYp9vmN u2fiM9 Fү}6Mn;<`W =)-'}hhHAtt?fM GY%{` n"xkKmTKeX7U׼-C}6SҮY]F)@ @kHa8$qTT['%S(((Qߴ?ߛFW#h 7 ;AwG 7(YU3G;.^m.x %174l|@ c~pZkit2=jc7?;×:~: s;01*_G/~?$R ~}''5`o:(`I W|>YuJ&qu}5ϒ?0JSܞ#~ :ƩdmTiEy"6n0k|!y{Ē|Cb~%xf8#!^n_|-Yx5m0iX0 ˗*$&E:?BRD! TecU|pwWkV6QB7mXg![0Ѝ^G^5P4镲Sӫjqx'N:|E-=`wU2!ghMA_s+tW!'f,uMBmRiyH*8*mϟ_Ct\iWjgt3t4@€1]VO ^~:دlPGuu" bd_^kK4K'ߡG%Ӵ[<:|l7rQ'<QxL[K=Wi5vM{H, c+ h_k׾"K n,dLzܳ\ȞlH2 >TSܸyI:y}}k+X|ˮ|9|,եO٩?wn; n_Siki92Oizz[Gߴvgw*Ym]>OIgq<yfg1;Y7Mx\^vuIt_h:ow:Ʒ&)ʀc>M}G/&\MBEGjְK y$Ԍ ]:Ck`Qci:+x|^$-Xܴ%a@FSڽͷ)9'ָZxBoIu,QëB/c Օc9aoj7Nsok4c—7O#2% x* |n׆uoۙ^=Jki!RpCgGZA$E3i} K=7q>]C i K:WZ~|ڙ+h }pFA_ҬQt񯎴/f#ֵ+2)ly~Xs_qZX凷 (Î*I-f4PP*? J3IkB+%y[}12-2mwn;^"tOV+{|+/XSԮ341;VrO$W^GH$ c!RB jKig,KA$i8(a~|?m{-i+`֫$;&ȇ WHfd6}k^ Vtzm}t"X%PBr2kvd%`pzc_?jg SL{^ۈd>$W&u$ -ݥ BDeaO9=}t)IeJFm,1nѧ"6@GX|ƾ!5/z5 6{TEco.tmGm3!%dYXr(ݜ9'Rо;oi7΍lYNs~] Q RF ۽,c{x{l('=yr/bO.ykk>׫#tq(q׌t\#RWwk\X4Ѓ2@]ê3_XQ m1GPKAj 4x6~<Ɂ__|My/Vn$T?̐&7 ^о_Hе RRH..dwҷ,wD=M}GL^n":mԖ+eIc84υG͖kol/O [>\K`D'K/߂:OsEω.ՙ6-FG-{|I|?6{.a+pEQx^_6$,RqHҧu~RK,wlpB} z mc=i*8cepC(#9 (M|]CY7{W_qYVKK綞Q`v:"=kiq$.arG8hRS[O^W1 ~%ǝ3汭\%}6 e"+^d3׎㣸xW⏀qj768;FlhӐѨl 0=Q|;״]gNJOxIկ\̖Ze|Ԝ`W+Yan'ٓqOx\@{D$Dn듦ikI H%'TA9#G~#5kGlxXKh0L ǜrH9浶Tdx0#0}ƏKt.e!.<C+Vi>c-ONcg)hb]:1f]%BnY`>8ݎ;.U&z9T~tQM RZѭ}B8&/!OTF5"_Ow+$"LQnıCJIWfm>Y V|SҢÚMѸm2-1г6O;QVG>!"Gu7UaXF[;`k?jO힕?PxX7U}L ^p;a_h^[+[vt+uGJMO:ߊol/u*ح%rnClz6ϔc{/t.a5eVcg!KHT7V1H񵷈AhFkI,n.f!6:0I߈5oiCMdA}p-,0D$" jsFskm? BgL#>":oOxW&~ ,Iy${8<{:)crǀt?CwyXH˱Gckۄ#Ҩ:}Gº o&+K"aʳ`/>r+Ă=$մ ZJWnyrvO9_vjڎ|ZC}Yyl/$OU˝M(水,H'AVvw>,^zg$7so}q$& BHo>(V;+6[XV}LLNXjA4O 92v烏jE|?ZK+{:[#$ǯZ||S1T}sw(;e~RM_C俊%džCZZC6yln$c8䕹c/5?z2.A$0K*`; W9#BVK:dvې2oxSkk8#+HRd>f' fko<9}6oMm̲\0ocUsߎ:+R\\kͦZx|{b]>Wivigf[Tc zimRY[dmmS1:ԫ!a[8k85+LROyoqdQy5ir㩯,obԴ."1*8###\  jT7:bOQ"687>z֎ ×V֧7٬ n$ ^,y풗)wOFC/#*Nk+ gϫk_}OR^ЙLdirYw8'% XU,[& N*n!Me9iE"G)-Ū?eԶ7RpÙ#2*&A=ke 5ukoSALyX*qɯmkhM(1*i60GProUXv> 89i8#/xVo}R3x[ṰY[v~# /֭x—~(' yVkkXeNUѹVƭv^99%(kg Ǎ{w?jd?duŸ2ZTC'S\$,w ᗍIox]_ZOk6ݮ,cYG;~~,D7W ˨ P]rx8ʧJb-+NXH-qF+ܼpy+>/ ׋r&br'SO/ꗾ< mƑ%?/1z,(h_+=X m G99>|%]9nWH2\>3,'lXh5'/[h^3 ZʹV tce+@Z k_u uYILa,=to >,Şcq+4jMU 4+(|fq ST$ {ZhV%3~ͷl FAri⏍w#:2O I{",gdp'(W?O4zd&wPgϭfxst__nļKY| (ŒZg?OmzPYj~K$ԮI HO,*I xI>5j{x+Mlntm>3Hc{_\^xSF.MeurWaktv*;dڛ}隼:C Ap> ;OIw{3<<]#!}6fN.3&NA1} .ƖEqvֱ<~I%pO9< es eo*]E':WC . 厞/R&d@J:zkɟ'gʼnYNkk=yB)Zv&xTѴ{7ĝ-E'/mmcD|^ipaw-.>\ W.]-gs2hq#RɧXx]O.VȜen|ƶhj>([=^j_ҹwr|XY><okX|m}[j-\7]UŸ j-DPkX܅dX6|9O˧p%lR>SOK Ŝσ~2ZxO/k^gx-,cWr]`򓵺X# ;^ o4/^6CZ<݃ NpzWx0cZN).~վГk]N- Pn9S,1V>8i[_?h% FhMe{ز${|ChZ}Ңn˜@ 9>f4[Y45mntIcqBGj؝^ž1Uui?f|EFS,@ Gek/*?*%p08+ ?-7L4nm4ص{p6FǒB8'8Qlvir}ܓfⷼAswHH)"VAU -3@V0hRh7n`FOJSPd_ tKqSx++'Vkɭm)>QIcFk~X|l]4KRno/)Gn^8 O}5|?.z= Dd `r;Vs`㉯庺3]+{U\V>e37sg-cJtpK` n 5^lg#~v#|u~:jj VIcݎL-rH_?dc~"Mv[K!]gHѶ ޞPٹJ "0}| B[+Ordtp ^tֆh<,L'ŐۜcwfŃ}LG67QQT#Ey ~5㛻+ylH-&|@9H/ۭg/??U%tV>A){\񎠗xj:mLm-.!OMӭFIRM<_g?kߩԆ7Nm7&eoguJi2a2ֽ.VT9ѕ=EK_R`9Ш0ߟ}* > ՏMq_k_|Snu_kmf&`$60n{? y nu⛙mH5Vđy BFwg$u|aQWſfm)md%CQPAw'5?fݻgMY߿B Ÿ1{K(v$Y_p>y5{Ɵ ~ _Ulj/7L^H~G `b{Zsm|F>:@GGٯ#9[V22u_ خ/1PLy5!չ }SR//쪮3~#O>)k~-<2/tXtu"Qp|N5○ ּcwcA!}ħoι {Ѷnqt#=^ԾEE[#|P~K&]\j76ڋ Ј6j06A ڵ|a+-mKӴkgm.ZqYn%Pp{bMD?!#kg?U5 |>ӯQq2 &u5ʐ)-9qju^,4 85䬒ϷS /I{Ȳ #zFj3-}Qhr ~~x"׵X|I.BH]W$Z?T›{/cN}2=?UIG|&>:x^On4{Yæ ,w11!Sؐ{U/|+ui֚KMwtόԶ; so|Û sR [\X=Ե*>)|kx;J&5jsjQjO \[)p&?{y]w~xxsIum ;], BvRO;W[}9Rso#UvJV|VԼ ~. -SOoC7k ?߃P#NkuF늹qV.nMnid3(8p+}w`0tꄚTpeŚ)UVXU}rI+U(?LoM`<*cC:04UڸEuyZGgvrn${gc_Ts:5+-f U}̲d䁎1Euv(in#1-E' Z(0( Z(0( Z(0( Z(0( Z(0(t=i0)hL 0)h(ZL Z(0( Z(vйss7q{_KӞP$X'$)`?\v5b~ߎ|=|z֠׼!l4m!Lc V.dFALs>k&?-#T/֥wڴGV{y-(4ݞMe9Jyfk~:Z64XMMn"Ieԓ?t>c4pxs]bo[ܮqwCsnH%9/ٵ &'t5-[]FDid|nf oRHoK :ݽe|=q+}= !+!Onk~(Ox(ԡ ޏ6ڗkrBr0T݄ƣf}An?'ק>FUgrD+|-ߎ<21?V<:L;q2rsӚ&6K=u$q4FLcsyK@+JkOU*}ܶ;O֤ec"m^dCfw?$.zW?FO›/RY]Mg< خ7؀kfRǞ5om=-H煢Mc̒3c=Z}1\Ku=ߗB;I8h,>Z(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPM^ү"@K<,\WiUNJEЃ[N=P#*g?7SO O%;?("Mߍl 1 2 3 0 8 0 635 979 1 2 2 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((Bi" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?@U@pKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW;O]^Υ H pXWE^Y\ ܷ1i^`64m3vQƮ8#UD,VK[7&hGN5JY0oAwMǗ٤ho{sWMSM>Wm] n9\g@Ex-u~_o+j [zjE:l7IJ7bǮF=i:<f'޼[66CojK[ºLdNx,8k uH5D:סnwۓ#^ֵ5H..,r7ԩ# f]GҦ!-,=2OfŞ2MDi#"r*Tr\GBT^w{J A!1{;-KN;kXר4 sMΑy!LЃ?Z(Gu }w9XU  m(Oq@\8ݾ.F0 R`t>-#Y.2m>])Ó;G}#RRÏ21 W=9 Ej^xKFwtiA3)+tK]twۡG>Vc>$j}xgD]b05 T7qm-P\e=ik/9+U-^[:3`Ht m.dp1")MµtH;4苫ɩbY$VR|g}Z=;WF_pH5JմMKiqj-XżJg1ހ:|ibԣk6mkc F2#hkqp1= 2y?:]wē~ e p&A mRZ/웨oIJ,"(&u]Vai7S c'Ջo77+of`>.rz4}Tf.u,ʬrV+?jk#m`#Kfyf]Om-#K?hl~zӼIkZc[q4#}kƕ挒e]bX$܆|4GDBOLGV񆟧kh UwKH %'2C%ޠ P;7sɤGM[>y{lmm\ ivn9PP9U-:P<;wr~︮),4J`lL"dZ-zmol.v[4H 9{WL-^>kc~"^71?{$L$uPF}(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWBx{ZG4'QTWBx{ZG4'QTWBx{ZG4'QTWBx{ZG4'QTWBx{ZG4'QTWBx{ZG4'QTWBx{ZG4'QTWBx{ZG4'QTVF.YjVДF df5 AT'P*W?GW?@?o_=.ˌ![Z=jEVy֣Z,Uk}y֠ 4Uo=j<k}[Z=jEVy֣Z,Uk}y֠ 4Uo=j<k}[Z=jEVy֣Z,_O/~WoٜϦi|k}y֠ ~ﯣҬg'gv:˪iWC\БV|k}y֠ >.toni:|fZNkW_7~U=j<k}hzRGwi֫D@pqYEb,5 刂qc{5y<PU7uc1,p*PqV@U:iv+Mȁ|sVk}y֠ ؚ_l2\GX,156iVL"8#y<Q_@k? ~=GbT_zy֣Z2/xwS{CDn_K, RE[Ӵ=/M[i||Q;E=*Ϟ{5R@/eMKXg" I'k;y&wd)T{5y<P} Fw.su#19mEs:I* ~'{5y<Pt>NIRuC4$ V8p94裼Hm/Xʈ&$`֦y֣Z2!۸4O.x9dt=4.!6T1@|k}y֠m4}6Ok ]>&5ps* Eh:Fd:Nedd<Q_@>7_i:guݻ9q5goq{ )ypM2 Q_Gg'|>Dv->+b/&UIf Sk}y֠ m}.ɭd4*U?F:u 蚕\:Fup ${Z=jwP[#OqF~:rGnկUk}y֠ 4Uo=j<k}[Z=jEVy֣Z,Uk}y֠ 4Uo=j<k}[Z=jEVy֣Z,Uk}y֠ 4Uo=j<k}[Z=jEVy֣Z,Uk}y֠ 4Uo=j<k}[Z=jEVy֣Z> 8Av?et7 ik *pbk CoD&5H,m(嘐RB OoJIFݻV鑮6#LqP }geMI32GxuQ@Q@Q@Q@h6}@OkO VqbmLJ[rK5IRxRe W*YHȞ[Ҵ:QԵgHk#DK3awqTλsk}}WNy"hPP#;՝wFt$IcYO.BGLT }wQKRd&y0`$ ;UiG~&}yz%2Y-m*%w~ڄF#%@kt:g-䷲̒H!([*{FX@!T<;sIm|a,͆dZConO!Yc¼BiMk3}w^i~U`=Z]W;ҝR]{ ťBFB0T#4]Rֵm:@JmEQ($$ctɉoccڄ%vU( Elc{v t .Krx`/}NW;]\[GӞ5 k 3V~dgӽM7>//5\_pKJ<.`4KY!Xݷ8~BԳxQe#{R@nrwgu iFhdfE\W-;?EsX@𾓠+sWF*UnDxgt3#,d J@Q@Q@Q@MC=^yzn$?kWS@QE0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1RsÖXwap^ZK/$/Ee[{Ļ{ۚxp3|_yo'\Y DYsqOl3t"0rR\* iqEik{n-W7Ȇ&u19 d{*- UU{v|YyQk.!ɊH2&09 tzfn7NIDHbjִX ҷR" "O{*od&me-B@U9nk,RyưDࣖǹh`z((_!{_Q,SOνWU+5F'QUqZ@X Pj\CB K~Wlxǥr=L}= FPfcƥN6=|Jlg(8ms|ue mo$rcs|Ig%c^zj6L.zg[kI$FA?c^gO  m2֌|Eӝ?Z[ Eӳ1>#08|E_kXfs? o"P:Ӹ]~%?@y Rlwg@SƼҒΏMCB?7kOZiqB2@o%,O+WMo!>QW`z~ʑ](?Һ9xɒ?)j}v2d>hI*d9R@@Z#)t99e[CeUNJcNAZQmFh,pDLꑨ3*k%Zɽ˓# ~#>rYد[[knom[p8z=KAk_j/?~5y$H5iuc OօCjgV)maCE{*Ȭ1CW^O=į"FZy(qAzu cS 1JBO\v&-O$'*zrIzEۍ#η#{(AzLuٳ$q'jp .ٵck~,/l7H-NU~Ɨ!Hvm,~@G&Ԣum^"I@9mG[C^X`{H1*tZi rb7¸5/iVZHK%53cjat.Cc=݁t; ?V&uel*I/cx$fD `>.)ծc[앉B{\?VwI-,+I,7)wj@]NkiXRכkDBl#[L|w+~@1Auƣؾ~XӢvLs@~[j +Z9uC|aQZ8h*sҒMa"pq*kk+F_Eukwmoa*#3I9&Cjmy5VY˔m#ku=kHΒVe?Aqݫ귱Gz)& B^6x8큚{}[Fc^eYb9ٮŗL%Mlhp~bjW;pz: ֓$!ȯ8KftlR^nQ=J!j3wwmԋqpczSp3ݽ7p=gtj^+lWMg[=>Ief${&6Ky[⹱W²o Pze}$guO!rt=rZbe=ɴ$7Oc|H#1ܩftXS޻1DqBB4O`: /Ǫ-zn“$`rci64,gX#߫x%`I? iL>r:zOДOp37ʤ\p*nU//GM6r<\jx_|xMM= @Yu cd W1-ϞٲpEn-kc_+RF"E#' [$:*nHefb)HQo-jo|4bI3ޱp>8}&;ʺkaw(j-u{)m/-${98:$ftT2jLR@ކ,b.4λLdE+JWޘQY-2G߂jEW'j+QB[8Qs:FIŠLp:EUxEtׁNN+2eBM3D5 )ԕmwr&NAm8鷊tPMȿ#t=ݙ""c{N3\WK)+kmBtc+jm8yqTܫ"Vu zy4מb,jñ`+εm/.蚚ILxz =7,; ;eG9F}:Rj ECy{kc{ˈBpF <4j[vف.ь@ힵ/~C<Ѭ2aduz; jtv2w$sb@w8W+̴$uD4*{ cWeX]I814נ=F`>4rlQ0;Xu޹^\Zg"\ik4g qluo^)ͩ ]i(̫NM-yMΣA5m5?(ʭ&N9#<U_SV(5D#3K.ɀw'()XPDZ\խR]*ѼV̲\3}r z)uV YCM+0U%w&Q>3n,/!o纃BwWLyuNR{ԷItePCE;Ztʕ1ӎqZxt4\j$q*Ly辔 @\yM73?x?NsRJIo.Y[/B0~bޟ Pz$c2:c%_!tfoU, n뻾? ?fM"$>jG"w}CdSϽS4o!H%=O'4kF5Y D!@`sY:>9ojah>˓wv>zMD ;'xO~"ZDm Ľ1znl T;ˌϡCycB)=8>)j%VɰEq؟ƻ0ڒ^f(3k<;?'`^X`\mI7Unu}BM>m6YOkb E:&LHz [-bM׮gР2ɉe2o^xv#LJ-M2+t {YpbOPKҵu# xx~8"CBgR%\$qixi9X!O"~o7;71xP)8 _&]B6ɅoS|/Ť #ETz-:{/HQvگ]Am.uc"4jb7 :I9e:qlcERBj=| mExnm,-XzUKwjzݭᐌ&< d㌞Vm$6QE1Q@MC=^x>]Vr@}5_!{_ XVø]Dv\V5xy9F l kƻƝnqU=c16F )6|Vw7:׶ϲyz^.^X׊ɯ\"ĚG&64{Nv?ʺHhm,(? ۧH[7zF2},ľO;`?kJ.14-Tm'`1UyrRp8,cLA?VX`df^ѸB1=1J9˘ǖ]C\/ĸ|%vcb9ہ'9k񕌷x$4"|@,Z`C8 E~][ssɝKB'8,G1Gg9Ƶ?8n+6աw1sz[d]\䚬uM+˙6i9j[0 n|/V}AqE?IY}gx[6#LӒ`/IǾ𯆥1$m|SoV>^vԓh*N؁_Wq9KFsb)jC +qe46IakB1]x>}kud{ 2SA s n`2Ԥy6^yVyx\وb@_ng]ʒ1@VsR[Zo# ]܌cnHxgm.;CS('.3p[-;Ti,&h}Y>=lIlLc%[~]7Sl%JnZ=T=N8Z{]흌"[8qb3A]C%ւChg&+C| cvќ~s^6Zt=Ie0r:=EA~'zDr0#*GzmCC4%)4ø25-qً|4""Df!1x+;K4JY"aeF2=yqQ\MkWƑ9 \Ms}gMk㰳6c::\1T5]_MLf8YAI@3Ѯ[V6\ƌ{-{{Pдqw@r{@WaAǥ4Pf4ϱ~@qf%ޭ<:U֟{42Gk1-~0= ) ,܀qJ8B[y4Sp6B*,K7^q]j4%E?0և-wJx.ia@u ЗNsW-ڢ\E}agS ;8zU i uknC8ۑmCsf8<(3ȫZnj$SC6*{dҢu=bI._ídm5֑w߶vP.vP[&X؜:Q꺕*®Cl$5K=ʺ>k+ޝx-;I78=EMjh]YVqhVX 8m}x"&qxQ\NQcXd#SR:m734Ӳ햆>OKK}ݾGPhƟu54}Bw$T>t-':]Aq$hPW֊69dB}H@QK* )(n1}qO$#m\ihШRTvTt-6w9",=-Uo7ʏl\( )(QAE U (g8E4QxJuPEPχuD֒0i f :0#ñj<1됼V=Hvƒj@n5 ^Jj6F' "1*r1©k.6~{_(@dw!젞OsQ¼Wipp3T4JQ!%QE.ٳqٜ(((oU+D߫M9ҽU+^7ˇwN*gWaѫ?08kƻ! ҶPl O ?c.Aϯc,UyN#P>%ٯ\~wy? ,xXR}\ml~l'3g=҅A "AY1PX-Z,gң#5$aMά]?=2jV;vc#~_(f`q*m0̒$vIMknKnrv@OCO Ddٶ-RH4sW\c*#W^iozmLc ?º /Rz$1lqRƎ3ڽі&2o9uMq ƵTLO?s7%R5V`BڄŤ6vn@ fӘ+|8X\Hdga# G(ܯ]L8< @mY]32T ⺏-,w pkΟ8Nx{WD0dr܁x7Fef.voֱRZz<6:ˡ4|c 85k(ZEb֦#G zqQrlCp/ rH^ip+eW^ N?hc[yrf#Ut;xZZ%A^ǩ\Gz@)"';PmOg$m=-ĿupqOΔL. AҀ8ӤfwIA׃^&?мU}xLOBx'v<׽hl_?~ AooWE#p hǜmkqǷu+H95sL*srO)!wɞ)@Vf weaZ^1F`SwVKqڅln/fHa2xIA'88=/spٽ.-g˝F>i:֤-淏41脞 d߈4DoE<$_QO4ٚSy ֹ;·fyle6pG9WHtrI$6R[JPnE6#yuQ!uFR26ҫXjK :cXw`9ζ[/#g## =i]hz#]|Y@#p ִ綂.hgE E&dbTB$~hZ`!B>#8H?<ޛ ^_p8 qߚŖ..VdF%̨yjoRHey!Ԍ51[pzkRE ZWV=wq0x:|6e&Qw>IqfʷGp_ج,|,pޝ6ۭ2$^|,~=Nj4kVmK26dp) #PjZqrvdVeFfڽ~e8z"! =k J񁈐'?ʋ[J('(I +te+T2{sͪf+\u~]˝ɰc+7Y#WC`uGk E }  (Š((((((((((((1n$&hMʝT2]wºkGrzފ4;hz}ds7EYpv|>ȫZ64k۹.p:$m`8EPA%4K|S8*/-"UQW jWE.2pX?%w]ZGk6,Qw(m!Fz@L񏅭[ 9噋/[M3hԓIKRW n$;+[ҵ6p~ڏqp4z A?\֦-[M^&Hˀ*~nÊ_3oE-e̫6ፅ?\A.DR1}+.,.ISkSϖ`ї݇<{g{omI4reҍeLi H=GT)j},f6w\uǽuڤۚ+}creU0yTYiPIXķ]S q?7⹷_ V#t?\h~S79ԱMǁ|J·pd$dtQZ0bR(g6ЩH :c]+bAc#4 @:~55$d'*ƋۺbOj0:ӵ0 2N3ՐQ6e>D.;"%b`o8@ [ޫ0$1œuɩ/Krr8(^dx}eGowO;-aRօ"H Hŏ^w>=H$g¬]H}Jbg9ϡ>"6)}l<Ԍ[+xQo*<5\%bV3:AB,y+-SIJGt-v`ߑ@:;fR9#q?J2#VM5Xko!,fN9VRQ+sBacGž|0Ƽ,Oo'/XAQz`CcB6>m_Q^\\5! fqN2=O zv! 5:ۜ֗3sjZyQܓ_jM|%e<(Qn^1Inc5'{{dT21>pL r2NOL4t [탟a\鲷2ADdurW#lUOq>.Aq :hx{QvVo#0rr3 yRl_S*ďtsLv]o:[h2 ֯xF[ "8YHw`YxJ'JVS%21<%]ѳ*\;ż3߶)ŶM+͌~O<}50q:9UOnfdh̩R0G+-08#P:\(#.dbo!k[eQԚvlaИ~W?>++E aև ̡a;RigPz8mhg sn#vyKih- Ď[T U!imjW -xa Vx4>,m*}Bh&%ND.YTƭ$l)>fskvҮپ/ xǗJh[P((((((((((((k+\xL-SJo-̬۔`xJ*@??0kEխ*6]ë.RXxcRΒ~tQU袀 ( ( ( ( (>{ =RON^ WH@5ٵw;buv.|szRpeulؚZ@*QZ="<)J!1#zJ/UcfCN*?H?>FGN0kFܡK`Ȳ,NG\V-+g掅ٞ8UT:ǜzԚDmU';cn\cqӽkk`>j+P=@ M I'֙E Z<ۈo)eA?^K=R]W HE=q^0P HXHZL6K&ǁ%<`&C 9 WjZ]WKC`2s+ưZ֖b@',@i7`J+4$|Vm#d 56d<Mtv:M1hNckzlE<ˠ8Wj ٥*~~Ml! vWQj6K/y߂=j|Um|Mv's+=O8W?7|Yh`>rOD![Yº '/0B: ̷1_+Jrv(ƷWI7^?H<ϙ:`'~Mw? (;@ʿ4(kh|&r#*>bqwVW@ꊹyڛwA8یq 69dmIW ʧzWa>׺xHzSku?K$dyGPp~o\v+Ct kۋ++g6+Nr*MwW46+vM BNsZ:g-`w:z_ f4M=wn¶$̱]6e]MK!sB1ɥ# T3=~lm٭{Cr J|B0A"y"G{=ؑp3z;62@PyY, BF:*h|Az6t(\p퍣=I5xLkm13 w.12Z.Pʶ]Pts_a7u -[`boL͑Azq[6u(ka/́cӯ5cNX[*#+<w֛oizmջDS__x;G>LK*֣v];Bfg]ǨZܚ "/ekyf*mU̹=S?B<+>v*~>OnP ӭG~foZkEous,ks+t9嶃dyvsO?6MN.8_>LJ<~ߗo_Iic<{*4u^ 6\& #9"ckP]BS%oYڝh2H^ù|NoxcXl+qW$UZ8qx;RhRW# |CѲ9s"72)R@\*O)w¶v٫ʳʩ~:U-k͂p20z$S9-Kq,JT:Tf Һ+˧E..#,1].FNHHT)"+dU:[cPKc:{ۡ_iY-)RH8!GǧJV#uyXH u F=]vFAЎT R* a۫4E S. xoIV"rw{~[][[Mk;Q)3 -sB4 ` Ңt6̋0:]áǦZ$WW[fIn=jMFmKYec2:FDzK;vC,qezHjd|VF8EQfwz:djƟkpHZlp+Q'wWVF,0H QT.u{[k״Ll Vmg9>ڥ, >@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@cW=ZE#dSʺø>B;ӤxoY du6dF#v\5&"e)kjuk(ph.ڍݺ_䙙G"( Ă3f`TPMB;3isjj7**%`#'UZ(ܺ?iK|֙cyBDPrcڡ,,$#rXmPEPz׽_>JW*|_AjC=^|Y .THsy|*-$K.yj# &yTd]crAFSX9D*ыdx{fA7,9u(Z=TCn?AH,[Yf+p>QMlr UN3*kfӭe8X995#yPzStW3A!# @泯 ٵdU,p:X ۋXՈ ,s*6t2sxj8m #*c=[WMs\-ܓ[MӸڱ5六\."Tdzc~h(1*犵m7A6ܕ>&Y\$b0Hb2f >e-_̔r0z֪|(COdRvHU?u&$p1%+'w& SBgYv14U< })1ͦnDd#6vkUFVRB(~4%zqNsѦ:BԷ ʟsg9?Ω\xKBS6(H~-`\1H]ޤGhڒ/S!CgG#qP daOjgg$=.A+ߥb]ռ B>SgIY 7p+~GG`Gp8`o?e6I]C\'#'Zb%>$Td#!5 |аhvkg6A$'k8U-j\B8JcJ?*}*F@T3OԄq9V5r7 j''OA>où;s͆s!+žTP-2 C666b(gnUb;>{O8atKXK+KRK';r:+k_q' .sFSR~ҮlݻoZ9J& $W9ǶxF8ȴtDMgr嬛+±$zfu;yѕnmdLgS:צvb1s#q"n p uw]xTk-ŅygFM8%l2z諸?.zm/Ɵ۵Ib6e<$E_J{)c6WKFdDLq * (1o \lmTo>^޹aX6lm${R",j*`Pk[kO=YmPV$=;ԺF~A뚫<=V5jQ jLONw\}i18.qqߚfӦ(MOaTl qf\|>Y>g)%Ww< yptF;B+~ҎFȎFz#Al, N<͠}隌 hm1grQLB.[FBHihyh$3\ՉCXOb@,O(n+Z1!²| 4m29T=D=.ß,?0HR*$ԥ%c*'=N*e1A )[vU$\ȋje%>ݩ+s,lXJ.- AI׵hIF ~ACF'Sʁ-1.t,7{h Ŵ wa\=>$bĖh=+R;0n_ E,J=;N&'[dEQ-p6^ ~,.w*]FH /u!|َ qWϾ$zXnj?ثs8oz֞Oɒ& ׿X;Qtnd#Y_RV6sHDRI%rq*C*\@J'*[ H'r ʸ#Z3g%[KbX%HǮjσ%})c%T9I})Mw3p^ũ2Iǥi\F}Z]"XcI ) gҲωoXXASJ,( h(^^Ԧo9cp?^A&;{7Q7m P63[mOVԢEdNA>€:+Ҽhn۬/2D /Ox6UkFrI[= ^S)&PX=뤦ER(((((((((((((((((((((kRxM2j6y[3{fz/diqc9TL+s}WJǗy?igosTPZ~&uXX e5Et>&rUqH$V9(UռGmehym(r7`f(eս}T-Qa8 yEw=r$A( pG\5rQV0HTy5N(((WH@5ę됇 u=x^$?kW^ m]] =7ڹ'8"}i6}!O2A- 7G45@RF)ޜz]tM-m^FƼELzđ!)*3JԲt#<&B]j(IF!H%<6 o,1}JkjFsv;c?Wѧn< `]Hesv>mQYٛ#a:"3#,#qeӌ4IO/vTŐȅLHHւe:lRI) g=jPC2A1P0 3m<IJ("E[I VPГ'v q*HdLlP :–vׯ56 IϮi Y=FEu>fcծV凑)8⺟Iw vǍL[)rdck3Jř" SaIjqDPI9*M_m6&I[xb{Ͳ:01vpdz ᫇􌅒fj;4Qsa*zdƠpOɸfL3+qu6p'Kvv33Ӹ4eY91\]A_S-t.r]1?zRh>ѳtXO8JY--@bJw ?F4ikxF}4R%ӘOSg)\,917lLB쭤~gZ0K&k<Q؅9>/m7 XC&&&L|{?*#r[qfS&2zu5˴  9Cpi#QqժƁ'RVO0bvې*օ3W5{xc:ϐE @ҹ?]EϪyt&껔xk9[?Dد$up93vFַO$2eрY0y5_OвUԪ"wvp + _–B}\-yh@4|u ``k>{lLIfܻ 9f< ()#^ES Z[F We=#Vq][j*."ia_{EZ(WH@). '{ \i?n(۸Q"{)hv <N*ď6S8C$6Aðn&|xsYJi&iLr$~?{|YOƼ'J+Ss2kbX81˅I$r51 /rsY`nsIltIɩe]IJAU)l!H?t1K¶}:ܲϘ~L`H 'h sדUod7RL%V*rGoj(1DUxH I! Z[ȮYRܕ$'5_A(;#(9=>3I,c*@^32$gu쏥lR0*ݹ;#>;v8,9_w@JIU9'5#'N] _AHass[R oձӠ=T-fXahm==jTx#wO:SPn8cIe’:R ww(i*~b˛BV`ƻm2t˓=RfnˢHr*u/הeqmZ_fFfPmSOұԳRD|;K Bx) c#I'G8w}%ܼhb1 Ǽe ÙnIpzk9ce@ 4A1ZCq3J(I ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<ƶt/ Ҵvm8NJƮNhh"]OHP 8`EHFLm$eNAV~їSny8wǓaBd ]WYl;˩Y/x@{Ft}Nh#kxWRH׭oF-[#Yw2]Kqr敋T=4Ȼ8/KvwyLF0ezgqPSDcSҦQ˼eA q֡Aiuyxٖ ub=O==k74#cGs! \9]-׎eE[$۰Y"])+BEyM[#[gQk(& :gtu⺌{ \wع_A_BC=^|<{+QP #nȁn"%־5փPG7^A|Ym+8n%_iGW VMkX%cvUy"R\owV5}kK`Sh!Apk<Է,uʧsКvc!o63#p9!r$#n?_zό4t9?ZXgoB#SbuK #IrNjfXbA1Qu'֜Qg۾"մ+]BЫʫqSks|׊ǏFFе7TH!O`k»U-D.+yp]EIgU3Š|gL+X_.`<:J*I ȯɹ[PQZ+ <>xUjZwTSy+@}]kF-Fɭ-K֋7<'o?&Xzo6ԵrWp\Wg2p|j<~tn^DdiX ' R (DJa^+uf{O/Wx Pzd#z; ȗ29g _zmhVchՔ6nWhN?g wu!ߪ\<17#S z+ʿW^"%岜<y`|./)~~^Ʃz!^ۓ1*:h╀5 ToU? S/d6s^5r9h..ixX5H{mZ9Vy03Ʈ\> ͒ o̓OnœWC^jCI>w v3BoUBw1ZfdԵ;Ytaͳ"3nM [1 q^_E[(((oU+̫u_!{_ʚ)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE4Q[j3jď j1Sڤ +<=f΅jZvZX>Mwg';=M7Ėn,5hPmUuvgî;)EAҧk}:ѢImҒqHbiho<HPGRN:UMR]7RKo+DT88 U}>[LE"0$ ujU/NRdyy#Q::(7Wkn O>Aʞ3ҫPEPz׽^e^{TQL(((((((((((((((((((((((((((((((((((((((((((((1Ĥ5 |[WX7Z+nlMh4Iyed<4߿&l"(U16 #֥ԡ[VK-()d! Zh/dxly7uI +'c秵X "KeB.0>94ǵsiI -FAH~by#nBgm1QjcQmA:`s֖<˗hLvOd7f[nQպuVЮʹx|n!2a QJa("B1"-0Tw7Q&1pHoU+̫u_!{_ʚ)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE4U.X<4b.JqV^i#mKU,T;@確 E<*rrzU$Kk9q3Co GVTKZiiu_@fS2eČ b` 'zJ*cI{cunZXY} R *IOkSaRG56].;Bc&e7ѱE*b @8s^(KYᴰӬ"{9,L>j\%on[ֶF 텯dFa3M`Q:Q@Q@MC=^yzn$?kWS@QE0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?ݏO/jX_bf/_aM+1_ښZ_K5┢ØK4i_sٿ?c?Ƽp\p_vkWi}kO9Ƽtۛǫ.+.I?1OYco" mb_n+Rdz\#UKpX*4*v(=GF8'>ǶO.qؙNDаzJЮ~L*}JI=D=:Í*h /j̀AhL`՘ p(T7V#uN@GJ~\/"o'i I|ߊzW£֟So^*#s4C/#W-sʚo(7#+tT7q5W$ woכ]D@siiad&SdcUEr>'Khbhnh\;6{hu+]AI,fHBh4=sX]:ub :UW[[[Om-m?&쨮>ŗDu/kw)B 2Z3lⷵG[Qr#A9hvv.4`,LVR~W6榟_:mֿ1IL2DJJG=kSD!r׮u An-GNY=@UKqk{{MEW,P$)ۑڳsSynv`j ҉OiU_$[E;o ɜj姄O.[Ku,`nb?8}AyΩhΒFPn'MEcoIn5UhR;'Gbc_JH}N~򦗩j0CipgۿI csUc} <bpJsrGJ)u QE0 ( (>{ {Ŋ+WH@ iLdHO)'ړ(>&j/q%鏼3Y&x\ TYg#99k#]& dC ZR;nAagҦ-9>\R6XzSfnԆLJ3LV0:iR$"˾8͹tRVPBL,qz2JuVՁ]Üפڇ'#,hym IÊ?VDRG, V9ӧɔ{WQz47 $ P]qKQw[^cY) ݒZLqnvf#MTtr \I\t4 GV3L!X߉:=Ԗg{kuRB= 6dž}yۿsT>sÞY"LXGz lJvaNOR}ЊX2-ضVS/ 7zc[y 2AE2]ݵ3$ ]z'Rr0}:m]: 68{VCmuiTt6E8h9r2rNO4idaR/n};mwq[HȻ QI/Ӯ>E 90%~^` O¹S#[mӍ9Պ8ߜgZ{٤xt]ʥ^+qS4ұelc!Nlg{U(g9fĞIV{;.--d&ic,`k:Γgu{hgk) 9⫭еo}2PkRub'|m;[jmlۋRz=ZVVrW,ي%;AщJTխIkar֗ R ]ӭ5} .Ic;~Tضc}ml^34dϵS5)tunY3OZΓף6S7Qs#KK60^$(RFAҡΙsO!Rknzs>kj%|٢Wm X5;K2KWSrMl7p>ގZYG:KE!:bO@?RfӴ)>fRnv~`X&~(3j/ELZPxmQm3Rw{е }+C[H͐aw.zd:-7 %/!ALLű72yqDǯSXzGLo/W14)l^ƓxOIdUh!c1|ȫZ=sVH[u%\猦Oҭ74Χ9Ҭll53689lgPx~ۼ Vy]h%x pؓF6t0,.'Kw UOomj66ڍ^DT:O,wRowt֨1pH O~_#ն,q! kҍ 'AҦy"q+#9ǦIZR JN|dPV5MlR+Vl8{pQ\OZXpnʼl`k*Vڥ@=vJ((((((_!{__X$?kW*4)qE*Ҧ_zd *COuTrt0'Qf() @gKL!fOyI"OA}p}*wop0IW߱Ƌs鯤s}*3=kϵ6=7S dw`WizzdH&{tf2`8(Ѷlc VJ35R1>Zcϵ[ӥ !_Zc&$RnզxC=Ώ)%^\›p8z mJ>!a7\[Eu2Aru5k'q5"DmY%ֈ8Pλ@pXߡyib#zkJTZf_+>ڴ-Rjر8sWɪL@ը i$:(\=yQ́ʬ­q40Z)j0PWMc>L隯}6GҤfqV[csLVImk v(gw# +AYclV"i8\~]W9.?T^IhfkrŭosFuw m/_kk_wV;`T3'jlK$uIWTnm{cg,HH\\5F.0v ڒv-7|-iwqu;:M<2 lΘk'8k.:+|ChQ eݞg*ڝޟkҺ[5嵜N]Ccl_0Թ̲4w{g 9n:ڵu}*SӍے?!R:\Nju+>X" 0=Zn˨VWFͷYQ!77'? '>-An.kA#zǵ +_+PInn$7#6Ow1rj3{yC%YDcz::\֗‘HJo~Q,需Atou s;,P""ihZЮ[#Q76[h4v,rB3Q{WXkv"Wh?ޔy/no'ʬ=Yj1x]ge2,~ӭXMM(crC.;A$ /Hnb-VjO op)$Dm>iGWEES=hA6FLd^k'R]J Q\ lCEs׾gcXضV BS]v$ksq7BދJܢ0[Xp$YgVc9-t--ᶞ4S+akf筼)gs r۳-#Ԗ=N ۛۻϒ0!21:ݢִXG5sB@`QPo-v[Kn4l7oEǶa[Hn.!6Fn#PA\]_HbhG [P=VG!gaP^)7V۶~NոoQ@焬3\*-Dlߵ;[hvQIEQEy>kaKx[ŀ }\*J pJL"M4S(aR{W|E@x^u,ͺ౓|`ʬ!ہɌ>>+rn2kFIwCªMjXKKd1[ {cy5G`bDmy93c ٭b67Wl?4WxU,e3зSszibLЖ5ڗ7P$-`8z>qxRӬEHɅKӷNr!Jv=2ZrY6UԐAiJyc nKYrZ41*ݳTH$|!t#G&XʰvJt7zHNj<ƈ<x 6~2Ul8*EZbrP|iXaSOƘNhEPШHWtTItǥs7ڲc1v-/!Wlڸjz}:yEFFKsH!*Et5VB.I#wi~b:};6v6i-RxZ8z}k\-?R$IYn}z>.YՏB{ae390z.s"&ɣH2~dZb=M4pu ̶2#D@,˜SSWY,dR]M8CM lH/KK&C pAEg)M#MvIkѵ}RK{P.bI#iw}?P;--,:JIk[h-ZNg۟\u[JhMGGQ20x*2hVȡ`_jp:IWtnsTu]NՊF9pWsaurdB 8!4WRѡky/yP̀qO(6;m@&x8>lfiml7`TH 'ɭ^mEǝ vA,y>똤#_*I p:RP;_iVo죏C<:>v+H"[HQl+fO)erY3MW}^f{KX&@] c^);-MѬnK;<}*Z WW 6> QnAU@n } `kOd㠢M (J~}s֫sC[i yY~m##5_0gRڱoy`cW.-CAulMR1?I;ɣ1JPnEgeoknm^A>yخ5x̮V{v1rIHLKk7 cSrG^۳>lFIm~zI co!Ak֧2&KYx$jwfHҮc\]l8ߞԀ,cC4ݿ~blGJ|b$>ٛa*\Ys\^7g.~^~Y6嵜[=dùqU4+sINz?Ҽ2^Y ӣ['gjRkXA ZK/6W{[7 bt~ڢYb~jV-wZVL%dYcRO 5gk[ıB 85((((((((((((֋ĺQqkZF u zɢi km2iL%r"8+h|W9َ<qkd`]ri(2ﴍ>e=ceձ%?b6*$ ^6hKb-p9?ƶ5B֪!c\=og5Gm tv%o7klNTs^-ajeo1}Ez>C"Z aU94" :19, \EQ y$ @MK8*u9U%8ը7*xm/\qڙ欦PK1u|@ܖrXk wW?e쁎Հ6#8lff-F"W 3\V6dNub`8ȮG27w#w3ZdBXzWyZ_㴋yҴYɯBTsg]OSuo9YXWhsqVީ>W9 CMO -60~o¹#PB,f UPO=Uz1q( F dtWSb8F()P硇' =yM>>LfGQg߆n.4k+ :S%ԨN qLPs_ʎ4'?kk[H߽bFUP[="s 7Wv,qv+`cN1P O 6~Z#oKQs\]Oz8@'ֵo%}>[D}+ɋw[I_-kx%N23C`Zn\jۅgBہ&H.-ƹU#ڼt[F:qy I6P䢓知Ogkui7miF-?J@Xav5,ҪJY\^}z:r\],:ƥ/ӌTFI&xdv#<ݩ_A;;omIøiE e]p]2((C ( ( ( ( ( ( ( ( (< =k3lb<bd~bW2$Qi} 9<3F]'!ڇ3+ƞ<[Gp!gH!i N6H =FM>x^DZVU9ᔐj;[yH-aicK3}ԚΛxLnBAFGOn|8&Zv[`|ޟ)ʼ5[LeCۺ/Egעb8,׵d0Oo^)=2o k4+]̛IGMdX=gt lbצK[Xڈ,`&MuWK[kCr۷9i7o\cn$7f0Uqּ=(`p((WH@/k&݈P=F+5_!{_w5Z2?LID̹^>\U*6Xc5ߪR@[\jOzh: C#Ю5!D%S^Apc^i-݊(Ru1j{ϑ oë?OFW5\grfV2$Fjj [UiyRe ҫmj[ဧD (#3s,~"vCSYZ8?Q*lg}O!EڠuĈ6 Rk//5kVx{աcW5es !cVido "W8ka!9eB>u; AMW5kL6l3 +۾*x4%3tIo sһ#f2g{spt:鷚|`#׽c:=<>9<њYuND4@g֮I f=r&~Ec0xXBۨ?*\mvpǽpb<{6)ǷVWM>n039jL`d{֔FPadT݂=*M8Vqfh:f9zCjgc9eAǭ_u}i#BhgU񷎦DܚPN1L``Vq K^7'Z g-㽬l` pn]7ыg$G:f,Wo݄+Z7HfwH[vNq_dơ1- ~u@˫?ZRfuQ^Py2  P?㹂:wVH eL-5MZJDmB!pj4Z;f&q!N5BJ׮/u':`=2 Φm:C=$ANq\]CHNkbxYro1]uncb@P0A4ӗ+j*qqlpvIc[>"m'.:%8=Y:InV@1Uw֥%ͧ[/ʳ(0#vzE %^rYtί3D&U=sӽs!VX]Mk0H;'8NkW@oE?mDL >~a~B>%5% 3q! @ 0ܱ 0_Sfkzfe(+);MĂ1ƫ:셢uIUbz>>*u^ ҭ^53 >rNv&oɁX1ڪh~4{vKK3nI'q9Lwm/~v d74 |Gm ^1*A䎣0E[bݥ[l9pLqִtȯœ.If{=3\ׅo&=i|Hi2n!fd^;JP nۈ-wҖtPI;(=qNlf(sb[qIHÁ+kP渟Bh";ǯҘCok} HT>M{Lk{{i'nqX̖ʓ|rzTuXk+˘& 8#PAiج7/8{~rRim]#b}kͬ:',L>NsS|w7lѱ.O;J(hݻwLE 7b Kn55QEQEQEQEQEQEQEQEQEQEQEQE @Mti:+%T)wSԁjRJ$V.hMOo DT\nj^W9{Zu*۶snz]:Y\ג[^pܻc##HRhڔNŜ +#H44Vm6{a)> $mn֊xmF{#x9N2Fk6pEڽ%Nv3O^?jI)CknSʔ)G?ך]HCcy_o]+ J?RNVoҲKk-MnbnE, U4vQT7lv+E(k#Mn~-85(:YU|*%0|N+{{G0zhr:<4FmۢΙ1mvQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE4QEHBnn~~'xv[BD{`3&; J?.on;}W(&F- #=Ok:ŅDG໎BI->P֊He0)mG{߀-v Gp2p<iq7cF[+ȩ%z|h W^a%ݶ~%ҡq Էz_3˨;鷰߼R22,pgxbW&0Α]F88SJ9j+|)h5=NXm4nʹlaps\n͎_-6op{6CESQEޫ$?kWŎP6|*cU+NGC M]X/c4{dIV ^em3|-gQMbx``Z cY/ #Kv?{ #c+KSX٢+Ke%8RrGj{^mKssfs9<֏Yf*T0oC6+ x\8&͏ **=he S{.XV#䬙i0djן]ó s c,+HK2A O'ێ|U: .y51GFX9-1ޱtS,xnD\ \lfP+|'ͥ*29_Ry"\xLDlĻʰg^-o6[k-}3qܤךo,K mV5Cvcvdg@pL1UǯZYP40{PY 6 G΢rK=]@Cϥfk:g$99ⰵH8P8* ݷeev'aY%=zlEbvM*ڙ:M^E7 -I וEUIgר|G'5ٯP?:tOk;Q}V}2+4).nX$"rzޗk:,GPofE$vj5-:S/0AtK4'm!f9o^OU~C0%տeiXoa߳{b&eyw#o(Cϵlibۋf?|39i$ޑ%6dLD `Kc#Ipy$}kkF_U+-;/04YbV$N(]CKUx ewá=+: ZRR7e䐤d WR"k%1ø g9#RiZ;qW&5sv3AxFK#< 'z=}qqYv>cA`r2F2IԪdQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@cWZby;,Xw=[Wh:קPH!T c!p9뚐"iG9}R0-cXAd>k..dif;&.dF,$  Kŕ `8ֲ(sɚXiՃo9$95q uE3o]QHĂpk/a{bS:MQ0;@ϩN}hInmi\O,?6L+;6sͯgDw mz~kװݴ\1ÊE+Š(EPz׽_2xv}7{7ގKVxoNaxHZWҦr,T9Qc^Z{y]pzţDbhUovdxM!<$zW-'2Z@ o"OJ#3n͜OJw 3l ՘1U ;Fn8)\ճk'cFOʰqJh*ғ];~?f=5phJkbksQjvֶ lVvgsy/Q'#?B!w7nmNX kK$meJL:܏ݳ]ޖY8WW [OtNۻnbmB9wM-gt1hn0Da-弳ksТ8"m_F*I+o+ "](=s]u7EB=7dUQ\膎Ǡ\kj宣cի2f[ω O$ n5䗞Դ2 9"69+kPd'iH:ZN.qOVxC0dYqI T)uy'Okv]=eR#TTa7Uˎ$RdG!bٿgҫ$:U #0sHx#jrkլgXǹTʺ2d+۩1laSVutFf>J .>U'Eus FHE׏jַ6HXfcsS(6Zso#W{_>;-bANo[+zQ=Y_B+>ǎ]p8O=:tOkxbz^#{V%jNycUI.e-+vX/rz 4G]a ǟhG"Kld09P*j3MM$?8 Vu]moy %OLu:~ Ke1 σz=Fk~-Sx)U(((((((((((((((((((((((GԆNڛ(kܔ995 y^$}vLK %g1" z fVR'mG_F~l'pVB(5)mE 1!8ܚše+$̊CB#(-<3 ՞Y9OZ5*gTz% \\MfW w#hfl'7Qv/!I"LZm 4E+#pU4QEQEޫ$?kW>#;|Cv?_!{_hLsn]2DKpB簠zMѲڦ*"=dK-ny\ɬt^4JFGs7L6?t18k;2ZɎY9Jz5ψQipgSdy{3ݥ&;(MMhs, ?uA3Z:rm#F"'= Q4#nNTjNx'rkB=5- K/#k>`4r;w 3FqWh> IXb0&}zԓŦ_j4}5-ϻx3qvw{jQܬZҠVcP{r]& rnCMe]xZ0ZI6ёZF9jJXItbas]OkdI$9k8U@)_(1L՞#8n 1\]Nf{\cOyxٰ}j[i 2hYI&} 4uf?w!v ݵG`rj[RP?7\ܺRFmiruYߺ1 n=z%[l/Pk—P0MmVЂg7au;VbBqi~ѫ:MEm֔3x3[64c9 icGiU1֨JtsSɮM1)*x8*isV;F+t'I>B ʏx;B V i*7~)%1]KN2>]hwH깉!vT)n57q#lF.x.٣ ea)#k <-G+H-d麱EfW9ⰵKXtjSO?:tOk-^J9TwYl%d"V&kLt[=E$<$J ۺ飼Z p0iƸW(d6^O}+I+gu9,>QBzWb3xZ+G{ UA'z(e}E+=t\njZQmm@Q#{צQCWխg?w'=봢bJERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE5J5;uNXcV \v#[={MXcW @ӎsRsJ?#(Ma8s,NqqŞ!&8&;8˛8mdOzAw}i=t6A9ԆHN0֦Ova=`XcM3( 9oNx$SYӵ+q̮~+\A:\#ǚ?kv_:ZxLխp\6zpX~UZk KZ -%T6KwC4i[ ^yEzfZԶ*_E-8 ǯZI.3W]^]d4럼}5j{K;iYLVm><[UȮzURJŠ(EPz׽^żp2/Iw~{ r$ԾmnݔSBg˭.Y##D[OqרFѿ͟ oSYc :^O> wyp &Z-wZi\څMa$Aɼ0&cq-6>Dx'⥦Rv1a֋eobOYwl`in"EE?wj/g [u2iޒ8<(9&38 g鹿\z( ͇3&hqZ"NŚƻ}in<9oLX\aD|Q!'bzH#IuE&yVw/%T$"89]=l:|<=r7Z1q.\biZXDA9Xi xPV=Vj[ym PXWwicK1ڵgc>`\YJr izTgV2>s)l:R aCVY[EcRR\{˽"XΤrHC> ѼQw t&W~Kj„v!TNfj_Y--gF㏒X_g6}oꐹ20_hđ'gJd@Xro3%=OM=/{kܿh+m~Jbޜ77mu<u)p:(((((((((((((((((((((((((((1*@(((((((oU+ÓH4x }MVȞ`~VQ?뉯ȿQQ"اJVUQHg WEQeoJoE_Qqo}hf7Zo ^( Q4EH(vG?u_s\(??Κ(C֤Q@ZًF cWB( 0栍/ zE1yaջ&g|1,=hgFiTXtXML:com.adobe.xmp 1 2 3 0 0 259 333 1 0 $[:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.76: Crop: width:333 height:259|fotoxx-23.76: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:300 height:233|\: IDATxwTTҷޓU$sFPĬb9`V` ** s@ (9@=鷾 =g}f]]tUu_N FII 2uׁoRN<_l P~uׁ:XRXQQXXb>o:A{VF]M&O3cտޔϯh|=`677YYYHOOGjj*w!##*bpAfffY;g;VK?R^^7GWoa,Ll>nXŕc/wɖMZ"^l23p1+KWI)PY_RRR>X7 +!/21D)oQa>p=rZ=V>cMڏ(l WA?ʲ*0}>V611}뫀8^{6- +aLVmnXXE9p],afnv *%2$E`@XZXЉt7)·?Nɐ?$3q_medN\6lXl}Gk&Š9VТܺ{Zy`c`yP>c5(A`y9y(Йޡ袯9Esd-6>w -Y+Vkos ;>>^[f߱߷f"]RpRd,8c@䗀mºa侷:QBe#)1qq)\RJ*rELOE}ʰ+!1 ٹyt<<8] `n= "8LI]  wX}0626 w98$`19I(lBJ .&cNJiT2UU =S[L[E`wIT ho9ɛ&zg:i{{,w۳gObl3 2 j…PWWڵk977n>}oX,e<12b6 F4l( m=l9xo t8l<3v*D8kS#vŰ`U%ehYŻ6bD'(Ȣ;'~9}XFƖ<~&M CmH*b&d4.NY3<)@i^"?U~8{37c{@I^چ2nM9M^/uFlNt+b鈂Y:- 0A˗XnyakHH;bmec-ՎEYkF4^BG+w}':]xrQy8 2ze/&Qwl򼈬zZZ>Bw!2![`;ij8=yPSVY 80nSacA]y&|=@NR× X6G&mD?- LGZ8p.r:lZNY&b9B}[m|lZ4ɂ ЩS'5sgddǠ߲nXX;r꘰r;f09{w-.9ƕ8 Xv,rj^8缱}6o 05 bU`݌PWI~[ šu'Y_W(+dHOPR8Q7 ) bp֧ZX78l01b.Վr!- +v{X= :fXp$ 6ƒʩac,KagŊttѽ{7XC,U/ Ꮿm*MM-[߈)8{#>tbX X~)9*CSTˎߍuiced3%*JZX*)FFy,JUԄ˖Hl)79sgDY:7o fa&M$r~j R(X qn`tt4<<X)M 'ŞmYI}D^"AÂ譝K;%455CK__ՠ:g`v---bd5dAnz߭AVV1_b` !fm>d 8V v^>Ɖ{<$ӮBhT ".`ĮdEJӰ>tiyw +FCMMos:j <>`UVY0TvI G86!j}7(mM`Nt>3Q֠!:mbxς0 0iҹ'3q t`blL [G!#9#^K]=XR݈Necm5% i8F: uK;q{=''33ХZ/^6m7g\8ݺҦ;&-Z1̑sw i rY8Mh7cZ n ˽fPSRRntevϚNV{8Vz>ǺʃYH>LVsAfmfԺYyoz '_Iqӱ 6[и ,-QAx! l2ؼo~l?kł :Z{ebe[s>NVcdbu3oH?E!iejm߀)o-"5O`+b `Z]l23 &_DAݟf91+Q5 ng7BaaqbifyW}Ⱥh yfg}YY)FV;o|܊ד),X@Xe-gׁ67wiq8y^M ' XAa)CQ^_"$_5Ml4%X+ʐ4TTWlߊZ<<*8@U׷ٷjaF?F?] Xx~@+y "VEk+`UA F9ҰQfEn-{kfą`PUV٫Sw-ek߱}0(+jUՠg5{1(  Xz׭ [M 5)y8xZUiضr-dJPS%$1×>2cQ6d4(A=ģan3w^EN+sUmi4g2?t:)00M`hGI _ڛ|Qo1$/{ma1bKte U iuG"|3 !Li㘷'M_~W'=l'c8,%@deoCJs2j^!Ih*JCIK7z`X0{l@Dj:^=Uxi-Q( صp.~vpɑX; dVbȹ:>WSx]3=u 1\۷Luunx{c7#ت;M '0{:JaxEVa{Rt /aTg(c(dnvezooitĨ9p;m4!%):ᄭ;1}5:GQAr8V)@]>(/?jj3:Hh͸t'n=0}1nZ?CϮ?6܇nM~줂7T@t,1nEd5b'+ũrDr72Jp$:|m# pk_ so_ʐ ]H ;̴1l$j-BȝSУpȪjǚ59X9;$t9O0]Â!l{BB gqk $ /&%|rv j\Bu  z{s]7 $:Q`D1doM9nA\Vn|P:H[q)yCa3cj"qy;w{ƄAְOȺooY(.1;da zK7Kjۯo4.f mǐ^QKq<{:=zb`'ꡓ>8d qX<6zv6*^Ưo^#'3j5|1-T58w\}Ϝҡ6 ËO8U{7a,{OhH !ǟ(O~0ф)zz4z^]ȶ?Ңu5\v 9ea gzOkCIHuTV+18`;e(H9!~a/m_,my u;M3B.WԼBYZ^/&Y q9Ml:tms>'`yXV=G;C)a)tbol}־~N?q h*c(7Hk%Mr>?Nʢt;ٹ({N&׶;jojx͗@ ~P8UȎ^H{Htz`=& KWYXwljM<7`7 .Y%^~E.T9]=% zϥͩ)%ΐ:%/-o Ł[)B}JWݬ߲}anfVWc&_!Xq^ܿkMam @VTcz7EH4q nCOZ4-DT?CY$)6im[KR7fp0`X9YCbL hmQܾsGw!kC f.%eDžb@F`~U'7AMY yWe3N_r>J2?qիq>>:hgsҭx}5髱oPKG\R YF:amH,c57PEoF&ő6P?JMA;J%]Q ct,@jtP:04c(BeIVZPTU1q,1U`hd.pI;nUmMvw?sj"l4grfX@WM)X¾)Ĥw\IZ&m8?ݾXahڴ w!\;!ZkjAz7dSrI;mgo Xh)h/G'7(W<ey3L܆]?P'`r"0khk[8}Lɭ-&,&[F:056-T)vwMI| {-mػDxqy2]댎?a@__W!n .4zX,1͆F`,g̓m/[ؘAIYJjG_nocUv Vi~&#Ð-rҰS0P2R!kue2R/h)<Ӟ IDAT<Ii4I0d+vߕ!!%^.,^"-+SUVh*/芈@jF&8+Ɉ zwȣmMg CQHB"* *8J9":Pɽ 22Y2QHHLBuZ*=%ϹGEE!=3V,EsLeԨ*-¯ X Uş7"1.OJGzN.bc eEHIJ~% 1v2ydH%&EYKE-N^ѢI'Q}NKD|b*'b=o!,= q1yI)t̥їޒm',` '|T!)< @~N]M&=}j':K@ 3P|ODJso%rLEP;~SX;bށԉTn'oX<?Xo"=8 jgVS|T۔vs>ވ et > Ǻ[mϟ/v)"|vf}m2y`'odպ>]^nSsCLF Z'O.m! C0ӒǴD[X5TWV eUQQAcXUE*)}s r5t@VnݳQj(K G xY]m}*+*2K97::SӺ=w7ʶy"̵0tx 0c (+AVN225nUV!u8w7QqOmOFb8Fk?nRzAe /!:K@\3մhdU] N^reUܽrKf}8+@WC%|TR MqaDcM1y[BN^\9OP)O?PO O9ѩ--c ImM!ذj,4s+>zX{#Ft":uE,gFaemjCNPUg1 $$$I$$wd ? Γ\ރ]M|XMU!mɮq!D[}YJj$CNq I0Aj -s[,߼|N},[ 6VxnIy+ZTB AFz=.]Iΐe =4Aot bHF`l"(eJ9/,tF Yd {xY\݋g,Hv{B¹R_>h{MH(ja;%! 8@BItׯj㝬g[vу[pw uE˜QRb\OoH :p5.\# *#0b <ƱIZL q ɭa"W\}QQa8}x lLt0x:$eS*{t,Q<x.~G/Br Ii8O aUni]+)|fbsYv_z1ru Q '^{؍KMqp\[u1٤{][\2U>(o[GX] /%kV@Ae-޼&x܄Ѡ).C M!M`K)F.z- W.DgJ,'94Fq #h}-$WRv%~{S;B) w KؚYFC\NL Ն݈m$Òzд荀t+-&тFVp^~-O]:1P5(a$ ӞÑ^Nͱ ( nW_ZKMy3K>.ZXp*ݢCy|i/&OKk pɓ0u*) .߂ȚtN%]+C[QUݿ+LmbȈQ>s*wGgy-x_C1jHfi ~}Ja%&lD*S@(KfFWM`-^`=8cu,;}\u]^<:B IM(ILSFRuJ18̟ini ,Y'kmu`Ui^7L5 mKw?,+0h R†+z+~C(k6C o{@C^ [CAVqo+#)zp(eyu=$p*& +ubˣd`;BBd>CkWUؾz6dkpNְ`ijc1e#ڒ}n"|<`.XYЙ,u>snl߾v5Id5<;L>}:fW毂dmi-+DBJJ3q{3 uq*Yh_5;s9U{[bfOJD5,bFa ܧ%rvhP5=uu!:9:]Ilq%`96+6Wֺp!#1az-HƖ bIw XkFY4=`{$J6~{b=M&e rl 33&"FW{>d-d%ii|7£Y$T,?oWWc+U /sd`=&ʘ0Zm&tSEWlCVρ jjaC #. DrZmPІYPױĽ`ui"֙a}VZe˖aɒ%ܵ^b^6db AQM*V !N rD -%ULITZTcƐn0<.}L`1`J*87:y- F0' 9Qd<:VtlC^Z8FwQз.SnUŮP vX%Oa=9nQmIoeUxN7%h8"ܣW$ \]ZXCor \!%,}4ᴰ X@Zex 2D\z6Tyd2t %gxx 2alc%ܵ\Bu𿎊F0MNk M3:O]B)皉abQ@y`t:1կkW+'@,KQ- }PWš=GQAzɾKX׀% TG18x&? g9+q0 ]0=BKx|B(Q@VGDM}'.A|A1JKKPRRx:ςVzG;AJR3w>z#Gpױ }+gEqy ^B?|&_E /&«j\%)B&Ԧd4@Vk^2TQq`Ӣ[qF#$.9X5{d:DB,Yk`)W ( < A~[+B*0)ĕt88-uCgka_pvلMyu1pF`u\lag"4OY{[&hQ:显Cw22 ; iWQ6He4&mD9"ERLt J]Ϧ;F9Z?6?`B44ĆK9 *KL{νm@G+4`l p;eӱ_(;\J1kх5_AƻCnhМ Ykz>Űj!ڝV,3]txUw<E%(ߨعylMblǙ[@OS;"Îܰ0qͼN^[ E(,GA~^:UQV=+,@r+^MZءHohQ0|6+;(WZ\T/ g\qreX\VRȽ +`7kSQCYT1--.De+K鞬U uW6L}[ QJ2"ˇ_ZR!f@%L,}#6O ]Yr e aؽJP'kgFPI5ԭ~"?/pLe^!0zAbjC1z*flY?&}a+YߘcƆDMUuE)ק :+_M>,8gGɕ_X)+o>^e=p3-ȵ$G6B]8'aghXBrɣ4 ɪݹf]&ɗS7*0bF=[V\Ob Ѩh߅_I5u_q){cT_K(haU?{K7+.:bņM|ȭ4!K}B$ceՀSЯGWtۼ/78ܗdZSc;1_ot ]c*Vi~A}(hNXaqɭZw_XO@߼tUIﶬ4g9~GF0#lKo{l 5ãK艶;ܙv`> Hg~^:{|Ĥ-|}1`Ub{RJv[3sc|7<#@VrzxP[ioTY= 4 p=5ͷ$?Ȫo/_?\u`tO,ҟ f ,>vzі}mb 5wEw< :Xk^Jk@hkp߱2nX擄gO,'QГŞ>Ye}`P$˪~i%\zeOodOCDɦO e?T=eMhײL>e¶ 7i쉤Ka?ؓ][eK shm'{V\+{\n`l*M)웰~Z7$> Kcư![llMOmVa9V$_S7#u"z,{g^NosΟ}JI9—Q_Wzoe-kͥbXoLG7r,_+W"Osele}$!I-oS IDAT.]*)\Aie s(lL!#- YEʉ&I} q)}$eT+)C=<-߼La|2x3/]u%J#=0i1ܭ<\*ꑤkYc'%o9iQظd2( ݔquI6$ ;]Y6}zA./#5+ S4Q[ޗ62?>`Jٚ]{Q*v9C&alDjsNPѷƩkj+pVkC)OcwO^&6Sg?a%:o@g %J2=ɲ)QزrԔ yR޿ $qoTsacLr$AmWVQÐ Jp=yMJ.>8!Y}1`9΢TS\W V `_n[\l\||BN8< .Xo,_Ĥa?=OQS<'eQ;(W-jJh0(șq9s_ɥҴuBXJ&Mr\5b29cWf?2PfGSrHR"PkJzc-aa(UЩ8z #}q& u%N\;yɑ8}=a|DJw ʕDr:XĬlD>2,h1`OYu]\a=p6:rP6\qM 20tq%1 #d{fXG^( 2fz2ze[QY .Iyݲ]5~[@| / U>p6 $ISiLZ(aCQDܜlݠ2kH`UQ]A Fh}M.{'M,ҲNo`_ XV+e[.wmV__YO頷)<lCR%o,đ nCOAw"} <(EL_帋t1l$SNHyŸqUOkJ$BY R1WpH.]yQօqE js)[0X5PZw,|NƙVK)9 t:¼{|]I;uĮQQ@i*aH %g=Ue(bߙ%483'EBU`?""1Sp?T]uo1_|1`ܒMܵB)-jxݦ4VLqr΢S6ǭ11esA ktq<;AXx6 )[piJ gkvGGag(eHI`Ќ-x*< .u<| J jwmn.[THt`-BO 8IX::v4TҤC Iوk3^O@I%xXnoJyq6fӃ̀Qgb~k%V go.0jx_0fzS5CA(ݏ 6qSut (:QRǎoejd$:bJrڴc>K>fʭKA6cgӺ&CAZ }YWqz_߆,)[,7y#Ŵ+~'@5O\͕ܘrq?y c>5q&9 |(|,ŕ,`5Xb-_N2.J4Әa pk5)DNn.Y7q` [;>*ӧaJnJ Iz UZ]Ta{ ⅖Qm% roJ ^">#YAYac<6G\f5\]]etr)"Sϒ)Z杺&.LZ/3`6s`%SNz+@nopWn\s"ݥq ?X/8 %L!qa"Kh3`t2v-&{(7\J?~?WCnsSMàXD]RnMbҋѫ (s¼I//ӿ`d_dg)Y Ţ=!a$) æ"K>r  %N 9(=}wނ̞>ǮS[ 8){<؊\D^ [[魳ח[pdyEz$pq\gM'}0sFNEU[\g EADcJ \ 0fj0qd&cdȉGmHHхtqYe owq3?̹^$c+u1q#VH64&.gêJgD &099`Ί9" "J(A$'9J:[oչ\(v;o{^{NծUvZ /Z7owTZa79gMG'> N̩0~)۱?1` \Bw[:tg@o;^o[_aمXe3dȣ\˥Mޜ8pi 47ZuR Eѩ\ϣF{xY(l[1 Z) "!i WJ +]#2&SZJvڠvbI2u.쁮ziKuhۮ=tv ӢfT:v@GuQ՜;iS˜"aHO=juPÙ'A``ZCknpi 27 :@l0rBv70)p? (liI,ޟvLzKKQQU+qb 4q6,VڹNݶѥswq+ֶrorwzMH{/|1g; Lq 7Ú+w8*#dlXiued6ϸU~FG4%*WAO%0 la=p "p@mQXu9rjf %GEbXb)]Y>\Jng"QiH)#KRkQEYJ(Ob-u%G+yG'*_/dK2B"RJT%E%tϕ;Xm$짰L${+G&%$O.)IW I.dOZHJ"0?/ ^ԹH欹_vr]H@2Ю"Ty)j~xxN{mG٥AKTBdgaH:aWsq5T%:`%"1flw}Pn]0b-=i=;dg fs^=c+_󟡳1=s)޿A`}JW um9f(`k|vj>X5v?_golӯMK}Y!}ҿچX>XCkp "24878y .9nLO#@8Hm؆GhPQy.L6%†2f$?zL^, )?TYIqHNMhg,uR^2,|aYb"ʽ7s2$& #=c!yEER?gqqq(Il,YDέkRC? \!whH_'̛2 ZP$WWQ1_O/͋`6 e61ACbB%-?5_=GUk`Xz!o#.l٦Jg;?op~M6`U R&g.y/2;DNz1SF|( 퉑 mO߫爉S6 g$f>H'UN 2[d:=p ۩bѾHJ@' O'l^)Ƿ8 ]50.Q?3 B>ĭ.<@NVf]%x&jSGUxB?Ξ<}{`Ϟ=8x񐬜\ 'I۷#)=ށ*:S93йm^ǧ!;1 +GaܒUpy gNѓgInwNQV .8~{Y຃+^@3s~z .?b/dwGvxGɜA=3p4n?tC CON?"r?N_KF/=|& #v[CCz b`7PEG ]8Wk7& R Mz5jB.{ʏڎ! &Z{w͛0j ~g|Hw]ޱܥ8wx3 t4aόϚc-h6Ǚ;<j0I~g=CHP@z]U`0p9[tЁ  IQљYEbZ:^%%HKLH9Le>O4EW8Dw?zuCP<8AupG: t%*]eL,⢂a@4kr;ĆzNŠKGX'.5IxI &MIE'@㍀*IIɳ;QsI><@V"Dx28ZV͚`ŽxA ܼ<"6pE)rj`%N:>BdL "pe\h݈W(љ%Tϲ=ErV pvmNZIGS\{L2IE?,FȭU}bkYY?7u M~&y!,$N|` `*/[C6dDuc!-6PEK[]oס:~ F_rC N Ls qJALhE1+Idxpm58  &yEE~5u|k6baAy h tSvzo <%5m蛿7,^$_2iC.(zi`{2fLOE8eYy&0=YF|G W=,z 6|еms#7~y*Nퟏ}pMIFG$0|-Ժ[SSC6t~th١v9(` .W& 7ųT@=jձm34Q?'vzo0zxAZՋN|wW'$ם`MߕHsVPt=9i@0N%r ^!诏jzIMCeir0ˉD0GF˄ԏ!DKSz[1B0c:kY]LjJ$`U~':t#WgFEG>7*iޖc Ҷk;kkڑ^bda(?Xua9%}Us` /4'>`򽈈Fŕy!`\?9`mU ]ˆw )ʿ_uM(FFCߥ-j^,jJtf˝;bWsL3D Q*#+Ъ6.sWD}C>uctj맷y6*8OO,6.̫!-68l~|{RvNS;&.'HPQC`3x^>})+^2\c:wCw()Hƾhw8< ?rG=1!YR '7Dg.AU[& A\r򑝕OJv5 IDATȇ?:kTnO zfR%wc˔򳜶RU.ĔPގ0[ .c*Xޒzv * a }WBXLnN6SSNgA_{s`3\JiRm1+7 TIkg9k/ߒd&`z 'Qx˛)Q=rڱij׵: #m _NLZ˘)n֝xLߍAeD (wvKXYa.ـы;R+֮0~%ZYzvwQeuĨ30w, N5IuL q]\9sCM`1{1«wNnoW#㕞SυGA M=cY7t2F7_2^ݨ/j7 ocLfBϦRRo:QbEغ}`0PĤPK8éf%[1Z;q q : N-rSUKsѫK3. sIXGۧc8z^C?ʷs^a MƑ{| vG7CS~#yEQsW.8b6lقU+`ؐA=;Jv-waCЩ8oa;jpKIQV4vn  >#zRXZ H9cAwe+~n0snK i)Ҏ/\/?RXxpv#5 (.Ɲ1sTXs+}:Ysp'0LvHĖu61}'M)Saa;sw90߇Xr >֘1s66m?(&)Ϯq:.I+mYNQ w3g!(.x IϜ<cw*r9bT 6KYVk{.{IJ1rrvۏ+yPGxXo,U97q\duYy B'U78Xzwe8g5VmނTqNXdN;{WۛLݱ~TI'aT0R=-. Y"ܮWa֬Yd#^OFʊbخM;gYY\.aY]}^+[CK_0н sfsq7N |8D*yEىrUoʔ)Xt%qFa=ޱ(kK=ny(RNdveCaVV,ZnZ/IµG0_Y ^4C[`% 'Yi.;߈w (R|=|3Wg ӌX?f!~pssG«W|K3R ߹6(`)@KHW%'%#^Bۅ0ſQ˗J¤ObrIc 3K5bX5*@@_û籫wpuM;wWG/kzO7hc|>X_;8@haFjNcj@#`5v֯6zA_%۩W`¼l)=e"^":tSɢ_837?Ghp*a``Os:3/C:%;џ5cc;^}AKJx>qI 2ҩ u>zpV#̡ 4\9Fzrv %b3,{cň+/˽S)s_0cOUك.oų'կG))&s2١%zB}K$/.&g82lߡ7 7=XU8& ^- .͠O=N50مBC*^XmAMgnߍ;6chl;g/5h^O dxS1l N$$XJK^B},] L)X5<基$M\OK b*]a9k989qC0\` t. X0k*9/?9^~=oB˞p7 E61yj<|P4:YH깤b|i^2$b`=Q²ͻpaL ?8'Tû\-hѩn9P9hޢ5'adI%w$ `eԉϜ9Ud#{&gyḾjy[c'/:4UѶGod$+1DjliK-aEq X HvpT.N$\|!f-YgRk_aLQNYiqx_?_JD kwm!±qڴ%FǑ3gsB %w~c$A_e'aq< SH^CI<2Ivɭmhm$%؎hݺ=V<4Gʱvg#裍MbگV^Z/fl;ӱt7ЁCq# %9ػj<~ ;)sq1,6-~ig=^Vi$؋٥vƶCqd-L1.9y_~£S$`lͺ ǯ' TzL`P"Iwюp/+'J_QЊD ;=;XUyb=YBʓ1@=zbRW"4tձia֣59F!=޿K{'U,#0t DfUE({:tXރ|[GmE<'\*,=bi)/в&|,}&*fbO5uw[ĮLjzNC%BBmXiS&b$=41qg*6D? U",Z"^8oR2Dkk3VGeQVV|\Yq'j~BB7 [ $x$s jKp\,wX6"Ϝߖ#,"=6Xb!l_\ow`(r2JE~/{b|p:T2R"2ݲQGB1^JГChmSbjGl8~.U9غ|2ZwPtA/"ɫ &~)TԜNG6q`tyf$,s"ms3Lй$Kq\&?$7ٸ~vZtNJ_ $?tڅfmT%aeǻњq2VyJ_ Xi;,ށ\^_܀έ[Z譢~K QA9HE (HU%}E]6jjp{;CZU'$Oq}e3X[Dzc &cCgG\v$K@+k*B} = u]ayy>^#z鋖Ҭlbkqqtw^Fjaa#EMhV [OӵN&t2RD?= h3YNeKe{_RUȲWO^>Kd1pda$ɃQxu <8P Yzސ^Vx2).;^+LXٛ;HVmp=mI⨍j#S%lu9rDž:c+`<Է2oXz?~ju ӣpn 0}=9ПXZ*K|i'ӻc{ qb˦{PgPyF;"{~~^u_}.9XVƔ1g<2MA p ϯـEI}вk/Òlm=C#>âoDGJm5֏oR>;Dp`LkDOAG9ހIjdW4xUANqAGTlǥm!X5 4">__; ІBqS>žu]8B*FWUaqCW.0S)2kE"_5m:b鎃p$wΞ8Ax͙ʁ1,Խ(PE)Xlm c1hUs CxUNܽr iC^)\nY3 ;n~|>탿~ߜ;[^0dPz w޼'O=pU@1=6h,qn:?Ѫp\;j-% XOT1rz@%|1( rҢjZvsKqETjO#.=QB ?R+N3-M;s>V8ID`IE3h6LFNF(U[Y;U8&+! 3Bgr!n n.jݸ|o;MwHNÞ\Ġ=1| x.w||)UFdcТ)g TKCIk}TGĠn#>A5VAr86N IZH%2\9[ny6ٴx"զ5[_1hhlSLj}"?8r iL lP޳WͲSH#M)h= R#z!Mג2tlqK㡇'<(.s*a;Y;Ǚ1<,B '%9񓞖}b6('(=3o>5mʙ7)So# C])1q*HHޑ!->+gqzȈ >)5~Fs[='X6g4*þkdd={°0eV{PE7} zz1rVd9C-r z}nOkq(J'+Fo.vLcc9bW'\ ђ}R8na∁ҸТSc4u)<Xgi*]GWj?al><9&!;)DDMQBЕI=u,rYR8h[b<}K<Uܻ oRvVvhB1MnJ x}X|<3x{yA!͓Ht  <23,x㽽"*ƛgϞ!K&3&73kQ0>VbNNb#Crti&O,AWAV;*{AvB(ґ /BxK޻:=B|G,c"hoS*OT\,X h6=D]#bOVœt!>"9hEy&W ۖ}}}cǼhnPUG&)TR>yK)T(#m<qQawҪS^"*4}TϠ)Vز81}%Q?SUQ$Su|̚d'H,*KL; w=9ULR_6)AUb#_{0!2lmSvJͫ,-F|d0B_F S`#D|兇D%Tɖ )+%dzw,Wds-EߊM&"q '6</"wڻ8/f)AC J>{x8?HWY(ܹy "?r sZa" V&æɽB 9ugULv vaT.ekdg3qalڲ0A}uܾoN^vi5^[78` 5-͞E/(;+SZ0)<Ÿ"}st<ϔaF]xƃFO3wV˜ܿ\ʵlRzu_26?`5vN@#`/հm?chFAX_oFj>Fj_Mgm|}=߫m|5}PƉ+yn^kkLHmи93rcs,q[$D &P*19DytWWf3ҧp$#׵[MMD듎.X6͚\zU_YϲhT z q_:5s`oJ`[t ̂_>4f[9#Aqw1_w4%x_ry3_a.ONUкwaT? a xoսRXU]{.Ƣm%7ZpBI=lyPxvsC-WvCVYraW1cuGOA$dSě4*..|=$ˣ;¢QQ72rqۓ׸:C×6Zļ >K|G||ySaN$s&#tItr{ᑛk߃_Dl^j4eR]{?XIG ;Y摞:y=C8ͿCIp$/ў0m6V֣Jq"GrX6"T;=a(L.uhrEYa&x V^AWʊyȚKQ^ <,\ R!} m tGd}wȫ&u-IC.;^FGRxqRIi`MOc(g/ mTx8+GG򠹧Ԟ<%G1bk)8$_Vg{ šbq?q]&RyI5!5vvA^N*^ m9=WɾI Tџ5`9ߐ8? x.pF(.H1P24ec [f#57MLoҩP< QϨ"3ݺu < !@ ~gӷD}b1?zjkcV;$~Trtp| h`ffrS@a5«^L 0ˡې&#pdyŔ zz@a5tot4;]ǐMnxl[=60INddyɡX8:tBoS4KMVEVFqVV *lC'‘G`i:=%>0?FK񂓷O"w$?Zݻl d8f:FJJ|ɽ=j8LMҖjg9n!lX?~ O!o7ܮÄ)(Y׿ӖScؘce ] 5 u^NڒAM0xX2N RĐ̝b$u< ] kʽYǘp {9`Ϲ=p .<ڥ4kr Rt3q6i>E# x,+LŕaHϢG:eMM-L"X7c0Z+3 q0b8WٓG UWdIF-)Ƹ^*oAEg(ԦeюI 7AHT,HI#bc9{o* c(t쪅5N3_x=O1-*(`2DÁ;.OH$ޱ8ti*S V-ap))n}7W\rN0ӻw %IڻTL诉W$1F"y4ta;$/, FRB?G8a6zADn@>tsyhwX"q'pM-&\(2;p^qwtAջwȊ酄^~9K7=~Qȵݡkj=ܼt dS6Pi&SVڃG!ʹݕ{"BxE57i | `{ Mx{0BhۂT8}O̚+h=?8c$\r @qi)ba^T( 絽㪋7CS`xF{7Ô<H|CDlEΨ)l7xt4x|瞛I&pF #Gֲ'G9|@ėw&usp&ɱSSRk:E7`5jNiq&#P6*`.Eyc@ve<]Jrq$oIɯCɊ6"HOH{ 2UFL'+tŖ\UJ*p^Vx/k9",(6ʵ[;Т%KI/޼?RjaTVܛI wd(& 5 )6M xDYd18~݀Lͱb}~RKa,(cIRka)sQLF-tau=w*)H󡭥AFa?%rc0F,M>] x>0۟"qq\t[Ƥ%(:c<ܧf6Q:{nzw頻ri t5bਉزk/.]9A{$nֶr)ƍ io; $If 4e>NI02 qqlK-J1-)]@,=7RTK鍚Ycq\BEl$&NW BRnڒVJmur0{S$lukt%K)8MnjYק_ ]=w NТ\˓{B~<Vj:vJq(``@ `TiE'X( H}tPT%tM{a$_5EE=1y!iSahtd9 P-:.&N5Ŵ D||&-ھa E Scg\?&2XWQ«R`oo/n`TV VUd`y,2sPZJ!'H,=^s)+>}^ #(^H<%MeL+dW T59`{S*-{Obq( A}:-Y:ݻwON #?rF-'#:aKˆhլ9T(TqZR!4g ^RWy\젚!np M/LVVyp1̛4*=qq7\9@Q%,5 VB9`Z@;z!J_w`HlFuWc,Kj\|~,˜ ^&IЬ-i({y74;WdjP%B|/.YW5(N(GsU fz8{kSU7rgaTDؔ29GoҷrU`K—/B%_F.dlTAv>,RPFGj߬I5`3`K" 9[rcC]S0;_eW]eƕP1gH,{ǹTX/IC 1H}j {}^ރ<BR0PPoܚrU~4@ 's'Iq)^*:",.NAӦP("z; CVu1hBog !Z"/sd  9P/ a7ob2"oؖgm{rxW /"ZT]gdE?4kς _a eKBamKѱ# Tʄ%ErwBw1H'FP[Ya}%ܝgџ4B,,bW1 !{Ue)]߄Vz&n݆܁ _ !`ꃏ~ęqOB/*tf3uϥ\+46qiYcWSJl]:;V0j4ٴcaw;k^׳-z=2zL8uC T`pG y+-/Ò"g:qK' akbLdL<+uqW c!VjE\q(֓ɧ聽ŵ wըL}CzĹͫkPBkEE 4o lك4 cw&j1"=8y|?̌hUKUktA0j])1:`TzuM~) : vtio;Hi>[s? {._\_:Q|X 6#q \8HWHѭ<,ў*ɣ7H-weB QHIGwDJYb.(6 uIAcl 2}4wS[π{ s H2VЦz& zy«zsJ qtZ,K5ݏ2a{aa+6j>4fa&e&z%g GrO -FKee2υip 0\?Zܶ3{17?m p00BJ?zF=i6(VN9j/D_cCi9-e|J!> &u{)0Q7?NԹ)$b* Ǭåziƈ1o"7'cy|e$]#|83,[g>;" bD 751X-`KQEJHJ{Xܵ0@ftϙsfZ{:gyF ץðztZ]<,݇E+~uQ&g}XVRRbXiw؄`\ BS)L'jHLcy"?33UpLa0`h< kv@F,MB_p \N{`5.ܱe%`3W~ Ǭfne^"vmYeI&]FKf_y,b([!g03iy(툻:QO{LLqIP,&$EBBU?dg碄1_K^~F!"Sw|Ш<:pngAˬhާDy^x-ITa ܵ[v>\K]os2)YjzG؛RrţO}:mNTi(K~FYey"5̓B}.eRz[8c Xx}ńƖ,;ffQ%}2Qy=P;Q_u'1p>#|Uڠ]ǧ!w>x oX8'񶸾Iu#QKO,oS8`qu@mtWVQַue,jr+H=9N8`q:6:+(|rzX\YFYV'X8`qPV#}4=/\\0lYmrb/,R&f^ pP%`ؤX \-,U <\twmR#UX8`qPŕUmUU_E,jrKdTU8``lK Q{D⍐_&'N97"4 iBOY6A~ʾtp‥UTG؇r[ferSgI [WS$ y>Y:˥f $Зr8`O:gJ[_[MٓgKпS*(p/舤 9?ٙda%)&,XJJT$fae{+sY`6c.DĢE"Q;bx]xfy`.  +TN.Aj^ahf9s1stuu1C+jC;6bZws6-9`qpRip MVd_*g!X:;lj2zvl6iSĸhsT1xF\B233,!>81F@b2xA k j|s`v`9ݟ3 M4*~0x.&ԐrK l\839#g Y8uf8y6Mf1'OƬy]_Ї+eW<v`@cai/CZI@SS"ˉ=TTxMM:Xas=hcXN5Ǵbt^M=SDIye}b>>da riƍS1Zc^AS[G'h2j(춖fD`˺fi!qt|( ;$pӭܭ3 t6Nh'%2}Œ0bFtf̎ RaͲυ̦nx Wv`[ŷHXrZN,X,a"1 I Xp1F~1!Vb[ȯPK> ~rdmźe61ksac:M%cZ; +7}79ʳ{ j ]K4d8V;@+Tck9i>2 vhj Sg4F-;ql &#U۟֋v$I!Yc'=m\dU+Z i;?_8k"h$ e5Ny#5%7/G /?-4k@s!)…u+jPz1Ls"<3N1MfaX^Ў`v(8`qR3K)"IJ :=␗h_lX:P+#W2Z.Mh" ~5g"m.O|&$u;F w(;^Hg: ZpJ Y1P/^!e5"A\1Ygv_݃&ZLx\1r5/W&@SZ)_(_#+S\c}>#epz;ȵ4֡rVV*œ;o6 8`P\HZkdfG{Zۜe t0J)S Bɋ~~QCBu+Ƭ=>+-?DQXX>U]|ػ^Qj` X_}ht*%W^IM` ZV׆ׯ_ek!Y:@Z:1q)g#N7`4Ħ @cK.2M⑒8 #p9Z+{1Ng*~<M-\p&L򾰶K:Ha5{ ؿetg`SLFhYO ܼ}t5>DTw}V.Ɠ\BQW ٔ:k IH %''!!61s=҆n%K, Rd#ʤ(bT8t7%e( RCK+^2_w >QMh1?X"&4OP3k`8s1|E98 M@tF֮NoG? ̙76fQ د ܺD'M(nhݩA֞4MԶ\]B$ Noػ pc%8h(%gc]ʟﲣ^r|m?GiHFEe>n?]c\{|z-p; >0d׋%;]G~`!^=-ut2HL5G`"̶ʋd6dYd 5ڒV<R(N< $T` 5ki)%ɰW9dJkXэ,ā1b<"F`5.` 6_K'_qQXI^W_-#އ/=iG^Ac"2M2y]I0T ?,ǿ_Y/)X3_?:}l16!vtHE{o7<5 cƐ3 E/KLA a 9%8`qKJ-Z XrE|4{ȯ&؄ ?Lyrq=K3cN%tai7bhⶓ%/%0!Y$^ZZV!:ؘ1}4#&)͊E)И~67O6~*̝3ڴkϲN$@ 1 t'bDAOOFX.$g}`,m`|| Ϙ!'Y>MpqX3'_ކ(>>d kJqKhOCSL17$3;{U5hÕ3`c3sXϘ s[Ĺ;^рҺʠR-Z5ԯg)lIHEObVDI@F~?Q@d1BB bF>hZi;=At؄D$nCNS #$$KSMֳ4!!HM뢩)G_?O,9ToIM*ՇUJ/?SL$ 7я'-,BK !6U _z`%xrR !!9?OODJh&a]e1B uLlLHf `YXVe~3@S'OڶTdrɹ=BD+%+lzkL7&kLJS_bqr2CNmOK zfUEbɄu&}+3r Rq=/G8zoR-K(-F}qjhYGŅ ZxR[`H+[=MI>\UQf\Ww%bjoI88`qR ?YRQA.|;Mo%AoFYp? e/0+VUQ'$ز{Y.l$,P\/ħ)dPT>g%EEibGx䥦ރ#]%2}ɟWUY! ]G^{P7뫿C![ -s٘7,X*Foҟט%m"STuu,Ly#-TU&}1kGXTEeiTXtXML:com.adobe.xmp 1 2 3 0 0 187 331 1 0 S:eXIfMM*V^(1fixHHgnome-screenshot02320100fotocx-24.50: Crop: width:331 height:187|fotocx-24.50: Sharpen: median diff 2 14 15|fotocx-26.6: Rescale: width:297 height:168|Jm IDATxT}zw{39sT9"s( 0'P̉ H949ۧFF1ʹXU]]]'>{]g+444(++68d#%Sjkk qp p2 J% '0 p2 .2AS9MoRico fx<7-]KAoo-Wa5//999DFFF>o \dgg7),c߱sm4)R_]@cA(-- 4_VLKb`@XI/ofRR:ʐǖ>+>Olbc$[/!ȧi3rmBP} LO-WI}. U9H J~[(040qZ .HkEu t"'amYCQQ򐕕ER2Q9+̓Oqmlh׻&m5pjgaiB(a췟ȯfQ>*RbDx^=9PPT ze%ڡK)~Tp1\;qj鋽wMHvrݫ7 M̠999HKK cDV!U^^~jc UXҋy"KO(EEE맖+))) ӧO)#..i"))㬯D7m*0R:m0g8#v` 댔 ) | "" ]^!H񐛝poC Թ1x?'h|wyy],-7n܀7E|cO  BbF.Jvnų|T ;- !T6TAsC41E- jC@:/AA6EOqcڌ(SAԩSBJFZ?f)mذ:::XnfgK,Vamn HR4Rob`#hh`WeBH{gAN7uM0n 3WJy5JkP^VcfCQ zm 刱v6QSBwe. L2S,b07ČMGWܱ-iR:_=O aSH@l -zHӐ+O N"B0i[J׹"1w΁LPR`ɘ9c"B},?Ԛs |b9>>/vvv2e ۷oǓ'OQm C*#8&Aɔ ];k]e(b֦C"syj )YX|ҶZx5( 85+j`Uo`{+BBaEȊzu;BqMerQQq!+aS7< O`BGӾxQH̰ԁn?;$#9&.j0< s58LLO `PcH1|-M#QkZk3ܹsIS5*TQg),.q! e ey;.Y+*-LeWΠ8}/E!ed`hw z7euȎT` k3, !CEMRGZ `RLrݏc޼yc4sC|g-I$&b``PDCx $cqX >0p,[T9H `[oڧs`W ЕH)@SZ NF%/lFUyt4] Ox@= ٽ+9Őndr*)ڗ!mrS{4kVNQaJ` 3JHoyCoLmSS8ۏԖ wX_?K~M#RY|$ rslXÐxs] ~`m7gxDAY`ױm=Xc2zH0CTZRG~Xcla36CGad}h!6Fb==fr(m{l۶!ofRb)Q7;֚Fsaj>+na4R&@F޻w_2͂9?e2-S|Q-ƴ)6/c sE9[^CU9Hq'[~Vzؽ`vH[g~ jaR>giTtk cȗJ,((5?m^Sߢ8H}wbfi8抽{\kn'Q 3b2?\4$6Š4g$Z֑A9f4%VPkbw0}nKYmi3)R!>mA9ـd۳mS^0-IX쯡95/C_8Hqd@e'b-ܱSA)NZ8Hq*O_wG A'b-bӑ2q}'"KOJNN3ZZ#m\p2ɀӿ7ԃ۸>dqR'b-8kק;WO A'b-8k4Oc׾ A'b-8kק;WO A'b-BGvj Hk}o[ښO8H}*/+y$'>kw[H?#4@C#2<Ϝ@C}GV%:. Y @+hSS> R}l!uڏ% ~H?AJp[8HR2N˗IJ8H ogAҒ,qGV~1jkAc νYÓKѽkpQ{KfAN'&qAz! un~ Xu*jjE^+AKcÉ'p)䋘~^ R;ѻWOl*ie1Vڶ-8NUNj ._8 cpwu䡾фB\?N'|E}w#PU/:: (CTǫxjʋsgN1KKi/A%/tQxzǵHM'6uGCȳ4k3Nyn>B`VW"Ex_=~ێqLTfE~;zܢwX}Rٱ^-qY; F&SwCC,[AW)=]ݡ lxsk@*dA3ɂ9 k$ ~>^)zAj[PqOq=rsI I# !<ںp^x9#` c(jaL á -&HM:x%ejkQ[[”Gظx: ń)S1e#u1nd\YsG̸/t1` 31Ơp+"g@U=uG`E4 COa~PA6C`j>Ɩyz 20w&0|x2 gC@l$< ؏رgjagl 9C5v϶Bt_1D^Ȑ|/;ih(].hxSu#UR @,rH˂+ Il8j1dytG~y5i4pYl)-lѴF`xl #c FmC9Mܼ!>!C4f:vqH+Bt(NY1e?A2 a2:7+>ACY_'S!7NLWÝDLA׮Dfq/c.fD "XyQ*f 79]1t"!crTgbd#Hi:kHHX:؁TZ9aAܢ7e֓ǿ;Q3e: Ҁ/5W{;=PQs zvR/}Dq<1mZ ];AG!ۧISyU?^ 0Tؕ'sLԦw<eQБS9(k<Bm Gpك-[bp=z RRuqYܴ z5h$H(iYoaCf~ՂKE.]1|f:{@OY"x((G`*$m"\e_1M;q$ æ.GUu\6L"ċH wwo!yݺIy&JYДƀBTcj#^j8sm(B#gSR^=>  ,v膢fMCd 8Cm{I䁚P FhbdPݓ!3C ܻ$GQմU (pD[e<rݻfF<'M ʗ/pv'據z,f6B<Jp|rSQSI(&ia˂V'T2fl#CuD~ ϋ/#4w)+> Aqc'zcO$Se>bd& y,2 5Y}-aylW եffX=J3OY )U=?Xk/:o;m^<6uRM/ ҭȂ' :E}s{ЫGl4HWa] Ax8I*+P+A!\VPs(#Eh FGme.uD.~+ S4I7A9:dRXphر+M#HyvJ`3H-,! G`5nPJLXv7UH݌Zpxy< Nc"W(z IDATFn7R!(P&/d>ڽZS3KӤ/!$ rsY?Gy{;'}Ybuno!@fuOӒ4$ ZPǬ%}6̛58r'5 c3q߿w<~7,9~ZiEbYQiowk)a9}n~7 7 Eɉ` #-[4 h3| nĤ,3 kfn?,۰ vCp|,W@I^6Xj& m#mEY7L C0C`d桤(WOGbk#͢ E`dCh Mr#V;uRHePN7B*_,l8~~LqY;v8p% l0Vdwgɤy"M,3`6lp&r֥khދ0lpL6 ;Œ)~'"Es&`qX}ȋ|LFהlALttСCa7zvX ^ ޳ َ򍻐_B{ʘHJǑaV&os9"AXYQ\W;cH 4Up۶&kspbUZA[ׯ 0{f8 ^=IY|9lbA7AG] r3o T{ARz/RH1Y2J 6eA/ 3Ž ?qCbWU4ùz< јv"Rn)<+gyB,;3gSW/_Ru%-ea; =Q1H}L~H})qoYޏqo') [[n;9b+XpI}iR]A)OܸYۮpgsl|.僯\ hk{[; 68?Zp5YV4GwVGmюY֜]m\Xx~ =@{RMA;@=-W@7׭l d[ X?,p |RϜDncOɻwv쾞;fԏ& H}I"~#JB\BTNQv>/ Ah7 ABkr9JI}fH{RARwOnp?hiiC]]Su;5pwNI N=|h*/FI-BcE.j'm'FƆu-ubp %R=Z;a6{]Ν0ii\e#kxgKw A}i#~coJ| u;R6+lO֞;@֝:!L%&!yaG }ѣ40VZ><44d!OIdrs7p1|B҃dZDU?> kCeL=v5BZj-$z+`S+!գ'Υ rVW '#yyƼW\_C&> \rtQ(A;cz*;/')\/96 ٙs4Wqi)ʋqm%Ykc(kj\G/j~ZZ!reS ꑄqdK#2Ee ֤jh\yD!HUFBk&73WQ@R175 y)o_;ʢ8y8Ռuhx-\CgbW+\N}!5QSiԔg‘eWԂ)oZ}HE>eXY2AC} -EǮqY:ucl%e%Pb}*Rph@Q2~45栺LG=j`E<\9] eHKrURǂ-(_gzzkORh&VnD|FAV+=IOq) k a}jbqtbh@E]JJV9yL\ŔBKZk Rolѽ4V:"Y>iݱ_)r!%\ ptUĥK!dD -e@J;~"1r Y Ĭ-G7Ф1DWVlDNSb:\2(՝2JPk]-'i6㓳!e)"/OtD!T1r$ 篢G8y an̙nOhĴYZ 1o1L 9*2Ldff.ovEycj+|ti^g; Ջ:$Ŝ6fnlWQ?eԘZܪ&g:R:"a.d *9Ձ!_|1N?XJ4[)b7m)=59B^euHOniC:'; Iq8{ c7j;O-zYGk9؎Vam tRƖB nH 48WLq8C k̘=6VZn< JnHi_Oغr{3!)UCu&%pF/eCv|jn) \IGj0e7%Źmjœ8,s>}$^[v㛵,[Mk`j~5H5ϻWlp \k\q<;ДwoDʻ'q̴` {@J쇑Am#XjA" !/'H`~CM6힍^8w= R 8>2xL/,?~EMZ$iq5=m HɣmAl R>=[hR/IZ 9ñk-_Ek1|MjHM"ȑ&5avIL3Mw5)& L3tl;{ytCueaE$ҟb<ٿ"'xQӭХ\WAL_^JvDu+yDA smE F Ї g< .r i9MMjf>nCѵzLju}Oɂ2"ea  OYi=;C5iX =z.b tQF 3$( `++HŽQ )gw-Twt.BKyy@NY NK \+byx6ڮ @6c5.=dpz0yy8wpt%sWi%ynDJR:'.[ .HASAhr 04 A(&fVŲ{q,<=0}4=KJ&:0;0|Vmpǝ4:M0G,9mо5M͛=~ =xٮP\ㄾܣ.5-F`rH`F'tQŽ211K!dV,Lh+w+ "!y 5dбK7t :w4(?u; dspp={CBRFaEK i_DcPUGwJޣgO(`֊Ȣ̿I&! }~j& @Oq-! ]S MOSjw)&%a"3] (*0{E㵘r H뼬+հ1с6ţ+b*N{V)vҬЦv]f?1H1^}-H}kAJxqߚ,p sk) "g9HUs Fg\8Hqz.I-ǘw<~wn~A]z6pΖjdӤMLMNh[qQA",J{<$DY @-˝r6i1 v-)R8k X (e|X)R pTG6~X[ A'b-8kZ<_^C\]q . %}=*X$ArXXd{a^=A Opl@^S]*kE;[Eyֲ ;&ֶOv>)1&\G{ fp*Qa _xv^;^y]וUDỊښjde-1t?ۍA)1>2uVF:ű R[gQCi,OM}=n ,kKFj2"BP\X8)R-&;3|_0#D9A|S Ri)b; A껄 Rl lv=mԦ!HIJ8H}אb+{޿ÇS7nX?ɔg U6cY5kg: 6YXoV׃H,,bNp[A JJ$ot 3w:l^7og ==sƊ [(/Ń>e_QI !UOZjvoYsfeyXe'nf˄SHnY O_&Oh#kח"5A*+.NCuKI`)wphG,ݰ۝t#B3󾸣0LcVlFr۔ߦC~%4{a{S2apcS/﷩~y#L ز{vBtڗߟ0wpʨYbF]m5B|0a9ST0q 0n؉ yS 3TvWdR/Ԥ8Hѓ*3 ۝,a2~)=ANvhB=g (o%zϼgwo;^h+`P6zMeR"15UmLv߽ȾMELwDYy9 S6RgF7 g]yԐ&ؗ-I1s*VNp4 5% qODa9?H>jX0)h2vg!Whya:WCoOA.1\ FDT?^З,2nT{nqMl> F:o, ae+>>'ܷo7fb&eCήn]SȌ RPUV4tȻ^S9 rT"l'œ,nvNb@_yϔXTOE5mx"/)+& J.Фpz*O^`e YȥHO ÂiPR2.݆j6ŶP?Vʲ"ln j췻`a߯X+kM󡭦L퐇 $Z.WU:v)~"f':􅬬 $gP\(Ύˆ諭)Y9 G9u eQI_uE .@StO0fJĤd䨦+-i58s9i<~$>IPiY% {?`4T>BuE*NJ,!& @Bm)Q7`7؜_iM#|< >mL3*JMmu!ITPU#[a Yye,ڼصvtHv ۉ8K+G@ZF"8!~!J5{BH%hҢ2dat3l̜P*zt۵bXm?ɬbC}\ ӳ+4鳸| CLѱcB*?4AOUZ Nt;stێ?腡,=QPP3H-hݚr<8 *|=rbp]8-Dl~1]VG_%oڍ'}g:ǎctFurϩwVlAWvP3Ľ A8= sW,d )PXnuTHt~ֿG¿4? Ǡ" =#)9O}׍Klۘ?=%h-H{S{oiM׃}jOӑ.Ʈ܆Ȭ\<}\2q~ݻ9ݱiL< ԇ/}!~ G$OyO1ݥUU> 0kR\ 4.L(!* B¶ڳˢ3kkU<ٺ=:|?FF5PRR*$Ο9AN.B"q83&LY V%WE:Bd\//>&N^ `)NՑwhWryA6/wF_-uэj]!6"3TT&K&Z>InDzX>S,7 ts8 "0'yIDATMsgs7P]]{ѳ$<,KzX~U;,+m篃Wǜ>Aڣ[o.x&Xi <R_3u?zb8Tsa\P}V!&GE/E=tpe, /9Rc-/h Ѐx Oh$0{+ J}0P;!DA]YL:XsBJ1Ǝ X6:} ClC_O ]q*pa$nVICu&os |MΦ51.ur1Q'Lq==L PhM[&sUqvxW*Rp$*I`s6o0;bh)L2Zчv9!=j>J&ФYhc%ғp^RPT5DAL]#T' r<ϢՕTc1!Hݿt2I]Fs#bDw4gwAGPx($uԬȤ'U`N=H?VQ-#̝ )Ffșé>wm3db6ƭݎ~eu*AWԨ*g=JÏ\GK|PQYfбAT cYNOO>E3͇?y9|s|cz&s$oyؿjF8A&}y$j+z 'L4Om<ƍ廎[ d멠}/ 6!ipdp UQU3'k7I+etը.KŞ!XMi^/w 4!7Ȩx[(wg7A*+#VfQ}ޏI%XTgc4w̽6A6lS y5 L]UH=+ƙY=gqUa8#h@XiC o'r+bݡKt`.GT7Tqהê^(\k+s1o"XU#eF܀FI{N(`ޚ^3= P]Ns}c+@C|MvN!3P08*p-$Ib,R|/jQ^+'v@[I|nd}db3^b{l?X@dMI2Γ/b,82Dg壜 [)*wU]zS̗U\p5[NcNo 95a8pA5L JP?9W1Ҙ k?2(NJݣJ%HS7>l[kD{оM*N~e9q9Wc ?,WSPI%Ovb?Y$8wza )&$'9˝FGǎ)4`DzÆLE!8t2e ~`/1S%LadL ORZ䨿4?i#oE(9͙㼴q>br`:x@θSdy$V2xhPXCN}LfSiOE }m5$@l0vL/lr3->6}e0|\TXױ7qkv:wuqEDj.xQX9`~ ^9C[VKv} Bp0"2rikB&BxM.'mf;t 7nݥpx))b5MWaio\+ w*G/woض/^eطu9j:vd쀊2[ӗ|ȑ?p{(,M Zgڙ1oq/Rq޹K/\IJKE_04u$\GDr]c޴)%onI>8tiR Rl&פX0 -Y9N)ᒼ4,K~aOeå+!KvoGm@'Gc> FND`-y+^"z@?+H`4+Y]V[a!Tա E5c"|| 1al8_اgX;g,M+AW_&p1"AҰ4Do m֨bJJ 8 EnY;7>㠡0?Ow#ͺQn͈iA_=#l9{4dƇ`4[(((PUQ0{(UaHm?;^EaPVV&MDՁRDP _`{FUV{-!U+0%%[Vp4%vnYa&?PQפ􁶎 P/@ d=Ær& Ӥ1iwqUq X^0P8q\6q'$<CBYq([0ib㴮0–dh4FhE,H6K~>}3:HEg󜻜}{{;뗡ݭ4Uvk=ܰq}k5|<<@> M{_1:stv!j0F` n N]}HDW*Sk*oP@ 4۶l'M4ʇVLp=M3٩'Mfi;t;mp_6rL5$>v_cSrhB+ÁT{a102M[moCgwKe&~3T Im#}l,fgkzUܞL z6\NrUh6ug/&uҽry>75G MәGYm'J.V{F[)HQ|5uj2;mŽ6 l6=D#4[!fMnp:`TYrP9V .ۮn8WEoM,~T*h#(jVB  !4N.#Km0+Y@*gAh,9o128/񹱣.mۥRlәttК+myx8=o.xn|>LO_Q ܻ|o4+g&VB42W[q݇5sT {XGvA+Ȗ&"|D}2FJ.;ƋhHNj{#XS^fs8_|&%Ku!rtuPǮ}5P[5#@uEiVnSz; 'î`kc/U@J2jp܉ fB}~0O?cѤT9*Qq4˥Dߘ%ϛmmKo7_ A DXx{ܱ+@4)UkR+;b')@Jd e@ %4i|)@Jd e@ %*tR)@Vˀ@J4t1ir- ػNI{ 2 2%2\b+HY& iqi5 r hVpO{"Y-)ЬPώ@J %jHf.&@e~Z@J %Zd2gU '\:7W>WsE&X;z*=7\X|qy6GS %B҅K tܱ3xzal/`aL< V\~z~n/Q躌1Bj RWQ@d;ŝ=UrljbTB!{~4|?R%]jf|9Ӆ?ǔϘO޹Ρ~/xQ-*Sվ jiԈ[ zXkǼ 㡙>sYdq968&5u# xqw\~]>eDW+]^|FA!Tii$H[V :lm R)z[r]*mW" ܁yjTIaAFH=v.t =ńv۫R'SɀRypi2ׁ9#_/W~LzJpT\\,kT b,&H}8+bcT~/M-u\6z]x +(ox4c~U T޺roت!UAa xb/n]<z;m?ݏ&p77|H.'B)=۱wޏw!-!UZ׫576ܟ=Stt[P|oZ{~X\卍zq'qk;͘!C>+ rm*Y|ϔa1CׄV3v47⭗cۆ5ؽ8I²FsOX~n߂Ɋ:DƔ3 eۤxȆ{݆&A{1,z+dړ蓰tΒ7A=M %s5$hXžIQ=*6߼{? o"54/V|NbyW~l݌{(J[:0FRjgԤᜆcѰj@Dn}P[[y'kZOW{|t!%s9A?1(xd z _J[V1T9N@HDPxlX$ ]Ec -$#E}Ñ{~)C:m(7󾆍w}[z'cB>Ι#s*e% <\24N B bx苌#B/`-q_/D^ 1o Jv4Ÿ55-c+ z0=|uҤ*gT٤x84ƣnVWyPA4CYEuu @J::e) kEʕ@}A#93@f#c{֌*?$Fd*Tv0m0bIHge%$qu3K&5V7܋\)fslVwz6 *ޯ iʘ;F_.fvIpJ{, )Ojxfs* SsCJ&T^躃4ў})sQ\ӁƋ#WUH٢=|C!P9ECVX+dͭKkZdI對B?Dt&_ZmLڎMë9fh‚|tү) Dv{>w;;PD8=oNZ ơ~ŕ֨H RBBC5 !Nk*g8;X:}ӧ2\/Ԩx<=eנrc/>,5-*Jr(HA )\T Ja c4Sf*-.c.WJi5gjCzܦ¤ƺx[ %H 08C%=l 9cz]ǺlcmƘXomlqFIENDB`fotocx/images/flatten-photo2.jpg0000664000175000017500000015255615247006660015663 0ustar micomicoJFIFHH*ExifMM*JR(iZHH02320100fotocx-24.30: Crop: width:863 height:311|fotocx-24.30: Crop: width:862 height:311|fotocx-24.30: Markup Box|fotocx-24.30: Markup Box|dhttp://ns.adobe.com/xap/1.0/ 0 600 1000 0 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((7^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ӥJ sǽER 1^ # {TʜԸWԶ4)$#ڤ HYxjX!S L5,VXdm5dF1shKDL=YZV\(j "cH?R'?WS&vBիOQZt:/^aji1>l*kXi1S&SXJx}\M/?¤M?›Ub4`/^{ \{fH]>T}F}rhd>]8m2u S9 gQAK5Gg6ăUv]Lu1 7e6|9a*TR? l$y<~$Jq\ HdPԎj̨#u*}1$j,X=VXdU\e8"#,PD%%T朊6S*;~U} x.557#>,{bMി ֩h*2膑k?OȵU*rD8L ttLZiRP39,? EBbZ( <>?š4 p~YeU{t+t8ȫž8=kPh1q =!#M>_^ꕻR}L DwJ},?9רJ=_ OqҵN*~9˗U}z}j<~tˎ?sVǣ ^§Xw3`SP`X1Cʯk*0{UKao(`Az4+GBǢ/_'T.0*DN{ vUğOZXu⣹;e||0Z ՙ'E:BtOc}Rfgox*\ 'xѮkg5 m/T)`RS8F4S>LduӁѧR.k<4}Jn>fY4I>Sñɕ jHs]OE?4YgK<{y(ZЬXp?ƙkK5J3 o#;wZηGlQ*f!Zf99V\Rm1}Na}jsNNTNpB D (Gڶi3.8BGSk '\ֺ#X *DK}ud`)n̊?VnkXG=jAҘ:\K[.}[j>´$U-?P[3 Ŋa :n/Ny3y<~[NN;)£#$ZCu43ĒT0z8Xbv{qWH+]O?XΔdѬ'$#&t+9ZV!xtWNdL̲<,:!s’HnLuvr))㷹w_3;9\~4kzΡ's? Ӣ>HX&[eAjY"ʘ^zP"ojW-6q隞on:zנe)i(N$M%(ɵe۽ *9ϧ5@ Jrt'@Ud!dPx!h&,hT}:gV]- Ib+M&k)Q*]N~LLC `gYG$MTdaن wVLDs~.cՎ\4atͩWr+171 *[4&Kbbk\2z~O^YQޔWyp mfa;`ڴE:wO3LF q@ 8ix)ޘ)qSFޫO$Ţh`]AvI  ĝw힟k>` tb(Ǩw>Y1ӟRsW\ GO|fq&+3Jk4ۥV9*b/u #(Ӟ+Ϩ+G AAr[qQ1YcSw{d Kx整w υP.O K o yKqf|#'9; Ln0p;q{Umn =(L5ʸ`3?HFn`+LKel@㟙 #?S@<``haw'u5WeT&3Vs)8@.+ i)=Pܠ$s5xd;$\~=Njv[;s@=1j/ҁRSdyE;wY\jsI@\++;*GA?5h?kU%q u\5O?J:Ai<]0;Dw0x\Qpe[*22x"bI&.pH;sb/L-s f#9ݷ t- 9..clʊkXEQ[Ga D@@?B>ꥻ"@L$ EM4l3:gP[2W.wdǧ4gTRwR #APv*Kne$cןҫȚ\>I'^P~96񴛗jɦs]@ތ&dl1vKKRA'$pp@俽Upt7ۆ.^Ĉsn(`@3ZɧڻxU;OCW(%!#PG 8XG҇bU 8δ͞Jlt&hk1@\KM@ppg׮?Zl4) }f%1fNco?\ևmK6IdZqvbֶSr71YMXmBA4̱گEchNs uO| ?(b8 ;Kb*gnPk`wޭK;EcՄEPL P-Cuu9꽻T;Nҭ*.8^M0* A>8$s45nߑp*Ӈ'h+ɻq'}tcH"-wpnA'jҩ(6_4w{zJdʴMgGJ"5ە(~ < y1NjOCi ,;BD~tC")RGBQIkw?W\W>!ѣſ!]+YзڱP_ 6kp}spfu:l&=ryK(ڈj"0f 8O^v!~$ns>¯@n.4c!*8=jb}T [ ggz[#KK$mBPcMd9'l¦fK]J$w3zRxf DY ##If/8UyLWk%.YI@~b14j׸y;/Q ){kTGہ~Τݩ!okm# Hc4OyXIC˻REx&??$Z% }?:gO Dܿ8$q@!5wPB/ =sS2rGĈ  p@igۻA‹9TGA$;AlNA\9"PڱY$;<-I<8#Ҳ.:Zc}EXYf/<`tUd,A$3=(GwJ16|T=I?ΐ 9c#GV}@4ۖ fv==u M"yLG͓q>\9R]EzEghʐGxOE_Ғxqs:;A}*j|%VsZ.yIG'+F&h$Mp"iLUp.Iy=+ܓ;1oފ9OTK}jQ1&Nay`O9ǽJibb?t0qI'ڵ6oN@3զIfv[xSuY ΥrY;;x>Hfu~ s8*$'*p2=JV#m+Zʞ-)/'[n8ǿ5e՚i *ʁn^CoyoF9z}?XD4Wq1nA:́4iLv@XdWˆlxሲ:}0hS\DFrH \k0Fr}Ti51Qm$sHYG4ѭ*ʓyԃ`Jl_DS;q>}*/QԧS{U(!ϧ$By$JMV$ܤ4}cԖ=L_ vMWRМ#ZN,f e=}U ȷ79d= a<8RIqjXOu#g[Lam1UH[v8JL-ZEfא3;q@+ wAJ?Y&@ZҤrh0H$VU].&kۇV<'jP/dr0s=?Ercɫ2bc8} EtR[Y>45W@ q/=-f4qG *N|YPr9M'ٳǥ?iLEv-HBXۤ!)#@ƒ@굉M?o4G\9W=Ag \*1F#/ԺF9n=]?&>d* 1ZO6ƽN,J9R(P+:I;E9 V+ߥH Fn8?JƠe!`3slM(#H]N:cۥ<q+kwY>ƞ#[%h=qqQ4jب|U* $zzS[xt1 30LOz6yZ٭WIgw1.,`9=9犐 [@ Q_>٩{2?1O F#2@:"h .S9T~XuO {?I^IYu*Y$k븶B I^H$ךPa#=,g 3HoYԡFqހ3Yu+qQҋ4w7d&w$_]Ll ;i8 Ǩ#Pә%Z`fvP2HN!1Ԍ׾x֒x ʥ*6z5eoPGZT4Ig($GNr}5zRGx gʻ]<}q\W|acs]rJNjO2Lyv̌I`8]'U`h;g<M.J,L#OLt>a$Rڽ$gpH'o;ðWׯ"H)cofrx[%O}%W~;wq)eC\'zq:gi@ڟfF 8?_ҥQ('h:y,VmkhYFN H>ճ>nVޮ/$F=EmTfXU'<>a&VU, ";oma{xpwŵ&z,q'Uu~=̷<(Lj#}= ;y`1qÊl2A7v-\)ʚlyU;S"ߴ;7Q!b P[#߶}K$)~7;4InZ)oМKҞco1]y ŷu!TݎHԳ 4 V ;?FON%G7EO?Znl+}xsv),8վ$iϸ9]U'ҍi#$uEO0,E\ڧjeBHRbkHvFpA9q$EtXZWmmggjq4.Dl>PqS恖b'.Rl B?_ƴjFmQվUǏ¯ԌBh4"<}pr1]?^ ܿQɁ_NRI}jQҨȜ_)4_ϥP{ָ {ָWXP_ap ^wN*;mĂ3E$TtgfS{w)a#5Pw>8Tg9|V]e%vR.C`S {Xem\ʻ<ޜz1!@ k9V$]YN#URІΥr H>T'=z~fXK]n%rHp>jgԖ9 3fQ䜏~&q" H>H>k:.9$$gJŷE3ܬO8hS0l$.FvvM#Rv3qoe qy uq!{ I| kqnr @ g a>(8;xoqsY֯-29x䘭಻9l܃=] ۞랃Jz| 3 ANYh0 2`@$#򩭠dV̌\[{zjJoTX, $r3F:fPXݛ:8-Ҫ[E57p@\ۦ)~Ѧ-7J2;4\޻<'o|'gvAIf6ˈ.QU @dyX18P-;Ci5 Vuέa-ji"l{U*A?ʰ].%0I$lj,u,F8P*[DCcan6jnee!.OЏPĵFdk1dT,ӵmQKhSvYWz~TeCDlyRI4E@ '<ޥƊͦܲݴ=44#E*t~5,Ѵ]^4]M~*%:/.߇5mV'$&@\e昉5NH-7j0LuKLceNއE$FM*v`J3?0 jm`58$Nsށq-%xJ-Z'KW$@䜃'6h2YP cc_j@ڲ=s?Zƪ-n͸S#UbM5-d²׎ȧӬ@ y'F1 F-@'8֐eݧt=TN[눙s}6#j0q?s@gE͐(oNuɪf4[Ea!*zo$lUr'JBcD]gkg0@ק0hDM+y'$uڰKCv]HNrcWZܩRv4"4zV(GtL ?+ V??O5$|b?ˡTsf!y8&MXIUSש?tm8WyBj•+G 끃nHÏyX#y<G#tf97uTi e^ڛ ry1D19qQ,J]9$ {K8$y%_G's0 jXVSd8Ǯ(,G!8''S9B%&E*KcqfȁF(U8t=vip )"03:P";vJr21Z6"8'3ՠq-mQ]8KZ[P0ˏa@Z5W+g;2OnM,c,Pӯ֑N-QFIUP@b Knl{0*ӡX̗YV@<})[[~}p5t6 60r};cYDeυ_'j؋c{xLHi݃yyTMmniy LNHAㆫ@5F8턬F)H@f3(mr:qg,.Hr'8Sn'!@'@NGU, *FNN~ijV{O$Icր+]buQpA+#jwy$d͑G\r9W̺}<8Xv'R u'~X+u ^OZn5i{)3n8VAk}Bj#eݓۦWqk)Md}r8ϚC(4 &Qd< q҄}={u{D&v;UϥNU#)/V;'Iē?ZLȒo0vbLtH0G )HWs~1 M &(\,g*jfH=€(zT7#AJ{TsO?isfջ"YF1Pįz}iS1Ȓn%1zs@]*[u2s:N'8j٬B-؞a0¯QJub:Y}?>VԒ_e1C}ޟ03 }Ԉ̐o$mne5sj>m|%T'rzLΨb6>܏~Jk%7W~[}vy#jK">5Ƿb(1}Uf/H|n8͌ҟ',9ق~q2{~Z&ie1sҖGӍԊwiDwqסe;2 އ*<_yRe6mg(ookd'*3Z /yñ qqW#kA%J|zN*sֻP:>íD^٫ȡ3#'R-ɽy$۹NCHc:U9D&veҠL~`$cLc*d'>^=,P̅u˹S Փ |.wI& mcRG$n-daaKuQ\8 cۊ(eԣQ(TS)?~SҘ`{־}k">SǃP:<~blJxcIe"R$vִ$ĉYN0=3JI4C۞=5V ,я톗pP8 G;?ab~)=~(趆75ҿ0, m~8 K gzU|]"_Jʡ\hG\kQ<1K-?(yq#GOzH)̑HVBg'9'$@XL ۜ0ʰ]SQ6 l9/ 뫩jN.Il^TH88V2ĐH9)5b0?~:'L Bg.?ќl'm)2x-" uj_9 1ެڙX}"zmsi"Я"\k.OBGV×&3Dm%☊44ͨj\ q} GF@ϩ]8 k{ @:~4 PB8?v@cPmrDd$G5X9=o^ ެcSd4n/ڂ}Y&Mg'zLV"X([x,3PSR>]͹PķOZ2@w~et $u;A8h ڳ]I9OQW-I9S ]]i>R +6ܓ9::3m1lGb ր4%7FU PwtU^㊀|\d N 𫎬ֿ9@9I鮓g '?m`ɩ3gs?j֠aHO!4 ?7io0z}k5ZOs5_iCj}8F=U=*ΜsurkͧSJPi $~kH4s(88~u=q򁣗 # hW:(Pȃ'$*if~cϮE9DT &:&N;RJJw `2H/.(uY0 yG#E:)vbSv j6*uI5I"n4j7*y=8=OH_ " v}})m:B|מRTF1/O]0"[SO SaMߡTm~߻ $$QsZG푤^U 1) sjɨ7=C XC9^ǥOt1C5̩{gHrůV\,"2μzh#UxS 01tSy.3\pNd{?zk>/%y<We' APzg<ҮۋV#$}hh~@nCϧJg4ț='#v:tKqsLYs`5u&mA>mϽ 5V._/Cr >pz,nl8ey2\n.89?*bki0vn;t[sZq<@4ؒX n=K)]zjˤKG(!r1LZ;LeD.xՍ5v 1\( Vd'#mBOFխq4`^g9!Vn~e#|BZDNT˟qb?κY4h sO5)rC0v EtY/c'Vfb>~Q1$NTҁ\v犾?^'9=1??Y7 ,'pV2T"M;Dl;?}I+Y{Y>WRN\~+i*Mqhʒ8ަdL$70yM2}; R=mV#Iٽ͊03U `cNFVYlYJ߼7"ZY&qYLspnwF;R,!_.~RG8:GJ? [yێx di&Ky'Қ)\r"d <ݑ(՜D2yfxSn?$㯧OOT[-uS1`@*H_N8oLXt[emʤ9ըVd$50pN΢J֪2i'= hyʕ;Vq=Pp$q{^E8%d|m˴܃S=€() ȉr'=IR(;g@+ϣY@+9'9Uԃ8Z}*IAO#ΑJ|wޘ->Y6Z=jK*+m$;Jc/卍jЌ">҇'#c@k (cV u]vk%7lp/zT}5\Pʱ0 ӾsLL#TbDg- ~R|9ׯX N$VSqH ?YWM+$p $s@ĥ@$~YO $cLySy||9Rq¹mb+H VnA'pl:7O2CƹZyC)n&m;VNExVfJ.>PI*b;+|id$\c=lg낗]l//U Eq9~+)IrCw;I?x?x nۙw/vqn5O2mX9b51?ktS._K=|=Oj#3E9Ӽ,Z-&+L}ݥ-!55bPN>¨$p)݈3tL1!^ël"ԙ#%g</sU2iINw k <lVSPt!·mtZ/ !A>fU#e `n&G#ğEF|F9>GEf R—Z,m4xROlZ`q4-6i\ ]'81zWkP76S\ Y# *G'ҐZs>.f3yzCDl[Fh|}z*j^*!i3(xg㌺:,wk? r;1Ny:RtVbJq)Qk?Ҥ1ZeWXsKӔwqҟQf5bԨa#h`$!&V]HpQSvfȊ6$۵#]"ήgץ6Fany=~2KV$f$(z0c{̆%A/z͕Tq{uJd0 $r0ZAr[c6{)#:'6PY/^ST+L;]|"avgkPO9XN^+,ג3_Ī󂲧_Ph;.M”ig:V=$Ec+9#,B{Mgi[_<>VTTxnX2ph3ổ.-YrWpdۓɫEİh{hZޤ\嚒 V8<9ij.@4,Q ҏi{D;]WqH^Gyzg7Q+ϕ=ޭIi6*4 p@qRx5d[I{JӭLu8F]PG Įa o11$ c zzt+i, ,[]ʢ@i1ZGq Hۣ)ȩem\O'Rq_gj\N+6ID]6a_ƴcֲu]\\Bv\7Lz~4!M.#VO1p9''ג:{)F-wc?VlטbCc}OX{+n伇,rR.)&JV`Is It{qiqG8')U Ԯ'9.́ʤ`P7׽Vݹ#l ULV:TҌ]78Fm©v#5̍V Bhn.Mu2'Qu}R9KB"hULm㝧= Օ̉%żr: )a /-%> -?0ޣ \֧qkꖱEq4IobA֭qyK,L /.$p{mL2^e8Q󯿨fvaF~rGּNdakdUn?ݸ~8]#ӿ.[˥T\ttYNZ!kDrmܼ; Bi$ۯ%]bd91QPE<7Q`sr7zLE#ңe@rw?VM"ץ:#nlU?,KsϝT5ʄg1_:X+( um6nQg Z"tkf4v &4@i=) M_SXZ[GJ5{4Ii!W3sjL*9+O1$?6|>:b'֝fZZ Y!wK!}OH)I<hIKu*Κ zvᕎ"O|#?JLF|SwluVeXθ~֘f($UAڤL FNTea2rs8#~R?I2q%y?wހ,tuC1ی!t## a2B* e$x5%L1W,2Tc^k X3ik<^4_֙& 3+8 jѶ/2@[RPJ ۦa])4Pe3T,cF-NO= Սw6zC `ʛ}ĶEtK3!]K6ϸIJG8;,$#`.3wVuk )Yp6Ѥ)ċsqM]:Ymb p;{1]7 n>d)tnuL[NGъNWls #~=Kgm2nXB@<'1\c5oswa^)J2;ϦG[^}n`񁵗F3֘&MjeXPˢRzkMBJ9-ehݜ,:Za[ukW|l;c[+"Dkofv}+g+|+m=Ըn7gq?ױG4iY$v#<ֻͧ5w V0$ ۶J#vۛ8{s֩.>v9A |Lk{?%i->O%?GN=ie>UseN<}3Ћ/PQc' tǧւ9w`O[{Թیzg_ZB$ItQ-9'j\B*>sVs@!h'C)cZCV:S֦>:ۇj}EasQ_24Ts.ZX?nc'U1U+&.;^e?zOQJ+`Cd`7ThCyy~qZ)IEek'if'fY[Xp8ցLvwa$>h}098C}mog_OQ]´iߴgVߨ얧mzJ$ZC4 ˬ,h-#K;t$imaQ;A3[MK9,ѯe8|F `29T64!)!!O`nqhö~t~kKkد'tK[qJl։m$VC#@)|LLyqҮg 5;&u"%_I9M]/TM=/--E7 xzsW])ʍ\5AvN--&dwHʃ,@})žwojZnC.ra'Tz5$:=|yu'̌Xߥu:Voΰ$wIn/\֣!g5+f>T4D89WmBm< =Nx1el nb͟^) qXaַerkVQ)8ljb!vf9pzcʟǚtsK 㚴"@OV@zLpZd((A B)QT0I'SDnsj m*O2=Ry93DZUվ %4%d (κm>Miq\T`Us,{a%XV Hu#?tRǣ:u"݌(yV4t`) ̠4^(rP 0zҷ<=i%HlZO9jD_qR6d p?:ǻ vV03sGk]F9e=2]ZMem瑚FѦ[3V{w9[E(İmnZϘSaE15hiz{Y sO"%zIZq"-ynA+˴󝱌jju>TXQclXh7V֚K.y K,p瞽)n}FKC ovqyΛNGb)$XgwsϺՊj-ʨyA.'W2lk٧m.e?h3:L6#]=G4Ee* R2:F}>z4G mH%uug2$iYà w*O3GnaÌ8yžT3ۭ13F P`ޜ=3?[.et%bgl֙="KLZu<2$"ےU@'ҟ&Iy,fTQΧtɕ$xj} ј0hfyc!%2z’ݦj) v5^Y`wAK#񭎴CHzƊ ZF+AfX%X!ާֱ|txֱ֯mǵZ ,u#ci<Z52#>njGoI$UzT?Z]C7҆,''>--6?fվq. #r(R8}jKo-m >HPdgw1O KSF@TҳuXHf̊P3u)_\]Fidm]IUEUgtUc%RqRj9y2>!ԆQ8(z}+S5j*yNJl^c޵纑S.Xy{סXPx f<8{~c}<=j0xS$xG2GFE<}irp 4#M6wg98CE߇JIsDI|afq6WO.ip1pHqNs[Wvvh]Z)Km_?GSP{"+J`eNh/m5hFL gM3M/MKY'Y[bA v;[[IT:5n\[n . JBr[u?lK)6@F8NtL'h#VnA` Jǧ6iacW>b298Ҡ{V]fv.<~b2jdLx8xI-*) ,zjIi!FӢiCmx/NZ8Zk*w~\?FH_vt\d㧧?[Vᕬ )a uO~t~Ng8* _v?Ҥ4GˍL6s:Pb$ XJ@ש %8 ۡÌ?s7Y,Q#ܘe9Ϩ[> O*СKeg8'FJ/ջ6,ձG "Kof7,n|I6oEaRjW[mrV $TW8ҨiF54=Ԑ*˥f߭12֖w8NOm-Zhz]>ZP{k'Xd(cj{%޽m$ $Ӓlϡ52MO,`QtiLc5\Ov4u9$L`F[׽]u[F錂$XbN=sӏր4tm !̅sSYK +V &G.~|{>қon$X%@cN}:P#:uyv1"i1dBܜ _kYamXV Ғ^[8(-:tX1-JB.sF5oJp58.ƽOFΰRsJ {8%}8\v$vxМgݻgQ/sY@gnm)g2;Ins8kF6h88=qh#8 T#2X)P? uc=8RH$N {~f|m[܆;gޓv)K"pwpH{~hr, NFH`]?o4 ]^cc inFH }+4 j2p<%ޣx,\^+]X12Fx5kѭVk+s&pr8ϩTS--YBK CN3Ү'p6}}(B8] 4 MYW 5r^yKhW@艪~rZA*䝽cڠ2%]ߖi|vWtcs  9 #VXt&A3Ǵ9'#9R+ץ^֝j341"$AUe 8895լ0LMS?9 Bȸ8i S@{-ZDR$(+^9AX49wZO!Gץu1==ؖكUr9x]WxWXS3`xG<,R E*A犭aN6.W"#q]\ Ȋ@R}L&k'Y3N1{%.缷y.~VUut5&2x;(kA 3#l<2,sDx+G֠,{8 A'`w3|=yk,2+pAU h76w&js 9h8c޿tkx8!1K"OR&6gY[&vAUZ(y5m B?c-uЅv!h?k)x&]VQEHz_u"/ԋӭ1XOƴfYqp=J,xϻȓbm zzeTݓtC@K ݐ7os@\if[X!I`;idm>3RnP(}y{,mfܹ#}:qmB7X䁷gQ`-g8ƥitvi/fc8(IkoW{g+cGPodjo`ߴ2`o/4c8c7tcd9Ok]l 2p{QM(%.ӎEJ(X 3M`~Tjm?ZVkCc4 YHFFI [G]2eY\FAp@C8: K; &aب#*]<)X$ hNjHmZnx34g:׆gu3eUp1t>HhbTQjH nF2ǞJ]93]9.P1@X}̉҃۲1ӣY}١W޻1uؖI w34|1}Wkuҗ,k^ h]W=\_Hzu,w㱮+-|C-Z}UY6PH_YNu[o ȍSq$:!45FimhrsGX{yb ILT'Z3ܼ+G.0t]nbX͜O[(ݹ'b4g 2\Ј۲qU-lyq,P8.{aK(];tڵ/[H/ůqj53W@n"P˷fBkk%A%W {9k]w$V6alm.gqk^avڱmjM2K{I,8g`'&4Fc=u5`sHs\ְp8t\Gf#k4j{WϖMb>ǽzn~kG##oSL㞵*{~UHL~yw(J^#![gv3XBWslbI?Sp3#nxoPSӾqQnU #8NpoSfCnp~.>qQ"GCާFO̳yGO6h5ռ>Vh=*̷#4BX'4ƛ{e£nf$sMSF5K"6Bʸ=#5x'/o$ι9i;$ \)l'}hg}Ijlh*@ۍMZ~t1{tA, 9; B)x#lE6qS}"2B<ݸc#1K]^^a%et`}%إEg4o'NO$몍DB29Vpξ4(X>>RÒ4 ;c᫷exQn'ZiWN*H=p08[h'He&~ ˆ%y+(4iWzHVԲH GnA EvGymm>6I7eq~ku5;'-[x>ӬiXlph4K} ~itM"S=l͍)r"=*kAcv $ݓWQ%Ԗ{;/6Fٸg v(@/:U[a u"(05fE74䶇6BG5Z?!]??<vb8CR]GR?\zSR/J}?1ֈ/Z5IcN @ʜO/ Ȋ )]öGZL٦ on6s9‰N񐖶rqz[kAo ْO0ss}iY-/d\IS17e,홊0s~Qin`ʖccӥS IrI<zCmc- yQaL'NmennwϦ}sV[cl3d~nT|Vv<$pA$ޝq VgF9'q0z9-m!k1/8̏׊mhRĨ6 Aݸqҷ<fRyv`T=Uo }~[W?6?j:dqjݤҙDp:1׭R7XI$yʫmsQދHBJq9:P;i/^༡^E2(nqT:xNN2Lg.H-$(LǡԲx!R-#e%H _q@N5gq;YPʷ:R%H_oƱm&EFcU מGw* "o4|B4RI<+lJ>pa=ZFm%U-s=ch opшX'I~o ƈ5?/c+}_/]j?Ykc^C%!፜q隙k:\J 3?LӏFMJK&ﺌ zU߱[pg>cCs-4,Ҥ  p=>Zh/cvf ,UrA1Z+g>VuFOsbdcBORTRcc2}JFEe$}FZMS|!# FxNƁXߎ(HӅՏKiq~<sG8zCr cEsH~蠚F? MoQOU,g_c>m?εY9-??΢diC攌*擏UЎɀsH ѧZqG% N[ ;Z/.|Mb܋U$Kvlr6ȯw+$!Sr5kicK@mYzXK1o9 ޣJC9/@]<6r<:tRfLIʐvKhmAx+'N9=8洮5[{9,YL o5a6KHtF)XcZd|ǰ/ul-UF%Pc=(Wt֩; ,n &iLy'w5oZT%y Wl-P̪vCz^;H#W6c=q\66Syf)kȃUL[#2flw5~ReniHqSkk}ՙ)du $YD!~ uVڶ=٭Z8,1׊nRKڀ@Z Ɛ񥕤7RMMʇ<-s=ƺRU,Q@ uu;+,Ǡ>>`Rq |ޟZaJZ̳إn9׬gH,v?xc?J}mmyӏ+w\[;Yp’XVL23q&Y"hIb?P#3VsU4K\9>jj x[3k]Bx=?mBDz q࿅#ŋ>,V$SMHto§z4Ǚ c>ա6%##b݃IVI$՟o*Щϯ|ڤ{[^zk66Ҕ}p:(\;S{)kt>c(9U1SŜx!yPd-u˵e c~c$OvA $$g;S[Q.܈q ?x9~9]ko9+9\ر[aydߓM64Z|F7tE5KI hH` 8nX| jw12&r"BG`rXsz"[m;V_$B hke*wL (_"`Yk9[#h':j`LLa={)fFەSᘤVWAy'Js~@tEKg?ҹ/ xSPGv'5hɝg ^Eh]ɇpX$Rj &l`Բ:_ TWᴍX\mk961k'ԓw6)!OO/ڒs4zNt$&άkY T7?Zex+fw9\w{q}:`Rv?.i|_K=P3y&<$qTdaO cg(GvmwA8tB e,B8$g>J1Fm7zz:^iopn,) mzzsIR(W $VXؼҐ9Wq9^hc+Ch&7Q>o?ʢj!S/ֲ|q׏<5|}k+ֿY ({9=GGoG>)|k*| -6Wxのq]ey[k!,=FMtU9r=b# 4Q`M $%bF9=jkw^X"0-NGʧEwr1Zm\*WƊp7'=h"鷛Nsڈ>d{ٖHp!Oy^*䑎JBkAo /M3@ưKo+>aXInvyNh;/_𭸼Q!q.2g=;x]dNd(-.Uř"GHo)cQ'6Aa ]·;Һvn#8X saߊV sz絔r:F޲ۈÜg֕η$j>גLQg<1N BeVEۓR>% \0ku9 u6 })٪YF\e{qS='w)8r~}5FuMn7 | F #"V<o[U!3F0~,>5dIe:2gldN¸qڪkͤ*Fev@{Յ|KyymDz! sLNº8EkY:Mn#H$Qᇰ;tՈgL :M;"/c&nH" ~#=m6RcMӰ\=֙<ʑ\Șmʆs\^u$Rn$1DlGĺx98 J,+uq$ ш+)er apug'45X.WM Nm*xTX#'#jH|ԉNGj!@a rF8(sWMοѭZ5xqT/ gr֢ >Q"w޻ |G?%KnrWewVeS;`,9~nS${Y.ۛGIi)r0qֶrDBH6:H_-89 1'S?JX[UTlWHK'ahnVIRVrlʑ݌~$|!Toŀ9d2iȨ7( ́9⦷Ouݨ1N#i{H?xyK?& 'ʠp9'9-w9xjxJoc1P#Bٮeӓ! igޖ/=ZM2$9uZYhQH<;1!8?C[so,).w\z:< [}܌?Ux2ɪ](x5Y\nea xq je-bGwUw&¨݂wsi>,7!d1M,\*HUA'#<w[&ӳ3^lc|ڰ 2G?%kƭ.35!UҼBHX=D#R#U+\ղǜ(+Z1D 69jɳ$K13|Ƿ9e-xeB.`h#3%1mwdN1!#:ij#ݖe#?{,Xn7ʱɒG?V`i*+FaAVsFսBvyt5z5>uPh0ۣ3+U8-N9]~+&53DܳFׯ4U^Pۋ $0uڇO8e 3X϶D NKSsnˀֈl6hNOb ;Vw( [<VId"{ H zgqWek3yhk7sNwyUT)1לPI g˞9ޛ[DbnUIB1$vHUq7 c!}H4^Y|i̡ OV8)f$R hbՋvyulڼO4= 5E 9 `>G"HE:ix!xCt\\yҲ9*ޙZcI=]QL5/V/56&pxzzwg1b‡:q׷nrVVVd}zd+4TKx֫:)B p=:Vo/GcQCO$X-I{gC K+}:-evFO?7꺤gn^J;^ߑ%ޝ IQ=:5$}Q 6Nc򪗷|IܠJ&1N3'e3̮^Gc#ր5kq"Z}W81jklh<~=U]KM[ 3;AJ*(WLGvmO$ F]oj~`ӊй?5RHbo #Oߥn4HaxBZ-rZO/ֺo3P 2ap*@>7mou1 Xg#= ^7+:W;$v[\MayH18??ZC5 d]Fy;94&$l-F'9Ve}\ Twro_UNY%HxlG9'$&4TlsA` ~:V%,cnrҳL^XwyIoPÝɦ3Q,2pO_~xsR3ߓb!3HɦDw)O'*IA8 :?ak+o&`~J7%0O9mE]Ja2ɸߟ@OLntq.*~MޟOTf6-/9#o_ު2D)-~?[Mڴ|̗a xKFp+`6>׃SDgM܅1?Ι/َ]_:5 2H* [uR6v?:9I ՀT~$1ܥL4NK!,qi$CN{3;G[.5e˸0'hDr{œ\6`( #kxfFVqvO\G lPՃ3۫<>C2sOՏƪlhcg9t*iiA%?0B/\6ai]Ѕw"SW&R:ĉ_¤/ʢ~'ƬȚN >t"ՇFү}kXKHsKiCTIZ#&lNAߧMph0y</zOH N@]zj5eRPg'9OΘr?.?-p`G=)/GSGNiX ēRsie&D`9v=jrJ?eOݩ`rAT)܅8'Ԋ;9-cA'?"+en}.(]pyVA.:xRtz舁qFy<ЖJe<s~ Itp@`z[Y1츌e^qڋ[+G{$A^ڣNʴ#߭1>|Do!cSMGhUӡ֤i\ r:5RGK|dOʐ /~"`T;=]1A@K4g8'8tF]RKZ5Nf}~QtQ+˪?|79QؠbͬtO|TxΏ $I=qTu&i_N=*dk5o(* ?˜ܛ5(8W,XE\'N8*Ji4rx -$_:e@lrGLEWRXI=z~yp;6\I={6~]wu(m%bxʧ9~{* m;blQ5M+2'ڪM pN}}:, / b #[uD0|)sM_ &`08&!r|h\R–W8t,q W3_BU m#;xԶxe̖qFN0<}+>GY5)A ciS $_Bˎf#4{m7 XҒ6dm}qvNZv{ Rh%[)#[&SPy%۹s΂/gphAGJ1UQS٘U:XO?ʭjMw$d=ZAau ҁdQQ:cБԥi`M0f``_έBguC~q9u RVulĩ: 2m+`uI یLC$13m;U忴jO(}E9/\16 Vςy -5\TDLP۱xSe[(w sHuF:vWA|%wNBF U\ TPϺLF)jֲTFScbZgs 2Xq6֚rXs~5Qt-&Whsj{}V)TXF*ҁTEc,ؿ*A^pW.~iݱg30}I=X}`[\qLBZ-gбqD6pxYЋL3)a#>´n$X%*XԀ+X+t#. !y?皴C.D¤o9Inc<(px<{U٦} 0 r2yK ӭ 7Q29CN)2YNs¡%\~3֪ǧMx8 4e4)2?Вo1jڐBiS u?z|R_>%.܂VlrVRNq,8HK q?YKqeq89ӭK=6P'q$#U[K=ڍd%?1K nH͜^H+0p0q4~\,t]~f&P;봷8׎}nd8(_CQ\=yB%ʐjрcvsޣG1Ϋ p}Zc7?sn-Nc<=UA3D2jsHRLRjyFB??8"Lu&/T(~TVbK'T }Q>&,>}*o^c,SAGjLUPI#}{cU-{!ɦeUccS0 8~1 gAAoee8!~X^ܜ[S(QPKsݸ{b.1 uV]prG4_`7q@R>tBR?6rҫP0>^}/:cA5%𴸱9 0:~t܈EIJ:+67xoրoYr4иT^oY,d`ǨFX"+]җ'?("x>!pFο07/1>u6Hɒg*_9/fMʫ'sh${ ꡹A~4Չ!-Ԍr͟^٩amL̦e`KG,+Op !_,$-eRS+2\'^ mQ`@ 9?*8w63_]* sSaixAT28&yCHdgұ-i5`>k|G0⹽#?/?qؤZ9٬D~zIbpZBJaeH&vm2ƥN.`cWBJx_ʘd9m5:N7zU=fj[Ȓ Wm~?Ko.l`Y|vzVӌdѷ@L%tReb)a༱.4a#4O]E*$r_NII.2 *;w ҵ># 4]2EN[3KQހ<hT n88ik>/2XI+>jSVA$$iV=ճ=Z=Yc=XOifm ;- D3]Jg+bʤa^Am}{f]LZxVva?*=F7ү^ic?hc)&?gv7kX#7 iٮ&?YSTE=~ֿX5\\vR΂n_o*~1$騠z7Q̉}#-OS&uK_tfRSqZ7e0?ܚ&84] 9pœ)CJR@)ybh˫i,ZW !5q ꖧYWtr;GٱG2g\gFG?ݿSSYYt ;k<_]4'YX# sGJ4Z컹) v1Jݴn7#R{H cԑ./ҩ+2WӦǕZ>{,hE,rsA% PiJv=q4R*\KIފ`->u^YN)\Қ @!_Ti~{5̣p|hYmi Ko 5 xD^29YB|]IxëSiA]w1!K?H_)s!B?Zkݟqč26o[{JuOmPک?J I֨^j7W0?p+ŮbBʏU4acԹz/Vq3~ "-u)ѝjCnBθaq1rV6U: -H[5F{UmRkM>Y4`as\4o=bi\J_guGs_,zh/Q{&{xæ'N2"g׈eB-~)@?"?h3GJ\Wx5iq?Mgџx_'>#14{&{Ww!/ǏF?(==N^|D?#l)ax~a+{DGK ]?¡G=dw&k^#:d i/0S ?gwW75T}pu[i{A&{]J6kOꗟkjW= 4{@luGy ,FMxk+\+_,sڬy wpI+ٞ Isּ15U~v?q{6{xlj4f5 TJx^^'S^ɞ Hk/S> ?ŸBLڜ x3lS)G~Q{)J>_|@?孹"X g^! '_k~V;ߟŠ/YzLڏeצZ^A{i o: <ح.tɞBkO/{ OX"'?'Q{&{xw'" /OGA5/ш|{r>EP/fOmKƊ)?g30Wooy<~i2ORMP0QE J(bv-P!@ORl`8kq(zښ߄@*dn(ٰyZn3GQD>$Rl+9)QLA);EF @$\{R(JZ(bMR 0E/KE&$;i4E&)1E0ޯJQ@ @N"(0ME(`EB4QESp SiآC8 R(4QL@fotocx/images/metadata.png0000664000175000017500000002512315247006660014566 0ustar micomicoPNG  IHDR>atEXtAuthormissiridia]XtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/tEXtSoftwarewww.inkscape.org<VtEXtSourcehttps://openclipart.org/detail/27398/universal-information-symbol-by-missiridiak"tEXtTitleUniversal information symbol| zTXtRaw profile type iptcx=1B1 C!Mߙ @HHH ?2HV Universal information symbol 1 2 3 0 missiridia 8 0 296 296 1 2 2 r@eXIfMM*bj(1rOiHHwww.inkscape.orgCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/0232*0100fotocx-25.1: Color Mode: mode:2 blend:1.00|fotocx-25.1: Margins: 40 40 40 40|fotocx-25.1: Rescale: width:256 height:256|fotocx-25.1: paste area|fotocx-25.1: Paint Image|fotocx-25.1: Paint Transp|fotocx-25.1: Paint Image|fotocx-25.1: Margins: 20 20 20 20|fotocx-25.1: Rescale: width:128 height:128|9W IDATxwTN]ԕKP 5Fhn$ ElDk]V[ggfw3wg7?fs9`Oȱǎr#3gzm) 2wAi7 n^OeN4 Mz 8r&O: ?eY,__V@1)[o;L'F!^K~}ݻ wOwԔf6\xi)do-`V3sg1gqx<,4}d.<~wM~DmLx#X1i]ca2yN~c:{\6+vF\.bv5@.%LXFtu@=)(@=P+GM8_ЧOn&6mkˍp}%Pi%B/{'SO?UN~j н{w.NUR؄i5 xE5"z D"t҅;3ϲm40iwd.b -9h`&jZ`5*j>#z}̈́X<DD-,O`o<5",J)x<A"`:p1qzifzZ;2x<~8sܹ1qsGoP~p'W`wcE|#Ȅߋy i0xQ1J(J|ѻw^|YƎ=.ed&gҤsYx@q0.MT<xXa 0+Z( gr Bo!x<~ȃǣ<#Z-L0O) ēBgS;T5o.gN)fPS3 !B 3y!.WtXj0''peS8蠁Ƣ]"ݞE@E{i@cp 0!Eڣ!B.R t,*祗^ÏS]]z3@N8g?夓&ҿ&ķ=NHz4rQ†נF(#F)@Yf1lP\)*j0q()Ei\1,@$M#Jht?{)^ML@ 2!tЁN;Qڳ'G5>ys:9l1%\tԩПXCR BGbƈGs|iu0*'Ũ-z !>NR1Ʒ&(+EǎEуͲeym8 +WǺk@0$???‰| mpwdcf{QFv`j;i},+`zs)FD"B@8v555lڼcÐCSVRбcG:v,"a#3#vԂ)%Rt]A#PƳOԖL"{RH@c#@Li`C~~EEEqIee,Xa>L; x.*AF[JI}}=PwPSR\RLǢ"|>9褢I+S!2v]Fl:B[@6/FVhfFcDw>sV;.]DFBG'Ԙ!O&~j{({ ދ1"cLQ:)-*,]ǫnI|cv)kjl:_buPmAYӝ-X3@RJk16okri_nt-:]G-7 _r!;IjSEDwas%3ֻJ;NM.^|e'eRPXix-Gyzm]]}7F'32 0rg"$4EN0W YUUŞ=_:vDžuuKh9# Vtɒ/2*xqzx0X.9*b7qhӘAѭm嵋_-[ZZV..YO2@2Q~;w_/77|#i¾~Z7ez]@yy9Ɍ2q6afjd'ƅg@СCֆTRJjjMnjPV:EzǏe H)>j\uFEi@2@iizWn]sі?jkk %~uuulnme Y^6'Ƞ 8C9N:em"T*if 9@`SO35#Fqf+]vȑ#2d[05McS\v;]D|?x ~dc'F€8^;P~o :UUU44o{eee8sМ ~K.%@~}:da5u])~u5W1lvB^^^KWGh]@˗5j$'41S%%%q%2c\y=8 ۂٹ {p|z\qtŴcnj{lkH) 44408v |>fJ-ŏ*i `T5Nݹ; Et@~W4l2 ''Ïŀ#'''jn=;`3pj1sl̘cst\6PZړ.%c!b ϧOqVO6nh/s7 N59A4kSO=|uي#DlR:Kt(ծJ&okYu* b<<h͆$5mPUov0E8Kg·4{P bΝ70rzA @'kR+8ՆF0 t}d A e{pvp<;k0ә챯4SE={.^nhhUcJcwd06֛0faÖ~s SinL & )f'w {lՏӪb^8 $a(\Ȝ ^Hd G5fFhsJ}0cSj?[8tilAZc|#p{MfKe@UmAZ_ fro: ,U i140 Xdp=1vAwQ6ps߸1zC3"TxTرc`ifPVaTxZS~j&Nj7q4661k֛,[n{))|Q8Xjd̃*kSDI7k`쨨} aN(ǗQP;F?TG"b\l޽grez㤔6ei"o@EP89ERJKm_Rw?3gvZR'#(yj_'H5cFf?ol F>kQS18TƛZvYũIJiT3fGFJ1=d$I)B\ ^a} dJhp/5#QQNP}~q:%"vz;ėRO}m94)M QE(3 XCD-"q.@q.jDb#\n)aPbzOf̘FUpG!Fx]hZ`bck(K75b6T+ԣbՋ!ڽzg{$Q\ڝeԢoBP3]  ٪?JR#}JJx0QK)w CPt4x0UU[yy饗illj-k"@4^/=Zc ybJ $ ƴЀN?~擭5ݺ.+Lɢp]ף R1ACC}?dڧy’vMzx<ѵk(Q58@8 w+{~ h_HD2[La[XyFJ Q+]ETEp8L(w 'D勥x 3V^ìoP^ޏAhڵt-عʍNj D7 22з0/yˀ^2<;l#&z۶mG#D":vbc&j |4>~p8êeKB\V9 <ԭcPRRBNn&DGKw44cv5M{ClN:b%Yp(DqqgE"{<M5-$ÆK4a+!LDHF" [kĆxײsl^x=`KQ"|wB!u]_O^i]öw0>ijjbu[|>#C{+Ap۷3>0N9C8x=*v> a& H!S]u:;˖uk5 ,dm;qph ŋ?ÇSڳ'PH8? ̈́EلcbݻwHuV, 6cvVHFUVfϞCNN%%TTT|r%ѳ>B ]נ0Qu+7`Bx㭔;1SYʍwK.,R!Wy4=H;T1vb۶l޼>ϗ,aݺ~~auƼaÆ|B2d"o<RIDAT\Ijs1a6mĊZG,%L#3> c?83> \<e#^IENDB`fotocx/images/smart-erase2.jpg0000664000175000017500000006646515247006660015325 0ustar micomicoJFIF ^http://ns.adobe.com/xap/1.0/ 0 175 530 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?!&d#9s %#֌F>-YL4rލC z)G~@ʁ eHu9ЯM7-o;;qFA縡0FY^=*HF d!:RqԸ;G*W?)68? E!I99F:{ߞԼ=)Yv8➓bFj1(Xl~b9+k)l}9#JxQ("+V@E>1Oi;ҖaG֔uO^J. Ǩ斜9iHi69'8c;Ҹ T@v'*)G#PƉ`q*sJ{ucNjl 튮[ȥ#R`$ml*ÑK%t I5_҂il~Yߐ 3}hׄ ;?Q0;U)e_.##dc**%Y$t/r짐|8+^Eq K*H2O?8Y[Ycb3tedQu\o:H&2s)c 8<+.iJl+g+j>uOy6N ߎzQG>ҁE1h#[_1Y{?5??lq c!U;?,+O 8t8g#`5sfaF)s4p8*x^å+9Ҕ^Zvx=}qsco3񟻚 ܲn 8ISަdnF P28i=A l.!-=&jIswdw)=O5$tnvnwM,fc NŅ2OK8Xsӊ!l\x^-RG@󬹴9)b/.ޙmi$c:~}mlN1 m2EFz`qMi+ nf.\櫵R2 a^CJx! ="FlήB6cQ,"ނ ܒG;~&B-cpAR2Ht8Vavp2FP6~:m rWi^[WykZ4+Pa1 +zU4f5()<z՝OwKyeC޹I0ΥX ў%nP Ǝ /~ߌqJ& zF@HP2FJedHd U+Uq1o·Fa gƥV.+#\"Ny6;:HnR|U=?+m II+Py 'mnHi.r?tq;eyp *c}}+T_5v*`H"UWRsդ+IjC!x9T2][@~ƫ*c} .G,Qum RXm;dTG%'[]IY1Ͻ q28Ygeyc<2tm-ܶލǸk%ϒqLV 3kHn f0i&G@D}sڽG=ZtX2D{A+/G w9 WK`g,;kRYsi!96:ԍCZ)jR|3*[joVQ![Wl.'bp_+fIfR yUۑߟ*2G ƣql m'x5fig^(ed*A9kLik-*e@ t8n}+*g#:L-4a+ŝ\VYe22r>oPYO<7nh؃qcOÍ7JfW$}E^H4I3a~*Bt=YZ%Q. R"p3j32Djw+*FUԥO]U)eJsLe q7f⇄&[L u>R@rں qgBDOHn%GsNihR2#c͓;[&u.(}wz{ۋD^[2=EjɒKDkh0̱ʻ݌ᔌۣ* b8W+x"e [Һ8ێqƦزcNct:.H4F8aΛ`+< M#g =ڳ,t[M܌SFQ\^%˕poZ6f3 'BpdOZi.b|^@GKAv{.p #UV$Dp:{jzˆ]J˕~:`u!C09g@k*ΌI$?ѯhe2drF*{Ta_ʒv ]FB8nx?]f,ŀTfh?6N{㊰dSԜz\G^=w֒5cbmD6)?Jvpyǭ,VfCsB;})\/jew!F8;-62ݻ:_fP# Yz=mHX%Yw9'G#j]Yc5I?jO&F@pw nF3[]$ڟJQ~`|Oc 9\2FɵA#; bR36m6/8{{bkM'F7:P夊D^DynR{Z[haפI&=tَ 25M< 8jp$/з"KBy=n{(Z.B1V8`pF{\ߖS;q92:!b4fkJumŖ qAp-|| 5b' 񞕗њrv]#0ONگpO㯬m,x%x'=Ezunudk(c={*QqS/-4H[r:cߒ+mk.@]S?VokjWpHM2e0wlLDF:1vzJn潲ctCdc*zO~_T}SNd(Dwo{#"FGU,4+=钢g@Bdu#uSjH*9A6].2GV6kFYI?w'9_1Lh?V|gW = `[jjE8Yo`{f+PscE=s˚ oncK) D8Bmr,)E()8ǿN+ j^#5c%+oOx(ŹXr4-,yIuF$pssR'5SA?e;GUg4ۻ* SPBI*ÞqӮGm8C8֯rZK0,9`^f7tl0FA'֩i$w1F7Ucہ` Ǯz?Zї=Y#&[dlq[BNAU>ޢb6qنryo鞴jϗ%ɕ?:𮢖ºKx) 8뎜gҺ;i#A*0G'9jFgg.{q *9vˇa8U9GwsA(09 yG8Vcɻr:c l7l5uk;e$Aq= \ `䟮)O$y؟X"ydk0r3?WMBKh< dFU9dv+jsΚId˓!8kSR?o46y{קS,tVXnCT\Z,)nH_l{TN0#)lVL%-5-'pr8zⶾ!we"0T`H9G^쎍)bN\xl|=x[~,j:vy1<*R22{Ǯ+Ӻ5ql$-*O]DшNû"KWhǙrڽ-yw#OmTdwjQu84LjX XEϠ=X+v4=YrΛ"ƽo&o=cw˕\ a]bΕZ8<N+>+=F{CWKK{uG_{"Y5PͻvEr8=QsS HLtJ~h[;ed'r=qTt[M3!XŰ2NpOs¶`[+/nkXؑ#5†e<Ǧ*+(ɣ"':kj94cecB&XǘoZ%Fh0[vW_K)Ÿ*"It=}Bc`eV?{ڭCK9ךm{DYd/כij.NybO00{9kƥmm{7Epqq1ylv;E̪5s[U"O,Hٽq]T"=A==+[#b^e#ktY]FfX]`1>ҧwg8_NuG'B{MJTz.'΢<ѷ¡[9 fB$2G(R{Z\$W fm-#n^.Tگ$u"K 8Ax {{FaҀ)݌fdQvI={RЬAQ)8=[:"6 7$HC߱Mo#IkX.{hZ=N_ɉ.:cw{j\iZŹHn2p2:Oz~ bwdzqEګ-кc6B͞kJٚ@Ec$g ǎU]}vה6k9cV#r1zOxBYcG;nSR8}MJgPc<=G~V|oUc{7 !N}ҷMIDFbu@HKvc>mn], Ic;WCc%h)9R4 p$!$%'Ozs+v [\ĉ*lÂg* =XQZ \f$Mci v.ӠdMc~ۏ9$vH)pxcij$c9#bu8HP@8#5)6ub}/Ct}wnbEܠA\XCghv95:ra;̓a*v!=zu6^FB3~TR6 Q[iv[AAW.LPb|wi%C0eESq&\Vwbqzt*Eo$n Vic_21/r\hZ"TkkѶ$^q]?t>/qtST"h\c ,s\֥]Ne܇8qJ&e1[XʏC:&kt[bq9>X8))=۹g)#C?=?uh7zfxq#;9A o"Y`aNjX1^D-X"ÚM}9_1m'Dws4# tMuZh r?zE:A3g6V=ҝyi~̤2q!s3ӚvOvkcKeމʑGN0#9]=f}p߷Ᾰ[c[*#8ϾA+(`"47r8sI节osލɖ9G*$#>ipcmZ L2U8Shq6:h]9ޝj;nw 4lW'r4Z)qM`e$R8YȖMPk˗h%OFېz =JV;!Vǀ8$QWcБ5Vlq[,sQU] ,s[jZe9(g;֣~H覭9t3j=LsU0dt{GB Hf*_V8NY[d ?M*ӏi^Y`"*,p!`:`j1I)h^ăC)D[;I#8?Zo߇& ZYY1c`% &--^W8τ?Wy|t?Lg5L5Mc`8=Z6:՛9t$FZf31gh̏h9ߟ\{Uu ZR.҈V9{d9 yW>&uX[y.Ç0:g<׵'JCi+A| O ُ=tFƌ~D J!2rMliM] 6(ۚ$¹㏭4݌FkF޹fŹm:1>VnjWWJdY㿯$uR n)y@}pUg=Jqb+= FKB#}hviM TϞZtibKUSGEuZ n@,f 9O)ti[Q:{HlDp!76 #k"hIrه9dv5s2%#*ہf2XW; #$KFTQ݈7olaH=X%F cnԭ}Zh (W3u4%zvS[̿Ƨ!~MvLGx=ӑ]qFRg%$0f# Ozk$x亼pՇ Ew-w̌TeƷoMg$rYSރ=zbM?Vg@qJu+3~R$ֱctB0XHy^O`s߭c)#1_$6FGB=?IΎV/< Z:#[,ϺT@rG6eyC;[]Mc0#ƳFXmV9EdkT[;KpFG\>Un.,[9*zWmbyUʹvOI92d3z͚p D<9yN fʷf&|`MR0/0DuN} z2ND I*pcOҭC,WjԞ$R֢wv!bOaGU'GImjF\A]鶷r]X2ֳ'&@-iT|}ҳp}KS] ,N=2([Ϳ)r:>Y<-$qfϨ\ݼ! vƟ/4{~>k!=H9̾qve'ېJĞxjfKxq߭vc#iO ac~oRcȌFGZ{hHI#O WQ~0zwHՋAtY԰?0p_shڍ f@{׸| ϦjV2M}H]#).VuQ꺵H*f9Ͻ:4YŌ9ڭMx DZpgE1Xn3I"gldt|~+ma#4^BxQkiC!sQ杭x8RAhC2 1Wpn! bU t== kNݙkdvqiq g:ϯ֤ZYiM#Feu?Yz7^'{p 5pq '9=:g-sg;|ÞPjVZ9g-^[~o TSԣH 6jwo# z³4[R]r:z.Q(dLV2isGץszֶ* I!;k-18Œsw]JvDfEkN:hoB{av89S}hh^"y/1q1̗ͬ!o&@;UqcڶtזfklyA=}GN35sИosT*6 CVGodIK+ Jd{?I: [[wAy f} )[ךmD2+Elj%KDo319Qr*~ztCi|z^I_>M+caӏZ;0oK&qﶈq:ϩjZ_(Wxg VVe\v\ {u~pF~4WT{M 7yGj3gMngآF ?T:睤7\O±.7v8QJ^)˨ `ӿ'W[yu ۚ^47S F9=^yC 9*S㝐> 9SШ3|?j6̹ܶY0:c^mL1꺖#F]:YzӼ4`yy!_ NϨu}tVR9-p\C.Sk M\@!G/ڲYH}kha_T8 *M/R̦px?Lq:E:]8B{NxQՄ7QZMeIj0KH+>WA8?2Oj/O儐(68$XLZ=Nק?`q ege$zsk:n1i J9xg/΃=-[y͒7 nr;q_M]Zu4#,vL2;OLw暰(I4sZ ۴v,?kcH azVdODo"YYI<`TeN2oF^\F=9'wHէXHUyNOSN^gb4`~qY:'W?,1NOOjM/Ep^=y=O5i2sz`8!`֤Kk{) \#cE y9zpqmF&] ?{ՓCupS#&яsԊK23>0;Oۚ%0죯,O L=3[An5I2 8䆳5نC$<❮k#HbarZyiB3n@ƺ)QVʥNeQO]]%10;uvvH>dǞQ&2Ǡǯ|vL՚ѧϑr0cSV*/} H ּ> !S\l`u_]뤌 P,O?\>Oh a; {3QJ:TCeϦ[Ku",sx`uR|H-b+yݵwXZF#C$c?7Byr3Њu|>p8̈w3Uc?xwQngt-BH9qjޅKHmcҵ5$A<@9r1^?>}i*ǽe& Nju 8ٸd3~ d{"G{`dIǨ<ǭbdaOG%1&1^xt2]\oLPc` b~o=꣇vW%V12]IR2nnH-|uCC%zOcY+#J$yٝʾg| %*#!!/$gn2Pys"a FF$ pĝВ 3A$ꐾ܂DL*N^T[ ̑|Qٯe{8i%b9cʮڗb9HT)8g,Ӧ}>D4x18z+;/<#.jɐ[%]p1uUo k-AQn"/u4eƮ .G8 mv٘JG[xwP1ɮo"AO_u鶚|@C0"P3_>EkZ(Y-hn"L~?/f:kkC 8\n95.'P)hce8SV}Tw\Hӵt_\4 zݵՄJCnnJR9+ rVfJ@G늽XW^!KVL|v5qZ ct=x$EՓ.ut3֎Wp'YbA$1ҩ 0FF9'篭i,d t= EA-3J֑RA31,FnI5o\I pt#Y_l&S1NDBw$V\vpЃ*= c*\j JkCal gI (.3 R:LGοYe GB[ˏk9fG:w8ϸ%;Ƥ8MQ𕥄ZsI g};Wrs2?u 4kۥGp \~Y_QXRqk6bӲ9(h$#vvrː)?vDKyhI5G$emT@*RI CKQ1|yyY~gZ^ :<.0aN+/dR{λ 4mdgF+Aj"E{@#m#>W^Pp'ZbL{F?7G)M4{sv#Bf9T![A.jQ@#=qA.% 0?tEq$x0yٞ\Nby<5kVཌzzTھh4ӬYs8Frrd$J tؘ$~Z{3] i\{k 'onݚEG,9~ճU8[Z'ieOQ0"9mչ٥b9$;԰ FS+.w{d>kMYv*@n9T4nF}jxY<QH#wp9['4)#uUkk}$gv>POI$voYѰy8ӵot Ld#$x5vK@*N}p}jC侤v hIqVmlA< 09ҙmhN,:rH ۇUe}\v--J$vH`=Jɺ(g H8|#k֢o ZZBg5W)01JGqOMnȖ=a@6j׈$ `_oZfVIs3O1'~- I?m!`UgMAuIą]pA+V?sW!U2j}Jk6V;% 1~KiZT}9aW)as[lm!RJÀă{Z&Xf?6޸9OhZWvrC,2azs{4}2-%hǖUl8ZxcP78ϰUIHk<2+0ݳZ:h go=~vsQҢUe($z>,-nE p9'8+>*]>co%I=} j eo'x鎄d]NJ ejvB XX3,կuR|9X @p.xVue6Oqcd1Gi~#7Vuw*qC+p ܗi Yhb0N;OqUbG:!Uj>H22gy jt𶉦s HU Xy?JbÓ]k#K[[b68$zm%DyZns*չ5g=w,#'5%սQ-#lF99ȫw>׮ ), ,IO;=X𗈴bSO ;Wӏ[_ j?ZFVB {dsGGudeG"qQ^ 8Th؀}I4إV=N}YX3FV9".i?ӥ5h1U y"4m3N̙+Aq* Pp=Gf+C5oq r6SΪbSܜsvEE/:H #LX 9nFT))^z#UD1#= 'NVv: 7Xexd(c'!!0CAۑb}f7cN6;}`~3вGnD$W,s^J\l $V  g_-Mqu$J~FOS4?% gpVP3ךF:-ԒL*1\1WJWw8lcOHҼ_@إdZjqgG$S]߈5-m f,.aךTrz=r!ihn'j9 qT|Q{ ϗ l'zl"Zie@#G[r>+Ϋ,wZS'E0>me@%HӼ% d,Vʰ#=G^513N`YJN%t\N(#MoӡiCl ǭuVq}UHNw4#;ː MZ䴙o}j˴4ǡA8kRM"Iw/Tqn>n̄HR61$vSE݂]Gմ kI)Q#5%+yL2]9P-8y7J(2yhۊpOQxKXkKx@@9'n}.j9"eݥsۍ$4z+}_2}x~F{,F'gnr`1VφˁslAW]{r X[#}_uc!sPGIW$)q, +.m&Kd 7G^Adcڦے-ZۛDymזBo\qPPB3=I>cs#fK7 G'$ eb12O֗2]Gfeorn$(aZK"p0Fs?t,{K 9>;Tz~䋄 XeH"\nrj#4c%=G*eQ , F+BF9u)9){[˵HUW;FUaw9rEIo׍GzFjtn[XZ `=A{ֲe+Ĭh;{bl X0lVuRbqG*F[t$Hds9iVڥw c9Ur@ PnAWAi ӂLմ- 2FȧaPXs5jn S,`PW6ұ Aa?,*)R ԑ쳮FT19e.riK¸ϯw;2[A{ػ07=G]q$C1(rqʱ*o.L l-Kyϭ-wp!V ֤\:K*~Zu$K`3֒١ya2Mã.R[Zc?Ĩ[^ ғo#E֟g,Km,Lϻr1L0zzfYNԶϷ09uS|eAqtncYNG$9?-jٵfT{8v\2}ȧ],FcOSM#S$u9@e ;n? ΍׋#qK 8t#3ҾO7²RVFUу-ĺ4a[k ?|mr1jڶKY$4qJٖ>_z Hm=OEDeC FXUyiEE+51X=*ձwN ssUFג]$DѰPzЏzk31#g8rhDW]V:T,0g3qeIV 1>W 9n9SD89cX2gXQ$8l5i_ BAVB> _N*WVi v @;=?JmV|v2ǎ*5լћ-.wąTʟŸm]yh[ ԁ8qt@3vW\$.NK0N>JL=Ns$6xJF =~g 8*vrr+:SɧiLPϮO8kXu1G8*4݀KlBBiVB>] >ԥ8ps*h>Hd۸\ΒONN{q@o*|Qu9'7#*>[yɧk|勇mVu2Og$%<ٗ8VII$v܁ O4SS33d+J_Yj1o2`w㠬OH̱H\T)..%e2>woIrO&#i4M )w*KFX,8Q#9l8!GVo$?$=nZ>ZR 1В[`N kۉ[BQ79Y۵Hn?_ZP[0@@OR[ki4hRSzds)4ނMSxo59U {O[~M&D WePUOyǯ{{%\[K4D@WMwMԭ{u >eI[w+<~EBԑ]եd@sás=+k\$Y.R6e3Xid8']Xk/O"ܷ"Zؒ5V$A⠞HA{i9*G_ʩ_^9d;,XePGt'(Qi&bn!BqY-KyRAAHN{fyˌ ejRrPNz.Vrhw+A^};H i$f޸_cz~x^>(Tk{6 n󞟡j>X ^)Ekte-*'.grNVf[@ #o^xtڗ &ǜAM%g=݉óH +#+FGر9p;Diszֆi#<;8펵9%&4m.%9s ?&ikyv>b`W;G2av^E6m9*8甕HϛJ\A$9%N>l:R[qq=»kK@H 뜎,v]Hֈѯ|L-kqsY[ MYsƫܞdG 0su<^c,J2;Ha{[o#kv^PaUĘIO׽qPj3NcY:=@*k;;@z {5lO9,5N}膚OYMӸnߟCH s]4@ʉ #?Z7Iuseh!IHav+HBl P7; 1MhZ,ёWǿ5^YNG ={hAҫh'$+-d\F3ϧ4?2&b;sZ,GvD !G sS%#.X ѷR<ȪWoxG# s𭴑#ۃ'?Q r OCվ h lJ+1iL$wd[~m΂%V)IQ~eܺk,Vp מҬIkp<";rïb,嶲HEgzN7~Qϯj◻MIbI,s.^x#Tkq޵Re|':guZm9!)۳ZO-^YL&Y?9Q9='jJandy?y4+yo;!G̒(* {Q:f9=8vzj8@yZ&>T.`%:gT[1A㞽*w5@zufW:8%N_NGdfmm$8(CF z8ZHitICULU t48P̾{u}9VdH#Qw7Ɔ7(/G׊]Jtnqӏh((R-9dD61*vO4EΠE$Nޜ[&ppOY!kt# Ab k k[EIsZ%awGB[ns^~@mU-\C30I]ym- >$=7S{P| 3)4A-ݯ^3{OsoVLs15F kKuy_jb-EfH܌3Urrp3t;.$LK0'9ϷkKŚhEr =BV#k<anyy)! I烟j9gPLG]6n/$5- [>KZ7qTX-,ɞ 8j){l'>Vfd8= \v"^O&;.= 1 2 3 0 8 244 507 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?籠=#e+d .FZ|*cr*֜U;_s ~ƣ򗴊qfwr Fz{MRYQnJ8PX~5%%ITyn_L$fq~ii4vcWb/Cݠڎۛ^,6lw;dCּ3ֺӹZ~(4g-!li-[zW"bWYIu @?x|UkS5*ϖGj<ת1lBO_5pO*|=̥I ݐֽmUUP<֬MR+L09U~T!ɤCƩ'4g567^.f Mkq<1Op÷ojm|=hLpata[WJ)F)OYz>l$Ĥ3[Wk3*^? 4i8 1^{ہH`e0z1r({ͨu"p{PTmT [Ӯ,5"dHf++'}ҺKk7Ow8c^޹oIkѥS5؋{}k[I6l;b:חbIטSHYQ9*򸸩JϡQvS_!JdlN;`ԬNF$W߉%@'i=q].p#pU9ld|CKM6Un'Ocڼ"4i)+Ծ1K,»A/h=Wet(\b7jFGAVDdQ`nQxx9#$^+ES|w=Mb탞NynpŽx]!O~ ^U5[UC}C_fySg`tOPGcJJ桰(Ǔ浚ԉr|Gy~UOS?w̧?%6=+]e?n ¹Xh?bl#AG<%xКm\RG/t _ƻMvcP/ك3W_6:--6qqOg"I޾&U[kDE:*I/<7yZCـ;Vl9zo!e 4E?J zm\齍mN۩#ݹ#,^yct/-"[Gf5Dž|)XQVs|0Ҭxb)EaV<ȦxJ)]U* U\qXwdsm,q{֕M"r`M&Ҟ=䩝rzYz4ʉN{R\3Giiq}#G[>Q; r|ej#cpx312] ӠxӅrGc^iٗf۷n8yNPvS|̏g'ԻUk5?^JF>PwF\ kۡc˫t7wDĀ1nh¹>cQ:>o P :O_K(B>^#qvwnOy~.HI"Gg EXؽ+mҬGI QȮ<߽l$ q$mF5ĻoRpQзZh$uR#>£*I\׷N>)-.rwe+&'$ghgb&{S }'M)Oj|)EO~`<-0$V(Q W)aFbyK*J281Ul> F4nοOW7@+K(#0d\D7G/.VeccWvw_6ͷdָ`%Ew": 3X7 .c }ơ{%V?ֵo._%7d- _y%[VPѮJ;+s>9p,0n*a0W7=XɧpW=;V_b.uB>9{Zo b k-1J%GQ_G#R Io6^~jǕhRw>0RafTVV774e7!of 栲X1^@[}^jXVV#IRNIJϵk)nzu-XgحЌ}ɝI?u"yoᄻDn\{6a97GZ](t?8Xm„UNP 9U(3 { ! +ҵDџ?ElWiZ^70s^ j:)G ƞ`RGO ۳ɠ W<]Okڝ,z>8*pwn`g]j t@nׇ<#q A$l:H/1JyZ΢򆈐=}iW@SzEQĵ:jeZRqW>lbjܿ4PNM{Tyu'+Q5d!lB i?ңxO]=)wY0:>q3,MJ{#pTcN}Yw*+^ 01pݽ(+'hÊ$I2}v᧷uWv V5D<kUe,`\ . ƒ劋w;Ma^C}Bǩb nzmΨ/͓AMJ%ұR|0sV%1[ddwMEּ\9uc4Zj'*'OUL;Fs4Qs.HB5IB޾dE?_;!`XՁ}XfHeg[ɿZb05|PW&=wÓV.8bsJ:ů(ٺm?]|᷒ՉVئ ,>VWKDzqԧZ&wsVbUyd&u3v+cs5r-H෭tSF 39[vVuFR=띛.ĞsB,@.L~fy8*-:iAץR~x2`Ua& Bwm#޽54)KA'FA# ~]hЖte`.X#~N{;H+AR7$+=gv *w8[MEU$d84ٴ-#&RgA殾ֲyvd\jqr9ҹc𐊿Q8NjKyp3Sk l֕CpIt:$B_FƹM`d*] 3_;8);\&'88zMZN+/ܿhhAOzeا tDkRjQOCJ&n5yȺmIC }FtgoO -LoaovMsw dvs޷٬繂i3"Ci)cFKzxzU֧RfWe}7T/GFzjzK%Ac!=ozR\nW O֞;Q [{DqIwm2I+0<>/Bp;uwᨵ??Ɇ7v|`#NG 4NhFu)áU pqJ <ō?Ŏ+Ǽg2=O\%]9}n{^tot:X䷻[ufYw猏C\N7]ͨe<ӕ^)ۚ?i\1B9i%nګxŐx[:ل2žq#''u}+Kx_oe.&yLh>Df~XF6h&{íOVՆ5ķv5y u#r0:q^_ȘYH>W}1jV`l sWkx4z]䷼c uČp<7yV7RjXKC}fk:ILRt=Ґϐ+\g]imn{gfvfpRH>^(վ!P6Oh))孀M#+ǚgP6oe.Y&sӞ*ds_URJ|'Vfc{YDXwKSPe, 1)qɪb cg%NnzCt{U >CֵF\A7rso_j*KAͫWS_AFsp;x\#wng̗ks[pwFsmDɸa#iďnZޜlbc{HT@V`|U7b)яvtzEƏ/t.ԓP3Ir=+K/ӡ} I}è'xSaxn4+k6DQ93CiỸI!bKucwPNW-~zRCxQnra2 4Tn8%2ÕzVKxKkY㍠UȄkQyuF\fOk-t]p1؞x Eˉ\4ye(}}릕G$qN .5*":-F1V|ICi XY1Ԩ5CIu_YFAj.%H#5F0NuӔ: ,@[dTr?x\ec#e̻$ڧ_g>^ۧEyc*k9໶6@ބd@oZQz6HrHQ^G6ɗGPLz:ik0+-lo ^2Q$ӴOXO6ҏxiBdr{USMΝZZ3;2͞VMF -^x?6^CyB gu|r?N}NK ~p(ZwCwA"A>ɨ"#H~^R1HjqpU 7ȮԸ;Vl(9?j}׵=TI-V(<vQ[W4Kf,l$(H%O N[j[I4RE,Jۙ ]gO p9UBx#ŷ>0exYcK[tJe_œ>O^zt/_.q?-P[Oq 29玕o O{7`(v :燣Gt}:n-6gd#)'pKP{}BaHrdd8?Z䮪A4vG %N';O֛Yiztw IT!*y͞c#沥 wI$AIy~gN{|”]sͭw:E3sFze徯n'KBGP}j `+IJ8?|7L.Z &"{QpU*Absezf=st:!A,U[-dYL6QWٍ)FyR9&Jw%ͣ~6}3צ|T5ɏ٠YPIiqہ83:jzS>nnah }I! JvN{!<s[ 9q_ѥg5;؄ #"P`uuKUHqIϯkeO)m=~NZtamʸ)VvV.RC"gݳg5i5_G$lyfFESrO_aXJ+Kho3Q]q"v*}I[ ͦ\Dq:O,3>GnGך{m+Hӯ>(HoIe\AT8-s^\S'.ͧhm<dw3Hۛ0e|*֡ [wd*[88l3c IT<7z=q0G++IQ(;I]0ۖ-Px}eNTyTmnf'8'O< fN e\0Jʙq}^?k> J!$~⧎m=ԬID{=K6}+/yRM9r^#nvvqni$1lק|- 7F[vc$r=׏#LխN2pf8,' L֝;gx-T d ?牂kD:rr| {1nYF@9?eVGG3zs#0lߗƷx;"&Ǩ ζ'B|I/mˏOOxtMQFd13k"%JS +䶾m<2> b^72[zp5HcuhK9`I`d~ĝsz u%֛t$/cp5^I^x'cWGQI\WGӞӖYXdǵKw/6z<'k#Mj|B9;Xn#+g[$YzaP0kܾ9xt6K X !?낽:8mSOFiUNs^7⿅_JV+;v1?JόSSd/.E H aa뭶 #֨~̘7QӞFuRi葃 ]xKQ3pKd0 I[oxsUp]L䂱 | WjmZm"MX qzsjm{pYO_ϧi.d[b44XrH\g Ҥ?#V5Ԇ>a$w1{ư.4MbhN6,Kf'o':>7g>qFmr:z[F;CC8IU揨ZX8G K ?*Tyw+e:J9{ ϰ5gg&/Bo<Ψ8u?Lm?tzmg։$,HąX:)#EG.mqeJ#R GrX]mV [Jچx̅v}[FN :s xhcKm[C3>_nv N18nWkbRgx[uykʹ2C0SO#=x[Ukx_X6d#9[hXZP j嘏޲-4{]z[yo HÝ98!Vt*sHH]5=Y;U;j)$C!6 '8Q9eVXv}=jmȳOEeWWA!<UnLھrrVn9\SmȻ|_fyws D6\BBN ݎ02=cHյo&d{2ݣ;Tez~5|iشjb) ǽy2NVk` J֜^s{6p+EXBmH12v-$B[G_ضp>^ ƻlO6Ü 5{sszB1ʜH?\AkꮪژC1~uִ֤ ʜ' '⵫^lhx^vOk%M%R0Ҿi!%h̊]ќ{/5kvsY^F7ɀ2\vϵz3 8ja`妇x2ݿ K`$G4hI`_4A+\ H#\"~ivBתR4!--fP}']0lH{cЌ{&ҼK7VWu pEol u[? M`j~bJFP==Z^& yO$99?؞h.줹WK7'!X/^][X7D%H!r#o,3@bW.4,p=7S4ck5/Kݧ[hP2pJܝf5+ն.mmpǢɭ]NMddIrL{db ì[hfq,pklUDV~{dk?y5z#*=vF{-[b1^{r9V*ӗmS їSs~>YRm,Xzzt?fe 0ӂ] k9qQw9L?-/2Ǵt  Jij:o9;Gq\n~Os]ύ<#D5)T TB(8 5:[KfqF''*}ǽyZQi-&Y&68=뜼Y mf1,[a ;Xb2w +ϭuXI&"0e#+~ȧI_]>Vd!*8$ x?ej4-CRWҽeoe8;SqEZG?&oQ7kiOq$@`wdzW|z|l,Y?B>x xto?\gi[ZLI;? ?JQٗa0' "X:Yw C3qU cӠx˹Ayr1TEqqwXL d}+m$r'_e]&-4UG#u9aA?Ő?節&\j$UFtl``KWY$l7gnJgp4MD>W7چw:$5\hkG#<@I5%n#$?* DV=л^(m8<`<ӊ~&yjˬЪ$WnRgo!! op?ۭcS\bc@mçx砮УD47pgO58a7*_ z5Ĉ]r3 GnSZ^ kQy`̹,;A=k[8P-\L;Q?Q3ynTJ;NHγjid\}c#bY)8'q#ҽඉ.YK5g rxוSe4+FeC.^e|B[$M R1^8<9WVtRoÒh~ hY{1a }Gdއm%G# ȑ]XUqotoȵb]w!;wcx+xkOuw72d{@zW/*1wee:X?/Y$FX%xQvO,d븃A={6F5 V==%F@\V< 4-Hxd]>xi phs{iw⩧$r<7KPShݷ'5i1^$Gu=rCszK'Jfg\1Dx$/tBu{#gh Z$!yZjOhYݥc\z/x붳G$.KwY8$}+A饵XI'+2 O5J Z۬ px'fp:F3N2} i3nVK[o,lOհs_O.⹳_\Xᕑ!pz?#8ߴotkx.#Qb#Mg? 錹M4I%C^Xܡvö2?*Gl,/G F m}w9VnjN/2Etbݤ9kf{(gU`HO\W<*ci%kD m3ǎtV-V( G7!cQ~'lE n~UY#'8T\ݥ%! ;1ӯ~}Ez V9[ @y i 5'%͚$?&?sX@gUڅqϭz?^Q6ȍC!m*)#+-V.m 4H,xsjhm$2!|[r8& #ڠNψRcD(+2xξzqGKyvxVfRã;u[>yt-![Mym_#s9>9 MX.Ts̿:r cúʱe#B$b拇B-^okVܻ̘ ƻ|,H#$ =ZMMw#4Q+*4])8U =kVQSr=uY$[@~5忴-٤IC^Gjz$1Z5B/çӥqZ<1N B5PyVlzǃ7W5YÕ=N#Gwxq"+y  g-^`R. @"5sdWjX?eK[gl.ky-: w3+R\c>#X(ʝHc׿"}JnR2|ϘI +\3*0.K;ٸd*خO@2k}M7TVyb")eTzғ_SMo$,r,*2>cqg&yDl`c28or֒z~Ӎ;GXGi/tNLd1Ylr^v5]_S]jQ5@[NWW.HPT#ۭyU:!w~e4FRmIQz=I`tkKk8VGyc| R>;mN鿵4hL*(`mV}O*-mJ\JwVgUz"Ig=Fx]:zUwr9?Ojl,&4EȒG#0^/jqr #azvCSbl׻fۃՀc}sSn4"v6L3/q'9?4Yh:Ot(X3&!A<sj՝Ƥݑ#3ʼnncS>xQIƖEy J$2OzYQLn##mؚ0rθOn:}>HӤ05{yqddcwq tq7"YTPvri:ԕ\5+W I5)rQOO]O ]Qd"v5߿^%l) @2Xtn^0k/N-$hY^@3?p09V>l*$ViP$|EMy[sv/q d`z0| _AdO"1!?E\qZ1 lX]kwp;#=Z/nD%PVJyn@kXǔ[;+ɖ_ŋbYNLt1kJKKv`22x+W:;Kst3, 2cG8WuIaka+$~M܍ ¢ڼGNfkp{??ow٣['dƸ8-d7rƐTFm=CqpEg|;kh-_6&a[xE|~U~!xO{s7-Q[s8#'Mp)Uyƕ'K'7gĈg-!|mD> 𖳿T CoNK(}׫_vW0۰qF=3Wkkrߋ矧`h{*Uޠ-Vo(<٘ezxoމ5˸7=TZGfWBNL,X4jBB=0xy/:ƋuLnY<@ɀF23Ns%)%$"LČa9jͽރ'Tcq%;5kR[*]M9Kn#۽X 6^x+}Cli>]Oq&Z6ಂG?*u}nva'.QXD0T=> =%C `/| ߯I{ڋZ2(A)r0Q#Ҭh:i6Z[i2v2#' oA^.c$j$H$XeǢ2Zxsz`˥r)ҕGЮx'nNtFG#Q-0k+"~ $f\K:l؄dlt9  NmB I{iKaf,anҲid;//O}*}o@%q ZiWWgxȥ@ig2@}?x^:[3,(lwgȣFJ+4p"$2ಢnkc]Y՘ َ11ug 7zΝ-NHf*ܐA?+խ5mB[ɌcNFyj%YG JX@9S{s].T#eC#:.1r^ƬvĄ*}700q׎s^|:V_}ds΋ y{~s-8gGsdٶ2B񓓁57wzr$}6aK:{kԩZ.iKCv?kE+y$&[8'}jַ5~&Q#-6̋2Zo~\jrAn[ s#6㯂9j[7fbּ5q]V^pE.O%aqw:̼dͦ4V“JcG@qrfwm]1 ܩۻ~B~ ivCm1w0!#Lʝ_e/y5=V0fr~#)vi-6wGZ[C[=塞|H۞C9ׂ?+}]GwqllA #] *ˣZ R?, Af_O]M _Vɷ$]ëi`粸pah \{SxC8EYfD9vs]Rӡ8c T(#9W AO-?CG>YJ$}jMp*;E sZpݙgQvQ>yJz&NaSv:{z׊Ú{"7H> &jZS. Q#ѯ$azx%hUu |e:ͽX&O-'ebxજ88) ?|:+f _)`'?y<*1VG\ MYZpYX[8 qƤ= m{Mkx8׹̖aG9|?slK6 lNy8t7Sv;+Ӿ0x`X:9jTF/T}RٟkEQ0FN;W7XW+%ĩiĔQq^%mVx$^MH*_O=Z9'I"Tsۂ8y{jrٝ7Iwi]c} ϥgh6we֬n#nxv0GQ鷞)7-D-@e1 B0Wnq\> xwLvZwbU?38@=sִMZ;:ZtM/*싌mx=WAҦ[Ʉ I@\ ^ٯ=ӿhYmu}mla*HKC#,>jߊ^d:լqGfbWgM4 ܸ_Gu,WF Gֳx|7-QA2>%'kr}ek<%}4I>dNi?/kuωG,cnv=UJdks!:WQJ2:+ٞooGhF>a3珆>$bQ4R`@^9yZLm%嬆Dyns,A$gb7 Kc_kZߏxB:~MZXX8^bwh-m&yR]fp溭'í2{+`eN4WrJ H&L30A*l|>:EH?XfT@n^KkxcON*8c ;uv)fRYD_AzNT'dqMKC񥿊4v&(YMwkX{C: {gLK6‘ǭMO:>`\JY 0czuOx-$Ӷ]9|ZHin^q^T^e` #is'9Wxb_^XFYg呢^UpCA}%7ZR~pq\1'8WY| ĽXӼ:{'*d[$`X§$^얌.*_D5Yʜ]f5b8 ˮI^`c}OOM_#xp{W>-խ'O.8$+H#ydyPE6UDcdc'N=q?Ҧ3}גA\$H/5(լDf[kHy2p kZֵO5ޭg$-!M8qר$-LdE(Gsw῍42;<6L(nGeç<.FIolho$nA%Urx!y 0 Pxux>ͥe-9W /i}FmF>mŨZ}4H^†0 #+)&F-1.N3++yaDkceQY񕥋Ce+Hm;bG0%:vFG5Z0{ijZ_\D"HA,\\k5KĄ[Jrs^!>2ӭS]d[1P2$]^ES[Io-o"Wl8 4i+UsmN]lw^0 K٦kWF`60#kӼE]\\Z4r$UY, %NJRl1IA+w}ki?-kk6LƟdCN:hlx[uZQS%-Wh9,G'銵i zHb!9dyC/{F xej 98w?wjD+Rc9@b+X#87:[l.H7"hbpAFGZi]R)E$>jG? ^^K'.&+ W#<}+*Ymkh/6vpޤ{u4S)ХV+V+:ƓW7QΆ8{cؚ̚+]6V<#8߻nGQ-oc @pXz'/jHI0 NW?h-t5ky%]xc26޹ :tr7.2Nȥ(U <Z X DPkobǮqL aHPTDh]L}]D|X`.w($:M;t2Wl $g{:Bc aOܜ+?O70 Tv%*!$H9?i cFchNaЀsrw_^T[6M Ě|G:Ճݺm p) dz|@H'0 Ҷq8ԩQ3&ħU^O?#$(+ULXlp 2>ji^u~bS$r`H0KzaUYP<@¶ࠞߕyhiYE")ØvO xQY;Dߌ1{yv-b۹ʯVe%Y];F~7-0IGTzvKEm^@dE ;^mqKmrA T8j[R E_]cEҥ8PQ?pV4u&\qDdW7ͩ߄o&f۸t_K<-5F6g$p:ƭ]X$)rB0[ګnGZ¼e"oKs,f< Ў5 B7rz<kWW[dʼ~ZɯYFA#שN3.Sm$Pd';@ۃW-#ݱE8=q\|qf\U~릴m V =YV(I64~IFʖ#\riaeV;O_J͚)D1p!#o, @J"մ" @fXḪUbkA!. h0HQ*~cm`H'f*+]Лf6%NjI._f%'՝FmV5b03ۖmQ|3!ۑp]M=jYП;>(֟-+@ t{٭/ otp$yry, tS_vL圼]Tlہ=zW=7DmQ-% h2dp6XyN9R6暬I-E&$X;zSKG&@:ID[͏rVMĀzu |Ku[Y[Iiok$&wc=HSID|5WXX#6f8q k# ;J'ck۽n3Z6#NnOZoyDb4F2?WaF4S|,)WtOjwj _ל5_GQ}zmJ{qHrrG|ĉ|J6jXk#Y p=+ԗ2Dzz9=z}aG][O."Hlg>dx㆝c]vs.-cp_5>jPvm`+.g~]"|aw;le8q\NVxRNki67{]ߞI"fkr]n`ˊE CH1=*& o G(1o`=FsRIӺ"e-JxQ 7ϴ㑞}=GOz~x%IRZjioP2A?+ǦxW4Ⱦ&[EF]e qoJҊFqoR7:fFr W?xu|;MMn>a{dΉi=[Msq;;#9Wnt Z鑤{$̈́呇\Q6SwZ/Nh$db@$9Ihw#B+`93ZgFj-e- du|Owigc>a`s~u5B)[gWNYP3g@''\_$n1%gi$%nc}>ۗ=7o[Yud)=qc`3YbJ{&2[i Ug[{ 32]ۉnz bx:#^FvdRI%>|pD$sΫ|+;d_]KciVrwܔE N`@ngI<Zhͱ7#6؟_g6MFvR5V싺 .Ø`L(?ZzAok&{Uhڬ<{級̫PCIIDXi\eKsZ.S+el##*F' +kc=s^g#)pb>0׎.ʟ{u*MjMX|?(=N _rMoC$9'?_X)\Cʂsd6*f& Qmw,sg'=:IRp0:J$Qeqv]qPEtH&1q֬]jzhŴ_v&nhi:_m#~FM_*z\  ;#\t'5ȼQ+gL洒X1$ATG,У%IqÌ˺(r7´eW%Ԟ14&6;\֤5uف$q!u?\XxVjA.xZJ y˚ܳF<s1dV;iE!XSm,`u!5"mq)A8 Iޚ!d`Xp|~*f#}*tRݾ#ڋiW#x}{^Nk_Kq I-T:q`qڹPnF9jD;bGN=LaML[3#I'<1oelNG5F$3$n}EzGi7+dcW[u6g/h.Iy5[|mZTm>i':ᮣ"ÀGҿA?b xs.ʺ$\ ZEu_W;~5#'}_s3ݡMs3oOA l 0lq^ش-{5[В_[]DS H=m$MzZeF,a[qѿ\kM& dbwFc+Oڎkv!C\3xq=8?I4jlV('`Zb(EV3-tnYgdB{KAbχtyn t"2L{߰oj=?(:B{A -C,̇)ܠsOKk1/BVe8;CgSN nR/!]~X7g!BJ\c<k]dW!, pAp >=6]}Vicǡ?OέB]Y[9na-<L`\z%{mpI<@+U+G:eAӨ)Фٜ na~ԓzɌ>۽BqpŴ0rӃsn^LKF¸&mZ#&u*6aWtcM+R4|+0 Bf؋)Dv 1pF=EnWB8E~SEa\Ivm,l۹~hJV SGPj\#mϧ1[w:I 7ԩoS:<Y:å^9#J_uH69KuxgXFpI# n#1rI 60?p@@ғ('w{3!8+߯4ISp96hxSd . .VF9Ұ-gKpiM@84e{+,Vn MX1\Ud8*8E(Fs6k\{ZPlCVec៏_ΰa[y4r K-RFVbca -:h$Vi~"!@stqcWKi>C-`e5>%ՌF3C /u+z"$7|}}`}(]C.?_h,MH ^$HN:u+7 u7kgce,DR̓ZaQnv8n^f{Q.p9G? ҰIV`#ܭ9q]V$QF!R0i}i[sMh5.<aclylA`a<8n6~^;dK(l*L$>oq] mWL]AfwRkccmo8-0>T9u*wu"ّE8p'Kԅ<c!y. sjixWN5[wxLJʜhgJfNGSXr5b k:]^(Vg s! A_ڇpIҳ1VҼiosi5۴ zPt;e`tظq8EuESa%6t?>4tt]HxG3 &T^۷7B.0G4|N^⿍g6|T矮q9i6ڄ3G"eCF:dcbi-%y3MOr~2r\c?ts1։#0ZI3 u@ѲvЧ\wLpm}301aJ6kȁ\x${7KXXD h맥ƮyzP%O`3;6F[oH Wgiqn쒲$s{e[k;f|?cұI'IC uLO /J.t#ҫ|@kx` 28Ǧ]ώ fgn2-j:gzYxE4c0>9ζQ.?ӴmJTW[{hF Q;Һˉl6#F OSY?`!xr0O:!+EY~myno]~>%^"vx=jIt-Ngf+}v£ufݣEcax0jR$r֓n[??i=R]\inL|wk_ h W \d xMsPt-5Ȑܞ+ϯ襆-ZCZlʲS gHt Z\,&U;$v需@k5s-{BBs),}w :yU5~>a\^^hKc@͚%R3gqq@ 3 HZ_jC=?y.ang*@>-5*qMќԞǹiAg H8A"ϧ$UR5+rX_Z{yFt>zA#FRV@V re+Y# Hz;gG8QIxUcU$HW向Ui"%)^ʷ]t$}af@3Q[{&kR"1HSG8}~0%\nsmN[\/]j֨e{nF$y-[zcӥQ[5]e2!(cJ~5h6aÍO@x$-٬dcgd9 ?:B&pZv!1w?Q0+4 \֍Y]Y Y&dTh \+Ԧ6i(OwM_l&!;F9]<jX ۺ2WJKA9Y2NkoK漍FqN47=SM}GBjgoZo%瞑Μ)?`sZ^[!ܢe Oj,relHqۂ1ӑX-^~YI t 86g;/jtE_o|Uq.a8ch72رtTXSIS::RvC$Z*$olV6mǂqǡa55$M#L'jݥR+FV OI5xAW?JkRP後%pgq)`y{UM-έV8=9>ZF)JC)ɻm&fde pa;0+j IrS.ds/IہRjO ڑnd  XI5ؒ)ڢ9b,F;uoad22bC'hLV:Q6=܆gpg~0?c doj$c?RWbdHߴ fh ?c @~hle;|U[O?c'6W|] "&dϟ2hoۨزIYAOS? [;;$+"q8;֙ڒ: Yfc;:U-*^F7獢 ltS+xIVnÊm\cRCn3$O:[%I2ƒUFL{!+u~n[Yzrɒ݋7ZլrD|Nݻs?vJ[ۼ;ɪQi.֕U:޶ܮ1Lx,-5)KII(TжӁFz/,a:D>^sϭU&ɶfy+6IQ>6k$Rj"g}?ǡ;VD*H-r]:Z+U*q g hsz"ծZ㛫v-~ΐ}g ?G4,|Ʒ,Pv?,vӧJCW[\\Nh1`(c׌o#yg]F|br=+n)U:RngV IFm,3)6-ӟwZ#ioBy{ 0A$*xyqh1 . ~G#Szъa['qv2\I O^3\7}SQ΍J+(c*HmB^'fH#o+9힦"_G1:rR5/ (Z(&ߖdrHu|c#q^#Cvnbbl8Ȧxq]t{ݮ$X )\/lt8"Yc- HH\u˄1J?=94SwFΝ:ţ> ᫓mq\ z!a$|qqǚW;Y̊$.4-\<YR9ݤ@끥r4>sE|Y]~֭KOT8F n{֡87+taunQY]I?Z/x-AI@ұgxUDvCҸ.YL-(**pƟ6c/jg%ofmn';`b ݸ=95:/|[o%ĶS;[E(og:dsG(이{Y .ř"[߂;UkYx gw.O+O58'{i[343R2? dx/HXBU9/K{+׹Wi%fR pêrsrv}zӽfm #vv6JcB@Kvʹ=RfVu8H=0~.,)9UaO6y`NYm=3ǽ(R|+EInyٵxrYs:+Z<,v&4^x\ȊE<,%qr|aNH^#ynI޺.h4`oWKxLX@*q8J2@2ʑU&htF7o6c!&RvȐ"8S2f'(C|ב}{Z^90WfC=Zga"h' ֲyJyh #`km>]c9_nE+8L}r{Db`h.=2y_:ǘWRF0]-u=1!*1l9'k4[Ek;5}#XҢߘDy]L1;A 6|< ϵ7ق睍Ebf;gy~X ~֖4QevA(䌲B ?s>6r:Hnأ"V{I eʰq؎-/2*xT~{~8n-ۑ6b`X^JĦBŞ6'oqTq!ԣ2l#^l..gYBَr׃޻9V;=ͪ ]ٗA\mu Wa8)jfYa>r8{Sm1?xYF6o)^8?:aL=ʮލ⥭vdJUuv&l|2>//_dGY%8ҿeϻ=jzFsOK7m^[؈\I8HcJ<(|Q떐=*]cG:5wSXCv.u[R|8ry;^*Owoq/?,v,l _1NUnOCRQrm' [ݶےp:.^W'/- j$y#Lc#T:'Դfo9a|JSWՆ7n+ijpHfvEkW^E F1pZLk(hn8Q^}ww|p7A$` X qgV%!h޼AK˨JHPԟA1׽z~8K}7'tu>64m4] uH/!wqܓ/j7Z43mp dJt 2(I,)dG|Uon|qqx<ׁ^}yVc'̿3Xҧ{l<%gV->kPc1؎Ԯ;9CV^DŽcZ$y#'v<ϸC5t^kmmQhq-8.!xV&o/ vzxSw0=3s,$3PHڱEBuJk+Ρ|N\*̌ zp֓4R[QD28^ያ#-;s,OB)l,gG1JK$}O<7yZ4~Vۋ\l$r3W=s^Oܯ|Mqb peޤ2ȭ(=^4ۻ9"ihY:Wcp&G|-}%Id@&3G~ 5*RWz{:ėQkLq-J糟󷏭C\i<|DRyx@YeQAq֣uwM܉V г?25}" 'i(7Ǹ)ۏsAɯOޛc%tmyͳyAb9#^W+f=E!Q@!x:λXOGe?[$=ԴG|Yŭ@̑m9r7)'Ԛs]2xk7&w\])X#zԒWK1$a$o/'`[TI>a,=*Ȱ A%OPqߥtv B-CL1cp r3z˒:twdh F{`"axƲ)I үx}?ٖU 31rNFGN㚞k1]GVf9?^OL~,nIuC{3ֹcջ<šןbteI_)sH85[Şn"ƿf5(Q$e/'=sfl 622۱ ,CHÃ~MH5+&dMe'mX){-Q9ggUUnd,)v܍G< 81C(Q05xخY'IK7)=1\MQa|W֒rKsdzְ${B82i|sGn]zעjSky(hnB*mۏBۥq- F$VgZhJK(F5bPTGs.[GN2c| WE]XzjN%2C1=xU,|1s⳥MFN-lk~/G"(3yr ´@{rO5Z+mmR~5j~(,/':~\hw6Ė5a8ҽ.6'Fϔd8kPfl 3]olYZgxânYWΧ>!HM5NSl˘o0Npr*_)cgn%Ys"vʮ洬~Z7T* VjF],~YVR})+iKEE)FB}YLɗu-hrkuB/qtt%J|#Π+@^ؗtoΚb0?EIY=΢G-[xܘRF2}=*KW*X.;VC\Or-F?v:7%h$qL9E =NwPP Xb8d$ҟڥvcuc'RzzVΩZEʋ*eK>RO'8.Ig\o\[ADM{BQQC!YTf'8~;t-+`m4גK(o9%ӒqKXRYcdڿj-//>`sy꬜f"'Kt@=p~^y#"9d5iZ&Yyخ8c9'?k鿎 _ޥט8m699k~%iK)9ǝ} :0*w:gO:|Ow/ 'Xb_~d1ڰIFcK?Z k  %vu*qJł,H&DgG^{װ^ k{{T9ykd~PG~z^TX{h&*6{q5~ ^ikkx5$Irێ FTa5m>(228lBU#bkU"$M1q957N(h[+9ʰUP`9C=% 9 *OGGk6V$7F* h.5.tY$Rb=#s"AM,3rx\ŮM ^Z-9v%fvHQrHqs>]l?$nmϟ3-ҙ| `27c8#^0M4BFvU<'$F֗& NXc$pEk?va&{ȥU\Kp1Ě㩆掇ljr SZgtiS{4R <+Q$Wz;pcX\:OzVI41`Yx? l[SkhRż/<*ʞ/viwk&Y1y哖pqzgmɦLw96(#$<~'м%^6褌GU|U`dw=3lnD[|;=sCjJZg:{->$XsЙF?>x^75uy|;x3g {]M{i7`pۋ1Iq]7ohRepl"*9f{W<*2%<^*i 4R1 <⯍T)"ExbIti"`czb|MYe#^i1dVXJ 9;AϽM\+ViW:oP֢MRK[ʆ6V;遚Q{ҋ'`zr3^xSc% ې'8Wv-!gԜ~G*II-zjKKشYnWH\t5xZ}8a !#04k[8>pN纻̓1LC'PX ppH󒴦w wlv=R{Ju8^ $#pqܜV;4~ -@\"{>l.p?+|EZk t#lvS袼|[kOSGޭes ^JƾZe!Q5/m bK{"uXO׽Wv xΓi'm2I pYu+=0zI%!P%#QE}-*3z^"ϧ۫q j4lNs]?95K@+,j#Q[oڣGZvrQPx>vZ'|J61QYO/ºվy0U/`]m։5ѳe9vG(gb)SdsIq#^)&VZm$nOQ[P݃uIZ(KF9$ oyx6*[ n' {p();B"↹Yd^I9++T:ki%H owQ\ł,H>t`{ mB)8T G@1Ef0i6 mTXuknaUrTQ>xD 1mEt<O]o7K0; W!xh )_V/[Pn\Ʒ$'#5Pt5]&4K"@E]u~ck9a?ɴm,?"?SKS?,np1Efotocx/images/HDR-adjust.png0000664000175000017500000010331115247006660014707 0ustar micomicoPNG  IHDRHktEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 271 364 1 0 F|eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:366 height:305|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-24.40: paste area|fotocx-24.40: Crop: width:364 height:271|fotocx-26.6: Rescale: width:328 height:244| IDATxu\ٺ>>sٓ{fDZ@ TD;1QPlq>>Z* R"x>/gŽuׯc}94i@@ɓ'zRL>0h 22zw1Nû e?R݆}I}71Ap4 | 8Çx#00!!!"@v~PPzˋ`//iXcn~ 5K<@ xO^YJa{lsf V rϽ޽{ (yM7W.̠>5`[7[z \:'NAP7AzߧLp$H$ @bVjsk$=C۟d?LB8OLΘwwQk7]0?̝6ukTA @?̟< tq?ˈ &NV݃{[8x "aΨZ"v@  yбC'6~_] +" HTI$O1}fmR猩R #h\j׮nԵ;ֲ&~'d/߰p\9Ï?ãvsvNj|GFڿ:|v###f(ԩUǬ߻wؽ~)ڢU6hӾ3z  8Ȉ`_2ݻtBAqS== ic{ O_/ /K/pTǃwx9GsΘp~BNXªg* 9Hr~ Ɯ9}7p&I=gRI8Tڻl, %a=x kӧO4s\k•pܼ%meA6=q$-jŏP0.۔Ŷw)?{}+ȋS7{o¨^Qڭl`n^fffȝ'/d˅z{):ְ[rA:q!,@7 ¯Y`̺}¬%; *4茳ٳ$7F1S5F3qoD/q?ձ_ߓ29I `>K䀣m}Ͼ*@AEbŊѹ4zL]]O"a(X&Cӻ*Ο'xs'iJOt]qS 3{$$OK(:& Z֡( BU#g>9|"cpQ)ҧ֪" X\|?M|ŋx!;K~o\֥eƝtI'O>t脂6>~9nG<y74gĭ u&??ޘcrgbH.c>ojժț7oט1c>z@.=g4͍|涘zƀؿ כG8օ1d,>\`QY8u?E{4onW6r F:-~>P3<4;gFY7X凩)-`V [u?Їغrvu0E0qZMkfi' C09f޻^s>hװ2PZ9]ţH[0oL8%LLam_m_Q`j j'''5?ĽO_sQB)uCy{t*9c (j?wB \ŚhШ&ll`i,9'/ݐ~ 9 Y?D-p1!|Cݷºt#~ K{"E7?{?¥l5x*@nQf2^gTP#Zʸֲ l-ePƶ!{}Fn'ۂȕ#WB?qa,+"\X %q~4hx3|>CZ >/_f͚WӼy`ee///\vgN\92&zrE ;42C P(F.ߎ1T~ ǴCana RePzet+ ks$j5ϿdA?@,9,^ Ec͔6_߾+N a?7P|±XiL\ /ccQTY (Z=TGؾz6ۙ ˢzJp/ 9mteLe<9rYƿqJG˛ ;{:z+r[6cZ1 lXwTP. !(YnDcQ̗Ks(kșcmBn,‹EPdv.. ً?"qvT.uE6MqnvgpV 6 t9/J'(Qױx2.^a ]{c+#î`̈́n( W|}ުlKaRsu[!Kpإ$)6žqVhRqi'|jȂr(Vo:[OGp/М(PֶX#z>d:܋| [gQB01siATk\[0ckn 4 4( "h7x>~ѡAYΙuoC1F8H{wt<NŞ>"CU\N8( {΀,mѢ8]ǠbQ[3DNCpK6 QfIbVzc<>ňn(QC{q<[*'9$qH*@{ό5ǧ \m6m5kVA__W@DE ]Fp N7!Zxک =@r(n/';dR;j؊R6z՛w?}QkC Uzib⁈Wvpxay=`怦L) $.Qmڼ+-Ųpl/4⍰T@.fT.lkG7t#mF׳BMd5h g7Ox9 /e1]}s]8#B.a, 7X 8ͪV nu3V lXBm/Yؽ.=ӇWzB;X c^=A.(|8={Cg(;45/]!zŒdԸ BpiD- -&\WzNZ /ccɠE-PR{?q]1"gy6h;!Ҥ+߾(,sjQ3v^C:DNūX~N]EX@P0%$ſ>J1pqVZ&MrJ^Zl7o ld= jREJ.1cOb-[$Ec"#Ʊզ>J.NneѨ]ol;t/ ,@ ?)fT KNGY,Vj%[MP0{qJu+[\\jb a,s6$B9?$籲# õ;J( cԡQ3||EMlX]c/"x zJtUlU oƴΕ`jf#r@l</#`n15[!Nr|Gȝ"|J' #pol4-$ܷnVh=`6(?N< @N^1 D, DQ8t~Eg, ۮxNςJ-W~aP/uwRĝv.XjZa۷gϞ^cǎ,4ƕ% ? &MR"~>uq z$& "vnn%][ӣۈ#J6Sb15 A)[G$Ad GZEDBF?c3e~[.!Q LvqRY6հFCF1\?p?ܱd^Eb&@ߧWW,l~J,_+We714ŒWtUE|sDqV?<)}F b__ń,V{LvZx{{cҥXdjo, GG4HG}$D SТ;r|q dh7a)? GDG2+t;ܧV-Wؠ>޿76I Ȉ8r g\^f%Dc&xS<w)~z,\0СC=CK?k___ cرcJ&{q= QyPRD(~+vA +8[p*(2COq9ȊMB >ɨZ5lj-ۯxxm u(RJp\ nMd vS<tFBeeXu;DlYպ;R2ubɋdsx8čh쑰˟U;&9!h^ZH,5QVr+ڍ01 cӼ^ȟS<&XXʳ"jר,(*9($na\Z#.6J; 7YuO-+\O?j*7ЀK/&ʊ]%<<஬`\ w}g&`u |>!-Xg^t<8h=, ²@fp%0@N)zH `?> B?>#{0A=II!w_~f@a֊#~{oEX?6, X;e;)Vg/4~'19JDϞDŨSAX`im+[½kѲAeΞD'=GN=s8Ea1ts,bȹk#GEt_?]'U5kLy~DY /Dp`#o5O ]AwϠgj-rXSvvˁ9s a+\GE'(:PR PV3uT~F{>^AIyk4:^ⳛ?Wvd˒7Dj5 3WT°_?\Jq&n?J1/ уK2cO|3j3?Y#yĐ(]Fwml/߆woox>0/~-c۸%ـs`!U6NþSy9;R6 >ُ/\쇶߷9{wľ?zck߳|8x~w|j/~ٯ轜YM=9pWbuqnTR} jp R2&ߣa3+~]::Y{&vO8O?]H_p[[]Ƨ2`CN2>   4]Cawd䀣;E{?ƜڱhTxB1w&0IbX5@zдyK0JDLK>g9L#X#Ŀ $Ŝ IDAT)H|=r|7߻16)4 MFh@ѧǧ='4@j܃MFh@l'5 |L 5@jAӀ#4 @ӀLO!xwءx:J_z4 hȴ4ov? ЬV[g>9sig qa4`iH> h\4 h0B L>}9si@H=h4`4@~kM@i@H=h4` @#Xd1N;AP<XXX ȗ/=BBv(Z(ʖ-usN8am݊w~LgϜ5,--agggH~}{1mTt^v9OOqxsckk .Zj]v7n\yԜI9=c? O>S'q!Ʌ}>yG/sPhԸ뺯//^ݻjժ(\0Ϗ,YY.0^A*UR COG¬3`30r 6]vAVPvm)]Zennܹs  ״S&}f "Fz'0 K]ݻv(Q&2<08v P#J{xfhެ:C*m۴A:u)MgguHΝ[ͣ:\~w5UT1cp9< TkZCݧJ_c^x>o:yϟ?Q<+WP* cp~PpnwGUmJ**⦬'K.]0y$lڴ 7oH DvǏ{)+&bKnv n\Ukm8pe;{7mD۶m=BkJDV]]ʾ..GQ5QFV"o… sFPnlƍ Hkf&E2}5nE8+P8a<-]ÇᑜZO5sZl"saw֭1jHLRyA;Ii&Xh!֭];oּe:8~LnZe˖bBQv.QfM{Vo9X \xȒ}QhҸ1hѻw/OѼ9ZJ~ծ][%YQO׀0tȐjU+W()XSsdT>&O&>ĤӬKO8r=eQ QRWӨW-XpAL֯_O%_N'~w82"Cӳd$ U5.t {yy)o/9@.m[ZZxM>uJϙ9K!AZ={[+`2Rpû~~J*T%}Y I$2bl>=>p$A3gNJN~8Ml:JdҘp^W,]&I7 ]pH#syhfH#cī7]ky%|ʟ::)}jש=uh~F5s2EG;b6J5OO/&ȕ4/O$`K9rJʁWE$1CWZ'͕Nw Ɓ>&@Xo3w4DG_-QIQAjr1djfxO XYVE1a)}RHGRi޼>NU^ްaÔՕ^7I A 0`<3Ki4.-i:FfiLFЯ1u]|*L?zkCdž,ә2k5_`mA=jr=rkޙiGY$:-=+!n-FjAFnx5$;Qk2~Nq6ϴViY7Gڤa=zPLhմt!'nctѾI#,WKb1f"Ij{⚤K?oRPi@!1!ue JK҉34@Rd.4Ozd")9b`3rô3#󗶶#=Xcnb4/)W^m֭qi !D4f f&Eu6tÂ@If\J:`*Fh,Fѿ_?UVtJ탒#C cx@CaZlXf?C$-(`"Oww7NC2H >'/?eo5R )~Fit@0!ԘmjAM!f0o0K>)͛ Q2Ƒ!DF|+Y:58Q2,48b<52%e3+[7oYS$Y^/`ja)WV,_.@7#bfc9y$tܹ1\ju>HWsf(@if2a2FoPO17GHpdꦲP|tQvDԐvr*J;9a4$.\@eׯJK1H0;wlWy$+S /֟闐(Wvmv%aZ&1}\fѳϨA&*4nRv"ye 4%[6o\c2ƣ %y2i=i*y7u<8IR)>#bnժʗ+V}S :k D1_/"%ʪ|/>HƔL>yaQÆJH`ƞ'{K@SW F"}.];$K?ĽKqM4Qc40!nj!+i3Fܢ))_ 5j àG;!-7YKa7IqeTJZVsubm(6H=#JU^膺X̑#dAO$k:JoF] 26}X#%"kQ{y5idgcNGB 3 +3g/Ic)ݶQܷk:L "!]ohӦM{]T TX{ٲWcl,o|OcF8]Aƫ$b%D5-)_ش>7%N0^nh(@xffD]d\p$SK낤H "J>uJ(Q\@@2 bO%RrH!CT)nPW=+S _i3Ǝ;.rD% %*Ieրٸa}A8]|ڴi"~2yܓb8nd9Io/?,RtӒ)XIƘ?/9RgQJM``&A$]ԯ/UN<66  Sd/>|xLFŐ+J'OPYY0hؙdֳ:lP*ܹH}Mɭ gR=GJ(pP;wD,Vb\*UTv#;M?LF0e_FvńTfmJzAc 5@~v<\9g~1R(SK%E(1}:Z6 r[i8cI&:ƍUuff_XʕSLF:uvrʦ#W&cnjVb(}'W,_ ;z.=Ɣi%{C%`bqv5@jT>c@*xDf$1CyNT\͛+͌g)֭Zo7(5@&`RJQ$,iK ]vƬ;9?S1TI,%y'{9KL̟??x0ݳGG$`kL$}yJȞ=;zꅛ7oל7iY abc`jDX&#+jE 2$A%QdIb@sBw +e IDAT'*b1*#݀xQҒg.Jq$l*nH ]kIU]i 3u-$)D!uB*,2$gj~2[בy&YV}ܹC< .[T%k.<RbLhg}2%qyDi>Pv-IuEi? " K&3}U=z[?Ư*׮aĉ(u`~y>uReoڴ{/R*.PF?$3  euȕll(̴`-θrsC"(A۷oʳ˔\a&Q-CxP\GbbЬ3ѦukVעE ݅V*no>lAݻuiN˹.KN4 ۵Qϛc5kꔑ9K  c7j$:wl߆;ok`UV*gkgg'5Tedv }\BRѩd8`ĺp/•$SXH 0#S*%9{wbT-uA;I q h];6nؠmůxb-%7 %{&I`o_H[.龓3'_^ă5-46=krtcP_i*e0)ٔHQ7n[dHQ9r@J+ 3ǰ'9JSZteKI(|$u L2s ?kbb"=ɣ,ݺvm[+c||tv҂!HdǑBXw̙%Dtŝ۷5:W\ 9&m#)ǘh6E{?vLxܷ$Ea,U71rFۻGIH3~ў5xOOw6jr[eB4@ GN" }{TXd"@. 9禥9Q A>b9g]㭀iӦlKxVL(X:xLǠӧ)LM~IQs_1`V,B-ZY`S)#ܸqX4@X܄{daFDwS\YH틳D 5ߕ|ws,SZ1<(z/8xrq<Or-ѣгgř{ 6l%Wr/[<XZEqɱ2jԨt#%O?>%\"~:"Pm[`'e<^tпX,o<'t,gq}Y8G\t&A'0F1:2̨N=!>czY2~=@2_.]T΃@d*dJ (F/&3#eIrX$$cFukUnEd be/UW3.2LHg1s Z_i1|ҝZj 8$@RF?.zS: Ga%(9tOΝ;\9OOd֒K^bP6 EI}C3Iv8a4KiJ'hufFLe3vq̩grO&^04!F{29 P*X&aS1/* vXq $ g߾6o$I y+:.\s<,M:Ue58q*$ =z 'yx.Y,bFSTS"F9uSdb~Rk1{44 I)N:c$. NG4k5*> d EUXGp1 VLxACcR$哻[/37# 5")(td1%Z۵k"F h(""x2@8)M= ti@z,O'P]AtR/Fc³t$_#3f޼*z߯FkY?#GﱎF0۵۾1,;^LD(V7\+%ӊ˰< mL jdq7m܀-7+K(6wYzNv e[i>"9qkٲRog0U”zŊX[jTOhY_.?ӧOx/e "S}N%=B|&@׻W/wc:vTj 2` 962\dʘDe^Kt3`!vlnQF ߙx3nr4TLB!GiG` rDDŽTb4=0hJo xPaT&@rɡj4x x2 ¤L~K z\zE}]r|(1=|gYdA4h u*ھ-;1~K;3m`cGW[⮟àd4 ~ 5q%9l4@A 0+&| ̖w~>6ҒHjMЀH#8=^j4@j܃MFh@ѧǧ='4@j܃MFh@l'5 |L 5@jAӀ#4` W/[@ӀLK.8/_<ӗM2= 'кuzNh4҈Bo̽1' h4  F&Fs4i@H=h4`4@=hAӀDۗ0G 7B[1- @?cڍ{Ivfԛ1)4߼~mFzC[ѱy=ذ0l̙6.^˨cw-2q{;?!71okt:ׂÒn8:TwFqAH^s'/ :N)[=3Td79a)֮}24 ֿa1 GF{7Q\ʋ"13QӨX(cݕ; hY%4I1IQ/S<z.%;|° L]lx6UvU_FӠ*WmDĨ n k#7 /aݼ6Ϗl9rp10~!,HފKySWunqxI ¼-嗟}l8A~hsY Ot  _<Ŋi=5kvTm̥yJlдss^fS|0)`c㞰Ҝ<؃`baڨȓ3O'OK\5 ٲdC "7G{ȗ7* ]BVk׸#HÔyo8ol̑SAʕ e<ዷ*i-b([e+~ ^x#;jid2ιE*зy 䳴æ~N/Yjn7kT BAs3dϖKUŽW(ٶ ] BN3˦(`ayDCZ!~FmLMߤtꋋwZY¯ekx2ۼ"nCm_ ZG ֫Mɞ!Wvx֕}wM @m*m˿SP;rܹ͋spo3tb _bډ.ŪrIݻ-x"{,<{qd#װgRԩҵeQX1 rfc={UYVl@`?Nf7:a䄶eӿlNs&^~Y\/^*G XqO@"0sѪt;'<(^N qmX.s8l߽􂋍)*5Sqq R)Y |J!1y,3WSN\HZ%t`}3`C][6EKcĴyؼCy!OajmFZN%ЦhlKg ʉJ" CpuWc6hѽ,1ҽ:^מ]0suqy,= Σs13^|mq;8{`%FۿD|{cڻkc`?`P 7Fa0ɝ ߪ ހ\~(̛'\Jząx͎GacE ?Q'Ь;ݠP~s'N<~ W9@a(wB X^n 6B6l+GSƽl\aOX$O,JϹrO^ۿyZ/}$4@c#ab<ƆeQDDk?WhfsDDj#h'!֡ 6 [ccx*i|pta/ȓo=ҭ "k^8a>};EŦ1{38/^ʙpDAS@>B0k {>ȿnNm]C3)_1 \@%`Z?w/WY"2S>kк-z}ǶW2e%abɞ Cި[m`RV26 :gS[} ~CՐo6@lo_ps@<*M0Mlк[?L>] OUEGvܖ1Xw$k kKKjFM̹ q9Yz^Γ?3lv*[^abRJeWnF;HechQDt? {fvG1$^6kR74vDHú-bkѤ 4A[쯷 >PZ>sƻ:ӇBC7csէ-n~cs7 QOΣ~0s!qZchY=@}v !E,ݸql{'L|%fl;dwl ݉V @:W-io\g\dQDN%ۨGUr$@ ÖyPNc bnȑhO߾ӧz5d|?@E[<5aܘ׭5*qCJuID0V^jN),@F˷|¤6iJٛbЪ7M Nj2 M|:ǶBE"ȓ NRyg gϋrbAnrNțJ7=[aܻ3WC2v[.K䛗ѥY52/[(*8m_T) m(ba ya T%Kpg)lPe\ +oVY"o4Z[|$b(s4BSX&6bq8;︨?77FQwDAPQVGc5[D슢"RD ҥJ> 00$O>gQs'ruY{u3%POu u=&͓,iumnm!Dֵ-<]^_QIr-ߙ5®S=ͳMZL_`P/}l)6 @đoOS/XU2c$9!Sla>nD-;]_âw]>֟!+ <`8q"O iw-6>Dz7hbH4Cu-z B4T`!z;8jRƲNm7EXd$C`-X{dax+`ڇ:!K;/2nG`3gh^~k0hkCң0sۉB1}&&@@ p}`3HIj Su"̴͑z(U0rދ$<[c7{ UmNQFYJ$Ɉg7ښ!,`շ/F{2q|)Rʔ}*[CKϐo9{`/uFӣ&SjS *!_; ^Ǎ'Zz|b}3_V)46 f>WQq V-f8B괌=҃ 6zݻy"d f>@ Wu|I&lz#ҩ!fJԖ!d:%O+g뷪矪~䟯/ ;3h~qvz4M1k鷂Q[,r\DUU BR[ 5fvS'UQ5"#JPCgeSd2|@R:55hl | "N&]S] )K_VW#8fZ/5M{*䨥ՉuK)L਴lڠ~  j22>UՉoC7[$G4*I+i\`[ EO7 l:}1/Sp2A8 54 :$$ p u:^p2ɵ.\4@x?~|.dRCüS˵.C^ ;apwNvww1IL!?q8zN9恛)9j9<_h฻h١p/Jɱ :#2>(uv ~܏/dy'lFL: fư[l ::p̞=C ~wg^J34l>}K 9Fv6pry p?N{sT`%;"ekX<,c& @阩=/ËOi2|M ]LDYi r2:m(oVMb>m/]:0tc0"MJBJZkLRp9= ,;U;`RЗV5T\.<)U+c,r06ԕ*?۰K)]zb-%\X4_2ׁT!'0{y!sOAYe><.8f &NЉtv;SZSvcƔuGGGr5+}6Hx0fO4` ]:G4N=eH kCqX>'GC>۶_\U? '4 ]?Eb}C0gT2:/fo6rƎ'QU+[ Sqf0ϟc1e#IcW;w fMuye_l뀡ܐZ9]},]'Lr_NaV/ ΁_Cx-F:J)-&GͰQX!> ~ _X|,5Zk'7"g??Kpi[ G æ#4ݕ"2 l-1flu7ŸC|i:lS@uL"dR:wkjⶈO ZKR@֋EUjL BT17 q`j#~jz,_0L 0d|$[pzXcxC;|TvͳNSEk7a/`&1XXNm)9w5}/N'g6}ji}y@5u0 s|1|7`w*|eINȷ`WЭK9.8>&-sKHpC y tڷOL$> __~J&CN'#OU;)䡁 tAJ'+o {vǿ|Bǰk Gpv[²_8bļ͸Y hyNW%"ET)ue8w-L//bb?'M\?AJR2 ,GI8#v EU0;;8\?b̧ːXB'SH뫑vn=̌LPLǞ ̴1}OTccu.׹1)ђA[}p}e:_k]]hIȏ×N~! et:9j;BQp?yYqz%t{Xrh2NIE? SM^ԺvE49aQCvn +@`+;E N ab51iSs3\&`]?鶾5~񹌦LWjÞC1ٝ w$ v/h3@H/\E03V=]oT/eKd@Ȯ9J}c/C&ک7f|MQq $?!SC@aۏ`͉pr]#1.lG7-Crݢ/*++RIl e+pb+ROVovCq? eeBo/iO_6dnaiOXpE-9g=A2e84GS;<`#Z|5@*pzZ=⁰Ҳn:X Ha O.̇I|{O2ClIdn?cFwXʊ-//Tk6&&h)6~L>K=mȁz( 4‡}Gh2j|Hy[/ghh&Z9 (N؝~P!^mӖŽ0TzY'#昸x #)ɥͨ)DE?D>MR0: ֶ솉XtLN2f"!.i_l<dzhi}Pݫ]a9jIm_ Rn;}wSp3+N "⠠o)Nwm^l-Wb$kD=kDCCTfa)9^0j" Drz2G~1S>s^UscHa!)P:bX4 { 9f4ʛ|}R0ׇpPyܽ|:uKJֈ2q Mb^')8cH};5h?3gD'[> ڐy-ۻ v0yp&wOSlf(n8fyYyz!atCQDڒt_4ƃJ\zsF8m|/(VLqڨx L>m8n&O<(\{gJ@ڒ۪p*9$3W3#R?9Wx) Ik;E&8̓ec) /(Ԏ؎lB,hNㄇN'X$]8ϓ'qxz(H͔Gyd='.] Wof''PއP4VrE!'N@9u BZ~sH2R@q묀 cYP<ǭ/ד M8o?錟Ei\o~ iI*V8Aq57ח yseoKHM|wA 2aS՟x[uT.dy<62e2eˀ0iӔ oMY[S;wyme{/uAnd./H>O\ hH ' ε._8 9 eˀ0\;c/HH=p2A8 54˞,:> t|.dRCpkjge Er,\E훨>.&A~Gru?sw^KeyilS0Uxtr75ʑ7CP[-Ÿ?ES#Ғu*4⡢ EG=ϾA'=z#y:'yE5יᡨ(+뵡L)։u9P0h0 +)d r(MVV񸟗bdg袗`l=:y?9`@Q ?By~,:9@aYn$dk o=͟1zH~ϜΣ CTR TVe=!4ZWtԜ2ݽC$טNʀH pzǼ?nv>JKKQBҢ6-x1jӮq0k&BϤ7v@T+VjF@)6$Efv())AqQ!}HL9i{gw'&V.i.[2$V^U[ڟ(YFS1F mغ$RЀ܄c WBDe`$;|EfEaʨo35i0ABж5H )Nۿ~}B-e9dz)m6ψ{CKK Fr3N;>Vذ{=YYgϞ0m΢[Y>Y!1l-tS[mq*j$".$F;fK׵utahHp'7t3CD5iOMfSlA?0}*2p5uZ{e8u`+6? aǢQg?.ʊRvh|x(FY.]:w.}8ُLDT}#'p;&C+Ƨ:W~Y%$^WHG|Ĵ"#t,߸R 0AT^wdD!L$iT03[/'@ʀ>ṀM)Q{#~ii9HNJDxz1 k΀񈺓FKڦ68G&,GFIoM篠N|؛iȕJ͗&aMO>7; )U^I =}ù^ sH2Im i[bĄ.u[!fzbPc;qUMfc1M-X%n.07 7! 9Yɦ̲ptF'+ oq׼1b10qa_TvnCA^0uD_> qC4^Gc[-skaky?\ @pj׍'PPQKSlyJڜ$; jB.3@VU` .W"WԂ R2FΤ'FN& QEug@V쬅j!RZ`d;w8 1h @]S+ܔ<+S(*C@Nz0UVIOo=,?ǜ>k[\DIEAW>ˋAr CC˗ !rz-8.pـ8~MO5!JݽȌ5θEif Q)#aD;ѽ d.iHG.ұ fw IC(I!TR\'dk~XQ:%MZ[lXY4# J@ĩk\>G0W> p5Š)_!u_C' ۆFj'S@#6H!2O9 Q@Q ŵ"Jv0|,gDZqXic<.v .bʰ^4+ٚI>Ɔ {OCYuvT&@f?*5eXh"iaWÉcv28M Ihu}g n$gAk+qAaגid*Ցph{?x@%w6;nj$ #[D3EDAFq/hnI kY`[M&eKuT:Q!<֖0 +kkN8{-L8 ]8=پCǫ@@:жJҺŽ --(e0u=!ŭχDBSͧyHMMAaq!%/$MUi*ӐҴ94$'FEUAIIד e =="UXӛk,Of_Y]U,JLUC*ԋR(Sjj.iɁde*-ʣP7WAr @ ޾-Z 6ȕQH5%U}*AOW]0ž U>֪UϕA=UcZwsiU^Zʼ[aakWQIAH{[9Y)del=AF#`8 ١o+0ޢu(+}q1(-.zkz,2z=Ս>B ԅo_--yׂ59Z^fQA*=5䂙$ .0mUoXX]iuYGm.-B]8Hv{W%_$;Mx5тvlgpÅIDAT7}#WI~#yi:DETD^oH.{$p_~.\B{X QDZCB]7!< FTZ~(Z[e$)wT8G;$$;&Ld.tq6UW 1a ਂ@i]Wf. >x}5H.\4@x>2HᎾ9IENDB`fotocx/images/sketch2b.jpg0000664000175000017500000012373515247006660014517 0ustar micomicoJFIFNExifMM*JR(iZ02320100fotocx-26.0: paste area|fotocx-26.0: Retouch: br:0.00 con:0.00 sat:0.37 temp:5000|fotocx-26.0: Crop: width:1985 height:1115|fotocx-26.0: fusion: count:10|fotocx-26.0: Sketch|fotocx-26.0: Stack/layers: merkel selfie.jpg merkel selfie.v27.jpg |fotocx-26.0: Copy in Image|fotocx-26.0: Crop: width:983 height:677|fotocx-26.0: Rescale: width:436 height:300|fotocx-26.0: Rescale: width:387 height:266|fotocx-26.0: Amplify Contrast| chttp://ns.adobe.com/xap/1.0/ 1 2 3 0 8 300 436 1 2 2 C     C    " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?![5ZPRO"GJ7++ͻNze۴-r|%cwkii\(oz4_H.&mYpdd)HU֛u*JCmXuVQ~ģʌGt&-qڹKq9U"^ pF~vӥ cK51"I.?JW(Lm)gi 7}*p'̘<"KipiQ5`9AOH 2?.J]5%sիO<^LF8ŤX1G+^:1;\~o%$tjٻ` T-:?ͦ:O$U5[WYnnIbNsq|`uf.[94IF ${Vo&(̶1ǀf95=  d۵fN_J~UcI9a0 Ǘ[ǥiYȡ%Y2҅}yoKJ3Stid?@1Vrc0hG I]2G9T8Zx|!֮Xt0~|+ڶQ(_J%.Y+Gg%!|NG~xKƺ4;2Y-wW';COڤ:|q#{OA5dG>;L3MomwF9m!k6 #@Űx}RY2ckdo[\>sJ{^j6[<[QZ Jq%ƺ5Rc"'~z5˭Nxe~1N~~G_>IZFcoxGnഎ'lע0;Vϝ.%LK,U#EEgRzb13ϽmtȠHL>h^c?m4/Z,ЬJFU'A[t0RSZwZ)a|\zX6o "h&v2bFkdGc;w8sLJ[QkfhH?QkT#-:Ui%kmo \EZ+61\nn/5[ ռfi",ur o@$fϢC,F̫ ~OҰ;\*Q}WykOa /E 8t??m1YՒ\pJd=O{=ogdBb$U6*l´(ډהrs m~-5R:pcJSլ|ls"$W|gDžO[Hl[Cp w+ rݭOύoǶwҝQO'G׭eҢS`3<^(Jh͒soů‚(}EKڵ{q!F.l '(s+c(oXFQnP^mbxn^w;r > cBM̩d.zg޼֝DZV0 5gM5x;ۿ'N$d`د[{:$?xCk4ڥlrԢc|v&76ΏXy4HμT)[;nʏgZ#ExbkHU57\8U9sSj:Ү5 OQv$$rGxKҰYT's)gc,w+B2=ktmm*dF358FtKUs>--0gt^]sb-Bҝ9ǽCyq]J(]Q,l~ p'U#vn{V&処5jGvq:p3# c9+XL!d* f>>{ۘJX0=u횶 l0TJs$׈q6VnafIdizt2m-ϛ|sk%e?)$`1Ҽo^#[s#^TIpOzjM2m,Dq"m+5R+.Yr:i iE%srl}o˺3$j֮ B`UI>}Jar7'cb̧>4۩.& B$?ںm!vD;zODЭ18-[#PwPځN: N6՛_ +Lb?bq5͞<*q^94:o:Mдڅ9((HHWwѴd17V?S]îнDU_ d?0G;^8+KuM/N1g o 8ЎN:o??-c5O*_-BXzzj{+m6;kXRD\**ƁT`\]EIkӥIEj7!qAVɬǚ+)j̝YJɽp(t$=8W9w>$|iyoKglpy^k `Uƿ.1X,+6o$avShwP4}gU4B3Ef n@[zmMvьⰮ5aɽӰ+KQLޤB' :K#om\8(<k|ay4S_en] nRA23*R1| ʻ|L3ֵVxd0 }'"RB< 5-&:ܰq_5c HpNBKs;Sxbedt0?8tρH8?w:q/C^yݲEW=z⚹VZOnPR05^)ѣBI haXS;ײx gSc;rH:6ϻx'5?wSЄ#QlxO Ykz%40$aq*]ngЌWkudg+.?J!KK9x,21\ڶ-c0޴,5z"ކ-G:hE-GV֌ulxyӤmK.>GmJ1CW4k觇lIF+ݭPjU~y}& RƔTN7#Z[˨]CeoK<4QImUifHޢᱽץG˷]~C70?4i$%aItz1xADU%ē:oz1r( z4iW 4=yel֒F(*$|8t.ݜAooeB ]۞;e]q OV߇vo2}p%hS'!ؒX`q5/x~4k_ wqme35E5`8,מxW> H"' X$m W7EV&U9|R)xjzLjo<:cii5b9&17~CusW^נ^!n9X!XT(8居qY=:aH4]KL}H2HU#ˌNI$ⱼ1-Gu ;oN;P2lmNa{aJ&%t} k^#Vyjvz|mܶG l!xG k:Zi\j[2ǽ6Kcnt4|=\,:Cucpn`{YI~R{uW|gaclPЛBtR`-$,'U>&>ȅ>bw7 `O2`~28t9ÿ~(멥ZHC ύtZE^xqYIrR߷ixd ~1ů ۥ`$ '۸?^' p ]BV6'$zWirWHyrkUltL?w:k]𼟥[o̵ xsPI4;&2 z+S{ς={ 8DZj?^º 7LTi[D%W'ڌOudb*.9'5T,yWCu9S^#7M ;Xʽ G}nwq3<$=+񶬶5V0Gb%L5ܐbbL 溍>m`p[ Q򀵝x]ܖiv\ }wo'S{t!HQp+2mIIUfGmݬjVpZz0>>ѧC A $pkRVmDDH7z~+#HdUU\WZ/-nY~f0MNkXbe5Wrz'! Њ_,6#¹Xxdƥ2u3mF;KtQއUɚFbz\6ιL&X`H(ۺZu ; yZos jy,N54j-m =W+.`0뚏SԑشX'ҳGDfvkL(e#J<;|-8WdHskr853TZL 7 rG87V3א;zR,NӁBi{I-_C4GepR9"cmM𖞙J*1[ᤏg߭$:kqk7ROVm )t!ͳdgcof0*+(|Ü=X6ME&̦zj;e W|/ mA1S>=V һ |Pk'y>_bs^]]ҫcs/κeaCZ2qwHaPPgo,G$V>SR(^𮰱Aulc$9AŚn`3s\R0e$<9Txžm +MeI-Vv C}Fį|G{PK}D2fiw ʹza_|ij|N ZIMs#q0A,UEwj]wLOŻji05cZyln:w +m3:|Vq,1Q <+^1Ouux䲻[Y?ʪ=5ؒ1ݘ;Tf=y4p[ZһT:gߧWɮ'UOj܇G ǂuϮoAJmGQ}3^uGl5=vWJI%ZrY{>©u=9sݗ}'?|Ae||>Gl$9 W)<Y88=V{}kS,G1e٢O{GDfO];›^ƛaxt(3`ו$ܮw$/}wZ-óm"o1iHLlD'w| ?*h:"a$k@\"\_t>!_iƷwjman0y"@/1ֽkk6Z|Yub)7J-c˻`vX16q\ݖM.дhxWMxdrsM,+b0pd {Wŝ,>iI5$0O<B؄37lcY?U5h0Mr -a"v 6dՃĞ8&5lԡkQsjmYuu^2WxT$M}2 ٲOzgJJ[$դѥ-]Tsor y"0#8=Vχ4;w@K&OaAING x찵193&1GOhhͤsKTe4n\n6z)|'|Ox#Ě]nHRmqK ќ Y!_~x[AS43l\e$Pr0[}7_$W%QBWKc<{ןXZ+?xlF$"LJDg~H5Rާ^>x$,(ODk*q]֡ nrjz tOĻ+m/U9Wj ,* ;{ڗ>#%fF˸]OZhN*NZ ꭤ9 {"i:tvc8 *gs?zՕ}͝ Ww\wZɆep\Z|e\YJsr+oBgnc^H92vϨ>XljEIY0=y;f]FKx.D3MFhG&]1'iE,!]qU-H0'j 'f P+ų-%cRxf\ XsҨad'J״ Pڟ)Kȵnc(#K;С^abέ0uKCMp[o,r\$ |%wxcLW/]jwWZ5 >bHϛm^Sxu]fskzts},m&]ńx.[W|nѢ}VTB|3LA;-oMw w:dX[88r#q0AA]u`x0 5H~lfQ7`@#g Mwzyh6mL<5'O$hVښ˦k U'vW  Gp"|NMsf-|QijrxaOl9#WGXfH+qWx?ekZ?V-'n":H>򑌌#泞HZ׊_뚽Ljͦ_nGiX,!Y#E~3o4;vڭӻ,XuMYzm"%|K_"M3H5ZF{#,O;nHPPUWx#N|5#hbƕ`v6l">Y%V]7 8:앑WwgZih:"X۫\K$| RHǽxkm|3`g344v !Ccljzedbx%xwQ|SM2F[hyԝI7.#iGMrytc[Bme y;䩯2Q#7QסSmoJ(06@UG뺼O>u{x5Ji7v тzd^7_L}dž$բ7zGF,W2喉3Y],bI7Y}ǐwB'N{i⎻G5-?[\V4"#1{܇M$Ȓ<9Zymdx JG%On6UĶWbk7}|E]F J޼D.1k k,ʍZΘ%˞] uI清LI@1 Kn>m ő7i'6gQ RN zt4LuO״-=mn r4BXzFG"KN&oMioHXeQG o >|&w]Y4ٷ ,0ʾ*|iҼ7Y̐IBҴfuc̮~}~</QFQT`(Ev~QkFnpkFҾw#23(s`+y0$m1?cծfhlO7X5h,B++{Y.7|ǟ8Ҽg~"FMr #=1ok&D/4aB)K .`ʀr@!3}ğ/Ne=ٔq']O"LYBߛ>os)3ԗ2&^ĩ]~U.%4 Z@=\4NQ%#W&Ec+y,ON ^ZIH{u1#%9PY7x45,4Oqvq yhFv=EWk>WWz(LO. +M7FH ԴؓWxN󮞺{m=̀i-e&=U2Τm89S/ks][Hd 7K!I$p+_sm[i)`:: '%Sb09BZZ[$ZXG׏ҲqI+>׵MwM(xk'γ, Ws8drteZw~$եui0+W*ݶu?zk7׆2ƃf99fw* s+><}km Ctq-.)gˀnTs%ԫ+M[.n2EhR\}}0`uDMT2@ WKax>? iDzj:My!ifVdE*ĔW?_Mi}n#/5Cf6+c,>E/־D^ {EQ%դ&PBd{/^i4W(P7=k^#-u47* *?~1~_|dHMfMˍs*ƥ;7g\=K2>dxdzZW~qy4ڪ, \qJ+<.<S}y rYLw#*`rq^ ŸA^<+y*o1$lD;itвA[$uQW~,ԡ/aS"[f?2JFMkMԚym8۟cWqisVkfe ^ʂo:4 tUAo.v zzU6r+4z͆@¼z'nLdG xυ{cj -h!q޼Z3^Vg@d`H&`8pj6O|T+tOˑy5\y x<+N՗2zF;}+f(Uq?0aΒv]OU)֝2VZϹug<#fv#5کrK`u/Y#)$0A5DNjWV2[\Nnd\`P(<JiBHJNmN̷HB:'R0+9XwHG=+//ς3ʞ;Vյ290@mԟs%qm7NWtˑ8QQ2챷 c:ċk :@Z<G-B=2$TzTi&> ]VAi-䍆sLGnqI\7?e2 ?~9VԦkl^ˮ^O4!r= s\wwufq q޵N枧)kv#%_ xǚ3ax_=QY~gTRmks?\ڴ0q/e5/3=:YW4f!u!/; }=iju]=߆JO` +@y|BZFo܇lKSC^5 QX}N!s&6w_k.mNymһۋX]F4Wm6amğ[⼊6ҡ/F py$Xlx]S{,r9*<3wa$#dP^+?gZW VX X/@|9eYbU$Z6.rN7#~{{7JbcfwL-+OZ0éֿPO|*Ԥ'6Ha~_kմ[[(+)ck(ׂvL8:I4|Ne-y5V-*9_lBުàkNmgfzwöI8 W[ \8xh^R1{6n;gμB?0NFն2[#'#Dmf ;R;5lkԯ#M tO5F 0Yq;6M{Vis&% x_D|AUn q]O"5.XACi LpuRYcqW ƭk+'Zo_ ]E+IbV9eyMmIqW5l$m~"@3 GL}]VU3 6WGSq){SeCu(C타}.;-*5YAX]I@^mzĚvoi0Yxs-nLM;)UYc-~WOImbbpq9'J񆣭 τlaCd|OB5h;asmZ\YEi)( U>pq]FW{e[ZXiqM3#JZog֮mu써03⽶Nl"H-Aq U­SΉզKW[Y\WFp:s_=|_ƏĵBPV0<3OJFR+Kz =#KD=2T6aGb8궥cC.G kj)1(xu*l2Y?O|-e7si\7VcG0O(q8\ z͵4MC}6 +> <'&_i޸i$pd[Yº[%Ե;a4ײ\J[{dOq8eA,i8qUk个3hٟkK's_yo]jp 쏌:.-s躊,1r,Gy|3WͬL\\8R5ﮇEuDR|<'I `kX {u&b 4K;(ʰ>+hV?jJ{?jvȐ k--#qֺu6߷ 7LsBy,Nf+,X*rxt#'XSmF`|=mфqvL$w%I >`}zk$jY_}`C*(5Au_V#^kȚ5.Z>YO'@?iKakB_S,n2ݍy;Cqjn8;}ѸW%+OQO^ٱW<1^{Kt0nUWNi?SC..ZwqR?@"Ӵ{E@R }kw5歫X Ig,2d?ȯb8q@ ש3ƢBHgSE윤rq޳u\bKXNsXV=xdT>p$fu h|0uKhf1~&xLmDS|]Oq?oJJ cq<&xV7q<ڵxxg"-_yDh98;=n|5b[tm!%f9qJ銉EgiȂUI'8txDma p;3f}z~fݠ;y,3^M2VN ʧo=0#R=<_L36O<N/Xuk9!h~ߧE)vHib2OE8PIo:Φ-&f \0Qy.BVtȓVү6qivJ7pxk?3W _kcukk9ť)p +ԓWоG_{m) y&Fs:V|!%y6%ɺ]kM9ܑ9k9^sGul[M/ Q(^f*c(N=ϡ+R29v8`}Fߧ~YԠgvi+ HxsnA| xEtd8%%$B\~9j}㞝K6{Ă]>Ki67F8,;ECڹW֩mM*(/5+u8F8ў7#vU),2GZ |RTh.5խ)%ճCq $His|Z=~]֖Z[xr2D6_0x_e׆u%u[uԅ 3 VCyO|KAON\uuc UkoæxNҬ! DxPp[^{Euuե5& TM ;ɥA]xI8CJS_oxWM]Q|I9$rI4W:/Gif:> 񟠮?fj[8ݦ2,zM;Rn-bmH`Lw,QqxcL2@'._Ze%\1а*eHU\W:m5U]- 3 &rFy9k@ WD3B@X1~]Xc*0.:UimT gR6f#=.5\qUjPiV`@[]:I$~x?|OwlQIw" RWgEy> a!3ʨ5sO~NkZ1,JXlJc$=Z2",N=:%etu睧VV^qҦ7loT4mpQNF]Qn"R7dӬ, (#l“4ex>(6WH7Ksnd^zטLD_tV*dta['tf Мb܏N+yYbE +L$yj>g8΁ m'n pk4Mq~μ"\$QʿF#w_oaИim8Yb12mw 89N{3WGRzwٓ7e_=~{}#P֯Pk ;#1y Ibx8^FCMt^*6,$Qdlָ;/W>VĶWK[>]1/B{HTG3R{5{}|\ož'LϓcS3Y x{\д=Q/5Q5sJQAS9%NrI8u]kZ,vw\I ݅+6_*UGXտ};[X, 7vy7 .Hn% ~'Qis?il5ⳁ7B0g^ᯁ˛7@%dYHRr3ߧZTt.ghyZFqiݫHepFcnxbۧ<{/]5w},I#$!RK/m4MPQV'&s8 pkb:0 >^ZVh=O&:Tmp&ݠ_Xx~/7],<4\T HS>\:"QW%3'ڬars9f Z@!fMazWQCUcuvw&N?cMYK  =\Nj5=-o浝Rİ逹n{ѩm:<͟$‚O?!VQu{{#;Y 13n-ZsjPE}j%D$+(braF:9]SѮ76+oo-2ُh8^ƙk;8Әkhoo%OsW*ڣb_ዿ>dR<65yJFs2q\Yl6R@p4yK5//ڕ Ƹ-^ ׄuhmˣ*F(ҮeEO[iPS9'+ahϜo/[Lp]Ly28==4EnF EHRw]ȶ7ֵ@,AApvX3p^L_>l$ Ĝu4A$J%pIP;ҾtZZIkk\BoX?VQLf';\[;$MUܖzCQ܎j5O%QYc Tޢ5_O0Csw$*(T:'ZZ# ۳8:ƙܳyT#Ň"KpnVQ NN@#cgZl6 [n|.cnh Myw^_A]mUbOC+ݒX8RnR@[: ܽy+#`f\Һ]26-W:v:Zm3R'Z-F X\c޺4+rf?n2el2MzI#RRAmJ >'VsHfY#MMW.o 䶍PF;P<_-t`кY;q(:$u7~O{w'uKO)z1]%lQ,b.\b:8qG82̈́U\<Q$Sܨڌ5nDMyk lb=`Z21^N{׏x.4;yvIbع?^vu瑎yM'ŗG\T)p=,tM256NCkK]4Ɓod'czӣT@7S1Y5i2fe?"$+jFon(!]U| *OΒ .41Inx<澒RY6YM|ۈ5{Y䅌j>n,#;N>6-42M4'Xa"ןڶcQE{Ec4:Mԇ>r0;W^|g-f}"ę6 4WU_Vxha/\G7>:𥞧x{H*q$T2| jzlf3KI4Rh܄z:7cSWf猼WMdޤ;ُCa/e$lR2ƀ&=@q_w7S\3;i.Q-qZ纎P<8GI{'LT1nb}n+Z/ k tƎ~h }54[[u3kɾ#<Ņo}(8i Y}_cd?e*I< VD]$t2Z{KTVKy r# AW׿ |,8PGU^c_?_/Z&,5ez,ָݏC3RC s+|۫WJ(ٴ;-3#,o8!qztd(=5g}ޝ3Ķ_is ,(TmaxzBBG|u~\zSk \'>|`nx"]A;_=~ P"S9>q.7HQ |pW^mRƞ)7KdW9?"*ACCLmC )u-bIFasۭ| /:x Ő|5#OkVF!=I W[o IƍoW uk:VSt>L k䯀#Y‰{rg'۬`/m``gW*kmr9͝'{fkj;ƘV @D o17gWǍ2D/jw#J$W5};-xf jvݏ+ؾFÖ|.?* q?~Դi|#okf۵2={5&eId0Wq+ U1-|Bm&Gﭮ|O<BԒھٵf{ _k?;F</wFjHElE!(8.8.tygOK|*C@˯xmGVY 31'~:گ5 3s_Z.tq64gJUdugvORNk'Єm4$1;ڮ!`WܿI/ EL.IӭDP ? baIds64*Ҿsެ{^'L־7q,8^w+ک2:CW8GZ4w>,,5T>jТU+">a9u=`/Lm̟μS\xcū@Ư!kIN~Tw8+Bi# M;}Bh2B*zco~;񧇭gK$c͏8*Ӛ:+ wj;Hk״8c ګ {5**SGB'Nf>[h$ݘjR Q=ۿii:wgTP ,NqYRw7ѻ5ͫUU}S{r ^&:`Xfu1sZhd[~.rѱ}Es͢5ؕqU1Ez]_E{xt'G:ׇnxҸC:$")Iڻ{ ,dhp Od+ju$.pE9 ii.p# V#ZW+ͥ}($n8#XXX )hG)*=o}5d"b:}ٱv³jw(2Dq4 `d!#Ҭ?ou6!ݔRɛ+a;M- *;}Z6PÎթe6WKXBHO6uQW4udVGyjRAK̈/Vi:+EchFd$`k| Qh`ğx׆濥j m{jo,>;W*yU ։?woxÚFiBtymeVWcQk qw;,SG/ ދ+o"mm;~ELiU݋փG|v&]GQG lfM[L9L UԨé25.RssRzZHNKr#H:GozO>)2O3[DeƾQ4jM/YYݦos<ג;GlD1ς 潫\'Ɖ{W!9@(.ݚBgc-sW,bNk'@@0}kW$7Եkj]=b$ 0I_F9Z(=9G~+|:)P?JZ~n֨Xֿٟğk CĞ еmZą6,H#ٳ IsBiU"[d^pnp,|ܳxRT?&?jAgE'eiQO޾IWc<O!w{cua_-5QP4zΔ9Ljϙ~Wqd_Ow/ Klr_͉(vgҾ<ҖZ)YDs_fu!m^3 ։uUT^T}Ex/@+u[{dBw={kJ\c8+Njon%]\9~25((?y;,OU_~¿I1,Hrrq^wmSHOD\ SMъ mv/a&DgW,%]s^qgT_4 {ĔGqlʠ?{]N6~e=©IғSAI?ПUGh$sao3i;f7P0Lӷ7QXKJ{:>jni"pGB1޾k{[Ԧ>+ͽT.ma]WɽhrUk岶dv$l?k~#_i&,+pxu95]&;HxH'#158j)#DComeԫ4ֽUφ"u9/ |Si"I2ʮ>|EJQr|Sts+όN] ;@2? i<e.V>0X%Y êsPW=_Cytin\eWgNMKIUeKvWajJ2Q[=嗽 bԴոAJ=A 9ֿ? c1hmCO a>nd۸"X˷~G u^@M4ʆ2ys8˝N$R#ypIX|Hh}K}I!Yͣ}loB=+uM^FUv-Iݐcм\I}@ tkmq%qt^# pdOR{ti;~}M5d'ӄ.HN p+vi ,Jɬ\x5OF>¼L׈~Բkvv6c q9b#sp"-7E֒H5[K#-=ĝl/ gH*v^:> :6OZ|C?t=H%ݖ2ҘrX8Qpv/f>b/S8x/7IʨPX +־|)N{wXMo[/lv[Ǔ1 u}JKIm(c9tD4?*-DuxUq^Z4{&$X_M]$F\pē eT7N6_lxpy*z~k2+O3umMՌl/B?ZY./7wy|W8x[L̃BF};d?^`e2F^qUѫ:~ "};p cYdO\+ ^,/}y5DW$л?%%8O#mozxCǘzW ;J+nֽ^}CU}+徧{fF( bĢ\!bO4Urm#+?~kQ-z1OlZ [qarQ\o)Bϻ*Ͽ>%-+tW\Y^ƒtɎ $? "jм0)+n<:k &K?,9/R$Wv3=ʞ%WfxmQL8I2p{*a"KvΣb zgIZ$=We`qNm^"Khm$ԃ ~_Bq_RIa'1.߾:nS-~ͨEcӤA:u|'u@z$^} +ZIuH uYq 0$t"n][Z0jQH5,%'=IV<2:^6?+SN%YnjcʷڸmwMo!x2足i W棿ӄᔮT5ң>Y]*qh>]حMTF獣l^!ߏj$L:Wbdy2:U]gWmo)HG ?QWm`fnC4k"K ]XFۀxCP;&<8#GKzu=j-c: ڏ+pB2Tcy~̪W3S8u=N9C7b{sMVŎz(:ks+綋H]قONM qB[?J:溟 PǢ7?]KX…>P"# fou(P,#b$sX>NJ~%*OŸ.X^mzrEJQҼ1h- {@l1kHj;Zs$k+LV6Fc~ۧE^(gRRճ?igⷀ&l״o4ـ}qWȞRCqA27pG_|xWStuLx[^|<'m=dX"?k^|Xy=hI:ku2J36+)i|ckO;m1DT'̙tR .:+g49J=xoxĺq%ƣ]f,Xbvl >3s]?uimnZp0ʁ>'i#mv(gi^YT`|޶B$, sm?/1e,J%a$U*ߦkұZ@J€ON+)f#֊I >w6gMk]6d{LV~&8-'H 'uO4_Oi4<[L'pzw73g .+{vOmn2UW]muoRDh r qj/Vz8f)ĦFʟ!G}qBkd\FċdZTW1JOc}rY"B-]H\Ih;}K)z\\zW=⫁ Ykz$?N+Sßuk1d]lĕqzһ]/itu])jl!}0F {V~'1ݴhX+7 [oÔbAWݾ.isTqg/tBN>bc[Ѡ ޠ2yXԟr=~LoG֨|NGu pՃjsaROq]/`:RO4W32Ǩ $1\OVIWcW\Gٜ>WNRW)bN8Yx}1RҺZ4gY`u⬭3:US.Yʖ*;CT蠟aE+ny! 6sC!BIcJe,je Qm-h lW3ڲֽZއm_Z ©nٯ8Mx:ږ@[}cMWINuR[ZTOS_q⼂/d0=k3ۋ;`_?00)&y;Ь o@w/_? c^oaYdD|}sڞ+rJǙ:iH<Rtx[_",cy>NShFYϩcɭ&ANҺ0TuUU+=DF zTG0c#֤HTO|\K*3.B|qjf5-*Vx"pQ;d??5_~m63G*8>W8})j11<5tk K&ЯDlo> v+ykk̻Wgj\TQ|GiZ k nn)$q g o^ 9jH>3X&?Zf+ 8A#ku|āuP"yb@'+柉zK ~YV=Tl{ "9 8T1E򽌽6-JtrlXzW˧QȬgvlM^xlםbU2]"dM#I@b'u=\ZGsgqו'8 \8NǩB3-dfrA_UZ1pyމaϔ@'>ϳ{y8p±q';u(AK;bqfh͸ *i3wA׵;8&#á_ơ-Mݑ6qQx8y_Oi})m,~G= ʣ'ڻ;=CkovUqˏPFmpic kO8xZZtqhznx!}2ATz=ՠץ47Dqƀ q^m^.{O0w {Wɟu,;f$ޥtiaZ"O!>!\ۭݶDW6o' :_`|!y7WktFY Ͻ|;fk#DQN+->x1 ._o,?9S:{# 8#_:k{ DlGlj8=+dmEnVVi70*wwwvy;Gy޽2쳶H$⾺*ғnL--`Id2JF@~?ts5ڢ,sEq+ vf;/ ?uuĎ!J5RXٲXgFaVr u(7xC>P>hrQ״ߌ0|@4 BڻG:7W$>dĪc>{G{F:(9j|fmLX߳wOOm%t9d&%e<?|q YjwsZAsk'Umb~n%XyhMRŕ:k矉@7R/eUsda^nCܩ#㛻ۘ'6+(%=ڧ3 eR*@3ZRqqGYWm]ٸTD%zzǩ8K;1=k;0 wSrjIQ(WRg P*sؓS41(#pju|.SNH>JK/^rB3y;?x.nF*rTzM"Qu d UG}3:"ĀG"Ox: 6a9jMG38.A=)=CߓܦI]ڻuKk9Do^B>5]*ՂHaY>u pҼ^" IlzMҀd9(^GOU;ˀ$mjWc?/--#KkXeH!Pn9"Bⳕ=jS,^cm#K@W(d[gZ:Fq,+1 VoEڮ.Ucyq8_$~?%ƻ$>nm8<3q.w x#8Y ǥ|0Ȅ9+7s.DnEd9/S^xk_ $-_WWt {?`M*$y5ľeDG1'*Xz^e*~̚G]I Gwщ.Z3#^~mh pS؉ @8­c$߁_iJa1X;]\ȁZ@ۑ8\ ieqjXqOj4o|Z<=${U cC]wxֹ I94UBfǷJzI[cnELɢfotocx/images/blur.jpg0000664000175000017500000025300015247006660013743 0ustar micomicoJFIFTExifMM*JR(iZ02320100fotocx-25.1: paste area|fotocx-25.1: Crop: width:789 height:532|fotocx-25.1: Paint Image|fotocx-25.1: Margins: 0 0 0 16|fotocx-25.1: Margins: 0 0 0 14|fotocx-25.1: paste area|fotocx-25.1: paste area|fotocx-25.1: Sharpen: Richardson-Lucy 1.0 5|fotocx-25.1: Paint Image|fotocx-25.1: Crop: width:819 height:415|fotocx-25.1: Paint Image|fotocx-25.1: Margins: 0 0 0 27|fotocx-25.1: paste area|fotocx-26.5: Rescale: width:761 height:373| chttp://ns.adobe.com/xap/1.0/ 1 2 3 0 8 415 846 1 2 2 C     C   u" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?O ğ~i0xjSZ0Y *~eI 3uf;:J "W.o*\>_UqTPk 92?se7\Uz MWEv}C)?s=SUQ@.o*\>_UqTPk 92?se7\Uz MWEv}C)?s=SUQ@.o*\>_UqTPk 92?se7\Uz MWEv}C)O]>^Uqu>^U} ?6kPxkY!ڼ7~+W>!I8oΜ3}s¥4\>^U<}MUg3^V,i鰼qbw`mwᦽZc|.,຤Z]=^U/.o*߲ޱᏍ7<3-l l+$\݌ 3~ɟK>Yyvx9t?w8J3 92?se7Ro>'@x_7˻G<ʫ?ƕ}s=STz ⫊.o*\>_UqTPk 92?se7\Uz MWEv}C)?s=SUQ@.o*\>_UqTPk 92?se7\Uz MW?Tz MWEv<}gcJo*GI&z%/O>\>.5EjWm}@xG'V/uO_Io5+eHddFRz\zP#oGs׿e/G.o*ϭu 21e|JǥcZ9;Xa]q O)_]^?SǍ5sR>⾍=cZYX}w+S{ZOY%ig|c?9\^ aEO\sH?d<\d9zU?s:Y=~h$ Rq@D^쟦MJ*n+H 4d?8_?9\^ aESw4?T+gs@Ex#zz!-Sw5Ye!'-OhJ+G`cr=gsG2E_ ;+e*~+WϠK죥λYǷhhH_ ;KL\[A M{?ƕp/k;~&ǚͮ[^X#TK9]s8l}A)M>V<_s6 /N9pW E. J)p=hp\Z0=h E.\֌Z.QKF(֋RzсEJ)p=h%`zp\Z0=iW?d~x~y(_Km3q_z:U9.VqRυk ŭ+/:(K81žt&DžOg-|O|]u ׺kw-WZ@yR$ZK{㞧NT<' #5{SZ-Χq{*\#\L]+(s8s#:ўs~Q]M#+:ߵ}^-{M[;χfN6sE&y\~էC%"bp'PrAGch{e>%je6 *xG/a6h,%4.G ͌;4᩾4l~Şm,Kf$8JX 2s_3Wg_xORM2{؄7!H J<jSS&Zc:ſMοhzNE.EC$a"lk aOh~D5b+ίu,Mr.|qo)^M^81*ƈ?*95B(eRzсV!(֋RzсEJ)p=h%`zp\Z0=h E.\ [H4MCW-Blu$; wgch ׏C?SW?>MFrFfq`x\QL((JK~ hzΏ]x [KyDr5j>3<5kֲ隦MV-{N02|zk7[6E+jPZ;5B1[gwvuxWe.mPn%s\7ax+-Z5]Akt8hr71;ηῊ^6+9u{X, ~Z31l`hMnOpè©93_d|ZD]Ϗc˹̅X@Ge.Z~}BS_K-n0~`qmW蚏 s]Ӧ5;kw7'FjOfj6YjZEܱpJZ3e X>/NxrOTӮIgfDZ6V`WA~Vvz爒4}_6a,$UC),Gp0(n%"ӥ=rQm'LKA y=KC/5YuktҼCezfҭ)%9'ns>7 j7)?I,Wzq:Rr8{؋v {x[\j"5C6)6Posw?4dm"D Νm$KK4R$!eֱt׏mo V? [j_]jJH(4rzWsأ,b4.TIԕo*27#L]?f >['ßrdrnchqmYLGc.sާOҊQ M~W#.2kny,B@.ߝt^𕯆-,]BR5o-O@wvw(%@|69eG.xV>,{[+}BFIu`1?ۗA-z^ ]r}U4k[Xe0$tRHRHgלvPg~KMnQE(|K3l-dHIlkϏG ۽6#80U\MUi,eh訅'EIHqV$̫{=^/uHw%ڣc٭?Qh8OxO֟?; [/|J4* i Jg'[?U\>ojOp0mzqEf7$y3i5:RQ'[8zx;O ;úЫ{;^kiZ~&k9UeU>[һ8:0=;|B?*њiiWM<#E1,h:1V?92(v<'[?UGǭ<mO _h+SW%ydxݑV8]<'k?!:t~!6ܪ$#pir~@WW #B?*Ж ӯt{fҥIz ?ҹ]ßjfMS.h-hox )?*BzvJW!J]t)d- Qd=_4ZL n-CClN}OzQp?*BzT'oxY𞹦B{l/TUR@$1Jx7ߊ7s|z6W׊X+ c w@]iB?*КocAZKGw,v9a[|[eq`>1f\ c?>$86W|vB?*׹x?!mOΖu(.O$('|KtkHi6{ Te-;?\q=ҳ) T6΀<'[?UG)7^}f+GEq t XF~ZA^"xXvlS67(.s߷J4!u Vwvw_ow{k׼EןE|QX"-g5ʉ@>Q+ m^&-bCduV  B?*׬fjִl WȈPY,}98x^vi˩[Q p^=EW?yFZWǿU'[l4O틯Q{kӡ9 4FMc<܆+4hr=+l1x>E5f_u/Z83^}j{Y?%Gn'OY zn]fy7m rON=|??uxu ͺGer?*:۝g'?4;oα5?Fw}Zw>zhonO@?ۓ>OY&cMU&V7IC0 js55ZYN˕eF @RLӼ-뗖6J5SdqG?5P{I4\jZp, ն`qr<%ik:Shw%Đ#84]禝rpNt8j{{?5a9&*Xrʹ?H I8QqnO@?ۓ>O\l#o;ɭ[,.0xn+ThOG':{8gSÏ}kom$hÌqZW+Csrh:acj#Դ=B+[MD{d3gv_''m@dZDz6jږgyơp)B\nPE-ռQ7VKfޣ:EY[ Rr~^5I{Mc 8'3Ӟ!𗄮ɤr EެѳpHEZu\8~tۓƝ 5XG wswpѕG_"WAҷYܜ:Bxƻ}BFpҽW|i ×A- QE$IjG;ӛh+7Y>˄id!TzK鶚A{m-9:ԔKfDv1k$[ټusnxc-)^35x= N{'VՍjְGon jW(j|?*ӿfGq KVS1Kuߥv:N|+]WğĺEƉ\xoJ9ZE G{W@:Q R>99XO ]wÚIȗ%xG19u3ĞxQ(\$z0Ap3_xqHT1{U֧x w'j~,gma\7eGr1?<9iTm\eɑ0FͲ$J}}'֋Xq\Fe!}-^$HK׌z/^oTǂ`6h?e??8?{XbrI{Ҷ>'?ET[ j_?e3 hŒR+GyO?u=kMN+/KH$6q` A`ތarì|%MFQg{nmL$6Fb!+?4bLԟt+,+tiK劰oԬ-.[\Ftt`ASA5Oþ|%XEv:]+omkvG*>lO|;|>|HiAf]AddC+(WOO^j'aUFHkX>YaTh7 :x?~w5P(H,|Uxb7^ a|oFo[,<[52ɹMÆfQ4;:? 7> Nfm"urW}Fс<đZ? }#Y/۬-lOع lھ8ӾxÑ/Cԡ7y0.;+ך8n=U<3z ]`]Mf9͏Jswռ+|ku{Rc>F"|M;۽̚tZgMF\d$i"  ``}l8|-C`wq]lɞф21_?ھ1Ҕ3Õ3>8xJ~]ǢOzn= 62RxQ=>*%O(umkH4[:O7Wz}$D;[}aK($g }TI޹|3ĘĚRjBKv2*rt{XVR{vzY@v w/eŗǫCJ:}ǁnZl// Pwa}{<xBѼ=[\ 9'ԒO$kdEKIjQg<7|<_? xIl/ Akh8i8-"X;1Zo s^n rF,qg<²\Yl`W9<@`t[Z:|qhWܘ5 ,6;R;S?g[?ij7_?c$}E} c/!Yӡ#PYAd}i2KcGJ>$J~ |>}SLk;V:?3\“Te_${7-/%мplfc,ǠtI'+h;^ɟWOĖ4iwzhQR8&Vai"X7<&O +jNhi`j!P"Q-+쭠>RbG/i |Jh_T񄗚o IM7|~gOE}?/lԸi1ahQEQE.lQEQEf_I_ț>Ee_IOșׅjkrOueov^H'G03Ǹ]e^J 8=;|VZ/? rw̴G "ȆBw7 V٫ML0(a285\y” B'֣zm ^@5K]j<[ks,v XG.2#s]-? xZ>g{YWk;Y:Wض6b bPp:R[} 1ªqp)X,|w#4W){%ԌaqXZgUڜ2So]NgbL@2#M5r`SCӤ!{ V2JFaR}@iyo|l6*쑐$bG>CCY ]E4 lUsӁV&/T0%{RU]zZ/92aˈMn̶ȫ֤Yu|C5'[G4u[I+v!FzW_fL҈cG>ZMMkÑ"@03T 0?5|!aB|ԈҬH$kۖ17-%d=qc5Zڅʭ2Mpa n#g΋ c[[wSS0090R֩M=vo!i01 3ΧP_ <򌜱>_9WqX>l˶]ȓ^>U<թmJE-:NȖ5PZtZ6Mz׃Ӱ7/R7ESX2iE1`8BJdGsG4i,mCw(ICjVHޣwI5zcC,/n0ryMu/+[ +VsuEm,T }uŲ[Kk鍑<`A4;Ua%q>U-7&W3oc%Kg-ܤ"ەf܌}+|jnOtZInak,0\+,쭭c+@5ɇplӵ HvN|#@lunMfOCc3\G~ji[}_=kéh&ev?匑c:tmIX+4ua OO__ iq(Ij_=`тDn/5} Jk(^S, 6{A=GR!|w=0VO5 }/)'Inf}hR2{~_\g?Egh1xզ{ҮV]E2 A>V!坾,JW;&otחdIJFqR nxM|Hosš,tӭ/(rVNpH85^'7^5fHẟ*mdHL(NW |wt}'R_mq&%Y6=?&xNUCŶZ閶9"Y1*ԕwsz']4_1EMhocd#((r\/hxWvpsbѫjF%+vUe|xʻI9O¾o!7+ĞҬasgwknche$_grx5C/h/1%džxxlb6nq'P=R :55&Ϧ]1b7F!bp9Oo)@ō:[dΌݞ8_'fIK;>)^麂x!ңpy7. u+鯆ִ_{9] te˄`r6[~*xLaxg4]kL>d!A 9o "9|?xoj mpZ9vg03P|}}uzAoed"SOv ϣZ^+hWT!m@!8\rzKnwSYr\ZMn_הexy'OԵWQլSng'hx($^|Bdž?xKIƺƫjv7PFFRz~ǂ54&k2xmڍ{&=OQ"9:FFU#EK4m Hvfp=x_xj mxr_ueN0Sj #m/1=2Tq McKscb|f 1'5+ ,16mib1 s^ckg1<8<:2ӵ=N򭣼䑎*HGσ>4o~:i: !uMr0@ =(^AIw–:5vN֡Ƴ4WQʒ:e\$3[^ #ėz>y̏U}H3_<~|aVt "Kt{zo*6ؕF-61.Fzk[oÏ-Yn4g7ΣfR|=1M6qZoaT;?4{/$on^#Rx# oKG ?XE𵍥{ȒTff2a~QcVM>%˺ý3]Yk/`[{xfwEfyU #o#=Þ-7ϋ%Lj-tm&Jf JhbdL;34=㧁%4%ݷ M̎H.H8  ~y{&֒Cseql;5Y2b-|~̾=߅k.K[2(oAfOl#| k߄7|u $SZ g HኀpA=*KWhxcVM20܎>REq cֽxv 6w rᑧo>H6q^) ;w# wJ4՚\bMQ%!u/wrͨV7}͕qvI\G88`>k9|9<R^0{76);zW[xWXhSxr;/鵦Ym# ,/ZZCeqs-RXcr[9=@85~_2ja!D1E(w9)R;Tܗ!*1}W| ֟wᾙ{4ON٭iD`/j.&{> u}jhgm.`dX(NTpw/GF 4ɘhx#|ğ|]🊼]jדGị=}-t,SvC8~x ^=cS&Ӯ-rF YA_1y}iGGT:h>:@$K,Hұt?w?/kmY*hne^FI#2x-[irMSQӦWP<@ѡ\9qMyw>xL?g94?kz֮4MHD ZD<]j{߆7x':5Mq Ӵ骾 /`ʻώuG G"<J5qi'2Kگߝ x9dz/]ޓcd4Aͥ]M2cd&=aߡOH7|a.Qk5<[MEW[pjr}@x#↳RX>JIhdS  [? kCZX&pfIEld|6Ѿ$?,Q;Ou0 BBK >[𮽮\OzlZn]Mܤn $ HĂdo)Qh7 5*O#UKm.Ȱ"4CFIx+qRO|H.oRm Aƞz r{]Kf4kZE̪s٭ *IU-MAPyq|Lm>XCfS#ݵ+GWZPU5ޝ$:މ“ Fm޼)F|UI}UΖ6W!Fݑ`p_OzNu~}V-nn.֓v M !>P~lU cI7|y#meOe-u3 (> x|gv]/M<+ekM4RC$\c _~?o65PX@3]3tHL\T`~xBFev7'Ka6al{^|"<%^_> wqĹ&Tx22*,]]^4,4='ǓKe␙o Sš?6FT6y c4rOl)Z;ZfZx4;Q}Esaso<6社D>eB?:w 46#:eSIZRn=I }/u-E}B .lV;シF2->r}{:ʍ<9v8UUPY؞$Wk-wmD˩:Jf<r9J|Se]wzh5 \}̱$FEfC3p݁W7liռR|I=K-,nm9 "5ٷ.$); xIeJC+{Esg5=} yƭ j |'S֚:\P8V#G]˿v8|,<6 Oֺm$ڕ[a!T.w16)\W ˻TmM2.-, $JgL-/?d&χV t.%c2B bZkv[&A,DcFշ@Ex?Yg˿ ^z"fծn`k=ADRΡ\ Se3ܼM|9:/Z6$S<ĦT}ε|q_ß B܋Ӯau p0S@ ׃h 55_ WOѯ]t緎y""A0[c{C|jGMtԲeD*H?6yEf_IOșׅj˿?/Z83^ |?!Ơ]4+{c -Ɏ8я>jYkG#>v,Ə^C qgHxiM?. J'? bA_cpO`pWi%|7Z9د!WiE+5N3xmd7[1\TMy(5ibG}VJ% wI:sW?Ə_@ߕlu`3UyshG{m >[(cqxj+cCW?ƓW+5}pv6OpJH2#D(޴ecVN}-Wi\ b@?k>/r&oq/zԖz#UkZ?񿉺?4~ "!޶2jh')7zHT+",9* F /xcq ԓ4f$eބ0B*JFքZ§D5U@@ۏ³ᦎTY÷zaew3Le%]2ZA0 w0+I8'V3qI=:>_EiQndϡ65$lَ9\}/i1"Lj[O{Y)$k6 ̥H$xRvGb%ZhQ^K0W-*%$*<[?5CG.>em&8[;Tpb6dZW35_4τ>07|)8/}8^ۍ{F 6OAwz _6ֽ\w+ei˧{y1\slz^GC^aXŞ{qmyxE"r{כ>;ϴw_ڝM" ?5*dER/H%\kי􏊚.YᵏX_#>XuvMGojojxkZߕY`Yʓҫ KC؍hxDԾw캄^T25)Z{~\gCz~?k-*|Cs`>$VTG%$pvt4/FEi܇9*۰W`sR JƜ,4m:JVg[[1,͵@$N9$~$sҩy=OOΓpݷ<ZwįitG_LRv2N㝟iZh|[OE %D2*O*\jwz}y7Eq5ĶV>,õ$'Cdn^qoG> k~+7ZVo4:~/DaQcrAqKޗ=ʎ޼t/ðX>_Mbŭ[vmD9#ȫ?>3{\=ڦ3CaVqupTr?AQa“i kosT|[P\VdHgIyxs 34kz-m -;O2Fʤ Q'#ߚExUx'\t"֣olN'jLx;V ~nqNԴ*I졜R0' F@QJQKMۼ?shz6-8LD/ܨֶI/_kOyxlw:#p j*I17 fW=kG#(ڬ:ZC]CzHWY6]Pӵ]XӵKcz62AV4Zq;WIᯆZwokݻ^.ص]G\ zW|T2PwMv*,H^dḓI)-+L+wī +\a7ihwr$8 ~^7iIJR\[i./abG  rN1*<=Q^C7OD>X'/Z}>Jy5 P$BdKg$Ӭj/]~ PjkɣĒFyPry楌+0oA6_=·zg1Z }Փ_'o+Ei5@wy8'zGNk|#T/Z֓cioZZ4Z^I JeIp]M S$-{8H'3Oev:1_>xWU/ำ{ -%QI<*HlhޝfFh煤 Wq)9K$ 2=inW~~ '/*jZCw8X- .'?1oxi'c4ǵ&YW~X=(i{ESWQEQE 3/e}KV?L׿EeI/ qLښG~m5wwïEz9n0*@((((? u8u5|h.d];NR!?;8Qُs_vkmr?2BZEIxJ[K$s^n# 9R0:t+~~3oEX>t˛xXW N{UK㯌m|c/[+ÍWZΕq7H?9&ϬxŐ ߈ɋNlR8긯uKimb$[Ȫ>`==\^ᯇ}[minM̨;سr r==);rS߉<]h<7u[#\"m\*O|U-𸰳ڗV~!F|XD8pc*OojtO |7#ٷ6v?0a؝,zO$>cO?x:&,P,zKAAWN< }t?+J;Ñn(~*Ԇ4Ӭ6KXm9F㽙rr=kක\)<"3y@v8#x-f=sRLIwocq$\] sÌTWk:%Ÿ%y̹[xvdde<(q+a>x$(5կvDq"[$$ 44t]JG}G{n9̎scy56o$ MS[/[XM9* #j[[>imsio^)Wj^ ύy*!E “vҁ&C_, Y˯$p [s]Gg_| Þ%^Ye{& ۊ,O_ GQa(gu_ُv# u)-yCD.b!%%$:`+7ZA3^9CNQcw4 ,,"ޘo*tNo:jKi!q K#d^ xX<{ xwBliF52R_nF98rpN+I<:'*p zv'>*~:W{qsyc{y@Ѯ7y`k/g^%>*+³x]%l|3e~W-Ƞ"93+rxnrq6|g ~~-l]eլn ldG>Dcԭ-o˭m6N>A(`cNr 984 "Р>}\\ZCyDo:$RHAx}jkMjz$X Q@ϑ>|bůo,[>^šueƬ}+xZ(p6zW|ֳ qA}Z>#|18eN8o9$zdyoį$|K7;ۘЪ>~* [h4$|ZZIt mJH6k#pLqzE7n||J-o/-A6ںjC"K 3Eyƞ*xIPɠz=&o>Ll2GQy2s $PJZoi,6.Zxv& (,>nm_ 南o%n΋k<@)k-lhc l-fkx/rh? IX j^Ӽ'xWzƣue8n&2IBXn `W``cf΀󿃼 / t_]jW_ {pG6A=8 +/?h5k£z5CV=+ 1ALyQcӁ+ǧP޽Yij^9gt<F8 I&[~o^?5ʹ k~͹xVMN?xϥzPbA' dxG_4;/A.oH s*;0+_h_ _x]b QpHApeg}@@8 d…5s˿ik? > KR[v) 2;e |*wKL5tye3 u%2.#W2NѓL,SYC0:C,<==|CG"^'Ӵ?R׼9{QwvZ* A6FAM{WOh']0F+y# 0 JĜ1):8>,;7 [Ǟ-|ǥ~Ew7ڙY٣㌀+'MshgLu; h,'ZϙJG%JՏBWx㞜iw``㯥>Ai?J~']_ C9y @2PHW~_x^R|#eѲ+V ?d*w>SI+ZǭZö,3Э4u}$QOR9pk~.G u]ɯx|j jq4Up}3|3~57~]QMI^~+Jn  <~BXhZiQAx>i~0:0W!:8+ycVH*Gӧzee-[ȉch ȳEPPQEQE#/_'eo-X4r/Vb5#/_'Lj>A<krY'/>9m¾'[*-ẹ̙v]D;_ŷĽKU>w!:-]D;_ŷ1Ns_. Cu|[#_ʌ}*4>w!:-]D;_ŷ1hM+s_. Cu|[#4~&s_. Cu|[#_ʌ}*zv ;i9 SD~3<Ͻǹ`o.t/=_I~&ҺgͿED i)cHr|z{^?'5hM]|~?oH=Gl_Xٷ?SW?4v| ?@e֟r]~! _i+/Zv ]^!/㔫 ~q+wAv|>>?GxmqUv7bƌǒZ B?2MFeg\t>q ^3{O9RAͺ/6ڃr]v i>>xe+':Z;cj.g#^֟rǽ\~6x0?g{cKg[]o izwwy},+Iy@޾ǽ#.֚kX5-5fy'>5?sY~"X۴n$偾쌕gjj=CA ep'HMx |${oUƧ}egypʀ Nzף]kjwH!ڌU㏘/5>uO -m3.qys6x!EAҼ%6oϤa~JrPs^E|;iJezEo"A('}۟sx_SVÖ>dmDP4=|0ں<+Guy}k)u4!|p@# ZQJ~^|x-nċᇷ7K :(~Sqs{V_|m cᗉ>5 m9i!!v 8hTy /h|;]+U9./_- o";Pɻ~h`}GfGә }ThZ\`|ߺw\$9չ @LQԫ G -g#Zi^ P:Ӈ[34*<`cJEΞЮ> |F>&mG.p7۽IYտh5xJW_O [x6/$#8M_oSᦏwF м6un  XyB1g5ghwK{L-ώ[a8rPJ<ෆcQu=]u NJJ$͘k0ykDΉ5/}G[Y&W*`:|2&i粶G>p :&9sp=yŏ٧[>09gkC¥RHe_p!en'dydZ惨_\ZghčYVaoi~<;hRԎkyy-#\dգf7@@5C sD4]FOqs,n,>CO W迲7 3G- oĶVk5M^8 `LEǡ+G*-WÚj6ڼb͒(bVHŤqzm9#t? <[j:g½X}JUoWT!5gW!l\'GŸ y k>l<;{^^P^Kw"u(jqq!@C ʹ|]_O5mkEе HX5&d̆7tdb2$xgEfp%;JS(vF 2A=J#Լ뚮oxzmo ]]]K"),DΉ]/7'Xk>-Z+I' 3J8JwZws~,|O|7\A~ξ7৆--\K3sbg1 `T5_/+|Oqx7Noenkd)UUWP}*◊IKxZš}v1}%{`0,Im$1SqOK_ jRx+GK~e |WU+0n{|2g]T>jX&$mXAU?xp^*}Vgy~$pLg`bǶB֯xw}bCtm6 b|Ԇ /Wu)GmzwkAq% L["\` +v- 4? ^Sk.ۡ?͵_clBs/^-wYKCӞxyZo wZ}GqcA'.KG&qn@ 7m}ٿG~&.֭- N,'{&I" DHT0R4e8xG{Zg%qK>YzNc#X UN߳TUUCMG5?şu j(  Ogoj?>Tu-mOTCMG5?şu j>| sq:%\j˥kᨣa̬ {|Iۏ_p\ d BQZ.K5(,[_oS]C<,T]ZO?8Zştױ|7<>j^;/WrmZoC xPPU9!𷂾]gPvڼEqpr7erSL?,[koG5?şu j~>0uiɧ}BW_ s-d\7xGcit4kTW3D}O֧ra?,SQ OgoҊwZǪSY[5yU( P+ Ogoj?>Axz[Y>uq 5* aH*6w-ȣnPZǡڟ[GW5yXWwz#S+yxlpT{yV[,¯*z5/Š@>=og74C\nWGp3+')4q:ǽmv[:kF@#nuHUҲ*x4s48=LAPz椪i&?Yd[@(((#5[i]a\uzU=WEfX67uk$#H$j Fce)dVF޸?0H#xƗz판h"̱$BK ?= VB%afZ$Y6Ӵ{GdCHn3V]Orxk߂f宝m.w 78b  CETI<;˦&}BY$ P @ XSg*A7e{|+iUyYIhQ1}`3=ь;.O$0L=${' + +u^|$:rsר} 㶩<3 7Ó6߭rfW*RD܄4a6{l0;'ґS_$x4ŏu/ xkľ(l5(&{g<85܌9[7'JuoEtɵ?Yd6h)%0aAc_Χe߄VZT񞩩X5ӈ3>~0FMUs~t?*k 7jKO"O ?#O9l᷈Q&QJ#kXQK6zPtC0穥xwzgV bf[1$8}ƾ,|=.V{vV̷!LHvQrHz;c{p0 /9|~|'}CJ:D^41HF+50e A ,hUßuUfA-Bk~b%ܧg9\Oe9'^ʼWux?~Aֵ_{} ڬv5ulp o$|"|qhuZ<\7aC;2+ n2z1=z灊\99}hiƕWQj6oc-s3Dy #_0'8KώǎEloų1 i$ ˌ Gc_jV v~k毉$? OYkZFawGVDLjxh7GM Jv7c~h^ }"NKݣI`w6a|o\Vjk׊toJIUVI]уWpd^s7BW/'|9Lcˋqwc#,[PP`33_*]|vNJg[^<xUybd[O([Qo-V7#}jP֦Ư;}SQbg+lQ +9H+M`uR-|sĭ;lzſ3/,CwNH"ʆ'a 8=+ğ |7_juy;2j,\>t9ac㜞@w};Rzǧ|kc[k4h>U558HA?$CWr1]5 |?ow|1(5;;YBBN 8Ǹr}}) ^|zES?;z\m&:2)p > M[^?dcom|aJE"Ȭx,20NhϠ;?AaҾwS26VZg[S('y6<=xF²\>o[WhetQdE0RoPN;EgnTg=={Wx?׵]kOמ|du#tYfXxA 9ݯ퇭xcNeB/ ^jm}-bk=Mf\9RhAw 瞝ב/۫xJOxV8#kiv++ &Z'Ӵ l'kc#{a Yq}+98Ӄ.9oξno4M돆_gKOF#;gi$boi}NUxW7FV՗aʎ\ FQ|$ps?7@?08 5k~zW#DkP_79⏘` ι&?+w]#I?2IͲ9&ՀbX;r &>';hnz^ ~ҷ1͊He5UE8V&g!l!ϓxCmoxt_#bT-Qg0wO<qKQc=;(׏JOڎ;ρSXբWMrvm۴ӵߏ)_ugm8WR$qA cp"ּsVM;%XդyN6 V,O)j_.5߷۶,-_"Z8eB GVv %}KT,}C#r<ϋ #:mJiYv~]t?}4K"qSL@'*qWc g&=G)"x?EqԠS??D7 ?L@')'gp=/3=#Bդd~$PͭKsh13~/xloA5ic>tb t9R;qҾq5̋ošχ'q_<]-[7q=I[0Fc^㯏2}W"@yBUd!wO^kL@'(5|M_KbRGӾ +֭|a?^uRK=W|p<[f{%߇7~^k29k3̉ošB'OsT5vѢv4oApаqbH۶NA85K+>بmn@w2'sQ k&=W-8S??D7 ?L@'(?-t [ºn4& Kn|**'r>$֦/u]^.5 nX Xq}kxsQ k&=@z|)ZIoXepöG^kM|@')?LxKOcqGnǵ3{{_vqZhcx4z#_:&C7 FTcʦM|@6}¿i>+.Hm-IGڀHI'gG vٮiKht?w,,m*Oa1)bsB(((SS uo+/+we蚥X(iܨb3"C#^erOj Fk#N9=U4K?]ldO`J- q-|WN7Eԁ8r`o^1h?e_4:tFuѴGo'f;JUI8[?z_WzgK3!$2ls}:Fќ tH)h| /xx>,ӴBFҵhu]9`{X ޛo~>4|S"fѬ,uM2uay;9X`澂ݐ8x(gDc⯅ejl,o4? ]vw0Y(! OyQMfږTF+9b-6ke1֐rx=rڥc&7ZbiWXe Uՙ+L?sK.ƕmf_& K-/ZQT](3o q+7xRPKm̷seH`{n #8ޗ'3,x_w~/ol|)Oecin^gh21۵c?Tu د<\jvw3[NVX0۹IH  C,ʄqzvzK;H8JqK\W)\}֩!U =/-B \rz?O[++hd(cq@H%9P0q۟n`Jn^ւ9_|(w|Ay4jom%nm\o3>1Z|@4}ccX5La!g!v|d⽠A8Bp2CF|Wot[f7-gPkB\1bƁv0 y4~.? M4/N.OimhV)Z& ;Wѹf=HyS#Ԅy>ğxMb t/ %[}wia6MnwgqO#o}>M, 2+07 w@Jzt3פ<7'ov诬mK4f s #~;yD \X-E _ $?1!F09RуeoƩ򏋿dj=ź.WVH2ީQ+B0 gWiSᯌگ=wNM#[=WNy%vF@HH'*y]gc}yn,n2KGl~4G~ ?j_&R,uT Z%D rQyU?gkweƠyG "$}$,8JU%G|n$kUV:H_oj|;veƑqoY=S,ˑ`>c^\$3}=:?қ(\1u IA9MkH] "1G?*) /m-ox~-׼;7<; ݩ\c2M7$y ^ O)徝I9o ~^#4#xRԗDzx, K*jS'w8ƿω#ji033~Hl?P7aJ=$=0r?$||/Ǟ/5 ]itl#r UI_4k>&uyE͖x]- #&`+g YG;O}#o#くnqSm]o7ڔzt~ף֥Ia.g jr6J$X>.&+%{x$Aǥ{^@FN >?V<ߍm_YSolo<$M-p%Px`ԢHz_V"]yawdnI<_Bn|{}(f<|_n!5s,>Y~Zf{kŢ 'y|w]k}ީA0]i`oߞЉۅXuQiQm68~#N'Q߷iv<; "V}Ώ_/ǚݘ%mo! 9sk7CFhGͿ?eSºuC6 };mΦ6Eo7q 9$ktx>gKxk6wI;9-g.L*a;Y,v}340S?> g>/AjbIImn$=z|!=U*ƶZށࣿLMӺar1X9ھ4d>_|j|x&ƚTҼDRilwo$'Wh/tJ,.( ֭-l-zvO'֕4kѾ]>#Ox'LHEݓ=VEpˍAu={Zx:u/kK-X2I<+zY4pϽ+XM\8/Frԃ%?ț׳V]ψ3K?uz+XvE !O3T+VV 7HU:z}o*Cl ooɤv)~t"pR{W<:\\^wZZE5%~c$W=Ix>2[Dִ/ xzƗ-i&Tl7eN_c"vӜ`F To:ggoh0 3P;+S V4_hZ%$dP$@I-IajYIY&XT-”?k~|G^CUZmBX[+ɡ^0h+8k/Z76_G]cQ^%;bק.2}k?bo3{}s޾j=ή.9v%. ֩}#:f is'^ oےĐH[z缓d:k>3|Sv[Lwiya-C By'$=k//'|=yuu OKgEΞbNMCJ;2yϨ}) q<5^;Ѿh6zkm**b|b7cPdov})#@+kKꖺ?hϪb.aHd C?? VXFwoVe$ҀNS_VK⻴9 DN6'Z'R7QhvKsUy$& 6LnS؎_=Z%$ikgfuJ[5rU'c1E3s+u;'A:9nU|Z ?Ŀ^eq@ŨWFh5Om@h}y~jhȠ 'PRW SLh1"x[OQP~>WFi \ӏR3ܴ랯}*hQƨG+i2O~Zf O^T'ݪhp(񍶞ܾғ?rz3@iiܿZ?h h_w4fK&x-p ~tuBOiϻ3El/GM?i}_٣4T 89j1g;m6٣4uMi_Z~oWFi(_Z~oWFiG:q̟fsISϏԵ'Fwc@,5\(d >Бtjl溺#d7 Ntwl泥l離cU։( C 5?›OHT@\/k ptD<8)ks `.ؤ #vGCI5a/ n9oIy"n^YO4W?/ț׻U-Iº$jlVwF$A$2+|GR/ c\nt]*[{gUQGp3\ fū AFcƑ0k76{N%`Ԋ,  |;? 7|;}[Qq52$ChһOWںkۆӵ>B̍tT?.H秽s_# 48u}yM{ZKM#VurFX3O1_7x]T~ml/F?r^'&sR/ٗz5tM=S7 61AeC]~?wz=֕%EVN&P_2Kd *yD]*{i,UH +.т ] XJ۞C ~s:fi> WfwxGF嘜t$t1{CkxOv復x+ė.VB.O..aүKٖ.y]K1eW][ynmkim.~e#8ڒ]F?;.e߮4\]Mq!Črr}_^<mBM;Jϓl$Ğu>0|5[ _x.Z:/ °oټ|Sq{Ꮐ,t 5/ K6Ffl!=FY\\ltBKO)YaQNzב3>4FAoumEn mA6ֵσ֟ 4>F]>HY/&f+,!wye{`ȯ3gҗ"쑓=+/ [nJL"z=k?_//he\SAni? )V@QEQEQE=`тMWG?0UQE ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (0|gYY.HPsy#woh_ú6ዑ_j/stцh7B,[gcNi:G oj _j6jcsau8ଈP /#СI{`u]nk+)n"J dڃ.Eݛعvک$#O~ :W Օ奞q.7Z㹈 -3lIZ3TXןh?m}"!jzv^Mub`AcDc'<?>D$VYWo]cY ~h 8x 宑A=∦Y3ײK2: }H29zyG&՛yH/xyK&Kae,F3_(|e=~!4z-b=n9ltie5 dxJ@"orZ>(ˣGw~*}*H:j}-.2"[0#Vv~3w4nRQdnD S޾!]Y.kkqCJ"IGXz\}Fa]?qa:[K"R 2r+IGA9艔n|5|1ƿUh|B1[Kȟ?-*f9@Ao_gH& N:qzw@:cKްEr;~z% _^g6R$.q8Cs~M0+2|sWSՔ0M+:\0-_촘sO^ޱiZktG"e9Qzjҭn mv98U'rH? tw^<K$H>皨\ׁ_@_ kz}7zG}Eg:({i'}F^%|P_]ꚠc8t#igB4wJF1qо |FsMBobѧ";,.bLN;ꚹbmaQ-wI狿< |8_¯"k>ǚYAfu RG\ %wzټk&x闚^-d9o '`FGjjZdPn T=FV+x>rOBRz&>h,+?_//kBE"^:-'AV_?Vꦓ /udQ@Q@Q@n/OO6>`~u_UZz:݄$L n}CFjƗEџu ?R{o5Et\9_ѩ=5/TX.9?5O5/T}CFjs?4g}CFjChԿQ`.g?ChԿQu ,+\9_ѩ=5/TXwEџu ?R{o5E蹟3sTR{o5G!4j_mƨs?4gCFjChԿQa3sFj!4j_mƨ:K%]3sFj!4j_mƨ:K;s?4g}CFjChԿQ`.g?ChԿQu ,Eџ} 4{CFj 3sFjx>ѩߋo3QOq_5E9jRA+(GTXwFhg'CF~-Өߋ_7E9E/fԿůJ}D۽t_9E/fԿů?3jCZv hP>3jGZڐn?4gτ#F?텯K#l- C?4g'}C>~m?/"74j_`/g#ͩߋ_5H<#|?hůEџ 4ϩ~0,;hQBѩckƩ_ѩߋo3Et7ZYӤveC/Tn?8*חK\r:Һ#gqk7?*vg<4OcGy9GɤmC'[F,?(OD#>~mϩߛ_3Q?$cF#9Ҧ^?J4OVѷ*ap|t_/kiR?X9lh*Pʺ0I.n \u&m[R;r QZ#ٟs1+s;j_ _g'ڑ059|xhԘ֧[w5clBcwu^d+B;PտHu`21lUb'5EKUޢKQKUޕ׷2_%Ջ9-L d~d~VeܚG? 76+G}GvAQ@}?T-s:mq%0`">,K/ >}? S s3$rx GQ}TX.O+;9$M d~d>1\TK[A٭[CAxkCp*ǰ?ʛE_""G./ -ÇEY ImEcY'ݛlSO8oErൾ?nQ[e=ِO0 //߁G/߁Qgj?oJ? 7//߁Uúo5;B4Ie+ho'ߟU<p#Ύr.84 4YE[O"ՐQEQEQE|u^ۇ}%t)5_KspM`r< csQ?kDx*Ue\IWƇC?,nWPmLM3]DŽ~xz?/lxf+;o ƪKPq@3Oz sL?H?sdžtOO*<5V5ځ|d4+RH12|C'*2x=)SQ>?)?OztOO*sh/5)/mma*f۵JpM/^>#𦯯iv ]{Oԙ&-!G гt|B։?_;c M6[~שi΁q9=W]f+?I-־s@L;~{uV>x*zOW𶱠{1"6hÜ3Yl2l?Z?'|@kDƒ>?U#ҏ*ٰ<3g?*Dn=?Z?:˻ Ft 劆 ):′>|@kDT~ е~RU.>4B{Թ(i$=K Z +'H_oDR;mdGWxG$?;S"GOs> `7UM,c:s^,sZ2KS4}a۩#~Ry|m5l)FY~nAºCm4[=OP=]݀䜿ھv?j_kq_+1?uFT|Ӌ9[P"ByűC?|9$J@l^yſhׯA MOʁ^)a3M|\Mb(J#} _G״=;fxC$n>Uݱ/4%9_=c {kyhׯ!E]Z$p*̤>Ӱ`qҸkO)ӴmRN0/߉@9,x5 <O7ڌO͞/_χWV,oho3캏ioN~w]0jt ^gk;9| |Sg ZÅQkv\2~KxcW2\jZ$^ p?_BߋYW^|\z'>47Ѽgkpi׵;Y#Y+O=o ?σFtڑ ԍj}zyZ'|[?C#5^7m<=8FU؈e}§1G>}xKWl"hW|l Ԃ8;hƝ= Y517ڪ͊ 7 w]ԼXh5BՄ"6F,3S)|\?C34 ylyZ'˾~:]f [@+k[F2 î ׌L+clr8Kf}q=--/-z=i0Id}w<j Т?<=imk γob&|O4o<ŢdC?J?য়?_+x×nHD/|g'YЕ`UԂ G?&Օ>\?D=H৿\Ţ|E޼^^'ڄsx=!tC:<ǚd{׃S6 ͟UKաog CG4/i겥\Fcݰ_n67TY=p<w~+SSJKce 8tL:Rz)T޾_`m>WoFm&B.;s^_ZmǔnJ4Ta<{Ɲ/F:Fty$tk %ƒfM>lU6v>+vZu;hn-u|)q0Glm̪G^c៊5SSԥSInCF+.K NYhn]nfJGߕ4ۻ3J~އx#yGIrKD8]ψ^-4ۍKP%W|=>/ ~Fxzݷ~^Cnk{2'Nu+{Myaw7$Եq o,uK GDsX\FA'# xO>h_۝WO51Zvkr") A5{ρ&dSﮯ4/Kk[!H jSe xZӵ/ZkJ\0 f2Bcz|EXkP^ՠO ` w1{?~u h3+tr@Nk<×Z͵ų\ٛ h N>ށxf35ӤS-̿gd-98W=#%uxOP/4׺ذ2ŏTRO5{WzG|_^[I:ۘCl>Pi }oZ[ C2I fY|]o uz!apU0+uXOMEv ~R~$@Ygw1B~;.k5$jj2?s״x? {q{au5]jq2'jAN <;ͷ/fqMҚvw!}?jO i?h^/6pHxaT E|>ԵYuqr61sTe8EbW7O<<Ӭn-t+^}RT&ekBhY$pMv|;XvivJYڋI03 ^_ϣˤKkhD2ُ5̧OzvM\?R Asxhڟ"[02oy xJm~C\$MvÓ#o%+?KCg{V_WmY2  hj-,5MnvbcckOl"׵ %m8jP-<2d#'U'qȒxcވt6M\KudIs(EǒKdqޙP̻[` Ɠ /uSHUqOU((()g-j[Hҭ_op7?J\ނG*AKz~" A*!z7?l3Go ܶ6Zm#.xxImJ;LxǨ.IJgrN;ӗ? %6Z+_AOjj.#Sn9\5g II㰻N[xf4lm9|Vdd9$=Os4* ׽BB>Ɛ~~#7+xKx2+"S/n$JP$*@'i~5C, YwIZd^\nEhǧ|((8vH9#ΨGg7Β֗qG!Ӥ;$24l%t=>uik'#_x/7Qd`(n15|oɡd8N~A_5sФ}B㹹Q$m*#9~p2=GNⓨ cTv^'{c+x6::ŎZsqƫ%ţ_9+@J[$}*{ŵ299]'($2=~2[ҕYQ_ |}e6jI*ړyI3^ź{hYmH63QflTn~$|<$IFvG>w 'LDyzsG].O&ַM.Gdhk[໶bF,O@zO <7|u_l=ljm֛qV7#?_|>>xz?^,8֯/$hmenzxoi>ݥ6M+$s!j]ZI/\Z[B6$'?.b`Σ-2?#fA\f{ Y1Lm%}邃i$.a4a>![-$Y1 VxE4~L}Ԓ5 ղJV== |^0 ZCmtsivq{Iwm'XS࿋> ~j>$1"˧ρ&0FAQϋm7<;YG{Kj[F d>air͸0"LkLZVxL,nUB6+ǼA,t$Z_ZE/62E 9gl|\kRmZbIĄ>~L |HW*V@:N6`m.0 4</Zbj㿋~G4-ZZnD%@H]P6/mmTG>hhc_K e#sm.Wjp?^>/o }⫯Phot2yryWnq+FWv*c9Ϸ[ޓl2m/NFmd<4ov +֒q{M4B+{wp|p>#\l nsOcNǥ?O&kx',M2F0<mxK^ҵYs} ֙y M'6Y#lc7[k6c ǬM:>/խm fI"PGT|@<-uLZWě[ujq|П|m6gazc{ULnTnևW֌#Y1yN&Ecn7 3݆Zݎ [3-=BBO>}+'J3(qa}䬙|#>-:Vi5b@ީy_ZOgRO,.n gճZOkSoE}oſ)~,=|'¹u[2}ZQ"}Zo*Njc3?-$=0J 5E~e!º9?,8KL>~>N$s(d~j_ЩVz[5_Wv4Ga+iGg0$z-}?A?T_=@կSUWVW'ºVQE(x$#t?RQ\Ơ:x[UGS?Z>kŠg-35n#-008 ;SЩVzVc)MS?^-E3'?U iJiZ k~rO5\ρ\axWKJ?~,?)BW~k_ЫVzkuOW=oge-7?RVx>zv]O{2}Z?U_=_C S1]^q~fq^kU}WR/#$rd?|>+=0L{px+KF-"tfoWaKLKWhR:f1OM;;\9S*1W w!?t+ :Ǡz/3í;zR<1\$ȧ MjJ=*(aEPj|뚷xk>NJ[io=9b8j/ hռ_Ğ|q6Itb{"Z2.2_Bzh->wZw$^дue{œ 7+=3E={ c .I8dv.|"Ch'AϥrV?$O.~*_K-xLVfG/\Cp#j= s~&ioxmox~m[H-``PnP)qCnsigOA?bσZk~ K>8+Ǻo֋{7N]homx & C^y~#yExoÚ.ma6t\*O,ނ"3&T dR`Zw{R>xlG"9 6=9Ӣ:޽ɳE`y95k~;Qcjaiki‘# Hߚ59}.Z_ *[Nz=ᗾxe=3D2}CK.w~čԞ&+sUc=FjMN:TvΡ:E. H|Sdط S:tC?).w|7w/E.iyϫ }F %XbȑF~l [@*ۺnǞ+ET"٫F+87kK0<}T[Káutc)X"nsL^G{57QO]s.z=>(zMC|Naǽ{PZiZ/qu< PF]gaҹؤ=N+[XG~յKk+Cysi#]=j]>Za_07x!;}~֗>,O\懨X]Z&obgbd@ʬ1Y_iH?q4M̥$m-ZFyeqlGk{zǞ$:l~Rw:9`0ȯ=[g5GP"ӵ!5=no.c< D[nsuKKwy¶w1YDk<ޒBOKº]a \y_fs?y^/XWߺ^4U  2}*-'v~Sv?&Ho%1хiHS߭9 K P.;|[6:}V]K-DKg?=~WuCC?5j]C&t>0#yL[퍨 $<)]ئ8ei%MM6֑vvQn9כ7FZ+-.KHFul`ž_ejl<9 E>3iF{?"+a_{Nzy_zDž<"OO,uHVkFurU?ģoMiT;6^9:r9VYb)`3G"`}oƾ|Gᯊ0_Jk،s,S̠1p8鏄|EMC:毪P49+ػa:Q]> kT2%4;R I< # '}@⩈j=kWּi%ϩܤfG2Bdr0NZ]5mFM*-WN6ku@GiH x_c[misp[`n#,=Vgһ_^hv M=FHeN?9}';=zS6kQ۱?32U}q^g+"hE)9\ nM7.}-͍z?1:&뤀jCnA-gcGkK gEs+[vox5e±;#$׿Q_L_7$OKW`*N9|6mB CTQEz'QEq:G:?+| kO BkP#EYվer鎝X5s&*kPggd]-D&]ӣh.V6 ?w7`(Ip24X7vH~iߡ<5/?5M^$Ikqw ~c&!mzӵBWIn?չF?-vG|Cy|E׈?4;h{#@9MsV^1 ꚦI:yC41F`q^ѷHo4 `'<[߭߄"x[U-Z7 SM@E-.>`H=rG};x_tA &ؔ̐nϖbAp Zcf8߷Ͻ< $ ^բyu-}GOW%׉H75'V=l|uqjC@I<${(O[NS܍;O D(&)ɸn2JտP3_3l&Ck%CY.*2B+Կa'&dq6FF*BpRf4*m:ŶzrsvG`X6+<; 2y -C-C*g-m`C~Mq=^CHb8V$X"M׆lxn|tu,K+Qmsл0/s5u-w,nkiMJ+;t:(I`rkJvxh(6)Q>HGGQ(l, PH6UU` g= }B8PsGSv"`h,wUw -%񏀿hMkV÷QQMt֑K"}|(O?[u"gjO35 ^ Q.RcT`}+ͼko5-OOw !^dKZnu->qMkGƏ|g5.4鴻{|_YK#y*Ǩ5dz`ռx}("x/WOk(uY4cPծlmL\tڅ8^ڧO9r+΃CWu֘(sUg>&"OrW~=9Q"^G Tm"KF GOT?m<t=rk/#_ -@$Jcς'{L_Q('~Aqy OcJ~h @fPTCw?\R8{_ଃLmJA*mt@*7`:XѕYc\zcsAG ;mO<@% 1A#3T5Sটu_\,fD jq?:o m3뱝q펔Iq+EH/x9+**#&s_[6XTV9'1鎦,uh=2\: Ew8+qsu4~ѷ{S $AocR X^f$Pr?w=+cehA?Ꮎ qsEZwsy";I*?A|7p"߱P[}SznG|wKn8{?¿de_q['*GC)X,8_qLo_AdI?aRl~8V(eb>sڶ;ѭV07sea~tx_Y00A/­6 Q X,GS'B䎸c+Q-94ܳ6N[.Ĝz5×PNrIWr?cŁore]ow Lvi089bU*O+C (?'/{i+3HhZ5ަ֛E;y{zmdQ@ަ֛E)b{ѸJ('qqN~_SfK @vGqdtQmf| o|U_Y SN>^jM2Z" wXe"93jO ]3~& ɯ/fd{*s4Жz%o='$ϑx~\5kmFImR Yieǒ_?;@4VT-Ug[Lʫt_IQR;?ImS,z[85my"hd&pq {W_O4xJOi> =J e cuPZ$ Wi^a.!G&1&۴8f$ȫ4z ,OE4x{z&@=|K>ώ6vg|ڰڋT|7 AV2tAK%6'*9R1i\sOټCUal_bw9??c^M|V$^ c=Gq)Yo gi 7 pkn< +I oX-?cF$w,LB-ߥ/$>k}isx?V7ⶹԵު1Fx0 qk;_šiΙ}MIrpPݑ=Nxg[|{=p%-gRӵM]9i~Ό7 stnj><;6 H%vf`"jIga -F`Ih: 'Ep" +H5Ma{dpGj-' k/OѷM _[ƦaeWGV]q[/2c@^+|Og6y{w-P;wӿZ_ٯbqg=IiBqyǯRsjV$*T^E}8ϛ֩ZƻOM%X!Zۢ;X~<'=+>8ú>"Ue{G)9zí.mG}^]:urMF9f@،}R 1᥹Qw$"\cu?Nk4v2ڍOiZ Gv'+]RLzR6{q;{op'8 /rğ,Ai-ժM K˜'$tPOvdn5F,00v|zf7L#㟀5R4Z˨C$!PsqڥmCwt;\߭ПB9_6ǚAxnM8Vm=dKd$ $ c,~%ޥ_ؚZl|G_VkX,v#6x x/iyj&Lga8nG4/:4x0xT<:Gj6YoS㎇L;32-fopm`1Z0g#yG9\OiuNKŅխryrF(@;#$zwxK]C'5K|) Bli/]"< WjƆѴ(4XZX.TC * l=WXk&iW믵x讄`w1cҽ7"#oegS%l.yWtO ]~!t ZAi(:r[)N>P;+|)χ4fxK2\^)[QЖmo1ˇ*h#)M/> %ƵmcRd6pks.Eq䍠 O^]O{iE&q$̣5ׯW(\2\(r7G8kŸm_|CmiƝH",|Sv-WPoZjV:ͬeJ"BR'3r kC.bZ\D` ֤'ƯK[^7|> cOQEYCx gMtxU/!@ 9瞘uzG!]9h!@zu $iXľ>S^+O[׉vuKD6p+dQ_B+W/׵YJ'ө0Fm?+nL|Sa[M_֐h6͒ZhĒ\.$֗@ZIãv:-"|$r7`c$S%ŏOn-T[nHƛ8uٕNk NIn>x Oێ='Wбl~} G{|_>8x>9 EhѡTtČn# 6ԭ< 珼eo CS}$8@rIձ† *zu[U}0ѓRgV"eCu4jF:4wq(%E^1;GLhbCQkz^vFS-e/&5`pճ=x5wJZƭ{Fx!̅v%u ?ghk:=柬oE OOۥAYn_.p>b4/ګHu/PѮB J vp}ni&lW|i2M2-#%la ~kmľ՟Zb iwzeHхZw)ܜ_Z>x:.la5ݬ!ʒeH%X=}_ᧉ.Qִi4;4Le޾[NpNG^Oc'K˽{vw:@t iěK/6F)#5zO u~7 xnlg€ep[ b58??Z .-9zÖvB_2YI"*ge6ǓG"<;677LxOV*K?OiO5ls5bgh a+{ct|M"V2}o?)%q郓^dJ΢2w)` q4z\{5hiv2[ӳҴb9ɦY~!O??K>_buٻƭ$R*30*{W!⟁4g\.ȟD- a2فsz,6YݕFKU*;hGz/_v~6R ,%I,[_xǨ5nuU]}mݮՈb1 +]X Eqق?'R =3x%jKC|SVoV}-Cd.5φ?U=Ě6y/c|[=mtlW#9|WUGqOE5|q} |?3"m[bp-冝ME3"Xx׊R>[Cc?LQ{WWB@\W'Ljsv>_˯?x>IWmH"^dǢoЊ{izvxהdm!yoǚ/Nѷ] 9Ā~HǪvW⯊/<ĺ S]@c2@`9zOϋtO =mxeIa>يGQ$R)?9%>JRZ"g6G{F ǧn8AO i**|<{Oj3 Hd`{ɿ.x-yG~$t3˕>vJOq먁؃`C?Z#ǯ_&V?t)x o.o$2Kp\{}1[:!6J7| 8)`E\91)0t&]z6=bX 6G#i$(Ey`nez8䌮PcO|˞ aVZo;MumJTU #,:Ơу\ÏZiuFUN‹e1)U?A8ǽ;X<* 9'}&v|?Aa_9xsWO[F K*Ok#*jz}.+,"xn\ qMn$}q*ZM1RD1;w 3\ u XX?z^AL_׀ kR}R>aj"{h]rq2[u.ۻ??su<'N \s+ſgOxH;ᦻ Ykc7~аFY[8>ۓ*s0x0aiGQ˯Y\\˦X:;98~uk?TtEvCP1H';N }9FJpUR1_ZBr8$=y Z(h7.j7[?|Q"^SsP4I-6{|Ffr1oj6==ڔ[)lٞ9MA֬˫~9n*Em1# jQt Fsx&R;[;iW Bᐶc=hCeyR8' NFRh$lm?랜QOE9q1Vl~k_&|Y`%9f_'ڨDvX9-J?ZŦ>t,oMIl&nh0@t2y2t8aT:t^l!@p gS`I^-%9|[d_fԿ6ADfzrٵ)V@}ϸʀ,lَܟx(]j͂9<9\Ķ3reia6<$\eucbͷ,QZ+@sjkl"JF83vU`I Kj2G.Fr ׌~4Z#oǵVo(?4Gս;X7%J2 SW;zdZh'Bۿ_EgH#Rd۸lqVr YO A& mbqqJ[$+}=tSQbsho)9i٥hLFl ӻhr@ȣ:e);aIqZWAb(Fx>0CVT7iS1/5hNGqZ($(~hhq3nTqXR:?o ?\h?O @I2.z(¸? Ɓ>d]tPg1 @I2.WOu@]+}'?\h?OOEvs4'qϤ?]=¸? ΃>d]tPg/ A=g_WZOu@]+}f?\?7OME9WZOt¹s{.z(¸p?e?K AY2.j 9A??~Oп4?P|u`Ҋct/'Ý?7OOI@g΃>d]/+}fp}ihg΃>d] sd]tPUf/%7? oFW ޸f"2<KMo+5HqwijOѷ,]J.𽏍3-[NVda W7a[6>(ح~ɠZ7V,rQb[myD0FGPrIRz<֗7 Sq d@?.{v4=Rk˃v7ra(mQf5萝B;Uo. Gi ]y]K͞ д> kom'Eg7g=G˜WC}GHx:X[T4F C3s8`ִ5 G6'F0H Նw<GafN$T7u Us4/xPs5%ݕنo&L)عYcmSk{MZ"Z Q#~r(%Q[1Y}hj@EUfM*IQD/OW9ɩ髠w-ݥrrF*Z><Y]|-{uayHl uwC]麼R}QGt96cߟjo%twj}֣oqFo2"(]rXU@ue]3Y]vN7}1l}0K^g 6,Z֧}ay.emjMmk<ާxkŶ^(۠^j4D$WH$ZŚ-]ɫiKԷq$NFA`G?JHF_ƪZ\c*x(x[?~YwWoX[=,l6pH":; RX]ʲMQgYB k<~Z_Q5Y5?x~".5-_T/ik4`BI/h q&'o?#jеK *jc/v>RC uA~4Ou讣TcӌMp_5OW=xK?=?Ҫߍ,I 5 ^IBd^]? 7u=kɣ2F&2h<%OM @)IGX$*[ĎJjcZe]fhъfA<1eQ@Š(֊ZG{=XN'-WG{=XCOZhjm956l(v Rv>=bk[FLS,c+c?_+ [|=~M .=S @Pg5"j@EB&7fkFei*xE Ƨ.elbcG򜑴pMf D_<xb60 *~±O9 S_3sjJU%\nBv}[-ޛZT=io ur&GɽNFU.F3]|yI>ѯ5u՞Tܣh+G+@>WGоzxbY< m IV($xso⸃PJ}ki@7*PHO ^egOu=^wź?y^n͓]𿌼=h,Qʗ),̸'w4ʱW} cz,sɀ83d/!RztO׼]D£ qһM}e43iSږ v ' K~!^ ky+W!MIDr@IsF*VhҠEB8.Lvp{_7t{Q/Om m+ͱpXy|_ Ǟ 4o /Pk I葎n.6 5?)=Y:Ƨo5inEauPjG|qɫx/OU,W71d( c$9T֠K<=E '涔Wxs|>wx^X{m?-,Po+pAbP9y}Fjvꬫm΃oXf2\<( !n 9s]5oj"ѓz3tgh(P;79x=쵩GO{ xZG E1 7U ?hm=.-+ \hPyGE`3篥i-;oFe6u&c`Kss"!y?_lo?::YVڢ$[:h*qFZ Wǚ1@uY+DLlG*7cQ^xnjt=sOP"R]F9h@@rVhGg|w?;$iwrdJܙ%/xULC5ݼ{$n!s$.T\Js_6޽5 8ºpodP!?(\g1] ![%:yR f.7zw=?Esh:gH|,9ޕJF2F9p^ 5ONY#<~zFY\2>ݟYxf.-2M_Zߧ&A L˜nxSf:l拮MmM% D\ s&2=dտHmSGk_pLeFq`1_ccAZ><j-e4 13Pxh?Ba* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (\cx]f?-vLp+o:q:ǝ|kiRw:Ti BSϧ56Tv<<TVS/) ,'#ܠ׭;ːV+m;~)ÍԮ|9gX(b7%iC#1`W|cᦅi-SN~Ե6%SSoDʓ7^}z> =\5j5# GA>|5ImoyQFۭM5g. O|LP1.<4 XLcvI]qc+ʼK4N~"6^HTI}vKգ .C(FALV>;ڕlj|sk7M"%3F~M`0aoGN5q@X@|_ gzև`U-;JKٮc<zZ&('o_z<@ ,???Ïƀ#9<4 m ȹ׳T8owseT>'ú`scȭ۝^;A-"mܥpFG#ʮF瞄R>5^?Dd;U ^5sU>#F#P¹ G{;@CMNH85+ /+yE=,E-kFqym4lZ)Ո|5kjF=lg]Asiڴ}/^Qa]#z8R3_N21/ǒ?owi?[h?owjyXsgrَ]uG+W]ۆХ$]+}ݏG+#zj8X:ތ58c0L֓08zXCvWN~_^?[WQV]<1B3|d''`6 ڔKXFe ,DU8(FF@܃',ԃN~8{?-"7;ɪyiW1ͷ5:m6k⫺7fk/a^so{T |c~?1wjլKf6ứR{ $d$RGFr:%Ƴuc?b^tᾏZý 7X ƴI#^ST k1`YWH~h>;H>ڟ.Psk9'<1wSd9zWD~qwieu/롛S]]ɨ^4~^, U $xċAZI>-Sb֟+c=PӸyZifv %zKw7(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE#t)?@:^?-vƸtyRƇaϒ~Wc>5pQHƇb??ESòq_hñq_jO}+v_?\)aXϰ4a؏wƮQ@,"bYϿEtP+2~[mǩkz4 Cȵb?5OG͸lXAy,. c,χ֍[!-Wȉ8$2=ڋA]В> _h2GtG2ꋦY7);jA ArG8rO$G2H`Oq+t1ɷeQݥ|5i:0Kh-je!Z:cFv0r& $TҬG)m`؜ >2ǣ`JYz>mkztm-ܪPq؜(0<5 ;(XNm-dQ ;[Sc#Sҍİ r3̎@zWj>oo崵wEptP?}!A+Wik7ؘືI + @gwFq?*wV?Ƽ^s]iFi;Zo@xCfcq?Z/^/`#V>knbp09l5Hm<1) vzox5UKrdT~39-?+Z[/=ǖ@ڀ ھ߅u/ Z[l"P4NI Zu'šMj&vib8$-Xy/xY|.1%n`2n מڍ[|a[-M-a3mQܯ+HCrJ{׫ڧ [֝u(YMfX= NrszxSP+CJ?i 6m9FPQ@iķ{tH,3$b4-&8 63Dua E񆃠xVBlSZYTҤd`>mmI-om煤RABFA3@$NЃB3+lhzuݬr~Л bH‚8b9*;y;x~|du:o4m:ͼU(pϵQKNME-%jUϓj"Q 2o8{V>"ҐZZYiڝ#km׏)o(&VBЛ;GD5k Z|CxZd+s ~cO]:--x>XKe8y!tO.y=?J@|T1M?ڧ${i|:BOY5ku, p"O)'\  tw.4b{&A="`rj[8*t=,+rPj'Qo>oj.ꇱ"NV 1sz8S#^ X%UG=1˰bK?]ΘsaovQa2QL(((((((((((((((((((((((((((((((v5;-zJiH,O)2#FE/59Ox_A4Q@ z?ֿs?E_9ghZP?3E }k=ClP>C6fA4Q@ z?ֿs?E'!zƚYhf_GMC(dsM@OOBjgh/ZaL4kkiTXtXML:com.adobe.xmp 1 2 3 0 0 196 287 1 0 s%0:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:287 height:196|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:258 height:176|ά IDATxg\Y=UO:PPWWZK<b[[[ׯlnnOċA^ɉ#Kgb M|ϙ]]]JTTT{BMMY=nAo=fAsb,LKJJPTT!77{g/..FYY tXdg]o=~ |>g6Ķo.Z?U[ lf ۷|1`` BC`=[ln [_Kov,l^={=>/ %Eyzx ݨXU^MI}-lfAgEi-~qY>[g6V=Y I FԽK5ւ|wBNٷWM?X&% `"fke{e5߰7H:z:Ga0K1)yؚsp@JvR](FKX3FƦ6~w)Oay+!e`*6;|bdZ--Hۯ @^`'2 (*hY|LjEpCu|wP5s@_rEq^.uE(((@EU ZPWWIu{̧5Fr:Xzy.#X(*}l1 ^wbb">}*ˏ~˞e6A}lիW]{57o|~^ jkpg$`1v^ UgaK(a0*J'OWTT Y˸()GLT>|/SQZ߿?$eoj#mkWX?L dO?Cd$N߉•c[1H*J PWS,QK]"}8ĚP׀xw&s yhhE^.@_[=WZ#;T*U(*CK^x%Hs*jP(@Bb~/t?֕ae_Yy%h`z<jۜ(ꃿ1v\*@zؚh;T-QA>OJPTv) - 0srĎTeQ@>cѽ ϟ軽{veFf^wFFV^ ]]]_?.] t(_}*CN^v.[qP&`P[(K6{ fSW "9uia)Y%pog1#'d8FXa3|, 5BHcZ5RP24Ei {woD1l"KpSVNCG:XZO-i%6`+ Y1WAQCp l'8&8HDfQ9ʊVGJ*cLXĴl.44t0nlrH6r*X +IJ'!iK6mc ^;CO0u݀jd| '3)j#zcD[hbg#aE h_bgѽ 3 w~=Fbߵk&O3g AAAf Vpi xxЮ()DX]+ka7* u;Cdc;Y+N]S !Mr,CJQ=>4"JDMe8Shaǹ{()YP0zS8&BlzBYSޠ .ZQuVvp55w_Cf _PU\>q…8$D90&FJ3Qw Ôkd U<3YHH XGaG_ј-0 0)68A^A "/iK8o%(B/J:K1֢K?cK w=Y|ޢFPId r{{̇@NI^GPU[Q1{>T ˡgRco iyא_^u.ڽ,Z%p =qr! ;@g=Wӎ,*9' +lvQ~[˷c| 0-|v^AF&J[P{ CUns ~pl@ZFn(K&&3ۉp_䏝.^wXx S o[X?߅`}M5(£l}!j p"j'tՕkStd#՜5V=Pjj*cʔ)1!99Y$X42\Y60㊻xGFu ' ~y7aSTBm(LĖ鼮Gb8ĩ0z,6;Eb4g&%fЫ@v,m]Xah 6Ad/ Hql-U0iaf5(H QYp;I];\8;}e-ͺk]M #ń`8c)bMX**2*V{:DO Zt0Ę *g!LjjkkkĄ3Ik3z@iМytֹe0Ф iQ%/]@06A΅Z[+ Q맘RzKz}ekq) Mdlh_$yi9O`!w}H#h *bڲHbm*A LA$~_JfqEEEECҢ;|(Q,0ku殯,)PUGǖLrA\lABW]hjp\)Au%ۃEݻܓxTTWa ݈a#^BLZ7b#PQцO = ?ܘ*)H-dc~@YYxqz8bvsQ|333ԑv4`uAEYvN 9(5 V jQ ~O}6 ?fzY{oBP@+ںDi?Ff-t4'8O˱yr@qW#>6&3p?x rN`a9^+r;+n (3e6rȁ.pKKy-Edrf@y5?f4&MDG;L<NA>ز #[`DGD@o0 ˷n W8NEYrS@ˊr)[nS8#d'{`u.$e1*Gs1۝j51y2&OqL%8zxY=i/nc3FI;n"\g/Ĺ[PBׂ\[U\8-4'G7#rY칲|G9~';e!%Hjz:g!/] g'g8ŞaݮQ;AS@𹨻t1߂)(K}O}ד}7m`׆@ h<0m24:|f!HƟO迮tݨ{9րHs؂\f!gخ@_^~?قd0ugkA[YE[̀=Ǟ$|2U"p< 싾q"J9C(Ip]We d r=ݙ /R b`[ӵp/ƞ[; {s}Mܶ7oElVʞy ݻb .ܺlEɄ^S-R ϙAwD ` X;g]l! V/LUgV7}ߛ>_M|+!Äl{~00f~ s}N9o#@ ?xG='b@5 5Nmon1#K<bϒ߲ == ~w>x l3 ۻV_1 @ @,b@gϿX#b@,b@#5 @,b ˀjX-ɀF ^ 1B@,b@wC |hڌ[4s XKclX)fMIi-¶ =!kÁXp[${{,Dۨ4bwB1mvB^S=xEJ6Bzx{xg`T$wߦXÇ5yk[m!I̚s߬=-yg..to&>N8YOӺoQϷ.6)& ?K2pMi2 ?J("ru 81"eY31z5UU^CP \C@m挄tkU[Z[ʱg|HO 1~z((;1`em吥Y7BwHYH\}Y[QUAYUo#'CqUdW~>|i{z'][3Z2n7vLJ]m(uI>^팟6^@FR[/M,'|JY&^o'!?_?`L;e˯HxP?QRU KS7CB!X(cQ.Ȯzgy]OPb7ila GWr]2%Y6҂_?b}|i>g`5$dUpc@0̊*6zf. x~ЧO)ޛPHԬ OYuJAξ_m2G{C[ilH)ԃhQF?9֖$>Q\}~EuEqU5%KmųДv ,? zAINMCF#"1Efۚ4~gL/9]\|&w?mHBE"NA_U>†4Pr?Ou 40SW)OJpx U;ڪmb HmfD] }mu 8)C@)i8z,Cb[Z"w7l$%# \yoRh  ؙ Q~T?K痾0逛O>6#>l(#'Uք(" *dZCi+l]5se`'`<–PDv8w>@ҟeFdT|4W5%oo"(bp߿$eGijm$'L{7ʲ?>"fyBff ͕$ 1.&SǤ/B3-xH:jP7p+|:BSS v@@ٍAtpg\!Z퍰1րhSdHa2e9p<y8 Nǹ B:sP@ٖZz8k7db3d4UdLZA܃֗$e^i?^gDFnZ II9΍_],[tzZI;ztv/'*N1 gLGH [ZFa陜RJ\.es ;,A%! pRC/c X^q%4ТgF:=۞JrshL*&l*$2^=ae%q(o{\l]A`.lva칸HZ`%ʩ`N93FO\Ug څ'㐜 9P /?lK Pe!E(7Ŏ}G<1 >ܘd|&Pԃ<]6)_aN<`~&҆"^b<P+PP]WSTF;+~d\CԲȬ W *Ԃhj_&讍ccAy%80mnF*TwyU\K~(M)=EjuK7 hANZ86>%'U̔Wd(h~EXߚk˰cLƻ ҧTk-\ #=RPw )l e[Ѹ0M58QS5GUƐõa5]lz xhig{n޸O?*K|h`Ǩkm]⟜sWoE "|k9z|jٷ. c,1t&$RK߽o\}ĺEΐU5DXZ0 ;O^\ud&ߥè IDATJt+VIFNt^GU6WUE33ԋ.+@\cܦEw2a*jh OלsW%_?0ClTmP.UJF;m.jzp)wu! VĪP! :ZyM##=mߟJYh2lUQV u }.O`j&mޡѣ8x:ZҰ]\Stc[PWχ`VBɹa!e~k TMy* WݛhVښxIy>9٦1/.R0͇EM7hAs9[M5l>G= //vGR#/a:Wn5VnZ 򦣂4EM] nމI0#9C Oوr"gDS"8 WCR*xLX8Z[*/j*Kڭq D<}&m^c01voŒI4^̨80%~N[u=ЯOX~5q{1@Rێwi@V D1Ұo7ln ל =/\f xǴx͈Ö`Inmnjӱp;$=nmصi.çZJpRHHa8D7R3 k C' XGmMnE7PڪT@[ڃH/ jvp)>DTlNUM| 8xKߋoPG &\uq16`9ok cqa4^Jt_|4(F)ѯ@X\19:o?ѥ#c&6/zzܧXn.GQ&wd3ӆHW'qlq =DOuxڌPƚD46agɳ1|m90e&Ç[;l5A_3@Њ3 , 3,_ Yai57T7rmd*z-S!+GiYY i緙jPW;x2@%;5l:| :CQa騭Be3MH~}zp[,pjLv0XA ΋VPI%8"gzGQ(nYC?/̛7+VP5t<}vΖ(o}Ǎmcm*FHHyٞյ<@Zg yf x+4~}h Y1vUػd"FUKGߨ#u/퇱"|7A {8\,Jt*z^ .-Lޞl*51w[ H[H+\ Y:xTZ0\vԌ^3x 􄜎Euqe)*ȑF8 HNLņBo||woOʂ8jHCAg6Xp0 t:HJ`;ۃԽx`xsHyf s3ByBFNӽpz"#q:y.č䏮Zpdo9fB?8| !p)AkH\I! '1TO &a3x47'd%vA AMP@܄Ԕ&g(icZ\sI9x^Zn'CVI V#E 9UKBT"xU8a dx2b@ڛ;scT`[MWQKʋWXOXISᆱHۏCUm/ Bv֖:<rʘE;%^Kp'50Q#=^!Y&??HjEZȅF HV| :OO%o2Cyn޺ݛ|"-GO64|T^UaV/8w*Rbm-YvԿCR)hbiQNzarMM Y%2| /e2qƲ:~h7 h|.Œns5 (D*PU53fAYm@cPf־RnGxLs?4VEEkjreMtM#F= Q7JޚWHޥhz4̤H,r e%r-E:r8ÛZd>WL\ j ,䧦NH[6Փױ~t eT|\H6ًuױk_'6$'4lS&oMPw@?aq_M@ЎG V_"b Aj%#~4b 2 f(lM<_7b@5 N#`,"ή"wPSLBWB*nL1סUAz<Dž^Z2u5H֎>,dal,H%L~xzN̳^LW‘Sq޽qq+͂_6dsV#h%GX|iyeNpL7Yr|PַxRԖ:G" ?=0Ræw>PF%5DjD-?+)f0w9x8;(,8VsɷlW\; !X7CQCk%mQ8Gzkbc[Գ<;ȳѳ^QS,aK,F)ߐ(.eԍ #1S9QvMpFbko8ws45󂪢,`Xt}b)@b$hšj9ؘCACg~XaeG 09yMm=jν6itٰ0\_ɍ|-yPH^ p6k1S?ofba#Vga ZV8yH y9?~#OoRKu?b0p'nca8p}?`:s+ȭy#F*Q3vmk܈}IĆDG>;cU@r{*Hs%] ] 4ꐠL3HFzIJ0ĩDehNƔg3g5k++KZN &* ʺq4WGoIȒariS}%nl>#CE)n8TqŻNl<؇ ŒC{FQXoLrC!7䦺rٻ 2Ra8zB X`>_XZW"R"k'֡1\c]zq$rKgq%v|Tɥգmd=WQE1 ckg--ٲ Ct@L]s)s >{I hkQ{)꘣b{*}^_YuH>^DgDQVNKpT(N?Kp~ 맙qUxv'cal5BG!0f~qѐ"(]h%Qlt:ʫqh)ŋv A?2 >&"JŴc@S XcD`q^n )c7|?k!f& 38rӈUUwn-xMt_c,qi g ^X B)H{Y#k .l򅑦ƹ/E9E#@K0i1Ɩش("3g(E8Bnu91e8@Bf2sDӰ#rۉ8|"ocQЯo uПHb>bb/)&q N\AIq{&6_ʴTq&|梸V3XEa2c;1n!up%9>7L&#2޼AA~^;QCuF8!HJxFY:Z-:bt_s ZF8IZ{n/ 3ƺXgPWDSe_ ? e0LƢBX `ד\HoQNyY׍퇕v1 Ĝa?1uZJzN9SX"\Gh iwȸwC810*!$֟Hm̬"*DE6}^3O2)Qžg>C0X BCԥ)~^f3mC9Wi<~ZxWk۠>[ܦ{xF#a׭uiYxt,F!Pޅ=!'\*o+}%ӭ1~E0r*DkKmDԱޗhdpEJ{u32LU DgF#b)!1i/ 3 1#Zr֟ 0jkb7Eo9 rb=<nt #-eL˜$͗@ {CH&YR:ET ԍxC԰`1\ĝZ Y%r(Lzw0uBiT燎ܚN Hô!aR3f Lt8p>^1InñGO:vK >A[C>3D۰Wʕ+ zqQuz AS)1\܀m{vt hOsG6L#xꦶxP CY 2 <kׯ*:V][(xE0or }> A._ CF!9¡if沷XHmaFRmMsEP:w` מJ& !YŨ' wΦs D >ʓFsA=-B@qh  ~`ln ڜυh ?EԿک4חv=TyFsMG6@@jos,`d3cj3MV7<(!$g`j{ ΍4xzq7 U* dL'RP޵dXE S"(3vy7A`LЧ ~}_BSKAorVh$(x%? =P4;CQ3/BOC^" `a-ĊWkA@Ѡ*20o.兠WOEG/` !X#ϯڐ1 ?_d7bIkqHK)RTSuH#NGv&HGCYt qdȎg<ȱ@@ ;}ՑX)4~Y IDAT8lxףO(K@Њڲ xh?"5AcX[h G&.o=QyçΤ =MCGl7B(5Xb]QD%Մhx!r jHނC`FBs;8BluLcc"UKݐR[@b!{E݊#zAI\A1dUO3BFYџ\ qݑzVX,8Ӌ,pb 'Ga<\aj,\e_т/_D;h Ҁm]ÖOyjtds? ٘ۈBNju:Q3" qSDҫ㪋3@\}[0J lya'? y,;9 p`hD92 N0p\ $d, YB9FE!?EBc Xx/ cN^'E–y81D>N@j!!/-ml|;ҭ]O 'Q?ֹc!? @)n~ @ ] GĿ@  m]ϻ͝X#b@,"N1OpD]> gOP8GY7WbPvSS±m$zYfR4EMbe,1YH'*J.c4XNV^=6[/ExL9TNz#,aOLe),%qnxE3'MeG(L0\]c@{1Ձ+qBvBa7O`P]JD)MD2PT5(~z"L6-"1(q]&Fms,&t< Y ,?} JϢDFs.j2̂@(۴gXA>F'%5COă4nԞ_` X =%Ta ؔ/|t*?KS- HZ(;0"p?p  |A E0k a|?VvSq2x"<iڈQ(M.8 :' LSG@¢d="cU*} uQqpS p] PXx'kP m\A v{/bzf  Hz '_#5*Yo7&s #ɤ -r\; rZDx}1q2c T,q[x%uAḺP({7lڄ D^k&g"X@pi2 #ub(za,lC誉 E_a8cun\ CniҺC~6QRO=#L遥aÈ|-94Et2}B;7@v@v G˓ vK3g6?AD&,"Savl&wQ@@P 2$|C;L;PhՐĞk] 7(4['ae/mͼh#ʥUҩRw/lٺA;p#JT >( J%?MLҘWnU7bTNVDiwQ{ ʎ !,(F(8 :N@!3 oYI'}'N}N2[_CwV nΩ󥻿ꫪ[[Ul0mLa\JՋgq=ZL$7 `Ò݆t6 @v@_}wbk9`  _HgS<L75*ܸx6b=H+A1Sȯ!cH |u1O JW, rə"Ym;b~|mrGg) 69+47 ᩁY^k65x &u p#>M:j^FJq {S0`|F\~ }<8M1}BE7 &M彗`%iu4X:6W};LAb0h(濲F$_9 YbCy3Eđ|m,۽MZ\=zs34rz@p{'20MX Xz 0#ϚwjY@[C5 @ϑf  0#`sekf,X]pcFڀ3j=Gq_/6`F2H۵]i;f  0#`sekf,X]pcFڀ3j=Gq_/6`F2H۵]i;f  0#`sekf,-3JUJO?>|o ߋN %EQmmY2,#Qdpps4~y9pé!(!fgUA2vhʕ zqyoOKxET\VZ4i&@7F@ӪwG_~t͙A7֤mפ=Ab|e&CCQaY+2 v+0M 27D~{/ '+i:QVS)-AFZ*{'_}$r+n,C๟g3 M b_yT[[K+ az B|ÉۀeeEbI~$xJGvF*'nNĸ(9^m7oOw%9]Aan r2Ɖۀed 9!..?DGFHBlxj`\9Aޔ8q t \~ 59N.IAa\ gF]څ(Rksi AaA_0U_X$AKN#;3Y ^Ehp \hpqa>izn]H:h*n$SpY]$ b;կSjˍ4 2dTVq;57\r!E P*JE 8|~D}d$K+9ȓ i)SB\'KCbB\l @7 I  ~^n}F8~Gſ9rL|2|v0t@@`$bbbBCC`4 0}ڄwthCÖdӹ:02@@S;? 𽬁X 0#`me>#P+:ۀewȀNA=#ˀ:#ۀeȀp=Ux~66GE~@f  0#`-}]3XVi?m}ےk. x{܀=r"OZ^e%[lMo:%;:2eM%e ` hu@t$_nR=~ޱ#@qn?gsuS` ,m;35 n,@0?Q Esq}/JE!69m)/[ CQ:a!Hs;+# Զff ` 0vpЮ$ţ|gީ۞IQ!M(-)B.UR۴gٝToXu+bG?b x 'CXpr(HNM@G%'-5QL/uT/;B$%՛L  +@5 H"0Ni -;NtشT8:IqũXt%pa۷{š# JWY ?H+^ɣ@F' me%)RpiGƙpuáÈ/(o[Ha k50w2ɨUEU$ WOc3 /y;v4lf.P=Aܛ1mFU! 6nCP Rad]7_Ec1vL:,oegp8*޽s?qrJyjǤԿXF3.M45X@qLi/7䈌At-Wpv g,pO [y {6|/G&nCj1He !ظz oNo`cbpUڵ7|;Z rSA*4x]dծ[ lZ6,cP2* kh E܊qawQJ(ؼ 6~Zy|O~Bn1 TW>܎QCK(zgP%O#/7akk.{{;.?=.:|_\#aŲ}^ZgP { ̛;sVᴫ Z/!Yۜ9sz&IT]<=d$J1[L tF@@ Z6#~ֶK@$B ]/m0x5twQng݂I&g5m&Z z A@մOc&3S% P廢WBMڼn' ^7cv6/F0;y@9(o>(UW`3 IHh6sMT% Sq~ _ gPzVk-xsxyxl;~eU[SfŘɳ+SOqGi@S֔ga+E~]2;8HSW`%ۍ@#o8g hвw(iTI͒ ޵EUAC%E2LdPjhЙ=: M:E ֯Z>-$nZdbW |ڻw{* S,#D#!.ΫcSH/* ,@@- <$oJ; +4??&ZrVdL =o(} t98@@A/[cq;h|N\ FPL#4.ݴƅ8h0a_dy\6;PPv0Li'=/Va->^}#[]%vPA@a,xUxcȡGe%ٳ4v =7r$>n1fw0A8hUbڹ<\!,q% J1^G1rӰ]J0l,`r(N{0p8z "_Z}*8 =;+v8 O#-N.=oHMA~~*Qi=o^%)[1is8 SW@A"t 9Ӗ;s0)պd8m1R ̄%4$k0(ȋ4#lɉf71K0&\|I3_'NM& NۇWm1lܟp9 J)`'MߎL%iu-K1h2D|=bЕMoͻk*dž?Zm`ԌEiOͅSgN; FWS!/+Cpg^`w:b*nJ > qȃ¡T1}Q}I[=pOOZ˾u78ח%6Ac㔩>2Rر8~FOXj),,,0f2ll&aјj$M/(73ӆ'.S 1ͥ)(+|u Zc5=>6VciɓIOk1TV9<.Y֯_o3KKx'8ASIO{|/㥙Xe7Rr ±}XZ˘f>?S<2SwfXOŸf ^Yc82u9}"Sf]4rF"ӋDE)GFJ,<=G'Gp!*>4q}tU!"^A+,2 {UHqa_0<[ }TNC BW1Х%E;%QpӲ=}=N4,>>Swԭv2t?C}Mމ~7ODRj,Q7ܹiNgtU%-H>$4^4%QvXYmt qNNC4 P=!]W8m\nTeY,7;CpxRY˧[-Aޱ#iXo$1~M՛AhN@gHe9AιI|Rjx,ג_m/^QƼZ*~kKZ cG5>(|M}Ȍ3?%СAIENDB`fotocx/images/pano-align2.jpg0000664000175000017500000011066015247006660015112 0ustar micomicoJFIF 5http://ns.adobe.com/xap/1.0/ 266 533 C   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((( " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?SX(/LdppwۮEij:lWG[=mv#Qpn G Mw]FrOa.ͽ啿ٮeKj˟ԁ@5VbkgC(l>8qC)mg}f_Q\ Pd㞙M]U,rw}' 1ݐ=Ԯ~rɿw䍼=#OXȮLw{#LT iNy3Gr6<4ErOgzV>-}aɴKnOUP})Zڬ شAN+2=A({/E#dL~AQ*ޱ>$Lx#$ S7?rٳ?c=jmFG ̚8.9'!&tV3w,1m GwVj$2qN3qMsy{(>s/̉7$XRs ܁ރvWS'|-7Km-Em=W[q56/-z>N94&Vbqݔi3lSvõM盩\X][=?gźd%CnOUPGjiͧ"4ErL?S79qSjc)Ǚ4qm7w09'ɨ/5{{KHXډ?qny=hKKkDi+{#LqS{>6$r, -]\ 9cǛ9wMg1I?uǽ,PVi$Br88}h >;6;\3-x F'iv'ƻo A#LY(2げg8/O,Qrs;p z %bH m=s#m[`u!i$1G}lr8| s4iMs-&eH.< iNyXݲj&1r99j{h] XEV_6^qPE_ntٴ%ӄBI0pl]$s6}O<{xK팰=Q& ~FoltQi^-u .y1Ub<jT%:)8Sf$|{ǘ|`+ۯ4!o43qU}C7r?*u"#Xij/$8NGzI b%A~  }&BzWk>y"yx;=j{.cCNDxc/-FCdM[I49]a2R7|i^yx5ri 9U)>1x,XM{qMK&"2-z 8plryh#e6~Fޞ^:m펝çyv,u-O?h5{:#jıxp{u❨an% F'iv8_?KGRFP_"K qT.k#<<$ǖ&68)y҈mv!$G>̶9x־v K~*QB#2a^}4%D.#-H&#qv0;S4:k)d!jJ`ȓ {|RG{Ո>,x5!ROV{f ~Fޞ^:m§ծ4tF x# Qju5|ϦYc3)+뺔]驨Oм{c;Csnf]r Do 1e`68)=+4cys>1۴Ee`?( 6sB?47cgٖ#!3>t^jq؈Sd(n8Ҽj+nGyw<9&<5},G: {rG8<:d qe4`[,Ҥ#=gy[rϩ!u8&i24ǖMlp2S## &;{Oܿ$۴a;}(>FW m!,2O9ϩ7l$Q?vwCg6;dz@j\5ڙ|Л 2qR8-<%vRA.LPgwy~y[|c=hoڬoyvݷ9=p Rlv e6sz +e1ƑW`>k6hvy=w{V~43+y]iLn|럛 :6OH&11z \MynۤSrmS#ޛcqw.]X+pl9=Vv %U؜`{w9^5.s=@3Ӱr^j Kj^@y?x@&?3r7t5r 9"hiXѮV2?=p2qjR9S܄Zv7c_v7)y#?@RA>l=fNYqocs*meS=1?|םV"{PyCEwuJ ]6529?s'[>RMGxx@(:)m [Pe"T&jwdak7jI-^[sՙ&瓟?zRh4isL94SLVRRhݕ&PQ@^1 Nw/$<+ԉ! DZ\WEBaZѮ/Z;{KpW]rNT`<۟ ]Jh6u+ݤ1 Xh%%py8C[Z]v,YdDUd+p7 u|Êc_X0{+zyr}Lzm0O>?|3=)faBaK͸vN;|K=)ۄ ZSu i-e# o9⥫s^k[kCpMgBy)=kԽ%ǘz/Z}Wn?snݷN?v?wٷclw2 俒(:cVYܻO<={QD}?bgߖݜq1;ڊPul4nށdᑞ9]ArrAw,7 O+!:j6mE͹h 3EաM_fvo.7ڒRq@g zh~. Ū#*+o_ h1": NqdU~ۅl3QbdsKUnSMF&%JAXxDp?AE7ၦZG j)-T4QCTBmDE&*R( %DrMɻn}0GpHnQ;neͭͺG6&2~$~\whn[S;X>c[wQL}~R\w_85<<>,RQŵ,ZlѪB nmǞAQ}}0%о|iҊ5,'j.l#'p`.zыȤv&Qm\an0xɣX(/LdppwۮEij:lWG[=mv#ϊ0[װК]ŏ-M\L;q0&Fj?4ؓ  U#rfjkʚcH~`FK>&iY`B?tbmfG"Jsך丵YvuyFAs􈆦6$~ \bYmbZVg^sR/gx㈱=z^Kn4V`{N=_%+NOpF6vSj@gүOX瞀 kP3L"g^IXǰ?έek %Q*ѦMT^>_t 4H5!Yy<%9\ň!5mMXDֻaQG0qEp{iHhH,&Ӛ&}6.(v0X6e+~ù{HVFzFzLZm|VP`Iȭ\е9885>E2/զ >FĎĎO_]<v$7WQFI<2ξ$Qb@-{"]= zjGBa-l`xmF+HbB%=z8 w2Y4 ^P1^kUkCmuRqNzG[2jZRx0I_U(|ǬFYNTG5%V| R1N;g@J)2CN "ȪG[=XeG4*Biq)?N4ǨxV%mk?QMf4f J)RAN x6;Pzʔ*@ERS;0#Sth^kqYg=1?Vhe&gn7[QR4b =a>uEHQaܤJ!=]D5.PJxͭHp3X ٧p0D'Ҝ!5!GXO!=En>8}ڝc ړ'Ҏ`9ƴՇ@kO'hXA}m+wUJE"&hЖ85 702A+FTZd.=k}։7ssO.7s_.澠0|7syq͓ 8P$u7f?Ц[s> &;{Oܿ$۴a;}()$lОJmcrj&u;xc/hIq+v;yސ'WZ6Fy; y=h/-3ζXՖ=F%.)}P<ϻΏcŷ8E~gO{}ݿnӷf8l!b[;MyA`Y9dgEP\圐]0Dg 炤ly6x?сǚ$RdPGi/u;N~By޹{{n5OUIJ5.*3C5e+fPe)T ו(NZ<~TaoD,бgm W=(aJ4)iκS^bkt5XՉNTYNIi FI?4i\!=*>}:CNWXOaVxV ϭ A⁋J)ҹyeI1vGN)¼Q(WV3Jk:s]ye ;|FBw"t Z.XT(*cLӣ2H@+QmOxJ\NkHVWQtQm==lϥvIOjOR:K`?ݧ ?jt/:D^3Ozŷd}&A>m#X\,iWF9ơXa ~r,JwǥkD3"iW9TZV blb@#U{ (^`y \ 5ͺ[0H83\]k  է2rZh2^w+3;vo;lU]HIN8i_Ux"h]YF`I\>` sMIKa8Nuؾy>v^1z/?cy]q19z/k66O(?Xlr9qމmNhZ$n[`JmF;khIMn3~[vql|j({%Sm5USm͸*1o6gO\ۘlKl``4]Z+gf}.+r +ab$HCɳ3+`wE:|-F/"t[qF s&>{"Ij|WT~OB\|R@"F9w}y Agb:w8 ڱ/sw}R-ZI,馉2JF=sY:M#YIs f+sE3B:gV:\\&,>B5h#^32+zOFa3FPtS =\*SG]l3uזҸb27uWRۗkخF[ЄB&9+=WY./^ۙSpgw?4J1SS{sKQJ)ZC֊)GXQbbV(ޤ_QT(\؄\牢!%Wsޝ5.]Nq7u,z wֶLdT4:NXo R$R[:~FyX t5+*Y#M`' Xa7&k]6ԇHI[ RKNk6xDQO=X/%߈x @1Tc5)7ZsL5NJxuIy`8bO?JhdK`=853[eh*̇^駒(b11֬D[XwLqbj‚8}!H߉Th֜vfpjy;פh<,4{FB?y=(-|(ڷ# Ҙ#askܝqu2x9,@ΥOOi?y{t1K+S\$z8]`YєV_lx4h~sm̷}g>_h& AaqFV1]020H s{WNg63GWyi$E?g v6qkO3SEy1y &"}NY{'֡ Nk+L|#q_{\`Ք)V0 M\8Lq5r>e__G4GX EVѥCV>̮K}( :EluUQG xfp##r(OQbX:snŶ>S79dTڍأspd8qn+>3{ uvm,s/]̍7$[T\8> ]5\WF=y3;ʽ]4?1Daq^meﳺŠ03OH ͌T3[B͜,CҩEDPsس_mjop8Zp# q Bzi]Rv1Z4f.c%PbB2sz 3@$j g>oʦ .((4PVzb z1@:qҤF+J!g XÊ^>xAN^}ogwnq,NaQPKtkSkBXb`c=(LfRTwsz\i"%C.J]4ItZelꦨLdtSޡŧa:jgxaGDxlv]kw=2YVQ|֍ٳۊ#ZRԍަ+ޘ㊤b'ҹt?pp?8kC rp1!9Y$qJhȞ)k*jn8V=ih4 ̰֖@g'y?YT7x㦽*/ H?H3rz\Bngq=9vti1?aR3PփBTj9o:? }O.GX3sZq_I@z76^Us!ǯ5YH5C'\hʤ;iVT"W:ů_fRk oZ4G< yVil$z⾼m<-n>H{|8I5.1ig$R{nth^=KpvE YA0I╭ɏ-߆qS^]{Hs7&B_)m{/ˌ(>rtnzǘnцnwϼѢ":HEf>̶Cg}h3f+-E#I}t~oV-xZ.~?}^nv1wm{gxGȟ_ L`^@.|_gb_ p=2^u_ߺ3Bƥ+Ҟ4LfXF%O#n=qIN>'x8'$(02=IԲNrܭf5.]~CECݎxOt.t'd$;c_kkez1Vc7+,P#,@TH?dUXKպE FP>8b8_jh[\x}i8ݘq.vݺ=W9;SO_(?ڥH.x€xVN#H\F85n@zgO bI֢p7P!J}qȯ`-[<@_nOs;Ѽ5$qGjå;cFIB֪ r}+(โF}+=5C"Ő >ЙN61'־- 761泿l%+;g;8莥YT3@`r[Au$ˏ\j9֦xcwGdR鐧w>GRƇޙQRϭ"?IV|Ayion8ۍEMCs:Ķwed7v@spQ.{9 `H'q5? }4sf[c}Tw^Y\}/;7Iw)\8 3=@4_w,74:b;>,יv}+ϭ񳶗„ەJ5#\Ҧ Y+:PdrN7쟲jSVY+4fas7#Z"fP]7 -5WE)!g+QOsɔ؁4v]wwRk7"o L`d~uSjO""2iqʅ tѓ0ZXh* vL̺+e`rO#~f4moE9B뚱s<ܡrHEs;7g_1Tms#VOOdyuđeFQa\4v%| :ӌcraxF#Bs[<;!;IuHu,@Z#g7tihlq"mޏjV.w!/ֶVrq\Tk>k F. /_#Wgcg#p#VXYss֬j:X|mld=+qШ5}O0nNsϹ%QLpx~ic1^]kGko尺1&-%*L1ރީD[-}fsq<Y598:6WYF҈"(HrW1lY` (wr?N+{)0V#lpF}k+#tbŚ5`on!cB\.}5Y!w8Iy/ƺ_;z#(NNzJ^%Mgqyc'4̽< OxK+(VPo$Aok}kSmH 0+ü=2Ev9rGO K8V#P Xcڋp}`kSonek3I{zѣ|H`le]':TEҍZ`U=*ca B9._GXw㎜u,ʌ! Fx[&:#ֻZ@R9w]M*N*ojȝ$ *ԎUW1_kuoL/?[nϛs1W@V9渋Y#OBčvX}VEnF}kx 'd9)B.'KxubMZ\\xJK+i0Xğ(pYp}@#=Fs_)x_Wwt|7-c|  )Sr]kEi>72ff#|k ?wG?.;47-KDK,1]ۃ}^Z}{I>svD)];͜zhrLnBɈvӖ^m .-IbfU``[sn< vE[.{HݍܞPAaS79dP|vVYךo^n|J*3N?9eʱY{F԰m nqK ţdhY˜Tsi1ai,>ږ}Mgy%կD11&x=""21 Qzl06xs tq&l%2xb$G2m1I&d$8+Xk hdÑۧɭ_[KosvFA>5,'|y^aJ܈Do&?ac@BɒaAUvɶԒ~^@bV18dINZ-De4*^ҷH!1qQ^աƎ1Q^ՠTmbj?VJG]裏⬄J,*>m?G/X^ga].Eq$QqOJ|"lbX +}v6VMy@ּld쥼\ISA3{ev@>U^|g+zV\I̋ 9u"l"%=ꮌWr`Jg+6xiVrc׷4Q6z4_F$svz7PO5@Tn!M=Ҏw9^לгN\4Jn G[Q4Ksg^TO^/1qwx  .NOy-BW#vI=~ʘd t;.r=3]5*rQ;]kŶ*Y^'YY1{kѼAK7Obdo3U8>I5i3ZY\z1\cz U֧}ZjJ+x7Zěw{|!r1>S۞+km4{jqp \7ӎ%EV4F!}yGĭb A2@Q"GX_>KFw#c9#:,X_\DBKqӴyt>ٮCפLm>;AӸmy;^Z219)fHI!;qQfw7zd"~UkIVҙIq}zWxzWPTsBՇ٦ NCq؎حci5?Re\(|E.+{-7Ib}GPӼ볉ck5nmv&KlF@ ?ްմ.i]m}g XLOxQС61>XP~HM!GckLB׮͵RPFQg2M87wE=h6Vf.F-[.`R0,MgiyG_4&,?=vu8{ O: ]y|pyl 91;N^jsQL#kOq\U34:b~aQSLq66ľ5Бg_i.q覝3H)-]d֦c vԓ)g Arw<,[ ynٮ3iu_^TUk#& R2TU$&SdQ2U_j''VBo?B$ ltCF\IopX8j1XlH]dAa?_^jNbg̶W+p!Gw0g 1^ٝpB}p4YU ~סR.mx;St2IP;}+jmКVWxBzW+㷸RӔeneJ$їMe *9=k*KRXzh8VURDF|lqZݗ&oǶ8](aI9V-oekVJӗ"C#{)D#cݐ@tb5G] [# 813jWȣg$r=+6S(y=WxRyG$-ǔ^$\)lYǖэ#7 *Q A4JIDI'y}e"g!HYHűǭeӔ{56u;VUf'76yǟjx[1sb]ޢjC5|" ;W~m] DWI4L}NkSڋ^ShH="cqϢ59$H恷qVnu=>͕)ܿRn- :KKW@ gӃZ ayjMIl3RuT%sH}IC,@C9u8f<{#E1xUM4~RK3 ~ b ?Li)6aHS8qb3W7V322_K@7rcRfKc1N^]{Hs7&B_)m{/ˌ(>rtnzǘnцnwkf[[CpMgBy)=kԽ%ǘzԂ}L%di'<#֊..oH1[s\Vd?wڼ;vcۜzMB%+$ѻzFzQuYߓNx|x*@<Pxkzqb?^ezg۩?Ҽ#ҹ1ӇIe'8ߓG!!xH hW+gJ6tئ1I%Q=EF[9Tߥ%k75w˨̒,p+V[Ŷ0I'?V׊oᄒCÒ3J'PUc#k8**(MmzDpCur̤=?1WhhCgh$kISd;A޼mXIz*SnH[;b̤[ۆ,K1 veQjIJJ[q3jԉos"5:j0J!qj *#;2@7ukjc# ӯ\\bD9<:EgrSk7clrG{2{ƝI?'(:9+ּ? `H\@^m|sԜJDVI. cy0=?:MCcssz&06jSI82sj[qKULBQ:ղ”?dҷCUMJez⮬t-ՕR%9b[{y<j3,L[i%rI{c5~&ZŜM%AXNfi: !\}{*ЕI^OAWz{Y' _;|sW/\ מ'Nz nPw3D&I^)4:T/AqQ\ X6ѐ>Qq+<3Ko@Jf~4z͗.KM] IlvU`8^B=V7wL {SeLqw4t&7??8Z"73z-e]6I\ب:JRю.āj.6|=\Gu4GV-&9H+<Ѿ綢?w3⾓Մ6dĊHҾn. w9%uO 5F0[@frN2yϷZhe7woc8l#`[=5xMߪ\:1=rVF6|g+Yoy'Y|Ý8,4x\77j0ޣpJc>4( V{tӴ0B޼_?:}(IǶyM;\W>8S)|m(UXaXW7TF>8#'pSdj~\9\OVxWe,jH9sfY`w s3L>0Z%M@IK4|3Cpq lrNU3FΠrJ]Ȉ6\d0={Ki7zJ;+JPԩa*y] |C:L 9_¹HL(t}7m|wwc ڣ!3h_y3.mr&˃٭LoZ}Wn?snݷN?v?wٷclwfkkn;dɵ̟#襢F%ĮmjA7gؼ7gmwk習X?&٣UX<;Xۏ<@j6mE͹h 3EաM_fvo.7ڒRq@g zjb F"K<321~4_ç˨޴b)I`W?1[2hh+x^A,~U<ֽ;D*$"Wbi$\1 zO~%l‘rd|+>$[IxϸNzb:~Փ.^T[3U5Jч"n٫rӑ#<>u-fi'$3ү=W뫨cYD^IjJїAmz֬WOʲ 1rqV(6Ւ@/Gmoݖ'C OnGWxؤyn}=Ez<_lϞ^|ZR3qZu%B>׸$ǭhi(g-OƬi,Ȭ8jtvP&8'qTЪn#עdH\6g+(}hJuR,Rdr1=sKұq[$"ck Q 43nci<꣪WΝ(5䨳m< 2]a(4mvQ³pGҟ+ZBO0WxP/́Ek¾\0Ïʠ$4M- BfkFFy>+ 1'k]k aв.&+HMTJ"!OJp 0h.5 > 5-B[b 4 A`zW_K:-Qv~6'1TB\`WjJR:y8>ҲK)H uG 3}`St(7L9<{ +<`tSA;J5+˹++ Q_Sf^sJ׵hyge32_ &Gѷt0,H7pՉu+H[ pvGj/}x&.ه%vK\}GX(-q`>P+J7ߎҰ|Y"[V5#Q֔jFRrz<-kx:}&p]3<8{z+4۴(*N)mO>\D}EP8s~=v:o=$nO0sHK6}y] ZI,V1F gh~\`WBҠEͶ7-c|$W?^?{aZ$X9{ Κ3I~7%Jq~lD֞fowctLD#oOCAa5Μ!4Wɴv0FF㴿=)1i$R2ap88k#A' ] ƑHKq;==(זz4]/{$Èq]yQfY[k~di"ڥA Pmwؠ`,w3ŬQߚ/MJ^n*Y68$+J[Ht&zc5ZqΥ=6yPp8 G6 N~֦;X0 V $s* Uqv=iPOAKaUNr*5emF9ǿ=+xJ*-a<9T**ڻs#<=VX]R< ~ӨJ.l0@L߭{׃o]Ff03HÚ3y+rxz NsbjNZ/E5oL I[|c9> մ 2+J =3R{InbC*u'Z~'~b_9C/Vlqg^ HfRr3Wǂu(kj8-gĘTTcUƶ®W8ĿWF\IEXv[?3qZIFBc$I%I~1'JbQ$oi:Ti?-$B#ӮUMKHFI9&>{3kV 1Tv &qU)sHrK:i#~UF{T*]T5+$Y#Acj8ȹeke"E! @Nu|P9T]&6qLۄA=e!s(@QF{= ;i&`e/'9PHQؒ*1yo _w>^1,uC}6ugYllb &hR՜ orK?|[ŷ5keW95_z&B䑟Lg#Ms#a6deQ)*זxv6W7 / ^A )ZNyi9_rO5O э7sstٸINsCJ*8A,NXQ5WnDB @T,֒H$9I TRBA$LG=ݺSJ`2FF6J~j CķW4:naz8$=ƬB判90..wkд nsT}Ikojvйrq#H.&NcaOBé ?잵>Ul%H{г2u}zTq|߁ VBY˺AO+"5:,3kФM°/\{Ʈ=b0̤].qzzz֎+te_ H#m~#8 ]Zw1qW~ˏ:lHb'<ۃ^b~h /Rsl-;6Fozm/m8#S|3 'MjRWiCs--M"]~Sz.g]j OnLym68FFx늚G{7"Kns~\gԁD~^oi{w<ěv3v'w#>FW m!,2O9ϩ7l$Q?vwCg6;dz@j\5ڙ|Л 2qR8-<%vRA.LPgwy~y[|c=hoڬoyvݷ9kGfгט>Yo^Acn;F/\ּ;a="eDs+6wcry9Do%w]8i\`nw|}c=25]^i{&%"#kw*A Wi^w}6s:W;, \Bc}#a6go'v|[teiw~ݙ6nmysvCM%X|4j|ۣ $1ܐǪ=Aǡ5߇.-j-@xTʣ\_dK<m `gͳ9|T۶E3Ώc7m;gCjJ :~1p3COƒͦMocmC`;s_Y^t>BZϜ pN/gvkP}i:T&"'K.ݤ`+kXϭϐuգ2@!ַVOUJ`H+[}#??\jA#1 x8Gy|1\Q:)զg,HpFK *>*P85<[FtYJB! }zNCHTs) grQZvEh0 V 8Bm+.A UO^蚎/fF$$Ա7qPeVkΥ[[.qK^&7 9{|Eplj}Ե'SUI>ᛙ㷔2j7:{ -M6$G5.QF'8#9ךĢTѵl;qƯ$6PzlϷݥ^+~aU瓪\:iQ4]MцU¯EW1 WFPzo4' 6/hewn0jL#|G1lH\IZ|+s?o'ԥZ'>2pw}5ٰWZ E[D'm瞸{jX| _k¡ G!lcqY$RZdrr=m'o:5r\kaW!vch,mͣlW|N̗$nqMapx @`@kh/q I<7Gc _(ǧٻτ˨ DbFL{`gv{gXEܟ#&`aU4񝳡sWWndZ2yܝ6ld#xϟ$v~wfsKwZmZQq\%x8=Rhڦ&2zDI75 k}7Wp~DPKl۸o9i׿m>'Inm3NЅ)-6_)a{mn|>u vK˻쌻vyֺzVImxv8㺍.)n@$+noi[?gvn͸ݜ_iM;O+n7nmێϵ 9n9 rO07A-pČLky^첉dDO4> BGM8Nw/>#fnٴg~xݻwN1M?Lf<#v/qٜgs ![@|ݶWS<ϰ}O1/xJ}p٤FaBmfx;A'M_~Gmg}l㊒CI|{^~1vǾ3@)$lОJmcrj&u;xc/hIq+v;yދy֟b?۷y{Om3Dlӷ~vm 俒(:cVYܻO<={QD}?bgߖݜq1;ڊPul4nށdᑞ9]ArrAw,7 O+!:㫙m4m#sܭ A;k3O EҬS(nn@o N.f5>i w^#>lnSQ[2Dbwn;-+鷎ng/Ι,-fO>6wƿnJG H˒[݁g>e25ٸIf/ a<ڣg{NO?76-=ṽ7DEǒG( {=#737K'{|ўǹ<8{HK| zb6AԼ _SKguWIwo(> '=7 qWK`^)$ćݴ|ۺ޵|ss=K >gܩei2uun+/,N<^Xo=v'qH[Y,m僽wQcX!/N("Uwie|DKs-aa$@t ހ6u;/k""vo%1IvWhI&/ A<ڣg{'Lw۴4YFXR] RNyJ$c;|ў$@qX<7W䴄Of%FZj D~@gS0d^qұ|#uqqɧye=$w,,7K`^)$ćݴ|ۺހ:."l"A,=7 Ȣn ;4ya*@\Wa{{ =&mJ6(IVC)b:9HuU!wm?ڑNelF唇`1Ԯf轣,VXSۛwS#obMs8il'[3ŃK\=mi;[6HX˸g>gs]RY JmQ#ry;Kl+nJ1*6>PB&'sf>kX8G*JxGQހ6gaBb )Vr~CI%Ue-JJuwXk)H纑eUbc\>![ NxHO>65K^E`[snsޝc S^5ٸI% ya|ڣfG͎ՉN;֭i v;Tq'>}C<Ȱ^\aܐFp3d=^9"Mi ڬĨ8;A=j6?"eu?#<ם+WiYD׀;fy> zUV\'3vnz๚6cw(>VQ[GaBGiry\1 =,N%ZE qޟ;|)SJv*$K023m<'Suh2=Ju:–8.Sgh`XnszÞqIJ-M k0xHO'z[ǺŹSZ[F\RL t~B6akƹ3$O,/Tl܂ryڙcowwzn'/#,PM]35᫙ LF'r3g4.e{k&8-4~X=6ٓ~b#\[6[,R5,TҨa:%k)ҢMUDwڀ6HfKX;ܕۺF;8nTgho偱mͻ czĻxIJ-Ovq,:2y4w3-^)K gXť'a@p\sxFx4 Wj{['0]o$wwfFY_ο13yJP[HN$_(>V39\1ߴ'3vϽ}n-5m-)RI *@7RfFtшyɵܟ ˎrڔ%DKo,1] 0:Mᅂi#Yb)Q=Gs:IYipshHHm%ZCs,mmvm9̞P96ٓy sCrڝHdۺ 1 2 3 0 8 0 782 569 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?O)h ( ( ( ( ( ( ( ( ( (  g@0@T é y_ÛȾ1-߅COZB,&ȇ#@Ix^1Z_?i|#eŸ zHQ2#c 8 (] ds҂@_!PkM_ow"VdԬn."X$l6 sYQ6~ïY 5d^{ϳHmYF08*pqߏ@w95׌_r]f=~̱/ޑc⣻c ,Tߎ;[Z\Ed+@ sO+ὤևo=7 mpa 9ب@;= 6+g c96c^M3|U>1|(׵k{]j ԵȄ 7.I8 s_1cNGĝcfP `IױKQz\A>)gw)iC"*g=sJk.}S@;-.a=rFWՊ(*V6#׍e^bԥKb0V63k0"AFV5ǒB(Xdek|꒴VR2zWc^O ǯvjS\X?)6#n=s@mD6x7f _Șn-/\[0 GC5cƺm_塵ѡ}9c%Y. )<Fq6+KdH/QY6*H2G2Ga=_?RiYWOGa=_?QpEfGa=_?Q ?ַ4+H‹Ɲ|Gc=[Q %oLW4HoK oAV4H—+TVg$vWO;tVg$vWO\,iYWOGa=_?QpEfGa=_?Q EƝ5v+;;H?ߧ .<-Ǐ!< {$vWO\,yo:wsF_ HX-u}UIDR6 N?ST|1<Uujzs5_.I//+(kӿ#~(zcbn<=k\jM\j&5G 3nesן_ޟ3[^j*>xD*\OH?ߧ ?#~(X~͖Z2:l:m$QhwLrk豯iVœ4^R>ʐ>!>ALַ_/AwTya#EQǶ}z;‹%W G$v tVg$vWO\,iYWOGa=_?QpEfGa=_?Q EƝ G$v tVg$vWO\,i3H*o̠~Z G$vտ  _ sg]Ыve!W{d\1= r$`;;‹"2#~ӼK]i:zpTk`reRtVOi笭~(X? 5tmmMcxsnAevq+Դ#g$al)#~(Xq5 Yjv2j6^Kc7h˞ϽuWO= GM\,rOluMB;k@4f*66:03ڻkKqk;u+=F>7S28Q+dQqѺ?zǃ|3GjnmoES77>C̭A:XeEN=QN$@L(/3G k4yDEx`yZ/ğ^+tu]מu8Mg*UOzi]撹ռiZ^ݘ5-e-h{ByɯmgկÍ&|{  VC˂\>{qU|I_1?(5-NV!ZHݬՊOlQe9Xy=w^ Kڜ7^ka`ۃ {ӊNW)d/"NӞι|_Z䅇qFb;g|G^'kMT;³T)_|+_V+XL`dr+(' Q'Sk->g̫spK;6{v oxI&&}MHi$4@O,:wk>+xTӾV=r jܶ3X_L!Cf\+| ROJk^%ռ /þ 5}K'*w!'i\Z})*]ϰ<=='SwjJk y38 z^։iuMAoE$ҵȺEVx@dsּ)O訫5xU45.~F[ R,ŒH"PS1f31JJQ+Su|yx>ϊ6r|%7јbn6j_[g/c^*xf٥Ac:uۉY/.' 6UHVu!O|V񇉭Mo s R J^]s?( W^t{]Oﯼ/mbq¬ eh3q$Fhe%{S4igK7nax76 ߻mv/ 4~HkfiUr q Pfl J/RGm~6Hlڤ+sMn"hCTҼ!Y곉,ڣ&!Te\6z`~|R.sl?8*%[eA +_B_(\,g^؅&8!Kysqҙj /|j{EXTHtՄr2x 2q>2>'N_00ψ^"s6'V08ٌnK'>\|Zxtm.5+IEIBu%IE.7RQ@ ԔPu%IE.7RQ@ ԔPu%IE.3IE`7į h뒌U\GF^UX0\V4&N-פ`Xsl^5G'(`]oďj> miơʲR)Hs;b=pSW<_ΖZ֝op䈥X`28ҕً6^iwˬZ}%۫nH i?xoeбY3QCcMZ'U tCca׸jzjvfeнW&cQrǭ1E=̱Xz>œϫaW/'ĭ&VT+yeycpOm*P"Y<|[V .jme%vx&Ig 28H56/Yז9Q7dq2=ǥGeRt;l]#9;/^e褕S~<wxZ}FΔUN܏aGz}j=UMMzOnߵ"s`/|x{GҭWNk]b(xVE[|v`n5̶k:|Q!h7}1]n?z}:e1z20PbNzV>2x3zquK:lZ\cxP:g85Zj%]+7ykyF4a˵XȮoJ1i-"AC֚]gIוt~)KM ]>GdQ4`,GLQv5݇tM?m7ZIgza#\|7k٧7nkcoyɡ,VW=\"JCJA 3g9<~xjBm&CHdI$bHNfff,jέCZU%[jP1,#sm?s7"FCLK.w+']~D/.HKKg0q~5^Fa4;t# u-B~-fK@w{8Z5噎3u>h,uŬf{i@yF#k[P.[VWqpf}'S p^̤8>">kOZ F4łॳۦ-?wU_<;U/tZ_i;NLN~d$'luovkҴ}6]=ٖ9/59!\[wdWt k[ev hc$?1 gRi-Vp+4ܓުACFiqךQK9itHUltC{r=Fk~%|mZ͕ooDm+>:4Sux^:oRV;4 FJ-E{>;/xSkm8.EV0\[3:Vڵյ\+5/*(r J+$YUj_kauL"]?/C֚.В ZӖ`i ab2p7Fz%rzώ'W:=P2@T3MrjSj1Yp2R~"f-Фu9,"]Fd!rpAĚEdڭZ)f(&aʘhhKA>QE(((((((/ROD攨Lxj_~|=EZޥey:w0 -cu(Igw͑h#za= a"E#&||9h ]WSgO}i͡.7%?.H_qSY՝^7xҵ ^]C0[}-(xM>[+;ԭ|/e389BקZ߂o| c/ӗ?\^\p1g>emn]3! zs|0oH $Bʭ)*?eiH?v%M Y1|n$EЃ55Wct*ǐ|tu[ov@O7A@3#xj^-\4x|ǯK31UlaDy)9-t,,cbϿ^穥$!|P(u`k[%:gMm4gQѵ [S.\?Ë>C[u񍮳h19l}(<7$:oYm*D ";$@A˂¼?\߉4uŜqdQ$pKNȬ@$y94ӻjK<=x=kg-!k`Î>;}?A5u|Cw*ii#xc;dlm F!JLm:D(- r}轐8|%[Ӣm#KT%x~*I}YAm)ز#y9 ަ[ ]A Q59cwQiƈFO&g[»#riώX =*B6j{!gK##0S}"&ls)nqoFϯT̄|Ck Y~oQ42({//f*gwӼ7h~#3`'7KV)m+uγP0F{Wۭao$-';5+ܒi~ x?(>OTisFѡRY[acY߭{P< i qF̣'b2GiXՂ.w7zg7 aA[_* I#RK4vz!S<#ais[/u ,>>h_ +VŅ Qr^$YQ`n`ێ WxCVZo Dun.Vw bHB8$+_|go<,v1@XwMM>0qo24ӱ.<ǞZxN?cYp v>lzvmY~5kZsʨQ2ο/vn~nK9}y{aDd 1 glVcu@ ^xkQx=Tbuª|ǎk#Z4 ZljWmqc Cgq$C/ q_uqBPM{ gxMpu+[1R}I}Fi%Q@Š(Z((((((񯌴sM6HKB"YٙT(䓁^h?jo jGS.|7LsZ5Ǜ:ñH߹* i ڍIu/[i (9rʤH |KOxwZ=PuΙ`Cidͭ[ nk_ٷĶ ZƯywkkV7 #%ŚʮpCzŷïi_423x>e?xW4'5mw:e} {*\S@]7zkY6BC%J*ōQ7kԺŅGet7K(0=T:|>73xmk[]3S;6IdH9MOD>a~I6xRU@1!fXVP *\ޥC\Gm>TLj.#PeL.܌9_:OMmtF 3GN &q&,0V=r9ß |SI[xf n-tٛN7!bXYH^qW2BuAkZ'iYKP~Ozj_x?Tg_1,#dlWb|k ~O Bi#7^O21jů߇·nʷ7P"ztؕuAׂ𷯡!KC{g4i gDginĺ"!2T H2$ U|-ϭW2JCcalT_vr" d յf&?,\nPӓWKY bB(fPH s  T<-=7{sj LּSe>K[&LQpś:Fg/zWÛ6[]CVfo]" 2I 湘io !kVΟqc]čI F 9$sTfi4.b";.Yj#IP῍?h >#֜<=yy n:l }썲J>W q~5W/׊CK [^sgOj0Ͼkpa,p0 Q+Λ|}CM"Ao[N&[i8[X\J;jvz^-Ūx[ᙴ0%,GF808ٜ 4|%HkŚe<0M[O68QU,>8|6>%r\z6Wzw)+#v>Փx?'nZ`֙nC`\9j۽]OLm͎zۉ.FfUUsgvP/5;l M" D9`Ȫ?e(cie4qokRfL,D3 ?>#ZsĚyVү/O ?Bj1NQx4ych (ZN}O:}[VFijCC*I2R8cwm"1M鑜6 M|/OX|4?4mt5e5M/Cт}Wi;,=!2G*H$t@!;ey>ܚΛI$,A ck^ ҭ]Rac}yA =AHqvwM}oxY-@pꥶ68$bt~д?S5nUhZk;/6 &6#q̓onj>G(% +{VƱ\ڽ-*Q2a_X}&O^!/{Mդ0Zޡ`a_,2P8b'{7:M? j̿f d ?>Vvx t}+wmv!Rm-"*4o0G "]X-?ܘmIWS%Z$z~ơkzE}.yc%Ԋ(X"IRxfJ._ۻK]CMm#.dpɴø]YC+ دj7WP%Cil@8<ͥ[_H3ۋYi džee @8l 0|cGYYCkPl5m%]%"} SOyZE"Եo#Yd"T@)wl>&O4?HD>!ƗjɧCjrLPYN̽?ڧkxt8tJ>nΞa6wwI [Wڮ=Ջ'RRd&gF<3*) 1UG,NFH1w͆ӬxiKǵ6X;@*3WM-cRtaΗ: pFy7Oh"-txf]1V-^ 5Ob10Ät|K7u٠lk}N(5WOH&G/iv܂Q[_ߎ__1n[]N)vDHf@dJF$P+ʾ!֥wσ.mj!mNE;fu.K#^4煾xKþ#&еmONn!1F+DXN}@/=4JZJEQ@Q@Q@Q@uk[9DsM>EE>rF{PH4h~G"hr.?Cq@?ijߋ{/#oЃXvcܹ +c=y@~~G:F 돡kC3@?h Wgo?#u8~98-ou,y,.{Z:vo[>ݱ[сwl؃ ?^Y^'όK[ KL(NQ8u'̪ 9"~1&kppY^ 56,Mדl\w(?7yzb݈šCO|45 eH4h5Gqf 2I8з/m^ӏ }@tO^{Ҿu6:\m4ħݿB5ipj]^̹ImzctTVjS奉VNا_[&?k[ÿ֛\Ӯ⺀*qv1xwv}#Ck^gߴrAĐ 7{??CAQ_={kWvQ.ؗ´-c9cmȡ# ځhSO&8ӡjC+'z,g6^l%VAs=Lyp?#|Axj'ZUxB$,`u“k_9ށw4i?#hP~G:g?Mhf?454f3=:&O&y״~Gkp@ ֆh3ƿ?M/g4CO&su153@? ~G ?WFhCO&?@WFhg }WFhCO&?~3@4o?#њG??M_ 4o?#њSZ6׬B@9<-{jZVB9Z9"-y Rg s^;Ŷmk2%u$O.vFf?шS 23_#ǚ .i6vJ钎$CaU={sQK!m-EyX 2R:px4!z3x{Ug5/:KM}vEA ~TRM f]E6I&M[kqb5ay'NKa8ݝN3^IO>GioZjOcxZUhB6R3#8x^{T=tF&*ʬ'֒vi[ ŴjxA_V7ՙ%{o)k`9|øq^%͢hZլ| BĒ[ _ֱS_JxƓ3\:&thrc#*JC:W Cua=zs/.(ąC՘Ⓔtxs3w/=Ma."b=gja5+0c5y,IQ$PpGӚtt\A_!2}9!ٟx>&)Si4=KM6Nӵ) ᠎ 2c pA6 9l]VXmO*sp JbXjo58IjA=Zs*G64\mel0=Tw[xrĺ45hiM,WCC}v(㱮c7-CkYEoƤnLX* d8agdN^yA]^|<nx!u-^*J{KV{y$R.UGqڅEJjtv&7RO~ x'Ϋd_jVu'ѻ27T)?cHeL|jг)3&j_5Aqogk?e01W'W-#G-Qr^G83w'}}?B 9MiX*SHw_UK/CZgYdΩ*-[WԴ3T[yYfpA#w8Km/OX瘈S+K'{188&/! InK&1 •Py_)f>3Yxknêڏ-ˌI*28H%O tu7|7xP_ =7旞vv*q Go~<5eb)BK#ݩ"IYjκ>][\].حĉ4i,6b"u>x\l|B- eY&<˖WZ=K-wz^!NWSԷjȥvٯᾫhMׅGWK7ч$koXXhay-y*vbV+hf |%xU& j'X"{̑Djo#<]xBi{5[TZF)m$ `D λʆ'-_IzD\>OP]P[Yn\*$c,99 ;B{[=i?%O}@ E.*6CPQKʍTR>i?%O}@ E.*6CPQKʍTR>i?%O=PKkd[#REE yԤ1Ci~ Givq&$ܑ^oMi "T'oGSխ]5]LMoL.חv&{o?''( 1yƍIG{mSB->]J k*'6VPegi'{Pzxq\kZyA9?Y@YnMݓ;D$R)G"6 8=Cr+?5.-Ɗ O5 Q#9]s4H 1a?>ҿi^ ;Ьm[nz򑑞jDžhO^]*)嵒K)mṆ<)BPA8c 1a?6?jΝ[^ߙ+ia$l 㜌!Pi;OY| - FF AM䯖͞0$S`.a}\J^I¢I@+$xN#F3x*_?q`z׼uoJ׵VNmNK_ť[c5ǐ*'s /i?SP|K<$$|~ψ?h/? ~!:^siCGq;Bl% I\x7+j^v)?[EG'=*Leescω2|Q\g;#RO<*__aX2>8ӓm{: ,4j$\OG?n{GZ|Y1e$OAB }A4X.c7٥ PKj[n3q?It!# ؋go?mWYzw .CD?G$ z&(;O?]?½bKQ .CD?^1EKQ .CD?^1EKU;TWg)rD=Hr>6ڋX^MJl/G`˫uw͵ZCI9>+>&jҴUmޛhtFSnc= Pb{^.I+]f#0zcMAHOW-Z5O㋔NWȣhxiOx\u=:lV $e(Y0Hyi0ǁUq%mg.l#p'k$ ӥ|B|otTNhrj:A|. JR9"vor?c ϬK ~c  |lD{ljzz EѸ8owfbB{t|>߉|4)ubʗVWZøeKG qUby (  ߮+|?#MsS/^ |/C pK$|kv;?NOQ ~c /|l^;{6ZHФ4z]u𕗍[i&8̻vQO~WGe ~c >yA9?\kv~7_ Di;qCя^iǿ iږbdԮehtKfTޫf 3FrߘNOW?7w}ۏ%.9<%5o/b.`ʌ~C 1a?/oڳ+uuh% 4.LC|f^<鴿>u]\ܮc&cwƒ,^]Q𖧦6 #H,a[nA ZwE%| 1x3rxs7zizyykx`*0Hb" Dq7|-]V|-zu恨iHKr3n:Wۙ}t\> w5@5IZB#6%`r p3|s|uk^x`6=M|@a P8 d dcRvngz[{ž4<>oukv+ |Dp +Ҿ*|?uVYaimVPp-=D_5M}LHE)`;VrGzޯM3gƍ[A%6ȡ 1.2RO~K𗂵 G-ըxt)D\8cS¿uB6̾@xA 4p?W2sW~ac:_q#SW V:<Koo5=F+mF@'4ECE'8,Oji:lwm$۠.y7Cĸ $I?G8YExg_ |M-_O_xi{sy#yl1/v^' >xhVZϴK(iF F'۽+LcN?묟M>$m'I]< 4:SDkڇ.+ϊ:Όqr^⿊~/H/}/#7||w?I4h˾djRgD*A޹O?wM/J5CQ\熕eh7ҿM;> ȏה ڞ&W:]tK;&d`Vȿ|ymk?PS[Դ3o=`lo,봆ps^e<q8|)w ձQ.7x#⾭튉m I|ņ1' ua3 thƍjj\׹b2U*̬o^xBm;4K뉢=Q&;38x>koYm&?xz ƺ֧py2ıp_Qxú=h&L-2DUrːqAcJm]2OCIQf*%'ԒMyUʽY֞w=TUQݧu_CM%ޝ}lڄ"0$3ɮR6_>[/RiK?!Yl.qnA'_\`zuՋw6JZ|aW}g[x-Jlㅒ&-̠`+ֽ7᎟x'}rštTMngdin2sh.hZy 6>uKEkڒFXw|]}Җ-ky8v 3^">=†>|%ԼEQzɽ؀N+`q5M G}*VX 1*[]2o?%剼X9Jҹφ~"IχW~,et[]cX4 I9Fۘ0#h#ȯ1:QPՆgw:/5|745>_ zy1 6_vK{xWv?FI!v!htѝی?u} ))ݑȏ#^WIm3GӴɥc$Txϰ޽r<5=/I~]}亅ԅi9wfbI `+^K:Eܾeŝ` Ĭqے*?G0?S}ɂλdy?o^/mWKI7\#cb"s 6c,l_EIllY+dvk |GCAMKzj ms $#]>yXi^xw@<>Bu##m Hѩ.J PG#^3g^>+k',no+}6ZK]-@ͬ,o(n Fp1$(^c}li u?Bqapn%n">H8f 4X<_?=B_jO*\MttٕP"rĎ:\I_ ??ٶx+l OQ᰻v>cjxhKo!,;؜dp $7ᮗĶ{1u I-7Bo\45d'ͱѮ;:d̜0WK:'WW+?tiY׈$SEF2v@[bG""~=񇅼x^_f=ܗVz R2Iux|`qs#G6/QFl\+ONJkw m&UN4I^"5ْ0KXn >lǖ," Yf6QvΎQC)f `j:iBbB"K4?6'W|5|sмEuL,f)N +o>#M}beӥ`}I OQfa\cF)rK9@8JgԮʙOCSG4M}wtSp%[VA;۴kN2Z?id.ͿAF ֺi6Se4oq[iWoMW?GVUsSG4:]ZOg40E81m0vuKm.)0G߅ ?g~*(?6/Q@?W ? ?6/U(#_l z@?G#_l^(?6/Q@?W ? ?6/U(#_l z@?G#_l^(?6/Q@?W ? ?6/U(#_l z@?G#_l^(?6/Q@?W i t ?g~@?O/W i_ =i`ֶ[ 10p* G#zKiapx5-ݽޏ;ڴ eHwWegٮ&GT?|ojO.뗺wo<{ x c; bPm "*j=н^S<_g5y#âhoOw{/GNGzH~/E_h֑-e[y6S?k>h;ih`;w6m, YiV;<7 8EԦl"'[o?ߚ-`O_3'mz΢ل%#ɂ޹89񟉦^(޿>?R-7 [1ڱubZ[o??F_ܟI-Ee? %;w=u;a1\i C+Ex=.XxF? x;O%̞f9˹NO5|j{~Oշ }jo%/X[_[K 2 ch^-}n-|akokAY/,hcX&]UOXI&\{֏q5#>ydmrD&iK VԥՔ#{ո{-MؖNhZOJw~+qy-fm%m$d&N޹;'GOVWZ G׉{GLRV Yeyychπ½S]{9I3N{+?y~h?y~ȭ~qM"ѩ]93QZKK>aT rCTczHh$}>Q?b?[9EcC\Fְ;kK0h c0iI,ēW??o#A@^wmY 8nTvJ0?rc+m.++?rӠVycy.dcK8c~(EP?{~h?{~hCXύXύ Uc>7c>7/T?ߚ?ߚEP?{~h?{~hCXύXύ Uc>7c>7/T?ߚ?ߚEP?{~h?{~hCXύXύ Uc>7c>7/T?ߚ?ߚEP?{~h?{~hCXύXύ Uc>7c>7/T?{[ϵ3"xp83&~` R~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~Tg~TP~TFq2%Y +68؞({~ o$^U; V1ZǾ\pwv_G-UsxoưIvXЬ<)=+L%F艺uW!6+Ѭ|ISº~RmǗpw`' sj_c)9t=T46eDB{O >1Zݓ-Oh&4ׅkʁFܫm`xp+`%2$N&xGSAasewc>iW6 \Z[\|6e'JK ό;cmMztu ѷcϹ4kKҸ;>5|G7k7ʈd}Y šRk^Z_ [IemxzH`{<.,A [8[L> |A}}&xo:&c4EZάq siO?]Pp<9y\z; m>La(;̅~fzڷ1&.!IiFH@;_:?(jZom׍U.4XKaM-#{Ԍns'5:_-eejvwmmgdA Ż$o );2UCJOr6C\x~)M[uc4Hmb̜7BǑx>+x{⧋ :{N'- lYL+l0'GPokWNEw_MxMjf,~ArFF:  aӧ5ͩD[ȯLY J&p(@涧|4o ;Fv-a?c{gpHeT sZZ1-KZ?'RQ,m {őP\i%WkIRy%>b_az_Ï>1ڭqcoܐE8|`yy#J񧀵F:]卵ɷ۴.F#3Z^|M@(}u9?_h#Ѥy&>ϑ5ڗ =m~z4<˩jc ![`I;Pm-ƿuo OBXy$kx +N(Z;SgOGgOG׿h &ޑ ~#}^ӗh)VYEs#-b(=:/~%z/_PĈVSĐm;T U%p=;oOGx$g}3ITQͪH_~|6gkش{74lʧjze3_<4ijB+ '8ϐ?z8 0ظ}msx4xdHYXz-jPv1_=|]UZ^b7C#6Ҫ8'ֻxe'hvŋZ]{/|86{u&_3G޴>p} y++ha$X*gq3@4 r{ SL. s88֨[ƭ FZ3beZNX'7w:Mƒ9XdGRF I?e[G oDR -GqɥI~Oi\ل[4$Y1 s^ :y~iz[+ITa!rdһ9 O k.ԤkڀX`"T[q3 \&6Ǭi>(U|C CdD\P(Ǚ6y\{Qv9Ҩk^ 9c[R̉y:DU2X'ꉲ՞z߄4k / |FkOK.n|u *cgo m>Z_MrMs%ȈeiYEQw1¨ 8?ʲ/.+h|vg;AbE?A+iO!n~y|! z]|OZđC0$P_{R #tC\~GI->m"+5 x'0;#HX1*_<\ׇ }jڍjodmtSFހcAGzG ]GxLY|]u\hK- o$c`C|U[/]xkⱦx6!:hlxY#(dhc'+q] ]' ]!;~:ΩxFI98<[xvQРѭғd֍N&!$)x.>mo$.4_ZEN?g,4K0N׫kg^5.Y=n3֯Y!n:ւ`d{Ud+x_,|:/|Ac/RSʋLI"lg`,Gn$m.z_4 y0,ȕJts?kwtkc^.,5cm>C&K+U$,߸yVV!qT1x?n>i3x↣?CJ|V@y4"[clBrrr;A?;?OA?;?C4> |<OÞw=ڋ+@'f^5מ ޡޡ+-B}s~.A?;?5 #Ш=\C}s~.B*+?P\CP= A?;???P,B}s~.A?;?5 #Ш=\C}s~.B*+?P\CP= A?;???P,B}s~.A?;?5 #Ш=\C}s~.BǠ\G&c'Z[7th\7 .$.:cISU :OM<{][\&{WOSl3R@c:o4^X,5K;Y9 ,XXŦYAi|P"w?XO,]-Mt[ \`ݛ*st>ٜn {ⶂ>^I*$مSֵrbSS嫱/Ǿ=^|G֢O:BT @Uq_ICHM/RԢ^ZNI|qئU(IYprVpW|3u k1 6p4$جϱy;q޼ ~ڿ<]EKx{ ;!ma=3yD]X2RC 5WO[FΉq{{)ӥ1Otea2  ל.zωIW`Ӝ t&!PaN@::nw{XPjhV =}+iё 3`m;RO/-OHĚwmho<i01y3z4-x Vt忻#kHUăDPbI;@ xSh d f![C&T,c>Ax$tfJdxbˌ`.Oj|Ní3Tчm]F -f8h ed8=+u6|!:nhcMm>S׏_ #(U*# y渟ζ!׼U|%Ԭ|EsiywaPi=ke)5{XhtJ?R5f$0ٺɐǀor7w{t~!O5KoKR:[bvtQܣ3Mzޱ8['E6kkjZ &4X2]eT$TZa}j]/_6xrdKyg.ǘneFsM4LW{ψ7iBHӼ;uE0OMHwc8?'~UeUCHʟ(,Mz^#̃z~`WUEQp (QE\(QE(QE(.EQp (QE\(QE(QE(.EQp (QE\SRծrqo`ѨhʗqGx *CEnnI03q[LJluK5Z ~* v(G*xY4^Ȑ۫,m %OU`9VĺmmqnAp;F R2_ j2]0ԂFg񯝾*K[U֐;l[P{`o % Wf??Z'mc;e#FzN+ʫS]Ir4}+2R٫^OxfZKA#wP#5ek ~(ּW_L<68b@,ʸg'=8[f8S<]25)ǖ-9ڸ=Xm<IJTWeF ;*32FH|sC7QmTq I$G4c9MH=箙7cWnoڭΛ&mItAKFp+NT=ozisKV WiouV̏HV%%s_]fj^*4}cJүoRZEs/5~WۯGx[t1VgrKH09ڠqTUe_xMm5}B _Akլ~g qHju⸭[W/{n' Ƙ @b|׼I{q Ě$7Zl;y&ĮbFnʀ|_>JWi{M 31ެT/$D _xk:OtM-KNEY0veaר5v|+Kzj[j1jڕޣQ7W̊ L32c}=>,F2ZC}wf,径*r,#|9R.@5aFI4fP[ v̗vM&mPU4j|kh46v`"e2rs864GO.KC"U].ᤖKc+"DvO `ғ~C Ě~f]%,"xaYaud6c=m'}s޳=ݲ2.|@q>_O󅿲V6V!2#N{(A\sIǏnsom*V; ૴kawӶdZ"34-rƌʝ|ҬmJ58Ɠey?W ?Y^*,²+U?Jt^EϿY^*VWJA?JtG+;ҿ]?%WQEVwJ_.(y+;ҿ]?%Q tOUQ`<_.gy?W ( tOT³+UzX?gy?W ?Y*,³+U?Jt^EY*VwJ@?JtG+;ҿ]?%WQEVwJ_.(y+;ҿ]?%Q tOUQ`<_.gy?W ( tOT³+UzX>? &hrxsĭk/filA5m; =Wj so%smVrZBM"rG5c#S=rJxI~,npm7A*n2;?tZkIm: M+`zHer0H:νzjwX8gpsU+}6 FOk_pKXSZ{}<2c>+aIZ)6yCN*#?xþ,g]Y~C(fy+rN 'w-I泻7<'8 ǽ}b2/8)Q+aq}`5*T+8~!x I[ZI͔yDpUՕH>[~]]v[]oƥ1 d+EE8e\^=}^UO} _~),OUֵ6 u`.q;rH߲=]cq榮^dИb5QXIfFqty7A 5KKGiՕȆآ / 6>C<)蚽ui:K4;…&0;q^?^h4=;V JcMU*/9rMDյ.DKrag,{ld$FkyHctqq*?5>֭AwsD)yL$+mn Aim.jΡ ow,M %t+ÕnI` 7-_ }[pѴW0Mp ң>{v]& :}䚖K"i:N=5X";F T>5]gBW3Du/:OrCFC+]W{=1cm~P 1rd)ߍ}j+ ~ ~VBFNϴ>8N: **[58#IŀPf"s|hv:gu =?#:r2B-3x7~*E=3ۼ:eȲmt,FZ.šdWLN?=4X)‹& .E .k4׊ YiSkZ$pIl<>/V$)8RH8*{,d (4X(Nz.E?,yW|Kc:ciZర|Yca_%SEȤȯ'w"Tέbb-{pt#>koxBK)|Esb63vp۹1+{-yOb1  I ҿK`z,X(AgPEEy* ? ?PY+QvQ^{ _%T ,]TW W `BK`z,X(AgPEEy* ? ?PY+QvQ^{ _%T ,]TW W `BK`z,X(AgPEEy* ? ?PY+Qv=HqѩY?-m'Rhx[gv!'inޣ\ SLkQm{") n=Upp8rM~y5I,^{֭uL2T\e˔IqnDnYO4$,ַ8b@FG`8P-5]B]\ˎ1 *9Ha5݇dx/,޷7 Ӷ EIل_UOKӣV>m\G|)GqZkM}f-eFX*8jP~[?L_Ljd(6,1vT/W6ߋ.u.m.(-<\q) aXrpk'E᫭_[2i"J r音;[MՎ v:ShwFGb`^j;ާiqZkK?%ݕؕ#F+X{ mႀy"h<񇇼YoxM6>(dD lK2Wpk۴٣6Vc.ubm.u;鮮 *w,k+dP܀sW\,Wq^:j7iˍ^I Sc_%1O֭>4ڱz=ek|B ߏa[$kŷGW;C垱Cn#}F٬)uЌ x'n &PO0z?4fXMPRݕ BD@GSF+gx7? ]֪eKl3e d~E7n㿞lhkđF'Rl>yvM[_ǟDQṋXhҺx?n 2&d t*dt*ڞ#O>$^.uNVGa֗*2Y]۱"BWv_:I5x'zg-[M&\l0Vv!; RƏm@wB|s|Cfx^͆ƁcڠO1/⍌N{W)gG=:/_n5n*h1}G+Hz{;_/xQ/d*kRCgy*, 39?;x_Ay6-cb @3ZXM^κ'?|C}jVt8]BHY,k8y?]*&Ѣ Q;5F{o ie.ZCa$qMZh|w}şm&m  i];̯ @*00Y}/&f<-e3x;ei.$Yll`Cp+|akG-ψ Ѹ{Mg2 n̸5.|]Ji'/%%>bʓZ+c_1ԼbMfk=R8dF"W'ꆫ_i+wUε%ե-ֲM2@Ur9;j 3築:o|waEt{9Z@3D#r±~#?OMku;k7:h$xH Aeq 8^߀ iVլm-u"Cpc5? -DﰆWWu*F:xox׃tK_ i%1Ʃe 5KZj6n &ykX&A\BIRӮ!P`H`:cQkwL3d'pj~jgIeh<љbxFk MpIcՀ$~ο-KlU{?E_UњU{?E&W}9"W}o\W~8{?^^ũjί-H:cb@͵+#S\׮t=7.gmo,ua)o(ߪϽ">%GOծ=+4[ d,d M!-$f[Clڌ"IfF$jY[eP([~>7go?3[i:NJ4}+S쯵l  fy`QSG$q)㈁\Nh3q+1ts+J-om-_xgV躞u&c[X&X,cBd W c֗Oz%<fKwCcs??'V}7YGcCѵ N$h!ԢAp!,G2zk^O 2'vI5veF`0zҐfO@+?n2i_ui{k լ[̂H#5.h??'V}7[Y4bfO@+?nGhbfO@+?nGhbfO@+?nGhɠ _G? /?`^q,Ci$FR S?Lj//:");+`=(ٓ+J2i_ui}ww4=kN"gUWv6pU94qf-ŷ$Ѵ}3UEy@Co]OA^:OG??:_'ZޣCc֯wy#Ta1zT%fS(. "-v¿}w ̗֭mbT]3ZVm(Z7aiqah kYEsvs!U# H#1BVj 64 %~*i"SY,3^IVr` ]xs|Kc`ښPDS,m~PW< 9b{׵7ķ0x\𽖡$e]A\)lҽzOQ(H;㮳aƭ[:&uŧ>>lǗ4dFSnペ|1Wv,V_ Yv[ɻiagJ{Wת1aqA猎gI6 ksZw>C[+k_xSUUY]b '9?GX&Y3EY/47 iwl$Nr\@#d(KLN?8$%%.(IbQK1@ E.(%/cF9>w= )>jիx/Kד3E?fbd&1ڼ{5[:eg g\:I3*zǿ *x+0zf.lFxU,=+HQӵp%m s>xMOvwvFuHE #gs晤_x iu?yYN=]*Is?ҔpH=j_|}V#A_r\xNLJb$= 8~P`wl|B\Fl|k{iAY -4ۃg '_Z/yZF }jӶ|?9tdkhPUc[UT{rRk EM(9=zQ@ Ex=hR{]_j~#Ze 2!AD H[6}Mm|oM>*mi 6]#BKoFg&HHck0U0x}>_zST{_+j߆7Pkzzπ}#Hk;y#Io~1>{:k[Lҵ csirL/V 3fp m799<ޅAy{U'%|ϋzrekxetpyA%2L`c*ֽ_To-٧c9_-nP_恁p~Jڟ,u SMy|$ѻ\X!ۏJ!Oྦྷއ5+hkk1^>X9Jq9`ZSßsB$>.?|+FsRe- :k#v1W; ۏ%MFz)jivn!aRGC_yc'ǥa>}B<'nmWS׈l<6F-sl2 I3 kuuWZXWVmunhVfX܃|ȯsH8<J/ߓޒ{H(Ǹ‸RQq@\J#X?x:`eL),z|wIh6Ϻx<_'UkMIT F\P3=?IǨǭ6%S\Ϫi{3, ,8-fO' j.{IDl^HA(sA.8\(я1uOkk_{?Ϥ-$!ݣ+#*2vAZ&GuxT -Ok k;?XPO/p^]r0MBU|/Ohe̖r׺KERd ]ĢO=%z߈R7M[fZU2[lb3OO)kD e[̬ c˓تq]?Z&3[hiw2XeV{+'O GZ독4PHϏo,-5 2m7OF/4krpG y]2 c5!hC]M4+>?Ưn(+>?ƏEt_}7€(+>?ƏEt_}7€(+>?ƏEt_}7€(+>?ƏEt_}7€(+>?ƏEtP2tǮ[jFr8=zq7{[}O{IcRrA'/%hkСf?ij*D#2&Fݘ }Ӛ릶ݵWp“^IӸr'';SryQX-<&ȢEY$ ]:{̖:.3P\ʼnVBO'yKڼOxgU).gkiiWI48󯕴!d;Ny戫r]*IU;i;P@nwFb[,3vp0r}|ԼCַͭXaYU"\!-y$ƃ==RM;OP Jy*1liYW$Ok^&9G@Ŵ\}6%e|[q.S-x+R.-gtw;ջ-YitжD3oa8#q_ ֡zouG.$kʠ1 g> 4:^Cwq-%h2]MēZv@:] g[}š)3|{Ww9FU{x.>q|y.[|/I|hZ}_M!2>  d89!ɒ}|)š)KoO w+X7⻋i#鎷 i!ܨ\2+a r3\ĭTCb.@K Į8"Lg'k6qEJZZ1B4oDghauKa X Ŀ;NŸ7JN|#Ệ:Gy".-)`G|sB"v; ~kTho i^,:Ig. j*W I:}gcAZeI|LIhVB}漿+??Xw-KFXΰK+-˂8l@<7E,t?%- L:soo]u>:<o:?Ƶt~ͦZûy5Bޤ VWz :hAttR\G :km4:?ƺ (\G :km4:?ƺ (\G :km4:?ƺ (\G :km4:?ƺ (=|A DPǥWZB[++]݄A51rFI]E?_7tCA{㏳997b?(dfHK(9\ZݣfiсbUO}xw:twvM$,_"U#00 3k|u?*:Jwqݎ,V"8 ooZ_i)#0[vu'2D|^VRsѱW!6}q_9Qa3<_Dţ2z.,/g*dM7i:n7?rF=ocs(ԭ _Ntc;EuF=ocs(n7?r19=o]qLuF=ocs(n7?r19=o]qLuF=ocs(n7?r19=o]qLuF=ocs(n7?r19=o]qLuF=ocs(n7?r19=o]qLuF=ocs(n7?r19=o]qK\n7?r7?r14sq[k-˷yfx @8õj5TB ֞mdn<#wNCxz.n$Q2V*H@H?/qޠHyN%O֬p}-yV!JIJ[V<_]$L$_hȊҢfO׹W߭o7a}9G#v1ah噶]loیt$}Z_5֟}9G#v1C3?7H|q8>8F=ocs(n7?rhR"bdX扣.ѷ7T [tVU7pUY$c&Vh G' >OfhҐΛuD(D(F?9?? ?9?? QNtOONtOO€:}ncoouD(D(F?9?? ?9?? QNtOONtOO€:}ԅ1ҹNtOONtOO€9k|E$\HҢD*H5o_b4p\ #)JpwwъW;u[oS~#Cx(Hث+ޢD(F?9?? ?9?? QNtOONtOO€:}ncoouD(D(wTMWB ϖ$ Ok!mT[xiR}]K!lG,]W':'G':'@dG _2޶"~\E[ס,ֶ沕W2?%N: +@hotW? A( ?>?%E(Q-}J?‹Q\'[(@O G|Q A( .AEshoQ-\>?%G'[(}J?O G|Qp: +@hotW? A( ?>?%E(Q-}J?‹?xwUă_dU~Fߴ} '?ǿR^x:鱔O]`RXz"Agm ʗVn\烂0pxjp˧xMq6|N7|RDTBo1l)9=^GXPxPs wqhȒL}X <x^KkˇVw-: ګZJV\;pHY$wma犇xRR6ΏÃX䐝7SR|$GW'wIocz s FqU$ '@R%ׯu8m'G+%$é/#V_SPh&?1Vz՗is՗isn Y}O?]Y}O?]_Fz՗is՗isn Y}O?]Y}O?]_FzՎ RuKҏ ؟o\u&Riay^7檖>gMʳ' Xg9F9 #CKoqm,O! $ {T^χn7u!]NA9=|”|e}?륵lD/SM ƫ[9G oj5QN9A4ks(MW?r*( oj5 ƫ[9]XwM7~5_?U,;&? niWEEMW?rA4ks+ ƫ[9G oj5QEUM7~5_訢siQ&? ntTQ`9A4ks(MW?r*( oj5 ƫ[9]XwM7~5_?U,aukh4.;'!v]\I4c䰨Q!uldhׂ- B͌`|+lZ@$ԭJ >(68N$ȲFYCQϸ |O;SoO>6<o{ MBů]@$yGvwWSڿ]ӵ7EI ijF\Џ*/E xir}kc-/sXn->6m$hBB)uJg 8JA.M!,t;iZi- 9- ùO8`b2 Iߨ)#̟Z2}ZV|K Zhzn\]E wsn2+,xSUXjO|{.gCź4zmՌGgyosv2RѸ;giD>|On5-+2zWڟǁ&ӆ_os%,%QW2b2ZBp17>_ARk`$ƒhIr< qW)'fI'fIE;r^qzW|Pk?yG<3E߱"$)oyW. P6v>'־he]i:<9[k5Yc Goo":(A\7J5ZI1DU?Xb/9 5O\gֳM$@YhC\' .m@74uWwɝ'm?f|ase{qhpGNiѲH# 潛/VƏHt Z]Gm)xM[Wδ妵y]@n-H!6Serss?hxcWz_Ie䱓M3g(w5gbVƏHt ZnxWJӼ+#][OFB5TUٞ}sI1 +OC<'/7}ÿS.cFk> dv=4f:O^oOhy5dvxw;E3^yO^oOh'/7]jG%_k) w$_Vե*F:Zƍgm7q" @h)> imīw*ɷ힕s]x:ՙ$6}l" ;LqAv4CJz Y}/cݴ'Eѵ"4إmđ3!, yh_ #t0ZLQ6]i _1y8^  Z?!%ihz1WVi:]u-Oºi-O0XFڧo8'846֌;iZ?q{J3?Ō{נCJ A+OTJVhjЧӴ `zhy<;Ayu?:vמ}ÿS> `zhy<;Ayu?:vמ}ÿS> `zhy<;Ayu?:vמ}ÿS> `zhy<;Ayu?:vמ}ÿS> `zk @ cãb;Z:-i?jsz.s/qJ 6n,9'VӼEV:䃪[Β0sz$cȧIaB+ Z:5M\w4Dxd v9HN8㎼]GoyZZO'܎yax}n=+@EnQ#ֆH9 \OS?gCNmig٠tI..%"7ڗ˕NKI1 -}.}ӑqZ3_2~%Yh/E :lʗ 2llÖ *k_Kgl)1kiᙾ5OyJ4XH`lUZusBA'ImﭮEOnA>tn `u9*(4↥xH-4/M>#3g4[F# FUO28a3*oG-ž 8RdrzRU;+Y=[̩ c`Ybw$A+_Eky=DIY{6峔'~L7xÞo i:^;'c2!I 6Uu@'@.R}ϵ|͖cT? xDx.$G.w8|~X%~ /@EMK]].+iyoctqBH$\ mH9}ϵ|wYk70麕>'FV8̛XQk7#Wǟ0O*Ӽ=y mei2E,E#WR84H`2ffH#`J0~,IZwlY[ͬ73YiQc@ 4fTg?|OJ[Ӵ#Şe'V񷂆GŚHB6* "0$7#=k~ |)Ɵ >2m=oYQ̆8h,TˎMN\_p##ғ_7W- úKw(M"A$ 2cf[\nOZti6;ks5мo%1O gDsJ3_%k?Noyxb j "$$, 'x]n5hufwy6B5Lm#)WϡF}=w y^]Me?nP_>Sit8}OfY^\Z2YXOȡGщ=iZl~)u+=vdntQ|̏@RŇ {ZE\μsqϘӐr}1Yjޭ[hx dzug_ǚQqoj^h'iiO9͍;˿8 I>ɏY$lvxWTJ#=iN k=E|'RM^UউjSF x'O~)HӤؾg!. R`g٤ɽk?l/#|3KWH{V>ׯ3KGi2}Z< e/#_ z_֏8Cz4K}_f)oxLUޯ;Z\\63Gvx#s`Tg@߈3?~5{NPB#1K扈%`㎣{$9#Mϫ\"TDߐB)qҭxt|Dry\sހ6=(ϵ>gڒ\QjJ(sF}(ϵ>gڒ\QjJ(sF}(ϵ>gڒ\PyJ(,|0WQ](kjoZA#'f~5Ï)Eޕ~":ewhv A2GuR @Gkj6:`:ǾFX g;S"]%g=SS_<煵Դlcq+mK?['nc[H"{#3@4-8ǿX?!O _&ki[7nn8ޤİJGFnܹq5C6=Hޭ2Cr]$nzҺQq'K`ǵ4=UV<~VҾk,o4F ->X˜z܎3Yω^WѾ#OM8 >!kRm#"/y8#fj4y`?M;G*>wK>ª2&FBMLFIʶG5^:k 񼺏ٗ@w_|mo8lyN sOұVI)'M MoKq Zjv)t"*ꁙ;گ׫xW~)=0hڐҖH0[efu6_?Ć? _&Oi-Cw[мKS=k%݈-.FUX0`G~OL\KI!֧&ӣ ƚ$IVr]vِ@ƿ`L5ZmWxx~o^7jWf-~\+ƃ>)w zMO~uKK8|oݟix;$_?5ƾM'cUÒxF@iM2=D] Y(Y6J]wo| ba4 6ǦIL|Oa}{G+;iVUI#Y;Bm0E{oą8hAa&?hԠR4ψG5=E+Ǚ$lxW:Uc7eo0zci9sOHz?tGO5 .bLCȊ2G%IE}ӯ'޲ ĉ9hA@$iDqm&isy{kk[+"cPr7`GּO|/i:{{K{I5ƱQq$I ^hީ".rgk}J~qYx5? .3] ĒkĻK-FInBMXd3|ϋ4A2/sݿFGzvAOm?5? 2-Пo4]!/6ff[4b ~6zO1G">(Om?;tmms5? #&R:66D|Q??Oji(htmC{oi5Q[L$e 5#&Q?SO1EBυ<xx4=>;02Kgp0+S;G١VZ(kwNtU+Vvcܝ.%fy Mw?EsNA@(5< ? _&:+3hA@(5.4;Wh\Ӣ< ? _&;WsNA@(5< ? _&:+3hA@(5.4;Wh\Ӣ< ? _&;WsNA@(5WgV(c-ڱqJ.6WfIL?¯h^'ۻh#n2GAӥ1:q/ ZRoz_uMPG5ΡlXYe]P.UщqyugCBOݰddbF[,0pzGGc;^9|%a'D[{^XIeP7y?Sz^#^>xROCi3Y{2+d ٰB3ˡKF%Hpѥ* ^kǧ[MxOcj\^z$ncN\*9p玴a-D__{\\k}ŵN[!kl#IN?km&zE_i (-lUL9d$ Zٚ? [׼mx^mwh0~s1IBeoT|wx34I(%~cE/N1B[z N_6Ƌx+V͟S](3fӚ ÿ }c\/>èϾ ?nۯdWa!K_i_i]B-XIy)[-ϜR#6ڞ}i^oOg{]gĒ*ҭZӾ$_|2xJٝ"[GMXG;ؓԚ챥ix_|b?SdQk]e*e,vi%da=c n~'x/ j>I:E $j#'lH#gY\X^[ լ8\WRQ..ux3goa} Gܤ;4hZ(◀ ]ekZX`z6gߌuj:|/}VMڄ:u*b|m,` dפ+5o?6-WDW,/6Vھ]q/\czYxׂo.a(DѴe9F2F:W-iZj %4{U$BbZČTg΅ :@mZgI|tG$Uq׭cǯz;oЖVnes)^\pnyz׬X|5>Zx-Bsc:^2!Ñ=1/O?6A}aqȭI`Kc͵ϋ?5V喑xb}Y[YHCbs@#9pw>,y9mmVE1;HN\ԚYxzkĶ]H$*s'5'~>UψN6Z; "جL4( +尼U^T▸O Ծ|-5V]oXcPfe`[nywtƂ1s&=PUHI@&hFd\iClgb)E# <⁎sE0 )EH .~2(8IMiT`nR)qҖ57~yҐ5993 u Q\4T{׎iD ()TaZppN3-SY@quőIy޾)y'o_Zu: (axE}GЅnW_Rbgu+Vkss"TT%|]qœ95kW/|i-gOק%,'k Dv>F^31G.kj Ev񘢘&mE  [Zq Ğ.XզHWfrz`]ϙd/< _iw_5(5 'Ԗhwv`(P9'i*گZǢYzo<-/TCnؠpNzc_ x*!o j׺͈܇(l `3RC5[7,NAlwm3/sŭx[OO k\ Uh^?K"dߌf2 c@*~8$y_}o0//qœ8߱׆kO|i6Vqsu%n 5߳2sX|-iZ4VI*AL \Hlt >Y$xs<=. m{TKXhAQ3̭DkR6aQ۞uT|\> |c.<_\Yi Nv8ѪARI'=Ӿ1[MsJk=&]5#0DQGˏ5xs Xo"jrJLXS ]Y nxwbxuϊ;_MYjZ%Pmf7ﴖއn?|HѵwV:w7-9EB ¹fpqa|"tmmlL.,b H$]:WZt_XuYydgY#Phc` L^s߶%ŏym Ҥ9aa9kßm*NJ,3x{{LҒo+oξL*ʿ: §An.4b\Mbȳ* ]XqTS¿֑5:ƞ4ukUXp7 I4cM,/V /Ěτ4x.,.{9DAb@ʌ +5:彍ex g0eI6mo8WY|4Mᮙ_txK{+mV[GP!x*98mV4ڟ/[mDn!]AK)c02|@Uu#[=c? |m~VҵO\j^Ny'&1;"IJ)אkcx[u/E.Y.}p;ןx\'}云utKkK{xѝٚ4Pp+´WmxM^êj ̀lﺏ5{|Qs k?%BXRDqn!d*qs a?죦 ^.IHe{q'G ۰)I)l=|=o,OK{qs?eYL!'#91FxIxYԯ5KK(ŕ"E82J>R V[k^uK9jQ:J!0v q+yx"_յ=]Hm^wrH O; THZ67=Wv|R5Zŵo&6Ybps|a7k2xXˬ\,hVϸ6I%k"&{"Ѣֵ-:XԵ! L#Π~BIǚ㮝.'yuwG9}1+qW$30*v0}O?.kc[ּ/- KSRaa$r#CC*M2 f=V_׵-I|9/MR$I<|by? 0ʻhgz׈nbx4 {;Ф#\G8 +6Q񾄺 !8`]s!P`7߲vsz}Ke/sc={bB&- \!5h_YNV~t3D2b1Fs(69Ylq:ڏ#,t:C6"ݳ,!?7w~#x'cGC}>Zq%6+d Yĭ W<}2'-Ny3;6 y$,S? Z]5E԰-{*/y+~n1l'ݴ߇V:g=W]>[['Tݸ$0+şMO񵟉u kv_ٲ!o4J"fL۰Sk 4N3&H1\0I^$|EX'~F<[ܚmkkqB%C\{\tm˭kG񇊼9i{.wWp9 HB$tsӾ;TsF~ӣ䰇GQb.Aqvb3'vw?j/VojY ^k*2b. PTgoo1iZpIeir1 ,LFz;\YY`iP0=k7ReYZe.@;ȧ,ɂ:K=𡫡~_i}'Ǧ^C޹#4j1<7n4<7ÿCƾ!&:$~qiYGBn)/G;6: nY[jMJU2kL' r@>/iZ_Xhs&^SOH`UIF}\ $7''1-͎>06LveݿeI^uyQs: B Egum[-4Υs / z|Qb&K}&qn-mEںʊrTÿf w[G|qukcsY[fKX.6\1Lcq3~!x6zh7$+ms%%ܧ&c GK f yW~[:ltGI#-c0_̑- gx#_5_R[oC.UEHb  ň_M)+ +?/+vm"B+/. I_I| }쉎u^ >G_Z}о>FZφG_²i2Gs<ܮJ_Ax{F/ Z_gkk7:׊.n.=߈l{OYYș*?zp_f(y{p|aHŭЃZ5+:Rўc2<3<.#*Oq]¯>$@|rot?}HR[[+H%vp23? k^.-7u5֏ﵱCDMÐ@ixw/5 u}'Xm`dh1dy Ì-;wG#x^[Eq/HAn]ȾLm:#598Qҵ,::1YJp AV%Tů? ?>"xPK1\- Qd䃼;D$zv)1KE+ LRQLUqp<'_;y@QR@ R)YҀ) g%A,G9ni0@1 @=J9ġ2 EssC$"`716I30OL}h!"7*ri3gcQ݈JP6 u i0ɧQJ%08:`!PMQbM@ 1)9=3O(6Ѵf@1KEbS6 0zR@ lQEb(QJ&H:`QEoBX^6_Qq!IJKo|_GW褯>vPDsf&9:֯3`|bwӨ^%C)}?2c{ã>" W|1>:>.IՍm q*ĭn,Xrfxi߈=d0,_>c@YJ3k7}FPmH0,4xPqvB(-W)~ ~!;mnjZj Xn-5`-4@mjxc|_GмQk: å慭|~ To?,,uH4budі/'6@m%rl} _S%uIFT̺yWc' >t~᳾5o{}Jho,Hlr?P*"_Txo/7~#kgÚ{_]xeY%% VeU@'}j7tp YDăø|_:gIojMvWm,%%$D;"yH+ `ze/CaÓlI kۛKXg?< O[GZΆ7Zmo cT>]OxQwRBK 40;qZO=[q/5/jRTKgT{!ITydzO̯U$>`{5nz3[O£c è8^wGN?s_Nj XΚdf d UFH<;>x:nos:Ųu4PNv~ҼmYRү0m(ʺ؁OP|dm=6jzΣK3&n0#J~x#,֯Njskj~A¨߼y<_ ξoK-3+Z\owXHľ J}n.<+Q3IO+յlSQC1G$~;q]*wMh1٬vJB2pYj+SkkۭiCmsk'&Eݷ#<y+O-ƿׅu GLQOe$!ֽǾ<[o\kĈt=F-^O<đm8SRMsG ˫YRVM4&YaXw+g(/iۺ^Gx|cp\}&}kKC8$q^]~"ȷ-R+[ˈQc,jQEI tRDx8%NF {_–O[It' orGz>~~ɢJu]Lݿwd'9Rղ{wG>Xx$ּMw{,%"Sp #;U.ナ~7|A;]Y_|e6[Qq<0JSׄ4Dom6,uuf+*Wv0H#%/χ<3w=j1VjKw@JrHVܕ9ox!Ű^/[N6ϔ8e=G)ҼQ;m/uo2"uXVG-m'aMrߴ+R>=b?|WxLtbT+FO@IZu"`>aJ V%Bn]r2z-QM2((€E 9m"Bk +?/)=I_I| }~+/. Șw^$x8?;C\j4īII#btPB_ntg^!AϧO/zv]'\Դ_7foge2!FxoJ?hL#M3,m1HD>b W&|E=sO#{+T3AldWvmا+Qſ%x?h-XǠǠ[I% OaJe@P3$+|;%|%l|Eڊ^#PDdءIPsp+_ >:4r]OP |-.ۦ4[yg}M*g ǥO ~ <ؼi:LIq \"GVWd)!]wO~,G4M0^';ZSH.^=vTG#=RiE:kxwšΫ=a|3TB1w U V> 𦡬Ŗo42Ch;u;T_`ȯKKmcN[; w$k+Az's$ZGKE4Ei"x#i&ccow<z_mn?xuCXZl.Idc&nFYZ^ ?Ǜ?]i <+<1\JZm$'/(x5R 1E)&WGq5V=PV1ZXg#D_1.6 r2{;7S'aymf(K@o԰*ܑ5?:yԺ@YK]+qg(gυkHz0b߶>4IVI-Is44#* -ڷ\5ݶn$3-X=^i"ڵwX[^D<Ƕ+d) c]Wvw:$usq/$7 cwhZi%#4K d,IYیl_W|Q}u{+(:Q #DŽEd)]r2s@=+|Y}#iu{nɤwBĐ|U#I{އ,bmNVön ,Qn@#Sb~k6Y{⟈1ZMgZo ӕ;.~]a~.e:)ieYָC#*4rÒz[_;6mbb4l]n$G~Ɋ3 |c~/OÏOޕ*]'AInvaD[G<_IonuX/@*\fdO{Nu+#$)^)Ag⿉> ]$^[k,KҠA)n>cSSw)W_-E*kݟ?Dq:%Wycg><}u^sk濋/~Eo.lfE~bwزEcQ_aKm3xWŞ(<9꺏'%]}#[PC-DXq 8)Sl>(|C]zB|NLh,-e,5oFu۹ 澱]wNm]}lu1lī3np3s\[|YKs50Q{?:}bwcnI$Ӿ2k&Q4}& wB3Vw sQ֌;c`l w<g/o>ƐcWvj+ _*5Gsy~i#19$ `0<zzuiOez\e]3a$6_U&?1h>7ekoaϤ ͙$cט.ۿ~ux/Ƴgqi}oP4rۤĥ }%?_ 񱱹āP0Q,) \` gb<157~Fz;&Q+42ȰDDDP8IcG|w?N|}H4o A,$Q'0YU 9~^oΔw)|y- ͩjj(oz68`t>W<}7"𖡫ˬ',bСݓ̄ZΟ<c9~|A՜)~ O=ǣG$3[Oy#y"ʸAYc_> ,zMem uҺYۼ( lW]ƕۛ+uIf呲O#u'#lRW_?c`+ߊ?XRW_?c`({"csAj?j߉э4=?5;k<8O$?Aj)|_a"9|Ab`IdVܡpj_g˚'Gzݮ_x/>*B5{UY2[E6 HN+U ?y){syO /5o$nX䠍X6r{?ޟCkH/N "IicRQ';@y]?m-mMMgWŚe;9SBwq7_~ k\xK+ԬNM&t|e6;_\XI[]NV$uiVkOu[yZ;E!B$fdܓְ K>3׍<_kS[-W1ζk{R)zv4{i/:w5>oŚSKk?uCH->6pt\A{‰uOig^6ȡɒ@7r(Ꮒ>xkoe-Oii b0=2\WT~Ĭ#mDᑑU>[!x:X^kv"d5&S8'ox}/ }~СUЕ-f,t,g+ g 3*bOShvqja4R`dA$(J<[W|qR^,umLk{}muylx `DMBvi:ٓeL&U,Fv)'2ƕ5Zk\Dm~(i98jnuxB&cںGHƎVc8t<є¢Z߉>"xS+5[;tkoDm2KNS+%5gxZE,p\:c$o, q 8|g}=|Wdפ {5hۂ 9\z/ XFЭƮ5* ,v2y9憷Cǂ 4jiss:Ei<$ 5|zg'xe֙IQ*1@6I ujgi𭷇c_ݴM-L dnrSiPF1wCz]N#}0ʼn'94ܛmdx}Gǟ <),|__\.+1=gShˌ3a8O_@ YO3xm9H֐Ie#o0Hѫ+9Pףx~GX^aaS \gp u2ï~: izdd㷂$X*>? twftaoݣCgz cKN_xQ?2oQN" i6@MWGx'uh5a'X4kt4r dT-+-~xJ:- ? \DM>\I$I9zǺzV?[=&Y's1bM߆݂1>?u=> }V_.4 дܱ戍ٌrx\kgzַMu$l:eY+`[2Dہ<[߀\hZ.k-K=Gm$R&RR+Z_ Iwyg$ibnfl'x~O^EV}&/[+7w¯8E&;=^[4u?ry&ώ~ue h*l!=/UѤ{j|pUbBڞЍ >oKs ᎃ]xfZP8-L.m 7l^ɤj֙iwcu,%F usT?hƵI>cpI v98xGY{oY \ntw2G2D#f#'ֽ?|/R&u+uEU'ezuc?A>v~m>4p_N3WP9+Og7%;Y@YÀ둗uErOF&ŚU޽w6kQG5͊H ̽@lGG_<[?NuMkZÈ[) ca"稭S7t8|u}}31EignK+nOmyzf#yFkt s#ɉ/LcA*O| ']V=O^o1 ,񼑃Qdrj5x_DԾČ|9çXiQٳD!iY8vU<qcwđR9ҭ4Q k,vXFg8!=y}tZ-/&&,g)*Wzn/>x?Pm'UcկcOt JnN(❭.W⯊ xSh,:-k4e vaq,U6`r}--|aώ<ޭIӥူdy,+SעxMS6Zђ{$Gnp0Xi4jݥCj% Ŧ#֩jgsJ~.t%XԿR8Пhe.b }B+'A]Nɵ]6.܈w<ٓk|)Tïx:yqh42Ko+A#>rdsG0T#p \>3>gYxnS u 4f; c*xYn ƛ7#TNM"2* vYdeT6KF1LQZ_Sjw&ݩH$9(AangV1i/x18!rv䞦šՖZPY%G $Ա;eTJ lj|5֕⯌WOn1Iip @$lA Ð@Gk1,«gI<=H" m++ew)]4H׮qM*yٌK`v#5&D{=[qMr-U *'9KMMο>'uE2jjcl6R;H`N0Nvi?uqڭZTpm (b=(; g$O>|> Xje)TU ]axE}GЅnW_R?=ܫi4܈& *T_ e,:t0`g߂5wui0H|<|G W疍)`jں|PcRC6I6ʀrp_$^!-^[wOoTtkޫi騗6K;1#cOcSo#zF_ :l_EA⩴VZUbf)'mw1.>$ꚿ<]}j>QOTd"1rpwr~؟?Ëx$ _}85;Ǟ#%h;6DԵf@w" usUό|p񖥯|+x_Vj9bZRP s {W~:Ɠ_i++ IFH^`*G;~'/Nfu\KLH/9i [ \WWk/)[ZtIQmZcʩ巯CCtOOG~#x z&xWүEd+[% 4-LK~7+i/iZeݲi.ua.|͵vO#ំ^><ҶO{uk`y+ 0]Kw9Þׅ5kYѴK3V%-Xd֕q@~;|iR|VѮ| " h\[0yFbsWӭ52chfUܒ# 2$b 75šFiDm"HWiFq*c /<g{}if>|򕱊@eJ}k>FOI!<;FjdپiC(p 䊙/WG~Ş1k?hΙx`N Z Rp}#ef lվǍ4_}.AEavMnۼxрa\]GZ &Wݠx 76Ciǵu >i =&sOz~xT\i׺t6zϿz@>U׋|IԼ4R{?uj)CA8H5ewj^ZkOQ:pXxE"R{erM}.4hfnx_|Lx(ĕ=/? h}-J4IvqMЕDc4ՓdGM'hn-K6SbIV H9/z<^SAua>Zx`Xdtc1+OKֺ5umtuu=v woj:\> SNZi4y+=3Qqtr-/Ayx]hzQ7^IdsX<{Nw1t]t:։^oynۣyX zou h6cJԭ緗VO5Jp@q  jo #0ZEvVݱ($'$ɪl~^_\MX}>t3WNrTp+_ҴҦeU#>2:Q^|Us=&}(]=g.8f,n&J<.}s]]{UTI`uB|<UN!2;菅_<;o/4[K&O.ݤ$Qq''sRxLJB:4{kxZ7vRO}9uy%kc${\|bwđ5-3:͵&C22+nlFSWu>ik3HCMf`m (xigsecVXQMS([ _UMxŽGC(Tr`,TۃӞƾD tz< ldHݨ3'Q{Rn>w>X͙пf]J=R?}kr~PXἣ|+Wu ^#/i :@v(+J>} 5I-ds%i )Eځ}\(RӧvKuoۦvE #Ah 6~%|B|Jk^ Ht$ԬӘ#z̏2HHSMچoe8&(;j~=G<--dĀmANю]]4Ou.Oag2%yϘBݞsU% |U/M~-kxVQߍm,4n0HbC$q8=kA55~)llucT֛XU"6[8I85ƴV>|_OZ GMV6%'b6J0u.18WӺxđV𖑨둴l6h(wrR#ŏ}-L~ѐsqkVMv߂u__Cw]jrXOkjŘ:We3[j>uQô[7 >$|JotAM5֥buMφW#ƱIuqkN.HF%و$sWm, jvtQE1Q@֊(QEoBX^6_Qq!I5 ׺Fs_uЍIH:@&Aj_ 2ƿV:MvZ5r;lFϵxyCx@x`WmtDQ--lo:dqʌ1N8ڲYO@4\wv+PΫnv⋝B[eY/l؆F@?v\95DUW׾ݦ,6&MM1#o1_ĺŇt=?UfM)c]T1c皚DŽQ΍/<%v&+$`enjdQ|cAk6Abk֮. 3-$c91^S?W[xf SU~hڬ7_yw8oXkg$!5 +h𾑪[_i-FH*耎3Jږhvl}wkjKt˝+ zM^to:\4֛u&׋#y|Kk2q>w"FdfٛW4v:5g!ѦӃO7%XI"ݎF\(_g5Ÿi:i Yƥo—3 w_,3k/ ClҁyE3OmI @񆡭hڔWZ%صVm֊5|O)yj|Ӽ_xNHYo&Q!] Wrq[~Ꮚ^>_h4m3[;9tuAR nExž ZI? fmK{D|1e#l 7xgm桦|>]nm[:_E߼"D|X``<#>q.lOoc+Z!{XBDv!pP;U=#_=j^MLu/ygg7$5@|/}Y*6<s[S^ u/ɭC{<0U)'[kUYN6v_pͪ]bĚr^L"DL3;aTc$zK/ ~xmS|#4fU >i`3`3ڵ+ 3x_:绋ʒ}#LGNPO<]fσ4dnbrMZ񿌴?xz]W7_cVHV\5QXN0j >\еF?bo < }kywmt$W}‚ѦO$s_)ở\{+D{ ]ji,̯HDī8-$Axa6|;-clc9cNi iZE4K}*1 ń:tKѨ«k(F[%x¾SR_kZestOʶbyڜH&ė~+o]Ҟ@޳*ƩV 7| kJVSx_B:J̳# ^hնy"sţۭ.6kA#v&>CU_jzNAv1xb%Av9dPiKA&_.2+(\7 >%Sm-VkU^Gu\eP i̊3aXVM.m$e`AVk;JK XVѬ1FE@[q}Kij1:_HH' B˜(?GSp2*1*2G҅XFIKQT>ԋ89>О٢3rrG]_.hEj:̲Can:& ~4h@'ݴwwp̃ A žyJ) RP=qH'L2{N$bd/?63yh9@\ h$ E`"}(ޗ5W+˫o W;IɏQiDK3ː?z0xFuøuo[iTK0J nU<».LRvyyyX)k2]b; {hEȏ2 +cNcN=TM&;7ȑZ(_nT#gzH4\<4SCR ֘5Z;Y&bD܅$'/h:柯hmo<\;\: E0Lr{HPrE0$(/ȯ L1fB5[ {jJGK9Aj[ i=>!Y7&,%078< 0>!Aj_< 1tCܺm5^}Jv$w4Geen/~id]#3X (oßڽǯ^!u+*^u֗uxHWZ:Ms_~Z-JGmbTnwJ[֔LnEbA -s?f[$%g* ҵ`M0h{v4J|0sry"%q)dx?~,4OGi,O?DhodZXH`1qSmnWC_:g–j:skM丑mͬ%237*F Olm]W4+ NSkzd9,@C3^M{x^-gcLoFQWU*AhZ kVЭ|3! AjM|-xo>5t+%uw;)?>XUX:澅7ĭ=>voa5 t0~]XQn};gK^mT[.Eծ.i3Ckc4\2~S'֣[V>:[% M{M[O|=O]\ 6,"{ 3αs^o JYB p@־DZ^[MA*yREh:sVn;i Bۍ!qMz ;j|?%i^ Vu<_Irhc$P.njޣ')xWZ-#LM&I7n՞x,Y68c8_`SDftk 2l,`i-|!RiVE ;bE1N+lp<|2П[ng*<Ǔcx@8 | G4x~ڜ>}#m`Uj4+cgxcS[amKNIMX.ȶ[XFU-Uv)O,ZhUBA*I2LyP{KNSpiJzR0XZt&K|kj?u/5jAXMB+,bۻg+dM7 as}fK# l407R2ki\[Ζ64baPqSp8U ˛[96K;L{v '$ ϥ.Wܾeߊ3+|Mxp,˽nu[e-E秥Im7G%>ɪx}Mzn) EC1ݻ 8#X,b1,ITwgމY"[iƎI%NO>)EX+ύeuG?\_]Z'k.-jak5.`nhpzUiz<]뙢]kM7jS[Frȧ+ Ufb#2kX/G]n,tgt'e=OK/4{ 6UaŒ.#DUqUds|-ZuE\äh.ĥ?vn w5;z9|0[WI.H1叔 #خDp iO~6kv -kVKogOB4@*|FyM[ė6W f$E Wz iWgQנi^T^Dfk8d^)_K_O^SQ`nE#w'մٚTJ\oJs_>#ޝWH_]j/J2- \6[W Ư6MT{%m2c+`t杪/@]?Qb)c Qm>u'>ta$n'Oy!`0'=Mpcny"VCZV>EOpCW׭yieBm#L7K'tWRYHx!퐌9\ Ҋwc ⎅k77]OOmB Q$).тGRÀEs7Тxm[|IȲ[ >Ǩ<ӕ2d%c%bō#ſ>9d$ '꾙4_AL'5thxG{s,N&N'N_4K 6O7a &|1<+Kt#l̞JwE??|oWGuxo^"G_daA8Px]!2E-' ^ڴ>0,5oh' 2'PDeb2SX <;j7=S$<6[}JpssM/k?CӬff8A@$gj^m䱒:W[F0||3gSQ6[Yյ>+YVYyb,>xcJѴ{H,`tF.n$WU (IEGaգ-ZWPTy$i[N]bO@t`oBX^6_Qq!IWn#Xu ׺Ft{g¿`l]/W4 ;4$x^&O#\Y~o>,]V /l5X 9*pU0v9'4<Oľ1>ctVmpzceUHׯX_F~&xb9(qvu;`C,\ǐOSz]6C,5Mkz]3M{,AE'' f^}>DaeI)˪_/!"LcQ#.Gs^tJQӺ D'9P4Tӡ+- MppFƟ?~'x7Uş+u9d%&fO, \u#?$?M@ᨕXE_[[WV<3mo-.|]Ѽ/έg%ry,!i jcJN'k[vVaoԭJ3M*I=n(N*{Y|ȼ)mpF盏Fa_ǻۚ$o@I=x/|{1%MU>I;)dRN@u黎kk>5mKުKxYk] #r2:cK;M"fZOǸBv+/,nm Gs^q]?|74tgHP߆FF,$1$Mt_kj:mI5 _&I5 _&tmIj4Ij4\4Ij4Ij4\ѴW5 &@ &@p:lR`W5 &@ &@Ѡ5Ij4Ij4\4bI5 _&I5 _&=kXhXh.ќ⹟I5 _&I5 _&bI5 _&I5 _&bW3 &@ &@Ѡ1Ij4Ij4 \W3 &@ &@Ӻ.+XhXh.AkMcWMcW')@I5 _&I5 _&6$??5?$??5.J)kXhXh5+XhXh61Es?kMkMgMcWMcWtՅoB[McWkPu2a❼)1fB5[d-!'_ vq5(<*V@9n7~eۄǚ[=ER?k/Ʈ@k/ƏzoP/zo&޲jK&޲hER?k/Ʈ@k/ƏzoP/zo&޲jK&޲hER?k/Ʈ@k/ƏzoP/zo&޲jK&޲hER?k/Ʈ@k/ƏzoP/zo&޲jK?k/ƪZT-fȆ<ѿksE 4,2?e/?/@5GMe|7_xJ_G7z?e'#o1zo_WE{=&$[-F+Ff +GTuk/Əzo\ڋm)6r8Rj)5<.2EHGb/_5U߈}_fODzO 4jY 5M=Zk>mnvid ?Z76v"hGX}s/zo&޲k+P"l??Z{kZ=5pq qy@4k/Əzo_??e'#.AKÎQ?O@CTk/Əzomjh։ltkx2։s:m>67+/Əzo"Զ 69#r6p;A،>#_j2zo9G=(Ώ&޲h3չ*3}?z颎}??Jas?k/ƹƊ\ӧBU`@`\D3?iokU* lsiNH]|KÕVdS@k,GMGY 5ާr.ӭ <#!wb[1gQYծ.&Fxqš=7(#>hSZqK@ˏB~y5mjo*AmN>MݑU A$V~:#r#(8qLE(Š((((((((((((((%-|RKwBN<z'O1|0g{/eo_g# #(s>]Hi =o¬mw+;VK[ꎳy`a&.UM5?|ΟsuI%hc25v x7=дo^KR..]1A!I9RF28s[?׋x'e4oc# I) JWwʼ}MGou lm?DPGdnGcLmnmszխcY4 +11\aHU]};7=x:& O h7֗N6h|DYÆ@Bdn+Bx978SW|+{xx^IׅQ]2#& h|u/mgе?Z5υ|\SN̉̀!bs) !Sw [EgA}ĜV#_v QZjRi msd~ЋɹeDG`OWG#v\i զc|HX;|2wX_ӴjE&ݟ쁲O@'01]sX^xw^ [OX "1VQU/MkMbyNԯ5]J}Z{ewd(raHd?{ڇ5I4~ x;g9'fUQlViOg:kGM%Ʀ"uNgG0dW~:H? t W9)KTg K.K˟x5Fg z$&t>)|ΊXD^Gx>2m~ǡ[ODӮ.ID B53?*ܞǙ_T@G-9xTYԏj`3ĪP ﻕxzx)&5&P|(Խ_ׇ&u-C]oiIzJh>O5 Ky#u GS7l4\h"f61Ȓ;+-? <uAuUWĺ¤X"x^KhA[H[`X ,O.A8޽gDF}<N\W_5_뺊rKd46|trI}BFbY'}+>S~w3L:,q0u~80N ʏ'y7½ B[mSCI4i`)&nX[|\Nں Y$c7yqVĕETQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEej]RQ47:uݍ- VOY>>oƨ[? V-P. &]? 7L+t4vwŽrO<(o9MkQD0LחF?EU oƨ5oP|zgݷ|^ xfyJy؊ [Ȥ) (0Oo %c\`81{C>~P^loƩ U-Px2EM淨&o)TO[w6m2m;J`F;QEq'GkIm6NFKBIN@07e ?zE7+-p N9GP?*FCb䖽rNr(Dg$]IGcr1qnh|"@2yEar6Up3@ph _Ë'N*+C+)!w4j˶4Q@ .T"[~f) KOROfotocx/images/rotate-left.png0000664000175000017500000003375315247006660015244 0ustar micomicoPNG  IHDRkQXtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/tEXtSoftwarewww.inkscape.org< pHYs((fiiTXtXML:com.adobe.xmp 1 2 3 0 0 326 400 1 0 pR|eXIfMM*nv(1~OiHHwww.inkscape.orgCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/0232Y"0100fotocx-25.1: Rotate|fotocx-25.1: Markup Text|fotocx-25.1: Rescale: width:200 height:163|NX IDATxw|[h{#$@!6 ;Pf)pKmmQEo{Y.2Jٱ|e!;qĉ-OyIG_)R 1 ̨URT! w+v ĀNZm:ۀF`m}7MZlՎR(OG#@`䤡^`-+]|,FOCߓ#{= G3)i:ohA„5ј Qɣ6 T+ Mz״Ro7-f L0xksTue@6[S괛-(S 86Z'<|XDfM,cN#ILxkQU:Peؤܳ85ndSx \ d'G~abdO>x!+z20v+o f12@< w_fDrw;?괚-&XNT5<ؑJ fsK5ƈ-*# ,.K߰.MۋX2S\&}x^ LB^ѫOޅb6,6[$evm67: lQclLģP)Ae?^&$I R.S@DC u̖,&M rZ{tuwɐ=<) Yu癭e ʱr&!^b;ee T3@Z_ӹm }Psqj#Sq ʸl!ceBNTA^UN&apQ65fL)|l-S]ܪ1̖2R&Tv>"qZ3O\#k`w盭eq"{Wj"fK  b*8&2K۹,Ӄ$wTGcapT{f?-N|ӹ1昔\+: Htᩑl):flD3`f05!ãʂxZt/ 3[GRhFzu Ac}-7 #[5~^5[H8GU0l-G75ģ0]u35n?<,+Yf?7-\t-%SP |e,EpZvgnMA_dJp3Μ t͜`Zv2kqӴ b@^4H7/Ql-@- iAa1W"ը$_9 Sع[7UڦX"*3y]s+S16½&_ s$=6.~w_6,t:L0)PֹxDJR1_~ -# T~#9ha:^.aTSڟYuXIӹgf?Yŧu@ rM;Ik**)񘼅L{? Vce^O @b{ rA61vwKf\ݜ,sN#8d2R nLuЂh[Vr ~^nq:N(ծ 0"`EooX߷mWz|NJ6gVӿ7ӳ*o/6+$ #;[|n}WF;Z ?KWG[Ss(e= U]3~fizrsuYUͻrہk #,Q@B! EH2uSMj= bWNK(|r:A 2,HaCg8Ƿ4mIU!@n} O7H{;O =w+NZV.l+9#vBZw 7<}U+!sKzyP\qȻm0,i U}[_~' Muܮ*rw? vdMxc:WHt[%9kVQ+\3N}7&d Gbm_ZLt3򻟔1\زiHO՟o<``cvNW[_n:%˵<@Ν8r\s/xؗqƜ$;J:lE\l^2ԶqX?н耫{V:,1cHXd@Fr$o>Ơ1FV!ʩpgc4QO"@l:Xx=FLr9b}ơ0iHڦ[rwӊGYgܣߐNU9Ho]B?CuG| xY a2۔T,_#8> g"B doq.#08<0=WCO!DD!Q*6! ʥMYiսg7}#×mYه gى1R0vF @0"c@'Ytްn$ tYcD<{m2jr$g'/ Z#Ylnhv|N;J+DN@ ZO -̳UԶzوLxyGaA^}"iPj"t CIXnY=ȱ|[IV+QpDOVl~NX-QD$Wf3bȩ>[ine iF^h'8Ėmu wEVFN;D_2Q,2Dp*c}e<:̯_7Y -ew"}W0ҭqܤBVEeg>^o|+>*5d@fB̘uy9 5(^Ha+}GjZPS:-9b9sٳpmbs}ܫaHn$ 4:+-q$5$w=X?H8(.=gv1O.JҗUC͌Yqo:oj m?ܞ5ȱ P? a?t`KtN/Jor;\7(7.vIe1dÚnI*h!OY$:#rݿVߧQ/ >~?wJ}_,l&R~ݮőWU>gEֻg۳FGkV)$cȊ"T=6GwQ_MP<>)1};5CL X%kVAI(VaƱ1bѠ*PYDe6Wi^WH*I~M(R؉ԝGV#qG#)ԺqM@IWiw.ާ*+#mb??.4;YMIB 2cV,~`s еzFMD8DPRRWxgk#.P#Btt۳qt{kGWJ)--;qt%g?{`UMO҈DM|2Lع:Q20$+݁gM&rgwPTX<;Jg ~8B̀yoWHq_9I3}e*KXzG&9 }D rNn챴'>CT+/hfRU1^=#aԦ Ny2F/hzbp׶7;>J?s S$zؕ1Ymsg$YJ35C4:]B@ abXlJNvΌ Ua%;NxD޶jLh:mn?g2P:"ip߼S+A2PN)6Y,J\~MSkkc`c`[Id37DG h}[K5|I-BLv5m, %;SH}oۋ˘#Ps0{)O Ά/ 5¦#f|N{YJhE֬K! vHV!Ye]DXQ'nƈFp_֐X#Eq&h/!RனpwkBL$2RwûX:'2>U x!g]X{G$@pJXm\p`%=Y0!E"A!B(ʨƪb FU>Wbo294 xtnvH/`<,muk%]v^yslr)۳sof_u]Oc٣ݓ/lQ$bķe# FX$w G՚3FU+r] )9dIUx"%i[IS+ Isxh:?sMofUd8"Nyn.:>u-k>֬g!tS|WY żg9#x~ſ}$)!@D"qn #H@e;x*PW\<]@Q9Hnt&UdZc`i{U_UqɷA̲N:E;0F3v&1-FtMU bq]M$YE#>3OyS q^HjY\iV$^u7sxE:qa^ig_M7%Mɋِ8`V]Qf[00L}v?2Bc5H5#sqjO}iT\sHFIGv5z G w ja0M+mǧHΌQڑ>8m%G ^D#I410d+ # Dd3+A%}+:nҗ㿙s񬪌~)9hq2IEqndB=][j:[D~|Ш֧ s!$L ;cAS&# ,Q َ$Ic Hd;"(1uc UǬ#}EXJD~nBfI*߇Ns4}CѶc+/G8)6:n)fE^4_a `K\гF#HۯHˮF^y R[U`2Rg9]stf4}%ť)ɋBh[{[6.ٸi_c\/'r>J?%J=-?➥^`G[ij*Օ20 4TãpWgh>tj~TǞ,7 jCVݵvݪ@dggW9YV5[BcF,롶 {>%M<*Ůw t{{FVѓ_^;!aTdeWʲ1tÎqoS.>}}TR 2ھLz?ǏƵ1mY HSe̵Z85VDf)""g JzzM?}MĝW n]]{J?_Ad`e^;%ÞV c/d5$rӳQUו,`Td52^p7kcZ2.R]~sfEJՇtHtYN'bW;fb܂E9pϷegl6coͭަ%Wß [Lʝui]+ґ$,[X ;G24[[I˿r"[1X\k*P*_ö9}2H ;a0'Bw]q3=2"ys[!kqDoa?sn̋/:έ с bͭ9^:Uuη.AcI6TxID|gjmmI6wl٘?댳텥UjV *8?غ~uskþɩ>ٗt1_[Qj:j*" } G:k{ \sZ~ٌ*8|.n RlsfFjk*Q6 rax";lBR8}uP1{GXC~R%w-pO|}7=}Fq%MCM}-ܲܚk52{Ɓ ;˘2y( 6cqMZ4I|(8 f_sԧ%5t5)dPw? s!ś G5+~s/8iIu a:rP'Bl6U%hV'VsTXKx_g\"Rޒ_}ĥ{rRā޹76Ouolt^9L5z-Q+C$˙/ȱU}x?^*=`BuHxOy8{`8!I-c/2H2l{%HEF*v,aC^~ͣiˑST=獵XđFbXW-atc?\3~O  :w~nK"`ǵ9 y X$ONsPf+sQBӔQ"l Wq5UH$r^ 5b|` O+-,qLn瀛hJ?$o[/ </8s-=!77Qm5i 6 RCuFaXw44 #޺a?GO(JWx\d2| ?0:s38lcZp]d!g%[$nG w+DcѾU>?ŞDAnnށ/8ee-RNVaq 8Zhp-{gwt/oxt u.6"]1M)& kOR*ޘ΋`BE_~~ 3[\(W]ްqk׭/4P^VZմ,kj@Ѽ} kضm$w_p?KS,oeQ*Nx4Qe>sW'9+ʪ@JB}}=]S,y;rlqPkww`]GGX,SXjU1\;U)YTf)Ayy X4HO3.D4YQE7C5N >N] '8ĒT!۝F }P^U_xp*:쉷?H}7>H/%UR@IVu0h:Hu?CpIv]4CK_ rxJ] y>4v`IO:c'waz)\~fh:K(ty }%9Uk9(Q\JyNU2Ѕ|qԹxotoߧfZU܇dz@ $=+Ը3NfTR] O0 L$2jܤմ0\Ps*B;\}c6#7/Aйga+H.d@A+">عK޸GZ{II?k +YYpK_QHu܍$Hw_b#3Ni-F_jakguIjYWcXzm$3@4uJ \T_Ԥ_; \IjRn-5)Ίm9Żw0l!yQmDteLyt7 [y0z2 Ν$iī zz[pX5SNT;uU<ڹ7P­fun%UmZ[-,5[Hr1WMZ[-gV/>$^7[GT;@T;V_9GpZHK-\)b-Leee0A@ | 2>ey犑e&@`HHu"E&ȱ ӳyGKcQ35V&Ώ}͘X}b_)׫%B95bNr@ZDδw2V&$VY'fkb$>9~"LdW;Zփ7I \UbK s',&.p׹q?gBɤ -FW3tX9{d"У|Nn}Hl1fR@c=B|*|2[_ ~ -&LdOcDks`?0vyy_ aW"U!o_x{i0[ O.՞RM뙚zaON~l1f2 {Q(zupzL`sɽ)SՎ\LO>_gra IDATx]klUUޥZj[B폶?F-+h@c"ZA1ʐhP!P$K"DDCFJHkq˅sV;[=gys9w9笵[^qN-(]fnөyPQ/x/\7RTJ+_"Lte4Bwb^o?Hk?(0p .r2~uee.]b~UEAsn@3E^"G"3رѐr @9sܰ OηW HU^^>=,C5M&Hc266E:%9pL6^WaUTVPW$pN !ϫ厌fa|iD%ȯ ؗrk$kmwCkYH\cҴxv/웯8G7=tzn|JB_iC[{}gz@>y%A{ 8zӡjSOvO2:x::lhhhXĶo{/h"-Ë{JgR)R"""۫p M7iɮ:$I Ef:IjZʬ{cHmAfuǎ^ % ` ruXyl\▖Ύ?\ o]ш09? ND$&'~'OٸqG;U!J&a#8Jgjkקp Q-DB)i0gs`Q("x6+ȈEZZ5W8!5(EX"B[bϞ=w @P1￿5L+wct|Y[_޼ĩQ;[֋t^dιmy@{dIx}ݷulwX-\XoCM]y/T<ك8\=9rݠyD,rx=7 9Ç?aP&{"I[|y+;ٗyS#jQYM6#<JE }߱{Uw.qa}=jzݫۿ߻l@4wq3Z 5vjG=etٸr04p$@6LXq^Q` !LUJ^=2 LU[Kc?޳7#P<f͒ǠycXzϠ:r059%m_E̗=FrI2#U\ʎ@DZ" ukkkz" dUXꮀ@B@x:J{O~k~d+jP8'`{}mQL}׽r(\?qev,eKC&ϿL'c;3(Qʷ*;~mlN`@߈6Vfyr\ ;Iih@ 4z?4q5!S"r"OGþhogvƓ d1RŚg+we"2 yl@#%C p}@(3DϛMHx8-˚F 6 $$ɲ'v;" 8PtYMtEDvqiT]82GQ"TY#h0 D0"s3h & 8w9lݻojPA(;kkTg F!pIeh)tvNgXۯilTuuF l߆>,F@χ#lU%XQXdLbۻZg]-hlf9Mn[g}^8\BhHsD aPNs BPbO5S1|0͟(Gm+gE~w`ڔȎeUUcVϟ- eԽNgf<.6+ õhO] ΙQP8X'BIU4D*ٯfEs|0d*مY]=ed b$8_55"T4d@b @M4-2)(u2ދA)+$ fz~JF %P^%@Y졨iAya9ʦI x>/:LV) 9_$x9)8 p\n<,v 256 256 0 waM>IENDB`fotocx/images/amplify-contrast.png0000664000175000017500000005616215247006660016311 0ustar micomicoPNG  IHDRqtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 286 291 1 0 ,eXIfMM*V^(1fixHHgnome-screenshot0232q0100fotoxx-23.70: Crop: width:292 height:329|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-24.40: paste area|fotocx-24.40: Crop: width:291 height:286|fotocx-24.60: Paint Image|fotocx-24.60: Markup Text|fotocx-24.60: Sharpen: median diff 2 15 15|fotocx-24.60: Paint Image|fotocx-24.60: Copy in Image|fotocx-24.60: Markup Text|fotocx-26.6: Rescale: width:261 height:257|{ : IDATxtUY5\7(܂;.EPk qIB ݹskp{Í fù9u^{NJJBYDUQUġST3a|)mRx˗ zz Ѡ(浕4CCCe2qٸ(뵊7QQQe){Y @( ֊{'!!E eAx5bbb>Z@ccciL8KYoXktm%)H2,B0R2!+:(L@z\\\-:(*߈2[+\g~MrrrE$/XS(,bҳiS|E]w/_2sًʣ{[I!O#' mgj ե߮LUd&XYڪ9  c\uiՕK7U/咷LvJ( ]g46!eM*x8 ^s ]|XX$5/88 P=TmB$:Supqlڸ ^y( D'G?nE:<˜*g*j؜Q~R 4AC*o/m)uټ5DO^P>UEGǔ:=j:>'<cy0;;V'z.I@(Za" |]A/řJʙȤ0o޼S()sQuvuuŴiЩS'aǎڵ+N< ??TT˝=V 3Zk~v:zdDVOlU?Mbci]_rqzcoZhoĿy]Wkm\Zr@jԅޤG&>{wcAR8j`*>rUfɒi-zbXtj@1TVK1鰕sy!pO,5<jϪ] C[k{̹3Tluoߜu+IgP&~^S5q,Qn~lMU/D:KQj Mt@6}mUpph}Ǫ驽x*gGE2y?Vc^on\X"}=ӗPS:T5s"YDbB%r{v84P@kB$+ ص= Vf` hl~V,u(X7z.LVwFݺu1tPP (X_:+)~ڿO{TO[W*%kUx~*'6d'{Xo9jIUW=}$ $cS~XLp5g,B(pQ9P:֖97Vu8PłaCkf(gȀ*x{̝HjJr?H0((8r_ۙ}-}W &B!#gvnߗ7`mXx ;#Oo*|iĐp9Y {!XCh33oHC g(焄Ĝ-mת.D^Y""ׅٮU/pyCC_̚XX/A!6$Ashײ u ;CmizJ&4R P ybIލ1y`3Yiܮs8$C ͨ[^޽{Z77LimeΘ2e tڵK ;__Rչ,MKw!~<k6{(@aR/;^ u7jo.X2yh Ha,~Nh  #.Ýq?Zcf(W?74O9ߑ9<2`\pGτ[D4ܦL LTgxx5;<$ΜjORUL,΂hKly7>}ЁlM^(YE+r`fffϟ?Çz~NQN7%sQAlj' )p.:qhٲȗ9su4bi̇kz E9Vӧ,@Xt KGaR`Rkdo,)V:~ V+/]4@CL+4fc+T6LE[ Py> "\Iw,Sڬ={cݺuZuPX:$[.\J4s{pMY. ui/M1iNZ SGH )& ( O„›}eX&Rz0*g'v2YO 1fzYy;\Wv\E U44~uRRRfvzUC'K3$ICGϩؙd>aLI ' }QK;tPs/i#/.xîm˞O`S?X۵h<͚@{LÄx?/)8cs#xJhSxz/TBPS5{ROZ=(2XNgHXÇdΖ(i)S=R(/R8CONopޜrE4*9TC]E v3) R 3";ۊ UH1𐥴VR~WQsI\.;x|co˳Y~x3Ia\Q$a2䰟biv~Y| pS?MھWu(yssWx|&9iOmÒ}D2hZ}<;ulm۫0 R$%%?R<\S>>[ l}0)eC3.yG!xZ,PYeۇ05u4gXE[=S v+NXX@TZ~< _V2Vt˅tܣi4yT<P+S<&)I6C<| Kg)xftiޜ5W&]UzJ |}]#Um|4Op^ahuH XV,YOĐbܨ*6a=q0kg>5l M#^zv"aG UR)T +ӏL6MW)޹/b,\+f8-/ &+ ψo)d t.[HBNe;ᡬX{T'4ai'ee4è„u.#ˬNiWd˅5n:g9W5} J(iqEءeTcWD˅|B J}M;_kk;!QWXKzP}H~Ph**R6Y*<?yp^'e`2i+ky]+:W R()8zCaB{]6CѐC)rV嬤Q3A N\^! *k{|)(( J{9gɋ/O? {P29cӔ}J]$)09`ޗJGB ~8n!.6wѡC{ԬQ'OGVfW YZ o O=oR`hݺpF:;9 yz}G[ :# 0eODbB$i9H |R`)!Cc߾pwք6"׾>"rY<}FN7+JsI3f3WuviӦԩHIN$/ FbG#hܸV^wnK _\,?))(DGEfͰqX[I!Ab g!^&L@Νt>>;)k"9)vj~C.? PjY _)((͛7O>isg!1P"IA!VX .L^INW-ͥA?MѤ >>ؾ}ݻf/dçƪ_<)(i^4S=z4:vݻv2tIjWC r˗0<4-]S'O"BjXsWG  }]-7СC~:xzawGilӯPC D=1`Lnݺm68q"0Cb9pc3_IJMVP@(m)ϕ (IV*R(X.ńU>Q䠔{Wl3w%+5)̞=֍ ޽zaƌԩX*?f礝-ie8iZJKBb0PIAa>3 \QТE +LML9|4$*KU ")1F֮]#Vb;%;˗~%W$QeHJ:AdfΝVOmO8(Lm۶b"x PK}[+ $)yZDLr_~!-Z4Gw1}:Ν%KcuO+ 8d=&IR( /Qϑ#C3`b8Cn ~ & ks…D&qM& ]ߟ$)l"$$>򆻛<4LM"1#^ԩSGxlo׷o_q 45&bb3g+-r% OS-[O'%) 0&Ԕd ÐؘhTaن?1ctϢ%իGTw1}CVV-4iXI=ĵիխ1TŖ mhrev[|Οk;z"t8>3&kÆ ń16ViSKukb' طw/q.%rꚚ<jog+I3y{ʡ>_#oi(?uI L "4Ȱ] p;rXg XC|,!+cOC_5R1p@p /^ ˇII8AlE_gc@3$x@_3Fǎ]VĢE 1ȒI`رp0)luw1ϼIc2G211%L f"jJ_"ԩ#zM; I1<3m?p{;*S8;;S{ ~;9:nϞ . & IDAT޸n_%)HRSߗ;=-d xyz o߾(Yi< qF^-l͍ƓsyٲDH0s 1opƌ-8X?oҤ 񞫝8v!x1ŋ 'r岰f߻'X|{[v~[>ydUOck^k}CEY-l)ݡWpiyI $)T x.al#Z]!f~ZIl086fev[iUab&kΜ?]8wĎ\Gp OӮ];a鰕&qv /\ӧEpɓ'D gΜ)IKVL_>fG()؏3]NNdX=S؊i=|=8sb M~& glx={`*$t|V hex&W'YZڐ-/I e$YiW3SSqp)Tx:M# Sb@$h$  @|J$2-SDC@%ǀ%|}<57<(Vm 1PE0F\<)ߔLO엊Ā$g 6Af$)HR$  @Hmuh'I $)H h`@ *Rɴ+D$I  Ϳm^$IA$ K Y1 06^dvB|]pbG՛ AVV<wk;!)ӭ=D@x$Ta|kk1 ꇻWᾥ xde\7\z IebI!#- [vE67;W1y@@hN]ћܱ7m! uwdsl?7rM7m0kK,q?e&bɈVhٽ/+2Rpda_4֑I%.`Q  @qvNbN{[+޼V;X3&c-2+tĘ""2PȠ5{loCFuqoK~?)k6BpfvO僔[t7Le[zFZ ٙ)8b Zl6Slq|1k/ZzfdI qϰkٰR}OM48w^ +OodW)2L} n|'6OXd0jX^>1#2`qAds&b>w؃Qh#$ ]?}X~ɸi%$RsKj%kg՞6h#+-MF=Ko/mT8g]+]2w_^TYڣ !g#ZmdgMS&:M;cޔ_6YTda?GqpQ&zѻsk8&zk zvxAD8| ?ECyՇb1XuhGw[>c #(Xl[9ve;XpLfHyVYz|lmqa0x-vר N-ǮƏ?Щ}/60SCL۶!D  Vjh٥?6څUfsF_CLJ #{Z:3r4oމ_wA{z~^x\"9+5)& G5q\"G9l1 4mhH7]zAmf8 2W.&D[[~@V8tj?4wEqQѴPǥ 6 H ǾPfBzR4-GCyh:kF lĆxb^b3rPdAwhel#9!N$ċz [ѶCO}1oDQ2ņ& kf8 m*p"e#ۡ%0}:agr6~-9aّ׳%xRL}P`C$p-z^>8mt^ ߄fjY&?C}To.3Dž6n.l#릋Twiv` O*h7unUV٢sk| IEkW1ind D&uۊH!1 g @QS∲::up%\nd;I֝?P-3+AnN}?nԏ~8{:o&Ij>vc׺d´[qߊvA~(A`w Z5^Uڧ# mvEZ?f@UlS0BVXt g9i6qPgV6zHF&®О| IG^@ _q\zRQMعi= @|&coF6}4<fbu8rr;m֎%*hgatZ=>|`A'V4)wtiQ?#5! Xr8x9Ou:8I hF.A Yqؿa6j֪Ö2#_& SWwHñ_`̨ݽ3ڴjDP4'hMpы:_8bz昸f1x}jFu~D0Wc"O h2hndbᏬ޽Q~Kغiyr7no'i#fuIu tqx|{7sǘp #ZմxHùsr4nh8ɤCJZЀƜgBl:Y8F_ft+<è)YĤF2S0k"Mv~ʌҲ ~9} o*a?Sο%(ɑ0VKEYBNm 5mCv*\}Kzh3p*"ȭ{*/Ez?=)de$bJ&*K0} 0eli gOq4m FNjx6wлMCԨ[ȃPI!с8#j6lmO?}C]?0Da^쀃W‘6)0 B]G#-)ƵGA#6?k|Uq+lM$G3@eggIvɟJ9QE7[e qJ K/KGZ:.3wi6TV̝: ФE+m[hF`-xCN xbʨhҼ%z[}~8tIWL3&Fc);kt\l)ȿcyC(>7C1|(AY))evohf!Soae|A#hL7(Ceǣeҽ'&N;i0sžtCЀ,FcYxU,DԵ![ GMD?yXه)v#8>I\֌,aԆ sёj{,ʤ%[iz;]z ^''r((vg9'Ɩ6Oiܻ{HTd##%.m 'k3C||pbN},D􃹩hG Xv6{;",w^MKxOm}zzzwF(L`R#|6: i**WC1&%,̨Oܾ^䥦>vxLS;/&3-6hӎv+6^HP?ST>{Fp|4r4r:o(& D#0j8q;$G1lH3tJ9C~cĵPX?2SwO$煣g!7Enq xƉd!c(O>bB~%bIAIXFґe,MKu?㺮!|wMom!I=sh>R<З~GԨYfj1KVBQe I!,@4*4h4Ӭ3iW`$)HR$  @HM_QIW$I  i)|=J$I  >2ݯ IAĀ$)H@hBjGWT_IR IAb@$ 4QQGX $)|Ѥ|A 7}*I[ L$/iqҰ<}0̌& a}}<17-0LU$I _)d!x?1BegMkKN Һpuv!9:9>|Hp5q­[Dig'8rg7oބllt &02GSwaHz9::%,,, b7ohhsssqڵ"MK+Kܦ%ڸ,FFF0~`,~ߺuS( C3ܻ\/^n әxcj}QnG̩=rs---,-Յ̌Nr]x^PTr_o~7w/r_zU-Of.@zY1'MMMaDKѹff (1dɃ+ں1wM;aژQ.V/tvsŜ9szZ?#칦+M-\5Mi0OԭSCmt ;½hC{m-̂_اe%~h{0s7HM"DZ|۬dxB#q%^lʻ-Xb Ƽ)IHKME0R(:/BZ,U>?&R>;yiREŕE(ZYBJNz~s=rJR-MeZBs:G '͂^#'{l=pWe}]h Dooo""<džzchk,nX#JmQE8EJ0iHL+%)~;MNNjRbEamXZ-tz\Q,)ТVSi='6]8bl Fui&a٨W&Ь`ΙhҰmn-6m D,7wr4A?Vp ޯ|KMpzch۰:v>F2m_fBWT[/5j~ظnAxhRS 묃~S5(wÔKǝbN><9ߴ;K{D b">%Ǭt"LEpPqSPt~5[2-{od#Ho#} }㚂54C MDma}6r~|ԯ]I!;-7ϬEq}0Mq:$fi|{1aZ76uhC{ 5 9ch6h}8= sz%m@ߢ0-_J{kuŪoh삤`s87=&6H2aym- \ B 3"u$X1,iE[n8^ڍڴ//#yJۚVec=##S<~(2=A1 D .ӑM}:iF–V>ybn?<P( O-c=)+N;[LLġ-3PQ\{`!8X 7c1g2pKDy%h)sLgt=GmzLcmûV#ڡϬ}?ώñQKϽ{ yLݺpۜ+_'q6!d"bh;bBh7-gѳUjb+Hy߆݆k40wm\&T+olL#up7hI!(VOKy bW. 1>׿t?qO b*?Asv ϣհj$ g߽v^.y ѥ1O_F.b팙cvhߦ%6ْ!w]Sw F!"msl<7܃ukbM;QP3 &߉<&' FƝ,'vmJ#):v(j ̻`,=?6OPf&Us>`DӃ1ol/m;4’[txӘl\owy |=܃{ [d,}c@SvVp# сRq1%w*l_B~F /d)f w^]l?s IZLOI \aa|@a]l\Bzb.현}_Nö;cvX9 5Nk2ݙf lIEm l5gbgݨOT_ vx*[db֤kI!S2ausԨ="B42l<>`wj?cLXE<> X?'a$v`_!mF~?`_LҖ{-V k5On]1iv\;'}{b&ކŶqK.<@VylmEXmVZ bƍ3wku()juyjo FtB!Jq%><# z@i0}Hg[a)='a禕ݱ9j6@|CZJ$FtOq7\xvi{j}bĂe݌&Z `l~N;Q:)LDwwnz: d>о,)K')ɕ箉Y&Z8|fYCv>r4$ sOQDGk"k|73b>6$=lp:lp? 1OyO12p@UnYW+ +*WNG)7yqy:׸^y%wMe}΋߬LqY. ޼JAh%/qp,Bi&@in .k4Z(eɫR7ey?\|-.6VE]+p`24ѩь{PhV#0\7Tkm]򮇅kho(lpZJVN4,?Vn ;t˓bI/.:Rtnz!v鍎-i|ſ(v!ߜJ QNK#4 2y έͻÆ"$cQd JYHbHx2ޛIKKR{#<);L8G;&kl(v|v@ #}\V> uo%,Bɓ=?r&2\<#e/Xh/Y!#2({>D:ی=wбf_yEah ;^#3ܸ|O079!_ A"8֕`xxP\f;_)V8ydXۉCٙAMK{Ew&/K{y>23=ɿ d{Em񵂇$-R$6&+w*Ž;'6+_yݼ3i#p$I Z ,ZmaoDlIM92<6{ Q1VT}J.ë!ZoI SaebT;)߹YyWdJmgom%)HR m))ErdfsG<We˰f:;{ ^/߱fFܳ{?5!za8vU))φ  Vs\Dݾ6`Tظi .6DhTƳ}f6c9{m$)|5奐 e [>nkcխ4ƈ `4~^o F=}o]stY!--H!RM+ ;EMм]G 5ǏEmФUl=xIf~s*\Z?`HKϭOhH JRβI8 ᾖ=~ g " 0HD mA 1r~cfF(];6t0h2Xxg*iIAQ#pEW!l;g DHp ͐<}k8q i\G{ѢAmy rKRÄR#qFzیF]0BljY _JZ⎅-R[P~ sx {ѪqCY/B]z- FhHOGۦ/X T˟-d$&ċ磂aϦedANÆhFL'tLi>s{tĆ[0f@\f-0cx|MsGLMAhݮ>hKo,5͛6A:ԣ?]x}G6N]vɵ(]A Ѩ㵁A^VU)gcw dgh{v7׭=,Hc":~ sőiO!ёṳZ z.;#&zQհzaĤi!"#\A.n"9z .~:U}IeOhۨj6j'#"6@u0nĐmti57ź_3Xb) Aa0Q3Qܽs&BF-Zv&'~ɖ$tI6%&d!NCmrq>+HChװ:VnTD):a؜-xIs; Rgm}sª9 Gܽ36v=-䗅$~>pwwW?8VMc Dj)pw`5{ĥCy凝3{aJHٱغd"Uq4=KS4&6%a[! d-O Ʃգ0qn5X(`* ODv-ѠQ4): ѹ<ij=j◻vyG%_ ./ΖBfLD(^qCШQ#4nBÄ󐉳pҞ&I}fU2lB1}FG^FiY\GD6MHk ѡ0zڷMYj -[Ŝ[DV ~ð~Ьe+ڵEǮ9`N4S [o!G/R"B* rN 7prr3칟?b'!x !a߿K.QpО!&2>cR jڼ;8o?!;|I=|O-]Lr묔MI[=/%M&6'9|(xV@O~ q1BXâY1/4bcH+)ЊKwEթt9.vZ-} Ҋ MdW|/N#u7Z㙳6p W{]Qu*I̝S$~ IA@h˧Q^bU$e]䙤xSh!"٨nh=C:/b#$/.?Ozy<qm IA+0S^pXh45ehO&v#02%3WhXт$O(rɿ5^=(iVkǴf|Gl_JJ]{Ϟ}^̜b#ϕכ5V]*ϒ$) `ל4| {p:iTXtXML:com.adobe.xmp 1 2 3 0 0 283 228 1 0 VweXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:232 height:285|fotoxx-23.70: Sharpen: median diff 2 15 15|fotoxx-23.70: Crop: width:231 height:284|fotoxx-23.70: Crop: width:228 height:283|fotocx-26.6: Rescale: width:205 height:254|_W_ IDATx}wTɶ}7̛AD2*QĬs9gEEA`")Qd$J9`soWAP@q9NwWW_]k_#//zQUUbv\v]î:ڔL>벪*I9HINAnA!x,寪DqarP+EEE=*NG 1c 5ʔ)#Sڎ][ZZI S>׃cmAËp޹3?SxU%xxNdJ}F_33i<ϒ_fV_lfzN߃Wzll`s'e{p ?.@vSJ Q|.\Ϡpм4spҳ~qzT'cYCcK)/U^s7b3 էv)hxUHxWb>ԕF@ZJ *1Q@'7Acw{VQO1TT-6 *e{=*KOh#0|Oչpq y.E}+S|VNWu7t,|g֢gtuakfffw8VvU~&+)VMIHIxYX|, ~"2IiXe Q1e7MeQ*ή"1r| NDyH+ 3zj4Uܥꄎ1rq?G@o1DrwcH9);|y3+ӕu|2Νq=!fݺu{nsضmBCC;gh*+ps( (Xl:O#HĄ8<~Q6,/B3vn|,Xkod"y5ՕHu4<%X b{ѣl/b2,Yf´3v wf% 4 Xz5EN6C[[@6`٢0AbźܢT -] Xb-Z0 #U zݛVqrX6OX*:G~kSPP2P?+7F@|rZ vvv;v`̙]֕ZwVG﷉YV>SL2cƌAPPth_<} s%*zNZ#u>ë(ECZR8qJcFD?B* #LQ($% &Fӽ 8dFJe`М I:*'̡qAOWzBRDME%;i`p yե0SGBZC]$ ;B : Q>W ҐcIB:W]M Ær/C]-WW !*&c(2SsSWO; C3h.^:::v f-{JsGWmdĉpsYԝ[g,PRm_: wl<ɱJ`9ܴ[@=nB:[F45UcXBIc460C!1qe(YKm`͸i;r6eQ8vTaZJX'y8eaQa,1ք XМ'0BEk^Y%&c~C!> hyUuSb; Go",ۗφp94UfctM cW]p;a>Ҳ*;g`/ tke\a#z~guڴi.!::KϮhҜ@[*4"ZrA*kAJ<) H#E~ +%jce{s0ԕb.Y9eoFj%n1c p/鸴X'U ]֩(% G@RZk܄녝gAh `n&(,~et -3&. ե/lHa0<WZ^Oz *Nb|{:42헼\hBVM/pҰ~zd9аLWA/4X;F,7]DtiזWQ۠*-5eO[@x܎. {O65挱1LYoDp;,IE[PR4:psz7_ ֜E\='<F5y;6Pǐ# XqY{]ʢ]Tro 4fv1b4Y0 JJPUS*TTT()B2yu=KOO{˗/?pUhg022ɓCI̥Czj{# lBKmșjܸqK,8w\u Xo# 9o߾NNN`޽;w9WWUǑ% J 1e$O* p~BH U]/ŬIde8֝JL=De 0JX}(<&BY!3pL܄9hVO#Ո4o _CQC# c~9&O82%NT2cȣ`Gːp< '(  kƦZ8YKY 0L5[7`09GUE>Nm EF( rjX̛ 5=nwm\/7{ 9WPާ~vAM}/7++h9JlY 'C`QIHB&j3y+-") qz*zvI<'Ec,KU%;Y@f~ *3pV!&-ɭ8Wւٲ ŏ<@_'fAXN=/b[;z9̚#_z,YmѶ_WkJڍWک 9r-%(<\IZ5PƕU¬ڷcT`Yd# 5e\xH ǡmVMIx8Dl.B1KM3LyZ lab2>y"[ɃW%aW/m{RO+6 88Z|3װ3+d1WTB3|2``J1魬\v)/uɺ~ٟV?h@:l`nҢ"& veEDV7_Õ˗p6G4Ԕ",67q3:S;{G<߮uU aeX_(4(r|v+Tdhj|ʹg U¯M}K1 fAӆM|ܴ> ] 3,Shp ÛM} `Dg:p,tGᴃ/7?̇c Um=Τo;(H}K!/9z&fXe+/_ !h_}W-M64O e6qZ jazT?=X1svePOXDbt9dȂ9c2-ۀ{H2B|ݰyƛY!ͷ\[]Rb$ihmKo;a 5_??)ك+!66Ӧ֫4z'ˌ7C7_៯+a{e`67_-1Gy;F@it_kg"R#Zׂ}:b_? (:׊d%b"7E ن%(cxQXxt{GVbF"IF=)Zda#TԯOQ>3\I!k~.o5Dظgz"I CHM-͵pzT;S\JLM%ŅĸXWoZPC3EƎ&R_SM3͋1RQ.FFaIk<ڈ`L,A{sNJsM7Ҏ|}I._4_[Jӛ̌4<褐Y!$f{TE;ךnR4k>=[c̷ڂسaFja S&ƣWB<,8n):Ln)i%H(BEV֘i;C CοbߟGsq]pQFlQ-Mp @ \mM~1XZLm9Xfv^(V/_Br[͝gojY,ච355e`}l z`Etބ3! w3^}#h^$&'>6 q4W鈧hG)THHՁAP_{ o=>xfLGScV`&|c{ (ZQWKl ;`a_|(hBB떩4¹3AK m%>G A#R>H%,VBA#4!hz)0ArR^ |}g=QkM{շkJ 7ףj&wX5e6=O J#ᙒݩ5^1+O]@Q]ݓ6Tı3~A{ס%7;Rfw [轫QQK%F]П1=Uw%3^F0߶Hp8CE_չ-6z^ҽ~I>==qy$uR]2J,+Eyy9h^67q3U>)T5Ĕ=}cj(-+->y<4%ql6Ef#;U Ȧ:cj۬S 2+шJkQ0NmxG l塸shDpq%mx&&,aVe*˩}h\JQI?k;Ɏ^\u5 #[ψs %%q `4H|:2jq.(I $ #+ 09qנ+?{\}P ^WRb.ClXsى@ބt;äĹ>O`^ݏ0q2p| lM]%YBZU5WZia(b ЖEi- ,d.xogcʪ" LدXp hyz&(AFlZj Qi6׮-+0p,7BcK\o xӪ -fa9\BH_jJn\$1` XS0BžXx*>1M,%K$T=s1*}Lu #uaԺ̵alV&^Fk GY];u#aZcp&ַ]VE4nGASxɒF^ 'nR3[an< EӫW.~pw2ؾCp>9h+[Gw]uK9񚭇JSl*rAh6̆|ϠEn٘m6V@R黰.G # ִΕ<*꣰5^a井߇(=&-ٍG`(Qv6K\_ sD , 4<  S~~u+hDGqRÇM'dv %1)$,&ov4``% hV3hB.X&o됚;o4QkE3, Mïaa2+IJdI 1;ۗM%-*9 GA8Zee K Aj@h1)BҼm9OڸidJ8abdi;V X "P߅{ȹgJmk'`bTru i;|RN03 ƩAC&a簜bu C۾Jk@sd(hBL]1%fCTi<˪QG4VJpTS0+:<rr-6 (@ɼegw-6HvG:g{UFOAlM Ljr_]3]ʉEhyiG  ѩ%!u6arn)UP7 ga:֞bCSVnA:k,CXb2/>Ұ)qdv<#RvQѲ&=;@&:+[^9|nQl#β2 =GtiDHrc#|9 lk7Ԕʶ,W"($I6Rd-5HL\ ?Ⲿ{֬Xn(m N/W+S`|31JCtB2 4#-1fJ+ka xۭfc@X<*aϯ W,`hLD;+fa~R^f݁ \BHD>B@^Eu8FAp{6KP+)'+a'p)X̵{l;+>ནRa2TonS'>Or y60`69R"d#Hxq(ɉ(L s uJPd2 G}nSc #÷}Gr^h 9wʥӽce gl&KǻYj9U rH]"ߚ G4-K)-)0?6e`E8r&s9|i(h ӵeʥ"MW7ЃAӃpwߍ_FhUzBR`_ӈ(oc)FhizBR`&~4,Ŷ /6?z䣆և}MU@)\nFqߝ{<unxKy蝷m KցA!?if=-P {hwsx 7Ֆ^|4SS#nu@V'_Dp8~d)~c ν'\nzWܴ8޶F`\z }I]kx]0rgxղ$P xZnAQvWV7;{?AG޼F֋i@HS'1ibua E|}5S_tgX:]~FL4 Tu2)3+DelVcݡHkg~j,[&p{}A@xϾ'h-۲p SS_wA+-`źͰstݍ09:fEkeiV$V-A6m,LeAd#27 尓\rr _(mI\^ }QʫEId"蘪7 G%@]1o^zp20GϜ%S8Ewgsl4Xj1aOQc eq-ٰl>/=~RFc2XޏL3bC t*(7/ ڡ04#'a18D k]A38eEcBT8x`ՆQӁgj+jVcX0++yϦks|f*Xsц譂v#(Ɉjz3҈qϋD} VRJdj!O+J/QuU6QA|zT_ ,Zmhm%'.e#/S0Hce͕PYc0b +M=.` 6NYEBw")Y@vEiu- #gDshL~o; TK`Z-+rͬ@JDTS=yTwOa!`~ƒ8Q~Ks Y i_wsHL/}:ǞcN4;P85yqНnwIc|S=K'xf&'G߇t,>p97M0fe2u,;)ZZ-u59il8oGpsZ^ձYU P =w)o0I<;lw}r# I>?RG7L@d$f΁uKD6.'fi'hV3)SmEA҃Ů,|n@}i:|JZ9IÛ \`spq?Fs 2Ĵ$oj-|Lw f8L?8d eNFw`yMovR4~}v31ye  &×r sw^Û7e![?0*:xF6dն?BySQ8yCe~:SK},G(odIKMO[0:s7"eq6 \,/5G.9ހ|i)-J"vZ>^&+.*g`0Mⓓ;[LjDuvEk>4Cd# 7*5?kLC)u$=g_H %5An~. s1RV 6%;`1e󇁆V3y(i9% DY;"v왤3ǫa3#Ǖï'vSP ֕sN^8.ڡ8FpM|=yB 05l43gCCEF7b,uttZZDdי ݗN|qzzymegmODKeg'WoAI] zZm8 vd9Dq.8P9,hsjɨvаm<d?rm}&@. Kl.*= $"zq+^ӛhLS7` uߗLyhẁn'P85Wbtf =CKӜ-!:Am\rcm1Zax+v-Ј!fr#f`͋2D@A[߱=/Id̚se\p6m';׀ E4'h |p30kGe+Be($Rb|h] sDNŔ+(暕}xpc4)`cm#"6KC}M"-A_5"'ͫ2l4܈aWmTZ=nloOT[;;AN\p׳2{ݟ W>Kqn$ȎǭHdD!q9/M·FPx$QɈ )sJ/iIa.X1RrA"nXGM,!P6=LV$rsbqnPTWwZ (x> T3s&R5DJN}D}eE.+/mqGE\jR28VШx:$U#rlxb,2YX6x p8|2)\JkԳ:9?"K,~gu^n͟^ǫX/7#Z"V;' .EXb*` l)e _haCˆXnfO=<-U%CVS$Z# 6H(νo? .Ԗ>`o,y%Qvf}U!__0fQfӤwD4DNsg 5 K1vbw#Tp~p8gn49L8&M{r |4>de4,bじNFgpw)R+~iallPi n\gOx\:w "叚>}@ZD˰_-R?rUqUǣiB]*7kT⒫ਞ:ֿ~/+)Bpv~z#hܢuES2RO?wGo3q;&峗9 qɴnDqEv5"3Wx)߻A(>p:ɹe7,rGtz=▗?CL)h x׮իm{0YE{9kkk>Df~o ą T N-~')R]&o6\%sS=Kɠd'MD⛗eߨD5dJen\|kL:E_3ec4Jwy6}_4|"BbhDRR7q{%@uELsF`: SO', Q3>x 97[7`x1Rft-B!'aD(L)(D~^~{ۻ99hQ%{92ZJ{H1m:Z̓҃gLp) Mš#PBTI( WT@$< k (#8KJIE %bzs 3Od2Gk* ǣzm+((9 ?;IaqX]*ĞH\،g$BJQaR#H)h{T爏 ˠ~ɨ>MKs 83;,-?0Dy<)c Q#3 6:ܳ7-Up>Djw#GAp 6O1xREjH9W"uבn3L'MĠye$I[f&Oȩ\고4\cw# k,0D~Z'mr$0R_R{RqE ,4'5)ROR*u1K|x_?7[ʞ@3A]=9м"N !"9>lf< U),M}c [DPub(>qI\Ue ֛`;3w6$kޝ|\-DxwSȍŢ JXz< ȅa (߃%pLʇ5]Bf|KL}ՃTUՠ!!o8ޡ?]f+~)ȲIy7iK7l'a:> yJ @ֶd%Vj*ŵ )g} <_qu(в ߱~}Wu 3'hL&7uC te ;"]Sհ#j4-xDž;;kK0DV^#' ,+`s(0_iJp;[Seͫ,=z D\|""#>^梺QS1;P œQyOd"0՞E DDMv? }!J(hqkiRP- ,5y9_s ;Oſ,9珁?ؘBdϵ3F 뎟}hIyxUtWEca|C8@󷪪g(p7Jդ\@xі> !X0ib]MƓ_/]c6P ӵ7 ̺Rb? ) `hv4h,DX1{n Y Id7PFZf@Iq!|_-1hƂWC}M)|cHvu:U!3n!QXq=918q:%<>_Y? {3P39 g>@E[? 4`=01PlQi8!9RmM5ɻ  Ju ӛ̌4<@.q& qᘻt7FX#㒝3xDϪ9_5$VOnc8W qXS@7֙qW[uh&Vn܊cbsfFX -Qgz=(boCKd>.ha>:+Fu+bL`pYcbK:7Lgc΃OHms82RzWa} ϝC0g vYIطa)N٣HGNn;.]AVݹ42 /؉9M&x4мyM԰Qؾ gr:gufcnEmstݽ̙ڸNǒK*`Cۍ6ӧjw>WN=0$F#zQw9Y/n!E Cp3ҚD8Εhz*;eZd#hQ7>ף=Xh%VlMEf9 / {aoUa= Mk{>5ڇ;{)ޱ-y-'trTB~2+{ A#НAK Gٿ4 A#RQOX|BA#4ԁAIr[m=hxHǘ%ܟ }o-~{MʋD' H @{>Gz?Ͽ iޯK)4l;O^)94(ozd``=]]xL킒I.iG7W@W-ێ߽n!@ "ݥi:h$DB+qww- ins^Vk5 L;ƎŨQ0nD /g2=Szc0WWS4]"6>{+L(?>c<}QU>@t&L{/"gWFa uHg]$䊎clsQ{fm^X| "-9n(+ʣC^8k`Ruҙ ?EW"(.źk1kxzB.Ƙ~g-8q7 km[ Gv|vcU5kaP:u:`}B[jy[mݳ sF7*F. +5CX{žѱ,7{ 08SeGr)֖QdGm.k".M$?ZדCZWl9vBWJKHSp/x($;aցۈH/-+)@ tv¦7Uyi1GZ:E.,8\NCa,竸(6&vO!A=p5C + t6!P1@Z(k(q[."—Keh1dY,Wu`7q3Kw!Y#FY_"`;lMdF`epn2ai/Ҩ}Ʃ @hNwATt rr8]۵1SwW_~[`;J+n>7\}v04? ˭*ϛ3z -?LKӁAs͍[Re#%"* F]1(r^W-0qF)hv.Tڂ͸ 66DwWNe0,C*+ʂs=lߴcG \o RVǎ'`fcШX3H*Kcg|׶;̨bK/#jŁmG1Ѕ^sl,VD"44wDYxԇŚZ/vDA@RW- v²}V뗎bq?wCQI#*~ gk,rzʊB8Xku4݀^AQOs*:{ˤi31k,x5,w>ђQ݂WٕA:+&G6X.v31u$[_(JC,?[MCNp DrdAM\~>,% z!~DHާӧOŸj9s).?8mMe!aLK6'>,hrԕQEA~s0{?E`b޾M6ZSOh4e}/ؼ‚ͿAmO4Oj ))QaDtj]D\ÖX?rE޿}cT-aqO?~CeI.Rqv$b߱}4>]QhXժ |^6>"ٓ1_O3NAy0hZCFHMI<_ܭkl(O1fJ@Nd?3&F=蚢3iKishZ4msdf!,gvAlbT"9vܢ5-|7)GnF "#BakR,4sETVhNrv!:ڷ_ϧXbVZ+WйkKLetq0ҹ}۰v w8Uhxz! iD`2d U-ubh ;Upy>/L綘,c Ѵ &([oy^GNÍ7y6Jd< Fuvc.%6})61&+GoںO  #~NiIA ..P>5hGs74qvC72rw"ÍѪMGlGGpNm۹LRso*izFپNJ#7yJ*۷zo4zԉ&M' dҪR3:];g^뷬$O7 ߵ H É ±=h1j6ڡ ~w9]s64$g[ѳtǢ4dcgY hq!B&哖9|bqj$WA]z`ڢ0sE;%??Ъu;iFC~p\5Fλ{28o[Kxg+lgYצkjMkL#?D)m*RcWrb#4X2VY ɌI7*0B^FnLgkAϼ{__S?!*Iu#[z"]cYy>]4 hpڕFׯPW&//CW/[G+23҉8+bpZ>"V]b hD9'zSѰE4DЈfڀf*9-كA#4ʹ4T{|GsUi |49YHIJ@RBx$QH$Aؒ6(hSaif&OaĨ#s)~6(h̞͙ޤ3y֚nM%^ktM߹PЀnIa}<5I^qzSu2;9tWkƒ+8j{i10zx\k׮AG(;<};V4 [7?> #= /VA'tzZKGN(&wơQܿ-7 1CpX>ǧN"+Oub)P 3Y5\s3`x++!K<_JB,/]ۀ(@r"? ٳ1n酉 3Y?yބJ߮9h8V0r21.0]ۢϰuXx>SCG#dRt]IďS~V"''g 7Vf IDAT3\8GBN/F-?kW6:Oj4Ht1md5P(OY1rah.}S M\i*Y`j+l'L#z߁wBsi1мڂ;Ys$Wn@uJp$&0lFM_M-=XPk G{^I-l94X;m1l&pxOAOLXMghI wf {!*&bN \Kr4fDׇ"Yo"("p/~$1aBW,\c_( /b=LbǙ0WV҂I'N0=}Baj45ht)xsC EnNxCc1WJ3AV^ TU6Q&f^0u!hP + 5H5_}IN wÕKq]e{L|CwTͮ J=w12l0Ĺa),9_Br-}%Ez%Yv0P"הφ\aUoD'Cј>76$]{F{+3S,Mn}jT  !$& 'F 9BQ.ݏ[|iu(haO `Pы雌L#V@*@קFAtit9,$_ADP&8&"Xg@ h%}G@@^,쏱44ʼnhxy9DQXsBsXs0oO_q%"<:){tTK$#HBCQ+hNq`t ԔJC"8JyҎ{xX2b󒤕Ny 2sN+daH[VÆ"Bȋ:In2r﬷(Q&Qˋui,\.;';Y,˝Kg -Xn!/J_(bB>Z_EC=\fzX|rY tX|j)an9:Ȧp:,Ŷb\,P^6SsZl\.~}Mour^BI&I(/fdWNEyp^'L;ϲfge'MqQP0o򢄢J\`,zzx+_={A,+%>Xw F%+)OEPP+ݝzEiÑvRXnnȽ3d,]zI+ uqvQP8+ݍX!/N/9)IHJgbH> rsrery;K'GI^lXn,'}Fȁs=x\qܸS^:2g.\/,-efyY\G+=E`Igh\7#?,;6S( ~bX 4/8Ϗ@[x}#Yf.#=N =&y$7۫3%͋m:df} z`e%֫ 4TN$ fw!}u3HuSdjg(Ҫ&BsZ9 w[F"@}xdd$ jǀVV@SLтj>r6k`? QZ*V7Y' T x'5 v 8 30Jѧ1ztLL>e +z% 8 b>h?~$4rVWwiլfe/=eg>IW0z.&_ɀwqN4?gKyy4tL]N1uz ]X|-/}w;^c|(m1 ҩfK|9 wGdgK%꺥zKμA{,5`Ќ#L|3)n|(J,>f=gji޽;o$LY)3虻w3r:f  =-z6]/E5\P1Yef}]!;#Y~s˶_\)8f48KY1؋µZ;fx ~j9Xwi=TeyJ3OlPY-P”}ۈ "GM&b9W-ݴ1\U?0i\,۸ ;0aXy Luq$t)'DI0i4ZV/@,!xэfn(x:N7~gK,5Z FMyvP#YN[`:m=_+m[%1lFDZt(EMKh!@\ ?z: 3=V!?7IqtOE>0ǯu|уI.OƧSTIOӽ,& 8c( 'zyS[4У P8*T1s4bQkb@L8W xIOJ)P;C{/gkL\+%F? f\ϩM)Mmʤ KSy±4p+k2#+#Ӱ1@X߅D Q<$xԗlGDR&4T\3gWqMfغa>ݔKJT7Ow9Ů!.+ 5i HmgoccS)*Êu#ff|02y>YSJz\ [e&arDaq]P %fIbbbGF`mm-X - ܼybnf=",g="%r ^ "<D>} >,1rN8s/LM\_`Q֦L斛7ožǭAW?{fL2/p^$7/kii O<'ܦSVg˞LXny=#&+i|::: sz~PruJZ`QrqoFC^o݂-skeJbrfwX !ʰ,r5J\({SAnf Ey=7%2tf:W1速rq}PXG I &.lXnؘtP8 ;Wd}Qhii <|ȈNSC,FwX|1C :bXi(Ό:s'_, [Gφ g8ue:e&22dV17.>Bݿta<(l]R|YrCldgeЩYpXŦ5߷Xg"hhX-V*Qqt{9AF2̧YrwCؽߓ9AdNKI Rx%ݜ'"B >tʊR$Dسg7{zMN WWQVP =gFPT\UIJetYg.\APR7ĿZ:Ox7zLStJA=4/á.`ƂY+8?+s _w[L~j(.*l ^0LW@`b_|h7 k/TW&ԕc(؎QCqdh[8hs8{6 S[| * ~d~ +`NOK'cR y#KJ%E40xh8fOZ)s{?iꝇwB3h)aF]atj/* ᢵ{YCD`AS*P ~|ڶ=:nF!?d3`͂9&VRخjMY+tkOYlNtG̙0k t6ƎPb3}it c&ͅ{r&Rb OaaHNM1dX\ʋb$LxSM#g{kzo k8 \ڵ{Qޔ1qt#ig>wB=`CM|Sۇ?[UX ψֵ0h Sw#1G6/Ϛ:#7(!YDdTk?@ȴ!Ɖҗ+m1k"EVLwZ@3̟1 hCex*cޚ-4߉nRKS>E"*,XZH! ) ^? lLܼX(6ӢHEY6;>W{Э4!߰:ﴏTǃ"Vٻg40f8پCp̡z=C1{Ɉ,IWU0y^$?=7--kgxB U=4iy{^B:| ?4G;ka70{GW';8 2LP L6o* w$zt3( 0UDŽ 0|\>C=ptG)\Yn /FIwjW>&[/\fES)/ debQWbI&{u /Y4&Wh{dp@E5's(ɆS3a h8XsQQ0Dn=~i-x גL?h(T~Xx%4O)=kC}@,?z B%8|t5/eglM%s2笄{\}FWX5k$lfR20`bI#&܄ĐiP[7L]/^iU ̟ AK AX8c6<b%shg!& !Z'_wk#~RAOѼCpFwS/^4_NO.@u`oLz6spEvuN Įg(p Asqdw]ǐQ\"*X1kd'-rƹC K@Nh"Ji^Ac`Ü09oH=MN<'Xgf: @u{7Š?HEI}"4RLnZ[OPBhńcFMG`pmҜ-۠K8o{.{]y9Yx|yVS y|hݥ R$鰋J%<,jd3}e{c pssWV)NRFTC߾}b!G?檇q613Bpd*3)?h`VE>;kh9i\•|8p@p3)+GLx ãPXWF⍈laoY4o`kKSc08JK`AY 䌡c8I6r!O/odhݙX2!&^n³IH7Aۘx Gj#/#N_JͩY4>l^޾-j|>i64}T냏pd [:lɴwh2SX_Mp\gPw"h2l23޻4%8 OÃΜEGIB|-4n4۟܁yCܹvN/miSod _r#N#_0C6lc w7fR=?}KtK'FG% KC4ʹ4Tؗ2b4bOLALz˶_kw}MPD6Pĵ@%ZIlٿ4A#9M3m@M3z<-A#D]AIDAT4ʹ4Tز|\i i¾VO{>4"hĞ6 [$r srJFxjI.&`ʥdn5Ɇ/nk#O*Gsa2a{cAD| >d0Iə'91>F k*1_%&4TVBF L!<7 CrL{r$DqrA0n1Xrק؟d_#f%[I)B>4z2|r47 ˝C܈9yE| [y(?Xj͂^!z‘\8Tgȿ,-RFƀu\bOCWDw, #>Ei%W_=H6f|t< 4_1h}"ޟb  8aм4YejJ\`45[ossV*.ȁ4vl˱l2lظu#%3 II S~~f$ݎ5~#Jy`~/h(|4o=9Ⳟ;kVcҥXb% CSkO/^^F&waDPw:A(4 ʈ]2@}¬d([KC;a2u(M_ L xN$RasODT7<i)Xn]b Xr/%PFψ0;٫+.ѹMhӪzU$43{ hK+zvI  ZJG"®ڹ36֢L8-[GR"bth[/!#;Ghq9myϜ%1hJOtºcѡ9">1dH'Ć̭)pF"p YlomYRnl!"hMdVHI*!V4 g)C9<j%n6eU@a&J#wx>F,+oo߸z Ck!$M2l{aHdH;/=M)]c9K%r9=ӌ󦢗 :I V% *ꍴNnF.]a({% !,1*8QʊDiu }{HʡɅwzÕ:uꌁʣqE1 h Ev"He&,3a4<-b=x2ZW.~Y;mtME 剓P9_zS@c3MqPHmΙziL?:>ŏB"`L3*c5p |NHZcбvGVV" >8qSDr1>v[CyL::_cNFlZ '=<{Oakl"ⷿAUeFW  kVߨ9B_}yh}kĔ 3CѡsRRLixə{P2wQ%-i Z钱GR'o Ȓz"@Ν_D+tN 6u' bLŒ J誠вߩUDZ.B< ;MFWy5xeJIw1.yD;u9}hL 4R9%{kNĵ0 }{twS)xiUK $7D`V) 4Jb=zvLaxT^@SR;u>0qrC1f?vaj#0ul,^ƫ}w9\z`H=U\؊*z-w+a/W[P_K}WJ6Χ%ޘ2r0 =]hkkAW!o骘(|c3pTUiz&z2LSQu2$ߑqWi^8VOWC./@QZ8Q_.!xxf3͇ .3=~g;^qnn JAb߁.:Ἁ-rhK%&b"7!4*07AJp%x|~ Ìz@ WDzWU4 =1tfR"}Nz/訠ؾc6o"6oƩ[LLMJAU"hI U>VBom;b)[S%׫ /ڎB2T hF,|&$ً&'B%JAS8I~^l=Wϗ:3L 6'!4lQ\_Eб ̞S~DV~>IK;{Џ",_zDj&5*HX5h2 $F"2p}H//IPuR2QXHe| RB LiRgózek;O B3)^YKkw-ܻ#Cv8y KqA8aPW7ՠ䟟vC Μçぶ6n?bˀH֥Sй`ZP|d]”Ъ zSѾuE r, va fm=tZ(cҜpOOxg=DZvwq }e0kF5 =ɣGg$뛻оMkDU(n ec^1޸px Aѭ[Wt9k㥛)Q~XLq*G3`}Nzb80Zw{ 8鍃ƒ{`cr ڭuiqD0 ccUhvT) 1e,zVgi(GC|O5VLIk7*AȻ ;ZgO{ʠW^靖n">=p6HArt)`؈ ndL:xWG78<!Jh.Ȱ8&fJJ is1˜'''!#3E 8݋ h1)Iȣa}gL9%ӞMpўF )mbkMJNF||<8zZJJ2)n CQ! v Jh#6djŔV6O0d496L t=0? ))Iɢte."Ҩ;:LIENDB`fotocx/images/magnify-image.jpg0000664000175000017500000015664315247006660015530 0ustar micomicoJFIFExifMM*JR(iZ0232T0100fotocx-26.5: Crop: width:697 height:341|fotocx-26.6: Rescale: width:628 height:307| chttp://ns.adobe.com/xap/1.0/ 1 2 3 0 8 341 697 1 2 2 C     C   3t" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ՏRQ-^Z4;#.]ש=+QnY9Dc^a-5[kkw'l&0Gyo>Yi9^ٮD%*O]W6:n!o:yq[h- ; =rWa<)}CQb! #q'=#^è`iCּss-(&i~͵hvwic&oְo#h;Q4@B|Iɸ* Kޓ)F+zōJ٭Yt13\{kM+<{q5|!?Dx]*"4גmmTei3F05ڀ2nU5bVGgg5gdc &wb4YioJk[g9ܫ6 TTh)P@:)QQkتޏ$1I%?+m~xUG%We|W2©O\>0>;D%F<b8=v犖;$>j*w|ZpH$f6QkOKϰݢyuLu#֪32;feZW ȸ?%9>|GqWP{iw[9ݜ9x,poHqB>Hh7|O:Uʬ~ ?DxE;1sҪ+Ey}NqY,2O=~ Be< Cn?_RDQ3tv+[2fFϋnvxO$r⮏?>^&4Z\!QWT_x˻b!b}p?Zͩ_ȯuu6֭b p<)\5%;C F:o1ḰyڷK$kw "}rvCI-M$'Hu-;÷״^xO44c7q_8h?!~'f_Sy^|kW!a:k`j{_iAٳJ%utB_iE|֥-U \ȧҼq=Jg[_d :dſ25,C(iO۳WW$xƯtƾ iˡ?Z^Q[."מxĿګCwwuW\> oTLl$8UFz`x!kMFq%Xn#+ regC3u;R­E+tYђ&gG >P}+R-;ZF4yl<6ܖ݂;gM,tZ}FQJt+4WI&#rvtT7(/y]J*J?GPkB9Vju#U)EڔI$mưqAT`+򌚎B[9"n#0+7bF31#Yw,r X̃ ݥr{Rm]̌>Arbznw"Pa\bPv]1H\)cyW|@ڶlWj[u/aHr%9HTKj`IckNs\ C|a>dTV2~#swiy {ןO6]]!bI'&bVaNRG9xF XAUJ>25 Re1^3k-0 q+WŋY]`ҹc]9sCb -D8"k{n^8$?J|K_MR2ּOR"L}\(H{[REj+rilvrI1ɨ,"b<jntx ]|_f._Zҍ_jeakUSgfczݽc°9ż ':Oy?¼z#&q9!3:]y{g~t}V@q0M ?}&SF{t#p1X"Ҽ~v[Cv7麅|>Yqt<-Kuxzs}_oӖUeHb`vOҩz-Χa`Xv89{MHTqb+`?NWj/=gßmt䋻Ȋb3Nn̫#ŌC֝=3O"Ϝ|<:gk31<>mmyfp$1׆.vHxjzt;1g/|IB#zמ'Ozedہq|W2gǟzmoxv~ZүQʲm[nz'iI+Txo~žX<p4F\gsïs/OgZӦ9F rkX&Po5Žg=I`qwA]Π`L:KG#\ω=%K%tl1r\a%}P]ks@+ 8H宍&?lVD|<+߄ d^km'\o.foe~YX'ꟷr+A@G',3TfZٟXc$r;PFOl>,xƳ|IEF-M;OВ txO ? W4xbmfY$KiK#si+I\zO)A9~t|A f_fx:Eͼm @]nқ;_|Ze+ŏī+WTm Pap3^eVZByG([ǭ|{w>Ώ$$_|FԼ*ZMUfϖ_OEQNXDkҕ:Ϥ0*EkPP]" w/ .#xs׳!r;VðlD8eh'`y8n=0}&$S"kټ~ʬy`o^4KVuڈMM埻q(:Y,>OLt,W˷vcz5kzHgJ-ٮi"j)CD_Vfܹ\HXg5vA+167.@XԶOsWJi&$%?# /\~uuIuu)Vlǵh%֥*e=xH4v:/ϭLHdIگi:eꑩ-+mAc}~N._ +sלS 6n REz?g.Hj KP+7ܿN%6q\cUO,|{7ged=9xIg&|1tRRT5fU5|=nFU-dk%(Ć=+đUZ(2Ԅ۝O}Ѓ*CJb^ >quֺ[*l_Rkr˕5'v{8}%G$ǨSti~T>:UY&P,@Z$ u4<;fwzJ1Ȏ}xȱ',q_BUMu{E);$Ez\bف]{6cMimo ZվX"0Ȫ~m. Oo\W:$C-QdkIiں붩+EynKkcЊ/JIIejZ4pcbxӏ/Gy{ª q[:ViRE~Io¼÷&5mgP6s[:*+˹I`:xs_Akq2h'O_[㇍П־Hk{S522xFF 0~~/Wz338y,E%ju6}Wy~ݐuH崦8GxoQ\sU`/4* z x^҉5S"`3ϥyW7ίҽywGSRjF4񽤦'A,*6#oe̊YxOY6toPoc9MU-p:iI%wQLWGlDZB[?1֣m.海%Xved 6Ӆ7vacIz)$ۭZ~њ}M #؉_O3Qf-,cvJcS+ҿQ>(/H϶/#e'5ZF /O};^=s\pwbBqp8?+ g/#xZO zr5u!+4i2hrO!vFgc?~*ҼES3XƩs2@YJ#\`z/ g/#ZW zwWW>=c>d3iZqWP|?LK&卷(L?}?įkN^0,m j|rzxZW zO/ g/#^_FQZWIM G.䟽v1g*_oHڽۛU]︳FBUy~(V9+ Oz;Z1>| 7eAԴmOƞ 1WA\%]=Mw OLJEhw,>\qwA?κ/ ҿg/#xZO ziAnj7fwwZ]x\"`.T( *m/s./ ku>KҝfeݕZO z<+JOW+h ފc4 71鏧=s֙oJ2T5dE+IJb?;B U$!FSW?_GG\,VDKcpӕ99<+IAaZO z.4O&[>KGy^(V9h,!V^͜Wt/$8QQJm [LwA*TFq5BEFffh*r܌t)롔evzgJ-,V'vzߖ<׍|ӚV$BKtvbׯMc%u!{jswj旴ܚYUw>Ҵ.Wڟilpsoub(zqC؍k;zs+[sXHj9m< *ب/6UbEqQ8S@\R$;MKdʻ:7m6*w`O\MjWH"RzG\}<[A&cP`:W-eOSXděyDհ)o"2o\nɭ.W'xqӬ ‡ b߉!OKd Wxx +F'_g`j!m2"iVP;.?$ hJ#yx(ZS/t]i 4t)Jq_5RmV{ehќWyLUZҰ֞pHzs$Տ;!mB7s6CwA^%m;&CtӟV%t۴Wu(s='[>/$FϪ5,O$<294c՘.v&gm\M#l~o<-.n!g&*ƍ&lثֲgx6Nײ=E[;_xfɒRHy#C":*y >.x$wJjHjJ])Irtyk2?^;F{HFOҶ"Ǒ(fISЯ?ypΌZ7L_vf)mnm<B5I@ T zŅ~vW/imX+H 'U嚹j=.UE şZsڜzDnFH9WxX;)S~VWܱl9$ KpTzlFca<~+xrȎ, k=u0r+?>\[Mjt-1+ vK-kQl% 5^BМU?7a5zlm$V@viFe;J:_P_!N̫{ +BٚgV0VEc܃xuΛgc|M!u\Pޜ ֖m/߆3_|h !q-%Hl,,vF=5WS/dd%lo7Hv8+{5wekֻ<֡3EyoAjm[BԦ5k=9涽9zlؔzh|Uw:?iYVe52żGN"y~+xnmg#U YWib ;{f"fObi? kV-dE2iފ8L{\~#'2\B@c̨+7H s њOnoe@owsٻ{J-34 xoZYmtԭYnID1YBJt}/3_>C I _xw++ɼȵʠ.]q8M ~[Z#:w1_@5Y~FE+{, :,~c>zh$8ڤ`cGEMծox~WI[NQkR78*OoW><{lMv=BY^ ̋9;$^z߆z m^M20XAܱeAt4f7@ =/|s[Itď E&GڗT״k-P}J9dI(Q؂dvϠ^cIb Q.Nߞ:fкoyCFҭuKԡ*Oqq\њAd՟Z߀+,aۋK䠄Fr M*/5i M:;I|Qfڊ'€2qsњi4[Ԡcc7RҰL68dP5KxB[/t-Q}[VgvoQ’IB.{hp?~,'-?V[k%]"T˵dB/ ֊3r%t_[DډR_˫Mq[>e]TH *h e̓ʟ߯~mBMZq򲁍׊j')7)$3F03隂+-Ms؃ַCe;_ƨ\X^31ӭbǡ_PAm~0 ~RB>4cTxl]VV-$uj6bDSں'kӞխm(\"ps:RzVj k{*ɮL#Dv*[zWxo]KҲeݦys-#k{g|"2ݥZ*3kDZCsK$&2aCt?NIm&Sȑ ptWOC6I楩:u彥1Wzyv:G*Wkk&cѧjO{ Jpy?:6Fǥy-XΐIe9=JeKK,o09 $ޝz_AD[Jz3'o˪&_U@Pq] *+9$].9(մ6ƮZ [vMB U^ɲRi|7wsBdc^$`g=h1pIt@cTV@ܒra׻՞wU}aaJ+^Uaے}yg1k|wev֓6Euk+;%3Ԛ#,dG8n,}kȫOnHOAG,E{&%B^QKK1iwm?P }+,j2sO&}yZ5wW<9Q~5W Ŷ6QjW:MKI1#  Xlyn/Km/]k[k'D[+RK#FYTxנe߄~!Dw)("B[8$F=k>%<"qoZEh.@"bX`ztoῊIo}Yׇ8ޑHeR9~4[>Kd,6*V 7%>|[-@{#ƛ)vvE x{%MsxC~,leIU$VrBW^Z̞'o,NǫhiOlJ0oXaX3zǯ>1~Ȩ# '%A*101\~..f&u/s4{mSVl[hxi%5·e-GNoxëyyk,ZTY27&Hq?_ l~'|#ռq/uڬ^ZTuH%0G: @Oп> ~b$GxwTI3Ǿ#xźV&se6Mb$/E^95f{m1xׄo,ng6mE\<~,DWlEG2"FUSx׀X麿SKq%Źrbы 3ҟ]B;|7SZms:U *qYz?+;ⷎG5cRBDkoG E|#t?Ězʭ bDeaǽ}SEvW<_ |]gjwW_f`4ad 7zn^E۸ҰQZl.4?RAϗ.? f̥ r@ϡ~R^Iud o- ÖT6r:W^gFG3iKUgrB`OJҾߴX'nU]H^dD v~猕95N)<~>*Ӯ9lkV/#̻^}kVV1Y]|Wׇ43^[țYt_4;< uQt5[2 Ja7dq Б5R~/lc(la?/AI}ҞDYyq?ΕxӯI?x֍YQ<Y.kg=dSk/%񾨷g3 BXn;~XkQ3G.-XUr$ׯx+޼< A>ӥy[/m=%R..3S4uk 8{0?tQ 춆+iG˞&6:`V2ƹ <;[\5լ(*b+!Ub(osj5X~$r&&*@AE'F+:Ժ}$ k!(b-#1Q\6xJ-ˏ8,ܒx& nŎk/(d"/-PUyrgU1Ԣ;?MUڰˆSK#x֬K6BhϘ~&WGնTY nE6U8bxJ)V߇ѮRLd;Wkk-CSoyKcqPx~kT>eaȯFmid.m^+s\"7@W1i)`F_;(uY58#ogdZI?Pd4wX՞l!_9v;V,kUmzAt$GO'׻ [sɝ:% C72Īq{dp$J \zvhez-޺Ilj+g\iE-ҠߧU⾆K?9zlu{'N~CS:22? ܏[uS |ޏg ڼ`*h W7zniV2FџJK B]eF {_$։pUBq5dwsva .:J:'JTҚEMKP.VD̩koқOb#may?t=ѐonW=Tzח$ŲNORj.5VQ˖b5){fn1ir? hW~:o6t=:Wo4ԁ$H zq^ESW);+Woǿ?>'ƥ-AjCo,R nly6QW'oÿ xĞ>ӵoM^yt{Ẍ4 寪Mtxg٥ƥF }ث]BmzWў$W Z&-H3먦|gX>Cu.ִ+Dm2]L,ɞ(6ղBgkoB^hÖ۶1鞕`86*_ϊ _Ʃ"WRZhyD c#WW>o3xFϮ6hZKRvbp F)LS?igZ=B_`5S3~B*xGP$e]X93vkq[Ǐ~#WŲiE(4Ҫqנ̥> |q75o.GX]-o vFFG14Qcߌ׉j:som|3Jg-IߵO=0+Z( ]|&tKo \Ꮙ7~%>-}df ۜLkߦQ| _x[6zӮ//9*fS(`$WP ks|4G>|SFu- MR 6(@'WnR2U8Wi|[G%i{L@{3jqI~]1 v+8Ug|8#V`\b~H ^iZ%ErrBLeH' Ҹw>g}>UZhs,1l@0<+ے+s#eso`9^F l\q_9|5ȡY|u==zjs9!jNL>,ך5RJU_;[ms dϹ&޷1œ{Y ;UB}M(EB)l|L\7_ O0ږ6Px*鴧nI]c]Ilva6Ʊ|Eh\xt"]f<~] ¯^ݡo njƱ LFݟl]csMI8%F$xX;͓2#FEClLKTx#IPp |j/xDMʏ¾Yby* &T/4(n]Gee! ±{b}%!L%qo$dsս;Wh$<.v^eZrt>jM !Mo9t5sD6\Bn]VG#T -Bb%kpѽ> 4~$?*A:|llf7CD{:]z'W y;ZqpGk%Cz5F+Q<9C/ *Nڗ좞jEڕNEfBOAV@+hiv:*]XIrwSGmːwvOrW~0*BnsWM86yx8M^-jсgӌV<"}.F& 19NGzt}氨EYp/;Hog#))(-]2GԴdnYu9#B:/n@uUNnq#vy\&9>)v⻊CA|5+!cQ[Ge՘I5m9ȇX=A 4^RAyk(,9$#ګR%%{aO [oQ)[L}W#X^$\Ԫ0Ǩrv7mX˳$nI 9MyF`9O1?1^*Nk*u4"Ѧ"{v]`ZVknw-V)bH~2|E_Sԭ|KM/XOIѵ"D,Dh5YPR~];t=Oz8$m=3@_ x: .u5 A H@V–W pj­nufЭ"K/' #cneb;I W:W/{٫_is[r"{,~wR3S|}CxCxZ-G Ӵ-#^gVYQY)4 P.^@g#j+vsFt@8ڶbFį̠Gonot~X%ƞzķV b%1 n4ڰ\UҼB͏33/$ӿEA3RMxg%_񝎁uEc?.ViIn> G@:+i]WTKq|S-V{[MSȒ̥Sc/ ७=GקHzĮ_I$ t[Ə&lyE}ӕ`t=m~5<C]L2[(GOnkIbo%DV|1$G៥S.5>[9>F}+:<U1*1+r1ï[sקX궚w6$иu9)Etr9p=EoN-of'WC>cx̿o'ٝg5m#ʦci˥HI| OR:O'.iתC$ԕuhn4pb(uјX)L 0L*V oSjOcOS|wG۝y8wyaƤ:W: X!+ϼctZ-j8\x4a$OLǼ*~e9l-A BpEa]@ b&} gv  WLnM÷hw\o!>o"CWu{HYP$hgW>zk5F蹮 H]A _G}"݇Kcku!i=ʥ)cۚSm-bWGҽ'CՕ[ҹo0xZScsr=/)]=Ѥ6<5y݉D,qRx5i(.lIN7/Jɞ|7ړ2^WpksM$xoE"tq,c\zMƪq&>Bܼl~d^)djJN'ӓڂ[_'ҴSVNCU,`95iZ—f{ 32\n.{FD7<7ߓGGʬ^ΖNZ43Kw\[g`H}ǯyƳ\h1]ׇ5{g:}[Wu[A޵:UOm5%ot1“YT4wśPz1ss׹g8gcԑ?ux#=5|(CS^ߴKD|g%?+IP?Ю?푯/xj/OWgJKG܏1ԩ+Fy+ط>ߎֶ>MipcRz;eo̵.+c|I xYy>mܢ3Fd@rp׳P:"("b('tmom/īaoW զmyU[f'?M$)x_>>KĞ->&x\Ϫ[_fy PQ7-⳾!ZQ~4iR#P]XZxvn\:'H̞kF ĻM(9v3L)h _Sʼi+Toxߏ-<pح711o""0̓jo^> ڨR4.2$,zfG K&1t1<j6tO]Zu|l^hKV\2[8kKVEP0((((IGcL/c_)(u O?v :O5%`H}-Koh@ۊ-+xq"/wS0o{Qb# vj殗m?FX$inr`ݑ*׌!dћ+qYu+s޴%ҤU\ORJXec-%R^d1S :UOF5xKQDDNݎ?ƹ1lS%iơ⩤T.6ǽzÖפ}SOKKd1Bc tխf^\'⽛B^n46'4I*uc93hb={pZŧE#ʲ #2}֒r 'e':}P}BmH˙eiÂz}X4A zR5MGBMԎ` 1لl$>IEէE6~NzEZ}waylj*+(^ 9-gvtϠ#kV8G6S_9J7Mj]Go&4G?;ףjKuI/NY"tԯ.G`2xQ[Үg*j[_3&__Zp p)CB0|sexgRZRKa 2*FsE}-v>ݾlv>UcR=kՄHtMMth\4C2yl$Sl|:Wg8<,ͣ|B4b-WPhـ*UKFk*Ry{mM}ci$ n'ـO TPI'59t88̇ù7PF]lxzd3[M%d|pDSU$3^RjK`b, t!s]I ) 2n *v~ "Z#syl5K2#*}+.mJe[!gzgbt~D gxO˫%'ӭbhяbEx{)tz_/a->bI8Y |?&`[Bknت#xjkcB͐Z/t+hpʭDw*KH1;ö Tkv`tݢwcU;\ Ԛo^,I};53}|]\!*XNJ DشC?>|J!up#bRK|,^e9o6K,yR9M\15<'6$,Fcfx+r3ϣOr>y%1`h>o>YKNAol+;ͺuKi} A4M0EvʚGKt~oFyj b(Q%p")ծ{a1YJ\ɞ ZK,0F=jk]"%V\T:t5i[= ׶dvr@9qΔS_;kČUhȠ{iNMk<(U:-Kkf'wC^\5= uZqF=O:\j&Xl0A_5(nT}+M$ XqҵsV:|^&:$F=2:e9+7o{t{7& #wdmkES)pIqӧN^,Bφ,OkK°+>,\} Cxd}'d`QEqg-ViᅺAb9!EqK& >?_WSkW_W2\O!%䕋1'ڳѓOߥ[G{{W3( 4c]J?d T67g ֶHiBJlE~m?;5$Z\Fks3~xOUtzVn3ݕFp=I𒕎?[z5+ /Gt (nPLH ?xXWQy=> OѾ)A5Iml#;xbiB1tÀ3^:|I9 mV73EeR@p> VbOxoPZX[ײѠM̃ |<_J֊67|]C#8#J+{=|~|9 Y6r'mVD2~v^? I!>*ؑ˻ >9ӽXAi#ᏮiAVPT{sӥ|¶_4 ]`xROxV pF! <3_MɖcWK=~ĺjgIk7 ;,|c(z.+Tu"kk{ē]D-,ٌag(݁5IG9B=@-3 Ճu)ai RIn܁_ʶ$U', Aֶk'_Z٤0) ((((Z_Β(`ޖ>HDeƢOv޾Y:K4ʸ+)%յ0fbXЭ{f,r)UqKcZM&(n=ESxB~G']7U(;Ytۄ2[2 0zד=yYu⛿]\p*[>S/um+`њ^ɣhp̎ei5'%+T#'c/dRe[ E$H'$Z|MqDjT4j]XwzW7bɷߜwK/2'$~ۇ"9+h};DK6i]h7B/ݝ=S z0^snlp X딽WMѲ*}]$jbIfK9PNTGLN3t/vђ׌Cܔ=+g]#.t80 TxvF2+x_?k;9,<9I3{Ee˶wKx% 5Gڨi.$7>&7h%]Ɗi-g b,]'rܮzHX&XԿ1NղYsֽIt$"5΍aBAȾpk<3mSn(\漉[hz1f=ĖU{jȵoe>-T?u.1gmmcUWhU&rί)DD4 |WcZii&8ڸcNjʚ>9aiWgSxWQU簅!+$[o&py ~p3 pGV `v# 1Oxno+( >3ZFA^}fEài0[iXGnK8$D3hX=IVRRieGXfZ{(+ۊ+cD̲PddqEvŞU7>*|*~kR</ =qW6ͨGoZԿh.u?X8P#:}xkGG)#3FkңU2?f{Lk_[JL7xr5@a-`4zIخFOm!`[^68\*`GanVOnVOB/)P②YR*oGo@h@U *oGo@g4}OZ1ib ˥9VcȊ<G\/[O4\b%d9klߦ _/‹-p:CqS'տ_o OnVM۶_տI >Bb2_jAqғvzvznm/ú]Q=PnT?vzvz +?vzvz +?vzvz +?vzvz +?vzvz +?vzvz Zݲ~)lߧ @|OCV-7X~[dA_O@`~(wOHx־Uy|;8VqGS5)2'oiKBAGskhbՠdYBR޹_TZF2േM!WqyR^?3XnHZ>2Z#]B`]g_xrd!, ~a {g?cn4x-ѭgiay5I 38t99zs:JjS/VY‰o嶝Sޮxy-Rsy *i.Q*yjY$ Xzj^y&rtSQ\ v/0q#c5G%ȳFf,#2~S֙izC'y8^卤\psڨ܈5?iJ*=+{Yѣ5dr$.yb<ɏZe{m#jG\kvSv2q3[#Ѣ *oB]A6Vc(Fe`ھNuY]/ݘ{q]_M;MVQmNF!cGڑƽqQPwkJ+ˡQqV8@l\չfX'Jǟ5vr|I-}}+ џSW/7sK+Iy^\̶ZIGJ>`Kr+QQ}U.Tu6sIxι^5-aՇ^y*^%bvz׽s h#ӴK[i_wV0Meijw.k˾iֶO٠lˎ½G_X Zܪl35O辻Xft$V^*͇V@9o U4Zh8xA;Qt˴ٯ]KN@ 4aV8t]\d)_n w]-l9< s `Zj%[|M?N(Wp1 |/Ouy#,s~Wu!ڽҰxǔE<)o⡌~/;/? M!)A/ښ; hw:TpA?J]qI#vN1󯎟4[YiZeȺ[i5g8ǿzₜ (FK}3 sR{CR#T0ֽo} BV[+nҘOJ>!'PXg}մ"#^DH_F&NnVT0TiUgzÿH5kۭ6(!FF }=EcxAjV+C#2FMcV{x?RI1>b?J弻2CfMk ˭) ɸӞx" 8vg/P"It B?v:g_}`Kȿ&)g 5=c{&k.uLh?¿\4be?m[ sC>ŐV4k߶aᓁsuMé5ɫ6Ad{OA՚q2=|>d6}F IΕWyv)# )U5znaUr+JmQHrzPßuyamgԧJ.~Cj]u;;jr'8xcs_mgVm8Ί2_Q>xWivV9I'$_G-wNKpA'ߓ:o.os^ljC2uSn7>Ej$MiMHֵydA?q7x]+nü'S׶co\楏L“uJ sϜQ:꿲}?Zr- %?)ξmLbުl!\ֱ#H~B2Á+XtwH0[pԞB-ĩ$n탮rSubO0t."ßjs&!5MMG] ԩ4Ti`++Zk4bܟLT 1ۙٛ5ϧ0PO=~W.ss}m,B=k)׹[stqU8W5i2e5̑?$-ِ~B y؊9Fdu/G(&:r1}~*|3Eˌ[Ƹ;S|=4m\InzJSS{>rīF!G'ޯFKR[rǰzaM2{W#Mڅx>C;ɮľ!5飌$s^,./m{P9ӑ}Mx:j6=,L9`H0Ll!N1"a\s^msIԀf_I*ކH9bxNA(2-ՔzAQj )XBS/Ȁ9#GVNb-=k2[ΝNju%2`Gpg¸bNkc=+tHt rŃH9g'ωvӪ=ڦ?\9A$χ7T >#u |_>y-To+|5<%,2Ysړt绍J5Rc#+SJ4Kz?p~{\J#RM%L6uzכUL=Fzpacy3/|CYM{wsy>< ໝcP[AxtpMtAI1J:2M;,eKVb[:6+*@!S_ 5Mk/oOEp/\~u5Ue?[OEt,=Ahr+~%oRѵ2 6XȽ:w'ש[D|gKqkri#@r湏cZI+S𿅅ij\đ&|$~B1Txp˝Dz{Oqo4W뿵i~SN/+bOWyZުL9T E&⳵;i:Ɏ;־__mM5̥B+ u Z~Ũ.EWiQE ( ( ( ( ( (`QEOKĺgߍ/t{V&~87D$<+ gG`uM H <-$bOWҵ?krZ4qo6:OI]X_ExnKDwZՖqx/I_+,Crkuv:W[隍a ^k.̅g%Եm[T*=z_3Tqugwe"\0#b-~^9ɯ>4!VVndW&G|uJ 'i#ьLavYKc^S[f=}kSOL5K-= 'ܿmmOڭwg# kMZ33$O1^_ RSK1Q\Iikms{.RݶTk[Wj~_,^:牎aOG˞f0| d"yuetgMeg f\KR=j',8[#YHVOCΫ$3Q-ߒ{v 9Xɧʒ&?{?2AQcCAeSmrN YW;QFQOj7twM4*Ӹt>Ԏl<17x?y1iu%<^}Ϡig\Zau%UlZh KkCR..aH$(޸:Wl .OzZ&|[) T)OOPz4`pT[ q]Sp^5!F/ċ[OòiK(o)_;xhRI;)|cI׸"0?Z] zц 8 |:5ow&Mxjƺ.xgi +t\iK488=5ia;J$[Nw~q}5V ¾']Z𶾘MԿwgRp/Oa޼^J1Ka2| Ui$]G*+kfs.2Qd [~𖑪#<4G W}]xrX+"a_՝2Jx涗+KU[7QZr T\ўO'c|z^KY Lu@i ^-v{vۊ+婦ɸ6mm* %9$V޸f !xqZЅvm>^L:+zbSÚłls+FoOkZ^&Ҧ bJL1[S/l]X}bT!GS[7^$EhFl}iu/M}\j%$gtbx|ܜ[P|.-{wY5~2~hzי a<2cc\H7Y3{ au*jofA>; &gD#][[)9J³HW[$~UxN'@k^>J֪kŭzOxP퍵AQiM")lOڤMW-b=LOP#9<\.=jBͷKh܏7=G:/ˌ*p77Ws{^?KOႶa@/=Vo?r_CkWUܮlv\ZK_ۣܫvZHkr/[+-?6n;_񭍀s|gG4~,2!tQ8>:3: GjZ?N`9MHFGWFD{B]~eiCބ~cۡlr"u*'i\X[ d + J"AKX#~x4ybm2e#8+LJ|GyI3"#F*kbcѥSIn}sw7kqm:16Q^_?z# Qֲ3a!\4g>_tEjQx:eܶ:$_v?]E?Jr*k.Ϸ>Dd `\@Zߴ>F[*0ȯ>e6HOWΌZ[Y$Q1'SڬB[Ml~'wl }c?4O9کsn]~s>:l%"da.iܭ)q9*%1ٟyڋ著`](q߄$)`G&,KUP?:Ry1ьgϽHO0++iE!mF[mʴr$ak>%ß[>o3D0=Gj]q4Wɺqʅɫi1AN~exQovR"󔫬) 21m׀Mk)cO@Mkrۯ/Ўg>³t[VKf\F<;tSU)v3rZ.@fVyr`%dRGkHٶ?μ+6,zt!UqoooxYk 8 yXak yrMt|jӦc Oucy p:fcq ^i )uD8:myc\ `E+V/|l QofɩHWV#\Uk񐭦&=F]мebJl5Jk:/Ё_)|м@vD-@U;LMjfNkwm\1뵛\$>̚wR J>do> Uᚧ쯬Y'iPv:m}+?GYp} Ө+*Ќ4c(vϣۭ-*U皷i^;Any6eyoj1ɏbmoZ"z75駹U~sBηfk$mcO? -nmKrҢ^BYԼGky c[Rh?4lZfKU{(s A^o#['(p KFؐ}t_WW]}B#1tS;W߾l4;$N,d9:O/>7XJ'E,˂G=+Ӧ{73 S3q5jw'2jv34B N3ZU~$AlcCik6.H0?x#We#Z9][^K ,-j#$22eY;Wkż1a"rn S,JFRf_hsYOޜîsǣg55ooEc G?ʾoɿCv 2N? +? l|vgwxVeM:&I[Þ&8\jbՎ,._[EAum$) #C'|s=reN<wCna\Y_3ŪEX/yǭyO8F{hmXN`IFJ.E󟅾$2;)#E'zO5l R: ޢ1N)3ڜ~J X * u G\ Xyː#H>^J|FgGk_aiqs+Xܙ}k"|GT$i4?*Wq׷\]K>w/^Af6^I]F Gv[n%2x@E,J;GʣSG[[I2WRfuv{mpq*;Yp]U\ni*$àԓw*[nX?a׭ u]y`6PBSPkGzO$ugn4;z֚a J?y_ A#p^|J.oJ哒7H㵿m =/RQԴռ9PfLC>Vꐳqҙ nsݮC2< FPhe@UC {=n+cN!$tcoa%_| Ě%ԢGO{?,\*zjtaQ7Oh6g4I󎵭ڽ}r3YdL寛QM3SrWF·gm⻍J>pޣo 1uζpҼ}$}b-JB7 mCQH֟wsq:VJc-k [Yi5 i}DKݜ~!ƖrOU8 #\4bhšd^QRއMFZ9w3%5]j {kiEg8 - )&"ec^w hIT,׿WB*0gi5Zrݔ`dcr HQ]C[q=^}'Pmy'EuӄiAi87RO] |*ܣ&wb}HOm/P~LnW8oK#EHnrMu|fӴƸ0-Q?jV4/ss4{V#3{ F{(F G?x>O[eC;cn߅{,P+5R\w1%hdyknKf?1۩Q+c *խ/֮C{ոD#{hib8⢅I⥒ٛ b=wZj7 ¹?>_~6H+XKm&:?LcN#*X%8locndDi?un O^`!>RGM}hɡM\gWNtGFD~l7]Mu+X2FN$ROOƾ?_YE_΃OjiIKVoI9OV:'KIsO^{㟉i}-v;\VWOOc9[yFUb)w,SfY/ԩP b1B~$Sǚs[Rgo]>5Z]m[&nn}zV }*QĪoCj^:dcn֐ :] QXSmC쟇4hhѧīֲ`IOڅO7Rg_RvNQ+m;i> }tDLW2B=Q\|jC˼ebUe\Ҋmߌ5+rbcNj=J/YĒ5Vp*\&OFwrdK +OoeZkNe^\6w<|䞇{t:vNbiھ6}ކHeGkp.ʌ)`N=q49Aa=y)lSY:fϳn=GO1o/ mE}>7ԟqIi0YmR9MYm8C9]CQѭ֣7̹(8zv7@_*i#Hn4jF2gj&atJr4Z#!qiwzkyJ Z@]cMg)XV3-!HHRssTUGmeWkό-+kǵ .IXo@oCZӜe3eA$Oz<+^69m1?4O۟JJ{KNiZ( #m*WZGxx5'daYq0·;;Vkc.S?{Vw<xq>d1E=+qy's08xzUUN++G yF}8n}+<@Nx}J;#kJ]}kHs]e#<#Z>pMr>$񫽼:zVq:Ӛ0C9oD}`Ƕj+h,Hխ mqҼ;]{z&S^>sTyN\hLp_52 oI BZ`lyvKW<+3քnyW69&Tghv? ivq`_E{8p1QY\Tu(rHnLQEn< X5E%MQ0ֲBFF8B۩sMbCޝ2x*UAf85MGPQiJ9#<ӥЀ*t+eVYxWZG{ږCʫ6CzS,͕8D@וS!o9+"3/[}MƟ+.0}j/l'aoHhSrߡ5e"{y%m)V8,_i ja(Yj}!=ÙnsT"YqZ #8.ぢ h횾u#3)5b%] :r*ي,Kt۫Mj'YUNH9ZLQch\Mjؘm=q}`58F`8)&Ö1y\.+%z@lB[?fk2)ȕ:ם+jd~JJ9ڮxp95n;հp%ZuwG;-N(Ǯ:W?&ZY-f?Ƶ{G3N15%J([~ʝ59u8&= >Y,I&/8fL' W;w5iًtz<2/Xp>2zf_&L楽E,Wl{HF3T4CIҺM{MVdpW3p:lt[1ZV`9,y:;ۂ6c'5|WM{T7 L^ J;6 0#\_ ]~8̺Vl:S⸭hwl/ ^}+H{ 6}?(#v]DOG"U^ {תxzVkT} qѕn]Qd u ߼ {?k,& )T *_];ݵҮصe^aOM?$"hJ2Qeh< ?HXK3M9[?J0_>&F,N=r <ֽ%|.cv]¨#k7|4׆hU p;Wcp$BpT(.6S$<j̱1CG8մ-{t ۸/=_z_㯅4MKMݯs٬  g>Ũm.cFUH"VUiQ}6[/W!~JPtl5K×qiΧƽ/RxD RaY"\<5+WR4y֡y"%Ycr͗t;yg.>Ooy^-Q\ P̛d/s]Qr$~hy]_,Ezz^=#J(9}k_/ou u #7lIV~_;W孤ؤb?Ҿo < wc5/֗rMy"98sW vg̷>V n$cϧ߲eI6f t'ϒ[𦝢iqEŒtd|Кa5+o['Ҩ'Oo\2ûWJۢVګ :͂N{:s ;585ce Q}EM(##p2O5njs}-;`*})Wk1$y~ {9A's]zUNm4 q!fg<< ;]$csZj+'5 Gnss_ ~Kt7K"$K$059)= G)pL@N3XzOgwm(#1]ƛe<鯅\Ŝg֦:jx.>ݞ>}6'+MջZ^&<+cƸGIZ'lr8F-`lcu%ʰ^ߋw:Db%nFAB"ۊȻrr*e%f8];fD~L|;Vkk+`׎ U+ɩpç\3Suiφ|AU.'ֹw ciʪF,GlFW,#ddlj=IFҾ]/}}oNG(ʹdᗻ:/_k苾 -"#KXж`tKӍ`"JȮA85$M#(,`IOZ)K/bdUN$g_[a}jm6z9}GNO;j7<7Ņn7-0lk xDo%<om."SB+ P9$W s ,(08>EͅW:{ФPFxadֽ*:x6MBnHK}PxֺñM3x;\|Wyr}tFLn#|cc swZ0V)zj6"}dMtA$sylA9 T⏉g TY;O?kg]S(B ^s{y2= ~\Mmbk66.A0u <#/c>Vt'Ҽ؞XҼNǾ/ܺ.~!g+$mʠ*mT@}魍\4P8Y32}5?5 g3R$ӯ"%dYY#ۊ [#ZK]$hMBI#ο"?SUMǡ>xͿ-n3B~UAJKnK >e>+lM#sVWljت)^Mg]ƤyTOgIr՝N?*tkM:P?8ĿNIӣgo^'3\@sѥFNմ}asr-d© Zz bKH-jz22 : ּµډۗG&aZF^te|HY6<Ҹ[k=s \Ak<#=6uWxnT{ViRM7CG®d. 1s^6-_I\9i: ֗'74M4w*f˅qU-vF*ₜ I8sgc 5-2uϛ*q8X{_j:O࿷C/P~aW<ߴ$p]]&w9u+#8uz=\@*ښ+Pڋ?Fu6W6ugnM3Tc/@zrktŹSy;6g8`?|?bҵ7y"XUk,M M*u`+J=PP/u 6n?k/58zux*X¼ d%6,z:}+ҭڙGGЃҽ=x 5sQDڭ5ЉOqu}wr&ĕ# zz!8o"= ҧZ>Jr\_mMhoLn9U\SZzH]J5a}oaWᚒF~sY(iPO##"eLfT%ٔoA0]oǎ5C ]f[:rH|Y!ݕ瑱s-&CT@ =sTN4%?{>uU׮~΢Oݥ p8ݟC]zÙclc'^6zM  3_4xuI|L [ڹ`+UB c➅/nT`?tB̯]̬I^xw*w½SOu9d1jԷ{{UY.^,UjB8t6-v_-!#ֹۋd85ihHZhՈ5O60{^̬{40@GAZX!,cK 62 f4kG\{m^{dњ4SzYǔ}+2KRv\j3>T'm tl#jRj$NYT$gsuRCAvk]>i~FV'ovve84kl}+hCz]Mh9[qf<ŀQiڼm ?5cN早;Gr@-9da"MO '8Rړpw8 ??WWP2p#L [gm-NkǑ:[1QǭWO`r۩&ӝN$ HWAPƍ?+lni}3VK +hr;AH E9XIs:UH ݙɵiZ&P۱n]i5խ;Z .ؚjCRkGʎ1SHʕ^3W/a+J6ނ}k.^:כ(89E[սεliıyH>@XV`b `H[llZM; js>ַ\ditQW|V_ :hͤ,zl.I#ڼƌnV_Y{K&e+ִWx27QP֝"3?i2Xq}|A'N#tj{m2@73CԶ^ESlGp7O)#j3 K|sqn%yr?{]cghzgNɢ:cZ)c0Ta\g[%`!% .=IB5)=ц,d:ջ=&G.;Wg Lv='$F%/5Y,,?*++f3c'f]=W]혏48;6w_|P|Ωڶ(Ӝ=~KcaʇG [Z/xEeH]FTghe_9%O^i^HhR"En;/'ou&Sovq/fwXA%gd,:|5pz۹PB9߅nKs IOl+ʼ;^i4vLʘ2? Q֯hSPֶe%vV#"2߭~ᖑ>a  `C[G#gOngն6aTAj᳊]UXsF@TmZ)7yyOi|$7WF㿹sF ݖ e\ g*{Bz<_ᇻQP:C^}+jQ8}ڭyPW?Wx tOTҌ|<']OLki%$P2A^xU5(e 'oˁ8m kkY<ں !r33^jxPVLψ-\M[@Ff>!E/\R"{ȥ[F^v )pvR5ȗۉHxT Y0ze\ppһ4-:\҅Qv>bHmQ5j,1<+6ol|8.Z[MB'LԏW#qh:iόM^jf_ܡxbs\*:@r|-C#nc#of9%XzT/$_?xwgJȏQs jFO_4`Efj:&ey;?Ҵ\2STSPV,vkXrI.漃5A}mw=am9\nF^0t9,RéfVs^! ^?{!v"\)uCZ3X/S?G[s chY,Iqig)l~ZзUUVn:Di’jV^W`V@U vf p]6q/|͸8iMcKoi#j)3SXb3zbĢW#l'" ,JuҴcڤYv*SU}Q_2"#uD:j[HG5bQ< K5o}'+Ҥ71P9v `0!>]o(}ڣ[ AvMc z5H$Uʰa2g_ffbRI<ǭwH0TP*BY#ԁG0N`ثF*ŨSrEvFUk. Gԅq%f qVbgyR,(;>\|#"0L{yYPi5I1P,CZ^ⵋF89gǵW{X`0$)ڎ~_֗ dMr ԎjhFvV^?c4I47\oibÝg9V]@Vxm2"Hջ09GCA]%ĻbqoL T\/a'n! x;ղA\bOdV_@jՓHZZ5:U'tbws.O=5XXʒp.FI^Cl[ =j̐\[°* {We6mfj7)lĀ$ҼZ]a5j̉y5KbiZ\2)P;y{YbA JrfV=0B6:W ؃کnW]#yi袭 |[v4(,2(?40Jt'1P@@oTF2Zm-mRF| m.O?EdL`פn|'iOdNzRKc_L'Ȼmc7sxN`.Sy9.Gqr8:Tm=:-*] uR<1ڬxin`mWQq<׭|i̚;T '#!k̍؋RY},܎J 0Vss˶<34kt䳂ķs]#LDۆv>X mh~Z4~&Ll$j_t%Ys)5Ns31;&9k^}Wt V1k9SbGsڹ9z6U^NVueoQ\N<Ƃ_=WbL$:ԬvO" FZD}2Mm ֦XRvL8zuR,#ojCe_I {);OS*3]l R HEr0:_Iyտ[٧+F.? ܰ]V".0wA%yqNyifΈhVOº[^@nugrKZ?׽ HװTڮuK3em~T__rkZAxsW2d2jE8kVr1' m`{VaF ^c_Y[3,1MW⽥Ɨhy.|/'Ŀ%KS6~z76gUv8jXzpJU*.M?au,V1+p?i:$ [9BpMϒ:Xg nُ>T,"F_#gS+t?$ 2XK?Q$Y?:|Wkt;1I*sRÎүx~m l?ms"ҫ3WAbU2+үǙ/g/ހֽ-<_R3lM,0= T/5P2}Ni4pWwo:Lh*f D6 !1OiF`P;.C2m|UyvN WCkSG.w6;V$ГNݔcѳV+O*GJ.e@y\lef?SSFH,AťP}3Mh9eA($wYu; wL0  ԊQ=N H sUPV-F *z Ҥ"l3~ J,z{\2?A;Yp;ҠxbII#'ہR!V\P\l ~V"fmܱ5Zi,J=< `T[ iU{ 6MEFL#QH 8E;J09vn)`Tͭy"<0Sdy4#5V\V":sUQra6zvx1FrkZmT ɗ$OD1tm`ֳtJR}nO.9{.J!Qh-$|Lxr*s*JTx-DCVВ :t5)A"'ZA%7635Ob\Tx}?2o+ZY\yb#&o+,DC\S~@nZX "mYmK L9xy- E;Y[=jEvds] "EAuhcut;/ ;>0xO٭(#Jobkj}q+b^m{I:LP&&>ۆ|$V-B1 TkOaT~'}FI'b$U?+>Vd?5Ze/%}ɳ g|gc +iL בh {D_WɷRͥ[פH-p$hI;BirӴb rR~f_wB# kJX؟2_|7Zf Ϲ Zj/[> mk֝b?x8Q^ʟ7cn+HĄ^)4ћVg }Tc`^akcqv'{Xzo٣5oQ泇FH鎵r1^{l#կ->S=Ԓ<4e# &@b Ǐ:hق:|SI%躕=>&ZM'T0-GlTw:写n^y"KJ@ω5ZZ`.5 N9lSOFtC 9nz7-x~cm#YCU>m!8*+Ve f QEvx+JM9nE2dazWHm>)Y TSÀ8+:ʼnUɾiv8$:ֻ{[x6u&|!j :P. IRT`Æ4QY<564~j|,Lw cD٣KkG%&)c"6f'sY;E&yƼqފ*BԈ@S*6VRB|條 E+5JyYb(HlR3XE2h&Yƥ(QơjYH*J Ry>Mq$QT($12O$j+oHS?!EP !Uʮ\.G4QUY39DW袬} NBn(FF#8,nG*%H[RX<+JՎ11E"a|.{DWzxhLW8sGE^(qEmqlJEЅ "22}bx"fPܒ{՛K 4QZΫ+lKJT38Q^/+n{x潽ZR\vW>cmP>Q^OC25i Esk+A:YY /.'/1\C4Q^g*"=/h?l8eZ E|mOSީT9ZbIl1(#z7VFHfaȹS/ƻ&-۫G@&(ٝ=͋͐XX-̛ L=)XcP*8PNE]s)r&b={[ȫ;\`qWI\cniC DԦT\8Q__F{fotocx/images/fix-motion-blur1.jpg0000664000175000017500000010515515247006660016122 0ustar micomicoJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((p" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?/]ruSdX,v>r~2ubM.]NĒ `?2u  zɟve`ux-7|B==B*uItH,m,sxpp3+JOi~H|ٳ}}-"WRPHlDqY2_c YnAAMfL! "#sd=:Tp#q sZo{quru5r]aձSn*T]ՏHʼna&iOvR'm9z1 ޭjy(S*Qvs:u 0$1oba'i# )}k[mv'TSI*I]Ŝ+9}:3@ $'9< Rhw@5u!ey CFne $p5*\E#~ ֬_=f6=sҲ๋*=XzX𺱖%?.1SR,b9~nOZɖp繨ܣ1$m=t6ҍ0abA'U '|X3õmM46ʻK/CATUo Fi8rO03cs뫞QN犎9`Cƣdon '$A+:8{ y,sZQ@DgVqq&9Tf1_A8Yٲm2H~f9QzV]ޭ+ݼv p~̭+J#*rGSVV9ei"Ӏh{r}ߥ20+dnzt=DlQߊ%;X7=RoC)BYUwMrq3m2㡭wy#0\*%#~x2Gd`O+ nY{{։sU.H[]I!A;Q;]E2&FmI; *>dCxH`0 Gj g=F+>MFqnFBkKaU-|.jcIr"svTuZҳH̟(=MuF U/,<Ƿh=dfL7ڢ)>OUd>FU܃[zmD;|`#e'ns)GR DN n-BBId~5{GsIzv\ ;D`wY\ѭ\ 1֬71*2OzѸ1M+fasUt\ݷO^{M!̰Ӓ}Ǜup8֫#bDQ!-0(PqX }C}hV2IrJH]՟q  6ԏ9А*ֱ.#K$@{W;m t.2}2M$m 9݌ Be__*x\cQ$*-5đ@qiķ(ytpnQ4-S^p1WvHkUWQu}n&wʀ+9OҲY72>[2>KD B6+9nIe g5 IFq&uu{B<Ҫn)jz>y>fT4Mfo, Z{4.I&:yN0 H"y[F}]4y; v77qsj"U]ʧu_]3ȑsO@G\ttxQn qe <<\}tEվ >kҥY2L96Gu63$`r=k-R,ڟbSmnpWϿ\#,s΅x#T6w2R*y Y1n5fK'm?ŎbIl6Jr_Y:J$xڌx8ɛy^B^xM$:Rղ8lg JKUm*Z@㴫=K{WACo |m(U#ܳ!;}H;K U*i z{އ ;^^Us;A4\'sv71a` \~a$1A?ҫx}/W ?{)yI#W[k=Tr}k7J/5;ƒ@ ޮARw,noI2:v^8ie8_0wӟMӌsLѠ@ b; IdV|wU{KXO-JofU .崫\/c cK^$}kZ8~0*>ZզBF] \ʭ>"lVehiNLqN5SsPXKu&0rv*i&c$>Q<zU4>qNZZU*<|x]fi !Rz QI;SSԖ#ojчfYv*m LҢ8U-ͭ]C>Z1me3:Nc}j%-zfln+gi1\Qnzt} ]6+ۤQ'ͺYOG֥$qNUTZۮюkh-PGXq%7,JTRw9 yI(EozzH9UE-c+Q[XX{}k).*8Lh'j:T/0cBq ?7rQ>_³i9[z qWhۅ!ϧҠeK oGpF ;S+$cAgE41uϿ޹/m[yt~׮umrhVn(JG޻OSAERvᇯZʡylyZYͼ7VU*s[4LfN2XQN5ipȁ0 'nCW4i 3{ xvk3pxU[[Wd9rs1QmN/`MFsYy;AkZphP{LzjYM^w>h?JGZ/8n};2֧½[MiK7PCljT^ZaIsetuRzET(`ֳ漓~|Tڲ4yjJk^޾"e+N1\KqW,_ Xr2\D21cgp?gfljF Y oxT?8̧P8# V}yq `řt`ĩsR[=̠F8ǭ[Q9&&)ur@QcrW7溹jI1UݷcV%+K!#N_J]?Scmn$XPZLzRr@{m!yk* {p G&|8HLA+>.u1 T\w4\06 yv!ڷ'${Se]82Գ$QdEm5EbD︠oSS%̓^2[h#5eLCc /3MC`}})"3f$F gpϙp77H`.to8P 'bawGlr[˜cgmդ[mq F0HG+CZrz#PqiI"݆:ViIʁA\v睊LA4r պmA;ju Ezx,PdQ$~izVi˦xNIz 'WMڮa҃^%pZuM|齸#p8LV#+61D #?jP$dXt$ErC(*3Z)| ڜJ$|.~cΦRJFH>2m" vJ|"7G?U"Y6(h\_sn0?qWQ׵7٠boJ\S*'zAY.w`{wn!(Pin-71y1+8A3ѳ gqʤoIHTddڍ*:SHbQ_8V3Z Ūg z|ΰ3<3׵Sk3m|$LX;jlBK(YsZFG:S.V89#+V@r}4dE%ݹ8=Mt0 E>Ē4H0\V8@7z犖O[&I ʹZS"%O˝g&m(Oޘ^<1UQ A `뚚Yf>h!n#&\[,o =; :ԂZt>^zDJAOW1)inpsSYI ͹Un-!Qr}{p 0Pp@&C$RL8{Ԗop|} XurB,0sqg&lEzQw<õZJ=g"6\,M`8=kz[՗J+&۔ 8jg+e< \3_Zmm"I7^OJ\CۊێW=M HHac̣֭JӰ,lՄpFjىX8X]}zP;ش΃Pmm\[ܞ͵זc31zsA5 E`yoaShculƝnt:+Ys(sW$l`|aV8G8YVp՟C|0m^yvV#]ΐLgZIv>E|̿RH2|/YԕΝ3.'7,*_js+gmݏҴ//)b?ګGj`lJgpsB)r61?Ƭ[]#¤=G=>$h2$ks.@|U[Ewa?3N{Ɉ0:gޠ-EqZhХ~ԋnN~uݜu=|%7|M":nIhxܧk/%K)-!8Z>pNp[,$_)I%B=nl㳱!mX`;}i)r V[ܥջ)q\}ƃGgkd>zUӔ\ueM7%-rjuiʬR'hW;krY 48ċUaڵ.5-HS٘v9aCm\5@,9oMԣiw6 ֻh[|"c$zeNJn<_CG?2u (۞}kj4Gn:v;t2fa <z2[^x&'ucgWYse 1Ճ6p׆RIݾNz{+1[-xR3]y!YMҴt3I*ޘ,M! ֲ]om}⋀ucMr. O5&Ȱf=֩$RrFsf1Eؐ6wdѤ[3Nު,=}ױEt"5*[w݌=T Ispr;߸_̰lc@;Qp:ځˁըlqovRyF/~y4mk-~P޾F^c,ݨ9V?e1@s+.չtԅueHɪzeŘ~OjRZlSK٦u(aT>:驦س@77V"czuD[Z2]k1mUͩOtSs1 ڶc#%g<Սbe a[`PrO2R'R[m/p򁃊v΃w99]V+t   g,@<K;CK8f4z?j.<{gi2#Lc$l JV.GDZK Ebe,@9>g+ {#b>͗+ЌVlS0UδN2{W⛭\_g?[Ƣ[Ҕo\y Q OƯp7r翭Ht?2` n6' 19꣦&VGq%60{'F68O G-}acD3"[sg=2[v6~#?OJێP̑ںl&sA}k#QYSdH]}Oצ+ RT~c7mr9HTpy=?~7Q~+fJ{zJF .gnvj˃')vo-K] ter=6 j̕V!GVU)դ2U\b.2S5-"}i;ڒ$9cz|V[?Վ?Ji8 vl/θd/>xw*.ۑ-9lϭMH%̠gHvc4V9Vey Si6ig(:sqެX[3t`PxNCeq1N>lz{Q0MBK;?z•kR)!U=s5rF%[sǽfYG{tX ǽjV[ns+a5}F[j`B[i<ֱn$l 0EYV;rQ6Ȓo v :RQE=;V~,g`#C%dQg 9<'K]cήǪ\ԷQ\8"yRT62kB<sZqv$ 8a5R`69^4`X'TL4w3Ж3rqM^-RsvKW$ %yU!; wsXEh/ i0ngk4cZ#;|ѩ x=uֆvDS<3V1ZYЪHrsّKbvKXJ}KvF1$ ޵#]G#k5-yKF[w(=jY,nO]B"p<<Jȴ&cD~#ծy VU?m =M-c %)J(8'5CYew1}6' YNJ{ F~^*㿭bj11fYlg{&-r:נxR;PNĈ0<nn&8H>t{-U(75U_Qb)'ޠ+ r?ƕEn8p*H1킧=)!7IN*+2hcgKx唺F#}ўޱw:\*=׉F }j3NM}͆l~Cҹങ ;WO=<$nW*/V\^+?754j"MHT4jT n!IBV QԟjiZj=WlNrI*܂$`@z(-;Mt9^&{SN4#y#㷵Ji ڟLqvsƦ8#B&;!V (AּZGdn}>6i 3<} S'FﮜI- :RC)%bSv"]*Yy5nk#= qMK˵*\=ұ_%8DL'癎7|V<,\ΖyU=a^G\6,P~lYWY9hwzcg' }*$UX+.B Gw8GaЛ)jii&'hD'}ZH-t% Pd 5֬iJrGtFosHd<*™NZGql#޳Vb0xZݓ ]pXr%s5^Di&. N+bvHecg2:㟽ӏb\.X>~˴}kɜGDFbQIhI6K3`8?ʺ ڄ: \Ƶ$,vqҽ1B0HmJ*= =-.ZQXg+6.eH[ ޳o^0#D0icP#)TVgmNA_(gEcW8sJMP!G,EgH!$WnQM[yhؒ@I5y0Fj:-Ut}ź %pԜs¹ _2F F=JQ c?KNN@U<ZbqԀ*J$`(}j'.7^zgҫ[X&er? uͽ!eGRRRՃ͂3+6k5 Rc#=sڄn7gfn ;ֲ3t)mn[£lI<15hVҶnv+x٘J'ZW ԟrmyM#IK^ p;Z)ɲi7W{ G풡5^æ;5LI0N6a ¯?uB+;zJa3Y,pGs='\ce\mtzQ%c0#.^[s9b[[tmƧ.!~18r}Nr{}kSN6"ܬWVBIssh4v$y>OzIn[pnyM$)?3H'ֺehS:cӱ󵓹5g>HCQ9ϿҭݫeĘ~nZM2:lY$l7(ozwO]3H71=(RRe&J/YMo`lb:h98?{淴t{RcK2?o/ ӱsZFI;xDZiZIuryC}鑎YFLTJ*XZ=桨Io-!hFf"Y}k%mDq"]:Xèd ct 29/7LdӪl0Ueu>K`ZIF+.eHI8ǯPGjHdf r~QSW#fX9v6̵NOE"D,G;qWioʤ^5j,]/#5loLtX#Kε0#qz+{f@vFx|@K+]TZk7MvУ՛PWr0pI#vhjkb6cuiv9ݗlҺ*+luNz(⣺/,ȿyz9k9gdP=xs\Ÿj{(\ ~~?DA|p?1$|Pe9(eʇBdOVv} I Ut(=D4:a,a|WM:Gj#WAyUdyl-!' {qU4c$$^j 叡[8s\ŅAJk|eYC3 deG|T'̍GsP飧KV$G[eGrryڄQڴ/g؎);7d_Z^ȇL@?Z ez?t>UO?,VEV"#pȬjÐRǩżCt)<0uy-@ckenT;֝G%2XCf͡0~KM{R68K'o)դS\ti |*y"PF ;+X;N=pkUf<=+8drҰ1#a: U'Oұ=Zk+ >^ÃW>bQ{z]بx=;YZ̔}=BJM_0,1י I߆>sk{kyQ,u;kjGL6 # /Q 0Pq֠T||3g%#$S1?1H`sڛyrnj$b9`8n93Y5>Ίr8`=}jMFATo^Mi*Z& ܽ8i!%u@5C[ِ.nF&~.!v$qk}ދG]c1]j1Ғ𚘮aŃd^'6e;Vt NzJҴYW…۳jE@b༲Xc" W}I1V,\2FX3J1bu =1Otp@0àد&=$nJ+Qu9)#v/ ̞N>_|*1IdW8Ui]*?+Zg`ַ ī*ASSL,z9q[*i=O9ZKX),r^x|Jֲ NJtz,lyKta,C`>:}4ĒF犛JD^6Et_/ Wӯd+Tu]>WXܧ >5)(MjF5A`ZKb 0\ \z #;%:qzOrn*aK c`rG2jXU!1gת%7++O_m21@ r ^g<г2c+J{6JK+9B _2:Saal\}=+*QmUЖgEF 8Z\˗RX`i@c&ӼB8#u{]zx7 NJwjuK \s*OU7Lc7TR%XC$y ҵ)dmޜfo.@\fZ%O݂HA}+b9q՟ڵtnp87eJ *BoFa ќ4sU$I7g UEkc_XǣIkh6*Ws^+s3\]Jy?w:m x'3tWMFxCx(joEٖ`9{Tw1۞BC=~&8+Qu'䍘xny >g$*zZ&u 9l+q,0?ʭ}fⷴx^9q0{5pԩcZl3YЛU} nO`{=&VNףkԭ-|3 K{Tc;̞*߀~ =Kė |pO|V c,DySI#OSҴ5 ƽ73\~CȊN;=kῊ˴qF'+!cUo35K`5b_x\Kuh?]lK<~CėZj.OL/Zl(" %"[+Sե98uPѾhQe#vڹ*A* acu\o$9Puz |#6 G1?3vY%-As 9ģ Ns\NMYʁzP͌ןZ3=4YqҢpNA#Nj'=khmǤ݋yվlykugUTWj|ӷZ|e:ɪJOkhNv]RP{*#f`=+՝Qaۗ=9ig sq tF|SPv*^0L>Ru)pqT^MJV.DO ;z"($}j彆$cΝ#H9t`V%$6}&[땅LyҶFmyJQ𬬌!\OoJqeN@TsjlvH>}+G_)6{q?~4~jCP~zW,MFG[^]dtbazɹ 5Vz3Z۫ƪ{ 4j `:݉ `\x>ȂwA'9'|Gbڍ`sݏA+#KT 'ݞloF~-̧'T- -aJFKfGSTI ,qqz3K*FzDVm7wbYL$1.ÀU w<뚅Ub>Zq;RW2s vŢyXH=*? ^>.߁9 kIu !xlK0w=s$rطkC5蜡?I[Ŏ=. #c|OzwNh{ )ʸ䃷{O)KC*[w'SZ+JUtK$fi-Jc~~ J[E;03z0Ry$s:͔.$C.¶[ ED LFîuPJǡ҉`cՔқ%r'8Vׇ~x_G'渟kOlENKv$J@&j•7F ^Վ%+|kR {+eĆr}fм/ Z}2\yw,zWJš<\]OP*vFZ$eF:ǽsW,ŋ&mڮ=0Z&=9\59֣IE\WAPI:ׯՆ>Vv<:OAЖš 7cv9r]()!Tc`/Og5ćg9O]hrsRK7NOY{uh4x`WA]W¿^Qrk#[cGWޅ]?au=rSR8zt?ki3)W.77^6k7ZW~kUy2`ZX*kK8f`ln}3Mma* 8(4ki'; + #D[};WAKĘԖ}`+Z(aUQ`v}u->F]O%7s'rxxZ;=8&IXૈ^x/I>u&z^g%2lcGxV8(O^xZAt]~ʎ `+ #?ң܎A \rz֭iTqӞfODL+˿1ČN\rW[j[%ڠd?`Mt7s$sI ZC<rH#j(m#ścZb&^y|?+ԡݞV2c EԱ Iprq8.;Q$Ip[K9u1q׭XH9B {<^$(8=>| $,jH4q=ȿ qZ{&t=3|Wg0eA[rmQ8$zH`OIk Z 2, Z6 5:sUR" dOҤXdƠ(Su u4{@^aBcd r@>dA5v+1WimOFrpolgu ~1ԣM<w>bG'jڌo}.a5̊>Q#m\>']}i[džr}OC^1ʵMQ\ᅍݣlpHhRl][~8pچ[)ϷC^EG4uԼc{ׂh\ʰ9%OzIsk(o& r6;4JcOkĭw(,J:dHprꡑ<,5 ^yB'RUr=4;]-i)*G3܏_j7I;e7l[Z<:#tqx7.ҌA8kPKQ3 8WnJoGb$^ScZ >lZyVRbF6e:RY xQjH>,yϥR9.$uYZD3Udcʨ[i^|J1{zVk-3q*8'=~2M 4<.sӧAEmFpӡ|U{;%w?^ՅMufpך,α\9W/-`ݴ޽Gֵ7xcGZQG 6jV+_.ZܲqtvQ@dN>Ox~-O^MGVB>¨PfoӬUW#= [5'ӤN/+oy:=T߃?~.`:GJ5UU Y}I pGOKcbwj 0r7lXXHF5 #9+M֮Csy<(R :\ #}n{Tsr>jcU1fv"6iV+Ḣ .l9}g'/Ėw"\ k-=t@V݉:郚* >Y( ^:`gҵreR8X$tv123ک L'Yb;V<"Pś'skjV=9(η/|M*ۯМk>٭7WB:勁IkӣԠMŒt^*ڞgxd[{E?v=9}\5d @z?ZA,n(^u|JrHҺeg#WvїicqksE\?iVz5+MY܈qx\kH鑗#X{8ػkBſyU= /$Qpa\况L[eR ǂ{u[_n,}?±fG+*,e-Vz'8eqԷ<so> $ۦɌ=Q&QfڴvlVQwGzSeClRZLxMdc!KvXBq]NoxRvd qk؟9}OpWGCX?WwWSB\ k*Mm&Ha_5krSi95aCw2\xgh\}U֌P]kxNkZŵfC6c1\,TO_aYje1D ǵD㱒a\dcOW5=iS{##Uonyְlؽa"2(>R+J`}+8Հn ZQXlU'{]Tdh|[eЭ4>b@J`68\uޡr9OEy8xֹ*=?Z;y5jbq8STJ֠[1SR,sZBq<ƺ2նAڒ:7Az&@kulgoy&:ʕFo]DM@ '|pW-_hVϟ$Wt;pgfWH!xwMS]/#`yι[R>^n-?ʽ9c!804dd|Vc\Y$N \c5jֱkww#BLy±կkjL60LG|׊-K|j]DEE:oCQR{yBnFNmY K ힵ4x!qG/58jpffc^Vnb. K+2h˄>ҲFJz#ۋǵY+dE ]8}Ɵ $/0J\ОԡknwAܚ%!AgOhu ;V}ŲGӽ.TLεOJWccG2%(=N+6ci 0^ 2W@=z8vv6~gjƛo<X_=\ZV"?εR U%s8ʦuƯCKGztYݣ0ݟò;INb^X,ˁ}¡ԋ1=zUn#;G=E^krqN)Z9gL)5NN)V5v8 t[MV!MIxJ94Yd At#1]S^pp{V'Uc?89UlsԅGג2ۢ3N'+XɊZ9WOQZ6 xKO{)nuWR\ݵ졉@1]XN6dR(; yޭZ $Q6v确7}RX-3υg8;ׯxKngTnGPqz }wժly.+-TBOJu}zkn?~*6{uI~#^ڏ$Ky.l'=sߊ0q8#&u,@'g>y% :UkE sdҮ_ʖA ?&6L=A6#sW.B׵aG$jpqIKkr.´{qYF}yaJɆtr؜@ Fwsҹk\8CBst¶G;8$\Q W:bob@;zI>hy"(#y=MOSzzzi5XBb8>sj"_".wRQH\6^uV&1?W_[e՟i`R4ca"IETgO[SDvW;vF9v'ZM09,s+kho(ަt r4ϼ%bPFt³1%\(N1qP;0rƻ̔0@f1 {]˖fJ&+9Vnp+N(ب2xycҮ;^kG(ή`&t4VgEINk^:rO^j ؒ3ߦ? 5~Aҥ8?$ߞ=i'`ir:渏؉]{r+yYzܭslʃ%С]zauZzvTQGvVsO uڸ+[v~zKjXՊ m=vKQ& LW_c:2r>oOJ-q HQ*뭎N(Ą$kO I{r3uM0?,GrMOFWyNKkDcl;xٟ\ֿ]_nл1^/% ,jKWnn. 9{ZSgNU/&ߜȼ$!(Tu5sg)㘆T>.S{c$TI$?^R%@9bNG=+ ђ?Z'#HA~O^?hAs/ry\pջ{R3q3KMh0Wc#qop'ձoz@ #9S4c̫|Z&2F±n<0`t흝&>i3lVL} .yZ̳?jsnz҂aBdoݎ7cp %Ky2"XSʦ71VѝgyHcұ5]5&V]۸ =e2r6zݳգGqZ)+CdT?Y9Lo*x{mKF`Hg{2ݽz}KcH4Y⑚%,=GAi"sJɫѽґ򞽩6O^Es啹{IL9?k#=1P^U,#:UypM6k}Mq?py?ɍwcsi7 Hjwe)$Q4o:ͅR}:^5D nJ/q6"ͅ Wu&mMjl+{v1Y;dm+d"]'utlc?oZӖ[V('MNhĶkp9HV5vr@kaȏ >e,pbq5*FYȣ03sʚt88b `A*ȧR꡹̊сqEeKtv[qI vpxt6!):FrOEҦ@RkqKr,8᏾:٦HSi'|cUq F@KǮ}+icuoO@uI Z)ao_UƟGf]sQ&xÏ5FԞmEj`>pNsaZ\Hu}34nH#^v-F6*%kQHfxe&n~3Xz{\X1Z+ffb!zU}B/ T/MX㻸5ΛBFs|ߔ=k)tfԇT5sZ?7ǀXQ)[chjnMeX`dadN\F@~U/7C,r? [RI/)9][ >SKOSүi.#jzÂ;5ww#j-,ZЯ[\D]D ɢ[3vxFr}ޑϭ]O.>Yor}}֥ʰ Z4Ka., #A]3UTepMJa$pL֓k@4*;cRtz()3}Zt[\f >߰"b6`=o C[IE8iܝt^LW1ڲ5'qn RA}88皹$a㸨 su,703n62Gֲ;lm&tvrlrs\uk˼;[oTr Uyg;N9{ls+Go]wI( flGO^F>v*2[-2MSU 7b־7(TԚ߄V2 +AĞvSmJ%R>6مYv#H$y5ެXCh*Oֺki, rM,Q+'TYhr)axT*6Z]:8@Hn$Yf3ޭ?y'4.pO~sNV]>i`?Ƣo,C;OW޵RL{0QCgIc{gf$d +{zcsu1@,;{zzsr5I1Z͖FU`?y֩hm];HIX.Zw?woY\( gw98u0#1߱k>HtQ@h jप|c8\sVY#<^Vz#,ʔy2-m9 OcN ?IZݦd FK=OaILHԲnAhyL j6$pߧZ#-*s\1* yj.:=;[#yZطK}p*[;b"FqZT=kKd=zӟn^9d2ڝϩՃ:jrk۸{%IƩKFYx<*ᛓ|^GLIg@jjD{X[1ILgO9hA1xpۼgB5#5듟>LU_%+- 0Fq֧EH,M8#EV#^5%誹'cVD@'.K 8Ե9mBNYOtg֣^XlcU0i#>X3HUCDŅ]·b(̍{;/.Hl0z 5,1[W)=3Ys^%xl;˖!c1-åܴ3bF $ƀW)?ƪINO*]zAp_1s[ӷ94ɜf=jgJBi^=멤dkXX#!APk1ɣ872N;{}kJ_.lb8p]O6Y ucGRwsoLh۴׋kQcI@䟭T7exi`n{TFENP,N36/w*qpGHJ-{{Dfi]4_0zScgӴy;caY>"mcOj$hk6V{n$zBzpNjojP&Es3Q:Re{ @mxH P=>ڬ,]J+x8օ;Ւf\F=5IrqM,p<ZȒ#ji*̍OO12sNk }8j I}M_ht u*(=nojeaѢkXA#w:>TES `MP֬Lc~ÜjE;H xgX2<@)'pzhh 9?ǭhuF*0c\ʎ϶{S*DG\5^ZGo 㯵TQlUcGS<6:›!i|+q-ҖgS uN 񬋫hm0ہG)]LJ>N}Hf` g^)oGZ5+ @;:I4Z9(!U gv3W,ʹnoU; yd 29'5cihܿ܏rѓvoI Erǃ ]s#DžV=2ޥHC>F Zsڳe֭f*r7+(=I|+67׫̆0H$qRZaiTBeŖmM~T5SވS F:Lp1V"wS}<~(4lo/}.L6?u[y!WJ/hgѯI#MF;Ɂ|F]KLic@V1@jKA2N$SW+ZI9cc[31R P3O^k32D}:H j0xcwZk-2ɭGupzjt}}kr8 5t=Vl21+t%7(;c5}ԳoոZt8p>Eqy^7b^-'%[Ӄfʬ2xՁTYlGDrgk;Dݶ`ٙ#Y-ۻο."aaUۍZsCsȎ1=Z1kvflʃZ(STV96}}<1D1g>9 &?R+Fv],k Zb3 MoĪڜd>ґ{zHDPs4޻Dkv}j=kNkO< X|SPj5S,Cvɖ}'6SB!;AW<{6 g&ؼz*W݄,NsV+:c>S K ޖ;qw}vs޺%;7,zڨZX"J^8n}}*A_ktvhBdVOkyǿֽ_R7H(9 ȷA%>J6"SOc̃)52yp8t>Sp|\>j:m%(Q?Zƒg-hu8aF1!o;Vvɓ(ST$}ErNbiQufaa}OO汖-t q,-ۏJ4#pjI 1 U9X zrWcnrO!!wcy S&";TIk;On'c),WolRrz_7O۩ 6oORwEV-(I8UTyxtwpIí84|<@oo?ɌQ}=Hsq4vѣ2D$Itzf $x9fA9˟i/2Qجo isJR%,?Akqn7Tn#H'3z))jq Uv‡q}[-_aB7v [tKqsU~1:Ω̶'̤1Z;d[ SnwZF=>Kl$ @TuEMnPmQ6ߐXoV,>[;PEmh#⵾ԗq5B҃&БvIdH!zVKDzrRFcUɢirI"f7r\\B cJbqΨv J-@BrjխI1 ʮZ$"iznrIOz|C2 1]~Cx-ZݻPx>]w)I4O=k-[ s6$R. 3zٲcI q]*ӕ,tqT&ݴu@$[˒bƺ93+Dvde#*S] )F5$&s1WsL>yϨLdggvV[fm<F&==&94Ti+ݰL`jl.Xs^}kJIqTbSSdN+CJIV$`*0]é$d'ֳnE؊Fg+ɅxO:b _HMdSAQO/󪺄Zʢ=~Qɭ#+/ڷL®6˱Mi&fVXGAJxWc oUP֯V8'NZBڔZ1"SzfVkTŏڷKkv0LcsU.!"*<Wkn7Xt: Uk I=]]l<˖qI4G? 7hg1M_$ꑤz>{; k"xGYʙGq^xE3s#\3*9$r4=lmόe"uxbZ0LTdyUF1xX:j.N) 0ea?IF2\vMtVm n3{T2@\Q'ʄ=7sN443-Gę(:s- P]~c?Zx[TI%IN#v 5*6ـ * Kpa#1f#֦RS#{ ?Ωmu(c83[r^2g\͔~tI;q=o%Mv Des~Ip:JKH{ؾ: "_aYԍ(~D1UE[BdW3ϽV` 2lp>n;O]GcZf)kq4]>}xRW]`D$yj0[Hq{V1Vfzڢ)l(̓ں{zk|.#nҷ,rYmo)Yo<,6~jc˸9ިCc tP7ETj=WU*(x¹/%B'> m";k*v˓Rd 2\+Ixgbw6mF0QYSyM41m}CP!\QkVԜI+9}%.#ZZEo'eqQQs=)I- Eҩczךyz^3 :Vrt!;3 =3V^ooUm'?J =k)\4cT[A0zU=GP-"Sr;U5 [#&;6eo}#"RP*qvz߽hh\1z.Vޱrf8m>JϼD# sTK~_AW7m-<`^^y?nN3FŒ:B d7LJq[Rɖ$$E~ ?V=hEkiIQfW|ǖ)Ȣ vD"I BE 9~ho^QŔPwm3^0rŰ:(L!R]U'T=袲{ׁ@/duWUbwJ(z=_ǘW3 ھ+hsyqW˺ަ+X?P}+ch{ns> CVQU(g"#Au3B?5R[EYMqČڄ-Qʦ+qg ޵'`QEdf? L$+9l4M?2.8tP:if*H8QWMs\vT gO(E!USEUnrr~QUa~e@yɭKXcWU=[D:?Lq#_2klgnLyQ]= eP@"%'Ҋ+d;K(Zj12 ʟtĆ$b'5y+6QiQec t$H@Er ]֍o ~TDn(_3vf UIG#Eh(9;,OEq19rkU(h9$'֧Qdwic+Eй%D]N#~cES99`7UM@fEĆ~QֵoETBP9c\QUf%@EeTqVΎŬ ',iTXtXML:com.adobe.xmp 1 2 3 0 0 182 266 1 x8eXIfMM*V^(1fixHHgnome-screenshot0232~0100fotocx-26.0: Crop: width:266 height:182|fotocx-26.6: Sharpen: median diff 2 14 14|fotocx-26.6: Rescale: width:240 height:164|v IDATx}uxTWw*ZEZ(TRZ@qRB OBBC |}~ݓ3 C3[$>XEZoK3→+gG֡կͶWnϜL G!`ݻ //Gaa!JKKq}N미sTm)..ݻwUξcwU~jr@@SٕMՔD&xaTV7P*ć} 0w23毬:83Ԝ>h#g -11Qq(.!42@TYǾa9Rvf̘  !!qn_^=]_ԩSG)7r[nܹsذaJ{쁗R_~g-FѓHBW+Id@qsµ0S62NIIQұ~hР:(RƍϹw7h !QRhӦ 4iF6c'%%v޽;͋YU.2ՕY>.p3WnݺuC˖-ѬY3=U;C@Yiu*P^~|#FPRy?SYK,Q׿,L߿,TQ>oD\P}}z{Z@u0oeee;R~^ syf4mT]'MdpbҰ}v 4H?()5(;p@?^^O:ejuLIEs}>KSLQٳb;wTN v122jgpU)W,$xgMfkժs^{ K.-*Zk׮غu+U][;wFlllV+`7?#ޮ\R4r4f„ $$;t~)6l[ocǎ߿xz0V`jwU" 6?oVRVZm۶zjeͥAPԩ6lT}k?2]!TU V C&Hl^>="]3(UeL ʡcڴih׮vءv6mڄ֭[c̙J#S>/=YJ7|ӧO(q!APrqI޸q$vS?~\K.8pBCCT)Y> peIMMExx[qEe Sٳg'O>0>\t ЊN@jMNLMf|'|Z9!!JQXR*jX=22RTŋ#>>\г0;|e^;JI{G^cW|dUpeu= Y!Up+ȴ;AfLLcyL.5CT_F$UVY5uk…*ÇM{f?\TL?$FPLN|yz7|/C Qk7.HT `Y-ś⫯R6T)io2ʤ,&. $f|'F6A{dGR[ͬ0g[4T50S6\R-j˵# j) ˗|ׯHR?܃1ݎLC矍"CBBp?L_}I%iAN))XBԩS! k_JG-35q%3D#*/qIPs `JˊyR]ecDU4Xq)yR 4JQnY+@[ϔ'NPR?[[[eiJZo$(8xwV`kLhL"S 4tqIL$7xCuMA59gy:h MU`J23V7o{-@UT @Dҙ3g}吹US6m< +2b)UCp94lRfhl%VT:R9 N `ȓq>9>LC5ZS VFGViHqiʯZ:*c94:"*U3Ua~d}x'c)Ty*s``L[rb 8Rd$ħ۔3$bZٶ8jϱ J\gL^,ukϛ築ﬓOTF *!#05w2BK ` 3zIHPa9O!|YSou6?2|կX Gғ ғiJB2U'3`? Zթ ".oTߞN<\TWu-,Lq)~#:]Uu8*:tW6g2AI S*JEԡ|5M&B ~e (M~y_Q;wwq!3`"HI$l^ [Y)٨ڲ>Ŀ[eR2z}c::z>}^N$}:::Rz>}^N$}:::Rz>}^ZD1i2h?2YX:ғ>: X zwJ'} tL30[0 ӥeJ͚7:u l4؂'&9^eJs:u l4؂'O)5krt%Ӏ` wJKH DPBq+PhCLgss`N<.UK@qQFtSpuK i+x())Vϝu_/oWl,:_!LOM5dW67q-۳;lK!WFU=z}k7cɳpe\RcU?\';t0Ң3◵?aXq'#:N Ɣи}7,\q_N7NᗔZ! m-oUCCPZ\A\Zg,6vؿ}Fśe1CaŖ*P#Gp8]BFNq|o8aј3ϟ3j`9#ug6jED&0? ^;&_o yX /7G`r[N{ )-BA~T0Z?) d]=wXYyRn\YZ\),/+/)(<|wWEF)/j+CFҤ壇G F0Xޫ>ֹ8e9 Qme?D|J0uw4!⌉ZiRL(6_8+672f̄lZկ'F{$xF’_ kLB6ocU()ōKѧSS4l!m90\Bc%EJ8+)k|ܻH a] [ɢcbF|db)-; o 77hvXz=\}ֺ!f94%r ?\qZY 4vnA䭰Wfc:{l}v SƍVFjAV`Ilp8E'֞X0k*^7"UBSZ?z^p%l]TZ`Կ=Z>NFx`āhԠ>ʖOz pSULRm/%Oi[|_вۗjHҢ\F:qIFߠ6lmԥ RHÌZN{<isl3ǞR*{\?b(K V00zh-l%FZq.rSgb>;rL4Æ àC0rx,_Aa(0YEbָmYF̋6Fk?2 2Fy{\Efz*x"΄$NNZ7n40/Kti/˄>rpNRUgD".6Z#_>#n L#:_y>ϰGGEʻp܋=;`:q.ppZ7[# X>ω''%"2"\NT6&:|ɟ`|W:0_\`Vunt%Ӏ` ri=KڊP`][0 ɫ+뿿|nu%Ӏ` UO.?Ę{VuQ"7T3Ҟ6{7Ť1dP;?oهȄ ]f$Gc/K0t8쵲GCP7,]8ƎP)o zgE=Ro`WЪ`8= qX7{$?A)O,=! ø)Jp~\4*5>1=d~qw 1^ ~Oqb,G*6qj/O1`{[I6%ɖm ޥ' D:OՌTlZ&gG{^G8bV hEǜwv6yN\bd%~QQAص챾 ^Nbp 62*8# $kNRvص-B/'`+x_ÖV1gV_^;` s;zP3qnI_ Тq3 U+Qe`8fcj7 ^'{z1v#!.FrQ1; G;kxٌqI~GK%-" IDAT{Wx8Ĭyq3U%5=Y( ,HX(*[U1OY6҈SX$:gA^\D;*/tYR 'X8>F|GI8iۇ8} \%9,sNf*dM*KևxrsG~! xL{ ޮ_{DE(AUx0,Ab!˽UWJ\$ajb>XT DYƀ'dI$I F H,ƂY#k|\w:5$V3b0chvXVa/k0g2ܲq91~v22˂=.ghl!&|4_{n+#@y`Sq"HUx0ZU1VlVHIJTUg)cVHsXp1$vc6g$Ν;{Y_/R3ZnHe0`ug,{ N};yϱaiٳWtuXn؋japBB+Xw1Rݮ!N(6h||eۈ*#Ђ1U,  4 Mhٸ>5G]zecMBx `c4 q`,|qZbMFD%/_x Jm-Q{ቕ KV;Uq9~RdX/gpo,'Ku뢎ZjSVX]1$V DX`x'}/C -u-9#>W?)M vIQ6,Vo7Eu8UN91z]tpvBіa_yj+X8eB?wG|n #$ٸ 0f8 4$᠍#eQz*X2{ 8ƃEpU|L5Cʡo`D9 =#-A&>ϋRoQgOSRCETIkAAs-PT<:"ԣ9Z/„[BE^rzTR0IY[Rdg"A\H6J^?oO-WmXqtǙGp <_N^"`-l"$0,,:_H§%("#THgqA9%3[USM`/$5"%ssq;%Y\ăuRbn gW:_yX2ul4؂'ϒ%ٚXL:-xt)V3R̒Q`][0 ɳdɡf:u l4؂'Ob5#,yu?'>]3tz!uy['[ Ғg]s0]Si5d`g#|}!uZ&|+IES(~mtB}'%3P =oFYH-6QhjU'|zp˻.mOΩrW.=eiq!@a,|<4w$_x/S޺ηIaޘԿ=׿NhԸԩoO]hpewńCo=*LHy-3#Hi}|+_"^bhQccOj ¾^c*F9W44#"}1Xk !{.-]S|5> iCd2b~F2$eG[>tx p)kę-Ⱦ pa)k?;k>A(4S=l%`33ZҗJ<@ UHa2{ BXh谯$nG% _1<2`']b-H8[fExF[elɈu&aQ=r>Luѧcc>3Maиi ,x w*Q/@wۢS__~ t}DhAx]:˯:AO)'7G/DVhDs}f):{1N֡&FFϲzφhw-6Ksv&O4/C2ކa[WC%_9p +e}Q8N| 1q0 l❦M0u {{DOcngf!%63ꄦ{ $Xq1|^K 8S'B&z\nJEr<^Ǘ'W !|?3zgئ7[6 |0!(!,$@`nA8qxNܐH{7Q{8ȹOaN~Ob#e$bڥlH`Mعm6n K^ȠtX l=|o6(o$Zt;6^qcFcذa5+}5t6W6""FjK7!*soQi[8׻8s]gQBHgv]*Ұg,4kG}E(S_}xw^頑2nN|L3 x Z)qLKA'1~[ U姅ġHMN@m3dYc wYF ~]fĮ_0s"X_DnYm~Q~6:X}8o;VX]'ehMlL x`F{ #uŻ|鋖KpE&uѡx oy;b8z$>}jj7i8QIhG88 Uw}JG c$hoCGt]RWtho Xwҵ׌4$m{ W|&IyȄ9Y1oq][$(1>wo~E=6>ux^ic bJ;/+ wŜKpd߫y9}4\:IulFd4ix[Xq*-v'֠ENyeK7|tk!ވ &.NžMQҁ\Z#:l\9}M]wpq5$WwoܒP/d\p0L v%ʾHOtB0sߟI{8"џ~Ia&.ۊ9 m!PJlNN03 شbYH%C#eg6rc%.xQ]ӭ/"rS$^ }'v[wiHށox`j=Myr&j5n "Q`{t#Z5i;#9'O^u|ܢ.i*"1CmrԉBcnvY77[D;e Ha.N{i<ԥBǢ(/V;1{ I"u8*D"Q頀1A,xޑ-#ep<|9,9={.=P @ؼ~-/Zy,|ُpYD'~0F?ΰ;S5,^^>HHJ n|X_?G[l;Haoj1Ku{ rMN g̉^pXX.)Jm+1I5}>3W-y=$(@Ҍ]"{i!Z8e,[ lN˾%1~=jb8ڎcÆ ضc\}Q"2DXd#s)\`fgb|Qcu/$'~&X$@]p*V'㬕z)Uueq9Jzn0׷.N8Y*HWpdu~uP?tUv .V c|3FO4`45qZk: x4X_F, 1vERq1d! uV@}PTDE!H(/jC|pt$1vOWBޗ a5/s_v2!ϴ~c,/c۪:wg8Puspdp0*`kv➗5$dLTs溆uWc9YϷؔ!VQ6mU`@??aDƲt X}ɉ J%(Ц͔N l?A+r-W =~>)^ϴ~2Qc"$퓎DAztVHSDPe-J(';Se(Ly<{_SqITF(2EnX|/-K Xx .M;"1k{5}e]\y$VG̾h6؛8uh7/[a%ظmQd(ߋy2쳻\,zK?,]if]@Btq;{6/[w!8&xDm{8ŋqXzVh:ה_ `Z7)KKE?'׿~8j<5 uj$x,k`! 0 )-)DX0eZlz`Aݳ+z-z$N^be'Vo`z|$6.hձ;94 ]$=%)  M?~ƒT\j ʷwnÌ01\-,Ѻ YIrR\wC/vVnaCTy5 ҩvDĹ<&㪔g)4U ΂iLРqse'|B%{8{t>6~9 're;k3΄H؀QG vuFzl̸L#)2g쏄 }ϯp-Ņؾl"mGϡ\9^u5XcƁ\.EFS'qX%_vF?5,_mBbeз7ڶmw!<9՘vJ+B?T:wEk!v1ߕ=Q8T]>f4lKD*R>nt^$NTpf/>h__T[)ץVgNfXrd rsƘah3rB,'LˮPC0RvWl{j'<.Fk|ZOXCILd0 j9r;ikO(Dl_ DF-x-bp`\4iDH(;nz uZ+W֕ߣq0k&$gW1_Kp~4m~ކ,d_֨#Dg (G \2&wģ޿e>|.~:xYpƐS֢>1%ڃ[7̝0R>WcE?xV/Jz֧`{}Z>: sqr"tlZlwXHcy0J`'euZ:XjU\kѮY} ,rQx j,Ar":!Fǝdy,19yǖuz-N)Q-E/`.VTT%ߨ 9 qi1A>z r:֡IژP9nJQ_Eشj{ IW$֩5زq+G,LQQ+sRtݷE* ]G$E״=W4MVLqA*NXm;a1;*bOQYg\O1E"AY(7[~j'l_@g<^g٫p#CI7yeuv#R*%R&( Q`ԞUN swѬe; [aI"Mulֶ;2S m <1^7EݶmA:u_⍆pQd"&Yõv0hb,;XE-fQ…nG" bCd۽]ϡ@uD['dX 󹀑}" ;6#Wb-kq릒t6,  jbi<oUN~FݪM/(B.p:L~t3#' kߌb}a̯4݉]ekhߦ-> Qŵ|u q1Q~%Fcq#卧[DmW>e8@+'0Qv]1b63gyNX3 Q:@٩Qj6{y:q gŻ-Ơ QӴ.P #;#g;B>`-㓙-RJzz5͆!c! mUy3Rbix4ouvd4r;D֞U`Q`KX-﮺8#(I@s W;%)NcN/⒳3Cn ȴgamZ[ayUsv0rU8."/9!Z Tr$,I _ B&U `y^+W)s2R%_"._ Oo_$$ԓZ0\qu[x/3-QֶpqqEDLZSUHsʔGI?]],W}aRfJ/?OX#x PT"8!;%v jjבkV3sY8}:q8LTc3ͧax6iɱxfCM`~uȁMvCI`m%W]f59ۤ3^Z_ǀd͐+C ghXӞgp\9g,__Vk6k|Q^:4?&QZ{Y>CA]jzڡ[?0-<4Dm#`G{y?>cCб|GJ[7r*upn1%>&hX}a8#*¢b9/#4p=[XT{ywQeo_*'iHMo"Jʙ #Za͟rT>sD|:c[ %\*MbyKAlx)-%IW2d/Pqx3e4us$N"T}W;]FZlwuƇlRm뢊= ցiܮ"B,7^k.NkcS60W^n^>{'cOh`2G+^99ةUW΁'.;]$|I7*XƃTCo*!xC.QymxV^< WT)jѬ딄WZ)ռ_\'W'GǁϳrY>i_rvlULiMOV`$B j5Sl&p6+>762W Oگr5֫>l\VO2Z\^u~ H L$8&kꡦ"ӳm+<#A+>qhlWy?u.I(*Z?=ORy9U闖ٚ߼WT`OJ:LX$2äIENDB`fotocx/images/perspective2.jpg0000664000175000017500000014260315247006660015420 0ustar micomicoJFIFExifMM*JR(iZ0232m0100fotocx-25.1: paste area|fotocx-25.1: Crop: width:2000 height:658|fotocx-25.1: Rescale: width:666 height:219| Hhttp://ns.adobe.com/xap/1.0/ 8 740 2000 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? J?joS V0y}^N햧:j +˖# /F;Jr+MNjkcN>7Ww-MQb!AQjꖉ й&+zgT]IC:/nfYG9 ,Y;pq 3Epn-=foL>?.g=%1ܲ$A uYP*ۓA8|0j8uƛum.͂kkʢD #桓KJfhdWX[Dxs߽5/}Ϋs}gK6lJ79#3GCr2r@*q85+,H~Ӱ8: (ghIK7!#pT]GZ+{cElOU${+k|Ng֍_MpSK-*p9'nuiU2VIcs˪Gk=̷.~_Cxu购8-){lAT89ne?27N0AA5R/Zsj R`\\Ry ~ M8wr-]I >{~gk"?KR>ga=+*6r ~ w=Ү@?綠n|ݑ/m(X48\I5Ut=f#|tdaL2(3߭uW 4D0%Rj%LgU+T=̯M6a-8Yvb\9l^y&JI5%O-w2pc+< cmmˏګC~B\gב:џx:ov$5s_'HG {D^;O [M+XBޚMZVRfBܓ*cZ)jW91ãEj4ҰoWt#kYMjCPGv&"Ǘ)SJ?q?j>J%޵lZ8Aw$d(}#盿A3xXF*?+gKQSH繸]&bIYpU(SGK%ӵyMDLFb]h d{WY{VE8lm-Tb ~jXYc"UX8YX?+ޑem|ԩ+¸Ov'1]a=)HfO0{k-foEq_xE$ė*'8~5Z_'&dυd眽zxGtq{ӥ=s֗:,s؉B7p0Y{R:y"cq4._c- -p㞠#ú(ە( ;*Ii,01 2?#]ޅĚ}-2ʢ(>֎<<; ֒d?1Z֎eu>N:+r/wiP.FNr_HJ)#SU7"ȍYﭠhF'<{c5S;QC01ȁH0 XI<Veu4뵰.@gc>E 7ae#!&)/ (cx' Gz5NGzYݭ۠([e!g\)ȡHm2cݛd  YM w6ZyjxkxctT_9YC䑉$t:-jP13ԠJ<=coU˦q $IGՂl &gl<.A)hKO莦![ޙqw9$1pCCYnQ폝 4PvjvN8tn*T+>12 jD2~"ɨio0?:q˞~HidY@I<~fTdqt`{WpND Mk!YD7a0ziO@N ƛS [rHpYեW>{#vil UAZb٦ԓdց"鸞*[!F_,Y<u.c6O*iAfi: Zd¨ ֣kp\QSR?7&z4~֬}"繸n^e`83w٣c%ہ=}ySTih$׺x݈TDA-WQV[: ^{2HoYA4" ԑ"{,y 0r}ҵ6o6G`C(7sQ$@sfwtuXBOS^Wj^_P_tvFې NgWcm/I } .wsAN ];È[|N2k>x>U&hč=Κ$3rKt u~wZεI>oM[#SYдMI&C8 ^aea{wՍS'LpyS+=>;gÓ\Y];$^- @c+>KZjIO;F2ĸf3^¸#'jzƇ^C٦id| ^G9`VP[΋1uN2}/o]+jzei".m]r'MĞ}|Z⟂koK6SZS/qԜc k=F"t$'fkNyt^L۱#<{t=8zƌ67:.#@=Y2~SJo#1,`ka+=yN_At;It]tr(U~c*^, I&a)Bcro"SPSΩ<$ڿ$$ p➿zmGm?WƷ(̗Ɏ_,cEW*֭#Ĝ uK?&4mFwO#WEv cZ¦2t X2i;K5rh~ ウVJ-S;M7K/2-Bh~'|VqQZ,fKOac 'QQ@%j?W]QuǝiL?ƹ[҈/a2?V]B?M=W oHn J$:E8<AZQֵW4؍1&mku"IYFBk8 ;WJ39WLJcp-|[|,c!T׀:o}9WUM5Њ$zvzşL?y d# +z^_풑 fuӀqOT?`涍kh~N:=CX$K] Βq!tmUuB TƗGƺcr}KeA'j7BqQQRfذԭ8?j1aZp#U|(r?:.̷w\jm+j635^[rpt?e#*?J&ܐ-aS9?:,Bc =x C.R'Vۑ 5mvr?e +: g24Go%?e;|?JQ c?y9ٙك!p [`ʪe}zGdiZc< W 3}Vw(K>\A:@@^?ٍx$>BPsY}zIm9Rc$}>)Nf/'f#7)+mİMu#-z[(P3YaNaMrwuj9W`uj붛e$0={j'umvϲF1Jk>BsV.5 >wrw9 R 閬CvW_³{9~)fR.6.[,grĥc]t+rJZ(ޤb4UuX1,y ֽu z~?ғh8V6bY'D-1)=ӊԱ֨P!.XO_Zb6\'?M-@;!^GETbR[w̅eSܯ*x*yA qס(<1 +ji|hi8Cijԩtrpiљ4{ǘ̋wv$w 83O>|7ip8>!]hr*EQh΋_utXdsDKʘ$*<~}k|1n; F .nG uy!k`ѣpr29q"s19n7d[Yn$U[]LOvt1G6NRg+o!f$r[簭1AM¶ _z՘$6*pGͻ<ք(ڻ<O뢋Ijdj\ zkE\[-dA)WG}f# D"pUj<})Y@~mI<R.h{ E 4 _'KOj#/ JFGSask!E*+q3NU@3g8bc;ao>RFZmXX1R23)(b]ڹ$}FFTY|>ls*IG+Ĥ0uQxدbq赉]bp9C1+5Ӑ|Vݢ" $H?g3Hh) .~(+s*/+:I[M]6~C5]J"h s;Xax&.1 `D^St*K[ۀC˽FNC`zWj7Jt4Hg+5*e`X s~{]MbֱCZx*s2'ǪKoY9e{z//A0*ZP8/5B&夞hm4~`?Lcy禭o$͛d;r<#< ˦(%)AK?u'}̥_vxSbvqn뷍#V'pܬyΫPk]b졕e= ᭡:YH#v9JoD4s?*kom7 3@;^ ҳ<پ-1/6*j+rEdƴ?C]̨-,ǟ{WQqk3*ʰƻP}.u R{rWl@ff^I+V4lGXƮ8.'j)5AqU N=YÈ%{pv|@IcJ[FGξnq&>~\OnxMmg(`iXP=+K̆i3탐xX JUdL=y5PV}MOGΙ/ xhA'w~̽𕞝-ݐzS·v==ۄT8E*[vWi l,k`|w?J 6stW34w$.3\CtWkJQaiMiBRNWe6Y .?^[ ϿL DWQBUdw[%3߈#:0 ;I2G?k^L*ѭ\J٦bBQcv84>d3mmnLVD&2 5xƞo$קj6<n8'W/Z?j欯R 2~G}T X_&7ݪ3772GԌ?+.RVe}Ůtm5uGJ%ۇb#<Jt!MIs 1vF㻙P|y\+3Z=7iv̬O ]GIq1\?e&\+1FeE## Ӓ&kT0fUe1WEHˎt F;~i4kj@-$Œö jCm~rF >9޴TU$@%=$wВEVմWHe!ۺYzRz}kcyTpsڹsKN/TwHb`$έѽMrawlb +Vn$c6601$l|BBVP{]6-K‰4xmxqkuF݁"Jp1 lp J-UBsZjctfpOKϷ;X=?ʓD4;[j{Rc ֩s6+2f nCx*c/Xt\vmߏ^b4#8Zųٿ$AʩWӊі#M2`tbW1_)d k\Swv(o),SKy$FҴ#RMe8|9jin۸1 n@+kXK),Pdt26cjTc*+9%7cp/w6\ʲ[bLbG62<+rjmŎ&&ZI<#q `%(GXkia~eS_Gt_ H不pqz:ә]?3/_Om9ekWH 1,Z_km~@ܶɃ]cIOb3w嫒yXm +[[`gֲ+| 5i7 Z-~POB¹Cog'dYUq*A2s#CN1Ι q46,Kt3OҽCjl(%#^s1Nl?,xpuKsдRdBɌjݭPCXZΉA{$Ck^0:jx?z֛&{\[D$ic}+ji^Iҹ*99a:}S$FL;ӳC X\jd 1Vr9s'd6J@s+ƈ,d ڃDQY `݁kiaLFI &3 ;H}kSpWc}h-mluI\g &V<_&kfQ8E8'*4nܾpp}kJsy5M/Ec_ǧky. nqUSK3zgjtV# *Fʋ0yx,OUTT})/u+`dh#aXoonO]W gM?ĭqWFѵKn-khè1H2qNKsF7I\X=Тn,+$0ȑ\&;:SmFw,<[Xk)-]N] L6_lK\ h&[[FÑEJh~eb@K,gnD gWMǘjǦi祹EP*i63,JB2ʠg߿R|:,ʏ.u;洯.O,uk\٭y?\l831Gkuk4xM#qdso<1^:K[e{+id3-Xhzzgr7o^2Ql 8)z_V#_}-R1d+q _]Ꮷ< Hn]o|$komS W>/ЍûxF8I&|n1<`'ZeD[|p=vO~HBX'\MuvLc* IM^6Fy,s=Z55Zm~b}9^hJN38I |{ZAj<'l.}QGp#RM+ {ꗾҵmcw\=G* j#!$`Iϭt,3Oh'p` d0犺lƫm+`p=e60Ge!F1OζSKFU޿cR}|yvl[/:?/H֯Gw ǎ(?_AMh 61t9 %<1 V钀]^ 3xSUd|K!i,Ϯ?4bUG6L2+y΂%EhFoId`j\m@8䎵h^C{q:ɫh#]6לz~&mn'UFc;!cRk`V nw>ZW[ml;h^Kq#זRIyY'n:K[MZ-}^ E!S-[H.G Y3/?Z}SUU3A4r2< l'\`G9-_)y>EUm1҅&[D?á3ۣ48FB9'|wںb*AF"=um5'Q6< 泎nFe$w<-c3*y=k&+3^4 :kO6/ۄ;r+ҲhkC5>oGlLpGlӞj-q_2,2OIfE; =x9kH|&AˬJ*:9KoTCK)V$f t٬>s¨\28v ? c&Z6Th U$]ԏ"`矺1\/|7=@5kpmoLsB1T֨+Camg/Pg><.>hI,$GjfBl#&K-VRd+*q`VYv@Mǔ$Š{Er99FQnwpթ"giԑOcyd|!t>\Ll:9SDՋR6мr+Tǰ\&"NJ=^)&2JWOhpwҫ ;ܢv=zd#19<]k"0Lt+2-$f* sM\t?u~S_,|e-fMȫ{h}Rk?AQlMpT-KvV^L:զ-:\ 7ܫwJEGi{--mX=8{CKX5XZg2p7ƫ7S+I2RpO#;dɦHw&OkA}9YT:DRj>{ & jx<kP$*cgGKsS ^*}o%~rSo$/8N?'Kx3ӡd<O|FzK-JhlzdDױtengg//lnإNF=1kӮ_͑bv2]k/&' džpXOR+t6ѬӐeus c'Z¥Z~GDRs[:Mƌ=^sᶏNզdC>adV<ҽ͙îpi+dC]0gI7J;X",3<ƻޝs0 (9x1Ӱ~ig ,p:Vُo|q]Tr\ʦ!:^2yvw8>SV6"ݪ&*޽~Z2AI]/slxό|=ADji6Ij8@uwG6w$wƱK d\/_:bȢc8׏0SԧwIsr ʣ J5X蠟Xkdzo"r(q$?ʷZ꺔1[S ˌn_{&FYº4V;~ 8鶩[+EY\gn$e.oq.FwczzMtғC|mx d< +ɴ fYyOiȍ'ԾSkxp QQЏS^{q>tox(9(s͠Lע:nۻ}'?Sګx~'B!' ^2r譜`*efV|8k(Ufr+k3F$5o E.\uPjֻuk?ի~8<^Ñe {jt$[z"n2b&2vMEMu#ӢX8i:]ƥ@ኡ(O "Qgp W+ͮexCom>`yn=Irj)䏡SXai[#p {Q^I5'/Lb+i%9|]S(-~.@u5gg?N~alI$u߁w+)`TZH*W1Yj#*",PyXu]wF&Џ-z-J0}OKѣ;6PVD|z`VhQy٤}꥛3[x[̊3q4U g4$65u&k]sPF8eTΔWӈ(AΚz0fHte3A?Rm!A>-Jc&T8bN\(G94+Cd#3ҥ$0Ėrzץ+RAhnh 3+6-.7kIy{Yt?+9H": W5a_Ry?:R[kT0M \k-.B]7R3)8|$,n\www<ꟽF:/Lt_ҽ[pCxi 2ȹi)I1Q|EͲizrIЧh6Nvh1֯BܩIR*gRPUUEw\r@1Z&oZ 4[dR_3rV3 ߌ|iNd>GD1e+TOӤV[4ѝİn<&h|ZQ4N`C ׏|!@Ejr%Y9탊徣o]$;Ùade̱gG~ Z]$Ki X.@qI6̮_. 6v˙"Q.vhaV0Ucf澿Yb&!Z5[V\nk%Rc:G<2.Hy }9ᅓoڒ g??XG}%U1/c=}mW'D1Y{GhPŲ͑5űk[\(?Z_k] "Y .ON$T?oKC#f"hTKf-WVȇu 3LX':khʑ&R9qZ\} QX1|ڴ2GtKN@t]7Gwȑ==*Cg<jUqrM+jiE{(v?}WIeBPgE)$mpsfJЩ++\QR+d[yq8OXmBݧ'wF7j[4mzFp~RmbVwd Q(O+͔VUܬN6Ȩ̭<:iT⭩M?I{OSY^6b8ھ*WI+]K[Ұe$2$^VcSGZkYn{n$8f(AP@;j 7ޙg gd2ʻp9ɭۛ= m Kn,#3jM,QDfGLd$Xblp=+䋾4>_|E@sj?o^61?$>I*ƖEl-xVk4pp2 V"x>/ҕ-`r:s7C-eu@Y yxo[񆏯4ӯ H+'D+aQēg$3œlاk;6=1V9m(pG_@+W~`U2xAl~"# ͌w_F6Fǟ]Rq}[g:4/+YE*$(3-4eG9xw'ml_<E?Z\bl5ׇO6yIW8%h3"l7'9⾫#" &8 JЕƁ5tn#V`m~[۽˵%eeP:sڹ%~E# Rhvw;8v#y`]}W8HYPsk0/ Υe:̤ @y涿gnCu\3{#5h\F'<$=ls[2j|xKXJ-GҤRP2U?ysS[Rdu#cRv8@BI֍$/HzԒsyi qRf#zGJHCz>苣I>L6ONLLgRTGP rv4nAd3̤$~& &2`w9q[|O.#[fÂwJު|g>8ōBM3:dгGyi2˒!]FGC{ƾ>vh־5Z;u'"L1Z.~3=EF)*F:SqUtgZZp>KF;+;TY _,8|K"m\(#'Q-o֧Z}6V{p~888ł: ?l$`F0};~5AԲz؅9[Hx+/*|U|8V[YdsN0}_Cw64'!b]22Yk>?V:Η{8#~o.?N:tkU-$YԿ# >wuYzŹޤH"b1#ىM-F9q&d<~!LgZҾ+v$FXHby,^+hZ\B--c#n_CZʲ3 G_޹ZmWW-e;JΨG?ɪr8srPqQP-̟p:f%ƫK\l'v2==U  qnæ*h|ېor9IK=GZlkUjG)6L|1 @rq;i#A"E@FG|?ֺJ͠d*f>-K)7R}gpGЎ0Vm†yk#K+qf)du~ vҡP h2A?gSP> iYʭ3̼6EvBeΑw~u"3ۉ NOsY&~2\vr{?_֤ҭX# !+ۏ%k<8wOkxN29-d7da,{[n^[B.- o@}EH K뙧7=9BE 0zW W.uRRD20_)?Yqcm' ?})|1_8]WG)>(44s<4'AIkξ\D]d8ٸx9iiIsF~T|<+$y{σ< ii 6F3n??μ>x؞xso! f@ۼ9S'ߵe)SQ'h3ޖʃcݘW=MQR.Mco|+62aᕔn\(C{W GޅE˚y* ۩o+}?7MV҈PC&֏ʨ>r$`cј3\֌- Xd$kEYY"4|wY(2n|〄JFm2: mN(޾_A>smO ӯ^EIyDu\U#'фiSCISlyq9W$dWwW@.i.+p9㐠*ͽj>&-cop2Twٳ9zip[-QL`VMRQ9s䟍;xw!ۜ9ʲgh\uXڧ2R'.x(<ӥfgCr-W>_8/zHhnFv_lO. Ў?Ư~Ů,5MmR i`/Qmp4hqDy՞{&g ;m<ɦ(vƾz>%WSQ>Y- G^2?<*^j2<007'\ǿ7^"Yd{|@c 1qx'לjrxu(s3ĕZ(UAV^;]_wIjX/ גjmWkŌ}pwקx^]76g?B]͹rErohܷsM c KnCj;[1qpL:9L<?\O]>vjkZR MzOKo l-|ĪRjeOOkĮ\1qW=cƾ#3x?J1P_FdvhWjG:Z" `'N? oxcy͹"S?5L"4PY'kI$xG#"?_Π:yWTNG<#։(=uc-,CT䍡؁ $Mu!pP`ߎA>^ 0 tS1q#ꡎ%T^:? uXI  02?Zxܝć޵D,)9d{t40([-u^vzkbcbDp0z4{mSL_4>f4V# `\̴U΃qTԏ2Ұ-c-LGs2;7?j]4Kd˞uذesМ)< O-ڤD3xW˻6x  We=ƿ?Ҽ[ƒ5}KWL8O28ј>\r`#H52n1 0 )N8<}+šH5؉ aFa9̇6;s{( \a::M>i}iVW$'zHu'Ӕ.'^ w%LGؤ3xY~4T|N ̪1ZE1_c[rw,zr{ۢ⾨n|Ghucou {FX_Uj45xshz;fxV0qڻψ# LFHxr8pWLV)Ew,Y±& 8:}+˴^j mmDHf'5N, &3h$(a¨=s|^xZ ;Dm#uw+Ԋa %"ѼMp,Ĭb3z)tqTg h6 8G^ՕiTs%(i oICnB@Gþ<ӴY Ye{ Pt=+-ܶ fp oe<rZܤ)UTiWVc,UWi^M⼞$񕦅Y~G̲Πr}Bx↹-͵ko8\ǀGA#ˮٜGk1r8Rmv;h)tzKE9pS@'oNzf:2iCJچ3+6~$!,~I6I5ocR54W\@2ڡG$J}&o4nM)۪r k[eRQXĚΏ-Q劒p@ pqҨ>hWGI쯾xY,bٝ :W7kY׵^|9axZ&wldKxZúTPRWB-2+t;*yK4KXEc 2z ĖM%#΋dy{ 7 l9uxMdž/pO\杣k+mVmsҴ(toi>mݜ0]ߏmm ڤLJu7?5l4~l,]a@ 9#SMw6^%?fj39r>t!|u;Ș#yqj`TS|y;U'T\dTnu:ۃG8R}Ϩd"AX3>xw݀FO?›$^"0M#VO' !|cuҡ?3_ )ss{U&`.Rmfmv ܦ)55۳BA[h׊ƹEV6 aQe:@ LkhiW"YynWR .ss+ A…Pq\3HѾ+#@qVˑ'4R_Z.GY;;^֬X`̈́hn߁*\uuG]-${l|2︈X)!\`^4R>+"0>|L4I9?%c+_s |$3Z[cP YWaفI茟.*0#6׻ ͬoFWGWx@?ֶ 9{\a|NX`WA^-mjF9{ցXy$:7ɝZE#iuEuޟs|J%a#qҾspuŇ(=S~酬`S /Rnjs^xHUH# &$ JgR}NRNW%" 1pOJ>W等S.U\1=x杠>y{NPHA#y̺jۮz#o~(HC(''^ԥ#dϙM~L)Bvb0#5ji:C#=ij=Bi&pNxiIwI^-RL ں|gsexZnfNi" KR=CgDEoEIPxr}8=+|3׃ixd8v<ko\H[@6b0u[u72 @۽GӾ=sT+*.]b"Ԯ- G΁c{buc }9mRpQ(&ͱ+n. \>/u}G|l3 VO>b>t*uR6ȑrMA0>4;l3{ KVéYԗ4v/d\d*=cҭ;ULfN@R\M6 cigk܋y&ZlzllkO}&yIIlvdB|v2RcO6p4Y vdx=:(:`]7͜uxtKOlXr^=uJ<`BNZ6.VR~UaI_EBx?yFv*M8ye1,m> 91؄"^Vʆ@zK8?7lm 푎ajIPH#hAsJ8~U[Ow% c@~ߒUkȡ̊$Y-#2nwpNzW6c~Gj_ı䱔ǻq1YPG(֠idɧ A={{~07 au cWrKXc; y4xnwҖ۬vHBy=wIڧmlxϔT .7#v*vwRF9{GadoEu+prl *0ŃJ'/ݲ߷MOz%J{B$2Z\ڽĈ0lW6r qW<);t+C-YVC^8 2 Uk:~rZoH%!黜WynŖ}VoFc3^d&>_^Rg?9-"Ӓ=l|k8.WKVMۨlk'[ Ba!11$q^i/m3)-*q&k7"mwڸB~k˔jޅ #:6y)W[sO R*榢[w?tx,ew_Bf"%TzkȾ\SG*z )SuO u) 2I2O@GnwƯ躡X5 \J\3R}A;Jq%UGq=Pl7*hRX?"Q^W9SVyƛɵ=p|jam-'\RTm-9EK$Pr֗Jڴ|N ֱ<2LW3+Dz׵t$28׽jʘI7FG\u"WMMUopVQ^40dlcW[bb3=U.'8Y7f+n-ܷ\zzU+Dh44l%qF kd1 eΠ%t\Au*lԂw`6(Kcţ1:/GjŽRI)BTV4Re̟!9N/Cԃ<v}c*b<?=1 ) .daoҺl%y}?#mC5p%|E$FXn3zWjIY`:} z?GG6\F3u=kSw]VKhu&1A[\^Ek4Qf7;{rGs]l^˩櫫m q(ЩM)n{jvsi,kiM4LL%x'_^|;givk謭C}Cn`z}2EsU,}Aog%I&rimڢ˓ӑ֡⠟S3]ϙ2pM,\n{nk2iW|HwRsutB\`|q#<wm jUX2sӎ5OBγNbҼcKd򤴐IK(j|Ix:جY I:2ӚeZh]'X.sZ3>ulvbp^:\nm+w:2^G'vyҺo׵Z]^Վ4HlfMezz ug^c(i!1)"iDɻpnC<V;EMc@ǯLQi O:ύ>dd)$1lͺ$ c.euqkקKG٘ZeD;jI&v)x g#5ɥDr3@$ft;w-6} S֏&19FNOp+u+(ծ-Nz+)H<5%OLBJpzBc;d՘"6=q Qٗ3?R~$)RcM  }8j wGXIyCnO?Y:j.Nyٮ4`n׷ d2]܌'#Qf&B9[lC9ֳБc !n榶wظ 0vIB,v{{RH3;Z}xLe ؉'?k7K崋2F gW 39cck@ h!}jk GeJKsXڥћ)mq(vR2Uvі8C$B>Q<[A2zȑ:a9=;buHDYG?3*? 'DDC-}?_WZ[,%pNswu2nVk:3ܒOzT1ڬjpj%iNO*rzTBܼ}k\BO ]:u'@4jY'9zG9m_MZX\ilqr5 rZvcvp1"6xu xִ]hFB \ ׷ڤkbig={5ټph.:Nú nS>Mz,LUqk˼;ݶ FЁI^#Tb8n +%6)&R[6[;{ǩ\t“[co8, ׭2/ Kl3O"l2Q$ӝZʶT_Dd> Vodr[qxt9F-ACw XPR:ƟmCam,+FȓR5-A:QEsߗ-KqUS R}d3YX{So^)#&2@X5Giz]6~7p~^ O9lB'ʲ?z֮j?6Zot!yv.!, Aøm _g/Z=WfhY'WixEJ$%8j#~|c]|;~gJ˝'c7VBD\c)6F|>Q=ݽ}Zў3Ԋ3J7|E-p㜞iT\8⡷MǏAҖqlʄ{uy&f #=hgURcP6IWcc@IKwCgd\a8sxiAlN޴3Zj'?ˌ|uYQoC7I|0,p7\W<5i9?܁JdN (B1 I+(ːPZ5$*6VBC+;`[ҷ67}:ԫ<(6FIHbFl3=K <>$U܋kja ;rp2x Nc WDTf p:<˧떇Y(s{*9_YImMu,K{yQ@\3I6e-X*gyO\`0lskҥ{uBWV26!G^֥py1 # ^%y!|ԩ޽.OYs '_~UXs$;5OG7Sc(Tjj-og 9t&^LhɭK=L̨z's4"Uq.8GUϹ^Sw0xS@X{8q{ZL_̑LG@0s=+Ǿ-,:'X]73]9+&O#*shi aa֞bqṕv:{Ў{ ;qέ꓏ە V$V!>qcqT`=r>gsUt(nL)ؼds6n$$a@+ F[hh$IR${F+B/.!i2 9(=Uk{n';]ѥx2pOoڶ%-6.ܝ9;cY:N̯dڹnHmF[eӭ]Y; c)4"RQ`AR1sտwVS[ 60S}ݙrA\ҠSF[*0qi*z A !Z+FF9) %IB 㧭TV.)~Skg<5 43|e~S<+[mM+G>lG9FU%c>KRxki; qǿZ "p ZDDҹhCs _I n#qVKO$_ qGJ´W6Ճ=ԟǗtk}ԿMnWj?Vj<:B{y.#"ITm &HR901'z^BMA*d85is&_hf94a;pWdpOnjb;1V ?#ްO1Y  5]@XgZɾҼrkMc$res|m,v:W{sG-uͻm緓b68t̔\|r ~A!9-i &ƷH#x"C,Fye]fOg? \M[H{J! n>~Dyـ|{;ĥz@_.K@A1 wھ4O @H?Ye5'$N\x3_Px`/gt QI]w/2|?3 Mr!D`"2s{_B.^;e6$m~Mi4e|`tҼ%<[u"D9' aVNG餏ûcq8p#I$$r{j| Ee(a]j^(>W(Nb,D@_C.gٜMާDP8^uY V*+2dZcFp[tc8e^Tϖ[vP2 jEkmhT?:ҋM @1ֵ'GFT0#B}A?ЊՉiVz [ܣvx:{WS|uu<zqEufȶgOO{:߱fLs0HjMlo4y^QD16"0{G^\DyvAh#k֙5f#?׫˦N,mlp0q\U+9- Nj|+O3 @'ֆ 9kw{r$Q( n >g2Ρc>ƹ9B-򹑈_!xH[rFdyG;|?:.HhW51,y!zsƺ)6=X9­t)&ϸ\;`dtxN쨷-q/ov1aCXtICaT Ϭ3c`E$=V%jmW)5جBGk*}Kn^ղ,x$r*yxpg<\ww4VcL?j9^R<9jo' h\Gpz՘!kx8;Oun)w?*̼`s20*d4FM8 {Sw8=ǥsڀKDE`UOa[XKl#1 JrP"`|v(m^x˶kT^e UT@ ;tؖFL"\|ˁ~}\m=,:?~ Fl|rwƳ $ᮣZn$~iw"ͦǨCЈC'sksr#$Ԧ1 V9_5КEK(d,SfYjID <U}. Y6͖0P */n~!B]J#DH@~8ӚɋWM: 8)Y=KMMKyU8' 8x[Y٣%iIt ` t<}k{n,1-VWWSҴ"Gli2x͝H>kɒk$z$N'fUPٟ'k/w-eo?㰚czqYt~Эsg~Բ*鎼gש#ėu9z2Ǒ]&w;$J{bh|ۻf`Lqp>DvS{l]]W~6wq^dX3ɭ^;h؆+`zURw;iI&ci ?,~t[;DH? @ G!P G&a>`ZMsu{1gۏLQY&!ӏʵ%"`d]۽"3n2AMM-OPwty nJ8~kK.5o/$($/+ƛrG^ʦSn8NƱh_IcIH,VTPƮʡa 9kBm4cBY Њ|v$ѱB+|Vwm hi^,rp{ }Z; ! 8 qMe:BKE-"? <7)aUCBݺ - TpFzSѤ'27&rQye9F[EInpva ّ^SߎU.Ki:IW"Zh\ԯ dH.8w\T>HIIo܎xA^s>}NH-[NCwo\YYr1UOb7W :24ds& :jf%Aꊥ]CCToddl,Y&Wt5'L3ҳIaO5vk: LV\ș9#'wU&`I<:֐R9;;2}ɜп̜E|v+3_ /ʂmndBvc+Cc$.]OL|*8-`keqR㎟}/ <K᫳._/3l4&[,_*R>0]ILĬ lg+iٙI>k* 0yҕՄg\x- G$LP:ïRJRO4%~5ʅE5mK2 QֺڬD20^A@g88TB.Tzs8+ȽhnPkos?y!Č}uYiM]`{q59l)FFqn'ⲃ7v=ZX淸n1L@H,ݸqoC|Ve.n8F5s ׬YF1 ~'ax+A D2;r? quylh綞Ki 9aֽk.k}޻JZ/[w}O K,]m pyypDW &Oqq8g/oҰhY1=h8(Z#YܸB͏AK{hP).sqզʅI0O-Zo좷I\o Y YOjoDct?2 ŘZnrõm4ddB;櫽Hh$-I-z.y*RyЗ;uc܎՟wQ#e'8/@˓J/-AϹAX)呇=kD tVX!d涌đkDTkp$zY^5Fy}8ALKe3Lӵ.BWp$+;sГ늅vg_}5 9Y% M٣ [~:/<灞S%w 6vu.[ēF 2qP|p:i*AT_ƊVCo>SСbΣ^-6)vmBАWr Y'9Rtӕcn$lg׊oa#mUO϶7Rdm2HJi/EyeWr5=gM#yb 0? <ݽ< /;- szr4j0Y_U~b>`Ð?-mu^5LyUPҼYcc<a.8Qzch =k-j2ܽP,6ހMi^4 a< +<Ѕ-"T g 63=9,2KU@8Ueֶ.> >9$cjC9-㟥cxSBױlWrs9.l.p?={@-XR׶z3D}9d#SFmwu9Tq~٣\on}?և}ğ>:<2ZZ{rєI}%B$ӬwʟTM"f7Vq*8Ws˝( Y8 Y2 x_Ó"Qc )+Q\پ~%'Oy'O5f N{9SՆ{W <)[<3E,Rp0Q*FtG̘>*M2}>XѴkm96 sHJΓ/pF:$|!2lCOǽNI*՞F-l@k]:zi<Ы>`ZԂ%~n+j~ Ny!IɦZ5ė6Um~ݹ\Xҳ[,%OcK(uƒ/D&Cg-m 1^H-.#8*6FxCtCm =>KWA+ OJMw,ƙ#bK%ƃ\@+YZv2F$>)`m1B8+ 6xU}jOb<ҷzhȸd ꧭSU+jۻbZE}+PKx0oʷdXk۶~Z',/o7N}1Vt tԯdH# LPUVf9uI1w܉++*$2h+꺆iq=lVf~=蹳2ħn@vwVlӕd1=rLC9W72F&f*CR2kC2\ww*ΕyJ0m,1[c+HߊJf%-#HF^&9h]$1 ʓFyZYS5] P/A#H&FrrןY۶"_f-1v?1{~}uI$ +#`:oD>m:AV }UymU;VY^&*Qb`A-mHvdpT=T|ģ(CK"%{Q[ȫ$RGTJD7 `t =֐Eylу @!k.InUԲg >n\) N;gUi#'VX3Kn#ҹlB9hox?z|DKܞ5Q`n*YS@$]u ` ^@|VRp?!Zߠ%aۥFBuҾfr1`675u ،?ʪ/gqgp9;[~HI"``Yoov$$8+FTvy=dOkaB#C]*} 6.v 9f9偞qv͑:79Ͼ3UZ,sdJ}4?Fu]BuldcXs^cZ]BC d%'= {\a{bȶQ,Ab`OJ> E.4IQE xyKf+OEy]K: ~o=E3U,dKZ[[툨w?bxT{*UMy [$i;bZD;# ;k \٫&Yjf :AY(\>4 |6ϊluat,fIWq'}x]? > sBIu'wGM $<|Î}s[Wh<7WWwgے~yK( 8lWS⯆n˩G NZ+ft]wXob$&T&0W\`sKx~^q+gnH}i8,Op6I Y#_F67[td~~?srL&el0vϵbjb.6;c:MIKsKUm"4mH0('<֭zm׆;fv[uGG Utk{xƧ.8 Ji׈4*VYP<ҼŖ9x#y.Ngmyl}qÖr{Tcx^i 1Kq5:̱1D#}=k-u\:5?"}>Lr8 '!'Z[O6] 'Lc#v`H*lKR*[%;[:on8TvU\僻¾ǞbohHRFr3,$pyA#m\J;J4gv10u>Ғϗ t~Ӥ |)C2mG.zXAi0 FQx)^E^ndm\R; 󦴫;z'48p[u#mOyWpڋ#GY $zO`iz<*^Kpk&@:}ŠM3RsT9\fŹ’' un!-ϽRrMSucB+CdgӸe<]*3e cJH񝬌N3Z\iwp8T , 3i"ҎO̪8+7($v :`#!R/U$o=0Sg?ʛ=Ğ^wrSRϞ9VqҳzjZ΁tu%HYZ)˕n Ԟ on&^(SET[.yYr[ֵM=2ė$Og$ nc/Kc~5qmMEۜ&j| !#Z荺ub6iðeˍF!u7Fx)_ºxbKly8cfU)cnFGsh,sIQ#qi|Zc!i'9?R9ڼ7÷%5,x^ זBRWH{M^-&E-iliseڰe ChMjKں \gA9]ύ5[?{{ۘM2LK4Eݜ# _%tVv &XWpXs[F:s󴏝(˩]\7uй>+[U<3 {21Ӓqɭ9pc`ٚ=N~̂݋2c+Aͮ1?ʺ@ex_J$w5g 3ʫ4$J͌lOz|#HRfotocx/images/stack-noise.png0000664000175000017500000006445115247006660015235 0ustar micomicoPNG  IHDR/]tEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 150 319 1 0 ˖:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:319 height:150|fotoxx-23.70: Sharpen: median diff 1 15 15|fotocx-26.6: Rescale: width:287 height:135|=` IDATx}{TY{LLMwc $!H נq'J*Vq{{kJ9kKO}M^^^'zx ":0f|| )d#t@O_CQ?"H:'%R2Mz{{ݍ.> ;k3oF/-K[8fxK)jZķolutthjjBcc#nkk&!hii/}b3Egg璀W>{Wb{lIЀ_B ,81ao (1놁 ̾g}o{~o7j&,hmDi^B>G|Z:z~y}(iKɛ&)!%&ٯ;̒z[8f Ǿ{CRt [O"׍W Pܶ(1k~Dl0^7Gz{ []9^%cwwZq~}"?-Y g> a`DFu{ra @]]!f0ku̾~~I63o,E%6k@KCR O{`ȋkVQyuc:Vc Β$>898Bc4w-fz 45Afp=TT ,n^!9C| Y3ay^=xFX/aO_X9mCyznz-u"|D=:$fD=< 5j4w/Å0ŠgwZBdJLG`w;1x~߾ eИTG dee WB ׎[-B.D+!fZyބމXȭ+qQZl.., +#uҐ_ecaA'ǵ ly ݃go&Is zR]a, IHIЋNJkfšHۿRBr=Jc:}ZxoŲoA{eoō; W Xlʹ(Bdee-*--w?sc8ҫENNgf߳3ieg>~G!rM@U u*@0+5Ն23858GCe>?C|z>xñYHK@EmzXiHʪ{ք!9(` e)#)ō8z;if:j9 >84竑8}#T!bIh$m.Blh029zJ󐖖7 |؎Z(($b]zE('WGr];d!C˭y7|qq8X[`Ӌ2M()Bnn. PЂ.]Kc*JQZ\HG񪸬 ͔-DIaߵN+JWge6q^^> JPQ8c\BQLy/,&SxLK+kk@fR,"QN.`=5uapa9y-,A͵%EdBh(8e:ZP[YI)Cktg h\yUϺO8aVIYd!K@wf,ԗ&[^z?0X'ŷt}ms+** 򔲳Y?sN O/_u:dd4~ JQ3Ƒ\tpLLz$=~GS+DQTd M`pz._W,_mAǯ׫qZ{Q{ b~[&=bieyY)`}q3':e;nG|zRFM#Ԗv\ B9!XKq_a:܍IׁxMuXJ x|8GUqn?? 6kӘ䠻8BrȂN>"dFNiB,95]3l=xAh&\L4@nY>,Hu %.Y +܈.!mCZ%lPZ y-l߂L8|7Oec1!Rf#Άd_`ȒNZQoQԆ5vtcAi*H+XJI tZPRJِ?m%I1wR.o6|X-7:=F tnݺKKK߿VVVa.l^Y,lEkq2rB e-ǔj{mZjm\JJS9IHjm| |$AZP@&^vz*2khv$7fT.QZVjRʙdpng}29n) )] AfE9^F`R0N'߃,$t\ R(7SeQUع,@OH#?J@)q4]=X |֯]WP@yE%s h>I X' WNnZJ0Nm5"9duTl\z8rd<8SM k&]i'6೐&/ > ,{f s89993yt N 4q9h+}#&ʐQ2ۥ0TuKȭ_4`Bgr |wyѾpТUfȌ*t!ehzmy:piԖS-]zfR$^> >A=Oj{LtW$V *( |ʪЪe{}'ux/iTuƛe8- ָvA3ۡ.IV)`~?ҍ6eغ@F#w<`L %Fr=:jda/0Tc -. ,>F8ھE LR^0!p3ڍBM!#-;wDVw(68ɪ. &dʬg횵0z %#\\xH|[xI#k\-I>B"GYOo.M"9E]Xnv{s#6h(pĖ`9(%Cࣺ']LPeZ|3P.9 \xN0].9q)$Ҋ uCKD'#!d!L+:./:v^g/v@bRsQ@P)ݷ4#8(GogSbzڐNV)N5ʦ _ 4lP@MF-rMQ]:s;R8[rpf |WK%2I}WDK?Y3݄ @Rj0ؒSN&fq D-P3WCБ!NZ HblYIxM6CF\ kȍ` |4Qԛ\ߴrl"g/r(`,^rz#gƔn0^*S1>,@ɲid߅c5C(RۻQ ed mx3f\䠒2bMgGX.mPRP ŦhbEa\(M[Ei.qf)3RUP@ٔbyCnJKɘTSx6pNmY &m-V (bxM'ЮM;%Bul>~d>l'f-I&SO@3ŽZB^Fb}U߈@f܎-ŁƯǃLN"OuH GWQP$y$3Ќg!AEI^0pT)'&Nf5#h*HCYk+P3,|I/'lanBOII |EEE->l{v~`J Ns?bYyl?H;MYHaq !xt&R^8B."RRJfO! $U72J\6E)G'Ͻ6SWV}B{i"CHDТk G)y;wg{pm:֮\|'>'aoNd ޥB/ b |\,́+ro$d}1yS쨂=ZH lF.Ggc%~ dJ/O$A2:q'&ܱLeN {CF8; R IIʐI`MCJS sXܤkY+. mQG.Vok)_UvP>gf ٤v3%ڤ'>Q}1 jFRpF,Mܨ˰U#،t"4i?-W-Hxr-!ka1|:dsu )Nr*ƹO>j iA)R\!IJfC #d M,y=[墯;CURXf ɀ6&RkX[G.qiSc`KN"tvZ+K4pc>~G%\a7gzQDb6-xn YAڤk*=B7vw=w =^[/`f;lq#r9? 61PiE)۾a`j=go#?, %YSrܭi?!iC; iYeTW0{*ps/+9)엳)e`氋~h?]ΛHcr}6N;^KSQXb9_ԷݽȊ~Kellle͹87 M8}X[eQ\V>Y>x@WSIAhk7KmmGTZhee 83"fM[v (k3v6prvé(ܞ6>}L7o":L=p)  `C;iɻ9]-\D[ 6RqY>uP0.~+6?w=6mqő H*m3v/cQWdY_jk)ci]'cB3K]zlSb}ff@Oob g{ψfwyg 71U\.~T8Sg*۴vXݺKA '-ަov/I/D/$K^vuaķW'cFU|9Цb?".$?w%ʌJ,^;z욽3ַK$lRY,o?"lB30{kEmx=l K^vߛOk] _Džp"RKѲSo'1Ht}O`8v£_sr6Dclw7__۬=65pf3Իx~zg}3]l{v})cg!E>&HNo''B а&R&k>gnXoᘅ~E#r9%v@/G>"Mt@>"M?iuaO>"H~H~Y [I|K ^E/D: ҁ_K /E/D: ҁ_M8D/D: ҁ_[D#_#ҁDD#RD~UV߇gىG>"o")ox"KóD~m,>ctN.8H!:C } :;k;<]zς|w\_v}tdk`l]g1k.lKH7 닽FGjh={_!݌묭Ym{ 7<665Hb/:2:I77;PdS0QjV0Q"YLSҎ6D .jeΝ;HMMArr2?zL:0; a(I}>WB8~L?Siއ"&&޽j+tPSgA@Ue%"ǃ:ԑxFJbccH2qx)cޥHII^<L>z5\_^9١O<\_"Wcn_닫PO IDATB~HcdNwaaaTw%!)) įdmP[G ]cii BINaY_Y[g~~8pZLDߋԁySWW b%CX ajh3T0Q_"@[LN!2XJY^^ƹNj)??ty4:"~0בG'܉xlxNIq :42¦ƍ~$V {@-4";%#Ԥ*Ex<>>,S2xۡxyz\Z+\,wc`~m`9gl4d%MYQjQO2d&TԱ}Sy4|@ٗ/oٕȝn(^Ů6hoB+FGG1M߿rۍ Vso׿okiB~vZjEBZ'G ꈨ̥$1  LQʑZ9!K^&{3߁ֿaۣ#0޼mjoQʾʦT}sHXcmܾD%ci߶R5^76ݮ}ݝE.مQoF ^w퇙ng|t=6tP㴁&\[k3*iR%< F>b*o*4656pZZnJPbN>16 ~eaЫ-P)`ƇA!  PEOZZ>-MHIÿ gW!0/H9_/$*c3O!ɝ1t{c$N+7ɿ~A欔.PU6 y Po '6{Hxɗ? [@:ZEwvq:tmJֽ~چY1~_l:g3wմn&{!} <7Y:]C Y0{BuZ[oD)1 7^|џq>9?Gw]VÊ+Jl=1SC?Վz*X-kW›9Dm4V^UVA ?2P)Aj/jZ;'y0,ةS=zC;7`bp7T;W4{/P5hcX_q4{Llܡ(k^JHD@4J71OG`)~\׮./<`OY\{7Sc.&q)) m`R}g;_Dv6ʼ/>hi) MN2l[ _܎q3;W{CMQF w7r<>uI#~X(o_WafIu!#>a-LÉ}NؚUв?^hǭ{,/+32kDSq<\,bӵ0?W|l$23 ?|qTOZ>U)aB5%tQtfa$4`xL3_>g_׋a:q궥rl?OvVJKJf)w(r:q0=#s"Jǹd>K)Z2Emƽ]вۋZb c?6RT=%PV;)FEi!B;0!gWƾ*)EvsP.f~\kW :%ʪP ÎзpF|^!kU6 &8,-2rWc* 2-fUE!\= U5Z~נ+uJtP=Y 8ٵ-$Y8j -k7e$. VY"i }8JָjWW >T~=AX ]_ǫKqY} ޮmQ?Cm^X7xOC(&>(`ǹ@V0}_xߏ$h_ ¼wBJVW! Y OT Rf{Q7iAͲ ?~Mʊ|9hغbHPCzU(^\"8Y;'!/ >{i4ӂ5V,b>i] ZrXxI"FӰ@.)A<{((EFUe nȪ#{QGv Ŧch6kܳeښqȞNu&vjdqY?gxͧ =!KRҌ;0PӅ*<bnT[t3Uh2y \ʚ6 iDwcBsn]åSkK m8KP'b9ABU'ݠj茰Mo k5˰Q6F_w6>i;܏'(mLݦZCw'<#s;-'w,JR{6 [un e *(~1v[j@$`,LwFKj m';vGp76hK@L-(]+ ϔ2<V6m]q}'tdVCd"ǻ0i.S@2_ER~k#]V4^T$󿍿/?HMGElY Dro7;o\(nAqĤ`|O wfW06Ȭ jb558aM.YFXu#Ȉ< 9IlIyzNOqYw_͐g_y xle cglvv=;BrY-I8Fb@n>GO__L\c&{!~*f>|$>w pHP"x<ۂvٺfJch9KnrbNP` Q!~ =AK]IA{PZ#]p E^'O)G-x|~uv$+!L,#D@XZ Qpŕp!O>roQp::׮xF&.H=Vt8l,dmu!Q(IoBa |~kcݐW#ukN՛H, >YR'gv, >4̗3^C5!ːb!u3In2bt >2>.V+k,aT@i wé؄~%SvpFMxq5\u2O>='pD#3!6<'|V->ʹ4^/[ᘻ#6  l<>}-ipϖ6d~?|WN `݉vHbW(3Cᰋg=s`6|J[Q<[Uwar1y3x=u%EGI 'hjICU?ýaib+@,E04'vz- 8DVZ],%NtJ <دM(~Ź8Lٷvȍ1us;o=oNn}Αbr'k|dVS .fw# m򗽳}lDcM3Xx@']ğ'_ 7k0>N%LYi g˗tgW;DIqzaχѭHS][ѹzb`~*DOܱJJ bI@l6Rg!V!λBz#?!euuNBY'e|鈍$}[^Z5^O,>n'cҜYApvҝ>(^ut#t7@GUn)\y]{Y# 2EN{[W(m"' XBml6Tǎ@c7fk,n>hE7smoD:((j'%MoʆvsH|@0WY/)H{ .=(>;R쟥=]FQr3_b^"7K 1C}%;Ppv231L!!wChb Oy[Hڞ%bc툼q$l$q5 =C -zBRV 2d?fdv6 ^9nzXC atTc'+P_|j`zikF ^>cQ?|qlLeJz qkO@f}Ǯ?ވCO?;.h9M8I/)-]p|g8A{&xrtF#"j2NA-H~v &/I?uP3rDVc,c7c+H_O> dp6%r,<+^cq%n6BgurOQ3ɛJ7c٧WD o)M^'#|a[R B?6—RbO_ABQ (f5;.!.&kij@^f j?)п:(7UeŋA<q1g ]Zf\BCV>"w0v1> ތa .P]!&UeN٦Žcc)gW᫏S'c(N/ach ӑ8hG]2nK(x񂦢>s|JTT{BꨦKNLuw%G_j{20YӽGS`|JnT8>|WзyPCқQ\ݩV7ӕO#{Osr[⸸ܣR|^sX^Z&#zbA[&KɅDD쭆&ȘӫN[ HgZi8J`E3.ј;ANXQ$T[p{z(-l*X_c#<< ]#<S,!! o#X OZ[d:@j9.:% ri'v7~+⏀?Դ(VDa/Y:O&(6064l6mCHV=<|䀳P3ߙgK f1$ߟgy9ȕo?:ccV 86ј~8|TWS`-""؂g hoÖ]>ӭHOOGn^.ʸJB)1[E32ҹ1T(/ 6*ffd aLYU` '%%=S2mZۉ*Qïyii/\ G0⩺3++))\ ?k TYry4V U`GJMW$wU`42Z2hܬJ;ӈM"؃qW1M]M/*MMXVU`hJNJ枢D.Ua1沾X .G7)&Hsm1Q m\[]:/6fF7{g}{{unGD~en g7=ŬWn_t{iK}T4C-O49D:7g&dI"["5t@d,QZGx+ۂ|D#ҁDD#RDDVɇm|D#ҁDD#RD~ULJm]- |رI/bx~u&ƒvwi0`!D'sz(/wB"A}gILSHGQyPƺjMv"T·ˤxPd]Cѫ/DzP$}2Sz*m\)W|R~ s|GΥ댓>nKgW{u~#~Jt5P^M(l}-g:ƗgDҒ$zRqg꾴$,P=MKĘU)7 1({Hqe*b s7nKմR*?q oћx)X+,IYRupq?nO򆒸$n⑯RMV#*gWf+2WeYwTtp99 &^WS{먛,ݼ8=Km +$_v#dCw4V )>ሊEq5?"(3:<Sº. R˱6t숊tԵvqj`ZkKMTQM!#0> Avi[ |yu\\ItWwPS%/.G{PFGZDA:`<+9 XlL:R#umė":6嵍3ΏGơʸL몊M|(oJRDF 5=*th-CrB""CG4tN!@'`hO8?15-=SI{C%+fgoHq/m'FAcu1^E#+(]LtQ햺2D\M3`-i@z o ɼS2CVz##}(~HEDd*VM IDATi𹒔tnLn%U4ū " ;()+@lt$RSNRX5C/| 2NUe^&~D P*$F剡n,$gj>4p|&(@ZTr~Ƿh>tX;8:t}fϣ9m?Sg*W:9@չ#.3kCNDXm;0Ia>Д] fٵuQ 9Y]gnGE3BZz017:̝#l#(~ F_{ < kdn$+_:Kkk@YE{ &zuJoA4cl)W6S3C&cZMnsčA[CiJTIQĶCk()O[E\ šm/J Xq|Fx| p+"U+N^KMRg3ENZKO-*6я;;RL SZTY7k(Z!,~nE;%(9]F'1 nt!!Gk.=GʱFB8!Pʹ Ô^GyG?հ(*s9ZٹL]\@v>: Mu-xГ^ۓhC_c6NSig+<@=TPf}3QݡH8L# Q'+KHgF F)]ZP/UT";vZ2r >Yc=xJ+Ux"c.@]N Yδ3'9Q LbhYE06ۻjJ'y\WCx G'`;0 Wg6U̧c~)^])GT h I0p_P51oV䰫TǏ0+煯\[G>|%| r\>h mWo41y1vW!fX9b>d!YX}(xqLlq1 '=o~j !|tХ]P5v8Unz ׷Cy3{#;=,__kNYJC~/ H?Q\>;ju:QGnMH!q5ЩV7dVܧe$XϿýiK8 N:iIEN3eN&7OBiJݏR;{]xpPۑO`mQVOxG,t֯J.Ұ6.!4GgZˎJq}) \OsB_KXx㬠X/{BJ*?Ѓ (䁵", 7ւhp7F:㠹fV2s+#i]7fj\K.0`cadQ7sG>2`YW(n@j9WTX1PDK0OttkhU5tut*ű|x$Z{bZ惗vrb8>imc 7. R8a-J4W88Ja˵3zܢEB,^LO`GI8m )Cl Nhb!' gNR;`nMhmڍ2*K=PEجj¹Xb󊬳Ҡ}^# #!Q~hQ\Jl.tISb?|5:+S8?s[(K(i ݟ~b}c/Gd'W36*{`9LZ c|tp7@* ֭kS+/:Jm 6߈@ 7 zRt.Gumbˉ` SژR ZmEܮ>Zg()f(x!=^|FZnhAYV,'q /5 AC(ʽBCܪfKe&k}ʛ."~8F "yx||<ՇոchUE><0y11fVx3mUHĬƩr=Hj1\J >'[|wi銼P&6H4n- >g)u4Mq"0,6\zP|gQHh("2BS{R?lWG4o&!Mh*|*uny#HJS@d1g=3>&o\h݆ 7GӳP^'I>1ڃ{5NA6VD;py7a5YkIm[>~)v?ogƛH08Oq X|t5hI.0&\~4Ɯgp1Ճo8:XYckXkjp^d|R{3@zT\@|t\TR'.C|z=C98f( X>>wvG5<_a(&R,=)@Dϩ.=o}ڐ7CѐGQxkVJ!jjxDn?mj7+ԚIխW3oʿ_ѫW'N$QA 3g؊b4C4/*8 g(&@M筕o> 2Jᬪ{Ϸsj,R3QLMG2ۼlЦ7->ҵ{u'==*7rD3hU(QP-~opC|=\oa_g.G&՛KQxH2]i},˨ԑ]x9$u7系1w-ɸxA,2z|{GdJ45.;4imG}x[֑ M^G.ݢOvo= De5 B$͸Ba>BDb0jq:^!_|uH><446TeB_#x,{/Q᳋ii%O[{qIsxƵߤ+B| =u4Ρ<ގX(4ٟZ/тq25w`OF;}@,ۍӮxm:=8cp)|j?3lPo_mK1"o! }z5*co+$g}P6p Cvcm9ضb)ޟ㈈+x뗱#d|.Ӻu{l+x $dg 戌kTr6x8o}0J$r2G|;[R=VnIB9ع\5IE(/ϟg Ozdꕋ1NZi`7nGR|`R((ZlY`_ca[]Po?_5BQB*02余5{6z"P<^n',8!M26%a:/8q|`bR͋#ԘAo[r{GWy.T >\7-A9OӺ!uo[lH>.pY#Irq8F:IM1`ˁoQCxm.'ܹs7ϣX5ex,u¡?BF2ѧAԩɻyppk6­tHg?W:Fc8"l07\t }3^479tU~lp҆^~i~@L/pž1<#4W~ Q Վq_CPO$5p?XeM Ί 9>q?@n;(O">sыk8К UҌ&!8a8JIxczշܱ/`Nt?Sjӎ'F R13}Q~w abIU/8f?kP_rhevM>|l lO+fR>rc?x(pa4ӈ ˍ ϋvOrka+<ͱhx&|81ǀU0ɇ*7'8p1` p jk-1~|8p 8pYxy'N>|8N>xVZ^me2Ə'N>V(+cc`J1 A SG3s8s p L||*'N>|8N>xVhDǖ'N>V'<ooGϫ!qɇc*ÁgཬMWEوx.RC\UMNQIqx 揗?mx<촛R,ɇ'dgCI ~ Żb|2uG0!(-DCm5i|FZ`fv׫td|_ڂJ>i{L-6?L8?mx1R($A#0hgDj9cOvFڔދwұvk8Lt!hgFj2dRvBVQ^G#8C$ jZaK"ƝDžkwNj3QNwUZ>=gNǡ8qǣA N;*ָ.JoH*_i'皞E 0i''gA݆X k0ٵ K2dACW!~]vp ܏N^? vQM=4q5s}!+eo ŎPk{6k`:cwC 7ëG|OoAm%8:b޳H-BVT%d>Z聘*МCe:)p,Y↣wЦt䓓j,/`9l\"2.6rΚQ^H+BY_>!E1X'̀'N>0 0pOb1m)i$h>B'7" ڑptr(u&d$Ai>lHf8jTNv=^H^)݊NТž^Z˓3d=.q-ٟP/W ^-N.y]acc%˼pCtTr#m#lF8:, QSM;u֥m#,ڠc %#y㿈|صݜ|,n$ Cp0eiؼ~/c 2\ q'ų"޴k<ws3"HI!LKS!!?~󜃑>,@LBͮ  ܸ Iqq>+`!QzkQ u*Gs} {x]=˫!;N6{#.ߍh7Ѯ膺g}.!%u=ȬlF/#cNX`Y+ޮQoN8ӓp{Vz -$1hh EZVI]S6"bƇ9n8[uo/i!i陷a$-L3W#|EL1*z#oR/h% JZ'!Sz n ;̻Ti`>\i?dKp1x }>GϟQ=/Oi #R~틏P~_h=3*@w{]}5-= 3j>}&*GjXkC1T 4m=O@I׽B7a\gI404X+\m'VEt^-Ԃ@O_0Ŧ],G}`8:-?4O uٸ ̙7v>,}+iD>ouҔiuxl߁LCGe*~<AIgn;I<DAލ6ܡ;vqd AJc)TvнaA]1-HO!31ܱwס[;8Xtz=GDt4JՆkad~n@;ՅЧW9yl:Oeߘm$]'Q&끢*_mr(neӲi>rhJ=e #|Q+1/<)V=Ma8^{2zb=NG3|Lyi #MGS.<4zli1*|#ntJŐDTQ!ɇz@6|!ѪTrk=i* dX-.@eYݾ-^ a h Y&9A dtAYXb'Wr TQ13w | evIҀ܏idҩ'I cyp1p:kF|D>z~4=woxxb6yljb+-KV/,Xy5-BzfW |7f-ʼnhSt #dp&O.|^_?Aj_rwu;{m vߍƌ(|JnqUys7t;~ iT5P﮶F#EV)ݪ"ڛ'YknF6ihw;*K Be&"-=yŐҶ$* 4l>bS_gOW (*V$$x{̮vf|%R11c^ Қ3aeZgG>t_=#m.!>s<șlfa$Lss ?ͦY'hlXɇk9x@~vd}*Ca^Z[F'?ɔ=::vi`ZV0}iJAF) vT۴SMD蒷MISզ씡BY'ϯXog1v$MrפF$‘P#\#v0dAeY1`qvwɅ ŕoh5Q0 _/M1DuHm9ؽ C[(/[H)8_=(l)l#Yjj0\DZɇ(A)ZOC([UZGH}0*ӽ¨4IjD7z c7{-h A;+&PڑW5'{Z29i<.DĠnN>|Fbv2 >ݛH@7o| Kylʦc'N>V'<[ߛ^N>|8p X|8`#jܜbIaRRi oxBAiY.GQOAv"1sޛ$c/Vy4cC2*P'n`"4aH/X31ǭ:8$Q c (UMH`÷",WPA>( e>!'==(^ \up*3 \t ׊.D'4rixNDGG<O8|E`k9Ï{yb\Hǎ+ٙ-2>w$;SR8J@ | U+Vc ˿żx#i";'0qg}H򧑚m! &޼u\0 Arubۙ.2zDXBp3DvURqGzO# g x$, c5j%H*iV Lw qԎ78׵4N~x" M0+)݃T@w'vy#ǥ# Hg80J J -ؠjX|c4\ ա qTsb3HrQQǠ4$I,Bhc8zY #lƻ~T)?T$c"5׵  b => 6i>U SX=hH@;R܊~FM X;{SHӿ,Ɂ}sڗx?Jx?♌N3ONh' |XӷM\x<8U~x*ӏũBdxGs8O[A=*/9'$YYX#0=Ͻ4aU&2 *O*m$2*889sD]1waIiZ<#PC6a6pԮ7\ g )")lls@|1z8@ hfe$6FG/^8'n}:F@z((yjESdh0rsSyxB89E0LJI zR ށ؉QI?/qQÌzՔ30fX u$ށ㠥0b=1JQv'8bݺyO(F-9qқ##JOZx14FFIlOe99nhS(cT© NqiCXdRZi,q$]$bץVY8bsǥ %VG ZpxGJtϕTQisϽMA8ѓ0E-R{ne2rUҚ``BW*x첮F+`) ʞ>4;.9SWeB7\0775Ɗ*<H=k%f[⟙VWqc:vCm$UK,` sH]i9pD& V;TQJ㎔yb(lw2HvoUq`JK<B8SH,,P+BTar*ΜWjwR}*dO_zbvdf }*Im6rJ)ǵIwH' DΤ)= @*7RAjю%R꼌G'S A_%<G!x3NdOaR; 5)(*FJ=Jߵ`d8چ\BwWOjr(r,G = Hc.2 5MMzFRsHV 3-!lހyN)vNg: 摔I {P!-=1HTq8p=;NW"+hy I NڄfwdlL$ݸEd X̣o3Vy\"|U}0iw^qM1 Q@Rl*Qe`"-.m>Ԣa_->f[yv'a*ӹ99nJsҖ;Aj$GL `K^z (iRFGEQ4ܱyQ(,6}TGjLcfVTN$I=T2 *`åIV*MC3L¦NI[Z+mrS H#:Li9b_jisvEš.W! 34DG8'C֘4)"lӶ`*92@cL`GsF3踆A34iU#>ph{?$?(Sw3(3|Ą kqx$a|G̺vHI N)YI*iTJ~GjI(&*'q/j7$ 8;{YC)'gJb2TME6i"ePenTUKd9ON3Wn.aTVZ5 >ϽCm|[΅>PNx|rd2L3JRhҮm'2;Vǖlrp㊕oezU!¨9x uh9ypOpxԘ%zu+m r!)P`t4NJ8ԃ#Lvp ӧjhRJFNx\zsڞTzw Րf U[3)?+f8S’|ӭ=M+<YTWw5'YH^qVnePx4Tģic4#`$ߊ]obI=(1)S}Ď&I03u93@r>aLǰPszFir4is5%g+ݍ\nZj!+ǵW68?Ju˵ MR"V.gWjV$#),.9%gpz(#:9$d){x+_9Ώq)ڹUU(5A#Wd?YbЀzu hܘVa(ǧZŞ9 aԹimte~a4͒PsLrN9NkU;{i0;zR%l.2F3%Oh%QJaûkuݞX*Aϰ|c@@XO5)TnG$0I($I"v@0~۽ 2;tadp~-LBr*7!nNe)#=cV 9*  c~j[6( Q(BN{@dYPPss`u?q}ThGz{P'ONEv' |UqN}~f@h*r;G?jT38 7~[sڀ <\O'T$JduL"c;2Ң戴֩r{9ېISmO?j6P)E崓I[ I9MN X `5URYKEyp}P kD28QEP$q 񥷖)#x=X1Am'8#Fkl.⠜w_'P3c֤'>$L8C}Q!֜\|i18'Җ6nFqR, Qڡ?+m~*asߦ(myܥ#y{FX`"RPQ,3ҴGs$myKvyZERmW9^"aȫUU=DX%C2z!tT`jŴaegy`7~zb?UO5́& S]A{qZώvV@#RpGҐ9CNQpE݀3\ojBXi`00}E3*U|Џ94 fnt  [Z=zIO>wjr;ſ146Y (tT~5̼%?wh$~>Ry]c3m; }4RR t.-!SOoֳn:3UE/.$3?y-|$r$-G?pE0+C ss}=iT>PRrF1HrO<jB$ ;Ґ6gڗ!|4GAڗn恓 p$~=GZQ;S@Ü@2ZQ5DLͼv' W-nPz[Z0̀q֬3&jXRH 9k[Y 2>p@ڐx8z͖2,oFHYeU3LyGWhE%F162B"1'-B"Cln=kSfux H!z;㻵A2d*Ԡp ҟGқ gps1Z#F5Kqy*)|6 OJl Oz?vfs{d; x-`b1#zR"ϻx=5v5 DHH(Ǝ4<֤HuWhFsV͸HweI-Ҳoo൉dsbՇ3`ҷRҪYI8Y0?7Uxn* P>pmv3*@vRzU92ᅪ3I!2oZ=ndg<QN?-m !#LPF(+K ryœ+vzϧ\<0]τx#Zqjb9*Pqzd` @>nxPdsg(ܹ dҶ8$zP`q}hQO58lǯ]w PWb7vR;M1N]ۍ/LHc$dՃJFHRIvMܙ%cp}*hdCx 8<"vˆP%sCޡyXaHZ=xCl&%\0vT jCqj7nNIVkK* 8[ ~TH&F08!Tjzq9A$ӉSR߯=xʔS29ǵ0].Z J'?w?oG\օ }8䍽ь$}ilSr(q׸q1jR(/#"2iʣ J !Hؙ!㎧ւ:gҪt*QOcelh [*$i ݩ22*1 82q҂#R_0mPZ["rG'֗RǸ'#g'J$wi44l=ė љ#coc#fjDv2*C;4rG6-1%Xey r⣿l]X,t`>g2xɍLk;b,&՛[4AAx5^A1-yOV&OŬD !sZqHL6>yr+i S,@.(ު&_\eGozȧ7 :qښĆr܇=Ǘ{P`=w>0U*8& ԓڦ~}jp|q,:@ ryQ;O:Ne,p)\dA5xS.ZM\[E@75`U/8UЎ?/9랴Ґ{}) n'K8?y枀v"!Ӕ u"ۭ>$A)p|@}(I뚟 n ҡ OʤE.Xq@Sg=y8~|R`o)q؇=)\@֯*>R:y^ H$='\idK3P*9Y<|xuDdi2G9b~Tm*Gp{|ņzUZ/41cn;Գ6۵t_LLdd шs@'eԤ1SAu-ZJ AңDpI-<+\FŀEj&) jIXhaמV`ߚ{XuG%8U(@jdlzҥ۷*L.)$uR)p0Vc08c$wy! djY1QfűTg"W?J85u_\eJ 9PZHJXٯ"$ |5 䜳M?fǢiKѧ`:b:2%vs p¢Ҝvb١s4s܎tvEr%$g^6[ڝ`Hb(tƧcځlLdy^JɔH1NO]5l8X =Wjg^x8?4,#aڳJ/`oZ1NsXLZ1u$yU^#{6$_w$gwJ.DΔ2l\HfAy#ZA\SDn/ j{+]5H2{Ok1V r 9vLMmsɑeޅSgT01Zt :S|U#nv9p!Aw.~:byQ<ޭ/KsiFIy\'$qRV3dA9\; ~y]oG`Kn9wh=?nZw{hނwm8ʰ O#ʱQm4G?1튲 Q̐mP2I;|R8 sCpOUyXxLtc?-F\v$BAǮ1Xr$m8͒g̳Ny>V'#H)-,KW{@Ktވ3\$ yW:1yοiV\VP2qD|Jw:kmcO#<d~u-;/PwWm\CiO4꧑?b7n/4 +ga֥邉VKr:nZV>W'bmd]H6*9;nry& cޡnjqwKqG7lk/5+9Jc+cSE,p{lg=?*~$fX\~UQDɓ(UI1rN=Z˜ҙ;ӥh0u|`9++٩ >%XpxV#HPyhlV*9(:Q2T*&s=@QKl\d&bI·5b:&;4508+#H 8ޛ|IiW#;sZ7jI~@{ babH\oS*4Q)̀%d -TJoP؂fnFk?Vx՟gw@>x'ZMOaCOOJ\Ola2Y>2H?(U9p)]AO9HUF[y``N'9c#9/|nsLiم͠ rjAˍY^gP'۵4 Z,;myjO(,l>E3JIA,yԀӂ.ps=iܧ;?*Iga>P:X'4``N+-JHޡ' 7e=;@)bsV-G*U·*xUdufVK͏#q?ݤ4 rR[@#ly\zO3:r䊹}+K>5:| V *y*<*2=Z1rAZ T9>7ep8d&i Sz2̤2 .v9 BǒCqҢ, V6Bg$E$coubh jž%HJ:89(fJ3/']m©>j؂}{qRM-RC"6d`4=iD]i!}_~)(} f ]Uf8Emoc!VU==*x* m3%tcHd@B|9"p̭㊚6'$dSZVWpʸFׂ@*UU|Zw dzcσSW饉#d6lŭ3G'V--@c=X(Ӛj=Rc}o6nˆ^;1*8 xc=cV|&XZ\B2[RJ $mdtoidD!i'+犥'XfUmĮ3Z *Eǰ$NB89H-Pi`#0i@ 7U*1ӽW_,˹9INKgjV 쁷gr}*Kl^xݹ8f2zR~FjvrQtZQ3fzʻy_ XHVjI%|'Ԝ@EO~+\kyjdǸ~ulwwkqf;~Tc{KtJ6)QL.6BcvN0'@B8ʓ9CP\C<\gWQOû/ 1)]F{6; UVH6AOZ(Sޙ! CW", =ֈbi$riJ $S.N=EFY q,q R\V#}f9#jã(88hm0sEG#~IOZzĭ`G^})cfFbo'*(ӂPAFGN!0Yx H;9LypT)gْOn:D {f1!.2 # 䟥 [AJXЕr ;Q$@^Jm&pA*8fw~MJᲨ0֙oٸ"DسH|4xdϔX sBFx=( SCZ{(ϥ ؎paFE4E :5i 5 C1pèb1JM ^ #BpsoY3ȱƥF2F3P'IlgO0XMUVؽJ&˕ ֛4qP;ک[;HSw98&6}k^2^KHˁ֮–X ˷Lq߰.[" }qM9ȻcRN_n6?R9┠93CJ˰V8"iwȄO|(@,abNs梅g{Ԝʬe$c) 7f8Kb"[ߵ5߹W 9QI 'p9,"<`֟(zc~ ]c 7ČNUN i*6681B%'H'FEϸL*BM$ATޮdkN9xG! "P8GwϑqSfI$A5Yo%Qn7jOTML)<4IԊe&n!޵eh>OE\Qwp+ F0ZBs#&TH˜;1AAMaNwsSG['Pv3L ;̸ǥMbr1sG ;لc;N<#Sw9Q%j0$Mj")$ g2YY U#AFr*<5ih0?ޥg`Nr=*{rvP\TĒ+;NJBcaGuf+Rܭs 7cfn G_RрAR-ueǁwiZa9bO)SZVh˼4zn=j8 UFEt 8uMFr]}9L&lc04C)+^lbU#8pTržE,̸[\M'+HV|!}=DeQ©sQC*jH)X8dds6y|*{[A2ԅ@'R͸nOJ`^N3کܒ{R\@ޞFQ$Hֲr-k}HA{f)2X=\R0rG%pX8jd N~N6lC| qNMW 7ycɨr29'vc#c Vm+ E<~L ǜV֠x;ETl1QzMX]=O C3!Q1ޣQҦhUSz+fF =LQ.c֐7njBE!p\4QR6Ksy^TۜŧHbu|`5CTK`MǜU"3Sw!.yP+d#hO U%_oʪ14WWVV cKm9fP*x"L#z`<FJr|dLpiac֫<d*R WS * ʦ݌!N hI'֙(vPҟn '&e u8uүIr9XC+FN֬0JsQgv=Uq`A3R ryjxFN $Tj9!X?QN3YR{U̒P:c =6K+tb9f)!N{Rgn6=+ɹeKU I\wEс R#8Օ۝ |ra0y qUZ9#9DR5l`whcSxbkHX mw$rY چsG4OZǐ z[&6AI Vp'Ƅ-' jZ9؄q:ն1~F,Ӹ"}jfFhacT6=1.B.*UnFpb: d?xJpօ-Ҭ4~bcr &"Ni|֫(an\ɴ [i*2|FK]xJ28-k SnWIAI|Ҍs`T9sLw}^T=sʴ,#Ȍv5o@l8OH㚭qC÷iNy[S jxUTǯN;2-$1BL8>犩9f؇wT7a1-VOL-LoB皱р4|婱%;X_p>"Xr9ȧ:8C֬ ݝsmKp?*菄.ZE0)ᔐÚWHWr!2inW|.߼ݎI9{8hrUcA-vltqrT=[$*,2x;իgŞH-FA68Z׶0>o1":*D?SZIRAl}֤~:l#a*χ!5ZNI敵(dAo?G%wIŷlhC\)^Xk8Y?g$8+}%cӎ@L. R`y1"睇9-}8 4aٝ_ϭZ]W#`<jIlXȢ4 Y0`{T[GF;R񀪹6SsEM+P"D(ޥ_/aNϕz{c`rJ6G 4 wW @4{gY7.NqUM@m*p8IS1"F39*B;Z_ao1Kt\ fp!z20K"t!=-U 1$%d\7=o%p)s 802|7An-X1Eyf%X`z贍6@Ⱥ=Z{6p P 5^e&M2BsUVysZ0ĻNvTiZû)F%ےpq11 xLw$`qDv./-GҤUT j@w*j{M dqJ1*[aY1b4{h#ERb'F3O0\<.sZ(XXvP\*;sÌVܾ&ʴ@d.NbbG$ 2q+ȇr'=trۍ~H0}ϧF|!V+9186ʪX, cJH6'~MyK *PZB/ C$uB&D2J2{Km4oPedVpcQ-I":*NEPflttTyo+ CM-I\ƈ6}1Q횑ݎZ4P8zRCuqѨ] H&5!_i7z{ްu!gZ >!VpT3Cawh!*ĞՇ H峹6:ҶLܩhveU2>;VcW[pb'SUZ4#$#GZѶo)n0Aa Js]>Aę~(J)7iZ /!A b_Kuzd`hːO犞-4@Gsz&bkq ^k;#Ჽ+ՍK㈛vWm$ֻ]&H#?d>hr3G9ZIܳ:;U>_\@VB9?g,>­lG*0%#k(ږ 8$v'G1=TCCZm" VPd3BB>qɧ U pHp&iN8,E J0H.0xgTdsH&GJu5by$Ep9;/A 7-9Ƹ?xv xS=Z9EcHms!P0TLHRD`֬"АH8Cm"c†DQɆ95p_+TmI(tj*{/ީ)y!h .ZQjR\RsNډ7yj88YazTuv8PE+oq*2V׾+:n/X\ƜHQyG{Vgni$~K,nL Goxx}MO5;uQm^ökU o]Zky+Bĺay'ҹ2*,NJ? aM9e|1lRHs1l XnFұVɘk zV"YOY@L(ⲽ6FymjNubv1e V"ǹmdֆݢ di?rdgD~8֓qfI9/ |GgP4q2= U-1c隥O*9cdUeNzUk_! +ߵ2{iA 7dӮeYqҩ7T)Ќ⡸"A'zEbe@"HV-oB~aԡ-žl,VE' A*6=h2])S5(Q޲I#,=;;K[,Vǘ?4awK&F<8g?K-6985B[0-[v(-ުo9S>s'<)PHF^:wY>r69j8 h;z]=S婸B$Xb2[*֕9%3+LzUGa$ u^ݖ,`C,` zA,ۙ%*{q)DV0X);{*f.1OoQtcNnH 1̹Ia QY4j['5vxcwtV4Xh[]COъ2ܖoRVN'$ l\*;Ƃm6|pnCrMSLl&iUv1zRb<=8BLkpɻQNWTw5`|OozӼA:c%\ne y˜Woh Fi SLEF욄p>n:l pd0K+T{o`}^r?wWwⲽsϴ>i\~`֯76Xpp"kc T˭e/??S%4魉Y"68-v}pxuy}2\S"Hqq,Aq#OpکVmOӟZ+Li24L9YЂ9h/ʐ<^)} uHV&ٍ9U+pL Q+f 1!Cgg;$\ÊibT`d`31CYD{նdC ua)8.PVSSFH~* O_4Q[HzF)\袲QaR>QY3hor}kLJ(n&rqkZ=V32 OK2?ןI|hj( P}ʺ?THOc (DıՏOEVV(3fotocx/images/stack-noise2.jpg0000664000175000017500000005547615247006660015322 0ustar micomicoJFIFPExifMM*V^(if%0230u0100Fotoxx:resize|Fotoxx:Local Contrast|Fotoxx:Local Contrast|Fotoxx:Resize|fotoxx-23.70: Rescale: width:618 height:244|NEhttp://ns.adobe.com/xap/1.0/ 8 435 1100 2 2 0 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((j" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?b[tf7jqB{iQ΀80) :Jj̾BD#r}ǧWIILr"i9 +5hWɮH"p\/#ֺ7 y>W!$Rm u]B:D*UAy j̠y$t\X{{)q.dVtn `PvW=E!)X~`wL,G8Fw{Wz׈|;&nʎ`jWlcoiƣ]C$ k©8rY8\\:QE xb3xfj גkww02I,ǚ<zIHy' \i:vm%f3%t#n1T`j9B-.3ͬ@_4.p:jh|U.q䏗۟Li&~N0ۊ*O'c\>(}׋m;l ~ar'hh5I$#%Ę96WCwIxX<Q3:^|x5T1m+$#cZ)|{<яn՜tRZ|{ cbUE!^g}=U|쥁&2EHZcy|.&[˸L'Q$CԨE6 vovԡ^jR"(jGr)ǹrTnznk7SvQ$Α8=yR#@#aGz콐GqLvٝ؝Nr@R6Z!کg]9beId#t̏p6y֧va=<]/%n)V]>M 3HGi-j޹d G% p >IPdj"E'iϦnH*1:3ԛ}JcڻQhĕ2@U13ݐ FӰA OiBpN9z%t2NuZaXBf .NI94TZ|FZh8[+i!ԲK}ޝF(}jE2ϵ`xf:$I1#ᚥeOX BT,r.PUOCҐgː̒p=sXi]G4 nCyi[L̗2m\ jHf0Vң08 XLj[["3lEW u xͼ9 ݸV" H *ұW;)ep85X+_\3)I1AEY]BEĂ(Ķ ЍX8==+P+cY TaAkW[`s K2GI}dg@FiCjɮVzUv )HI <ݪͧln㶉'_d3V'$~zUZsFv(8q&;]Sz$n,&K+++ss)@-2m}t?:Vf3Q:FY0u~/}HcPg#"'"͊ZEd)Ǟ;ґE(>iSp`0OZ v2[ڝI7h`:o RsI#;JPҁqT%P7S|o~M4*83I2Yim;T`R#1zLlHtă׭OZh 6@Yri!II\3IXNXuִn9s;ma"yHx R}O^i61ڡX~jm5-oߎ+J). iz:ݪ1~Vma$Ay\-;{L r 0 U;r?fMiD JhPbvcBs70wqR/1/MYVlT-T{ء;lx,1tGd`qLfoee?4g#'OzK^Z̊ʯ}+`S):{m%@%N[Ԏ94]J 2mIu#|mA>u޽ dSБ,zf.}:hXԤS +0ݤWhqW޾#k[sT{e-qo@'֪\G_ifUڛ{+*e + ƌIhzw5/:y-/fiV1>P0܏[MܚH!'v짢^,$iLGA t@* ODV5%jR۾'!XgIum2RKSoqa1k]5oMk=h.Ll9 cuOCdY/`߷BcE֣m>x2-# UGӧ^v> ]B;i -tF_aL[EDZsS(PG&~Lc<MgPS-(T,)e*0FIEE*W"搌E; GJ7B8:b w~ ;v(zC3Qk Jq:Ӕp94\HZ'ҔhҘX"d*ĨLnɪvpFCeqXD|n+HJM{mS<]}oc` #B&4]2{HmVB@\q?:$ nqC3DL <W%˙_s%?e2q!Y8!xЕ6ya1UH=^l!ʶ9>?1QaT9L#4V55sOnM_nˣjaƖp]+B>W#@M[>.5{D#Z 1r8=* cJ[VUf}ר]ʠҒU,Sqxlt\ӑr[y$<9ΙRkIaꦻ32;vpTe@q< /wkVigIzMOtu{n-[Y4u9;QǽwQ)8)}$!@hW9 Jq~POXI4^o#vG Z>|Gg# Fz zpxVD4$ r{TiPV\sAOR98C]H]\dU+ ;"Ul`b[֘SvLF%yKV=HzbDr*Ct/*wHLy#zּArԂG 88&<"i%ciDYf8>=ve`b)4$r 1~\$a`] =qN0OC8NW+J =Xԁ['21 Y~QZ(ϖCy-bHwQvhC?5+9wۥ@\R'iOڗAjR nwi/ϨbMK:SAQMf "C"')<A*pqmc_ 9O z B ʝ@N0Zx߼JaJzvM4 6sNltC3U;Sy(W)|5\&m7?()&o8,GJk':&HU|/U[DbI\URǓz: ̑crY3yJWdH^pAp8?+MQ#SrMD.;1mݘi38s(qښHFi.-sPfI;6[1W&XxNHZX> i+;Գ:zLJ)૓T~_GB>}sJZŋnL&TdQdLtasb{2n(4(֛yeROY JBr<Ǖj 9Az|{"ri$zs;wb%d7OOjd.U{TsNt%ʆ#u 1B<2F[iIn4[Wq3tAP?7cj][x2KQ۲ +H.݄*H’m 3:+ڜCXOZz ϧp!kdkO-j],/ޥRԃUEē0p@#"[l~&ewFȘ}Y G֪X=j̉Īq+cL4unKd88 ܨ!c'йxc4*u\$ peQ ॗHwE?'<ިN# ֛9)_bvM;zfU;!C8=+f篥"`PҤ@3Qj@Ð!GH"}4.H 0GR8 P NifO`m>朌1B Sw'AJaқ(p;؜=)=($4$Hh7֚qК \QOCԝXXޞޝi+OBjh(R9 Srǜ z`j2n*>JLbaNhh)rʪl"\J'br"FngTK<U@hhMbˆ.H)cW,8c ɨ| Hh#9a7(U^⑆C{QiPJ'AaCHT{2z ;QResGj15qNIۥBhln=i8#3gSqZČA84/9j{T# 2;t-+@9!K{Mhw#O\4:b}k񆩪JlCqXO/ !`q>>PMt`CzTԍ FzуOtMϭCd](0$Բ:4$`1 5vr03`R33IGQr=D \U0k)Dk֥s5 Ly!VzaqއgV! A# w-Ȩ&I;ap]XG@37:*ZIң$+e82gҥ*7/-ImbUIgn3S(ysP``֦f\`7E(,r#1˟1nҟs%)VtBAc+2E MhrZw8zI DQ}jH@49 Y̻B=9m|Xpȁ;٥vw RpJ㶻*̠)brT S}i۠l'[ /_z$*-CÚܓIhx[ZX.!sH׾|5 7]FlQa R84|)FPdS`sC9(R0nPu RxM, n8BHFr &/)lw2]ۘԬJ;@42 b~ۀQ$Qr䓚C8o#8Fj[ 晜E1!v0f8R<=*`=kϾ+j[ꐹM  p?hèq+mO?:9M\J@ڳ+s+sKʵ jajEw%|TE#MÎ([tq!41-EK)1C4=\Q$O |C,V֗p$y*HX&kE4}Oip$g*0jLU Lz|ݑ^ls6^=i$DdbOSX<0sPΒ:U2:9nɠcm*(MnS(WGJcjT([yvmSI Aa8}(Xr==)\2B+6ozZd͖:bڋ9n#Uh ܣ+\2Rm(IF iF C&M$ *cAQPcޛaTC$Xc)Q#y{Ӛ|l9lL ep ҦVdn<հwS֪DF.y#8=T٥ p6y |H]6c2p3z4fx-9T\~I]b,3L*mgJ1w f<HHãb23Pcs=bR̴(SV#rGoW$GB\+Ҿ.]C/gJQ{,z{T <-Ɯc,ivX$fc"BhG5rXzbr ؗsR [yHs㊾DR:䪇K;ri-_~3şVXdbjĀAs F%RPWj g>xv6*Z"q'*#3s* vCFemV֫${@b%jhJsUWOU/Wp2hi: ag"=Ť\Md+w׋NBG>c.mPx#?Zܬq+9lfY-Я#_/ʽS(cU(߽ނ!WKfQCb7 HƗ v;lc/>$iqg,bo(R}r?Ž@ŹbNWw6$zC^e}^Ycc?W=u{tndM5*ސX^Հnq֖`IPħp+A7)I)]<d1jf@+֒';FIJ Rt*ǚusޡMO4(K (@2#=ڼLyc*H= \UEKɜ$#<3E39ޑ`-H֜l(}*g5rĿeA=1F?FOT1)ȥ<0V&hbhFJddJ*, ͹J{`h3ؑ@7 f E䌚|UN\fFl$ϔM {=|dQ>j^PRHi Y29";F>W_Jbwj$L]ߥ@B4r<թW8 O v$N43fFM,F WLj_ǡ4yN l֤&Jdh(PeP-,'41D [Y6 c, ewG,9kps/9?j6RHI ZėRȳC t8nkKnm"idsӶG"DEȲ_BTl49PjSk@+`zu ݍ/UC*D~ ٛ=qQ$S횕y'v(ޞ+i8FcY%qLg;ri$ 15dy`lܯ/ڠ'X銖6f`OJkfvZ|mT(< hRyˌ^B)IՉn7S;$$P>墪}Va}3_Eh>1흭(zWWޚ6sjVf5#sk^T ͋@n\?v}?^z4HW֎NzIċY J8); :ҀR^4h4I^iZEbOҢH?'# i< ㊤;ph1?^^^)7a\7xS7\eԱPjI pe%su[)1#Ve? Ÿ~u<\6X;XN#̈>f >7T"X iEZ*\#`&G:Ryu}>iPvrJ+)X|lv|=qޙxP*sM;${zSHOZđefFV8??!,Scbfl? Cv9\"RQ\CZH_-*1ӵ%Qw+4dR@zq7 pȑ̌ޠvÜ9uOBcyRW@V^zmMp9-lɪZݼVO$rc4lM?.3Fm[EsRƣjvzkTƩ4Pc85Mشar*lSBX6S9#sLy$mr*#,$>>5`[ֵ( U]!F?$*pOzuk ɌtB`W+@1%|ڇe$N JOSKb ϙ#4fAR$3~1 ؍UMXF{OMXN~7 fYL$UujG!h`WY+R(Q@#Z8^OcG\u"Dy )B֮l ŊǽT4[(y=VHaԗN66 $4A*$hbeA9ni^z0}Qp>Όr1|r30sGgQ"([j+IN~rGQª:m:Qv OIsju1Õ]WqRIngPeWocq,0j)XWm*Y Ƈhte`p+!fU!ԜlF@f%`8ݚsfiِݘ4jMJ8r_hޏIUO8>l吶j6U'Qd1VVV7Euy,/3.jq)yVNMB8<ޫ&'޽qU}J1qnsխzGOQ.3gH U啼ѷRhs,9|FOdR])U;9|3ךԄF֢F/;kD*`z} 5-ӡ]" w5f@$) go ^(20$Ɗ8A v_ZIb-`oS֛4yojvܒ^-lfcniep7g5ڌTUUMGqWc(9DC$Jtj1ܫzS^sJ 2Jl)mJI#X^Zl]J9!RQ9 vsR!rmE.:VH\9ma?ZP ˠ8)& O c'1LupҔ.HYقuAutyy榺dE[f0Q=mcZ$4ЮTE|]La n57桷r(϶7 , VeЊл-#j~5XH :Pƴ(J1>Bڶ˃\ޫ CֈX׈gzM Gq޳֮Y[p՟x @RKu!,NNi^1"ۻHonE5N»R=VP%̛i{D3V82UK,I kFqBކR{I[Yp Knxs,U憇Υx:ҷUBZ$օwNZT3Q[]CuKm_Z#ZqJaHkA\8P$|/8TA`'Jb3UY2&ɩzԶ\KiOȫ o$qH \{#!})\#lѹh#P,z`.-g/ݦ[d1=+ A&=:{r((&Zt ,3EPL*%4Eϰy ;g/L c9T "R0Lے@MsWgW%|OW @psRôђ o tg!YAARNŤWÆVf8FY ےzo0aGz[t8?08'".°vLāuU|aP^#Br6$'=irK2"\yw2؜wE||)j4\c>0M;~ݲ<<⚈nU;Uʌ2$2<3ЁND(B6㍽Ԋ>>\P7#vV\Ac"Tfvp?w#dq.1~Y67YhRٙwgE#alF+3O! zӿypi;RqeN eLAN%j}bRyFYKR+TmBr1Xц[6{Ct`r{Sr.zsQL@a=iFY󑁎|m֤I~nҬ̪Hƨ'ST:dgrg8lsRxlQOE(t4C| Aӥ:C-'V8IZH7z"8bèsURe[ WI'pH}EnO@⼷A]*&Dgok9틟":ifjVr*@#=Iq*m4 (J榒Id\EN \zBH8[œ;zV,r`JMDW?0, LY+BY&ovmI9=)&Τsg%>6sҪ,c {3(F5EmvjE $(z^SA5#y_x?^XҲrr )攐M5_58-zhF '4+sN`MZBHE5GN㝾 %rw`>SۊCHl85+ˌNlW~|5Vn;UIUIzPw`>^Vn#z&ǭ4$9IV;iK[^xE]HWG^<HcL yV>jhkO_Zk!I'6FwIc@ Ƅ +UlLA&$X;(NK=C@] dMCjxd-! x;S$g{Q֦Uͻ4cZHʵZDadPXn(_cx}{^Q 5V 9lsK9dh:ar3k7cE+4x\.I+FVZ" J}_SW zw=(m'9 s:w-̐٨u-6)d4Rw Ȭ1%}"?j@$ 4dWj_ko$k~4OcL{hW32Lj+V(۱b|T֕ѷGT3)cQ?MǜLIJ?3w DO].SK!gs || п J*f$O50"+_F̦e;W{]~mw֨f꼃N'WM3U('*/OxMhhŁjqIj\_Lгuxy9P6q0:O:ӵR;83'Һb꼜QQx+ϜrGgmxj\XLqI[qSȤzĆLi95YBjԃ,NpȠe gLGִnWL*J tU6\Zfsڴu݌UK MUNDt7^T=X N 5+dHpi"6!S ; -e܊)m6XXD-*)RzɱF䔜BI.; *҅Iӳթ}kaq1#o7"qRcW#G F)._p$?5OpF85'ݖVHuYkh%dv\nzh5fI|Y4]8 f !lu\@P6@gz/"% s諄#zTSi̊{$jC)Ƈٸa;偍=cp}]#1a2(+%Y =O)DW AF ~&W/x)^ƨY c\^6? [+̈́G79>z$yH l)FWs~lHk ~դKpH8* ~f \ϖcji"i+ vd?*u$Xʨ<8]rP>jrB,-T+>[οb\(YI613M|*TOjI+yd#3i ZB6*WUؠWl%ZD9; 1> 1+VX5klmNQCB\@g͍KNV-«jhvAYj̄9r#ȩm$hhāVc9f]͊ӆ8kRFȸTGn0+;V zU(ثl~Un?JMX&fn[9R$fm9*9i'614b e. 6jy @XiK!֠6`Ԛe =\g) :7VsRSb#3vu4rihI NqgQϱ5_ R>W%#9mq?/wsCE9n|i̠tVʊ+lt =r)YLitQEHqal)0q+7G4Bǜ }c]"A]$kܠQ\L*n2rRMj~H'VؔU򑐒Q[qEdEup9#_$s(t"ҺOJ63(x$mSp@y珬෕e5WfbHzQE8 $$? Ċ()UE,q6`*[QB.$Bz;>R6h#QΊ(АIj3=(Pf&s*Ig$}hȡn?x*(cXl|9E%KHuOKMzSG%_/sJRJ}hY đE͘\Vʜ}gm$]YQ{llvQ\ɍ*QLDs֊(VNU[ (W`$QE10k?Q9H(iTXtXML:com.adobe.xmp 1 2 3 0 0 152 324 1 0 C$8eXIfMM*V^(1fixHHgnome-screenshot0232~0100fotocx-25.0: Crop: width:324 height:152|fotocx-25.0: Sharpen: median diff 2 13 15|fotocx-26.6: Rescale: width:292 height:137| ++ IDATx}gtG &d" `3L`L49 rN(s`{w 9sLOWuM꿤'@?t:F뀮耤{w@te7ʨ9++ RSS߼{u"wkL;--M񑙙Օ|I4Ndy~6뀤RF])}}FICLLLD||iPjRhh(,--Ta>MW?NBju :zCp! 諢gx #t iT<> u@ M6  Mt@yo~w2<=@<<祭yL5>KPkmg5@KkDAlݺcǎň#0tPuOyfjuo6VZUW:-C>l++y){;CGFFb˖-ׯf̘b{Ĥև tG̡AzJ5gRRRT5MWgL aܸqx뭷ТE io&6m֭[o߾:w_VͧOoYfh׮W?dWg|2Fd4jTÇի17o^1e{ԀVvh &gp4:#} i׮]?hhСC\pA$x =_]y6ǏG``*}kժ>s<ٷoJ)GAAj~~mf[]UN8ݻ7~'шУy.82=YCT'@ٲmyyy ,l3kD/gϞ*D#?<ŋ+H̙37VoܸQ·T'@shHWZ{kLZl4#{!(?Oʙ\=zݺuS;A?ÎJĞEYְ}ҷ۷ ΜM!'h!6x@2XBA/oUFJqAdC'{{4 ahРAʈN2$z(Y ݼyS] Py$]|1sLؓˡ7G>&L@@:2`immfoݺ7n(O 4R7&MR* DgB;vTra N'F~&{UQ'NP0eE^A#_dk̘1O $89zh>rH*s0R޼OD۶m ;;zdX[($yuKPhg+x!^LWvˬYF݆ (4Z hp/zǎ4zTpiKSFR`s:ׯ+9rcCg*oB#a]]=)tilAAApvvV@yIU/BcKb,<ШexL0d ӊ9w\5!1LaIJMO<]VAϓ`F۸s◞!o4~%c"Ovpxžuפ2FG!him\]\\0gUơͰa;8p2K*f5z59Dj XOuy໫1xu*%u+; ab] -ĆCt tǥQ(x|J9׿SNC(o f<%zH$6;G#***P8Ν;KB8sاOeȚb  "g¹vsDפxm"CS*bupL8tcXC`/ \hիJ2D9y)/p F-zd=~'搚C4;}A=g]+4c{3u<*vD>IWvUCECbwA].h6^ @"sذ`Ѕi=2qXaExB`4T #<z gD` =$H4d42`aq| >\!'j $ 8˞5ѐahBpHFGFOu Ƀ18c@ގ^ơHG㉀;=ʎy#ణ Y77zM=93JIs+} b=?z3a ؠaK.κOvd$N*]ӋTHŐDf C$˗ggQcX=4  a H~ш8Ї`C6$*?䏀ǞCHZ@acPY3zZzO9Hy1:j$<re(+\iY/ib06>y0Wzqxɡ3qg&7ʚƎEq#H(GC4䵶tiTN =D0>^rzTW.DCSѨTn@id@ػ2hLizp.3`aݽ{ j=6d1LFojj!-8JmV ntVVVϟ?CN 2{Ue< XY < bgBcz3rXEo5@;M0峔5Pߐ7 iy`HOm$\u&Bb[؛o# N廧 R Ae_A2@@ZAl,קO9k9d< ;ʂ8<5zڙ;%'}fJϲ}it |ATf.idt)<*4m i|)P}hhHYqF̀6 @&MW^UH=$$rŸQYh| Zƈ8 hX/iQ)5m!p6yb٫Xq-ʬeF~XX\yq=Qi<s!O9*|3;s|'#2ŵr4CYI10=qym_]>q=HxC{ڮFƐ"؛S)j6FEu5?ӈ48*1@wD#}&zr4q@2ypMbY T%r|)4|dx&F̘M/r|)#6!=1ÞXx [Q1̢ 81?t ly"m|?C8H: Ft@ҕ(c}u\OQ$t@uH@KK 7q!ڷGť'loDѽ?׋xҟH\|N+reeP)`g}AO|_2ԗ')xqQ!}qiuPܹW/"%)A?}u@*FX7Ֆ~((,u#IXMBvnИ8nq[7 >6¢/!'K;ٰV70e@t3C²='] QZ;Ѿc戻0G|0 kVi*^P-0Pd-BC"Ib%VTT$Jmf‘ +^%Vqq:GVAqGYsBW釪#ˆDT+Xy6*2BݏZxK R!"e[L$ c.u9}Uηl+$<7ާ3 5Xm~6EMi D|˻ HC{7JudS.%n-򾒷[ŷFe*n fcҢ\)$<gN ^T3+й䀐H$$=j()ŎF]@8+Ԓ!smJd k[L=E8y,nR[x.'WWe-T~ڣ ,,((PLrTxy~:V8}__x^w檶2௶'AZ!WW͝Xd?5OU3d˨~~jK6d]xd]/%D ٳ }Fc eC&6=|;pCKm:擼#X7v"#-˒&Se#Kg`ggguKR7߉#Heʓu텸iqgʛn3yvX-tR~/*#vp {WU,Kyݐ6w+JV /'v̉ѼSoLf9V PݿPwٱY^+WG ^ؾy=-[ w¥8sxN\ ϧ0'úƄ!OuiC`jv ׭:+ DeU<;a˦ X!|ζE}/]%KeKն<[vEhF2ay<~ܰe5KfO#c`i~UA~MϢ߯y /fKKzx9Y!m7s8Zu/Wn/B0{|hnfonp Thu1+|Z7k(n-+ HSt=9_{IZ?k4i Ѳ3_|b~; 7lĺU?=1NFq nի쾹sN^CA&EqN܀{bȱo`t1^AQcX^xVz,_ё+NS?t4X𹋤XܧmPCZe5+~jol4~9~2GdL,b#pl t^BVi\k授rLm~ 3Dd}ah}C|~'.y!NvߙtEaSSG٩ GXD$2$o~AnmJP BgغmW/e i; B+<|ԧz-)™jQ([`u"%0qCAӁqI CblZTR+A)PN\LIR]y\ VGq3,wzERnCc-ADxF0f>DrN2t}a֦[XxKeCgA {Ƀ㫽_j4t? ){%9𴼀o?nЫw7ͦt.K}۹_cFf-= J,\9 N =$z`uIϝ>&@!QR\$qHI=S FILVTSb$狫D-:` *$ҹS(,`텝̸~2hh:@@~n֎0]Ry >{gH~⣑}CgJhu0k 5A70_D@WߎEfn @80 ҽX7{G bHS|ԯ>^e6 Brv^D, xP9cX!rJUC+S9Ǒ4\t^!+&2z2,X=N;yY]C'OA U%70gʽL\<o\'Ćީ3 1lX9 M1;w$& #9A&=RٹRX)7-)hF &aoоH\rC {`˗G& JhŘ6;: yyTJz^1^}1g z{%q`"3mm3h,|)s dU\ۑ,>$szZ ڎlssgJ|,Qֻ0N!eq罹$25,i.uPqZIie3TXW'O| G5Z|S t*%Tڨ |WV%|2I7B·HgC3Cu)(3պ4cu֥[r %2x(## ޭv_qSȷA[ڥ*w5dEs'ue)k֧^[-2'Yse{_3͢25_tĜmW\xMkl5sOchVj/Hx>053U *Z!-_$n߾'m,kiZ/sB֡;fRסpkk+kn6$|˛uݲ}\wX3* gq۲[ "$mbXlIWx: NG`ظg\psȖ82Y c^ I莟y+;d=L`ͦmpLTReZqMl^ G@zbچa^nN=\$aX`>,\Uk75 d=C,q8ZV\pgJ2;M{IepeR"PR+ai$;V| ǯ7Qr///B~^RlL|ohNBJ̮Aڟ~5 0``L4&>CdAD$>}mO}pU1%0YV_GG@bVL=t}$dsӫpsvDSDCׁzHe%<,d}8z !%bF ۘNu2GLf1W.$W/Kڝ[;z6tUҫ$i =!zEY2-3 who 9<%&_ns6t0zjeu@d'zp -ktj"<'SvI>~~ ~%d|N"/YV: d@ienri{{Yw$M_k>3i( ߋH/E\R >w%ΔϮw"F?[sP~T"__Ɖ3[E0^(_8z>qeIѸu4]ed)n2ShJ+EWqꥮe)",nݐŐ=U{m<-}1 GqxzB2Ѳ"ll ZȧH^s m+N>|L3V:B2Vt262۲^ukFIzP Yo//HtY5<! I,X A4brW~Ÿ +1 ׮\EMze kOv?Elqt\n`d J=g/+Ϟ{bgѢq##ƍ؉8h^AELVZ;(6so9V:>pHK:yZL`̥'ƨ DJ+px'сej*K^~ {_ٴO|閶H"h Hn!VI%QX0{~wd+lMD<Iv*܁fa1S@*Ş/%Z @ٳC`]-<]p9> ![L$6ɖl|e$ ;I.6Mluiv^-I+\Ǔa2c\+K_ig$ݲ T`-J3G3)iF!m I~mh۲=8|mh%@oDؚ>7 6e~)$ޯU֍*)sb?Om3~>ύ?zҰuCeQ+C1~]03VO3ŕ1G'tYq{chZ; -$},(^ANvh?ގ7QaaxHS$t7:$mRFM;L[f )(\vӌ yO;Byrh,߶m G[k\szu:P#@*+þ dް1.UB7nj_aip8t&|0ȧyllLIk"4y-䧼4 & !#9r,| |=rd/# G?FX֣EgoއqP\9]Ƹ)d[Y eПp2ɡ2ֆʷm% mֱd_o82 ݓOG=YU7c Z_řssS/F nw]Z\p&N#siIӑٍBc'p'NGW*;39W٭"64NH|mYYM#TCpa8Ww_z/Lِ@?q4-ft& |:lܱD7gYQÕQ ~4L- _AKFGʱx{{ |-r/ -;h8B>%(sC,dz[G;BϏT?ӫG:zvENd:vĘO-8^zYǕʑmz۶t٦Duc.mV7n_")l/^Շj:dܦ H t 9Q Ūx㑞%ѯ@^/fcuGr]¹Gpd8'5YY܂ uHF XsX$>j>g٨PE n<$ä|yE :$I6No.5% 92FχkNuɃ^wݾc]'_U~B\ <%\F7 gd32A7UDMOV{ CÖHuH9Yu/@doȎ9%DVDrJ t/ޅP t@e#͆J ?]Kę_GOB=k.t0jX`UǀTo۫X|ӔT$%𵹈K&,z O-Ky=YOP7[>厵QN˧)DսKѦIS Di= yi$8x7XL`L6GL?[? UAH^S@:!ëйM' X?mSa> iH+,T#-vuϜmrڑ![Uԁ:$׳ЫS7_LvڡSޘ'De=Jrr9Z6i1"=0d ^1_zRwCyzأ,s8}mZЛG4oAiΞE8o6{ܙw͗ץFCс:$sѳ} z;fSyZD4msVlEƼHV<Ha>Nӫ5>~"%-J@:n:zW?J ƅФYkL;'ϟŖsѶYc l92[m$n"#1lM>vgYޖLzrX]0=r5%CѾ&o3CAqJQ#k>B& ˞"ӥPp%0dl lwNNK9z2Gκ;WHMBR|~2xeu 6* &lTCʈ IQk~9_ѹN֣{)1y2pZ4m ϙGO٪HKѼuw߰B-k%|iW{gN;OѪIl>M7 HtDƒC+pxe0Z`{LL0jJ`-&\=ԭm[Veh֪ ~9s @rƤCڀIJ{,x$ έ[o6c1]l:c91;W4Vkt] 7L/k7;QVv?,+)kԙC>n?ZT! .[:WvD$lO$?![k|wY]+ϔX;DnCp>1d ra]0uZĕ=)àߊpddQ![.L dwciHKOGf˙F/W.E}V[pZHҿo=I뮯2 ՜XYN-˨Oqma2Lf-_&duh1~TMfb6}?=E/ٙ f1_zSH-AjH !v= ϻ+/#43xHwurPf [z޼ٹٙ* \޺k:Pha~2 6 y:u 3p7aJ\ㅑE9p v_~GanvCΈ4HYhe φuiuW?#֥yCu>7~5޴t@zB!OE03/֭2: T!h P4A|\dⴕTpKf.Wo&`jb$C>nK,[KsLG@ 6%'K*h'ܹuzXq7nFeBvv|]ܨr [vV&BdGesTPgEre[_~|ѕ2fi) ۭH 4&engmTɝzy&|Jc7x:!=-EDtd8.窱s}$FoETσyEgKSnUSŅ \뀤R$zptĸmP"GpKs^qǃqG?~M6]1Ǽ$wuuwqDfZnQ[!Snv\9y]xbzZl̑)(Ck/A?704;.Zl宩oyPFzcġRp?BʃuX"BXSʂ`ege! kK>lw!=D7Dt@Gl`L#! 9w"{)!(5Ca7S|<.:mЏve4Ǝe# WS$ͨЊH: 2hkxe84r-oTA^c@^Au&gũR@b`ej[Hްz//oC" %IT yp~˖.˰+iNX8El4r/w-Kh[g*/*ȅ%؂U+W`Xi ݐ2Y[vgHlEYq8sp7VZ+6d.BTD zHg .)գn8EW00v.ANn^=9G@fuI^)))!V$w=>p4^o>VĜ>Bw;pa8z:'hV!y $ߠ|>nގ1 @1jdL2 }{wGժNNQ峒"I(2ඥв9F^ W5C_mVH!U)\X_ށfoOmDR~/+{U heuhH:5x Ҽ/Cb`8)Tl6=Wh !^[}`zthO6B,2B]4 [,!]ۦC*RHY$a hթ/\q@QQ:nچޝ;"^ym˙H: DeO HE#p7 C`8weIJIuL3 =ztG>,X”ݺߠ!XRUȜn#ѳGSfχwxbyp9Z^Ǜأvwtzg$|f`ף8*??H(Y]$Tt@zeEecHׯH}Fwe0i.G1w]9GJ+ЪYs 2 ݶiRb]1k9GųX|n/STWMl{{{;i @vj -NF4"A!XVW,< d9˦ŐJ0g;48a ӱۉxQ J+BQ5l4^cHP?z(G&гNm$ò.> vG!7S: @J6\\ld$u]]bCW5y87I%Da+p!eY v׻]p*4Aз 䋬\Ȑ=ܗr4DL~W\ 1IDAT)rr\_;~ ;-CXn:ܭ&5~e_4 y 8-Eia'h֦ؼG3.!Z14TƆ[ s }EmѸEg=ziň;MZcڂpttt}mOwDrfক<|(ޑ /βEFoaجp睵zLcxgKe1g2?hpXWH T{N@Zsphtp"4iH[>1/0`=p12}$M$d~E}a2g!逤+B`jA`7';bT<07S==wfgŤ!Pm' _!O} Ck=$* @3t"s8CƀĠyrC/)G)=ELV"nﻝ٪}I@IOO#M/*ƪL(-Er}3:_x߾9|#"ґ-q J<]1lh#VġsWRy9O#T/XQAOyl$Kl -ZRp+,Gޞ4ڴ[#>KuAhƐ6Ym '}8tڣ!#:=L@PI HO $ !8- P)S(7;o["3% [}Fbvp|`avoRĐl_pM{zV̝(86A683t\AX]4#~Kh ]p} 4oo!($Ѳ G4N,i?&qj+f֝ar$;Ah}ܰUeґ}te p'ivXDǺ#‚ i#@"'ͼ}j5ow"PfdC-fMx=}~jReϻ8Ԑ<g׌frҰ_F6n9k*9U% LExZfۧYÐC0p@ 1#"|`0jPV>xYHCKƶ5ߣ_^$`cA2C\u!i {ĈQ&XqcoU ϗUX9o&vy]z=>SzL|Z\~3sFP q@57#R@C>/pJѾ0w;t< !坁ˋ?Wv0 iu@=+3V9 #irM;)=R+YP 76ְwp]2d ;;[XZZ}ERj:@ӓc!ޕe/ #@;\\u# mvxzgxHG g$E '4 =$* @3x!Ѡcd4 sUps=<8 Y-Ǝ8U#4Rƀ}0|VKgVi&æ(EKn̉+Swy`]=g\rs[ad$ <[rHɻ\FcZxm,ҭ!ꀤ+H=: +;yG|RI(5@D`XvFUmz}m F<7C׸:  ΃vh6<о.74M:móƛhKyVx6g+O>,<Ooúo5.=gLW$OS~nxhFPЌА`\Gug?_ס`\vݸ<7.HU*$ٟ2逤H)ذ]IENDB`fotocx/images/jpeg-artifacts1.jpg0000664000175000017500000011246415247006660015773 0ustar micomicoJFIFExifMM*JR(iZ02320100fotocx-26.5: Amplify Contrast| Ghttp://ns.adobe.com/xap/1.0/ 8 292 600 1 2 2 C     C   $X" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?0RR}i~׋..ӷ5 Q܃R}k'Tdk(C-ւxU3S"E{nuP(4 lqQ.?AduÉN_)jzGJq"ɮ=vU 'El_fYđ*cҸZo aEsc>ʏ?Z{™__c_O3baQޑc$և~ ==&?!Qv^9wuZ[{e0%BBPzct:HZ9J˵Ojh(IKHhKC{O['%R@ EP:Z Z^j_?4h J(EihA8 :1|G  -C_+W|,??io8ߊ6jY-yz7-s}P#㟎Mzt]*/<xRy@x*-(|Mi^{i%HWswZi%r=Ώ*bVn70~t|}#0pAG0E }2B+^-WhIƤP=x`d5}X'jJ3ցFIjAր?/Veƣp#G&&((ġPm+J ( ( (?؜K>nN;1 NqJG5R~17$bƶ*ܵZ)_ҢhZt7uߙH?5p\M ayA*MkoB%.K֙5﫝}~c |:|Ii7h]$eTpz_mgᖥP\&#TJW8u'H q;}o_mV6y8ɠe"/}=WMn =K\ej|GurAA0CsPRԅT05|k//cx]=:o f.]hUwZ#,5'5O̗zp;+|Q&YzP(*.niR<c?u IGXQꡒ4XuZ,NTQEKMg4@=iz@4o ]_+ȴo ]_+ H{?i+go,%ڠW~ӿrnտZ:&dr66x^dGNj*+V_63ޢȮ$ghpqJ>U̗m3Q{מbg}ؤwJISS8Ej]FdҚt6)~/3h󯗼mO]H.UeR&GSk /t5COG$Sz| }KȻ8yޅfHzlף7nOـ'^oU0 EwCZ;Q?x7dqZ"}v xR0k7J}"e/RN*`6u5Қ4J>!"=(DTM#>tY]G4v$[0(Z(@YI8AP;V.N;SĿ9f #T4%QEQEQE=k÷5WX ;i)UN݃q<#D._5=9ihת_xo Xa$E_*Qm*QBĊ;SN Wx--84S[y2@*9$x3vMWƍǧ%9&-G[y2k%aV %"G4)C/UVy${۳O&eͻ7?N+A]ì ֤O"|BNdT;Z5mq9'>x;ªmbypU50C 1ojG_ۆoZؑA?{6?oM"y'$2GvI/bxMU_\m0* 9Rw#ƝeffH>>HZQ qY7V֒8Iv4!"v$1AFvq8W+heKkv@F,Y3_ƀ]/峇OQ*yAHZ[Il`YrՃh1݋YH %&as3ꮯye#P?x(Y;ru}V[]R (珽h4QF;5귶ڌ\HحU~x#nl9*w^,ϟ0_<`O)D>4oiR:l9cUSergȔ~U]u4嶯#㑁?;0SQ5Δ_ku+T؉R>S+ؾ|l_O{l*OLԭbId=)(RRB_+W-B_+W|,q??ڎU.,bIWyR]㧋-9q1vKc yAUu&iV*K:Y$)>ysWlczSpH=+شgw[@>$׶Xdm`hE#?:7{d+>xKR4$ %ǽvabm}O;gmx3)R#L/WٶvhjZH!%GO%-*ȻXH5 qv^/^OHՀl־ L<>`e}h๴Kh F8*|RU-\fN૨58,To :c&@7ŖVWpSt3=[YCnn~E;4#䚅,kKխE#:ta"u%Wsjʞi59^Y ۖ+7}*(qj30Z# w AҧGNrW&.$o2W\ P=g1OnEe/IqzVa\Y"}ҒT @ّrESSĐOZYmա +sTFI ?$FĞBcd_`W9mWZ]ӈ c<@nADII,&3~'kVrwHgO jQ \TEMU76uay0[dA@ RPEPEPEPRXy8Z:{+ 'SK[{RV#-lϦ6`=ᏅaFs,u{g0xwesQ}6VeUW rG}xL7mD2 0nMѭ3J("O{WGqk,:ENf *3mñN4hz4g Ƨ]7/au;h(>ZyO ݘ.V"@'wgqi5f*o)'zRbGwaX#.~vmyjR1uk6PnkE=.r7-u^iu_n(Q b8҃HEY5Aͥ1wgk]@3*G?ZξV叞_Ackr4rFO4Aew/ a͏9uwúqyy֢I?-uKwPy1!` b$H= rHUIgp<}9'5x|6S5? >M>+gc17FȠ ڄ3*v_[ݞ657#sRX0^',$pZ4#Dr357lKDF+^Kwk- M[Kl\n4 Ԩ,OҲu[k\-[H`<3[~#_oF9OCeE-T Ili!*ɈI"ZNlyl;]3Uіڀ2uIhWմ$)bs_i={˄ۼ X퇘չ(MGnܙ..DI`Ҵ/-lo8Cq# qy  Ҁ>G/Dkw*k'ݮ.,Mo=BF(m%WmJrEe*kho/Ul- tL+eS.F zOzًOG]#k~$$Pέ1V4m)OݑMtӶVg_r)I]+p2:*:|wWe s<ԁQb}:P[+FbZ2Gm7.%0rނHW\0aΩ?ٞU`ukĚc>H$;2\G8\szv5 GW#.s0}5ϴy{bTR}`hl9k ~XPI=9ɼ3ui,2F䐱H9ր3,YqW5SO=6 i!?&d 2r1LVƣ'4+'#=:T̏V/ɶD.@U]4dٗghݭ(&fKP=pt=nrPcTF8s3@n2ƠKc5B i$\~}kb-*GNh$xW%_f!dVh.J&AYffz:|P|I'~ȳ*MeGgPr}-i6~vMM4I-asNe+G^|աH݌endm$:]F9=V|ȭg;#Ρy-#u3@g^fA;wɯdUu 92Oέrc6[@HGJnN1\8u>̲PG5 N)Z}Q@Q@Q@x;EYZfN[c=4Yb&!lcφ6>HSȲtsnK@N'lW 1>bx두?Ri5ƭihs!njf]V_(FP;St}ZKs8-zb:kWN_?axg_&Gh_170;vϭex 18 0߅9߆<]ksOr[@ZENQ"B5I $yθ%`ȚOG7u| {epKp1*f6WY_k%0/gh?8ٮRm:[I+ঀ3Kae A&TC-sjN\kdqHrgi Fi$[= CIj>Fp¯-dRyI6m^k{t*E3YX#&1d$r8 ))RڮW'@iowa\>YB1X<ʎ&uZ9@Ėiz{;k}*095 \Cu$MV;lzUh"%}໩ )[=yecYhm"?(3^(Q@Q@4o \¼F|G + Hƍs⏍>/*@B ϵT2ZDpӼI3,3ۘ<:+ST8NHF 8 խ zQE鑚 ۈ緄w8gFHq݌fK? }w]0» / ۋD<-xpS&yu-= ,`I<%nU?38} Ҽa&aUk`Sˆ^ش(kL!"'NZ _4n3⹻%$dj/nFrW姸Vs$'LWm{0_ƹ{)m ǹk8 QZҥl9*ޞ4ci#''8#Vb1hb?a5DBos3V{bH`hAgTkJm" COI\m;8玔Ȫ c50zÿӿ/VMXxg7cZi `*kE(N(GDeC*}{\Fw0q8wH,p7C@Z)֮5(h]_ &moG e\*?vր )OZJ((}bfӴv)^Qar=֭p ( :/E6N7=Vs[Co!I,: T_Ŷ<=GgƚΝ)&?zKqgArSٻiWᵁOze`{'Y94`p:m@"vRx+=lP:V/Bd^E{# vQ}cw)=XNh۰@A]ʯi]8W\xBi^=Hm-pOdh@SՍt~x U+ObV ;Ϛy&9O@9ZI )_⠷? >L\f1zbڠW=l}5ݟJ+0Oڻ9]Eχ[B dqY_3v?5ens*-/D3r8ا[Fʃea."_Ɏ͵e9&>w91_I^##Eps^QEQEXѿ/e_Bs? =B_+?/;#H񅦟j&g<Fwux,ͣC+jw8%FֵfW~Fߦ+_;a׆bIypzzTɶY9~Ju:Oa۞:VFi+V'V2#^yhtUڽ Ok]. gS[|7alaǓҪ;^:/|#([ĚaWrhݽM-+\ 08p7Q V1 ݃4 gDۓր:}g'o^x{&xsQx'C=e^јl>%|i#.6_֝ O\ό85'B6VB/ٌ}kҼ{+(/]= }("PEB:`ZMS9c@5 Í($y_[:Ͽ 4_\v^?NNi( ( (?1.t[O I+ Xx:H :g4Gf6 @$lD$18 / GnIڸ xBúV4$2w {-\I(wqVa\ߎL)ƻ tKj 7H]=W哞OJ!5[wAQ `+Km Oq3; @/)ʓ^ -[;xPq,2kya¨@0P01m9/gI>v*"[2]~f{zp+δ#|D לh޶,{{WEyAb0Fe|2cRQW`c>G5%hHr޵ "?ȯ5K$1Y0 Ѩ«뺍^]FX?gWawd}n~eoM<}+׉ ERNJMno|A![HH_ԓ0Py5>&giRi.q>.*ƸDbj喨j31c݁5nV$s%jtZԑqums>UŪ])` 4FZIڱƑ!VFsz4.KC"(@$ 9'Xzjsk,*N_ k-39u.I"9vךLkCoGE3)+(~fq//pEW9RUٓh^S'*4gy+nFQMe2?yh1=ፌVaPjW;kEPs6PMRih΍!/BW!^w~y؟_u|xlیIwlv Hr~k]ž%eWOzH+_;a߀ae46qVg55ҡ'k<JŞ/]?l2r/ZF[*kzREüwonStN:}q}񪄊3B֠BKGP\W'[O VYtdME]pxc0;ZZ$b4~e_I69?|co}O0x֏7Q k}g5kytGf qߟN+/kO79¶]?6gMy|G2-ո*F@rMliw{$:QbofoueF 3px5#T Һ$,Ml0jۆEVJ$(0*7QɦûgKi@] NzM9{ŋx;I+6Jc֧ryb39i`!k[XY:-mnd*:082&9@ S8Q\L zdւr*N*m%NJ&,wj1uJ5\̝ 1|7˔&5!nϐfu袊(( n0 e.}EcxrULoHo0~xB6׳by#ϗq^C_\ϩP9\V)4l֤Ҵ7[./JŻ]sɭ{_l:{@fUv[ kKgN 8 O,L˜u_Ef˟b=bP|~!Q5Eyo";F( Zn2HZ++w=:ƛx+7IX)z鵯 xxMib/*ҥmb//Kmrs ˞V)Pfn?XNDȭ6ޫ[XkU7KSXoR6Rr84LΕ;ǤB۞ጋҺL* ˊ4V99WJJܿwnǘ-˺i19iMDGLE+?P)^OSbqTXeXR~aڸ*y j Bj_9 w2~(Pos@2W+_~Zx?B8WJ-N0z~u𯏿gKS"2 IRx@-?/OMDq^chG bfgxir?WzҌaRӭu!XLI63U?AξUX$J[׉QV)XdַShpEk!ra =77n] W| vo2@` (#o+3-%-( :7,?W^G^#Ѕz~߅Yb~$~h~q/Vf!9IDPۀ4BL>AwZJךxnK`8#z6qWSR$݌z7 >@"i4{6/]6 㓌sWjH9ŞPڍn ՍT,i=ZEZ٩H1F8^.}+Scu co4kfg`ںuGdyrr!sGSaTI] c1oݺTMS-Va :&F*u9< 5̐w1+x$rVcEjv"G a{W0̌Ц+$SIj2d9{zIz?#nlaێv 15_Ow凑p[<{ײKy;Hb\~lF/<+7OZ똡OW JZr@UuVaZ]9$:9@ EPEPg4º<12FPD9k{jzl޹mYA[7PqH&%B?5anֻAhNڕ:i΁)jq<3Qm6UkI[zL+zU]Dݽg4UheD{jȸ",6)sl0V]mvInBXCNZfi64^Z `0<P,;w2.-TZ]+l ?FpMu&LʀpE|wD x8nyo!kw<jZMI6^U_~CZs|=6hcJ}ZxÑ]Xޤ "_24 Y@%W7F} u<Ҕ~J !40!fKIҔPC_+?#ѿ/e_Bs? ,?,cky߈4w2xs\NI@q(ծOO^u\{5j\ָe3 3DJ0#A:V$!ê]BW xho&"bɭ]Y%=+F'jڵ=ǒ jd׫躪Oqޘ_6i:ڼ/ `f=ę1*[srz~j頺34"ްt7B]#&Y>BS@_x&IK +5'b2^B#PZЕ|;DzSG{w؃=(/ERۦ/FTpHshq@[paP1OEisWۇp)xʃ{T?295IrzsI R9(?OqzQOֹOX&\ nY]5qa1_Z˟ dvWH2ESq\ֹY]&)dⷵ Aׂ|V3nZqkK}NEQXq^n35GFp۽zïB6FsҾu:(&$Uaqk5crfth$ d皰:v*cIqHNqAέ`>( (?>Ԯ3QbXkѤGQZ D@PiPjͭqH_PхA'޳t3ijcWmBU6hyֵkucC[:xc {N21^͠k:_5| פx;^-8!~;Zz̈́6'i1]Bf5m|oSm41&@ ҝjT55S7Sce^/Q^YB&6~oZ—Ku?&?]חF~q1ۚF`Bqڒs:qN֠Ĩcq*yRxDu& k1DwgѵE2{Zyֽ_zxƾuyׇwoQI\M9 U}j$z2*e<8'-6ԌrI̞ ϥUv84ru˖#5Nsuwetc^7E 5QSTgt- |$Ypד1W4 㖫4nL\t\WWY |) ]jZE(;=GcMI]wW/F4Iǵzofn !3>:v`BQ7G[bMjpĜɿzqYk6$k>-h0 u@= _L},.Jp+Kόn'I⽚ad[$  0 %Q@ΟJl$qzS0#(mukyn c>zt4G1J(]/ByO'tմw܏X/ 82AYW.Xbhn!cdÓSmgo6WAi5I*Kr4 O VI̓NKTctLzo}>vmFYpFˎN(x>k_y@YO.ݯ'%U}3촛x-3 < ZMf&ӎh7rr:JXd!wW`:ːǜ,`<7Pg>-?V$fSDVp<R:߈VqGr@y|\_6{~U9s[_&j:e&rk!$v>2{)' ^NMwh89gi]y! 63+orq6XѤg Ż'*Nztkx?i}<2}Y-KPfwY(gL$"޷u;HR6$$[Iw-pךS=k /~Vj[Goͺeb0[3ŶYJQ=ޑmhX4gjm~i3ඍ9 ȍnB"}mʹܤlʹ`֢9b#Ѕz~z7?W]_v#GK]'#7RM;p[Z!nT Y ߼gƣTnBP}Cĩn;j-ePA{lXϞ #5֢'hQv?(qq[8^2:#iP@0|^a%1c״)-тlNpڍD[+e]w Ow1!?66W%Y޴R0oş]L*]\'@?d]հKd|HrRk_χVWW"keu<BmlW}9"zGF$>>$6`jKePG@ =X.,A1ڱUw޺ >_[JK/t GE#-mBP=V@kA%ޠ%KAz#,>Ь8B%GqFK<xbXm“Ncgo_eyi݈Am)ȣ+gK4s?8xmw\=vU8p CMsmrP cxtdl.kq]&5Mja4z#-2ue&һ}/UT#s~3ߟNX+qG<8&WUt %aWJF30Bo!t03:<Kڧ"^x7Rp+rs\]EXڒPʎ8~t ~. 1Yԡ|7]FKXۑHeC_+?#ѿ/e_Bs? |,??/~0X4>)bRw,~'Oyno]}zRܛ3+% xsg[ {ǘ [qpgl>Ki"Z8UΣE}<˩~׷-$J'8$٩cdWPA~\."x%P=7vo}G'ݼgiu,]8 !g(Tj|7gHWiC ҇Ug\S>"ےCiC|Z:2OWwXu=/WBX}Cր;{5r#&Ƨ:uuGc\ͻ>WWʷXhWRa0kr[ՓqpGJ-5X'_:#o83YntHJXM5c=:viĚtt6ڡ.Go>7>Sd 8[ƻtӓsm^ S*֐(t(6A"yya;F7v:UoFyעIe鮷@$dWzjhA@[2~P\ ,Mc2:WN.r+ {'y27sڀ;kXt|6GY{bϵ]R;;iRb>\ĶM ~j"戍v]lEZs @G 0E^ g}R$**617ŐG5hӛmrݡ>bLXmpϨZ \OA%ٔjQw "EPg8U%ͦc-8eS8?/֩A5;+* =5χgL nL/%fC߀|H沯]NՌ+zՃkj)ӧ, }SPPv+;ʀ9FL V5⻐n*+I+Z駐ME \xYWA2pXgVՅxID򟃎T~m5.X2j.ZmcP+n/J_a^"'*῰ھ vCÁQ17?W^G^#Ѕz~߆Yb~$~GŐ~+xz68-.`>1]\UhrݶX4=if k(n|vyR`xKt,Ձ uZ1(569 b-x:9..\9#MA.!w ,sfSε4د-[lҀ!׵(ㅗ.qWl''Y:甞#Wd3wYNE0u:4>nqMo0;H_|㎴Y52ڞMv=~`MjydzP-BZ #\SAnC$7G#,+n[ӝmHr:W0m֓s)s"ihXLQq.h>*:^*)X^1{vjn1ǃ@7q1\ō* qo$rJykgoJC7Os"f:,C 0w9ho,Y+Q/麌HAҢ ubD7:/R}(-z|@\|QU >g=طU/e Ў0\|*+fpڸ+ 6u[geo9r2a]n/L-4e$' ɯ3Ko[uX}5^,yQ\y9<;q@V .W#ja_dƀ*x^h[&]N 2Z4L>{ XRwOjRMZ!,iY ._Y\.Ɗ.8J_ug q<-OjILd^ D$d@ 7},#ROI Lgt C4麂a&+Pio̚SH?z#Igsg|G@IHIo[yey$$@Rh i9=G-ќ~5xKˡoq$#~1ku.4>;g>tֽAL:|Gw 5%O]0EOs0BXFi1}s/}/R >p$-SR2_#@6#hVڦ#c ̓^F˰n}RX0̯XBOl-4NO*(.7|L:kӾ"_ sIt $}j^KFN 3Ķ4[?ƹMKIJ4a85g~@c!;FrW&lc=FzV9ymR:7"eSO!?!=z<^px٧G]5CTc$^#E|G +o \» }CFrsүƖ N#I e8> Vi9pAJ{`sU/uO:IY ^Z𽦹wg$PL.2r0x C/MPd Q8\ k]:ȲpkЃcUk,~oq 0GNkinώz,nwB܀Iۊ엺ua퉍X"1sybEt>qj6 wC $sY~5fsx;M(ː\, NɷU)OE5H#w0v{mv|vn*[+GU^7fv.#yZ̚0xWtnqZ,,|BHc+2\C"տ-74v>[c99(F]Lۉi]jܕ݀Mrxbfm *CyMJ-:OUe ?:::{fO#>pη5Mj`\kD[cҀ<ON>c]W[KvqEkEMeaD)N!1ӥS@X;J|*-Ve$( B;OO΋bĔ f}1IE~1j-֘N#t_ qm}z8ntF?| >ii6^&ȹX\'4?e-$t 7 no%🍠՚+kwVE95u֣3_[ wq"W`Y(5?^k"5 ֹ?x@c?8tE[m>H%yZm5`=$e* IߝB ~u.qM#'9}0'ڹic wC`bNYI -JncҤXX7VMq٭cp0x*8s<3yq}oQrLV߇<=qVZt'Q$Kև}uoE I, k1 !bZC3[R?uzW%/Dlm& y*}[v[%}~L/%R ATVJTѴ Q@4o Y\¼Fŗ|G + HB4kvMIu!+%"B@;k'/9z;0 पw|(izW5u(Pǜsr-A]Žt.)^nd&5}W+&P4&c1\f+ kh!K x-Cv} C'ɧ1Ҽ_1Nq>&ğ>vGֵmj>/\sfi|z4\`Ԛpo>ڀ:s6esn>S^i_&Go.p@ {]VR+iGP9z&@m1< r8@=A2ܧwnW3bknQΝl3qwqX:Ɵ-ŸF]OFQ=V$m^eB9rh<=$19Ҽ66,ҒH.ˏ?ƨ "O^ٲz8یZ"MuR[)l7b1H= 3M)Ԛ{ 7\KMs=19T@ e  +$ZVxJ=1޴S἖wҥouGTW9#DH"0*'Zj}:t7?]5VQN8%9?|Wi3XmFޫ t˲NCu(mhvr>g|@ѭHckT :wį!x6| ݤG2Ľ_p?4Wڭψ 1Ec *IA䷩oKܶ`>(c/?@_|7R۶+ѪD eXT[bn[';*QsabVF *MBHzqҧ'~v:=Rۮ֍l9^*blyR z2roQ]}%E =`g!ʒ#~\8%Xx+ iucc0m~jCm K=kUVz\֗iyV~#}FZ]lP$!=I#_.C~k;Ks%Z ȩ"iVwG_'s=Xc֬rOXدY3I`᧿D`dS_x{:^\C*@kGblRƪS;\9lK -V >-cU^#Ѕz~7,?W]_v'G؆:$zexIg֟%և}^tc!<>Rf㩼 n׍[ޝO: H< &vGzᕀG` {Wa{^^pOÃP;YGR4?gJPd7Nrzq^]K{OeCzwuibvAW^o3J+y<ZQC"9%۞kc,n% :+.'bJG0@].3+t=N}HXǖz> ȶ]'aWukyg쁀@&tIz& acY,/'ޫêSRi%&A88+|]'TX5D|9:w/78uM̶:s\)00ڴ^fTH#E3];>#X@3E };(/G?ҦӵEQm'<fr}*赉i/Fz :L˨GjϽޛPs@jǂnMF&lҼys@ }nl*g\߁.㑞'<5ZyQqk+I"VYs-6^067>r8* q^/>Zf¿Q\ᶶc 'y{+OZKW!zWMy'KZh^)dBGGӸe뷓RھyEaK du9%ӤmquNVVG5m>ZX$S1d Wkhd(ǩ0kIJ.:icӼk-HH vz|7نFnYXx== &o" e jeEAWdþ'QM+EaWϟtG[)fF2aZ]\D$pBpڍڡy FrIl|5q}y%fU²_AO[C lh>@bFڬ sT4vIҀEP^$~"h}bҰݱ>f+o{U3QSė߬ʾR8ÿ,|Ahg?:wzυtz[ yqր3u_AfDQX[w yvttUS;|!w>\׵~d| s@s*.yĉs[ckA˫jƓnOoNV~+vNS.ke%JP.O5cLuWb 2)P}ٴE&F?jzND@#׵ 2/#Vފ?]l[A>qe31+95C!O -?]H$XP9 E{W} ]i1[\,yk xim|Ces~^7@y|أ?xkMA#`N@‘vnu>>$>"!i0C*Nk;gi Hq^-=knJ顆=+M ) >T2 zN-[OKPB_+$ѿ/e_Bo? ,??34Gx^6'F _.W6#Zʡl3c-*[z{Hi-?Š+6}k_;a r!no?u77P@&O݆7y<[)h@0~UƧn,$9#i6tO,hH(8#ztL% ]O>! VѮB?w׃[7N⨚@C@瞟gjaխQ2* o 8Ru 'ОkkT4sTPgN(CwݤD1\iH0H_jnir%Xț9@(O0v@c૘XgqP>!WA}F TwLBs@5 gDi69(I|eP1kFozmvJkV#S#U㏆e-hΧ;y^,1O,/J3ui(IW-K,y+;+fҮYXA=SI+hPFWr=s%c=+'yX2ؚMjo \#ME #EՑByI-3Ҁ9mW]Bnܷ?Ąbѭ+쳓gLԣ.rq򪶞K P:=$䐂O=kӼ/n]* ںZiz\-M#O#|C-oc?@Mqayj2[@pC%qQ3V&q0&tld/nK&1 :cށ'I:`9.+|wk=0Ge(K-~ \ri3<0iD?68rb: .g*G5[~R jJA7cxcIHco[棬o="NEqcV_Éw}gY)VP3]WtnIS1z5UT@8I JW\ޡo&xfzUl6H@073G"x7ס| "V0ִf#ҼF# +E+4U+6bYum7W|$I10~sƽ%J>ѿӼFŗ|G +o \» VPA0-②s:x,T?q\ BDGISgFy_j$ch5jz4K-^:+W5%DRfy21A i|;ߜd}9N}57팸*߈!&h e#gx]oc#A4zPj&\!0ccU+⎖Nl#xeƑw,$Լ)s`]iTǾO4ZwQL t-rۛ!*E=i`E ; Y`K᷌4Q@}Ii-#v5|:I234$=1ETV<7|`t>&Ԯ-HjzEgK;Bd~hE8]K] '5q(HCY>ƟLN) qEOLEQQ j]FU;vۛ[sw!NquSOh 0 176 297 ^rXeXIfMM*JR(iZHH0232,0100fotocx-26.6: Rescale: width:267 height:158|+` IDATxgxVGɇ2̝=紻ngl09,9'&g09 rI9g9?󫽤m! 1)mծ]jUZv&tZ, rUU c?&E 'd't:?F M‰8XC|zN'|=i#bL_1: ݈pHŲV).B3,B yNCW2x"@:<,D"kFF O.QJ8Owɳtr8ʘ'4 4)hDz5ZxųgrMh%BzwU>X: 8 !/i`ЁQͣGJ;Ktii%yNYnmrX bukTdfI'Xգ$U!jv[]"d_!5uIGo߲-+Cu&KWVU%WV@z TY*HS(~""U)D1(~Mh&%% MOn &&*1LrCDʕ[ 6tѳ뷿Q@kr(ƭ* =vÔ{/FlݮìsBKMT j63hZLnj޽cc H %WN83-;IΜ29yACV-[^vj3`mnBfjnh400u|2aw2c`7yD ]jj9=Fo@`NW$EY< F ~3붚GS&Њ>?b ꪑo)#rBB M/ M{aF(+ ) UtVP=LZrܺҥS߿QdlcI*Dɓ!ߐi$\6ld3M42T.'PgXPn2;CWΛ\g̞ڊJ0b#-{f&֮SoG}0nܗ!ФieƐKq.!c>U{{6OiFu骹u}@~I E.yf\a媨^~&r\f>tx nd3xN0z'Ҍx![AD[zw0AvNeK ׵i.رwy&߃GOl~2𠋗/~؉G\q95- 5*G.^xS\x-;+M\LGa1q;tTpXs8}јB1-{WdN6"ell,V~?F H' @5jԮ]^zu=>|S) A$ 8qFN,X kB̙3-#LB5GfXy!ew00ME֜G_Ya3P a;7ܹC}VVޯY~z;z4`7ۏ:3pЏkǻۣGtgo{ԬYgosV_w͜cZ<9I'v.{ u/$MuCΎhګW:^}\듚v 9?&ȾjP~]\:yo[vSSX[.knSMLHC`BCC.\تU?vO4nj gvl{oϚ5%&6jּy?cc^;e51%!|"t"BAߌ,`8@iFHBt$P}ȑ/K .;688#> Q&;H1޽{oٲe׮] :u*zIUi:D!&k`m5>SfbؽCZn3j4b?N͏_4ȡ{AC#F'u9k1׭[}sfn\b9wxf5&m^8i͏Ϝm(|jq\f7IÏ:^྽;:ulۼY#xfБ6rL\LDL/n\ɸg̛jވf˯G}V^V\3{w[f oܼiQteY /Y֭ߺhٷss vifmksix `0</B#a+25::ZdN.@ I% ]ω'8+A`p(n t0nݺΝ;[,7]DZ*b-،SV1=Qa֟WhXfʢԹstب~{v&E_>wkǶ-ZuȾcgtkަÁ#c\~Kg>g̨utZ|cFTs#il͌9ma_ؿWN(^Ϟ=5k1cO/vMmltz£#zI)ٮSG5?|\l}[4hyI3 |sjV=#vШqDDDgeuޱf6e$Ю]}ݼY>=cc^͔y6hy.]cRYU1&nt,Lt0C1D9,3>7c\5/6ᰡ/]d7ɓmڴС y8dz>΍[7kѺS0|ݼq_m[Ϟ1u&NQ6$Ƅ-_0^Z.vx8@vxzt[6ک͉6cƴM1jvl߳cuk7_t丵uکYիνyl.PHO_eۗ"xnݺrիW#߆ 87]>I( u4F0iׯctl/k>}h @8\Im*y%%&:$̩g͚tÿӧ(%4S(ek嘽EA DM~?FD 6fZ/tK;Gҥvl޼FQfS{D">8!YTTV>c~rE.Ee.N""p݇:p={0p\Ymީe Aɚ(1tݻqC^=/?aRA@E U!R.;VdI歫dd|UVGٸq#F'|¼UL?7wڵk3UV-A駟6nܘ襩f']no@<[>7~;t s3?;uu|_ZlqLLwmkذ}'QwɳbR32T?pN8<ӗڶmt.]|/9%Qz͛?}IAp: { ޾u흿,YqIS?{s]8T| !ld+!O -D3\%$Qm𢟐54#92RnɅT="&_XY$PC'PI+4__(H~0(434c)ޚ0aB.]bjaÆZeAj:111g-ΒI&aat{{1̠ %Kgd1&%[k7#G 0ݜ՗m[62rge ~}ݽg[盬y3( rRy+:vHt٭['DD&& >s˿]a2p7ٯ9=>t_C rUOtЕ'6Ժ>*͉(.+?iC%?!t+(UniЍ7\ !3Ay!42C:$6$5F .* Jl-,p+*vKJ|BVz< ˕8T+xYqfb=>Ax, tG^x)F^6c&Tvzκt_'c"7Yqe pE֚*Q^mT+(I=.ּ,$}Uv~ZB#(ݮZC~JGBz R6hWV-Tp%#bkI!v<"t+kH"HO#hD ( $ ժ䑴A4 x@jBGXje\P.z ?ڛ+2GMqEO*N5(舼8R6S`0l#ګPl9\nQmdChtՃ-.ГKB6xCaCr!/̣J)#920n0hpHB'~̬b7PXqV.':pv!Z(C * %*Dc vdIS 䪃j\{Д "G*eB%;#PɢU `R8"BuEHՊ&{B^7(4OiZG 0ɕ[DKn)W"!{ MBP"3f0̞tqjg1 ?H)4g+NV&Gv&#T WRpNbJIFv6d P <(\>:5(C_HIZ=$IE4)r @ )^a@((=3={]t҈FbJ["mx䑄KUHuIMڔ>!n0 #x*qF_Y3i0aML±_^aV<G,qN ²=zͩ0~]T<=(HM1%!RR>Z~Kr~Uo) 5ꭞV<< /u)<:eB(??(ε:]npS z4xmxTOKvX* GD-jA,:a.U$?딒9[ͣ^\R8yEa@j_@cX鶕TƫblJWqX랧 ǯ?%rů2U?iȷϧO pJSЧ.VW-tP{y"iX¤{bYaL:x\UNI1)8ns i)X(=􇆃7♪tǩJu*,V(T`zhGn$SoO/~@KhZC5RN= |HνHzU9uK s%?#h/Ht8ƈ q~U<^UVUQ';Hw@ Q^U.J"H:} /PONbqԣi=EA~m^hcؕA]Kj ['0 p IDAT-׀Ϊ/!"2kbzz\:W^GvC^)_*2>A? L_o# kY)KA-Ne} +R ԀR-Yjt dKL˷VZ6IrZ$A QS•(2'M ;*W D]bPUEnA˜p $86RľF\ʾRdZ^VT~rƽR B<шI~64yvVFN'>r^ZW p+ le7r%ɭpٹ9P˨(KSft%x{ބt Bd.K^dJaS[sN46l2\z9=xL0;`#=-ET6Lbs?޹DTȴdO+,! x~Z ZOC3s S5-jRH!ħ$R h-TѳH !xC_|Oʫފj`U?O>}eOLe21wGhEE=M0#pztz'VVX[84DO’>^kgkuGJ%Җp9Pҋ[5[fqѸ|uJKUB[X TKQj2.B+ G#V?L$[7#OtOH'|O?.#p!k7W<>}1B|p,()ؽ@ 0)JI鸥\ IN9;[E2Q'M=xr %ր!R҄"LZ?jV:CnV’"mz%B&=E`WTBк*UdQ+4'!"+q ^tWW\(HV7O *Jq+mSb-bRoGXS4g'$Q]zlzv:Cc_Û5Q|q7 :< D'JWhVP<|@+fIii1GjQM Wc @T੊ g=G^Db) _\c͕GRjin K ~ KʚvRO?dgR=8ML>/-B ЇbV@ Z6T%"Tk-00P $xzسcs&:b:ryΟr/b} bb5k8,e94 fZEr֕j+K x`Y_q >tȐAs̺{7|{lْ/9vNt1?QV @~ dZGq! G4nO4D@{T(M?8sٹB LIPGJu"SjUڴZL44>TF?b^{AZ-l {C8r3R$yZJb;ފ~tp=}Q6#B# K 9a)ɉd$ X0NĄr '-b2GK #:D *)P-9bGD@ 2}Կݻ_$!=P j^^:xЀ6[&&rJ_JnnddG2'{w|)IӒ۸Q }EeLf2-"NF#k,ǀcW.9rxVڶjٮu}{]p1m9+/ڥ'6Oo I ی>t!zuٳwєWB|$:*fi];t {Dyx=!KEgCj}b2.:í۶_pW3S_>n۷޳oew8mjZNfjVSZiΧ*Ο; ڷYֱ $iWS2rCܮEr |ƌjؤyxT$GF͚5Efk׭9}Ԯ;۾52*!7/Q m^vmC;3fL7kn޵{`we;N]1A7!6R§ߗ f}s(kK´6sL(CCUg{{7o`X6޸ev;xhooKw w%K3{fƟؾwfzуMa+g3a&g.]s9 >{Zsk˚ykybxrv-̞!,T.(!eE'E%ԤF28h){Dd}ִ|cNIoXvzϝ; 9= 5wirOׯvcCcQ7׼eKW.g'<Œ.򹽮W/9{:#+Hګ:A"8Z5?ԹSvz 1/aI?){n5O=|~CKCcPR9gG 7/@,=[n1YPdS;E22Slӆ-^0۽aGq9-szZQ1mژΝۆ< .)f~x[_l̋wо]Zt=1XMk޽K-ŠTW(@H^ZHKmڴk KzvMn̚1{n={2C.Z4tؙ6nZ>UT_vΝ8m 1?lH}8OeXK0zDb;quVvݷΞ0s֓R#b+BVCYedGmز^GLI)|ԯ?JNK귋X㧾'QÐ $BP tFVsz9w!> 8͜mӷ]ݸuo26rOסCܬiӿ1|`b|Ifۅ/o26rRKݦ ް𘸉#14,!X BRuyyO2SZ*XĘƍlٺW\JJc"CGء]3g8u+3z'?نNe+)u @3b|&BoaŚչyS1#5mýwW^ŘQ]wiӮ[ d5& '7-pUi`n1ŨY'OJ2ڶS߻!^oEDcbc0٦]!c͉{A3KJM!noْ֢M Գk9]R]f(()ayi RVHjܨ5;vnbάi)|y;6>nƜ~zyޝmZLUzf Bg'/Z0ڵ;WX͊޷3m'M9Qoު-ߘ@?`Yqm68AHBR|BbGEŧ<Çc@ed8EFs/ɱΌkk2A#M!(5q_IǴlz7lZpz^OuLH-9/٠y֭W|3 98̼m 2U΋q^"WY3A 3C*--sO7dP~{y 4֝+""l:kI~: %/GO}~څ#Fvӫ73'L%z !~kݺyDF|pX0LW+Bȭ h.g_C4x@6Mug [}50` #{tmӳ{sWE%25[-43_x3Zh5߸|]ݺu//[:_SlVweœ'5>aaò$2M߳+Əݷo:}:٭A׾7v kuyG%Бm;ts뚝7&0ĭ暷Y^!6s^ttDjz:E>ÜLzVͤ{vVzDO$'efFDs|qbbRYR..pĤG91I|Ћ022Gj veW\\Lll4Qd )Μ<9%OBtSOؐƒSD%8e!HFC8lܬD[P>8@:[!!aṹ,ŚAHfFiXhEhdt>1v}|57%9ޯO/ƌJedo,^\aM qnOH$5j+.RD̫PSD.9XO$ WT\šڛDSG:IzhB ,Gr˞x}rCv/ht$աxYd\S^nꤗ[&ʟ?))aw,W,(T?Wi@cSYgM)d bb6旳esa0lfSQrW.۱Knx<m_#1r:INJ3f!c٪lXc4vu9pXfen5Ň?suŲE 7fAN,ky#_(PiepX~3jF! Wϒ<+z8@]SBڏʼn;* -*(t/TBD 4؎Q!E5^WR1f͔VeeRRZcQ^={xhr|_U\[Ƴ6;ftVBޠbk"|z)pʇemXÞm])!Lhױy;炪?sm|ɉ:=dr"θF8=/'ḳ9rMN;0g 97 FH!? D;ZrV \I^ P Rq֓AzA"- NׯVB+ifI0`oPQOY3dL{RlhMsGsڣ>FvY-\XB@k_ʒ(rhR-thqyiIBRAbac>˷9qS[Mv㶱Tr~dَeSXfgg F{J|NB;nEPW"6H?,*k`ގ sy Iщƈ̴duLLHN}QII1Ii|,55ϴ,TjjzȄ;z RcҒ59!:).2/+5%)䨨HFhD 6T5!-!Bj; ь  @­ s ?/.--@ ŞehΆY6>޹}GoRPНwoc|nE{xFoܹyJ{A#*ѮW}18gBnݸr>Dɀ玟<{j{|ɾ:qQv3N9sΟ:q;pX9sP#t?xԱ39}ʕKJ hGJ+/Yo5B (Ie^sH]C}^D3"`E! TGi94X*/DpioZM`,t2QoYZ);[I s VELB{/i"K0ZZƛ*4RSM4:eC?XQoaJ** @!ī>H{sRgVm2`>統ȏ7"0)b'P\u=,nJTV}t=j g/-!ʇ!f04 ̐>Tz%SnP.O SJ6jbQ-01I~QARLjZ_Q/Vɷ(ќ(IipEQ_QJ U7D!*V=^u+Bj9Ғ2j)xC$+܏DCŨRPU SCUR +zY|rqrc/R A,}pΊ?3TUETK)Y1_U|`c=[xO췧Cyh#u7ɳ*]oõz׀  ʩN%ќᶪ_Kz4V8W8ϷJ IDATG<LԒ p'#98@i0#DH%l) WUVh&:n-%X % UX6șiq9<++~W ݏ_g䩪l_C"ZB!pIRBqԩ)ct8n*n{19m,U# M8:YÄ!sIcRU&6&RtP'a4 'ͧK=N^)Q,λ$e,zn-8:p&!XJb|10x'-riXel(z꣟ t+++2EPձtEejā22ʄ ^!H4R eڃ2*0C"l1CCՁ'{kx]7ZO!aމ?.bSxulá퉏yy4<0:BVI#8*\BzU|3yHOˊ]ThX ^ۡUP5n5yl(C̬2c ~IGw=R (Qty((l)5%>'7IἉs􊏹|#۷E֔x~+aEg2"ƏH5hVQ,4sepq #w?veh Hʍ ZGG4I{_#QMUFGj+p#όyؠflDk(:8[ el*綗ʄֈ˭F+('Z*GaM7KMk0Bw }gNiKS]:N$n $4P@]^ 8ѹc9ggdgWJՄZvKζڴikAu {ʧrEO@S6 -ܲ [,/mC=6{]= `ylM@P;78l/.Wd@tNY1 'Gm61`r>p>2[QBLz! EH}0$>!=lZɉt3ҭLQ U1cRT-MhCĄKH%`:ݭs0L"q<* p#O'>5:! `*uA5ာé}"޻}_yciQpK}؁ݞC;3lT c?Su#j&Wukz`"Ч۰~xjMD> ȌVv >V1EYKVj;)1kZjb@ OMaI=hxb-N?I j\%$8 i\ldfF GDLE JB[Ǒ<A{0`w= +j[A P)//+X?%9GDE> 1 B[b5Zx# Yip>C|RAVjC :VrTt$}!le7srPĜ&vΡᥑtN=DD U>::&'' yy9>mJi7'+1)+\@E9kC2,V0=rc=;Aj'bP'&`v+*+o4@ȰI;o~oEFE<@Z4cB$5.LÕ6)Bش1Ri P$N" " d#!@Gdp AnIBZzz Prd% ~d,Qbcy݊ akl#u{wo9}a&<,dʻPX^rpr KJLIN$ŧfp$e AI )ryÈ [lZ`8li^y8yKGfQxbl[ׯ[wP|[y"62kQ!Qah-Y x!LsZZb"ƎbUN=::jSM;Q#=:stڴq='N %߿;~Xh<͚3{jvi㔧?xȠ3/^h!Ouu7.[C>xsߺ%* u#*4pȀc'_zcG7m>gkzv;pj:-ώ?}Ũ;g#W\߯% ͝9imں9='+'%/?k>_~1l3gLP 3JAMB7FOaڇ6c{,xBh$D<%hȁٔG! HL%$!?&:۷Id&JA) ,{0UbrI0KJr¹gj样:v𺵫r@^))ZsN=jңڵke׬;zDFfG-f:pđ!F }5 zw;0MM6nժE`mv %$Mg%A@Tjj2.b-$YqOdtg5˗Ì suWlX32soڡSGN8 !W{viݽPD#sLnЪً%'uߩ_Z8kR 2F61>lo{}g5ySѣ6kK7n8jĐpÒ1ED1A)ݡНxnQB`^<`FPsHT W,oLNcWcj_Ӯ]l6b6æz>#[7ѽ_>7W/{ڰqaZsk~y&ywtоK׮;wkШyl޶lq Q>5bE=v8.];ٰȕsn=>~m~4ßÿKlc!1|Wg{M.\-soqR(c_`6:$61łZIS͆)`@Na݀NV^o޹ I_ch_^D%-~"PxH~ ?q/oݼ* eb Q(M$^fQȲsB+yQ4 'DؓG0$PxP ɉA^|1uB8 B#9:0dڻo/ g.ml\ªk8h6ȍ˖Efz:(`_ }|p8k-[6;oy:lEKf媽~^hѢrMo0q.aJzwlܸt la}WYݿZ;N'Oz?Yƍk޹{ߖvon0+4j_&!7[jIsYvcn𕚍?_aO#zuubԦa .߾st6l۶uvWn޼^nߺ'E7o\jٶղuk-ngHD#=%,|p1^0]1b3v0= 1Ò4 $D2=JZRE BSBWa 2ɈITce7{rэmXkE͑mߺy}^Na`4o߱kM<.!noȲp6[ ^E/ćQjF4+iùf1c,^$ϐѢy֭[bJe5K6jԠ>rsrpL5 ͛74hW ҭmyv:]XnUc±c;*yZvQE:m^u"{䣠=;1 B+$֬.<}sFi zL8@`vviFП5m|34"vON:?'bϚ?o:AHpr֍GPt0*U|\ @d.3-MF 0Cvueg FFHM8S߶%IdM`էB$#nMBGn2 ̃FI~Az17Lހ 0wl ז-52պ|ْ^=B[@I9sj۶-SgϜPXիVcǏb{xLIM5r(\'Oؿ߁әzE7uh׺I+WdБ5mد_~N}uh#{'_g>|ԩܹ;ި >˗3W7khr&J8n„ڶضyo=ܷӿgMX].+.Ѿ5F'D55 тeO?G8x1v'S\BHK|np%y]@"t=V6K 4"2L!_ qL8OIœ@F<%2lsxKOU;A2e-:`[I.MNJ R)DrRuh3)/"ϭOެ7uMΟ7%` 8{8"-!k׬ڵc9coQQRcWp>A򈘰SnyD<:)\Df & YGđ$<Y"Df8Ap˲/-̨DR@D7s\RczMpv #)B*];7w٬U#'rt9ة jQUY?{{nɈ9GM&s9HPDes9)KŵlAZ֩SUUko2@ N-!M@(+lJP C)>rZB6-z["K)47"9 l80~ƕ{7p|tju7di)RN߈<*%$@$JdT|)+% It;TAy$D@:RjOMOfFVEz P$'#._D)哓(-j$Ĺŕi""/H{-TrHd⒁8EI9\˙1͆jkVe Q2kglUUU|muOC!RU(DCSgYW~W9RWZ.<U 'B'OyD(~J N`|/$=!F>oa(q ~'gE>T-.Jiddj4H~I:IPEI")B6$JHBH'"Sd c(-+LS%qVD &r%PSȈa2ajX87ybqi)lʐ A-䡵Yi"ou|F/$@ j d TW1pN"i8yKZHHf"dz$rĥ|RP"UHQĥ4JS_6K雷@  2~E<"ʿR,m#]zI \ y$"H¥yCD@6E,)r%?)R䗖pWjJW!'qii$H.(Bq$+<@* BdTI6jlp$J`玔:V٠yi&.]xAv~6 U02UU2%()[Tj4? H!8-!B:$J drHQPdo6[J\X) @s~J}P$M:rU/yKy~f 9w="\)\W)J%49]F\ ! -Sii U+D\d%qK-DD&WHTDu4@r88 ?K%sS0DIĹOj!BkTl$J% &)(0*%B6"ڌ wէ YZOy\)p%pK%<"I9ĉHN,rd-)qS,h\I'(GJ+B0;J( rK Uk'+%H!\yG(drKQJ#<. Cl(Jt%-(ybI"4*$HȫR%Mb3ACPzUϲ2 C?V>WnBDUR@-J '6|>Ҫ!2jPvj58wb?A\󪏐_D.WއfKh۷maoY8o䐁Or #wV"rs)wIt5]"Ğ`8?\B`VmnYy }6P`e)!ʖ䳧OGc[Dm{z ,-ڬ~ޑAHbj*%ZY2տ ߽]}aDTN%A! WY Z'(u—$?}%N8^vJ( H#5ʄ5u(yNC9CU%Qh i׵K]{wLQ.RŊO2ߣ,Ic0yUW[}D0F0 9h`Q]x)^zyjOgOM'Ò߸rYfX[BAiW/^ߪ+瑗#|~`Wp&$.߁oL VwU_떫o'?vU+*_=Mע-dW+qL7JSE ExN_iFΜ.^^c "A5h#wX (7=ǕY3ӯEFD/YJ}X//jV?qd]~]:qܷWo'%,=iΝ36ljM{U27n7]zEzF2 85@yU=iC=XIs cbpٵ{S'n߽m,/(7σ1{.; {=9=3rޱa挩w9f@WϟJyGpڭ!Goپ3=3apW5vrfXԇql # c:괄oe]Ͽ tdfX[g F4X|vBʈI29Ф7]yp'fv} 2236o|! jILxBH ʣSoi43gў/^;}autC={ԥ[׍få+QG֣93'N?ǟ?a vzsKpG]m[ml֌_hsg;b츑!Yi.jN~Cl͊?(MV{1DgLfn_7r)?pz/]ÃcChgcY+3S-T v}ΖKZm*U_|Ѻ;8ml6^ ڻ;puk[{̪s&,mڴ?>ӣ:_hҪsrÎ4W-_>tlհǺm=qɂ=;N6 _h3slf/0۬GA}o5/VS^>`WD{ICSR7n\stDn=`j5l^嫗}vU ?W|AguMFjQ8v+lmVnh|㊹Z4y4I$Юnڵ{{Ɵ?oVYve8߱gwxdJ{,* [ Ӱz,Gqۖ]>v%KvoZ?b.{G]}HHRPUfyOF:l}d:+ǁ+޾s=<4 zmi+es^yY-t%GMw"s2R[@2ix WN2!Sp:f61pv~=vZX u1:xq<.u "֎9|rE !sݡ,娉#XUоყqcɑ'>j'~OyLC"hhaݸys^g'͜4|%:e Ґrɼ[E/z˦t8뀇 e;ve'Og17e PS&4o$>9Z}wq>g9ܮ[ 'YDfFzVR¦a+4&^Q˾P">7:y|-GO8ztJz2(={&jbDgd1wF[U61b+sK[d<,ZI``ߖI|X5\F+"Ip̙XA(&6z1H\nÇ 8˺0; B (G4#%QQ͚4۱BH8}zt^p޵kWX$Oھsų;wz%\>ҽOo6}4 ~wqĘ/}]7d >hЀG?}u޹ /^TȩLHXboc;z%|[fŧ_|ݜE,vevmny8zh6;"eYMkqh D8)>bmERu mTjD~qJlTT{| *5B2p~U6 Hޚ8r?Æ + ]88w /Z^w*|t13Wz6Yy$)v5k~x͇\zký^KYS>;.U, _?[jŢYOIٴe}^=ڶmݾ};l`XbdɌݻw1IڬY5 N˽zM6]v?fAhqK<zӢEsea{b!bU;o۶m-/]-Bn@WuZ?iϘbزU:v}Q{&~~V~:zb-cǃ Ɵ~cZҥ+v L}MK( /A+``$C~Exe"@ު?~ !>* XE'gNDfIٳfs(¼˥֮Zbʕˁǽ{wq":raMC" Yf|F?0 SNNҽb9]TVau)0 xl!8k yu7<$yd]Bf*]Xx^wn_`D HP]DD8Ν;>>>E'Y@!b@i}oϛzL6v4a¼;`7jqfdd< 4tUxcGQ12IѧQB nULFѲii(yFmzM#l0<#bhFdOWČt\D96P)"iz;uX;qN!GU V\UA/v1C0.*=viHvj eZ ľ=h!U)cecͩ$#Du؝ te?V-sMt\J#N1ZJ%Fs&0O$˷556lv!KKi:@)HJTǺ[TA=ݽ `YR/} sGx%xOXw?% oA O|-˜QIL8apʈ,(](P3)I@Ps(A iT[bYڮp8JN[TFTT_B| 0 "PzL;F:q膥O;4P!h={u i)5^DMĄK{b6lM|{(K 4f߯'*'%w0aUՄrN,͉}I8̖ojq@eQN=%ZcؼN 8Ņf5@cM :,^ҡ|^y-{ zrt28jUCvn U58WjSJe!Acf )GوEbu"eLd2!E,5:vNcRRc@4WZ̮B4W#WH9#XAM7u>y ڳfܯ$@A!p DL, XRP0mSNk9Ijp[Va@}`#b6cC VtU>#YIHxqbBWr|W]T/B"k[oArn'JI'3{h+C0G!-MB'PsyCן)Fl1s P^)(R*G55+k< x)A@rD&` qFJy):Jp`zgqdjf.qh$q1K#U̎er83K+kyר/V+)҉8vuTAY!0(^Vf$pPMWZtN :AgC~ -A| t5_DO@"WnC0,)!E!ʰCYeP_PL|x^Q(k8 og c4ɏ]膻B*Sk+T[pTʴVoBЎ2)GT xx:[9uY6Tnld!AQ9Bg;[&-,/(|`yUG Dc05̋C{[#@jBVKloEg-K? K+%,D=H"((Qc"}tT5j8\qǹUhk#r,yT:_VT`ƀHê%S$nqH^GVX"19Z xZ)ʛQhʠ֛wSa9\0b` L# l\S_y+6dΆFxtK8d—+xFπYbUsBڂLJ4 )>eQwM^4pt)FP0 (W&x&A/TVFY6 %E|gEf:N_ ERj&W&S[|*d5Bx BDA;~ZեJd-o@y@:iFv5ZJ:Wl{2%v_RMTF?"¯}N D%!3. W/TTl^#qBʬS'Gr\gUG^`I'L&kG `sTs(Ŋ  xMQّlWNڍe-u*5`afG9[ ,ڱ<`@1 3.20~AFw\ vbUH3c%oXeaib6@[Y灞NjCrU$D `4WP;E49X,BP)T5ZBx ^P#>8J_:k+qsc|<(Jpe#ES *v2XЦD HA ]Lp1qmlC!4x%4[ARTq81ï-*0G,+ nT"R{|N㖢5z Ac {P J/N8͵|++^ReA)kGNvV"/c !QBBP? |E54|2L4 JH(% & 7yQ `fpHAqusXdS3" ~E!T Y¦= *&YRgmJcU+I) Ho&"/7tfb,cX1m4Ʃ&L*Jk+W%z#9& XSf ѣN8gXgވ% <#x8SefV$6Ŏz+2iT;qaP,~YVN^YBPFG)`N&_٧ܹP`^] μ-+jI3XîF8SR,v |0YFY); QY+| IDATgؒyɤ̒FjLHBt`Bp2j5[֣\eZjjAӬ|d{޽TTb(3*mlPo9]`W/ݹ}[^9Wʧe9C? /"2C6rE 4>G9 !zwF?+'l ɨ+ANkW,6tH@PHnd/+}#BepEXVe?3y=@w1ڂ +bZ] YuS=f[wX%B-h.|έ~~PںuΩ':7nݜ`!]! ІF(!ԔC&vP߽kik^eÑccbCG=;ukPGqv>|uFw~kfe߻yzVl}玈x )/]ܴiâ߯_*cVxEZlqHSCxB0u C' (cӋ VgS.T@qC| |SGGEgfs-cFO1 џuMɩ9ivcnnZ\B\Wr咰d|Fnݼmbޣ۸Kge$>ŗ-ZuG@7) SFW^t[6jٮ̓(M6]7_x>|dVgؑ3*G)vڎ{ѼecÈ7h"B|Zjq&4X*1dٻC^kxb.Rծ}64Ymk-ʘ[ Ńٷ%&vܭ~<b-?/C'g22wl^7qgLB5ڙ acC\ 82OWRG|؁@"C*Բ8`- 6򲺂-Ǎ5+QjC~2Ӓ7_}~ֲqS't!Sˑb {Rvj:>EHy);9k80hPݻ^J_d;qw}.^W#fP]iI1SGoޱ=Axh[6hަ{e4I3 Zm6GS 8;5}LζC%&K %l%:SVExͭ۷ߺt[Gaav;w|6&wmlS/VL!1&MBmO<Ϗ8{Ji0^'ΘqxȾ[&MQ2.JVNo75 kNW&qD$!#EҒ`31[^w  8 Y)Q5~oq"e\RQelބ{۝x8,y>Q=J/\]u{꜠q()UҪeNU4XM IƄpBš" A,@@’Cm^c,^2jYyҖnmE[-瞾~,Tuуmڜ>{OԋŸd@¬< m-,3slֵ{wnHv¡>}K iEٱ:ttj;rdWN_^rlg_b,0I˖Ԧ}YbSzYEn&|7#Po疑ÇE>eȖVPӃP,'tǂq"oSgaPݑdgҔL,ACښ-fQo8xdƌwm?Ǣ$ʼv,,#F O8LY-k{ݻ+ X 9uYkeK̅ tjoS/-3Wbvli#LLPdw%ݺv0zXxH⋄РY9lgy?1ݸm^K_4}䀡C/=LNO 3bpϛ|}#0)'0ṅO_$sB0>9Xb޳ۘq=$$KJ x ǶJ`ū~w2xXppHBR2>'Yݡ汿[vO˪^VXkɡt3w/rނOB"☇mۦYF+afNww,.1;u4j]E_xd߮޽z^y;9#;)-%<~K,$qA+׆A" z 0{HHY誢l˖-w'/H)9XG3%Hnֳv.)N˗)ȉS'oC*@%USB"R.Dа+m2k~X_|9*{i5*6.)) [R6kҭ{W*2}߁%G lּ)WB箝xzsM-ܾػGںEOUˍߺcm8޳Wn;9$4<(7?ȱqE}tҹiNIIOE=e%bf;.eǰ][>} ޭWvڟ#C1< `<l߶i捫V}&z#CC@k5?`'[veGTliPxYnUiMI>xS6+j8Z ֲ 'ٴy#zRR8-Bܷa'>|/0hCK޸i߱]{v߹vOfPV]/,ʹ}-nݾV˯,5:n7>zﱟ٢NM^;_ՖEpc+l\kf J*{CXSGŦk+l/u9Ϗ<{;b ._9y;w= [tq uzD0? L]>pJ mP/`Gabe%㰘d K0sGhhdº΍A&,|}._:>$/_&&&EtVhWw,!Х1wele0 cP,SB*A+g՘k%NUE:jംdžde %Pja~VZZr.rBڵm=s +mU *ވ4gi-۶-_CΦ1Rf#UW0g;Ob'{Ց[[v?-+gcH`G1?y҄OEIYBy!dOoW9k*`&2ê"D~/ ?|/WBDtE CL2SCx+D0xC.*0&^[%W[0Ǘ"Wƻ?{}Xބ?l qnX Du~o!F\:EPA5_|2 $$+ת !2H7p} > EN?J~c]Wg}$W#CK򼱴+B/KBGK 8!"?" P?u  " -%?EOɳ[ !2Hӛ "e "쭒27T.xp}Z~עy%{b# W5R+x_{5-Wr6='T-'omBpYja_D FChXEg D5b5VB%A4Qo =GS2,1 'i$3 F2ri =+ P<K$6~V1!Ck-8"d`u2VEr"MznL* 86*T`ű8?k!Ei$n!!B(22ֲiʑ 'w Bg 0 *8 W~{<֏8Gp pl)^0hs +RŶ/ ?G]z+>Mx>Z? yWti- yt@sh3PRqA$pnS&3^g]ÂoXlc̔f60LZN)A׆yC74F_J3F!GdC,UPEN|,r{[gJ&U8y5q Qjݠ"t L鱧eAwX yqXȌ,KѰ^ABC@ A!!pv-ԗapdUGjNXW{~Nvb\lNfze2.槑BC~%pQYKـKMIaWfPGU6_/5cպ_na-jwXQd-U#>U r[]@&Sҋ-h-7^@y(`byır ÿS[<3\Fe5k)Jz84ɉ L2wǏ6`OTfOY#I[HŬ?!^X^ / )SmXZ]}Ԝ)3vt8', +n y9Š*70&66/j!! DB8V<'I&]ABLxDH@p_xXPlL$X˞Mx fΤ1W!/ P\p8Od$QZ"p0 u Z( /##= {Y3 _IjLII|oZ0GEEwe`(.xHZh JA,#*:c=gl=R+^4[^zm\^t#:3A ƺf(dQLaCoai- 7w՛LظBJ؀7F͚6νOF >p`ӧ”N-`?BIuA4\r0x]Zh2JIu<6xu'!77ӦM0C+W/deZP~1cF%''B|}}M6g܀@PXD +p~eۄ1lm7_ǎyl<C>B:bGڮkǖ=|h/~v>z .X(3ľ?#j$0$3󓜒̒ hbeƌO(*'٭ 1QP]#Br`ec$";o:{Ll\emͅkÇ9j#kR3&=dd+`,~VN>]6k׮NOOEMH9gƗM\?>ō |.Z:ٿ!ڵصK3Ǭ씰_Cimf126 Al7 }>B˙ &DuP^.?]`x̙iYk7oGNnnb||C @VoC.8cKIMMNz^-nShh0` '))/R_$U;RZ***_iƭzmPb >uIW.mѭ[IS&Ɨ+;Еq!?es۶Cɸå8r#a"HE9 IًbaleÑ̼wM}ĩ7d(3 ,Wkujq0U+fEg$=uy6CCHAQW1C @Dx $-)zPNدKn7Cn?18J_d匛2k.~;ϝ;;~9sf>:bİ aGWJrԩsׯ*~$$!z=(  0 !&>Z#^qkj.t!ڻ5.!w۶r8`IO;^JHJ#ﱩP逼! J320޹{t#^ % D` DHS_r >eDdBsL;zⅴ+t,14kmR 3՜vћ.[߻y+'1m|lǍ?KJ_f!yX7 R{e#Hs!/b!e,0>.r֍}s@^.)-}o51cGM2Qj8Uܙ0d C0yh޼ PdN@x:t ǙxzXHk qLpVֲm,=<02b©=;<75l\Y\q}䨑wişy\9LQqI9yT+_EA,NRC916b^ JO ]^Nҥ v|NZzڴӆ N #&f͛۲es <l u V[dtd$+ AT)D86UޛJ /9n];/_\IAX|Iǎ-+EdzJ^^.sj6"<-)*X *<  p ˒7paH4}M ?"%CtoD U2Bdl8Vg3Y,ٴdo|o9cNv:>H즼Яt{EF~IdlBN^>h@a-29>&ΣI5 v[:wrËjBB#G~æ0|ņ>DV2c_,j8Q@@۶m+Wrȗi:BS X dq [y\0R B H.ELf5M?\` qm C)B(ٙp'$"X(KṲ{~!Et 4%W`WS,R ^hժ#"B+r͖~7cN@`p\|Ⳉg#Z O>1ciuznQxTla1Z'x,`԰7HY$HP쩳bh׎떗ͬ) .Zl~؅ w}Æsww ,!0~ DF`UfXŅ7:23gN!&d #H)0`2ʶ )3E$=w' @X?,$Oq} o޽{B̳qB{\aT4z q<0VoAHY[[$I^wD59C@ f&W 2x0[:%%9/`ݺ}ĈQ dap׎ 9ς|@ȦN?K,PQ : }P x Y-ƜN_tXg = ?r :%%% W\ݱc׾}p`J t{~߾=82&@` XŐϰ 3Abڵ+;44p2 +F/ G;Y\ɈLw.8*" P"e!//OZ@E6aPHy9|;i*M@2$ %oĉXxo v#V15:pJ r6iñ>3 cFF];ݻgNPRl;:=+(*&hS'ZaiA7C_pe1t&c1h(6]hci,= )@ @…P'L$ѝ+D:8!3yč&c<A䋌D*Y6eJ lZd$M""qڏ`&CDB֢I'Lrhr/ED"`K)USƕ ?ϻ+EE%Adz(LVjt%**,ƒ)j-16gV^adt 3uo0 B NѠcTpncv/aQ A@(u%y9}D !, Ƞi@͐#Bv$N30l+'QQGBp m wQ/w EUW2!&QOW-0ɕ 鮪+5Qhƒm Ы/)A9Y > 1h,ЖL%z}||?wC(!@ NP!["q򲊊sc~o).HUq0t 3Cid#?x^(%G$Hh O7&DTZ"E}^TBQ.}SRRiQ{`7 " DؠQ$'OOu AOi 2fshZ:`_oL`HS $ ]@("h`<)cJ-.OdSOS 8 Uv!>Io R]s T $0Y "#BgC;ȰШќP/爼ǚ4tixCͬ2ebMk2E\ccV\%[#JQ8Lp^]%DEuբni},2lбfe_@pY!B ƄfzV3ȺNpXTp`S @Dm{B=B }I kU*GES^S"0ZEȤkսM:+mtuև&uFW3gG7:m Z'i@PP K. fT&PY# bBToJ&4) A\)K\<*U C55*&ok!Zn~ƀtAY^Sj.a9X5: 2dlfȄ\39Q N'  TFOo2RiGjp"ڪʗXGdf= ^AjkZu(TTVP&-pN|r) o!.ʘ>ރKR:6 rVUjvKUeJ e_6Y@1BP 4i0; U^R;A)CA D`#@<U A8N.?Ε@jjWhAFb-Dq 179X;&\}(6;A[ R48M\2!?CܬIENDB`fotocx/images/index-files1.png0000664000175000017500000034255615247006660015312 0ustar micomicoPNG  IHDRbetEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 467 509 1 0 n_2:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:509 height:467|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:458 height:420|萮x IDATxgXT6|9sfs *(sĜsY1"PPs9sᄒU 38հ{Uw{̙3***/<x 1QPPP[YY `x7x aeeeܫ{gq_heL_2nƏCGLx 1ANrrrL=77^RRE2fTTT^{M<5~x_{~`dEO_q8'g}r<#`dž)11O[wYww43Yw^%Obn.יe1{ʩm/^$-biU%I*P1s~(8"5l dkXΆ8L,PF~ ##{?O~x/(^1v7rrn+T1LBnYEߴ9mn~3ba/o!ɖ~0OKe}f vξd'm(G%*L e93SJߖa]WwEVUU<ʸx[(ж3;Gk{i׏&"SYy۬g|=vmKڿi8HKfzwww\r6l[X d"<, v א1܅e>;|Oy:;1Ϩt~z̛FVWDEE;ص˗ 뗄~fX_;599FFF8vYKnݺKKKxw*yP%l>xqG4ʆcp'Lu(+ Ey9KBJVc/07)x9àc)sf@](,Gt'LUyiKHAU+Fh|*Jѕ]j6&G¢ 'Mu`8+ ZfzI2(렡"eYHIBt$Zk7aIPU"TtF༣'q/d( 4DaUN#%'K}CGU⤀e!.)u3BE#aۊYSSa,}L]oBcH]Ɋ Ֆ߭گ"=%>Cv"+Q6'NՓ;1R_QP8CIY9=s F@t`b߀lJO,ltIϊb;Ov~z>ݾ}gr;Nؼ> 5k !!Gr}!4440eu/O Z0cɓCW]CE%`9c9RɃD]R*6 *Z1PUR{(JjQu02ԃ6o?BTVdc)Lmo.(BBIݑ_qϗpi!1L r *0VG@]ErP6(0Q' [ &xJcd3+FCAVbRXUH~3GA@AM#-,1f1ԱU32)8"U6! 5 *&SmtRo#JY,;`o߾EhL H#Oz~?foו(PWWݿbC!]Cck@S\^ .4Rp EqȒLF|9ar\ # OF:,*4ˮu5Dɞ];3UQc֭w^̚5 -»w]ș'J~~6 ;/̣,F)L4R1ކ"7+6M4&hP%|Դxt< mV:/ bT|MDX7np-5Oۈg!i7*sq9LE*& ;\R( Y) Zū4{\q5}WL z+)@FYExO{!/?OuU41uadWaKwh64NTE 80ՅpsдL&K C ,4jl/Q mD)5#kd9G1 82[dyDY__@L5mËĽGܪaΛ(ʃ@o,N%y9߯F⮻粭-!Fa%i| Qvdn>vg0e#KkgDydd'l{ OEIEd3QKǠX "awf6 W<QVkCB":w sZ =- = uMۆ˷k8 ԡh`koQ̊cKc ]XyT@wcOD)#)]-@^.6~ F܄i;.4|Z*FpU7pjhh`3ʏВԝF܀T+QEdhz^[n=i-3l;N[ghXa/^Ujhhb | Y$ʜbז"iդP$;)vYl<ʰ\|exrP25q^9Y(( d9(Yю+͛kkk(G ObciLa"0 $RT>yfÞe(##Ee~-55haׇ.!*7sHX^4;gZ1=;DrpY}.Qſ%#ѯo{rɣz7Jvp)i0| 0&/9ȜX؟Xmy=71\δ QULƭFrҭVq#{m0Ll,gs`&g~a\(#GIn jKp5աE_cAKK 2>Di app=&2"u0| {@epO-';{K!!!X~}4zt꾤(ٳ>WƬyW^e* °]gEDLDyo;DSvßJ~8ɣ4\Gw 4rUZ0nScSQ$+_Bw>6bKs)rDV(yeBHc8uݜagk -C\{Eiw~+ I'_| j*me!y=ʱqCe;w_ :ƈu -(R_Kի\3AP03GG妣3޽ (F BE9tܾt3(7+ }x%./ ["""pĉn_ˆ]u3eD9 >Vennm10&ڙ7ڝ1c_gvxx8֭[SSSx{{wd&N:U5AN=F(B`$<=ppxK[EaM,I ¹M!K[3&m $$偉PǔeGM4~Fʐ/ZU &CWS(+ p~'^+_D& 'H)nhmv Q.6(VƲ{e <.l*(J.@JS,ԁ:Xί_o;} $r{KCl. Tp ~Zǿz #$9 $FXˆ UK ַ/!h'cbόB??1m_oRx32͇E(ȩᯰF(-@Lz3CFd M|/qo*ix8F`*UNJz&bʫQ^wt%䤡JaYgb.LK "0wH@ECZ4f=]HKӳihW/x ,qiP|Gb>i+)IsE" } ~RC! ^iwϹS'J(*dLi`$kl؀^';T`z}/$G/qJ΀$ćAMG'(&K+gDP1[(˴Ad@:m\}žÚ_PYM802 }NUš=gѩB{&SKbٙ:ȂYKOa_Fղ{ؽ_g~10fa2Ԙycwl⋣{6cтyT58 fJM8{>2V^N:iFZ,Ɉ#&F"Ϯ359tio}!l,lL=DXgD%Xy ` m2bbgw&Dyc]'Y_?[1? [o@Z&= <x |9x䉒&x 1c Dكpx-/^fx a'J(yK<zO=f-}<x |9*X+_ x 1c@72;M= NNN<x h0Cc/<x 1 c|<x 0e ܿ1%Oqx~_$\x{c'J(y1c0eȿ??<x 0 D%oI1c@$oM1cOކx=G(+Cg#%:,a5pˋr6z"sRpߢ+0$@3^ny긞RcxlR"peOL ]ձ//@B7\دi,7)Ϟ{O~tCk*Aa0GD+v+(j2*-Ӈ l]㊨n ^{$J+ѯP1š{}>|<b:W3+޸uɩez;)`CSwmFc$CX^М=`T̰vfzgO탖 ι?G͇\lpJ[3myLXܢ9./= U, Vτ&^k7+2cψ ¼0!=(䐗i[_]Q'BRQWw7'{(MI,8x esasyxza냋s{] ]Cs/h|v~$7VMłTޘ ş}OŌh"9bǃ!]? FVSQF=eAMP!*&%emu?h^ ) C so[uUjQ4І0oґ@(.|OMe)z;TUyw >L dfS$c#NIy<."O-"x!|/A ߢ{,43-qyAMݧt^R(VhaR[Ĕv &btuC ts]mͯSb?AW8b\?57? yh+O>~Nx?ć ½Ǭ<:4HGoj~im}$÷4'j}зxik3+=Xi`v$u!k1OxuovDC |p]5pE_{$w p̿)LI Ī%s1z(x?Ȋ l| ('WNc`e=[^ś1d@<-nREQ&x 'OQ#a9f,6=f?=.W;{VkQcl[CZ7/ ȑ#a5vvCznЮ1bhK`:Fc9H))CC]^>Ì)0f5ӳ9%(]K0kyS'ǨV⎊vϳ+Jɭ~Vosb31X2w:FS ͉c$'k+%Vn=Aui.]œ`i1#I>M4Zd&u;cbA8]چfMJv+Ks`wz?&Q_F1yѼ<e+MsPK6`p5л/Tٳ-80Y[XZ%(j!"7mZBm]inkpuuFKy6ɆΜ6 ̀<4XAj.Jmm IDATU6.k47>ƌyK-X2{ ٸĕ1oj7wBܯ\K<fX<-XcSHBv6Jƥ)F5P q¡&\?{B'[%QH hšHn5R:M5sv8 AFm8ý|l]vs I |i7Ə.70k*ab ]Ϗgɇڙ`lF{tv3Κߴrs?/Ǧ0r.dw 8aXٶ'L2Lx#l:6z۴-CŦ~҉l2{RR e)qENX[f "s QSv;k:0 NMu~ūՀˍ ژe?Rj&(R`~QV^ޡi HQʫ{`m3NP 0 =U ?(w'<͔@`!̌p'eXuvl^ ]UZ;su ʚ<\> b1f:.\:uKfPK7GLqԔfQ[Hd;rÐo0L1vr?CqW pYZ1kDPiA\)П=7$%Ġ?wҹ!+%#n܈C=S~vXeu$±RS (-LnY@g &-^cGzT La=e,N۱puH(JH-x` ӭM 0E1ػv*Dťa3{ ߉搗ApM+ˋM!&6 gȉ?Ŝh!9 E$a{ !!xo^Y(RՉ(ټcym=y ilC3]SO24d0ar\c]ۉFˮ팀`{1RdKN.RRx!/%6ؼ~ Gr'zrt 5!rEFHmU6Nւ^6(FjBIK c.ūv3 aŎ(k,=9#M9Xڞ+F4 ׎"[fbޝ\ *yΣIajx+Q&Q24!"m2cGcVdkft!&囶a0Q5<߇Yab/ࡋ+|awne0mϦu0 _ucCNERbR9Yu CEcx-"wۍuPy̝96;.]QaHEHQ;0p?ɅwAE]=pBX8s;H멢wDAM)\n8MFb۾]6Ғ>m5*[ 6 #܅ظ|wz$ʨ7`IC'n2fف,jS>=OmQry -I,>zY(ɊUc1HTW( xrٱ0w U&d5qxxC˙pqLi =XqCch(IUq^ fݏpKfZCV^gj"On@GN G^Aţ$$D0LZ %AuIXj":u,8 R@zutS"@y?1xX Zk|$)u(|ZͅXfAvHY76!&gXjàJS@^ji4K 1LcbŃW3<Ԓ+ bihzQz4N%lmXxdՖ#ՒXO/d[]jP>?'fLTe*AaFbZ~c->8V8L VbD= V«z|l',6p! UUy}qc', 0nm4/NcPi9Gk-8JqAƧ(S?,3)zeD،ҁ J&=x=Vk Im$˧ǤݷR\{!:L%Pk3i-_#"E>Zݓ N^۲zBG[*$TBԟh{`ɮ Sd*c _u+V((ʉ+i(()BFFEp+=ҿ]~9rR;9 xW41&cӪIB?2UEii,(Gj+W yMr+ #}&&ڎƏ~X5r=@I4߂j<¢t*~#PILQVˍę5V\uaT۞((@ED{.B?PJ{&}\BAM &7>21Pǿ-s69 ρSjRVQ@bd|{L/21PfҚ&2䕭s د5pˆz njIIW~ @@FH ;ʦVΥIM"1Qh%0\=Nro;?Q(ȣl!L'; w0v3Y=EM%CZ$)1b t.joļ!"zv: ߿[l/%67HO?4Yxz J 88ɣQ56g{D)"W2ki:,8FixM\ 0$CkT7돬HIc’lvKŐ@0אh\1 I0XeDDm}cF?(['A6`6<9GdHrn8BsAd n>E-D'@&PʓבSJG9Ao>z;^Pl;e Rx: PV-P=_c6fl;NÍt> +WCxt}c R38Rb"’Ey?uDYYai)p:d7#51dyN),h'+XXj[U>e]ekAlMڪN]9keux??!ͩT\QJQR9( 9طi.]u< lrdGcxezD b_HU 1Yl9mƲPlfN84爲<`B4'-$ޅ(?aNB6X>TՓP͵8|%,OÙ݋a6{m[ 5Oq`G ( קdOQ&RIũޡA% qXq,އ!,w"S%TM=JDj21u&LXu5"޻aZS4J}^w!H #G 9<,h EՒ||+ǟD#CP',CPǏ!*Ϭ\OnÄd-6㕅M}TBsOXJcmpyI!`ZϞpxF\}YTЋ!iqزxn/)(@uyAYw8\SX^zy*PHU($7r<.=pAhdc%ܺVMy;]XL(N?E15Jr,L2BAR8O>wN!6xpb:e܏DFqwHMKGfv.qiKb=x.QvfrG Cp U|X?3#`-qTќں5B3YyՈ CBJ s6D:]P"Gtbsh'p$_\J)zΣOѕ9ZX#psRk:Dxx3-Z3Ca(r:-T^9$OkpJ x"m/=%;pSN]AVF1jn"3m񺾋8D>UxN̬lvjL<# ꕒ#KL7 ںGe>32sUZNװї䵛0|yO 5-dkbUŦf KAL5"E8ic9U`FZ3QJ LoIV^e~mU\zxKT_@A Afed76TRT)J>h67˱x4XMv_RcQEu5ڃ .}ëG /6]y Y!RY+aUM3 :J4M״N>"?%˭1jsM %D6ZXBZ#)TPXČFDrcJ:J)HDYδM)ӗBm,NġV)fΤ2}s=hRcVe;+:UR+X.7/?+O_ ML}uή!PvZl,mpS#Qmj v c 1rгfL@I Ɔj<78+1}8'Ou{N1W~ $^j5-OƐ9u/XFRa&O]AD?jJУ5= j*"8,s#c6oi 1 릹* 'BDY2JS쵝5 MX8!MX/QePU?yj50ISqETx`6Cִ9B~>T41܌7_ϩb:0~$h.Y% c,ad4Hi'@j/\ luuXF5 H •WTQ_UE6P=dج~q5Kv鶆G̉{xOoX]D %O:Llcˌ#l V!7m}y>T|IEmbW#6<.NϿ G'z>ڪ E WHL$j?w }TyUH&Egݧ>xi&f̠WpxvE-o^M~7o8&@&-f t YZ A Rwi<@x8)9O/ z'j~d;t9 L%3=.'I!\@G=3H psvDTjI6A=Bz;Ck[MmQ^ipw}q#{EyU)Ә&RnDBt?z{M,NN~ANNrܝi ?yM$[G2 w{Ee潢0mA;p}G8?5m>姪~/;I9v9i¾Kx7Gq&ݿO_ <f\#UFC|⣂;ȇiۦwwLM%ͅxFx CMxyQc.v'Uј{8dp_$Ki4;06mZ g*&<81u=jQba'nӳZ=e*7}LouMG5j>2I?9>Ŏri@]U!|^>mz.3b@FnByU;>tmUܜ i;QP?׼<fy>OoOܧ?"D'/`xjzaYYVDQ gx->4F>WȎt{-J]ܚ PAʭސSۜZo[֡|J4R41-!7a>O2,(ɣbG!-DQﹹHlw,&G%ظ KȦ}msT o'Sndſ'*2X mȣ *>u|(SɶluyJC6ZېBǫ}*rVm܋f뻻{]sw[E'=a!|bILCnbp6H u7OY8)I_Ah4{ )+W6 ȏDX?wvH:$>;ҮoHB S/l<x 0IDQa>ssshB8+-'$z$ʲbDҞ,?=0oW |h:Km)\-~11c@DYI6M T8 55;7711HNNSs *Ð {ϣ פ$瑑 d=l^ٳ{chyZӳšJrA/S_J#ù Ox~琟C<h tKQ@>G`:U!)NmG3縸X:#HC<"+>OO?Fp"::H5Q`"$"q3lhNbbBӳ-}vI0WDDǵE=/*<Yη/t<x |;()Z\H? kTM~R[x2!2N#y/\1c/@D>>>\AL#-؏LR5·(#Zv>z$\|Agb|l =F|6~scիCu(N!:]^V  C )##4=K@$GaTcX^ O|s?Ͷ:}!__Q6йaK?Z*Jҏ~{n SV~@y5=A .v=J鷀E,Z1K ==+p vwNpJ"K7(>cEHjAp5.sH؉^ԗ-F9at6&K92τ>C"j'_x&>W緾1‘|_~_L~e x#-3GS1ױ{u9j##9} G)E1V=j|K+,A$vW/_ɤVSNO]eFt\̥|M_]L<^x #":C]w%}f8uLE!0z{||};-pnF ~݄JX*A'XHzҭ *I^#ңq1D|N<Hy :y?9­W>ln~z!L<. y)̔x:]$Z?a]xoqɈx>xw>S8orxt||BTe:KsuEb#C{(#.DX* W"^i^?T 16X)YY12 1[B4Yqo_`2ڜFVw_d൯70 XEAw &g$!@="=e?|ώ|.B@2%q/(X!vP~Ⱥ믨i FǑ$J3;.h|va U# Ͻdm3n܋) Qܘzyy!<:eaЗ0ITsȨ;0Ao^ό') 0 6Ou1f"u?Q@wL'{̘MHI,vOϑE,> /ϟ0;jb|P_q( 4Zʫ(A86[q (BNF*3p1ףSu(c.ZΥC#GEL%~8)ii߉DRl1WT$\\AĐhƎyp" ?(?%~ܓye"-Bsk }8PƧX5!1 (fQ2^/"zeCd7+1;֙BHPRrrq8w q'S*3"R4N9>śD˃a#@SGxcC mdho6&1}RaQIBt5q&A5-Y3lXuLV {jkBGQY!>ogCd+O©} $qYQ8X8U' -w]{9+@H\SjCWw,~i |(}uLcy{4//Ǟ6=w?BRF6i}LJEb$5asPlsgl7 M7!?- {ͺ2up? 1]Ƨ;.va\#*2¼2^25qYI($s/ e5XMQ&2"58z4.\gQܭ50$<0CYKq?b4't)مZQWव.&f9#fwWPt A`4"V8Me&pcy%9R=k2(eeE߫Crx_&T%5sɼ}l*,E`arsQD gǭ0r(>x/} kL/"Kn <&^D䚌-W]iu_w/P]ẓ+bcˆ4ir04tLaGqN 7_QW6T1`I7Y1:;-;f 78AbHZS%:_v'Y .n%"/5{̺L uhke '7Ayyܯʉ¹mzr DJl&" (]l!$$#\QSWOwKXST!fT]TToWYgdWB:ȏW3ΛH]>pyM,Z :x8G&J?/b&g,= _]Y8v?cg\ -w\~ށoO76 WNҿ?Eֱ*ZWt0]To]A. O88{Gf,M 8D ^%MsM/ 2g9W$x`bEGZYY`4iL^Z-a2GY+X.ʳȢ;s"A[U 7m*YSo8BϴbmBB}v/P2ubi\:(]j@kQZV hK$3^s':82H7dLpBu<9r>GG}mՁ!ޑ0_%s 7j6.۩e3OP2SW h.̧m ##@SUp(ɝ>oد`.Pꊩ$,;5Fڂ6'xKE^J̣V͵0& ;Nxis\/rx#Nz^ӐyzfI_<nC"X˖Sqx)&pvq^H/(|0P_ 'g899Ü—Tf-vdlK0W~MH5P?x{z+PJQpWXPnP8I qtzB"h?+3erR53d(MPQW[ IDATv{0GY/0~mV/PS:TniaS_ )سŀcxE𗀲!ڳcdw:\5WL`ee %xBw}/{s}y dEx a

|9Gv/B>_طnU2zl۶M!,X,ne"cNׯ 8,7A%e\[2#%S Y'95zt{v>v[2w_ Q$G?_% k}m-̫Wq`rj7‘ Pjrbb˒$ݑd?>z4;'?!p>8Ţ)Zd9yM3/8-T A•N`Fhyi 1Uvvsx/T1b4`pC$"P]#]/SSSH$Szz=V^ @Fs'k!JA˼xx\}D,ɐ*]ueR`4@{jƴ~J|bԹ$3llL"h4DŲ:N1Ɔ /$R Ii"@ Ja4QYYh4###=׮]s|hʇ2DT~kk~Y+<)kAt`iM~B ޷B{šK/VVw Pd$/Xs/~ڵ^ 4qDQgbے`)RooX,BcVUUյ(x⏇ zS'!K^~uG<{*m<ĻE <BL|Xo>6_@Ńa^{q3/4յsPW ..QA !)RT:ND"!a_oo9嚱3glnzjAu:ڐ,ʿ!G6Ja|qZQk/t\8U^}%p@ '?[Οkek t:Ȳ7Ǽ8Tj;v쳌1fcll s|F3e)-unA ;>11b0l-fSd2ȑ#9Ǒ+ 4v,TfAsۼa B_4S ЅZ'lMA & $Y›c^~=z3L)ѴqƇ &''MMMy1k1+ďhRI PstZ\ҲnC.P}}}וk%I^ FqCaGiW:y*XʮL1|>kG\W3PYYip=oƝ;w 2y``zW]b~!055Co`h/_>^$ihhj5\B<4 ô͊XF ρGbՌޕ$ pW" 0Q}"8g>SIwǿN09n0藿FOO8RO2vRBΗ4yKX,dxuu6M(d2zzz.kMc|dd |JKxyxt-n7*@_y};X" 8c0? 潻~3WX))kT Wkyv $Ih]-'NP{w8GZp;FHe}˗pܹoTZ/~ٴi{pLOOt?|t@]y5MLL\X,6mlfbASSӮ TJ뛙9S[[EE4nnlu0nqUt$;7Pj_B z!9(vKvXapd}ga$OV( ;v ihhҗG 9; K!Rynj16::zb5FVv455mܼy󮙙 _HdfppUt8d^F$D Z,cZ倻Ԥ/SKt:Pw%a1^D^GLn;^/<}sʍcccz*k'O,˙2/4 %M@1KOq{h4u:F#v;kvD[[p8 $1$ɤx0@)j@ [XKibהhoo\R `0~ܺu wɎ{{9'(rpb]L&F!DB,z?Z0BDx1Y .TUU^N!J<^[ؚM>૙L&v֬Y^ MKz---hjjhTb$jd2I|>bddDhߝ;w~drnZD89}E&e,Fl3횻^/kq,%6sf[))VRIuلXAy%a|T$F~a4-p;>4NmǙheOE\K}oRr|3=cj1 a{?2?"ہf/i4wQ)=x&_K]8Cv﹑W?$ZПPgg'\^[^xfkCjL*9'iGVOd@^?:V&ҙf.$T9M gwEwun6M޽ kkMđ  g֩2lΛ6~\GK5۴W)v\AtCҫV usw%o R20G5ewʢ89@<}UaW`3n^$HHHJyCJr\)Bq M>C4D r cb(Al?T5f3RYKv ( q*P|隂7)ȸQq6"ť.!u2قO_aM+]I%N'(0P%Mo-ë,e}!K@$acYxZEխ(F=XKN.EƔ:8ɡ'3Z3a&Bb{h +)}+yճH+G>ޕj0äܬE”d `օ;dV{Eg9#KZ02<^@tgÀH}3\,oWVRCk)bIcLֺ-7ZQ225IH< КY[ŝĖ[6z)qLt3M1~3O]B[e1:H0DVwxG:tv=D8HEApq4ss:8PE<ֲ&@H>T:r v*y2)ҳ%;{(çALdwH];P>u{u b sӨϥ^业iSh@dMlݡ&"IB1$8{ֆ5ơu$^x0<:QfNAe֯yx kapu5ņ%["[A{ž!4% cHv/@R:dOeK xk/E硆ä1jtF9"(<sg"Kj"sV֣g&m |tg8>.n6$l\z?*ጕ8^ڳTݎзd ;x,y9=+zZۋ{d,vMFa r5DV* i}dж%\ sCMi-IXHo`j͠KBVRiҤ9 )Cjۑsetdm<oXwXheڱ g׾k[>hZH"x@9ظJZљ֣%ntmUfߌW7zް;R5n~ϭz߉?.VZku#vLsڰ>s-,t+鹽A*oSeݷ3_F`E@ڽ*"[1 8NzT zOtuK=Y]#$F 0^ lE&]R2CF~]sVm~ %@!hز˹=~4Bu(ݗo.H=E{VL=\Wi"vt<$A}I_x+vZY-ΰNֈr=/QZ1Ʋ' ִgq%9O'Ȋ;NsMbm\KC9\cTP0Nf]mQ$unLEI~tc :Fд-Ymsq ϜU:c=^ Vr[MCgmdRLC;ck+C %"Go Į?ĉgӼ<*2#J(nь)w Hߗ'#ޛڕĤS( )k`&[a=,OQ`H-/f8`KٚEpʯ.}*y&xć?28=zUa71Ylɕ+,@' n.-mTE2 *Iq\GtѭT8ϱTGIo8^)7R8-^T(Wup*AMkuam0hHoowp>ynzTginl\dnsIXXGuf6wQ*pF=)]I޴E 2uO֥$K`7enʓX%CEo$du-eBqUu=*dCzISqrjQ,r7ZS? ֧ĒBG#+ž+4X:Wr|'cy y%b9;vt[jR浩޽:uuX,c=1Y$ۉ}\I#9 ~ ȅ#dH68 jB̻d{ jNrwӧQYeA"@n<t 乄HʳI<3\ʉr`g9?֢dn*G^mZ\鳲-#|1$]Hֶ氊uFށ˷v9޼I#> %@I]ٲC>'mє̾qQ!I ٓĖ7& o"Hxr奌kR60N8bm?q9g?ma/"'3ʕ5,d$+ҼrL"cU=$g=Glmѥc(T@BO5fV*1m< fX^B}+J1V$Kah-7{pd'W\8&hO,}MV59Z( 'nLb^+ xV~u`AӑZz(1l1Ms{F;Ε2n1҄R}qV`e_# ֪Dgx.4U+`6Xtn><~|2yOC#|9ƫ]Mw3­]Gyg,uo6"S8<=BC]pF~;o}+2]nUoݶ'aVPmbW?LJl}Ķ\ګBmh|:uP|\Zϩ]KF{c Y/nǨD)rbx= Xޥosk=ݤҮaP[\3i7ėz+fKı4CB+[(P+OCC0_^\ +vЫG1{yqؐF 9ampUe"KJxۦyN;d>'.,F,}k*qvbM PKYhOhey={+զƿCU os V8bC[v>-H9ZVz>*xA*G>/Eg}ϕ=TW={Zu' [۳¡,=Ggڬu}J0xHbPB:EH!N@>4 ieb8pG'8?-%d UOz=65v8HZI?vߪF8+HȒDBC^Ӻa}jw:>Ig#DMܨaϵunZ؉;da>cq'$S.vF3ҽoVmg0PNq,\@ޚoޑrזdkmf|vǾkM*5vXYK6pu>l˅VKDoEmQkHF~` MIԼa٦gs4K Ď|\/ <=}v֊o-0+[#:ut`s6l$E)Y${O.GԶүm*P[$cӜVi{[] <1 r@2;IPb5/ Y]·Mz02sDZGPΕW{yQgw]Zړ,)'V'隫=2Ilt̑2yqF,q!ŝqxY+pڜvstasy.nl.tR nSni.lDXnQ<7rGj&[omBC@Іo2XOEp[xۑ4i^F{rrQ; n iMY*'v>r4J,Y޲Mo l%IA(A?^KQF`׎ZRg( 1֔VmO=z} N:u-$'n޽rEyR[En#&Ueϡ:|M[ c gkJml'MdWyԭmX&2`SڮvjKYK1Gek,J 7 ;Ҵ-4CN7v%^D5{i61 HF7w- Ok]O{sȬ$@r 暱-9v@qdEtd`_9Y5tEE;ݲgQ#nZ4_6wưh0D]b9PpJ贙U0ޤcxe?!]ށqjmd'e8V+Ծ7%c=0@k F${ o=G^kVg $+.9HXM DTr01DV2>Jռ=-qڳ89Ǯ+t ,=վfRXٞ"ދ[\Z]q,i18^k|]P*跗7PRgY3Xwm-C)TXqooQu;bPt pDo3zt`ᔌE+HIާjr&RvݦlNXrn϶m;x*nު2)n2$qǥKv@E(lJ\ r0z~Baԧ+$:բM"~fџ_ƻ Ma-*a1=+'Ե8tؼq0yz=:ɩ^q! V;W~k:ӥM1%)+Ѭ"-;)nvq[ޥ[rLĠy\d>!Y) 0̪?zT܌=:V 4G&׆ # ]F)ryFj9ь͂yAl?J"\O}Y-ջM*FGN3ZƊy2C!j N݋МwuQsBы..IݳM:d63t>k>Ww6ebs&vWǰC ?P̱.)~>)*\[K퍽$Y-9V8ֹ9.&mLTI݁O=/-J>9qs2{+G1*u)GFo hD[Em2;&;ʍmEќ-:G)c皹w 4h0{VՎb J2ˁF=jV/%Oڳ2-Wv1<3 >Q;U~K5_eL ! q3Z~rֲ^*t\0zzaD%UH:4,[,8_*i1p%F>Z}*mmr6VfׁiڍnЋI 3,i ¨[Ll`nGP+ѓI ,eVmxrȪ<kW|#8n>ç1ڼ/i5o>J\ RE#K[*Eio(|5[ͳv9-RYbS"0FN1ۥE0x a+($*I.kZ3Lg=Mfj-F9 Fd;9ߎ +#~;9/: dBԎ9Iw5ˤLd0+A2ȸn@Kwbo;dxP_iVldƓiյMo, *085nMj2:`c Y.f#1b0xG{wx>q%RX/,ťimrk;#zk2ȫnj \>[˫tV(sH''$ y,tx< ?oyRp죇v [Cc~$( sSTI`:Td~[]$q }*Sq9x۬a98WNTvF<.ZF;_W,-V f_,3g=卭ۛD}a4@.3@!r;\]6y].UbW9Ԗf\% *bXtR4=Iʬ;OL߭Xi'(k0N8{VpzSZ Dmwdwm#u|V,rzaJbhм &>MOc*"ݿU}XGsOk'U^c>Z%s۱ S8ׯXQy|J|+deW4إYxkޝ\Z14k+q LGtk;YB*E8C<*U ѓ9gltwoՌvDeW~@8kI4d9sV˛xC9-<ڠDH\:ڡէ%b$Z -ᜱA:uZT: #wO9Xn<$֑ڬ7|ˎ5iy1Kdt}z*u[VPKvv>=HY eS4Ėc}AZ_7Mpۚ@]ssy^*xRwH[nG'!>ͫ&X%ct{mF˨YS)sNm i 3;[;,r.ܞ+u#[yP9YD#tUtl?ZF5Lrgmkce;d`x7{KB"q szS8 Ǻ]{|ӊkn5-$b8'> ķ 8FsՀ],+/\ʱV: d)D^<I9+*v:HIAQU9bnivɂ:`"!ܞj6=ۏwpIic=KRKXU`Kbϳm>(:u$*=w~߭gKr7o%ˑ'ݨ#\ p>WkmZ <,(X\3Bo0/2HW$NgV)ܸ='+EQl.}9,DVHc.1m}|b4[ySx %H>o\im?fTAn=I;6Q@=~hi|FoZ[Qz*9Ұ,J6=x5w=>MEYE|uWRr:g_2Gu9mEh؆F#;jUbqXj2f[RQ4Ep9R[2*sZRLFC1Ҳ]kߩIe9ǽh\\X42={egH};~k[?FX{\1jƱ'Ȭlm鎝imKo4/2*`EwVzeŦehlN*ݢL޳YK=`+(ka-m#/l 8fBe0 2q=;WSJ|EH4c IǦ+ǞCԄ3XX1*"B. }>@rr8&ߩoM >:WZuHX28OG@$>kM֝~mAnn@ e<C۽UN}2'Kn<~GT<7gJIW#F-FCoŤO':< .Iu ]4NNo[KmV>gkx-͒ ?bht܈iwH aHqTǁ{)S՞mW+ajKfK 'g MOGKibcjZ' [#X<`0#8޴Ӽ@Kr|zޥ R"5&$ahZV² ;]#khZJ+Aom4>$0% ;q]}qjN69?mx*[ti:t+mUZ]?;~ q>6~إøUAwk,1\dv'ҢwК-lc5up+YcB1na+`?5{!b m#3^)Q ܊xVحv\ F<v*ZmխFI>oAG^teRN'MڭPOO7yo_\vw֦ "-_(c%#c\)[ ʉXn0On{q/Qox1/>GYʄ)D34 ANi1fI&0FFk{f~إPAzVu6M\)bϩGI5y3^{=BYҞlZ(3nvZ_gtV˝W!bZQi'ANl)pA^F:Rt ׻-KUk=++;؁f?򬤡4&`C$x-uO+Y3<`Gd^E};%W&9]B0X ZRWɚJD(H\=s{9ܵi+2d5,{Os[roG8aO%\paqIjۧeGq]#x܈I^։v]%>fV^?NY0S6a#1ɮW[D:da#ŒΥ!FdR 8+ŧ;r;h|>92)Q<Ic~y6n~=A>m;ʾcv\p k\.n.`UV6IzO W7/5͂I9}3޲a4-|5{us2Yr'dϥxY&9bl1 ):|5)g6qzҖ3JaNIVy׈v$#x.cR0-ዘ]Qt¯Üw1CSL{VVw1g|/vX!xێxWm Lj婡:N;M>/;xdb3Si-ZQ{;m*+,z\P[eKY2dTw-nsC*>i"=+!g}*ťcacĠ{W|Up[R~PjW;TgS7"1V5K!{i#osc9XĚ!4lzk|~owls<]ͦn{{Y1qR%NVU2j`F7AϘfӵk7"[8]2T3Z6EmƏ.n\gYbzu6,0[$pw2Oq9IԌVIWwGՋ{:ޫ+L۟vH3+B7M6|$߽*Z"*ed8ڹq[C5fض=*vKI-]A/$B..WHBI•$\" d弿ryut0fU ٢\F@ra~[Sqo p9⬥zHm(1]νnxeA;I9aN,.|H&J6H¢i#P$2yH9#f<=yJ [C6>_=` 29zxm-en7'FӚ9]#mm{ ۟ǥexjTsʵmؕ4Ӵ3qһV,*{]GienElRBY In-Q,'% .O1Yn>DWmo{71J2H9#}kh/4xUAE’8F*+\4gɞ {_(|7p((rS䶿|ۋ3olVqSh^\g*ycH"Οh_x(00H=1޽SIID'vFA8=넋WVH1ӏJ +4y2) +)ٝI]56tiVl~m#Ze(+1wr i:i#i* dx׌uY-){|9_l&85yA}]|`O_N_*'%}L[11VF{I̅U 5ѵm:9>+U]%#@p~ks}#gm!Am?kX1Q&8+s} e,E2劻>nɒA9>xrcٜ(CpxfJ:S@uWWF}팇=A*UXcPyV\ik)o9#L~?5K^P FDY ӐO5j:sNbesݔ2Dr*(=J:喥E\hKv,|Ÿ0wjgAm|/Xc)n'g,9>E)\zf[{bBQ\M'ӣD&N@})6hU[bU%vH'k?M Q0*uNKۯٚ8܄ ,C xbAsmlB 4jkHmdh򞸭'٢hNkᙃXe:ph8+daq[\Fە 29J}yv@vÞr3pH-bZ2vv'ӵgpNt\(2_|{mF4kҝugkam8ݞL>mk5#HNW3]eS^D[T?hmV s"%@^Z{*>c޺.S9K[b@6N6,34CYHq\&Ī1Tk?Kafy%-w V0OZN/CİixdC&OksrjJ `}y$[A+`v3 w` G=ReX0o%= vƜ1߰srVw3ba!XO@NMo:H'ߚ}:Io#j=z- R[{֞QzDﭵM:&4ƌx?+r= JQK2?xNɿt_G2T!)-K.#ڵ+O݊!œul-tlyV7!߷׊ޓe __ e ؃C}aڅŦHIr<*+ csw)Y]pꄌu_RGV%;mQ12F'h%n&T\:ּfEbhLV9$4yO\|ehrAiZ-LdYiGPTgRvgMW,27r^n㶞#fO([ -\0Lm.ٴ"UfbTz]*⚝7k @0LOƳ-o.."$62:~ujob}o4$co5KL;?6نNA++8I"Kn5K efPvSԳ4a~VYKm7KRoʥm$AppXt=5I=` 3@ %UU۬I'Kc qլ(7sYkua";q" X*]BXIj3@"bVbG#=˵sר(:Y%y=][/e+* iV1QrpH5qA'YGL`\Sy;y]1oUl)~jMeu!9?α.E4脌Vf7LYBꇸZJgLd+73aTWZ7wRFc7 یo- "=A#ʤrUlzy:B/u'pf VfFġ&رypNkf{}UnX1<^ߝtPC9;}r]6[#֧$/*~l}Ev>-t{Ki ||eo2rM$\{q۽wƚmt.Z6\9^BJWkCeR-h]440W']׆WTI٥Y%pH=xMNխ{k!$*2?N1ZC<6c  ԥ} S K[H$iD .C!e;VImH_4x#kH6Z"ۖ/c = cUnys\jBDKQo"a9Yͬmyms2!(@֬TدirNjNi S済m㘫} _MzKumy'5<:kGLj>W[=ZaFv3QC][%GhWk[<(P˓D]BD2:KPQ1P+P;QdA#c%-r)WoOC{Mg%Te8gt;S"2#"p@W8o\蛢xP\`t䁌74NN[<,,!['9ϖH3c׭ghI461\2᱂`㡮ZkYX즱. R?2cӍ76d`9Һ-r=J0N.#Tc`z0 (\"2がQ^ujm3E(4{Q,qȳp:zWiydOҺΞ^CwK.k$Vh$=W|GiwEut Gqk2ynZ@ydzF = | GO?Jtvhއ]F},D7e[Xj7۟s޶m[bPzӚQ9o+"[UfVen[\7$P&sgMrwm|ǽ^x݀`++9:!5:4M&陧 lg'ҞC FqzH1>6{Oq<F=ӫ}$n=C>#{͜i%EI`Ju V xc2(1?+=G^ Z=: XD҆[=3^ɯx~HE,8!^F.hTt-F+=ZJٷV"m:ɴ'H|rea}ihw188vt)S,mGbH^G$*Ӿ$b"v+Mֵ+h'sfx@?AkzkI]̷ B?hтݓ&mCkw@qz"!Dhܠ99~.[XQ~T ]D2Y#ӞHT3ZiڌZj'~9'=+ NE+aP9ap/</Oh6ĺg|pC'~+мYe}ŧj8d`d2+ Zt*ZzBBְM,;R@$A=9].[1loҘ\+sVmlbfz6S<]Ť, #@{hⵋ֗>r>\,Iϭ7cb34)]1mYUl)L24pFFB&mK'Y-f*);["MA)4p=B $r$`$бmҡf $<˽ e\"TgV%-|!=6㜃42FO%nSX%̎{Xr_y Ļ\dsziR :Qm+|9s:u^Vuvs9I x~+iEɜJ1k~W+x!\Y3aJ/گ]iG8qiG$v*$ϤBfKDM u')6t$nM`_j1n3V}p3vg@ߟG*k-4xQ_sבW3>8iPRao`|8vIm[\;ErnG0s2n#ּXE2$AVEu']ܩ4!wsk⯄KVv49 ,s^iEu#ru $ײfWϿa\K[ ~I 33t}+LtU+DfSG㞕a#71cǭV4-j̒B`F7)}UBOY B2OT鸻3OSҠiF$\q]-Bf"POrܧךhJ)| u, ˦e$d_ NPVQOXMkÓH-KϘpONTxKZ(f̸RJ;KY2G&@}kFGԵ8ʶ`T719`)E-^odv׾8ap`(/ʬzX˒wʅOm#ÖZl(y⥵ӯ-58eKUVb6e@ϡdJ)ƙzADE@C#$I4VM/Xr=!uk9Vyy?ҭx#K&!c5$l/nFw  I8ZcZIg(rdHۓj7k a fiYZG2#$j˓oa5tu"vͦ]\D+ 6Զ1ir.E #" _[{[ s,xq].~[:LcP<ҽZ8ʴ8ja=QM;Rn.mgH=sNʭ:$g>o뇼icW9}}rxfOIJ$PpQ#TURq9"4gCd=:Ғ5ȮUFkWcM}OpmMKDl8y0qSm& |?= `mKIYك'`1Mk4rG9#wp?xh4Ŷ3Uk*.-αyg`:K#Cœ ~u%Pܕ&[fHc nx֧m wB`xzٮgyQC^/?UԵG$\q9^ ^7Fжܚ+#oIY-qjXh9cPf8Wc+q]p9.\C4T5OkgB̜N;x誔ˍt=6Dqx>?5W hA^xM M:Kvy鷜[Y-eY!bIـ8`߼ټSyakX, 8;t5jْE;[ }+TNMIE2%`WW qZ ;R<Ȝ|+SݣvdȐdgm{%[t qV ͚RW=CEVKMoP4|ĐyɣXL6?/Rr>_"]!+ly\ZP&OBjGF<^O?A]ÙcU:bI-O.I9[x/š+O&dk՘׵|0џR Vgd2ycЍY{UNR!D+d#I'W#D44%V_+{O|NZ^m滰qǴd=ѥh{Rg@!'eS2>Gs6Xu;mxޜIF=pG'+a5ٛ*SG~}cq"5mVQijp-upAjҐ`nMA1_qSitvcӓLƴS=b`sNGNrǿZ{fyjATR+]]Mlt˼'??ʖx|o9Uq ԞYiGe_F <=.FKpU:uAivcfB3sL=$Nn94]-RkW 5[PHSs/e̗:ۛnT(cVº|Ӌ CPޒ1O՝ŲD*0c$0z'R"qg9NId.wR"zgɯ="F8!ϭ}Z O_=;@ O'e$K Id{כjSV:EA.=XS" vۻ9j]1T֤cHDZY%czqI[C 歵aKU->;*H|RM|¨.EU鸍m½OG(|]\4qGotMT4SJ y,\~δbhT-$H<&qLH% N˥E]%W+Ea2Ep9_JSQ vR.|I[i%EܮBq?#[X_1 5ia0\"+or9[s^Z^i- f>s=u,K+$pņ#s+^;4QDY%_a~5حE,˱$.hl_Iu[Q7,nN=k%ƕ%QFU)tM/˒0A_6zc";Fq2"k4 ˅i;>YMs:te :iVc'mrN7l- P`,kTk)p̶E|j[rmg_Es,hka!f' Go\.4/v%ռ"dkgfk{Kx$zLT!3]nfu>&71 aTpjs};in <{Bc 27dvwfH(#zec9Xbʜ}|='y;˸4qnXDc z :z 6-h˒sW^ӮV|O2DX זk5΅2\G,q9z=.V)}{[hmY̫ӧn8R%zm儨.Qzq&rd]I rr8+{wX v;d`ƿt~5Y4ۤqSUƛCky 옇 d+uoZtD՞Ī)r׮ Pn)BۉǸIn_$6;I!WzeƦ|q^_|RH?=X( λA9I^|gc4@dSN8O&fdHIU&oקXV}b[)ij Ŭ-m"GCtzGek7fWv[#'ܫ fl#>!.RF 3*q8x&'^Mx@ҋg][%Y/"p@#\v2e>uqn!Eo+ ܒ? -2#xeCylg?s/Ȕ[FTȬqQQa۔9 7HW26:W^ =ĨaVP{W|?Q-P9nOf141;Pq|:\WCۦixgǦINis ;t8$|?rDj%NUʨ8^>8R;t][q0Sbf$ ]SL(ݘ|a õ~@TLfYGv[kq 5M,qu g?[{^m&,g+k^E&SSGiwbMb.Ð?x0rG'H%ܩǯjͶREO^(5]FItL>GP$pI'zK$Po, РR&l{4N7rN>\ʶ,"TU(f#gG{WGĮ'I bW.&vW:FM TU6a3l~]L&$ Hq0<~tkB[,`:޷}MZkXHc6*b$~ 7cq<^+nBSt ?%me_1:->r3ٿµmRk*|o# z^èqG5Eg̙N66ED7}rui&(V~lk/N* 7}kf\[[ q2n*w:K r7|Gژ`oNW0٥b̂2^֧K'`4!#q=0MtALsҨDڍu{t.VU܍5/e hx!~W[;.$!lIpB"_^5XBc؝1,OM׏yMs&Wi=Wծ˩]\҂Fp +WH48ǵwIBE]vb$+VUG9Bsr y\__ʶyP)`qyכZz5熯mg%hn 8~\E,Gq`N2z~YI=ޞȢL.Iq\߆uoSC i}F6$+ϧE8@U՞-Nd iRjn~!\r!X7Yi#)=F5]{d†$=ᤒO\l=*$9/_GB14MfKG+y!q%x̑:;^k񥌭|e# n9 n8>"zuGxNM6I4o%YI Ü?0H\\A!>gb=y=ii$rRZ3+^VRx.x\u_u+NCA{uA68fI>W=ukQcz6QDHlb@ЯY!5v'j8QӏεIb"hsA:ah)` `[[N %ȅ 3֫ okbeHq[m(P+$00 y$_@7<}Gk}\D`}p8;w¾w2F}$|āzZUktF2J;Ey?9.ۣigB rB>mGq& "Sɦx_P6QFY^ELx{Mc3ȢC+' f@ɯ.F& AÎ,Nڌ-k p0 W_+G;=&h Yn.pkE`q(0r`h,i1yc=[CM31\}He'k=Yn/*P@j1S `Byå{pY5I b3;q^̷EJ4_+asGZ[/[;.W9?Z 'vO+7Mt.|tqmڰFF~>xyK)õ:&냃>v塀ќtv5yfYqx\14Yt`3GVQSV00u9YRѝΩiֶ7#- qc6>RڵizuRڜomS!*(kP@&kP`Hgcy UIcXbN=z8s9h%wm!H!,0ʥG?:\Zᙔ6;kmqnh+JKGHhvWqs;(֗ ڔ '&QQSnz>zv1𫚉˙l5-V6$0[IJ*qN@Z&KL>+i/. ݤ,71#<3ޟ+q:yh#x u5 g$p8vzͅ)$񵬑Y⎇9lƃ~a*{,%ׇtcO?2F2G\f2UŨ6ڍmg=+54Q%3E $btb:B fxwT,{wP4*O+ȫOsѧQN͞b̓:'T6u. &\2Be d7LW kٍ"yT۩Xt ,- n q]t1IF1wxR9EO[j q>KQK*F |#JĹ;IoK攠YbJOݸFD>'u,Hȸ6I`zcj Dyښ ԷsK. i60uW)qrsrvG~#u}a hvn"ctWWbBo|ij-Xl#I0(T~5B4y;O^3kH-5"XJ4JМs[yf)h ;O:{i\I۞իj2c)I.A?pW]Iu(BfKJ)᜜X}!*o :WI\B<2a1ÃjH;"ePZ.q"T"Cm:Hd1ј$*[P[NŐ*ˌxn>$W!H۞8Glv ,C#Mfh6-yvha{XϔUsX6 ,np$6@Y.;8gJ5%7sQFYjWSq}WV}BtI+08kveKh 4?;Yv cIratUFzgzS&9{<@P_ J⦷ז8cvndʭ\u=FXmG_wQS*[]=Any=]:(RGdn0@!]rZKoȓٹH*#jYT;">g5xMcqkk{8Tߩ`=LpҭŞZB& Hۥ@RjHL[ey34hZ}p6L*9s9Gu^w%>Tgly']RǨPsֺO4$Gc1 g^XXMiyv TYDc(BVOeۙk,;Kf6֢mtK{o2XK={2i$e'Zx%{>%G>֜MWy#V-ņ-=p{Wq$b2J85C̆.dv短xş r̪dFY?|zNy=NU#Ǫ<+Z>l|OxbNqt1魭!EF+~ջsISqrJ(8Ҵrv2;KYF!U8 O|WV}v(VHf n#S3czԮdFX "RN:Gd8zt0PWVwm#7GVsNF^W/%KhAsg(Lb2KlѲ dzӮM[VYªIu%K`9ӓPl+{c꺮j\EdT,*n}?*q+I$@~$GYV89\(ҲR;+qwk}p哳$UϜKPp\tQe x?*ж|s/c;W;kX/ZI`Vo֬GBz!ʹ;?ږ67F50+]\%|qV \kŶP5I H\)'>wFXYCGfFJ~=*)EyV)_x3g&_]Y/Ռ9;HSGgkdV|KVsgja[*Ff'(Xǜu椱{e. Le:;fķuĨy32iI| qr(&:QC.El7W/5If Qphg-ȜJCVHlaOw:OsEq4Q>Tn0 ŪJb24Q\[[7BcNҼ?Mng k}A-fT߱Έ{K{y&9PXc9?6'6<,9$*))Cuv#Lps}nz $!4QK Kz* CD)n ˌHwMW@zM;"g,Ɱo.-i #Ӛ(O]c$W7ICuvzx/84c+(qDbw W3dOAڴt^[x5*YAXv=EFNT[sP1-n2(e]@#?jxo&?EakNkVyՠj,cNW$k7 ~nƘr۽WIl7[{$[e}ln1A"O/ב)s T+vfotocx/images/fusion.png0000664000175000017500000003715415247006660014320 0ustar micomicoPNG  IHDRmQtEXtSoftwaregnome-screenshot>,iTXtXML:com.adobe.xmp 1 2 3 0 0 121 244 1 hJP8eXIfMM*V^(1fixHHgnome-screenshot0232~0100fotocx-25.1: Crop: width:244 height:121|fotocx-25.1: Sharpen: median diff 2 15 13|fotocx-26.6: Rescale: width:220 height:109||k IDATx}wXU{XPz{{wc%^b+6.RD@zIo9l<pP <2fzgY3{?7!s@@s/E.@́RȀ+eOe??8o+{+esⲙ&WC.[/? 3 wQQ󑓓,ddd3.((@qqx̀z5 lQvff%//Og>sUTw߼ySi2*eYXY+K ^uivhxee}~Pu\w1w(4괽 hh,UvJ:k6 XM5x|ւhuug)%^Eup/)) ?6m$LjȲV^M5IzfAe}5Uvet\wh 4pW^Ÿq0k,fΜ N'NĴiS-}!⫯ݻw%Ȅ!ʽ=kM8u@}Ϛ:ڵk HAgk>T{r LMMEGmE0krSUM@Pg84U9sA-`llVZ!88Ǚ3gp =q,(]Sӹa,|^{Wn@+99Lo8/Λl¨64gD[u.&UUSl;rS\\\p{TE˱f/촴42ץgX5LLLжmrmmfҢEI& qñ)ڰaC̘1:7zBǎѥK۷O8?޽{ p3X`=z4 &ܹs)SgCbȑxtJSgvh*lUTaФInݺLb eŊWۥwܮ7oiºuD[Xo8pk wtt, ,_~1ckϟ s{uE߾}B fѣGh޼9 c֯_-Z@Ϟ=ѨQ#ԩSWeGſ/2#:͛ 5EvÜT kU"Os~:+XF]#""m6Xc-,)k֬ؓl2ɺu&@ XkzzzX~=?~,z`U? +W?B1h hkkB@ܬ9D>_.< 8x! KuyL) h8kXMi|<ޟ?p̄ם,2pi&fQT5 r :yQc9+zҌKKKxގ{ųgEg ӧb˫Cpha k6ɓsNYi"d͸w.}ݥCp|z &n 6 dRcfƍKfL'N(K Srpp>h Ǧ2;oK<έH3Up 9wn*76lp &cS^F&>nݺ%1_cs5 +kHVc1ݒܳgxn@@iiiŋpa WSdg;-KlR=ʉ9kKصkWIwidftԩBӒeCCۚ 7,ܣ*oA6pRGF||<^q:vJ'qB>تw,٪{8ֲWUϲf+OSA5yĠJ :~y "_+wfSMneGAifU`Map*/ƞl^2ʫ5~2 YD <~ 7{̿YqʠgAfڋ[dr٬?&<5ʀSi^0X\b,z2Ο2gjhdrOerU-s9 +g-s@2T9"9PW̕9pAݙչXUunB]n2f>ˀ'kZp쏹i+NjQ\^nRG.HbBRb)cab_ʞWwI>>VKָ3 iJs ̝2^DZ&/@ZJ2VKoFzԘ?'lXb["8&%_tA-xg=hLعi\pl[= aѩ;Z 1p 8{YU4*-*K).'ѵPl;x-L >ܰ ^4_ưnXv!RsK˪\g/;6NC^e;`^i9 95.d++IǓVh}0j.tjf1O38Q=tMjYS'Wpp)/tD"ݒ~!Kv>n`u7dy9YQD}ig%3/7yO:ȼʠ{|NxzfF(i)CBph82͙i  ogS/aXVXz2r.TlyGg yقfGvfZ)?Ri[rcU RK+7?Wԟy"wk# ^F색?!KL4)KE9m.ѹ4xB8ȷeRWTGܽ|ژNݺKQ>i5@QBˁKkaʜX9gtԱѹ>tkd$Ch*.`5kQҡbЄYp ³[0sS|N]9$7a 59r28{ !:q:6/ ﯾB#N8x:3Wp9 |U'ȐեX_m!syw{Xo:_kNDSt+=P:Kw촗LS~+GX .?7/`D,ׁ1ٺY9s!-$˴oV3(B!~а&y%ڤ / ,+:1wG27z-4 (+[La!UR=,qTI%w ܍2Ɍ}xVme~iqX>w8Z {B p`*J5޼X;kLr !d>Dgs[{t$.Oв%|l_ p=u =ypq}[9 TfNT< :u/"J1zcޛyv`nEX5c(iB3KbF ^1 ۼ;^ sFCP^2-zuR,*HCx|/bKU0!~-\T;ԫQV Spe3Gf7{Dp·g~f+Hpò`s\}CKiOƥu#z$؅:8 <kqw_mءTwInٸrVTPt)i^)6%V/ac>w!E\Rwk~ *\.Z4J^N8qhfZȔЮsw[6%K&tg$2]:fxvihX >1ZӠj1* Aݠe)pY!p1a0Sh869Db+ᄆ¸pqL4o C_H?i6sjK\ l>>zao]߉~8~:1G2ɤѦ0)3Ixnmp;lv;=Z`:RE8*1v?*yLJZih*&FTDj8n힎V_OU0d G&erf6HmC,W`FAHyLc0 wEpٍ~-y"QA(p lDۜ3<iLBmV[3plR&#'.GMki&?G7{ԅv`9t i gX@"=i@ ݣNX(7\TKT؝]r=hv dKΣ!1fGc|r4:gGE^-M 0i:W(N Cj|zچ2 K]Lvԯ[#h̙C75цNXa;݆mRӦ)1:O#ɱb pihh3/kO4z=-:8q4V^^yZz^Wu\DX0i'CC~ޞ|V xc2+z?}?_P7<$7)ֆ3SC[_h!or }jAUuPY mY}g&e4瑩I+}֚7\~/*l~>j1 yQa^LD9(*zF =_W{UcU?#p 6XE 3ҒiC r>_{ \4Y\kȰ3 RuYxhr,eڢ9+# dz€xeXU uu25+w7W_>j1]xwo Yk8AM-ZD4_=X+pxU5(u=v)v_px|Y1nfu&2z}yRp$Q"3~>o?fRקL\N b$9BxEӊwh:T Toe^z|J{iV9(ׅ8ړ2$8ؿzZXH0XjeX)?$2UO j]>5zUWMVNff՘)KWe2 ie̕Tp2|W&w 8p2jQd"e PH 8Yբ ȀEf{o~kʈYjHc5۲|P]2 -MJ٤p(2j1_G2de@\-2{\ˀ'kZplYT<'Np(2j{'%ċwoߠ-| >M*o}hi꬗kpJ;=vxD޾~zp82wߕ>@'8mG;?Niʣx߾^bwN@БʹpK;tuq18]x\3OloOݣb-#B@O)zS&M2>rq,~AXlD5rY>7[bM1%8*u :)ʪ˻:Ia*7w>U,}Չ⮧-T^C|,BޑCiE9/yG%..yg:yg25wS%kgO8}fx?\hN3GG"(4䔩S\\]KQrŹ a>pzo :2%ѢJfO2uH:ə(e[ rB9|s~w6inކ?.B$ș plyy$f璱_9mӠA}hQˡ`O=h,Y7n" *^Q*6蕄M:ln)ꤠ/+vqE=OQP3@p AZR\,Zf8rM~9ZvA-=,a2h|K;=Z"| z[+f/B0k|C,|yRe*cmknBܱЪ[ˏ5۳+gF#mVru@Q&!8ݘkqx^IKǶ1 aמػg} wo&mǓWA)kfsna%uE+̛8@j~B:`s5xfO7 da.& 071İ+W.l'ǧ4|kʀ8 Z8\v7~AavwMqr(4ţ&]>4\]!):-!8*FH-f s-ֈIHVOܲnfΜAL32(3G8(ׇgR4@a^Ѯus7k~BHt,1 4ǐi+0[<\E\al._(Srhjiȣ@wfRiJB}d/%WCeYmP@GW_|%>sԭWWxfl=Eq3Q84ZՑIxxb=72WȈ A"NzO9dRz$Z|-ds64זХ1`*p:Oë Twd2Ɠ/v}5QkuyT8g+?'%׶N LX 'Ut]G0UmOyhc$8i>L(PϐʫNgF004^i76[w $}O!P=}݀;.H&pmD:_! T0:GHAu83.hͩpEdBoϼ,)q 6CG{\}F H_=Ɛ.MѢ%=֕ 0P&k8 9ixnLL`Խ5\rUGt&A8pykQ@ȫԪ[y_S$Q}m0gs ^upAB4mCPx\ĜKéû0jztI8xQw@O?FTttiA~ps@lOc)p%40֪0)iNhlY9 #2!"/ SyT+/:!L{Fq޸A (ZI&ځ|x;t0]ׯX>'z𽇶4#`McF3.yQgpp4%J-w* _Wu[^щ)w#:?Cz.Ii,_h. X8Rxd\D^^Gc#C,8iRx֮pz 8J*@pJvy-Lu*8E+I䓝`5L- ćcKآn)c! zA۰)|L&1?[T]Aw۝G,۶Wl@HHaԬ#v8;vwpQ-U->("X E#l~!U 8baq̌ w205o{N 4W~N6Yu~V,',vcs4>BŽźNUM˿oS4};*,A4-/9I9-pV O pdRޚmqa%">>mQߤ5;yƒ+1gױE 6A~q 222sH_M-Zsg`67SaDZ"^O/bT.0 A033E5ImBӬmwٶfp tQi8st*iZZ31 йl?raѱw0fDkhҮ{.Jd#'3{DQ V#FBjrGh%=/T 㚳Su6=dPԭSi YRJJp1XKSsiAG8s$a%"e8}4\;=ƅp);4~KK#6 KcK8MO8닗ۏx4/y=w\Gp*4 y p:ǀgd:(N<. wҫuxa(Ol.Yǥ6#GkM\KʤbNp .F[^Ξ5[2 \^>pL*[59M"ZyKIH(أk.%0W5+%I"|ut&a -ɕׯi!ĸx%M:x땻C,4& "/Oa!xLqǖN,?urJʼnT pA{w`kU1OHYY1Ig{}F-2ܙ:( WC*_y[YJ·Heʀ KbIј-ܴ.M6?lk7}I喥Ec7gA/- ꙅk4!l^~olo5}ܦAy*v 6G'8nlrEg҂b63U Mm'U7ӗCt K3ꨓ*- 6*l ҙ\v^yyU[gy٤rd}"L>:J ;Fa'N\-ʀ Zd>L;\ÇIENDB`fotocx/images/margins.png0000664000175000017500000005714515247006660014457 0ustar micomicoPNG  IHDRLtEXtSoftwaregnome-screenshot>,iTXtXML:com.adobe.xmp 1 2 3 0 0 190 263 1 deXIfMM*V^(1fixHHgnome-screenshot02320100fotocx-25.1: Crop: width:292 height:211|fotocx-25.1: Sharpen: median diff 2 16 17|fotocx-25.1: Rescale: width:263 height:190|fotocx-26.6: Rescale: width:237 height:171|x\2 IDATx}WT[w}yg{9gDI%s9gY`VD9sɬZ_Ձi6ts9UO۷鐿- ooܩF| |\m߽{תҴ6V'?Z@Ԟo޼W gs[Q.Iڱ\_xes[;rжR._6z{փ/Aɝ?_8ws. ڼ<[zs #k"**J ?~<6oތEX닂 BCC6X \ܾ}"f]*0jz}.WK`\pG#?s]h1.^ &@[[kkɓ'`/nχaooIgqihhhҲ^KNhիW=|I_r.wplZH[|~[b+bkk=|@ore@10zݻ8iÈ~3gn/͛OIJJ/!C`ƍj8-ߴiO? %kp~`kC F{ o-l+`WΡ)ɋ;5-oEt)rC;::B]]K.TѣG?ٳg7]*gggٳ'NƳݺu… <CŨQ`ll,¢~_3Xj֯_/K\\.`kk 6`Ŋx`ݻWp>/\ ~!LMM*X&:ݻc= wuY˖-@bswn{@$}uc@ޗZ{Rc tc333qeA<}/XEEE yMmmNNV\)ݻ?`mYE/ȱc0h ۷/&Nqro`ׯ~7lZǽ۶m͊î&0n8 dEbĈ믿{PQQA@@pܡG?ѰuVwC,[20Opr\z?ի.bۋۄ3`ZQ[7.H%}sځ06vc Jdd0Mt,[ζŠ6zxya8i&pGr\W>{IOOO(++ ㈎:-Y[nBaN4 3f 8 XKZBΝ;Bp*<<\papOccTxG w l5D߱uN<A=ۂmWrrT9߱"s{Z/H%}s-ݗ e"wG"^4lk] Ϲsٱ9{T hQ=u|۸ˀ{a@qg׮]cev_yL.7E8_Pu)]~FVe9ϟ?kׄ^]#rY@˝w,X~;[Bn#[vMA==q3` ΖOUUU~~~(,,u=s{VϬml^X6m-?ߛx}쭱5߾}ruPgĭz-&ͮEZv<T1O.4 ([ZveeEܠliY[-[:>͛˜#<&fK0| uxȑ#"vQZ-̖ÝEXߚer p-?7 wb<iqq4P^yMC T#/;u1~&q8~cZ ~`A08V{u {<^h+ǽFرnnntp x,*b3g7n޽{[Vl O<)܁\2 4,+/,hٍf 28Ecomm-Xk9-g`+f+m^ 9h'Tx4%p{Yp\]vc%˝,s(*]W-g[_M;r]հm9Y,[Ģb6m=ސ-bMٝdk/+Y8VѣG cSl"1Hèc4,'`%`Xw(||p|-\jfς w2N0>?#&5eKŸ8ے#ܡu)޹ĭHy?ޜrVD6xaO >ۆ2 t0`EP.<hh L=n 7UKl= sSYsrT05Ɗ.+c\_ .ifa%aݹss<q|.`,|`x4G&y7lxa[>ہ;*3^ Z|}~fg)X~nSI^|mcKbeEz!I]||S+AνtͿ`fpñ%c;{K]_Z8+V+7?/q,{́#\cD._ν>%:VEߋ5>Dp7>k[T9E{^^cmXԡ7KCapgϞ :غ6sb{00Xi``X[guH|=UKu:tIX\GL=w"ܙƿgg+n.+akJ <{"o^lM\/_\w `"'9h4ד@[k_Eד@[k_Eד@8ahy\d_s^RǫoEr]`2^V[CQU"Hy\dV5׿@ߎA+7r~c[o"v䠕Vni1XG~;\Z9hKK[UIelM{:. r-*Dv =SO"NO"9}+|,hB̑,/8|/sdgf 崏XVKNv.l!x1+Bs剓7sPMX[DZjed"$(smNZnߺ#>%A5݇()-Fw}'4VyVܦu0h=:x]\㈰m5ށuN8FCbThh@{\IBiv fZ ^Ubӝ~SJSZܜlv*hkqRG^*mXvUiXsRXAMU9 8KQA}=WXOZwMck6lٺ>A~qrIKt"h:54vpsuƳ16+19W;rrVCs̓VݫXd,a6WY̌zh3ugJ 2s7DrQ^[5K߿ }#6wR#͵_fv#@T "gI4\Ӟ%ЖK 1*;rT ps||;ܨ/_ZcBSߌȤF_YVx=+^\^А DEG!!&~LʛɢbQNd[i_T"6P4bџ:p/׻ h3#@Sy.߇M'`FR-^daY@H-Gۡ~ , ӳ*p)N8~A]CACUa,toH$]0{XhM]\ZN-7du}`i>:g!,&+ˊ*`+*@8r%b4L1N(~X౛7*i$Bk˱$cyИ<B{Oo3׻- =rS[Q8_dhG8~:4ikѯ'[*dZ[] F#8uX͂} oFAz7-֥1tl܋ʆoe/jf?ѱ_hLS;'`4!1Z*k2n?s/`7fY/FDG[ٖc>[d%yct}L`o;7 ҞhkJb>ᙐ 继:bl6@Rnú%ED@۱w~؞>πFcܚ[h^&2 :щ޽yBM}2%e3e~xzh{s)Q[]`7{LRŻ!( 9u.s~"욋 {㜦@_";.*fR2恂'9\Bcj܂Θ y5ndX`i_Fl#dhXi3 ?o]M`p hjm@(,a!(}xQwvC_g<ߍDk酣dp:#jҸ0͌R=@>S,D!NLZ{\C}v@;9M@31Ni Z3@{fT:,ۆо'a ׻-H jk}tOh^fA$fD}ڿzñ@w\R<.``\"h.#,WpZij>'POsdҾ` 2 [GOw1^u89`r'd fkPY۬0`Ǐ\.;禖{L)T8M=>j1=*kPz6 Nϕ=v8cqo:~X|6~1!z̖؅kxErc}:TֶA98z&у[Tx7,f Kyt *{X"42^hHTmh`صc a&<|DL^Cr64́0]KܹoDo0܄†@Z_0D/v@Ti~2\",8tζy8q>S,Yd&6!-Ϲ+JO#ZIuSgCiGKOG_GH$=X 12UL~Nskw sSmB)A4响 W?xs]d65.;-b7QEIoie{k-h HHehJ\~+Ŭs`9w.bJiN V.^;VV .ctʡQ}o2㽱Z3`p)O.6F ny#*~M-/k+AZJ"S(byƯ,C:N {GS )AIՁHpqS5i叟xt25'bT)XUx\eVDU #5I(-k,5U()EB\ iɈ%wvMМk,ͥeHJ$ɱd;QyY(EjR"2r/ fc:FSy $dQJ%3mOxW(4(T4ZRx8 lr,7#hk.c]e,-ר$R&,,/^ʀAˋ21^Ws"жa hA !9 +=m.kZ,q֐[gNi_X& 2hc)/lC5;;\Zm9k`s[!YVO~ 9k64/w6v =Im sԚ [~>D/ f ]v`eه4ٖ =$m. ZIJ~sg¢vL䠕V>^t@oL`r$UKZ9h;KFe,e0:߫K=&|.9Z-k z!xd 2pqxG43[[SIV<7.ה!+c-K{RU^=+ceb{b #(ɣEnM-Ee,~Ч_ *&,կHUƝ ZjFNwNA i82iM.i9(΃!tLB!q$A-nsۚ h߾ANAbg~f?`ȸp OP;Ue3ap9fLTb9='`zk-Q<'nB>@^m\UZG1{\~R1\\]}{◟~@s1V`H_0z +Kr=wG`˩ ȣZM̓=} ݷP狘;:Sl-U4hke&kcׯVš`:ca IDAT'zO_0hboEV> wKV.f⁵Л#7ncJsc Eū(!ޮ@ColNQRh?m%OcI8Jc:N@'%6ƜXjDdK<DV~p G|Is@z/iZZΎv&a} 2 !V@ ss̟?c@oOԇ%1̱Y菀k3H 0^ 17wš8`DV&#waux?ڸǡ8̗flܸkV.Ŕ 0_ 9wjYULxNaS'K@AIz'xzo%zt~mU5mU)m? Çbx ۘN!(ƴͺǎ,EqA%Gؘ̃LjIJF|brcF@zwl8F-iA7%Kk[ZܢGNQa 3{B`Ԓ~O,-YaG>W!X}(V@ypʖb&\zDk*ެy8{^rppG8NFHz,@E|>F@ɛۜ-nts\|~4=3Y/Cj9ɽhlD_=~ëLoxx߲Rr`F!+/+Cv]ɓBp:ѥce Pƽq)J%a%창 g`TU0Ʃ)bP0O@KXc&d nWa8m"k=f)I %Y8h%";Ra}YQ2hCIw*.{b <3 ڲ,xPgNO8>yLY L፼" JYOLMc{֫s{9޵f;Tœ4Ⱦ :{scZ|齫g9" _%`$(3.;5z\R_1jPPVJp(>:[7tW+6"(:JNMkwPI;Bh,KiB+Ŧ}Ǥ4rl ²Na/nJjM3 ~ I/~q8 =zUkj5ƨlN?xJ+ah`!E'O%u=879߲,}:rE_E_R'҃ҡ+ch̓,1h N {ET< ĎePT-报T[nfRDdө4e#*(*.9:J,xb@`EJ2 mK*+GEgaTALIA._4b}wZZ&+B˰&|} ;1ҔP,-{7ޙ͎ٔT$$̬L""Fzz:1R\{ e+EeY $4^"p]K C+,"$qO(?GVKZz7kiE9V吢`Z/лX؂LEAT6 )K6Z+Z,Ly44p9PB{heI._^Z-+P&WO|/9haZQ»/[,ȕAv6y -%@n ndVoyD~ϲ߂Gf `h&M,P4 D$re} Ҿ'J*.K7S":ʐYfv K[LԆ΀{TN]6歚].rжc<,WT+?rJ@rA݃cTrA]AZFLi< q12Qxd"jN5XZR$ӥR|i3 x8߼aS'1<~s 银p%t ķ=eh;bṼvM Gs G0̓޺uK/ :ș.$mw@[Y^p:ǧO2&aBfZ"犔./#>" ox- /cI,-ܑRzi+SD3'xzzn뎛r$F H!~/|.'r9Mxk`FF9 Ho޸A*PF܎m^f N Ia4ݔv"F=SM%106=g/&MRFƯFj/LaSbO 3gD%gRPˣwǭaI~&m93O'J N3ű vHL'9|SkHS]iERG醢|$YmVV_F|[yoEw,m^zX\E2Ν1~p,\$D Nխmbxܠ4,&.f@KiCzR8&%о}]78۷!}c^TYj*24@;ٳgq^XMxt 6ƞѭ@xzlkב7B'9k%w(!䵐7 IڂD0Lp;X'J(å9 X?X4K2WiizsLGU-2S0NKsFYsWP{0 íNl1` 2jӷ/$Wg6=>+kDQ@dYd%S,Mh tCyؿs)~5!_,2l^ Zre|oah;d&FDWxyعʘ;&젫 {=DZB(YM'9F `x b?xwìp`b&1*Xv;bSSqA`>w_9ЖPbY8hT"~~ W%kЖ&TG`Ɲ ^V#?;.‘gl>5[^{c1زx)v~=>! FD+4D҃p5z )?2}0Fq YMfc9BKJPgi])ɗlY:ho ӦCWG ,4J0_<]rDLp$ r Vh,I$`h)VXq;؍8wb? µ8z(Yc8Ql>tE ۷jx&bI!>7j})h!=3 2aY%ud1P6;7R2t h+ fF)57dm(X{~z+bjMA1{FD%E`e@˖6-ǀa0;lf Fjzz q㱒:De<9hئy>t pThB]M# X# ʜr!8n#25GƣD|yhݠ:jg#X_Dd~(%" vML`J=hE`l' 9Q,#5+:DVsP ZBDuhK&TV 'S2 + 09Ybw$}rnG;8 /=xQYW`Ԑ8xf?a zǶTt\N6i]OYYu sydXZX^w-1/ٽ ,=,mVi¸*z<~O$Ъ(`  +UzQCp&JE![1y aL!wH&+_E=i,Kz-US-{0j2vCyVlcÃx4PݗInu)Iˉm6'crAj$cvX1K: %= ۛKL[- ZR/8fiLqL[Sxw U2h Ez(zV#ڣ}=hU`l>z\pHR0 Od|ൻ<%+)x?B\ X Kx_%ͣkL.bXEJ5c2N>z;ia q _(,84w/z؆'`YZ"ˑYKO&E6*KƶEЙ1uvpF<=a(C[Ve؃,j0h- i`iAep :Оb嫖c<g+M[9q][JEk=݄~~ AVN$%/4oOwk#cZu$ƐNP˫i~2aAtPh)_n JBuТ)nk,-[{v8h[k(o,F)@L(e[!dP剫?|q7-~}qy2?,Xm|#L/u]CgVM<>7.&5>Y{MzD"d kem6Mf@+j8r·8Lb 3J1NY@J;(~>7:_Yd 4Oˋ,ddփ6Sb=nV#+-g]pq= Pʾ{O T)1jI<8!Jvּmgi8V, 9Q 8b',8\zwц|۳Qs=43!Bw]斂(QQQ|"bM9ERYHJ>.A$= i)Idm)ӟ k0R.i|˔8M<~Hy''U&YZ2R堒w %?^:dR^Zs@Lt]DGEBEN-O2u*䠕nMI+iu.!FҴN,ﭽ:#V*4-QK_Z9hk~)@d|9h堕Ӂ. ZVSAN5(E9|\^VZV%%6:ɉVRkeAS4W4Z#U7fH*xAP`"(T%jVN.-c*VWD"VjNwƊ;K6,&oH@bɊ^VѦXIA&+Q*Kfj8ٟ#jcL< 6sa:k 1^;@LrZÎրGU1xU! "g@ށc 006z(I1yЮ.s-e qVwiQk+o/h (&M/W8Sz^vp}Mh3-Eu(~ojEsO;/gK_vhߍAxn}{mZiAQ]'9#mHӆ|spyEeKKe@KJ}Wp k%_hsc} ,߀;D*?QXb]\Xn3t9̵57TKH>0o|MUv/2f{ Í|\<:^? x\DI}`Iԯx" ޼yo;Kn֩wZo $0'66%%& >*v'6Ckxa pj jz`6k&4}Ɖ+{=amGIDAT\=pi ! GOA]iFhgaRϾb1~2NZ~u=C\sLѧWPTƴYXn9ubTsA ; w$1BkS0nP3? uL9E?DlF$LPBpKWU!bDU{Ô;`< D1 DfV j&,]0kԱxf[@[CJ:Xr%0|Ѫn?̏tmos}UKl,+DU>gywxlEFg'*AaO!jZ>^3f,l`bEDl"%%vm0aAr)|P P6DtF6%žcBcL_a s(5Z|xOb `U|OXe>CFho4_؏?zi<=*a (,~w ؏ƴGQXu?J$Ҍݡ={16l؀۶bͰ2FSq}\&vAxˇƱu9XχKqEy12N{%؇W`if0v)uukqH qGcѸ&qjR}D 6o!H8uh [OQs^|$+_EBx[Џ'dDVu֓1 7"q1g0i 7!{Lv,%*DjobrsAs"dFb|2\_D/ܵǙ'gJLQy)ϓ͂^%pyt s_`t Eq q \<{Z[ |FSMmafHD@;Q1T#=m0eF<}* CpЅRM[l`d1O#Zm|#, 5dENhh'W\p߉~@]V@dWadD.NV8&I%mK[Ks9 <,\ 盢o1T}!P<U^QB?q&s׹غES+Hbƽg(?tL: bU0  9KK BÎjJ[-+=nn-*ww_#E/$;Ҳ#oqzj" *NfaƠ%TdV+ۀg.A}02!`PPlZ`LO LO*b7)2s=,FY .e{ 45q%Z~Gu8hA636PZ눬>ZL=e*? ӥ;6h9w:VWbصk; KfGߡq>^=&O ,@K+qyM`{6-2Cwr#Al9 g&XM֜U$Pg {GxrWNRēZ*$=9Ns=DRjX7Z !z> OOO<]Ϟ9慣9q,f,݄h"ց M \nqv]nr$MW@=`>Mkl#!%..|H:&@wwpZ82-|s!(򉃛1oq?Fv3ѽXA|V~3U{cVU.h)iМh =vCN>QPR t5"|BWIkhʇ@;{&N9te,Ca$KmS”[,!؀8]YژwD*5_<ӈ^wrF"󛵴q ӈaEY&\ETKDYR҉`ʚ|OiFe֌x'$_xјsk>sZ!}j'e3*0"Eghjk8BQU'n#/|Dww7z@p&ݸʆ〱M y=fAiC`AP՞RtqA# h[iL;*)Nck)׶)O@KbI"+s3]Cv9x=co?ArI}N_wi%0Q{,]TE_&yPʹfd]EQ%kҘ7Si?mfc!TT}ȥ4Sca89$G`<ħ쌳Rx$,CL7# ĮI<ˢh{s* ]c$6:ѣ8rΜ@=zt\<{lPOCY)">m1O7Lp>y3_C'-޽o;5]?q7n•vx솬|LAUE1q99sW)݃5,hY}{ܤD\>$Nq-x1aqp +d)%s޸AD5a\#hʩ*O\@0p?-P[U ǫ(W!f[c4dm˗(MĘ0O +j{N^BY<¨.3rA۠$"eh 3a<`!kWwuZ,\ko%KIGLV$eH8o>tC^Qqh+3`cpyyFm%U4EHڼoBp|ro%x|˗-Żֆ2I & !5@JkTʑ|!`M0'L$m v!.{.A.Zcr$I- /z8/Cf|i$k"NY h!j m8~( i!ʳ9oi8)zۙc Z Ԕ3h{=DN]T<.]Kcv ^9W)`O`Pz"%ehBQ|O Gr|x/e>-WV1p\gvdͻѽߩnbǞL܊ _) X/PEjAS=C z WaOR~/% Jc;w~^/qA:qw@sܗӒ҃up鲰֑{a{>ڎ/k\Vn?-+>Y x}[ Dv2?=8i֝穵Zڰ- J (35U|{h5rI܋/'ztHЦʗNU>g2lm Z$Km6 %kQTc3Qrl>1JU>vZ͖U>1.?Vu %VY!S_d뚨k,A+mVda7m+Y-dbEp[Ty|z6lljokpކ-V1 Ud?27m}"n\mē'A+AnsDmma|c˶[ `xTIENDB`fotocx/images/unbend vert linear.png0000664000175000017500000001660715247006660016464 0ustar micomicoPNG  IHDR]ٹ.IDATx\ksm߼e18љ4(if֎D y]/>3_myyk6c<-? `Ś?jkitEY_z |?lbRnr|;Φ_/NW8d\慤֡-<:k6MX=c8F}2ߘY=+\hDԾ!~Wf7>d|JL;$vDAL*/#RDl$$2o CSu;?ZWNC׼z:YM]M ~YclOmc'yu^nɬtt3ϭ{}@xZVbZ'ߩWqک8o~ܙ{byDD }:^|D^D}>qH >o{,դ;4͆*mX7V,PtSģ 1#ВkA$!-? ګvMW&M/2F 'WUQe|$k5X^^z8a|pӅ=q?| >)_j)9,;6Kn / CrWј=w4. {sXOĴv.%s;iZI.1_1i)YyAYp}/VMHM@ݤP#~CO? I))W'f(Yc]r9&J!'!PZrV ^ܔgV㭨P.>@ $!$I)%v?Hq!Oư}k|mM9mm=bĽ .*^u`~Û.Ts_e4}(Wx~jT.\ &!>3f.ma\y\IKX傾#M 5Qda*;(ҟwJ3fs5h|!CtLe$V6uED@{ӝm'uF[Ϳ_ iEy+~ &zӬ"Vo <0RVL]$4l zJ5Oㄤc*| y*hC T*Jmq-JuZxNh{Ni  "pC1<8$p^Gܕ=n[!ⵙ?Rs?7Z?}sh7$7Kn4aK_H1؉X1gVzdUcFs| w$<#.UjQJ hh_gՎ_*%YodA!V60e.;"p$Inq5z# >!i$-6Xr~,' ^uofǐ(΃6cl18ȟ7Sk͐S<trR"JI{@n.ډl}o nbuw[S׽4/Tamd1q0 FKAp[Ԡ)]ys Csb:60L6z`Nrʪ QRꬂ87>$QƋss[@!ow^ +̡;Cbrߕ% e^m`/zoΡBPcȍJ)D(w =tÇ_c w>i wéjԏbߣW)EᶃJNle0撋:S ST( n#6L)OH@nn+[fM= N?K8=(-8Lv+x5Õ rlyx%a>q#(d' %VfIA֢1JgjQÿgpOO0T9q_(ODž둻cL95ܾxDy”a:M<z_}1PTTsT'@sW-;qpGU<\gqӃUl,~ztSTJ4rdUPFJ_2XJŸPU@/Kkq[V Oڻζnoѝ҇唨XF2_L{\c f|i)J˴MKvſ5[閅ŢыMWKq@jA=RF:;Bh4nqbHro y >6p{j1eZ  ^Nؠ+d-lGŸz^#O#?[X.vd}ʌ4jU :餵Ҧa+3\ҰP}.I֩߄u9Ģw1? u-`*e;*|ۇRus{ua ^oGy Y bJȘ1n8(b:Lu15pw6b]UFV;Xkp죐,3)> wtNNTm.*ag5Æ l9A|4Ra짚ػ6׊#$qNAxk9'(H*֦/\-.{jrt%DoGl`F%gIfH8y:&3bb_bdt! !%7uZ ĬҜ6Z+UهRъF'(v+0.%s6sj#?17bW͙ e4( +Y{ ZifXI&-7KJ<7-6ڌB):D9M'#8؝OOsf?+_{o^ܷi&/85BN޸} 0HGzPsd!tq;^-B{72 5W#t@;oTkQiU)Yz2 CWV|m1rճ/D xez2N阽z!A6[e w>o"gn}vRJPxgX$p_p&WdثGBD8-"-|׹ E}xz!/U%7AK9.ދcx'x3bXS sD19#p_%jy<2ˌDAd./8>(:;SϏZQo]Vp^Qz]NN.|FNwCQW$Uܞ>I^MݸDAE<@f̀+*{1} |c1 Y8n|߻ `}+̍Cvd_XS|*`?bsH;~M{h3̠|@;2̄C^OT!o+*P#:X!pTF |/ 5On)L<0icy6!mh ދBDx{{-  31]y w3.9OrhH[הA+~ZF~kd>3cfjVϪ[߹Ͼ7E8V05sH'C:Q̞؏YA;|xjE-Ѫ_K?ш yk~D7i*L["_c Z4rIvÓb ?ɌIYJ$ԉ"˔Y`;~\C~-7nQQ-p퍎cR䤉4aI{ũ[qžI6ύAC@|&S]m¦f wARLO9|MP?iD3`/mK{Y8{OJowG;ދ̪q@Q:aQwkԫHng.z}mLOwn>L?۔=nafzҿ_$\d rG[ ,̬ s*X£> ~?. _SOzg2B\bR 'f63qgT\̡PQІ@^#MZZeB&Hv4#Oh%'G^#ȏ>z8zVf?qh!ͯ3PN}~k(g B`duKKå*Wk{Zr-s8LAgJ,wwOOMqt2A'Q?NPXd1#v jY6CvX )&^} wރ?S$fPg| Wʥ:a߬!ky5)5\ Q&Q"${XBŎtH}%/CgC)5 @h!A3v=8kBqF{'9D5 _8I`G Q6i& DRU`'`lKOƔD%N֡_e0lo+H)F_A{N>e7s"IJ ڛ6휈xD[Ic)MW6U߬[R6]>pI/PY}A1[˜{ P,kkq|҄FxG7 Ƙ CM' 墣H_z_H̨D\9+ &AZ`!ɕ) R]*4b/{(P9:#mmG|rHLSnu]b \ q$fd_E%Z\7"q}]}ٹb Rp\NqabxL$n! Ft,T=&tUV`sd=56;pA1'Ew<(/x9ųgk4z=avm=#V3E,36yOi`; 8Uő,nl0M $'"6.]x$rʍ|x),fw>v~Nv͹yH.'D%]o!?9|~;}"9i)%j Ŭ /_^mf7Oرo~ޞ˿~{%y~?JlzTXtRaw profile type APP1xeP[ => Ĩ?\6'Y} ̽<˾彿(fi c] @ y٤۵n;ȗ7B],Mq:\|a8r 30f}lhFCn3X_K}$p+dE[$@ϺPy07[itiTXtXML:com.adobe.xmp 128 128 IENDB`fotocx/images/select.png0000664000175000017500000002532415247006660014270 0ustar micomicoPNG  IHDR>aiTXtXML:com.adobe.xmp 1 2 3 0 0 256 256 1 0 \ieXIfMM*JR(iZHH0231,0100fotoxx-22.0;Crop: width:256 height:256|fotoxx-22.0;paste area|fotoxx-22.0;Paint Transp|fotoxx-22.0;Paint Transp|fotoxx-22.0;Markup Box|fotoxx-22.0;Paint Transp|fotoxx-22.0;Resize: width:128 height:128|fotoxx-22.16;Resize: width:384 height:384|fotoxx-22.16;Paint Transp|fotoxx-22.16;Gradients|fotoxx-22.16;Resize: width:256 height:256|fotoxx-22.16;Paint Transp|fotoxx-22.16;Paint Image|fotoxx-22.16;Paint Transp|fotoxx-22.16;Paint Image|fotoxx-22.16;Paint Transp|fotoxx-22.16;Paint Image|fotocx-25.1: Paint Image|fotocx-25.1: Rescale: width:128 height:128|p IDATx}yxUսp@!"00El ̓g-Ngﵭj~To~cd 0$A0$!93stX{OPkϓd{[qABkq"@#D GA!9Br "@#D iZc?CBHH;Br "@C@@yܝp=&lٲ_]/n_4"#wsCq8Q/j n}[:] ^j!jaPߩW!ױ&T=RiBo @UU 8#m B!~'.h}=G4xAEQ5E۩.2 "@#D GANm~ єP ***jժYyg6m{߿"ءNg{﯋R""ZIKۼv1ɰlسr`I3 3gDbb"< ƾޮ'BxBעy\\\ӧsO9aXjF̌iBBBrwݻw[chM $/^_fDVPQQSN]\\MxxxM7JKO<ݢEsL< W8pࢄé(׭lj'N穪T0Р'8#4 M. {#<<ł.]@B "~W 2<o8:2MTqqw[?)oРZX,,e9p( n:O>JJJt xhjNRl;@kW=@c$f͇\p])=xQOUU( .]#Fƍرc̷~{GZ&l*Ο?7▥s8UUբgΜ{x_ *e ~m@_~A*}–-[ʂ zQD[o-k&O<1XG| ,XQFg^طoйs 8*Э[޽t5336lns_n nWVZhN>U~>*PU՘ZS7.0fh;YYYؾ};"7@II  g`߾p\{ڶm;]vx^_FƧN>UPVVTcMF:?!A񈊊ƍ7mjSNee%> 1hР>N3BV駟|Z}*heBP93*l$h@ ** qq ;wFϞ=qٻ{7 $Iw(=FBfؼy3TUѣx18zߩ+Wu58Rq\ĉ۶mQ[A(2X,UӠ3 #D555ߚT5(z=4@0t*AHM]S&6oنsڵkx|rR 7JA(,,[g/TVVbʕ4Mä)4Lz=e ;y+`F6q55@SMĔ Bqg͜a k|s+QM:S8 zM6->W…  JJJ)lTf -m#&ML0=R(RZB PM4h+V+,Z.]–-01e&O,W\\\\ddgϞ{&MvE!y=`?> ,XlvAmE ! NS'2 F[u9jpNNΗ/]tqժ+0㐒2ƍ,HL %eVB`X0,sGnIq-Ȳ EQPYYs5q<:wϷ\rիW:tЀ1GB=%A "= v;oaM+ðƛK.ƍuf'CҥKlVZo߾ȑ#ƴlE9-iQ1uD݅zAKkIb "Zn<:a8#4tPB`a/ 4m۶۴i&!!!!)i g}θ@=׃Ó /TU,ː$.%Сذ!'OfgFDDKt'N 8SN1 qgZ-:tuh1 Bb%~jm}TڡiÇxtLŧf@xlC6m:B,BDQڶm `Ǹ1Bc,U#}flذ^' 1{'YuFm >N0=ztGSN*=| xBDTUUbq Gnn.Ο?M6a $䓽$)[Ӵ뚦y$I޼yVVV #j"##È?@='OwMS G^\.tQR]]R>} קF LԩSl> W\-ܻwIƑ{?e4!aqKUtaiHr,YS\.<"~ee7fTVV͚5u>O:si yͣ-I#U3 OjtE 0Y@|; X-̝;$ܹ0ynn K.;#-Z**n(ĉE)'@}~u $ u5>,XߧlZҢE Wi)PX,Χ?37 XZZ5!?b_f8~6mJ[ogr`вeKL>ǡ-2Fi>U5V.YM6?A#""}IЭ[ԩ3bt~xb#f %( pbHJOu6lH5H-P3_O{h8傹öm[t: }U1.\ 1m* ߊ,*Y1)Q%aծ1[<XV\ ^}5\zѭ[,o߁իWYG݃{ZM$$怺41TqӍ0'[3u#E A:@TծmGaS&SO% #"Ȉ9sTS Cnѷo 22ǡU ͛cEy¹s_c4b&4Z $ڃ mn7Dcb+Qzng~O> }[nTUqzjl ݻ3Э[l=? jnwcUz^EQI|%~mFF?{'A~Zyag P{*/E|׆iQTTpo47̩_Ѱ~}aZh޽&>>k~]O~;v#iTx c=8v6o޼]vDEuzڕUV}PkaE z§X:|ֱAhtȑb\t VRZE(>(zFpb޼|uV7fӽa zgɓ(..FAAVZp8Fii)JJJoZmXlsgd5fBL Ede  .\@aaQcǨ`?  :ÝPUׯ_5r cƌF.]`٠*!*$I?~:77bɿqƩe݉0:s;9}dY2\UQ1cgz9P_4)_ѷo_2g?ǎ;/1112dzY̟f$#ۭ[,/OXp!+V_5 ˗/>S^|C<$gC3I S@H`N@UR7a9ך4DEEGh֬:tJJJ};BPPP/.lV"Ec|gϞ0\-,/{9|JbۍkaӦ4\.xcbbe >}ftQA}}N2&fעe_bi]X~#fLq)s8NiP!&CB;wΘqn:8Á%K'ʕ`mFY ¯~k/qz1RSS =zb޼0~8vNjp9̝;ݻwT[!B<O3X1YP%` ?z y#M߃ vgJdM5~R:@V44K zѣG){aaa8VZ:t"""kPUJqOQQQh޼9L/ x3g6ApiZxǎ뗗Cc`}vupx3ѣGwܕ{H$77L Y՟ߕ%TÞό>PXX"ڵۈev~˗/ㄐlłHh߿czgA8ܪU+ɓnM8N DQBly͛7˗/DGGcÆw sInM l`M`$Q)UJؙ l3y$ p?hbk'g9r$?9:w%ܼFnn.^… _xv!^B16oݽ{wAee%> ?fZc4#=$ɗj7a7h zk>Ca֨ US>#'I2x X)6ܱ 65kc}`EQ4 'fA#B7WFP\\4 W^[nՎ8ivMzWZZc\ނygyB4M᪫k,mq!|VKc>D|^ i6[?My~jz[_byQAZyhAw P;??C ԩ0jhxjp-ȊQgϞmo#//Deemeaaᵚׯ_?vXY9fn I4 ׯ`xf z5xji8v9|ih{:ŬV@o Jxj;whpܹs~߽(|W9-I^<QF&'&x:++LYXyFvƴi3$NҡqEaB[0V`ԨQؿyD?w3Rd `7߳6nas=OT9sTNl5ci}tQi7*"WR#FOqv!`j@zd^IEJ=H<4\j6p4Mj3z/Od+>hͪ|fL:fQK4MÐ!CLmM8L:`׮tl޲ l *-[](a,_}Z2g ; cIjډ 㩆K=[n3PmJlUs)1a1س{q>/ܹ3M7Z4dԍ= #cftZnx5\U{5ɓ&dfpM@CҿUR<]]t8klvS :tD``2}5IwOmJؾcBIDAT'q2uD[/@y૩Gk 8cvP[tn$dsiP!Ԇ'SD}CvMwif@ڱk.V`$}Æ ER0Ȳ{@ HG?aRp'O[ fv܉vqXQCa!XnnFFz<9Bh^`A `$j~ec)vUm|^}/}K\f-ـaGIW1mx'mt0T 3mt1)k@0\];Ax;pwFΦA p70Ev++^/ lri$I22Z%C̮ #[I4҄!s "@#D GA!9Br "@#D GAJ߮R! uaj6) "@ 33НW |޽ᜦYX2._|9'';okA!ְ "@#D GA!9BrA!9Br_c%!lf#IENDB`fotocx/images/match-colors.png0000664000175000017500000014250015247006660015400 0ustar micomicoPNG  IHDR7TtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 234 345 1 0 )#:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:345 height:234|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:311 height:211|uh IDATxXU.|}|$&v{/R*HQQ{Eņ{ػ"bCP {75&9s\G=1YYe19ڞo/_ijjBUU*++7 e<0\[w_>0<*@r@EEPZZ]칼<ӹm֟/ | 6c4 Jh T \dgg#++ 999+)) @[PPcY?XXX>70PnY>hpgg/..$33uEI5N|@eV;tCcʤ3.ZV-Un_xH-8x8> ~Fu!*9ܾҿ$ > (T!4Ǥi2 ,`uޝIv1b͗M=L WQgAIV R2o1`OGWQwPSQxS>\O>~j۬:2`k?}f;[VV 3ztf ##c[f zyjo(!*cKc02RSN^S;aa I 8oC9I 1FHLº%1r%vī⏐xph^Y5<-6Þb0i)B^}@_64O0#uLLMv)1mIopnH +Nڒd@!yyyfY."uyIȫҮL}g9~?rTaN/$!pgE?11 . uV^]?*I0'(F]]VzbOZB;*9?dXuccc한SG\)))ceٝ;Qnw~F6,9)+kv'n 5=G_b(/AZr""$"<7n<^9rz7"2 I/~/f"5)1Q-eBCCBWrzvFHY0Ӆ,lVr HʑxG@_*Ӓ0W(#iXnYE]_wCY82Ik I(+)DrB"#":B\45WdHJjZxG!&&ѱqHMBY;n8cadvkN"&DEFGp4#%<k?""Gn{II  mgTt,^e׎؜fJ9i Tb␕[Fw^y)ShnZ>2*Iԏ cVWTDx M4Ym13wc7Vg]]]nSWͲ5x`lܸ;+1I;BPPVmD SWVQ %%UXَ4442b󐓛+/@KbcuEYK@AM֎sp^ JQ[[ ځ[ lx j)sRtGaljKxlT<%ѷo_|cx$ҷpl !01108EIMjJSpib0СPWWь(CQNv.}я$d`6 >C*k,8U'Ư܍bd齰17]^-a`dPUU&^юcaJ dTI29~&ylĤPϥd䡬mG/!u{~ ѿo׏9KSCXb:'IVu,p4EE!%- Qq)( [EY!?,PW(d4ai? m h-Y$"p{7p ^xH֬Y#} 2,s`g@l2QuڵرywR#*[`O6)uZ2ObPM C 'Eo;AѨkV__kIP4xYdTq*a ה"xGXی2S0pa9LmHLi .;FgQz r"`͔aзLG; VUHqz- 0q"LS}-R0n1 iM^A#'`ܤI03S7QB;s}P,M-1*jp;E6p32Le;ctT0XDGR{Ot90Q6̅ 4a4THP̘=MZ(XnCI |10151{h)C\VTV#-LePK8Ni-@ * ׽WPY];he R ,1n'I8aDjr}t(HBMT`a9;Nywzv'>(lwgӵ`X] nlg ЙJe7uVwCWVOgǂځ47,mM!YdKpHx_QTƪUQ- ,FC=/|Ob<0o#Ǘ'9 #lNLʋC8yTu0ydWA7hɒ=R [#dwճǍXTV:3Ri|Ch {C-ˏ v8a8v1.F/qLz\ǀ[O)1R# ]iLd5{lN[qvv$LVځY]W|pa)=[q3 %i9Ar ښf ') :- դu 4Gxj lj3[I%m&&]wIIwad p8(e0q2,Oj֝Sa)G U7Ms=^>ѽ;ݍTuX7orQ'ub5QS˭ .!InGUܞTԢ*-:U٪T v7dw*N@vБNGg Xo];tD_^ C5)n>C8Y2 `Fv9MZxR*ِMI!66f^U(@EgPօ-j4.W'5i+%qk|U8ЛlN;n"MБPR^=HfV'Cps s Uu=ؼXRBK^N,1{p šS1DMd] 37P!#y5(ȣyJ}c[X P"Pw;z;wcƌZpa*n>{>|[bb"<Ԅe**^ 6. O8SMib]x |B%J[DWME <9@:cV!yOˑM dŒMGP^rS6ǃjn,E0R#|ȮE}!߭5$Ur+`G)B.npmrlHr,'+iѳE%9! 7A_Eb|>B/~PdxZDߤXg9-,v 5 hi ШG}i tT/!s;[PE [Non~X>ѐBF~oi7Q( Υ M}z`\sI5\O"4,$Aͱ19`jiEInMu,9;$$v!}0XF'TCͭW@8Sȑ!c98xtNF ?J R5uN~Ghi(XLh;~}FxUז7RK9oţ gp2H⯫é۱c!$M9rJ cO!c+],$疖¼`3W:|:Y{?N12!AYt~$U# !&<22T\9N3\N?06A]8db)TWU_ $#i /= >'/ _Femd oK@_[qV#6\ !^?žgyHyy%(Rď8ɍWC,ā}׋kǻ V",IRR=@v ?Jx^F0%ر`|DžԑvzAʠTn `g9Bʫp1w+Б@)W?a,IvRܽrb9ɘ\A^af;< .$+N: |)jb׭Pr^K̟li1*`Р"M4FVH1?ɣhd]qY8QIzxF>0ծgfTX콞U6>m^wR[ xI8{=fM 3S 30e68`΂XZa7z$Q1vXR~3B1qKn.-̄י`0rX8^ ĖW[W<1LݩaUa>S奯}4)$I"w:Hr<^SmR5sŸ1#0&dGca4lQ-aسn!F  kS̕ Zz_܅I9̔NNJY)T íHȅ9ؽiT(o.SMH͢"'ϔ0)7=gspق\$\2T5u|~.6-֕?c5sGaȤ ٙO^Rê(+FZ 'pfIm,Jѝp#R `L1WGHb^EabtGfVXab۩aw&|tWsz?$ KoKn=@;_kcf;/u0f1&]z'*I_'$HpLza0鍵1R+ό]C#`Ǵ3<ܾb&ϗၗ'5z> iYhæCKܗ' 4=׶f OƤ2'`cs$7}Crl(Nރ ւh7l۹#~N}I ϗ >Z_Vamvg}dIrm4ooIkܾm|8F#0]Lba jafAom;k}{>YL#( &7)y@nS2@jJM Mnp&`?%c$A.T. < o!#KLL@tt . < o%ҏ K@xp`s&`?%c٤x>^&?%MJH:/h&7 MJjVMgWgH5jveܿ{O475)w  n?3W/ M 6oT%*/Sۆ-[BIl??} . wPn!o{,?3MXk=.['P67d;;{vBbQEu,Ӏ.V;Xb`}zUF]lf:r>݂[c]JK `xɍ y1*2fNMOz+@v@]r=0(F@IPF7>;2qShct~_gs;3N}չLzV_24>k{o|pcG-7#asekQFAٽ!0z%'ua~'pc{?6_.m(BwH%Q]u?}=pczEvǀ&[l\6 \r_9amarԼh]8 ƒw> 'AHB*-&JK c#EaҎE Cha6,\!'%Fm@Apr?^U5W# ^2IR>KIՍpiH -O~r.0h 蛏FTF2Nt  t/y㏦:$=taGm1z*\>6~e- =)6En=VOz㼂V^kD%ivdQo^7 Yh(H_~$\Žj}=J }y @BAh>WH /եejKQSWx1ÏXu1HX mEaMM*prj(HGJ̒:J*bC-p IDATǶ,x[{ka/PK/?LߦD=&he\Wa"Sl1b0c<)juو'94g{9u=iY%Qp_)  *vj ) Wnj,ÓbTJiZ{)5C\} uHQ&̞Y@x7b^ Uc1 NDd{:D? ks9g%!n;]~ `9]\ói~[#퀚d1}i$b qhYX~3:cVAQr04l `(".qU%)a(wDqm=ʋ2a/S[$k{\08Fݻ lgPܣ Mxn%fAhf,^8{|'M4 envj!nuG/!.9 1q(!uQl؃~s!F@vޏ+?= M!*%v[ʲ{`=[%n=ܧ '³~5" Sǜ]PP׀^g@_QFָ/^<ž[v^D$ftOc]-R^D[;a+,ACc]{3p5JƼL#6D`CL;GZz;I 8mY9qa,[Go>׏}a5e.R{o"dFQdI<rEt )U]8>WzWD㻟|v,E[!8:/QYQk˃j` i㪕|%'$aw;≰F<ѐ<7i U.؀;\H{'nd-DC]%ѫ@X\񯐝a ) u&$yXWCq1ݿ5$ (*`Ѧ(5_0gfV_Z`*'Wߢ1MUe| [sRдsAcs-B_ߍ6볱?S%@̴TԍYcQ_6! gQH eIa]}əy$M4۷xnR՞6 FWyz5IH˛<1#$ѦWAOQ/E3, Ѩdl7RBEq t(h(CaHW{gBCV o=A%ރ[3WOm%IO [z M ,ՠj4 #`~卜4ǩܝPe9wSLhe-j3~g774/Oi񵋻 '.9u<."N7EzY4WW%*P6Vo.EGprn kk\?ټ`ǹդ6aYZLv˼֗⬛=YZ~9&_?cdKLNů|qu1r-N>j?խ.N*3s 2^s Z,jEVeH$5T 6`)ARΩ ,~zKL*f}a|ZoPv LıGŐQ85bm+-/^O2z\fF0n IX2v쁐ԳFMwcҮ\X;}mֻ8ANVf.]y"bI:jYhC ln'6N9Goͱ ߃iE]L>ȫnē3 $"Вۻ&,ڡ>~_*!:'-}Y 3QSPRۈh#5InoicO-\==|h*5q+YdϢm|ߛy:Fj0=+7c'pcW{M"Ijl5+k8N1_:UsВs76,VD$7y[WlSPOCn:?n¯1 0PE]]S*\f@=lڹǎ;p2%mW}1$o>1 axCP{)vk fM[~ymKCtP3 U_Ur ҃T#>e$FO VS"Miћ-)'"px?>.C9"+Ȥջ Inle8~x?ֻbt;a'^B_Ru*,[ K,.{|6ŝPX /.@UNv3]@jpn~1jܪ+<0@T=UajōN n[璧h~Oo` 'yѢ N ktT  xQ\RO!Osb￉\7]SOH Oۤ@ؾCಭC}2 Bf2yE+1LOI5[HM5 tHiOf3^cE>6뾟5x;=bmL!m"߁8<#TevZPs0UǚP^Me i2nT\W2пFp%i5vӐQdV4FayyWpkL♣1@RcŊm|m^I˿) ܄57?up5z+ȡ0~GMX<8 'K ߛ $ iͭ nH#cPWH⹰eDZzxds[5^&㜐Sn !2(3pc1cdwi'wN,܈ 1cr1da4e%``=^VP ?x<*dN΋:[3ov(򽅍y`!6"4yHcAfu~Crk90O^sxy4[Ojiw01T)UguPyT˘ځ[@L.0\KfxũŌ5x} pp^@&VQ50nwd+4PdxH4%k5o)oxQ{N텕dɛRg#_ޅT ͱiv&O%[PO#p%9հΟ㪒۷7+HUO97o5jPVDaE9C}1u`5ٙOP c!ObA5%$'&sj&3P /^) LtygOgc]BGGȡK[</{<6#'i叕ݻT,a!6?J!,Lf)fQ {_inv'VqO\-qu4Z^ VuҤ5GJ}87~(]jJeb(OF"؛Is %^e-D#׽q_p$TQI{f#FSPpLm>?¾gᤒV#tT!," I))rKBYGߣЂzr:4{6@EArR23Ɠ.>dyʋ2bȓLcuU? hǥ) ]jay_j0>oqK1ogΙhlF_zT/?{|GpѷxbmWWLObUYz,c[-/|}5pKFdX7y `xはnC0g9y@n_3-3@ŽV"Ƿ_X_rB<޿ +vuݼ~KFBmM` K-<? 4/;F:<$ϟGFMj'~tO{$Gy΢ 1a s-}5p &1 к c$eTX!X("ooݹy>S6o".%Š cl 쫁<':[߿#7H@[nt.مf+/Z..ؼ}^D'w{ȇ 5б'蓖|ysܸvbXa _Dr~w|2^bmr,÷7Ը|,Z^:,/ӈ`_l^ â)+ח?-m}pc̝?DVI#-1d*ZOЄO8>fDbҩ5؎kᐤ4,Uז׼QȀ{ۣfhnEsBZ8b-8q6_ht.]}ύvа{ztnuyEhD$RSSGQVQ,Xُ8nȖS%K^K %%1k&&"33iyv  m!Hp*'iH{;gt?\c9gj?$݁3/SWw@|z\^OQ}/L?b[]uZNe8X;P.#0B-1X#Vć?0q얓X$2JtBLd(I`"mNGKB^QNή.:ImYUIt)<^@Htp߷6T @ūzX};xFXy4 9ɭ;hN߿}mWָ,r=gc^K,5ʔVZZZ&4?u#g"({oKA^UǯB=%wIJF[@VV2"Qq05p7)JN cP?nvSf!SbXHJJ)a%<C9:c'aPkxn[-u ܥLJ|K~9fv3R)oK^}a TSu[(km[!ڔږ6F6rl>Q?g- ti.v J0g}vό Dy_Fs5M=qYoBm{Ʒt[kYV=А~::+Krqjisu*aMmGJrpCGC*8u<tjRi1݂[ ze&kwQߙƒh CXV^D>gb`Ϊ(%'p = cU1؏<:ן%Uq4F:, v)%tQj]NplzqdFX}X;/Eg'lı5;)}SRn.xzQ<wce$$7’)R:儩8z֯:o;m3j?.LtRU X;wy`X@K𢡄%ARX} !JcüvKqtTZoaa7=tD]\"MÔ=< |i>;[R`$LFn]cAJ{}#eŠ-hՑ(]J,){7H|x (õ;&uv7?$χ-s/Il IDATabTYe YUZ0Ր$PB:_$7ň]V֗ IOpWiɪވSKG`0e>U'ez?GY]Kd?yeb^WʝAĄ8<~T XNId jKaS CU|LK)68VXdLevM Ap .GWq~GYn&P 6kA|fҔy|)=]0I`R~wD9ScI'PˋÂiWT ;{hQ=yH}$O)TKd9e~u[_>v2&BvFxLj`{DW+elf,@qS%[ iJS6cZ< Ce*yCEYLqـ4[1x߶*Krv^ԐL6ʏ*$ +{Ɔi d* |[DNrk!Du.]^}A<lw5"f(©,H]om<7{4'GؒOW[R$ĘaZӷCINu9c%;S *45!kd<Ŕa$K7Ր[ p|3enyuuv,471~)y `ckF?q5TH2ce 7rޯ/JL]]-' ˜P8 5R7<.@MAa %}ztnlQ~p!{q5($e;b/ntF}m51Z*&"s3k p]6"%HC#!)Q_U ֡ Ӕ.RM=+~Cx(++r~5Q]C]F=U;-@.{=;S!] 5 O"[]NA_ASl$Åص~DT$՘Dt Kۻ7EZD9nErJJ)[ULjާk[D4^7drTËt~b _F&<>q_u$ҡP$cgQߜv/"~|]=aCFM\ AB,$_~֑c;&n?r23*[Iaj>}]SPRP3WҒ6ڱvm#4Td=$_ޑlԜs!$mD^29AFiIU͈ڤ33`!ڭCK!I9KϐRUzn'n+Q@og yu}qI}ID-E-Β@߻ur^2p#0(Bh{: ox]=Mn)GxAv ú{$7]h #˯ڃ a8 J^mg:x|qq\񹃂J<c׃nyBS LiĆ)4W^Z1nn!+2583+-ҁ-[c)mrnx FY޽ܢč__K 6ͻA;u TǃKnc^T -&qVޣxkL%6Z _P杵+Ł=pe>}Ԥ(޶rr~j#k J5$l46V.鎳H'D!k㧖 cʙߛ2׻!׈|Y^†!w2V7qQDfNV3]'!(4 a/qeܱIL;F'֓49=f y{ȣ~wv ܦ{W oA 1҃?SLp1UuY<} >Wb>yDuG"5&O;Mw7yK˹{z {GE-~ J`s("怊Y1"( ""H%sN :3]Y_43:w g5tcg׮S64fi -# {Qy~nm-MBwW"M:hC\2$AIXmyQ/Ҹl=bÁXdsf)zp#b^pϏ4uz=6(_X8,$f\zVW` 3tvv0=EXh(w=%*:9=3<i'"h#v, gB{3A;|fdiN"qbϱ+DG_{%pbGġI`c!D>G~euwe$?4Ϟ=>bgAh8׿id:p X%93q}/An&!@`.{^s 8eAsaϼ]CgYac{)I%yǎkoğUODƺz=壯`Pwr}@?~y{)vP֐C0Qf2&y(Z8onLK ̱1W'S_Dرc1>w"[4G9lV^V(5SHyi1ْvν/Z(" |6pcװ‘F S)I_ՕD" {9~P.3g ܘPׯrY*b|GNדx4h NG>A4\VpcIo"ȵ47s[ֆ6ZBZؾ-Ao>?;'d96%^ThE2ie@n"pHIHIiEV++D&7 |2 7`W,DmڥD&7 |2 Zjq21uQc$CWQb. YAppp@V\_wh a8"\!!]%% C[郾tEdNJ,"c~UbvJ_WU[ nّPO2rP}*Pjh;47VeMbI0޺5 x8G=] .I2͉^)g?giv`.VS+i!J Hw.%^"O7J{2j 8GV_!IF?Ôv$p%R+a(hxxxK9_ Y_5R>~?DiA,6fB c:~C^#jfjP ] ?N$b<#ΡO6=Vcܹ4zXt9<z 2; a``{OA,2YgƲNWOdтKB3 l0QTF+b*R/Έ!024lxG+x8b\[,q ֭0sXtN(6VxѼR#2w#H ƐИk]]=R!sZ@/"^G6!ҽ׌V,ͳ0YFG6jؿNAi_v^%,^0YUd*X3R,@\q)*ssZK9"3{۝#DAl o81;,n./3p[7ZPHd&ӉR>D"\+Lcf'dîسkEظ?~ɏO!([bo4lp"b2Ӓ6m/8`",99:P%&Й;` 8x8v_}v:._+7tcsMVAkmHOA hũ!.&YFp V-0"{tNh([7CF]p9j "9VGp-ODⷽ ?]@`V3ʚ:؏ǿ{M"q? c@ǥ]`zSL0LR(Je[ D& U/1ETى4\7q>hb!{Njo+.سFD7Fl6lbnonls|=5b\c}O|$U/ yZIt!<0_^ֹ1'Pvd֧&`$1܊!4Ƌn.k`3NGG >NahDzӰqj!qKr&I`D^ԸG.dnb" r)0=T7m&#K='k@AZ#ϩ;I !Z7]'7bx%<aalIs hr=m!w =a)rKAU]"cSz=ԗ;HÉ^ZJ^0fFbSpfF1~%6ϯ& :0zMP~5 e߾ĵх){o^DC/D_lxb^<ՄHXBێ3E_'瘓ӀG1TLo{n\Чwbt\vEIi)JK+az^g%ei8*IE%g?P g+3^we?',~||Zz):P* cpqeZQ*paLL3^dml} * IDAT1]wnx 95DjIr47^-#b`9\sp_ nD'FtpjԮȫmzC@jL=zxXqy>fo8DbSq=B nd[_:*qan>4f Ĕ>SB1Cf #yAY7t U)yuy̮S"2%:nOPĵ{CޤqQS}h#BJ%4l,9hFa!8΁ T?"ho[ifVYb5{^q]ϡ 92zt5PKa(TO雟9K7iwkE) 1.nA7Xs5 *$W/9ؽɘVu4 W#kP2W0NYA_[[u6φyH#؟߅Rp|df.lA=Ǯ[F]Q*,V#fM )cH+}Mv{9[P UM |gc2Y@NK/;H{'1Jb x gOc4V̐lsMyè18aƹOzpt~pe#ܱTwAyM PYU]Ud8Ӕq3Z@c0 mSORlsU6,W:#Ԯ~桥9  Vh,@[b,iHͭ8ayVU+4gL[Nb3=߂ghɹPy30H\u/yLr'BXZv[`ap/F]Y6*@F1߯{|-CVB\K ܊x/r]٘*1Tu|X-ꅳ0abat|˖/Љ`46:+44ϡXq/E6H| $ۭ]/8bia4rT$}A'GW0Mj /q ~uXHn]>UچLF' ʼn0Z^ϑXJ/B"eඊW\(H33sf- V:.$HC d$P4W {PZ/'[(HO) ZpN%Ƕh\:nI8p6ZȨ{!)Wl*IU3r+LX}9h0,g@w; ^5CL'΢p#U:2͍m a}Α}Ԗ7d4SHx4t:"! ȸlnt|"} MU_((7;/Oo?lM!6cq 9MNJ6@ڬp~űʅ0cj&NVS!3!Muÿ%ZD JpxF\Ҹ;qjbTQxasӣ午ho-,@.yy7#8ET[Sي2K$gi $i'+N#k;>lL!Xm0 5o,ʈ)ܼ^˫য়=D% E"BDNbg;iX]((R>Fx|@eJȾk%r9<$N_0M$~TG>H.,G[S O:gX?ce#䕾A1ud#SJ z6 wxq=p 4G.Bqp'][c.l}zi'uz*TU1Y9 WiPۍok(]ĒNGbI30s<wb̔ۍ}R״BN(:*hBVQ Z::5SS᝜0Ӕ d6tR/%)j p`9ƍMݹ> r0hr+x]6Dl7*f. o$=ݸyd QB`!*T$cA~ i\q/?<fi`v lYo]A풜6Z8md{`jJ6Sk֭ƶ]c6FC' >nvTÔ1ob.La:;C{Ջ^xCYzrӌ*qVHKBm х$/] a\L:jWfac8'd#Ho/ԇ)5E @ꕧFPn!zZ d%'b,=,5iGwTe^O'1YX,7RrSUh yvL5e9ȫę^\0F;М6F ?Λ6z: ƠlL1~8L9ژJb(i$sI>9i)kb`!j{781OWv9{45X;A1$> jХS!O`w+;8p;\6 MUr뮾™n`nulB3 }B8nl17p5d_f18pu+ƍx8UJXUwMFܺHo,4G'1'D-_νuC7g^u ߐD`nܸ \\)ɂ=78+f^/Ws#)‘pCP)oxDŇ&mv&ܺu27ܥFKR9u\o~fz}4ֆJDQ3n{s1&(#񰳕?.dv㊰xv`!N`͡#?{+}767.nHÁ-Gd$QHy K{8^YG\ƨ{n.4G4G׹yѸ#4{h4g[Pu<XkΟ>GMWUJkeeohjXu8:t}U=Gl9D7AMt7)"p 7)"M里="pD2MʀDM ۻ&Y% Xjr"cuꊏDrb<)Л[9kgL#(*|XCM$mw>1i%k;_^{d%휬t. h}hs-y(JsÎ_şH.]Lu"&,_wc/. nzRA5.<4S}!2';;\_4_"_T>xM!@'?l cC(ښꐝ +Ϟ##>| 2G=CzA{h*ӢJ򐝛Or_GNTS2ͼߤcX] |K եCfa6T#W\Ok{+w~-]pk΀,YAI[Ij{zГ bW=M0<%BHnDHL9~s3O)p2*)7k]?fw!6TnZڱ_2$LGm׹~>)3K7PNpb@=r8X\/WA>䓇0;y0l~/IA3e"!.~w/˦ĢW._ t'a2qؚMpK vl)83fʘAs4}.nՉ,ן-cxfe:uu;.`2Ba{dicؾ;-q% ɸ!Wmi܊)O!%.&.*1w+cn\w 8ew8^g.n̅%fqwCQxIo 15Q;vq\sLEi8~6;a{ dd}[XJy :YXDr&=űC݅Wnd n^v4Ĥ屼M]-( gCw?p%l/Dx3ql &HX;ꊒq Xa8kn+ػx4W,-~%;vs]C&>IU͞=楌Rޅ<=/W۳; g)* y9gs)p\e~`#Ǐ=ܷG&!q{cJ<~3}ݿ p+ueqveEstY~_:бN2%i70Cn,QGݧ6e'wq8;p=}=p`ս~#Kr>{< ix=jp\ jap[`!0uDn̐GpAmH,[N>u" Z7mw7ܹRrckVZS`JJ(Efصk;W>v?+v B(Ԗ[샳3)DE:YGG;Oncg<% Kxj] Rn 6Y9aZh(MTmqɡزj LWҤ$ WO6Y 1n$ cUН5 FAQ{.YSqb%&mEj O =8? _ԯx7]0_}&*-\x BQOziZk`؉Xb /ifDRJmxI0)6o\YĝG,CrŠutl )05 Z2RΝ@6I!O XH+)BnFML`nj  DXE~ҳ^Lz862T|r;/!K1hX;8S˸E)kTc{ax|9́xS0wIC]O V2^]E"Uon^׈x|9ݔ{~ 2{4.>ȍ4%H-,6=$>NLjBӵzZ,04Q8~߰wƋYmQ\?0=zʊ<{r\y^[tSsD!=Dc]E Ih'㈣_' IRVdSbb?qP5XFi 9R"z)mR,1@cK \بiFg'/`s)8ׂQ\ZҢL<RyX[!(<y|ggjQE)sC){Hcjʁ0&e()̄͐'% /4E8:XA/"0w5'XbYOb8 9(-|cW@|"|EWh'^5178YI9'RRέ"JY59bdZyNljo!)+,Ih^N҉8pFlGPU(I]]#u8&icM]<"nu%ɨ!:n=\_E3 TR"8ڹb]DJLnH)O̷Ӹ [\O!#bm?4vФ6Բ]n=iW`y"xUg|[؆WH!,CiA5=^W3C`h x<ܸ-B,uQRx_ٌKYq;rb2hƶ86ֲHioK0: ;pe61k FplBӘNZc/ϯ?$?SHs\H@(~yՎX7 eLRҐLw)1IIBX1O32 be)n[qC\VWd7ooȍUhJcngA̯20w"jߦBhӃvoz?rؑ#jp#b2PF_EIƒVܥZ^hX-qG!7l2p}g"hO;nЁzT?w[~A/ }3էAFFr3N&(Cm=aNxJlܸ.3 PFHB˩JSČ=TvKo49#o[D8Gls,Sɕj%m;/Dh4ny^>d8V}Wۉ`Ap|^1tabm Ako/_cW7%QkuoТu/QF&)RjwGC(8<||ʒ8GC+ܬt!a^G)?pkIjCi/ETJ6* IDATТؘLŜe;H*yNkZht[yHN,?:򣡹x%RJ %; 3d wƨbes Mش\a5 #FĈ#04y&7cɽϯ&.At#b1vfh!I°H؇F3BUbތZ/8=7֕¼g;f;2tPGċ~Ah%uI/YضZ? 9rAp !aʎCAYo^?:""q30tw-nEjջ޽*x޴TEY~C`"Q yMa,v o,B @]~Bx$8|%.[:HeƝ]]pzcGoi8Z3%,۾(!e IӐ'{ۘ' MwK,`4,Ǧ3@Wh)&PnGre!SeБʈY tl[ъ'۪ .j<-F3'QlfV`?H M "e׷hBn [Un8/ Hqqq((*P4Q)r[3.Ǐin-a!=!zD d j8-\7F°+:F.`:dKnҶ:h@c[ #t`7inRKLL Mt*Qc„Ѱ{C56ڕXJ9pk} anҊn&n|+-HD>ՐVvd YRfRY7)ѽjnd^7Gܘfu1$͇dHKRUX0v -uŸ}qƍ5VGl:g'Y;On̖I~My Ņv.A 4Ӟ r8D>RbN"K>bKQ8O܍͔m yXp"+!Ʒnos;JbR t2Wkd=WB`%in5ݕ8-*h2,Ǚ#ôIDӒhșͭсP~r8t.~RSS"&#=; ?B#i-5řؿ\ F6[zM,-9^nq~ UcG,CUF$؇wÏLZ o ylN?Hk1g H Ӗ*qt:HKNBXnB> E[ll~HQviJv[ JyFL41f$,^8N-$s?Q!>KQ c1[CU԰|lۺ`sC& A GǝC dR=%q,n>ޞNl!' ON F e;m̹s c(1P ^EކԸP=ȭGKUNXo u `FRC)9yK Qx}fF|yr(%2ƏpoyK[9ody!xo;ڔaW -9iJrօZGv6!v ks[7[(x>yK`Ŕp)֯1$L]8JZyIUɑ&j#~}ӕ KRU`-]w,[J䙟g&AJAl5 ^(Q'yLkMe|aee=8q“ȐoUh)c/8v>7pՓ\M7/w%xC`ػ?l^DpD Sq0^$l-:ՓWq&2ɃW^pͭbή9 g\sGN"^bCbx>Д~Vy''wO+Cvw.}Ax>cAUA2]^=0R6kgCr[\SwGاes,1ֽ)D<Ԓ-ŞB!},awI*0+)vln?,v쌝r_klay8u, wQL}q0*]?_sƍ5.(cVgP\x>Lvmfӗ.Þm0GlŝNzyMpw+%c8}Y|vy~5cu^8@9m"qd{)ȕ="^Q[,` )p0c87 iHo?r5r)X!v1F&v JOI r(@GY@AyO*xfa\|Pe/`s){-.{ݷOOw=?C?SHeI6.Tyl=Я~v xtQQ*El .<(2fzj9kjmg ?zMA|z'P<)ci#-3$N᧙2: *JJ}]-LŲ-[;]fܚQUZH -.B+-?ԪRJDu^\L2< OC ADd K+?ڱ.S -vЧ!\!9= md{>f#48K3μs1᎐ ?ُGp/c O@Edg:N2ܐG5+j)!,-,$ Q`@~:hl? |6pchjl {N7o\ޮUwwAt3HT/*WE2ieೂLfolG-PX7X7AlVD [4Z>;}- dɀhDA4"d@n"pHIHIibߞ&s*7M$ߤ M$ߤ`./D&7dr|w+ QTX1҇?8e(E5%G즴ll$%|GkWƗށyRЦ~pg[~5淳K`)/5ݔAi dC1a/WA?S{[Qh*KĐ~8Qnev@̟.㭻USϥ'rY b:dySrБǜ\zsw Oݗ> @rݗmSRm#95QEz#2aenb(hx%2?hM+si` ٴ?w[ue0 Ϣ777<Fٟ$E/B`-ŖO+u6!MVAcKƪRY3_8sPe`gX}y6z6dz#HlkG#!YrZG wXy!+'mwT2Ϗ/yo^BH>ԿH{{͛BB)LtZq0R?8|$8p+quڣoYhzFhb ?p[cCغ-{/꿉X>=#)9ZEk{,'f6]\bbq&\`h^(gPC箂?@i\(~`Rٟd(P9z q JY,xs܈ HgK <`LU)*C[G31ytWbCXr=Lc]u(ρStg2b`% mx-O +6c\C,$f)R04_Gp>A$9H jM\WYVp9{ Zi\9E9LQ<*K_OƚqxfYv4UyhNWdU5_3CVU w#MhntԻpUdq"m$k`d&AtW؆R -+G\+ajjSU2 ʏƺeF8IZ(LV*"+#"{X7?aa'[.MKVG'dj.X1QR/К#C=KK@t=/} sa8o!at>Tb ;L^SX.!0ڼޒԣHnD@n uNe -DPLR0V!Y؈R[ F Wj (M5J|nUSg>B@cL#c(,C m[X*r"T$5=4O 5|h? Waæ- iI(cl10XnbHdc`9Z >#d(NxR#'("yWsZb[$<0!YS$$#!. |(2'c3-ܶ)E/phq&_kC۷Nñ=Sӑ;!I/;ȒcݎBJl(Z!>8zwE|糺`Q$*]%0g̋+*fT̺"Q2%0 |o0èie>=Vխn{(&jrK2bl8̖Gj-8}{_O!8*XpQx .HNy'W1XYc欁BP'ang*@c\iZI0eRx{RS2G_U<*$xq.=b N6wt'[!p`譢 j!ߠ(ۈ ܎"$&ؓp &d,̥*}`tyFtDB㉊Hnph>DɷM M \oĸQp?ؙwv uH2U-htF5,u\!,Rl@]K;.?4Xbu(j[BYH$:.>{1]"n SWۀjb85#H?7}([O/\:P3<ߞFbܱWquM'n-:!cU"ܭCJN!I%|ƨv:^ۗG5t%.Hïg'qî'vme61udFUAo,< }0b! 09r]cR;i{!,)1vElx=r'늄4Z(PĝIۇΝ[3F##Ge.+E#:+Ѓ{հQ()bYWB|קQV9q/)sg0j?mec1n+ H$5 a}hhCJ rI.^fl! v bvwxkC&3p9aMڷ -VFX||˶JLu"P %}pqrl+XXX`L( zz *aٛ97n;(\@-CvWP˔E|6 w>w( -zQKx;걅ax,҉Lو(I* 60 ^DF"K?^ػ|NJ0rfTZ ȅa9+ '7.wKPS y3Rih'D \L)&&'V+%V>ذ4^ w-閰4'1CSu>q 0﯄3IYS7mut|WoKIt0e*$F_nŒY(ǹnp? =^Muj0VLk|3+cȤ#6xIp(FoK Nq:Z̴p7yЇ{rz$ͭ觥(m)Gk:&iBy/+Bf/`IDAT]4ƪQBŜ_C~'ڽ##YNݛigaFOO]\S.CoQ ~ҩ07q%WwQ@[,\Fz}ԩrژNl9/}hrKu~AZHvv4fb9_D~#1UߨUL^p rq>z28ٸJUXJkZ(mz?kb-Q+r>7n(h`2Blarב[GyRbQX_7#Gx5RZ@DEK1_U~jso/MA8vAv܈Y|\[]&dVWws̙f^C' ػxp!E”q-# $^УkVu)m3pwhwgt‹NX{&XR[!QwA?RwQՒ&䃤UYZ;@Ǯs PK-dw(8!bbbc$KDzԊpcҐvu8 EшHz.f^q0wtHkQF13BMnB+|Qcb˷? ?F϶ E&Nѻr ,CH%O)ӳ!$N֖E]Ynl<˕/+SY B,E(= &jm~#ZZ'7ۍ]cw^KCf+h]Eϴ1m{c]~h>H*#CsSO,9 ոCou34 /ӶrcDr6yCHO B" e#mpNSN$vf7fK&l,&sJ$۬F"&uh!~ُ,O83mK ~ Hd=!'nG;٢Cxg`,C{y bl裦Hrc]Wsswly϶[.ko |[|m&1B{ Em^H vL&O VTSʕP[NtG=͹;{hTwpkkm}Ӏ)g 0QT1SqQdvr` e%%3D &["FIA\&}G&Ee*|BUEj&XE`1n=ICqV"-]&\XG {O= 9^0E68arQA'rn8!koif :7it3$ZVa KAq{{SdB!%E=`ZX.cHei4HkJ2+E~jUhfzk&b5E609wbQHx \s~~hNGKˎyc4aʑN)+*aD:pXE޽x 52כR -x +yplvԗySqۯ0^԰m;P*Hl(c`m\ia7=*ñjA0C,/͹;Srm9n/b Ħ5KɑjSS Zb-IMRYMI&k0534ظm)lZ=g.{B!0f[F`t@oen]8 affFX` el?%,Kx(%I رy55 R: &{f|6Zss3:aM !n`7 em)™=a,~(KJpt9YREz֔z g)&D`2*rI L+nr͡bL+,V/w* Su sXalkؠqHdOe7/-X/ͧc.܏w VzpdJF@uķm?ZLaxnuV")_MAX!Y\b΍R r0c7@tjWHX[dZK DR~R*qbJ iy <Ǽ9s~ijO9K? whfee&b߯˰X YR9%nR߲O\D,G^nf̘۝z(,)䐻?g)Is ~x7 lጌrΣ"?ӹʹBzrg/qBc<ӘZXL"Owuq?h#"} `ԏNAhhr ȅPՂ Hq_I>*뇤&7S=y! (']O֖j=wΝ#u|ʃwn]Q)65ănׁ.<%j>l7xpuKnbwI7X&|?lƃntIW.ؼUa?<ƃ]RxpK*2a7xpuKnbwI歚[50|: x,7F|:RTn3o:@WxsuKnbwI ߆Oyp7^+vTl4+n<@x, f}ƃn_IXXfz*}<|v~=K˪rDG'92Xb-U n_I;i+ b5Ukx& <$5Օ|>BF3"? ֆ<6Oyϒa#qcd!iwlmo;n<t 8e_ Pd4q[mM;c$ں6 xхdmakR| Xt+{Ch i;!~|Q>+# O%%eeS([y۝v!L&_7r|1o}Wu91*Ne1D Ct 1mLN*;ǯ=>%:& VJ#a3 ,XY!½.|TT`XLc1h F̳4L!9讨;Odr[,_b_ǁ@nUrx= JJANNgyDh%M} DʳTdgg##9b"{~?KHO6&K3GO%5Ãn<}#qXHLSϫl'f% !{(foMX`ۣˌ\S#0cQn 2 (TuP,7zhnfB* &C+H]m lS#0kT 6:- {'s6<ƌŞ{0ZZZ=o<@e]='<kx .qmii"6&L6= KxZ~&˖k淥V[Ih)6q#"ΣWa'ʛ%H ؤGI^"Sً\tam'Y[@ep3KLz; ܘ_,LǴq' ɗ>K,@XcٽCi`Σ+ص` ?`L\ CZJVژ@Im<ã!2EF\sB/:rsݘC[=6 # {Bsh:r 'C?aIid&oj'/]  hinMEYI"(vՠg:e"r3^JJ= '">V֯rcV sEh&~쯇ꖗC*E^^6m]mciHJ%ٛp{%jfV+Z X=)~W]nH֡1c>`+iN|v-xV㵡ahdӶ 6S x*Mউ~cyn5: Mp pF XEC[1 F06U-Yn57I@h7PF)o&${`) ]}1pƣYk~'z%V%nj kѳ{Xŋm[ ^еGhxBC>a9QV;o ^:d,L>`r-E 1SBWO]!Ys DeA_f1t7*akjÌq'(uqoӇRl )jʃh{DV2|qr a1Rĵ;xL۱jZP膎c|{SC@Dscy P c K K3sl>rE"[PeG]ƃݎ'5~=tǣ$@n,0Ðq!9on(ÝkK{OC@O3/ta{Eu$<$A;׼Y`t|r#p\W֓ ߢ) h0 ac5%' '觨3hfAfi֤1?ȗ&Y6s05$@[Yg/GE ."[7TlBVE5UQKDs@&s2ۖfaO(V їY|=)odXPW`0LƱWM 6AO,lÁNAX܃QP@>.¼/x}rƳ z϶&>ۖk E X5w"(bNg\u^^swo9vLJ,j(Ag S3QY0^O!˭KCI}V!@N+jbʼn(, x@v"|#bQXG֢66? 7n9Y;:T5 Ф(0=ٶYt}=\GQ5bVa1#CIa dg>[ #%yNQ\YEֈl߰450dtuu0l!^'kkQO[ޣcgFF001Sp?uz\fp;1MVۖ[j tX^&&8w꫑P"88ᑑ-*_kKاPG[5t/hh/ρ~vpmE!b:z8\Y1(*-<7& eTAAMG<a(+/^4Fƪ&YYX[Jnxp{dx[Yt,'gL륟f~ؤc,8v-GzR9giY?ƃ[!$O5~ƃntIW.ؼ-ZƃntI_GE܋IENDB`fotocx/images/settings.jpg0000664000175000017500000026050115247006660014643 0ustar micomicoJFIFBExifMM*V^(1fixgnome-screenshot02320100fotocx-26.4: Crop: width:654 height:701|fotocx-26.4: Sharpen: median diff 2 18 17|fotocx-26.6: Rescale: width:589 height:631|fotocx-26.8: paste area|fotocx-26.8: Crop: width:589 height:603|fotocx-26.8: Paint Image|fotocx-26.8: paste area|fotocx-26.8: Crop: width:589 height:578|fotocx-26.8: Crop: width:589 height:576|fotocx-26.8: paste area|fotocx-26.8: Crop: width:589 height:550| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 576 589 1 2 2 C     C   &M" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?HR5PaU{)Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_Mxt=$X3)vPI+oI2OxC֡ 7!Q " wJ/(FuDu+̇'9Ҩ/O |'^aIϸi8]o }O:Ru <x|@-.RԵy.,q I)-[_|R>5 5j@5& N(/gĻzsitϦ: :r uYzMO?>*^$04MoYFS#Jf.sJ+iw<;.+ oycz 1 G=9z ƾY7~S\.S__;oa8RqP*a w1Zȳ"A[׵I hFwz#bzn/UP9&WeAQэhj ^+*N-𭾳OiSExj$Ȅ-=jYfuYzd *y;֜*UϬiPF ]^I#5:Y&q@M"VDܻ@hgk[bˎ>9Ğ<yyx]1lCJ~vW/d+JX2̛\=*]GLԌb)B3׵y/;߆\:B-H2"ABmZ<7}hVdR.@p$[ph+Mq֢u&QЯ{6rj+'G[^m: m(X֢u&QЯ{6rj+'G[^m: m(X֢u&QЯ{6rj+'G[^mQm(X֢F?&QgE{߯ڭ VOB?5/?&QqVOB?5/?&Qq֢5/?&Qбy6rj+'C[bm o(Xß?;WK31צP/N?ehk,^MC[bm  /%QC$N[2"22tw? ѵ2/%+ 2b+?5/?&Qбy6r|w jt4u[.,'fDDpU`qrky',S<26z(e*D0o o hk,^Mc_!JִF[kjKBn%%f߭r~|1񕿊|-ѵ7rE^4) iX>H:?Xo9@u@9E @OG=ؾխ7&L̠t??e`ѓK4kuxP)F3c]u2[?u&Qp>->xEs‹}kBml$uWwy'^Wo9GB.<OmX"[KۋT5vq*׎f|1ľ]KLHon"UG"~P3Mv: m(Wo9EǛxIS}^w]u;"rP̒,flzZW˫nmִ/:bTo˴AܡI'ju&QЯ{6rn/ x0&1$M|{' ⏉ƩqLoV[kMumUb8?Th+MG[^m q7oĽx>%bFiu;`SJWeJHzgZPR4QP՟Я{6ro{ \,kQY?: m(Wo9EƵЯ{6ro{ \,kQY?: m(Wo9EƵЯ{6ro{ \,kQY?: m(Wo9EƵЯ{6ro{ \,jkHa&b!߃ަWo9Hoy.)Ť\2<<{VZYP1"?u&Qp" #daa=kvK+A+o{ l̯y6r6-?x"$ZAjFe l̯y6ro{ \,i]ۥչC\\4 !PhQo8@2ǎG[^mP1".!tacHFF<@²~ݭo9Vm/59KF<$~ph JZJ7o O ;lHK?(3yz 5\9 Į=Tϑq]g _x^G >5!H4+cTvd6,a@=pc8o8 .X[=e~"5-A+4]lmq#®FI\kڿ%~2Ã7:tc˴_jrb\)? 7=ϫr1޽Gc8dsY xK$O ?#y c㏉-5V~):M=E-c`|K@8 ?Z P9'.5 jTxIuH@ff{c U'#jx%QlbEOmЙG$h@1@&J81 ;O7<[5X֮49t8!xdQ!H w7ԍ 2aP?u-Aǔ746FOCG*3YZ޹esUB`TgkrA8EcN?];ps\@?L4Ku.yϕj=?ؗǧu?lkk/ |}h]m{w>>©Y)cVhV&d8b7.PxwR%ʹFR_o\Z Gؗ2j}C&~h N(h(ľSvfK5?kkCͣ͠ K5?khľSvf<<ľSvfK5?kkCͣ͠ K5?khľSvf<<ľSvfK5?kkCͣh/̚5KY:4%a_2k[Ȣ[i$g=1\7hֿi^9W,xuxl ,:XdC? -CTeL\L$#@uNv2h؝.yq&[Ik(5+IԐ$1#uXC5~k[zG${>?xkS׼kHb%.mϩ*) (8S1#ziAgnnt_YbF(0@ 89)bڧ|?_K$v653I!%t#pN{@:v$_&:Uw{h5{hj{xYqZ&[ i'ÖVæk,:v2yzdr1Ӯ}i:zzW^) ŭj7İh<-)|ȣMz#IS #ЧGIG] M?ukaKo2]9q*6HP%E$3+:IA_ x7Ǿ+u7ϩx.`yK*[¥vL PC_4BZd HY.Z6A1(%2L8ןj@ tϸ'?|/Cf6ڗ.-D0yh|㎽j>~.|E}iaa5s`ϼ[ %Kcd̏r3sP 魄nUw;xv{|M{gZf$,ŒH^'QmF 0hw 0(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@#h (84pimGҮg5[7^z;W$$I[;{ky&3\[ɱrr+GCǥ{ sȼ3-xw 5jˬCKР}~T Z ZSkY(GU8ۻ}n{/|*,|V|g^6!4UAO%Nb\7F"?Qב:jgQݛFJ%' b⽌ ;cd"o|%hzRP\+4IXhP> \ךFX7zԷ#K {/Y&}BK/Jef 9]āz7 gF⵿Q4 H-?Ln֚ zx~F[)F>!>w֗g98Wmww!_bPK OE`cxXO±yǩ7?ƍ?ߴ=G+?iz; wkc'?"Q OEW; wkc'?"Q OEn<\+?iz͂ Wkl3x7s7 kNK Y:cu@ ¨-V{ۘdOʹ,G'u}ykѷg"ksbk;Ʒc,KYHU$Ab./?XϦ]+5i . kLӮ F8V8#+|++?4NKhVB۶=A^c^'K߉? ᶅ?@`Ke.#{ibASSßO1jws궺Y6#ê—W)pY c ^E4G귚Wۮo3گu=sKՍvQH(((((((((((((?(ŶCᝮ؃M7q$`BB'};՚|$i']4浂+nSCG(²?0Pyc?kG.!,,/3NrH5>Q\JZkk&,M"GNK3]L?Ǣ؛~(^3vOr "V"a#A\ME΁q`Pɱ㏍MOKi^Q/l!֍ID|(~I2=Tqu >,x+}f K:x䐴HX7'r$=75Y3DQɜ+h/߈W~cǧ[]-:7sJFGxƚt xgGQtIHG1`!I$qcں 8>%CyO&;`8dk-#tOOi(kLr+|LaW8 /Cy'PBwu+nvUAfT&|kO\O/,|Ejf?Kb-ȗcnc Ap)t?B6kdZu6 k̶qGo1 YȤ $K3^j>eO]F{5$Ji)V#P[޲,eTUY{a//j+iۥd|Nx<i97SjlzͶ7zV{_Lmy t(Nj_?fǠi\>[H!GE%뾺~τꏭ:,rUV8R$mkc~ߍHu;4#%|fX፦ζҀGrsOCǔ75=Aǔ74#?e\A^txAhi5'+3]X}fO1 *yoď>/2_%麝ޡͫKuܼI qN6Ê|Q~5!"kA:|S/ΤN3*=ږb5[Ucp0w 9 ţx#]ҵf֮{MB[ȐJ[ɄIaXEQqڏٝ+_Y Ƌ)xYYkBmFͤ7Pw =~xh[h[ힲu[ 4Yc1U6oԼD/|BEOY HKG7^z sQE8Ꮘ,?o뛸m"o.F{~1ycs_n7q*;\A派f[$-#FsC)&q~:͇|9Izmf;j/ke<+'!M;ψuMLx~xl- YFe,A I-:čcOӬcg=wVc{2br&F+Gx{ -+?H= |&Iwa%=([XxVѧ.ootٴ6Wsë\$+hu$O9w^.|MN|,M趴J֖R N6>`:[w1:>tZPx`6$Y ;?>j^ ЭxkA?C0E•)d *"zr85~*+_ѴfIF'k}*i`.O89ই#G7M6.T5bºGt ^47+9Fj/x3DxsMҴ{KU(rsı$ ESuTGi/<~l[蕕$  WѾ Y QcOut mf+d ({^;l#U"}Z@ܲ>y| 6ނFkԼ=⇋54=;~1W&+xgq6Սk`1BЭ[ "[_|>K-j-&=)㻍lB>nA=C7{pMcB_ö/t<W& g1pk"kl<:ibwOqmu&g8y]]챡^|;X_j#Qf 9 SiaV8JBm|+x:ޗxQӇSm$iR(~xóF 0/kmGJ+QRӴF_FӘ|>Е=r%'|;bɪiY\ _;$`֫] /W7062FVRC$~(kFAڴkLMu⛝OPюaJ6_hVjE}< HHx=+ʼA^<; {gMB\(Sk!)]qkw75WP$Wsژƶs!g3xݞu4Fkl?j?Zk%dYf[Qm+C/ %sWrSĚ ֖8dTU 9е{Aǔ75=Aǔ74dzG"N NkK-BOA4i 8(_ߠT)X۾@74D< 7OkO*ʾ\Mw߃o̍28 |=/Z>ɯxM;c h՝IV 4D|Sc[w!C5ʶֲ:cS0 7siƫ ٷ 'MAҿ)GN҄G oQ oW "eC7?WkƫxOH^|໷Dc?z28";Xj߇M$ď6*H0}kVG潱/iafPԫ ⺚EIPn99.OZ@|ezf;_3_*.]# XXՋvph u=F-&.坉ӯ# xheYO=At?<fKӨKgvl2ünN˜dzWx׺* CZЩ/O.hkO Cps˛OMѴvi'=-P|e,"e**F }s:i,|/2<+jk;mhgIw+[ yg{5\NӨ}U֒"S b9"xa#4i9scakfd?pZ#ܒ}M;rmt߁xG[^jƥ]iqq887`s20dbTyO#SyO#@EYe?B* {/t?\|.Oigɫx[ig?Z{HO11|vG*wW=76;j1V-Kg- I c>X]Cwm WzZƓdYجhT+>fyG +k취+~1R6ZXM?L[̓Q{{kyV܁F&?|xMq5Js_5 K;wty$pYUTcԆz=6HĨUSzunomC~}n|Smw%剖B$ Wn{%!WYd` c^HNA֫KϞhٗT/jFiii~&o1^L0DSaMh|^u=:^62W7M4UL(=k݁@9T=;9<XK5ia5~C5ț̸vg'|>t;i7c u_7y(.Ts'NbAUx7:195 k62@&ky7 #@%^OϗZ]V0ŽO03jOzwmQzZgȴ‹Կr+?Eclx`孴`zjQZ%hxSģXcV |.O|M4R(1RԀQEQEG=v%uܚP>xit4v_wNo@h_ۺwQ}]C;HX((((((((((C5ohXivR6o">#Q,9 khuSv4xrk_脭sy :<`,RU;y➓1/޵q o/$e2l?>P|cTog4f|-.-oV,LL$cF :^[ &[3n,[s1[ta@m#<X~'- te $jnPGx/.ۻ j6ZƉ:V|XF;2qWSMRѴOǩZhO[\y`p35z@xG|akZ;o%ؤ߷o$3x~&¾v|xx0x/c7rr3[ to|I |-}O}Ĭb߸%ϊ C|Ҿ,h2hi[PD230uli]vM &ִkKRm:{'"F l |aFWE@^]jB}w  12* ߴ1Ǟg[Se֓IPjq-ʦ #)FyEy߂|]qi ӵ_ xQFz)f`Jxyav{eEWNuYY4ѣEFH_j9u)::)=p|=WWO[Ym+{[[W ܡmIhps_axGEsNNMV.E0ǖuw5 C<q C<q=#@_?Vꦑ {/t^j:OGeP?4a5D%n>n\j?j/zD>'n٦Ekyb$[rr9^3ei-kp]BwW~(_|(~xJӭ 5Wq{ S-մ02"%FN l`ik{.RMգelqȀFcSjƶz%(+kai8;3aIFO<]Oi#q3 e}lL ryl9?J?{Oi'} Ԗkt.@K\ǑԐ½KxNdk+8K RJ7\MB_{]:Uw$f=CL>jNA$:]ݥƗw 3& FX)#<NڳB/ I'smmiq4QGtc/$hUKFK-G WxK յ?Σc˦[k"kdFڰ(RͿ$.9lr_iGՒk-cLmPΥLeJF*Q@%HW>ѵH2c5,2 GG5Cƾ(WrK{Lg= U IM2HUfWx꥔8d\ xfXKy$K,1H񺺠1\s&9$eƴRw[y+W9uJGF, 2]9ۊO %4q{WkG|>$>4km<41PbFlҺo7EnQ7U6Wj̫ld=5[r+Tu├=KMI~#k _5}OOkMZknf՛k)W PNq^ KþLh!j^4a-a6.>ad\ͳGocIĶVG3 E;98kg/ovӟQU>`.nc+J c]3> xwzhkZwW^RG (!sr溯|.>}ˢ0xcHHr=H>Hq:YWv>>kr=UW|ec%[i 3#vZ?G]岃0"[y+$"*~U/珵6rkaq}shhʻ4?/8#kGƿ~|?˽Gs{I C[,lD$mM BˌRR#<;O|7@6XIHV76cyPI=*ѾYiz-^})u 3" OsJT> u=2,‘ƱuQSΈ4|I 7Ro> - 0[,2U$Ma# t{V Bayqqux Y$hcu@[Jh 6wN6h}bL>lbER7מy{mOFxgڕך*Y gEYPneSIoo~/z?~ׯxhVֺsku" \g0`YA`r Qp~qѵ ~kxw:WP=4@IJ1*\\AI>7ݖ Otd gj5,?qaiE%Q@Q@Q@Q@Q@Q@Q@Q@Q@d^K@|wP4[ZU#KYa3r8YҊO?-T:Eοu-B;(m%Uhնf:=kk?Gix{to[e?r[yr(3u֔pA\XꋥxCR3}YIBBJa d1|a[[jkj[i {ɞ[pHX_(`(T0x#zW g⶙kϨMwuiyRCN2w>Ǎ xC|]Oǽ;Q7;c{=ʹw̾d2!ԓʐA/; -]9{4ۙ$I41jN=#RaX_G$˷,0x>O| xUt Z9dV"c$n#wz^ь``1KXW8ޕA_xK'Ux./cICgaU-cҢ/ B.](h5$Ψh#EPj?OPj?G'*T?e\AbG(?yϭE}p4v\RT j/CFM;OSmTzoK6qqim8H yx5|Q,Ls7)8ElBl `A\) L$7_'4ło"F-$;Sq\oŬxOmڬlr*=*h,/7IVPsʉT >;{eNAZd~>(_LiY~4z.q5s?S?]@ )o1/·>'5[x༎aa z20y<r+ɾ~V*M2O{o;}b/*# y ߧw? :=櫧xIIrw)QEt$=h ?|= >uk85r fc`y2KgjX%f ]F9Ÿ3·rE#Nš.vWZE,85jW? [⯂;,ܐM@8 <)w.i5+b0ۉr's8w'>TT1V[Ӆ]}7i mҳ⏃"IohcUi؝J;J 6n`U^S(3:s}ip8N+>(x-WUӯ}=UC%lGÆ ӡw76m:, ̴H? ?-??«a=OHG\嵏heᮧx~I)aD7g1\>?>#Z~ز]2OݤŊ0n29;߂ ^A,-mγ%›=>DOa$0;X.TA[5;6vҭ|8:[FP[ˈ2G@\u}EE%`5F5F U4E[>,??K+从hcc$d+8p ~!#P?/EO BKHV+a*Aһ9}Gxz4um_¾O-[[@D7 ns!q|yPnoi4MRٵqhS z?ƀׄ{ ]m] bÞ%Ro?,@pZO :!{5b57'Ə7'ƀ3(zwfO?:>1/&/ KJI(b2xڽs¶isq{ٮ.H gfps߅-UC ?hX隠w_hGj$\pF}]ǀ{)|t[UDž Ե]U^q<6"k`!]H{x}dž5oB5euA;Y's`k4cZϏ<ďs|=NŚr]y/iRԍS. '|4WƿfG[m3j0 9qk  ?¸_ 4:Ikgy26eee#ov4bO|5_9o*e>ȏK?_Fd/0k!&2߅$oLp{G+͇91a%`_ 9Ogx',n|!~z+7j-Xs,ͺ #\ ~hvIl,Yõ[Ԫ&4^p.Fq};ԔQEQEQEQEQEQEQEQEQEQEQEQEQEQER@8 q.f5e!1i@e zw'URjtKw6"KpAk㏀| ت_ Zkţ;0@2K\}k}K7maӬo3PN$RI ? &ݏ|];uVGNk4.ʋԅjpjuoq0Jz~vk h4si_L5M;$ZA9‚@-9bx ZZ|Yh6Koؒ<m.!/⮃E5iin$*wm {־(qmKe|Rԙl-ca HK+8vKgdzMs]8"oe]s] f#.KI<79< -Îy<+ώ^kZ-_zUp[IcdghR[g#Z|#.49<3o.nC9$u{sx_|/xYzlURcN&/Ԭ}N$lF2?0s_ uwV/:&o;.Yfn0- ׿ѭi4f$1c3gqlΠ?? #?e\AqiPHR0'8nq+3z5 %  HJsqWL௃?|-B?7>,Z]h)LIa#wLT ?\_3S+9W>wLT ?\_3S+9W>wLT ?\_3S+9W>wLT υ"@Yi,|:%ޑ.[ ;F{"'J`\|?s?v>Ko? |5{~}R9u) gD): q:wЦz㏆~(o 3O#Y͋G ~7J$+ ߊ=F6??¾?Mď־o KT+>k!5XWČsrk'EY:՗ëOk,' L@2O;@-9gR7|83-4صL6躆iƹzwg"L(d3E4I 6=jiima{WGwu["}! #Jb.[Fh}|3*5UtoxIMm-Lm&ڌᶀl|-xIסY[=^H5\Ee-WATwEpS$TٝmQuk8MtPʏ͙ ">eUa%QAaEPEPEPEPEPEPEPEPEPEPEPEPEPE~-Yh7A_G kEBZdr)ܮQɴ; ${;y/"IdKyq$;ohwe:-qe s=k]~eFqǭl*2G#A:t1eLz6c!>%#:m'6]00d+DONG#ϵY[S zǏo爴 isjZŃ%ӈLrĎ=nt)g 4jK'I#<>MK{Kx`L8MJ$FG_)C8>怰S䑃c}jC<qEcˮx˨i tJJpdϯ5*'+ 8'RC (Dj d:s% j"s57etǞlAa:ͧد6?Ít˓|y}+|7M3\xH'PFr9R"F7Q_I1gεjێHg?P;mdd #U">?h{!*"Dz$Ϩ5̵: ݨ=7 \#=ߥhspF?>{?JjQ:r5Lc/+xmZܣ. =ztg4f k٬f=pgG=+*ON}xz8B\#r1P*uFOԭotم6kiHc T!/5{&iKhY_FYv8xAi~ ZuZ/:΍ ؇̩ JQ sO4b,o j75k}ՏTngq\<U4'%f;YN:FzҸ5c ZtﺯxK%_iWڍdYr APq:S[75k} &@'#)2+P2O\v+?cxoVN0FB3O>+>OiPk4ɪDCd(HWUH X  Zu^>^8.M ךT;ƅYT3Z%P粧<[G( =%FƾRq:Ik_5j^^3YZ^񥬑<)RmU NzW~9~JI;KS0FOBQ}Ҁ>\,?5ᅽ$+[h$ pA[Hr8|+~'x'ú CM/5_xP m 4/^Ě: t;y-tl)0dU#$rzYZ΋ax^{ 幵%b`ۆI#84cC㏋Xz5/+F]Ùl@PCHʒH=Pq]?5 GY.V/ ʽiV dqQ= 1bpvV!HHf\`ܒz>xk$|A:κ@()|ۛVgΰ7|2܍Fr9Z7ˏ, skt[]Ѿ&.oծ2VZ[ ErAڣ9ϡ}m;:#[Ԣ'tR3 |5֧sg 昳{WdS*;{RZ;K>.Ծ#ݕexe""MN80׎MG^;7/jUZg" [vRˆNNsrkkaYrX^>s?ڤBfX|;뿳7ZΥ NQq5]K"Bݕv3懨c+oӬxRmdz(62$u\TedL^h_a754/Qżvqe#sn VOKucpff Pv=kR>=6]kIlMu>iQzq5,Ϊ6,3=-C<qUSԿ"#A6_?_2~zFb𮝩IYX廐pnשuExǿ6iZۘ$XL"0s^WZ\_6<”Qqwozž|{qk&`.mHC#)V4^64~pc"9;!n'dXԡ[Y$07sq>׿g>'u? ]CZb9Ğֽ_j3^Y=dv-mB 0/{ N]'{k+>4DEzKW ѵ:\-RW`PTzoIӵKOk*-gј$f8lg |OXb I"ArO7g,X#NOYoN7ڗuiZڶB@&@IQ煾/K=Ll.H,AX^ ><[lY!kqwvFrf?/ʸ8M Bl7:6Z_ZW]#r ~POwMο~952ߘ${9#%H c<+껯RhӿR8_0.b +DxvVӼ)emo-o.,C{ |0t|ɼAoGyHOI*#,!XX|G^mgiеZGqE (5g,v3={a[}NP^\wU6B95wT>ZJe7mb09`sߩVg͚~'k|btM^:^]ZFcQuyV2[n⧧5W/ jLjgլN5͜r!;)9z^-+QӪA..ۜF0*_+S||7C=+ȮM |gm5Lٽrye 6rsz!S>.|5y76U}Qy jGW ռ}KдN-Ε{|m[B@C 'o+~? ־kv^ԂM?0O9!\m z>ڢEh_ |7h:և-Q-x'KCtYANioxF_wzN/lMe9eMsOLx kc]*m"R4HWUۆ94ěZAgۑ+oY}b]t@uXv*ܔ]1u-[^Ҵ(L6<϶A'geDc zzfș>Ey> χ|9 [LkK69!T=|]P@x.4=3`]2J܋rٷR2 mOU/>!w<=7Ҽ#g-SK K6 ŏ4'W_ k77OOwдOc\Y66qG."xw5\i,u{(#l@iR nım*y9(w>kwc<τ&*Oн9D!$픍9Q_.Y~<{'^X4{̅5']\`;c^jH+gzAkLYv7 =p 3诋~ |Odm>o#ɴXc[Y* noq3Z^ 'h .qṴ}_W7_*;gY\vl`'IH׊nj|i~0Cl[\͹QjdksxlgEfgqW߇%S\sL]OGǞ*Vv4GD-,Myl2)1\2r n# WGSܶmx7\dyhLN ~^N3K!xbzEOo5xH I=nƏ_o|c/u=<,6Hf4iٙNצ2wϩ':/ksÖ]G^]!i0"ŸǴ ,~mKնI]Xϣ^Mtd,H-ʟ3uyv VQ_ ^~5 x3[fṵf}o8®?{OwVЬN-neF+9!D#%prKV}oEs? #H&.0=M1p  uP]~eiڵݵ^j7zk T::R'4]C .u5Ԉfcc=5Ը}n+Is{ _h n/6LSlbT/^IZ<%xWZ֬,W KċsJ2c &#(ZIgo %w77vW(N^YO~95x]|7&FXT?Ccx"Z=isT76zrM D0 rŀ5t ߉|YV(%MUT˓1^~~CI3KԮ;% G.M6gxtWK<ɡX JRI>_Gh*k kiڍ6qyE PM]'h'T:GSY</}6rv؝7sO[=gOGU bc`kǟ4F* 7v3y7Lro]h&RSZ^m++G{O:sx/n5b %|H~~Vi+$ҴtЍޕ&\IR0Avk@umU W՛mdhb+< EGGpSĞ=\HafPBN~e\` Z}Lo{w_hrj(leT%677>9t8Ǧ3AM$xǟW|s{,Ɠuͧ9V9$mێ#Qa^&[RT>%:mRIPb2mTPpԎ=;8'ҕ6yg_ zM totRm`_jidD3l пtZJɡYz#"9P`@$zTI&xm=}̱MqZo \d, n(U~)>\).쵫_NyA@W$Ԕt<wN9>qh.'V LAdMS_o17Eu~oEI'G!3C 7 +tGI+<.PtmKZ^'n/їHѭbQdJ36_k8#|WW^=kwmu+ˈ5Ynt6/"X6x8vt'?j3`v-\/ ~^𖩢OK7C˥WO8*#1XՊf8sַiKBߍmLCQ@E>e)PQ@E>e)PQ@E>e)PQ@E>ePHPIr J̼lq% \dK-.5Vα 098@ ⻏گzj>(u6M̷hr`ː\qG]B7Dž~$xM }!e* n H8q]׍~>; n+tom4_C\yp4E+ 1YXN۳t%>Wᇗ4]ORw/5/ 곏 ^kķb(4*YU0+g2en|Gj_V匈4Dkgc('T^-<1yž/燴v"AV*Qc;")†cg2Z8!xE/ھѹg81@x澝ixWV:2[;RUC1㓞+(* P)ojzPoi H=pOU=8O1ɫ@EpOU++myuʑӢ9{'L?~(x@Ծ-k:xC|5:<a&?,"BO7g'WMυbFt쏲.[rN1۱!k+'1}sE+{YZكRo5/U]oNIkyLʶ=aX>*:5fz\o!1A+g>?ZNd:?r~eԝt:t?zQS_xѦ'kkTb;cyoOď x?:Nc{]Ĭ-H3ŝ@ q׬|M5m Zu]wV𾻤 cy]:!_]4\uxE|?k+])dVVVۍ6` Zh #1ȑG dJf$ڡ99uߌj[GYEK<6fl0RREBI#]쉤JN}zey}~5WeIn+!ӚJ'Gyq$-){vf߳'93G/㏈0x-OWzQ ^B+yX`潧|Ut|?qKS !{DF6в+04_ws{ÐOcew[6 }>My_hW~%.oU6\B(cW4=USoCMknk'%:cI1nf q~>&k=cOo-hkۼs$?*-#+<$ź׉5m+\5}M/,AefT&=sQ^[ۍnu7qLM,aky''ydK:Lš'ƥRir${D93JNݨxÿu/ F(m5!u{Үn|w_6 Hn8 ,9+{Wk't/?4m=̗ڃ*5񲅄Ǐry9G/쫢ɭiyĥ n>퀋n=iMZ;þ.ѣ!I {,rW$}+t-\xOú5>q# n&dGԆ4((((((((((((((((((FHzqָ/~)׼EZ%m;yyi8<Sqʀ_Jt#mڣQ/k[sDr"R/ќ]5 xoz7O|D|=$>bP *qBd#ѸR@'W w,^tOK$&@Z=w1աڧDֱycm^& *RW*,y6i!9As2pN ~dcN?Lך|6/|KsX-~;i4n$h*puɯ ~^1ҼAGkxvLJ F%71z{ϭw(yH˿ hxVOV  IbP rNy&gu Yy<0Z mٱg<SqnHn4dr+:#{xKd1[KdJhN~amWF/Pk+&wcE ~ηp"+ 3aګ;Ogq Cd<%xFӉ[&C+qR;LJjt[Bu{m Td!=hVd#ݸ:?8ic4Sxf.u\3-aM8>-mCA\kQk"hx<*hz9t"BvҤj= st -kMQ.&1ڀH\HU du{e3Bn8 ?cL? ɢ]k]\E#I2!~F`oY^jwI Z$쪈g}]*s%  'ǟ2s y{m6B^*o~? :|IϨqvezg'4ɺ=r)3 21x$3O~w/j1rZm3 mP>$S­ŧOwRMirG$my ;>y?Cސ0H<׃~(񎇯hFxwK.K]Ix E*WnTïz|Om>xaHxй"j $ ԧ>-I8?ލڸ_ _]6Z5$`HQd}3^0ywڗgaiS[#yYbg܏L@A9ry┒?k [_ 4c]ԯNaIn\|򝱩Yh]-Z Iբg"5LPǰ[}5|HwX_xGei^My}h kE)&8y`Bq֛[x1Ʃy$n4" s#``qׯ.r=TpM+i`Z%&]/xPiGՌk䅣aH988/m]/Y:hQw9lmX#x,Y Q3s_Js9qvTx#S㯶j CP-< Cu[ x7y,Zyn@?y8. ?,j>/,/wM\\Yaؒ}u$i*2HC++ d}})R5vQ>JӿdxP&kmF-"do:+*w g nskEHe;DSsJN1Ќc>?(<翽 Bs忇 :u0 7קs-дT_ 4/?!ZrZa|pV>>]WCt.<;&xfIe̚䬬B(:38=G-jMWx@x{Zľ{N3ov>`拮]ߌo,kvҝ&HXس\kV=zضjѡP1:"0 K݂\#Q`c|ּ{{UVo>K+_1a0F+Cg=R= )rsZJER((((((((((((((((F<{6~>%ŞYqyow$,jNvg90;40}I<'evVT[* C@:Mglihc5<ڦt\Et6‚#o=+3o^iiy} R6M]EZVr?) ѾRռ!27PxSפTozm~dUR19yF P~е+[_MhS|Pذvn[dYIs~^޻i^yOyRjW3o~~ tZoI>jqxHp<`\pYW*W'xF}km þ_pjK|+n-3?Q˩h뿇Z,S _P} ӤP`XVWK?[34+NiA+X=Ν4Աݐ+|NP8x~T_|Yi66!V5_2E"Ys ̟1 B ܀9G>*Եj 1o|Mo:Mo$,ֶMV#`±PH8ǥ}3@W#',&-2coU ڑ.mKȰgI-T d0s4GBR-4٥{I"A->_z|{x|]kˍnK]trHPFT[Zi/f_ O5\YhZz{\DD 2m;bns֭?x |1=Yn!{HCU%v0mݾkw' |1K>&}rGl4#Vzy/*Ӿ!|0>.}ƽ6mƶ[ȣwl#sZZtim}^M8S$$2#KvW^94"St7OK.T C>_7/;XOڟ:hroy\' ILA;W':G_>񮻦趺_ i:EwF \)! ddS x_M|S\Q^듺2#\#@>\'ſ RS¹IV;{ymJ;k]JOI mPX-[Sq$(FGֽQEQF (AEP0(Š(0)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEp3:t>yǟk> jVLrLp߶o)g.,4bj6rK FvHXds Xx?jce5,L7BnSyFGҼrwl<7=Q44xҼBdl)Ǔq͘j MᡩäKѬɠaǦ.B'vrNTZwsH9$rNzWg/x|huKD/Ҳo /QNHrz_Fa]ƍmjcqKey?Ł߂iZ =63E8錜q}:~Ckš=ĩaAwkkpG$H8@%UI5is7^77&Ѵ̆(f L*YxWGl>qڼ w3ĒȁrdFU;JK( _UӚCǧ8A `:縤.M^&p/h|K;F~ NK0ޜxOKWIR^\lV;G_JhY<%iŽ ihfj^Hjʥw dVߴƥi^_z՝@`[9vHB+)z^`}88' <~]88g?|QJ4k54YH@h$L/Hxi[~X<Ԟb;{~|j~xWfKkh {@2s^}KVetwx$0oWʼ=mO29P"WgՀC0$gף#=5~)}CSY]ٹKϛGojW[c H5}-ᱹ2HQ$V` @8*ԥFGu*S{gH;<=fkQ\kzp.Mb}I W|U D״Il5]VХ,c; 1L [oO T~=5 ڟ21t澣=/s׸|g'-kdhi:-b{ oMKbI@RAq\>O KMJWK.g.O=ڭ|mWBѺ@wdsvOj׼9xu6W,khv##=]Ɨ*_>&ɤ^Z7V\[Y\'dp sJyF ~|3#5=>PnU{ƁP?/m:N_Oi}&CRo'_FP1s`Σ Mޛ_j,Οk60DvdxۦFk<t#KדOgYh4Xu]S[5&{<rQ0V5>|@q!MO'х̒E\6efm^99?*_QV)>g߉MNkEi9Pojls uFƈXEE]|COKfڳz "?c\AoqRYpN0GHg9OmIyġn"$+0f°'ڪj?SW. rWϕPpxu2E!I+Hs(&9?|q2[B..ks 1yO;Hzz{izP>)~Ө\%0LFǹgO/i&_DJ@ڬbrpy>FmОp30JO'tx S}>_i_5?Y.Bb$2;N+|2ᦵw+Ph:D,IVŐ#z޾Q}M yVU%APkc?vƻZkf`8OzO-CĈcu|Ftv~m+q~jG̻r1.O=>C?f_hO˨t[:xnn)Ft !B%:~Ϟ мsA65`EG16}B%2w6>j7(y[@Y KExu ֕v*aEcŏ }<ͽl?`tE'LcO.|w/>uzr#Yv3#41Bbdۀ1wnjESw)iQE QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW ⭷Oke&wqwccm7R=y'һ俴+Li6jŵqr^I1N= ĭ'~C]ޙx'Xy>w\G'yfSZ?_x_7-懭E5ψ)y&FfW A-=N>ꚴmmf嬢U]p4[>AI8_&xJIt۫J-YU ly o|A o]GOj#\.\鴧=zqҹ_|wxoN|i%ܒ|P;-ggc{wĶz4j$.s@L ^c~Gu 7L/unF $Vbą';`wm~(x6Jׅ)m7:-ĀO,aIl9:>xzMЮᖑ\4o_5#A|ys ռSZj, Y$( J?h u{>85+_[23I.Pp9!U5J|'M񝷄_ii{OSZWHn<m+X~>" wM`=WcL@qFxIV+vGl̒yr XO0\Gý_L5CB/oH@ <ʓFUg5x?4wf3nhm9eŭ՞l!wL2jn[G։q`tكwd)e$2@ ; [h)<uPL_i֤Yle|~wMewxV=h*Æw7#>Ӟm:P585 YkD$H7c# 5oZL|Wg{}s`\? |~-ݐku={R^h#z֐*." 7+Nr͒yϓ8o4V<`Y.FM hIJ Xe]IgJ^gxˍWE״JmZ!W34ȌR5+bBşTh6z%x(\{C U7GUi4kUM=b6Nf9>x/ ~mׁ!Pd8;r3E},A9cR)$.FaFhQ@Š(((((((((((((((((`QbHzvh)p1ɤ(5xMmDV+˫%V(d}0ÞN>SqM* U[)7O_zQQ;Wlu:mKP8T&6A Һ]oNx FY&_2)i G|(R8:0QW3? /6_^#~ѭ=YO:DǑ3[OiWèjŵD=VvWR2!> A<gҁe wUM]3zK;meBAb!|Le;-NTxl,<3Q@B. ~yfuW|>0Xʷ^3k u I$3$^ `Õyf[;k[po-.|wNt9C8yxtgqR3Ӛuax3w3qqW 6e AʧىIRT g)B`tk;OּM GM`jw#eB}Ia<Ո8u;O谹ϭ^ ~5C+iq;o[_xWk͆.$HL`e #d_-Nsȥ iOc.uw@tRHͤ7E&(q9jpE5:6{Erwb.otYCev AGjOҗSڳfmg井vR%N7I zgϥ-j6,N 뷎8<#FT6Wj[̗ Cp}qjCkMR/cco%:U-zd}?k^N}rJՙڹ)XmE9Ì8 kح[Ms6ʈͮJ7 #l:P?U->6cmCDvB\1\xIrvp]Sr&s1#򥬩Sv-%լR-VLA9ǽ6?i\_EKg<ەSd͜ԑځkdRM;Sխ7q^Cd2Rs283ޭg'stǥ.?_Eqĺzsjsgms\s\i/ GygQy#YywHE[vgAݎx@+'4߈~|Iiڔ ,FAC=pA ( ( ( ( ( ( ( ( ( Bxf>so{'`wGpOYӼ974)oq;{X{[IPf̍rTK*pGS B88|}kP<7vqiv^3%O1"G.l5~^t:>J>qAa-&I4˄eoȯn zoL|9|?>[mV3f7=_adG~ ;}Ὲ&4gRm6(@ieb=>rZg~*|0GcG3BMo#I4(ԧk)t)8`kOr1JܞFy|珉MS_Mhᄶn2M;g|˵Hޜe{h󟘩ڣ_(HvVpn(]U$Wپ4zJ&m4{{)QĊ$j#!*=눻%Է7 <uw+yJ3=\릴u>koiQjr*/ luo 7_ [W~-M%Mj_Z}ycN.])ۜc-^xVѵ 鐛y!p+={Z2Zl]c JRoP[j|} xSݍ[?m=mrZ:vҕk8d F Xثgi<7?*-3Iu'}#. 3K>g_5Km샓_kw@iiVigGoBƽMحxL\/6xS<Fc˚(eE Ы뽂s]xEV:nk]:Y#k_' ȲxG9=4r{ 5?Y[X%63PȠysKpn}ƙkK+RuO""e;KH88q4(HqױfZǃ_m_'oEŬ-w^]⽇׬!it"$3fqȬOC]'_ ffmisltiQ#EZ =zWQԏ^t_:ڞ]͜9[4m;Wh(>/ |+wtd(.d[ŬnC CeC/  c9lyw+45'm>/-h=6`p~J𦻷tOZ_Oj&76k57,{bJ'ގ4~nZo.͓2N-a7AQַEmC]זx.y~Ռf䵡\E<`U# _OFxac? :èvGG5؉gpT|㖮ceYŧ$>(Y㷋EXn"-3"uHP2+_y>'|Aǯևa|0~ۨGnikUb|vK $98>/.ÿ쟴!ci+m˖܏3{{iG,>-EB20t'b̀`{]G9 s$ێyJ赭:]SGm>K^eJ\AenuE<%~k7ῃ iz~ 9,Yn''ty~TQFuwE֍@nZ7{QhQFu?Oʀ )9>n3}hh((+0ГY6t5Ka21i,j8 =_:Bi>h7s'<͌nW E{ׄi6EJwh%cV֫Z'3>1krGw(Oφ>"7ωCê\5YcBnA,x!=NJar` z=a[0s)@֤)+K6Za?[܃pڬri5B/~o~7h:T q[ϸj_hÿtOڏ|,V+_"6u'L^=Bދm[ZiVݣs|0\ /<[YOO__-~&|'WSшR|Cyk2&)2pS\^ᄩ/~"k%fwKkhjB+RX$ j}Xp#dc2_Gڼ F7>kˍ|?5xFld>obeQ90 f#H[Ǘ:'uj}+WPK6pP1p:c >b-<>)TR9;pkjڎk^(P<9m/W{>OܺJsW}'Z]ෆu;cX5]oO/'/^儯TF~ ;Pj?OPj?"4/{ӯO˭Tҿe\AiږoQP"#nC̓ ,2zX&g\csNA8;91.z x^&v:ⷺ#X\,'$cc^0~#|6[:quiyê]!aHIsjHeS g<~ I&wWoӬwn1XX2k >kwuSZڐe+]>itlWlrr84Dο>jvoG W^7zv$-->$cp:NAjzI (#4+n;H=Hfvx#O7hu 4e8\WŭkX¿ڧh2pLyppqr9u^iWe+crke$V!.p-nxy}/VFǷ0|Zۜ?Ęz4ߋ3k /|s7!|8e U̍vmfR̻~^2"d}|Kg qs6pzn#"vO63e q,zlniK%D<1U8b01ClZ 9h_;6qqZQ}z-G=𞍦H6З6iB|bgiOՒPꉴ;.X\AhioGýZ}7}o=JhI$D(ēOx KŬ2\%W0B*i}NlfKZ&:NdM,[s}5cx ÷nc44/suqu2$I5 +I<- Jm5o-xK$)uk mZ֖#^:>FgJ-đHC>#an6,x@0UV͌s[2Hɹtǫ֕|iҼ㇏m9x|h6"G梻*B;`5 _hM;oY{RԬ 3.N˷8i]=ᖱMT_0.|Ndd֛Ie7:|ft6. G5rUlxKceJڬ gVwgc)PEs.`|sw!6qWݒ19׀ux>#|FOz΃j mJE-f )}|c翸g Ub0I}|L{vt` > ׭}~u⹼쑬6G٨F@,W!~P s]p>l/8 !_zDV->$mE% YcsrIMXS©ކn id*J70<2Ӓ)3_3} ~CJquJ#8RIaz{=ZZ j o;AT*vrky].+į^\;sл ?"5{Vi~ #(]B_*mFԻ ,jd9oLjn4_YO=ǘ!`4/+-©-9N[K$z;S=ZxW].<{w 0Tv+S5_ t'}`\hz^ȕYv8* /ZRgqyk0R&H qnDܚ~cKk=nNKxLCOW7-8#,ĞR@3[? Sw{)7d#bp[D`>7GW? *_.|< 3 *_.Ct 223 *_.Ct 223 *_.Ct 223 ѿO T5I~^:w/2Z4 ][¶pkf̳^Od$|THz:}V9=3%5{u,'52~!rkz5υ"chfǩ\3̄ Fr98]_Z8?@ Q@Q@Q@FTZm J$wP/p0jNG>6?5v.(s8ҁ= o'Mfb&RpJ:xkJҭ4;],Fb1[v 3zaԵ]FLۄ13oivjVj ^VKhԜq2&ȥ|53'mH #d(&:U3ůˮG&4^L d cv8gS&s}{gg5݌k%ݺ\);ZET@z冹bmݶf츶dpH<1Ku{ uivwZ\K ý6FWrG􏆾-`-{ Crz|0FAn~4i5Y †$;ct d9}N=1@WLI 3s42iD9KU1qJ]'G+4h}2yqk#xePwaݜkfvnޡilеĢtO*!?svo 4ՇFrƢpyx&Ae'o|o~ =.]}snnsOu[vt+c̀:' `{ :gMO4M&."a> tŶw 5T( N<7ݗ׊{hn.#Iv7@'}}PvY" IkgN7eMɻXaQq8Q)w}@jwvZujZ$@T+6H,zb{-dcb |"GD-gx$ z-8$X}Ie>߱M6 (b+ h[=# $d&V&} bKA$;ءIe c;s+ 2qސkvè!U! Q\bFApxq]#|gVdOMcXwmdcH8q|jr<\XkZcU9e' 9sުh Y5y՜`d g 3eK|Glvxǯh˲9F>_,g׵sǞ)_ אq`q^g?aC(?hcxɹHqT dS3׭{}O:A۹I)16u|t}.Kqv,-ԫo|bvd$t֖8~Ὴmu+\چ_f3@9Z_~\MьzWSf83J4"@6pH g$zj_dkȼtQ46tyc\Vƙuk: `*ԫ_ ,^qL3:9M/+dS$q M'nSY{5ޣuBѦWhY4Yl%zr+Ͳl3 GEQ 2i]XҬ[! ESmoCytX[A&mmp[h :.` GEQ 2]Pl(q҄,]r- ݌9_XG?`xc]⫫ʲH?أ*} b, ˣt_U<1C.UeYϤQe>߱@, ˣt_U!uSiub*} bA~rg/8N }g?E_9Ӯ:wu$oYj8f,A|c[Uv}((((6x=M~r7~w7_|[S:Vuf<6W=p?Fֹ?1Ok[xe٬Ĭ|wyHX9` >V Qr56iHDP8yGsY6-k狵1sm-dz^+0[H$o]) ]MN C> )n&v[H¦Gl(u'''>mKk̶í.fT* 8q&dPcW'[O=3^۫ \C&; ,4ȠpAdx~YyhsXj:OK% #no{W[xWUVA\ihHՕ`N0{=7Vo4K4E ܬ QlO.>b>|f{gh4{ <6跱MnEO4HA;zq\|V;|GҵAqmw=#J96Bu[v-7AA v_O*|iwڝ;yL[Y&1nwf9 +z5?^>t7Cݷmt_WG5ymeKFzz{=xZ )Chţ1JF dg Q׿e%LA%lzTs hlq$t.I@ B ++v$likdbr?Ŝs2b>.|U4_PѴMF5MM3s#( 0>E=:kM%-eH]2(\T6 0ev q,m5KrրB9TȠU\ZGwEsPDsQI?e>!=G[O_*;+,\.Ģl|?u|N޻}>Jmd$v{{1R)ϊ>#M]FPx7IݠM>\J߼vEG>ٷucXMCw^O wE@ e$ !d[߲?:xty} [ݛ{ۋtSbr0b]mb| ++TA%{c.$ݫ%OSxgk^jVBF$5à H|wyfaa3g^9ZƱ[ ReH'y^a xKWΥ73 *im6\IXx⏄|a O/O͓ S˿=_\%V:Ωwo8h%A d'W'FnU _xjTҭV!(぀# ׿kg#Z~$:ް|cjcjo]67 <1_M럳׀GeZfXf&t9*d$*)`~ȟ l`䰣jdԮqwyk0I1^  if|F%tFk  𪀲(a=k֫w 4i X5ӽK'i[䑙2IҺoQ =x|to1Y"X/f6[[;9}N1C-AҾlxOtxcU:&wպ9qKDp1Xo Sm;K6!8/L,Bmx.pp 4 >&cA֞ɢه[adGU\6*,w I WHy >ac6DQm2rI5j7lJZ Bo|-VHZde g,xW5x7XKMW$:$Wv<$%>f;Irjƨ{~>!^!oakYl€ PUZ3̤}w;P1\O6 m)!f ^5|:Ԗ1\ë̗MQ'24*7&Sx3xt WחNc %^)Mox5NM:+f@4hnT?;'pG/}oS,ͽ8v$6 !xa@t:/٧'^/b]N8Ee[ۖQo ϼu朝ǩ[ރi4|DXIK0"Y(m ۜ^9%b<4fO_eh^(#-p2G\7k)4fk{}p$S y2~?٪ >xLڞėj:/'O>qap;<Ԍů ,|Suw%5k-]^iHc²q:GO?n %᳎[u7$::+82}BlyikGV$ 2#;̻[Ra5'?g_1D#55$v!6F zcZ},|{Ŷ/ck +].͎)QY`X_qď|[ -sOF;$:fZhCj OM@IB|Qj| YxGm7ۄ7e+ )->ޜ4爾6xZΛKWқ+X4SIy-|@*q>8YϏ>(kψpVQx<;llaԹϜnzޭ&|0y.4K%=Z8ay<ƞ8PɼܠOWxh|Q*LC x-fo-H MJWGg 2KA"/ciZak.nt"cKY6lWbgT j{ݼS$g(L+?t֞4;|C6uד]-o4ȑW'*rrNI <5CHDS>u|=smxi'SxR)PہA_I.5mLdKn#[@I6@^ ( ?햙xriiu/, ܡKԜzc}> W=}GǑ3TխҭͭմE'o:f^,ᮑ?꺭WE-0*9 N7x*066zjZsS-]vJHpMz>Y{H",l${](4QE (QE EJ?Q@Q@RP gy9Wǿm=Oi.<9{KUi 6_|*~ xoǨ^u]7z]jefi2[WE 8" \t ?<_ Qíx׋L2k%۲[_cG-X€6C-/k4;kQ]iy ";d.~^xQg=1N>9L񥎡qsBZEՄK#JN0EflmODz<_tj>DIl6(UUaԞ( r9#9<}z?c6wn{ح|/4RKy4fP2+ Z{N9-k>-̣[x$S.i`R>sj%%Xr px5~KᮁZx^MƯ^Ms#FѶ?Hm í%VR_?֝G#GM%za>&zZjѥsR8eXKdq^EX~_Jt[;i ƧC,zdL 3N| mQXn r*JO~)%z@/?/H?)ݏ>'4 [^$յ 6-Ry Pc$n '|%imO[ncɝb2U_ JgC> K K* c<c59.Dk沂 |#\5_ ]9}rm2;{!$f9X 1=B$'*^!9*^9dKB΋'_Ӽ'iv=1Eɾu-ۛb5\9Oɭis'qL_i/([;m'+0>3/GRxűx:Lj.{}2u`X0ǜq׭|'ǯ{xG;}A{96;!O4}GtrI?%^ԇV8%ӏ>5~x_O);WN)/#Ȟ+PCi^RMN Mı+6%݀~NF5'uiOxO/msg{VP#mp@I+ ;#9|dR\y~*+Gr=|?|V|/χ>iѼ9mמ,wI-1Os`}[P)^j)j6Kuf VV\jm v[^)e?)s//_,Zf۟oGbRb"y@@t\$:)guw}֑I7B+9Gq2W@\f/uRM#y7ܜp3{w?U⥲SI8/Sr%԰eVRH郀y5VD3_IWr}?%z⯌o^m-/.m[IZ+U)r2dd ;+Ŗ]4~|Z%4;SW-"(6@>c3n&F=N>+/G?}YN=޾*w_|{>iW]?QQ618(NC'SҾVH6zn~h5+`PtR^?^g_2|<~$Zw,,.V,bfgr/ .>rH K:qJ4 Zx x--nZ))")p-qRcnjiy~*|jKK˺Mf鶚(O G2J= +Rw7!H-#mFė: 6b_3̲<*gu-:!I_ aIW=>/, 5]gVvejylu [tH>Pm?Gվ-ԼCk[ twUGA.Q?): )4#r=IQ&ǹi44I=M/ ,~5-o.NuKf (0YC.4l ,G5L<=ܟ|i6=Ec_싡C?5]KZӵkf[d6AުUzmǽgZI|WgoCv.Z+BX"Xs^'>r?!$ӆC->??jVkx'Jn_=ϫڬi($ y+;[x6^}d\"X Fd,7cN+t#C2쎤;Ѫ~:-qjDp#-! 24=>_^őjς4mn n&]2=ANkT.N<)M\LO={ _|:׺g5=`4h65ʫlp6׍GXtKu"It:3wXTc;A}z!DOz9|d *׸+ލr_e|>:ޅ/Gβ#. ㎣~?>WZ5M'ָy.1Lh\ji(K]c?Tš;p}ˡjp|L]4il͸sRevz֯ v5=ORyz dsvi_<1tGK oBzz}(4C-tI#O5 " X|o _I}HʣXzηkksk}N,6F2sY˥FG@1~ހsJ4#zBTF~^rq5~n/zwK# &ǛқZ#`zWj<*?ҶRM{$>3?\~5QVdv9m+_>P_5KBM$Ru+Fc( L OQ%-5; q4[6^DZ&l~l z:DLG}=ޕtH=$GFN;})o(΋,h|u}K^M)I0ٙp@Vf>J]#Rag#k^R@ :[0'a+ښ4ELװg ᷉bֵkigKxWU`F0Nkּc5տMN.?(|6˸=7GU#m?Sq ^TFX{֐^zr~gC%{/JtBV^ N"X%,X:eskXt-s;Zmu'0u"l7ȓqG{x'J?c7|zVvr /|ooĻK/e>ojQ kY-/ZM|WYz֘4tQ6oԲ:WP @Ǘ9ɿ_B4r1st X6~?3V:ia`yp\~ k?kvE~,~YkdxC]> ҏo.NqOAmnp_ goᦻ%״{fA+6b8Ԃ895/5&Lj[m%ztаo6#$emU>l?;?k~6?xZuI}rՄq2wN7޺7>5xCM"k`A'hЏJO4;ߋɺ?~(sgt=B_nt_ٻo VoZ=9ʪeT }ǧKm\厴)_*i`Ly^>V$@V&((()|tuZ}υ>9i^&C˓qܴ+Mos3;b)k?jzַ}|;5 TXnU?>'xıVڟ(`/5Wr,'G=s׿i_/uo0xwS줚U2'!oy9;zSI$C\GE E%)eh@Sq_ߊS.a{mc`3bZn09gygZKICJcBĬsaAsPU㎣N| x:Uk>K٢;#pU[$8|ĽJO~ >Ѵ3yWD/%Td9Nw CW|G3hRiiv&%i 7*8#-\be>$cֿojVH!RNEuZg/i>V |_i2-z(n9f+ǘ\ɕsӥ?_|N>CSɷpfb\W]ƺ3jO.]Z 8fh$prGC2O"kwRw]wE߂SeKc^n.IVHyRD 3^UA霞GcXW_exXQuO 60Mnd"F~]04+DC2}*zrzPojzPohdzWl"^6/!Wl"ic"G'l1;|ޑ\ꚵmam:4ۂ1׏j߶|[>XmV"5Kw[A&¯Gé~)| [NM״beX-tHwam9W5SVn-v!j1q.SqIOo^1ލ4R'q8ȯ'r5E2? *yg+˟kq1 +zW/-+O"(u%ҘUss^= II}.bwGOKFx銹nDW*54_OO\XxzZf> mRGː|mo^#dOP&dXg y^Uv_z@n%Ѵ4닒i0@ڻa+I׼;U%żtRHjezu= [OccSڶX[ltX ռS-ҭo\zyWۋ1 b d[oZ7>//xMZX<=F#p)'vzיxP@K/x|ךZVXˬSCa;ȧxJ+m՝oO<~k:HO=bu[Jdյ O?R\{~EUqO5?MxN4[|?G:Ngm;JU>nG3.ׇQ{c5TyoهşIz.Ϸ_dqfV+jI -չ?Й$^!}+;? jMvbE6-|㐄wCZOۏX_|ՓS5VvHeā*Fk/_U{SAĚ}֧R[nYXv10ԇr=zgK\y5keŞM "b`RU.LCȫDtOxZ}CD-4]!.~jlalctpAa} $=t;rF~r|ˤ~kW(It_uF=< Do_ivtT'IANF(vЛ7i_Ԭ+MnULؤ&ۏy?lŝ_5IK7fl[|ȯcJ?}J09σe=_~ ;˯ZN׮u{VH G\1{[<(l8|[ĚeٴAXJ2nnW1Gb s-O4|w4{Ϧ=&Kijxk/hLo!>O_~[xWֳVut+gH'۶Z>",tgOxkZ1Rм6h|r[KncX[!`ebHvAЁ[G]ooWu|)xnxn!S$x `{bᇉ|3·*ռSq5%Dس8qי:$P!Zc??kC+S4;*X88JoۼE>6y$֣=.zJyf02h'7WһY|GT^֦5 B.)#D"8r21>pi)j6d/1C7Li1~^^Q>/[◇|Q[?ռkZdeÅNg3%f=GĿ}ޅmk? uW:PuKs8w%W]L%ڬ@H2&p8?όX(P7S:VgAK:yHo5ofA-k\1 /!83ڻ#Sִ<8儗~Sh˞6y+O~{ljn]Wڦ}5ƩijPἑ1|lisOxM%Nj|MiW^$})cm $F'1,uā؅Mt;=_Ҽ1}è5k#QI^1c( J}4o\JS.̓XR狅 J8܎ե/؃Bƾʞ*ԵԖ>.qsSl,$կle>62"9]c>~5F&n]xEbJ;8 'qҽz|<%kE~3|6[[9|/ nIڷ<4j^>]KJ>׶Wb8[7=3i\--,zϊ,SZ GYAv܂^}OG0.,' xk:oo,fkZ!td@؉;3`q>Pq|OCoF͹}2yl# lIW 2o xޟn7Uj P{ i*ҀB ;A4d{cJ ^#Go xQn/m6u[[Y+ʠ9 qֻ |IrK-:[#92*) /bZwo䁌}x_~5#eh maզMESa-+1e"Dnۓ?ZI$rv&6l=K&a Œe'4:_~>ivꑴ}%j:yr62@9X N Cxc P`?1> ߯S?6kzg:F_\Gu/Ap.KEXJ+3diZf jj~c6{R:OI_DYv3.݀Ix_i~~]7zO'Ю>Ӥj1yI"ܩAAS=B-s=jf8ME(z91!zԱU_Gk I-ժB:Mfxp Vf4QE ( ( ( ( ( B3KFoҀx/٧@V75%myg"RGA@ȯ#Y׾J<57tGþ'ůj&uFx/tm@\ŸtF5Z̓ynl (Π۞\:9 m>1|x~Pt~neZis*ޮWXo|q;46SMΘa$XVTd!m'Ƨk:}ͅ]\h%\Fa#֠\>];G[qh,1(Aޛv(JWx"-cAѼ;k]I5]M'[Qj`:G<7LO׀jziiXZB[Bc5UUUߥ6* Ch|C+ Ÿ .#Dfva}6mf;iR ͼ!ʀwSxUDjG'? gs:<nhgI|ӴO^ķ1>3t9A9d&.Ol?\fn>ntG\c4VM4~7$\k>῏,otT^}U`L$BsD m~Ra5_Ÿں̶ZWJ}ifB$13d LJ|xH?اgC< V,B>µxtM4GA> ᫇<;'GMz=hd0O ᙇKûƾx[LGb'Mnkl8k#jXI6%=Ju*Ʃ`cJiXI\_MV ۽wW|asxIg,]6[XJdˏkz tDu>)Rt{ym}):]o^ivG =|3Ҽ:$ XT~װn#s0^Ϩ|d.]/|C}ݾxvYcKE<+s^KjG=Q7gGdMMU<)EOoiJk>7YI("YLI,w?exK~i6kzvO$H`c|Qi ` "`?/ʍ)z\~|G|Ku'4ߴO궗W-埈go /yW]'7~(}{xS7C"QFoҍߥ (Q7{~n(ߥQFoҍߥQaIӱ w)4\[ݖs-Gkg+G?&(??Qkg+Cb3c~V?vr1F(??Qkg+CbV?vr+X?9Zkg(G㕡1H +X?9GvgV(gZ$rud7"V(gy:UտV(gy:X<_~ hPuo'y:p3_~ N?6?rqF(lgy:Y<[~l hR;տQcO+Gb3[~l N?V_rqF(;տQcO+Gb3[~l N?6?rqF(;տQcO+Gb3[~l N?6?rqF(;տQcO+Gb3[~l N?6?rqF(;տQcO+Gb3[~l N?6?rqF(;տQcO+Gb3[~l N?6?rqF(;տQcO+Gb3[~l N?6?rqF(;տQcO+Gb3[~l N?6?rqF(;տRZX +X?_iGݟI+Cb3c~V?vr1F(??Qkg+Cb3c~V?vr1F(??QkekCCXcѭMã]q w=s@|7?1ycH+OHg1/tŬ{ϧTbhdOGPncKK"'ƴ2k뵢@qo4wG* 1 2 3 0 8 0 204 866 1 2 2 0 C     C   v^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? t{ J4(4:1a#dQ;(l_S_Q?!N?!F:iB97ڡx#g'“jZ>佺U$l]Hx Оix~뚖;*3 $%P>q+`Z_jn:}8Kw*ĥ@fV\$=3)~)? |\⻟_<džur#^/lm}J uml 펼p0ހ}C?!F|?O/ڦguqiwu5Cʕp`[j|$F?q_["2%ck)gnOzUTyaP=R s0AF{ t4s&܅_V6+ + ڶc[1k0HNPus\/_h c^4I2&U9?08%kxB_-jU-4V$&SP c{**: wD'!Nh?H9V[imi=j85;yGOMc>?Sx3xGN'M\^éf\ccldX>'j@[Xxi`w g{\.pr^6>-C_Үm I&DcFJ7Qv_J yP:. _-˵} ږܟk?*6bG-泩#*[vϚ?kYug*?xr ,qzt;f'z;=gR,aYI {i,-s_Pc\*ҴRr j(X3 AJZovwtޭY S x6㖹dHa@};vW'GsFIkl8[u6z܅ޕm[H =Rrp=MDorhL^pٖ5!<1xYk8IN2}s?R#"zfY&ޚ1_>{JKtQޯG|do/hd2 clX\":gk ^*D&BH=k>ue ssJZ qsȷp Y&R=k"IZZB'ޭ- `T-ǚ%DΧ/j&Ӟ;ݍyCu)IaD֪Uf.ॷ-9%Ib䙪#u+8\MJ(@1:8Q*KmC;- |tj+jp3gRTpuخD5cKM 3 %MyhbL'3Sc[NJj$pmlzETt7z0TnT9P{-t69KH ,։&`O`C_j?$ff !{ץi^)lJ*sj[ 2MdZΊ@:I1f(IÒ;{t,槙FfWcjԾwSXF1Zַ1.AP0j.Sz+:E#U8ѿO&]+~hFy?.7N4o~hXޢ8ѿO&N4ocüs%{yèxAl>Ǧi2m4-KjbW@Fb>,O[ 駒h$G_޳$74P0.?Nhݮs-- [ۿ?Nazj/to싨]d-:{7Gݷۯ1)(VxA>uw͔̝H_5'ɐ3~ﰥ9ѕBA(a{dОkly?WO xÞ  ,.&@Č85 a|Ou[ՖtI-VVA ھ:K GAƊzX68› XVB#|Yamh$ ,J- @9'u>#Kx_Oh:#pɈzɀ FA ~ۧ|s0b3i1m>X; x|#^ö7VMo<4EbrēZ>e:2F+~hFy?.9<<^_+C:Idgz#J&jjzƗ̫>%3?1'8WO DӬEƺ*ɑN\,uZ[nk*ޏ?⣶{ M5"y%O WO ??收*??.95B5fRMdt \ jz>Rْ r9Ykh`Ϧ+& wjeQ$QެE|bjioulE:;|Oι쎈!ʜg& 6˸{.kw K)i)9XWB%::+*kٖ4Bwo[$i d5f#J#b֍=Aqy>5'HT;Z[+~o2OIU¶^Ae>y(tq+dh#z9J+;zbS[;ω_]wwMb+{GRjnk迈`mffb:+py+|1<-y;Gi|Ѩ-(ncS vB[,2Xj߁|E-FHّ#ݯ~uqח VTY0sZkxWϙ\*RgOYW%5R[*2/kFNl|סh?1Ǥ'X:-5r}1Ga=q|}ȃU'՛{vm? @bH^*K˩fH78tG5Ӽwwg t'wJk|m2bW|T+ eS_6^ۓC`7$~F:\婆^/-Vqڤפh~-t׊xwƶ^u00AuZfncG$RNTL;;<[ d'yn[^fB84|E@Geu$,T5c]6+y&..iوTPiY?.OF+}(m-=O<_.N1~AQۃ5}G_,Q?|m4|,Q[w#>2OOg9}i6T&CgfP`9z4mҩֺs~Z&6S#W #_Y &S6?E\4F[Gu6qy E.03[sF/Is?="7N]GCw:֫x7K"P0H8w-YڱQ^&a-rpm:2#ԙv 1\’/ a!z{TprUٞCVdm$QzaInfWBǞU$yźsO=q^ml*߃MY_A<1"2L%y"$wNJiP.dE@؟ ~1mZbYdYpBkT*P]JQO6úXkًO;hRK̬ b|V>%ӝ ~JɺtmNbg' ND*O݅EO&U۽ݼYֺ݂=,dí{Лy#v}@\-TujKpXȮPcϫK?RZݿo-iD 'N ~>vÿK *r>}6'Hmw 寓rѕھ}wiko?J'E>U$s6Ǘ\V^7*b?U$"0ƀgWJueI sҾ{u[VicO*{,Tex)Zo|APD7MNx?|㜶Gk;-!;ўߥ}ck|jd?4#kƦzJ>"Լwcɕdz޻wxW$q5_|;9GlWd PmsqP6ú^-ܰvoXВ";0He㥕ޣw6V37si aw*@ {v 9y+Xx3IgotxnxL2`NbK~ ޙqnCńrf6^{o 7^wt'RٚJ~b2}F+{e> v-}wqhز Ft5Կ5zG.olM6Efl6g$0axvaJFK>.c*aKsslלh_ )4;"a);2B zWÙ5Ѥê]\5`Lnٳ8r9+h~3 ɦZ}>My6A#^cqe_x#M៊m`ud2Z{2ο/8_iG4aЯ࿆;[mϗv7Ptkhy$f#Af#q[&⯄=| 4:鮱{bK $1d`᱊_ [x;ZeUj G˸HՒ7eRr7 }{D'čG7<hzWDK3ur m)Eba&=z3ڼxW-[d&%-)HUď7h|U|i^jkV'&FgĄ@g ךhPx'=^4SZvK=ƟqT6pɜT/G4 _֣;OƚS\o Sэ]||%x3J߬ȭx?ڏF-fne{i+ksiwvo/%̭1QԖ \[/˿6+x k jǨAwhe1YS pN s߶֕x[ xZSlvD`85C6?k~xOV\Z '@-M3gտ Ye7m!֡ kff\ (E%G8rƭG㏂ kSxRTҧӓQd“@G^=SO4뇵y|hVb7^|fƷio {rν[==QČ_!ϵrvW>=:6Ζq FOtax3o_d[Q@Q@Q@XuI>"?/s_SuZFzGo4Obď0djh*1Ueq->0^sZLɧmPwqF鼂e^_|sƲ.VVJ++P"Nߚ5)-BG#ܺۉ :kh[^9$ Q'gϭT&*[z*Ve${Uۋ#ɷ s^)E#g֞D]Y ֗%s6~r+mf"F˨\c|-BÈgro.`e09i'<j+ऒ~Ӛ8ekէyr;>[W 'vQgZVef_Ȯyhm40[jO,~Y#+ǥ:QKzmZq呆[V~ v\ZJ B G*6PV=#O` c׋'lÅ+̵٣ֻ@#QYN|!ẝ1j WFzejv|q]p|fQ5{KFRz]ΤҾR>VZDIJI#I'vѶ)8d98z˷NF'\_~4z!Kրq`dc?.6qXJ^q6_2yUVP0Ł!V*C1]+t-;VwKliI[o}aY3^$ ćNoę 8>?_𭍾mZ̿HO@3E5GMmⱏk ;GKr;yd(`nAV;{jJ]mmh(F>gFd;V?|$7T \Q="?&D,s,?Vg?-wJNx=Wp?yWklե[h ,JʣVj[VcAWyĨح|IJ UƞB-E|%k~t/V] ?WA4f?hUR֠d㢚bAk9|$N-br^wq]zx7Ut /HH}>w:Թœ΀S4%QC^ ę э8WɃֳ0CJ$aAź_۴ c'56_9q]v%Dz,s\mY-d=y_]oc{6,vG`n1[<bk=x۶ ];$W+'ifDpJl< MyQH;sVc"I 8Z&rdh $Lk p N0FkK"Acӥ`[D sך%ռA<~Q;my5{yABp&# Z;r[PF!8O۔ χzW#*)?u࿇]2LLeMye+UZ/ûvthdPX©GL#.ia l(vzWSZZ<>ݧ#-JbY֑3su5&iY"u9;GF: 17[-~q~)b$77ƴ $Hϴk<2u?'5_YuEZҼ`ү8c-m,aG]܂23ǽ*xO\~)>۩> j$.տ{5 m4}S|?Io?[??49jd`mESYt}Tl?;H-]VѶ<2B9}+>oht˽L%kP0o@/}Uu7Gu?POސ xoTmO6 - ou?m5O[uI1s@?45O_cIWQ_mީ$mj}7 {zwWZuۡ#@wܧnm?4l?7LռCqA=젲Z[.d*8A |zI|M{7!Ho=G[횯m,_!m֪ pI s[hiZ AqqV' cv+܎(Zm4}S|Ԛg%ðqm۞IeO<7 f m4}S|!k#;q%sV5>۩> hn@?/_йV~I]?B m4}S|/I\??L'-WUb1jAc{G[$_3}xb=.'Ua a> cHrH'kǿmۯ'd?9s\fSa[FSV,+v8m-@&ıޣ~ |cщŔFA;1$c>Jj|ŞW0bgXpQڴNLOkq[.m1_Wk *`öTGq,Ouߓ|9{m<'&"wN6O59LO._ ^$?<½Oqw[K{oR|j~--4~Oּ2$NEo]^1D1֭qcG x+, 2z fܝhxjMxPI+"Elv^N0Co|>D~|:F=k^h7ֵ%j:[t"#@0q$VX Vd+Rv]H< t3'f@|նf61L&Q#<(Xp+v!̊ >jntaa&lP;~ѡu#$@2cE=ֿeDUnd$m]qgnGk\#<PV%n;&/H!p!3VBjUS:)| s)sy<Ś|zձ61g t0Yo|:ڢY}+Exʯi+ons։M$|ӡjڈ08'2Kq,Hڽk`!E(qZ{["e4 O8>P̤T%P[a~P_z?^)9$P0DJm<=g/|Eza'܈O^Oپ{[ dM}!fKH&c(e!O>wǾ! IG,N^|랽:* S4_62)V ~5X-e ;8>1 5Y{lR3o|5>} `縹3Ajuz])U`>cSMFKtEfLs֪h~Fûhl:^r/즬.DB9W'v6ԶMbAP3j 0>SSH- 2iczۚ{~1\ƆnF F1JŸDtzws uRS tϝ>"|Fo?ot6ouR .@uXdOx?{hZ^\er\vœVG/OG_,ReW >][JQ5Z/ /=c0ZUVb_˘"d,p1$C4گ:t]-ir4KWdbF?y{TWGP #DNe-iɫXIe,q+=^ZgMbK=Νo,_ppw qYi7ǂßgMwv22_QY{߷ϗ%)$R#GzCWM{7M)/.%p&c^3TqӚ|-]Og5L y3E1׉W'<'AymW֮u=gW'@e J#,go~0]߉7 ź4;,+M H q3t%x ֯M3iZ-Xzd6r!sYI>[j# K֥&B@`x穯2.>|GLm4P[+"08ۏ3Rj=?kφ^[a,ȅđ|ÀHΈ:_k? k,w+`uyKȼ;yz88V_ j>͵.Rxºl76m᫫)eidͷ k&xA>!/ ;Z&99ߘ=k|5㏋ >Wu`Wt1.܌)_"$|Cݽn3oe# 乗b]Oxž,kox^K:^$oLeKݻc;q+?e W^Ě^  2ʇ!A Prd`q]gx;^.Ooi:uOՔ5ݸT\w5=2` A2?휘"fgό>:e˝Adž 4i5bK/$LBs+|W#o[ FAC^ /mx &&nkIfvyeb3OZqPǢ^8Ïq"|EGyC/ٮ" gL1lsޝ~Ѿt]-wK5]5A,q #>aNğhWv|%iV:pdybs(<3ָ|:;iv:cks%I !zx;-VxCŗH,|AcgIͥj\[]IErz="ߊ?i xszmtxSӕ~ڞKW9;w9ox--)^An5a${-d:3Rhqx#e> _Y[t.[9*fP?vXޞ8gk\Vsij)KmeUJ9 ƿ|Y|o<{K/,búiz\!%$~b|ܒOOskGYZ5mZTa$zeK@Mۡ?3Wz|3~h FWc.T6$ /ږ\ݤE@픞,rejP)S gڸ+n0<\fb|=gYiG o95ZGs1nOOT.s3[cԳB%x`DyZ90Qga3vpz]V>y"qco߆om37G37W<B{kWg\\"t3U]mH|tK=z湻޽<-uv `~{}CTfoe8< x[CRX<ٷsGW$fFD? ${[k kFcA#BT1"#Ƣ29E 'Z|zl;#P PV^p] skOR"u" A9WUIi\$˝ڠfJODvW*j; 2 U{dIz8ciDhwc Be?( /)OkNwηY6~ot׳~$?{+mDmpy>h IL:WCiz!N3\ͫETIɮs#trP;y9qUn!"rN yri1tRW'tO1ɀIjk%.J^.KsG$1߻ovP˛oа'&~Z=JudB;T8kͯ$^EQ3~85=G2y{zQ,>`ZFl錢ϕ7ZYm%[ z.{M y4[## kIc{w5T:rJo t],t{VX?(\g.BύvԷ}H&܏zW4t&NsPhV׷0Ǒ~2uK(?6f'hMu`l 4 I 0PoP1\7bej[^FRwWx{6].T3[6Ѥ(SR[H#d3U(uJm" ~rZZ4r0lNFj&ˆ]QbwF68q?^:M_p3My7RY(wšŅ7sG5ˇ]1@oOxry_OytIbI#rp(+Kw؆ ðT< C&DӬ渒Hs.es|ȌzǵPZ]D> {8oWP!cMvzdxm#>378,(Zo_ڞ=Ʒ~.|Sn1 .Ѳ"Zs'9$uڬյ-+AodYJض;(;xNP]OLQ<,y=Zw/\Ssh׋97RLu%=[βMHwڻBtExF}^8ViTXtXML:com.adobe.xmp 1 2 3 0 0 268 384 1 0 ):eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:384 height:268|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:345 height:241|` IDATxwTUI6>|~LtmVQT96G0TI01"HF2Ar9眓3>. \:ruNթ>vף|_ 0,mhhlll"jkk:0f e+]? e/\7N " EEE(,,*jֺY3;gfu=o=-/ M`dee!##_=77_lggg#33>s]M왺{fvY- xpg@4Vfiii<20dZl@feXhk;mʱzf>Ala~6"_ yM/ 4hOcuj!^ֶV]w;ks+gf LwY>~P kqQ2tϫBB\LS9qVy<2 WOs v vS\7OfQ᭛]םق| I/,!јb,}":ޥ&8j 3 _~a`, `d6ŬYKa}Ja &OdIL`)vʫ ;\_ZRo[QŚe k% T|+,񐔘Cb̘}<׺v3C݇է@])Sfױš+mߐpHoeeƋbʔ)7e>>A^i׻3ɰ0kY& /'2˦a1ȨBT^g v)+Y=1?F-}Rf\SیCbhaL9&Ibi"c`0A>>,TVd@ '"=_fwRD=SAL{: 1AL bs*:`ƈÌq9<22}l+Jm@^+4΄D(_Ddj"`zK&؉;/fƟ݇i= JVeh{[nz ѣw6۪v;<<ӦM~&wޫY>ȶ%7$`.ha)x;;C ą!L>kB,YӀ[5x,\Zeyr~oJn~){((C=䶮$p!_Ż͇X2Eƍ~0з}IhY!:i&n^Qlo1a Jzg>DIsl,[^{"%9M3s@viP㄄2!59ΝSUs}g ˀm:uOLeef]@ӧf``-vQv6v̉8~8&Nmmmի*:k>|O/]0ZHk3[aqe+uEy!".U,u+@\TMMbQ7k"4:U MAmu9*~?c|{C6!#drfyጺڂ6<;`ݺXu7|#1eRdJP ],6 c?>8zOfK,L!ݍ=٣[g@\\Us3Pd}X<@VVӨ[c o}|,cIB /)d$a7!lی6~(kDuVMSxyeNTk6>dz> Wy*wW/ Uhl(ndMtvo10{l``l3HzPTV k鴉5!d#BRd~gm/ihY1بKz{ ǚ31alC`R5vy꫚,Ӻ;/{LL tttasslw?-Kuu!5sE%((A~^0  }dwL4IqI΂`EG ڜ&+6i3P]YH4 TJÃKX1g g#0 {T &+.Ni=X|- ,qVϛ5K$WKTGd.3/-/˦MXwԐ{V6|^zp(,Caf4YG "87:q&Eu{tδ&6&Lgrڮ$$$pa;3&ZJpۖMI8-|-W<:CWDŽb ZZ3 FhWmwy$$$ѱۣ3ذmb}@ n|L!i(λiZZZ|AcfX`x1r[Kz`ii S8>b߿?6i!)"h2[BaոŻgL' !Az-K"Ky_|zxǥ>ټMPyPڽGbk6v@v'-_901z: k炝k@`pnƀpDרC Fxh=~@5{8_hʭ!@CQ*,X;S%0 b6XA@ˤ(H_Hȑ#1p@!̂7u.>F>v[Π (̮뭏l33 SembFmUԺụU,G?ӱ> ;C[}fΘ18DcJrذvVZ6`8o$L~+;B@P۔#|N+[6l-ۡWd)5\.$Yںw޺T?gڷ˖,|]~Yj΂]VǜY3(v1]9+++;X|!ڷb/ƒ%Kt Z)hhC~.ٛncߙޛx2pncu:nޛU_bv+P .l|)4'n y!1͌GO;Vg]it=Vέ+cefs{XH3Y?!&O?![ Om;h\0팁mW{,@@m gVT;ޫ7Y3gч| 7tu8k7r }g},/x xȴV}g}h>1-10eu}fo ?]Ǟgn՘3Tc,d?v'ߦqa`4L|`ƾ p&V7ϡvwl3A|_ A vnUO>Ae/_P ;SV=5|m/-,dZ _2eo|_> 0\e$X;_2$ W|_ AY e d`5/߯ߓ A|-/|2/عjoQC9!0}n;7yܾ'I hZs|c? __[]0<}x6&HMN ޱFw"hv^9}} r>y>4|} hT/80%d_51Z %Ņ|#so01 k/L`nawQfM@XY#eyU 7GFǠ(y\Q"VKGCC}xi idgʊnpsqc5ʳ|hE~vBHLBC򄗗7"bQZQi֣8A􄷷PY]ݱ\CJ @>~VV; Xxm}9.˃ӛ8 S{wd];&GB#}@Yˈv.\g$X?~O! .kE%Sk$wr|ׂQ"l2xe<4wDjF:q^0 =gj [U"Clh%J,U0Dx^%U`"3QSU:Gu} ᠂x&wӎvY* ˄:gwŶSOQOB3L즷PluH}5&ao +ơ߯`f9wo#VWwUk`uZi^2tO샰,^Ua%2N$"kC%6ɳgch+]0`0;r~x|0 @%F;?IJip%<Ԣe`ɡP[?SUpg8(C͍<\%5Ͽ &bwPRq!7+ fb)+$IL]&#fJQa>r64KM_;w(gbg}jg[D"-9O) H+?O;J"^Z 3-I}?[(:2`87g6%mUjs^Cz48vimˁ ꠂ约d8 -=#}?$Zq zXT=w_0%;5emy͛\&; 68,k3`ȭoJZH}C;wۜgzm*YMg ڑfG9t0X@`~ #jDfQ5ry5_=X^fnH/(+;_곝Ñ'ܬte#ǃ\8?x M#2EAN&}ʞ;)!ϛ2Y?{#5z:p6â9!em4c&?N@U$0ٛ()W™ .?{EK2* StYBy}孄}f6+{`YSZnL [ '' &0*NԧO@6C Xw6b 1W:qaO`{KglQ@l=Y|+K-I MvN6#'/VTڥ&;~e91,S@٥ߢ+,9GNDVeg?ؤe{ i)j,Q`]9Xԗ-B1j/KfbΨcs@ړ*,3\<ޞ P317=*ɆëP>z!(%U?RE $aꈽYYNk6P;'6ANFӈl<.}TRk"+5 9d}K.\奙6vnEM7~,3Wl -[9%1FD dU&]f"&^vF0(~“( FN`Ix)$umB]V7p~ð2[e:f9)\yɜ ތB-,Z?4_ d?Ԉ/[c}9B]p#!#5t0SL+Ez8\^rt݁+;_F@M_v戊Ԉ殿~ƾ7نb ˽cJM@a,"t>vFeYVb|^߷ϟ|2oP+<=EjY363ҚMZ,7)|'؟6~jMQe^C^Oɡ@71>d zMl5Euz㹑w=簲C2{'i NCf ` ư!dTIq1/Fg@9j_dq1Q=s-Me1/+\|)@L/\ɓ%YH:/w']C5f%Qj ru w!mφ!;5tv/gxbS?duCߐC~~,fܸaLإrEzz*7&elj/I>w?ǎxL20VTkv7,#Еpuξ ͅQ˃Ȓ ^Gxc!3)|0NQuh6,ݳ[8_*)t#vMz䤄ƥPTRSq&)keMa-8q ǎAEE*:X6 [8}8^QhiW4噑 +ad&Ԯ7ht킻u7@x f$+ jbPA]K[ZDAVV6.}|@M2K,߿\{öʲX{W'{Ҁ9ױ﹏9f { f,5 ^Ф\Ǯ;S ׋|>pۧ䦕kVv9|h{#&SI -`\yeÖBXfYif4-ø)E"ImyQRZ $@~H-dm/@2wH\d˦ ޔ{6&:Ȝ#)jzr}Myz;³G\ҘOa[`׼{6Ķ\JSLTl-MOvmm-=qLi?o"e?MR:>'N/9+'Ćt.+j2⒎̬`avi\7rξ_gG<* f{#X!Q4x ƈ#\'s N?įba2b<ryWFf}S)#,FIiXђxlܾEjEdwG&defr'j+!c1~"Ĕ, ri+ e(X `XAܢ@j3pSk?&FP꫟GN ˺^7^iu4;LJqP?6w{JK3cG` Fr i>x qeP݌Qb|4xgF=3l7sGz*)mGA6.xHDypYԉ+)=ۨě\:'}a$o]}* [Q +s3".>Aj e憄d8::ⅉ9 x@vi|`hCq슏YPZߛ )-2Ï Q1q0q0F ČiG1Bl&Ly@. Ȇ;b( M&J}xAa/F !4VN0e)ip ECf$uAʲl? o2JofWJXK+$F73p)2Ͳ$ޑcF0Em15t!ssd?ԵK(?#'Օq՘1#ty]{غIyg[eW v- /(cZ ]dt[ .dC)m?W I憜ld.!;r )z)L$Nh `c$0_Eӑ|\BZXߣ:=cJن[٢m 7xqPj#[b#"SqzD5YN9cgm,73IyRDWOb[`gёieb?G{2#>aF FHČpf5[#ݻG9`u #&|cslUYߋ3ן\sUG#|&bt~/3 ١ ) i RqY [ 17Y$.I!DO Dn lTPoJR *mCPp094{S,3Q? {76u;Ÿqy D_&9mx`!Fm.gWZ--a^ϹԈlsC 1--M~6z31|UVU8}WxBۛbgf2:5kA9عׯ8}VqĢhPY3'xW ۬Fi򱥀#G5q:<@ڔ?bFhz&Fу jPYKņxhlAaR}׿q&6(!obop][pпsNhq*$F === `nׯ*>x-컭@6F 㘾9%veYxas۩}OBSO6l ܺ$X?k?Etwk~b( ;;r3)q |ED~+ɱxdϱ^[C`u`FȂ{kW5,,,`bbfH"9ȼtbB%Ǡ`Ne]=FPZjRXP3љSQۂ/?\} :ߙ֝IFY%35]:!g8M;eɉNkgW|e}]l's [QoH ]E}A\Ŀ7f6 mb1`b4f TGz{QC?N_oz|B "r3SdڐL֓&dWΎĬ` cÇĶp]XA,<~dCeM s*`p=Oya_q},7loeb/igoozS?h>AW?ޟt #C(Z>l̐P;Uͣ R,6飻AE_cc/ BW}Y>A!{1Q0̇10v&{: ;zt59zbz?}&i={ C'x,o3:^ba ̉!-`r>p"oxG8'}^#ó`L@O3l|}>,273W..pB\JF{Շ*/DD?10F7DĐ_}z"45\_;cZLAEy"'QClMU* V^8kRq90Zx f.^ǔ7gi_9M? a )ЗB=Ñr2Z re45q.ȠW3 Ϟ*O^D%zaEE=~|CqۺhKaA)< 5͓rCUbH9I0ԧ3ee> -M ӆx ܐn_7D;OpFEǰ%G]w!⧔QHn^71l6gg 뤳+$g΁쩛ȮizD9 (ًļUX4]@)Kgz;aC`Vs{;/f=H# #.)-7,L$#2}%]] +ƌsݚM:.{1#P6|_n#]!'#+- zt@PDY9dii$_9d5'ͯT^Opa.)2y!a scJ#?ClVyPM[v=2T-yf((Îjx8XԕWրgi?g㛐ٱ.#r/6oڄ⮱%yV  B9?r'b&yDee( ; IDATZ*ʔG1J<jXRV.%c?,(LʋN@M7Ga;#d,K:c}Ȳs!JP(D4g炬$H/d'Chv\ҿcJqfcQ~0wDL6Ğ@B]`H!l?HX1gDL/ hYɅ}ӿ0ebmnf=[axm@` Xc΃#lZKO,QMxSSH?h9OE.`9\7XΌPۤĩkƺh@* yy nׄ J+P] Emк|r8v)Os- S_ZLQspMtVfdWԶ qp"JJ+a :Fmbs7:@vtT,,eB)D`~U(!EIn l[Y7ci5o7Rrr9R3bUDme30z^巗IéZ&b (#1d8l*}i&v]5X9 B*Efơ-(͚aX`~XX?ĪR8bB))e_e4 %𰺏Kra0S{Jd2v*^ Nuy~ET@ 3pBu녅3gSRv\S)K,$ `ԳN4Wc"B&;j@ڍY7/ظ|^{{Er<\UxBAn}9et/`NvVb/cẺqQ~f^LvόHs(~+1{;=Jeq8S .@8HCϔ+`d(i,-ϏgB49{/!4Sv ށ_wX1k" Bl]y|7{̚"IE@1 ;F Bgb?zE $HATT"""14Urn &?Is 'GD īf-{Њ$/m!(͉ z6 2t4<*٤Z;B~"\"qRsp 5p|q Gܵ[ʁXR(<R#RFU5i=#'. Uiw 8r7_!>Ab}"2K:,qlUK䒏*lYMB p4jUkOɤ&ap,~"f';RS<<=\ F5U'lF1ݏݳg1]agf0#UYSFQC{fs[lh3smZn6\6ryQP%s6s[*|8s}LiscSc9(-<Ż]j5o@Oc+b9m9j'ʴl֕3!˰c¹aef}Aee9qN yagJ Y}dF|xMcFX<ޚǫ18ǎ6\P1R8$ddQEY~RZo##Kf/=G@ O;dʉqƲP M卐ÝgJМd.@Qv2䗏 ILyaʷ* m D* ptd(tDPt,S%Bp(>6&ĭRuaI}ԬW%Rܰ<ƌ#ϝ\ڰ)&j+-PZYx\ÿ3o9lv#7!~T/ߞ T bY_ե9N#<A[e?\0aF(AtX||HÝ\n=wDJb2.DPi905+ҳC5gpPMYե~8 #دqԅkf̕hsܸG af`ɘ1)NxL~ż `u$MuJ#qFCd*l؁W`8O[DRmuY)aTf;WfyH[L|z7~ĵ%9a<1,ާ̏[i0m듑<Ҭɖ3ƌE+E+v[˶r %9yV S&Ib5P"C5}.߀j IXQ *EzFƝ]oh!XҸ$O{_sI، ]vYV5UL; g͛jrL>O]DZylTcP24GyCXW S0jr؇.u(Ge`/x~Nm{r +,\.WlFY-] $23 xYj] do+kO1qQp+P:)g߸R|]۲%4o~(;KAN8)V"X|^ 0E(2ay}r'wae{ag,ܸCPt NBV,#Ol7;E-T̬;oZ ܺu 5҆BQLSs/$h^N)ERp;w@Gq%0~윻}d!k"AlLjJ^\qv2t`勵 q56B2Z@4T†U gӀڝ'Y;KJ^p&!ޙW|O=}6Aӹ>Ue7GGGEA*B(fiSQ{"Ȋ +ZUK6 eiE$[OSC1"-ާO"~/M3@0=\)rUg&(=~>#'ٜP!,KKS¡ kĥE$yA_Wk;a$eao9D,%xsk;4սqʊ` ;d7Q c=%65/[vڄA].`Bc.YUdQw,(#%vt6ŦV#`H Le^,AnsptBpDLi[Ii!,&>cWDGy+Y^O`h.Bfu1oL7 myNV +_=WCmfaИ)жrn}F[&ѵsl9vYD*) c1p9<3zp*. hεgJW\DE~˸!eJ{dy P8&SJj0af? }5Ȓ2 8wFrNٌT6d)ԙ3PRT0qn&Uh߽*(#(;œpz ;ԒqP@HuQaV1SB)D}d2 ٗ'\wwB?6-/ca]u|u1wP'f:TalR%\ oq=؉u4{xn1@/cR{ߵO[ v[Iemx,&e훔x@ nDmj*RHgpi%pt)6Np;~j[zr޲ ]A^I郕:5?vc̓i97(e ;4[)JRqs2XJ"~ݲ iFr..i#~Y6#1c04aP2'*D= 8bY/l3KJK݁U$8tFΥts[cjTuǽ@Jig)-]oII+hJ)Vu =$? P<oFPOKaRKIb׶iYDO((#&("H(f72Lm2.+#w2Go V&RF,lR<Ȍ e"ѶkpT)/(B`Le +#ĺ>%1֗oWL^ -v&)nWuEIY!7 g-ǐI?@`zd|1}hlRIh >tDI*lin<~?쥿в40&*p24=;Bn ZwAOxB ev| aY=v{ i,I] [G)5xt[9)ZkDI:T 1e5WluF Awp/:wħH)'jJ,08F} Z&82VEj۲9Z!)$_ɆߢP$(#lWlp2W+#(iMYHee$Tv_,r'`N"Rh;1k%E/ U2;UbwIJ}E޽0deny7A6 `<)l-+CDӳzbҲƔ<{gfC PaFL[wx}|3tk D@3Vm;qږPPzq!qjǁ?" [8sn_j6S(]5]{E`YRc}xl9r: cأg53=^ĈvһN- Yƃ3R /:2Ÿ2S0xf }mCO%d,ZӒ;􈴛yAFB2BP~w)#(@Feg WA hȭ&oѹsgߏIӫ oc,9 ^퇟 ( }aec$YO\C]  GS-u3yOϮ@֙^ᱺz{OmMLꑛnXI[]Ȉ0$!.6 I))PK@[}:p$Bc7FzS.c*2srF~끓vYm*ćjK8pv#,O. f.x]hX?3J!ـKS?$4y*K.v i[E eFjWyd f ,?(~,M fIM(+ ۪2@ȸ?Dw2V[ga|d̈1Ã@-gaJY%33sb$mYȾ% 4)=OM]|A,1KuxrFb Kz?:wd|Cc16lx1 gIsyjbAիpL[ P9;Ih^ Aj?ǿRC␪A ~й[_]xe.F8<9~#s3ܸP#M}jVMuNQC\Bvu:Yk3RF`^VF0z-腱fWۦԗ)"5$}T.x]$b<.(Rl2.Xb@i AgV>B񳤷u+%nã8I@vb0d_6%:Z+cӆ}`_Nr )̚Uq ,GX#杞Lr;; %b٘4o4lNB R$47JJB9 z(nx XY)X;o4Ѧ3""bg♈!Ȉѽ{wL]{^Qxg_ IDAT, -ÇcxR u7wn*#y mQDà.*#j2u"V/rH:1JHAEW9S]^ L"K n[#BbJG_UFp5ԍBYɑPz xpG dć<)#|Rn^.F! I2BW3)m޼>u<+O-.gc2Buyb1XLr6'N5+1{@|Kh;RSX0k OUkaͪ1}Vl܃ו$qohx :r7†?aX]dY5dsNTD fN$uX|OgQcsQV4,_?("&Pmᨊ_7w%:[{XF!XA`InѾ2B(/Υ4X7XYX |B^]/eeHDy$1A~˒Z_[ltniO}?eY2-qrVbR +#0 #G0x3~D}OEc~)JO&?@)q JOQ;dחVϺJM;l(E5T@P u4H8.N$ $|i("Ȋ +.Y۱ :: >x{!Ds(t "X}RNv`_j' |w.u%t`AW> ֟kAVYъ: ہάbDO +hň}@Dg-m-A Cl}@? bD Eb@lj}@Dg_("Ȋ +Z1b@d;qEK},v"ȊV>Ё}@l/y.Zbh> #t`AWQl/ +hŴC`ՃbREtc]Mܿu 7|[dĿd0ĎRqdH?Y!-5 ϟ?KdQ_,&I/>K_Yd}8?@Y(1/'XJKu5H!&ǽ{wOvt5ep8ʪ?]qn|H4!L3uvE+{򱃺& 6HK{R\~~WYQoW8Y엿 ^nΰ67AiIQOu*ds@D\20ʋsk+KXY70%7S ?OWX[Z(-xjeޛllJ{o˳$v1ccԩ;f$8w")}gۿ啐PֶhK`'Xx>{Gq~L 3Vl_rVtBͰhB?|qtё6Ga~ygȢUϺ\)u,dA%(8 VB܃8uϟtLQPxv2etΝQc`hFqиupEQ;Oշz_i10_O8q2NfnkD50VބNz2]qVX5Glpe%+mǏYVR 꿡?c[ٙ0y6lý*`u2Galr$DWyF|j[SS Wq"iI`=x`ht%E3"3$F_me \4a[ =+)qz(SAFY;GJ\?| |Q%^ЦEՔ#%)q*+{u,Y?\H*/-=عn_Ƶxb۴AyI>eaP>`0f/]ECY0u׮:6o,][HN g~j,2.[}GNcivU?Sy(cuѵ7>}~ZWq@LJ ,DacHn3aיkȬ8ja{mt "IJƹ#2dMeuD[pH2{TWᡁxu##s/3\U VzV6J\go>%i,^GvN7*k~Q,JjRilܽF3d঒,a5Gw7fwO5X8y8:uȪgü00#ߤ cőDZebDai9xf9z,ݩ ڈ:O`& 5v29#0}Fػ>тE?0aBU-]}x!mXGCcܽv â Eз/~;|:ػ7,YLQ7a~{]x)r!+B0n@[q)P]Q .0?/s;k ?>13²jkk_y |ܿv{r$E7jOqŁۡadz7^9J-Rɾ qf'#3-lOi? 7@V & fI@xK {@V d7K@9x6&"ȆJ@3g X4e "@9KcȪM7CY6yk&&ajGG }?$K)>[gY_[WX0|KZ@ 4o6Y#p5l~@vx\Pwl|cx6x!(0A.8=f!4|^ J!KV%v3Rؖ1)tDnB`XG(ڲ:QpBt mwPk]#q`B,ntz]P!q\}, r[pcI $TTU,}vҭGPT+Jx#0ꍛȪ6 Kr&bBtAB@x5ٚ߶}'Є4DP[H9r$/G= &? 8\ǐݱqqTUdFpϞuRyVW6kΘ:ofΚ 'b*M0聓(qF:1OGQ v4>gqG'pj)sgFB.UZ7 PŦ2O{>G L/DJ7ᆓmӸydXEq6L>s _u{*l|&H6[kws✱xH2p n kزub3Q]+&cIcdPxץ3$-Ӳa]cbE,n COȢx(m o8)!5vM1sU8 'TT">_C-TT V6@Vf\0cx_l8p|/㪇aOBBBhy%;aT kt^<p/]4;<Ƞ}`бC_C> B+o[$JMO&z %fd"}gl v&Ҙ h+-]V#5.w#pQ'ȩ Lll*Ίr*D 9'N+Ӑ;=sG6*-[pg8r\͓2y %#8}8E>)ўL瓌 tlI%)955ա!}j 񩙂ϫ*GT'hiiɽ1%#dJZC|DTch2q.' !4 *tBm]]z.;'p @IÌt&y9Po0_iC`ˀ3xdvt96+566pptFilt;(ClaggW~څEq~z0R8jnN<'FSd4Q+, i LJL^FBg MCk DEʤ#ǝ_ɋN5؉Owsq v pgve/N"DƝ_#Y) T_½W <ր%\$$ƴG}_zHk2gU%āaeccHo/"22 l% ?ep;qeAA_[$nQe{+.CYdE* ͠t\f`\,lL*^`!@[/hu)VDgLhE4̱? &DOo: dˊlj}P]n( 6O7sshGb\=|P %?kyQ\--j :nݼwnCSGə7> ۡ;&彽+Kjh˿? ;VV}pe$ǒfffCX,Jri,ajb +x )\N L022ccGĽ^CaIap)3:לTܼ|W$I~xsw"+9wTQz(A`i6m 8c!YʵZ3`@m흺-e0dV[ !O5zm̟5{ªC n왍>Kk-ox4ʌaP ]r9&s8x}CIo//w_EEGG!>.Tw__DP[J 7W>G(78BdDrwwC +܋>)t/OQ A@11BV;))~ 4T^?zq)<+((PffdMxF32ӓ"h^t/7f^~~)܋땒`[@V BCB(,Ӓ⢶k9uD\* >J'\nCn[Nuqq BsDNpg#r\0׋bcL{,#F:.:*o8Cvu BRJFM38t(._ 8t,< u)Qy;v G5F6-gտ3PVVɓt(;%eu 1\OS,n?Ei ٜקA0q:›:-s r^՛ zE[-5OcpЊkny5U24w}_[U+;fblJjx<3Wإ':tk\4m㼫.ty -sVfw^$x`2 +$Hbi%o0 _EgP$0RSS#"…ϤDu L CE \N312fgg 2Ӆr|OΠe3E 1BYH@* ~F. BY;D3@z3r<04ދXq'&$ w >BTD1fVkh3()^\&!ׁۓFsDɟ\oTSdP3X2HGEEҤ.wn~='1]}BWyҿ9t^b153x"HAF<|+LqQA#e{-,Jb 2BF9dM.)Q@j=' PUI1 9vYix|Wݍƌt|3" ̍᝜gρ֢ؒ8UV#VJ}) Oذe'vOcjֻc!x2{6Y:X9{aX`nD~'aْEXd%Cd ^| IDAT!% $رyp_.w+2ШCܖð])E.{-$dKgˋƱe02*p,QoClz5/}AF8r. ɛ߰ߙnضf e(wX 1Ӡf?| ;m'. TNlCpTjIN2݁~={B 0Fza "MlRt?,54t]\CR1Xr-~}5wJ :A >bIa1?Xbl#mGzb5Ξo J*ޜe@lOYuw]Ҽڍ>{cβ8r-DhGꈈbŃk ;tV-a:dٲ,ˮx;ru&BQaxA}&<$Ot?wMe^K$++fP:znT MRZ&Pm-ɥT ȝJ1`Gm_ia: K{@#RM@\[*Kouvٺ\՘}9PS>3/*9ly+W& oyFĕaNFR%䐉KSZMˠa{+Y^1|B! CvI+*Js|0_7٩nɲlqplfld(2H!@<: ҒI!6)}&1r&;+$9zƗ8C$,.A-+#ض ř \Q؇UVa۶8S a9XLFIWނ%I|;;@ 6n;$Q#5a`,&zÖ߶bm8~hKKه ?@EUU}Vٵ6d*<"+ZUM%j's!@v!ad%,A`z0?R4@6%Q)VN}yM"uu1hAaѥwn4dL ^05 Ԍ]z_\}UYҞBN`??/KT$zDϘ(lv $ʓXh84䚱n~L`ڐInfɦ8Xg{ɇ0EG†`?G3 d_֕@WKVGB;EBI!-j aFaF/2;>}hEꉫgN3ud4~]AY})lo{8|. j[VB١,G y dI&LaN>^˻Fr.לP! ?_^suAiv w3 pC6_Nz(c%To_GE3Y=q1i1f0d8\+X/ ;rWHfX%;|*ю|lo(b>8q)BHC,ɷ)D=~x\sG~GV3)K7AMr  U<>Rؐ q#pW9|`f|g^DqAB!CגO^=J(_jidKF!¦v-|MB ;}ʈϡ(‰bšg@9!BRaw Md?CJ+a֔q8d(LcȐD1ꆖBVqvn_8QÇbҌ9XpF =$rAw @(+'7MYa*!Ύ%w8Y[w{,ubgѽ Қt3+->bvo_a`^7I(KF O˱jB7;+#3jk}˜isjZ(zH׾ roX ,E 4 "65lL8K~^˖`)XDqEa:th2F(&k}Odkg-*r(ǨxO?%`6Pwׯ_Í7PN~(*{wd"GVX-}ϯ%Ø`o X@IC(+̂5Íׅs L-r?x;Pw8<-/!$mYK9==)ql`blL\N|2Gꁕ LHa^.MXA>A(){եSO dOJ Ƥ`hTXk.ˊ1nP 6 SftA`&Z-#+T׶j =k]qf| -+euXKEiV0ܼpSK!&M3c䈡4tVx//^.h ۓEmǮ'cR26z lYؒcqCYIPFzw(Q,eSf4޵2k* aye\R9OǡilK@[ڸ()H!sP.@S[w5ҕRr?~QHZx2Ο9 ٣'aJnKudKsp%~=a?ʐ=\8KDDR4-tU,w&p.%kS0sfWC *2п?~;| N,?89XKwlb_rz`ck Aak[l‚R+`"휬L<{Li\,]Kɱ8Cd-UFOr-oނۏLi٤ih\zE7*#9?{a4V{HgO,"%5YBԢȤP\;#=G@;yON)"<򣅛PUqa6EB3݆co#)tV5# ju7w..^"%Z>_9tƝMyسiT_nRk7#&'nu\fJRXxdAĝQSAEVش\?㒦)Ksf+.=`0g\(Ro2kjxZb޸,Sj8][4J,,bex`żyq3I\֯^!iE9uyͲJ D:s9'75&'nP<{-Z&7&4տib{w[pJ+VVZG#pi3ǀ{z|TWդa#QFM}5kj`t@"S\#$l0 WN'diJ⩮)C#8 I҃lqp^҂ PIbK/Ր6o+"|HDuzP\0]ǡ$&#byxd%[٩+a0Y!|n8-= DMZ;7[ GGGP j6֚=ǠkhG  CXn3n#MRXᦕ'5>-1e Х@./K`M˔!ƄVBTv--}1u%4*(Bw [>N_#ֹq~F5,Gz`B[ۻC4tΞЭ[w9O;uH$+M+vY=,48,"OzRB55$BZsF@OS ~m)G6,۷Cئ3܊bm~fzE3(h|]un.)1r~y&N_[ϫ ]Do pE߈PMiؾi؆s|/K2 /¿:%jRM3ȫ3Qێn][`=VW &VȤ%2 :SQERD%ݯK`Q%$UI4Y^ǒƺcXvR1٥%\/؂Jh!?+kNĸGǟuAcfU$++QEdaTEEYv;B߳%Z]U-G_uǕDV.mZgSP8-Y$%$Y(cآ%հs= '–W*dT"Lcz :FƦ*o:'T}z ZډGɥ򨮦'W;Q$})ޚHJ#BIaJ_E$,|޴K&&%)@P+`ł=I%%¬k[CUnRټa ߢP_㻶`('PgeIz# C`n}=!ľE_㑖LBKILJ$%đ >3Oe㎕dwYRe& 'd+ [['p:MāqT6hۏ3jR @0n C|ܼ>#S\O ]x%rCՖa95a$iM^/]KE Kdaq~ܪ(<DXasF 240cD(>5#_jM }g{zF'}TZ9 ݆B5kt8<6R>5cƏJ#qUU#_6"*y$2I@t˔*DxƗ%T~E5ZV;=B#"A&?c0cL2Ii⚉ LΡ+k9M xALmiZ5 emx~{Î\&!S=0 (J<4tWթzԩsλDM歸03oK.+G%s5 K!Y#pK}`Qn<lZGD֎jbFyrǴݎ&%@xB=-ut -yKK߯_bߦEM\TPrAqפeZ8;-ONa@Ⱥ܍b%-2:*+<ȾE=@gMp]< FD7Wβ7Ԕ"; LA%P3y|&,Yqˍ/&Ll 1uf9H2+u}Oa( \x,ٻG1@!Y${݁ HK)*8 (g'; QC~y<מsO}&;K@] + e: [AuU%ܜDܰݥ;"g^Z r fzrB|S~{KJ8w7~u6ineu2Bc3m·͗peIn%~ȖmBs4@9@mWmvU'1Ц;=pսŽ>?= #ɏtF6z~/#d`XNcƪ%fF;D%A-^e ;Ey =CI]S -8hwFvq cas$*WN |fARrc'DSCbIg.cFiW8RӈخX6|9F>K7)m1F@xxT8y{[!Qfi@:٢WOtw@t\<O#Y/E+hS1{hӌ%SGz~!CXp3FFmMV"*⢼!ALQ/ߎ Ts2)#dc.*unH DrL K(iڼe/}QS~xolZ<lNxtv#Gq?t蜼eT*ZZ=;wFGc?QFIפz v%cF!1 D  +03{B_"42r%@wZ={jt3h#L[b''cu? "4AD7̟=: h^ bgAՔK'Dz )%׾gD6cYO;pusbo`e>}8=G2RF9-73 ϫ (&M yY<pEP&cfB8lyr) {RL^Xqϳ> Vߠ0T5xԓF"cK:{,-OՔV86 p`9w@XXZ!I'(i>,ەTZfNxS312O%by[?d[N' 0Gr˕hlY.d/i M^4h?'Y2G(Wb+%T.o,[ բ<2(š5Bdo$I-] ˃,?`&ښ*~<<4ܻlm\x\|6cem+oy~|dv;1mR\4ϟ-5=#>$_9E2:}z< O?8Ew$1#Sc9 X eMgPp}/o_,_/kq|cFrM2k.!g},s?\| .^UZ2Y dU%[WdB2Eq4" YH, D'KEJ{%\ps[H23?'05{IE{?}tv1@?on3%ȿhmkܭtu(;\O]?$'cFx kkε?8\ {Ly[茶a1#8sϟƾ0<Ҩ0cF%$f/s0̝}X$ܽ‚"<)K`Cum0B p1#cҬxAa ]ǚep-Jz~H;{Ew ݃ا7ۊj9h"nᒲwHAc̟1 j:H̓7LY*#:k|te94OcF`D3v]fyC5p˜Rao+eDp7]%P{&Čp)M@<ᡭ7r󑗝WNb۾cF!fa|z_JP~0# b#4S![*defRor]]02y$aZ, ,n}0:usf4JpZl(v՗BS*ħ5 &v> Wc8,8]K=}(?w1I:htR$Ửřۺf`*ib1)/S/biPŵk)eHː+mSe 3%cy1PqYٔ׶ja<*Y7~\8&ɚ%88sӧO? ]9՝faŒɘ\ܟm.eF"SoD\!YauÈK"\̌P$eFp 1#;WŒPx1#51#$HDšffbFhGW 0𻯠YamuV)Яh/OòSгW_1%kH|ߧ?+W>%[ J@V;~~:t/agT=Gu=.>s+$df!+ttg}f 3KWl|O,݀Zʷ;yIEBmH_,}\䋸*[5w"kQCQN]uRDlszd Ɩ@Ygxlf ac.W7Ox!B=42)0czJg& `zjzob0uH3v zX,[[(e sb6՘&|ӣ7G41ѧOL_e,d-ng7 a}*"㠻v WxLɿŴ`FdX;"s}dHY (a:(?Eݜ!-1#<}`IlKf3Ijf4_?d= s}_[$zH>^}iƛ&@\f\cw^4%N q’#iN]]^49"-PKc*1l`|oڸPm}a'%u D\r D% 0<~9zȊZEQwDrr2%;Gڳd[ ,@Tds% ;@6~oLƚZPXp$R<<;"er33:>3#ط3qw} 3B jTb md3C cFXLcIW1#k.pJW8^Gi *i{_qE2q/R 2H$32;I@2KJ@vya %׃KBcbĒ=G $ꋱol|Ӌ^Inq()ͅJǨGvnxM9A˅`'fd u(+U[Jo~׀9d^=K?im ڷL^6okN@q@_< %ΰ\a2,Rd`~NlSLɒCSv?2Y&|>oF܂Q`%(/pG332iJSD$mfg2{7,1#\hѽ8}T8f 3H!6K QEWRNgNgFh%PS*n ~M4q9cIs%߇P觀goAZ^5ίE~C\ɡ2G ʼ =.hf.&=x,&]d몢a37Na)Ӧސ  S@!(9-l Y~p#zG Hʃq7; bN{g.`o9ؾzi/.32(D>%+Ŕ5n=u`FDf PU4lGKC;q k(k6Vsxn{fzYuJ51#/7Č1#0f 3B:njMƌPENo܇Ĥ]!aPmKһL2vTE/N(/.;o!Nd'I.0n0UeFk-E~#Q{$b匑tz?R#3l?%ZBZvŬ {OT;/ Ȏӝf4,#/2?ʹCi<2)cp\_oڈ8y1ì`0Q{hLgdMx;w7ǀa8iII"ظT={yd:jIM *SuP B5ôYdT@\Q'dBP=Wn@L:4F*a >HKR9PƃlHQg9fJ-4f1#HwF{2عm|3B.aHZe*g+k$Ivz%?~̌hČpRig$GY# ˃;gڞJ뷷o5Ug{yo߾@66*ﮨ e%HӬu #iO|}ڡ$w \Y< b@%%~0P(/+3XdjlyX H"N"y~k#;2]yAzbv3bfZJ4p\,?hL;x߷~wQj$'ƿSIqg;~}}1䎉0΃,u|!aHOM+hƴ5E*̖i]*1IN{gníK;:2)>.< DN~@ۘG%N4Sp|PQU-Ozמg7oQ{@6%E[ ĭ&8s'ץ+WaᏲ*ٽB8?[!9@v<o\&āmدAIDAT0mS87(MqY:ygΜ;w>םm 6H־H8x;3/i}M؏ÌEw^#c9 F @vw Wa,mBiN/d#Lr [/ ӚQʘٳtdňvM?Aq`NĬ9s5 UFcb8D]}ݟַ>|YGFM>0NA#8%zWu'zVG2D F<K]Gai^3]v&Ps&kVdu}d%2%aP>VGB| |g.f.\85B1dV(uǯ"1+# +_π8kj'ēM7lNfqs5<9p=Lֶ^Ƽyc@fZyvw*L#iX9[FvvLlS~s|(OTIz :_kYL&? /X~Lcz\4^ $ą`9vbPGZ`EI fK6!lL24Fvp3m6z (P>4L 6IAl q'>`%TίS_a ;Qo%Oiudz)ŶES0p6(OGv(͸ffсcdyMŀo҆V=B[ Da8t l]T㈾=bѶ}.2";"b!)cI8z.<bN{{]>~R|xSОPR^f&;!e6Jl\PU CM{ HÓ>|Ĺͳ TNq>مea mwI8Mjlf㉙ Xm'.usMߑE@d%ԮUP=*P7CQxbq OACTl _4č> x6ZY JC2;DEF 'cQSVM`,<1% 5%"jlOE 07 XXCG 7Ԑݲ0+ Vy mٱq-X0O3&hUl5"J?ĝ@2Ylŵ$-8@I.6mdY0B,$Lac 22akq 0¢Cpfb QT(!728 CZ+ĉ}kѣG?<3ː́`mE8q"PPO@j\CO䝱2=mdl2y BuJ둞+ }0FQ=‚ n? 2 g9M5Yd:2]eN6!1@?M@ӂ-hX.G ^DVq ED[QFP3k8ƺ*hP K$[id VFy d1W42HW#\<5A@Lȵ"6bDsȤ1Hi<̼B9nif$lԕ{Q@\itR "+ K) xJ P͇N5\\]`k[W `≚ ,Af!|qKf7F_LV{%jF8a5yzn"=BPlrSBpdzҰT1q4hi\h-[\B-9V *cԡ1\C6=4܌1d 0---h+~jJe`)ch<Ҷג7Dm@-#0Zm ԨÇ Z9a BsYtZm6Fyc: #;оdZ_VR8\< c1"ƌh({Lbmsb>֮[K@sdNgt-eٶ):l?U !)W?Q8g($ 9ԏw OT*Q*aG[ZZHs1e,FhD^''G DO/O399RcpwwE.Tƒl 4:o 2Oř;<*&s +DGϕ?%rHD:wwdц.dy|.Mg%sn陁h,2p|?Tr'yG-'+[$4,E'{;l~OmŃGLשTa-it nvȷq]/S "D>ZώwܴYJ>r6Yx[ fHpb@#+-^Yy%UJƾN2œw$O`bȥ}WW[/lSndy}g"twp_BnWN$)! 9믚r`D9MYf(,ҳLΗ4hQQ> @\ީ-b8Brrk}j+[90cڑYdߙ L""EWG;N3DeĸhP.K21S 2VaN$zbEE % ϱO;ڦX&'M?wA hk`׺=VU2Xg0{u;7%^DL*C3)7;e'[D^nN i;̀x ;PeY%}ڑ^- <ȶ;ĩ!'JrMbKg V.Lmgٳwf@^Yvv>yA_>;yAY~ c ]ع׾_{Rn;Ojval=)EzTh=(scjkxDKQ[>ʘ\".^R&HA_[AyK5hzS"P(%NS)sKL@)(¤Zbz`#4[JwهmgJZ tsgt)f=)W4>Aޜc1wys]Ы[W7P:3TDu:TqNRY$u:Th:8RIiA<(O8 8S֚Zi*E*5T*dJtiT"=Pg\=iJ[VV*vҝcN[Lh=*U+Cs\u?V3Y3 wG3D"9{3hOWeITT*2 &Z}1iM<5.ꎊb`ԡ ҃@X0 X5<5WP@R*LhD49FjtJ#Jy!N{TҮoR8=یtZڮEh}(mN.z[h=*Ah=)}lڞ,}[P;RQ+f^?Jr%_ZVH9.5J-9PzS=(*N=(Pt@D>})߮:~5yvZJIMc9ƞб4Y?^#1^?H!^8f-2Jd\OUA>.( KƬ( |{p Y( [ҤXOL)DkV zԋ@ X2BԪ)TzAS(CGf!P1m1U'LvjK{SF>詒1DQF*A[؞j;B{Pc"rG$*\<6W)p0Jtm%6* ԰i۪E)J1\E?TZ{/JȲSX/*)JӁ)\v'ȧT(9%TSG>M*kӃ+W临zӲ0U Q$jE"Mr"Vcf≂HL,Q.3ELWG^bZcQqӡ_vf4{Z0k!tʱ<* $wHN̚}qEyj~%}Xj+q~z}zChMe|Ѕ~uP'c$Gk ClHVM1ʏhT*ՆPJc W5MWqB-te|.(żs㓜ʝ#MI^=|z}QƟķI>-<9j\I9Mz1Ķ)l/4ծfG oiE1Ԫk6v!rqָZӓAL452SKRoz\CJ'뀌Yڨ'b=Upk#iV5,a~-Y;]B¿֘+_F_<}>=.Mid]DwMb  rN3Un۝t ڣ>v8k-Lf4ӵG8ʞz;BXePC-Z/RZz :}MUH_R}P@$W_k68Qy*ij\˺h搯CZx#p?vԨgcc&6$O j77?ha,`1)z샊ʵb2A'4}M\f)}itX* I,`WygWx\PRsX5+iVhf>«"l8 񻃏V| ^ ~*U[Jh]PX!$|l*+>b_qO5"ݍG]'J?Os*bu9O}["zyr,%V^jZ€On{U :UeVQ";Ck笮&pd` VO]Rhb"6p{sYLb2$PhKq}j'DgBuK=p$M[.Y i4 :@T_׌;Na$?Kv uq{iZvc.ۮ\4OC#u%~2w88?zV,葓skӯ5wg{nϴv^ܟY[t$}D"^ ?5Ygj ~5eR%{@hmvr;@"Kg4*1xXI7һ9JfyuFR">@IM2iNTA3c8ϵY^Q ǡʒ_U 7+5/8 `J˓RMݺiRIlw.0 9]#(=@9?чqBusu5ű &3{kς?v1 Cσ'T E)jQ_/1>:΄G9#T|* l*j6׶j_)3F܉'{4wm]El3LxEu^V/>WapU?wT0Yzڵͭm&&߾OS^g"y͝1X2ۀMK\|o"#O@s[zY_z:yRK\޽6 WCb  1jGc DZLު39ֶV2b!?Z5GT2E 2r#O VOsE5ŷ͏)/cĶ/ z`=:ж/t[_j{#6>C^9 miMv߬k7vlJ#h`yQ 'Ax`3cWB%HC84KF V/*ZP7[4^En U#hi{3Ws23ߏJŖy+ٮ Q:rG? *-OWbV֠O7'ךuA3Zi"P>euSЈۂz ?y#o ^g&}F%6s/ngUҩY6 (ڱj4mM>>YHSɮٶ!X$rWD5}g[yo)+,v3KNZľl7E ʯrmP7_or|5cHqQv9a[};M>/I(uEZ(Ku`m}޿62I 8$p,UgM+Ǣj XA8p?*̩b>ΪlCqw71EW#VA@-ˋ y 6Y:}lS"63#=zC(FSlʁh.m[H޼?c#y N+;S[6+I ,cpXDåc9t;a.dV1׃=kqxf6Ewlp~a׸5}:7V\QDmk(>gԱj>sW[UA&)X|$ ) ާű;{$|[yk~%{',bPH .⿶ io-d#ߜVF2z˦Y_wHH,&![ƦhdyQ71l}QЭvdA9[CY|`0ߊ:ܭǥ=Ī[*ԞgU巖!jL69-tW~!GÆX5'Äk7-:]4iդ(%LsʸڼBͶhzK+FVYDXte5 hkk3k5:԰#qM&b˔ RA<Wo[|L86y e.[!}+N̽wp̮m#I cv22CErMW[ JHE|z'XgX*BN;’2n#,U;βm A*2Wgfx\{+s|VRn範ڹv-mڗcv`PA[ ]J^H#eAI%PŰrEz2,u#>8q=(>i03]HҺO xf .k,-ړ$)㎙zcDa2<1j[ʀ2pL=c.k][(F2|X+c=ʼ5g1C.d=G q:^2=OqU9ۡh F~Rb8RHd?:dZmdW=2OOźQ-5t In'Z.)v:zdM023?ZP%M*/4MN;q־Jx<ᨵ0<YUo 2G^>-Ɠ2FcnE@&!siړZTWEteS*`0@@*g G=M[-RqJΤNNGַm"BȒ(8ʜhK󿍣6:Wu+ʀ_P͎] )JvѪ>ZxU⥍殯Xb6bjR@лIʐGLSreKKieXz0kUT[XU@ػF1M84M*Ynhݤ2q۹bPA4&X(3S4%g٦[.v16֮5A#@`8$؞y?ݱeRu_J荒9{3'Cp+ĚG=S9~*~0F(~ŨSpLֻ熧`s+eؒOa\eV'$یENPcMܳU=FWa_-ۂ,dg'Tﹹ zNCkz֬{+FeMۣ;I`9˨#o*9sQEWL=v^&S(RT7BjErzR?a%!7Kg9lm砯5Iv "AI>?:kXəUdV]?0Os*-`Utl~Gn)ŋ`GZ;i> $MKJ@,[̈aGAǭ|^=zW m=F6[J|F㟡 vg:ړKt}yҏ_A"rHFGpM:V47X#%VqG<?j#ƾ-fg%ͨhD5 r1[_>*YKS,n.G$oC{VV#跭f5}/Iem_8xn?AZ#6DoAwNWq;F`KwdUf.ھw ֓}j9φ/y gM4;ð[0ބk'*>'P) 3Kw]FH927~>64'ۭx yj>'́G0X|~7;I:rvڹSR71@ZMζ1P zW ;v1?{qFI 7Z\v:wY@:z?WSכUoW9O˃W^2> zڿf- #~HNbS8 *)g8 =}+H :KE3q CR_98[8}6. `*;5rϋu|7ІK;i%U8q_ys89s H}xR_"nC}FFEy|)u7]A06JUNI8iJKs;}FkK;4*܈[#e]wOE\Mx,'Wv0r??βqu4m_D`1"vr"2#7cT񏂵beq RYW8 <hPҧ6٤(01Шl,N {uu7.'xeB;zRr]|[υoA5౯~-_Ui?^KcĎ?5 a>H >y5#-, 5VLjgY"δ5[֔m ZM;h{3KV4Va[_u=. o.,zKFR?"[s|ѼsiV;Ž"U9GANo~xM ~s_?~YX)6sO\|Dӈ|?Ұ~!me<|#6 w%b*maKSxU5D$7k9KKXdZ(7߁on/g =Hr@ r9XAHnX^h@-c =οg2i* "&p?ס\yzE5]ND"bC~LgҫqwOKu#te6X!oێ}s\omv}ާMeMa}87$ d8_[++;IT['#F{›zM4\[\\Fc7$8QT4Nߏ|)g}aҬBn ۵z,BKKk JXBGSr;sU1 j;8VWHkf0w!Ϡ5Xy?=͖M(]H1Y"?S'wsJ'D8ʹB=*G?)1_SYjdPQbŷ_ԍaCEkSh ڈwB0(@1z"8e⥍~Z[*ci-"(35_md?+ ="Y,ob"CeE2zn۰( g*9`}+kJU} s|:֬͸W{!}+ܴ 'oj ӻ3G#vz>@W#_U_mԖn'#9տn^ڝ߂#H/d 0egqweI"3/^yVq-ǒ67cЯKL;j*gYAaibza6xc_\MӓR#kuJ> =Ƹo<tpbʬq֥0Kڟ?7qCtC}%3vd=&gg-7þH$: yԞƼWn[Xe1Fadb9cWVcFjI4+X7+} [^1ڨUcFsqI=6fb>~Q k6C W8=Gf~rmX^KyjR:gt+<;Z㊹)L=)1rQ0/YA5YCB3L0Wp-zR*LD NFQ׵MM8AI8V^p<)(Z%c6y~.[|*B;n-_ȵ;׊N6&s {U@U.Z'c;LӬHJ|Ch%*-Pgb;>TQ>ZJ?h!ip59ǝ|țRnmāO,{&{W[o$d0>SSsslљ2&#+<)fM,mM}huA5x[YxYH5ԀR4ZE,z%.,9>]y9FssB9[iI#達%i+W[PECkC-qg;3зa}+a#=Wk9-g+3Z;$rL4>q- ˾Hbg»R4d$p,FX$n+ juY6\="r7>eT t=ZjU$͞ௌ z>K`X˼yFg+O ~]ȀOE|.،T@(7jG~1 M^BVLӜ5.s_Z^bӮyr#exLӬ?c@9|#rYYr+SF3ף|4Xo,5D,QA+c$װ|1ZN7vWaJ1kS\F"'vt6:[--` +zФwb#=qV婷aEIĩS[!&|^OjlG#⾗W;o}C#TIcVdml稨Ȩ t i<L XCB-3w㎤g5q#Nܖ<`8X1 AISR[gC7SX+u?c\J}co,HxKw8_7(XCȭgS wP[KaVBT~v9mY jTb%kؼu^l/ jA&H LYwˌr+:63ܟ2DrۃGqLGimVQ޵1[շ6ԏC^~5+-K{WVT㎼670?C +aZNmPԭhtF'ReC*V; p O:&ϊ:eͻK&h0La0;׵xRYn7d8 ÏS+Yޛ13q[3м]"^&*./[Ui?^2dw t}RYdqI!9!܊tKUxn HФqPNdO)|ǎVY\t1{ h X'ʲ`Я ^{?OҴ:[{yKo B4&eAQPj??a <NzE .܊ HRw6;UT2ɩ*P &O@+| qRlmaRBl>#H#I =}1 \S$d\H7p=i?B"' iB֚M:OGjyIɌt :UHbYݾ䟠4GGh:hZHc$*HP}N8 %Ka-WQ22zMq/` bVel<<(*(a˩xz1Q8?*O^&>n mxG໣GxNݚy\߆Z[I`!y<$UIa[AM Vcq޸qnfmiɹ/#L,0HZZ&=dVt*Aǐ޿\&96J:YG\F;~KNOMcq˙!3\M}N'p`h89}+K'1* ҶK؊S"̵;sOU5-;5Whe!|R#<ץVڍ&UxH? ;+}iȃ#_Mt? <!DMٽ?X)-zƣ-/?ՙI.դ`&=,bi2*XԊM\iؑE;oJ4I r}+;5èP?"z^m;rĆr V$!54mm K SQ>nibgiwz K;b1:OvD ЖY "3xL@3.ir#u [Y,"X#6ۏk%xwL񷌭P$#Y8,) ܘ}QEܒ]=EdS?_/6*N#!`Ůq5Iu_+(8#V_/-yyͻc?Cwaܪqsoa ۷~-:NQFVㅝ%J΂7>F;?yˤO Zd!o/c4x*kkE&$hI=F:P3ZeH.pXs Cإ̸5!5jyU®a^?JX?V1 J,@cUGO6*k3OZ֢Ai_VzE@xЯ\>uy:nH&kE!wbv:)7+XfNcnEVBֺѬQ6ZdB1GVAё(}+[i Tiuhާ+Ht+8 OpTf#L[JFDm>#$x\qfCeDeQwaKFeݒC{X> .a ֬YFJ̇.hiWg=̃m+ñAxlثepf񰱢K !yJp1Vўq Uk&º R]lD'$tl7@Gֳ|q;~9h8Qsi3uhwIvK`ẎS|Z9kɴVO+HM=ZܛG{ye Ρ37H,sօʌsQ5k8/%$cdzunZC|/״ ~Q^ jWF(+ݯҲm1͢8嶠q=b:נs{v~oۯ?m4iR<7\3kx7k,&BN(x5}YEO j*[8'|zVhZȍ$Xm9bq\t}9>П8 a c8U;ܜ]eޛa %9>W匨늿ofM;3 iQºev To٤N QUي;0B.ڣӽ:,NJ'_V4dӤ9pV``71|n8/-1͍v.,'Yd34V13i9Kz"7* HN{m5MG?^KB ?sLS7Xy5vzib1z>mBq/^o~G`W!^d5;dsM w~uMZaZ]M2[*D8 Wkx$N N+M1v9'y5%G=̉lb[/Z]4zvCi䱹c9֧1ՙ ;'io4L !C#ɦ]} P+`*/<41-m+Ҵ&M󝱴 qʴÍ4Lb L~Q,d"J;gˤNc;dRA's^|CaFN멕 u' i-%RGۜeqW~Z8Mާ*O~?ߝl9J7'c>+Xiu[+4 ooQƪ{ CE#$$2+>31󌄏F%ywlB|?Zu91yQ(عj>̒IH ?ƶ/!X$5 \ƮS3oҚ옜$DviS Y_oo ,\>V:8ԗr[BܬNgku#+C돧[Cojd%q^/BYM!wb}WW 5C=OND(S*sLn\Ps\ $3#:IaʳuTdFEQ#@tÙMc $=kaV9/ݟV@+7uz3;zVo\㩅nn]r+q(s\^Ĺ|(/Iu)]2Md 3ӥrlrg4$Ͼ4 Xқb>ϤІI%?d>gx[KL>ac9ΊG\mKx#e,!$k{h#]qxlz~8>$FwO᩵HJ׺3|W~4;|%C~ =@ "s}#,{#c7kԜT$EPnIbݏSPdL3p: kVM20[d?\qA]1$r0*btu 3J[!>ծؒ.f o5dz |5R'>&5 :_?K'߫?,Q˳>}Md} 9ZTV)7 q@lsѽ5!V\k6x~b2Qp<2nRUV]0#%ocCqxzNqnOF-FJ 05rlI q g\BT-{V)hE+ `ӓ觉|H#-QND83F#$FC(`q1Q%X}ݭXK1d8k8 JW&KiY0ľj\Njݭ+ǑVf `WaܟH῰2ni'v7VէtpHy/`6GW 4)W=Z/i؁axH7&80p5aPln1sli#,IrHQ?$ݻ@/u}2IIA>!V[Ft)R⮏`ѯjn凪5&)>pI#^_kpr$ skīs,6ڔjRϸJQW̛K8PU|zy"E๞FhI՗JNLb%֙D6߆G!Ъ'3܎Uʏ5mrg7핈zypWTcrzŘ*rƼ{Vw("Ubb)N1\湫}O`GdsG/s;wMhkR}z#<hyо+s6=<4 oƟ%_X]GYu3WyYc4&|۽5}ۮǡ0d#( @kRճ8F6u@;ҬQ4g ȮGG?p !>j>i:bc\d qn|R󷁞VTĬؚ֎S5cVR\W4f%פq`TVج w7LIo;>Uʬ*l:W_WEx%SrEv ,Jm-i%lb1- 33ӭi6!eZыzrztQ5/zUG2 fI=ңP|E_*2a@u\GL<6wo)ةd|5R&.Mzk-[~]>L\N{Q^3HПÊik} 1yXl*BgBԙQ'yt.+,Lߓ,K!U4^zׯ..t>QRrAfayKm+MFP&5%w8U +czK;U}J=g"':getw׊(PQcڇ̿|l;ƔT)ݎ/]?J>4g`9,bPtx4V='@s'@s 4]_P/(P/+A杚.ǮN@s#(4]\P?)p& JPh  7Q {7WNz-aK o7WxzPO)l& OCAk0_+TS?ɯ”|R?ɯ¼VDG& Q0a^xS$tߏD#& p?pD^oaG,s@+R}g '& OX@+ O@\c?g~#:ڳio#g߻v}:Wڻy__@\ſF.& O\W0O(PO+< .?ɯœ>+`5W(i _8|Sk4UQ(_<|N'`3W*T=|K'a3SĒ?pI!c?g9OLD^ i ?3Wz rP;X@+C5m_W:w%?v0=+[ g7 @\cķm忕f[9ҸFi"*g)4{{Ӈb\ÓJ=~9Ȼ?_^#ӊ|̮T{H՟ t#Ɓp7@sӇ_a^8"#/@s?xjr.cqaK _9Wif(şa^F)Eacp& _[ɿ¼S;#@oP?+8Qv#?n& _[ɿ¼Sm& _[?ɿ¼SԇŌ& pa^^U7MG?ɯ¼VU#?8|K'a3Wu2G@O?g?'"a" ;A ¿c ɏƸ僞? ɏƏXM@k?ҭ:XM@h ɏƹqi~X.x2 "LXEJZVARVJ Zu)’8S@i ) x(JR*ST(UU(EiQ*tJb$tҬƃFUAQjUQS$ vJb3zTn=+Eb3~]_ft>Pjց矍#.vlLuƠ:fJhQRVARH@&i٤(4iHQM ;Q@ p(E< @)h xU` *E*Ԫ(UiQ*tJ`"%XD4QC*"AZZ1*b($5e &kH@ڥ[aZ)Bm5"JJxځg_ C]oMO@.{A4 xgyU+?i|7O*$'ܡyTS#Zaj,ZN=LNù^6*}` ZxiP)2ih`Q@Spi@8{Ӂ R@( OQ@(/JU"1H5E$u:GLUZF{UVŀ*3@R ҴԎ:b(JүBX;?=mǥh8GLW3jQhTs?7eWE=F*Ī2ih SJ(=5%-r җi(4KJ(1@ X1J)AO(@QOU(JzSQ@("TT)QS S5IJ(?zxޔSP)@ SŠAOUҤP=)T(H"zԩLQRST)WHs+>4"U9UsDqՈ>@1UՄڀP%8PIZ o2P+$*IEӯu+;[ˌhs^{%B'|qpZԪ(U@0*֙b846aY7gcμpc>~?:+&hUxQV#*0Ҁ(*Zr,{R} KEDR>(PA/jJQ@8D}EH)E4G) pZxzҊx@H *-JҤP=1EJQS&j52 :AVc5i"a#+om v?үZMkN3峆olZ*3̿1OkR?|ĢHbY4 |4\[wQt;Ҋ=J*IEQKQV  `)EpRxIP9( Ӣid&'P 5;OxSϰ) K }H~6"H%)0dBPq@ xCS jU֤YEw:2sT?*dqTQSEN2 JrB,PSwMqt wK}kiI#E8qw5&B֮dZ!fp@z})rCj{i"cÃ~n- ރt.itsGږT(oQ#&L/@*EuCЅ+deZEbM98!UVq^ߏz_Z*-^N1$|`J W褮T ͔1j0*i~X5SIH^^>QC%j|gq>Nsߊan|-`SMt+gپT/a40f硊p!~ %ֻAs Qq3Z :OS8SF4 jqR  RU ST ._>* c̼_QkY#S" \+s]u~$$\sڭĉߊ5 hV+=0:b8a7?²i&w9vq>4ѨYiq E+e_ߋ+J)TLn;u>S,RM @gfw*I6Ѕ_`(*!v:5 ;i-G(ߊp/ٛtͺ:cMk|Eo`aȖErQA'r)X-Me+텾C?1TtmFUEfmcX?tN?jvTTR)?ƣ"Ͼ*  m@ZLhqO4nlTTnFUQJ鍦_~Ӕ?JhL^zK|sU8#؝b'51v۵h gOUk5953IM:{ !3 @##5/PLHŻ:0",'#qxZbXP:Q&JS1F+kJ[[[ǴI#7JƶVE] T"^ j7c.?@u+̎Ʀj73c/[so46RX]gf>溛ˢ^.~vom;9Azf1Ҿ_=&ψON+8И\o#*—Ysќ7ƱB mu]6BdpNdm^F;iE =vڨ=+{5Iٸ1]UGe#HV?\]??V1]ыKd1quTtܹUutf][{S.w RE'##cT6-*:H7k^A q1G+oG޸mnH#")e3;rJnhړ2]~67de.9PA›@xQU_)+ϊ>>?JL.;~YywcA%tGcDS HiHĤ7بe9e)&*MG^u%6h5z+5{+i$. ڼdJ\q+iZcߺcXۓ`ci\QO~`^[r->pqBGVd4`Fzp}zJص9T&]j(42K1o }:δ|c6c*Lл)SdUI.b{|ˋ Ny?OBmGL~Dz}iŵdӑ 8J\/j:Pϔ&C|q5y@LmFH|WI: V$GƭۏLk s]~UV|Wԯw7O߷vL3w:`[}Rpiu.YFF*I$oW<w^\7v>_f4Տ_g۷4K'U 3KKk3b$mԩUZ% i g;ɷ{QG;A9q[CWğ+}+[JMVɕoj&簬ŭ5M? 5L> KfSlU5;iIʑlg>&trm庫g0qTQ]ZK4ZP+;3/[v(E#K!IFP4l1i#sVo5 x DL$n3qpzTЎ#u[xX3myY\ld' #V[rGg,ha FjJ@ ZtA׵Mʳ"K3|}OҘKr~?>̽je\ͲhKxDUu0z˩V)vvq]r ;օ>G$w)r|vAQօ0I8IY/!$铎;HJzt$"J٬co>bY%&+IT v>(l;mNge}kV괝ÏpvVʅIX3|V">IVy ir1Z0"eP%~I1+k8M텘TEjXFl㑎 ~]G rnr\~S-^ 蕂3yߟ5]T.KutƧ<C"{i$ӕ \l9jU?)6TI%@:,d@22A vVc+kXIs;Zu燼=oN 1H$ak2G ˈqZ*r|Ϩୢ+V~kI-nO" }5qman?ŚTGwpۉ8T*H>n UaDQc?ՕÿJteK}.ռ|!`^G>cjn-[C CS\O2PY؟}釆=jżڻ]к ld0tĨW>" SoM:fܱ {w1RxK꺋nY#SpAܻة[G2yYJsx:SlxPw)0O13szK(|k߃>鬳n$HPn S 0+\H"z5?a!sc tyTpT䃜w>+_u{UYu -Or0"u ;zsޛvC%'<6=M}!i^@꾊q_Aƾ<;kxvTRk(Mܝ=&3IQcևYpBNDq;VTT~k?F Ҩ~o`8*K)mC%"8xX\m; >̀: mA oʟA-VX#*9]ƜFU-F`OEKa[mj\{Tzl5,V͆9#aB,Q?΅)@U2 W' z۸,&v w$`Wgicq)H@BylzB#M:#yzl0I{[vlІ8< gccgDx F^7GbA86kaUr7bk#vq:}kGM-Pku|ׅYh D8P0ǰ +&*Io 6g7p q gًmo c0sߞ'Zf?, (7 I?沔YM)'QQ/o Mr&yaF?PN &s"t#,B5d>MO)>a)+yj"'prd*۳_[RGv`?mNL''Hc(5QIԺw8AL"x|? tGiqU*i.< hB-_GE>jn>t8h#g #Cjx銴Ӌǻ16PpaAaiO$U$U`d+6-]3z;Ll7H\DY~`pG_^+b$o}څG+mo#0Kp[ڻ`B).I%r2+ҬO[ >d\gpybNp}kǀ"}GZCMewQB,dTx?S\L$s_(|JOKص=2&ż #lyPoḵ7)#Zh!d{֌bL~fGljêhQ|(.cLv7ĞA5 6lp 1ہ['qڅlnodK;ɰYQs2*);ZOldR#s{~rG52cr8>T->LTC<pώ?eWO3GK褮uV #Y dz+h?4R*2*b)TKoMJE2pjlVZzIޥm qֱ|E46֑Ipq H2fzg7+xee1#¤w\[tg5xvb p:1B[&tpx|*Drmcl\sagjC/ͻ5__:o3^vFr@O#nWM۸zP :dnu =~GDsmN?w` Ԁ` v-xq]#T,f}pN imgXdgXbȃL/62?C\fHR)U :!hQ; a"yPdCw:vdTe1 1ג[XErnPO#L0b|^A 0" p/ U"&D|?HF}+(]:ֲpAҞ†R1u(VU^SƏjav(W~;ѵ][%Q2*t I+mqB $)crdRJ643E²(q>&o dkM/HMWM:KtUwԝw#&S]6 LnX H .tj.-'vw rغ[YmQ8#_ :,%ԦtL1JWSè>Ֆ3QOC\p*9FFk ZΘvlxvo@զ88ICmGj n?yWMc-`Ti?*Hlκ'nD*+!n;Re^JG5JElB,aס)Yܷܩ)-RkSD)* YҖ͚khݙr㊴J4bX@8 : HA7UPLᦉ\z+ܻ`aU_B%3Z:eҟg>%$lm"2u#FJ*OG򫎂} x?UDW1_55\+נn [([pf==u}# NF'ֆj}_.j+91~ LdWj׏6^ΛhqNDdJ#=T33y8 .ݏUTd5ѼS=@LYy y"V,|}_l<;70` 8zf;]ͳdf,Y#/7HjPBU# oMFdv$Jo.=5[VRɎHq^ǧ\><]P^5 +0 sdq޶4k[/"VuuCǻٯ5nz֫ll+W]hE93(ɀ6{|c(4 {To>C Y6.x\}+%v\V[m3h m^2}JIf6b["1G>Ћf\9θOSg oM۟n}5.^W5 .X\;㚗ق|ůj-zXxDR]@l`.c}L`kw &8u^݁+1U# N?UW9kEB| c/ciNp6L_WEtduH}y+"A/Hioym`IRFG)ŮexM[u+AKC=ʺ ^]]tͅA?_6\|`m#;2InSpxS@ֽk-ݙUg gҪMr"#rW:I\+#ΥlRV!"_l̸_*^DDTdUqQ>۽LEGl96Я)cXϮj+)$YZ&(6v]L(GYXH$)$pB#dCAUÐ(D\mmHP/R6N~]y?ͬh ƚY;Iҭ[[px?Ur OkMڭ=ak.,tty$bά3&MdX+;2Ǎ?O=:k#M sI7AX~2Q"C;ȱJ {hve|Wcfͻ W;4>0iimc^ʦWeV;'8 G3oM#7Qi/c}>(a>osLcZ0Ţ&ṡя 'Y3nV3{t-͕ifQ*An?ʋxeZ~QƶWs Ǩz=O"yW%:x&& ^QflžbPP(HoS̾ @L"^RÑqY'kv*G![%oTY6d0+ ݫ0;jzTe̽L:)Xakaf%1"n2SRPj🍮.%զvu bw:]i1Zq{`{W=v_T='kcižv§ v>jfyNjئm` Y==|D~ˍ?rvyz#h$Kݺ}k->YjX:k6wfz:xkfB?Z*C("X-o*I"}گб 0"`Њ~mN0x$-cKr"Px &Bn?Np¾I&M:LՋ~5EWcHy7ă_')ݮ=!W(~P~"Dje\լN}HJ zRӻU`0q2AL.s~TVݞK/GsP~BXC*; ~lIߕ#dY2nTF޹$9YDf-8i5'J}"۽}HvKH7cy9['?*`l֑K \L1= "m.4#݊,1 b'eី{TЋ[H#ɁGlj[*_:&yُG wW_-Bgƅ yT{3:]:,LHcݸ1Pv(IZ]֦V 85_IqT/Ӂf[.}GO%+j+ͼJ_Gl$"z ؊ii`~e MCTjsosyc*<[34E`2?[$9prq٤sy*3y#E1 Y2@pzV.oq,ma"rrU4zqݟG+-Ul}k@}@?~gҾQ  Nr%MNң{ vRJѣ˵eSP]i׾\g 0wbku]Oׅe.cp888N*c&|-&rW) (qzvwi8,Qva1]e›G.[qTA}+IESC`ޓ8:fP+>$}@y3o'=*\3R^bU#Ef>Yt=`A VBn)W;G͏OZ$N+V$Uaxq\ n\BYTRaں!f,HSqj}*82*v )$}'40/QHK0?*'0j4uc4`ݻ ) m2cO#B2TIefq8{F Ze ֻo&$m!<͢`0q?:5S~e-rȹAGg{N8y E-liîq^%@ LZ9⠇{fu2>MWFZsm(qilZjM$5.cGZah"rwwT)5 XIMq)RsQLLp1o]-D6ARz*v!Ld@V.2I x}+tyMs RV"uy$ Spj< g0搚`47HkMV=B+ #*ؾm1o_&&)W\zQ$WN*rYIV15& X@f,Ajf?= $is|jΤ(ɢźj9")q4Yd-< 6K5'Ϙߎ{54Vs`k ވ[$saTd/֓դ5lum)4 AegX^`'6qWkfiGj-<^gљe߆MK엂c-qV-RutIz* ٵ$sHg&nF)A?PQT+}=p۲=293U7!eY͎ͽܦ&CBS&4#F0+D #=QRvV]CUuo~3g#ְ4ginF8WC9ꥏ4|]N#x[V'?tk4[4g88c5 WZl緔b<=rB45)-Q3'gzI\š% 5rI\^Ve +|Ee5nnR/楂-⠱y$d]962T'h(FULH&)6V!9qNq j#Fy"O$[e$q5>zƄAoIq@ =:!PxN#0Z\@ ӴEGq5jPsL /QB<W4O3Ll`pMqϥ74@$"+&S 2ȫ!{U' =çC^lF x| x$֗2)[Tw## "z 5O. 6̀ p1-jH[ݴnߊdi8lsӊ(3W'"\2KOX8'Z' ɔ}ƪZnޓ[ѵY[gl 7VKh"a X'SĒ+83e';aTj2Ҭ䴟3js˹g, T>r=4szδ!˽e94{%k{J&vyּúmD׆ ."!׌7^}x&A݊*0P 䌒sׁ\?Iun[3ܡ4*)8FA8}0:H%|/}jIm^YJ9׎杮-HŴ !"Mèv>WA#i^>ls\'>EMdGN+e[ ^2?4(;ylw>XC85DD*( Sh(lѢp4p`~5rݾ 5LU5s;jr ,Ɵlw D{Q`8ۋPc|} E$GRk軨$WaZXD Lև~a/xR6FrAZ|ѐ{SsZM,cO$W–7~uךF=:m2yG&BQGY78 *+I,IU0++3ՍZpد|?XUWSqsV-JnzTqT@`x#c* ցr:ӧZ^sO 8+jV6at^g%7 6;L{U{sԊM=fi|q_} sPay+gNzj֚tܟQ:6Kyb.fÞU4B9خ?vC}%.рDj!ϩ;k忉[::He`Ǹr4oPh3ovm sdU@I&$$[9͋ވ qS<w>ax9uy6@ʳ8_[A5>KKoc,%p9 dv]7;4 CGLW'j*#slֳlKfZ4ow2rͽ)RT^69^̱6##qkh.!xiy7FP:=h||8 d2!ykZheŷG{8&iUecr, s f[_C?GUdC=Nz?*E\>ZEdQjs2† U[_$7FoH&y$dr[MCtnGֶלxfF$E0[ ;du#ܥN]#H"b/Μ}]E+x(li{Xwcӌ)S&c?š5~@8 =;c]^tV|U}q'2c`2@z~Jm{Ql/ϒ֥E}^G3&"D#j咺s}DXwq5KO|I\PqvYSP9Kk)lQrP¨%!84B* qD=|;y\4(onxMh`SisfVӞL Պ(w =ԮAوh?:s8T$b`bKZznu{ l|ĎJ<'#.86RRJ94> @J ʼ|1Cp77ːq¥Wtg"nlo8tkAid}+K+}SV W6ƻ>E )ciCns^"6($c «6]I#(Ӟ6 jR+GQfmFJ3L}:U!VOӔ B1]ΛqLxW9{yrQQZ֗3GFF?z1HrT=T r*"%^Ԅ!^,SڠYcMWn4[.6 #d;x)R}ܰ-mIҲVݿxE+4ھ_qĞٽ.Aj+}Y$wʉ_w8=\`yI|TSW37bjBq~gi{T͘[O e`@V1G|97 )85}݇fiL>]I;+PxR@?G(hALq9kO7a=Ȯ@rHׯ^r7zGʎdP#`ĺ?7ڳ4Xz6L,f33ߧGs},vQ*c3lKhq@;/}t#{\ U ?,W}*IC1ȤH5jF]L]9#<Xp⩛S,0ZW0׵F3Ub͡nŔܞrGC5 xwt$sUV;dV'՟'0'bYkJ&͡0Anr%i3]I Ù. 5YڶqSL Caա<Ѷ5rW־4شN^Hܚj8V.%O$l: #^1ӥ{Ʃlc-s~ ƼsndxXua؊;A#4[kF/XpG:φ^%ZuƟ4RK<JVJ"WZXp+s|R"MHOtZUs_e>|A+2{e7]'K$YSUa).^EppG#^迉FBI?mz.9o8|ץxf}.\W${v1N3RvBUVIؔ?Go "gFk&R R3Tk.-$m:{R5]9W #m\O4ؕYiI "ZD77ҬA?iْjyRj4PnM>`UEMAAPZ[u=rj%.c,ɃSUZ%cFYIEJ lӿe\KJ\ؿ(cӚc3݆W?Wv7=M}y__.>?Wɺ$R%仪8D.:d>YxgKfe;H]@8hOl[QNA@?AI9S3o:!4:NaUh vV`y<@:f۶芾,|[F2 |T1;Fl\)9yHU$ iCO3JL,fޮ$z ecuL9榲aVmD+ι3[Hn<|٬Ę)l3?[sY6yֳSw5qV*}( pk3)gW žQ3ZE2U0<~QM9#;&eg"5$:j;š$:GgeDÏM.zP}=܌CulFln܄}iW {fЫ- AfܬfN= iRLrշ`Dj > ]͚ GS٤cjAiaҮA& ¬4SZX +F&=I9lm"q)v+>=< QK!gEaЈU:UodΤ-; aJFx\g"vıJn\b֯EK8WR>;{zΤ/ ʅr{\ w ;9$Ƥ$/4mL\+%@V>v?\>2+f72&GFr`#NMH_/$}28էO@͐.j Fm dq~BF|n-dH~ҵ5yB*rv7Lqs | 7 AR{י\j r5&i'@9i D*h3CWCI\mǙ=u5S6nTu'IW4ndv =~wv+SJTT׵ۍNWHHX>Jܠw&.€IxoOS)%h"7u`(|V bҥȻ ri,@9+H 82#i=A('R "NEFGSMD; 1Xʿd+3ҩ6Z֭Y3: 0lsIRMå;>8ۄ\g9G ?TjJ:55fc9&ztm=)Za}){Y1*QFAPNR m'•Nr"L"-6p6jEϸ>[ظbku`\f4VoCS-%D(sךݞk'ڠ6."㞴'W̗n+? ۨ(eSdHGUջwf1VQy O?Y,1vL9FRφȶLùbpk{LLp8X' θ7U55JUFu8*t]9Jajz:Q`#O\S<1 uR2?#]'>jnӿ W L'S9az đf9^Os4V&p;O$0i #P'9'Yη)WminLQcNM =O?jP>I^J-T :s=F;b4I _G'.c~e ~5Jn,\ dw$T+0^O8 /ReP}ּ~g~?5͔ N _d<7p5Gwi=dn 2=Zִۗ1]1*F*R2+IKQq<]W.5Ia_) '9Ԭkfcn=ױuY2rԏCl*FK^|XQUiJ*N6i~ukDӬ乀䖏(}G=+/ ZCVZ|Dl"c?x4n ^yLOڨ|}vTSC1zXM|먭5;9zpH1x\s'׉ ne+%*qqӯBW Tљ %% ePE:CW;J;kJxb38HsdZa\11+XAMe)A&<24ɥѺ*U[>}{]z~(?h|q©FfY*a|iNć3S/ ?LԊp:zUEt-W*$PFÁFJ>rOOLF?''+"aG?'ҙ䂧 =8N$lǡR7*sTgQӷҜ|<*>Ϋ|/)M|uע! r >M'nisGN#I(~At 6Ҝ~*X '"X$m/X ArW ?j{dL|"q$d\uRXa~b-w?D8!SK` `c׽LēG'ԮVMڝ*A йlw!Z*H1)dⲌpG隈 Grp #niWi5`AJ ]O$^|ɏ?νjߛ?is&UuJ9ܟ^r y\xM ou|K?wEs 3~9ɷⶺ":CgvI tSgU5/'M 8ަxjmN88QN<Ժpћk|%PƿzV#^gw9d!h/Ww9k]wP 6#_mgPcmΗE%v']_[uJh~CU,AR|Z73w775ng={ B kq;%[i8O=89Ɠ~rX3!?֚-x*|9m6 >s~t-Fin8~OAދ!ܞ")ԅcvXU6OZ$*HHp9~>Pِ>*ڮ&Gʿ10˺0>njdq`6͌<$=a\ *|NOnb>FwHDD<6~~O$1\VR3%@B|NO(?u "J֧X*$qy>0Y5$`S8:,U7ܼr]GFCsWb+s*>O88eQt?MxQ½z5Nj:((|bA9ڪ3gzlrOc;"{SL唜f;_\ZQƣgA|ʢexy4H$o= cD9V欫~U|W򮄔Uf\_yfP4N*I&N'ٹk3ID UZLz\n1|EW Nv[vGnd,Hb1Հ: 6Xa5ln bKtZI 'XT2<95CÀ.-+ܸIbLq?k<ܕ-#ُZ jYꇹ$P0sZȨr~l+MK1y֋u fv9 fyecЪ._Oz0~UځZ/ ?le#*8kimk+Dԟ/$ s5jWyt?>ҨJ);"*Ivp}:TЩ;1WrI^{^?oFW`O*x1 žG{sM?d1SOfOj;P2eO=O^j82'֣?sjx2ZiWW6MqR_Z1"¹3<r\ct{5ʬyxnV+awo.b8d"Or9'.=OZw3v+ (2IΣz֔j3 #Wb+֑~?8ojow6Tm=<}+c(*8;#fotocx/images/remove-dust.png0000664000175000017500000007644615247006660015276 0ustar micomicoPNG  IHDR ڛmtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 196 295 1 0 'xeK:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:295 height:196|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:265 height:176|p) IDATx}exVɲ{93g@! wwwdpwwwAq|U;yCqlgniիWCZZzojyy9 /b27Ƃ '$TP88%eeeWM(4 22q!  rss,dff g~NN7趯|yω`w4 )) !`d$&& yr7_r3mR禀- Gmqqq   a?fZAcy3,\KcY $Ja9~GO J|lPSSԙ,-ʖ kahigƣsS;i}Xh(̛߫o#D@"+gBo5hi􁆆&441btl>xakB:-齼qzBYI z7@C,Y">%ł^o]bL9uxSvT~2 pGkiiݖԧVBF;w*+w؆{<ͨwLL Pztt}Nv"H#h5*9A^^36;_9ߛ:b/]wqyª NNNpuP2%.<$F .pvv#<}Ȱ@uлqI|lDw]\퇤LṔx:^HϪfv FN^>r OwW.FZ;5ۡ\8ݺp\6󅓽5=3F*t°V+1n.zicֺ.Da~bRRRWH";_C=(ݺˠߠQشkϝ^J C=zcLDL{`衠 dZr_ !1(,,qotƒ-GX5o4TэCQ &WHάˈF qb&ڵk͡SW 168j*zHC^M=b),<~]7aH̓}8<9aBYX+iӦ:tƊQT`eBgk۶-u5HpGeaӒ AΝ;իD]#ǀ]2UHڵ {ƞ={ѧOlܸQnNtGf2&ENF2҃pTT51㇃+BfՇ, &Ü1{@H`XxѨk{B]^r=TxfΡJ? àC;℉u"E`ۊɐ U-]L=2\ ud`Ey9h}(j5Eb 0c<,424 #[^@+AmP7P$X`3{kz+BF^{MbP\+3 ]qyw:mG'el>MS[ѻ4˰iz5 ;?BI{PSi bƬ>r,nY{Um-5X05`֧$8mՙ̙3:u*,X3fѣFQөmA c*/уqt(g]\>GL"KWASQG.٧-̇'M"QZ$+H፸j^Wh50GՆ:n]9ʫ潆!NkժU`kɒ%B5=rqL_:Ǩ6BEEs=0x|I9( KG}Mҵaz]9C 8TMeT@ђ݄`6 LSט|F`4`9wd'nS puPU'NυŐ.M~2Lsk&V_4GLFF?UxxvG -bo؀/H^4gGєaH4?MeJXwӧ Q+,%vckOdMEFѸܒҏv.7a _&e~l<|0&M+V`ڴiԣ.)/jM*=Has8}M&$; oߢ43χ:4p0p@a(-uO 9&!0>=- z(AIܫ`((χe&g"#&F:}}zd͵Ia4[I|.͛ O=I>׬Y׃ZGmI$ Sg$åOTR-`4 `E( >Л|LHhV倀@$$Mom5A.i?0\yx턅c߃Dn2_Oę.H%OA~^^nIh ۤ"O` tMcKߋr%N ';q͌GaR ўZS % 8cg"c .?Ewx%")*~W>¢";#;3p5sGV',;Ua"Sf/H``oO}GllG 9ݻw+yt֭^e*:`k߾}o ^XX`dO Gkh _chK);o ލ7*;CQONa~E ^r\R |} ɡa`D.e9Vi]1넃0Gt$=UZC /3;t&17#\42gGb諡~$4p> ((Ȇ U5gX8! w]=gZ[`ȅݱdȩ q^.dD] W_6tZ;o>V֒(x;jץD0Ԑ7|! >[\iTW*? 9)ضz6TeD~pvi74SPA߾r&|əH Ŧ7Bkl!ijw֚h|%DKXt$iJ"H4 wjZ!0rE\FZ6.A47=?:rzRn_8 `ر3v&L-dKvaA7 KZ,NޒBVlOCm!S EvNO [ӧL&W<,_v>>0}ų'cPC>pBC#9Y:Ǐ:~ټŭ1lP='L0{b>{/}YhL2EG\.݁9ӧ`2ѦMYs`ъxjHܹt&è#0\&NͶJ-&5nZIbĈ9zN2^bk^.0M99h >kAMɣg\3`67mVW"H4$j8{hm!YY:s r56Y9649%Y4gVpd[g~߫"H QQ[,a[$|f` 4 ؀v5o~UɓԙplJEA Iw#7w`׹~p)93(@U3oqu:IumiEA ϝwVSegysCsOߟ"H H4"H !@2 ( 86mI $DeAABk!ź5MKRO<6e@jp`#&&ap!E@Q$2o* b2 @}2  !@2 ( H}xy ! 4("HҠCYi ( 1\R>[u\ !Dh%c$%)v]ܾv .ŭa|6-EtDAu, s'FHMIO?_H>[+de: eR4+ ؓMPRb׶S$z|iU (,^RGۈ!v?K`_! 7b> /?}B|Ǐ!,ZH}]la≼OHuZ`ocImPQ^V?:ԸoRa'<@t[Hh8^ş Sc`h ' G}l: ۷o ǖFȥ1-ϻ7AA[: d&F`ǒq K?! 2UڞA\i/Qʊ)ZEZ$ kDD#X*bh+<(&9Ń@ll Evs֖氶0EEsq]lF#xyy"勤y{{ ٩,W‚X(<M}]RV~?))9S!.p̓68b7Źڕ.AGw磢"ޏ}n+.o\\&/ߧ0\~&%9I?CvMNJw麕veeiIelwK 94kHN[ H\@XuVSnB|.pvSFGܲ\XjՁCQi@N3(D{F|8lGS`Wf|6LƘe^mĝKB -5:UŁ@RbYXC$%2Qj*( h2 &S8$\:ݏkVV#㈦-ҌNA&I83,^ ,$+6ߐLe6~pG?In 9BHrY*P\|b\,@mers{\Tt2וq]d9-n Nۃ uM„',jofnK.k}J;3irsKs9T*'?@ e6%ee`vyab"ԧ~(H$9`Δqܥ/455.o=$`tz3)>ѫG1pE ҂Q8}Ղy>D*C,\>a1xSRwmگ?4)܂w?>: I%ʊ)@˛8z??;/<@>MU9r-rCKSv]hii V"iz|o[}#pzU<_=kG~%Xaք84%)¡50k|\{z8zҸט6npm8) )NOc =8$iػt v)v?*E侍t #iYhg~&O6ќg޽}x:!忿샽!nv+^s;>? ߝJr\ Diq2]woaYx\"CS8^n6X3|N8xzx7͇ ܱ %Y5K#KTg7@G%_~&63?:@"#.k'hb#Hkqm؜>dc2+y;#2,1$0(ؿ=7+f/#!&I}6liA~Bs ݕ2Ӡ&g|~ &Q5AKiGj/Ta] ,*Hr}`Nkam4jglM$dմRHi40,/) ֭\cGa@-((a I*~EQv&Q$2b`(Źgp>兑عakzC ! C0ĹKλE QL e*? GÿDR2\۷ ];vċȸt r4U 9D-Za% Q-]B[yxC@Gɟnpk38YCh2p6`+Leu+ۯy7BqA0p o? 5^- IDATFA;o@NFMPJfs$:&q)oYV+)Q H\޲1lRK%"p?;M{bao2d{iH4nLcWr2b&9cd?PF@j'nH@(#gG/Cerj иo2pj6Nqز/9)mD%&97E QK aRIkJ -2^JU滑8# Q(Okzpyi#l3mG6s(I]i$q=3+Qa8{%EVeޗhguz :ks7kG{Ɖ-[sFRYqU;߀l̍0TS ڞ_8aMHBI-ܛDڒ2G@`|rPH@@J:ұ. DQ2]؊^~{NIt*)9.ńpBH!L,%zP?ɕ )uö& k&0xdWQWKxR9EtIӍNIE.ݐ*>'9F!aH$L6: Ypz W%xM y=_(|}}u` }orJru>}~ݒv4}*=  Q? 27䲰{֋@Pp^\v%JmK.K pYu q˕ lu NNB[p;98 Na퉯Ɓܮ|].7L>/#qtp\`)"A+5Es |jS>)X3(,(ovr>JyA} A"+#tAQE b$/9gVFz7Kѥ 6܅#Ga sk*Nu9cУ<HFXQz_RG`#Is)/UhBWo <@MBސ"aԾ=hBn#Fc)8q"ST5v#,+ixet#hJKC )j>B`}͓tp&TANjϐw:zw0/FBu%M˛Rݱ ۶m7jp3tuY4^ކǾ{Yxq0Uѧ@ 17U\ͻ+Yi}A" l3ߩF : 0?Bξv!<w6^'tgl)g?ϝ;( 3/]~Άl ODAX+mʑSzϝV^\&^eacm(u4wʲ e \n?ۅAq=)VF.1 q9}T us}^me>Kq|3<5!!BCRs^>sᩤO>_o.s}r(H:V035)lr0>0]`Ee^DdNXYFHd4Kk $H AVBZ椝 AH\|]P[/G^VSrݐ+trFGW7dtz;蠳;C*ݬr#42U`')++-K𜜑^id&G s*JaGWdUîذ|5T8Z#(,\/-6VZ" ŕ#'3nUmd Hl:5ܚ&w[%dJX߹+Z ZsԲ5I4^r\4 mu}g6Xxģ &|=;3 &O`IFO^q~j|Hg]xA+0?0imZA*Oi[W@ 2,E()E3ܿyE 8$P,'Hmyl_[\>w g%Z]Ma+خPNDaf"hC6αQ]w YmgQ $đXe@ Q@?kPoM!"H#<ɤMAU0Ń+1<"H# Ų,/j]?&`0o 8П 2^@ !W--鼼(~T1ff|9bޟ9Zח"H|ݒA9\9k/F%4k5Թw(cRa X`%N 26ܹ|Ǥ滼{"I5W3?ӕ[ P9ԇ53+*@Y3:ٚA9}fri,UB@WUGW g$cx %b]b\ [sxYa\xVXZr5 q=&e$ ەXS2P285GG'a#d'3IG mu/oVŧݜeI4qu[BFAt-(69+VǠN.%TQX~Yjmvr@LQ: ȥ!~ޚKΓbBi+P~7O6o3?tFLS mp mNpWvo?M=[j;榌6% ۑ(*U='"+ӟbOuǐI #p]𵋦@GC^BBf.d=s7GJ./&=KYJ16 n]Zo"K+lIi (ˡбxڹ*HN^mU14|hlwhL0YO GBn01u_hYࡘ6~qrv 7[zP;[Q#Ҳ=pЮRzyP-R6i 1_kNq`K0r83\`x-aYRb|c|()*7kV{5"w&m2AΉ˶"$&(s;AOʭ1s#YU>=ѨFѳxf/`J~"^~'hݻI_D;p,զ\xqh|Ӧ&;`M&@M]s$ +^>IIc˨ $NcjtSKD!*Gw.Z\|,e^zo 9y\}N7$+)!<2DB[ T]z~tCWMۍWlH5w\LY,Ƕ[iF^1RRXDŅKv>'?e1Oǐy^X+7S*%)jVY%kvq:]Z.Ě:+1=] i)t*!W SU$DKE8*tCaQVI* ^(Iu/@Pђ)G h(H[0M +&Q\$=b~oOАnIնrMht5ABĺm9nlDi8Uo0oV^h7u>xH3=ζ~QyS<$@7h "DoQR`1MfEM}a ML']ɓ>VRJ}¾ 2|eHN4&Io"K@u%_k$peB'CU$V+rJMar.dj[J#OKJJ a.8xl]3:CƑ:T֓?CkcKH?uO]$Z{qcSx@KecƔPQQF_*~" ǞWCԌU7 ,<\F2b9^a~  +cm3ɬط|L/9I-o`yym=UU(jыH&я6( ꣗ɍZV0i!Ԉ)\Y"iTGD#+ M}2TT0ltxLq8V2^$D\:yDXy&l߾o>@TbJ* |o mX$;ag(uCB`'ag}}E$+saO+gx.݇+xD@ӔEAO q8?>_v ! 4("HҠUߟ6O$ { C m<:3̉øyDmߵ|*V>?o]L>7A MA^.LM"X@A>40wVZL} DžG B۲& ykHQX5NnEdYd8>8G MvJӌgBmchmFwo-#V-o;^e4ہ9 K1x鏔Xݲ'Li3qQWSlX>vZ#h[tr\}fMǸq0kp@ TlG)π峛X`i&P,Y (!"b~3Cg} ~W -IǙ+zZzsfL`,<ݛyYؿf仵G7%UDV{ r q&̙7׍ag$\5~h?9fTqIXm/܂$'%)v "VmG߈)h;2 ΘW~{(^枙iŜ|gi$*ٲ`0v ֍'NO[kQx s&ݨۋKW2K i'`|ЀJk`7Suhj,Y4pHw[NZzXyfMYYYLa`[(M .a]#:*P#bnw0QO/msk=Nv[e~-tçqx!)fN?nŭ{pv TńE?'.vqtJJ.\q Kj;f#2ܻG4nހ9?xzۈAڥsȧ)GKٞh-rS@\7ړ _wp䱄zeJ :휄]{`׳`d /Oo8.x$^`oct'z;9a.ϬGd,}v>4{ X(-ŕĐ׼Bh+GT `HBu  ]@bΨ)pKHfFbqDׯ׉(IP#TWi;&4p>.3֏0iNQK2n&*XPBTV%Ȣedh5S;682`KNxr `fW['Q@Q᳴!-azw"gCtn D%_qcHs qc8tWԂmDu*˓30 ,PJi3з's\Do-cQ$=4 û@tk7Z# z1ݯ}Xw=Devm;b0.[\Ws$HƅC7yKޗu IDAT'ሡ?y?Ij~'x<;K@ =Q$!!fmvS 0''wQhn= غ "x؜@N9~gbMXB`|?Pi$Y0#XcId8#3>uD%yoe^8b+1ZKSۗK.](YZ|\KACO ñ0d-"k &4xlg g8A %O7R9x[9gε 4ÝFS x ||gn:xSBS#Ha+GÌ+Hw)+!س+;p1n\R$읭(HEaxMLXO-gP{ (+ 2"(cy\½-!à7i0%P]d>7D_&oUj$Q0$O2>ՕlmȌKdunD(U#ЁQQJ!)ókG3N0Cs8 m7o鷯5 #@ Q>dϜjHl0(/G9߾ຬH:? QLLxQW_7:X2AdLbӆ@.|3rHH:2\3 ~yCGCO"=`]Ƀ-u, FLL,2)8{~$(cR(/څ]M/}ٺزpm''Rx4be~Ss+s|xY\rXD QH1@M_GucQ3$gcѭy$GSQzi HHb2[ilRUG (tW<0Фz( VJFa s dNYz,]&LP,t׌N0Y?Ql@j;l7e}Hq'BW9^5{s(5h w@wXwToq^**'/Trb"\βf'݊b~v}ՠ7f 6oو3ơh׾3>4h z=1`l OkH3G*1\OY:)IxB#}<kM6f& ͤu x  [Mq3-0Z#:UM[@݅=1hQeSuxLt&H1*-ڟF;p F#1/n_Nνp^`wo oݹĆ5F. &2LO:S."ɷύ_# xb#6b׫=L)2 [} S ?owY7''Z: ;g~$6`f/= <d ;*ȖT>dyAA \?Sļ A+ xY+|%\<} ΞݳD0uyaW|'$B)HLO|}}w7WQ8xpϊ@Q D]]&Asd@ $DmBe@ Q@8_""H2Р ! H"j_vМ*"H2Р 4 $`RXcZ^aeZ8BkocEu~ YNM^[b'J[L4L};6e.9}-*nI9J: H,TX3NHfZAe$f*kWnAspq= -%r7Pg3ѶhSRdHUժٟЮ*mHK%}o-]uܽxE饒ܴNNOz $пz7AX LGLmxV,w.)Gilϫ]'A”"OHT@|IG5'T9gVxG_U_4  nv $,HX2?(ȋY7n/ X23 -w yޒbXOǺk6ࡵ?W-$lu(˂Tuu@uݽ^{5R}KnzvwbjuZ`'S@B(S)lpxvv$e-/˧ر}'@s9D#ɧ0O\8g@F6uOjۺ07# v/_sfyc]> 7OTV>8qp79{aGe/6]_}+=6@'9e̠HYK.Ŵ3c칸kպ@]UlD^z/zb{N,5=dewh؅4CJ " `2/Jq(woG/ IPVС}={z| H"FSĒ#F>z|}C4d7w#*6RDcٔax*(FKK H]XjDyi]eŏ!lN5|9bX.cS6 $R $Z84 VKQkƣ︅x嗈$'08("2qpI A,0:&ľs$JNhkۧ1L_@m-DNVUe RGJ#,G0@b'(">6}Uxeӫ3.3Ǣژu94VYLNr.:"㮅 ?|Nj$.يښ'ಉ#q>~-:HuGOE%o J}E$,wLd60ZGŹˠ$ ZL hzp \4NC/_(pLx$U?eCL#tdRL:Hp i*S ,R,y$n}} 4('v5UN@Gn"q. t,'- $^4!Osbx7wdrǽcSKx;خ5P5'o"+/i>C Kk"cu+jqDŧPEK`tM8~:.އAԠoCJ"OnR[*$Zq_5FܴhܹHa4NG(֧t v '9Fܽ'ffO}L(Ȣ]g9dR@ʓALHtE//%$$ \Y.@^CgX)M8N^n28v> X}wz|۵Љ~]: цbnoOKkGNY"ݷe%T{vGsS]WI\Z 3a}>{Ϭ53k̬ۿ;HDrdrx*W˧`AXSXd>F:8DڞNUQmj7 7;FE .ߌpe%0MZ2-`H-*Cr5؛h7FKE\hxЃ/CAu Hk0g-EVЧ?;?!MyޘxxC`cRwhMΞ)j;o&{c%P9uF"M%i?g7b\ < hN&>Zw;L Z5*2LGzZ*2Bv4X_Š*Ԗ`az@Np}ϛn LLn#UAy'#Ygc.c>} 㫞/RA:jTj˓O5X5=0H2\$r^E%P|&0L 4 ༅&: !v u+Ptt{[3 cr/QFE*LuPGdUTe$_qu? b<{BDYqt_Jq'ZaηKrsxG#sC*$X m{Foa#VB~+`EM}^$h.? .[@T1ue6\Xq&111 CpH$i 2h_,`UE \_Š9nw8LvH;U\ni9jrh{x aܽ;} ??"~׏…w' ~o D^tv7Cл0% !<Чl;_~y7zCi׿1`iSP.옋^} $-Xx+ւ(ӶzEk*tIJx݈FnU"s,Z1a;6$}/ Bëdo]G9}OkCF;t6knx}Tfju07oVVcߒ;l *0LWtAAЪPZ 5.$6by^Ij&Bbzˈ,Cg"U$+i8wY2 mXDAwP`$'?َU˗`ccev#@.O e˗c̝7%m>+ȺΞME1Iٿ.FVe0=QVRKX2m4Qv$uo P\bɲe?~ M /{a#B9 6 ~@»9"o@l:E6 Qc*q^ 5w\Ftx|IӍM " yؽr"@V ÔGb8.,t~7HS$H{ 7}’_M<3!0W !>Zx_5 ((bҍMj5|d<]9b8:|&4$y~4*[c(lNW݆j/.wfXxϟǥ#зWw]*ȿhuf(v.qG5YU0HX:iAVr*}GQG?з1k?i5QJr)p-heg≘j+2(ؖw[Z !Y}\O\Zg/K"H|J QHk;>0vFSMU~6 #-4 {S)L0h|l"!|;rj/ϼKTzh@y6 #,`ĕf^)cTt%uo(6`|w$"487"X9 '"~7N`,fd►bDnVk6 [L|YaqMxQ#mdO^HmAFD 6\ g|_/>v!SAO8p:* shtZ6=tQqa4`(z37.:Q[&R ]'bt7̜?nb,zQ~#n1v-8c3(3T Y[’GG[[Z sMgwݵeطq٘1eD]R\L%@*N afai>3ܜajkh3UY޹(\/ ˟vkIsjq[il$Kd?ݍ~|67=}r\_ k[;L6 S&b01ꁉsW;j^vrrHػ΄Ҫ.NKdXC}Rလ!0h?$*1߅(\p3&]PTOqYKڬKjjLH5'Њ!wt {͟c?aҳf,:eU"-9$E2F :SSZw82|A5P()I$cR˚~9A RYY"0^,孎NP#E2q ǧbf&/ '~@ (#zJ&#M@62fWOGҹ_0uXuyE>mrdD^KunG2!W$T``Jd]TQ^;D31 D yT3P~^/G̃0vP$JZiCG;V8?ؚ"_W^̓h,b>⵵Z{NC'Vg/峹|b}GO 4Ok=3:Cxј떣/j!+{2YXZyh[X6_m.GVuȧڗĠ}h'3Ph=my@ ݛ`9dl܆ʪzi(-F(uo?Ӎ :6[M*R$)(ֻCQJ:_MFV^c*iT Sll(?rK!,k;C7?5]{Mj{F޿ζ?hYM_]1cSDPB&/Ņ'ofɕA|%*R.U?OI<;&Q=62צGnjCfM/7kp䣽X}a*ꮦR{'c2N WO!DPh H9sv.[K ,L[-3Z{Lz^A`fe {.XQ->&ꍂCN++EyTOgۗlp{sscy %7oZZɯjw%ǛA`LdsU,X;cbژ;בCˇB6c>^7)@9o7)ݠq7Dg{9.:BLM.:su9vvac흽h";?W=2EeJ^}G1.Τ_>3mQBCmlrF۾/6~vC{wi)4/mhկvfo bbrY W|Gu%*_ \ /i*vѥYG$]74aA_u}W՛P凁AIyv69/zono:|ߝ',oZawvD3: H ARgkM: H !  $$1( iDh K $$d H ! AF;SK !  $$1( iDhF $$d ddKII$dwdP t1[Υz3oo|c{RKeEJII $$A1;cvz@B $$0(HHbP@:ӈ&1ZHH !ɀA@B"3zwz@B$(h<9ef]$Dnk+_Y'/=5Yj,E] mUc)uK@B Fgi).|$_L}$])yX_x/}QūH pt+k#?ORz$BYA(ĥ~pGN`6W|n>|Ȱ`Rӆo $$h#gQcJֻF%|f!_k¡ .ȼD(dA~N%@@wv6cND*Y4翖"? Sq͏NN\m@B6):=t9YxL}%I!!&{L |ogʡ"u@B6+7G\pz|jYLj 3>C':=YMn] 干c?@H|:(Q0_!NLGuI<]Q#8t q^@x\X 9 ljx#[ i[_?{6DF;y`dgӄI4NV@SV&⫹ Zg?z}&%2Hh^$4Ȉ/awnpuq%Ϙ{!PdV`}ܤ]Х$eY $$ tF_A;CBbi&X0 b{»40K7#X"n#LbɶH/&wWM7N5شFbd$߻`)Mg>!:= Oqm mH|CV$rFFM=v,^dp:iNM*yb@;FFMEk6}!il2G5xG|J)47ogF9nއa%T*ڲIkҠAmPw( ǖ k6y\\\0m*}B ΍1uTz ޛ2c]J?UKcxWz3,o?ԱDeç`+\]cѪ X*_^ƃoAȔlP|ڔd}s|e*cgd+;6ѽ捣r"U[@el۵ 6s6d͝^Vj @y)MKе{_\Z<86 ށ`c Vml' U0 \ C,F`7;kVqwPR]ToZ 6ۆq`4dtX3HT,hHH65hi r? BNQK N76B]N,t C;㛳wQTO+h/3\V [yʠnH+B_ne5jJU637"%Z޽8/=f;[⫓Q؄Ok0e8[FtmS3jpͳ'r+9"B]{+gŎ ^ c$Auk&ۖ<6"H-x=`:uA$m ^7@MPHl ; hl' HTZMH4Qyzgⓨꗯ{Dqn,0375.q]i q03h!uX?g zДF6b`^d ?M>37 Η&'9T9Θ*+hUʖ9=GKE q@uVD'E/` Nj5 }+?וv3}*-+УG_\J7@ |l GN".%|r/[;PA |e󏝰%+\{m.aD,G*0t33q ək@^I97O7$o%MB jG4h ZYCfnCAx0ȨCKga5fD=i4$\mFXYAXp"oPK*80H6'ýˇaCvģZ6x5Vԣ /%eP˓1ݿ* rB> 68{JHԥ quBQaOC|U٘1v6 hjkjȈK@%ð!M7$h#kG: `mq9ܽ wqMrF6$X; NDH~iJG9h ^Aimw A-[,, {Z~cݎp'}} >lnC7GOAXj*GX<]5/$8{)u{e(POcɞȫ#w,C~P+ 4$@VǾ`Kl8 $N ?\7DC%GVx啵Pt^ $pt,ٙit<[!$RHXl60558u6d nIV,6) q?!Ox!NxES`4 BiMmD3H #9+aja [;;X Vp2jT2Vf7cV^>h1 9~ҥneYhndVBeV(P*>[ u46n߾{#fwj*0Whzg%E)/yȴc$E{YM)ĝ;wp-x O40 (eUt=h"=("7?_#l%wxkeԔ " I%_Z*C`_ }AQb Iݹ{A(,)%F.*'F3/HHAwR$lxem͉{aTZ{$Hc) !)^lE:^CjnY\`hCF=7J~͛z}ۖ]s}[H/)K $^zNكRvz yj8nvD>y2Il#'MB6A"/; Ѩ%K= HU奈 ӯYC൪{)}W.)*h÷HN&̴ aDU)du,|Iʆꆧ ɉEey ΫM{Cb"6|K !DlOO#/`_FqmM?EJMG0yf< 1KueC蔧];齋;*T:5L߅/-/ty4/.,FsoOܾyM{[H/]/IQZ\DH͗~!(h%.o]_E]#[ $>8˝XIK쐖c %<_A;e=ZK{|K ! V%@B I ʀi~#RHH !$e_IENDB`fotocx/images/KB-shortcuts2.jpg0000664000175000017500000015727315247006660015430 0ustar micomicoJFIFHHExifMM*V^(1fixHHgnome-screenshot02320100fotocx-26.0: Crop: width:648 height:550|fotocx-26.0: Sharpen: median diff 1 17 16|fotocx-26.0: Rescale: width:583 height:495|fotocx-26.0: paste area|fotocx-26.0: Crop: width:504 height:492|fotocx-26.0: Crop: width:503 height:492|fotocx-26.6: Rescale: width:483 height:472| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 0 492 503 1 2 2 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?G^jEQEQEQEQEQEQEQEQEQEQEQE}:Eg!<)\j:nl溹m3?)tFgɵG]$W=Y߳L~?B_|IOh'mO}L>I>Υ 8%,M}㯉zù4X捵űofi< ˫^!i7^;p# }Oso$SlQ uUq6?1]O8>$YJ#E0d'4"d,5v gxfQLm Z]D\zT<{ay+Ndo^2QGǫுA'{O"|;mz[;3ހ>>5x @GźE1r^6}k-v+:IFR{g ?S?|k159^ߍv߰/ᇉ<9"yZ+{剷[DqOzOσq4kiV-h$=i Մɪk ^2) <^^%&BoyvaUX1.Gր>c_ 7ğgo3cy< DŽ"ev\o~5x oKI^5 s < w>'`6O Oy kW=oJĿ w)ټqqxR䷈ yw+ћƟ~*G^5V"yGbRz +-|O[Bk+k 2po\{x_U7z,5̀=Ǯj><CZ~(7짗Pe&Ď$@iD|]O%[-oEŬDlqc4&a`ϥQEQE!b8 Pu!ˈékҬC.kXK o]#y'uAc׵e;ѼMx|pM8.zfKázq`(& \EY pF]f']imܫ2OZ/ Zzdݼ-ۇe ǿߧ-X=&,Dr' J`qA d kHǧAPe=jH~!\1U=[~)T=>1ľWW:̶; K(uozɡ<ֺM Ox@=p(fg$ ?ƏH|143Y7\ch@y5 ϕ?ƏH|143Y7\ch@y5 ϕ?ƏH|143Y7\ch@y5 ϕ?ƏH|143Y7\chohf@s+igϕ?ƏH|143Y>W?? ohf@s+i持޳?|14@s 8v z5m3Qɸ7YrҼwv-́ .,'W >?7\ch@ckyoscE9mi?g\(Ӯּ%#f`g;+G$ >W?{ActM ᰚVA=BOE_ns~~[O{K׊IظWJ o ϕ?ƀ<ğRıLIT‘cgƿW|tK ai ]K pFu`H7\ci? oM-|W?<8$F#WǾ4/ÉVX"'s c+W+7\chN4XULW[v  TG$ >W?}&Hw02H8Zhb!>(ZGrq485p3ۏ9 Ct水yObD~Z_ |C[?xuKUɀd?XM@dOP>ֵ HE6X .۸o6oAh[PT#[P-z_ZsmC:Ak9EKG"ڇu??=/jֺ:([P-z_ZsmC:!? lIҧ%f J*敮A6Q]REly/=9K{"ݞt|7ihrݽwfxOu7D&_xھi̼qxjzf'Z-mEr=̖v هyck[x D=Ӝ*f 1=3dѯOEz^?h_Q?ۺm[mށj:g=9j-:9w43"Lɯ_z<=u<2R[ȲFmYIGKFɾ0V}yGv!0`.&<: kFMiAwgCiZh#i{@|Fq+Ҿ",uH eWPqhk!S*`3J7_[ơG#?'|?.x?SԴipEab \C!PđGaXZ')]'}`5!"`zZjdme-N:jִ|7a>6K-[spXܞkJbS9EKG"ڇusj֏EK]-z_Z??=/ttP9AjehSҶQKto U+wԲFwHtgtHG 7U5?ZJ) д[YЭ42B_A_V/MgQ5plY`09cU)ꗺ'쿮juΝ{m,Wv剀$ex_ïS?S=&P\I'hQfUUY#;m>A>LJ|i6kZ߲-mpJOjW.Vĺ[_nCɂm #='bUŞ΍.z6FUFFU&qT<]3K[k,Vo5ZD@$>_-l 3Z-+}r Sg`ځ ?żQC4_@›]с5 hMAj<3ck"95) .ۜ&W8#=3_[͕α|6L̸mr[);zo][ZdܽU.ݎ}8o-5>;ݱymKG<jn֝mVpIőΒeOvH@֤̅#d_K{i7wIx.%:jLfj^Pl?a`.ŷ1dgj-z_Z3FjyB7Ah[PT9Ah[P@"ڇumC:GEsjց}DK](Of۪ǜH;QV>2M]'ޚo=T;OwTRr!yx[@IcQHfǀMQ N/v.ʆI6{b\?x:1B"h1Jq,iچ2xJIoɐw?x^h>oGpY] U1H:/<`Q nC|C֒*(((((>0umXPWӦko: e` i 'Yե7VUŢ]cؕǽLJk]OgZNMG-6zwA)#}*fkˡ|:4}0]?GNY-2P `|tM3|-ޠe]J͖9]WD aA|ڧ/~$D/[LvF~t -? 5 xľѯnޫm5^ ]ε UEKYo4exT}B˕W%_|$Q+3CID.n4,~W$~_L^i6v)#̶Ь^l {Wƿ- =WKB Pw _ &B.n{8T3d85HQxcA3Z_[,,@[ 3``Wj%V7sik Kw薛>pO>io('d`o* ~pγW2ږ鯢v8; I$P'$Ua&))sI@Š(/]s3W_֓MkAw?OVRJ.jSPg'NO =ٱMJ۵ȏ1.FOWKMOB5]> PT[V-hie:*ÐkȾWM(x"±\N!f;rAhRN]O֍xSZZl!XwH#9`8lj>SI-"VFUۜ~?~x!7pwgs9G>v,{$;Gk]DxS: 8#%ărb6eoSg Ks 1dfʩ漄o¿|[_DT)C@۞9#y\6qZ_|#}yJkkM:->y6yҜ~@^k ڋ :Z=3[Fif%t '#~`9jekEg:|#i>6k{Yƫ}Ǥ` b[fbUA9?gW@{IZ_3\jWi*IXYUc֟0I|5׼YGDKitwsƈY0ڼ3Sgÿ [MI_Z{$-1(SܚIwB[I\±jmzO^֬k(n5Y۔m߽43Es c>:@_XXjHЭV3D2g;mض=᷈<:Wt >DmY=ՏT) 9Eސm͕r !S#ekmsh DM2=b N;2ɶ(bX 'pkV|CN=}ǚ] 6Yi9rܚ~~_}w'QҢӮtY#UXZ8#OQX$Y⻱`U =ƳuSݓEk7/k9'NN:|=q'X3腇>2eIF^zŽmVM4o i1 հ2E}TemG_o_NOѤ1 ;WtTiT UOcq^E/GdTR vk6jɪ_i#\}YHens5}]&-mXO8A{$f&@57h~sogE4%|?oдKy푤/[$g'sڧv%Αeq|+s$ dR:am|)5й:]&@]gZaEPEP\?/In& POUֿsj)E3eOGWSZV& '+檞w34}F{k[eVuW|dbݕea*>oU] W߆W(g]ee_ G6F9aR撷OI]?=h~za6Yˠ_Km["L&V@Ki1h/Y +eV ^Z(Fpu|'*x!uo iv ,t5čfEMp|=/KǦ&$cjoLv xW }OGwVP-q/;155{Ojan._-,*Ua 2 xWş ]j=j6x$`ڽj4_ |;'M`Ka 5ۺ.ČҾhmU%z3[מ_^Ekp 6RDe& F#HնW=kZ>.gyy&E}q0}??jJ? CDOlty9F%89#O> 5uAq+*ۙzt!;l^OsChlgQGE)`Q+ߋ?WžD:\wa$Q@RK9ckU㿉4zNi%sW噤xVpS&7m^3KrϪAם~n| Cɑ#iP ##=OZZ()E%(oM7UĞ*&o\IߏƎK<- H뤿1(gZh /5-BKK?-gχ_=/3q[֬3y/їnթx uG.f21UBp_a^=4CoZ3xPXxwӬT|Ý8\w2QEQ@Q@Q@Q@QL#⮃Rb5]wT Ue\=Fg]|{Rk:xSJ+w-'iԸ@J⧮zo/h-ʍ:j69brϼ7 K- a]61SFNvG)W['8Px>_~;䵊iKosO<-G'89 _֧:ŝ3^3,5:0Djϴ۳ =k&Җ{q1*`7E2x=O@Gz|rMKyW֍lV˹F 05埴,Tjit+G_KE'&Fv0|1˧c; i:KIrFk>!|n_VMx"ZXUJ* P@^% zuEA&v|˟C|F|X|oWBaouۈ)KA͌oIXsaiʷcJJw5+Mv=#jßgR? bz]ϓ@\v/qd'þM6P)[p V9`h?wJUEUhm g ox:i;KmFN9:2N9#~3]}7$7,um;++;>X {['[f/E]| G޴nfq9|9BW!Ӵ_żǗR3 =n4'i3S$smu\Ahff &ApX-R!;hRJ (+'W;?zOi1ֿsj)~֭A?s2cLMfsoؘ$YDd!<ǥm.+%WqͣӼI,*O^_OZ{}#t( yZ3jjo&)d 9(3V&kEv>+_ i[Eym6.;̾1gVЯ.VkdY@.G"G|e3d4ubQk+Eb2n`Aj3>#셨k-!gn~6cy֪O ]] CS^3L+uYdj_N o[?znj:E_%  Cm_)p׺R]xXE1z7ˢ:oOIxmq'[X:((ճTU?ׅ|O"A"H-w#aEp|[@ πgޭfvfN{1M/b|ƍxXN,ͨ#Ƞ;n}W׋;kށcޞj-ʷ#Hm0*!ꏨ(`QEQEQEQEQE/|>tF&iiZa`Hb?ȮZ 60YHblz=+GWn4 A]|{wj#|)cM _D.i}:58/ ]@NXnoX[n{O>/[ƞΏwuxvZݼ5rTWĺNq7O*9\5ft~&4=J:US5.[=TV0+vy_YkZ污Akבj^ v%b"v œwKPI,vq)?.VŽY{Q_;~պՏ冝۟iR>_1z1G>t9;CdW]9tW.,HțV<{WhqXX|Qz+m||&_?u;wKg;K%3d0#NB6=qH5ct"j ݸ&h?CWUƇ}^ڭwSIEqmk9^.TxOQID[w,AXqHywU3X_Kմ8-,;;\*6~komuuR83/8sM_?'Wl/=Ls㟥|Ko^|jv/@Y"&/ʱX0AM+YtY}GĒOl/ iy#2Wk)I@ (W;?zOkwc[.jSUu?ZJ*L֗Ycst=?xhzUdV;*ma7^i5C(ӂBb?k|Cw/xOIxt$72B- iև톙K rZ\O!bNp^|u RԼ7u0hxH V'>bߍTNjRgε%~ӮhB﷚P{3/uWX=^[;RfUdp2`sUwfk"];5^|In^Hf2G4aJQ8'KᆑJ}7Fe8 N"p_j?doi<-=ηwEs@qT{H9i-4%Ys_~ 4}V 9s v`;@EjVJ%$$xeTi+EE)9㷾hn"xD #zgSm3WI|l58!?|ڹ_~7#Z{+yUd#(`}q^!|(էF<|6")Vڧ~'%<u{MO?Mİ$p2(}FO9I"u'ղ^6wi'^:vDliQOxT48b9Sz@xobH<.cLַ q eQʌgv5O]E5_[jZl!|ޣ6=sS՗_*wg¦=(ف $ |Y~ONk<3q-KhhVrG5vZ /{=k(s.c`-Y[xB/[iXL1۝m(ypzRR!A=-U `(W;?zOkwc[.jSUu?ZJ*LlG/dEƣ*Frl1ܑ^mHw&? [[Q^j(#IE+H J'`±'xo|/ğ4Ƶ>6(.w70)z_BBg/@EEy6kZ#R XVY7 >UmjcᾫkzTa:vuI8RK1=<|Sš4;Fү-WvJz 'z/mп`&/42>6,*d@]91M'+[xGtHQo"23ŽVw}Y\_i+2[)Eɑ8/ ^iKN _8,ji^ Ծ d& fE nONsE]-4=wN.o7pe@ W\= Ijz%څݽt72q=Y|բ^*co]V85KVTidFt F8x-|BEF'x0pS1;t"K63q M "C)2 25'~k_\j >4#&7z@7wc 5[]i> Ƴb44Cx kxVHAM`0v}Op8LG;zW|g'uՏc֕[.?:+[xz|#zqv{ȣCxSV&ﯧځ~#>.B%G+*=d1wRA%Hį$1־KxW'o,k/`"3*@ ]_ݝZ)QEQEP 7*OFvzi7$oRcGWoE]%эE$__TXl~=coj<.1O\_~:q4/M{{ƑE#zW|5~s#u /Ve q)Vbmq꣣bǬQJzS(((() |KO[^nN.+FiU|_7|k Ymu!մk闭oܴ8V 9'i_&kzhkuf('cOg1ះ> vױk* ($x#1o'v:$ذ?vVPer@>k7'Ʀ2]/-,)#@V%;|EGXuf'@BbF]Eri_|L𽔺W:fʷo!lׂNNjz|yOxF +RЇ.fY>4dnR+σ4/ mGe,A"'J7+;D㇁ Ljlڭk*J{+ 9m3g/_i6^33}]#@)>e=⯅9M[Y_xbM@eyx6:U?.'_~n=b-$G/k:d3Cn2HKT>GW@w)wEQ֚•$Z5mjJwҌIh"}T7_qKILVEP0(wE\?ƷZ]ը?ԧҪ_ ZwT"Oo_uڕ=$W:{?[m x]%90kK k^'h$;gxQ]>=o X.Kb]>b#TIkMVҢ~o L 99n'~ Ic)xA/)QI|x>;7XEyj%V\. *~`|GGO <V>}.gX%$H\ZO|Ulj--X .b^DrʸkIگtD>٩JH~w*A®־W׵Egu ?GJ[9+^`4dG3y%ޥ—ֽYhSiIpɟ2n'=+=ԗЫ-?hx.;N1^n)"岼1]6/|7ew!k%\skM#HWɤjךWV6ӻjrެlb_2 zsVZȎ3ু_Zasdř`IʑX>i4 xvL49o5~z 8>6aNOi-Y-_Qi6'E ]_xkǂ "Sk'/n4DAkot:4 Zmc=đ0F9f>ZQ,(aEPEPJ))Epzi7$oWm7*OF&4u~$__QoE]%эEIEWg_zuŖRY?d!w/CgDtRKXZKʲURE+x]5H/<P_oCa^M*=.;gcY#tAU 3R{]}WQLhBQKI@Š(((+~(|P4gxTPd9$Z񏊞>gÿ-&->{LHO =ZSiCϏ7\ F-yU2xf|?agu{sI/%4m#2=MfI]#}:kVd6Pw?J-Ŷokx kÏ5,f,Ux(?-9_5v# ]b:Vy'NMU>nf!fܠ{ףiڅʳ\F"R2-#C^xSai1Fx^9փu(NW *q%# 96֗4U%w;zRRj[QKIL((QA@ \?/In& POUֿsj)E3ּ9QlPO{=]@'=Ђ< O_uYJմql{`q¨u#`?h} M 3^#=c<-B8PhOWn$ݙKt}߆|/hf:v pbO\h ᨵ4 z\Z~eC uZFz"t|I𧇢;-?WQ(JdWt^8ׇ~x'}bhդSy1c3d p*Ϧτm$Ӽ I$Im*Sr, sYþur]j)lhK4>x#s[M3ĖE}SI[{]/\[fi\nÚ5Zj $OҬӭ36ݜni㚇){>{ hZ 7L;]v0eg#4߈4$z.$tCM+4xTq`Y?-#<>|`Yxa~0\7ַLvI*kpqZIX'xF{%o0vg8@|/|A,Y3404հӓ^]𽏁PΣ58JyGʎFP9CV+K˽gzvwwrWOG<)2rNBYfR.9VHYwjg4٤d*|ܣtu,Oi!U#|9Q7>jMgĩ3y+,qyR z>0y9_AS~}▼[%tAݤ(}2{O/'l9iVu}.k3[5).SIM/t0oZw6v٣7eQs}MvނNQEQEP 7*OFvzi7$oRcGWoE]%эE$__TI/-~"|Kx [iQݺCW7ſ^-:,-^C6S}n\T,ωN35y>"ּ3r8uXomZA;8~"vV>vX)j5K;)dxʂNi9oteߴŏ4"Y>ȉ#(YZ|4^K^jƍ1uM7?27Kzl֑- 갻S+ 5|M>xKZ=GM(jB푚&+hoO=Gx\$:.JC gDX6ЭWP;=>M$ʌ>ܐNp+/wK>/<}'Li>v *+AʐufJ> Dl<]o<7pyaM~j'~6m h6$w݃0ۑWg\_m_ޟz@1Z_ 8p>QiW'QP)QEQE$xFmF{f9e2>\eK3C^^;S(^յ 6A#+W#(<g^mLҴ{|1a4#CLd@1ILjhV=ޒ5JFMqֹ?x+M牬mz\.}MxvJ:GFF99'|G|3 =wT|u/8`q6xRI8Ock_^ .+&lBO*';{gMv^-|5 2_·rlnA*y/>i>&FLFѯĎwDq]Z}(#$@0@tK[vhkcτaΫ_[w=$6RAkXJwmNMC0A/$:zqdD[󁚧w^(Ga.ZFkfI>ef ޸O?<{w⏈AӮ}uW% v+ZзGs sDHPrEx|G>(< f;ri.گ"'U[M{6bz}7T q7 ~#QD5zu{y,ک&Az9Vӿ%|uh[jRZH"e"de~9 *Tㅗ≭k~a(iH/h#9Y2𗊴Z74 .Ym]K Ω,-)c=K2(8#;˫:vi᩼o'SI0N$D G9wflzH/Wxr >K,a{7s'߉&=*m ν|6 d]GO{xn]3F>b0x=kɴ>9Դ? MtOOE$᧝Y//AX |acږZD׾m֡8jgsmh +t K]nK:u:lo/&6=9{v?! IMw{J"o)!Yw{b-?Qqn)֖7Vƙm=+a+`Eעɝ 㝣ҼSV8ǎfuO پioX#: W]$1$1N;9t>4mMI\mWp9ֹ k<-Ayo-PMg8WƖv<5ZRihҼ=ss4tXŸ6ܞ3^3Xfh $O2o*M2pzJ[_ƻ4$x+c!rrF*?<{5Ytƴi8#w;7n%ơb~~qu|^5=9R$X1lD/Fs4kլ}+Zf Gakme* 'vk,FH&6ޭ(Uy?|5_H+Mv[[ wOv*nto 坞hC h0q4贻8lEv]gT^Lty쥩Z?. n"TYm`ޝWSVv%;ݙcK m!vn1Vޒx:m [Wn1ѢE(M: h-㱷k'*1<ѩhZn|J~vHHcƊT`KKINJERQERJQ@7ޚo=U|MʸѿI_ tF5x[@IcQRQ{|u2ŵ+>ۈ,euMנҾ26/Xlm[2Q9*>gtzğ/Sffڊ[tL>bv׆?q nGX4'!$h'L;Ƭ1!>S+_֢=3ǻok:lZZ\@n<9l`8;S~|VռM"ծkHtXf1$o* q᧊=neI'Gu&3<i~+Ǿ 7:!5-CV]#Tq%Lbd,ߍktdp ~8]Yk:Ns;4젍bvC]?.ik,ÓIkw~Ӱ'1aϧCᆥៃ V /5g *d0[t _iP$\KuyE$QxVnY9%Dorޗc>mkgi$7$V!s^Ev"Bo%y#2>=\WM> xKDNOo%F8jO-O-;mpV|=qq:i $sBv;(Q@Q@ c+ig/ KiqAeF}FtWOtKHԭ/K^ȅ"d` ?*~өE 95xVѬ6Ke쀅{uCO?El5 }g$LY IDZRYK s۝&M^T#c69 2 ܊ϊ>g=;F֬BMo{gqgP$F^Bsnq |Q/":QS\ff "'r[MNϩ6^+v3jr1vX@-hoc;JMWRHX, O8w;>-Gt fk8ngmdŸd!8`HmÜ9h߳-<; Z^; ߹}QIn~Fs=.|+(&_ O0ahd"87o-E׌(#|ڒ |gItU^_Zk_ ZwU]kAw?OVRJS9 Owj^i}X @v0ICNZt/t-kLK,xR7;ACkcq~/D~cr'5.<=/yn|EkJ f EpzirgwZ ֗SZ"ym2wGs[#tc[Oq{-IC{l91ANP|9-D1܃;fi!:$ciV:mMhR/hma!ql 嫂;կO>궺S袘Š(((((RR&o\IߏoM7UĞ*Lh- H뤿1K'9ĺpl ;[1YHl5OxӮ/x[@>y]M0W`?<3>#O x7Zf\Yc<9Qi'sW! <u~^!Z@tH|eevV'4<7mMjYZˏ-Կ*̙v^.s6j֓[h3I+[68Z8|<tX=hvuFo,<1;rSz6fMyJGjZ5=͔-} bv]Px_7z۽ Ҙ] Nx5_]ׯ[5O `4p@o0J2ْ^Kp dCB[ۻr!p(]=- SIsi@Һh\P=5c-GܖXgn+2׊?&k:Yi-mlgg8|Ď8'R!4Ij?hO3Ċ6 | ?cxKZ::\nT7lQ.ݏ8كX5Ω;kqK{uyp[΁#b浯ZiIiZ^5ƞ]l- 9l;8ӧgƭo]gWҴR V1VFQ6xM~Z&8hڅΏeǥ]k!r݅ 1xįxx[W?4kVZI3)&+u/r+o?e[j:.6kHs8^qH∭"kv},VJTAF%/"((wE\?ƷZ]ը?ԧҪ_ ZwT"k?mo]ObfeY$X=I ~c7no{9?6e ==^iV,'+Ц'':Ȳ>hi]笟(=j#=Rc7+}z}6=Wú4f]=onNJ x?<0#Gbl1T X>˿ =燵g;cv :im# r{Vǎg}{ž ԵQkc}~-Ss`$9Mdpsڵ5:ax-?W"+_:9 :KO&O~_W|*k%P+&n&Xrwq^jeZ{kRxC^_ž4=Zj,wFH9IҬ@HP8Qt2R1h4PVE%PEPEP\?/In& POUֿsj)E3?U?%P[Myv6+?NjxZ<: tb[I:H%#(f|fΣ[WI+3 tu]f :Om4,8e4ٜGӶ|yC_:$-*ߥf (v݅ sU>.iׄ_:O.tma$RUY6 m>ׅu _?{Ė6adbմle!#~f7t C㯈#fme[Z"{IwIqT /ݤB[~j 4sgNY7#ˀF##@ϥkh'v_|EnQw08ƟV>g6*Oo2K]pA}+?GŸc5՛T72,GQ} EyVi<wQ׬_]hy ym [~v]1uVl *.,YS>RFkό:>w~&u++:8o)O,·wWo4VuiZM^,5(F p>K[os%Š(((((RR&o\Iߏo?ٿ7$?C1"Ƣ tF5%}f@ki2_X ' d֨xO^)5m'wI|zo ~P/[NiZox-wU] [쥺8 e<.|\tw3nchF)^ъ@rA0^@( q##f`)QEQEx5N/jIKha2n5> XxG=ׅ5[Itq-,Qskgƶ>Α Fe.;gm$u?__~'_^kWG V A]߇?f#’ٺpSFJļN2ۘcu*icE۔I>oi + ͂=iɰVJ|?@xN_t FZ?Wa$#1I>־gg-^VK}J;W8>׎j_eExQ-;oJ(Υi?r3潧>𗇴Jimc'm; :J(PQEQEQEQEQEW;?zOkwc[.jSUu?ZJ*L_|ֱMY RV*#Y_;j7$/XXhV׶ lط*!_ "ѯ V @b@^G?ٟzu<7{ĺ5kg{ .m̒1}>zSi9n{⏃uu{-Oz-ƠI̮f++uMWLiJ mEm mfFLj|ZCMk=SWCz|L8S;܌joğ|"صK[;_KYav1]q'橊{3楠Z!ݧi1s+\!ja7b=]G"yh ѝ][#p?>"x͞ Ww6kqo[[>%b! } PЭPvIro=RJEQ@Q@Q@Q@Q@(|M`N$ey&D5s[ܱU~\)8+Ծ/iKxRU⩢Ch SK<"H^6#qܪJpjd5Ν_ihOy1犃G~궫O[...ԌlyI\PrYrWmK![JqK|1_D u-#Xm`>ڥ@':UKW4Q;k%>"MWHg׽A-2+φD~7G{+7|^k{{& ggHBKRp>=|2D_i,Y$s5nGV=U .:7z֭N7YWj QAAEPEP׬,7Z[k>%]? ]\zb9,"`8`E}:~5j WD0WKHkRF37i |oI>%4.]JGh_U1aMjg/_=WZ{^c޲(0CCqWik)Z.âxW.G. !T#,|Ee [D"u2[&F3z&mt8ƿX/,u)?s\H\ ܒrY5ISs{>*o s[זxT֬/0iI2=kB@VlSMݙuv=E|hެ=^%C"D*[jM3g3OyNs&fC rs ?|s^h [9Sך7|*gӭd.T72f 9LW~^!&{qBd}=gFY )ς5o^iOo=":~,=ڣ1^7qM/.q^ĺhK; /S0$ +) ]GhRC lvL ԓYݭїu(? <' oViNK(@"d3$Vljex)%UFOm?"\ 6:dpq]zxC$ҭC[c<NsZ-SLUxtQxR|][ąF4$A +cѿ[/!7O^hN ]VY伙]#@dtxG 꺾iQ0i7 4NAhr*H\njxP0rE} jNr$wjEW.G.ցKuJ.= %M|mtξ%M|otΗ>bƢ //j*J1 :gz6;kB[r,͗ƪ|&CᖇxW|A}z8ig]1$ȯA^ h.I\me3If I OšQ 4n,/#G珕E>l{]7FӼC]J3j04K8,w7#Vm7xY|?,zlI ^U6ZHeֹDi6Ibr+{>BdD\q,o$Do=D2ns{d5i.a30X2[!@ɾx?#KD KuN ݹ yKM|y h|qoxJo jzZKxow,2  pxu? ū)=_,_k5 ]HL;U p=+u7ƯY\xng>"AuQ0Ѭfʪ@Z{H#Ocv70ǭoku-{? a^㯇~ |Gx]m3SdSeb-H +Z ms?/<+^1vztZ2@dK߼X >57P^>$:)hbc \gp|t^٩~~|Mmϧ^-嶩 0w1%"M<oe}m}mNWS1lI'hGZ_Q񕍯mC+{UӢRs{®x'IƩj:|Gw./w`vIlQE +'W;?zOi1ֿsj)~֭A?yOi> xj"OX!C3@ g~uJH}6Uu;-5F%+ڊhtE mN+;; 6wv5 pwN{uиvYQu_9rAY<_-Ɲq+E*/C=*Ϫh3ID&q)0m5z&J,kHȪ͏ul>74}o'hX~ ߈;K#'pYdyI| ~e=3ρrk%<StJ#Η_#_=QW*x#M\?y:>PcW~;Pu>bƢ //j+lxr_4io[p-ɚAA_3x\z)q]5Wpy7מx_uw<5ѵ;cmmߟ)NIIF(1Ʒ> Ws]^S!X19_lNsxYjֱC#t@M C/m]-.$I$zմԘ g|C}4ԭ$cHe#w^1]G?gjZC~:=żKfJ6^-3k;  Ύ}"1r|Cg]T- H]4 h >cҜeZ[7?Wk Mou>=CT9-6\/*}S\ƞ9lt96,O(<)V19j .D~;C 8F6??_Fxׁ5fYkf-ַp)Sq: =} DMLjYb$0@M_2Rye_Ñy- o6YRFGhEb,wvXmqJ^튷s_Qth'|1u-3R,n5Rq'W=狼}A|_{o -M`)%YdyT ̧ "'_qu}sBP 䯘r~`LCeNEk %7΄"մ'jϢ\"% F7JJơDN垙)Qcwz+=_F{-X(;Gҟ|&{-K:BᎴ=z%-%WP-%PEP\?/In& POUֿsj)E3񞩫蟳桠kqpz":ڼo\_cbh7uŤ I#ug5OZRHeŭS#p$eQxzkko&ktTID.K`ZFrY471H3K{ gSy_o~RGPGߏ}Njƀ6>ȽV+t9^z|«x3o4gƗ"t&ZfmQ]I';+5ikzڕ]fَ )֩v^ FŸz7ĻSLQhΜ= c g/W|O|8nuWah坋~u ߦ=RZY"tRq_G@SlW*9=j){IqAb@_G@OWhOgȥ:Q:U(ò)a+a+v=p_zo?zo?]i>=;"@OG@OWhOgȥ:Q:U(ò)a+aij>UQGvm?M[[us8:K쟌r_KnZI$K#j#om{w/O~M'm/ xv % E%X|,C5EukUA|O |^Tм=e 5m'$c ioq=Y7MOvרs.n$2)So^5|aT|;սl[ •sk?^֩qhv2ldv-4:;M>% x``(Ji;vn kv7ӴoV9/uDysR}ki,t͢NO Ֆ6hr=*<`Wq_h55nhA' :xXlj#4Ӽt_ Zދ,p2Ǿ5(>Ut>j/먑3YDk+/n yC?%#li-t(=FGc[fk0%k 0F00S],EQEQE+-(`QEQE^_Z諝'k_ ZwU]kAw?OVRJS8__xL!l~$NcgKo@z5O ^6.#ŴDtRJ׹ +U}PbCsx5s~x_MKUSJI[t4q `N %h_ o/Yk>~ 'F*7\Q)r8Rxƞ#Ymjjњ=yHC->01F/ Zy[:$6K2ʯ C\~-}>'v6 >GEĮQCtÞ kfBv^ÇLj ZC>./.$ !X#W;{ĝ3jWDCkKweExK[qB?Ŋ/|Go]^-$;JH+ x^ӼMeZZX%b-lc?ZOu?sAKQ'tw@Ok[+H/~ %؅ Akѱ\W~xƺۍx @K\瞄5ْAkKZ)M%!Q@Q@Q@Q@Q@(?o #Η_#??o #Η_#`}]%эE,__TtjWA\?Z.|U-P4PK)(((((4PJ(((((((wE\?ƷZ]ը?ԧҪ_ ZwT"x?K?^'ԿC%>_5>-%m6/= &(Puc}iUg]77R[~eݑ5[~̶:,V OTM7"(Z%`Fndȧ/s [}|#O4f#n ܲ)^G6?5՝[շl2JRI3^5Q:oIŪ$6[*3~g NzV5YýO&uOJ&Fi"\hoQ~ᇆd9j)$__Tt~j/WA\?Z.|UQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE^_Z諝'k_ ZwU]kAw?OVRJS8oi">]xNo#3i̖fp{z |Qо xssh>$|gipsk\02YbX.ܕھ˜4Ӗ7VsE#v5߳Okoj/u[E{R}G cE6{ßS?kK.-cf"^q1׋dW/ 7N3-ϓv{k־#{ψm: rs}bie}S3jڝdAY Мr)Mot9Gvp90=szψ5XFk*ѕkjçc_o%u&RʘuW2_֖thOKaBėZۣ+0w's穮yý m"kk u,rԎZ߅_᷇c-zH}EњDڪRB}aJ`ALcnG¿fK#_ҙ.<ʾFwWO.u{aOwSns|9Z_4uqۜ1cܖf?tuo} QE ( ( QIJ(Myq'~?ʻo4Wz71"Ƣ //j*J:?ȵ|\+-E_?>J* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( |gItU^_ZLkq5?ZJ* POB)7;x|9z,59r5o26? >=aX-52,k2b?(sko x4Z>5ŵݟ$֓UyR:ڸ|u<:v1mVPE9TVsgr3E%O>( PfG[mx~{XAe6*VRBj?c7V+>C\ikYR[I!v2uGj oI2Ŭk]ڋY#u8S8'':φZ/&xt=_RdP`ODp6xҶ3KC5{3:[YcXw0;#Co,d!28='3x>Z(,t@nKȻ=k|]7/4Z8{|:V\W3ο_K]Kib H>)ϭg{}<ź?<)Ig;P˾6-מk~!kKK^"+#ͺHS#qJ* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( |gItU^_ZLkq5?ZJ* POB)7|' ށj+q$b{^ g x8<-?EHY`2,J!vZJ/ h1IVE)t+D6sW>i"$fiul6FpO+=`dO#E񎏫jZŽђz46%*l*r2 1u OgCa[ZKl>nMőNϛp-^> u=߇ t5{ Dpjom?P?ayo^l5KIbV( KDaAڴVX-O8O'٣d{W6h6UFϟrQ| yJL/ 9!NL`m^< Wi_ς {M\.Wx-K)&^NV2~;mZiڜ]zȊ;m'4 o2y.$wcwFgv'1>u=zi[4QEQEQEQEP 7*OFvzi7$oRcGWoE]%эE$__Tt~j/WAXF9E U%RPQK1@ E.(%RPQK1@ E.(b\QJ)qF((RъJ)qF((wGۉQx*sVf|&Q[͢If~ԷD|OlWF/9(4;ͦcmSʓ8p vn9 9&|@/M3ǚ.R]IӯVMŬ.#Gipjğ[|`浩ݝCE764RS7s^|+o9nK;ȵHmn"x#5'u࿂?ma[d [kq qh mq~ϚGNΪ4:G l r ?ex<o_ "׈4> qK8P\m猸}oݧď6 +K~NpP@i5O4?A43M5~8nd8rĎ=1Q6)nx߉6MmwWOZ}~׶'kyw14aP @yM[K,4.{bkr)'dWe? es /dn:)ڲ/i%PM. 0̽QcIxHB_ vr]wqđE.: dr=hb\QJ)qF((b ~&o\Iߏho=T[@IcQGA:$D ^ը(Ӵ{HkkMV[$Vm=ٰ[ DhL6O?G|MCFյl yNy⼓V<5 k6i J6㡠6=o>&?7xS ķ:^RCUO~qcFiux60+J#_ dgĸ?yj?fXԯ."r61]_ ?Sɯ۶vƓysωOŴ[Kl~$S^\}D߽12>pGX_4EKYUmF#H<؆06N0('d^?'>&?6O?^iύQi^3w֚vt%?/FAk_ d6qho>k:jP#WTďnwAFj0Kcaf\'94ElK|7?'i|6O?\oi'׈ MD-ʐZz!C{\މGh6敫KlE"vFڇ~=8L:Xl~|J:_ d%Q_kWZET$6 H늚𝿄t=_ZԗOԭ8dv^й#q[Kl~_ d6KԴۘ,.A<-u2V[Kl~ӵF{3}YI?oe$lgwkbEyoi"$ǒJwci(omG^}wZYT~W2*^x^mJmeҒ;E_~j(̼9>uM2W.Igۺݛ=: |N5|/dڥL1;'J4P*<;a⓮ oojyϙ;7ǿ  &AX5SibPݰ>;F3]ŗ]x{lVKWƛBȬN\qW$aXxVj6Vji8$^z޺ KZ|DEj \!Hcg_!KԼ;Kö?ux-ZM^TG]Lv@ RnxN,edNKo7=ҷ&X/b0-[EN!ͫ\]0'8yL:( _ dgĿ['(;>%?/Fω-O?F|KAm/Ѣ3_ i-џ[Kl~h _ d0['(t [^~۪Y+22qjq)Ɗt t6;vż3ފԢ<[^a{j4+EA$Zt+"xf\gotxRZԴ.[ѾϨLldQQL0=kx%qis=:"'/ys*tyecHnFI)\geSƩ>+_촏\ OLki ۃ} x#=I9tFG\[^<9r{= Q6E,Ww:*a$9ǫh>|55/ZjKJ͆/r8.{'}X0;> ڔ]|}I;_^ x'+{۳bdX89sq88\OzmY6]\ZEV߇f4_Z\K,dg􏆼OkxZ`#VnlVyL&@1P -ZTbXR5< $v׆ ̓aOa:IJq"R(J)G(+¾;x|g᝭yh5Ỗ.-рF>w4Ă<_vwHޯ8K4 K igyi&eVB. }Fe~ |Q9Jm,bMOsq E4,Pǐm5 3(c ~G^Y?g ]x+O]KIoJlg'Kzr? ?HkD%_QJ)G((E~"_QJ)G((E~"_QJ)G((E~"_Qq@ E( Oyxt#?¯f8 >{@*hQ}_?¯f8 >{@*hQ}_?¯f8 >{@*hQ}_?¯f8 >{@*hQ}_?¯f8 >{@*hQ}_?¯f8 >{@*hQ}_?¯f8 >{@*hQ}_?¯f8 >{@*hQ}_?¯f8 >{@*hQ}_?¯f8 >{@*hQ}_?¯`}-0Am=2%~8 >{@*@Ik~Gxt LR`Zb-}/QUNvN^ ѳK8R0êҸ>{@(}_7t3@# ?Vb-/QU? K>n;gzwRV㴂忷8 >{@* Rxkpo4/.z"BR!@oq}/UkȮx#O\kxFyJJGT> ^; [֔kdS9_oq}/T7 "$ eq0j4ya2:qHe8 qv_{Z UuYCi؏ʁ\Ўv@^c~4T(SO(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5k^*Vzi2n#D?z񟋾>%Zl R3+Z(Vxn?:wd EsͿfoWz<~,^\<سOn¢p)~"|ke_PxkPm?YeWt~)4]o@<a]ܲ!Iw\;s|g4<7@Ҫʮ:UjoߎZ__h~l3.okm8/21 ) y|6œ$]&􀞾'i<c-hnyU&L: 2+޼6JJ  %ʕxo <_7^yjzuޟvCsTI$T#Qo5STuƃ.Z]k$RVG2upkS?x§Li4{9xuedP21U5OĤ5 3jXmbRſy?7%7e]~Wzŕ΍M鵍2m&Pr"w*<hy~yxG4.oAy}%ޤlFe$?(o4u,cBa`HKE#ưj_|BӵcP׉4]GʋQk+c s)bA!uHO#o6EԯDwwSgqPyf'g}2kCKӴ 0̤3YTw_uK.m,iKx#~XfcI^d İ^S"[-z<~U^$;C7iZU7s${wǵTL VyaϷ֣4菜5-[~]MfDծ~ק^3X&vm)H>i IeI'C$ԚGKz_/ob'e(zax|}Kw]\u?} g8WC4:}M yK#ҊDd +X( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5ws]=ΝxI${ձEg\َ:}zĘŐZ*(pڽ_kCV ._ΑݤF}?Q@oTrn6%Rh7D4!/?]P`^gzb?UP4g'XϯJXXe7(zL줙Չk Opb;-Z^M;P? 0 173 333 n_2eXIfMM*JR(iZHH0232,0100fotocx-26.6: Rescale: width:300 height:156|m` IDATxgeIY _A`93` M Y$ÐT 9ATsΞ?|g=}okթSUO=Oծ,:AЁwqL,:@Z,^tXe]Zk80:֢FY kZkEl X=uW_r s.cX9xG<kmx~N9x6l{eF>T~^WB窯8Sژϓ"Es8"`Mpc繀`L&8hu)S=WM1Ѣ^^(/K&zi++]]-,OFyhϡY"EI6NV?ۿ4ИҔiV'>OOh&pu4#ŧTOGX]o]-'Sǿ뿞 4¥sY]|~W~Mrx&L&2й єw󝫛}nGXHAJp@@Y?xZrʢ-.O%44\=_}cSݵWM/nu`[2\& ;Y.Wׄ: ?җzk_򕯼z{3MHyD?>@8-|NU'^Yt7z ^]z_?ե>v)oyG?k//u{~W~eGҒ%y G'ի^ _zqٟd̻)M[LpuWoy[V/zыV/˧vmXmW???x8|`0җtj>Fя~tO~r}___=1Y]*WY=]?,6*ki//Sw.cc-`PV}sWW=VϮOdX0xVwӝ&w;aG~'ru\>~= P}w~_{кw]W??6S:^VW_&?~}կ~wbR5UnRIy,H,6-nr7a:ozz6ܭnuCLծv XR??:d7s[+K/Q /g{S?SSY&ϟ[]:Yi 뉅hO;Ç'@_ Mm7YJz`@oiO{7g~gVgFKЅ*SXVK<_7-ۮykNYt߱z? ,LJźL,"`,!s L'Oy0O? \-3֟v,'`r@IOzd&R>B'MK 02X},.t MUhJ(՞_8QHw闶VLRxE_<^Vv4c1U%}wp-`mӍv/<؊&_j:-`QN ȏ>!8Qr<0aoI[[ӾSOGgL6@e9bƊx6-yPy{N֓dOjbհp^[}wug?٫C#`# N bjgPYY7@Te}snlvn,B_M%Jv Dq/}O]l X)`؈V4 dY :Z*0YT,,Ck0pAQj,~ϤM4&he`(ͤ6Y|a!I<֍>HhLT Q?k3NzaZ۹OY}-Y !P0A|~~~`Z2k'C7g,jK}djo1OV'8F.ek?_A,Ydtʀ3nomw2'uj8ihcmr+|fWvioG9bR<$gP`8YC+Ji㕂W`W&e2KGx"*+Nh5JVKyx V>y(hF:Y2+|G'''hYknYoɭ=2_.Ρ~*c#sy xZrqSw|O郴~Ǽ+wzvk9A툀`) <5M"ᔣ25ы7є\S;*qhKL~ɦ?jL6R WX`KOqJ1M8^8)py|xUp@*Cx0Udzpys_S&xM&OSԑc޹2$ѹYc u?gi\~H)rf3s*sKgKƲp#ݸmNW}h ?i9ey^^eukTwc5LSܽ c)w‘Iˍ4m)&b)M:Oyq2d7ϵ,)Rv2:c笝oz k^_J+|iH*7-ᯔѱǁBQZ'}ž!l)XkY&d[Z>+dN|0_2{c*ch  s VK5@橥}=Ҕ3Cmupc~F/}q `PlO_DG?¼|t偗e'XO]l۸ ]e&`pV:OG,I1TdΒNPNa}ӴqlJ_\ (G2ۨdhH/ ;j')y&qb'_iō+Ge/y@8{ s֓FY:F6Of7'ZœG׾דfm7w_^u+e(@lK")ڋN2o%hFe 񋟴Ʃrh\Gr̗3V68uZ 7G$> *:WF,i%P\c?P%XMq8J, }V_'w ߑڎGt[xS^Fh3 yK@֔>'}>פ/^JW^WD~iZvsc_݁꼍#OD Ko My] w/Zǂs`Hð_r?Ɗ,tyH`?xP}i|3^ JCx[k MhLM|0)<@KZHyC/Ȅ3d,)6-/9BSXgb:kn@ 1mn8Z}X{\P ]7>|km#%?>7~m&5t.?4x[2u%sbTK^ӿ_"q#m_jw}7YZ4eʫ*/Mr񜗉:Z`#ˇ,yW6- X{5ƅΟuMu'>hOda_ mS7OFK܃KVVy /|i dX-Ǵ`i$_~yFk*OΡj|ӫҋәэBӢG_ya_%eiZM8?[G.Ǫ.Ξzи:sp eA+K]x,;HFjFJstlEXYgrN?uAl7͵()?~Ojpn~Mx_|e@$|1  x,z`u,>{qʎe*zj~eљKk<)ć8!*Jcϓ& y~5qv+3ozgs25Cy&[;8gBSJG&\7jZ/bXFip\מ:4 rx;ʁ/!I&4 NZf0DXβ^haq T=Jұ1ݘW2#F9 4 Huq$ }+[} կ~d%!qy>g(0X[_ïd<2k/|aWex+.}KO<};1} ?O=խ hV,S# Рbw dG%^NhF#p7^s ' `YUhԏf;,%rtk]ko北S,\2xjrr7ΗKi>#i:^MnD1|粗t]_`|m +w곴)@o-8m%M=vm[oJ6|88=wUfo˶^7%V}^=qt*kF|̾g pR2Efi{ӻk[,17,'?.ԧ}XC8- AMX:,(򪂗S2V4xKуVm k߮/c4tx_ݼ˨MeF Kgb1[Za=K.m =P%ÔiD]ߪo:ʕ?*y,CMhezFYR^̶$+ͼ2oA,`f.(ukSbK OKHRҲTmq ˫~;"Y5xtԧ>u_]^}~4Pwp2gX4RK?~ZG*_HT@2x<עnf IDATgS]; O'`Pe3Ϝ$syoПPa,ط>|<d> B>aܘe#5?Ǻ51`_7Yþ,P\w;s&sa"7ʹ?Eɔ3i ?;w[V<獼Fٔ.mtM\Mlt3֏%&8g9M׫! ~/ŒbE[V_e1ov kJyV</A /~쏡ZE/ziS9<Ǿy#56Aؙ๔Ëen<SӺ_/}T_||yc}FMh7g kŞP,-kcXvڴ~◾L%ܱTX,& I!zp0(٤&O?D߱C^SF`mel2`FsaSHلtpT u\y?vEIϑVz,Ǣ:v^[Ys|V╯̘_r`JZǒq~W+@[9Di"`K@'v:@x^4Оw 3{UW Ȝ$6>kܔM^doV͟ aL1 <>W0>®4um(S+.=>7ޅ7[ίޝֹU3K䜲q)7׮xisgzGTd!mWڜo'׎dN>%kfKun`Z<8< o}F`òX(82ҥl4Q4ud.4+]wʌ:I`#%]xKmjX?h*S3oWt痖,G[?OSfO8yc8؎e?w$s1^8vnhӹ&7_^}Cenr07a= b}C[b%~o{E>w\grV8Gs~Ԏ`9'^ڎN?OĿ:?tcРϡl tܜOsKyFׄ +/'^kIv,7*f;U݉]1m8ʖV|=>I/܄[2bEػ䱹m9gm{D{&9>F`/q@'-<;/Io j_9_I5pK^' wy!74>*7nLׁ1!M8h\h 1z\.%ttcx몞GhˏmJe$/N yT*؎MS[›G/Oxe< n) k}֎'d%_?>:Zå&6&^}XS8o\?1=Um?OǴGҒ6y+ _~|2M?ҍe~<-['l>*6}4K8u{i w`(U<)Z +gxgi4#Ym夹IΥ(+ 嗾Կd .,G#M1ş\#t$W3zT5vZsKWqWpyRntʋ漪3/oIs9_ZNԯ};D7A~m,W%>o WWeĕ#k冲c^6+:e\+2G7UϜ_hMO 8%)OXIɿC;"kW'P(=iOfܦ9`eC^};"M{le٘le88^hsK=joEStNK1W;E˯-юtj܏GhW} , ƍq(ϬÇOO:E |og8tsb OYѭ >R/rRgO4̩[&6yt /Ƿ >@Q|L[׋⡭|ځAm~KK6MscmqiRm :N\>Za~wxi\7WtV|4wIG?-_{QķlOi1(3ئo듫LiTLɘ(y|LYsR;)u{2#[Ld@._LG|ai4w7z\UO R; +mtIYK{—-4&11Y$:93S12ۯ1@Q x;ڡMɴ~vuizMNv@/ͱ8' K97Lx3J֦+?vVoyʏ$ꑯ<ů, tBgp ('pծ6Nn =!q4^nLh8kr0]L9毾ـ/?sw 3gr8e{+\a T2RXm^p&&%o 7!=9KVpEaL,(V+Z:uK ae[W[Wvj<$gmXl|XDdV=yB'M}.q~to姓#EpN4g?rGuwF^RQRcᰂSTJJeg|]n ,5X,!ߏW]Н^>K;P& 4q,Ll& 1Ls D A\_pJBiʓʟ"IFLGћldV_8nnI Zd nxNj|L䦁":˲,fBw٘Өkˍ;tYGmQ/S=Q'KQ7Օ.cW[+>6и6Tǘ&\ҫO\ƑQOV~3l|D":ؠ7e!%!4J ,s;Q (+РÒ= &$:KHEOo5 Vx;ciXhgxiaHt?3'hx89#כŖǖlP? kVr"#!7K7 Ǟ" PP,|8>8R!yȔ\ܠvL@RM%$;m<7v@N'ӳ4A/I{>< `*tWY羼ݸy1>.Ktio#i¨0g`u:&eplOnKRL4M 0da_{bΟ6Mv;⣼b8 '.ȝ`kB}"`:AlysWf-cܨdBڒ\GJ 퇱o`*ߋS~|2n_XEh m\8BOc HX?|spFByr 'sL܌ȃ&}0KKf}x7a)t 0i/ 钛J|Y7[Zz2!/n,һ4,X&~ջGXoq R6'ϱqҎX \&,t\٣aeB9>n"$ptWp0- %@gIk:9MM2w hI.HYp@Ǿ' {[)mxM&7AZP+WԺ<&+~t.K__=9ڷ՝{O. ,SdR&3KB'kIcx*X>%;c+lI)hz9iђ;zXDZ#Ox [h^/M|+f;jcMV/xo ]gvmˠ4PtnR{ZgQ8OO,դ7 (3Kycr[rȷ,4XfȬ冺 f3P @Lm1*0je2㨜d NqdD>k_Ξ,u(2y_OX>䞂kk'{th4]f},ȃ=hI-],!e, !ɜ/&_4ɽxS7nD'=hsvT'7KnFӳbq"cne>7f+ڭu>>OKGC$FCݘF.7hlV'<&& @#<cu˄Dw9HwG dgT#Yaƪ-֚e 46d4X3+P,-+CV"n#{ p}bQ^V"6\AaHq`=QfgfvӒdA&D] H{Ws֓=\ɧɃNG,݀1fcn,mK]Њ gNQ))s[/5+$T6P pߞ;;%Gt&cbQ|ፗ&.`>G__< /^^~ߘ MhS8+4c['raQtV'ʲx性KnRSuX;%>>ntE=,r&m?{A-j lng_Ț5?ߘV6qN{[Jf 8!x>GҢË`U_exIGWC',SWeGޕGi+'mW ShPyF@,Y@>}?=LqY2^ >U>Կ)K?Iη`ݺxA:mOčx:p~Xֵ-`RMpͥ \NK%ziՉ|c'M=q~'ګ\<+׀J𑷟vCiY-Ӆ/WOiGh@|ӑd qDnRV7<:Wg& +I:HGS;y9yHW7Rk[㦱mR/(7ťR~2&_Jjg}:;C,9n_,gAk ȶ17JoL<X t6 z\`)vi`Sh~ʌr躣?^gW_^$+}׉omVD􃓧>:@lWF.IҢۤ.'GƯ򧂟LH09'qI*GFadOvƑS#d-,d부U' %J(|F߀$XWnx5ҫoy9h)~hK'7E{Ao甯~rʢG/O|.e+eOx+'o|S%hxG7S;,KGGNp1`w+4a"o׆Tf?eK2m]6kF[W̏)]|u\Ey=s#MKm(]ah *#@ʢ˦4#%,mAPBO`*_ʍ2py2;7/=q#?7ٮw^}$TƸK^>G72c~8}Hɞ q7Yyaft,yo'c,MpZJeǴ|k|xhT `G?G#V#͉}c&~ W~ǹJ8'M:^Mu<'ݘ dD-=c^qƪF4X~A o Xu$!a(m.1/>ϯ\|$^[Xnpw^VeNTzK._J׷Gy^l<粓V~7w ȌcMg]yWJdʱB* hZ4?'w X @ӶKߔW|4[9#`|WITϝc;?4klky{JWUe+mN7WGx駊n+G'* }g`J(wJIs%KmJ/ ;: 4LgWeewm⳩=Jˌhm׎QG1ΑGcNF97@v !]c^݌r%Kd<7ѕv]։80+h5~,9|JJ֩:K :GV`Vy4Vu/**ċ,.tY / W,-y=, Пv.m9z9?eHHX9Ҳ~.,@@'}+@+O8΢N7S( k(7#>{7 Q1gh6 % 2 ROd=ЀeISd?'tG02 a1AqW8s_t`T9 X]xT,kdaQ,~^"@ޓ44>ccݗ[wMgX8YbI^m K9} X P7ݏXTt0g%֒'QN{︂sW^6痶۾`5tʫ<^⟧,pu?  ]PWj| HYIDAT#_d1ٗ݀5ָ$vķVE6_ KD>|@ii=(|WBǽ*e ZR,:nkj 4_|5[+"DHF>g{>m;j ĺWXLh*.'oD7f٭e_k Xro= `}lV2I,(9ꋠ6#Qߔ_:^UnDzKc0G3``)F WNE_)Q&DZ^ZO˖) =SfrN11m 8;bz7p%0px#w(ָΥLeʁ?^%nt,(i\莏LowMKB e >R.7[G2GXJ4XH9ZG('d @ g>ՙg9N>}!XU+Gc(@2@| R^~f;xP-XQZ0St̍l9կk]Z6:k:@cW`R2^]=\7>ҽAɳUtKW %NO% _Un|#ق"_ܨ,cztV dY,J)}Ju;quh=n:'?y/.RE2:n>swX_nd: \&)Iۛ>Kj)Zw3ugN_'pVW׾'K9ydaQ>bM1NV CnO}7[N* QYṜџ,,r( h9gB%Ç>Ϟ~Q+8tocݿ+'0 S6Hm[F$ 0zӛ4}l=e8YZ)XiZ~tؔ(l/r;҄o|SG/%Ƶ2acXK^rM/=T΅ؗx'>Ͼ, l(L@EYv'gUOy(V+)$Qc\{(yƨm%(4a⟖=?+߳>.e*7o?d%(O KO`a)篔I!R*|rRHJ0珂㴕G=-< _tJ݉+]J3ShtڪKy8JC\s2))` -4W<4]Aco|cqed}Urխnu2ƜqO̢'^`QJS@`DN(S+*?OS2^uqܢ'^AcX.>:Ǝp#xiىu_/-#9:7ƽtVx}wD(C|^L~6I) naJBN)t#>҈ㅿ 6Hi-oE p;L>M48 +^щE;4ߜOeT!~ ,|J¥l)r|Q锕/}O6~i|3F%Vw+8[׿~~_BĹƻzJ[ { ƴ v r# ?zc3}xO}굯}d+</щW|Wz˦,U MuSj<܏~+?K㋓(›h7LMqc(=gt>o|~*aJ_Y*O/SZÚ=z>-={ey_|(YxK_ʠҗe/~.P6lOamMtå+)m7_cGϷ_}=A&5ܐQMQV4XKJdѼ=|)* wc|zr7az7QzԴlꄿQ<}[g۫x[2 bַ.qKLOvgiQ̔z)i]U|˟;4YeĥW({uK3.n>GI~Q8ꊮmQ?~c} n\{Rpm*6Y܉Q8)emxZnw;9Y쐞|DgDž~GޕG?2aQL+)(`fqOzғ& yQ"rד`T;ljo cUzhJkܝã/zыkUOS~lc}3,Q{h;*by:c8:׹t8'w\y+6}cWx]lzmƬ׽5y{N,6VWGOx_1quooSc_My~V;L&cI\;-o'; }|EU:k9!M^۲)+f&mQX>ZV1'`-ozk^3:m>腋[`G X nj-^WM_P`3%1?>)%Ӟ ox)x}db~u 3րXcyibX^ڿJHMM&Y7!hPrc+N&++YYY+#_pʤzG??IBpҠ:;b=YW3nv]ri_ʞ@)5`A, 0$љS򔉗%糟;ΫW+\ XZۯ};M;/M1)Lm1<ӷ=?~rh+n|G#G߫SC{~_@/4x,_4'=ytxv3{߸:knT!?N+[z[zy)X| (‹Ai3`MSe%SOl` }zw$=NS<E1}8 (T,l+c݆7Y_ ,O}Sc9Bx ȴO"\ e㱩M=}-ՖUF>xx)qp|eѣnȱJZF1t'AzTn|OEaE_ߔOʗ.+mOq)'F,%.fM Jiw,HO|a~ի^u:8j`ɑE-!`*2+}Mo:=9G& ˙.7)r}?[)&4ҔwU~ W7zX5;oVmVMx %ko^n/ז=$<}e tccЍ{1*>h3;ڨ]/16׵ǡb:hЎ}\S~*mqWGma| O9sUj82WQjLN(qu{d[to> O69c7Ʊ|Yr⣜6Y_[7_i;*p}+7 *S69qh8Tn}t$5@ON@cl8q{uk+='+V-YXGOHGce?,#r`׼PD&de>|xO~r|\ĕѿ/峄x` PJcb#Cre;. 8,ܕt'd,䳀L26U)/Z~N[&DW{L*I PX./@wS`M4ɱnX9&6'+amWhKdKLyx-gAxkiAƍ5f'$Ym-`Ix7_.qmƷJ~ F_zrL+@Bϧ3R@n_نiSQQ^]՛/*M&gbXNQ~d M,a$׆ǒ4KDֈ>pœ8RKއugX[[24fʻX2@fx/_X?3V<&P7da,Stu6N6h }cYZm!SOFEdM&4J^eb)#6TMBMT!-]p7M K6ڎ&Ҵ N,9/+4Iy]Z?7ʔKSA-P;ހ?#@@,V& }T֘^Z<5`ECkvI.Kک^Rz D)7AhQŷgbC<|)4m|uSx+4[9= ]]e\ZF߫S:' tHVz}o¬'YVO'+@ ,-GV0Bc6:CeY頩'–'g{Ӗֺy2fπdK(MsTV8@謫8o)_9tME/\JCWyyGrh]P9}Pn~7>Kdb,sxF7KOcaYyu%@ys'E*΃=ʈ_":gڤ@kN_[qvK멒;/~:lAN@g?(Eݩf;~x;HM2,.EXr$'L~WS_64&r/~ׄ^Nu-W)gy#z<\]7W(\>Vŝ23`hSic ~+>Kn{=Sk@W?mb,&&ƫ3 Y6Xk&gXE,^?d:֖z,esP4jΠeէgm9խڧO)8T486]d!Lq< XNS],%w6UWAI@Oˑ ˒ĜvXz[07ei"uP/OieIn~N\_W_W[hP;:gJGJ,c#ñzMv;y %O9Ve Mwb4tHy\%tXeǂ)_%%& Wx Dn Mf{Q'K :g$:fpv@.&~Ypt/ٶS'zg|:ڲSgmR}Od1GNVkLGY H8&rS|> XX8^CK8k0s|G# Nk{J' ڐ9ȃ/)8!JS~,~@'>YqJZkdҏGX)uO!LvqOXY%q능ЧxȊV^pr.e%lYYJ3e z@UgL{'6*{YN9`ej;kɮc_i'{ 0;&`SJ,) +XYb+O}f&K9s+RegZ%C^QZf5N`@M~i)B@4ȸD*guI+n䑕M-2Xt`Q8Z^DѕsI \wtޗ49|Kچ5W?O,Y:pLI4+p|Nr@'^6<>>h#]8>g'v>P `N&1wyFc[]cpԀMc^Ushq)jM~Ԟ(?&5N&v4dTeL+1\icR.㰌V:gڊijf @1g~eG:yWs-2)8x:iTXtXML:com.adobe.xmp 1 2 3 0 0 174 517 1 0 ^VeXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:517 height:174|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.3: Copy in Image|fotocx-26.5: Rescale: width:465 height:156|M\ٞ IDATx}gXUɶ=mV$sV s(9gE0GJV*Ar9nY 6IP>}֏m{UUFը9k֜QRRϊ /<x 1y TVVB yRRRsˇ<x t@]]|||$k<zz$u\T<(++mEEE'}[+.V.7-׶vyI7o=c`$\dgg#33'}_PP#켼< +++f߱=ߺy6wf&. xI[_'I^v:#1JOOH)#o2-#/ag:k|lfDy ~:!+=v?~ 22j_"1BhBnYlFk3O<$ ʑ+gPxBVQJe8Ɔ0k1d}A h ]cn$~_w!߲Le $dD{Z?F_CbmkՙwOfb2<~2TW`+|y ""˃zqנA .LX;&Cp.Q[E@ q96~pye` mK$ !!a7*o1ͪ'd=S2cDreDeZ!oVg&HyIjLǂ$M=[ZAUUrrr8p D%_L16:Ԣn[yi&v, U 7\92bq5%Wՠ ϵNEp3jՅp²ֻ'>ȂI[~ٳNW^uZׯ5kge?o߾m[||`3k**PΑss+j`1|n?'AINMհ׆%.KǺvRS9{~!^ŧ4 Gcd !Emg.Z1 - !c dDK}ғx2LDO< a]tKeE|Yw ^"Z__˗/Ӑ;>;#pDy6 ?}$QӜ'=}WcQl ɣo?1,u 8PTցF[Ô[KDDk"; h~|w^0wTUW!Qu [6c 4$4qʻi+,NNI4.axS(hcH'34돂D8Z)A\\ Cl1sZZbQPtI5ׅ'D1f|:v[}.]Ç6޾DWT4_ iNZQ- zWҀpZSמ" -$*!8\A}LIiy8Dig8-OsA4]vnja:ޠ5JH(`ҒmxWQZN1C Xr%V,_9G@]#-j(H][r,[kH }hOW;wVOnOa[}-5ѯ=GDw^;lO>֭˗/;%Q^b  a$zqHňx["66̛q]jDJPWGP52 -BiNcT[訫@YU1u+*-EDWfTע& &Z6㱈NI,.  ={&& jh`,"Gv$K{c4ٱ0g45H46 ˚CV_AK(ɐ7n%ѣh)bX#;}jY; $#јv:#QQ'S*̵"ṯhD]lY(4!(֭ehǞ {{q5Gܳ(ӕlG] ~iv7i]췎`ew̎.m`)pdmgvkjPv8LJƶ8!}hJE-;Z^ &"xZP* p~"|WR^r$:{1 gt5Gݛc!Mެt4tL"/re9Rؿj m%)qgW{,} l<[QQsTGv77MI:v9#/ltLt9Z^f;hAƘjCRL"#I@RR2I) $CwR>y<0ͬɶߌLV ʃiٳ_ j=-=וI'NHD8Y>s2S}1É̹o;i9޾[gR1zp=X랻`;0zW<6.n.'Ǣ0vax;L4 KlA8y2{:~,R 93&oރBEE އ cGR365Y*7O!*=V̞ݿe|z.-voYG8a&Lied7 U:e M)SgdHAJ󯇟>81gOL(|46x1cO"_D1c@1hǯؾ~ˌ5 $ʓ(1cb' k<x z $ʓ(1cb' _}/3<jI'Q~c=O=_m5ŷx 1I'Q~c=I٥055%}\b=^a(J®5Xq7qxG$@ n?'>CP_gwpydW~w Tl:tccC=|=`kci3p${4jqhlL=QE-> &L7^߮|2߿N:fffp"+~׶V>^de"̞<Gw.IJ|ӱnAquhlţ èoL1iB=q7PR[M];v#:3Hʹ7*<_/mǾĢŋk 4p4)7BfӚwXY`|k s`%k،ETygk_̲րʍH,, ee'ݣk!.*oS99 l[}q@zE6 u2UJxYmY'(EN^eW_7BAQK7|ߙHt }Qxv"|2T|#bں XSLg)ץY0Q$<Ѹib3(& +))\Kow!`7D=#-V.]/h-'*/@@,E^n6*ATS`;o$HȊ g|N;`FA*KQ\Trul$m=%%ŨNhDmyq E]TJ{=%%%h6Vb\shZ@P~rJ#s2 Mݥ\MU_[Kٽ < s!FXTUwIq1u+)}Qʛeje$~hmۗ5$wjsE#!FU}4f:S}MsLlV#9MX`"2xa8mS] Q.+v)kOwFRxjAmho P@W~Bl2YqeVU~Y毶rdsl<:Ңᙐɚ:OCsQRFspaQcr(Q8qhW>?[Ƥo"Vmm"eM.B^\Ed$aF:.G|zo#ф.V4HcCncHJ@ZZjx n6k2FXc$$!-;[%i&Qb&'(JAT\ P-Qznޣ('ACdd5,χHcSS"fيlKs 8_^E ǑUX |\ؿb!&! 㡶Xa=f4h븲DsY uUeCVVҲXV&WA>Ҕ0{[*5 |2q48YBM'E 41wꐓK2= 'Z㟚!7>K졤؂i }t\]&5f$6d!0B zv޺(JzVnwih@U2j/d0ov$03l'U8SCnl4 ޅbhmL^ɕո|`d"2Ԅ2$'t ?2 -Ov{}ܾ}Rʑ'$Z_9AZkśp=E7P.TW:CFb!΅>M5x|n#1s2om9-3ܦE_~½ݳѫwoMZO.>l* */ԤD0l<i1-<f^gY/ 5S+ᗏEر2]g!6.W/yb+nGqQE6/ f.͇!waػk;/4zZiZ-rكJwa71LZ}<czGZbb? Š`< { !9 IHԍ;,E*<պ dѩ%m4.GDX/~4G]ի ^F:(_lqBXyĤxfiM!m4Ր,#%,K;7U‚=ǐSUK򬃗|;xڃZPDL\7 QdR/tȟu~??@`cc3!dOݠ@fSmOH*SƘAwjDEiU?|?ns!lۯ[&8qF8Ctq} 79d0q6dMQz8]̤@ȊaȮȑ3~#h[: Vci/&z |i s1-iR|#0}a$dbk Dlq3M6M:9 MME9)|r.zO\ %Ҿ;nd[| %Ҙ>t ӔH,^ބx=Fy-kW.yS (~_!MxIzO.a["ikX{ՙX?wD+χ G֌ŔHfZ큝X}q$ޗc1sn5ɛ+-CVbZSb|PE~dnꃶj6tEpU"ɭMX .!OY)}dVB4I)p(#wPw!Æ > %O$sg%.Eḓ\CAɯm­C ah~1ZU2Dbm{:O:ADL'chaçm?rk h1u3*ObU 3T+ -VQxY@8ֵ31|65rrdZSВuT4˯LH3$_ḡUV<{ ^p\IeIee { ] \֑E'7DiRLVS1dqj]}I .n kxU,@N)SE,FZoSpd 1:ѽD k? V=$G%YnkRj|qp5n]EjiO'"cC~56pNja X~ vzqJh KDimݼ;v.wWgkM^;} iعۣ幝0x@,88PLaGS Hc4,lZH&˜ o]v߲ ,5`2c=^rȘN&sphU%OM2OKs3 K}=#5T7S½'76Bo(6kϞ6o\@`Y~sӃF0ذq [cBciъuȤ:v\!o"e4* > ðd%&l>?67{p |c،xEZ悑XD&|"rf @oci;ڑ(ۗ1Q:Ћ^xcM[|hN# iؤ&unI! QUsi!XAE>|vL44 #F)hCcK,{#.NߍJ_iM鶈-rږL\7jVSu&חa!P>]pgY{!ߏ, S ?iړ=9IQ/jPW©GAImQI4Tw\#plݱnE/?wDi'X1Ff8}\Ui4{Q-m@U~4[@r $/#a=uҫhHjq4_hb1v&PH;!Z 82Dz`DBj,9ҌDV)- eͧ}L+ZdΝ`}3K̘3׬ļ91H\O]>&3h.[ u$ !O[ѷ1i: g'rT>4e1iq5rY]Z{2Ǣ#MjM`kl#".m̹Fe.38sl[dTӷۏ!HtD vܵŭrs 7]);faW3 7CD=1Ht#(";,G UTh"4 wv:Y!k9lv`49 &+wIrܻzppxSdž$L1T!jY\}5Ǣ}G4Iוc0{jnԋq9$VGV$$Yy¹ˠnw񑴦dܻuǏbX[tdGŶsnʪCdj: s3+Hnɶv) H^}\ 2ijNԞ6$UG DDֳMOu}M$t<$mU>v ?3bhP6=揆JLے_~F]e"CqipŒY c^h# 8zXq,+ҭ\FlK@) w+ PJ :m.Xip]19Yظb*dt郠 o"Diܾ 3mr;㡬7){6·1Fsl/ཋ 6$ZYO\ ̹|A ,`5eM?yxtf deTq2Gg76 \L+&SC:,եD[IB5VNrPIS+myyum"՟IPʰ;Cb`_~K}QZ< QP!3$O7%ؠH_Vވ}=[4֑Pv^ށԍI/_N %"nA!8dG]ABJS/ǥ[>x9x` >66D%0a𼀳aŢ88dTY G,$ ɴ_APW$@\:K("kȱh/ڀ,2}9dExnERic4c7$##gyYOH4:.e2Zza98KNq!8:WG +uI( W ϊ 9?*Y>8{8杻 ,*kO>9>!wAi^za,Uio ^yj\fn^>?7MZbAJVN3-N^#`8\5 7&-H^\7ϯ59e\r{ܷa֝xEg!C:\#hQ E#ic;w(yN9dn‘SQqtFBŽGڛlyQU}'@`n6M}?< }!g98:߿?5|jW"BHFZ4bn+ Ftwr 6[~I N! JA}C?Da(Im '%y9IKR^gdR†ً֗`-ZK^*D /@-zoA7jy*֑գ!E :#KHC v+ PVK}]@\R D2 #.36mCZɶsmf$" =xC$Z(*cHyEE$;N1cW.2;l>_-_7\&̈́dP]^-fzdɎa㒻#z}) W@GY%#QNVt\DVC>Gl`ΠRzl31nݐї&^0Hvs!'a$ŇQsTHGS_?r4w?fg#ɱh Zq\EA2viat ⃹2͆`^ 8#NVn˙K*HUy6͟&g,-y3Îs Ml9 }5 O61 A@ZWWX2̬""12YE%3"څ\n[肁}e~X>SXaРMa]^U.OI=MNb}Tp޿ Ds% o?a- y7#dG}5$f`_v(;9&7A?(PUW'@l>E{ tZ 6[k5/p:prظ: Rb"Mؠ9`xd.9@d9Ĥ8{g}c-g߀Dy!~Yx1c_Dy`{wy 1e $Jf( x 1c'I'Q~c=O=\OV,3J- $ʓ(1cb' _MV|c@O0E?**0øg?U[PY+Ip!<\\bE&>1 oڱwp] ÆZ@G[;uDfez9f$|w>t4&:TU( %9]N"Ўv, m06ݒ^F"R6٫!54(ɠ΃p|owNn&tK6߲9)oqی~K 7$tfl :k+sq|V̂G<¼6p>r9%رt&/XIÿ},9;l[5Z4bz> L5D,KjJA>^S3a 4QߐNÎvMs+iwD3X 7mND[i>BYT41{nIoO-U>ӗٽ)p'?S_\T1bt[[OpٽrZ'7u!5<⠺$΋)9NS1 1⒞bgLJcYH@N@_{ԭUa9i:^S@#v}s7-h~) pVsMCMVc:My4$(Oܧ}rSb)-^Ė|=okkƂ-l-+TQ@FAS,&9 kRd,qًH\N5EXYk&p=BH\ d(O;VcP߾8B{uJ_$Q.)L[0 &.DxA5 > @\cXagWQS W VRԔ$$ODrR(.2'`5L\=%^H;G8%ZLOރdYYxaCXLҶe$'!B@򳑒YO((.v=J##:w2+PZ}>duާW]xVZ)0խYF028}KYacļ)/ByImq?&y\zER{ddd %zDƓVqu*k?Wii騦w.UExߜꟙyz_)1@^Q4,8]&0̤SsE dg޷`2;'mGx_ Bs%p"4+7Ji<ᦲVˊ[GB}\z+?+;~" [bRT#jWVFXp~)ecݬM{Z۔TPh]HdeUMџZ#(㜼vXd[P3sigmޱj+K-,Zk=0')((w(/὎deS,*Fjs"(?+seYNͩ eₜ{{I8Ɉ Eڰqp?il2 }0il5a3M3YeмHp8UKamB<v6}RZ>86,g5*_*%-C߯p岉4rd(1Hi(Ԟ< (Q-e{i􊐒ڭJ Jv}~adҰ0F?#3! W\1a9F8xcf93gӻks#, Iѧ8m¾U#Hw@WZ^a;e.FĴ\mbbLahbW/#fBX"(Mdf&k]Q v"۾:%gC1U0ɁßgS|Pּc&1Rz*)IXwn)g,>ܓ)ttLYo:+em-J"Ns:Zkr~Jok4ΝCp Ll^Q&D5'8M^B8V:Nn4ՠ)nbgvBOM26|J>fy f<(s RVT"R!_c<%oȔpB,L({NoBr6$Don(ŅcòOlJAW)9=SFi~38@` qyW !s8bb܆ 0DTgYAp$)Cn+,9*D(س_P ?j5H77&b=x[DYi%V^̜{Eeaw 6 `ýפ~[YLI@RA <c <-FvRʚذ("Bp ҬᛐhQ#%1]8:P~t(Eخ<ڊᆪsڌzj3Cr5iGH*jPEa GLr.k~AQ +<.m0f5:7 n߻"/0%/?B .kiMDZ|(1A U7gi qq>`УEƑ(wf#R)ێ]ɤ?`$GrfZc!oCl_3zzp Մ@F|FZ38~ } 5BAqP=6kjI7q(ag(RgAL 1ʰy )#M/#6:vd$M4ؽa/HI}J6ܜp)+v81S&&?˥8ǔQc&ȅ+ A45JMxcHLNAld ,P\ XfaŋT)=iSIX1H(!$#21}@A;,b9%i1<ghjQ |-K&h^q"1K\G|g&٣t xO:"J{n4-0;#QK_#/?/`)l7BBqlZXa(oqA\$ńb)P6٧/~uypF򰰛 ).:[O-$v Q|## J-=Qƪ6KH~N,4ћQyؾdm-/L֥% rW<í'1gdBہyIX0-ŋ\=N[J}58›"EBa8lWGJa J@z̹#SB1R iPWэX_\@Vq۫3M4P༱a /)廎Q~x8O6fÊG_YbdHn7kt9*yN-U%>S'hߛ[;LL%y :PSI<-{Ud[?=٬$`$"F f1gLQ LJ YPzNwZMP t߾?xk՚5Fլ9x, X6ӏƟ\g>ǍKgqk?ۺ{=W@$co  k sR۔EPӵę7٦~yX{XC\: ظvwӊ⊨:.>lGG~z(jspnEEJYi(bԪNYA*r^72 x_Sg<מ1J$ڤO@_:#!+9"Jy5u(|@N$FZ *{daH}M_>Ioy FbҹpMPQA:gH, бnpI9VTUW?a7:(aʕ-=Vj0uv{G/x* ^6!FtǑgBbd1X[Ӈc^9v2ܗ-k<.L:.JS3밗y _:mlƩ+1Ȭ8`ؾc#9tQ4@X\";CO+hMgۖ~pK.kָG70cp[Xa9X S6~Vsg3H@SD4m2wG04ɅX=ܽ/Vi EA?=܈rM4.qW@aGpGVcoQ0==p8z2jV(M]6.=T0T:,FPз7kţ%&Nkbfwԥ) Ơ'ßIԕdb(V  X6ƈ~FQsxaۉʈ.Fq*Pib;Aj7ӡ9fV4,);wl5YTDkQ]=&P;4i-4gXD}q1u%> ///:~$H6z~^pw#] uFεBL90Dp'N f'D{`暽m&{{OK3>Օ:ZLݿo\%\ٝ}}>?|9bފus*~xfX'&EQXP)/$" v[bl߰|^/hes_ hD-WAv ņw@t9̆œ%`?v*.r- ̐J-'.8>WFDЫ596R酀0bϘu!iS.섡!ê02Z,^͉+/[@mn6D?HSsxut}*1i^J)`̴1sexѿ' *;{{j(O_p7o>ӓUYG7BwMl'\=@/uL[G[t/"r2N" >5| Dk$@I>1w|·5U7AT5֤DCk7ogھ5h2c&Eq!,LTUhicCX[;4@% 9yΦŏ DS[=tBQ;=?o(sJ4ZjxbeHLw%sˉאҐܭhbyו(}MDkj2r O$gbUX$^<~pi ~I {q4f4>3$! !>m~`'ii`ⲭ`B&bw}O-^~FC=a p؉V`m ZG#ϋĎj(Uѣ[/)1Q酱n`“B{p߸A2s ))c3([i +qf&Rb2c>SMM m]}S]3X:Q\ D«BDƣ#̼P& g$+rr=J^<qb}LAkhRH&|BDц|ܷ <+WƞlCcmue ^gg Ehs'Jm(Ĕ(7>yOD o!.p7"1La?^y+'gX2=-NPaPkC]5o<^`m8PfPcagTg8ٹAKbRhK}q $>~/.I܉nfxU Bp,(1[\3 f7`Pgi9~D̍ ӓqyPe:KC\{*FTd$Alf-ArAw-@om+\h^V>R<^y器0m1Tlyd^{@ԁTmQH ڎ1} eسa5q-,6v -gMs^l̰1б1f7s UOQ!{jpY9LFj3fSmTf (1_ :vg`'l>WQ`ES,NTU؉D//H|GQxWbkiR98) sad+v&I \ݠ<+by 3߄:Qe}c<̗얗(<5&=A۹ԑ]P46:6(\-f.v<tʘv{ tY>l?@ z%Е᫩+w㘷/B#Qٔ]CfRܸ3gB^:|j]$^^jLr[7p,[4Sh .:#0˩?)˭Y'<T7?³4 le!~<'a3(,%4R9L^>Kb=Hb897$ 5ze!#~YW2f:S,Ǖ[~y"._q.3pLeC+\ y|=ӏ3z[퓋qi!E]3܊dJn,;Jx/rG(hb%Ѫzda}`{N SX6CvU Q^V<x%/쁡zoNp[e.ʙ; s^܂>lײ 61YeHtce8}4<OFOᘹ&mq&vP16s ~bgc}.)N]yExi῾GOA4% W!yQ!cTKQp.k,Ɏd¢)t`V 3'x,[%]/G1h*/?vPy#XBo( e11 ' O7V0ɪ.» y1]~].g.‰;qaܾp,~Q[:eNF0uēBo==З#)OWk+f \[7b5HGUi.6ͳ呃6v\A9`Y gVNF?+[\b%.FlٱZߠMjB\/\}BWSUTs*2-^L+#m]R!yT `z Tω}U1gڣ҂,Y7}^ߕ+>T$fJMQ ] r̞6<;P*}FϷq6yvڕѩ3KMt`HoK_܆"wOj[CoAUu p+Yge IDATZ|ζqR\pԔn ;AEM{E;J Ōq`1~!qˉq  sZHNuK\E;u3a|v&=g12vubtz֧`|hCpI ; GvLNBؙ٦9p1r=p#+}sxvyitb>E5<>Φ'}O~j 9ڱknT@[-&ZDqXt_0< c\f a}\#]ڷxEUm 5{.2}':}yLhi9O}M9#G1XIBl'ǒ+ˑAinTp8ޭؿ}TY9KQf{3b԰ޛг$Fᎀ$?W#UÌ&t2c]$X3Z*qݑ2l3A|;1.:CϞb ;,4ƸҴl}}K̨g2 6#aPDf%tLry9r-ў6mqa$0+H}wY]G.K>]-B#"9{ry'v8X}m >'qs9KW8xp緙U;,core)ԕ וk [7ƓRr> 3*ZzfְiX{#C ,b;̘Xǭ)8Bt`iY;}.S(G;m:4Lݳ ,ef؉xE0.|6CWkr,Ù`R$]_RPT fZf<ê92$aqL۸`ZK>_v"WATz}"d>gh!э.=iπd 'D d>a7v*fB:Hlu g@Oz3 rٻA?浸ygLn0aOϚ@T2d>}@pe;|@_@Td> ?2ξ:Gf|_Q XZ+y]fR]AMu_w޽G)6]J㯎hk "5:_߷vPottԕq$}ᚨ˘<*ޭwE،s'o}ޗ|vL)j/]}?SQ`*Qs Zwl5Fs}Edo U寰qXٍZ/qtݦפf;LuB .kkAIb=a/^DiMXb~0i4$[<JLkΚ~gap1#( ^#H/@aĸU^xCyZh/Po'n.G1 Q߸+N (3e[ٟ娭G"'~{3Q+׵SkO /MՕؿ|]#2_9oSw 6k)~fCF}z[#?@ $Z=0l|ķb#t%in{Lɬرse.`Ct"xދk( S<̦/\c08 }`ݨzK-ViG/[I졦 swp9sHFP9eO_þ}H̾C9Dv55oʱ٘$h]}Xt$>{H_ ;cY^\՗ۿ.f4 "SN}}4s][|kYP,G%L0^?GLl r#7?*1*[hX{߫&'FՊ6#e.bQNSʩ7y*O#ž.d¨!?ojRhw){MIbPݬS)B="O0 3" 2Z "~1OSW8Q?n()E`IWɂc}-]b'H'pVB.gh RdrFRJx+h]},k|Y&&rJ}z.GB\,@(ܼ!8V|qVSh!!ym">e'1ofR4Zs>MSyF|I j):ZۅS-!)9鴝aBXT!Hc^x>q-u-}ZL$&4[R2&q&?kO8F )% d.@;saw*seV ƾá3|߽'ĆaXkAW_}O;1$&*gL-G] a +u9o|^Q5|ݿa@J^}b3^6j *Ѝo E%ehVUE8p>(RX_~pM8 أKς(N* 9yJ db};~79y"(v6EN7 堡8z_ 8n)sIFCɎ#JY݀!pcH-??)9o a= V- R&G,$I!ߵ#9J)9E;[ZޛYվ-eryPAQUPSˑ \w~?Z"T~Ehn{CSKP#r EAs!a2-<ذ.UreA)#"'g k *DGOJrpJv5f9̕2QX/ptqձ5U6 ~D;VJ {?tbIA~Qz#M5ܵK'Zwtz sYW<L@-ő uZ0:)q$\|a7:0g5a(f퀨`b,ԧ&ԡ#M}Q\An`qK^|y5Ԩëgo nX?w%M?>i 5(Nqsu58M_ Q VSSSM Z~93.A-uGO^c#CQls]}̔h©4 0i,# )mRiiXa2-"0)XZPّƑ4~*t)gjj 5j=}-l}Em D;T‰lx/q !9FzL<1B}$~Iƙc&>͋0m> MDZ>ұ1i.$qEKq%s0D͸wx*I{*Y$ZDeIMI;qw/C$i,!=U͵ c"p/ATQw@o-i+ɹN?AET8;{~,;oV6 Kvh*t. bʊ$9vxGqNXR{ :VW,^Q%e҅]LuY v~KV+Zi{%@Rx$9?M>٠8{'^FVQ' qQ%':>N% 7G^ApH .RPH?o &*chlV 5~֖?@ᅦp'PF{ "ЁڽUP\D?6r3ݹm5иzt4աn2Dޛp1:sl= *,|.(a[Du21Xy'Qm.dHqdI]leJ @dl(a&{Dk^R^k"T%ef8}rn?V`> ^. ")eԶc6/I';kqhwB#$*ֺ.f4U\x͑uЍnG_X4*^v*}sM 7 '/N-ī0\LA/h<;Dde$WzB #zZ0O$0BVXg6W#~7` WQj?yr{{'{0m0 ttœ|h0S-hpEHT۽~CD;x [-뫍+W.Kͩ'#QjxNA;WS 3<٫FlyzP3) cܖUg>z2H 1B/EǟD_R-`.f&R}[;6a"%8(t9% ze`TA>I)Q.%r4'~aKv3yO1zCgBd4SnT[;E搬L G3Q,6 ; Q2Ruu]!ŁUAZ~7;`' ZMUݳ`8|"OEjNzڂ Fku;V-3[PZ+o|SQÅ-<2"!-j .T!,_0fFP$Y{n=`d9{NE!Bx6|vBk^?A.̬@tA''M;:b1d%iy經Z]?[7c:_mh DszEWWq :F8v&m$~lG!$¹ˀ<,Enp=$݀Eėm x@ 9э{҈ඕeA0Nm^Wd tֺL,2ZCL/?NTKɊ;NQn9^M, 9YώSIAn .Q:jyv:[3P}Bwo>u 1y:!pZts% -1`}Əg0a<NDm2ENa{IBuX<ˎC#͚ʼnCNa*T5fC)tj+Jv?vj["ec2oFZek*2DX亀ܖvc8ݝh5<ãG0Q\:LZp>$R Ɲ} ZN?+It':tDwWHKKCx.-9'N5ofL>vr)۷vљϳ_66E`8W#Gd,ܲJ֐=.1rxN.S'cP}2O@5姟mYg7#)i#W1]~@vf lނ  뫒0tSIS*dg 5\#iRee'`A #u &TA؉βDdI )ޡ6mygQSqpmje=upM@7 qƺ0'1 1(jʙhm'ٿ[Em%N<[ +AOTM_n_ڀ0Bgϟéӧ{W9s# *&߁m!:g#hZ-8'MB'&X V\(Av/zyg 3 "3ds.E3=Gkgɞ%̭>HnXQϙV譮ͫnvz'Zێ+;СDs?@6ٹ=hrZ@ԉٞnɂ;gJwwX+VPX SBNo8 ֐iς6fΎLV_ mˇjWQ23h&+%2}Ӈkc$CK[@Tؽ$/̊0wG_ѶP]SN =چ~cni{&_Ik--p;G\j:yVM2wd DgY:7/`sYK΂Vn%wS$n#' brLq9QSq_fؔmZٙU}+~X3ӲĎ}p?lӵgL{(@B:w¢89< gaK6!)3Lj CSw(؆|oՄBd6%5TE ٳmu;4ejC=PF&$ Gկt~;Au#u<~, ~8kޡL3ʼn+Q˨ҧj뻲s@ûqLZf'Cx_宯FX1d A-32k'߂j~b(Fc'kZ߅3ѯ(©_#&A}SxE)y9q&<w ޕS Em/CȱUewԒdUh'R R+4zӜ( ďA4\Z3<ĤBt9d˄2&t56..:"h~_߉o5^{0y< - }lXfMWo!;ԿB/-jjqq7w<z[=얙 GP~)Nh(FcINoE ^)%mlD,2;%!L%w|ky{ϝ vfVV)JXHJFgSvkro[I\:i(C *oMLj1@QN,ƛ)aT~%PW |ys1O#U IDAT"5k=GԈIv 0HS$ɫk2)D>=7̃Z? mcb]Ate?{{Fd%0Ɔ79Eڼ˹aFj- $5oj kr'+<+dwnQ 8~+h a[=~fvx5C~'`{B9_Q?ϩCAJa +N*NTU؉DQYm'Rd7X?x NE0p)x[2\@GNu?$XxC(A+Q ^fD+qcXz3i 9xFsŚ7%89e<8w4t[PXn17Ꮏ?|||q.F|AVD(l?勢k&2B-B‘:(脭a‬*}mGɱ35N Ue2ԏO<*31M1s[%zǟ;bO`nps4g}=yWB2s$o3o]5ofݷ gĬkMXX'*d.s2xD,r2Ā[Le`\Px7\f 3ҳ+4p #,kh}iXl0~0WbfC_~p,NX\r {vlh[{l?se,?n0:tCC"E\a%{U?Ёb(yρ{ 'Y3ܫET +ir5w_ba8P水W,aaJ@TT25t?6Ʌл`??ї,S 31Ȗ;VL3>ʺQhSkNP޻VH_P< kgCJ*0b 0N;<+" OR_.BS Kӗe'+z53325E0Glн (6 5u 3qxBCK[&<뇗Ҏ)$$Gah+L_ h*N .Δߗy:ޞ%C|_Eh28<&Í\7*u;9#<SbbIB_ž{X)JY 4泗X$ FD 匐X|ZJ՞= LPV˛ cm[Bwxe h}BMSDJ᧻E,2Z,9xV؉ƆwX*!ڱO_hhb¬x$ɘpcaUbߊ }Wh~gm;#*W%%%R>5M6fpAql&%9pX' 55ݵ`;82q,A'a˾xZ:_}ksp3'Іl&3ovd$l[F b064*ƍ0 f52 mOJ`M~'Uw\8w_a8/ s16{L?sPJS7tD_fE잓O\ H ; K y^쳥/Y*$Ϸt tWxSYXzO5S{d41l-]#|d ʕۿ aȧ:n9 `ǶLV?ˢ|}bGY;d>!|@F (ڼK,E|*?e+U"{l2d>yoM4dF-> QpɀK2@NkYl!d>g@Td> ?_ћY"N:?Աtr^-X^4v~;1te#R:zCB9s m|6C]#^ec鄁J2m'^lO=BoZCQSm7Vn$5|֦0*;ָЅ(m3G8/x&ܻRu>%Rozz~T So'lKCG']CHQOhqF-ڮ|np\ \GCN7R։ $ބ7"{mo zvCaEgʾǠf6*ퟎ;t읧Eث1Φ?TWRKuTAX(- DsDM_uM:,v*@6}6BE3_ ] @ +ݾy_gэ0xjʉJ] pl ;1[QEIR4@C'EYKg2(/c3ɩ8{QT=Eݩao,r8YܣwbH<'=f;rj+xуڰX( 8d? {?Sx @D܎z۶C}A^2{ >U ^$r?!KGIU8ˆ'yԍ FJfHT}%͛r$G#$(&"\$NMŽ`ߟG$@pk!A{C҅ö9#ѩU䊕:ka]AAP]ܽ{1D[ugbF>F?D\=u:#/)"E*G(S]*{_BQkV {4i%<})iTle`d6syPnEӎ>DƋ\݃0.!1W`P'<9^GẐ$&sTHܝe$WSú{={5PҩMRb}&((nUň(F"x-uJ]SUĦ>'001q]2*, EaS?)㰇_Hi:ŕCQ23 w,< }l;A|xy8SL|6={JޓGCĿ HeYxD`E3#fS}D9F&2>Y(M [#8y,Bq'c0bӚmP3DDG,p\ i>e  ^ vV0fjdRco8rRbsx=WI7 `5ښ=!l(db6Tq7wPĨ L3 zT5qvD;R;#p;B1hu*,).2luTIQ_ġ3GXO *ד:l̴xJO@e:& RE/R8<3F5 -!Mvo`M p4#l)ɦ5}NP)޵ӽ3v߸[C53bJ*P _X8IgNB~Sl( :68LMIFԖ+r1V}8}2F9(!P4ʐ˰p9nS;@d9OMK-R 1iLLMKc4N\0F*B#`cg#s>ضRuEnݏ Y *,”~6pPڎ)G4*pw=6LxwGu#maKj㗯:ݱa,)+<E@q8q"Ǝ UFHq9~h{p@ 5?BC=@M[ S r5̌ 0t=eظ׼V@_;y"GGC..}e'~$C?/ ƚjJ0:7Fr\8W3j8료5^G=3m J= 8rV`'gG*l[Id#̟1|lvqC 4w5^kFU "2I_L;ExԦ *T"6HHNF5_L3PepӀ^$& z."QPCu"'go*ǫW)?5+΃)}L-,(Dk* x%hc >Ɲk'`ki@ AxFYAi43tW}琔^$c<'*d(?Eӯ@eeX`Tp)n3)7nh?xWN>M$TF&ñ Qe!*~;N@C'Llj7(,o^ũ3hG[mdރӈK9xr*&L2qʌQQ=?u "46/^j8W=$}EYCe>O.\)E_WbgtYѪ\p<{ qP )O x< /^d0`?)@P]^Yя@VZ"r3GǗG8/FQc0p8wOhk\hް (21NJF$܇"eh~)ϩ-^d Y߯3&m\'w$:p EnJuC>ZY#* w,@{r."I"j&H\BZ~AAV{xڦX9ExS׀@̗v7RWso m 7&!P ƣKmt+]TNU6M2i}%Jꊂ,U#~ &;ǐo X8P3Ơ{_mCQJ8:~V$WH¡B?Eػi.ep&IlmATo 5+cX`wO9!qz[m9e=\ɪ2 *{,5e?v! >zxt(h)S$]}/{{'UuV-wi 0)yYVЧJR[u\Nc-?r=z[ *(%_95wrWW d O|bo¼Rxyp,B#y(*2qOFqB|W 㧎 c{[XrB2XP?Lg[rbCUBN:'b5t`n5 ]  waL0QWĢׅa 'qq=$aPD!ю5jQv#`Cq'6Y2 6D(-'Doф೰6RŊ37PR/:<;ԎjVwr{vñ,t :!1ߚ0Ae~LКy0dbU`.E?&6c_#4C@_7v~v`5D/Fm"̯"~zS70@,ڀP̵DxAi )K>ߤcX$1ހDPcibl޹.lWGt HD/ye߅-c}G}xz  ƩMmÁU@1ǘI.y7nkRl]<Zgda^\"ȏ.JF9N]_цMy1yUlH4htɴwz6X}o|w_nVٿ{|v;CT8k%NR[(quD.VNBOM l?wƍN] eۯLxgxx GAnt#j(sHAhM\y99L^I?!ٹ^c/PY7O-i!cp6YJv4vM4 N"BDmLԱu4v}=}Xf<pǕګwOH3^`f'*c=f h{}3(f\j,f'6=Att 0mGqa賜h7o5.n*vP/.Aʸ^"n[-ϔ>6WND7USZ jKDקz6H|X,)+k;Q^󆡇ueW7h/9v_;KXU1|Rue%^Wh[  ALf`Bmw H6<׸ {}M&h숨V@Tb{lbC16.;H]v]⽟sEX͏|sy=3yygqkڏ3;M!}[7ZqU~|ΪD,:e`Qke592e/@ @ G@Lz捰4d+oUaԯix6Za4S'-AS- t(Id ?  5 UI֩:4N7(ՑU&~i_!44km:bd.˺ۂ)/_#T<)?m0SHs5i# MD_"? f3Fb#m\^T1JR !=OLYӇXVO(۔qDkw{M"ͧ.5G˾jxA6ij#Ȏ2}1]:zₓ?jȚo[jU}:^htpr\t4H4C%Q )00یL _.y}ȭfҫ/ duMCLӌQ:W%:Daxa8"eǧ{OA#Iu>>(U\'x/ڟ[KPli 3ѥg?漝VO kgj#nZX'ڙ~ɂ9Xn;2#qlJL4]ޭ`~x D+g@K{2&))Tuњ}DG4O%?6eTRjIDATwz6y\@ifϦr^ 2#hO#6~z3WԱtҘ(sM42KpNh CcgcUvjh,h3KGضv ڊ|bS K$3>AZ0d š6O x0r<ƯOlGصjndM/"q>a~"HMпO/L]"C {()~;(+la3L>'7kSUS-܃0ct ^8Ɠio7;u  AX8Y;2k1mCyn$60"KW|cNЂ+i`<ɭ_cɋ(Ȃ`܉o0.[4ػi1Ewgş:*dݝ^; {[ pcGaaz}AB=rqY]M(ӴB~1Kl;(I:J>te/Yϡ!TKГƓv%yQj`-ett(3sY?3}t,(= HTNmkMp-;?lj3a$GQLU{E#xXيjjyR1MZZZ35{V4tOָqBXy-tLC$]y"uV(n m QҀPX6o&:7Mi,'7`HknscqtfLѝ$=qd,Z K;wx w#+&l5nX&mmmҴSZJ(It-V\o sSC&v܈I4AH.zKXα~vXdM/p8m)>DjY UfO89 CnO~-8g#?exv3 zťBRqP$[OVRx{O1i><;c6?h,?N4=]'YtE țƔs"c|$aeq,Γ2?0_0m~{%Ruck7ccODa} . 狰R ԇV~؂&.GXDt>!wb\}D C 'F@>-ҋ>$P3}k,~i$ל (uQRV^`88Zb#і99888>$8R`LJT0/ccc'QN1111A pxYw-_'QN1111A pj/=ZOD9(@1I=Og-D9(@1L5122y:x_*-fe{}E>ǯp!S+$'%;puuEtT,,, ///!oRbp~f4ܺu~~~'wZ ..666xS!kCP-l2gCD__~d YLL84TuU‚QY#ˮ&}#$9D$j=8rm UP:vGUe233PMVh\&#KK),DdeN~k7-WE$DH\&ȟYqbVU{˺N.GʯG!91ERzp$`9~pFY?jzIkfgd iɉdŷN%b|<\mW_D.`b)&?U~\THnSNDۀB?'O6Oܲ/'r  EZRU}l/'ȫNFLF&JuSw?$d&sU}?'" r4O` UH(+{w2Yk<ٱ{19ԒND.z97Wa F8X'CaVZC+[d>e}[u&;IT¸rrais, ;Y3M$~$ N1HE&'%Bhc NHOc qaַl؆l5vT ѷW|Ɇ-Dݝˋ聘w:JEl/#sBh|3 [GrV6^M2s*,&Yd8nJZI-54{=j~}'w[?}eex(wrm oT7\/K/̝+/hjFC^ì'\Xk(CR'F%[w"yKoyzĝW,l tb$"\U1ɬ;FP05WQ^C\e260ư8|rj`$~yKT͘@4.xWvC`YJY66.7WAtV|rd:B`sWfF '6 T%߹NVbƊ^ ,49AaT쿊X@cؾjHtX}?jȈog[`<Xf#:{|Qz5JrSpzZl=8ۆДl4R/h~h`?Rh $"eXi8]sCaN$cU  |ey |0LM`,,\7~C5-atPGpgظr ̯Ŗ k`dh9sMpgd(o.ծ%JAP g7:`2O8\ތq"Bq"ё8N)A3gjAR930nD3gL}l?bpd<>,d!YԚ盘5leKh"5 cug᾽D}$W+ë0͑c1^GZcGAQXb32)pKQYѤX7~ˆvau/G}7suf,YSGSt^d#E9o?3 f`o1h!M 09rd11\l-޴u4 A)9kV<8"(,Uĥ xN[ c;)B_Oҝ GX[ B%EB ijHYwnoeO1Rg<jPVqe)"aOۻ%<lU$7wO$$BB27\RN{I =-VU1NLwz4"E)WvI:nJQzGf2ޚ*a*Ttt||Bss;VÎ$/'QN 11d]VWP`QJY/E!SNRM;*jW]Y"%lVNt!Ϲ=QCg n{b=rUU~7g Yv2LFmcj>(՗s+c@($2Iۏh1B*Wov%v^q"[CcUM^Wq,"jJD4Ů|,璋)Id%Ġ 7 BP@ ճFߚ(긖,"w<0/d|.,B d8~KCtXUqh8rm U6ۈljÂi6綣qH|`iIcowE#DSX?}m@?>BiG'}!p8(Ϭ hLd`EE8US]MMNDXpv{$>daV4dU)t\n1ZryL&1bc!Aj=8rm UD?u bGQ>͢)YɭSPIY}ISO}=Q\O뷶%!wM )D{?fb8L/a&<$Pɪ!V'fq{ӲA~~L=#ԥ /G{$I Us 5W'Vٞ?ɾssi06!)i%kg j\mK-~3,IdYWтT)?#D6V-KQއ^=ۓ:'d-בa$I(a5rP XXY$F?DjY2گT$ 山eHr+TGyd2kL&&Reʣ,>=ݽ=p {Aynr p tv p$Icccc$Au?@888(}N@1Y_eIENDB`fotocx/images/combine.png0000664000175000017500000000226315247006660014422 0ustar micomicoPNG  IHDR@@iqiTXtXML:com.adobe.xmp 0 64 64 ؓeXIfMM*JR(iZHH02320100fotocx-25.1: Paint Image| pIDATxQAE7,Atia!.fֲff<ּ*izzv;̑:&9>1oT#^71 zݼ!/EBi ,SK[`]k5̀MJ=.B԰.d!@@MPPԄu5!@@͡>O^\ߨOg0k0jpMOO|X<X3S  jB:&)UveQFJH4t?0-RNP!:.[LӭҲ_o-6P:>u u5!@@MPPԄu5 Z+O} Vj&I^7hȆ4=@еOҨO)Ԅu5eoN*IENDB`fotocx/images/sketch1.jpg0000664000175000017500000013345515247006660014354 0ustar micomicoJFIFExifMM*JR(iZ0232-0100fotocx-24.20: paste area|fotocx-24.20: Paint Image|fotocx-24.20: paste area|fotocx-24.20: Crop: width:805 height:219|fotocx-26.0: Crop: width:805 height:219|fotocx-26.0: Paint Image|fotocx-26.0: Markup Text|fotocx-26.0: Paint Image|fotocx-26.0: Markup Text|fotocx-26.5: Rescale: width:702 height:191| http://ns.adobe.com/xap/1.0/ 1 2 3 0 8 219 805 1 2 2 0 C     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? *E(((()sCXg@ijJ>j/'8%|h,uьgR_ t9Sľ8iJxFNcْ `Y}IW+PZeb'<cşg<[xh 5"6m-Z+\oQZ`}(ݒ;qޙGJ}wPNG4;0tGAu֩^j1@7:[f! qK'º{:ޥmYn.AM+C[RJ3 rW0O xi5 bX>ާiĂI$+٣,3^: eZF^B}Y?^XܪOzXxxH%&OnKX;̓S`mo G#]^aU 6;do$GWi1|l}cqp"P+z5Mj](W|B 5f0d$t+WϾ'u[#׆ T>s_^L" /|o 5^i廜&q!9>c 4Mr vU=z*b^6:jZD-dIנ:͕\I,^FYweRO9q7uROFzEj\Mw);\{ +J%#8TI}p}ܴdEq+[<;TsQ* $zɴT4R~i.uSPqml#$wDؠG8V4dOPDsp9W6R:Ukw1xm"H7#`rP*LΛZݘm<3}+¯"E Xķ*z)i'(81S,B>mysI>v}k.6vi#9N_j o| tbu7Wrk1ƸW=v]u/cS|Nҳ~4zx̬N:ט|CiuzŪ|gW'kEև)88á:AM|H"ht#VIY7?N_y:lpl?Z+7ֱ^$$rF}Q[ _̚99M Va{x=Φ{۫:8Aig2K(OR6꧴Դ[LW2g޹m2\7ȭĎ@ k%>!m\QzRHcɦXhZ$}kO$3`g&oKV.c(Oùx9>=xcFz<GcYQ1)mßj~:c vi@\DWvxR$HQGv ڪ\(mAnz~LΫ,Z}jK "'׵/ hmg$=k7ύ$үn 0D?x3Px.J_~_єU'o(|g/h7A9KHx;知|ݷ[?-;|8]; ~3RգK2f3d e2+NQ[)]}B"M*sVf#^Q%.Xf)!gF}C k3wLe7BxRxyvH_݀; ؂X pZ\6/[EjtJE81/~ zn4R]ڴ~`U$X\ּς?m[R|HLvpOҠ~&iQi6satW#ˌKWCZFKfF["iOHC~x{CҦG"MbHiq=k/k6K0_\sZǷ{JXDA Ğ5Cރ@_x}5+{RHluִuO%vmidn$R a$sҾD⨵nx9av3qT+_ZOoȶy5HJmE>1m Z4"V2ԦIHa=HokLu3x+(`r[w5{k-4HUc'̈%LWm~<1kjw?I-)f0rN=I+z^h"mmU'gfdUlm\^qsٗ}"[G)93H۴g zZ#\2j^{|Ʃ^ /Wo0]kOW{uf# 8W~#Xrg-Ȼ_hI.q+kQI+鴝'F[."͘*rq]¯i=q K)ߩXV;|=p ߶?.L]1Ӣ>٬лs0t}Yv`Ef}Yv`nBҸiYm]?>۬лs0t\,inBg۟ cD)1Yw?➹M/]L] |\{xNKPT^ u`øe=k<[GH{o j-BI]";GhX  _K}X? ư^?.>V~CikҼgK{GФCںyȄ/]Óz߱'Mxk#ZO.PFhFN0}-k.L]~Bp.e>-|=΋ Oe=܋F7n_-\n'>{?F>, 5{ [٬Sn߿kYFy5GO\yZ~ XoIw?>>_VټX$yݹz~,%w|=}^e쫷n1vǡY7:~ N".@2hYX.\L]m]?.4cnBg۟ cD.+7 ?G5pYLcIH¥nBg?.D]; 'e1rޕkKQYm]?>۬лs0t4&n!h7z5>tL夷ʹ$XI85Xv`nBpC~ЭⶴlKkX4RNNFI'񮈜nzv]m]?.,jV?n8x?6Yg@me,^#lX䒽9<9?.L]m]n`XNFq#һ0Ïx?tgvӠ"0ɰf6 G񯊖^x0L|}+n7 击%`dLV Z8N6zOdϙ5[^F b/^ݷ2?|Q#L\Չ>j6^|{O\|9O?I?7timaI`A${/=ї,Z[[om:, GmV,֧&Hci=}o浡[[j?hH#,.mLe RD6pG]7z  h G#ǵz<}4u[y#$׀kZ4c AЎV.#'8+}>e0r3'6ўU 9^O'}3ی_~/{u1{ڇ).:۟Z{rbX?Sz1C#nz35yMGt18#F=qTӆ `gҢYO Y P*rG_*~x*RYY>G}j5~nWZ +<K׎~kN;;1%ǖ^2/zWu@O[Es)"~T 8ox?\ nt(UIqqr5mCš.&qA-Զb\Efbprpk$xbž=mi|V;TK-v d\6SNJOɶ0Cc& j-#^hʖ9ӯ~Ͽ>x6 y="iX'ּVn515ɜ q2i \M27,#]c5;{: [`뎄d~ឋ6kY":{AMʘ9q_8|rKAŮhpFڤj>m*u)cp<\ڊ ;W `kSE~,QWvuM7A-[CY|O/kKqagoIXٖ Q{\d}\֑^Zw'n4uڀKmi* $+{?~1ltB9EHyfF=p=|xw[UD[}Kv66PRXO nN&|u& ]#AMn4ƈB8F'zϦs?*3?*'??Mʱg~Tg~Ui}_SO;EcϰϰWO_ v>>'O_ v?ϫ*.:tY..\G}N?AzƲV7%lݾeV>jzΉy")o-:;g ^1={M֚KSeF`# ֟W?%]k>P*bPY?~*z{_I?*OҸ?ϫ*?U>hv߀ϰWO_ v>>'O_ v?ϫ*.;lʩzΟ[}Qu*ƀ,Erڞ+O`mgڣZСաaq51)%9f;Ǡ4w,2aqX=Ɲw="\!$1 TA91Њ> :mF?Pk7Y~Q@\t W7,w:fp5 t۫=HbK?4=W^4(]KPcd"R}2ǭMyZ\moLꈃԓ=k[ {̣S+mot|@}6}G(?<ۂ \tS%j6]Ywm M+b2 m[XH*s v^8흚 tdhTɴv8kO4 xg%Ww 2Em =+έNUbf||[ y]Xx`hT8Ҙ#^q^y6#˥QFG'_~ԝU66- ҘNJx^1_7 \& A?*U֌P9xHf}p+俉4}4iod0yyϰ=vapև7'XPܒJ6$MMt0ۆaOʙ:^nrjl:sĺiVKdf]VK"~sjuj{ǖܳQ\ٳHW ;w';}tE{yѳ89]3Oў3kg J#1H|$}"+4nhM̀G占Nq]-/0+,+8Ln,+^o,7#JCZI5 <Z(K Ncd yG=K" cnr{Bf/mOYӯ1E]eGmrΙ\ ʟç\#-򂾽3[7ED[8 3+t+[d㈂~xʘ gߧ_wCqd0 kSjF#!Q}kW˕|CIl )u*&*nvs0hi9+Gu+֍:ΑȪ>+Fqu!3F &I*ֲm0\,$qjUխo]H]ޝojpM\0IZRRVܵ;l@Yܳq.`9XZ}DvQA4V$z#Aܼ2)H"&\Et+ѵ7үaJ6a%d׭yh4wB{[~Ck ȭR8_iy֏a{'^i.伷Ue 5-c_GEFbsJ 3UK9$@0lU5/In5+l\,U&-:Vm`lޯώ2?h+-2]%H@V`sW?wc\ U~˭J9;|5{MbXܯٿ>b'h-nޮ z^>7zv{V37&R*&p1zVlڥ+ {^w,OGmBm!˪\'ّ606^O 3nw| / {T7Z 2M(L3173i+!ͥh6!Y8Ȯ]Al@Mzr{{ҁ9'zcsz?z(BI ߝ0CҊ4<335c+;ofT1n>6aSûc5ҹcf}EZ~xx&).0?FIvٟگ[Ӿ8bFhn f.:rk>ƻiwIoqk3DVT*H,;s; qޕ@p@#9B1ޥIvǥPm:D,A]uy]#_[FX. L!xOF,8\ŝƠLKm | XN?hC"e|G𕆗#4g\Y%dw?|ABet}.%Bך\os+qX/suiSc#7y#gu>5 ."!@C@֡a]'ksC*n+X`Gy熿f߇^t7.w{uv )&+_l\jښݽ 9nlQ+;r{ɮK OYE%N+_Ra!dfH9bj ov>t }1SJդ[:B&i2ddx#\/!:$%<[ɒ4!Qa(Ń|W7_<9i賽֙v g-*+G#Ѡ]1w'@o|1@7jPNVI$wuE q+oBSiq\mTVUVRp ÁOzjAW.mk O#*!ThSk+Z|mtٴk73iZ6L1e+QxfI|E$ELtm(u x^ҵ&f+X-%x2:RU# iH qޞX)cAS~tRaXny5m$UHzIi&յ3N[lH15(b?rOxr\Hŋ1>:1 3(s%ǥG |-[0\*3\Ks,ھdͰv\d]afU-%TQEQEQESX1S*28}{:Sh[(e#+0"k-U”(cO\z[ԔS.*EIs*;B*F2p$>Z58yuekhPљ'`Qa\%c[ڲiFy6PlrT\q@$ҶZAq(?h/uk56Z0v pykM0<_iZ~6 {X*: x'һOyxwJi-KPgY;@[hs+x7dr[SdYd r?{5ad)Wf*?iO.O >8YJ-(;rkӼ;Q{WlBF z%s3+V>gg:NlRwvoh7 "s]/.|hc^&'煶3V7?6lOcċ5<>SA}&ƉŏZ8|ʚDgqdC{ VjD!U79Y~yFC+8=_~ׇt[A{ͷImDX׉M+ G+1q_6_#ZRNT:sgh0G|Ӂ޼[N32\pNk|)kEs梹,+Xv 'xO)W.jͱl_xjŞtN;+weNAj3Y:HCzao>_w7&9Mq^cG|_Lf&A5(dJ$jƝic4"On&QѾ T/༱IHȮvW09{jlsҢ /Ie6e(` *q:~B%-4[_OX\PC*nq##}(ӗR=O_Kƫs{ğ4Q?i/֊,8GI?KIx~hs{ğ4Q?i/֔ ,8GI?KIx~;F(\'/ %T=O_Kƫ k-SH[RZ+2v)Q $d9jϴ-GA]s昉~ %zM/W*BKp1wGI?KIoi6W/yyw&~":^'/ %T=O_Kƫ?i/_5]+k\]NdlmiE{/= Vrn ;wxֽJJlI-љ$xQ9Z];MWU%M:́xyiO0/\SHQT;%%@26JܺF~љJ:+X$CCFMtN^Ӏ>ԍՑ5gVA+O8ޥ[Q|`cΏ<1 ڶ-5kMPE,j1#vkQ Z;T(3zh 2Vj۰2% 0(23\mH<ޫ|޺2'U;^kr&9ߊ_u+ i.&x*:&1_FwC O60w\Ϗ.$ H]~h^gbƁ&"Xڑ0>!BiuZğ/+Df_x_%յ;a!L =:7>~%B4P'+">;1'rΒ.Cϭ`:R)C?2tϷ2Hcҵm&F62Sg${}*ůkYJcC 砮_EקI2I)ϯzXs#(WfzNA|mzH4ȠHO |ob3ޱ-[YfS_Y=J+=E1084ǡ IϬ`=0}em6Qh ھ?gA5#`*g~Uǩ@ƍ?}>U>|:gITv3S >p}[sj˧`[!|7ڷ㯉]EGť4Q'}h a]: XT"Hs[Ʊa ҼkWƘ<ږ&mt \D[0⨼YigsjQM(췚 0@#p0y#ڿa&[i V/eQ1&h#r濡)I]Xa=1_Qo6|ik-]C y,(b7 *_jY³qaϾ7<~+W.T۰-25; X·huT02p%[r8g$ïxz).ؤƒ&@yx/XciH֌Ѫt.8x)zg^ Rf9$lW>%xGIdPB37b=vggt/0h瀵x-&Z\4MX܅+ã=wr>)ohr1+EudΗ*]8eć&=I'+Mٞ?tYա.no(Na[#u3VYxFi"8P^I$ƪK 6z|#?kz5ۋM#LSٌc@+Jz_ÿ Asg'$A=7׺s΃r<i@Os4׵}/ĚFB[o0 Z5bG ?-tU֔tqn{W:FK{Σ{?Zx)5M6N"g$h! 2+) Y+3LLJ][M 7֞$ KP\b=?TFtu { _C,>0Eb|z61^k?g_'ޥ:uȮf[Y-䘴f;Yʑ^8sF?ko6Mn% ·n<eh"x=)/]SUnu䶱!be}MuW72_Yܒ W̍ r:9;Ė5h]nRAxbƗ3 \Y7EN0yLW ZpOiQ+k?Z=m??ƕc`zZ=m??ƏV[OOc`zZ=m??ƏV[OOc8|SCj:Uqjב:Z@bB˨&µ{Z->=j9ҵ(rXK%K FBQm@4&u=4X+@u kF}Zskgc +7nV cdZ;:ޛcw]>gG,AD۳c޹#A7rzv%\畷O%4+wg狀;.ۻ9vm:W"MnJW:^<7!|>{X!Ad43QRUncRC⟺~-Og"JbFe#ֽ31ML8_$xkćLb:0gҾi{,l ב*.Fgm,,RTZŹ(TSLc^=.-]`352xRse~27eoOJ<~hƟ"ѧQg3km#w6:G ,7wu_ h>z,)a>2|J_uhڌ-{aWď:ů"fPʙ=~@+Ȇl .gog W,Rc @Y#u+cֽȣαr\465QNSt zglp5#Q@$~'Z$Zڝц(Ć'v޽/<9ߋ^V >$0ai7Tpe<|(s];`瑑_i~:LZ+wnh?6A,WvJId^B$yxNqxG \U؀nqS^Zp:=l26=`G}mor:H$l.1z CH^}AK`6N:H!!k]no$Avo°Ȟ[F1أ#Kg%ơFhD܃ԅ}~._j~忆Zk4[vpx_r[J"/(X$r{Wū=ޓ>!\"6NSWb=@5=vtYnƈY y'gź&-¶=iuwup/k&ӝtسۀ0=(+ޕOMick57 $ebG@*tu! x@%-"Ӵ!9L=572G4T|?xEtk{9YC+oOoo}R [[5}CNTV Hf$ sWC=h#ך/"] ^Ftlgr\ \l֮Ek>2h6fiZo5'|+n `.yngޖ?1\izpVl'+0$De#HWzy\_ZIiz^Z]B _;v<!U+wOe]^o! Ҁ.VO%)]N Ko G%7 oQ F]N $#(d`T:VW%7vP6RFl5;:K}  imM#ny[՛JR ?.ѻv yo,qnya~.{u .$X V#9 (cZf-Rbیщw8 @2cG+ԭbMսݻ:<? zRlxFkVO%7vP(d]N ?.ѿ'mk+#vQ vA;o([;g8Y־$gX`-TWOI7`uIeH${r[ۆ>n1ҏ!.rrwqԄf~xŗzƳjqA\. |7(et I=^{҄K>rţ"E[lĎ$*G&|#6[[m1eIЯ <]$8x/4tI#9_qc(\ :ewy6%Yxc @ckR]o|33Bm;µ!Om=R߼FIJɑn4E.d|XONf8/zerybC}?xK,ЕRUa2N+ؿ#;go'@H{-tqZA ߛ;J1?n}l:NM!eMl8Ҿº26 [pCK w>h>?^/JܬqClk)A䘒+8e `q enAuW>-iOsu6l3$<ҽׇjo3Ć]r\q'sP]α,C--(FWbNrG֯ԯMݢqEf+0c W3} UxZİaPx8kA^ce%HZ 䖖#À=zWxQׄ.to;+yO^#tGiH~lҕ/@KF8'(ϊ/m~tg qsr ’?|%{jZ$C~jDZ#~pq_K|s޷z44@T]Q FKF}+l|9}g@39/+2'ݿPx;$5妋izuNpZŽv s+?h_G:߂YȆ+@~d(<<GWbiγtV,=D!]r1_R~ u+봽Ӭ./<;k'UƨK]{.g j+}^mF9\B!b21ƾ;a;|ax_Z+mqs\{U,ZB+/Ltoqk -|CV:E'9)#A5$R6ry'=sڊ(EP>_]07LUfzA%Ė7)lꓲlqҁ?3-&7Z`B k,[f [$qWԿ%>!]\ۤ7 q\NXnF-޻jjo" _b><];QDk}~ ,:q׷~pbH D.F{~5|-.Y{klȑʲV)ԡ`=y[ xQTn>'ˬr/\]@qǃ]%c5Ud#j#3²Mo, |BqẌZ2rQ[7`{y'4Ht=轵(_[h?-tyEZ\Mq@-}N^Mg97HW)ދ PX_uBL>܂X0jK5yB @OROj7n; ~szϨ۟I1FD'U.TtW|]w muJk 첆eH:#6sތ֏[F|_ _ /QX(Vwx _F[Oo20d+smtJ@#KUUjRDú6fvo1 @g^FN2k+Q՞tn%RIVLp}Lw֡׫H Bx?/O' ?)~ /G<'}20=?z^[^=/?-?7(ϿRt_n/OK z=bI~!iZ[&d*($׼:\ĒFe ;C^=/?-.z^[pzf;Oeqlb[ z? fr9Ns^rڷO .).k6=].vuy#?2F$Yw~u\i&CwtkvK'1U"꿆joB-o?-NNEkpuBc&iޏC4yo[y4d3?z[f=o?-o&h?z[^mON~xA^R v9 t=HCk+ K;r[`+)km4Whmn|Ȃo2r9^q]9eq(Gf kq>2ukwچc^^M5 |L{I]@$Boj8{jV^[b++EHTy [ K:玡3&W¯]xR=b3owN\UyOcI=k!QҸ?^z%32U 8,9]u3tОLj|YEHp]U+/' .-eYS@ d1Q Epb@Cg0N7khc"0`N皧sȫ(HۉQs_jE|Ww0y8H K^;Gx#*w?jm ?䔗RuMU\T'$䝏*f99iضW]GnF ;d\Vk I4SXuSes=oxUcۦw,xSHԧK*pA_zעik)Pc@@$>1T,S(6bO'?ZkͫxR6e ?1YW(Rc%)XsลbI>I r2wvxnɚ9@VUҵYJۤ Ҽ՛KSTz;Ktڠt1#}|(5xSYoy_ycgՇ; S폀ZM+Fu嵳FiDՊ64[ˢ#ٷvLYaxr7~3֑RF-D-9屷Ncgo[/C&ֳ<'hK]AVo3aQZwEDdb=hZpGr ۑO!pY5RPAj/+1$ګd).#{!@<Ó|&tOOz1ܭ1 VO&mXZ2GZǀLjUXy23)a{ԧ š9>w{f9c><-o'~ou(4Lr0Jta ^ߟ ׯN*|l/$`bOnH˴9L2F>SI-"<`95lp/l\Ay3y9<1#;>?lL׈m#Kݬۤ0ho.03iSV8Y8UI#Vw,<7j~ Fܗ̾B/'kOisKV>>lYDDrJ~Jc|+d4gs$&=8j_g0/.59$GV8g`IQ\K0޸@s[ K.CQS$x%@`w^{{ Cxզ8qܜfVk>"#6Wi^lr*s9c6!g|n;RFco^z3l㯧J)ʲe9S,PѴo,J88X᷹ռqkPY5Ѿ$<>XإH%7,n.aQ3(^wq޶տLhn4/" +*$6ƾ+74Ѽ57lmi4i)aس#$eBݭ83ҸM'ᇌ)r]P.;a<&k{{iacgR7`IMWt;/_Zz-5Ie@RGCů Raq{k $,$U x'O37n-I0VLֽ'ĬzR7x S!x?|ejV46w/5oq-)fF$Bϊ ho[ODd{i%1ݼ`zt^|t6gN+M+UmZp wׅ>v~ | _cOPj'.^)ZICi\O_ > OxZƠ_EE,|CH`Dwci'7֣x;+$<,_j6Ҳ,~9[k>M}4?dq4z۝(ld\|Cm-naO[g( 7}rO-iua^ GwCIEz? |ZSa{iBz@7&?];[iM! %$ e漳 >|L7.<>/.lmsYsyA,I܅C`KkVG4:E$"l9(NN{sخhvzω#"dӠINJbn)SӎkǚΩ_$nL1ȅѺaU$mJƚ^S> ;M}.`X"KVa 1حҵxşaziSLQNj$#,8Myn|=Ih/uiעoq,*4RDꬄcŬ[6z 'hK8~Er? j_YG—~ $rL\:G# :c:)4]KO=IxZ_Q`)V `_:OGEDba<gm+M_q+Z6lm㞟ֽQ͵`o'ҸH DJmzσu߄~ k T;xg_,@dsׁ)zI e}}1(($ }뫳(&/m+=q\[Lִ٠ m'#m9_znIٞײR/)W>mZW[Nfqk>U{YKОF\mZ(.;z׭ks~G0%%9KY8>n |o Ff6x8n#!Lfb?f=N4-ђHyma{zט:٢,벴W &03\@X >Y*]I`XR | "E[φu$r5nsVg RC(ҼR-7[$O3vUo\X[ǪxOjm_sW7R[񢒃w˼s][,5@ޟX`|K-۾Ť\O5nY_JfH@zՔբd!2YE捍Y.e6(]?WgjbPS=k)a0*U8kXZ2)M"H#yjA8\l {83\pO6綇  Oq ;-dL6x*x9,ŷ&K*qI:+־laq^c "?*kOC? vad1lg UɗP˅ Ҿ[y%eĂ8;z~&3ݲ;W+iӳZz'<_݀p0o65saִ\Dz~>9R m㾆B`zs jz()I1rΨr{@ּW>hm`K<HYG;8qУ5>~- clwnп)#ZOO)|-K[n~<{]ʻwdm⥮gzz+Ko"Kռ^KyG |':sUFt n$YpŽI8z6j嵅]*c{e $rqOqŪX0|I;yѶ@)>(í^}M4o{{ s 50l@Vc뤱u)>2FNCFwg-\J-dԯI-+ sS ΕDwBIgŃ>\H{Wx}Zf{xOMɰ.$|pW c[\ç׺I ,FFq־gUuC;U M!/9:.[xRInx;IN+u}R!R8A((6*rAϵ|]~̚<%Yiw!5&i~@@~kڄWsFm#n1M; I?J߀:Ҽ]w(5`|Wr2H XMv QOrohз.*nQ(2[)9ϽW{mU#:b 5CiOz]aJ T|O|)n>Vn"鯧z]`ۤdcҟ{JiN|K=vNu?tyZS@]>KkO9' ARqϩ*ϕ?UPpP4kH!\I?#yZSVn7S+_ 7@ÃOqϊkO?t/}ݽ޻[A6aǃIo*UUUxPc,?7S+_ 7Gϕ?@qǷ^n>Vn7S+_ 7@LsHU?7S+_ 7Gϕ?/B{; IOmsgw;^76$ӂFMiژ+_ 7J';YScSd>0??&vn1S#h>0?0ǛϝS[[]Hbx< &wpğwz 3jX;C7[zQvEUs` *h>/5J򈆜aT -K%Í3珍αXѡkt>w'ҭx>^bQ eR"cGzwO .hn!ѮHq\}>Y%[Gr3dNv^=jv HVғMӤwV0Jh?v)8_tE| 0ou46JfՖ2@HWG4ml>iUA_;RЬ]XMi!{ yeϨ\֧hS.&X_)ڜ΅ G=!JA^#,g^<ׁ';eLz8k mJDNtڭGpvx92< .w#M҂<C3]󪹛И8[ O|j8YI6ѶS]]zl&<:,[k!:l7 :].SH"ޫq1.K:4ᬙ=<+Û nP1> GƟxTuѯ`B^s uo`Rh$5<cB(P7]0sJN'<ڰtfhhIAy.xZxª>@9'j"+VF<2卣$qsnp2Z 6!?(I#W e@g$V:ٟf*$O`Lu'tsQ{ oZ|rmܧO2\W_ǯtqQۤqX|kӢjRD6<.G!Yr3{kS,%F 85f'>=6["]k:?$`Y] qp ߚ_ڏRh[ocQr#QHMJOxwJ[=*qrgQkWj 2(;kD)rFHD΍ǚūX4]X| ݕ6T~'>/-52 4;s:^o'O?j|[^O.&}A%ک_?v'WK=)euU<.Yľ[뇆UfE9+a܌`ЗVڈ8sxZצI#oq$w_OxKQzdB*0WL<0?vp?XuPmb{{oyDf 8 TqœH!*~_~0ͣxj :=hG~5CJdmWӴ(Ê*(Rh_ >mGm:*u+e2=z:_ ><{BFQOiZW; UXc?ax3_JP-k[9Ydެ)Jñm?~ I$n>+o>/]h sKe7rC'Yt!$?jheRI$iKl9!rp 퓏STZ4˒4ztʄK@>S5/E3o}Wv>,m/Q+mEy%]3*0X /}ogƃhZ<@uYw伒oF6IjCԿuvgQ[z:/\ZޒWӤ;6ImTd$Cggem3f;Tq^1<~˛JhB4Pҋ8^F-S.I×(&$˱1Y%aNf}}+ībcr'A0K| =%=zIj$ _@vKoS=[4L2!Uy8. >^_ꠋi$2?3=p}k4 ȢH}rnʼ* )sХ6CRW}3Mw?>[|^\Z>y-Y܊&]tuw^tΫGrbL5a;aGX^KMX^+L aH-!JwI&U!~s˵EFjx,w᝕֣m&`xOvx[%mѡoc_A=;R"BSk)%ZNY":7{ٵ,|c_=WJ3@"Epd^˾{ht-A} ۂ7X8n8~c,}Af~:qrݑ =}b^5~O5Ə\Hq$.3ϦM}E;N5nGw':I+/j7ddN8W{Ԏ+rdg|n@ǩӍ C1e\ֻj"{{{mMo&5wJGn`<쵢|gvjSjg62?cbzj7Zϙ5;uj9sϽ~|F֑E( @I<@?S&[Z%Ŗ"A0z:|4e% 'K9 B8wRMfjr\*&%$7~ikP*jR3ouw!x(ϵ};Z?Sn-q(ppwpTs⿃~W@Ѯ`[xr\* rsxej눢V# ʪF|qj}WHgHijP#=pA.řVK2Lӣ+6F #$'rOͤBM>c9a+e#@ 9=/ ihPĨfˎ95OCcZ K|Kƻ㊖mRFOJoUbZd`:;]KH%SK=Ҹ NlucIdXl8!de#<<?KSGv R- FT?WGMW^-) Hkג45D~P?7o |MM] P2j4~U6PpO#BrkO hU,IqeCH=5{1p+Su׆.B ]VM{[@̒bcִGzE)>R,((((((((((()GJJPq>ƀGJxGx:Uψ'ӼsMiMZkfI RPM{߅&mGS-AT0zG[>\+O+ogAU)%>0xf[HI!wp \5T O n4aQkpJm0w9a^w;7b @=0:UcGKaOcH񾋭Y#@𝵦{cz,[ˉ#P2<-'t_Y|03v—SjJ$Q:6Ïq^C8C??w<žc[tmK SZUP'[̲!B\,A'q\%Y]xJȻ6_\]?*ģec<;mO7/ ^[w9wh㶎#895qS}kʟ:\?1hWi7ݱI g蕼Fu1 lb5d6ixlHAfl?Z;!eU;Ee[4b.60uWd<YLQȄ QzŴ6e^#~rnaBb ljGqofҀUHb=y7z[ukKRK3`&RVܮ‡Nl<`k ol* :gAK4}6ȴVH`qzל|AKYY2<)brqk.R3M]CZO2;r3IlZ."Kڮ*Q/n“9\Ci-3lĹn \V1 4`;E{~ Gh6iiwEl41=܊p Uq炁{F-mݍ=ƌ<gj WS2z?Uվ"0Qm.1tr?^kx_G:ſ?׻sΧ|3ӚAz Vi|Ђ?rqRv0 6aHVX6oj]{xm\ >YGr+Q>Mg=ټϷjF('?">Rʢ7@9?^+OO ΃#}rX2mAlU<{t\F!]mg|/O>2X#G ֡h֞4;QOӭ_ۘMXX'Ҽ3So|}{M*S^'żNCs>ĺ]L-ܛ}a#lG`~m Nqre4&09#{NjDOOKOwvh"2Z\K8ý}\JT YHZƟJKkf O-d sX5'x+4kwK"ǀAo,?>8+G5Ǐ hv{$oJ(\0 c-<;|wzE0~@ԁyb#Jo+[KdքM#D+kMX'6)w&wc#7lY60/9 DE t1(>BܚJçyໞ8W쎱uCVx;#О(#akk\wK|5+-^gAc n*9uu?`ֵ _xmmoYcVϹoo }.u]JBIGps^SxmNKMP?_jQfotocx/images/unbend horz linear.png0000664000175000017500000001644015247006660016461 0ustar micomicoPNG  IHDR]ٹ.JIDATx]ےnyum 0x)nqLd]{?~p0_epJUdS^xe_~sNnvM~r{}?~e 瘾1k.Eo7pG 9b}2p`Gjt jb̽ O'͏W {~ | ^% ۫o`z_E8aRү^]LokV ~M7A׀qt4:-A9W1PAFTU:TȰ: g4B (Qi4O?ډzfZf.59EjmtnG|G0((e6*8Vzv.AɞQ/㪜4Zkφ}ZEfr@$.nM%$qrC6cFm% 3+ ͘Wv_00#r|-=:oB-VJ|0[T!5`*#(G ܫT H`#11vg\;qԜ=~iK1hhN]^0ۯG; |͊ ,6OG ; 濔X6Sa9n$>:dOs+hPF.B#]<:+4A0bf:R,0ڂt۬dei'Y+F:(s=ᛃ;/lv"֏_B9T U?dRFtlfm~Ƈo? (m^b6 Etk;{u8aX9}阝l t7r($H~)m(Ar5?``7kz񎎫680!zjĜ054KM969xAـI h̘?N;`̂Tiـ xjسN]'^O٘K\- YU;1ƣ04~0!ϫǩY' k-樔1-j?Rk:c>XcWnǩߵ:vPmOiIyoހk"O c+IF#řQ_m9CiǛΩĝWK;HW%gt]`D,R=jؼ=8t{w!:?\X}|癏з^Ǔ cG&&e3>HݸBTKw>+H/E;'[ (ys /Oz_PrKԚh'^b Jjf`RG:æC}_\rY7|F},!oJ1S_M5|d(9nNcxP +u+!&g#kku M*;rNjkn֧9 #.9^6_'i[m+`.`1e r19/<'z0uv_ZV *0[n]q߸lj5Qjp*HnY&}tq4e*XzpxrBiILo>vpjBzpșI՟iM1HqC<t뾬o =r/5f ӿݾq9^4ߵZ֞,} =FVn|uVӾ_Z\jj6]3qZ>i0.81{o?X6)!S FsKh% UAis' ǜ^ީ>懊3(,܋ -vJЮb";t.l"m6߯QxKBs䴾1ő VVS]]L9~[x@{EIG+E=#66}pQ_ܚIJf1]Lxsnf?a] <.LXXBq}؊'fם33>=4s0߾ESw7Zq|N1n f"M(""x+?& ꑿ(pX3l4ҷ 0gjֱ|C酪]d%ܶYnZ@-ݷ%Ύ1՟ʫZ<OwB])Vozz[~-0=X;.6/=0{8-RFIi<1f-W1x›pRx{/re m&hu*},a IR&XD$8xOQG:6㸐eOKn K P6C>62%X&X z:vߐGtSJ4P0|ZΓfNxBPBp S(^'P$m:cn-RM< *Q,9z[Qq`LwmVȣ KGbYe۷qJ׾0'7A ?CGaOAfhvh 21G Kp+Jt4Qs", V~ăW^։ekQ9[}-`++ #6g8A1BV{x2gQ)C ;X ՋY0+0dg A3 j.`(\ 16!ж\! $Oh/'nЬ8ǙZk}jn®^O{Uo6r\D$ M> ry~~y\V]w:;跧v{A/m4)m`! k"|6"n se"7 1fSdTU ]RX'o$xIj(bt 9?qj |P g: h[ᙓ=6o#rj$ND.2ti(8t2G_YZx %Eӛ)M6ku'q2[S }nLT/rX,Լ~⧹\;HIWG = &+?e 7 u`ZA\5fצVק3~tΟۗȝ&069`unWTO>-s+ذ-/ެYږAFAF޴PB'z-H .UFŅtYB?,B(w<}A*^"]S3b`͗Y<%<K[ Ը]*%0z@:|D!pAk`?a.v)=i+!_  M.wH2||}޳=֜vuMey\T|C3_Ox:|NX'ߗg'"f}˙BCQycNG8j=K~巊p gihӆ Uy*D=#^Mp=2m~1>h^jѤf+m]/W,şpǓtf +w k[AU6 r"3/߹˻ nBq~Zv1nt ?]z2d8FڡޢHS?5\; X*7=R>G֠qƙ)[,ߣ4r"GIܾe6ƥL -"G4gXK?Q&'UFhÑ^>G8bǙiޒʁc?qN.0B\ "XMnsщӱp"GpW`n+὾R;`+<U~Fѿ^f t)rC:&ԋdR5 EϹoS~WrBklRgܪff( OXwqQ.\vO7ߚ+lN~t#},9{dS134Zi(h-{l_#6XLW+n*lתO7m&QG}ԚLK۸17**[Ǿ [\fh*{\Qxȏag)3~7s4 _|O7qbkoЛ\nLzXᑯyp0yw,gAq Yu7O<*؊Z56Yj pM=6֍4@vq*5jyvU-ǡg'Aبk,ƂZ?)bѼ{J;, 4zƇB*t m!g]*z<`aWng +v"jU mMr Xf/C+t$m &Y ³@},񡏢4Uy!b~+2MM^zR4] ;9 dEcӥCD喫7M0`/P}?nzv9u,Uqb+#!X%/ R34s50ܮe!3fYdۍOSbg%Zs>Kq zTXtRaw profile type APP1xeP[ => Ĩ?\6'Y} ̽<˾彿(fi c] @ y٤۵n;ȗ7B],Mq:\|a8r 30f}lhFCn3X_K}$p+dE[$@ϺPy07[itiTXtXML:com.adobe.xmp 128 128 IENDB`fotocx/images/sketch2.png0000664000175000017500000005062715247006660014360 0ustar micomicoPNG  IHDR0rtEXtSoftwaregnome-screenshot>,iTXtXML:com.adobe.xmp 1 2 3 0 0 266 277 1 48eXIfMM*V^(1fixHHgnome-screenshot0232~0100fotocx-26.0: Crop: width:277 height:266|fotocx-26.0: Sharpen: median diff 2 15 13|fotocx-26.6: Rescale: width:249 height:239|2&# IDATx}uT]I~y=3o5ݽn︻'Nqw QA ݝo.4 \U]-U޽ <$$T_ldT׿3j(]|.ep[K*eKv/MfFFF9++ yyyx ޾}[2{A~999E?_+((z XQI`$|SSUQb} "*jT**[q/77WhY{n ]6E9ϊCm ,s,AYBfffVd<c*.,+ p.eP2>P .5v nR*+-X cγʨʈmN2mF\kt~~~v"/^`՘h߾H=z#k׮ ۫:Ś`ٸp`555+}}ڵի:vuuuptt+-E cA(?U9Vm/MHW7͛7ߠiӦ`pn_~za7FFFbȐ!?!=YP& ] gϞ"23wɓ19R'ƍpe|5d ęYكSeVJJҔZnKC`[^8N|wJk2jg;v,4i"]E<3СCї%ӧa`` FvFIIIxLVW1lu^Zm- r 2u366Uy Rn+ l21#""n:Ĕ 8$3KÇtRhjj)w Çcذa/_.w)^ԩSň}<~X8Zl):`ϿοuΟ?!َԩVX6,Y"f޽{|9"xB`FbZk׮]B+XMcm4e@W~uAp9mb`۷ӧOg KmVJpj<*;;̙ ).KiUf?.qFgsV/^ CCC@R}ٲeFk ,U)3 Kl;w,mY5J0gC!QUq0#ܔ WuW)4+cEZDu@ud2Cmg@s=324aA>f;** l]f*2({U3vq!iN xy;&N(i\Ge@@zrBSFgʣAU XrSy'„P]*Z’[֨J&ZEufWX( T~ _~޾}0xC{8D y/1l',FaBcI;xj%;ww&{]^8w'O2SW_ NXQ,IY恇HίExȇv<Ǡ溱/upK:C2.w0rl=gP3s| |f,+XZW c`eȼ*R[[3ӳzy+[zesߗ+^eH+(-uN29<8V"/{eg\ʖ9~_,A^^:*x6 IħH=AA9_xyzaan3SS0Pܿ۷nkt"N>Ǐصs'+vޅ/_|HSN ֺ;;[8:8@&I y氷;<==j}͝+Vy/{q!\|3K !X@+ 'VCBg>NR᫯*? {+Anij$m4J;~޽E^n"3;+S VN%T'pb2TyVVx>\Ç~;t̟?ƍÈÅڵ+OӦMѸqcf͚{Bn M:'_ǎЫW/<lR֭aCb1c.\(mVQ{ k+R=f*$ҠIvg=>+g'AOTy`UK129}Uߜ'GQO.;K:Ĭw*wPyddKLG\l ٌ #=4ҿ')@guygSLO)nhjg͢E 1edHRUnDc1X%CKE~ >u|%_kGMn9O ͚9xkנx4ֺs:OyLZMH'<'%&` YbR ᳑!Y’7+g'@Zax<~#[p5kƌMv^ɀc5nrbn4=#lBlF9Rys*;bpĉ1s ̟7˗-Ŧ{.;vʾ>lmŀZVt g9LM4&ɓDž߻˗/ g͆)34S%Ad;KI܌Y\Mۛl",_ ֭mGq%h߻}==HvZ1 HKfè A^4fW__׮^ʼnqi1/vv%mC+ÎWAlټ{ג gGbI8RX-r%@ @w @6ًc6!-Y ӈ6 vZ:y)=Kv*X#Gcʼnmnek@4`9ٽ<9y$d>-cS :*RxG?ĵrrE^@<<ґba =Ivmv[6xADNE/B'ID"#ŔUm]))y[XDR,y ˒mh gd/ӵM`q]J2}q8+ r߼. /xk u745%ܹsK_2T3iʁ>x x5C2L|d|>Q)+8۸qP+C2٧a2I纥JҤ[SCC|{,nKҿ~y0-]tX+gnuOI &9loMcv)''zOnTuTW| O>#n,׏˩0Y \wh)5ԐQ9WvGiuI0YYY073GF`Y_9(5Kt{ʕTr&KoHb  eRw q[Qq WܥkRR8(yJb_3@nv㐞Qm#/&&,K[V$BQ&3!HiK;0 <" Te@^7eV~|?ϰn7G-ǭ8a%yWNm_[|L:-[C93{Ѿm{<'} 31{31)99v.#[Ъek9Q }3ƛy3~]5-dS[޼V֞<1PP-vFܽvr˩MFy_~$Lہ6],BbG`p9A>?`EH'Iy7p}BVnfx5rRacΜɓ'q|ÐG:py3еBbf Mܸ*E"=u:NtS+^da5 ~>|Μ=gvHN}zbYXf% i+"-) wZ5m6mۆ."26^\\hۋΝ:QXj5fLH[p4sOrqn!58M̵gvDuifN[aʖCO _8T { ][0w< sp #0o{5 \=#г:Z!+'Cص'7]Vl,bQ]۵0|~^\m:u-yykH+;n]c xo7 Ƌ?{QZbp Cfz"56aI]n|#ɻF`x6[&YlbXr!U0xx>7} ñ?c0s @\\ ܜa7on1cߕLjMIAJj&8T Т  g 8 1l$OFm wu@saW/qfth4`p+WMkE) IDAT[3+]G4?S>ȉ7Aoaթ'4ƿxV7/]4@y-f!<&/E~j6sۃ}Юãˀ +^S!(O'l\:]Ğk޽{KeE~4ke;yN-?7jS: &0%yV=Nk"2I/pd "N q%^V1@~-HOѤQy1F/u5zK8 }ZH/d~^n݇NmIZ&psw0zR$}Po+,iZh iofkGDb:rX:Өs3笆poºC4 / M8 'H Kf {*˟d1gXy )xhI ۗ@~&r yMҚp2ET?[2wh4ٖ++cOˑ%;)OKA)&:n><ػ޵ v,pJEg6LZ(@Ղlx0_B~ǾCaԁI=ȧwȳN _ | ?w=/'}5ǐ89]}䑽)=6ӖnG(9,c$IٯGMilG֟ѢmOm۴Ksz Ά 1-: l9B𳼍=Z/_3 3)9c0ath#f@^u~,3M~h5aepz-q5dQpfn+0ClpB?28y! {#{ѵO]xbC=nPt?lǙ'm6y0;bZX`imGsr^1m보'QZ#X.NJѢy3FzV>b1LS]dK| 4ta2 ,jaú   JK֥#y̝;֮^)a,\7uh*@ oŒu;22΅vo]s`u( 8O_DlZڕ1o:oS`99x,V͡rVn;@.lT% IaMLewk7GMnmxok@yY w-YcX0mC"iO@\\Jr r`)}?O[&A.A.%wpu%ox2ґJdPsVf:]/vy>v!A.A^FgBaifD߀r 4\`mi(M7’%%jb|,MHY#~w?{EGE3쭑THuOi% CĵWq\vwjÉvo- &оWg(߀(X4U1)>njj@CCfHsWHM븭M[D+"[#Ї+2s n={1Qyg&ȡm*:Rh,=#ܮڨ[^V:@͛w(V@d,d'%n$bߴ4[Llrl\wݛ a>T^0݅S*2 筜م}~c`Ёܱ-FL[KW_ KA7ET,]`U~r0a/I8r2pڛ+ a-mwQΙ0ӹQFbҟџ,shsxbҘ8xR!duV_KMNrQ6I7F:/mH ¡ В|?ࡹu6d\4ؙja0co mջaW+ 1C9~ [^:&>a&ϚqcF`Ɗ&!vNCC y'CpygwmVrmmK[.oj0s6J_Kpǎ޳xI[?_" 0iXwLXIbo㻣E H,o^/K1uN43 !am؎4o<ê#Guc's[+VX#rFz7 iw̔8 7o- ѩ]{XQ4D1Seb W'+X1iKqh Qؗ>b/~㮩5\a hֺ3kN]ATN>΢m.Τaa˛E@V)׾ݺ3ߴJS$ٗuՖO_n&ݍjmֱsh[uO"[w .Pk=6jd[bogwVM/xvmКGcu7PǶ]傼Zk\%[8ό.i/iz>R;( Lk:~=w$ ^<#9K(2.~ݺ ջE[3мiLX"ICѤqc,=sMqF4mۃ"F>wwͱ 8y!`.+("( '.C; 𫦞P5H]WxiȊ|k͚6"6*2QFaLIǙ)xdP7.3VOƄC! Ѭ17lf ? J*wHțwR_w]/17=Ůvq=inJ&ОUaK\E%rQ/NR|L$E_QPwƎ$~9 :iOULS (淒S? cy# e oA? #cD;QnX<䂶2z6(Υ_БbzkP"ɗ a Íh^]<3zF.]ѹstx36@x\6N}LjlBmIǮ5S0vNFAc4{yXXQ<bbIxϬ߈f u(Z|]|mS;U<*|S'}[&}ܱvLtB$}s8$Bp/1ڋ:Ia! C Ei^*s[<#?e0‚=Uc܄BRCEgGE˶гs&c;RכVl 凊fVU›xv1p\ Õߖa茟ao rj<;.W6Ők]v-+?4-g#qqlᳱbl j?^D% jMc٩B`ZbŔ'ɩ\?J1pUOǛN4j]#wPzc8b^zazWI8g%M])1@E(=\(:IT߇3#//G0UIY0.<U*[#nbnE{o^g€4ŏO C&!zS=Ǜ+9ޚ}Ŏ"fex3:h:mMSeg׹1nA\ҡ '4KJAoASh&񁗇+ _Ƙm0u6dhCEDa>=zt̬_o7EeaHe Dol^6W 9#=A_ n9/Ur`-4nܤg* ?}LJSh7h mՄ||ޟJ Ǯ1pHClVM!>){Ə6#Fъq?l^0ӡkbupJ%zOT&Y9 뚾4 E/Z2|2q)ádž`ü);&Vpv|m 6Sh46Mi3Z'؅Ȉ{\9'΀#᪀/AӖ#*%w/`L3^%_Ì;?=;q[ϔ|-) OsZ:fISb1N?9ih3z#]0lVc^*쌑SfcֵX0GZp0x׍z%o؜Xh_;>;c2t 5ゥX<:A Tfjnކ#G`%5z"%&֤]emw2=<i?6l=b!1 ]:o' !F5MoB[Z2/zP$CMtbݜMana>L=#̔n[L;.! 9S͓߻;_SGS0ГxUJp9/ rݛqe\|I5IzZ9"5Sl9ݽ[5/'>.64OWRkHBp}x@%'SR\Rغn˧*?/+xŌx#V.V1U1dђU{s(a Բ֬4zg5Le O"(geXG[,?׺~!)h䪫b)-e82"֢?05Fŕt-K@ K}萺C/П>^ s|=м9yBC_Ue0HNSe3{G;?=-+0!$yՅMN>7s1>zΞ  Lߚ2˗ HKKrS𙗪&&& 00np%P98(-ygZ]H\\Vy@\;.%,~Hx r r)U$U4Ҵ.A\\Jr rດ EHKKI< A,iuR8Hxץe-B\\Jr r`)M4~ \y@<g2IHPOyr7I@f3A*ե-(ˮ r ri8HxKiZ?i]**u)AdC \y@\;XJ!M$%k\RjlA!q]\rl_Y6&*Z+lkpi*A^OdWDE}Maԧu%">^1KҚySTה"&夥$&#=D1NITv\Ffz`hyS0GUϮRlLA}LtV]i7GvdQw*4_^ 6 "^,.C\J3^U;; 1rL7o͛7pMhݽK{'$$Xrfyg7$u "V9ȟ>z zf!,qMܺu u\ Aݿ(OCaQYSC= t'眷˦<^A6,#|{.W Aў@&A^c]U . rP>3?cWbO?aqES3g=FʆIL2 A`)(ep  x:biб#z{mvx G7FAy$MS_Ծء=lo傜Tu 뚍`,4}FM_6ƷMZ▅Swr6R2myI gf#o{eX8>0>};bԒ-zT ͣѾS/Xy (ȦEiZ}=@glX8]3`eg;+\={#zk2$i܊vCۇ'ڑs7Ohoy -l9'3ѷ:6xkzq cP<8KK s:= IDATf. m3zSQxR|KǣÈy`ɖdܽ c̙XbtmA)r5?cƌʍ;aaF4a `^4X`崁Q3<Sb:%Agѥm+lb2I&G"h=:$ͳvt}|$vlY/4BCK ‘?901Si$8 %%k Ll {_n~OEc}rI@ͽؾ-FN=!}mh;{* &m`0N]0u\xh$mуcߑ8x6ㄆ6Ḿo)z7#X9z@x{:ٶ9Ѹ||=w苻FmvqʀCtl AmCgaX~ZхRĻ9X]/_QN9hnU?}ѩ0ӵ@Zf%%k E:OS1c/: f&B6[7G qHMMA>N7 ajq.i4&z:V]/@\ _aʊJ̄;g$Ң# 'Uvro}B߆lo&nWavĐN0w.CI [4zI'V<8? '3nձLz(ɟߓ E?GhH IY^A |W4m7? 7iƧ7ȏ7B`5bhHQXx//11I>>bm hn;/_F<惱MŵN6EG'lY qޕ_Ѕ" Q1qbhhܹ$i伴S.C&EMXn\:a=cp#y.i-wOnAMpc>F0'zGb<͍˓$ Ee+/w8 $=wCIK2yw AVrś}13|,Y:$)E@jBWu k_KL]FBpt,`քg&N`8~ maH^?d,Zɤ9Z$Slsѹ[/4S'OСðbE⅃.&^CGbƬ8x.ag"<*ka쌱j} }юL^.:~.7bܙ$;9H;kbx?jF۞_aJKSPo+GS.4{|}rMџ̠`Y:2ȳ HxOJ*ד7nFxl,./p^|W\ŽihchY(Ik׮ŋv:̬L " GZ;waTdׯ"cl)caɒ@QҬ8'߿WҥK~P*+b;75R`KKsK=\׼ 'w@MNRܟ4NI <Ɲ{p @VO xl` <,A.A]K3{u3esʡ|T+~ 8$:!5ĺl/raҽ$Ss$9$UL]*Ἱ,G:K6f(NyyJQ\v6Iq|Ju  gUSq8mR+QM4U;t99ޤ$34#N$KB^$ͺ'a$ f"+#^&TD_Z{FC75|oCG?v\KW6}13(@ɴ 3k}L\7O#onQ>3ej/ChKSwv\SSvtd8䶈)ny13fN9j;ˆKb؏aﲄ:06u-> &mhN;#v)Ou~0xnkEڼtIp|IeOF;>chjQ S!A.A^ d/iY!|Ajh}H\{Ɵr]3t;9}=?^:'iTXtXML:com.adobe.xmp 1 2 3 0 0 272 284 1 0 3 :eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:284 height:272|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:256 height:245| _ IDATx}Tw [PE.Q1@@iKRB  PAa;}Z5\kOmhh@UU}@q֭-^:o|@4VWW_+++Q^^2>WTT}4z:euVouuuΤfs Evv6A^^PZZ+@^ݬ;^[{ :mrid2y43^00tοu!3}Wyff'/f=į1\ v?o:?W/{sz))4S P43NfP tܝ== su~g(R*"~Y , ;΅Ё5ǣW9 V~ANNKKK RRR񏟆'(Loz5^g=ꗴﭗ\/=ەǓPYۻ@z*x"2g# o83]@PJ/kQU^̌ ~{edcrQV΢ը&NFLD42+QAeEriC+{Gw2Om,4'5%3^SE<?Xf"1ۘpo8{.DLZYmz3e%6`,ÐE;}/J[R1kwtϤqm~;TmAaq09Ȣ32ZdxTk7񧨰Yzs@茮\z+^OQA><sEg=LF奅_#7`x?ϐKwVaÆw p K^a/_*mۆT.z ǎ|||>y#{ Sp+u ,WTC*V\p} bҠA!,& pshUAS!ad$!+-1I|Lx^\ su9z.3B#3( Dž4ŢWlaTC}5^"OFB~0Uw?fZ7&f-gLГ`2c5bRPSS}<EQkY,kKQ?xY zƌww~|X0ú[Ұz \P={6bbb>zyy>= "( t5L5U `\D삢-0y(BXPc"!di&37?,g.#s{#/J )XMsPC E`f=A)٨ɇ_+(bҴ000D ðFbbr FTW橐FQ0="5lǘ@SS&NQvqAEuNlDŤ0j4̝= dEa9m B_墦:G6͇,գn`52d}zWK9\m1v נ 5L?Ud<ϝ1q4u0iDL4 #\Gm*Ճk"%D * ɶӅ1.>$0޵!&$%|%ƚjADXJ:p Ƚˇ'/B1:n\ CAK\$PaV1 LŽ"+ES_r㢓AƒS\d1'\C{4PzyHԥH !UvCm sڃҐ$D;2(HfP=O"_T#Mȩa1WTT Y+P: B^AnY%NzƐH3 Hyf BC2JϢmw=vw47M58zLpN}AU :u 4M; jFAf pn̶ԥ)TY,߅DxCP L ,,I+v!2>g[Ar[}jBM;w ^$l*tFƁˮ񅷷7$$1umF%#5) ֍o=}ǝ˧q ,獄4%mh;ވMJ5/v@^Vۚg%iHA86a˟b> fL;3/}y wz~|Xff󉊊z7z)ɮ>|c@%j'Z@#c΁|C(. 9EUr-աI98҂6 "8R1炣QP>16HeU sm9 6jSyZ6X3}$~0DHS3h*Ȋ%qiy(AC]d0T@D*3=#PW_G0=@HAAV(fN2ES%Y) aȭ%ZJJ0456*ISUr~m˦@$!CntkT1dy@Mĩ6"漊ƶ662,*Y )Pqyu8 -s[ǟpsf*di K)N WXJ 89 zNyh ] Kz^bWuttUfwgSWA30 p=1>g1L rPQV:7xd&;eHi0jB{)H&L%|h@ D%,EtʉYl2ȝ-xrg"ʰ;ukt;̧4[:vW xPtra U5m[gUS^=Ö峠$^4ty(þ gm) 0''zT!+'y%UId|@/Xx>fϙ6S ]F4Exc˚X`Vހ\e[f12fFC;{{Ȍ+%gSwgv;~ }~.{~>1eg#3Jv1cޯ;gXVn֞ޮújo`_0*/|_|:>,|~}<Їu}XDï:ƦIxIyS{˔|>Uu;>|}(w>a@~Ǟoz|:>,|~7{r@>aw 7>=>|}(w>a@~Ǟoz|:>,|~7{r@>aw 7>=>|}(^xܺrn2MuǏСz I x狤l46q]вLxܼݫJ2n{"KCme .xo^߀0;n+TqvTkum|$߆$VvDa77L aailJT"+&Q*TR:f`H&N#j'俄Rs exN.N+UL~o,iG]&^uf*IM"/ )\0NO미Mi4 : mablcSXQh~ۈLW?ڦ1f6m\51lpHiB߈g!*isS#1}xcx"1´vx]=in`3q,=k"-#a106R}υ\Eia.Q~Xl.LL`jf嘾h'{΄SC6`(+str1% l?e\+FgɵMxw3z216!nx 88hb3\:5h+K&fXr#Ŧ&;\.a4k.}fv۞+zܲQYi\y]p̘R+l?| %mGaUe9K9݊Wm< -q*Y#ٛ`)˃۵Lgr`r]JbrN}͋mz:l߳ V#͉n#L:Ymg+ _0vTL_p:ֳQhB;Ln/ȑ#qY\KO~wo*ń !J ߁훖CCISCcݹGKLFbbo,V`ܻw#CPCCDymC[y-}=x .<iXx&Z'{,tb0^(BR L14fێ1FYce.ruS5 !hŖ]p|Lu!&< /kx r0C`1=( ӳ!>'hZƮq^<]`c=+>aBŕ& Qye^Aph "Rs2 6` Xh&ĝD?Cr W[({ųKucy{̱]QØ9+:[U3䕰΁'rf Ea`5{)|x %;POFf( qVo 4GڢH&T:ÆrlڄD n@.w5!mcm&a"Jtԑms)*@FsWq]Ɔd^!5q+UfTF"Ns9( S GZ!SKy$ , h$7S_?:[=+ 0h ?GCcwgB⚪ 3K^8wJ`#W};q)zIFxeP0ˆaUX_ IDATi-$gt)fN=*,-΅ihUOj[m^aCp-(5TmjBt5( QE1xT-AXz8-6Zb΄MO΁=TUuq񊃰[vPNQcð|:&܌ WS[hb VR \z8dT-4Uen[HjY?j$^3ȯ8aw}m rXp=TכfLTC wAZY $^[A erPu`4{gVsxpn:J ݀8LrRC}-jkjT$`.L-FxVKL*4fו6C1!0xĽRB`֝D^i5cPM-^(xxscuҁRgR|a'vx M$=[U 0PRҐ2~y&-J`c{`.ީŘ|&Cl4">60sK RpzhS=RҐ,~$D4֧`,2Be $l3'%Le<_ɐT{FcN,21*peBe vkny'/C26aI;'58 VYj&$UſޕcR[ 'CMJ"_-M%<`A)_w+%y/qf *+p$ Y9)4T &26a\J~7~Wp1%l9vI/3 *H욡O<ڋ [.-ϝ, lޑ7sv ܝ8es?eUpXb g1/cw ~ ?cfׇPX^vjcDIh(X Hڢe\ c>)wm𥞓jܹ`GaށʦtE1a&gȮR1WPtۻե88WSaf H 12Xk`9Du#9m&3fzR-A;<[@9z o$?iyЦ.vYx rz*2z<g`\Km38fF.܄wPm5:P$ 18 ~щ ̙zqӑT. *0ÑNėJ[=QCHTsG=FjS!8 ij dmYT\wȌܧkBHX.;Yƪl?Sc%Ф4},zKAmXjH`I582jxHNNBhPnpBdj:8$7h88INДG4NSˇ8 b'T75N]A0i6T@\9 ?<,l 755Q*jk*GO? ֡$)6 r0i jp g}HQ t/.\k2 61a>{2: iq;r5Õ!Is#x\+tMPiX5Ex|ԴWEU6bl=)yizN]V!}?;14vp=l8GODݢܕ97fOfDLކE?_޵ДǪ=PMFǍH K5NTa% @Fa'BpP\zڙ4"֊g q HJ#\stBvM-78X֫7" jl!ABh4\az[wSܪ Hz#4!0D*j# u!JtrL ȭCZcCh_7?4'H$a5v0M&exq#V1et`j5qeH $= ]Iab'Vҏbx=Q4K# Ղ ĵ{2{L! ^ٽ}%hBI+x?DԶ--('^>h8ʹc,RcmҶj N}%Cr[ 'ZDcl?P1Q9S!nBc]1{>++-@/"z;u{Yh(KmmcZuv|$~ķauE "ybȯz/Go_L|(!""QqI,q9%{Sq6S#_wZc ߟ3e[Dd*+PYQνů~kAk4;C4JF ӝA>W[r|287߀>aP[U_p{qwBS=ؼ_0D,lD>AVE̤p\t4  EmSrFshuڙWq4eak}s([C菛ЬO {vK0Oe[w@]MJ:_{C]z8]E>].?AUbѳ(7#d#wMDsSo 𢂷F[7*klEl/|wXѪ#+ L=\s>֋c1hx-Ϯ\]vꬖk*}#;m>)) $-%]U4/{=@ -)g^[`1b$ކWT n?-;CWɈ$#,({̘7HyܩH`3r6= ]Jpdf7K,1)פֿ+|=r=gQ$OƯ ӆ5 sـG@Nd~#ze0j$UR$CWeQ1L[š,68qfh,jhwXm9"AYh0Ɛan8 g i^ '^>>ʊCמ_UђنۑhgN}L7QŕT^{CgcO?@}U1AR E>]`i+JPNŽLܾ :(\R57 Q5x|dhǑIxXJ@Vˉ95܌7-u0yK,&XB+l4lۿ0xT-yݛqjj E 1a(GyG&"PDŽ.*m94UևW`<,>唁g(9> / Æ )hTPp%񬭩FMu5W4lE@C.m(Tf8 CkFH .kK3qz m6Ӥ\>Qy<^OoR^uCśohSGUQ& ⪩jJ♖Td9m9t=7%׽?"Rل(o \ڴ" ڋԸ:(ݨyڶ8" j+RAiAt eE!XV8m d .!9YHHa8y X2VDT&d } 6:QJ-JMu5ddNIQ/D"xD]sm('|ng#+-?jS+lX6 C MfYvZ/@pz_$H%Z<9II;İŧmc͈x(MPd[3"Q*SuȈԱ]LF2Ze:(XcUM3H،o# ^a,-7\PiUz<> C\id 8U6pnBmv4aↃxYJQ2~gMwͭ vs@E6MVď[NKSc),2j%/CP\ /kwXʐ2^Q_ MqfJ)'.ЎDTTfssHPP4UCt ]OMVo_}E|kJc : mT w?~9yc0YA0n=|G%N9fP@HSFʈB)Z2"%b ܊mulW`۟oѥN꼅j=E+~ yhΦ <-j)U_7Cҙb 2?̧D-7 @@NxH:@CujhxyMpYxTc1OiO=e6D!dDC~ ]QJӀoilIݞrɎwonki+ oʊ!G;$n?\M #fkx\Ǣ 0 SH= zpJMI2GfDr ǃG /!sDGG i&&f_%p:*8N2Kv 4e;{ӯ xt{ВۢŹiZR(5(o EEE%K:nI"NaG8 PX.T``Ց R2`mxݚog㞻bMlJ̙isJ8.YCAySD<u9I1uhhRO/QZ@j3"(Βe˰S¢CC3֖L NJ  -L @z,яܤ%Y ~:Xj̙ 5 K/w@ey)pػJ64C2LD<^SُTM+cɘ:ʲWǙeiDk0Q50f Pq*BE RւGԣ0P’[D<51&YOge}!b: 1e`r+_73ܝF=cb}M<U.WIN 0ZO 37RԾ3>PܚmSpq׮9cdfw IDATuw浅94wn9pq?/s7R=iyq<}ׯq߿wKӞX\(3(!6rDi+3yze^[GuƍzOiJ Yy;4#~QV3e}BmpL?/d;sYA|<|~Rܶ3u; O}>^眈~oUie-|pX9.n})n.tXi\/Ks)#asn݆?y$d B0VGtMYntPHچQn?tsrT8{R^~tRd(R*#=ms3;A\Lh:z3FCY {Q:DGiqN M}mb<,6`!ix&t ۴Xb)?N&*h}( &[@PHb事}*F8NYz-f:o;YAq*;ted,~?֝Aius0T.n)JXPFnv\+hKwblTA{ji!Ro5tɡgqNwQk_&}AG?}A4~=獶'y>{'m{7 z~9ޟɍ|{}XЇ=wOɎ|{}X)r>@Sn-'+#=z >{ g?ۿl>~SF{;nґ>~|e['M푲x_Է{=:;!Omg 2㰌aw42\9{9,~cẆXsDX9z7̃8$; YetV?;Շ}!pSe!Xb(7$dTp6.~fSzE(P/-(l9(2LUD0."rs BWW* ‚vH/:qOCAK*C&ۑRA9m EUmxG!)&t4T '/OmTa>q:<)]a&ػf @RFhM+`#882KÛg 2[]F)xT[U5 <>C )iR;D(1,%DsTuW1~/iCh]koJ8??q?o4Vc$E:>kNxѵ 8^Vҡ* `G|B`nH@PA." ^R{u:Z(zqF<=+7 .%R"NݕsAH q,8t Uv/1cJ^4 6́noTSLd8EE^AX* ,0DiX$$$iغ{? /+o 9k"2R#KSAnܿk7{prK)GR3PQUa&L\R_ޖЎŐPá+.O~ w;8rh?)]/M!__P㳪ۼ~} ԄD1Z<j2 Fg2jLw-/=}qqL:>|{c%Lr t ;{t|Ni({܀׉xHQ\xΝimt lÔ Xspy,*\3[N}7`-> WZX>$+N t_p^ct::eE;^pq̶)6c4G w& CfqUPdzJ: vh[ t\(X"Ks>΃-=Gg5!׏(SW7 g8 .Bo fA)kNsd%!Ӏ=0c{5~1 i& XpM@)Б֋ !&O5t ĬԊQE0˻ܫ"SLS:.0guQEkBg Z2Ԅ(,\;vm#1XTn>TY:&\kiQV*b "kw xѦ19K`ӶD'*gTt!(aD/=Z=qWȊ(#cchYhԶnazw)[, Me-߿C /~DMfy9!%5N]M" $ATLxY[WZ?1ԝZ}qw 5|oFx"kN"v9a~Ěqlbt5$jJ/x(`U,ۗp/c !uhdĩ[Ҝ00 .(cXOeZ !(%MZt_!ir oÿ'b h 7tz𳴘v%=0ZG}#)? `*C+\lm\ON,Dvo邒9p!&[q>O֘f, k`cG${ OR&)J,Qa-~'^o`Ȅ,,f-xb~z$g<0Mv(ڎ Cpѐ ;;v&wt:8 3\41*9~-["$|uoy ̎@fR"0mmU'(Ȏ)l7īb2qxjLO+X >y*Zua?!0;G;kൠiv.CƸүsGZ3^Ymk1wd$qΫ? fʌm+f@JBbbK .gY$>ϯ,ۀ_N'N#pQӸ*:W1,o80g_ڣ=g/oは96=eLrj<N[jS7톶vOL>π2$f- @|h{HvMDtqdE!w sxAZrc 齑}49߽4N$mUE(Vo#9w7?" {A[E_ u"bIǡ5j@xHWR]kld[SCPC˿ mJ Kf5k}m]I|ٜ2!|w-#=}~ `h  QQ.@ߩ)lɓB͛=f(js-EDhwh/{? ioq}h&83۰ pTP^AwJ˃pEX`vnZ]ew݀%ݻe4|rfoq._4Ϭ_]&95+g4"UU9 +(Xkp8rЌKg%0 %D,ؠ|p1@{g0PGmQЂ [a{bP]菞uV Ol< VEDr@EL2ǐzhh~aGLBCDEyx 5ރ^~g kρZGIod|X۾cȈCD.[9ѥ$Gf~Çp'N׮ƔQk' ZJQ@+&*h*e!&& Yel:N93#,HwP]Ё~ h'؉ (Cr=_C[ šC`E:aHbC1iuiH`<\];C\JD9V[N 0;vğ 0:~)/Nf?@'1qlq!Oe`;m $ Ew^yUҨnǾ7RR&\=Jg| =-cǔnR6!3y4vS1#f'&dyǨ|dcie"xoc_8h%er/g vH楓 A}c_#kǣ()Ɯea;W4Ghb<* QH4,1RO;tj+{dS~Stl/uGHA]w dTbɦ]x,LfA6.w0 xq%J1v:P zջqپ+m'%8`I?NJcRYPń[K<TǮAO]lA8Ami1nBMex@pMXnZ$эGb;xnܻӇ6WyE:Eb٨n(I[a //T6jWÂCA8>Pi1X-RXc[x?Ha=j}Pc>Sǿ|Rln&=? CC{BQN^?4h3˜o)$q;f`ݸ5a\\ 1pF9d9t(7:v[>fYxxuf C:n<aXs?%<]YC $ gwԍ`}~ OkTnnR( T=RXv_@4c(զPyd`Xzeo?PZ3C\s|B,Jo tͻ9mKG?>y"&& z{}%x+(0iv=}@9xf- d`:/^h9\7pI< q`6t,^Ȓ7l _ *8$7 36 BQFMY(\.7S|}Z(v׃S^9 3Gb*H$ Vg_D_ Y:"BKcUd?hÁc)ԁǘ)3bJ,] K.eڭ" _gyo{)/f|¢@iQ,lF|J0}K+b\B`=aH=^uxZp&'` wAixŪUXVMKW[2cڴJDUc4j3r3J9fVOLѲ F/ُjP#4'l,j9c%eP/cŘe(SC6"(􂪄( h $|= J87 #Wƌ5黎(v)ɹrKuN=py#~nn xF,Í@ ;VMg `wsqzh/W<WǗ1@SQ~p }ԅ8_SRQ]fyT& "1k:F#/k }S0ˋ9)u&G8 2AOAz+.>W3 0t=4$0bg !yš?~.ݵ}5<~6x_LIJ76|z7@ (~<:cGa#H2 {8HwAGq% X/ g#@t: 8=CDNm/" Ic~ZSIQM :&;9 B[ⱝ=^:XyH4U 9!, 'YJF j' XX{b8n"$c]06s UonUȇB?u6)m ?ׁ$ `(j`ӫdЅ}іI3Ƭ=po]0AR$%ICLq KTS}S'WUARaa ȴpٓ7 /9y((CIEGY (]_Pl}PR`wed1b|ħgQ?P*KI#e++jDodҽ6OBB<32k^0?N:E\~Ilo~~*&$u90~5sSlx|i4eEQJ FjF nB$ 0%f8:@o,xdNӍ!}(bO,6c8 OїH8u+"Fv5ӷlↈ*g /'w#N0= ')VK./ %q#Rd :It"ܽw;VΆ,~JJ ꙃ!*!kp),1iqQN 7ÓX@N E,Y@r*Ê}4B%l ;)Fу؍Lڰac,z3O"uUh%8&,>9o >ză ^'糔Yl\|%M)OCPp=5?ѕahtՃhpPvGMmC O$?ŲL!*=%1nڪq0<Re|y*7Ad[)rg<.ś"8\"4E4D+W1,A(άbꩫ0_>GYQ%0JMWU0ߺ8Y"Z"cݦ/h 8h8וƟl{F|Q-޽ekxp=J,?Z/JȢ4cJ`['X?c9 #S 8&,ڲA&~=ȧw""Cf{ 2o}OSgLZB|vϫgQ$Agj׊=j5"DX.$j>,6N`yx[׷̷*˴9$ʹ@@?h T ~#q%o/u9Ld/m`(- Ĵ!c8"R*$- gVr%R|_L÷CЭm?0֬kS=(ΰA~foL:ƍXJCiŧ( "^{t^B{"?ꭏI'cl@)(u%,q[NDq!:쁘][ s*:va-k%E3h&Nca,aJCה{_jf:ϴ$[Zm5&vb(2.~rU{yCH}hAeOf>CZۛK[<%,. I5L٣kOq Gbf FWoox" 3exrm+h(/*4J TFCI99ʬL<~5M@[PWTœLj4 YB12۰o_pzd*,B_ &w+G ND^PQmgiYCVf&C' \$ Q;}jx!ޮ#zM9jlCWAEoEЖ$.DBy4qϰیD>tƬ%@=W do$\Fph| o {d"nZK`ޞx;h (I:, KFÔ!X9ZFn|wc=&Lr] -w.5Z?ˈ10;41$g9l{c]`6J}¡p_+"sS)eOkٗb"u?\I?pm4b3MXfhLA 0,"_ Y{&]j(xc_8h0 n_ &?J 27 mQ3X^z,Α 5nMj~Bb1ޖ =IJId)?;M*J Mu5huׁn/hkwCϾ<@$X9+->)"Z>g"4աӓ}_׮];#SZƒNj0n={c2t_~WA,8r2Ak8d0܁}'2^Eyt㍡t۫'LW FP]ځ8 KLԉkŵMJg9nbeuWi˴91;kOrS[֡N\ $=g ,ŦqЊzKř Bi>{Av*}<gJ>HJ˨F.(>puuEf{NqA6J3rjzY';= t)|/_@r.XyEe}ʖZ)i1pҎB9Ь7j+/D Jxc#͕",: G`U.]zBLj굆,{D;oh/ $w:[R͡D)Foh δ/Ðga׺yP :/zHS8h`sqi~ µW^4U[CR>9[c͚!`/ر 0|^Rr0umyGNJQN/)#:/~ b:4ԔdgВmW/- L/9,{M@+K]7˷Yqh2@f^۰8ڰ pІ,8sga ~C3wmXpYmXeDa}2,\h0ݰ GZf1p}s +3RJWGJy,>F!n~jFGٓGx'a`޶j2%hsve`_B<0kx^D23k+e# إkVvƴDAOkόq ~'+0K`%TR%P=_$!cyEu,}I>ذ`V;On׏q:G2;[[xKG8:8/pHiy匠 R^{zB2Sb>`NNCq|T#|Cx?$q>8U"^.<\RΜzDt|g"'E;R=2]\8- `̲(P sojpu@fEYly<1&s*"/Tc,.B+ x+ڝI$FʼnK:< 7:3-$R?_Z p0ֆ&t{bБ1;D%q+0NW UƆf: Ci8Pt綡7 ! >+Qq (61D Jxy;Xx* 6Z0:9 yiLۯ8@~Z,N\TW}C Z=k9<QnGJфqItf CAY^ V9I8y c@hiauO)7#}aJd#]pb03a�rjhlR\cN  ߸* $\]LZpqM3%,lL'tSM\5AeAxl"#>p5'wNc`OM:@oC²i&ٻ-ƞqYtdj4th/  xQN0G]g, ([[ X_\G,]qƓjE5uZukȨ6;GVF]rnЙR~-Ye m>7xzz d;T@Fʓ I(ё,x.CHMo9DDч GB(h,#lBH~9:o!ө#tG΅,OV=$caw)QyihW{P "_`ZCOȪaPs܎c0mUbVǽ; 3w+A$Iġ5d(.ʲk_Mpk`f,8Ⲫz lma)PV&hfwpb> 0wa$cO81&nFA^0w0]Cd8ֹrX8bq&hȋ㧟~Ί@Ey)o:K)a݁ #>etV@ _p-Dw.0? N!rQ_ џ0:9F>cz@T\z&8sY4~݉uhupW!,]_ۈ( 敻'L:Q b5I*w]߀?lśq tCV ZSP}X$bAO Kf=3C+4(jwQa?6J='_H x&\*jhƍ6F~CP.98u1iCQI} rd/*D l]>j*P|#&aTzN7-Ib0.͍̂[-SM+~o4AOÊCab)dH% `h#,_'woOmm"* /B^+놅[h.ɖ 1gDЉ>fbRtz?Fœ`:ѲGVl!Sl$TU!//cp&RƳIN9;? JKIFC)%9ϟų'u @L)Gff&xrAZgEE? 1V&܊蒶#l "weI !.̏{nXYrkp_t㻂 ܸ|#MFb ؿg  pC?RȅǵesI@A~rȤj81yx*snرy/_e˖aͺ zoG㌕5R5>ggZx1j2pu㔁[4Mp1~Xg+RpІe6< p@׾-8,6,fg8ڰ pІGݸ5nl:%8eac `~PxqN~\(QltA8| \p@sef8ڰ pІGѸ65ͪh2@8[&ᕫ?eO3$1!臼F./'~3̳_RvK?H|<F>ika!{1a|i*wdenNLh{{ 煯 엖ߒЉ0@_o9^hoI4?r xK|M|_#x{Q:mQ{^XH`+kAD(QD\\4 %1 TPWn,QMvwIDATy3!pUo^-< <4Xs@=HA7l/$isRB<^7cѦOy'nF봛ŷPe<jClS͢B%yMXs'#}2 qߛgܜe@V%/|,N?F8.\ @ŕ"as n P,?q'= i7@Pԧ} QMUM^>>K_ ޓ!/h.Fo8Ȭb`iǰS3 YW~`1y9 *=%||Y';װvz#<mMLLbt yKaBR"8]11<$phwxHgt{ui1CBV#G|Q2VQnR7A`r:~BhC'BT=[Zǿ3 YbT#AOc뼣\$ 6ƞ#'p5vnXnZy?"SҩB_i?~= sVf&PO_?0 rBU0gj]cQX{,2ZWsj톮zưuF) Y8 }m%h#,2A!Nݟ0e:fZ*%aP9v)юdG' I(w=C:V=ǼQo7vRZIH`'U/EȦ A!SVǀxE`{x6D;Kk&)k>Xu*2KJ, ӇjCZ;3 <'#gC\J 61=bx=@AE|Z ZR[l@VF*h t;EO'Ӷz**P&x@0ph :*&xZ1h )&0vQvzOΥSi((*AD =C ı:%Wi<ǂ}0)n=!E z: 1*T!*& QHXgX>c(F:JxΫ|G8 # EK|Bl IFS!xfdHx9a%F Q,r1Oa6\:G~QsS(̌Ѯ$lBcPR|a=()JqzEkg@Sp:jk\< "bp̫ON3,s_E\.o Y6rTR::޽2MZ xqf`@lg d~J CjB(f@!݂QDѪg[ 4]̌I0Yc6AXFR}nè4z "0@@kKW/Af@Nq kJ QA<()A/59ld,~~,n_n}aIgj@E]r苹,Ciat؆LFe2Ea9"259HOcSf&- 4DE:IZAe,V1۵vel1BK3pt4`0f2ܾG%K{[X]> c]2 p͟bL<:$T`؋ `AJI¼A rɌĢ EO^-^:9 ,.`"^8AmxGD#7+O`^h/kR$6L@Qq<9L=kiF=`3݊<\5 r~:\^y <r_,-n򇧛ݿ xR.ɝd3[5 B9q!Uu z@AAyɴfއ)shz$Sy 8m}mnֳ Z:r![Wσ<ԺjCC]1v" wq7)D3/_Gy"r ]vp@BXF쯆6#,1z00ԇn~xiOžK 0b 6 q3sp|.{Ulɔ%%/:Hyyvŭָz u ^Ad*f$F`uݒfza6w2s&S?5>b˴- v 'TSN׮]GCy\/aey UY~u99`#[|g -UFa(#bZ43&0Oy>f[ )/^Yf'fvAJ({61ט{gl;kס`})J=Gx. )]L&/L}j얼Ҧ_^8hU L]ڰ pІe,ۚ8 mx[X'U)IENDB`fotocx/images/global-retx.png0000664000175000017500000014465115247006660015236 0ustar micomicoPNG  IHDR>HtEXtSoftwaregnome-screenshot>iTXtXML:com.adobe.xmp 1 2 3 0 0 286 354 1 0 ߽~:eXIfMM*V^(1fixHHgnome-screenshot02320100fotoxx-23.70: Crop: width:354 height:286|fotoxx-23.70: Sharpen: median diff 2 15 15|fotocx-26.6: Rescale: width:318 height:257|6 IDATxXUzMHww#(v݊ح(vba"W8k<眽̚3f1v%%%66 0YXXGJJJannO]XCglBff&oϾuY/+?.99߼+ ‚D!66OHH` tiii+3˯n\L͘ȝÁk`Z^LL ݒ`KAk23@5B_kW,=kj96lEm\GtjzzPxyz!<>YӨg#!&ޞp "S[eaaZVSӌkD~m de2[Rf&'ke/; {/L~DLn\>)caj>l(8ezCEEB›.7xs`'0fZOsLJekĴ/3 ]ߒRf|ߨӵIǿ6#5mrL2 &Mƴs`l-F|J:Ұe`tʆԜlvH'C!kf@J3:t՘zG7`9s2&Mɓ&a"i̹Xao?D\rZ=5qe[̛;w@xjnSO6>{4ux[:  _Ӏ+#Os4=~=_kA_K;7.!ۖBm*)@\L F箂01 ?n[&ANR x0$ll>u "~/,jQCIŽK`"1 }L",]En*!E:4tbK+ʙceIHa܂Mɨ Ȟh2ō&P~g׳!oseoY3oTLLíϦQp;22QQQ2!o}8}c5TkBGYrPc̛92h5y໳}*d$i4 '=kx[5rrÌ :cqE82;?VTC54MQ@BژW [6^9oFmEk\.ǎ 1 Q3;^Ȩw娩d`P]HF7%(IcIDAq lٵ꣺n'__-S@$uT]?zjޞi{5A b5/kC{Vi{vvv[޽땵ZꖓAoXlrK0d899}?fd娯jt*_^ZPTTB q'4Ջ̳iO2`J)5 ޺L|~غr.LuU!%!yM%Moed!///1̚}muHHOo9:t@׮@l9舸43I b CUII`J0#g7Hj}7Rh\sy/(JARZfQ$ deŽ! ---?Cǫp,ovYUk֭Xt2=~_dmL+sCe޲e u%Kq]wy27d/;^gb65{b2 i畑Bą?쑐&I0U=tz_ ^@hZ}p!)&UTѫ̌!MVNJoe*GN e %~ iy1!HHB& rSHH@nVPir7􅲲*lOC(l E΅ GKB\\ F={cpkAFܼ\D|xr{=^LkOj kokȮ1ͫfo0115k0c Лgpww|Vf=֗ |ug:gFzNś5Yi~C˸v aQtS/3Eٸ|!iS;m=eJaOO*t6SoڏbG C*ŴP0=NHnPB㓂awXnWpl ]M-h 'a83()a𔕸nؿb Ԕ7b"⑙V)japCG!쎷6#Ӏ&Qz&^?ˁ3W+v 95l: U|0[<Wwb&4Mas"/-΄q)} D=ft,,نI(c_Ow=} ǎ#a3}æݻw U``FLnMEAX7>܈'OشpL5Uh2w&Y >YyML_yE<;^EgNn|pFY|FU3Ěhg%襭S8c7bBmȫa+)!yP@W&ZWAZk0 |Lkאm;w`ԩ4hƌfs Wc3͵|8}gɊݓi Mv2r{0-;fB\PpQ-iwv"qfhfxV5N!Av^cfHJˈHJbq},/yEp׈: ::໕RQ9U34 ac5zð{?p/Q-r#]1CWπ7ّi(k~2<D$ilr)x&ȖXݕ g#3l c iҡMyf l 2#ž Ы! {b3x| ne`N_s\VVVn_\Әn7d}WK4>f/caCef5jq1okkk<{23X/& .cdO-Z% c-]G<΄]/<1\HKHbc8u^8z@KoR|RpKh|FR!߶i+Ƒd3p|y%e(Ly9[qu\rNqt QvHa^$L4*/܁BS51gHgNdyai~<\^+q9H "}D~cejLHl>EPnUxؽ{wLYlMg_dcgVmС Nn4Gd0-/7ϖW&5BBBvZ… _\l wD>)Bz=1f N_Gp45Z5qvXICVI]B e{qFO킻c\?~JU6j N"6:6υ$5Coc iaxa827Ե{ay_D0sQc۩جn]yYIycz@AIl#(1 84o0Ml:s NqA#M8/G@&@z[Iw_8_'AHldž /tsNSf}Z[׮WD` rVc{CIA =pv(+ynЃeÈup~o;9Z?&OOZ^|k׮!M_+&"rE\((@|=zˆf %%$ cSe$oe5>J E!.,HS> t5iQ:8No1fܾ5S N &}O3h^LLf#ћDfcє!%0nBAO]TK`*[Dffui113P[RR?m¡G;ȩÛLFuo6ub_/|6X_;nl|AZaP/#Z+CZ4hgLfs^JK%S,'imr{\b\Dv[HP G 51pL {Ѵ$&8tğ0r52I(Z}|6"A ZK8pT}B_YHǑ '-ҕl{4Mv~ j ws5eOlJMj}_bֆ`ehUْ|[ \&nKf.f9~ǁRp3x'Ӣ?5P}udcƆt痙2Aˁ N_ DLbP`{ix -} D ,mˋ[3o&O[,,=޺efy,ss`ˁj5Ѽzgd bZ ۳xu`,_ :m WfwḰqmkF5Ӟ9qǵ_ p/9 s|8qmk`"lFMQsW\^e:m\pmk?s`c۲RpW\8q|\>rWl֯sǁk\5_sZPZЯT/8q/8qkfÕ~>|\>rӂׂ~zǁ~6k\4k8q/8>"L1bFSaaD&Aĺ%sp*[^z|N܅Ӧ`QIۤӰa^AiiI;``FMoƌKW#?W3=m2\}e es1f$\’͋z^fPJ6ǙC`>{lZ= M\Kw@|Vn:Z җÔM)Ug3a0$De0vHkBDT}_pFߖ?zPm;wj>Fiq_ qu Dt͇eJsq~S'Ư]%km1@ c$6W&}6aeYu^[LLCД̦%$}[] gCDN9Ě С#.G'H~E[&QHnݕ(Ϯ">K  Ń95(õWrM8r.i9bʦC9aw` ,GbN&Ӆ *)ɄM-_iA<peT4w3\.xKVCA]܅x]5u,%YS e(Bĥ%Ẅ́\PN 0fuh#><ĴY:u9܌!fge(@ D~ΠdeEI8w=/|Eɘ1r LM*?d%wRH!, $9znEhjN*Éљl"#.kjsttgRIY#𞷽:5J:<;&O3&f?B£O={%t a,}X{/Mǵ8:z4 _B~z: b'KJrsoi|5:k]#lA5"`~i> hcK/HCŠ^,%oKm' > |C,QFZL gj/WvAًO"7tz[V7!xvӁMd%bbdw;Dޕf" b5͛WUKWs\;""Ro>Vuα^ n~Q)}T0$5R&o{*_[w0T#"4o=l|O1XW4>$0ol;J{_T.ibUm ;'}g!Oؾm/1A EiZ99@Vw zrYش`p`B=#0%B f#++j/$ZqM5 i"<%:dZ]Z IDATɍ݆Eo hiY-JmUR'ݪ^<2_=E5w YΪ?&Jq!hhbA/ϡTPn(Wp[e, 8KŽ3% ѥ>~(~kstԵr{T&e%z˔$붿 %˪jc尤iCG8)D^kۋܨ[o6udE;cKO<ܿ|4[B?۲E|ʲ3UqΞ1Rj߹VGi/mf}a9aMr|=Xb=BhaRLuXEsJkCP}LZfsm8J*ͳ3\| O[#b+ER;!e4{J^tatk|O {9[&[Lwr(aڃHLOCRb"bcAߣ!խ+.;PN3EϱTݕej~oǸY\e S